diff --git a/.changeset/README.md b/.changeset/README.md deleted file mode 100644 index e5b6d8d6a67a..000000000000 --- a/.changeset/README.md +++ /dev/null @@ -1,8 +0,0 @@ -# Changesets - -Hello and welcome! This folder has been automatically generated by `@changesets/cli`, a build tool that works -with multi-package repos, or single-package repos to help you version and publish your code. You can -find the full documentation for it [in our repository](https://github.com/changesets/changesets) - -We have a quick list of common questions to get you started engaging with this project in -[our documentation](https://github.com/changesets/changesets/blob/main/docs/common-questions.md) diff --git a/.changeset/config.json b/.changeset/config.json deleted file mode 100644 index 5efcfc14dbb8..000000000000 --- a/.changeset/config.json +++ /dev/null @@ -1,12 +0,0 @@ -{ - "$schema": "https://unpkg.com/@changesets/config@2.3.0/schema.json", - "changelog": ["@changesets/changelog-github", { "repo": "ethereum-optimism/optimism" }], - "commit": false, - "fixed": [], - "linked": [], - "access": "public", - "baseBranch": "develop", - "updateInternalDependencies": "patch", - "privatePackages": { "version": true, "tag": true }, - "ignore": [] -} diff --git a/.circleci/config.yml b/.circleci/config.yml index 97afcc2e4516..dccd91867d5b 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.49.0 + default: us-docker.pkg.dev/oplabs-tools-artifacts/images/ci-builder:v0.51.0 ci_builder_rust_image: type: string default: us-docker.pkg.dev/oplabs-tools-artifacts/images/ci-builder-rust:latest @@ -29,9 +29,18 @@ parameters: kontrol_dispatch: type: boolean default: false + cannon_full_test_dispatch: + type: boolean + default: false sdk_dispatch: type: boolean default: false + docker_publish_dispatch: + type: boolean + default: false + publish_contract_artifacts_dispatch: + type: boolean + default: false orbs: go: circleci/go@1.8.0 @@ -100,6 +109,13 @@ commands: pip3 install -r requirements.txt python3 main.py "<>" + install-contracts-dependencies: + description: "Install the dependencies for the smart contracts" + steps: + - run: + command: just install + working_directory: packages/contracts-bedrock + notify-failures-on-develop: description: "Notify Slack" parameters: @@ -117,24 +133,52 @@ commands: branch_pattern: develop mentions: "<< parameters.mentions >>" + run-contracts-check: + parameters: + command: + description: Just command that runs the check + type: string + steps: + - run: + name: <> + command: | + git reset --hard + just <> + git diff --quiet --exit-code + working_directory: packages/contracts-bedrock + when: always + environment: + FOUNDRY_PROFILE: ci + jobs: cannon-go-lint-and-test: docker: - image: <> - resource_class: medium + parameters: + skip_slow_tests: + type: boolean + default: false + notify: + description: Whether to notify on failure + type: boolean + default: false + resource_class: xlarge steps: - checkout - check-changed: patterns: cannon,packages/contracts-bedrock/src/cannon,op-preimage,go.mod - attach_workspace: at: "." + - restore_cache: + name: Restore Go modules cache + key: gomod-{{ checksum "go.sum" }} - run: name: prep Cannon results dir command: mkdir -p /tmp/test-results - run: name: build Cannon example binaries command: make elf # only compile ELF binaries with Go, we do not have MIPS GCC for creating the debug-dumps. - working_directory: cannon/example + working_directory: cannon/testdata/example - run: name: Cannon Go lint command: | @@ -143,9 +187,10 @@ jobs: - run: name: Cannon Go tests command: | + export SKIP_SLOW_TESTS=<> 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 ./... + -- -parallel=8 -coverpkg=github.com/ethereum-optimism/optimism/cannon/... -coverprofile=coverage.out ./... working_directory: cannon - run: name: upload Cannon coverage @@ -155,6 +200,12 @@ jobs: - store_artifacts: path: /testlogs when: always + - when: + condition: <> + steps: + - notify-failures-on-develop: + mentions: "@proofs-squad" + cannon-build-test-vectors: docker: - image: <> @@ -162,97 +213,93 @@ jobs: steps: - checkout - check-changed: - patterns: cannon/mipsevm/open_mips_tests/test + patterns: cannon/mipsevm/tests/open_mips_tests/test - run: name: Build MIPS test vectors command: python3 maketests.py && git diff --exit-code - working_directory: cannon/mipsevm/open_mips_tests + working_directory: cannon/mipsevm/tests/open_mips_tests - pnpm-monorepo: + contracts-bedrock-build: docker: - image: <> resource_class: xlarge + parameters: + skip_pattern: + description: Glob pattern of tests to skip + type: string + default: "" steps: - checkout - - run: - name: "Check L1 geth version" - command: ./ops/scripts/geth-version-checker.sh || (echo "geth version is wrong, update ci-builder"; false) - - run: - name: git submodules - command: make submodules + - install-contracts-dependencies - restore_cache: - name: Restore PNPM Package Cache + name: Restore Go modules cache keys: - - pnpm-packages-v2-{{ checksum "pnpm-lock.yaml" }} + - gomod-contracts-build-{{ checksum "go.sum" }} + - gomod-contracts-build- - restore_cache: - name: Restore Go modules cache - key: gomod-{{ checksum "go.sum" }} - # Fetch node_modules into the pnpm store - # This will cache node_modules based on pnpm-lock so other steps can instantly install them with `pnpm install --prefer-offline` - # --prefer-offline installs node_modules instantly by just reading from cache if it exists rather than fetching from network - # when installing node_modules pnpm simply adds symlinks instead of copying the files which is why it is pretty much instant to run --prefer-offline - # this allows a caching strategy of only checking pnpm-lockfile so we don't have to keep it in sync with our packages - # For more information see https://pnpm.io/cli/fetch - - run: - name: Fetch dependencies - command: pnpm fetch --frozen-lockfile --prefer-offline - - save_cache: - name: Save PNPM Package Cache - key: pnpm-packages-v2-{{ checksum "pnpm-lock.yaml" }} - paths: - - "node_modules" - - run: - name: Install dependencies - command: pnpm install:ci:offline + name: Restore Go build cache + keys: + - golang-build-cache-contracts-build-{{ checksum "go.sum" }} + - golang-build-cache-contracts-build- - run: - name: print forge version + name: Print forge version command: forge --version - run: - name: Build monorepo + name: Pull artifacts + command: bash scripts/ops/pull-artifacts.sh + working_directory: packages/contracts-bedrock + - run: + name: Build contracts + command: forge build --deny-warnings --skip <> environment: FOUNDRY_PROFILE: ci - command: pnpm build + working_directory: packages/contracts-bedrock - run: - name: Generate FPAC allocs - command: DEVNET_FPAC="true" make devnet-allocs + name: Generate L2OO allocs + command: | + DEVNET_L2OO="true" make devnet-allocs + cp -r .devnet/ .devnet-l2oo/ - run: - name: Copy FPAC allocs to .devnet-fpac - command: cp -r .devnet/ .devnet-fault-proofs/ + name: Generate AltDA allocs + command: | + DEVNET_ALTDA="true" make devnet-allocs + cp -r .devnet/ .devnet-altda/ - run: - name: Generate Plasma allocs - command: DEVNET_PLASMA="true" make devnet-allocs + name: Generate Generic AltDA allocs + command: | + DEVNET_ALTDA="true" GENERIC_ALTDA="true" make devnet-allocs + cp -r .devnet/ .devnet-altda-generic/ - run: - name: Copy Plasma allocs to .devnet-plasma - command: cp -r .devnet/ .devnet-plasma/ + name: Generate MT-Cannon allocs + command: | + USE_MT_CANNON="true" make devnet-allocs + cp -r .devnet/ .devnet-mt-cannon/ - run: - name: Generate non-FPAC allocs + name: Generate default allocs command: make devnet-allocs + - save_cache: + name: Save Go modules cache + key: gomod-contracts-build-{{ checksum "go.sum" }} + paths: + - "/go/pkg/mod" + - save_cache: + name: Save Go build cache + key: golang-build-cache-contracts-build-{{ checksum "go.sum" }} + paths: + - "/root/.cache/go-build" - persist_to_workspace: root: "." paths: - - "packages/**/dist" - "packages/contracts-bedrock/cache" - "packages/contracts-bedrock/artifacts" - "packages/contracts-bedrock/forge-artifacts" - - "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" - "packages/contracts-bedrock/deploy-config/devnetL1.json" - "packages/contracts-bedrock/deployments/devnetL1" + - ".devnet" + - ".devnet-l2oo" + - ".devnet-altda" + - ".devnet-altda-generic" + - ".devnet-mt-cannon" - notify-failures-on-develop docker-build: @@ -305,7 +352,10 @@ jobs: - run: command: mkdir -p /tmp/docker_images - when: - condition: "<>" + condition: + or: + - "<>" + - "<>" steps: - gcp-cli/install - when: @@ -416,20 +466,22 @@ jobs: ./ops/scripts/ci-docker-tag-op-stack-release.sh <>/<> $CIRCLE_TAG $CIRCLE_SHA1 - when: condition: - and: - - or: + or: + - and: - "<>" - "<>" - - equal: [develop, << pipeline.git.branch >>] + - and: + - "<>" + - equal: [develop, << pipeline.git.branch >>] steps: - gcp-oidc-authenticate: service_account_email: GCP_SERVICE_ATTESTOR_ACCOUNT_EMAIL - run: name: Sign command: | - git clone https://github.com/ethereum-optimism/binary_signer - cd binary_signer/signer - git checkout tags/v1.0.3 + VER=$(jq -r .binary_signer < versions.json) + wget -O - "https://github.com/ethereum-optimism/binary_signer/archive/refs/tags/v${VER}.tar.gz" | tar xz + cd "binary_signer-${VER}/signer" IMAGE_PATH="<>/<>/<>:<>" echo $IMAGE_PATH @@ -493,9 +545,7 @@ jobs: resource_class: xlarge steps: - checkout - - run: - name: git submodules - command: make submodules + - install-contracts-dependencies - check-changed: patterns: contracts-bedrock,op-node - run: @@ -505,7 +555,7 @@ jobs: # We do not use the pre-built contracts becuase forge coverage uses different optimizer settings - run: name: test and generate coverage - command: pnpm coverage:lcov + command: just coverage-lcov no_output_timeout: 18m environment: FOUNDRY_PROFILE: ci @@ -520,267 +570,154 @@ jobs: docker: - image: <> resource_class: xlarge + parameters: + test_parallelism: + description: Number of test jobs to run in parallel + type: integer + default: 4 + test_list: + description: List of test files to run + type: string + test_fuzz_runs: + description: Number of fuzz runs to apply + type: integer + default: 512 + test_invariant_runs: + description: Number of invariant runs to apply + type: integer + default: 32 + test_invariant_depth: + description: Depth of invariant runs + type: integer + default: 64 + test_timeout: + description: Timeout for running tests + type: string + default: 15m + parallelism: <> steps: - checkout - - run: - name: git submodules - command: make submodules - - restore_cache: - name: Restore PNPM Package Cache - keys: - - pnpm-packages-v2-{{ checksum "pnpm-lock.yaml" }} - attach_workspace: { at: "." } - - check-changed: - patterns: contracts-bedrock,op-node - # populate node modules from the cache - - run: - name: Install dependencies - command: pnpm install:ci - - run: - name: print forge version - command: forge --version - working_directory: packages/contracts-bedrock + - install-contracts-dependencies - run: - name: run tests - command: pnpm test - environment: - FOUNDRY_PROFILE: ci + name: Check if test list is empty + command: | + TEST_FILES=$(<>) + if [ -z "$TEST_FILES" ]; then + echo "No test files to run. Exiting early." + circleci-agent step halt + fi working_directory: packages/contracts-bedrock - no_output_timeout: 15m - - contracts-bedrock-checks: - docker: - - image: <> - resource_class: xlarge - steps: - - checkout - - run: - name: git submodules - command: make submodules - - restore_cache: - name: Restore PNPM Package Cache - keys: - - pnpm-packages-v2-{{ checksum "pnpm-lock.yaml" }} - - attach_workspace: { at: "." } - check-changed: patterns: contracts-bedrock,op-node - - setup_remote_docker: - docker_layer_caching: true - # populate node modules from the cache - - run: - name: Install dependencies - command: pnpm install:ci - - run: - name: forge version - command: forge --version + - restore_cache: + name: Restore Go modules cache + key: gomod-{{ checksum "go.sum" }} + - restore_cache: + name: Restore Go build cache + keys: + - golang-build-cache-contracts-bedrock-tests-{{ checksum "go.sum" }} + - golang-build-cache-contracts-bedrock-tests- - 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 + name: Print dependencies + command: just dep-status 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 - git diff --exit-code semver-lock.json || echo "export SEMVER_LOCK_STATUS=1" >> "$BASH_ENV" + name: Print forge version + command: forge --version working_directory: packages/contracts-bedrock - run: - name: check deploy configs - command: pnpm validate-deploy-configs || echo "export DEPLOY_CONFIGS_STATUS=1" >> "$BASH_ENV" + name: Pull artifacts + command: bash scripts/ops/pull-artifacts.sh working_directory: packages/contracts-bedrock - run: - name: lint - command: | - pnpm lint:check || echo "export LINT_STATUS=1" >> "$BASH_ENV" + name: Build go-ffi + command: just build-go-ffi working_directory: packages/contracts-bedrock - run: - name: gas snapshot + name: Run tests command: | - pnpm gas-snapshot --check || echo "export GAS_SNAPSHOT_STATUS=1" >> "$BASH_ENV" + TEST_FILES=$(<>) + TEST_FILES=$(echo "$TEST_FILES" | circleci tests split --split-by=timings) + TEST_FILES=$(echo "$TEST_FILES" | sed 's|^test/||') + MATCH_PATH="./test/{$(echo "$TEST_FILES" | paste -sd "," -)}" + export FOUNDRY_INVARIANT_RUNS=<> + export FOUNDRY_INVARIANT_DEPTH=<> + forge test --deny-warnings --fuzz-runs <> --match-path "$MATCH_PATH" environment: FOUNDRY_PROFILE: ci working_directory: packages/contracts-bedrock - no_output_timeout: 15m - - run: - name: invariant docs - command: | - pnpm autogen:invariant-docs - git diff --exit-code ./invariant-docs/*.md || echo "export INVARIANT_DOCS_STATUS=1" >> "$BASH_ENV" - working_directory: packages/contracts-bedrock - - run: - name: snapshots - command: | - pnpm snapshots:check || echo "export SNAPSHOTS_STATUS=1" >> "$BASH_ENV" - working_directory: packages/contracts-bedrock + no_output_timeout: <> - run: - name: size check - command: | - forge build --sizes --skip "/**/test/**" --skip "/**/scripts/**" || echo "export SIZE_CHECK=1" >> "$BASH_ENV" + name: Print failed test traces + command: just test-rerun environment: FOUNDRY_PROFILE: ci working_directory: packages/contracts-bedrock - - run: - name: check statuses - command: | - if [[ "$LINT_STATUS" -ne 0 ]]; then - 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 - fi - if [[ "$SEMVER_LOCK_STATUS" -ne 0 ]]; then - echo "Semver lock failed, see job output for details." - FAILED=1 - fi - if [[ "$INVARIANT_DOCS_STATUS" -ne 0 ]]; then - echo "Invariant docs failed, see job output for details." - FAILED=1 - fi - if [[ "$DEPLOY_CONFIGS_STATUS" -ne 0 ]]; then - echo "Deploy config check failed, see job output for details." - FAILED=1 - fi - if [[ "$SNAPSHOTS_STATUS" -ne 0 ]]; then - 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 - - contracts-bedrock-validate-spaces: - docker: - - image: <> - resource_class: medium - steps: - - checkout - - restore_cache: - name: Restore PNPM Package Cache - keys: - - pnpm-packages-v2-{{ checksum "pnpm-lock.yaml" }} - - attach_workspace: { at: "." } - - run: - name: Install dependencies - command: pnpm install:ci - - check-changed: - patterns: contracts-bedrock - - run: - name: validate spacers - command: pnpm validate-spacers - working_directory: packages/contracts-bedrock + when: on_fail + - save_cache: + name: Save Go build cache + key: golang-build-cache-contracts-bedrock-tests-{{ checksum "go.sum" }} + paths: + - "/root/.cache/go-build" + - notify-failures-on-develop - js-lint-test: - parameters: - package_name: - description: Package name - type: string - dependencies: - description: Regex matching dependent packages - type: string - default: this-package-does-not-exist - coverage_flag: - description: Coverage flag name - type: string + contracts-bedrock-checks: docker: - image: <> - resource_class: large + resource_class: xlarge steps: - checkout - attach_workspace: { at: "." } - - restore_cache: - name: Restore PNPM Package Cache - keys: - - pnpm-packages-v2-{{ checksum "pnpm-lock.yaml" }} + - install-contracts-dependencies - check-changed: - patterns: <>,<> - # populate node modules from the cache - - run: - name: Install dependencies - command: pnpm install:ci - - run: - name: Lint - command: pnpm lint && git diff --exit-code - working_directory: packages/<> - - run: - name: Test - command: pnpm test:coverage - working_directory: packages/<> + patterns: contracts-bedrock,op-node + - setup_remote_docker: + docker_layer_caching: true - run: - name: Upload coverage - command: codecov --verbose --clean --flags <> - - sdk-next-tests: + name: print forge version + command: forge --version + - run-contracts-check: + command: semver-lock + - run-contracts-check: + command: semver-diff-check-no-build + - run-contracts-check: + command: semver-natspec-check-no-build + - run-contracts-check: + command: validate-deploy-configs + - run-contracts-check: + command: lint + - run-contracts-check: + command: gas-snapshot-check + - run-contracts-check: + command: snapshots-check-no-build + - run-contracts-check: + command: kontrol-deployment-check + - run-contracts-check: + command: interfaces-check-no-build + - run-contracts-check: + command: size-check + + contracts-bedrock-validate-spacers: 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" }} + - install-contracts-dependencies - check-changed: - patterns: sdk - # populate node modules from the cache - - run: - name: Install dependencies - command: pnpm install:ci - - run: - name: sepolia-fork - background: true - # atm this is goerli but we should use mainnet after bedrock is live - command: anvil --fork-url $ANVIL_SEPOLIA_FORK_URL --fork-block-number 5580113 --port 8545 - - - run: - name: op-sepolia-fork - background: true - # atm this is goerli but we should use mainnet after bedrock is live - command: anvil --fork-url $ANVIL_OP_SEPOLIA_FORK_URL --port 9545 --fork-block-number 9925328 - - - run: - name: build - command: pnpm build - working_directory: packages/sdk - - run: - name: lint - command: pnpm lint:check - working_directory: packages/sdk - - run: - name: make sure anvil l1 is up - command: npx wait-on tcp:8545 && cast block-number --rpc-url http://localhost:8545 - - run: - name: make sure anvil l2 is up - command: npx wait-on tcp:9545 && cast block-number --rpc-url http://localhost:9545 + patterns: contracts-bedrock - run: - name: test:next - command: pnpm test:next:run - no_output_timeout: 5m - working_directory: packages/sdk - environment: - # anvil[0] test private key - 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 + name: validate spacers + command: just validate-spacers-no-build + working_directory: packages/contracts-bedrock todo-issues: + parameters: + check_closed: + type: boolean + default: true machine: image: <> steps: @@ -790,7 +727,7 @@ jobs: command: sudo apt-get install -y ripgrep - run: name: Check TODO issues - command: ./ops/scripts/todo-checker.sh --verbose + command: ./ops/scripts/todo-checker.sh --verbose <<#parameters.check_closed>> --check-closed <> - notify-failures-on-develop fuzz-golang: @@ -819,42 +756,19 @@ jobs: key: gomod-{{ checksum "go.sum" }} - restore_cache: name: Restore Go build cache - key: golang-build-cache + keys: + - golang-build-cache-fuzz-golang-{{ checksum "go.sum" }} + - golang-build-cache-fuzz-golang- - run: name: Fuzz command: make fuzz working_directory: "<>" - save_cache: - key: golang-build-cache + name: Save Go build cache + key: golang-build-cache-fuzz-golang-{{ checksum "go.sum" }} paths: - "/root/.cache/go-build" - depcheck: - docker: - - image: <> - steps: - - checkout - - attach_workspace: { at: "." } - - restore_cache: - name: Restore PNPM Package Cache - keys: - - pnpm-packages-v2-{{ checksum "pnpm-lock.yaml" }} - - check-changed: - patterns: packages - - run: - name: Check sdk - command: npx depcheck - working_directory: packages/sdk - - l1-geth-version-check: - docker: - - image: <> - steps: - - checkout - - run: - name: "Check L1 geth version" - command: ./ops/scripts/geth-version-checker.sh || (echo "geth version is wrong, update ci-builder"; false) - go-lint: docker: - image: <> @@ -864,9 +778,15 @@ jobs: name: Restore Go modules cache key: gomod-{{ checksum "go.sum" }} - restore_cache: - key: golang-build-cache + name: Restore Go build cache + keys: + - golang-build-cache-lint-{{ checksum "go.sum" }} + - golang-build-cache-lint- - restore_cache: - key: golang-lint-cache + name: Restore Go lint cache + keys: + - golang-lint-cache-{{ checksum "go.sum" }} + - golang-lint-cache- - run: name: run Go linter command: | @@ -875,21 +795,81 @@ jobs: make lint-go working_directory: . - save_cache: - key: golang-build-cache + name: Save Go build cache + key: golang-build-cache-lint-{{ checksum "go.sum" }} paths: - "/root/.cache/go-build" - save_cache: - key: golang-lint-cache + name: Save Go lint cache + key: golang-lint-cache-{{ checksum "go.sum" }} paths: - "/root/.cache/golangci-lint" + go-test-kurtosis: + parameters: + module: + description: Go Module Name + type: string + uses_artifacts: + description: Uses contract artifacts + type: boolean + default: false + test_directory: + description: Test directory + type: string + default: "./..." + machine: + image: <> # only used to enable codecov. + resource_class: xlarge + steps: + - run: + name: Install components + command: | + go version + go install gotest.tools/gotestsum@v1.11.0 + - run: + name: Install Kurtosis + command: | + echo "deb [trusted=yes] https://apt.fury.io/kurtosis-tech/ /" | sudo tee /etc/apt/sources.list.d/kurtosis.list + sudo apt update + sudo apt install kurtosis-cli=1.3.0 + kurtosis engine start + - checkout + - when: + condition: <> + steps: + - attach_workspace: { at: "." } + - run: + name: prep results dir + command: | + # Make sure the workspace is properly owned + sudo chown -R $USER:$USER . + mkdir -p /tmp/test-results + mkdir -p /tmp/testlogs + - run: + name: run tests + command: | + ENABLE_KURTOSIS=true gotestsum \ + --format=testname \ + --junitfile=/tmp/test-results/<>.xml \ + --jsonfile=/tmp/testlogs/log.json \ + -- -parallel=8 \ + -coverpkg=github.com/ethereum-optimism/optimism/... \ + -coverprofile=coverage.out <> + working_directory: <> + - store_test_results: + path: /tmp/test-results + - store_artifacts: + path: /tmp/testlogs + when: always + go-test: parameters: module: description: Go Module Name type: string docker: - - image: <> # only used to enable codecov. + - image: <> resource_class: xlarge steps: - checkout @@ -897,35 +877,38 @@ jobs: name: Restore Go modules cache key: gomod-{{ checksum "go.sum" }} - restore_cache: + name: Restore Go build cache keys: - - golang-build-cache-<> - - golang-build-cache- + - golang-build-cache-test-<>-{{ checksum "go.sum" }} + - golang-build-cache-test- + - run: + name: Install components + command: | + go version + go install gotest.tools/gotestsum@v1.11.0 - run: name: prep results dir - command: mkdir -p /tmp/test-results && mkdir -p /testlogs + command: mkdir -p /tmp/test-results && mkdir -p /tmp/testlogs - run: name: run tests command: | - gotestsum --format=testname --junitfile=/tmp/test-results/<>.xml --jsonfile=/testlogs/log.json \ + gotestsum --format=testname --junitfile=/tmp/test-results/<>.xml --jsonfile=/tmp/testlogs/log.json \ -- -parallel=8 -coverpkg=github.com/ethereum-optimism/optimism/... -coverprofile=coverage.out ./... working_directory: <> - save_cache: - key: golang-build-cache-<> + name: Save Go build cache + key: golang-build-cache-test-<>-{{ checksum "go.sum" }} paths: - "/root/.cache/go-build" - # TODO(CLI-148): Fix codecov - #- run: - #name: upload coverage - #command: codecov --verbose --clean --flags bedrock-go-tests - store_test_results: path: /tmp/test-results - store_artifacts: - path: /testlogs + path: /tmp/testlogs when: always go-e2e-test: parameters: - fpac: + variant: type: string default: '' module: @@ -947,8 +930,8 @@ jobs: type: string default: "" environment: - DEVNET_FPAC: 'false' - OP_E2E_USE_FPAC: 'false' + DEVNET_L2OO: 'false' + OP_E2E_USE_L2OO: 'false' docker: - image: <> resource_class: xlarge @@ -957,22 +940,29 @@ jobs: - checkout - when: condition: - equal: ['-fault-proofs', <>] + equal: ['-l2oo', <>] steps: - run: - name: Set DEVNET_FPAC = true - command: echo 'export DEVNET_FPAC=true' >> $BASH_ENV + name: Set DEVNET_L2OO = true + command: echo 'export DEVNET_L2OO=true' >> $BASH_ENV - run: - name: Set OP_E2E_USE_FPAC = true - command: echo 'export OP_E2E_USE_FPAC=true' >> $BASH_ENV + name: Set OP_E2E_USE_L2OO = true + command: echo 'export OP_E2E_USE_L2OO=true' >> $BASH_ENV - when: condition: - equal: ['-plasma', <>] + equal: ['-altda', <>] steps: - run: - name: Set OP_E2E_USE_PLASMA = true - command: echo 'export OP_E2E_USE_PLASMA=true' >> $BASH_ENV - - check-changed: + name: Set OP_E2E_USE_ALTDA = true + command: echo 'export OP_E2E_USE_ALTDA=true' >> $BASH_ENV + - when: + condition: + equal: ['-mt-cannon', <>] + steps: + - run: + name: Set OP_E2E_USE_MT_CANNON = true + command: echo 'export OP_E2E_USE_MT_CANNON=true' >> $BASH_ENV + - check-changed: patterns: op-(.+),cannon,contracts-bedrock - run: name: prep results dir @@ -982,18 +972,22 @@ jobs: key: gomod-{{ checksum "go.sum" }} - restore_cache: name: Restore Go build cache - key: golang-build-cache + keys: + - golang-build-cache-e2e-{{ checksum "go.sum" }} + - golang-build-cache-e2e- - attach_workspace: at: /tmp/workspace - run: - name: Load devnet-allocs + name: Load devnet-allocs and artifacts 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/.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-l2-fjord.json .devnet/allocs-l2-fjord.json + cp /tmp/workspace/.devnet<>/allocs-l2-granite.json .devnet/allocs-l2-granite.json + cp /tmp/workspace/.devnet<>/allocs-l1.json .devnet/allocs-l1.json + cp /tmp/workspace/.devnet<>/addresses.json .devnet/addresses.json + cp -r /tmp/workspace/packages/contracts-bedrock/forge-artifacts packages/contracts-bedrock/forge-artifacts cp /tmp/workspace/packages/contracts-bedrock/deploy-config/devnetL1.json packages/contracts-bedrock/deploy-config/devnetL1.json cp -r /tmp/workspace/packages/contracts-bedrock/deployments/devnetL1 packages/contracts-bedrock/deployments/devnetL1 - run: @@ -1016,124 +1010,22 @@ jobs: - store_artifacts: path: /testlogs when: always + - store_artifacts: + path: /tmp/test-results + when: always - store_test_results: path: /tmp/test-results + - save_cache: + name: Save Go build cache + key: golang-build-cache-e2e-{{ checksum "go.sum" }} + paths: + - "/root/.cache/go-build" - when: condition: "<>" steps: - notify-failures-on-develop: mentions: "<>" - go-lint-test-build: - parameters: - binary_name: - description: Binary name to build - type: string - working_directory: - description: Working directory - type: string - build: - description: Whether or not to build the binary - type: boolean - default: true - dependencies: - description: Regex matching dependent packages - type: string - default: this-package-does-not-exist - docker: - - image: <> - resource_class: medium - steps: - - checkout - - check-changed: - patterns: <>,<> - - run: - name: Lint - command: make lint - working_directory: <> - - run: - name: Test - command: | - mkdir -p /test-results - 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, <> ] - steps: - - run: - name: Build - command: make <> - working_directory: <> - - indexer-tests: - parameters: - fpac: - type: string - default: '' - environment: - DEVNET_FPAC: 'false' - OP_E2E_USE_FPAC: 'false' - docker: - - image: <> - - image: cimg/postgres:14.1 - resource_class: xlarge - steps: - - checkout - - when: - condition: - equal: ['fault-proofs', <>] - steps: - - run: - name: Set DEVNET_FPAC = true - command: echo 'export DEVNET_FPAC=true' >> $BASH_ENV - - run: - name: Set OP_E2E_USE_FPAC = true - command: echo 'export OP_E2E_USE_FPAC=true' >> $BASH_ENV - - check-changed: - patterns: indexer - - run: - name: Lint - command: golangci-lint run -E goimports,sqlclosecheck,bodyclose,asciicheck,misspell,errorlint --timeout 4m -e "errors.As" -e "errors.Is" ./... - working_directory: indexer - - run: - name: git submodules - command: make submodules - - run: - name: generate cannon prestate - command: make cannon-prestate - - run: - name: generate L1 state - command: make devnet-allocs - - run: - name: Test - command: | - mkdir -p /test-results - DB_USER=postgres gotestsum --format=standard-verbose --junitfile=/test-results/indexer_tests.xml -- -parallel=4 ./... - working_directory: indexer - - store_test_results: - path: /test-results - - run: - name: Build - command: make indexer - working_directory: indexer - - run: - name: Install node_modules - command: pnpm install:ci - - run: - name: Install tygo - command: go install github.com/gzuidhof/tygo@latest - working_directory: indexer/api-ts - - run: - name: Check generated code - command: npm run generate && git diff --exit-code - working_directory: indexer/api-ts - cannon-prestate: docker: - image: <> @@ -1143,10 +1035,19 @@ jobs: name: Restore Go modules cache key: gomod-{{ checksum "go.sum" }} - restore_cache: - key: golang-build-cache + name: Restore Go build cache + keys: + - golang-build-cache-cannon-prestate-{{ checksum "go.sum" }} + - golang-build-cache-cannon-prestate- + - run: + name: Build cannon + command: make cannon + - run: + name: Build op-program + command: make op-program - restore_cache: + name: Restore cannon prestate cache key: cannon-prestate-{{ checksum "./cannon/bin/cannon" }}-{{ checksum "op-program/bin/op-program-client.elf" }} - name: Load cannon prestate cache - run: name: generate cannon prestate command: make cannon-prestate @@ -1157,6 +1058,21 @@ jobs: - "op-program/bin/prestate.json" - "op-program/bin/meta.json" - "op-program/bin/prestate-proof.json" + - run: + name: generate cannon-mt prestate + command: make cannon-prestate-mt + - save_cache: + key: cannon-prestate-mt-{{ checksum "./cannon/bin/cannon" }}-{{ checksum "op-program/bin/op-program-client.elf" }} + name: Save MT-Cannon prestate to cache + paths: + - "op-program/bin/prestate-mt.json" + - "op-program/bin/meta-mt.json" + - "op-program/bin/prestate-proof-mt.json" + - save_cache: + name: Save Go build cache + key: golang-build-cache-cannon-prestate-{{ checksum "go.sum" }} + paths: + - "/root/.cache/go-build" - persist_to_workspace: root: . paths: @@ -1190,6 +1106,20 @@ jobs: 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 + elif [[ "<>" == "1.2.0" ]]; then + echo 'export EXPECTED_PRESTATE_HASH="0x03617abec0b255dc7fc7a0513a2c2220140a1dcd7a1c8eca567659bd67e05cea"' >> $BASH_ENV + elif [[ "<>" == "1.3.0-rc.1" ]]; then + echo 'export EXPECTED_PRESTATE_HASH="0x0367c4aa897bffbded0b523f277ca892298dc3c691baf37bc2099b86024f9673"' >> $BASH_ENV + elif [[ "<>" == "1.3.0-rc.2" ]]; then + echo 'export EXPECTED_PRESTATE_HASH="0x0385c3f8ee78491001d92b90b07d0cf387b7b52ab9b83b4d87c994e92cf823ba"' >> $BASH_ENV + elif [[ "<>" == "1.3.0-rc.3" ]]; then + echo 'export EXPECTED_PRESTATE_HASH="0x030de10d9da911a2b180ecfae2aeaba8758961fc28262ce989458c6f9a547922"' >> $BASH_ENV + elif [[ "<>" == "1.3.1-rc.1" ]]; then + echo 'export EXPECTED_PRESTATE_HASH="0x03e806a2859a875267a563462a06d4d1d1b455a9efee959a46e21e54b6caf69a"' >> $BASH_ENV + elif [[ "<>" == "1.3.1-rc.2" ]]; then + echo 'export EXPECTED_PRESTATE_HASH="0x038512e02c4c3f7bdaec27d00edf55b7155e0905301e1a88083e4e0a6764d54c"' >> $BASH_ENV else echo "Unknown prestate version <>" exit 1 @@ -1211,81 +1141,66 @@ jobs: - notify-failures-on-develop: mentions: "@proofs-squad" - - devnet-allocs: - docker: - - image: <> - resource_class: xlarge - steps: - - checkout - - restore_cache: - name: Restore Go modules cache - key: gomod-{{ checksum "go.sum" }} - - restore_cache: - key: golang-build-cache - - run: - name: git submodules - command: make submodules - - run: - name: generate devnet allocs - command: make devnet-allocs - - 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" - - "packages/contracts-bedrock/deployments/devnetL1" - devnet: machine: image: <> parameters: - fpac: + variant: type: string environment: DOCKER_BUILDKIT: 1 DEVNET_NO_BUILD: 'true' # Default value; Can be overridden. - DEVNET_FPAC: 'false' - DEVNET_PLASMA: 'false' + DEVNET_L2OO: 'false' + DEVNET_ALTDA: 'false' steps: - checkout + - attach_workspace: { at: "." } + - check-changed: + patterns: op-(.+),packages,ops-bedrock,bedrock-devnet - when: condition: - equal: ['fault-proofs', <>] + equal: ['altda', <>] steps: - run: - name: Set DEVNET_FPAC = true - command: echo 'export DEVNET_FPAC=true' >> $BASH_ENV + name: Set DEVNET_ALTDA = true + command: echo 'export DEVNET_ALTDA=true' >> $BASH_ENV - when: condition: - equal: ['plasma', <>] + equal: ['altda-generic', <>] steps: - run: - name: Set DEVNET_PLASMA = true - command: echo 'export DEVNET_PLASMA=true' >> $BASH_ENV - - check-changed: - patterns: op-(.+),packages,ops-bedrock,bedrock-devnet + name: Set DEVNET_ALTDA = true + command: echo 'export DEVNET_ALTDA=true' >> $BASH_ENV + - run: + name: Set GENERIC_ALTDA = true + command: echo 'export GENERIC_ALTDA=true' >> $BASH_ENV + - restore_cache: + name: Restore Go modules cache + key: gomod-{{ checksum "go.sum" }} + - restore_cache: + name: Restore Go build cache + keys: + - golang-build-cache-devnet-{{ checksum "go.sum" }} + - golang-build-cache-devnet- - run: name: Install latest golang command: | - wget https://go.dev/dl/go1.21.1.linux-amd64.tar.gz + VER=$(jq -r .go < versions.json) sudo rm -rf /usr/local/go - sudo tar -C /usr/local -xzf go1.21.1.linux-amd64.tar.gz + wget "https://go.dev/dl/go${VER}.linux-amd64.tar.gz" -O - | sudo tar -C /usr/local -xz export PATH=$PATH:/usr/local/go/bin go version - run: name: Install Geth command: | - 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 '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 + VER=$(jq -r .geth_release < versions.json) + wget "https://gethstore.blob.core.windows.net/builds/geth-alltools-linux-amd64-${VER}.tar.gz" -O - | tar xz + sudo cp "geth-alltools-linux-amd64-${VER}"/* /usr/local/bin + - run: + name: Install eth2-testnet-genesis + command: | + go install -v github.com/protolambda/eth2-testnet-genesis@$(jq -r .eth2_testnet_genesis < versions.json) - run: name: foundryup command: | @@ -1296,33 +1211,20 @@ jobs: source $HOME/.bashrc forge --version - run: - name: Install NVM - command: | - curl -o- https://raw.githubusercontent.com/nvm-sh/nvm/v0.39.7/install.sh | bash - source ~/.bashrc - nvm --version - - run: - name: Install Node + name: Install Just command: | - nvm install - nvm use && node --version && npm --version - - run: - name: Install pnpm - command: | - npm i pnpm --global - - run: - name: git submodules - command: make submodules - - attach_workspace: - at: "." + VER=$(jq -r .just < versions.json) + curl --proto '=https' --tlsv1.2 -sSf https://just.systems/install.sh | bash -s -- --to $HOME/bin --tag "${VER}" + echo 'export PATH="${PATH}:$HOME/bin"' >> $BASH_ENV + - install-contracts-dependencies - when: condition: not: - equal: ['legacy', <>] + equal: ['default', <>] steps: - run: - name: Use non-legacy devnet allocs - command: rm -r .devnet && mv .devnet-<> .devnet + name: Use non-default devnet allocs + command: rm -r .devnet && mv .devnet-<> .devnet - run: name: Load and tag docker images command: | @@ -1339,15 +1241,13 @@ jobs: 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: | - pnpm i && pnpm build - run: name: Bring up the stack command: | # Specify like this to avoid a forced rebuild of the contracts + devnet L1 PYTHONPATH=./bedrock-devnet python3 ./bedrock-devnet/main.py --monorepo-dir=. + echo "Waiting for 10 seconds to give the devnet time to settle in..." + sleep 10 - run: name: Test the stack command: make devnet-test @@ -1366,6 +1266,16 @@ jobs: command: | docker logs ops-bedrock-l1-1 || echo "No logs." when: on_fail + - run: + name: Dump l1-bn logs + command: | + docker logs ops-bedrock-l1-bn-1 || echo "No logs." + when: on_fail + - run: + name: Dump l1-vc logs + command: | + docker logs ops-bedrock-l1-vc-1 || echo "No logs." + when: on_fail - run: name: Dump op-batcher logs command: | @@ -1404,6 +1314,11 @@ jobs: ls -R forge-artifacts || echo "No forge artifacts found" when: on_fail working_directory: packages/contracts-bedrock + - save_cache: + name: Save Go build cache + key: golang-build-cache-devnet-{{ checksum "go.sum" }} + paths: + - /home/circleci/.cache/go-build semgrep-scan: parameters: @@ -1415,13 +1330,9 @@ jobs: SEMGREP_REPO_URL: << pipeline.project.git_url >> SEMGREP_BRANCH: << pipeline.git.branch >> SEMGREP_COMMIT: << pipeline.git.revision >> - - # Change job timeout (default is 1800 seconds; set to 0 to disable) - SEMGREP_TIMEOUT: 3000 - docker: - image: returntocorp/semgrep - resource_class: medium + resource_class: xlarge steps: - checkout - unless: @@ -1442,7 +1353,12 @@ jobs: echo 'export SEMGREP_REPO_NAME=$CIRCLE_PROJECT_USERNAME/$CIRCLE_PROJECT_REPONAME' >> $BASH_ENV - run: name: "Semgrep scan" - command: semgrep ci + # --timeout (in seconds) limits the time per rule and file. + # SEMGREP_TIMEOUT is the same, but docs have conflicting defaults (5s in CLI flag, 1800 in some places) + # https://semgrep.dev/docs/troubleshooting/semgrep-app#if-the-job-is-aborted-due-to-taking-too-long + command: semgrep ci --timeout=100 + # If semgrep hangs, stop the scan after 20m, to prevent a useless 5h job + no_output_timeout: 20m - notify-failures-on-develop go-mod-download: @@ -1471,58 +1387,12 @@ jobs: - run: name: "Go mod tidy" command: make mod-tidy && git diff --exit-code - - run: - name: run Go linter - command: | - # Identify how many cores it defaults to - golangci-lint --help | grep concurrency - make lint-go - working_directory: . - save_cache: key: << parameters.key >>-{{ checksum "<< parameters.file >>" }} name: Save Go modules cache paths: - "/go/pkg/mod" - op-service-rethdb-tests: - docker: - - image: <> - steps: - - checkout - - check-changed: - patterns: op-service,op-node - - restore_cache: - name: Restore Go modules cache - key: gomod-{{ checksum "go.sum" }} - - run: - name: Cargo fmt + clippy - command: | - cargo +nightly fmt -- --check - cargo +nightly clippy --all --all-features -- -D warnings - working_directory: op-service/rethdb-reader - - run: - name: Generate testdata db - command: cargo test - working_directory: op-service/rethdb-reader - - run: - name: Build dylib - command: cargo build --release - working_directory: op-service/rethdb-reader - - run: - name: Update LD_LIBRARY_PATH - command: echo 'export LD_LIBRARY_PATH="${LD_LIBRARY_PATH}:/root/project/op-service/rethdb-reader/target/release"' >> $BASH_ENV - - run: - name: Run op-service RethDB tests - command: | - gotestsum --format=standard-verbose --junitfile=/tmp/test-results/op-service.xml \ - -- -parallel=8 -coverpkg=github.com/ethereum-optimism/optimism/... -coverprofile=coverage.out \ - -run TestRethDB -tags rethdb -v - working_directory: op-service/sources - # TODO(CLI-148): Fix codecov - #- run: - #name: upload coverage - #command: codecov --verbose --clean --flags bedrock-rethdb-go-tests - bedrock-go-tests: # just a helper, that depends on all the actual test jobs docker: # Use a smaller base image to avoid pulling the huge ci-builder @@ -1555,12 +1425,17 @@ jobs: name: Restore Go modules cache key: gomod-{{ checksum "go.sum" }} - restore_cache: - key: golang-build-cache + key: golang-build-cache-op-program-compat-{{ checksum "go.sum" }} - run: name: compat-sepolia command: | make verify-compat working_directory: op-program + - save_cache: + name: Save Go build cache + key: golang-build-cache-op-program-compat-{{ checksum "go.sum" }} + paths: + - "/root/.cache/go-build" check-generated-mocks-op-node: docker: @@ -1584,38 +1459,13 @@ jobs: name: check-generated-mocks command: make generate-mocks-op-service && git diff --exit-code - check-values-match: - parameters: - pattern_file1: - type: string - default: "" - pattern_file2: - type: string - default: "" - file1_path: - type: string - default: "" - file2_path: - type: string - default: "" - docker: - - image: <> - steps: - - checkout - - run: - name: Verify Values Match - command: | - ./ops/scripts/ci-match-values-between-files.sh "<< parameters.file1_path >>" "<< parameters.pattern_file1 >>" "<< parameters.file2_path >>" "<< parameters.pattern_file2 >>" - kontrol-tests: docker: - image: << pipeline.parameters.ci_builder_image >> resource_class: xlarge steps: - checkout - - run: - name: Checkout Submodule - command: make submodules + - install-contracts-dependencies - check-changed: no_go_deps: "true" 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 @@ -1623,14 +1473,52 @@ jobs: docker_layer_caching: true - run: name: Run Kontrol Tests - command: pnpm test:kontrol + command: | + curl -X POST \ + -H "Accept: application/vnd.github+json" \ + -H "Authorization: Bearer $RV_COMPUTE_TOKEN" \ + https://api.github.com/repos/runtimeverification/optimism-ci/actions/workflows/optimism-ci.yaml/dispatches \ + -d '{ + "ref": "master", + "inputs": { + "branch_name": "<>", + "extra_args": "script", + "statuses_sha": "<< pipeline.git.revision >>", + "org": "ethereum-optimism", + "repository": "optimism" + } + }' working_directory: ./packages/contracts-bedrock - - store_artifacts: - path: ./packages/contracts-bedrock/test/kontrol/logs/kontrol-results_latest.tar.gz - - store_test_results: - path: ./packages/contracts-bedrock - notify-failures-on-develop + publish-contract-artifacts: + docker: + - image: <> + resource_class: xlarge + steps: + - gcp-cli/install + - gcp-oidc-authenticate: + gcp_cred_config_file_path: /root/gcp_cred_config.json + oidc_token_file_path: /root/oidc_token.json + project_id: GCP_TOOLS_ARTIFACTS_PROJECT_ID + service_account_email: GCP_CONTRACTS_PUBLISHER_SERVICE_ACCOUNT_EMAIL + - checkout + - install-contracts-dependencies + - run: + name: Pull artifacts + command: bash scripts/ops/pull-artifacts.sh + working_directory: packages/contracts-bedrock + - run: + name: Build contracts + environment: + FOUNDRY_PROFILE: ci + command: just build + working_directory: packages/contracts-bedrock + - run: + name: Publish artifacts + command: bash scripts/ops/publish-artifacts.sh + working_directory: packages/contracts-bedrock + workflows: main: when: @@ -1643,167 +1531,124 @@ workflows: - not: equal: [ scheduled_pipeline, << pipeline.trigger_source >> ] jobs: - - pnpm-monorepo: - name: pnpm-monorepo + - go-mod-download + - contracts-bedrock-build: + # Build with just core + script contracts. + skip_pattern: test - contracts-bedrock-tests: - requires: - - pnpm-monorepo + # Test everything except PreimageOracle.t.sol since it's slow. + name: contracts-bedrock-tests + test_parallelism: 4 + test_list: find test -name "*.t.sol" -not -name "PreimageOracle.t.sol" + - contracts-bedrock-tests: + # PreimageOracle test is slow, run it separately to unblock CI. + name: contracts-bedrock-tests-preimage-oracle + test_parallelism: 1 + test_list: find test -name "PreimageOracle.t.sol" + - contracts-bedrock-tests: + # Heavily fuzz any fuzz tests within added or modified test files. + name: contracts-bedrock-tests-heavy-fuzz-modified + test_parallelism: 1 + test_list: git diff origin/develop...HEAD --name-only -- './test/**/*.t.sol' | sed 's|packages/contracts-bedrock/||' + test_timeout: 1h + test_fuzz_runs: 10000 + test_invariant_runs: 128 + test_invariant_depth: 512 - contracts-bedrock-coverage - contracts-bedrock-checks: requires: - - pnpm-monorepo - - contracts-bedrock-validate-spaces: - requires: - - pnpm-monorepo - - js-lint-test: - name: chain-mon-tests - coverage_flag: chain-mon-tests - package_name: chain-mon - dependencies: "(contracts-bedrock|sdk)" + - contracts-bedrock-build + - contracts-bedrock-validate-spacers: requires: - - pnpm-monorepo - - js-lint-test: - name: sdk-tests - coverage_flag: sdk-tests - package_name: sdk - dependencies: "contracts-bedrock" + - contracts-bedrock-build + - semgrep-scan + - go-lint: requires: - - pnpm-monorepo - - depcheck: + - go-mod-download + - fuzz-golang: + name: fuzz-golang-<> requires: - - pnpm-monorepo - - go-lint-test-build: - name: proxyd-tests - binary_name: proxyd - working_directory: proxyd - - indexer-tests: - name: indexer-tests<< matrix.fpac >> + - go-mod-download + on_changes: <> matrix: parameters: - fpac: ["", "-fault-proofs"] - - semgrep-scan - - go-mod-download - - fuzz-golang: - name: op-challenger-fuzz - package_name: op-challenger - on_changes: op-challenger - requires: ["go-mod-download"] - - fuzz-golang: - name: op-node-fuzz - package_name: op-node - on_changes: op-node - requires: ["go-mod-download"] - - fuzz-golang: - name: op-service-fuzz - package_name: op-service - on_changes: op-service - requires: ["go-mod-download"] - - fuzz-golang: - name: op-chain-ops-fuzz - package_name: op-chain-ops - on_changes: op-chain-ops - requires: ["go-mod-download"] + package_name: + - op-challenger + - op-node + - op-service + - op-chain-ops - fuzz-golang: name: cannon-fuzz package_name: cannon on_changes: cannon,packages/contracts-bedrock/src/cannon uses_artifacts: true - requires: ["go-mod-download", "pnpm-monorepo"] + requires: ["go-mod-download", "contracts-bedrock-build"] - 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 - requires: [ "go-mod-download" ] - - go-test: - name: op-batcher-tests - module: op-batcher - requires: ["go-mod-download"] + requires: ["go-mod-download", "contracts-bedrock-build"] - go-test: - name: op-chain-ops-tests + name: <>-tests + requires: + - go-mod-download + matrix: + parameters: + module: + - op-batcher + - op-chain-ops + - op-node + - op-proposer + - op-challenger + - op-dispute-mon + - op-conductor + - op-program + - op-service + - op-supervisor + - go-test-kurtosis: + name: op-chain-ops-integration module: op-chain-ops - requires: ["go-mod-download"] - - go-test: - name: op-node-tests - module: op-node - requires: ["go-mod-download"] - - go-test: - name: op-proposer-tests - module: op-proposer - requires: ["go-mod-download"] - - go-test: - name: op-challenger-tests - module: op-challenger - requires: ["go-mod-download"] - - go-test: - name: op-dispute-mon-tests - module: op-dispute-mon - requires: ["go-mod-download"] - - go-test: - name: op-conductor-tests - module: op-conductor - requires: ["go-mod-download"] - - go-test: - name: op-program-tests - module: op-program - requires: ["go-mod-download"] - - go-test: - name: op-service-tests - module: op-service - requires: ["go-mod-download"] + test_directory: ./deployer/integration_test + uses_artifacts: true + requires: ["contracts-bedrock-build"] - go-e2e-test: - name: op-e2e-HTTP-tests<< matrix.fpac >> + name: op-e2e-HTTP-tests<< matrix.variant >> matrix: parameters: - fpac: ["", "-fault-proofs"] + variant: ["", "-l2oo"] module: op-e2e target: test-http parallelism: 4 requires: - go-mod-download - - pnpm-monorepo + - contracts-bedrock-build - go-e2e-test: - name: op-e2e-action-tests<< matrix.fpac >> + name: op-e2e-action-tests<< matrix.variant >> matrix: parameters: - fpac: ["", "-fault-proofs", "-plasma"] + variant: ["", "-l2oo", "-altda"] module: op-e2e target: test-actions parallelism: 1 requires: - go-mod-download - - pnpm-monorepo + - contracts-bedrock-build - go-e2e-test: name: op-e2e-fault-proof-tests module: op-e2e target: test-fault-proofs parallelism: 4 requires: - - pnpm-monorepo + - contracts-bedrock-build - cannon-prestate - - go-e2e-test: - name: op-e2e-ext-geth-tests<< matrix.fpac >> - matrix: - parameters: - fpac: ["", "-fault-proofs"] - module: op-e2e - target: test-external-geth - requires: - - go-mod-download - - pnpm-monorepo - - op-service-rethdb-tests: - requires: - - go-mod-download - op-program-compat: requires: - op-program-tests - bedrock-go-tests: requires: - go-mod-download + - go-lint - cannon-build-test-vectors - cannon-go-lint-and-test - check-generated-mocks-op-node @@ -1811,7 +1656,7 @@ workflows: - go-mod-download - op-batcher-tests - op-chain-ops-tests - - op-heartbeat-tests + - op-chain-ops-integration - op-node-tests - op-proposer-tests - op-challenger-tests @@ -1820,85 +1665,55 @@ workflows: - op-program-tests - op-program-compat - op-service-tests - - op-service-rethdb-tests + - op-supervisor-tests - op-e2e-HTTP-tests - op-e2e-fault-proof-tests - op-e2e-action-tests - - op-e2e-ext-geth-tests - - docker-build: - name: op-node-docker-build - docker_name: op-node - docker_tags: <>,<> - save_image_tag: <> # for devnet later - - docker-build: - name: op-batcher-docker-build - docker_name: op-batcher - docker_tags: <>,<> - save_image_tag: <> # for devnet later - - docker-build: - name: op-program-docker-build - docker_name: op-program - docker_tags: <>,<> - # 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: <>,<> - save_image_tag: <> # for devnet later - - docker-build: - name: op-challenger-docker-build - docker_name: op-challenger - docker_tags: <>,<> - save_image_tag: <> # for devnet later - - docker-build: - name: op-dispute-mon-docker-build - docker_name: op-dispute-mon - docker_tags: <>,<> - save_image_tag: <> # for devnet later + - op-e2e-action-tests-altda - docker-build: - name: op-conductor-docker-build - docker_name: op-conductor + name: <>-docker-build docker_tags: <>,<> - # 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: <>,<> - # 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 + save_image_tag: <> + matrix: + parameters: + docker_name: + - op-node + - op-batcher + - op-program + - op-proposer + - op-challenger + - proofs-tools + - op-dispute-mon + - op-conductor + - da-server + - op-supervisor + - op-deployer - cannon-prestate: requires: - go-mod-download - devnet: matrix: parameters: - fpac: ["legacy", "fault-proofs", "plasma"] + variant: ["default", "altda", "altda-generic"] requires: - - pnpm-monorepo + - contracts-bedrock-build - 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 - docker_name: indexer - docker_tags: <>,<> - - docker-build: - name: ufm-metamask-docker-build - docker_name: ufm-metamask - docker_tags: <>,<> - check-generated-mocks-op-node - check-generated-mocks-op-service - cannon-go-lint-and-test: requires: - - pnpm-monorepo + - contracts-bedrock-build + skip_slow_tests: true + notify: true - cannon-build-test-vectors + - todo-issues: + name: todo-issues-check + check_closed: false - shellcheck/check: name: shell-check # We don't need the `exclude` key as the orb detects the `.shellcheckrc` @@ -1911,281 +1726,92 @@ workflows: not: equal: [ scheduled_pipeline, << pipeline.trigger_source >> ] jobs: + # Wait for approval on the release - hold: type: approval filters: tags: - only: /^(da-server|proxyd|chain-mon|indexer|ci-builder(-rust)?|ufm-[a-z0-9\-]*|op-[a-z0-9\-]*)\/v.*/ + only: /^(da-server|ci-builder(-rust)?|proofs-tools|ufm-[a-z0-9\-]*|op-[a-z0-9\-]*)\/v.*/ branches: ignore: /.*/ + # Standard (medium) cross-platform docker images go here - docker-build: - name: op-heartbeat-release - filters: - tags: - only: /^op-heartbeat\/v.*/ - branches: - ignore: /.*/ - docker_name: op-heartbeat + matrix: + parameters: + docker_name: + - op-node + - op-batcher + - op-proposer + - op-challenger + - op-dispute-mon + - op-conductor + - da-server + - op-ufm + - op-supervisor + - op-deployer + name: <>-docker-release docker_tags: <> - 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: tags: - only: /^op-node\/v.*/ + only: /^<>\/v.*/ branches: ignore: /.*/ - docker_name: op-node - docker_tags: <> - 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: - tags: - only: /^op-batcher\/v.*/ - branches: - ignore: /.*/ - docker_name: op-batcher - docker_tags: <> - requires: ['hold'] - platforms: "linux/amd64,linux/arm64" - publish: true - release: true - context: - - oplabs-gcr-release + - hold + # Checks for cross-platform images go here - check-cross-platform: - name: op-batcher-cross-platform - op_component: op-batcher + matrix: + parameters: + op_component: + - op-node + - op-batcher + - op-proposer + - op-challenger + - op-dispute-mon + - op-conductor + - da-server + - op-ufm + - op-supervisor + - op-deployer + name: <>-cross-platform requires: + - op-node-docker-release - op-batcher-docker-release - - docker-build: - name: op-proposer-docker-release - filters: - tags: - only: /^op-proposer\/v.*/ - branches: - ignore: /.*/ - docker_name: op-proposer - docker_tags: <> - 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: - tags: - only: /^op-challenger\/v.*/ - branches: - ignore: /.*/ - docker_name: op-challenger - docker_tags: <> - 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: - tags: - only: /^op-dispute-mon\/v.*/ - branches: - ignore: /.*/ - docker_name: op-dispute-mon - docker_tags: <> - 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: - tags: - only: /^op-conductor\/v.*/ - branches: - ignore: /.*/ - docker_name: op-conductor - docker_tags: <> - 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 + - op-ufm-docker-release + - op-supervisor-docker-release + - op-deployer-docker-release + # Standard (xlarge) AMD-only docker images go here - docker-build: - name: op-ufm-docker-release - filters: - tags: - only: /^op-ufm\/v.*/ - branches: - ignore: /.*/ - docker_name: op-ufm - docker_tags: <> - publish: true - release: true - context: - - oplabs-gcr-release - requires: - - hold - - docker-build: - name: proxyd-docker-release - filters: - tags: - only: /^proxyd\/v.*/ - branches: - ignore: /.*/ - docker_name: proxyd - docker_tags: <> - publish: true - release: true - context: - - oplabs-gcr-release - requires: - - hold - - docker-build: - name: indexer-docker-release - filters: - tags: - only: /^indexer\/v.*/ - branches: - ignore: /.*/ - docker_name: indexer + matrix: + parameters: + docker_name: + - ci-builder + - ci-builder-rust + - proofs-tools + name: <>-docker-release + resource_class: xlarge docker_tags: <> publish: true release: true - context: - - oplabs-gcr-release - requires: - - hold - - docker-build: - name: chain-mon-docker-release filters: tags: - only: /^chain-mon\/v.*/ + only: /^<>\/v.*/ branches: ignore: /.*/ - docker_name: chain-mon - docker_tags: <>,latest - publish: true - release: true - resource_class: xlarge context: - oplabs-gcr-release requires: - hold - - docker-build: - name: ci-builder-docker-release - filters: - tags: - only: /^ci-builder\/v.*/ - branches: - ignore: /.*/ - docker_name: ci-builder - docker_tags: <>,latest - publish: true - release: true - resource_class: xlarge - context: - - oplabs-gcr - requires: - - hold - - docker-build: - name: ci-builder-rust-docker-release - filters: - tags: - only: /^ci-builder-rust\/v.*/ - branches: - ignore: /.*/ - docker_name: ci-builder-rust - docker_tags: <>,latest - publish: true - release: true - resource_class: xlarge - context: - - oplabs-gcr - requires: - - hold - - docker-build: - name: ufm-metamask-docker-release - filters: - tags: - only: /^ufm-metamask\/v.*/ - branches: - ignore: /.*/ - docker_name: ufm-metamask - docker_tags: <>,latest - publish: true - release: true - context: - - oplabs-gcr - requires: - - hold scheduled-todo-issues: when: @@ -2205,6 +1831,14 @@ workflows: - slack - oplabs-fpp-nodes + develop-publish-contract-artifacts: + when: + or: + - equal: [ "develop", <> ] + - equal: [ true, <> ] + jobs: + - publish-contract-artifacts + develop-fault-proofs: when: and: @@ -2218,19 +1852,22 @@ workflows: - cannon-prestate: requires: - go-mod-download - - pnpm-monorepo: - name: pnpm-monorepo - requires: - - go-mod-download + - contracts-bedrock-build: + skip_pattern: test + context: + - slack - go-e2e-test: - name: op-e2e-cannon-tests + name: op-e2e-cannon-tests<< matrix.variant >> + matrix: + parameters: + variant: ["", "-mt-cannon"] module: op-e2e target: test-cannon parallelism: 4 notify: true mentions: "@proofs-squad" requires: - - pnpm-monorepo + - contracts-bedrock-build - cannon-prestate context: - slack @@ -2247,135 +1884,68 @@ workflows: - kontrol-tests: context: - slack + - runtimeverification - develop-sdk-next-tests: + scheduled-cannon-full-tests: when: - and: - - or: - - equal: [ "develop", <> ] - - equal: [ true, <> ] - - not: - equal: [ scheduled_pipeline, << pipeline.trigger_source >> ] + or: + - equal: [ build_four_hours, <> ] + - equal: [ true, << pipeline.parameters.cannon_full_test_dispatch >> ] jobs: - - pnpm-monorepo: - name: pnpm-monorepo - context: - - slack - - sdk-next-tests: - name: sdk-next-tests + - contracts-bedrock-build: + skip_pattern: test + - cannon-go-lint-and-test: requires: - - pnpm-monorepo + - contracts-bedrock-build context: - slack scheduled-docker-publish: when: - equal: [ build_hourly, <> ] + or: + - equal: [ build_hourly, <> ] + # Trigger on manual triggers if explicitly requested + - equal: [ true, << pipeline.parameters.docker_publish_dispatch >> ] jobs: - docker-build: - name: op-node-docker-publish - docker_name: op-node - docker_tags: <>,<> - platforms: "linux/amd64,linux/arm64" - publish: true - context: - - oplabs-gcr - - slack - - docker-build: - name: op-batcher-docker-publish - docker_name: op-batcher - docker_tags: <>,<> - platforms: "linux/amd64,linux/arm64" - publish: true - context: - - oplabs-gcr - - slack - - docker-build: - name: op-program-docker-publish - docker_name: op-program - docker_tags: <>,<> - platforms: "linux/amd64,linux/arm64" - publish: true - context: - - oplabs-gcr - - slack - - docker-build: - name: op-proposer-docker-publish - docker_name: op-proposer - docker_tags: <>,<> - platforms: "linux/amd64,linux/arm64" - publish: true - context: - - oplabs-gcr - - slack - - docker-build: - name: op-challenger-docker-publish - docker_name: op-challenger - docker_tags: <>,<> - platforms: "linux/amd64,linux/arm64" - publish: true - context: - - oplabs-gcr - - slack - - docker-build: - name: op-dispute-mon-docker-publish - docker_name: op-dispute-mon - docker_tags: <>,<> - platforms: "linux/amd64,linux/arm64" - publish: true - context: - - oplabs-gcr - - slack - - docker-build: - name: op-conductor-docker-publish - docker_name: op-conductor - docker_tags: <>,<> - platforms: "linux/amd64,linux/arm64" - publish: true - context: - - oplabs-gcr - - slack - - docker-build: - name: op-heartbeat-docker-publish - docker_name: op-heartbeat - docker_tags: <>,<> - platforms: "linux/amd64,linux/arm64" - publish: true - context: - - oplabs-gcr - - slack - - docker-build: - name: indexer-docker-publish - docker_name: indexer + matrix: + parameters: + docker_name: + - op-node + - op-batcher + - op-program + - op-proposer + - op-challenger + - op-dispute-mon + - op-conductor + - op-supervisor + name: <>-docker-publish docker_tags: <>,<> - publish: true - context: - - oplabs-gcr - - slack platforms: "linux/amd64,linux/arm64" - - docker-build: - name: chain-mon-docker-publish - docker_name: chain-mon - docker_tags: <>,<> - resource_class: xlarge publish: true context: - oplabs-gcr - slack + - check-cross-platform: + matrix: + parameters: + op_component: + - op-node + - op-batcher + - op-program + - op-proposer + - op-challenger + - op-dispute-mon + - op-conductor + - op-supervisor + name: <>-cross-platform + requires: + - <>-docker-publish - docker-build: name: contracts-bedrock-docker-publish docker_name: contracts-bedrock docker_tags: <>,<> resource_class: xlarge - requires: [ 'chain-mon-docker-publish' ] # use the cached base image - publish: true - context: - - oplabs-gcr - - slack - - docker-build: - name: ufm-metamask-docker-publish - docker_name: ufm-metamask - docker_tags: <>,<> publish: true context: - oplabs-gcr @@ -2391,6 +1961,17 @@ workflows: - preimage-reproducibility: matrix: parameters: - version: ["0.1.0", "0.2.0", "0.3.0", "1.0.0"] + version: + - "0.1.0" + - "0.2.0" + - "0.3.0" + - "1.0.0" + - "1.1.0" + - "1.2.0" + - "1.3.0-rc.1" + - "1.3.0-rc.2" + - "1.3.0-rc.3" + - "1.3.1-rc.1" + - "1.3.1-rc.2" context: slack diff --git a/.coderabbit.yml b/.coderabbit.yml index 2b0209adcf38..f54403cf1571 100644 --- a/.coderabbit.yml +++ b/.coderabbit.yml @@ -7,7 +7,6 @@ reviews: collapse_walkthrough: true path_filters: - "!**/*.json" - - "!op-bindings/bindings/**" path_instructions: - path: "**.sol" instructions: "Focus on the following areas: @@ -16,7 +15,7 @@ reviews: - Removing unnecessary code " auto_review: - enabled: true + enabled: false drafts: false base_branches: - "develop" diff --git a/.dockerignore b/.dockerignore index 054163a81afc..11e5eb817c5a 100644 --- a/.dockerignore +++ b/.dockerignore @@ -1,9 +1,8 @@ .github .vscode -node_modules -**/node_modules .env +.envrc **/.env test diff --git a/.envrc.example b/.envrc.example index 0ea9d7ea1bac..43ccf74842b6 100644 --- a/.envrc.example +++ b/.envrc.example @@ -18,6 +18,19 @@ export GS_PROPOSER_PRIVATE_KEY= export GS_SEQUENCER_ADDRESS= export GS_SEQUENCER_PRIVATE_KEY= + +################################################## +# Chain Information # +################################################## + +# L1 chain information +export L1_CHAIN_ID=11155111 +export L1_BLOCK_TIME=12 + +# L2 chain information +export L2_CHAIN_ID=42069 +export L2_BLOCK_TIME=2 + ################################################## # op-node Configuration # ################################################## diff --git a/.eslintrc.js b/.eslintrc.js deleted file mode 100644 index 0152c354b87f..000000000000 --- a/.eslintrc.js +++ /dev/null @@ -1,187 +0,0 @@ -module.exports = { - root: true, - env: { - browser: true, - es6: true, - }, - ignorePatterns: ['dist', 'coverage'], - extends: ['plugin:prettier/recommended'], - parser: '@babel/eslint-parser', - parserOptions: { - es6: true, - ecmaVersion: 6, - sourceType: 'module', - requireConfigFile: false, - }, - plugins: [ - 'eslint-plugin-import', - 'eslint-plugin-unicorn', - 'eslint-plugin-jsdoc', - 'eslint-plugin-prefer-arrow', - 'eslint-plugin-react', - '@typescript-eslint', - ], - overrides: [ - { - files: ['**/*.ts'], - parser: '@typescript-eslint/parser', - parserOptions: { - project: './packages/**/tsconfig.json', - sourceType: 'module', - allowAutomaticSingleRunInference: true, - }, - rules: { - '@typescript-eslint/adjacent-overload-signatures': 'error', - '@typescript-eslint/array-type': 'off', - '@typescript-eslint/ban-types': 'off', - '@typescript-eslint/consistent-type-assertions': 'error', - '@typescript-eslint/dot-notation': 'off', - '@typescript-eslint/indent': 'off', - '@typescript-eslint/member-delimiter-style': [ - 'off', - { - multiline: { - delimiter: 'none', - requireLast: true, - }, - singleline: { - delimiter: 'semi', - requireLast: false, - }, - }, - ], - '@typescript-eslint/member-ordering': 'off', - '@typescript-eslint/naming-convention': 'off', - '@typescript-eslint/no-empty-function': 'error', - '@typescript-eslint/no-empty-interface': 'off', - '@typescript-eslint/no-explicit-any': 'off', - '@typescript-eslint/no-misused-new': 'error', - '@typescript-eslint/no-namespace': 'error', - '@typescript-eslint/no-parameter-properties': 'off', - '@typescript-eslint/no-shadow': [ - 'error', - { - hoist: 'all', - }, - ], - '@typescript-eslint/no-this-alias': 'error', - '@typescript-eslint/no-unused-expressions': 'off', - '@typescript-eslint/no-use-before-define': 'off', - '@typescript-eslint/no-var-requires': 'error', - '@typescript-eslint/prefer-for-of': 'error', - '@typescript-eslint/prefer-function-type': 'error', - '@typescript-eslint/prefer-namespace-keyword': 'error', - '@typescript-eslint/quotes': 'off', - '@typescript-eslint/semi': ['off', null], - '@typescript-eslint/triple-slash-reference': [ - 'error', - { - path: 'always', - types: 'prefer-import', - lib: 'always', - }, - ], - '@typescript-eslint/type-annotation-spacing': 'off', - '@typescript-eslint/unified-signatures': 'error', - '@typescript-eslint/no-unused-vars': 'error', - }, - }, - ], - rules: { - 'prettier/prettier': 'warn', - 'arrow-parens': ['off', 'always'], - 'brace-style': ['off', 'off'], - 'comma-dangle': 'off', - complexity: 'off', - 'constructor-super': 'error', - curly: 'error', - 'dot-notation': 'off', - 'eol-last': 'off', - eqeqeq: ['error', 'smart'], - 'guard-for-in': 'error', - 'id-blacklist': 'off', - 'id-match': 'off', - 'import/no-extraneous-dependencies': ['error'], - 'import/no-internal-modules': 'off', - 'import/order': [ - 'error', - { - groups: ['builtin', 'external', 'internal'], - 'newlines-between': 'always', - }, - ], - indent: 'off', - 'jsdoc/check-alignment': 'error', - 'jsdoc/check-indentation': 'error', - 'linebreak-style': 'off', - 'max-classes-per-file': 'off', - 'max-len': 'off', - 'new-parens': 'off', - 'newline-per-chained-call': 'off', - 'no-bitwise': 'off', - 'no-caller': 'error', - 'no-cond-assign': 'error', - 'no-console': 'off', - 'no-debugger': 'error', - 'no-duplicate-case': 'error', - 'no-duplicate-imports': 'error', - 'no-empty': 'error', - 'no-eval': 'error', - 'no-extra-bind': 'error', - 'no-extra-semi': 'off', - 'no-fallthrough': 'off', - 'no-invalid-this': 'off', - 'no-irregular-whitespace': 'off', - 'no-multiple-empty-lines': 'off', - 'no-new-func': 'error', - 'no-new-wrappers': 'error', - 'no-redeclare': 'error', - 'no-return-await': 'error', - 'no-sequences': 'error', - 'no-sparse-arrays': 'error', - 'no-template-curly-in-string': 'error', - 'no-throw-literal': 'error', - 'no-trailing-spaces': 'off', - 'no-undef-init': 'error', - 'no-underscore-dangle': 'off', - 'no-unsafe-finally': 'error', - 'no-unused-expressions': 'off', - 'no-unused-labels': 'error', - 'no-use-before-define': 'off', - 'no-var': 'error', - 'object-shorthand': 'error', - 'one-var': ['error', 'never'], - 'padded-blocks': [ - 'off', - { - blocks: 'never', - }, - { - allowSingleLineBlocks: true, - }, - ], - 'prefer-arrow/prefer-arrow-functions': 'error', - 'prefer-const': 'error', - 'prefer-object-spread': 'error', - 'quote-props': 'off', - quotes: 'off', - radix: 'error', - 'react/jsx-curly-spacing': 'off', - 'react/jsx-equals-spacing': 'off', - 'react/jsx-tag-spacing': [ - 'off', - { - afterOpening: 'allow', - closingSlash: 'allow', - }, - ], - 'react/jsx-wrap-multilines': 'off', - semi: 'off', - 'space-before-blocks': 'error', - 'space-before-function-paren': 'off', - 'space-in-parens': ['off', 'never'], - 'unicorn/prefer-ternary': 'off', - 'use-isnan': 'error', - 'valid-typeof': 'off', - }, -} diff --git a/.github/CODEOWNERS b/.github/CODEOWNERS index 25ba82eb35e4..46196699f646 100644 --- a/.github/CODEOWNERS +++ b/.github/CODEOWNERS @@ -1,29 +1,31 @@ -# Packages -/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/sdk @ethereum-optimism/devxpod +# Monorepo - default to go-reviewers +* @ethereum-optimism/go-reviewers + +# OP Stack general +/bedrock-devnet @ethereum-optimism/op-stack @ethereum-optimism/go-reviewers +/op-alt-da @ethereum-optimism/op-stack @ethereum-optimism/go-reviewers +/op-batcher @ethereum-optimism/op-stack @ethereum-optimism/go-reviewers +/op-chain-ops @ethereum-optimism/op-stack @ethereum-optimism/go-reviewers +/op-e2e @ethereum-optimism/op-stack @ethereum-optimism/go-reviewers +/op-node @ethereum-optimism/op-stack @ethereum-optimism/go-reviewers +/op-proposer @ethereum-optimism/op-stack @ethereum-optimism/go-reviewers +/op-wheel @ethereum-optimism/op-stack @ethereum-optimism/go-reviewers +/ops-bedrock @ethereum-optimism/op-stack @ethereum-optimism/go-reviewers + +# Expert areas +/op-node/rollup @ethereum-optimism/consensus @ethereum-optimism/go-reviewers + +/op-supervisor @ethereum-optimism/interop @ethereum-optimism/go-reviewers -# Bedrock codebases -/bedrock-devnet @ethereum-optimism/go-reviewers -/cannon @ethereum-optimism/go-reviewers -/op-batcher @ethereum-optimism/go-reviewers -/op-bootnode @ethereum-optimism/go-reviewers -/op-chain-ops @ethereum-optimism/go-reviewers -/op-challenger @ethereum-optimism/go-reviewers -/op-dispute-mon @ethereum-optimism/go-reviewers -/op-e2e @ethereum-optimism/go-reviewers -/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 -/op-service @ethereum-optimism/go-reviewers -/op-wheel @ethereum-optimism/go-reviewers -/ops-bedrock @ethereum-optimism/go-reviewers -/op-conductor @0x00101010 @zhwrd @mslipper +/op-conductor @ethereum-optimism/op-conductor @ethereum-optimism/go-reviewers + +/cannon @ethereum-optimism/proofs @ethereum-optimism/go-reviewers +/op-challenger @ethereum-optimism/proofs @ethereum-optimism/go-reviewers +/op-dispute-mon @ethereum-optimism/proofs @ethereum-optimism/go-reviewers +/op-preimage @ethereum-optimism/proofs @ethereum-optimism/go-reviewers +/op-program @ethereum-optimism/proofs @ethereum-optimism/go-reviewers +/op-e2e/actions/proofs @ethereum-optimism/proofs @ethereum-optimism/go-reviewers +/op-e2e/faultproofs @ethereum-optimism/proofs @ethereum-optimism/go-reviewers # Ops /.circleci @ethereum-optimism/monorepo-ops-reviewers @@ -31,17 +33,5 @@ /ops @ethereum-optimism/monorepo-ops-reviewers /docker-bake.hcl @ethereum-optimism/monorepo-ops-reviewers -# Misc -/proxyd @ethereum-optimism/infra-reviewers -/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 -/*/package.json - -# JavaScript Releases -/packages/*/CHANGELOG.md @ethereum-optimism/release-managers -/*/CHANGELOG.md @ethereum-optimism/release-managers +# Contracts +/packages/contracts-bedrock @ethereum-optimism/contract-reviewers diff --git a/.github/actions/setup/action.yml b/.github/actions/setup/action.yml index 311595e7ab98..4c8918566485 100644 --- a/.github/actions/setup/action.yml +++ b/.github/actions/setup/action.yml @@ -3,29 +3,5 @@ description: Common setup steps used by our workflows runs: using: composite steps: - - name: Setup pnpm - uses: pnpm/action-setup@v3 - with: - version: 9 - - name: Setup node - uses: actions/setup-node@v3 - with: - node-version-file: .nvmrc - registry-url: https://registry.npmjs.org - cache: pnpm - - name: Setup foundry uses: foundry-rs/foundry-toolchain@v1 - - - name: Install node dependencies - shell: bash - run: pnpm install:ci - - name: Derive appropriate SHAs for base and head for `nx affected` commands - uses: nrwl/nx-set-shas@v3 - with: - main-branch-name: "develop" - - run: | - echo "nx using following shas:" - echo "BASE: ${{ env.NX_BASE }}" - echo "HEAD: ${{ env.NX_HEAD }}" - shell: bash diff --git a/.github/mergify.yml b/.github/mergify.yml deleted file mode 100644 index ca07ed88ad64..000000000000 --- a/.github/mergify.yml +++ /dev/null @@ -1,272 +0,0 @@ -queue_rules: - - name: urgent - queue_conditions: - - "label=C-urgent" - - name: default - queue_conditions: - - "label!=C-urgent" - - author!=dependabot[bot] - - name: lowpriority - queue_conditions: - - author=dependabot[bot] - -pull_request_rules: - - name: Automatic merge on approval - conditions: - - and: - - "#review-threads-unresolved=0" - - "#approved-reviews-by>=1" - - "#changes-requested-reviews-by=0" - - "label!=do-not-merge" - - "label!=multiple-reviewers" - - "label!=mergify-ignore" - - "label!=M-do-not-merge" - - "label!=M-multiple-reviewers" - - "label!=M-mergify-ignore" - - "base=develop" - actions: - queue: - name: default - method: merge - merge_bot_account: OptimismBot - - name: Add merge train label - conditions: - - "queue-position >= 0" - actions: - comment: - message: | - This PR has been added to the merge queue, and will be merged soon. - label: - add: - - S-on-merge-train - - name: Remove merge train label - conditions: - - "queue-position = -1" - actions: - label: - remove: - - S-on-merge-train - - name: Ask to resolve conflict - conditions: - - conflict - actions: - comment: - message: Hey @{{author}}! This PR has merge conflicts. Please fix them before continuing review. - label: - add: - - S-conflict - - name: Remove conflicts label when conflicts gone - conditions: - - -conflict - actions: - label: - remove: - - S-conflict - - name: Notify author when added to merge queue - conditions: - - "check-pending=Queue: Embarked in merge train" - actions: - comment: - message: | - This PR is next in line to be merged, and will be merged as soon as checks pass. - - name: Notify author on queue failure - conditions: - - 'check-failure=Queue: Embarked in merge train' - actions: - comment: - message: > - Hey @{{ author }}, this pull request failed to merge and has been - dequeued from the merge train. If you believe your PR failed in - the merge train because of a flaky test, requeue it by commenting - with `@mergifyio requeue`. - - More details can be found on the `Queue: Embarked in merge train` - check-run. - - name: Add A-cannon label - conditions: - - 'files~=^cannon/' - actions: - label: - add: - - A-cannon - - name: Add A-indexer label and ecopod reviewers - conditions: - - 'files~=^indexer/' - - '#label<5' - actions: - label: - add: - - A-indexer - request_reviews: - users: - - roninjin10 - - name: Add A-op-batcher label - conditions: - - 'files~=^op-batcher/' - actions: - label: - add: - - A-op-batcher - - name: Add A-op-bindings label - conditions: - - 'files~=^op-bindings/' - actions: - label: - add: - - A-op-bindings - - name: Add A-op-bootnode label - conditions: - - 'files~=^op-bootnode/' - - '#label<5' - actions: - label: - add: - - A-op-bootnode - - name: Add A-op-chain-ops label - conditions: - - 'files~=^op-chain-ops/' - actions: - label: - add: - - A-op-chain-ops - - name: Add A-op-challenger label - conditions: - - 'files~=^op-challenger/' - actions: - label: - add: - - A-op-challenger - - name: Add A-op-e2e label - conditions: - - 'files~=^op-e2e/' - - '#label<5' - actions: - label: - add: - - A-op-e2e - - name: Add A-op-heartbeat label - conditions: - - 'files~=^op-heartbeat/' - - '#label<5' - actions: - label: - add: - - A-op-heartbeat - - name: Add A-op-node label - conditions: - - 'files~=^op-node/' - actions: - label: - add: - - A-op-node - - name: Add A-op-preimage label - conditions: - - 'files~=^op-preimage/' - - '#label<5' - actions: - label: - add: - - A-op-preimage - - name: Add A-op-program label - conditions: - - 'files~=^op-program/' - actions: - label: - add: - - A-op-program - - name: Add A-op-proposer label - conditions: - - 'files~=^op-proposer/' - actions: - label: - add: - - A-op-proposer - - name: Add A-op-service label - conditions: - - 'files~=^op-service/' - - '#label<5' - actions: - label: - add: - - A-op-service - - name: Add A-op-wheel label - conditions: - - 'files~=^op-wheel/' - - '#label<5' - actions: - label: - add: - - A-op-wheel - - name: Add A-ops-bedrock label - conditions: - - 'files~=^ops-bedrock/' - - '#label<5' - actions: - label: - add: - - A-ops-bedrock - - name: Add A-ops label - conditions: - - 'files~=^ops/' - - '#label<5' - actions: - label: - add: - - A-ops - - name: Add A-pkg-chain-mon label - conditions: - - 'files~=^packages/chain-mon/' - - '#label<5' - actions: - label: - add: - - A-pkg-chain-mon - - name: Add A-pkg-contracts-bedrock label - conditions: - - 'files~=^packages/contracts-bedrock/' - actions: - label: - add: - - A-pkg-contracts-bedrock - - name: Add A-pkg-sdk label and ecopod reviewers - conditions: - - 'files~=^packages/sdk/' - - '#label<5' - actions: - label: - add: - - A-pkg-sdk - request_reviews: - users: - - roninjin10 - - name: Add A-proxyd label - conditions: - - 'files~=^proxyd/' - - '#label<5' - actions: - label: - add: - - A-proxyd - - name: Add M-docs label - conditions: - - 'files~=^(docs|specs)\/' - - '#label<5' - actions: - label: - add: - - M-docs - - name: Add M-deletion label when files are removed - conditions: - - 'removed-files~=^/' - actions: - label: - add: - - M-deletion - - name: Add M-ci label when ci files are modified - conditions: - - 'files~=^\.(github|circleci|husky)\/' - - '#label<5' - actions: - label: - add: - - M-ci diff --git a/.github/workflows/release-docker-canary.yml b/.github/workflows/release-docker-canary.yml deleted file mode 100644 index 61ddf994f94c..000000000000 --- a/.github/workflows/release-docker-canary.yml +++ /dev/null @@ -1,244 +0,0 @@ -name: Publish Docker images (canary) - -on: - # enable users to manually trigger with workflow_dispatch - workflow_dispatch: - inputs: - customImageName: - description: 'Custom Docker Image Tag (keep empty for git hash)' - required: false - default: '0.0.0-rc-0' - -jobs: - canary-publish: - name: Publish Packages (canary) - runs-on: ubuntu-latest - # map the step outputs to job outputs - outputs: - balance-mon: ${{ steps.packages.outputs.balance-mon }} - drippie-mon: ${{ steps.packages.outputs.drippie-mon }} - fault-mon: ${{ steps.packages.outputs.fault-mon }} - multisig-mon: ${{ steps.packages.outputs.multisig-mon }} - 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 - uses: actions/checkout@v4 - with: - # This makes Actions fetch all Git history so that Changesets can generate changelogs with the correct commits - fetch-depth: 0 - - - name: Docker Image Name - id: docker-image-name - run: | - if [ ${CUSTOM_IMAGE_NAME} == '' ] - then - echo "::set-output name=canary-docker-tag::${GITHUB_SHA::8}" - else - echo "::set-output name=canary-docker-tag::prerelease-${CUSTOM_IMAGE_NAME}" - fi - env: - CUSTOM_IMAGE_NAME: ${{ github.event.inputs.customImageName }} - - fault-mon: - name: Publish fault-mon Version ${{ needs.canary-publish.outputs.canary-docker-tag }} - needs: canary-publish - if: needs.canary-publish.outputs.fault-mon != '' - 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: Build and push - uses: docker/build-push-action@v2 - with: - context: . - file: ./ops/docker/Dockerfile.packages - target: fault-mon - push: true - tags: ethereumoptimism/fault-mon:${{ needs.canary-publish.outputs.canary-docker-tag }} - - balance-mon: - name: Publish Balance Monitor Version ${{ needs.canary-publish.outputs.canary-docker-tag }} - needs: canary-publish - if: needs.canary-publish.outputs.balance-mon != '' - 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: Build and push - uses: docker/build-push-action@v2 - with: - context: . - file: ./ops/docker/Dockerfile.packages - target: balance-mon - push: true - tags: ethereumoptimism/balance-mon:${{ needs.canary-publish.outputs.canary-docker-tag }} - - multisig-mon: - name: Publish Multisig Monitor Version ${{ needs.canary-publish.outputs.canary-docker-tag }} - needs: canary-publish - if: needs.canary-publish.outputs.multisig-mon != '' - 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: Build and push - uses: docker/build-push-action@v2 - with: - context: . - file: ./ops/docker/Dockerfile.packages - target: multisig-mon - push: true - tags: ethereumoptimism/multisig-mon:${{ needs.canary-publish.outputs.canary-docker-tag }} - - drippie-mon: - name: Publish Drippie Monitor Version ${{ needs.canary-publish.outputs.canary-docker-tag }} - needs: canary-publish - if: needs.canary-publish.outputs.drippie-mon != '' - 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: Build and push - uses: docker/build-push-action@v2 - with: - context: . - file: ./ops/docker/Dockerfile.packages - target: drippie-mon - push: true - tags: ethereumoptimism/drippie-mon:${{ needs.canary-publish.outputs.canary-docker-tag }} - - wd-mon: - name: Publish Withdrawal Monitor Version ${{ needs.canary-publish.outputs.canary-docker-tag }} - needs: canary-publish - if: needs.canary-publish.outputs.wd-mon != '' - 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: Build and push - uses: docker/build-push-action@v2 - with: - context: . - file: ./ops/docker/Dockerfile.packages - target: wd-mon - push: true - tags: ethereumoptimism/wd-mon:${{ needs.canary-publish.outputs.canary-docker-tag }} - - replica-mon: - name: Publish replica-mon Version ${{ needs.canary-publish.outputs.canary-docker-tag }} - needs: canary-publish - if: needs.canary-publish.outputs.replica-mon != '' - 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: Build and push - uses: docker/build-push-action@v2 - with: - context: . - file: ./ops/docker/Dockerfile.packages - 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-snapshot.yml b/.github/workflows/release-snapshot.yml deleted file mode 100644 index 372c970e2b99..000000000000 --- a/.github/workflows/release-snapshot.yml +++ /dev/null @@ -1,43 +0,0 @@ -name: Release snapshot - -# Releases a snapshot release when new commits merge to develop -# This ensures the release process is working as expected as well as always gives us a release -# we should move to a single branch in near future -on: - workflow_dispatch: - push: - branches: - - develop - -jobs: - snapshot-snapshot: - name: Publish snapshot release to npm - if: github.repository == 'ethereum-optimism/optimism' - runs-on: ubuntu-latest - steps: - - name: Checkout - uses: actions/checkout@v4 - with: - submodules: recursive - fetch-depth: 0 - - - name: Setup - uses: ./.github/actions/setup - - - name: Set deployment token - run: npm config set '//registry.npmjs.org/:_authToken' "${NPM_TOKEN}" - env: - NPM_TOKEN: ${{ secrets.NPM_TOKEN }} - - - name: Verify NPM Token is valid - run: npm whoami - env: - NPM_TOKEN: ${{ secrets.NPM_TOKEN }} - - - name: Publish snapshots - uses: seek-oss/changesets-snapshot@v0 - with: - pre-publish: pnpm nx run-many --target=build --skip-nx-cache - env: - GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }} - NPM_TOKEN: ${{ secrets.NPM_TOKEN }} diff --git a/.github/workflows/release.yml b/.github/workflows/release.yml deleted file mode 100644 index 469db26b5d3a..000000000000 --- a/.github/workflows/release.yml +++ /dev/null @@ -1,280 +0,0 @@ -name: Release and version - -on: - workflow_dispatch: - push: - branches: - - develop - -# Always wait for previous release to finish before releasing again -concurrency: ${{ github.workflow }}-${{ github.ref }} - -jobs: - release: - name: Release - runs-on: ubuntu-latest - if: github.repository == 'ethereum-optimism/optimism' - # map the step outputs to job outputs - outputs: - balance-mon: ${{ steps.packages.outputs.balance-mon }} - drippie-mon: ${{ steps.packages.outputs.drippie-mon }} - fault-mon: ${{ steps.packages.outputs.fault-mon }} - 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 - permissions: - contents: write - pull-requests: write - id-token: write - steps: - - name: Checkout Repo - uses: actions/checkout@v4 - with: - # This makes Actions fetch all Git history so that Changesets can generate changelogs with the correct commits - fetch-depth: 0 - ref: "develop" - - - name: Setup - uses: ./.github/actions/setup - - - name: Check if NPM_TOKEN is set - id: check_token - run: | - if [ -z "${{ secrets.NPM_TOKEN }}" ]; then - echo "NPM_TOKEN is not set. Is it set it in your repository secrets?" - exit 1 - fi - shell: bash - - - name: Set deployment token - run: npm config set '//registry.npmjs.org/:_authToken' "${NPM_TOKEN}" - env: - NPM_TOKEN: ${{ secrets.NPM_TOKEN }} - - - name: Verify NPM Token is valid - run: npm whoami - - # Makes a pr to publish the changesets that when - # merged will publish to npm - # see https://github.com/changesets/action - - name: Publish To NPM or Create Release Pull Request - uses: changesets/action@v1 - id: changesets - with: - createGithubReleases: false - publish: pnpm release:publish - version: pnpm release:version - env: - GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }} - NPM_TOKEN: ${{ secrets.NPM_TOKEN }} - - # Conditional on the release being executed, we unbundle the publishedPackages to specific - # job outputs - - name: Get version tags from each published version - id: packages - if: steps.changesets.outputs.published == 'true' - run: | - node ops/scripts/ci-versions.js ${{ toJSON(steps.changesets.outputs.publishedPackages) }} - - fault-mon: - name: Publish fault-mon Version ${{ needs.release.outputs.fault-mon }} - needs: release - if: needs.release.outputs.fault-mon != '' - 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: Build and push - uses: docker/build-push-action@v2 - with: - context: . - file: ./ops/docker/Dockerfile.packages - target: fault-mon - push: true - tags: ethereumoptimism/fault-mon:${{ needs.release.outputs.fault-mon }},ethereumoptimism/fault-mon:latest - - wd-mon: - name: Publish Withdrawal Monitor Version ${{ needs.release.outputs.wd-mon }} - needs: release - if: needs.release.outputs.wd-mon != '' - 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: Build and push - uses: docker/build-push-action@v2 - with: - context: . - file: ./ops/docker/Dockerfile.packages - target: wd-mon - push: true - tags: ethereumoptimism/wd-mon:${{ needs.release.outputs.wd-mon }},ethereumoptimism/wd-mon:latest - - balance-mon: - name: Publish Balance Monitor Version ${{ needs.release.outputs.balance-mon }} - needs: release - if: needs.release.outputs.balance-mon != '' - 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: Build and push - uses: docker/build-push-action@v2 - with: - context: . - file: ./ops/docker/Dockerfile.packages - target: balance-mon - push: true - tags: ethereumoptimism/balance-mon:${{ needs.release.outputs.balance-mon }},ethereumoptimism/balance-mon:latest - - multisig-mon: - name: Publish Multisig Monitor Version ${{ needs.release.outputs.multisig-mon }} - needs: release - if: needs.release.outputs.multisig-mon != '' - 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: Build and push - uses: docker/build-push-action@v2 - with: - context: . - file: ./ops/docker/Dockerfile.packages - target: multisig-mon - push: true - tags: ethereumoptimism/multisig-mon:${{ needs.release.outputs.multisig-mon }},ethereumoptimism/multisig-mon:latest - - drippie-mon: - name: Publish Drippie Monitor Version ${{ needs.release.outputs.drippie-mon }} - needs: release - if: needs.release.outputs.drippie-mon != '' - 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: Build and push - uses: docker/build-push-action@v2 - with: - context: . - file: ./ops/docker/Dockerfile.packages - target: drippie-mon - push: true - tags: ethereumoptimism/drippie-mon:${{ needs.release.outputs.drippie-mon }},ethereumoptimism/drippie-mon:latest - - replica-mon: - name: Publish Replica Healthcheck Version ${{ needs.release.outputs.replica-mon }} - needs: release - if: needs.release.outputs.replica-mon != '' - 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: Build and push - uses: docker/build-push-action@v2 - with: - context: . - file: ./ops/docker/Dockerfile.packages - 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 f863b8de60d8..069c6eb2f0e7 100644 --- a/.github/workflows/slither.yml +++ b/.github/workflows/slither.yml @@ -15,13 +15,6 @@ jobs: steps: - uses: actions/checkout@v4 - # Workaround to prevent slither-action from trying to install JS deps. - # Without this step, it detects the `package.json`, and since there is no - # lockfile it defaults `npm install` which fails due to the preinstall - # script to enforce pnpm. https://github.com/crytic/slither-action/issues/44#issuecomment-1338183656 - - name: Remove package.json - run: rm packages/contracts-bedrock/package.json - - name: Run Slither uses: crytic/slither-action@v0.4.0 id: slither diff --git a/.github/workflows/tag-service.yml b/.github/workflows/tag-service.yml index c825c264242b..439b48f13d4e 100644 --- a/.github/workflows/tag-service.yml +++ b/.github/workflows/tag-service.yml @@ -20,9 +20,6 @@ on: options: - ci-builder - ci-builder-rust - - indexer - - op-heartbeat - - chain-mon - op-node - op-batcher - op-proposer @@ -31,8 +28,6 @@ on: - op-dispute-mon - op-ufm - da-server - - proxyd - - ufm-metamask - op-contracts - op-conductor prerelease: @@ -41,6 +36,9 @@ on: type: boolean default: false +permissions: + contents: write + jobs: release: runs-on: ubuntu-latest diff --git a/.gitignore b/.gitignore index 54c16a1f67c3..9751cc608985 100644 --- a/.gitignore +++ b/.gitignore @@ -2,9 +2,7 @@ node_modules results temp -.nyc_output coverage.json -*.tsbuildinfo **/lcov.info yarn-error.log @@ -17,6 +15,9 @@ dist artifacts cache +!op-chain-ops/foundry/testdata/srcmaps/cache +!op-chain-ops/foundry/testdata/srcmaps/artifacts + packages/contracts-bedrock/deployments/devnetL1 packages/contracts-bedrock/deployments/anvil @@ -40,8 +41,6 @@ packages/contracts-bedrock/deployments/anvil coverage.out -# Ignore bedrock go bindings local output files -op-bindings/bin __pycache__ diff --git a/.gitmodules b/.gitmodules index 0f325f432c65..21ecaedbb77a 100644 --- a/.gitmodules +++ b/.gitmodules @@ -23,3 +23,9 @@ [submodule "packages/contracts-bedrock/lib/lib-keccak"] path = packages/contracts-bedrock/lib/lib-keccak url = https://github.com/ethereum-optimism/lib-keccak +[submodule "packages/contracts-bedrock/lib/automate"] + path = packages/contracts-bedrock/lib/automate + url = https://github.com/gelatodigital/automate +[submodule "packages/contracts-bedrock/lib/openzeppelin-contracts-v5"] + path = packages/contracts-bedrock/lib/openzeppelin-contracts-v5 + url = https://github.com/OpenZeppelin/openzeppelin-contracts diff --git a/.husky/.gitignore b/.husky/.gitignore deleted file mode 100644 index 31354ec13899..000000000000 --- a/.husky/.gitignore +++ /dev/null @@ -1 +0,0 @@ -_ diff --git a/.husky/pre-commit b/.husky/pre-commit deleted file mode 100755 index 91d78423de59..000000000000 --- a/.husky/pre-commit +++ /dev/null @@ -1,5 +0,0 @@ -#!/bin/sh -. "$(dirname "$0")/_/husky.sh" - -pnpm nx affected --target=pre-commit - diff --git a/.npmrc b/.npmrc deleted file mode 100644 index 077cefb4ec89..000000000000 --- a/.npmrc +++ /dev/null @@ -1,5 +0,0 @@ -# run prefoo scripts -# npm and yarn support this as a default pnpm defaults to false -enable-pre-post-scripts=true -lockfile=true -prefer-workspace-packages=true diff --git a/.nvmrc b/.nvmrc deleted file mode 100644 index 805b5a4e00bf..000000000000 --- a/.nvmrc +++ /dev/null @@ -1 +0,0 @@ -v20.9.0 diff --git a/.pnpmfile.cjs b/.pnpmfile.cjs deleted file mode 100644 index 83edbff8130a..000000000000 --- a/.pnpmfile.cjs +++ /dev/null @@ -1,20 +0,0 @@ -// This function does not modify the lockfile. It asserts that packages do not use SSH -// when specifying git repository -function afterAllResolved(lockfile, context) { - const pkgs = lockfile['packages']; - for (const [pkg, entry] of Object.entries(pkgs)) { - const repo = entry.resolution['repo']; - if (repo !== undefined) { - if (repo.startsWith('git@github.com')) { - throw new Error(`Invalid git ssh specification found for package ${pkg}. Ensure sure that the dependencies do not reference SSH-based git repos before running installing them`); - } - } - } - return lockfile -} - -module.exports = { - hooks: { - afterAllResolved - } -} diff --git a/.prettierrc.js b/.prettierrc.js deleted file mode 100644 index 7b70850614ea..000000000000 --- a/.prettierrc.js +++ /dev/null @@ -1,10 +0,0 @@ -module.exports = { - $schema: 'http://json.schemastore.org/prettierrc', - plugins: [], - trailingComma: 'es5', - tabWidth: 2, - semi: false, - singleQuote: true, - arrowParens: 'always', - overrides: [], -} diff --git a/.semgrepignore b/.semgrepignore index ae209efea25d..3ee97221f406 100644 --- a/.semgrepignore +++ b/.semgrepignore @@ -18,7 +18,10 @@ tests/ # Semgrep-action log folder .semgrep_logs/ -op-bindings/bindings/ +op-chain-ops/script/testdata packages/*/node_modules packages/*/test + +# Autogenerated solidity library +packages/contracts-bedrock/scripts/libraries/Solarray.sol diff --git a/.vscode/extensions.json b/.vscode/extensions.json index ed133427d4b1..0e0528fd33e2 100644 --- a/.vscode/extensions.json +++ b/.vscode/extensions.json @@ -1,12 +1,7 @@ { - // See https://go.microsoft.com/fwlink/?LinkId=827846 to learn about workspace recommendations. - // Extension identifier format: ${publisher}.${name}. Example: vscode.csharp - - // List of extensions which should be recommended for users of this workspace. "recommendations": [ - "dbaeumer.vscode-eslint", "editorconfig.editorconfig", - "juanblanco.solidity", - "golang.go", - ], -} \ No newline at end of file + "nomicfoundation.hardhat-solidity", + "golang.go" + ] +} diff --git a/.vscode/settings.json b/.vscode/settings.json index 8768228725a2..d8a05abe18af 100644 --- a/.vscode/settings.json +++ b/.vscode/settings.json @@ -1,16 +1,4 @@ { - "[typescript]": { - "editor.defaultFormatter": "dbaeumer.vscode-eslint", - "editor.formatOnSave": true - }, - "eslint.workingDirectories": [ - { - "directory": "packages/chain-mon", - "changeProcessCWD": true - } - ], - "eslint.nodePath": "./node_modules/eslint/bin/", - "eslint.format.enable": true, "editorconfig.generateAuto": false, "files.trimTrailingWhitespace": true } diff --git a/CONTRIBUTING.md b/CONTRIBUTING.md index f27642d2d472..c96ecf7bf165 100644 --- a/CONTRIBUTING.md +++ b/CONTRIBUTING.md @@ -1,66 +1,66 @@ -# Optimism monorepo contributing guide +# Optimism Monorepo Contributing Guide -🎈 Thanks for your help improving the project! We are so happy to have you! +## What to Contribute -**No contribution is too small and all contributions are valued.** +Welcome to the Optimism Monorepo Contributing Guide! +If you're reading this then you might be interested in contributing to the Optimism Monorepo. +Before diving into the specifics of this repository, you might be interested in taking a quick look at just a few of the ways that you can contribute. +You can: -There are plenty of ways to contribute, in particular we appreciate support in the following areas: +- Report issues in this repository. Great bug reports are detailed and give clear instructions for how a developer can reproduce the problem. Write good bug reports and developers will love you. + - **IMPORTANT**: If you believe your report impacts the security of this repository, refer to the canonical [Security Policy](https://github.com/ethereum-optimism/.github/blob/master/SECURITY.md) document. +- Fix issues that are tagged as [`D-good-first-issue`](https://github.com/ethereum-optimism/optimism/labels/D-good-first-issue) or [`S-confirmed`](https://github.com/ethereum-optimism/optimism/labels/S-confirmed). +- Help improve the [Optimism Developer Docs](https://github.com/ethereum-optimism/docs) by reporting issues, fixing typos, or adding missing sections. +- Get involved in the protocol design process by joining discussions within the [OP Stack Specs](https://github.com/ethereum-optimism/specs/discussions) repository. -- Reporting issues. For security issues see [Security policy](https://github.com/ethereum-optimism/.github/blob/master/SECURITY.md). -- Fixing and responding to existing issues. You can start off with those tagged ["good first issue"](https://github.com/ethereum-optimism/optimism/labels/D-good-first-issue) which are meant as introductory issues for external contributors. -- Improving the [community site](https://community.optimism.io/), [documentation](https://github.com/ethereum-optimism/community-hub) and [tutorials](https://github.com/ethereum-optimism/optimism-tutorial). -- Become an "Optimizer" and answer questions in the [Optimism Discord](https://discord.optimism.io). -- Get involved in the protocol design process by proposing changes or new features or write parts of the spec yourself in the [specs subdirectory](./specs/). +## Code of Conduct -Note that we have a [Code of Conduct](https://github.com/ethereum-optimism/.github/blob/master/CODE_OF_CONDUCT.md), please follow it in all your interactions with the project. +Interactions within this repository are subject to a [Code of Conduct](https://github.com/ethereum-optimism/.github/blob/master/CODE_OF_CONDUCT.md) adapted from the [Contributor Covenant](https://www.contributor-covenant.org/version/1/4/code-of-conduct/). -## Workflow for Pull Requests - -🚨 Before making any non-trivial change, please first open an issue describing the change to solicit feedback and guidance. This will increase the likelihood of the PR getting merged. - -In general, the smaller the diff the easier it will be for us to review quickly. - -In order to contribute, fork the appropriate branch, for non-breaking changes to production that is `develop` and for the next release that is normally `release/X.X.X` branch, see [details about our branching model](https://github.com/ethereum-optimism/optimism/blob/develop/README.md#branching-model-and-releases). - -Additionally, if you are writing a new feature, please ensure you add appropriate test cases. - -Follow the [Development Quick Start](#development-quick-start) to set up your local development environment. +## Development Quick Start -We recommend using the [Conventional Commits](https://www.conventionalcommits.org/en/v1.0.0/) format on commit messages. +### Software Dependencies -Unless your PR is ready for immediate review and merging, please mark it as 'draft' (or simply do not open a PR yet). +| Dependency | Version | Version Check Command | +| ------------------------------------------------------------- | -------- | ------------------------ | +| [git](https://git-scm.com/) | `^2` | `git --version` | +| [go](https://go.dev/) | `^1.21` | `go version` | +| [node](https://nodejs.org/en/) | `^20` | `node --version` | +| [nvm](https://github.com/nvm-sh/nvm) | `^0.39` | `nvm --version` | +| [just](https://github.com/casey/just) | `^1.34.0`| `just --version` | +| [foundry](https://github.com/foundry-rs/foundry#installation) | `^0.2.0` | `forge --version` | +| [make](https://linux.die.net/man/1/make) | `^3` | `make --version` | +| [jq](https://github.com/jqlang/jq) | `^1.6` | `jq --version` | +| [direnv](https://direnv.net) | `^2` | `direnv --version` | +| [docker](https://docs.docker.com/get-docker/) | `^24` | `docker --version` | +| [docker compose](https://docs.docker.com/compose/install/) | `^2.23` | `docker compose version` | -Once ready for review, make sure to include a thorough PR description to help reviewers. You can read more about the guidelines for opening PRs in the [PR Guidelines](docs/handbook/pr-guidelines.md) file. +### Notes on Specific Dependencies -**Bonus:** Add comments to the diff under the "Files Changed" tab on the PR page to clarify any sections where you think we might have questions about the approach taken. +#### `node` -### Response time: -We aim to provide a meaningful response to all PRs and issues from external contributors within 2 business days. +Make sure to use the version of `node` specified within [`.nvmrc`](./.nvmrc). +You can use [`nvm`](https://github.com/nvm-sh/nvm) to manage multiple versions of Node.js on your machine and automatically switch to the correct version when you enter this repository. -### Rebasing +#### `foundry` -We use the `git rebase` command to keep our commit history tidy. -Rebasing is an easy way to make sure that each PR includes a series of clean commits with descriptive commit messages -See [this tutorial](https://docs.gitlab.com/ee/topics/git/git_rebase.html) for a detailed explanation of `git rebase` and how you should use it to maintain a clean commit history. +`foundry` is updated frequently and occasionally contains breaking changes. +This repository pins a specific version of `foundry` inside of [`versions.json`](./versions.json). +Use the command `just update-foundry` at the root of the monorepo to make sure that your version of `foundry` is the same as the one currently being used in CI. -## Development Quick Start +#### `direnv` -### Dependencies +[`direnv`](https://direnv.net) is a tool used to load environment variables from [`.envrc`](./.envrc) into your shell so you don't have to manually export variables every time you want to use them. +`direnv` only has access to files that you explicitly allow it to see. +After [installing `direnv`](https://direnv.net/docs/installation.html), you will need to **make sure that [`direnv` is hooked into your shell](https://direnv.net/docs/hook.html)**. +Make sure you've followed [the guide on the `direnv` website](https://direnv.net/docs/hook.html), then **close your terminal and reopen it** so that the changes take effect (or `source` your config file if you know how to do that). -You'll need the following: +#### `docker compose` -* [Git](https://git-scm.com/downloads) -* [NodeJS](https://nodejs.org/en/download/) -* [Node Version Manager](https://github.com/nvm-sh/nvm) -* [pnpm](https://pnpm.io/installation) -* [Docker](https://docs.docker.com/get-docker/) -* [Docker Compose](https://docs.docker.com/compose/install/) -* [Go](https://go.dev/dl/) -* [Foundry](https://getfoundry.sh) -* [jq](https://jqlang.github.io/jq/) -* [go-ethereum](https://github.com/ethereum/go-ethereum) +[Docker Desktop](https://docs.docker.com/get-docker/) should come with `docker compose` installed by default. +You'll have to install the `compose` plugin if you're not using Docker Desktop or you're on linux. -### Setup +### Setting Up Clone the repository and open it: @@ -69,111 +69,43 @@ git clone git@github.com:ethereum-optimism/optimism.git cd optimism ``` -### Install the Correct Version of NodeJS - -Install the correct node version with [nvm](https://github.com/nvm-sh/nvm) - -```bash -nvm use -``` - -### Install node modules with pnpm - -```bash -pnpm i -``` - -### Building the TypeScript packages - -[foundry](https://github.com/foundry-rs/foundry) is used for some smart contract -development in the monorepo. It is required to build the TypeScript packages -and compile the smart contracts. Install foundry [here](https://getfoundry.sh/). - -To build all of the [TypeScript packages](./packages), run: - -```bash -pnpm clean -pnpm install -pnpm build -``` - -Packages compiled when on one branch may not be compatible with packages on a different branch. -**You should recompile all packages whenever you move from one branch to another.** -Use the above commands to recompile the packages. - -### Building the rest of the system - -If you want to run an Optimism node OR **if you want to run the integration tests**, you'll need to build the rest of the system. -Note that these environment variables significantly speed up build time. - -```bash -cd ops-bedrock -export COMPOSE_DOCKER_CLI_BUILD=1 -export DOCKER_BUILDKIT=1 -docker compose build -``` - -Source code changes can have an impact on more than one container. -**If you're unsure about which containers to rebuild, just rebuild them all**: - -```bash -cd ops-bedrock -docker compose down -docker compose build -docker compose up -``` +### Building the Monorepo -**If a node process exits with exit code: 137** you may need to increase the default memory limit of docker containers +Make sure that you've installed all of the required [Software Dependencies](#software-dependencies) before you continue. +You will need [foundry](https://github.com/foundry-rs/foundry) to build the smart contracts found within this repository. +Refer to the note on [foundry as a dependency](#foundry) for instructions. -Finally, **if you're running into weird problems and nothing seems to be working**, run: +Install dependencies and build all packages within the monorepo by running: ```bash -cd optimism -pnpm clean -pnpm install -pnpm build -cd ops -docker compose down -v -docker compose build -docker compose up +make build ``` -#### Viewing docker container logs - -By default, the `docker compose up` command will show logs from all services, and that -can be hard to filter through. In order to view the logs from a specific service, you can run: - -```bash -docker compose logs --follow -``` +Packages built on one branch may not be compatible with packages on a different branch. +**You should rebuild the monorepo whenever you move from one branch to another.** +Use the above command to rebuild the monorepo. ### Running tests Before running tests: **follow the above instructions to get everything built.** -#### Running unit tests (typescript) - -Run unit tests for all packages in parallel via: - -```bash -pnpm test -``` - -To run unit tests for a specific package: +#### Running unit tests (solidity) ```bash -cd packages/package-to-test -pnpm test +cd packages/contracts-bedrock +just test ``` #### Running unit tests (Go) -Change directory to the package you want to run tests for. Then: +Change directory to the package you want to run tests for, then: + ```shell go test ./... ``` #### Running e2e tests (Go) + See [this document](./op-e2e/README.md) #### Running contract static analysis @@ -185,7 +117,7 @@ To run `slither` locally, do: ```bash cd packages/contracts-bedrock pip3 install slither-analyzer -pnpm slither +just slither ``` ## Labels @@ -209,7 +141,7 @@ This makes them a great tool for contributors! [difficulty]: https://github.com/ethereum-optimism/optimism/labels?q=d- [status]: https://github.com/ethereum-optimism/optimism/labels?q=s- -#### Filtering for Work +### Filtering for Work To find tickets available for external contribution, take a look at the https://github.com/ethereum-optimism/optimism/labels/M-community label. @@ -220,11 +152,41 @@ Also, all labels can be seen by visiting the [labels page][labels] [labels]: https://github.com/ethereum-optimism/optimism/labels -#### Modifying Labels +### Modifying Labels When altering label names or deleting labels there are a few things you must be aware of. - This may affect the mergify bot's use of labels. See the [mergify config](.github/mergify.yml). -- If the https://github.com/ethereum-optimism/labels/S-stale label is altered, the [close-stale](.github/workflows/close-stale.yml) workflow should be updated. -- If the https://github.com/ethereum-optimism/labels/M-dependabot label is altered, the [dependabot config](.github/dependabot.yml) file should be adjusted. +- If the https://github.com/ethereum-optimism/optimism/labels/S-stale label is altered, the [close-stale](.github/workflows/close-stale.yml) workflow should be updated. +- If the https://github.com/ethereum-optimism/optimism/labels/M-dependabot label is altered, the [dependabot config](.github/dependabot.yml) file should be adjusted. - Saved label filters for project boards will not automatically update. These should be updated if label names change. + +## Workflow for Pull Requests + +🚨 Before making any non-trivial change, please first open an issue describing the change to solicit feedback and guidance. This will increase the likelihood of the PR getting merged. + +In general, the smaller the diff the easier it will be for us to review quickly. + +In order to contribute, fork the appropriate branch, for non-breaking changes to production that is `develop` and for the next release that is normally `release/X.X.X` branch, see [details about our branching model](https://github.com/ethereum-optimism/optimism/blob/develop/README.md#branching-model-and-releases). + +Additionally, if you are writing a new feature, please ensure you add appropriate test cases. + +Follow the [Development Quick Start](#development-quick-start) to set up your local development environment. + +We recommend using the [Conventional Commits](https://www.conventionalcommits.org/en/v1.0.0/) format on commit messages. + +Unless your PR is ready for immediate review and merging, please mark it as 'draft' (or simply do not open a PR yet). + +Once ready for review, make sure to include a thorough PR description to help reviewers. You can read more about the guidelines for opening PRs in the [PR Guidelines](docs/handbook/pr-guidelines.md) file. + +**Bonus:** Add comments to the diff under the "Files Changed" tab on the PR page to clarify any sections where you think we might have questions about the approach taken. + +### Response time + +We aim to provide a meaningful response to all PRs and issues from external contributors within 2 business days. + +### Rebasing + +We use the `git rebase` command to keep our commit history tidy. +Rebasing is an easy way to make sure that each PR includes a series of clean commits with descriptive commit messages +See [this tutorial](https://docs.gitlab.com/ee/topics/git/git_rebase.html) for a detailed explanation of `git rebase` and how you should use it to maintain a clean commit history. diff --git a/Makefile b/Makefile index 2c85b1c12f31..6b1abdd37f00 100644 --- a/Makefile +++ b/Makefile @@ -6,30 +6,32 @@ OP_STACK_GO_BUILDER?=us-docker.pkg.dev/oplabs-tools-artifacts/images/op-stack-go # Requires at least Python v3.9; specify a minor version below if needed PYTHON?=python3 -build: build-go build-ts +help: ## Prints this help message + @grep -E '^[a-zA-Z0-9_-]+:.*?## .*$$' $(MAKEFILE_LIST) | awk 'BEGIN {FS = ":.*?## "}; {printf "\033[36m%-30s\033[0m %s\n", $$1, $$2}' + +build: build-go build-contracts ## Builds Go components and contracts-bedrock .PHONY: build -build-go: submodules op-node op-proposer op-batcher +build-go: submodules op-node op-proposer op-batcher ## Builds op-node, op-proposer and op-batcher .PHONY: build-go -lint-go: +build-contracts: + (cd packages/contracts-bedrock && just build) +.PHONY: build-contracts + +lint-go: ## Lints Go code with specific linters golangci-lint run -E goimports,sqlclosecheck,bodyclose,asciicheck,misspell,errorlint --timeout 5m -e "errors.As" -e "errors.Is" ./... .PHONY: lint-go -build-ts: submodules - if [ -f "$$NVM_DIR/nvm.sh" ]; then \ - . $$NVM_DIR/nvm.sh && nvm use; \ - fi - pnpm install:ci - pnpm prepare - pnpm build -.PHONY: build-ts +lint-go-fix: ## Lints Go code with specific linters and fixes reported issues + golangci-lint run -E goimports,sqlclosecheck,bodyclose,asciicheck,misspell,errorlint --timeout 5m -e "errors.As" -e "errors.Is" ./... --fix +.PHONY: lint-go-fix -ci-builder: +ci-builder: ## Builds the CI builder Docker image docker build -t ci-builder -f ops/docker/ci-builder/Dockerfile . .PHONY: ci-builder -golang-docker: +golang-docker: ## Builds Docker images for Go components using buildx # 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') \ @@ -38,20 +40,20 @@ golang-docker: --progress plain \ --load \ -f docker-bake.hcl \ - op-node op-batcher op-proposer op-challenger op-dispute-mon + op-node op-batcher op-proposer op-challenger op-dispute-mon op-supervisor .PHONY: golang-docker -docker-builder-clean: +docker-builder-clean: ## Removes the Docker buildx builder docker buildx rm buildx-build .PHONY: docker-builder-clean -docker-builder: +docker-builder: ## Creates a Docker buildx builder docker buildx create \ --driver=docker-container --name=buildx-build --bootstrap --use .PHONY: docker-builder # add --print to dry-run -cross-op-node: +cross-op-node: ## Builds cross-platform Docker image for 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') \ @@ -77,19 +79,7 @@ cross-op-node: 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: +contracts-bedrock-docker: ## Builds Docker image for Bedrock contracts IMAGE_TAGS=$$(git rev-parse HEAD),latest \ docker buildx bake \ --progress plain \ @@ -98,102 +88,113 @@ contracts-bedrock-docker: contracts-bedrock .PHONY: contracts-bedrock-docker -submodules: +submodules: ## Updates git submodules git submodule update --init --recursive .PHONY: submodules -op-bindings: - make -C ./op-bindings -.PHONY: op-bindings -op-node: +op-node: ## Builds op-node binary make -C ./op-node op-node .PHONY: op-node -generate-mocks-op-node: +generate-mocks-op-node: ## Generates mocks for op-node make -C ./op-node generate-mocks .PHONY: generate-mocks-op-node -generate-mocks-op-service: +generate-mocks-op-service: ## Generates mocks for op-service make -C ./op-service generate-mocks .PHONY: generate-mocks-op-service -op-batcher: +op-batcher: ## Builds op-batcher binary make -C ./op-batcher op-batcher .PHONY: op-batcher -op-proposer: +op-proposer: ## Builds op-proposer binary make -C ./op-proposer op-proposer .PHONY: op-proposer -op-challenger: +op-challenger: ## Builds op-challenger binary make -C ./op-challenger op-challenger .PHONY: op-challenger -op-dispute-mon: +op-dispute-mon: ## Builds op-dispute-mon binary make -C ./op-dispute-mon op-dispute-mon .PHONY: op-dispute-mon -op-program: +op-program: ## Builds op-program binary make -C ./op-program op-program .PHONY: op-program -cannon: +cannon: ## Builds cannon binary make -C ./cannon cannon .PHONY: cannon -reproducible-prestate: +reproducible-prestate: ## Builds reproducible-prestate binary make -C ./op-program reproducible-prestate .PHONY: reproducible-prestate -cannon-prestate: op-program cannon +# Include any files required for the devnet to build and run. +DEVNET_CANNON_PRESTATE_FILES := op-program/bin/prestate-proof.json op-program/bin/prestate.json op-program/bin/prestate-proof-mt.json op-program/bin/prestate-mt.bin.gz + + +$(DEVNET_CANNON_PRESTATE_FILES): + make cannon-prestate + make cannon-prestate-mt + +cannon-prestate: op-program cannon ## Generates prestate using cannon and op-program ./cannon/bin/cannon load-elf --path op-program/bin/op-program-client.elf --out op-program/bin/prestate.json --meta op-program/bin/meta.json - ./cannon/bin/cannon run --proof-at '=0' --stop-at '=1' --input op-program/bin/prestate.json --meta op-program/bin/meta.json --proof-fmt 'op-program/bin/%d.json' --output "" + ./cannon/bin/cannon run --proof-at '=0' --stop-at '=1' --input op-program/bin/prestate.json --meta op-program/bin/meta.json --proof-fmt 'op-program/bin/%d.json' --output "" mv op-program/bin/0.json op-program/bin/prestate-proof.json .PHONY: cannon-prestate -mod-tidy: +cannon-prestate-mt: op-program cannon ## Generates prestate using cannon and op-program in the multithreaded cannon format + ./cannon/bin/cannon load-elf --type cannon-mt --path op-program/bin/op-program-client.elf --out op-program/bin/prestate-mt.bin.gz --meta op-program/bin/meta-mt.json + ./cannon/bin/cannon run --proof-at '=0' --stop-at '=1' --input op-program/bin/prestate-mt.bin.gz --meta op-program/bin/meta-mt.json --proof-fmt 'op-program/bin/%d-mt.json' --output "" + mv op-program/bin/0-mt.json op-program/bin/prestate-proof-mt.json +.PHONY: cannon-prestate-mt + +mod-tidy: ## Cleans up unused dependencies in Go modules # Below GOPRIVATE line allows mod-tidy to be run immediately after # releasing new versions. This bypasses the Go modules proxy, which # can take a while to index new versions. # # See https://proxy.golang.org/ for more info. export GOPRIVATE="github.com/ethereum-optimism" && go mod tidy - make -C ./op-ufm mod-tidy .PHONY: mod-tidy -clean: +clean: ## Removes all generated files under bin/ rm -rf ./bin .PHONY: clean -nuke: clean devnet-clean +nuke: clean devnet-clean ## Completely clean the project directory git clean -Xdf .PHONY: nuke -pre-devnet: submodules +## Prepares for running a local devnet +pre-devnet: submodules $(DEVNET_CANNON_PRESTATE_FILES) @if ! [ -x "$(command -v geth)" ]; then \ make install-geth; \ fi - @if [ ! -e op-program/bin ]; then \ - make cannon-prestate; \ + @if ! [ -x "$(command -v eth2-testnet-genesis)" ]; then \ + make install-eth2-testnet-genesis; \ fi .PHONY: pre-devnet -devnet-up: pre-devnet +devnet-up: pre-devnet ## Starts the local devnet ./ops/scripts/newer-file.sh .devnet/allocs-l1.json ./packages/contracts-bedrock \ || make devnet-allocs PYTHONPATH=./bedrock-devnet $(PYTHON) ./bedrock-devnet/main.py --monorepo-dir=. .PHONY: devnet-up -devnet-test: pre-devnet - PYTHONPATH=./bedrock-devnet $(PYTHON) ./bedrock-devnet/main.py --monorepo-dir=. --test +devnet-test: pre-devnet ## Runs tests on the local devnet + make -C op-e2e test-devnet .PHONY: devnet-test -devnet-down: +devnet-down: ## Stops the local devnet @(cd ./ops-bedrock && GENESIS_TIMESTAMP=$(shell date +%s) docker compose stop) .PHONY: devnet-down -devnet-clean: +devnet-clean: ## Cleans up local devnet environment rm -rf ./packages/contracts-bedrock/deployments/devnetL1 rm -rf ./.devnet cd ./ops-bedrock && docker compose down @@ -201,51 +202,49 @@ devnet-clean: docker volume ls --filter name=ops-bedrock --format='{{.Name}}' | xargs -r docker volume rm .PHONY: devnet-clean -devnet-allocs: pre-devnet +devnet-allocs: pre-devnet ## Generates allocations for the local devnet PYTHONPATH=./bedrock-devnet $(PYTHON) ./bedrock-devnet/main.py --monorepo-dir=. --allocs .PHONY: devnet-allocs -devnet-logs: +devnet-logs: ## Displays logs for the local devnet @(cd ./ops-bedrock && docker compose logs -f) .PHONY: devnet-logs -test-unit: +test-unit: ## Runs unit tests for all components make -C ./op-node test make -C ./op-proposer test make -C ./op-batcher test make -C ./op-e2e test - pnpm test + (cd packages/contracts-bedrock && just test) .PHONY: test-unit # Remove the baseline-commit to generate a base reading & show all issues -semgrep: +semgrep: ## Runs Semgrep checks $(eval DEV_REF := $(shell git rev-parse develop)) SEMGREP_REPO_NAME=ethereum-optimism/optimism semgrep ci --baseline-commit=$(DEV_REF) .PHONY: semgrep -clean-node-modules: +clean-node-modules: ## Cleans up node_modules directories rm -rf node_modules rm -rf packages/**/node_modules .PHONY: clean-node-modules -tag-bedrock-go-modules: +tag-bedrock-go-modules: ## Tags Go modules for Bedrock ./ops/scripts/tag-bedrock-go-modules.sh $(BEDROCK_TAGS_REMOTE) $(VERSION) .PHONY: tag-bedrock-go-modules -update-op-geth: +update-op-geth: ## Updates the Geth version used in the project ./ops/scripts/update-op-geth.py .PHONY: update-op-geth -bedrock-markdown-links: - docker run --init -it -v `pwd`:/input lycheeverse/lychee --verbose --no-progress --exclude-loopback \ - --exclude twitter.com --exclude explorer.optimism.io --exclude linux-mips.org --exclude vitalik.ca \ - --exclude-mail /input/README.md "/input/specs/**/*.md" -.PHONY: bedrock-markdown-links - -install-geth: +install-geth: ## Installs or updates Geth if versions do not match ./ops/scripts/geth-version-checker.sh && \ (echo "Geth versions match, not installing geth..."; true) || \ (echo "Versions do not match, installing geth!"; \ go install -v github.com/ethereum/go-ethereum/cmd/geth@$(shell jq -r .geth < versions.json); \ echo "Installed geth!"; true) .PHONY: install-geth + +install-eth2-testnet-genesis: + go install -v github.com/protolambda/eth2-testnet-genesis@$(shell jq -r .eth2_testnet_genesis < versions.json) +.PHONY: install-eth2-testnet-genesis diff --git a/README.md b/README.md index 491599fbbe76..d33f920c8398 100644 --- a/README.md +++ b/README.md @@ -28,18 +28,18 @@ ## What is Optimism? -[Optimism](https://www.optimism.io/) is a project dedicated to scaling Ethereum's technology and expanding its ability to coordinate people from across the world to build effective decentralized economies and governance systems. The [Optimism Collective](https://app.optimism.io/announcement) builds open-source software for running L2 blockchains and aims to address key governance and economic challenges in the wider cryptocurrency ecosystem. Optimism operates on the principle of **impact=profit**, the idea that individuals who positively impact the Collective should be proportionally rewarded with profit. **Change the incentives and you change the world.** +[Optimism](https://www.optimism.io/) is a project dedicated to scaling Ethereum's technology and expanding its ability to coordinate people from across the world to build effective decentralized economies and governance systems. The [Optimism Collective](https://www.optimism.io/vision) builds open-source software that powers scalable blockchains and aims to address key governance and economic challenges in the wider Ethereum ecosystem. Optimism operates on the principle of **impact=profit**, the idea that individuals who positively impact the Collective should be proportionally rewarded with profit. **Change the incentives and you change the world.** -In this repository, you'll find numerous core components of the OP Stack, the decentralized software stack maintained by the Optimism Collective that powers Optimism and forms the backbone of blockchains like [OP Mainnet](https://explorer.optimism.io/) and [Base](https://base.org). Designed to be "aggressively open source," the OP Stack encourages you to explore, modify, extend, and test the code as needed. Although not all elements of the OP Stack are contained here, many of its essential components can be found within this repository. By collaborating on free, open software and shared standards, the Optimism Collective aims to prevent siloed software development and rapidly accelerate the development of the Ethereum ecosystem. Come contribute, build the future, and redefine power, together. +In this repository you'll find numerous core components of the OP Stack, the decentralized software stack maintained by the Optimism Collective that powers Optimism and forms the backbone of blockchains like [OP Mainnet](https://explorer.optimism.io/) and [Base](https://base.org). The OP Stack is designed to be aggressively open-source — you are welcome to explore, modify, and extend this code. ## Documentation - If you want to build on top of OP Mainnet, refer to the [Optimism Documentation](https://docs.optimism.io) -- If you want to build your own OP Stack based blockchain, refer to the [OP Stack Guide](https://docs.optimism.io/stack/getting-started), and make sure to understand this repository's [Development and Release Process](#development-and-release-process) +- If you want to build your own OP Stack based blockchain, refer to the [OP Stack Guide](https://docs.optimism.io/stack/getting-started) and make sure to understand this repository's [Development and Release Process](#development-and-release-process) ## Specification -If you're interested in the technical details of how Optimism works, refer to the [Optimism Protocol Specification](https://github.com/ethereum-optimism/specs). +Detailed specifications for the OP Stack can be found within the [OP Stack Specs](https://github.com/ethereum-optimism/specs) repository. ## Community @@ -48,15 +48,16 @@ Governance discussion can also be found on the [Optimism Governance Forum](https ## Contributing -Read through [CONTRIBUTING.md](./CONTRIBUTING.md) for a general overview of the contributing process for this repository. -Use the [Developer Quick Start](./CONTRIBUTING.md#development-quick-start) to get your development environment set up to start working on the Optimism Monorepo. -Then check out the list of [Good First Issues](https://github.com/ethereum-optimism/optimism/issues?q=is:open+is:issue+label:D-good-first-issue) to find something fun to work on! -Typo fixes are welcome; however, please create a single commit with all of the typo fixes & batch as many fixes together in a PR as possible. Spammy PRs will be closed. +The OP Stack is a collaborative project. By collaborating on free, open software and shared standards, the Optimism Collective aims to prevent siloed software development and rapidly accelerate the development of the Ethereum ecosystem. Come contribute, build the future, and redefine power, together. + +[CONTRIBUTING.md](./CONTRIBUTING.md) contains a detailed explanation of the contributing process for this repository. Make sure to use the [Developer Quick Start](./CONTRIBUTING.md#development-quick-start) to properly set up your development environment. + +[Good First Issues](https://github.com/ethereum-optimism/optimism/issues?q=is:open+is:issue+label:D-good-first-issue) are a great place to look for tasks to tackle if you're not sure where to start. ## Security Policy and Vulnerability Reporting Please refer to the canonical [Security Policy](https://github.com/ethereum-optimism/.github/blob/master/SECURITY.md) document for detailed information about how to report vulnerabilities in this codebase. -Bounty hunters are encouraged to check out [the Optimism Immunefi bug bounty program](https://immunefi.com/bounty/optimism/). +Bounty hunters are encouraged to check out the [Optimism Immunefi bug bounty program](https://immunefi.com/bounty/optimism/). The Optimism Immunefi program offers up to $2,000,042 for in-scope critical vulnerabilities. ## Directory Structure @@ -64,12 +65,10 @@ 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
 ├── op-e2e: End-to-End testing of all bedrock components in Go
-├── op-heartbeat: Heartbeat monitor service
 ├── op-node: rollup consensus-layer client
 ├── op-preimage: Go bindings for Preimage Oracle
 ├── op-program: Fault proof program
@@ -80,19 +79,16 @@ The Optimism Immunefi program offers up to $2,000,042 for in-scope critical vuln
 ├── ops: Various operational packages
 ├── ops-bedrock: Bedrock devnet work
 ├── packages
-│   ├── chain-mon: Chain monitoring services
-│   ├── contracts-bedrock: Bedrock smart contracts
-│   ├── sdk: provides a set of tools for interacting with Optimism
+│   ├── contracts-bedrock: OP Stack smart contracts
 ├── 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
 
## Development and Release Process ### Overview -Please read this section if you're planning to fork this repository, or make frequent PRs into this repository. +Please read this section carefully if you're planning to fork or make frequent PRs into this repository. ### Production Releases @@ -101,34 +97,28 @@ For example, an `op-node` release might be versioned as `op-node/v1.1.2`, and s Release candidates are versioned in the format `op-node/v1.1.2-rc.1`. We always start with `rc.1` rather than `rc`. -For contract releases, refer to the GitHub release notes for a given release, which will list the specific contracts being released—not all contracts are considered production ready within a release, and many are under active development. +For contract releases, refer to the GitHub release notes for a given release which will list the specific contracts being released. Not all contracts are considered production ready within a release and many are under active development. Tags of the form `v`, such as `v1.1.4`, indicate releases of all Go code only, and **DO NOT** include smart contracts. This naming scheme is required by Golang. -In the above list, this means these `v' \ + --stop-at '=' \ + --snapshot-at '%1000000000' \ --input ./state.json \ -- \ ../op-program/bin/op-program \ - --network goerli \ - --l1.trustrpc \ - --l1.rpckind debug_geth \ - --l1 http://127.0.0.1:8645 \ - --l2 http://127.0.0.1:8745 \ - --l1.head 0x204f815790ca3bb43526ad60ebcc64784ec809bdc3550e82b54a0172f981efab \ - --l2.head 0xedc79de4d616a9100fdd42192224580daee81ea3d6303de8089d48a6c1bf4816 \ - --l2.claim 0x530658ab1b1b3ff4829731fc8d5955f0e6b8410db2cd65b572067ba58df1f2b9 \ - --l2.blocknumber 8813570 \ + --network op-mainnet \ + --l1 \ + --l2 \ + --l1.head \ + --l2.claim \ + --l2.head \ + --l2.blocknumber \ + --l2.outputroot --datadir /tmp/fpp-database \ --log.format terminal \ --server @@ -82,7 +83,7 @@ The smart-contracts are integrated into the Optimism monorepo contracts: Example programs that can be run and proven with Cannon. Optional dependency, but required for `mipsevm` Go tests. -See [`example/Makefile`](./example/Makefile) for building the example MIPS binaries. +See [`testdata/example/Makefile`](./testdata/example/Makefile) for building the example MIPS binaries. ## License diff --git a/cannon/cmd/load_elf.go b/cannon/cmd/load_elf.go index 7c41fc3c0ef6..a6b9e0e5897a 100644 --- a/cannon/cmd/load_elf.go +++ b/cannon/cmd/load_elf.go @@ -7,25 +7,31 @@ import ( "github.com/urfave/cli/v2" "github.com/ethereum-optimism/optimism/cannon/mipsevm" + "github.com/ethereum-optimism/optimism/cannon/mipsevm/multithreaded" + "github.com/ethereum-optimism/optimism/cannon/mipsevm/program" + "github.com/ethereum-optimism/optimism/cannon/mipsevm/singlethreaded" + "github.com/ethereum-optimism/optimism/cannon/mipsevm/versions" + "github.com/ethereum-optimism/optimism/cannon/serialize" + "github.com/ethereum-optimism/optimism/op-service/ioutil" "github.com/ethereum-optimism/optimism/op-service/jsonutil" ) var ( + LoadELFVMTypeFlag = &cli.StringFlag{ + Name: "type", + Usage: "VM type to create state for. Options are 'cannon' (default), 'cannon-mt'", + Value: "cannon", + Required: false, + } LoadELFPathFlag = &cli.PathFlag{ Name: "path", Usage: "Path to 32-bit big-endian MIPS ELF file", TakesFile: true, Required: true, } - LoadELFPatchFlag = &cli.StringSliceFlag{ - Name: "patch", - Usage: "Type of patching to do", - Value: cli.NewStringSlice("go", "stack"), - Required: false, - } LoadELFOutFlag = &cli.PathFlag{ Name: "out", - Usage: "Output path to write JSON state to. State is dumped to stdout if set to -. Not written if empty.", + Usage: "Output path to write state to. State is dumped to stdout if set to '-'. Not written if empty. Use file extension '.bin', '.bin.gz', or '.json' for binary, compressed binary, or JSON formats.", Value: "state.json", Required: false, } @@ -37,6 +43,23 @@ var ( } ) +type VMType string + +var ( + cannonVMType VMType = "cannon" + mtVMType VMType = "cannon-mt" +) + +func vmTypeFromString(ctx *cli.Context) (VMType, error) { + if vmTypeStr := ctx.String(LoadELFVMTypeFlag.Name); vmTypeStr == string(cannonVMType) { + return cannonVMType, nil + } else if vmTypeStr == string(mtVMType) { + return mtVMType, nil + } else { + return "", fmt.Errorf("unknown VM type %q", vmTypeStr) + } +} + func LoadELF(ctx *cli.Context) error { elfPath := ctx.Path(LoadELFPathFlag.Name) elfProgram, err := elf.Open(elfPath) @@ -46,41 +69,63 @@ func LoadELF(ctx *cli.Context) error { if elfProgram.Machine != elf.EM_MIPS { return fmt.Errorf("ELF is not big-endian MIPS R3000, but got %q", elfProgram.Machine.String()) } - state, err := mipsevm.LoadELF(elfProgram) + + var createInitialState func(f *elf.File) (mipsevm.FPVMState, error) + + var patcher = program.PatchStack + if vmType, err := vmTypeFromString(ctx); err != nil { + return err + } else if vmType == cannonVMType { + createInitialState = func(f *elf.File) (mipsevm.FPVMState, error) { + return program.LoadELF(f, singlethreaded.CreateInitialState) + } + patcher = func(state mipsevm.FPVMState) error { + err := program.PatchGoGC(elfProgram, state) + if err != nil { + return err + } + return program.PatchStack(state) + } + } else if vmType == mtVMType { + createInitialState = func(f *elf.File) (mipsevm.FPVMState, error) { + return program.LoadELF(f, multithreaded.CreateInitialState) + } + } else { + return fmt.Errorf("invalid VM type: %q", vmType) + } + + state, err := createInitialState(elfProgram) if err != nil { return fmt.Errorf("failed to load ELF data into VM state: %w", err) } - for _, typ := range ctx.StringSlice(LoadELFPatchFlag.Name) { - switch typ { - case "stack": - err = mipsevm.PatchStack(state) - case "go": - err = mipsevm.PatchGo(elfProgram, state) - default: - return fmt.Errorf("unrecognized form of patching: %q", typ) - } - if err != nil { - return fmt.Errorf("failed to apply patch %s: %w", typ, err) - } + err = patcher(state) + if err != nil { + return fmt.Errorf("failed to patch state: %w", err) } - meta, err := mipsevm.MakeMetadata(elfProgram) + meta, err := program.MakeMetadata(elfProgram) if err != nil { return fmt.Errorf("failed to compute program metadata: %w", err) } - if err := jsonutil.WriteJSON[*mipsevm.Metadata](ctx.Path(LoadELFMetaFlag.Name), meta, OutFilePerm); err != nil { + if err := jsonutil.WriteJSON[*program.Metadata](meta, ioutil.ToStdOutOrFileOrNoop(ctx.Path(LoadELFMetaFlag.Name), OutFilePerm)); err != nil { return fmt.Errorf("failed to output metadata: %w", err) } - return jsonutil.WriteJSON[*mipsevm.State](ctx.Path(LoadELFOutFlag.Name), state, OutFilePerm) + + // Ensure the state is written with appropriate version information + versionedState, err := versions.NewFromState(state) + if err != nil { + return fmt.Errorf("failed to create versioned state: %w", err) + } + return serialize.Write(ctx.Path(LoadELFOutFlag.Name), versionedState, OutFilePerm) } var LoadELFCommand = &cli.Command{ Name: "load-elf", - Usage: "Load ELF file into Cannon JSON state", - Description: "Load ELF file into Cannon JSON state, optionally patch out functions", + Usage: "Load ELF file into Cannon state", + Description: "Load ELF file into Cannon state", Action: LoadELF, Flags: []cli.Flag{ + LoadELFVMTypeFlag, LoadELFPathFlag, - LoadELFPatchFlag, LoadELFOutFlag, LoadELFMetaFlag, }, diff --git a/cannon/cmd/log.go b/cannon/cmd/log.go index 04e168b9ecfb..9270b2261709 100644 --- a/cannon/cmd/log.go +++ b/cannon/cmd/log.go @@ -2,12 +2,39 @@ package cmd import ( "io" + "log/slog" + "os" - "golang.org/x/exp/slog" + "golang.org/x/term" "github.com/ethereum/go-ethereum/log" ) func Logger(w io.Writer, lvl slog.Level) log.Logger { - return log.NewLogger(log.LogfmtHandlerWithLevel(w, lvl)) + if term.IsTerminal(int(os.Stdout.Fd())) { + return log.NewLogger(log.LogfmtHandlerWithLevel(w, lvl)) + } else { + return log.NewLogger(rawLogHandler(w, lvl)) + } +} + +// rawLogHandler returns a handler that strips out the time attribute +func rawLogHandler(wr io.Writer, lvl slog.Level) slog.Handler { + return slog.NewTextHandler(wr, &slog.HandlerOptions{ + ReplaceAttr: replaceAttr, + Level: &leveler{lvl}, + }) +} + +type leveler struct{ minLevel slog.Level } + +func (l *leveler) Level() slog.Level { + return l.minLevel +} + +func replaceAttr(_ []string, attr slog.Attr) slog.Attr { + if attr.Key == slog.TimeKey { + return slog.Attr{} + } + return attr } diff --git a/cannon/cmd/run.go b/cannon/cmd/run.go index dd77eea1ac68..03836d087d98 100644 --- a/cannon/cmd/run.go +++ b/cannon/cmd/run.go @@ -2,6 +2,7 @@ package cmd import ( "context" + "errors" "fmt" "os" "os/exec" @@ -10,14 +11,17 @@ import ( "strings" "time" + "github.com/ethereum-optimism/optimism/cannon/mipsevm/versions" + "github.com/ethereum-optimism/optimism/cannon/serialize" + "github.com/ethereum-optimism/optimism/op-service/ioutil" "github.com/ethereum/go-ethereum/common" "github.com/ethereum/go-ethereum/common/hexutil" "github.com/ethereum/go-ethereum/log" - "github.com/urfave/cli/v2" - "github.com/pkg/profile" + "github.com/urfave/cli/v2" "github.com/ethereum-optimism/optimism/cannon/mipsevm" + "github.com/ethereum-optimism/optimism/cannon/mipsevm/program" preimage "github.com/ethereum-optimism/optimism/op-preimage" "github.com/ethereum-optimism/optimism/op-service/jsonutil" ) @@ -99,6 +103,16 @@ var ( Name: "pprof.cpu", Usage: "enable pprof cpu profiling", } + RunDebugFlag = &cli.BoolFlag{ + Name: "debug", + Usage: "enable debug mode, which includes stack traces and other debug info in the output. Requires --meta.", + } + RunDebugInfoFlag = &cli.PathFlag{ + Name: "debug-info", + Usage: "path to write debug info to", + TakesFile: true, + Required: false, + } OutFilePerm = os.FileMode(0o755) ) @@ -139,7 +153,7 @@ type ProcessPreimageOracle struct { const clientPollTimeout = time.Second * 15 -func NewProcessPreimageOracle(name string, args []string) (*ProcessPreimageOracle, error) { +func NewProcessPreimageOracle(name string, args []string, stdout log.Logger, stderr log.Logger) (*ProcessPreimageOracle, error) { if name == "" { return &ProcessPreimageOracle{}, nil } @@ -154,8 +168,8 @@ func NewProcessPreimageOracle(name string, args []string) (*ProcessPreimageOracl } cmd := exec.Command(name, args...) // nosemgrep - cmd.Stdout = os.Stdout - cmd.Stderr = os.Stderr + cmd.Stdout = &mipsevm.LoggingWriter{Log: stdout} + cmd.Stderr = &mipsevm.LoggingWriter{Log: stderr} cmd.ExtraFiles = []*os.File{ hOracleRW.Reader(), hOracleRW.Writer(), @@ -205,16 +219,37 @@ func (p *ProcessPreimageOracle) Close() error { if p.cmd == nil { return nil } + + tryWait := func(dur time.Duration) (bool, error) { + ctx, cancel := context.WithTimeout(context.Background(), dur) + defer cancel() + select { + case <-ctx.Done(): + return false, nil + case err := <-p.waitErr: + return true, err + } + } // Give the pre-image server time to exit cleanly before killing it. - time.Sleep(time.Second * 1) + if exited, err := tryWait(1 * time.Second); exited { + return err + } + // Politely ask the process to exit and give it some more time _ = p.cmd.Process.Signal(os.Interrupt) + if exited, err := tryWait(30 * time.Second); exited { + return err + } + + // Force the process to exit + _ = p.cmd.Process.Signal(os.Kill) return <-p.waitErr } func (p *ProcessPreimageOracle) wait() { err := p.cmd.Wait() var waitErr error - if err, ok := err.(*exec.ExitError); !ok || !err.Success() { + var exitErr *exec.ExitError + if errors.As(err, &exitErr) && !exitErr.Success() { waitErr = err } p.cancelIO(fmt.Errorf("%w: pre-image server has exited", waitErr)) @@ -245,14 +280,11 @@ func Run(ctx *cli.Context) error { defer profile.Start(profile.NoShutdownHook, profile.ProfilePath("."), profile.CPUProfile).Stop() } - state, err := jsonutil.LoadJSON[mipsevm.State](ctx.Path(RunInputFlag.Name)) - if err != nil { - return err - } + guestLogger := Logger(os.Stderr, log.LevelInfo) + outLog := &mipsevm.LoggingWriter{Log: guestLogger.With("module", "guest", "stream", "stdout")} + errLog := &mipsevm.LoggingWriter{Log: guestLogger.With("module", "guest", "stream", "stderr")} - l := Logger(os.Stderr, log.LevelInfo) - outLog := &mipsevm.LoggingWriter{Name: "program std-out", Log: l} - errLog := &mipsevm.LoggingWriter{Name: "program std-err", Log: l} + l := Logger(os.Stderr, log.LevelInfo).With("module", "vm") stopAtAnyPreimage := false var stopAtPreimageKeyPrefix []byte @@ -305,7 +337,9 @@ func Run(ctx *cli.Context) error { args = []string{""} } - po, err := NewProcessPreimageOracle(args[0], args[1:]) + poOut := Logger(os.Stdout, log.LevelInfo).With("module", "host") + poErr := Logger(os.Stderr, log.LevelInfo).With("module", "host") + po, err := NewProcessPreimageOracle(args[0], args[1:], poOut, poErr) if err != nil { return fmt.Errorf("failed to create pre-image oracle process: %w", err) } @@ -323,57 +357,69 @@ func Run(ctx *cli.Context) error { snapshotAt := ctx.Generic(RunSnapshotAtFlag.Name).(*StepMatcherFlag).Matcher() infoAt := ctx.Generic(RunInfoAtFlag.Name).(*StepMatcherFlag).Matcher() - var meta *mipsevm.Metadata + var meta *program.Metadata if metaPath := ctx.Path(RunMetaFlag.Name); metaPath == "" { l.Info("no metadata file specified, defaulting to empty metadata") - meta = &mipsevm.Metadata{Symbols: nil} // provide empty metadata by default + meta = &program.Metadata{Symbols: nil} // provide empty metadata by default } else { - if m, err := jsonutil.LoadJSON[mipsevm.Metadata](metaPath); err != nil { + if m, err := jsonutil.LoadJSON[program.Metadata](metaPath); err != nil { return fmt.Errorf("failed to load metadata: %w", err) } else { meta = m } } - us := mipsevm.NewInstrumentedState(state, po, outLog, errLog) + state, err := versions.LoadStateFromFile(ctx.Path(RunInputFlag.Name)) + if err != nil { + return fmt.Errorf("failed to load state: %w", err) + } + vm := state.CreateVM(l, po, outLog, errLog, meta) + debugProgram := ctx.Bool(RunDebugFlag.Name) + if debugProgram { + if metaPath := ctx.Path(RunMetaFlag.Name); metaPath == "" { + return errors.New("cannot enable debug mode without a metadata file") + } + if err := vm.InitDebug(); err != nil { + return fmt.Errorf("failed to initialize debug mode: %w", err) + } + } + proofFmt := ctx.String(RunProofFmtFlag.Name) snapshotFmt := ctx.String(RunSnapshotFmtFlag.Name) - stepFn := us.Step + stepFn := vm.Step if po.cmd != nil { stepFn = Guard(po.cmd.ProcessState, stepFn) } start := time.Now() - startStep := state.Step - // avoid symbol lookups every instruction by preparing a matcher func - sleepCheck := meta.SymbolMatcher("runtime.notesleep") + startStep := state.GetStep() - for !state.Exited { - if state.Step%100 == 0 { // don't do the ctx err check (includes lock) too often + for !state.GetExited() { + step := state.GetStep() + if step%100 == 0 { // don't do the ctx err check (includes lock) too often if err := ctx.Context.Err(); err != nil { return err } } - step := state.Step - if infoAt(state) { delta := time.Since(start) l.Info("processing", "step", step, - "pc", mipsevm.HexU32(state.PC), - "insn", mipsevm.HexU32(state.Memory.GetMemory(state.PC)), + "pc", mipsevm.HexU32(state.GetPC()), + "insn", mipsevm.HexU32(state.GetMemory().GetMemory(state.GetPC())), "ips", float64(step-startStep)/(float64(delta)/float64(time.Second)), - "pages", state.Memory.PageCount(), - "mem", state.Memory.Usage(), - "name", meta.LookupSymbol(state.PC), + "pages", state.GetMemory().PageCount(), + "mem", state.GetMemory().Usage(), + "name", meta.LookupSymbol(state.GetPC()), ) } - if sleepCheck(state.PC) { // don't loop forever when we get stuck because of an unexpected bad program - return fmt.Errorf("got stuck in Go sleep at step %d", step) + if vm.CheckInfiniteLoop() { + // don't loop forever when we get stuck because of an unexpected bad program + return fmt.Errorf("detected an infinite loop at step %d", step) } if stopAt(state) { @@ -382,47 +428,40 @@ func Run(ctx *cli.Context) error { } if snapshotAt(state) { - if err := jsonutil.WriteJSON(fmt.Sprintf(snapshotFmt, step), state, OutFilePerm); err != nil { + if err := serialize.Write(fmt.Sprintf(snapshotFmt, step), state, OutFilePerm); err != nil { return fmt.Errorf("failed to write state snapshot: %w", err) } } if proofAt(state) { - preStateHash, err := state.EncodeWitness().StateHash() - if err != nil { - return fmt.Errorf("failed to hash prestate witness: %w", err) - } witness, err := stepFn(true) if err != nil { - return fmt.Errorf("failed at proof-gen step %d (PC: %08x): %w", step, state.PC, err) - } - postStateHash, err := state.EncodeWitness().StateHash() - if err != nil { - return fmt.Errorf("failed to hash poststate witness: %w", err) + return fmt.Errorf("failed at proof-gen step %d (PC: %08x): %w", step, state.GetPC(), err) } + _, postStateHash := state.EncodeWitness() proof := &Proof{ Step: step, - Pre: preStateHash, + Pre: witness.StateHash, Post: postStateHash, StateData: witness.State, - ProofData: witness.MemProof, + ProofData: witness.ProofData, } if witness.HasPreimage() { proof.OracleKey = witness.PreimageKey[:] proof.OracleValue = witness.PreimageValue proof.OracleOffset = witness.PreimageOffset } - if err := jsonutil.WriteJSON(fmt.Sprintf(proofFmt, step), proof, OutFilePerm); err != nil { + if err := jsonutil.WriteJSON(proof, ioutil.ToStdOutOrFileOrNoop(fmt.Sprintf(proofFmt, step), OutFilePerm)); err != nil { return fmt.Errorf("failed to write proof data: %w", err) } } else { _, err = stepFn(false) if err != nil { - return fmt.Errorf("failed at step %d (PC: %08x): %w", step, state.PC, err) + return fmt.Errorf("failed at step %d (PC: %08x): %w", step, state.GetPC(), err) } } - lastPreimageKey, lastPreimageValue, lastPreimageOffset := us.LastPreimage() + lastPreimageKey, lastPreimageValue, lastPreimageOffset := vm.LastPreimage() if lastPreimageOffset != ^uint32(0) { if stopAtAnyPreimage { l.Info("Stopping at preimage read") @@ -441,11 +480,19 @@ func Run(ctx *cli.Context) error { } } } - l.Info("Execution stopped", "exited", state.Exited, "code", state.ExitCode) + l.Info("Execution stopped", "exited", state.GetExited(), "code", state.GetExitCode()) + if debugProgram { + vm.Traceback() + } - if err := jsonutil.WriteJSON(ctx.Path(RunOutputFlag.Name), state, OutFilePerm); err != nil { + if err := serialize.Write(ctx.Path(RunOutputFlag.Name), state, OutFilePerm); err != nil { return fmt.Errorf("failed to write state output: %w", err) } + if debugInfoFile := ctx.Path(RunDebugInfoFlag.Name); debugInfoFile != "" { + if err := jsonutil.WriteJSON(vm.GetDebugInfo(), ioutil.ToStdOutOrFileOrNoop(debugInfoFile, OutFilePerm)); err != nil { + return fmt.Errorf("failed to write benchmark data: %w", err) + } + } return nil } @@ -468,5 +515,7 @@ var RunCommand = &cli.Command{ RunMetaFlag, RunInfoAtFlag, RunPProfCPU, + RunDebugFlag, + RunDebugInfoFlag, }, } diff --git a/cannon/cmd/witness.go b/cannon/cmd/witness.go index c2f38daa3621..a4f2e60ab6a6 100644 --- a/cannon/cmd/witness.go +++ b/cannon/cmd/witness.go @@ -4,8 +4,7 @@ import ( "fmt" "os" - "github.com/ethereum-optimism/optimism/cannon/mipsevm" - "github.com/ethereum-optimism/optimism/op-service/jsonutil" + factory "github.com/ethereum-optimism/optimism/cannon/mipsevm/versions" "github.com/urfave/cli/v2" ) @@ -26,15 +25,11 @@ var ( func Witness(ctx *cli.Context) error { input := ctx.Path(WitnessInputFlag.Name) output := ctx.Path(WitnessOutputFlag.Name) - state, err := jsonutil.LoadJSON[mipsevm.State](input) + state, err := factory.LoadStateFromFile(input) if err != nil { return fmt.Errorf("invalid input state (%v): %w", input, err) } - witness := state.EncodeWitness() - h, err := witness.StateHash() - if err != nil { - return fmt.Errorf("failed to compute witness hash: %w", err) - } + witness, h := state.EncodeWitness() if output != "" { if err := os.WriteFile(output, witness, 0755); err != nil { return fmt.Errorf("writing output to %v: %w", output, err) diff --git a/cannon/docs/README.md b/cannon/docs/README.md index 90fbcd34dbd6..e2c58f851782 100644 --- a/cannon/docs/README.md +++ b/cannon/docs/README.md @@ -45,7 +45,7 @@ There are 3 types of witness data involved in onchain execution: ### Packed State The Packed State is provided in every executed onchain instruction. -See [Cannon VM Specs](https://github.com/ethereum-optimism/specs/blob/main/specs/experimental/fault-proof/cannon-fault-proof-vm.md#state) for +See [Cannon VM Specs](https://github.com/ethereum-optimism/specs/blob/main/specs/fault-proof/cannon-fault-proof-vm.md#state) for details on the state structure. The packed state is small! The `State` data can be packed in such a small amount of EVM words, @@ -82,7 +82,7 @@ along the branch of the leaf value, starting from the bottom. To verify the proof, start with the leaf value as `node`, and combine it with respective sibling values: `node = keccak256(node ++ sibling)` or `node = keccak256(sibling ++ node)`, -depending the position of `node` at that level of the tree. +depending on the position of `node` at that level of the tree. During the onchain execution, each instruction only executes 1 or 2 memory reads, followed by 0 or 1 writes, where the write is over the same memory as was last read. @@ -99,10 +99,10 @@ since all sibling data that is combined with the new leaf value was already auth ### Pre-image data Pre-image data is accessed through syscalls exclusively. -The OP-stack fault-proof [Pre-image Oracle specs](https://github.com/ethereum-optimism/specs/blob/main/specs/fault-proof.md#pre-image-oracle) +The OP-stack fault-proof [Pre-image Oracle specs](https://github.com/ethereum-optimism/specs/blob/main/specs/fault-proof/index.md#pre-image-oracle) define the ABI for communicating pre-images. -This ABI is implemented by the VM by intercepting the `read`/`write` syscalls to specific file descriptors. See [Cannon VM Specs](https://github.com/ethereum-optimism/specs/blob/main/specs/cannon-fault-proof-vm.md#io) for more details. +This ABI is implemented by the VM by intercepting the `read`/`write` syscalls to specific file descriptors. See [Cannon VM Specs](https://github.com/ethereum-optimism/specs/blob/main/specs/fault-proof/cannon-fault-proof-vm.md#io) for more details. The data is loaded into `PreimageOracle.sol` using the respective loading function based on the pre-image type. And then retrieved during execution of the `read` syscall. diff --git a/cannon/example/Makefile b/cannon/example/Makefile deleted file mode 100644 index 6712cd0438fd..000000000000 --- a/cannon/example/Makefile +++ /dev/null @@ -1,21 +0,0 @@ -all: elf dump - -.PHONY: elf -elf: $(patsubst %/go.mod,bin/%.elf,$(wildcard */go.mod)) - -.PHONY: dump -dump: $(patsubst %/go.mod,bin/%.dump,$(wildcard */go.mod)) - -bin: - mkdir bin - -# take any directory with a go mod, and build an ELF -# verify output with: readelf -h bin/.elf -# result is mips32, big endian, R3000 -bin/%.elf: bin - cd $(@:bin/%.elf=%) && GOOS=linux GOARCH=mips GOMIPS=softfloat go build -o ../$@ . - -# take any ELF and dump it -# TODO: currently have the little-endian toolchain, but should use the big-endian one. The -EB compat flag works though. -bin/%.dump: bin/%.elf - mipsel-linux-gnu-objdump -D --disassembler-options=no-aliases --wide --source -m mips:3000 -EB $(@:%.dump=%.elf) > $@ diff --git a/cannon/example/claim/go.mod b/cannon/example/claim/go.mod deleted file mode 100644 index 1f6e8b00f49d..000000000000 --- a/cannon/example/claim/go.mod +++ /dev/null @@ -1,14 +0,0 @@ -module claim - -go 1.21 - -toolchain go1.21.1 - -require github.com/ethereum-optimism/optimism v0.0.0 - -require ( - 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 deleted file mode 100644 index 7873502bf9e5..000000000000 --- a/cannon/example/claim/go.sum +++ /dev/null @@ -1,12 +0,0 @@ -github.com/davecgh/go-spew v1.1.1 h1:vj9j/u1bqnvCEfJOwUhtlOARqs3+rkHYY13jYWTU97c= -github.com/davecgh/go-spew v1.1.1/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38= -github.com/pmezard/go-difflib v1.0.0 h1:4DBwDE0NGyQoBHbLQYPwSUPoCMWR5BEzIk/f1lZbAQM= -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.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/example/claim/main.go b/cannon/example/claim/main.go deleted file mode 100644 index ac22fa909040..000000000000 --- a/cannon/example/claim/main.go +++ /dev/null @@ -1,54 +0,0 @@ -package main - -import ( - "encoding/binary" - "fmt" - "os" - - "github.com/ethereum-optimism/optimism/op-preimage" -) - -type rawHint string - -func (rh rawHint) Hint() string { - return string(rh) -} - -func main() { - _, _ = os.Stderr.Write([]byte("started!")) - - po := preimage.NewOracleClient(preimage.ClientPreimageChannel()) - hinter := preimage.NewHintWriter(preimage.ClientHinterChannel()) - - preHash := *(*[32]byte)(po.Get(preimage.LocalIndexKey(0))) - diffHash := *(*[32]byte)(po.Get(preimage.LocalIndexKey(1))) - claimData := *(*[8]byte)(po.Get(preimage.LocalIndexKey(2))) - - // Hints are used to indicate which things the program will access, - // so the server can be prepared to serve the corresponding pre-images. - hinter.Hint(rawHint(fmt.Sprintf("fetch-state %x", preHash))) - pre := po.Get(preimage.Keccak256Key(preHash)) - - // Multiple pre-images may be fetched based on a hint. - // E.g. when we need all values of a merkle-tree. - hinter.Hint(rawHint(fmt.Sprintf("fetch-diff %x", diffHash))) - diff := po.Get(preimage.Keccak256Key(diffHash)) - diffPartA := po.Get(preimage.Keccak256Key(*(*[32]byte)(diff[:32]))) - diffPartB := po.Get(preimage.Keccak256Key(*(*[32]byte)(diff[32:]))) - - // Example state-transition function: s' = s*a + b - s := binary.BigEndian.Uint64(pre) - a := binary.BigEndian.Uint64(diffPartA) - b := binary.BigEndian.Uint64(diffPartB) - fmt.Printf("computing %d * %d + %d\n", s, a, b) - sOut := s*a + b - - sClaim := binary.BigEndian.Uint64(claimData[:]) - if sOut != sClaim { - fmt.Printf("claim %d is bad! Correct result is %d\n", sOut, sClaim) - os.Exit(1) - } else { - fmt.Printf("claim %d is good!\n", sOut) - os.Exit(0) - } -} diff --git a/cannon/main.go b/cannon/main.go index 769c1da0b6fe..176ce315708f 100644 --- a/cannon/main.go +++ b/cannon/main.go @@ -5,9 +5,8 @@ import ( "errors" "fmt" "os" - "os/signal" - "syscall" + "github.com/ethereum-optimism/optimism/op-service/ctxinterrupt" "github.com/urfave/cli/v2" "github.com/ethereum-optimism/optimism/cannon/cmd" @@ -23,18 +22,7 @@ func main() { cmd.WitnessCommand, cmd.RunCommand, } - ctx, cancel := context.WithCancel(context.Background()) - - c := make(chan os.Signal, 1) - signal.Notify(c, syscall.SIGINT, syscall.SIGTERM) - go func() { - for { - <-c - cancel() - fmt.Println("\r\nExiting...") - } - }() - + ctx := ctxinterrupt.WithSignalWaiterMain(context.Background()) err := app.RunContext(ctx, os.Args) if err != nil { if errors.Is(err, ctx.Err()) { diff --git a/cannon/mipsevm/debug.go b/cannon/mipsevm/debug.go new file mode 100644 index 000000000000..f05b770c0ea1 --- /dev/null +++ b/cannon/mipsevm/debug.go @@ -0,0 +1,10 @@ +package mipsevm + +import "github.com/ethereum/go-ethereum/common/hexutil" + +type DebugInfo struct { + Pages int `json:"pages"` + MemoryUsed hexutil.Uint64 `json:"memory_used"` + NumPreimageRequests int `json:"num_preimage_requests"` + TotalPreimageSize int `json:"total_preimage_size"` +} diff --git a/cannon/mipsevm/evm.go b/cannon/mipsevm/evm.go deleted file mode 100644 index e5111bb6da28..000000000000 --- a/cannon/mipsevm/evm.go +++ /dev/null @@ -1,120 +0,0 @@ -package mipsevm - -import ( - "encoding/binary" - "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" - "github.com/ethereum/go-ethereum/consensus/ethash" - "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/params" -) - -// 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) - } - - 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) - } - - return &Artifacts{ - MIPS: mips, - Oracle: oracle, - }, nil -} - -type Artifacts struct { - MIPS *foundry.Artifact - Oracle *foundry.Artifact -} - -type Addresses struct { - MIPS common.Address - Oracle common.Address - Sender common.Address - FeeRecipient common.Address -} - -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 - // Activate Cancun for EIP-4844 KZG point evaluation precompile - cancunActivation := *chainCfg.ShanghaiTime + 10 - chainCfg.CancunTime = &cancunActivation - offsetBlocks := uint64(1000) // blocks after cancun fork - bc := &testChain{startTime: *chainCfg.CancunTime + offsetBlocks*12} - header := bc.GetHeader(common.Hash{}, 17034870+offsetBlocks) - db := rawdb.NewMemoryDatabase() - statedb := state.NewDatabase(db) - state, err := state.New(types.EmptyRootHash, statedb, nil) - if err != nil { - panic(fmt.Errorf("failed to create memory state db: %w", err)) - } - blockContext := core.NewEVMBlockContext(header, bc, nil, chainCfg, state) - vmCfg := vm.Config{} - - env := vm.NewEVM(blockContext, vm.TxContext{}, state, chainCfg, vmCfg) - // pre-deploy the contracts - env.StateDB.SetCode(addrs.Oracle, artifacts.Oracle.DeployedBytecode.Object) - - var mipsCtorArgs [32]byte - copy(mipsCtorArgs[12:], addrs.Oracle[:]) - 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, common.U2560) - if err != nil { - panic(fmt.Errorf("failed to deploy MIPS contract: %w. took %d gas", err, startingGas-leftOverGas)) - } - addrs.MIPS = deployedMipsAddr - - rules := env.ChainConfig().Rules(header.Number, true, header.Time) - env.StateDB.Prepare(rules, addrs.Sender, addrs.FeeRecipient, &addrs.MIPS, vm.ActivePrecompiles(rules), nil) - return env, state -} - -type testChain struct { - startTime uint64 -} - -func (d *testChain) Engine() consensus.Engine { - return ethash.NewFullFaker() -} - -func (d *testChain) 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*12, - Extra: nil, - MixDigest: common.Hash{}, - Nonce: types.BlockNonce{}, - BaseFee: big.NewInt(7), - WithdrawalsHash: &types.EmptyWithdrawalsHash, - } -} diff --git a/cannon/mipsevm/evm_test.go b/cannon/mipsevm/evm_test.go deleted file mode 100644 index 703dc6e30a61..000000000000 --- a/cannon/mipsevm/evm_test.go +++ /dev/null @@ -1,585 +0,0 @@ -package mipsevm - -import ( - "bytes" - "debug/elf" - "errors" - "fmt" - "io" - "math/big" - "os" - "path" - "testing" - "time" - - "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" - "github.com/ethereum/go-ethereum/core/state" - "github.com/ethereum/go-ethereum/core/vm" - "github.com/ethereum/go-ethereum/eth/tracers/logger" - "github.com/stretchr/testify/require" -) - -func testContractsSetup(t require.TestingT) (*Artifacts, *Addresses) { - artifacts, err := LoadArtifacts() - require.NoError(t, err) - - addrs := &Addresses{ - MIPS: common.Address{0: 0xff, 19: 1}, - Oracle: common.Address{0: 0xff, 19: 2}, - Sender: common.Address{0x13, 0x37}, - FeeRecipient: common.Address{0xaa}, - } - - return artifacts, addrs -} - -func MarkdownTracer() vm.EVMLogger { - return logger.NewMarkdownLogger(&logger.Config{}, os.Stdout) -} - -type MIPSEVM struct { - env *vm.EVM - evmState *state.StateDB - addrs *Addresses - localOracle PreimageOracle - artifacts *Artifacts -} - -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) { - m.env.Config.Tracer = tracer -} - -func (m *MIPSEVM) SetLocalOracle(oracle PreimageOracle) { - m.localOracle = oracle -} - -// Step is a pure function that computes the poststate from the VM state encoded in the StepWitness. -func (m *MIPSEVM) Step(t *testing.T, stepWitness *StepWitness) []byte { - sender := common.Address{0x13, 0x37} - startingGas := uint64(30_000_000) - - // we take a snapshot so we can clean up the state, and isolate the logs of this instruction run. - snap := m.env.StateDB.Snapshot() - - if stepWitness.HasPreimage() { - t.Logf("reading preimage key %x at offset %d", stepWitness.PreimageKey, stepWitness.PreimageOffset) - 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, common.U2560) - require.NoErrorf(t, err, "evm should not fail, took %d gas", startingGas-leftOverGas) - } - - 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 - postHash := common.Hash(*(*[32]byte)(ret)) - logs := m.evmState.Logs() - require.Equal(t, 1, len(logs), "expecting a log with post-state") - evmPost := logs[0].Data - - stateHash, err := StateWitness(evmPost).StateHash() - require.NoError(t, err, "state hash could not be computed") - require.Equal(t, stateHash, postHash, "logged state must be accurate") - - m.env.StateDB.RevertToSnapshot(snap) - t.Logf("EVM step took %d gas, and returned stateHash %s", startingGas-leftOverGas, postHash) - return evmPost -} - -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, 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") - } - - switch preimage.KeyType(wit.PreimageKey[0]) { - case preimage.LocalKeyType: - if len(wit.PreimageValue) > 32+8 { - return nil, fmt.Errorf("local pre-image exceeds maximum size of 32 bytes with key 0x%x", wit.PreimageKey) - } - preimagePart := wit.PreimageValue[8:] - var tmp [32]byte - copy(tmp[:], preimagePart) - input, err := oracle.ABI.Pack("loadLocalData", - new(big.Int).SetBytes(wit.PreimageKey[1:]), - localContext, - tmp, - new(big.Int).SetUint64(uint64(len(preimagePart))), - new(big.Int).SetUint64(uint64(wit.PreimageOffset)), - ) - require.NoError(t, err) - return input, nil - case preimage.Keccak256KeyType: - input, err := oracle.ABI.Pack( - "loadKeccak256PreimagePart", - new(big.Int).SetUint64(uint64(wit.PreimageOffset)), - wit.PreimageValue[8:]) - require.NoError(t, err) - return input, nil - case preimage.PrecompileKeyType: - if localOracle == nil { - return nil, fmt.Errorf("local oracle is required for precompile preimages") - } - preimage := localOracle.GetPreimage(preimage.Keccak256Key(wit.PreimageKey).PreimageKey()) - precompile := common.BytesToAddress(preimage[:20]) - callInput := preimage[20:] - input, err := oracle.ABI.Pack( - "loadPrecompilePreimagePart", - new(big.Int).SetUint64(uint64(wit.PreimageOffset)), - precompile, - callInput, - ) - require.NoError(t, err) - return input, nil - default: - return nil, fmt.Errorf("unsupported pre-image type %d, cannot prepare preimage with key %x offset %d for oracle", - wit.PreimageKey[0], wit.PreimageKey, wit.PreimageOffset) - } -} - -func TestEVM(t *testing.T) { - testFiles, err := os.ReadDir("open_mips_tests/test/bin") - require.NoError(t, err) - - contracts, addrs := testContractsSetup(t) - var tracer vm.EVMLogger // no-tracer by default, but MarkdownTracer - - for _, f := range testFiles { - t.Run(f.Name(), func(t *testing.T) { - oracle := selectOracleFixture(t, f.Name()) - // Short-circuit early for exit_group.bin - exitGroup := f.Name() == "exit_group.bin" - - evm := NewMIPSEVM(contracts, addrs) - evm.SetTracer(tracer) - evm.SetLocalOracle(oracle) - - fn := path.Join("open_mips_tests/test/bin", f.Name()) - programMem, err := os.ReadFile(fn) - require.NoError(t, err) - state := &State{PC: 0, NextPC: 4, Memory: NewMemory()} - err = state.Memory.SetMemoryRange(0, bytes.NewReader(programMem)) - require.NoError(t, err, "load program into state") - - // set the return address ($ra) to jump into when test completes - state.Registers[31] = endAddr - - goState := NewInstrumentedState(state, oracle, os.Stdout, os.Stderr) - - for i := 0; i < 1000; i++ { - if goState.state.PC == endAddr { - break - } - if exitGroup && goState.state.Exited { - break - } - insn := state.Memory.GetMemory(state.PC) - t.Logf("step: %4d pc: 0x%08x insn: 0x%08x", state.Step, state.PC, insn) - - stepWitness, err := goState.Step(true) - require.NoError(t, err) - evmPost := evm.Step(t, stepWitness) - // verify the post-state matches. - // TODO: maybe more readable to decode the evmPost state, and do attribute-wise comparison. - goPost := goState.state.EncodeWitness() - require.Equalf(t, hexutil.Bytes(goPost).String(), hexutil.Bytes(evmPost).String(), - "mipsevm produced different state than EVM at step %d", state.Step) - } - if exitGroup { - require.NotEqual(t, uint32(endAddr), goState.state.PC, "must not reach end") - require.True(t, goState.state.Exited, "must set exited state") - require.Equal(t, uint8(1), goState.state.ExitCode, "must exit with 1") - } else { - require.Equal(t, uint32(endAddr), state.PC, "must reach end") - // inspect test result - done, result := state.Memory.GetMemory(baseAddrEnd+4), state.Memory.GetMemory(baseAddrEnd+8) - require.Equal(t, done, uint32(1), "must be done") - require.Equal(t, result, uint32(1), "must have success result") - } - }) - } -} - -func TestEVMSingleStep(t *testing.T) { - contracts, addrs := testContractsSetup(t) - var tracer vm.EVMLogger - - cases := []struct { - name string - pc uint32 - nextPC uint32 - insn uint32 - }{ - {"j MSB set target", 0, 4, 0x0A_00_00_02}, // j 0x02_00_00_02 - {"j non-zero PC region", 0x10000000, 0x10000004, 0x08_00_00_02}, // j 0x2 - {"jal MSB set target", 0, 4, 0x0E_00_00_02}, // jal 0x02_00_00_02 - {"jal non-zero PC region", 0x10000000, 0x10000004, 0x0C_00_00_02}, // jal 0x2 - } - - for _, tt := range cases { - t.Run(tt.name, func(t *testing.T) { - state := &State{PC: tt.pc, NextPC: tt.nextPC, Memory: NewMemory()} - state.Memory.SetMemory(tt.pc, tt.insn) - - us := NewInstrumentedState(state, nil, os.Stdout, os.Stderr) - stepWitness, err := us.Step(true) - require.NoError(t, err) - - 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 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 - sender := common.Address{0x13, 0x37} - - env, evmState := NewEVMEnv(contracts, addrs) - env.Config.Tracer = tracer - - cases := []struct { - name string - nextPC uint32 - insn uint32 - }{ - {"illegal instruction", 0, 0xFF_FF_FF_FF}, - {"branch in delay-slot", 8, 0x11_02_00_03}, - {"jump in delay-slot", 8, 0x0c_00_00_0c}, - } - - for _, tt := range cases { - t.Run(tt.name, func(t *testing.T) { - state := &State{PC: 0, NextPC: tt.nextPC, Memory: NewMemory()} - initialState := &State{PC: 0, NextPC: tt.nextPC, Memory: state.Memory} - state.Memory.SetMemory(0, tt.insn) - - // set the return address ($ra) to jump into when test completes - state.Registers[31] = endAddr - - us := NewInstrumentedState(state, nil, os.Stdout, os.Stderr) - require.Panics(t, func() { _, _ = us.Step(true) }) - - insnProof := initialState.Memory.MerkleProof(0) - stepWitness := &StepWitness{ - State: initialState.EncodeWitness(), - MemProof: insnProof[:], - } - input := encodeStepInput(t, stepWitness, LocalContext{}, contracts.MIPS) - startingGas := uint64(30_000_000) - - _, _, 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)) - }) - } -} - -func TestHelloEVM(t *testing.T) { - contracts, addrs := testContractsSetup(t) - var tracer vm.EVMLogger // no-tracer by default, but see MarkdownTracer - - elfProgram, err := elf.Open("../example/bin/hello.elf") - require.NoError(t, err, "open ELF file") - - state, err := LoadELF(elfProgram) - require.NoError(t, err, "load ELF into state") - - err = PatchGo(elfProgram, state) - require.NoError(t, err, "apply Go runtime patches") - require.NoError(t, PatchStack(state), "add initial stack") - - var stdOutBuf, stdErrBuf bytes.Buffer - goState := NewInstrumentedState(state, nil, io.MultiWriter(&stdOutBuf, os.Stdout), io.MultiWriter(&stdErrBuf, os.Stderr)) - - start := time.Now() - for i := 0; i < 400_000; i++ { - if goState.state.Exited { - break - } - insn := state.Memory.GetMemory(state.PC) - if i%1000 == 0 { // avoid spamming test logs, we are executing many steps - t.Logf("step: %4d pc: 0x%08x insn: 0x%08x", state.Step, state.PC, insn) - } - - evm := NewMIPSEVM(contracts, addrs) - evm.SetTracer(tracer) - - stepWitness, err := goState.Step(true) - require.NoError(t, err) - evmPost := evm.Step(t, stepWitness) - // verify the post-state matches. - // TODO: maybe more readable to decode the evmPost state, and do attribute-wise comparison. - goPost := goState.state.EncodeWitness() - require.Equal(t, hexutil.Bytes(goPost).String(), hexutil.Bytes(evmPost).String(), - "mipsevm produced different state than EVM") - } - end := time.Now() - delta := end.Sub(start) - t.Logf("test took %s, %d instructions, %s per instruction", delta, state.Step, delta/time.Duration(state.Step)) - - require.True(t, state.Exited, "must complete program") - require.Equal(t, uint8(0), state.ExitCode, "exit with 0") - - require.Equal(t, "hello world!\n", stdOutBuf.String(), "stdout says hello") - require.Equal(t, "", stdErrBuf.String(), "stderr silent") -} - -func TestClaimEVM(t *testing.T) { - contracts, addrs := testContractsSetup(t) - var tracer vm.EVMLogger // no-tracer by default, but see MarkdownTracer - - elfProgram, err := elf.Open("../example/bin/claim.elf") - require.NoError(t, err, "open ELF file") - - state, err := LoadELF(elfProgram) - require.NoError(t, err, "load ELF into state") - - err = PatchGo(elfProgram, state) - require.NoError(t, err, "apply Go runtime patches") - require.NoError(t, PatchStack(state), "add initial stack") - - oracle, expectedStdOut, expectedStdErr := claimTestOracle(t) - - var stdOutBuf, stdErrBuf bytes.Buffer - goState := NewInstrumentedState(state, oracle, io.MultiWriter(&stdOutBuf, os.Stdout), io.MultiWriter(&stdErrBuf, os.Stderr)) - - for i := 0; i < 2000_000; i++ { - if goState.state.Exited { - break - } - - insn := state.Memory.GetMemory(state.PC) - if i%1000 == 0 { // avoid spamming test logs, we are executing many steps - t.Logf("step: %4d pc: 0x%08x insn: 0x%08x", state.Step, state.PC, insn) - } - - stepWitness, err := goState.Step(true) - require.NoError(t, err) - - evm := NewMIPSEVM(contracts, addrs) - evm.SetTracer(tracer) - evmPost := evm.Step(t, stepWitness) - - goPost := goState.state.EncodeWitness() - require.Equal(t, hexutil.Bytes(goPost).String(), hexutil.Bytes(evmPost).String(), - "mipsevm produced different state than EVM") - } - - require.True(t, state.Exited, "must complete program") - require.Equal(t, uint8(0), state.ExitCode, "exit with 0") - - 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/exec/memory.go b/cannon/mipsevm/exec/memory.go new file mode 100644 index 000000000000..3dea28dce29b --- /dev/null +++ b/cannon/mipsevm/exec/memory.go @@ -0,0 +1,58 @@ +package exec + +import ( + "fmt" + + "github.com/ethereum-optimism/optimism/cannon/mipsevm/memory" +) + +type MemTracker interface { + TrackMemAccess(addr uint32) +} + +type MemoryTrackerImpl struct { + memory *memory.Memory + lastMemAccess uint32 + memProofEnabled bool + // proof of first unique memory access + memProof [memory.MEM_PROOF_SIZE]byte + // proof of second unique memory access + memProof2 [memory.MEM_PROOF_SIZE]byte +} + +func NewMemoryTracker(memory *memory.Memory) *MemoryTrackerImpl { + return &MemoryTrackerImpl{memory: memory} +} + +func (m *MemoryTrackerImpl) TrackMemAccess(effAddr uint32) { + if m.memProofEnabled && m.lastMemAccess != effAddr { + if m.lastMemAccess != ^uint32(0) { + panic(fmt.Errorf("unexpected different mem access at %08x, already have access at %08x buffered", effAddr, m.lastMemAccess)) + } + m.lastMemAccess = effAddr + m.memProof = m.memory.MerkleProof(effAddr) + } +} + +// TrackMemAccess2 creates a proof for a memory access following a call to TrackMemAccess +// This is used to generate proofs for contiguous memory accesses within the same step +func (m *MemoryTrackerImpl) TrackMemAccess2(effAddr uint32) { + if m.memProofEnabled && m.lastMemAccess+4 != effAddr { + panic(fmt.Errorf("unexpected disjointed mem access at %08x, last memory access is at %08x buffered", effAddr, m.lastMemAccess)) + } + m.lastMemAccess = effAddr + m.memProof2 = m.memory.MerkleProof(effAddr) +} + +func (m *MemoryTrackerImpl) Reset(enableProof bool) { + m.memProofEnabled = enableProof + m.lastMemAccess = ^uint32(0) +} + +func (m *MemoryTrackerImpl) MemProof() [memory.MEM_PROOF_SIZE]byte { + return m.memProof +} + +func (m *MemoryTrackerImpl) MemProof2() [memory.MEM_PROOF_SIZE]byte { + return m.memProof2 +} diff --git a/cannon/mipsevm/exec/mips_instructions.go b/cannon/mipsevm/exec/mips_instructions.go new file mode 100644 index 000000000000..aec14192df93 --- /dev/null +++ b/cannon/mipsevm/exec/mips_instructions.go @@ -0,0 +1,400 @@ +package exec + +import ( + "github.com/ethereum-optimism/optimism/cannon/mipsevm" + "github.com/ethereum-optimism/optimism/cannon/mipsevm/memory" +) + +const ( + OpLoadLinked = 0x30 + OpStoreConditional = 0x38 +) + +func GetInstructionDetails(pc uint32, memory *memory.Memory) (insn, opcode, fun uint32) { + insn = memory.GetMemory(pc) + opcode = insn >> 26 // First 6-bits + fun = insn & 0x3f // Last 6-bits + + return insn, opcode, fun +} + +func ExecMipsCoreStepLogic(cpu *mipsevm.CpuScalars, registers *[32]uint32, memory *memory.Memory, insn, opcode, fun uint32, memTracker MemTracker, stackTracker StackTracker) (memUpdated bool, memAddr uint32, err error) { + // j-type j/jal + if opcode == 2 || opcode == 3 { + linkReg := uint32(0) + if opcode == 3 { + linkReg = 31 + } + // Take top 4 bits of the next PC (its 256 MB region), and concatenate with the 26-bit offset + target := (cpu.NextPC & 0xF0000000) | ((insn & 0x03FFFFFF) << 2) + stackTracker.PushStack(cpu.PC, target) + err = HandleJump(cpu, registers, linkReg, target) + return + } + + // register fetch + rs := uint32(0) // source register 1 value + rt := uint32(0) // source register 2 / temp value + rtReg := (insn >> 16) & 0x1F + + // R-type or I-type (stores rt) + rs = registers[(insn>>21)&0x1F] + rdReg := rtReg + if opcode == 0 || opcode == 0x1c { + // R-type (stores rd) + rt = registers[rtReg] + rdReg = (insn >> 11) & 0x1F + } else if opcode < 0x20 { + // rt is SignExtImm + // don't sign extend for andi, ori, xori + if opcode == 0xC || opcode == 0xD || opcode == 0xe { + // ZeroExtImm + rt = insn & 0xFFFF + } else { + // SignExtImm + rt = SignExtend(insn&0xFFFF, 16) + } + } else if opcode >= 0x28 || opcode == 0x22 || opcode == 0x26 { + // store rt value with store + rt = registers[rtReg] + + // store actual rt with lwl and lwr + rdReg = rtReg + } + + if (opcode >= 4 && opcode < 8) || opcode == 1 { + err = HandleBranch(cpu, registers, opcode, insn, rtReg, rs) + return + } + + storeAddr := uint32(0xFF_FF_FF_FF) + // memory fetch (all I-type) + // we do the load for stores also + mem := uint32(0) + if opcode >= 0x20 { + // M[R[rs]+SignExtImm] + rs += SignExtend(insn&0xFFFF, 16) + addr := rs & 0xFFFFFFFC + memTracker.TrackMemAccess(addr) + mem = memory.GetMemory(addr) + if opcode >= 0x28 { + // store + storeAddr = addr + // store opcodes don't write back to a register + rdReg = 0 + } + } + + // ALU + val := ExecuteMipsInstruction(insn, opcode, fun, rs, rt, mem) + + if opcode == 0 && fun >= 8 && fun < 0x1c { + if fun == 8 || fun == 9 { // jr/jalr + linkReg := uint32(0) + if fun == 9 { + linkReg = rdReg + stackTracker.PushStack(cpu.PC, rs) + } else { + stackTracker.PopStack() + } + err = HandleJump(cpu, registers, linkReg, rs) + return + } + + if fun == 0xa { // movz + err = HandleRd(cpu, registers, rdReg, rs, rt == 0) + return + } + if fun == 0xb { // movn + err = HandleRd(cpu, registers, rdReg, rs, rt != 0) + return + } + + // lo and hi registers + // can write back + if fun >= 0x10 && fun < 0x1c { + err = HandleHiLo(cpu, registers, fun, rs, rt, rdReg) + return + } + } + + // write memory + if storeAddr != 0xFF_FF_FF_FF { + memTracker.TrackMemAccess(storeAddr) + memory.SetMemory(storeAddr, val) + memUpdated = true + memAddr = storeAddr + } + + // write back the value to destination register + err = HandleRd(cpu, registers, rdReg, val, true) + return +} + +func SignExtendImmediate(insn uint32) uint32 { + return SignExtend(insn&0xFFFF, 16) +} + +func ExecuteMipsInstruction(insn, opcode, fun, rs, rt, mem uint32) uint32 { + if opcode == 0 || (opcode >= 8 && opcode < 0xF) { + // transform ArithLogI to SPECIAL + switch opcode { + case 8: + fun = 0x20 // addi + case 9: + fun = 0x21 // addiu + case 0xA: + fun = 0x2A // slti + case 0xB: + fun = 0x2B // sltiu + case 0xC: + fun = 0x24 // andi + case 0xD: + fun = 0x25 // ori + case 0xE: + fun = 0x26 // xori + } + + switch fun { + case 0x00: // sll + return rt << ((insn >> 6) & 0x1F) + case 0x02: // srl + return rt >> ((insn >> 6) & 0x1F) + case 0x03: // sra + shamt := (insn >> 6) & 0x1F + return SignExtend(rt>>shamt, 32-shamt) + case 0x04: // sllv + return rt << (rs & 0x1F) + case 0x06: // srlv + return rt >> (rs & 0x1F) + case 0x07: // srav + shamt := rs & 0x1F + return SignExtend(rt>>shamt, 32-shamt) + // functs in range [0x8, 0x1b] are handled specially by other functions + case 0x08: // jr + return rs + case 0x09: // jalr + return rs + case 0x0a: // movz + return rs + case 0x0b: // movn + return rs + case 0x0c: // syscall + return rs + // 0x0d - break not supported + case 0x0f: // sync + return rs + case 0x10: // mfhi + return rs + case 0x11: // mthi + return rs + case 0x12: // mflo + return rs + case 0x13: // mtlo + return rs + case 0x18: // mult + return rs + case 0x19: // multu + return rs + case 0x1a: // div + return rs + case 0x1b: // divu + return rs + // The rest includes transformed R-type arith imm instructions + case 0x20: // add + return rs + rt + case 0x21: // addu + return rs + rt + case 0x22: // sub + return rs - rt + case 0x23: // subu + return rs - rt + case 0x24: // and + return rs & rt + case 0x25: // or + return rs | rt + case 0x26: // xor + return rs ^ rt + case 0x27: // nor + return ^(rs | rt) + case 0x2a: // slti + if int32(rs) < int32(rt) { + return 1 + } + return 0 + case 0x2b: // sltiu + if rs < rt { + return 1 + } + return 0 + default: + panic("invalid instruction") + } + } else { + switch opcode { + // SPECIAL2 + case 0x1C: + switch fun { + case 0x2: // mul + return uint32(int32(rs) * int32(rt)) + case 0x20, 0x21: // clz, clo + if fun == 0x20 { + rs = ^rs + } + i := uint32(0) + for ; rs&0x80000000 != 0; i++ { + rs <<= 1 + } + return i + } + case 0x0F: // lui + return rt << 16 + case 0x20: // lb + return SignExtend((mem>>(24-(rs&3)*8))&0xFF, 8) + case 0x21: // lh + return SignExtend((mem>>(16-(rs&2)*8))&0xFFFF, 16) + case 0x22: // lwl + val := mem << ((rs & 3) * 8) + mask := uint32(0xFFFFFFFF) << ((rs & 3) * 8) + return (rt & ^mask) | val + case 0x23: // lw + return mem + case 0x24: // lbu + return (mem >> (24 - (rs&3)*8)) & 0xFF + case 0x25: // lhu + return (mem >> (16 - (rs&2)*8)) & 0xFFFF + case 0x26: // lwr + val := mem >> (24 - (rs&3)*8) + mask := uint32(0xFFFFFFFF) >> (24 - (rs&3)*8) + return (rt & ^mask) | val + case 0x28: // sb + val := (rt & 0xFF) << (24 - (rs&3)*8) + mask := 0xFFFFFFFF ^ uint32(0xFF<<(24-(rs&3)*8)) + return (mem & mask) | val + case 0x29: // sh + val := (rt & 0xFFFF) << (16 - (rs&2)*8) + mask := 0xFFFFFFFF ^ uint32(0xFFFF<<(16-(rs&2)*8)) + return (mem & mask) | val + case 0x2a: // swl + val := rt >> ((rs & 3) * 8) + mask := uint32(0xFFFFFFFF) >> ((rs & 3) * 8) + return (mem & ^mask) | val + case 0x2b: // sw + return rt + case 0x2e: // swr + val := rt << (24 - (rs&3)*8) + mask := uint32(0xFFFFFFFF) << (24 - (rs&3)*8) + return (mem & ^mask) | val + default: + panic("invalid instruction") + } + } + panic("invalid instruction") +} + +func SignExtend(dat uint32, idx uint32) uint32 { + isSigned := (dat >> (idx - 1)) != 0 + signed := ((uint32(1) << (32 - idx)) - 1) << idx + mask := (uint32(1) << idx) - 1 + if isSigned { + return dat&mask | signed + } else { + return dat & mask + } +} + +func HandleBranch(cpu *mipsevm.CpuScalars, registers *[32]uint32, opcode uint32, insn uint32, rtReg uint32, rs uint32) error { + if cpu.NextPC != cpu.PC+4 { + panic("branch in delay slot") + } + + shouldBranch := false + if opcode == 4 || opcode == 5 { // beq/bne + rt := registers[rtReg] + shouldBranch = (rs == rt && opcode == 4) || (rs != rt && opcode == 5) + } else if opcode == 6 { + shouldBranch = int32(rs) <= 0 // blez + } else if opcode == 7 { + shouldBranch = int32(rs) > 0 // bgtz + } else if opcode == 1 { + // regimm + rtv := (insn >> 16) & 0x1F + if rtv == 0 { // bltz + shouldBranch = int32(rs) < 0 + } + if rtv == 1 { // bgez + shouldBranch = int32(rs) >= 0 + } + } + + prevPC := cpu.PC + cpu.PC = cpu.NextPC // execute the delay slot first + if shouldBranch { + cpu.NextPC = prevPC + 4 + (SignExtend(insn&0xFFFF, 16) << 2) // then continue with the instruction the branch jumps to. + } else { + cpu.NextPC = cpu.NextPC + 4 // branch not taken + } + return nil +} + +func HandleHiLo(cpu *mipsevm.CpuScalars, registers *[32]uint32, fun uint32, rs uint32, rt uint32, storeReg uint32) error { + val := uint32(0) + switch fun { + case 0x10: // mfhi + val = cpu.HI + case 0x11: // mthi + cpu.HI = rs + case 0x12: // mflo + val = cpu.LO + case 0x13: // mtlo + cpu.LO = rs + case 0x18: // mult + acc := uint64(int64(int32(rs)) * int64(int32(rt))) + cpu.HI = uint32(acc >> 32) + cpu.LO = uint32(acc) + case 0x19: // multu + acc := uint64(uint64(rs) * uint64(rt)) + cpu.HI = uint32(acc >> 32) + cpu.LO = uint32(acc) + case 0x1a: // div + cpu.HI = uint32(int32(rs) % int32(rt)) + cpu.LO = uint32(int32(rs) / int32(rt)) + case 0x1b: // divu + cpu.HI = rs % rt + cpu.LO = rs / rt + } + + if storeReg != 0 { + registers[storeReg] = val + } + + cpu.PC = cpu.NextPC + cpu.NextPC = cpu.NextPC + 4 + return nil +} + +func HandleJump(cpu *mipsevm.CpuScalars, registers *[32]uint32, linkReg uint32, dest uint32) error { + if cpu.NextPC != cpu.PC+4 { + panic("jump in delay slot") + } + prevPC := cpu.PC + cpu.PC = cpu.NextPC + cpu.NextPC = dest + if linkReg != 0 { + registers[linkReg] = prevPC + 8 // set the link-register to the instr after the delay slot instruction. + } + return nil +} + +func HandleRd(cpu *mipsevm.CpuScalars, registers *[32]uint32, storeReg uint32, val uint32, conditional bool) error { + if storeReg >= 32 { + panic("invalid register") + } + if storeReg != 0 && conditional { + // Register 0 is a special register that always holds a value of 0 + registers[storeReg] = val + } + cpu.PC = cpu.NextPC + cpu.NextPC = cpu.NextPC + 4 + return nil +} diff --git a/cannon/mipsevm/exec/mips_syscalls.go b/cannon/mipsevm/exec/mips_syscalls.go new file mode 100644 index 000000000000..caf3b9bec630 --- /dev/null +++ b/cannon/mipsevm/exec/mips_syscalls.go @@ -0,0 +1,313 @@ +package exec + +import ( + "encoding/binary" + "io" + + "github.com/ethereum/go-ethereum/common" + "github.com/ethereum/go-ethereum/common/hexutil" + + "github.com/ethereum-optimism/optimism/cannon/mipsevm" + "github.com/ethereum-optimism/optimism/cannon/mipsevm/memory" + "github.com/ethereum-optimism/optimism/cannon/mipsevm/program" +) + +// Syscall codes +const ( + SysMmap = 4090 + SysBrk = 4045 + SysClone = 4120 + SysExitGroup = 4246 + SysRead = 4003 + SysWrite = 4004 + SysFcntl = 4055 + SysExit = 4001 + SysSchedYield = 4162 + SysGetTID = 4222 + SysFutex = 4238 + SysOpen = 4005 + SysNanosleep = 4166 + SysClockGetTime = 4263 + SysGetpid = 4020 +) + +// Noop Syscall codes +const ( + SysMunmap = 4091 + SysGetAffinity = 4240 + SysMadvise = 4218 + SysRtSigprocmask = 4195 + SysSigaltstack = 4206 + SysRtSigaction = 4194 + SysPrlimit64 = 4338 + SysClose = 4006 + SysPread64 = 4200 + SysFstat64 = 4215 + SysOpenAt = 4288 + SysReadlink = 4085 + SysReadlinkAt = 4298 + SysIoctl = 4054 + SysEpollCreate1 = 4326 + SysPipe2 = 4328 + SysEpollCtl = 4249 + SysEpollPwait = 4313 + SysGetRandom = 4353 + SysUname = 4122 + SysStat64 = 4213 + SysGetuid = 4024 + SysGetgid = 4047 + SysLlseek = 4140 + SysMinCore = 4217 + SysTgkill = 4266 + // Profiling-related syscalls + SysSetITimer = 4104 + SysTimerCreate = 4257 + SysTimerSetTime = 4258 + SysTimerDelete = 4261 +) + +// File descriptors +const ( + FdStdin = 0 + FdStdout = 1 + FdStderr = 2 + FdHintRead = 3 + FdHintWrite = 4 + FdPreimageRead = 5 + FdPreimageWrite = 6 +) + +// Errors +const ( + SysErrorSignal = ^uint32(0) + MipsEBADF = 0x9 + MipsEINVAL = 0x16 + MipsEAGAIN = 0xb + MipsETIMEDOUT = 0x91 +) + +// SysFutex-related constants +const ( + FutexWaitPrivate = 128 + FutexWakePrivate = 129 + FutexTimeoutSteps = 10_000 + FutexNoTimeout = ^uint64(0) + FutexEmptyAddr = ^uint32(0) +) + +// SysClone flags +// Handling is meant to support go runtime use cases +// Pulled from: https://github.com/golang/go/blob/go1.21.3/src/runtime/os_linux.go#L124-L158 +const ( + CloneVm = 0x100 + CloneFs = 0x200 + CloneFiles = 0x400 + CloneSighand = 0x800 + ClonePtrace = 0x2000 + CloneVfork = 0x4000 + CloneParent = 0x8000 + CloneThread = 0x10000 + CloneNewns = 0x20000 + CloneSysvsem = 0x40000 + CloneSettls = 0x80000 + CloneParentSettid = 0x100000 + CloneChildCleartid = 0x200000 + CloneUntraced = 0x800000 + CloneChildSettid = 0x1000000 + CloneStopped = 0x2000000 + CloneNewuts = 0x4000000 + CloneNewipc = 0x8000000 + + ValidCloneFlags = CloneVm | + CloneFs | + CloneFiles | + CloneSighand | + CloneSysvsem | + CloneThread +) + +// Other constants +const ( + // SchedQuantum is the number of steps dedicated for a thread before it's preempted. Effectively used to emulate thread "time slices" + SchedQuantum = 100_000 + + // HZ is the assumed clock rate of an emulated MIPS32 CPU. + // The value of HZ is a rough estimate of the Cannon instruction count / second on a typical machine. + // HZ is used to emulate the clock_gettime syscall used by guest programs that have a Go runtime. + // The Go runtime consumes the system time to determine when to initiate gc assists and for goroutine scheduling. + // A HZ value that is too low (i.e. lower than the emulation speed) results in the main goroutine attempting to assist with GC more often. + // Adjust this value accordingly as the emulation speed changes. The HZ value should be within the same order of magnitude as the emulation speed. + HZ = 10_000_000 + + // ClockGettimeRealtimeFlag is the clock_gettime clock id for Linux's realtime clock: https://github.com/torvalds/linux/blob/ad618736883b8970f66af799e34007475fe33a68/include/uapi/linux/time.h#L49 + ClockGettimeRealtimeFlag = 0 + // ClockGettimeMonotonicFlag is the clock_gettime clock id for Linux's monotonic clock: https://github.com/torvalds/linux/blob/ad618736883b8970f66af799e34007475fe33a68/include/uapi/linux/time.h#L50 + ClockGettimeMonotonicFlag = 1 +) + +func GetSyscallArgs(registers *[32]uint32) (syscallNum, a0, a1, a2, a3 uint32) { + syscallNum = registers[2] // v0 + + a0 = registers[4] + a1 = registers[5] + a2 = registers[6] + a3 = registers[7] + + return syscallNum, a0, a1, a2, a3 +} + +func HandleSysMmap(a0, a1, heap uint32) (v0, v1, newHeap uint32) { + v1 = uint32(0) + newHeap = heap + + sz := a1 + if sz&memory.PageAddrMask != 0 { // adjust size to align with page size + sz += memory.PageSize - (sz & memory.PageAddrMask) + } + if a0 == 0 { + v0 = heap + //fmt.Printf("mmap heap 0x%x size 0x%x\n", v0, sz) + newHeap += sz + // Fail if new heap exceeds memory limit, newHeap overflows around to low memory, or sz overflows + if newHeap > program.HEAP_END || newHeap < heap || sz < a1 { + v0 = SysErrorSignal + v1 = MipsEINVAL + return v0, v1, heap + } + } else { + v0 = a0 + //fmt.Printf("mmap hint 0x%x size 0x%x\n", v0, sz) + } + + return v0, v1, newHeap +} + +func HandleSysRead(a0, a1, a2 uint32, preimageKey [32]byte, preimageOffset uint32, preimageReader PreimageReader, memory *memory.Memory, memTracker MemTracker) (v0, v1, newPreimageOffset uint32, memUpdated bool, memAddr uint32) { + // args: a0 = fd, a1 = addr, a2 = count + // returns: v0 = read, v1 = err code + v0 = uint32(0) + v1 = uint32(0) + newPreimageOffset = preimageOffset + + switch a0 { + case FdStdin: + // leave v0 and v1 zero: read nothing, no error + case FdPreimageRead: // pre-image oracle + effAddr := a1 & 0xFFffFFfc + memTracker.TrackMemAccess(effAddr) + mem := memory.GetMemory(effAddr) + dat, datLen := preimageReader.ReadPreimage(preimageKey, preimageOffset) + //fmt.Printf("reading pre-image data: addr: %08x, offset: %d, datLen: %d, data: %x, key: %s count: %d\n", a1, preimageOffset, datLen, dat[:datLen], preimageKey, a2) + alignment := a1 & 3 + space := 4 - alignment + if space < datLen { + datLen = space + } + if a2 < datLen { + datLen = a2 + } + var outMem [4]byte + binary.BigEndian.PutUint32(outMem[:], mem) + copy(outMem[alignment:], dat[:datLen]) + memory.SetMemory(effAddr, binary.BigEndian.Uint32(outMem[:])) + memUpdated = true + memAddr = effAddr + newPreimageOffset += datLen + v0 = datLen + //fmt.Printf("read %d pre-image bytes, new offset: %d, eff addr: %08x mem: %08x\n", datLen, m.state.PreimageOffset, effAddr, outMem) + case FdHintRead: // hint response + // don't actually read into memory, just say we read it all, we ignore the result anyway + v0 = a2 + default: + v0 = 0xFFffFFff + v1 = MipsEBADF + } + + return v0, v1, newPreimageOffset, memUpdated, memAddr +} + +func HandleSysWrite(a0, a1, a2 uint32, lastHint hexutil.Bytes, preimageKey [32]byte, preimageOffset uint32, oracle mipsevm.PreimageOracle, memory *memory.Memory, memTracker MemTracker, stdOut, stdErr io.Writer) (v0, v1 uint32, newLastHint hexutil.Bytes, newPreimageKey common.Hash, newPreimageOffset uint32) { + // args: a0 = fd, a1 = addr, a2 = count + // returns: v0 = written, v1 = err code + v1 = uint32(0) + newLastHint = lastHint + newPreimageKey = preimageKey + newPreimageOffset = preimageOffset + + switch a0 { + case FdStdout: + _, _ = io.Copy(stdOut, memory.ReadMemoryRange(a1, a2)) + v0 = a2 + case FdStderr: + _, _ = io.Copy(stdErr, memory.ReadMemoryRange(a1, a2)) + v0 = a2 + case FdHintWrite: + hintData, _ := io.ReadAll(memory.ReadMemoryRange(a1, a2)) + lastHint = append(lastHint, hintData...) + for len(lastHint) >= 4 { // process while there is enough data to check if there are any hints + hintLen := binary.BigEndian.Uint32(lastHint[:4]) + if hintLen <= uint32(len(lastHint[4:])) { + hint := lastHint[4 : 4+hintLen] // without the length prefix + lastHint = lastHint[4+hintLen:] + oracle.Hint(hint) + } else { + break // stop processing hints if there is incomplete data buffered + } + } + newLastHint = lastHint + v0 = a2 + case FdPreimageWrite: + effAddr := a1 & 0xFFffFFfc + memTracker.TrackMemAccess(effAddr) + mem := memory.GetMemory(effAddr) + key := preimageKey + alignment := a1 & 3 + space := 4 - alignment + if space < a2 { + a2 = space + } + copy(key[:], key[a2:]) + var tmp [4]byte + binary.BigEndian.PutUint32(tmp[:], mem) + copy(key[32-a2:], tmp[alignment:]) + newPreimageKey = key + newPreimageOffset = 0 + //fmt.Printf("updating pre-image key: %s\n", m.state.PreimageKey) + v0 = a2 + default: + v0 = 0xFFffFFff + v1 = MipsEBADF + } + + return v0, v1, newLastHint, newPreimageKey, newPreimageOffset +} + +func HandleSysFcntl(a0, a1 uint32) (v0, v1 uint32) { + // args: a0 = fd, a1 = cmd + v1 = uint32(0) + + if a1 == 3 { // F_GETFL: get file descriptor flags + switch a0 { + case FdStdin, FdPreimageRead, FdHintRead: + v0 = 0 // O_RDONLY + case FdStdout, FdStderr, FdPreimageWrite, FdHintWrite: + v0 = 1 // O_WRONLY + default: + v0 = 0xFFffFFff + v1 = MipsEBADF + } + } else { + v0 = 0xFFffFFff + v1 = MipsEINVAL // cmd not recognized by this kernel + } + + return v0, v1 +} + +func HandleSyscallUpdates(cpu *mipsevm.CpuScalars, registers *[32]uint32, v0, v1 uint32) { + registers[2] = v0 + registers[7] = v1 + + cpu.PC = cpu.NextPC + cpu.NextPC = cpu.NextPC + 4 +} diff --git a/cannon/mipsevm/exec/preimage.go b/cannon/mipsevm/exec/preimage.go new file mode 100644 index 000000000000..15c1f98e9530 --- /dev/null +++ b/cannon/mipsevm/exec/preimage.go @@ -0,0 +1,77 @@ +package exec + +import ( + "encoding/binary" + + "github.com/ethereum-optimism/optimism/cannon/mipsevm" +) + +type PreimageReader interface { + ReadPreimage(key [32]byte, offset uint32) (dat [32]byte, datLen uint32) +} + +// TrackingPreimageOracleReader wraps around a PreimageOracle, implements the PreimageOracle interface, and adds tracking functionality. +// It also implements the PreimageReader interface +type TrackingPreimageOracleReader struct { + po mipsevm.PreimageOracle + + totalPreimageSize int + numPreimageRequests int + + // cached pre-image data, including 8 byte length prefix + lastPreimage []byte + // key for above preimage + lastPreimageKey [32]byte + // offset we last read from, or max uint32 if nothing is read this step + lastPreimageOffset uint32 +} + +func NewTrackingPreimageOracleReader(po mipsevm.PreimageOracle) *TrackingPreimageOracleReader { + return &TrackingPreimageOracleReader{po: po} +} + +func (p *TrackingPreimageOracleReader) Reset() { + p.lastPreimageOffset = ^uint32(0) +} + +func (p *TrackingPreimageOracleReader) Hint(v []byte) { + p.po.Hint(v) +} + +func (p *TrackingPreimageOracleReader) GetPreimage(k [32]byte) []byte { + p.numPreimageRequests++ + preimage := p.po.GetPreimage(k) + p.totalPreimageSize += len(preimage) + return preimage +} + +func (p *TrackingPreimageOracleReader) ReadPreimage(key [32]byte, offset uint32) (dat [32]byte, datLen uint32) { + preimage := p.lastPreimage + if key != p.lastPreimageKey { + p.lastPreimageKey = key + data := p.GetPreimage(key) + // add the length prefix + preimage = make([]byte, 0, 8+len(data)) + preimage = binary.BigEndian.AppendUint64(preimage, uint64(len(data))) + preimage = append(preimage, data...) + p.lastPreimage = preimage + } + p.lastPreimageOffset = offset + if offset >= uint32(len(preimage)) { + panic("Preimage offset out-of-bounds") + } + datLen = uint32(copy(dat[:], preimage[offset:])) + return +} + +func (p *TrackingPreimageOracleReader) LastPreimage() ([32]byte, []byte, uint32) { + return p.lastPreimageKey, p.lastPreimage, p.lastPreimageOffset +} + +func (p *TrackingPreimageOracleReader) TotalPreimageSize() int { + return p.totalPreimageSize +} + +func (p *TrackingPreimageOracleReader) NumPreimageRequests() int { + return p.numPreimageRequests +} diff --git a/cannon/mipsevm/exec/stack.go b/cannon/mipsevm/exec/stack.go new file mode 100644 index 000000000000..06e919c0352f --- /dev/null +++ b/cannon/mipsevm/exec/stack.go @@ -0,0 +1,83 @@ +package exec + +import ( + "errors" + "fmt" + + "github.com/ethereum-optimism/optimism/cannon/mipsevm" +) + +type StackTracker interface { + PushStack(caller uint32, target uint32) + PopStack() +} + +type TraceableStackTracker interface { + StackTracker + Traceback() +} + +type NoopStackTracker struct{} + +func (n *NoopStackTracker) PushStack(caller uint32, target uint32) {} + +func (n *NoopStackTracker) PopStack() {} + +func (n *NoopStackTracker) Traceback() {} + +type StackTrackerImpl struct { + state mipsevm.FPVMState + + stack []uint32 + caller []uint32 + meta mipsevm.Metadata +} + +func NewStackTracker(state mipsevm.FPVMState, meta mipsevm.Metadata) (*StackTrackerImpl, error) { + if meta == nil { + return nil, errors.New("metadata is nil") + } + return NewStackTrackerUnsafe(state, meta), nil +} + +// NewStackTrackerUnsafe creates a new TraceableStackTracker without verifying meta is not nil +func NewStackTrackerUnsafe(state mipsevm.FPVMState, meta mipsevm.Metadata) *StackTrackerImpl { + return &StackTrackerImpl{state: state, meta: meta} +} + +func (s *StackTrackerImpl) PushStack(caller uint32, target uint32) { + s.caller = append(s.caller, caller) + s.stack = append(s.stack, target) +} + +func (s *StackTrackerImpl) PopStack() { + if len(s.stack) != 0 { + fn := s.meta.LookupSymbol(s.state.GetPC()) + topFn := s.meta.LookupSymbol(s.stack[len(s.stack)-1]) + if fn != topFn { + // most likely the function was inlined. Snap back to the last return. + i := len(s.stack) - 1 + for ; i >= 0; i-- { + if s.meta.LookupSymbol(s.stack[i]) == fn { + s.stack = s.stack[:i] + s.caller = s.caller[:i] + break + } + } + } else { + s.stack = s.stack[:len(s.stack)-1] + s.caller = s.caller[:len(s.caller)-1] + } + } else { + fmt.Printf("ERROR: stack underflow at pc=%x. step=%d\n", s.state.GetPC(), s.state.GetStep()) + } +} + +func (s *StackTrackerImpl) Traceback() { + fmt.Printf("traceback at pc=%x. step=%d\n", s.state.GetPC(), s.state.GetStep()) + for i := len(s.stack) - 1; i >= 0; i-- { + jumpAddr := s.stack[i] + idx := len(s.stack) - i - 1 + fmt.Printf("\t%d %x in %s caller=%08x\n", idx, jumpAddr, s.meta.LookupSymbol(jumpAddr), s.caller[i]) + } +} diff --git a/cannon/mipsevm/fuzz_evm_test.go b/cannon/mipsevm/fuzz_evm_test.go deleted file mode 100644 index 3ed3eefb7b38..000000000000 --- a/cannon/mipsevm/fuzz_evm_test.go +++ /dev/null @@ -1,519 +0,0 @@ -package mipsevm - -import ( - "bytes" - "math/rand" - "os" - "testing" - - preimage "github.com/ethereum-optimism/optimism/op-preimage" - "github.com/ethereum/go-ethereum/common" - "github.com/ethereum/go-ethereum/common/hexutil" - "github.com/ethereum/go-ethereum/crypto" - "github.com/stretchr/testify/require" -) - -const syscallInsn = uint32(0x00_00_00_0c) - -func FuzzStateSyscallBrk(f *testing.F) { - contracts, addrs := testContractsSetup(f) - f.Fuzz(func(t *testing.T, pc uint32, step uint64, preimageOffset uint32) { - pc = pc & 0xFF_FF_FF_FC // align PC - nextPC := pc + 4 - state := &State{ - PC: pc, - NextPC: nextPC, - LO: 0, - HI: 0, - Heap: 0, - ExitCode: 0, - Exited: false, - Memory: NewMemory(), - Registers: [32]uint32{2: sysBrk}, - Step: step, - PreimageKey: common.Hash{}, - PreimageOffset: preimageOffset, - } - state.Memory.SetMemory(pc, syscallInsn) - preStateRoot := state.Memory.MerkleRoot() - expectedRegisters := state.Registers - expectedRegisters[2] = 0x4000_0000 - - goState := NewInstrumentedState(state, nil, os.Stdout, os.Stderr) - stepWitness, err := goState.Step(true) - require.NoError(t, err) - require.False(t, stepWitness.HasPreimage()) - - require.Equal(t, pc+4, state.PC) - require.Equal(t, nextPC+4, state.NextPC) - require.Equal(t, uint32(0), state.LO) - require.Equal(t, uint32(0), state.HI) - require.Equal(t, uint32(0), state.Heap) - require.Equal(t, uint8(0), state.ExitCode) - require.Equal(t, false, state.Exited) - require.Equal(t, preStateRoot, state.Memory.MerkleRoot()) - require.Equal(t, expectedRegisters, state.Registers) - require.Equal(t, step+1, state.Step) - require.Equal(t, common.Hash{}, state.PreimageKey) - require.Equal(t, preimageOffset, state.PreimageOffset) - - evm := NewMIPSEVM(contracts, addrs) - evmPost := evm.Step(t, stepWitness) - goPost := goState.state.EncodeWitness() - require.Equal(t, hexutil.Bytes(goPost).String(), hexutil.Bytes(evmPost).String(), - "mipsevm produced different state than EVM") - }) -} - -func FuzzStateSyscallClone(f *testing.F) { - contracts, addrs := testContractsSetup(f) - f.Fuzz(func(t *testing.T, pc uint32, step uint64, preimageOffset uint32) { - pc = pc & 0xFF_FF_FF_FC // align PC - nextPC := pc + 4 - state := &State{ - PC: pc, - NextPC: nextPC, - LO: 0, - HI: 0, - Heap: 0, - ExitCode: 0, - Exited: false, - Memory: NewMemory(), - Registers: [32]uint32{2: sysClone}, - Step: step, - PreimageOffset: preimageOffset, - } - state.Memory.SetMemory(pc, syscallInsn) - preStateRoot := state.Memory.MerkleRoot() - expectedRegisters := state.Registers - expectedRegisters[2] = 0x1 - - goState := NewInstrumentedState(state, nil, os.Stdout, os.Stderr) - stepWitness, err := goState.Step(true) - require.NoError(t, err) - require.False(t, stepWitness.HasPreimage()) - - require.Equal(t, pc+4, state.PC) - require.Equal(t, nextPC+4, state.NextPC) - require.Equal(t, uint32(0), state.LO) - require.Equal(t, uint32(0), state.HI) - require.Equal(t, uint32(0), state.Heap) - require.Equal(t, uint8(0), state.ExitCode) - require.Equal(t, false, state.Exited) - require.Equal(t, preStateRoot, state.Memory.MerkleRoot()) - require.Equal(t, expectedRegisters, state.Registers) - require.Equal(t, step+1, state.Step) - require.Equal(t, common.Hash{}, state.PreimageKey) - require.Equal(t, preimageOffset, state.PreimageOffset) - - evm := NewMIPSEVM(contracts, addrs) - evmPost := evm.Step(t, stepWitness) - goPost := goState.state.EncodeWitness() - require.Equal(t, hexutil.Bytes(goPost).String(), hexutil.Bytes(evmPost).String(), - "mipsevm produced different state than EVM") - }) -} - -func FuzzStateSyscallMmap(f *testing.F) { - contracts, addrs := testContractsSetup(f) - f.Fuzz(func(t *testing.T, addr uint32, siz uint32, heap uint32) { - state := &State{ - PC: 0, - NextPC: 4, - LO: 0, - HI: 0, - Heap: heap, - ExitCode: 0, - Exited: false, - Memory: NewMemory(), - Registers: [32]uint32{2: sysMmap, 4: addr, 5: siz}, - Step: 0, - PreimageOffset: 0, - } - state.Memory.SetMemory(0, syscallInsn) - preStateRoot := state.Memory.MerkleRoot() - preStateRegisters := state.Registers - - goState := NewInstrumentedState(state, nil, os.Stdout, os.Stderr) - stepWitness, err := goState.Step(true) - require.NoError(t, err) - require.False(t, stepWitness.HasPreimage()) - - require.Equal(t, uint32(4), state.PC) - require.Equal(t, uint32(8), state.NextPC) - require.Equal(t, uint32(0), state.LO) - require.Equal(t, uint32(0), state.HI) - require.Equal(t, uint8(0), state.ExitCode) - require.Equal(t, false, state.Exited) - require.Equal(t, preStateRoot, state.Memory.MerkleRoot()) - require.Equal(t, uint64(1), state.Step) - require.Equal(t, common.Hash{}, state.PreimageKey) - require.Equal(t, uint32(0), state.PreimageOffset) - if addr == 0 { - expectedRegisters := preStateRegisters - expectedRegisters[2] = heap - require.Equal(t, expectedRegisters, state.Registers) - sizAlign := siz - if sizAlign&PageAddrMask != 0 { // adjust size to align with page size - sizAlign = siz + PageSize - (siz & PageAddrMask) - } - require.Equal(t, uint32(heap+sizAlign), state.Heap) - } else { - expectedRegisters := preStateRegisters - expectedRegisters[2] = addr - require.Equal(t, expectedRegisters, state.Registers) - require.Equal(t, uint32(heap), state.Heap) - } - - evm := NewMIPSEVM(contracts, addrs) - evmPost := evm.Step(t, stepWitness) - goPost := goState.state.EncodeWitness() - require.Equal(t, hexutil.Bytes(goPost).String(), hexutil.Bytes(evmPost).String(), - "mipsevm produced different state than EVM") - }) -} - -func FuzzStateSyscallExitGroup(f *testing.F) { - contracts, addrs := testContractsSetup(f) - f.Fuzz(func(t *testing.T, exitCode uint8, pc uint32, step uint64) { - pc = pc & 0xFF_FF_FF_FC // align PC - nextPC := pc + 4 - state := &State{ - PC: pc, - NextPC: nextPC, - LO: 0, - HI: 0, - Heap: 0, - ExitCode: 0, - Exited: false, - Memory: NewMemory(), - Registers: [32]uint32{2: sysExitGroup, 4: uint32(exitCode)}, - Step: step, - PreimageOffset: 0, - } - state.Memory.SetMemory(pc, syscallInsn) - preStateRoot := state.Memory.MerkleRoot() - preStateRegisters := state.Registers - - goState := NewInstrumentedState(state, nil, os.Stdout, os.Stderr) - stepWitness, err := goState.Step(true) - require.NoError(t, err) - require.False(t, stepWitness.HasPreimage()) - - require.Equal(t, pc, state.PC) - require.Equal(t, nextPC, state.NextPC) - require.Equal(t, uint32(0), state.LO) - require.Equal(t, uint32(0), state.HI) - require.Equal(t, uint32(0), state.Heap) - require.Equal(t, uint8(exitCode), state.ExitCode) - require.Equal(t, true, state.Exited) - require.Equal(t, preStateRoot, state.Memory.MerkleRoot()) - require.Equal(t, preStateRegisters, state.Registers) - require.Equal(t, step+1, state.Step) - require.Equal(t, common.Hash{}, state.PreimageKey) - require.Equal(t, uint32(0), state.PreimageOffset) - - evm := NewMIPSEVM(contracts, addrs) - evmPost := evm.Step(t, stepWitness) - goPost := goState.state.EncodeWitness() - require.Equal(t, hexutil.Bytes(goPost).String(), hexutil.Bytes(evmPost).String(), - "mipsevm produced different state than EVM") - }) -} - -func FuzzStateSyscallFnctl(f *testing.F) { - contracts, addrs := testContractsSetup(f) - f.Fuzz(func(t *testing.T, fd uint32, cmd uint32) { - state := &State{ - PC: 0, - NextPC: 4, - LO: 0, - HI: 0, - Heap: 0, - ExitCode: 0, - Exited: false, - Memory: NewMemory(), - Registers: [32]uint32{2: sysFcntl, 4: fd, 5: cmd}, - Step: 0, - PreimageOffset: 0, - } - state.Memory.SetMemory(0, syscallInsn) - preStateRoot := state.Memory.MerkleRoot() - preStateRegisters := state.Registers - - goState := NewInstrumentedState(state, nil, os.Stdout, os.Stderr) - stepWitness, err := goState.Step(true) - require.NoError(t, err) - require.False(t, stepWitness.HasPreimage()) - - require.Equal(t, uint32(4), state.PC) - require.Equal(t, uint32(8), state.NextPC) - require.Equal(t, uint32(0), state.LO) - require.Equal(t, uint32(0), state.HI) - require.Equal(t, uint32(0), state.Heap) - require.Equal(t, uint8(0), state.ExitCode) - require.Equal(t, false, state.Exited) - require.Equal(t, preStateRoot, state.Memory.MerkleRoot()) - require.Equal(t, uint64(1), state.Step) - require.Equal(t, common.Hash{}, state.PreimageKey) - require.Equal(t, uint32(0), state.PreimageOffset) - if cmd == 3 { - expectedRegisters := preStateRegisters - switch fd { - case fdStdin, fdPreimageRead, fdHintRead: - expectedRegisters[2] = 0 - case fdStdout, fdStderr, fdPreimageWrite, fdHintWrite: - expectedRegisters[2] = 1 - default: - expectedRegisters[2] = 0xFF_FF_FF_FF - expectedRegisters[7] = MipsEBADF - } - require.Equal(t, expectedRegisters, state.Registers) - } else { - expectedRegisters := preStateRegisters - expectedRegisters[2] = 0xFF_FF_FF_FF - expectedRegisters[7] = MipsEINVAL - require.Equal(t, expectedRegisters, state.Registers) - } - - evm := NewMIPSEVM(contracts, addrs) - evmPost := evm.Step(t, stepWitness) - goPost := goState.state.EncodeWitness() - require.Equal(t, hexutil.Bytes(goPost).String(), hexutil.Bytes(evmPost).String(), - "mipsevm produced different state than EVM") - }) -} - -func FuzzStateHintRead(f *testing.F) { - contracts, addrs := testContractsSetup(f) - f.Fuzz(func(t *testing.T, addr uint32, count uint32) { - preimageData := []byte("hello world") - state := &State{ - PC: 0, - NextPC: 4, - LO: 0, - HI: 0, - Heap: 0, - ExitCode: 0, - Exited: false, - Memory: NewMemory(), - Registers: [32]uint32{2: sysRead, 4: fdHintRead, 5: addr, 6: count}, - Step: 0, - PreimageKey: preimage.Keccak256Key(crypto.Keccak256Hash(preimageData)).PreimageKey(), - PreimageOffset: 0, - } - state.Memory.SetMemory(0, syscallInsn) - preStatePreimageKey := state.PreimageKey - preStateRoot := state.Memory.MerkleRoot() - expectedRegisters := state.Registers - expectedRegisters[2] = count - - oracle := staticOracle(t, preimageData) // only used for hinting - goState := NewInstrumentedState(state, oracle, os.Stdout, os.Stderr) - stepWitness, err := goState.Step(true) - require.NoError(t, err) - require.False(t, stepWitness.HasPreimage()) - - require.Equal(t, uint32(4), state.PC) - require.Equal(t, uint32(8), state.NextPC) - require.Equal(t, uint32(0), state.LO) - require.Equal(t, uint32(0), state.HI) - require.Equal(t, uint32(0), state.Heap) - require.Equal(t, uint8(0), state.ExitCode) - require.Equal(t, false, state.Exited) - require.Equal(t, preStateRoot, state.Memory.MerkleRoot()) - require.Equal(t, uint64(1), state.Step) - require.Equal(t, preStatePreimageKey, state.PreimageKey) - require.Equal(t, expectedRegisters, state.Registers) - - evm := NewMIPSEVM(contracts, addrs) - evmPost := evm.Step(t, stepWitness) - goPost := goState.state.EncodeWitness() - require.Equal(t, hexutil.Bytes(goPost).String(), hexutil.Bytes(evmPost).String(), - "mipsevm produced different state than EVM") - }) -} - -func FuzzStatePreimageRead(f *testing.F) { - contracts, addrs := testContractsSetup(f) - f.Fuzz(func(t *testing.T, addr uint32, count uint32, preimageOffset uint32) { - preimageData := []byte("hello world") - if preimageOffset >= uint32(len(preimageData)) { - t.SkipNow() - } - state := &State{ - PC: 0, - NextPC: 4, - LO: 0, - HI: 0, - Heap: 0, - ExitCode: 0, - Exited: false, - Memory: NewMemory(), - Registers: [32]uint32{2: sysRead, 4: fdPreimageRead, 5: addr, 6: count}, - Step: 0, - PreimageKey: preimage.Keccak256Key(crypto.Keccak256Hash(preimageData)).PreimageKey(), - PreimageOffset: preimageOffset, - } - state.Memory.SetMemory(0, syscallInsn) - preStatePreimageKey := state.PreimageKey - preStateRoot := state.Memory.MerkleRoot() - writeLen := count - if writeLen > 4 { - writeLen = 4 - } - if preimageOffset+writeLen > uint32(8+len(preimageData)) { - writeLen = uint32(8+len(preimageData)) - preimageOffset - } - oracle := staticOracle(t, preimageData) - - goState := NewInstrumentedState(state, oracle, os.Stdout, os.Stderr) - stepWitness, err := goState.Step(true) - require.NoError(t, err) - require.True(t, stepWitness.HasPreimage()) - - require.Equal(t, uint32(4), state.PC) - require.Equal(t, uint32(8), state.NextPC) - require.Equal(t, uint32(0), state.LO) - require.Equal(t, uint32(0), state.HI) - require.Equal(t, uint32(0), state.Heap) - require.Equal(t, uint8(0), state.ExitCode) - require.Equal(t, false, state.Exited) - if writeLen > 0 { - // Memory may be unchanged if we're writing the first zero-valued 7 bytes of the pre-image. - //require.NotEqual(t, preStateRoot, state.Memory.MerkleRoot()) - require.Greater(t, state.PreimageOffset, preimageOffset) - } else { - require.Equal(t, preStateRoot, state.Memory.MerkleRoot()) - require.Equal(t, state.PreimageOffset, preimageOffset) - } - require.Equal(t, uint64(1), state.Step) - require.Equal(t, preStatePreimageKey, state.PreimageKey) - - evm := NewMIPSEVM(contracts, addrs) - evmPost := evm.Step(t, stepWitness) - goPost := goState.state.EncodeWitness() - require.Equal(t, hexutil.Bytes(goPost).String(), hexutil.Bytes(evmPost).String(), - "mipsevm produced different state than EVM") - }) -} - -func FuzzStateHintWrite(f *testing.F) { - contracts, addrs := testContractsSetup(f) - f.Fuzz(func(t *testing.T, addr uint32, count uint32, randSeed int64) { - preimageData := []byte("hello world") - state := &State{ - PC: 0, - NextPC: 4, - LO: 0, - HI: 0, - Heap: 0, - ExitCode: 0, - Exited: false, - Memory: NewMemory(), - Registers: [32]uint32{2: sysWrite, 4: fdHintWrite, 5: addr, 6: count}, - Step: 0, - PreimageKey: preimage.Keccak256Key(crypto.Keccak256Hash(preimageData)).PreimageKey(), - PreimageOffset: 0, - 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 - expectedRegisters[2] = count - - oracle := staticOracle(t, preimageData) // only used for hinting - goState := NewInstrumentedState(state, oracle, os.Stdout, os.Stderr) - stepWitness, err := goState.Step(true) - require.NoError(t, err) - require.False(t, stepWitness.HasPreimage()) - - require.Equal(t, uint32(4), state.PC) - require.Equal(t, uint32(8), state.NextPC) - require.Equal(t, uint32(0), state.LO) - require.Equal(t, uint32(0), state.HI) - require.Equal(t, uint32(0), state.Heap) - require.Equal(t, uint8(0), state.ExitCode) - require.Equal(t, false, state.Exited) - require.Equal(t, preStateRoot, state.Memory.MerkleRoot()) - require.Equal(t, uint64(1), state.Step) - require.Equal(t, preStatePreimageKey, state.PreimageKey) - require.Equal(t, expectedRegisters, state.Registers) - - evm := NewMIPSEVM(contracts, addrs) - evmPost := evm.Step(t, stepWitness) - goPost := goState.state.EncodeWitness() - require.Equal(t, hexutil.Bytes(goPost).String(), hexutil.Bytes(evmPost).String(), - "mipsevm produced different state than EVM") - }) -} - -func FuzzStatePreimageWrite(f *testing.F) { - contracts, addrs := testContractsSetup(f) - f.Fuzz(func(t *testing.T, addr uint32, count uint32) { - preimageData := []byte("hello world") - state := &State{ - PC: 0, - NextPC: 4, - LO: 0, - HI: 0, - Heap: 0, - ExitCode: 0, - Exited: false, - Memory: NewMemory(), - Registers: [32]uint32{2: sysWrite, 4: fdPreimageWrite, 5: addr, 6: count}, - Step: 0, - PreimageKey: preimage.Keccak256Key(crypto.Keccak256Hash(preimageData)).PreimageKey(), - PreimageOffset: 128, - } - state.Memory.SetMemory(0, syscallInsn) - preStateRoot := state.Memory.MerkleRoot() - expectedRegisters := state.Registers - sz := 4 - (addr & 0x3) - if sz < count { - count = sz - } - expectedRegisters[2] = count - - oracle := staticOracle(t, preimageData) - goState := NewInstrumentedState(state, oracle, os.Stdout, os.Stderr) - stepWitness, err := goState.Step(true) - require.NoError(t, err) - require.False(t, stepWitness.HasPreimage()) - - require.Equal(t, uint32(4), state.PC) - require.Equal(t, uint32(8), state.NextPC) - require.Equal(t, uint32(0), state.LO) - require.Equal(t, uint32(0), state.HI) - require.Equal(t, uint32(0), state.Heap) - require.Equal(t, uint8(0), state.ExitCode) - require.Equal(t, false, state.Exited) - require.Equal(t, preStateRoot, state.Memory.MerkleRoot()) - require.Equal(t, uint64(1), state.Step) - require.Equal(t, uint32(0), state.PreimageOffset) - require.Equal(t, expectedRegisters, state.Registers) - - evm := NewMIPSEVM(contracts, addrs) - evmPost := evm.Step(t, stepWitness) - goPost := goState.state.EncodeWitness() - require.Equal(t, hexutil.Bytes(goPost).String(), hexutil.Bytes(evmPost).String(), - "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/hex.go b/cannon/mipsevm/hex.go new file mode 100644 index 000000000000..b1f96ed7a105 --- /dev/null +++ b/cannon/mipsevm/hex.go @@ -0,0 +1,14 @@ +package mipsevm + +import "fmt" + +// HexU32 to lazy-format integer attributes for logging +type HexU32 uint32 + +func (v HexU32) String() string { + return fmt.Sprintf("%08x", uint32(v)) +} + +func (v HexU32) MarshalText() ([]byte, error) { + return []byte(v.String()), nil +} diff --git a/cannon/mipsevm/iface.go b/cannon/mipsevm/iface.go new file mode 100644 index 000000000000..8e8d758e9048 --- /dev/null +++ b/cannon/mipsevm/iface.go @@ -0,0 +1,95 @@ +package mipsevm + +import ( + "io" + + "github.com/ethereum-optimism/optimism/cannon/serialize" + "github.com/ethereum/go-ethereum/common" + "github.com/ethereum/go-ethereum/common/hexutil" + "github.com/ethereum/go-ethereum/log" + + "github.com/ethereum-optimism/optimism/cannon/mipsevm/memory" +) + +type FPVMState interface { + serialize.Serializable + + GetMemory() *memory.Memory + + // GetHeap returns the current memory address at the top of the heap + GetHeap() uint32 + + // GetPreimageKey returns the most recently accessed preimage key + GetPreimageKey() common.Hash + + // GetPreimageOffset returns the current offset into the current preimage + GetPreimageOffset() uint32 + + // GetPC returns the currently executing program counter + GetPC() uint32 + + // GetCpu returns the currently active cpu scalars, including the program counter + GetCpu() CpuScalars + + // GetRegistersRef returns a pointer to the currently active registers + GetRegistersRef() *[32]uint32 + + // GetStep returns the current VM step + GetStep() uint64 + + // GetExited returns whether the state exited bit is set + GetExited() bool + + // GetExitCode returns the exit code + GetExitCode() uint8 + + // GetLastHint returns optional metadata which is not part of the VM state itself. + // It is used to remember the last pre-image hint, + // so a VM can start from any state without fetching prior pre-images, + // and instead just repeat the last hint on setup, + // to make sure pre-image requests can be served. + // The first 4 bytes are a uint32 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:]) + GetLastHint() hexutil.Bytes + + // EncodeWitness returns the witness for the current state and the state hash + EncodeWitness() (witness []byte, hash common.Hash) + + // CreateVM creates a FPVM that can operate on this state. + CreateVM(logger log.Logger, po PreimageOracle, stdOut, stdErr io.Writer, meta Metadata) FPVM +} + +type SymbolMatcher func(addr uint32) bool + +type Metadata interface { + LookupSymbol(addr uint32) string + CreateSymbolMatcher(name string) SymbolMatcher +} + +type FPVM interface { + // GetState returns the current state of the VM. The FPVMState is updated by successive calls to Step + GetState() FPVMState + + // Step executes a single instruction and returns the witness for the step + Step(includeProof bool) (*StepWitness, error) + + // CheckInfiniteLoop returns true if the vm is stuck in an infinite loop + CheckInfiniteLoop() bool + + // LastPreimage returns the last preimage accessed by the VM + LastPreimage() (preimageKey [32]byte, preimage []byte, preimageOffset uint32) + + // Traceback prints a traceback of the program to the console + Traceback() + + // GetDebugInfo returns debug information about the VM + GetDebugInfo() *DebugInfo + + // InitDebug initializes the debug mode of the VM + InitDebug() error + + // LookupSymbol returns the symbol located at the specified address. + // May return an empty string if there's no symbol table available. + LookupSymbol(addr uint32) string +} diff --git a/cannon/mipsevm/instrumented.go b/cannon/mipsevm/instrumented.go deleted file mode 100644 index fc276effd89f..000000000000 --- a/cannon/mipsevm/instrumented.go +++ /dev/null @@ -1,86 +0,0 @@ -package mipsevm - -import ( - "io" -) - -type PreimageOracle interface { - Hint(v []byte) - GetPreimage(k [32]byte) []byte -} - -type InstrumentedState struct { - state *State - - stdOut io.Writer - stdErr io.Writer - - lastMemAccess uint32 - memProofEnabled bool - memProof [28 * 32]byte - - preimageOracle PreimageOracle - - // cached pre-image data, including 8 byte length prefix - lastPreimage []byte - // key for above preimage - lastPreimageKey [32]byte - // offset we last read from, or max uint32 if nothing is read this step - lastPreimageOffset uint32 -} - -const ( - fdStdin = 0 - fdStdout = 1 - fdStderr = 2 - fdHintRead = 3 - fdHintWrite = 4 - fdPreimageRead = 5 - fdPreimageWrite = 6 -) - -const ( - MipsEBADF = 0x9 - MipsEINVAL = 0x16 -) - -func NewInstrumentedState(state *State, po PreimageOracle, stdOut, stdErr io.Writer) *InstrumentedState { - return &InstrumentedState{ - state: state, - stdOut: stdOut, - stdErr: stdErr, - preimageOracle: po, - } -} - -func (m *InstrumentedState) Step(proof bool) (wit *StepWitness, err error) { - m.memProofEnabled = proof - m.lastMemAccess = ^uint32(0) - m.lastPreimageOffset = ^uint32(0) - - if proof { - insnProof := m.state.Memory.MerkleProof(m.state.PC) - wit = &StepWitness{ - State: m.state.EncodeWitness(), - MemProof: insnProof[:], - } - } - err = m.mipsStep() - if err != nil { - return nil, err - } - - if proof { - wit.MemProof = append(wit.MemProof, m.memProof[:]...) - if m.lastPreimageOffset != ^uint32(0) { - wit.PreimageOffset = m.lastPreimageOffset - wit.PreimageKey = m.lastPreimageKey - wit.PreimageValue = m.lastPreimage - } - } - return -} - -func (m *InstrumentedState) LastPreimage() ([32]byte, []byte, uint32) { - return m.lastPreimageKey, m.lastPreimage, m.lastPreimageOffset -} diff --git a/cannon/mipsevm/logw.go b/cannon/mipsevm/logw.go index 2622e05068d4..e017ee5f8e30 100644 --- a/cannon/mipsevm/logw.go +++ b/cannon/mipsevm/logw.go @@ -9,8 +9,7 @@ import ( // and expose an io Writer interface, // for the program running within the VM to write to. type LoggingWriter struct { - Name string - Log log.Logger + Log log.Logger } func logAsText(b string) bool { diff --git a/cannon/mipsevm/memory.go b/cannon/mipsevm/memory.go deleted file mode 100644 index e0ff042ed0a7..000000000000 --- a/cannon/mipsevm/memory.go +++ /dev/null @@ -1,337 +0,0 @@ -package mipsevm - -import ( - "encoding/binary" - "encoding/json" - "fmt" - "io" - "math/bits" - "sort" - - "github.com/ethereum/go-ethereum/crypto" -) - -// Note: 2**12 = 4 KiB, the min phys page size in the Go runtime. -const ( - PageAddrSize = 12 - PageKeySize = 32 - PageAddrSize - PageSize = 1 << PageAddrSize - PageAddrMask = PageSize - 1 - MaxPageCount = 1 << PageKeySize - PageKeyMask = MaxPageCount - 1 -) - -func HashPair(left, right [32]byte) [32]byte { - out := crypto.Keccak256Hash(left[:], right[:]) - //fmt.Printf("0x%x 0x%x -> 0x%x\n", left, right, out) - return out -} - -var zeroHashes = func() [256][32]byte { - // empty parts of the tree are all zero. Precompute the hash of each full-zero range sub-tree level. - var out [256][32]byte - for i := 1; i < 256; i++ { - out[i] = HashPair(out[i-1], out[i-1]) - } - return out -}() - -type Memory struct { - // generalized index -> merkle root or nil if invalidated - nodes map[uint64]*[32]byte - - // pageIndex -> cached page - pages map[uint32]*CachedPage - - // Note: since we don't de-alloc pages, we don't do ref-counting. - // Once a page exists, it doesn't leave memory - - // two caches: we often read instructions from one page, and do memory things with another page. - // this prevents map lookups each instruction - lastPageKeys [2]uint32 - lastPage [2]*CachedPage -} - -func NewMemory() *Memory { - return &Memory{ - nodes: make(map[uint64]*[32]byte), - pages: make(map[uint32]*CachedPage), - lastPageKeys: [2]uint32{^uint32(0), ^uint32(0)}, // default to invalid keys, to not match any pages - } -} - -func (m *Memory) PageCount() int { - return len(m.pages) -} - -func (m *Memory) ForEachPage(fn func(pageIndex uint32, page *Page) error) error { - for pageIndex, cachedPage := range m.pages { - if err := fn(pageIndex, cachedPage.Data); err != nil { - return err - } - } - return nil -} - -func (m *Memory) Invalidate(addr uint32) { - // addr must be aligned to 4 bytes - if addr&0x3 != 0 { - panic(fmt.Errorf("unaligned memory access: %x", addr)) - } - - // find page, and invalidate addr within it - if p, ok := m.pageLookup(addr >> PageAddrSize); ok { - prevValid := p.Ok[1] - p.Invalidate(addr & PageAddrMask) - if !prevValid { // if the page was already invalid before, then nodes to mem-root will also still be. - return - } - } else { // no page? nothing to invalidate - return - } - - // find the gindex of the first page covering the address - gindex := ((uint64(1) << 32) | uint64(addr)) >> PageAddrSize - - for gindex > 0 { - m.nodes[gindex] = nil - gindex >>= 1 - } -} - -func (m *Memory) MerkleizeSubtree(gindex uint64) [32]byte { - l := uint64(bits.Len64(gindex)) - if l > 28 { - panic("gindex too deep") - } - if l > PageKeySize { - depthIntoPage := l - 1 - PageKeySize - pageIndex := (gindex >> depthIntoPage) & PageKeyMask - if p, ok := m.pages[uint32(pageIndex)]; ok { - pageGindex := (1 << depthIntoPage) | (gindex & ((1 << depthIntoPage) - 1)) - return p.MerkleizeSubtree(pageGindex) - } else { - return zeroHashes[28-l] // page does not exist - } - } - n, ok := m.nodes[gindex] - if !ok { - // if the node doesn't exist, the whole sub-tree is zeroed - return zeroHashes[28-l] - } - if n != nil { - return *n - } - left := m.MerkleizeSubtree(gindex << 1) - right := m.MerkleizeSubtree((gindex << 1) | 1) - r := HashPair(left, right) - m.nodes[gindex] = &r - return r -} - -func (m *Memory) MerkleProof(addr uint32) (out [28 * 32]byte) { - proof := m.traverseBranch(1, addr, 0) - // encode the proof - for i := 0; i < 28; i++ { - copy(out[i*32:(i+1)*32], proof[i][:]) - } - return out -} - -func (m *Memory) traverseBranch(parent uint64, addr uint32, depth uint8) (proof [][32]byte) { - if depth == 32-5 { - proof = make([][32]byte, 0, 32-5+1) - proof = append(proof, m.MerkleizeSubtree(parent)) - return - } - if depth > 32-5 { - panic("traversed too deep") - } - self := parent << 1 - sibling := self | 1 - if addr&(1<<(31-depth)) != 0 { - self, sibling = sibling, self - } - proof = m.traverseBranch(self, addr, depth+1) - siblingNode := m.MerkleizeSubtree(sibling) - proof = append(proof, siblingNode) - return -} - -func (m *Memory) MerkleRoot() [32]byte { - return m.MerkleizeSubtree(1) -} - -func (m *Memory) pageLookup(pageIndex uint32) (*CachedPage, bool) { - // hit caches - if pageIndex == m.lastPageKeys[0] { - return m.lastPage[0], true - } - if pageIndex == m.lastPageKeys[1] { - return m.lastPage[1], true - } - p, ok := m.pages[pageIndex] - - // only cache existing pages. - if ok { - m.lastPageKeys[1] = m.lastPageKeys[0] - m.lastPage[1] = m.lastPage[0] - m.lastPageKeys[0] = pageIndex - m.lastPage[0] = p - } - - return p, ok -} - -func (m *Memory) SetMemory(addr uint32, v uint32) { - // addr must be aligned to 4 bytes - if addr&0x3 != 0 { - panic(fmt.Errorf("unaligned memory access: %x", addr)) - } - - pageIndex := addr >> PageAddrSize - pageAddr := addr & PageAddrMask - p, ok := m.pageLookup(pageIndex) - if !ok { - // allocate the page if we have not already. - // Go may mmap relatively large ranges, but we only allocate the pages just in time. - p = m.AllocPage(pageIndex) - } else { - m.Invalidate(addr) // invalidate this branch of memory, now that the value changed - } - binary.BigEndian.PutUint32(p.Data[pageAddr:pageAddr+4], v) -} - -func (m *Memory) GetMemory(addr uint32) uint32 { - // addr must be aligned to 4 bytes - if addr&0x3 != 0 { - panic(fmt.Errorf("unaligned memory access: %x", addr)) - } - p, ok := m.pageLookup(addr >> PageAddrSize) - if !ok { - return 0 - } - pageAddr := addr & PageAddrMask - return binary.BigEndian.Uint32(p.Data[pageAddr : pageAddr+4]) -} - -func (m *Memory) AllocPage(pageIndex uint32) *CachedPage { - p := &CachedPage{Data: new(Page)} - m.pages[pageIndex] = p - // make nodes to root - k := (1 << PageKeySize) | uint64(pageIndex) - for k > 0 { - m.nodes[k] = nil - k >>= 1 - } - return p -} - -type pageEntry struct { - Index uint32 `json:"index"` - Data *Page `json:"data"` -} - -func (m *Memory) MarshalJSON() ([]byte, error) { // nosemgrep - pages := make([]pageEntry, 0, len(m.pages)) - for k, p := range m.pages { - pages = append(pages, pageEntry{ - Index: k, - Data: p.Data, - }) - } - sort.Slice(pages, func(i, j int) bool { - return pages[i].Index < pages[j].Index - }) - return json.Marshal(pages) -} - -func (m *Memory) UnmarshalJSON(data []byte) error { - var pages []pageEntry - if err := json.Unmarshal(data, &pages); err != nil { - return err - } - m.nodes = make(map[uint64]*[32]byte) - m.pages = make(map[uint32]*CachedPage) - m.lastPageKeys = [2]uint32{^uint32(0), ^uint32(0)} - m.lastPage = [2]*CachedPage{nil, nil} - for i, p := range pages { - if _, ok := m.pages[p.Index]; ok { - return fmt.Errorf("cannot load duplicate page, entry %d, page index %d", i, p.Index) - } - m.AllocPage(p.Index).Data = p.Data - } - return nil -} - -func (m *Memory) SetMemoryRange(addr uint32, r io.Reader) error { - for { - pageIndex := addr >> PageAddrSize - pageAddr := addr & PageAddrMask - p, ok := m.pageLookup(pageIndex) - if !ok { - p = m.AllocPage(pageIndex) - } - p.InvalidateFull() - n, err := r.Read(p.Data[pageAddr:]) - if err != nil { - if err == io.EOF { - return nil - } - return err - } - addr += uint32(n) - } -} - -type memReader struct { - m *Memory - addr uint32 - count uint32 -} - -func (r *memReader) Read(dest []byte) (n int, err error) { - if r.count == 0 { - return 0, io.EOF - } - - // Keep iterating over memory until we have all our data. - // It may wrap around the address range, and may not be aligned - endAddr := r.addr + r.count - - pageIndex := r.addr >> PageAddrSize - start := r.addr & PageAddrMask - end := uint32(PageSize) - - if pageIndex == (endAddr >> PageAddrSize) { - end = endAddr & PageAddrMask - } - p, ok := r.m.pageLookup(pageIndex) - if ok { - n = copy(dest, p.Data[start:end]) - } else { - n = copy(dest, make([]byte, end-start)) // default to zeroes - } - r.addr += uint32(n) - r.count -= uint32(n) - return n, nil -} - -func (m *Memory) ReadMemoryRange(addr uint32, count uint32) io.Reader { - return &memReader{m: m, addr: addr, count: count} -} - -func (m *Memory) Usage() string { - total := uint64(len(m.pages)) * PageSize - const unit = 1024 - if total < unit { - return fmt.Sprintf("%d B", total) - } - div, exp := uint64(unit), 0 - for n := total / unit; n >= unit; n /= unit { - div *= unit - exp++ - } - // KiB, MiB, GiB, TiB, ... - return fmt.Sprintf("%.1f %ciB", float64(total)/float64(div), "KMGTPE"[exp]) -} diff --git a/cannon/mipsevm/memory/memory.go b/cannon/mipsevm/memory/memory.go new file mode 100644 index 000000000000..392a0482c48e --- /dev/null +++ b/cannon/mipsevm/memory/memory.go @@ -0,0 +1,399 @@ +package memory + +import ( + "encoding/binary" + "encoding/json" + "fmt" + "io" + "math/bits" + "sort" + + "github.com/ethereum/go-ethereum/crypto" +) + +// Note: 2**12 = 4 KiB, the min phys page size in the Go runtime. +const ( + PageAddrSize = 12 + PageKeySize = 32 - PageAddrSize + PageSize = 1 << PageAddrSize + PageAddrMask = PageSize - 1 + MaxPageCount = 1 << PageKeySize + PageKeyMask = MaxPageCount - 1 +) + +const MEM_PROOF_SIZE = 28 * 32 + +func HashPair(left, right [32]byte) [32]byte { + out := crypto.Keccak256Hash(left[:], right[:]) + //fmt.Printf("0x%x 0x%x -> 0x%x\n", left, right, out) + return out +} + +var zeroHashes = func() [256][32]byte { + // empty parts of the tree are all zero. Precompute the hash of each full-zero range sub-tree level. + var out [256][32]byte + for i := 1; i < 256; i++ { + out[i] = HashPair(out[i-1], out[i-1]) + } + return out +}() + +type Memory struct { + // generalized index -> merkle root or nil if invalidated + nodes map[uint64]*[32]byte + + // pageIndex -> cached page + pages map[uint32]*CachedPage + + // Note: since we don't de-alloc pages, we don't do ref-counting. + // Once a page exists, it doesn't leave memory + + // two caches: we often read instructions from one page, and do memory things with another page. + // this prevents map lookups each instruction + lastPageKeys [2]uint32 + lastPage [2]*CachedPage +} + +func NewMemory() *Memory { + return &Memory{ + nodes: make(map[uint64]*[32]byte), + pages: make(map[uint32]*CachedPage), + lastPageKeys: [2]uint32{^uint32(0), ^uint32(0)}, // default to invalid keys, to not match any pages + } +} + +func (m *Memory) PageCount() int { + return len(m.pages) +} + +func (m *Memory) ForEachPage(fn func(pageIndex uint32, page *Page) error) error { + for pageIndex, cachedPage := range m.pages { + if err := fn(pageIndex, cachedPage.Data); err != nil { + return err + } + } + return nil +} + +func (m *Memory) Invalidate(addr uint32) { + // addr must be aligned to 4 bytes + if addr&0x3 != 0 { + panic(fmt.Errorf("unaligned memory access: %x", addr)) + } + + // find page, and invalidate addr within it + if p, ok := m.pageLookup(addr >> PageAddrSize); ok { + prevValid := p.Ok[1] + p.Invalidate(addr & PageAddrMask) + if !prevValid { // if the page was already invalid before, then nodes to mem-root will also still be. + return + } + } else { // no page? nothing to invalidate + return + } + + // find the gindex of the first page covering the address + gindex := ((uint64(1) << 32) | uint64(addr)) >> PageAddrSize + + for gindex > 0 { + m.nodes[gindex] = nil + gindex >>= 1 + } +} + +func (m *Memory) MerkleizeSubtree(gindex uint64) [32]byte { + l := uint64(bits.Len64(gindex)) + if l > 28 { + panic("gindex too deep") + } + if l > PageKeySize { + depthIntoPage := l - 1 - PageKeySize + pageIndex := (gindex >> depthIntoPage) & PageKeyMask + if p, ok := m.pages[uint32(pageIndex)]; ok { + pageGindex := (1 << depthIntoPage) | (gindex & ((1 << depthIntoPage) - 1)) + return p.MerkleizeSubtree(pageGindex) + } else { + return zeroHashes[28-l] // page does not exist + } + } + n, ok := m.nodes[gindex] + if !ok { + // if the node doesn't exist, the whole sub-tree is zeroed + return zeroHashes[28-l] + } + if n != nil { + return *n + } + left := m.MerkleizeSubtree(gindex << 1) + right := m.MerkleizeSubtree((gindex << 1) | 1) + r := HashPair(left, right) + m.nodes[gindex] = &r + return r +} + +func (m *Memory) MerkleProof(addr uint32) (out [MEM_PROOF_SIZE]byte) { + proof := m.traverseBranch(1, addr, 0) + // encode the proof + for i := 0; i < 28; i++ { + copy(out[i*32:(i+1)*32], proof[i][:]) + } + return out +} + +func (m *Memory) traverseBranch(parent uint64, addr uint32, depth uint8) (proof [][32]byte) { + if depth == 32-5 { + proof = make([][32]byte, 0, 32-5+1) + proof = append(proof, m.MerkleizeSubtree(parent)) + return + } + if depth > 32-5 { + panic("traversed too deep") + } + self := parent << 1 + sibling := self | 1 + if addr&(1<<(31-depth)) != 0 { + self, sibling = sibling, self + } + proof = m.traverseBranch(self, addr, depth+1) + siblingNode := m.MerkleizeSubtree(sibling) + proof = append(proof, siblingNode) + return +} + +func (m *Memory) MerkleRoot() [32]byte { + return m.MerkleizeSubtree(1) +} + +func (m *Memory) pageLookup(pageIndex uint32) (*CachedPage, bool) { + // hit caches + if pageIndex == m.lastPageKeys[0] { + return m.lastPage[0], true + } + if pageIndex == m.lastPageKeys[1] { + return m.lastPage[1], true + } + p, ok := m.pages[pageIndex] + + // only cache existing pages. + if ok { + m.lastPageKeys[1] = m.lastPageKeys[0] + m.lastPage[1] = m.lastPage[0] + m.lastPageKeys[0] = pageIndex + m.lastPage[0] = p + } + + return p, ok +} + +func (m *Memory) SetMemory(addr uint32, v uint32) { + // addr must be aligned to 4 bytes + if addr&0x3 != 0 { + panic(fmt.Errorf("unaligned memory access: %x", addr)) + } + + pageIndex := addr >> PageAddrSize + pageAddr := addr & PageAddrMask + p, ok := m.pageLookup(pageIndex) + if !ok { + // allocate the page if we have not already. + // Go may mmap relatively large ranges, but we only allocate the pages just in time. + p = m.AllocPage(pageIndex) + } else { + m.Invalidate(addr) // invalidate this branch of memory, now that the value changed + } + binary.BigEndian.PutUint32(p.Data[pageAddr:pageAddr+4], v) +} + +func (m *Memory) GetMemory(addr uint32) uint32 { + // addr must be aligned to 4 bytes + if addr&0x3 != 0 { + panic(fmt.Errorf("unaligned memory access: %x", addr)) + } + p, ok := m.pageLookup(addr >> PageAddrSize) + if !ok { + return 0 + } + pageAddr := addr & PageAddrMask + return binary.BigEndian.Uint32(p.Data[pageAddr : pageAddr+4]) +} + +func (m *Memory) AllocPage(pageIndex uint32) *CachedPage { + p := &CachedPage{Data: new(Page)} + m.pages[pageIndex] = p + // make nodes to root + k := (1 << PageKeySize) | uint64(pageIndex) + for k > 0 { + m.nodes[k] = nil + k >>= 1 + } + return p +} + +type pageEntry struct { + Index uint32 `json:"index"` + Data *Page `json:"data"` +} + +func (m *Memory) MarshalJSON() ([]byte, error) { // nosemgrep + pages := make([]pageEntry, 0, len(m.pages)) + for k, p := range m.pages { + pages = append(pages, pageEntry{ + Index: k, + Data: p.Data, + }) + } + sort.Slice(pages, func(i, j int) bool { + return pages[i].Index < pages[j].Index + }) + return json.Marshal(pages) +} + +func (m *Memory) UnmarshalJSON(data []byte) error { + var pages []pageEntry + if err := json.Unmarshal(data, &pages); err != nil { + return err + } + m.nodes = make(map[uint64]*[32]byte) + m.pages = make(map[uint32]*CachedPage) + m.lastPageKeys = [2]uint32{^uint32(0), ^uint32(0)} + m.lastPage = [2]*CachedPage{nil, nil} + for i, p := range pages { + if _, ok := m.pages[p.Index]; ok { + return fmt.Errorf("cannot load duplicate page, entry %d, page index %d", i, p.Index) + } + m.AllocPage(p.Index).Data = p.Data + } + return nil +} + +func (m *Memory) SetMemoryRange(addr uint32, r io.Reader) error { + for { + pageIndex := addr >> PageAddrSize + pageAddr := addr & PageAddrMask + p, ok := m.pageLookup(pageIndex) + if !ok { + p = m.AllocPage(pageIndex) + } + p.InvalidateFull() + n, err := r.Read(p.Data[pageAddr:]) + if err != nil { + if err == io.EOF { + return nil + } + return err + } + addr += uint32(n) + } +} + +// Serialize writes the memory in a simple binary format which can be read again using Deserialize +// The format is a simple concatenation of fields, with prefixed item count for repeating items and using big endian +// encoding for numbers. +// +// len(PageCount) uint32 +// For each page (order is arbitrary): +// +// page index uint32 +// page Data [PageSize]byte +func (m *Memory) Serialize(out io.Writer) error { + if err := binary.Write(out, binary.BigEndian, uint32(m.PageCount())); err != nil { + return err + } + for pageIndex, page := range m.pages { + if err := binary.Write(out, binary.BigEndian, pageIndex); err != nil { + return err + } + if _, err := out.Write(page.Data[:]); err != nil { + return err + } + } + return nil +} + +func (m *Memory) Deserialize(in io.Reader) error { + var pageCount uint32 + if err := binary.Read(in, binary.BigEndian, &pageCount); err != nil { + return err + } + for i := uint32(0); i < pageCount; i++ { + var pageIndex uint32 + if err := binary.Read(in, binary.BigEndian, &pageIndex); err != nil { + return err + } + page := m.AllocPage(pageIndex) + if _, err := io.ReadFull(in, page.Data[:]); err != nil { + return err + } + } + return nil +} + +func (m *Memory) Copy() *Memory { + out := NewMemory() + out.nodes = make(map[uint64]*[32]byte) + out.pages = make(map[uint32]*CachedPage) + out.lastPageKeys = [2]uint32{^uint32(0), ^uint32(0)} + out.lastPage = [2]*CachedPage{nil, nil} + for k, page := range m.pages { + data := new(Page) + *data = *page.Data + out.AllocPage(k).Data = data + } + return out +} + +type memReader struct { + m *Memory + addr uint32 + count uint32 +} + +func (r *memReader) Read(dest []byte) (n int, err error) { + if r.count == 0 { + return 0, io.EOF + } + + // Keep iterating over memory until we have all our data. + // It may wrap around the address range, and may not be aligned + endAddr := r.addr + r.count + + pageIndex := r.addr >> PageAddrSize + start := r.addr & PageAddrMask + end := uint32(PageSize) + + if pageIndex == (endAddr >> PageAddrSize) { + end = endAddr & PageAddrMask + } + p, ok := r.m.pageLookup(pageIndex) + if ok { + n = copy(dest, p.Data[start:end]) + } else { + n = copy(dest, make([]byte, end-start)) // default to zeroes + } + r.addr += uint32(n) + r.count -= uint32(n) + return n, nil +} + +func (m *Memory) ReadMemoryRange(addr uint32, count uint32) io.Reader { + return &memReader{m: m, addr: addr, count: count} +} + +func (m *Memory) UsageRaw() uint64 { + return uint64(len(m.pages)) * PageSize +} + +func (m *Memory) Usage() string { + total := m.UsageRaw() + const unit = 1024 + if total < unit { + return fmt.Sprintf("%d B", total) + } + div, exp := uint64(unit), 0 + for n := total / unit; n >= unit; n /= unit { + div *= unit + exp++ + } + // KiB, MiB, GiB, TiB, ... + return fmt.Sprintf("%.1f %ciB", float64(total)/float64(div), "KMGTPE"[exp]) +} diff --git a/cannon/mipsevm/memory_test.go b/cannon/mipsevm/memory/memory_test.go similarity index 96% rename from cannon/mipsevm/memory_test.go rename to cannon/mipsevm/memory/memory_test.go index a8b840553437..5f3f9301e552 100644 --- a/cannon/mipsevm/memory_test.go +++ b/cannon/mipsevm/memory/memory_test.go @@ -1,4 +1,4 @@ -package mipsevm +package memory import ( "bytes" @@ -187,3 +187,11 @@ func TestMemoryJSON(t *testing.T) { require.NoError(t, json.Unmarshal(dat, &res)) require.Equal(t, uint32(123), res.GetMemory(8)) } + +func TestMemoryCopy(t *testing.T) { + m := NewMemory() + m.SetMemory(0x8000, 123) + mcpy := m.Copy() + require.Equal(t, uint32(123), mcpy.GetMemory(0x8000)) + require.Equal(t, m.MerkleRoot(), mcpy.MerkleRoot()) +} diff --git a/cannon/mipsevm/page.go b/cannon/mipsevm/memory/page.go similarity index 99% rename from cannon/mipsevm/page.go rename to cannon/mipsevm/memory/page.go index 5a1321582f1e..d3c3096b418e 100644 --- a/cannon/mipsevm/page.go +++ b/cannon/mipsevm/memory/page.go @@ -1,4 +1,4 @@ -package mipsevm +package memory import ( "bytes" diff --git a/cannon/mipsevm/page_test.go b/cannon/mipsevm/memory/page_test.go similarity index 98% rename from cannon/mipsevm/page_test.go rename to cannon/mipsevm/memory/page_test.go index 8fba0645203a..c2960421b670 100644 --- a/cannon/mipsevm/page_test.go +++ b/cannon/mipsevm/memory/page_test.go @@ -1,4 +1,4 @@ -package mipsevm +package memory import ( "testing" diff --git a/cannon/mipsevm/mips.go b/cannon/mipsevm/mips.go deleted file mode 100644 index c51d945deeaf..000000000000 --- a/cannon/mipsevm/mips.go +++ /dev/null @@ -1,569 +0,0 @@ -package mipsevm - -import ( - "encoding/binary" - "fmt" - "io" -) - -const ( - sysMmap = 4090 - sysBrk = 4045 - sysClone = 4120 - sysExitGroup = 4246 - sysRead = 4003 - sysWrite = 4004 - sysFcntl = 4055 -) - -func (m *InstrumentedState) readPreimage(key [32]byte, offset uint32) (dat [32]byte, datLen uint32) { - preimage := m.lastPreimage - if key != m.lastPreimageKey { - m.lastPreimageKey = key - data := m.preimageOracle.GetPreimage(key) - // add the length prefix - preimage = make([]byte, 0, 8+len(data)) - preimage = binary.BigEndian.AppendUint64(preimage, uint64(len(data))) - preimage = append(preimage, data...) - m.lastPreimage = preimage - } - m.lastPreimageOffset = offset - datLen = uint32(copy(dat[:], preimage[offset:])) - return -} - -func (m *InstrumentedState) trackMemAccess(effAddr uint32) { - if m.memProofEnabled && m.lastMemAccess != effAddr { - if m.lastMemAccess != ^uint32(0) { - panic(fmt.Errorf("unexpected different mem access at %08x, already have access at %08x buffered", effAddr, m.lastMemAccess)) - } - m.lastMemAccess = effAddr - m.memProof = m.state.Memory.MerkleProof(effAddr) - } -} - -func (m *InstrumentedState) handleSyscall() error { - syscallNum := m.state.Registers[2] // v0 - v0 := uint32(0) - v1 := uint32(0) - - a0 := m.state.Registers[4] - a1 := m.state.Registers[5] - a2 := m.state.Registers[6] - - //fmt.Printf("syscall: %d\n", syscallNum) - switch syscallNum { - case sysMmap: - sz := a1 - if sz&PageAddrMask != 0 { // adjust size to align with page size - sz += PageSize - (sz & PageAddrMask) - } - if a0 == 0 { - v0 = m.state.Heap - //fmt.Printf("mmap heap 0x%x size 0x%x\n", v0, sz) - m.state.Heap += sz - } else { - v0 = a0 - //fmt.Printf("mmap hint 0x%x size 0x%x\n", v0, sz) - } - case sysBrk: - v0 = 0x40000000 - case sysClone: // clone (not supported) - v0 = 1 - case sysExitGroup: - m.state.Exited = true - m.state.ExitCode = uint8(a0) - return nil - case sysRead: - // args: a0 = fd, a1 = addr, a2 = count - // returns: v0 = read, v1 = err code - switch a0 { - case fdStdin: - // leave v0 and v1 zero: read nothing, no error - case fdPreimageRead: // pre-image oracle - effAddr := a1 & 0xFFffFFfc - m.trackMemAccess(effAddr) - mem := m.state.Memory.GetMemory(effAddr) - dat, datLen := m.readPreimage(m.state.PreimageKey, m.state.PreimageOffset) - //fmt.Printf("reading pre-image data: addr: %08x, offset: %d, datLen: %d, data: %x, key: %s count: %d\n", a1, m.state.PreimageOffset, datLen, dat[:datLen], m.state.PreimageKey, a2) - alignment := a1 & 3 - space := 4 - alignment - if space < datLen { - datLen = space - } - if a2 < datLen { - datLen = a2 - } - var outMem [4]byte - binary.BigEndian.PutUint32(outMem[:], mem) - copy(outMem[alignment:], dat[:datLen]) - m.state.Memory.SetMemory(effAddr, binary.BigEndian.Uint32(outMem[:])) - m.state.PreimageOffset += datLen - v0 = datLen - //fmt.Printf("read %d pre-image bytes, new offset: %d, eff addr: %08x mem: %08x\n", datLen, m.state.PreimageOffset, effAddr, outMem) - case fdHintRead: // hint response - // don't actually read into memory, just say we read it all, we ignore the result anyway - v0 = a2 - default: - v0 = 0xFFffFFff - v1 = MipsEBADF - } - case sysWrite: - // args: a0 = fd, a1 = addr, a2 = count - // returns: v0 = written, v1 = err code - switch a0 { - case fdStdout: - _, _ = io.Copy(m.stdOut, m.state.Memory.ReadMemoryRange(a1, a2)) - v0 = a2 - case fdStderr: - _, _ = io.Copy(m.stdErr, m.state.Memory.ReadMemoryRange(a1, a2)) - v0 = a2 - case fdHintWrite: - hintData, _ := io.ReadAll(m.state.Memory.ReadMemoryRange(a1, a2)) - 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:])) { - hint := m.state.LastHint[4 : 4+hintLen] // without the length prefix - m.state.LastHint = m.state.LastHint[4+hintLen:] - m.preimageOracle.Hint(hint) - } else { - break // stop processing hints if there is incomplete data buffered - } - } - v0 = a2 - case fdPreimageWrite: - effAddr := a1 & 0xFFffFFfc - m.trackMemAccess(effAddr) - mem := m.state.Memory.GetMemory(effAddr) - key := m.state.PreimageKey - alignment := a1 & 3 - space := 4 - alignment - if space < a2 { - a2 = space - } - copy(key[:], key[a2:]) - var tmp [4]byte - binary.BigEndian.PutUint32(tmp[:], mem) - copy(key[32-a2:], tmp[alignment:]) - m.state.PreimageKey = key - m.state.PreimageOffset = 0 - //fmt.Printf("updating pre-image key: %s\n", m.state.PreimageKey) - v0 = a2 - default: - v0 = 0xFFffFFff - v1 = MipsEBADF - } - case sysFcntl: - // args: a0 = fd, a1 = cmd - if a1 == 3 { // F_GETFL: get file descriptor flags - switch a0 { - case fdStdin, fdPreimageRead, fdHintRead: - v0 = 0 // O_RDONLY - case fdStdout, fdStderr, fdPreimageWrite, fdHintWrite: - v0 = 1 // O_WRONLY - default: - v0 = 0xFFffFFff - v1 = MipsEBADF - } - } else { - v0 = 0xFFffFFff - v1 = MipsEINVAL // cmd not recognized by this kernel - } - } - m.state.Registers[2] = v0 - m.state.Registers[7] = v1 - - m.state.PC = m.state.NextPC - m.state.NextPC = m.state.NextPC + 4 - return nil -} - -func (m *InstrumentedState) handleBranch(opcode uint32, insn uint32, rtReg uint32, rs uint32) error { - if m.state.NextPC != m.state.PC+4 { - panic("branch in delay slot") - } - - shouldBranch := false - if opcode == 4 || opcode == 5 { // beq/bne - rt := m.state.Registers[rtReg] - shouldBranch = (rs == rt && opcode == 4) || (rs != rt && opcode == 5) - } else if opcode == 6 { - shouldBranch = int32(rs) <= 0 // blez - } else if opcode == 7 { - shouldBranch = int32(rs) > 0 // bgtz - } else if opcode == 1 { - // regimm - rtv := (insn >> 16) & 0x1F - if rtv == 0 { // bltz - shouldBranch = int32(rs) < 0 - } - if rtv == 1 { // bgez - shouldBranch = int32(rs) >= 0 - } - } - - prevPC := m.state.PC - m.state.PC = m.state.NextPC // execute the delay slot first - if shouldBranch { - m.state.NextPC = prevPC + 4 + (SE(insn&0xFFFF, 16) << 2) // then continue with the instruction the branch jumps to. - } else { - m.state.NextPC = m.state.NextPC + 4 // branch not taken - } - return nil -} - -func (m *InstrumentedState) handleHiLo(fun uint32, rs uint32, rt uint32, storeReg uint32) error { - val := uint32(0) - switch fun { - case 0x10: // mfhi - val = m.state.HI - case 0x11: // mthi - m.state.HI = rs - case 0x12: // mflo - val = m.state.LO - case 0x13: // mtlo - m.state.LO = rs - case 0x18: // mult - acc := uint64(int64(int32(rs)) * int64(int32(rt))) - m.state.HI = uint32(acc >> 32) - m.state.LO = uint32(acc) - case 0x19: // multu - acc := uint64(uint64(rs) * uint64(rt)) - m.state.HI = uint32(acc >> 32) - m.state.LO = uint32(acc) - case 0x1a: // div - m.state.HI = uint32(int32(rs) % int32(rt)) - m.state.LO = uint32(int32(rs) / int32(rt)) - case 0x1b: // divu - m.state.HI = rs % rt - m.state.LO = rs / rt - } - - if storeReg != 0 { - m.state.Registers[storeReg] = val - } - - m.state.PC = m.state.NextPC - m.state.NextPC = m.state.NextPC + 4 - return nil -} - -func (m *InstrumentedState) handleJump(linkReg uint32, dest uint32) error { - if m.state.NextPC != m.state.PC+4 { - panic("jump in delay slot") - } - prevPC := m.state.PC - m.state.PC = m.state.NextPC - m.state.NextPC = dest - if linkReg != 0 { - m.state.Registers[linkReg] = prevPC + 8 // set the link-register to the instr after the delay slot instruction. - } - return nil -} - -func (m *InstrumentedState) handleRd(storeReg uint32, val uint32, conditional bool) error { - if storeReg >= 32 { - panic("invalid register") - } - if storeReg != 0 && conditional { - m.state.Registers[storeReg] = val - } - m.state.PC = m.state.NextPC - m.state.NextPC = m.state.NextPC + 4 - return nil -} - -func (m *InstrumentedState) mipsStep() error { - if m.state.Exited { - return nil - } - m.state.Step += 1 - // instruction fetch - insn := m.state.Memory.GetMemory(m.state.PC) - opcode := insn >> 26 // 6-bits - - // j-type j/jal - if opcode == 2 || opcode == 3 { - linkReg := uint32(0) - if opcode == 3 { - linkReg = 31 - } - // Take top 4 bits of the next PC (its 256 MB region), and concatenate with the 26-bit offset - target := (m.state.NextPC & 0xF0000000) | ((insn & 0x03FFFFFF) << 2) - return m.handleJump(linkReg, target) - } - - // register fetch - rs := uint32(0) // source register 1 value - rt := uint32(0) // source register 2 / temp value - rtReg := (insn >> 16) & 0x1F - - // R-type or I-type (stores rt) - rs = m.state.Registers[(insn>>21)&0x1F] - rdReg := rtReg - if opcode == 0 || opcode == 0x1c { - // R-type (stores rd) - rt = m.state.Registers[rtReg] - rdReg = (insn >> 11) & 0x1F - } else if opcode < 0x20 { - // rt is SignExtImm - // don't sign extend for andi, ori, xori - if opcode == 0xC || opcode == 0xD || opcode == 0xe { - // ZeroExtImm - rt = insn & 0xFFFF - } else { - // SignExtImm - rt = SE(insn&0xFFFF, 16) - } - } else if opcode >= 0x28 || opcode == 0x22 || opcode == 0x26 { - // store rt value with store - rt = m.state.Registers[rtReg] - - // store actual rt with lwl and lwr - rdReg = rtReg - } - - if (opcode >= 4 && opcode < 8) || opcode == 1 { - return m.handleBranch(opcode, insn, rtReg, rs) - } - - storeAddr := uint32(0xFF_FF_FF_FF) - // memory fetch (all I-type) - // we do the load for stores also - mem := uint32(0) - if opcode >= 0x20 { - // M[R[rs]+SignExtImm] - rs += SE(insn&0xFFFF, 16) - addr := rs & 0xFFFFFFFC - m.trackMemAccess(addr) - mem = m.state.Memory.GetMemory(addr) - if opcode >= 0x28 && opcode != 0x30 { - // store - storeAddr = addr - // store opcodes don't write back to a register - rdReg = 0 - } - } - - // ALU - val := execute(insn, rs, rt, mem) - - fun := insn & 0x3f // 6-bits - if opcode == 0 && fun >= 8 && fun < 0x1c { - if fun == 8 || fun == 9 { // jr/jalr - linkReg := uint32(0) - if fun == 9 { - linkReg = rdReg - } - return m.handleJump(linkReg, rs) - } - - if fun == 0xa { // movz - return m.handleRd(rdReg, rs, rt == 0) - } - if fun == 0xb { // movn - return m.handleRd(rdReg, rs, rt != 0) - } - - // syscall (can read and write) - if fun == 0xC { - return m.handleSyscall() - } - - // lo and hi registers - // can write back - if fun >= 0x10 && fun < 0x1c { - return m.handleHiLo(fun, rs, rt, rdReg) - } - } - - // stupid sc, write a 1 to rt - if opcode == 0x38 && rtReg != 0 { - m.state.Registers[rtReg] = 1 - } - - // write memory - if storeAddr != 0xFF_FF_FF_FF { - m.trackMemAccess(storeAddr) - m.state.Memory.SetMemory(storeAddr, val) - } - - // write back the value to destination register - return m.handleRd(rdReg, val, true) -} - -func execute(insn uint32, rs uint32, rt uint32, mem uint32) uint32 { - opcode := insn >> 26 // 6-bits - - if opcode == 0 || (opcode >= 8 && opcode < 0xF) { - fun := insn & 0x3f // 6-bits - // transform ArithLogI to SPECIAL - switch opcode { - case 8: - fun = 0x20 // addi - case 9: - fun = 0x21 // addiu - case 0xA: - fun = 0x2A // slti - case 0xB: - fun = 0x2B // sltiu - case 0xC: - fun = 0x24 // andi - case 0xD: - fun = 0x25 // ori - case 0xE: - fun = 0x26 // xori - } - - switch fun { - case 0x00: // sll - return rt << ((insn >> 6) & 0x1F) - case 0x02: // srl - return rt >> ((insn >> 6) & 0x1F) - case 0x03: // sra - shamt := (insn >> 6) & 0x1F - return SE(rt>>shamt, 32-shamt) - case 0x04: // sllv - return rt << (rs & 0x1F) - case 0x06: // srlv - return rt >> (rs & 0x1F) - case 0x07: // srav - return SE(rt>>rs, 32-rs) - // functs in range [0x8, 0x1b] are handled specially by other functions - case 0x08: // jr - return rs - case 0x09: // jalr - return rs - case 0x0a: // movz - return rs - case 0x0b: // movn - return rs - case 0x0c: // syscall - return rs - // 0x0d - break not supported - case 0x0f: // sync - return rs - case 0x10: // mfhi - return rs - case 0x11: // mthi - return rs - case 0x12: // mflo - return rs - case 0x13: // mtlo - return rs - case 0x18: // mult - return rs - case 0x19: // multu - return rs - case 0x1a: // div - return rs - case 0x1b: // divu - return rs - // The rest includes transformed R-type arith imm instructions - case 0x20: // add - return rs + rt - case 0x21: // addu - return rs + rt - case 0x22: // sub - return rs - rt - case 0x23: // subu - return rs - rt - case 0x24: // and - return rs & rt - case 0x25: // or - return rs | rt - case 0x26: // xor - return rs ^ rt - case 0x27: // nor - return ^(rs | rt) - case 0x2a: // slti - if int32(rs) < int32(rt) { - return 1 - } - return 0 - case 0x2b: // sltiu - if rs < rt { - return 1 - } - return 0 - default: - panic("invalid instruction") - } - } else { - switch opcode { - // SPECIAL2 - case 0x1C: - fun := insn & 0x3f // 6-bits - switch fun { - case 0x2: // mul - return uint32(int32(rs) * int32(rt)) - case 0x20, 0x21: // clz, clo - if fun == 0x20 { - rs = ^rs - } - i := uint32(0) - for ; rs&0x80000000 != 0; i++ { - rs <<= 1 - } - return i - } - case 0x0F: // lui - return rt << 16 - case 0x20: // lb - return SE((mem>>(24-(rs&3)*8))&0xFF, 8) - case 0x21: // lh - return SE((mem>>(16-(rs&2)*8))&0xFFFF, 16) - case 0x22: // lwl - val := mem << ((rs & 3) * 8) - mask := uint32(0xFFFFFFFF) << ((rs & 3) * 8) - return (rt & ^mask) | val - case 0x23: // lw - return mem - case 0x24: // lbu - return (mem >> (24 - (rs&3)*8)) & 0xFF - case 0x25: // lhu - return (mem >> (16 - (rs&2)*8)) & 0xFFFF - case 0x26: // lwr - val := mem >> (24 - (rs&3)*8) - mask := uint32(0xFFFFFFFF) >> (24 - (rs&3)*8) - return (rt & ^mask) | val - case 0x28: // sb - val := (rt & 0xFF) << (24 - (rs&3)*8) - mask := 0xFFFFFFFF ^ uint32(0xFF<<(24-(rs&3)*8)) - return (mem & mask) | val - case 0x29: // sh - val := (rt & 0xFFFF) << (16 - (rs&2)*8) - mask := 0xFFFFFFFF ^ uint32(0xFFFF<<(16-(rs&2)*8)) - return (mem & mask) | val - case 0x2a: // swl - val := rt >> ((rs & 3) * 8) - mask := uint32(0xFFFFFFFF) >> ((rs & 3) * 8) - return (mem & ^mask) | val - case 0x2b: // sw - return rt - case 0x2e: // swr - val := rt << (24 - (rs&3)*8) - mask := uint32(0xFFFFFFFF) << (24 - (rs&3)*8) - return (mem & ^mask) | val - case 0x30: // ll - return mem - case 0x38: // sc - return rt - default: - panic("invalid instruction") - } - } - panic("invalid instruction") -} - -func SE(dat uint32, idx uint32) uint32 { - isSigned := (dat >> (idx - 1)) != 0 - signed := ((uint32(1) << (32 - idx)) - 1) << idx - mask := (uint32(1) << idx) - 1 - if isSigned { - return dat&mask | signed - } else { - return dat & mask - } -} diff --git a/cannon/mipsevm/multithreaded/instrumented.go b/cannon/mipsevm/multithreaded/instrumented.go new file mode 100644 index 000000000000..ac76d6cdb532 --- /dev/null +++ b/cannon/mipsevm/multithreaded/instrumented.go @@ -0,0 +1,119 @@ +package multithreaded + +import ( + "io" + + "github.com/ethereum/go-ethereum/common/hexutil" + "github.com/ethereum/go-ethereum/log" + + "github.com/ethereum-optimism/optimism/cannon/mipsevm" + "github.com/ethereum-optimism/optimism/cannon/mipsevm/exec" +) + +type InstrumentedState struct { + state *State + + log log.Logger + stdOut io.Writer + stdErr io.Writer + + memoryTracker *exec.MemoryTrackerImpl + stackTracker ThreadedStackTracker + + preimageOracle *exec.TrackingPreimageOracleReader + meta mipsevm.Metadata +} + +var _ mipsevm.FPVM = (*InstrumentedState)(nil) + +func NewInstrumentedState(state *State, po mipsevm.PreimageOracle, stdOut, stdErr io.Writer, log log.Logger, meta mipsevm.Metadata) *InstrumentedState { + return &InstrumentedState{ + state: state, + log: log, + stdOut: stdOut, + stdErr: stdErr, + memoryTracker: exec.NewMemoryTracker(state.Memory), + stackTracker: &NoopThreadedStackTracker{}, + preimageOracle: exec.NewTrackingPreimageOracleReader(po), + meta: meta, + } +} + +func (m *InstrumentedState) InitDebug() error { + stackTracker, err := NewThreadedStackTracker(m.state, m.meta) + if err != nil { + return err + } + m.stackTracker = stackTracker + return nil +} + +func (m *InstrumentedState) Step(proof bool) (wit *mipsevm.StepWitness, err error) { + m.preimageOracle.Reset() + m.memoryTracker.Reset(proof) + + if proof { + proofData := make([]byte, 0) + threadProof := m.state.EncodeThreadProof() + insnProof := m.state.Memory.MerkleProof(m.state.GetPC()) + proofData = append(proofData, threadProof[:]...) + proofData = append(proofData, insnProof[:]...) + + encodedWitness, stateHash := m.state.EncodeWitness() + wit = &mipsevm.StepWitness{ + State: encodedWitness, + StateHash: stateHash, + ProofData: proofData, + } + } + err = m.mipsStep() + if err != nil { + return nil, err + } + + if proof { + memProof := m.memoryTracker.MemProof() + memProof2 := m.memoryTracker.MemProof2() + wit.ProofData = append(wit.ProofData, memProof[:]...) + wit.ProofData = append(wit.ProofData, memProof2[:]...) + lastPreimageKey, lastPreimage, lastPreimageOffset := m.preimageOracle.LastPreimage() + if lastPreimageOffset != ^uint32(0) { + wit.PreimageOffset = lastPreimageOffset + wit.PreimageKey = lastPreimageKey + wit.PreimageValue = lastPreimage + } + } + return +} + +func (m *InstrumentedState) CheckInfiniteLoop() bool { + return false +} + +func (m *InstrumentedState) LastPreimage() ([32]byte, []byte, uint32) { + return m.preimageOracle.LastPreimage() +} + +func (m *InstrumentedState) GetState() mipsevm.FPVMState { + return m.state +} + +func (m *InstrumentedState) GetDebugInfo() *mipsevm.DebugInfo { + return &mipsevm.DebugInfo{ + Pages: m.state.Memory.PageCount(), + MemoryUsed: hexutil.Uint64(m.state.Memory.UsageRaw()), + NumPreimageRequests: m.preimageOracle.NumPreimageRequests(), + TotalPreimageSize: m.preimageOracle.TotalPreimageSize(), + } +} + +func (m *InstrumentedState) Traceback() { + m.stackTracker.Traceback() +} + +func (m *InstrumentedState) LookupSymbol(addr uint32) string { + if m.meta == nil { + return "" + } + return m.meta.LookupSymbol(addr) +} diff --git a/cannon/mipsevm/multithreaded/instrumented_test.go b/cannon/mipsevm/multithreaded/instrumented_test.go new file mode 100644 index 000000000000..b3ce2d95eac3 --- /dev/null +++ b/cannon/mipsevm/multithreaded/instrumented_test.go @@ -0,0 +1,104 @@ +package multithreaded + +import ( + "bytes" + "io" + "os" + "testing" + + "github.com/ethereum/go-ethereum/log" + "github.com/stretchr/testify/require" + + "github.com/ethereum-optimism/optimism/cannon/mipsevm" + "github.com/ethereum-optimism/optimism/cannon/mipsevm/memory" + "github.com/ethereum-optimism/optimism/cannon/mipsevm/testutil" +) + +func vmFactory(state *State, po mipsevm.PreimageOracle, stdOut, stdErr io.Writer, log log.Logger) mipsevm.FPVM { + return NewInstrumentedState(state, po, stdOut, stdErr, log, nil) +} + +func TestInstrumentedState_OpenMips(t *testing.T) { + t.Parallel() + // TODO: Add mt-specific tests here + testutil.RunVMTests_OpenMips(t, CreateEmptyState, vmFactory, "clone.bin") +} + +func TestInstrumentedState_Hello(t *testing.T) { + t.Parallel() + testutil.RunVMTest_Hello(t, CreateInitialState, vmFactory, false) +} + +func TestInstrumentedState_Claim(t *testing.T) { + t.Parallel() + testutil.RunVMTest_Claim(t, CreateInitialState, vmFactory, false) +} + +func TestInstrumentedState_MultithreadedProgram(t *testing.T) { + t.Parallel() + state, _ := testutil.LoadELFProgram(t, "../../testdata/example/bin/multithreaded.elf", CreateInitialState, false) + oracle := testutil.StaticOracle(t, []byte{}) + + var stdOutBuf, stdErrBuf bytes.Buffer + us := NewInstrumentedState(state, oracle, io.MultiWriter(&stdOutBuf, os.Stdout), io.MultiWriter(&stdErrBuf, os.Stderr), testutil.CreateLogger(), nil) + for i := 0; i < 1_000_000; i++ { + if us.GetState().GetExited() { + break + } + _, err := us.Step(false) + require.NoError(t, err) + } + t.Logf("Completed in %d steps", state.Step) + + require.True(t, state.Exited, "must complete program") + require.Equal(t, uint8(0), state.ExitCode, "exit with 0") + require.Contains(t, "waitgroup result: 42", stdErrBuf.String()) + require.Contains(t, "channels result: 1234", stdErrBuf.String()) + require.Equal(t, "", stdErrBuf.String(), "should not print any errors") +} + +func TestInstrumentedState_Alloc(t *testing.T) { + if os.Getenv("SKIP_SLOW_TESTS") == "true" { + t.Skip("Skipping slow test because SKIP_SLOW_TESTS is enabled") + } + + const MiB = 1024 * 1024 + + cases := []struct { + name string + numAllocs int + allocSize int + maxMemoryUsageCheck int + }{ + {name: "10 32MiB allocations", numAllocs: 10, allocSize: 32 * MiB, maxMemoryUsageCheck: 256 * MiB}, + {name: "5 64MiB allocations", numAllocs: 5, allocSize: 64 * MiB, maxMemoryUsageCheck: 256 * MiB}, + {name: "5 128MiB allocations", numAllocs: 5, allocSize: 128 * MiB, maxMemoryUsageCheck: 128 * 3 * MiB}, + } + + for _, test := range cases { + test := test + t.Run(test.name, func(t *testing.T) { + t.Parallel() + state, _ := testutil.LoadELFProgram(t, "../../testdata/example/bin/alloc.elf", CreateInitialState, false) + oracle := testutil.AllocOracle(t, test.numAllocs, test.allocSize) + + us := NewInstrumentedState(state, oracle, os.Stdout, os.Stderr, testutil.CreateLogger(), nil) + // emulation shouldn't take more than 20 B steps + for i := 0; i < 20_000_000_000; i++ { + if us.GetState().GetExited() { + break + } + _, err := us.Step(false) + require.NoError(t, err) + if state.Step%10_000_000 == 0 { + t.Logf("Completed %d steps", state.Step) + } + } + memUsage := state.Memory.PageCount() * memory.PageSize + t.Logf("Completed in %d steps. cannon memory usage: %d KiB", state.Step, memUsage/1024/1024.0) + require.True(t, state.Exited, "must complete program") + require.Equal(t, uint8(0), state.ExitCode, "exit with 0") + require.Less(t, memUsage, test.maxMemoryUsageCheck, "memory allocation is too large") + }) + } +} diff --git a/cannon/mipsevm/multithreaded/mips.go b/cannon/mipsevm/multithreaded/mips.go new file mode 100644 index 000000000000..daa36d05c0ff --- /dev/null +++ b/cannon/mipsevm/multithreaded/mips.go @@ -0,0 +1,438 @@ +package multithreaded + +import ( + "context" + "fmt" + + "github.com/ethereum/go-ethereum/common" + "github.com/ethereum/go-ethereum/common/hexutil" + "github.com/ethereum/go-ethereum/log" + + "github.com/ethereum-optimism/optimism/cannon/mipsevm" + "github.com/ethereum-optimism/optimism/cannon/mipsevm/exec" + "github.com/ethereum-optimism/optimism/cannon/mipsevm/program" +) + +func (m *InstrumentedState) handleSyscall() error { + thread := m.state.GetCurrentThread() + + syscallNum, a0, a1, a2, a3 := exec.GetSyscallArgs(m.state.GetRegistersRef()) + v0 := uint32(0) + v1 := uint32(0) + + //fmt.Printf("syscall: %d\n", syscallNum) + switch syscallNum { + case exec.SysMmap: + var newHeap uint32 + v0, v1, newHeap = exec.HandleSysMmap(a0, a1, m.state.Heap) + m.state.Heap = newHeap + case exec.SysBrk: + v0 = program.PROGRAM_BREAK + case exec.SysClone: // clone + // a0 = flag bitmask, a1 = stack pointer + if exec.ValidCloneFlags != a0 { + m.state.Exited = true + m.state.ExitCode = mipsevm.VMStatusPanic + return nil + } + + v0 = m.state.NextThreadId + v1 = 0 + newThread := &ThreadState{ + ThreadId: m.state.NextThreadId, + ExitCode: 0, + Exited: false, + FutexAddr: exec.FutexEmptyAddr, + FutexVal: 0, + FutexTimeoutStep: 0, + Cpu: mipsevm.CpuScalars{ + PC: thread.Cpu.NextPC, + NextPC: thread.Cpu.NextPC + 4, + HI: thread.Cpu.HI, + LO: thread.Cpu.LO, + }, + Registers: thread.Registers, + } + + newThread.Registers[29] = a1 + // the child will perceive a 0 value as returned value instead, and no error + newThread.Registers[2] = 0 + newThread.Registers[7] = 0 + m.state.NextThreadId++ + + // Preempt this thread for the new one. But not before updating PCs + stackCaller := thread.Cpu.PC + stackTarget := thread.Cpu.NextPC + exec.HandleSyscallUpdates(&thread.Cpu, &thread.Registers, v0, v1) + m.pushThread(newThread) + // Note: We need to call stackTracker after pushThread + // to ensure we are tracking in the context of the new thread + m.stackTracker.PushStack(stackCaller, stackTarget) + return nil + case exec.SysExitGroup: + m.state.Exited = true + m.state.ExitCode = uint8(a0) + return nil + case exec.SysRead: + var newPreimageOffset uint32 + var memUpdated bool + var memAddr uint32 + v0, v1, newPreimageOffset, memUpdated, memAddr = exec.HandleSysRead(a0, a1, a2, m.state.PreimageKey, m.state.PreimageOffset, m.preimageOracle, m.state.Memory, m.memoryTracker) + m.state.PreimageOffset = newPreimageOffset + if memUpdated { + m.handleMemoryUpdate(memAddr) + } + case exec.SysWrite: + var newLastHint hexutil.Bytes + var newPreimageKey common.Hash + var newPreimageOffset uint32 + v0, v1, newLastHint, newPreimageKey, newPreimageOffset = exec.HandleSysWrite(a0, a1, a2, m.state.LastHint, m.state.PreimageKey, m.state.PreimageOffset, m.preimageOracle, m.state.Memory, m.memoryTracker, m.stdOut, m.stdErr) + m.state.LastHint = newLastHint + m.state.PreimageKey = newPreimageKey + m.state.PreimageOffset = newPreimageOffset + case exec.SysFcntl: + v0, v1 = exec.HandleSysFcntl(a0, a1) + case exec.SysGetTID: + v0 = thread.ThreadId + v1 = 0 + case exec.SysExit: + thread.Exited = true + thread.ExitCode = uint8(a0) + if m.lastThreadRemaining() { + m.state.Exited = true + m.state.ExitCode = uint8(a0) + } + return nil + case exec.SysFutex: + // args: a0 = addr, a1 = op, a2 = val, a3 = timeout + effAddr := a0 & 0xFFffFFfc + switch a1 { + case exec.FutexWaitPrivate: + m.memoryTracker.TrackMemAccess(effAddr) + mem := m.state.Memory.GetMemory(effAddr) + if mem != a2 { + v0 = exec.SysErrorSignal + v1 = exec.MipsEAGAIN + } else { + thread.FutexAddr = effAddr + thread.FutexVal = a2 + if a3 == 0 { + thread.FutexTimeoutStep = exec.FutexNoTimeout + } else { + thread.FutexTimeoutStep = m.state.Step + exec.FutexTimeoutSteps + } + // Leave cpu scalars as-is. This instruction will be completed by `onWaitComplete` + return nil + } + case exec.FutexWakePrivate: + // Trigger thread traversal starting from the left stack until we find one waiting on the wakeup + // address + m.state.Wakeup = effAddr + // Don't indicate to the program that we've woken up a waiting thread, as there are no guarantees. + // The woken up thread should indicate this in userspace. + v0 = 0 + v1 = 0 + exec.HandleSyscallUpdates(&thread.Cpu, &thread.Registers, v0, v1) + m.preemptThread(thread) + m.state.TraverseRight = len(m.state.LeftThreadStack) == 0 + return nil + default: + v0 = exec.SysErrorSignal + v1 = exec.MipsEINVAL + } + case exec.SysSchedYield, exec.SysNanosleep: + v0 = 0 + v1 = 0 + exec.HandleSyscallUpdates(&thread.Cpu, &thread.Registers, v0, v1) + m.preemptThread(thread) + return nil + case exec.SysOpen: + v0 = exec.SysErrorSignal + v1 = exec.MipsEBADF + case exec.SysClockGetTime: + switch a0 { + case exec.ClockGettimeRealtimeFlag, exec.ClockGettimeMonotonicFlag: + v0, v1 = 0, 0 + var secs, nsecs uint32 + if a0 == exec.ClockGettimeMonotonicFlag { + // monotonic clock_gettime is used by Go guest programs for goroutine scheduling and to implement + // `time.Sleep` (and other sleep related operations). + secs = uint32(m.state.Step / exec.HZ) + nsecs = uint32((m.state.Step % exec.HZ) * (1_000_000_000 / exec.HZ)) + } // else realtime set to Unix Epoch + + effAddr := a1 & 0xFFffFFfc + m.memoryTracker.TrackMemAccess(effAddr) + m.state.Memory.SetMemory(effAddr, secs) + m.handleMemoryUpdate(effAddr) + m.memoryTracker.TrackMemAccess2(effAddr + 4) + m.state.Memory.SetMemory(effAddr+4, nsecs) + m.handleMemoryUpdate(effAddr + 4) + default: + v0 = exec.SysErrorSignal + v1 = exec.MipsEINVAL + } + case exec.SysGetpid: + v0 = 0 + v1 = 0 + case exec.SysMunmap: + case exec.SysGetAffinity: + case exec.SysMadvise: + case exec.SysRtSigprocmask: + case exec.SysSigaltstack: + case exec.SysRtSigaction: + case exec.SysPrlimit64: + case exec.SysClose: + case exec.SysPread64: + case exec.SysFstat64: + case exec.SysOpenAt: + case exec.SysReadlink: + case exec.SysReadlinkAt: + case exec.SysIoctl: + case exec.SysEpollCreate1: + case exec.SysPipe2: + case exec.SysEpollCtl: + case exec.SysEpollPwait: + case exec.SysGetRandom: + case exec.SysUname: + case exec.SysStat64: + case exec.SysGetuid: + case exec.SysGetgid: + case exec.SysLlseek: + case exec.SysMinCore: + case exec.SysTgkill: + case exec.SysSetITimer: + case exec.SysTimerCreate: + case exec.SysTimerSetTime: + case exec.SysTimerDelete: + default: + m.Traceback() + panic(fmt.Sprintf("unrecognized syscall: %d", syscallNum)) + } + + exec.HandleSyscallUpdates(&thread.Cpu, &thread.Registers, v0, v1) + return nil +} + +func (m *InstrumentedState) mipsStep() error { + if m.state.Exited { + return nil + } + m.state.Step += 1 + thread := m.state.GetCurrentThread() + + // During wakeup traversal, search for the first thread blocked on the wakeup address. + // Don't allow regular execution until we have found such a thread or else we have visited all threads. + if m.state.Wakeup != exec.FutexEmptyAddr { + // We are currently performing a wakeup traversal + if m.state.Wakeup == thread.FutexAddr { + // We found a target thread, resume normal execution and process this thread + m.state.Wakeup = exec.FutexEmptyAddr + } else { + // This is not the thread we're looking for, move on + traversingRight := m.state.TraverseRight + changedDirections := m.preemptThread(thread) + if traversingRight && changedDirections { + // We started the wakeup traversal walking left and we've now walked all the way right + // We have therefore visited all threads and can resume normal thread execution + m.state.Wakeup = exec.FutexEmptyAddr + } + } + return nil + } + + if thread.Exited { + m.popThread() + m.stackTracker.DropThread(thread.ThreadId) + return nil + } + + // check if thread is blocked on a futex + if thread.FutexAddr != exec.FutexEmptyAddr { + // if set, then check futex + // check timeout first + if m.state.Step > thread.FutexTimeoutStep { + // timeout! Allow execution + m.onWaitComplete(thread, true) + return nil + } else { + effAddr := thread.FutexAddr & 0xFFffFFfc + m.memoryTracker.TrackMemAccess(effAddr) + mem := m.state.Memory.GetMemory(effAddr) + if thread.FutexVal == mem { + // still got expected value, continue sleeping, try next thread. + m.preemptThread(thread) + return nil + } else { + // wake thread up, the value at its address changed! + // Userspace can turn thread back to sleep if it was too sporadic. + m.onWaitComplete(thread, false) + return nil + } + } + } + + if m.state.StepsSinceLastContextSwitch >= exec.SchedQuantum { + // Force a context switch as this thread has been active too long + if m.state.ThreadCount() > 1 { + // Log if we're hitting our context switch limit - only matters if we have > 1 thread + if m.log.Enabled(context.Background(), log.LevelTrace) { + msg := fmt.Sprintf("Thread has reached maximum execution steps (%v) - preempting.", exec.SchedQuantum) + m.log.Trace(msg, "threadId", thread.ThreadId, "threadCount", m.state.ThreadCount(), "pc", thread.Cpu.PC) + } + } + m.preemptThread(thread) + return nil + } + m.state.StepsSinceLastContextSwitch += 1 + + //instruction fetch + insn, opcode, fun := exec.GetInstructionDetails(m.state.GetPC(), m.state.Memory) + + // Handle syscall separately + // syscall (can read and write) + if opcode == 0 && fun == 0xC { + return m.handleSyscall() + } + + // Handle RMW (read-modify-write) ops + if opcode == exec.OpLoadLinked || opcode == exec.OpStoreConditional { + return m.handleRMWOps(insn, opcode) + } + + // Exec the rest of the step logic + memUpdated, memAddr, err := exec.ExecMipsCoreStepLogic(m.state.getCpuRef(), m.state.GetRegistersRef(), m.state.Memory, insn, opcode, fun, m.memoryTracker, m.stackTracker) + if err != nil { + return err + } + if memUpdated { + m.handleMemoryUpdate(memAddr) + } + + return nil +} + +func (m *InstrumentedState) handleMemoryUpdate(memAddr uint32) { + if memAddr == m.state.LLAddress { + // Reserved address was modified, clear the reservation + m.clearLLMemoryReservation() + } +} + +func (m *InstrumentedState) clearLLMemoryReservation() { + m.state.LLReservationActive = false + m.state.LLAddress = 0 + m.state.LLOwnerThread = 0 +} + +// handleRMWOps handles LL and SC operations which provide the primitives to implement read-modify-write operations +func (m *InstrumentedState) handleRMWOps(insn, opcode uint32) error { + baseReg := (insn >> 21) & 0x1F + base := m.state.GetRegistersRef()[baseReg] + rtReg := (insn >> 16) & 0x1F + offset := exec.SignExtendImmediate(insn) + + effAddr := (base + offset) & 0xFFFFFFFC + m.memoryTracker.TrackMemAccess(effAddr) + mem := m.state.Memory.GetMemory(effAddr) + + var retVal uint32 + threadId := m.state.GetCurrentThread().ThreadId + if opcode == exec.OpLoadLinked { + retVal = mem + m.state.LLReservationActive = true + m.state.LLAddress = effAddr + m.state.LLOwnerThread = threadId + } else if opcode == exec.OpStoreConditional { + // Check if our memory reservation is still intact + if m.state.LLReservationActive && m.state.LLOwnerThread == threadId && m.state.LLAddress == effAddr { + // Complete atomic update: set memory and return 1 for success + m.clearLLMemoryReservation() + rt := m.state.GetRegistersRef()[rtReg] + m.state.Memory.SetMemory(effAddr, rt) + retVal = 1 + } else { + // Atomic update failed, return 0 for failure + retVal = 0 + } + } else { + panic(fmt.Sprintf("Invalid instruction passed to handleRMWOps (opcode %08x)", opcode)) + } + + return exec.HandleRd(m.state.getCpuRef(), m.state.GetRegistersRef(), rtReg, retVal, true) +} + +func (m *InstrumentedState) onWaitComplete(thread *ThreadState, isTimedOut bool) { + // Clear the futex state + thread.FutexAddr = exec.FutexEmptyAddr + thread.FutexVal = 0 + thread.FutexTimeoutStep = 0 + + // Complete the FUTEX_WAIT syscall + v0 := uint32(0) + v1 := uint32(0) + if isTimedOut { + v0 = exec.SysErrorSignal + v1 = exec.MipsETIMEDOUT + } + exec.HandleSyscallUpdates(&thread.Cpu, &thread.Registers, v0, v1) + + // Clear wakeup signal + m.state.Wakeup = exec.FutexEmptyAddr +} + +func (m *InstrumentedState) preemptThread(thread *ThreadState) bool { + // Pop thread from the current stack and push to the other stack + if m.state.TraverseRight { + rtThreadCnt := len(m.state.RightThreadStack) + if rtThreadCnt == 0 { + panic("empty right thread stack") + } + m.state.RightThreadStack = m.state.RightThreadStack[:rtThreadCnt-1] + m.state.LeftThreadStack = append(m.state.LeftThreadStack, thread) + } else { + lftThreadCnt := len(m.state.LeftThreadStack) + if lftThreadCnt == 0 { + panic("empty left thread stack") + } + m.state.LeftThreadStack = m.state.LeftThreadStack[:lftThreadCnt-1] + m.state.RightThreadStack = append(m.state.RightThreadStack, thread) + } + + changeDirections := false + current := m.state.getActiveThreadStack() + if len(current) == 0 { + m.state.TraverseRight = !m.state.TraverseRight + changeDirections = true + } + + m.state.StepsSinceLastContextSwitch = 0 + return changeDirections +} + +func (m *InstrumentedState) pushThread(thread *ThreadState) { + if m.state.TraverseRight { + m.state.RightThreadStack = append(m.state.RightThreadStack, thread) + } else { + m.state.LeftThreadStack = append(m.state.LeftThreadStack, thread) + } + m.state.StepsSinceLastContextSwitch = 0 +} + +func (m *InstrumentedState) popThread() { + if m.state.TraverseRight { + m.state.RightThreadStack = m.state.RightThreadStack[:len(m.state.RightThreadStack)-1] + } else { + m.state.LeftThreadStack = m.state.LeftThreadStack[:len(m.state.LeftThreadStack)-1] + } + + current := m.state.getActiveThreadStack() + if len(current) == 0 { + m.state.TraverseRight = !m.state.TraverseRight + } + m.state.StepsSinceLastContextSwitch = 0 +} + +func (m *InstrumentedState) lastThreadRemaining() bool { + return m.state.ThreadCount() == 1 +} diff --git a/cannon/mipsevm/multithreaded/stack.go b/cannon/mipsevm/multithreaded/stack.go new file mode 100644 index 000000000000..4fc32c221ee8 --- /dev/null +++ b/cannon/mipsevm/multithreaded/stack.go @@ -0,0 +1,67 @@ +package multithreaded + +import ( + "errors" + + "github.com/ethereum-optimism/optimism/cannon/mipsevm" + "github.com/ethereum-optimism/optimism/cannon/mipsevm/exec" +) + +type ThreadedStackTracker interface { + exec.TraceableStackTracker + DropThread(threadId uint32) +} + +type NoopThreadedStackTracker struct { + exec.NoopStackTracker +} + +var _ ThreadedStackTracker = (*ThreadedStackTrackerImpl)(nil) + +func (n *NoopThreadedStackTracker) DropThread(threadId uint32) {} + +type ThreadedStackTrackerImpl struct { + meta mipsevm.Metadata + state *State + trackersByThreadId map[uint32]exec.TraceableStackTracker +} + +var _ ThreadedStackTracker = (*ThreadedStackTrackerImpl)(nil) + +func NewThreadedStackTracker(state *State, meta mipsevm.Metadata) (*ThreadedStackTrackerImpl, error) { + if meta == nil { + return nil, errors.New("metadata is nil") + } + + return &ThreadedStackTrackerImpl{ + state: state, + meta: meta, + trackersByThreadId: make(map[uint32]exec.TraceableStackTracker), + }, nil +} + +func (t *ThreadedStackTrackerImpl) PushStack(caller uint32, target uint32) { + t.getCurrentTracker().PushStack(caller, target) +} + +func (t *ThreadedStackTrackerImpl) PopStack() { + t.getCurrentTracker().PopStack() +} + +func (t *ThreadedStackTrackerImpl) Traceback() { + t.getCurrentTracker().Traceback() +} + +func (t *ThreadedStackTrackerImpl) getCurrentTracker() exec.TraceableStackTracker { + thread := t.state.GetCurrentThread() + tracker, exists := t.trackersByThreadId[thread.ThreadId] + if !exists { + tracker = exec.NewStackTrackerUnsafe(t.state, t.meta) + t.trackersByThreadId[thread.ThreadId] = tracker + } + return tracker +} + +func (t *ThreadedStackTrackerImpl) DropThread(threadId uint32) { + delete(t.trackersByThreadId, threadId) +} diff --git a/cannon/mipsevm/multithreaded/state.go b/cannon/mipsevm/multithreaded/state.go new file mode 100644 index 000000000000..f93a99564958 --- /dev/null +++ b/cannon/mipsevm/multithreaded/state.go @@ -0,0 +1,435 @@ +package multithreaded + +import ( + "encoding/binary" + "fmt" + "io" + + "github.com/ethereum/go-ethereum/common" + "github.com/ethereum/go-ethereum/common/hexutil" + "github.com/ethereum/go-ethereum/crypto" + "github.com/ethereum/go-ethereum/log" + + "github.com/ethereum-optimism/optimism/cannon/mipsevm" + "github.com/ethereum-optimism/optimism/cannon/mipsevm/exec" + "github.com/ethereum-optimism/optimism/cannon/mipsevm/memory" + "github.com/ethereum-optimism/optimism/cannon/serialize" +) + +// STATE_WITNESS_SIZE is the size of the state witness encoding in bytes. +const STATE_WITNESS_SIZE = 172 +const ( + MEMROOT_WITNESS_OFFSET = 0 + PREIMAGE_KEY_WITNESS_OFFSET = MEMROOT_WITNESS_OFFSET + 32 + PREIMAGE_OFFSET_WITNESS_OFFSET = PREIMAGE_KEY_WITNESS_OFFSET + 32 + HEAP_WITNESS_OFFSET = PREIMAGE_OFFSET_WITNESS_OFFSET + 4 + LL_RESERVATION_ACTIVE_OFFSET = HEAP_WITNESS_OFFSET + 4 + LL_ADDRESS_OFFSET = LL_RESERVATION_ACTIVE_OFFSET + 1 + LL_OWNER_THREAD_OFFSET = LL_ADDRESS_OFFSET + 4 + EXITCODE_WITNESS_OFFSET = LL_OWNER_THREAD_OFFSET + 4 + EXITED_WITNESS_OFFSET = EXITCODE_WITNESS_OFFSET + 1 + STEP_WITNESS_OFFSET = EXITED_WITNESS_OFFSET + 1 + STEPS_SINCE_CONTEXT_SWITCH_WITNESS_OFFSET = STEP_WITNESS_OFFSET + 8 + WAKEUP_WITNESS_OFFSET = STEPS_SINCE_CONTEXT_SWITCH_WITNESS_OFFSET + 8 + TRAVERSE_RIGHT_WITNESS_OFFSET = WAKEUP_WITNESS_OFFSET + 4 + LEFT_THREADS_ROOT_WITNESS_OFFSET = TRAVERSE_RIGHT_WITNESS_OFFSET + 1 + RIGHT_THREADS_ROOT_WITNESS_OFFSET = LEFT_THREADS_ROOT_WITNESS_OFFSET + 32 + THREAD_ID_WITNESS_OFFSET = RIGHT_THREADS_ROOT_WITNESS_OFFSET + 32 +) + +type State struct { + Memory *memory.Memory + + PreimageKey common.Hash + PreimageOffset uint32 // note that the offset includes the 8-byte length prefix + + Heap uint32 // to handle mmap growth + LLReservationActive bool // Whether there is an active memory reservation initiated via the LL (load linked) op + LLAddress uint32 // The "linked" memory address reserved via the LL (load linked) op + LLOwnerThread uint32 // The id of the thread that holds the reservation on LLAddress + + ExitCode uint8 + Exited bool + + Step uint64 + StepsSinceLastContextSwitch uint64 + Wakeup uint32 + + TraverseRight bool + LeftThreadStack []*ThreadState + RightThreadStack []*ThreadState + NextThreadId uint32 + + // LastHint is optional metadata, and not part of the VM state itself. + LastHint hexutil.Bytes +} + +var _ mipsevm.FPVMState = (*State)(nil) + +func CreateEmptyState() *State { + initThread := CreateEmptyThread() + + return &State{ + Memory: memory.NewMemory(), + Heap: 0, + LLReservationActive: false, + LLAddress: 0, + LLOwnerThread: 0, + ExitCode: 0, + Exited: false, + Step: 0, + Wakeup: exec.FutexEmptyAddr, + TraverseRight: false, + LeftThreadStack: []*ThreadState{initThread}, + RightThreadStack: []*ThreadState{}, + NextThreadId: initThread.ThreadId + 1, + } +} + +func CreateInitialState(pc, heapStart uint32) *State { + state := CreateEmptyState() + currentThread := state.GetCurrentThread() + currentThread.Cpu.PC = pc + currentThread.Cpu.NextPC = pc + 4 + state.Heap = heapStart + + return state +} + +func (s *State) CreateVM(logger log.Logger, po mipsevm.PreimageOracle, stdOut, stdErr io.Writer, meta mipsevm.Metadata) mipsevm.FPVM { + logger.Info("Using cannon multithreaded VM") + return NewInstrumentedState(s, po, stdOut, stdErr, logger, meta) +} + +func (s *State) GetCurrentThread() *ThreadState { + activeStack := s.getActiveThreadStack() + + activeStackSize := len(activeStack) + if activeStackSize == 0 { + panic("Active thread stack is empty") + } + + return activeStack[activeStackSize-1] +} + +func (s *State) getActiveThreadStack() []*ThreadState { + var activeStack []*ThreadState + if s.TraverseRight { + activeStack = s.RightThreadStack + } else { + activeStack = s.LeftThreadStack + } + + return activeStack +} + +func (s *State) getRightThreadStackRoot() common.Hash { + return s.calculateThreadStackRoot(s.RightThreadStack) +} + +func (s *State) getLeftThreadStackRoot() common.Hash { + return s.calculateThreadStackRoot(s.LeftThreadStack) +} + +func (s *State) calculateThreadStackRoot(stack []*ThreadState) common.Hash { + curRoot := EmptyThreadsRoot + for _, thread := range stack { + curRoot = computeThreadRoot(curRoot, thread) + } + + return curRoot +} + +func (s *State) GetPC() uint32 { + activeThread := s.GetCurrentThread() + return activeThread.Cpu.PC +} + +func (s *State) GetCpu() mipsevm.CpuScalars { + activeThread := s.GetCurrentThread() + return activeThread.Cpu +} + +func (s *State) getCpuRef() *mipsevm.CpuScalars { + return &s.GetCurrentThread().Cpu +} + +func (s *State) GetRegistersRef() *[32]uint32 { + activeThread := s.GetCurrentThread() + return &activeThread.Registers +} + +func (s *State) GetExitCode() uint8 { return s.ExitCode } + +func (s *State) GetExited() bool { return s.Exited } + +func (s *State) GetStep() uint64 { return s.Step } + +func (s *State) GetLastHint() hexutil.Bytes { + return s.LastHint +} + +func (s *State) VMStatus() uint8 { + return mipsevm.VmStatus(s.Exited, s.ExitCode) +} + +func (s *State) GetMemory() *memory.Memory { + return s.Memory +} + +func (s *State) GetHeap() uint32 { + return s.Heap +} + +func (s *State) GetPreimageKey() common.Hash { + return s.PreimageKey +} + +func (s *State) GetPreimageOffset() uint32 { + return s.PreimageOffset +} + +func (s *State) EncodeWitness() ([]byte, common.Hash) { + out := make([]byte, 0, STATE_WITNESS_SIZE) + memRoot := s.Memory.MerkleRoot() + out = append(out, memRoot[:]...) + out = append(out, s.PreimageKey[:]...) + out = binary.BigEndian.AppendUint32(out, s.PreimageOffset) + out = binary.BigEndian.AppendUint32(out, s.Heap) + out = mipsevm.AppendBoolToWitness(out, s.LLReservationActive) + out = binary.BigEndian.AppendUint32(out, s.LLAddress) + out = binary.BigEndian.AppendUint32(out, s.LLOwnerThread) + out = append(out, s.ExitCode) + out = mipsevm.AppendBoolToWitness(out, s.Exited) + + out = binary.BigEndian.AppendUint64(out, s.Step) + out = binary.BigEndian.AppendUint64(out, s.StepsSinceLastContextSwitch) + out = binary.BigEndian.AppendUint32(out, s.Wakeup) + + leftStackRoot := s.getLeftThreadStackRoot() + rightStackRoot := s.getRightThreadStackRoot() + out = mipsevm.AppendBoolToWitness(out, s.TraverseRight) + out = append(out, (leftStackRoot)[:]...) + out = append(out, (rightStackRoot)[:]...) + out = binary.BigEndian.AppendUint32(out, s.NextThreadId) + + return out, stateHashFromWitness(out) +} + +func (s *State) EncodeThreadProof() []byte { + activeStack := s.getActiveThreadStack() + threadCount := len(activeStack) + if threadCount == 0 { + panic("Invalid empty thread stack") + } + + activeThread := activeStack[threadCount-1] + otherThreads := activeStack[:threadCount-1] + threadBytes := activeThread.serializeThread() + otherThreadsWitness := s.calculateThreadStackRoot(otherThreads) + + out := make([]byte, 0, THREAD_WITNESS_SIZE) + out = append(out, threadBytes[:]...) + out = append(out, otherThreadsWitness[:]...) + + return out +} + +func (s *State) ThreadCount() int { + return len(s.LeftThreadStack) + len(s.RightThreadStack) +} + +// Serialize writes the state in a simple binary format which can be read again using Deserialize +// The format is a simple concatenation of fields, with prefixed item count for repeating items and using big endian +// encoding for numbers. +// +// StateVersion uint8(1) +// Memory As per Memory.Serialize +// PreimageKey [32]byte +// PreimageOffset uint32 +// Heap uint32 +// ExitCode uint8 +// Exited uint8 - 0 for false, 1 for true +// Step uint64 +// StepsSinceLastContextSwitch uint64 +// Wakeup uint32 +// TraverseRight uint8 - 0 for false, 1 for true +// NextThreadId uint32 +// len(LeftThreadStack) uint32 +// LeftThreadStack entries as per ThreadState.Serialize +// len(RightThreadStack) uint32 +// RightThreadStack entries as per ThreadState.Serialize +// len(LastHint) uint32 (0 when LastHint is nil) +// LastHint []byte +func (s *State) Serialize(out io.Writer) error { + bout := serialize.NewBinaryWriter(out) + + if err := s.Memory.Serialize(out); err != nil { + return err + } + if err := bout.WriteHash(s.PreimageKey); err != nil { + return err + } + if err := bout.WriteUInt(s.PreimageOffset); err != nil { + return err + } + if err := bout.WriteUInt(s.Heap); err != nil { + return err + } + if err := bout.WriteBool(s.LLReservationActive); err != nil { + return err + } + if err := bout.WriteUInt(s.LLAddress); err != nil { + return err + } + if err := bout.WriteUInt(s.LLOwnerThread); err != nil { + return err + } + if err := bout.WriteUInt(s.ExitCode); err != nil { + return err + } + if err := bout.WriteBool(s.Exited); err != nil { + return err + } + if err := bout.WriteUInt(s.Step); err != nil { + return err + } + if err := bout.WriteUInt(s.StepsSinceLastContextSwitch); err != nil { + return err + } + if err := bout.WriteUInt(s.Wakeup); err != nil { + return err + } + if err := bout.WriteBool(s.TraverseRight); err != nil { + return err + } + if err := bout.WriteUInt(s.NextThreadId); err != nil { + return err + } + + if err := bout.WriteUInt(uint32(len(s.LeftThreadStack))); err != nil { + return err + } + for _, stack := range s.LeftThreadStack { + if err := stack.Serialize(out); err != nil { + return err + } + } + if err := bout.WriteUInt(uint32(len(s.RightThreadStack))); err != nil { + return err + } + for _, stack := range s.RightThreadStack { + if err := stack.Serialize(out); err != nil { + return err + } + } + if err := bout.WriteBytes(s.LastHint); err != nil { + return err + } + + return nil +} + +func (s *State) Deserialize(in io.Reader) error { + bin := serialize.NewBinaryReader(in) + s.Memory = memory.NewMemory() + if err := s.Memory.Deserialize(in); err != nil { + return err + } + if err := bin.ReadHash(&s.PreimageKey); err != nil { + return err + } + if err := bin.ReadUInt(&s.PreimageOffset); err != nil { + return err + } + if err := bin.ReadUInt(&s.Heap); err != nil { + return err + } + if err := bin.ReadBool(&s.LLReservationActive); err != nil { + return err + } + if err := bin.ReadUInt(&s.LLAddress); err != nil { + return err + } + if err := bin.ReadUInt(&s.LLOwnerThread); err != nil { + return err + } + if err := bin.ReadUInt(&s.ExitCode); err != nil { + return err + } + if err := bin.ReadBool(&s.Exited); err != nil { + return err + } + if err := bin.ReadUInt(&s.Step); err != nil { + return err + } + if err := bin.ReadUInt(&s.StepsSinceLastContextSwitch); err != nil { + return err + } + if err := bin.ReadUInt(&s.Wakeup); err != nil { + return err + } + if err := bin.ReadBool(&s.TraverseRight); err != nil { + return err + } + + if err := bin.ReadUInt(&s.NextThreadId); err != nil { + return err + } + + var leftThreadStackSize uint32 + if err := bin.ReadUInt(&leftThreadStackSize); err != nil { + return err + } + s.LeftThreadStack = make([]*ThreadState, leftThreadStackSize) + for i := range s.LeftThreadStack { + s.LeftThreadStack[i] = &ThreadState{} + if err := s.LeftThreadStack[i].Deserialize(in); err != nil { + return err + } + } + + var rightThreadStackSize uint32 + if err := bin.ReadUInt(&rightThreadStackSize); err != nil { + return err + } + s.RightThreadStack = make([]*ThreadState, rightThreadStackSize) + for i := range s.RightThreadStack { + s.RightThreadStack[i] = &ThreadState{} + if err := s.RightThreadStack[i].Deserialize(in); err != nil { + return err + } + } + + if err := bin.ReadBytes((*[]byte)(&s.LastHint)); err != nil { + return err + } + return nil +} + +type StateWitness []byte + +func (sw StateWitness) StateHash() (common.Hash, error) { + if len(sw) != STATE_WITNESS_SIZE { + return common.Hash{}, fmt.Errorf("Invalid witness length. Got %d, expected %d", len(sw), STATE_WITNESS_SIZE) + } + return stateHashFromWitness(sw), nil +} + +func GetStateHashFn() mipsevm.HashFn { + return func(sw []byte) (common.Hash, error) { + return StateWitness(sw).StateHash() + } +} + +func stateHashFromWitness(sw []byte) common.Hash { + if len(sw) != STATE_WITNESS_SIZE { + panic("Invalid witness length") + } + hash := crypto.Keccak256Hash(sw) + exitCode := sw[EXITCODE_WITNESS_OFFSET] + exited := sw[EXITED_WITNESS_OFFSET] + status := mipsevm.VmStatus(exited == 1, exitCode) + hash[0] = status + return hash +} diff --git a/cannon/mipsevm/multithreaded/state_test.go b/cannon/mipsevm/multithreaded/state_test.go new file mode 100644 index 000000000000..6d776632bf0f --- /dev/null +++ b/cannon/mipsevm/multithreaded/state_test.go @@ -0,0 +1,384 @@ +package multithreaded + +import ( + "bytes" + "debug/elf" + "encoding/json" + "testing" + + "github.com/ethereum/go-ethereum/common" + "github.com/ethereum/go-ethereum/common/hexutil" + "github.com/ethereum/go-ethereum/crypto" + "github.com/stretchr/testify/assert" + "github.com/stretchr/testify/require" + + "github.com/ethereum-optimism/optimism/cannon/mipsevm" + "github.com/ethereum-optimism/optimism/cannon/mipsevm/exec" + "github.com/ethereum-optimism/optimism/cannon/mipsevm/memory" + "github.com/ethereum-optimism/optimism/cannon/mipsevm/program" +) + +func setWitnessField(witness StateWitness, fieldOffset int, fieldData []byte) { + start := fieldOffset + end := fieldOffset + len(fieldData) + copy(witness[start:end], fieldData) +} + +// Run through all permutations of `exited` / `exitCode` and ensure that the +// correct witness, state hash, and VM Status is produced. +func TestState_EncodeWitness(t *testing.T) { + cases := []struct { + exited bool + exitCode uint8 + }{ + {exited: false, exitCode: 0}, + {exited: false, exitCode: 1}, + {exited: false, exitCode: 2}, + {exited: false, exitCode: 3}, + {exited: true, exitCode: 0}, + {exited: true, exitCode: 1}, + {exited: true, exitCode: 2}, + {exited: true, exitCode: 3}, + } + + heap := uint32(12) + llAddress := uint32(55) + llThreadOwner := uint32(99) + preimageKey := crypto.Keccak256Hash([]byte{1, 2, 3, 4}) + preimageOffset := uint32(24) + step := uint64(33) + stepsSinceContextSwitch := uint64(123) + for _, c := range cases { + state := CreateEmptyState() + state.Exited = c.exited + state.ExitCode = c.exitCode + state.PreimageKey = preimageKey + state.PreimageOffset = preimageOffset + state.Heap = heap + state.LLReservationActive = true + state.LLAddress = llAddress + state.LLOwnerThread = llThreadOwner + state.Step = step + state.StepsSinceLastContextSwitch = stepsSinceContextSwitch + + memRoot := state.Memory.MerkleRoot() + leftStackRoot := state.calculateThreadStackRoot(state.LeftThreadStack) + rightStackRoot := EmptyThreadsRoot + + // Set up expected witness + expectedWitness := make(StateWitness, STATE_WITNESS_SIZE) + setWitnessField(expectedWitness, MEMROOT_WITNESS_OFFSET, memRoot[:]) + setWitnessField(expectedWitness, PREIMAGE_KEY_WITNESS_OFFSET, preimageKey[:]) + setWitnessField(expectedWitness, PREIMAGE_OFFSET_WITNESS_OFFSET, []byte{0, 0, 0, byte(preimageOffset)}) + setWitnessField(expectedWitness, HEAP_WITNESS_OFFSET, []byte{0, 0, 0, byte(heap)}) + setWitnessField(expectedWitness, LL_RESERVATION_ACTIVE_OFFSET, []byte{1}) + setWitnessField(expectedWitness, LL_ADDRESS_OFFSET, []byte{0, 0, 0, byte(llAddress)}) + setWitnessField(expectedWitness, LL_OWNER_THREAD_OFFSET, []byte{0, 0, 0, byte(llThreadOwner)}) + setWitnessField(expectedWitness, EXITCODE_WITNESS_OFFSET, []byte{c.exitCode}) + if c.exited { + setWitnessField(expectedWitness, EXITED_WITNESS_OFFSET, []byte{1}) + } + setWitnessField(expectedWitness, STEP_WITNESS_OFFSET, []byte{0, 0, 0, 0, 0, 0, 0, byte(step)}) + setWitnessField(expectedWitness, STEPS_SINCE_CONTEXT_SWITCH_WITNESS_OFFSET, []byte{0, 0, 0, 0, 0, 0, 0, byte(stepsSinceContextSwitch)}) + setWitnessField(expectedWitness, WAKEUP_WITNESS_OFFSET, []byte{0xFF, 0xFF, 0xFF, 0xFF}) + setWitnessField(expectedWitness, TRAVERSE_RIGHT_WITNESS_OFFSET, []byte{0}) + setWitnessField(expectedWitness, LEFT_THREADS_ROOT_WITNESS_OFFSET, leftStackRoot[:]) + setWitnessField(expectedWitness, RIGHT_THREADS_ROOT_WITNESS_OFFSET, rightStackRoot[:]) + setWitnessField(expectedWitness, THREAD_ID_WITNESS_OFFSET, []byte{0, 0, 0, 1}) + + // Validate witness + actualWitness, actualStateHash := state.EncodeWitness() + require.Equal(t, len(actualWitness), STATE_WITNESS_SIZE, "Incorrect witness size") + require.EqualValues(t, expectedWitness[:], actualWitness[:], "Incorrect witness") + // Validate witness hash + expectedStateHash := crypto.Keccak256Hash(actualWitness) + expectedStateHash[0] = mipsevm.VmStatus(c.exited, c.exitCode) + require.Equal(t, expectedStateHash, actualStateHash, "Incorrect state hash") + } +} + +func TestState_JSONCodec(t *testing.T) { + elfProgram, err := elf.Open("../../testdata/example/bin/hello.elf") + require.NoError(t, err, "open ELF file") + state, err := program.LoadELF(elfProgram, CreateInitialState) + require.NoError(t, err, "load ELF into state") + // Set a few additional fields + state.PreimageKey = crypto.Keccak256Hash([]byte{1, 2, 3, 4}) + state.PreimageOffset = 4 + state.Heap = 555 + state.Step = 99_999 + state.StepsSinceLastContextSwitch = 123 + state.Exited = true + state.ExitCode = 2 + state.LastHint = []byte{11, 12, 13} + + stateJSON, err := json.Marshal(state) + require.NoError(t, err) + + var newState *State + err = json.Unmarshal(stateJSON, &newState) + require.NoError(t, err) + + require.Equal(t, state.PreimageKey, newState.PreimageKey) + require.Equal(t, state.PreimageOffset, newState.PreimageOffset) + require.Equal(t, state.Heap, newState.Heap) + require.Equal(t, state.ExitCode, newState.ExitCode) + require.Equal(t, state.Exited, newState.Exited) + require.Equal(t, state.Memory.MerkleRoot(), newState.Memory.MerkleRoot()) + require.Equal(t, state.Step, newState.Step) + require.Equal(t, state.StepsSinceLastContextSwitch, newState.StepsSinceLastContextSwitch) + require.Equal(t, state.Wakeup, newState.Wakeup) + require.Equal(t, state.TraverseRight, newState.TraverseRight) + require.Equal(t, state.LeftThreadStack, newState.LeftThreadStack) + require.Equal(t, state.RightThreadStack, newState.RightThreadStack) + require.Equal(t, state.NextThreadId, newState.NextThreadId) + require.Equal(t, state.LastHint, newState.LastHint) +} + +func TestState_Binary(t *testing.T) { + elfProgram, err := elf.Open("../../testdata/example/bin/hello.elf") + require.NoError(t, err, "open ELF file") + state, err := program.LoadELF(elfProgram, CreateInitialState) + require.NoError(t, err, "load ELF into state") + // Set a few additional fields + state.PreimageKey = crypto.Keccak256Hash([]byte{1, 2, 3, 4}) + state.PreimageOffset = 4 + state.Heap = 555 + state.Step = 99_999 + state.StepsSinceLastContextSwitch = 123 + state.Exited = true + state.ExitCode = 2 + state.LastHint = []byte{11, 12, 13} + + buf := new(bytes.Buffer) + err = state.Serialize(buf) + require.NoError(t, err) + + newState := new(State) + require.NoError(t, newState.Deserialize(bytes.NewReader(buf.Bytes()))) + + require.Equal(t, state.PreimageKey, newState.PreimageKey) + require.Equal(t, state.PreimageOffset, newState.PreimageOffset) + require.Equal(t, state.Heap, newState.Heap) + require.Equal(t, state.ExitCode, newState.ExitCode) + require.Equal(t, state.Exited, newState.Exited) + require.Equal(t, state.Memory.MerkleRoot(), newState.Memory.MerkleRoot()) + require.Equal(t, state.Step, newState.Step) + require.Equal(t, state.StepsSinceLastContextSwitch, newState.StepsSinceLastContextSwitch) + require.Equal(t, state.Wakeup, newState.Wakeup) + require.Equal(t, state.TraverseRight, newState.TraverseRight) + require.Equal(t, state.LeftThreadStack, newState.LeftThreadStack) + require.Equal(t, state.RightThreadStack, newState.RightThreadStack) + require.Equal(t, state.NextThreadId, newState.NextThreadId) + require.Equal(t, state.LastHint, newState.LastHint) +} + +func TestSerializeStateRoundTrip(t *testing.T) { + // Construct a test case with populated fields + mem := memory.NewMemory() + mem.AllocPage(5) + p := mem.AllocPage(123) + p.Data[2] = 0x01 + state := &State{ + Memory: mem, + PreimageKey: common.Hash{0xFF}, + PreimageOffset: 5, + Heap: 0xc0ffee, + LLReservationActive: true, + LLAddress: 0x12345678, + LLOwnerThread: 0x02, + ExitCode: 1, + Exited: true, + Step: 0xdeadbeef, + StepsSinceLastContextSwitch: 334, + Wakeup: 42, + TraverseRight: true, + LeftThreadStack: []*ThreadState{ + { + ThreadId: 45, + ExitCode: 46, + Exited: true, + FutexAddr: 47, + FutexVal: 48, + FutexTimeoutStep: 49, + Cpu: mipsevm.CpuScalars{ + PC: 0xFF, + NextPC: 0xFF + 4, + LO: 0xbeef, + HI: 0xbabe, + }, + Registers: [32]uint32{ + 0xdeadbeef, + 0xdeadbeef, + 0xc0ffee, + 0xbeefbabe, + 0xdeadc0de, + 0xbadc0de, + 0xdeaddead, + }, + }, + { + ThreadId: 55, + ExitCode: 56, + Exited: false, + FutexAddr: 57, + FutexVal: 58, + FutexTimeoutStep: 59, + Cpu: mipsevm.CpuScalars{ + PC: 0xEE, + NextPC: 0xEE + 4, + LO: 0xeeef, + HI: 0xeabe, + }, + Registers: [32]uint32{ + 0xabcdef, + 0x123456, + }, + }, + }, + RightThreadStack: []*ThreadState{ + { + ThreadId: 65, + ExitCode: 66, + Exited: false, + FutexAddr: 67, + FutexVal: 68, + FutexTimeoutStep: 69, + Cpu: mipsevm.CpuScalars{ + PC: 0xdd, + NextPC: 0xdd + 4, + LO: 0xdeef, + HI: 0xdabe, + }, + Registers: [32]uint32{ + 0x654321, + }, + }, + { + ThreadId: 75, + ExitCode: 76, + Exited: true, + FutexAddr: 77, + FutexVal: 78, + FutexTimeoutStep: 79, + Cpu: mipsevm.CpuScalars{ + PC: 0xcc, + NextPC: 0xcc + 4, + LO: 0xceef, + HI: 0xcabe, + }, + Registers: [32]uint32{ + 0x987653, + 0xfedbca, + }, + }, + }, + NextThreadId: 489, + LastHint: hexutil.Bytes{1, 2, 3, 4, 5}, + } + + ser := new(bytes.Buffer) + err := state.Serialize(ser) + require.NoError(t, err, "must serialize state") + state2 := &State{} + err = state2.Deserialize(ser) + require.NoError(t, err, "must deserialize state") + require.Equal(t, state, state2, "must roundtrip state") +} + +func TestState_EmptyThreadsRoot(t *testing.T) { + data := [64]byte{} + expectedEmptyRoot := crypto.Keccak256Hash(data[:]) + + require.Equal(t, expectedEmptyRoot, EmptyThreadsRoot) +} + +func TestState_EncodeThreadProof_SingleThread(t *testing.T) { + state := CreateEmptyState() + // Set some fields on the active thread + activeThread := state.GetCurrentThread() + activeThread.Cpu.PC = 4 + activeThread.Cpu.NextPC = 8 + activeThread.Cpu.HI = 11 + activeThread.Cpu.LO = 22 + for i := 0; i < 32; i++ { + activeThread.Registers[i] = uint32(i) + } + + expectedProof := append([]byte{}, activeThread.serializeThread()[:]...) + expectedProof = append(expectedProof, EmptyThreadsRoot[:]...) + + actualProof := state.EncodeThreadProof() + require.Equal(t, THREAD_WITNESS_SIZE, len(actualProof)) + require.Equal(t, expectedProof, actualProof) +} + +func TestState_EncodeThreadProof_MultipleThreads(t *testing.T) { + state := CreateEmptyState() + // Add some more threads + require.Equal(t, state.TraverseRight, false, "sanity check") + state.LeftThreadStack = append(state.LeftThreadStack, CreateEmptyThread()) + state.LeftThreadStack = append(state.LeftThreadStack, CreateEmptyThread()) + require.Equal(t, 3, len(state.LeftThreadStack), "sanity check") + + // Set some fields on our threads + for i := 0; i < 3; i++ { + curThread := state.LeftThreadStack[i] + curThread.Cpu.PC = uint32(4 * i) + curThread.Cpu.NextPC = curThread.Cpu.PC + 4 + curThread.Cpu.HI = uint32(11 + i) + curThread.Cpu.LO = uint32(22 + i) + for j := 0; j < 32; j++ { + curThread.Registers[j] = uint32(j + i) + } + } + + expectedRoot := EmptyThreadsRoot + for i := 0; i < 2; i++ { + curThread := state.LeftThreadStack[i] + hashedThread := crypto.Keccak256Hash(curThread.serializeThread()) + + // root = prevRoot ++ hash(curRoot) + hashData := append([]byte{}, expectedRoot[:]...) + hashData = append(hashData, hashedThread[:]...) + expectedRoot = crypto.Keccak256Hash(hashData) + } + + expectedProof := append([]byte{}, state.GetCurrentThread().serializeThread()[:]...) + expectedProof = append(expectedProof, expectedRoot[:]...) + + actualProof := state.EncodeThreadProof() + require.Equal(t, THREAD_WITNESS_SIZE, len(actualProof)) + require.Equal(t, expectedProof, actualProof) +} + +func TestState_EncodeThreadProof_EmptyThreadStackPanic(t *testing.T) { + cases := []struct { + name string + wakeupAddr uint32 + traverseRight bool + }{ + {"traverse left during wakeup traversal", uint32(99), false}, + {"traverse left during normal traversal", exec.FutexEmptyAddr, false}, + {"traverse right during wakeup traversal", uint32(99), true}, + {"traverse right during normal traversal", exec.FutexEmptyAddr, true}, + } + + for _, c := range cases { + t.Run(c.name, func(t *testing.T) { + // Set up invalid state where the active stack is empty + state := CreateEmptyState() + state.Wakeup = c.wakeupAddr + state.TraverseRight = c.traverseRight + if c.traverseRight { + state.LeftThreadStack = []*ThreadState{CreateEmptyThread()} + state.RightThreadStack = []*ThreadState{} + } else { + state.LeftThreadStack = []*ThreadState{} + state.RightThreadStack = []*ThreadState{CreateEmptyThread()} + } + + assert.PanicsWithValue(t, "Invalid empty thread stack", func() { state.EncodeThreadProof() }) + }) + } +} diff --git a/cannon/mipsevm/multithreaded/testutil/expectations.go b/cannon/mipsevm/multithreaded/testutil/expectations.go new file mode 100644 index 000000000000..559ed2de8c4f --- /dev/null +++ b/cannon/mipsevm/multithreaded/testutil/expectations.go @@ -0,0 +1,226 @@ +package testutil + +import ( + "fmt" + + "github.com/ethereum/go-ethereum/common" + "github.com/ethereum/go-ethereum/common/hexutil" + "github.com/stretchr/testify/require" + + "github.com/ethereum-optimism/optimism/cannon/mipsevm/memory" + "github.com/ethereum-optimism/optimism/cannon/mipsevm/multithreaded" +) + +// ExpectedMTState is a test utility that basically stores a copy of a state that can be explicitly mutated +// to define an expected post-state. The post-state is then validated with ExpectedMTState.Validate(t, postState) +type ExpectedMTState struct { + PreimageKey common.Hash + PreimageOffset uint32 + Heap uint32 + LLReservationActive bool + LLAddress uint32 + LLOwnerThread uint32 + ExitCode uint8 + Exited bool + Step uint64 + LastHint hexutil.Bytes + MemoryRoot common.Hash + expectedMemory *memory.Memory + // Threading-related expectations + StepsSinceLastContextSwitch uint64 + Wakeup uint32 + TraverseRight bool + NextThreadId uint32 + ThreadCount int + RightStackSize int + LeftStackSize int + prestateActiveThreadId uint32 + prestateActiveThreadOrig ExpectedThreadState // Cached for internal use + ActiveThreadId uint32 + threadExpectations map[uint32]*ExpectedThreadState +} + +type ExpectedThreadState struct { + ThreadId uint32 + ExitCode uint8 + Exited bool + FutexAddr uint32 + FutexVal uint32 + FutexTimeoutStep uint64 + PC uint32 + NextPC uint32 + HI uint32 + LO uint32 + Registers [32]uint32 + Dropped bool +} + +func NewExpectedMTState(fromState *multithreaded.State) *ExpectedMTState { + currentThread := fromState.GetCurrentThread() + + expectedThreads := make(map[uint32]*ExpectedThreadState) + for _, t := range GetAllThreads(fromState) { + expectedThreads[t.ThreadId] = newExpectedThreadState(t) + } + + return &ExpectedMTState{ + // General Fields + PreimageKey: fromState.GetPreimageKey(), + PreimageOffset: fromState.GetPreimageOffset(), + Heap: fromState.GetHeap(), + LLReservationActive: fromState.LLReservationActive, + LLAddress: fromState.LLAddress, + LLOwnerThread: fromState.LLOwnerThread, + ExitCode: fromState.GetExitCode(), + Exited: fromState.GetExited(), + Step: fromState.GetStep(), + LastHint: fromState.GetLastHint(), + MemoryRoot: fromState.GetMemory().MerkleRoot(), + // Thread-related global fields + StepsSinceLastContextSwitch: fromState.StepsSinceLastContextSwitch, + Wakeup: fromState.Wakeup, + TraverseRight: fromState.TraverseRight, + NextThreadId: fromState.NextThreadId, + ThreadCount: fromState.ThreadCount(), + RightStackSize: len(fromState.RightThreadStack), + LeftStackSize: len(fromState.LeftThreadStack), + // ThreadState expectations + prestateActiveThreadId: currentThread.ThreadId, + prestateActiveThreadOrig: *newExpectedThreadState(currentThread), // Cache prestate thread for internal use + ActiveThreadId: currentThread.ThreadId, + threadExpectations: expectedThreads, + expectedMemory: fromState.Memory.Copy(), + } +} + +func newExpectedThreadState(fromThread *multithreaded.ThreadState) *ExpectedThreadState { + return &ExpectedThreadState{ + ThreadId: fromThread.ThreadId, + ExitCode: fromThread.ExitCode, + Exited: fromThread.Exited, + FutexAddr: fromThread.FutexAddr, + FutexVal: fromThread.FutexVal, + FutexTimeoutStep: fromThread.FutexTimeoutStep, + PC: fromThread.Cpu.PC, + NextPC: fromThread.Cpu.NextPC, + HI: fromThread.Cpu.HI, + LO: fromThread.Cpu.LO, + Registers: fromThread.Registers, + Dropped: false, + } +} + +func (e *ExpectedMTState) ExpectStep() { + // Set some standard expectations for a normal step + e.Step += 1 + e.PrestateActiveThread().PC += 4 + e.PrestateActiveThread().NextPC += 4 + e.StepsSinceLastContextSwitch += 1 +} + +func (e *ExpectedMTState) ExpectMemoryWrite(addr uint32, val uint32) { + e.expectedMemory.SetMemory(addr, val) + e.MemoryRoot = e.expectedMemory.MerkleRoot() +} + +func (e *ExpectedMTState) ExpectMemoryWriteMultiple(addr uint32, val uint32, addr2 uint32, val2 uint32) { + e.expectedMemory.SetMemory(addr, val) + e.expectedMemory.SetMemory(addr2, val2) + e.MemoryRoot = e.expectedMemory.MerkleRoot() +} + +func (e *ExpectedMTState) ExpectPreemption(preState *multithreaded.State) { + e.ActiveThreadId = FindNextThread(preState).ThreadId + e.StepsSinceLastContextSwitch = 0 + if preState.TraverseRight { + e.TraverseRight = e.RightStackSize > 1 + e.RightStackSize -= 1 + e.LeftStackSize += 1 + } else { + e.TraverseRight = e.LeftStackSize == 1 + e.LeftStackSize -= 1 + e.RightStackSize += 1 + } +} + +func (e *ExpectedMTState) ExpectNewThread() *ExpectedThreadState { + newThreadId := e.NextThreadId + e.NextThreadId += 1 + e.ThreadCount += 1 + + // Clone expectations from prestate active thread's original state (bf changing any expectations) + newThread := &ExpectedThreadState{} + *newThread = e.prestateActiveThreadOrig + + newThread.ThreadId = newThreadId + e.threadExpectations[newThreadId] = newThread + + return newThread +} + +func (e *ExpectedMTState) ActiveThread() *ExpectedThreadState { + return e.threadExpectations[e.ActiveThreadId] +} + +func (e *ExpectedMTState) PrestateActiveThread() *ExpectedThreadState { + return e.threadExpectations[e.prestateActiveThreadId] +} + +func (e *ExpectedMTState) Thread(threadId uint32) *ExpectedThreadState { + return e.threadExpectations[threadId] +} + +func (e *ExpectedMTState) Validate(t require.TestingT, actualState *multithreaded.State) { + require.Equalf(t, e.PreimageKey, actualState.GetPreimageKey(), "Expect preimageKey = %v", e.PreimageKey) + require.Equalf(t, e.PreimageOffset, actualState.GetPreimageOffset(), "Expect preimageOffset = %v", e.PreimageOffset) + require.Equalf(t, e.Heap, actualState.GetHeap(), "Expect heap = 0x%x", e.Heap) + require.Equalf(t, e.LLReservationActive, actualState.LLReservationActive, "Expect LLReservationActive = %v", e.LLReservationActive) + require.Equalf(t, e.LLAddress, actualState.LLAddress, "Expect LLAddress = 0x%x", e.LLAddress) + require.Equalf(t, e.LLOwnerThread, actualState.LLOwnerThread, "Expect LLOwnerThread = %v", e.LLOwnerThread) + require.Equalf(t, e.ExitCode, actualState.GetExitCode(), "Expect exitCode = 0x%x", e.ExitCode) + require.Equalf(t, e.Exited, actualState.GetExited(), "Expect exited = %v", e.Exited) + require.Equalf(t, e.Step, actualState.GetStep(), "Expect step = %d", e.Step) + require.Equalf(t, e.LastHint, actualState.GetLastHint(), "Expect lastHint = %v", e.LastHint) + require.Equalf(t, e.MemoryRoot, common.Hash(actualState.GetMemory().MerkleRoot()), "Expect memory root = %v", e.MemoryRoot) + // Thread-related global fields + require.Equalf(t, e.StepsSinceLastContextSwitch, actualState.StepsSinceLastContextSwitch, "Expect StepsSinceLastContextSwitch = %v", e.StepsSinceLastContextSwitch) + require.Equalf(t, e.Wakeup, actualState.Wakeup, "Expect Wakeup = %v", e.Wakeup) + require.Equalf(t, e.TraverseRight, actualState.TraverseRight, "Expect TraverseRight = %v", e.TraverseRight) + require.Equalf(t, e.NextThreadId, actualState.NextThreadId, "Expect NextThreadId = %v", e.NextThreadId) + require.Equalf(t, e.ThreadCount, actualState.ThreadCount(), "Expect thread count = %v", e.ThreadCount) + require.Equalf(t, e.RightStackSize, len(actualState.RightThreadStack), "Expect right stack size = %v", e.RightStackSize) + require.Equalf(t, e.LeftStackSize, len(actualState.LeftThreadStack), "Expect right stack size = %v", e.LeftStackSize) + + // Check active thread + activeThread := actualState.GetCurrentThread() + require.Equal(t, e.ActiveThreadId, activeThread.ThreadId) + // Check all threads + expectedThreadCount := 0 + for tid, exp := range e.threadExpectations { + actualThread := FindThread(actualState, tid) + isActive := tid == activeThread.ThreadId + if exp.Dropped { + require.Nil(t, actualThread, "Thread %v should have been dropped", tid) + } else { + require.NotNil(t, actualThread, "Could not find thread matching expected thread with id %v", tid) + e.validateThread(t, exp, actualThread, isActive) + expectedThreadCount++ + } + } + require.Equal(t, expectedThreadCount, actualState.ThreadCount(), "Thread expectations do not match thread count") +} + +func (e *ExpectedMTState) validateThread(t require.TestingT, et *ExpectedThreadState, actual *multithreaded.ThreadState, isActive bool) { + threadInfo := fmt.Sprintf("tid = %v, active = %v", actual.ThreadId, isActive) + require.Equalf(t, et.ThreadId, actual.ThreadId, "Expect ThreadId = 0x%x (%v)", et.ThreadId, threadInfo) + require.Equalf(t, et.PC, actual.Cpu.PC, "Expect PC = 0x%x (%v)", et.PC, threadInfo) + require.Equalf(t, et.NextPC, actual.Cpu.NextPC, "Expect nextPC = 0x%x (%v)", et.NextPC, threadInfo) + require.Equalf(t, et.HI, actual.Cpu.HI, "Expect HI = 0x%x (%v)", et.HI, threadInfo) + require.Equalf(t, et.LO, actual.Cpu.LO, "Expect LO = 0x%x (%v)", et.LO, threadInfo) + require.Equalf(t, et.Registers, actual.Registers, "Expect registers to match (%v)", threadInfo) + require.Equalf(t, et.ExitCode, actual.ExitCode, "Expect exitCode = %v (%v)", et.ExitCode, threadInfo) + require.Equalf(t, et.Exited, actual.Exited, "Expect exited = %v (%v)", et.Exited, threadInfo) + require.Equalf(t, et.FutexAddr, actual.FutexAddr, "Expect futexAddr = %v (%v)", et.FutexAddr, threadInfo) + require.Equalf(t, et.FutexVal, actual.FutexVal, "Expect futexVal = %v (%v)", et.FutexVal, threadInfo) + require.Equalf(t, et.FutexTimeoutStep, actual.FutexTimeoutStep, "Expect futexTimeoutStep = %v (%v)", et.FutexTimeoutStep, threadInfo) +} diff --git a/cannon/mipsevm/multithreaded/testutil/expectations_test.go b/cannon/mipsevm/multithreaded/testutil/expectations_test.go new file mode 100644 index 000000000000..a40e15e0f8d5 --- /dev/null +++ b/cannon/mipsevm/multithreaded/testutil/expectations_test.go @@ -0,0 +1,182 @@ +package testutil + +import ( + "fmt" + "testing" + + //"github.com/ethereum/go-ethereum/common" + "github.com/stretchr/testify/require" + + "github.com/ethereum-optimism/optimism/cannon/mipsevm/multithreaded" +) + +type ExpectationMutator func(e *ExpectedMTState, st *multithreaded.State) + +func TestValidate_shouldCatchMutations(t *testing.T) { + states := []*multithreaded.State{ + RandomState(0), + RandomState(1), + RandomState(2), + } + var emptyHash [32]byte + someThread := RandomThread(123) + + cases := []struct { + name string + mut ExpectationMutator + }{ + {name: "PreimageKey", mut: func(e *ExpectedMTState, st *multithreaded.State) { e.PreimageKey = emptyHash }}, + {name: "PreimageOffset", mut: func(e *ExpectedMTState, st *multithreaded.State) { e.PreimageOffset += 1 }}, + {name: "Heap", mut: func(e *ExpectedMTState, st *multithreaded.State) { e.Heap += 1 }}, + {name: "LLReservationActive", mut: func(e *ExpectedMTState, st *multithreaded.State) { e.LLReservationActive = !e.LLReservationActive }}, + {name: "LLAddress", mut: func(e *ExpectedMTState, st *multithreaded.State) { e.LLAddress += 1 }}, + {name: "LLOwnerThread", mut: func(e *ExpectedMTState, st *multithreaded.State) { e.LLOwnerThread += 1 }}, + {name: "ExitCode", mut: func(e *ExpectedMTState, st *multithreaded.State) { e.ExitCode += 1 }}, + {name: "Exited", mut: func(e *ExpectedMTState, st *multithreaded.State) { e.Exited = !e.Exited }}, + {name: "Step", mut: func(e *ExpectedMTState, st *multithreaded.State) { e.Step += 1 }}, + {name: "LastHint", mut: func(e *ExpectedMTState, st *multithreaded.State) { e.LastHint = []byte{7, 8, 9, 10} }}, + {name: "MemoryRoot", mut: func(e *ExpectedMTState, st *multithreaded.State) { e.MemoryRoot = emptyHash }}, + {name: "StepsSinceLastContextSwitch", mut: func(e *ExpectedMTState, st *multithreaded.State) { e.StepsSinceLastContextSwitch += 1 }}, + {name: "Wakeup", mut: func(e *ExpectedMTState, st *multithreaded.State) { e.Wakeup += 1 }}, + {name: "TraverseRight", mut: func(e *ExpectedMTState, st *multithreaded.State) { e.TraverseRight = !e.TraverseRight }}, + {name: "NextThreadId", mut: func(e *ExpectedMTState, st *multithreaded.State) { e.NextThreadId += 1 }}, + {name: "ThreadCount", mut: func(e *ExpectedMTState, st *multithreaded.State) { e.ThreadCount += 1 }}, + {name: "RightStackSize", mut: func(e *ExpectedMTState, st *multithreaded.State) { e.RightStackSize += 1 }}, + {name: "LeftStackSize", mut: func(e *ExpectedMTState, st *multithreaded.State) { e.LeftStackSize += 1 }}, + {name: "ActiveThreadId", mut: func(e *ExpectedMTState, st *multithreaded.State) { e.ActiveThreadId += 1 }}, + {name: "Empty thread expectations", mut: func(e *ExpectedMTState, st *multithreaded.State) { + e.threadExpectations = map[uint32]*ExpectedThreadState{} + }}, + {name: "Mismatched thread expectations", mut: func(e *ExpectedMTState, st *multithreaded.State) { + e.threadExpectations = map[uint32]*ExpectedThreadState{someThread.ThreadId: newExpectedThreadState(someThread)} + }}, + {name: "Active threadId", mut: func(e *ExpectedMTState, st *multithreaded.State) { + e.threadExpectations[st.GetCurrentThread().ThreadId].ThreadId += 1 + }}, + {name: "Active thread exitCode", mut: func(e *ExpectedMTState, st *multithreaded.State) { + e.threadExpectations[st.GetCurrentThread().ThreadId].ExitCode += 1 + }}, + {name: "Active thread exited", mut: func(e *ExpectedMTState, st *multithreaded.State) { + e.threadExpectations[st.GetCurrentThread().ThreadId].Exited = !st.GetCurrentThread().Exited + }}, + {name: "Active thread futexAddr", mut: func(e *ExpectedMTState, st *multithreaded.State) { + e.threadExpectations[st.GetCurrentThread().ThreadId].FutexAddr += 1 + }}, + {name: "Active thread futexVal", mut: func(e *ExpectedMTState, st *multithreaded.State) { + e.threadExpectations[st.GetCurrentThread().ThreadId].FutexVal += 1 + }}, + {name: "Active thread FutexTimeoutStep", mut: func(e *ExpectedMTState, st *multithreaded.State) { + e.threadExpectations[st.GetCurrentThread().ThreadId].FutexTimeoutStep += 1 + }}, + {name: "Active thread PC", mut: func(e *ExpectedMTState, st *multithreaded.State) { + e.threadExpectations[st.GetCurrentThread().ThreadId].PC += 1 + }}, + {name: "Active thread NextPC", mut: func(e *ExpectedMTState, st *multithreaded.State) { + e.threadExpectations[st.GetCurrentThread().ThreadId].NextPC += 1 + }}, + {name: "Active thread HI", mut: func(e *ExpectedMTState, st *multithreaded.State) { + e.threadExpectations[st.GetCurrentThread().ThreadId].HI += 1 + }}, + {name: "Active thread LO", mut: func(e *ExpectedMTState, st *multithreaded.State) { + e.threadExpectations[st.GetCurrentThread().ThreadId].LO += 1 + }}, + {name: "Active thread Registers", mut: func(e *ExpectedMTState, st *multithreaded.State) { + e.threadExpectations[st.GetCurrentThread().ThreadId].Registers[0] += 1 + }}, + {name: "Active thread dropped", mut: func(e *ExpectedMTState, st *multithreaded.State) { + e.threadExpectations[st.GetCurrentThread().ThreadId].Dropped = true + }}, + {name: "Inactive threadId", mut: func(e *ExpectedMTState, st *multithreaded.State) { + e.threadExpectations[FindNextThread(st).ThreadId].ThreadId += 1 + }}, + {name: "Inactive thread exitCode", mut: func(e *ExpectedMTState, st *multithreaded.State) { + e.threadExpectations[FindNextThread(st).ThreadId].ExitCode += 1 + }}, + {name: "Inactive thread exited", mut: func(e *ExpectedMTState, st *multithreaded.State) { + e.threadExpectations[FindNextThread(st).ThreadId].Exited = !FindNextThread(st).Exited + }}, + {name: "Inactive thread futexAddr", mut: func(e *ExpectedMTState, st *multithreaded.State) { + e.threadExpectations[FindNextThread(st).ThreadId].FutexAddr += 1 + }}, + {name: "Inactive thread futexVal", mut: func(e *ExpectedMTState, st *multithreaded.State) { + e.threadExpectations[FindNextThread(st).ThreadId].FutexVal += 1 + }}, + {name: "Inactive thread FutexTimeoutStep", mut: func(e *ExpectedMTState, st *multithreaded.State) { + e.threadExpectations[FindNextThread(st).ThreadId].FutexTimeoutStep += 1 + }}, + {name: "Inactive thread PC", mut: func(e *ExpectedMTState, st *multithreaded.State) { + e.threadExpectations[FindNextThread(st).ThreadId].PC += 1 + }}, + {name: "Inactive thread NextPC", mut: func(e *ExpectedMTState, st *multithreaded.State) { + e.threadExpectations[FindNextThread(st).ThreadId].NextPC += 1 + }}, + {name: "Inactive thread HI", mut: func(e *ExpectedMTState, st *multithreaded.State) { + e.threadExpectations[FindNextThread(st).ThreadId].HI += 1 + }}, + {name: "Inactive thread LO", mut: func(e *ExpectedMTState, st *multithreaded.State) { + e.threadExpectations[FindNextThread(st).ThreadId].LO += 1 + }}, + {name: "Inactive thread Registers", mut: func(e *ExpectedMTState, st *multithreaded.State) { + e.threadExpectations[FindNextThread(st).ThreadId].Registers[0] += 1 + }}, + {name: "Inactive thread dropped", mut: func(e *ExpectedMTState, st *multithreaded.State) { + e.threadExpectations[FindNextThread(st).ThreadId].Dropped = true + }}, + } + for _, c := range cases { + for i, state := range states { + testName := fmt.Sprintf("%v (state #%v)", c.name, i) + t.Run(testName, func(t *testing.T) { + expected := NewExpectedMTState(state) + c.mut(expected, state) + + // We should detect the change and fail + mockT := &MockTestingT{} + expected.Validate(mockT, state) + mockT.RequireFailed(t) + }) + } + + } +} + +func TestValidate_shouldPassUnchangedExpectations(t *testing.T) { + states := []*multithreaded.State{ + RandomState(0), + RandomState(1), + RandomState(2), + } + + for i, state := range states { + testName := fmt.Sprintf("State #%v", i) + t.Run(testName, func(t *testing.T) { + expected := NewExpectedMTState(state) + + mockT := &MockTestingT{} + expected.Validate(mockT, state) + mockT.RequireNoFailure(t) + }) + } +} + +type MockTestingT struct { + errCount int +} + +var _ require.TestingT = (*MockTestingT)(nil) + +func (m *MockTestingT) Errorf(format string, args ...interface{}) { + m.errCount += 1 +} + +func (m *MockTestingT) FailNow() { + m.errCount += 1 +} + +func (m *MockTestingT) RequireFailed(t require.TestingT) { + require.Greater(t, m.errCount, 0, "Should have tracked a failure") +} + +func (m *MockTestingT) RequireNoFailure(t require.TestingT) { + require.Equal(t, m.errCount, 0, "Should not have tracked a failure") +} diff --git a/cannon/mipsevm/multithreaded/testutil/mutators.go b/cannon/mipsevm/multithreaded/testutil/mutators.go new file mode 100644 index 000000000000..a44ba23a4fac --- /dev/null +++ b/cannon/mipsevm/multithreaded/testutil/mutators.go @@ -0,0 +1,95 @@ +package testutil + +import ( + "math" + + "github.com/ethereum/go-ethereum/common" + "github.com/ethereum/go-ethereum/common/hexutil" + + "github.com/ethereum-optimism/optimism/cannon/mipsevm/exec" + "github.com/ethereum-optimism/optimism/cannon/mipsevm/multithreaded" + "github.com/ethereum-optimism/optimism/cannon/mipsevm/testutil" +) + +type StateMutatorMultiThreaded struct { + state *multithreaded.State +} + +var _ testutil.StateMutator = (*StateMutatorMultiThreaded)(nil) + +func NewStateMutatorMultiThreaded(state *multithreaded.State) testutil.StateMutator { + return &StateMutatorMultiThreaded{state: state} +} + +func (m *StateMutatorMultiThreaded) Randomize(randSeed int64) { + r := testutil.NewRandHelper(randSeed) + + step := r.RandStep() + + m.state.PreimageKey = r.RandHash() + m.state.PreimageOffset = r.Uint32() + m.state.Step = step + m.state.LastHint = r.RandHint() + m.state.StepsSinceLastContextSwitch = uint64(r.Intn(exec.SchedQuantum)) + + // Randomize memory-related fields + halfMemory := math.MaxUint32 / 2 + m.state.Heap = uint32(r.Intn(halfMemory) + halfMemory) + m.state.LLReservationActive = r.Intn(2) == 1 + if m.state.LLReservationActive { + m.state.LLAddress = uint32(r.Intn(halfMemory)) + m.state.LLOwnerThread = uint32(r.Intn(10)) + } + + // Randomize threads + activeStackThreads := r.Intn(2) + 1 + inactiveStackThreads := r.Intn(3) + traverseRight := r.Intn(2) == 1 + SetupThreads(randSeed+1, m.state, traverseRight, activeStackThreads, inactiveStackThreads) +} + +func (m *StateMutatorMultiThreaded) SetHI(val uint32) { + m.state.GetCurrentThread().Cpu.HI = val +} + +func (m *StateMutatorMultiThreaded) SetLO(val uint32) { + m.state.GetCurrentThread().Cpu.LO = val +} + +func (m *StateMutatorMultiThreaded) SetExitCode(val uint8) { + m.state.ExitCode = val +} + +func (m *StateMutatorMultiThreaded) SetExited(val bool) { + m.state.Exited = val +} + +func (m *StateMutatorMultiThreaded) SetPC(val uint32) { + thread := m.state.GetCurrentThread() + thread.Cpu.PC = val +} + +func (m *StateMutatorMultiThreaded) SetHeap(val uint32) { + m.state.Heap = val +} + +func (m *StateMutatorMultiThreaded) SetNextPC(val uint32) { + thread := m.state.GetCurrentThread() + thread.Cpu.NextPC = val +} + +func (m *StateMutatorMultiThreaded) SetLastHint(val hexutil.Bytes) { + m.state.LastHint = val +} + +func (m *StateMutatorMultiThreaded) SetPreimageKey(val common.Hash) { + m.state.PreimageKey = val +} + +func (m *StateMutatorMultiThreaded) SetPreimageOffset(val uint32) { + m.state.PreimageOffset = val +} + +func (m *StateMutatorMultiThreaded) SetStep(val uint64) { + m.state.Step = val +} diff --git a/cannon/mipsevm/multithreaded/testutil/state.go b/cannon/mipsevm/multithreaded/testutil/state.go new file mode 100644 index 000000000000..b240c95c0bba --- /dev/null +++ b/cannon/mipsevm/multithreaded/testutil/state.go @@ -0,0 +1,24 @@ +package testutil + +import ( + "github.com/stretchr/testify/require" + + "github.com/ethereum-optimism/optimism/cannon/mipsevm" + "github.com/ethereum-optimism/optimism/cannon/mipsevm/multithreaded" +) + +func GetMtState(t require.TestingT, vm mipsevm.FPVM) *multithreaded.State { + state := vm.GetState() + mtState, ok := state.(*multithreaded.State) + if !ok { + require.Fail(t, "Failed to cast FPVMState to multithreaded State type") + } + return mtState +} + +func RandomState(seed int) *multithreaded.State { + state := multithreaded.CreateEmptyState() + mut := StateMutatorMultiThreaded{state} + mut.Randomize(int64(seed)) + return state +} diff --git a/cannon/mipsevm/multithreaded/testutil/thread.go b/cannon/mipsevm/multithreaded/testutil/thread.go new file mode 100644 index 000000000000..f5b1d29a8dd6 --- /dev/null +++ b/cannon/mipsevm/multithreaded/testutil/thread.go @@ -0,0 +1,164 @@ +package testutil + +import ( + "github.com/ethereum-optimism/optimism/cannon/mipsevm/multithreaded" + "github.com/ethereum-optimism/optimism/cannon/mipsevm/testutil" +) + +func RandomThread(randSeed int64) *multithreaded.ThreadState { + r := testutil.NewRandHelper(randSeed) + thread := multithreaded.CreateEmptyThread() + + pc := r.RandPC() + + thread.Registers = *r.RandRegisters() + thread.Cpu.PC = pc + thread.Cpu.NextPC = pc + 4 + thread.Cpu.HI = r.Uint32() + thread.Cpu.LO = r.Uint32() + + return thread +} + +func InitializeSingleThread(randSeed int, state *multithreaded.State, traverseRight bool) { + singleThread := RandomThread(int64(randSeed)) + + state.NextThreadId = singleThread.ThreadId + 1 + state.TraverseRight = traverseRight + if traverseRight { + state.RightThreadStack = []*multithreaded.ThreadState{singleThread} + state.LeftThreadStack = []*multithreaded.ThreadState{} + } else { + state.RightThreadStack = []*multithreaded.ThreadState{} + state.LeftThreadStack = []*multithreaded.ThreadState{singleThread} + } +} + +func SetupThreads(randomSeed int64, state *multithreaded.State, traverseRight bool, activeStackSize, otherStackSize int) { + var activeStack, otherStack []*multithreaded.ThreadState + + tid := uint32(0) + for i := 0; i < activeStackSize; i++ { + thread := RandomThread(randomSeed + int64(i)) + thread.ThreadId = tid + activeStack = append(activeStack, thread) + tid++ + } + + for i := 0; i < otherStackSize; i++ { + thread := RandomThread(randomSeed + int64(i+activeStackSize)) + thread.ThreadId = tid + otherStack = append(otherStack, thread) + tid++ + } + + state.NextThreadId = tid + state.TraverseRight = traverseRight + if traverseRight { + state.RightThreadStack = activeStack + state.LeftThreadStack = otherStack + } else { + state.LeftThreadStack = activeStack + state.RightThreadStack = otherStack + } +} + +type ThreadIterator struct { + left []*multithreaded.ThreadState + right []*multithreaded.ThreadState + traverseRight bool +} + +func NewThreadIterator(state *multithreaded.State) ThreadIterator { + return ThreadIterator{ + left: state.LeftThreadStack, + right: state.RightThreadStack, + traverseRight: state.TraverseRight, + } +} + +func (i *ThreadIterator) currentThread() *multithreaded.ThreadState { + var currentThread *multithreaded.ThreadState + if i.traverseRight { + currentThread = i.right[len(i.right)-1] + } else { + currentThread = i.left[len(i.left)-1] + } + return currentThread +} + +func (i *ThreadIterator) Next() *multithreaded.ThreadState { + rightLen := len(i.right) + leftLen := len(i.left) + activeThread := i.currentThread() + + if i.traverseRight { + i.right = i.right[:rightLen-1] + i.left = append(i.left, activeThread) + i.traverseRight = len(i.right) > 0 + } else { + i.left = i.left[:leftLen-1] + i.right = append(i.right, activeThread) + i.traverseRight = len(i.left) == 0 + } + + return i.currentThread() +} + +// FindNextThread Finds the next thread in line according to thread traversal logic +func FindNextThread(state *multithreaded.State) *multithreaded.ThreadState { + it := NewThreadIterator(state) + return it.Next() +} + +type ThreadFilter func(thread *multithreaded.ThreadState) bool + +func FindNextThreadFiltered(state *multithreaded.State, filter ThreadFilter) *multithreaded.ThreadState { + it := NewThreadIterator(state) + + // Worst case - walk all the way left, then all the way back right + // Example w 3 threads: 1,2,3,3,2,1,0 -> 7 steps to find thread 0 + maxIterations := state.ThreadCount()*2 + 1 + for i := 0; i < maxIterations; i++ { + next := it.Next() + if filter(next) { + return next + } + } + + return nil +} + +func FindNextThreadExcluding(state *multithreaded.State, threadId uint32) *multithreaded.ThreadState { + return FindNextThreadFiltered(state, func(t *multithreaded.ThreadState) bool { + return t.ThreadId != threadId + }) +} + +func FindThread(state *multithreaded.State, threadId uint32) *multithreaded.ThreadState { + for _, t := range GetAllThreads(state) { + if t.ThreadId == threadId { + return t + } + } + return nil +} + +func GetAllThreads(state *multithreaded.State) []*multithreaded.ThreadState { + allThreads := make([]*multithreaded.ThreadState, 0, state.ThreadCount()) + allThreads = append(allThreads, state.RightThreadStack[:]...) + allThreads = append(allThreads, state.LeftThreadStack[:]...) + + return allThreads +} + +func GetThreadStacks(state *multithreaded.State) (activeStack, inactiveStack []*multithreaded.ThreadState) { + if state.TraverseRight { + activeStack = state.RightThreadStack + inactiveStack = state.LeftThreadStack + } else { + activeStack = state.LeftThreadStack + inactiveStack = state.RightThreadStack + } + return activeStack, inactiveStack +} diff --git a/cannon/mipsevm/multithreaded/thread.go b/cannon/mipsevm/multithreaded/thread.go new file mode 100644 index 000000000000..f811a52be467 --- /dev/null +++ b/cannon/mipsevm/multithreaded/thread.go @@ -0,0 +1,135 @@ +package multithreaded + +import ( + "encoding/binary" + "io" + + "github.com/ethereum/go-ethereum/common" + "github.com/ethereum/go-ethereum/crypto" + + "github.com/ethereum-optimism/optimism/cannon/mipsevm" + "github.com/ethereum-optimism/optimism/cannon/mipsevm/exec" +) + +// SERIALIZED_THREAD_SIZE is the size of a serialized ThreadState object +const SERIALIZED_THREAD_SIZE = 166 + +// THREAD_WITNESS_SIZE is the size of a thread witness encoded in bytes. +// +// It consists of the active thread serialized and concatenated with the +// 32 byte hash onion of the active thread stack without the active thread +const THREAD_WITNESS_SIZE = SERIALIZED_THREAD_SIZE + 32 + +// The empty thread root - keccak256(bytes32(0) ++ bytes32(0)) +var EmptyThreadsRoot common.Hash = common.HexToHash("0xad3228b676f7d3cd4284a5443f17f1962b36e491b30a40b2405849e597ba5fb5") + +type ThreadState struct { + ThreadId uint32 `json:"threadId"` + ExitCode uint8 `json:"exit"` + Exited bool `json:"exited"` + FutexAddr uint32 `json:"futexAddr"` + FutexVal uint32 `json:"futexVal"` + FutexTimeoutStep uint64 `json:"futexTimeoutStep"` + Cpu mipsevm.CpuScalars `json:"cpu"` + Registers [32]uint32 `json:"registers"` +} + +func CreateEmptyThread() *ThreadState { + initThreadId := uint32(0) + return &ThreadState{ + ThreadId: initThreadId, + ExitCode: 0, + Exited: false, + Cpu: mipsevm.CpuScalars{ + PC: 0, + NextPC: 4, + LO: 0, + HI: 0, + }, + FutexAddr: exec.FutexEmptyAddr, + FutexVal: 0, + FutexTimeoutStep: 0, + Registers: [32]uint32{}, + } +} + +func (t *ThreadState) serializeThread() []byte { + out := make([]byte, 0, SERIALIZED_THREAD_SIZE) + + out = binary.BigEndian.AppendUint32(out, t.ThreadId) + out = append(out, t.ExitCode) + out = mipsevm.AppendBoolToWitness(out, t.Exited) + out = binary.BigEndian.AppendUint32(out, t.FutexAddr) + out = binary.BigEndian.AppendUint32(out, t.FutexVal) + out = binary.BigEndian.AppendUint64(out, t.FutexTimeoutStep) + + out = binary.BigEndian.AppendUint32(out, t.Cpu.PC) + out = binary.BigEndian.AppendUint32(out, t.Cpu.NextPC) + out = binary.BigEndian.AppendUint32(out, t.Cpu.LO) + out = binary.BigEndian.AppendUint32(out, t.Cpu.HI) + + for _, r := range t.Registers { + out = binary.BigEndian.AppendUint32(out, r) + } + + return out +} + +// Serialize writes the ThreadState in a simple binary format which can be read again using Deserialize +// The format exactly matches the serialization generated by serializeThread used for thread proofs. +func (t *ThreadState) Serialize(out io.Writer) error { + _, err := out.Write(t.serializeThread()) + return err +} + +func (t *ThreadState) Deserialize(in io.Reader) error { + if err := binary.Read(in, binary.BigEndian, &t.ThreadId); err != nil { + return err + } + if err := binary.Read(in, binary.BigEndian, &t.ExitCode); err != nil { + return err + } + var exited uint8 + if err := binary.Read(in, binary.BigEndian, &exited); err != nil { + return err + } + t.Exited = exited != 0 + if err := binary.Read(in, binary.BigEndian, &t.FutexAddr); err != nil { + return err + } + if err := binary.Read(in, binary.BigEndian, &t.FutexVal); err != nil { + return err + } + if err := binary.Read(in, binary.BigEndian, &t.FutexTimeoutStep); err != nil { + return err + } + if err := binary.Read(in, binary.BigEndian, &t.Cpu.PC); err != nil { + return err + } + if err := binary.Read(in, binary.BigEndian, &t.Cpu.NextPC); err != nil { + return err + } + if err := binary.Read(in, binary.BigEndian, &t.Cpu.LO); err != nil { + return err + } + if err := binary.Read(in, binary.BigEndian, &t.Cpu.HI); err != nil { + return err + } + // Read the registers as big endian uint32s + for i := range t.Registers { + if err := binary.Read(in, binary.BigEndian, &t.Registers[i]); err != nil { + return err + } + } + return nil +} + +func computeThreadRoot(prevStackRoot common.Hash, threadToPush *ThreadState) common.Hash { + hashedThread := crypto.Keccak256Hash(threadToPush.serializeThread()) + + var hashData []byte + hashData = append(hashData, prevStackRoot[:]...) + hashData = append(hashData, hashedThread[:]...) + + return crypto.Keccak256Hash(hashData) +} diff --git a/cannon/mipsevm/open_mips_tests/README.md b/cannon/mipsevm/open_mips_tests/README.md deleted file mode 100644 index db69c9d91db6..000000000000 --- a/cannon/mipsevm/open_mips_tests/README.md +++ /dev/null @@ -1,10 +0,0 @@ -# OpenMIPS test vectors - -Tests from https://github.com/grantae/OpenMIPS/tree/d606b35e9d5260aef20de2a58660c8303a681e9c/software/test/macro/tests - -OpenMIPS is licensed LGPLv3 (as seen in the root of the repository), see [`LICENSE`](./LICENSE) file. -Note that some build-system files from 2014/2015 in that repository by the same author are marked as BSD licensed, -but the build-system is not used here. - -Requires https://github.com/sergev/LiteBSD/releases/download/tools/gcc-4.8.1-mips-macosx.tgz to build - diff --git a/cannon/mipsevm/open_mips_tests/test/bin/oracle_kzg.bin b/cannon/mipsevm/open_mips_tests/test/bin/oracle_kzg.bin deleted file mode 100644 index 20a642fa430c..000000000000 Binary files a/cannon/mipsevm/open_mips_tests/test/bin/oracle_kzg.bin and /dev/null differ diff --git a/cannon/mipsevm/open_mips_tests/test/oracle_kzg.asm b/cannon/mipsevm/open_mips_tests/test/oracle_kzg.asm deleted file mode 100644 index 8faf349bf3ab..000000000000 --- a/cannon/mipsevm/open_mips_tests/test/oracle_kzg.asm +++ /dev/null @@ -1,102 +0,0 @@ -.section .test, "x" - .balign 4 - .set noreorder - .global test - .ent test - -# load hash at 0x30001000 -# point evaluation precompile input - 01e798154708fe7789429634053cbf9f99b619f9f084048927333fce637f549b564c0a11a0f704f4fc3e8acfe0f8245f0ad1347b378fbf96e206da11a5d3630624d25032e67a7e6a4910df5834b8fe70e6bcfeeac0352434196bdf4b2485d5a18f59a8d2a1a625a17f3fea0fe5eb8c896db3764f3185481bc22f91b4aaffcca25f26936857bc3a7c2539ea8ec3a952b7873033e038326e87ed3e1276fd140253fa08e9fc25fb2d9a98527fc22a2c9612fbeafdad446cbc7bcdbdcd780af2c16a -# 0x0a44472c cb798bc5 954fc466 e6ee2c31 e1ca8a87 d000966c 629d679a 4a29921f = keccak(address(0xa) ++ precompile_input) -# 0x0644472c cb798bc5 954fc466 e6ee2c31 e1ca8a87 d000966c 629d679a 4a29921f = keccak(address(0xa) ++ precompile_input).key (precompile) -test: - lui $s0, 0x3000 - ori $s0, 0x1000 - - lui $t0, 0x0644 - ori $t0, 0x472c - sw $t0, 0($s0) - lui $t0, 0xcb79 - ori $t0, 0x8bc5 - sw $t0, 4($s0) - lui $t0, 0x954f - ori $t0, 0xc466 - sw $t0, 8($s0) - lui $t0, 0xe6ee - ori $t0, 0x2c31 - sw $t0, 0xc($s0) - lui $t0, 0xe1ca - ori $t0, 0x8a87 - sw $t0, 0x10($s0) - lui $t0, 0xd000 - ori $t0, 0x966c - sw $t0, 0x14($s0) - lui $t0, 0x629d - ori $t0, 0x679a - sw $t0, 0x18($s0) - lui $t0, 0x4a29 - ori $t0, 0x921f - sw $t0, 0x1c($s0) - -# preimage request - write(fdPreimageWrite, preimageData, 32) - li $a0, 6 - li $a1, 0x30001000 - li $t0, 8 - li $a2, 4 -$writeloop: - li $v0, 4004 - syscall - addiu $a1, $a1, 4 - addiu $t0, $t0, -1 - bnez $t0, $writeloop - nop - -# preimage response to 0x30002000 - read(fdPreimageRead, addr, count) -# read preimage length - li $a0, 5 - li $a1, 0x31000000 - li $a2, 4 - li $v0, 4003 - syscall - li $a1, 0x31000004 - li $v0, 4003 - syscall -# read the 1 byte precompile status and 3 bytes of return data - li $a1, 0x31000008 - li $v0, 4003 - syscall - nop - -# length at 0x31000000. We also check that the lower 32 bits are zero - lui $s1, 0x3100 - lw $t0, 0($s1) - sltiu $t6, $t0, 1 - li $s1, 0x31000004 - lw $t0, 0($s1) -# should be 1 + len(blobPrecompileReturnValue) = 65 - li $t4, 65 - subu $t5, $t0, $t4 - sltiu $v0, $t5, 1 - and $v0, $v0, $t6 - -# data at 0x31000008 -# first byte is 01 status. Next 3 bytes are 0 - lw $t0, 4($s1) - lui $t4, 0x0100 - ori $t4, 0x0000 - subu $t5, $t0, $t4 - sltiu $v1, $t5, 1 - and $v0, $v0, $v1 - -# save results - lui $s0, 0xbfff # Load the base address 0xbffffff0 - ori $s0, 0xfff0 - ori $s1, $0, 1 # Prepare the 'done' status - - sw $v0, 8($s0) # Set the test result - sw $s1, 4($s0) # Set 'done' - -$done: - jr $ra - nop - - .end test diff --git a/cannon/mipsevm/oracle.go b/cannon/mipsevm/oracle.go new file mode 100644 index 000000000000..d48448001ffa --- /dev/null +++ b/cannon/mipsevm/oracle.go @@ -0,0 +1,6 @@ +package mipsevm + +type PreimageOracle interface { + Hint(v []byte) + GetPreimage(k [32]byte) []byte +} diff --git a/cannon/mipsevm/patch.go b/cannon/mipsevm/patch.go deleted file mode 100644 index 64a05e9611a4..000000000000 --- a/cannon/mipsevm/patch.go +++ /dev/null @@ -1,131 +0,0 @@ -package mipsevm - -import ( - "bytes" - "debug/elf" - "encoding/binary" - "fmt" - "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: HEAP_START, - Registers: [32]uint32{}, - Memory: NewMemory(), - ExitCode: 0, - Exited: false, - Step: 0, - } - - for i, prog := range f.Progs { - if prog.Type == 0x70000003 { // MIPS_ABIFLAGS - continue - } - - r := io.Reader(io.NewSectionReader(prog, 0, int64(prog.Filesz))) - if prog.Filesz != prog.Memsz { - if prog.Type == elf.PT_LOAD { - if prog.Filesz < prog.Memsz { - r = io.MultiReader(r, bytes.NewReader(make([]byte, prog.Memsz-prog.Filesz))) - } else { - return nil, fmt.Errorf("invalid PT_LOAD program segment %d, file size (%d) > mem size (%d)", i, prog.Filesz, prog.Memsz) - } - } else { - return nil, fmt.Errorf("program segment %d has different file size (%d) than mem size (%d): filling for non PT_LOAD segments is not supported", i, prog.Filesz, prog.Memsz) - } - } - - 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) - } - } - - return s, nil -} - -func PatchGo(f *elf.File, st *State) error { - symbols, err := f.Symbols() - if err != nil { - return fmt.Errorf("failed to read symbols data, cannot patch program: %w", err) - } - - for _, s := range symbols { - // Disable Golang GC by patching the functions that enable the GC to a no-op function. - switch s.Name { - case "runtime.gcenable", - "runtime.init.5", // patch out: init() { go forcegchelper() } - "runtime.main.func1", // patch out: main.func() { newm(sysmon, ....) } - "runtime.deductSweepCredit", // uses floating point nums and interacts with gc we disabled - "runtime.(*gcControllerState).commit", - // these prometheus packages rely on concurrent background things. We cannot run those. - "github.com/prometheus/client_golang/prometheus.init", - "github.com/prometheus/client_golang/prometheus.init.0", - "github.com/prometheus/procfs.init", - "github.com/prometheus/common/model.init", - "github.com/prometheus/client_model/go.init", - "github.com/prometheus/client_model/go.init.0", - "github.com/prometheus/client_model/go.init.1", - // skip flag pkg init, we need to debug arg-processing more to see why this fails - "flag.init", - // We need to patch this out, we don't pass float64nan because we don't support floats - "runtime.check": - // MIPS32 patch: ret (pseudo instruction) - // 03e00008 = jr $ra = ret (pseudo instruction) - // 00000000 = nop (executes with delay-slot, but does nothing) - if err := st.Memory.SetMemoryRange(uint32(s.Value), bytes.NewReader([]byte{ - 0x03, 0xe0, 0x00, 0x08, - 0, 0, 0, 0, - })); err != nil { - return fmt.Errorf("failed to patch Go runtime.gcenable: %w", err) - } - case "runtime.MemProfileRate": - if err := st.Memory.SetMemoryRange(uint32(s.Value), bytes.NewReader(make([]byte, 4))); err != nil { // disable mem profiling, to avoid a lot of unnecessary floating point ops - return err - } - } - } - return nil -} - -func PatchStack(st *State) error { - // setup stack pointer - sp := uint32(0x7f_ff_d0_00) - // allocate 1 page for the initial stack data, and 16KB = 4 pages for the stack to grow - if err := st.Memory.SetMemoryRange(sp-4*PageSize, bytes.NewReader(make([]byte, 5*PageSize))); err != nil { - return fmt.Errorf("failed to allocate page for stack content") - } - st.Registers[29] = sp - - storeMem := func(addr uint32, v uint32) { - var dat [4]byte - binary.BigEndian.PutUint32(dat[:], v) - _ = st.Memory.SetMemoryRange(addr, bytes.NewReader(dat[:])) - } - - // init argc, argv, aux on stack - storeMem(sp+4*1, 0x42) // argc = 0 (argument count) - storeMem(sp+4*2, 0x35) // argv[n] = 0 (terminating argv) - storeMem(sp+4*3, 0) // envp[term] = 0 (no env vars) - storeMem(sp+4*4, 6) // auxv[0] = _AT_PAGESZ = 6 (key) - storeMem(sp+4*5, 4096) // auxv[1] = page size of 4 KiB (value) - (== minPhysPageSize) - storeMem(sp+4*6, 25) // auxv[2] = AT_RANDOM - storeMem(sp+4*7, sp+4*9) // auxv[3] = address of 16 bytes containing random value - storeMem(sp+4*8, 0) // auxv[term] = 0 - - _ = st.Memory.SetMemoryRange(sp+4*9, bytes.NewReader([]byte("4;byfairdiceroll"))) // 16 bytes of "randomness" - - return nil -} diff --git a/cannon/mipsevm/program/load.go b/cannon/mipsevm/program/load.go new file mode 100644 index 000000000000..5ff0b4098bc8 --- /dev/null +++ b/cannon/mipsevm/program/load.go @@ -0,0 +1,54 @@ +package program + +import ( + "bytes" + "debug/elf" + "fmt" + "io" + + "github.com/ethereum-optimism/optimism/cannon/mipsevm" +) + +const ( + HEAP_START = 0x05_00_00_00 + HEAP_END = 0x60_00_00_00 + PROGRAM_BREAK = 0x40_00_00_00 +) + +type CreateInitialFPVMState[T mipsevm.FPVMState] func(pc, heapStart uint32) T + +func LoadELF[T mipsevm.FPVMState](f *elf.File, initState CreateInitialFPVMState[T]) (T, error) { + var empty T + s := initState(uint32(f.Entry), HEAP_START) + + for i, prog := range f.Progs { + if prog.Type == 0x70000003 { // MIPS_ABIFLAGS + continue + } + + r := io.Reader(io.NewSectionReader(prog, 0, int64(prog.Filesz))) + if prog.Filesz != prog.Memsz { + if prog.Type == elf.PT_LOAD { + if prog.Filesz < prog.Memsz { + r = io.MultiReader(r, bytes.NewReader(make([]byte, prog.Memsz-prog.Filesz))) + } else { + return empty, fmt.Errorf("invalid PT_LOAD program segment %d, file size (%d) > mem size (%d)", i, prog.Filesz, prog.Memsz) + } + } else { + return empty, fmt.Errorf("program segment %d has different file size (%d) than mem size (%d): filling for non PT_LOAD segments is not supported", i, prog.Filesz, prog.Memsz) + } + } + + if prog.Vaddr+prog.Memsz >= uint64(1<<32) { + return empty, 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 empty, 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.GetMemory().SetMemoryRange(uint32(prog.Vaddr), r); err != nil { + return empty, fmt.Errorf("failed to read program segment %d: %w", i, err) + } + } + + return s, nil +} diff --git a/cannon/mipsevm/metadata.go b/cannon/mipsevm/program/metadata.go similarity index 81% rename from cannon/mipsevm/metadata.go rename to cannon/mipsevm/program/metadata.go index 6b2748fa0076..fb34da7694c7 100644 --- a/cannon/mipsevm/metadata.go +++ b/cannon/mipsevm/program/metadata.go @@ -1,9 +1,11 @@ -package mipsevm +package program import ( "debug/elf" "fmt" "sort" + + "github.com/ethereum-optimism/optimism/cannon/mipsevm" ) type Symbol struct { @@ -16,6 +18,8 @@ type Metadata struct { Symbols []Symbol `json:"symbols"` } +var _ mipsevm.Metadata = (*Metadata)(nil) + func MakeMetadata(elfProgram *elf.File) (*Metadata, error) { syms, err := elfProgram.Symbols() if err != nil { @@ -50,7 +54,7 @@ func (m *Metadata) LookupSymbol(addr uint32) string { return out.Name } -func (m *Metadata) SymbolMatcher(name string) func(addr uint32) bool { +func (m *Metadata) CreateSymbolMatcher(name string) mipsevm.SymbolMatcher { for _, s := range m.Symbols { if s.Name == name { start := s.Start @@ -64,14 +68,3 @@ func (m *Metadata) SymbolMatcher(name string) func(addr uint32) bool { return false } } - -// HexU32 to lazy-format integer attributes for logging -type HexU32 uint32 - -func (v HexU32) String() string { - return fmt.Sprintf("%08x", uint32(v)) -} - -func (v HexU32) MarshalText() ([]byte, error) { - return []byte(v.String()), nil -} diff --git a/cannon/mipsevm/program/patch.go b/cannon/mipsevm/program/patch.go new file mode 100644 index 000000000000..e8e2e3ebc085 --- /dev/null +++ b/cannon/mipsevm/program/patch.go @@ -0,0 +1,96 @@ +package program + +import ( + "bytes" + "debug/elf" + "encoding/binary" + "errors" + "fmt" + + "github.com/ethereum-optimism/optimism/cannon/mipsevm" + "github.com/ethereum-optimism/optimism/cannon/mipsevm/memory" +) + +// PatchGoGC patches out garbage-collection-related symbols to disable garbage collection +// and improves performance by patching out floating-point-related symbols +func PatchGoGC(f *elf.File, st mipsevm.FPVMState) error { + symbols, err := f.Symbols() + if err != nil { + return fmt.Errorf("failed to read symbols data, cannot patch program: %w", err) + } + + for _, s := range symbols { + // Disable Golang GC by patching the functions that enable the GC to a no-op function. + switch s.Name { + case "runtime.gcenable", + "runtime.init.5", // patch out: init() { go forcegchelper() } + "runtime.main.func1", // patch out: main.func() { newm(sysmon, ....) } + "runtime.deductSweepCredit", // uses floating point nums and interacts with gc we disabled + "runtime.(*gcControllerState).commit", + // these prometheus packages rely on concurrent background things. We cannot run those. + "github.com/prometheus/client_golang/prometheus.init", + "github.com/prometheus/client_golang/prometheus.init.0", + "github.com/prometheus/procfs.init", + "github.com/prometheus/common/model.init", + "github.com/prometheus/client_model/go.init", + "github.com/prometheus/client_model/go.init.0", + "github.com/prometheus/client_model/go.init.1", + // skip flag pkg init, we need to debug arg-processing more to see why this fails + "flag.init", + // We need to patch this out, we don't pass float64nan because we don't support floats + "runtime.check": + // MIPS32 patch: ret (pseudo instruction) + // 03e00008 = jr $ra = ret (pseudo instruction) + // 00000000 = nop (executes with delay-slot, but does nothing) + if err := st.GetMemory().SetMemoryRange(uint32(s.Value), bytes.NewReader([]byte{ + 0x03, 0xe0, 0x00, 0x08, + 0, 0, 0, 0, + })); err != nil { + return fmt.Errorf("failed to patch Go runtime.gcenable: %w", err) + } + } + } + return nil +} + +// PatchStack sets up the program's initial stack frame and stack pointer +func PatchStack(st mipsevm.FPVMState) error { + // setup stack pointer + sp := uint32(0x7f_ff_d0_00) + // allocate 1 page for the initial stack data, and 16KB = 4 pages for the stack to grow + if err := st.GetMemory().SetMemoryRange(sp-4*memory.PageSize, bytes.NewReader(make([]byte, 5*memory.PageSize))); err != nil { + return errors.New("failed to allocate page for stack content") + } + st.GetRegistersRef()[29] = sp + + storeMem := func(addr uint32, v uint32) { + var dat [4]byte + binary.BigEndian.PutUint32(dat[:], v) + _ = st.GetMemory().SetMemoryRange(addr, bytes.NewReader(dat[:])) + } + + // init argc, argv, aux on stack + storeMem(sp+4*0, 1) // argc = 1 (argument count) + storeMem(sp+4*1, sp+4*21) // argv[0] + storeMem(sp+4*2, 0) // argv[1] = terminating + storeMem(sp+4*3, sp+4*14) // envp[0] = x (offset to first env var) + storeMem(sp+4*4, 0) // envp[1] = terminating + storeMem(sp+4*5, 6) // auxv[0] = _AT_PAGESZ = 6 (key) + storeMem(sp+4*6, 4096) // auxv[1] = page size of 4 KiB (value) - (== minPhysPageSize) + storeMem(sp+4*7, 25) // auxv[2] = AT_RANDOM + storeMem(sp+4*8, sp+4*10) // auxv[3] = address of 16 bytes containing random value + storeMem(sp+4*9, 0) // auxv[term] = 0 + + _ = st.GetMemory().SetMemoryRange(sp+4*10, bytes.NewReader([]byte("4;byfairdiceroll"))) // 16 bytes of "randomness" + + // append 4 extra zero bytes to end at 4-byte alignment + envar := append([]byte("GODEBUG=memprofilerate=0"), 0x0, 0x0, 0x0, 0x0) + _ = st.GetMemory().SetMemoryRange(sp+4*14, bytes.NewReader(envar)) + + // 24 bytes for GODEBUG=memprofilerate=0 + 4 null bytes + // Then append program name + 2 null bytes for 4-byte alignment + programName := append([]byte("op-program"), 0x0, 0x0) + _ = st.GetMemory().SetMemoryRange(sp+4*21, bytes.NewReader(programName)) + + return nil +} diff --git a/cannon/mipsevm/singlethreaded/instrumented.go b/cannon/mipsevm/singlethreaded/instrumented.go new file mode 100644 index 000000000000..800cc1a92f7a --- /dev/null +++ b/cannon/mipsevm/singlethreaded/instrumented.go @@ -0,0 +1,117 @@ +package singlethreaded + +import ( + "io" + + "github.com/ethereum-optimism/optimism/cannon/mipsevm" + "github.com/ethereum-optimism/optimism/cannon/mipsevm/exec" + "github.com/ethereum/go-ethereum/common/hexutil" +) + +type InstrumentedState struct { + meta mipsevm.Metadata + sleepCheck mipsevm.SymbolMatcher + + state *State + + stdOut io.Writer + stdErr io.Writer + + memoryTracker *exec.MemoryTrackerImpl + stackTracker exec.TraceableStackTracker + + preimageOracle *exec.TrackingPreimageOracleReader +} + +var _ mipsevm.FPVM = (*InstrumentedState)(nil) + +func NewInstrumentedState(state *State, po mipsevm.PreimageOracle, stdOut, stdErr io.Writer, meta mipsevm.Metadata) *InstrumentedState { + var sleepCheck mipsevm.SymbolMatcher + if meta == nil { + sleepCheck = func(addr uint32) bool { return false } + } else { + sleepCheck = meta.CreateSymbolMatcher("runtime.notesleep") + } + return &InstrumentedState{ + sleepCheck: sleepCheck, + state: state, + stdOut: stdOut, + stdErr: stdErr, + memoryTracker: exec.NewMemoryTracker(state.Memory), + stackTracker: &exec.NoopStackTracker{}, + preimageOracle: exec.NewTrackingPreimageOracleReader(po), + meta: meta, + } +} + +func (m *InstrumentedState) InitDebug() error { + stackTracker, err := exec.NewStackTracker(m.state, m.meta) + if err != nil { + return err + } + m.stackTracker = stackTracker + return nil +} + +func (m *InstrumentedState) Step(proof bool) (wit *mipsevm.StepWitness, err error) { + m.preimageOracle.Reset() + m.memoryTracker.Reset(proof) + + if proof { + insnProof := m.state.Memory.MerkleProof(m.state.Cpu.PC) + encodedWitness, stateHash := m.state.EncodeWitness() + wit = &mipsevm.StepWitness{ + State: encodedWitness, + StateHash: stateHash, + ProofData: insnProof[:], + } + } + err = m.mipsStep() + if err != nil { + return nil, err + } + + if proof { + memProof := m.memoryTracker.MemProof() + wit.ProofData = append(wit.ProofData, memProof[:]...) + lastPreimageKey, lastPreimage, lastPreimageOffset := m.preimageOracle.LastPreimage() + if lastPreimageOffset != ^uint32(0) { + wit.PreimageOffset = lastPreimageOffset + wit.PreimageKey = lastPreimageKey + wit.PreimageValue = lastPreimage + } + } + return +} + +func (m *InstrumentedState) CheckInfiniteLoop() bool { + return m.sleepCheck(m.state.GetPC()) +} + +func (m *InstrumentedState) LastPreimage() ([32]byte, []byte, uint32) { + return m.preimageOracle.LastPreimage() +} + +func (m *InstrumentedState) GetState() mipsevm.FPVMState { + return m.state +} + +func (m *InstrumentedState) GetDebugInfo() *mipsevm.DebugInfo { + return &mipsevm.DebugInfo{ + Pages: m.state.Memory.PageCount(), + MemoryUsed: hexutil.Uint64(m.state.Memory.UsageRaw()), + NumPreimageRequests: m.preimageOracle.NumPreimageRequests(), + TotalPreimageSize: m.preimageOracle.TotalPreimageSize(), + } +} + +func (m *InstrumentedState) Traceback() { + m.stackTracker.Traceback() +} + +func (m *InstrumentedState) LookupSymbol(addr uint32) string { + if m.meta == nil { + return "" + } + return m.meta.LookupSymbol(addr) +} diff --git a/cannon/mipsevm/singlethreaded/instrumented_test.go b/cannon/mipsevm/singlethreaded/instrumented_test.go new file mode 100644 index 000000000000..8b4c61bd4e14 --- /dev/null +++ b/cannon/mipsevm/singlethreaded/instrumented_test.go @@ -0,0 +1,27 @@ +package singlethreaded + +import ( + "io" + "testing" + + "github.com/ethereum/go-ethereum/log" + + "github.com/ethereum-optimism/optimism/cannon/mipsevm" + "github.com/ethereum-optimism/optimism/cannon/mipsevm/testutil" +) + +func vmFactory(state *State, po mipsevm.PreimageOracle, stdOut, stdErr io.Writer, log log.Logger) mipsevm.FPVM { + return NewInstrumentedState(state, po, stdOut, stdErr, nil) +} + +func TestInstrumentedState_OpenMips(t *testing.T) { + testutil.RunVMTests_OpenMips(t, CreateEmptyState, vmFactory) +} + +func TestInstrumentedState_Hello(t *testing.T) { + testutil.RunVMTest_Hello(t, CreateInitialState, vmFactory, true) +} + +func TestInstrumentedState_Claim(t *testing.T) { + testutil.RunVMTest_Claim(t, CreateInitialState, vmFactory, true) +} diff --git a/cannon/mipsevm/singlethreaded/mips.go b/cannon/mipsevm/singlethreaded/mips.go new file mode 100644 index 000000000000..a88d0c66b0e6 --- /dev/null +++ b/cannon/mipsevm/singlethreaded/mips.go @@ -0,0 +1,100 @@ +package singlethreaded + +import ( + "fmt" + + "github.com/ethereum/go-ethereum/common" + "github.com/ethereum/go-ethereum/common/hexutil" + + "github.com/ethereum-optimism/optimism/cannon/mipsevm/exec" + "github.com/ethereum-optimism/optimism/cannon/mipsevm/program" +) + +func (m *InstrumentedState) handleSyscall() error { + syscallNum, a0, a1, a2, _ := exec.GetSyscallArgs(&m.state.Registers) + + v0 := uint32(0) + v1 := uint32(0) + + //fmt.Printf("syscall: %d\n", syscallNum) + switch syscallNum { + case exec.SysMmap: + var newHeap uint32 + v0, v1, newHeap = exec.HandleSysMmap(a0, a1, m.state.Heap) + m.state.Heap = newHeap + case exec.SysBrk: + v0 = program.PROGRAM_BREAK + case exec.SysClone: // clone (not supported) + v0 = 1 + case exec.SysExitGroup: + m.state.Exited = true + m.state.ExitCode = uint8(a0) + return nil + case exec.SysRead: + var newPreimageOffset uint32 + v0, v1, newPreimageOffset, _, _ = exec.HandleSysRead(a0, a1, a2, m.state.PreimageKey, m.state.PreimageOffset, m.preimageOracle, m.state.Memory, m.memoryTracker) + m.state.PreimageOffset = newPreimageOffset + case exec.SysWrite: + var newLastHint hexutil.Bytes + var newPreimageKey common.Hash + var newPreimageOffset uint32 + v0, v1, newLastHint, newPreimageKey, newPreimageOffset = exec.HandleSysWrite(a0, a1, a2, m.state.LastHint, m.state.PreimageKey, m.state.PreimageOffset, m.preimageOracle, m.state.Memory, m.memoryTracker, m.stdOut, m.stdErr) + m.state.LastHint = newLastHint + m.state.PreimageKey = newPreimageKey + m.state.PreimageOffset = newPreimageOffset + case exec.SysFcntl: + v0, v1 = exec.HandleSysFcntl(a0, a1) + } + + exec.HandleSyscallUpdates(&m.state.Cpu, &m.state.Registers, v0, v1) + return nil +} + +func (m *InstrumentedState) mipsStep() error { + if m.state.Exited { + return nil + } + m.state.Step += 1 + // instruction fetch + insn, opcode, fun := exec.GetInstructionDetails(m.state.Cpu.PC, m.state.Memory) + + // Handle syscall separately + // syscall (can read and write) + if opcode == 0 && fun == 0xC { + return m.handleSyscall() + } + + // Handle RMW (read-modify-write) ops + if opcode == exec.OpLoadLinked || opcode == exec.OpStoreConditional { + return m.handleRMWOps(insn, opcode) + } + + // Exec the rest of the step logic + _, _, err := exec.ExecMipsCoreStepLogic(&m.state.Cpu, &m.state.Registers, m.state.Memory, insn, opcode, fun, m.memoryTracker, m.stackTracker) + return err +} + +// handleRMWOps handles LL and SC operations which provide the primitives to implement read-modify-write operations +func (m *InstrumentedState) handleRMWOps(insn, opcode uint32) error { + baseReg := (insn >> 21) & 0x1F + base := m.state.Registers[baseReg] + rtReg := (insn >> 16) & 0x1F + offset := exec.SignExtendImmediate(insn) + + effAddr := (base + offset) & 0xFFFFFFFC + m.memoryTracker.TrackMemAccess(effAddr) + mem := m.state.Memory.GetMemory(effAddr) + + var retVal uint32 + if opcode == exec.OpLoadLinked { + retVal = mem + } else if opcode == exec.OpStoreConditional { + rt := m.state.Registers[rtReg] + m.state.Memory.SetMemory(effAddr, rt) + retVal = 1 // 1 for success + } else { + panic(fmt.Sprintf("Invalid instruction passed to handleRMWOps (opcode %08x)", opcode)) + } + + return exec.HandleRd(&m.state.Cpu, &m.state.Registers, rtReg, retVal, true) +} diff --git a/cannon/mipsevm/singlethreaded/state.go b/cannon/mipsevm/singlethreaded/state.go new file mode 100644 index 000000000000..e0be88d99857 --- /dev/null +++ b/cannon/mipsevm/singlethreaded/state.go @@ -0,0 +1,327 @@ +package singlethreaded + +import ( + "encoding/binary" + "encoding/json" + "fmt" + "io" + + "github.com/ethereum-optimism/optimism/cannon/serialize" + "github.com/ethereum/go-ethereum/common" + "github.com/ethereum/go-ethereum/common/hexutil" + "github.com/ethereum/go-ethereum/crypto" + "github.com/ethereum/go-ethereum/log" + + "github.com/ethereum-optimism/optimism/cannon/mipsevm" + "github.com/ethereum-optimism/optimism/cannon/mipsevm/memory" +) + +// STATE_WITNESS_SIZE is the size of the state witness encoding in bytes. +const STATE_WITNESS_SIZE = 226 + +type State struct { + Memory *memory.Memory `json:"memory"` + + PreimageKey common.Hash `json:"preimageKey"` + PreimageOffset uint32 `json:"preimageOffset"` // note that the offset includes the 8-byte length prefix + + Cpu mipsevm.CpuScalars `json:"cpu"` + + Heap uint32 `json:"heap"` // to handle mmap growth + + ExitCode uint8 `json:"exit"` + Exited bool `json:"exited"` + + Step uint64 `json:"step"` + + Registers [32]uint32 `json:"registers"` + + // LastHint is optional metadata, and not part of the VM state itself. + LastHint hexutil.Bytes `json:"lastHint,omitempty"` +} + +var _ mipsevm.FPVMState = (*State)(nil) + +func CreateEmptyState() *State { + return &State{ + Cpu: mipsevm.CpuScalars{ + PC: 0, + NextPC: 4, + LO: 0, + HI: 0, + }, + Heap: 0, + Registers: [32]uint32{}, + Memory: memory.NewMemory(), + ExitCode: 0, + Exited: false, + Step: 0, + } +} + +func CreateInitialState(pc, heapStart uint32) *State { + state := CreateEmptyState() + state.Cpu.PC = pc + state.Cpu.NextPC = pc + 4 + state.Heap = heapStart + + return state +} + +func (s *State) CreateVM(logger log.Logger, po mipsevm.PreimageOracle, stdOut, stdErr io.Writer, meta mipsevm.Metadata) mipsevm.FPVM { + logger.Info("Using cannon VM") + return NewInstrumentedState(s, po, stdOut, stdErr, meta) +} + +type stateMarshaling struct { + Memory *memory.Memory `json:"memory"` + PreimageKey common.Hash `json:"preimageKey"` + PreimageOffset uint32 `json:"preimageOffset"` + PC uint32 `json:"pc"` + NextPC uint32 `json:"nextPC"` + LO uint32 `json:"lo"` + HI uint32 `json:"hi"` + Heap uint32 `json:"heap"` + ExitCode uint8 `json:"exit"` + Exited bool `json:"exited"` + Step uint64 `json:"step"` + Registers [32]uint32 `json:"registers"` + LastHint hexutil.Bytes `json:"lastHint,omitempty"` +} + +func (s *State) MarshalJSON() ([]byte, error) { // nosemgrep + sm := &stateMarshaling{ + Memory: s.Memory, + PreimageKey: s.PreimageKey, + PreimageOffset: s.PreimageOffset, + PC: s.Cpu.PC, + NextPC: s.Cpu.NextPC, + LO: s.Cpu.LO, + HI: s.Cpu.HI, + Heap: s.Heap, + ExitCode: s.ExitCode, + Exited: s.Exited, + Step: s.Step, + Registers: s.Registers, + LastHint: s.LastHint, + } + return json.Marshal(sm) +} + +func (s *State) UnmarshalJSON(data []byte) error { + sm := new(stateMarshaling) + if err := json.Unmarshal(data, sm); err != nil { + return err + } + s.Memory = sm.Memory + s.PreimageKey = sm.PreimageKey + s.PreimageOffset = sm.PreimageOffset + s.Cpu.PC = sm.PC + s.Cpu.NextPC = sm.NextPC + s.Cpu.LO = sm.LO + s.Cpu.HI = sm.HI + s.Heap = sm.Heap + s.ExitCode = sm.ExitCode + s.Exited = sm.Exited + s.Step = sm.Step + s.Registers = sm.Registers + s.LastHint = sm.LastHint + return nil +} + +func (s *State) GetPC() uint32 { return s.Cpu.PC } + +func (s *State) GetCpu() mipsevm.CpuScalars { return s.Cpu } + +func (s *State) GetRegistersRef() *[32]uint32 { return &s.Registers } + +func (s *State) GetExitCode() uint8 { return s.ExitCode } + +func (s *State) GetExited() bool { return s.Exited } + +func (s *State) GetStep() uint64 { return s.Step } + +func (s *State) GetLastHint() hexutil.Bytes { + return s.LastHint +} + +func (s *State) VMStatus() uint8 { + return mipsevm.VmStatus(s.Exited, s.ExitCode) +} + +func (s *State) GetMemory() *memory.Memory { + return s.Memory +} + +func (s *State) GetHeap() uint32 { + return s.Heap +} + +func (s *State) GetPreimageKey() common.Hash { + return s.PreimageKey +} + +func (s *State) GetPreimageOffset() uint32 { + return s.PreimageOffset +} + +func (s *State) EncodeWitness() ([]byte, common.Hash) { + out := make([]byte, 0, STATE_WITNESS_SIZE) + memRoot := s.Memory.MerkleRoot() + out = append(out, memRoot[:]...) + out = append(out, s.PreimageKey[:]...) + out = binary.BigEndian.AppendUint32(out, s.PreimageOffset) + out = binary.BigEndian.AppendUint32(out, s.Cpu.PC) + out = binary.BigEndian.AppendUint32(out, s.Cpu.NextPC) + out = binary.BigEndian.AppendUint32(out, s.Cpu.LO) + out = binary.BigEndian.AppendUint32(out, s.Cpu.HI) + out = binary.BigEndian.AppendUint32(out, s.Heap) + out = append(out, s.ExitCode) + out = mipsevm.AppendBoolToWitness(out, s.Exited) + out = binary.BigEndian.AppendUint64(out, s.Step) + for _, r := range s.Registers { + out = binary.BigEndian.AppendUint32(out, r) + } + return out, stateHashFromWitness(out) +} + +// Serialize writes the state in a simple binary format which can be read again using Deserialize +// The format is a simple concatenation of fields, with prefixed item count for repeating items and using big endian +// encoding for numbers. +// +// StateVersion uint8(0) +// Memory As per Memory.Serialize +// PreimageKey [32]byte +// PreimageOffset uint32 +// Cpu.PC uint32 +// Cpu.NextPC uint32 +// Cpu.LO uint32 +// Cpu.HI uint32 +// Heap uint32 +// ExitCode uint8 +// Exited uint8 - 0 for false, 1 for true +// Step uint64 +// Registers [32]uint32 +// len(LastHint) uint32 (0 when LastHint is nil) +// LastHint []byte +func (s *State) Serialize(out io.Writer) error { + bout := serialize.NewBinaryWriter(out) + + if err := s.Memory.Serialize(out); err != nil { + return err + } + if err := bout.WriteHash(s.PreimageKey); err != nil { + return err + } + if err := bout.WriteUInt(s.PreimageOffset); err != nil { + return err + } + if err := bout.WriteUInt(s.Cpu.PC); err != nil { + return err + } + if err := bout.WriteUInt(s.Cpu.NextPC); err != nil { + return err + } + if err := bout.WriteUInt(s.Cpu.LO); err != nil { + return err + } + if err := bout.WriteUInt(s.Cpu.HI); err != nil { + return err + } + if err := bout.WriteUInt(s.Heap); err != nil { + return err + } + if err := bout.WriteUInt(s.ExitCode); err != nil { + return err + } + if err := bout.WriteBool(s.Exited); err != nil { + return err + } + if err := bout.WriteUInt(s.Step); err != nil { + return err + } + for _, r := range s.Registers { + if err := bout.WriteUInt(r); err != nil { + return err + } + } + if err := bout.WriteBytes(s.LastHint); err != nil { + return err + } + return nil +} + +func (s *State) Deserialize(in io.Reader) error { + bin := serialize.NewBinaryReader(in) + s.Memory = memory.NewMemory() + if err := s.Memory.Deserialize(in); err != nil { + return err + } + if err := bin.ReadHash(&s.PreimageKey); err != nil { + return err + } + if err := bin.ReadUInt(&s.PreimageOffset); err != nil { + return err + } + if err := bin.ReadUInt(&s.Cpu.PC); err != nil { + return err + } + if err := bin.ReadUInt(&s.Cpu.NextPC); err != nil { + return err + } + if err := bin.ReadUInt(&s.Cpu.LO); err != nil { + return err + } + if err := bin.ReadUInt(&s.Cpu.HI); err != nil { + return err + } + if err := bin.ReadUInt(&s.Heap); err != nil { + return err + } + if err := bin.ReadUInt(&s.ExitCode); err != nil { + return err + } + if err := bin.ReadBool(&s.Exited); err != nil { + return err + } + if err := bin.ReadUInt(&s.Step); err != nil { + return err + } + for i := range s.Registers { + if err := bin.ReadUInt(&s.Registers[i]); err != nil { + return err + } + } + if err := bin.ReadBytes((*[]byte)(&s.LastHint)); err != nil { + return err + } + return nil +} + +type StateWitness []byte + +func (sw StateWitness) StateHash() (common.Hash, error) { + if len(sw) != STATE_WITNESS_SIZE { + return common.Hash{}, fmt.Errorf("Invalid witness length. Got %d, expected %d", len(sw), STATE_WITNESS_SIZE) + } + return stateHashFromWitness(sw), nil +} + +func GetStateHashFn() mipsevm.HashFn { + return func(sw []byte) (common.Hash, error) { + return StateWitness(sw).StateHash() + } +} + +func stateHashFromWitness(sw []byte) common.Hash { + if len(sw) != STATE_WITNESS_SIZE { + panic("Invalid witness length") + } + hash := crypto.Keccak256Hash(sw) + offset := 32*2 + 4*6 + exitCode := sw[offset] + exited := sw[offset+1] + status := mipsevm.VmStatus(exited == 1, exitCode) + hash[0] = status + return hash +} diff --git a/cannon/mipsevm/singlethreaded/state_test.go b/cannon/mipsevm/singlethreaded/state_test.go new file mode 100644 index 000000000000..c3dfd5cd41af --- /dev/null +++ b/cannon/mipsevm/singlethreaded/state_test.go @@ -0,0 +1,150 @@ +package singlethreaded + +import ( + "bytes" + "debug/elf" + "testing" + + "github.com/ethereum/go-ethereum/common" + "github.com/ethereum/go-ethereum/common/hexutil" + "github.com/ethereum/go-ethereum/crypto" + "github.com/stretchr/testify/require" + + "github.com/ethereum-optimism/optimism/cannon/mipsevm" + "github.com/ethereum-optimism/optimism/cannon/mipsevm/memory" + "github.com/ethereum-optimism/optimism/cannon/mipsevm/program" +) + +// Run through all permutations of `exited` / `exitCode` and ensure that the +// correct witness, state hash, and VM Status is produced. +func TestStateHash(t *testing.T) { + cases := []struct { + exited bool + exitCode uint8 + }{ + {exited: false, exitCode: 0}, + {exited: false, exitCode: 1}, + {exited: false, exitCode: 2}, + {exited: false, exitCode: 3}, + {exited: true, exitCode: 0}, + {exited: true, exitCode: 1}, + {exited: true, exitCode: 2}, + {exited: true, exitCode: 3}, + } + + exitedOffset := 32*2 + 4*6 + for _, c := range cases { + state := &State{ + Memory: memory.NewMemory(), + Exited: c.exited, + ExitCode: c.exitCode, + } + + actualWitness, actualStateHash := state.EncodeWitness() + require.Equal(t, len(actualWitness), STATE_WITNESS_SIZE, "Incorrect witness size") + + expectedWitness := make(StateWitness, 226) + memRoot := state.Memory.MerkleRoot() + copy(expectedWitness[:32], memRoot[:]) + expectedWitness[exitedOffset] = c.exitCode + var exited uint8 + if c.exited { + exited = 1 + } + expectedWitness[exitedOffset+1] = uint8(exited) + require.EqualValues(t, expectedWitness[:], actualWitness[:], "Incorrect witness") + + expectedStateHash := crypto.Keccak256Hash(actualWitness) + expectedStateHash[0] = mipsevm.VmStatus(c.exited, c.exitCode) + require.Equal(t, expectedStateHash, actualStateHash, "Incorrect state hash") + } +} + +func TestStateJSONCodec(t *testing.T) { + elfProgram, err := elf.Open("../../testdata/example/bin/hello.elf") + require.NoError(t, err, "open ELF file") + state, err := program.LoadELF(elfProgram, CreateInitialState) + require.NoError(t, err, "load ELF into state") + + stateJSON, err := state.MarshalJSON() + require.NoError(t, err) + + newState := new(State) + require.NoError(t, newState.UnmarshalJSON(stateJSON)) + + require.Equal(t, state.PreimageKey, newState.PreimageKey) + require.Equal(t, state.PreimageOffset, newState.PreimageOffset) + require.Equal(t, state.Cpu, newState.Cpu) + require.Equal(t, state.Heap, newState.Heap) + require.Equal(t, state.ExitCode, newState.ExitCode) + require.Equal(t, state.Exited, newState.Exited) + require.Equal(t, state.Memory.MerkleRoot(), newState.Memory.MerkleRoot()) + require.Equal(t, state.Registers, newState.Registers) + require.Equal(t, state.Step, newState.Step) +} + +func TestStateBinaryCodec(t *testing.T) { + elfProgram, err := elf.Open("../../testdata/example/bin/hello.elf") + require.NoError(t, err, "open ELF file") + state, err := program.LoadELF(elfProgram, CreateInitialState) + require.NoError(t, err, "load ELF into state") + + buf := new(bytes.Buffer) + err = state.Serialize(buf) + require.NoError(t, err) + + newState := new(State) + require.NoError(t, newState.Deserialize(bytes.NewReader(buf.Bytes()))) + + require.Equal(t, state.PreimageKey, newState.PreimageKey) + require.Equal(t, state.PreimageOffset, newState.PreimageOffset) + require.Equal(t, state.Cpu, newState.Cpu) + require.Equal(t, state.Heap, newState.Heap) + require.Equal(t, state.ExitCode, newState.ExitCode) + require.Equal(t, state.Exited, newState.Exited) + require.Equal(t, state.Memory.PageCount(), newState.Memory.PageCount()) + require.Equal(t, state.Memory.MerkleRoot(), newState.Memory.MerkleRoot()) + require.Equal(t, state.Registers, newState.Registers) + require.Equal(t, state.Step, newState.Step) +} + +func TestSerializeStateRoundTrip(t *testing.T) { + // Construct a test case with populated fields + mem := memory.NewMemory() + mem.AllocPage(5) + p := mem.AllocPage(123) + p.Data[2] = 0x01 + state := &State{ + Memory: mem, + PreimageKey: common.Hash{0xFF}, + PreimageOffset: 5, + Cpu: mipsevm.CpuScalars{ + PC: 0xFF, + NextPC: 0xFF + 4, + LO: 0xbeef, + HI: 0xbabe, + }, + Heap: 0xc0ffee, + ExitCode: 1, + Exited: true, + Step: 0xdeadbeef, + Registers: [32]uint32{ + 0xdeadbeef, + 0xdeadbeef, + 0xc0ffee, + 0xbeefbabe, + 0xdeadc0de, + 0xbadc0de, + 0xdeaddead, + }, + LastHint: hexutil.Bytes{1, 2, 3, 4, 5}, + } + + ser := new(bytes.Buffer) + err := state.Serialize(ser) + require.NoError(t, err, "must serialize state") + state2 := &State{} + err = state2.Deserialize(ser) + require.NoError(t, err, "must deserialize state") + require.Equal(t, state, state2, "must roundtrip state") +} diff --git a/cannon/mipsevm/singlethreaded/testutil/state.go b/cannon/mipsevm/singlethreaded/testutil/state.go new file mode 100644 index 000000000000..079827500e45 --- /dev/null +++ b/cannon/mipsevm/singlethreaded/testutil/state.go @@ -0,0 +1,81 @@ +package testutil + +import ( + "github.com/ethereum/go-ethereum/common" + "github.com/ethereum/go-ethereum/common/hexutil" + + "github.com/ethereum-optimism/optimism/cannon/mipsevm/singlethreaded" + "github.com/ethereum-optimism/optimism/cannon/mipsevm/testutil" +) + +type StateMutatorSingleThreaded struct { + state *singlethreaded.State +} + +func (m *StateMutatorSingleThreaded) Randomize(randSeed int64) { + r := testutil.NewRandHelper(randSeed) + + pc := r.RandPC() + step := r.RandStep() + + m.state.PreimageKey = r.RandHash() + m.state.PreimageOffset = r.Uint32() + m.state.Cpu.PC = pc + m.state.Cpu.NextPC = pc + 4 + m.state.Cpu.HI = r.Uint32() + m.state.Cpu.LO = r.Uint32() + m.state.Heap = r.Uint32() + m.state.Step = step + m.state.LastHint = r.RandHint() + m.state.Registers = *r.RandRegisters() +} + +var _ testutil.StateMutator = (*StateMutatorSingleThreaded)(nil) + +func NewStateMutatorSingleThreaded(state *singlethreaded.State) testutil.StateMutator { + return &StateMutatorSingleThreaded{state: state} +} + +func (m *StateMutatorSingleThreaded) SetPC(val uint32) { + m.state.Cpu.PC = val +} + +func (m *StateMutatorSingleThreaded) SetNextPC(val uint32) { + m.state.Cpu.NextPC = val +} + +func (m *StateMutatorSingleThreaded) SetHI(val uint32) { + m.state.Cpu.HI = val +} + +func (m *StateMutatorSingleThreaded) SetLO(val uint32) { + m.state.Cpu.LO = val +} + +func (m *StateMutatorSingleThreaded) SetHeap(val uint32) { + m.state.Heap = val +} + +func (m *StateMutatorSingleThreaded) SetExitCode(val uint8) { + m.state.ExitCode = val +} + +func (m *StateMutatorSingleThreaded) SetExited(val bool) { + m.state.Exited = val +} + +func (m *StateMutatorSingleThreaded) SetLastHint(val hexutil.Bytes) { + m.state.LastHint = val +} + +func (m *StateMutatorSingleThreaded) SetPreimageKey(val common.Hash) { + m.state.PreimageKey = val +} + +func (m *StateMutatorSingleThreaded) SetPreimageOffset(val uint32) { + m.state.PreimageOffset = val +} + +func (m *StateMutatorSingleThreaded) SetStep(val uint64) { + m.state.Step = val +} diff --git a/cannon/mipsevm/state.go b/cannon/mipsevm/state.go index d8a5dcfe9ae2..8ed6f265c894 100644 --- a/cannon/mipsevm/state.go +++ b/cannon/mipsevm/state.go @@ -1,79 +1,12 @@ package mipsevm -import ( - "encoding/binary" - "fmt" - - "github.com/ethereum/go-ethereum/common" - "github.com/ethereum/go-ethereum/common/hexutil" - "github.com/ethereum/go-ethereum/crypto" -) - -// StateWitnessSize is the size of the state witness encoding in bytes. -var StateWitnessSize = 226 - -type State struct { - Memory *Memory `json:"memory"` - - PreimageKey common.Hash `json:"preimageKey"` - PreimageOffset uint32 `json:"preimageOffset"` // note that the offset includes the 8-byte length prefix - +type CpuScalars struct { PC uint32 `json:"pc"` NextPC uint32 `json:"nextPC"` LO uint32 `json:"lo"` HI uint32 `json:"hi"` - Heap uint32 `json:"heap"` // to handle mmap growth - - ExitCode uint8 `json:"exit"` - Exited bool `json:"exited"` - - Step uint64 `json:"step"` - - Registers [32]uint32 `json:"registers"` - - // LastHint is optional metadata, and not part of the VM state itself. - // It is used to remember the last pre-image hint, - // so a VM can start from any state without fetching prior pre-images, - // and instead just repeat the last hint on setup, - // 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:]) - LastHint hexutil.Bytes `json:"lastHint,omitempty"` -} - -func (s *State) GetStep() uint64 { return s.Step } - -func (s *State) VMStatus() uint8 { - return vmStatus(s.Exited, s.ExitCode) -} - -func (s *State) EncodeWitness() StateWitness { - out := make([]byte, 0) - memRoot := s.Memory.MerkleRoot() - out = append(out, memRoot[:]...) - out = append(out, s.PreimageKey[:]...) - out = binary.BigEndian.AppendUint32(out, s.PreimageOffset) - out = binary.BigEndian.AppendUint32(out, s.PC) - out = binary.BigEndian.AppendUint32(out, s.NextPC) - out = binary.BigEndian.AppendUint32(out, s.LO) - out = binary.BigEndian.AppendUint32(out, s.HI) - out = binary.BigEndian.AppendUint32(out, s.Heap) - out = append(out, s.ExitCode) - if s.Exited { - out = append(out, 1) - } else { - out = append(out, 0) - } - out = binary.BigEndian.AppendUint64(out, s.Step) - for _, r := range s.Registers { - out = binary.BigEndian.AppendUint32(out, r) - } - return out } -type StateWitness []byte - const ( VMStatusValid = 0 VMStatusInvalid = 1 @@ -81,21 +14,7 @@ const ( VMStatusUnfinished = 3 ) -func (sw StateWitness) StateHash() (common.Hash, error) { - if len(sw) != 226 { - return common.Hash{}, fmt.Errorf("Invalid witness length. Got %d, expected 226", len(sw)) - } - - hash := crypto.Keccak256Hash(sw) - offset := 32*2 + 4*6 - exitCode := sw[offset] - exited := sw[offset+1] - status := vmStatus(exited == 1, exitCode) - hash[0] = status - return hash, nil -} - -func vmStatus(exited bool, exitCode uint8) uint8 { +func VmStatus(exited bool, exitCode uint8) uint8 { if !exited { return VMStatusUnfinished } diff --git a/cannon/mipsevm/state_test.go b/cannon/mipsevm/state_test.go deleted file mode 100644 index b430398c389b..000000000000 --- a/cannon/mipsevm/state_test.go +++ /dev/null @@ -1,303 +0,0 @@ -package mipsevm - -import ( - "bytes" - "debug/elf" - "encoding/binary" - "encoding/hex" - "fmt" - "io" - "os" - "path" - "strings" - "testing" - - "github.com/ethereum/go-ethereum/common" - "github.com/ethereum/go-ethereum/crypto" - "github.com/stretchr/testify/require" - - preimage "github.com/ethereum-optimism/optimism/op-preimage" -) - -// 0xbf_c0_00_00 ... baseAddrEnd is used in tests to write the results to -const baseAddrEnd = 0xbf_ff_ff_f0 - -// endAddr is used as return-address for tests -const endAddr = 0xa7ef00d0 - -func TestState(t *testing.T) { - testFiles, err := os.ReadDir("open_mips_tests/test/bin") - require.NoError(t, err) - - for _, f := range testFiles { - t.Run(f.Name(), func(t *testing.T) { - oracle := selectOracleFixture(t, f.Name()) - // Short-circuit early for exit_group.bin - exitGroup := f.Name() == "exit_group.bin" - - // TODO: currently tests are compiled as flat binary objects - // We can use more standard tooling to compile them to ELF files and get remove maketests.py - fn := path.Join("open_mips_tests/test/bin", f.Name()) - //elfProgram, err := elf.Open() - //require.NoError(t, err, "must load test ELF binary") - //state, err := LoadELF(elfProgram) - //require.NoError(t, err, "must load ELF into state") - programMem, err := os.ReadFile(fn) - require.NoError(t, err) - state := &State{PC: 0, NextPC: 4, Memory: NewMemory()} - err = state.Memory.SetMemoryRange(0, bytes.NewReader(programMem)) - require.NoError(t, err, "load program into state") - - // set the return address ($ra) to jump into when test completes - state.Registers[31] = endAddr - - us := NewInstrumentedState(state, oracle, os.Stdout, os.Stderr) - - for i := 0; i < 1000; i++ { - if us.state.PC == endAddr { - break - } - if exitGroup && us.state.Exited { - break - } - _, err := us.Step(false) - require.NoError(t, err) - } - - if exitGroup { - require.NotEqual(t, uint32(endAddr), us.state.PC, "must not reach end") - require.True(t, us.state.Exited, "must set exited state") - require.Equal(t, uint8(1), us.state.ExitCode, "must exit with 1") - } else { - require.Equal(t, uint32(endAddr), us.state.PC, "must reach end") - done, result := state.Memory.GetMemory(baseAddrEnd+4), state.Memory.GetMemory(baseAddrEnd+8) - // inspect test result - require.Equal(t, done, uint32(1), "must be done") - require.Equal(t, result, uint32(1), "must have success result") - } - }) - } -} - -// Run through all permutations of `exited` / `exitCode` and ensure that the -// correct witness, state hash, and VM Status is produced. -func TestStateHash(t *testing.T) { - cases := []struct { - exited bool - exitCode uint8 - }{ - {exited: false, exitCode: 0}, - {exited: false, exitCode: 1}, - {exited: false, exitCode: 2}, - {exited: false, exitCode: 3}, - {exited: true, exitCode: 0}, - {exited: true, exitCode: 1}, - {exited: true, exitCode: 2}, - {exited: true, exitCode: 3}, - } - - exitedOffset := 32*2 + 4*6 - for _, c := range cases { - state := &State{ - Memory: NewMemory(), - Exited: c.exited, - ExitCode: c.exitCode, - } - - actualWitness := state.EncodeWitness() - actualStateHash, err := StateWitness(actualWitness).StateHash() - require.NoError(t, err, "Error hashing witness") - require.Equal(t, len(actualWitness), StateWitnessSize, "Incorrect witness size") - - expectedWitness := make(StateWitness, 226) - memRoot := state.Memory.MerkleRoot() - copy(expectedWitness[:32], memRoot[:]) - expectedWitness[exitedOffset] = c.exitCode - var exited uint8 - if c.exited { - exited = 1 - } - expectedWitness[exitedOffset+1] = uint8(exited) - require.Equal(t, expectedWitness[:], actualWitness[:], "Incorrect witness") - - expectedStateHash := crypto.Keccak256Hash(actualWitness) - expectedStateHash[0] = vmStatus(c.exited, c.exitCode) - require.Equal(t, expectedStateHash, actualStateHash, "Incorrect state hash") - } -} - -func TestHello(t *testing.T) { - elfProgram, err := elf.Open("../example/bin/hello.elf") - require.NoError(t, err, "open ELF file") - - state, err := LoadELF(elfProgram) - require.NoError(t, err, "load ELF into state") - - err = PatchGo(elfProgram, state) - require.NoError(t, err, "apply Go runtime patches") - require.NoError(t, PatchStack(state), "add initial stack") - - var stdOutBuf, stdErrBuf bytes.Buffer - us := NewInstrumentedState(state, nil, io.MultiWriter(&stdOutBuf, os.Stdout), io.MultiWriter(&stdErrBuf, os.Stderr)) - - for i := 0; i < 400_000; i++ { - if us.state.Exited { - break - } - _, err := us.Step(false) - require.NoError(t, err) - } - - require.True(t, state.Exited, "must complete program") - require.Equal(t, uint8(0), state.ExitCode, "exit with 0") - - require.Equal(t, "hello world!\n", stdOutBuf.String(), "stdout says hello") - require.Equal(t, "", stdErrBuf.String(), "stderr silent") -} - -type testOracle struct { - hint func(v []byte) - getPreimage func(k [32]byte) []byte -} - -func (t *testOracle) Hint(v []byte) { - t.hint(v) -} - -func (t *testOracle) GetPreimage(k [32]byte) []byte { - return t.getPreimage(k) -} - -var _ PreimageOracle = (*testOracle)(nil) - -func claimTestOracle(t *testing.T) (po PreimageOracle, stdOut string, stdErr string) { - s := uint64(1000) - a := uint64(3) - b := uint64(4) - - encodeU64 := func(x uint64) []byte { - return binary.BigEndian.AppendUint64(nil, x) - } - - var diff []byte - diff = append(diff, crypto.Keccak256(encodeU64(a))...) - diff = append(diff, crypto.Keccak256(encodeU64(b))...) - - preHash := crypto.Keccak256Hash(encodeU64(s)) - diffHash := crypto.Keccak256Hash(diff) - - images := make(map[[32]byte][]byte) - images[preimage.LocalIndexKey(0).PreimageKey()] = preHash[:] - images[preimage.LocalIndexKey(1).PreimageKey()] = diffHash[:] - images[preimage.LocalIndexKey(2).PreimageKey()] = encodeU64(s*a + b) - - oracle := &testOracle{ - hint: func(v []byte) { - parts := strings.Split(string(v), " ") - require.Len(t, parts, 2) - p, err := hex.DecodeString(parts[1]) - require.NoError(t, err) - require.Len(t, p, 32) - h := common.Hash(*(*[32]byte)(p)) - switch parts[0] { - case "fetch-state": - require.Equal(t, h, preHash, "expecting request for pre-state pre-image") - images[preimage.Keccak256Key(preHash).PreimageKey()] = encodeU64(s) - case "fetch-diff": - require.Equal(t, h, diffHash, "expecting request for diff pre-images") - images[preimage.Keccak256Key(diffHash).PreimageKey()] = diff - images[preimage.Keccak256Key(crypto.Keccak256Hash(encodeU64(a))).PreimageKey()] = encodeU64(a) - images[preimage.Keccak256Key(crypto.Keccak256Hash(encodeU64(b))).PreimageKey()] = encodeU64(b) - default: - t.Fatalf("unexpected hint: %q", parts[0]) - } - }, - getPreimage: func(k [32]byte) []byte { - p, ok := images[k] - if !ok { - t.Fatalf("missing pre-image %s", k) - } - return p - }, - } - - return oracle, fmt.Sprintf("computing %d * %d + %d\nclaim %d is good!\n", s, a, b, s*a+b), "started!" -} - -func TestClaim(t *testing.T) { - elfProgram, err := elf.Open("../example/bin/claim.elf") - require.NoError(t, err, "open ELF file") - - state, err := LoadELF(elfProgram) - require.NoError(t, err, "load ELF into state") - - err = PatchGo(elfProgram, state) - require.NoError(t, err, "apply Go runtime patches") - require.NoError(t, PatchStack(state), "add initial stack") - - oracle, expectedStdOut, expectedStdErr := claimTestOracle(t) - - var stdOutBuf, stdErrBuf bytes.Buffer - us := NewInstrumentedState(state, oracle, io.MultiWriter(&stdOutBuf, os.Stdout), io.MultiWriter(&stdErrBuf, os.Stderr)) - - for i := 0; i < 2000_000; i++ { - if us.state.Exited { - break - } - _, err := us.Step(false) - require.NoError(t, err) - } - - require.True(t, state.Exited, "must complete program") - require.Equal(t, uint8(0), state.ExitCode, "exit with 0") - - require.Equal(t, expectedStdOut, stdOutBuf.String(), "stdout") - require.Equal(t, expectedStdErr, stdErrBuf.String(), "stderr") -} - -func staticOracle(t *testing.T, preimageData []byte) *testOracle { - return &testOracle{ - hint: func(v []byte) {}, - getPreimage: func(k [32]byte) []byte { - if k != preimage.Keccak256Key(crypto.Keccak256Hash(preimageData)).PreimageKey() { - t.Fatalf("invalid preimage request for %x", k) - } - return preimageData - }, - } -} - -func staticPrecompileOracle(t *testing.T, precompile common.Address, input []byte, result []byte) *testOracle { - return &testOracle{ - hint: func(v []byte) {}, - getPreimage: func(k [32]byte) []byte { - keyData := append(precompile.Bytes(), input...) - switch k[0] { - case byte(preimage.Keccak256KeyType): - if k != preimage.Keccak256Key(crypto.Keccak256Hash(keyData)).PreimageKey() { - t.Fatalf("invalid preimage request for %x", k) - } - return keyData - case byte(preimage.PrecompileKeyType): - if k != preimage.PrecompileKey(crypto.Keccak256Hash(keyData)).PreimageKey() { - t.Fatalf("invalid preimage request for %x", k) - } - return result - } - panic("unreachable") - }, - } -} - -func selectOracleFixture(t *testing.T, programName string) PreimageOracle { - if strings.HasPrefix(programName, "oracle_kzg") { - precompile := common.BytesToAddress([]byte{0xa}) - input := common.FromHex("01e798154708fe7789429634053cbf9f99b619f9f084048927333fce637f549b564c0a11a0f704f4fc3e8acfe0f8245f0ad1347b378fbf96e206da11a5d3630624d25032e67a7e6a4910df5834b8fe70e6bcfeeac0352434196bdf4b2485d5a18f59a8d2a1a625a17f3fea0fe5eb8c896db3764f3185481bc22f91b4aaffcca25f26936857bc3a7c2539ea8ec3a952b7873033e038326e87ed3e1276fd140253fa08e9fc25fb2d9a98527fc22a2c9612fbeafdad446cbc7bcdbdcd780af2c16a") - blobPrecompileReturnValue := common.FromHex("000000000000000000000000000000000000000000000000000000000000100073eda753299d7d483339d80809a1d80553bda402fffe5bfeffffffff00000001") - return staticPrecompileOracle(t, precompile, input, append([]byte{0x1}, blobPrecompileReturnValue...)) - } else if strings.HasPrefix(programName, "oracle") { - return staticOracle(t, []byte("hello world")) - } else { - return nil - } -} diff --git a/cannon/mipsevm/tests/evm_common_test.go b/cannon/mipsevm/tests/evm_common_test.go new file mode 100644 index 000000000000..ea6c7b2de957 --- /dev/null +++ b/cannon/mipsevm/tests/evm_common_test.go @@ -0,0 +1,602 @@ +package tests + +import ( + "bytes" + "fmt" + "io" + "os" + "path" + "strings" + "testing" + "time" + + "github.com/ethereum/go-ethereum/common/hexutil" + "github.com/ethereum/go-ethereum/core/tracing" + "github.com/stretchr/testify/require" + + "github.com/ethereum-optimism/optimism/cannon/mipsevm/exec" + "github.com/ethereum-optimism/optimism/cannon/mipsevm/memory" + "github.com/ethereum-optimism/optimism/cannon/mipsevm/program" + "github.com/ethereum-optimism/optimism/cannon/mipsevm/testutil" +) + +func TestEVM(t *testing.T) { + testFiles, err := os.ReadDir("open_mips_tests/test/bin") + require.NoError(t, err) + + var tracer *tracing.Hooks // no-tracer by default, but test_util.MarkdownTracer + + cases := GetMipsVersionTestCases(t) + skippedTests := map[string][]string{ + "multi-threaded": []string{"clone.bin"}, + "single-threaded": []string{}, + } + + for _, c := range cases { + skipped, exists := skippedTests[c.Name] + require.True(t, exists) + for _, f := range testFiles { + testName := fmt.Sprintf("%v (%v)", f.Name(), c.Name) + t.Run(testName, func(t *testing.T) { + for _, skipped := range skipped { + if f.Name() == skipped { + t.Skipf("Skipping explicitly excluded open_mips testcase: %v", f.Name()) + } + } + + oracle := testutil.SelectOracleFixture(t, f.Name()) + // Short-circuit early for exit_group.bin + exitGroup := f.Name() == "exit_group.bin" + expectPanic := strings.HasSuffix(f.Name(), "panic.bin") + + evm := testutil.NewMIPSEVM(c.Contracts) + evm.SetTracer(tracer) + evm.SetLocalOracle(oracle) + testutil.LogStepFailureAtCleanup(t, evm) + + fn := path.Join("open_mips_tests/test/bin", f.Name()) + programMem, err := os.ReadFile(fn) + require.NoError(t, err) + + goVm := c.VMFactory(oracle, os.Stdout, os.Stderr, testutil.CreateLogger()) + state := goVm.GetState() + err = state.GetMemory().SetMemoryRange(0, bytes.NewReader(programMem)) + require.NoError(t, err, "load program into state") + + // set the return address ($ra) to jump into when test completes + state.GetRegistersRef()[31] = testutil.EndAddr + + // Catch panics and check if they are expected + defer func() { + if r := recover(); r != nil { + if expectPanic { + // Success + } else { + t.Errorf("unexpected panic: %v", r) + } + } + }() + + for i := 0; i < 1000; i++ { + curStep := goVm.GetState().GetStep() + if goVm.GetState().GetPC() == testutil.EndAddr { + break + } + if exitGroup && goVm.GetState().GetExited() { + break + } + insn := state.GetMemory().GetMemory(state.GetPC()) + t.Logf("step: %4d pc: 0x%08x insn: 0x%08x", state.GetStep(), state.GetPC(), insn) + + stepWitness, err := goVm.Step(true) + require.NoError(t, err) + evmPost := evm.Step(t, stepWitness, curStep, c.StateHashFn) + // verify the post-state matches. + // TODO: maybe more readable to decode the evmPost state, and do attribute-wise comparison. + goPost, _ := goVm.GetState().EncodeWitness() + require.Equalf(t, hexutil.Bytes(goPost).String(), hexutil.Bytes(evmPost).String(), + "mipsevm produced different state than EVM at step %d", state.GetStep()) + } + if exitGroup { + require.NotEqual(t, uint32(testutil.EndAddr), goVm.GetState().GetPC(), "must not reach end") + require.True(t, goVm.GetState().GetExited(), "must set exited state") + require.Equal(t, uint8(1), goVm.GetState().GetExitCode(), "must exit with 1") + } else if expectPanic { + require.NotEqual(t, uint32(testutil.EndAddr), state.GetPC(), "must not reach end") + } else { + require.Equal(t, uint32(testutil.EndAddr), state.GetPC(), "must reach end") + // inspect test result + done, result := state.GetMemory().GetMemory(testutil.BaseAddrEnd+4), state.GetMemory().GetMemory(testutil.BaseAddrEnd+8) + require.Equal(t, done, uint32(1), "must be done") + require.Equal(t, result, uint32(1), "must have success result") + } + }) + } + } +} + +func TestEVMSingleStep(t *testing.T) { + var tracer *tracing.Hooks + + versions := GetMipsVersionTestCases(t) + cases := []struct { + name string + pc uint32 + nextPC uint32 + insn uint32 + expectNextPC uint32 + expectLink bool + }{ + {name: "j MSB set target", pc: 0, nextPC: 4, insn: 0x0A_00_00_02, expectNextPC: 0x08_00_00_08}, // j 0x02_00_00_02 + {name: "j non-zero PC region", pc: 0x10000000, nextPC: 0x10000004, insn: 0x08_00_00_02, expectNextPC: 0x10_00_00_08}, // j 0x2 + {name: "jal MSB set target", pc: 0, nextPC: 4, insn: 0x0E_00_00_02, expectNextPC: 0x08_00_00_08, expectLink: true}, // jal 0x02_00_00_02 + {name: "jal non-zero PC region", pc: 0x10000000, nextPC: 0x10000004, insn: 0x0C_00_00_02, expectNextPC: 0x10_00_00_08, expectLink: true}, // jal 0x2 + } + + for _, v := range versions { + for i, tt := range cases { + testName := fmt.Sprintf("%v (%v)", tt.name, v.Name) + t.Run(testName, func(t *testing.T) { + goVm := v.VMFactory(nil, os.Stdout, os.Stderr, testutil.CreateLogger(), testutil.WithRandomization(int64(i)), testutil.WithPC(tt.pc), testutil.WithNextPC(tt.nextPC)) + state := goVm.GetState() + state.GetMemory().SetMemory(tt.pc, tt.insn) + step := state.GetStep() + + // Setup expectations + expected := testutil.NewExpectedState(state) + expected.Step += 1 + expected.PC = state.GetCpu().NextPC + expected.NextPC = tt.expectNextPC + if tt.expectLink { + expected.Registers[31] = state.GetPC() + 8 + } + + stepWitness, err := goVm.Step(true) + require.NoError(t, err) + + // Check expectations + expected.Validate(t, state) + testutil.ValidateEVM(t, stepWitness, step, goVm, v.StateHashFn, v.Contracts, tracer) + }) + } + } +} + +func TestEVM_MMap(t *testing.T) { + var tracer *tracing.Hooks + + versions := GetMipsVersionTestCases(t) + cases := []struct { + name string + heap uint32 + address uint32 + size uint32 + shouldFail bool + expectedHeap uint32 + }{ + {name: "Increment heap by max value", heap: program.HEAP_START, address: 0, size: ^uint32(0), shouldFail: true}, + {name: "Increment heap to 0", heap: program.HEAP_START, address: 0, size: ^uint32(0) - program.HEAP_START + 1, shouldFail: true}, + {name: "Increment heap to previous page", heap: program.HEAP_START, address: 0, size: ^uint32(0) - program.HEAP_START - memory.PageSize + 1, shouldFail: true}, + {name: "Increment max page size", heap: program.HEAP_START, address: 0, size: ^uint32(0) & ^uint32(memory.PageAddrMask), shouldFail: true}, + {name: "Increment max page size from 0", heap: 0, address: 0, size: ^uint32(0) & ^uint32(memory.PageAddrMask), shouldFail: true}, + {name: "Increment heap at limit", heap: program.HEAP_END, address: 0, size: 1, shouldFail: true}, + {name: "Increment heap to limit", heap: program.HEAP_END - memory.PageSize, address: 0, size: 1, shouldFail: false, expectedHeap: program.HEAP_END}, + {name: "Increment heap within limit", heap: program.HEAP_END - 2*memory.PageSize, address: 0, size: 1, shouldFail: false, expectedHeap: program.HEAP_END - memory.PageSize}, + {name: "Request specific address", heap: program.HEAP_START, address: 0x50_00_00_00, size: 0, shouldFail: false, expectedHeap: program.HEAP_START}, + } + + for _, v := range versions { + for i, c := range cases { + testName := fmt.Sprintf("%v (%v)", c.name, v.Name) + t.Run(testName, func(t *testing.T) { + goVm := v.VMFactory(nil, os.Stdout, os.Stderr, testutil.CreateLogger(), testutil.WithRandomization(int64(i)), testutil.WithHeap(c.heap)) + state := goVm.GetState() + + state.GetMemory().SetMemory(state.GetPC(), syscallInsn) + state.GetRegistersRef()[2] = exec.SysMmap + state.GetRegistersRef()[4] = c.address + state.GetRegistersRef()[5] = c.size + step := state.GetStep() + + expected := testutil.NewExpectedState(state) + expected.Step += 1 + expected.PC = state.GetCpu().NextPC + expected.NextPC = state.GetCpu().NextPC + 4 + if c.shouldFail { + expected.Registers[2] = exec.SysErrorSignal + expected.Registers[7] = exec.MipsEINVAL + } else { + expected.Heap = c.expectedHeap + if c.address == 0 { + expected.Registers[2] = state.GetHeap() + expected.Registers[7] = 0 + } else { + expected.Registers[2] = c.address + expected.Registers[7] = 0 + } + } + + stepWitness, err := goVm.Step(true) + require.NoError(t, err) + + // Check expectations + expected.Validate(t, state) + testutil.ValidateEVM(t, stepWitness, step, goVm, v.StateHashFn, v.Contracts, tracer) + }) + } + } +} + +func TestEVMSysWriteHint(t *testing.T) { + var tracer *tracing.Hooks + + versions := GetMipsVersionTestCases(t) + 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 + expectedLastHint []byte // The lastHint we should expect for the post-state + }{ + { + 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: []byte{}, + expectedHints: [][]byte{ + {0xAA, 0xAA, 0xAA, 0xAA, 0xBB, 0xBB}, + }, + expectedLastHint: []byte{}, + }, + { + 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: []byte{}, + expectedHints: [][]byte{ + {0xAA, 0xAA, 0xAA, 0xAA, 0xBB, 0xBB, 0xBB, 0xBB}, + }, + expectedLastHint: []byte{}, + }, + { + 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: []byte{}, + expectedHints: [][]byte{ + {0xAA, 0xAA, 0xAA, 0xAA, 0xBB, 0xBB}, + {0xAA, 0xAA, 0xAA, 0xAA, 0xBB, 0xBB, 0xBB, 0xBB}, + }, + expectedLastHint: []byte{}, + }, + { + 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: []byte{}, + expectedHints: nil, + expectedLastHint: []byte{0, 0, 0, 6, 0xAA, 0xAA, 0xAA, 0xAA}, + }, + { + 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: []byte{}, + expectedHints: [][]byte{ + {0xAA, 0xAA, 0xAA, 0xAA, 0xBB, 0xBB}, + }, + expectedLastHint: []byte{0, 0, 0, 8, 0xAA, 0xAA}, + }, + { + 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, + expectedLastHint: []byte{0, 0, 0, 6, 0xAA, 0xAA, 0xAA, 0xAA}, + }, + { + 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}, + }, + expectedLastHint: []byte{}, + }, + { + 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}, + }, + expectedLastHint: []byte{}, + }, + { + 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}, + }, + expectedLastHint: []byte{}, + }, + { + 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, + expectedLastHint: []byte{0, 0, 0, 8, 0xAA, 0xAA, 0xAA, 0xAA}, + }, + } + + const ( + insn = uint32(0x00_00_00_0C) // syscall instruction + ) + + for _, v := range versions { + for i, tt := range cases { + testName := fmt.Sprintf("%v (%v)", tt.name, v.Name) + t.Run(testName, func(t *testing.T) { + oracle := testutil.HintTrackingOracle{} + goVm := v.VMFactory(&oracle, os.Stdout, os.Stderr, testutil.CreateLogger(), testutil.WithRandomization(int64(i)), testutil.WithLastHint(tt.lastHint)) + state := goVm.GetState() + state.GetRegistersRef()[2] = exec.SysWrite + state.GetRegistersRef()[4] = exec.FdHintWrite + state.GetRegistersRef()[5] = uint32(tt.memOffset) + state.GetRegistersRef()[6] = uint32(tt.bytesToWrite) + + err := state.GetMemory().SetMemoryRange(uint32(tt.memOffset), bytes.NewReader(tt.hintData)) + require.NoError(t, err) + state.GetMemory().SetMemory(state.GetPC(), insn) + step := state.GetStep() + + expected := testutil.NewExpectedState(state) + expected.Step += 1 + expected.PC = state.GetCpu().NextPC + expected.NextPC = state.GetCpu().NextPC + 4 + expected.LastHint = tt.expectedLastHint + expected.Registers[2] = uint32(tt.bytesToWrite) // Return count of bytes written + expected.Registers[7] = 0 // no Error + + stepWitness, err := goVm.Step(true) + require.NoError(t, err) + + expected.Validate(t, state) + require.Equal(t, tt.expectedHints, oracle.Hints()) + testutil.ValidateEVM(t, stepWitness, step, goVm, v.StateHashFn, v.Contracts, tracer) + }) + } + } +} + +func TestEVMFault(t *testing.T) { + var tracer *tracing.Hooks // no-tracer by default, but see test_util.MarkdownTracer + + versions := GetMipsVersionTestCases(t) + cases := []struct { + name string + nextPC uint32 + insn uint32 + }{ + {"illegal instruction", 0, 0xFF_FF_FF_FF}, + {"branch in delay-slot", 8, 0x11_02_00_03}, + {"jump in delay-slot", 8, 0x0c_00_00_0c}, + } + + for _, v := range versions { + for _, tt := range cases { + testName := fmt.Sprintf("%v (%v)", tt.name, v.Name) + t.Run(testName, func(t *testing.T) { + goVm := v.VMFactory(nil, os.Stdout, os.Stderr, testutil.CreateLogger(), testutil.WithNextPC(tt.nextPC)) + state := goVm.GetState() + state.GetMemory().SetMemory(0, tt.insn) + // set the return address ($ra) to jump into when test completes + state.GetRegistersRef()[31] = testutil.EndAddr + + require.Panics(t, func() { _, _ = goVm.Step(true) }) + testutil.AssertEVMReverts(t, state, v.Contracts, tracer) + }) + } + } +} + +func TestHelloEVM(t *testing.T) { + t.Parallel() + var tracer *tracing.Hooks // no-tracer by default, but see test_util.MarkdownTracer + versions := GetMipsVersionTestCases(t) + + for _, v := range versions { + v := v + t.Run(v.Name, func(t *testing.T) { + t.Parallel() + evm := testutil.NewMIPSEVM(v.Contracts) + evm.SetTracer(tracer) + testutil.LogStepFailureAtCleanup(t, evm) + + var stdOutBuf, stdErrBuf bytes.Buffer + elfFile := "../../testdata/example/bin/hello.elf" + goVm := v.ElfVMFactory(t, elfFile, nil, io.MultiWriter(&stdOutBuf, os.Stdout), io.MultiWriter(&stdErrBuf, os.Stderr), testutil.CreateLogger()) + state := goVm.GetState() + + start := time.Now() + for i := 0; i < 400_000; i++ { + step := goVm.GetState().GetStep() + if goVm.GetState().GetExited() { + break + } + insn := state.GetMemory().GetMemory(state.GetPC()) + if i%1000 == 0 { // avoid spamming test logs, we are executing many steps + t.Logf("step: %4d pc: 0x%08x insn: 0x%08x", state.GetStep(), state.GetPC(), insn) + } + + stepWitness, err := goVm.Step(true) + require.NoError(t, err) + evmPost := evm.Step(t, stepWitness, step, v.StateHashFn) + // verify the post-state matches. + // TODO: maybe more readable to decode the evmPost state, and do attribute-wise comparison. + goPost, _ := goVm.GetState().EncodeWitness() + require.Equalf(t, hexutil.Bytes(goPost).String(), hexutil.Bytes(evmPost).String(), + "mipsevm produced different state than EVM. insn: %x", insn) + } + end := time.Now() + delta := end.Sub(start) + t.Logf("test took %s, %d instructions, %s per instruction", delta, state.GetStep(), delta/time.Duration(state.GetStep())) + + require.True(t, state.GetExited(), "must complete program") + require.Equal(t, uint8(0), state.GetExitCode(), "exit with 0") + + require.Equal(t, "hello world!\n", stdOutBuf.String(), "stdout says hello") + require.Equal(t, "", stdErrBuf.String(), "stderr silent") + }) + } +} + +func TestClaimEVM(t *testing.T) { + t.Parallel() + var tracer *tracing.Hooks // no-tracer by default, but see test_util.MarkdownTracer + versions := GetMipsVersionTestCases(t) + + for _, v := range versions { + v := v + t.Run(v.Name, func(t *testing.T) { + t.Parallel() + evm := testutil.NewMIPSEVM(v.Contracts) + evm.SetTracer(tracer) + testutil.LogStepFailureAtCleanup(t, evm) + + oracle, expectedStdOut, expectedStdErr := testutil.ClaimTestOracle(t) + + var stdOutBuf, stdErrBuf bytes.Buffer + elfFile := "../../testdata/example/bin/claim.elf" + goVm := v.ElfVMFactory(t, elfFile, oracle, io.MultiWriter(&stdOutBuf, os.Stdout), io.MultiWriter(&stdErrBuf, os.Stderr), testutil.CreateLogger()) + state := goVm.GetState() + + for i := 0; i < 2000_000; i++ { + curStep := goVm.GetState().GetStep() + if goVm.GetState().GetExited() { + break + } + + insn := state.GetMemory().GetMemory(state.GetPC()) + if i%1000 == 0 { // avoid spamming test logs, we are executing many steps + t.Logf("step: %4d pc: 0x%08x insn: 0x%08x", state.GetStep(), state.GetPC(), insn) + } + + stepWitness, err := goVm.Step(true) + require.NoError(t, err) + + evmPost := evm.Step(t, stepWitness, curStep, v.StateHashFn) + + goPost, _ := goVm.GetState().EncodeWitness() + require.Equal(t, hexutil.Bytes(goPost).String(), hexutil.Bytes(evmPost).String(), + "mipsevm produced different state than EVM") + } + + require.True(t, state.GetExited(), "must complete program") + require.Equal(t, uint8(0), state.GetExitCode(), "exit with 0") + + require.Equal(t, expectedStdOut, stdOutBuf.String(), "stdout") + require.Equal(t, expectedStdErr, stdErrBuf.String(), "stderr") + }) + } +} + +func TestEntryEVM(t *testing.T) { + t.Parallel() + var tracer *tracing.Hooks // no-tracer by default, but see test_util.MarkdownTracer + versions := GetMipsVersionTestCases(t) + + for _, v := range versions { + v := v + t.Run(v.Name, func(t *testing.T) { + t.Parallel() + evm := testutil.NewMIPSEVM(v.Contracts) + evm.SetTracer(tracer) + testutil.LogStepFailureAtCleanup(t, evm) + + var stdOutBuf, stdErrBuf bytes.Buffer + elfFile := "../../testdata/example/bin/entry.elf" + goVm := v.ElfVMFactory(t, elfFile, nil, io.MultiWriter(&stdOutBuf, os.Stdout), io.MultiWriter(&stdErrBuf, os.Stderr), testutil.CreateLogger()) + state := goVm.GetState() + + start := time.Now() + for i := 0; i < 400_000; i++ { + curStep := goVm.GetState().GetStep() + if goVm.GetState().GetExited() { + break + } + insn := state.GetMemory().GetMemory(state.GetPC()) + if i%10_000 == 0 { // avoid spamming test logs, we are executing many steps + t.Logf("step: %4d pc: 0x%08x insn: 0x%08x", state.GetStep(), state.GetPC(), insn) + } + + stepWitness, err := goVm.Step(true) + require.NoError(t, err) + evmPost := evm.Step(t, stepWitness, curStep, v.StateHashFn) + // verify the post-state matches. + goPost, _ := goVm.GetState().EncodeWitness() + require.Equal(t, hexutil.Bytes(goPost).String(), hexutil.Bytes(evmPost).String(), + "mipsevm produced different state than EVM") + } + end := time.Now() + delta := end.Sub(start) + t.Logf("test took %s, %d instructions, %s per instruction", delta, state.GetStep(), delta/time.Duration(state.GetStep())) + + require.True(t, state.GetExited(), "must complete program") + require.Equal(t, uint8(0), state.GetExitCode(), "exit with 0") + }) + } +} diff --git a/cannon/mipsevm/tests/evm_multithreaded_test.go b/cannon/mipsevm/tests/evm_multithreaded_test.go new file mode 100644 index 000000000000..a26ebe96eb37 --- /dev/null +++ b/cannon/mipsevm/tests/evm_multithreaded_test.go @@ -0,0 +1,1512 @@ +package tests + +import ( + "encoding/binary" + "fmt" + "os" + "slices" + "testing" + + "github.com/ethereum/go-ethereum/common/hexutil" + "github.com/ethereum/go-ethereum/core/tracing" + "github.com/ethereum/go-ethereum/crypto" + "github.com/stretchr/testify/require" + "golang.org/x/exp/maps" + + "github.com/ethereum-optimism/optimism/cannon/mipsevm" + "github.com/ethereum-optimism/optimism/cannon/mipsevm/exec" + "github.com/ethereum-optimism/optimism/cannon/mipsevm/multithreaded" + mttestutil "github.com/ethereum-optimism/optimism/cannon/mipsevm/multithreaded/testutil" + "github.com/ethereum-optimism/optimism/cannon/mipsevm/testutil" + preimage "github.com/ethereum-optimism/optimism/op-preimage" +) + +func TestEVM_MT_LL(t *testing.T) { + var tracer *tracing.Hooks + + cases := []struct { + name string + base uint32 + offset int + value uint32 + effAddr uint32 + rtReg int + }{ + {name: "Aligned effAddr", base: 0x00_00_00_01, offset: 0x0133, value: 0xABCD, effAddr: 0x00_00_01_34, rtReg: 5}, + {name: "Aligned effAddr, signed extended", base: 0x00_00_00_01, offset: 0xFF33, value: 0xABCD, effAddr: 0xFF_FF_FF_34, rtReg: 5}, + {name: "Unaligned effAddr", base: 0xFF_12_00_01, offset: 0x3401, value: 0xABCD, effAddr: 0xFF_12_34_00, rtReg: 5}, + {name: "Unaligned effAddr, sign extended w overflow", base: 0xFF_12_00_01, offset: 0x8401, value: 0xABCD, effAddr: 0xFF_11_84_00, rtReg: 5}, + {name: "Return register set to 0", base: 0xFF_12_00_01, offset: 0x8401, value: 0xABCD, effAddr: 0xFF_11_84_00, rtReg: 0}, + } + for i, c := range cases { + for _, withExistingReservation := range []bool{true, false} { + tName := fmt.Sprintf("%v (withExistingReservation = %v)", c.name, withExistingReservation) + t.Run(tName, func(t *testing.T) { + rtReg := c.rtReg + baseReg := 6 + pc := uint32(0x44) + insn := uint32((0b11_0000 << 26) | (baseReg & 0x1F << 21) | (rtReg & 0x1F << 16) | (0xFFFF & c.offset)) + goVm, state, contracts := setup(t, i, nil) + step := state.GetStep() + + // Set up state + state.GetCurrentThread().Cpu.PC = pc + state.GetCurrentThread().Cpu.NextPC = pc + 4 + state.GetMemory().SetMemory(pc, insn) + state.GetMemory().SetMemory(c.effAddr, c.value) + state.GetRegistersRef()[baseReg] = c.base + if withExistingReservation { + state.LLReservationActive = true + state.LLAddress = c.effAddr + uint32(4) + state.LLOwnerThread = 123 + } else { + state.LLReservationActive = false + state.LLAddress = 0 + state.LLOwnerThread = 0 + } + + // Set up expectations + expected := mttestutil.NewExpectedMTState(state) + expected.ExpectStep() + expected.LLReservationActive = true + expected.LLAddress = c.effAddr + expected.LLOwnerThread = state.GetCurrentThread().ThreadId + if rtReg != 0 { + expected.ActiveThread().Registers[rtReg] = c.value + } + + stepWitness, err := goVm.Step(true) + require.NoError(t, err) + + // Check expectations + expected.Validate(t, state) + testutil.ValidateEVM(t, stepWitness, step, goVm, multithreaded.GetStateHashFn(), contracts, tracer) + }) + } + } +} + +func TestEVM_MT_SC(t *testing.T) { + var tracer *tracing.Hooks + + llVariations := []struct { + name string + llReservationActive bool + matchThreadId bool + matchEffAddr bool + shouldSucceed bool + }{ + {name: "should succeed", llReservationActive: true, matchThreadId: true, matchEffAddr: true, shouldSucceed: true}, + {name: "mismatch addr", llReservationActive: true, matchThreadId: false, matchEffAddr: true, shouldSucceed: false}, + {name: "mismatched thread", llReservationActive: true, matchThreadId: true, matchEffAddr: false, shouldSucceed: false}, + {name: "mismatched addr & thread", llReservationActive: true, matchThreadId: false, matchEffAddr: false, shouldSucceed: false}, + {name: "no active reservation", llReservationActive: false, matchThreadId: true, matchEffAddr: true, shouldSucceed: false}, + } + + cases := []struct { + name string + base uint32 + offset int + value uint32 + effAddr uint32 + rtReg int + threadId uint32 + }{ + {name: "Aligned effAddr", base: 0x00_00_00_01, offset: 0x0133, value: 0xABCD, effAddr: 0x00_00_01_34, rtReg: 5, threadId: 4}, + {name: "Aligned effAddr, signed extended", base: 0x00_00_00_01, offset: 0xFF33, value: 0xABCD, effAddr: 0xFF_FF_FF_34, rtReg: 5, threadId: 4}, + {name: "Unaligned effAddr", base: 0xFF_12_00_01, offset: 0x3401, value: 0xABCD, effAddr: 0xFF_12_34_00, rtReg: 5, threadId: 4}, + {name: "Unaligned effAddr, sign extended w overflow", base: 0xFF_12_00_01, offset: 0x8401, value: 0xABCD, effAddr: 0xFF_11_84_00, rtReg: 5, threadId: 4}, + {name: "Return register set to 0", base: 0xFF_12_00_01, offset: 0x8401, value: 0xABCD, effAddr: 0xFF_11_84_00, rtReg: 0, threadId: 4}, + {name: "Zero valued ll args", base: 0x00_00_00_00, offset: 0x0, value: 0xABCD, effAddr: 0x00_00_00_00, rtReg: 5, threadId: 0}, + } + for i, c := range cases { + for _, v := range llVariations { + tName := fmt.Sprintf("%v (%v)", c.name, v.name) + t.Run(tName, func(t *testing.T) { + rtReg := c.rtReg + baseReg := 6 + pc := uint32(0x44) + insn := uint32((0b11_1000 << 26) | (baseReg & 0x1F << 21) | (rtReg & 0x1F << 16) | (0xFFFF & c.offset)) + goVm, state, contracts := setup(t, i, nil) + mttestutil.InitializeSingleThread(i*23456, state, i%2 == 1) + step := state.GetStep() + + // Define LL-related params + var llAddress, llOwnerThread uint32 + if v.matchEffAddr { + llAddress = c.effAddr + } else { + llAddress = c.effAddr + 4 + } + if v.matchThreadId { + llOwnerThread = c.threadId + } else { + llOwnerThread = c.threadId + 1 + } + + // Setup state + state.GetCurrentThread().ThreadId = c.threadId + state.GetCurrentThread().Cpu.PC = pc + state.GetCurrentThread().Cpu.NextPC = pc + 4 + state.GetMemory().SetMemory(pc, insn) + state.GetRegistersRef()[baseReg] = c.base + state.GetRegistersRef()[rtReg] = c.value + state.LLReservationActive = v.llReservationActive + state.LLAddress = llAddress + state.LLOwnerThread = llOwnerThread + + // Setup expectations + expected := mttestutil.NewExpectedMTState(state) + expected.ExpectStep() + var retVal uint32 + if v.shouldSucceed { + retVal = 1 + expected.ExpectMemoryWrite(c.effAddr, c.value) + expected.LLReservationActive = false + expected.LLAddress = 0 + expected.LLOwnerThread = 0 + } else { + retVal = 0 + } + if rtReg != 0 { + expected.ActiveThread().Registers[rtReg] = retVal + } + + stepWitness, err := goVm.Step(true) + require.NoError(t, err) + + // Check expectations + expected.Validate(t, state) + testutil.ValidateEVM(t, stepWitness, step, goVm, multithreaded.GetStateHashFn(), contracts, tracer) + }) + } + } +} + +func TestEVM_MT_SysRead_Preimage(t *testing.T) { + var tracer *tracing.Hooks + + preimageValue := make([]byte, 0, 8) + preimageValue = binary.BigEndian.AppendUint32(preimageValue, 0x12_34_56_78) + preimageValue = binary.BigEndian.AppendUint32(preimageValue, 0x98_76_54_32) + + llVariations := []struct { + name string + llReservationActive bool + matchThreadId bool + matchEffAddr bool + shouldClearReservation bool + }{ + {name: "matching reservation", llReservationActive: true, matchThreadId: true, matchEffAddr: true, shouldClearReservation: true}, + {name: "matching reservation, diff thread", llReservationActive: true, matchThreadId: false, matchEffAddr: true, shouldClearReservation: true}, + {name: "mismatched reservation", llReservationActive: true, matchThreadId: true, matchEffAddr: false, shouldClearReservation: false}, + {name: "mismatched reservation", llReservationActive: true, matchThreadId: false, matchEffAddr: false, shouldClearReservation: false}, + {name: "no reservation, matching addr", llReservationActive: false, matchThreadId: true, matchEffAddr: true, shouldClearReservation: true}, + {name: "no reservation, mismatched addr", llReservationActive: false, matchThreadId: true, matchEffAddr: false, shouldClearReservation: false}, + } + + cases := []struct { + name string + addr uint32 + count uint32 + writeLen uint32 + preimageOffset uint32 + prestateMem uint32 + postateMem uint32 + shouldPanic bool + }{ + {name: "Aligned addr, write 1 byte", addr: 0x00_00_FF_00, count: 1, writeLen: 1, preimageOffset: 8, prestateMem: 0xFF_FF_FF_FF, postateMem: 0x12_FF_FF_FF}, + {name: "Aligned addr, write 2 byte", addr: 0x00_00_FF_00, count: 2, writeLen: 2, preimageOffset: 8, prestateMem: 0xFF_FF_FF_FF, postateMem: 0x12_34_FF_FF}, + {name: "Aligned addr, write 3 byte", addr: 0x00_00_FF_00, count: 3, writeLen: 3, preimageOffset: 8, prestateMem: 0xFF_FF_FF_FF, postateMem: 0x12_34_56_FF}, + {name: "Aligned addr, write 4 byte", addr: 0x00_00_FF_00, count: 4, writeLen: 4, preimageOffset: 8, prestateMem: 0xFF_FF_FF_FF, postateMem: 0x12_34_56_78}, + {name: "1-byte misaligned addr, write 1 byte", addr: 0x00_00_FF_01, count: 1, writeLen: 1, preimageOffset: 8, prestateMem: 0xFF_FF_FF_FF, postateMem: 0xFF_12_FF_FF}, + {name: "1-byte misaligned addr, write 2 byte", addr: 0x00_00_FF_01, count: 2, writeLen: 2, preimageOffset: 9, prestateMem: 0xFF_FF_FF_FF, postateMem: 0xFF_34_56_FF}, + {name: "1-byte misaligned addr, write 3 byte", addr: 0x00_00_FF_01, count: 3, writeLen: 3, preimageOffset: 8, prestateMem: 0xFF_FF_FF_FF, postateMem: 0xFF_12_34_56}, + {name: "2-byte misaligned addr, write 1 byte", addr: 0x00_00_FF_02, count: 1, writeLen: 1, preimageOffset: 8, prestateMem: 0xFF_FF_FF_FF, postateMem: 0xFF_FF_12_FF}, + {name: "2-byte misaligned addr, write 2 byte", addr: 0x00_00_FF_02, count: 2, writeLen: 2, preimageOffset: 12, prestateMem: 0xFF_FF_FF_FF, postateMem: 0xFF_FF_98_76}, + {name: "3-byte misaligned addr, write 1 byte", addr: 0x00_00_FF_03, count: 1, writeLen: 1, preimageOffset: 8, prestateMem: 0xFF_FF_FF_FF, postateMem: 0xFF_FF_FF_12}, + {name: "Count of 0", addr: 0x00_00_FF_03, count: 0, writeLen: 0, preimageOffset: 8, prestateMem: 0xFF_FF_FF_FF, postateMem: 0xFF_FF_FF_FF}, + {name: "Count greater than 4", addr: 0x00_00_FF_00, count: 15, writeLen: 4, preimageOffset: 8, prestateMem: 0xFF_FF_FF_FF, postateMem: 0x12_34_56_78}, + {name: "Count greater than 4, unaligned", addr: 0x00_00_FF_01, count: 15, writeLen: 3, preimageOffset: 8, prestateMem: 0xFF_FF_FF_FF, postateMem: 0xFF_12_34_56}, + {name: "Offset at last byte", addr: 0x00_00_FF_00, count: 4, writeLen: 1, preimageOffset: 15, prestateMem: 0xFF_FF_FF_FF, postateMem: 0x32_FF_FF_FF}, + {name: "Offset just out of bounds", addr: 0x00_00_FF_00, count: 4, writeLen: 0, preimageOffset: 16, prestateMem: 0xFF_FF_FF_FF, postateMem: 0xFF_FF_FF_FF, shouldPanic: true}, + {name: "Offset out of bounds", addr: 0x00_00_FF_00, count: 4, writeLen: 0, preimageOffset: 17, prestateMem: 0xFF_FF_FF_FF, postateMem: 0xFF_FF_FF_FF, shouldPanic: true}, + } + for i, c := range cases { + for _, v := range llVariations { + tName := fmt.Sprintf("%v (%v)", c.name, v.name) + t.Run(tName, func(t *testing.T) { + effAddr := 0xFFffFFfc & c.addr + preimageKey := preimage.Keccak256Key(crypto.Keccak256Hash(preimageValue)).PreimageKey() + oracle := testutil.StaticOracle(t, preimageValue) + goVm, state, contracts := setup(t, i, oracle) + step := state.GetStep() + + // Define LL-related params + var llAddress, llOwnerThread uint32 + if v.matchEffAddr { + llAddress = effAddr + } else { + llAddress = effAddr + 4 + } + if v.matchThreadId { + llOwnerThread = state.GetCurrentThread().ThreadId + } else { + llOwnerThread = state.GetCurrentThread().ThreadId + 1 + } + + // Set up state + state.PreimageKey = preimageKey + state.PreimageOffset = c.preimageOffset + state.GetRegistersRef()[2] = exec.SysRead + state.GetRegistersRef()[4] = exec.FdPreimageRead + state.GetRegistersRef()[5] = c.addr + state.GetRegistersRef()[6] = c.count + state.GetMemory().SetMemory(state.GetPC(), syscallInsn) + state.LLReservationActive = v.llReservationActive + state.LLAddress = llAddress + state.LLOwnerThread = llOwnerThread + state.GetMemory().SetMemory(effAddr, c.prestateMem) + + // Setup expectations + expected := mttestutil.NewExpectedMTState(state) + expected.ExpectStep() + expected.ActiveThread().Registers[2] = c.writeLen + expected.ActiveThread().Registers[7] = 0 // no error + expected.PreimageOffset += c.writeLen + expected.ExpectMemoryWrite(effAddr, c.postateMem) + if v.shouldClearReservation { + expected.LLReservationActive = false + expected.LLAddress = 0 + expected.LLOwnerThread = 0 + } + + if c.shouldPanic { + require.Panics(t, func() { _, _ = goVm.Step(true) }) + testutil.AssertPreimageOracleReverts(t, preimageKey, preimageValue, c.preimageOffset, contracts, tracer) + } else { + stepWitness, err := goVm.Step(true) + require.NoError(t, err) + + // Check expectations + expected.Validate(t, state) + testutil.ValidateEVM(t, stepWitness, step, goVm, multithreaded.GetStateHashFn(), contracts, tracer) + } + }) + } + } +} + +func TestEVM_MT_StoreOpsClearMemReservation(t *testing.T) { + var tracer *tracing.Hooks + + llVariations := []struct { + name string + llReservationActive bool + matchThreadId bool + matchEffAddr bool + shouldClearReservation bool + }{ + {name: "matching reservation", llReservationActive: true, matchThreadId: true, matchEffAddr: true, shouldClearReservation: true}, + {name: "matching reservation, diff thread", llReservationActive: true, matchThreadId: false, matchEffAddr: true, shouldClearReservation: true}, + {name: "mismatched reservation", llReservationActive: true, matchThreadId: true, matchEffAddr: false, shouldClearReservation: false}, + {name: "mismatched reservation, diff thread", llReservationActive: true, matchThreadId: false, matchEffAddr: false, shouldClearReservation: false}, + {name: "no reservation, matching addr", llReservationActive: false, matchThreadId: true, matchEffAddr: true, shouldClearReservation: true}, + {name: "no reservation, mismatched addr", llReservationActive: false, matchThreadId: true, matchEffAddr: false, shouldClearReservation: false}, + } + + pc := uint32(0x04) + rt := uint32(0x12_34_56_78) + baseReg := 5 + rtReg := 6 + cases := []struct { + name string + opcode int + offset int + base uint32 + effAddr uint32 + preMem uint32 + postMem uint32 + }{ + {name: "Store byte", opcode: 0b10_1000, base: 0xFF_00_00_04, offset: 0xFF_00_00_08, effAddr: 0xFF_00_00_0C, preMem: 0xFF_FF_FF_FF, postMem: 0x78_FF_FF_FF}, + {name: "Store halfword", opcode: 0b10_1001, base: 0xFF_00_00_04, offset: 0xFF_00_00_08, effAddr: 0xFF_00_00_0C, preMem: 0xFF_FF_FF_FF, postMem: 0x56_78_FF_FF}, + {name: "Store word left", opcode: 0b10_1010, base: 0xFF_00_00_04, offset: 0xFF_00_00_08, effAddr: 0xFF_00_00_0C, preMem: 0xFF_FF_FF_FF, postMem: 0x12_34_56_78}, + {name: "Store word", opcode: 0b10_1011, base: 0xFF_00_00_04, offset: 0xFF_00_00_08, effAddr: 0xFF_00_00_0C, preMem: 0xFF_FF_FF_FF, postMem: 0x12_34_56_78}, + {name: "Store word right", opcode: 0b10_1110, base: 0xFF_00_00_04, offset: 0xFF_00_00_08, effAddr: 0xFF_00_00_0C, preMem: 0xFF_FF_FF_FF, postMem: 0x78_FF_FF_FF}, + } + for i, c := range cases { + for _, v := range llVariations { + tName := fmt.Sprintf("%v (%v)", c.name, v.name) + t.Run(tName, func(t *testing.T) { + insn := uint32((c.opcode << 26) | (baseReg & 0x1F << 21) | (rtReg & 0x1F << 16) | (0xFFFF & c.offset)) + goVm, state, contracts := setup(t, i, nil) + step := state.GetStep() + + // Define LL-related params + var llAddress, llOwnerThread uint32 + if v.matchEffAddr { + llAddress = c.effAddr + } else { + llAddress = c.effAddr + 4 + } + if v.matchThreadId { + llOwnerThread = state.GetCurrentThread().ThreadId + } else { + llOwnerThread = state.GetCurrentThread().ThreadId + 1 + } + + // Setup state + state.GetCurrentThread().Cpu.PC = pc + state.GetCurrentThread().Cpu.NextPC = pc + 4 + state.GetRegistersRef()[rtReg] = rt + state.GetRegistersRef()[baseReg] = c.base + state.GetMemory().SetMemory(state.GetPC(), insn) + state.GetMemory().SetMemory(c.effAddr, c.preMem) + state.LLReservationActive = v.llReservationActive + state.LLAddress = llAddress + state.LLOwnerThread = llOwnerThread + + // Setup expectations + expected := mttestutil.NewExpectedMTState(state) + expected.ExpectStep() + expected.ExpectMemoryWrite(c.effAddr, c.postMem) + if v.shouldClearReservation { + expected.LLReservationActive = false + expected.LLAddress = 0 + expected.LLOwnerThread = 0 + } + + stepWitness, err := goVm.Step(true) + require.NoError(t, err) + + // Check expectations + expected.Validate(t, state) + testutil.ValidateEVM(t, stepWitness, step, goVm, multithreaded.GetStateHashFn(), contracts, tracer) + }) + } + } +} + +func TestEVM_SysClone_FlagHandling(t *testing.T) { + contracts := testutil.TestContractsSetup(t, testutil.MipsMultithreaded) + var tracer *tracing.Hooks + + cases := []struct { + name string + flags uint32 + valid bool + }{ + {"the supported flags bitmask", exec.ValidCloneFlags, true}, + {"no flags", 0, false}, + {"all flags", ^uint32(0), false}, + {"all unsupported flags", ^uint32(exec.ValidCloneFlags), false}, + {"a few supported flags", exec.CloneFs | exec.CloneSysvsem, false}, + {"one supported flag", exec.CloneFs, false}, + {"mixed supported and unsupported flags", exec.CloneFs | exec.CloneParentSettid, false}, + {"a single unsupported flag", exec.CloneUntraced, false}, + {"multiple unsupported flags", exec.CloneUntraced | exec.CloneParentSettid, false}, + } + + for _, c := range cases { + t.Run(c.name, func(t *testing.T) { + state := multithreaded.CreateEmptyState() + state.Memory.SetMemory(state.GetPC(), syscallInsn) + state.GetRegistersRef()[2] = exec.SysClone // Set syscall number + state.GetRegistersRef()[4] = c.flags // Set first argument + curStep := state.Step + + var err error + var stepWitness *mipsevm.StepWitness + us := multithreaded.NewInstrumentedState(state, nil, os.Stdout, os.Stderr, nil, nil) + if !c.valid { + // The VM should exit + stepWitness, err = us.Step(true) + require.NoError(t, err) + require.Equal(t, curStep+1, state.GetStep()) + require.Equal(t, true, us.GetState().GetExited()) + require.Equal(t, uint8(mipsevm.VMStatusPanic), us.GetState().GetExitCode()) + require.Equal(t, 1, state.ThreadCount()) + } else { + stepWitness, err = us.Step(true) + require.NoError(t, err) + require.Equal(t, curStep+1, state.GetStep()) + require.Equal(t, false, us.GetState().GetExited()) + require.Equal(t, uint8(0), us.GetState().GetExitCode()) + require.Equal(t, 2, state.ThreadCount()) + } + + evm := testutil.NewMIPSEVM(contracts) + evm.SetTracer(tracer) + testutil.LogStepFailureAtCleanup(t, evm) + + evmPost := evm.Step(t, stepWitness, curStep, multithreaded.GetStateHashFn()) + goPost, _ := us.GetState().EncodeWitness() + require.Equal(t, hexutil.Bytes(goPost).String(), hexutil.Bytes(evmPost).String(), + "mipsevm produced different state than EVM") + }) + } +} + +func TestEVM_SysClone_Successful(t *testing.T) { + var tracer *tracing.Hooks + cases := []struct { + name string + traverseRight bool + }{ + {"traverse left", false}, + {"traverse right", true}, + } + + for i, c := range cases { + t.Run(c.name, func(t *testing.T) { + stackPtr := uint32(100) + + goVm, state, contracts := setup(t, i, nil) + mttestutil.InitializeSingleThread(i*333, state, c.traverseRight) + state.Memory.SetMemory(state.GetPC(), syscallInsn) + state.GetRegistersRef()[2] = exec.SysClone // the syscall number + state.GetRegistersRef()[4] = exec.ValidCloneFlags // a0 - first argument, clone flags + state.GetRegistersRef()[5] = stackPtr // a1 - the stack pointer + step := state.GetStep() + + // Sanity-check assumptions + require.Equal(t, uint32(1), state.NextThreadId) + + // Setup expectations + expected := mttestutil.NewExpectedMTState(state) + expected.Step += 1 + expectedNewThread := expected.ExpectNewThread() + expected.ActiveThreadId = expectedNewThread.ThreadId + expected.StepsSinceLastContextSwitch = 0 + if c.traverseRight { + expected.RightStackSize += 1 + } else { + expected.LeftStackSize += 1 + } + // Original thread expectations + expected.PrestateActiveThread().PC = state.GetCpu().NextPC + expected.PrestateActiveThread().NextPC = state.GetCpu().NextPC + 4 + expected.PrestateActiveThread().Registers[2] = 1 + expected.PrestateActiveThread().Registers[7] = 0 + // New thread expectations + expectedNewThread.PC = state.GetCpu().NextPC + expectedNewThread.NextPC = state.GetCpu().NextPC + 4 + expectedNewThread.ThreadId = 1 + expectedNewThread.Registers[2] = 0 + expectedNewThread.Registers[7] = 0 + expectedNewThread.Registers[29] = stackPtr + + var err error + var stepWitness *mipsevm.StepWitness + stepWitness, err = goVm.Step(true) + require.NoError(t, err) + + expected.Validate(t, state) + activeStack, inactiveStack := mttestutil.GetThreadStacks(state) + require.Equal(t, 2, len(activeStack)) + require.Equal(t, 0, len(inactiveStack)) + testutil.ValidateEVM(t, stepWitness, step, goVm, multithreaded.GetStateHashFn(), contracts, tracer) + }) + } +} + +func TestEVM_SysGetTID(t *testing.T) { + var tracer *tracing.Hooks + cases := []struct { + name string + threadId uint32 + }{ + {"zero", 0}, + {"non-zero", 11}, + } + + for i, c := range cases { + t.Run(c.name, func(t *testing.T) { + goVm, state, contracts := setup(t, i*789, nil) + mttestutil.InitializeSingleThread(i*789, state, false) + + state.GetCurrentThread().ThreadId = c.threadId + state.Memory.SetMemory(state.GetPC(), syscallInsn) + state.GetRegistersRef()[2] = exec.SysGetTID // Set syscall number + step := state.Step + + // Set up post-state expectations + expected := mttestutil.NewExpectedMTState(state) + expected.ExpectStep() + expected.ActiveThread().Registers[2] = c.threadId + expected.ActiveThread().Registers[7] = 0 + + // State transition + var err error + var stepWitness *mipsevm.StepWitness + stepWitness, err = goVm.Step(true) + require.NoError(t, err) + + // Validate post-state + expected.Validate(t, state) + testutil.ValidateEVM(t, stepWitness, step, goVm, multithreaded.GetStateHashFn(), contracts, tracer) + }) + } +} + +func TestEVM_SysExit(t *testing.T) { + var tracer *tracing.Hooks + cases := []struct { + name string + threadCount int + shouldExitGlobally bool + }{ + // If we exit the last thread, the whole process should exit + {name: "one thread", threadCount: 1, shouldExitGlobally: true}, + {name: "two threads ", threadCount: 2}, + {name: "three threads ", threadCount: 3}, + } + + for i, c := range cases { + t.Run(c.name, func(t *testing.T) { + exitCode := uint8(3) + + goVm, state, contracts := setup(t, i*133, nil) + mttestutil.SetupThreads(int64(i*1111), state, i%2 == 0, c.threadCount, 0) + + state.Memory.SetMemory(state.GetPC(), syscallInsn) + state.GetRegistersRef()[2] = exec.SysExit // Set syscall number + state.GetRegistersRef()[4] = uint32(exitCode) // The first argument (exit code) + step := state.Step + + // Set up expectations + expected := mttestutil.NewExpectedMTState(state) + expected.Step += 1 + expected.StepsSinceLastContextSwitch += 1 + expected.ActiveThread().Exited = true + expected.ActiveThread().ExitCode = exitCode + if c.shouldExitGlobally { + expected.Exited = true + expected.ExitCode = exitCode + } + + // State transition + var err error + var stepWitness *mipsevm.StepWitness + stepWitness, err = goVm.Step(true) + require.NoError(t, err) + + // Validate post-state + expected.Validate(t, state) + testutil.ValidateEVM(t, stepWitness, step, goVm, multithreaded.GetStateHashFn(), contracts, tracer) + }) + } +} + +func TestEVM_PopExitedThread(t *testing.T) { + var tracer *tracing.Hooks + cases := []struct { + name string + traverseRight bool + activeStackThreadCount int + expectTraverseRightPostState bool + }{ + {name: "traverse right", traverseRight: true, activeStackThreadCount: 2, expectTraverseRightPostState: true}, + {name: "traverse right, switch directions", traverseRight: true, activeStackThreadCount: 1, expectTraverseRightPostState: false}, + {name: "traverse left", traverseRight: false, activeStackThreadCount: 2, expectTraverseRightPostState: false}, + {name: "traverse left, switch directions", traverseRight: false, activeStackThreadCount: 1, expectTraverseRightPostState: true}, + } + + for i, c := range cases { + t.Run(c.name, func(t *testing.T) { + goVm, state, contracts := setup(t, i*133, nil) + mttestutil.SetupThreads(int64(i*222), state, c.traverseRight, c.activeStackThreadCount, 1) + step := state.Step + + // Setup thread to be dropped + threadToPop := state.GetCurrentThread() + threadToPop.Exited = true + threadToPop.ExitCode = 1 + + // Set up expectations + expected := mttestutil.NewExpectedMTState(state) + expected.Step += 1 + expected.ActiveThreadId = mttestutil.FindNextThreadExcluding(state, threadToPop.ThreadId).ThreadId + expected.StepsSinceLastContextSwitch = 0 + expected.ThreadCount -= 1 + expected.TraverseRight = c.expectTraverseRightPostState + expected.Thread(threadToPop.ThreadId).Dropped = true + if c.traverseRight { + expected.RightStackSize -= 1 + } else { + expected.LeftStackSize -= 1 + } + + // State transition + var err error + var stepWitness *mipsevm.StepWitness + stepWitness, err = goVm.Step(true) + require.NoError(t, err) + + // Validate post-state + expected.Validate(t, state) + testutil.ValidateEVM(t, stepWitness, step, goVm, multithreaded.GetStateHashFn(), contracts, tracer) + }) + } +} + +func TestEVM_SysFutex_WaitPrivate(t *testing.T) { + var tracer *tracing.Hooks + cases := []struct { + name string + addressParam uint32 + effAddr uint32 + targetValue uint32 + actualValue uint32 + timeout uint32 + shouldFail bool + shouldSetTimeout bool + }{ + {name: "successful wait, no timeout", addressParam: 0x1234, effAddr: 0x1234, targetValue: 0x01, actualValue: 0x01}, + {name: "successful wait, no timeout, unaligned addr", addressParam: 0x1235, effAddr: 0x1234, targetValue: 0x01, actualValue: 0x01}, + {name: "memory mismatch, no timeout", addressParam: 0x1200, effAddr: 0x1200, targetValue: 0x01, actualValue: 0x02, shouldFail: true}, + {name: "memory mismatch, no timeout, unaligned", addressParam: 0x1203, effAddr: 0x1200, targetValue: 0x01, actualValue: 0x02, shouldFail: true}, + {name: "successful wait w timeout", addressParam: 0x1234, effAddr: 0x1234, targetValue: 0x01, actualValue: 0x01, timeout: 1000000, shouldSetTimeout: true}, + {name: "successful wait w timeout, unaligned", addressParam: 0x1232, effAddr: 0x1230, targetValue: 0x01, actualValue: 0x01, timeout: 1000000, shouldSetTimeout: true}, + {name: "memory mismatch w timeout", addressParam: 0x1200, effAddr: 0x1200, targetValue: 0x01, actualValue: 0x02, timeout: 2000000, shouldFail: true}, + {name: "memory mismatch w timeout, unaligned", addressParam: 0x120F, effAddr: 0x120C, targetValue: 0x01, actualValue: 0x02, timeout: 2000000, shouldFail: true}, + } + + for i, c := range cases { + t.Run(c.name, func(t *testing.T) { + goVm, state, contracts := setup(t, i*1234, nil) + step := state.GetStep() + + state.Memory.SetMemory(state.GetPC(), syscallInsn) + state.Memory.SetMemory(c.effAddr, c.actualValue) + state.GetRegistersRef()[2] = exec.SysFutex // Set syscall number + state.GetRegistersRef()[4] = c.addressParam + state.GetRegistersRef()[5] = exec.FutexWaitPrivate + state.GetRegistersRef()[6] = c.targetValue + state.GetRegistersRef()[7] = c.timeout + + // Setup expectations + expected := mttestutil.NewExpectedMTState(state) + expected.Step += 1 + expected.StepsSinceLastContextSwitch += 1 + if c.shouldFail { + expected.ActiveThread().PC = state.GetCpu().NextPC + expected.ActiveThread().NextPC = state.GetCpu().NextPC + 4 + expected.ActiveThread().Registers[2] = exec.SysErrorSignal + expected.ActiveThread().Registers[7] = exec.MipsEAGAIN + } else { + // PC and return registers should not update on success, updates happen when wait completes + expected.ActiveThread().FutexAddr = c.effAddr + expected.ActiveThread().FutexVal = c.targetValue + expected.ActiveThread().FutexTimeoutStep = exec.FutexNoTimeout + if c.shouldSetTimeout { + expected.ActiveThread().FutexTimeoutStep = step + exec.FutexTimeoutSteps + 1 + } + } + + // State transition + var err error + var stepWitness *mipsevm.StepWitness + stepWitness, err = goVm.Step(true) + require.NoError(t, err) + + // Validate post-state + expected.Validate(t, state) + testutil.ValidateEVM(t, stepWitness, step, goVm, multithreaded.GetStateHashFn(), contracts, tracer) + }) + } +} + +func TestEVM_SysFutex_WakePrivate(t *testing.T) { + var tracer *tracing.Hooks + cases := []struct { + name string + addressParam uint32 + effAddr uint32 + activeThreadCount int + inactiveThreadCount int + traverseRight bool + expectTraverseRight bool + }{ + {name: "Traverse right", addressParam: 0x6700, effAddr: 0x6700, activeThreadCount: 2, inactiveThreadCount: 1, traverseRight: true}, + {name: "Traverse right, unaligned addr", addressParam: 0x6789, effAddr: 0x6788, activeThreadCount: 2, inactiveThreadCount: 1, traverseRight: true}, + {name: "Traverse right, no left threads", addressParam: 0x6784, effAddr: 0x6784, activeThreadCount: 2, inactiveThreadCount: 0, traverseRight: true}, + {name: "Traverse right, no left threads, unaligned addr", addressParam: 0x678E, effAddr: 0x678C, activeThreadCount: 2, inactiveThreadCount: 0, traverseRight: true}, + {name: "Traverse right, single thread", addressParam: 0x6788, effAddr: 0x6788, activeThreadCount: 1, inactiveThreadCount: 0, traverseRight: true}, + {name: "Traverse right, single thread, unaligned", addressParam: 0x6789, effAddr: 0x6788, activeThreadCount: 1, inactiveThreadCount: 0, traverseRight: true}, + {name: "Traverse left", addressParam: 0x6788, effAddr: 0x6788, activeThreadCount: 2, inactiveThreadCount: 1, traverseRight: false}, + {name: "Traverse left, unaliagned", addressParam: 0x6789, effAddr: 0x6788, activeThreadCount: 2, inactiveThreadCount: 1, traverseRight: false}, + {name: "Traverse left, switch directions", addressParam: 0x6788, effAddr: 0x6788, activeThreadCount: 1, inactiveThreadCount: 1, traverseRight: false, expectTraverseRight: true}, + {name: "Traverse left, switch directions, unaligned", addressParam: 0x6789, effAddr: 0x6788, activeThreadCount: 1, inactiveThreadCount: 1, traverseRight: false, expectTraverseRight: true}, + {name: "Traverse left, single thread", addressParam: 0x6788, effAddr: 0x6788, activeThreadCount: 1, inactiveThreadCount: 0, traverseRight: false, expectTraverseRight: true}, + {name: "Traverse left, single thread, unaligned", addressParam: 0x6789, effAddr: 0x6788, activeThreadCount: 1, inactiveThreadCount: 0, traverseRight: false, expectTraverseRight: true}, + } + + for i, c := range cases { + t.Run(c.name, func(t *testing.T) { + goVm, state, contracts := setup(t, i*1122, nil) + mttestutil.SetupThreads(int64(i*2244), state, c.traverseRight, c.activeThreadCount, c.inactiveThreadCount) + step := state.Step + + state.Memory.SetMemory(state.GetPC(), syscallInsn) + state.GetRegistersRef()[2] = exec.SysFutex // Set syscall number + state.GetRegistersRef()[4] = c.addressParam + state.GetRegistersRef()[5] = exec.FutexWakePrivate + + // Set up post-state expectations + expected := mttestutil.NewExpectedMTState(state) + expected.ExpectStep() + expected.ActiveThread().Registers[2] = 0 + expected.ActiveThread().Registers[7] = 0 + expected.Wakeup = c.effAddr + expected.ExpectPreemption(state) + expected.TraverseRight = c.expectTraverseRight + if c.traverseRight != c.expectTraverseRight { + // If we preempt the current thread and then switch directions, the same + // thread will remain active + expected.ActiveThreadId = state.GetCurrentThread().ThreadId + } + + // State transition + var err error + var stepWitness *mipsevm.StepWitness + stepWitness, err = goVm.Step(true) + require.NoError(t, err) + + // Validate post-state + expected.Validate(t, state) + testutil.ValidateEVM(t, stepWitness, step, goVm, multithreaded.GetStateHashFn(), contracts, tracer) + }) + } +} + +func TestEVM_SysFutex_UnsupportedOp(t *testing.T) { + var tracer *tracing.Hooks + + // From: https://github.com/torvalds/linux/blob/5be63fc19fcaa4c236b307420483578a56986a37/include/uapi/linux/futex.h + const FUTEX_PRIVATE_FLAG = 128 + const FUTEX_WAIT = 0 + const FUTEX_WAKE = 1 + const FUTEX_FD = 2 + const FUTEX_REQUEUE = 3 + const FUTEX_CMP_REQUEUE = 4 + const FUTEX_WAKE_OP = 5 + const FUTEX_LOCK_PI = 6 + const FUTEX_UNLOCK_PI = 7 + const FUTEX_TRYLOCK_PI = 8 + const FUTEX_WAIT_BITSET = 9 + const FUTEX_WAKE_BITSET = 10 + const FUTEX_WAIT_REQUEUE_PI = 11 + const FUTEX_CMP_REQUEUE_PI = 12 + const FUTEX_LOCK_PI2 = 13 + + unsupportedFutexOps := map[string]uint32{ + "FUTEX_WAIT": FUTEX_WAIT, + "FUTEX_WAKE": FUTEX_WAKE, + "FUTEX_FD": FUTEX_FD, + "FUTEX_REQUEUE": FUTEX_REQUEUE, + "FUTEX_CMP_REQUEUE": FUTEX_CMP_REQUEUE, + "FUTEX_WAKE_OP": FUTEX_WAKE_OP, + "FUTEX_LOCK_PI": FUTEX_LOCK_PI, + "FUTEX_UNLOCK_PI": FUTEX_UNLOCK_PI, + "FUTEX_TRYLOCK_PI": FUTEX_TRYLOCK_PI, + "FUTEX_WAIT_BITSET": FUTEX_WAIT_BITSET, + "FUTEX_WAKE_BITSET": FUTEX_WAKE_BITSET, + "FUTEX_WAIT_REQUEUE_PI": FUTEX_WAIT_REQUEUE_PI, + "FUTEX_CMP_REQUEUE_PI": FUTEX_CMP_REQUEUE_PI, + "FUTEX_LOCK_PI2": FUTEX_LOCK_PI2, + "FUTEX_REQUEUE_PRIVATE": (FUTEX_REQUEUE | FUTEX_PRIVATE_FLAG), + "FUTEX_CMP_REQUEUE_PRIVATE": (FUTEX_CMP_REQUEUE | FUTEX_PRIVATE_FLAG), + "FUTEX_WAKE_OP_PRIVATE": (FUTEX_WAKE_OP | FUTEX_PRIVATE_FLAG), + "FUTEX_LOCK_PI_PRIVATE": (FUTEX_LOCK_PI | FUTEX_PRIVATE_FLAG), + "FUTEX_LOCK_PI2_PRIVATE": (FUTEX_LOCK_PI2 | FUTEX_PRIVATE_FLAG), + "FUTEX_UNLOCK_PI_PRIVATE": (FUTEX_UNLOCK_PI | FUTEX_PRIVATE_FLAG), + "FUTEX_TRYLOCK_PI_PRIVATE": (FUTEX_TRYLOCK_PI | FUTEX_PRIVATE_FLAG), + "FUTEX_WAIT_BITSET_PRIVATE": (FUTEX_WAIT_BITSET | FUTEX_PRIVATE_FLAG), + "FUTEX_WAKE_BITSET_PRIVATE": (FUTEX_WAKE_BITSET | FUTEX_PRIVATE_FLAG), + "FUTEX_WAIT_REQUEUE_PI_PRIVATE": (FUTEX_WAIT_REQUEUE_PI | FUTEX_PRIVATE_FLAG), + "FUTEX_CMP_REQUEUE_PI_PRIVATE": (FUTEX_CMP_REQUEUE_PI | FUTEX_PRIVATE_FLAG), + } + + for name, op := range unsupportedFutexOps { + t.Run(name, func(t *testing.T) { + goVm, state, contracts := setup(t, int(op), nil) + step := state.GetStep() + + state.Memory.SetMemory(state.GetPC(), syscallInsn) + state.GetRegistersRef()[2] = exec.SysFutex // Set syscall number + state.GetRegistersRef()[5] = op + + // Setup expectations + expected := mttestutil.NewExpectedMTState(state) + expected.Step += 1 + expected.StepsSinceLastContextSwitch += 1 + expected.ActiveThread().PC = state.GetCpu().NextPC + expected.ActiveThread().NextPC = state.GetCpu().NextPC + 4 + expected.ActiveThread().Registers[2] = exec.SysErrorSignal + expected.ActiveThread().Registers[7] = exec.MipsEINVAL + + // State transition + var err error + var stepWitness *mipsevm.StepWitness + stepWitness, err = goVm.Step(true) + require.NoError(t, err) + + // Validate post-state + expected.Validate(t, state) + testutil.ValidateEVM(t, stepWitness, step, goVm, multithreaded.GetStateHashFn(), contracts, tracer) + }) + } +} + +func TestEVM_SysYield(t *testing.T) { + runPreemptSyscall(t, "SysSchedYield", exec.SysSchedYield) +} + +func TestEVM_SysNanosleep(t *testing.T) { + runPreemptSyscall(t, "SysNanosleep", exec.SysNanosleep) +} + +func runPreemptSyscall(t *testing.T, syscallName string, syscallNum uint32) { + var tracer *tracing.Hooks + cases := []struct { + name string + traverseRight bool + activeThreads int + inactiveThreads int + }{ + {name: "Last active thread", activeThreads: 1, inactiveThreads: 2}, + {name: "Only thread", activeThreads: 1, inactiveThreads: 0}, + {name: "Do not change directions", activeThreads: 2, inactiveThreads: 2}, + {name: "Do not change directions", activeThreads: 3, inactiveThreads: 0}, + } + + for i, c := range cases { + for _, traverseRight := range []bool{true, false} { + testName := fmt.Sprintf("%v: %v (traverseRight = %v)", syscallName, c.name, traverseRight) + t.Run(testName, func(t *testing.T) { + goVm, state, contracts := setup(t, i*789, nil) + mttestutil.SetupThreads(int64(i*3259), state, traverseRight, c.activeThreads, c.inactiveThreads) + + state.Memory.SetMemory(state.GetPC(), syscallInsn) + state.GetRegistersRef()[2] = syscallNum // Set syscall number + step := state.Step + + // Set up post-state expectations + expected := mttestutil.NewExpectedMTState(state) + expected.ExpectStep() + expected.ExpectPreemption(state) + expected.PrestateActiveThread().Registers[2] = 0 + expected.PrestateActiveThread().Registers[7] = 0 + + // State transition + var err error + var stepWitness *mipsevm.StepWitness + stepWitness, err = goVm.Step(true) + require.NoError(t, err) + + // Validate post-state + expected.Validate(t, state) + testutil.ValidateEVM(t, stepWitness, step, goVm, multithreaded.GetStateHashFn(), contracts, tracer) + }) + } + } +} + +func TestEVM_SysOpen(t *testing.T) { + var tracer *tracing.Hooks + + goVm, state, contracts := setup(t, 5512, nil) + + state.Memory.SetMemory(state.GetPC(), syscallInsn) + state.GetRegistersRef()[2] = exec.SysOpen // Set syscall number + step := state.Step + + // Set up post-state expectations + expected := mttestutil.NewExpectedMTState(state) + expected.ExpectStep() + expected.ActiveThread().Registers[2] = exec.SysErrorSignal + expected.ActiveThread().Registers[7] = exec.MipsEBADF + + // State transition + var err error + var stepWitness *mipsevm.StepWitness + stepWitness, err = goVm.Step(true) + require.NoError(t, err) + + // Validate post-state + expected.Validate(t, state) + testutil.ValidateEVM(t, stepWitness, step, goVm, multithreaded.GetStateHashFn(), contracts, tracer) +} + +func TestEVM_SysGetPID(t *testing.T) { + var tracer *tracing.Hooks + goVm, state, contracts := setup(t, 1929, nil) + + state.Memory.SetMemory(state.GetPC(), syscallInsn) + state.GetRegistersRef()[2] = exec.SysGetpid // Set syscall number + step := state.Step + + // Set up post-state expectations + expected := mttestutil.NewExpectedMTState(state) + expected.ExpectStep() + expected.ActiveThread().Registers[2] = 0 + expected.ActiveThread().Registers[7] = 0 + + // State transition + var err error + var stepWitness *mipsevm.StepWitness + stepWitness, err = goVm.Step(true) + require.NoError(t, err) + + // Validate post-state + expected.Validate(t, state) + testutil.ValidateEVM(t, stepWitness, step, goVm, multithreaded.GetStateHashFn(), contracts, tracer) +} + +func TestEVM_SysClockGettimeMonotonic(t *testing.T) { + testEVM_SysClockGettime(t, exec.ClockGettimeMonotonicFlag) +} + +func TestEVM_SysClockGettimeRealtime(t *testing.T) { + testEVM_SysClockGettime(t, exec.ClockGettimeRealtimeFlag) +} + +func testEVM_SysClockGettime(t *testing.T, clkid uint32) { + var tracer *tracing.Hooks + + llVariations := []struct { + name string + llReservationActive bool + matchThreadId bool + matchEffAddr bool + matchEffAddr2 bool + shouldClearReservation bool + }{ + {name: "matching reservation", llReservationActive: true, matchThreadId: true, matchEffAddr: true, shouldClearReservation: true}, + {name: "matching reservation, 2nd word", llReservationActive: true, matchThreadId: true, matchEffAddr2: true, shouldClearReservation: true}, + {name: "matching reservation, diff thread", llReservationActive: true, matchThreadId: false, matchEffAddr: true, shouldClearReservation: true}, + {name: "matching reservation, diff thread, 2nd word", llReservationActive: true, matchThreadId: false, matchEffAddr2: true, shouldClearReservation: true}, + {name: "mismatched reservation", llReservationActive: true, matchThreadId: true, matchEffAddr: false, shouldClearReservation: false}, + {name: "mismatched reservation, diff thread", llReservationActive: true, matchThreadId: false, matchEffAddr: false, shouldClearReservation: false}, + {name: "no reservation, matching addr", llReservationActive: false, matchThreadId: true, matchEffAddr: true, shouldClearReservation: true}, + {name: "no reservation, matching addr2", llReservationActive: false, matchThreadId: true, matchEffAddr2: true, shouldClearReservation: true}, + {name: "no reservation, mismatched addr", llReservationActive: false, matchThreadId: true, matchEffAddr: false, shouldClearReservation: false}, + } + + cases := []struct { + name string + timespecAddr uint32 + }{ + {"aligned timespec address", 0x1000}, + {"unaligned timespec address", 0x1003}, + } + for i, c := range cases { + for _, v := range llVariations { + tName := fmt.Sprintf("%v (%v)", c.name, v.name) + t.Run(tName, func(t *testing.T) { + goVm, state, contracts := setup(t, 2101, nil) + mttestutil.InitializeSingleThread(2101+i, state, i%2 == 1) + effAddr := c.timespecAddr & 0xFFffFFfc + effAddr2 := effAddr + 4 + step := state.Step + + // Define LL-related params + var llAddress, llOwnerThread uint32 + if v.matchEffAddr { + llAddress = effAddr + } else if v.matchEffAddr2 { + llAddress = effAddr2 + } else { + llAddress = effAddr2 + 8 + } + if v.matchThreadId { + llOwnerThread = state.GetCurrentThread().ThreadId + } else { + llOwnerThread = state.GetCurrentThread().ThreadId + 1 + } + + state.Memory.SetMemory(state.GetPC(), syscallInsn) + state.GetRegistersRef()[2] = exec.SysClockGetTime // Set syscall number + state.GetRegistersRef()[4] = clkid // a0 + state.GetRegistersRef()[5] = c.timespecAddr // a1 + state.LLReservationActive = v.llReservationActive + state.LLAddress = llAddress + state.LLOwnerThread = llOwnerThread + + expected := mttestutil.NewExpectedMTState(state) + expected.ExpectStep() + expected.ActiveThread().Registers[2] = 0 + expected.ActiveThread().Registers[7] = 0 + next := state.Step + 1 + var secs, nsecs uint32 + if clkid == exec.ClockGettimeMonotonicFlag { + secs = uint32(next / exec.HZ) + nsecs = uint32((next % exec.HZ) * (1_000_000_000 / exec.HZ)) + } + expected.ExpectMemoryWrite(effAddr, secs) + expected.ExpectMemoryWrite(effAddr2, nsecs) + if v.shouldClearReservation { + expected.LLReservationActive = false + expected.LLAddress = 0 + expected.LLOwnerThread = 0 + } + + var err error + var stepWitness *mipsevm.StepWitness + stepWitness, err = goVm.Step(true) + require.NoError(t, err) + + // Validate post-state + expected.Validate(t, state) + testutil.ValidateEVM(t, stepWitness, step, goVm, multithreaded.GetStateHashFn(), contracts, tracer) + }) + } + } +} + +func TestEVM_SysClockGettimeNonMonotonic(t *testing.T) { + var tracer *tracing.Hooks + goVm, state, contracts := setup(t, 2101, nil) + + timespecAddr := uint32(0x1000) + state.Memory.SetMemory(state.GetPC(), syscallInsn) + state.GetRegistersRef()[2] = exec.SysClockGetTime // Set syscall number + state.GetRegistersRef()[4] = 0xDEAD // a0 - invalid clockid + state.GetRegistersRef()[5] = timespecAddr // a1 + step := state.Step + + expected := mttestutil.NewExpectedMTState(state) + expected.ExpectStep() + expected.ActiveThread().Registers[2] = exec.SysErrorSignal + expected.ActiveThread().Registers[7] = exec.MipsEINVAL + + var err error + var stepWitness *mipsevm.StepWitness + stepWitness, err = goVm.Step(true) + require.NoError(t, err) + + // Validate post-state + expected.Validate(t, state) + testutil.ValidateEVM(t, stepWitness, step, goVm, multithreaded.GetStateHashFn(), contracts, tracer) +} + +var NoopSyscalls = map[string]uint32{ + "SysGetAffinity": 4240, + "SysMadvise": 4218, + "SysRtSigprocmask": 4195, + "SysSigaltstack": 4206, + "SysRtSigaction": 4194, + "SysPrlimit64": 4338, + "SysClose": 4006, + "SysPread64": 4200, + "SysFstat64": 4215, + "SysOpenAt": 4288, + "SysReadlink": 4085, + "SysReadlinkAt": 4298, + "SysIoctl": 4054, + "SysEpollCreate1": 4326, + "SysPipe2": 4328, + "SysEpollCtl": 4249, + "SysEpollPwait": 4313, + "SysGetRandom": 4353, + "SysUname": 4122, + "SysStat64": 4213, + "SysGetuid": 4024, + "SysGetgid": 4047, + "SysLlseek": 4140, + "SysMinCore": 4217, + "SysTgkill": 4266, + "SysMunmap": 4091, + "SysSetITimer": 4104, + "SysTimerCreate": 4257, + "SysTimerSetTime": 4258, + "SysTimerDelete": 4261, +} + +func TestEVM_NoopSyscall(t *testing.T) { + var tracer *tracing.Hooks + for noopName, noopVal := range NoopSyscalls { + t.Run(noopName, func(t *testing.T) { + goVm, state, contracts := setup(t, int(noopVal), nil) + + state.Memory.SetMemory(state.GetPC(), syscallInsn) + state.GetRegistersRef()[2] = noopVal // Set syscall number + step := state.Step + + // Set up post-state expectations + expected := mttestutil.NewExpectedMTState(state) + expected.ExpectStep() + expected.ActiveThread().Registers[2] = 0 + expected.ActiveThread().Registers[7] = 0 + + // State transition + var err error + var stepWitness *mipsevm.StepWitness + stepWitness, err = goVm.Step(true) + require.NoError(t, err) + + // Validate post-state + expected.Validate(t, state) + testutil.ValidateEVM(t, stepWitness, step, goVm, multithreaded.GetStateHashFn(), contracts, tracer) + }) + + } +} + +func TestEVM_UnsupportedSyscall(t *testing.T) { + t.Parallel() + var tracer *tracing.Hooks + + var NoopSyscallNums = maps.Values(NoopSyscalls) + var SupportedSyscalls = []uint32{exec.SysMmap, exec.SysBrk, exec.SysClone, exec.SysExitGroup, exec.SysRead, exec.SysWrite, exec.SysFcntl, exec.SysExit, exec.SysSchedYield, exec.SysGetTID, exec.SysFutex, exec.SysOpen, exec.SysNanosleep, exec.SysClockGetTime, exec.SysGetpid} + unsupportedSyscalls := make([]uint32, 0, 400) + for i := 4000; i < 4400; i++ { + candidate := uint32(i) + if slices.Contains(SupportedSyscalls, candidate) || slices.Contains(NoopSyscallNums, candidate) { + continue + } + unsupportedSyscalls = append(unsupportedSyscalls, candidate) + } + + for i, syscallNum := range unsupportedSyscalls { + testName := fmt.Sprintf("Unsupported syscallNum %v", syscallNum) + i := i + syscallNum := syscallNum + t.Run(testName, func(t *testing.T) { + t.Parallel() + goVm, state, contracts := setup(t, i*3434, nil) + // Setup basic getThreadId syscall instruction + state.Memory.SetMemory(state.GetPC(), syscallInsn) + state.GetRegistersRef()[2] = syscallNum + + // Set up post-state expectations + require.Panics(t, func() { _, _ = goVm.Step(true) }) + testutil.AssertEVMReverts(t, state, contracts, tracer) + }) + } +} + +func TestEVM_NormalTraversalStep_HandleWaitingThread(t *testing.T) { + var tracer *tracing.Hooks + cases := []struct { + name string + step uint64 + activeStackSize int + otherStackSize int + futexAddr uint32 + targetValue uint32 + actualValue uint32 + timeoutStep uint64 + shouldWakeup bool + shouldTimeout bool + }{ + {name: "Preempt, no timeout #1", step: 100, activeStackSize: 1, otherStackSize: 0, futexAddr: 0x100, targetValue: 0x01, actualValue: 0x01, timeoutStep: exec.FutexNoTimeout}, + {name: "Preempt, no timeout #2", step: 100, activeStackSize: 1, otherStackSize: 1, futexAddr: 0x100, targetValue: 0x01, actualValue: 0x01, timeoutStep: exec.FutexNoTimeout}, + {name: "Preempt, no timeout #3", step: 100, activeStackSize: 2, otherStackSize: 1, futexAddr: 0x100, targetValue: 0x01, actualValue: 0x01, timeoutStep: exec.FutexNoTimeout}, + {name: "Preempt, no timeout, unaligned", step: 100, activeStackSize: 2, otherStackSize: 1, futexAddr: 0x101, targetValue: 0x01, actualValue: 0x01, timeoutStep: exec.FutexNoTimeout}, + {name: "Preempt, with timeout #1", step: 100, activeStackSize: 2, otherStackSize: 1, futexAddr: 0x100, targetValue: 0x01, actualValue: 0x01, timeoutStep: 101}, + {name: "Preempt, with timeout #2", step: 100, activeStackSize: 1, otherStackSize: 1, futexAddr: 0x100, targetValue: 0x01, actualValue: 0x01, timeoutStep: 150}, + {name: "Preempt, with timeout, unaligned", step: 100, activeStackSize: 1, otherStackSize: 1, futexAddr: 0x101, targetValue: 0x01, actualValue: 0x01, timeoutStep: 150}, + {name: "Wakeup, no timeout #1", step: 100, activeStackSize: 1, otherStackSize: 0, futexAddr: 0x100, targetValue: 0x01, actualValue: 0x02, timeoutStep: exec.FutexNoTimeout, shouldWakeup: true}, + {name: "Wakeup, no timeout #2", step: 100, activeStackSize: 2, otherStackSize: 1, futexAddr: 0x100, targetValue: 0x01, actualValue: 0x02, timeoutStep: exec.FutexNoTimeout, shouldWakeup: true}, + {name: "Wakeup, no timeout, unaligned", step: 100, activeStackSize: 2, otherStackSize: 1, futexAddr: 0x102, targetValue: 0x01, actualValue: 0x02, timeoutStep: exec.FutexNoTimeout, shouldWakeup: true}, + {name: "Wakeup with timeout #1", step: 100, activeStackSize: 2, otherStackSize: 1, futexAddr: 0x100, targetValue: 0x01, actualValue: 0x02, timeoutStep: 100, shouldWakeup: true, shouldTimeout: true}, + {name: "Wakeup with timeout #2", step: 100, activeStackSize: 2, otherStackSize: 1, futexAddr: 0x100, targetValue: 0x02, actualValue: 0x02, timeoutStep: 100, shouldWakeup: true, shouldTimeout: true}, + {name: "Wakeup with timeout #3", step: 100, activeStackSize: 2, otherStackSize: 1, futexAddr: 0x100, targetValue: 0x02, actualValue: 0x02, timeoutStep: 50, shouldWakeup: true, shouldTimeout: true}, + {name: "Wakeup with timeout, unaligned", step: 100, activeStackSize: 2, otherStackSize: 1, futexAddr: 0x103, targetValue: 0x02, actualValue: 0x02, timeoutStep: 50, shouldWakeup: true, shouldTimeout: true}, + } + + for _, c := range cases { + for i, traverseRight := range []bool{true, false} { + testName := fmt.Sprintf("%v (traverseRight=%v)", c.name, traverseRight) + t.Run(testName, func(t *testing.T) { + // Sanity check + if !c.shouldWakeup && c.shouldTimeout { + require.Fail(t, "Invalid test case - cannot expect a timeout with no wakeup") + } + effAddr := c.futexAddr & 0xFF_FF_FF_Fc + goVm, state, contracts := setup(t, i, nil) + mttestutil.SetupThreads(int64(i*101), state, traverseRight, c.activeStackSize, c.otherStackSize) + state.Step = c.step + + activeThread := state.GetCurrentThread() + activeThread.FutexAddr = c.futexAddr + activeThread.FutexVal = c.targetValue + activeThread.FutexTimeoutStep = c.timeoutStep + state.GetMemory().SetMemory(effAddr, c.actualValue) + + // Set up post-state expectations + expected := mttestutil.NewExpectedMTState(state) + expected.Step += 1 + if c.shouldWakeup { + expected.ActiveThread().FutexAddr = exec.FutexEmptyAddr + expected.ActiveThread().FutexVal = 0 + expected.ActiveThread().FutexTimeoutStep = 0 + // PC and return registers are updated onWaitComplete + expected.ActiveThread().PC = state.GetCpu().NextPC + expected.ActiveThread().NextPC = state.GetCpu().NextPC + 4 + if c.shouldTimeout { + expected.ActiveThread().Registers[2] = exec.SysErrorSignal + expected.ActiveThread().Registers[7] = exec.MipsETIMEDOUT + } else { + expected.ActiveThread().Registers[2] = 0 + expected.ActiveThread().Registers[7] = 0 + } + } else { + expected.ExpectPreemption(state) + } + + // State transition + var err error + var stepWitness *mipsevm.StepWitness + stepWitness, err = goVm.Step(true) + require.NoError(t, err) + + // Validate post-state + expected.Validate(t, state) + testutil.ValidateEVM(t, stepWitness, c.step, goVm, multithreaded.GetStateHashFn(), contracts, tracer) + }) + + } + } +} + +func TestEVM_NormalTraversal_Full(t *testing.T) { + var tracer *tracing.Hooks + cases := []struct { + name string + threadCount int + }{ + {"1 thread", 1}, + {"2 threads", 2}, + {"3 threads", 3}, + } + + for i, c := range cases { + for _, traverseRight := range []bool{true, false} { + testName := fmt.Sprintf("%v (traverseRight = %v)", c.name, traverseRight) + t.Run(testName, func(t *testing.T) { + // Setup + goVm, state, contracts := setup(t, i*789, nil) + mttestutil.SetupThreads(int64(i*2947), state, traverseRight, c.threadCount, 0) + // Put threads into a waiting state so that we just traverse through them + for _, thread := range mttestutil.GetAllThreads(state) { + thread.FutexAddr = 0x04 + thread.FutexTimeoutStep = exec.FutexNoTimeout + } + step := state.Step + + initialState := mttestutil.NewExpectedMTState(state) + + // Loop through all the threads to get back to the starting state + iterations := c.threadCount * 2 + for i := 0; i < iterations; i++ { + // Set up post-state expectations + expected := mttestutil.NewExpectedMTState(state) + expected.Step += 1 + expected.ExpectPreemption(state) + + // State transition + var err error + var stepWitness *mipsevm.StepWitness + stepWitness, err = goVm.Step(true) + require.NoError(t, err) + + // Validate post-state + expected.Validate(t, state) + testutil.ValidateEVM(t, stepWitness, step, goVm, multithreaded.GetStateHashFn(), contracts, tracer) + } + + // We should be back to the original state with only a few modifications + initialState.Step += uint64(iterations) + initialState.StepsSinceLastContextSwitch = 0 + initialState.Validate(t, state) + }) + } + } +} + +func TestEVM_WakeupTraversalStep(t *testing.T) { + addr := uint32(0x1234) + wakeupVal := uint32(0x999) + var tracer *tracing.Hooks + cases := []struct { + name string + wakeupAddr uint32 + futexAddr uint32 + targetVal uint32 + traverseRight bool + activeStackSize int + otherStackSize int + shouldClearWakeup bool + shouldPreempt bool + }{ + {name: "Matching addr, not wakeable, first thread", wakeupAddr: addr, futexAddr: addr, targetVal: wakeupVal, traverseRight: false, activeStackSize: 3, otherStackSize: 0, shouldClearWakeup: true}, + {name: "Matching addr, wakeable, first thread", wakeupAddr: addr, futexAddr: addr, targetVal: wakeupVal + 1, traverseRight: false, activeStackSize: 3, otherStackSize: 0, shouldClearWakeup: true}, + {name: "Matching addr, not wakeable, last thread", wakeupAddr: addr, futexAddr: addr, targetVal: wakeupVal, traverseRight: true, activeStackSize: 1, otherStackSize: 2, shouldClearWakeup: true}, + {name: "Matching addr, wakeable, last thread", wakeupAddr: addr, futexAddr: addr, targetVal: wakeupVal + 1, traverseRight: true, activeStackSize: 1, otherStackSize: 2, shouldClearWakeup: true}, + {name: "Matching addr, not wakeable, intermediate thread", wakeupAddr: addr, futexAddr: addr, targetVal: wakeupVal, traverseRight: false, activeStackSize: 2, otherStackSize: 2, shouldClearWakeup: true}, + {name: "Matching addr, wakeable, intermediate thread", wakeupAddr: addr, futexAddr: addr, targetVal: wakeupVal + 1, traverseRight: true, activeStackSize: 2, otherStackSize: 2, shouldClearWakeup: true}, + {name: "Mismatched addr, last thread", wakeupAddr: addr, futexAddr: addr + 4, traverseRight: true, activeStackSize: 1, otherStackSize: 2, shouldPreempt: true, shouldClearWakeup: true}, + {name: "Mismatched addr", wakeupAddr: addr, futexAddr: addr + 4, traverseRight: true, activeStackSize: 2, otherStackSize: 2, shouldPreempt: true}, + {name: "Mismatched addr", wakeupAddr: addr, futexAddr: addr + 4, traverseRight: false, activeStackSize: 2, otherStackSize: 0, shouldPreempt: true}, + {name: "Mismatched addr", wakeupAddr: addr, futexAddr: addr + 4, traverseRight: false, activeStackSize: 1, otherStackSize: 0, shouldPreempt: true}, + {name: "Non-waiting thread", wakeupAddr: addr, futexAddr: exec.FutexEmptyAddr, traverseRight: false, activeStackSize: 1, otherStackSize: 0, shouldPreempt: true}, + {name: "Non-waiting thread", wakeupAddr: addr, futexAddr: exec.FutexEmptyAddr, traverseRight: true, activeStackSize: 2, otherStackSize: 1, shouldPreempt: true}, + {name: "Non-waiting thread, last thread", wakeupAddr: addr, futexAddr: exec.FutexEmptyAddr, traverseRight: true, activeStackSize: 1, otherStackSize: 1, shouldPreempt: true, shouldClearWakeup: true}, + // Check behavior of unaligned addresses - should be the same as aligned addresses (no memory access) + {name: "Matching addr, unaligned", wakeupAddr: addr + 1, futexAddr: addr + 1, targetVal: wakeupVal, traverseRight: false, activeStackSize: 3, otherStackSize: 0, shouldClearWakeup: true}, + {name: "Mismatched addr, last thread, wakeup unaligned", wakeupAddr: addr + 1, futexAddr: addr + 4, traverseRight: true, activeStackSize: 1, otherStackSize: 2, shouldPreempt: true, shouldClearWakeup: true}, + {name: "Mismatched addr, last thread, futex unaligned", wakeupAddr: addr, futexAddr: addr + 5, traverseRight: true, activeStackSize: 1, otherStackSize: 2, shouldPreempt: true, shouldClearWakeup: true}, + {name: "Mismatched addr, last thread, wake & futex unaligned", wakeupAddr: addr + 1, futexAddr: addr + 5, traverseRight: true, activeStackSize: 1, otherStackSize: 2, shouldPreempt: true, shouldClearWakeup: true}, + {name: "Mismatched addr, wakeup unaligned", wakeupAddr: addr + 3, futexAddr: addr + 4, traverseRight: true, activeStackSize: 2, otherStackSize: 2, shouldPreempt: true}, + {name: "Mismatched addr, futex unaligned", wakeupAddr: addr, futexAddr: addr + 6, traverseRight: true, activeStackSize: 2, otherStackSize: 2, shouldPreempt: true}, + {name: "Mismatched addr, wakeup & futex unaligned", wakeupAddr: addr + 2, futexAddr: addr + 6, traverseRight: true, activeStackSize: 2, otherStackSize: 2, shouldPreempt: true}, + {name: "Non-waiting thread, last thread, unaligned wakeup", wakeupAddr: addr + 3, futexAddr: exec.FutexEmptyAddr, traverseRight: true, activeStackSize: 1, otherStackSize: 1, shouldPreempt: true, shouldClearWakeup: true}, + } + + for i, c := range cases { + t.Run(c.name, func(t *testing.T) { + goVm, state, contracts := setup(t, i*2000, nil) + mttestutil.SetupThreads(int64(i*101), state, c.traverseRight, c.activeStackSize, c.otherStackSize) + step := state.Step + + state.Wakeup = c.wakeupAddr + state.GetMemory().SetMemory(c.wakeupAddr&0xFF_FF_FF_FC, wakeupVal) + activeThread := state.GetCurrentThread() + activeThread.FutexAddr = c.futexAddr + activeThread.FutexVal = c.targetVal + activeThread.FutexTimeoutStep = exec.FutexNoTimeout + + // Set up post-state expectations + expected := mttestutil.NewExpectedMTState(state) + expected.Step += 1 + if c.shouldClearWakeup { + expected.Wakeup = exec.FutexEmptyAddr + } + if c.shouldPreempt { + // Just preempt the current thread + expected.ExpectPreemption(state) + } + + // State transition + var err error + var stepWitness *mipsevm.StepWitness + stepWitness, err = goVm.Step(true) + require.NoError(t, err) + + // Validate post-state + expected.Validate(t, state) + testutil.ValidateEVM(t, stepWitness, step, goVm, multithreaded.GetStateHashFn(), contracts, tracer) + }) + } +} + +func TestEVM_WakeupTraversal_Full(t *testing.T) { + var tracer *tracing.Hooks + cases := []struct { + name string + threadCount int + }{ + {"1 thread", 1}, + {"2 threads", 2}, + {"3 threads", 3}, + } + for i, c := range cases { + t.Run(c.name, func(t *testing.T) { + // Setup + goVm, state, contracts := setup(t, i*789, nil) + mttestutil.SetupThreads(int64(i*2947), state, false, c.threadCount, 0) + state.Wakeup = 0x08 + step := state.Step + + initialState := mttestutil.NewExpectedMTState(state) + + // Loop through all the threads to get back to the starting state + iterations := c.threadCount * 2 + for i := 0; i < iterations; i++ { + // Set up post-state expectations + expected := mttestutil.NewExpectedMTState(state) + expected.Step += 1 + expected.ExpectPreemption(state) + + // State transition + var err error + var stepWitness *mipsevm.StepWitness + stepWitness, err = goVm.Step(true) + require.NoError(t, err) + + // We should clear the wakeup on the last step + if i == iterations-1 { + expected.Wakeup = exec.FutexEmptyAddr + } + + // Validate post-state + expected.Validate(t, state) + testutil.ValidateEVM(t, stepWitness, step, goVm, multithreaded.GetStateHashFn(), contracts, tracer) + } + + // We should be back to the original state with only a few modifications + initialState.Step += uint64(iterations) + initialState.StepsSinceLastContextSwitch = 0 + initialState.Wakeup = exec.FutexEmptyAddr + initialState.Validate(t, state) + }) + } +} + +func TestEVM_SchedQuantumThreshold(t *testing.T) { + var tracer *tracing.Hooks + cases := []struct { + name string + stepsSinceLastContextSwitch uint64 + shouldPreempt bool + }{ + {name: "just under threshold", stepsSinceLastContextSwitch: exec.SchedQuantum - 1}, + {name: "at threshold", stepsSinceLastContextSwitch: exec.SchedQuantum, shouldPreempt: true}, + {name: "beyond threshold", stepsSinceLastContextSwitch: exec.SchedQuantum + 1, shouldPreempt: true}, + } + + for i, c := range cases { + t.Run(c.name, func(t *testing.T) { + goVm, state, contracts := setup(t, i*789, nil) + // Setup basic getThreadId syscall instruction + state.Memory.SetMemory(state.GetPC(), syscallInsn) + state.GetRegistersRef()[2] = exec.SysGetTID // Set syscall number + state.StepsSinceLastContextSwitch = c.stepsSinceLastContextSwitch + step := state.Step + + // Set up post-state expectations + expected := mttestutil.NewExpectedMTState(state) + if c.shouldPreempt { + expected.Step += 1 + expected.ExpectPreemption(state) + } else { + // Otherwise just expect a normal step + expected.ExpectStep() + expected.ActiveThread().Registers[2] = state.GetCurrentThread().ThreadId + expected.ActiveThread().Registers[7] = 0 + } + + // State transition + var err error + var stepWitness *mipsevm.StepWitness + stepWitness, err = goVm.Step(true) + require.NoError(t, err) + + // Validate post-state + expected.Validate(t, state) + testutil.ValidateEVM(t, stepWitness, step, goVm, multithreaded.GetStateHashFn(), contracts, tracer) + }) + } +} + +func setup(t require.TestingT, randomSeed int, preimageOracle mipsevm.PreimageOracle) (mipsevm.FPVM, *multithreaded.State, *testutil.ContractMetadata) { + v := GetMultiThreadedTestCase(t) + vm := v.VMFactory(preimageOracle, os.Stdout, os.Stderr, testutil.CreateLogger(), testutil.WithRandomization(int64(randomSeed))) + state := mttestutil.GetMtState(t, vm) + + return vm, state, v.Contracts + +} diff --git a/cannon/mipsevm/tests/evm_singlethreaded_test.go b/cannon/mipsevm/tests/evm_singlethreaded_test.go new file mode 100644 index 000000000000..32cad32cc00e --- /dev/null +++ b/cannon/mipsevm/tests/evm_singlethreaded_test.go @@ -0,0 +1,196 @@ +package tests + +import ( + "encoding/binary" + "os" + "testing" + + "github.com/ethereum/go-ethereum/core/tracing" + "github.com/ethereum/go-ethereum/crypto" + "github.com/stretchr/testify/require" + + "github.com/ethereum-optimism/optimism/cannon/mipsevm/exec" + "github.com/ethereum-optimism/optimism/cannon/mipsevm/memory" + "github.com/ethereum-optimism/optimism/cannon/mipsevm/testutil" + preimage "github.com/ethereum-optimism/optimism/op-preimage" +) + +func TestEVM_LL(t *testing.T) { + var tracer *tracing.Hooks + + cases := []struct { + name string + base uint32 + offset int + value uint32 + effAddr uint32 + rtReg int + }{ + {name: "Aligned effAddr", base: 0x00_00_00_01, offset: 0x0133, value: 0xABCD, effAddr: 0x00_00_01_34, rtReg: 5}, + {name: "Aligned effAddr, signed extended", base: 0x00_00_00_01, offset: 0xFF33, value: 0xABCD, effAddr: 0xFF_FF_FF_34, rtReg: 5}, + {name: "Unaligned effAddr", base: 0xFF_12_00_01, offset: 0x3401, value: 0xABCD, effAddr: 0xFF_12_34_00, rtReg: 5}, + {name: "Unaligned effAddr, sign extended w overflow", base: 0xFF_12_00_01, offset: 0x8401, value: 0xABCD, effAddr: 0xFF_11_84_00, rtReg: 5}, + {name: "Return register set to 0", base: 0x00_00_00_01, offset: 0x0133, value: 0xABCD, effAddr: 0x00_00_01_34, rtReg: 0}, + } + v := GetSingleThreadedTestCase(t) + for i, c := range cases { + t.Run(c.name, func(t *testing.T) { + rtReg := c.rtReg + baseReg := 6 + pc := uint32(0x44) + insn := uint32((0b11_0000 << 26) | (baseReg & 0x1F << 21) | (rtReg & 0x1F << 16) | (0xFFFF & c.offset)) + goVm := v.VMFactory(nil, os.Stdout, os.Stderr, testutil.CreateLogger(), testutil.WithRandomization(int64(i)), testutil.WithPC(pc), testutil.WithNextPC(pc+4)) + state := goVm.GetState() + state.GetMemory().SetMemory(pc, insn) + state.GetMemory().SetMemory(c.effAddr, c.value) + state.GetRegistersRef()[baseReg] = c.base + step := state.GetStep() + + // Setup expectations + expected := testutil.NewExpectedState(state) + expected.Step += 1 + expected.PC = pc + 4 + expected.NextPC = pc + 8 + if rtReg != 0 { + expected.Registers[rtReg] = c.value + } + + stepWitness, err := goVm.Step(true) + require.NoError(t, err) + + // Check expectations + expected.Validate(t, state) + testutil.ValidateEVM(t, stepWitness, step, goVm, v.StateHashFn, v.Contracts, tracer) + }) + } +} + +func TestEVM_SC(t *testing.T) { + var tracer *tracing.Hooks + + cases := []struct { + name string + base uint32 + offset int + value uint32 + effAddr uint32 + rtReg int + }{ + {name: "Aligned effAddr", base: 0x00_00_00_01, offset: 0x0133, value: 0xABCD, effAddr: 0x00_00_01_34, rtReg: 5}, + {name: "Aligned effAddr, signed extended", base: 0x00_00_00_01, offset: 0xFF33, value: 0xABCD, effAddr: 0xFF_FF_FF_34, rtReg: 5}, + {name: "Unaligned effAddr", base: 0xFF_12_00_01, offset: 0x3401, value: 0xABCD, effAddr: 0xFF_12_34_00, rtReg: 5}, + {name: "Unaligned effAddr, sign extended w overflow", base: 0xFF_12_00_01, offset: 0x8401, value: 0xABCD, effAddr: 0xFF_11_84_00, rtReg: 5}, + {name: "Return register set to 0", base: 0xFF_12_00_01, offset: 0x8401, value: 0xABCD, effAddr: 0xFF_11_84_00, rtReg: 0}, + } + v := GetSingleThreadedTestCase(t) + for i, c := range cases { + t.Run(c.name, func(t *testing.T) { + rtReg := c.rtReg + baseReg := 6 + pc := uint32(0x44) + insn := uint32((0b11_1000 << 26) | (baseReg & 0x1F << 21) | (rtReg & 0x1F << 16) | (0xFFFF & c.offset)) + goVm := v.VMFactory(nil, os.Stdout, os.Stderr, testutil.CreateLogger(), testutil.WithRandomization(int64(i)), testutil.WithPC(pc), testutil.WithNextPC(pc+4)) + state := goVm.GetState() + state.GetMemory().SetMemory(pc, insn) + state.GetRegistersRef()[baseReg] = c.base + state.GetRegistersRef()[rtReg] = c.value + step := state.GetStep() + + // Setup expectations + expected := testutil.NewExpectedState(state) + expected.Step += 1 + expected.PC = pc + 4 + expected.NextPC = pc + 8 + expectedMemory := memory.NewMemory() + expectedMemory.SetMemory(pc, insn) + expectedMemory.SetMemory(c.effAddr, c.value) + expected.MemoryRoot = expectedMemory.MerkleRoot() + if rtReg != 0 { + expected.Registers[rtReg] = 1 // 1 for success + } + + stepWitness, err := goVm.Step(true) + require.NoError(t, err) + + // Check expectations + expected.Validate(t, state) + testutil.ValidateEVM(t, stepWitness, step, goVm, v.StateHashFn, v.Contracts, tracer) + }) + } +} + +func TestEVM_SysRead_Preimage(t *testing.T) { + var tracer *tracing.Hooks + + preimageValue := make([]byte, 0, 8) + preimageValue = binary.BigEndian.AppendUint32(preimageValue, 0x12_34_56_78) + preimageValue = binary.BigEndian.AppendUint32(preimageValue, 0x98_76_54_32) + + v := GetSingleThreadedTestCase(t) + + cases := []struct { + name string + addr uint32 + count uint32 + writeLen uint32 + preimageOffset uint32 + prestateMem uint32 + postateMem uint32 + shouldPanic bool + }{ + {name: "Aligned addr, write 1 byte", addr: 0x00_00_FF_00, count: 1, writeLen: 1, preimageOffset: 8, prestateMem: 0xFF_FF_FF_FF, postateMem: 0x12_FF_FF_FF}, + {name: "Aligned addr, write 2 byte", addr: 0x00_00_FF_00, count: 2, writeLen: 2, preimageOffset: 8, prestateMem: 0xFF_FF_FF_FF, postateMem: 0x12_34_FF_FF}, + {name: "Aligned addr, write 3 byte", addr: 0x00_00_FF_00, count: 3, writeLen: 3, preimageOffset: 8, prestateMem: 0xFF_FF_FF_FF, postateMem: 0x12_34_56_FF}, + {name: "Aligned addr, write 4 byte", addr: 0x00_00_FF_00, count: 4, writeLen: 4, preimageOffset: 8, prestateMem: 0xFF_FF_FF_FF, postateMem: 0x12_34_56_78}, + {name: "1-byte misaligned addr, write 1 byte", addr: 0x00_00_FF_01, count: 1, writeLen: 1, preimageOffset: 8, prestateMem: 0xFF_FF_FF_FF, postateMem: 0xFF_12_FF_FF}, + {name: "1-byte misaligned addr, write 2 byte", addr: 0x00_00_FF_01, count: 2, writeLen: 2, preimageOffset: 9, prestateMem: 0xFF_FF_FF_FF, postateMem: 0xFF_34_56_FF}, + {name: "1-byte misaligned addr, write 3 byte", addr: 0x00_00_FF_01, count: 3, writeLen: 3, preimageOffset: 8, prestateMem: 0xFF_FF_FF_FF, postateMem: 0xFF_12_34_56}, + {name: "2-byte misaligned addr, write 1 byte", addr: 0x00_00_FF_02, count: 1, writeLen: 1, preimageOffset: 8, prestateMem: 0xFF_FF_FF_FF, postateMem: 0xFF_FF_12_FF}, + {name: "2-byte misaligned addr, write 2 byte", addr: 0x00_00_FF_02, count: 2, writeLen: 2, preimageOffset: 12, prestateMem: 0xFF_FF_FF_FF, postateMem: 0xFF_FF_98_76}, + {name: "3-byte misaligned addr, write 1 byte", addr: 0x00_00_FF_03, count: 1, writeLen: 1, preimageOffset: 8, prestateMem: 0xFF_FF_FF_FF, postateMem: 0xFF_FF_FF_12}, + {name: "Count of 0", addr: 0x00_00_FF_03, count: 0, writeLen: 0, preimageOffset: 8, prestateMem: 0xFF_FF_FF_FF, postateMem: 0xFF_FF_FF_FF}, + {name: "Count greater than 4", addr: 0x00_00_FF_00, count: 15, writeLen: 4, preimageOffset: 8, prestateMem: 0xFF_FF_FF_FF, postateMem: 0x12_34_56_78}, + {name: "Count greater than 4, unaligned", addr: 0x00_00_FF_01, count: 15, writeLen: 3, preimageOffset: 8, prestateMem: 0xFF_FF_FF_FF, postateMem: 0xFF_12_34_56}, + {name: "Offset at last byte", addr: 0x00_00_FF_00, count: 4, writeLen: 1, preimageOffset: 15, prestateMem: 0xFF_FF_FF_FF, postateMem: 0x32_FF_FF_FF}, + {name: "Offset just out of bounds", addr: 0x00_00_FF_00, count: 4, writeLen: 0, preimageOffset: 16, prestateMem: 0xFF_FF_FF_FF, postateMem: 0xFF_FF_FF_FF, shouldPanic: true}, + {name: "Offset out of bounds", addr: 0x00_00_FF_00, count: 4, writeLen: 0, preimageOffset: 17, prestateMem: 0xFF_FF_FF_FF, postateMem: 0xFF_FF_FF_FF, shouldPanic: true}, + } + for i, c := range cases { + t.Run(c.name, func(t *testing.T) { + effAddr := 0xFFffFFfc & c.addr + preimageKey := preimage.Keccak256Key(crypto.Keccak256Hash(preimageValue)).PreimageKey() + oracle := testutil.StaticOracle(t, preimageValue) + goVm := v.VMFactory(oracle, os.Stdout, os.Stderr, testutil.CreateLogger(), testutil.WithRandomization(int64(i)), testutil.WithPreimageKey(preimageKey), testutil.WithPreimageOffset(c.preimageOffset)) + state := goVm.GetState() + step := state.GetStep() + + // Set up state + state.GetRegistersRef()[2] = exec.SysRead + state.GetRegistersRef()[4] = exec.FdPreimageRead + state.GetRegistersRef()[5] = c.addr + state.GetRegistersRef()[6] = c.count + state.GetMemory().SetMemory(state.GetPC(), syscallInsn) + state.GetMemory().SetMemory(effAddr, c.prestateMem) + + // Setup expectations + expected := testutil.NewExpectedState(state) + expected.ExpectStep() + expected.Registers[2] = c.writeLen + expected.Registers[7] = 0 // no error + expected.PreimageOffset += c.writeLen + expected.ExpectMemoryWrite(effAddr, c.postateMem) + + if c.shouldPanic { + require.Panics(t, func() { _, _ = goVm.Step(true) }) + testutil.AssertPreimageOracleReverts(t, preimageKey, preimageValue, c.preimageOffset, v.Contracts, tracer) + } else { + stepWitness, err := goVm.Step(true) + require.NoError(t, err) + + // Check expectations + expected.Validate(t, state) + testutil.ValidateEVM(t, stepWitness, step, goVm, v.StateHashFn, v.Contracts, tracer) + } + }) + } +} diff --git a/cannon/mipsevm/tests/fuzz_evm_common_test.go b/cannon/mipsevm/tests/fuzz_evm_common_test.go new file mode 100644 index 000000000000..2b85727679b1 --- /dev/null +++ b/cannon/mipsevm/tests/fuzz_evm_common_test.go @@ -0,0 +1,421 @@ +package tests + +import ( + "bytes" + "encoding/binary" + "math" + "os" + "testing" + + "github.com/ethereum/go-ethereum/crypto" + "github.com/stretchr/testify/require" + + "github.com/ethereum-optimism/optimism/cannon/mipsevm/exec" + "github.com/ethereum-optimism/optimism/cannon/mipsevm/memory" + "github.com/ethereum-optimism/optimism/cannon/mipsevm/program" + "github.com/ethereum-optimism/optimism/cannon/mipsevm/testutil" + preimage "github.com/ethereum-optimism/optimism/op-preimage" +) + +const syscallInsn = uint32(0x00_00_00_0c) + +func FuzzStateSyscallBrk(f *testing.F) { + versions := GetMipsVersionTestCases(f) + f.Fuzz(func(t *testing.T, seed int64) { + for _, v := range versions { + t.Run(v.Name, func(t *testing.T) { + goVm := v.VMFactory(nil, os.Stdout, os.Stderr, testutil.CreateLogger(), testutil.WithRandomization(seed)) + state := goVm.GetState() + state.GetRegistersRef()[2] = exec.SysBrk + state.GetMemory().SetMemory(state.GetPC(), syscallInsn) + step := state.GetStep() + + expected := testutil.NewExpectedState(state) + expected.Step += 1 + expected.PC = state.GetCpu().NextPC + expected.NextPC = state.GetCpu().NextPC + 4 + expected.Registers[2] = program.PROGRAM_BREAK // Return fixed BRK value + expected.Registers[7] = 0 // No error + + stepWitness, err := goVm.Step(true) + require.NoError(t, err) + require.False(t, stepWitness.HasPreimage()) + + expected.Validate(t, state) + testutil.ValidateEVM(t, stepWitness, step, goVm, v.StateHashFn, v.Contracts, nil) + }) + } + }) +} + +func FuzzStateSyscallMmap(f *testing.F) { + // Add special cases for large memory allocation + f.Add(uint32(0), uint32(0x1000), uint32(program.HEAP_END), int64(1)) + f.Add(uint32(0), uint32(1<<31), uint32(program.HEAP_START), int64(2)) + // Check edge case - just within bounds + f.Add(uint32(0), uint32(0x1000), uint32(program.HEAP_END-4096), int64(3)) + + versions := GetMipsVersionTestCases(f) + f.Fuzz(func(t *testing.T, addr uint32, siz uint32, heap uint32, seed int64) { + for _, v := range versions { + t.Run(v.Name, func(t *testing.T) { + goVm := v.VMFactory(nil, os.Stdout, os.Stderr, testutil.CreateLogger(), + testutil.WithRandomization(seed), testutil.WithHeap(heap)) + state := goVm.GetState() + step := state.GetStep() + + state.GetRegistersRef()[2] = exec.SysMmap + state.GetRegistersRef()[4] = addr + state.GetRegistersRef()[5] = siz + state.GetMemory().SetMemory(state.GetPC(), syscallInsn) + + expected := testutil.NewExpectedState(state) + expected.Step += 1 + expected.PC = state.GetCpu().NextPC + expected.NextPC = state.GetCpu().NextPC + 4 + if addr == 0 { + sizAlign := siz + if sizAlign&memory.PageAddrMask != 0 { // adjust size to align with page size + sizAlign = siz + memory.PageSize - (siz & memory.PageAddrMask) + } + newHeap := heap + sizAlign + if newHeap > program.HEAP_END || newHeap < heap || sizAlign < siz { + expected.Registers[2] = exec.SysErrorSignal + expected.Registers[7] = exec.MipsEINVAL + } else { + expected.Heap = heap + sizAlign + expected.Registers[2] = heap + expected.Registers[7] = 0 // no error + } + } else { + expected.Registers[2] = addr + expected.Registers[7] = 0 // no error + } + + stepWitness, err := goVm.Step(true) + require.NoError(t, err) + require.False(t, stepWitness.HasPreimage()) + + expected.Validate(t, state) + testutil.ValidateEVM(t, stepWitness, step, goVm, v.StateHashFn, v.Contracts, nil) + }) + } + }) +} + +func FuzzStateSyscallExitGroup(f *testing.F) { + versions := GetMipsVersionTestCases(f) + f.Fuzz(func(t *testing.T, exitCode uint8, seed int64) { + for _, v := range versions { + t.Run(v.Name, func(t *testing.T) { + goVm := v.VMFactory(nil, os.Stdout, os.Stderr, testutil.CreateLogger(), + testutil.WithRandomization(seed)) + state := goVm.GetState() + state.GetRegistersRef()[2] = exec.SysExitGroup + state.GetRegistersRef()[4] = uint32(exitCode) + state.GetMemory().SetMemory(state.GetPC(), syscallInsn) + step := state.GetStep() + + expected := testutil.NewExpectedState(state) + expected.Step += 1 + expected.Exited = true + expected.ExitCode = exitCode + + stepWitness, err := goVm.Step(true) + require.NoError(t, err) + require.False(t, stepWitness.HasPreimage()) + + expected.Validate(t, state) + testutil.ValidateEVM(t, stepWitness, step, goVm, v.StateHashFn, v.Contracts, nil) + }) + } + }) +} + +func FuzzStateSyscallFcntl(f *testing.F) { + versions := GetMipsVersionTestCases(f) + f.Fuzz(func(t *testing.T, fd uint32, cmd uint32, seed int64) { + for _, v := range versions { + t.Run(v.Name, func(t *testing.T) { + goVm := v.VMFactory(nil, os.Stdout, os.Stderr, testutil.CreateLogger(), + testutil.WithRandomization(seed)) + state := goVm.GetState() + state.GetRegistersRef()[2] = exec.SysFcntl + state.GetRegistersRef()[4] = fd + state.GetRegistersRef()[5] = cmd + state.GetMemory().SetMemory(state.GetPC(), syscallInsn) + step := state.GetStep() + + expected := testutil.NewExpectedState(state) + expected.Step += 1 + expected.PC = state.GetCpu().NextPC + expected.NextPC = state.GetCpu().NextPC + 4 + if cmd == 3 { + switch fd { + case exec.FdStdin, exec.FdPreimageRead, exec.FdHintRead: + expected.Registers[2] = 0 + expected.Registers[7] = 0 + case exec.FdStdout, exec.FdStderr, exec.FdPreimageWrite, exec.FdHintWrite: + expected.Registers[2] = 1 + expected.Registers[7] = 0 + default: + expected.Registers[2] = 0xFF_FF_FF_FF + expected.Registers[7] = exec.MipsEBADF + } + } else { + expected.Registers[2] = 0xFF_FF_FF_FF + expected.Registers[7] = exec.MipsEINVAL + } + + stepWitness, err := goVm.Step(true) + require.NoError(t, err) + require.False(t, stepWitness.HasPreimage()) + + expected.Validate(t, state) + testutil.ValidateEVM(t, stepWitness, step, goVm, v.StateHashFn, v.Contracts, nil) + }) + } + }) +} + +func FuzzStateHintRead(f *testing.F) { + versions := GetMipsVersionTestCases(f) + f.Fuzz(func(t *testing.T, addr uint32, count uint32, seed int64) { + for _, v := range versions { + t.Run(v.Name, func(t *testing.T) { + preimageData := []byte("hello world") + preimageKey := preimage.Keccak256Key(crypto.Keccak256Hash(preimageData)).PreimageKey() + oracle := testutil.StaticOracle(t, preimageData) // only used for hinting + + goVm := v.VMFactory(oracle, os.Stdout, os.Stderr, testutil.CreateLogger(), + testutil.WithRandomization(seed), testutil.WithPreimageKey(preimageKey)) + state := goVm.GetState() + state.GetRegistersRef()[2] = exec.SysRead + state.GetRegistersRef()[4] = exec.FdHintRead + state.GetRegistersRef()[5] = addr + state.GetRegistersRef()[6] = count + state.GetMemory().SetMemory(state.GetPC(), syscallInsn) + step := state.GetStep() + + expected := testutil.NewExpectedState(state) + expected.Step += 1 + expected.PC = state.GetCpu().NextPC + expected.NextPC = state.GetCpu().NextPC + 4 + expected.Registers[2] = count + expected.Registers[7] = 0 // no error + + stepWitness, err := goVm.Step(true) + require.NoError(t, err) + require.False(t, stepWitness.HasPreimage()) + + expected.Validate(t, state) + testutil.ValidateEVM(t, stepWitness, step, goVm, v.StateHashFn, v.Contracts, nil) + }) + } + }) +} + +func FuzzStatePreimageRead(f *testing.F) { + versions := GetMipsVersionTestCases(f) + f.Fuzz(func(t *testing.T, addr uint32, pc uint32, count uint32, preimageOffset uint32, seed int64) { + for _, v := range versions { + t.Run(v.Name, func(t *testing.T) { + effAddr := addr & 0xFF_FF_FF_FC + pc = pc & 0xFF_FF_FF_FC + preexistingMemoryVal := [4]byte{0xFF, 0xFF, 0xFF, 0xFF} + preimageValue := []byte("hello world") + preimageData := testutil.AddPreimageLengthPrefix(preimageValue) + if preimageOffset >= uint32(len(preimageData)) || pc == effAddr { + t.SkipNow() + } + preimageKey := preimage.Keccak256Key(crypto.Keccak256Hash(preimageValue)).PreimageKey() + oracle := testutil.StaticOracle(t, preimageValue) + + goVm := v.VMFactory(oracle, os.Stdout, os.Stderr, testutil.CreateLogger(), + testutil.WithRandomization(seed), testutil.WithPreimageKey(preimageKey), testutil.WithPreimageOffset(preimageOffset), testutil.WithPCAndNextPC(pc)) + state := goVm.GetState() + state.GetRegistersRef()[2] = exec.SysRead + state.GetRegistersRef()[4] = exec.FdPreimageRead + state.GetRegistersRef()[5] = addr + state.GetRegistersRef()[6] = count + state.GetMemory().SetMemory(state.GetPC(), syscallInsn) + state.GetMemory().SetMemory(effAddr, binary.BigEndian.Uint32(preexistingMemoryVal[:])) + step := state.GetStep() + + alignment := addr & 3 + writeLen := 4 - alignment + if count < writeLen { + writeLen = count + } + // Cap write length to remaining bytes of the preimage + preimageDataLen := uint32(len(preimageData)) + if preimageOffset+writeLen > preimageDataLen { + writeLen = preimageDataLen - preimageOffset + } + + expected := testutil.NewExpectedState(state) + expected.Step += 1 + expected.PC = state.GetCpu().NextPC + expected.NextPC = state.GetCpu().NextPC + 4 + expected.Registers[2] = writeLen + expected.Registers[7] = 0 // no error + expected.PreimageOffset += writeLen + if writeLen > 0 { + // Expect a memory write + expectedMemory := preexistingMemoryVal + copy(expectedMemory[alignment:], preimageData[preimageOffset:preimageOffset+writeLen]) + expected.ExpectMemoryWrite(effAddr, binary.BigEndian.Uint32(expectedMemory[:])) + } + + stepWitness, err := goVm.Step(true) + require.NoError(t, err) + require.True(t, stepWitness.HasPreimage()) + + expected.Validate(t, state) + testutil.ValidateEVM(t, stepWitness, step, goVm, v.StateHashFn, v.Contracts, nil) + }) + } + }) +} + +func FuzzStateHintWrite(f *testing.F) { + versions := GetMipsVersionTestCases(f) + f.Fuzz(func(t *testing.T, addr uint32, count uint32, hint1, hint2, hint3 []byte, randSeed int64) { + for _, v := range versions { + t.Run(v.Name, func(t *testing.T) { + // Make sure pc does not overlap with hint data in memory + pc := uint32(0) + if addr <= 8 { + addr += 8 + } + + // Set up hint data + r := testutil.NewRandHelper(randSeed) + hints := [][]byte{hint1, hint2, hint3} + hintData := make([]byte, 0) + for _, hint := range hints { + prefixedHint := testutil.AddHintLengthPrefix(hint) + hintData = append(hintData, prefixedHint...) + } + lastHintLen := math.Round(r.Fraction() * float64(len(hintData))) + lastHint := hintData[:int(lastHintLen)] + expectedBytesToProcess := int(count) + int(lastHintLen) + if expectedBytesToProcess > len(hintData) { + // Add an extra hint to span the rest of the hint data + randomHint := r.RandomBytes(t, expectedBytesToProcess) + prefixedHint := testutil.AddHintLengthPrefix(randomHint) + hintData = append(hintData, prefixedHint...) + hints = append(hints, randomHint) + } + + // Set up state + oracle := &testutil.HintTrackingOracle{} + goVm := v.VMFactory(oracle, os.Stdout, os.Stderr, testutil.CreateLogger(), + testutil.WithRandomization(randSeed), testutil.WithLastHint(lastHint), testutil.WithPCAndNextPC(pc)) + state := goVm.GetState() + state.GetRegistersRef()[2] = exec.SysWrite + state.GetRegistersRef()[4] = exec.FdHintWrite + state.GetRegistersRef()[5] = addr + state.GetRegistersRef()[6] = count + step := state.GetStep() + err := state.GetMemory().SetMemoryRange(addr, bytes.NewReader(hintData[int(lastHintLen):])) + require.NoError(t, err) + state.GetMemory().SetMemory(state.GetPC(), syscallInsn) + + // Set up expectations + expected := testutil.NewExpectedState(state) + expected.Step += 1 + expected.PC = state.GetCpu().NextPC + expected.NextPC = state.GetCpu().NextPC + 4 + expected.Registers[2] = count + expected.Registers[7] = 0 // no error + // Figure out hint expectations + var expectedHints [][]byte + expectedLastHint := make([]byte, 0) + byteIndex := 0 + for _, hint := range hints { + hintDataLength := len(hint) + 4 // Hint data + prefix + hintLastByteIndex := hintDataLength + byteIndex - 1 + if hintLastByteIndex < expectedBytesToProcess { + expectedHints = append(expectedHints, hint) + } else { + expectedLastHint = hintData[byteIndex:expectedBytesToProcess] + break + } + byteIndex += hintDataLength + } + expected.LastHint = expectedLastHint + + // Run state transition + stepWitness, err := goVm.Step(true) + require.NoError(t, err) + require.False(t, stepWitness.HasPreimage()) + + // Validate + require.Equal(t, expectedHints, oracle.Hints()) + expected.Validate(t, state) + testutil.ValidateEVM(t, stepWitness, step, goVm, v.StateHashFn, v.Contracts, nil) + }) + } + }) +} + +func FuzzStatePreimageWrite(f *testing.F) { + versions := GetMipsVersionTestCases(f) + f.Fuzz(func(t *testing.T, addr uint32, count uint32, seed int64) { + for _, v := range versions { + t.Run(v.Name, func(t *testing.T) { + // Make sure pc does not overlap with preimage data in memory + pc := uint32(0) + if addr <= 8 { + addr += 8 + } + effAddr := addr & 0xFF_FF_FF_FC + preexistingMemoryVal := [4]byte{0x12, 0x34, 0x56, 0x78} + preimageData := []byte("hello world") + preimageKey := preimage.Keccak256Key(crypto.Keccak256Hash(preimageData)).PreimageKey() + oracle := testutil.StaticOracle(t, preimageData) + + goVm := v.VMFactory(oracle, os.Stdout, os.Stderr, testutil.CreateLogger(), + testutil.WithRandomization(seed), testutil.WithPreimageKey(preimageKey), testutil.WithPreimageOffset(128), testutil.WithPCAndNextPC(pc)) + state := goVm.GetState() + state.GetRegistersRef()[2] = exec.SysWrite + state.GetRegistersRef()[4] = exec.FdPreimageWrite + state.GetRegistersRef()[5] = addr + state.GetRegistersRef()[6] = count + state.GetMemory().SetMemory(state.GetPC(), syscallInsn) + state.GetMemory().SetMemory(effAddr, binary.BigEndian.Uint32(preexistingMemoryVal[:])) + step := state.GetStep() + + expectBytesWritten := count + alignment := addr & 0x3 + sz := 4 - alignment + if sz < expectBytesWritten { + expectBytesWritten = sz + } + + expected := testutil.NewExpectedState(state) + expected.Step += 1 + expected.PC = state.GetCpu().NextPC + expected.NextPC = state.GetCpu().NextPC + 4 + expected.PreimageOffset = 0 + expected.Registers[2] = expectBytesWritten + expected.Registers[7] = 0 // No error + expected.PreimageKey = preimageKey + if expectBytesWritten > 0 { + // Copy original preimage key, but shift it left by expectBytesWritten + copy(expected.PreimageKey[:], preimageKey[expectBytesWritten:]) + // Copy memory data to rightmost expectedBytesWritten + copy(expected.PreimageKey[32-expectBytesWritten:], preexistingMemoryVal[alignment:]) + } + + stepWitness, err := goVm.Step(true) + require.NoError(t, err) + require.False(t, stepWitness.HasPreimage()) + + expected.Validate(t, state) + testutil.ValidateEVM(t, stepWitness, step, goVm, v.StateHashFn, v.Contracts, nil) + }) + } + }) +} diff --git a/cannon/mipsevm/tests/fuzz_evm_multithreaded_test.go b/cannon/mipsevm/tests/fuzz_evm_multithreaded_test.go new file mode 100644 index 000000000000..828f9c558739 --- /dev/null +++ b/cannon/mipsevm/tests/fuzz_evm_multithreaded_test.go @@ -0,0 +1,66 @@ +package tests + +import ( + "os" + "testing" + + "github.com/stretchr/testify/require" + + "github.com/ethereum-optimism/optimism/cannon/mipsevm/exec" + "github.com/ethereum-optimism/optimism/cannon/mipsevm/multithreaded" + mttestutil "github.com/ethereum-optimism/optimism/cannon/mipsevm/multithreaded/testutil" + "github.com/ethereum-optimism/optimism/cannon/mipsevm/testutil" +) + +func FuzzStateSyscallCloneMT(f *testing.F) { + v := GetMultiThreadedTestCase(f) + f.Fuzz(func(t *testing.T, nextThreadId, stackPtr uint32, seed int64) { + goVm := v.VMFactory(nil, os.Stdout, os.Stderr, testutil.CreateLogger(), testutil.WithRandomization(seed)) + state := mttestutil.GetMtState(t, goVm) + // Update existing threads to avoid collision with nextThreadId + if mttestutil.FindThread(state, nextThreadId) != nil { + for i, t := range mttestutil.GetAllThreads(state) { + t.ThreadId = nextThreadId - uint32(i+1) + } + } + + // Setup + state.NextThreadId = nextThreadId + state.GetMemory().SetMemory(state.GetPC(), syscallInsn) + state.GetRegistersRef()[2] = exec.SysClone + state.GetRegistersRef()[4] = exec.ValidCloneFlags + state.GetRegistersRef()[5] = stackPtr + step := state.GetStep() + + // Set up expectations + expected := mttestutil.NewExpectedMTState(state) + expected.Step += 1 + // Set original thread expectations + expected.PrestateActiveThread().PC = state.GetCpu().NextPC + expected.PrestateActiveThread().NextPC = state.GetCpu().NextPC + 4 + expected.PrestateActiveThread().Registers[2] = nextThreadId + expected.PrestateActiveThread().Registers[7] = 0 + // Set expectations for new, cloned thread + expected.ActiveThreadId = nextThreadId + epxectedNewThread := expected.ExpectNewThread() + epxectedNewThread.PC = state.GetCpu().NextPC + epxectedNewThread.NextPC = state.GetCpu().NextPC + 4 + epxectedNewThread.Registers[2] = 0 + epxectedNewThread.Registers[7] = 0 + epxectedNewThread.Registers[29] = stackPtr + expected.NextThreadId = nextThreadId + 1 + expected.StepsSinceLastContextSwitch = 0 + if state.TraverseRight { + expected.RightStackSize += 1 + } else { + expected.LeftStackSize += 1 + } + + stepWitness, err := goVm.Step(true) + require.NoError(t, err) + require.False(t, stepWitness.HasPreimage()) + + expected.Validate(t, state) + testutil.ValidateEVM(t, stepWitness, step, goVm, multithreaded.GetStateHashFn(), v.Contracts, nil) + }) +} diff --git a/cannon/mipsevm/tests/fuzz_evm_singlethreaded_test.go b/cannon/mipsevm/tests/fuzz_evm_singlethreaded_test.go new file mode 100644 index 000000000000..cc30c0040196 --- /dev/null +++ b/cannon/mipsevm/tests/fuzz_evm_singlethreaded_test.go @@ -0,0 +1,42 @@ +package tests + +import ( + "os" + "testing" + + "github.com/ethereum/go-ethereum/common/hexutil" + "github.com/stretchr/testify/require" + + "github.com/ethereum-optimism/optimism/cannon/mipsevm/exec" + "github.com/ethereum-optimism/optimism/cannon/mipsevm/testutil" +) + +func FuzzStateSyscallCloneST(f *testing.F) { + v := GetSingleThreadedTestCase(f) + f.Fuzz(func(t *testing.T, seed int64) { + goVm := v.VMFactory(nil, os.Stdout, os.Stderr, testutil.CreateLogger(), testutil.WithRandomization(seed)) + state := goVm.GetState() + state.GetRegistersRef()[2] = exec.SysClone + state.GetMemory().SetMemory(state.GetPC(), syscallInsn) + step := state.GetStep() + + expected := testutil.NewExpectedState(state) + expected.Step += 1 + expected.PC = state.GetCpu().NextPC + expected.NextPC = state.GetCpu().NextPC + 4 + expected.Registers[2] = 0x1 + expected.Registers[7] = 0 + + stepWitness, err := goVm.Step(true) + require.NoError(t, err) + require.False(t, stepWitness.HasPreimage()) + + expected.Validate(t, state) + + evm := testutil.NewMIPSEVM(v.Contracts) + evmPost := evm.Step(t, stepWitness, step, v.StateHashFn) + goPost, _ := goVm.GetState().EncodeWitness() + require.Equal(t, hexutil.Bytes(goPost).String(), hexutil.Bytes(evmPost).String(), + "mipsevm produced different state than EVM") + }) +} diff --git a/cannon/mipsevm/tests/helpers.go b/cannon/mipsevm/tests/helpers.go new file mode 100644 index 000000000000..d96940972a65 --- /dev/null +++ b/cannon/mipsevm/tests/helpers.go @@ -0,0 +1,86 @@ +package tests + +import ( + "io" + + "github.com/ethereum/go-ethereum/log" + "github.com/stretchr/testify/require" + + "github.com/ethereum-optimism/optimism/cannon/mipsevm" + "github.com/ethereum-optimism/optimism/cannon/mipsevm/multithreaded" + mttestutil "github.com/ethereum-optimism/optimism/cannon/mipsevm/multithreaded/testutil" + "github.com/ethereum-optimism/optimism/cannon/mipsevm/singlethreaded" + sttestutil "github.com/ethereum-optimism/optimism/cannon/mipsevm/singlethreaded/testutil" + "github.com/ethereum-optimism/optimism/cannon/mipsevm/testutil" +) + +type VMFactory func(po mipsevm.PreimageOracle, stdOut, stdErr io.Writer, log log.Logger, opts ...testutil.StateOption) mipsevm.FPVM + +func singleThreadedVmFactory(po mipsevm.PreimageOracle, stdOut, stdErr io.Writer, log log.Logger, opts ...testutil.StateOption) mipsevm.FPVM { + state := singlethreaded.CreateEmptyState() + mutator := sttestutil.NewStateMutatorSingleThreaded(state) + for _, opt := range opts { + opt(mutator) + } + return singlethreaded.NewInstrumentedState(state, po, stdOut, stdErr, nil) +} + +func multiThreadedVmFactory(po mipsevm.PreimageOracle, stdOut, stdErr io.Writer, log log.Logger, opts ...testutil.StateOption) mipsevm.FPVM { + state := multithreaded.CreateEmptyState() + mutator := mttestutil.NewStateMutatorMultiThreaded(state) + for _, opt := range opts { + opt(mutator) + } + return multithreaded.NewInstrumentedState(state, po, stdOut, stdErr, log, nil) +} + +type ElfVMFactory func(t require.TestingT, elfFile string, po mipsevm.PreimageOracle, stdOut, stdErr io.Writer, log log.Logger) mipsevm.FPVM + +func singleThreadElfVmFactory(t require.TestingT, elfFile string, po mipsevm.PreimageOracle, stdOut, stdErr io.Writer, log log.Logger) mipsevm.FPVM { + state, meta := testutil.LoadELFProgram(t, elfFile, singlethreaded.CreateInitialState, true) + fpvm := singlethreaded.NewInstrumentedState(state, po, stdOut, stdErr, meta) + require.NoError(t, fpvm.InitDebug()) + return fpvm +} + +func multiThreadElfVmFactory(t require.TestingT, elfFile string, po mipsevm.PreimageOracle, stdOut, stdErr io.Writer, log log.Logger) mipsevm.FPVM { + state, meta := testutil.LoadELFProgram(t, elfFile, multithreaded.CreateInitialState, false) + fpvm := multithreaded.NewInstrumentedState(state, po, stdOut, stdErr, log, meta) + require.NoError(t, fpvm.InitDebug()) + return fpvm +} + +type VersionedVMTestCase struct { + Name string + Contracts *testutil.ContractMetadata + StateHashFn mipsevm.HashFn + VMFactory VMFactory + ElfVMFactory ElfVMFactory +} + +func GetSingleThreadedTestCase(t require.TestingT) VersionedVMTestCase { + return VersionedVMTestCase{ + Name: "single-threaded", + Contracts: testutil.TestContractsSetup(t, testutil.MipsSingleThreaded), + StateHashFn: singlethreaded.GetStateHashFn(), + VMFactory: singleThreadedVmFactory, + ElfVMFactory: singleThreadElfVmFactory, + } +} + +func GetMultiThreadedTestCase(t require.TestingT) VersionedVMTestCase { + return VersionedVMTestCase{ + Name: "multi-threaded", + Contracts: testutil.TestContractsSetup(t, testutil.MipsMultithreaded), + StateHashFn: multithreaded.GetStateHashFn(), + VMFactory: multiThreadedVmFactory, + ElfVMFactory: multiThreadElfVmFactory, + } +} + +func GetMipsVersionTestCases(t require.TestingT) []VersionedVMTestCase { + return []VersionedVMTestCase{ + GetSingleThreadedTestCase(t), + GetMultiThreadedTestCase(t), + } +} diff --git a/cannon/mipsevm/open_mips_tests/LICENSE b/cannon/mipsevm/tests/open_mips_tests/LICENSE similarity index 100% rename from cannon/mipsevm/open_mips_tests/LICENSE rename to cannon/mipsevm/tests/open_mips_tests/LICENSE diff --git a/cannon/mipsevm/tests/open_mips_tests/README.md b/cannon/mipsevm/tests/open_mips_tests/README.md new file mode 100644 index 000000000000..93bbf4128e3d --- /dev/null +++ b/cannon/mipsevm/tests/open_mips_tests/README.md @@ -0,0 +1,10 @@ +# OpenMIPS test vectors + +Tests from https://github.com/grantae/OpenMIPS/tree/d606b35e9d5260aef20de2a58660c8303a681e9c/software/test/macro/tests + +OpenMIPS is licensed LGPLv3 (as seen in the root of the repository), see [`LICENSE`](LICENSE) file. +Note that some build-system files from 2014/2015 in that repository by the same author are marked as BSD licensed, +but the build-system is not used here. + +Requires https://github.com/sergev/LiteBSD/releases/download/tools/gcc-4.8.1-mips-macosx.tgz to build + diff --git a/cannon/mipsevm/open_mips_tests/maketests.py b/cannon/mipsevm/tests/open_mips_tests/maketests.py similarity index 100% rename from cannon/mipsevm/open_mips_tests/maketests.py rename to cannon/mipsevm/tests/open_mips_tests/maketests.py diff --git a/cannon/mipsevm/open_mips_tests/test/add.asm b/cannon/mipsevm/tests/open_mips_tests/test/add.asm similarity index 100% rename from cannon/mipsevm/open_mips_tests/test/add.asm rename to cannon/mipsevm/tests/open_mips_tests/test/add.asm diff --git a/cannon/mipsevm/open_mips_tests/test/addi.asm b/cannon/mipsevm/tests/open_mips_tests/test/addi.asm similarity index 100% rename from cannon/mipsevm/open_mips_tests/test/addi.asm rename to cannon/mipsevm/tests/open_mips_tests/test/addi.asm diff --git a/cannon/mipsevm/open_mips_tests/test/addiu.asm b/cannon/mipsevm/tests/open_mips_tests/test/addiu.asm similarity index 100% rename from cannon/mipsevm/open_mips_tests/test/addiu.asm rename to cannon/mipsevm/tests/open_mips_tests/test/addiu.asm diff --git a/cannon/mipsevm/open_mips_tests/test/addu.asm b/cannon/mipsevm/tests/open_mips_tests/test/addu.asm similarity index 100% rename from cannon/mipsevm/open_mips_tests/test/addu.asm rename to cannon/mipsevm/tests/open_mips_tests/test/addu.asm diff --git a/cannon/mipsevm/open_mips_tests/test/and.asm b/cannon/mipsevm/tests/open_mips_tests/test/and.asm similarity index 100% rename from cannon/mipsevm/open_mips_tests/test/and.asm rename to cannon/mipsevm/tests/open_mips_tests/test/and.asm diff --git a/cannon/mipsevm/open_mips_tests/test/andi.asm b/cannon/mipsevm/tests/open_mips_tests/test/andi.asm similarity index 100% rename from cannon/mipsevm/open_mips_tests/test/andi.asm rename to cannon/mipsevm/tests/open_mips_tests/test/andi.asm diff --git a/cannon/mipsevm/open_mips_tests/test/beq.asm b/cannon/mipsevm/tests/open_mips_tests/test/beq.asm similarity index 100% rename from cannon/mipsevm/open_mips_tests/test/beq.asm rename to cannon/mipsevm/tests/open_mips_tests/test/beq.asm diff --git a/cannon/mipsevm/open_mips_tests/test/bgez.asm b/cannon/mipsevm/tests/open_mips_tests/test/bgez.asm similarity index 100% rename from cannon/mipsevm/open_mips_tests/test/bgez.asm rename to cannon/mipsevm/tests/open_mips_tests/test/bgez.asm diff --git a/cannon/mipsevm/open_mips_tests/test/bgtz.asm b/cannon/mipsevm/tests/open_mips_tests/test/bgtz.asm similarity index 100% rename from cannon/mipsevm/open_mips_tests/test/bgtz.asm rename to cannon/mipsevm/tests/open_mips_tests/test/bgtz.asm diff --git a/cannon/mipsevm/open_mips_tests/test/bin/add.bin b/cannon/mipsevm/tests/open_mips_tests/test/bin/add.bin similarity index 100% rename from cannon/mipsevm/open_mips_tests/test/bin/add.bin rename to cannon/mipsevm/tests/open_mips_tests/test/bin/add.bin diff --git a/cannon/mipsevm/open_mips_tests/test/bin/addi.bin b/cannon/mipsevm/tests/open_mips_tests/test/bin/addi.bin similarity index 100% rename from cannon/mipsevm/open_mips_tests/test/bin/addi.bin rename to cannon/mipsevm/tests/open_mips_tests/test/bin/addi.bin diff --git a/cannon/mipsevm/open_mips_tests/test/bin/addiu.bin b/cannon/mipsevm/tests/open_mips_tests/test/bin/addiu.bin similarity index 100% rename from cannon/mipsevm/open_mips_tests/test/bin/addiu.bin rename to cannon/mipsevm/tests/open_mips_tests/test/bin/addiu.bin diff --git a/cannon/mipsevm/open_mips_tests/test/bin/addu.bin b/cannon/mipsevm/tests/open_mips_tests/test/bin/addu.bin similarity index 100% rename from cannon/mipsevm/open_mips_tests/test/bin/addu.bin rename to cannon/mipsevm/tests/open_mips_tests/test/bin/addu.bin diff --git a/cannon/mipsevm/open_mips_tests/test/bin/and.bin b/cannon/mipsevm/tests/open_mips_tests/test/bin/and.bin similarity index 100% rename from cannon/mipsevm/open_mips_tests/test/bin/and.bin rename to cannon/mipsevm/tests/open_mips_tests/test/bin/and.bin diff --git a/cannon/mipsevm/open_mips_tests/test/bin/andi.bin b/cannon/mipsevm/tests/open_mips_tests/test/bin/andi.bin similarity index 100% rename from cannon/mipsevm/open_mips_tests/test/bin/andi.bin rename to cannon/mipsevm/tests/open_mips_tests/test/bin/andi.bin diff --git a/cannon/mipsevm/open_mips_tests/test/bin/beq.bin b/cannon/mipsevm/tests/open_mips_tests/test/bin/beq.bin similarity index 100% rename from cannon/mipsevm/open_mips_tests/test/bin/beq.bin rename to cannon/mipsevm/tests/open_mips_tests/test/bin/beq.bin diff --git a/cannon/mipsevm/open_mips_tests/test/bin/bgez.bin b/cannon/mipsevm/tests/open_mips_tests/test/bin/bgez.bin similarity index 100% rename from cannon/mipsevm/open_mips_tests/test/bin/bgez.bin rename to cannon/mipsevm/tests/open_mips_tests/test/bin/bgez.bin diff --git a/cannon/mipsevm/open_mips_tests/test/bin/bgtz.bin b/cannon/mipsevm/tests/open_mips_tests/test/bin/bgtz.bin similarity index 100% rename from cannon/mipsevm/open_mips_tests/test/bin/bgtz.bin rename to cannon/mipsevm/tests/open_mips_tests/test/bin/bgtz.bin diff --git a/cannon/mipsevm/open_mips_tests/test/bin/blez.bin b/cannon/mipsevm/tests/open_mips_tests/test/bin/blez.bin similarity index 100% rename from cannon/mipsevm/open_mips_tests/test/bin/blez.bin rename to cannon/mipsevm/tests/open_mips_tests/test/bin/blez.bin diff --git a/cannon/mipsevm/open_mips_tests/test/bin/bltz.bin b/cannon/mipsevm/tests/open_mips_tests/test/bin/bltz.bin similarity index 100% rename from cannon/mipsevm/open_mips_tests/test/bin/bltz.bin rename to cannon/mipsevm/tests/open_mips_tests/test/bin/bltz.bin diff --git a/cannon/mipsevm/open_mips_tests/test/bin/bne.bin b/cannon/mipsevm/tests/open_mips_tests/test/bin/bne.bin similarity index 100% rename from cannon/mipsevm/open_mips_tests/test/bin/bne.bin rename to cannon/mipsevm/tests/open_mips_tests/test/bin/bne.bin diff --git a/cannon/mipsevm/open_mips_tests/test/bin/brk.bin b/cannon/mipsevm/tests/open_mips_tests/test/bin/brk.bin similarity index 100% rename from cannon/mipsevm/open_mips_tests/test/bin/brk.bin rename to cannon/mipsevm/tests/open_mips_tests/test/bin/brk.bin diff --git a/cannon/mipsevm/open_mips_tests/test/bin/clo.bin b/cannon/mipsevm/tests/open_mips_tests/test/bin/clo.bin similarity index 100% rename from cannon/mipsevm/open_mips_tests/test/bin/clo.bin rename to cannon/mipsevm/tests/open_mips_tests/test/bin/clo.bin diff --git a/cannon/mipsevm/open_mips_tests/test/bin/clone.bin b/cannon/mipsevm/tests/open_mips_tests/test/bin/clone.bin similarity index 100% rename from cannon/mipsevm/open_mips_tests/test/bin/clone.bin rename to cannon/mipsevm/tests/open_mips_tests/test/bin/clone.bin diff --git a/cannon/mipsevm/open_mips_tests/test/bin/clz.bin b/cannon/mipsevm/tests/open_mips_tests/test/bin/clz.bin similarity index 100% rename from cannon/mipsevm/open_mips_tests/test/bin/clz.bin rename to cannon/mipsevm/tests/open_mips_tests/test/bin/clz.bin diff --git a/cannon/mipsevm/open_mips_tests/test/bin/div.bin b/cannon/mipsevm/tests/open_mips_tests/test/bin/div.bin similarity index 100% rename from cannon/mipsevm/open_mips_tests/test/bin/div.bin rename to cannon/mipsevm/tests/open_mips_tests/test/bin/div.bin diff --git a/cannon/mipsevm/open_mips_tests/test/bin/divu.bin b/cannon/mipsevm/tests/open_mips_tests/test/bin/divu.bin similarity index 100% rename from cannon/mipsevm/open_mips_tests/test/bin/divu.bin rename to cannon/mipsevm/tests/open_mips_tests/test/bin/divu.bin diff --git a/cannon/mipsevm/open_mips_tests/test/bin/exit_group.bin b/cannon/mipsevm/tests/open_mips_tests/test/bin/exit_group.bin similarity index 100% rename from cannon/mipsevm/open_mips_tests/test/bin/exit_group.bin rename to cannon/mipsevm/tests/open_mips_tests/test/bin/exit_group.bin diff --git a/cannon/mipsevm/open_mips_tests/test/bin/fcntl.bin b/cannon/mipsevm/tests/open_mips_tests/test/bin/fcntl.bin similarity index 100% rename from cannon/mipsevm/open_mips_tests/test/bin/fcntl.bin rename to cannon/mipsevm/tests/open_mips_tests/test/bin/fcntl.bin diff --git a/cannon/mipsevm/open_mips_tests/test/bin/j.bin b/cannon/mipsevm/tests/open_mips_tests/test/bin/j.bin similarity index 100% rename from cannon/mipsevm/open_mips_tests/test/bin/j.bin rename to cannon/mipsevm/tests/open_mips_tests/test/bin/j.bin diff --git a/cannon/mipsevm/open_mips_tests/test/bin/jal.bin b/cannon/mipsevm/tests/open_mips_tests/test/bin/jal.bin similarity index 100% rename from cannon/mipsevm/open_mips_tests/test/bin/jal.bin rename to cannon/mipsevm/tests/open_mips_tests/test/bin/jal.bin diff --git a/cannon/mipsevm/open_mips_tests/test/bin/jalr.bin b/cannon/mipsevm/tests/open_mips_tests/test/bin/jalr.bin similarity index 100% rename from cannon/mipsevm/open_mips_tests/test/bin/jalr.bin rename to cannon/mipsevm/tests/open_mips_tests/test/bin/jalr.bin diff --git a/cannon/mipsevm/open_mips_tests/test/bin/jr.bin b/cannon/mipsevm/tests/open_mips_tests/test/bin/jr.bin similarity index 100% rename from cannon/mipsevm/open_mips_tests/test/bin/jr.bin rename to cannon/mipsevm/tests/open_mips_tests/test/bin/jr.bin diff --git a/cannon/mipsevm/open_mips_tests/test/bin/lb.bin b/cannon/mipsevm/tests/open_mips_tests/test/bin/lb.bin similarity index 100% rename from cannon/mipsevm/open_mips_tests/test/bin/lb.bin rename to cannon/mipsevm/tests/open_mips_tests/test/bin/lb.bin diff --git a/cannon/mipsevm/open_mips_tests/test/bin/lbu.bin b/cannon/mipsevm/tests/open_mips_tests/test/bin/lbu.bin similarity index 100% rename from cannon/mipsevm/open_mips_tests/test/bin/lbu.bin rename to cannon/mipsevm/tests/open_mips_tests/test/bin/lbu.bin diff --git a/cannon/mipsevm/open_mips_tests/test/bin/lh.bin b/cannon/mipsevm/tests/open_mips_tests/test/bin/lh.bin similarity index 100% rename from cannon/mipsevm/open_mips_tests/test/bin/lh.bin rename to cannon/mipsevm/tests/open_mips_tests/test/bin/lh.bin diff --git a/cannon/mipsevm/open_mips_tests/test/bin/lhu.bin b/cannon/mipsevm/tests/open_mips_tests/test/bin/lhu.bin similarity index 100% rename from cannon/mipsevm/open_mips_tests/test/bin/lhu.bin rename to cannon/mipsevm/tests/open_mips_tests/test/bin/lhu.bin diff --git a/cannon/mipsevm/open_mips_tests/test/bin/lui.bin b/cannon/mipsevm/tests/open_mips_tests/test/bin/lui.bin similarity index 100% rename from cannon/mipsevm/open_mips_tests/test/bin/lui.bin rename to cannon/mipsevm/tests/open_mips_tests/test/bin/lui.bin diff --git a/cannon/mipsevm/open_mips_tests/test/bin/lw.bin b/cannon/mipsevm/tests/open_mips_tests/test/bin/lw.bin similarity index 100% rename from cannon/mipsevm/open_mips_tests/test/bin/lw.bin rename to cannon/mipsevm/tests/open_mips_tests/test/bin/lw.bin diff --git a/cannon/mipsevm/open_mips_tests/test/bin/lwl.bin b/cannon/mipsevm/tests/open_mips_tests/test/bin/lwl.bin similarity index 100% rename from cannon/mipsevm/open_mips_tests/test/bin/lwl.bin rename to cannon/mipsevm/tests/open_mips_tests/test/bin/lwl.bin diff --git a/cannon/mipsevm/open_mips_tests/test/bin/lwr.bin b/cannon/mipsevm/tests/open_mips_tests/test/bin/lwr.bin similarity index 100% rename from cannon/mipsevm/open_mips_tests/test/bin/lwr.bin rename to cannon/mipsevm/tests/open_mips_tests/test/bin/lwr.bin diff --git a/cannon/mipsevm/open_mips_tests/test/bin/mfthi.bin b/cannon/mipsevm/tests/open_mips_tests/test/bin/mfthi.bin similarity index 100% rename from cannon/mipsevm/open_mips_tests/test/bin/mfthi.bin rename to cannon/mipsevm/tests/open_mips_tests/test/bin/mfthi.bin diff --git a/cannon/mipsevm/open_mips_tests/test/bin/mftlo.bin b/cannon/mipsevm/tests/open_mips_tests/test/bin/mftlo.bin similarity index 100% rename from cannon/mipsevm/open_mips_tests/test/bin/mftlo.bin rename to cannon/mipsevm/tests/open_mips_tests/test/bin/mftlo.bin diff --git a/cannon/mipsevm/open_mips_tests/test/bin/mmap.bin b/cannon/mipsevm/tests/open_mips_tests/test/bin/mmap.bin similarity index 100% rename from cannon/mipsevm/open_mips_tests/test/bin/mmap.bin rename to cannon/mipsevm/tests/open_mips_tests/test/bin/mmap.bin diff --git a/cannon/mipsevm/open_mips_tests/test/bin/movn.bin b/cannon/mipsevm/tests/open_mips_tests/test/bin/movn.bin similarity index 100% rename from cannon/mipsevm/open_mips_tests/test/bin/movn.bin rename to cannon/mipsevm/tests/open_mips_tests/test/bin/movn.bin diff --git a/cannon/mipsevm/open_mips_tests/test/bin/movz.bin b/cannon/mipsevm/tests/open_mips_tests/test/bin/movz.bin similarity index 100% rename from cannon/mipsevm/open_mips_tests/test/bin/movz.bin rename to cannon/mipsevm/tests/open_mips_tests/test/bin/movz.bin diff --git a/cannon/mipsevm/open_mips_tests/test/bin/mul.bin b/cannon/mipsevm/tests/open_mips_tests/test/bin/mul.bin similarity index 100% rename from cannon/mipsevm/open_mips_tests/test/bin/mul.bin rename to cannon/mipsevm/tests/open_mips_tests/test/bin/mul.bin diff --git a/cannon/mipsevm/open_mips_tests/test/bin/mult.bin b/cannon/mipsevm/tests/open_mips_tests/test/bin/mult.bin similarity index 100% rename from cannon/mipsevm/open_mips_tests/test/bin/mult.bin rename to cannon/mipsevm/tests/open_mips_tests/test/bin/mult.bin diff --git a/cannon/mipsevm/open_mips_tests/test/bin/multu.bin b/cannon/mipsevm/tests/open_mips_tests/test/bin/multu.bin similarity index 100% rename from cannon/mipsevm/open_mips_tests/test/bin/multu.bin rename to cannon/mipsevm/tests/open_mips_tests/test/bin/multu.bin diff --git a/cannon/mipsevm/open_mips_tests/test/bin/nor.bin b/cannon/mipsevm/tests/open_mips_tests/test/bin/nor.bin similarity index 100% rename from cannon/mipsevm/open_mips_tests/test/bin/nor.bin rename to cannon/mipsevm/tests/open_mips_tests/test/bin/nor.bin diff --git a/cannon/mipsevm/open_mips_tests/test/bin/oracle.bin b/cannon/mipsevm/tests/open_mips_tests/test/bin/oracle.bin similarity index 100% rename from cannon/mipsevm/open_mips_tests/test/bin/oracle.bin rename to cannon/mipsevm/tests/open_mips_tests/test/bin/oracle.bin diff --git a/cannon/mipsevm/tests/open_mips_tests/test/bin/oracle_kzg.bin b/cannon/mipsevm/tests/open_mips_tests/test/bin/oracle_kzg.bin new file mode 100644 index 000000000000..ba8f0a95fb85 Binary files /dev/null and b/cannon/mipsevm/tests/open_mips_tests/test/bin/oracle_kzg.bin differ diff --git a/cannon/mipsevm/open_mips_tests/test/bin/oracle_unaligned_read.bin b/cannon/mipsevm/tests/open_mips_tests/test/bin/oracle_unaligned_read.bin similarity index 100% rename from cannon/mipsevm/open_mips_tests/test/bin/oracle_unaligned_read.bin rename to cannon/mipsevm/tests/open_mips_tests/test/bin/oracle_unaligned_read.bin diff --git a/cannon/mipsevm/open_mips_tests/test/bin/oracle_unaligned_write.bin b/cannon/mipsevm/tests/open_mips_tests/test/bin/oracle_unaligned_write.bin similarity index 100% rename from cannon/mipsevm/open_mips_tests/test/bin/oracle_unaligned_write.bin rename to cannon/mipsevm/tests/open_mips_tests/test/bin/oracle_unaligned_write.bin diff --git a/cannon/mipsevm/open_mips_tests/test/bin/ori.bin b/cannon/mipsevm/tests/open_mips_tests/test/bin/ori.bin similarity index 100% rename from cannon/mipsevm/open_mips_tests/test/bin/ori.bin rename to cannon/mipsevm/tests/open_mips_tests/test/bin/ori.bin diff --git a/cannon/mipsevm/open_mips_tests/test/bin/sb.bin b/cannon/mipsevm/tests/open_mips_tests/test/bin/sb.bin similarity index 100% rename from cannon/mipsevm/open_mips_tests/test/bin/sb.bin rename to cannon/mipsevm/tests/open_mips_tests/test/bin/sb.bin diff --git a/cannon/mipsevm/open_mips_tests/test/bin/sh.bin b/cannon/mipsevm/tests/open_mips_tests/test/bin/sh.bin similarity index 100% rename from cannon/mipsevm/open_mips_tests/test/bin/sh.bin rename to cannon/mipsevm/tests/open_mips_tests/test/bin/sh.bin diff --git a/cannon/mipsevm/open_mips_tests/test/bin/sll.bin b/cannon/mipsevm/tests/open_mips_tests/test/bin/sll.bin similarity index 100% rename from cannon/mipsevm/open_mips_tests/test/bin/sll.bin rename to cannon/mipsevm/tests/open_mips_tests/test/bin/sll.bin diff --git a/cannon/mipsevm/open_mips_tests/test/bin/sllv.bin b/cannon/mipsevm/tests/open_mips_tests/test/bin/sllv.bin similarity index 100% rename from cannon/mipsevm/open_mips_tests/test/bin/sllv.bin rename to cannon/mipsevm/tests/open_mips_tests/test/bin/sllv.bin diff --git a/cannon/mipsevm/open_mips_tests/test/bin/slt.bin b/cannon/mipsevm/tests/open_mips_tests/test/bin/slt.bin similarity index 100% rename from cannon/mipsevm/open_mips_tests/test/bin/slt.bin rename to cannon/mipsevm/tests/open_mips_tests/test/bin/slt.bin diff --git a/cannon/mipsevm/open_mips_tests/test/bin/slti.bin b/cannon/mipsevm/tests/open_mips_tests/test/bin/slti.bin similarity index 100% rename from cannon/mipsevm/open_mips_tests/test/bin/slti.bin rename to cannon/mipsevm/tests/open_mips_tests/test/bin/slti.bin diff --git a/cannon/mipsevm/open_mips_tests/test/bin/sltiu.bin b/cannon/mipsevm/tests/open_mips_tests/test/bin/sltiu.bin similarity index 100% rename from cannon/mipsevm/open_mips_tests/test/bin/sltiu.bin rename to cannon/mipsevm/tests/open_mips_tests/test/bin/sltiu.bin diff --git a/cannon/mipsevm/open_mips_tests/test/bin/sltu.bin b/cannon/mipsevm/tests/open_mips_tests/test/bin/sltu.bin similarity index 100% rename from cannon/mipsevm/open_mips_tests/test/bin/sltu.bin rename to cannon/mipsevm/tests/open_mips_tests/test/bin/sltu.bin diff --git a/cannon/mipsevm/open_mips_tests/test/bin/sra.bin b/cannon/mipsevm/tests/open_mips_tests/test/bin/sra.bin similarity index 100% rename from cannon/mipsevm/open_mips_tests/test/bin/sra.bin rename to cannon/mipsevm/tests/open_mips_tests/test/bin/sra.bin diff --git a/cannon/mipsevm/open_mips_tests/test/bin/srav.bin b/cannon/mipsevm/tests/open_mips_tests/test/bin/srav.bin similarity index 100% rename from cannon/mipsevm/open_mips_tests/test/bin/srav.bin rename to cannon/mipsevm/tests/open_mips_tests/test/bin/srav.bin diff --git a/cannon/mipsevm/tests/open_mips_tests/test/bin/srav_large.bin b/cannon/mipsevm/tests/open_mips_tests/test/bin/srav_large.bin new file mode 100644 index 000000000000..f2fc0e5d495f Binary files /dev/null and b/cannon/mipsevm/tests/open_mips_tests/test/bin/srav_large.bin differ diff --git a/cannon/mipsevm/open_mips_tests/test/bin/srl.bin b/cannon/mipsevm/tests/open_mips_tests/test/bin/srl.bin similarity index 100% rename from cannon/mipsevm/open_mips_tests/test/bin/srl.bin rename to cannon/mipsevm/tests/open_mips_tests/test/bin/srl.bin diff --git a/cannon/mipsevm/open_mips_tests/test/bin/srlv.bin b/cannon/mipsevm/tests/open_mips_tests/test/bin/srlv.bin similarity index 100% rename from cannon/mipsevm/open_mips_tests/test/bin/srlv.bin rename to cannon/mipsevm/tests/open_mips_tests/test/bin/srlv.bin diff --git a/cannon/mipsevm/open_mips_tests/test/bin/sub.bin b/cannon/mipsevm/tests/open_mips_tests/test/bin/sub.bin similarity index 100% rename from cannon/mipsevm/open_mips_tests/test/bin/sub.bin rename to cannon/mipsevm/tests/open_mips_tests/test/bin/sub.bin diff --git a/cannon/mipsevm/open_mips_tests/test/bin/subu.bin b/cannon/mipsevm/tests/open_mips_tests/test/bin/subu.bin similarity index 100% rename from cannon/mipsevm/open_mips_tests/test/bin/subu.bin rename to cannon/mipsevm/tests/open_mips_tests/test/bin/subu.bin diff --git a/cannon/mipsevm/open_mips_tests/test/bin/swl.bin b/cannon/mipsevm/tests/open_mips_tests/test/bin/swl.bin similarity index 100% rename from cannon/mipsevm/open_mips_tests/test/bin/swl.bin rename to cannon/mipsevm/tests/open_mips_tests/test/bin/swl.bin diff --git a/cannon/mipsevm/open_mips_tests/test/bin/swr.bin b/cannon/mipsevm/tests/open_mips_tests/test/bin/swr.bin similarity index 100% rename from cannon/mipsevm/open_mips_tests/test/bin/swr.bin rename to cannon/mipsevm/tests/open_mips_tests/test/bin/swr.bin diff --git a/cannon/mipsevm/open_mips_tests/test/bin/xor.bin b/cannon/mipsevm/tests/open_mips_tests/test/bin/xor.bin similarity index 100% rename from cannon/mipsevm/open_mips_tests/test/bin/xor.bin rename to cannon/mipsevm/tests/open_mips_tests/test/bin/xor.bin diff --git a/cannon/mipsevm/open_mips_tests/test/bin/xori.bin b/cannon/mipsevm/tests/open_mips_tests/test/bin/xori.bin similarity index 100% rename from cannon/mipsevm/open_mips_tests/test/bin/xori.bin rename to cannon/mipsevm/tests/open_mips_tests/test/bin/xori.bin diff --git a/cannon/mipsevm/open_mips_tests/test/blez.asm b/cannon/mipsevm/tests/open_mips_tests/test/blez.asm similarity index 100% rename from cannon/mipsevm/open_mips_tests/test/blez.asm rename to cannon/mipsevm/tests/open_mips_tests/test/blez.asm diff --git a/cannon/mipsevm/open_mips_tests/test/bltz.asm b/cannon/mipsevm/tests/open_mips_tests/test/bltz.asm similarity index 100% rename from cannon/mipsevm/open_mips_tests/test/bltz.asm rename to cannon/mipsevm/tests/open_mips_tests/test/bltz.asm diff --git a/cannon/mipsevm/open_mips_tests/test/bne.asm b/cannon/mipsevm/tests/open_mips_tests/test/bne.asm similarity index 100% rename from cannon/mipsevm/open_mips_tests/test/bne.asm rename to cannon/mipsevm/tests/open_mips_tests/test/bne.asm diff --git a/cannon/mipsevm/open_mips_tests/test/brk.asm b/cannon/mipsevm/tests/open_mips_tests/test/brk.asm similarity index 100% rename from cannon/mipsevm/open_mips_tests/test/brk.asm rename to cannon/mipsevm/tests/open_mips_tests/test/brk.asm diff --git a/cannon/mipsevm/open_mips_tests/test/clo.asm b/cannon/mipsevm/tests/open_mips_tests/test/clo.asm similarity index 100% rename from cannon/mipsevm/open_mips_tests/test/clo.asm rename to cannon/mipsevm/tests/open_mips_tests/test/clo.asm diff --git a/cannon/mipsevm/open_mips_tests/test/clone.asm b/cannon/mipsevm/tests/open_mips_tests/test/clone.asm similarity index 100% rename from cannon/mipsevm/open_mips_tests/test/clone.asm rename to cannon/mipsevm/tests/open_mips_tests/test/clone.asm diff --git a/cannon/mipsevm/open_mips_tests/test/clz.asm b/cannon/mipsevm/tests/open_mips_tests/test/clz.asm similarity index 100% rename from cannon/mipsevm/open_mips_tests/test/clz.asm rename to cannon/mipsevm/tests/open_mips_tests/test/clz.asm diff --git a/cannon/mipsevm/open_mips_tests/test/div.asm b/cannon/mipsevm/tests/open_mips_tests/test/div.asm similarity index 100% rename from cannon/mipsevm/open_mips_tests/test/div.asm rename to cannon/mipsevm/tests/open_mips_tests/test/div.asm diff --git a/cannon/mipsevm/open_mips_tests/test/divu.asm b/cannon/mipsevm/tests/open_mips_tests/test/divu.asm similarity index 100% rename from cannon/mipsevm/open_mips_tests/test/divu.asm rename to cannon/mipsevm/tests/open_mips_tests/test/divu.asm diff --git a/cannon/mipsevm/open_mips_tests/test/exit_group.asm b/cannon/mipsevm/tests/open_mips_tests/test/exit_group.asm similarity index 100% rename from cannon/mipsevm/open_mips_tests/test/exit_group.asm rename to cannon/mipsevm/tests/open_mips_tests/test/exit_group.asm diff --git a/cannon/mipsevm/open_mips_tests/test/fcntl.asm b/cannon/mipsevm/tests/open_mips_tests/test/fcntl.asm similarity index 96% rename from cannon/mipsevm/open_mips_tests/test/fcntl.asm rename to cannon/mipsevm/tests/open_mips_tests/test/fcntl.asm index 451e90a11788..5f597bbe0c43 100644 --- a/cannon/mipsevm/open_mips_tests/test/fcntl.asm +++ b/cannon/mipsevm/tests/open_mips_tests/test/fcntl.asm @@ -5,7 +5,7 @@ .ent test test: - # fnctl(0, 3) + # fcntl(0, 3) li $v0, 4055 li $a0, 0x0 li $a1, 0x3 diff --git a/cannon/mipsevm/open_mips_tests/test/j.asm b/cannon/mipsevm/tests/open_mips_tests/test/j.asm similarity index 100% rename from cannon/mipsevm/open_mips_tests/test/j.asm rename to cannon/mipsevm/tests/open_mips_tests/test/j.asm diff --git a/cannon/mipsevm/open_mips_tests/test/jal.asm b/cannon/mipsevm/tests/open_mips_tests/test/jal.asm similarity index 100% rename from cannon/mipsevm/open_mips_tests/test/jal.asm rename to cannon/mipsevm/tests/open_mips_tests/test/jal.asm diff --git a/cannon/mipsevm/open_mips_tests/test/jalr.asm b/cannon/mipsevm/tests/open_mips_tests/test/jalr.asm similarity index 100% rename from cannon/mipsevm/open_mips_tests/test/jalr.asm rename to cannon/mipsevm/tests/open_mips_tests/test/jalr.asm diff --git a/cannon/mipsevm/open_mips_tests/test/jr.asm b/cannon/mipsevm/tests/open_mips_tests/test/jr.asm similarity index 100% rename from cannon/mipsevm/open_mips_tests/test/jr.asm rename to cannon/mipsevm/tests/open_mips_tests/test/jr.asm diff --git a/cannon/mipsevm/open_mips_tests/test/lb.asm b/cannon/mipsevm/tests/open_mips_tests/test/lb.asm similarity index 100% rename from cannon/mipsevm/open_mips_tests/test/lb.asm rename to cannon/mipsevm/tests/open_mips_tests/test/lb.asm diff --git a/cannon/mipsevm/open_mips_tests/test/lbu.asm b/cannon/mipsevm/tests/open_mips_tests/test/lbu.asm similarity index 100% rename from cannon/mipsevm/open_mips_tests/test/lbu.asm rename to cannon/mipsevm/tests/open_mips_tests/test/lbu.asm diff --git a/cannon/mipsevm/open_mips_tests/test/lh.asm b/cannon/mipsevm/tests/open_mips_tests/test/lh.asm similarity index 100% rename from cannon/mipsevm/open_mips_tests/test/lh.asm rename to cannon/mipsevm/tests/open_mips_tests/test/lh.asm diff --git a/cannon/mipsevm/open_mips_tests/test/lhu.asm b/cannon/mipsevm/tests/open_mips_tests/test/lhu.asm similarity index 100% rename from cannon/mipsevm/open_mips_tests/test/lhu.asm rename to cannon/mipsevm/tests/open_mips_tests/test/lhu.asm diff --git a/cannon/mipsevm/open_mips_tests/test/lui.asm b/cannon/mipsevm/tests/open_mips_tests/test/lui.asm similarity index 100% rename from cannon/mipsevm/open_mips_tests/test/lui.asm rename to cannon/mipsevm/tests/open_mips_tests/test/lui.asm diff --git a/cannon/mipsevm/open_mips_tests/test/lw.asm b/cannon/mipsevm/tests/open_mips_tests/test/lw.asm similarity index 100% rename from cannon/mipsevm/open_mips_tests/test/lw.asm rename to cannon/mipsevm/tests/open_mips_tests/test/lw.asm diff --git a/cannon/mipsevm/open_mips_tests/test/lwl.asm b/cannon/mipsevm/tests/open_mips_tests/test/lwl.asm similarity index 100% rename from cannon/mipsevm/open_mips_tests/test/lwl.asm rename to cannon/mipsevm/tests/open_mips_tests/test/lwl.asm diff --git a/cannon/mipsevm/open_mips_tests/test/lwr.asm b/cannon/mipsevm/tests/open_mips_tests/test/lwr.asm similarity index 100% rename from cannon/mipsevm/open_mips_tests/test/lwr.asm rename to cannon/mipsevm/tests/open_mips_tests/test/lwr.asm diff --git a/cannon/mipsevm/open_mips_tests/test/mfthi.asm b/cannon/mipsevm/tests/open_mips_tests/test/mfthi.asm similarity index 100% rename from cannon/mipsevm/open_mips_tests/test/mfthi.asm rename to cannon/mipsevm/tests/open_mips_tests/test/mfthi.asm diff --git a/cannon/mipsevm/open_mips_tests/test/mftlo.asm b/cannon/mipsevm/tests/open_mips_tests/test/mftlo.asm similarity index 100% rename from cannon/mipsevm/open_mips_tests/test/mftlo.asm rename to cannon/mipsevm/tests/open_mips_tests/test/mftlo.asm diff --git a/cannon/mipsevm/open_mips_tests/test/mmap.asm b/cannon/mipsevm/tests/open_mips_tests/test/mmap.asm similarity index 100% rename from cannon/mipsevm/open_mips_tests/test/mmap.asm rename to cannon/mipsevm/tests/open_mips_tests/test/mmap.asm diff --git a/cannon/mipsevm/open_mips_tests/test/movn.asm b/cannon/mipsevm/tests/open_mips_tests/test/movn.asm similarity index 100% rename from cannon/mipsevm/open_mips_tests/test/movn.asm rename to cannon/mipsevm/tests/open_mips_tests/test/movn.asm diff --git a/cannon/mipsevm/open_mips_tests/test/movz.asm b/cannon/mipsevm/tests/open_mips_tests/test/movz.asm similarity index 100% rename from cannon/mipsevm/open_mips_tests/test/movz.asm rename to cannon/mipsevm/tests/open_mips_tests/test/movz.asm diff --git a/cannon/mipsevm/open_mips_tests/test/mul.asm b/cannon/mipsevm/tests/open_mips_tests/test/mul.asm similarity index 100% rename from cannon/mipsevm/open_mips_tests/test/mul.asm rename to cannon/mipsevm/tests/open_mips_tests/test/mul.asm diff --git a/cannon/mipsevm/open_mips_tests/test/mult.asm b/cannon/mipsevm/tests/open_mips_tests/test/mult.asm similarity index 100% rename from cannon/mipsevm/open_mips_tests/test/mult.asm rename to cannon/mipsevm/tests/open_mips_tests/test/mult.asm diff --git a/cannon/mipsevm/open_mips_tests/test/multu.asm b/cannon/mipsevm/tests/open_mips_tests/test/multu.asm similarity index 100% rename from cannon/mipsevm/open_mips_tests/test/multu.asm rename to cannon/mipsevm/tests/open_mips_tests/test/multu.asm diff --git a/cannon/mipsevm/open_mips_tests/test/nor.asm b/cannon/mipsevm/tests/open_mips_tests/test/nor.asm similarity index 100% rename from cannon/mipsevm/open_mips_tests/test/nor.asm rename to cannon/mipsevm/tests/open_mips_tests/test/nor.asm diff --git a/cannon/mipsevm/open_mips_tests/test/oracle.asm b/cannon/mipsevm/tests/open_mips_tests/test/oracle.asm similarity index 100% rename from cannon/mipsevm/open_mips_tests/test/oracle.asm rename to cannon/mipsevm/tests/open_mips_tests/test/oracle.asm diff --git a/cannon/mipsevm/tests/open_mips_tests/test/oracle_kzg.asm b/cannon/mipsevm/tests/open_mips_tests/test/oracle_kzg.asm new file mode 100644 index 000000000000..4eef60a1179f --- /dev/null +++ b/cannon/mipsevm/tests/open_mips_tests/test/oracle_kzg.asm @@ -0,0 +1,103 @@ +.section .test, "x" + .balign 4 + .set noreorder + .global test + .ent test + +# load hash at 0x30001000 +# requiredGas is 50_000 +# point evaluation precompile input (requiredGas ++ precompileInput) - 000000000000c35001e798154708fe7789429634053cbf9f99b619f9f084048927333fce637f549b564c0a11a0f704f4fc3e8acfe0f8245f0ad1347b378fbf96e206da11a5d3630624d25032e67a7e6a4910df5834b8fe70e6bcfeeac0352434196bdf4b2485d5a18f59a8d2a1a625a17f3fea0fe5eb8c896db3764f3185481bc22f91b4aaffcca25f26936857bc3a7c2539ea8ec3a952b7873033e038326e87ed3e1276fd140253fa08e9fc25fb2d9a98527fc22a2c9612fbeafdad446cbc7bcdbdcd780af2c16a +# 0x3efd5c3c 1c555298 0c63aee5 4570c276 cbff7532 796b4d75 3132d51a 6bedf0c6 = keccak(address(0xa) ++ required_gas ++ precompile_input) +# 0x06fd5c3c 1c555298 0c63aee5 4570c276 cbff7532 796b4d75 3132d51a 6bedf0c6 = keccak(address(0xa) ++ required_gas ++ precompile_input).key (precompile) +test: + lui $s0, 0x3000 + ori $s0, 0x1000 + + lui $t0, 0x06fd + ori $t0, 0x5c3c + sw $t0, 0($s0) + lui $t0, 0x1c55 + ori $t0, 0x5298 + sw $t0, 4($s0) + lui $t0, 0x0c63 + ori $t0, 0xaee5 + sw $t0, 8($s0) + lui $t0, 0x4570 + ori $t0, 0xc276 + sw $t0, 0xc($s0) + lui $t0, 0xcbff + ori $t0, 0x7532 + sw $t0, 0x10($s0) + lui $t0, 0x796b + ori $t0, 0x4d75 + sw $t0, 0x14($s0) + lui $t0, 0x3132 + ori $t0, 0xd51a + sw $t0, 0x18($s0) + lui $t0, 0x6bed + ori $t0, 0xf0c6 + sw $t0, 0x1c($s0) + +# preimage request - write(fdPreimageWrite, preimageData, 32) + li $a0, 6 + li $a1, 0x30001000 + li $t0, 8 + li $a2, 4 +$writeloop: + li $v0, 4004 + syscall + addiu $a1, $a1, 4 + addiu $t0, $t0, -1 + bnez $t0, $writeloop + nop + +# preimage response to 0x30002000 - read(fdPreimageRead, addr, count) +# read preimage length + li $a0, 5 + li $a1, 0x31000000 + li $a2, 4 + li $v0, 4003 + syscall + li $a1, 0x31000004 + li $v0, 4003 + syscall +# read the 1 byte precompile status and 3 bytes of return data + li $a1, 0x31000008 + li $v0, 4003 + syscall + nop + +# length at 0x31000000. We also check that the lower 32 bits are zero + lui $s1, 0x3100 + lw $t0, 0($s1) + sltiu $t6, $t0, 1 + li $s1, 0x31000004 + lw $t0, 0($s1) +# should be 1 + len(blobPrecompileReturnValue) = 65 + li $t4, 65 + subu $t5, $t0, $t4 + sltiu $v0, $t5, 1 + and $v0, $v0, $t6 + +# data at 0x31000008 +# first byte is 01 status. Next 3 bytes are 0 + lw $t0, 4($s1) + lui $t4, 0x0100 + ori $t4, 0x0000 + subu $t5, $t0, $t4 + sltiu $v1, $t5, 1 + and $v0, $v0, $v1 + +# save results + lui $s0, 0xbfff # Load the base address 0xbffffff0 + ori $s0, 0xfff0 + ori $s1, $0, 1 # Prepare the 'done' status + + sw $v0, 8($s0) # Set the test result + sw $s1, 4($s0) # Set 'done' + +$done: + jr $ra + nop + + .end test diff --git a/cannon/mipsevm/open_mips_tests/test/oracle_unaligned_read.asm b/cannon/mipsevm/tests/open_mips_tests/test/oracle_unaligned_read.asm similarity index 100% rename from cannon/mipsevm/open_mips_tests/test/oracle_unaligned_read.asm rename to cannon/mipsevm/tests/open_mips_tests/test/oracle_unaligned_read.asm diff --git a/cannon/mipsevm/open_mips_tests/test/oracle_unaligned_write.asm b/cannon/mipsevm/tests/open_mips_tests/test/oracle_unaligned_write.asm similarity index 100% rename from cannon/mipsevm/open_mips_tests/test/oracle_unaligned_write.asm rename to cannon/mipsevm/tests/open_mips_tests/test/oracle_unaligned_write.asm diff --git a/cannon/mipsevm/open_mips_tests/test/ori.asm b/cannon/mipsevm/tests/open_mips_tests/test/ori.asm similarity index 100% rename from cannon/mipsevm/open_mips_tests/test/ori.asm rename to cannon/mipsevm/tests/open_mips_tests/test/ori.asm diff --git a/cannon/mipsevm/open_mips_tests/test/sb.asm b/cannon/mipsevm/tests/open_mips_tests/test/sb.asm similarity index 100% rename from cannon/mipsevm/open_mips_tests/test/sb.asm rename to cannon/mipsevm/tests/open_mips_tests/test/sb.asm diff --git a/cannon/mipsevm/open_mips_tests/test/sh.asm b/cannon/mipsevm/tests/open_mips_tests/test/sh.asm similarity index 100% rename from cannon/mipsevm/open_mips_tests/test/sh.asm rename to cannon/mipsevm/tests/open_mips_tests/test/sh.asm diff --git a/cannon/mipsevm/open_mips_tests/test/sll.asm b/cannon/mipsevm/tests/open_mips_tests/test/sll.asm similarity index 100% rename from cannon/mipsevm/open_mips_tests/test/sll.asm rename to cannon/mipsevm/tests/open_mips_tests/test/sll.asm diff --git a/cannon/mipsevm/open_mips_tests/test/sllv.asm b/cannon/mipsevm/tests/open_mips_tests/test/sllv.asm similarity index 100% rename from cannon/mipsevm/open_mips_tests/test/sllv.asm rename to cannon/mipsevm/tests/open_mips_tests/test/sllv.asm diff --git a/cannon/mipsevm/open_mips_tests/test/slt.asm b/cannon/mipsevm/tests/open_mips_tests/test/slt.asm similarity index 100% rename from cannon/mipsevm/open_mips_tests/test/slt.asm rename to cannon/mipsevm/tests/open_mips_tests/test/slt.asm diff --git a/cannon/mipsevm/open_mips_tests/test/slti.asm b/cannon/mipsevm/tests/open_mips_tests/test/slti.asm similarity index 100% rename from cannon/mipsevm/open_mips_tests/test/slti.asm rename to cannon/mipsevm/tests/open_mips_tests/test/slti.asm diff --git a/cannon/mipsevm/open_mips_tests/test/sltiu.asm b/cannon/mipsevm/tests/open_mips_tests/test/sltiu.asm similarity index 100% rename from cannon/mipsevm/open_mips_tests/test/sltiu.asm rename to cannon/mipsevm/tests/open_mips_tests/test/sltiu.asm diff --git a/cannon/mipsevm/open_mips_tests/test/sltu.asm b/cannon/mipsevm/tests/open_mips_tests/test/sltu.asm similarity index 100% rename from cannon/mipsevm/open_mips_tests/test/sltu.asm rename to cannon/mipsevm/tests/open_mips_tests/test/sltu.asm diff --git a/cannon/mipsevm/open_mips_tests/test/sra.asm b/cannon/mipsevm/tests/open_mips_tests/test/sra.asm similarity index 100% rename from cannon/mipsevm/open_mips_tests/test/sra.asm rename to cannon/mipsevm/tests/open_mips_tests/test/sra.asm diff --git a/cannon/mipsevm/open_mips_tests/test/srav.asm b/cannon/mipsevm/tests/open_mips_tests/test/srav.asm similarity index 100% rename from cannon/mipsevm/open_mips_tests/test/srav.asm rename to cannon/mipsevm/tests/open_mips_tests/test/srav.asm diff --git a/cannon/mipsevm/tests/open_mips_tests/test/srav_large.asm b/cannon/mipsevm/tests/open_mips_tests/test/srav_large.asm new file mode 100644 index 000000000000..39057ac052e1 --- /dev/null +++ b/cannon/mipsevm/tests/open_mips_tests/test/srav_large.asm @@ -0,0 +1,39 @@ +############################################################################### +# Description: +# Tests that the 'srav' instruction properly only utilizes the lower 5 bits +# of the rs register rather than using the entire 32 bits. +# +############################################################################### + + + .section .test, "x" + .balign 4 + .set noreorder + .global test + .ent test +test: + lui $s0, 0xbfff # Load the base address 0xbffffff0 + ori $s0, 0xfff0 + ori $s1, $0, 1 # Prepare the 'done' status + + #### Test code start #### + + lui $t0, 0xdeaf # A = 0xdeafbeef + ori $t0, 0xbeef + ori $t1, $0, 0x2c + srav $t2, $t0, $t1 # B = 0xdeafbeef >> (0x2c & 0x1f) = 0xdeadbeef >> 12 = 0xfffdeafb + lui $t3, 0xfffd + ori $t3, 0xeafb + subu $t4, $t2, $t3 + sltiu $v0, $t4, 1 + + #### Test code end #### + + sw $v0, 8($s0) # Set the test result + sw $s1, 4($s0) # Set 'done' + +$done: + jr $ra + nop + + .end test diff --git a/cannon/mipsevm/open_mips_tests/test/srl.asm b/cannon/mipsevm/tests/open_mips_tests/test/srl.asm similarity index 100% rename from cannon/mipsevm/open_mips_tests/test/srl.asm rename to cannon/mipsevm/tests/open_mips_tests/test/srl.asm diff --git a/cannon/mipsevm/open_mips_tests/test/srlv.asm b/cannon/mipsevm/tests/open_mips_tests/test/srlv.asm similarity index 100% rename from cannon/mipsevm/open_mips_tests/test/srlv.asm rename to cannon/mipsevm/tests/open_mips_tests/test/srlv.asm diff --git a/cannon/mipsevm/open_mips_tests/test/sub.asm b/cannon/mipsevm/tests/open_mips_tests/test/sub.asm similarity index 100% rename from cannon/mipsevm/open_mips_tests/test/sub.asm rename to cannon/mipsevm/tests/open_mips_tests/test/sub.asm diff --git a/cannon/mipsevm/open_mips_tests/test/subu.asm b/cannon/mipsevm/tests/open_mips_tests/test/subu.asm similarity index 100% rename from cannon/mipsevm/open_mips_tests/test/subu.asm rename to cannon/mipsevm/tests/open_mips_tests/test/subu.asm diff --git a/cannon/mipsevm/open_mips_tests/test/swl.asm b/cannon/mipsevm/tests/open_mips_tests/test/swl.asm similarity index 100% rename from cannon/mipsevm/open_mips_tests/test/swl.asm rename to cannon/mipsevm/tests/open_mips_tests/test/swl.asm diff --git a/cannon/mipsevm/open_mips_tests/test/swr.asm b/cannon/mipsevm/tests/open_mips_tests/test/swr.asm similarity index 100% rename from cannon/mipsevm/open_mips_tests/test/swr.asm rename to cannon/mipsevm/tests/open_mips_tests/test/swr.asm diff --git a/cannon/mipsevm/open_mips_tests/test/xor.asm b/cannon/mipsevm/tests/open_mips_tests/test/xor.asm similarity index 100% rename from cannon/mipsevm/open_mips_tests/test/xor.asm rename to cannon/mipsevm/tests/open_mips_tests/test/xor.asm diff --git a/cannon/mipsevm/open_mips_tests/test/xori.asm b/cannon/mipsevm/tests/open_mips_tests/test/xori.asm similarity index 100% rename from cannon/mipsevm/open_mips_tests/test/xori.asm rename to cannon/mipsevm/tests/open_mips_tests/test/xori.asm diff --git a/cannon/mipsevm/testutil/constants.go b/cannon/mipsevm/testutil/constants.go new file mode 100644 index 000000000000..1575799b4d4a --- /dev/null +++ b/cannon/mipsevm/testutil/constants.go @@ -0,0 +1,14 @@ +package testutil + +// 0xbf_c0_00_00 ... BaseAddrEnd is used in tests to write the results to +const BaseAddrEnd = 0xbf_ff_ff_f0 + +// EndAddr is used as return-address for tests +const EndAddr = 0xa7ef00d0 + +type MipsVersion int + +const ( + MipsSingleThreaded MipsVersion = iota + MipsMultithreaded +) diff --git a/cannon/mipsevm/testutil/elf.go b/cannon/mipsevm/testutil/elf.go new file mode 100644 index 000000000000..b5b63cdeb1d3 --- /dev/null +++ b/cannon/mipsevm/testutil/elf.go @@ -0,0 +1,28 @@ +package testutil + +import ( + "debug/elf" + + "github.com/stretchr/testify/require" + + "github.com/ethereum-optimism/optimism/cannon/mipsevm" + "github.com/ethereum-optimism/optimism/cannon/mipsevm/program" +) + +func LoadELFProgram[T mipsevm.FPVMState](t require.TestingT, name string, initState program.CreateInitialFPVMState[T], doPatchGoGC bool) (T, *program.Metadata) { + elfProgram, err := elf.Open(name) + require.NoError(t, err, "open ELF file") + meta, err := program.MakeMetadata(elfProgram) + require.NoError(t, err, "load metadata") + + state, err := program.LoadELF(elfProgram, initState) + require.NoError(t, err, "load ELF into state") + + if doPatchGoGC { + err = program.PatchGoGC(elfProgram, state) + require.NoError(t, err, "apply Go runtime patches") + } + + require.NoError(t, program.PatchStack(state), "add initial stack") + return state, meta +} diff --git a/cannon/mipsevm/testutil/evm.go b/cannon/mipsevm/testutil/evm.go new file mode 100644 index 000000000000..dbe9970fdc24 --- /dev/null +++ b/cannon/mipsevm/testutil/evm.go @@ -0,0 +1,181 @@ +package testutil + +import ( + "bytes" + "encoding/binary" + "fmt" + "math/big" + "os" + + "github.com/ethereum-optimism/optimism/op-chain-ops/srcmap" + "github.com/ethereum/go-ethereum/core/tracing" + "github.com/ethereum/go-ethereum/eth/tracers/logger" + "github.com/stretchr/testify/require" + + "github.com/ethereum-optimism/optimism/op-chain-ops/foundry" + + "github.com/ethereum/go-ethereum/common" + "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/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/params" +) + +type Artifacts struct { + MIPS *foundry.Artifact + Oracle *foundry.Artifact +} + +type Addresses struct { + MIPS common.Address + Oracle common.Address + Sender common.Address + FeeRecipient common.Address +} + +type ContractMetadata struct { + Artifacts *Artifacts + Addresses *Addresses +} + +func TestContractsSetup(t require.TestingT, version MipsVersion) *ContractMetadata { + artifacts, err := loadArtifacts(version) + require.NoError(t, err) + + addrs := &Addresses{ + MIPS: common.Address{0: 0xff, 19: 1}, + Oracle: common.Address{0: 0xff, 19: 2}, + Sender: common.Address{0x13, 0x37}, + FeeRecipient: common.Address{0xaa}, + } + + return &ContractMetadata{Artifacts: artifacts, Addresses: addrs} +} + +// loadArtifacts loads the Cannon contracts, from the contracts package. +func loadArtifacts(version MipsVersion) (*Artifacts, error) { + artifactFS := foundry.OpenArtifactsDir("../../../packages/contracts-bedrock/forge-artifacts") + var mips *foundry.Artifact + var err error + switch version { + case MipsSingleThreaded: + mips, err = artifactFS.ReadArtifact("MIPS.sol", "MIPS") + case MipsMultithreaded: + mips, err = artifactFS.ReadArtifact("MIPS2.sol", "MIPS2") + default: + return nil, fmt.Errorf("Unknown MipsVersion supplied: %v", version) + } + if err != nil { + return nil, err + } + + oracle, err := artifactFS.ReadArtifact("PreimageOracle.sol", "PreimageOracle") + if err != nil { + return nil, err + } + + return &Artifacts{ + MIPS: mips, + Oracle: oracle, + }, nil +} + +func NewEVMEnv(contracts *ContractMetadata) (*vm.EVM, *state.StateDB) { + // Temporary hack until Cancun is activated on mainnet + cpy := *params.MainnetChainConfig + chainCfg := &cpy // don't modify the global chain config + // Activate Cancun for EIP-4844 KZG point evaluation precompile + cancunActivation := *chainCfg.ShanghaiTime + 10 + chainCfg.CancunTime = &cancunActivation + offsetBlocks := uint64(1000) // blocks after cancun fork + bc := &testChain{startTime: *chainCfg.CancunTime + offsetBlocks*12} + header := bc.GetHeader(common.Hash{}, 17034870+offsetBlocks) + db := rawdb.NewMemoryDatabase() + statedb := state.NewDatabase(db) + state, err := state.New(types.EmptyRootHash, statedb, nil) + if err != nil { + panic(fmt.Errorf("failed to create memory state db: %w", err)) + } + blockContext := core.NewEVMBlockContext(header, bc, nil, chainCfg, state) + vmCfg := vm.Config{} + + env := vm.NewEVM(blockContext, vm.TxContext{}, state, chainCfg, vmCfg) + // pre-deploy the contracts + env.StateDB.SetCode(contracts.Addresses.Oracle, contracts.Artifacts.Oracle.DeployedBytecode.Object) + + var mipsCtorArgs [32]byte + copy(mipsCtorArgs[12:], contracts.Addresses.Oracle[:]) + mipsDeploy := append(bytes.Clone(contracts.Artifacts.MIPS.Bytecode.Object), mipsCtorArgs[:]...) + startingGas := uint64(30_000_000) + _, deployedMipsAddr, leftOverGas, err := env.Create(vm.AccountRef(contracts.Addresses.Sender), mipsDeploy, startingGas, common.U2560) + if err != nil { + panic(fmt.Errorf("failed to deploy MIPS contract: %w. took %d gas", err, startingGas-leftOverGas)) + } + contracts.Addresses.MIPS = deployedMipsAddr + + rules := env.ChainConfig().Rules(header.Number, true, header.Time) + env.StateDB.Prepare(rules, contracts.Addresses.Sender, contracts.Addresses.FeeRecipient, &contracts.Addresses.MIPS, vm.ActivePrecompiles(rules), nil) + return env, state +} + +type testChain struct { + startTime uint64 +} + +func (d *testChain) Engine() consensus.Engine { + return ethash.NewFullFaker() +} + +func (d *testChain) 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*12, + Extra: nil, + MixDigest: common.Hash{}, + Nonce: types.BlockNonce{}, + BaseFee: big.NewInt(7), + WithdrawalsHash: &types.EmptyWithdrawalsHash, + } +} + +func MarkdownTracer() *tracing.Hooks { + return logger.NewMarkdownLogger(&logger.Config{}, os.Stdout).Hooks() +} + +func SourceMapTracer(t require.TestingT, version MipsVersion, mips *foundry.Artifact, oracle *foundry.Artifact, addrs *Addresses) *tracing.Hooks { + srcFS := foundry.NewSourceMapFS(os.DirFS("../../../packages/contracts-bedrock")) + var mipsSrcMap *srcmap.SourceMap + var err error + switch version { + case MipsSingleThreaded: + mipsSrcMap, err = srcFS.SourceMap(mips, "MIPS") + case MipsMultithreaded: + mipsSrcMap, err = srcFS.SourceMap(mips, "MIPS2") + default: + require.Fail(t, "invalid mips version") + } + require.NoError(t, err) + oracleSrcMap, err := srcFS.SourceMap(oracle, "PreimageOracle") + require.NoError(t, err) + + return srcmap.NewSourceMapTracer(map[common.Address]*srcmap.SourceMap{ + addrs.MIPS: mipsSrcMap, + addrs.Oracle: oracleSrcMap, + }, os.Stdout).Hooks() +} diff --git a/cannon/mipsevm/testutil/log.go b/cannon/mipsevm/testutil/log.go new file mode 100644 index 000000000000..f913d528c31d --- /dev/null +++ b/cannon/mipsevm/testutil/log.go @@ -0,0 +1,11 @@ +package testutil + +import ( + "os" + + "github.com/ethereum/go-ethereum/log" +) + +func CreateLogger() log.Logger { + return log.NewLogger(log.LogfmtHandlerWithLevel(os.Stdout, log.LevelInfo)) +} diff --git a/cannon/mipsevm/testutil/mips.go b/cannon/mipsevm/testutil/mips.go new file mode 100644 index 000000000000..33ada41869d7 --- /dev/null +++ b/cannon/mipsevm/testutil/mips.go @@ -0,0 +1,209 @@ +package testutil + +import ( + "encoding/binary" + "errors" + "fmt" + "math" + "math/big" + "testing" + + "github.com/ethereum/go-ethereum/common" + "github.com/ethereum/go-ethereum/common/hexutil" + "github.com/ethereum/go-ethereum/core/state" + "github.com/ethereum/go-ethereum/core/tracing" + "github.com/ethereum/go-ethereum/core/vm" + "github.com/stretchr/testify/require" + + "github.com/ethereum-optimism/optimism/cannon/mipsevm" + "github.com/ethereum-optimism/optimism/op-chain-ops/foundry" + preimage "github.com/ethereum-optimism/optimism/op-preimage" +) + +type MIPSEVM struct { + sender vm.AccountRef + startingGas uint64 + env *vm.EVM + evmState *state.StateDB + addrs *Addresses + localOracle mipsevm.PreimageOracle + artifacts *Artifacts + // Track step execution for logging purposes + lastStep uint64 + lastStepInput []byte + lastPreimageOracleInput []byte +} + +func NewMIPSEVM(contracts *ContractMetadata) *MIPSEVM { + env, evmState := NewEVMEnv(contracts) + sender := vm.AccountRef{0x13, 0x37} + startingGas := uint64(30_000_000) + return &MIPSEVM{sender, startingGas, env, evmState, contracts.Addresses, nil, contracts.Artifacts, math.MaxUint64, nil, nil} +} + +func (m *MIPSEVM) SetTracer(tracer *tracing.Hooks) { + m.env.Config.Tracer = tracer +} + +func (m *MIPSEVM) SetLocalOracle(oracle mipsevm.PreimageOracle) { + m.localOracle = oracle +} + +func (m *MIPSEVM) SetSourceMapTracer(t *testing.T, version MipsVersion) { + m.env.Config.Tracer = SourceMapTracer(t, version, m.artifacts.MIPS, m.artifacts.Oracle, m.addrs) +} + +// Step is a pure function that computes the poststate from the VM state encoded in the StepWitness. +func (m *MIPSEVM) Step(t *testing.T, stepWitness *mipsevm.StepWitness, step uint64, stateHashFn mipsevm.HashFn) []byte { + m.lastStep = step + m.lastStepInput = nil + m.lastPreimageOracleInput = nil + + // we take a snapshot so we can clean up the state, and isolate the logs of this instruction run. + snap := m.env.StateDB.Snapshot() + + if stepWitness.HasPreimage() { + t.Logf("reading preimage key %x at offset %d", stepWitness.PreimageKey, stepWitness.PreimageOffset) + poInput, err := m.encodePreimageOracleInput(t, stepWitness.PreimageKey, stepWitness.PreimageValue, stepWitness.PreimageOffset, mipsevm.LocalContext{}) + m.lastPreimageOracleInput = poInput + require.NoError(t, err, "encode preimage oracle input") + _, leftOverGas, err := m.env.Call(m.sender, m.addrs.Oracle, poInput, m.startingGas, common.U2560) + require.NoErrorf(t, err, "evm should not fail, took %d gas", m.startingGas-leftOverGas) + } + + input := EncodeStepInput(t, stepWitness, mipsevm.LocalContext{}, m.artifacts.MIPS) + m.lastStepInput = input + ret, leftOverGas, err := m.env.Call(m.sender, m.addrs.MIPS, input, m.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 + postHash := common.Hash(*(*[32]byte)(ret)) + logs := m.evmState.Logs() + require.Equal(t, 1, len(logs), "expecting a log with post-state") + evmPost := logs[0].Data + + stateHash, err := stateHashFn(evmPost) + require.NoError(t, err, "state hash could not be computed") + require.Equal(t, stateHash, postHash, "logged state must be accurate") + + m.env.StateDB.RevertToSnapshot(snap) + t.Logf("EVM step %d took %d gas, and returned stateHash %s", step, m.startingGas-leftOverGas, postHash) + return evmPost +} + +func EncodeStepInput(t *testing.T, wit *mipsevm.StepWitness, localContext mipsevm.LocalContext, mips *foundry.Artifact) []byte { + input, err := mips.ABI.Pack("step", wit.State, wit.ProofData, localContext) + require.NoError(t, err) + return input +} + +func (m *MIPSEVM) encodePreimageOracleInput(t *testing.T, preimageKey [32]byte, preimageValue []byte, preimageOffset uint32, localContext mipsevm.LocalContext) ([]byte, error) { + if preimageKey == ([32]byte{}) { + return nil, errors.New("cannot encode pre-image oracle input, witness has no pre-image to proof") + } + localOracle := m.localOracle + oracle := m.artifacts.Oracle + + switch preimage.KeyType(preimageKey[0]) { + case preimage.LocalKeyType: + if len(preimageValue) > 32+8 { + return nil, fmt.Errorf("local pre-image exceeds maximum size of 32 bytes with key 0x%x", preimageKey) + } + preimagePart := preimageValue[8:] + var tmp [32]byte + copy(tmp[:], preimagePart) + input, err := oracle.ABI.Pack("loadLocalData", + new(big.Int).SetBytes(preimageKey[1:]), + localContext, + tmp, + new(big.Int).SetUint64(uint64(len(preimagePart))), + new(big.Int).SetUint64(uint64(preimageOffset)), + ) + require.NoError(t, err) + return input, nil + case preimage.Keccak256KeyType: + input, err := oracle.ABI.Pack( + "loadKeccak256PreimagePart", + new(big.Int).SetUint64(uint64(preimageOffset)), + preimageValue[8:]) + require.NoError(t, err) + return input, nil + case preimage.PrecompileKeyType: + if localOracle == nil { + return nil, errors.New("local oracle is required for precompile preimages") + } + preimage := localOracle.GetPreimage(preimage.Keccak256Key(preimageKey).PreimageKey()) + precompile := common.BytesToAddress(preimage[:20]) + requiredGas := binary.BigEndian.Uint64(preimage[20:28]) + callInput := preimage[28:] + input, err := oracle.ABI.Pack( + "loadPrecompilePreimagePart", + new(big.Int).SetUint64(uint64(preimageOffset)), + precompile, + requiredGas, + callInput, + ) + require.NoError(t, err) + return input, nil + default: + return nil, fmt.Errorf("unsupported pre-image type %d, cannot prepare preimage with key %x offset %d for oracle", + preimageKey[0], preimageKey, preimageOffset) + } +} + +func (m *MIPSEVM) assertPreimageOracleReverts(t *testing.T, preimageKey [32]byte, preimageValue []byte, preimageOffset uint32) { + poInput, err := m.encodePreimageOracleInput(t, preimageKey, preimageValue, preimageOffset, mipsevm.LocalContext{}) + require.NoError(t, err, "encode preimage oracle input") + _, _, evmErr := m.env.Call(m.sender, m.addrs.Oracle, poInput, m.startingGas, common.U2560) + + require.ErrorContains(t, evmErr, "execution reverted") +} + +func LogStepFailureAtCleanup(t *testing.T, mipsEvm *MIPSEVM) { + t.Cleanup(func() { + if t.Failed() { + // Note: For easier debugging of a failing step, see MIPS.t.sol#test_step_debug_succeeds() + t.Logf("Failed while executing step %d with\n\tstep input: %x\n\tpreimageOracle input: %x", mipsEvm.lastStep, mipsEvm.lastStepInput, mipsEvm.lastPreimageOracleInput) + } + }) +} + +// ValidateEVM runs a single evm step and validates against an FPVM poststate +func ValidateEVM(t *testing.T, stepWitness *mipsevm.StepWitness, step uint64, goVm mipsevm.FPVM, hashFn mipsevm.HashFn, contracts *ContractMetadata, tracer *tracing.Hooks) { + evm := NewMIPSEVM(contracts) + evm.SetTracer(tracer) + LogStepFailureAtCleanup(t, evm) + + evmPost := evm.Step(t, stepWitness, step, hashFn) + goPost, _ := goVm.GetState().EncodeWitness() + require.Equal(t, hexutil.Bytes(goPost).String(), hexutil.Bytes(evmPost).String(), + "mipsevm produced different state than EVM") +} + +// AssertEVMReverts runs a single evm step from an FPVM prestate and asserts that the VM panics +func AssertEVMReverts(t *testing.T, state mipsevm.FPVMState, contracts *ContractMetadata, tracer *tracing.Hooks) { + insnProof := state.GetMemory().MerkleProof(state.GetPC()) + encodedWitness, _ := state.EncodeWitness() + stepWitness := &mipsevm.StepWitness{ + State: encodedWitness, + ProofData: insnProof[:], + } + input := EncodeStepInput(t, stepWitness, mipsevm.LocalContext{}, contracts.Artifacts.MIPS) + startingGas := uint64(30_000_000) + + env, evmState := NewEVMEnv(contracts) + env.Config.Tracer = tracer + sender := common.Address{0x13, 0x37} + _, _, err := env.Call(vm.AccountRef(sender), contracts.Addresses.MIPS, input, startingGas, common.U2560) + require.EqualValues(t, err, vm.ErrExecutionReverted) + logs := evmState.Logs() + require.Equal(t, 0, len(logs)) +} + +func AssertPreimageOracleReverts(t *testing.T, preimageKey [32]byte, preimageValue []byte, preimageOffset uint32, contracts *ContractMetadata, tracer *tracing.Hooks) { + evm := NewMIPSEVM(contracts) + evm.SetTracer(tracer) + LogStepFailureAtCleanup(t, evm) + + evm.assertPreimageOracleReverts(t, preimageKey, preimageValue, preimageOffset) +} diff --git a/cannon/mipsevm/testutil/oracle.go b/cannon/mipsevm/testutil/oracle.go new file mode 100644 index 000000000000..64b0f31a897c --- /dev/null +++ b/cannon/mipsevm/testutil/oracle.go @@ -0,0 +1,168 @@ +package testutil + +import ( + "encoding/binary" + "encoding/hex" + "fmt" + "strings" + "testing" + + "github.com/ethereum/go-ethereum/common" + "github.com/ethereum/go-ethereum/crypto" + "github.com/stretchr/testify/require" + + "github.com/ethereum-optimism/optimism/cannon/mipsevm" + preimage "github.com/ethereum-optimism/optimism/op-preimage" +) + +type TestOracle struct { + hint func(v []byte) + getPreimage func(k [32]byte) []byte +} + +var _ mipsevm.PreimageOracle = (*TestOracle)(nil) + +func (t *TestOracle) Hint(v []byte) { + t.hint(v) +} + +func (t *TestOracle) GetPreimage(k [32]byte) []byte { + return t.getPreimage(k) +} + +func StaticOracle(t *testing.T, preimageData []byte) *TestOracle { + return &TestOracle{ + hint: func(v []byte) {}, + getPreimage: func(k [32]byte) []byte { + if k != preimage.Keccak256Key(crypto.Keccak256Hash(preimageData)).PreimageKey() { + t.Fatalf("invalid preimage request for %x", k) + } + return preimageData + }, + } +} + +func StaticPrecompileOracle(t *testing.T, precompile common.Address, requiredGas uint64, input []byte, result []byte) *TestOracle { + return &TestOracle{ + hint: func(v []byte) {}, + getPreimage: func(k [32]byte) []byte { + requiredGasB := binary.BigEndian.AppendUint64(nil, requiredGas) + keyData := append(precompile.Bytes(), requiredGasB...) + keyData = append(keyData, input...) + switch k[0] { + case byte(preimage.Keccak256KeyType): + if k != preimage.Keccak256Key(crypto.Keccak256Hash(keyData)).PreimageKey() { + t.Fatalf("invalid preimage request for %x", k) + } + return keyData + case byte(preimage.PrecompileKeyType): + if k != preimage.PrecompileKey(crypto.Keccak256Hash(keyData)).PreimageKey() { + t.Fatalf("invalid preimage request for %x", k) + } + return result + } + panic("unreachable") + }, + } +} + +func ClaimTestOracle(t *testing.T) (po mipsevm.PreimageOracle, stdOut string, stdErr string) { + s := uint64(1000) + a := uint64(3) + b := uint64(4) + + encodeU64 := func(x uint64) []byte { + return binary.BigEndian.AppendUint64(nil, x) + } + + var diff []byte + diff = append(diff, crypto.Keccak256(encodeU64(a))...) + diff = append(diff, crypto.Keccak256(encodeU64(b))...) + + preHash := crypto.Keccak256Hash(encodeU64(s)) + diffHash := crypto.Keccak256Hash(diff) + + images := make(map[[32]byte][]byte) + images[preimage.LocalIndexKey(0).PreimageKey()] = preHash[:] + images[preimage.LocalIndexKey(1).PreimageKey()] = diffHash[:] + images[preimage.LocalIndexKey(2).PreimageKey()] = encodeU64(s*a + b) + + oracle := &TestOracle{ + hint: func(v []byte) { + parts := strings.Split(string(v), " ") + require.Len(t, parts, 2) + p, err := hex.DecodeString(parts[1]) + require.NoError(t, err) + require.Len(t, p, 32) + h := common.Hash(*(*[32]byte)(p)) + switch parts[0] { + case "fetch-state": + require.Equal(t, h, preHash, "expecting request for pre-state pre-image") + images[preimage.Keccak256Key(preHash).PreimageKey()] = encodeU64(s) + case "fetch-diff": + require.Equal(t, h, diffHash, "expecting request for diff pre-images") + images[preimage.Keccak256Key(diffHash).PreimageKey()] = diff + images[preimage.Keccak256Key(crypto.Keccak256Hash(encodeU64(a))).PreimageKey()] = encodeU64(a) + images[preimage.Keccak256Key(crypto.Keccak256Hash(encodeU64(b))).PreimageKey()] = encodeU64(b) + default: + t.Fatalf("unexpected hint: %q", parts[0]) + } + }, + getPreimage: func(k [32]byte) []byte { + p, ok := images[k] + if !ok { + t.Fatalf("missing pre-image %s", k) + } + return p + }, + } + + return oracle, fmt.Sprintf("computing %d * %d + %d\nclaim %d is good!\n", s, a, b, s*a+b), "started!" +} + +func AllocOracle(t *testing.T, numAllocs int, allocSize int) *TestOracle { + return &TestOracle{ + hint: func(v []byte) {}, + getPreimage: func(k [32]byte) []byte { + switch k { + case preimage.LocalIndexKey(0).PreimageKey(): + return binary.LittleEndian.AppendUint64(nil, uint64(numAllocs)) + case preimage.LocalIndexKey(1).PreimageKey(): + return binary.LittleEndian.AppendUint64(nil, uint64(allocSize)) + default: + t.Fatalf("invalid preimage request for %x", k) + } + panic("unreachable") + }, + } +} + +func SelectOracleFixture(t *testing.T, programName string) mipsevm.PreimageOracle { + if strings.HasPrefix(programName, "oracle_kzg") { + precompile := common.BytesToAddress([]byte{0xa}) + input := common.FromHex("01e798154708fe7789429634053cbf9f99b619f9f084048927333fce637f549b564c0a11a0f704f4fc3e8acfe0f8245f0ad1347b378fbf96e206da11a5d3630624d25032e67a7e6a4910df5834b8fe70e6bcfeeac0352434196bdf4b2485d5a18f59a8d2a1a625a17f3fea0fe5eb8c896db3764f3185481bc22f91b4aaffcca25f26936857bc3a7c2539ea8ec3a952b7873033e038326e87ed3e1276fd140253fa08e9fc25fb2d9a98527fc22a2c9612fbeafdad446cbc7bcdbdcd780af2c16a") + blobPrecompileReturnValue := common.FromHex("000000000000000000000000000000000000000000000000000000000000100073eda753299d7d483339d80809a1d80553bda402fffe5bfeffffffff00000001") + requiredGas := uint64(50_000) + return StaticPrecompileOracle(t, precompile, requiredGas, input, append([]byte{0x1}, blobPrecompileReturnValue...)) + } else if strings.HasPrefix(programName, "oracle") { + return StaticOracle(t, []byte("hello world")) + } else { + return nil + } +} + +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 +} + +func (t *HintTrackingOracle) Hints() [][]byte { + return t.hints +} diff --git a/cannon/mipsevm/testutil/rand.go b/cannon/mipsevm/testutil/rand.go new file mode 100644 index 000000000000..96ff0eb6318b --- /dev/null +++ b/cannon/mipsevm/testutil/rand.go @@ -0,0 +1,82 @@ +package testutil + +import ( + "encoding/binary" + "math/rand" + + "github.com/ethereum/go-ethereum/common" + "github.com/stretchr/testify/require" +) + +type RandHelper struct { + r *rand.Rand +} + +func NewRandHelper(seed int64) *RandHelper { + r := rand.New(rand.NewSource(seed)) + return &RandHelper{r: r} +} + +func (h *RandHelper) Uint32() uint32 { + return h.r.Uint32() +} + +func (h *RandHelper) Fraction() float64 { + return h.r.Float64() +} + +func (h *RandHelper) Intn(n int) int { + return h.r.Intn(n) +} + +func (h *RandHelper) RandHash() common.Hash { + var bytes [32]byte + _, err := h.r.Read(bytes[:]) + if err != nil { + panic(err) + } + return bytes +} + +func (h *RandHelper) RandHint() []byte { + + bytesCount := h.r.Intn(24) + bytes := make([]byte, bytesCount) + + if bytesCount >= 8 { + // Set up a reasonable length prefix + nextHintLen := uint64(h.r.Intn(30)) + binary.BigEndian.PutUint64(bytes, nextHintLen) + + _, err := h.r.Read(bytes[8:]) + if err != nil { + panic(err) + } + } + + return bytes +} + +func (h *RandHelper) RandRegisters() *[32]uint32 { + registers := new([32]uint32) + for i := 0; i < 32; i++ { + registers[i] = h.r.Uint32() + } + return registers +} + +func (h *RandHelper) RandomBytes(t require.TestingT, length int) []byte { + randBytes := make([]byte, length) + if _, err := h.r.Read(randBytes); err != nil { + require.NoError(t, err) + } + return randBytes +} + +func (h *RandHelper) RandPC() uint32 { + return AlignPC(h.r.Uint32()) +} + +func (h *RandHelper) RandStep() uint64 { + return BoundStep(h.r.Uint64()) +} diff --git a/cannon/mipsevm/testutil/state.go b/cannon/mipsevm/testutil/state.go new file mode 100644 index 000000000000..86d5cfb2b6ad --- /dev/null +++ b/cannon/mipsevm/testutil/state.go @@ -0,0 +1,186 @@ +package testutil + +import ( + "encoding/binary" + "fmt" + "testing" + + "github.com/ethereum/go-ethereum/common" + "github.com/ethereum/go-ethereum/common/hexutil" + "github.com/stretchr/testify/require" + + "github.com/ethereum-optimism/optimism/cannon/mipsevm" + "github.com/ethereum-optimism/optimism/cannon/mipsevm/memory" +) + +func AddHintLengthPrefix(data []byte) []byte { + dataLen := len(data) + prefixed := make([]byte, 0, dataLen+4) + prefixed = binary.BigEndian.AppendUint32(prefixed, uint32(dataLen)) + prefixed = append(prefixed, data...) + + return prefixed +} + +func AddPreimageLengthPrefix(data []byte) []byte { + dataLen := len(data) + prefixed := make([]byte, 0, dataLen+8) + prefixed = binary.BigEndian.AppendUint64(prefixed, uint64(dataLen)) + prefixed = append(prefixed, data...) + + return prefixed +} + +type StateMutator interface { + SetPreimageKey(val common.Hash) + SetPreimageOffset(val uint32) + SetPC(val uint32) + SetNextPC(val uint32) + SetHI(val uint32) + SetLO(val uint32) + SetHeap(addr uint32) + SetExitCode(val uint8) + SetExited(val bool) + SetStep(val uint64) + SetLastHint(val hexutil.Bytes) + Randomize(randSeed int64) +} + +type StateOption func(state StateMutator) + +func WithPC(pc uint32) StateOption { + return func(state StateMutator) { + state.SetPC(pc) + } +} + +func WithNextPC(nextPC uint32) StateOption { + return func(state StateMutator) { + state.SetNextPC(nextPC) + } +} + +func WithPCAndNextPC(pc uint32) StateOption { + return func(state StateMutator) { + state.SetPC(pc) + state.SetNextPC(pc + 4) + } +} + +func WithHeap(addr uint32) StateOption { + return func(state StateMutator) { + state.SetHeap(addr) + } +} + +func WithLastHint(lastHint hexutil.Bytes) StateOption { + return func(state StateMutator) { + state.SetLastHint(lastHint) + } +} + +func WithPreimageKey(key common.Hash) StateOption { + return func(state StateMutator) { + state.SetPreimageKey(key) + } +} + +func WithPreimageOffset(offset uint32) StateOption { + return func(state StateMutator) { + state.SetPreimageOffset(offset) + } +} + +func WithStep(step uint64) StateOption { + return func(state StateMutator) { + state.SetStep(step) + } +} + +func WithRandomization(seed int64) StateOption { + return func(mut StateMutator) { + mut.Randomize(seed) + } +} + +func AlignPC(pc uint32) uint32 { + // Memory-align random pc and leave room for nextPC + pc = pc & 0xFF_FF_FF_FC // Align address + if pc >= 0xFF_FF_FF_FC { + // Leave room to set and then increment nextPC + pc = 0xFF_FF_FF_FC - 8 + } + return pc +} + +func BoundStep(step uint64) uint64 { + // Leave room to increment step at least once + if step == ^uint64(0) { + step -= 1 + } + return step +} + +type ExpectedState struct { + PreimageKey common.Hash + PreimageOffset uint32 + PC uint32 + NextPC uint32 + HI uint32 + LO uint32 + Heap uint32 + ExitCode uint8 + Exited bool + Step uint64 + LastHint hexutil.Bytes + Registers [32]uint32 + MemoryRoot common.Hash + expectedMemory *memory.Memory +} + +func NewExpectedState(fromState mipsevm.FPVMState) *ExpectedState { + return &ExpectedState{ + PreimageKey: fromState.GetPreimageKey(), + PreimageOffset: fromState.GetPreimageOffset(), + PC: fromState.GetPC(), + NextPC: fromState.GetCpu().NextPC, + HI: fromState.GetCpu().HI, + LO: fromState.GetCpu().LO, + Heap: fromState.GetHeap(), + ExitCode: fromState.GetExitCode(), + Exited: fromState.GetExited(), + Step: fromState.GetStep(), + LastHint: fromState.GetLastHint(), + Registers: *fromState.GetRegistersRef(), + MemoryRoot: fromState.GetMemory().MerkleRoot(), + expectedMemory: fromState.GetMemory().Copy(), + } +} + +func (e *ExpectedState) ExpectStep() { + // Set some standard expectations for a normal step + e.Step += 1 + e.PC += 4 + e.NextPC += 4 +} + +func (e *ExpectedState) ExpectMemoryWrite(addr uint32, val uint32) { + e.expectedMemory.SetMemory(addr, val) + e.MemoryRoot = e.expectedMemory.MerkleRoot() +} + +func (e *ExpectedState) Validate(t testing.TB, actualState mipsevm.FPVMState) { + require.Equal(t, e.PreimageKey, actualState.GetPreimageKey(), fmt.Sprintf("Expect preimageKey = %v", e.PreimageKey)) + require.Equal(t, e.PreimageOffset, actualState.GetPreimageOffset(), fmt.Sprintf("Expect preimageOffset = %v", e.PreimageOffset)) + require.Equal(t, e.PC, actualState.GetCpu().PC, fmt.Sprintf("Expect PC = 0x%x", e.PC)) + require.Equal(t, e.NextPC, actualState.GetCpu().NextPC, fmt.Sprintf("Expect nextPC = 0x%x", e.NextPC)) + require.Equal(t, e.HI, actualState.GetCpu().HI, fmt.Sprintf("Expect HI = 0x%x", e.HI)) + require.Equal(t, e.LO, actualState.GetCpu().LO, fmt.Sprintf("Expect LO = 0x%x", e.LO)) + require.Equal(t, e.Heap, actualState.GetHeap(), fmt.Sprintf("Expect heap = 0x%x", e.Heap)) + require.Equal(t, e.ExitCode, actualState.GetExitCode(), fmt.Sprintf("Expect exitCode = 0x%x", e.ExitCode)) + require.Equal(t, e.Exited, actualState.GetExited(), fmt.Sprintf("Expect exited = %v", e.Exited)) + require.Equal(t, e.Step, actualState.GetStep(), fmt.Sprintf("Expect step = %d", e.Step)) + require.Equal(t, e.LastHint, actualState.GetLastHint(), fmt.Sprintf("Expect lastHint = %v", e.LastHint)) + require.Equal(t, e.Registers, *actualState.GetRegistersRef(), fmt.Sprintf("Expect registers = %v", e.Registers)) + require.Equal(t, e.MemoryRoot, common.Hash(actualState.GetMemory().MerkleRoot()), fmt.Sprintf("Expect memory root = %v", e.MemoryRoot)) +} diff --git a/cannon/mipsevm/testutil/vmtests.go b/cannon/mipsevm/testutil/vmtests.go new file mode 100644 index 000000000000..0c5c325a8b55 --- /dev/null +++ b/cannon/mipsevm/testutil/vmtests.go @@ -0,0 +1,137 @@ +package testutil + +import ( + "bytes" + "io" + "os" + "path" + "strings" + "testing" + + "github.com/ethereum/go-ethereum/log" + "github.com/stretchr/testify/require" + + "github.com/ethereum-optimism/optimism/cannon/mipsevm" + "github.com/ethereum-optimism/optimism/cannon/mipsevm/program" +) + +type VMFactory[T mipsevm.FPVMState] func(state T, po mipsevm.PreimageOracle, stdOut, stdErr io.Writer, log log.Logger) mipsevm.FPVM +type StateFactory[T mipsevm.FPVMState] func() T + +func RunVMTests_OpenMips[T mipsevm.FPVMState](t *testing.T, stateFactory StateFactory[T], vmFactory VMFactory[T], excludedTests ...string) { + testFiles, err := os.ReadDir("../tests/open_mips_tests/test/bin") + require.NoError(t, err) + + for _, f := range testFiles { + t.Run(f.Name(), func(t *testing.T) { + for _, skipped := range excludedTests { + if f.Name() == skipped { + t.Skipf("Skipping explicitly excluded open_mips testcase: %v", f.Name()) + } + } + + oracle := SelectOracleFixture(t, f.Name()) + // Short-circuit early for exit_group.bin + exitGroup := f.Name() == "exit_group.bin" + expectPanic := strings.HasSuffix(f.Name(), "panic.bin") + + // TODO: currently tests are compiled as flat binary objects + // We can use more standard tooling to compile them to ELF files and get remove maketests.py + fn := path.Join("../tests/open_mips_tests/test/bin", f.Name()) + //elfProgram, err := elf.Open() + //require.NoError(t, err, "must load test ELF binary") + //state, err := LoadELF(elfProgram) + //require.NoError(t, err, "must load ELF into state") + programMem, err := os.ReadFile(fn) + require.NoError(t, err) + state := stateFactory() + err = state.GetMemory().SetMemoryRange(0, bytes.NewReader(programMem)) + require.NoError(t, err, "load program into state") + + // set the return address ($ra) to jump into when test completes + state.GetRegistersRef()[31] = EndAddr + + us := vmFactory(state, oracle, os.Stdout, os.Stderr, CreateLogger()) + + // Catch panics and check if they are expected + defer func() { + if r := recover(); r != nil { + if expectPanic { + // Success + } else { + t.Errorf("unexpected panic: %v", r) + } + } + }() + + for i := 0; i < 1000; i++ { + if us.GetState().GetPC() == EndAddr { + break + } + if exitGroup && us.GetState().GetExited() { + break + } + _, err := us.Step(false) + require.NoError(t, err) + } + + if exitGroup { + require.NotEqual(t, uint32(EndAddr), us.GetState().GetPC(), "must not reach end") + require.True(t, us.GetState().GetExited(), "must set exited state") + require.Equal(t, uint8(1), us.GetState().GetExitCode(), "must exit with 1") + } else if expectPanic { + require.NotEqual(t, uint32(EndAddr), us.GetState().GetPC(), "must not reach end") + } else { + require.Equal(t, uint32(EndAddr), us.GetState().GetPC(), "must reach end") + done, result := state.GetMemory().GetMemory(BaseAddrEnd+4), state.GetMemory().GetMemory(BaseAddrEnd+8) + // inspect test result + require.Equal(t, done, uint32(1), "must be done") + require.Equal(t, result, uint32(1), "must have success result") + } + }) + } +} + +func RunVMTest_Hello[T mipsevm.FPVMState](t *testing.T, initState program.CreateInitialFPVMState[T], vmFactory VMFactory[T], doPatchGo bool) { + state, _ := LoadELFProgram(t, "../../testdata/example/bin/hello.elf", initState, doPatchGo) + + var stdOutBuf, stdErrBuf bytes.Buffer + us := vmFactory(state, nil, io.MultiWriter(&stdOutBuf, os.Stdout), io.MultiWriter(&stdErrBuf, os.Stderr), CreateLogger()) + + for i := 0; i < 400_000; i++ { + if us.GetState().GetExited() { + break + } + _, err := us.Step(false) + require.NoError(t, err) + } + + require.True(t, state.GetExited(), "must complete program") + require.Equal(t, uint8(0), state.GetExitCode(), "exit with 0") + + require.Equal(t, "hello world!\n", stdOutBuf.String(), "stdout says hello") + require.Equal(t, "", stdErrBuf.String(), "stderr silent") +} + +func RunVMTest_Claim[T mipsevm.FPVMState](t *testing.T, initState program.CreateInitialFPVMState[T], vmFactory VMFactory[T], doPatchGo bool) { + state, _ := LoadELFProgram(t, "../../testdata/example/bin/claim.elf", initState, doPatchGo) + + oracle, expectedStdOut, expectedStdErr := ClaimTestOracle(t) + + var stdOutBuf, stdErrBuf bytes.Buffer + us := vmFactory(state, oracle, io.MultiWriter(&stdOutBuf, os.Stdout), io.MultiWriter(&stdErrBuf, os.Stderr), CreateLogger()) + + for i := 0; i < 2000_000; i++ { + if us.GetState().GetExited() { + break + } + _, err := us.Step(false) + require.NoError(t, err) + } + + require.True(t, state.GetExited(), "must complete program") + require.Equal(t, uint8(0), state.GetExitCode(), "exit with 0") + + require.Equal(t, expectedStdOut, stdOutBuf.String(), "stdout") + require.Equal(t, expectedStdErr, stdErrBuf.String(), "stderr") +} diff --git a/cannon/mipsevm/versions/state.go b/cannon/mipsevm/versions/state.go new file mode 100644 index 000000000000..fcf7b1864f38 --- /dev/null +++ b/cannon/mipsevm/versions/state.go @@ -0,0 +1,105 @@ +package versions + +import ( + "encoding/json" + "errors" + "fmt" + "io" + + "github.com/ethereum-optimism/optimism/cannon/mipsevm" + "github.com/ethereum-optimism/optimism/cannon/mipsevm/multithreaded" + "github.com/ethereum-optimism/optimism/cannon/mipsevm/singlethreaded" + "github.com/ethereum-optimism/optimism/cannon/serialize" + "github.com/ethereum-optimism/optimism/op-service/jsonutil" +) + +type StateVersion uint8 + +const ( + VersionSingleThreaded StateVersion = iota + VersionMultiThreaded +) + +var ( + ErrUnknownVersion = errors.New("unknown version") + ErrJsonNotSupported = errors.New("json not supported") +) + +func LoadStateFromFile(path string) (*VersionedState, error) { + if !serialize.IsBinaryFile(path) { + // Always use singlethreaded for JSON states + state, err := jsonutil.LoadJSON[singlethreaded.State](path) + if err != nil { + return nil, err + } + return NewFromState(state) + } + return serialize.LoadSerializedBinary[VersionedState](path) +} + +func NewFromState(state mipsevm.FPVMState) (*VersionedState, error) { + switch state := state.(type) { + case *singlethreaded.State: + return &VersionedState{ + Version: VersionSingleThreaded, + FPVMState: state, + }, nil + case *multithreaded.State: + return &VersionedState{ + Version: VersionMultiThreaded, + FPVMState: state, + }, nil + default: + return nil, fmt.Errorf("%w: %T", ErrUnknownVersion, state) + } +} + +// VersionedState deserializes a FPVMState and implements VersionedState based on the version of that state. +// It does this based on the version byte read in Deserialize +type VersionedState struct { + Version StateVersion + mipsevm.FPVMState +} + +func (s *VersionedState) Serialize(w io.Writer) error { + bout := serialize.NewBinaryWriter(w) + if err := bout.WriteUInt(s.Version); err != nil { + return err + } + return s.FPVMState.Serialize(w) +} + +func (s *VersionedState) Deserialize(in io.Reader) error { + bin := serialize.NewBinaryReader(in) + if err := bin.ReadUInt(&s.Version); err != nil { + return err + } + + switch s.Version { + case VersionSingleThreaded: + state := &singlethreaded.State{} + if err := state.Deserialize(in); err != nil { + return err + } + s.FPVMState = state + return nil + case VersionMultiThreaded: + state := &multithreaded.State{} + if err := state.Deserialize(in); err != nil { + return err + } + s.FPVMState = state + return nil + default: + return fmt.Errorf("%w: %d", ErrUnknownVersion, s.Version) + } +} + +// MarshalJSON marshals the underlying state without adding version prefix. +// JSON states are always assumed to be single threaded +func (s *VersionedState) MarshalJSON() ([]byte, error) { + if s.Version != VersionSingleThreaded { + return nil, fmt.Errorf("%w for type %T", ErrJsonNotSupported, s.FPVMState) + } + return json.Marshal(s.FPVMState) +} diff --git a/cannon/mipsevm/versions/state_test.go b/cannon/mipsevm/versions/state_test.go new file mode 100644 index 000000000000..7fb36cd5734c --- /dev/null +++ b/cannon/mipsevm/versions/state_test.go @@ -0,0 +1,76 @@ +package versions + +import ( + "path/filepath" + "testing" + + "github.com/ethereum-optimism/optimism/cannon/mipsevm/multithreaded" + "github.com/ethereum-optimism/optimism/cannon/mipsevm/singlethreaded" + "github.com/ethereum-optimism/optimism/cannon/serialize" + "github.com/stretchr/testify/require" +) + +func TestNewFromState(t *testing.T) { + t.Run("singlethreaded", func(t *testing.T) { + actual, err := NewFromState(singlethreaded.CreateEmptyState()) + require.NoError(t, err) + require.IsType(t, &singlethreaded.State{}, actual.FPVMState) + require.Equal(t, VersionSingleThreaded, actual.Version) + }) + + t.Run("multithreaded", func(t *testing.T) { + actual, err := NewFromState(multithreaded.CreateEmptyState()) + require.NoError(t, err) + require.IsType(t, &multithreaded.State{}, actual.FPVMState) + require.Equal(t, VersionMultiThreaded, actual.Version) + }) +} + +func TestLoadStateFromFile(t *testing.T) { + t.Run("SinglethreadedFromJSON", func(t *testing.T) { + expected, err := NewFromState(singlethreaded.CreateEmptyState()) + require.NoError(t, err) + + path := writeToFile(t, "state.json", expected) + actual, err := LoadStateFromFile(path) + require.NoError(t, err) + require.Equal(t, expected, actual) + }) + + t.Run("SinglethreadedFromBinary", func(t *testing.T) { + expected, err := NewFromState(singlethreaded.CreateEmptyState()) + require.NoError(t, err) + + path := writeToFile(t, "state.bin.gz", expected) + actual, err := LoadStateFromFile(path) + require.NoError(t, err) + require.Equal(t, expected, actual) + }) + + t.Run("MultithreadedFromBinary", func(t *testing.T) { + expected, err := NewFromState(multithreaded.CreateEmptyState()) + require.NoError(t, err) + + path := writeToFile(t, "state.bin.gz", expected) + actual, err := LoadStateFromFile(path) + require.NoError(t, err) + require.Equal(t, expected, actual) + }) +} + +func TestMultithreadedDoesNotSupportJSON(t *testing.T) { + state, err := NewFromState(multithreaded.CreateEmptyState()) + require.NoError(t, err) + + dir := t.TempDir() + path := filepath.Join(dir, "test.json") + err = serialize.Write(path, state, 0o644) + require.ErrorIs(t, err, ErrJsonNotSupported) +} + +func writeToFile(t *testing.T, filename string, data serialize.Serializable) string { + dir := t.TempDir() + path := filepath.Join(dir, filename) + require.NoError(t, serialize.Write(path, data, 0o644)) + return path +} diff --git a/cannon/mipsevm/witness.go b/cannon/mipsevm/witness.go index 58039a86ea32..b7bf38fa528e 100644 --- a/cannon/mipsevm/witness.go +++ b/cannon/mipsevm/witness.go @@ -6,9 +6,10 @@ type LocalContext common.Hash type StepWitness struct { // encoded state witness - State []byte + State []byte + StateHash common.Hash - MemProof []byte + ProofData []byte PreimageKey [32]byte // zeroed when no pre-image is accessed PreimageValue []byte // including the 8-byte length prefix @@ -18,3 +19,13 @@ type StepWitness struct { func (wit *StepWitness) HasPreimage() bool { return wit.PreimageKey != ([32]byte{}) } + +type HashFn func(sw []byte) (common.Hash, error) + +func AppendBoolToWitness(witnessData []byte, boolVal bool) []byte { + if boolVal { + return append(witnessData, 1) + } else { + return append(witnessData, 0) + } +} diff --git a/cannon/serialize/binary.go b/cannon/serialize/binary.go new file mode 100644 index 000000000000..aeaf14c5b493 --- /dev/null +++ b/cannon/serialize/binary.go @@ -0,0 +1,64 @@ +package serialize + +import ( + "errors" + "fmt" + "io" + "reflect" + + "github.com/ethereum-optimism/optimism/op-service/ioutil" +) + +// Deserializable defines functionality for a type that may be deserialized from raw bytes. +type Deserializable interface { + // Deserialize decodes raw bytes into the type. + Deserialize(in io.Reader) error +} + +// Serializable defines functionality for a type that may be serialized to raw bytes. +type Serializable interface { + // Serialize encodes the type as raw bytes. + Serialize(out io.Writer) error +} + +func LoadSerializedBinary[X any](inputPath string) (*X, error) { + if inputPath == "" { + return nil, errors.New("no path specified") + } + var f io.ReadCloser + f, err := ioutil.OpenDecompressed(inputPath) + if err != nil { + return nil, fmt.Errorf("failed to open file %q: %w", inputPath, err) + } + defer f.Close() + + var x X + serializable, ok := reflect.ValueOf(&x).Interface().(Deserializable) + if !ok { + return nil, fmt.Errorf("%T is not a Serializable", x) + } + err = serializable.Deserialize(f) + if err != nil { + return nil, err + } + return &x, nil +} + +func WriteSerializedBinary(value Serializable, target ioutil.OutputTarget) error { + out, closer, abort, err := target() + if err != nil { + return err + } + if out == nil { + return nil // Nothing to write to so skip generating content entirely + } + defer abort() + err = value.Serialize(out) + if err != nil { + return fmt.Errorf("failed to write binary: %w", err) + } + if err := closer.Close(); err != nil { + return fmt.Errorf("failed to finish write: %w", err) + } + return nil +} diff --git a/cannon/serialize/binary_test.go b/cannon/serialize/binary_test.go new file mode 100644 index 000000000000..95700b537c40 --- /dev/null +++ b/cannon/serialize/binary_test.go @@ -0,0 +1,94 @@ +package serialize + +import ( + "encoding/binary" + "io" + "os" + "path/filepath" + "testing" + + "github.com/ethereum-optimism/optimism/op-service/ioutil" + "github.com/stretchr/testify/require" +) + +func TestRoundTripBinary(t *testing.T) { + dir := t.TempDir() + file := filepath.Join(dir, "test.bin") + data := &serializableTestData{A: []byte{0xde, 0xad}, B: 3} + err := WriteSerializedBinary(data, ioutil.ToAtomicFile(file, 0644)) + require.NoError(t, err) + + hasGzip, err := hasGzipHeader(file) + require.NoError(t, err) + require.False(t, hasGzip) + + result, err := LoadSerializedBinary[serializableTestData](file) + require.NoError(t, err) + require.EqualValues(t, data, result) +} + +func TestRoundTripBinaryWithGzip(t *testing.T) { + dir := t.TempDir() + file := filepath.Join(dir, "test.bin.gz") + data := &serializableTestData{A: []byte{0xde, 0xad}, B: 3} + err := WriteSerializedBinary(data, ioutil.ToAtomicFile(file, 0644)) + require.NoError(t, err) + + hasGzip, err := hasGzipHeader(file) + require.NoError(t, err) + require.True(t, hasGzip) + + result, err := LoadSerializedBinary[serializableTestData](file) + require.NoError(t, err) + require.EqualValues(t, data, result) +} + +func hasGzipHeader(filename string) (bool, error) { + file, err := os.Open(filename) + if err != nil { + return false, err + } + defer file.Close() + + header := make([]byte, 2) + _, err = file.Read(header) + if err != nil { + return false, err + } + + // Gzip header magic numbers: 1F 8B + return header[0] == 0x1F && header[1] == 0x8B, nil +} + +type serializableTestData struct { + A []byte + B uint8 +} + +func (s *serializableTestData) Serialize(w io.Writer) error { + if err := binary.Write(w, binary.BigEndian, uint64(len(s.A))); err != nil { + return err + } + if _, err := w.Write(s.A); err != nil { + return err + } + if err := binary.Write(w, binary.BigEndian, s.B); err != nil { + return err + } + return nil +} + +func (s *serializableTestData) Deserialize(in io.Reader) error { + var lenA uint64 + if err := binary.Read(in, binary.BigEndian, &lenA); err != nil { + return err + } + s.A = make([]byte, lenA) + if _, err := io.ReadFull(in, s.A); err != nil { + return err + } + if err := binary.Read(in, binary.BigEndian, &s.B); err != nil { + return err + } + return nil +} diff --git a/cannon/serialize/detect.go b/cannon/serialize/detect.go new file mode 100644 index 000000000000..13cf3aef849e --- /dev/null +++ b/cannon/serialize/detect.go @@ -0,0 +1,20 @@ +package serialize + +import ( + "os" + "strings" + + "github.com/ethereum-optimism/optimism/op-service/ioutil" + "github.com/ethereum-optimism/optimism/op-service/jsonutil" +) + +func Write[X Serializable](outputPath string, x X, perm os.FileMode) error { + if IsBinaryFile(outputPath) { + return WriteSerializedBinary(x, ioutil.ToStdOutOrFileOrNoop(outputPath, perm)) + } + return jsonutil.WriteJSON[X](x, ioutil.ToStdOutOrFileOrNoop(outputPath, perm)) +} + +func IsBinaryFile(path string) bool { + return strings.HasSuffix(path, ".bin") || strings.HasSuffix(path, ".bin.gz") +} diff --git a/cannon/serialize/detect_test.go b/cannon/serialize/detect_test.go new file mode 100644 index 000000000000..22ac747a1044 --- /dev/null +++ b/cannon/serialize/detect_test.go @@ -0,0 +1,60 @@ +package serialize + +import ( + "io" + "path/filepath" + "testing" + + "github.com/ethereum-optimism/optimism/op-service/ioutil" + "github.com/ethereum-optimism/optimism/op-service/jsonutil" + "github.com/stretchr/testify/require" +) + +func TestRoundtrip(t *testing.T) { + tests := []struct { + filename string + expectJSON bool + expectGzip bool + }{ + {filename: "test.json", expectJSON: true, expectGzip: false}, + {filename: "test.json.gz", expectJSON: true, expectGzip: true}, + {filename: "test.foo", expectJSON: true, expectGzip: false}, + {filename: "test.foo.gz", expectJSON: true, expectGzip: true}, + {filename: "test.bin", expectJSON: false, expectGzip: false}, + {filename: "test.bin.gz", expectJSON: false, expectGzip: true}, + } + + for _, test := range tests { + test := test + t.Run(test.filename, func(t *testing.T) { + path := filepath.Join(t.TempDir(), test.filename) + + data := &serializableTestData{A: []byte{0xde, 0xad}, B: 3} + err := Write[*serializableTestData](path, data, 0644) + require.NoError(t, err) + + hasGzip, err := hasGzipHeader(path) + require.NoError(t, err) + require.Equal(t, test.expectGzip, hasGzip) + + decompressed, err := ioutil.OpenDecompressed(path) + require.NoError(t, err) + defer decompressed.Close() + start := make([]byte, 1) + _, err = io.ReadFull(decompressed, start) + require.NoError(t, err) + var load func(path string) (*serializableTestData, error) + if test.expectJSON { + load = jsonutil.LoadJSON[serializableTestData] + require.Equal(t, "{", string(start)) + } else { + load = LoadSerializedBinary[serializableTestData] + require.NotEqual(t, "{", string(start)) + } + + result, err := load(path) + require.NoError(t, err) + require.EqualValues(t, data, result) + }) + } +} diff --git a/cannon/serialize/reader.go b/cannon/serialize/reader.go new file mode 100644 index 000000000000..53f4440659a4 --- /dev/null +++ b/cannon/serialize/reader.go @@ -0,0 +1,60 @@ +package serialize + +import ( + "encoding/binary" + "fmt" + "io" + + "github.com/ethereum/go-ethereum/common" +) + +// BinaryReader provides methods to decode content written by BinaryWriter. +type BinaryReader struct { + in io.Reader +} + +func NewBinaryReader(in io.Reader) *BinaryReader { + return &BinaryReader{in: in} +} + +func (r *BinaryReader) ReadUInt(target any) error { + return binary.Read(r.in, binary.BigEndian, target) +} + +func (r *BinaryReader) ReadHash(target *common.Hash) error { + _, err := io.ReadFull(r.in, target[:]) + return err +} + +func (r *BinaryReader) ReadBool(target *bool) error { + var v uint8 + if err := r.ReadUInt(&v); err != nil { + return err + } + switch v { + case 0: + *target = false + case 1: + *target = true + default: + return fmt.Errorf("invalid boolean value: %v", v) + } + return nil +} + +func (r *BinaryReader) ReadBytes(target *[]byte) error { + var size uint32 + if err := r.ReadUInt(&size); err != nil { + return err + } + if size == 0 { + *target = nil + return nil + } + data := make([]byte, size) + if _, err := io.ReadFull(r.in, data); err != nil { + return err + } + *target = data + return nil +} diff --git a/cannon/serialize/reader_test.go b/cannon/serialize/reader_test.go new file mode 100644 index 000000000000..0d6b8678c592 --- /dev/null +++ b/cannon/serialize/reader_test.go @@ -0,0 +1,48 @@ +package serialize + +import ( + "bytes" + "testing" + + "github.com/ethereum/go-ethereum/common" + "github.com/stretchr/testify/require" +) + +func TestRoundTripWithReader(t *testing.T) { + // Test that reader can read the data written by BinaryWriter. + // The writer tests check that the generated data is what is expected, so simply check that the reader correctly + // parses a range of data here rather than duplicating the expected binary serialization. + buf := new(bytes.Buffer) + out := NewBinaryWriter(buf) + require.NoError(t, out.WriteBool(true)) + require.NoError(t, out.WriteBool(false)) + require.NoError(t, out.WriteUInt(uint8(5))) + require.NoError(t, out.WriteUInt(uint32(76))) + require.NoError(t, out.WriteUInt(uint64(24824424))) + expectedHash := common.HexToHash("0x5a8f75b8e1c1529d1d1c596464d17b99763604f4c00b280436fc0dffacc60efd") + require.NoError(t, out.WriteHash(expectedHash)) + expectedBytes := []byte{1, 2, 3, 4, 5, 6, 7, 8, 9} + require.NoError(t, out.WriteBytes(expectedBytes)) + + in := NewBinaryReader(buf) + var b bool + require.NoError(t, in.ReadBool(&b)) + require.True(t, b) + require.NoError(t, in.ReadBool(&b)) + require.False(t, b) + var vUInt8 uint8 + require.NoError(t, in.ReadUInt(&vUInt8)) + require.Equal(t, uint8(5), vUInt8) + var vUInt32 uint32 + require.NoError(t, in.ReadUInt(&vUInt32)) + require.Equal(t, uint32(76), vUInt32) + var vUInt64 uint64 + require.NoError(t, in.ReadUInt(&vUInt64)) + require.Equal(t, uint64(24824424), vUInt64) + var hash common.Hash + require.NoError(t, in.ReadHash(&hash)) + require.Equal(t, expectedHash, hash) + var data []byte + require.NoError(t, in.ReadBytes(&data)) + require.Equal(t, expectedBytes, data) +} diff --git a/cannon/serialize/writer.go b/cannon/serialize/writer.go new file mode 100644 index 000000000000..a8790115a11c --- /dev/null +++ b/cannon/serialize/writer.go @@ -0,0 +1,44 @@ +package serialize + +import ( + "encoding/binary" + "io" + + "github.com/ethereum/go-ethereum/common" +) + +// BinaryWriter writes a simple binary format which can be read again using BinaryReader. +// The format is a simple concatenation of values, with prefixed length for variable length items. +// All numbers are encoded using big endian. +type BinaryWriter struct { + out io.Writer +} + +func NewBinaryWriter(out io.Writer) *BinaryWriter { + return &BinaryWriter{out: out} +} + +func (w *BinaryWriter) WriteUInt(v any) error { + return binary.Write(w.out, binary.BigEndian, v) +} + +func (w *BinaryWriter) WriteHash(v common.Hash) error { + _, err := w.out.Write(v[:]) + return err +} + +func (w *BinaryWriter) WriteBool(v bool) error { + if v { + return w.WriteUInt(uint8(1)) + } else { + return w.WriteUInt(uint8(0)) + } +} + +func (w *BinaryWriter) WriteBytes(v []byte) error { + if err := w.WriteUInt(uint32(len(v))); err != nil { + return err + } + _, err := w.out.Write(v) + return err +} diff --git a/cannon/serialize/writer_test.go b/cannon/serialize/writer_test.go new file mode 100644 index 000000000000..d37b18da094f --- /dev/null +++ b/cannon/serialize/writer_test.go @@ -0,0 +1,102 @@ +package serialize + +import ( + "bytes" + "fmt" + "math" + "testing" + + "github.com/ethereum/go-ethereum/common" + "github.com/stretchr/testify/require" +) + +func TestUInt(t *testing.T) { + tests := []struct { + name string + val any + expected []byte + }{ + {name: "uint8-zero", val: uint8(0), expected: []byte{0}}, + {name: "uint8-one", val: uint8(1), expected: []byte{1}}, + {name: "uint8-big", val: uint8(156), expected: []byte{156}}, + {name: "uint8-max", val: uint8(math.MaxUint8), expected: []byte{255}}, + + {name: "uint16-zero", val: uint16(0), expected: []byte{0, 0}}, + {name: "uint16-one", val: uint16(1), expected: []byte{0, 1}}, + {name: "uint16-big", val: uint16(1283), expected: []byte{5, 3}}, + {name: "uint16-max", val: uint16(math.MaxUint16), expected: []byte{255, 255}}, + + {name: "uint32-zero", val: uint32(0), expected: []byte{0, 0, 0, 0}}, + {name: "uint32-one", val: uint32(1), expected: []byte{0, 0, 0, 1}}, + {name: "uint32-big", val: uint32(1283424245), expected: []byte{0x4c, 0x7f, 0x7f, 0xf5}}, + {name: "uint32-max", val: uint32(math.MaxUint32), expected: []byte{255, 255, 255, 255}}, + + {name: "uint64-zero", val: uint64(0), expected: []byte{0, 0, 0, 0, 0, 0, 0, 0}}, + {name: "uint64-one", val: uint64(1), expected: []byte{0, 0, 0, 0, 0, 0, 0, 1}}, + {name: "uint64-big", val: uint64(1283424245242429284), expected: []byte{0x11, 0xcf, 0xa3, 0x8d, 0x19, 0xcc, 0x7f, 0x64}}, + {name: "uint64-max", val: uint64(math.MaxUint64), expected: []byte{255, 255, 255, 255, 255, 255, 255, 255}}, + } + + for _, test := range tests { + test := test + t.Run(test.name, func(t *testing.T) { + out := new(bytes.Buffer) + bout := NewBinaryWriter(out) + require.NoError(t, bout.WriteUInt(test.val)) + result := out.Bytes() + require.Equal(t, test.expected, result) + }) + } +} + +func TestWriteHash(t *testing.T) { + out := new(bytes.Buffer) + bout := NewBinaryWriter(out) + hash := common.HexToHash("0x5a8f75b8e1c1529d1d1c596464d17b99763604f4c00b280436fc0dffacc60efd") + require.NoError(t, bout.WriteHash(hash)) + + result := out.Bytes() + require.Equal(t, hash[:], result) +} + +func TestWriteBool(t *testing.T) { + for _, val := range []bool{true, false} { + val := val + t.Run(fmt.Sprintf("%t", val), func(t *testing.T) { + out := new(bytes.Buffer) + bout := NewBinaryWriter(out) + require.NoError(t, bout.WriteBool(val)) + + result := out.Bytes() + require.Len(t, result, 1) + if val { + require.Equal(t, result[0], uint8(1)) + } else { + require.Equal(t, result[0], uint8(0)) + } + }) + } +} + +func TestWriteBytes(t *testing.T) { + tests := []struct { + name string + val []byte + expected []byte + }{ + {name: "nil", val: nil, expected: []byte{0, 0, 0, 0}}, + {name: "empty", val: []byte{}, expected: []byte{0, 0, 0, 0}}, + {name: "non-empty", val: []byte{1, 2, 3, 4, 5}, expected: []byte{0, 0, 0, 5, 1, 2, 3, 4, 5}}, + } + for _, test := range tests { + test := test + t.Run(test.name, func(t *testing.T) { + out := new(bytes.Buffer) + bout := NewBinaryWriter(out) + require.NoError(t, bout.WriteBytes(test.val)) + + result := out.Bytes() + require.Equal(t, test.expected, result) + }) + } +} diff --git a/cannon/testdata/README.md b/cannon/testdata/README.md new file mode 100644 index 000000000000..4730cac00b0d --- /dev/null +++ b/cannon/testdata/README.md @@ -0,0 +1,11 @@ +# Cannon testdata + +These example Go programs are used in tests, +and encapsulated as their own Go modules. + +## Testdata + +The `testdata` directory name (special Go exception) prevents tools like `go mod tidy` +that run from the monorepo root from picking up on the test data, +preventing noisy dependabot PRs. + diff --git a/cannon/testdata/example/Makefile b/cannon/testdata/example/Makefile new file mode 100644 index 000000000000..7b3b8fdf019d --- /dev/null +++ b/cannon/testdata/example/Makefile @@ -0,0 +1,21 @@ +all: elf + +.PHONY: elf +elf: $(patsubst %/go.mod,bin/%.elf,$(wildcard */go.mod)) + +.PHONY: dump +dump: $(patsubst %/go.mod,bin/%.dump,$(wildcard */go.mod)) + +bin: + mkdir bin + +# take any directory with a go mod, and build an ELF +# verify output with: readelf -h bin/.elf +# result is mips32, big endian, R3000 +bin/%.elf: bin + cd $(@:bin/%.elf=%) && GOOS=linux GOARCH=mips GOMIPS=softfloat go build -o ../$@ . + +# take any ELF and dump it +# TODO: currently have the little-endian toolchain, but should use the big-endian one. The -EB compat flag works though. +bin/%.dump: bin/%.elf + mipsel-linux-gnu-objdump -D --disassembler-options=no-aliases --wide --source -m mips:3000 -EB $(@:%.dump=%.elf) > $@ diff --git a/cannon/testdata/example/alloc/go.mod b/cannon/testdata/example/alloc/go.mod new file mode 100644 index 000000000000..d4d3c23faf2d --- /dev/null +++ b/cannon/testdata/example/alloc/go.mod @@ -0,0 +1,14 @@ +module alloc + +go 1.21 + +toolchain go1.21.1 + +require github.com/ethereum-optimism/optimism v0.0.0 + +require ( + golang.org/x/crypto v0.27.0 // indirect + golang.org/x/sys v0.25.0 // indirect +) + +replace github.com/ethereum-optimism/optimism v0.0.0 => ../../../.. diff --git a/cannon/testdata/example/alloc/go.sum b/cannon/testdata/example/alloc/go.sum new file mode 100644 index 000000000000..c319c5651633 --- /dev/null +++ b/cannon/testdata/example/alloc/go.sum @@ -0,0 +1,12 @@ +github.com/davecgh/go-spew v1.1.2-0.20180830191138-d8f796af33cc h1:U9qPSI2PIWSS1VwoXQT9A3Wy9MM3WgvqSxFWenqJduM= +github.com/davecgh/go-spew v1.1.2-0.20180830191138-d8f796af33cc/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38= +github.com/pmezard/go-difflib v1.0.1-0.20181226105442-5d4384ee4fb2 h1:Jamvg5psRIccs7FGNTlIRMkT8wgtp5eCXdBlqhYGL6U= +github.com/pmezard/go-difflib v1.0.1-0.20181226105442-5d4384ee4fb2/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.27.0 h1:GXm2NjJrPaiv/h1tb2UH8QfgC/hOf/+z0p6PT8o1w7A= +golang.org/x/crypto v0.27.0/go.mod h1:1Xngt8kV6Dvbssa53Ziq6Eqn0HqbZi5Z6R0ZpwQzt70= +golang.org/x/sys v0.25.0 h1:r+8e+loiHxRqhXVl6ML1nO3l1+oFoWbnlu2Ehimmi34= +golang.org/x/sys v0.25.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/testdata/example/alloc/main.go b/cannon/testdata/example/alloc/main.go new file mode 100644 index 000000000000..3c7af2f165f5 --- /dev/null +++ b/cannon/testdata/example/alloc/main.go @@ -0,0 +1,38 @@ +package main + +import ( + "encoding/binary" + "fmt" + "runtime" + + preimage "github.com/ethereum-optimism/optimism/op-preimage" +) + +func main() { + var mem []byte + po := preimage.NewOracleClient(preimage.ClientPreimageChannel()) + numAllocs := binary.LittleEndian.Uint64(po.Get(preimage.LocalIndexKey(0))) + allocSize := binary.LittleEndian.Uint64(po.Get(preimage.LocalIndexKey(1))) + + fmt.Printf("alloc program. numAllocs=%d allocSize=%d\n", numAllocs, allocSize) + var alloc int + for i := 0; i < int(numAllocs); i++ { + mem = make([]byte, allocSize) + alloc += len(mem) + // touch a couple pages to prevent the runtime from overcommitting memory + for j := 0; j < len(mem); j += 1024 { + mem[j] = 0xFF + } + printGCStats(alloc) + } + + fmt.Println("alloc program exit") + printGCStats(alloc) +} + +func printGCStats(alloc int) { + var m runtime.MemStats + runtime.ReadMemStats(&m) + fmt.Printf("allocated %d bytes. memstats: heap_alloc=%d next_gc=%d frees=%d mallocs=%d num_gc=%d\n", + alloc, m.HeapAlloc, m.NextGC, m.Frees, m.Mallocs, m.NumGC) +} diff --git a/cannon/testdata/example/claim/go.mod b/cannon/testdata/example/claim/go.mod new file mode 100644 index 000000000000..c70d9906f06c --- /dev/null +++ b/cannon/testdata/example/claim/go.mod @@ -0,0 +1,14 @@ +module claim + +go 1.21 + +toolchain go1.21.1 + +require github.com/ethereum-optimism/optimism v0.0.0 + +require ( + golang.org/x/crypto v0.27.0 // indirect + golang.org/x/sys v0.25.0 // indirect +) + +replace github.com/ethereum-optimism/optimism v0.0.0 => ../../../.. diff --git a/cannon/testdata/example/claim/go.sum b/cannon/testdata/example/claim/go.sum new file mode 100644 index 000000000000..c319c5651633 --- /dev/null +++ b/cannon/testdata/example/claim/go.sum @@ -0,0 +1,12 @@ +github.com/davecgh/go-spew v1.1.2-0.20180830191138-d8f796af33cc h1:U9qPSI2PIWSS1VwoXQT9A3Wy9MM3WgvqSxFWenqJduM= +github.com/davecgh/go-spew v1.1.2-0.20180830191138-d8f796af33cc/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38= +github.com/pmezard/go-difflib v1.0.1-0.20181226105442-5d4384ee4fb2 h1:Jamvg5psRIccs7FGNTlIRMkT8wgtp5eCXdBlqhYGL6U= +github.com/pmezard/go-difflib v1.0.1-0.20181226105442-5d4384ee4fb2/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.27.0 h1:GXm2NjJrPaiv/h1tb2UH8QfgC/hOf/+z0p6PT8o1w7A= +golang.org/x/crypto v0.27.0/go.mod h1:1Xngt8kV6Dvbssa53Ziq6Eqn0HqbZi5Z6R0ZpwQzt70= +golang.org/x/sys v0.25.0 h1:r+8e+loiHxRqhXVl6ML1nO3l1+oFoWbnlu2Ehimmi34= +golang.org/x/sys v0.25.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/testdata/example/claim/main.go b/cannon/testdata/example/claim/main.go new file mode 100644 index 000000000000..72b2064dec98 --- /dev/null +++ b/cannon/testdata/example/claim/main.go @@ -0,0 +1,54 @@ +package main + +import ( + "encoding/binary" + "fmt" + "os" + + preimage "github.com/ethereum-optimism/optimism/op-preimage" +) + +type rawHint string + +func (rh rawHint) Hint() string { + return string(rh) +} + +func main() { + _, _ = os.Stderr.Write([]byte("started!")) + + po := preimage.NewOracleClient(preimage.ClientPreimageChannel()) + hinter := preimage.NewHintWriter(preimage.ClientHinterChannel()) + + preHash := *(*[32]byte)(po.Get(preimage.LocalIndexKey(0))) + diffHash := *(*[32]byte)(po.Get(preimage.LocalIndexKey(1))) + claimData := *(*[8]byte)(po.Get(preimage.LocalIndexKey(2))) + + // Hints are used to indicate which things the program will access, + // so the server can be prepared to serve the corresponding pre-images. + hinter.Hint(rawHint(fmt.Sprintf("fetch-state %x", preHash))) + pre := po.Get(preimage.Keccak256Key(preHash)) + + // Multiple pre-images may be fetched based on a hint. + // E.g. when we need all values of a merkle-tree. + hinter.Hint(rawHint(fmt.Sprintf("fetch-diff %x", diffHash))) + diff := po.Get(preimage.Keccak256Key(diffHash)) + diffPartA := po.Get(preimage.Keccak256Key(*(*[32]byte)(diff[:32]))) + diffPartB := po.Get(preimage.Keccak256Key(*(*[32]byte)(diff[32:]))) + + // Example state-transition function: s' = s*a + b + s := binary.BigEndian.Uint64(pre) + a := binary.BigEndian.Uint64(diffPartA) + b := binary.BigEndian.Uint64(diffPartB) + fmt.Printf("computing %d * %d + %d\n", s, a, b) + sOut := s*a + b + + sClaim := binary.BigEndian.Uint64(claimData[:]) + if sOut != sClaim { + fmt.Printf("claim %d is bad! Correct result is %d\n", sOut, sClaim) + os.Exit(1) + } else { + fmt.Printf("claim %d is good!\n", sOut) + os.Exit(0) + } +} diff --git a/cannon/testdata/example/entry/go.mod b/cannon/testdata/example/entry/go.mod new file mode 100644 index 000000000000..2e4d29124f54 --- /dev/null +++ b/cannon/testdata/example/entry/go.mod @@ -0,0 +1,3 @@ +module entry + +go 1.21 diff --git a/cannon/testdata/example/entry/main.go b/cannon/testdata/example/entry/main.go new file mode 100644 index 000000000000..78866f88abeb --- /dev/null +++ b/cannon/testdata/example/entry/main.go @@ -0,0 +1,30 @@ +package main + +import ( + "os" + "runtime" +) + +func main() { + if len(os.Args) != 1 { + panic("expected 1 arg") + } + if os.Args[0] != "op-program" { + panic("unexpected arg0") + } + + var memProfileRate bool + env := os.Environ() + for _, env := range env { + if env != "GODEBUG=memprofilerate=0" { + panic("invalid envar") + } + memProfileRate = true + } + if !memProfileRate { + panic("memProfileRate env is not set") + } + if runtime.MemProfileRate != 0 { + panic("runtime.MemProfileRate is non-zero") + } +} diff --git a/cannon/example/hello/go.mod b/cannon/testdata/example/hello/go.mod similarity index 100% rename from cannon/example/hello/go.mod rename to cannon/testdata/example/hello/go.mod diff --git a/cannon/example/hello/main.go b/cannon/testdata/example/hello/main.go similarity index 100% rename from cannon/example/hello/main.go rename to cannon/testdata/example/hello/main.go diff --git a/cannon/testdata/example/multithreaded/go.mod b/cannon/testdata/example/multithreaded/go.mod new file mode 100644 index 000000000000..a075941f46c3 --- /dev/null +++ b/cannon/testdata/example/multithreaded/go.mod @@ -0,0 +1,3 @@ +module multithreaded + +go 1.21 diff --git a/cannon/testdata/example/multithreaded/main.go b/cannon/testdata/example/multithreaded/main.go new file mode 100644 index 000000000000..bc871f56e524 --- /dev/null +++ b/cannon/testdata/example/multithreaded/main.go @@ -0,0 +1,46 @@ +package main + +import ( + "fmt" + "os" + "runtime" + "sync" + "sync/atomic" +) + +func main() { + // try some concurrency! + var wg sync.WaitGroup + wg.Add(2) + var x atomic.Int32 + go func() { + x.Add(2) + wg.Done() + }() + go func() { + x.Add(40) + wg.Done() + }() + wg.Wait() + fmt.Printf("waitgroup result: %d\n", x.Load()) + + // channels + a := make(chan int, 1) + b := make(chan int) + c := make(chan int) + go func() { + t0 := <-a + b <- t0 + }() + go func() { + t1 := <-b + c <- t1 + }() + a <- 1234 + out := <-c + fmt.Printf("channels result: %d\n", out) + + // try a GC! (the runtime might not have run one yet) + runtime.GC() + _, _ = os.Stdout.Write([]byte("GC complete!\n")) +} diff --git a/codecov.yml b/codecov.yml index d4aeb396dbc1..96b195edabf9 100644 --- a/codecov.yml +++ b/codecov.yml @@ -9,7 +9,6 @@ comment: ignore: - "op-e2e" - - "op-bindings/bindings/*.go" - "**/*.t.sol" - "packages/contracts-bedrock/test/**/*.sol" - "packages/contracts-bedrock/scripts/**/*.sol" @@ -39,5 +38,4 @@ flag_management: target: 100% - name: bedrock-go-tests - name: contracts-tests - - name: chain-mon-tests - name: sdk-tests diff --git a/docker-bake.hcl b/docker-bake.hcl index da8f5fa60b0d..b09495948745 100644 --- a/docker-bake.hcl +++ b/docker-bake.hcl @@ -26,7 +26,7 @@ variable "IMAGE_TAGS" { variable "PLATFORMS" { // You can override this as "linux/amd64,linux/arm64". - // Only a specify a single platform when `--load` ing into docker. + // Only 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 = "" @@ -53,11 +53,11 @@ variable "OP_DISPUTE_MON_VERSION" { default = "${GIT_VERSION}" } -variable "OP_HEARTBEAT_VERSION" { +variable "OP_PROGRAM_VERSION" { default = "${GIT_VERSION}" } -variable "OP_PROGRAM_VERSION" { +variable "OP_SUPERVISOR_VERSION" { default = "${GIT_VERSION}" } @@ -69,6 +69,9 @@ variable "OP_CONDUCTOR_VERSION" { default = "${GIT_VERSION}" } +variable "OP_DEPLOYER_VERSION" { + default = "${GIT_VERSION}" +} target "op-node" { dockerfile = "ops/docker/op-stack-go/Dockerfile" @@ -148,19 +151,6 @@ target "op-conductor" { tags = [for tag in split(",", IMAGE_TAGS) : "${REGISTRY}/${REPOSITORY}/op-conductor:${tag}"] } -target "op-heartbeat" { - dockerfile = "ops/docker/op-stack-go/Dockerfile" - context = "." - args = { - 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 "da-server" { dockerfile = "ops/docker/op-stack-go/Dockerfile" context = "." @@ -186,17 +176,17 @@ target "op-program" { tags = [for tag in split(",", IMAGE_TAGS) : "${REGISTRY}/${REPOSITORY}/op-program:${tag}"] } -target "op-ufm" { - dockerfile = "./op-ufm/Dockerfile" - context = "./" - args = { - // op-ufm dockerfile has no _ in the args - GITCOMMIT = "${GIT_COMMIT}" - GITDATE = "${GIT_DATE}" - GITVERSION = "${GIT_VERSION}" +target "op-supervisor" { + dockerfile = "ops/docker/op-stack-go/Dockerfile" + context = "." + args = { + GIT_COMMIT = "${GIT_COMMIT}" + GIT_DATE = "${GIT_DATE}" + OP_SUPERVISOR_VERSION = "${OP_SUPERVISOR_VERSION}" } + target = "op-supervisor-target" 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-supervisor:${tag}"] } target "cannon" { @@ -212,58 +202,17 @@ target "cannon" { tags = [for tag in split(",", IMAGE_TAGS) : "${REGISTRY}/${REPOSITORY}/cannon:${tag}"] } -target "proxyd" { - dockerfile = "./proxyd/Dockerfile" - context = "./" - args = { - // proxyd dockerfile has no _ in the args - GITCOMMIT = "${GIT_COMMIT}" - GITDATE = "${GIT_DATE}" - GITVERSION = "${GIT_VERSION}" - } - platforms = split(",", PLATFORMS) - tags = [for tag in split(",", IMAGE_TAGS) : "${REGISTRY}/${REPOSITORY}/proxyd:${tag}"] -} - -target "indexer" { - dockerfile = "./indexer/Dockerfile" - context = "./" - args = { - // proxyd dockerfile has no _ in the args - GITCOMMIT = "${GIT_COMMIT}" - GITDATE = "${GIT_DATE}" - GITVERSION = "${GIT_VERSION}" - } - platforms = split(",", PLATFORMS) - tags = [for tag in split(",", IMAGE_TAGS) : "${REGISTRY}/${REPOSITORY}/indexer:${tag}"] -} - -target "ufm-metamask" { - dockerfile = "Dockerfile" - context = "./ufm-test-services/metamask" - args = { - // proxyd dockerfile has no _ in the args - GITCOMMIT = "${GIT_COMMIT}" - GITDATE = "${GIT_DATE}" - GITVERSION = "${GIT_VERSION}" - } - platforms = split(",", PLATFORMS) - tags = [for tag in split(",", IMAGE_TAGS) : "${REGISTRY}/${REPOSITORY}/ufm-metamask:${tag}"] -} - -target "chain-mon" { - dockerfile = "./ops/docker/Dockerfile.packages" +target "proofs-tools" { + dockerfile = "./ops/docker/proofs-tools/Dockerfile" context = "." args = { - // proxyd dockerfile has no _ in the args - GITCOMMIT = "${GIT_COMMIT}" - GITDATE = "${GIT_DATE}" - GITVERSION = "${GIT_VERSION}" + CHALLENGER_VERSION="90700b9bb37080961747420882b14578577d47cc" + KONA_VERSION="kona-client-v0.1.0-alpha.3" + ASTERISC_VERSION="v1.0.2" } - // this is a multi-stage build, where each stage is a possible output target, but wd-mon is all we publish - target = "wd-mon" + target="proofs-tools" platforms = split(",", PLATFORMS) - tags = [for tag in split(",", IMAGE_TAGS) : "${REGISTRY}/${REPOSITORY}/chain-mon:${tag}"] + tags = [for tag in split(",", IMAGE_TAGS) : "${REGISTRY}/${REPOSITORY}/proofs-tools:${tag}"] } target "ci-builder" { @@ -286,6 +235,20 @@ target "contracts-bedrock" { dockerfile = "./ops/docker/Dockerfile.packages" context = "." target = "contracts-bedrock" - platforms = split(",", PLATFORMS) + # See comment in Dockerfile.packages for why we only build for linux/amd64. + platforms = ["linux/amd64"] tags = [for tag in split(",", IMAGE_TAGS) : "${REGISTRY}/${REPOSITORY}/contracts-bedrock:${tag}"] } + +target "op-deployer" { + dockerfile = "ops/docker/op-stack-go/Dockerfile" + context = "." + args = { + GIT_COMMIT = "${GIT_COMMIT}" + GIT_DATE = "${GIT_DATE}" + OP_DEPLOYER_VERSION = "${OP_DEPLOYER_VERSION}" + } + target = "op-deployer-target" + platforms = split(",", PLATFORMS) + tags = [for tag in split(",", IMAGE_TAGS) : "${REGISTRY}/${REPOSITORY}/op-deployer:${tag}"] +} diff --git a/docs/README.md b/docs/README.md index da82e0a7f6aa..cabb2506b084 100644 --- a/docs/README.md +++ b/docs/README.md @@ -6,4 +6,3 @@ The directory layout is divided into the following sub-directories. - [`postmortems/`](./postmortems/): Timestamped post-mortem documents. - [`security-reviews`](./security-reviews/): Audit summaries and other security review documents. -- [`fault-proof-alpha`](./fault-proof-alpha): Information on the alpha version of the fault proof system. diff --git a/docs/fault-proof-alpha/README.md b/docs/fault-proof-alpha/README.md deleted file mode 100644 index f46e51ba7dd2..000000000000 --- a/docs/fault-proof-alpha/README.md +++ /dev/null @@ -1,27 +0,0 @@ -## Fault Proofs Alpha - -The fault proof alpha is a pre-release version of the OP Stack fault proof system. -This documentation provides an overview of the system and instructions on how to help -test the fault proof system. - -The overall design of this system along with the APIs and interfaces it exposes are not -finalized and may change without notice. - -### Getting Started - -* [Architecture Overview Video](https://www.youtube.com/watch?v=nIN5sNc6nQM) -* [Fault Proof Alpha Deployment Information (Goerli)](./deployments.md) -* [Security Researchers - Bug Bounty Program](./immunefi.md) - -### Contents - - * Specifications - * [Generic Fault Proof System](../../specs/fault-proof.md) - * [Generic Dispute Game Interface](../../specs/dispute-game-interface.md) - * [Fault Dispute Game](../../specs/fault-dispute-game.md) - * [Cannon VM](../../specs/cannon-fault-proof-vm.md) - * [Deployment Details](./deployments.md) - * [Manual Usage](./manual.md) - * [Creating Traces with Cannon](./cannon.md) - * [Automation with `op-challenger`](./run-challenger.md) - * [Challenging Invalid Output Proposals](./invalid-proposals.md) diff --git a/docs/fault-proof-alpha/cannon.md b/docs/fault-proof-alpha/cannon.md deleted file mode 100644 index 7013ca9de267..000000000000 --- a/docs/fault-proof-alpha/cannon.md +++ /dev/null @@ -1,92 +0,0 @@ -## Generate Traces with `cannon` and `op-program` - -Normally, `op-challenger` handles creating the required traces as part of responding to games. However, for manual -testing it may be useful to manually generate the trace. This can be done by running `cannon` directly. - -### Prerequisites - -- The cannon pre-state downloaded from [Goerli deployment](./deployments.md#goerli). -- A Goerli L1 node. - - An archive node is not required. - - Public RPC providers can be used, however a significant number of requests will need to be made which may exceed - rate limits for free plans. -- An OP-Goerli L2 archive node with `debug` APIs enabled. - - An archive node is required to ensure world-state pre-images remain available. - - Public RPC providers are generally not usable as they don’t support the `debug_dbGet` RPC method. - -### Compilation - -To compile the required programs, in the top level of the monorepo run: - -```bash -make cannon-prestate -``` - -This will compile the `cannon` executable to `cannon/bin/cannon` as well as the `op-program` executable used to fetch -pre-image data to `op-program/bin/op-program`. - -### Run Cannon - -To run cannon to generate a proof use: - -```bash -mkdir -p temp/cannon/proofs temp/cannon/snapshots temp/cannon/preimages - -./cannon/bin/cannon run \ - --pprof.cpu \ - --info-at '%10000000' \ - --proof-at '=' \ - --stop-at '=' \ - --proof-fmt 'temp/cannon/proofs/%d.json' \ - --snapshot-at '%1000000000' \ - --snapshot-fmt 'temp/cannon/snapshots/%d.json.gz' \ - --input \ - --output temp/cannon/stop-state.json \ - -- \ - ./op-program/bin/op-program \ - --network goerli \ - --l1 \ - --l2 \ - --l1.head \ - --l2.claim \ - --l2.head \ - --l2.blocknumber \ - --datadir temp/cannon/preimages \ - --log.format terminal \ - --server -``` - -The placeholders are: - -- `` the index in the trace to generate a proof for -- `` the index to stop execution at. Typically this is one instruction after `` to stop as soon - as the required proof has been generated. -- `` the prestate.json downloaded above. Note that this needs to precisely match the prestate used on-chain so - must be the downloaded version and not a version built locally. -- `` the Goerli L1 JSON RPC endpoint -- `` the OP-Goerli L2 archive node JSON RPC endpoint -- `` the hash of the L1 head block used for the dispute game -- `` the output root immediately prior to the disputed root in the L2 output oracle -- `` the hash of the L2 block that ``is from -- `` the block number that `` is from - -The generated proof will be stored in the `temp/cannon/proofs/` directory. The hash to use as the claim value is -the `post` field of the generated proof which provides the hash of the cannon state witness after execution of the step. - -Since cannon can be very slow to execute, the above command uses the `--snapshot-at` option to generate a snapshot of -the cannon state every 1000000000 instructions. Once generated, these snapshots can be used as the `--input` to begin -execution at that step rather than from the very beginning. Generated snapshots are stored in -the `temp/cannon/snapshots` directory. - -See `./cannon/bin/cannon --help` for further information on the options available. - -### Trace Extension - -Fault dispute games always use a trace with a fixed length of `2 ^ MAX_GAME_DEPTH`. The trace generated by `cannon` -stops when the client program exits, so this trace must be extended by repeating the hash of the final state in the -actual trace for all remaining steps. Cannon does not perform this trace extension automatically. - -If cannon stops execution before the trace index you requested a proof at, it simply will not generate a proof. When it -stops executing, it will write its final state to `temp/cannon/stop-state.json` (controlled by the `--output` option). -The `step` field of this state contains the last step cannon executed. Once the final step is known, rerun cannon to -generate the proof at that final step and use the `post` hash as the claim value for all later trace indices. diff --git a/docs/fault-proof-alpha/deployments.md b/docs/fault-proof-alpha/deployments.md deleted file mode 100644 index fb2816f15032..000000000000 --- a/docs/fault-proof-alpha/deployments.md +++ /dev/null @@ -1,38 +0,0 @@ -## Fault Proof Alpha Deployment Information - -### Goerli - -**Deployments** -| Contract | Address | -|--------------------------- |--------------------------------------------- | -| DisputeGameFactory (proxy) | `0xad9e5E6b39F55EE7220A3dC21a640B089196a89f` | -| DisputeGameFactory (impl) | `0x666C3d298B9c360990F901b3Eded4e7a9d7AD446` | -| BlockOracle | `0x7979b2D824A6A682D1dA25bD02E544bB66536032` | -| PreimageOracle | `0xE214d974dE12Cc8d096170AbC5EEBD18F08a044a` | -| MIPS VM | `0x78760b9A1Df5DDe037D64376BD4d1d675dC30f0f` | -| FaultDisputeGame (impl) | `0xBE2827A6c62d39b4C7933D592B6913412D5aBC77` | - -**Configuration** -- Absolute prestate hash: `0x0357393f50acca498e446f69292fce66c93a6d9038aa277b47c93fa46ce85108` -- Max game depth: `40` - - Supports an instruction trace up to `1,099,511,627,776` instructions long. -- Max game duration: `172,800 seconds` (2 days) - -### Local Devnet - -The local devnet includes a deployment of the fault proof alpha. To start the devnet, in the top level of this repo, -run: - -```bash -make devnet-up -``` - -| Input | Value | -|----------------------|-------------------------------------------------------------| -| Dispute Game Factory | Run `jq -r .DisputeGameFactoryProxy .devnet/addresses.json` | -| Absolute Prestate | `op-program/bin/prestate.json` | -| Max Depth | 30 | -| Max Game Duration | 1200 (20 minutes) | - -See the [op-challenger README](../../op-challenger#running-with-cannon-on-local-devnet) for information on -running `op-challenger` against the local devnet. diff --git a/docs/fault-proof-alpha/immunefi.md b/docs/fault-proof-alpha/immunefi.md deleted file mode 100644 index f3ad942950b0..000000000000 --- a/docs/fault-proof-alpha/immunefi.md +++ /dev/null @@ -1,100 +0,0 @@ -# Fault Proof Alpha Bounty - -The fault proof alpha system will be deployed to the Goerli testnet as a sidecar to the current system. During the alpha, the outcome of fault dispute games will have no influence on the official bridge contracts nor the official `L2OutputOracle`. -During this early phase of ongoing development, we invite security researchers and developers to engage with the system and attempt to break its current components. - -The current system is not production ready, however the core infrastructure for creating an instruction trace ([Cannon][cannon] + the [`op-program`][op-program]), the off-chain challenge agent ([`op-challenger`][op-challenger]), -and the on-chain infrastructure for the [Dispute Game][dispute-game] are all in place. - -For the Fault Proof Alpha security review, we've pinned `546fb2c7a5796b7fe50b0b7edc7666d3bd281d6f` as the commit hash in the monorepo. This commit hash was the head of the `develop` branch at the time of the alpha's launch. All -security reviews and PoCs should be derived from this commit hash, as the contracts and off-chain agents are being updated frequently at this stage of development. - -### Resources - -> **Note** -> Prior to moving forward, we recommended reading into the technical documentation for the components of Fault Proof Alpha. - -* [Cannon][cannon] & [Cannon Contracts][cannon-contracts] - * [Cannon VM Specs][cannon-vm-specs] -* [`op-program`][op-program] - * [Fault Proof Specs][fault-proof-specs] -* [Dispute Game][dispute-game] - * [Fault Dispute Game Specs][fault-dispute-specs] -* [`op-challenger`][op-challenger] - -## Known Issues -The alpha system is not prepared for mainnet, and as such, there are a number of known issues that we are working on fixing and components of the system that must be improved prior to it being sustainable. - -1. DoS attacks are currently likely to occur due to the lack of bonds in the alpha system as well as the lack of an extra layer of bisection in the dispute game to reduce the running time of [Cannon][cannon]. It is possible to - DoS the network of honest challengers by creating a large number of invalid challenges. -1. Limitations of pre-image oracle inputs. The pre-image oracle currently does not support the full specified set of inputs. - In particular, arbitrary pre-image value size and preimage key types other than `local` (type 1) `keccak256` (type 2) are not supported. - The pre-image value size is limited to what the current oracle can verify: gas and calldata limits constrain this more than the pre-images are, rendering some state-transitions that include large pre-images impossible to prove with the oracle as-is. This does not affect most proofs. L1/L2 activity that breaks this pre-image size limitation does not qualify for the bounty. - The remaining pre-images types are not supported, as the types are not used by the current op-program, but may be supported for future program proving, e.g. type 3 for application-specific proofs, and new types 4, 5, etc. for ethereum extensions like SHA2 and KZG point verification. -1. Non-standard rollup chain configurations do not qualify. Output roots span a range of L2 blocks derived from a range of L1 blocks, built on top of the previous agreed upon L2 state. By breaking time or input-range chain parameters, the proof program may not complete or fail in undefined ways. -### Reviewer Notes -1. **Any bug report without a proof-of-concept in the form of a test in `op-e2e` will not be considered a valid bug report.** - 1. A guide on creating an e2e test with an invalid output proposal to dispute can be found [here][invalid-proposal-doc]. -1. Exploits against the alpha system that take advantage of the aforementioned issues will not be considered valid bug reports. -1. The [AlphabetVM][alphabet-vm] is not equivalent to the MIPS thread context in behavior. Bug reports submitted against the [AlphabetVM][alphabet-vm] will not be considered valid bug reports, this mock VM is used solely for testing. - -### Plans for the next iteration -Going past alpha, we have a number of plans for improving the system and fixing some of the aforementioned issues in preparation for full integration with the current system. These include: -1. Including an extra layer of bisection over output roots prior to beginning execution trace bisection, enabling the off-chain challenge agents to only need to run [Cannon][cannon] over a single block rather than a string of blocks. This will heavily reduce the hardware cost of running the off - chain challenge agent and provide an upper bound on what Cannon will have to execute, allowing for sparse proposals. -1. Adding bonds to the system to preserve incentive compatibility. In the alpha, defenses of the honest L2 state are not incentivized, which also means that attacks on the honest L2 state are not disincentivized. Adding bonds to each claim - made in the dispute game will preserve the incentives of the system as well as make it more costly to attack. -1. Improving the [Dispute Game][dispute-game]'s resolution algorithm to reduce the number of interactions that the off-chain challenge agents need to have with the on-chain dispute game. This will reduce the cost of running the off-chain challenge - agent, ensure that an honest challenger's participation always results in a profitable move, and possibly prevent the need for challengers to respond to every invalid claim within the game. -1. The fault proof system will be integrated into the bridge contracts, specifically the `OptimismPortal`, in order to enable the system to be used in production and verify the correctness of output roots that withdrawals are proven against. -1. The pre-image oracle limitations related to pre-image size and typing support will be addressed to cover the full scope of valid onchain L1 and L2 activity. -## Bounty Scope -The scope of the bounty is limited to the fault proof alpha system. This includes the following components, in order of security review priority: -1. **Cannon**: The [Cannon][cannon] binary and its dependencies, as defined in the monorepo. The archived legacy version, and alternative implementations, do not qualify. -1. **op-program**: The [`op-program`][op-program] binary and its dependencies. -1. **Smart Contracts** - 1. The [Cannon][cannon-contracts] contracts and their dependencies. - 1. The [Dispute Game][dispute-game] and their dependencies. -1. **op-challenger**: The [`op-challenger`][op-challenger] binary and its dependencies. - -As mentioned above in the "[Plans for the next iteration](#plans-for-the-next-iteration)" section, there will soon be a number of large architectural changes to the [dispute smart contracts][dispute-game] -as well as the [`op-challenger`][op-challenger] in order to support the features that will bring the system to a production ready state. During this time, it is unlikely that [Cannon][cannon], the [Cannon contracts][cannon-contracts], -or the [`op-program`][op-program] will change significantly, and as such, we recommend focusing efforts primarily on these components. - -There are several key invariants that must be maintained in order for the system to be considered secure. A bounty report must demonstrate a bug which breaks one of these invariants. -1. **Cannon** - 1. [Cannon][cannon]'s `mipsevm` must be functionally equivalent to the [MIPS thread context][cannon-contracts] implemented in Solidity. Any disparities that result in different `op-program` execution are a bug. - 1. Both [Cannon][cannon] and the on-chain [MIPS thread context][cannon-contracts] must produce the same output given an identical setup state and input data. - 1. Both [Cannon][cannon] and the on-chain [MIPS thread context][cannon-contracts] must produce a deterministic output given an identical setup state and input data. - 1. Both [Cannon][cannon] and the on-chain [MIPS thread context][cannon-contracts] must never panic on a state transition with honest input data / setup state. - 1. Note: There are a number of instructions from MIPS, and system calls in Linux, that Cannon does not support. Specifically, this invariant covers panic conditions within the realm of supported instructions and valid honest input data / setup state where cannon otherwise should have completed execution and produced a valid/invalid opinion about the state transition. The op-program may contain "dead code", non-reachable invalid instructions that do not affect the output. - 1. The `PreimageOracle` contract's local data storage must not be able to be corrupted by an external party. -1. **op-program** - 1. The [`op-program`][op-program] must produce a deterministic output given an identical setup state and input data. -1. **Dispute Game Contracts** - 1. Assuming the presence of an `honest challenger` (defined by the behavior of the [`op-challenger`][op-challenger]) participating within the game, the `FaultDisputeGame` utilizing the `MIPS` VM **must always** resolve favorably towards the honest L2 state. - 1. *Note (1)*: The presence of an honest challenger implies that the honest challenger has exhausted all moves it would have made - any game where the honest challenger was unable to exhaust its move set can resolve unfavorably to their desired outcome. The aforementioned DoS vector is one such reason the honest challenger may not perform all its moves. -1. **op-challenger** - 1. The honest `op-challenger` must never make a claim that does not support the honest outcome of the dispute game (i.e., the outcome which favors the honest L2 state being considered canonical). - 1. *Note:* Because of the rules in the current solving / resolution mechanism, the challenger will counter all claims that have a different view of the root claim's validity. While this is an inefficiency, it is not considered a violation of this invariant, as this behavior is necessary to ensure that all invalid claims have been countered. - -Bug reports in the form of a proof-of-concept `op-e2e` test that demonstrates a violation of any of the above invariants will be considered valid bug reports and eligible for a reward*. - -* All proof of concept reports should be configured to run against the parameters of the system deployed on the `goerli` testnet or with the environment defined in the `op-e2e` `faultproof_test.go` file. Bug reports that otherwise violate the above invariants -but use custom configurations will be assessed on a case by case basis, and their validity is not guaranteed. - -### Bounty Rewards -See our bounty program on [Immunefi][immunefi] for information regarding reward sizes. - - -[cannon]: https://github.com/ethereum-optimism/optimism/tree/develop/cannon -[cannon-vm-specs]: https://github.com/ethereum-optimism/optimism/blob/develop/specs/cannon-fault-proof-vm.md -[dispute-game]: https://github.com/ethereum-optimism/optimism/tree/develop/packages/contracts-bedrock/src/dispute -[fault-dispute-specs]: https://github.com/ethereum-optimism/optimism/blob/develop/specs/fault-dispute-game.md -[cannon-contracts]: https://github.com/ethereum-optimism/optimism/tree/develop/packages/contracts-bedrock/src/cannon -[op-program]: https://github.com/ethereum-optimism/optimism/tree/develop/op-program -[op-challenger]: https://github.com/ethereum-optimism/optimism/tree/develop/op-challenger -[alphabet-vm]: https://github.com/ethereum-optimism/optimism/blob/c1cbacef0097c28f999e3655200e6bd0d4dba9f2/packages/contracts-bedrock/test/FaultDisputeGame.t.sol#L977-L1005 -[fault-proof-specs]: https://github.com/ethereum-optimism/optimism/blob/develop/specs/fault-proof.md -[immunefi]: https://immunefi.com/bounty/optimism/ -[invalid-proposal-doc]: https://github.com/ethereum-optimism/optimism/blob/develop/docs/fault-proof-alpha/invalid-proposals.md diff --git a/docs/fault-proof-alpha/invalid-proposals.md b/docs/fault-proof-alpha/invalid-proposals.md deleted file mode 100644 index f7ae4cb6dc6a..000000000000 --- a/docs/fault-proof-alpha/invalid-proposals.md +++ /dev/null @@ -1,11 +0,0 @@ -## Challenging Invalid Output Proposals - -The dispute game factory deployed to Goerli reads from the permissioned L2 Output Oracle contract. This restricts games -to challenging valid output proposals and an honest challenger should win every game. To test creating games that -challenge an invalid output proposal, a custom chain is required. The simplest way to do this is using the end-to-end -test utilities in [`op-e2e`](https://github.com/ethereum-optimism/optimism/tree/develop/op-e2e). - -A simple starting point has been provided in the `TestCannonProposedOutputRootInvalid` test case -in [`faultproof_test.go`](https://github.com/ethereum-optimism/optimism/blob/6e174ae2b2587d9ac5e2930d7574f85d254ca8b4/op-e2e/faultproof_test.go#L334). -This is a table test that takes the output root to propose, plus functions for move and step to counter the honest -claims. The test asserts that the defender always wins and thus the output root is found to be invalid. diff --git a/docs/fault-proof-alpha/manual.md b/docs/fault-proof-alpha/manual.md deleted file mode 100644 index 36580defa0d6..000000000000 --- a/docs/fault-proof-alpha/manual.md +++ /dev/null @@ -1,112 +0,0 @@ -## Manual Fault Proof Interactions - -### Creating a Game - -The process of disputing an output root starts by creating a new dispute game. There are conceptually three key inputs -required for a dispute game: - -- The output root being disputed -- The agreed output root the derivation process will start from -- The L1 head block that defines the canonical L1 chain containing all required batch data to perform the derivation - -The creator of the game selects the output root to dispute. It is identified by its L2 block number which can be used to -look up the full details in the L2 output oracle. - -The agreed output root is defined as the output root immediately prior to the disputed output root in the L2 output -oracle. Therefore, a dispute game should only be created for the first invalid output root. If it is successfully -disputed, all output roots after it are considered invalid by inference. - -The L1 head block can be any L1 block where the disputed output root is present in the L2 output oracle. Proposers -should therefore ensure that all batch data has been submitted to L1 before submitting a proposal. The L1 head block is -recorded in the `BlockOracle` and then referenced by its block number. - -Creating a game requires two separate transactions. First the L1 head block is recorded in the `BlockOracle` by calling -its `checkpoint` function. This records the parent of the block the transaction is included in. The `BlockOracle` emits -a log `Checkpoint(blockNumber, blockHash, childTimestamp)`. - -Now, using the L1 head along with output root info available in the L2 output oracle, cannon can be executed to -determine the root claim to use when creating the game. In simple cases, where the claim is expected to be incorrect, an -arbitrary hash can be used for claim values. For more advanced cases [cannon can be used](./cannon.md) to generate a -trace, including the claim values to use at specific steps. Note that it is not valid to create a game that disputes an -output root, using the final hash from a trace that confirms the output root is valid. To dispute an output root -successfully, the trace must resolve that the disputed output root is invalid. This is indicated by the first byte of -the claim value being set to the invalid [VM status](../../specs/cannon-fault-proof-vm.md#state-hash) (`0x01`). - -The game can then be created by calling the `create` method on the `DisputeGameFactory` contract. This requires three -parameters: - -- `gameType` - a `uint8` representing the type of game to create. For fault dispute games using cannon and op-program - traces, the game type is 0. -- `rootClaim` - a `bytes32` hash of the final state from the trace. -- `extraData` - arbitrary bytes which are used as the initial inputs for the game. For fault dispute games using cannon - and op-program traces, this is the abi encoding of `(uint256(l2_block_number), uint256(l1_checkpoint))`. - - `l2_block_number` is the L2 block number from the output root being disputed - - `l1_checkpoint` is the L1 block number recorded by the `BlockOracle` checkpoint - -This emits a log event `DisputeGameCreated(gameAddress, gameType, rootClaim)` where `gameAddress` is the address of the -newly created dispute game. - -The helper script, [create_game.sh](../../op-challenger#create_gamesh) can be used to easily create a new dispute -game and also acts as an example of using `cast` to manually create a game. - -### Performing Moves - -The dispute game progresses by actors countering existing claims via either the `attack` or `defend` methods in -the `FaultDisputeGame` contract. Note that only `attack` can be used to counter the root claim. In both cases, there are -two inputs required: - -- `parentIndex` - the index in the claims array of the parent claim that is being countered. -- `claim` - a `bytes32` hash of the state at the trace index corresponding to the new claim’s position. - -The helper script, [move.sh](../../op-challenger#movesh), can be used to easily perform moves and also -acts as an example of using `cast` to manually call `attack` and `defend`. - -### Performing Steps - -Attacking or defending are the only available actions before the maximum depth of the game is reached. To counter claims -at the maximum depth, a step must be performed instead. Calling the `step` method in the `FaultDisputeGame` contract -counters a claim at the maximum depth by running a single step of the cannon VM on chain. The `step` method will revert -unless the cannon execution confirms the claim being countered is invalid. Note, if an actor's clock runs out at any -point, the game can be [resolved](#resolving-a-game). - -The inputs for step are: - -- `claimIndex` - the index in the claims array of the claim that is being countered -- `isAttack` - Similar to regular moves, steps can either be attacking or defending -- `stateData` - the full cannon state witness to use as the starting state for execution -- `proof` - the additional proof data for the state witness required by cannon to perform the step - -When a step is attacking, the caller is asserting that the claim at `claimIndex` is incorrect, and the claim for -the previous trace index (made at a previous level in the game) was correct. The `stateData` must be the pre-image for -the agreed correct hash at the previous trace index. The call to `step` will revert if the post-state from cannon -matches the claim at `claimIndex` since the on-chain execution has proven the claim correct and it should not be -countered. - -When a step is defending, the caller is asserting that the claim at `claimIndex` is correct, and the claim for -the next trace index (made at a previous level in the game) is incorrect. The `stateData` must be the pre-image for the -hash in the claim at `claimIndex`. - -The `step` function will revert with `ValidStep()` if the cannon execution proves that the claim attempting to be -countered is correct. As a result, claims at the maximum game depth can only be countered by a valid execution of the -single instruction in cannon running on-chain. - -#### Populating the Pre-image Oracle - -When the instruction to be executed as part of a `step` call reads from some pre-image data, that data must be loaded -into the pre-image oracle prior to calling `step`. -For [local pre-image keys](../../specs/fault-proof.md#type-1-local-key), the pre-image must be populated via -the `FaultDisputeGame` contract by calling the `addLocalData` function. -For [global keccak256 keys](../../specs/fault-proof.md#type-2-global-keccak256-key), the data should be added directly -to the pre-image oracle contract. - -### Resolving a Game - -The final action required for a game is to resolve it by calling the `resolve` method in the `FaultDisputeGame` -contract. This can only be done once the clock of the left-most uncontested claim’s parent has expired. A game can only -be resolved once. - -There are no inputs required for the `resolve` method. When successful, a log event is emitted with the game’s final -status. - -The helper script, [resolve.sh](../../op-challenger#resolvesh), can be used to easily resolve a game and also acts as an -example of using `cast` to manually call `resolve` and understand the result. diff --git a/docs/fault-proof-alpha/run-challenger.md b/docs/fault-proof-alpha/run-challenger.md deleted file mode 100644 index 9c9c2ff9a487..000000000000 --- a/docs/fault-proof-alpha/run-challenger.md +++ /dev/null @@ -1,64 +0,0 @@ -## Running op-challenger - -`op-challenger` is a program that implements the honest actor algorithm to automatically “play” the dispute games. - -### Prerequisites - -- The cannon pre-state downloaded from [Goerli deployment](./deployments.md#goerli). -- An account on the Goerli testnet with funds available. The amount of GöETH required depends on the number of claims - the challenger needs to post, but 0.01 ETH should be plenty to start. -- A Goerli L1 node. - - An archive node is not required. - - Public RPC providers can be used, however a significant number of requests will need to be made which may exceed - rate limits for free plans. -- An OP-Goerli L2 archive node with `debug` APIs enabled. - - An archive node is required to ensure world-state pre-images remain available. - - Public RPC providers are generally not usable as they don’t support the `debug_dbGet` RPC method. -- Approximately 3.5Gb of disk space for each game being played. - -### Starting op-challenger - -When executing `op-challenger`, there are a few placeholders that need to be set to concrete values: - -- `` the Goerli L1 JSON RPC endpoint -- `` the address of the dispute game factory contract (see - the [Goerli deployment details](./deployments.md#goerli)) -- `` the prestate.json downloaded above. Note that this needs to precisely match the prestate used on-chain so - must be the downloaded version and not a version built locally (see the [Goerli deployment details](./deployments.md#goerli)) -- `` the OP-Goerli L2 archive node JSON RPC endpoint -- `` the private key for a funded Goerli account. For other ways to specify the account to use - see `./op-challenger/bin/op-challenger --help` - -From inside the monorepo directory, run the challenger after setting these placeholders. - -```bash -# Build the required components -make op-challenger op-program cannon - -# Run op-challenger -./op-challenger/bin/op-challenger \ - --trace-type cannon \ - --l1-eth-rpc \ - --game-factory-address \ - --datadir temp/challenger-goerli \ - --cannon-network goerli \ - --cannon-bin ./cannon/bin/cannon \ - --cannon-server ./op-program/bin/op-program \ - --cannon-prestate \ - --l2-eth-rpc \ - --private-key -``` - - -### Restricting Games to Play - -By default `op-challenger` will generate traces and respond to any game created by the dispute game factory contract. On -a public testnet like Goerli, that could be a large number of games, requiring significant CPU and disk resources. To -avoid this, `op-challenger` supports specifying an allowlist of games for it to respond to with the `--game-allowlist` -option. - -```bash -./op-challenger/bin/op-challenger \ - ... \ - --game-allowlist ... -``` diff --git a/docs/postmortems/2022-02-02-inflation-vuln.md b/docs/postmortems/2022-02-02-inflation-vuln.md index 11574eed70c2..a755b0fdfe38 100644 --- a/docs/postmortems/2022-02-02-inflation-vuln.md +++ b/docs/postmortems/2022-02-02-inflation-vuln.md @@ -5,7 +5,7 @@ It also details our response, lessons learned, and subsequent changes to our pro ## Incident Summary -A vulnerability in Optimism’s fork of [Geth](https://github.com/ethereum/go-ethereum) (which we refer to as [L2Geth](../../l2geth/README.md)) was reported +A vulnerability in Optimism’s fork of [Geth](https://github.com/ethereum/go-ethereum) (which we refer to as [L2Geth](https://github.com/ethereum-optimism/optimism-legacy/blob/8205f678b7b4ac4625c2afe351b9c82ffaa2e795/l2geth/README.md)) was reported to us by [Jay Freeman](https://twitter.com/saurik) (AKA saurik) on February 2nd, 2022. If exploited, this vulnerability would allow anyone to mint an unbounded amount of ETH on Optimism. @@ -133,7 +133,7 @@ the PR (36,311 lines added, 47,430 lines removed), which consumed the attention engineering team with a sense of urgency for several months. An additional factor contributing to this bug was the significant complexity of the -[L2Geth](https://github.com/ethereum-optimism/optimism/tree/master/l2geth) codebase, which is a fork +[L2Geth](https://github.com/ethereum-optimism/optimism-legacy/blob/8205f678b7b4ac4625c2afe351b9c82ffaa2e795/l2geth) codebase, which is a fork of [Geth](https://github.com/ethereum/go-ethereum). Geth itself is already a very complex codebase. The changes introduced to L2Geth in order to support the OVM made it much more complex, such that very few people properly understood how it worked. diff --git a/docs/security-reviews/2022_12-DepositTransaction-RuntimeVerification.pdf b/docs/security-reviews/2022_12-DepositTransaction-RuntimeVerification.pdf new file mode 100644 index 000000000000..36d31dfb7f9c Binary files /dev/null and b/docs/security-reviews/2022_12-DepositTransaction-RuntimeVerification.pdf differ diff --git a/docs/security-reviews/2023_12_Trust_SuperchainConfigUpgrade.pdf b/docs/security-reviews/2023_12_SuperchainConfigUpgrade_Trust.pdf similarity index 100% rename from docs/security-reviews/2023_12_Trust_SuperchainConfigUpgrade.pdf rename to docs/security-reviews/2023_12_SuperchainConfigUpgrade_Trust.pdf diff --git a/docs/security-reviews/2024_05-FaultProofs-Sherlock.pdf b/docs/security-reviews/2024_05-FaultProofs-Sherlock.pdf new file mode 100644 index 000000000000..ba6da27b4b26 Binary files /dev/null and b/docs/security-reviews/2024_05-FaultProofs-Sherlock.pdf differ diff --git a/docs/security-reviews/2024_05_SafeLivenessExtensions-Cantina.pdf b/docs/security-reviews/2024_05_SafeLivenessExtensions-Cantina.pdf index 13637137a507..c1135ee4d891 100644 Binary files a/docs/security-reviews/2024_05_SafeLivenessExtensions-Cantina.pdf and b/docs/security-reviews/2024_05_SafeLivenessExtensions-Cantina.pdf differ diff --git a/docs/security-reviews/2024_08_report-cantinacode-coinbase-fault-proofs-mips.pdf b/docs/security-reviews/2024_08_report-cantinacode-coinbase-fault-proofs-mips.pdf new file mode 100644 index 000000000000..2a60171307ea Binary files /dev/null and b/docs/security-reviews/2024_08_report-cantinacode-coinbase-fault-proofs-mips.pdf differ diff --git a/docs/security-reviews/2024_08_report-cb-fault-proofs-non-mips.pdf b/docs/security-reviews/2024_08_report-cb-fault-proofs-non-mips.pdf new file mode 100644 index 000000000000..d9adce78d97b Binary files /dev/null and b/docs/security-reviews/2024_08_report-cb-fault-proofs-non-mips.pdf differ diff --git a/docs/security-reviews/README.md b/docs/security-reviews/README.md new file mode 100644 index 000000000000..fd41977b9f10 --- /dev/null +++ b/docs/security-reviews/README.md @@ -0,0 +1,31 @@ +# Security Reviews + +The following is a list of past security reviews. + +Each review is focused on a different part of the codebase, and at a different point in time. +Please see the report for the specific details. + +| Date | Reviewer | Focus | Report Link | +| ------- | -------------------- | ------------------------- | --------------------------------------------------------------------------------------------------------------------------------------------------------------------- | +| 2020-10 | Trail of Bits | Rollup | [2020_10-TrailOfBits.pdf](./2020_10-Rollup-TrailOfBits.pdf) | +| 2020-11 | Dapphub | ECDSA Wallet | [2020_11-Dapphub-ECDSA_Wallet.pdf](./2020_11-Dapphub-ECDSA_Wallet.pdf) | +| 2021-03 | OpenZeppelin | OVM and Rollup | [2021_03-OVM_and_Rollup-OpenZeppelin.pdf](./2021_03-OVM_and_Rollup-OpenZeppelin.pdf) | +| 2021-03 | ConsenSys Diligence | Safety Checker | [2021_03-SafetyChecker-ConsenSysDiligence.pdf](./2021_03-SafetyChecker-ConsenSysDiligence.pdf) | +| 2022-05 | Zeppelin | Bedrock Contracts | [2022_05-Bedrock_Contracts-Zeppelin.pdf](./2022_05-Bedrock_Contracts-Zeppelin.pdf) | +| 2022-05 | Trail of Bits | OpNode | [2022_05-OpNode-TrailOfBits.pdf](./2022_05-OpNode-TrailOfBits.pdf) | +| 2022-08 | Sigma Prime | Bedrock GoLang | [2022_08-Bedrock_GoLang-SigmaPrime.pdf](./2022_08-Bedrock_GoLang-SigmaPrime.pdf) | +| 2022-09 | Zeppelin | Bedrock and Periphery | [2022_09-Bedrock_and_Periphery-Zeppelin.pdf](./2022_09-Bedrock_and_Periphery-Zeppelin.pdf) | +| 2022-10 | Spearbit | Drippie | [2022_10-Drippie-Spearbit.pdf](./2022_10-Drippie-Spearbit.pdf) | +| 2022-11 | Trail of Bits | Invariant Testing | [2022_11-Invariant_Testing-TrailOfBits.pdf](./2022_11-Invariant_Testing-TrailOfBits.pdf) | +| 2022-12 | Runtime Verification | Deposit Transaction | [2022_12-DepositTransaction-RuntimeVerification.pdf](./2022_12-DepositTransaction-RuntimeVerification.pdf) | +| 2023-01 | Trail of Bits | Bedrock Updates | [2023_01-Bedrock_Updates-TrailOfBits.pdf](./2023_01-Bedrock_Updates-TrailOfBits.pdf) | +| 2023-01 | Sherlock | Bedrock | [Sherlock Bedrock Contest](https://audits.sherlock.xyz/contests/38) | +| 2023-03 | Sherlock | Bedrock Fixes | [Sherlock Bedrock Contest - Fix Review](https://audits.sherlock.xyz/contests/63) | +| 2023-12 | Trust | Superchain Config Upgrade | [2023_12_SuperchainConfigUpgrade_Trust.pdf](./2023_12_SuperchainConfigUpgrade_Trust.pdf) | +| 2024-02 | Runtime Verification | Pausability | [Kontrol Verification][kontrol] | +| 2024-02 | Cantina | MCP L1 | [2024_02-MCP_L1-Cantina.pdf](./2024_02-MCP_L1-Cantina.pdf) | +| 2024-03 | Sherlock | MCP L1 | [Sherlock Optimism Fault Proofs Contest](https://audits.sherlock.xyz/contests/205) | +| 2024-08 | Cantina | Fault proof MIPS | [Base Fault Proof MIPS](./2024_08_report-cantinacode-coinbase-fault-proofs-mips.pdf) +| 2024-08 | Spearbit | Fault proof no-MIPS | [Base Fault Proof No MIPS](./2024_08_report-cb-fault-proofs-non-mips.pdf) + +[kontrol]: https://github.com/ethereum-optimism/optimism/blob/876e16ad04968f0bb641eb76f98eb77e7e1a3e16/packages/contracts-bedrock/test/kontrol/README.md 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 09cf2100ede3..000000000000 --- a/endpoint-monitor/CHANGELOG.md +++ /dev/null @@ -1,31 +0,0 @@ -# @eth-optimism/endpoint-monitor - -## 1.0.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 - -## 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/Makefile b/endpoint-monitor/Makefile deleted file mode 100644 index a5c17d519e7d..000000000000 --- a/endpoint-monitor/Makefile +++ /dev/null @@ -1,28 +0,0 @@ -GITCOMMIT ?= $(shell git rev-parse HEAD) -GITDATE ?= $(shell git show -s --format='%ct') -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 - -clean: - rm ./bin/endpoint-monitor - -test: - go test -v ./... - -lint: - golangci-lint run ./... - -.PHONY: \ - build \ - clean \ - test \ - lint 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 02585f0a87a5..000000000000 --- a/endpoint-monitor/package.json +++ /dev/null @@ -1,6 +0,0 @@ -{ - "name": "@eth-optimism/endpoint-monitor", - "version": "1.0.4", - "private": true, - "dependencies": {} -} diff --git a/go.mod b/go.mod index da8d806374c7..5e400147f8e7 100644 --- a/go.mod +++ b/go.mod @@ -3,124 +3,129 @@ module github.com/ethereum-optimism/optimism go 1.21 require ( - github.com/BurntSushi/toml v1.3.2 - github.com/DataDog/zstd v1.5.2 + github.com/BurntSushi/toml v1.4.0 github.com/andybalholm/brotli v1.1.0 - github.com/btcsuite/btcd v0.24.0 + github.com/btcsuite/btcd v0.24.2 github.com/btcsuite/btcd/chaincfg/chainhash v1.1.0 - github.com/cockroachdb/pebble v0.0.0-20231018212520-f6cde3fc2fa4 + github.com/cockroachdb/pebble v1.1.2 github.com/consensys/gnark-crypto v0.12.1 - github.com/crate-crypto/go-kzg-4844 v0.7.0 + github.com/crate-crypto/go-kzg-4844 v1.0.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-20240522134500-19555bdbdc95 - github.com/ethereum/go-ethereum v1.13.15 - github.com/ethstorage/da-server v0.0.0-20240628094857-ed2ee4ff52d9 + github.com/ethereum-optimism/superchain-registry/superchain v0.0.0-20240923105504-b1c8d0c4419b + github.com/ethereum/go-ethereum v1.14.8 + github.com/ethstorage/da-server v0.0.0-20240925084712-169d238000e5 github.com/fsnotify/fsnotify v1.7.0 - github.com/go-chi/chi/v5 v5.0.12 - github.com/go-chi/docgen v1.2.0 github.com/golang/snappy v0.0.5-0.20220116011046-fa5810519dcb github.com/google/go-cmp v0.6.0 github.com/google/gofuzz v1.2.1-0.20220503160820-4a35382e8fc8 - github.com/google/uuid v1.6.0 github.com/hashicorp/go-multierror v1.1.1 - github.com/hashicorp/golang-lru/v2 v2.0.5 - github.com/hashicorp/raft v1.6.1 - github.com/hashicorp/raft-boltdb v0.0.0-20231211162105-6c830fa4535e - github.com/holiman/uint256 v1.2.4 + github.com/hashicorp/golang-lru/v2 v2.0.7 + github.com/hashicorp/raft v1.7.1 + github.com/hashicorp/raft-boltdb/v2 v2.3.0 + github.com/holiman/uint256 v1.3.1 github.com/ipfs/go-datastore v0.6.0 github.com/ipfs/go-ds-leveldb v0.5.0 - github.com/jackc/pgtype v1.14.3 - github.com/jackc/pgx/v5 v5.5.5 - github.com/libp2p/go-libp2p v0.32.0 + github.com/klauspost/compress v1.17.9 + github.com/kurtosis-tech/kurtosis/api/golang v1.3.0 + github.com/libp2p/go-libp2p v0.36.2 github.com/libp2p/go-libp2p-mplex v0.9.0 - github.com/libp2p/go-libp2p-pubsub v0.10.1 + github.com/libp2p/go-libp2p-pubsub v0.12.0 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/minio/minio-go/v7 v7.0.76 github.com/multiformats/go-base32 v0.1.0 - github.com/multiformats/go-multiaddr v0.12.4 + github.com/multiformats/go-multiaddr v0.13.0 github.com/multiformats/go-multiaddr-dns v0.3.1 + github.com/naoina/toml v0.1.2-0.20170918210437-9fafd6967416 github.com/olekukonko/tablewriter v0.0.5 - github.com/onsi/gomega v1.31.1 + github.com/onsi/gomega v1.34.1 github.com/pkg/errors v0.9.1 github.com/pkg/profile v1.7.0 - github.com/prometheus/client_golang v1.19.0 + github.com/prometheus/client_golang v1.20.4 + github.com/protolambda/ctxlock v0.1.0 github.com/stretchr/testify v1.9.0 - github.com/urfave/cli/v2 v2.27.1 - 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.20.0 - golang.org/x/time v0.5.0 - gorm.io/driver/postgres v1.5.7 - gorm.io/gorm v1.25.10 + github.com/urfave/cli/v2 v2.27.4 + golang.org/x/crypto v0.27.0 + golang.org/x/exp v0.0.0-20240808152545-0cdaa3abc0fa + golang.org/x/sync v0.8.0 + golang.org/x/term v0.24.0 + golang.org/x/time v0.6.0 ) require ( - github.com/Microsoft/go-winio v0.6.1 // indirect - github.com/VictoriaMetrics/fastcache v1.12.1 // indirect + github.com/DataDog/zstd v1.5.6-0.20230824185856-869dae002e5e // indirect + github.com/Masterminds/semver/v3 v3.1.1 // indirect + github.com/Microsoft/go-winio v0.6.2 // indirect + github.com/VictoriaMetrics/fastcache v1.12.2 // indirect + github.com/adrg/xdg v0.4.0 // indirect github.com/allegro/bigcache v1.2.1 // indirect github.com/armon/go-metrics v0.4.1 // indirect github.com/benbjohnson/clock v1.3.5 // indirect github.com/beorn7/perks v1.0.1 // indirect github.com/bits-and-blooms/bitset v1.10.0 // indirect github.com/boltdb/bolt v1.3.1 // indirect - github.com/btcsuite/btcd/btcec/v2 v2.2.0 // indirect + github.com/btcsuite/btcd/btcec/v2 v2.3.4 // indirect github.com/btcsuite/btcd/btcutil v1.1.5 // indirect github.com/btcsuite/btclog v0.0.0-20170628155309-84c8d2346e9f // indirect - github.com/cespare/xxhash/v2 v2.2.0 // indirect - github.com/cockroachdb/errors v1.11.1 // indirect + github.com/cespare/xxhash/v2 v2.3.0 // indirect + github.com/cockroachdb/errors v1.11.3 // indirect + github.com/cockroachdb/fifo v0.0.0-20240606204812-0bbfbd93a7ce // indirect github.com/cockroachdb/logtags v0.0.0-20230118201751-21c54148d20b // indirect github.com/cockroachdb/redact v1.1.5 // indirect github.com/cockroachdb/tokenbucket v0.0.0-20230807174530-cc333fc44b06 // indirect github.com/consensys/bavard v0.1.13 // indirect github.com/containerd/cgroups v1.1.0 // indirect github.com/coreos/go-systemd/v22 v22.5.0 // indirect - github.com/cpuguy83/go-md2man/v2 v2.0.2 // indirect - github.com/crate-crypto/go-ipa v0.0.0-20231025140028-3c0104f4b233 // indirect - github.com/davecgh/go-spew v1.1.1 // indirect + github.com/cpuguy83/go-md2man/v2 v2.0.4 // indirect + github.com/crate-crypto/go-ipa v0.0.0-20240223125850-b1e8a79f509c // indirect + github.com/davecgh/go-spew v1.1.2-0.20180830191138-d8f796af33cc // indirect github.com/davidlazar/go-crypto v0.0.0-20200604182044-b73af7476f6c // indirect - github.com/deckarep/golang-set/v2 v2.1.0 // indirect + github.com/deckarep/golang-set/v2 v2.6.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/donovanhide/eventsource v0.0.0-20210830082556-c59027999da0 // indirect github.com/dop251/goja v0.0.0-20230806174421-c933cf95e127 // indirect + github.com/dsnet/compress v0.0.2-0.20210315054119-f66993602bf5 // 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.15.0 // indirect + github.com/elastic/gosigar v0.14.3 // indirect + github.com/ethereum/c-kzg-4844 v1.0.0 // indirect + github.com/ethereum/go-verkle v0.1.1-0.20240306133620-7d920df305f0 // indirect + github.com/fatih/color v1.16.0 // indirect github.com/felixge/fgprof v0.9.3 // 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/flynn/noise v1.1.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/getsentry/sentry-go v0.27.0 // indirect + github.com/ghodss/yaml v1.0.0 // indirect + github.com/go-ini/ini v1.67.0 // 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/go-task/slim-sprig/v3 v3.0.0 // indirect + github.com/go-yaml/yaml v2.1.0+incompatible // indirect + github.com/goccy/go-json v0.10.3 // 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 github.com/golang-jwt/jwt/v4 v4.5.0 // indirect - github.com/golang/protobuf v1.5.3 // indirect + github.com/golang/protobuf v1.5.4 // 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.1 // indirect + github.com/google/pprof v0.0.0-20240727154555-813a5fbdbec8 // indirect + github.com/google/uuid v1.6.0 // indirect + github.com/gorilla/websocket v1.5.3 // 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 github.com/hashicorp/go-hclog v1.6.2 // indirect github.com/hashicorp/go-immutable-radix v1.0.0 // indirect - github.com/hashicorp/go-msgpack v0.5.5 // indirect - github.com/hashicorp/go-msgpack/v2 v2.1.1 // indirect + github.com/hashicorp/go-msgpack/v2 v2.1.2 // indirect github.com/hashicorp/golang-lru v0.5.0 // indirect - github.com/hashicorp/golang-lru/arc/v2 v2.0.5 // indirect + github.com/hashicorp/golang-lru/arc/v2 v2.0.7 // indirect + github.com/hashicorp/raft-boltdb v0.0.0-20231211162105-6c830fa4535e // 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 @@ -129,27 +134,24 @@ require ( github.com/influxdata/line-protocol v0.0.0-20210311194329-9aa0e372d097 // indirect github.com/ipfs/go-cid v0.4.1 // indirect github.com/ipfs/go-log/v2 v2.5.1 // indirect - github.com/jackc/pgio v1.0.0 // indirect - github.com/jackc/pgpassfile v1.0.0 // indirect - github.com/jackc/pgservicefile v0.0.0-20221227161230-091c0ba34f0a // indirect - github.com/jackc/puddle/v2 v2.2.1 // indirect github.com/jackpal/go-nat-pmp v1.0.2 // indirect github.com/jbenet/go-temp-err-catcher v0.1.0 // indirect github.com/jbenet/goprocess v0.1.4 // indirect github.com/jedisct1/go-minisign v0.0.0-20230811132847-661be99b8267 // indirect - 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.6 // indirect - github.com/klauspost/cpuid/v2 v2.2.6 // indirect + github.com/karalabe/hid v1.0.1-0.20240306101548-573246063e52 // indirect + github.com/kilic/bls12-381 v0.1.0 // indirect + github.com/klauspost/cpuid/v2 v2.2.8 // indirect github.com/koron/go-ssdp v0.0.4 // indirect github.com/kr/pretty v0.3.1 // indirect github.com/kr/text v0.2.0 // indirect - github.com/lib/pq v1.10.9 // indirect + github.com/kurtosis-tech/kurtosis-portal/api/golang v0.0.0-20230818182330-1a86869414d2 // indirect + github.com/kurtosis-tech/kurtosis/contexts-config-store v0.0.0-20230818184218-f4e3e773463b // indirect + github.com/kurtosis-tech/kurtosis/grpc-file-transfer/golang v0.0.0-20230803130419-099ee7a4e3dc // indirect + github.com/kurtosis-tech/kurtosis/path-compression v0.0.0-20240307154559-64d2929cd265 // indirect + github.com/kurtosis-tech/stacktrace v0.0.0-20211028211901-1c67a77b5409 // indirect github.com/libp2p/go-buffer-pool v0.1.0 // indirect - github.com/libp2p/go-cidranger v1.1.0 // indirect github.com/libp2p/go-flow-metrics v0.1.0 // indirect - github.com/libp2p/go-libp2p-asn-util v0.3.0 // indirect + github.com/libp2p/go-libp2p-asn-util v0.4.1 // indirect github.com/libp2p/go-mplex v0.7.0 // indirect github.com/libp2p/go-msgio v0.3.0 // indirect github.com/libp2p/go-nat v0.2.0 // indirect @@ -159,7 +161,8 @@ require ( github.com/marten-seemann/tcp v0.0.0-20210406111302-dfbc87cc63fd // indirect github.com/mattn/go-colorable v0.1.13 // indirect github.com/mattn/go-runewidth v0.0.14 // indirect - github.com/miekg/dns v1.1.56 // indirect + github.com/mholt/archiver v3.1.1+incompatible // indirect + github.com/miekg/dns v1.1.62 // 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 @@ -175,29 +178,49 @@ require ( github.com/multiformats/go-multihash v0.2.3 // indirect github.com/multiformats/go-multistream v0.5.0 // indirect github.com/multiformats/go-varint v0.0.7 // indirect + github.com/munnerz/goautoneg v0.0.0-20191010083416-a7dc8b61c822 // 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/nwaples/rardecode v1.1.3 // indirect + github.com/onsi/ginkgo/v2 v2.20.0 // indirect + github.com/opencontainers/runtime-spec v1.2.0 // indirect github.com/opentracing/opentracing-go v1.2.0 // indirect github.com/pbnjay/memory v0.0.0-20210728143218-7b4eea64cf58 // indirect github.com/peterh/liner v1.1.1-0.20190123174540-a2c9a5303de7 // indirect - github.com/pmezard/go-difflib v1.0.0 // indirect - github.com/prometheus/client_model v0.5.0 // indirect - github.com/prometheus/common v0.48.0 // indirect - github.com/prometheus/procfs v0.12.0 // indirect + github.com/pierrec/lz4 v2.6.1+incompatible // indirect + github.com/pion/datachannel v1.5.8 // indirect + github.com/pion/dtls/v2 v2.2.12 // indirect + github.com/pion/ice/v2 v2.3.34 // indirect + github.com/pion/interceptor v0.1.30 // indirect + github.com/pion/logging v0.2.2 // indirect + github.com/pion/mdns v0.0.12 // indirect + github.com/pion/randutil v0.1.0 // indirect + github.com/pion/rtcp v1.2.14 // indirect + github.com/pion/rtp v1.8.9 // indirect + github.com/pion/sctp v1.8.33 // indirect + github.com/pion/sdp/v3 v3.0.9 // indirect + github.com/pion/srtp/v2 v2.0.20 // indirect + github.com/pion/stun v0.6.1 // indirect + github.com/pion/transport/v2 v2.2.10 // indirect + github.com/pion/turn/v2 v2.1.6 // indirect + github.com/pion/webrtc/v3 v3.3.0 // indirect + github.com/pmezard/go-difflib v1.0.1-0.20181226105442-5d4384ee4fb2 // indirect + github.com/prometheus/client_model v0.6.1 // indirect + github.com/prometheus/common v0.55.0 // indirect + github.com/prometheus/procfs v0.15.1 // indirect + github.com/protolambda/bls12-381-util v0.1.0 // indirect + github.com/protolambda/zrnt v0.32.2 // indirect + github.com/protolambda/ztyp v0.2.2 // indirect github.com/quic-go/qpack v0.4.0 // indirect - github.com/quic-go/qtls-go1-20 v0.3.4 // indirect - github.com/quic-go/quic-go v0.39.4 // indirect - github.com/quic-go/webtransport-go v0.6.0 // indirect + github.com/quic-go/quic-go v0.46.0 // indirect + github.com/quic-go/webtransport-go v0.8.0 // indirect github.com/raulk/go-watchdog v1.3.0 // indirect - 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/rivo/uniseg v0.4.4 // indirect + github.com/rogpeppe/go-internal v1.11.0 // indirect + github.com/rs/cors v1.11.0 // indirect + github.com/rs/xid v1.6.0 // indirect github.com/russross/blackfriday/v2 v2.1.0 // indirect github.com/shirou/gopsutil v3.21.11+incompatible // indirect + github.com/sirupsen/logrus v1.9.3 // indirect github.com/spaolacci/murmur3 v1.1.0 // indirect github.com/status-im/keycard-go v0.2.0 // indirect github.com/stretchr/objx v0.5.2 // indirect @@ -206,30 +229,44 @@ require ( github.com/tklauser/go-sysconf v0.3.12 // indirect 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/ulikunitz/xz v0.5.11 // indirect + github.com/wlynxg/anet v0.0.4 // indirect + github.com/xi2/xz v0.0.0-20171230120015-48954b6210f8 // indirect + github.com/xrash/smetrics v0.0.0-20240521201337-686a1a2994c1 // indirect github.com/yusufpapurcu/wmi v1.2.3 // indirect + go.etcd.io/bbolt v1.3.5 // 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 - go.uber.org/mock v0.3.0 // indirect + go.uber.org/dig v1.18.0 // indirect + go.uber.org/fx v1.22.2 // indirect + go.uber.org/mock v0.4.0 // indirect 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.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 + go.uber.org/zap v1.27.0 // indirect + golang.org/x/mod v0.20.0 // indirect + golang.org/x/net v0.28.0 // indirect + golang.org/x/sys v0.25.0 // indirect + golang.org/x/text v0.18.0 // indirect + golang.org/x/tools v0.24.0 // indirect + google.golang.org/genproto v0.0.0-20230726155614-23370e0ffb3e // indirect + google.golang.org/genproto/googleapis/api v0.0.0-20230711160842-782d3b101e98 // indirect + google.golang.org/genproto/googleapis/rpc v0.0.0-20230803162519-f966b187b2e5 // indirect + google.golang.org/grpc v1.57.1 // indirect + google.golang.org/protobuf v1.34.2 // indirect + gopkg.in/natefinch/lumberjack.v2 v2.2.1 // indirect gopkg.in/yaml.v2 v2.4.0 // indirect gopkg.in/yaml.v3 v3.0.1 // indirect - lukechampine.com/blake3 v1.2.1 // indirect + lukechampine.com/blake3 v1.3.0 // indirect rsc.io/tmplfunc v0.0.3 // indirect ) -replace github.com/ethereum/go-ethereum v1.13.15 => github.com/ethstorage/op-geth v0.0.0-20240918005936-a18d1c99aecb +replace github.com/ethereum/go-ethereum v1.14.8 => github.com/ethstorage/op-geth v0.0.0-20240921172637-07437abe4163 -//replace github.com/ethereum/go-ethereum v1.13.9 => ../op-geth +// replace github.com/ethereum/go-ethereum => ../op-geth // replace github.com/ethereum-optimism/superchain-registry/superchain => ../superchain-registry/superchain + +// This release keeps breaking Go builds. Stop that. +exclude ( + github.com/kataras/iris/v12 v12.2.0-beta5 + github.com/kataras/iris/v12 v12.2.0 + github.com/kataras/iris/v12 v12.2.11 +) diff --git a/go.sum b/go.sum index 4c050b77abbf..72d4bada28d6 100644 --- a/go.sum +++ b/go.sum @@ -10,18 +10,21 @@ git.apache.org/thrift.git v0.0.0-20180902110319-2566ecd5d999/go.mod h1:fPE2ZNJGy github.com/AndreasBriese/bbloom v0.0.0-20190825152654-46b345b51c96 h1:cTp8I5+VIoKjsnZuH8vjyaysT/ses3EvZeaV/1UkF2M= github.com/AndreasBriese/bbloom v0.0.0-20190825152654-46b345b51c96/go.mod h1:bOvUY6CB00SOBii9/FifXqc0awNKxLFCL/+pkDPuyl8= github.com/BurntSushi/toml v0.3.1/go.mod h1:xHWCNGjB5oqiDr8zfno3MHue2Ht5sIBksp03qcyfWMU= -github.com/BurntSushi/toml v1.3.2 h1:o7IhLm0Msx3BaB+n3Ag7L8EVlByGnpq14C4YWiu/gL8= -github.com/BurntSushi/toml v1.3.2/go.mod h1:CxXYINrC8qIiEnFrOxCa7Jy5BFHlXnUU2pbicEuybxQ= +github.com/BurntSushi/toml v1.4.0 h1:kuoIxZQy2WRRk1pttg9asf+WVv6tWQuBNVmK8+nqPr0= +github.com/BurntSushi/toml v1.4.0/go.mod h1:ukJfTF/6rtPPRCnwkur4qwRxa8vTRFBF0uk2lLoLwho= github.com/DataDog/datadog-go v2.2.0+incompatible/go.mod h1:LButxg5PwREeZtORoXG3tL4fMGNddJ+vMq1mwgfaqoQ= github.com/DataDog/datadog-go v3.2.0+incompatible/go.mod h1:LButxg5PwREeZtORoXG3tL4fMGNddJ+vMq1mwgfaqoQ= -github.com/DataDog/zstd v1.5.2 h1:vUG4lAyuPCXO0TLbXvPv7EB7cNK1QV/luu55UHLrrn8= -github.com/DataDog/zstd v1.5.2/go.mod h1:g4AWEaM3yOg3HYfnJ3YIawPnVdXJh9QME85blwSAmyw= +github.com/DataDog/zstd v1.5.6-0.20230824185856-869dae002e5e h1:ZIWapoIRN1VqT8GR8jAwb1Ie9GyehWjVcGh32Y2MznE= +github.com/DataDog/zstd v1.5.6-0.20230824185856-869dae002e5e/go.mod h1:g4AWEaM3yOg3HYfnJ3YIawPnVdXJh9QME85blwSAmyw= +github.com/Masterminds/semver/v3 v3.1.1 h1:hLg3sBzpNErnxhQtUy/mmLR2I9foDujNK030IGemrRc= 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/Microsoft/go-winio v0.6.2 h1:F2VQgta7ecxGYO8k3ZZz3RS8fVIXVxONVUPlNERoyfY= +github.com/Microsoft/go-winio v0.6.2/go.mod h1:yd8OoFMLzJbo9gZq8j5qaps8bJ9aShtEA8Ipt1oGCvU= 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/VictoriaMetrics/fastcache v1.12.2 h1:N0y9ASrJ0F6h0QaC3o6uJb3NIZ9VKLjCM7NQbSmF7WI= +github.com/VictoriaMetrics/fastcache v1.12.2/go.mod h1:AmC+Nzz1+3G2eCPapF6UcsnkThDcMsQicp4xDukwJYI= +github.com/adrg/xdg v0.4.0 h1:RzRqFcjH4nE5C6oTAxhBtoE2IRyjBSa62SCbyPidvls= +github.com/adrg/xdg v0.4.0/go.mod h1:N6ag73EX4wyxeaoeHctc1mas01KZgsj5tYiAIwqJE/E= github.com/aead/siphash v1.0.1/go.mod h1:Nywa3cDsYNNK3gaciGTWPwHt0wlpNV15vwmswBAUSII= github.com/alecthomas/template v0.0.0-20160405071501-a0175ee3bccc/go.mod h1:LOuyumcjzFXgccqObfd/Ljyb9UuFJ6TxHnclSeseNhc= github.com/alecthomas/template v0.0.0-20190718012654-fb15b899a751/go.mod h1:LOuyumcjzFXgccqObfd/Ljyb9UuFJ6TxHnclSeseNhc= @@ -53,12 +56,12 @@ github.com/bradfitz/go-smtpd v0.0.0-20170404230938-deb6d6237625/go.mod h1:HYsPBT github.com/btcsuite/btcd v0.20.1-beta/go.mod h1:wVuoA8VJLEcwgqHBwHmzLRazpKxTv13Px/pDuV7OomQ= github.com/btcsuite/btcd v0.22.0-beta.0.20220111032746-97732e52810c/go.mod h1:tjmYdS6MLJ5/s0Fj4DbLgSbDHbEqLJrtnHecBFkdz5M= github.com/btcsuite/btcd v0.23.5-0.20231215221805-96c9fd8078fd/go.mod h1:nm3Bko6zh6bWP60UxwoT5LzdGJsQJaPo6HjduXq9p6A= -github.com/btcsuite/btcd v0.24.0 h1:gL3uHE/IaFj6fcZSu03SvqPMSx7s/dPzfpG/atRwWdo= -github.com/btcsuite/btcd v0.24.0/go.mod h1:K4IDc1593s8jKXIF7yS7yCTSxrknB9z0STzc2j6XgE4= +github.com/btcsuite/btcd v0.24.2 h1:aLmxPguqxza+4ag8R1I2nnJjSu2iFn/kqtHTIImswcY= +github.com/btcsuite/btcd v0.24.2/go.mod h1:5C8ChTkl5ejr3WHj8tkQSCmydiMEPB0ZhQhehpq7Dgg= github.com/btcsuite/btcd/btcec/v2 v2.1.0/go.mod h1:2VzYrv4Gm4apmbVVsSq5bqf1Ec8v56E48Vt0Y/umPgA= github.com/btcsuite/btcd/btcec/v2 v2.1.3/go.mod h1:ctjw4H1kknNJmRN4iP1R7bTQ+v3GJkZBd6mui8ZsAZE= -github.com/btcsuite/btcd/btcec/v2 v2.2.0 h1:fzn1qaOt32TuLjFlkzYSsBC35Q3KUjT1SwPxiMSCF5k= -github.com/btcsuite/btcd/btcec/v2 v2.2.0/go.mod h1:U7MHm051Al6XmscBQ0BoNydpOTsFAn707034b5nY8zU= +github.com/btcsuite/btcd/btcec/v2 v2.3.4 h1:3EJjcN70HCu/mwqlUsGK8GcNVyLVxFDlWurTXGPFfiQ= +github.com/btcsuite/btcd/btcec/v2 v2.3.4/go.mod h1:zYzJ8etWJQIv1Ogk7OzpWjowwOdXY1W/17j2MW85J04= github.com/btcsuite/btcd/btcutil v1.0.0/go.mod h1:Uoxwv0pqYWhD//tfTiipkxNfdhG9UrLwaeswfjfdF0A= github.com/btcsuite/btcd/btcutil v1.1.0/go.mod h1:5OapHB7A2hBBWLm48mmw4MOHNJCcUBTwmWH/0Jn8VHE= github.com/btcsuite/btcd/btcutil v1.1.5 h1:+wER79R5670vs/ZusMTF1yTcRYE5GUsFbdjdisflzM8= @@ -83,8 +86,9 @@ github.com/cespare/cp v0.1.0/go.mod h1:SOGHArjBr4JWaSDEVpWpo/hNg6RoKrls6Oh40hiwW github.com/cespare/xxhash v1.1.0 h1:a6HrQnmkObjyL+Gs60czilIUGqrzKutQD6XZog3p+ko= github.com/cespare/xxhash v1.1.0/go.mod h1:XrSqR1VqqWfGrhpAt58auRo0WTKS1nRRg3ghfAqPWnc= github.com/cespare/xxhash/v2 v2.1.1/go.mod h1:VGX0DQ3Q6kWi7AoAeZDth3/j3BFtOZR5XLFGgcrjCOs= -github.com/cespare/xxhash/v2 v2.2.0 h1:DC2CZ1Ep5Y4k3ZQ899DldepgrayRUGE6BBZ/cd9Cj44= github.com/cespare/xxhash/v2 v2.2.0/go.mod h1:VGX0DQ3Q6kWi7AoAeZDth3/j3BFtOZR5XLFGgcrjCOs= +github.com/cespare/xxhash/v2 v2.3.0 h1:UL815xU9SqsFlibzuggzjXhog7bL6oX9BbNZnL2UFvs= +github.com/cespare/xxhash/v2 v2.3.0/go.mod h1:VGX0DQ3Q6kWi7AoAeZDth3/j3BFtOZR5XLFGgcrjCOs= github.com/chzyer/logex v1.1.10/go.mod h1:+Ywpsq7O8HXn0nuIou7OrIPyXbp3wmkHB+jjWRnGsAI= github.com/chzyer/logex v1.2.0/go.mod h1:9+9sk7u7pGNWYMkh0hdiL++6OeibzJccyQU4p4MedaY= github.com/chzyer/readline v0.0.0-20180603132655-2972be24d48e/go.mod h1:nSuG5e5PlCu98SY8svDHJxuZscDgtXS6KTTbou5AhLI= @@ -95,15 +99,16 @@ github.com/cilium/ebpf v0.2.0/go.mod h1:To2CFviqOWL/M0gIMsvSMlqe7em/l1ALkX1PyjrX github.com/circonus-labs/circonus-gometrics v2.3.1+incompatible/go.mod h1:nmEj6Dob7S7YxXgwXpfOuvO54S+tGdZdw9fuRZt25Ag= github.com/circonus-labs/circonusllhist v0.1.3/go.mod h1:kMXHVDlOchFAehlya5ePtbp5jckzBHf4XRpQvBOLI+I= github.com/client9/misspell v0.3.4/go.mod h1:qj6jICC3Q7zFZvVWo7KLAzC3yx5G7kyvSDkc90ppPyw= -github.com/cockroachdb/apd v1.1.0/go.mod h1:8Sl8LxpKi29FqWXR16WEFZRNSz3SoPzUzeMeY4+DwBQ= github.com/cockroachdb/datadriven v1.0.3-0.20230413201302-be42291fc80f h1:otljaYPt5hWxV3MUfO5dFPFiOXg9CyG5/kCfayTqsJ4= github.com/cockroachdb/datadriven v1.0.3-0.20230413201302-be42291fc80f/go.mod h1:a9RdTaap04u637JoCzcUoIcDmvwSUtcUFtT/C3kJlTU= -github.com/cockroachdb/errors v1.11.1 h1:xSEW75zKaKCWzR3OfxXUxgrk/NtT4G1MiOv5lWZazG8= -github.com/cockroachdb/errors v1.11.1/go.mod h1:8MUxA3Gi6b25tYlFEBGLf+D8aISL+M4MIpiWMSNRfxw= +github.com/cockroachdb/errors v1.11.3 h1:5bA+k2Y6r+oz/6Z/RFlNeVCesGARKuC6YymtcDrbC/I= +github.com/cockroachdb/errors v1.11.3/go.mod h1:m4UIW4CDjx+R5cybPsNrRbreomiFqt8o1h1wUVazSd8= +github.com/cockroachdb/fifo v0.0.0-20240606204812-0bbfbd93a7ce h1:giXvy4KSc/6g/esnpM7Geqxka4WSqI1SZc7sMJFd3y4= +github.com/cockroachdb/fifo v0.0.0-20240606204812-0bbfbd93a7ce/go.mod h1:9/y3cnZ5GKakj/H4y9r9GTjCvAFta7KLgSHPJJYc52M= github.com/cockroachdb/logtags v0.0.0-20230118201751-21c54148d20b h1:r6VH0faHjZeQy818SGhaone5OnYfxFR/+AzdY3sf5aE= github.com/cockroachdb/logtags v0.0.0-20230118201751-21c54148d20b/go.mod h1:Vz9DsVWQQhf3vs21MhPMZpMGSht7O/2vFW2xusFUVOs= -github.com/cockroachdb/pebble v0.0.0-20231018212520-f6cde3fc2fa4 h1:PuHFhOUMnD62r80dN+Ik5qco2drekgsUSVdcHsvllec= -github.com/cockroachdb/pebble v0.0.0-20231018212520-f6cde3fc2fa4/go.mod h1:sEHm5NOXxyiAoKWhoFxT8xMgd/f3RA6qUqQ1BXKrh2E= +github.com/cockroachdb/pebble v1.1.2 h1:CUh2IPtR4swHlEj48Rhfzw6l/d0qA31fItcIszQVIsA= +github.com/cockroachdb/pebble v1.1.2/go.mod h1:4exszw1r40423ZsmkG/09AFEG83I0uDgfujJdbL6kYU= github.com/cockroachdb/redact v1.1.5 h1:u1PMllDkdFfPWaNGMyLD1+so+aq3uUItthCFqzwPJ30= github.com/cockroachdb/redact v1.1.5/go.mod h1:BVNblN9mBWFyMyqK1k3AAiSxhvhfK2oOZZ2lK+dpvRg= github.com/cockroachdb/tokenbucket v0.0.0-20230807174530-cc333fc44b06 h1:zuQyyAKVxetITBuuhv3BI9cMrmStnpT18zmgmTxunpo= @@ -116,30 +121,28 @@ github.com/containerd/cgroups v0.0.0-20201119153540-4cbc285b3327/go.mod h1:ZJeTF github.com/containerd/cgroups v1.1.0 h1:v8rEWFl6EoqHB+swVNjVoCJE8o3jX7e8nqBGPLaDFBM= github.com/containerd/cgroups v1.1.0/go.mod h1:6ppBcbh/NOOUU+dMKrykgaBnK9lCIBxHqJDGwsa1mIw= github.com/coreos/go-systemd v0.0.0-20181012123002-c6f51f82210d/go.mod h1:F5haX7vjVVG0kc13fIWeqUViNPyEJxv/OmvnBo0Yme4= -github.com/coreos/go-systemd v0.0.0-20190321100706-95778dfbb74e/go.mod h1:F5haX7vjVVG0kc13fIWeqUViNPyEJxv/OmvnBo0Yme4= -github.com/coreos/go-systemd v0.0.0-20190719114852-fd7a80b32e1f/go.mod h1:F5haX7vjVVG0kc13fIWeqUViNPyEJxv/OmvnBo0Yme4= github.com/coreos/go-systemd/v22 v22.1.0/go.mod h1:xO0FLkIi5MaZafQlIrOotqXZ90ih+1atmu1JpKERPPk= github.com/coreos/go-systemd/v22 v22.5.0 h1:RrqgGjYQKalulkV8NGVIfkXQf6YYmOyiJKk8iXXhfZs= github.com/coreos/go-systemd/v22 v22.5.0/go.mod h1:Y58oyj3AT4RCenI/lSvhwexgC+NSVTIJ3seZv2GcEnc= github.com/cpuguy83/go-md2man/v2 v2.0.0-20190314233015-f79a8a8ca69d/go.mod h1:maD7wRr/U5Z6m/iR4s+kqSMx2CaBsrgA7czyZG/E6dU= github.com/cpuguy83/go-md2man/v2 v2.0.0/go.mod h1:maD7wRr/U5Z6m/iR4s+kqSMx2CaBsrgA7czyZG/E6dU= -github.com/cpuguy83/go-md2man/v2 v2.0.2 h1:p1EgwI/C7NhT0JmVkwCD2ZBK8j4aeHQX2pMHHBfMQ6w= -github.com/cpuguy83/go-md2man/v2 v2.0.2/go.mod h1:tgQtvFlXSQOSOSIRvRPT7W67SCa46tRHOmNcaadrF8o= -github.com/crate-crypto/go-ipa v0.0.0-20231025140028-3c0104f4b233 h1:d28BXYi+wUpz1KBmiF9bWrjEMacUEREV6MBi2ODnrfQ= -github.com/crate-crypto/go-ipa v0.0.0-20231025140028-3c0104f4b233/go.mod h1:geZJZH3SzKCqnz5VT0q/DyIG/tvu/dZk+VIfXicupJs= -github.com/crate-crypto/go-kzg-4844 v0.7.0 h1:C0vgZRk4q4EZ/JgPfzuSoxdCq3C3mOZMBShovmncxvA= -github.com/crate-crypto/go-kzg-4844 v0.7.0/go.mod h1:1kMhvPgI0Ky3yIa+9lFySEBUBXkYxeOi8ZF1sYioxhc= -github.com/creack/pty v1.1.7/go.mod h1:lj5s0c3V2DBrqTV7llrYr5NG6My20zk30Fl46Y7DoTY= +github.com/cpuguy83/go-md2man/v2 v2.0.4 h1:wfIWP927BUkWJb2NmU/kNDYIBTh/ziUX91+lVfRxZq4= +github.com/cpuguy83/go-md2man/v2 v2.0.4/go.mod h1:tgQtvFlXSQOSOSIRvRPT7W67SCa46tRHOmNcaadrF8o= +github.com/crate-crypto/go-ipa v0.0.0-20240223125850-b1e8a79f509c h1:uQYC5Z1mdLRPrZhHjHxufI8+2UG/i25QG92j0Er9p6I= +github.com/crate-crypto/go-ipa v0.0.0-20240223125850-b1e8a79f509c/go.mod h1:geZJZH3SzKCqnz5VT0q/DyIG/tvu/dZk+VIfXicupJs= +github.com/crate-crypto/go-kzg-4844 v1.0.0 h1:TsSgHwrkTKecKJ4kadtHi4b3xHW5dCFUDFnUp1TsawI= +github.com/crate-crypto/go-kzg-4844 v1.0.0/go.mod h1:1kMhvPgI0Ky3yIa+9lFySEBUBXkYxeOi8ZF1sYioxhc= github.com/creack/pty v1.1.9/go.mod h1:oKZEueFk5CKHvIhNR5MUki03XCEU+Q6VDXinZuGJ33E= github.com/cyberdelia/templates v0.0.0-20141128023046-ca7fffd4298c/go.mod h1:GyV+0YP4qX0UQ7r2MoYZ+AvYDp12OF5yg4q8rGnyNh4= github.com/davecgh/go-spew v0.0.0-20171005155431-ecdeabc65495/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38= github.com/davecgh/go-spew v1.1.0/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38= -github.com/davecgh/go-spew v1.1.1 h1:vj9j/u1bqnvCEfJOwUhtlOARqs3+rkHYY13jYWTU97c= github.com/davecgh/go-spew v1.1.1/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38= +github.com/davecgh/go-spew v1.1.2-0.20180830191138-d8f796af33cc h1:U9qPSI2PIWSS1VwoXQT9A3Wy9MM3WgvqSxFWenqJduM= +github.com/davecgh/go-spew v1.1.2-0.20180830191138-d8f796af33cc/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38= github.com/davidlazar/go-crypto v0.0.0-20200604182044-b73af7476f6c h1:pFUpOrbxDR6AkioZ1ySsx5yxlDQZ8stG2b88gTPxgJU= github.com/davidlazar/go-crypto v0.0.0-20200604182044-b73af7476f6c/go.mod h1:6UhI8N9EjYm1c2odKpFpAYeR8dsBeM7PtzQhRgxRr9U= -github.com/deckarep/golang-set/v2 v2.1.0 h1:g47V4Or+DUdzbs8FxCCmgb6VYd+ptPAngjM6dtGktsI= -github.com/deckarep/golang-set/v2 v2.1.0/go.mod h1:VAky9rY/yGXJOLEDv3OMci+7wtDpOF4IN+y82NBOac4= +github.com/deckarep/golang-set/v2 v2.6.0 h1:XfcQbWM1LlMB8BsJ8N9vW5ehnnPVIw0je80NsVHagjM= +github.com/deckarep/golang-set/v2 v2.6.0/go.mod h1:VAky9rY/yGXJOLEDv3OMci+7wtDpOF4IN+y82NBOac4= github.com/decred/dcrd/crypto/blake256 v1.0.0/go.mod h1:sQl2p6Y26YV+ZOcSTP6thNdn47hh8kt6rqSlvmrXFAc= 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= @@ -162,75 +165,74 @@ github.com/dlclark/regexp2 v1.7.0/go.mod h1:DHkYz0B9wPfa6wondMfaivmHpzrQ3v9q8cnm github.com/docker/go-units v0.4.0/go.mod h1:fgPhTUdO+D/Jk86RDLlptpiXQzgHJF7gydDDbaIK4Dk= github.com/docker/go-units v0.5.0 h1:69rxXcBk27SvSaaxTtLh/8llcHD8vYHT7WSdRZ/jvr4= github.com/docker/go-units v0.5.0/go.mod h1:fgPhTUdO+D/Jk86RDLlptpiXQzgHJF7gydDDbaIK4Dk= +github.com/donovanhide/eventsource v0.0.0-20210830082556-c59027999da0 h1:C7t6eeMaEQVy6e8CarIhscYQlNmw5e3G36y7l7Y21Ao= +github.com/donovanhide/eventsource v0.0.0-20210830082556-c59027999da0/go.mod h1:56wL82FO0bfMU5RvfXoIwSOP2ggqqxT+tAfNEIyxuHw= github.com/dop251/goja v0.0.0-20211022113120-dc8c55024d06/go.mod h1:R9ET47fwRVRPZnOGvHxxhuZcbrMCuiqOz3Rlrh4KSnk= github.com/dop251/goja v0.0.0-20230806174421-c933cf95e127 h1:qwcF+vdFrvPSEUDSX5RVoRccG8a5DhOdWdQ4zN62zzo= 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/dsnet/compress v0.0.2-0.20210315054119-f66993602bf5 h1:iFaUwBSo5Svw6L7HYpRu/0lE3e0BaElwnNO1qkNQxBY= +github.com/dsnet/compress v0.0.2-0.20210315054119-f66993602bf5/go.mod h1:qssHWj60/X5sZFNxpG4HBPDHVqxNm4DfnCKgrbZOT+s= +github.com/dsnet/golib v0.0.0-20171103203638-1ea166775780/go.mod h1:Lj+Z9rebOhdfkVLjJ8T6VcRQv3SXugXy999NBtR9aFY= 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/elastic/gosigar v0.14.3 h1:xwkKwPia+hSfg9GqrCUKYdId102m9qTJIIr7egmK/uo= +github.com/elastic/gosigar v0.14.3/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/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/ethstorage/da-server v0.0.0-20240628094857-ed2ee4ff52d9 h1:yRJRj81rP83R5dZEsYitAFcqRagK/e+UxhiSSK4/Wds= -github.com/ethstorage/da-server v0.0.0-20240628094857-ed2ee4ff52d9/go.mod h1:YeveZNzQFdseeqS0mQavqfyMI+U9l1GQu0CEwezTZA8= -github.com/ethstorage/op-geth v0.0.0-20240918005936-a18d1c99aecb h1:f076fgZk2/vUmrpHewhKOJgLXjQqfzsRlU/gKVPiKbg= -github.com/ethstorage/op-geth v0.0.0-20240918005936-a18d1c99aecb/go.mod h1:8tQ6r0e1NNJbSVHzYKafQqf62gV9BzZR+SKkXRckjLM= +github.com/ethereum-optimism/superchain-registry/superchain v0.0.0-20240923105504-b1c8d0c4419b h1:nmlmbtmHDHGhmBDmDE3nXeVhTCVCww5dl45hMpOEIJk= +github.com/ethereum-optimism/superchain-registry/superchain v0.0.0-20240923105504-b1c8d0c4419b/go.mod h1:XaVXL9jg8BcyOeugECgIUGa9Y3DjYJj71RHmb5qon6M= +github.com/ethereum/c-kzg-4844 v1.0.0 h1:0X1LBXxaEtYD9xsyj9B9ctQEZIpnvVDeoBx8aHEwTNA= +github.com/ethereum/c-kzg-4844 v1.0.0/go.mod h1:VewdlzQmpT5QSrVhbBuGoCdFJkpaJlO1aQputP83wc0= +github.com/ethereum/go-verkle v0.1.1-0.20240306133620-7d920df305f0 h1:KrE8I4reeVvf7C1tm8elRjj4BdscTYzz/WAbYyf/JI4= +github.com/ethereum/go-verkle v0.1.1-0.20240306133620-7d920df305f0/go.mod h1:D9AJLVXSyZQXJQVk8oh1EwjISE+sJTn2duYIZC0dy3w= +github.com/ethstorage/da-server v0.0.0-20240925084712-169d238000e5 h1:pxtnGOGOChxCETGUg2yEIC3nfB5C7ZWzblm4/JE7108= +github.com/ethstorage/da-server v0.0.0-20240925084712-169d238000e5/go.mod h1:QfuYw2wCpbpW7k+Fwq4s9EMWNu40XDc1KKJICPaNUgQ= +github.com/ethstorage/op-geth v0.0.0-20240921172637-07437abe4163 h1:3vRJrtL1o1iFHeSyBsClcMzLdSEzliXzwqcwu2xTRfk= +github.com/ethstorage/op-geth v0.0.0-20240921172637-07437abe4163/go.mod h1:Mk8AhvlqFbjI9oW2ymThSSoqc6kiEH0/tCmHGMEu6ac= 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/fatih/color v1.16.0 h1:zmkK9Ngbjj+K0yRhTVONQh1p/HknKYSlNT+vZCzyokM= +github.com/fatih/color v1.16.0/go.mod h1:fL2Sau1YI5c0pdGEVCbKQbLXB6edEj1ZgiY4NijnWvE= github.com/felixge/fgprof v0.9.3 h1:VvyZxILNuCiUCSXtPtYmmtGvb65nqXh2QFWc0Wpf2/g= github.com/felixge/fgprof v0.9.3/go.mod h1:RdbpDgzqYVh/T9fPELJyV7EYJuHB55UTEULNun8eiPw= 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= +github.com/flynn/noise v1.1.0 h1:KjPQoQCEFdZDiP03phOvGi11+SVVhBG2wOWAorLsstg= +github.com/flynn/noise v1.1.0/go.mod h1:xbMo+0i6+IGbYdJhF31t2eR1BIU0CYc12+BNAKwUTag= github.com/francoispqt/gojay v1.2.13 h1:d2m3sFjloqoIUQU3TsHBgj6qg/BVGlTBeHDUmyJnXKk= github.com/francoispqt/gojay v1.2.13/go.mod h1:ehT5mTG4ua4581f1++1WLG0vPdaA9HaiDsoyrBGkyDY= +github.com/frankban/quicktest v1.14.6 h1:7Xjx+VpznH+oBnejlPUj8oUpdxnVs4f8XU8WnHkI4W8= +github.com/frankban/quicktest v1.14.6/go.mod h1:4ptaffx2x8+WTWXmUCuVU6aPUX1/Mz7zb5vbUoiM6w0= 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= github.com/gballet/go-libpcsclite v0.0.0-20191108122812-4678299bea08/go.mod h1:x7DCsMOv1taUwEWCzT4cmDeAkigA5/QCwUodaVOe8Ww= -github.com/gballet/go-verkle v0.1.1-0.20231031103413-a67434b50f46 h1:BAIP2GihuqhwdILrV+7GJel5lyPV3u1+PgzrWLc0TkE= -github.com/gballet/go-verkle v0.1.1-0.20231031103413-a67434b50f46/go.mod h1:QNpY22eby74jVhqH4WhDLDwxc/vqsern6pW+u2kbkpc= github.com/getkin/kin-openapi v0.53.0/go.mod h1:7Yn5whZr5kJi6t+kShccXS8ae1APpYTW6yheSwk8Yi4= github.com/getkin/kin-openapi v0.61.0/go.mod h1:7Yn5whZr5kJi6t+kShccXS8ae1APpYTW6yheSwk8Yi4= -github.com/getsentry/sentry-go v0.18.0 h1:MtBW5H9QgdcJabtZcuJG80BMOwaBpkRDZkxRkNC1sN0= -github.com/getsentry/sentry-go v0.18.0/go.mod h1:Kgon4Mby+FJ7ZWHFUAZgVaIa8sxHtnRJRLTXZr51aKQ= +github.com/getsentry/sentry-go v0.27.0 h1:Pv98CIbtB3LkMWmXi4Joa5OOcwbmnX88sF5qbK3r3Ps= +github.com/getsentry/sentry-go v0.27.0/go.mod h1:lc76E2QywIyW8WuBnwl8Lc4bkmQH4+w1gwTf25trprY= +github.com/ghodss/yaml v1.0.0 h1:wQHKEahhL6wmXdzwWG11gIVCkOv05bNOh+Rxn0yngAk= github.com/ghodss/yaml v1.0.0/go.mod h1:4dBDuWmgqj2HViK6kFavaiC9ZROes6MMH2rRYeMEF04= github.com/gliderlabs/ssh v0.1.1/go.mod h1:U7qILu1NlMHj9FlMhZLlkCdDnU1DBEAqr0aevW3Awn0= github.com/go-chi/chi/v5 v5.0.0/go.mod h1:BBug9lr0cqtdAhsu6R4AAdvufI0/XBzAQSsUqJpoZOs= -github.com/go-chi/chi/v5 v5.0.1/go.mod h1:DslCQbL2OYiznFReuXYUmQ2hGd1aDpCnlMNITLSKoi8= -github.com/go-chi/chi/v5 v5.0.12 h1:9euLV5sTrTNTRUU9POmDUvfxyj6LAABLUcEWO+JJb4s= -github.com/go-chi/chi/v5 v5.0.12/go.mod h1:DslCQbL2OYiznFReuXYUmQ2hGd1aDpCnlMNITLSKoi8= -github.com/go-chi/docgen v1.2.0 h1:da0Nq2PKU9W9pSOTUfVrKI1vIgTGpauo9cfh4Iwivek= -github.com/go-chi/docgen v1.2.0/go.mod h1:G9W0G551cs2BFMSn/cnGwX+JBHEloAgo17MBhyrnhPI= -github.com/go-chi/render v1.0.1/go.mod h1:pq4Rr7HbnsdaeHagklXub+p6Wd16Af5l9koip1OvJns= github.com/go-errors/errors v1.0.1/go.mod h1:f4zRHt4oKfwPJE5k8C9vpYG+aDHdBFUsgrm6/TyX73Q= 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-ini/ini v1.67.0 h1:z6ZrTEZqSWOTyH2FlglNbNgARyHG8oLW9gMELqKr06A= +github.com/go-ini/ini v1.67.0/go.mod h1:ByCAeIL28uOIIG0E3PJtZPDL8WnHpFKFOtgjp+3Ies8= github.com/go-kit/kit v0.8.0/go.mod h1:xBxKIO96dXMWWy0MnWVtmwkA9/13aqxPnvrjFYMA2as= github.com/go-kit/kit v0.9.0/go.mod h1:xBxKIO96dXMWWy0MnWVtmwkA9/13aqxPnvrjFYMA2as= -github.com/go-kit/log v0.1.0/go.mod h1:zbhenjAZHb184qTLMA9ZjW7ThYL0H2mk7Q6pNt4vbaY= github.com/go-logfmt/logfmt v0.3.0/go.mod h1:Qt1PoO58o5twSAckw1HlFXLmHsOX5/0LbT9GBnD5lWE= github.com/go-logfmt/logfmt v0.4.0/go.mod h1:3RMwSq7FuexP4Kalkev3ejPJsZTpXXBr9+V4qmtdjCk= -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-logr/logr v1.4.2 h1:6pFjapn8bFcIbiKo3XT4j/BhANplGihG6tvd+8rYgrY= +github.com/go-logr/logr v1.4.2/go.mod h1:9T104GzyrTigFIr8wt5mBrctHMim0Nb2HLGrmQ40KvY= 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= @@ -240,17 +242,18 @@ github.com/go-sourcemap/sourcemap v2.1.3+incompatible h1:W1iEw64niKVGogNgBN3ePyL github.com/go-sourcemap/sourcemap v2.1.3+incompatible/go.mod h1:F8jJfvm2KbVjc5NqelyYJmf/v5J0dwNLS2mL4sNA1Jg= github.com/go-stack/stack v1.8.0/go.mod h1:v0f6uXyyMGvRgIKkXu+yp6POWl0qKG85gN/melR3HDY= 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/go-task/slim-sprig/v3 v3.0.0 h1:sUs3vkvUymDpBKi3qH1YSqBQk9+9D/8M2mN1vB6EwHI= +github.com/go-task/slim-sprig/v3 v3.0.0/go.mod h1:W848ghGpv3Qj3dhTPRyJypKRiqCdHZiAzKg9hl15HA8= +github.com/go-yaml/yaml v2.1.0+incompatible h1:RYi2hDdss1u4YE7GwixGzWwVo47T8UQwnTLB6vQiq+o= +github.com/go-yaml/yaml v2.1.0+incompatible/go.mod h1:w2MrLa16VYP0jy6N7M5kHaCkaLENm+P+Tv+MfurjSw0= +github.com/goccy/go-json v0.10.3 h1:KZ5WoDbxAIgm2HNbYckL0se1fHD6rz5j4ywS6ebzDqA= +github.com/goccy/go-json v0.10.3/go.mod h1:oq7eo15ShAhp70Anwd5lgX2pLfOS3QCiwU/PULtXL6M= 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= github.com/godbus/dbus/v5 v5.1.0/go.mod h1:xhWf0FNVPg57R7Z0UbKHbJfkEywrmjJnf7w5xrFpKfA= github.com/gofrs/flock v0.8.1 h1:+gYjHKf32LDeiEEFhQaotPbLuUXjY5ZqxKgXy7n59aw= github.com/gofrs/flock v0.8.1/go.mod h1:F1TvTiK9OcQqauNUHlbJvyl9Qa1QvF/gOUDKA14jxHU= -github.com/gofrs/uuid v4.0.0+incompatible/go.mod h1:b2aQJv3Z4Fp6yNu3cdSllBxTCLRxnplIgP/c0N/04lM= github.com/gogo/protobuf v1.1.1/go.mod h1:r8qH/GZQm5c6nD/R0oafs1akxWv10x8SbQlK7atdtwQ= github.com/gogo/protobuf v1.3.1/go.mod h1:SlYgWuQ5SjCEi6WLHjHCa1yvBfUnHcTbrrZtXPKa29o= github.com/gogo/protobuf v1.3.2 h1:Ov1cvc58UF3b5XjBnZv7+opcTcQFZebYjWzi34vdm4Q= @@ -272,8 +275,8 @@ github.com/golang/protobuf v1.4.0/go.mod h1:jodUvKwWbYaEsadDk5Fwe5c77LiNKVO9IDvq github.com/golang/protobuf v1.4.2/go.mod h1:oDoupMAO8OvCJWAcko0GGGIgR6R6ocIYbsSw735rRwI= github.com/golang/protobuf v1.5.0/go.mod h1:FsONVRAS9T7sI+LIUmWTfcYkHO4aIWwzhcaSAoJOfIk= github.com/golang/protobuf v1.5.2/go.mod h1:XVQd3VNwM+JqD3oG2Ue2ip4fOMUkwXdXDdiuN0vRsmY= -github.com/golang/protobuf v1.5.3 h1:KhyjKVUg7Usr/dYsdSqoFveMYd5ko72D+zANwlG1mmg= -github.com/golang/protobuf v1.5.3/go.mod h1:XVQd3VNwM+JqD3oG2Ue2ip4fOMUkwXdXDdiuN0vRsmY= +github.com/golang/protobuf v1.5.4 h1:i7eJL8qZTpSEXOPTxNKhASYpMn+8e5Q6AdndVa1dWek= +github.com/golang/protobuf v1.5.4/go.mod h1:lnTiLA8Wa4RWRcIUkrtSVa5nRhsEGBg48fD6rSs7xps= github.com/golang/snappy v0.0.0-20180518054509-2e65f85255db/go.mod h1:/XxbfmMg8lxefKM7IXC3fBNl/7bRcc72aCRzEWrmP2Q= github.com/golang/snappy v0.0.4/go.mod h1:/XxbfmMg8lxefKM7IXC3fBNl/7bRcc72aCRzEWrmP2Q= github.com/golang/snappy v0.0.5-0.20220116011046-fa5810519dcb h1:PBC98N2aIaM3XXiurYmW7fx4GZkL8feAMVq7nEjURHk= @@ -300,11 +303,12 @@ github.com/google/pprof v0.0.0-20181206194817-3ea8567a2e57/go.mod h1:zfwlbNMJ+OI github.com/google/pprof v0.0.0-20210407192527-94a9f03dee38/go.mod h1:kpwsk12EmLew5upagYY7GY0pfYCcupk39gWOCRROcvE= github.com/google/pprof v0.0.0-20211214055906-6f57359322fd/go.mod h1:KgnwoLYCZ8IQu3XUZ8Nc/bM9CCZFOyjUNOSygVozoDg= github.com/google/pprof v0.0.0-20230207041349-798e818bf904/go.mod h1:uglQLonpP8qtYCYyzA+8c/9qtqgA3qsXGYqCPKARAFg= -github.com/google/pprof v0.0.0-20231023181126-ff6d637d2a7b h1:RMpPgZTSApbPf7xaVel+QkoGPRLFLrwFO89uDUHEGf0= -github.com/google/pprof v0.0.0-20231023181126-ff6d637d2a7b/go.mod h1:czg5+yv1E0ZGTi6S6vVK1mke0fV+FaUhNGcd6VRS9Ik= +github.com/google/pprof v0.0.0-20240727154555-813a5fbdbec8 h1:FKHo8hFI3A+7w0aUQuYXQ+6EN5stWmeY/AZqtM8xk9k= +github.com/google/pprof v0.0.0-20240727154555-813a5fbdbec8/go.mod h1:K1liHPHnj73Fdn/EKuT8nrFqBihUSKXoLYU0BuatOYo= github.com/google/renameio v0.1.0/go.mod h1:KWCgfxg9yswjAJkECMjeO8J8rahYeXnNhOm40UhjYkI= github.com/google/subcommands v1.2.0/go.mod h1:ZjhPrFU+Olkh9WazFPsl27BQ4UPiG37m3yTrtFlrHVk= github.com/google/uuid v1.1.1/go.mod h1:TIyPZe4MgqvfeYDBFedMoGGpEw/LqOeaOT+nhxU+yHo= +github.com/google/uuid v1.3.1/go.mod h1:TIyPZe4MgqvfeYDBFedMoGGpEw/LqOeaOT+nhxU+yHo= github.com/google/uuid v1.6.0 h1:NIvaJDMOsjHA8n1jAhLSgzrAzy1Hgr+hNrb57e+94F0= github.com/google/uuid v1.6.0/go.mod h1:TIyPZe4MgqvfeYDBFedMoGGpEw/LqOeaOT+nhxU+yHo= github.com/googleapis/gax-go v2.0.0+incompatible/go.mod h1:SFVmujtThgffbyetf+mdk2eWhX2bMyUtNHzFKcPA9HY= @@ -312,8 +316,8 @@ github.com/googleapis/gax-go/v2 v2.0.3/go.mod h1:LLvjysVCY1JZeum8Z6l8qUty8fiNwE0 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/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/gorilla/websocket v1.5.3 h1:saDtZ6Pbx/0u+bgYQ3q96pZgCzfhKXGPqt7kZ72aNNg= +github.com/gorilla/websocket v1.5.3/go.mod h1:YR8l580nyteQvAITg2hZ9XVh4b55+EU/adAjf1fMHhE= 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= @@ -331,8 +335,8 @@ github.com/hashicorp/go-immutable-radix v1.0.0 h1:AKDB1HM5PWEA7i4nhcpwOrO2byshxB github.com/hashicorp/go-immutable-radix v1.0.0/go.mod h1:0y9vanUI8NX6FsYoO3zeMjhV/C5i9g4Q3DwcSNZ4P60= github.com/hashicorp/go-msgpack v0.5.5 h1:i9R9JSrqIz0QVLz3sz+i3YJdT7TTSLcfLLzJi9aZTuI= github.com/hashicorp/go-msgpack v0.5.5/go.mod h1:ahLV/dePpqEmjfWmKiqvPkv/twdG7iPBM1vqhUKIvfM= -github.com/hashicorp/go-msgpack/v2 v2.1.1 h1:xQEY9yB2wnHitoSzk/B9UjXWRQ67QKu5AOm8aFp8N3I= -github.com/hashicorp/go-msgpack/v2 v2.1.1/go.mod h1:upybraOAblm4S7rx0+jeNy+CWWhzywQsSRV5033mMu4= +github.com/hashicorp/go-msgpack/v2 v2.1.2 h1:4Ee8FTp834e+ewB71RDrQ0VKpyFdrKOjvYtnQ/ltVj0= +github.com/hashicorp/go-msgpack/v2 v2.1.2/go.mod h1:upybraOAblm4S7rx0+jeNy+CWWhzywQsSRV5033mMu4= github.com/hashicorp/go-multierror v1.1.1 h1:H5DkEtf6CXdFp0N0Em5UCwQpXMWke8IA0+lD48awMYo= github.com/hashicorp/go-multierror v1.1.1/go.mod h1:iw975J/qwKPdAO1clOe2L8331t/9/fmwbPZ6JB6eMoM= github.com/hashicorp/go-retryablehttp v0.5.3/go.mod h1:9B5zBasrRhHXnJnui7y6sL7es7NDiJgTc6Er0maI1Xs= @@ -340,21 +344,24 @@ github.com/hashicorp/go-uuid v1.0.0 h1:RS8zrF7PhGwyNPOtxSClXXj9HA8feRnJzgnI1RJCS github.com/hashicorp/go-uuid v1.0.0/go.mod h1:6SBZvOh/SIDV7/2o3Jml5SYk/TvGqwFJ/bN7x4byOro= github.com/hashicorp/golang-lru v0.5.0 h1:CL2msUPvZTLb5O648aiLNJw3hnBxN2+1Jq8rCOH9wdo= github.com/hashicorp/golang-lru v0.5.0/go.mod h1:/m3WP610KZHVQ1SGc6re/UDhFvYD7pJ4Ao+sR/qLZy8= -github.com/hashicorp/golang-lru/arc/v2 v2.0.5 h1:l2zaLDubNhW4XO3LnliVj0GXO3+/CGNJAg1dcN2Fpfw= -github.com/hashicorp/golang-lru/arc/v2 v2.0.5/go.mod h1:ny6zBSQZi2JxIeYcv7kt2sH2PXJtirBN7RDhRpxPkxU= -github.com/hashicorp/golang-lru/v2 v2.0.5 h1:wW7h1TG88eUIJ2i69gaE3uNVtEPIagzhGvHgwfx2Vm4= -github.com/hashicorp/golang-lru/v2 v2.0.5/go.mod h1:QeFd9opnmA6QUJc5vARoKUSoFhyfM2/ZepoAG6RGpeM= +github.com/hashicorp/golang-lru/arc/v2 v2.0.7 h1:QxkVTxwColcduO+LP7eJO56r2hFiG8zEbfAAzRv52KQ= +github.com/hashicorp/golang-lru/arc/v2 v2.0.7/go.mod h1:Pe7gBlGdc8clY5LJ0LpJXMt5AmgmWNH1g+oFFVUHOEc= +github.com/hashicorp/golang-lru/v2 v2.0.7 h1:a+bsQ5rvGLjzHuww6tVxozPZFVghXaHOwFs4luLUK2k= +github.com/hashicorp/golang-lru/v2 v2.0.7/go.mod h1:QeFd9opnmA6QUJc5vARoKUSoFhyfM2/ZepoAG6RGpeM= github.com/hashicorp/raft v1.1.0/go.mod h1:4Ak7FSPnuvmb0GV6vgIAJ4vYT4bek9bb6Q+7HVbyzqM= -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 v1.7.1 h1:ytxsNx4baHsRZrhUcbt3+79zc4ly8qm7pi0393pSchY= +github.com/hashicorp/raft v1.7.1/go.mod h1:hUeiEwQQR/Nk2iKDD0dkEhklSsu3jcAcqvPzPoZSAEM= 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/hashicorp/raft-boltdb/v2 v2.3.0 h1:fPpQR1iGEVYjZ2OELvUHX600VAK5qmdnDEv3eXOwZUA= +github.com/hashicorp/raft-boltdb/v2 v2.3.0/go.mod h1:YHukhB04ChJsLHLJEUD6vjFyLX2L3dsX3wPBZcX4tmc= 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= -github.com/holiman/uint256 v1.2.4/go.mod h1:EOMSn4q6Nyt9P6efbI3bueV4e1b3dGlUCXeiRV4ng7E= +github.com/holiman/uint256 v1.2.0/go.mod h1:y4ga/t+u+Xwd7CpDgZESaRcWy0I7XMlTMA25ApIH5Jw= +github.com/holiman/uint256 v1.3.1 h1:JfTzmih28bittyHM8z360dCjIA9dbPIBlcTI6lmctQs= +github.com/holiman/uint256 v1.3.1/go.mod h1:EOMSn4q6Nyt9P6efbI3bueV4e1b3dGlUCXeiRV4ng7E= github.com/hpcloud/tail v1.0.0/go.mod h1:ab1qPbhIpdTxEkNHXyeSf5vhxWSCs/tWer42PpOxQnU= github.com/huin/goupnp v1.3.0 h1:UvLUlWDNpoUdYzb2TCn+MuTWtcjXKSza2n6CBdQ0xXc= github.com/huin/goupnp v1.3.0/go.mod h1:gnGPsThkYa7bFi/KWmEysQRf48l2dvR5bxr2OFckNX8= @@ -382,60 +389,6 @@ github.com/ipfs/go-ds-leveldb v0.5.0/go.mod h1:d3XG9RUDzQ6V4SHi8+Xgj9j1XuEk1z82l github.com/ipfs/go-ipfs-delay v0.0.0-20181109222059-70721b86a9a8/go.mod h1:8SP1YXK1M1kXuc4KJZINY3TQQ03J2rwBG9QfXmbRPrw= github.com/ipfs/go-log/v2 v2.5.1 h1:1XdUzF7048prq4aBjDQQ4SL5RxftpRGdXhNRwKSAlcY= github.com/ipfs/go-log/v2 v2.5.1/go.mod h1:prSpmC1Gpllc9UYWxDiZDreBYw7zp4Iqp1kOLU9U5UI= -github.com/jackc/chunkreader v1.0.0 h1:4s39bBR8ByfqH+DKm8rQA3E1LHZWB9XWcrz8fqaZbe0= -github.com/jackc/chunkreader v1.0.0/go.mod h1:RT6O25fNZIuasFJRyZ4R/Y2BbhasbmZXF9QQ7T3kePo= -github.com/jackc/chunkreader/v2 v2.0.0/go.mod h1:odVSm741yZoC3dpHEUXIqA9tQRhFrgOHwnPIn9lDKlk= -github.com/jackc/chunkreader/v2 v2.0.1 h1:i+RDz65UE+mmpjTfyz0MoVTnzeYxroil2G82ki7MGG8= -github.com/jackc/chunkreader/v2 v2.0.1/go.mod h1:odVSm741yZoC3dpHEUXIqA9tQRhFrgOHwnPIn9lDKlk= -github.com/jackc/pgconn v0.0.0-20190420214824-7e0022ef6ba3/go.mod h1:jkELnwuX+w9qN5YIfX0fl88Ehu4XC3keFuOJJk9pcnA= -github.com/jackc/pgconn v0.0.0-20190824142844-760dd75542eb/go.mod h1:lLjNuW/+OfW9/pnVKPazfWOgNfH2aPem8YQ7ilXGvJE= -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/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= -github.com/jackc/pgmock v0.0.0-20201204152224-4fe30f7445fd/go.mod h1:hrBW0Enj2AZTNpt/7Y5rr2xe/9Mn757Wtb2xeBzPv2c= -github.com/jackc/pgmock v0.0.0-20210724152146-4ad1a8207f65/go.mod h1:5R2h2EEX+qri8jOWMbJCtaPWkrrNc7OHwsp2TCqp7ak= -github.com/jackc/pgpassfile v1.0.0 h1:/6Hmqy13Ss2zCq62VdNG8tM1wchn8zjSGOBJ6icpsIM= -github.com/jackc/pgpassfile v1.0.0/go.mod h1:CEx0iS5ambNFdcRtxPj5JhEz+xB6uRky5eyVu/W2HEg= -github.com/jackc/pgproto3 v1.1.0 h1:FYYE4yRw+AgI8wXIinMlNjBbp/UitDJwfj5LqqewP1A= -github.com/jackc/pgproto3 v1.1.0/go.mod h1:eR5FA3leWg7p9aeAqi37XOTgTIbkABlvcPB3E5rlc78= -github.com/jackc/pgproto3/v2 v2.0.0-alpha1.0.20190420180111-c116219b62db/go.mod h1:bhq50y+xrl9n5mRYyCBFKkpRVTLYJVWeCc+mEAI3yXA= -github.com/jackc/pgproto3/v2 v2.0.0-alpha1.0.20190609003834-432c2951c711/go.mod h1:uH0AWtUmuShn0bcesswc4aBTWGvw0cAxIJp+6OB//Wg= -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/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= -github.com/jackc/pgtype v0.0.0-20190421001408-4ed0de4755e0/go.mod h1:hdSHsc1V01CGwFsrv11mJRHWJ6aifDLfdV3aVjFF0zg= -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.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/go.mod h1:1QD0+tgSXP7iUjYm9C1NxKhny7lq6ee99u/z+IHFcgs= -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.5.5 h1:amBjrZVmksIdNjxGW/IiIMzxMKZFelXbUoPNb+8sjQw= -github.com/jackc/pgx/v5 v5.5.5/go.mod h1:ez9gk+OAat140fv9ErkZDYFWmXLfV+++K0uAOiwgm1A= -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= github.com/jackpal/go-nat-pmp v1.0.2/go.mod h1:QPH045xvCAeXUZOxsnwmrtiCoxIr9eob+4orBN1SBKc= github.com/jbenet/go-cienv v0.1.0/go.mod h1:TqNnHUmJgXau0nCzC7kXWeotg3J9W34CUv5Djy1+FlA= @@ -448,28 +401,27 @@ github.com/jedisct1/go-minisign v0.0.0-20230811132847-661be99b8267/go.mod h1:h1n github.com/jellevandenhooff/dkim v0.0.0-20150330215556-f50fe3d243e1/go.mod h1:E0B/fFc00Y+Rasa88328GlI/XbtyysCtTHZS8h7IrBU= github.com/jessevdk/go-flags v0.0.0-20141203071132-1679536dcc89/go.mod h1:4FA24M0QyGHXBuZZK/XkWh8h0e1EYbRYJSGM75WSRxI= github.com/jessevdk/go-flags v1.4.0/go.mod h1:4FA24M0QyGHXBuZZK/XkWh8h0e1EYbRYJSGM75WSRxI= -github.com/jinzhu/inflection v1.0.0 h1:K317FqzuhWc8YvSVlFMCCUb36O/S9MCKRDI7QkRKD/E= -github.com/jinzhu/inflection v1.0.0/go.mod h1:h+uFLlag+Qp1Va5pdKtLDYj+kHp5pxUVkryuEj+Srlc= -github.com/jinzhu/now v1.1.5 h1:/o9tlHleP7gOFmsnYNz3RGnqzefHA47wQpKrrdTIwXQ= -github.com/jinzhu/now v1.1.5/go.mod h1:d3SSVoowX0Lcu0IBviAWJpolVfI5UJVZZ7cO71lE/z8= github.com/jrick/logrotate v1.0.0/go.mod h1:LNinyqDIJnpAur+b8yyulnQw/wDuN1+BYKlTRt3OuAQ= github.com/json-iterator/go v1.1.6/go.mod h1:+SdeFBvtyEkXs7REEP0seUULqWtbJapLOCVDaaPEHmU= github.com/json-iterator/go v1.1.9/go.mod h1:KdQUCv79m/52Kvf8AW2vK1V8akMuk1QjK/uOdHXbAo4= github.com/jstemmer/go-junit-report v0.0.0-20190106144839-af01ea7f8024/go.mod h1:6v2b51hI/fHJwM22ozAgKL4VKDeJcHhJFhtBdhmNjmU= github.com/julienschmidt/httprouter v1.2.0/go.mod h1:SYymIcj16QtmaHHD7aYtjjsJG7VTCxuUUipMqKk8s4w= -github.com/karalabe/usb v0.0.3-0.20230711191512-61db3e06439c h1:AqsttAyEyIEsNz5WLRwuRwjiT5CMDUfLk6cFJDVPebs= -github.com/karalabe/usb v0.0.3-0.20230711191512-61db3e06439c/go.mod h1:Od972xHfMJowv7NGVDiWVxk2zxnWgjLlJzE+F4F7AGU= +github.com/karalabe/hid v1.0.1-0.20240306101548-573246063e52 h1:msKODTL1m0wigztaqILOtla9HeW1ciscYG4xjLtvk5I= +github.com/karalabe/hid v1.0.1-0.20240306101548-573246063e52/go.mod h1:qk1sX/IBgppQNcGCRoj90u6EGC056EBoIc1oEjCWla8= +github.com/kilic/bls12-381 v0.1.0 h1:encrdjqKMEvabVQ7qYOKu1OvhqpK4s47wDYtNiPtlp4= +github.com/kilic/bls12-381 v0.1.0/go.mod h1:vDTTHJONJ6G+P2R74EhnyotQDTliQDnFEwhdmfzw1ig= github.com/kisielk/errcheck v1.2.0/go.mod h1:/BMXB+zMLi60iA8Vv6Ksmxu/1UDYcXs4uQLJ+jE2L00= 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.6 h1:60eq2E/jlfwQXtvZEeBUYADs+BwKBWURIY+Gj2eRGjI= -github.com/klauspost/compress v1.17.6/go.mod h1:/dCuZOvVtNoHsyb+cuJD3itjs3NbnF6KH9zAO4BDxPM= +github.com/klauspost/compress v1.4.1/go.mod h1:RyIbtBH6LamlWaDj8nUwkbUhJ87Yi3uG0guNDohfE1A= +github.com/klauspost/compress v1.17.9 h1:6KIumPrER1LHsvBVuDa0r5xaG0Es51mhhB9BQB2qeMA= +github.com/klauspost/compress v1.17.9/go.mod h1:Di0epgTjJY877eYKx5yC51cX2A2Vl2ibi7bDH9ttBbw= +github.com/klauspost/cpuid v1.2.0/go.mod h1:Pj4uuM528wm8OyEC2QMXAi2YiTZ96dNQPGgoMS4s3ek= 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/klauspost/cpuid/v2 v2.2.8 h1:+StwCXwm9PdpiEkPyzBXIy+M9KUb4ODm0Zarf1kS5BM= +github.com/klauspost/cpuid/v2 v2.2.8/go.mod h1:Lcz8mBdAVJIBVzewtcLocK12l3Y+JytZYpaMropDUws= github.com/konsorten/go-windows-terminal-sequences v1.0.1/go.mod h1:T0+1ngSBFLxvqU3pZ+m/2kptfBszLMUkC4ZK/EgS/cQ= -github.com/konsorten/go-windows-terminal-sequences v1.0.2/go.mod h1:T0+1ngSBFLxvqU3pZ+m/2kptfBszLMUkC4ZK/EgS/cQ= github.com/koron/go-ssdp v0.0.4 h1:1IDwrghSKYM7yLf7XCzbByg2sJ/JcNOZRXS2jczTwz0= github.com/koron/go-ssdp v0.0.4/go.mod h1:oDXq+E5IL5q0U8uSBcoAXzTzInwy5lEgC91HoKtbmZk= github.com/kr/logfmt v0.0.0-20140226030751-b84e30acd515/go.mod h1:+0opPa2QZZtGFBFZlji/RkVcI2GknAs/DXo4wKdlNEc= @@ -481,36 +433,39 @@ github.com/kr/pretty v0.3.1 h1:flRD4NNwYAUpkphVc1HcthR4KEIFJ65n8Mw5qdRn3LE= github.com/kr/pretty v0.3.1/go.mod h1:hoEshYVHaxMs3cyo3Yncou5ZscifuDolrwPKZanG3xk= github.com/kr/pty v1.1.1/go.mod h1:pFQYn66WHrOpPYNljwOMqo10TkYh1fy3cYio2l3bCsQ= github.com/kr/pty v1.1.3/go.mod h1:pFQYn66WHrOpPYNljwOMqo10TkYh1fy3cYio2l3bCsQ= -github.com/kr/pty v1.1.8/go.mod h1:O1sed60cT9XZ5uDucP5qwvh+TE3NnUj51EiZO/lmSfw= github.com/kr/text v0.1.0/go.mod h1:4Jbv+DJW3UT/LiOwJeYQe1efqtUx/iVham/4vfdArNI= github.com/kr/text v0.2.0 h1:5Nx0Ya0ZqY2ygV366QzturHI13Jq95ApcVaJBhpS+AY= github.com/kr/text v0.2.0/go.mod h1:eLer722TekiGuMkidMxC/pM04lWEeraHUUmBw8l2grE= +github.com/kurtosis-tech/kurtosis-portal/api/golang v0.0.0-20230818182330-1a86869414d2 h1:izciXrFyFR+ihJ7nLTOkoIX5GzBPIp8gVKlw94gIc98= +github.com/kurtosis-tech/kurtosis-portal/api/golang v0.0.0-20230818182330-1a86869414d2/go.mod h1:bWSMQK3WHVTGHX9CjxPAb/LtzcmfOxID2wdzakSWQxo= +github.com/kurtosis-tech/kurtosis/api/golang v1.3.0 h1:6r+ER69AgIyoHM48DLcP6r+f6dKDeU+65U8Uiibj46w= +github.com/kurtosis-tech/kurtosis/api/golang v1.3.0/go.mod h1:9T22P7Vv3j5g6sbm78DxHQ4s9C4Cj3s9JjFQ7DFyYpM= +github.com/kurtosis-tech/kurtosis/contexts-config-store v0.0.0-20230818184218-f4e3e773463b h1:hMoIM99QKcYQqsnK4AF7Lovi9ZD9ac6lZLZ5D/jx2x8= +github.com/kurtosis-tech/kurtosis/contexts-config-store v0.0.0-20230818184218-f4e3e773463b/go.mod h1:4pFdrRwDz5R+Fov2ZuTaPhAVgjA2jhGh1Izf832sX7A= +github.com/kurtosis-tech/kurtosis/grpc-file-transfer/golang v0.0.0-20230803130419-099ee7a4e3dc h1:7IlEpSehmWcNXOFpNP24Cu5HQI3af7GCBQw//m+LnvQ= +github.com/kurtosis-tech/kurtosis/grpc-file-transfer/golang v0.0.0-20230803130419-099ee7a4e3dc/go.mod h1:TOWMQgvAJH/NiWWERGXg/plT9lS7aFcXFxCa0M5sfHo= +github.com/kurtosis-tech/kurtosis/path-compression v0.0.0-20240307154559-64d2929cd265 h1:uSDftcGStwuAjHv8fV2TleNCKSWPvUKe7EaplFG3yBI= +github.com/kurtosis-tech/kurtosis/path-compression v0.0.0-20240307154559-64d2929cd265/go.mod h1:aDMrPeS7Gii8W6SDKSKyrBNgEQAUYidriyeKGf+Ml3I= +github.com/kurtosis-tech/stacktrace v0.0.0-20211028211901-1c67a77b5409 h1:YQTATifMUwZEtZYb0LVA7DK2pj8s71iY8rzweuUQ5+g= +github.com/kurtosis-tech/stacktrace v0.0.0-20211028211901-1c67a77b5409/go.mod h1:y5weVs5d9wXXHcDA1awRxkIhhHC1xxYJN8a7aXnE6S8= github.com/kylelemons/godebug v1.1.0 h1:RPNrshWIDI6G2gRW9EHilWtl7Z6Sb1BR0xunSBf0SNc= github.com/kylelemons/godebug v1.1.0/go.mod h1:9/0rRGxNHcop5bhtWyNeEfOS8JIWk580+fNqagV/RAw= github.com/labstack/echo/v4 v4.2.1/go.mod h1:AA49e0DZ8kk5jTOOCKNuPR6oTnBS0dYiM4FW1e6jwpg= github.com/labstack/gommon v0.3.0/go.mod h1:MULnywXg0yavhxWKc+lOruYdAhDwPK9wf0OL7NoOu+k= github.com/leanovate/gopter v0.2.9 h1:fQjYxZaynp97ozCzfOyOuAGOU4aU/z37zf/tOujFk7c= github.com/leanovate/gopter v0.2.9/go.mod h1:U2L/78B+KVFIx2VmW6onHJQzXtFb+p5y3y2Sh+Jxxv8= -github.com/lib/pq v1.0.0/go.mod h1:5WUZQaWbwv1U+lTReE5YruASi9Al49XbQIvNi/34Woo= -github.com/lib/pq v1.1.0/go.mod h1:5WUZQaWbwv1U+lTReE5YruASi9Al49XbQIvNi/34Woo= -github.com/lib/pq v1.2.0/go.mod h1:5WUZQaWbwv1U+lTReE5YruASi9Al49XbQIvNi/34Woo= -github.com/lib/pq v1.10.2/go.mod h1:AlVN5x4E4T544tWzH6hKfbfQvm3HdbOxrmggDNAPY9o= -github.com/lib/pq v1.10.9 h1:YXG7RB+JIjhP29X+OtkiDnYaXQwpS4JEWq7dtCCRUEw= -github.com/lib/pq v1.10.9/go.mod h1:AlVN5x4E4T544tWzH6hKfbfQvm3HdbOxrmggDNAPY9o= github.com/libp2p/go-buffer-pool v0.1.0 h1:oK4mSFcQz7cTQIfqbe4MIj9gLW+mnanjyFtc6cdF0Y8= github.com/libp2p/go-buffer-pool v0.1.0/go.mod h1:N+vh8gMqimBzdKkSMVuydVDq+UV5QTWy5HSiZacSbPg= -github.com/libp2p/go-cidranger v1.1.0 h1:ewPN8EZ0dd1LSnrtuwd4709PXVcITVeuwbag38yPW7c= -github.com/libp2p/go-cidranger v1.1.0/go.mod h1:KWZTfSr+r9qEo9OkI9/SIEeAtw+NNoU0dXIXt15Okic= github.com/libp2p/go-flow-metrics v0.1.0 h1:0iPhMI8PskQwzh57jB9WxIuIOQ0r+15PChFGkx3Q3WM= github.com/libp2p/go-flow-metrics v0.1.0/go.mod h1:4Xi8MX8wj5aWNDAZttg6UPmc0ZrnFNsMtpsYUClFtro= -github.com/libp2p/go-libp2p v0.32.0 h1:86I4B7nBUPIyTgw3+5Ibq6K7DdKRCuZw8URCfPc1hQM= -github.com/libp2p/go-libp2p v0.32.0/go.mod h1:hXXC3kXPlBZ1eu8Q2hptGrMB4mZ3048JUoS4EKaHW5c= -github.com/libp2p/go-libp2p-asn-util v0.3.0 h1:gMDcMyYiZKkocGXDQ5nsUQyquC9+H+iLEQHwOCZ7s8s= -github.com/libp2p/go-libp2p-asn-util v0.3.0/go.mod h1:B1mcOrKUE35Xq/ASTmQ4tN3LNzVVaMNmq2NACuqyB9w= +github.com/libp2p/go-libp2p v0.36.2 h1:BbqRkDaGC3/5xfaJakLV/BrpjlAuYqSB0lRvtzL3B/U= +github.com/libp2p/go-libp2p v0.36.2/go.mod h1:XO3joasRE4Eup8yCTTP/+kX+g92mOgRaadk46LmPhHY= +github.com/libp2p/go-libp2p-asn-util v0.4.1 h1:xqL7++IKD9TBFMgnLPZR6/6iYhawHKHl950SO9L6n94= +github.com/libp2p/go-libp2p-asn-util v0.4.1/go.mod h1:d/NI6XZ9qxw67b4e+NgpQexCIiFYJjErASrYW4PFDN8= 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.1 h1:/RqOZpEtAolsr8/9CC8KqROJSOZeu7lK7fPftn4MwNg= -github.com/libp2p/go-libp2p-pubsub v0.10.1/go.mod h1:1OxbaT/pFRO5h+Dpze8hdHQ63R0ke55XTs6b6NwLLkw= +github.com/libp2p/go-libp2p-pubsub v0.12.0 h1:PENNZjSfk8KYxANRlpipdS7+BfLmOl3L2E/6vSNjbdI= +github.com/libp2p/go-libp2p-pubsub v0.12.0/go.mod h1:Oi0zw9aw8/Y5GC99zt+Ef2gYAl+0nZlwdJonDyOz/sE= 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= @@ -532,17 +487,13 @@ github.com/mailru/easyjson v0.0.0-20190626092158-b2ccc519800e/go.mod h1:C1wdFJiN github.com/marten-seemann/tcp v0.0.0-20210406111302-dfbc87cc63fd h1:br0buuQ854V8u83wA0rVZ8ttrq5CpaPZdvrK0LP2lOk= github.com/marten-seemann/tcp v0.0.0-20210406111302-dfbc87cc63fd/go.mod h1:QuCEs1Nt24+FYQEqAAncTDPJIuGs+LxK1MCiFL25pMU= github.com/matryer/moq v0.0.0-20190312154309-6cfb0558e1bd/go.mod h1:9ELz6aaclSIGnZBoaSLZ3NAl1VTufbOrXBPvtcy6WiQ= -github.com/mattn/go-colorable v0.1.1/go.mod h1:FuOcm+DKB9mbwrcAfNl7/TZVBZ6rcnceauSikq3lYCQ= github.com/mattn/go-colorable v0.1.2/go.mod h1:U0ppj6V5qS13XJ6of8GYAs25YV2eR4EVcfRqFIhoBtE= -github.com/mattn/go-colorable v0.1.6/go.mod h1:u6P/XSegPjTcexA+o6vUJrdnUu04hMope9wVRipJSqc= github.com/mattn/go-colorable v0.1.7/go.mod h1:u6P/XSegPjTcexA+o6vUJrdnUu04hMope9wVRipJSqc= github.com/mattn/go-colorable v0.1.8/go.mod h1:u6P/XSegPjTcexA+o6vUJrdnUu04hMope9wVRipJSqc= github.com/mattn/go-colorable v0.1.9/go.mod h1:u6P/XSegPjTcexA+o6vUJrdnUu04hMope9wVRipJSqc= github.com/mattn/go-colorable v0.1.12/go.mod h1:u5H1YNBxpqRaxsYJYSkiCWKzEfiAb1Gb520KVy5xxl4= github.com/mattn/go-colorable v0.1.13 h1:fFA4WZxdEF4tXPZVKMLwD8oUnCTTo08duU7wxecdEvA= github.com/mattn/go-colorable v0.1.13/go.mod h1:7S9/ev0klgBDR4GtXTXX8a3vIGJpMovkB8vQcUbaXHg= -github.com/mattn/go-isatty v0.0.5/go.mod h1:Iq45c/XA43vh69/j3iqttzPXn0bhXyGjM0Hdxcsrc5s= -github.com/mattn/go-isatty v0.0.7/go.mod h1:Iq45c/XA43vh69/j3iqttzPXn0bhXyGjM0Hdxcsrc5s= github.com/mattn/go-isatty v0.0.8/go.mod h1:Iq45c/XA43vh69/j3iqttzPXn0bhXyGjM0Hdxcsrc5s= github.com/mattn/go-isatty v0.0.9/go.mod h1:YNRxwqDuOph6SZLI9vUUz6OYw3QyUt7WiY2yME+cCiQ= github.com/mattn/go-isatty v0.0.12/go.mod h1:cbi8OIDigv2wuxKPP5vlRcQ1OAZbq2CE4Kysco4FUpU= @@ -555,10 +506,12 @@ github.com/mattn/go-runewidth v0.0.9/go.mod h1:H031xJmbD/WCDINGzjvQ9THkh0rPKHF+m github.com/mattn/go-runewidth v0.0.14 h1:+xnbZSEeDbOIg5/mE6JF0w6n9duR1l3/WmbinWVwUuU= github.com/mattn/go-runewidth v0.0.14/go.mod h1:Jdepj2loyihRzMpdS35Xk/zdY8IAYHsh153qUoGf23w= github.com/matttproud/golang_protobuf_extensions v1.0.1/go.mod h1:D8He9yQNgCq6Z5Ld7szi9bcBfOoFv/3dc6xSMkL2PC0= +github.com/mholt/archiver v3.1.1+incompatible h1:1dCVxuqs0dJseYEhi5pl7MYPH9zDa1wBi7mF09cbNkU= +github.com/mholt/archiver v3.1.1+incompatible/go.mod h1:Dh2dOXnSdiLxRiPoVfIr/fI1TwETms9B8CTWfeh7ROU= github.com/microcosm-cc/bluemonday v1.0.1/go.mod h1:hsXNsILzKxV+sX77C5b8FSuKF00vh2OMYv+xgHpAMF4= github.com/miekg/dns v1.1.41/go.mod h1:p6aan82bvRIyn+zDIv9xYNUpwa73JcSh9BKwknJysuI= -github.com/miekg/dns v1.1.56 h1:5imZaSeoRNvpM9SzWNhEcP9QliKiz20/dA2QabIGVnE= -github.com/miekg/dns v1.1.56/go.mod h1:cRm6Oo2C8TY9ZS/TqsSrseAcncm74lfK5G+ikN2SWWY= +github.com/miekg/dns v1.1.62 h1:cN8OuEF1/x5Rq6Np+h1epln8OiyPWV+lROx9LxcGgIQ= +github.com/miekg/dns v1.1.62/go.mod h1:mvDlcItzm+br7MToIKqkglaGhlFMHJ9DTNNWONWXbNQ= github.com/mikioh/tcp v0.0.0-20190314235350-803a9b46060c h1:bzE/A84HN25pxAuk9Eej1Kz9OUelF97nAc82bDquQI8= github.com/mikioh/tcp v0.0.0-20190314235350-803a9b46060c/go.mod h1:0SQS9kMwD2VsyFEB++InYyBJroV/FRmBgcydeSUcJms= github.com/mikioh/tcpinfo v0.0.0-20190314235526-30a79bb1804b h1:z78hV3sbSMAUoyUMM0I83AUIT6Hu17AWfgjzIbtrYFc= @@ -568,8 +521,8 @@ github.com/mikioh/tcpopt v0.0.0-20190314235656-172688c1accc/go.mod h1:cGKTAVKx4S 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/minio-go/v7 v7.0.76 h1:9nxHH2XDai61cT/EFhyIw/wW4vJfpPNvl7lSFpRt+Ng= +github.com/minio/minio-go/v7 v7.0.76/go.mod h1:AVM3IUN6WwKzmwBxVdjzhH8xq+f57JSbbvzqvUzR6eg= 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= @@ -594,8 +547,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.4 h1:rrKqpY9h+n80EwhhC/kkcunCZZ7URIF8yN1WEUt2Hvc= -github.com/multiformats/go-multiaddr v0.12.4/go.mod h1:sBXrNzucqkFJhvKOiwwLyqamGa/P5EIXNPLovyhQCII= +github.com/multiformats/go-multiaddr v0.13.0 h1:BCBzs61E3AGHcYYTv8dqRH43ZfyrqM8RXVPT8t13tLQ= +github.com/multiformats/go-multiaddr v0.13.0/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= @@ -612,6 +565,8 @@ github.com/multiformats/go-multistream v0.5.0/go.mod h1:n6tMZiwiP2wUsR8DgfDWw1dy github.com/multiformats/go-varint v0.0.1/go.mod h1:3Ls8CIEsrijN6+B7PbrXRPxHRPuXSrVKRY101jdMZYE= github.com/multiformats/go-varint v0.0.7 h1:sWSGR+f/eu5ABZA2ZpYKBILXTTs9JWpdEM/nEGOHFS8= github.com/multiformats/go-varint v0.0.7/go.mod h1:r8PUYw/fD/SjBCiKOoDlGF6QawOELpZAu9eioSos/OU= +github.com/munnerz/goautoneg v0.0.0-20191010083416-a7dc8b61c822 h1:C3w9PqII01/Oq1c1nUAm88MOHcQC9l5mIlSMApZMrHA= +github.com/munnerz/goautoneg v0.0.0-20191010083416-a7dc8b61c822/go.mod h1:+n7T8mK8HuQTcFwEeznm/DIxMOiR9yIdICNftLE1DvQ= github.com/mwitkow/go-conntrack v0.0.0-20161129095857-cc309e4a2223/go.mod h1:qRWi+5nqEBWmkhHvq77mSJWrCKwh8bxhgT7d/eI7P4U= github.com/naoina/go-stringutil v0.1.0 h1:rCUeRUHjBjGTSHl0VC00jUPLz8/F9dDzYI70Hzifhks= github.com/naoina/go-stringutil v0.1.0/go.mod h1:XJ2SJL9jCtBh+P9q5btrd/Ylo8XwT/h1USek5+NqSA0= @@ -619,6 +574,8 @@ github.com/naoina/toml v0.1.2-0.20170918210437-9fafd6967416 h1:shk/vn9oCoOTmwcou github.com/naoina/toml v0.1.2-0.20170918210437-9fafd6967416/go.mod h1:NBIhNtsFMo3G2szEBne+bO4gS192HuIYRqfvOWb4i1E= 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/nwaples/rardecode v1.1.3 h1:cWCaZwfM5H7nAD6PyEdcVnczzV8i/JtotnyW/dD9lEc= +github.com/nwaples/rardecode v1.1.3/go.mod h1:5DzqNKiOdpKKBH87u8VlvAnPZMXcGRhxWkRpHbbfGS0= github.com/nxadm/tail v1.4.4/go.mod h1:kenIhsEOeOJmVchQTgglprH7qJGnHDVpk1VPCcaMI8A= github.com/nxadm/tail v1.4.8/go.mod h1:+ncqLTQzXmGhMZNUePPaPqPvBxHAIsmXswZKocGu+AU= github.com/nxadm/tail v1.4.11 h1:8feyoE3OzPrcshW5/MJ4sGESc5cqmGkGCWlco4l0bqY= @@ -633,19 +590,19 @@ github.com/onsi/ginkgo v1.16.4/go.mod h1:dX+/inL/fNMqNlz0e9LfyB9TswhZpCVdJM/Z6Vv github.com/onsi/ginkgo v1.16.5 h1:8xi0RTUf59SOSfEtZMvwTvXYMzG4gV23XVHOZiXNtnE= github.com/onsi/ginkgo v1.16.5/go.mod h1:+E8gABHa3K6zRBolWtd+ROzc/U5bkGt0FwiG042wbpU= github.com/onsi/ginkgo/v2 v2.1.3/go.mod h1:vw5CSIxN1JObi/U8gcbwft7ZxR2dgaR70JSE3/PpL4c= -github.com/onsi/ginkgo/v2 v2.15.0 h1:79HwNRBAZHOEwrczrgSOPy+eFTTlIGELKy5as+ClttY= -github.com/onsi/ginkgo/v2 v2.15.0/go.mod h1:HlxMHtYF57y6Dpf+mc5529KKmSq9h2FpCF+/ZkwUxKM= +github.com/onsi/ginkgo/v2 v2.20.0 h1:PE84V2mHqoT1sglvHc8ZdQtPcwmvvt29WLEEO3xmdZw= +github.com/onsi/ginkgo/v2 v2.20.0/go.mod h1:lG9ey2Z29hR41WMVthyJBGUBcBhGOtoPF2VFMvBXFCI= github.com/onsi/gomega v1.4.1/go.mod h1:C1qb7wdrVGGVU+Z6iS04AVkA3Q65CEZX59MT0QO5uiA= github.com/onsi/gomega v1.4.3/go.mod h1:ex+gbHU/CVuBBDIJjb2X0qEXbFg53c61hWP/1CpauHY= github.com/onsi/gomega v1.7.1/go.mod h1:XdKZgCCFLUoM/7CFJVPcG8C1xQ1AJ0vpAezJrB7JYyY= github.com/onsi/gomega v1.10.1/go.mod h1:iN09h71vgCQne3DLsj+A5owkum+a2tYe+TOCB1ybHNo= github.com/onsi/gomega v1.17.0/go.mod h1:HnhC7FXeEQY45zxNK3PPoIUhzk/80Xly9PcubAlGdZY= github.com/onsi/gomega v1.19.0/go.mod h1:LY+I3pBVzYsTBU1AnDwOSxaYi9WoWiqgwooUqq9yPro= -github.com/onsi/gomega v1.31.1 h1:KYppCUK+bUgAZwHOu7EXVBKyQA6ILvOESHkn/tgoqvo= -github.com/onsi/gomega v1.31.1/go.mod h1:y40C95dwAD1Nz36SsEnxvfFe8FFfNxzI5eJ0EYGyAy0= +github.com/onsi/gomega v1.34.1 h1:EUMJIKUjM8sKjYbtxQI9A4z2o+rruxnzNvpknOXie6k= +github.com/onsi/gomega v1.34.1/go.mod h1:kU1QgUvBDLXBJq618Xvm2LUX6rSAfRaFRTcdOeDLwwY= github.com/opencontainers/runtime-spec v1.0.2/go.mod h1:jwyrGlmzljRJv/Fgzds9SsS/C5hL+LL3ko9hs6T5lQ0= -github.com/opencontainers/runtime-spec v1.1.0 h1:HHUyrt9mwHUjtasSbXSMvs4cyFxh+Bll4AjJ9odEGpg= -github.com/opencontainers/runtime-spec v1.1.0/go.mod h1:jwyrGlmzljRJv/Fgzds9SsS/C5hL+LL3ko9hs6T5lQ0= +github.com/opencontainers/runtime-spec v1.2.0 h1:z97+pHb3uELt/yiAWD691HNHQIF07bE7dzrbT927iTk= +github.com/opencontainers/runtime-spec v1.2.0/go.mod h1:jwyrGlmzljRJv/Fgzds9SsS/C5hL+LL3ko9hs6T5lQ0= github.com/opentracing/opentracing-go v1.1.0/go.mod h1:UkNAQd3GIcIGf0SeVgPpRdFStlNbqXla1AfSYxPUl2o= github.com/opentracing/opentracing-go v1.2.0 h1:uEJPy/1a5RIPAJ0Ov+OIO8OxWu77jEv+1B0VhjKrZUs= github.com/opentracing/opentracing-go v1.2.0/go.mod h1:GxEUsuufX4nBwe+T+Wl9TAgYrxe9dPLANfrWvHYVTgc= @@ -656,8 +613,52 @@ github.com/pbnjay/memory v0.0.0-20210728143218-7b4eea64cf58 h1:onHthvaw9LFnH4t2D github.com/pbnjay/memory v0.0.0-20210728143218-7b4eea64cf58/go.mod h1:DXv8WO4yhMYhSNPKjeNKa5WY9YCIEBRbNzFFPJbWO6Y= github.com/peterh/liner v1.1.1-0.20190123174540-a2c9a5303de7 h1:oYW+YCJ1pachXTQmzR3rNLYGGz4g/UgFcjb28p/viDM= github.com/peterh/liner v1.1.1-0.20190123174540-a2c9a5303de7/go.mod h1:CRroGNssyjTd/qIG2FyxByd2S8JEAZXBl4qUrZf8GS0= +github.com/pierrec/lz4 v2.6.1+incompatible h1:9UY3+iC23yxF0UfGaYrGplQ+79Rg+h/q9FV9ix19jjM= +github.com/pierrec/lz4 v2.6.1+incompatible/go.mod h1:pdkljMzZIN41W+lC3N2tnIh5sFi+IEE17M5jbnwPHcY= github.com/pingcap/errors v0.11.4 h1:lFuQV/oaUMGcD2tqt+01ROSmJs75VG1ToEOkZIZ4nE4= github.com/pingcap/errors v0.11.4/go.mod h1:Oi8TUi2kEtXXLMJk9l1cGmz20kV3TaQ0usTwv5KuLY8= +github.com/pion/datachannel v1.5.8 h1:ph1P1NsGkazkjrvyMfhRBUAWMxugJjq2HfQifaOoSNo= +github.com/pion/datachannel v1.5.8/go.mod h1:PgmdpoaNBLX9HNzNClmdki4DYW5JtI7Yibu8QzbL3tI= +github.com/pion/dtls/v2 v2.2.7/go.mod h1:8WiMkebSHFD0T+dIU+UeBaoV7kDhOW5oDCzZ7WZ/F9s= +github.com/pion/dtls/v2 v2.2.12 h1:KP7H5/c1EiVAAKUmXyCzPiQe5+bCJrpOeKg/L05dunk= +github.com/pion/dtls/v2 v2.2.12/go.mod h1:d9SYc9fch0CqK90mRk1dC7AkzzpwJj6u2GU3u+9pqFE= +github.com/pion/ice/v2 v2.3.34 h1:Ic1ppYCj4tUOcPAp76U6F3fVrlSw8A9JtRXLqw6BbUM= +github.com/pion/ice/v2 v2.3.34/go.mod h1:mBF7lnigdqgtB+YHkaY/Y6s6tsyRyo4u4rPGRuOjUBQ= +github.com/pion/interceptor v0.1.30 h1:au5rlVHsgmxNi+v/mjOPazbW1SHzfx7/hYOEYQnUcxA= +github.com/pion/interceptor v0.1.30/go.mod h1:RQuKT5HTdkP2Fi0cuOS5G5WNymTjzXaGF75J4k7z2nc= +github.com/pion/logging v0.2.2 h1:M9+AIj/+pxNsDfAT64+MAVgJO0rsyLnoJKCqf//DoeY= +github.com/pion/logging v0.2.2/go.mod h1:k0/tDVsRCX2Mb2ZEmTqNa7CWsQPc+YYCB7Q+5pahoms= +github.com/pion/mdns v0.0.12 h1:CiMYlY+O0azojWDmxdNr7ADGrnZ+V6Ilfner+6mSVK8= +github.com/pion/mdns v0.0.12/go.mod h1:VExJjv8to/6Wqm1FXK+Ii/Z9tsVk/F5sD/N70cnYFbk= +github.com/pion/randutil v0.1.0 h1:CFG1UdESneORglEsnimhUjf33Rwjubwj6xfiOXBa3mA= +github.com/pion/randutil v0.1.0/go.mod h1:XcJrSMMbbMRhASFVOlj/5hQial/Y8oH/HVo7TBZq+j8= +github.com/pion/rtcp v1.2.12/go.mod h1:sn6qjxvnwyAkkPzPULIbVqSKI5Dv54Rv7VG0kNxh9L4= +github.com/pion/rtcp v1.2.14 h1:KCkGV3vJ+4DAJmvP0vaQShsb0xkRfWkO540Gy102KyE= +github.com/pion/rtcp v1.2.14/go.mod h1:sn6qjxvnwyAkkPzPULIbVqSKI5Dv54Rv7VG0kNxh9L4= +github.com/pion/rtp v1.8.3/go.mod h1:pBGHaFt/yW7bf1jjWAoUjpSNoDnw98KTMg+jWWvziqU= +github.com/pion/rtp v1.8.9 h1:E2HX740TZKaqdcPmf4pw6ZZuG8u5RlMMt+l3dxeu6Wk= +github.com/pion/rtp v1.8.9/go.mod h1:pBGHaFt/yW7bf1jjWAoUjpSNoDnw98KTMg+jWWvziqU= +github.com/pion/sctp v1.8.33 h1:dSE4wX6uTJBcNm8+YlMg7lw1wqyKHggsP5uKbdj+NZw= +github.com/pion/sctp v1.8.33/go.mod h1:beTnqSzewI53KWoG3nqB282oDMGrhNxBdb+JZnkCwRM= +github.com/pion/sdp/v3 v3.0.9 h1:pX++dCHoHUwq43kuwf3PyJfHlwIj4hXA7Vrifiq0IJY= +github.com/pion/sdp/v3 v3.0.9/go.mod h1:B5xmvENq5IXJimIO4zfp6LAe1fD9N+kFv+V/1lOdz8M= +github.com/pion/srtp/v2 v2.0.20 h1:HNNny4s+OUmG280ETrCdgFndp4ufx3/uy85EawYEhTk= +github.com/pion/srtp/v2 v2.0.20/go.mod h1:0KJQjA99A6/a0DOVTu1PhDSw0CXF2jTkqOoMg3ODqdA= +github.com/pion/stun v0.6.1 h1:8lp6YejULeHBF8NmV8e2787BogQhduZugh5PdhDyyN4= +github.com/pion/stun v0.6.1/go.mod h1:/hO7APkX4hZKu/D0f2lHzNyvdkTGtIy3NDmLR7kSz/8= +github.com/pion/transport/v2 v2.2.1/go.mod h1:cXXWavvCnFF6McHTft3DWS9iic2Mftcz1Aq29pGcU5g= +github.com/pion/transport/v2 v2.2.3/go.mod h1:q2U/tf9FEfnSBGSW6w5Qp5PFWRLRj3NjLhCCgpRK4p0= +github.com/pion/transport/v2 v2.2.4/go.mod h1:q2U/tf9FEfnSBGSW6w5Qp5PFWRLRj3NjLhCCgpRK4p0= +github.com/pion/transport/v2 v2.2.10 h1:ucLBLE8nuxiHfvkFKnkDQRYWYfp8ejf4YBOPfaQpw6Q= +github.com/pion/transport/v2 v2.2.10/go.mod h1:sq1kSLWs+cHW9E+2fJP95QudkzbK7wscs8yYgQToO5E= +github.com/pion/transport/v3 v3.0.1/go.mod h1:UY7kiITrlMv7/IKgd5eTUcaahZx5oUN3l9SzK5f5xE0= +github.com/pion/transport/v3 v3.0.7 h1:iRbMH05BzSNwhILHoBoAPxoB9xQgOaJk+591KC9P1o0= +github.com/pion/transport/v3 v3.0.7/go.mod h1:YleKiTZ4vqNxVwh77Z0zytYi7rXHl7j6uPLGhhz9rwo= +github.com/pion/turn/v2 v2.1.3/go.mod h1:huEpByKKHix2/b9kmTAM3YoX6MKP+/D//0ClgUYR2fY= +github.com/pion/turn/v2 v2.1.6 h1:Xr2niVsiPTB0FPtt+yAWKFUkU1eotQbGgpTIld4x1Gc= +github.com/pion/turn/v2 v2.1.6/go.mod h1:huEpByKKHix2/b9kmTAM3YoX6MKP+/D//0ClgUYR2fY= +github.com/pion/webrtc/v3 v3.3.0 h1:Rf4u6n6U5t5sUxhYPQk/samzU/oDv7jk6BA5hyO2F9I= +github.com/pion/webrtc/v3 v3.3.0/go.mod h1:hVmrDJvwhEertRWObeb1xzulzHGeVUoPlWvxdGzcfU0= github.com/pkg/diff v0.0.0-20210226163009-20ebb0f2a09e/go.mod h1:pJLUxLENpZxwdsKMEsNbx1VGcRFpLqf3715MtcvvzbA= github.com/pkg/errors v0.8.0/go.mod h1:bwawxfHBFNV+L2hUp1rHADufV3IMtnDRdf1r5NINEl0= github.com/pkg/errors v0.8.1/go.mod h1:bwawxfHBFNV+L2hUp1rHADufV3IMtnDRdf1r5NINEl0= @@ -665,8 +666,9 @@ github.com/pkg/errors v0.9.1 h1:FEBLx1zS214owpjy7qsBeixbURkuhQAwrK5UwLGTwt4= github.com/pkg/errors v0.9.1/go.mod h1:bwawxfHBFNV+L2hUp1rHADufV3IMtnDRdf1r5NINEl0= github.com/pkg/profile v1.7.0 h1:hnbDkaNWPCLMO9wGLdBFTIZvzDrDfBM2072E1S9gJkA= github.com/pkg/profile v1.7.0/go.mod h1:8Uer0jas47ZQMJ7VD+OHknK4YDY07LPUC6dEvqDjvNo= -github.com/pmezard/go-difflib v1.0.0 h1:4DBwDE0NGyQoBHbLQYPwSUPoCMWR5BEzIk/f1lZbAQM= github.com/pmezard/go-difflib v1.0.0/go.mod h1:iKH77koFhYxTK1pcRnkKkqfTogsbg7gZNVY4sRDYZ/4= +github.com/pmezard/go-difflib v1.0.1-0.20181226105442-5d4384ee4fb2 h1:Jamvg5psRIccs7FGNTlIRMkT8wgtp5eCXdBlqhYGL6U= +github.com/pmezard/go-difflib v1.0.1-0.20181226105442-5d4384ee4fb2/go.mod h1:iKH77koFhYxTK1pcRnkKkqfTogsbg7gZNVY4sRDYZ/4= github.com/prashantv/gostub v1.1.0 h1:BTyx3RfQjRHnUWaGF9oQos79AlQ5k8WNktv7VGvVH4g= github.com/prashantv/gostub v1.1.0/go.mod h1:A5zLQHz7ieHGG7is6LLXLz7I8+3LZzsrV0P1IAHhP5U= github.com/prometheus/client_golang v0.8.0/go.mod h1:7SWBe2y4D6OKWSNQJUaRYU/AaXPKyh/dDVn+NZz0KFw= @@ -674,63 +676,63 @@ github.com/prometheus/client_golang v0.9.1/go.mod h1:7SWBe2y4D6OKWSNQJUaRYU/AaXP github.com/prometheus/client_golang v0.9.2/go.mod h1:OsXs2jCmiKlQ1lTBmv21f2mNfw4xf/QclQDMrYNZzcM= github.com/prometheus/client_golang v1.0.0/go.mod h1:db9x61etRT2tGnBNRi70OPL5FsnadC4Ky3P0J6CfImo= github.com/prometheus/client_golang v1.4.0/go.mod h1:e9GMxYsXl05ICDXkRhurwBS4Q3OK1iX/F2sw+iXX5zU= -github.com/prometheus/client_golang v1.19.0 h1:ygXvpU1AoN1MhdzckN+PyD9QJOSD4x7kmXYlnfbA6JU= -github.com/prometheus/client_golang v1.19.0/go.mod h1:ZRM9uEAypZakd+q/x7+gmsvXdURP+DABIEIjnmDdp+k= +github.com/prometheus/client_golang v1.20.4 h1:Tgh3Yr67PaOv/uTqloMsCEdeuFTatm5zIq5+qNN23vI= +github.com/prometheus/client_golang v1.20.4/go.mod h1:PIEt8X02hGcP8JWbeHyeZ53Y/jReSnHgO035n//V5WE= github.com/prometheus/client_model v0.0.0-20180712105110-5c3871d89910/go.mod h1:MbSGuTsp3dbXC40dX6PRTWyKYBIrTGTE9sqQNg2J8bo= github.com/prometheus/client_model v0.0.0-20190129233127-fd36f4220a90/go.mod h1:xMI15A0UPsDsEKsMN9yxemIoYk6Tm2C1GtYGdfGttqA= github.com/prometheus/client_model v0.2.0/go.mod h1:xMI15A0UPsDsEKsMN9yxemIoYk6Tm2C1GtYGdfGttqA= -github.com/prometheus/client_model v0.5.0 h1:VQw1hfvPvk3Uv6Qf29VrPF32JB6rtbgI6cYPYQjL0Qw= -github.com/prometheus/client_model v0.5.0/go.mod h1:dTiFglRmd66nLR9Pv9f0mZi7B7fk5Pm3gvsjB5tr+kI= +github.com/prometheus/client_model v0.6.1 h1:ZKSh/rekM+n3CeS952MLRAdFwIKqeY8b62p8ais2e9E= +github.com/prometheus/client_model v0.6.1/go.mod h1:OrxVMOVHjw3lKMa8+x6HeMGkHMQyHDk9E3jmP2AmGiY= github.com/prometheus/common v0.0.0-20180801064454-c7de2306084e/go.mod h1:daVV7qP5qjZbuso7PdcryaAu0sAZbrN9i7WWcTMWvro= github.com/prometheus/common v0.0.0-20181126121408-4724e9255275/go.mod h1:daVV7qP5qjZbuso7PdcryaAu0sAZbrN9i7WWcTMWvro= github.com/prometheus/common v0.4.1/go.mod h1:TNfzLD0ON7rHzMJeJkieUDPYmFC7Snx/y86RQel1bk4= github.com/prometheus/common v0.9.1/go.mod h1:yhUN8i9wzaXS3w1O07YhxHEBxD+W35wd8bs7vj7HSQ4= -github.com/prometheus/common v0.48.0 h1:QO8U2CdOzSn1BBsmXJXduaaW+dY/5QLjfB8svtSzKKE= -github.com/prometheus/common v0.48.0/go.mod h1:0/KsvlIEfPQCQ5I2iNSAWKPZziNCvRs5EC6ILDTlAPc= +github.com/prometheus/common v0.55.0 h1:KEi6DK7lXW/m7Ig5i47x0vRzuBsHuvJdi5ee6Y3G1dc= +github.com/prometheus/common v0.55.0/go.mod h1:2SECS4xJG1kd8XF9IcM1gMX6510RAEL65zxzNImwdc8= github.com/prometheus/procfs v0.0.0-20180725123919-05ee40e3a273/go.mod h1:c3At6R/oaqEKCNdg8wHV1ftS6bRYblBhIjjI8uT2IGk= github.com/prometheus/procfs v0.0.0-20181005140218-185b4288413d/go.mod h1:c3At6R/oaqEKCNdg8wHV1ftS6bRYblBhIjjI8uT2IGk= github.com/prometheus/procfs v0.0.0-20181204211112-1dc9a6cbc91a/go.mod h1:c3At6R/oaqEKCNdg8wHV1ftS6bRYblBhIjjI8uT2IGk= github.com/prometheus/procfs v0.0.2/go.mod h1:TjEm7ze935MbeOT/UhFTIMYKhuLP4wbCsTZCD3I8kEA= 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/prometheus/procfs v0.15.1 h1:YagwOFzUgYfKKHX6Dr+sHT7km/hxC76UB0learggepc= +github.com/prometheus/procfs v0.15.1/go.mod h1:fB45yRUv8NstnjriLhBQLuOUt+WW4BsoGhij/e3PBqk= +github.com/protolambda/bls12-381-util v0.1.0 h1:05DU2wJN7DTU7z28+Q+zejXkIsA/MF8JZQGhtBZZiWk= +github.com/protolambda/bls12-381-util v0.1.0/go.mod h1:cdkysJTRpeFeuUVx/TXGDQNMTiRAalk1vQw3TYTHcE4= +github.com/protolambda/ctxlock v0.1.0 h1:rCUY3+vRdcdZXqT07iXgyr744J2DU2LCBIXowYAjBCE= +github.com/protolambda/ctxlock v0.1.0/go.mod h1:vefhX6rIZH8rsg5ZpOJfEDYQOppZi19SfPiGOFrNnwM= +github.com/protolambda/zrnt v0.32.2 h1:KZ48T+3UhsPXNdtE/5QEvGc9DGjUaRI17nJaoznoIaM= +github.com/protolambda/zrnt v0.32.2/go.mod h1:A0fezkp9Tt3GBLATSPIbuY4ywYESyAuc/FFmPKg8Lqs= +github.com/protolambda/ztyp v0.2.2 h1:rVcL3vBu9W/aV646zF6caLS/dyn9BN8NYiuJzicLNyY= +github.com/protolambda/ztyp v0.2.2/go.mod h1:9bYgKGqg3wJqT9ac1gI2hnVb0STQq7p/1lapqrqY1dU= 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= -github.com/quic-go/qtls-go1-20 v0.3.4/go.mod h1:X9Nh97ZL80Z+bX/gUXMbipO6OxdiDi58b/fMC9mAL+k= -github.com/quic-go/quic-go v0.39.4 h1:PelfiuG7wXEffUT2yceiqz5V6Pc0TA5ruOd1LcmFc1s= -github.com/quic-go/quic-go v0.39.4/go.mod h1:T09QsDQWjLiQ74ZmacDfqZmhY/NLnw5BC40MANNNZ1Q= -github.com/quic-go/webtransport-go v0.6.0 h1:CvNsKqc4W2HljHJnoT+rMmbRJybShZ0YPFDD3NxaZLY= -github.com/quic-go/webtransport-go v0.6.0/go.mod h1:9KjU4AEBqEQidGHNDkZrb8CAa1abRaosM2yGOyiikEc= +github.com/quic-go/quic-go v0.46.0 h1:uuwLClEEyk1DNvchH8uCByQVjo3yKL9opKulExNDs7Y= +github.com/quic-go/quic-go v0.46.0/go.mod h1:1dLehS7TIR64+vxGR70GDcatWTOtMX2PUtnKsjbTurI= +github.com/quic-go/webtransport-go v0.8.0 h1:HxSrwun11U+LlmwpgM1kEqIqH90IT4N8auv/cD7QFJg= +github.com/quic-go/webtransport-go v0.8.0/go.mod h1:N99tjprW432Ut5ONql/aUhSLT0YVSlwHohQsuac9WaM= github.com/raulk/go-watchdog v1.3.0 h1:oUmdlHxdkXRJlwfG0O9omj8ukerm8MEQavSiDTEtBsk= github.com/raulk/go-watchdog v1.3.0/go.mod h1:fIvOnLbF0b0ZwkB9YU4mOW9Did//4vPZtDqv66NfsMU= github.com/rivo/uniseg v0.2.0/go.mod h1:J6wj4VEh+S6ZtnVlnTBMWIodfgj8LQOQFoIToxlJtxc= -github.com/rivo/uniseg v0.4.3 h1:utMvzDsuh3suAEnhH0RdHmoPbU648o6CvXxTx4SBMOw= -github.com/rivo/uniseg v0.4.3/go.mod h1:FN3SvrM+Zdj16jyLfmOkMNblXMcoc8DfTHruCPUcx88= +github.com/rivo/uniseg v0.4.4 h1:8TfxU8dW6PdqD27gjM8MVNuicgxIjxpm4K7x4jp8sis= +github.com/rivo/uniseg v0.4.4/go.mod h1:FN3SvrM+Zdj16jyLfmOkMNblXMcoc8DfTHruCPUcx88= github.com/rogpeppe/go-internal v1.3.0/go.mod h1:M8bDsm7K2OlrFYOpmOWEs/qY81heoFRclV5y23lUDJ4= github.com/rogpeppe/go-internal v1.6.1/go.mod h1:xXDCJY+GAPziupqXw64V24skbSoqbTEfhy4qGm1nDQc= github.com/rogpeppe/go-internal v1.9.0/go.mod h1:WtVeX8xhTBvf0smdhujwtBcq4Qrzq/fJaraNFVN+nFs= -github.com/rogpeppe/go-internal v1.10.0 h1:TMyTOH3F/DB16zRVcYyreMH6GnZZrwQVAoYjRBZyWFQ= -github.com/rogpeppe/go-internal v1.10.0/go.mod h1:UQnix2H7Ngw/k4C5ijL5+65zddjncjaFoBhdsK/akog= -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/rogpeppe/go-internal v1.11.0 h1:cWPaGQEPrBb5/AsnsZesgZZ9yb1OQ+GOISoDNXVBh4M= +github.com/rogpeppe/go-internal v1.11.0/go.mod h1:ddIwULY96R17DhadqLgMfk9H9tvdUzkipdSkR5nkCZA= +github.com/rs/cors v1.11.0 h1:0B9GE/r9Bc2UxRMMtymBkHTenPkHDv0CW4Y98GBY+po= +github.com/rs/cors v1.11.0/go.mod h1:XyqrcTp5zjWr1wsJ8PIRZssZ8b/WMcMf71DJnit4EMU= +github.com/rs/xid v1.6.0 h1:fV591PaemRlL6JfRxGDEPl69wICngIQ3shQtzfy2gxU= +github.com/rs/xid v1.6.0/go.mod h1:7XoLgs4eV+QndskICGsho+ADou8ySMSjJKDIan90Nz0= github.com/russross/blackfriday v1.5.2/go.mod h1:JO/DiYxRf+HjHt06OyowR9PTA263kcR/rfWxYHBV53g= github.com/russross/blackfriday/v2 v2.0.1/go.mod h1:+Rmxgy9KzJVeS9/2gXHxylqXiyQDYRxCVz55jmeOWTM= github.com/russross/blackfriday/v2 v2.1.0 h1:JIOH55/0cWyOuilr9/qlrm0BSXldqnqwMsf35Ld67mk= github.com/russross/blackfriday/v2 v2.1.0/go.mod h1:+Rmxgy9KzJVeS9/2gXHxylqXiyQDYRxCVz55jmeOWTM= -github.com/satori/go.uuid v1.2.0/go.mod h1:dA0hQrYB0VpLJoorglMZABFdXlWrHn1NEOzdhQKdks0= github.com/sergi/go-diff v1.0.0/go.mod h1:0CfEIISq7TuYL3j771MWULgwwjU+GofnZX9QAmXWZgo= github.com/shirou/gopsutil v3.21.11+incompatible h1:+1+c1VGhc88SSonWP6foOcLhvnKlUeu/erjjvaPEYiI= github.com/shirou/gopsutil v3.21.11+incompatible/go.mod h1:5b4v6he4MtMOwMlS0TUMTu2PcXUg8+E1lC7eC3UO/RA= -github.com/shopspring/decimal v0.0.0-20180709203117-cd690d0c9e24/go.mod h1:M+9NzErvs504Cn4c5DxATwIqPbtswREoFCre64PpcG4= -github.com/shopspring/decimal v1.2.0/go.mod h1:DKyhrW/HYNuLGql+MJL6WCR6knT2jwCFRcu2hWCYk4o= github.com/shurcooL/component v0.0.0-20170202220835-f88ec8f54cc4/go.mod h1:XhFIlyj5a1fBNx5aJTbKoIq0mNaPvOagO+HjB3EtxrY= github.com/shurcooL/events v0.0.0-20181021180414-410e4ca65f48/go.mod h1:5u70Mqkb5O5cxEA8nxTsgrgLehJeAw6Oc4Ab1c/P1HM= github.com/shurcooL/github_flavored_markdown v0.0.0-20181002035957-2122de532470/go.mod h1:2dOwnU2uBioM+SGy2aZoq1f/Sd1l9OkAeAUvjSyvgU0= @@ -755,9 +757,10 @@ github.com/shurcooL/sanitized_anchor_name v1.0.0/go.mod h1:1NzhyTcUVG4SuEtjjoZeV github.com/shurcooL/users v0.0.0-20180125191416-49c67e49c537/go.mod h1:QJTqeLYEDaXHZDBsXlPCDqdhQuJkuw4NOtaxYe3xii4= github.com/shurcooL/webdavfs v0.0.0-20170829043945-18c3829fa133/go.mod h1:hKmq5kWdCj2z2KEozexVbfEZIWiTjhE0+UjmZgPqehw= github.com/sirupsen/logrus v1.2.0/go.mod h1:LxeOpSwHxABJmUn/MG1IvRgCAasNZTLOkJPxbbu5VWo= -github.com/sirupsen/logrus v1.4.1/go.mod h1:ni0Sbl8bgC9z8RoU9G6nDWqqs/fq4eDPysMBDgk/93Q= github.com/sirupsen/logrus v1.4.2/go.mod h1:tLMulIdttU9McNUspp0xgXVQah82FyeX6MwdIuYE2rE= github.com/sirupsen/logrus v1.7.0/go.mod h1:yWOB1SBYBC5VeMP7gHvWumXLIWorT60ONWic61uBYv0= +github.com/sirupsen/logrus v1.9.3 h1:dueUQJ1C2q9oE3F7wvmSGAaVtTmUizReu6fjN8uqzbQ= +github.com/sirupsen/logrus v1.9.3/go.mod h1:naHLuLoDiP4jHNo9R0sCBMtWGeIprob74mVsIT4qYEQ= 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= @@ -767,7 +770,6 @@ github.com/status-im/keycard-go v0.2.0 h1:QDLFswOQu1r5jsycloeQh3bVU8n/NatHHaZobt github.com/status-im/keycard-go v0.2.0/go.mod h1:wlp8ZLbsmrF6g6WjugPAx+IzoLrkdf9+mHxBEeo3Hbg= github.com/stretchr/objx v0.1.0/go.mod h1:HFkY916IF+rwdDfMAkV7OtwuqBVzrE8GR6GFx+wExME= 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= @@ -776,12 +778,12 @@ github.com/stretchr/testify v1.2.2/go.mod h1:a8OnRcib4nhh0OaRAV+Yts87kKdq0PP7pXf github.com/stretchr/testify v1.3.0/go.mod h1:M5WIy9Dh21IEIfnGCwXGc5bZfKNJtfHm1UVUgZn+9EI= github.com/stretchr/testify v1.4.0/go.mod h1:j7eGeouHqKxXV5pUuKE4zz7dFj8WfuZ+81PSLYec5m4= github.com/stretchr/testify v1.5.1/go.mod h1:5W2xD1RspED5o8YsWQXVCued0rvSQ+mT+I5cxcmMvtA= -github.com/stretchr/testify v1.6.1/go.mod h1:6Fq8oRcR53rry900zMqJjRRixrwX3KX962/h/Wwjteg= github.com/stretchr/testify v1.7.0/go.mod h1:6Fq8oRcR53rry900zMqJjRRixrwX3KX962/h/Wwjteg= 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.8.3/go.mod h1:sz/lmYIOXD/1dqDmKjjqLyZ2RngseejIcXlSw2iwfAo= +github.com/stretchr/testify v1.8.4/go.mod h1:sz/lmYIOXD/1dqDmKjjqLyZ2RngseejIcXlSw2iwfAo= 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= @@ -798,55 +800,54 @@ github.com/tklauser/numcpus v0.6.1/go.mod h1:1XfjsgE2zo8GVw7POkMbHENHzVg3GzmoZ9f github.com/tv42/httpunix v0.0.0-20150427012821-b75d8614f926/go.mod h1:9ESjWnEqriFuLhtthL60Sar/7RFoluCcXsuvEwTV5KM= github.com/tyler-smith/go-bip39 v1.1.0 h1:5eUemwrMargf3BSLRRCalXT93Ns6pQJIjYQN2nyfOP8= github.com/tyler-smith/go-bip39 v1.1.0/go.mod h1:gUYDtqQw1JS3ZJ8UWVcGTGqqr6YIN3CWg+kkNaLt55U= +github.com/ulikunitz/xz v0.5.8/go.mod h1:nbz6k7qbPmH4IRqmfOplQw/tblSgqTqBwxkY0oWt/14= +github.com/ulikunitz/xz v0.5.11 h1:kpFauv27b6ynzBNT/Xy+1k+fK4WswhN/6PN5WhFAGw8= +github.com/ulikunitz/xz v0.5.11/go.mod h1:nbz6k7qbPmH4IRqmfOplQw/tblSgqTqBwxkY0oWt/14= github.com/urfave/cli v1.22.2/go.mod h1:Gos4lmkARVdJ6EkW0WaNv/tZAAMe9V7XWyB60NtXRu0= -github.com/urfave/cli/v2 v2.27.1 h1:8xSQ6szndafKVRmfyeUMxkNUJQMjL1F2zmsZ+qHpfho= -github.com/urfave/cli/v2 v2.27.1/go.mod h1:8qnjx1vcq5s2/wpsqoZFndg2CE5tNFyrTvS6SinrnYQ= +github.com/urfave/cli/v2 v2.27.4 h1:o1owoI+02Eb+K107p27wEX9Bb8eqIoZCfLXloLUSWJ8= +github.com/urfave/cli/v2 v2.27.4/go.mod h1:m4QzxcD2qpra4z7WhzEGn74WZLViBnMpb1ToCAKdGRQ= github.com/valyala/bytebufferpool v1.0.0/go.mod h1:6bBcMArwyJ5K/AmCkWv1jt77kVWyCJ6HpOuEn7z0Csc= github.com/valyala/fasttemplate v1.0.1/go.mod h1:UQGH1tvbgY+Nz5t2n7tXsz52dQxojPUpymEIMZ47gx8= github.com/valyala/fasttemplate v1.2.1/go.mod h1:KHLXt3tVN2HBp8eijSv/kGJopbvo7S+qRAEEKiv+SiQ= github.com/viant/assertly v0.4.8/go.mod h1:aGifi++jvCrUaklKEKT0BU95igDNaqkvz+49uaYMPRU= github.com/viant/toolbox v0.24.0/go.mod h1:OxMCG57V0PXuIP2HNQrtJf2CjqdmbrOx5EkMILuUhzM= -github.com/xrash/smetrics v0.0.0-20201216005158-039620a65673 h1:bAn7/zixMGCfxrRTfdpNzjtPYqr8smhKouy9mxVdGPU= -github.com/xrash/smetrics v0.0.0-20201216005158-039620a65673/go.mod h1:N3UwUGtsrSj3ccvlPHLoLsHnpR27oXr4ZE984MbSER8= +github.com/wlynxg/anet v0.0.3/go.mod h1:eay5PRQr7fIVAMbTbchTnO9gG65Hg/uYGdc7mguHxoA= +github.com/wlynxg/anet v0.0.4 h1:0de1OFQxnNqAu+x2FAKKCVIrnfGKQbs7FQz++tB0+Uw= +github.com/wlynxg/anet v0.0.4/go.mod h1:eay5PRQr7fIVAMbTbchTnO9gG65Hg/uYGdc7mguHxoA= +github.com/xi2/xz v0.0.0-20171230120015-48954b6210f8 h1:nIPpBwaJSVYIxUFsDv3M8ofmx9yWTog9BfvIu0q41lo= +github.com/xi2/xz v0.0.0-20171230120015-48954b6210f8/go.mod h1:HUYIGzjTL3rfEspMxjDjgmT5uz5wzYJKVo23qUhYTos= +github.com/xrash/smetrics v0.0.0-20240521201337-686a1a2994c1 h1:gEOO8jv9F4OT7lGCjxCBTO/36wtF6j2nSip77qHd4x4= +github.com/xrash/smetrics v0.0.0-20240521201337-686a1a2994c1/go.mod h1:Ohn+xnUBiLI6FVj/9LpzZWtj1/D6lUovWYBkxHVV3aM= 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.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.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.etcd.io/bbolt v1.3.5 h1:XAzx9gjCb0Rxj7EoqcClPD1d5ZBxZJk0jbuoPHenBt0= +go.etcd.io/bbolt v1.3.5/go.mod h1:G5EMThwa9y8QZGBClrRx5EY+Yw9kAhnjy3bSjsnlVTQ= 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= -go.uber.org/atomic v1.4.0/go.mod h1:gD2HeocX3+yG+ygLZcrzQJaqmWj9AIm7n08wl/qW/PE= -go.uber.org/atomic v1.5.0/go.mod h1:sABNBOSYdrvTF6hTgEIbc7YasKWGhgEQZyfxyTvoXHQ= go.uber.org/atomic v1.6.0/go.mod h1:sABNBOSYdrvTF6hTgEIbc7YasKWGhgEQZyfxyTvoXHQ= go.uber.org/atomic v1.7.0/go.mod h1:fEN4uk6kAWBTFdckzkM89CLk9XfWZrxpCo0nPH17wJc= -go.uber.org/atomic v1.11.0 h1:ZvwS0R+56ePWxUNi+Atn9dWONBPp/AUETXlHW0DxSjE= -go.uber.org/atomic v1.11.0/go.mod h1:LUxbIzbOniOlMKjJjyPfpl4v+PKK2cNJn91OQbhoJI0= go.uber.org/automaxprocs v1.5.2 h1:2LxUOGiR3O6tw8ui5sZa2LAaHnsviZdVOUZw4fvbnME= go.uber.org/automaxprocs v1.5.2/go.mod h1:eRbA25aqJrxAbsLO0xy5jVwPt7FQnRgjW+efnwa1WM0= -go.uber.org/dig v1.17.1 h1:Tga8Lz8PcYNsWsyHMZ1Vm0OQOUaJNDyvPImgbAu9YSc= -go.uber.org/dig v1.17.1/go.mod h1:Us0rSJiThwCv2GteUN0Q7OKvU7n5J4dxZ9JKUXozFdE= -go.uber.org/fx v1.20.1 h1:zVwVQGS8zYvhh9Xxcu4w1M6ESyeMzebzj2NbSayZ4Mk= -go.uber.org/fx v1.20.1/go.mod h1:iSYNbHf2y55acNCwCXKx7LbWb5WG1Bnue5RDXz1OREg= +go.uber.org/dig v1.18.0 h1:imUL1UiY0Mg4bqbFfsRQO5G4CGRBec/ZujWTvSVp3pw= +go.uber.org/dig v1.18.0/go.mod h1:Us0rSJiThwCv2GteUN0Q7OKvU7n5J4dxZ9JKUXozFdE= +go.uber.org/fx v1.22.2 h1:iPW+OPxv0G8w75OemJ1RAnTUrF55zOJlXlo1TbJ0Buw= +go.uber.org/fx v1.22.2/go.mod h1:o/D9n+2mLP6v1EG+qsdT1O8wKopYAsqZasju97SDFCU= go.uber.org/goleak v1.1.11-0.20210813005559-691160354723/go.mod h1:cwTWslyiVhfpKIDGSZEM2HlOvcqm+tG4zioyIeLoqMQ= -go.uber.org/goleak v1.2.0 h1:xqgm/S+aQvhWFTtR0XK3Jvg7z8kGV8P4X14IzwN3Eqk= -go.uber.org/goleak v1.2.0/go.mod h1:XJYK+MuIchqpmGmUSAzotztawfKvYLUIgg7guXrwVUo= -go.uber.org/mock v0.3.0 h1:3mUxI1No2/60yUYax92Pt8eNOEecx2D3lcXZh2NEZJo= -go.uber.org/mock v0.3.0/go.mod h1:a6FSlNadKUHUa9IP5Vyt1zh4fC7uAwxMutEAscFbkZc= -go.uber.org/multierr v1.1.0/go.mod h1:wR5kodmAFQ0UK8QlbwjlSNy0Z68gJhDJUG5sjR94q/0= -go.uber.org/multierr v1.3.0/go.mod h1:VgVr7evmIr6uPjLBxg28wmKNXyqE9akIJ5XnfpiKl+4= +go.uber.org/goleak v1.3.0 h1:2K3zAYmnTNqV73imy9J1T3WC+gmCePx2hEGkimedGto= +go.uber.org/goleak v1.3.0/go.mod h1:CoHD4mav9JJNrW/WLlf7HGZPjdw8EucARQHekz1X6bE= +go.uber.org/mock v0.4.0 h1:VcM4ZOtdbR4f6VXfiOpwpVJDL6lCReaZ6mw31wqh7KU= +go.uber.org/mock v0.4.0/go.mod h1:a6FSlNadKUHUa9IP5Vyt1zh4fC7uAwxMutEAscFbkZc= go.uber.org/multierr v1.5.0/go.mod h1:FeouvMocqHpRaaGuG9EjoKcStLC43Zu/fmqdUMPcKYU= go.uber.org/multierr v1.6.0/go.mod h1:cdWPpRnG4AhwMwsgIHip0KRBQjJy5kYEpYjJxpXp9iU= go.uber.org/multierr v1.11.0 h1:blXXJkSxSSfBVBlC76pxqeO+LN3aDfLQo+309xJstO0= go.uber.org/multierr v1.11.0/go.mod h1:20+QtiLqy0Nd6FdQB9TLXag12DsQkrbs3htMFfDN80Y= go.uber.org/tools v0.0.0-20190618225709-2cfd321de3ee/go.mod h1:vJERXedbb3MVM5f9Ejo0C68/HhF8uaILCdgjnY+goOA= -go.uber.org/zap v1.9.1/go.mod h1:vwi/ZaCAaUcBkycHslxD9B2zi4UTXhF60s6SWpuDF0Q= -go.uber.org/zap v1.10.0/go.mod h1:vwi/ZaCAaUcBkycHslxD9B2zi4UTXhF60s6SWpuDF0Q= -go.uber.org/zap v1.13.0/go.mod h1:zwrFLgMcdUuIBviXEYEH1YKNaOBnKXsx2IPda5bBwHM= go.uber.org/zap v1.19.1/go.mod h1:j3DNczoxDZroyBnOT1L/Q79cfUMGZxlv/9dzN7SM1rI= -go.uber.org/zap v1.26.0 h1:sI7k6L95XOKS281NhVKOFCUNIvv9e0w4BF8N3u+tCRo= -go.uber.org/zap v1.26.0/go.mod h1:dtElttAiwGvoJ/vj4IwHBS/gXsEu/pZ50mUIRWuG0so= +go.uber.org/zap v1.27.0 h1:aJMhYGrd5QSmlpLMr2MftRKl7t8J8PTZPA732ud/XR8= +go.uber.org/zap v1.27.0/go.mod h1:GB2qFLM7cTU87MWRP2mPIjqfIDnGu+VIO4V/SdhGo2E= go4.org v0.0.0-20180809161055-417644f6feb5/go.mod h1:MkTOUMDaeVYJUOUsaDXIhWPZYa1yOyC1qaOBpL57BhE= golang.org/x/build v0.0.0-20190111050920-041ab4dc3f9d/go.mod h1:OWs+y06UdEOHN4y+MfF/py+xQ/tYqIWW03b70/CG9Rw= golang.org/x/crypto v0.0.0-20170930174604-9419663f5a44/go.mod h1:6SG95UA2DQfeDnfUPMdvaQW0Q7yPrPDi9nlGo2tz2b4= @@ -854,27 +855,23 @@ golang.org/x/crypto v0.0.0-20180904163835-0709b304e793/go.mod h1:6SG95UA2DQfeDnf golang.org/x/crypto v0.0.0-20181030102418-4d3f4d9ffa16/go.mod h1:6SG95UA2DQfeDnfUPMdvaQW0Q7yPrPDi9nlGo2tz2b4= golang.org/x/crypto v0.0.0-20190308221718-c2843e01d9a2/go.mod h1:djNgcEr1/C05ACkg1iLfiJU5Ep61QUkGW8qpdssI0+w= golang.org/x/crypto v0.0.0-20190313024323-a1f597ede03a/go.mod h1:djNgcEr1/C05ACkg1iLfiJU5Ep61QUkGW8qpdssI0+w= -golang.org/x/crypto v0.0.0-20190411191339-88737f569e3a/go.mod h1:WFFai1msRO1wXaEeE5yQxYXgSfI8pQAWXbQop6sCtWE= golang.org/x/crypto v0.0.0-20190510104115-cbcb75029529/go.mod h1:yigFU9vqHzYiE8UmvKecakEJjdnWj3jj499lnFckfCI= golang.org/x/crypto v0.0.0-20190611184440-5c40567a22f8/go.mod h1:yigFU9vqHzYiE8UmvKecakEJjdnWj3jj499lnFckfCI= -golang.org/x/crypto v0.0.0-20190820162420-60c769a6c586/go.mod h1:yigFU9vqHzYiE8UmvKecakEJjdnWj3jj499lnFckfCI= golang.org/x/crypto v0.0.0-20191011191535-87dc89f01550/go.mod h1:yigFU9vqHzYiE8UmvKecakEJjdnWj3jj499lnFckfCI= golang.org/x/crypto v0.0.0-20200602180216-279210d13fed/go.mod h1:LzIPMQfyMNhhGPhUkYOs5KpL4U8rLKemX1yGLhDgUto= golang.org/x/crypto v0.0.0-20200622213623-75b288015ac9/go.mod h1:LzIPMQfyMNhhGPhUkYOs5KpL4U8rLKemX1yGLhDgUto= golang.org/x/crypto v0.0.0-20200820211705-5c72a883971a/go.mod h1:LzIPMQfyMNhhGPhUkYOs5KpL4U8rLKemX1yGLhDgUto= -golang.org/x/crypto v0.0.0-20201203163018-be400aefbc4c/go.mod h1:jdWPYTVW3xRLrWPugEBEK3UY2ZEsg3UU495nc5E+M+I= golang.org/x/crypto v0.0.0-20201221181555-eec23a3978ad/go.mod h1:jdWPYTVW3xRLrWPugEBEK3UY2ZEsg3UU495nc5E+M+I= golang.org/x/crypto v0.0.0-20210322153248-0c34fe9e7dc2/go.mod h1:T9bdIzuCu7OtxOm1hfPfRQxPLYneinmdGuTeoZ9dtd4= -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.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/crypto v0.8.0/go.mod h1:mRqEX+O9/h5TFCrQhkgjo2yKi0yYA+9ecGkdQoHrywE= +golang.org/x/crypto v0.12.0/go.mod h1:NF0Gs7EO5K4qLn+Ylc+fih8BSTeIjAP05siRnAh98yw= +golang.org/x/crypto v0.18.0/go.mod h1:R0j02AL6hcrfOiy9T4ZYp/rcWeMxM3L6QYxlOuEG1mg= +golang.org/x/crypto v0.27.0 h1:GXm2NjJrPaiv/h1tb2UH8QfgC/hOf/+z0p6PT8o1w7A= +golang.org/x/crypto v0.27.0/go.mod h1:1Xngt8kV6Dvbssa53Ziq6Eqn0HqbZi5Z6R0ZpwQzt70= golang.org/x/exp v0.0.0-20190121172915-509febef88a4/go.mod h1:CJ0aWSM057203Lf6IL+f9T1iT9GByDxfZKAQTCR3kQA= -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/exp v0.0.0-20240808152545-0cdaa3abc0fa h1:ELnwvuAXPNtPk1TJRuGkI9fDTwym6AYBu0qzT8AcHdI= +golang.org/x/exp v0.0.0-20240808152545-0cdaa3abc0fa/go.mod h1:akd2r19cwCdwSwWeIdzYQGa/EZZyqcOdwWiwj5L5eKQ= 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= @@ -887,8 +884,8 @@ 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/mod v0.20.0 h1:utOm6MM3R3dnawAiJgn0y+xvuYRsm1RKM/4giyfDgV0= +golang.org/x/mod v0.20.0/go.mod h1:hTbmBsO62+eylJbnUtE2MGJUyE7QWk4xUqPFrRgJ+7c= golang.org/x/net v0.0.0-20180719180050-a680a1efc54d/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4= golang.org/x/net v0.0.0-20180724234803-3673e40ba225/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4= golang.org/x/net v0.0.0-20180826012351-8a410e7b638d/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4= @@ -904,7 +901,6 @@ golang.org/x/net v0.0.0-20190313220215-9f648a60d977/go.mod h1:t9HGtf8HONx5eT2rtn golang.org/x/net v0.0.0-20190404232315-eb5bcb51f2a3/go.mod h1:t9HGtf8HONx5eT2rtn7q6eTqICYqUVnKs3thJo3Qplg= golang.org/x/net v0.0.0-20190613194153-d28f0bde5980/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s= golang.org/x/net v0.0.0-20190620200207-3b0461eec859/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s= -golang.org/x/net v0.0.0-20190813141303-74dc4d7220e7/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s= golang.org/x/net v0.0.0-20200226121028-0de0cce0169b/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s= golang.org/x/net v0.0.0-20200520004742-59133d7f0dd7/go.mod h1:qpuaurCH72eLCgpAm/N6yyVIVM9cpaDIP3A8BGJEC5A= golang.org/x/net v0.0.0-20200813134508-3edf25e44fcc/go.mod h1:/O7V0waA8r7cgGh81Ro3o1hOxt32SMVPicZroKQ2sZA= @@ -918,10 +914,12 @@ golang.org/x/net v0.0.0-20220225172249-27dd8689420f/go.mod h1:CfG3xpIq0wQ8r1q4Su 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.6.0/go.mod h1:2Tu9+aMcznHK/AK1HMvgo6xiTLG5rD5rZLDS+rp2Bjs= +golang.org/x/net v0.9.0/go.mod h1:d48xBJpPfHeWQsugry2m+kC02ZBRGRgulfHnEXEuWns= 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/net v0.14.0/go.mod h1:PpSgVXXLK0OxS0F31C1/tv6XNguvCrnXIDrFMspZIUI= +golang.org/x/net v0.20.0/go.mod h1:z8BVo6PvndSri0LbOE3hAn0apkU+1YvI6E70E9jsnvY= +golang.org/x/net v0.28.0 h1:a9JDOJc5GMUJ0+UDqmLT86WiEy7iWyIhz8gz8E4e5hE= +golang.org/x/net v0.28.0/go.mod h1:yqtgsTWOOnlGLG9GFRrK3++bGOUEkNBoHZc8MEDWPNg= 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= @@ -937,8 +935,8 @@ golang.org/x/sync v0.0.0-20201020160332-67f06af15bc9/go.mod h1:RxMgew5VJxzue5/jJ 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/sync v0.8.0 h1:3NFvSEYkUoMifnESzZl15y791HH1qU2xm6eCJU5ZPXQ= +golang.org/x/sync v0.8.0/go.mod h1:Czt+wKu1gCyEFDUtn0jG5QVvpJ6rzVqr5aXyt9drQfk= golang.org/x/sys v0.0.0-20180810173357-98c5dad5d1a0/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= golang.org/x/sys v0.0.0-20180830151530-49385e6e1522/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= golang.org/x/sys v0.0.0-20180905080454-ebe1bf3edb33/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= @@ -948,7 +946,6 @@ golang.org/x/sys v0.0.0-20181116152217-5ac8a444bdc5/go.mod h1:STP8DvDyc/dI5b8T5h golang.org/x/sys v0.0.0-20190215142949-d0b11bdaac8a/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= golang.org/x/sys v0.0.0-20190222072716-a9d3bda3a223/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= golang.org/x/sys v0.0.0-20190316082340-a2f829d7f35f/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20190403152447-81d4e9dc473e/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20190412213103-97732733099d/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20190422165155-953cdadca894/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20190813064441-fde4db37ae7a/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= @@ -961,6 +958,7 @@ golang.org/x/sys v0.0.0-20191204072324-ce4227a45e2e/go.mod h1:h1NjWce9XRLGQEsW7w golang.org/x/sys v0.0.0-20200116001909-b77594299b42/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20200122134326-e047566fdf82/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20200124204421-9fbb57f87de9/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20200202164722-d101bd2416d5/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20200223170610-d5e6a3e2c0ae/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20200323222414-85ca7c5b95cd/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20200519105757-fe76b779f299/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= @@ -968,6 +966,7 @@ golang.org/x/sys v0.0.0-20200602225109-6fdc65e7d980/go.mod h1:h1NjWce9XRLGQEsW7w golang.org/x/sys v0.0.0-20200814200057-3d37ad5750ed/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20200826173525-f9321e4c35a6/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20200930185726-fdedc70b468f/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20201101102859-da207088b7d1/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20201119102817-f84b799fce68/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20210112080510-489259a85091/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20210124154548-22da62e12c0c/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= @@ -979,50 +978,56 @@ golang.org/x/sys v0.0.0-20210615035016-665e8c7367d1/go.mod h1:oPkhp1MJrh7nUepCBc golang.org/x/sys v0.0.0-20210630005230-0f9fa26af87c/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/sys v0.0.0-20210927094055-39ccf1dd6fa6/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/sys v0.0.0-20211007075335-d3039528d8ac/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= +golang.org/x/sys v0.0.0-20211025201205-69cdffdb9359/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/sys v0.0.0-20211216021012-1d35b9e2eb4e/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/sys v0.0.0-20220310020820-b874c991c1a5/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/sys v0.0.0-20220412211240-33da011f77ad/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/sys v0.0.0-20220503163025-988cb79eb6c6/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-20220715151400-c0bba94af5f8/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.7.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/sys v0.8.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= +golang.org/x/sys v0.9.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/sys v0.11.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= -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/sys v0.14.0/go.mod h1:/VUhepiaJMQUp4+oa/7Zr1D23ma6VTLIYjOOTFZPUcA= +golang.org/x/sys v0.16.0/go.mod h1:/VUhepiaJMQUp4+oa/7Zr1D23ma6VTLIYjOOTFZPUcA= +golang.org/x/sys v0.25.0 h1:r+8e+loiHxRqhXVl6ML1nO3l1+oFoWbnlu2Ehimmi34= +golang.org/x/sys v0.25.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.5.0/go.mod h1:jMB1sMXY+tzblOD4FWmEbocvup2/aLOaQEp7JmGp78k= +golang.org/x/term v0.7.0/go.mod h1:P32HKFT3hSsZrRxla30E9HqToFYAQPCMs/zFMBUFqPY= 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/term v0.11.0/go.mod h1:zC9APTIj3jG3FdV/Ons+XE1riIZXG4aZ4GTHiPZJPIU= +golang.org/x/term v0.16.0/go.mod h1:yn7UURbUtPyrVJPGPq404EukNFxcm/foM+bV/bfcDsY= +golang.org/x/term v0.24.0 h1:Mh5cbb+Zk2hqqXNO7S1iTjEphVL+jb8ZWaqh/g+JWkM= +golang.org/x/term v0.24.0/go.mod h1:lOBK/LVxemqiMij05LGJ0tzNr8xlmwBRJ81PX6wVLH8= 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= golang.org/x/text v0.3.3/go.mod h1:5Zoc/QRtKVWzQhOtBMvqHzDpF6irO9z98xDceosuGiQ= -golang.org/x/text v0.3.4/go.mod h1:5Zoc/QRtKVWzQhOtBMvqHzDpF6irO9z98xDceosuGiQ= 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.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.12.0/go.mod h1:TvPlkZtksWOMsz7fbANvkp4WM8x/WCo/om8BMLbz+aE= 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/text v0.18.0 h1:XvMDiNzPAl0jr17s6W9lcaIhGUfUORdGCNsuLmPG224= +golang.org/x/text v0.18.0/go.mod h1:BuEKDfySbSR4drPmRPG/7iBdf8hvFMuRexcpahXilzY= 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= golang.org/x/time v0.0.0-20210220033141-f8bda1e9f3ba/go.mod h1:tRJNPiyCQ0inRvYxbN9jk5I+vvW/OXSQhTDSoE431IQ= -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/time v0.6.0 h1:eTDhh4ZXt5Qf0augr54TN6suAUudPcawVZeIAPU7D4U= +golang.org/x/time v0.6.0/go.mod h1:3BpzKBy/shNhVucY/MWOyx10tF3SFh9QdLuxbVysPQM= golang.org/x/tools v0.0.0-20180828015842-6cd1fcedba52/go.mod h1:n7NCudcB/nEzxVGmLbDWY5pfWTLqBcC2KZ6jyYvM4mQ= golang.org/x/tools v0.0.0-20180917221912-90fa682c2a6e/go.mod h1:n7NCudcB/nEzxVGmLbDWY5pfWTLqBcC2KZ6jyYvM4mQ= golang.org/x/tools v0.0.0-20181030000716-a0a13e073c7b/go.mod h1:n7NCudcB/nEzxVGmLbDWY5pfWTLqBcC2KZ6jyYvM4mQ= @@ -1030,14 +1035,11 @@ golang.org/x/tools v0.0.0-20181030221726-6c7e314b6563/go.mod h1:n7NCudcB/nEzxVGm golang.org/x/tools v0.0.0-20190114222345-bf090417da8b/go.mod h1:n7NCudcB/nEzxVGmLbDWY5pfWTLqBcC2KZ6jyYvM4mQ= golang.org/x/tools v0.0.0-20190226205152-f727befe758c/go.mod h1:9Yl7xja0Znq3iFh3HoIrodX9oNMXvdceNzlUR8zjMvY= golang.org/x/tools v0.0.0-20190311212946-11955173bddd/go.mod h1:LCzVGOaR6xXOjkQ3onu1FJEFr0SW1gC7cKk1uF8kGRs= -golang.org/x/tools v0.0.0-20190425163242-31fd60d6bfdc/go.mod h1:RgjU9mgBXZiqYHBnxXauZ1Gv1EHHAz9KjViQ78xBX0Q= golang.org/x/tools v0.0.0-20190621195816-6e04913cbbac/go.mod h1:/rFqwRUd4F7ZHNgwSSTFct+R/Kf4OFW1sUzUTQQTgfc= -golang.org/x/tools v0.0.0-20190823170909-c4a336ef6a2f/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo= golang.org/x/tools v0.0.0-20191029041327-9cc4af7d6b2c/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo= golang.org/x/tools v0.0.0-20191029190741-b9c20aec41a5/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo= golang.org/x/tools v0.0.0-20191119224855-298f0cb1881e/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo= golang.org/x/tools v0.0.0-20191125144606-a911d9008d1f/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo= -golang.org/x/tools v0.0.0-20200103221440-774c71fcf114/go.mod h1:TB2adYChydJhpapKDTa4BR/hXlZSLoq2Wpct/0txZ28= golang.org/x/tools v0.0.0-20200130002326-2f3ba24bd6e7/go.mod h1:TB2adYChydJhpapKDTa4BR/hXlZSLoq2Wpct/0txZ28= golang.org/x/tools v0.0.0-20200619180055-7c47624df98f/go.mod h1:EkVYQZoAsY45+roYkvgYkIh4xh/qjgUK9TdY2XT94GE= golang.org/x/tools v0.0.0-20201224043029-2b0845dc783e/go.mod h1:emZCQorbCU4vsT4fOWvOPXz4eW1wZW4PmDk9uLelYpA= @@ -1045,10 +1047,8 @@ golang.org/x/tools v0.0.0-20210106214847-113979e3529a/go.mod h1:emZCQorbCU4vsT4f 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.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/tools v0.24.0 h1:J1shsA93PJUEVaUSaay7UXAyE8aimq3GW0pjlolpa24= +golang.org/x/tools v0.24.0/go.mod h1:YhNqVBIfWHdzvTLs0d8LCuMhkKUgSUKldakyV7W/WDQ= 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= @@ -1066,10 +1066,18 @@ google.golang.org/genproto v0.0.0-20180831171423-11092d34479b/go.mod h1:JiN7NxoA google.golang.org/genproto v0.0.0-20181029155118-b69ba1387ce2/go.mod h1:JiN7NxoALGmiZfu7CAH4rXhgtRTLTxftemlI0sWmxmc= google.golang.org/genproto v0.0.0-20181202183823-bd91e49a0898/go.mod h1:7Ep/1NZk928CDR8SjdVbjWNpdIf6nzjE3BTgJDr2Atg= google.golang.org/genproto v0.0.0-20190306203927-b5d61aea6440/go.mod h1:VzzqZJRnGkLBvHegQrXjBqPurQTc5/KpmUdxsrq26oE= +google.golang.org/genproto v0.0.0-20230726155614-23370e0ffb3e h1:xIXmWJ303kJCuogpj0bHq+dcjcZHU+XFyc1I0Yl9cRg= +google.golang.org/genproto v0.0.0-20230726155614-23370e0ffb3e/go.mod h1:0ggbjUrZYpy1q+ANUS30SEoGZ53cdfwtbuG7Ptgy108= +google.golang.org/genproto/googleapis/api v0.0.0-20230711160842-782d3b101e98 h1:FmF5cCW94Ij59cfpoLiwTgodWmm60eEV0CjlsVg2fuw= +google.golang.org/genproto/googleapis/api v0.0.0-20230711160842-782d3b101e98/go.mod h1:rsr7RhLuwsDKL7RmgDDCUc6yaGr1iqceVb5Wv6f6YvQ= +google.golang.org/genproto/googleapis/rpc v0.0.0-20230803162519-f966b187b2e5 h1:eSaPbMR4T7WfH9FvABk36NBMacoTUKdWCvV0dx+KfOg= +google.golang.org/genproto/googleapis/rpc v0.0.0-20230803162519-f966b187b2e5/go.mod h1:zBEcrKX2ZOcEkHWxBPAIvYUWOKKMIhYcmNiUIu2ji3I= google.golang.org/grpc v1.14.0/go.mod h1:yo6s7OP7yaDglbqo1J04qKzAhqBH6lvTonzMVmEdcZw= google.golang.org/grpc v1.16.0/go.mod h1:0JHn/cJsOMiMfNA9+DeHDlAU7KAAB5GDlYFpa9MZMio= google.golang.org/grpc v1.17.0/go.mod h1:6QZJwpn2B+Zp71q/5VxRsJ6NXXVCE5NRUHRo+f3cWCs= google.golang.org/grpc v1.19.0/go.mod h1:mqu4LbDTu4XGKhr4mRzUsmM4RtVoemTSY81AxZiDr8c= +google.golang.org/grpc v1.57.1 h1:upNTNqv0ES+2ZOOqACwVtS3Il8M12/+Hz41RCPzAjQg= +google.golang.org/grpc v1.57.1/go.mod h1:Sd+9RMTACXwmub0zcNY2c4arhtrbBYD1AUHI/dt16Mo= google.golang.org/protobuf v0.0.0-20200109180630-ec00e32a8dfd/go.mod h1:DFci5gLYBciE7Vtevhsrf46CRTquxDuWsQurQQe4oz8= google.golang.org/protobuf v0.0.0-20200221191635-4d8936d0db64/go.mod h1:kwYJMbMJ01Woi6D6+Kah6886xMZcty6N08ah7+eCXa0= google.golang.org/protobuf v0.0.0-20200228230310-ab0ca4ff8a60/go.mod h1:cfTl7dwQJ+fmap5saPgwCLgHXTUD7jkjRqWcaiX5VyM= @@ -1078,8 +1086,8 @@ google.golang.org/protobuf v1.21.0/go.mod h1:47Nbq4nVaFHyn7ilMalzfO3qCViNmqZ2kzi google.golang.org/protobuf v1.23.0/go.mod h1:EGpADcykh3NcUnDUJcl1+ZksZNG86OlYog2l/sGQquU= 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.34.2 h1:6xV6lTsCfpGD21XK49h7MhtcApnLqkfYgPcdHftf6hg= +google.golang.org/protobuf v1.34.2/go.mod h1:qYOHts0dSfpeUzUFpOMr/WGzszTmLH+DiWniOlNbLDw= gopkg.in/alecthomas/kingpin.v2 v2.2.6/go.mod h1:FMv+mEhP44yOT+4EoQTLFTRgOQ1FBLkstjWtayDeSgw= gopkg.in/check.v1 v0.0.0-20161208181325-20d25e280405/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0= gopkg.in/check.v1 v1.0.0-20180628173108-788fd7840127/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0= @@ -1088,12 +1096,9 @@ gopkg.in/check.v1 v1.0.0-20201130134442-10cb98267c6c h1:Hei/4ADfdWqJk1ZMxUNpqntN gopkg.in/check.v1 v1.0.0-20201130134442-10cb98267c6c/go.mod h1:JHkPIbrfpd72SG/EVd6muEfDQjcINNoR0C8j2r3qZ4Q= 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/natefinch/lumberjack.v2 v2.2.1 h1:bBRl1b0OH9s/DuPhuXpNl+VtCaJXFZ5/uEFST95x9zc= +gopkg.in/natefinch/lumberjack.v2 v2.2.1/go.mod h1:YD8tP3GAjkrDg1eZH7EGmyESg/lsYskCTPBJVb9jqSc= gopkg.in/tomb.v1 v1.0.0-20141024135613-dd632973f1e7 h1:uRGJdciOHaEIrze2W8Q3AKkepLTh2hOroT7a+7czfdQ= gopkg.in/tomb.v1 v1.0.0-20141024135613-dd632973f1e7/go.mod h1:dt/ZhP58zS4L8KSrWDmTeBkI65Dw0HsyUHuEVlX15mw= gopkg.in/yaml.v2 v2.2.1/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI= @@ -1108,17 +1113,13 @@ gopkg.in/yaml.v3 v3.0.0-20200313102051-9f266ea9e77c/go.mod h1:K4uyk7z7BCEPqu6E+C gopkg.in/yaml.v3 v3.0.0-20210107192922-496545a6307b/go.mod h1:K4uyk7z7BCEPqu6E+C64Yfv1cQ7kz7rIZviUmN+EgEM= 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.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= honnef.co/go/tools v0.0.0-20190106161140-3f1c8253044a/go.mod h1:rf3lG4BRIbNafJWhAfAdb/ePZxsR/4RtNHQocxwk9r4= honnef.co/go/tools v0.0.1-2019.2.3/go.mod h1:a3bituU0lyd329TUQxRnasdCoJDkEUEAqEt0JzvZhAg= -lukechampine.com/blake3 v1.2.1 h1:YuqqRuaqsGV71BV/nm9xlI0MKUv4QC54jQnBChWbGnI= -lukechampine.com/blake3 v1.2.1/go.mod h1:0OFRp7fBtAylGVCO40o87sbupkyIGgbpv1+M1k1LM6k= +lukechampine.com/blake3 v1.3.0 h1:sJ3XhFINmHSrYCgl958hscfIa3bw8x4DqMP3u1YvoYE= +lukechampine.com/blake3 v1.3.0/go.mod h1:0OFRp7fBtAylGVCO40o87sbupkyIGgbpv1+M1k1LM6k= rsc.io/tmplfunc v0.0.3 h1:53XFQh69AfOa8Tw0Jm7t+GV7KZhOi6jzsCzTtKbMvzU= rsc.io/tmplfunc v0.0.3/go.mod h1:AG3sTPzElb1Io3Yg4voV9AGZJuleGAwaVRxL9M49PhA= sourcegraph.com/sourcegraph/go-diff v0.5.0/go.mod h1:kuch7UrkMzY0X+p9CRK03kfuPQ2zzQcaEFbx8wA8rck= diff --git a/indexer/.gitignore b/indexer/.gitignore deleted file mode 100644 index 061d13cc5fa2..000000000000 --- a/indexer/.gitignore +++ /dev/null @@ -1,6 +0,0 @@ -docker-compose.dev.yml -.env -/indexer - -api-ts/yarn.lock -api-ts/package-lock.json \ No newline at end of file diff --git a/indexer/Dockerfile b/indexer/Dockerfile deleted file mode 100644 index 4c50c95944b5..000000000000 --- a/indexer/Dockerfile +++ /dev/null @@ -1,29 +0,0 @@ -FROM --platform=$BUILDPLATFORM golang:1.21.1-alpine3.18 as builder - -RUN apk add --no-cache make ca-certificates gcc musl-dev linux-headers git jq bash - -COPY ./go.mod /app/go.mod -COPY ./go.sum /app/go.sum - -WORKDIR /app - -RUN go mod download - -# build indexer with the shared go.mod & go.sum files -COPY ./indexer /app/indexer -COPY ./op-service /app/op-service -COPY ./op-node /app/op-node -COPY ./op-plasma /app/op-plasma -COPY ./op-chain-ops /app/op-chain-ops -COPY ./go.mod /app/go.mod -COPY ./go.sum /app/go.sum - -WORKDIR /app/indexer -RUN make indexer - -FROM alpine:3.18 -COPY --from=builder /app/indexer/indexer /usr/local/bin -COPY --from=builder /app/indexer/migrations /app/indexer/migrations - -WORKDIR /app/indexer -CMD ["indexer"] diff --git a/indexer/Makefile b/indexer/Makefile deleted file mode 100644 index 2384d74c921d..000000000000 --- a/indexer/Makefile +++ /dev/null @@ -1,29 +0,0 @@ -GITCOMMIT := $(shell git rev-parse HEAD) -GITDATE := $(shell git show -s --format='%ct') - -LDFLAGSSTRING +=-X main.GitCommit=$(GITCOMMIT) -LDFLAGSSTRING +=-X main.GitDate=$(GITDATE) -LDFLAGS := -ldflags "$(LDFLAGSSTRING)" - -indexer: - env GO111MODULE=on go build -v $(LDFLAGS) ./cmd/indexer - -up: - docker-compose up --build - -clean: - rm indexer - -test: - go test -v ./... - -lint: - golangci-lint run ./... - -.PHONY: \ - indexer \ - bindings \ - bindings-scc \ - clean \ - test \ - lint diff --git a/indexer/README.md b/indexer/README.md deleted file mode 100644 index 34a568d6f855..000000000000 --- a/indexer/README.md +++ /dev/null @@ -1,78 +0,0 @@ -# @eth-optimism/indexer - -## Getting started - -### Configuration -The `indexer.toml` contains configuration for the indexer. The file is templated for the local devnet, however presets are available for [known networks](https://github.com/ethereum-optimism/optimism/blob/develop/indexer/config/presets.go). The file also templates keys needed for custom networks such as the rollup contract addresses and the `l1-starting-height` for the deployment height. - -Required configuration is network specific `(l1|l2)-rpc` urls that point to archival nodes as well as the `(l1|l2)-polling-interval` & `(l1|l2)-header-buffer-size` keys which controls the of rate data retrieval from these notes. - -### Testing -All tests can be ran by running `make test` from the `/indexer` directory. This will run all unit and e2e tests. - -> **NOTE:** Successfully running the E2E tests requires spinning up a local devnet via [op-e2e](https://github.com/ethereum-optimism/optimism/tree/develop/op-e2e) and pre-populating it with necessary bedrock genesis state. This genesis state is generated by invoking the`make devnet-allocs` target from the root of the optimism monorepo before running the indexer tests. More information on this can be found in the [op-e2e README](../op-e2e/README.md). A postgres database through pwd-less user $DB_USER env variable on port 5432 must be available as well. - -### Run the Indexer (docker-compose) -The local [docker-compose.go](https://github.com/ethereum-optimism/optimism/blob/develop/indexer/docker-compose.yml) file spins up **index, api, postgres, prometheus and grafana** services. The `indexer.toml` file is setup for the local devnet. To run against a live network, update the `indexer.toml` with the desired configuration. - -> The API, Postgres, and Grafana services are the only ones with ports mapped externally. Postgres database is mapped to port 5433 to deconflict any instances already running on the default port - -1. Install Deps: Docker, Genesis State: `make devnet-allocs` -2. Start Devnet `make devnet up`, Otherwise update `indexer.toml` to desired network config. -3. Start Indexer: `cd indexer && docker-compose up` -4. View the Grafana dashboard at http://localhost:3000 - - **User**: admin - - **Password**: optimism - -### Run the Indexer (Go Binary or Dockerfile) -1. Prepare the `indexer.toml` file -2. **Run database migrations**: `indexer migrate --config ` -3. Run index service, cmd: `indexer index --config ` -4. Run the api service, cmd: `indexer api --config ` - -> Both the index and api services listen on an HTTP and Metrics port. Migrations should **always** be run prior to start the indexer to ensure latest schemas are set. - -## Architecture -![Architectural Diagram](./ops/assets/architecture.png) - -The indexer application supports two separate services for collective operation: -**Indexer API** - Provides a lightweight API service that supports paginated lookups for bridge data. -**Indexer Service** - A polling based service that constantly reads and persists OP Stack chain data (i.e, block meta, system contract events, synchronized bridge events) from a L1 and L2 chain. - -### Indexer API -See `api/api.go` & `api/routes/` for available API endpoints to for paginated retrieval of bridge data. **TDB** docs. - -### Indexer Service -![Service Component Diagram](./ops/assets/indexer-service.png) - -The indexer service is responsible for polling and processing real-time batches of L1 and L2 chain data. The indexer service is currently composed of the following key components: -- **Poller Routines** - Individually polls the L1/L2 chain for new blocks and OP Stack contract events. -- **Insertion Routines** - Awaits new batches from the poller routines and inserts them into the database upon retrieval. -- **Bridge Routine** - Polls the database directly for new L1 blocks and bridge events. Upon retrieval, the bridge routine will: - * Process and persist new bridge events - * Synchronize L1 proven/finalized withdrawals with their L2 initialization counterparts - -#### 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** - -#### HTTP -The indexer service runs a lightweight health server adjacently to the main service. The health server exposes a single endpoint `/healthz` that can be used to check the health of the indexer service. The health assessment doesn't check dependency health (ie. database) but rather checks the health of the indexer service itself. - -#### Metrics -The indexer services exposes a set of Prometheus metrics that can be used to monitor the health of the service. The metrics are exposed via the `/metrics` endpoint on the health server. - - -## Security -All security related issues should be filed via github issues and will be triaged by the team. The following are some security considerations to be taken when running the service: -- Since the Indexer API only performs read operations on the database, access to the database for any API instances should be restricted to read-only operations. -- The API has no rate limiting or authentication/authorization mechanisms. It is recommended to place the API behind a reverse proxy that can provide these features. -- Postgres connection timeouts are unenforced in the services. It is recommended to configure the database to enforce connection timeouts to prevent connection exhaustion attacks. -- Setting confirmation count values too low can result in indexing failures due to chain reorgs. - -## Troubleshooting -Please advise the [troubleshooting](./ops/docs/troubleshooting.md) guide for common failure scenarios and how to resolve them. diff --git a/indexer/api-ts/CHANGELOG.md b/indexer/api-ts/CHANGELOG.md deleted file mode 100644 index 5a611ffa12b8..000000000000 --- a/indexer/api-ts/CHANGELOG.md +++ /dev/null @@ -1,13 +0,0 @@ -# @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 - -- [#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/indexer/api-ts/LICENSE b/indexer/api-ts/LICENSE deleted file mode 100644 index 86541fdc788e..000000000000 --- a/indexer/api-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/indexer/api-ts/README.md b/indexer/api-ts/README.md deleted file mode 100644 index 8cb1d194639e..000000000000 --- a/indexer/api-ts/README.md +++ /dev/null @@ -1 +0,0 @@ -Generated typescript types for https://github.com/ethereum-optimism/optimism/tree/develop/indexer diff --git a/indexer/api-ts/generated.ts b/indexer/api-ts/generated.ts deleted file mode 100644 index 713aca927fce..000000000000 --- a/indexer/api-ts/generated.ts +++ /dev/null @@ -1,64 +0,0 @@ -// Code generated by tygo. DO NOT EDIT. - -////////// -// source: models.go - -export interface QueryParams { - Address: any /* common.Address */; - Limit: number /* int */; - Cursor: string; -} -/** - * DepositItem ... Deposit item model for API responses - */ -export interface DepositItem { - guid: string; - from: string; - to: string; - timestamp: number /* uint64 */; - l1BlockHash: string; - l1TxHash: string; - l2TxHash: string; - amount: string; - l1TokenAddress: string; - l2TokenAddress: string; -} -/** - * DepositResponse ... Data model for API JSON response - */ -export interface DepositResponse { - cursor: string; - hasNextPage: boolean; - items: DepositItem[]; -} -/** - * WithdrawalItem ... Data model for API JSON response - */ -export interface WithdrawalItem { - guid: string; - from: string; - to: string; - transactionHash: string; - crossDomainMessageHash: string; - timestamp: number /* uint64 */; - l2BlockHash: string; - amount: string; - l1ProvenTxHash: string; - l1FinalizedTxHash: string; - l1TokenAddress: string; - l2TokenAddress: string; -} -/** - * WithdrawalResponse ... Data model for API JSON response - */ -export interface WithdrawalResponse { - cursor: string; - hasNextPage: boolean; - items: WithdrawalItem[]; -} -export interface BridgeSupplyView { - l1DepositSum: number /* float64 */; - l2WithdrawalSum: number /* float64 */; - provenSum: number /* float64 */; - finalizedSum: number /* float64 */; -} diff --git a/indexer/api-ts/indexer.cjs b/indexer/api-ts/indexer.cjs deleted file mode 100644 index 6eee96c7d176..000000000000 --- a/indexer/api-ts/indexer.cjs +++ /dev/null @@ -1,51 +0,0 @@ -"use strict"; -var __defProp = Object.defineProperty; -var __getOwnPropDesc = Object.getOwnPropertyDescriptor; -var __getOwnPropNames = Object.getOwnPropertyNames; -var __hasOwnProp = Object.prototype.hasOwnProperty; -var __export = (target, all) => { - for (var name in all) - __defProp(target, name, { get: all[name], enumerable: true }); -}; -var __copyProps = (to, from, except, desc) => { - if (from && typeof from === "object" || typeof from === "function") { - for (let key of __getOwnPropNames(from)) - if (!__hasOwnProp.call(to, key) && key !== except) - __defProp(to, key, { get: () => from[key], enumerable: !(desc = __getOwnPropDesc(from, key)) || desc.enumerable }); - } - return to; -}; -var __toCommonJS = (mod) => __copyProps(__defProp({}, "__esModule", { value: true }), mod); - -// indexer.ts -var indexer_exports = {}; -__export(indexer_exports, { - depositEndpoint: () => depositEndpoint, - withdrawalEndoint: () => withdrawalEndoint -}); -module.exports = __toCommonJS(indexer_exports); -var createQueryString = ({ cursor, limit }) => { - if (cursor === void 0 && limit === void 0) { - return ""; - } - const queries = []; - if (cursor) { - queries.push(`cursor=${cursor}`); - } - if (limit) { - queries.push(`limit=${limit}`); - } - return `?${queries.join("&")}`; -}; -var depositEndpoint = ({ baseUrl = "", address, cursor, limit }) => { - return [baseUrl, "deposits", `${address}${createQueryString({ cursor, limit })}`].join("/"); -}; -var withdrawalEndoint = ({ baseUrl = "", address, cursor, limit }) => { - return [baseUrl, "withdrawals", `${address}${createQueryString({ cursor, limit })}`].join("/"); -}; -// Annotate the CommonJS export names for ESM import in node: -0 && (module.exports = { - depositEndpoint, - withdrawalEndoint -}); -//# sourceMappingURL=indexer.cjs.map \ No newline at end of file diff --git a/indexer/api-ts/indexer.cjs.map b/indexer/api-ts/indexer.cjs.map deleted file mode 100644 index 694ca7dfa107..000000000000 --- a/indexer/api-ts/indexer.cjs.map +++ /dev/null @@ -1 +0,0 @@ -{"version":3,"sources":["indexer.ts"],"sourcesContent":["export * from './generated'\n\ntype PaginationOptions = {\n limit?: number\n cursor?: string\n}\n\ntype Options = {\n baseUrl?: string\n address: `0x${string}`\n} & PaginationOptions\n\nconst createQueryString = ({ cursor, limit }: PaginationOptions): string => {\n if (cursor === undefined && limit === undefined) {\n return ''\n }\n const queries: string[] = []\n if (cursor) {\n queries.push(`cursor=${cursor}`)\n }\n if (limit) {\n queries.push(`limit=${limit}`)\n }\n return `?${queries.join('&')}`\n}\n\nexport const depositEndpoint = ({ baseUrl = '', address, cursor, limit }: Options): string => {\n return [baseUrl, 'deposits', `${address}${createQueryString({ cursor, limit })}`].join('/')\n}\n\nexport const withdrawalEndoint = ({ baseUrl = '', address, cursor, limit }: Options): string => {\n return [baseUrl, 'withdrawals', `${address}${createQueryString({ cursor, limit })}`].join('/')\n}\n\n"],"mappings":";;;;;;;;;;;;;;;;;;;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAYA,IAAM,oBAAoB,CAAC,EAAE,QAAQ,MAAM,MAAiC;AAC1E,MAAI,WAAW,UAAa,UAAU,QAAW;AAC/C,WAAO;AAAA,EACT;AACA,QAAM,UAAoB,CAAC;AAC3B,MAAI,QAAQ;AACV,YAAQ,KAAK,UAAU,MAAM,EAAE;AAAA,EACjC;AACA,MAAI,OAAO;AACT,YAAQ,KAAK,SAAS,KAAK,EAAE;AAAA,EAC/B;AACA,SAAO,IAAI,QAAQ,KAAK,GAAG,CAAC;AAC9B;AAEO,IAAM,kBAAkB,CAAC,EAAE,UAAU,IAAI,SAAS,QAAQ,MAAM,MAAuB;AAC5F,SAAO,CAAC,SAAS,YAAY,GAAG,OAAO,GAAG,kBAAkB,EAAE,QAAQ,MAAM,CAAC,CAAC,EAAE,EAAE,KAAK,GAAG;AAC5F;AAEO,IAAM,oBAAoB,CAAC,EAAE,UAAU,IAAI,SAAS,QAAQ,MAAM,MAAuB;AAC9F,SAAO,CAAC,SAAS,eAAe,GAAG,OAAO,GAAG,kBAAkB,EAAE,QAAQ,MAAM,CAAC,CAAC,EAAE,EAAE,KAAK,GAAG;AAC/F;","names":[]} \ No newline at end of file diff --git a/indexer/api-ts/indexer.js b/indexer/api-ts/indexer.js deleted file mode 100644 index f76434c63b35..000000000000 --- a/indexer/api-ts/indexer.js +++ /dev/null @@ -1,25 +0,0 @@ -// indexer.ts -var createQueryString = ({ cursor, limit }) => { - if (cursor === void 0 && limit === void 0) { - return ""; - } - const queries = []; - if (cursor) { - queries.push(`cursor=${cursor}`); - } - if (limit) { - queries.push(`limit=${limit}`); - } - return `?${queries.join("&")}`; -}; -var depositEndpoint = ({ baseUrl = "", address, cursor, limit }) => { - return [baseUrl, "deposits", `${address}${createQueryString({ cursor, limit })}`].join("/"); -}; -var withdrawalEndoint = ({ baseUrl = "", address, cursor, limit }) => { - return [baseUrl, "withdrawals", `${address}${createQueryString({ cursor, limit })}`].join("/"); -}; -export { - depositEndpoint, - withdrawalEndoint -}; -//# sourceMappingURL=indexer.js.map \ No newline at end of file diff --git a/indexer/api-ts/indexer.js.map b/indexer/api-ts/indexer.js.map deleted file mode 100644 index 8f9742b0c852..000000000000 --- a/indexer/api-ts/indexer.js.map +++ /dev/null @@ -1 +0,0 @@ -{"version":3,"sources":["indexer.ts"],"sourcesContent":["export * from './generated'\n\ntype PaginationOptions = {\n limit?: number\n cursor?: string\n}\n\ntype Options = {\n baseUrl?: string\n address: `0x${string}`\n} & PaginationOptions\n\nconst createQueryString = ({ cursor, limit }: PaginationOptions): string => {\n if (cursor === undefined && limit === undefined) {\n return ''\n }\n const queries: string[] = []\n if (cursor) {\n queries.push(`cursor=${cursor}`)\n }\n if (limit) {\n queries.push(`limit=${limit}`)\n }\n return `?${queries.join('&')}`\n}\n\nexport const depositEndpoint = ({ baseUrl = '', address, cursor, limit }: Options): string => {\n return [baseUrl, 'deposits', `${address}${createQueryString({ cursor, limit })}`].join('/')\n}\n\nexport const withdrawalEndoint = ({ baseUrl = '', address, cursor, limit }: Options): string => {\n return [baseUrl, 'withdrawals', `${address}${createQueryString({ cursor, limit })}`].join('/')\n}\n\n"],"mappings":";AAYA,IAAM,oBAAoB,CAAC,EAAE,QAAQ,MAAM,MAAiC;AAC1E,MAAI,WAAW,UAAa,UAAU,QAAW;AAC/C,WAAO;AAAA,EACT;AACA,QAAM,UAAoB,CAAC;AAC3B,MAAI,QAAQ;AACV,YAAQ,KAAK,UAAU,MAAM,EAAE;AAAA,EACjC;AACA,MAAI,OAAO;AACT,YAAQ,KAAK,SAAS,KAAK,EAAE;AAAA,EAC/B;AACA,SAAO,IAAI,QAAQ,KAAK,GAAG,CAAC;AAC9B;AAEO,IAAM,kBAAkB,CAAC,EAAE,UAAU,IAAI,SAAS,QAAQ,MAAM,MAAuB;AAC5F,SAAO,CAAC,SAAS,YAAY,GAAG,OAAO,GAAG,kBAAkB,EAAE,QAAQ,MAAM,CAAC,CAAC,EAAE,EAAE,KAAK,GAAG;AAC5F;AAEO,IAAM,oBAAoB,CAAC,EAAE,UAAU,IAAI,SAAS,QAAQ,MAAM,MAAuB;AAC9F,SAAO,CAAC,SAAS,eAAe,GAAG,OAAO,GAAG,kBAAkB,EAAE,QAAQ,MAAM,CAAC,CAAC,EAAE,EAAE,KAAK,GAAG;AAC/F;","names":[]} \ No newline at end of file diff --git a/indexer/api-ts/indexer.spec.ts b/indexer/api-ts/indexer.spec.ts deleted file mode 100644 index 38a83cd3fd30..000000000000 --- a/indexer/api-ts/indexer.spec.ts +++ /dev/null @@ -1,12 +0,0 @@ -import { test, expect } from 'vitest' -import { depositEndpoint, withdrawalEndoint } from './indexer.ts' - -test(depositEndpoint.name, () => { - expect(depositEndpoint({ baseUrl: 'http://localhost:8080/api/v0', address: '0x1234', cursor: '0x1235', limit: 10 })).toMatchInlineSnapshot('"http://localhost:8080/api/v0/deposits/0x1234?cursor=0x1235&limit=10"') - expect(depositEndpoint({ baseUrl: 'http://localhost:8080/api/v0', address: '0x1234' })).toMatchInlineSnapshot('"http://localhost:8080/api/v0/deposits/0x1234"') -}) - -test(withdrawalEndoint.name, () => { - expect(withdrawalEndoint({ baseUrl: 'http://localhost:8080/api/v0', address: '0x1234', cursor: '0x1235', limit: 10 })).toMatchInlineSnapshot('"http://localhost:8080/api/v0/withdrawals/0x1234?cursor=0x1235&limit=10"') - expect(withdrawalEndoint({ baseUrl: 'http://localhost:8080/api/v0', address: '0x1234' })).toMatchInlineSnapshot('"http://localhost:8080/api/v0/withdrawals/0x1234"') -}) diff --git a/indexer/api-ts/indexer.ts b/indexer/api-ts/indexer.ts deleted file mode 100644 index e73ce765039d..000000000000 --- a/indexer/api-ts/indexer.ts +++ /dev/null @@ -1,34 +0,0 @@ -export * from './generated' - -type PaginationOptions = { - limit?: number - cursor?: string -} - -type Options = { - baseUrl?: string - address: `0x${string}` -} & PaginationOptions - -const createQueryString = ({ cursor, limit }: PaginationOptions): string => { - if (cursor === undefined && limit === undefined) { - return '' - } - const queries: string[] = [] - if (cursor) { - queries.push(`cursor=${cursor}`) - } - if (limit) { - queries.push(`limit=${limit}`) - } - return `?${queries.join('&')}` -} - -export const depositEndpoint = ({ baseUrl = '', address, cursor, limit }: Options): string => { - return [baseUrl, 'deposits', `${address}${createQueryString({ cursor, limit })}`].join('/') -} - -export const withdrawalEndoint = ({ baseUrl = '', address, cursor, limit }: Options): string => { - return [baseUrl, 'withdrawals', `${address}${createQueryString({ cursor, limit })}`].join('/') -} - diff --git a/indexer/api-ts/package.json b/indexer/api-ts/package.json deleted file mode 100644 index cb27cee2b59e..000000000000 --- a/indexer/api-ts/package.json +++ /dev/null @@ -1,39 +0,0 @@ -{ - "name": "@eth-optimism/indexer-api", - "version": "0.0.5", - "description": "[Optimism] typescript types for the indexer service", - "main": "indexer.cjs", - "module": "indexer.js", - "types": "indexer.ts", - "type": "module", - "files": [ - "*.ts", - "*.ts", - "*.js", - "*.js.map", - "*.cjs", - "*.cjs.map", - "LICENSE" - ], - "scripts": { - "generate:clean": "rm -rf generated.ts indexer.cjs indexer.js", - "generate": "npm run generate:clean && tygo generate && mv ../api/models/index.ts generated.ts && tsup", - "test": "vitest" - }, - "keywords": [ - "optimism", - "ethereum", - "indexer" - ], - "homepage": "https://github.com/ethereum-optimism/optimism/tree/develop/indexer#readme", - "license": "MIT", - "author": "Optimism PBC", - "repository": { - "type": "git", - "url": "https://github.com/ethereum-optimism/optimism.git" - }, - "devDependencies": { - "tsup": "^8.0.1", - "vitest": "^1.2.2" - } -} diff --git a/indexer/api-ts/tsconfig.json b/indexer/api-ts/tsconfig.json deleted file mode 100644 index 6a6c29f680c4..000000000000 --- a/indexer/api-ts/tsconfig.json +++ /dev/null @@ -1,13 +0,0 @@ -{ - "compilerOptions": { - "outDir": "dist", - "strict": true, - "skipLibCheck": true, - "module": "ESNext", - "moduleResolution": "NodeNext", - "jsx": "react", - "target": "ESNext", - "noEmit": true - }, - "include": ["."] -} diff --git a/indexer/api-ts/tsup.config.ts b/indexer/api-ts/tsup.config.ts deleted file mode 100644 index 793f4d65750d..000000000000 --- a/indexer/api-ts/tsup.config.ts +++ /dev/null @@ -1,11 +0,0 @@ -import packageJson from './package.json' - -export default { - name: packageJson.name, - entry: ['indexer.ts'], - outDir: '.', - format: ['esm', 'cjs'], - splitting: false, - sourcemap: true, - clean: false, -} diff --git a/indexer/api-ts/tygo.yaml b/indexer/api-ts/tygo.yaml deleted file mode 100644 index 562ae786d30d..000000000000 --- a/indexer/api-ts/tygo.yaml +++ /dev/null @@ -1,2 +0,0 @@ -packages: - - path: "github.com/ethereum-optimism/optimism/indexer/api/models" diff --git a/indexer/api/api.go b/indexer/api/api.go deleted file mode 100644 index ff2601283d38..000000000000 --- a/indexer/api/api.go +++ /dev/null @@ -1,185 +0,0 @@ -package api - -import ( - "context" - "errors" - "fmt" - "net" - "net/http" - "strconv" - "sync/atomic" - "time" - - "github.com/go-chi/chi/v5" - "github.com/go-chi/chi/v5/middleware" - - "github.com/prometheus/client_golang/prometheus" - - "github.com/ethereum/go-ethereum/log" - - "github.com/ethereum-optimism/optimism/indexer/api/routes" - "github.com/ethereum-optimism/optimism/indexer/api/service" - "github.com/ethereum-optimism/optimism/indexer/config" - "github.com/ethereum-optimism/optimism/indexer/database" - "github.com/ethereum-optimism/optimism/op-service/httputil" - "github.com/ethereum-optimism/optimism/op-service/metrics" -) - -const ethereumAddressRegex = `^0x[a-fA-F0-9]{40}$` - -const ( - MetricsNamespace = "op_indexer_api" - addressParam = "{address:%s}" - - // Endpoint paths - DocsPath = "/docs" - HealthPath = "/healthz" - DepositsPath = "/api/v0/deposits/" - WithdrawalsPath = "/api/v0/withdrawals/" - - SupplyPath = "/api/v0/supply" -) - -// Api ... Indexer API struct -// TODO : Structured error responses -type APIService struct { - log log.Logger - router *chi.Mux - - bv database.BridgeTransfersView - dbClose func() error - - metricsRegistry *prometheus.Registry - - apiServer *httputil.HTTPServer - metricsServer *httputil.HTTPServer - - stopped atomic.Bool -} - -// chiMetricsMiddleware ... Injects a metrics recorder into request processing middleware -func chiMetricsMiddleware(rec metrics.HTTPRecorder) func(http.Handler) http.Handler { - return func(next http.Handler) http.Handler { - return metrics.NewHTTPRecordingMiddleware(rec, next) - } -} - -// NewApi ... Construct a new api instance -func NewApi(ctx context.Context, log log.Logger, cfg *Config) (*APIService, error) { - out := &APIService{log: log, metricsRegistry: metrics.NewRegistry()} - if err := out.initFromConfig(ctx, cfg); err != nil { - return nil, errors.Join(err, out.Stop(ctx)) // close any resources we may have opened already - } - return out, nil -} - -func (a *APIService) initFromConfig(ctx context.Context, cfg *Config) error { - if err := a.initDB(ctx, cfg.DB); err != nil { - return fmt.Errorf("failed to init DB: %w", err) - } - if err := a.startMetricsServer(cfg.MetricsServer); err != nil { - return fmt.Errorf("failed to start metrics server: %w", err) - } - a.initRouter(cfg.HTTPServer) - if err := a.startServer(cfg.HTTPServer); err != nil { - return fmt.Errorf("failed to start API server: %w", err) - } - return nil -} - -func (a *APIService) Start(ctx context.Context) error { - // Completed all setup-up jobs at init-time already, - // and the API service does not have any other special starting routines or background-jobs to start. - return nil -} - -func (a *APIService) Stop(ctx context.Context) error { - var result error - if a.apiServer != nil { - if err := a.apiServer.Stop(ctx); err != nil { - result = errors.Join(result, fmt.Errorf("failed to stop API server: %w", err)) - } - } - if a.metricsServer != nil { - if err := a.metricsServer.Stop(ctx); err != nil { - result = errors.Join(result, fmt.Errorf("failed to stop metrics server: %w", err)) - } - } - if a.dbClose != nil { - if err := a.dbClose(); err != nil { - result = errors.Join(result, fmt.Errorf("failed to close DB: %w", err)) - } - } - a.stopped.Store(true) - a.log.Info("API service shutdown complete") - return result -} - -func (a *APIService) Stopped() bool { - return a.stopped.Load() -} - -// Addr ... returns the address that the HTTP server is listening on (excl. http:// prefix, just the host and port) -func (a *APIService) Addr() string { - if a.apiServer == nil { - return "" - } - return a.apiServer.Addr().String() -} - -func (a *APIService) initDB(ctx context.Context, connector DBConnector) error { - db, err := connector.OpenDB(ctx, a.log) - if err != nil { - return fmt.Errorf("failed to connect to database: %w", err) - } - a.dbClose = db.Closer - a.bv = db.BridgeTransfers - return nil -} - -func (a *APIService) initRouter(apiConfig config.ServerConfig) { - v := new(service.Validator) - - svc := service.New(v, a.bv, a.log) - apiRouter := chi.NewRouter() - h := routes.NewRoutes(a.log, apiRouter, svc) - - apiRouter.Use(middleware.Logger) - apiRouter.Use(middleware.Timeout(time.Duration(apiConfig.WriteTimeout) * time.Second)) - apiRouter.Use(middleware.Recoverer) - apiRouter.Use(middleware.Heartbeat(HealthPath)) - apiRouter.Use(chiMetricsMiddleware(metrics.NewPromHTTPRecorder(a.metricsRegistry, MetricsNamespace))) - - apiRouter.Get(fmt.Sprintf(DepositsPath+addressParam, ethereumAddressRegex), h.L1DepositsHandler) - apiRouter.Get(fmt.Sprintf(WithdrawalsPath+addressParam, ethereumAddressRegex), h.L2WithdrawalsHandler) - apiRouter.Get(SupplyPath, h.SupplyView) - apiRouter.Get(DocsPath, h.DocsHandler) - a.router = apiRouter -} - -// startServer ... Starts the API server -func (a *APIService) startServer(serverConfig config.ServerConfig) error { - a.log.Debug("API server listening...", "port", serverConfig.Port) - - addr := net.JoinHostPort(serverConfig.Host, strconv.Itoa(serverConfig.Port)) - srv, err := httputil.StartHTTPServer(addr, a.router) - if err != nil { - return fmt.Errorf("failed to start API server: %w", err) - } - - a.log.Info("API server started", "addr", srv.Addr().String()) - a.apiServer = srv - return nil -} - -// startMetricsServer ... Starts the metrics server -func (a *APIService) startMetricsServer(metricsConfig config.ServerConfig) error { - a.log.Debug("starting metrics server...", "port", metricsConfig.Port) - srv, err := metrics.StartServer(a.metricsRegistry, metricsConfig.Host, metricsConfig.Port) - if err != nil { - return fmt.Errorf("failed to start metrics server: %w", err) - } - a.log.Info("Metrics server started", "addr", srv.Addr().String()) - a.metricsServer = srv - return nil -} diff --git a/indexer/api/api_client.go b/indexer/api/api_client.go deleted file mode 100644 index 3f4ff616aa16..000000000000 --- a/indexer/api/api_client.go +++ /dev/null @@ -1,213 +0,0 @@ -package api - -import ( - "fmt" - "io" - "net/http" - "time" - - "encoding/json" - - "github.com/ethereum-optimism/optimism/indexer/api/models" - "github.com/ethereum-optimism/optimism/op-service/metrics" - "github.com/ethereum/go-ethereum/common" -) - -const ( - urlParams = "?cursor=%s&limit=%d" - - defaultPagingLimit = 100 - - // method names - healthz = "get_health" - deposits = "get_deposits" - withdrawals = "get_withdrawals" - sum = "get_sum" -) - -// Option ... Provides configuration through callback injection -type Option func(*Client) error - -// WithMetrics ... Triggers metric optionality -func WithMetrics(m metrics.RPCClientMetricer) Option { - return func(c *Client) error { - c.metrics = m - return nil - } -} - -// WithTimeout ... Embeds a timeout limit to request -func WithTimeout(t time.Duration) Option { - return func(c *Client) error { - c.c.Timeout = t - return nil - } -} - -// Config ... Indexer client config struct -type ClientConfig struct { - PaginationLimit int - BaseURL string -} - -// Client ... Indexer client struct -type Client struct { - cfg *ClientConfig - c *http.Client - metrics metrics.RPCClientMetricer -} - -// NewClient ... Construct a new indexer client -func NewClient(cfg *ClientConfig, opts ...Option) (*Client, error) { - if cfg.PaginationLimit <= 0 { - cfg.PaginationLimit = defaultPagingLimit - } - - c := &http.Client{} - client := &Client{cfg: cfg, c: c} - - for _, opt := range opts { - err := opt(client) - if err != nil { - return nil, err - } - } - - return client, nil -} - -// doRecordRequest ... Performs a read request on a provided endpoint w/ telemetry -func (c *Client) doRecordRequest(method string, endpoint string) ([]byte, error) { - var recordRequest func(error) = nil - if c.metrics != nil { - recordRequest = c.metrics.RecordRPCClientRequest(method) - } - - resp, err := c.c.Get(endpoint) - if recordRequest != nil { - recordRequest(err) - } - if err != nil { - return nil, err - } - - body, err := io.ReadAll(resp.Body) - if err != nil { - return nil, fmt.Errorf("failed to read response body: %w", err) - } - - 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, nil -} - -// HealthCheck ... Checks the health of the indexer API -func (c *Client) HealthCheck() error { - _, 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 + DepositsPath + l1Address.String() + urlParams - endpoint := fmt.Sprintf(url, cursor, c.cfg.PaginationLimit) - - resp, err := c.doRecordRequest(deposits, endpoint) - if err != nil { - return nil, err - } - - if err := json.Unmarshal(resp, &response); err != nil { - return nil, err - } - - return &response, nil -} - -// GetAllDepositsByAddress ... Gets all deposits provided a L1 address -func (c *Client) GetAllDepositsByAddress(l1Address common.Address) ([]models.DepositItem, error) { - var deposits []models.DepositItem - - cursor := "" - for { - dResponse, err := c.GetDepositsByAddress(l1Address, cursor) - if err != nil { - return nil, err - } - - deposits = append(deposits, dResponse.Items...) - if !dResponse.HasNextPage { - break - } - - cursor = dResponse.Cursor - } - - return deposits, nil - -} - -// GetSupplyAssessment ... Returns an assessment of the current supply -// 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 + SupplyPath - - resp, err := c.doRecordRequest(sum, url) - if err != nil { - return nil, err - } - - var bsv *models.BridgeSupplyView - if err := json.Unmarshal(resp, &bsv); err != nil { - return nil, err - } - - return bsv, nil -} - -// GetAllWithdrawalsByAddress ... Gets all withdrawals provided a L2 address -func (c *Client) GetAllWithdrawalsByAddress(l2Address common.Address) ([]models.WithdrawalItem, error) { - var withdrawals []models.WithdrawalItem - - cursor := "" - for { - wResponse, err := c.GetWithdrawalsByAddress(l2Address, cursor) - if err != nil { - return nil, err - } - - withdrawals = append(withdrawals, wResponse.Items...) - if !wResponse.HasNextPage { - break - } - - cursor = wResponse.Cursor - } - - return withdrawals, nil -} - -// 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 + WithdrawalsPath + l2Address.String() + urlParams - - endpoint := fmt.Sprintf(url, cursor, c.cfg.PaginationLimit) - resp, err := c.doRecordRequest(withdrawals, endpoint) - if err != nil { - return nil, err - } - - if err := json.Unmarshal(resp, &wResponse); err != nil { - return nil, err - } - - return wResponse, nil -} diff --git a/indexer/api/api_test.go b/indexer/api/api_test.go deleted file mode 100644 index e69a22fbfcf4..000000000000 --- a/indexer/api/api_test.go +++ /dev/null @@ -1,186 +0,0 @@ -package api - -import ( - "context" - "encoding/json" - "fmt" - "net/http" - "net/http/httptest" - "testing" - - "github.com/ethereum-optimism/optimism/indexer/api/models" - "github.com/ethereum-optimism/optimism/indexer/config" - "github.com/ethereum-optimism/optimism/indexer/database" - "github.com/ethereum-optimism/optimism/op-service/testlog" - "github.com/ethereum/go-ethereum/common" - "github.com/ethereum/go-ethereum/log" - "github.com/stretchr/testify/assert" - "github.com/stretchr/testify/require" -) - -// MockBridgeTransfersView mocks the BridgeTransfersView interface -type MockBridgeTransfersView struct{} - -var mockAddress = "0x4204204204204204204204204204204204204204" - -var apiConfig = config.ServerConfig{ - Host: "localhost", - Port: 0, // random port, to allow parallel tests -} - -var metricsConfig = config.ServerConfig{ - Host: "localhost", - Port: 0, // random port, to allow parallel tests -} - -var ( - deposit = database.L1BridgeDeposit{ - TransactionSourceHash: common.HexToHash("abc"), - BridgeTransfer: database.BridgeTransfer{ - CrossDomainMessageHash: &common.Hash{}, - Tx: database.Transaction{}, - TokenPair: database.TokenPair{}, - }, - } - - withdrawal = database.L2BridgeWithdrawal{ - TransactionWithdrawalHash: common.HexToHash("0x420"), - BridgeTransfer: database.BridgeTransfer{ - CrossDomainMessageHash: &common.Hash{}, - Tx: database.Transaction{}, - TokenPair: database.TokenPair{}, - }, - } -) - -func (mbv *MockBridgeTransfersView) L1BridgeDeposit(hash common.Hash) (*database.L1BridgeDeposit, error) { - return &deposit, nil -} - -func (mbv *MockBridgeTransfersView) L1BridgeDepositWithFilter(filter database.BridgeTransfer) (*database.L1BridgeDeposit, error) { - return &deposit, nil -} - -func (mbv *MockBridgeTransfersView) L2BridgeWithdrawal(address common.Hash) (*database.L2BridgeWithdrawal, error) { - return &withdrawal, nil -} - -func (mbv *MockBridgeTransfersView) L2BridgeWithdrawalWithFilter(filter database.BridgeTransfer) (*database.L2BridgeWithdrawal, error) { - return &withdrawal, nil -} - -func (mbv *MockBridgeTransfersView) L1BridgeDepositsByAddress(address common.Address, cursor string, limit int) (*database.L1BridgeDepositsResponse, error) { - return &database.L1BridgeDepositsResponse{ - Deposits: []database.L1BridgeDepositWithTransactionHashes{ - { - L1BridgeDeposit: deposit, - L1TransactionHash: common.HexToHash("0x123"), - L2TransactionHash: common.HexToHash("0x555"), - L1BlockHash: common.HexToHash("0x456"), - }, - }, - }, nil -} - -func (mbv *MockBridgeTransfersView) L2BridgeWithdrawalsByAddress(address common.Address, cursor string, limit int) (*database.L2BridgeWithdrawalsResponse, error) { - return &database.L2BridgeWithdrawalsResponse{ - Withdrawals: []database.L2BridgeWithdrawalWithTransactionHashes{ - { - L2BridgeWithdrawal: withdrawal, - L2TransactionHash: common.HexToHash("0x789"), - L2BlockHash: common.HexToHash("0x456"), - ProvenL1TransactionHash: common.HexToHash("0x123"), - FinalizedL1TransactionHash: common.HexToHash("0x123"), - }, - }, - }, nil -} - -func (mbv *MockBridgeTransfersView) L1TxDepositSum() (float64, error) { - return 69, nil -} -func (mbv *MockBridgeTransfersView) L2BridgeWithdrawalSum(database.WithdrawFilter) (float64, error) { - return 420, nil -} - -func TestHealthz(t *testing.T) { - logger := testlog.Logger(t, log.LevelInfo) - cfg := &Config{ - DB: &TestDBConnector{BridgeTransfers: &MockBridgeTransfersView{}}, - HTTPServer: apiConfig, - MetricsServer: metricsConfig, - } - api, err := NewApi(context.Background(), logger, cfg) - require.NoError(t, err) - request, err := http.NewRequest("GET", "http://"+api.Addr()+"/healthz", nil) - assert.Nil(t, err) - - responseRecorder := httptest.NewRecorder() - api.router.ServeHTTP(responseRecorder, request) - - assert.Equal(t, http.StatusOK, responseRecorder.Code) -} - -func TestL1BridgeDepositsHandler(t *testing.T) { - logger := testlog.Logger(t, log.LevelInfo) - cfg := &Config{ - DB: &TestDBConnector{BridgeTransfers: &MockBridgeTransfersView{}}, - HTTPServer: apiConfig, - MetricsServer: metricsConfig, - } - api, err := NewApi(context.Background(), logger, cfg) - require.NoError(t, err) - request, err := http.NewRequest("GET", fmt.Sprintf("http://"+api.Addr()+"/api/v0/deposits/%s", mockAddress), nil) - assert.Nil(t, err) - - responseRecorder := httptest.NewRecorder() - api.router.ServeHTTP(responseRecorder, request) - - assert.Equal(t, http.StatusOK, responseRecorder.Code) - - var resp models.DepositResponse - err = json.Unmarshal(responseRecorder.Body.Bytes(), &resp) - assert.Nil(t, err) - - require.Len(t, resp.Items, 1) - - assert.Equal(t, resp.Items[0].L1BlockHash, common.HexToHash("0x456").String()) - assert.Equal(t, resp.Items[0].L1TxHash, common.HexToHash("0x123").String()) - assert.Equal(t, resp.Items[0].Timestamp, deposit.Tx.Timestamp) - assert.Equal(t, resp.Items[0].L2TxHash, common.HexToHash("555").String()) -} - -func TestL2BridgeWithdrawalsByAddressHandler(t *testing.T) { - logger := testlog.Logger(t, log.LevelInfo) - cfg := &Config{ - DB: &TestDBConnector{BridgeTransfers: &MockBridgeTransfersView{}}, - HTTPServer: apiConfig, - MetricsServer: metricsConfig, - } - api, err := NewApi(context.Background(), logger, cfg) - require.NoError(t, err) - request, err := http.NewRequest("GET", fmt.Sprintf("http://"+api.Addr()+"/api/v0/withdrawals/%s", mockAddress), nil) - assert.Nil(t, err) - - responseRecorder := httptest.NewRecorder() - api.router.ServeHTTP(responseRecorder, request) - - var resp models.WithdrawalResponse - err = json.Unmarshal(responseRecorder.Body.Bytes(), &resp) - assert.Nil(t, err) - - require.Len(t, resp.Items, 1) - - assert.Equal(t, resp.Items[0].Guid, withdrawal.TransactionWithdrawalHash.String()) - assert.Equal(t, resp.Items[0].L2BlockHash, common.HexToHash("0x456").String()) - assert.Equal(t, resp.Items[0].From, withdrawal.Tx.FromAddress.String()) - assert.Equal(t, resp.Items[0].To, withdrawal.Tx.ToAddress.String()) - assert.Equal(t, resp.Items[0].TransactionHash, common.HexToHash("0x789").String()) - assert.Equal(t, resp.Items[0].Amount, withdrawal.Tx.Amount.String()) - assert.Equal(t, resp.Items[0].L1ProvenTxHash, common.HexToHash("0x123").String()) - assert.Equal(t, resp.Items[0].L1FinalizedTxHash, common.HexToHash("0x123").String()) - assert.Equal(t, resp.Items[0].L1TokenAddress, withdrawal.TokenPair.RemoteTokenAddress.String()) - assert.Equal(t, resp.Items[0].L2TokenAddress, withdrawal.TokenPair.LocalTokenAddress.String()) - assert.Equal(t, resp.Items[0].Timestamp, withdrawal.Tx.Timestamp) - -} diff --git a/indexer/api/config.go b/indexer/api/config.go deleted file mode 100644 index 9db26bfffc13..000000000000 --- a/indexer/api/config.go +++ /dev/null @@ -1,60 +0,0 @@ -package api - -import ( - "context" - "fmt" - - "github.com/ethereum/go-ethereum/log" - - "github.com/ethereum-optimism/optimism/indexer/config" - "github.com/ethereum-optimism/optimism/indexer/database" -) - -// DB represents the abstract DB access the API has. -type DB struct { - BridgeTransfers database.BridgeTransfersView - Closer func() error -} - -// DBConfigConnector implements a fully config based DBConnector -type DBConfigConnector struct { - config.DBConfig -} - -func (cfg *DBConfigConnector) OpenDB(ctx context.Context, log log.Logger) (*DB, error) { - db, err := database.NewDB(ctx, log, cfg.DBConfig) - if err != nil { - return nil, fmt.Errorf("failed to connect to database: %w", err) - } - return &DB{ - BridgeTransfers: db.BridgeTransfers, - Closer: db.Close, - }, nil -} - -type TestDBConnector struct { - BridgeTransfers database.BridgeTransfersView -} - -func (tdb *TestDBConnector) OpenDB(ctx context.Context, log log.Logger) (*DB, error) { - return &DB{ - BridgeTransfers: tdb.BridgeTransfers, - Closer: func() error { - log.Info("API service closed test DB view") - return nil - }, - }, nil -} - -// DBConnector is an interface: the config may provide different ways to access the DB. -// This is implemented in tests to provide custom DB views, or share the DB with other services. -type DBConnector interface { - OpenDB(ctx context.Context, log log.Logger) (*DB, error) -} - -// Config for the API service -type Config struct { - DB DBConnector - HTTPServer config.ServerConfig - MetricsServer config.ServerConfig -} diff --git a/indexer/api/models/models.go b/indexer/api/models/models.go deleted file mode 100644 index f62b1dc6f33a..000000000000 --- a/indexer/api/models/models.go +++ /dev/null @@ -1,62 +0,0 @@ -package models - -import ( - "github.com/ethereum/go-ethereum/common" -) - -type QueryParams struct { - Address common.Address - Limit int - Cursor string -} - -// DepositItem ... Deposit item model for API responses -type DepositItem struct { - Guid string `json:"guid"` - From string `json:"from"` - To string `json:"to"` - Timestamp uint64 `json:"timestamp"` - L1BlockHash string `json:"l1BlockHash"` - L1TxHash string `json:"l1TxHash"` - L2TxHash string `json:"l2TxHash"` - Amount string `json:"amount"` - L1TokenAddress string `json:"l1TokenAddress"` - L2TokenAddress string `json:"l2TokenAddress"` -} - -// DepositResponse ... Data model for API JSON response -type DepositResponse struct { - Cursor string `json:"cursor"` - HasNextPage bool `json:"hasNextPage"` - Items []DepositItem `json:"items"` -} - -// WithdrawalItem ... Data model for API JSON response -type WithdrawalItem struct { - Guid string `json:"guid"` - From string `json:"from"` - To string `json:"to"` - TransactionHash string `json:"transactionHash"` - CrossDomainMessageHash string `json:"crossDomainMessageHash"` - Timestamp uint64 `json:"timestamp"` - L2BlockHash string `json:"l2BlockHash"` - Amount string `json:"amount"` - L1ProvenTxHash string `json:"l1ProvenTxHash"` - L1FinalizedTxHash string `json:"l1FinalizedTxHash"` - L1TokenAddress string `json:"l1TokenAddress"` - L2TokenAddress string `json:"l2TokenAddress"` -} - -// WithdrawalResponse ... Data model for API JSON response -type WithdrawalResponse struct { - Cursor string `json:"cursor"` - HasNextPage bool `json:"hasNextPage"` - Items []WithdrawalItem `json:"items"` -} - -type BridgeSupplyView struct { - L1DepositSum float64 `json:"l1DepositSum"` - InitWithdrawalSum float64 `json:"l2WithdrawalSum"` - ProvenWithdrawSum float64 `json:"provenSum"` - FinalizedWithdrawSum float64 `json:"finalizedSum"` -} diff --git a/indexer/api/models/models_test.go b/indexer/api/models/models_test.go deleted file mode 100644 index 0e60304c7357..000000000000 --- a/indexer/api/models/models_test.go +++ /dev/null @@ -1 +0,0 @@ -package models_test diff --git a/indexer/api/routes/common.go b/indexer/api/routes/common.go deleted file mode 100644 index 63a0106bd305..000000000000 --- a/indexer/api/routes/common.go +++ /dev/null @@ -1,29 +0,0 @@ -package routes - -import ( - "encoding/json" - "net/http" -) - -const ( - InternalServerError = "Internal server error" -) - -// jsonResponse ... Marshals and writes a JSON response provided arbitrary data -func jsonResponse(w http.ResponseWriter, data interface{}, statusCode int) error { - w.Header().Set("Content-Type", "application/json") - jsonData, err := json.Marshal(data) - if err != nil { - http.Error(w, InternalServerError, http.StatusInternalServerError) - return err - } - - w.WriteHeader(statusCode) - _, err = w.Write(jsonData) - if err != nil { - http.Error(w, InternalServerError, http.StatusInternalServerError) - return err - } - - return nil -} diff --git a/indexer/api/routes/deposits.go b/indexer/api/routes/deposits.go deleted file mode 100644 index f66e70b6ab33..000000000000 --- a/indexer/api/routes/deposits.go +++ /dev/null @@ -1,34 +0,0 @@ -package routes - -import ( - "net/http" - - "github.com/go-chi/chi/v5" -) - -// L1DepositsHandler ... Handles /api/v0/deposits/{address} GET requests -func (h Routes) L1DepositsHandler(w http.ResponseWriter, r *http.Request) { - address := chi.URLParam(r, "address") - cursor := r.URL.Query().Get("cursor") - limit := r.URL.Query().Get("limit") - - params, err := h.svc.QueryParams(address, cursor, limit) - if err != nil { - http.Error(w, "invalid query params", http.StatusBadRequest) - h.logger.Error("error reading request params", "err", err.Error()) - return - } - - deposits, err := h.svc.GetDeposits(params) - if err != nil { - http.Error(w, "internal server error", http.StatusInternalServerError) - h.logger.Error("error fetching deposits", "err", err.Error()) - return - } - - resp := h.svc.DepositResponse(deposits) - err = jsonResponse(w, resp, http.StatusOK) - if err != nil { - h.logger.Error("error writing response", "err", err) - } -} diff --git a/indexer/api/routes/docs.go b/indexer/api/routes/docs.go deleted file mode 100644 index b88a8b10a915..000000000000 --- a/indexer/api/routes/docs.go +++ /dev/null @@ -1,22 +0,0 @@ -package routes - -import ( - "net/http" - - "github.com/go-chi/docgen" -) - -func (h Routes) DocsHandler(w http.ResponseWriter, r *http.Request) { - w.Header().Set("Content-Type", "text/plain") - w.WriteHeader(http.StatusOK) - docs := docgen.MarkdownRoutesDoc(h.router, docgen.MarkdownOpts{ - ProjectPath: "github.com/ethereum-optimism/optimism/indexer", - // Intro text included at the top of the generated markdown file. - Intro: "Generated documentation for Optimism indexer", - }) - _, err := w.Write([]byte(docs)) - if err != nil { - h.logger.Error("error writing docs", "err", err) - http.Error(w, "Internal server error fetching docs", http.StatusInternalServerError) - } -} diff --git a/indexer/api/routes/routes.go b/indexer/api/routes/routes.go deleted file mode 100644 index 457a7ed92dd9..000000000000 --- a/indexer/api/routes/routes.go +++ /dev/null @@ -1,22 +0,0 @@ -package routes - -import ( - "github.com/ethereum-optimism/optimism/indexer/api/service" - "github.com/ethereum/go-ethereum/log" - "github.com/go-chi/chi/v5" -) - -type Routes struct { - logger log.Logger - router *chi.Mux - svc service.Service -} - -// NewRoutes ... Construct a new route handler instance -func NewRoutes(l log.Logger, r *chi.Mux, svc service.Service) Routes { - return Routes{ - logger: l, - router: r, - svc: svc, - } -} diff --git a/indexer/api/routes/supply.go b/indexer/api/routes/supply.go deleted file mode 100644 index 4fa4c0aa6f2f..000000000000 --- a/indexer/api/routes/supply.go +++ /dev/null @@ -1,21 +0,0 @@ -package routes - -import ( - "net/http" -) - -// SupplyView ... Handles /api/v0/supply GET requests -func (h Routes) SupplyView(w http.ResponseWriter, r *http.Request) { - - view, err := h.svc.GetSupplyInfo() - if err != nil { - http.Error(w, "Internal server error", http.StatusInternalServerError) - h.logger.Error("error getting supply info", "err", err) - return - } - - err = jsonResponse(w, view, http.StatusOK) - if err != nil { - h.logger.Error("error writing response", "err", err) - } -} diff --git a/indexer/api/routes/withdrawals.go b/indexer/api/routes/withdrawals.go deleted file mode 100644 index 8c26b9e26f18..000000000000 --- a/indexer/api/routes/withdrawals.go +++ /dev/null @@ -1,34 +0,0 @@ -package routes - -import ( - "net/http" - - "github.com/go-chi/chi/v5" -) - -// L2WithdrawalsHandler ... Handles /api/v0/withdrawals/{address} GET requests -func (h Routes) L2WithdrawalsHandler(w http.ResponseWriter, r *http.Request) { - address := chi.URLParam(r, "address") - cursor := r.URL.Query().Get("cursor") - limit := r.URL.Query().Get("limit") - - params, err := h.svc.QueryParams(address, cursor, limit) - if err != nil { - http.Error(w, "Invalid query params", http.StatusBadRequest) - h.logger.Error("Invalid query params", "err", err.Error()) - return - } - - withdrawals, err := h.svc.GetWithdrawals(params) - if err != nil { - http.Error(w, "Internal server error", http.StatusInternalServerError) - h.logger.Error("Error getting withdrawals", "err", err.Error()) - return - } - - resp := h.svc.WithdrawResponse(withdrawals) - err = jsonResponse(w, resp, http.StatusOK) - if err != nil { - h.logger.Error("Error writing response", "err", err.Error()) - } -} diff --git a/indexer/api/service/service.go b/indexer/api/service/service.go deleted file mode 100644 index ba61acb72f46..000000000000 --- a/indexer/api/service/service.go +++ /dev/null @@ -1,175 +0,0 @@ -package service - -import ( - "github.com/ethereum/go-ethereum/log" - - "github.com/ethereum-optimism/optimism/indexer/api/models" - "github.com/ethereum-optimism/optimism/indexer/database" - "github.com/ethereum/go-ethereum/common" -) - -type Service interface { - GetDeposits(*models.QueryParams) (*database.L1BridgeDepositsResponse, error) - DepositResponse(*database.L1BridgeDepositsResponse) models.DepositResponse - GetWithdrawals(params *models.QueryParams) (*database.L2BridgeWithdrawalsResponse, error) - WithdrawResponse(*database.L2BridgeWithdrawalsResponse) models.WithdrawalResponse - GetSupplyInfo() (*models.BridgeSupplyView, error) - - QueryParams(address, cursor, limit string) (*models.QueryParams, error) -} - -type HandlerSvc struct { - v *Validator - db database.BridgeTransfersView - logger log.Logger -} - -func New(v *Validator, db database.BridgeTransfersView, l log.Logger) Service { - return &HandlerSvc{ - logger: l, - v: v, - db: db, - } -} - -func (svc *HandlerSvc) QueryParams(a, c, l string) (*models.QueryParams, error) { - address, err := svc.v.ParseValidateAddress(a) - if err != nil { - svc.logger.Error("invalid address param", "param", a, "err", err) - return nil, err - } - - err = svc.v.ValidateCursor(c) - if err != nil { - svc.logger.Error("invalid cursor param", "cursor", c, "err", err) - return nil, err - } - - limit, err := svc.v.ParseValidateLimit(l) - if err != nil { - svc.logger.Error("invalid query param", "cursor", c, "err", err) - return nil, err - } - - return &models.QueryParams{ - Address: address, - Cursor: c, - Limit: limit, - }, nil - -} - -func (svc *HandlerSvc) GetWithdrawals(params *models.QueryParams) (*database.L2BridgeWithdrawalsResponse, error) { - withdrawals, err := svc.db.L2BridgeWithdrawalsByAddress(params.Address, params.Cursor, params.Limit) - if err != nil { - svc.logger.Error("error getting withdrawals", "err", err.Error(), "address", params.Address.String()) - return nil, err - } - - svc.logger.Debug("read withdrawals from db", "count", len(withdrawals.Withdrawals), "address", params.Address.String()) - return withdrawals, nil -} - -func (svc *HandlerSvc) WithdrawResponse(withdrawals *database.L2BridgeWithdrawalsResponse) models.WithdrawalResponse { - items := make([]models.WithdrawalItem, len(withdrawals.Withdrawals)) - for i, withdrawal := range withdrawals.Withdrawals { - - cdh := withdrawal.L2BridgeWithdrawal.CrossDomainMessageHash - if cdh == nil { // Zero value indicates that the withdrawal didn't have a cross domain message - cdh = &common.Hash{0} - } - - item := models.WithdrawalItem{ - Guid: withdrawal.L2BridgeWithdrawal.TransactionWithdrawalHash.String(), - L2BlockHash: withdrawal.L2BlockHash.String(), - Timestamp: withdrawal.L2BridgeWithdrawal.Tx.Timestamp, - From: withdrawal.L2BridgeWithdrawal.Tx.FromAddress.String(), - To: withdrawal.L2BridgeWithdrawal.Tx.ToAddress.String(), - TransactionHash: withdrawal.L2TransactionHash.String(), - Amount: withdrawal.L2BridgeWithdrawal.Tx.Amount.String(), - CrossDomainMessageHash: cdh.String(), - L1ProvenTxHash: withdrawal.ProvenL1TransactionHash.String(), - L1FinalizedTxHash: withdrawal.FinalizedL1TransactionHash.String(), - L1TokenAddress: withdrawal.L2BridgeWithdrawal.TokenPair.RemoteTokenAddress.String(), - L2TokenAddress: withdrawal.L2BridgeWithdrawal.TokenPair.LocalTokenAddress.String(), - } - items[i] = item - } - - return models.WithdrawalResponse{ - Cursor: withdrawals.Cursor, - HasNextPage: withdrawals.HasNextPage, - Items: items, - } -} - -func (svc *HandlerSvc) GetDeposits(params *models.QueryParams) (*database.L1BridgeDepositsResponse, error) { - deposits, err := svc.db.L1BridgeDepositsByAddress(params.Address, params.Cursor, params.Limit) - if err != nil { - svc.logger.Error("error getting deposits", "err", err.Error(), "address", params.Address.String()) - return nil, err - } - - svc.logger.Debug("read deposits from db", "count", len(deposits.Deposits), "address", params.Address.String()) - return deposits, nil -} - -// DepositResponse ... Converts a database.L1BridgeDepositsResponse to an api.DepositResponse -func (svc *HandlerSvc) DepositResponse(deposits *database.L1BridgeDepositsResponse) models.DepositResponse { - items := make([]models.DepositItem, len(deposits.Deposits)) - for i, deposit := range deposits.Deposits { - item := models.DepositItem{ - Guid: deposit.L1BridgeDeposit.TransactionSourceHash.String(), - L1BlockHash: deposit.L1BlockHash.String(), - Timestamp: deposit.L1BridgeDeposit.Tx.Timestamp, - L1TxHash: deposit.L1TransactionHash.String(), - L2TxHash: deposit.L2TransactionHash.String(), - From: deposit.L1BridgeDeposit.Tx.FromAddress.String(), - To: deposit.L1BridgeDeposit.Tx.ToAddress.String(), - Amount: deposit.L1BridgeDeposit.Tx.Amount.String(), - L1TokenAddress: deposit.L1BridgeDeposit.TokenPair.LocalTokenAddress.String(), - L2TokenAddress: deposit.L1BridgeDeposit.TokenPair.RemoteTokenAddress.String(), - } - items[i] = item - } - - return models.DepositResponse{ - Cursor: deposits.Cursor, - HasNextPage: deposits.HasNextPage, - Items: items, - } -} - -// GetSupplyInfo ... Fetch native bridge supply info -func (svc *HandlerSvc) GetSupplyInfo() (*models.BridgeSupplyView, error) { - depositSum, err := svc.db.L1TxDepositSum() - if err != nil { - svc.logger.Error("error getting deposit sum", "err", err) - return nil, err - } - - initSum, err := svc.db.L2BridgeWithdrawalSum(database.All) - if err != nil { - svc.logger.Error("error getting init sum", "err", err) - return nil, err - } - - provenSum, err := svc.db.L2BridgeWithdrawalSum(database.Proven) - if err != nil { - svc.logger.Error("error getting proven sum", "err", err) - return nil, err - } - - finalizedSum, err := svc.db.L2BridgeWithdrawalSum(database.Finalized) - if err != nil { - svc.logger.Error("error getting finalized sum", "err", err) - return nil, err - } - - return &models.BridgeSupplyView{ - L1DepositSum: depositSum, - InitWithdrawalSum: initSum, - ProvenWithdrawSum: provenSum, - FinalizedWithdrawSum: finalizedSum, - }, nil -} diff --git a/indexer/api/service/service_test.go b/indexer/api/service/service_test.go deleted file mode 100644 index 1ec994148fa1..000000000000 --- a/indexer/api/service/service_test.go +++ /dev/null @@ -1,132 +0,0 @@ -package service_test - -import ( - "fmt" - "reflect" - "testing" - - "github.com/ethereum/go-ethereum/log" - - "github.com/ethereum-optimism/optimism/indexer/api/service" - "github.com/ethereum-optimism/optimism/indexer/database" - "github.com/ethereum/go-ethereum/common" - "github.com/stretchr/testify/require" -) - -func assertFieldsAreSet(t *testing.T, item any) { - structType := reflect.TypeOf(item) - - structVal := reflect.ValueOf(item) - fieldNum := structVal.NumField() - - for i := 0; i < fieldNum; i++ { - field := structVal.Field(i) - fieldName := structType.Field(i).Name - - isSet := field.IsValid() && !field.IsZero() - - require.True(t, isSet, fmt.Sprintf("%s in not set", fieldName)) - - } -} - -func TestWithdrawalResponse(t *testing.T) { - svc := service.New(nil, nil, nil) - cdh := common.HexToHash("0x2") - - withdraws := &database.L2BridgeWithdrawalsResponse{ - Withdrawals: []database.L2BridgeWithdrawalWithTransactionHashes{ - { - L2BridgeWithdrawal: database.L2BridgeWithdrawal{ - TransactionWithdrawalHash: common.HexToHash("0x1"), - BridgeTransfer: database.BridgeTransfer{ - CrossDomainMessageHash: &cdh, - Tx: database.Transaction{ - FromAddress: common.HexToAddress("0x3"), - ToAddress: common.HexToAddress("0x4"), - Timestamp: 5, - }, - TokenPair: database.TokenPair{ - LocalTokenAddress: common.HexToAddress("0x6"), - RemoteTokenAddress: common.HexToAddress("0x7"), - }, - }, - }, - }, - }, - } - - response := svc.WithdrawResponse(withdraws) - require.NotEmpty(t, response.Items) - require.Len(t, response.Items, 1) - assertFieldsAreSet(t, response.Items[0]) -} - -func TestDepositResponse(t *testing.T) { - cdh := common.HexToHash("0x2") - svc := service.New(nil, nil, nil) - - deposits := &database.L1BridgeDepositsResponse{ - Deposits: []database.L1BridgeDepositWithTransactionHashes{ - { - L1BridgeDeposit: database.L1BridgeDeposit{ - BridgeTransfer: database.BridgeTransfer{ - CrossDomainMessageHash: &cdh, - Tx: database.Transaction{ - FromAddress: common.HexToAddress("0x3"), - ToAddress: common.HexToAddress("0x4"), - Timestamp: 5, - }, - TokenPair: database.TokenPair{ - LocalTokenAddress: common.HexToAddress("0x6"), - RemoteTokenAddress: common.HexToAddress("0x7"), - }, - }, - }, - }, - }, - } - - response := svc.DepositResponse(deposits) - require.NotEmpty(t, response.Items) - require.Len(t, response.Items, 1) - assertFieldsAreSet(t, response.Items[0]) -} - -func TestQueryParams(t *testing.T) { - - var tests = []struct { - name string - test func(*testing.T, service.Service) - }{ - { - name: "empty params", - test: func(t *testing.T, svc service.Service) { - params, err := svc.QueryParams("", "", "") - require.Error(t, err) - require.Nil(t, params) - }, - }, - { - name: "empty params except address", - test: func(t *testing.T, svc service.Service) { - addr := common.HexToAddress("0x420") - params, err := svc.QueryParams(addr.String(), "", "") - require.NoError(t, err) - require.NotNil(t, params) - require.Equal(t, addr, params.Address) - require.Equal(t, 100, params.Limit) - require.Equal(t, "", params.Cursor) - }, - }, - } - - v := new(service.Validator) - svc := service.New(v, nil, log.New()) - - for _, tt := range tests { - t.Run(tt.name, func(t *testing.T) { - tt.test(t, svc) - }) - } -} diff --git a/indexer/api/service/validator.go b/indexer/api/service/validator.go deleted file mode 100644 index 4e6a72199ec7..000000000000 --- a/indexer/api/service/validator.go +++ /dev/null @@ -1,61 +0,0 @@ -package service - -import ( - "errors" - "strconv" - - "github.com/ethereum/go-ethereum/common" -) - -// Validator ... Validates API user request parameters -type Validator struct{} - -// ParseValidateAddress ... Validates and parses the address query parameter -func (v *Validator) ParseValidateAddress(addr string) (common.Address, error) { - if !common.IsHexAddress(addr) { - return common.Address{}, errors.New("address must be represented as a valid hexadecimal string") - } - - parsedAddr := common.HexToAddress(addr) - if parsedAddr == common.HexToAddress("0x0") { - return common.Address{}, errors.New("address cannot be the zero address") - } - - return parsedAddr, nil -} - -// ValidateCursor ... Validates and parses the cursor query parameter -func (v *Validator) ValidateCursor(cursor string) error { - if cursor == "" { - return nil - } - - if len(cursor) != 66 { // 0x + 64 chars - return errors.New("cursor must be a 32 byte hex string") - } - - if cursor[:2] != "0x" { - return errors.New("cursor must begin with 0x") - } - - return nil -} - -// ParseValidateLimit ... Validates and parses the limit query parameters -func (v *Validator) ParseValidateLimit(limit string) (int, error) { - if limit == "" { - return 100, nil - } - - val, err := strconv.Atoi(limit) - if err != nil { - return 0, errors.New("limit must be an integer value") - } - - if val <= 0 { - return 0, errors.New("limit must be greater than 0") - } - - // TODO - Add a check against a max limit value - return val, nil -} diff --git a/indexer/api/service/validator_test.go b/indexer/api/service/validator_test.go deleted file mode 100644 index fa4a76e6e7b0..000000000000 --- a/indexer/api/service/validator_test.go +++ /dev/null @@ -1,64 +0,0 @@ -package service - -import ( - "testing" - - "github.com/stretchr/testify/require" -) - -func TestParseValidateLimit(t *testing.T) { - v := Validator{} - - // (1) Happy case - limit := "100" - _, err := v.ParseValidateLimit(limit) - require.NoError(t, err, "limit should be valid") - - // (2) Boundary validation - limit = "0" - _, err = v.ParseValidateLimit(limit) - require.Error(t, err, "limit must be greater than 0") - - // (3) Type validation - limit = "abc" - _, err = v.ParseValidateLimit(limit) - require.Error(t, err, "limit must be an integer value") -} - -func TestParseValidateAddress(t *testing.T) { - v := Validator{} - - // (1) Happy case - addr := "0x95222290DD7278Aa3Ddd389Cc1E1d165CC4BAfe5" - _, err := v.ParseValidateAddress(addr) - require.NoError(t, err, "address should be pass") - - // (2) Invalid hex - addr = "🫡" - _, err = v.ParseValidateAddress(addr) - require.Error(t, err, "address must be represented as a valid hexadecimal string") - - // (3) Zero address - addr = "0x0000000000000000000000000000000000000000" - _, err = v.ParseValidateAddress(addr) - require.Error(t, err, "address cannot be black-hole value") -} - -func Test_ParseValidateCursor(t *testing.T) { - v := Validator{} - - // (1) Happy case - cursor := "0xf3fd2eb696dab4263550b938726f9b3606e334cce6ebe27446bc26cb700b94e0" - err := v.ValidateCursor(cursor) - require.NoError(t, err, "cursor should be pass") - - // (2) Invalid length - cursor = "0x000" - err = v.ValidateCursor(cursor) - require.Error(t, err, "cursor must be 32 byte hex string") - - // (3) Invalid hex - cursor = "0🫡" - err = v.ValidateCursor(cursor) - require.Error(t, err, "cursor must start with 0x") -} diff --git a/indexer/bigint/bigint.go b/indexer/bigint/bigint.go deleted file mode 100644 index d1caf1908cee..000000000000 --- a/indexer/bigint/bigint.go +++ /dev/null @@ -1,33 +0,0 @@ -package bigint - -import "math/big" - -var ( - Zero = big.NewInt(0) - One = big.NewInt(1) -) - -// Clamp returns a new big.Int for `end` to which `end - start` <= size. -// @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 - if count <= size { - return end - } - - // we re-use the allocated temp as the new end - temp.Add(start, big.NewInt(int64(size-1))) - return temp -} - -// Matcher returns an inner comparison function result for a big.Int -func Matcher(num int64) func(*big.Int) bool { - return func(bi *big.Int) bool { return bi.Int64() == num } -} - -func WeiToETH(wei *big.Int) *big.Float { - f := new(big.Float) - f.SetString(wei.String()) - return f.Quo(f, big.NewFloat(1e18)) -} diff --git a/indexer/bigint/bigint_test.go b/indexer/bigint/bigint_test.go deleted file mode 100644 index a76f404600d0..000000000000 --- a/indexer/bigint/bigint_test.go +++ /dev/null @@ -1,29 +0,0 @@ -package bigint - -import ( - "math/big" - "testing" - - "github.com/stretchr/testify/require" -) - -func TestClamp(t *testing.T) { - start := big.NewInt(1) - end := big.NewInt(10) - - // When the (start, end) bounds are within range - // the same end pointer should be returned - - // larger range - result := Clamp(start, end, 20) - require.True(t, end == result) - - // exact range - result = Clamp(start, end, 10) - require.True(t, end == result) - - // smaller range - result = Clamp(start, end, 5) - require.False(t, end == result) - require.Equal(t, uint64(5), result.Uint64()) -} diff --git a/indexer/bindings/CanonicalTransactionChain.go b/indexer/bindings/CanonicalTransactionChain.go deleted file mode 100644 index 36c01c1b8d10..000000000000 --- a/indexer/bindings/CanonicalTransactionChain.go +++ /dev/null @@ -1,1522 +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 -) - -// LibOVMCodecQueueElement is an auto generated low-level Go binding around an user-defined struct. -type LibOVMCodecQueueElement struct { - TransactionHash [32]byte - Timestamp *big.Int - BlockNumber *big.Int -} - -// CanonicalTransactionChainMetaData contains all meta data concerning the CanonicalTransactionChain contract. -var CanonicalTransactionChainMetaData = &bind.MetaData{ - ABI: "[{\"inputs\":[{\"internalType\":\"address\",\"name\":\"_libAddressManager\",\"type\":\"address\"},{\"internalType\":\"uint256\",\"name\":\"_maxTransactionGasLimit\",\"type\":\"uint256\"},{\"internalType\":\"uint256\",\"name\":\"_l2GasDiscountDivisor\",\"type\":\"uint256\"},{\"internalType\":\"uint256\",\"name\":\"_enqueueGasCost\",\"type\":\"uint256\"}],\"stateMutability\":\"nonpayable\",\"type\":\"constructor\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":false,\"internalType\":\"uint256\",\"name\":\"l2GasDiscountDivisor\",\"type\":\"uint256\"},{\"indexed\":false,\"internalType\":\"uint256\",\"name\":\"enqueueGasCost\",\"type\":\"uint256\"},{\"indexed\":false,\"internalType\":\"uint256\",\"name\":\"enqueueL2GasPrepaid\",\"type\":\"uint256\"}],\"name\":\"L2GasParamsUpdated\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":false,\"internalType\":\"uint256\",\"name\":\"_startingQueueIndex\",\"type\":\"uint256\"},{\"indexed\":false,\"internalType\":\"uint256\",\"name\":\"_numQueueElements\",\"type\":\"uint256\"},{\"indexed\":false,\"internalType\":\"uint256\",\"name\":\"_totalElements\",\"type\":\"uint256\"}],\"name\":\"QueueBatchAppended\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":false,\"internalType\":\"uint256\",\"name\":\"_startingQueueIndex\",\"type\":\"uint256\"},{\"indexed\":false,\"internalType\":\"uint256\",\"name\":\"_numQueueElements\",\"type\":\"uint256\"},{\"indexed\":false,\"internalType\":\"uint256\",\"name\":\"_totalElements\",\"type\":\"uint256\"}],\"name\":\"SequencerBatchAppended\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"uint256\",\"name\":\"_batchIndex\",\"type\":\"uint256\"},{\"indexed\":false,\"internalType\":\"bytes32\",\"name\":\"_batchRoot\",\"type\":\"bytes32\"},{\"indexed\":false,\"internalType\":\"uint256\",\"name\":\"_batchSize\",\"type\":\"uint256\"},{\"indexed\":false,\"internalType\":\"uint256\",\"name\":\"_prevTotalElements\",\"type\":\"uint256\"},{\"indexed\":false,\"internalType\":\"bytes\",\"name\":\"_extraData\",\"type\":\"bytes\"}],\"name\":\"TransactionBatchAppended\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"address\",\"name\":\"_l1TxOrigin\",\"type\":\"address\"},{\"indexed\":true,\"internalType\":\"address\",\"name\":\"_target\",\"type\":\"address\"},{\"indexed\":false,\"internalType\":\"uint256\",\"name\":\"_gasLimit\",\"type\":\"uint256\"},{\"indexed\":false,\"internalType\":\"bytes\",\"name\":\"_data\",\"type\":\"bytes\"},{\"indexed\":true,\"internalType\":\"uint256\",\"name\":\"_queueIndex\",\"type\":\"uint256\"},{\"indexed\":false,\"internalType\":\"uint256\",\"name\":\"_timestamp\",\"type\":\"uint256\"}],\"name\":\"TransactionEnqueued\",\"type\":\"event\"},{\"inputs\":[],\"name\":\"MAX_ROLLUP_TX_SIZE\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"\",\"type\":\"uint256\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"MIN_ROLLUP_TX_GAS\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"\",\"type\":\"uint256\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"appendSequencerBatch\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"batches\",\"outputs\":[{\"internalType\":\"contractIChainStorageContainer\",\"name\":\"\",\"type\":\"address\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"_target\",\"type\":\"address\"},{\"internalType\":\"uint256\",\"name\":\"_gasLimit\",\"type\":\"uint256\"},{\"internalType\":\"bytes\",\"name\":\"_data\",\"type\":\"bytes\"}],\"name\":\"enqueue\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"enqueueGasCost\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"\",\"type\":\"uint256\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"enqueueL2GasPrepaid\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"\",\"type\":\"uint256\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"getLastBlockNumber\",\"outputs\":[{\"internalType\":\"uint40\",\"name\":\"\",\"type\":\"uint40\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"getLastTimestamp\",\"outputs\":[{\"internalType\":\"uint40\",\"name\":\"\",\"type\":\"uint40\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"getNextQueueIndex\",\"outputs\":[{\"internalType\":\"uint40\",\"name\":\"\",\"type\":\"uint40\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"getNumPendingQueueElements\",\"outputs\":[{\"internalType\":\"uint40\",\"name\":\"\",\"type\":\"uint40\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"uint256\",\"name\":\"_index\",\"type\":\"uint256\"}],\"name\":\"getQueueElement\",\"outputs\":[{\"components\":[{\"internalType\":\"bytes32\",\"name\":\"transactionHash\",\"type\":\"bytes32\"},{\"internalType\":\"uint40\",\"name\":\"timestamp\",\"type\":\"uint40\"},{\"internalType\":\"uint40\",\"name\":\"blockNumber\",\"type\":\"uint40\"}],\"internalType\":\"structLib_OVMCodec.QueueElement\",\"name\":\"_element\",\"type\":\"tuple\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"getQueueLength\",\"outputs\":[{\"internalType\":\"uint40\",\"name\":\"\",\"type\":\"uint40\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"getTotalBatches\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"_totalBatches\",\"type\":\"uint256\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"getTotalElements\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"_totalElements\",\"type\":\"uint256\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"l2GasDiscountDivisor\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"\",\"type\":\"uint256\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"libAddressManager\",\"outputs\":[{\"internalType\":\"contractLib_AddressManager\",\"name\":\"\",\"type\":\"address\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"maxTransactionGasLimit\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"\",\"type\":\"uint256\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"string\",\"name\":\"_name\",\"type\":\"string\"}],\"name\":\"resolve\",\"outputs\":[{\"internalType\":\"address\",\"name\":\"\",\"type\":\"address\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"uint256\",\"name\":\"_l2GasDiscountDivisor\",\"type\":\"uint256\"},{\"internalType\":\"uint256\",\"name\":\"_enqueueGasCost\",\"type\":\"uint256\"}],\"name\":\"setGasParams\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"}]", - Bin: "0x608060405234801561001057600080fd5b5060405162001a9838038062001a9883398101604081905261003191610072565b600080546001600160a01b0319166001600160a01b03861617905560048390556002829055600181905561006581836100bd565b600355506100ea92505050565b6000806000806080858703121561008857600080fd5b84516001600160a01b038116811461009f57600080fd5b60208601516040870151606090970151919890975090945092505050565b60008160001904831182151516156100e557634e487b7160e01b600052601160045260246000fd5b500290565b61199e80620000fa6000396000f3fe608060405234801561001057600080fd5b506004361061016c5760003560e01c8063876ed5cb116100cd578063d0f8934411610081578063e654b1fb11610066578063e654b1fb146102c0578063edcc4a45146102c9578063f722b41a146102dc57600080fd5b8063d0f89344146102b0578063e561dddc146102b857600080fd5b8063b8f77005116100b2578063b8f7700514610297578063ccf987c81461029f578063cfdf677e146102a857600080fd5b8063876ed5cb146102855780638d38c6c11461028e57600080fd5b80635ae6256d1161012457806378f4b2f21161010957806378f4b2f2146102645780637a167a8a1461026e5780637aa63a861461027d57600080fd5b80635ae6256d146102475780636fee07e01461024f57600080fd5b80632a7f18be116101555780632a7f18be146101d25780633789977014610216578063461a44781461023457600080fd5b80630b3dfa9714610171578063299ca4781461018d575b600080fd5b61017a60035481565b6040519081526020015b60405180910390f35b6000546101ad9073ffffffffffffffffffffffffffffffffffffffff1681565b60405173ffffffffffffffffffffffffffffffffffffffff9091168152602001610184565b6101e56101e03660046113e5565b6102e4565b604080518251815260208084015164ffffffffff908116918301919091529282015190921690820152606001610184565b61021e610362565b60405164ffffffffff9091168152602001610184565b6101ad6102423660046114c1565b610376565b61021e610423565b61026261025d366004611537565b610437565b005b61017a620186a081565b60055464ffffffffff1661021e565b61017a610899565b61017a61c35081565b61017a60045481565b60065461021e565b61017a60025481565b6101ad6108b4565b6102626108dc565b61017a610df8565b61017a60015481565b6102626102d73660046115a4565b610e7f565b61021e611016565b604080516060810182526000808252602082018190529181019190915260068281548110610314576103146115c6565b6000918252602091829020604080516060810182526002909302909101805483526001015464ffffffffff808216948401949094526501000000000090049092169181019190915292915050565b60008061036d611032565b50949350505050565b600080546040517fbf40fac100000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff9091169063bf40fac1906103cd908590600401611660565b60206040518083038186803b1580156103e557600080fd5b505afa1580156103f9573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061041d919061167a565b92915050565b60008061042e611032565b95945050505050565b61c350815111156104cf576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152603d60248201527f5472616e73616374696f6e20646174612073697a652065786365656473206d6160448201527f78696d756d20666f7220726f6c6c7570207472616e73616374696f6e2e00000060648201526084015b60405180910390fd5b600454821115610561576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152603d60248201527f5472616e73616374696f6e20676173206c696d69742065786365656473206d6160448201527f78696d756d20666f7220726f6c6c7570207472616e73616374696f6e2e00000060648201526084016104c6565b620186a08210156105f4576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602960248201527f5472616e73616374696f6e20676173206c696d697420746f6f206c6f7720746f60448201527f20656e71756575652e000000000000000000000000000000000000000000000060648201526084016104c6565b6003548211156106dc5760006002546003548461061191906116c6565b61061b91906116dd565b905060005a90508181116106b1576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602b60248201527f496e73756666696369656e742067617320666f72204c322072617465206c696d60448201527f6974696e67206275726e2e00000000000000000000000000000000000000000060648201526084016104c6565b60005b825a6106c090846116c6565b10156106d857806106d081611718565b9150506106b4565b5050505b6000333214156106ed575033610706565b5033731111000000000000000000000000000000001111015b60008185858560405160200161071f9493929190611751565b604080517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0818403018152828252805160209182012060608401835280845264ffffffffff42811692850192835243811693850193845260068054600181810183556000838152975160029092027ff652222313e28459528d920b65115c16c04f3efc82aaedc97be59f3f377c0d3f81019290925594517ff652222313e28459528d920b65115c16c04f3efc82aaedc97be59f3f377c0d4090910180549651841665010000000000027fffffffffffffffffffffffffffffffffffffffffffff0000000000000000000090971691909316179490941790559154919350610825916116c6565b9050808673ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff167f4b388aecf9fa6cc92253704e5975a6129a4f735bdbd99567df4ed0094ee4ceb58888426040516108899392919061179a565b60405180910390a4505050505050565b6000806108a4611032565b50505064ffffffffff1692915050565b60006108d760405180606001604052806021815260200161194860219139610376565b905090565b60043560d81c60093560e890811c90600c35901c6108f8610899565b8364ffffffffff161461098d576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152603d60248201527f41637475616c20626174636820737461727420696e64657820646f6573206e6f60448201527f74206d6174636820657870656374656420737461727420696e6465782e00000060648201526084016104c6565b6109cb6040518060400160405280600d81526020017f4f564d5f53657175656e63657200000000000000000000000000000000000000815250610376565b73ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff1614610a85576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602d60248201527f46756e6374696f6e2063616e206f6e6c792062652063616c6c6564206279207460448201527f68652053657175656e6365722e0000000000000000000000000000000000000060648201526084016104c6565b6000610a9762ffffff831660106117c3565b610aa290600f611800565b905064ffffffffff8116361015610b3b576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602260248201527f4e6f7420656e6f756768204261746368436f6e74657874732070726f7669646560448201527f642e00000000000000000000000000000000000000000000000000000000000060648201526084016104c6565b6005546040805160808101825260008082526020820181905291810182905260608101829052909164ffffffffff169060005b8562ffffff168163ffffffff161015610bcc576000610b928263ffffffff166110ed565b8051909350839150610ba49086611818565b9450826020015184610bb69190611840565b9350508080610bc490611860565b915050610b6e565b5060065464ffffffffff83161115610c8c576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152604260248201527f417474656d7074656420746f20617070656e64206d6f726520656c656d656e7460448201527f73207468616e2061726520617661696c61626c6520696e20746865207175657560648201527f652e000000000000000000000000000000000000000000000000000000000000608482015260a4016104c6565b6000610c9d8462ffffff8916611884565b63ffffffff169050600080836020015160001415610cc657505060408201516060830151610d37565b60006006610cd56001886118a9565b64ffffffffff1681548110610cec57610cec6115c6565b6000918252602091829020604080516060810182526002909302909101805483526001015464ffffffffff808216948401859052650100000000009091041691018190529093509150505b610d5b610d456001436116c6565b408a62ffffff168564ffffffffff168585611174565b7f602f1aeac0ca2e7a13e281a9ef0ad7838542712ce16780fa2ecffd351f05f899610d8684876118a9565b84610d8f610899565b6040805164ffffffffff94851681529390921660208401529082015260600160405180910390a15050600580547fffffffffffffffffffffffffffffffffffffffffffffffffffffff00000000001664ffffffffff949094169390931790925550505050505050565b6000610e026108b4565b73ffffffffffffffffffffffffffffffffffffffff16631f7b6d326040518163ffffffff1660e01b815260040160206040518083038186803b158015610e4757600080fd5b505afa158015610e5b573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906108d791906118c7565b60008054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16638da5cb5b6040518163ffffffff1660e01b815260040160206040518083038186803b158015610ee557600080fd5b505afa158015610ef9573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610f1d919061167a565b73ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff1614610fb1576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820181905260248201527f4f6e6c792063616c6c61626c6520627920746865204275726e2041646d696e2e60448201526064016104c6565b60018190556002829055610fc581836117c3565b60038190556002546001546040805192835260208301919091528101919091527fc6ed75e96b8b18b71edc1a6e82a9d677f8268c774a262c624eeb2cf0a8b3e07e9060600160405180910390a15050565b6005546006546000916108d79164ffffffffff909116906118a9565b60008060008060006110426108b4565b73ffffffffffffffffffffffffffffffffffffffff1663ccf8f9696040518163ffffffff1660e01b815260040160206040518083038186803b15801561108757600080fd5b505afa15801561109b573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906110bf91906118e0565b64ffffffffff602882901c811697605083901c82169750607883901c8216965060a09290921c169350915050565b6111186040518060800160405280600081526020016000815260200160008152602001600081525090565b60006111256010846117c3565b61113090600f611800565b60408051608081018252823560e890811c82526003840135901c6020820152600683013560d890811c92820192909252600b90920135901c60608201529392505050565b600061117e6108b4565b905060008061118b611032565b50509150915060006040518060a001604052808573ffffffffffffffffffffffffffffffffffffffff16631f7b6d326040518163ffffffff1660e01b815260040160206040518083038186803b1580156111e457600080fd5b505afa1580156111f8573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061121c91906118c7565b81526020018a81526020018981526020018464ffffffffff16815260200160405180602001604052806000815250815250905080600001517f127186556e7be68c7e31263195225b4de02820707889540969f62c05cf73525e82602001518360400151846060015185608001516040516112999493929190611922565b60405180910390a260006112ac8261139f565b905060006112e78360400151866112c39190611840565b6112cd8b87611840565b602890811b9190911760508b901b1760788a901b17901b90565b6040517f2015276c000000000000000000000000000000000000000000000000000000008152600481018490527fffffffffffffffffffffffffffffffffffffffffffffffffffffff00000000008216602482015290915073ffffffffffffffffffffffffffffffffffffffff871690632015276c90604401600060405180830381600087803b15801561137a57600080fd5b505af115801561138e573d6000803e3d6000fd5b505050505050505050505050505050565b600081602001518260400151836060015184608001516040516020016113c89493929190611922565b604051602081830303815290604052805190602001209050919050565b6000602082840312156113f757600080fd5b5035919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b600067ffffffffffffffff80841115611448576114486113fe565b604051601f85017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0908116603f0116810190828211818310171561148e5761148e6113fe565b816040528093508581528686860111156114a757600080fd5b858560208301376000602087830101525050509392505050565b6000602082840312156114d357600080fd5b813567ffffffffffffffff8111156114ea57600080fd5b8201601f810184136114fb57600080fd5b61150a8482356020840161142d565b949350505050565b73ffffffffffffffffffffffffffffffffffffffff8116811461153457600080fd5b50565b60008060006060848603121561154c57600080fd5b833561155781611512565b925060208401359150604084013567ffffffffffffffff81111561157a57600080fd5b8401601f8101861361158b57600080fd5b61159a8682356020840161142d565b9150509250925092565b600080604083850312156115b757600080fd5b50508035926020909101359150565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b6000815180845260005b8181101561161b576020818501810151868301820152016115ff565b8181111561162d576000602083870101525b50601f017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0169290920160200192915050565b60208152600061167360208301846115f5565b9392505050565b60006020828403121561168c57600080fd5b815161167381611512565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b6000828210156116d8576116d8611697565b500390565b600082611713577f4e487b7100000000000000000000000000000000000000000000000000000000600052601260045260246000fd5b500490565b60007fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff82141561174a5761174a611697565b5060010190565b600073ffffffffffffffffffffffffffffffffffffffff80871683528086166020840152508360408301526080606083015261179060808301846115f5565b9695505050505050565b8381526060602082015260006117b360608301856115f5565b9050826040830152949350505050565b6000817fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff04831182151516156117fb576117fb611697565b500290565b6000821982111561181357611813611697565b500190565b600063ffffffff80831681851680830382111561183757611837611697565b01949350505050565b600064ffffffffff80831681851680830382111561183757611837611697565b600063ffffffff8083168181141561187a5761187a611697565b6001019392505050565b600063ffffffff838116908316818110156118a1576118a1611697565b039392505050565b600064ffffffffff838116908316818110156118a1576118a1611697565b6000602082840312156118d957600080fd5b5051919050565b6000602082840312156118f257600080fd5b81517fffffffffffffffffffffffffffffffffffffffffffffffffffffff00000000008116811461167357600080fd5b84815283602082015282604082015260806060820152600061179060808301846115f556fe436861696e53746f72616765436f6e7461696e65722d4354432d62617463686573a264697066735822122071f9046c41835cfaa3b888bb4aa8b907bdd46588ad69741847a96bf3fcaad90264736f6c63430008090033", -} - -// CanonicalTransactionChainABI is the input ABI used to generate the binding from. -// Deprecated: Use CanonicalTransactionChainMetaData.ABI instead. -var CanonicalTransactionChainABI = CanonicalTransactionChainMetaData.ABI - -// CanonicalTransactionChainBin is the compiled bytecode used for deploying new contracts. -// Deprecated: Use CanonicalTransactionChainMetaData.Bin instead. -var CanonicalTransactionChainBin = CanonicalTransactionChainMetaData.Bin - -// DeployCanonicalTransactionChain deploys a new Ethereum contract, binding an instance of CanonicalTransactionChain to it. -func DeployCanonicalTransactionChain(auth *bind.TransactOpts, backend bind.ContractBackend, _libAddressManager common.Address, _maxTransactionGasLimit *big.Int, _l2GasDiscountDivisor *big.Int, _enqueueGasCost *big.Int) (common.Address, *types.Transaction, *CanonicalTransactionChain, error) { - parsed, err := CanonicalTransactionChainMetaData.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(CanonicalTransactionChainBin), backend, _libAddressManager, _maxTransactionGasLimit, _l2GasDiscountDivisor, _enqueueGasCost) - if err != nil { - return common.Address{}, nil, nil, err - } - return address, tx, &CanonicalTransactionChain{CanonicalTransactionChainCaller: CanonicalTransactionChainCaller{contract: contract}, CanonicalTransactionChainTransactor: CanonicalTransactionChainTransactor{contract: contract}, CanonicalTransactionChainFilterer: CanonicalTransactionChainFilterer{contract: contract}}, nil -} - -// CanonicalTransactionChain is an auto generated Go binding around an Ethereum contract. -type CanonicalTransactionChain struct { - CanonicalTransactionChainCaller // Read-only binding to the contract - CanonicalTransactionChainTransactor // Write-only binding to the contract - CanonicalTransactionChainFilterer // Log filterer for contract events -} - -// CanonicalTransactionChainCaller is an auto generated read-only Go binding around an Ethereum contract. -type CanonicalTransactionChainCaller struct { - contract *bind.BoundContract // Generic contract wrapper for the low level calls -} - -// CanonicalTransactionChainTransactor is an auto generated write-only Go binding around an Ethereum contract. -type CanonicalTransactionChainTransactor struct { - contract *bind.BoundContract // Generic contract wrapper for the low level calls -} - -// CanonicalTransactionChainFilterer is an auto generated log filtering Go binding around an Ethereum contract events. -type CanonicalTransactionChainFilterer struct { - contract *bind.BoundContract // Generic contract wrapper for the low level calls -} - -// CanonicalTransactionChainSession is an auto generated Go binding around an Ethereum contract, -// with pre-set call and transact options. -type CanonicalTransactionChainSession struct { - Contract *CanonicalTransactionChain // 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 -} - -// CanonicalTransactionChainCallerSession is an auto generated read-only Go binding around an Ethereum contract, -// with pre-set call options. -type CanonicalTransactionChainCallerSession struct { - Contract *CanonicalTransactionChainCaller // Generic contract caller binding to set the session for - CallOpts bind.CallOpts // Call options to use throughout this session -} - -// CanonicalTransactionChainTransactorSession is an auto generated write-only Go binding around an Ethereum contract, -// with pre-set transact options. -type CanonicalTransactionChainTransactorSession struct { - Contract *CanonicalTransactionChainTransactor // Generic contract transactor binding to set the session for - TransactOpts bind.TransactOpts // Transaction auth options to use throughout this session -} - -// CanonicalTransactionChainRaw is an auto generated low-level Go binding around an Ethereum contract. -type CanonicalTransactionChainRaw struct { - Contract *CanonicalTransactionChain // Generic contract binding to access the raw methods on -} - -// CanonicalTransactionChainCallerRaw is an auto generated low-level read-only Go binding around an Ethereum contract. -type CanonicalTransactionChainCallerRaw struct { - Contract *CanonicalTransactionChainCaller // Generic read-only contract binding to access the raw methods on -} - -// CanonicalTransactionChainTransactorRaw is an auto generated low-level write-only Go binding around an Ethereum contract. -type CanonicalTransactionChainTransactorRaw struct { - Contract *CanonicalTransactionChainTransactor // Generic write-only contract binding to access the raw methods on -} - -// NewCanonicalTransactionChain creates a new instance of CanonicalTransactionChain, bound to a specific deployed contract. -func NewCanonicalTransactionChain(address common.Address, backend bind.ContractBackend) (*CanonicalTransactionChain, error) { - contract, err := bindCanonicalTransactionChain(address, backend, backend, backend) - if err != nil { - return nil, err - } - return &CanonicalTransactionChain{CanonicalTransactionChainCaller: CanonicalTransactionChainCaller{contract: contract}, CanonicalTransactionChainTransactor: CanonicalTransactionChainTransactor{contract: contract}, CanonicalTransactionChainFilterer: CanonicalTransactionChainFilterer{contract: contract}}, nil -} - -// NewCanonicalTransactionChainCaller creates a new read-only instance of CanonicalTransactionChain, bound to a specific deployed contract. -func NewCanonicalTransactionChainCaller(address common.Address, caller bind.ContractCaller) (*CanonicalTransactionChainCaller, error) { - contract, err := bindCanonicalTransactionChain(address, caller, nil, nil) - if err != nil { - return nil, err - } - return &CanonicalTransactionChainCaller{contract: contract}, nil -} - -// NewCanonicalTransactionChainTransactor creates a new write-only instance of CanonicalTransactionChain, bound to a specific deployed contract. -func NewCanonicalTransactionChainTransactor(address common.Address, transactor bind.ContractTransactor) (*CanonicalTransactionChainTransactor, error) { - contract, err := bindCanonicalTransactionChain(address, nil, transactor, nil) - if err != nil { - return nil, err - } - return &CanonicalTransactionChainTransactor{contract: contract}, nil -} - -// NewCanonicalTransactionChainFilterer creates a new log filterer instance of CanonicalTransactionChain, bound to a specific deployed contract. -func NewCanonicalTransactionChainFilterer(address common.Address, filterer bind.ContractFilterer) (*CanonicalTransactionChainFilterer, error) { - contract, err := bindCanonicalTransactionChain(address, nil, nil, filterer) - if err != nil { - return nil, err - } - return &CanonicalTransactionChainFilterer{contract: contract}, nil -} - -// bindCanonicalTransactionChain binds a generic wrapper to an already deployed contract. -func bindCanonicalTransactionChain(address common.Address, caller bind.ContractCaller, transactor bind.ContractTransactor, filterer bind.ContractFilterer) (*bind.BoundContract, error) { - parsed, err := abi.JSON(strings.NewReader(CanonicalTransactionChainABI)) - 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 (_CanonicalTransactionChain *CanonicalTransactionChainRaw) Call(opts *bind.CallOpts, result *[]interface{}, method string, params ...interface{}) error { - return _CanonicalTransactionChain.Contract.CanonicalTransactionChainCaller.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 (_CanonicalTransactionChain *CanonicalTransactionChainRaw) Transfer(opts *bind.TransactOpts) (*types.Transaction, error) { - return _CanonicalTransactionChain.Contract.CanonicalTransactionChainTransactor.contract.Transfer(opts) -} - -// Transact invokes the (paid) contract method with params as input values. -func (_CanonicalTransactionChain *CanonicalTransactionChainRaw) Transact(opts *bind.TransactOpts, method string, params ...interface{}) (*types.Transaction, error) { - return _CanonicalTransactionChain.Contract.CanonicalTransactionChainTransactor.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 (_CanonicalTransactionChain *CanonicalTransactionChainCallerRaw) Call(opts *bind.CallOpts, result *[]interface{}, method string, params ...interface{}) error { - return _CanonicalTransactionChain.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 (_CanonicalTransactionChain *CanonicalTransactionChainTransactorRaw) Transfer(opts *bind.TransactOpts) (*types.Transaction, error) { - return _CanonicalTransactionChain.Contract.contract.Transfer(opts) -} - -// Transact invokes the (paid) contract method with params as input values. -func (_CanonicalTransactionChain *CanonicalTransactionChainTransactorRaw) Transact(opts *bind.TransactOpts, method string, params ...interface{}) (*types.Transaction, error) { - return _CanonicalTransactionChain.Contract.contract.Transact(opts, method, params...) -} - -// MAXROLLUPTXSIZE is a free data retrieval call binding the contract method 0x876ed5cb. -// -// Solidity: function MAX_ROLLUP_TX_SIZE() view returns(uint256) -func (_CanonicalTransactionChain *CanonicalTransactionChainCaller) MAXROLLUPTXSIZE(opts *bind.CallOpts) (*big.Int, error) { - var out []interface{} - err := _CanonicalTransactionChain.contract.Call(opts, &out, "MAX_ROLLUP_TX_SIZE") - - if err != nil { - return *new(*big.Int), err - } - - out0 := *abi.ConvertType(out[0], new(*big.Int)).(**big.Int) - - return out0, err - -} - -// MAXROLLUPTXSIZE is a free data retrieval call binding the contract method 0x876ed5cb. -// -// Solidity: function MAX_ROLLUP_TX_SIZE() view returns(uint256) -func (_CanonicalTransactionChain *CanonicalTransactionChainSession) MAXROLLUPTXSIZE() (*big.Int, error) { - return _CanonicalTransactionChain.Contract.MAXROLLUPTXSIZE(&_CanonicalTransactionChain.CallOpts) -} - -// MAXROLLUPTXSIZE is a free data retrieval call binding the contract method 0x876ed5cb. -// -// Solidity: function MAX_ROLLUP_TX_SIZE() view returns(uint256) -func (_CanonicalTransactionChain *CanonicalTransactionChainCallerSession) MAXROLLUPTXSIZE() (*big.Int, error) { - return _CanonicalTransactionChain.Contract.MAXROLLUPTXSIZE(&_CanonicalTransactionChain.CallOpts) -} - -// MINROLLUPTXGAS is a free data retrieval call binding the contract method 0x78f4b2f2. -// -// Solidity: function MIN_ROLLUP_TX_GAS() view returns(uint256) -func (_CanonicalTransactionChain *CanonicalTransactionChainCaller) MINROLLUPTXGAS(opts *bind.CallOpts) (*big.Int, error) { - var out []interface{} - err := _CanonicalTransactionChain.contract.Call(opts, &out, "MIN_ROLLUP_TX_GAS") - - if err != nil { - return *new(*big.Int), err - } - - out0 := *abi.ConvertType(out[0], new(*big.Int)).(**big.Int) - - return out0, err - -} - -// MINROLLUPTXGAS is a free data retrieval call binding the contract method 0x78f4b2f2. -// -// Solidity: function MIN_ROLLUP_TX_GAS() view returns(uint256) -func (_CanonicalTransactionChain *CanonicalTransactionChainSession) MINROLLUPTXGAS() (*big.Int, error) { - return _CanonicalTransactionChain.Contract.MINROLLUPTXGAS(&_CanonicalTransactionChain.CallOpts) -} - -// MINROLLUPTXGAS is a free data retrieval call binding the contract method 0x78f4b2f2. -// -// Solidity: function MIN_ROLLUP_TX_GAS() view returns(uint256) -func (_CanonicalTransactionChain *CanonicalTransactionChainCallerSession) MINROLLUPTXGAS() (*big.Int, error) { - return _CanonicalTransactionChain.Contract.MINROLLUPTXGAS(&_CanonicalTransactionChain.CallOpts) -} - -// Batches is a free data retrieval call binding the contract method 0xcfdf677e. -// -// Solidity: function batches() view returns(address) -func (_CanonicalTransactionChain *CanonicalTransactionChainCaller) Batches(opts *bind.CallOpts) (common.Address, error) { - var out []interface{} - err := _CanonicalTransactionChain.contract.Call(opts, &out, "batches") - - if err != nil { - return *new(common.Address), err - } - - out0 := *abi.ConvertType(out[0], new(common.Address)).(*common.Address) - - return out0, err - -} - -// Batches is a free data retrieval call binding the contract method 0xcfdf677e. -// -// Solidity: function batches() view returns(address) -func (_CanonicalTransactionChain *CanonicalTransactionChainSession) Batches() (common.Address, error) { - return _CanonicalTransactionChain.Contract.Batches(&_CanonicalTransactionChain.CallOpts) -} - -// Batches is a free data retrieval call binding the contract method 0xcfdf677e. -// -// Solidity: function batches() view returns(address) -func (_CanonicalTransactionChain *CanonicalTransactionChainCallerSession) Batches() (common.Address, error) { - return _CanonicalTransactionChain.Contract.Batches(&_CanonicalTransactionChain.CallOpts) -} - -// EnqueueGasCost is a free data retrieval call binding the contract method 0xe654b1fb. -// -// Solidity: function enqueueGasCost() view returns(uint256) -func (_CanonicalTransactionChain *CanonicalTransactionChainCaller) EnqueueGasCost(opts *bind.CallOpts) (*big.Int, error) { - var out []interface{} - err := _CanonicalTransactionChain.contract.Call(opts, &out, "enqueueGasCost") - - if err != nil { - return *new(*big.Int), err - } - - out0 := *abi.ConvertType(out[0], new(*big.Int)).(**big.Int) - - return out0, err - -} - -// EnqueueGasCost is a free data retrieval call binding the contract method 0xe654b1fb. -// -// Solidity: function enqueueGasCost() view returns(uint256) -func (_CanonicalTransactionChain *CanonicalTransactionChainSession) EnqueueGasCost() (*big.Int, error) { - return _CanonicalTransactionChain.Contract.EnqueueGasCost(&_CanonicalTransactionChain.CallOpts) -} - -// EnqueueGasCost is a free data retrieval call binding the contract method 0xe654b1fb. -// -// Solidity: function enqueueGasCost() view returns(uint256) -func (_CanonicalTransactionChain *CanonicalTransactionChainCallerSession) EnqueueGasCost() (*big.Int, error) { - return _CanonicalTransactionChain.Contract.EnqueueGasCost(&_CanonicalTransactionChain.CallOpts) -} - -// EnqueueL2GasPrepaid is a free data retrieval call binding the contract method 0x0b3dfa97. -// -// Solidity: function enqueueL2GasPrepaid() view returns(uint256) -func (_CanonicalTransactionChain *CanonicalTransactionChainCaller) EnqueueL2GasPrepaid(opts *bind.CallOpts) (*big.Int, error) { - var out []interface{} - err := _CanonicalTransactionChain.contract.Call(opts, &out, "enqueueL2GasPrepaid") - - if err != nil { - return *new(*big.Int), err - } - - out0 := *abi.ConvertType(out[0], new(*big.Int)).(**big.Int) - - return out0, err - -} - -// EnqueueL2GasPrepaid is a free data retrieval call binding the contract method 0x0b3dfa97. -// -// Solidity: function enqueueL2GasPrepaid() view returns(uint256) -func (_CanonicalTransactionChain *CanonicalTransactionChainSession) EnqueueL2GasPrepaid() (*big.Int, error) { - return _CanonicalTransactionChain.Contract.EnqueueL2GasPrepaid(&_CanonicalTransactionChain.CallOpts) -} - -// EnqueueL2GasPrepaid is a free data retrieval call binding the contract method 0x0b3dfa97. -// -// Solidity: function enqueueL2GasPrepaid() view returns(uint256) -func (_CanonicalTransactionChain *CanonicalTransactionChainCallerSession) EnqueueL2GasPrepaid() (*big.Int, error) { - return _CanonicalTransactionChain.Contract.EnqueueL2GasPrepaid(&_CanonicalTransactionChain.CallOpts) -} - -// GetLastBlockNumber is a free data retrieval call binding the contract method 0x5ae6256d. -// -// Solidity: function getLastBlockNumber() view returns(uint40) -func (_CanonicalTransactionChain *CanonicalTransactionChainCaller) GetLastBlockNumber(opts *bind.CallOpts) (*big.Int, error) { - var out []interface{} - err := _CanonicalTransactionChain.contract.Call(opts, &out, "getLastBlockNumber") - - if err != nil { - return *new(*big.Int), err - } - - out0 := *abi.ConvertType(out[0], new(*big.Int)).(**big.Int) - - return out0, err - -} - -// GetLastBlockNumber is a free data retrieval call binding the contract method 0x5ae6256d. -// -// Solidity: function getLastBlockNumber() view returns(uint40) -func (_CanonicalTransactionChain *CanonicalTransactionChainSession) GetLastBlockNumber() (*big.Int, error) { - return _CanonicalTransactionChain.Contract.GetLastBlockNumber(&_CanonicalTransactionChain.CallOpts) -} - -// GetLastBlockNumber is a free data retrieval call binding the contract method 0x5ae6256d. -// -// Solidity: function getLastBlockNumber() view returns(uint40) -func (_CanonicalTransactionChain *CanonicalTransactionChainCallerSession) GetLastBlockNumber() (*big.Int, error) { - return _CanonicalTransactionChain.Contract.GetLastBlockNumber(&_CanonicalTransactionChain.CallOpts) -} - -// GetLastTimestamp is a free data retrieval call binding the contract method 0x37899770. -// -// Solidity: function getLastTimestamp() view returns(uint40) -func (_CanonicalTransactionChain *CanonicalTransactionChainCaller) GetLastTimestamp(opts *bind.CallOpts) (*big.Int, error) { - var out []interface{} - err := _CanonicalTransactionChain.contract.Call(opts, &out, "getLastTimestamp") - - if err != nil { - return *new(*big.Int), err - } - - out0 := *abi.ConvertType(out[0], new(*big.Int)).(**big.Int) - - return out0, err - -} - -// GetLastTimestamp is a free data retrieval call binding the contract method 0x37899770. -// -// Solidity: function getLastTimestamp() view returns(uint40) -func (_CanonicalTransactionChain *CanonicalTransactionChainSession) GetLastTimestamp() (*big.Int, error) { - return _CanonicalTransactionChain.Contract.GetLastTimestamp(&_CanonicalTransactionChain.CallOpts) -} - -// GetLastTimestamp is a free data retrieval call binding the contract method 0x37899770. -// -// Solidity: function getLastTimestamp() view returns(uint40) -func (_CanonicalTransactionChain *CanonicalTransactionChainCallerSession) GetLastTimestamp() (*big.Int, error) { - return _CanonicalTransactionChain.Contract.GetLastTimestamp(&_CanonicalTransactionChain.CallOpts) -} - -// GetNextQueueIndex is a free data retrieval call binding the contract method 0x7a167a8a. -// -// Solidity: function getNextQueueIndex() view returns(uint40) -func (_CanonicalTransactionChain *CanonicalTransactionChainCaller) GetNextQueueIndex(opts *bind.CallOpts) (*big.Int, error) { - var out []interface{} - err := _CanonicalTransactionChain.contract.Call(opts, &out, "getNextQueueIndex") - - if err != nil { - return *new(*big.Int), err - } - - out0 := *abi.ConvertType(out[0], new(*big.Int)).(**big.Int) - - return out0, err - -} - -// GetNextQueueIndex is a free data retrieval call binding the contract method 0x7a167a8a. -// -// Solidity: function getNextQueueIndex() view returns(uint40) -func (_CanonicalTransactionChain *CanonicalTransactionChainSession) GetNextQueueIndex() (*big.Int, error) { - return _CanonicalTransactionChain.Contract.GetNextQueueIndex(&_CanonicalTransactionChain.CallOpts) -} - -// GetNextQueueIndex is a free data retrieval call binding the contract method 0x7a167a8a. -// -// Solidity: function getNextQueueIndex() view returns(uint40) -func (_CanonicalTransactionChain *CanonicalTransactionChainCallerSession) GetNextQueueIndex() (*big.Int, error) { - return _CanonicalTransactionChain.Contract.GetNextQueueIndex(&_CanonicalTransactionChain.CallOpts) -} - -// GetNumPendingQueueElements is a free data retrieval call binding the contract method 0xf722b41a. -// -// Solidity: function getNumPendingQueueElements() view returns(uint40) -func (_CanonicalTransactionChain *CanonicalTransactionChainCaller) GetNumPendingQueueElements(opts *bind.CallOpts) (*big.Int, error) { - var out []interface{} - err := _CanonicalTransactionChain.contract.Call(opts, &out, "getNumPendingQueueElements") - - if err != nil { - return *new(*big.Int), err - } - - out0 := *abi.ConvertType(out[0], new(*big.Int)).(**big.Int) - - return out0, err - -} - -// GetNumPendingQueueElements is a free data retrieval call binding the contract method 0xf722b41a. -// -// Solidity: function getNumPendingQueueElements() view returns(uint40) -func (_CanonicalTransactionChain *CanonicalTransactionChainSession) GetNumPendingQueueElements() (*big.Int, error) { - return _CanonicalTransactionChain.Contract.GetNumPendingQueueElements(&_CanonicalTransactionChain.CallOpts) -} - -// GetNumPendingQueueElements is a free data retrieval call binding the contract method 0xf722b41a. -// -// Solidity: function getNumPendingQueueElements() view returns(uint40) -func (_CanonicalTransactionChain *CanonicalTransactionChainCallerSession) GetNumPendingQueueElements() (*big.Int, error) { - return _CanonicalTransactionChain.Contract.GetNumPendingQueueElements(&_CanonicalTransactionChain.CallOpts) -} - -// GetQueueElement is a free data retrieval call binding the contract method 0x2a7f18be. -// -// Solidity: function getQueueElement(uint256 _index) view returns((bytes32,uint40,uint40) _element) -func (_CanonicalTransactionChain *CanonicalTransactionChainCaller) GetQueueElement(opts *bind.CallOpts, _index *big.Int) (LibOVMCodecQueueElement, error) { - var out []interface{} - err := _CanonicalTransactionChain.contract.Call(opts, &out, "getQueueElement", _index) - - if err != nil { - return *new(LibOVMCodecQueueElement), err - } - - out0 := *abi.ConvertType(out[0], new(LibOVMCodecQueueElement)).(*LibOVMCodecQueueElement) - - return out0, err - -} - -// GetQueueElement is a free data retrieval call binding the contract method 0x2a7f18be. -// -// Solidity: function getQueueElement(uint256 _index) view returns((bytes32,uint40,uint40) _element) -func (_CanonicalTransactionChain *CanonicalTransactionChainSession) GetQueueElement(_index *big.Int) (LibOVMCodecQueueElement, error) { - return _CanonicalTransactionChain.Contract.GetQueueElement(&_CanonicalTransactionChain.CallOpts, _index) -} - -// GetQueueElement is a free data retrieval call binding the contract method 0x2a7f18be. -// -// Solidity: function getQueueElement(uint256 _index) view returns((bytes32,uint40,uint40) _element) -func (_CanonicalTransactionChain *CanonicalTransactionChainCallerSession) GetQueueElement(_index *big.Int) (LibOVMCodecQueueElement, error) { - return _CanonicalTransactionChain.Contract.GetQueueElement(&_CanonicalTransactionChain.CallOpts, _index) -} - -// GetQueueLength is a free data retrieval call binding the contract method 0xb8f77005. -// -// Solidity: function getQueueLength() view returns(uint40) -func (_CanonicalTransactionChain *CanonicalTransactionChainCaller) GetQueueLength(opts *bind.CallOpts) (*big.Int, error) { - var out []interface{} - err := _CanonicalTransactionChain.contract.Call(opts, &out, "getQueueLength") - - if err != nil { - return *new(*big.Int), err - } - - out0 := *abi.ConvertType(out[0], new(*big.Int)).(**big.Int) - - return out0, err - -} - -// GetQueueLength is a free data retrieval call binding the contract method 0xb8f77005. -// -// Solidity: function getQueueLength() view returns(uint40) -func (_CanonicalTransactionChain *CanonicalTransactionChainSession) GetQueueLength() (*big.Int, error) { - return _CanonicalTransactionChain.Contract.GetQueueLength(&_CanonicalTransactionChain.CallOpts) -} - -// GetQueueLength is a free data retrieval call binding the contract method 0xb8f77005. -// -// Solidity: function getQueueLength() view returns(uint40) -func (_CanonicalTransactionChain *CanonicalTransactionChainCallerSession) GetQueueLength() (*big.Int, error) { - return _CanonicalTransactionChain.Contract.GetQueueLength(&_CanonicalTransactionChain.CallOpts) -} - -// GetTotalBatches is a free data retrieval call binding the contract method 0xe561dddc. -// -// Solidity: function getTotalBatches() view returns(uint256 _totalBatches) -func (_CanonicalTransactionChain *CanonicalTransactionChainCaller) GetTotalBatches(opts *bind.CallOpts) (*big.Int, error) { - var out []interface{} - err := _CanonicalTransactionChain.contract.Call(opts, &out, "getTotalBatches") - - if err != nil { - return *new(*big.Int), err - } - - out0 := *abi.ConvertType(out[0], new(*big.Int)).(**big.Int) - - return out0, err - -} - -// GetTotalBatches is a free data retrieval call binding the contract method 0xe561dddc. -// -// Solidity: function getTotalBatches() view returns(uint256 _totalBatches) -func (_CanonicalTransactionChain *CanonicalTransactionChainSession) GetTotalBatches() (*big.Int, error) { - return _CanonicalTransactionChain.Contract.GetTotalBatches(&_CanonicalTransactionChain.CallOpts) -} - -// GetTotalBatches is a free data retrieval call binding the contract method 0xe561dddc. -// -// Solidity: function getTotalBatches() view returns(uint256 _totalBatches) -func (_CanonicalTransactionChain *CanonicalTransactionChainCallerSession) GetTotalBatches() (*big.Int, error) { - return _CanonicalTransactionChain.Contract.GetTotalBatches(&_CanonicalTransactionChain.CallOpts) -} - -// GetTotalElements is a free data retrieval call binding the contract method 0x7aa63a86. -// -// Solidity: function getTotalElements() view returns(uint256 _totalElements) -func (_CanonicalTransactionChain *CanonicalTransactionChainCaller) GetTotalElements(opts *bind.CallOpts) (*big.Int, error) { - var out []interface{} - err := _CanonicalTransactionChain.contract.Call(opts, &out, "getTotalElements") - - if err != nil { - return *new(*big.Int), err - } - - out0 := *abi.ConvertType(out[0], new(*big.Int)).(**big.Int) - - return out0, err - -} - -// GetTotalElements is a free data retrieval call binding the contract method 0x7aa63a86. -// -// Solidity: function getTotalElements() view returns(uint256 _totalElements) -func (_CanonicalTransactionChain *CanonicalTransactionChainSession) GetTotalElements() (*big.Int, error) { - return _CanonicalTransactionChain.Contract.GetTotalElements(&_CanonicalTransactionChain.CallOpts) -} - -// GetTotalElements is a free data retrieval call binding the contract method 0x7aa63a86. -// -// Solidity: function getTotalElements() view returns(uint256 _totalElements) -func (_CanonicalTransactionChain *CanonicalTransactionChainCallerSession) GetTotalElements() (*big.Int, error) { - return _CanonicalTransactionChain.Contract.GetTotalElements(&_CanonicalTransactionChain.CallOpts) -} - -// L2GasDiscountDivisor is a free data retrieval call binding the contract method 0xccf987c8. -// -// Solidity: function l2GasDiscountDivisor() view returns(uint256) -func (_CanonicalTransactionChain *CanonicalTransactionChainCaller) L2GasDiscountDivisor(opts *bind.CallOpts) (*big.Int, error) { - var out []interface{} - err := _CanonicalTransactionChain.contract.Call(opts, &out, "l2GasDiscountDivisor") - - if err != nil { - return *new(*big.Int), err - } - - out0 := *abi.ConvertType(out[0], new(*big.Int)).(**big.Int) - - return out0, err - -} - -// L2GasDiscountDivisor is a free data retrieval call binding the contract method 0xccf987c8. -// -// Solidity: function l2GasDiscountDivisor() view returns(uint256) -func (_CanonicalTransactionChain *CanonicalTransactionChainSession) L2GasDiscountDivisor() (*big.Int, error) { - return _CanonicalTransactionChain.Contract.L2GasDiscountDivisor(&_CanonicalTransactionChain.CallOpts) -} - -// L2GasDiscountDivisor is a free data retrieval call binding the contract method 0xccf987c8. -// -// Solidity: function l2GasDiscountDivisor() view returns(uint256) -func (_CanonicalTransactionChain *CanonicalTransactionChainCallerSession) L2GasDiscountDivisor() (*big.Int, error) { - return _CanonicalTransactionChain.Contract.L2GasDiscountDivisor(&_CanonicalTransactionChain.CallOpts) -} - -// LibAddressManager is a free data retrieval call binding the contract method 0x299ca478. -// -// Solidity: function libAddressManager() view returns(address) -func (_CanonicalTransactionChain *CanonicalTransactionChainCaller) LibAddressManager(opts *bind.CallOpts) (common.Address, error) { - var out []interface{} - err := _CanonicalTransactionChain.contract.Call(opts, &out, "libAddressManager") - - if err != nil { - return *new(common.Address), err - } - - out0 := *abi.ConvertType(out[0], new(common.Address)).(*common.Address) - - return out0, err - -} - -// LibAddressManager is a free data retrieval call binding the contract method 0x299ca478. -// -// Solidity: function libAddressManager() view returns(address) -func (_CanonicalTransactionChain *CanonicalTransactionChainSession) LibAddressManager() (common.Address, error) { - return _CanonicalTransactionChain.Contract.LibAddressManager(&_CanonicalTransactionChain.CallOpts) -} - -// LibAddressManager is a free data retrieval call binding the contract method 0x299ca478. -// -// Solidity: function libAddressManager() view returns(address) -func (_CanonicalTransactionChain *CanonicalTransactionChainCallerSession) LibAddressManager() (common.Address, error) { - return _CanonicalTransactionChain.Contract.LibAddressManager(&_CanonicalTransactionChain.CallOpts) -} - -// MaxTransactionGasLimit is a free data retrieval call binding the contract method 0x8d38c6c1. -// -// Solidity: function maxTransactionGasLimit() view returns(uint256) -func (_CanonicalTransactionChain *CanonicalTransactionChainCaller) MaxTransactionGasLimit(opts *bind.CallOpts) (*big.Int, error) { - var out []interface{} - err := _CanonicalTransactionChain.contract.Call(opts, &out, "maxTransactionGasLimit") - - if err != nil { - return *new(*big.Int), err - } - - out0 := *abi.ConvertType(out[0], new(*big.Int)).(**big.Int) - - return out0, err - -} - -// MaxTransactionGasLimit is a free data retrieval call binding the contract method 0x8d38c6c1. -// -// Solidity: function maxTransactionGasLimit() view returns(uint256) -func (_CanonicalTransactionChain *CanonicalTransactionChainSession) MaxTransactionGasLimit() (*big.Int, error) { - return _CanonicalTransactionChain.Contract.MaxTransactionGasLimit(&_CanonicalTransactionChain.CallOpts) -} - -// MaxTransactionGasLimit is a free data retrieval call binding the contract method 0x8d38c6c1. -// -// Solidity: function maxTransactionGasLimit() view returns(uint256) -func (_CanonicalTransactionChain *CanonicalTransactionChainCallerSession) MaxTransactionGasLimit() (*big.Int, error) { - return _CanonicalTransactionChain.Contract.MaxTransactionGasLimit(&_CanonicalTransactionChain.CallOpts) -} - -// Resolve is a free data retrieval call binding the contract method 0x461a4478. -// -// Solidity: function resolve(string _name) view returns(address) -func (_CanonicalTransactionChain *CanonicalTransactionChainCaller) Resolve(opts *bind.CallOpts, _name string) (common.Address, error) { - var out []interface{} - err := _CanonicalTransactionChain.contract.Call(opts, &out, "resolve", _name) - - if err != nil { - return *new(common.Address), err - } - - out0 := *abi.ConvertType(out[0], new(common.Address)).(*common.Address) - - return out0, err - -} - -// Resolve is a free data retrieval call binding the contract method 0x461a4478. -// -// Solidity: function resolve(string _name) view returns(address) -func (_CanonicalTransactionChain *CanonicalTransactionChainSession) Resolve(_name string) (common.Address, error) { - return _CanonicalTransactionChain.Contract.Resolve(&_CanonicalTransactionChain.CallOpts, _name) -} - -// Resolve is a free data retrieval call binding the contract method 0x461a4478. -// -// Solidity: function resolve(string _name) view returns(address) -func (_CanonicalTransactionChain *CanonicalTransactionChainCallerSession) Resolve(_name string) (common.Address, error) { - return _CanonicalTransactionChain.Contract.Resolve(&_CanonicalTransactionChain.CallOpts, _name) -} - -// AppendSequencerBatch is a paid mutator transaction binding the contract method 0xd0f89344. -// -// Solidity: function appendSequencerBatch() returns() -func (_CanonicalTransactionChain *CanonicalTransactionChainTransactor) AppendSequencerBatch(opts *bind.TransactOpts) (*types.Transaction, error) { - return _CanonicalTransactionChain.contract.Transact(opts, "appendSequencerBatch") -} - -// AppendSequencerBatch is a paid mutator transaction binding the contract method 0xd0f89344. -// -// Solidity: function appendSequencerBatch() returns() -func (_CanonicalTransactionChain *CanonicalTransactionChainSession) AppendSequencerBatch() (*types.Transaction, error) { - return _CanonicalTransactionChain.Contract.AppendSequencerBatch(&_CanonicalTransactionChain.TransactOpts) -} - -// AppendSequencerBatch is a paid mutator transaction binding the contract method 0xd0f89344. -// -// Solidity: function appendSequencerBatch() returns() -func (_CanonicalTransactionChain *CanonicalTransactionChainTransactorSession) AppendSequencerBatch() (*types.Transaction, error) { - return _CanonicalTransactionChain.Contract.AppendSequencerBatch(&_CanonicalTransactionChain.TransactOpts) -} - -// Enqueue is a paid mutator transaction binding the contract method 0x6fee07e0. -// -// Solidity: function enqueue(address _target, uint256 _gasLimit, bytes _data) returns() -func (_CanonicalTransactionChain *CanonicalTransactionChainTransactor) Enqueue(opts *bind.TransactOpts, _target common.Address, _gasLimit *big.Int, _data []byte) (*types.Transaction, error) { - return _CanonicalTransactionChain.contract.Transact(opts, "enqueue", _target, _gasLimit, _data) -} - -// Enqueue is a paid mutator transaction binding the contract method 0x6fee07e0. -// -// Solidity: function enqueue(address _target, uint256 _gasLimit, bytes _data) returns() -func (_CanonicalTransactionChain *CanonicalTransactionChainSession) Enqueue(_target common.Address, _gasLimit *big.Int, _data []byte) (*types.Transaction, error) { - return _CanonicalTransactionChain.Contract.Enqueue(&_CanonicalTransactionChain.TransactOpts, _target, _gasLimit, _data) -} - -// Enqueue is a paid mutator transaction binding the contract method 0x6fee07e0. -// -// Solidity: function enqueue(address _target, uint256 _gasLimit, bytes _data) returns() -func (_CanonicalTransactionChain *CanonicalTransactionChainTransactorSession) Enqueue(_target common.Address, _gasLimit *big.Int, _data []byte) (*types.Transaction, error) { - return _CanonicalTransactionChain.Contract.Enqueue(&_CanonicalTransactionChain.TransactOpts, _target, _gasLimit, _data) -} - -// SetGasParams is a paid mutator transaction binding the contract method 0xedcc4a45. -// -// Solidity: function setGasParams(uint256 _l2GasDiscountDivisor, uint256 _enqueueGasCost) returns() -func (_CanonicalTransactionChain *CanonicalTransactionChainTransactor) SetGasParams(opts *bind.TransactOpts, _l2GasDiscountDivisor *big.Int, _enqueueGasCost *big.Int) (*types.Transaction, error) { - return _CanonicalTransactionChain.contract.Transact(opts, "setGasParams", _l2GasDiscountDivisor, _enqueueGasCost) -} - -// SetGasParams is a paid mutator transaction binding the contract method 0xedcc4a45. -// -// Solidity: function setGasParams(uint256 _l2GasDiscountDivisor, uint256 _enqueueGasCost) returns() -func (_CanonicalTransactionChain *CanonicalTransactionChainSession) SetGasParams(_l2GasDiscountDivisor *big.Int, _enqueueGasCost *big.Int) (*types.Transaction, error) { - return _CanonicalTransactionChain.Contract.SetGasParams(&_CanonicalTransactionChain.TransactOpts, _l2GasDiscountDivisor, _enqueueGasCost) -} - -// SetGasParams is a paid mutator transaction binding the contract method 0xedcc4a45. -// -// Solidity: function setGasParams(uint256 _l2GasDiscountDivisor, uint256 _enqueueGasCost) returns() -func (_CanonicalTransactionChain *CanonicalTransactionChainTransactorSession) SetGasParams(_l2GasDiscountDivisor *big.Int, _enqueueGasCost *big.Int) (*types.Transaction, error) { - return _CanonicalTransactionChain.Contract.SetGasParams(&_CanonicalTransactionChain.TransactOpts, _l2GasDiscountDivisor, _enqueueGasCost) -} - -// CanonicalTransactionChainL2GasParamsUpdatedIterator is returned from FilterL2GasParamsUpdated and is used to iterate over the raw logs and unpacked data for L2GasParamsUpdated events raised by the CanonicalTransactionChain contract. -type CanonicalTransactionChainL2GasParamsUpdatedIterator struct { - Event *CanonicalTransactionChainL2GasParamsUpdated // 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 *CanonicalTransactionChainL2GasParamsUpdatedIterator) 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(CanonicalTransactionChainL2GasParamsUpdated) - 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(CanonicalTransactionChainL2GasParamsUpdated) - 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 *CanonicalTransactionChainL2GasParamsUpdatedIterator) Error() error { - return it.fail -} - -// Close terminates the iteration process, releasing any pending underlying -// resources. -func (it *CanonicalTransactionChainL2GasParamsUpdatedIterator) Close() error { - it.sub.Unsubscribe() - return nil -} - -// CanonicalTransactionChainL2GasParamsUpdated represents a L2GasParamsUpdated event raised by the CanonicalTransactionChain contract. -type CanonicalTransactionChainL2GasParamsUpdated struct { - L2GasDiscountDivisor *big.Int - EnqueueGasCost *big.Int - EnqueueL2GasPrepaid *big.Int - Raw types.Log // Blockchain specific contextual infos -} - -// FilterL2GasParamsUpdated is a free log retrieval operation binding the contract event 0xc6ed75e96b8b18b71edc1a6e82a9d677f8268c774a262c624eeb2cf0a8b3e07e. -// -// Solidity: event L2GasParamsUpdated(uint256 l2GasDiscountDivisor, uint256 enqueueGasCost, uint256 enqueueL2GasPrepaid) -func (_CanonicalTransactionChain *CanonicalTransactionChainFilterer) FilterL2GasParamsUpdated(opts *bind.FilterOpts) (*CanonicalTransactionChainL2GasParamsUpdatedIterator, error) { - - logs, sub, err := _CanonicalTransactionChain.contract.FilterLogs(opts, "L2GasParamsUpdated") - if err != nil { - return nil, err - } - return &CanonicalTransactionChainL2GasParamsUpdatedIterator{contract: _CanonicalTransactionChain.contract, event: "L2GasParamsUpdated", logs: logs, sub: sub}, nil -} - -// WatchL2GasParamsUpdated is a free log subscription operation binding the contract event 0xc6ed75e96b8b18b71edc1a6e82a9d677f8268c774a262c624eeb2cf0a8b3e07e. -// -// Solidity: event L2GasParamsUpdated(uint256 l2GasDiscountDivisor, uint256 enqueueGasCost, uint256 enqueueL2GasPrepaid) -func (_CanonicalTransactionChain *CanonicalTransactionChainFilterer) WatchL2GasParamsUpdated(opts *bind.WatchOpts, sink chan<- *CanonicalTransactionChainL2GasParamsUpdated) (event.Subscription, error) { - - logs, sub, err := _CanonicalTransactionChain.contract.WatchLogs(opts, "L2GasParamsUpdated") - 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(CanonicalTransactionChainL2GasParamsUpdated) - if err := _CanonicalTransactionChain.contract.UnpackLog(event, "L2GasParamsUpdated", 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 -} - -// ParseL2GasParamsUpdated is a log parse operation binding the contract event 0xc6ed75e96b8b18b71edc1a6e82a9d677f8268c774a262c624eeb2cf0a8b3e07e. -// -// Solidity: event L2GasParamsUpdated(uint256 l2GasDiscountDivisor, uint256 enqueueGasCost, uint256 enqueueL2GasPrepaid) -func (_CanonicalTransactionChain *CanonicalTransactionChainFilterer) ParseL2GasParamsUpdated(log types.Log) (*CanonicalTransactionChainL2GasParamsUpdated, error) { - event := new(CanonicalTransactionChainL2GasParamsUpdated) - if err := _CanonicalTransactionChain.contract.UnpackLog(event, "L2GasParamsUpdated", log); err != nil { - return nil, err - } - event.Raw = log - return event, nil -} - -// CanonicalTransactionChainQueueBatchAppendedIterator is returned from FilterQueueBatchAppended and is used to iterate over the raw logs and unpacked data for QueueBatchAppended events raised by the CanonicalTransactionChain contract. -type CanonicalTransactionChainQueueBatchAppendedIterator struct { - Event *CanonicalTransactionChainQueueBatchAppended // 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 *CanonicalTransactionChainQueueBatchAppendedIterator) 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(CanonicalTransactionChainQueueBatchAppended) - 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(CanonicalTransactionChainQueueBatchAppended) - 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 *CanonicalTransactionChainQueueBatchAppendedIterator) Error() error { - return it.fail -} - -// Close terminates the iteration process, releasing any pending underlying -// resources. -func (it *CanonicalTransactionChainQueueBatchAppendedIterator) Close() error { - it.sub.Unsubscribe() - return nil -} - -// CanonicalTransactionChainQueueBatchAppended represents a QueueBatchAppended event raised by the CanonicalTransactionChain contract. -type CanonicalTransactionChainQueueBatchAppended struct { - StartingQueueIndex *big.Int - NumQueueElements *big.Int - TotalElements *big.Int - Raw types.Log // Blockchain specific contextual infos -} - -// FilterQueueBatchAppended is a free log retrieval operation binding the contract event 0x64d7f508348c70dea42d5302a393987e4abc20e45954ab3f9d320207751956f0. -// -// Solidity: event QueueBatchAppended(uint256 _startingQueueIndex, uint256 _numQueueElements, uint256 _totalElements) -func (_CanonicalTransactionChain *CanonicalTransactionChainFilterer) FilterQueueBatchAppended(opts *bind.FilterOpts) (*CanonicalTransactionChainQueueBatchAppendedIterator, error) { - - logs, sub, err := _CanonicalTransactionChain.contract.FilterLogs(opts, "QueueBatchAppended") - if err != nil { - return nil, err - } - return &CanonicalTransactionChainQueueBatchAppendedIterator{contract: _CanonicalTransactionChain.contract, event: "QueueBatchAppended", logs: logs, sub: sub}, nil -} - -// WatchQueueBatchAppended is a free log subscription operation binding the contract event 0x64d7f508348c70dea42d5302a393987e4abc20e45954ab3f9d320207751956f0. -// -// Solidity: event QueueBatchAppended(uint256 _startingQueueIndex, uint256 _numQueueElements, uint256 _totalElements) -func (_CanonicalTransactionChain *CanonicalTransactionChainFilterer) WatchQueueBatchAppended(opts *bind.WatchOpts, sink chan<- *CanonicalTransactionChainQueueBatchAppended) (event.Subscription, error) { - - logs, sub, err := _CanonicalTransactionChain.contract.WatchLogs(opts, "QueueBatchAppended") - 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(CanonicalTransactionChainQueueBatchAppended) - if err := _CanonicalTransactionChain.contract.UnpackLog(event, "QueueBatchAppended", 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 -} - -// ParseQueueBatchAppended is a log parse operation binding the contract event 0x64d7f508348c70dea42d5302a393987e4abc20e45954ab3f9d320207751956f0. -// -// Solidity: event QueueBatchAppended(uint256 _startingQueueIndex, uint256 _numQueueElements, uint256 _totalElements) -func (_CanonicalTransactionChain *CanonicalTransactionChainFilterer) ParseQueueBatchAppended(log types.Log) (*CanonicalTransactionChainQueueBatchAppended, error) { - event := new(CanonicalTransactionChainQueueBatchAppended) - if err := _CanonicalTransactionChain.contract.UnpackLog(event, "QueueBatchAppended", log); err != nil { - return nil, err - } - event.Raw = log - return event, nil -} - -// CanonicalTransactionChainSequencerBatchAppendedIterator is returned from FilterSequencerBatchAppended and is used to iterate over the raw logs and unpacked data for SequencerBatchAppended events raised by the CanonicalTransactionChain contract. -type CanonicalTransactionChainSequencerBatchAppendedIterator struct { - Event *CanonicalTransactionChainSequencerBatchAppended // 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 *CanonicalTransactionChainSequencerBatchAppendedIterator) 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(CanonicalTransactionChainSequencerBatchAppended) - 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(CanonicalTransactionChainSequencerBatchAppended) - 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 *CanonicalTransactionChainSequencerBatchAppendedIterator) Error() error { - return it.fail -} - -// Close terminates the iteration process, releasing any pending underlying -// resources. -func (it *CanonicalTransactionChainSequencerBatchAppendedIterator) Close() error { - it.sub.Unsubscribe() - return nil -} - -// CanonicalTransactionChainSequencerBatchAppended represents a SequencerBatchAppended event raised by the CanonicalTransactionChain contract. -type CanonicalTransactionChainSequencerBatchAppended struct { - StartingQueueIndex *big.Int - NumQueueElements *big.Int - TotalElements *big.Int - Raw types.Log // Blockchain specific contextual infos -} - -// FilterSequencerBatchAppended is a free log retrieval operation binding the contract event 0x602f1aeac0ca2e7a13e281a9ef0ad7838542712ce16780fa2ecffd351f05f899. -// -// Solidity: event SequencerBatchAppended(uint256 _startingQueueIndex, uint256 _numQueueElements, uint256 _totalElements) -func (_CanonicalTransactionChain *CanonicalTransactionChainFilterer) FilterSequencerBatchAppended(opts *bind.FilterOpts) (*CanonicalTransactionChainSequencerBatchAppendedIterator, error) { - - logs, sub, err := _CanonicalTransactionChain.contract.FilterLogs(opts, "SequencerBatchAppended") - if err != nil { - return nil, err - } - return &CanonicalTransactionChainSequencerBatchAppendedIterator{contract: _CanonicalTransactionChain.contract, event: "SequencerBatchAppended", logs: logs, sub: sub}, nil -} - -// WatchSequencerBatchAppended is a free log subscription operation binding the contract event 0x602f1aeac0ca2e7a13e281a9ef0ad7838542712ce16780fa2ecffd351f05f899. -// -// Solidity: event SequencerBatchAppended(uint256 _startingQueueIndex, uint256 _numQueueElements, uint256 _totalElements) -func (_CanonicalTransactionChain *CanonicalTransactionChainFilterer) WatchSequencerBatchAppended(opts *bind.WatchOpts, sink chan<- *CanonicalTransactionChainSequencerBatchAppended) (event.Subscription, error) { - - logs, sub, err := _CanonicalTransactionChain.contract.WatchLogs(opts, "SequencerBatchAppended") - 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(CanonicalTransactionChainSequencerBatchAppended) - if err := _CanonicalTransactionChain.contract.UnpackLog(event, "SequencerBatchAppended", 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 -} - -// ParseSequencerBatchAppended is a log parse operation binding the contract event 0x602f1aeac0ca2e7a13e281a9ef0ad7838542712ce16780fa2ecffd351f05f899. -// -// Solidity: event SequencerBatchAppended(uint256 _startingQueueIndex, uint256 _numQueueElements, uint256 _totalElements) -func (_CanonicalTransactionChain *CanonicalTransactionChainFilterer) ParseSequencerBatchAppended(log types.Log) (*CanonicalTransactionChainSequencerBatchAppended, error) { - event := new(CanonicalTransactionChainSequencerBatchAppended) - if err := _CanonicalTransactionChain.contract.UnpackLog(event, "SequencerBatchAppended", log); err != nil { - return nil, err - } - event.Raw = log - return event, nil -} - -// CanonicalTransactionChainTransactionBatchAppendedIterator is returned from FilterTransactionBatchAppended and is used to iterate over the raw logs and unpacked data for TransactionBatchAppended events raised by the CanonicalTransactionChain contract. -type CanonicalTransactionChainTransactionBatchAppendedIterator struct { - Event *CanonicalTransactionChainTransactionBatchAppended // 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 *CanonicalTransactionChainTransactionBatchAppendedIterator) 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(CanonicalTransactionChainTransactionBatchAppended) - 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(CanonicalTransactionChainTransactionBatchAppended) - 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 *CanonicalTransactionChainTransactionBatchAppendedIterator) Error() error { - return it.fail -} - -// Close terminates the iteration process, releasing any pending underlying -// resources. -func (it *CanonicalTransactionChainTransactionBatchAppendedIterator) Close() error { - it.sub.Unsubscribe() - return nil -} - -// CanonicalTransactionChainTransactionBatchAppended represents a TransactionBatchAppended event raised by the CanonicalTransactionChain contract. -type CanonicalTransactionChainTransactionBatchAppended struct { - BatchIndex *big.Int - BatchRoot [32]byte - BatchSize *big.Int - PrevTotalElements *big.Int - ExtraData []byte - Raw types.Log // Blockchain specific contextual infos -} - -// FilterTransactionBatchAppended is a free log retrieval operation binding the contract event 0x127186556e7be68c7e31263195225b4de02820707889540969f62c05cf73525e. -// -// Solidity: event TransactionBatchAppended(uint256 indexed _batchIndex, bytes32 _batchRoot, uint256 _batchSize, uint256 _prevTotalElements, bytes _extraData) -func (_CanonicalTransactionChain *CanonicalTransactionChainFilterer) FilterTransactionBatchAppended(opts *bind.FilterOpts, _batchIndex []*big.Int) (*CanonicalTransactionChainTransactionBatchAppendedIterator, error) { - - var _batchIndexRule []interface{} - for _, _batchIndexItem := range _batchIndex { - _batchIndexRule = append(_batchIndexRule, _batchIndexItem) - } - - logs, sub, err := _CanonicalTransactionChain.contract.FilterLogs(opts, "TransactionBatchAppended", _batchIndexRule) - if err != nil { - return nil, err - } - return &CanonicalTransactionChainTransactionBatchAppendedIterator{contract: _CanonicalTransactionChain.contract, event: "TransactionBatchAppended", logs: logs, sub: sub}, nil -} - -// WatchTransactionBatchAppended is a free log subscription operation binding the contract event 0x127186556e7be68c7e31263195225b4de02820707889540969f62c05cf73525e. -// -// Solidity: event TransactionBatchAppended(uint256 indexed _batchIndex, bytes32 _batchRoot, uint256 _batchSize, uint256 _prevTotalElements, bytes _extraData) -func (_CanonicalTransactionChain *CanonicalTransactionChainFilterer) WatchTransactionBatchAppended(opts *bind.WatchOpts, sink chan<- *CanonicalTransactionChainTransactionBatchAppended, _batchIndex []*big.Int) (event.Subscription, error) { - - var _batchIndexRule []interface{} - for _, _batchIndexItem := range _batchIndex { - _batchIndexRule = append(_batchIndexRule, _batchIndexItem) - } - - logs, sub, err := _CanonicalTransactionChain.contract.WatchLogs(opts, "TransactionBatchAppended", _batchIndexRule) - 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(CanonicalTransactionChainTransactionBatchAppended) - if err := _CanonicalTransactionChain.contract.UnpackLog(event, "TransactionBatchAppended", 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 -} - -// ParseTransactionBatchAppended is a log parse operation binding the contract event 0x127186556e7be68c7e31263195225b4de02820707889540969f62c05cf73525e. -// -// Solidity: event TransactionBatchAppended(uint256 indexed _batchIndex, bytes32 _batchRoot, uint256 _batchSize, uint256 _prevTotalElements, bytes _extraData) -func (_CanonicalTransactionChain *CanonicalTransactionChainFilterer) ParseTransactionBatchAppended(log types.Log) (*CanonicalTransactionChainTransactionBatchAppended, error) { - event := new(CanonicalTransactionChainTransactionBatchAppended) - if err := _CanonicalTransactionChain.contract.UnpackLog(event, "TransactionBatchAppended", log); err != nil { - return nil, err - } - event.Raw = log - return event, nil -} - -// CanonicalTransactionChainTransactionEnqueuedIterator is returned from FilterTransactionEnqueued and is used to iterate over the raw logs and unpacked data for TransactionEnqueued events raised by the CanonicalTransactionChain contract. -type CanonicalTransactionChainTransactionEnqueuedIterator struct { - Event *CanonicalTransactionChainTransactionEnqueued // 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 *CanonicalTransactionChainTransactionEnqueuedIterator) 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(CanonicalTransactionChainTransactionEnqueued) - 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(CanonicalTransactionChainTransactionEnqueued) - 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 *CanonicalTransactionChainTransactionEnqueuedIterator) Error() error { - return it.fail -} - -// Close terminates the iteration process, releasing any pending underlying -// resources. -func (it *CanonicalTransactionChainTransactionEnqueuedIterator) Close() error { - it.sub.Unsubscribe() - return nil -} - -// CanonicalTransactionChainTransactionEnqueued represents a TransactionEnqueued event raised by the CanonicalTransactionChain contract. -type CanonicalTransactionChainTransactionEnqueued struct { - L1TxOrigin common.Address - Target common.Address - GasLimit *big.Int - Data []byte - QueueIndex *big.Int - Timestamp *big.Int - Raw types.Log // Blockchain specific contextual infos -} - -// FilterTransactionEnqueued is a free log retrieval operation binding the contract event 0x4b388aecf9fa6cc92253704e5975a6129a4f735bdbd99567df4ed0094ee4ceb5. -// -// Solidity: event TransactionEnqueued(address indexed _l1TxOrigin, address indexed _target, uint256 _gasLimit, bytes _data, uint256 indexed _queueIndex, uint256 _timestamp) -func (_CanonicalTransactionChain *CanonicalTransactionChainFilterer) FilterTransactionEnqueued(opts *bind.FilterOpts, _l1TxOrigin []common.Address, _target []common.Address, _queueIndex []*big.Int) (*CanonicalTransactionChainTransactionEnqueuedIterator, error) { - - var _l1TxOriginRule []interface{} - for _, _l1TxOriginItem := range _l1TxOrigin { - _l1TxOriginRule = append(_l1TxOriginRule, _l1TxOriginItem) - } - var _targetRule []interface{} - for _, _targetItem := range _target { - _targetRule = append(_targetRule, _targetItem) - } - - var _queueIndexRule []interface{} - for _, _queueIndexItem := range _queueIndex { - _queueIndexRule = append(_queueIndexRule, _queueIndexItem) - } - - logs, sub, err := _CanonicalTransactionChain.contract.FilterLogs(opts, "TransactionEnqueued", _l1TxOriginRule, _targetRule, _queueIndexRule) - if err != nil { - return nil, err - } - return &CanonicalTransactionChainTransactionEnqueuedIterator{contract: _CanonicalTransactionChain.contract, event: "TransactionEnqueued", logs: logs, sub: sub}, nil -} - -// WatchTransactionEnqueued is a free log subscription operation binding the contract event 0x4b388aecf9fa6cc92253704e5975a6129a4f735bdbd99567df4ed0094ee4ceb5. -// -// Solidity: event TransactionEnqueued(address indexed _l1TxOrigin, address indexed _target, uint256 _gasLimit, bytes _data, uint256 indexed _queueIndex, uint256 _timestamp) -func (_CanonicalTransactionChain *CanonicalTransactionChainFilterer) WatchTransactionEnqueued(opts *bind.WatchOpts, sink chan<- *CanonicalTransactionChainTransactionEnqueued, _l1TxOrigin []common.Address, _target []common.Address, _queueIndex []*big.Int) (event.Subscription, error) { - - var _l1TxOriginRule []interface{} - for _, _l1TxOriginItem := range _l1TxOrigin { - _l1TxOriginRule = append(_l1TxOriginRule, _l1TxOriginItem) - } - var _targetRule []interface{} - for _, _targetItem := range _target { - _targetRule = append(_targetRule, _targetItem) - } - - var _queueIndexRule []interface{} - for _, _queueIndexItem := range _queueIndex { - _queueIndexRule = append(_queueIndexRule, _queueIndexItem) - } - - logs, sub, err := _CanonicalTransactionChain.contract.WatchLogs(opts, "TransactionEnqueued", _l1TxOriginRule, _targetRule, _queueIndexRule) - 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(CanonicalTransactionChainTransactionEnqueued) - if err := _CanonicalTransactionChain.contract.UnpackLog(event, "TransactionEnqueued", 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 -} - -// ParseTransactionEnqueued is a log parse operation binding the contract event 0x4b388aecf9fa6cc92253704e5975a6129a4f735bdbd99567df4ed0094ee4ceb5. -// -// Solidity: event TransactionEnqueued(address indexed _l1TxOrigin, address indexed _target, uint256 _gasLimit, bytes _data, uint256 indexed _queueIndex, uint256 _timestamp) -func (_CanonicalTransactionChain *CanonicalTransactionChainFilterer) ParseTransactionEnqueued(log types.Log) (*CanonicalTransactionChainTransactionEnqueued, error) { - event := new(CanonicalTransactionChainTransactionEnqueued) - if err := _CanonicalTransactionChain.contract.UnpackLog(event, "TransactionEnqueued", log); err != nil { - return nil, err - } - event.Raw = log - return event, nil -} diff --git a/indexer/bindings/StateCommitmentChain.go b/indexer/bindings/StateCommitmentChain.go deleted file mode 100644 index 51e19e3a01d5..000000000000 --- a/indexer/bindings/StateCommitmentChain.go +++ /dev/null @@ -1,862 +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 -) - -// LibOVMCodecChainBatchHeader is an auto generated low-level Go binding around an user-defined struct. -type LibOVMCodecChainBatchHeader struct { - BatchIndex *big.Int - BatchRoot [32]byte - BatchSize *big.Int - PrevTotalElements *big.Int - ExtraData []byte -} - -// LibOVMCodecChainInclusionProof is an auto generated low-level Go binding around an user-defined struct. -type LibOVMCodecChainInclusionProof struct { - Index *big.Int - Siblings [][32]byte -} - -// StateCommitmentChainMetaData contains all meta data concerning the StateCommitmentChain contract. -var StateCommitmentChainMetaData = &bind.MetaData{ - ABI: "[{\"inputs\":[{\"internalType\":\"address\",\"name\":\"_libAddressManager\",\"type\":\"address\"},{\"internalType\":\"uint256\",\"name\":\"_fraudProofWindow\",\"type\":\"uint256\"},{\"internalType\":\"uint256\",\"name\":\"_sequencerPublishWindow\",\"type\":\"uint256\"}],\"stateMutability\":\"nonpayable\",\"type\":\"constructor\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"uint256\",\"name\":\"_batchIndex\",\"type\":\"uint256\"},{\"indexed\":false,\"internalType\":\"bytes32\",\"name\":\"_batchRoot\",\"type\":\"bytes32\"},{\"indexed\":false,\"internalType\":\"uint256\",\"name\":\"_batchSize\",\"type\":\"uint256\"},{\"indexed\":false,\"internalType\":\"uint256\",\"name\":\"_prevTotalElements\",\"type\":\"uint256\"},{\"indexed\":false,\"internalType\":\"bytes\",\"name\":\"_extraData\",\"type\":\"bytes\"}],\"name\":\"StateBatchAppended\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"uint256\",\"name\":\"_batchIndex\",\"type\":\"uint256\"},{\"indexed\":false,\"internalType\":\"bytes32\",\"name\":\"_batchRoot\",\"type\":\"bytes32\"}],\"name\":\"StateBatchDeleted\",\"type\":\"event\"},{\"inputs\":[],\"name\":\"FRAUD_PROOF_WINDOW\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"\",\"type\":\"uint256\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"SEQUENCER_PUBLISH_WINDOW\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"\",\"type\":\"uint256\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"bytes32[]\",\"name\":\"_batch\",\"type\":\"bytes32[]\"},{\"internalType\":\"uint256\",\"name\":\"_shouldStartAtElement\",\"type\":\"uint256\"}],\"name\":\"appendStateBatch\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"batches\",\"outputs\":[{\"internalType\":\"contractIChainStorageContainer\",\"name\":\"\",\"type\":\"address\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"components\":[{\"internalType\":\"uint256\",\"name\":\"batchIndex\",\"type\":\"uint256\"},{\"internalType\":\"bytes32\",\"name\":\"batchRoot\",\"type\":\"bytes32\"},{\"internalType\":\"uint256\",\"name\":\"batchSize\",\"type\":\"uint256\"},{\"internalType\":\"uint256\",\"name\":\"prevTotalElements\",\"type\":\"uint256\"},{\"internalType\":\"bytes\",\"name\":\"extraData\",\"type\":\"bytes\"}],\"internalType\":\"structLib_OVMCodec.ChainBatchHeader\",\"name\":\"_batchHeader\",\"type\":\"tuple\"}],\"name\":\"deleteStateBatch\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"getLastSequencerTimestamp\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"_lastSequencerTimestamp\",\"type\":\"uint256\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"getTotalBatches\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"_totalBatches\",\"type\":\"uint256\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"getTotalElements\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"_totalElements\",\"type\":\"uint256\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"components\":[{\"internalType\":\"uint256\",\"name\":\"batchIndex\",\"type\":\"uint256\"},{\"internalType\":\"bytes32\",\"name\":\"batchRoot\",\"type\":\"bytes32\"},{\"internalType\":\"uint256\",\"name\":\"batchSize\",\"type\":\"uint256\"},{\"internalType\":\"uint256\",\"name\":\"prevTotalElements\",\"type\":\"uint256\"},{\"internalType\":\"bytes\",\"name\":\"extraData\",\"type\":\"bytes\"}],\"internalType\":\"structLib_OVMCodec.ChainBatchHeader\",\"name\":\"_batchHeader\",\"type\":\"tuple\"}],\"name\":\"insideFraudProofWindow\",\"outputs\":[{\"internalType\":\"bool\",\"name\":\"_inside\",\"type\":\"bool\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"libAddressManager\",\"outputs\":[{\"internalType\":\"contractLib_AddressManager\",\"name\":\"\",\"type\":\"address\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"string\",\"name\":\"_name\",\"type\":\"string\"}],\"name\":\"resolve\",\"outputs\":[{\"internalType\":\"address\",\"name\":\"\",\"type\":\"address\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"bytes32\",\"name\":\"_element\",\"type\":\"bytes32\"},{\"components\":[{\"internalType\":\"uint256\",\"name\":\"batchIndex\",\"type\":\"uint256\"},{\"internalType\":\"bytes32\",\"name\":\"batchRoot\",\"type\":\"bytes32\"},{\"internalType\":\"uint256\",\"name\":\"batchSize\",\"type\":\"uint256\"},{\"internalType\":\"uint256\",\"name\":\"prevTotalElements\",\"type\":\"uint256\"},{\"internalType\":\"bytes\",\"name\":\"extraData\",\"type\":\"bytes\"}],\"internalType\":\"structLib_OVMCodec.ChainBatchHeader\",\"name\":\"_batchHeader\",\"type\":\"tuple\"},{\"components\":[{\"internalType\":\"uint256\",\"name\":\"index\",\"type\":\"uint256\"},{\"internalType\":\"bytes32[]\",\"name\":\"siblings\",\"type\":\"bytes32[]\"}],\"internalType\":\"structLib_OVMCodec.ChainInclusionProof\",\"name\":\"_proof\",\"type\":\"tuple\"}],\"name\":\"verifyStateCommitment\",\"outputs\":[{\"internalType\":\"bool\",\"name\":\"\",\"type\":\"bool\"}],\"stateMutability\":\"view\",\"type\":\"function\"}]", - Bin: "0x608060405234801561001057600080fd5b506040516120bb3803806120bb83398101604081905261002f9161005b565b600080546001600160a01b0319166001600160a01b03949094169390931790925560015560025561009e565b60008060006060848603121561007057600080fd5b83516001600160a01b038116811461008757600080fd5b602085015160409095015190969495509392505050565b61200e806100ad6000396000f3fe608060405234801561001057600080fd5b50600436106100d45760003560e01c80638ca5cbb911610081578063c17b291b1161005b578063c17b291b146101bb578063cfdf677e146101c4578063e561dddc146101cc57600080fd5b80638ca5cbb9146101805780639418bddd14610195578063b8e189ac146101a857600080fd5b80637aa63a86116100b25780637aa63a86146101595780637ad168a01461016f57806381eb62ef1461017757600080fd5b8063299ca478146100d9578063461a4478146101235780634d69ee5714610136575b600080fd5b6000546100f99073ffffffffffffffffffffffffffffffffffffffff1681565b60405173ffffffffffffffffffffffffffffffffffffffff90911681526020015b60405180910390f35b6100f9610131366004611a1b565b6101d4565b610149610144366004611b8d565b610281565b604051901515815260200161011a565b610161610350565b60405190815260200161011a565b610161610369565b61016160025481565b61019361018e366004611c4a565b610382565b005b6101496101a3366004611c8f565b61075c565b6101936101b6366004611c8f565b610804565b61016160015481565b6100f96109c0565b6101616109e8565b600080546040517fbf40fac100000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff9091169063bf40fac19061022b908590600401611d2f565b60206040518083038186803b15801561024357600080fd5b505afa158015610257573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061027b9190611d64565b92915050565b600061028c83610a6f565b6102dd5760405162461bcd60e51b815260206004820152601560248201527f496e76616c6964206261746368206865616465722e000000000000000000000060448201526064015b60405180910390fd5b6102fa836020015185846000015185602001518760400151610b31565b6103465760405162461bcd60e51b815260206004820152601860248201527f496e76616c696420696e636c7573696f6e2070726f6f662e000000000000000060448201526064016102d4565b5060019392505050565b60008061035b610d9f565b5064ffffffffff1692915050565b600080610374610d9f565b64ffffffffff169392505050565b61038a610350565b81146103fe5760405162461bcd60e51b815260206004820152603d60248201527f41637475616c20626174636820737461727420696e64657820646f6573206e6f60448201527f74206d6174636820657870656374656420737461727420696e6465782e00000060648201526084016102d4565b61043c6040518060400160405280600b81526020017f426f6e644d616e616765720000000000000000000000000000000000000000008152506101d4565b6040517f02ad4d2a00000000000000000000000000000000000000000000000000000000815233600482015273ffffffffffffffffffffffffffffffffffffffff91909116906302ad4d2a9060240160206040518083038186803b1580156104a357600080fd5b505afa1580156104b7573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906104db9190611d81565b61054d5760405162461bcd60e51b815260206004820152602f60248201527f50726f706f73657220646f6573206e6f74206861766520656e6f75676820636f60448201527f6c6c61746572616c20706f73746564000000000000000000000000000000000060648201526084016102d4565b60008251116105c45760405162461bcd60e51b815260206004820152602360248201527f43616e6e6f74207375626d697420616e20656d7074792073746174652062617460448201527f63682e000000000000000000000000000000000000000000000000000000000060648201526084016102d4565b6106026040518060400160405280601981526020017f43616e6f6e6963616c5472616e73616374696f6e436861696e000000000000008152506101d4565b73ffffffffffffffffffffffffffffffffffffffff16637aa63a866040518163ffffffff1660e01b815260040160206040518083038186803b15801561064757600080fd5b505afa15801561065b573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061067f9190611da3565b8251610689610350565b6106939190611deb565b111561072d5760405162461bcd60e51b815260206004820152604960248201527f4e756d626572206f6620737461746520726f6f74732063616e6e6f742065786360448201527f65656420746865206e756d626572206f662063616e6f6e6963616c207472616e60648201527f73616374696f6e732e0000000000000000000000000000000000000000000000608482015260a4016102d4565b6040805142602082015233818301528151808203830181526060909101909152610758908390610e43565b5050565b60008082608001518060200190518101906107779190611e03565b509050806107ed5760405162461bcd60e51b815260206004820152602560248201527f4261746368206865616465722074696d657374616d702063616e6e6f7420626560448201527f207a65726f00000000000000000000000000000000000000000000000000000060648201526084016102d4565b42600154826107fc9190611deb565b119392505050565b6108426040518060400160405280601181526020017f4f564d5f467261756456657269666965720000000000000000000000000000008152506101d4565b73ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff16146108e25760405162461bcd60e51b815260206004820152603b60248201527f537461746520626174636865732063616e206f6e6c792062652064656c65746560448201527f6420627920746865204f564d5f467261756456657269666965722e000000000060648201526084016102d4565b6108eb81610a6f565b6109375760405162461bcd60e51b815260206004820152601560248201527f496e76616c6964206261746368206865616465722e000000000000000000000060448201526064016102d4565b6109408161075c565b6109b4576040805162461bcd60e51b81526020600482015260248101919091527f537461746520626174636865732063616e206f6e6c792062652064656c65746560448201527f642077697468696e207468652066726175642070726f6f662077696e646f772e60648201526084016102d4565b6109bd816110e6565b50565b60006109e3604051806060016040528060218152602001611fb8602191396101d4565b905090565b60006109f26109c0565b73ffffffffffffffffffffffffffffffffffffffff16631f7b6d326040518163ffffffff1660e01b815260040160206040518083038186803b158015610a3757600080fd5b505afa158015610a4b573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906109e39190611da3565b6000610a796109c0565b82516040517f9507d39a00000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff9290921691639507d39a91610ad19160040190815260200190565b60206040518083038186803b158015610ae957600080fd5b505afa158015610afd573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610b219190611da3565b610b2a83611317565b1492915050565b6000808211610ba85760405162461bcd60e51b815260206004820152603760248201527f4c69625f4d65726b6c65547265653a20546f74616c206c6561766573206d757360448201527f742062652067726561746572207468616e207a65726f2e00000000000000000060648201526084016102d4565b818410610c1c5760405162461bcd60e51b8152602060048201526024808201527f4c69625f4d65726b6c65547265653a20496e646578206f7574206f6620626f7560448201527f6e64732e0000000000000000000000000000000000000000000000000000000060648201526084016102d4565b610c258261135d565b835114610cc05760405162461bcd60e51b815260206004820152604d60248201527f4c69625f4d65726b6c65547265653a20546f74616c207369626c696e6773206460448201527f6f6573206e6f7420636f72726563746c7920636f72726573706f6e6420746f2060648201527f746f74616c206c65617665732e00000000000000000000000000000000000000608482015260a4016102d4565b8460005b8451811015610d92578560011660011415610d2b57848181518110610ceb57610ceb611e33565b602002602001015182604051602001610d0e929190918252602082015260400190565b604051602081830303815290604052805190602001209150610d79565b81858281518110610d3e57610d3e611e33565b6020026020010151604051602001610d60929190918252602082015260400190565b6040516020818303038152906040528051906020012091505b60019590951c9480610d8a81611e62565b915050610cc4565b5090951495945050505050565b6000806000610dac6109c0565b73ffffffffffffffffffffffffffffffffffffffff1663ccf8f9696040518163ffffffff1660e01b815260040160206040518083038186803b158015610df157600080fd5b505afa158015610e05573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610e299190611e9b565b64ffffffffff602882901c169460509190911c9350915050565b6000610e836040518060400160405280600c81526020017f4f564d5f50726f706f73657200000000000000000000000000000000000000008152506101d4565b9050600080610e90610d9f565b90925090503373ffffffffffffffffffffffffffffffffffffffff84161415610eba575042610f69565b426002548264ffffffffff16610ed09190611deb565b10610f695760405162461bcd60e51b815260206004820152604360248201527f43616e6e6f74207075626c69736820737461746520726f6f747320776974686960448201527f6e207468652073657175656e636572207075626c69636174696f6e2077696e6460648201527f6f772e0000000000000000000000000000000000000000000000000000000000608482015260a4016102d4565b60006040518060a00160405280610f7e6109e8565b8152602001610f8c88611443565b8152602001875181526020018464ffffffffff16815260200186815250905080600001517f16be4c5129a4e03cf3350262e181dc02ddfb4a6008d925368c0899fcd97ca9c58260200151836040015184606001518560800151604051610ff59493929190611edd565b60405180910390a26110056109c0565b73ffffffffffffffffffffffffffffffffffffffff16632015276c61102983611317565b61104e846040015185606001516110409190611deb565b602887811b91909117901b90565b6040517fffffffff0000000000000000000000000000000000000000000000000000000060e085901b16815260048101929092527fffffffffffffffffffffffffffffffffffffffffffffffffffffff0000000000166024820152604401600060405180830381600087803b1580156110c657600080fd5b505af11580156110da573d6000803e3d6000fd5b50505050505050505050565b6110ee6109c0565b73ffffffffffffffffffffffffffffffffffffffff16631f7b6d326040518163ffffffff1660e01b815260040160206040518083038186803b15801561113357600080fd5b505afa158015611147573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061116b9190611da3565b8151106111ba5760405162461bcd60e51b815260206004820152601460248201527f496e76616c696420626174636820696e6465782e00000000000000000000000060448201526064016102d4565b6111c381610a6f565b61120f5760405162461bcd60e51b815260206004820152601560248201527f496e76616c6964206261746368206865616465722e000000000000000000000060448201526064016102d4565b6112176109c0565b8151606083015173ffffffffffffffffffffffffffffffffffffffff929092169163167fd681919060281b6040517fffffffff0000000000000000000000000000000000000000000000000000000060e085901b16815260048101929092527fffffffffffffffffffffffffffffffffffffffffffffffffffffff0000000000166024820152604401600060405180830381600087803b1580156112ba57600080fd5b505af11580156112ce573d6000803e3d6000fd5b5050505080600001517f8747b69ce8fdb31c3b9b0a67bd8049ad8c1a69ea417b69b12174068abd9cbd64826020015160405161130c91815260200190565b60405180910390a250565b600081602001518260400151836060015184608001516040516020016113409493929190611edd565b604051602081830303815290604052805190602001209050919050565b60008082116113d45760405162461bcd60e51b815260206004820152603060248201527f4c69625f4d65726b6c65547265653a2043616e6e6f7420636f6d70757465206360448201527f65696c286c6f675f3229206f6620302e0000000000000000000000000000000060648201526084016102d4565b81600114156113e557506000919050565b81600060805b600181106114235780611401600180831b611f0c565b901b83161561141b576114148183611deb565b92811c9291505b60011c6113eb565b506001811b841461143c57611439600182611deb565b90505b9392505050565b6000808251116114bb5760405162461bcd60e51b815260206004820152603460248201527f4c69625f4d65726b6c65547265653a204d7573742070726f766964652061742060448201527f6c65617374206f6e65206c65616620686173682e00000000000000000000000060648201526084016102d4565b8151600114156114e757816000815181106114d8576114d8611e33565b60200260200101519050919050565b60408051610200810182527f290decd9548b62a8d60345a988386fc84ba6bc95484008f6362f93160ef3e56381527f633dc4d7da7256660a892f8f1604a44b5432649cc8ec5cb3ced4c4e6ac94dd1d60208201527f890740a8eb06ce9be422cb8da5cdafc2b58c0a5e24036c578de2a433c828ff7d818301527f3b8ec09e026fdc305365dfc94e189a81b38c7597b3d941c279f042e8206e0bd86060808301919091527fecd50eee38e386bd62be9bedb990706951b65fe053bd9d8a521af753d139e2da60808301527fdefff6d330bb5403f63b14f33b578274160de3a50df4efecf0e0db73bcdd3da560a08301527f617bdd11f7c0a11f49db22f629387a12da7596f9d1704d7465177c63d88ec7d760c08301527f292c23a9aa1d8bea7e2435e555a4a60e379a5a35f3f452bae60121073fb6eead60e08301527fe1cea92ed99acdcb045a6726b2f87107e8a61620a232cf4d7d5b5766b3952e106101008301527f7ad66c0a68c72cb89e4fb4303841966e4062a76ab97451e3b9fb526a5ceb7f826101208301527fe026cc5a4aed3c22a58cbd3d2ac754c9352c5436f638042dca99034e836365166101408301527f3d04cffd8b46a874edf5cfae63077de85f849a660426697b06a829c70dd1409c6101608301527fad676aa337a485e4728a0b240d92b3ef7b3c372d06d189322bfd5f61f1e7203e6101808301527fa2fca4a49658f9fab7aa63289c91b7c7b6c832a6d0e69334ff5b0a3483d09dab6101a08301527f4ebfd9cd7bca2505f7bef59cc1c12ecc708fff26ae4af19abe852afe9e20c8626101c08301527f2def10d13dd169f550f578bda343d9717a138562e0093b380a1120789d53cf106101e083015282518381529081018352909160009190602082018180368337505085519192506000918291508180805b60018411156118fd57611798600285611f52565b91506117a5600285611f66565b600114905060005b82811015611851578a6117c1826002611f7a565b815181106117d1576117d1611e33565b602002602001015196508a8160026117e99190611f7a565b6117f4906001611deb565b8151811061180457611804611e33565b6020026020010151955086602089015285604089015287805190602001208b828151811061183457611834611e33565b60209081029190910101528061184981611e62565b9150506117ad565b5080156118cd5789611864600186611f0c565b8151811061187457611874611e33565b6020026020010151955087836010811061189057611890611e33565b602002015160001b945085602088015284604088015286805190602001208a83815181106118c0576118c0611e33565b6020026020010181815250505b806118d95760006118dc565b60015b6118e99060ff1683611deb565b9350826118f581611e62565b935050611784565b8960008151811061191057611910611e33565b602002602001015198505050505050505050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b604051601f82017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe016810167ffffffffffffffff8111828210171561199d5761199d611927565b604052919050565b600067ffffffffffffffff8311156119bf576119bf611927565b6119f060207fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0601f86011601611956565b9050828152838383011115611a0457600080fd5b828260208301376000602084830101529392505050565b600060208284031215611a2d57600080fd5b813567ffffffffffffffff811115611a4457600080fd5b8201601f81018413611a5557600080fd5b611a64848235602084016119a5565b949350505050565b600060a08284031215611a7e57600080fd5b60405160a0810167ffffffffffffffff8282108183111715611aa257611aa2611927565b81604052829350843583526020850135602084015260408501356040840152606085013560608401526080850135915080821115611adf57600080fd5b508301601f81018513611af157600080fd5b611b00858235602084016119a5565b6080830152505092915050565b600082601f830112611b1e57600080fd5b8135602067ffffffffffffffff821115611b3a57611b3a611927565b8160051b611b49828201611956565b9283528481018201928281019087851115611b6357600080fd5b83870192505b84831015611b8257823582529183019190830190611b69565b979650505050505050565b600080600060608486031215611ba257600080fd5b83359250602084013567ffffffffffffffff80821115611bc157600080fd5b611bcd87838801611a6c565b93506040860135915080821115611be357600080fd5b9085019060408288031215611bf757600080fd5b604051604081018181108382111715611c1257611c12611927565b60405282358152602083013582811115611c2b57600080fd5b611c3789828601611b0d565b6020830152508093505050509250925092565b60008060408385031215611c5d57600080fd5b823567ffffffffffffffff811115611c7457600080fd5b611c8085828601611b0d565b95602094909401359450505050565b600060208284031215611ca157600080fd5b813567ffffffffffffffff811115611cb857600080fd5b611a6484828501611a6c565b6000815180845260005b81811015611cea57602081850181015186830182015201611cce565b81811115611cfc576000602083870101525b50601f017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0169290920160200192915050565b60208152600061143c6020830184611cc4565b73ffffffffffffffffffffffffffffffffffffffff811681146109bd57600080fd5b600060208284031215611d7657600080fd5b815161143c81611d42565b600060208284031215611d9357600080fd5b8151801515811461143c57600080fd5b600060208284031215611db557600080fd5b5051919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b60008219821115611dfe57611dfe611dbc565b500190565b60008060408385031215611e1657600080fd5b825191506020830151611e2881611d42565b809150509250929050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b60007fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff821415611e9457611e94611dbc565b5060010190565b600060208284031215611ead57600080fd5b81517fffffffffffffffffffffffffffffffffffffffffffffffffffffff00000000008116811461143c57600080fd5b848152836020820152826040820152608060608201526000611f026080830184611cc4565b9695505050505050565b600082821015611f1e57611f1e611dbc565b500390565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601260045260246000fd5b600082611f6157611f61611f23565b500490565b600082611f7557611f75611f23565b500690565b6000817fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0483118215151615611fb257611fb2611dbc565b50029056fe436861696e53746f72616765436f6e7461696e65722d5343432d62617463686573a26469706673582212209fa13437d607d4f762adfcb0d6685a91847a6cbe7462977fd99188a01185f7b564736f6c63430008090033", -} - -// StateCommitmentChainABI is the input ABI used to generate the binding from. -// Deprecated: Use StateCommitmentChainMetaData.ABI instead. -var StateCommitmentChainABI = StateCommitmentChainMetaData.ABI - -// StateCommitmentChainBin is the compiled bytecode used for deploying new contracts. -// Deprecated: Use StateCommitmentChainMetaData.Bin instead. -var StateCommitmentChainBin = StateCommitmentChainMetaData.Bin - -// DeployStateCommitmentChain deploys a new Ethereum contract, binding an instance of StateCommitmentChain to it. -func DeployStateCommitmentChain(auth *bind.TransactOpts, backend bind.ContractBackend, _libAddressManager common.Address, _fraudProofWindow *big.Int, _sequencerPublishWindow *big.Int) (common.Address, *types.Transaction, *StateCommitmentChain, error) { - parsed, err := StateCommitmentChainMetaData.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(StateCommitmentChainBin), backend, _libAddressManager, _fraudProofWindow, _sequencerPublishWindow) - if err != nil { - return common.Address{}, nil, nil, err - } - return address, tx, &StateCommitmentChain{StateCommitmentChainCaller: StateCommitmentChainCaller{contract: contract}, StateCommitmentChainTransactor: StateCommitmentChainTransactor{contract: contract}, StateCommitmentChainFilterer: StateCommitmentChainFilterer{contract: contract}}, nil -} - -// StateCommitmentChain is an auto generated Go binding around an Ethereum contract. -type StateCommitmentChain struct { - StateCommitmentChainCaller // Read-only binding to the contract - StateCommitmentChainTransactor // Write-only binding to the contract - StateCommitmentChainFilterer // Log filterer for contract events -} - -// StateCommitmentChainCaller is an auto generated read-only Go binding around an Ethereum contract. -type StateCommitmentChainCaller struct { - contract *bind.BoundContract // Generic contract wrapper for the low level calls -} - -// StateCommitmentChainTransactor is an auto generated write-only Go binding around an Ethereum contract. -type StateCommitmentChainTransactor struct { - contract *bind.BoundContract // Generic contract wrapper for the low level calls -} - -// StateCommitmentChainFilterer is an auto generated log filtering Go binding around an Ethereum contract events. -type StateCommitmentChainFilterer struct { - contract *bind.BoundContract // Generic contract wrapper for the low level calls -} - -// StateCommitmentChainSession is an auto generated Go binding around an Ethereum contract, -// with pre-set call and transact options. -type StateCommitmentChainSession struct { - Contract *StateCommitmentChain // 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 -} - -// StateCommitmentChainCallerSession is an auto generated read-only Go binding around an Ethereum contract, -// with pre-set call options. -type StateCommitmentChainCallerSession struct { - Contract *StateCommitmentChainCaller // Generic contract caller binding to set the session for - CallOpts bind.CallOpts // Call options to use throughout this session -} - -// StateCommitmentChainTransactorSession is an auto generated write-only Go binding around an Ethereum contract, -// with pre-set transact options. -type StateCommitmentChainTransactorSession struct { - Contract *StateCommitmentChainTransactor // Generic contract transactor binding to set the session for - TransactOpts bind.TransactOpts // Transaction auth options to use throughout this session -} - -// StateCommitmentChainRaw is an auto generated low-level Go binding around an Ethereum contract. -type StateCommitmentChainRaw struct { - Contract *StateCommitmentChain // Generic contract binding to access the raw methods on -} - -// StateCommitmentChainCallerRaw is an auto generated low-level read-only Go binding around an Ethereum contract. -type StateCommitmentChainCallerRaw struct { - Contract *StateCommitmentChainCaller // Generic read-only contract binding to access the raw methods on -} - -// StateCommitmentChainTransactorRaw is an auto generated low-level write-only Go binding around an Ethereum contract. -type StateCommitmentChainTransactorRaw struct { - Contract *StateCommitmentChainTransactor // Generic write-only contract binding to access the raw methods on -} - -// NewStateCommitmentChain creates a new instance of StateCommitmentChain, bound to a specific deployed contract. -func NewStateCommitmentChain(address common.Address, backend bind.ContractBackend) (*StateCommitmentChain, error) { - contract, err := bindStateCommitmentChain(address, backend, backend, backend) - if err != nil { - return nil, err - } - return &StateCommitmentChain{StateCommitmentChainCaller: StateCommitmentChainCaller{contract: contract}, StateCommitmentChainTransactor: StateCommitmentChainTransactor{contract: contract}, StateCommitmentChainFilterer: StateCommitmentChainFilterer{contract: contract}}, nil -} - -// NewStateCommitmentChainCaller creates a new read-only instance of StateCommitmentChain, bound to a specific deployed contract. -func NewStateCommitmentChainCaller(address common.Address, caller bind.ContractCaller) (*StateCommitmentChainCaller, error) { - contract, err := bindStateCommitmentChain(address, caller, nil, nil) - if err != nil { - return nil, err - } - return &StateCommitmentChainCaller{contract: contract}, nil -} - -// NewStateCommitmentChainTransactor creates a new write-only instance of StateCommitmentChain, bound to a specific deployed contract. -func NewStateCommitmentChainTransactor(address common.Address, transactor bind.ContractTransactor) (*StateCommitmentChainTransactor, error) { - contract, err := bindStateCommitmentChain(address, nil, transactor, nil) - if err != nil { - return nil, err - } - return &StateCommitmentChainTransactor{contract: contract}, nil -} - -// NewStateCommitmentChainFilterer creates a new log filterer instance of StateCommitmentChain, bound to a specific deployed contract. -func NewStateCommitmentChainFilterer(address common.Address, filterer bind.ContractFilterer) (*StateCommitmentChainFilterer, error) { - contract, err := bindStateCommitmentChain(address, nil, nil, filterer) - if err != nil { - return nil, err - } - return &StateCommitmentChainFilterer{contract: contract}, nil -} - -// bindStateCommitmentChain binds a generic wrapper to an already deployed contract. -func bindStateCommitmentChain(address common.Address, caller bind.ContractCaller, transactor bind.ContractTransactor, filterer bind.ContractFilterer) (*bind.BoundContract, error) { - parsed, err := abi.JSON(strings.NewReader(StateCommitmentChainABI)) - 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 (_StateCommitmentChain *StateCommitmentChainRaw) Call(opts *bind.CallOpts, result *[]interface{}, method string, params ...interface{}) error { - return _StateCommitmentChain.Contract.StateCommitmentChainCaller.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 (_StateCommitmentChain *StateCommitmentChainRaw) Transfer(opts *bind.TransactOpts) (*types.Transaction, error) { - return _StateCommitmentChain.Contract.StateCommitmentChainTransactor.contract.Transfer(opts) -} - -// Transact invokes the (paid) contract method with params as input values. -func (_StateCommitmentChain *StateCommitmentChainRaw) Transact(opts *bind.TransactOpts, method string, params ...interface{}) (*types.Transaction, error) { - return _StateCommitmentChain.Contract.StateCommitmentChainTransactor.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 (_StateCommitmentChain *StateCommitmentChainCallerRaw) Call(opts *bind.CallOpts, result *[]interface{}, method string, params ...interface{}) error { - return _StateCommitmentChain.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 (_StateCommitmentChain *StateCommitmentChainTransactorRaw) Transfer(opts *bind.TransactOpts) (*types.Transaction, error) { - return _StateCommitmentChain.Contract.contract.Transfer(opts) -} - -// Transact invokes the (paid) contract method with params as input values. -func (_StateCommitmentChain *StateCommitmentChainTransactorRaw) Transact(opts *bind.TransactOpts, method string, params ...interface{}) (*types.Transaction, error) { - return _StateCommitmentChain.Contract.contract.Transact(opts, method, params...) -} - -// FRAUDPROOFWINDOW is a free data retrieval call binding the contract method 0xc17b291b. -// -// Solidity: function FRAUD_PROOF_WINDOW() view returns(uint256) -func (_StateCommitmentChain *StateCommitmentChainCaller) FRAUDPROOFWINDOW(opts *bind.CallOpts) (*big.Int, error) { - var out []interface{} - err := _StateCommitmentChain.contract.Call(opts, &out, "FRAUD_PROOF_WINDOW") - - if err != nil { - return *new(*big.Int), err - } - - out0 := *abi.ConvertType(out[0], new(*big.Int)).(**big.Int) - - return out0, err - -} - -// FRAUDPROOFWINDOW is a free data retrieval call binding the contract method 0xc17b291b. -// -// Solidity: function FRAUD_PROOF_WINDOW() view returns(uint256) -func (_StateCommitmentChain *StateCommitmentChainSession) FRAUDPROOFWINDOW() (*big.Int, error) { - return _StateCommitmentChain.Contract.FRAUDPROOFWINDOW(&_StateCommitmentChain.CallOpts) -} - -// FRAUDPROOFWINDOW is a free data retrieval call binding the contract method 0xc17b291b. -// -// Solidity: function FRAUD_PROOF_WINDOW() view returns(uint256) -func (_StateCommitmentChain *StateCommitmentChainCallerSession) FRAUDPROOFWINDOW() (*big.Int, error) { - return _StateCommitmentChain.Contract.FRAUDPROOFWINDOW(&_StateCommitmentChain.CallOpts) -} - -// SEQUENCERPUBLISHWINDOW is a free data retrieval call binding the contract method 0x81eb62ef. -// -// Solidity: function SEQUENCER_PUBLISH_WINDOW() view returns(uint256) -func (_StateCommitmentChain *StateCommitmentChainCaller) SEQUENCERPUBLISHWINDOW(opts *bind.CallOpts) (*big.Int, error) { - var out []interface{} - err := _StateCommitmentChain.contract.Call(opts, &out, "SEQUENCER_PUBLISH_WINDOW") - - if err != nil { - return *new(*big.Int), err - } - - out0 := *abi.ConvertType(out[0], new(*big.Int)).(**big.Int) - - return out0, err - -} - -// SEQUENCERPUBLISHWINDOW is a free data retrieval call binding the contract method 0x81eb62ef. -// -// Solidity: function SEQUENCER_PUBLISH_WINDOW() view returns(uint256) -func (_StateCommitmentChain *StateCommitmentChainSession) SEQUENCERPUBLISHWINDOW() (*big.Int, error) { - return _StateCommitmentChain.Contract.SEQUENCERPUBLISHWINDOW(&_StateCommitmentChain.CallOpts) -} - -// SEQUENCERPUBLISHWINDOW is a free data retrieval call binding the contract method 0x81eb62ef. -// -// Solidity: function SEQUENCER_PUBLISH_WINDOW() view returns(uint256) -func (_StateCommitmentChain *StateCommitmentChainCallerSession) SEQUENCERPUBLISHWINDOW() (*big.Int, error) { - return _StateCommitmentChain.Contract.SEQUENCERPUBLISHWINDOW(&_StateCommitmentChain.CallOpts) -} - -// Batches is a free data retrieval call binding the contract method 0xcfdf677e. -// -// Solidity: function batches() view returns(address) -func (_StateCommitmentChain *StateCommitmentChainCaller) Batches(opts *bind.CallOpts) (common.Address, error) { - var out []interface{} - err := _StateCommitmentChain.contract.Call(opts, &out, "batches") - - if err != nil { - return *new(common.Address), err - } - - out0 := *abi.ConvertType(out[0], new(common.Address)).(*common.Address) - - return out0, err - -} - -// Batches is a free data retrieval call binding the contract method 0xcfdf677e. -// -// Solidity: function batches() view returns(address) -func (_StateCommitmentChain *StateCommitmentChainSession) Batches() (common.Address, error) { - return _StateCommitmentChain.Contract.Batches(&_StateCommitmentChain.CallOpts) -} - -// Batches is a free data retrieval call binding the contract method 0xcfdf677e. -// -// Solidity: function batches() view returns(address) -func (_StateCommitmentChain *StateCommitmentChainCallerSession) Batches() (common.Address, error) { - return _StateCommitmentChain.Contract.Batches(&_StateCommitmentChain.CallOpts) -} - -// GetLastSequencerTimestamp is a free data retrieval call binding the contract method 0x7ad168a0. -// -// Solidity: function getLastSequencerTimestamp() view returns(uint256 _lastSequencerTimestamp) -func (_StateCommitmentChain *StateCommitmentChainCaller) GetLastSequencerTimestamp(opts *bind.CallOpts) (*big.Int, error) { - var out []interface{} - err := _StateCommitmentChain.contract.Call(opts, &out, "getLastSequencerTimestamp") - - if err != nil { - return *new(*big.Int), err - } - - out0 := *abi.ConvertType(out[0], new(*big.Int)).(**big.Int) - - return out0, err - -} - -// GetLastSequencerTimestamp is a free data retrieval call binding the contract method 0x7ad168a0. -// -// Solidity: function getLastSequencerTimestamp() view returns(uint256 _lastSequencerTimestamp) -func (_StateCommitmentChain *StateCommitmentChainSession) GetLastSequencerTimestamp() (*big.Int, error) { - return _StateCommitmentChain.Contract.GetLastSequencerTimestamp(&_StateCommitmentChain.CallOpts) -} - -// GetLastSequencerTimestamp is a free data retrieval call binding the contract method 0x7ad168a0. -// -// Solidity: function getLastSequencerTimestamp() view returns(uint256 _lastSequencerTimestamp) -func (_StateCommitmentChain *StateCommitmentChainCallerSession) GetLastSequencerTimestamp() (*big.Int, error) { - return _StateCommitmentChain.Contract.GetLastSequencerTimestamp(&_StateCommitmentChain.CallOpts) -} - -// GetTotalBatches is a free data retrieval call binding the contract method 0xe561dddc. -// -// Solidity: function getTotalBatches() view returns(uint256 _totalBatches) -func (_StateCommitmentChain *StateCommitmentChainCaller) GetTotalBatches(opts *bind.CallOpts) (*big.Int, error) { - var out []interface{} - err := _StateCommitmentChain.contract.Call(opts, &out, "getTotalBatches") - - if err != nil { - return *new(*big.Int), err - } - - out0 := *abi.ConvertType(out[0], new(*big.Int)).(**big.Int) - - return out0, err - -} - -// GetTotalBatches is a free data retrieval call binding the contract method 0xe561dddc. -// -// Solidity: function getTotalBatches() view returns(uint256 _totalBatches) -func (_StateCommitmentChain *StateCommitmentChainSession) GetTotalBatches() (*big.Int, error) { - return _StateCommitmentChain.Contract.GetTotalBatches(&_StateCommitmentChain.CallOpts) -} - -// GetTotalBatches is a free data retrieval call binding the contract method 0xe561dddc. -// -// Solidity: function getTotalBatches() view returns(uint256 _totalBatches) -func (_StateCommitmentChain *StateCommitmentChainCallerSession) GetTotalBatches() (*big.Int, error) { - return _StateCommitmentChain.Contract.GetTotalBatches(&_StateCommitmentChain.CallOpts) -} - -// GetTotalElements is a free data retrieval call binding the contract method 0x7aa63a86. -// -// Solidity: function getTotalElements() view returns(uint256 _totalElements) -func (_StateCommitmentChain *StateCommitmentChainCaller) GetTotalElements(opts *bind.CallOpts) (*big.Int, error) { - var out []interface{} - err := _StateCommitmentChain.contract.Call(opts, &out, "getTotalElements") - - if err != nil { - return *new(*big.Int), err - } - - out0 := *abi.ConvertType(out[0], new(*big.Int)).(**big.Int) - - return out0, err - -} - -// GetTotalElements is a free data retrieval call binding the contract method 0x7aa63a86. -// -// Solidity: function getTotalElements() view returns(uint256 _totalElements) -func (_StateCommitmentChain *StateCommitmentChainSession) GetTotalElements() (*big.Int, error) { - return _StateCommitmentChain.Contract.GetTotalElements(&_StateCommitmentChain.CallOpts) -} - -// GetTotalElements is a free data retrieval call binding the contract method 0x7aa63a86. -// -// Solidity: function getTotalElements() view returns(uint256 _totalElements) -func (_StateCommitmentChain *StateCommitmentChainCallerSession) GetTotalElements() (*big.Int, error) { - return _StateCommitmentChain.Contract.GetTotalElements(&_StateCommitmentChain.CallOpts) -} - -// InsideFraudProofWindow is a free data retrieval call binding the contract method 0x9418bddd. -// -// Solidity: function insideFraudProofWindow((uint256,bytes32,uint256,uint256,bytes) _batchHeader) view returns(bool _inside) -func (_StateCommitmentChain *StateCommitmentChainCaller) InsideFraudProofWindow(opts *bind.CallOpts, _batchHeader LibOVMCodecChainBatchHeader) (bool, error) { - var out []interface{} - err := _StateCommitmentChain.contract.Call(opts, &out, "insideFraudProofWindow", _batchHeader) - - if err != nil { - return *new(bool), err - } - - out0 := *abi.ConvertType(out[0], new(bool)).(*bool) - - return out0, err - -} - -// InsideFraudProofWindow is a free data retrieval call binding the contract method 0x9418bddd. -// -// Solidity: function insideFraudProofWindow((uint256,bytes32,uint256,uint256,bytes) _batchHeader) view returns(bool _inside) -func (_StateCommitmentChain *StateCommitmentChainSession) InsideFraudProofWindow(_batchHeader LibOVMCodecChainBatchHeader) (bool, error) { - return _StateCommitmentChain.Contract.InsideFraudProofWindow(&_StateCommitmentChain.CallOpts, _batchHeader) -} - -// InsideFraudProofWindow is a free data retrieval call binding the contract method 0x9418bddd. -// -// Solidity: function insideFraudProofWindow((uint256,bytes32,uint256,uint256,bytes) _batchHeader) view returns(bool _inside) -func (_StateCommitmentChain *StateCommitmentChainCallerSession) InsideFraudProofWindow(_batchHeader LibOVMCodecChainBatchHeader) (bool, error) { - return _StateCommitmentChain.Contract.InsideFraudProofWindow(&_StateCommitmentChain.CallOpts, _batchHeader) -} - -// LibAddressManager is a free data retrieval call binding the contract method 0x299ca478. -// -// Solidity: function libAddressManager() view returns(address) -func (_StateCommitmentChain *StateCommitmentChainCaller) LibAddressManager(opts *bind.CallOpts) (common.Address, error) { - var out []interface{} - err := _StateCommitmentChain.contract.Call(opts, &out, "libAddressManager") - - if err != nil { - return *new(common.Address), err - } - - out0 := *abi.ConvertType(out[0], new(common.Address)).(*common.Address) - - return out0, err - -} - -// LibAddressManager is a free data retrieval call binding the contract method 0x299ca478. -// -// Solidity: function libAddressManager() view returns(address) -func (_StateCommitmentChain *StateCommitmentChainSession) LibAddressManager() (common.Address, error) { - return _StateCommitmentChain.Contract.LibAddressManager(&_StateCommitmentChain.CallOpts) -} - -// LibAddressManager is a free data retrieval call binding the contract method 0x299ca478. -// -// Solidity: function libAddressManager() view returns(address) -func (_StateCommitmentChain *StateCommitmentChainCallerSession) LibAddressManager() (common.Address, error) { - return _StateCommitmentChain.Contract.LibAddressManager(&_StateCommitmentChain.CallOpts) -} - -// Resolve is a free data retrieval call binding the contract method 0x461a4478. -// -// Solidity: function resolve(string _name) view returns(address) -func (_StateCommitmentChain *StateCommitmentChainCaller) Resolve(opts *bind.CallOpts, _name string) (common.Address, error) { - var out []interface{} - err := _StateCommitmentChain.contract.Call(opts, &out, "resolve", _name) - - if err != nil { - return *new(common.Address), err - } - - out0 := *abi.ConvertType(out[0], new(common.Address)).(*common.Address) - - return out0, err - -} - -// Resolve is a free data retrieval call binding the contract method 0x461a4478. -// -// Solidity: function resolve(string _name) view returns(address) -func (_StateCommitmentChain *StateCommitmentChainSession) Resolve(_name string) (common.Address, error) { - return _StateCommitmentChain.Contract.Resolve(&_StateCommitmentChain.CallOpts, _name) -} - -// Resolve is a free data retrieval call binding the contract method 0x461a4478. -// -// Solidity: function resolve(string _name) view returns(address) -func (_StateCommitmentChain *StateCommitmentChainCallerSession) Resolve(_name string) (common.Address, error) { - return _StateCommitmentChain.Contract.Resolve(&_StateCommitmentChain.CallOpts, _name) -} - -// VerifyStateCommitment is a free data retrieval call binding the contract method 0x4d69ee57. -// -// Solidity: function verifyStateCommitment(bytes32 _element, (uint256,bytes32,uint256,uint256,bytes) _batchHeader, (uint256,bytes32[]) _proof) view returns(bool) -func (_StateCommitmentChain *StateCommitmentChainCaller) VerifyStateCommitment(opts *bind.CallOpts, _element [32]byte, _batchHeader LibOVMCodecChainBatchHeader, _proof LibOVMCodecChainInclusionProof) (bool, error) { - var out []interface{} - err := _StateCommitmentChain.contract.Call(opts, &out, "verifyStateCommitment", _element, _batchHeader, _proof) - - if err != nil { - return *new(bool), err - } - - out0 := *abi.ConvertType(out[0], new(bool)).(*bool) - - return out0, err - -} - -// VerifyStateCommitment is a free data retrieval call binding the contract method 0x4d69ee57. -// -// Solidity: function verifyStateCommitment(bytes32 _element, (uint256,bytes32,uint256,uint256,bytes) _batchHeader, (uint256,bytes32[]) _proof) view returns(bool) -func (_StateCommitmentChain *StateCommitmentChainSession) VerifyStateCommitment(_element [32]byte, _batchHeader LibOVMCodecChainBatchHeader, _proof LibOVMCodecChainInclusionProof) (bool, error) { - return _StateCommitmentChain.Contract.VerifyStateCommitment(&_StateCommitmentChain.CallOpts, _element, _batchHeader, _proof) -} - -// VerifyStateCommitment is a free data retrieval call binding the contract method 0x4d69ee57. -// -// Solidity: function verifyStateCommitment(bytes32 _element, (uint256,bytes32,uint256,uint256,bytes) _batchHeader, (uint256,bytes32[]) _proof) view returns(bool) -func (_StateCommitmentChain *StateCommitmentChainCallerSession) VerifyStateCommitment(_element [32]byte, _batchHeader LibOVMCodecChainBatchHeader, _proof LibOVMCodecChainInclusionProof) (bool, error) { - return _StateCommitmentChain.Contract.VerifyStateCommitment(&_StateCommitmentChain.CallOpts, _element, _batchHeader, _proof) -} - -// AppendStateBatch is a paid mutator transaction binding the contract method 0x8ca5cbb9. -// -// Solidity: function appendStateBatch(bytes32[] _batch, uint256 _shouldStartAtElement) returns() -func (_StateCommitmentChain *StateCommitmentChainTransactor) AppendStateBatch(opts *bind.TransactOpts, _batch [][32]byte, _shouldStartAtElement *big.Int) (*types.Transaction, error) { - return _StateCommitmentChain.contract.Transact(opts, "appendStateBatch", _batch, _shouldStartAtElement) -} - -// AppendStateBatch is a paid mutator transaction binding the contract method 0x8ca5cbb9. -// -// Solidity: function appendStateBatch(bytes32[] _batch, uint256 _shouldStartAtElement) returns() -func (_StateCommitmentChain *StateCommitmentChainSession) AppendStateBatch(_batch [][32]byte, _shouldStartAtElement *big.Int) (*types.Transaction, error) { - return _StateCommitmentChain.Contract.AppendStateBatch(&_StateCommitmentChain.TransactOpts, _batch, _shouldStartAtElement) -} - -// AppendStateBatch is a paid mutator transaction binding the contract method 0x8ca5cbb9. -// -// Solidity: function appendStateBatch(bytes32[] _batch, uint256 _shouldStartAtElement) returns() -func (_StateCommitmentChain *StateCommitmentChainTransactorSession) AppendStateBatch(_batch [][32]byte, _shouldStartAtElement *big.Int) (*types.Transaction, error) { - return _StateCommitmentChain.Contract.AppendStateBatch(&_StateCommitmentChain.TransactOpts, _batch, _shouldStartAtElement) -} - -// DeleteStateBatch is a paid mutator transaction binding the contract method 0xb8e189ac. -// -// Solidity: function deleteStateBatch((uint256,bytes32,uint256,uint256,bytes) _batchHeader) returns() -func (_StateCommitmentChain *StateCommitmentChainTransactor) DeleteStateBatch(opts *bind.TransactOpts, _batchHeader LibOVMCodecChainBatchHeader) (*types.Transaction, error) { - return _StateCommitmentChain.contract.Transact(opts, "deleteStateBatch", _batchHeader) -} - -// DeleteStateBatch is a paid mutator transaction binding the contract method 0xb8e189ac. -// -// Solidity: function deleteStateBatch((uint256,bytes32,uint256,uint256,bytes) _batchHeader) returns() -func (_StateCommitmentChain *StateCommitmentChainSession) DeleteStateBatch(_batchHeader LibOVMCodecChainBatchHeader) (*types.Transaction, error) { - return _StateCommitmentChain.Contract.DeleteStateBatch(&_StateCommitmentChain.TransactOpts, _batchHeader) -} - -// DeleteStateBatch is a paid mutator transaction binding the contract method 0xb8e189ac. -// -// Solidity: function deleteStateBatch((uint256,bytes32,uint256,uint256,bytes) _batchHeader) returns() -func (_StateCommitmentChain *StateCommitmentChainTransactorSession) DeleteStateBatch(_batchHeader LibOVMCodecChainBatchHeader) (*types.Transaction, error) { - return _StateCommitmentChain.Contract.DeleteStateBatch(&_StateCommitmentChain.TransactOpts, _batchHeader) -} - -// StateCommitmentChainStateBatchAppendedIterator is returned from FilterStateBatchAppended and is used to iterate over the raw logs and unpacked data for StateBatchAppended events raised by the StateCommitmentChain contract. -type StateCommitmentChainStateBatchAppendedIterator struct { - Event *StateCommitmentChainStateBatchAppended // 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 *StateCommitmentChainStateBatchAppendedIterator) 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(StateCommitmentChainStateBatchAppended) - 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(StateCommitmentChainStateBatchAppended) - 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 *StateCommitmentChainStateBatchAppendedIterator) Error() error { - return it.fail -} - -// Close terminates the iteration process, releasing any pending underlying -// resources. -func (it *StateCommitmentChainStateBatchAppendedIterator) Close() error { - it.sub.Unsubscribe() - return nil -} - -// StateCommitmentChainStateBatchAppended represents a StateBatchAppended event raised by the StateCommitmentChain contract. -type StateCommitmentChainStateBatchAppended struct { - BatchIndex *big.Int - BatchRoot [32]byte - BatchSize *big.Int - PrevTotalElements *big.Int - ExtraData []byte - Raw types.Log // Blockchain specific contextual infos -} - -// FilterStateBatchAppended is a free log retrieval operation binding the contract event 0x16be4c5129a4e03cf3350262e181dc02ddfb4a6008d925368c0899fcd97ca9c5. -// -// Solidity: event StateBatchAppended(uint256 indexed _batchIndex, bytes32 _batchRoot, uint256 _batchSize, uint256 _prevTotalElements, bytes _extraData) -func (_StateCommitmentChain *StateCommitmentChainFilterer) FilterStateBatchAppended(opts *bind.FilterOpts, _batchIndex []*big.Int) (*StateCommitmentChainStateBatchAppendedIterator, error) { - - var _batchIndexRule []interface{} - for _, _batchIndexItem := range _batchIndex { - _batchIndexRule = append(_batchIndexRule, _batchIndexItem) - } - - logs, sub, err := _StateCommitmentChain.contract.FilterLogs(opts, "StateBatchAppended", _batchIndexRule) - if err != nil { - return nil, err - } - return &StateCommitmentChainStateBatchAppendedIterator{contract: _StateCommitmentChain.contract, event: "StateBatchAppended", logs: logs, sub: sub}, nil -} - -// WatchStateBatchAppended is a free log subscription operation binding the contract event 0x16be4c5129a4e03cf3350262e181dc02ddfb4a6008d925368c0899fcd97ca9c5. -// -// Solidity: event StateBatchAppended(uint256 indexed _batchIndex, bytes32 _batchRoot, uint256 _batchSize, uint256 _prevTotalElements, bytes _extraData) -func (_StateCommitmentChain *StateCommitmentChainFilterer) WatchStateBatchAppended(opts *bind.WatchOpts, sink chan<- *StateCommitmentChainStateBatchAppended, _batchIndex []*big.Int) (event.Subscription, error) { - - var _batchIndexRule []interface{} - for _, _batchIndexItem := range _batchIndex { - _batchIndexRule = append(_batchIndexRule, _batchIndexItem) - } - - logs, sub, err := _StateCommitmentChain.contract.WatchLogs(opts, "StateBatchAppended", _batchIndexRule) - 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(StateCommitmentChainStateBatchAppended) - if err := _StateCommitmentChain.contract.UnpackLog(event, "StateBatchAppended", 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 -} - -// ParseStateBatchAppended is a log parse operation binding the contract event 0x16be4c5129a4e03cf3350262e181dc02ddfb4a6008d925368c0899fcd97ca9c5. -// -// Solidity: event StateBatchAppended(uint256 indexed _batchIndex, bytes32 _batchRoot, uint256 _batchSize, uint256 _prevTotalElements, bytes _extraData) -func (_StateCommitmentChain *StateCommitmentChainFilterer) ParseStateBatchAppended(log types.Log) (*StateCommitmentChainStateBatchAppended, error) { - event := new(StateCommitmentChainStateBatchAppended) - if err := _StateCommitmentChain.contract.UnpackLog(event, "StateBatchAppended", log); err != nil { - return nil, err - } - event.Raw = log - return event, nil -} - -// StateCommitmentChainStateBatchDeletedIterator is returned from FilterStateBatchDeleted and is used to iterate over the raw logs and unpacked data for StateBatchDeleted events raised by the StateCommitmentChain contract. -type StateCommitmentChainStateBatchDeletedIterator struct { - Event *StateCommitmentChainStateBatchDeleted // 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 *StateCommitmentChainStateBatchDeletedIterator) 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(StateCommitmentChainStateBatchDeleted) - 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(StateCommitmentChainStateBatchDeleted) - 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 *StateCommitmentChainStateBatchDeletedIterator) Error() error { - return it.fail -} - -// Close terminates the iteration process, releasing any pending underlying -// resources. -func (it *StateCommitmentChainStateBatchDeletedIterator) Close() error { - it.sub.Unsubscribe() - return nil -} - -// StateCommitmentChainStateBatchDeleted represents a StateBatchDeleted event raised by the StateCommitmentChain contract. -type StateCommitmentChainStateBatchDeleted struct { - BatchIndex *big.Int - BatchRoot [32]byte - Raw types.Log // Blockchain specific contextual infos -} - -// FilterStateBatchDeleted is a free log retrieval operation binding the contract event 0x8747b69ce8fdb31c3b9b0a67bd8049ad8c1a69ea417b69b12174068abd9cbd64. -// -// Solidity: event StateBatchDeleted(uint256 indexed _batchIndex, bytes32 _batchRoot) -func (_StateCommitmentChain *StateCommitmentChainFilterer) FilterStateBatchDeleted(opts *bind.FilterOpts, _batchIndex []*big.Int) (*StateCommitmentChainStateBatchDeletedIterator, error) { - - var _batchIndexRule []interface{} - for _, _batchIndexItem := range _batchIndex { - _batchIndexRule = append(_batchIndexRule, _batchIndexItem) - } - - logs, sub, err := _StateCommitmentChain.contract.FilterLogs(opts, "StateBatchDeleted", _batchIndexRule) - if err != nil { - return nil, err - } - return &StateCommitmentChainStateBatchDeletedIterator{contract: _StateCommitmentChain.contract, event: "StateBatchDeleted", logs: logs, sub: sub}, nil -} - -// WatchStateBatchDeleted is a free log subscription operation binding the contract event 0x8747b69ce8fdb31c3b9b0a67bd8049ad8c1a69ea417b69b12174068abd9cbd64. -// -// Solidity: event StateBatchDeleted(uint256 indexed _batchIndex, bytes32 _batchRoot) -func (_StateCommitmentChain *StateCommitmentChainFilterer) WatchStateBatchDeleted(opts *bind.WatchOpts, sink chan<- *StateCommitmentChainStateBatchDeleted, _batchIndex []*big.Int) (event.Subscription, error) { - - var _batchIndexRule []interface{} - for _, _batchIndexItem := range _batchIndex { - _batchIndexRule = append(_batchIndexRule, _batchIndexItem) - } - - logs, sub, err := _StateCommitmentChain.contract.WatchLogs(opts, "StateBatchDeleted", _batchIndexRule) - 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(StateCommitmentChainStateBatchDeleted) - if err := _StateCommitmentChain.contract.UnpackLog(event, "StateBatchDeleted", 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 -} - -// ParseStateBatchDeleted is a log parse operation binding the contract event 0x8747b69ce8fdb31c3b9b0a67bd8049ad8c1a69ea417b69b12174068abd9cbd64. -// -// Solidity: event StateBatchDeleted(uint256 indexed _batchIndex, bytes32 _batchRoot) -func (_StateCommitmentChain *StateCommitmentChainFilterer) ParseStateBatchDeleted(log types.Log) (*StateCommitmentChainStateBatchDeleted, error) { - event := new(StateCommitmentChainStateBatchDeleted) - if err := _StateCommitmentChain.contract.UnpackLog(event, "StateBatchDeleted", log); err != nil { - return nil, err - } - event.Raw = log - return event, nil -} diff --git a/indexer/bindings/crossdomainmessenger.go b/indexer/bindings/crossdomainmessenger.go deleted file mode 100644 index 516b49cbffab..000000000000 --- a/indexer/bindings/crossdomainmessenger.go +++ /dev/null @@ -1,1433 +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 -) - -// 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/indexer/bindings/l1crossdomainmessenger.go b/indexer/bindings/l1crossdomainmessenger.go deleted file mode 100644 index 0aa353e32aff..000000000000 --- a/indexer/bindings/l1crossdomainmessenger.go +++ /dev/null @@ -1,1600 +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 -) - -// 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\"}],\"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\":\"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: "0x60806040523480156200001157600080fd5b506200001f60008062000025565b6200027f565b600054600160a81b900460ff16158080156200004e57506000546001600160a01b90910460ff16105b806200008557506200006b30620001b960201b620014d61760201c565b158015620000855750600054600160a01b900460ff166001145b620000ee5760405162461bcd60e51b815260206004820152602e60248201527f496e697469616c697a61626c653a20636f6e747261637420697320616c72656160448201526d191e481a5b9a5d1a585b1a5e995960921b60648201526084015b60405180910390fd5b6000805460ff60a01b1916600160a01b17905580156200011c576000805460ff60a81b1916600160a81b1790555b60fb80546001600160a01b038086166001600160a01b03199283161790925560fc8054928516929091169190911790556200016b734200000000000000000000000000000000000007620001c8565b8015620001b4576000805460ff60a81b19169055604051600181527f7f26b83ff96e1f2b6a682f133852f6798a09c465da95921460cefb38474024989060200160405180910390a15b505050565b6001600160a01b03163b151590565b600054600160a81b900460ff16620002375760405162461bcd60e51b815260206004820152602b60248201527f496e697469616c697a61626c653a20636f6e7472616374206973206e6f74206960448201526a6e697469616c697a696e6760a81b6064820152608401620000e5565b60cc546001600160a01b03166200025d5760cc80546001600160a01b03191661dead1790555b60cf80546001600160a01b0319166001600160a01b0392909216919091179055565b611f94806200028f6000396000f3fe6080604052600436106101805760003560e01c80635c975abb116100d6578063a4e7f8bd1161007f578063d764ad0b11610059578063d764ad0b14610463578063db505d8014610476578063ecc70428146104a357600080fd5b8063a4e7f8bd146103e3578063b1b1b20914610413578063b28ade251461044357600080fd5b806383a74074116100b057806383a74074146103a15780638cbeeef2146102b85780639fce812c146103b857600080fd5b80635c975abb1461033a5780636425666b1461035f5780636e296e451461038c57600080fd5b80633dbb202b116101385780634c1d6a69116101125780634c1d6a69146102b857806354fd4d50146102ce5780635644cfdf1461032457600080fd5b80633dbb202b1461025b5780633f827a5a14610270578063485cc9551461029857600080fd5b80630ff754ea116101695780630ff754ea146101cd5780632828d7e81461021957806335e80ab31461022e57600080fd5b8063028f85f7146101855780630c568498146101b8575b600080fd5b34801561019157600080fd5b5061019a601081565b60405167ffffffffffffffff90911681526020015b60405180910390f35b3480156101c457600080fd5b5061019a603f81565b3480156101d957600080fd5b5060fc5473ffffffffffffffffffffffffffffffffffffffff165b60405173ffffffffffffffffffffffffffffffffffffffff90911681526020016101af565b34801561022557600080fd5b5061019a604081565b34801561023a57600080fd5b5060fb546101f49073ffffffffffffffffffffffffffffffffffffffff1681565b61026e610269366004611a22565b610508565b005b34801561027c57600080fd5b50610285600181565b60405161ffff90911681526020016101af565b3480156102a457600080fd5b5061026e6102b3366004611a89565b610765565b3480156102c457600080fd5b5061019a619c4081565b3480156102da57600080fd5b506103176040518060400160405280600581526020017f322e332e3000000000000000000000000000000000000000000000000000000081525081565b6040516101af9190611b2d565b34801561033057600080fd5b5061019a61138881565b34801561034657600080fd5b5061034f6109d3565b60405190151581526020016101af565b34801561036b57600080fd5b5060fc546101f49073ffffffffffffffffffffffffffffffffffffffff1681565b34801561039857600080fd5b506101f4610a6c565b3480156103ad57600080fd5b5061019a62030d4081565b3480156103c457600080fd5b5060cf5473ffffffffffffffffffffffffffffffffffffffff166101f4565b3480156103ef57600080fd5b5061034f6103fe366004611b47565b60ce6020526000908152604090205460ff1681565b34801561041f57600080fd5b5061034f61042e366004611b47565b60cb6020526000908152604090205460ff1681565b34801561044f57600080fd5b5061019a61045e366004611b60565b610b53565b61026e610471366004611bb4565b610bc1565b34801561048257600080fd5b5060cf546101f49073ffffffffffffffffffffffffffffffffffffffff1681565b3480156104af57600080fd5b506104fa60cd547dffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff167e010000000000000000000000000000000000000000000000000000000000001790565b6040519081526020016101af565b60cf5461063a9073ffffffffffffffffffffffffffffffffffffffff16610530858585610b53565b347fd764ad0b0000000000000000000000000000000000000000000000000000000061059c60cd547dffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff167e010000000000000000000000000000000000000000000000000000000000001790565b338a34898c8c6040516024016105b89796959493929190611c83565b604080517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe08184030181529190526020810180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff167fffffffff00000000000000000000000000000000000000000000000000000000909316929092179091526114f2565b8373ffffffffffffffffffffffffffffffffffffffff167fcb0f7ffd78f9aee47a248fae8db181db6eee833039123e026dcbff529522e52a3385856106bf60cd547dffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff167e010000000000000000000000000000000000000000000000000000000000001790565b866040516106d1959493929190611ce2565b60405180910390a260405134815233907f8ebb2ec2465bdb2a06a66fc37a0963af8a2a6a1479d81d56fdb8cbb98096d5469060200160405180910390a2505060cd80547dffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff808216600101167fffff0000000000000000000000000000000000000000000000000000000000009091161790555050565b6000547501000000000000000000000000000000000000000000900460ff16158080156107b0575060005460017401000000000000000000000000000000000000000090910460ff16105b806107e25750303b1580156107e2575060005474010000000000000000000000000000000000000000900460ff166001145b610873576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602e60248201527f496e697469616c697a61626c653a20636f6e747261637420697320616c72656160448201527f647920696e697469616c697a656400000000000000000000000000000000000060648201526084015b60405180910390fd5b600080547fffffffffffffffffffffff00ffffffffffffffffffffffffffffffffffffffff167401000000000000000000000000000000000000000017905580156108f957600080547fffffffffffffffffffff00ffffffffffffffffffffffffffffffffffffffffff1675010000000000000000000000000000000000000000001790555b60fb805473ffffffffffffffffffffffffffffffffffffffff8086167fffffffffffffffffffffffff00000000000000000000000000000000000000009283161790925560fc80549285169290911691909117905561096b73420000000000000000000000000000000000000761158b565b80156109ce57600080547fffffffffffffffffffff00ffffffffffffffffffffffffffffffffffffffffff169055604051600181527f7f26b83ff96e1f2b6a682f133852f6798a09c465da95921460cefb38474024989060200160405180910390a15b505050565b60fb54604080517f5c975abb000000000000000000000000000000000000000000000000000000008152905160009273ffffffffffffffffffffffffffffffffffffffff1691635c975abb9160048083019260209291908290030181865afa158015610a43573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610a679190611d30565b905090565b60cc5460009073ffffffffffffffffffffffffffffffffffffffff167fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff215301610b36576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152603560248201527f43726f7373446f6d61696e4d657373656e6765723a2078446f6d61696e4d657360448201527f7361676553656e646572206973206e6f74207365740000000000000000000000606482015260840161086a565b5060cc5473ffffffffffffffffffffffffffffffffffffffff1690565b6000611388619c4080603f610b6f604063ffffffff8816611d81565b610b799190611db1565b610b84601088611d81565b610b919062030d40611dff565b610b9b9190611dff565b610ba59190611dff565b610baf9190611dff565b610bb99190611dff565b949350505050565b610bc96109d3565b15610c30576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601c60248201527f43726f7373446f6d61696e4d657373656e6765723a2070617573656400000000604482015260640161086a565b60f087901c60028110610ceb576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152604d60248201527f43726f7373446f6d61696e4d657373656e6765723a206f6e6c7920766572736960448201527f6f6e2030206f722031206d657373616765732061726520737570706f7274656460648201527f20617420746869732074696d6500000000000000000000000000000000000000608482015260a40161086a565b8061ffff16600003610de0576000610d3c878986868080601f0160208091040260200160405190810160405280939291908181526020018383808284376000920191909152508f92506116c7915050565b600081815260cb602052604090205490915060ff1615610dde576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152603760248201527f43726f7373446f6d61696e4d657373656e6765723a206c65676163792077697460448201527f6864726177616c20616c72656164792072656c61796564000000000000000000606482015260840161086a565b505b6000610e26898989898989898080601f0160208091040260200160405190810160405280939291908181526020018383808284376000920191909152506116e692505050565b9050610e30611709565b15610e6857853414610e4457610e44611e2b565b600081815260ce602052604090205460ff1615610e6357610e63611e2b565b610fba565b3415610f1c576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152605060248201527f43726f7373446f6d61696e4d657373656e6765723a2076616c7565206d75737460448201527f206265207a65726f20756e6c657373206d6573736167652069732066726f6d2060648201527f612073797374656d206164647265737300000000000000000000000000000000608482015260a40161086a565b600081815260ce602052604090205460ff16610fba576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152603060248201527f43726f7373446f6d61696e4d657373656e6765723a206d65737361676520636160448201527f6e6e6f74206265207265706c6179656400000000000000000000000000000000606482015260840161086a565b610fc3876117e5565b15611076576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152604360248201527f43726f7373446f6d61696e4d657373656e6765723a2063616e6e6f742073656e60448201527f64206d65737361676520746f20626c6f636b65642073797374656d206164647260648201527f6573730000000000000000000000000000000000000000000000000000000000608482015260a40161086a565b600081815260cb602052604090205460ff1615611115576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152603660248201527f43726f7373446f6d61696e4d657373656e6765723a206d65737361676520686160448201527f7320616c7265616479206265656e2072656c6179656400000000000000000000606482015260840161086a565b61113685611127611388619c40611dff565b67ffffffffffffffff1661182b565b158061115c575060cc5473ffffffffffffffffffffffffffffffffffffffff1661dead14155b1561127557600081815260ce602052604080822080547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff001660011790555182917f99d0e048484baa1b1540b1367cb128acd7ab2946d1ed91ec10e3c85e4bf51b8f91a27fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff320161126e576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602d60248201527f43726f7373446f6d61696e4d657373656e6765723a206661696c656420746f2060448201527f72656c6179206d65737361676500000000000000000000000000000000000000606482015260840161086a565b50506114cd565b60cc80547fffffffffffffffffffffffff00000000000000000000000000000000000000001673ffffffffffffffffffffffffffffffffffffffff8a16179055600061130688619c405a6112c99190611e5a565b8988888080601f01602080910402602001604051908101604052809392919081815260200183838082843760009201919091525061184992505050565b60cc80547fffffffffffffffffffffffff00000000000000000000000000000000000000001661dead179055905080156113bc57600082815260cb602052604090205460ff161561135957611359611e2b565b600082815260cb602052604080822080547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff001660011790555183917f4641df4a962071e12719d8c8c8e5ac7fc4d97b927346a3d7a335b1f7517e133c91a26114c9565b600082815260ce602052604080822080547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff001660011790555183917f99d0e048484baa1b1540b1367cb128acd7ab2946d1ed91ec10e3c85e4bf51b8f91a27fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff32016114c9576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602d60248201527f43726f7373446f6d61696e4d657373656e6765723a206661696c656420746f2060448201527f72656c6179206d65737361676500000000000000000000000000000000000000606482015260840161086a565b5050505b50505050505050565b73ffffffffffffffffffffffffffffffffffffffff163b151590565b60fc546040517fe9e05c4200000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff9091169063e9e05c42908490611553908890839089906000908990600401611e71565b6000604051808303818588803b15801561156c57600080fd5b505af1158015611580573d6000803e3d6000fd5b505050505050505050565b6000547501000000000000000000000000000000000000000000900460ff16611636576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602b60248201527f496e697469616c697a61626c653a20636f6e7472616374206973206e6f74206960448201527f6e697469616c697a696e67000000000000000000000000000000000000000000606482015260840161086a565b60cc5473ffffffffffffffffffffffffffffffffffffffff166116805760cc80547fffffffffffffffffffffffff00000000000000000000000000000000000000001661dead1790555b60cf80547fffffffffffffffffffffffff00000000000000000000000000000000000000001673ffffffffffffffffffffffffffffffffffffffff92909216919091179055565b60006116d585858585611863565b805190602001209050949350505050565b60006116f68787878787876118fc565b8051906020012090509695505050505050565b60fc5460009073ffffffffffffffffffffffffffffffffffffffff1633148015610a67575060cf5460fc54604080517f9bf62d82000000000000000000000000000000000000000000000000000000008152905173ffffffffffffffffffffffffffffffffffffffff9384169390921691639bf62d82916004808201926020929091908290030181865afa1580156117a5573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906117c99190611ec9565b73ffffffffffffffffffffffffffffffffffffffff1614905090565b600073ffffffffffffffffffffffffffffffffffffffff8216301480611825575060fc5473ffffffffffffffffffffffffffffffffffffffff8381169116145b92915050565b600080603f83619c4001026040850201603f5a021015949350505050565b600080600080845160208601878a8af19695505050505050565b60608484848460405160240161187c9493929190611ee6565b604080517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe08184030181529190526020810180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff167fcbd4ece9000000000000000000000000000000000000000000000000000000001790529050949350505050565b606086868686868660405160240161191996959493929190611f30565b604080517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe08184030181529190526020810180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff167fd764ad0b0000000000000000000000000000000000000000000000000000000017905290509695505050505050565b73ffffffffffffffffffffffffffffffffffffffff811681146119bd57600080fd5b50565b60008083601f8401126119d257600080fd5b50813567ffffffffffffffff8111156119ea57600080fd5b602083019150836020828501011115611a0257600080fd5b9250929050565b803563ffffffff81168114611a1d57600080fd5b919050565b60008060008060608587031215611a3857600080fd5b8435611a438161199b565b9350602085013567ffffffffffffffff811115611a5f57600080fd5b611a6b878288016119c0565b9094509250611a7e905060408601611a09565b905092959194509250565b60008060408385031215611a9c57600080fd5b8235611aa78161199b565b91506020830135611ab78161199b565b809150509250929050565b6000815180845260005b81811015611ae857602081850181015186830182015201611acc565b81811115611afa576000602083870101525b50601f017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0169290920160200192915050565b602081526000611b406020830184611ac2565b9392505050565b600060208284031215611b5957600080fd5b5035919050565b600080600060408486031215611b7557600080fd5b833567ffffffffffffffff811115611b8c57600080fd5b611b98868287016119c0565b9094509250611bab905060208501611a09565b90509250925092565b600080600080600080600060c0888a031215611bcf57600080fd5b873596506020880135611be18161199b565b95506040880135611bf18161199b565b9450606088013593506080880135925060a088013567ffffffffffffffff811115611c1b57600080fd5b611c278a828b016119c0565b989b979a50959850939692959293505050565b8183528181602085013750600060208284010152600060207fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0601f840116840101905092915050565b878152600073ffffffffffffffffffffffffffffffffffffffff808916602084015280881660408401525085606083015263ffffffff8516608083015260c060a0830152611cd560c083018486611c3a565b9998505050505050505050565b73ffffffffffffffffffffffffffffffffffffffff86168152608060208201526000611d12608083018688611c3a565b905083604083015263ffffffff831660608301529695505050505050565b600060208284031215611d4257600080fd5b81518015158114611b4057600080fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b600067ffffffffffffffff80831681851681830481118215151615611da857611da8611d52565b02949350505050565b600067ffffffffffffffff80841680611df3577f4e487b7100000000000000000000000000000000000000000000000000000000600052601260045260246000fd5b92169190910492915050565b600067ffffffffffffffff808316818516808303821115611e2257611e22611d52565b01949350505050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052600160045260246000fd5b600082821015611e6c57611e6c611d52565b500390565b73ffffffffffffffffffffffffffffffffffffffff8616815284602082015267ffffffffffffffff84166040820152821515606082015260a060808201526000611ebe60a0830184611ac2565b979650505050505050565b600060208284031215611edb57600080fd5b8151611b408161199b565b600073ffffffffffffffffffffffffffffffffffffffff808716835280861660208401525060806040830152611f1f6080830185611ac2565b905082606083015295945050505050565b868152600073ffffffffffffffffffffffffffffffffffffffff808816602084015280871660408401525084606083015283608083015260c060a0830152611f7b60c0830184611ac2565b9897505050505050505056fea164736f6c634300080f000a", -} - -// 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) -} - -// 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 0x485cc955. -// -// Solidity: function initialize(address _superchainConfig, address _portal) returns() -func (_L1CrossDomainMessenger *L1CrossDomainMessengerTransactor) Initialize(opts *bind.TransactOpts, _superchainConfig common.Address, _portal common.Address) (*types.Transaction, error) { - return _L1CrossDomainMessenger.contract.Transact(opts, "initialize", _superchainConfig, _portal) -} - -// Initialize is a paid mutator transaction binding the contract method 0x485cc955. -// -// Solidity: function initialize(address _superchainConfig, address _portal) returns() -func (_L1CrossDomainMessenger *L1CrossDomainMessengerSession) Initialize(_superchainConfig common.Address, _portal common.Address) (*types.Transaction, error) { - return _L1CrossDomainMessenger.Contract.Initialize(&_L1CrossDomainMessenger.TransactOpts, _superchainConfig, _portal) -} - -// Initialize is a paid mutator transaction binding the contract method 0x485cc955. -// -// Solidity: function initialize(address _superchainConfig, address _portal) returns() -func (_L1CrossDomainMessenger *L1CrossDomainMessengerTransactorSession) Initialize(_superchainConfig common.Address, _portal common.Address) (*types.Transaction, error) { - return _L1CrossDomainMessenger.Contract.Initialize(&_L1CrossDomainMessenger.TransactOpts, _superchainConfig, _portal) -} - -// 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/indexer/bindings/l1standardbridge.go b/indexer/bindings/l1standardbridge.go deleted file mode 100644 index 619df3f3bcb2..000000000000 --- a/indexer/bindings/l1standardbridge.go +++ /dev/null @@ -1,2189 +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 -) - -// 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\"}],\"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\":\"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: "0x60806040523480156200001157600080fd5b506200001f60008062000025565b62000234565b600054610100900460ff1615808015620000465750600054600160ff909116105b8062000076575062000063306200018a60201b620005511760201c565b15801562000076575060005460ff166001145b620000df5760405162461bcd60e51b815260206004820152602e60248201527f496e697469616c697a61626c653a20636f6e747261637420697320616c72656160448201526d191e481a5b9a5d1a585b1a5e995960921b60648201526084015b60405180910390fd5b6000805460ff19166001179055801562000103576000805461ff0019166101001790555b603280546001600160a01b0319166001600160a01b0384161790556200013e8373420000000000000000000000000000000000001062000199565b801562000185576000805461ff0019169055604051600181527f7f26b83ff96e1f2b6a682f133852f6798a09c465da95921460cefb38474024989060200160405180910390a15b505050565b6001600160a01b03163b151590565b600054610100900460ff16620002065760405162461bcd60e51b815260206004820152602b60248201527f496e697469616c697a61626c653a20636f6e7472616374206973206e6f74206960448201526a6e697469616c697a696e6760a81b6064820152608401620000d6565b600380546001600160a01b039384166001600160a01b03199182161790915560048054929093169116179055565b612c4d80620002446000396000f3fe6080604052600436106101795760003560e01c80637f46ddb2116100cb578063927ede2d1161007f578063b1a1a88211610059578063b1a1a882146104fe578063c89701a214610511578063e11013dd1461053e57600080fd5b8063927ede2d146104a05780639a2ac6d5146104cb578063a9f9e675146104de57600080fd5b806387087623116100b0578063870876231461043a5780638f601f661461045a57806391c49bf8146103ef57600080fd5b80637f46ddb2146103ef578063838b25201461041a57600080fd5b80633cb747bf1161012d57806354fd4d501161010757806354fd4d501461035457806358a997f6146103aa5780635c975abb146103ca57600080fd5b80633cb747bf146102e7578063485cc95514610314578063540abf731461033457600080fd5b80631532ec341161015e5780631532ec341461026a5780631635f5fd1461027d57806335e80ab31461029057600080fd5b80630166a07a1461023757806309fc88431461025757600080fd5b3661023257333b15610212576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152603760248201527f5374616e646172644272696467653a2066756e6374696f6e2063616e206f6e6c60448201527f792062652063616c6c65642066726f6d20616e20454f4100000000000000000060648201526084015b60405180910390fd5b610230333362030d406040518060200160405280600081525061056d565b005b600080fd5b34801561024357600080fd5b506102306102523660046126b1565b610580565b610230610265366004612762565b61099a565b6102306102783660046127b5565b610a71565b61023061028b3660046127b5565b610a85565b34801561029c57600080fd5b506032546102bd9073ffffffffffffffffffffffffffffffffffffffff1681565b60405173ffffffffffffffffffffffffffffffffffffffff90911681526020015b60405180910390f35b3480156102f357600080fd5b506003546102bd9073ffffffffffffffffffffffffffffffffffffffff1681565b34801561032057600080fd5b5061023061032f366004612828565b610f4e565b34801561034057600080fd5b5061023061034f366004612861565b611137565b34801561036057600080fd5b5061039d6040518060400160405280600581526020017f322e312e3000000000000000000000000000000000000000000000000000000081525081565b6040516102de919061294e565b3480156103b657600080fd5b506102306103c5366004612961565b61117c565b3480156103d657600080fd5b506103df611250565b60405190151581526020016102de565b3480156103fb57600080fd5b5060045473ffffffffffffffffffffffffffffffffffffffff166102bd565b34801561042657600080fd5b50610230610435366004612861565b6112e9565b34801561044657600080fd5b50610230610455366004612961565b61132e565b34801561046657600080fd5b50610492610475366004612828565b600260209081526000928352604080842090915290825290205481565b6040519081526020016102de565b3480156104ac57600080fd5b5060035473ffffffffffffffffffffffffffffffffffffffff166102bd565b6102306104d93660046129e4565b611402565b3480156104ea57600080fd5b506102306104f93660046126b1565b611444565b61023061050c366004612762565b611453565b34801561051d57600080fd5b506004546102bd9073ffffffffffffffffffffffffffffffffffffffff1681565b61023061054c3660046129e4565b611524565b73ffffffffffffffffffffffffffffffffffffffff163b151590565b61057a8484348585611567565b50505050565b60035473ffffffffffffffffffffffffffffffffffffffff1633148015610653575060048054600354604080517f6e296e45000000000000000000000000000000000000000000000000000000008152905173ffffffffffffffffffffffffffffffffffffffff938416949390921692636e296e459282820192602092908290030181865afa158015610617573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061063b9190612a47565b73ffffffffffffffffffffffffffffffffffffffff16145b610705576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152604160248201527f5374616e646172644272696467653a2066756e6374696f6e2063616e206f6e6c60448201527f792062652063616c6c65642066726f6d20746865206f7468657220627269646760648201527f6500000000000000000000000000000000000000000000000000000000000000608482015260a401610209565b61070d611250565b15610774576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601660248201527f5374616e646172644272696467653a20706175736564000000000000000000006044820152606401610209565b61077d87611731565b156108cb5761078c8787611793565b61083e576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152604a60248201527f5374616e646172644272696467653a2077726f6e672072656d6f746520746f6b60448201527f656e20666f72204f7074696d69736d204d696e7461626c65204552433230206c60648201527f6f63616c20746f6b656e00000000000000000000000000000000000000000000608482015260a401610209565b6040517f40c10f1900000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff8581166004830152602482018590528816906340c10f1990604401600060405180830381600087803b1580156108ae57600080fd5b505af11580156108c2573d6000803e3d6000fd5b5050505061094d565b73ffffffffffffffffffffffffffffffffffffffff8088166000908152600260209081526040808320938a1683529290522054610909908490612a93565b73ffffffffffffffffffffffffffffffffffffffff8089166000818152600260209081526040808320948c168352939052919091209190915561094d9085856118b3565b610991878787878787878080601f01602080910402602001604051908101604052809392919081815260200183838082843760009201919091525061198792505050565b50505050505050565b333b15610a29576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152603760248201527f5374616e646172644272696467653a2066756e6374696f6e2063616e206f6e6c60448201527f792062652063616c6c65642066726f6d20616e20454f410000000000000000006064820152608401610209565b610a6c3333348686868080601f01602080910402602001604051908101604052809392919081815260200183838082843760009201919091525061156792505050565b505050565b610a7e8585858585610a85565b5050505050565b60035473ffffffffffffffffffffffffffffffffffffffff1633148015610b58575060048054600354604080517f6e296e45000000000000000000000000000000000000000000000000000000008152905173ffffffffffffffffffffffffffffffffffffffff938416949390921692636e296e459282820192602092908290030181865afa158015610b1c573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610b409190612a47565b73ffffffffffffffffffffffffffffffffffffffff16145b610c0a576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152604160248201527f5374616e646172644272696467653a2066756e6374696f6e2063616e206f6e6c60448201527f792062652063616c6c65642066726f6d20746865206f7468657220627269646760648201527f6500000000000000000000000000000000000000000000000000000000000000608482015260a401610209565b610c12611250565b15610c79576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601660248201527f5374616e646172644272696467653a20706175736564000000000000000000006044820152606401610209565b823414610d08576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152603a60248201527f5374616e646172644272696467653a20616d6f756e742073656e7420646f657360448201527f206e6f74206d6174636820616d6f756e742072657175697265640000000000006064820152608401610209565b3073ffffffffffffffffffffffffffffffffffffffff851603610dad576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602360248201527f5374616e646172644272696467653a2063616e6e6f742073656e6420746f207360448201527f656c6600000000000000000000000000000000000000000000000000000000006064820152608401610209565b60035473ffffffffffffffffffffffffffffffffffffffff90811690851603610e58576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602860248201527f5374616e646172644272696467653a2063616e6e6f742073656e6420746f206d60448201527f657373656e6765720000000000000000000000000000000000000000000000006064820152608401610209565b610e9a85858585858080601f016020809104026020016040519081016040528093929190818152602001838380828437600092019190915250611a1592505050565b6000610eb7855a8660405180602001604052806000815250611a88565b905080610f46576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602360248201527f5374616e646172644272696467653a20455448207472616e736665722066616960448201527f6c656400000000000000000000000000000000000000000000000000000000006064820152608401610209565b505050505050565b600054610100900460ff1615808015610f6e5750600054600160ff909116105b80610f885750303b158015610f88575060005460ff166001145b611014576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602e60248201527f496e697469616c697a61626c653a20636f6e747261637420697320616c72656160448201527f647920696e697469616c697a65640000000000000000000000000000000000006064820152608401610209565b600080547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00166001179055801561107257600080547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00ff166101001790555b603280547fffffffffffffffffffffffff00000000000000000000000000000000000000001673ffffffffffffffffffffffffffffffffffffffff84161790556110d083734200000000000000000000000000000000000010611aa2565b8015610a6c57600080547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00ff169055604051600181527f7f26b83ff96e1f2b6a682f133852f6798a09c465da95921460cefb38474024989060200160405180910390a1505050565b61099187873388888888888080601f016020809104026020016040519081016040528093929190818152602001838380828437600092019190915250611b8c92505050565b333b1561120b576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152603760248201527f5374616e646172644272696467653a2066756e6374696f6e2063616e206f6e6c60448201527f792062652063616c6c65642066726f6d20616e20454f410000000000000000006064820152608401610209565b610f4686863333888888888080601f016020809104026020016040519081016040528093929190818152602001838380828437600092019190915250611eb792505050565b603254604080517f5c975abb000000000000000000000000000000000000000000000000000000008152905160009273ffffffffffffffffffffffffffffffffffffffff1691635c975abb9160048083019260209291908290030181865afa1580156112c0573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906112e49190612aaa565b905090565b61099187873388888888888080601f016020809104026020016040519081016040528093929190818152602001838380828437600092019190915250611eb792505050565b333b156113bd576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152603760248201527f5374616e646172644272696467653a2066756e6374696f6e2063616e206f6e6c60448201527f792062652063616c6c65642066726f6d20616e20454f410000000000000000006064820152608401610209565b610f4686863333888888888080601f016020809104026020016040519081016040528093929190818152602001838380828437600092019190915250611b8c92505050565b61057a33858585858080601f01602080910402602001604051908101604052809392919081815260200183838082843760009201919091525061056d92505050565b61099187878787878787610580565b333b156114e2576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152603760248201527f5374616e646172644272696467653a2066756e6374696f6e2063616e206f6e6c60448201527f792062652063616c6c65642066726f6d20616e20454f410000000000000000006064820152608401610209565b610a6c33338585858080601f01602080910402602001604051908101604052809392919081815260200183838082843760009201919091525061056d92505050565b61057a3385348686868080601f01602080910402602001604051908101604052809392919081815260200183838082843760009201919091525061156792505050565b8234146115f6576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152603e60248201527f5374616e646172644272696467653a206272696467696e6720455448206d757360448201527f7420696e636c7564652073756666696369656e74204554482076616c756500006064820152608401610209565b61160285858584611ec6565b60035460045460405173ffffffffffffffffffffffffffffffffffffffff92831692633dbb202b9287929116907f1635f5fd0000000000000000000000000000000000000000000000000000000090611665908b908b9086908a90602401612acc565b604080517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe08184030181529181526020820180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff167fffffffff000000000000000000000000000000000000000000000000000000009485161790525160e086901b90921682526116f892918890600401612b15565b6000604051808303818588803b15801561171157600080fd5b505af1158015611725573d6000803e3d6000fd5b50505050505050505050565b600061175d827f1d1d8b6300000000000000000000000000000000000000000000000000000000611f39565b8061178d575061178d827fec4fc8e300000000000000000000000000000000000000000000000000000000611f39565b92915050565b60006117bf837f1d1d8b6300000000000000000000000000000000000000000000000000000000611f39565b15611868578273ffffffffffffffffffffffffffffffffffffffff1663c01e1bd66040518163ffffffff1660e01b8152600401602060405180830381865afa15801561180f573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906118339190612a47565b73ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1614905061178d565b8273ffffffffffffffffffffffffffffffffffffffff1663d6c0b2c46040518163ffffffff1660e01b8152600401602060405180830381865afa15801561180f573d6000803e3d6000fd5b60405173ffffffffffffffffffffffffffffffffffffffff8316602482015260448101829052610a6c9084907fa9059cbb00000000000000000000000000000000000000000000000000000000906064015b604080517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe08184030181529190526020810180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff167fffffffff0000000000000000000000000000000000000000000000000000000090931692909217909152611f5c565b8373ffffffffffffffffffffffffffffffffffffffff168573ffffffffffffffffffffffffffffffffffffffff168773ffffffffffffffffffffffffffffffffffffffff167f3ceee06c1e37648fcbb6ed52e17b3e1f275a1f8c7b22a84b2b84732431e046b38686866040516119ff93929190612b5a565b60405180910390a4610f46868686868686612068565b8273ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff167f2ac69ee804d9a7a0984249f508dfab7cb2534b465b6ce1580f99a38ba9c5e6318484604051611a74929190612b98565b60405180910390a361057a848484846120f0565b600080600080845160208601878a8af19695505050505050565b600054610100900460ff16611b39576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602b60248201527f496e697469616c697a61626c653a20636f6e7472616374206973206e6f74206960448201527f6e697469616c697a696e670000000000000000000000000000000000000000006064820152608401610209565b6003805473ffffffffffffffffffffffffffffffffffffffff9384167fffffffffffffffffffffffff00000000000000000000000000000000000000009182161790915560048054929093169116179055565b611b9587611731565b15611ce357611ba48787611793565b611c56576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152604a60248201527f5374616e646172644272696467653a2077726f6e672072656d6f746520746f6b60448201527f656e20666f72204f7074696d69736d204d696e7461626c65204552433230206c60648201527f6f63616c20746f6b656e00000000000000000000000000000000000000000000608482015260a401610209565b6040517f9dc29fac00000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff868116600483015260248201859052881690639dc29fac90604401600060405180830381600087803b158015611cc657600080fd5b505af1158015611cda573d6000803e3d6000fd5b50505050611d77565b611d0573ffffffffffffffffffffffffffffffffffffffff881686308661215d565b73ffffffffffffffffffffffffffffffffffffffff8088166000908152600260209081526040808320938a1683529290522054611d43908490612bb1565b73ffffffffffffffffffffffffffffffffffffffff8089166000908152600260209081526040808320938b16835292905220555b611d858787878787866121bb565b60035460045460405173ffffffffffffffffffffffffffffffffffffffff92831692633dbb202b9216907f0166a07a0000000000000000000000000000000000000000000000000000000090611de9908b908d908c908c908c908b90602401612bc9565b604080517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe08184030181529181526020820180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff167fffffffff000000000000000000000000000000000000000000000000000000009485161790525160e085901b9092168252611e7c92918790600401612b15565b600060405180830381600087803b158015611e9657600080fd5b505af1158015611eaa573d6000803e3d6000fd5b5050505050505050505050565b61099187878787878787611b8c565b8273ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff167f35d79ab81f2b2017e19afb5c5571778877782d7a8786f5907f93b0f4702f4f238484604051611f25929190612b98565b60405180910390a361057a84848484612249565b6000611f44836122a8565b8015611f555750611f55838361230c565b9392505050565b6000611fbe826040518060400160405280602081526020017f5361666545524332303a206c6f772d6c6576656c2063616c6c206661696c65648152508573ffffffffffffffffffffffffffffffffffffffff166123db9092919063ffffffff16565b805190915015610a6c5780806020019051810190611fdc9190612aaa565b610a6c576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602a60248201527f5361666545524332303a204552433230206f7065726174696f6e20646964206e60448201527f6f742073756363656564000000000000000000000000000000000000000000006064820152608401610209565b8373ffffffffffffffffffffffffffffffffffffffff168573ffffffffffffffffffffffffffffffffffffffff168773ffffffffffffffffffffffffffffffffffffffff167fd59c65b35445225835c83f50b6ede06a7be047d22e357073e250d9af537518cd8686866040516120e093929190612b5a565b60405180910390a4505050505050565b8273ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff167f31b2166ff604fc5672ea5df08a78081d2bc6d746cadce880747f3643d819e83d848460405161214f929190612b98565b60405180910390a350505050565b60405173ffffffffffffffffffffffffffffffffffffffff8085166024830152831660448201526064810182905261057a9085907f23b872dd0000000000000000000000000000000000000000000000000000000090608401611905565b8373ffffffffffffffffffffffffffffffffffffffff168573ffffffffffffffffffffffffffffffffffffffff168773ffffffffffffffffffffffffffffffffffffffff167f718594027abd4eaed59f95162563e0cc6d0e8d5b86b1c7be8b1b0ac3343d039686868660405161223393929190612b5a565b60405180910390a4610f468686868686866123f2565b8273ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff167f2849b43074093a05396b6f2a937dee8565b15a48a7b3d4bffb732a5017380af5848460405161214f929190612b98565b60006122d4827f01ffc9a70000000000000000000000000000000000000000000000000000000061230c565b801561178d5750612305827fffffffff0000000000000000000000000000000000000000000000000000000061230c565b1592915050565b604080517fffffffff000000000000000000000000000000000000000000000000000000008316602480830191909152825180830390910181526044909101909152602080820180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff167f01ffc9a700000000000000000000000000000000000000000000000000000000178152825160009392849283928392918391908a617530fa92503d915060005190508280156123c4575060208210155b80156123d05750600081115b979650505050505050565b60606123ea848460008561246a565b949350505050565b8373ffffffffffffffffffffffffffffffffffffffff168573ffffffffffffffffffffffffffffffffffffffff168773ffffffffffffffffffffffffffffffffffffffff167f7ff126db8024424bbfd9826e8ab82ff59136289ea440b04b39a0df1b03b9cabf8686866040516120e093929190612b5a565b6060824710156124fc576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602660248201527f416464726573733a20696e73756666696369656e742062616c616e636520666f60448201527f722063616c6c00000000000000000000000000000000000000000000000000006064820152608401610209565b73ffffffffffffffffffffffffffffffffffffffff85163b61257a576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601d60248201527f416464726573733a2063616c6c20746f206e6f6e2d636f6e74726163740000006044820152606401610209565b6000808673ffffffffffffffffffffffffffffffffffffffff1685876040516125a39190612c24565b60006040518083038185875af1925050503d80600081146125e0576040519150601f19603f3d011682016040523d82523d6000602084013e6125e5565b606091505b50915091506123d0828286606083156125ff575081611f55565b82511561260f5782518084602001fd5b816040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610209919061294e565b73ffffffffffffffffffffffffffffffffffffffff8116811461266557600080fd5b50565b60008083601f84011261267a57600080fd5b50813567ffffffffffffffff81111561269257600080fd5b6020830191508360208285010111156126aa57600080fd5b9250929050565b600080600080600080600060c0888a0312156126cc57600080fd5b87356126d781612643565b965060208801356126e781612643565b955060408801356126f781612643565b9450606088013561270781612643565b93506080880135925060a088013567ffffffffffffffff81111561272a57600080fd5b6127368a828b01612668565b989b979a50959850939692959293505050565b803563ffffffff8116811461275d57600080fd5b919050565b60008060006040848603121561277757600080fd5b61278084612749565b9250602084013567ffffffffffffffff81111561279c57600080fd5b6127a886828701612668565b9497909650939450505050565b6000806000806000608086880312156127cd57600080fd5b85356127d881612643565b945060208601356127e881612643565b935060408601359250606086013567ffffffffffffffff81111561280b57600080fd5b61281788828901612668565b969995985093965092949392505050565b6000806040838503121561283b57600080fd5b823561284681612643565b9150602083013561285681612643565b809150509250929050565b600080600080600080600060c0888a03121561287c57600080fd5b873561288781612643565b9650602088013561289781612643565b955060408801356128a781612643565b9450606088013593506128bc60808901612749565b925060a088013567ffffffffffffffff81111561272a57600080fd5b60005b838110156128f35781810151838201526020016128db565b8381111561057a5750506000910152565b6000815180845261291c8160208601602086016128d8565b601f017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0169290920160200192915050565b602081526000611f556020830184612904565b60008060008060008060a0878903121561297a57600080fd5b863561298581612643565b9550602087013561299581612643565b9450604087013593506129aa60608801612749565b9250608087013567ffffffffffffffff8111156129c657600080fd5b6129d289828a01612668565b979a9699509497509295939492505050565b600080600080606085870312156129fa57600080fd5b8435612a0581612643565b9350612a1360208601612749565b9250604085013567ffffffffffffffff811115612a2f57600080fd5b612a3b87828801612668565b95989497509550505050565b600060208284031215612a5957600080fd5b8151611f5581612643565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b600082821015612aa557612aa5612a64565b500390565b600060208284031215612abc57600080fd5b81518015158114611f5557600080fd5b600073ffffffffffffffffffffffffffffffffffffffff808716835280861660208401525083604083015260806060830152612b0b6080830184612904565b9695505050505050565b73ffffffffffffffffffffffffffffffffffffffff84168152606060208201526000612b446060830185612904565b905063ffffffff83166040830152949350505050565b73ffffffffffffffffffffffffffffffffffffffff84168152826020820152606060408201526000612b8f6060830184612904565b95945050505050565b8281526040602082015260006123ea6040830184612904565b60008219821115612bc457612bc4612a64565b500190565b600073ffffffffffffffffffffffffffffffffffffffff80891683528088166020840152808716604084015280861660608401525083608083015260c060a0830152612c1860c0830184612904565b98975050505050505050565b60008251612c368184602087016128d8565b919091019291505056fea164736f6c634300080f000a", -} - -// 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) -} - -// 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 0x485cc955. -// -// Solidity: function initialize(address _messenger, address _superchainConfig) returns() -func (_L1StandardBridge *L1StandardBridgeTransactor) Initialize(opts *bind.TransactOpts, _messenger common.Address, _superchainConfig common.Address) (*types.Transaction, error) { - return _L1StandardBridge.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 (_L1StandardBridge *L1StandardBridgeSession) Initialize(_messenger common.Address, _superchainConfig common.Address) (*types.Transaction, error) { - return _L1StandardBridge.Contract.Initialize(&_L1StandardBridge.TransactOpts, _messenger, _superchainConfig) -} - -// Initialize is a paid mutator transaction binding the contract method 0x485cc955. -// -// Solidity: function initialize(address _messenger, address _superchainConfig) returns() -func (_L1StandardBridge *L1StandardBridgeTransactorSession) Initialize(_messenger common.Address, _superchainConfig common.Address) (*types.Transaction, error) { - return _L1StandardBridge.Contract.Initialize(&_L1StandardBridge.TransactOpts, _messenger, _superchainConfig) -} - -// 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/indexer/bindings/l2crossdomainmessenger.go b/indexer/bindings/l2crossdomainmessenger.go deleted file mode 100644 index ff7241f5e272..000000000000 --- a/indexer/bindings/l2crossdomainmessenger.go +++ /dev/null @@ -1,1538 +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 -) - -// 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: "0x60806040523480156200001157600080fd5b506200001e600062000024565b62000239565b600054600160a81b900460ff16158080156200004d57506000546001600160a01b90910460ff16105b806200008457506200006a306200017360201b620013071760201c565b158015620000845750600054600160a01b900460ff166001145b620000ed5760405162461bcd60e51b815260206004820152602e60248201527f496e697469616c697a61626c653a20636f6e747261637420697320616c72656160448201526d191e481a5b9a5d1a585b1a5e995960921b60648201526084015b60405180910390fd5b6000805460ff60a01b1916600160a01b17905580156200011b576000805460ff60a81b1916600160a81b1790555b620001268262000182565b80156200016f576000805460ff60a81b19169055604051600181527f7f26b83ff96e1f2b6a682f133852f6798a09c465da95921460cefb38474024989060200160405180910390a15b5050565b6001600160a01b03163b151590565b600054600160a81b900460ff16620001f15760405162461bcd60e51b815260206004820152602b60248201527f496e697469616c697a61626c653a20636f6e7472616374206973206e6f74206960448201526a6e697469616c697a696e6760a81b6064820152608401620000e4565b60cc546001600160a01b0316620002175760cc80546001600160a01b03191661dead1790555b60cf80546001600160a01b0319166001600160a01b0392909216919091179055565b611c8280620002496000396000f3fe60806040526004361061016a5760003560e01c806383a74074116100cb578063b1b1b2091161007f578063d764ad0b11610059578063d764ad0b146103c7578063db505d80146103da578063ecc704281461040757600080fd5b8063b1b1b20914610357578063b28ade2514610387578063c4d66de8146103a757600080fd5b80639fce812c116100b05780639fce812c146102fc578063a4e7f8bd14610327578063a7119869146102fc57600080fd5b806383a74074146102e55780638cbeeef21461020957600080fd5b80634c1d6a69116101225780635644cfdf116101075780635644cfdf146102755780635c975abb1461028b5780636e296e45146102ab57600080fd5b80634c1d6a691461020957806354fd4d501461021f57600080fd5b80632828d7e8116101535780632828d7e8146101b75780633dbb202b146101cc5780633f827a5a146101e157600080fd5b8063028f85f71461016f5780630c568498146101a2575b600080fd5b34801561017b57600080fd5b50610184601081565b60405167ffffffffffffffff90911681526020015b60405180910390f35b3480156101ae57600080fd5b50610184603f81565b3480156101c357600080fd5b50610184604081565b6101df6101da36600461177b565b61046c565b005b3480156101ed57600080fd5b506101f6600181565b60405161ffff9091168152602001610199565b34801561021557600080fd5b50610184619c4081565b34801561022b57600080fd5b506102686040518060400160405280600581526020017f322e302e3000000000000000000000000000000000000000000000000000000081525081565b604051610199919061184d565b34801561028157600080fd5b5061018461138881565b34801561029757600080fd5b5060005b6040519015158152602001610199565b3480156102b757600080fd5b506102c06106c9565b60405173ffffffffffffffffffffffffffffffffffffffff9091168152602001610199565b3480156102f157600080fd5b5061018462030d4081565b34801561030857600080fd5b5060cf5473ffffffffffffffffffffffffffffffffffffffff166102c0565b34801561033357600080fd5b5061029b610342366004611867565b60ce6020526000908152604090205460ff1681565b34801561036357600080fd5b5061029b610372366004611867565b60cb6020526000908152604090205460ff1681565b34801561039357600080fd5b506101846103a2366004611880565b6107b5565b3480156103b357600080fd5b506101df6103c23660046118d4565b610823565b6101df6103d53660046118f1565b610a22565b3480156103e657600080fd5b5060cf546102c09073ffffffffffffffffffffffffffffffffffffffff1681565b34801561041357600080fd5b5061045e60cd547dffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff167e010000000000000000000000000000000000000000000000000000000000001790565b604051908152602001610199565b60cf5461059e9073ffffffffffffffffffffffffffffffffffffffff166104948585856107b5565b347fd764ad0b0000000000000000000000000000000000000000000000000000000061050060cd547dffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff167e010000000000000000000000000000000000000000000000000000000000001790565b338a34898c8c60405160240161051c97969594939291906119c0565b604080517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe08184030181529190526020810180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff167fffffffff0000000000000000000000000000000000000000000000000000000090931692909217909152611323565b8373ffffffffffffffffffffffffffffffffffffffff167fcb0f7ffd78f9aee47a248fae8db181db6eee833039123e026dcbff529522e52a33858561062360cd547dffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff167e010000000000000000000000000000000000000000000000000000000000001790565b86604051610635959493929190611a1f565b60405180910390a260405134815233907f8ebb2ec2465bdb2a06a66fc37a0963af8a2a6a1479d81d56fdb8cbb98096d5469060200160405180910390a2505060cd80547dffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff808216600101167fffff0000000000000000000000000000000000000000000000000000000000009091161790555050565b60cc5460009073ffffffffffffffffffffffffffffffffffffffff167fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff215301610798576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152603560248201527f43726f7373446f6d61696e4d657373656e6765723a2078446f6d61696e4d657360448201527f7361676553656e646572206973206e6f7420736574000000000000000000000060648201526084015b60405180910390fd5b5060cc5473ffffffffffffffffffffffffffffffffffffffff1690565b6000611388619c4080603f6107d1604063ffffffff8816611a9c565b6107db9190611acc565b6107e6601088611a9c565b6107f39062030d40611b1a565b6107fd9190611b1a565b6108079190611b1a565b6108119190611b1a565b61081b9190611b1a565b949350505050565b6000547501000000000000000000000000000000000000000000900460ff161580801561086e575060005460017401000000000000000000000000000000000000000090910460ff16105b806108a05750303b1580156108a0575060005474010000000000000000000000000000000000000000900460ff166001145b61092c576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602e60248201527f496e697469616c697a61626c653a20636f6e747261637420697320616c72656160448201527f647920696e697469616c697a6564000000000000000000000000000000000000606482015260840161078f565b600080547fffffffffffffffffffffff00ffffffffffffffffffffffffffffffffffffffff167401000000000000000000000000000000000000000017905580156109b257600080547fffffffffffffffffffff00ffffffffffffffffffffffffffffffffffffffffff1675010000000000000000000000000000000000000000001790555b6109bb826113b1565b8015610a1e57600080547fffffffffffffffffffff00ffffffffffffffffffffffffffffffffffffffffff169055604051600181527f7f26b83ff96e1f2b6a682f133852f6798a09c465da95921460cefb38474024989060200160405180910390a15b5050565b60f087901c60028110610add576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152604d60248201527f43726f7373446f6d61696e4d657373656e6765723a206f6e6c7920766572736960448201527f6f6e2030206f722031206d657373616765732061726520737570706f7274656460648201527f20617420746869732074696d6500000000000000000000000000000000000000608482015260a40161078f565b8061ffff16600003610bd2576000610b2e878986868080601f0160208091040260200160405190810160405280939291908181526020018383808284376000920191909152508f92506114ed915050565b600081815260cb602052604090205490915060ff1615610bd0576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152603760248201527f43726f7373446f6d61696e4d657373656e6765723a206c65676163792077697460448201527f6864726177616c20616c72656164792072656c61796564000000000000000000606482015260840161078f565b505b6000610c18898989898989898080601f01602080910402602001604051908101604052809392919081815260200183838082843760009201919091525061150c92505050565b9050610c6160cf54337fffffffffffffffffffffffffeeeeffffffffffffffffffffffffffffffffeeef0173ffffffffffffffffffffffffffffffffffffffff90811691161490565b15610c9957853414610c7557610c75611b46565b600081815260ce602052604090205460ff1615610c9457610c94611b46565b610deb565b3415610d4d576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152605060248201527f43726f7373446f6d61696e4d657373656e6765723a2076616c7565206d75737460448201527f206265207a65726f20756e6c657373206d6573736167652069732066726f6d2060648201527f612073797374656d206164647265737300000000000000000000000000000000608482015260a40161078f565b600081815260ce602052604090205460ff16610deb576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152603060248201527f43726f7373446f6d61696e4d657373656e6765723a206d65737361676520636160448201527f6e6e6f74206265207265706c6179656400000000000000000000000000000000606482015260840161078f565b610df48761152f565b15610ea7576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152604360248201527f43726f7373446f6d61696e4d657373656e6765723a2063616e6e6f742073656e60448201527f64206d65737361676520746f20626c6f636b65642073797374656d206164647260648201527f6573730000000000000000000000000000000000000000000000000000000000608482015260a40161078f565b600081815260cb602052604090205460ff1615610f46576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152603660248201527f43726f7373446f6d61696e4d657373656e6765723a206d65737361676520686160448201527f7320616c7265616479206265656e2072656c6179656400000000000000000000606482015260840161078f565b610f6785610f58611388619c40611b1a565b67ffffffffffffffff16611584565b1580610f8d575060cc5473ffffffffffffffffffffffffffffffffffffffff1661dead14155b156110a657600081815260ce602052604080822080547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff001660011790555182917f99d0e048484baa1b1540b1367cb128acd7ab2946d1ed91ec10e3c85e4bf51b8f91a27fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff320161109f576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602d60248201527f43726f7373446f6d61696e4d657373656e6765723a206661696c656420746f2060448201527f72656c6179206d65737361676500000000000000000000000000000000000000606482015260840161078f565b50506112fe565b60cc80547fffffffffffffffffffffffff00000000000000000000000000000000000000001673ffffffffffffffffffffffffffffffffffffffff8a16179055600061113788619c405a6110fa9190611b75565b8988888080601f0160208091040260200160405190810160405280939291908181526020018383808284376000920191909152506115a292505050565b60cc80547fffffffffffffffffffffffff00000000000000000000000000000000000000001661dead179055905080156111ed57600082815260cb602052604090205460ff161561118a5761118a611b46565b600082815260cb602052604080822080547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff001660011790555183917f4641df4a962071e12719d8c8c8e5ac7fc4d97b927346a3d7a335b1f7517e133c91a26112fa565b600082815260ce602052604080822080547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff001660011790555183917f99d0e048484baa1b1540b1367cb128acd7ab2946d1ed91ec10e3c85e4bf51b8f91a27fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff32016112fa576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602d60248201527f43726f7373446f6d61696e4d657373656e6765723a206661696c656420746f2060448201527f72656c6179206d65737361676500000000000000000000000000000000000000606482015260840161078f565b5050505b50505050505050565b73ffffffffffffffffffffffffffffffffffffffff163b151590565b6040517fc2b3e5ac0000000000000000000000000000000000000000000000000000000081527342000000000000000000000000000000000000169063c2b3e5ac90849061137990889088908790600401611b8c565b6000604051808303818588803b15801561139257600080fd5b505af11580156113a6573d6000803e3d6000fd5b505050505050505050565b6000547501000000000000000000000000000000000000000000900460ff1661145c576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602b60248201527f496e697469616c697a61626c653a20636f6e7472616374206973206e6f74206960448201527f6e697469616c697a696e67000000000000000000000000000000000000000000606482015260840161078f565b60cc5473ffffffffffffffffffffffffffffffffffffffff166114a65760cc80547fffffffffffffffffffffffff00000000000000000000000000000000000000001661dead1790555b60cf80547fffffffffffffffffffffffff00000000000000000000000000000000000000001673ffffffffffffffffffffffffffffffffffffffff92909216919091179055565b60006114fb858585856115bc565b805190602001209050949350505050565b600061151c878787878787611655565b8051906020012090509695505050505050565b600073ffffffffffffffffffffffffffffffffffffffff821630148061157e575073ffffffffffffffffffffffffffffffffffffffff8216734200000000000000000000000000000000000016145b92915050565b600080603f83619c4001026040850201603f5a021015949350505050565b600080600080845160208601878a8af19695505050505050565b6060848484846040516024016115d59493929190611bd4565b604080517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe08184030181529190526020810180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff167fcbd4ece9000000000000000000000000000000000000000000000000000000001790529050949350505050565b606086868686868660405160240161167296959493929190611c1e565b604080517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe08184030181529190526020810180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff167fd764ad0b0000000000000000000000000000000000000000000000000000000017905290509695505050505050565b73ffffffffffffffffffffffffffffffffffffffff8116811461171657600080fd5b50565b60008083601f84011261172b57600080fd5b50813567ffffffffffffffff81111561174357600080fd5b60208301915083602082850101111561175b57600080fd5b9250929050565b803563ffffffff8116811461177657600080fd5b919050565b6000806000806060858703121561179157600080fd5b843561179c816116f4565b9350602085013567ffffffffffffffff8111156117b857600080fd5b6117c487828801611719565b90945092506117d7905060408601611762565b905092959194509250565b6000815180845260005b81811015611808576020818501810151868301820152016117ec565b8181111561181a576000602083870101525b50601f017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0169290920160200192915050565b60208152600061186060208301846117e2565b9392505050565b60006020828403121561187957600080fd5b5035919050565b60008060006040848603121561189557600080fd5b833567ffffffffffffffff8111156118ac57600080fd5b6118b886828701611719565b90945092506118cb905060208501611762565b90509250925092565b6000602082840312156118e657600080fd5b8135611860816116f4565b600080600080600080600060c0888a03121561190c57600080fd5b87359650602088013561191e816116f4565b9550604088013561192e816116f4565b9450606088013593506080880135925060a088013567ffffffffffffffff81111561195857600080fd5b6119648a828b01611719565b989b979a50959850939692959293505050565b8183528181602085013750600060208284010152600060207fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0601f840116840101905092915050565b878152600073ffffffffffffffffffffffffffffffffffffffff808916602084015280881660408401525085606083015263ffffffff8516608083015260c060a0830152611a1260c083018486611977565b9998505050505050505050565b73ffffffffffffffffffffffffffffffffffffffff86168152608060208201526000611a4f608083018688611977565b905083604083015263ffffffff831660608301529695505050505050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b600067ffffffffffffffff80831681851681830481118215151615611ac357611ac3611a6d565b02949350505050565b600067ffffffffffffffff80841680611b0e577f4e487b7100000000000000000000000000000000000000000000000000000000600052601260045260246000fd5b92169190910492915050565b600067ffffffffffffffff808316818516808303821115611b3d57611b3d611a6d565b01949350505050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052600160045260246000fd5b600082821015611b8757611b87611a6d565b500390565b73ffffffffffffffffffffffffffffffffffffffff8416815267ffffffffffffffff83166020820152606060408201526000611bcb60608301846117e2565b95945050505050565b600073ffffffffffffffffffffffffffffffffffffffff808716835280861660208401525060806040830152611c0d60808301856117e2565b905082606083015295945050505050565b868152600073ffffffffffffffffffffffffffffffffffffffff808816602084015280871660408401525084606083015283608083015260c060a0830152611c6960c08301846117e2565b9897505050505050505056fea164736f6c634300080f000a", -} - -// 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/indexer/bindings/l2outputoracle.go b/indexer/bindings/l2outputoracle.go deleted file mode 100644 index 1d8934c7c838..000000000000 --- a/indexer/bindings/l2outputoracle.go +++ /dev/null @@ -1,1373 +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 -) - -// 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/indexer/bindings/l2standardbridge.go b/indexer/bindings/l2standardbridge.go deleted file mode 100644 index 8a935e961a7f..000000000000 --- a/indexer/bindings/l2standardbridge.go +++ /dev/null @@ -1,1785 +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 -) - -// 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: "0x60806040523480156200001157600080fd5b506200001e600062000024565b62000217565b600054610100900460ff1615808015620000455750600054600160ff909116105b8062000075575062000062306200016d60201b620004811760201c565b15801562000075575060005460ff166001145b620000de5760405162461bcd60e51b815260206004820152602e60248201527f496e697469616c697a61626c653a20636f6e747261637420697320616c72656160448201526d191e481a5b9a5d1a585b1a5e995960921b60648201526084015b60405180910390fd5b6000805460ff19166001179055801562000102576000805461ff0019166101001790555b62000122734200000000000000000000000000000000000007836200017c565b801562000169576000805461ff0019169055604051600181527f7f26b83ff96e1f2b6a682f133852f6798a09c465da95921460cefb38474024989060200160405180910390a15b5050565b6001600160a01b03163b151590565b600054610100900460ff16620001e95760405162461bcd60e51b815260206004820152602b60248201527f496e697469616c697a61626c653a20636f6e7472616374206973206e6f74206960448201526a6e697469616c697a696e6760a81b6064820152608401620000d5565b600380546001600160a01b039384166001600160a01b03199182161790915560048054929093169116179055565b612a8380620002276000396000f3fe60806040526004361061012d5760003560e01c8063662a633a116100a5578063927ede2d11610074578063c4d66de811610059578063c4d66de814610421578063c89701a214610441578063e11013dd1461046e57600080fd5b8063927ede2d146103e3578063a3a795481461040e57600080fd5b8063662a633a1461036a5780637f46ddb21461025a578063870876231461037d5780638f601f661461039d57600080fd5b806336c717c1116100fc578063540abf73116100e1578063540abf73146102d857806354fd4d50146102f85780635c975abb1461034e57600080fd5b806336c717c11461025a5780633cb747bf146102ab57600080fd5b80630166a07a1461020157806309fc8843146102215780631635f5fd1461023457806332b7006d1461024757600080fd5b366101fc57333b156101c6576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152603760248201527f5374616e646172644272696467653a2066756e6374696f6e2063616e206f6e6c60448201527f792062652063616c6c65642066726f6d20616e20454f4100000000000000000060648201526084015b60405180910390fd5b6101fa73deaddeaddeaddeaddeaddeaddeaddeaddead000033333462030d406040518060200160405280600081525061049d565b005b600080fd5b34801561020d57600080fd5b506101fa61021c366004612476565b610578565b6101fa61022f366004612527565b61091a565b6101fa61024236600461257a565b6109f1565b6101fa6102553660046125ed565b610e43565b34801561026657600080fd5b5060045473ffffffffffffffffffffffffffffffffffffffff165b60405173ffffffffffffffffffffffffffffffffffffffff90911681526020015b60405180910390f35b3480156102b757600080fd5b506003546102819073ffffffffffffffffffffffffffffffffffffffff1681565b3480156102e457600080fd5b506101fa6102f3366004612641565b610f1d565b34801561030457600080fd5b506103416040518060400160405280600581526020017f312e382e3000000000000000000000000000000000000000000000000000000081525081565b6040516102a2919061272e565b34801561035a57600080fd5b50604051600081526020016102a2565b6101fa610378366004612476565b610f62565b34801561038957600080fd5b506101fa610398366004612741565b610fd5565b3480156103a957600080fd5b506103d56103b83660046127c4565b600260209081526000928352604080842090915290825290205481565b6040519081526020016102a2565b3480156103ef57600080fd5b5060035473ffffffffffffffffffffffffffffffffffffffff16610281565b6101fa61041c366004612741565b6110a9565b34801561042d57600080fd5b506101fa61043c3660046127fd565b6110ed565b34801561044d57600080fd5b506004546102819073ffffffffffffffffffffffffffffffffffffffff1681565b6101fa61047c36600461281a565b611296565b73ffffffffffffffffffffffffffffffffffffffff163b151590565b7fffffffffffffffffffffffff215221522152215221522152215221522153000073ffffffffffffffffffffffffffffffffffffffff8716016104ec576104e785858585856112df565b610570565b60008673ffffffffffffffffffffffffffffffffffffffff1663c01e1bd66040518163ffffffff1660e01b8152600401602060405180830381865afa158015610539573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061055d919061287d565b905061056e878288888888886114a9565b505b505050505050565b60035473ffffffffffffffffffffffffffffffffffffffff163314801561064b575060048054600354604080517f6e296e45000000000000000000000000000000000000000000000000000000008152905173ffffffffffffffffffffffffffffffffffffffff938416949390921692636e296e459282820192602092908290030181865afa15801561060f573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610633919061287d565b73ffffffffffffffffffffffffffffffffffffffff16145b6106fd576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152604160248201527f5374616e646172644272696467653a2066756e6374696f6e2063616e206f6e6c60448201527f792062652063616c6c65642066726f6d20746865206f7468657220627269646760648201527f6500000000000000000000000000000000000000000000000000000000000000608482015260a4016101bd565b610706876117d4565b15610854576107158787611836565b6107c7576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152604a60248201527f5374616e646172644272696467653a2077726f6e672072656d6f746520746f6b60448201527f656e20666f72204f7074696d69736d204d696e7461626c65204552433230206c60648201527f6f63616c20746f6b656e00000000000000000000000000000000000000000000608482015260a4016101bd565b6040517f40c10f1900000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff8581166004830152602482018590528816906340c10f1990604401600060405180830381600087803b15801561083757600080fd5b505af115801561084b573d6000803e3d6000fd5b505050506108d6565b73ffffffffffffffffffffffffffffffffffffffff8088166000908152600260209081526040808320938a16835292905220546108929084906128c9565b73ffffffffffffffffffffffffffffffffffffffff8089166000818152600260209081526040808320948c16835293905291909120919091556108d6908585611956565b61056e878787878787878080601f016020809104026020016040519081016040528093929190818152602001838380828437600092019190915250611a2a92505050565b333b156109a9576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152603760248201527f5374616e646172644272696467653a2066756e6374696f6e2063616e206f6e6c60448201527f792062652063616c6c65642066726f6d20616e20454f4100000000000000000060648201526084016101bd565b6109ec3333348686868080601f0160208091040260200160405190810160405280939291908181526020018383808284376000920191909152506112df92505050565b505050565b60035473ffffffffffffffffffffffffffffffffffffffff1633148015610ac4575060048054600354604080517f6e296e45000000000000000000000000000000000000000000000000000000008152905173ffffffffffffffffffffffffffffffffffffffff938416949390921692636e296e459282820192602092908290030181865afa158015610a88573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610aac919061287d565b73ffffffffffffffffffffffffffffffffffffffff16145b610b76576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152604160248201527f5374616e646172644272696467653a2066756e6374696f6e2063616e206f6e6c60448201527f792062652063616c6c65642066726f6d20746865206f7468657220627269646760648201527f6500000000000000000000000000000000000000000000000000000000000000608482015260a4016101bd565b823414610c05576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152603a60248201527f5374616e646172644272696467653a20616d6f756e742073656e7420646f657360448201527f206e6f74206d6174636820616d6f756e7420726571756972656400000000000060648201526084016101bd565b3073ffffffffffffffffffffffffffffffffffffffff851603610caa576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602360248201527f5374616e646172644272696467653a2063616e6e6f742073656e6420746f207360448201527f656c66000000000000000000000000000000000000000000000000000000000060648201526084016101bd565b60035473ffffffffffffffffffffffffffffffffffffffff90811690851603610d55576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602860248201527f5374616e646172644272696467653a2063616e6e6f742073656e6420746f206d60448201527f657373656e67657200000000000000000000000000000000000000000000000060648201526084016101bd565b610d9785858585858080601f016020809104026020016040519081016040528093929190818152602001838380828437600092019190915250611ab892505050565b6000610db4855a8660405180602001604052806000815250611b59565b905080610570576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602360248201527f5374616e646172644272696467653a20455448207472616e736665722066616960448201527f6c6564000000000000000000000000000000000000000000000000000000000060648201526084016101bd565b333b15610ed2576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152603760248201527f5374616e646172644272696467653a2066756e6374696f6e2063616e206f6e6c60448201527f792062652063616c6c65642066726f6d20616e20454f4100000000000000000060648201526084016101bd565b610f16853333878787878080601f01602080910402602001604051908101604052809392919081815260200183838082843760009201919091525061049d92505050565b5050505050565b61056e87873388888888888080601f0160208091040260200160405190810160405280939291908181526020018383808284376000920191909152506114a992505050565b73ffffffffffffffffffffffffffffffffffffffff8716158015610faf575073ffffffffffffffffffffffffffffffffffffffff861673deaddeaddeaddeaddeaddeaddeaddeaddead0000145b15610fc657610fc185858585856109f1565b61056e565b61056e86888787878787610578565b333b15611064576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152603760248201527f5374616e646172644272696467653a2066756e6374696f6e2063616e206f6e6c60448201527f792062652063616c6c65642066726f6d20616e20454f4100000000000000000060648201526084016101bd565b61057086863333888888888080601f0160208091040260200160405190810160405280939291908181526020018383808284376000920191909152506114a992505050565b610570863387878787878080601f01602080910402602001604051908101604052809392919081815260200183838082843760009201919091525061049d92505050565b600054610100900460ff161580801561110d5750600054600160ff909116105b806111275750303b158015611127575060005460ff166001145b6111b3576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602e60248201527f496e697469616c697a61626c653a20636f6e747261637420697320616c72656160448201527f647920696e697469616c697a656400000000000000000000000000000000000060648201526084016101bd565b600080547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00166001179055801561121157600080547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00ff166101001790555b61122f73420000000000000000000000000000000000000783611b73565b801561129257600080547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00ff169055604051600181527f7f26b83ff96e1f2b6a682f133852f6798a09c465da95921460cefb38474024989060200160405180910390a15b5050565b6112d93385348686868080601f0160208091040260200160405190810160405280939291908181526020018383808284376000920191909152506112df92505050565b50505050565b82341461136e576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152603e60248201527f5374616e646172644272696467653a206272696467696e6720455448206d757360448201527f7420696e636c7564652073756666696369656e74204554482076616c7565000060648201526084016101bd565b61137a85858584611c5d565b60035460045460405173ffffffffffffffffffffffffffffffffffffffff92831692633dbb202b9287929116907f1635f5fd00000000000000000000000000000000000000000000000000000000906113dd908b908b9086908a906024016128e0565b604080517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe08184030181529181526020820180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff167fffffffff000000000000000000000000000000000000000000000000000000009485161790525160e086901b909216825261147092918890600401612929565b6000604051808303818588803b15801561148957600080fd5b505af115801561149d573d6000803e3d6000fd5b50505050505050505050565b6114b2876117d4565b15611600576114c18787611836565b611573576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152604a60248201527f5374616e646172644272696467653a2077726f6e672072656d6f746520746f6b60448201527f656e20666f72204f7074696d69736d204d696e7461626c65204552433230206c60648201527f6f63616c20746f6b656e00000000000000000000000000000000000000000000608482015260a4016101bd565b6040517f9dc29fac00000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff868116600483015260248201859052881690639dc29fac90604401600060405180830381600087803b1580156115e357600080fd5b505af11580156115f7573d6000803e3d6000fd5b50505050611694565b61162273ffffffffffffffffffffffffffffffffffffffff8816863086611cfe565b73ffffffffffffffffffffffffffffffffffffffff8088166000908152600260209081526040808320938a168352929052205461166090849061296e565b73ffffffffffffffffffffffffffffffffffffffff8089166000908152600260209081526040808320938b16835292905220555b6116a2878787878786611d5c565b60035460045460405173ffffffffffffffffffffffffffffffffffffffff92831692633dbb202b9216907f0166a07a0000000000000000000000000000000000000000000000000000000090611706908b908d908c908c908c908b90602401612986565b604080517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe08184030181529181526020820180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff167fffffffff000000000000000000000000000000000000000000000000000000009485161790525160e085901b909216825261179992918790600401612929565b600060405180830381600087803b1580156117b357600080fd5b505af11580156117c7573d6000803e3d6000fd5b5050505050505050505050565b6000611800827f1d1d8b6300000000000000000000000000000000000000000000000000000000611dea565b806118305750611830827fec4fc8e300000000000000000000000000000000000000000000000000000000611dea565b92915050565b6000611862837f1d1d8b6300000000000000000000000000000000000000000000000000000000611dea565b1561190b578273ffffffffffffffffffffffffffffffffffffffff1663c01e1bd66040518163ffffffff1660e01b8152600401602060405180830381865afa1580156118b2573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906118d6919061287d565b73ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff16149050611830565b8273ffffffffffffffffffffffffffffffffffffffff1663d6c0b2c46040518163ffffffff1660e01b8152600401602060405180830381865afa1580156118b2573d6000803e3d6000fd5b60405173ffffffffffffffffffffffffffffffffffffffff83166024820152604481018290526109ec9084907fa9059cbb00000000000000000000000000000000000000000000000000000000906064015b604080517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe08184030181529190526020810180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff167fffffffff0000000000000000000000000000000000000000000000000000000090931692909217909152611e0d565b8373ffffffffffffffffffffffffffffffffffffffff168673ffffffffffffffffffffffffffffffffffffffff168673ffffffffffffffffffffffffffffffffffffffff167fb0444523268717a02698be47d0803aa7468c00acbed2f8bd93a0459cde61dd89868686604051611aa2939291906129e1565b60405180910390a4610570868686868686611f19565b8373ffffffffffffffffffffffffffffffffffffffff1673deaddeaddeaddeaddeaddeaddeaddeaddead000073ffffffffffffffffffffffffffffffffffffffff16600073ffffffffffffffffffffffffffffffffffffffff167fb0444523268717a02698be47d0803aa7468c00acbed2f8bd93a0459cde61dd89868686604051611b45939291906129e1565b60405180910390a46112d984848484611fa1565b600080600080845160208601878a8af19695505050505050565b600054610100900460ff16611c0a576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602b60248201527f496e697469616c697a61626c653a20636f6e7472616374206973206e6f74206960448201527f6e697469616c697a696e6700000000000000000000000000000000000000000060648201526084016101bd565b6003805473ffffffffffffffffffffffffffffffffffffffff9384167fffffffffffffffffffffffff00000000000000000000000000000000000000009182161790915560048054929093169116179055565b8373ffffffffffffffffffffffffffffffffffffffff1673deaddeaddeaddeaddeaddeaddeaddeaddead000073ffffffffffffffffffffffffffffffffffffffff16600073ffffffffffffffffffffffffffffffffffffffff167f73d170910aba9e6d50b102db522b1dbcd796216f5128b445aa2135272886497e868686604051611cea939291906129e1565b60405180910390a46112d98484848461200e565b60405173ffffffffffffffffffffffffffffffffffffffff808516602483015283166044820152606481018290526112d99085907f23b872dd00000000000000000000000000000000000000000000000000000000906084016119a8565b8373ffffffffffffffffffffffffffffffffffffffff168673ffffffffffffffffffffffffffffffffffffffff168673ffffffffffffffffffffffffffffffffffffffff167f73d170910aba9e6d50b102db522b1dbcd796216f5128b445aa2135272886497e868686604051611dd4939291906129e1565b60405180910390a461057086868686868661206d565b6000611df5836120e5565b8015611e065750611e068383612149565b9392505050565b6000611e6f826040518060400160405280602081526020017f5361666545524332303a206c6f772d6c6576656c2063616c6c206661696c65648152508573ffffffffffffffffffffffffffffffffffffffff166122189092919063ffffffff16565b8051909150156109ec5780806020019051810190611e8d9190612a1f565b6109ec576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602a60248201527f5361666545524332303a204552433230206f7065726174696f6e20646964206e60448201527f6f7420737563636565640000000000000000000000000000000000000000000060648201526084016101bd565b8373ffffffffffffffffffffffffffffffffffffffff168573ffffffffffffffffffffffffffffffffffffffff168773ffffffffffffffffffffffffffffffffffffffff167fd59c65b35445225835c83f50b6ede06a7be047d22e357073e250d9af537518cd868686604051611f91939291906129e1565b60405180910390a4505050505050565b8273ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff167f31b2166ff604fc5672ea5df08a78081d2bc6d746cadce880747f3643d819e83d8484604051612000929190612a41565b60405180910390a350505050565b8273ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff167f2849b43074093a05396b6f2a937dee8565b15a48a7b3d4bffb732a5017380af58484604051612000929190612a41565b8373ffffffffffffffffffffffffffffffffffffffff168573ffffffffffffffffffffffffffffffffffffffff168773ffffffffffffffffffffffffffffffffffffffff167f7ff126db8024424bbfd9826e8ab82ff59136289ea440b04b39a0df1b03b9cabf868686604051611f91939291906129e1565b6000612111827f01ffc9a700000000000000000000000000000000000000000000000000000000612149565b80156118305750612142827fffffffff00000000000000000000000000000000000000000000000000000000612149565b1592915050565b604080517fffffffff000000000000000000000000000000000000000000000000000000008316602480830191909152825180830390910181526044909101909152602080820180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff167f01ffc9a700000000000000000000000000000000000000000000000000000000178152825160009392849283928392918391908a617530fa92503d91506000519050828015612201575060208210155b801561220d5750600081115b979650505050505050565b6060612227848460008561222f565b949350505050565b6060824710156122c1576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602660248201527f416464726573733a20696e73756666696369656e742062616c616e636520666f60448201527f722063616c6c000000000000000000000000000000000000000000000000000060648201526084016101bd565b73ffffffffffffffffffffffffffffffffffffffff85163b61233f576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601d60248201527f416464726573733a2063616c6c20746f206e6f6e2d636f6e747261637400000060448201526064016101bd565b6000808673ffffffffffffffffffffffffffffffffffffffff1685876040516123689190612a5a565b60006040518083038185875af1925050503d80600081146123a5576040519150601f19603f3d011682016040523d82523d6000602084013e6123aa565b606091505b509150915061220d828286606083156123c4575081611e06565b8251156123d45782518084602001fd5b816040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016101bd919061272e565b73ffffffffffffffffffffffffffffffffffffffff8116811461242a57600080fd5b50565b60008083601f84011261243f57600080fd5b50813567ffffffffffffffff81111561245757600080fd5b60208301915083602082850101111561246f57600080fd5b9250929050565b600080600080600080600060c0888a03121561249157600080fd5b873561249c81612408565b965060208801356124ac81612408565b955060408801356124bc81612408565b945060608801356124cc81612408565b93506080880135925060a088013567ffffffffffffffff8111156124ef57600080fd5b6124fb8a828b0161242d565b989b979a50959850939692959293505050565b803563ffffffff8116811461252257600080fd5b919050565b60008060006040848603121561253c57600080fd5b6125458461250e565b9250602084013567ffffffffffffffff81111561256157600080fd5b61256d8682870161242d565b9497909650939450505050565b60008060008060006080868803121561259257600080fd5b853561259d81612408565b945060208601356125ad81612408565b935060408601359250606086013567ffffffffffffffff8111156125d057600080fd5b6125dc8882890161242d565b969995985093965092949392505050565b60008060008060006080868803121561260557600080fd5b853561261081612408565b9450602086013593506126256040870161250e565b9250606086013567ffffffffffffffff8111156125d057600080fd5b600080600080600080600060c0888a03121561265c57600080fd5b873561266781612408565b9650602088013561267781612408565b9550604088013561268781612408565b94506060880135935061269c6080890161250e565b925060a088013567ffffffffffffffff8111156124ef57600080fd5b60005b838110156126d35781810151838201526020016126bb565b838111156112d95750506000910152565b600081518084526126fc8160208601602086016126b8565b601f017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0169290920160200192915050565b602081526000611e0660208301846126e4565b60008060008060008060a0878903121561275a57600080fd5b863561276581612408565b9550602087013561277581612408565b94506040870135935061278a6060880161250e565b9250608087013567ffffffffffffffff8111156127a657600080fd5b6127b289828a0161242d565b979a9699509497509295939492505050565b600080604083850312156127d757600080fd5b82356127e281612408565b915060208301356127f281612408565b809150509250929050565b60006020828403121561280f57600080fd5b8135611e0681612408565b6000806000806060858703121561283057600080fd5b843561283b81612408565b93506128496020860161250e565b9250604085013567ffffffffffffffff81111561286557600080fd5b6128718782880161242d565b95989497509550505050565b60006020828403121561288f57600080fd5b8151611e0681612408565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b6000828210156128db576128db61289a565b500390565b600073ffffffffffffffffffffffffffffffffffffffff80871683528086166020840152508360408301526080606083015261291f60808301846126e4565b9695505050505050565b73ffffffffffffffffffffffffffffffffffffffff8416815260606020820152600061295860608301856126e4565b905063ffffffff83166040830152949350505050565b600082198211156129815761298161289a565b500190565b600073ffffffffffffffffffffffffffffffffffffffff80891683528088166020840152808716604084015280861660608401525083608083015260c060a08301526129d560c08301846126e4565b98975050505050505050565b73ffffffffffffffffffffffffffffffffffffffff84168152826020820152606060408201526000612a1660608301846126e4565b95945050505050565b600060208284031215612a3157600080fd5b81518015158114611e0657600080fd5b82815260406020820152600061222760408301846126e4565b60008251612a6c8184602087016126b8565b919091019291505056fea164736f6c634300080f000a", -} - -// 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/indexer/bindings/l2tol1messagepasser.go b/indexer/bindings/l2tol1messagepasser.go deleted file mode 100644 index cc419d057adf..000000000000 --- a/indexer/bindings/l2tol1messagepasser.go +++ /dev/null @@ -1,699 +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 -) - -// 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/indexer/bindings/optimismportal.go b/indexer/bindings/optimismportal.go deleted file mode 100644 index 720b42a03853..000000000000 --- a/indexer/bindings/optimismportal.go +++ /dev/null @@ -1,1360 +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 -) - -// 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/indexer/bindings/standardbridge.go b/indexer/bindings/standardbridge.go deleted file mode 100644 index eb5866bb7254..000000000000 --- a/indexer/bindings/standardbridge.go +++ /dev/null @@ -1,1287 +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 -) - -// 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/indexer/cmd/indexer/cli.go b/indexer/cmd/indexer/cli.go deleted file mode 100644 index 91b5798a61d9..000000000000 --- a/indexer/cmd/indexer/cli.go +++ /dev/null @@ -1,178 +0,0 @@ -package main - -import ( - "context" - "fmt" - "math/big" - - "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/op-service/cliapp" - oplog "github.com/ethereum-optimism/optimism/op-service/log" - "github.com/ethereum-optimism/optimism/op-service/opio" -) - -var ( - ConfigFlag = &cli.StringFlag{ - Name: "config", - Value: "./indexer.toml", - Aliases: []string{"c"}, - Usage: "path to config file", - EnvVars: []string{"INDEXER_CONFIG"}, - } - MigrationsFlag = &cli.StringFlag{ - Name: "migrations-dir", - Value: "./migrations", - Usage: "path to migrations folder", - EnvVars: []string{"INDEXER_MIGRATIONS_DIR"}, - } - ReorgFlag = &cli.Uint64Flag{ - Name: "l1-height", - Aliases: []string{"height"}, - Usage: `the lowest l1 height that has been reorg'd. All L1 data and derived L2 state will be deleted. Since not all L1 blocks are - indexed, this will find the maximum indexed height <= the marker, which may result in slightly more deleted state.`, - Required: true, - } -) - -func runIndexer(ctx *cli.Context, shutdown context.CancelCauseFunc) (cliapp.Lifecycle, error) { - log := oplog.NewLogger(oplog.AppOut(ctx), oplog.ReadCLIConfig(ctx)).New("role", "indexer") - oplog.SetGlobalLogHandler(log.Handler()) - log.Info("running indexer...") - - cfg, err := config.LoadConfig(log, ctx.String(ConfigFlag.Name)) - if err != nil { - log.Error("failed to load config", "err", err) - return nil, err - } - - return indexer.NewIndexer(ctx.Context, log, &cfg, shutdown) -} - -func runApi(ctx *cli.Context, _ context.CancelCauseFunc) (cliapp.Lifecycle, error) { - log := oplog.NewLogger(oplog.AppOut(ctx), oplog.ReadCLIConfig(ctx)).New("role", "api") - oplog.SetGlobalLogHandler(log.Handler()) - log.Info("running api...") - - cfg, err := config.LoadConfig(log, ctx.String(ConfigFlag.Name)) - if err != nil { - log.Error("failed to load config", "err", err) - return nil, err - } - - apiCfg := &api.Config{ - DB: &api.DBConfigConnector{DBConfig: cfg.DB}, - HTTPServer: cfg.HTTPServer, - MetricsServer: cfg.MetricsServer, - } - - return api.NewApi(ctx.Context, log, apiCfg) -} - -func runMigrations(ctx *cli.Context) error { - // We don't maintain a complicated lifecycle here, just interrupt to shut down. - ctx.Context = opio.CancelOnInterrupt(ctx.Context) - - log := oplog.NewLogger(oplog.AppOut(ctx), oplog.ReadCLIConfig(ctx)).New("role", "migrations") - oplog.SetGlobalLogHandler(log.Handler()) - log.Info("running migrations...") - - cfg, err := config.LoadConfig(log, ctx.String(ConfigFlag.Name)) - if err != nil { - log.Error("failed to load config", "err", err) - return err - } - - db, err := database.NewDB(ctx.Context, log, cfg.DB) - if err != nil { - log.Error("failed to connect to database", "err", err) - return err - } - defer db.Close() - - migrationsDir := ctx.String(MigrationsFlag.Name) - return db.ExecuteSQLMigration(migrationsDir) -} - -func runReorgDeletion(ctx *cli.Context) error { - fromL1Height := ctx.Uint64(ReorgFlag.Name) - - log := oplog.NewLogger(oplog.AppOut(ctx), oplog.ReadCLIConfig(ctx)).New("role", "reorg-deletion") - oplog.SetGlobalLogHandler(log.Handler()) - cfg, err := config.LoadConfig(log, ctx.String(ConfigFlag.Name)) - if err != nil { - return fmt.Errorf("failed to load config: %w", err) - } - - 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.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 { - return fmt.Errorf("no header found at height") - } - - db, err := database.NewDB(ctx.Context, log, cfg.DB) - if err != nil { - return fmt.Errorf("failed to connect to database: %w", err) - } - - defer db.Close() - return db.Transaction(func(db *database.DB) error { - return db.Blocks.DeleteReorgedState(l1Header.Time) - }) -} - -func newCli(GitCommit string, GitDate string) *cli.App { - flags := append([]cli.Flag{ConfigFlag}, oplog.CLIFlags("INDEXER")...) - return &cli.App{ - Version: params.VersionWithCommit(GitCommit, GitDate), - Description: "An indexer of all optimism events with a serving api layer", - EnableBashCompletion: true, - Commands: []*cli.Command{ - { - Name: "api", - Flags: flags, - Description: "Runs the api service", - Action: cliapp.LifecycleCmd(runApi), - }, - { - Name: "index", - Flags: flags, - Description: "Runs the indexing service", - Action: cliapp.LifecycleCmd(runIndexer), - }, - { - Name: "migrate", - Flags: append(flags, MigrationsFlag), - Description: "Runs the database migrations", - Action: runMigrations, - }, - { - Name: "reorg-delete", - Aliases: []string{"reorg"}, - Flags: append(flags, ReorgFlag), - Description: "Deletes data that has been reorg'ed out of the canonical L1 chain", - Action: runReorgDeletion, - }, - { - Name: "version", - Description: "print version", - Action: func(ctx *cli.Context) error { - cli.ShowVersion(ctx) - return nil - }, - }, - }, - } -} diff --git a/indexer/cmd/indexer/main.go b/indexer/cmd/indexer/main.go deleted file mode 100644 index 341f10c4366b..000000000000 --- a/indexer/cmd/indexer/main.go +++ /dev/null @@ -1,27 +0,0 @@ -package main - -import ( - "context" - "os" - - "github.com/ethereum/go-ethereum/log" - - oplog "github.com/ethereum-optimism/optimism/op-service/log" - "github.com/ethereum-optimism/optimism/op-service/opio" -) - -var ( - GitCommit = "" - GitDate = "" -) - -func main() { - oplog.SetupDefaults() - app := newCli(GitCommit, GitDate) - // sub-commands set up their individual interrupt lifecycles, which can block on the given interrupt as needed. - ctx := opio.WithInterruptBlocker(context.Background()) - if err := app.RunContext(ctx, os.Args); err != nil { - log.Error("application failed", "err", err) - os.Exit(1) - } -} diff --git a/indexer/config/config.go b/indexer/config/config.go deleted file mode 100644 index 9524bb97164d..000000000000 --- a/indexer/config/config.go +++ /dev/null @@ -1,216 +0,0 @@ -package config - -import ( - "errors" - "fmt" - "os" - "reflect" - - "github.com/BurntSushi/toml" - "github.com/ethereum-optimism/optimism/op-service/predeploys" - "github.com/ethereum/go-ethereum/common" - "github.com/ethereum/go-ethereum/log" -) - -// In the future, presets can just be onchain system config with everything else -// fetched on initialization - -// Config represents the `indexer.toml` file used to configure the indexer -type Config struct { - Chain ChainConfig `toml:"chain"` - RPCs RPCsConfig `toml:"rpcs"` - DB DBConfig `toml:"db"` - HTTPServer ServerConfig `toml:"http"` - MetricsServer ServerConfig `toml:"metrics"` -} - -// L1Contracts configures deployed contracts -type L1Contracts struct { - // administrative - AddressManager common.Address `toml:"address-manager"` - SystemConfigProxy common.Address `toml:"system-config"` - - // rollup state - OptimismPortalProxy common.Address `toml:"optimism-portal"` - L2OutputOracleProxy common.Address `toml:"l2-output-oracle"` - DisputeGameFactoryProxy common.Address `toml:"dispute-game-factory"` - - // bridging - L1CrossDomainMessengerProxy common.Address `toml:"l1-cross-domain-messenger"` - L1StandardBridgeProxy common.Address `toml:"l1-standard-bridge"` - L1ERC721BridgeProxy common.Address `toml:"l1-erc721-bridge"` - - // IGNORE: legacy contracts (only settable via presets) - LegacyCanonicalTransactionChain common.Address `toml:"-"` - LegacyStateCommitmentChain common.Address `toml:"-"` -} - -func (c L1Contracts) ForEach(cb func(string, common.Address) error) error { - contracts := reflect.ValueOf(c) - fields := reflect.VisibleFields(reflect.TypeOf(c)) - for _, field := range fields { - // ruleid: unsafe-reflect-by-name - addr := (contracts.FieldByName(field.Name).Interface()).(common.Address) - if err := cb(field.Name, addr); err != nil { - return err - } - } - - return nil -} - -// L2Contracts configures core predeploy contracts. We explicitly specify -// fields until we can detect and backfill new addresses -type L2Contracts struct { - L2ToL1MessagePasser common.Address - L2CrossDomainMessenger common.Address - L2StandardBridge common.Address - L2ERC721Bridge common.Address -} - -func L2ContractsFromPredeploys() L2Contracts { - return L2Contracts{ - L2ToL1MessagePasser: predeploys.L2ToL1MessagePasserAddr, - L2CrossDomainMessenger: predeploys.L2CrossDomainMessengerAddr, - L2StandardBridge: predeploys.L2StandardBridgeAddr, - L2ERC721Bridge: predeploys.L2ERC721BridgeAddr, - } -} - -func (c L2Contracts) ForEach(cb func(string, common.Address) error) error { - contracts := reflect.ValueOf(c) - fields := reflect.VisibleFields(reflect.TypeOf(c)) - for _, field := range fields { - // ruleid: unsafe-reflect-by-name - addr := (contracts.FieldByName(field.Name).Interface()).(common.Address) - if err := cb(field.Name, addr); err != nil { - return err - } - } - - return nil -} - -// ChainConfig configures of the chain being indexed -type ChainConfig struct { - // Configure known chains with the l2 chain id - Preset int - L1StartingHeight uint `toml:"l1-starting-height"` - - L1Contracts L1Contracts `toml:"l1-contracts"` - L2Contracts L2Contracts `toml:"-"` - - // Bedrock starting heights only applicable for OP-Mainnet - L1BedrockStartingHeight uint `toml:"-"` - L2BedrockStartingHeight uint `toml:"-"` - - // These configuration options will be removed once - // native reorg handling is implemented - L1ConfirmationDepth uint `toml:"l1-confirmation-depth"` - L2ConfirmationDepth uint `toml:"l2-confirmation-depth"` - - L1PollingInterval uint `toml:"l1-polling-interval"` - L2PollingInterval uint `toml:"l2-polling-interval"` - - 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 -type RPCsConfig struct { - L1RPC string `toml:"l1-rpc"` - L2RPC string `toml:"l2-rpc"` -} - -// DBConfig configures the postgres database -type DBConfig struct { - Host string `toml:"host"` - Port int `toml:"port"` - Name string `toml:"name"` - User string `toml:"user"` - Password string `toml:"password"` -} - -// Configures the server -type ServerConfig struct { - Host string `toml:"host"` - Port int `toml:"port"` - WriteTimeout int `toml:"timeout"` -} - -// LoadConfig loads the `indexer.toml` config file from a given path -func LoadConfig(log log.Logger, path string) (Config, error) { - log.Debug("loading config", "path", path) - - var cfg Config - data, err := os.ReadFile(path) - if err != nil { - return cfg, err - } - - data = []byte(os.ExpandEnv(string(data))) - log.Debug("parsed config file", "data", string(data)) - - md, err := toml.Decode(string(data), &cfg) - if err != nil { - log.Error("failed to decode config file", "err", err) - return cfg, err - } - - if len(md.Undecoded()) > 0 { - log.Error("unknown fields in config file", "fields", md.Undecoded()) - err = fmt.Errorf("unknown fields in config file: %v", md.Undecoded()) - return cfg, err - } - - if cfg.Chain.Preset == DevnetPresetId { - preset, err := DevnetPreset() - if err != nil { - return cfg, err - } - - log.Info("detected preset", "preset", DevnetPresetId, "name", preset.Name) - cfg.Chain = preset.ChainConfig - } else if cfg.Chain.Preset != 0 { - preset, ok := Presets[cfg.Chain.Preset] - if !ok { - return cfg, fmt.Errorf("unknown preset: %d", cfg.Chain.Preset) - } - - log.Info("detected preset", "preset", cfg.Chain.Preset, "name", preset.Name) - cfg.Chain = preset.ChainConfig - } - - // Setup L2Contracts from predeploys - cfg.Chain.L2Contracts = L2ContractsFromPredeploys() - - // Deserialize the config file again when a preset is configured such that - // precedence is given to the config file vs the preset - if cfg.Chain.Preset > 0 { - if _, err := toml.Decode(string(data), &cfg); err != nil { - log.Error("failed to decode config file", "err", err) - return cfg, err - } - } - - // Check to make sure some required properties are set - var errs error - if cfg.Chain.L1PollingInterval == 0 { - errs = errors.Join(err, errors.New("`l1-polling-interval` unset")) - } - if cfg.Chain.L2PollingInterval == 0 { - errs = errors.Join(err, errors.New("`l2-polling-interval` unset")) - } - if cfg.Chain.L1HeaderBufferSize == 0 { - errs = errors.Join(err, errors.New("`l1-header-buffer-size` unset")) - } - if cfg.Chain.L2HeaderBufferSize == 0 { - errs = errors.Join(err, errors.New("`l2-header-buffer-size` unset")) - } - - log.Info("loaded chain config", "config", cfg.Chain) - return cfg, errs -} diff --git a/indexer/config/config_test.go b/indexer/config/config_test.go deleted file mode 100644 index 17da2a427dbf..000000000000 --- a/indexer/config/config_test.go +++ /dev/null @@ -1,323 +0,0 @@ -package config - -import ( - "fmt" - "os" - "testing" - - "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 TestLoadConfig(t *testing.T) { - logger := testlog.Logger(t, log.LevelInfo) - tmpfile, err := os.CreateTemp("", "test.toml") - require.NoError(t, err) - defer os.Remove(tmpfile.Name()) - defer tmpfile.Close() - - testData := ` - [chain] - preset = 10 - - l1-polling-interval = 5000 - l2-polling-interval = 5000 - l1-header-buffer-size = 1000 - l2-header-buffer-size = 1000 - - [rpcs] - l1-rpc = "https://l1.example.com" - l2-rpc = "https://l2.example.com" - - [db] - host = "127.0.0.1" - port = 5432 - user = "postgres" - password = "postgres" - name = "indexer" - - [http] - host = "127.0.0.1" - port = 8080 - - [metrics] - host = "127.0.0.1" - port = 7300 - ` - - data := []byte(testData) - err = os.WriteFile(tmpfile.Name(), data, 0644) - require.NoError(t, err) - defer os.Remove(tmpfile.Name()) - - err = tmpfile.Close() - require.NoError(t, err) - - conf, err := LoadConfig(logger, tmpfile.Name()) - require.NoError(t, err) - - 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)) - require.Equal(t, conf.Chain.L2HeaderBufferSize, uint(1000)) - require.Equal(t, conf.RPCs.L1RPC, "https://l1.example.com") - require.Equal(t, conf.RPCs.L2RPC, "https://l2.example.com") - require.Equal(t, conf.DB.Host, "127.0.0.1") - require.Equal(t, conf.DB.Port, 5432) - require.Equal(t, conf.DB.User, "postgres") - require.Equal(t, conf.DB.Password, "postgres") - require.Equal(t, conf.DB.Name, "indexer") - require.Equal(t, conf.HTTPServer.Host, "127.0.0.1") - require.Equal(t, conf.HTTPServer.Port, 8080) - require.Equal(t, conf.MetricsServer.Host, "127.0.0.1") - require.Equal(t, conf.MetricsServer.Port, 7300) -} - -func TestLoadConfigWithoutPreset(t *testing.T) { - tmpfile, err := os.CreateTemp("", "test_without_preset.toml") - require.NoError(t, err) - defer os.Remove(tmpfile.Name()) - defer tmpfile.Close() - - testData := ` - [chain] - l1-polling-interval = 5000 - l2-polling-interval = 5000 - l1-header-buffer-size = 1000 - l2-header-buffer-size = 1000 - - [chain.l1-contracts] - optimism-portal = "0x4205Fc579115071764c7423A4f12eDde41f106Ed" - l2-output-oracle = "0x42097868233d1aa22e815a266982f2cf17685a27" - l1-cross-domain-messenger = "0x420ce71c97B33Cc4729CF772ae268934F7ab5fA1" - l1-standard-bridge = "0x4209fc46f92E8a1c0deC1b1747d010903E884bE1" - dispute-game-factory = "0x4209fc46f92E8a1c0deC1b1747d010903E884bE1" - - [rpcs] - l1-rpc = "https://l1.example.com" - l2-rpc = "https://l2.example.com" - ` - - data := []byte(testData) - err = os.WriteFile(tmpfile.Name(), data, 0644) - require.NoError(t, err) - defer os.Remove(tmpfile.Name()) - - err = tmpfile.Close() - require.NoError(t, err) - - logger := testlog.Logger(t, log.LevelInfo) - conf, err := LoadConfig(logger, tmpfile.Name()) - require.NoError(t, err) - - require.Equal(t, conf.Chain.L1Contracts.OptimismPortalProxy.String(), common.HexToAddress("0x4205Fc579115071764c7423A4f12eDde41f106Ed").String()) - require.Equal(t, conf.Chain.L1Contracts.L2OutputOracleProxy.String(), common.HexToAddress("0x42097868233d1aa22e815a266982f2cf17685a27").String()) - require.Equal(t, conf.Chain.L1Contracts.L1CrossDomainMessengerProxy.String(), common.HexToAddress("0x420ce71c97B33Cc4729CF772ae268934F7ab5fA1").String()) - require.Equal(t, conf.Chain.L1Contracts.L1StandardBridgeProxy.String(), common.HexToAddress("0x4209fc46f92E8a1c0deC1b1747d010903E884bE1").String()) - require.Equal(t, conf.Chain.Preset, 0) -} - -func TestLoadConfigWithUnknownPreset(t *testing.T) { - tmpfile, err := os.CreateTemp("", "test_bad_preset.toml") - require.NoError(t, err) - defer os.Remove(tmpfile.Name()) - defer tmpfile.Close() - - testData := ` - [chain] - preset = 1234567890 # this preset doesn't exist - - [rpcs] - l1-rpc = "https://l1.example.com" - l2-rpc = "https://l2.example.com" - ` - - data := []byte(testData) - err = os.WriteFile(tmpfile.Name(), data, 0644) - require.NoError(t, err) - defer os.Remove(tmpfile.Name()) - - err = tmpfile.Close() - require.NoError(t, err) - - logger := testlog.Logger(t, log.LevelInfo) - conf, err := LoadConfig(logger, tmpfile.Name()) - require.Error(t, err) - - var faultyPreset = 1234567890 - require.Equal(t, conf.Chain.Preset, faultyPreset) - require.Error(t, err) - require.Equal(t, fmt.Sprintf("unknown preset: %d", faultyPreset), err.Error()) -} - -func TestLoadConfigPollingValues(t *testing.T) { - tmpfile, err := os.CreateTemp("", "test_user_values.toml") - require.NoError(t, err) - defer os.Remove(tmpfile.Name()) - defer tmpfile.Close() - - testData := ` - [chain] - l1-polling-interval = 1000 - l2-polling-interval = 1005 - l1-header-buffer-size = 100 - l2-header-buffer-size = 105 - ` - - data := []byte(testData) - err = os.WriteFile(tmpfile.Name(), data, 0644) - require.NoError(t, err) - defer os.Remove(tmpfile.Name()) - - err = tmpfile.Close() - require.NoError(t, err) - - logger := testlog.Logger(t, log.LevelInfo) - conf, err := LoadConfig(logger, tmpfile.Name()) - require.NoError(t, err) - - require.Equal(t, conf.Chain.L1PollingInterval, uint(1000)) - require.Equal(t, conf.Chain.L2PollingInterval, uint(1005)) - require.Equal(t, conf.Chain.L1HeaderBufferSize, uint(100)) - require.Equal(t, conf.Chain.L2HeaderBufferSize, uint(105)) -} - -func TestLoadedConfigPresetPrecendence(t *testing.T) { - tmpfile, err := os.CreateTemp("", "test_bad_preset.toml") - require.NoError(t, err) - defer os.Remove(tmpfile.Name()) - defer tmpfile.Close() - - testData := ` - [chain] - preset = 10 # Optimism Mainnet - - l1-polling-interval = 1000 - l2-polling-interval = 1000 - l1-header-buffer-size = 100 - l2-header-buffer-size = 100 - - # confirmation depths are explicitly set - l1-confirmation-depth = 50 - l2-confirmation-depth = 100 - - # override a contract address - [chain.l1-contracts] - optimism-portal = "0x0000000000000000000000000000000000000001" - - [rpcs] - l1-rpc = "https://l1.example.com" - l2-rpc = "https://l2.example.com" - ` - - data := []byte(testData) - err = os.WriteFile(tmpfile.Name(), data, 0644) - require.NoError(t, err) - defer os.Remove(tmpfile.Name()) - - err = tmpfile.Close() - require.NoError(t, err) - - logger := testlog.Logger(t, log.LevelInfo) - conf, err := LoadConfig(logger, tmpfile.Name()) - require.NoError(t, err) - - // confirmation depths - require.Equal(t, uint(50), conf.Chain.L1ConfirmationDepth) - require.Equal(t, uint(100), conf.Chain.L2ConfirmationDepth) - - // preset is used but does not overwrite config - require.Equal(t, common.HexToAddress("0x0000000000000000000000000000000000000001"), conf.Chain.L1Contracts.OptimismPortalProxy) - require.Equal(t, Presets[10].ChainConfig.L1Contracts.AddressManager, conf.Chain.L1Contracts.AddressManager) -} - -func TestLocalDevnet(t *testing.T) { - tmpfile, err := os.CreateTemp("", "test_user_values.toml") - require.NoError(t, err) - defer os.Remove(tmpfile.Name()) - defer tmpfile.Close() - - testData := ` - [chain] - preset = 901 - - l1-polling-interval = 5000 - l2-polling-interval = 5000 - l1-header-buffer-size = 1000 - l2-header-buffer-size = 1000 - - [rpcs] - l1-rpc = "https://l1.example.com" - l2-rpc = "https://l2.example.com" - ` - - data := []byte(testData) - err = os.WriteFile(tmpfile.Name(), data, 0644) - require.NoError(t, err) - defer os.Remove(tmpfile.Name()) - - err = tmpfile.Close() - require.NoError(t, err) - - logger := testlog.Logger(t, log.LevelInfo) - conf, err := LoadConfig(logger, tmpfile.Name()) - require.NoError(t, err) - - devnetPreset, err := DevnetPreset() - require.NoError(t, err) - - require.Equal(t, devnetPreset.ChainConfig.L1Contracts, conf.Chain.L1Contracts) -} - -func TestThrowsOnUnknownKeys(t *testing.T) { - logger := testlog.Logger(t, log.LevelInfo) - tmpfile, err := os.CreateTemp("", "test.toml") - require.NoError(t, err) - defer os.Remove(tmpfile.Name()) - defer tmpfile.Close() - - testData := ` - [chain] - unknown_key = 420 - preset = 10 - - [rpcs] - l1-rpc = "https://l1.example.com" - l2-rpc = "https://l2.example.com" - - [db] - another_unknownKey = 420 - host = "127.0.0.1" - port = 5432 - user = "postgres" - password = "postgres" - name = "indexer" - - [http] - host = "127.0.0.1" - port = 8080 - - [metrics] - host = "127.0.0.1" - port = 7300 - ` - - data := []byte(testData) - err = os.WriteFile(tmpfile.Name(), data, 0644) - require.NoError(t, err) - defer os.Remove(tmpfile.Name()) - - err = tmpfile.Close() - require.NoError(t, err) - - _, err = LoadConfig(logger, tmpfile.Name()) - require.Error(t, err) - require.Contains(t, err.Error(), "unknown fields in config file") -} diff --git a/indexer/config/devnet.go b/indexer/config/devnet.go deleted file mode 100644 index babc56bbba91..000000000000 --- a/indexer/config/devnet.go +++ /dev/null @@ -1,46 +0,0 @@ -package config - -import ( - "encoding/json" - "errors" - "fmt" - "io/fs" - "os" - "path/filepath" - - op_service "github.com/ethereum-optimism/optimism/op-service" -) - -var DevnetPresetId = 901 - -func DevnetPreset() (*Preset, error) { - cwd, err := os.Getwd() - if err != nil { - return nil, err - } - - root, err := op_service.FindMonorepoRoot(cwd) - if err != nil { - return nil, err - } - - devnetFilepath := filepath.Join(root, ".devnet", "addresses.json") - if _, err := os.Stat(devnetFilepath); errors.Is(err, fs.ErrNotExist) { - return nil, fmt.Errorf(".devnet/addresses.json not found. `make devnet-allocs` in monorepo root: %w", err) - } - - content, err := os.ReadFile(devnetFilepath) - if err != nil { - return nil, fmt.Errorf("unable to read .devnet/addressees.json") - } - - var l1Contracts L1Contracts - if err := json.Unmarshal(content, &l1Contracts); err != nil { - return nil, err - } - - return &Preset{ - Name: "Local Devnet", - ChainConfig: ChainConfig{Preset: DevnetPresetId, L1Contracts: l1Contracts}, - }, nil -} diff --git a/indexer/config/presets.go b/indexer/config/presets.go deleted file mode 100644 index 1c3c994fd60d..000000000000 --- a/indexer/config/presets.go +++ /dev/null @@ -1,155 +0,0 @@ -package config - -import ( - "github.com/ethereum/go-ethereum/common" -) - -type Preset struct { - Name string - ChainConfig ChainConfig -} - -// In the future, presets can just be onchain config and fetched on initialization - -// Mapping of L2 chain ids to their preset chain configurations -var Presets = map[int]Preset{ - 10: { - Name: "Optimism", - ChainConfig: ChainConfig{ - Preset: 10, - L1Contracts: L1Contracts{ - AddressManager: common.HexToAddress("0xdE1FCfB0851916CA5101820A69b13a4E276bd81F"), - SystemConfigProxy: common.HexToAddress("0x229047fed2591dbec1eF1118d64F7aF3dB9EB290"), - OptimismPortalProxy: common.HexToAddress("0xbEb5Fc579115071764c7423A4f12eDde41f106Ed"), - L2OutputOracleProxy: common.HexToAddress("0xdfe97868233d1aa22e815a266982f2cf17685a27"), - L1CrossDomainMessengerProxy: common.HexToAddress("0x25ace71c97B33Cc4729CF772ae268934F7ab5fA1"), - L1StandardBridgeProxy: common.HexToAddress("0x99C9fc46f92E8a1c0deC1b1747d010903E884bE1"), - L1ERC721BridgeProxy: common.HexToAddress("0x5a7749f83b81B301cAb5f48EB8516B986DAef23D"), - DisputeGameFactoryProxy: common.HexToAddress("0x1111111111111111111111111111111111111111"), - - // pre-bedrock - LegacyCanonicalTransactionChain: common.HexToAddress("0x5e4e65926ba27467555eb562121fac00d24e9dd2"), - LegacyStateCommitmentChain: common.HexToAddress("0xBe5dAb4A2e9cd0F27300dB4aB94BeE3A233AEB19"), - }, - L1StartingHeight: 13596466, - L1BedrockStartingHeight: 17422590, - L2BedrockStartingHeight: 105235063, - L1ConfirmationDepth: 10, - L2ConfirmationDepth: 75, - }, - }, - 11155420: { - Name: "Optimism Sepolia", - ChainConfig: ChainConfig{ - Preset: 11155420, - L1Contracts: L1Contracts{ - AddressManager: common.HexToAddress("0x9bFE9c5609311DF1c011c47642253B78a4f33F4B"), - SystemConfigProxy: common.HexToAddress("0x034edD2A225f7f429A63E0f1D2084B9E0A93b538"), - OptimismPortalProxy: common.HexToAddress("0x16Fc5058F25648194471939df75CF27A2fdC48BC"), - L2OutputOracleProxy: common.HexToAddress("0x90E9c4f8a994a250F6aEfd61CAFb4F2e895D458F"), - L1CrossDomainMessengerProxy: common.HexToAddress("0x58Cc85b8D04EA49cC6DBd3CbFFd00B4B8D6cb3ef"), - L1StandardBridgeProxy: common.HexToAddress("0xFBb0621E0B23b5478B630BD55a5f21f67730B0F1"), - L1ERC721BridgeProxy: common.HexToAddress("0xd83e03D576d23C9AEab8cC44Fa98d058D2176D1f"), - DisputeGameFactoryProxy: common.HexToAddress("0x05F9613aDB30026FFd634f38e5C4dFd30a197Fa1"), - }, - L1StartingHeight: 4071408, - L1ConfirmationDepth: 10, - L2ConfirmationDepth: 75, - }, - }, - 8453: { - Name: "Base", - ChainConfig: ChainConfig{ - Preset: 8453, - L1Contracts: L1Contracts{ - AddressManager: common.HexToAddress("0x8EfB6B5c4767B09Dc9AA6Af4eAA89F749522BaE2"), - SystemConfigProxy: common.HexToAddress("0x73a79Fab69143498Ed3712e519A88a918e1f4072"), - OptimismPortalProxy: common.HexToAddress("0x49048044D57e1C92A77f79988d21Fa8fAF74E97e"), - L2OutputOracleProxy: common.HexToAddress("0x56315b90c40730925ec5485cf004d835058518A0"), - L1CrossDomainMessengerProxy: common.HexToAddress("0x866E82a600A1414e583f7F13623F1aC5d58b0Afa"), - L1StandardBridgeProxy: common.HexToAddress("0x3154Cf16ccdb4C6d922629664174b904d80F2C35"), - L1ERC721BridgeProxy: common.HexToAddress("0x608d94945A64503E642E6370Ec598e519a2C1E53"), - DisputeGameFactoryProxy: common.HexToAddress("0x1111111111111111111111111111111111111111"), - }, - L1StartingHeight: 17481768, - L1ConfirmationDepth: 10, - L2ConfirmationDepth: 75, - }, - }, - 84532: { - Name: "Base Sepolia", - ChainConfig: ChainConfig{ - Preset: 84532, - L1Contracts: L1Contracts{ - AddressManager: common.HexToAddress("0x709c2B8ef4A9feFc629A8a2C1AF424Dc5BD6ad1B"), - SystemConfigProxy: common.HexToAddress("0xf272670eb55e895584501d564AfEB048bEd26194"), - OptimismPortalProxy: common.HexToAddress("0x49f53e41452C74589E85cA1677426Ba426459e85"), - L2OutputOracleProxy: common.HexToAddress("0x84457ca9D0163FbC4bbfe4Dfbb20ba46e48DF254"), - L1CrossDomainMessengerProxy: common.HexToAddress("0xC34855F4De64F1840e5686e64278da901e261f20"), - L1StandardBridgeProxy: common.HexToAddress("0xfd0Bf71F60660E2f608ed56e1659C450eB113120"), - L1ERC721BridgeProxy: common.HexToAddress("0x21eFD066e581FA55Ef105170Cc04d74386a09190"), - DisputeGameFactoryProxy: common.HexToAddress("0x1111111111111111111111111111111111111111"), - }, - L1StartingHeight: 4370868, - L1ConfirmationDepth: 10, - L2ConfirmationDepth: 75, - }, - }, - 7777777: { - Name: "Zora", - ChainConfig: ChainConfig{ - Preset: 7777777, - L1Contracts: L1Contracts{ - AddressManager: common.HexToAddress("0xEF8115F2733fb2033a7c756402Fc1deaa56550Ef"), - SystemConfigProxy: common.HexToAddress("0xA3cAB0126d5F504B071b81a3e8A2BBBF17930d86"), - OptimismPortalProxy: common.HexToAddress("0x1a0ad011913A150f69f6A19DF447A0CfD9551054"), - L2OutputOracleProxy: common.HexToAddress("0x9E6204F750cD866b299594e2aC9eA824E2e5f95c"), - L1CrossDomainMessengerProxy: common.HexToAddress("0xdC40a14d9abd6F410226f1E6de71aE03441ca506"), - L1StandardBridgeProxy: common.HexToAddress("0x3e2Ea9B92B7E48A52296fD261dc26fd995284631"), - L1ERC721BridgeProxy: common.HexToAddress("0x83A4521A3573Ca87f3a971B169C5A0E1d34481c3"), - DisputeGameFactoryProxy: common.HexToAddress("0x1111111111111111111111111111111111111111"), - }, - L1StartingHeight: 17473923, - L1ConfirmationDepth: 10, - L2ConfirmationDepth: 75, - }, - }, - 424: { - Name: "PGN", - ChainConfig: ChainConfig{ - Preset: 424, - L1Contracts: L1Contracts{ - AddressManager: common.HexToAddress("0x09d5DbA52F0ee2C4A5E94FD5C802bD74Ca9cAD3e"), - SystemConfigProxy: common.HexToAddress("0x7Df716EAD1d83a2BF35B416B7BC84bd0700357C9"), - OptimismPortalProxy: common.HexToAddress("0xb26Fd985c5959bBB382BAFdD0b879E149e48116c"), - L2OutputOracleProxy: common.HexToAddress("0xA38d0c4E6319F9045F20318BA5f04CDe94208608"), - L1CrossDomainMessengerProxy: common.HexToAddress("0x97BAf688E5d0465E149d1d5B497Ca99392a6760e"), - L1StandardBridgeProxy: common.HexToAddress("0xD0204B9527C1bA7bD765Fa5CCD9355d38338272b"), - L1ERC721BridgeProxy: common.HexToAddress("0xaFF0F8aaB6Cc9108D34b3B8423C76d2AF434d115"), - DisputeGameFactoryProxy: common.HexToAddress("0x1111111111111111111111111111111111111111"), - }, - L1StartingHeight: 17672702, - L1ConfirmationDepth: 10, - L2ConfirmationDepth: 75, - }, - }, - 58008: { - Name: "PGN Sepolia", - ChainConfig: ChainConfig{ - Preset: 58008, - L1Contracts: L1Contracts{ - AddressManager: common.HexToAddress("0x0Ad91488288BBe60ff38258785568A6D1EB3B983"), - SystemConfigProxy: common.HexToAddress("0x4BCCC52151f0ad7C62D45Ce0aA77d9d8ffCE534e"), - OptimismPortalProxy: common.HexToAddress("0xF04BdD5353Bb0EFF6CA60CfcC78594278eBfE179"), - L2OutputOracleProxy: common.HexToAddress("0xD5bAc3152ffC25318F848B3DD5dA6C85171BaEEe"), - L1CrossDomainMessengerProxy: common.HexToAddress("0x97f3558Ce48FE71B8CeFA5497708A49531D5A8E1"), - L1StandardBridgeProxy: common.HexToAddress("0xFaE6abCAF30D23e233AC7faF747F2fC3a5a6Bfa3"), - L1ERC721BridgeProxy: common.HexToAddress("0xBA8397B6f255618D5985d0fB427D8c0496F3a5FA"), - DisputeGameFactoryProxy: common.HexToAddress("0x1111111111111111111111111111111111111111"), - }, - L1StartingHeight: 17672702, - L1ConfirmationDepth: 10, - L2ConfirmationDepth: 75, - }, - }, -} diff --git a/indexer/database/blocks.go b/indexer/database/blocks.go deleted file mode 100644 index 0f89f92e6b3c..000000000000 --- a/indexer/database/blocks.go +++ /dev/null @@ -1,198 +0,0 @@ -package database - -import ( - "errors" - "fmt" - "math/big" - - "github.com/ethereum/go-ethereum/common" - "github.com/ethereum/go-ethereum/core/types" - "github.com/ethereum/go-ethereum/log" - - "gorm.io/gorm" - "gorm.io/gorm/clause" -) - -/** - * Types - */ - -type BlockHeader struct { - Hash common.Hash `gorm:"primaryKey;serializer:bytes"` - ParentHash common.Hash `gorm:"serializer:bytes"` - Number *big.Int `gorm:"serializer:u256"` - Timestamp uint64 - - RLPHeader *RLPHeader `gorm:"serializer:rlp;column:rlp_bytes"` -} - -func BlockHeaderFromHeader(header *types.Header) BlockHeader { - return BlockHeader{ - Hash: header.Hash(), - ParentHash: header.ParentHash, - Number: header.Number, - Timestamp: header.Time, - - RLPHeader: (*RLPHeader)(header), - } -} - -func (b BlockHeader) String() string { - return fmt.Sprintf("{Hash: %s, Number: %s}", b.Hash, b.Number) -} - -type L1BlockHeader struct { - BlockHeader `gorm:"embedded"` -} - -type L2BlockHeader struct { - BlockHeader `gorm:"embedded"` -} - -type BlocksView interface { - L1BlockHeader(common.Hash) (*L1BlockHeader, error) - L1BlockHeaderWithFilter(BlockHeader) (*L1BlockHeader, error) - L1BlockHeaderWithScope(func(db *gorm.DB) *gorm.DB) (*L1BlockHeader, error) - L1LatestBlockHeader() (*L1BlockHeader, error) - - L2BlockHeader(common.Hash) (*L2BlockHeader, error) - L2BlockHeaderWithFilter(BlockHeader) (*L2BlockHeader, error) - L2BlockHeaderWithScope(func(db *gorm.DB) *gorm.DB) (*L2BlockHeader, error) - L2LatestBlockHeader() (*L2BlockHeader, error) -} - -type BlocksDB interface { - BlocksView - - StoreL1BlockHeaders([]L1BlockHeader) error - StoreL2BlockHeaders([]L2BlockHeader) error - - DeleteReorgedState(uint64) error -} - -/** - * Implementation - */ - -type blocksDB struct { - log log.Logger - gorm *gorm.DB -} - -func newBlocksDB(log log.Logger, db *gorm.DB) BlocksDB { - return &blocksDB{log: log.New("table", "blocks"), gorm: db} -} - -// L1 - -func (db *blocksDB) StoreL1BlockHeaders(headers []L1BlockHeader) error { - deduped := db.gorm.Clauses(clause.OnConflict{Columns: []clause.Column{{Name: "hash"}}, DoNothing: true}) - result := deduped.Create(&headers) - if result.Error == nil && int(result.RowsAffected) < len(headers) { - db.log.Warn("ignored L1 block duplicates", "duplicates", len(headers)-int(result.RowsAffected)) - } - - return result.Error -} - -func (db *blocksDB) L1BlockHeader(hash common.Hash) (*L1BlockHeader, error) { - return db.L1BlockHeaderWithFilter(BlockHeader{Hash: hash}) -} - -func (db *blocksDB) L1BlockHeaderWithFilter(filter BlockHeader) (*L1BlockHeader, error) { - return db.L1BlockHeaderWithScope(func(gorm *gorm.DB) *gorm.DB { return gorm.Where(&filter) }) -} - -func (db *blocksDB) L1BlockHeaderWithScope(scope func(*gorm.DB) *gorm.DB) (*L1BlockHeader, error) { - var l1Header L1BlockHeader - result := db.gorm.Scopes(scope).Take(&l1Header) - if result.Error != nil { - if errors.Is(result.Error, gorm.ErrRecordNotFound) { - return nil, nil - } - return nil, result.Error - } - - return &l1Header, nil -} - -func (db *blocksDB) L1LatestBlockHeader() (*L1BlockHeader, error) { - var l1Header L1BlockHeader - result := db.gorm.Order("number DESC").Take(&l1Header) - if result.Error != nil { - if errors.Is(result.Error, gorm.ErrRecordNotFound) { - return nil, nil - } - - return nil, result.Error - } - - return &l1Header, nil -} - -// L2 - -func (db *blocksDB) StoreL2BlockHeaders(headers []L2BlockHeader) error { - deduped := db.gorm.Clauses(clause.OnConflict{Columns: []clause.Column{{Name: "hash"}}, DoNothing: true}) - result := deduped.Create(&headers) - if result.Error == nil && int(result.RowsAffected) < len(headers) { - db.log.Warn("ignored L2 block duplicates", "duplicates", len(headers)-int(result.RowsAffected)) - } - - return result.Error -} - -func (db *blocksDB) L2BlockHeader(hash common.Hash) (*L2BlockHeader, error) { - return db.L2BlockHeaderWithFilter(BlockHeader{Hash: hash}) -} - -func (db *blocksDB) L2BlockHeaderWithFilter(filter BlockHeader) (*L2BlockHeader, error) { - return db.L2BlockHeaderWithScope(func(gorm *gorm.DB) *gorm.DB { return gorm.Where(&filter) }) -} - -func (db *blocksDB) L2BlockHeaderWithScope(scope func(*gorm.DB) *gorm.DB) (*L2BlockHeader, error) { - var l2Header L2BlockHeader - result := db.gorm.Scopes(scope).Take(&l2Header) - if result.Error != nil { - if errors.Is(result.Error, gorm.ErrRecordNotFound) { - return nil, nil - } - return nil, result.Error - } - - return &l2Header, nil -} - -func (db *blocksDB) L2LatestBlockHeader() (*L2BlockHeader, error) { - var l2Header L2BlockHeader - result := db.gorm.Order("number DESC").Take(&l2Header) - if result.Error != nil { - if errors.Is(result.Error, gorm.ErrRecordNotFound) { - return nil, nil - } - return nil, result.Error - } - - return &l2Header, nil -} - -// Reorgs - -func (db *blocksDB) DeleteReorgedState(timestamp uint64) error { - db.log.Info("deleting reorg'd state", "from_timestamp", timestamp) - - // Delete reorg'd state. Block deletes cascades to all tables - l1Result := db.gorm.Delete(&L1BlockHeader{}, "timestamp >= ?", timestamp) - if l1Result.Error != nil { - return fmt.Errorf("unable to delete l1 state: %w", l1Result.Error) - } - db.log.Info("L1 blocks (& derived events/tables) deleted", "block_count", l1Result.RowsAffected) - - l2Result := db.gorm.Delete(&L2BlockHeader{}, "timestamp >= ?", timestamp) - if l2Result.Error != nil { - return fmt.Errorf("unable to delete l2 state: %w", l2Result.Error) - } - db.log.Info("L2 blocks (& derived events/tables) deleted", "block_count", l2Result.RowsAffected) - - return nil -} diff --git a/indexer/database/bridge_messages.go b/indexer/database/bridge_messages.go deleted file mode 100644 index 25979a8f0a0d..000000000000 --- a/indexer/database/bridge_messages.go +++ /dev/null @@ -1,203 +0,0 @@ -package database - -import ( - "errors" - "fmt" - "math/big" - - "gorm.io/gorm" - "gorm.io/gorm/clause" - - "github.com/ethereum/go-ethereum/common" - "github.com/ethereum/go-ethereum/log" - - "github.com/google/uuid" -) - -/** - * Types - */ - -type BridgeMessage struct { - MessageHash common.Hash `gorm:"primaryKey;serializer:bytes"` - Nonce *big.Int `gorm:"serializer:u256"` - - SentMessageEventGUID uuid.UUID - RelayedMessageEventGUID *uuid.UUID - - Tx Transaction `gorm:"embedded"` - GasLimit *big.Int `gorm:"serializer:u256"` -} - -type L1BridgeMessage struct { - BridgeMessage `gorm:"embedded"` - TransactionSourceHash common.Hash `gorm:"serializer:bytes"` -} - -type L2BridgeMessage struct { - BridgeMessage `gorm:"embedded"` - TransactionWithdrawalHash common.Hash `gorm:"serializer:bytes"` -} - -type L2BridgeMessageVersionedMessageHash struct { - MessageHash common.Hash `gorm:"primaryKey;serializer:bytes"` - V1MessageHash common.Hash `gorm:"serializer:bytes"` -} - -type BridgeMessagesView interface { - L1BridgeMessage(common.Hash) (*L1BridgeMessage, error) - L1BridgeMessageWithFilter(BridgeMessage) (*L1BridgeMessage, error) - - L2BridgeMessage(common.Hash) (*L2BridgeMessage, error) - L2BridgeMessageWithFilter(BridgeMessage) (*L2BridgeMessage, error) -} - -type BridgeMessagesDB interface { - BridgeMessagesView - - StoreL1BridgeMessages([]L1BridgeMessage) error - MarkRelayedL1BridgeMessage(common.Hash, uuid.UUID) error - - StoreL2BridgeMessages([]L2BridgeMessage) error - MarkRelayedL2BridgeMessage(common.Hash, uuid.UUID) error - - StoreL2BridgeMessageV1MessageHashes([]L2BridgeMessageVersionedMessageHash) error -} - -/** - * Implementation - */ - -type bridgeMessagesDB struct { - log log.Logger - gorm *gorm.DB -} - -func newBridgeMessagesDB(log log.Logger, db *gorm.DB) BridgeMessagesDB { - return &bridgeMessagesDB{log: log.New("table", "bridge_messages"), gorm: db} -} - -/** - * Arbitrary Messages Sent from L1 - */ - -func (db bridgeMessagesDB) StoreL1BridgeMessages(messages []L1BridgeMessage) error { - deduped := db.gorm.Clauses(clause.OnConflict{Columns: []clause.Column{{Name: "message_hash"}}, DoNothing: true}) - result := deduped.Create(&messages) - if result.Error == nil && int(result.RowsAffected) < len(messages) { - db.log.Warn("ignored L1 bridge message duplicates", "duplicates", len(messages)-int(result.RowsAffected)) - } - - return result.Error -} - -func (db bridgeMessagesDB) L1BridgeMessage(msgHash common.Hash) (*L1BridgeMessage, error) { - return db.L1BridgeMessageWithFilter(BridgeMessage{MessageHash: msgHash}) -} - -func (db bridgeMessagesDB) L1BridgeMessageWithFilter(filter BridgeMessage) (*L1BridgeMessage, error) { - var sentMessage L1BridgeMessage - result := db.gorm.Where(&filter).Take(&sentMessage) - if result.Error != nil { - if errors.Is(result.Error, gorm.ErrRecordNotFound) { - return nil, nil - } - return nil, result.Error - } - - return &sentMessage, nil -} - -func (db bridgeMessagesDB) MarkRelayedL1BridgeMessage(messageHash common.Hash, relayEvent uuid.UUID) error { - message, err := db.L1BridgeMessage(messageHash) - if err != nil { - return err - } else if message == nil { - return fmt.Errorf("L1BridgeMessage %s not found", messageHash) - } - - 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 %s", messageHash, relayEvent) - } - - message.RelayedMessageEventGUID = &relayEvent - result := db.gorm.Save(message) - return result.Error -} - -/** - * Arbitrary Messages Sent from L2 - */ - -func (db bridgeMessagesDB) StoreL2BridgeMessages(messages []L2BridgeMessage) error { - deduped := db.gorm.Clauses(clause.OnConflict{Columns: []clause.Column{{Name: "message_hash"}}, DoNothing: true}) - result := deduped.Create(&messages) - if result.Error == nil && int(result.RowsAffected) < len(messages) { - db.log.Warn("ignored L2 bridge message duplicates", "duplicates", len(messages)-int(result.RowsAffected)) - } - - return result.Error -} - -func (db bridgeMessagesDB) StoreL2BridgeMessageV1MessageHashes(versionedHashes []L2BridgeMessageVersionedMessageHash) error { - deduped := db.gorm.Clauses(clause.OnConflict{Columns: []clause.Column{{Name: "message_hash"}}, DoNothing: true}) - result := deduped.Create(&versionedHashes) - if result.Error == nil && int(result.RowsAffected) < len(versionedHashes) { - db.log.Warn("ignored L2 bridge v1 message hash duplicates", "duplicates", len(versionedHashes)-int(result.RowsAffected)) - } - - return result.Error -} - -func (db bridgeMessagesDB) L2BridgeMessage(msgHash common.Hash) (*L2BridgeMessage, error) { - message, err := db.L2BridgeMessageWithFilter(BridgeMessage{MessageHash: msgHash}) - if message != nil || err != nil { - return message, err - } - - // check if this is a v1 hash of an older message - versioned := L2BridgeMessageVersionedMessageHash{V1MessageHash: msgHash} - result := db.gorm.Where(&versioned).Take(&versioned) - if result.Error != nil { - if errors.Is(result.Error, gorm.ErrRecordNotFound) { - return nil, nil - } - return nil, result.Error - } - - return db.L2BridgeMessageWithFilter(BridgeMessage{MessageHash: versioned.MessageHash}) -} - -func (db bridgeMessagesDB) L2BridgeMessageWithFilter(filter BridgeMessage) (*L2BridgeMessage, error) { - var sentMessage L2BridgeMessage - result := db.gorm.Where(&filter).Take(&sentMessage) - if result.Error != nil { - if errors.Is(result.Error, gorm.ErrRecordNotFound) { - return nil, nil - } - return nil, result.Error - } - - return &sentMessage, nil -} - -func (db bridgeMessagesDB) MarkRelayedL2BridgeMessage(messageHash common.Hash, relayEvent uuid.UUID) error { - message, err := db.L2BridgeMessage(messageHash) - if err != nil { - return err - } else if message == nil { - return fmt.Errorf("L2BridgeMessage %s not found", messageHash) - } - - 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 %s", messageHash, relayEvent) - } - - message.RelayedMessageEventGUID = &relayEvent - result := db.gorm.Save(message) - return result.Error -} diff --git a/indexer/database/bridge_transactions.go b/indexer/database/bridge_transactions.go deleted file mode 100644 index 10482b7e1c27..000000000000 --- a/indexer/database/bridge_transactions.go +++ /dev/null @@ -1,257 +0,0 @@ -package database - -import ( - "errors" - "fmt" - "math/big" - - "github.com/google/uuid" - "gorm.io/gorm" - "gorm.io/gorm/clause" - - "github.com/ethereum/go-ethereum/common" - "github.com/ethereum/go-ethereum/log" -) - -/** - * Types - */ - -type Transaction struct { - FromAddress common.Address `gorm:"serializer:bytes"` - ToAddress common.Address `gorm:"serializer:bytes"` - Amount *big.Int `gorm:"serializer:u256"` - Data Bytes `gorm:"serializer:bytes"` - Timestamp uint64 -} - -type L1TransactionDeposit struct { - SourceHash common.Hash `gorm:"serializer:bytes;primaryKey"` - L2TransactionHash common.Hash `gorm:"serializer:bytes"` - InitiatedL1EventGUID uuid.UUID - - Tx Transaction `gorm:"embedded"` - GasLimit *big.Int `gorm:"serializer:u256"` -} - -type L2TransactionWithdrawal struct { - WithdrawalHash common.Hash `gorm:"serializer:bytes;primaryKey"` - Nonce *big.Int `gorm:"serializer:u256"` - InitiatedL2EventGUID uuid.UUID - - ProvenL1EventGUID *uuid.UUID - FinalizedL1EventGUID *uuid.UUID - Succeeded *bool - - Tx Transaction `gorm:"embedded"` - GasLimit *big.Int `gorm:"serializer:u256"` -} - -type BridgeTransactionsView interface { - L1TransactionDeposit(common.Hash) (*L1TransactionDeposit, error) - L1LatestBlockHeader() (*L1BlockHeader, error) - L1LatestFinalizedBlockHeader() (*L1BlockHeader, error) - - L2TransactionWithdrawal(common.Hash) (*L2TransactionWithdrawal, error) - L2LatestBlockHeader() (*L2BlockHeader, error) - L2LatestFinalizedBlockHeader() (*L2BlockHeader, error) -} - -type BridgeTransactionsDB interface { - BridgeTransactionsView - - StoreL1TransactionDeposits([]L1TransactionDeposit) error - - StoreL2TransactionWithdrawals([]L2TransactionWithdrawal) error - MarkL2TransactionWithdrawalProvenEvent(common.Hash, uuid.UUID) error - MarkL2TransactionWithdrawalFinalizedEvent(common.Hash, uuid.UUID, bool) error -} - -/** - * Implementation - */ - -type bridgeTransactionsDB struct { - log log.Logger - gorm *gorm.DB -} - -func newBridgeTransactionsDB(log log.Logger, db *gorm.DB) BridgeTransactionsDB { - return &bridgeTransactionsDB{log: log.New("table", "bridge_transactions"), gorm: db} -} - -/** - * Transactions deposited from L1 - */ - -func (db *bridgeTransactionsDB) StoreL1TransactionDeposits(deposits []L1TransactionDeposit) error { - deduped := db.gorm.Clauses(clause.OnConflict{Columns: []clause.Column{{Name: "source_hash"}}, DoNothing: true}) - result := deduped.Create(&deposits) - if result.Error == nil && int(result.RowsAffected) < len(deposits) { - db.log.Warn("ignored L1 tx deposit duplicates", "duplicates", len(deposits)-int(result.RowsAffected)) - } - - return result.Error -} - -func (db *bridgeTransactionsDB) L1TransactionDeposit(sourceHash common.Hash) (*L1TransactionDeposit, error) { - var deposit L1TransactionDeposit - result := db.gorm.Where(&L1TransactionDeposit{SourceHash: sourceHash}).Take(&deposit) - if result.Error != nil { - if errors.Is(result.Error, gorm.ErrRecordNotFound) { - return nil, nil - } - return nil, result.Error - } - - return &deposit, nil -} - -func (db *bridgeTransactionsDB) L1LatestBlockHeader() (*L1BlockHeader, error) { - // L1: Latest Transaction Deposit - l1Query := db.gorm.Where("timestamp = (?)", db.gorm.Table("l1_transaction_deposits").Select("MAX(timestamp)")) - - var l1Header L1BlockHeader - result := l1Query.Take(&l1Header) - if result.Error != nil { - if errors.Is(result.Error, gorm.ErrRecordNotFound) { - return nil, nil - } - return nil, result.Error - } - - return &l1Header, nil -} - -func (db *bridgeTransactionsDB) L1LatestFinalizedBlockHeader() (*L1BlockHeader, error) { - // A Proven, Finalized Event or Relayed Message - - latestProvenWithdrawal := db.gorm.Table("l2_transaction_withdrawals").Where("proven_l1_event_guid IS NOT NULL").Order("timestamp DESC").Limit(1) - provenQuery := db.gorm.Table("l1_contract_events").Where("guid = (?)", latestProvenWithdrawal.Select("proven_l1_event_guid")) - - latestFinalizedWithdrawal := db.gorm.Table("l2_transaction_withdrawals").Where("finalized_l1_event_guid IS NOT NULL").Order("timestamp DESC").Limit(1) - finalizedQuery := db.gorm.Table("l1_contract_events").Where("guid = (?)", latestFinalizedWithdrawal.Select("finalized_l1_event_guid")) - - latestRelayedWithdrawal := db.gorm.Table("l2_bridge_messages").Where("relayed_message_event_guid IS NOT NULL").Order("timestamp DESC").Limit(1) - relayedQuery := db.gorm.Table("l1_contract_events").Where("guid = (?)", latestRelayedWithdrawal.Select("relayed_message_event_guid")) - - events := db.gorm.Table("((?) UNION (?) UNION (?)) AS events", provenQuery, finalizedQuery, relayedQuery) - l1Query := db.gorm.Where("hash = (?)", events.Select("block_hash").Order("timestamp DESC").Limit(1)) - - var l1Header L1BlockHeader - result := l1Query.Take(&l1Header) - if result.Error != nil { - if errors.Is(result.Error, gorm.ErrRecordNotFound) { - return nil, nil - } - return nil, result.Error - } - - return &l1Header, nil -} - -/** - * Transactions withdrawn from L2 - */ - -func (db *bridgeTransactionsDB) StoreL2TransactionWithdrawals(withdrawals []L2TransactionWithdrawal) error { - deduped := db.gorm.Clauses(clause.OnConflict{Columns: []clause.Column{{Name: "withdrawal_hash"}}, DoNothing: true}) - result := deduped.Create(&withdrawals) - if result.Error == nil && int(result.RowsAffected) < len(withdrawals) { - db.log.Warn("ignored L2 tx withdrawal duplicates", "duplicates", len(withdrawals)-int(result.RowsAffected)) - } - - return result.Error -} - -func (db *bridgeTransactionsDB) L2TransactionWithdrawal(withdrawalHash common.Hash) (*L2TransactionWithdrawal, error) { - var withdrawal L2TransactionWithdrawal - result := db.gorm.Where(&L2TransactionWithdrawal{WithdrawalHash: withdrawalHash}).Take(&withdrawal) - if result.Error != nil { - if errors.Is(result.Error, gorm.ErrRecordNotFound) { - return nil, nil - } - return nil, result.Error - } - - return &withdrawal, nil -} - -// MarkL2TransactionWithdrawalProvenEvent links a withdrawn transaction with associated Prove action on L1. -func (db *bridgeTransactionsDB) MarkL2TransactionWithdrawalProvenEvent(withdrawalHash common.Hash, provenL1EventGuid uuid.UUID) error { - withdrawal, err := db.L2TransactionWithdrawal(withdrawalHash) - if err != nil { - return err - } else if withdrawal == nil { - return fmt.Errorf("transaction withdrawal hash %s not found", withdrawalHash) - } - - if withdrawal.ProvenL1EventGUID != nil && withdrawal.ProvenL1EventGUID.ID() == provenL1EventGuid.ID() { - return nil - } - - // Withdrawals can be re-proven in the event that the claim they were proven against was successfully - // challenged. Rather than track each individual dispute game, we allow the proven event to simply be - // overwritten. - withdrawal.ProvenL1EventGUID = &provenL1EventGuid - result := db.gorm.Save(&withdrawal) - return result.Error -} - -// MarkL2TransactionWithdrawalFinalizedEvent links a withdrawn transaction in its finalized state -func (db *bridgeTransactionsDB) MarkL2TransactionWithdrawalFinalizedEvent(withdrawalHash common.Hash, finalizedL1EventGuid uuid.UUID, succeeded bool) error { - withdrawal, err := db.L2TransactionWithdrawal(withdrawalHash) - if err != nil { - return err - } else if withdrawal == nil { - return fmt.Errorf("transaction withdrawal hash %s not found", withdrawalHash) - } else if withdrawal.ProvenL1EventGUID == nil { - return fmt.Errorf("cannot mark unproven withdrawal hash %s as finalized", withdrawal.WithdrawalHash) - } - - if withdrawal.FinalizedL1EventGUID != nil && withdrawal.FinalizedL1EventGUID.ID() == finalizedL1EventGuid.ID() { - return nil - } else if withdrawal.FinalizedL1EventGUID != nil { - return fmt.Errorf("finalized withdrawal %s re-finalized with a different event %s", withdrawalHash, finalizedL1EventGuid) - } - - withdrawal.FinalizedL1EventGUID = &finalizedL1EventGuid - withdrawal.Succeeded = &succeeded - result := db.gorm.Save(&withdrawal) - return result.Error -} - -func (db *bridgeTransactionsDB) L2LatestBlockHeader() (*L2BlockHeader, error) { - // L2: Block With The Latest Withdrawal - l2Query := db.gorm.Where("timestamp = (?)", db.gorm.Table("l2_transaction_withdrawals").Select("MAX(timestamp)")) - - var l2Header L2BlockHeader - result := l2Query.Take(&l2Header) - if result.Error != nil { - if errors.Is(result.Error, gorm.ErrRecordNotFound) { - return nil, nil - } - return nil, result.Error - } - - return &l2Header, nil -} - -func (db *bridgeTransactionsDB) L2LatestFinalizedBlockHeader() (*L2BlockHeader, error) { - // Only a Relayed message since we dont track L1 deposit inclusion status. - latestRelayedDeposit := db.gorm.Table("l1_bridge_messages").Where("relayed_message_event_guid IS NOT NULL").Order("timestamp DESC").Limit(1) - relayedQuery := db.gorm.Table("l2_contract_events").Where("guid = (?)", latestRelayedDeposit.Select("relayed_message_event_guid")) - - l2Query := db.gorm.Where("hash = (?)", relayedQuery.Select("block_hash")) - - var l2Header L2BlockHeader - result := l2Query.Take(&l2Header) - if result.Error != nil { - if errors.Is(result.Error, gorm.ErrRecordNotFound) { - return nil, nil - } - return nil, result.Error - } - - return &l2Header, nil -} diff --git a/indexer/database/bridge_transfers.go b/indexer/database/bridge_transfers.go deleted file mode 100644 index fbb866bbde43..000000000000 --- a/indexer/database/bridge_transfers.go +++ /dev/null @@ -1,392 +0,0 @@ -package database - -import ( - "errors" - "fmt" - "strings" - - "gorm.io/gorm" - "gorm.io/gorm/clause" - - "github.com/ethereum-optimism/optimism/op-service/predeploys" - "github.com/ethereum/go-ethereum/common" - "github.com/ethereum/go-ethereum/log" -) - -var ( - ETHTokenPair = TokenPair{LocalTokenAddress: predeploys.LegacyERC20ETHAddr, RemoteTokenAddress: predeploys.LegacyERC20ETHAddr} -) - -/** - * Types - */ - -type TokenPair struct { - LocalTokenAddress common.Address `gorm:"serializer:bytes"` - RemoteTokenAddress common.Address `gorm:"serializer:bytes"` -} - -type BridgeTransfer struct { - CrossDomainMessageHash *common.Hash `gorm:"serializer:bytes"` - - Tx Transaction `gorm:"embedded"` - TokenPair TokenPair `gorm:"embedded"` -} - -type L1BridgeDeposit struct { - BridgeTransfer `gorm:"embedded"` - TransactionSourceHash common.Hash `gorm:"primaryKey;serializer:bytes"` -} - -type L1BridgeDepositWithTransactionHashes struct { - L1BridgeDeposit L1BridgeDeposit `gorm:"embedded"` - - L1BlockHash common.Hash `gorm:"serializer:bytes"` - L1TransactionHash common.Hash `gorm:"serializer:bytes"` - L2TransactionHash common.Hash `gorm:"serializer:bytes"` -} - -type L2BridgeWithdrawal struct { - BridgeTransfer `gorm:"embedded"` - TransactionWithdrawalHash common.Hash `gorm:"primaryKey;serializer:bytes"` -} - -type L2BridgeWithdrawalWithTransactionHashes struct { - L2BridgeWithdrawal L2BridgeWithdrawal `gorm:"embedded"` - L2TransactionHash common.Hash `gorm:"serializer:bytes"` - L2BlockHash common.Hash `gorm:"serializer:bytes"` - - ProvenL1TransactionHash common.Hash `gorm:"serializer:bytes"` - FinalizedL1TransactionHash common.Hash `gorm:"serializer:bytes"` -} - -type BridgeTransfersView interface { - L1BridgeDeposit(common.Hash) (*L1BridgeDeposit, error) - L1TxDepositSum() (float64, error) - L1BridgeDepositWithFilter(BridgeTransfer) (*L1BridgeDeposit, error) - L1BridgeDepositsByAddress(common.Address, string, int) (*L1BridgeDepositsResponse, error) - - L2BridgeWithdrawal(common.Hash) (*L2BridgeWithdrawal, error) - L2BridgeWithdrawalSum(filter WithdrawFilter) (float64, error) - L2BridgeWithdrawalWithFilter(BridgeTransfer) (*L2BridgeWithdrawal, error) - L2BridgeWithdrawalsByAddress(common.Address, string, int) (*L2BridgeWithdrawalsResponse, error) -} - -type BridgeTransfersDB interface { - BridgeTransfersView - - StoreL1BridgeDeposits([]L1BridgeDeposit) error - StoreL2BridgeWithdrawals([]L2BridgeWithdrawal) error -} - -/** - * Implementation - */ - -type bridgeTransfersDB struct { - log log.Logger - gorm *gorm.DB -} - -func newBridgeTransfersDB(log log.Logger, db *gorm.DB) BridgeTransfersDB { - return &bridgeTransfersDB{log: log.New("table", "bridge_transfers"), gorm: db} -} - -/** - * Tokens Bridged (Deposited) from L1 - */ - -func (db *bridgeTransfersDB) StoreL1BridgeDeposits(deposits []L1BridgeDeposit) error { - deduped := db.gorm.Clauses(clause.OnConflict{Columns: []clause.Column{{Name: "transaction_source_hash"}}, DoNothing: true}) - result := deduped.Create(&deposits) - if result.Error == nil && int(result.RowsAffected) < len(deposits) { - db.log.Warn("ignored L1 bridge transfer duplicates", "duplicates", len(deposits)-int(result.RowsAffected)) - } - - return result.Error -} - -func (db *bridgeTransfersDB) L1BridgeDeposit(txSourceHash common.Hash) (*L1BridgeDeposit, error) { - var deposit L1BridgeDeposit - result := db.gorm.Where(&L1BridgeDeposit{TransactionSourceHash: txSourceHash}).Take(&deposit) - if result.Error != nil { - if errors.Is(result.Error, gorm.ErrRecordNotFound) { - return nil, nil - } - return nil, result.Error - } - - return &deposit, nil -} - -// L1BridgeDepositWithFilter queries for a bridge deposit with set fields in the `BridgeTransfer` filter -func (db *bridgeTransfersDB) L1BridgeDepositWithFilter(filter BridgeTransfer) (*L1BridgeDeposit, error) { - var deposit L1BridgeDeposit - result := db.gorm.Where(&filter).Take(&deposit) - if result.Error != nil { - if errors.Is(result.Error, gorm.ErrRecordNotFound) { - return nil, nil - } - return nil, result.Error - } - - return &deposit, nil -} - -type L1BridgeDepositsResponse struct { - Deposits []L1BridgeDepositWithTransactionHashes - Cursor string - HasNextPage bool -} - -// L1TxDepositSum ... returns the sum of all l1 tx deposit mints in gwei -func (db *bridgeTransfersDB) L1TxDepositSum() (float64, error) { - var sum float64 - result := db.gorm.Model(&L1TransactionDeposit{}).Select("SUM(amount)").Scan(&sum) - if result.Error != nil { - return 0, result.Error - } - - return sum, nil -} - -// L1BridgeDepositsByAddress retrieves a list of deposits initiated by the specified address, -// coupled with the L1/L2 transaction hashes that complete the bridge transaction. -func (db *bridgeTransfersDB) L1BridgeDepositsByAddress(address common.Address, cursor string, limit int) (*L1BridgeDepositsResponse, error) { - if limit <= 0 { - return nil, fmt.Errorf("limit must be greater than 0") - } - - cursorClause := "" - if cursor != "" { - sourceHash := common.HexToHash(cursor) - txDeposit := new(L1TransactionDeposit) - result := db.gorm.Model(&L1TransactionDeposit{}).Where(&L1TransactionDeposit{SourceHash: sourceHash}).Take(txDeposit) - if result.Error != nil || errors.Is(result.Error, gorm.ErrRecordNotFound) { - return nil, fmt.Errorf("unable to find transaction with supplied cursor source hash %s: %w", sourceHash, result.Error) - } - cursorClause = fmt.Sprintf("l1_transaction_deposits.timestamp <= %d", txDeposit.Tx.Timestamp) - } - - ethAddressString := predeploys.LegacyERC20ETHAddr.String() - - // Coalesce l1 transaction deposits that are simply ETH sends - ethTransactionDeposits := db.gorm.Model(&L1TransactionDeposit{}) - ethTransactionDeposits = ethTransactionDeposits.Where(&Transaction{FromAddress: address}).Where("amount > 0") - ethTransactionDeposits = ethTransactionDeposits.Joins("INNER JOIN l1_contract_events ON l1_contract_events.guid = initiated_l1_event_guid") - ethTransactionDeposits = ethTransactionDeposits.Select(` -from_address, to_address, amount, data, source_hash AS transaction_source_hash, -l2_transaction_hash, l1_contract_events.transaction_hash AS l1_transaction_hash, l1_contract_events.block_hash as l1_block_hash, -l1_transaction_deposits.timestamp, NULL AS cross_domain_message_hash, ? AS local_token_address, ? AS remote_token_address`, ethAddressString, ethAddressString) - ethTransactionDeposits = ethTransactionDeposits.Order("timestamp DESC").Limit(limit + 1) - if cursorClause != "" { - ethTransactionDeposits = ethTransactionDeposits.Where(cursorClause) - } - - depositsQuery := db.gorm.Model(&L1BridgeDeposit{}) - depositsQuery = depositsQuery.Where(&Transaction{FromAddress: address}) - depositsQuery = depositsQuery.Joins("INNER JOIN l1_transaction_deposits ON l1_transaction_deposits.source_hash = transaction_source_hash") - depositsQuery = depositsQuery.Joins("INNER JOIN l1_contract_events ON l1_contract_events.guid = l1_transaction_deposits.initiated_l1_event_guid") - depositsQuery = depositsQuery.Select(` -l1_bridge_deposits.from_address, l1_bridge_deposits.to_address, l1_bridge_deposits.amount, l1_bridge_deposits.data, transaction_source_hash, -l2_transaction_hash, l1_contract_events.transaction_hash AS l1_transaction_hash, l1_contract_events.block_hash as l1_block_hash, -l1_bridge_deposits.timestamp, cross_domain_message_hash, local_token_address, remote_token_address`) - depositsQuery = depositsQuery.Order("timestamp DESC").Limit(limit + 1) - if cursorClause != "" { - depositsQuery = depositsQuery.Where(cursorClause) - } - - query := db.gorm.Table("(?) AS deposits", depositsQuery) - query = query.Joins("UNION (?)", ethTransactionDeposits) - query = query.Select("*").Order("timestamp DESC").Limit(limit + 1) - deposits := []L1BridgeDepositWithTransactionHashes{} - result := query.Find(&deposits) - if result.Error != nil { - if errors.Is(result.Error, gorm.ErrRecordNotFound) { - return nil, nil - } - return nil, result.Error - } - - nextCursor := "" - hasNextPage := false - if len(deposits) > limit { - hasNextPage = true - nextCursor = deposits[limit].L1BridgeDeposit.TransactionSourceHash.String() - deposits = deposits[:limit] - } - - response := &L1BridgeDepositsResponse{Deposits: deposits, Cursor: nextCursor, HasNextPage: hasNextPage} - return response, nil -} - -/** - * Tokens Bridged (Withdrawn) from L2 - */ - -func (db *bridgeTransfersDB) StoreL2BridgeWithdrawals(withdrawals []L2BridgeWithdrawal) error { - deduped := db.gorm.Clauses(clause.OnConflict{Columns: []clause.Column{{Name: "transaction_withdrawal_hash"}}, DoNothing: true}) - result := deduped.Create(&withdrawals) - if result.Error == nil && int(result.RowsAffected) < len(withdrawals) { - db.log.Warn("ignored L2 bridge transfer duplicates", "duplicates", len(withdrawals)-int(result.RowsAffected)) - } - - return result.Error -} - -func (db *bridgeTransfersDB) L2BridgeWithdrawal(txWithdrawalHash common.Hash) (*L2BridgeWithdrawal, error) { - var withdrawal L2BridgeWithdrawal - result := db.gorm.Where(&L2BridgeWithdrawal{TransactionWithdrawalHash: txWithdrawalHash}).Take(&withdrawal) - if result.Error != nil { - if errors.Is(result.Error, gorm.ErrRecordNotFound) { - return nil, nil - } - return nil, result.Error - } - - return &withdrawal, nil -} - -type WithdrawFilter uint8 - -const ( - All WithdrawFilter = iota // Same as "initialized" - Proven - Finalized -) - -func (db *bridgeTransfersDB) L2BridgeWithdrawalSum(filter WithdrawFilter) (float64, error) { - // Determine where filter - var clause string - switch filter { - case All: - clause = "" - - case Finalized: - clause = "finalized_l1_event_guid IS NOT NULL" - - case Proven: - clause = "proven_l1_event_guid IS NOT NULL" - - default: - return 0, fmt.Errorf("unknown filter argument: %d", filter) - } - - // NOTE - Scanning to float64 reduces precision versus scanning to big.Int since amount is a uint256 - // This is ok though given all bridges will never exceed max float64 (10^308 || 1.7E+308) in wei value locked - // since that would require 10^308 / 10^18 = 10^290 ETH locked in the bridge - var sum float64 - result := db.gorm.Model(&L2TransactionWithdrawal{}).Where(clause).Select("SUM(amount)").Scan(&sum) - if result.Error != nil && strings.Contains(result.Error.Error(), "converting NULL to float64 is unsupported") { - // no rows found - return 0, nil - } else if result.Error != nil { - return 0, result.Error - } else { - return sum, nil - } -} - -// L2BridgeWithdrawalWithFilter queries for a bridge withdrawal with set fields in the `BridgeTransfer` filter -func (db *bridgeTransfersDB) L2BridgeWithdrawalWithFilter(filter BridgeTransfer) (*L2BridgeWithdrawal, error) { - var withdrawal L2BridgeWithdrawal - result := db.gorm.Where(filter).Take(&withdrawal) - if result.Error != nil { - if errors.Is(result.Error, gorm.ErrRecordNotFound) { - return nil, nil - } - return nil, result.Error - } - - return &withdrawal, nil -} - -type L2BridgeWithdrawalsResponse struct { - Withdrawals []L2BridgeWithdrawalWithTransactionHashes - Cursor string - HasNextPage bool -} - -// L2BridgeDepositsByAddress 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 { - return nil, fmt.Errorf("limit must be greater than 0") - } - - // (1) Generate cursor clause provided a cursor tx hash - cursorClause := "" - if cursor != "" { - withdrawalHash := common.HexToHash(cursor) - var txWithdrawal L2TransactionWithdrawal - result := db.gorm.Model(&L2TransactionWithdrawal{}).Where(&L2TransactionWithdrawal{WithdrawalHash: withdrawalHash}).Take(&txWithdrawal) - if result.Error != nil || errors.Is(result.Error, gorm.ErrRecordNotFound) { - return nil, fmt.Errorf("unable to find transaction with supplied cursor withdrawal hash %s: %w", withdrawalHash, result.Error) - } - cursorClause = fmt.Sprintf("l2_transaction_withdrawals.timestamp <= %d", txWithdrawal.Tx.Timestamp) - } - - // (2) Generate query for fetching ETH withdrawal data - // This query is a UNION (A | B) of two sub-queries: - // - (A) ETH sends from L2 to L1 - // - (B) Bridge withdrawals from L2 to L1 - - // TODO join with l1_bridged_tokens and l2_bridged_tokens - ethAddressString := predeploys.LegacyERC20ETHAddr.String() - - // Coalesce l2 transaction withdrawals that are simply ETH sends - ethTransactionWithdrawals := db.gorm.Model(&L2TransactionWithdrawal{}) - ethTransactionWithdrawals = ethTransactionWithdrawals.Where(&Transaction{FromAddress: address}).Where("amount > 0") - ethTransactionWithdrawals = ethTransactionWithdrawals.Joins("INNER JOIN l2_contract_events ON l2_contract_events.guid = l2_transaction_withdrawals.initiated_l2_event_guid") - ethTransactionWithdrawals = ethTransactionWithdrawals.Joins("LEFT JOIN l1_contract_events AS proven_l1_events ON proven_l1_events.guid = l2_transaction_withdrawals.proven_l1_event_guid") - ethTransactionWithdrawals = ethTransactionWithdrawals.Joins("LEFT JOIN l1_contract_events AS finalized_l1_events ON finalized_l1_events.guid = l2_transaction_withdrawals.finalized_l1_event_guid") - ethTransactionWithdrawals = ethTransactionWithdrawals.Select(` -from_address, to_address, amount, data, withdrawal_hash AS transaction_withdrawal_hash, -l2_contract_events.transaction_hash AS l2_transaction_hash, l2_contract_events.block_hash as l2_block_hash, proven_l1_events.transaction_hash AS proven_l1_transaction_hash, finalized_l1_events.transaction_hash AS finalized_l1_transaction_hash, -l2_transaction_withdrawals.timestamp, NULL AS cross_domain_message_hash, ? AS local_token_address, ? AS remote_token_address`, ethAddressString, ethAddressString) - ethTransactionWithdrawals = ethTransactionWithdrawals.Order("timestamp DESC").Limit(limit + 1) - if cursorClause != "" { - ethTransactionWithdrawals = ethTransactionWithdrawals.Where(cursorClause) - } - - withdrawalsQuery := db.gorm.Model(&L2BridgeWithdrawal{}) - withdrawalsQuery = withdrawalsQuery.Where(&Transaction{FromAddress: address}) - withdrawalsQuery = withdrawalsQuery.Joins("INNER JOIN l2_transaction_withdrawals ON withdrawal_hash = l2_bridge_withdrawals.transaction_withdrawal_hash") - withdrawalsQuery = withdrawalsQuery.Joins("INNER JOIN l2_contract_events ON l2_contract_events.guid = l2_transaction_withdrawals.initiated_l2_event_guid") - withdrawalsQuery = withdrawalsQuery.Joins("LEFT JOIN l1_contract_events AS proven_l1_events ON proven_l1_events.guid = l2_transaction_withdrawals.proven_l1_event_guid") - withdrawalsQuery = withdrawalsQuery.Joins("LEFT JOIN l1_contract_events AS finalized_l1_events ON finalized_l1_events.guid = l2_transaction_withdrawals.finalized_l1_event_guid") - withdrawalsQuery = withdrawalsQuery.Select(` -l2_bridge_withdrawals.from_address, l2_bridge_withdrawals.to_address, l2_bridge_withdrawals.amount, l2_bridge_withdrawals.data, transaction_withdrawal_hash, -l2_contract_events.transaction_hash AS l2_transaction_hash, l2_contract_events.block_hash as l2_block_hash, proven_l1_events.transaction_hash AS proven_l1_transaction_hash, finalized_l1_events.transaction_hash AS finalized_l1_transaction_hash, -l2_bridge_withdrawals.timestamp, cross_domain_message_hash, local_token_address, remote_token_address`) - withdrawalsQuery = withdrawalsQuery.Order("timestamp DESC").Limit(limit + 1) - if cursorClause != "" { - withdrawalsQuery = withdrawalsQuery.Where(cursorClause) - } - - query := db.gorm.Table("(?) AS withdrawals", withdrawalsQuery) - query = query.Joins("UNION (?)", ethTransactionWithdrawals) - query = query.Select("*").Order("timestamp DESC").Limit(limit + 1) - withdrawals := []L2BridgeWithdrawalWithTransactionHashes{} - - // (3) Execute query and process results - result := query.Find(&withdrawals) - - if result.Error != nil { - if errors.Is(result.Error, gorm.ErrRecordNotFound) { - return nil, nil - } - return nil, result.Error - } - - nextCursor := "" - hasNextPage := false - if len(withdrawals) > limit { - hasNextPage = true - nextCursor = withdrawals[limit].L2BridgeWithdrawal.TransactionWithdrawalHash.String() - withdrawals = withdrawals[:limit] - } - - response := &L2BridgeWithdrawalsResponse{Withdrawals: withdrawals, Cursor: nextCursor, HasNextPage: hasNextPage} - return response, nil -} diff --git a/indexer/database/contract_events.go b/indexer/database/contract_events.go deleted file mode 100644 index 48aa5a39f619..000000000000 --- a/indexer/database/contract_events.go +++ /dev/null @@ -1,288 +0,0 @@ -package database - -import ( - "errors" - "fmt" - "math/big" - - "gorm.io/gorm" - "gorm.io/gorm/clause" - - "github.com/ethereum/go-ethereum/common" - "github.com/ethereum/go-ethereum/core/types" - "github.com/ethereum/go-ethereum/log" - - "github.com/google/uuid" -) - -/** - * Types - */ - -type ContractEvent struct { - GUID uuid.UUID `gorm:"primaryKey"` - - // Some useful derived fields - BlockHash common.Hash `gorm:"serializer:bytes"` - ContractAddress common.Address `gorm:"serializer:bytes"` - TransactionHash common.Hash `gorm:"serializer:bytes"` - LogIndex uint64 - - EventSignature common.Hash `gorm:"serializer:bytes"` - Timestamp uint64 - - // NOTE: NOT ALL THE DERIVED FIELDS ON `types.Log` ARE - // AVAILABLE. FIELDS LISTED ABOVE ARE FILLED IN - RLPLog *types.Log `gorm:"serializer:rlp;column:rlp_bytes"` -} - -func ContractEventFromLog(log *types.Log, timestamp uint64) ContractEvent { - eventSig := common.Hash{} - if len(log.Topics) > 0 { - eventSig = log.Topics[0] - } - - return ContractEvent{ - GUID: uuid.New(), - - BlockHash: log.BlockHash, - TransactionHash: log.TxHash, - ContractAddress: log.Address, - - EventSignature: eventSig, - LogIndex: uint64(log.Index), - - Timestamp: timestamp, - - RLPLog: log, - } -} - -func (c *ContractEvent) AfterFind(tx *gorm.DB) error { - // Fill in some of the derived fields that are not - // populated when decoding the RLPLog from RLP - c.RLPLog.BlockHash = c.BlockHash - c.RLPLog.TxHash = c.TransactionHash - c.RLPLog.Index = uint(c.LogIndex) - return nil -} - -type L1ContractEvent struct { - ContractEvent `gorm:"embedded"` -} - -type L2ContractEvent struct { - ContractEvent `gorm:"embedded"` -} - -type ContractEventsView interface { - L1ContractEvent(uuid.UUID) (*L1ContractEvent, error) - L1ContractEventWithFilter(ContractEvent) (*L1ContractEvent, error) - L1ContractEventsWithFilter(ContractEvent, *big.Int, *big.Int) ([]L1ContractEvent, error) - L1LatestContractEventWithFilter(ContractEvent) (*L1ContractEvent, error) - - L2ContractEvent(uuid.UUID) (*L2ContractEvent, error) - L2ContractEventWithFilter(ContractEvent) (*L2ContractEvent, error) - L2ContractEventsWithFilter(ContractEvent, *big.Int, *big.Int) ([]L2ContractEvent, error) - L2LatestContractEventWithFilter(ContractEvent) (*L2ContractEvent, error) - - ContractEventsWithFilter(ContractEvent, string, *big.Int, *big.Int) ([]ContractEvent, error) -} - -type ContractEventsDB interface { - ContractEventsView - - StoreL1ContractEvents([]L1ContractEvent) error - StoreL2ContractEvents([]L2ContractEvent) error -} - -/** - * Implementation - */ - -type contractEventsDB struct { - log log.Logger - gorm *gorm.DB -} - -func newContractEventsDB(log log.Logger, db *gorm.DB) ContractEventsDB { - return &contractEventsDB{log: log.New("table", "events"), gorm: db} -} - -// L1 - -func (db *contractEventsDB) StoreL1ContractEvents(events []L1ContractEvent) error { - // Since the block hash refers back to L1, we dont necessarily have to check - // that the RLP bytes match when doing conflict resolution. - deduped := db.gorm.Clauses(clause.OnConflict{OnConstraint: "l1_contract_events_block_hash_log_index_key", DoNothing: true}) - result := deduped.Create(&events) - if result.Error == nil && int(result.RowsAffected) < len(events) { - db.log.Warn("ignored L1 contract event duplicates", "duplicates", len(events)-int(result.RowsAffected)) - } - - return result.Error -} - -func (db *contractEventsDB) L1ContractEvent(uuid uuid.UUID) (*L1ContractEvent, error) { - return db.L1ContractEventWithFilter(ContractEvent{GUID: uuid}) -} - -func (db *contractEventsDB) L1ContractEventWithFilter(filter ContractEvent) (*L1ContractEvent, error) { - var l1ContractEvent L1ContractEvent - result := db.gorm.Where(&filter).Take(&l1ContractEvent) - if result.Error != nil { - if errors.Is(result.Error, gorm.ErrRecordNotFound) { - return nil, nil - } - return nil, result.Error - } - - return &l1ContractEvent, nil -} - -func (db *contractEventsDB) L1ContractEventsWithFilter(filter ContractEvent, fromHeight, toHeight *big.Int) ([]L1ContractEvent, error) { - if fromHeight == nil { - fromHeight = big.NewInt(0) - } - if toHeight == nil { - return nil, errors.New("end height unspecified") - } - if fromHeight.Cmp(toHeight) > 0 { - return nil, fmt.Errorf("fromHeight %d is greater than toHeight %d", fromHeight, toHeight) - } - - query := db.gorm.Table("l1_contract_events").Where(&filter) - query = query.Joins("INNER JOIN l1_block_headers ON l1_contract_events.block_hash = l1_block_headers.hash") - query = query.Where("l1_block_headers.number >= ? AND l1_block_headers.number <= ?", fromHeight, toHeight) - query = query.Order("l1_block_headers.number ASC, l1_contract_events.log_index ASC").Select("l1_contract_events.*") - - // NOTE: We use `Find` here instead of `Scan` since `Scan` doesn't not support - // model hooks like `ContractEvent#AfterFind`. Functionally they are the same - var events []L1ContractEvent - result := query.Find(&events) - if result.Error != nil { - if errors.Is(result.Error, gorm.ErrRecordNotFound) { - return nil, nil - } - return nil, result.Error - } - - return events, nil -} - -func (db *contractEventsDB) L1LatestContractEventWithFilter(filter ContractEvent) (*L1ContractEvent, error) { - var l1ContractEvent L1ContractEvent - result := db.gorm.Where(&filter).Order("timestamp DESC").Take(&l1ContractEvent) - if result.Error != nil { - if errors.Is(result.Error, gorm.ErrRecordNotFound) { - return nil, nil - } - return nil, result.Error - } - - return &l1ContractEvent, nil -} - -// L2 - -func (db *contractEventsDB) StoreL2ContractEvents(events []L2ContractEvent) error { - // Since the block hash refers back to L2, we dont necessarily have to check - // that the RLP bytes match when doing conflict resolution. - deduped := db.gorm.Clauses(clause.OnConflict{OnConstraint: "l2_contract_events_block_hash_log_index_key", DoNothing: true}) - result := deduped.Create(&events) - if result.Error == nil && int(result.RowsAffected) < len(events) { - db.log.Warn("ignored L2 contract event duplicates", "duplicates", len(events)-int(result.RowsAffected)) - } - - return result.Error -} - -func (db *contractEventsDB) L2ContractEvent(uuid uuid.UUID) (*L2ContractEvent, error) { - return db.L2ContractEventWithFilter(ContractEvent{GUID: uuid}) -} - -func (db *contractEventsDB) L2ContractEventWithFilter(filter ContractEvent) (*L2ContractEvent, error) { - var l2ContractEvent L2ContractEvent - result := db.gorm.Where(&filter).Take(&l2ContractEvent) - if result.Error != nil { - if errors.Is(result.Error, gorm.ErrRecordNotFound) { - return nil, nil - } - return nil, result.Error - } - - return &l2ContractEvent, nil -} - -func (db *contractEventsDB) L2ContractEventsWithFilter(filter ContractEvent, fromHeight, toHeight *big.Int) ([]L2ContractEvent, error) { - if fromHeight == nil { - fromHeight = big.NewInt(0) - } - if toHeight == nil { - return nil, errors.New("end height unspecified") - } - if fromHeight.Cmp(toHeight) > 0 { - return nil, fmt.Errorf("fromHeight %d is greater than toHeight %d", fromHeight, toHeight) - } - - query := db.gorm.Table("l2_contract_events").Where(&filter) - query = query.Joins("INNER JOIN l2_block_headers ON l2_contract_events.block_hash = l2_block_headers.hash") - query = query.Where("l2_block_headers.number >= ? AND l2_block_headers.number <= ?", fromHeight, toHeight) - query = query.Order("l2_block_headers.number ASC, l2_contract_events.log_index ASC").Select("l2_contract_events.*") - - // NOTE: We use `Find` here instead of `Scan` since `Scan` doesn't not support - // model hooks like `ContractEvent#AfterFind`. Functionally they are the same - var events []L2ContractEvent - result := query.Find(&events) - if result.Error != nil { - if errors.Is(result.Error, gorm.ErrRecordNotFound) { - return nil, nil - } - return nil, result.Error - } - - return events, nil -} - -func (db *contractEventsDB) L2LatestContractEventWithFilter(filter ContractEvent) (*L2ContractEvent, error) { - var l2ContractEvent L2ContractEvent - result := db.gorm.Where(&filter).Order("timestamp DESC").Take(&l2ContractEvent) - if result.Error != nil { - if errors.Is(result.Error, gorm.ErrRecordNotFound) { - return nil, nil - } - return nil, result.Error - } - - return &l2ContractEvent, nil -} - -// Auxiliary methods for both L1 and L2 - -// ContractEventsWithFilter will retrieve contract events within the specified range according to the `chainSelector`. -func (db *contractEventsDB) ContractEventsWithFilter(filter ContractEvent, chainSelector string, fromHeight, toHeight *big.Int) ([]ContractEvent, error) { - switch chainSelector { - case "l1": - l1Events, err := db.L1ContractEventsWithFilter(filter, fromHeight, toHeight) - if err != nil { - return nil, err - } - events := make([]ContractEvent, len(l1Events)) - for i := range l1Events { - events[i] = l1Events[i].ContractEvent - } - return events, nil - case "l2": - l2Events, err := db.L2ContractEventsWithFilter(filter, fromHeight, toHeight) - if err != nil { - return nil, err - } - events := make([]ContractEvent, len(l2Events)) - for i := range l2Events { - events[i] = l2Events[i].ContractEvent - } - return events, nil - default: - return nil, errors.New("expected 'l1' or 'l2' for chain selection") - } -} diff --git a/indexer/database/db.go b/indexer/database/db.go deleted file mode 100644 index fdb8db253a04..000000000000 --- a/indexer/database/db.go +++ /dev/null @@ -1,147 +0,0 @@ -// Database module defines the data DB struct which wraps specific DB interfaces for L1/L2 block headers, contract events, bridging schemas. -package database - -import ( - "context" - "fmt" - "os" - "path/filepath" - - "github.com/ethereum-optimism/optimism/indexer/config" - _ "github.com/ethereum-optimism/optimism/indexer/database/serializers" - "github.com/ethereum-optimism/optimism/op-service/retry" - - "github.com/pkg/errors" - - "github.com/ethereum/go-ethereum/log" - - "gorm.io/driver/postgres" - "gorm.io/gorm" -) - -type DB struct { - gorm *gorm.DB - log log.Logger - - Blocks BlocksDB - ContractEvents ContractEventsDB - BridgeTransfers BridgeTransfersDB - BridgeMessages BridgeMessagesDB - BridgeTransactions BridgeTransactionsDB -} - -// NewDB connects to the configured DB, and provides client-bindings to it. -// The initial connection may fail, or the dial may be cancelled with the provided context. -func NewDB(ctx context.Context, log log.Logger, dbConfig config.DBConfig) (*DB, error) { - log = log.New("module", "db") - - dsn := fmt.Sprintf("host=%s dbname=%s sslmode=disable", dbConfig.Host, dbConfig.Name) - if dbConfig.Port != 0 { - dsn += fmt.Sprintf(" port=%d", dbConfig.Port) - } - if dbConfig.User != "" { - dsn += fmt.Sprintf(" user=%s", dbConfig.User) - } - if dbConfig.Password != "" { - dsn += fmt.Sprintf(" password=%s", dbConfig.Password) - } - - gormConfig := gorm.Config{ - Logger: newLogger(log), - - // The indexer will explicitly manage the transactions - SkipDefaultTransaction: true, - - // The postgres parameter counter for a given query is represented with uint16, - // resulting in a parameter limit of 65535. In order to avoid reaching this limit - // we'll utilize a batch size of 3k for inserts, well below the limit as long as - // the number of columns < 20. - CreateBatchSize: 3_000, - } - - retryStrategy := &retry.ExponentialStrategy{Min: 1000, Max: 20_000, MaxJitter: 250} - gorm, err := retry.Do[*gorm.DB](context.Background(), 10, retryStrategy, func() (*gorm.DB, error) { - gorm, err := gorm.Open(postgres.Open(dsn), &gormConfig) - if err != nil { - return nil, fmt.Errorf("failed to connect to database: %w", err) - } - - return gorm, nil - }) - - if err != nil { - return nil, err - } - - db := &DB{ - gorm: gorm, - log: log, - Blocks: newBlocksDB(log, gorm), - ContractEvents: newContractEventsDB(log, gorm), - BridgeTransfers: newBridgeTransfersDB(log, gorm), - BridgeMessages: newBridgeMessagesDB(log, gorm), - BridgeTransactions: newBridgeTransactionsDB(log, gorm), - } - - return db, nil -} - -// Transaction executes all operations conducted with the supplied database in a single -// transaction. If the supplied function errors, the transaction is rolled back. -func (db *DB) Transaction(fn func(db *DB) error) error { - return db.gorm.Transaction(func(tx *gorm.DB) error { - txDB := &DB{ - gorm: tx, - Blocks: newBlocksDB(db.log, tx), - ContractEvents: newContractEventsDB(db.log, tx), - BridgeTransfers: newBridgeTransfersDB(db.log, tx), - BridgeMessages: newBridgeMessagesDB(db.log, tx), - BridgeTransactions: newBridgeTransactionsDB(db.log, tx), - } - - return fn(txDB) - }) -} - -func (db *DB) Close() error { - db.log.Info("closing database") - sql, err := db.gorm.DB() - if err != nil { - return err - } - - return sql.Close() -} - -func (db *DB) ExecuteSQLMigration(migrationsFolder string) error { - err := filepath.Walk(migrationsFolder, func(path string, info os.FileInfo, err error) error { - // Check for any walking error - if err != nil { - return errors.Wrap(err, fmt.Sprintf("Failed to process migration file: %s", path)) - } - - // Skip directories - if info.IsDir() { - return nil - } - - // Read the migration file content - db.log.Info("reading sql file", "path", path) - fileContent, readErr := os.ReadFile(path) - if readErr != nil { - return errors.Wrap(readErr, fmt.Sprintf("Error reading SQL file: %s", path)) - } - - // Execute the migration - db.log.Info("executing sql file", "path", path) - execErr := db.gorm.Exec(string(fileContent)).Error - if execErr != nil { - return errors.Wrap(execErr, fmt.Sprintf("Error executing SQL script: %s", path)) - } - - return nil - }) - - db.log.Info("finished migrations") - return err -} diff --git a/indexer/database/logger.go b/indexer/database/logger.go deleted file mode 100644 index 5ff7c0894924..000000000000 --- a/indexer/database/logger.go +++ /dev/null @@ -1,58 +0,0 @@ -package database - -import ( - "context" - "fmt" - "strings" - "time" - - "github.com/ethereum/go-ethereum/log" - - "gorm.io/gorm/logger" -) - -var ( - _ logger.Interface = Logger{} - - SlowThresholdMilliseconds int64 = 500 -) - -type Logger struct { - log log.Logger -} - -func newLogger(log log.Logger) Logger { - return Logger{log} -} - -func (l Logger) LogMode(lvl logger.LogLevel) logger.Interface { - return l -} - -func (l Logger) Info(ctx context.Context, msg string, data ...interface{}) { - l.log.Info(fmt.Sprintf(msg, data...)) -} - -func (l Logger) Warn(ctx context.Context, msg string, data ...interface{}) { - l.log.Warn(fmt.Sprintf(msg, data...)) -} - -func (l Logger) Error(ctx context.Context, msg string, data ...interface{}) { - l.log.Error(fmt.Sprintf(msg, data...)) -} - -func (l Logger) Trace(ctx context.Context, begin time.Time, fc func() (sql string, rowsAffected int64), err error) { - elapsedMs := time.Since(begin).Milliseconds() - - // omit any values for batch inserts as they can be very long - sql, rows := fc() - if i := strings.Index(strings.ToLower(sql), "values"); i > 0 { - sql = fmt.Sprintf("%sVALUES (...)", sql[:i]) - } - - if elapsedMs < SlowThresholdMilliseconds { - l.log.Debug("database operation", "duration_ms", elapsedMs, "rows_affected", rows, "sql", sql) - } else { - l.log.Warn("database operation", "duration_ms", elapsedMs, "rows_affected", rows, "sql", sql) - } -} diff --git a/indexer/database/mocks.go b/indexer/database/mocks.go deleted file mode 100644 index 07303c7c1e6c..000000000000 --- a/indexer/database/mocks.go +++ /dev/null @@ -1,98 +0,0 @@ -package database - -import ( - "github.com/ethereum/go-ethereum/common" - "gorm.io/gorm" - - "github.com/stretchr/testify/mock" -) - -type MockBlocksView struct { - mock.Mock -} - -func (m *MockBlocksView) L1BlockHeader(common.Hash) (*L1BlockHeader, error) { - args := m.Called() - - header, ok := args.Get(0).(*L1BlockHeader) - if !ok { - header = nil - } - return header, args.Error(1) -} - -func (m *MockBlocksView) L1BlockHeaderWithFilter(BlockHeader) (*L1BlockHeader, error) { - args := m.Called() - return args.Get(0).(*L1BlockHeader), args.Error(1) -} - -func (m *MockBlocksView) L1BlockHeaderWithScope(func(*gorm.DB) *gorm.DB) (*L1BlockHeader, error) { - args := m.Called() - return args.Get(0).(*L1BlockHeader), args.Error(1) -} - -func (m *MockBlocksView) L1LatestBlockHeader() (*L1BlockHeader, error) { - args := m.Called() - - header, ok := args.Get(0).(*L1BlockHeader) - if !ok { - header = nil - } - - return header, args.Error(1) -} - -func (m *MockBlocksView) L2BlockHeader(common.Hash) (*L2BlockHeader, error) { - args := m.Called() - return args.Get(0).(*L2BlockHeader), args.Error(1) -} - -func (m *MockBlocksView) L2BlockHeaderWithFilter(BlockHeader) (*L2BlockHeader, error) { - args := m.Called() - return args.Get(0).(*L2BlockHeader), args.Error(1) -} - -func (m *MockBlocksView) L2BlockHeaderWithScope(func(*gorm.DB) *gorm.DB) (*L2BlockHeader, error) { - args := m.Called() - return args.Get(0).(*L2BlockHeader), args.Error(2) -} - -func (m *MockBlocksView) L2LatestBlockHeader() (*L2BlockHeader, error) { - args := m.Called() - return args.Get(0).(*L2BlockHeader), args.Error(1) -} - -type MockBlocksDB struct { - MockBlocksView -} - -func (m *MockBlocksDB) StoreL1BlockHeaders(headers []L1BlockHeader) error { - args := m.Called(headers) - return args.Error(1) -} - -func (m *MockBlocksDB) StoreL2BlockHeaders(headers []L2BlockHeader) error { - args := m.Called(headers) - return args.Error(1) -} - -func (m *MockBlocksDB) DeleteReorgedState(timestamp uint64) error { - args := m.Called(timestamp) - return args.Error(1) -} - -// MockDB is a mock database that can be used for testing -type MockDB struct { - MockBlocks *MockBlocksDB - DB *DB -} - -func NewMockDB() *MockDB { - // This is currently just mocking the BlocksDB interface - // but can be expanded to mock other inner DB interfaces - // as well - mockBlocks := new(MockBlocksDB) - db := &DB{Blocks: mockBlocks} - - return &MockDB{MockBlocks: mockBlocks, DB: db} -} diff --git a/indexer/database/serializers/bytes.go b/indexer/database/serializers/bytes.go deleted file mode 100644 index c00cc9603085..000000000000 --- a/indexer/database/serializers/bytes.go +++ /dev/null @@ -1,75 +0,0 @@ -package serializers - -import ( - "context" - "fmt" - "reflect" - "strings" - - "github.com/ethereum/go-ethereum/common/hexutil" - "gorm.io/gorm/schema" -) - -type BytesSerializer struct{} -type BytesInterface interface{ Bytes() []byte } -type SetBytesInterface interface{ SetBytes([]byte) } - -func init() { - schema.RegisterSerializer("bytes", BytesSerializer{}) -} - -func (BytesSerializer) Scan(ctx context.Context, field *schema.Field, dst reflect.Value, dbValue interface{}) error { - if dbValue == nil { - return nil - } - - hexStr, ok := dbValue.(string) - if !ok { - return fmt.Errorf("expected hex string as the database value: %T", dbValue) - } - - b, err := hexutil.Decode(hexStr) - if err != nil { - return fmt.Errorf("failed to decode database value: %w", err) - } - - fieldValue := reflect.New(field.FieldType) - fieldInterface := fieldValue.Interface() - - // Detect if we're deserializing into a pointer. If so, we'll need to - // also allocate memory to where the allocated pointer should point to - if field.FieldType.Kind() == reflect.Pointer { - nestedField := fieldValue.Elem() - if nestedField.Elem().Kind() == reflect.Pointer { - return fmt.Errorf("double pointers are the max depth supported: %T", fieldValue) - } - - // We'll want to call `SetBytes` on the pointer to - // the allocated memory and not the double pointer - nestedField.Set(reflect.New(field.FieldType.Elem())) - fieldInterface = nestedField.Interface() - } - - fieldSetBytes, ok := fieldInterface.(SetBytesInterface) - if !ok { - return fmt.Errorf("field does not satisfy the `SetBytes([]byte)` interface: %T", fieldInterface) - } - - fieldSetBytes.SetBytes(b) - field.ReflectValueOf(ctx, dst).Set(fieldValue.Elem()) - return nil -} - -func (BytesSerializer) Value(ctx context.Context, field *schema.Field, dst reflect.Value, fieldValue interface{}) (interface{}, error) { - if fieldValue == nil || (field.FieldType.Kind() == reflect.Pointer && reflect.ValueOf(fieldValue).IsNil()) { - return nil, nil - } - - fieldBytes, ok := fieldValue.(BytesInterface) - if !ok { - return nil, fmt.Errorf("field does not satisfy the `Bytes() []byte` interface") - } - - hexStr := hexutil.Encode(fieldBytes.Bytes()) - return strings.ToLower(hexStr), nil -} diff --git a/indexer/database/serializers/rlp.go b/indexer/database/serializers/rlp.go deleted file mode 100644 index 9af5a28df82a..000000000000 --- a/indexer/database/serializers/rlp.go +++ /dev/null @@ -1,57 +0,0 @@ -package serializers - -import ( - "context" - "fmt" - "reflect" - "strings" - - "github.com/ethereum/go-ethereum/common/hexutil" - "github.com/ethereum/go-ethereum/rlp" - - "gorm.io/gorm/schema" -) - -type RLPSerializer struct{} - -func init() { - schema.RegisterSerializer("rlp", RLPSerializer{}) -} - -func (RLPSerializer) Scan(ctx context.Context, field *schema.Field, dst reflect.Value, dbValue interface{}) error { - if dbValue == nil { - return nil - } - - hexStr, ok := dbValue.(string) - if !ok { - return fmt.Errorf("expected hex string as the database value: %T", dbValue) - } - - b, err := hexutil.Decode(hexStr) - if err != nil { - return fmt.Errorf("failed to decode database value: %w", err) - } - - fieldValue := reflect.New(field.FieldType) - if err := rlp.DecodeBytes(b, fieldValue.Interface()); err != nil { - return fmt.Errorf("failed to decode rlp bytes: %w", err) - } - - field.ReflectValueOf(ctx, dst).Set(fieldValue.Elem()) - return nil -} - -func (RLPSerializer) Value(ctx context.Context, field *schema.Field, dst reflect.Value, fieldValue interface{}) (interface{}, error) { - if fieldValue == nil || (field.FieldType.Kind() == reflect.Pointer && reflect.ValueOf(fieldValue).IsNil()) { - return nil, nil - } - - rlpBytes, err := rlp.EncodeToBytes(fieldValue) - if err != nil { - return nil, fmt.Errorf("failed to encode rlp bytes: %w", err) - } - - hexStr := hexutil.Encode(rlpBytes) - return strings.ToLower(hexStr), nil -} diff --git a/indexer/database/serializers/u256.go b/indexer/database/serializers/u256.go deleted file mode 100644 index 4ccd775e9c68..000000000000 --- a/indexer/database/serializers/u256.go +++ /dev/null @@ -1,60 +0,0 @@ -package serializers - -import ( - "context" - "fmt" - "math/big" - "reflect" - - "github.com/jackc/pgtype" - "gorm.io/gorm/schema" -) - -var ( - big10 = big.NewInt(10) - u256BigIntOverflow = new(big.Int).Exp(big.NewInt(2), big.NewInt(256), nil) -) - -type U256Serializer struct{} - -func init() { - schema.RegisterSerializer("u256", U256Serializer{}) -} - -func (U256Serializer) Scan(ctx context.Context, field *schema.Field, dst reflect.Value, dbValue interface{}) error { - if dbValue == nil { - return nil - } else if field.FieldType != reflect.TypeOf((*big.Int)(nil)) { - return fmt.Errorf("can only deserialize into a *big.Int: %T", field.FieldType) - } - - numeric := new(pgtype.Numeric) - err := numeric.Scan(dbValue) - if err != nil { - return err - } - - bigInt := numeric.Int - if numeric.Exp > 0 { - factor := new(big.Int).Exp(big10, big.NewInt(int64(numeric.Exp)), nil) - bigInt.Mul(bigInt, factor) - } - - if bigInt.Cmp(u256BigIntOverflow) >= 0 { - return fmt.Errorf("deserialized number larger than u256 can hold: %s", bigInt) - } - - field.ReflectValueOf(ctx, dst).Set(reflect.ValueOf(bigInt)) - return nil -} - -func (U256Serializer) Value(ctx context.Context, field *schema.Field, dst reflect.Value, fieldValue interface{}) (interface{}, error) { - if fieldValue == nil || (field.FieldType.Kind() == reflect.Pointer && reflect.ValueOf(fieldValue).IsNil()) { - return nil, nil - } else if field.FieldType != reflect.TypeOf((*big.Int)(nil)) { - return nil, fmt.Errorf("can only serialize a *big.Int: %T", field.FieldType) - } - - numeric := pgtype.Numeric{Int: fieldValue.(*big.Int), Status: pgtype.Present} - return numeric.Value() -} diff --git a/indexer/database/types.go b/indexer/database/types.go deleted file mode 100644 index 4b30ef62a0c1..000000000000 --- a/indexer/database/types.go +++ /dev/null @@ -1,50 +0,0 @@ -package database - -import ( - "io" - - "github.com/ethereum/go-ethereum/common" - "github.com/ethereum/go-ethereum/core/types" - "github.com/ethereum/go-ethereum/rlp" -) - -// Wrapper over types.Header such that we can get an RLP -// encoder over it via a `types.Block` wrapper - -type RLPHeader types.Header - -func (h *RLPHeader) EncodeRLP(w io.Writer) error { - return types.NewBlockWithHeader((*types.Header)(h)).EncodeRLP(w) -} - -func (h *RLPHeader) DecodeRLP(s *rlp.Stream) error { - block := new(types.Block) - err := block.DecodeRLP(s) - if err != nil { - return err - } - - header := block.Header() - *h = (RLPHeader)(*header) - return nil -} - -func (h *RLPHeader) Header() *types.Header { - return (*types.Header)(h) -} - -func (h *RLPHeader) Hash() common.Hash { - return h.Header().Hash() -} - -// Type definition for []byte to conform to the -// interface expected by the `bytes` serializer - -type Bytes []byte - -func (b Bytes) Bytes() []byte { - return b[:] -} -func (b *Bytes) SetBytes(bytes []byte) { - *b = bytes -} diff --git a/indexer/docker-compose.yml b/indexer/docker-compose.yml deleted file mode 100644 index f36aa0411508..000000000000 --- a/indexer/docker-compose.yml +++ /dev/null @@ -1,107 +0,0 @@ -version: '3.8' - -services: - postgres: - image: postgres:14.1 - environment: - - POSTGRES_USER=postgres - - POSTGRES_DB=indexer - - PGDATA=/data/postgres - - POSTGRES_HOST_AUTH_METHOD=trust - healthcheck: - test: [ "CMD-SHELL", "pg_isready -q -U postgres -d indexer" ] - ports: - # deconflict with postgres that might be running already on - # the host machine - - "5433:5432" - volumes: - - postgres_data:/data/postgres - - ./migrations:/docker-entrypoint-initdb.d/ - - index: - build: - context: .. - dockerfile: indexer/Dockerfile - command: ["/bin/sh", "-c", "indexer migrate && indexer index"] - expose: - - "8100" - - "7300" - environment: - - INDEXER_CONFIG=/app/indexer/config.toml - - INDEXER_L1_RPC_URL=http://host.docker.internal:8545 - - INDEXER_L2_RPC_URL=http://host.docker.internal:9545 - - DB_HOST=postgres - - DB_PORT=5432 - - DB_USER=postgres - - DB_NAME=indexer - volumes: - - ./indexer.toml:/app/indexer/config.toml/:ro - # needed only when running against the local devnet such - # that it can bootstrap the local deployment addresses - - ../go.mod:/app/go.mod/:ro - - ../.devnet/addresses.json:/app/.devnet/addresses.json/:ro - healthcheck: - test: wget index:8100/healthz -q -O - > /dev/null 2>&1 - depends_on: - postgres: - condition: service_healthy - - api: - build: - context: .. - dockerfile: indexer/Dockerfile - command: ["indexer", "api"] - environment: - - INDEXER_CONFIG=/app/indexer/config.toml - - DB_HOST=postgres - - DB_PORT=5432 - - DB_USER=postgres - - DB_NAME=indexer - ports: - - "8100:8100" - expose: - - "7300" - volumes: - - ./indexer.toml:/app/indexer/config.toml/:ro - # needed only when running against the local devnet such - # that it can bootstrap the local deployment addresses - - ../go.mod:/app/go.mod/:ro - - ../.devnet/addresses.json:/app/.devnet/addresses.json/:ro - healthcheck: - test: wget api:8100/healthz -q -O - > /dev/null 2>&1 - depends_on: - postgres: - condition: service_healthy - - prometheus: - image: prom/prometheus:latest - expose: - - "9090" - volumes: - - ./ops/prometheus:/etc/prometheus/:ro - - prometheus_data:/prometheus - depends_on: - index: - condition: service_healthy - api: - condition: service_healthy - - grafana: - image: grafana/grafana:latest - environment: - - GF_SECURITY_ADMIN_PASSWORD=optimism - - GF_DASHBOARDS_DEFAULT_HOME_DASHBOARD_PATH=/var/lib/grafana/dashboards/indexer.json - ports: - - "3000:3000" - volumes: - - ./ops/grafana/provisioning:/etc/grafana/provisioning/:ro - - ./ops/grafana/dashboards:/var/lib/grafana/dashboards/:ro - - grafana_data:/var/lib/grafana - depends_on: - prometheus: - condition: service_started - -volumes: - postgres_data: - prometheus_data: - grafana_data: diff --git a/indexer/e2e_tests/bridge_messages_e2e_test.go b/indexer/e2e_tests/bridge_messages_e2e_test.go deleted file mode 100644 index 44914574e15a..000000000000 --- a/indexer/e2e_tests/bridge_messages_e2e_test.go +++ /dev/null @@ -1,191 +0,0 @@ -package e2e_tests - -import ( - "context" - "math/big" - "testing" - "time" - - "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" - 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" - - "github.com/stretchr/testify/require" -) - -func TestE2EBridgeL1CrossDomainMessenger(t *testing.T) { - testSuite := createE2ETestSuite(t) - - l1CrossDomainMessenger, err := bindings.NewL1CrossDomainMessenger(testSuite.OpCfg.L1Deployments.L1CrossDomainMessengerProxy, testSuite.L1Client) - require.NoError(t, err) - - aliceAddr := testSuite.OpCfg.Secrets.Addresses().Alice - - // Attach 1ETH and random calldata to the sent messages - calldata := []byte{byte(1), byte(2), byte(3)} - l1Opts, err := bind.NewKeyedTransactorWithChainID(testSuite.OpCfg.Secrets.Alice, testSuite.OpCfg.L1ChainIDBig()) - require.NoError(t, err) - l1Opts.Value = big.NewInt(params.Ether) - - // (1) Send the Message - sentMsgTx, err := transactions.PadGasEstimate(l1Opts, 1.2, func(opts *bind.TransactOpts) (*types.Transaction, error) { - return l1CrossDomainMessenger.SendMessage(opts, aliceAddr, calldata, 100_000) - }) - require.NoError(t, err) - sentMsgReceipt, err := wait.ForReceiptOK(context.Background(), testSuite.L1Client, sentMsgTx.Hash()) - require.NoError(t, err) - - depositInfo, err := e2etest_utils.ParseDepositInfo(sentMsgReceipt) - require.NoError(t, err) - - // wait for processor catchup - require.NoError(t, wait.For(context.Background(), 500*time.Millisecond, func() (bool, error) { - l1Header := testSuite.Indexer.BridgeProcessor.LastL1Header - return l1Header != nil && l1Header.Number.Uint64() >= sentMsgReceipt.BlockNumber.Uint64(), nil - })) - - parsedMessage, err := e2etest_utils.ParseCrossDomainMessage(sentMsgReceipt) - require.NoError(t, err) - - // nonce for this message is zero but the current cross domain message version is 1. - nonceBytes := [31]byte{0: byte(1)} - nonce := new(big.Int).SetBytes(nonceBytes[:]) - - sentMessage, err := testSuite.DB.BridgeMessages.L1BridgeMessage(parsedMessage.MessageHash) - require.NoError(t, err) - require.NotNil(t, sentMessage) - require.NotNil(t, sentMessage.SentMessageEventGUID) - require.Equal(t, depositInfo.DepositTx.SourceHash, sentMessage.TransactionSourceHash) - require.Equal(t, nonce.Uint64(), sentMessage.Nonce.Uint64()) - require.Equal(t, uint64(100_000), sentMessage.GasLimit.Uint64()) - require.Equal(t, uint64(params.Ether), sentMessage.Tx.Amount.Uint64()) - require.Equal(t, aliceAddr, sentMessage.Tx.FromAddress) - require.Equal(t, aliceAddr, sentMessage.Tx.ToAddress) - require.ElementsMatch(t, calldata, sentMessage.Tx.Data) - - // (2) Process RelayedMessage on inclusion - // - We dont assert that `RelayedMessageEventGUID` is nil prior to inclusion since there isn't a - // a straightforward way of pausing/resuming the processors at the right time. The codepath is the - // same for L2->L1 messages which does check for this so we are still covered - transaction, err := testSuite.DB.BridgeTransactions.L1TransactionDeposit(sentMessage.TransactionSourceHash) - require.NoError(t, err) - - // wait for processor catchup - l2DepositReceipt, err := wait.ForReceiptOK(context.Background(), testSuite.L2Client, transaction.L2TransactionHash) - require.NoError(t, err) - require.NoError(t, wait.For(context.Background(), 500*time.Millisecond, func() (bool, error) { - l2Header := testSuite.Indexer.BridgeProcessor.LastFinalizedL2Header - return l2Header != nil && l2Header.Number.Uint64() >= l2DepositReceipt.BlockNumber.Uint64(), nil - })) - - sentMessage, err = testSuite.DB.BridgeMessages.L1BridgeMessage(parsedMessage.MessageHash) - require.NoError(t, err) - require.NotNil(t, sentMessage) - require.NotNil(t, sentMessage.RelayedMessageEventGUID) - - event, err := testSuite.DB.ContractEvents.L2ContractEvent(*sentMessage.RelayedMessageEventGUID) - require.NoError(t, err) - require.NotNil(t, event) - require.Equal(t, event.TransactionHash, transaction.L2TransactionHash) -} - -func TestE2EBridgeL2CrossDomainMessenger(t *testing.T) { - testSuite := createE2ETestSuite(t) - - optimismPortal, err := bindings.NewOptimismPortal(testSuite.OpCfg.L1Deployments.OptimismPortalProxy, testSuite.L1Client) - require.NoError(t, err) - l2CrossDomainMessenger, err := bindings.NewL2CrossDomainMessenger(predeploys.L2CrossDomainMessengerAddr, testSuite.L2Client) - require.NoError(t, err) - - aliceAddr := testSuite.OpCfg.Secrets.Addresses().Alice - - // Attach 1ETH and random calldata to the sent messages - calldata := []byte{byte(1), byte(2), byte(3)} - l2Opts, err := bind.NewKeyedTransactorWithChainID(testSuite.OpCfg.Secrets.Alice, testSuite.OpCfg.L2ChainIDBig()) - require.NoError(t, err) - l2Opts.Value = big.NewInt(params.Ether) - - // Ensure L1 has enough funds for the withdrawal by depositing an equal amount into the OptimismPortal - l1Opts, err := bind.NewKeyedTransactorWithChainID(testSuite.OpCfg.Secrets.Alice, testSuite.OpCfg.L1ChainIDBig()) - require.NoError(t, err) - l1Opts.Value = l2Opts.Value - depositTx, err := transactions.PadGasEstimate(l1Opts, 1.2, func(opts *bind.TransactOpts) (*types.Transaction, error) { - return optimismPortal.Receive(opts) - }) - require.NoError(t, err) - depositReceipt, err := wait.ForReceiptOK(context.Background(), testSuite.L1Client, depositTx.Hash()) - require.NoError(t, err) - depositInfo, err := e2etest_utils.ParseDepositInfo(depositReceipt) - require.NoError(t, err) - depositL2TxHash := types.NewTx(depositInfo.DepositTx).Hash() - _, err = wait.ForReceiptOK(context.Background(), testSuite.L2Client, depositL2TxHash) - require.NoError(t, err) - - // (1) Send the Message - sentMsgTx, err := transactions.PadGasEstimate(l2Opts, 1.2, func(opts *bind.TransactOpts) (*types.Transaction, error) { - return l2CrossDomainMessenger.SendMessage(opts, aliceAddr, calldata, 100_000) - }) - require.NoError(t, err) - sentMsgReceipt, err := wait.ForReceiptOK(context.Background(), testSuite.L2Client, sentMsgTx.Hash()) - require.NoError(t, err) - - msgPassed, err := withdrawals.ParseMessagePassed(sentMsgReceipt) - require.NoError(t, err) - withdrawalHash, err := withdrawals.WithdrawalHash(msgPassed) - require.NoError(t, err) - - // wait for processor catchup - require.NoError(t, wait.For(context.Background(), 500*time.Millisecond, func() (bool, error) { - l2Header := testSuite.Indexer.BridgeProcessor.LastL2Header - return l2Header != nil && l2Header.Number.Uint64() >= sentMsgReceipt.BlockNumber.Uint64(), nil - })) - - parsedMessage, err := e2etest_utils.ParseCrossDomainMessage(sentMsgReceipt) - require.NoError(t, err) - - // nonce for this message is zero but the current message version is 1. - nonceBytes := [31]byte{0: byte(1)} - nonce := new(big.Int).SetBytes(nonceBytes[:]) - - sentMessage, err := testSuite.DB.BridgeMessages.L2BridgeMessage(parsedMessage.MessageHash) - require.NoError(t, err) - require.NotNil(t, sentMessage) - require.NotNil(t, sentMessage.SentMessageEventGUID) - require.Equal(t, withdrawalHash, sentMessage.TransactionWithdrawalHash) - require.Equal(t, nonce.Uint64(), sentMessage.Nonce.Uint64()) - require.Equal(t, uint64(100_000), sentMessage.GasLimit.Uint64()) - require.Equal(t, uint64(params.Ether), sentMessage.Tx.Amount.Uint64()) - require.Equal(t, aliceAddr, sentMessage.Tx.FromAddress) - require.Equal(t, aliceAddr, sentMessage.Tx.ToAddress) - require.ElementsMatch(t, calldata, sentMessage.Tx.Data) - - // (2) Process RelayedMessage on withdrawal finalization - require.Nil(t, sentMessage.RelayedMessageEventGUID) - _, finalizedReceipt, _, _ := op_e2e.ProveAndFinalizeWithdrawal(t, *testSuite.OpCfg, testSuite.OpSys, "sequencer", testSuite.OpCfg.Secrets.Alice, sentMsgReceipt) - - // wait for processor catchup - require.NoError(t, wait.For(context.Background(), 500*time.Millisecond, func() (bool, error) { - l1Header := testSuite.Indexer.BridgeProcessor.LastFinalizedL1Header - return l1Header != nil && l1Header.Number.Uint64() >= finalizedReceipt.BlockNumber.Uint64(), nil - })) - - // message is marked as relayed - sentMessage, err = testSuite.DB.BridgeMessages.L2BridgeMessage(parsedMessage.MessageHash) - require.NoError(t, err) - require.NotNil(t, sentMessage) - require.NotNil(t, sentMessage.RelayedMessageEventGUID) - - event, err := testSuite.DB.ContractEvents.L1ContractEvent(*sentMessage.RelayedMessageEventGUID) - require.NoError(t, err) - require.NotNil(t, event) - require.Equal(t, event.TransactionHash, finalizedReceipt.TxHash) - -} diff --git a/indexer/e2e_tests/bridge_transactions_e2e_test.go b/indexer/e2e_tests/bridge_transactions_e2e_test.go deleted file mode 100644 index 02f3eaa83b86..000000000000 --- a/indexer/e2e_tests/bridge_transactions_e2e_test.go +++ /dev/null @@ -1,221 +0,0 @@ -package e2e_tests - -import ( - "context" - "math/big" - "testing" - "time" - - "github.com/ethereum-optimism/optimism/op-e2e/e2eutils/transactions" - - 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/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" - - "github.com/stretchr/testify/require" -) - -func TestE2EBridgeTransactionsOptimismPortalDeposits(t *testing.T) { - testSuite := createE2ETestSuite(t) - - optimismPortal, err := bindings.NewOptimismPortal(testSuite.OpCfg.L1Deployments.OptimismPortalProxy, testSuite.L1Client) - require.NoError(t, err) - - bobAddr := testSuite.OpCfg.Secrets.Addresses().Bob - aliceAddr := testSuite.OpCfg.Secrets.Addresses().Alice - - // attach 1 ETH to the deposit and random calldata - calldata := []byte{byte(1), byte(2), byte(3)} - l1Opts, err := bind.NewKeyedTransactorWithChainID(testSuite.OpCfg.Secrets.Alice, testSuite.OpCfg.L1ChainIDBig()) - require.NoError(t, err) - l1Opts.Value = big.NewInt(params.Ether) - - // In the same deposit transaction, transfer, 0.5ETH to Bob. We do this to ensure we're only indexing - // bridged funds from the source address versus any transferred value to a recipient in the same L2 transaction - depositTx, err := transactions.PadGasEstimate(l1Opts, 1.2, func(opts *bind.TransactOpts) (*types.Transaction, error) { - return optimismPortal.DepositTransaction(opts, bobAddr, big.NewInt(params.Ether/2), 100_000, false, calldata) - }) - require.NoError(t, err) - depositReceipt, err := wait.ForReceiptOK(context.Background(), testSuite.L1Client, depositTx.Hash()) - require.NoError(t, err) - - depositInfo, err := e2etest_utils.ParseDepositInfo(depositReceipt) - require.NoError(t, err) - - depositL2TxHash := types.NewTx(depositInfo.DepositTx).Hash() - - // wait for processor catchup - require.NoError(t, wait.For(context.Background(), 500*time.Millisecond, func() (bool, error) { - l1Header := testSuite.Indexer.BridgeProcessor.LastL1Header - return l1Header != nil && l1Header.Number.Uint64() >= depositReceipt.BlockNumber.Uint64(), nil - })) - - deposit, err := testSuite.DB.BridgeTransactions.L1TransactionDeposit(depositInfo.DepositTx.SourceHash) - require.NoError(t, err) - require.NotNil(t, deposit) - require.Equal(t, depositL2TxHash, deposit.L2TransactionHash) - require.Equal(t, uint64(100_000), deposit.GasLimit.Uint64()) - require.Equal(t, uint64(params.Ether), deposit.Tx.Amount.Uint64()) - require.Equal(t, aliceAddr, deposit.Tx.FromAddress) - require.Equal(t, bobAddr, deposit.Tx.ToAddress) - require.ElementsMatch(t, calldata, deposit.Tx.Data) - - event, err := testSuite.DB.ContractEvents.L1ContractEvent(deposit.InitiatedL1EventGUID) - require.NoError(t, err) - require.NotNil(t, event) - require.Equal(t, event.TransactionHash, depositTx.Hash()) - - // NOTE: The indexer does not track deposit inclusion as it's apart of the block derivation process. - // If this changes, we'd like to test for this here. -} - -func TestE2EBridgeTransactionsL2ToL1MessagePasserWithdrawal(t *testing.T) { - testSuite := createE2ETestSuite(t) - - optimismPortal, err := bindings.NewOptimismPortal(testSuite.OpCfg.L1Deployments.OptimismPortalProxy, testSuite.L1Client) - require.NoError(t, err) - l2ToL1MessagePasser, err := bindings.NewL2ToL1MessagePasser(predeploys.L2ToL1MessagePasserAddr, testSuite.L2Client) - require.NoError(t, err) - - aliceAddr := testSuite.OpCfg.Secrets.Addresses().Alice - - // attach 1 ETH to the withdrawal and random calldata - calldata := []byte{byte(1), byte(2), byte(3)} - l2Opts, err := bind.NewKeyedTransactorWithChainID(testSuite.OpCfg.Secrets.Alice, testSuite.OpCfg.L2ChainIDBig()) - require.NoError(t, err) - l2Opts.Value = big.NewInt(params.Ether) - - // Ensure L1 has enough funds for the withdrawal by depositing an equal amount into the OptimismPortal - l1Opts, err := bind.NewKeyedTransactorWithChainID(testSuite.OpCfg.Secrets.Alice, testSuite.OpCfg.L1ChainIDBig()) - require.NoError(t, err) - l1Opts.Value = l2Opts.Value - depositTx, err := transactions.PadGasEstimate(l1Opts, 1.2, func(opts *bind.TransactOpts) (*types.Transaction, error) { - return optimismPortal.Receive(opts) - }) - require.NoError(t, err) - depositReceipt, err := wait.ForReceiptOK(context.Background(), testSuite.L1Client, depositTx.Hash()) - require.NoError(t, err) - depositInfo, err := e2etest_utils.ParseDepositInfo(depositReceipt) - require.NoError(t, err) - depositL2TxHash := types.NewTx(depositInfo.DepositTx).Hash() - _, err = wait.ForReceiptOK(context.Background(), testSuite.L2Client, depositL2TxHash) - require.NoError(t, err) - - withdrawTx, err := transactions.PadGasEstimate(l2Opts, 1.2, func(opts *bind.TransactOpts) (*types.Transaction, error) { - return l2ToL1MessagePasser.InitiateWithdrawal(opts, aliceAddr, big.NewInt(100_000), calldata) - }) - require.NoError(t, err) - withdrawReceipt, err := wait.ForReceiptOK(context.Background(), testSuite.L2Client, withdrawTx.Hash()) - require.NoError(t, err) - - // wait for processor catchup - require.NoError(t, wait.For(context.Background(), 500*time.Millisecond, func() (bool, error) { - l2Header := testSuite.Indexer.BridgeProcessor.LastL2Header - return l2Header != nil && l2Header.Number.Uint64() >= withdrawReceipt.BlockNumber.Uint64(), nil - })) - - msgPassed, err := withdrawals.ParseMessagePassed(withdrawReceipt) - require.NoError(t, err) - withdrawalHash, err := withdrawals.WithdrawalHash(msgPassed) - require.NoError(t, err) - - withdraw, err := testSuite.DB.BridgeTransactions.L2TransactionWithdrawal(withdrawalHash) - require.NoError(t, err) - require.NotNil(t, withdraw) - require.Equal(t, msgPassed.Nonce.Uint64(), withdraw.Nonce.Uint64()) - require.Equal(t, uint64(100_000), withdraw.GasLimit.Uint64()) - require.Equal(t, uint64(params.Ether), withdraw.Tx.Amount.Uint64()) - require.Equal(t, aliceAddr, withdraw.Tx.FromAddress) - require.Equal(t, aliceAddr, withdraw.Tx.ToAddress) - require.ElementsMatch(t, calldata, withdraw.Tx.Data) - - event, err := testSuite.DB.ContractEvents.L2ContractEvent(withdraw.InitiatedL2EventGUID) - require.NoError(t, err) - require.NotNil(t, event) - require.Equal(t, event.TransactionHash, withdrawTx.Hash()) - - // Test Withdrawal Proven - require.Nil(t, withdraw.ProvenL1EventGUID) - require.Nil(t, withdraw.FinalizedL1EventGUID) - - withdrawParams, proveReceipt := op_e2e.ProveWithdrawal(t, *testSuite.OpCfg, testSuite.OpSys, "sequencer", testSuite.OpCfg.Secrets.Alice, withdrawReceipt) - require.NoError(t, wait.For(context.Background(), 500*time.Millisecond, func() (bool, error) { - l1Header := testSuite.Indexer.BridgeProcessor.LastFinalizedL1Header - return l1Header != nil && l1Header.Number.Uint64() >= proveReceipt.BlockNumber.Uint64(), nil - })) - - withdraw, err = testSuite.DB.BridgeTransactions.L2TransactionWithdrawal(withdrawalHash) - require.NoError(t, err) - require.NotNil(t, withdraw.ProvenL1EventGUID) - - proveEvent, err := testSuite.DB.ContractEvents.L1ContractEvent(*withdraw.ProvenL1EventGUID) - require.NoError(t, err) - require.NotNil(t, event) - require.Equal(t, proveEvent.TransactionHash, proveReceipt.TxHash) - - // Test Withdrawal Finalized - require.Nil(t, withdraw.FinalizedL1EventGUID) - - finalizeReceipt, _, _ := op_e2e.FinalizeWithdrawal(t, *testSuite.OpCfg, testSuite.L1Client, testSuite.OpCfg.Secrets.Alice, proveReceipt, withdrawParams) - require.NoError(t, wait.For(context.Background(), 500*time.Millisecond, func() (bool, error) { - l1Header := testSuite.Indexer.BridgeProcessor.LastFinalizedL1Header - return l1Header != nil && l1Header.Number.Uint64() >= finalizeReceipt.BlockNumber.Uint64(), nil - })) - - withdraw, err = testSuite.DB.BridgeTransactions.L2TransactionWithdrawal(withdrawalHash) - require.NoError(t, err) - require.NotNil(t, withdraw.FinalizedL1EventGUID) - require.NotNil(t, withdraw.Succeeded) - require.True(t, *withdraw.Succeeded) - - finalizedEvent, err := testSuite.DB.ContractEvents.L1ContractEvent(*withdraw.FinalizedL1EventGUID) - require.NoError(t, err) - require.NotNil(t, event) - require.Equal(t, finalizedEvent.TransactionHash, finalizeReceipt.TxHash) -} - -func TestE2EBridgeTransactionsL2ToL1MessagePasserFailedWithdrawal(t *testing.T) { - testSuite := createE2ETestSuite(t) - - l2ToL1MessagePasser, err := bindings.NewL2ToL1MessagePasser(predeploys.L2ToL1MessagePasserAddr, testSuite.L2Client) - require.NoError(t, err) - - aliceAddr := testSuite.OpCfg.Secrets.Addresses().Alice - - // Try to withdraw 1 ETH from L2 without any corresponding deposits on L1 - l2Opts, err := bind.NewKeyedTransactorWithChainID(testSuite.OpCfg.Secrets.Alice, testSuite.OpCfg.L2ChainIDBig()) - require.NoError(t, err) - l2Opts.Value = big.NewInt(params.Ether) - - withdrawTx, err := transactions.PadGasEstimate(l2Opts, 1.2, func(opts *bind.TransactOpts) (*types.Transaction, error) { - return l2ToL1MessagePasser.InitiateWithdrawal(opts, aliceAddr, big.NewInt(100_000), nil) - }) - require.NoError(t, err) - withdrawReceipt, err := wait.ForReceiptOK(context.Background(), testSuite.L2Client, withdrawTx.Hash()) - require.NoError(t, err) - - msgPassed, err := withdrawals.ParseMessagePassed(withdrawReceipt) - require.NoError(t, err) - withdrawalHash, err := withdrawals.WithdrawalHash(msgPassed) - require.NoError(t, err) - - // Prove&Finalize withdrawal - _, finalizeReceipt, _, _ := op_e2e.ProveAndFinalizeWithdrawal(t, *testSuite.OpCfg, testSuite.OpSys, "sequencer", testSuite.OpCfg.Secrets.Alice, withdrawReceipt) - require.NoError(t, wait.For(context.Background(), 500*time.Millisecond, func() (bool, error) { - l1Header := testSuite.Indexer.BridgeProcessor.LastFinalizedL1Header - return l1Header != nil && l1Header.Number.Uint64() >= finalizeReceipt.BlockNumber.Uint64(), nil - })) - - // Withdrawal registered but marked as unsuccessful - withdraw, err := testSuite.DB.BridgeTransactions.L2TransactionWithdrawal(withdrawalHash) - require.NoError(t, err) - require.NotNil(t, withdraw.Succeeded) - require.False(t, *withdraw.Succeeded) -} diff --git a/indexer/e2e_tests/bridge_transfers_e2e_test.go b/indexer/e2e_tests/bridge_transfers_e2e_test.go deleted file mode 100644 index ac6cde917e9a..000000000000 --- a/indexer/e2e_tests/bridge_transfers_e2e_test.go +++ /dev/null @@ -1,625 +0,0 @@ -package e2e_tests - -import ( - "context" - "crypto/ecdsa" - "fmt" - "math/big" - "testing" - "time" - - "github.com/ethereum-optimism/optimism/indexer/bigint" - e2etest_utils "github.com/ethereum-optimism/optimism/indexer/e2e_tests/utils" - op_e2e "github.com/ethereum-optimism/optimism/op-e2e" - "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/withdrawals" - - "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" - "github.com/ethereum/go-ethereum/params" - - "github.com/stretchr/testify/require" -) - -func TestE2EBridgeTransfersStandardBridgeETHDeposit(t *testing.T) { - testSuite := createE2ETestSuite(t) - - l1StandardBridge, err := bindings.NewL1StandardBridge(testSuite.OpCfg.L1Deployments.L1StandardBridgeProxy, testSuite.L1Client) - require.NoError(t, err) - - // 1 ETH transfer - aliceAddr := testSuite.OpCfg.Secrets.Addresses().Alice - l1Opts, err := bind.NewKeyedTransactorWithChainID(testSuite.OpCfg.Secrets.Alice, testSuite.OpCfg.L1ChainIDBig()) - require.NoError(t, err) - l1Opts.Value = big.NewInt(params.Ether) - - // (1) Test Deposit Initiation - depositTx, err := transactions.PadGasEstimate(l1Opts, 1.1, func(opts *bind.TransactOpts) (*types.Transaction, error) { - return l1StandardBridge.DepositETH(opts, 200_000, []byte{byte(1)}) - }) - require.NoError(t, err) - depositReceipt, err := wait.ForReceiptOK(context.Background(), testSuite.L1Client, depositTx.Hash()) - require.NoError(t, err) - - depositInfo, err := e2etest_utils.ParseDepositInfo(depositReceipt) - require.NoError(t, err) - - // wait for processor catchup - require.NoError(t, wait.For(context.Background(), 500*time.Millisecond, func() (bool, error) { - l1Header := testSuite.Indexer.BridgeProcessor.LastL1Header - return l1Header != nil && l1Header.Number.Uint64() >= depositReceipt.BlockNumber.Uint64(), nil - })) - - cursor := "" - limit := 100 - - aliceDeposits, err := testSuite.DB.BridgeTransfers.L1BridgeDepositsByAddress(aliceAddr, cursor, limit) - - require.NoError(t, err) - require.Len(t, aliceDeposits.Deposits, 1) - require.Equal(t, depositTx.Hash(), aliceDeposits.Deposits[0].L1TransactionHash) - require.Equal(t, depositReceipt.BlockHash, aliceDeposits.Deposits[0].L1BlockHash) - require.Equal(t, "", aliceDeposits.Cursor) - require.Equal(t, false, aliceDeposits.HasNextPage) - require.Equal(t, types.NewTx(depositInfo.DepositTx).Hash().String(), aliceDeposits.Deposits[0].L2TransactionHash.String()) - - deposit := aliceDeposits.Deposits[0].L1BridgeDeposit - require.Equal(t, depositInfo.DepositTx.SourceHash, deposit.TransactionSourceHash) - require.Equal(t, predeploys.LegacyERC20ETHAddr, deposit.TokenPair.LocalTokenAddress) - require.Equal(t, predeploys.LegacyERC20ETHAddr, deposit.TokenPair.RemoteTokenAddress) - require.Equal(t, uint64(params.Ether), deposit.Tx.Amount.Uint64()) - require.Equal(t, aliceAddr, deposit.Tx.FromAddress) - require.Equal(t, aliceAddr, deposit.Tx.ToAddress) - require.Equal(t, byte(1), deposit.Tx.Data[0]) - - // StandardBridge flows through the messenger. We remove the first two significant - // bytes of the nonce dedicated to the version. nonce == 0 (first message) - require.NotNil(t, deposit.CrossDomainMessageHash) - - // (2) Test Deposit Finalization via CrossDomainMessenger relayed message - l2DepositReceipt, err := wait.ForReceiptOK(context.Background(), testSuite.L2Client, types.NewTx(depositInfo.DepositTx).Hash()) - require.NoError(t, err) - require.NoError(t, wait.For(context.Background(), 500*time.Millisecond, func() (bool, error) { - l2Header := testSuite.Indexer.BridgeProcessor.LastFinalizedL2Header - return l2Header != nil && l2Header.Number.Uint64() >= l2DepositReceipt.BlockNumber.Uint64(), nil - })) - - crossDomainBridgeMessage, err := testSuite.DB.BridgeMessages.L1BridgeMessage(*deposit.CrossDomainMessageHash) - require.NoError(t, err) - require.NotNil(t, crossDomainBridgeMessage) - require.NotNil(t, crossDomainBridgeMessage.RelayedMessageEventGUID) -} - -func TestE2EBridgeTransfersOptimismPortalETHReceive(t *testing.T) { - testSuite := createE2ETestSuite(t) - - optimismPortal, err := bindings.NewOptimismPortal(testSuite.OpCfg.L1Deployments.OptimismPortalProxy, testSuite.L1Client) - require.NoError(t, err) - - // 1 ETH transfer - aliceAddr := testSuite.OpCfg.Secrets.Addresses().Alice - l1Opts, err := bind.NewKeyedTransactorWithChainID(testSuite.OpCfg.Secrets.Alice, testSuite.OpCfg.L1ChainIDBig()) - require.NoError(t, err) - l1Opts.Value = big.NewInt(params.Ether) - - // (1) Test Deposit Initiation - portalDepositTx, err := transactions.PadGasEstimate(l1Opts, 1.1, func(opts *bind.TransactOpts) (*types.Transaction, error) { - return optimismPortal.Receive(opts) - }) - require.NoError(t, err) - portalDepositReceipt, err := wait.ForReceiptOK(context.Background(), testSuite.L1Client, portalDepositTx.Hash()) - require.NoError(t, err) - - depositInfo, err := e2etest_utils.ParseDepositInfo(portalDepositReceipt) - require.NoError(t, err) - - // wait for processor catchup - require.NoError(t, wait.For(context.Background(), 500*time.Millisecond, func() (bool, error) { - l1Header := testSuite.Indexer.BridgeProcessor.LastL1Header - return l1Header != nil && l1Header.Number.Uint64() >= portalDepositReceipt.BlockNumber.Uint64(), nil - })) - - aliceDeposits, err := testSuite.DB.BridgeTransfers.L1BridgeDepositsByAddress(aliceAddr, "", 1) - require.NoError(t, err) - require.NotNil(t, aliceDeposits) - require.Len(t, aliceDeposits.Deposits, 1) - require.Equal(t, portalDepositTx.Hash(), aliceDeposits.Deposits[0].L1TransactionHash) - - deposit := aliceDeposits.Deposits[0].L1BridgeDeposit - require.Equal(t, depositInfo.DepositTx.SourceHash, deposit.TransactionSourceHash) - require.Equal(t, predeploys.LegacyERC20ETHAddr, deposit.TokenPair.LocalTokenAddress) - require.Equal(t, predeploys.LegacyERC20ETHAddr, deposit.TokenPair.RemoteTokenAddress) - require.Equal(t, uint64(params.Ether), deposit.Tx.Amount.Uint64()) - require.Equal(t, aliceAddr, deposit.Tx.FromAddress) - require.Equal(t, aliceAddr, deposit.Tx.ToAddress) - require.Len(t, deposit.Tx.Data, 0) - - // deposit was not sent through the cross domain messenger - require.Nil(t, deposit.CrossDomainMessageHash) - - // (2) Test Deposit Finalization - l2DepositReceipt, err := wait.ForReceiptOK(context.Background(), testSuite.L2Client, types.NewTx(depositInfo.DepositTx).Hash()) - require.NoError(t, err) - require.NoError(t, wait.For(context.Background(), 500*time.Millisecond, func() (bool, error) { - l2Header := testSuite.Indexer.BridgeProcessor.LastFinalizedL2Header - return l2Header != nil && l2Header.Number.Uint64() >= l2DepositReceipt.BlockNumber.Uint64(), nil - })) - - // Still nil as the withdrawal did not occur through the standard bridge - aliceDeposits, err = testSuite.DB.BridgeTransfers.L1BridgeDepositsByAddress(aliceAddr, "", 1) - require.NoError(t, err) - require.Nil(t, aliceDeposits.Deposits[0].L1BridgeDeposit.CrossDomainMessageHash) -} - -func TestE2EBridgeTransfersCursoredDeposits(t *testing.T) { - testSuite := createE2ETestSuite(t) - - l1StandardBridge, err := bindings.NewL1StandardBridge(testSuite.OpCfg.L1Deployments.L1StandardBridgeProxy, testSuite.L1Client) - require.NoError(t, err) - optimismPortal, err := bindings.NewOptimismPortal(testSuite.OpCfg.L1Deployments.OptimismPortalProxy, testSuite.L1Client) - require.NoError(t, err) - - aliceAddr := testSuite.OpCfg.Secrets.Addresses().Alice - l1Opts, err := bind.NewKeyedTransactorWithChainID(testSuite.OpCfg.Secrets.Alice, testSuite.OpCfg.L1ChainIDBig()) - require.NoError(t, err) - - // Deposit 1/2/3 ETH (second deposit via the optimism portal) - var depositReceipts [3]*types.Receipt - for i := 0; i < 3; i++ { - var depositTx *types.Transaction - l1Opts.Value = big.NewInt(int64((i + 1)) * params.Ether) - if i != 1 { - depositTx, err = transactions.PadGasEstimate(l1Opts, 1.1, func(opts *bind.TransactOpts) (*types.Transaction, error) { return l1StandardBridge.Receive(opts) }) - require.NoError(t, err) - } else { - depositTx, err = transactions.PadGasEstimate(l1Opts, 1.1, func(opts *bind.TransactOpts) (*types.Transaction, error) { return optimismPortal.Receive(opts) }) - require.NoError(t, err) - } - - depositReceipt, err := wait.ForReceiptOK(context.Background(), testSuite.L1Client, depositTx.Hash()) - require.NoError(t, err, fmt.Sprintf("failed on deposit %d", i)) - depositReceipts[i] = depositReceipt - } - - // wait for processor catchup of the latest tx - require.NoError(t, wait.For(context.Background(), 500*time.Millisecond, func() (bool, error) { - l1Header := testSuite.Indexer.BridgeProcessor.LastL1Header - return l1Header != nil && l1Header.Number.Uint64() >= depositReceipts[2].BlockNumber.Uint64(), nil - })) - - // Get All - aliceDeposits, err := testSuite.DB.BridgeTransfers.L1BridgeDepositsByAddress(aliceAddr, "", 3) - require.NotNil(t, aliceDeposits) - require.NoError(t, err) - require.Len(t, aliceDeposits.Deposits, 3) - require.False(t, aliceDeposits.HasNextPage) - - // Respects Limits & Supplied Cursors - aliceDeposits, err = testSuite.DB.BridgeTransfers.L1BridgeDepositsByAddress(aliceAddr, "", 2) - require.NotNil(t, aliceDeposits) - require.NoError(t, err) - require.Len(t, aliceDeposits.Deposits, 2) - require.True(t, aliceDeposits.HasNextPage) - - aliceDeposits, err = testSuite.DB.BridgeTransfers.L1BridgeDepositsByAddress(aliceAddr, aliceDeposits.Cursor, 1) - require.NoError(t, err) - require.NotNil(t, aliceDeposits) - require.Len(t, aliceDeposits.Deposits, 1) - require.False(t, aliceDeposits.HasNextPage) - - // Returns the results in the right order - aliceDeposits, err = testSuite.DB.BridgeTransfers.L1BridgeDepositsByAddress(aliceAddr, "", 3) - require.NotNil(t, aliceDeposits) - require.NoError(t, err) - for i := 0; i < 3; i++ { - deposit := aliceDeposits.Deposits[i] - - // DESCENDING order - require.Equal(t, depositReceipts[2-i].TxHash, deposit.L1TransactionHash) - require.Equal(t, int64(3-i)*params.Ether, deposit.L1BridgeDeposit.Tx.Amount.Int64()) - } -} - -func TestE2EBridgeTransfersStandardBridgeETHWithdrawal(t *testing.T) { - testSuite := createE2ETestSuite(t) - - optimismPortal, err := bindings.NewOptimismPortal(testSuite.OpCfg.L1Deployments.OptimismPortalProxy, testSuite.L1Client) - require.NoError(t, err) - l2StandardBridge, err := bindings.NewL2StandardBridge(predeploys.L2StandardBridgeAddr, testSuite.L2Client) - require.NoError(t, err) - - // 1 ETH transfer - aliceAddr := testSuite.OpCfg.Secrets.Addresses().Alice - l2Opts, err := bind.NewKeyedTransactorWithChainID(testSuite.OpCfg.Secrets.Alice, testSuite.OpCfg.L2ChainIDBig()) - require.NoError(t, err) - l2Opts.Value = big.NewInt(params.Ether) - - // Ensure L1 has enough funds for the withdrawal by depositing an equal amount into the OptimismPortal - l1Opts, err := bind.NewKeyedTransactorWithChainID(testSuite.OpCfg.Secrets.Alice, testSuite.OpCfg.L1ChainIDBig()) - require.NoError(t, err) - l1Opts.Value = l2Opts.Value - depositTx, err := transactions.PadGasEstimate(l1Opts, 1.2, func(opts *bind.TransactOpts) (*types.Transaction, error) { - return optimismPortal.Receive(opts) - }) - require.NoError(t, err) - depositReceipt, err := wait.ForReceiptOK(context.Background(), testSuite.L1Client, depositTx.Hash()) - require.NoError(t, err) - depositInfo, err := e2etest_utils.ParseDepositInfo(depositReceipt) - require.NoError(t, err) - depositL2TxHash := types.NewTx(depositInfo.DepositTx).Hash() - _, err = wait.ForReceiptOK(context.Background(), testSuite.L2Client, depositL2TxHash) - require.NoError(t, err) - - // (1) Test Withdrawal Initiation - withdrawTx, err := transactions.PadGasEstimate(l2Opts, 1.2, func(opts *bind.TransactOpts) (*types.Transaction, error) { - return l2StandardBridge.Withdraw(opts, predeploys.LegacyERC20ETHAddr, l2Opts.Value, 200_000, []byte{byte(1)}) - }) - require.NoError(t, err) - withdrawReceipt, err := wait.ForReceiptOK(context.Background(), testSuite.L2Client, withdrawTx.Hash()) - require.NoError(t, err) - - // wait for processor catchup - require.NoError(t, wait.For(context.Background(), 500*time.Millisecond, func() (bool, error) { - l2Header := testSuite.Indexer.BridgeProcessor.LastL2Header - return l2Header != nil && l2Header.Number.Uint64() >= withdrawReceipt.BlockNumber.Uint64(), nil - })) - - aliceWithdrawals, err := testSuite.DB.BridgeTransfers.L2BridgeWithdrawalsByAddress(aliceAddr, "", 3) - require.NoError(t, err) - require.Len(t, aliceWithdrawals.Withdrawals, 1) - require.Equal(t, withdrawTx.Hash().String(), aliceWithdrawals.Withdrawals[0].L2TransactionHash.String()) - - msgPassed, err := withdrawals.ParseMessagePassed(withdrawReceipt) - require.NoError(t, err) - withdrawalHash, err := withdrawals.WithdrawalHash(msgPassed) - require.NoError(t, err) - - withdrawal := aliceWithdrawals.Withdrawals[0].L2BridgeWithdrawal - require.Equal(t, withdrawalHash, withdrawal.TransactionWithdrawalHash) - require.Equal(t, predeploys.LegacyERC20ETHAddr, withdrawal.TokenPair.LocalTokenAddress) - require.Equal(t, predeploys.LegacyERC20ETHAddr, withdrawal.TokenPair.RemoteTokenAddress) - require.Equal(t, uint64(params.Ether), withdrawal.Tx.Amount.Uint64()) - require.Equal(t, aliceAddr, withdrawal.Tx.FromAddress) - require.Equal(t, aliceAddr, withdrawal.Tx.ToAddress) - require.Equal(t, byte(1), withdrawal.Tx.Data[0]) - - // StandardBridge flows through the messenger. We remove the first two - // bytes of the nonce dedicated to the version. nonce == 0 (first message) - require.NotNil(t, withdrawal.CrossDomainMessageHash) - - crossDomainBridgeMessage, err := testSuite.DB.BridgeMessages.L2BridgeMessage(*withdrawal.CrossDomainMessageHash) - require.NoError(t, err) - require.Nil(t, crossDomainBridgeMessage.RelayedMessageEventGUID) - - // (2) Test Withdrawal Proven/Finalized. Test the sql join queries to populate the right transaction - require.Empty(t, aliceWithdrawals.Withdrawals[0].ProvenL1TransactionHash) - require.Empty(t, aliceWithdrawals.Withdrawals[0].FinalizedL1TransactionHash) - - // wait for processor catchup - proveReceipt, finalizeReceipt, _, _ := op_e2e.ProveAndFinalizeWithdrawal(t, *testSuite.OpCfg, testSuite.OpSys, "sequencer", testSuite.OpCfg.Secrets.Alice, withdrawReceipt) - require.NoError(t, wait.For(context.Background(), 500*time.Millisecond, func() (bool, error) { - l1Header := testSuite.Indexer.BridgeProcessor.LastFinalizedL1Header - return l1Header != nil && l1Header.Number.Uint64() >= finalizeReceipt.BlockNumber.Uint64(), nil - })) - - aliceWithdrawals, err = testSuite.DB.BridgeTransfers.L2BridgeWithdrawalsByAddress(aliceAddr, "", 100) - require.NoError(t, err) - require.Equal(t, proveReceipt.TxHash, aliceWithdrawals.Withdrawals[0].ProvenL1TransactionHash) - require.Equal(t, finalizeReceipt.TxHash, aliceWithdrawals.Withdrawals[0].FinalizedL1TransactionHash) - require.Equal(t, withdrawReceipt.BlockHash, aliceWithdrawals.Withdrawals[0].L2BlockHash) - - crossDomainBridgeMessage, err = testSuite.DB.BridgeMessages.L2BridgeMessage(*withdrawal.CrossDomainMessageHash) - require.NoError(t, err) - require.NotNil(t, crossDomainBridgeMessage) - require.NotNil(t, crossDomainBridgeMessage.RelayedMessageEventGUID) -} - -func TestE2EBridgeTransfersL2ToL1MessagePasserETHReceive(t *testing.T) { - testSuite := createE2ETestSuite(t) - optimismPortal, err := bindings.NewOptimismPortal(testSuite.OpCfg.L1Deployments.OptimismPortalProxy, testSuite.L1Client) - require.NoError(t, err) - l2ToL1MessagePasser, err := bindings.NewOptimismPortal(predeploys.L2ToL1MessagePasserAddr, testSuite.L2Client) - require.NoError(t, err) - - // 1 ETH transfer - aliceAddr := testSuite.OpCfg.Secrets.Addresses().Alice - l2Opts, err := bind.NewKeyedTransactorWithChainID(testSuite.OpCfg.Secrets.Alice, testSuite.OpCfg.L2ChainIDBig()) - require.NoError(t, err) - l2Opts.Value = big.NewInt(params.Ether) - - // Ensure L1 has enough funds for the withdrawal by depositing an equal amount into the OptimismPortal - l1Opts, err := bind.NewKeyedTransactorWithChainID(testSuite.OpCfg.Secrets.Alice, testSuite.OpCfg.L1ChainIDBig()) - require.NoError(t, err) - l1Opts.Value = l2Opts.Value - depositTx, err := transactions.PadGasEstimate(l1Opts, 1.2, func(opts *bind.TransactOpts) (*types.Transaction, error) { - return optimismPortal.Receive(opts) - }) - require.NoError(t, err) - depositReceipt, err := wait.ForReceiptOK(context.Background(), testSuite.L1Client, depositTx.Hash()) - require.NoError(t, err) - depositInfo, err := e2etest_utils.ParseDepositInfo(depositReceipt) - require.NoError(t, err) - depositL2TxHash := types.NewTx(depositInfo.DepositTx).Hash() - _, err = wait.ForReceiptOK(context.Background(), testSuite.L2Client, depositL2TxHash) - require.NoError(t, err) - - // (1) Test Withdrawal Initiation - l2ToL1MessagePasserWithdrawTx, err := transactions.PadGasEstimate(l2Opts, 1.2, func(opts *bind.TransactOpts) (*types.Transaction, error) { - return l2ToL1MessagePasser.Receive(opts) - }) - require.NoError(t, err) - l2ToL1WithdrawReceipt, err := wait.ForReceiptOK(context.Background(), testSuite.L2Client, l2ToL1MessagePasserWithdrawTx.Hash()) - require.NoError(t, err) - - // wait for processor catchup - require.NoError(t, wait.For(context.Background(), 500*time.Millisecond, func() (bool, error) { - l2Header := testSuite.Indexer.BridgeProcessor.LastL2Header - return l2Header != nil && l2Header.Number.Uint64() >= l2ToL1WithdrawReceipt.BlockNumber.Uint64(), nil - })) - - aliceWithdrawals, err := testSuite.DB.BridgeTransfers.L2BridgeWithdrawalsByAddress(aliceAddr, "", 100) - require.NoError(t, err) - require.Len(t, aliceWithdrawals.Withdrawals, 1) - require.Equal(t, l2ToL1MessagePasserWithdrawTx.Hash().String(), aliceWithdrawals.Withdrawals[0].L2TransactionHash.String()) - - msgPassed, err := withdrawals.ParseMessagePassed(l2ToL1WithdrawReceipt) - require.NoError(t, err) - withdrawalHash, err := withdrawals.WithdrawalHash(msgPassed) - require.NoError(t, err) - - withdrawal := aliceWithdrawals.Withdrawals[0].L2BridgeWithdrawal - require.Equal(t, withdrawalHash, withdrawal.TransactionWithdrawalHash) - require.Equal(t, predeploys.LegacyERC20ETHAddr, withdrawal.TokenPair.LocalTokenAddress) - require.Equal(t, predeploys.LegacyERC20ETHAddr, withdrawal.TokenPair.RemoteTokenAddress) - require.Equal(t, uint64(params.Ether), withdrawal.Tx.Amount.Uint64()) - require.Equal(t, aliceAddr, withdrawal.Tx.FromAddress) - require.Equal(t, aliceAddr, withdrawal.Tx.ToAddress) - require.Len(t, withdrawal.Tx.Data, 0) - - // withdrawal was not sent through the cross domain messenger - require.Nil(t, withdrawal.CrossDomainMessageHash) - - // (2) Test Withdrawal Proven/Finalized. Test the sql join queries to populate the right transaction - require.Empty(t, aliceWithdrawals.Withdrawals[0].ProvenL1TransactionHash) - require.Empty(t, aliceWithdrawals.Withdrawals[0].FinalizedL1TransactionHash) - - // wait for processor catchup - proveReceipt, finalizeReceipt, _, _ := op_e2e.ProveAndFinalizeWithdrawal(t, *testSuite.OpCfg, testSuite.OpSys, "sequencer", testSuite.OpCfg.Secrets.Alice, l2ToL1WithdrawReceipt) - require.NoError(t, wait.For(context.Background(), 500*time.Millisecond, func() (bool, error) { - l1Header := testSuite.Indexer.BridgeProcessor.LastFinalizedL1Header - return l1Header != nil && l1Header.Number.Uint64() >= finalizeReceipt.BlockNumber.Uint64(), nil - })) - - aliceWithdrawals, err = testSuite.DB.BridgeTransfers.L2BridgeWithdrawalsByAddress(aliceAddr, "", 100) - require.NoError(t, err) - require.Equal(t, proveReceipt.TxHash, aliceWithdrawals.Withdrawals[0].ProvenL1TransactionHash) - require.Equal(t, finalizeReceipt.TxHash, aliceWithdrawals.Withdrawals[0].FinalizedL1TransactionHash) -} - -func TestE2EBridgeTransfersCursoredWithdrawals(t *testing.T) { - testSuite := createE2ETestSuite(t) - - l2StandardBridge, err := bindings.NewL2StandardBridge(predeploys.L2StandardBridgeAddr, testSuite.L2Client) - require.NoError(t, err) - l2ToL1MP, err := bindings.NewOptimismPortal(predeploys.L2ToL1MessagePasserAddr, testSuite.L2Client) - require.NoError(t, err) - - aliceAddr := testSuite.OpCfg.Secrets.Addresses().Alice - l2Opts, err := bind.NewKeyedTransactorWithChainID(testSuite.OpCfg.Secrets.Alice, testSuite.OpCfg.L2ChainIDBig()) - require.NoError(t, err) - - // Withdraw 1/2/3 ETH (second deposit via the l2ToL1MP). We dont ever finalize these withdrawals on - // L1 so we dont have to worry about funding the OptimismPortal contract with ETH - var withdrawReceipts [3]*types.Receipt - for i := 0; i < 3; i++ { - var withdrawTx *types.Transaction - l2Opts.Value = big.NewInt(int64((i + 1)) * params.Ether) - if i != 1 { - withdrawTx, err = transactions.PadGasEstimate(l2Opts, 1.1, func(opts *bind.TransactOpts) (*types.Transaction, error) { return l2StandardBridge.Receive(opts) }) - require.NoError(t, err) - } else { - withdrawTx, err = transactions.PadGasEstimate(l2Opts, 1.1, func(opts *bind.TransactOpts) (*types.Transaction, error) { return l2ToL1MP.Receive(opts) }) - require.NoError(t, err) - } - - withdrawReceipt, err := wait.ForReceiptOK(context.Background(), testSuite.L2Client, withdrawTx.Hash()) - require.NoError(t, err, fmt.Sprintf("failed on withdrawal %d", i)) - withdrawReceipts[i] = withdrawReceipt - } - - // wait for processor catchup of the latest tx - require.NoError(t, wait.For(context.Background(), 500*time.Millisecond, func() (bool, error) { - l2Header := testSuite.Indexer.BridgeProcessor.LastL2Header - return l2Header != nil && l2Header.Number.Uint64() >= withdrawReceipts[2].BlockNumber.Uint64(), nil - })) - - // Get All - aliceWithdrawals, err := testSuite.DB.BridgeTransfers.L2BridgeWithdrawalsByAddress(aliceAddr, "", 100) - require.NotNil(t, aliceWithdrawals) - require.NoError(t, err) - require.Len(t, aliceWithdrawals.Withdrawals, 3) - require.False(t, aliceWithdrawals.HasNextPage) - - // Respects Limits & Supplied Cursors - aliceWithdrawals, err = testSuite.DB.BridgeTransfers.L2BridgeWithdrawalsByAddress(aliceAddr, "", 2) - require.NotNil(t, aliceWithdrawals) - require.NoError(t, err) - require.Len(t, aliceWithdrawals.Withdrawals, 2) - require.True(t, aliceWithdrawals.HasNextPage) - - aliceWithdrawals, err = testSuite.DB.BridgeTransfers.L2BridgeWithdrawalsByAddress(aliceAddr, aliceWithdrawals.Cursor, 1) - require.NotNil(t, aliceWithdrawals) - require.NoError(t, err) - require.Len(t, aliceWithdrawals.Withdrawals, 1) - require.False(t, aliceWithdrawals.HasNextPage) - - // Returns the results in the right order - aliceWithdrawals, err = testSuite.DB.BridgeTransfers.L2BridgeWithdrawalsByAddress(aliceAddr, "", 100) - require.NotNil(t, aliceWithdrawals) - require.NoError(t, err) - for i := 0; i < 3; i++ { - withdrawal := aliceWithdrawals.Withdrawals[i] - - // DESCENDING order - require.Equal(t, withdrawReceipts[2-i].TxHash, withdrawal.L2TransactionHash) - require.Equal(t, int64(3-i)*params.Ether, withdrawal.L2BridgeWithdrawal.Tx.Amount.Int64()) - } -} - -func TestClientBridgeFunctions(t *testing.T) { - testSuite := createE2ETestSuite(t) - - // (1) Generate contract bindings for the L1 and L2 standard bridges - optimismPortal, err := bindings.NewOptimismPortal(testSuite.OpCfg.L1Deployments.OptimismPortalProxy, testSuite.L1Client) - require.NoError(t, err) - l2ToL1MessagePasser, err := bindings.NewOptimismPortal(predeploys.L2ToL1MessagePasserAddr, testSuite.L2Client) - require.NoError(t, err) - - // (2) Create test actors that will deposit and withdraw using the standard bridge - aliceAddr := testSuite.OpCfg.Secrets.Addresses().Alice - bobAddr := testSuite.OpCfg.Secrets.Addresses().Bob - - type actor struct { - addr common.Address - priv *ecdsa.PrivateKey - amt *big.Int - receipt *types.Receipt - } - - mintSum := bigint.Zero - - actors := []actor{ - { - addr: aliceAddr, - priv: testSuite.OpCfg.Secrets.Alice, - amt: big.NewInt(0), - }, - { - addr: bobAddr, - priv: testSuite.OpCfg.Secrets.Bob, - amt: big.NewInt(0), - }, - } - - type supplies struct { - all *big.Int - proven *big.Int - finalized *big.Int - } - - s := supplies{ - all: big.NewInt(0), - proven: big.NewInt(0), - finalized: big.NewInt(0), - } - - // (3) Iterate over each actor and deposit / withdraw - for i, actor := range actors { - t.Logf("%d - simulating deposit/withdrawal flow for %s", i, actor.addr.String()) - - l2Opts, err := bind.NewKeyedTransactorWithChainID(actor.priv, testSuite.OpCfg.L2ChainIDBig()) - require.NoError(t, err) - l2Opts.Value = big.NewInt(params.Ether) - - // (3.a) Deposit user funds into L2 via OptimismPortal contract - l1Opts, err := bind.NewKeyedTransactorWithChainID(actor.priv, testSuite.OpCfg.L1ChainIDBig()) - require.NoError(t, err) - l1Opts.Value = l2Opts.Value - depositTx, err := transactions.PadGasEstimate(l1Opts, 1.1, func(opts *bind.TransactOpts) (*types.Transaction, error) { - return optimismPortal.Receive(opts) - }) - require.NoError(t, err) - depositReceipt, err := wait.ForReceiptOK(context.Background(), testSuite.L1Client, depositTx.Hash()) - require.NoError(t, err) - depositInfo, err := e2etest_utils.ParseDepositInfo(depositReceipt) - require.NoError(t, err) - depositL2TxHash := types.NewTx(depositInfo.DepositTx).Hash() - _, err = wait.ForReceiptOK(context.Background(), testSuite.L2Client, depositL2TxHash) - require.NoError(t, err) - - mintSum = new(big.Int).Add(mintSum, depositTx.Value()) - - // (3.b) Initiate withdrawal transaction via L2ToL1MessagePasser contract - l2ToL1MessagePasserWithdrawTx, err := transactions.PadGasEstimate(l2Opts, 1.1, func(opts *bind.TransactOpts) (*types.Transaction, error) { - return l2ToL1MessagePasser.Receive(opts) - }) - require.NoError(t, err) - l2ToL1WithdrawReceipt, err := wait.ForReceiptOK(context.Background(), testSuite.L2Client, l2ToL1MessagePasserWithdrawTx.Hash()) - require.NoError(t, err) - - // (3.c) wait for indexer processor to catchup with the L1 & L2 block containing the deposit & withdrawal tx - require.NoError(t, wait.For(context.Background(), 500*time.Millisecond, func() (bool, error) { - l1Header := testSuite.Indexer.BridgeProcessor.LastL1Header - l2Header := testSuite.Indexer.BridgeProcessor.LastL2Header - seenL2 := l2Header != nil && l2Header.Number.Uint64() >= l2ToL1WithdrawReceipt.BlockNumber.Uint64() - seenL1 := l1Header != nil && l1Header.Number.Uint64() >= depositReceipt.BlockNumber.Uint64() - return seenL1 && seenL2, nil - })) - - s.all = new(big.Int).Add(s.all, l2ToL1MessagePasserWithdrawTx.Value()) - actors[i].receipt = l2ToL1WithdrawReceipt - actors[i].amt = l2ToL1MessagePasserWithdrawTx.Value() - - // (3.d) Ensure that withdrawal and deposit txs are retrievable via API - 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.ApiClient.GetAllWithdrawalsByAddress(actor.addr) - require.NoError(t, err) - require.Len(t, withdrawals, 1) - require.Equal(t, l2ToL1MessagePasserWithdrawTx.Hash().String(), withdrawals[0].TransactionHash) - - } - - // (4) Ensure that supply assessment is correct - assessment, err := testSuite.ApiClient.GetSupplyAssessment() - require.NoError(t, err) - - mintFloat, _ := mintSum.Float64() - require.Equal(t, mintFloat, assessment.L1DepositSum) - - withdrawFloat, _ := s.all.Float64() - require.Equal(t, withdrawFloat, assessment.InitWithdrawalSum) - - require.Equal(t, assessment.ProvenWithdrawSum, float64(0)) - require.Equal(t, assessment.FinalizedWithdrawSum, float64(0)) - - // (5) Prove & finalize withdrawals on L1 - for _, actor := range actors { - params, proveReceipt := op_e2e.ProveWithdrawal(t, *testSuite.OpCfg, testSuite.OpSys, "sequencer", actor.priv, actor.receipt) - require.NoError(t, wait.For(context.Background(), 500*time.Millisecond, func() (bool, error) { - l1Header := testSuite.Indexer.BridgeProcessor.LastL1Header - seen := l1Header != nil && l1Header.Number.Uint64() >= proveReceipt.BlockNumber.Uint64() - return seen, nil - })) - - s.proven = new(big.Int).Add(s.proven, actor.amt) - - finalReceipt, _, _ := op_e2e.FinalizeWithdrawal(t, *testSuite.OpCfg, testSuite.L1Client, actor.priv, proveReceipt, params) - require.NoError(t, wait.For(context.Background(), 500*time.Millisecond, func() (bool, error) { - l1Header := testSuite.Indexer.BridgeProcessor.LastFinalizedL1Header - seen := l1Header != nil && l1Header.Number.Uint64() >= finalReceipt.BlockNumber.Uint64() - return seen, nil - })) - - s.finalized = new(big.Int).Add(s.finalized, actor.amt) - } - - // (6) Validate assessment for proven & finalized withdrawals - assessment, err = testSuite.ApiClient.GetSupplyAssessment() - require.NoError(t, err) - - proven, acc := s.proven.Float64() - require.Zero(t, acc) - require.Equal(t, proven, assessment.ProvenWithdrawSum) - - finalized, acc := s.finalized.Float64() - require.Zero(t, acc) - require.Equal(t, finalized, assessment.FinalizedWithdrawSum) -} diff --git a/indexer/e2e_tests/etl_e2e_test.go b/indexer/e2e_tests/etl_e2e_test.go deleted file mode 100644 index e260313c0a57..000000000000 --- a/indexer/e2e_tests/etl_e2e_test.go +++ /dev/null @@ -1,167 +0,0 @@ -package e2e_tests - -import ( - "context" - "math/big" - "testing" - "time" - - "github.com/ethereum-optimism/optimism/indexer/config" - "github.com/ethereum-optimism/optimism/indexer/database" - "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" - "github.com/ethereum/go-ethereum/accounts/abi/bind" - "github.com/ethereum/go-ethereum/common" - "github.com/ethereum/go-ethereum/rlp" - - "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) - - l2OutputOracle, err := bindings.NewL2OutputOracle(testSuite.OpCfg.L1Deployments.L2OutputOracleProxy, testSuite.L1Client) - require.NoError(t, err) - - disputeGameFactory, err := bindings.NewDisputeGameFactoryCaller(testSuite.OpCfg.L1Deployments.DisputeGameFactoryProxy, testSuite.L1Client) - require.NoError(t, err) - - optimismPortal, err := bindingspreview.NewOptimismPortal2Caller(testSuite.OpCfg.L1Deployments.OptimismPortalProxy, testSuite.L1Client) - require.NoError(t, err) - - // wait for at least 10 L2 blocks posted on L1 - require.NoError(t, wait.For(context.Background(), time.Second, func() (bool, error) { - var l2Height *big.Int - var err error - if e2eutils.UseFPAC() { - gameCount, err := disputeGameFactory.GameCount(&bind.CallOpts{Context: context.Background()}) - require.NoError(t, err) - if gameCount.Cmp(big.NewInt(0)) == 0 { - return false, nil - } - - latestGame, err := withdrawals.FindLatestGame(context.Background(), disputeGameFactory, optimismPortal) - require.NoError(t, err) - l2Height = new(big.Int).SetBytes(latestGame.ExtraData[0:32]) - } else { - l2Height, err = l2OutputOracle.LatestBlockNumber(&bind.CallOpts{Context: context.Background()}) - } - return l2Height != nil && l2Height.Uint64() >= 9, err - })) - - // ensure we've indexed up to this state - l1Height, err := testSuite.L1Client.BlockNumber(context.Background()) - require.NoError(t, err) - require.NoError(t, wait.For(context.Background(), 100*time.Millisecond, func() (bool, error) { - l1Header, err := testSuite.DB.Blocks.L1LatestBlockHeader() - require.NoError(t, err) - - l2Header, err := testSuite.DB.Blocks.L2LatestBlockHeader() - require.NoError(t, err) - - return (l1Header != nil && l1Header.Number.Uint64() >= l1Height) && (l2Header != nil && l2Header.Number.Uint64() >= 9), nil - })) - - t.Run("indexes all L2 blocks", func(t *testing.T) { - latestL2Header, err := testSuite.DB.Blocks.L2LatestBlockHeader() - require.NoError(t, err) - require.NotNil(t, latestL2Header) - require.True(t, latestL2Header.Number.Uint64() >= 9) - - for i := int64(0); i < 10; i++ { - height := big.NewInt(i) - - indexedHeader, err := testSuite.DB.Blocks.L2BlockHeaderWithFilter(database.BlockHeader{Number: height}) - require.NoError(t, err) - require.NotNil(t, indexedHeader) - - header, err := testSuite.L2Client.HeaderByNumber(context.Background(), height) - require.NoError(t, err) - require.NotNil(t, indexedHeader) - - require.Equal(t, header.Number.Int64(), indexedHeader.Number.Int64()) - require.Equal(t, header.Hash(), indexedHeader.Hash) - require.Equal(t, header.ParentHash, indexedHeader.ParentHash) - require.Equal(t, header.Time, indexedHeader.Timestamp) - - // ensure the right rlp encoding is stored. checking the hashes - // suffices as it is based on the rlp bytes of the header - require.Equal(t, header.Hash(), indexedHeader.RLPHeader.Hash()) - } - }) - - t.Run("indexes L1 blocks with accompanying contract event", func(t *testing.T) { - l1Contracts := []common.Address{} - testSuite.OpCfg.L1Deployments.ForEach(func(name string, addr common.Address) { l1Contracts = append(l1Contracts, addr) }) - logFilter := ethereum.FilterQuery{FromBlock: big.NewInt(0), ToBlock: big.NewInt(int64(l1Height)), Addresses: l1Contracts} - logs, err := testSuite.L1Client.FilterLogs(context.Background(), logFilter) // []types.Log - require.NoError(t, err) - - for i := range logs { - log := logs[i] - contractEvent, err := testSuite.DB.ContractEvents.L1ContractEventWithFilter(database.ContractEvent{TransactionHash: log.TxHash, LogIndex: uint64(log.Index)}) - require.NoError(t, err) - require.Equal(t, log.Topics[0], contractEvent.EventSignature) - require.Equal(t, log.BlockHash, contractEvent.BlockHash) - require.Equal(t, log.Address, contractEvent.ContractAddress) - require.Equal(t, log.TxHash, contractEvent.TransactionHash) - require.Equal(t, log.Index, uint(contractEvent.LogIndex)) - - // ensure the right rlp encoding of the contract log is stored - logRlp, err := rlp.EncodeToBytes(&log) - require.NoError(t, err) - contractEventRlp, err := rlp.EncodeToBytes(contractEvent.RLPLog) - require.NoError(t, err) - require.ElementsMatch(t, logRlp, contractEventRlp) - - // ensure the block is also indexed - block, err := testSuite.L1Client.BlockByNumber(context.Background(), big.NewInt(int64(log.BlockNumber))) - require.NoError(t, err) - require.Equal(t, block.Time(), contractEvent.Timestamp) - require.Equal(t, block.Hash(), contractEvent.BlockHash) - - l1BlockHeader, err := testSuite.DB.Blocks.L1BlockHeader(block.Hash()) - require.NoError(t, err) - require.Equal(t, block.Hash(), l1BlockHeader.Hash) - require.Equal(t, block.ParentHash(), l1BlockHeader.ParentHash) - require.Equal(t, block.Number().Uint64(), l1BlockHeader.Number.Uint64()) - require.Equal(t, block.Time(), l1BlockHeader.Timestamp) - - // ensure the right rlp encoding is stored. checking the hashes - // suffices as it is based on the rlp bytes of the header - require.Equal(t, block.Hash(), l1BlockHeader.RLPHeader.Hash()) - } - }) -} diff --git a/indexer/e2e_tests/reorg_e2e_test.go b/indexer/e2e_tests/reorg_e2e_test.go deleted file mode 100644 index 04dcef8f2694..000000000000 --- a/indexer/e2e_tests/reorg_e2e_test.go +++ /dev/null @@ -1,92 +0,0 @@ -package e2e_tests - -import ( - "context" - "math/big" - "testing" - "time" - - "github.com/ethereum-optimism/optimism/indexer/bindings" - "github.com/ethereum-optimism/optimism/indexer/database" - "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" -) - -func TestE2EReorgDeletion(t *testing.T) { - testSuite := createE2ETestSuite(t) - - // Conduct an L1 Deposit/Withdrawal through the standard bridge - // which touches the CDM and root bridge contracts. Thus we'll e2e - // test that the deletes appropriately cascades to all tables - - l1StandardBridge, err := bindings.NewL1StandardBridge(testSuite.OpCfg.L1Deployments.L1StandardBridgeProxy, testSuite.L1Client) - require.NoError(t, err) - l2StandardBridge, err := bindings.NewL2StandardBridge(predeploys.L2StandardBridgeAddr, testSuite.L2Client) - require.NoError(t, err) - - aliceAddr := testSuite.OpCfg.Secrets.Addresses().Alice - - l1Opts, err := bind.NewKeyedTransactorWithChainID(testSuite.OpCfg.Secrets.Alice, testSuite.OpCfg.L1ChainIDBig()) - require.NoError(t, err) - l2Opts, err := bind.NewKeyedTransactorWithChainID(testSuite.OpCfg.Secrets.Alice, testSuite.OpCfg.L2ChainIDBig()) - require.NoError(t, err) - - l1Opts.Value = big.NewInt(params.Ether) - l2Opts.Value = big.NewInt(params.Ether) - - // wait for an L1 block (depends on an emitted event -- L2OO) to get indexed as a reference point prior to deletion - require.NoError(t, wait.For(context.Background(), 500*time.Millisecond, func() (bool, error) { - latestL1Header, err := testSuite.DB.Blocks.L1LatestBlockHeader() - return latestL1Header != nil, err - })) - - depositTx, err := l1StandardBridge.DepositETH(l1Opts, 200_000, []byte{byte(1)}) - require.NoError(t, err) - depositReceipt, err := wait.ForReceiptOK(context.Background(), testSuite.L1Client, depositTx.Hash()) - require.NoError(t, err) - require.NoError(t, wait.For(context.Background(), 500*time.Millisecond, func() (bool, error) { - l1Header := testSuite.Indexer.BridgeProcessor.LastL1Header - return l1Header != nil && l1Header.Number.Uint64() >= depositReceipt.BlockNumber.Uint64(), nil - })) - deposits, err := testSuite.DB.BridgeTransfers.L1BridgeDepositsByAddress(aliceAddr, "", 1) - require.NoError(t, err) - require.Len(t, deposits.Deposits, 1) - - withdrawTx, err := l2StandardBridge.Withdraw(l2Opts, predeploys.LegacyERC20ETHAddr, l2Opts.Value, 200_000, []byte{byte(1)}) - require.NoError(t, err) - withdrawReceipt, err := wait.ForReceiptOK(context.Background(), testSuite.L2Client, withdrawTx.Hash()) - require.NoError(t, err) - require.NoError(t, wait.For(context.Background(), 500*time.Millisecond, func() (bool, error) { - l2Header := testSuite.Indexer.BridgeProcessor.LastL2Header - return l2Header != nil && l2Header.Number.Uint64() >= withdrawReceipt.BlockNumber.Uint64(), nil - })) - withdrawals, err := testSuite.DB.BridgeTransfers.L2BridgeWithdrawalsByAddress(aliceAddr, "", 1) - require.NoError(t, err) - require.Len(t, withdrawals.Withdrawals, 1) - - // Stop the indexer and reorg out L1 state from the deposit transaction - // and implicitly the derived L2 state where the withdrawal was initiated - depositBlock, err := testSuite.DB.Blocks.L1BlockHeaderWithFilter(database.BlockHeader{Number: depositReceipt.BlockNumber}) - require.NoError(t, err) - require.NoError(t, testSuite.Indexer.Stop(context.Background())) - require.NoError(t, testSuite.DB.Blocks.DeleteReorgedState(deposits.Deposits[0].L1BridgeDeposit.Tx.Timestamp)) - - // L1 & L2 block state deleted appropriately - latestL1Header, err := testSuite.DB.Blocks.L2LatestBlockHeader() - require.NoError(t, err) - require.True(t, latestL1Header.Timestamp < depositBlock.Timestamp) - latestL2Header, err := testSuite.DB.Blocks.L2LatestBlockHeader() - require.NoError(t, err) - require.True(t, latestL2Header.Timestamp < depositBlock.Timestamp) - - // Deposits/Withdrawals deletes cascade appropriately from log deletion - deposits, err = testSuite.DB.BridgeTransfers.L1BridgeDepositsByAddress(aliceAddr, "", 1) - require.NoError(t, err) - require.Len(t, deposits.Deposits, 0) - withdrawals, err = testSuite.DB.BridgeTransfers.L2BridgeWithdrawalsByAddress(aliceAddr, "", 1) - require.NoError(t, err) - require.Len(t, withdrawals.Withdrawals, 0) -} diff --git a/indexer/e2e_tests/setup.go b/indexer/e2e_tests/setup.go deleted file mode 100644 index 32d1268e3343..000000000000 --- a/indexer/e2e_tests/setup.go +++ /dev/null @@ -1,210 +0,0 @@ -package e2e_tests - -import ( - "context" - "database/sql" - "fmt" - "os" - "testing" - "time" - - "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" - - op_e2e "github.com/ethereum-optimism/optimism/op-e2e" - oplog "github.com/ethereum-optimism/optimism/op-service/log" - "github.com/ethereum-optimism/optimism/op-service/metrics" - "github.com/ethereum-optimism/optimism/op-service/testlog" - - "github.com/ethereum/go-ethereum/ethclient" - "github.com/ethereum/go-ethereum/log" - - _ "github.com/jackc/pgx/v5/stdlib" - "github.com/prometheus/client_golang/prometheus" - "github.com/stretchr/testify/require" -) - -/* - NOTE - Most of the current bridge tests fetch chain data via direct database queries. These could all - be transitioned to use the API client instead to better simulate/validate real-world usage. - Supporting this would potentially require adding new API endpoints for the specific query lookup types. -*/ - -type E2ETestSuite struct { - t *testing.T - MetricsRegistry *prometheus.Registry - - // API - API *api.APIService - ApiClient *api.Client - - // Indexer - DB *database.DB - Indexer *indexer.Indexer - - // Rollup - OpCfg *op_e2e.SystemConfig - OpSys *op_e2e.System - - // Clients - L1Client *ethclient.Client - 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 - // parallel as the root logger is shared. - oplog.SetGlobalLogHandler(log.DiscardHandler()) -} - -// createE2ETestSuite ... Create a new E2E test suite -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. - t.Parallel() - - opCfg := op_e2e.DefaultSystemConfig(t) - - // Unless specified, omit logs emitted by the various components - if len(os.Getenv("ENABLE_ROLLUP_LOGS")) == 0 { - t.Log("set env 'ENABLE_ROLLUP_LOGS' to show rollup logs") - for name := range opCfg.Loggers { - t.Logf("discarding logs for %s", name) - noopLog := log.NewLogger(log.DiscardHandler()) - opCfg.Loggers[name] = noopLog - } - } - - // Rollup Start - opSys, err := opCfg.Start(t) - require.NoError(t, err) - t.Cleanup(func() { opSys.Close() }) - - // Indexer Configuration and Start - indexerCfg := &config.Config{ - DB: config.DBConfig{Host: "127.0.0.1", Port: 5432, Name: dbName, User: dbUser}, - RPCs: config.RPCsConfig{ - L1RPC: opSys.EthInstances["l1"].HTTPEndpoint(), - L2RPC: opSys.EthInstances["sequencer"].HTTPEndpoint(), - }, - Chain: config.ChainConfig{ - L1PollingInterval: uint(opCfg.DeployConfig.L1BlockTime) * 1000, - L2PollingInterval: uint(opCfg.DeployConfig.L2BlockTime) * 1000, - L2Contracts: config.L2ContractsFromPredeploys(), - L1Contracts: config.L1Contracts{ - AddressManager: opCfg.L1Deployments.AddressManager, - SystemConfigProxy: opCfg.L1Deployments.SystemConfigProxy, - OptimismPortalProxy: opCfg.L1Deployments.OptimismPortalProxy, - L2OutputOracleProxy: opCfg.L1Deployments.L2OutputOracleProxy, - L1CrossDomainMessengerProxy: opCfg.L1Deployments.L1CrossDomainMessengerProxy, - L1StandardBridgeProxy: opCfg.L1Deployments.L1StandardBridgeProxy, - L1ERC721BridgeProxy: opCfg.L1Deployments.L1ERC721BridgeProxy, - DisputeGameFactoryProxy: opCfg.L1Deployments.DisputeGameFactoryProxy, - }, - }, - HTTPServer: config.ServerConfig{Host: "127.0.0.1", Port: 0}, - 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 { - t.Fatalf("indexer shut down with critical error: %v", cause) - } - }) - require.NoError(t, err) - require.NoError(t, ix.Start(context.Background()), "cleanly start indexer") - t.Cleanup(func() { require.NoError(t, ix.Stop(context.Background())) }) - - dbLog := testlog.Logger(t, log.LvlInfo).New("role", "db") - db, err := database.NewDB(context.Background(), dbLog, indexerCfg.DB) - require.NoError(t, err) - t.Cleanup(func() { db.Close() }) - - // API Configuration and Start - apiLog := testlog.Logger(t, log.LevelInfo).New("role", "indexer_api") - apiCfg := &api.Config{ - DB: &api.TestDBConnector{BridgeTransfers: db.BridgeTransfers}, // reuse the same DB - HTTPServer: config.ServerConfig{Host: "127.0.0.1", Port: 0}, - MetricsServer: config.ServerConfig{Host: "127.0.0.1", Port: 0}, - } - - apiService, err := api.NewApi(context.Background(), apiLog, apiCfg) - require.NoError(t, err, "create indexer API service") - require.NoError(t, apiService.Start(context.Background()), "start indexer API service") - t.Cleanup(func() { - require.NoError(t, apiService.Stop(context.Background()), "cleanly shut down indexer") - }) - - // Wait for the API to start listening - time.Sleep(1 * time.Second) - - 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(), - ApiClient: apiClient, - DB: db, - Indexer: ix, - OpCfg: &opCfg, - OpSys: opSys, - L1Client: opSys.Clients["l1"], - L2Client: opSys.Clients["sequencer"], - } -} - -func setupTestDatabase(t *testing.T) string { - user := os.Getenv("DB_USER") - require.NotEmpty(t, user, "DB_USER env variable expected to instantiate test database") - - pg, err := sql.Open("pgx", fmt.Sprintf("postgres://%s@localhost:5432?sslmode=disable", user)) - require.NoError(t, err) - require.NoError(t, pg.Ping()) - - // create database - dbName := fmt.Sprintf("indexer_test_%d", time.Now().UnixNano()) - _, err = pg.Exec("CREATE DATABASE " + dbName) - require.NoError(t, err) - t.Cleanup(func() { - _, err := pg.Exec("DROP DATABASE " + dbName) - require.NoError(t, err) - pg.Close() - }) - - dbConfig := config.DBConfig{ - Host: "127.0.0.1", - Port: 5432, - Name: dbName, - User: user, - Password: "", - } - - noopLog := log.NewLogger(log.DiscardHandler()) - db, err := database.NewDB(context.Background(), noopLog, dbConfig) - require.NoError(t, err) - defer db.Close() - - err = db.ExecuteSQLMigration("../migrations") - require.NoError(t, err) - - t.Logf("database %s setup and migrations executed", dbName) - return dbName -} diff --git a/indexer/e2e_tests/utils/cross_domain_messages.go b/indexer/e2e_tests/utils/cross_domain_messages.go deleted file mode 100644 index f3c5e72b2068..000000000000 --- a/indexer/e2e_tests/utils/cross_domain_messages.go +++ /dev/null @@ -1,62 +0,0 @@ -package utils - -import ( - "errors" - "math/big" - - "github.com/ethereum-optimism/optimism/indexer/bindings" - "github.com/ethereum-optimism/optimism/op-chain-ops/crossdomain" - - "github.com/ethereum/go-ethereum/common" - "github.com/ethereum/go-ethereum/core/types" -) - -type CrossDomainMessengerSentMessage struct { - *bindings.CrossDomainMessengerSentMessage - Value *big.Int - MessageHash common.Hash -} - -func ParseCrossDomainMessage(sentMessageReceipt *types.Receipt) (CrossDomainMessengerSentMessage, error) { - abi, err := bindings.CrossDomainMessengerMetaData.GetAbi() - if err != nil { - return CrossDomainMessengerSentMessage{}, err - } - - sentMessageEventAbi := abi.Events["SentMessage"] - messenger, err := bindings.NewCrossDomainMessenger(common.Address{}, nil) - if err != nil { - return CrossDomainMessengerSentMessage{}, err - } - - for i, log := range sentMessageReceipt.Logs { - if len(log.Topics) > 0 && log.Topics[0] == sentMessageEventAbi.ID { - sentMessage, err := messenger.ParseSentMessage(*log) - if err != nil { - return CrossDomainMessengerSentMessage{}, err - } - sentMessageExtension, err := messenger.ParseSentMessageExtension1(*sentMessageReceipt.Logs[i+1]) - if err != nil { - return CrossDomainMessengerSentMessage{}, err - } - - msg := crossdomain.NewCrossDomainMessage( - sentMessage.MessageNonce, - sentMessage.Sender, - sentMessage.Target, - sentMessageExtension.Value, - sentMessage.GasLimit, - sentMessage.Message, - ) - - msgHash, err := msg.Hash() - if err != nil { - return CrossDomainMessengerSentMessage{}, err - } - - return CrossDomainMessengerSentMessage{sentMessage, sentMessageExtension.Value, msgHash}, nil - } - } - - return CrossDomainMessengerSentMessage{}, errors.New("missing SentMessage receipts") -} diff --git a/indexer/e2e_tests/utils/deposits.go b/indexer/e2e_tests/utils/deposits.go deleted file mode 100644 index 23d29bdbcc53..000000000000 --- a/indexer/e2e_tests/utils/deposits.go +++ /dev/null @@ -1,40 +0,0 @@ -package utils - -import ( - "errors" - - "github.com/ethereum-optimism/optimism/indexer/bindings" - "github.com/ethereum-optimism/optimism/op-node/rollup/derive" - - "github.com/ethereum/go-ethereum/common" - "github.com/ethereum/go-ethereum/core/types" -) - -type DepositInfo struct { - *bindings.OptimismPortalTransactionDeposited - DepositTx *types.DepositTx -} - -func ParseDepositInfo(depositReceipt *types.Receipt) (*DepositInfo, error) { - optimismPortal, err := bindings.NewOptimismPortal(common.Address{}, nil) - if err != nil { - return nil, err - } - - for _, log := range depositReceipt.Logs { - if log.Topics[0] == derive.DepositEventABIHash { - portalTxDeposited, err := optimismPortal.ParseTransactionDeposited(*log) - if err != nil { - return nil, err - } - depositTx, err := derive.UnmarshalDepositLogEvent(log) - if err != nil { - return nil, err - } - - return &DepositInfo{portalTxDeposited, depositTx}, nil - } - } - - return nil, errors.New("cannot find deposit event in receipt") -} diff --git a/indexer/etl/etl.go b/indexer/etl/etl.go deleted file mode 100644 index 380d8ed6815f..000000000000 --- a/indexer/etl/etl.go +++ /dev/null @@ -1,170 +0,0 @@ -package etl - -import ( - "context" - "errors" - "fmt" - "math/big" - "time" - - "github.com/ethereum/go-ethereum" - "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/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 -} - -type ETL struct { - log log.Logger - metrics Metricer - - loopInterval time.Duration - headerBufferSize uint64 - headerTraversal *node.HeaderTraversal - - contracts []common.Address - etlBatches chan *ETLBatch - - client client.Client - - // A reference that'll stay populated between intervals - // in the event of failures in order to retry. - headers []types.Header - - worker *clock.LoopFn -} - -type ETLBatch struct { - Logger log.Logger - - Headers []types.Header - HeaderMap map[common.Hash]*types.Header - - Logs []types.Log - HeadersWithLog map[common.Hash]bool -} - -// Start starts the ETL polling routine. The ETL work should be stopped with Close(). -func (etl *ETL) Start() error { - if etl.worker != nil { - return errors.New("already started") - } - etl.worker = clock.NewLoopFn(clock.SystemClock, etl.tick, func() error { - etl.log.Info("shutting down batch producer") - close(etl.etlBatches) // can close the channel now, to signal to the consumer that we're done - return nil - }, etl.loopInterval) - return nil -} - -func (etl *ETL) Close() error { - if etl.worker == nil { - return nil // worker was not running - } - return etl.worker.Close() -} - -func (etl *ETL) tick(_ context.Context) { - done := etl.metrics.RecordInterval() - if len(etl.headers) > 0 { - etl.log.Info("retrying previous batch") - } else { - newHeaders, err := etl.headerTraversal.NextHeaders(etl.headerBufferSize) - if err != nil { - etl.log.Error("error querying for headers", "err", err) - } else if len(newHeaders) == 0 { - etl.log.Warn("no new headers. etl at head?") - } else { - etl.headers = newHeaders - } - - latestHeader := etl.headerTraversal.LatestHeader() - if latestHeader != nil { - etl.metrics.RecordLatestHeight(latestHeader.Number) - } - } - - // only clear the reference if we were able to process this batch - err := etl.processBatch(etl.headers) - if err == nil { - etl.headers = nil - } - - done(err) -} - -func (etl *ETL) processBatch(headers []types.Header) error { - if len(headers) == 0 { - return nil - } - - firstHeader, lastHeader := headers[0], headers[len(headers)-1] - batchLog := etl.log.New("batch_start_block_number", firstHeader.Number, "batch_end_block_number", lastHeader.Number) - batchLog.Info("extracting batch", "size", len(headers)) - - headerMap := make(map[common.Hash]*types.Header, len(headers)) - for i := range headers { - header := headers[i] - headerMap[header.Hash()] = &header - } - - 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 := node.FilterLogsSafe(ctxwt, etl.client, filterQuery) - if err != nil { - batchLog.Info("failed to extract logs", "err", err) - return err - } - - if logs.ToBlockHeader.Number.Cmp(lastHeader.Number) != 0 { - // Warn and simply wait for the provider to synchronize state - batchLog.Warn("mismatch in FilterLog#ToBlock number", "queried_to_block_number", lastHeader.Number, "reported_to_block_number", logs.ToBlockHeader.Number) - return fmt.Errorf("mismatch in FilterLog#ToBlock number") - } else if logs.ToBlockHeader.Hash() != lastHeader.Hash() { - batchLog.Error("mismatch in FilterLog#ToBlock block hash!!!", "queried_to_block_hash", lastHeader.Hash().String(), "reported_to_block_hash", logs.ToBlockHeader.Hash().String()) - return fmt.Errorf("mismatch in FilterLog#ToBlock block hash!!!") - } - - if len(logs.Logs) > 0 { - batchLog.Info("detected logs", "size", len(logs.Logs)) - } - - for i := range logs.Logs { - log := logs.Logs[i] - headersWithLog[log.BlockHash] = true - if _, ok := headerMap[log.BlockHash]; !ok { - // NOTE. Definitely an error state if the none of the headers were re-orged out in between - // the blocks and logs retrieval operations. Unlikely as long as the confirmation depth has - // been appropriately set or when we get to natively handling reorgs. - batchLog.Error("log found with block hash not in the batch", "block_hash", logs.Logs[i].BlockHash, "log_index", logs.Logs[i].Index) - return errors.New("parsed log with a block hash not in the batch") - } - } - - // ensure we use unique downstream references for the etl batch - headersRef := headers - etl.etlBatches <- &ETLBatch{Logger: batchLog, Headers: headersRef, HeaderMap: headerMap, Logs: logs.Logs, HeadersWithLog: headersWithLog} - return nil -} diff --git a/indexer/etl/l1_etl.go b/indexer/etl/l1_etl.go deleted file mode 100644 index 1fe87db42c86..000000000000 --- a/indexer/etl/l1_etl.go +++ /dev/null @@ -1,253 +0,0 @@ -package etl - -import ( - "context" - "errors" - "fmt" - "strings" - "sync" - "time" - - "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/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 - - cfg Config - - // the batch handler may do work that we can interrupt on shutdown - resourceCtx context.Context - resourceCancel context.CancelFunc - - tasks tasks.Group - - db *database.DB - - mu sync.Mutex - 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 client.Client, - contracts config.L1Contracts, shutdown context.CancelCauseFunc) (*L1ETL, error) { - log = log.New("etl", "l1") - - zeroAddr := common.Address{} - l1Contracts := []common.Address{} - if err := contracts.ForEach(func(name string, addr common.Address) error { - // Since we dont have backfill support yet, we want to make sure all expected - // contracts are specified to ensure consistent behavior. Once backfill support - // is ready, we can relax this requirement. - if addr == zeroAddr && !strings.HasPrefix(name, "Legacy") { - log.Error("address not configured", "name", name) - return errors.New("all L1Contracts must be configured") - } - - log.Info("configured contract", "name", name, "addr", addr) - l1Contracts = append(l1Contracts, addr) - return nil - }); err != nil { - return nil, err - } - - latestHeader, err := db.Blocks.L1LatestBlockHeader() - if err != nil { - return nil, err - } - - // Determine the starting height for traversal - var fromHeader *types.Header - if latestHeader != nil { - log.Info("detected last indexed block", "number", latestHeader.Number, "hash", latestHeader.Hash) - fromHeader = latestHeader.RLPHeader.Header() - } else if cfg.StartHeight.BitLen() > 0 { - log.Info("no indexed state starting from supplied L1 height", "height", cfg.StartHeight.String()) - - 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) - } - - fromHeader = header - } else { - log.Info("no indexed state, starting from genesis") - } - - // NOTE - The use of un-buffered channel here assumes that downstream consumers - // will be able to keep up with the rate of incoming batches. - // When the producer closes the channel we stop consuming from it. - etlBatches := make(chan *ETLBatch) - - etl := ETL{ - loopInterval: time.Duration(cfg.LoopIntervalMsec) * time.Millisecond, - headerBufferSize: uint64(cfg.HeaderBufferSize), - - log: log, - metrics: metrics, - headerTraversal: node.NewHeaderTraversal(client, fromHeader, cfg.ConfirmationDepth), - contracts: l1Contracts, - etlBatches: etlBatches, - - client: client, - } - - resCtx, resCancel := context.WithCancel(context.Background()) - return &L1ETL{ - ETL: etl, - latestHeader: fromHeader, - - cfg: cfg, - - db: db, - resourceCtx: resCtx, - resourceCancel: resCancel, - tasks: tasks.Group{HandleCrit: func(err error) { - shutdown(fmt.Errorf("critical error in L1 ETL: %w", err)) - }}, - }, nil -} - -func (l1Etl *L1ETL) Close() error { - var result error - // close the producer - if err := l1Etl.ETL.Close(); err != nil { - result = errors.Join(result, fmt.Errorf("failed to close internal ETL: %w", err)) - } - // tell the consumer it can stop what it's doing - l1Etl.resourceCancel() - // wait for consumer to pick up on closure of producer - if err := l1Etl.tasks.Wait(); err != nil { - result = errors.Join(result, fmt.Errorf("failed to await batch handler completion: %w", err)) - } - // close listeners - for i := range l1Etl.listeners { - close(l1Etl.listeners[i]) - } - return result -} - -func (l1Etl *L1ETL) Start() error { - l1Etl.log.Info("starting etl...") - - // start ETL batch producer - if err := l1Etl.ETL.Start(); err != nil { - return fmt.Errorf("failed to start internal ETL: %w", err) - } - // start ETL batch consumer - l1Etl.tasks.Go(func() error { - for batch := range l1Etl.etlBatches { - if err := l1Etl.handleBatch(batch); err != nil { - return fmt.Errorf("failed to handle batch, stopping L2 ETL: %w", err) - } - } - l1Etl.log.Info("no more batches, shutting down batch handler") - return nil - }) - return nil -} - -func (l1Etl *L1ETL) handleBatch(batch *ETLBatch) error { - // Index incoming batches (only L1 blocks that have an emitted log) - l1BlockHeaders := make([]database.L1BlockHeader, 0, len(batch.Headers)) - for i := range batch.Headers { - if _, ok := batch.HeadersWithLog[batch.Headers[i].Hash()]; ok { - l1BlockHeaders = append(l1BlockHeaders, database.L1BlockHeader{BlockHeader: database.BlockHeaderFromHeader(&batch.Headers[i])}) - } - } - - // 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 - l1ContractEvents[i] = database.L1ContractEvent{ContractEvent: database.ContractEventFromLog(&batch.Logs[i], timestamp)} - l1Etl.ETL.metrics.RecordIndexedLog(batch.Logs[i].Address) - } - - // 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{}](l1Etl.resourceCtx, 10, retryStrategy, func() (interface{}, error) { - if len(l1BlockHeaders) == 0 { - return nil, nil // skip - } - - if err := l1Etl.db.Transaction(func(tx *database.DB) error { - if err := tx.Blocks.StoreL1BlockHeaders(l1BlockHeaders); err != nil { - return err - } - // we must have logs if we have l1 blocks - if len(l1ContractEvents) > 0 { - if err := tx.ContractEvents.StoreL1ContractEvents(l1ContractEvents); err != nil { - return err - } - } - return nil - }); err != nil { - batch.Logger.Error("unable to persist batch", "err", err) - return nil, fmt.Errorf("unable to persist batch: %w", err) - } - - // a-ok! - return nil, nil - }); err != nil { - return err - } - - if len(l1BlockHeaders) == 0 { - batch.Logger.Info("skipped batch. no logs found") - } else { - batch.Logger.Info("indexed batch") - } - - // 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.ETL.metrics.RecordIndexedHeaders(len(l1BlockHeaders)) - 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] <- l1Etl.latestHeader: - default: - // do nothing if the listener hasn't picked - // up the previous notif - } - } - - return nil -} - -// 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() - - l1Etl.listeners = append(l1Etl.listeners, receiver) - return receiver -} diff --git a/indexer/etl/l1_etl_test.go b/indexer/etl/l1_etl_test.go deleted file mode 100644 index d97909ec0f4d..000000000000 --- a/indexer/etl/l1_etl_test.go +++ /dev/null @@ -1,108 +0,0 @@ -package etl - -import ( - "math/big" - "testing" - - "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/config" - "github.com/ethereum-optimism/optimism/indexer/database" - "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) { - etlMetrics := NewMetrics(metrics.NewRegistry(), "l1") - - type testSuite struct { - db *database.MockDB - client client.Client - start *big.Int - contracts config.L1Contracts - } - - var tests = []struct { - name string - construction func() *testSuite - assertion func(*L1ETL, error) - }{ - { - name: "Start from L1 config height", - construction: func() *testSuite { - client := new(testutils.MockClient) - db := database.NewMockDB() - - testStart := big.NewInt(100) - db.MockBlocks.On("L1LatestBlockHeader").Return(nil, nil) - - client.ExpectHeaderByNumber(big.NewInt(100), &types.Header{ParentHash: common.HexToHash("0x69")}, nil) - - return &testSuite{ - db: db, - client: client, - start: testStart, - - // utilize sample l1 contract configuration (optimism) - contracts: config.Presets[10].ChainConfig.L1Contracts, - } - }, - assertion: func(etl *L1ETL, err error) { - require.NoError(t, err) - require.Equal(t, etl.headerTraversal.LastTraversedHeader().ParentHash, common.HexToHash("0x69")) - }, - }, - { - name: "Start from recent height stored in DB", - construction: func() *testSuite { - client := new(testutils.MockClient) - db := database.NewMockDB() - - testStart := big.NewInt(100) - - db.MockBlocks.On("L1LatestBlockHeader").Return( - &database.L1BlockHeader{ - BlockHeader: database.BlockHeader{ - RLPHeader: &database.RLPHeader{ - Number: big.NewInt(69), - }, - }}, nil) - - return &testSuite{ - db: db, - client: client, - start: testStart, - - // utilize sample l1 contract configuration (optimism) - contracts: config.Presets[10].ChainConfig.L1Contracts, - } - }, - assertion: func(etl *L1ETL, err error) { - require.NoError(t, err) - header := etl.headerTraversal.LastTraversedHeader() - - require.True(t, header.Number.Cmp(big.NewInt(69)) == 0) - }, - }, - } - - for _, test := range tests { - t.Run(test.name, func(t *testing.T) { - ts := test.construction() - - logger := testlog.Logger(t, log.LevelInfo) - cfg := Config{StartHeight: ts.start} - - etl, err := NewL1ETL(cfg, logger, ts.db.DB, etlMetrics, ts.client, ts.contracts, func(cause error) { - t.Fatalf("crit error: %v", cause) - }) - test.assertion(etl, err) - }) - } -} diff --git a/indexer/etl/l2_etl.go b/indexer/etl/l2_etl.go deleted file mode 100644 index f9df6eef7297..000000000000 --- a/indexer/etl/l2_etl.go +++ /dev/null @@ -1,210 +0,0 @@ -package etl - -import ( - "context" - "errors" - "fmt" - "sync" - "time" - - "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/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 - - // the batch handler may do work that we can interrupt on shutdown - resourceCtx context.Context - resourceCancel context.CancelFunc - - tasks tasks.Group - - db *database.DB - - mu sync.Mutex - listeners []chan *types.Header -} - -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") - - zeroAddr := common.Address{} - l2Contracts := []common.Address{} - if err := contracts.ForEach(func(name string, addr common.Address) error { - // Since we dont have backfill support yet, we want to make sure all expected - // contracts are specified to ensure consistent behavior. Once backfill support - // is ready, we can relax this requirement. - if addr == zeroAddr { - log.Error("address not configured", "name", name) - return errors.New("all L2Contracts must be configured") - } - - log.Info("configured contract", "name", name, "addr", addr) - l2Contracts = append(l2Contracts, addr) - return nil - }); err != nil { - return nil, err - } - - latestHeader, err := db.Blocks.L2LatestBlockHeader() - if err != nil { - return nil, err - } - - var fromHeader *types.Header - if latestHeader != nil { - log.Info("detected last indexed block", "number", latestHeader.Number, "hash", latestHeader.Hash) - fromHeader = latestHeader.RLPHeader.Header() - } else { - log.Info("no indexed state, starting from genesis") - } - - etlBatches := make(chan *ETLBatch) - etl := ETL{ - loopInterval: time.Duration(cfg.LoopIntervalMsec) * time.Millisecond, - headerBufferSize: uint64(cfg.HeaderBufferSize), - - log: log, - metrics: metrics, - headerTraversal: node.NewHeaderTraversal(client, fromHeader, cfg.ConfirmationDepth), - contracts: l2Contracts, - etlBatches: etlBatches, - - client: client, - } - - resCtx, resCancel := context.WithCancel(context.Background()) - return &L2ETL{ - ETL: etl, - latestHeader: fromHeader, - - resourceCtx: resCtx, - resourceCancel: resCancel, - db: db, - tasks: tasks.Group{HandleCrit: func(err error) { - shutdown(fmt.Errorf("critical error in L2 ETL: %w", err)) - }}, - }, nil -} - -func (l2Etl *L2ETL) Close() error { - var result error - // close the producer - if err := l2Etl.ETL.Close(); err != nil { - result = errors.Join(result, fmt.Errorf("failed to close internal ETL: %w", err)) - } - // tell the consumer it can stop what it's doing - l2Etl.resourceCancel() - // wait for consumer to pick up on closure of producer - if err := l2Etl.tasks.Wait(); err != nil { - result = errors.Join(result, fmt.Errorf("failed to await batch handler completion: %w", err)) - } - // close listeners - for i := range l2Etl.listeners { - close(l2Etl.listeners[i]) - } - return result -} - -func (l2Etl *L2ETL) Start() error { - l2Etl.log.Info("starting etl...") - - // start ETL batch producer - if err := l2Etl.ETL.Start(); err != nil { - return fmt.Errorf("failed to start internal ETL: %w", err) - } - - // start ETL batch consumer - l2Etl.tasks.Go(func() error { - for batch := range l2Etl.etlBatches { - if err := l2Etl.handleBatch(batch); err != nil { - return fmt.Errorf("failed to handle batch, stopping L2 ETL: %w", err) - } - } - l2Etl.log.Info("no more batches, shutting down batch handler") - return nil - }) - return nil -} - -func (l2Etl *L2ETL) handleBatch(batch *ETLBatch) error { - l2BlockHeaders := make([]database.L2BlockHeader, len(batch.Headers)) - for i := range batch.Headers { - l2BlockHeaders[i] = database.L2BlockHeader{BlockHeader: database.BlockHeaderFromHeader(&batch.Headers[i])} - } - - l2ContractEvents := make([]database.L2ContractEvent, len(batch.Logs)) - for i := range batch.Logs { - timestamp := batch.HeaderMap[batch.Logs[i].BlockHash].Time - l2ContractEvents[i] = database.L2ContractEvent{ContractEvent: database.ContractEventFromLog(&batch.Logs[i], timestamp)} - 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) { - if err := l2Etl.db.Transaction(func(tx *database.DB) error { - if err := tx.Blocks.StoreL2BlockHeaders(l2BlockHeaders); err != nil { - return err - } - if len(l2ContractEvents) > 0 { - if err := tx.ContractEvents.StoreL2ContractEvents(l2ContractEvents); err != nil { - return err - } - } - return nil - }); err != nil { - batch.Logger.Error("unable to persist batch", "err", err) - return nil, err - } - - // a-ok! - return nil, nil - }); err != nil { - return err - } - - 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.ETL.metrics.RecordIndexedHeaders(len(l2BlockHeaders)) - 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] <- l2Etl.latestHeader: - default: - // do nothing if the listener hasn't picked - // up the previous notif - } - } - - return nil -} - -// 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() - - l2Etl.listeners = append(l2Etl.listeners, receiver) - return receiver -} diff --git a/indexer/etl/metrics.go b/indexer/etl/metrics.go deleted file mode 100644 index 5d4b8f6c07ec..000000000000 --- a/indexer/etl/metrics.go +++ /dev/null @@ -1,110 +0,0 @@ -package etl - -import ( - "math/big" - - "github.com/ethereum-optimism/optimism/op-service/metrics" - "github.com/ethereum/go-ethereum/common" - "github.com/prometheus/client_golang/prometheus" -) - -var ( - MetricsNamespace string = "op_indexer_etl" -) - -type Metricer interface { - RecordInterval() (done func(err error)) - RecordLatestHeight(height *big.Int) - - RecordEtlLatestHeight(height *big.Int) - RecordIndexedHeaders(size int) - RecordIndexedLog(contractAddress common.Address) -} - -type etlMetrics struct { - intervalTick prometheus.Counter - intervalDuration prometheus.Histogram - intervalFailures prometheus.Counter - latestHeight prometheus.Gauge - - etlLatestHeight prometheus.Gauge - indexedHeaders prometheus.Counter - indexedLogs *prometheus.CounterVec -} - -func NewMetrics(registry *prometheus.Registry, subsystem string) Metricer { - factory := metrics.With(registry) - return &etlMetrics{ - intervalTick: factory.NewCounter(prometheus.CounterOpts{ - Namespace: MetricsNamespace, - Subsystem: subsystem, - Name: "intervals_total", - Help: "number of times the etl has run its extraction loop", - }), - intervalDuration: factory.NewHistogram(prometheus.HistogramOpts{ - Namespace: MetricsNamespace, - Subsystem: subsystem, - Name: "interval_seconds", - Help: "duration elapsed for during the processing loop", - }), - intervalFailures: factory.NewCounter(prometheus.CounterOpts{ - Namespace: MetricsNamespace, - Subsystem: subsystem, - Name: "interval_failures_total", - Help: "number of times the etl encountered a failure during the processing loop", - }), - latestHeight: factory.NewGauge(prometheus.GaugeOpts{ - Namespace: MetricsNamespace, - Subsystem: subsystem, - Name: "latest_height", - Help: "the latest height reported by the connected client", - }), - etlLatestHeight: factory.NewGauge(prometheus.GaugeOpts{ - Namespace: MetricsNamespace, - Subsystem: subsystem, - Name: "indexed_height", - Help: "the latest block height after a processing interval by the etl", - }), - indexedHeaders: factory.NewCounter(prometheus.CounterOpts{ - Namespace: MetricsNamespace, - Subsystem: subsystem, - Name: "indexed_headers_total", - Help: "number of headers indexed by the etl", - }), - indexedLogs: factory.NewCounterVec(prometheus.CounterOpts{ - Namespace: MetricsNamespace, - Subsystem: subsystem, - Name: "indexed_logs_total", - Help: "number of logs indexed by the etl", - }, []string{ - "contract", - }), - } -} - -func (m *etlMetrics) RecordInterval() func(error) { - m.intervalTick.Inc() - timer := prometheus.NewTimer(m.intervalDuration) - return func(err error) { - if err != nil { - m.intervalFailures.Inc() - } - timer.ObserveDuration() - } -} - -func (m *etlMetrics) RecordLatestHeight(height *big.Int) { - m.latestHeight.Set(float64(height.Uint64())) -} - -func (m *etlMetrics) RecordEtlLatestHeight(height *big.Int) { - m.etlLatestHeight.Set(float64(height.Uint64())) -} - -func (m *etlMetrics) RecordIndexedHeaders(size int) { - m.indexedHeaders.Add(float64(size)) -} - -func (m *etlMetrics) RecordIndexedLog(addr common.Address) { - m.indexedLogs.WithLabelValues(addr.String()).Inc() -} diff --git a/indexer/indexer.go b/indexer/indexer.go deleted file mode 100644 index 631fc594b8d5..000000000000 --- a/indexer/indexer.go +++ /dev/null @@ -1,282 +0,0 @@ -package indexer - -import ( - "context" - "errors" - "fmt" - "math/big" - "net" - "strconv" - "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" - - "github.com/prometheus/client_golang/prometheus" - - "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/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 client.Client - l2Client client.Client - - metricsRegistry *prometheus.Registry - - apiServer *httputil.HTTPServer - metricsServer *httputil.HTTPServer - - L1ETL *etl.L1ETL - L2ETL *etl.L2ETL - BridgeProcessor *processors.BridgeProcessor - - // shutdown requests the service that maintains the indexer to shut down, - // and provides the error-cause of the critical failure (if any). - shutdown context.CancelCauseFunc - - stopped atomic.Bool -} - -// NewIndexer initializes an instance of the Indexer -func NewIndexer(ctx context.Context, log log.Logger, cfg *config.Config, shutdown context.CancelCauseFunc) (*Indexer, error) { - out := &Indexer{ - log: log, - metricsRegistry: metrics.NewRegistry(), - shutdown: shutdown, - } - if err := out.initFromConfig(ctx, cfg); err != nil { - return nil, errors.Join(err, out.Stop(ctx)) - } - return out, nil -} - -func (ix *Indexer) Start(ctx context.Context) error { - // If any of these services has a critical failure, - // the service can request a shutdown, while providing the error cause. - if err := ix.L1ETL.Start(); err != nil { - return fmt.Errorf("failed to start L1 ETL: %w", err) - } - if err := ix.L2ETL.Start(); err != nil { - return fmt.Errorf("failed to start L2 ETL: %w", err) - } - if err := ix.BridgeProcessor.Start(); err != nil { - return fmt.Errorf("failed to start bridge processor: %w", err) - } - return nil -} - -func (ix *Indexer) Stop(ctx context.Context) error { - if ix.stopped.Load() { - return nil - } - - var result error - - if ix.L1ETL != nil { - if err := ix.L1ETL.Close(); err != nil { - result = errors.Join(result, fmt.Errorf("failed to close L1 ETL: %w", err)) - } - } - - if ix.L2ETL != nil { - if err := ix.L2ETL.Close(); err != nil { - result = errors.Join(result, fmt.Errorf("failed to close L2 ETL: %w", err)) - } - } - - if ix.BridgeProcessor != nil { - if err := ix.BridgeProcessor.Close(); err != nil { - result = errors.Join(result, fmt.Errorf("failed to close bridge processor: %w", err)) - } - } - - // Now that the ETLs are closed, we can stop the RPC clients - if ix.l1Client != nil { - ix.l1Client.Close() - } - if ix.l2Client != nil { - ix.l2Client.Close() - } - - if ix.apiServer != nil { - if err := ix.apiServer.Close(); err != nil { - result = errors.Join(result, fmt.Errorf("failed to close indexer API server: %w", err)) - } - } - - // DB connection can be closed last, after all its potential users have shut down - if ix.DB != nil { - if err := ix.DB.Close(); err != nil { - result = errors.Join(result, fmt.Errorf("failed to close DB: %w", err)) - } - } - - if ix.metricsServer != nil { - if err := ix.metricsServer.Close(); err != nil { - result = errors.Join(result, fmt.Errorf("failed to close metrics server: %w", err)) - } - } - - ix.stopped.Store(true) - ix.log.Info("indexer stopped") - return result -} - -func (ix *Indexer) Stopped() bool { - return ix.stopped.Load() -} - -func (ix *Indexer) initFromConfig(ctx context.Context, cfg *config.Config) error { - if err := ix.initRPCClients(ctx, cfg.RPCs); err != nil { - return fmt.Errorf("failed to start RPC clients: %w", err) - } - if err := ix.initDB(ctx, cfg.DB); err != nil { - return fmt.Errorf("failed to init DB: %w", err) - } - if err := ix.initL1ETL(cfg.Chain); err != nil { - return fmt.Errorf("failed to init L1 ETL: %w", err) - } - if err := ix.initL2ETL(cfg.Chain); err != nil { - return fmt.Errorf("failed to init L2 ETL: %w", err) - } - if err := ix.initBridgeProcessor(cfg.Chain); err != nil { - return fmt.Errorf("failed to init Bridge-Processor: %w", err) - } - if err := ix.startHttpServer(ctx, cfg.HTTPServer); err != nil { - return fmt.Errorf("failed to start HTTP server: %w", err) - } - if err := ix.startMetricsServer(ctx, cfg.MetricsServer); err != nil { - return fmt.Errorf("failed to start Metrics server: %w", err) - } - return nil -} - -func (ix *Indexer) initRPCClients(ctx context.Context, rpcsConfig config.RPCsConfig) error { - 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) - } - - 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) - } - - 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 -} - -func (ix *Indexer) initDB(ctx context.Context, cfg config.DBConfig) error { - db, err := database.NewDB(ctx, ix.log, cfg) - if err != nil { - return fmt.Errorf("failed to connect to database: %w", err) - } - ix.DB = db - return nil -} - -func (ix *Indexer) initL1ETL(chainConfig config.ChainConfig) error { - l1Cfg := etl.Config{ - 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) - if err != nil { - return err - } - ix.L1ETL = l1Etl - return nil -} - -func (ix *Indexer) initL2ETL(chainConfig config.ChainConfig) error { - // L2 (defaults to predeploy contracts) - l2Cfg := etl.Config{ - LoopIntervalMsec: chainConfig.L2PollingInterval, - HeaderBufferSize: chainConfig.L2HeaderBufferSize, - ConfirmationDepth: big.NewInt(int64(chainConfig.L2ConfirmationDepth)), - } - l2Etl, err := etl.NewL2ETL(l2Cfg, ix.log, ix.DB, etl.NewMetrics(ix.metricsRegistry, "l2"), - ix.l2Client, chainConfig.L2Contracts, ix.shutdown) - if err != nil { - return err - } - ix.L2ETL = l2Etl - return nil -} - -func (ix *Indexer) initBridgeProcessor(chainConfig config.ChainConfig) error { - bridgeProcessor, err := processors.NewBridgeProcessor( - ix.log, ix.DB, bridge.NewMetrics(ix.metricsRegistry), ix.L1ETL, ix.L2ETL, chainConfig, ix.shutdown) - if err != nil { - return err - } - ix.BridgeProcessor = bridgeProcessor - return nil -} - -func (ix *Indexer) startHttpServer(ctx context.Context, cfg config.ServerConfig) error { - ix.log.Debug("starting http server...", "port", cfg.Port) - - r := chi.NewRouter() - r.Use(middleware.Logger) - r.Use(middleware.Heartbeat("/healthz")) - - // needed so that the middlware gets invoked - r.Get("/", r.NotFoundHandler()) - - addr := net.JoinHostPort(cfg.Host, strconv.Itoa(cfg.Port)) - srv, err := httputil.StartHTTPServer(addr, r) - if err != nil { - return fmt.Errorf("http server failed to start: %w", err) - } - - ix.log.Info("http server started", "addr", srv.Addr()) - ix.apiServer = srv - return nil -} - -func (ix *Indexer) startMetricsServer(ctx context.Context, cfg config.ServerConfig) error { - ix.log.Debug("starting metrics server...", "port", cfg.Port) - srv, err := metrics.StartServer(ix.metricsRegistry, cfg.Host, cfg.Port) - if err != nil { - return fmt.Errorf("metrics server failed to start: %w", err) - } - ix.metricsServer = srv - ix.log.Info("metrics server started", "addr", srv.Addr()) - return nil -} diff --git a/indexer/indexer.toml b/indexer/indexer.toml deleted file mode 100644 index 572f350a3257..000000000000 --- a/indexer/indexer.toml +++ /dev/null @@ -1,60 +0,0 @@ -[chain] -## Required ETL configuration which controls -## the rate and and range at data retrieval -l1-polling-interval = 5000 # 5s -l2-polling-interval = 5000 - -l1-header-buffer-size = 1000 -l2-header-buffer-size = 1000 - -l1-confirmation-depth = 0 # unnecessary for devnet -l2-confirmation-depth = 0 - -### Option 1: Utilize a known preset for chain configuration -### See config/presets.go for available presets. -### i.e OP, Base, Zora, PGN, etc. -preset = 901 # Local Devnet - -### Option 2: Custom Networks -### -### Deployment block height of the rollup. Must be set -### correctly otherwise the ETL will start from L1 -### genesis resulting in a lot of wasted work. Confirmation -### depths should be set appropriately to avoid a the ETL -### getting stuck terminally due to a reorg -# l1-starting-height = 0 -# -# l1-confirmation-depth = 10 -# l2-confirmation-depth = 75 (roughly 10 L1 block equivalent) -# -### These contract addresses MUST be the Proxy contract -### addresses and not the implementation -# [chain.l1-contracts] -# address-manager = "" -# system-config = "" -# optimism-portal = "" -# l2-output-oracle = "" -# l1-cross-domain-messenger = "" -# l1-standard-brigde = "" -# l1-erc721-bridge = "" -### - -[rpcs] -l1-rpc = "${INDEXER_L1_RPC_URL}" -l2-rpc = "${INDEXER_L2_RPC_URL}" - -[db] -host = "${DB_HOST}" -port = ${DB_PORT} -user = "${DB_USER}" -password = "${DB_PWD}" -name = "${DB_NAME}" - -[http] -host = "0.0.0.0" -port = 8100 -timeout = 10 - -[metrics] -host = "0.0.0.0" -port = 7300 diff --git a/indexer/migrations/20230523_create_schema.sql b/indexer/migrations/20230523_create_schema.sql deleted file mode 100644 index 7d0a99d97c12..000000000000 --- a/indexer/migrations/20230523_create_schema.sql +++ /dev/null @@ -1,238 +0,0 @@ -DO $$ -BEGIN - IF NOT EXISTS (SELECT 1 FROM pg_type WHERE typname = 'uint256') THEN - CREATE DOMAIN UINT256 AS NUMERIC - CHECK (VALUE >= 0 AND VALUE < POWER(CAST(2 AS NUMERIC), CAST(256 AS NUMERIC)) AND SCALE(VALUE) = 0); - ELSE - -- To remain backwards compatible, drop the old constraint and re-add. - ALTER DOMAIN UINT256 DROP CONSTRAINT uint256_check; - ALTER DOMAIN UINT256 ADD - CHECK (VALUE >= 0 AND VALUE < POWER(CAST(2 AS NUMERIC), CAST(256 AS NUMERIC)) AND SCALE(VALUE) = 0); - END IF; -END $$; - -/** - * BLOCK DATA - */ - -CREATE TABLE IF NOT EXISTS l1_block_headers ( - -- Searchable fields - hash VARCHAR PRIMARY KEY, - parent_hash VARCHAR NOT NULL UNIQUE, - number UINT256 NOT NULL UNIQUE, - timestamp INTEGER NOT NULL UNIQUE CHECK (timestamp > 0), - - -- Raw Data - rlp_bytes VARCHAR NOT NULL -); -CREATE INDEX IF NOT EXISTS l1_block_headers_timestamp ON l1_block_headers(timestamp); -CREATE INDEX IF NOT EXISTS l1_block_headers_number ON l1_block_headers(number); - -CREATE TABLE IF NOT EXISTS l2_block_headers ( - -- Searchable fields - hash VARCHAR PRIMARY KEY, - parent_hash VARCHAR NOT NULL UNIQUE, - number UINT256 NOT NULL UNIQUE, - timestamp INTEGER NOT NULL CHECK (timestamp > 0), - - -- Raw Data - rlp_bytes VARCHAR NOT NULL -); -CREATE INDEX IF NOT EXISTS l2_block_headers_timestamp ON l2_block_headers(timestamp); -CREATE INDEX IF NOT EXISTS l2_block_headers_number ON l2_block_headers(number); - -/** - * EVENT DATA - */ - -CREATE TABLE IF NOT EXISTS l1_contract_events ( - -- Searchable fields - guid VARCHAR PRIMARY KEY, - block_hash VARCHAR NOT NULL REFERENCES l1_block_headers(hash) ON DELETE CASCADE, - contract_address VARCHAR NOT NULL, - transaction_hash VARCHAR NOT NULL, - log_index INTEGER NOT NULL, - event_signature VARCHAR NOT NULL, -- bytes32(0x0) when topics are missing - timestamp INTEGER NOT NULL CHECK (timestamp > 0), - - -- Raw Data - rlp_bytes VARCHAR NOT NULL, - - UNIQUE(block_hash, log_index) -); -CREATE INDEX IF NOT EXISTS l1_contract_events_timestamp ON l1_contract_events(timestamp); -CREATE INDEX IF NOT EXISTS l1_contract_events_block_hash ON l1_contract_events(block_hash); -CREATE INDEX IF NOT EXISTS l1_contract_events_event_signature ON l1_contract_events(event_signature); -CREATE INDEX IF NOT EXISTS l1_contract_events_contract_address ON l1_contract_events(contract_address); - -CREATE TABLE IF NOT EXISTS l2_contract_events ( - -- Searchable fields - guid VARCHAR PRIMARY KEY, - block_hash VARCHAR NOT NULL REFERENCES l2_block_headers(hash) ON DELETE CASCADE, - contract_address VARCHAR NOT NULL, - transaction_hash VARCHAR NOT NULL, - log_index INTEGER NOT NULL, - event_signature VARCHAR NOT NULL, -- bytes32(0x0) when topics are missing - timestamp INTEGER NOT NULL CHECK (timestamp > 0), - - -- Raw Data - rlp_bytes VARCHAR NOT NULL, - - UNIQUE(block_hash, log_index) -); -CREATE INDEX IF NOT EXISTS l2_contract_events_timestamp ON l2_contract_events(timestamp); -CREATE INDEX IF NOT EXISTS l2_contract_events_block_hash ON l2_contract_events(block_hash); -CREATE INDEX IF NOT EXISTS l2_contract_events_event_signature ON l2_contract_events(event_signature); -CREATE INDEX IF NOT EXISTS l2_contract_events_contract_address ON l2_contract_events(contract_address); - -/** - * BRIDGING DATA - */ - --- OptimismPortal/L2ToL1MessagePasser -CREATE TABLE IF NOT EXISTS l1_transaction_deposits ( - source_hash VARCHAR PRIMARY KEY, - l2_transaction_hash VARCHAR NOT NULL UNIQUE, - initiated_l1_event_guid VARCHAR NOT NULL UNIQUE REFERENCES l1_contract_events(guid) ON DELETE CASCADE, - - -- transaction data. NOTE: `to_address` is the recipient of funds transferred in value field of the - -- L2 deposit transaction and not the amount minted on L1 from the source address. Hence the `amount` - -- column in this table does NOT indicate the amount transferred to the recipient but instead funds - -- bridged from L1 by the `from_address`. - from_address VARCHAR NOT NULL, - to_address VARCHAR NOT NULL, - - -- This refers to the amount MINTED on L2 (msg.value of the L1 transaction). Important distinction from - -- the `value` field of the deposit transaction which simply is the value transferred to specified recipient. - amount UINT256 NOT NULL, - - gas_limit UINT256 NOT NULL, - data VARCHAR NOT NULL, - timestamp INTEGER NOT NULL CHECK (timestamp > 0) -); -CREATE INDEX IF NOT EXISTS l1_transaction_deposits_timestamp ON l1_transaction_deposits(timestamp); -CREATE INDEX IF NOT EXISTS l1_transaction_deposits_initiated_l1_event_guid ON l1_transaction_deposits(initiated_l1_event_guid); -CREATE INDEX IF NOT EXISTS l1_transaction_deposits_from_address ON l1_transaction_deposits(from_address); - -CREATE TABLE IF NOT EXISTS l2_transaction_withdrawals ( - withdrawal_hash VARCHAR PRIMARY KEY, - nonce UINT256 NOT NULL UNIQUE, - initiated_l2_event_guid VARCHAR NOT NULL UNIQUE REFERENCES l2_contract_events(guid) ON DELETE CASCADE, - - -- Multistep (bedrock) process of a withdrawal. With permissionless-output proposals, `proven_l1_event_guid` - -- should be treated as the last known proven event. It may be the case (rare) that the proven state of this - -- withdrawal was invalidated via a fault proof. This case is considered "rare" a malicious outputs are - -- disincentivezed via the posted bond. - proven_l1_event_guid VARCHAR UNIQUE REFERENCES l1_contract_events(guid) ON DELETE SET NULL ON UPDATE CASCADE, - finalized_l1_event_guid VARCHAR UNIQUE REFERENCES l1_contract_events(guid) ON DELETE SET NULL ON UPDATE CASCADE, - succeeded BOOLEAN, - - -- transaction data - from_address VARCHAR NOT NULL, - to_address VARCHAR NOT NULL, - amount UINT256 NOT NULL, - gas_limit UINT256 NOT NULL, - data VARCHAR NOT NULL, - timestamp INTEGER NOT NULL CHECK (timestamp > 0) -); -CREATE INDEX IF NOT EXISTS l2_transaction_withdrawals_timestamp ON l2_transaction_withdrawals(timestamp); -CREATE INDEX IF NOT EXISTS l2_transaction_withdrawals_initiated_l2_event_guid ON l2_transaction_withdrawals(initiated_l2_event_guid); -CREATE INDEX IF NOT EXISTS l2_transaction_withdrawals_proven_l1_event_guid ON l2_transaction_withdrawals(proven_l1_event_guid); -CREATE INDEX IF NOT EXISTS l2_transaction_withdrawals_finalized_l1_event_guid ON l2_transaction_withdrawals(finalized_l1_event_guid); -CREATE INDEX IF NOT EXISTS l2_transaction_withdrawals_from_address ON l2_transaction_withdrawals(from_address); - --- CrossDomainMessenger -CREATE TABLE IF NOT EXISTS l1_bridge_messages( - message_hash VARCHAR PRIMARY KEY, - nonce UINT256 NOT NULL UNIQUE, - transaction_source_hash VARCHAR NOT NULL UNIQUE REFERENCES l1_transaction_deposits(source_hash) ON DELETE CASCADE, - - sent_message_event_guid VARCHAR NOT NULL UNIQUE REFERENCES l1_contract_events(guid) ON DELETE CASCADE, - relayed_message_event_guid VARCHAR UNIQUE REFERENCES l2_contract_events(guid) ON DELETE SET NULL ON UPDATE CASCADE, - - -- sent message - from_address VARCHAR NOT NULL, - to_address VARCHAR NOT NULL, - amount UINT256 NOT NULL, - gas_limit UINT256 NOT NULL, - data VARCHAR NOT NULL, - timestamp INTEGER NOT NULL CHECK (timestamp > 0) -); -CREATE INDEX IF NOT EXISTS l1_bridge_messages_timestamp ON l1_bridge_messages(timestamp); -CREATE INDEX IF NOT EXISTS l1_bridge_messages_transaction_source_hash ON l1_bridge_messages(transaction_source_hash); -CREATE INDEX IF NOT EXISTS l1_bridge_messages_transaction_sent_message_event_guid ON l1_bridge_messages(sent_message_event_guid); -CREATE INDEX IF NOT EXISTS l1_bridge_messages_transaction_relayed_message_event_guid ON l1_bridge_messages(relayed_message_event_guid); -CREATE INDEX IF NOT EXISTS l1_bridge_messages_from_address ON l1_bridge_messages(from_address); - -CREATE TABLE IF NOT EXISTS l2_bridge_messages( - message_hash VARCHAR PRIMARY KEY, - nonce UINT256 NOT NULL UNIQUE, - transaction_withdrawal_hash VARCHAR NOT NULL UNIQUE REFERENCES l2_transaction_withdrawals(withdrawal_hash) ON DELETE CASCADE, - - sent_message_event_guid VARCHAR NOT NULL UNIQUE REFERENCES l2_contract_events(guid) ON DELETE CASCADE, - relayed_message_event_guid VARCHAR UNIQUE REFERENCES l1_contract_events(guid) ON DELETE SET NULL ON UPDATE CASCADE, - - -- sent message - from_address VARCHAR NOT NULL, - to_address VARCHAR NOT NULL, - amount UINT256 NOT NULL, - gas_limit UINT256 NOT NULL, - data VARCHAR NOT NULL, - timestamp INTEGER NOT NULL CHECK (timestamp > 0) -); -CREATE INDEX IF NOT EXISTS l2_bridge_messages_timestamp ON l2_bridge_messages(timestamp); -CREATE INDEX IF NOT EXISTS l2_bridge_messages_transaction_withdrawal_hash ON l2_bridge_messages(transaction_withdrawal_hash); -CREATE INDEX IF NOT EXISTS l2_bridge_messages_transaction_sent_message_event_guid ON l2_bridge_messages(sent_message_event_guid); -CREATE INDEX IF NOT EXISTS l2_bridge_messages_transaction_relayed_message_event_guid ON l2_bridge_messages(relayed_message_event_guid); -CREATE INDEX IF NOT EXISTS l2_bridge_messages_from_address ON l2_bridge_messages(from_address); - -/** - * Since the CDM uses the latest versioned message hash when emitting the `RelayedMessage` event, we need - * to keep track of all of the future versions of message hashes such that legacy messages can be queried - * queried for when relayed on L1 - * - * As new the CDM is updated with new versions, we need to ensure that there's a better way to correlate message between - * chains (adding the message nonce to the RelayedMessage event) or continue to add columns to this table and migrate - * unrelayed messages such that finalization logic can handle switching between the varying versioned message hashes - */ -CREATE TABLE IF NOT EXISTS l2_bridge_message_versioned_message_hashes( - message_hash VARCHAR PRIMARY KEY NOT NULL UNIQUE REFERENCES l2_bridge_messages(message_hash), - - -- only filled in if `message_hash` is for a v0 message - v1_message_hash VARCHAR UNIQUE -); - --- StandardBridge -CREATE TABLE IF NOT EXISTS l1_bridge_deposits ( - transaction_source_hash VARCHAR PRIMARY KEY REFERENCES l1_transaction_deposits(source_hash) ON DELETE CASCADE, - cross_domain_message_hash VARCHAR NOT NULL UNIQUE REFERENCES l1_bridge_messages(message_hash) ON DELETE CASCADE, - - -- Deposit information - from_address VARCHAR NOT NULL, - to_address VARCHAR NOT NULL, - local_token_address VARCHAR NOT NULL, - remote_token_address VARCHAR NOT NULL, - amount UINT256 NOT NULL, - data VARCHAR NOT NULL, - timestamp INTEGER NOT NULL CHECK (timestamp > 0) -); -CREATE INDEX IF NOT EXISTS l1_bridge_deposits_timestamp ON l1_bridge_deposits(timestamp); -CREATE INDEX IF NOT EXISTS l1_bridge_deposits_cross_domain_message_hash ON l1_bridge_deposits(cross_domain_message_hash); -CREATE INDEX IF NOT EXISTS l1_bridge_deposits_from_address ON l1_bridge_deposits(from_address); - -CREATE TABLE IF NOT EXISTS l2_bridge_withdrawals ( - transaction_withdrawal_hash VARCHAR PRIMARY KEY REFERENCES l2_transaction_withdrawals(withdrawal_hash) ON DELETE CASCADE, - cross_domain_message_hash VARCHAR NOT NULL UNIQUE REFERENCES l2_bridge_messages(message_hash) ON DELETE CASCADE, - - -- Withdrawal information - from_address VARCHAR NOT NULL, - to_address VARCHAR NOT NULL, - local_token_address VARCHAR NOT NULL, - remote_token_address VARCHAR NOT NULL, - amount UINT256 NOT NULL, - data VARCHAR NOT NULL, - timestamp INTEGER NOT NULL CHECK (timestamp > 0) -); -CREATE INDEX IF NOT EXISTS l2_bridge_withdrawals_timestamp ON l2_bridge_withdrawals(timestamp); -CREATE INDEX IF NOT EXISTS l2_bridge_withdrawals_cross_domain_message_hash ON l2_bridge_withdrawals(cross_domain_message_hash); -CREATE INDEX IF NOT EXISTS l2_bridge_withdrawals_from_address ON l2_bridge_withdrawals(from_address); diff --git a/indexer/node/client.go b/indexer/node/client.go deleted file mode 100644 index 17bae886ae3f..000000000000 --- a/indexer/node/client.go +++ /dev/null @@ -1,155 +0,0 @@ -package node - -import ( - "context" - "errors" - "fmt" - "math/big" - - "github.com/ethereum-optimism/optimism/op-service/client" - - "github.com/ethereum/go-ethereum" - "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/rpc" -) - -// 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 HeadersByRange(ctx context.Context, c client.Client, startHeight, endHeight *big.Int) ([]types.Header, error) { - if startHeight.Cmp(endHeight) == 0 { - header, err := c.HeaderByNumber(ctx, startHeight) - if err != nil { - return nil, err - } - return []types.Header{*header}, 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") - 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 rpcElem.Result == nil { - break - } - - 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()) - } - } - - headers = append(headers, *header) - } - - return headers, nil -} - -// StorageHash returns the sha3 of the storage root for the specified account -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(ctx, &proof, "eth_getProof", address, nil, toBlockNumArg(blockNumber)) - if err != nil { - return common.Hash{}, err - } - - return proof.StorageHash, nil -} - -type Logs struct { - Logs []types.Log - ToBlockHeader *types.Header -} - -// 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 FilterLogsSafe(ctx context.Context, c client.Client, query ethereum.FilterQuery) (Logs, error) { - arg, err := toFilterArg(query) - if err != nil { - return Logs{}, err - } - - var logs []types.Log - var header types.Header - - batchElems := make([]rpc.BatchElem, 2) - 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} - - if err := c.RPC().BatchCallContext(ctx, batchElems); err != nil { - return Logs{}, err - } - - if batchElems[0].Error != nil { - return Logs{}, fmt.Errorf("unable to query for the `FilterQuery#ToBlock` header: %w", batchElems[0].Error) - } - - if batchElems[1].Error != nil { - return Logs{}, fmt.Errorf("unable to query logs: %w", batchElems[1].Error) - } - - return Logs{Logs: logs, ToBlockHeader: &header}, nil -} - -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 - -func toBlockNumArg(number *big.Int) string { - if number == nil { - return "latest" - } - if number.Sign() >= 0 { - return hexutil.EncodeBig(number) - } - // It's negative. - return rpc.BlockNumber(number.Int64()).String() -} - -func toFilterArg(q ethereum.FilterQuery) (interface{}, error) { - arg := map[string]interface{}{"address": q.Addresses, "topics": q.Topics} - if q.BlockHash != nil { - arg["blockHash"] = *q.BlockHash - if q.FromBlock != nil || q.ToBlock != nil { - return nil, errors.New("cannot specify both BlockHash and FromBlock/ToBlock") - } - } else { - if q.FromBlock == nil { - arg["fromBlock"] = "0x0" - } else { - arg["fromBlock"] = toBlockNumArg(q.FromBlock) - } - arg["toBlock"] = toBlockNumArg(q.ToBlock) - } - return arg, nil -} diff --git a/indexer/node/header_traversal.go b/indexer/node/header_traversal.go deleted file mode 100644 index 6be52c388667..000000000000 --- a/indexer/node/header_traversal.go +++ /dev/null @@ -1,113 +0,0 @@ -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 { - client client.Client - - latestHeader *types.Header - lastTraversedHeader *types.Header - - blockConfirmationDepth *big.Int -} - -// 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(client client.Client, fromHeader *types.Header, confDepth *big.Int) *HeaderTraversal { - return &HeaderTraversal{ - client: client, - lastTraversedHeader: fromHeader, - blockConfirmationDepth: confDepth, - } -} - -// LatestHeader returns the latest header reported by underlying eth client -// as headers are traversed via `NextHeaders`. -func (f *HeaderTraversal) LatestHeader() *types.Header { - return f.latestHeader -} - -// LastTraversedHeader returns the last header traversed. -// - This is useful for testing the state of the HeaderTraversal -// - LastTraversedHeader may be << LatestHeader depending on the number -// headers traversed via `NextHeaders`. -func (f *HeaderTraversal) LastTraversedHeader() *types.Header { - return f.lastTraversedHeader -} - -// 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) { - 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 { - return nil, fmt.Errorf("latest header unreported") - } else { - f.latestHeader = latestHeader - } - - endHeight := new(big.Int).Sub(latestHeader.Number, f.blockConfirmationDepth) - if endHeight.Sign() < 0 { - // No blocks with the provided confirmation depth available - return nil, nil - } - - if f.lastTraversedHeader != nil { - cmp := f.lastTraversedHeader.Number.Cmp(endHeight) - if cmp == 0 { // We're synced to head and there are no new headers - return nil, nil - } else if cmp > 0 { - return nil, ErrHeaderTraversalAheadOfProvider - } - } - - nextHeight := bigint.Zero - if f.lastTraversedHeader != nil { - nextHeight = new(big.Int).Add(f.lastTraversedHeader.Number, bigint.One) - } - - // endHeight = (nextHeight - endHeight) <= maxSize - endHeight = bigint.Clamp(nextHeight, endHeight, maxSize) - - 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) - } - - numHeaders := len(headers) - if numHeaders == 0 { - return nil, nil - } else if f.lastTraversedHeader != nil && headers[0].ParentHash != f.lastTraversedHeader.Hash() { - // The indexer's state is in an irrecoverable state relative to the provider. This - // should never happen since the indexer is dealing with only finalized blocks. - return nil, ErrHeaderTraversalAndProviderMismatchedState - } - - f.lastTraversedHeader = &headers[numHeaders-1] - return headers, nil -} diff --git a/indexer/node/header_traversal_test.go b/indexer/node/header_traversal_test.go deleted file mode 100644 index 2b5ca0528332..000000000000 --- a/indexer/node/header_traversal_test.go +++ /dev/null @@ -1,178 +0,0 @@ -package node - -import ( - "math/big" - "testing" - - "github.com/ethereum-optimism/optimism/indexer/bigint" - "github.com/ethereum-optimism/optimism/op-service/testutils" - "github.com/stretchr/testify/require" - - "github.com/ethereum/go-ethereum/core/types" -) - -// make a set of headers which chain correctly -func makeHeaders(numHeaders uint64, prevHeader *types.Header) []types.Header { - headers := make([]types.Header, numHeaders) - for i := range headers { - if i == 0 { - if prevHeader == nil { - // genesis - headers[i] = types.Header{Number: big.NewInt(0)} - } else { - // chain onto the previous header - headers[i] = types.Header{Number: big.NewInt(prevHeader.Number.Int64() + 1)} - headers[i].ParentHash = prevHeader.Hash() - } - } else { - headers[i] = types.Header{Number: big.NewInt(headers[i-1].Number.Int64() + 1)} - headers[i].ParentHash = headers[i-1].Hash() - } - } - - return headers -} - -func TestHeaderTraversalNextHeadersNoOp(t *testing.T) { - 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)} - headerTraversal := NewHeaderTraversal(client, LastTraversedHeader, bigint.Zero) - - require.Nil(t, headerTraversal.LatestHeader()) - require.NotNil(t, headerTraversal.LastTraversedHeader()) - - // no new headers when matched with head - client.ExpectHeaderByNumber(nil, LastTraversedHeader, nil) - headers, err := headerTraversal.NextHeaders(100) - require.NoError(t, err) - require.Empty(t, headers) - - require.NotNil(t, headerTraversal.LatestHeader()) - require.NotNil(t, headerTraversal.LastTraversedHeader()) - require.Equal(t, LastTraversedHeader.Number.Uint64(), headerTraversal.LatestHeader().Number.Uint64()) -} - -func TestHeaderTraversalNextHeadersCursored(t *testing.T) { - 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, 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] - } - - // traverse blocks [0..4]. Latest reported is 7 - rpc.ExpectBatchCallContext(rpcElems[:5], nil) - _, err := headerTraversal.NextHeaders(5) - require.NoError(t, err) - - require.Equal(t, uint64(7), headerTraversal.LatestHeader().Number.Uint64()) - require.Equal(t, uint64(4), headerTraversal.LastTraversedHeader().Number.Uint64()) - - // blocks [5..9]. Latest Reported is 9 - client.ExpectHeaderByNumber(nil, &headers[9], nil) - rpc.ExpectBatchCallContext(rpcElems[5:], nil) - _, err = headerTraversal.NextHeaders(5) - require.NoError(t, err) - - require.Equal(t, uint64(9), headerTraversal.LatestHeader().Number.Uint64()) - require.Equal(t, uint64(9), headerTraversal.LastTraversedHeader().Number.Uint64()) -} - -func TestHeaderTraversalNextHeadersMaxSize(t *testing.T) { - 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, 100 available headers - headerTraversal := NewHeaderTraversal(client, nil, bigint.Zero) - client.ExpectHeaderByNumber(nil, &types.Header{Number: big.NewInt(100)}, nil) - - headers := makeHeaders(5, 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) - - require.Equal(t, uint64(100), headerTraversal.LatestHeader().Number.Uint64()) - 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]) - 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) - - require.Equal(t, uint64(100), headerTraversal.LatestHeader().Number.Uint64()) - require.Equal(t, uint64(14), headerTraversal.LastTraversedHeader().Number.Uint64()) -} - -func TestHeaderTraversalMismatchedProviderStateError(t *testing.T) { - 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) - 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) - - // 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/ops/assets/architecture.png b/indexer/ops/assets/architecture.png deleted file mode 100644 index 1cff0240406d..000000000000 Binary files a/indexer/ops/assets/architecture.png and /dev/null differ diff --git a/indexer/ops/assets/indexer-service.png b/indexer/ops/assets/indexer-service.png deleted file mode 100644 index 0a72735df6ae..000000000000 Binary files a/indexer/ops/assets/indexer-service.png and /dev/null differ diff --git a/indexer/ops/docs/troubleshooting.md b/indexer/ops/docs/troubleshooting.md deleted file mode 100644 index 3147b57e3145..000000000000 --- a/indexer/ops/docs/troubleshooting.md +++ /dev/null @@ -1,82 +0,0 @@ -# Troubleshooting Runbook -This document provides a set of troubleshooting steps for common failure scenarios and how to resolve them. - -## Indexer Troubleshooting - -### Postgres failures -1. Unable to connect to postgres database: - * Verify that the database is healthy and accessible. - * Verify that the database credentials are correct. - * Verify that the database is not rate limiting connections. - -2. Unable to insert or read rows: - * Verify that the database is healthy and accessible. - * Verify that the database credentials are correct. - * Verify that most recent`./migrations` schemas have been applied to the database. - -### Header Traversal Failure -Header traversal is a client abstraction that allows the indexer to sequentially traverse the chain via batches of blocks. The following are some common failure modes and how to resolve them: -1. `the HeaderTraversal and provider have diverged in state` -This error occurs when the indexer is operating on a different block state than the node. This is typically caused by network reorgs and is the result of `l1-confirmation-depth` or `l2-confirmation-depth` values being set too low. To resolve this issue, - * Delete blocks in the database back to a last known valid L1 height. See the `reorg-delete` command available in the cli that'll appropriately conduct the deletions. - * Increase confirmation depth values - * Restart the indexer - -2. `the HeaderTraversal's internal state is ahead of the provider` -This error occurs when the indexer is operating on a block that the upstream provider does not have. This typically occurs when resyncing upstream node services. This issue typically resolves itself once the upstream node service is fully synced. If the problem persists, please file an issue. - -### L1/L2 Processor Failures -The L1 and L2 processors are responsible for processing new blocks and system txs. Processor failures can spread and contaminate other downstream processors (i.e, bridge) as well. For example, if a L2 processor misses a block and fails to index a `MessagePassed` event, the bridge processor will fail to index the corresponding `WithdrawalProven` event and halt progress. The following are some common failure modes and how to resolve them: - -1. A processor stops syncing arbitrarily due to a network/connectivity issue or syncing too slow. - * Verify that `header-buffer-size` and `polling-interval` config values are sufficiently set in accordance with upstream node rate limits. If misconfigured, the indexer may be rate limited by the upstream node and fail to sync. - * Verify that the upstream dependency is healthy and accessible. - -2. A processor failed to index a block or system tx. This should never happen as resiliency is built into the processor interaction logic, but if it does, the following investigations should be made: - * Verify that `preset` is set to proper L2 chain ID or manually specified contract addresses are correct. If misconfigured, the indexer may be trying to index the wrong system contract addresses. There should be a log at startup that indicates the preset and system contract addresses being used. - * Verify that the upstream node dependency is healthy and accessible. - * Verify data tables to ensure that the block or system tx was indexed. If it wasn't indexed, please file an issue and resync the indexer (see below). - -### Bridge Processor Failures -The bridge processor is responsible for indexing bridge tx and events (i.e, withdrawals, deposits). The bridge processor actively subscribes to new information and scans for newly indexed initialized and finalized bridge events. - -1. A finalized bridge event has no corresponding initiation (e.g, a detected finalized withdrawal has no corresponding proven event persisted in DB). The bridge process will halt indexing until the event is resolved. - * Verify that the indexer is incorrect by checking the L1/L2 block explorers for the corresponding withdrawal hash. The hash should be present on the `OptimismPortal` contract (`provenWithdrawals()`, `finalizedWithdrawals()`) as well as the L2 `L2ToL1MessagePasser` contract (`sentMessages()`). Foundry's `cast logs` [command](https://book.getfoundry.sh/reference/cast/cast-logs) provides a way to quickly do these lookups. If the hash is not present, the withdrawal was not initiated and the bridge processor is correct to halt indexing - > TODO: script that scans for correlated events on L2 using withdrawal hash). If the hash is present, the bridge processor is incorrect and should be investigated further. Please file an issue with the details of the investigation. - -2. Bridge processor halting due to upstream L1/L2 processor failures. See above for troubleshooting steps for L1/L2 processor failures. - * Verify that the bridge processor is not halted due to upstream processor failures. If it is, remediate the upstream processor failures and restart the application. The bridge processor will be able to resume indexing from the last persisted heights. - -### Re-syncing -To resync a deployed indexer, the following steps should be taken: -1. Stop the running indexer service instance (especially if using blue/green deployment strategy). Deleting state while the application is running can cause data corruption since application startups begin operation at the most recent indexed state. -2. Delete the database state. This can be done by doing a cascading delete of both the l1/l2 `blocks` table. This will delete all blocks and associated data (i.e, system events, bridge txs). Since there's referential integrity between the blocks tables and all other table schema, the following commands will delete all data in the database: -```sql -TRUNCATE l1_block_headers CASCADE; -TRUNCATE l2_block_headers CASCADE; -``` -> The indexer syncs L1 & L2 state independently and can thus also be resynced individually as well. -3. Restart the indexer service. The indexer should detect that the database is empty and begin syncing from genesis (i.e, `l2_start_height = 0`, `l1_start_height = l1-starting-height`). This can be verified by checking the logs for the following message: -``` -no indexed state, starting from genesis -``` - -#### Re-syncing just the bridge processor -To resync the bridge processor without re-retrieving L1/L2 contract data, the following steps should be taken: -1. Stop the running indexer service instance. -2. Delete the bridge processor's database state. This can be done by doing performing cascading delete the root bridge tables -- `l1_transaction_deposits` and `l2_transaction_withdrawals`: -```sql -TRUNCATE l1_transaction_deposits CASCADE; -TRUNCATE l2_transaction_withdrawals CASCADE; -``` -> Similar to blocks & logs, deposits & withdrawals are synced independently and can thus be resynced individually as well. The bridge process is smart enough to pause finalization processing until the other side is caught up. For this reason, it's possible to just re-sync deposits or withdrawals. -3. Restart the indexer service. - -## API Troubleshooting - -### API is returning response errors -The API is a read-only service that does not modify the database. If the API is returning errors, it is likely due to the following reasons: - * Verify that the API is able to connect to the database. If the database is down, the API will return errors. - * Verify that http `timeout` env variable is set to a reasonable value. If the timeout is too low, the API may be timing out on requests and returning errors. - * Verify that rate limiting isn't enabled in request routing layer. If rate limiting is enabled, the API may be rate limited and returning errors. - * Verify that service isn't being overloaded by too many requests. If the service is overloaded, the API may be returning errors. diff --git a/indexer/ops/grafana/dashboards/indexer.json b/indexer/ops/grafana/dashboards/indexer.json deleted file mode 100644 index 16a25e4ea93b..000000000000 --- a/indexer/ops/grafana/dashboards/indexer.json +++ /dev/null @@ -1,2384 +0,0 @@ -{ - "annotations": { - "list": [ - { - "builtIn": 1, - "datasource": { - "type": "grafana", - "uid": "-- Grafana --" - }, - "enable": true, - "hide": true, - "iconColor": "rgba(0, 211, 255, 1)", - "name": "Annotations & Alerts", - "type": "dashboard" - } - ] - }, - "editable": true, - "fiscalYearStartMonth": 0, - "graphTooltip": 0, - "id": 164, - "links": [], - "liveNow": false, - "panels": [ - { - "collapsed": false, - "gridPos": { - "h": 1, - "w": 24, - "x": 0, - "y": 0 - }, - "id": 7, - "panels": [], - "title": "ETL Processor (Blocks & Logs)", - "type": "row" - }, - { - "datasource": { - "type": "prometheus", - "uid": "6R74VAnVz" - }, - "fieldConfig": { - "defaults": { - "color": { - "mode": "thresholds" - }, - "mappings": [], - "thresholds": { - "mode": "absolute", - "steps": [ - { - "color": "green", - "value": null - }, - { - "color": "red", - "value": 80 - } - ] - } - }, - "overrides": [] - }, - "gridPos": { - "h": 4, - "w": 4, - "x": 0, - "y": 1 - }, - "id": 3, - "options": { - "colorMode": "value", - "graphMode": "area", - "justifyMode": "auto", - "orientation": "auto", - "reduceOptions": { - "calcs": [ - "lastNotNull" - ], - "fields": "", - "values": false - }, - "textMode": "auto", - "wideLayout": true - }, - "pluginVersion": "10.3.0-63588", - "targets": [ - { - "datasource": { - "type": "prometheus", - "uid": "6R74VAnVz" - }, - "editorMode": "code", - "expr": "op_indexer_etl_l1_indexed_height", - "instant": false, - "legendFormat": "ETL", - "range": true, - "refId": "A" - } - ], - "title": "Indexed L1 Height", - "type": "stat" - }, - { - "datasource": { - "type": "prometheus", - "uid": "6R74VAnVz" - }, - "fieldConfig": { - "defaults": { - "color": { - "mode": "thresholds" - }, - "fieldMinMax": false, - "mappings": [], - "min": 0, - "noValue": "0", - "thresholds": { - "mode": "absolute", - "steps": [ - { - "color": "green", - "value": null - }, - { - "color": "red", - "value": 80 - } - ] - } - }, - "overrides": [] - }, - "gridPos": { - "h": 4, - "w": 3, - "x": 4, - "y": 1 - }, - "id": 25, - "options": { - "colorMode": "value", - "graphMode": "none", - "justifyMode": "auto", - "orientation": "auto", - "reduceOptions": { - "calcs": [ - "lastNotNull" - ], - "fields": "", - "values": false - }, - "textMode": "value", - "wideLayout": true - }, - "pluginVersion": "10.3.0-63588", - "targets": [ - { - "datasource": { - "type": "prometheus", - "uid": "6R74VAnVz" - }, - "editorMode": "code", - "expr": "op_indexer_etl_l1_latest_height", - "instant": false, - "legendFormat": "__auto", - "range": true, - "refId": "A" - } - ], - "title": "Reported L1 Height", - "type": "stat" - }, - { - "datasource": { - "type": "prometheus", - "uid": "6R74VAnVz" - }, - "fieldConfig": { - "defaults": { - "color": { - "mode": "thresholds" - }, - "mappings": [], - "noValue": "0", - "thresholds": { - "mode": "absolute", - "steps": [ - { - "color": "green", - "value": null - }, - { - "color": "red", - "value": 80 - } - ] - }, - "unit": "percentunit" - }, - "overrides": [] - }, - "gridPos": { - "h": 4, - "w": 3, - "x": 7, - "y": 1 - }, - "id": 23, - "options": { - "minVizHeight": 75, - "minVizWidth": 75, - "orientation": "auto", - "reduceOptions": { - "calcs": [ - "lastNotNull" - ], - "fields": "", - "values": false - }, - "showThresholdLabels": false, - "showThresholdMarkers": true, - "sizing": "auto" - }, - "pluginVersion": "10.3.0-63588", - "targets": [ - { - "datasource": { - "type": "prometheus", - "uid": "6R74VAnVz" - }, - "editorMode": "code", - "expr": "op_indexer_etl_l1_indexed_height\n / op_indexer_etl_l1_latest_height\n", - "instant": false, - "legendFormat": "__auto", - "range": true, - "refId": "A" - } - ], - "title": "L1 Sync %", - "type": "gauge" - }, - { - "datasource": { - "type": "prometheus", - "uid": "6R74VAnVz" - }, - "fieldConfig": { - "defaults": { - "color": { - "mode": "palette-classic" - }, - "custom": { - "axisBorderShow": false, - "axisCenteredZero": false, - "axisColorMode": "text", - "axisLabel": "", - "axisPlacement": "auto", - "barAlignment": 0, - "drawStyle": "line", - "fillOpacity": 0, - "gradientMode": "none", - "hideFrom": { - "legend": false, - "tooltip": false, - "viz": false - }, - "insertNulls": false, - "lineInterpolation": "linear", - "lineWidth": 1, - "pointSize": 2, - "scaleDistribution": { - "type": "linear" - }, - "showPoints": "always", - "spanNulls": false, - "stacking": { - "group": "A", - "mode": "none" - }, - "thresholdsStyle": { - "mode": "off" - } - }, - "mappings": [], - "noValue": "0", - "thresholds": { - "mode": "absolute", - "steps": [ - { - "color": "green", - "value": null - }, - { - "color": "red", - "value": 80 - } - ] - }, - "unit": "s" - }, - "overrides": [] - }, - "gridPos": { - "h": 8, - "w": 14, - "x": 10, - "y": 1 - }, - "id": 20, - "options": { - "legend": { - "calcs": [], - "displayMode": "list", - "placement": "bottom", - "showLegend": false - }, - "tooltip": { - "mode": "single", - "sort": "none" - } - }, - "targets": [ - { - "datasource": { - "type": "prometheus", - "uid": "6R74VAnVz" - }, - "editorMode": "code", - "expr": "rate(op_indexer_etl_l1_interval_seconds_sum[$etl_rate_interval])\n/\nrate(op_indexer_etl_l1_interval_seconds_count[$etl_rate_interval])", - "instant": false, - "legendFormat": "l1", - "range": true, - "refId": "A" - }, - { - "datasource": { - "type": "prometheus", - "uid": "6R74VAnVz" - }, - "editorMode": "code", - "expr": "rate(op_indexer_etl_l2_interval_seconds_sum[$etl_rate_interval])\n/\nrate(op_indexer_etl_l2_interval_seconds_count[$etl_rate_interval])", - "hide": false, - "instant": false, - "legendFormat": "l2", - "range": true, - "refId": "B" - } - ], - "title": "AVG ETL Latency", - "type": "timeseries" - }, - { - "datasource": { - "type": "prometheus", - "uid": "6R74VAnVz" - }, - "fieldConfig": { - "defaults": { - "color": { - "mode": "thresholds" - }, - "mappings": [], - "thresholds": { - "mode": "absolute", - "steps": [ - { - "color": "green", - "value": null - }, - { - "color": "red", - "value": 80 - } - ] - } - }, - "overrides": [] - }, - "gridPos": { - "h": 4, - "w": 4, - "x": 0, - "y": 5 - }, - "id": 2, - "options": { - "colorMode": "value", - "graphMode": "area", - "justifyMode": "auto", - "orientation": "auto", - "reduceOptions": { - "calcs": [ - "lastNotNull" - ], - "fields": "", - "values": false - }, - "textMode": "auto", - "wideLayout": true - }, - "pluginVersion": "10.3.0-63588", - "targets": [ - { - "datasource": { - "type": "prometheus", - "uid": "6R74VAnVz" - }, - "disableTextWrap": false, - "editorMode": "code", - "exemplar": true, - "expr": "op_indexer_etl_l2_indexed_height", - "fullMetaSearch": false, - "includeNullMetadata": true, - "instant": false, - "legendFormat": "__auto", - "range": true, - "refId": "A", - "useBackend": false - } - ], - "title": "Indexed L2 Height", - "type": "stat" - }, - { - "datasource": { - "type": "prometheus", - "uid": "6R74VAnVz" - }, - "fieldConfig": { - "defaults": { - "color": { - "mode": "thresholds" - }, - "mappings": [], - "min": 0, - "noValue": "0", - "thresholds": { - "mode": "absolute", - "steps": [ - { - "color": "green", - "value": null - }, - { - "color": "red", - "value": 80 - } - ] - } - }, - "overrides": [] - }, - "gridPos": { - "h": 4, - "w": 3, - "x": 4, - "y": 5 - }, - "id": 26, - "options": { - "colorMode": "value", - "graphMode": "none", - "justifyMode": "auto", - "orientation": "auto", - "reduceOptions": { - "calcs": [ - "lastNotNull" - ], - "fields": "", - "values": false - }, - "textMode": "auto", - "wideLayout": true - }, - "pluginVersion": "10.3.0-63588", - "targets": [ - { - "datasource": { - "type": "prometheus", - "uid": "6R74VAnVz" - }, - "editorMode": "code", - "expr": "op_indexer_etl_l2_latest_height", - "instant": false, - "legendFormat": "__auto", - "range": true, - "refId": "A" - } - ], - "title": "Reported L2 Height", - "type": "stat" - }, - { - "datasource": { - "type": "prometheus", - "uid": "6R74VAnVz" - }, - "fieldConfig": { - "defaults": { - "color": { - "mode": "thresholds" - }, - "mappings": [], - "thresholds": { - "mode": "absolute", - "steps": [ - { - "color": "green", - "value": null - }, - { - "color": "red", - "value": 80 - } - ] - }, - "unit": "percentunit" - }, - "overrides": [] - }, - "gridPos": { - "h": 4, - "w": 3, - "x": 7, - "y": 5 - }, - "id": 24, - "options": { - "minVizHeight": 75, - "minVizWidth": 75, - "orientation": "auto", - "reduceOptions": { - "calcs": [ - "lastNotNull" - ], - "fields": "", - "values": false - }, - "showThresholdLabels": false, - "showThresholdMarkers": true, - "sizing": "auto" - }, - "pluginVersion": "10.3.0-63588", - "targets": [ - { - "datasource": { - "type": "prometheus", - "uid": "6R74VAnVz" - }, - "editorMode": "code", - "expr": "op_indexer_etl_l2_indexed_height\n / op_indexer_etl_l2_latest_height", - "instant": false, - "legendFormat": "__auto", - "range": true, - "refId": "A" - } - ], - "title": "L2 Sync %", - "type": "gauge" - }, - { - "datasource": { - "type": "prometheus", - "uid": "6R74VAnVz" - }, - "fieldConfig": { - "defaults": { - "color": { - "mode": "palette-classic" - }, - "custom": { - "axisBorderShow": false, - "axisCenteredZero": false, - "axisColorMode": "text", - "axisLabel": "", - "axisPlacement": "auto", - "barAlignment": 0, - "drawStyle": "line", - "fillOpacity": 0, - "gradientMode": "none", - "hideFrom": { - "legend": false, - "tooltip": false, - "viz": false - }, - "insertNulls": false, - "lineInterpolation": "linear", - "lineWidth": 1, - "pointSize": 2, - "scaleDistribution": { - "type": "linear" - }, - "showPoints": "always", - "spanNulls": false, - "stacking": { - "group": "A", - "mode": "none" - }, - "thresholdsStyle": { - "mode": "off" - } - }, - "mappings": [], - "noValue": "0", - "thresholds": { - "mode": "absolute", - "steps": [ - { - "color": "green", - "value": null - }, - { - "color": "red", - "value": 80 - } - ] - } - }, - "overrides": [] - }, - "gridPos": { - "h": 7, - "w": 12, - "x": 0, - "y": 9 - }, - "id": 17, - "options": { - "legend": { - "calcs": [], - "displayMode": "list", - "placement": "bottom", - "showLegend": true - }, - "tooltip": { - "mode": "single", - "sort": "none" - } - }, - "targets": [ - { - "datasource": { - "type": "prometheus", - "uid": "6R74VAnVz" - }, - "editorMode": "code", - "expr": "sum by(contract) (rate(op_indexer_etl_l1_indexed_logs_total[$etl_rate_interval])) * 60", - "instant": false, - "legendFormat": "{{contract}}", - "range": true, - "refId": "A" - } - ], - "title": "Indexed L1 Logs / m", - "type": "timeseries" - }, - { - "datasource": { - "type": "prometheus", - "uid": "6R74VAnVz" - }, - "fieldConfig": { - "defaults": { - "color": { - "mode": "palette-classic" - }, - "custom": { - "axisBorderShow": false, - "axisCenteredZero": false, - "axisColorMode": "text", - "axisLabel": "", - "axisPlacement": "auto", - "barAlignment": 0, - "drawStyle": "line", - "fillOpacity": 0, - "gradientMode": "none", - "hideFrom": { - "legend": false, - "tooltip": false, - "viz": false - }, - "insertNulls": false, - "lineInterpolation": "linear", - "lineWidth": 1, - "pointSize": 2, - "scaleDistribution": { - "type": "linear" - }, - "showPoints": "always", - "spanNulls": false, - "stacking": { - "group": "A", - "mode": "none" - }, - "thresholdsStyle": { - "mode": "off" - } - }, - "mappings": [], - "noValue": "0", - "thresholds": { - "mode": "absolute", - "steps": [ - { - "color": "green", - "value": null - }, - { - "color": "red", - "value": 80 - } - ] - } - }, - "overrides": [] - }, - "gridPos": { - "h": 7, - "w": 12, - "x": 12, - "y": 9 - }, - "id": 18, - "options": { - "legend": { - "calcs": [], - "displayMode": "list", - "placement": "bottom", - "showLegend": true - }, - "tooltip": { - "mode": "single", - "sort": "none" - } - }, - "targets": [ - { - "datasource": { - "type": "prometheus", - "uid": "6R74VAnVz" - }, - "editorMode": "code", - "expr": "sum by(contract) (rate(op_indexer_etl_l2_indexed_logs_total[$etl_rate_interval])) * 60", - "instant": false, - "legendFormat": "__auto", - "range": true, - "refId": "A" - } - ], - "title": "Indexed L2 Logs / m", - "type": "timeseries" - }, - { - "collapsed": false, - "gridPos": { - "h": 1, - "w": 24, - "x": 0, - "y": 16 - }, - "id": 8, - "panels": [], - "title": "Bridge Processor", - "type": "row" - }, - { - "datasource": { - "type": "prometheus", - "uid": "6R74VAnVz" - }, - "fieldConfig": { - "defaults": { - "color": { - "mode": "thresholds" - }, - "mappings": [], - "noValue": "0", - "thresholds": { - "mode": "absolute", - "steps": [ - { - "color": "green", - "value": null - }, - { - "color": "red", - "value": 80 - } - ] - } - }, - "overrides": [] - }, - "gridPos": { - "h": 4, - "w": 3, - "x": 0, - "y": 17 - }, - "id": 5, - "options": { - "colorMode": "value", - "graphMode": "area", - "justifyMode": "auto", - "orientation": "auto", - "reduceOptions": { - "calcs": [ - "lastNotNull" - ], - "fields": "", - "values": false - }, - "textMode": "auto", - "wideLayout": true - }, - "pluginVersion": "10.3.0-63588", - "targets": [ - { - "datasource": { - "type": "prometheus", - "uid": "6R74VAnVz" - }, - "editorMode": "code", - "expr": "op_indexer_bridge_height{chain=\"l1\", kind=\"initiated\"}", - "instant": false, - "legendFormat": "initiated", - "range": true, - "refId": "A" - } - ], - "title": "Initiated Bridge L1 Height", - "type": "stat" - }, - { - "datasource": { - "type": "prometheus", - "uid": "6R74VAnVz" - }, - "fieldConfig": { - "defaults": { - "color": { - "mode": "thresholds" - }, - "mappings": [], - "thresholds": { - "mode": "absolute", - "steps": [ - { - "color": "green", - "value": null - }, - { - "color": "red", - "value": 80 - } - ] - }, - "unit": "percentunit" - }, - "overrides": [] - }, - "gridPos": { - "h": 4, - "w": 3, - "x": 3, - "y": 17 - }, - "id": 29, - "options": { - "minVizHeight": 75, - "minVizWidth": 75, - "orientation": "auto", - "reduceOptions": { - "calcs": [ - "lastNotNull" - ], - "fields": "", - "values": false - }, - "showThresholdLabels": false, - "showThresholdMarkers": true, - "sizing": "auto" - }, - "pluginVersion": "10.3.0-63588", - "targets": [ - { - "datasource": { - "type": "prometheus", - "uid": "6R74VAnVz" - }, - "editorMode": "code", - "expr": "op_indexer_bridge_height{chain=\"l1\", kind=\"initiated\"} / on() op_indexer_etl_l1_indexed_height", - "instant": false, - "legendFormat": "__auto", - "range": true, - "refId": "A" - } - ], - "title": "Initiated L1 Sync %", - "type": "gauge" - }, - { - "datasource": { - "type": "prometheus", - "uid": "6R74VAnVz" - }, - "fieldConfig": { - "defaults": { - "color": { - "mode": "thresholds" - }, - "mappings": [], - "thresholds": { - "mode": "absolute", - "steps": [ - { - "color": "green", - "value": null - }, - { - "color": "red", - "value": 80 - } - ] - } - }, - "overrides": [] - }, - "gridPos": { - "h": 4, - "w": 3, - "x": 6, - "y": 17 - }, - "id": 27, - "options": { - "colorMode": "value", - "graphMode": "area", - "justifyMode": "auto", - "orientation": "auto", - "reduceOptions": { - "calcs": [ - "lastNotNull" - ], - "fields": "", - "values": false - }, - "textMode": "auto", - "wideLayout": true - }, - "pluginVersion": "10.3.0-63588", - "targets": [ - { - "datasource": { - "type": "prometheus", - "uid": "6R74VAnVz" - }, - "editorMode": "code", - "expr": "op_indexer_bridge_height{chain=\"l1\", kind=\"finalized\"}", - "instant": false, - "legendFormat": "__auto", - "range": true, - "refId": "A" - } - ], - "title": "Finalized L1 Bridge Height", - "type": "stat" - }, - { - "datasource": { - "type": "prometheus", - "uid": "6R74VAnVz" - }, - "fieldConfig": { - "defaults": { - "color": { - "mode": "thresholds" - }, - "mappings": [], - "thresholds": { - "mode": "absolute", - "steps": [ - { - "color": "green", - "value": null - }, - { - "color": "red", - "value": 80 - } - ] - }, - "unit": "percentunit" - }, - "overrides": [] - }, - "gridPos": { - "h": 4, - "w": 3, - "x": 9, - "y": 17 - }, - "id": 32, - "options": { - "minVizHeight": 75, - "minVizWidth": 75, - "orientation": "auto", - "reduceOptions": { - "calcs": [ - "lastNotNull" - ], - "fields": "", - "values": false - }, - "showThresholdLabels": false, - "showThresholdMarkers": true, - "sizing": "auto" - }, - "pluginVersion": "10.3.0-63588", - "targets": [ - { - "datasource": { - "type": "prometheus", - "uid": "6R74VAnVz" - }, - "editorMode": "code", - "expr": "op_indexer_bridge_height{chain=\"l1\", kind=\"finalized\"} / on() op_indexer_etl_l1_indexed_height", - "instant": false, - "legendFormat": "__auto", - "range": true, - "refId": "A" - } - ], - "title": "Finalized L1 Sync %", - "type": "gauge" - }, - { - "datasource": { - "type": "prometheus", - "uid": "6R74VAnVz" - }, - "fieldConfig": { - "defaults": { - "color": { - "mode": "palette-classic" - }, - "custom": { - "axisBorderShow": false, - "axisCenteredZero": false, - "axisColorMode": "text", - "axisLabel": "", - "axisPlacement": "auto", - "barAlignment": 0, - "drawStyle": "line", - "fillOpacity": 0, - "gradientMode": "none", - "hideFrom": { - "legend": false, - "tooltip": false, - "viz": false - }, - "insertNulls": false, - "lineInterpolation": "linear", - "lineStyle": { - "fill": "solid" - }, - "lineWidth": 1, - "pointSize": 3, - "scaleDistribution": { - "type": "linear" - }, - "showPoints": "always", - "spanNulls": true, - "stacking": { - "group": "A", - "mode": "none" - }, - "thresholdsStyle": { - "mode": "off" - } - }, - "mappings": [], - "noValue": "0", - "thresholds": { - "mode": "absolute", - "steps": [ - { - "color": "green", - "value": null - }, - { - "color": "red", - "value": 80 - } - ] - }, - "unit": "s" - }, - "overrides": [] - }, - "gridPos": { - "h": 8, - "w": 12, - "x": 12, - "y": 17 - }, - "id": 22, - "options": { - "legend": { - "calcs": [], - "displayMode": "list", - "placement": "bottom", - "showLegend": true - }, - "tooltip": { - "mode": "single", - "sort": "none" - } - }, - "targets": [ - { - "datasource": { - "type": "prometheus", - "uid": "6R74VAnVz" - }, - "editorMode": "code", - "expr": "max by(chain) \n(rate(op_indexer_bridge_interval_seconds_sum[$etl_rate_interval])\n/\nrate(op_indexer_bridge_interval_seconds_count[$etl_rate_interval]))", - "instant": false, - "legendFormat": "{{chain}}", - "range": true, - "refId": "A" - } - ], - "title": "AVG Bridge Processing Latency", - "type": "timeseries" - }, - { - "datasource": { - "type": "prometheus", - "uid": "6R74VAnVz" - }, - "fieldConfig": { - "defaults": { - "color": { - "mode": "thresholds" - }, - "mappings": [], - "thresholds": { - "mode": "absolute", - "steps": [ - { - "color": "green", - "value": null - }, - { - "color": "red", - "value": 80 - } - ] - } - }, - "overrides": [] - }, - "gridPos": { - "h": 4, - "w": 3, - "x": 0, - "y": 21 - }, - "id": 6, - "options": { - "colorMode": "value", - "graphMode": "area", - "justifyMode": "auto", - "orientation": "auto", - "reduceOptions": { - "calcs": [ - "lastNotNull" - ], - "fields": "", - "values": false - }, - "textMode": "auto", - "wideLayout": true - }, - "pluginVersion": "10.3.0-63588", - "targets": [ - { - "datasource": { - "type": "prometheus", - "uid": "6R74VAnVz" - }, - "editorMode": "code", - "expr": "op_indexer_bridge_height{chain=\"l2\", kind=\"initiated\"}", - "instant": false, - "legendFormat": "initiated", - "range": true, - "refId": "A" - } - ], - "title": "Initiated Bridge L2 Height", - "type": "stat" - }, - { - "datasource": { - "type": "prometheus", - "uid": "6R74VAnVz" - }, - "fieldConfig": { - "defaults": { - "color": { - "mode": "thresholds" - }, - "mappings": [], - "thresholds": { - "mode": "absolute", - "steps": [ - { - "color": "green", - "value": null - }, - { - "color": "red", - "value": 80 - } - ] - }, - "unit": "percentunit" - }, - "overrides": [] - }, - "gridPos": { - "h": 4, - "w": 3, - "x": 3, - "y": 21 - }, - "id": 30, - "options": { - "minVizHeight": 75, - "minVizWidth": 75, - "orientation": "auto", - "reduceOptions": { - "calcs": [ - "lastNotNull" - ], - "fields": "", - "values": false - }, - "showThresholdLabels": false, - "showThresholdMarkers": true, - "sizing": "auto" - }, - "pluginVersion": "10.3.0-63588", - "targets": [ - { - "datasource": { - "type": "prometheus", - "uid": "6R74VAnVz" - }, - "editorMode": "code", - "expr": "op_indexer_bridge_height{chain=\"l2\", kind=\"initiated\"} / on() op_indexer_etl_l2_indexed_height", - "instant": false, - "legendFormat": "__auto", - "range": true, - "refId": "A" - } - ], - "title": "Initiated L2 Sync %", - "type": "gauge" - }, - { - "datasource": { - "type": "prometheus", - "uid": "6R74VAnVz" - }, - "fieldConfig": { - "defaults": { - "color": { - "mode": "thresholds" - }, - "mappings": [], - "thresholds": { - "mode": "absolute", - "steps": [ - { - "color": "green", - "value": null - }, - { - "color": "red", - "value": 80 - } - ] - } - }, - "overrides": [] - }, - "gridPos": { - "h": 4, - "w": 3, - "x": 6, - "y": 21 - }, - "id": 28, - "options": { - "colorMode": "value", - "graphMode": "area", - "justifyMode": "auto", - "orientation": "auto", - "reduceOptions": { - "calcs": [ - "lastNotNull" - ], - "fields": "", - "values": false - }, - "textMode": "auto", - "wideLayout": true - }, - "pluginVersion": "10.3.0-63588", - "targets": [ - { - "datasource": { - "type": "prometheus", - "uid": "6R74VAnVz" - }, - "editorMode": "code", - "expr": "op_indexer_bridge_height{chain=\"l2\", kind=\"finalized\"}", - "instant": false, - "legendFormat": "__auto", - "range": true, - "refId": "A" - } - ], - "title": "Finalized Bridge L2 Height", - "type": "stat" - }, - { - "datasource": { - "type": "prometheus", - "uid": "6R74VAnVz" - }, - "fieldConfig": { - "defaults": { - "color": { - "mode": "thresholds" - }, - "mappings": [], - "thresholds": { - "mode": "absolute", - "steps": [ - { - "color": "green", - "value": null - }, - { - "color": "red", - "value": 80 - } - ] - }, - "unit": "percentunit" - }, - "overrides": [] - }, - "gridPos": { - "h": 4, - "w": 3, - "x": 9, - "y": 21 - }, - "id": 31, - "options": { - "minVizHeight": 75, - "minVizWidth": 75, - "orientation": "auto", - "reduceOptions": { - "calcs": [ - "lastNotNull" - ], - "fields": "", - "values": false - }, - "showThresholdLabels": false, - "showThresholdMarkers": true, - "sizing": "auto" - }, - "pluginVersion": "10.3.0-63588", - "targets": [ - { - "datasource": { - "type": "prometheus", - "uid": "6R74VAnVz" - }, - "editorMode": "code", - "expr": "op_indexer_bridge_height{chain=\"l2\", kind=\"finalized\"} / on() op_indexer_etl_l2_indexed_height", - "instant": false, - "legendFormat": "__auto", - "range": true, - "refId": "A" - } - ], - "title": "Finalized L2 Sync %", - "type": "gauge" - }, - { - "datasource": { - "type": "prometheus", - "uid": "6R74VAnVz" - }, - "fieldConfig": { - "defaults": { - "color": { - "mode": "palette-classic" - }, - "custom": { - "axisBorderShow": false, - "axisCenteredZero": false, - "axisColorMode": "text", - "axisLabel": "", - "axisPlacement": "auto", - "barAlignment": 0, - "drawStyle": "line", - "fillOpacity": 0, - "gradientMode": "none", - "hideFrom": { - "legend": false, - "tooltip": false, - "viz": false - }, - "insertNulls": false, - "lineInterpolation": "linear", - "lineWidth": 1, - "pointSize": 2, - "scaleDistribution": { - "type": "linear" - }, - "showPoints": "always", - "spanNulls": false, - "stacking": { - "group": "A", - "mode": "none" - }, - "thresholdsStyle": { - "mode": "off" - } - }, - "mappings": [], - "noValue": "0", - "thresholds": { - "mode": "absolute", - "steps": [ - { - "color": "green", - "value": null - }, - { - "color": "red", - "value": 80 - } - ] - } - }, - "overrides": [] - }, - "gridPos": { - "h": 7, - "w": 12, - "x": 0, - "y": 25 - }, - "id": 9, - "options": { - "legend": { - "calcs": [], - "displayMode": "list", - "placement": "bottom", - "showLegend": true - }, - "tooltip": { - "mode": "single", - "sort": "none" - } - }, - "targets": [ - { - "datasource": { - "type": "prometheus", - "uid": "6R74VAnVz" - }, - "editorMode": "code", - "exemplar": true, - "expr": "rate(op_indexer_bridge_tx_deposits[$etl_rate_interval]) * 60", - "instant": false, - "legendFormat": "L1 Transaction Deposits", - "range": true, - "refId": "A" - }, - { - "datasource": { - "type": "prometheus", - "uid": "6R74VAnVz" - }, - "editorMode": "code", - "exemplar": true, - "expr": "rate(op_indexer_bridge_sent_messages{chain=\"l1\"}[$etl_rate_interval]) * 60", - "hide": false, - "instant": false, - "legendFormat": "L1 Sent Messages", - "range": true, - "refId": "B" - }, - { - "datasource": { - "type": "prometheus", - "uid": "6R74VAnVz" - }, - "editorMode": "code", - "expr": "rate(op_indexer_bridge_relayed_messages{chain=\"l1\"}[$etl_rate_interval]) * 60", - "hide": false, - "instant": false, - "legendFormat": "L1 Relayed Messages", - "range": true, - "refId": "C" - }, - { - "datasource": { - "type": "prometheus", - "uid": "6R74VAnVz" - }, - "editorMode": "code", - "expr": "rate(op_indexer_bridge_initiated_token_transfers{chain=\"l1\"}[$etl_rate_interval]) * 60", - "hide": false, - "instant": false, - "legendFormat": "L1 Initiated Bridge Transfers", - "range": true, - "refId": "D" - }, - { - "datasource": { - "type": "prometheus", - "uid": "6R74VAnVz" - }, - "editorMode": "code", - "expr": "rate(op_indexer_bridge_finalized_token_transfers{chain=\"l1\"}[$etl_rate_interval]) * 60", - "hide": false, - "instant": false, - "legendFormat": "L1 Finalized Bridge Transfers", - "range": true, - "refId": "E" - }, - { - "datasource": { - "type": "prometheus", - "uid": "6R74VAnVz" - }, - "editorMode": "code", - "expr": "rate(op_indexer_bridge_skipped_ovm1_withdrawals{chain=\"l1\"}[$etl_rate_interval]) * 60 ", - "hide": false, - "instant": false, - "legendFormat": "Skipped OVM1 Withdrawals", - "range": true, - "refId": "F" - } - ], - "title": "L1 Bridge Transactions / m", - "type": "timeseries" - }, - { - "datasource": { - "type": "prometheus", - "uid": "6R74VAnVz" - }, - "fieldConfig": { - "defaults": { - "color": { - "mode": "palette-classic" - }, - "custom": { - "axisBorderShow": false, - "axisCenteredZero": false, - "axisColorMode": "text", - "axisLabel": "", - "axisPlacement": "auto", - "barAlignment": 0, - "drawStyle": "line", - "fillOpacity": 0, - "gradientMode": "none", - "hideFrom": { - "legend": false, - "tooltip": false, - "viz": false - }, - "insertNulls": false, - "lineInterpolation": "linear", - "lineWidth": 1, - "pointSize": 2, - "scaleDistribution": { - "type": "linear" - }, - "showPoints": "always", - "spanNulls": false, - "stacking": { - "group": "A", - "mode": "none" - }, - "thresholdsStyle": { - "mode": "off" - } - }, - "mappings": [], - "noValue": "0", - "thresholds": { - "mode": "absolute", - "steps": [ - { - "color": "green", - "value": null - }, - { - "color": "red", - "value": 80 - } - ] - } - }, - "overrides": [] - }, - "gridPos": { - "h": 7, - "w": 12, - "x": 12, - "y": 25 - }, - "id": 11, - "options": { - "legend": { - "calcs": [], - "displayMode": "list", - "placement": "bottom", - "showLegend": true - }, - "tooltip": { - "mode": "single", - "sort": "none" - } - }, - "targets": [ - { - "datasource": { - "type": "prometheus", - "uid": "6R74VAnVz" - }, - "editorMode": "code", - "expr": "rate(op_indexer_bridge_tx_minted_eth[$etl_rate_interval]) * 60", - "instant": false, - "legendFormat": "Minted ETH", - "range": true, - "refId": "A" - }, - { - "datasource": { - "type": "prometheus", - "uid": "6R74VAnVz" - }, - "editorMode": "code", - "expr": "rate(op_indexer_bridge_tx_withdrawn_eth[$etl_rate_interval]) * 60", - "hide": false, - "instant": false, - "legendFormat": "Withdrawn ETH", - "range": true, - "refId": "B" - } - ], - "title": "Transferred ETH / m", - "type": "timeseries" - }, - { - "datasource": { - "type": "prometheus", - "uid": "6R74VAnVz" - }, - "fieldConfig": { - "defaults": { - "color": { - "mode": "palette-classic" - }, - "custom": { - "axisBorderShow": false, - "axisCenteredZero": false, - "axisColorMode": "text", - "axisLabel": "", - "axisPlacement": "auto", - "barAlignment": 0, - "drawStyle": "line", - "fillOpacity": 0, - "gradientMode": "none", - "hideFrom": { - "legend": false, - "tooltip": false, - "viz": false - }, - "insertNulls": false, - "lineInterpolation": "linear", - "lineWidth": 1, - "pointSize": 2, - "scaleDistribution": { - "type": "linear" - }, - "showPoints": "always", - "spanNulls": false, - "stacking": { - "group": "A", - "mode": "none" - }, - "thresholdsStyle": { - "mode": "off" - } - }, - "mappings": [], - "noValue": "0", - "thresholds": { - "mode": "absolute", - "steps": [ - { - "color": "green", - "value": null - }, - { - "color": "red", - "value": 80 - } - ] - } - }, - "overrides": [] - }, - "gridPos": { - "h": 7, - "w": 12, - "x": 0, - "y": 32 - }, - "id": 10, - "options": { - "legend": { - "calcs": [], - "displayMode": "list", - "placement": "bottom", - "showLegend": true - }, - "tooltip": { - "mode": "single", - "sort": "none" - } - }, - "targets": [ - { - "datasource": { - "type": "prometheus", - "uid": "6R74VAnVz" - }, - "editorMode": "code", - "expr": "rate(op_indexer_bridge_tx_withdrawals[$etl_rate_interval]) * 60", - "instant": false, - "legendFormat": "L2 Transaction Withdrawals", - "range": true, - "refId": "A" - }, - { - "datasource": { - "type": "prometheus", - "uid": "6R74VAnVz" - }, - "editorMode": "code", - "expr": "rate(op_indexer_bridge_sent_messages{chain=\"l2\"}[$etl_rate_interval]) * 60", - "hide": false, - "instant": false, - "legendFormat": "L2 Sent Messages", - "range": true, - "refId": "B" - }, - { - "datasource": { - "type": "prometheus", - "uid": "6R74VAnVz" - }, - "editorMode": "code", - "expr": "rate(op_indexer_bridge_relayed_messages{chain=\"l2\"}[$etl_rate_interval]) * 60", - "hide": false, - "instant": false, - "legendFormat": "L2 Relayed Messages", - "range": true, - "refId": "C" - }, - { - "datasource": { - "type": "prometheus", - "uid": "6R74VAnVz" - }, - "editorMode": "code", - "expr": "rate(op_indexer_bridge_initiated_token_transfers{chain=\"l2\"}[$etl_rate_interval]) * 60", - "hide": false, - "instant": false, - "legendFormat": "L2 Initiated Bridge Transfers", - "range": true, - "refId": "D" - }, - { - "datasource": { - "type": "prometheus", - "uid": "6R74VAnVz" - }, - "editorMode": "code", - "expr": "rate(op_indexer_bridge_finalized_token_transfers{chain=\"l2\"}[$etl_rate_interval]) * 60", - "hide": false, - "instant": false, - "legendFormat": "L2 Finalized Bridge Transfers", - "range": true, - "refId": "E" - } - ], - "title": "L2 Bridge Transactions / m", - "type": "timeseries" - }, - { - "datasource": { - "type": "prometheus", - "uid": "6R74VAnVz" - }, - "fieldConfig": { - "defaults": { - "color": { - "mode": "palette-classic" - }, - "custom": { - "axisBorderShow": false, - "axisCenteredZero": false, - "axisColorMode": "text", - "axisLabel": "", - "axisPlacement": "auto", - "barAlignment": 0, - "drawStyle": "line", - "fillOpacity": 0, - "gradientMode": "none", - "hideFrom": { - "legend": false, - "tooltip": false, - "viz": false - }, - "insertNulls": false, - "lineInterpolation": "linear", - "lineWidth": 1, - "pointSize": 2, - "scaleDistribution": { - "type": "linear" - }, - "showPoints": "always", - "spanNulls": false, - "stacking": { - "group": "A", - "mode": "none" - }, - "thresholdsStyle": { - "mode": "off" - } - }, - "mappings": [], - "noValue": "0", - "thresholds": { - "mode": "absolute", - "steps": [ - { - "color": "green", - "value": null - }, - { - "color": "red", - "value": 80 - } - ] - } - }, - "overrides": [] - }, - "gridPos": { - "h": 7, - "w": 12, - "x": 12, - "y": 32 - }, - "id": 12, - "options": { - "legend": { - "calcs": [], - "displayMode": "list", - "placement": "bottom", - "showLegend": true - }, - "tooltip": { - "mode": "single", - "sort": "none" - } - }, - "targets": [ - { - "datasource": { - "type": "prometheus", - "uid": "6R74VAnVz" - }, - "disableTextWrap": false, - "editorMode": "code", - "expr": "sum by(token_address) (rate(op_indexer_bridge_initiated_token_transfers{token_address!=\"0xDeadDeAddeAddEAddeadDEaDDEAdDeaDDeAD0000\"}[$etl_rate_interval])) * 60", - "fullMetaSearch": false, - "includeNullMetadata": true, - "instant": false, - "legendFormat": "{{token_address}}", - "range": true, - "refId": "A", - "useBackend": false - } - ], - "title": "Transferred ERC20 / m", - "type": "timeseries" - }, - { - "collapsed": false, - "gridPos": { - "h": 1, - "w": 24, - "x": 0, - "y": 39 - }, - "id": 13, - "panels": [], - "title": "RPC", - "type": "row" - }, - { - "datasource": { - "type": "prometheus", - "uid": "6R74VAnVz" - }, - "fieldConfig": { - "defaults": { - "color": { - "mode": "palette-classic" - }, - "custom": { - "axisBorderShow": false, - "axisCenteredZero": false, - "axisColorMode": "text", - "axisLabel": "", - "axisPlacement": "auto", - "barAlignment": 0, - "drawStyle": "line", - "fillOpacity": 0, - "gradientMode": "none", - "hideFrom": { - "legend": false, - "tooltip": false, - "viz": false - }, - "insertNulls": false, - "lineInterpolation": "linear", - "lineWidth": 1, - "pointSize": 2, - "scaleDistribution": { - "type": "linear" - }, - "showPoints": "always", - "spanNulls": false, - "stacking": { - "group": "A", - "mode": "none" - }, - "thresholdsStyle": { - "mode": "off" - } - }, - "mappings": [], - "noValue": "0", - "thresholds": { - "mode": "absolute", - "steps": [ - { - "color": "green", - "value": null - }, - { - "color": "red", - "value": 80 - } - ] - }, - "unit": "reqpm" - }, - "overrides": [] - }, - "gridPos": { - "h": 7, - "w": 12, - "x": 0, - "y": 40 - }, - "id": 14, - "options": { - "legend": { - "calcs": [], - "displayMode": "list", - "placement": "bottom", - "showLegend": true - }, - "tooltip": { - "mode": "single", - "sort": "none" - } - }, - "targets": [ - { - "datasource": { - "type": "prometheus", - "uid": "6R74VAnVz" - }, - "editorMode": "code", - "expr": "sum by(method) (rate(op_indexer_rpc_l1_requests_total[$etl_rate_interval])) * 60", - "instant": false, - "legendFormat": "{{method}}", - "range": true, - "refId": "A" - }, - { - "datasource": { - "type": "prometheus", - "uid": "6R74VAnVz" - }, - "editorMode": "code", - "expr": "sum by(method,error) (rate(op_indexer_rpc_l1_responses_total{error!=\"\"}[$etl_rate_interval])) * 60", - "hide": false, - "instant": false, - "legendFormat": "{{method}} (error: {{error}})", - "range": true, - "refId": "B" - } - ], - "title": "L1 RPC / m", - "type": "timeseries" - }, - { - "datasource": { - "type": "prometheus", - "uid": "6R74VAnVz" - }, - "fieldConfig": { - "defaults": { - "color": { - "mode": "palette-classic" - }, - "custom": { - "axisBorderShow": false, - "axisCenteredZero": false, - "axisColorMode": "text", - "axisLabel": "", - "axisPlacement": "auto", - "barAlignment": 0, - "drawStyle": "line", - "fillOpacity": 0, - "gradientMode": "none", - "hideFrom": { - "legend": false, - "tooltip": false, - "viz": false - }, - "insertNulls": false, - "lineInterpolation": "linear", - "lineWidth": 1, - "pointSize": 2, - "scaleDistribution": { - "type": "linear" - }, - "showPoints": "always", - "spanNulls": false, - "stacking": { - "group": "A", - "mode": "none" - }, - "thresholdsStyle": { - "mode": "off" - } - }, - "mappings": [], - "noValue": "0", - "thresholds": { - "mode": "absolute", - "steps": [ - { - "color": "green", - "value": null - }, - { - "color": "red", - "value": 80 - } - ] - }, - "unit": "s" - }, - "overrides": [] - }, - "gridPos": { - "h": 7, - "w": 12, - "x": 12, - "y": 40 - }, - "id": 16, - "options": { - "legend": { - "calcs": [], - "displayMode": "list", - "placement": "bottom", - "showLegend": true - }, - "tooltip": { - "mode": "single", - "sort": "none" - } - }, - "pluginVersion": "10.3.0-62488", - "targets": [ - { - "datasource": { - "type": "prometheus", - "uid": "6R74VAnVz" - }, - "editorMode": "code", - "expr": "sum by(method) (rate(op_indexer_rpc_l1_request_duration_seconds_sum[$etl_rate_interval])\n/\nrate(op_indexer_rpc_l1_request_duration_seconds_count[$etl_rate_interval]))", - "hide": false, - "instant": false, - "legendFormat": "{{method}}", - "range": true, - "refId": "A" - } - ], - "title": "AVG L1 RPC Latency", - "type": "timeseries" - }, - { - "datasource": { - "type": "prometheus", - "uid": "6R74VAnVz" - }, - "fieldConfig": { - "defaults": { - "color": { - "mode": "palette-classic" - }, - "custom": { - "axisBorderShow": false, - "axisCenteredZero": false, - "axisColorMode": "text", - "axisLabel": "", - "axisPlacement": "auto", - "barAlignment": 0, - "drawStyle": "line", - "fillOpacity": 0, - "gradientMode": "none", - "hideFrom": { - "legend": false, - "tooltip": false, - "viz": false - }, - "insertNulls": false, - "lineInterpolation": "linear", - "lineWidth": 1, - "pointSize": 2, - "scaleDistribution": { - "type": "linear" - }, - "showPoints": "always", - "spanNulls": false, - "stacking": { - "group": "A", - "mode": "none" - }, - "thresholdsStyle": { - "mode": "off" - } - }, - "mappings": [], - "noValue": "0", - "thresholds": { - "mode": "absolute", - "steps": [ - { - "color": "green", - "value": null - }, - { - "color": "red", - "value": 80 - } - ] - }, - "unit": "reqpm" - }, - "overrides": [] - }, - "gridPos": { - "h": 7, - "w": 12, - "x": 0, - "y": 47 - }, - "id": 15, - "options": { - "legend": { - "calcs": [], - "displayMode": "list", - "placement": "bottom", - "showLegend": true - }, - "tooltip": { - "mode": "single", - "sort": "none" - } - }, - "targets": [ - { - "datasource": { - "type": "prometheus", - "uid": "6R74VAnVz" - }, - "editorMode": "code", - "expr": "sum by(method) (rate(op_indexer_rpc_l2_requests_total[$etl_rate_interval])) * 60", - "instant": false, - "legendFormat": "{{method}}", - "range": true, - "refId": "A" - }, - { - "datasource": { - "type": "prometheus", - "uid": "6R74VAnVz" - }, - "editorMode": "code", - "expr": "sum by(method, error) (rate(op_indexer_rpc_l2_responses_total{error!=\"\"}[$etl_rate_interval])) * 60", - "hide": true, - "instant": false, - "legendFormat": "{{method}} (error: {{error}})", - "range": true, - "refId": "B" - } - ], - "title": "L2 RPC / m", - "type": "timeseries" - }, - { - "datasource": { - "type": "prometheus", - "uid": "6R74VAnVz" - }, - "fieldConfig": { - "defaults": { - "color": { - "mode": "palette-classic" - }, - "custom": { - "axisBorderShow": false, - "axisCenteredZero": false, - "axisColorMode": "text", - "axisLabel": "", - "axisPlacement": "auto", - "barAlignment": 0, - "drawStyle": "line", - "fillOpacity": 0, - "gradientMode": "none", - "hideFrom": { - "legend": false, - "tooltip": false, - "viz": false - }, - "insertNulls": false, - "lineInterpolation": "linear", - "lineWidth": 1, - "pointSize": 2, - "scaleDistribution": { - "type": "linear" - }, - "showPoints": "always", - "spanNulls": false, - "stacking": { - "group": "A", - "mode": "none" - }, - "thresholdsStyle": { - "mode": "off" - } - }, - "mappings": [], - "noValue": "0", - "thresholds": { - "mode": "absolute", - "steps": [ - { - "color": "green", - "value": null - }, - { - "color": "red", - "value": 80 - } - ] - }, - "unit": "s" - }, - "overrides": [] - }, - "gridPos": { - "h": 7, - "w": 12, - "x": 12, - "y": 47 - }, - "id": 19, - "options": { - "legend": { - "calcs": [], - "displayMode": "list", - "placement": "bottom", - "showLegend": true - }, - "tooltip": { - "mode": "single", - "sort": "none" - } - }, - "targets": [ - { - "datasource": { - "type": "prometheus", - "uid": "6R74VAnVz" - }, - "editorMode": "code", - "expr": "sum by(method) (rate(op_indexer_rpc_l2_request_duration_seconds_sum[$etl_rate_interval])\n/\nrate(op_indexer_rpc_l2_request_duration_seconds_count[$etl_rate_interval]))", - "instant": false, - "legendFormat": "{{method}}", - "range": true, - "refId": "A" - } - ], - "title": "AVG L2 RPC Latency", - "type": "timeseries" - } - ], - "refresh": "", - "schemaVersion": 39, - "tags": [], - "templating": { - "list": [ - { - "description": "The window used for `rate`, based on the ETL loop interval", - "hide": 2, - "name": "etl_rate_interval", - "query": "2m", - "skipUrlSync": false, - "type": "constant" - } - ] - }, - "time": { - "from": "now-15m", - "to": "now" - }, - "timepicker": {}, - "timezone": "", - "title": "Indexer", - "uid": "a3cdb010-d44b-4556-a61e-46d655f57bc4", - "version": 30, - "weekStart": "" -} diff --git a/indexer/ops/grafana/provisioning/dashboards/all.yml b/indexer/ops/grafana/provisioning/dashboards/all.yml deleted file mode 100644 index 3ce6e7c5bc69..000000000000 --- a/indexer/ops/grafana/provisioning/dashboards/all.yml +++ /dev/null @@ -1,9 +0,0 @@ -apiVersion: 1 -providers: -- name: 'default' - orgId: 1 - folder: '' - type: file - disableDeletion: false - options: - path: /var/lib/grafana/dashboards diff --git a/indexer/ops/grafana/provisioning/datasources/datasources.yml b/indexer/ops/grafana/provisioning/datasources/datasources.yml deleted file mode 100644 index d4e61af386f3..000000000000 --- a/indexer/ops/grafana/provisioning/datasources/datasources.yml +++ /dev/null @@ -1,9 +0,0 @@ -apiVersion: 1 - -datasources: - - name: Prometheus - type: prometheus - uid: '6R74VAnVz' - access: proxy - url: http://prometheus:9090 - isDefault: true diff --git a/indexer/ops/prometheus/prometheus.yml b/indexer/ops/prometheus/prometheus.yml deleted file mode 100644 index 3f8bdaad0b24..000000000000 --- a/indexer/ops/prometheus/prometheus.yml +++ /dev/null @@ -1,8 +0,0 @@ -global: - scrape_interval: 5s - evaluation_interval: 5s - -scrape_configs: - - job_name: 'indexer' - static_configs: - - targets: ['index:7300'] diff --git a/indexer/processors/bridge.go b/indexer/processors/bridge.go deleted file mode 100644 index 891d1151ac13..000000000000 --- a/indexer/processors/bridge.go +++ /dev/null @@ -1,419 +0,0 @@ -package processors - -import ( - "context" - "errors" - "fmt" - "math/big" - - "gorm.io/gorm" - - "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/etl" - "github.com/ethereum-optimism/optimism/indexer/processors/bridge" - "github.com/ethereum-optimism/optimism/op-service/tasks" -) - -var blocksLimit = 500 - -type BridgeProcessor struct { - log log.Logger - db *database.DB - metrics bridge.Metricer - - resourceCtx context.Context - resourceCancel context.CancelFunc - tasks tasks.Group - - l1Etl *etl.L1ETL - l2Etl *etl.L2ETL - chainConfig config.ChainConfig - - LastL1Header *database.L1BlockHeader - LastL2Header *database.L2BlockHeader - - LastFinalizedL1Header *database.L1BlockHeader - LastFinalizedL2Header *database.L2BlockHeader -} - -func NewBridgeProcessor(log log.Logger, db *database.DB, metrics bridge.Metricer, l1Etl *etl.L1ETL, l2Etl *etl.L2ETL, - chainConfig config.ChainConfig, shutdown context.CancelCauseFunc) (*BridgeProcessor, error) { - log = log.New("processor", "bridge") - - latestL1Header, err := db.BridgeTransactions.L1LatestBlockHeader() - if err != nil { - return nil, err - } - latestL2Header, err := db.BridgeTransactions.L2LatestBlockHeader() - if err != nil { - return nil, err - } - - latestFinalizedL1Header, err := db.BridgeTransactions.L1LatestFinalizedBlockHeader() - if err != nil { - return nil, err - } - latestFinalizedL2Header, err := db.BridgeTransactions.L2LatestFinalizedBlockHeader() - if err != nil { - return nil, err - } - - log.Info("detected indexed bridge state", - "l1_block", latestL1Header, "l2_block", latestL2Header, - "finalized_l1_block", latestFinalizedL1Header, "finalized_l2_block", latestFinalizedL2Header) - - resCtx, resCancel := context.WithCancel(context.Background()) - return &BridgeProcessor{ - log: log, - db: db, - metrics: metrics, - l1Etl: l1Etl, - l2Etl: l2Etl, - resourceCtx: resCtx, - resourceCancel: resCancel, - chainConfig: chainConfig, - LastL1Header: latestL1Header, - LastL2Header: latestL2Header, - LastFinalizedL1Header: latestFinalizedL1Header, - LastFinalizedL2Header: latestFinalizedL2Header, - tasks: tasks.Group{HandleCrit: func(err error) { - shutdown(fmt.Errorf("critical error in bridge processor: %w", err)) - }}, - }, nil -} - -func (b *BridgeProcessor) Start() error { - b.log.Info("starting bridge processor...") - // start L1 worker - b.tasks.Go(func() error { - l1EtlUpdates := b.l1Etl.Notify() - 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) - } - } - b.log.Info("no more l1 etl updates. shutting down l1 task") - return nil - }) - // start L2 worker - b.tasks.Go(func() error { - l2EtlUpdates := b.l2Etl.Notify() - 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) - } - } - b.log.Info("no more l2 etl updates. shutting down l2 task") - return nil - }) - return nil -} - -func (b *BridgeProcessor) Close() error { - // signal that we can stop any ongoing work - b.resourceCancel() - // await the work to stop - return b.tasks.Wait() -} - -// onL1Data will index new bridge events for the unvisited L1 state. As new L1 bridge events -// are processed, bridge finalization events can be processed on L2 in this same window. -func (b *BridgeProcessor) onL1Data(latestL1Header *types.Header) (errs error) { - - // Continue while unvisited state is available to process - for errs == nil { - done := b.metrics.RecordL1Interval() - - lastL1Header := b.LastL1Header - lastFinalizedL2Header := b.LastFinalizedL2Header - - // Initiated L1 Events - if b.LastL1Header == nil || b.LastL1Header.Timestamp < latestL1Header.Time { - if err := b.processInitiatedL1Events(latestL1Header); err != nil { - errs = errors.Join(errs, fmt.Errorf("failed processing initiated l1 events: %w", err)) - } - } - - // Finalized L1 Events (on L2) - // - Not every L1 block is indexed so check against a false interval on start. - if b.LastL1Header != nil && (b.LastFinalizedL2Header == nil || b.LastFinalizedL2Header.Timestamp < latestL1Header.Time) { - if err := b.processFinalizedL2Events(latestL1Header); err != nil { - errs = errors.Join(errs, fmt.Errorf("failed processing finalized l2 events: %w", err)) - } - } - - done(errs) - - // Break if there has been no change in processed events. - if lastL1Header == b.LastL1Header && lastFinalizedL2Header == b.LastFinalizedL2Header { - break - } - } - - return errs -} - -// onL2Data will index new bridge events for the unvisited L2 state. As new L2 bridge events -// are processed, bridge finalization events can be processed on L1 in this same window. -func (b *BridgeProcessor) onL2Data(latestL2Header *types.Header) (errs error) { - if latestL2Header.Number.Cmp(bigint.Zero) == 0 { - return nil // skip genesis - } - - // Continue while unvisited state is available to process - for errs == nil { - done := b.metrics.RecordL2Interval() - - lastL2Header := b.LastL2Header - lastFinalizedL1Header := b.LastFinalizedL1Header - - // Initiated L2 Events - if b.LastL2Header == nil || b.LastL2Header.Timestamp < latestL2Header.Time { - if err := b.processInitiatedL2Events(latestL2Header); err != nil { - errs = errors.Join(errs, fmt.Errorf("failed processing initiated l2 events: %w", err)) - } - } - - // Finalized L2 Events (on L1) - if b.LastL2Header != nil && (b.LastFinalizedL1Header == nil || b.LastFinalizedL1Header.Timestamp < latestL2Header.Time) { - if err := b.processFinalizedL1Events(latestL2Header); err != nil { - errs = errors.Join(errs, fmt.Errorf("failed processing finalized l1 events: %w", err)) - } - } - - done(errs) - - // Break if there has been no change in processed events. - if lastL2Header == b.LastL2Header && lastFinalizedL1Header == b.LastFinalizedL1Header { - break - } - } - - return errs -} - -// Process Initiated Bridge Events - -func (b *BridgeProcessor) processInitiatedL1Events(latestL1Header *types.Header) error { - l1BridgeLog := b.log.New("bridge", "l1", "kind", "initiated") - lastL1BlockNumber := big.NewInt(int64(b.chainConfig.L1StartingHeight - 1)) - if b.LastL1Header != nil { - lastL1BlockNumber = b.LastL1Header.Number - } - - // Latest unobserved L1 state bounded by `blockLimits` blocks. Since - // not every L1 block is indexed, we may have nothing to process. - toL1HeaderScope := func(db *gorm.DB) *gorm.DB { - newQuery := db.Session(&gorm.Session{NewDB: true}) // fresh subquery - headers := newQuery.Model(database.L1BlockHeader{}).Where("number > ? AND number <= ?", lastL1BlockNumber, latestL1Header.Number) - return db.Where("number = (?)", newQuery.Table("(?) AS block_numbers", headers.Order("number ASC").Limit(blocksLimit)).Select("MAX(number)")) - } - toL1Header, err := b.db.Blocks.L1BlockHeaderWithScope(toL1HeaderScope) - if err != nil { - return fmt.Errorf("failed to query new L1 state: %w", err) - } else if toL1Header == nil { - l1BridgeLog.Debug("no new L1 state found") - return nil - } - - 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 - legacyFromL1Height, legacyToL1Height := fromL1Height, toL1Height - if l1BedrockStartingHeight.Cmp(toL1Height) <= 0 { - legacyToL1Height = new(big.Int).Sub(l1BedrockStartingHeight, bigint.One) - } - - legacyBridgeLog := l1BridgeLog.New("mode", "legacy", "from_block_number", legacyFromL1Height, "to_block_number", legacyToL1Height) - legacyBridgeLog.Info("scanning for initiated bridge events") - if err := bridge.LegacyL1ProcessInitiatedBridgeEvents(legacyBridgeLog, tx, b.metrics, b.chainConfig.L1Contracts, legacyFromL1Height, legacyToL1Height); err != nil { - return err - } else if legacyToL1Height.Cmp(toL1Height) == 0 { - return nil // a-ok! Entire range was legacy blocks - } - legacyBridgeLog.Info("detected switch to bedrock", "bedrock_block_number", l1BedrockStartingHeight) - fromL1Height = l1BedrockStartingHeight - } - - l1BridgeLog = l1BridgeLog.New("from_block_number", fromL1Height, "to_block_number", toL1Height) - l1BridgeLog.Info("scanning for initiated bridge events") - return bridge.L1ProcessInitiatedBridgeEvents(l1BridgeLog, tx, b.metrics, b.chainConfig.L1Contracts, fromL1Height, toL1Height) - }); err != nil { - return err - } - - b.LastL1Header = toL1Header - b.metrics.RecordL1LatestHeight(toL1Header.Number) - return nil -} - -func (b *BridgeProcessor) processInitiatedL2Events(latestL2Header *types.Header) error { - l2BridgeLog := b.log.New("bridge", "l2", "kind", "initiated") - lastL2BlockNumber := bigint.Zero - if b.LastL2Header != nil { - lastL2BlockNumber = b.LastL2Header.Number - } - - // Latest unobserved L2 state bounded by `blockLimits` blocks. - // Since every L2 block is indexed, we always expect new state. - toL2HeaderScope := func(db *gorm.DB) *gorm.DB { - newQuery := db.Session(&gorm.Session{NewDB: true}) // fresh subquery - headers := newQuery.Model(database.L2BlockHeader{}).Where("number > ? AND number <= ?", lastL2BlockNumber, latestL2Header.Number) - return db.Where("number = (?)", newQuery.Table("(?) AS block_numbers", headers.Order("number ASC").Limit(blocksLimit)).Select("MAX(number)")) - } - toL2Header, err := b.db.Blocks.L2BlockHeaderWithScope(toL2HeaderScope) - if err != nil { - return fmt.Errorf("failed to query new L2 state: %w", err) - } else if toL2Header == nil { - return fmt.Errorf("no new L2 state found") - } - - 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 - legacyFromL2Height, legacyToL2Height := fromL2Height, toL2Height - if l2BedrockStartingHeight.Cmp(toL2Height) <= 0 { - legacyToL2Height = new(big.Int).Sub(l2BedrockStartingHeight, bigint.One) - } - - legacyBridgeLog := l2BridgeLog.New("mode", "legacy", "from_block_number", legacyFromL2Height, "to_block_number", legacyToL2Height) - legacyBridgeLog.Info("scanning for initiated bridge events") - if err := bridge.LegacyL2ProcessInitiatedBridgeEvents(legacyBridgeLog, tx, b.metrics, b.chainConfig.Preset, b.chainConfig.L2Contracts, legacyFromL2Height, legacyToL2Height); err != nil { - return err - } else if legacyToL2Height.Cmp(toL2Height) == 0 { - return nil // a-ok! Entire range was legacy blocks - } - legacyBridgeLog.Info("detected switch to bedrock") - fromL2Height = l2BedrockStartingHeight - } - - l2BridgeLog = l2BridgeLog.New("from_block_number", fromL2Height, "to_block_number", toL2Height) - l2BridgeLog.Info("scanning for initiated bridge events") - return bridge.L2ProcessInitiatedBridgeEvents(l2BridgeLog, tx, b.metrics, b.chainConfig.L2Contracts, fromL2Height, toL2Height) - }); err != nil { - return err - } - - b.LastL2Header = toL2Header - b.metrics.RecordL2LatestHeight(toL2Header.Number) - return nil -} - -// Process Finalized Bridge Events - -func (b *BridgeProcessor) processFinalizedL1Events(latestL2Header *types.Header) error { - l1BridgeLog := b.log.New("bridge", "l1", "kind", "finalization") - lastFinalizedL1BlockNumber := big.NewInt(int64(b.chainConfig.L1StartingHeight) - 1) - if b.LastFinalizedL1Header != nil { - lastFinalizedL1BlockNumber = b.LastFinalizedL1Header.Number - } - - // Latest unfinalized L1 state bounded by `blockLimit` blocks that have had L2 bridge events - // indexed. Since L1 data is indexed independently, there may not be new L1 state to finalize - toL1HeaderScope := func(db *gorm.DB) *gorm.DB { - newQuery := db.Session(&gorm.Session{NewDB: true}) // fresh subquery - headers := newQuery.Model(database.L1BlockHeader{}).Where("number > ? AND timestamp <= ?", lastFinalizedL1BlockNumber, latestL2Header.Time) - return db.Where("number = (?)", newQuery.Table("(?) AS block_numbers", headers.Order("number ASC").Limit(blocksLimit)).Select("MAX(number)")) - } - toL1Header, err := b.db.Blocks.L1BlockHeaderWithScope(toL1HeaderScope) - if err != nil { - return fmt.Errorf("failed to query for latest unfinalized L1 state: %w", err) - } else if toL1Header == nil { - l1BridgeLog.Debug("no new l1 state to finalize", "last_finalized_block_number", lastFinalizedL1BlockNumber) - return nil - } - - fromL1Height, toL1Height := new(big.Int).Add(lastFinalizedL1BlockNumber, 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 { - legacyFromL1Height, legacyToL1Height := fromL1Height, toL1Height - if l1BedrockStartingHeight.Cmp(toL1Height) <= 0 { - legacyToL1Height = new(big.Int).Sub(l1BedrockStartingHeight, bigint.One) - } - - legacyBridgeLog := l1BridgeLog.New("mode", "legacy", "from_block_number", legacyFromL1Height, "to_block_number", legacyToL1Height) - legacyBridgeLog.Info("scanning for finalized bridge events") - if err := bridge.LegacyL1ProcessFinalizedBridgeEvents(legacyBridgeLog, tx, b.metrics, b.chainConfig.L1Contracts, legacyFromL1Height, legacyToL1Height); err != nil { - return err - } else if legacyToL1Height.Cmp(toL1Height) == 0 { - return nil // a-ok! Entire range was legacy blocks - } - legacyBridgeLog.Info("detected switch to bedrock") - fromL1Height = l1BedrockStartingHeight - } - - l1BridgeLog = l1BridgeLog.New("from_block_number", fromL1Height, "to_block_number", toL1Height) - l1BridgeLog.Info("scanning for finalized bridge events") - return bridge.L1ProcessFinalizedBridgeEvents(l1BridgeLog, tx, b.metrics, b.chainConfig.L1Contracts, fromL1Height, toL1Height) - }); err != nil { - return err - } - - b.LastFinalizedL1Header = toL1Header - b.metrics.RecordL1LatestFinalizedHeight(toL1Header.Number) - return nil -} - -func (b *BridgeProcessor) processFinalizedL2Events(latestL1Header *types.Header) error { - l2BridgeLog := b.log.New("bridge", "l2", "kind", "finalization") - lastFinalizedL2BlockNumber := bigint.Zero - if b.LastFinalizedL2Header != nil { - lastFinalizedL2BlockNumber = b.LastFinalizedL2Header.Number - } - - // Latest unfinalized L2 state bounded by `blockLimit` blocks that have had L1 bridge events - // indexed. Since L2 data is indexed independently, there may not be new L2 state to finalize - toL2HeaderScope := func(db *gorm.DB) *gorm.DB { - newQuery := db.Session(&gorm.Session{NewDB: true}) // fresh subquery - headers := newQuery.Model(database.L2BlockHeader{}).Where("number > ? AND timestamp <= ?", lastFinalizedL2BlockNumber, latestL1Header.Time) - return db.Where("number = (?)", newQuery.Table("(?) AS block_numbers", headers.Order("number ASC").Limit(blocksLimit)).Select("MAX(number)")) - } - toL2Header, err := b.db.Blocks.L2BlockHeaderWithScope(toL2HeaderScope) - if err != nil { - return fmt.Errorf("failed to query for latest unfinalized L2 state: %w", err) - } else if toL2Header == nil { - l2BridgeLog.Debug("no new l2 state to finalize", "last_finalized_block_number", lastFinalizedL2BlockNumber) - return nil - } - - fromL2Height, toL2Height := new(big.Int).Add(lastFinalizedL2BlockNumber, 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 { - legacyFromL2Height, legacyToL2Height := fromL2Height, toL2Height - if l2BedrockStartingHeight.Cmp(toL2Height) <= 0 { - legacyToL2Height = new(big.Int).Sub(l2BedrockStartingHeight, bigint.One) - } - - legacyBridgeLog := l2BridgeLog.New("mode", "legacy", "from_block_number", legacyFromL2Height, "to_block_number", legacyToL2Height) - legacyBridgeLog.Info("scanning for finalized bridge events") - if err := bridge.LegacyL2ProcessFinalizedBridgeEvents(legacyBridgeLog, tx, b.metrics, b.chainConfig.L2Contracts, legacyFromL2Height, legacyToL2Height); err != nil { - return err - } else if legacyToL2Height.Cmp(toL2Height) == 0 { - return nil // a-ok! Entire range was legacy blocks - } - legacyBridgeLog.Info("detected switch to bedrock", "bedrock_block_number", l2BedrockStartingHeight) - fromL2Height = l2BedrockStartingHeight - } - - l2BridgeLog = l2BridgeLog.New("from_block_number", fromL2Height, "to_block_number", toL2Height) - l2BridgeLog.Info("scanning for finalized bridge events") - return bridge.L2ProcessFinalizedBridgeEvents(l2BridgeLog, tx, b.metrics, b.chainConfig.L2Contracts, fromL2Height, toL2Height) - }); err != nil { - return err - } - - b.LastFinalizedL2Header = toL2Header - b.metrics.RecordL2LatestFinalizedHeight(toL2Header.Number) - return nil -} diff --git a/indexer/processors/bridge/l1_bridge_processor.go b/indexer/processors/bridge/l1_bridge_processor.go deleted file mode 100644 index 80c0f829732d..000000000000 --- a/indexer/processors/bridge/l1_bridge_processor.go +++ /dev/null @@ -1,282 +0,0 @@ -package bridge - -import ( - "fmt" - "math/big" - - "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/processors/bridge/ovm1" - "github.com/ethereum-optimism/optimism/indexer/processors/contracts" - - "github.com/ethereum/go-ethereum/common" - "github.com/ethereum/go-ethereum/core/types" - "github.com/ethereum/go-ethereum/log" -) - -// L1ProcessInitiatedBridgeEvents will query the database for bridge events that have been initiated between -// the specified block range. This covers every part of the multi-layered stack: -// 1. OptimismPortal -// 2. L1CrossDomainMessenger -// 3. L1StandardBridge -func L1ProcessInitiatedBridgeEvents(log log.Logger, db *database.DB, metrics L1Metricer, l1Contracts config.L1Contracts, fromHeight, toHeight *big.Int) error { - // (1) OptimismPortal - optimismPortalTxDeposits, err := contracts.OptimismPortalTransactionDepositEvents(l1Contracts.OptimismPortalProxy, db, fromHeight, toHeight) - if err != nil { - return err - } - if len(optimismPortalTxDeposits) > 0 { - log.Info("detected transaction deposits", "size", len(optimismPortalTxDeposits)) - } - - mintedGWEI := bigint.Zero - portalDeposits := make(map[logKey]*contracts.OptimismPortalTransactionDepositEvent, len(optimismPortalTxDeposits)) - transactionDeposits := make([]database.L1TransactionDeposit, len(optimismPortalTxDeposits)) - for i := range optimismPortalTxDeposits { - depositTx := optimismPortalTxDeposits[i] - portalDeposits[logKey{depositTx.Event.BlockHash, depositTx.Event.LogIndex}] = &depositTx - mintedGWEI = new(big.Int).Add(mintedGWEI, depositTx.Tx.Amount) - - transactionDeposits[i] = database.L1TransactionDeposit{ - SourceHash: depositTx.DepositTx.SourceHash, - L2TransactionHash: types.NewTx(depositTx.DepositTx).Hash(), - InitiatedL1EventGUID: depositTx.Event.GUID, - GasLimit: depositTx.GasLimit, - Tx: depositTx.Tx, - } - } - - if len(transactionDeposits) > 0 { - if err := db.BridgeTransactions.StoreL1TransactionDeposits(transactionDeposits); err != nil { - return err - } - - // Convert to from wei to eth - mintedETH, _ := bigint.WeiToETH(mintedGWEI).Float64() - metrics.RecordL1TransactionDeposits(len(transactionDeposits), mintedETH) - } - - // (2) L1CrossDomainMessenger - crossDomainSentMessages, err := contracts.CrossDomainMessengerSentMessageEvents("l1", l1Contracts.L1CrossDomainMessengerProxy, db, fromHeight, toHeight) - if err != nil { - return err - } - if len(crossDomainSentMessages) > 0 { - log.Info("detected sent messages", "size", len(crossDomainSentMessages)) - } - - sentMessages := make(map[logKey]*contracts.CrossDomainMessengerSentMessageEvent, len(crossDomainSentMessages)) - bridgeMessages := make([]database.L1BridgeMessage, len(crossDomainSentMessages)) - for i := range crossDomainSentMessages { - sentMessage := crossDomainSentMessages[i] - sentMessages[logKey{sentMessage.Event.BlockHash, sentMessage.Event.LogIndex}] = &sentMessage - - // extract the deposit hash from the previous TransactionDepositedEvent - portalDeposit, ok := portalDeposits[logKey{sentMessage.Event.BlockHash, sentMessage.Event.LogIndex - 1}] - if !ok { - return fmt.Errorf("expected TransactionDeposit preceding SentMessage event. tx_hash = %s", sentMessage.Event.TransactionHash.String()) - } else if portalDeposit.Event.TransactionHash != sentMessage.Event.TransactionHash { - return fmt.Errorf("correlated events tx hash mismatch. deposit_tx_hash = %s, message_tx_hash = %s", portalDeposit.Event.TransactionHash, sentMessage.Event.TransactionHash) - } - - bridgeMessages[i] = database.L1BridgeMessage{ - TransactionSourceHash: portalDeposit.DepositTx.SourceHash, - BridgeMessage: sentMessage.BridgeMessage, - } - } - if len(bridgeMessages) > 0 { - if err := db.BridgeMessages.StoreL1BridgeMessages(bridgeMessages); err != nil { - return err - } - metrics.RecordL1CrossDomainSentMessages(len(bridgeMessages)) - } - - // (3) L1StandardBridge - initiatedBridges, err := contracts.StandardBridgeInitiatedEvents("l1", l1Contracts.L1StandardBridgeProxy, db, fromHeight, toHeight) - if err != nil { - return err - } - if len(initiatedBridges) > 0 { - log.Info("detected bridge deposits", "size", len(initiatedBridges)) - } - - bridgedTokens := make(map[common.Address]int) - bridgeDeposits := make([]database.L1BridgeDeposit, len(initiatedBridges)) - for i := range initiatedBridges { - initiatedBridge := initiatedBridges[i] - - // extract the cross domain message hash & deposit source hash from the following events - portalDeposit, ok := portalDeposits[logKey{initiatedBridge.Event.BlockHash, initiatedBridge.Event.LogIndex + 1}] - if !ok { - return fmt.Errorf("expected TransactionDeposit following BridgeInitiated event. tx_hash = %s", initiatedBridge.Event.TransactionHash) - } else if portalDeposit.Event.TransactionHash != initiatedBridge.Event.TransactionHash { - return fmt.Errorf("correlated events tx hash mismatch, bridge_tx_hash = %s, deposit_tx_hash = %s", initiatedBridge.Event.TransactionHash, portalDeposit.Event.TransactionHash) - } - - sentMessage, ok := sentMessages[logKey{initiatedBridge.Event.BlockHash, initiatedBridge.Event.LogIndex + 2}] - if !ok { - return fmt.Errorf("expected SentMessage following BridgeInitiated event. tx_hash = %s", initiatedBridge.Event.TransactionHash) - } else if sentMessage.Event.TransactionHash != initiatedBridge.Event.TransactionHash { - return fmt.Errorf("correlated events tx hash mismatch. bridge_tx_hash = %s, message_tx_hash = %s", initiatedBridge.Event.TransactionHash, sentMessage.Event.TransactionHash) - } - - bridgedTokens[initiatedBridge.BridgeTransfer.TokenPair.LocalTokenAddress]++ - - initiatedBridge.BridgeTransfer.CrossDomainMessageHash = &sentMessage.BridgeMessage.MessageHash - bridgeDeposits[i] = database.L1BridgeDeposit{ - TransactionSourceHash: portalDeposit.DepositTx.SourceHash, - BridgeTransfer: initiatedBridge.BridgeTransfer, - } - } - if len(bridgeDeposits) > 0 { - if err := db.BridgeTransfers.StoreL1BridgeDeposits(bridgeDeposits); err != nil { - return err - } - for tokenAddr, size := range bridgedTokens { - metrics.RecordL1InitiatedBridgeTransfers(tokenAddr, size) - } - } - - return nil -} - -// L1ProcessFinalizedBridgeEvents will query the database for all the finalization markers for all initiated -// bridge events. This covers every part of the multi-layered stack: -// 1. OptimismPortal (Bedrock prove & finalize steps) -// 2. L1CrossDomainMessenger (relayMessage marker) -// 3. L1StandardBridge (no-op, since this is simply a wrapper over the L1CrossDomainMessenger) -func L1ProcessFinalizedBridgeEvents(log log.Logger, db *database.DB, metrics L1Metricer, l1Contracts config.L1Contracts, fromHeight, toHeight *big.Int) error { - // (1) OptimismPortal (proven withdrawals) - provenWithdrawals, err := contracts.OptimismPortalWithdrawalProvenEvents(l1Contracts.OptimismPortalProxy, db, fromHeight, toHeight) - if err != nil { - return err - } - if len(provenWithdrawals) > 0 { - log.Info("detected proven withdrawals", "size", len(provenWithdrawals)) - } - - skippedOVM1ProvenWithdrawals := 0 - for i := range provenWithdrawals { - provenWithdrawal := provenWithdrawals[i] - withdrawal, err := db.BridgeTransactions.L2TransactionWithdrawal(provenWithdrawal.WithdrawalHash) - if err != nil { - return err - } else if withdrawal == nil { - if _, ok := ovm1.PortalWithdrawalTransactions[provenWithdrawal.WithdrawalHash]; ok { - skippedOVM1ProvenWithdrawals++ - continue - } - return fmt.Errorf("missing indexed withdrawal! tx_hash = %s", provenWithdrawal.Event.TransactionHash) - } - - if withdrawal.ProvenL1EventGUID != nil && withdrawal.ProvenL1EventGUID.ID() != provenWithdrawals[i].Event.GUID.ID() { - log.Info("detected re-proven withdrawal", "tx_hash", provenWithdrawal.Event.TransactionHash.String()) - } - - if err := db.BridgeTransactions.MarkL2TransactionWithdrawalProvenEvent(provenWithdrawal.WithdrawalHash, provenWithdrawals[i].Event.GUID); err != nil { - return fmt.Errorf("failed to mark withdrawal as proven. tx_hash = %s: %w", provenWithdrawal.Event.TransactionHash, err) - } - } - if len(provenWithdrawals) > 0 { - metrics.RecordL1ProvenWithdrawals(len(provenWithdrawals)) - if skippedOVM1ProvenWithdrawals > 0 { - metrics.RecordL1SkippedOVM1ProvenWithdrawals(skippedOVM1ProvenWithdrawals) - log.Info("skipped OVM 1.0 proven withdrawals", "size", skippedOVM1ProvenWithdrawals) - } - } - - // (2) OptimismPortal (finalized withdrawals) - finalizedWithdrawals, err := contracts.OptimismPortalWithdrawalFinalizedEvents(l1Contracts.OptimismPortalProxy, db, fromHeight, toHeight) - if err != nil { - return err - } - if len(finalizedWithdrawals) > 0 { - log.Info("detected finalized withdrawals", "size", len(finalizedWithdrawals)) - } - - skippedOVM1FinalizedWithdrawals := 0 - for i := range finalizedWithdrawals { - finalizedWithdrawal := finalizedWithdrawals[i] - withdrawal, err := db.BridgeTransactions.L2TransactionWithdrawal(finalizedWithdrawal.WithdrawalHash) - if err != nil { - return err - } else if withdrawal == nil { - if _, ok := ovm1.PortalWithdrawalTransactions[finalizedWithdrawal.WithdrawalHash]; ok { - skippedOVM1FinalizedWithdrawals++ - continue - } - return fmt.Errorf("missing indexed withdrawal on finalization! tx_hash = %s", finalizedWithdrawal.Event.TransactionHash.String()) - } - - if err = db.BridgeTransactions.MarkL2TransactionWithdrawalFinalizedEvent(finalizedWithdrawal.WithdrawalHash, finalizedWithdrawal.Event.GUID, finalizedWithdrawal.Success); err != nil { - return fmt.Errorf("failed to mark withdrawal as finalized. tx_hash = %s: %w", finalizedWithdrawal.Event.TransactionHash, err) - } - } - if len(finalizedWithdrawals) > 0 { - metrics.RecordL1FinalizedWithdrawals(len(finalizedWithdrawals)) - if skippedOVM1ProvenWithdrawals > 0 { - metrics.RecordL1SkippedOVM1FinalizedWithdrawals(skippedOVM1FinalizedWithdrawals) - log.Info("skipped OVM 1.0 finalized withdrawals", "size", skippedOVM1FinalizedWithdrawals) - } - } - - // (3) L1CrossDomainMessenger - crossDomainRelayedMessages, err := contracts.CrossDomainMessengerRelayedMessageEvents("l1", l1Contracts.L1CrossDomainMessengerProxy, db, fromHeight, toHeight) - if err != nil { - return err - } - if len(crossDomainRelayedMessages) > 0 { - log.Info("detected relayed messages", "size", len(crossDomainRelayedMessages)) - } - - skippedOVM1Messages := 0 - for i := range crossDomainRelayedMessages { - relayedMessage := crossDomainRelayedMessages[i] - message, err := db.BridgeMessages.L2BridgeMessage(relayedMessage.MessageHash) - if err != nil { - return err - } else if message == nil { - if _, ok := ovm1.L1RelayedMessages[relayedMessage.MessageHash]; ok { - skippedOVM1Messages++ - continue - } - return fmt.Errorf("missing indexed L2CrossDomainMessager message! tx_hash = %s", relayedMessage.Event.TransactionHash.String()) - } - - if err := db.BridgeMessages.MarkRelayedL2BridgeMessage(relayedMessage.MessageHash, relayedMessage.Event.GUID); err != nil { - return fmt.Errorf("failed to relay cross domain message. tx_hash = %s: %w", relayedMessage.Event.TransactionHash, err) - } - } - if len(crossDomainRelayedMessages) > 0 { - metrics.RecordL1CrossDomainRelayedMessages(len(crossDomainRelayedMessages)) - if skippedOVM1Messages > 0 { // Logged as a warning just for visibility - metrics.RecordL1SkippedOVM1CrossDomainRelayedMessages(skippedOVM1Messages) - log.Info("skipped OVM 1.0 relayed L2CrossDomainMessenger withdrawals", "size", skippedOVM1Messages) - } - } - - // (4) L1StandardBridge - // - Nothing actionable on the database. Since the StandardBridge is layered ontop of the - // CrossDomainMessenger, there's no need for any sanity or invariant checks as the previous step - // ensures a relayed message (finalized bridge) can be linked with a sent message (initiated bridge). - finalizedBridges, err := contracts.StandardBridgeFinalizedEvents("l1", l1Contracts.L1StandardBridgeProxy, db, fromHeight, toHeight) - if err != nil { - return err - } - - finalizedTokens := make(map[common.Address]int) - for i := range finalizedBridges { - finalizedBridge := finalizedBridges[i] - finalizedTokens[finalizedBridge.BridgeTransfer.TokenPair.LocalTokenAddress]++ - } - if len(finalizedBridges) > 0 { - log.Info("detected finalized bridge withdrawals", "size", len(finalizedBridges)) - for tokenAddr, size := range finalizedTokens { - metrics.RecordL1FinalizedBridgeTransfers(tokenAddr, size) - } - } - - // a-ok! - return nil -} diff --git a/indexer/processors/bridge/l2_bridge_processor.go b/indexer/processors/bridge/l2_bridge_processor.go deleted file mode 100644 index 0fb99ad9fa20..000000000000 --- a/indexer/processors/bridge/l2_bridge_processor.go +++ /dev/null @@ -1,195 +0,0 @@ -package bridge - -import ( - "fmt" - "math/big" - - "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/processors/contracts" - - "github.com/ethereum/go-ethereum/common" - "github.com/ethereum/go-ethereum/log" -) - -// L2ProcessInitiatedBridgeEvents will query the database for bridge events that have been initiated between -// the specified block range. This covers every part of the multi-layered stack: -// 1. OptimismPortal -// 2. L2CrossDomainMessenger -// 3. L2StandardBridge -func L2ProcessInitiatedBridgeEvents(log log.Logger, db *database.DB, metrics L2Metricer, l2Contracts config.L2Contracts, fromHeight, toHeight *big.Int) error { - // (1) L2ToL1MessagePasser - l2ToL1MPMessagesPassed, err := contracts.L2ToL1MessagePasserMessagePassedEvents(l2Contracts.L2ToL1MessagePasser, db, fromHeight, toHeight) - if err != nil { - return err - } - if len(l2ToL1MPMessagesPassed) > 0 { - log.Info("detected transaction withdrawals", "size", len(l2ToL1MPMessagesPassed)) - } - - withdrawnWEI := bigint.Zero - messagesPassed := make(map[logKey]*contracts.L2ToL1MessagePasserMessagePassed, len(l2ToL1MPMessagesPassed)) - transactionWithdrawals := make([]database.L2TransactionWithdrawal, len(l2ToL1MPMessagesPassed)) - for i := range l2ToL1MPMessagesPassed { - messagePassed := l2ToL1MPMessagesPassed[i] - messagesPassed[logKey{messagePassed.Event.BlockHash, messagePassed.Event.LogIndex}] = &messagePassed - withdrawnWEI = new(big.Int).Add(withdrawnWEI, messagePassed.Tx.Amount) - - transactionWithdrawals[i] = database.L2TransactionWithdrawal{ - WithdrawalHash: messagePassed.WithdrawalHash, - InitiatedL2EventGUID: messagePassed.Event.GUID, - Nonce: messagePassed.Nonce, - GasLimit: messagePassed.GasLimit, - Tx: messagePassed.Tx, - } - } - if len(messagesPassed) > 0 { - if err := db.BridgeTransactions.StoreL2TransactionWithdrawals(transactionWithdrawals); err != nil { - return err - } - - // Convert the withdrawn WEI to ETH - withdrawnETH, _ := bigint.WeiToETH(withdrawnWEI).Float64() - metrics.RecordL2TransactionWithdrawals(len(transactionWithdrawals), withdrawnETH) - } - - // (2) L2CrossDomainMessenger - crossDomainSentMessages, err := contracts.CrossDomainMessengerSentMessageEvents("l2", l2Contracts.L2CrossDomainMessenger, db, fromHeight, toHeight) - if err != nil { - return err - } - if len(crossDomainSentMessages) > 0 { - log.Info("detected sent messages", "size", len(crossDomainSentMessages)) - } - - sentMessages := make(map[logKey]*contracts.CrossDomainMessengerSentMessageEvent, len(crossDomainSentMessages)) - bridgeMessages := make([]database.L2BridgeMessage, len(crossDomainSentMessages)) - for i := range crossDomainSentMessages { - sentMessage := crossDomainSentMessages[i] - sentMessages[logKey{sentMessage.Event.BlockHash, sentMessage.Event.LogIndex}] = &sentMessage - - // extract the withdrawal hash from the previous MessagePassed event - messagePassed, ok := messagesPassed[logKey{sentMessage.Event.BlockHash, sentMessage.Event.LogIndex - 1}] - if !ok { - return fmt.Errorf("expected MessagePassedEvent preceding SentMessage. tx_hash = %s", sentMessage.Event.TransactionHash) - } else if messagePassed.Event.TransactionHash != sentMessage.Event.TransactionHash { - return fmt.Errorf("correlated events tx hash mismatch. message_tx_hash = %s, withdraw_tx_hash = %s", sentMessage.Event.TransactionHash, messagePassed.Event.TransactionHash) - } - - bridgeMessages[i] = database.L2BridgeMessage{TransactionWithdrawalHash: messagePassed.WithdrawalHash, BridgeMessage: sentMessage.BridgeMessage} - } - if len(bridgeMessages) > 0 { - if err := db.BridgeMessages.StoreL2BridgeMessages(bridgeMessages); err != nil { - return err - } - metrics.RecordL2CrossDomainSentMessages(len(bridgeMessages)) - } - - // (3) L2StandardBridge - initiatedBridges, err := contracts.StandardBridgeInitiatedEvents("l2", l2Contracts.L2StandardBridge, db, fromHeight, toHeight) - if err != nil { - return err - } - if len(initiatedBridges) > 0 { - log.Info("detected bridge withdrawals", "size", len(initiatedBridges)) - } - - bridgedTokens := make(map[common.Address]int) - bridgeWithdrawals := make([]database.L2BridgeWithdrawal, len(initiatedBridges)) - for i := range initiatedBridges { - initiatedBridge := initiatedBridges[i] - - // extract the cross domain message hash & withdraw hash from the following events - messagePassed, ok := messagesPassed[logKey{initiatedBridge.Event.BlockHash, initiatedBridge.Event.LogIndex + 1}] - if !ok { - return fmt.Errorf("expected MessagePassed following BridgeInitiated event. tx_hash = %s", initiatedBridge.Event.TransactionHash) - } else if messagePassed.Event.TransactionHash != initiatedBridge.Event.TransactionHash { - return fmt.Errorf("correlated events tx hash mismatch. bridge_tx_hash = %s, withdraw_tx_hash = %s", initiatedBridge.Event.TransactionHash, messagePassed.Event.TransactionHash) - } - - sentMessage, ok := sentMessages[logKey{initiatedBridge.Event.BlockHash, initiatedBridge.Event.LogIndex + 2}] - if !ok { - return fmt.Errorf("expected SentMessage following BridgeInitiated event. tx_hash = %s", initiatedBridge.Event.TransactionHash) - } else if sentMessage.Event.TransactionHash != initiatedBridge.Event.TransactionHash { - return fmt.Errorf("correlated events tx hash mismatch. bridge_tx_hash = %s, message_tx_hash = %s", initiatedBridge.Event.TransactionHash, sentMessage.Event.TransactionHash) - } - - bridgedTokens[initiatedBridge.BridgeTransfer.TokenPair.LocalTokenAddress]++ - - initiatedBridge.BridgeTransfer.CrossDomainMessageHash = &sentMessage.BridgeMessage.MessageHash - bridgeWithdrawals[i] = database.L2BridgeWithdrawal{ - TransactionWithdrawalHash: messagePassed.WithdrawalHash, - BridgeTransfer: initiatedBridge.BridgeTransfer, - } - } - if len(bridgeWithdrawals) > 0 { - if err := db.BridgeTransfers.StoreL2BridgeWithdrawals(bridgeWithdrawals); err != nil { - return err - } - for tokenAddr, size := range bridgedTokens { - metrics.RecordL2InitiatedBridgeTransfers(tokenAddr, size) - } - } - - // a-ok! - return nil -} - -// L2ProcessFinalizedBridgeEvents will query the database for all the finalization markers for all initiated -// bridge events. This covers every part of the multi-layered stack: -// 1. L2CrossDomainMessenger (relayMessage marker) -// 2. L2StandardBridge (no-op, since this is simply a wrapper over the L2CrossDomainMEssenger) -// -// NOTE: Unlike L1, there's no L2ToL1MessagePasser stage since transaction deposits are apart of the block derivation process. -func L2ProcessFinalizedBridgeEvents(log log.Logger, db *database.DB, metrics L2Metricer, l2Contracts config.L2Contracts, fromHeight, toHeight *big.Int) error { - // (1) L2CrossDomainMessenger - crossDomainRelayedMessages, err := contracts.CrossDomainMessengerRelayedMessageEvents("l2", l2Contracts.L2CrossDomainMessenger, db, fromHeight, toHeight) - if err != nil { - return err - } - if len(crossDomainRelayedMessages) > 0 { - log.Info("detected relayed messages", "size", len(crossDomainRelayedMessages)) - } - - for i := range crossDomainRelayedMessages { - relayed := crossDomainRelayedMessages[i] - message, err := db.BridgeMessages.L1BridgeMessage(relayed.MessageHash) - if err != nil { - return err - } else if message == nil { - return fmt.Errorf("missing indexed L1CrossDomainMessager message! tx_hash = %s", relayed.Event.TransactionHash) - } - - if err := db.BridgeMessages.MarkRelayedL1BridgeMessage(relayed.MessageHash, relayed.Event.GUID); err != nil { - return fmt.Errorf("failed to relay cross domain message. tx_hash = %s: %w", relayed.Event.TransactionHash, err) - } - } - if len(crossDomainRelayedMessages) > 0 { - metrics.RecordL2CrossDomainRelayedMessages(len(crossDomainRelayedMessages)) - } - - // (2) L2StandardBridge - // - Nothing actionable on the database. Since the StandardBridge is layered ontop of the - // CrossDomainMessenger, there's no need for any sanity or invariant checks as the previous step - // ensures a relayed message (finalized bridge) can be linked with a sent message (initiated bridge). - finalizedBridges, err := contracts.StandardBridgeFinalizedEvents("l2", l2Contracts.L2StandardBridge, db, fromHeight, toHeight) - if err != nil { - return err - } - - finalizedTokens := make(map[common.Address]int) - for i := range finalizedBridges { - finalizedBridge := finalizedBridges[i] - finalizedTokens[finalizedBridge.BridgeTransfer.TokenPair.LocalTokenAddress]++ - } - if len(finalizedBridges) > 0 { - log.Info("detected finalized bridge deposits", "size", len(finalizedBridges)) - for tokenAddr, size := range finalizedTokens { - metrics.RecordL2FinalizedBridgeTransfers(tokenAddr, size) - } - } - - // a-ok! - return nil -} diff --git a/indexer/processors/bridge/legacy_bridge_processor.go b/indexer/processors/bridge/legacy_bridge_processor.go deleted file mode 100644 index be3612657a99..000000000000 --- a/indexer/processors/bridge/legacy_bridge_processor.go +++ /dev/null @@ -1,396 +0,0 @@ -package bridge - -import ( - "fmt" - "math/big" - - "github.com/ethereum/go-ethereum/common" - "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/processors/bridge/ovm1" - "github.com/ethereum-optimism/optimism/indexer/processors/contracts" - - "github.com/ethereum-optimism/optimism/op-chain-ops/crossdomain" - "github.com/ethereum-optimism/optimism/op-service/predeploys" -) - -// Legacy Bridge Initiation - -// LegacyL1ProcessInitiatedBridgeEvents will query the data for bridge events within the specified block range -// according the pre-bedrock protocol. This follows: -// 1. CanonicalTransactionChain -// 2. L1CrossDomainMessenger -// 3. L1StandardBridge -func LegacyL1ProcessInitiatedBridgeEvents(log log.Logger, db *database.DB, metrics L1Metricer, l1Contracts config.L1Contracts, fromHeight, toHeight *big.Int) error { - // (1) CanonicalTransactionChain - ctcTxDepositEvents, err := contracts.LegacyCTCDepositEvents(l1Contracts.LegacyCanonicalTransactionChain, db, fromHeight, toHeight) - if err != nil { - return err - } - if len(ctcTxDepositEvents) > 0 { - log.Info("detected legacy transaction deposits", "size", len(ctcTxDepositEvents)) - } - - mintedWEI := bigint.Zero - ctcTxDeposits := make(map[logKey]*contracts.LegacyCTCDepositEvent, len(ctcTxDepositEvents)) - transactionDeposits := make([]database.L1TransactionDeposit, len(ctcTxDepositEvents)) - for i := range ctcTxDepositEvents { - deposit := ctcTxDepositEvents[i] - ctcTxDeposits[logKey{deposit.Event.BlockHash, deposit.Event.LogIndex}] = &deposit - mintedWEI = new(big.Int).Add(mintedWEI, deposit.Tx.Amount) - - // We re-use the L2 Transaction hash as the source hash to remain consistent in the schema. - transactionDeposits[i] = database.L1TransactionDeposit{ - SourceHash: deposit.TxHash, - L2TransactionHash: deposit.TxHash, - InitiatedL1EventGUID: deposit.Event.GUID, - GasLimit: deposit.GasLimit, - Tx: deposit.Tx, - } - } - if len(ctcTxDepositEvents) > 0 { - if err := db.BridgeTransactions.StoreL1TransactionDeposits(transactionDeposits); err != nil { - return err - } - - mintedETH, _ := bigint.WeiToETH(mintedWEI).Float64() - metrics.RecordL1TransactionDeposits(len(transactionDeposits), mintedETH) - } - - // (2) L1CrossDomainMessenger - crossDomainSentMessages, err := contracts.CrossDomainMessengerSentMessageEvents("l1", l1Contracts.L1CrossDomainMessengerProxy, db, fromHeight, toHeight) - if err != nil { - return err - } - if len(crossDomainSentMessages) > 0 { - log.Info("detected legacy sent messages", "size", len(crossDomainSentMessages)) - } - - sentMessages := make(map[logKey]*contracts.CrossDomainMessengerSentMessageEvent, len(crossDomainSentMessages)) - bridgeMessages := make([]database.L1BridgeMessage, len(crossDomainSentMessages)) - for i := range crossDomainSentMessages { - sentMessage := crossDomainSentMessages[i] - sentMessages[logKey{sentMessage.Event.BlockHash, sentMessage.Event.LogIndex}] = &sentMessage - - // extract the deposit hash from the previous TransactionDepositedEvent - ctcTxDeposit, ok := ctcTxDeposits[logKey{sentMessage.Event.BlockHash, sentMessage.Event.LogIndex - 1}] - if !ok { - return fmt.Errorf("expected TransactionEnqueued preceding SentMessage event. tx_hash = %s", sentMessage.Event.TransactionHash) - } else if ctcTxDeposit.Event.TransactionHash != sentMessage.Event.TransactionHash { - return fmt.Errorf("correlated events tx hash mismatch. deposit_tx_hash = %s, message_tx_hash = %s", ctcTxDeposit.Event.TransactionHash, sentMessage.Event.TransactionHash) - } - - bridgeMessages[i] = database.L1BridgeMessage{TransactionSourceHash: ctcTxDeposit.TxHash, BridgeMessage: sentMessage.BridgeMessage} - } - if len(bridgeMessages) > 0 { - if err := db.BridgeMessages.StoreL1BridgeMessages(bridgeMessages); err != nil { - return err - } - metrics.RecordL1CrossDomainSentMessages(len(bridgeMessages)) - } - - // (3) L1StandardBridge - initiatedBridges, err := contracts.L1StandardBridgeLegacyDepositInitiatedEvents(l1Contracts.L1StandardBridgeProxy, db, fromHeight, toHeight) - if err != nil { - return err - } - if len(initiatedBridges) > 0 { - log.Info("detected iegacy bridge deposits", "size", len(initiatedBridges)) - } - - bridgedTokens := make(map[common.Address]int) - bridgeDeposits := make([]database.L1BridgeDeposit, len(initiatedBridges)) - for i := range initiatedBridges { - initiatedBridge := initiatedBridges[i] - - // extract the cross domain message hash & deposit source hash from the following events - // Unlike bedrock, the bridge events are emitted AFTER sending the cross domain message - // - Event Flow: TransactionEnqueued -> SentMessage -> DepositInitiated - sentMessage, ok := sentMessages[logKey{initiatedBridge.Event.BlockHash, initiatedBridge.Event.LogIndex - 1}] - if !ok { - return fmt.Errorf("expected SentMessage preceding DepositInitiated event. tx_hash = %s", initiatedBridge.Event.TransactionHash) - } else if sentMessage.Event.TransactionHash != initiatedBridge.Event.TransactionHash { - return fmt.Errorf("correlated events tx hash mismatch. bridge_tx_hash = %s, message_tx_hash = %s", initiatedBridge.Event.TransactionHash, sentMessage.Event.TransactionHash) - } - - ctcTxDeposit, ok := ctcTxDeposits[logKey{initiatedBridge.Event.BlockHash, initiatedBridge.Event.LogIndex - 2}] - if !ok { - return fmt.Errorf("expected TransactionEnqueued preceding BridgeInitiated event. tx_hash = %s", initiatedBridge.Event.TransactionHash) - } else if ctcTxDeposit.Event.TransactionHash != initiatedBridge.Event.TransactionHash { - return fmt.Errorf("correlated events tx hash mismatch. bridge_tx_hash = %s, deposit_tx_hash = %s", initiatedBridge.Event.TransactionHash, ctcTxDeposit.Event.TransactionHash) - } - - initiatedBridge.BridgeTransfer.CrossDomainMessageHash = &sentMessage.BridgeMessage.MessageHash - bridgedTokens[initiatedBridge.BridgeTransfer.TokenPair.LocalTokenAddress]++ - bridgeDeposits[i] = database.L1BridgeDeposit{ - TransactionSourceHash: ctcTxDeposit.TxHash, - BridgeTransfer: initiatedBridge.BridgeTransfer, - } - } - if len(bridgeDeposits) > 0 { - if err := db.BridgeTransfers.StoreL1BridgeDeposits(bridgeDeposits); err != nil { - return err - } - for tokenAddr, size := range bridgedTokens { - metrics.RecordL1InitiatedBridgeTransfers(tokenAddr, size) - } - } - - // a-ok! - return nil -} - -// LegacyL2ProcessInitiatedBridgeEvents will query the data for bridge events within the specified block range -// according the pre-bedrock protocol. This follows: -// 1. L2CrossDomainMessenger - The LegacyMessagePasser contract cannot be used as entrypoint to bridge transactions from L2. The protocol -// only allows the L2CrossDomainMessenger as the sole sender when relaying a bridged message. -// 2. L2StandardBridge -func LegacyL2ProcessInitiatedBridgeEvents(log log.Logger, db *database.DB, metrics L2Metricer, preset int, l2Contracts config.L2Contracts, fromHeight, toHeight *big.Int) error { - // (1) L2CrossDomainMessenger - crossDomainSentMessages, err := contracts.CrossDomainMessengerSentMessageEvents("l2", l2Contracts.L2CrossDomainMessenger, db, fromHeight, toHeight) - if err != nil { - return err - } - if len(crossDomainSentMessages) > 0 { - log.Info("detected legacy transaction withdrawals (via L2CrossDomainMessenger)", "size", len(crossDomainSentMessages)) - } - - type sentMessageEvent struct { - *contracts.CrossDomainMessengerSentMessageEvent - WithdrawalHash common.Hash - } - - withdrawnWEI := bigint.Zero - sentMessages := make(map[logKey]sentMessageEvent, len(crossDomainSentMessages)) - bridgeMessages := make([]database.L2BridgeMessage, len(crossDomainSentMessages)) - versionedMessageHashes := make([]database.L2BridgeMessageVersionedMessageHash, len(crossDomainSentMessages)) - transactionWithdrawals := make([]database.L2TransactionWithdrawal, len(crossDomainSentMessages)) - for i := range crossDomainSentMessages { - sentMessage := crossDomainSentMessages[i] - withdrawnWEI = new(big.Int).Add(withdrawnWEI, sentMessage.BridgeMessage.Tx.Amount) - - // Since these message can be relayed in bedrock, we utilize the migrated withdrawal hash - // and also store the v1 version of the message hash such that the bedrock l1 finalization - // processor works as expected. There will be some entries relayed pre-bedrock that will not - // require the entry but we'll store it anyways as a large % of these withdrawals are not relayed - // pre-bedrock. - - v1MessageHash, err := LegacyBridgeMessageV1MessageHash(&sentMessage.BridgeMessage) - if err != nil { - return fmt.Errorf("failed to compute versioned message hash: %w", err) - } - - withdrawalHash, err := LegacyBridgeMessageWithdrawalHash(preset, &sentMessage.BridgeMessage) - if err != nil { - return fmt.Errorf("failed to construct migrated withdrawal hash: %w", err) - } - - transactionWithdrawals[i] = database.L2TransactionWithdrawal{ - WithdrawalHash: withdrawalHash, - InitiatedL2EventGUID: sentMessage.Event.GUID, - Nonce: sentMessage.BridgeMessage.Nonce, - GasLimit: sentMessage.BridgeMessage.GasLimit, - Tx: database.Transaction{ - FromAddress: sentMessage.BridgeMessage.Tx.FromAddress, - ToAddress: sentMessage.BridgeMessage.Tx.ToAddress, - Amount: bigint.Zero, - Data: sentMessage.BridgeMessage.Tx.Data, - Timestamp: sentMessage.Event.Timestamp, - }, - } - - sentMessages[logKey{sentMessage.Event.BlockHash, sentMessage.Event.LogIndex}] = sentMessageEvent{&sentMessage, withdrawalHash} - bridgeMessages[i] = database.L2BridgeMessage{TransactionWithdrawalHash: withdrawalHash, BridgeMessage: sentMessage.BridgeMessage} - versionedMessageHashes[i] = database.L2BridgeMessageVersionedMessageHash{MessageHash: sentMessage.BridgeMessage.MessageHash, V1MessageHash: v1MessageHash} - } - if len(bridgeMessages) > 0 { - if err := db.BridgeTransactions.StoreL2TransactionWithdrawals(transactionWithdrawals); err != nil { - return err - } - if err := db.BridgeMessages.StoreL2BridgeMessages(bridgeMessages); err != nil { - return err - } - if err := db.BridgeMessages.StoreL2BridgeMessageV1MessageHashes(versionedMessageHashes); err != nil { - return err - } - - withdrawnETH, _ := bigint.WeiToETH(withdrawnWEI).Float64() - metrics.RecordL2TransactionWithdrawals(len(transactionWithdrawals), withdrawnETH) - metrics.RecordL2CrossDomainSentMessages(len(bridgeMessages)) - } - - // (2) L2StandardBridge - initiatedBridges, err := contracts.L2StandardBridgeLegacyWithdrawalInitiatedEvents(l2Contracts.L2StandardBridge, db, fromHeight, toHeight) - if err != nil { - return err - } - if len(initiatedBridges) > 0 { - log.Info("detected legacy bridge withdrawals", "size", len(initiatedBridges)) - } - - bridgedTokens := make(map[common.Address]int) - l2BridgeWithdrawals := make([]database.L2BridgeWithdrawal, len(initiatedBridges)) - for i := range initiatedBridges { - initiatedBridge := initiatedBridges[i] - - // extract the cross domain message hash & deposit source hash from the following events - // Unlike bedrock, the bridge events are emitted AFTER sending the cross domain message - // - Event Flow: TransactionEnqueued -> SentMessage -> DepositInitiated - sentMessage, ok := sentMessages[logKey{initiatedBridge.Event.BlockHash, initiatedBridge.Event.LogIndex - 1}] - if !ok { - return fmt.Errorf("expected SentMessage preceding BridgeInitiated event. tx_hash = %s", initiatedBridge.Event.TransactionHash) - } else if sentMessage.Event.TransactionHash != initiatedBridge.Event.TransactionHash { - return fmt.Errorf("correlated events tx hash mismatch. bridge_tx_hash = %s, message_tx_hash = %s", initiatedBridge.Event.TransactionHash, sentMessage.Event.TransactionHash) - } - - bridgedTokens[initiatedBridge.BridgeTransfer.TokenPair.LocalTokenAddress]++ - initiatedBridge.BridgeTransfer.CrossDomainMessageHash = &sentMessage.BridgeMessage.MessageHash - l2BridgeWithdrawals[i] = database.L2BridgeWithdrawal{ - TransactionWithdrawalHash: sentMessage.WithdrawalHash, - BridgeTransfer: initiatedBridge.BridgeTransfer, - } - } - if len(l2BridgeWithdrawals) > 0 { - if err := db.BridgeTransfers.StoreL2BridgeWithdrawals(l2BridgeWithdrawals); err != nil { - return err - } - for tokenAddr, size := range bridgedTokens { - metrics.RecordL2InitiatedBridgeTransfers(tokenAddr, size) - } - } - - // a-ok - return nil -} - -// Legacy Bridge Finalization - -// LegacyL1ProcessFinalizedBridgeEvents will query for bridge events within the specified block range -// according to the pre-bedrock protocol. This follows: -// 1. L1CrossDomainMessenger -// 2. L1StandardBridge -func LegacyL1ProcessFinalizedBridgeEvents(log log.Logger, db *database.DB, metrics L1Metricer, l1Contracts config.L1Contracts, fromHeight, toHeight *big.Int) error { - // (1) L1CrossDomainMessenger -> This is the root-most contract from which bridge events are finalized since withdrawals must be initiated from the - // L2CrossDomainMessenger. Since there's no two-step withdrawal process, we mark the transaction as proven/finalized in the same step - crossDomainRelayedMessages, err := contracts.CrossDomainMessengerRelayedMessageEvents("l1", l1Contracts.L1CrossDomainMessengerProxy, db, fromHeight, toHeight) - if err != nil { - return err - } - if len(crossDomainRelayedMessages) > 0 { - log.Info("detected relayed messages", "size", len(crossDomainRelayedMessages)) - } - - skippedOVM1Messages := 0 - for i := range crossDomainRelayedMessages { - relayedMessage := crossDomainRelayedMessages[i] - message, err := db.BridgeMessages.L2BridgeMessage(relayedMessage.MessageHash) - if err != nil { - return err - } else if message == nil { - if _, ok := ovm1.L1RelayedMessages[relayedMessage.MessageHash]; ok { - skippedOVM1Messages++ - continue - } - - return fmt.Errorf("missing indexed L2CrossDomainMessenger message! tx_hash %s", relayedMessage.Event.TransactionHash.String()) - } - - if err := db.BridgeMessages.MarkRelayedL2BridgeMessage(relayedMessage.MessageHash, relayedMessage.Event.GUID); err != nil { - return fmt.Errorf("failed to relay cross domain message. tx_hash = %s: %w", relayedMessage.Event.TransactionHash, err) - } - - // Mark the associated tx withdrawal as proven/finalized with the same event. - if err := db.BridgeTransactions.MarkL2TransactionWithdrawalProvenEvent(message.TransactionWithdrawalHash, relayedMessage.Event.GUID); err != nil { - return fmt.Errorf("failed to mark withdrawal as proven. tx_hash = %s: %w", relayedMessage.Event.TransactionHash, err) - } - if err := db.BridgeTransactions.MarkL2TransactionWithdrawalFinalizedEvent(message.TransactionWithdrawalHash, relayedMessage.Event.GUID, true); err != nil { - return fmt.Errorf("failed to mark withdrawal as finalized. tx_hash = %s: %w", relayedMessage.Event.TransactionHash, err) - } - } - if len(crossDomainRelayedMessages) > 0 { - metrics.RecordL1CrossDomainRelayedMessages(len(crossDomainRelayedMessages)) - if skippedOVM1Messages > 0 { // Logged as a warning just for visibility - metrics.RecordL1SkippedOVM1CrossDomainRelayedMessages(skippedOVM1Messages) - log.Info("skipped OVM 1.0 relayed L2CrossDomainMessenger withdrawals", "size", skippedOVM1Messages) - } - } - - // (2) L1StandardBridge - // - Nothing actionable on the database. Since the StandardBridge is layered ontop of the - // CrossDomainMessenger, there's no need for any sanity or invariant checks as the previous step - // ensures a relayed message (finalized bridge) can be linked with a sent message (initiated bridge). - - // - NOTE: Ignoring metrics for pre-bedrock transfers - - // a-ok! - return nil -} - -// LegacyL2ProcessFinalizedBridgeEvents will query for bridge events within the specified block range -// according to the pre-bedrock protocol. This follows: -// 1. L2CrossDomainMessenger -// 2. L2StandardBridge -func LegacyL2ProcessFinalizedBridgeEvents(log log.Logger, db *database.DB, metrics L2Metricer, l2Contracts config.L2Contracts, fromHeight, toHeight *big.Int) error { - // (1) L2CrossDomainMessenger - crossDomainRelayedMessages, err := contracts.CrossDomainMessengerRelayedMessageEvents("l2", l2Contracts.L2CrossDomainMessenger, db, fromHeight, toHeight) - if err != nil { - return err - } - if len(crossDomainRelayedMessages) > 0 { - log.Info("detected relayed legacy messages", "size", len(crossDomainRelayedMessages)) - } - - for i := range crossDomainRelayedMessages { - relayedMessage := crossDomainRelayedMessages[i] - message, err := db.BridgeMessages.L1BridgeMessage(relayedMessage.MessageHash) - if err != nil { - return err - } else if message == nil { - return fmt.Errorf("missing indexed L1CrossDomainMessager message! tx_hash = %s", relayedMessage.Event.TransactionHash) - } - - if err := db.BridgeMessages.MarkRelayedL1BridgeMessage(relayedMessage.MessageHash, relayedMessage.Event.GUID); err != nil { - return fmt.Errorf("failed to relay cross domain message: %w", err) - } - } - if len(crossDomainRelayedMessages) > 0 { - metrics.RecordL2CrossDomainRelayedMessages(len(crossDomainRelayedMessages)) - } - - // (2) L2StandardBridge - // - Nothing actionable on the database. Since the StandardBridge is layered ontop of the - // CrossDomainMessenger, there's no need for any sanity or invariant checks as the previous step - // ensures a relayed message (finalized bridge) can be linked with a sent message (initiated bridge). - - // - NOTE: Ignoring metrics for pre-bedrock transfers - - // a-ok! - return nil -} - -// Utils - -func LegacyBridgeMessageWithdrawalHash(preset int, msg *database.BridgeMessage) (common.Hash, error) { - l1Cdm := config.Presets[preset].ChainConfig.L1Contracts.L1CrossDomainMessengerProxy - legacyWithdrawal := crossdomain.NewLegacyWithdrawal(predeploys.L2CrossDomainMessengerAddr, msg.Tx.ToAddress, msg.Tx.FromAddress, msg.Tx.Data, msg.Nonce) - migratedWithdrawal, err := crossdomain.MigrateWithdrawal(legacyWithdrawal, &l1Cdm, big.NewInt(int64(preset))) - if err != nil { - return common.Hash{}, err - } - - return migratedWithdrawal.Hash() -} - -func LegacyBridgeMessageV1MessageHash(msg *database.BridgeMessage) (common.Hash, error) { - legacyWithdrawal := crossdomain.NewLegacyWithdrawal(predeploys.L2CrossDomainMessengerAddr, msg.Tx.ToAddress, msg.Tx.FromAddress, msg.Tx.Data, msg.Nonce) - value, err := legacyWithdrawal.Value() - if err != nil { - return common.Hash{}, fmt.Errorf("failed to extract ETH value from legacy bridge message: %w", err) - } - - // Note: GasLimit is always zero. Only the GasLimit for the withdrawal transaction was migrated - return crossdomain.HashCrossDomainMessageV1(msg.Nonce, msg.Tx.FromAddress, msg.Tx.ToAddress, value, new(big.Int), msg.Tx.Data) -} diff --git a/indexer/processors/bridge/legacy_bridge_processor_test.go b/indexer/processors/bridge/legacy_bridge_processor_test.go deleted file mode 100644 index fd02df309acf..000000000000 --- a/indexer/processors/bridge/legacy_bridge_processor_test.go +++ /dev/null @@ -1,50 +0,0 @@ -package bridge - -import ( - "math/big" - "testing" - - "github.com/ethereum-optimism/optimism/indexer/bigint" - "github.com/ethereum-optimism/optimism/indexer/database" - - "github.com/ethereum/go-ethereum/common" - - "github.com/stretchr/testify/require" -) - -func TestLegacyWithdrawalAndMessageHash(t *testing.T) { - // 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{ - Nonce: big.NewInt(100180), - GasLimit: bigint.Zero, - Tx: database.Transaction{ - FromAddress: common.HexToAddress("0x4200000000000000000000000000000000000010"), - ToAddress: common.HexToAddress("0x99c9fc46f92e8a1c0dec1b1747d010903e884be1"), - Amount: bigint.Zero, - Data: common.FromHex("0x1532ec34000000000000000000000000094a9009fe93a85658e4b49604fd8177620f8cd8000000000000000000000000094a9009fe93a85658e4b49604fd8177620f8cd8000000000000000000000000000000000000000000000000013abb2a2774ab0000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000"), - }, - } - - hash, err := LegacyBridgeMessageWithdrawalHash(10, &msg) - require.NoError(t, err) - require.Equal(t, expectedWithdrawalHash, hash) - - expectedWithdrawalHash = common.HexToHash("0xeb1dd5ead967ad6860d64407413f86e50330ab123ca9adf2768145524c3f5323") - msg = database.BridgeMessage{ - Nonce: big.NewInt(100618), - GasLimit: bigint.Zero, - Tx: database.Transaction{ - FromAddress: common.HexToAddress("0x4200000000000000000000000000000000000010"), - ToAddress: common.HexToAddress("0x99c9fc46f92e8a1c0dec1b1747d010903e884be1"), - Amount: bigint.Zero, - Data: common.FromHex("0xa9f9e67500000000000000000000000028e1de268616a6ba0de59717ac5547589e6bb1180000000000000000000000003ef241d9ae02f2253d8a1bf0b35d68eab9925b400000000000000000000000003e579180cf01f0e2abf6ff4d566b7891fbf9b8680000000000000000000000003e579180cf01f0e2abf6ff4d566b7891fbf9b868000000000000000000000000000000000000000000000000000000174876e80000000000000000000000000000000000000000000000000000000000000000c00000000000000000000000000000000000000000000000000000000000000000"), - }, - } - - hash, err = LegacyBridgeMessageWithdrawalHash(10, &msg) - require.NoError(t, err) - require.Equal(t, expectedWithdrawalHash, hash) -} diff --git a/indexer/processors/bridge/metrics.go b/indexer/processors/bridge/metrics.go deleted file mode 100644 index 564658700272..000000000000 --- a/indexer/processors/bridge/metrics.go +++ /dev/null @@ -1,289 +0,0 @@ -package bridge - -import ( - "math/big" - - "github.com/ethereum-optimism/optimism/op-service/metrics" - "github.com/ethereum/go-ethereum/common" - - "github.com/prometheus/client_golang/prometheus" -) - -var ( - MetricsNamespace string = "op_indexer_bridge" -) - -type L1Metricer interface { - RecordL1Interval() (done func(err error)) - RecordL1LatestHeight(height *big.Int) - RecordL1LatestFinalizedHeight(height *big.Int) - - RecordL1TransactionDeposits(size int, mintedETH float64) - RecordL1ProvenWithdrawals(size int) - RecordL1FinalizedWithdrawals(size int) - - RecordL1CrossDomainSentMessages(size int) - RecordL1CrossDomainRelayedMessages(size int) - - RecordL1SkippedOVM1ProvenWithdrawals(size int) - RecordL1SkippedOVM1FinalizedWithdrawals(size int) - RecordL1SkippedOVM1CrossDomainRelayedMessages(size int) - - RecordL1InitiatedBridgeTransfers(token common.Address, size int) - RecordL1FinalizedBridgeTransfers(token common.Address, size int) -} - -type L2Metricer interface { - RecordL2Interval() (done func(err error)) - RecordL2LatestHeight(height *big.Int) - RecordL2LatestFinalizedHeight(height *big.Int) - - RecordL2TransactionWithdrawals(size int, withdrawnETH float64) - - RecordL2CrossDomainSentMessages(size int) - RecordL2CrossDomainRelayedMessages(size int) - - RecordL2InitiatedBridgeTransfers(token common.Address, size int) - RecordL2FinalizedBridgeTransfers(token common.Address, size int) -} - -type Metricer interface { - L1Metricer - L2Metricer -} - -type bridgeMetrics struct { - latestHeight *prometheus.GaugeVec - - intervalTick *prometheus.CounterVec - intervalDuration *prometheus.HistogramVec - intervalFailures *prometheus.CounterVec - - txDeposits prometheus.Counter - txWithdrawals prometheus.Counter - provenWithdrawals prometheus.Counter - finalizedWithdrawals prometheus.Counter - - txMintedETH prometheus.Counter - txWithdrawnETH prometheus.Counter - - sentMessages *prometheus.CounterVec - relayedMessages *prometheus.CounterVec - - skippedOVM1Withdrawals *prometheus.CounterVec - skippedOVM1RelayedMessages prometheus.Counter - - initiatedBridgeTransfers *prometheus.CounterVec - finalizedBridgeTransfers *prometheus.CounterVec -} - -func NewMetrics(registry *prometheus.Registry) Metricer { - factory := metrics.With(registry) - return &bridgeMetrics{ - intervalTick: factory.NewCounterVec(prometheus.CounterOpts{ - Namespace: MetricsNamespace, - Name: "intervals_total", - Help: "number of times processing loop has run", - }, []string{ - "chain", - }), - intervalDuration: factory.NewHistogramVec(prometheus.HistogramOpts{ - Namespace: MetricsNamespace, - Name: "interval_seconds", - Help: "duration elapsed in the processing loop", - }, []string{ - "chain", - }), - intervalFailures: factory.NewCounterVec(prometheus.CounterOpts{ - Namespace: MetricsNamespace, - Name: "interval_failures_total", - Help: "number of failures encountered", - }, []string{ - "chain", - }), - latestHeight: factory.NewGaugeVec(prometheus.GaugeOpts{ - Namespace: MetricsNamespace, - Name: "height", - Help: "the latest processed l1 block height", - }, []string{ - "chain", - "kind", - }), - txDeposits: factory.NewCounter(prometheus.CounterOpts{ - Namespace: MetricsNamespace, - Name: "tx_deposits", - Help: "number of processed transactions deposited from l1", - }), - txMintedETH: factory.NewCounter(prometheus.CounterOpts{ - Namespace: MetricsNamespace, - Name: "tx_minted_eth", - Help: "amount of eth bridged from l1", - }), - txWithdrawals: factory.NewCounter(prometheus.CounterOpts{ - Namespace: MetricsNamespace, - Name: "tx_withdrawals", - Help: "number of initiated transaction withdrawals from l2", - }), - txWithdrawnETH: factory.NewCounter(prometheus.CounterOpts{ - Namespace: MetricsNamespace, - Name: "tx_withdrawn_eth", - Help: "amount of eth withdrawn from l2", - }), - provenWithdrawals: factory.NewCounter(prometheus.CounterOpts{ - Namespace: MetricsNamespace, - Name: "proven_withdrawals", - Help: "number of proven tx withdrawals on l1", - }), - finalizedWithdrawals: factory.NewCounter(prometheus.CounterOpts{ - Namespace: MetricsNamespace, - Name: "finalized_withdrawals", - Help: "number of finalized tx withdrawals on l1", - }), - sentMessages: factory.NewCounterVec(prometheus.CounterOpts{ - Namespace: MetricsNamespace, - Name: "sent_messages", - Help: "number of bridged messages between l1 and l2", - }, []string{ - "chain", - }), - relayedMessages: factory.NewCounterVec(prometheus.CounterOpts{ - Namespace: MetricsNamespace, - Name: "relayed_messages", - Help: "number of relayed messages between l1 and l2", - }, []string{ - "chain", - }), - skippedOVM1Withdrawals: factory.NewCounterVec(prometheus.CounterOpts{ - Namespace: MetricsNamespace, - Name: "skipped_ovm1_withdrawals", - Help: "number of skipped ovm 1.0 withdrawals on l1 (proven|finalized)", - }, []string{ - "stage", - }), - skippedOVM1RelayedMessages: factory.NewCounter(prometheus.CounterOpts{ - Namespace: MetricsNamespace, - Name: "skipped_ovm1_relayed_messages", - Help: "number of skipped ovm 1.0 relayed messages on l1", - }), - initiatedBridgeTransfers: factory.NewCounterVec(prometheus.CounterOpts{ - Namespace: MetricsNamespace, - Name: "initiated_token_transfers", - Help: "number of bridged tokens between l1 and l2", - }, []string{ - "chain", - "token_address", - }), - finalizedBridgeTransfers: factory.NewCounterVec(prometheus.CounterOpts{ - Namespace: MetricsNamespace, - Name: "finalized_token_transfers", - Help: "number of finalized token transfers between l1 and l2", - }, []string{ - "chain", - "token_address", - }), - } -} - -// L1Metricer - -func (m *bridgeMetrics) RecordL1Interval() func(error) { - m.intervalTick.WithLabelValues("l1").Inc() - timer := prometheus.NewTimer(m.intervalDuration.WithLabelValues("l1")) - return func(err error) { - timer.ObserveDuration() - if err != nil { - m.intervalFailures.WithLabelValues("l1").Inc() - } - } -} - -func (m *bridgeMetrics) RecordL1LatestHeight(height *big.Int) { - m.latestHeight.WithLabelValues("l1", "initiated").Set(float64(height.Uint64())) -} - -func (m *bridgeMetrics) RecordL1LatestFinalizedHeight(height *big.Int) { - m.latestHeight.WithLabelValues("l1", "finalized").Set(float64(height.Uint64())) -} - -func (m *bridgeMetrics) RecordL1TransactionDeposits(size int, mintedETH float64) { - m.txDeposits.Add(float64(size)) - m.txMintedETH.Add(mintedETH) -} - -func (m *bridgeMetrics) RecordL1ProvenWithdrawals(size int) { - m.provenWithdrawals.Add(float64(size)) -} - -func (m *bridgeMetrics) RecordL1FinalizedWithdrawals(size int) { - m.finalizedWithdrawals.Add(float64(size)) -} - -func (m *bridgeMetrics) RecordL1CrossDomainSentMessages(size int) { - m.sentMessages.WithLabelValues("l1").Add(float64(size)) -} - -func (m *bridgeMetrics) RecordL1CrossDomainRelayedMessages(size int) { - m.relayedMessages.WithLabelValues("l1").Add(float64(size)) -} - -func (m *bridgeMetrics) RecordL1SkippedOVM1ProvenWithdrawals(size int) { - m.skippedOVM1Withdrawals.WithLabelValues("proven").Add(float64(size)) -} - -func (m *bridgeMetrics) RecordL1SkippedOVM1FinalizedWithdrawals(size int) { - m.skippedOVM1Withdrawals.WithLabelValues("finalized").Add(float64(size)) -} - -func (m *bridgeMetrics) RecordL1SkippedOVM1CrossDomainRelayedMessages(size int) { - m.skippedOVM1RelayedMessages.Add(float64(size)) -} - -func (m *bridgeMetrics) RecordL1InitiatedBridgeTransfers(tokenAddr common.Address, size int) { - m.initiatedBridgeTransfers.WithLabelValues("l1", tokenAddr.String()).Add(float64(size)) -} - -func (m *bridgeMetrics) RecordL1FinalizedBridgeTransfers(tokenAddr common.Address, size int) { - m.finalizedBridgeTransfers.WithLabelValues("l1", tokenAddr.String()).Add(float64(size)) -} - -// L2Metricer - -func (m *bridgeMetrics) RecordL2Interval() func(error) { - m.intervalTick.WithLabelValues("l2").Inc() - timer := prometheus.NewTimer(m.intervalDuration.WithLabelValues("l2")) - return func(err error) { - timer.ObserveDuration() - if err != nil { - m.intervalFailures.WithLabelValues("l2").Inc() - } - } -} - -func (m *bridgeMetrics) RecordL2LatestHeight(height *big.Int) { - m.latestHeight.WithLabelValues("l2", "initiated").Set(float64(height.Uint64())) -} - -func (m *bridgeMetrics) RecordL2LatestFinalizedHeight(height *big.Int) { - m.latestHeight.WithLabelValues("l2", "finalized").Set(float64(height.Uint64())) -} - -func (m *bridgeMetrics) RecordL2TransactionWithdrawals(size int, withdrawnETH float64) { - m.txWithdrawals.Add(float64(size)) - m.txWithdrawnETH.Add(withdrawnETH) -} - -func (m *bridgeMetrics) RecordL2CrossDomainSentMessages(size int) { - m.sentMessages.WithLabelValues("l2").Add(float64(size)) -} - -func (m *bridgeMetrics) RecordL2CrossDomainRelayedMessages(size int) { - m.relayedMessages.WithLabelValues("l2").Add(float64(size)) -} - -func (m *bridgeMetrics) RecordL2InitiatedBridgeTransfers(tokenAddr common.Address, size int) { - m.initiatedBridgeTransfers.WithLabelValues("l2", tokenAddr.String()).Add(float64(size)) -} - -func (m *bridgeMetrics) RecordL2FinalizedBridgeTransfers(tokenAddr common.Address, size int) { - m.finalizedBridgeTransfers.WithLabelValues("l2", tokenAddr.String()).Add(float64(size)) -} diff --git a/indexer/processors/bridge/ovm1/OVM1Withdrawals.csv b/indexer/processors/bridge/ovm1/OVM1Withdrawals.csv deleted file mode 100644 index 20e6a9d26d38..000000000000 --- a/indexer/processors/bridge/ovm1/OVM1Withdrawals.csv +++ /dev/null @@ -1,11311 +0,0 @@ -message_nonce,target,sender,data,relay_tx_hash,relay_timestamp,relay_message_version,post_regenesis_relay -54,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec34000000000000000000000000b2317a30fbb53f328cc11324ab37337a28e73b84000000000000000000000000b2317a30fbb53f328cc11324ab37337a28e73b84000000000000000000000000000000000000000000000000001ff973cafa800000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -55,0xcd9d4988c0ae61887b075ba77f08cbfad2b65068,0x3f87ff1de58128ef8fcb4c807efd776e1ac72e51,0xf4f7b41a00000000000000000000000024e6cc41da6081bda289e6f589825f9ee7b00b200000000000000000000000000000000000000000000000041dedad6365b4017f,,,1,true -59,0xcd9d4988c0ae61887b075ba77f08cbfad2b65068,0x3f87ff1de58128ef8fcb4c807efd776e1ac72e51,0xf4f7b41a000000000000000000000000078edd760ff5b5b4604fb338d3cf7b6d5355c7ec00000000000000000000000000000000000000000000000580b5a096b8ce545d,,,1,true -64,0xcd9d4988c0ae61887b075ba77f08cbfad2b65068,0x3f87ff1de58128ef8fcb4c807efd776e1ac72e51,0xf4f7b41a0000000000000000000000007244a3012d4363249326997f57909b61b6f5805c00000000000000000000000000000000000000000000000019c541b06cfb2524,,,1,true -92,0xcd9d4988c0ae61887b075ba77f08cbfad2b65068,0x3f87ff1de58128ef8fcb4c807efd776e1ac72e51,0xf4f7b41a000000000000000000000000fb6351b09a52db13d9255caaf0a12aff16ad973f000000000000000000000000000000000000000000000003b6c46a04ba030000,,,1,true -94,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec34000000000000000000000000c3bbf6bfe155b1444d15a585ad1bea862ea9e29a000000000000000000000000c3bbf6bfe155b1444d15a585ad1bea862ea9e29a0000000000000000000000000000000000000000000000000000999c6cd7580000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -96,0xcd9d4988c0ae61887b075ba77f08cbfad2b65068,0x3f87ff1de58128ef8fcb4c807efd776e1ac72e51,0xf4f7b41a000000000000000000000000d16d160ff95e492371eac5da4bf255806c088990000000000000000000000000000000000000000000000001668140a182aa8000,0x7da33b3858b471a78e8f32ff11bfaf207c7cf9966668d735e520482c90bcb410,2022-03-15 06:26:18.000 UTC,0,true -100,0xcd9d4988c0ae61887b075ba77f08cbfad2b65068,0x3f87ff1de58128ef8fcb4c807efd776e1ac72e51,0xf4f7b41a000000000000000000000000965555ae227348c6df04562805a538a395c42703000000000000000000000000000000000000000000000002ab7b260ff3fd0000,,,1,true -106,0xcd9d4988c0ae61887b075ba77f08cbfad2b65068,0x3f87ff1de58128ef8fcb4c807efd776e1ac72e51,0xf4f7b41a0000000000000000000000008a8ea94f6e6fb36a863f63735ee7d1b5f03ea8160000000000000000000000000000000000000000000000056bc75e2d63100000,,,1,true -108,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec34000000000000000000000000375c4952dfe5d5f0eae142f73cf8138ad496a722000000000000000000000000375c4952dfe5d5f0eae142f73cf8138ad496a722000000000000000000000000000000000000000000000000004380663abb800000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -112,0xcd9d4988c0ae61887b075ba77f08cbfad2b65068,0x3f87ff1de58128ef8fcb4c807efd776e1ac72e51,0xf4f7b41a000000000000000000000000d15472d58e1bf8fbfa4a9f87c5f3d4108d965b8f0000000000000000000000000000000000000000000000061f7c830b5c31981c,0xf71a79bb5601b4a889f8bc9df0135d59e4d197c8ccbb3585763a2a25bb6d54a7,2022-01-29 10:28:18.000 UTC,0,true -113,0xcd9d4988c0ae61887b075ba77f08cbfad2b65068,0x3f87ff1de58128ef8fcb4c807efd776e1ac72e51,0xf4f7b41a000000000000000000000000d15472d58e1bf8fbfa4a9f87c5f3d4108d965b8f0000000000000000000000000000000000000000000000097f78f7ab6d34819f,0xaf946677090eb896aa8f7dc7887c22e86b1bbd8b951810efd615a31805bfcbb8,2022-01-29 10:26:21.000 UTC,0,true -122,0xcd9d4988c0ae61887b075ba77f08cbfad2b65068,0x3f87ff1de58128ef8fcb4c807efd776e1ac72e51,0xf4f7b41a00000000000000000000000088b74128df7cb82eb7c2167e89946f83ffc907e90000000000000000000000000000000000000000000000004bf720dbaf1d8000,,,1,true -127,0xcd9d4988c0ae61887b075ba77f08cbfad2b65068,0x3f87ff1de58128ef8fcb4c807efd776e1ac72e51,0xf4f7b41a000000000000000000000000754bdb78a3c01afc52f96f1982d04bc181ab0c730000000000000000000000000000000000000000000000000e35fa931a000000,,,1,true -134,0xcd9d4988c0ae61887b075ba77f08cbfad2b65068,0x3f87ff1de58128ef8fcb4c807efd776e1ac72e51,0xf4f7b41a0000000000000000000000005f45f8296be3f38119d0c56ad339f6bf66154b9b000000000000000000000000000000000000000000000000858cdd756176e000,,,1,true -138,0xcd9d4988c0ae61887b075ba77f08cbfad2b65068,0x3f87ff1de58128ef8fcb4c807efd776e1ac72e51,0xf4f7b41a000000000000000000000000c8462eeeed1fe256c62f89678ebd6dcc1b04690e000000000000000000000000000000000000000000000001fd78d0905cf5b4d4,,,1,true -141,0xcd9d4988c0ae61887b075ba77f08cbfad2b65068,0x3f87ff1de58128ef8fcb4c807efd776e1ac72e51,0xf4f7b41a000000000000000000000000e39fef30d17b45e7789812234ac4efc803ee96a8000000000000000000000000000000000000000000000002cf03207879168000,,,1,true -142,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0xa9f9e675000000000000000000000000dac17f958d2ee523a2206206994597c13d831ec700000000000000000000000094b008aa00579c1307b0ef2c499ad98a8ce58e58000000000000000000000000bc07f994bd3d83cddd732bc50b57a810036ddf30000000000000000000000000bc07f994bd3d83cddd732bc50b57a810036ddf30000000000000000000000000000000000000000000000000000000000000271000000000000000000000000000000000000000000000000000000000000000c00000000000000000000000000000000000000000000000000000000000000000,,,1,true -143,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec34000000000000000000000000f196bba501bd8b6bfbe230dd6db39a93c72cb4f8000000000000000000000000f196bba501bd8b6bfbe230dd6db39a93c72cb4f80000000000000000000000000000000000000000000000000011c37937e0800000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -149,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0xa9f9e6750000000000000000000000002260fac5e5542a773aa44fbcfedf7c193bc2c59900000000000000000000000068f180fcce6836688e9084f035309e29bf0a2095000000000000000000000000bc07f994bd3d83cddd732bc50b57a810036ddf30000000000000000000000000bc07f994bd3d83cddd732bc50b57a810036ddf3000000000000000000000000000000000000000000000000000000000000003e800000000000000000000000000000000000000000000000000000000000000c00000000000000000000000000000000000000000000000000000000000000000,,,1,true -158,0xcd9d4988c0ae61887b075ba77f08cbfad2b65068,0x3f87ff1de58128ef8fcb4c807efd776e1ac72e51,0xf4f7b41a0000000000000000000000007c1908d49266ba2999c41b07b0895c33821f53a9000000000000000000000000000000000000000000000066ffcbfd5e5a300000,0xf535c5a9b784c3b17dc2a39cc94af42b017d5d648769dcf26b5041905d90a8d9,2022-01-25 02:16:14.000 UTC,0,true -160,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec34000000000000000000000000399bbde115cb626d8dafaf2e79a1373c96fc3dca000000000000000000000000399bbde115cb626d8dafaf2e79a1373c96fc3dca00000000000000000000000000000000000000000000000000470de4df82000000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -163,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec34000000000000000000000000d7f4a04c736cc1c5857231417e6cb8da9cadbec7000000000000000000000000d7f4a04c736cc1c5857231417e6cb8da9cadbec7000000000000000000000000000000000000000000000000001930514375200000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -165,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec34000000000000000000000000abe26faee77419897090bc4c5a112d463443a662000000000000000000000000abe26faee77419897090bc4c5a112d463443a662000000000000000000000000000000000000000000000000000051dac207a00000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -167,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec34000000000000000000000000d0dff694dafd006a955ca2fce7a018d3aaac08f2000000000000000000000000d0dff694dafd006a955ca2fce7a018d3aaac08f20000000000000000000000000000000000000000000000000011c37937e0800000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -169,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec34000000000000000000000000abe3bf5043ed0833d3da5148cd58d0f946891e61000000000000000000000000abe3bf5043ed0833d3da5148cd58d0f946891e610000000000000000000000000000000000000000000000000dde1037c52af00000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -170,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec3400000000000000000000000019ac702381fdf8b63b04a990fb39e7bde92c97b000000000000000000000000019ac702381fdf8b63b04a990fb39e7bde92c97b0000000000000000000000000000000000000000000000000000ffcb9e57d400000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -174,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec34000000000000000000000000ab91a2449ff8e2836c02ca03a496bcef69d99f88000000000000000000000000ab91a2449ff8e2836c02ca03a496bcef69d99f880000000000000000000000000000000000000000000000000021c0331d5dc00000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -176,0xcd9d4988c0ae61887b075ba77f08cbfad2b65068,0x3f87ff1de58128ef8fcb4c807efd776e1ac72e51,0xf4f7b41a000000000000000000000000c8462eeeed1fe256c62f89678ebd6dcc1b04690e000000000000000000000000000000000000000000000000b8156773856431aa,,,1,true -177,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec34000000000000000000000000e4569a42140eeb4ff9c31fea691fce2b6f974481000000000000000000000000e4569a42140eeb4ff9c31fea691fce2b6f974481000000000000000000000000000000000000000000000000001550f7dca7000000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -178,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec340000000000000000000000005fe30b7c0ed489493a42a8bc43b8a73ca72f67350000000000000000000000005fe30b7c0ed489493a42a8bc43b8a73ca72f6735000000000000000000000000000000000000000000000000001ff973cafa800000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -181,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec34000000000000000000000000b04336a8d37b7b1edc5db0b8f46918160df14ba2000000000000000000000000b04336a8d37b7b1edc5db0b8f46918160df14ba2000000000000000000000000000000000000000000000000000ffcb9e57d400000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -182,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec34000000000000000000000000580a5b2f32bd14af9da1e01ef41feb754f78c350000000000000000000000000580a5b2f32bd14af9da1e01ef41feb754f78c35000000000000000000000000000000000000000000000000000f6e9e1bbe3c00000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -183,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec34000000000000000000000000fd90ad81ad93d9af1008a513d964f6fbc589034d000000000000000000000000fd90ad81ad93d9af1008a513d964f6fbc589034d000000000000000000000000000000000000000000000000001ff973cafa800000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,0x9f96e8b78b3de62d164887e49a0c7b4c9a36d0944dae63333a9ccbdc41aaee84,2022-06-28 01:56:15.000 UTC,0,true -184,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec34000000000000000000000000c127c110ceade7370c8b327287f2a669ec7e93ba000000000000000000000000c127c110ceade7370c8b327287f2a669ec7e93ba000000000000000000000000000000000000000000000000002386f26fc1000000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -185,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec34000000000000000000000000cc02bb12596ed3679c0d2e0d449bd61931d7f5c7000000000000000000000000cc02bb12596ed3679c0d2e0d449bd61931d7f5c700000000000000000000000000000000000000000000000000138a388a43c00000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -188,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec34000000000000000000000000856b63349fb6c818ea7cd7305483ae0ef6956f6c000000000000000000000000856b63349fb6c818ea7cd7305483ae0ef6956f6c000000000000000000000000000000000000000000000000016345785d8a000000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -191,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec34000000000000000000000000a7258ec040748652576ffb447b228272b87ade4a000000000000000000000000a7258ec040748652576ffb447b228272b87ade4a000000000000000000000000000000000000000000000000002386f26fc1000000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -193,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec34000000000000000000000000ba0c565110f65d181b9ff1d8a9f787b52857bb0c000000000000000000000000ba0c565110f65d181b9ff1d8a9f787b52857bb0c0000000000000000000000000000000000000000000000000013bc2edbd21c0000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -195,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec3400000000000000000000000001b001f4b78c511d3260bfa538d4a117cd30d55700000000000000000000000001b001f4b78c511d3260bfa538d4a117cd30d5570000000000000000000000000000000000000000000000000012738915d842bf00000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -196,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0xa9f9e6750000000000000000000000002260fac5e5542a773aa44fbcfedf7c193bc2c59900000000000000000000000068f180fcce6836688e9084f035309e29bf0a209500000000000000000000000069dc97ad2dc7b179bff12a6eadabf3685d52845e00000000000000000000000069dc97ad2dc7b179bff12a6eadabf3685d52845e000000000000000000000000000000000000000000000000000000000000271000000000000000000000000000000000000000000000000000000000000000c00000000000000000000000000000000000000000000000000000000000000000,,,1,true -198,0xcd9d4988c0ae61887b075ba77f08cbfad2b65068,0x3f87ff1de58128ef8fcb4c807efd776e1ac72e51,0xf4f7b41a0000000000000000000000006875d9b42502c79917910b0fc00c6a5a27f1fc6800000000000000000000000000000000000000000000000745b2dd303ca25a32,,,1,true -199,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec340000000000000000000000004678cb6580b20bd4340fb5269e91af3e921180d80000000000000000000000004678cb6580b20bd4340fb5269e91af3e921180d800000000000000000000000000000000000000000000000002e654d9e53e2b8000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -201,0xcd9d4988c0ae61887b075ba77f08cbfad2b65068,0x3f87ff1de58128ef8fcb4c807efd776e1ac72e51,0xf4f7b41a0000000000000000000000002e0dadd0174bb9f4099b3e04e4a2300de2893b0b0000000000000000000000000000000000000000000000131c31ed18c2068178,,,1,true -213,0xcd9d4988c0ae61887b075ba77f08cbfad2b65068,0x3f87ff1de58128ef8fcb4c807efd776e1ac72e51,0xf4f7b41a000000000000000000000000fb5e8a587733e1a8700e1d448f97a12bab4ad4ea00000000000000000000000000000000000000000000000032423e6918e514cc,,,1,true -214,0xcd9d4988c0ae61887b075ba77f08cbfad2b65068,0x3f87ff1de58128ef8fcb4c807efd776e1ac72e51,0xf4f7b41a000000000000000000000000fb5e8a587733e1a8700e1d448f97a12bab4ad4ea00000000000000000000000000000000000000000000000000f7855dcff405ec,,,1,true -216,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec34000000000000000000000000816a684f40b8b4b060a4df7a10cad589ef64e95e000000000000000000000000816a684f40b8b4b060a4df7a10cad589ef64e95e000000000000000000000000000000000000000000000000002386f26fc1000000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -218,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec340000000000000000000000009b34b95fe3d018f6047d6ff65b2b6cfc85bd29160000000000000000000000009b34b95fe3d018f6047d6ff65b2b6cfc85bd291600000000000000000000000000000000000000000000000001550f7dca70000000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -221,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec34000000000000000000000000f28d4face9315ec0343d69e28b90712cb9aca453000000000000000000000000f28d4face9315ec0343d69e28b90712cb9aca453000000000000000000000000000000000000000000000000001ff973cafa800000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -222,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec34000000000000000000000000828355119398b77d364f41ef6533dad936d5b5c1000000000000000000000000828355119398b77d364f41ef6533dad936d5b5c100000000000000000000000000000000000000000000000000038d7ea4c6800000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -229,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0xa9f9e675000000000000000000000000dac17f958d2ee523a2206206994597c13d831ec700000000000000000000000094b008aa00579c1307b0ef2c499ad98a8ce58e58000000000000000000000000b4a6b88dc7dbe1b437a40bf1637961b0d865871c000000000000000000000000b4a6b88dc7dbe1b437a40bf1637961b0d865871c00000000000000000000000000000000000000000000000000000000000186a000000000000000000000000000000000000000000000000000000000000000c00000000000000000000000000000000000000000000000000000000000000000,,,1,true -230,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec34000000000000000000000000289922fbbfbd38472d7e2a1652b33b834f7c0e49000000000000000000000000289922fbbfbd38472d7e2a1652b33b834f7c0e490000000000000000000000000000000000000000000000000c7d713b49da000000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -231,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0xa9f9e675000000000000000000000000dac17f958d2ee523a2206206994597c13d831ec700000000000000000000000094b008aa00579c1307b0ef2c499ad98a8ce58e58000000000000000000000000e5479903febb574aae0442c5434897d6825d9977000000000000000000000000e5479903febb574aae0442c5434897d6825d99770000000000000000000000000000000000000000000000000000000000e8413700000000000000000000000000000000000000000000000000000000000000c00000000000000000000000000000000000000000000000000000000000000000,,,1,true -235,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec3400000000000000000000000013711b99539d2860aa740c0180a50627d538c28e00000000000000000000000013711b99539d2860aa740c0180a50627d538c28e00000000000000000000000000000000000000000000000000470de4df82000000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,0xe227d786571d6544f07da9bd0e22f28166fe11f15b3aa401c3e6df1e4e8933a2,2021-12-28 06:33:53.000 UTC,0,true -236,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec34000000000000000000000000ca1fd44348eb3ffde505346e6a813c2f33c4b816000000000000000000000000ca1fd44348eb3ffde505346e6a813c2f33c4b816000000000000000000000000000000000000000000000000005543df729c000000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -244,0x10e6593cdda8c58a1d0f14c5164b376352a55f2f,0x467194771dae2967aef3ecbedd3bf9a310c76c65,0xa9f9e6750000000000000000000000006b175474e89094c44da98b954eedeac495271d0f000000000000000000000000da10009cbd5d07dd0cecc66161fc93d7c9000da1000000000000000000000000260d2fb8c006d2ec9b9fa7b41f3f01f981a0adc5000000000000000000000000260d2fb8c006d2ec9b9fa7b41f3f01f981a0adc50000000000000000000000000000000000000000000000000de0b6b3a764000000000000000000000000000000000000000000000000000000000000000000c00000000000000000000000000000000000000000000000000000000000000000,,,1,true -246,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec3400000000000000000000000031760f7cbd0a5a506c8b5822a1555b16c087f35b00000000000000000000000031760f7cbd0a5a506c8b5822a1555b16c087f35b00000000000000000000000000000000000000000000000000071afd498d000000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -248,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec3400000000000000000000000039258caa0f56db9c9e26f3631586b424f0a6477300000000000000000000000039258caa0f56db9c9e26f3631586b424f0a64773000000000000000000000000000000000000000000000000000d0dc7821234b100000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -251,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec340000000000000000000000000e64cbca254788df4a8d29e3721d077d91d0d92a0000000000000000000000000e64cbca254788df4a8d29e3721d077d91d0d92a000000000000000000000000000000000000000000000000008e1bc9bf04000000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -252,0x10e6593cdda8c58a1d0f14c5164b376352a55f2f,0x467194771dae2967aef3ecbedd3bf9a310c76c65,0xa9f9e6750000000000000000000000006b175474e89094c44da98b954eedeac495271d0f000000000000000000000000da10009cbd5d07dd0cecc66161fc93d7c9000da10000000000000000000000005d6ea8c76ab5d7366578f4b36d798cc37219dc240000000000000000000000005d6ea8c76ab5d7366578f4b36d798cc37219dc240000000000000000000000000000000000000000000000004563918244f4000000000000000000000000000000000000000000000000000000000000000000c00000000000000000000000000000000000000000000000000000000000000000,,,1,true -253,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec3400000000000000000000000090a7b41610a25f7bf538bd27dc6e0434bd38933200000000000000000000000090a7b41610a25f7bf538bd27dc6e0434bd3893320000000000000000000000000000000000000000000000000011c37937e0800000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -263,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec340000000000000000000000005a27dbbff05f36dc927137855e3381f0c20c1cdd0000000000000000000000005a27dbbff05f36dc927137855e3381f0c20c1cdd000000000000000000000000000000000000000000000000013fbe85edc9000000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,0x8fb6023652e27efa476745645e947b4bd3d12486bc37d301c166cb48aab63c1d,2021-12-31 23:34:04.000 UTC,0,true -264,0x10e6593cdda8c58a1d0f14c5164b376352a55f2f,0x467194771dae2967aef3ecbedd3bf9a310c76c65,0xa9f9e6750000000000000000000000006b175474e89094c44da98b954eedeac495271d0f000000000000000000000000da10009cbd5d07dd0cecc66161fc93d7c9000da1000000000000000000000000912190dcb9dbd95106f3859e1d08ef290084d690000000000000000000000000912190dcb9dbd95106f3859e1d08ef290084d690000000000000000000000000000000000000000000000001a055690d9db8000000000000000000000000000000000000000000000000000000000000000000c00000000000000000000000000000000000000000000000000000000000000000,,,1,true -268,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec34000000000000000000000000b45e2b252969394a48e46616378f19b1f1f32bdd000000000000000000000000b45e2b252969394a48e46616378f19b1f1f32bdd000000000000000000000000000000000000000000000000002386f26fc1000000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -269,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0xa9f9e675000000000000000000000000dac17f958d2ee523a2206206994597c13d831ec700000000000000000000000094b008aa00579c1307b0ef2c499ad98a8ce58e58000000000000000000000000a3730477c3eb009d2dc4fc87ab2b1265251ed3be000000000000000000000000a3730477c3eb009d2dc4fc87ab2b1265251ed3be00000000000000000000000000000000000000000000000000000000000f424000000000000000000000000000000000000000000000000000000000000000c00000000000000000000000000000000000000000000000000000000000000000,,,1,true -272,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0xa9f9e675000000000000000000000000dac17f958d2ee523a2206206994597c13d831ec700000000000000000000000094b008aa00579c1307b0ef2c499ad98a8ce58e5800000000000000000000000070ba90062e0d6c89fe7c46074f20efd57a7557ef00000000000000000000000070ba90062e0d6c89fe7c46074f20efd57a7557ef00000000000000000000000000000000000000000000000000000000001e8bba00000000000000000000000000000000000000000000000000000000000000c00000000000000000000000000000000000000000000000000000000000000000,,,1,true -273,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec34000000000000000000000000353a3b43d34247cbc3f8092187cdd849b5b31a77000000000000000000000000353a3b43d34247cbc3f8092187cdd849b5b31a770000000000000000000000000000000000000000000000000214e8348c4f000000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -277,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0xa9f9e675000000000000000000000000dac17f958d2ee523a2206206994597c13d831ec700000000000000000000000094b008aa00579c1307b0ef2c499ad98a8ce58e5800000000000000000000000075d4bdbf6593ed463e9625694272a0ff9a6d346f00000000000000000000000075d4bdbf6593ed463e9625694272a0ff9a6d346f0000000000000000000000000000000000000000000000000000000016ea135300000000000000000000000000000000000000000000000000000000000000c00000000000000000000000000000000000000000000000000000000000000000,0xb171cf2697c4858dcf9c3834fe0a02579067214bee40af96018c3d43c14f8675,2022-04-05 01:35:36.000 UTC,0,true -279,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec34000000000000000000000000f0004c86b1251b10c7bf4672ca2bc59247a99bf5000000000000000000000000f0004c86b1251b10c7bf4672ca2bc59247a99bf500000000000000000000000000000000000000000000000008807d578bb9440000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,0xe7ce870d054c92c3483f25f07366e283104553f365c0909461c3b862b38eda53,2022-02-13 22:28:36.000 UTC,0,true -283,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec340000000000000000000000009534e4beb4f7e07bb88f4c6a067d666c29e1b4330000000000000000000000009534e4beb4f7e07bb88f4c6a067d666c29e1b433000000000000000000000000000000000000000000000000004115f16449000000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -286,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec34000000000000000000000000e5c161fcdac7d0d16e632626d815658983f583ea000000000000000000000000e5c161fcdac7d0d16e632626d815658983f583ea00000000000000000000000000000000000000000000000001f161421c8e000000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -289,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec34000000000000000000000000af4807d083287f205d897e6d00c6fde1bf0a241a000000000000000000000000af4807d083287f205d897e6d00c6fde1bf0a241a00000000000000000000000000000000000000000000000000071afd498d000000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -303,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec34000000000000000000000000063782e602106604145b60a64457f6e92fe2e6dd000000000000000000000000063782e602106604145b60a64457f6e92fe2e6dd0000000000000000000000000000000000000000000000000030950e55ca05a800000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -306,0x10e6593cdda8c58a1d0f14c5164b376352a55f2f,0x467194771dae2967aef3ecbedd3bf9a310c76c65,0xa9f9e6750000000000000000000000006b175474e89094c44da98b954eedeac495271d0f000000000000000000000000da10009cbd5d07dd0cecc66161fc93d7c9000da10000000000000000000000004189a63be018f4e50d4f770314f1bf87d7d65c810000000000000000000000004189a63be018f4e50d4f770314f1bf87d7d65c810000000000000000000000000000000000000000000000041ef7e8dca25eaf6000000000000000000000000000000000000000000000000000000000000000c00000000000000000000000000000000000000000000000000000000000000000,,,1,true -307,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec340000000000000000000000007d346aaf41745f87e71c4f8af9647f4aab2c4c310000000000000000000000007d346aaf41745f87e71c4f8af9647f4aab2c4c31000000000000000000000000000000000000000000000000002ff293c2540fe600000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -314,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec340000000000000000000000001a91c0df156a5f38aec0813d055aa0184fc478260000000000000000000000001a91c0df156a5f38aec0813d055aa0184fc4782600000000000000000000000000000000000000000000000000656b90ccad2f4e00000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -315,0x10e6593cdda8c58a1d0f14c5164b376352a55f2f,0x467194771dae2967aef3ecbedd3bf9a310c76c65,0xa9f9e6750000000000000000000000006b175474e89094c44da98b954eedeac495271d0f000000000000000000000000da10009cbd5d07dd0cecc66161fc93d7c9000da1000000000000000000000000e8b65b125afd293cdb2b496c4035ebf63e4d56a9000000000000000000000000e8b65b125afd293cdb2b496c4035ebf63e4d56a9000000000000000000000000000000000000000000000000846db28c6103bb2600000000000000000000000000000000000000000000000000000000000000c00000000000000000000000000000000000000000000000000000000000000000,,,1,true -323,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec3400000000000000000000000047b5ed2279478151d1631014aa90f876fec4a13600000000000000000000000047b5ed2279478151d1631014aa90f876fec4a136000000000000000000000000000000000000000000000000000c5630358fec7d00000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -329,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec340000000000000000000000002a59f7d6ac28e31715a76e949a805b7c1ae3ace50000000000000000000000002a59f7d6ac28e31715a76e949a805b7c1ae3ace500000000000000000000000000000000000000000000000000038d7ea4c6800000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -330,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec34000000000000000000000000a09b9febe45b40a1ab47c8cb323067161d6b9cb4000000000000000000000000a09b9febe45b40a1ab47c8cb323067161d6b9cb40000000000000000000000000000000000000000000000000c767bacdc9585a800000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -331,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec3400000000000000000000000027a557d1ab0a0f5dc9039aedee47ffcce6ca160400000000000000000000000027a557d1ab0a0f5dc9039aedee47ffcce6ca1604000000000000000000000000000000000000000000000000032ec990f8f8c30000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -338,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec3400000000000000000000000058dc53f7175fdd30c70ab5717c6e91edd8aed01700000000000000000000000058dc53f7175fdd30c70ab5717c6e91edd8aed017000000000000000000000000000000000000000000000000016345785d8a000000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -339,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec340000000000000000000000000627b4c6e08eeb3712c24713f4eb561e3f33319c0000000000000000000000000627b4c6e08eeb3712c24713f4eb561e3f33319c0000000000000000000000000000000000000000000000000160ff79d502b10000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -341,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec34000000000000000000000000668540812466219a4cf9ef22151bb7e513010f17000000000000000000000000668540812466219a4cf9ef22151bb7e513010f170000000000000000000000000000000000000000000000000007224b9463672100000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -345,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec340000000000000000000000002079a46983c7e43ca9f26b3ce75f7baf78d8da170000000000000000000000002079a46983c7e43ca9f26b3ce75f7baf78d8da1700000000000000000000000000000000000000000000000000bd3648b1f6271a00000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -347,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec3400000000000000000000000032eec9f20f75442b3dc91279ff307e17c7a6d7e800000000000000000000000032eec9f20f75442b3dc91279ff307e17c7a6d7e8000000000000000000000000000000000000000000000000003e213d0c24066200000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -349,0xcd9d4988c0ae61887b075ba77f08cbfad2b65068,0x3f87ff1de58128ef8fcb4c807efd776e1ac72e51,0xf4f7b41a000000000000000000000000bd3fe6e83fec5a3f3dc99ebd1088cd0737eb82940000000000000000000000000000000000000000000000013e29f4dcdc610360,,,1,true -353,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec34000000000000000000000000601c6d9eff76ae8cd7bff5fc4900f20f6f80734f000000000000000000000000601c6d9eff76ae8cd7bff5fc4900f20f6f80734f000000000000000000000000000000000000000000000000455c201e31dbbd0000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -357,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec34000000000000000000000000ebaffbdc8c854f0aab0e7567d38541578ff3c047000000000000000000000000ebaffbdc8c854f0aab0e7567d38541578ff3c04700000000000000000000000000000000000000000000000000aaa2708f721c0100000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -359,0xcd9d4988c0ae61887b075ba77f08cbfad2b65068,0x3f87ff1de58128ef8fcb4c807efd776e1ac72e51,0xf4f7b41a000000000000000000000000b082ddfd74748b763f52f04558e5f814a56de67a00000000000000000000000000000000000000000000000b4ae9cf9d96b685b4,,,1,true -365,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec340000000000000000000000002eb96f3453c00517ef534aa172a18b385ecff9a60000000000000000000000002eb96f3453c00517ef534aa172a18b385ecff9a600000000000000000000000000000000000000000000000000ab82e6a86a13ae00000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -367,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec34000000000000000000000000fa5b9a2dc716bd732c0633d576db4d9cceb36f55000000000000000000000000fa5b9a2dc716bd732c0633d576db4d9cceb36f5500000000000000000000000000000000000000000000000000309992eaa3ced800000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -372,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0xa9f9e675000000000000000000000000dac17f958d2ee523a2206206994597c13d831ec700000000000000000000000094b008aa00579c1307b0ef2c499ad98a8ce58e580000000000000000000000006b62e3d14992c702f136a84c95ee60b86fe822000000000000000000000000006b62e3d14992c702f136a84c95ee60b86fe82200000000000000000000000000000000000000000000000000000000000098968000000000000000000000000000000000000000000000000000000000000000c00000000000000000000000000000000000000000000000000000000000000000,,,1,true -376,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec3400000000000000000000000033107b56647014f37375b8291a86409f81a148db00000000000000000000000033107b56647014f37375b8291a86409f81a148db00000000000000000000000000000000000000000000000002bc97d322f093fd00000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -378,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec340000000000000000000000004c89d3625f581dfa803ff7c102b99b72efdc500c0000000000000000000000004c89d3625f581dfa803ff7c102b99b72efdc500c000000000000000000000000000000000000000000000000008a4a7f0a9da61f00000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -383,0xcd9d4988c0ae61887b075ba77f08cbfad2b65068,0x3f87ff1de58128ef8fcb4c807efd776e1ac72e51,0xf4f7b41a000000000000000000000000ec800b12b4c2f4a88b59012c856bf9b727dbfecc0000000000000000000000000000000000000000000000000738cbbd18d8c417,,,1,true -386,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec34000000000000000000000000ac029a845c9c21bf2010b3769d0661fe7a696cf4000000000000000000000000ac029a845c9c21bf2010b3769d0661fe7a696cf40000000000000000000000000000000000000000000000000002d79883d2000000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -388,0xcd9d4988c0ae61887b075ba77f08cbfad2b65068,0x3f87ff1de58128ef8fcb4c807efd776e1ac72e51,0xf4f7b41a0000000000000000000000004409bc676c79a82f2319c72b204a349a96983d3600000000000000000000000000000000000000000000000bbc04f1385fb6ce3b,,,1,true -390,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec340000000000000000000000001cd87070a7ca125c891c91d80ba148b1983ab62e0000000000000000000000001cd87070a7ca125c891c91d80ba148b1983ab62e000000000000000000000000000000000000000000000000008b9728c2e429c000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -391,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec34000000000000000000000000724b91be4efe9abf6d429528257b03f4acc84270000000000000000000000000724b91be4efe9abf6d429528257b03f4acc8427000000000000000000000000000000000000000000000000000ad3ec37a58a30800000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -394,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec3400000000000000000000000033ea964bbda6dab2b4067e5ad82b132e5ba83eb200000000000000000000000033ea964bbda6dab2b4067e5ad82b132e5ba83eb200000000000000000000000000000000000000000000000000acbfcad808f97b00000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -395,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec34000000000000000000000000ae8b31e6236bec753d01922bd7b6773287490c79000000000000000000000000ae8b31e6236bec753d01922bd7b6773287490c79000000000000000000000000000000000000000000000000002386f26fc1000000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -396,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec340000000000000000000000001e0ee214906cdaf22ed18cef730cf66ed4ae06420000000000000000000000001e0ee214906cdaf22ed18cef730cf66ed4ae064200000000000000000000000000000000000000000000000000d434498096afcd00000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -399,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec340000000000000000000000002d232c211c80c8ce716b884b8fcd784bb55e60530000000000000000000000002d232c211c80c8ce716b884b8fcd784bb55e60530000000000000000000000000000000000000000000000000008626851ab800000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -402,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec34000000000000000000000000fc03f894465e2b43be15a56918c4e298e2ee4be5000000000000000000000000fc03f894465e2b43be15a56918c4e298e2ee4be5000000000000000000000000000000000000000000000000000325cff345600000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -404,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec34000000000000000000000000897aaceb5620805a04b561c076ca49667d663238000000000000000000000000897aaceb5620805a04b561c076ca49667d66323800000000000000000000000000000000000000000000000000033302c9e0400000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -407,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0xa9f9e675000000000000000000000000dac17f958d2ee523a2206206994597c13d831ec700000000000000000000000094b008aa00579c1307b0ef2c499ad98a8ce58e58000000000000000000000000cc0960243d099bcae96c0d1aeacdda01434d2ebc000000000000000000000000cc0960243d099bcae96c0d1aeacdda01434d2ebc000000000000000000000000000000000000000000000000000000000098968000000000000000000000000000000000000000000000000000000000000000c00000000000000000000000000000000000000000000000000000000000000000,0xc8f77d7f04d24cb28453acd580e6c9672a09e54e8b6dff121541f6517e890d53,2022-05-13 20:38:58.000 UTC,0,true -410,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec34000000000000000000000000fc8a9dea9c4f9a8936cc9b4dad270635e76f1197000000000000000000000000fc8a9dea9c4f9a8936cc9b4dad270635e76f119700000000000000000000000000000000000000000000000001a313d48c855b9d00000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -411,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec34000000000000000000000000ae8b31e6236bec753d01922bd7b6773287490c79000000000000000000000000ae8b31e6236bec753d01922bd7b6773287490c79000000000000000000000000000000000000000000000000013a240098815be200000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -412,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec340000000000000000000000009d2fbb357c1017508f098d69ae7f19d63241d6560000000000000000000000009d2fbb357c1017508f098d69ae7f19d63241d6560000000000000000000000000000000000000000000000000005c1987b565b0000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -418,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec340000000000000000000000001d639c172c474d56ef85dae0431295466734c1970000000000000000000000001d639c172c474d56ef85dae0431295466734c1970000000000000000000000000000000000000000000000000003a2e68bb1e00000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -419,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec340000000000000000000000006a643bcc171e12448aa4202db2bfd4b008108a5a0000000000000000000000006a643bcc171e12448aa4202db2bfd4b008108a5a000000000000000000000000000000000000000000000000000401ba6660b00000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -420,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec34000000000000000000000000fd0041184f9387a822216be34da1f4893ea7b426000000000000000000000000fd0041184f9387a822216be34da1f4893ea7b42600000000000000000000000000000000000000000000000000036674b409bec800000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -421,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec340000000000000000000000001a68f7936d21439e9a5510628ce3dac6a4de79700000000000000000000000001a68f7936d21439e9a5510628ce3dac6a4de7970000000000000000000000000000000000000000000000000000134f491d4880000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -422,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec340000000000000000000000009aa1575e60d33cd8e750f3193bdfa7d5540fe1360000000000000000000000009aa1575e60d33cd8e750f3193bdfa7d5540fe1360000000000000000000000000000000000000000000000000001de83adaed97000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -423,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec340000000000000000000000004f2dc64360ebbe78c968338ed4baae1d141443400000000000000000000000004f2dc64360ebbe78c968338ed4baae1d1414434000000000000000000000000000000000000000000000000000005af3107a400000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -432,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec340000000000000000000000009512b8c1b63c9893258920b5998134a1261db85d0000000000000000000000009512b8c1b63c9893258920b5998134a1261db85d00000000000000000000000000000000000000000000000000354a6ba7a1800000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -433,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec34000000000000000000000000c8ac460603038da12ff2b6516d49929be9237939000000000000000000000000c8ac460603038da12ff2b6516d49929be923793900000000000000000000000000000000000000000000000000859d1923f388cd00000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,0x645a8cb90a52ec276d592333f274536d358a1a32a9daff8cff3396c75910b163,2022-05-20 09:44:19.000 UTC,0,true -434,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec34000000000000000000000000c8ac460603038da12ff2b6516d49929be9237939000000000000000000000000c8ac460603038da12ff2b6516d49929be9237939000000000000000000000000000000000000000000000000000000003b9aca0000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -436,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec34000000000000000000000000efd67615d66e3819539021d40e155e1a6107f283000000000000000000000000efd67615d66e3819539021d40e155e1a6107f283000000000000000000000000000000000000000000000000002386f26fc1000000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -439,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec34000000000000000000000000d8c9e1104b01cc0354782c617ad0c523f19c1b2f000000000000000000000000d8c9e1104b01cc0354782c617ad0c523f19c1b2f000000000000000000000000000000000000000000000000001c6bf52634000000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -440,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec34000000000000000000000000113b64de9690e22494dc3c4b6280156e2a25c487000000000000000000000000113b64de9690e22494dc3c4b6280156e2a25c48700000000000000000000000000000000000000000000000000189e45ae9af62200000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -441,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec34000000000000000000000000907a37f4fdcad959ca182538cfd9a6745cd673a6000000000000000000000000907a37f4fdcad959ca182538cfd9a6745cd673a60000000000000000000000000000000000000000000000000011cd58c3bd53ab00000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -444,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec34000000000000000000000000cbb8cf019a716684771515e4e95ad0fa304f29da000000000000000000000000cbb8cf019a716684771515e4e95ad0fa304f29da0000000000000000000000000000000000000000000000000ddf0c7bc568580000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -445,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec34000000000000000000000000536a32e1448cc9e8910d319d8d4639abfb13fbd9000000000000000000000000536a32e1448cc9e8910d319d8d4639abfb13fbd9000000000000000000000000000000000000000000000000000aa87bee53800000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -446,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec34000000000000000000000000367e9c3ac0e28c1536d5503de72bfea24fa4ed8a000000000000000000000000367e9c3ac0e28c1536d5503de72bfea24fa4ed8a000000000000000000000000000000000000000000000000001fa2df261c180000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -447,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec3400000000000000000000000007b3e12359a738171e2872f4db665fe91bcbadbe00000000000000000000000007b3e12359a738171e2872f4db665fe91bcbadbe0000000000000000000000000000000000000000000000000001c6bf5263400000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -448,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec34000000000000000000000000af4826b9a4cf2dfe5ffea76389b043b25bf381da000000000000000000000000af4826b9a4cf2dfe5ffea76389b043b25bf381da0000000000000000000000000000000000000000000000000062ac5c4705c25800000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -451,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec340000000000000000000000003c865bcad9c26a1e24f15a7881e2d09400f518120000000000000000000000003c865bcad9c26a1e24f15a7881e2d09400f518120000000000000000000000000000000000000000000000000018de76816d800000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -453,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec3400000000000000000000000042eed31a8bb26099364b301ae087acfb037ba86400000000000000000000000042eed31a8bb26099364b301ae087acfb037ba86400000000000000000000000000000000000000000000000000025d365d84740000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -454,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec3400000000000000000000000061e09532c31973271474da3616fa71b38362a5c100000000000000000000000061e09532c31973271474da3616fa71b38362a5c100000000000000000000000000000000000000000000000000b324cbf51749e800000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -455,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec34000000000000000000000000fde2205127903277f08f20d724abfb53c602f637000000000000000000000000fde2205127903277f08f20d724abfb53c602f63700000000000000000000000000000000000000000000000000baf6f1b3c8940000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -459,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec34000000000000000000000000f27c223b051ac3264c59b9ee8ca0f306406003a5000000000000000000000000f27c223b051ac3264c59b9ee8ca0f306406003a500000000000000000000000000000000000000000000000000038d7ea4c6800000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -462,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec340000000000000000000000004524eb19cb5a1ddec08b2bf4569f480632070fdf0000000000000000000000004524eb19cb5a1ddec08b2bf4569f480632070fdf000000000000000000000000000000000000000000000000006632f18c69640f00000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -463,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec34000000000000000000000000e21b36ebede73eb8acc7e15e13407d629240cfbf000000000000000000000000e21b36ebede73eb8acc7e15e13407d629240cfbf000000000000000000000000000000000000000000000000000110d9316ec00000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -464,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec34000000000000000000000000f3b5f18add21b6578e679d0de8ac7597d0095b73000000000000000000000000f3b5f18add21b6578e679d0de8ac7597d0095b73000000000000000000000000000000000000000000000000000051dac207a00000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -465,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec34000000000000000000000000bb3a0ceeea78fc630ea6ac4c97eecd106aefa16e000000000000000000000000bb3a0ceeea78fc630ea6ac4c97eecd106aefa16e0000000000000000000000000000000000000000000000000000b5e620f4800000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -466,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec340000000000000000000000001506d1fc81a1b5505115884bc7b792f19f4ca2fc0000000000000000000000001506d1fc81a1b5505115884bc7b792f19f4ca2fc000000000000000000000000000000000000000000000000001f1776b40f34ae00000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -467,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec34000000000000000000000000a608aab1a651e665c8defd5b6cb392484ab37d75000000000000000000000000a608aab1a651e665c8defd5b6cb392484ab37d750000000000000000000000000000000000000000000000000011c37937e0800000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -468,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec34000000000000000000000000ea5b010320eff0aabd4099ac733314d829ee0c0f000000000000000000000000ea5b010320eff0aabd4099ac733314d829ee0c0f0000000000000000000000000000000000000000000000000033abab2f34f30000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -470,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec34000000000000000000000000e17ba3491ef88c8ba6b8181313dd1219d403b08a000000000000000000000000e17ba3491ef88c8ba6b8181313dd1219d403b08a000000000000000000000000000000000000000000000000001c62fde17b34ee00000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -474,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec34000000000000000000000000569bfce7a6a72439d699a795c54f66826674e138000000000000000000000000569bfce7a6a72439d699a795c54f66826674e13800000000000000000000000000000000000000000000000000470de4df82000000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -476,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0xa9f9e675000000000000000000000000dac17f958d2ee523a2206206994597c13d831ec700000000000000000000000094b008aa00579c1307b0ef2c499ad98a8ce58e58000000000000000000000000efcbec968df1286d57e16c2cf31edbde3aa11f39000000000000000000000000efcbec968df1286d57e16c2cf31edbde3aa11f390000000000000000000000000000000000000000000000000000000003636f1b00000000000000000000000000000000000000000000000000000000000000c00000000000000000000000000000000000000000000000000000000000000000,,,1,true -479,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec3400000000000000000000000052679a46eb65176dcd38e4ce45089ed84b0bdbe600000000000000000000000052679a46eb65176dcd38e4ce45089ed84b0bdbe600000000000000000000000000000000000000000000000000164dc4d3c9289800000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -481,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec34000000000000000000000000e1ee06ef0176f9cc95765afef9ef10f451c035cd000000000000000000000000e1ee06ef0176f9cc95765afef9ef10f451c035cd000000000000000000000000000000000000000000000000006e0249c0a6103600000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,0xd615f5c8946e95a4cebe5bd7426cc6ed9a8bc7b653aed022bd2a4ce5705f9418,2022-05-22 10:29:02.000 UTC,0,true -482,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec340000000000000000000000004a23abf4eb73af80af932ba9abf89f4efe1b4c960000000000000000000000004a23abf4eb73af80af932ba9abf89f4efe1b4c9600000000000000000000000000000000000000000000000000100c72142168dc00000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -483,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec340000000000000000000000009c2e73a5987801a130a0a01feab47d70a5ec04750000000000000000000000009c2e73a5987801a130a0a01feab47d70a5ec0475000000000000000000000000000000000000000000000000005e259c0e8c400000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -490,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0xa9f9e675000000000000000000000000dac17f958d2ee523a2206206994597c13d831ec700000000000000000000000094b008aa00579c1307b0ef2c499ad98a8ce58e58000000000000000000000000710afef4052c2820059d13eb7ddc14700931cfe1000000000000000000000000710afef4052c2820059d13eb7ddc14700931cfe100000000000000000000000000000000000000000000000000000000004c4b4000000000000000000000000000000000000000000000000000000000000000c00000000000000000000000000000000000000000000000000000000000000000,0x475aa869685120b676f179f2f1dcddc93b20d8e1c28b1dee9f5ba791ad162e43,2022-05-16 11:14:46.000 UTC,0,true -494,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec34000000000000000000000000384158caae0ec2f338b48500d09240bcb00e3747000000000000000000000000384158caae0ec2f338b48500d09240bcb00e374700000000000000000000000000000000000000000000000000f3c5f8538e269700000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -498,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec3400000000000000000000000061f2bedbe48c49c38acd299ccdbfb814a23f9e4600000000000000000000000061f2bedbe48c49c38acd299ccdbfb814a23f9e46000000000000000000000000000000000000000000000000002dc1f68b6b4dc700000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -499,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec34000000000000000000000000e3ce0ab69bbcf986a5a1f7826f58205048d62d60000000000000000000000000e3ce0ab69bbcf986a5a1f7826f58205048d62d60000000000000000000000000000000000000000000000000014c2dc12e7fc00000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -502,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec34000000000000000000000000979eabeb86b39f4ae7a0d60b3d2039dfee5ac2a4000000000000000000000000979eabeb86b39f4ae7a0d60b3d2039dfee5ac2a40000000000000000000000000000000000000000000000000031bced02db000000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -503,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec3400000000000000000000000085553c73886977397c0eb6231ac95f86015ece9a00000000000000000000000085553c73886977397c0eb6231ac95f86015ece9a0000000000000000000000000000000000000000000000000033558ec475928000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -505,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec34000000000000000000000000b2f390af1b11083154a0a15bfd3e555f57d82737000000000000000000000000b2f390af1b11083154a0a15bfd3e555f57d8273700000000000000000000000000000000000000000000000000434009a354799600000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -506,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec34000000000000000000000000ed3c678f04d92c78c101154a271a50ad9089f443000000000000000000000000ed3c678f04d92c78c101154a271a50ad9089f443000000000000000000000000000000000000000000000000001a16ba969d05b100000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -511,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec340000000000000000000000003585c5691d442442685623f071e0fcc9f5ae1e8e0000000000000000000000003585c5691d442442685623f071e0fcc9f5ae1e8e0000000000000000000000000000000000000000000000000032dd27da55020000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,0xc765b78d01afaaaf650cd5723bb2a299fc15710bd2ee27d95d6b28aafb192e60,2021-12-12 11:37:47.000 UTC,0,true -513,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec34000000000000000000000000fe9f4e4fc884fbab008947c09c6bd7ecab1d9510000000000000000000000000fe9f4e4fc884fbab008947c09c6bd7ecab1d95100000000000000000000000000000000000000000000000000022169ece6c250000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -514,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec340000000000000000000000005f071f2ce06084811be5b2ef2e9d2773f53d32cb0000000000000000000000005f071f2ce06084811be5b2ef2e9d2773f53d32cb00000000000000000000000000000000000000000000000000f447514f945c1000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -518,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec34000000000000000000000000a82eb7116e2b3117be7ef111fe8e71197fda2fc7000000000000000000000000a82eb7116e2b3117be7ef111fe8e71197fda2fc70000000000000000000000000000000000000000000000000021d1d25511830000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -520,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec34000000000000000000000000892140d07986898067079527a5fe5036a56cc893000000000000000000000000892140d07986898067079527a5fe5036a56cc89300000000000000000000000000000000000000000000000000aead1bb949d50000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -522,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec34000000000000000000000000813e2048b3a1e47bb8965bfccd5d70da2324c8b7000000000000000000000000813e2048b3a1e47bb8965bfccd5d70da2324c8b7000000000000000000000000000000000000000000000000000051dac207a00000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -523,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec340000000000000000000000005fbdc9fc797bc23d716c758821049e91103144280000000000000000000000005fbdc9fc797bc23d716c758821049e911031442800000000000000000000000000000000000000000000000000445d10e361770000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -524,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec34000000000000000000000000a5119abbc91c0ef96de588b10df364e862dbc8f6000000000000000000000000a5119abbc91c0ef96de588b10df364e862dbc8f6000000000000000000000000000000000000000000000000003f88a45078c99300000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -526,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec34000000000000000000000000c16414ac1fedfdac4f8a09674d994e1bbb9d7113000000000000000000000000c16414ac1fedfdac4f8a09674d994e1bbb9d7113000000000000000000000000000000000000000000000000f9b1e8abb4f6187300000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,0xec62f271bfa1cd8dd5146a2f2f5a778d76012bb6f3fe4687f7bd75457bbda544,2021-12-24 05:11:57.000 UTC,0,true -527,0xcd9d4988c0ae61887b075ba77f08cbfad2b65068,0x3f87ff1de58128ef8fcb4c807efd776e1ac72e51,0xf4f7b41a000000000000000000000000e30a466d244dffbc36ab3d616796a276ebcd760c0000000000000000000000000000000000000000000000005371a517ff288800,,,1,true -529,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec3400000000000000000000000090ea7c4f89d11fc237a822e7395cd4b33f164e5800000000000000000000000090ea7c4f89d11fc237a822e7395cd4b33f164e580000000000000000000000000000000000000000000000000055febac9875e6e00000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -533,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec340000000000000000000000003b11cc193ba3ab9c2a0ed9eda03a4d795c7662620000000000000000000000003b11cc193ba3ab9c2a0ed9eda03a4d795c766262000000000000000000000000000000000000000000000000004418446a06d50000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -534,0x10e6593cdda8c58a1d0f14c5164b376352a55f2f,0x467194771dae2967aef3ecbedd3bf9a310c76c65,0xa9f9e6750000000000000000000000006b175474e89094c44da98b954eedeac495271d0f000000000000000000000000da10009cbd5d07dd0cecc66161fc93d7c9000da1000000000000000000000000ef91ecd0142ae4c5163b2cf060c0563d49188c82000000000000000000000000ef91ecd0142ae4c5163b2cf060c0563d49188c820000000000000000000000000000000000000000000000000de0b6b3a764000000000000000000000000000000000000000000000000000000000000000000c00000000000000000000000000000000000000000000000000000000000000000,,,1,true -535,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec34000000000000000000000000913ef606ae851af034f2195c63f1c0324fb3e423000000000000000000000000913ef606ae851af034f2195c63f1c0324fb3e42300000000000000000000000000000000000000000000000000ba34e311fa030000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -536,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec340000000000000000000000008bc00f15af562e01d3faa3bc5d53f3aa7bbc59660000000000000000000000008bc00f15af562e01d3faa3bc5d53f3aa7bbc596600000000000000000000000000000000000000000000000000b1a2bc2ec5000000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -537,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec34000000000000000000000000beaae768c2534b882ca2cabf1f04d528b95163fd000000000000000000000000beaae768c2534b882ca2cabf1f04d528b95163fd000000000000000000000000000000000000000000000000011aafc1d8b9a90000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -538,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec34000000000000000000000000210e953c0f36dd6df7c07d745cb31660fdea7e72000000000000000000000000210e953c0f36dd6df7c07d745cb31660fdea7e72000000000000000000000000000000000000000000000000001550f7dca7000000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -540,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0xa9f9e675000000000000000000000000dac17f958d2ee523a2206206994597c13d831ec700000000000000000000000094b008aa00579c1307b0ef2c499ad98a8ce58e58000000000000000000000000039b678799337cb0e04dbdd192020ab4fe65783e000000000000000000000000039b678799337cb0e04dbdd192020ab4fe65783e00000000000000000000000000000000000000000000000000000000ca8231f800000000000000000000000000000000000000000000000000000000000000c00000000000000000000000000000000000000000000000000000000000000000,,,1,true -543,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec3400000000000000000000000069b4f1d198783baca5da8bb69f4447514ffa26df00000000000000000000000069b4f1d198783baca5da8bb69f4447514ffa26df000000000000000000000000000000000000000000000000013543d8b99fee9900000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -549,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec34000000000000000000000000d030e6d9c9d0951d7d0e902fb0f27caa66d65286000000000000000000000000d030e6d9c9d0951d7d0e902fb0f27caa66d65286000000000000000000000000000000000000000000000000011547f1cab70d4c00000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,0xf5ca5ec3366a8d1e6d73dcf91c7ae6d61cf4c2166874c87388ec35e5464e7872,2021-12-26 14:51:38.000 UTC,0,true -551,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec340000000000000000000000009e59a19937237224b04aa25b293119ce1733dc580000000000000000000000009e59a19937237224b04aa25b293119ce1733dc5800000000000000000000000000000000000000000000000000963cd9ab5a73c000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -553,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec340000000000000000000000003753fa57980fd180655c281158e428ca994d6dfa0000000000000000000000003753fa57980fd180655c281158e428ca994d6dfa000000000000000000000000000000000000000000000000015e314a523b8d9b00000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -554,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec34000000000000000000000000e2876ec5991f19a26bf4a32915b43a03e96d129a000000000000000000000000e2876ec5991f19a26bf4a32915b43a03e96d129a00000000000000000000000000000000000000000000000000688206bd1b360000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -556,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec34000000000000000000000000fa0c63a5295eed86bbeb2e49ec44bc0ed4466ada000000000000000000000000fa0c63a5295eed86bbeb2e49ec44bc0ed4466ada000000000000000000000000000000000000000000000000013ad61b2b5b22c000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -558,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec3400000000000000000000000016613d9c9f1fec0b1e08233602d7dedf27c5c86800000000000000000000000016613d9c9f1fec0b1e08233602d7dedf27c5c86800000000000000000000000000000000000000000000000002d9f9596ca4166a00000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -559,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec3400000000000000000000000016613d9c9f1fec0b1e08233602d7dedf27c5c86800000000000000000000000016613d9c9f1fec0b1e08233602d7dedf27c5c868000000000000000000000000000000000000000000000000007edef594c63ecb00000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -561,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec34000000000000000000000000060655f1e1f87086b27e35ce8eef99945e2f4f6b000000000000000000000000060655f1e1f87086b27e35ce8eef99945e2f4f6b00000000000000000000000000000000000000000000000000233ba7346d80c000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -562,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec340000000000000000000000003d67b76cf3dcc881255eb2262e788be03b2f5b9f0000000000000000000000003d67b76cf3dcc881255eb2262e788be03b2f5b9f000000000000000000000000000000000000000000000000008a6b67f927a90000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -563,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec340000000000000000000000003d67b76cf3dcc881255eb2262e788be03b2f5b9f0000000000000000000000003d67b76cf3dcc881255eb2262e788be03b2f5b9f00000000000000000000000000000000000000000000000002ade43338cb380100000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -566,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec340000000000000000000000008bc00f15af562e01d3faa3bc5d53f3aa7bbc59660000000000000000000000008bc00f15af562e01d3faa3bc5d53f3aa7bbc5966000000000000000000000000000000000000000000000000006a94d74f43000000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -571,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec34000000000000000000000000f39fe64953c20757419d960ee6dbc5e6a19914d3000000000000000000000000f39fe64953c20757419d960ee6dbc5e6a19914d300000000000000000000000000000000000000000000000006ea19e7969e135e00000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -578,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec34000000000000000000000000bc07f994bd3d83cddd732bc50b57a810036ddf30000000000000000000000000bc07f994bd3d83cddd732bc50b57a810036ddf30000000000000000000000000000000000000000000000000002386f26fc1000000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -579,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec34000000000000000000000000603fe182e7e1c16e5003fd44cb7263cdb969642e000000000000000000000000603fe182e7e1c16e5003fd44cb7263cdb969642e00000000000000000000000000000000000000000000000000225b6b47c6c70000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -580,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec34000000000000000000000000bc07f994bd3d83cddd732bc50b57a810036ddf30000000000000000000000000bc07f994bd3d83cddd732bc50b57a810036ddf3000000000000000000000000000000000000000000000000000470de4df82000000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -581,0x10e6593cdda8c58a1d0f14c5164b376352a55f2f,0x467194771dae2967aef3ecbedd3bf9a310c76c65,0xa9f9e6750000000000000000000000006b175474e89094c44da98b954eedeac495271d0f000000000000000000000000da10009cbd5d07dd0cecc66161fc93d7c9000da10000000000000000000000003e4a0e0593df6ffd10d459e06429b93399a3d80a0000000000000000000000003e4a0e0593df6ffd10d459e06429b93399a3d80a000000000000000000000000000000000000000000000000314efb91c16aafaf00000000000000000000000000000000000000000000000000000000000000c00000000000000000000000000000000000000000000000000000000000000000,,,1,true -585,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec340000000000000000000000004329ef4ef2d9b407b277325ba744025ce437920f0000000000000000000000004329ef4ef2d9b407b277325ba744025ce437920f000000000000000000000000000000000000000000000000001aa535d3d0c00000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -587,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec34000000000000000000000000f9499fc54c492118620f38b36b72c06632128157000000000000000000000000f9499fc54c492118620f38b36b72c06632128157000000000000000000000000000000000000000000000000001459f02296673000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -588,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec34000000000000000000000000f9499fc54c492118620f38b36b72c06632128157000000000000000000000000f9499fc54c492118620f38b36b72c066321281570000000000000000000000000000000000000000000000000008b9f5fb47f97700000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -589,0xcd9d4988c0ae61887b075ba77f08cbfad2b65068,0x3f87ff1de58128ef8fcb4c807efd776e1ac72e51,0xf4f7b41a00000000000000000000000083d420a602b5cd560ac5fa9bbca0d5e91e4cb9750000000000000000000000000000000000000000000000058235a9b32a882e78,,,1,true -590,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec34000000000000000000000000c7015ab1a9f7348bc2598cd77eb3471092193188000000000000000000000000c7015ab1a9f7348bc2598cd77eb3471092193188000000000000000000000000000000000000000000000000011c37937e08000000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -598,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec340000000000000000000000004570d5b4177cf209944e8e3fb1f2a77021ffd5c50000000000000000000000004570d5b4177cf209944e8e3fb1f2a77021ffd5c5000000000000000000000000000000000000000000000000215cef5e3dbe2e1600000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -602,0xcd9d4988c0ae61887b075ba77f08cbfad2b65068,0x3f87ff1de58128ef8fcb4c807efd776e1ac72e51,0xf4f7b41a00000000000000000000000024bf21c742791848cb37d228afad72a5a273b18100000000000000000000000000000000000000000000000059c531a9e3d6ea85,,,1,true -603,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec34000000000000000000000000c29c64e997ea2488c444ff2eba812cf5c6de49b4000000000000000000000000c29c64e997ea2488c444ff2eba812cf5c6de49b40000000000000000000000000000000000000000000000000058d15e1762800000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -604,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec34000000000000000000000000da989e943caff71f29284a39c8947410480a6e07000000000000000000000000da989e943caff71f29284a39c8947410480a6e070000000000000000000000000000000000000000000000000018de76816d800000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -606,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec34000000000000000000000000e75ec34b72a1deb5e267365297950fe2649e97d4000000000000000000000000e75ec34b72a1deb5e267365297950fe2649e97d4000000000000000000000000000000000000000000000000006e3ca455466f9800000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -612,0x10e6593cdda8c58a1d0f14c5164b376352a55f2f,0x467194771dae2967aef3ecbedd3bf9a310c76c65,0xa9f9e6750000000000000000000000006b175474e89094c44da98b954eedeac495271d0f000000000000000000000000da10009cbd5d07dd0cecc66161fc93d7c9000da10000000000000000000000002526ce6014e8c17aedea915fa7470d4b780ade980000000000000000000000002526ce6014e8c17aedea915fa7470d4b780ade9800000000000000000000000000000000000000000000000ad78ebc5ac620000000000000000000000000000000000000000000000000000000000000000000c00000000000000000000000000000000000000000000000000000000000000000,,,1,true -615,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec3400000000000000000000000040f9ccc945d52d74b9a023cb295015d28d40d8f300000000000000000000000040f9ccc945d52d74b9a023cb295015d28d40d8f300000000000000000000000000000000000000000000000000038d7ea4c6800000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -618,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec340000000000000000000000002526ce6014e8c17aedea915fa7470d4b780ade980000000000000000000000002526ce6014e8c17aedea915fa7470d4b780ade980000000000000000000000000000000000000000000000000195708d03af99c800000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -623,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec340000000000000000000000008b797bc5cfd2dfa84a727328d8df28d0fde55ca40000000000000000000000008b797bc5cfd2dfa84a727328d8df28d0fde55ca400000000000000000000000000000000000000000000000000af366d1391760000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -626,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec34000000000000000000000000cc202930867769a83b61cf5053b65d1845e76aea000000000000000000000000cc202930867769a83b61cf5053b65d1845e76aea0000000000000000000000000000000000000000000000000dadff6d8ea92e9500000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,0xa1fc47f1737b884d0f2941ea7afcec2904e543e64dff1b4c441d34e66abf9456,2021-11-24 15:55:04.000 UTC,0,true -633,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec340000000000000000000000004271eb0d4ddcc6856ad0d9eb987257ca2ac5278c0000000000000000000000004271eb0d4ddcc6856ad0d9eb987257ca2ac5278c0000000000000000000000000000000000000000000000000001033e1cf569ac00000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -639,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec340000000000000000000000008822645150ae7e252c404381e07bc9c44552e9f50000000000000000000000008822645150ae7e252c404381e07bc9c44552e9f500000000000000000000000000000000000000000000000001175e4aa00dc4af00000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -642,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec34000000000000000000000000747439c899faa9a7e2a7695ce64d0909050e6169000000000000000000000000747439c899faa9a7e2a7695ce64d0909050e6169000000000000000000000000000000000000000000000000003a53fe592ae50000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -643,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec34000000000000000000000000a6cfc086526be4bd7cfc02a0c62f06530fc7212d000000000000000000000000a6cfc086526be4bd7cfc02a0c62f06530fc7212d000000000000000000000000000000000000000000000000001ea657463ba80000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -645,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec34000000000000000000000000a9732a70489c681bb5b8f53d9eedb83bbe04f04f000000000000000000000000a9732a70489c681bb5b8f53d9eedb83bbe04f04f00000000000000000000000000000000000000000000000000563851dd2db88300000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -646,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec3400000000000000000000000035483b77a27a254d0f6248416e94e23ff7c8ef0f00000000000000000000000035483b77a27a254d0f6248416e94e23ff7c8ef0f00000000000000000000000000000000000000000000000000675da46edc155100000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -649,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0xa9f9e675000000000000000000000000dac17f958d2ee523a2206206994597c13d831ec700000000000000000000000094b008aa00579c1307b0ef2c499ad98a8ce58e5800000000000000000000000012ef2cd4231d5cf655a6cdd4ac1524ffaa439c1700000000000000000000000012ef2cd4231d5cf655a6cdd4ac1524ffaa439c17000000000000000000000000000000000000000000000000000000016efcc01a00000000000000000000000000000000000000000000000000000000000000c00000000000000000000000000000000000000000000000000000000000000000,0xf437d5e09082a184bbbdbd788edbc1808509297d76b04dc5be48bf0fc4095093,2022-06-01 07:42:30.000 UTC,0,true -650,0x10e6593cdda8c58a1d0f14c5164b376352a55f2f,0x467194771dae2967aef3ecbedd3bf9a310c76c65,0xa9f9e6750000000000000000000000006b175474e89094c44da98b954eedeac495271d0f000000000000000000000000da10009cbd5d07dd0cecc66161fc93d7c9000da10000000000000000000000000d801699678375e43d14f67453e24f17ebbaef8a0000000000000000000000000d801699678375e43d14f67453e24f17ebbaef8a00000000000000000000000000000000000000000000000a35a2f021abc49e6b00000000000000000000000000000000000000000000000000000000000000c00000000000000000000000000000000000000000000000000000000000000000,,,1,true -652,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec340000000000000000000000000e9f0b99751b49fffd7115eb0415d4aca11db8980000000000000000000000000e9f0b99751b49fffd7115eb0415d4aca11db898000000000000000000000000000000000000000000000000000f252719c5b74000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -653,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec34000000000000000000000000e53fb7989ad637f7a674e8db71e85cab60607183000000000000000000000000e53fb7989ad637f7a674e8db71e85cab6060718300000000000000000000000000000000000000000000000000c1bad3366c576800000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -655,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec340000000000000000000000004e4e018514c72776fe0f48bdc13aa1aa49e88f610000000000000000000000004e4e018514c72776fe0f48bdc13aa1aa49e88f610000000000000000000000000000000000000000000000000011f0aeb6d599e500000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -657,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec34000000000000000000000000153509e78fd04144d482e27716ae14c52d7932b0000000000000000000000000153509e78fd04144d482e27716ae14c52d7932b0000000000000000000000000000000000000000000000000001f4daf5641a1c900000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -658,0xcd9d4988c0ae61887b075ba77f08cbfad2b65068,0x3f87ff1de58128ef8fcb4c807efd776e1ac72e51,0xf4f7b41a00000000000000000000000006185ca50a8ab43726b08d8e65c6f2173fb2b2360000000000000000000000000000000000000000000000002055d2a7b6a90000,,,1,true -659,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec340000000000000000000000000ace8dccf7bbc639f6de934a962c2d4880bf6d300000000000000000000000000ace8dccf7bbc639f6de934a962c2d4880bf6d30000000000000000000000000000000000000000000000000002e2f6e5e14800000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -664,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec34000000000000000000000000c0d1212b52da5ed44b19f4328f5fe7708f825d81000000000000000000000000c0d1212b52da5ed44b19f4328f5fe7708f825d81000000000000000000000000000000000000000000000000002b8ad18d3d69f200000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,0xbed0c05b25e16393b56973911c96e2f74b09b94faf87f7998a1042232347dcfb,2022-03-08 04:42:00.000 UTC,0,true -665,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec34000000000000000000000000c5a61d56ca395fcb87f148532369595e31286d0e000000000000000000000000c5a61d56ca395fcb87f148532369595e31286d0e00000000000000000000000000000000000000000000000000470de4df82000000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,0x1ae9c293db4cf469b0b6b59c8653555dedb7ad3bea0b52317bc880c456cbf592,2022-05-24 02:45:59.000 UTC,0,true -666,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec340000000000000000000000006e9fbf581059cabe23241f8307d96e9087baf7ea0000000000000000000000006e9fbf581059cabe23241f8307d96e9087baf7ea00000000000000000000000000000000000000000000000000a79bbcaeb99b9700000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,0xe76ffd8c97fc39b908574ddb3bd20c65199a3922be3153035514f4fb0c150327,2022-03-07 16:27:30.000 UTC,0,true -668,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec340000000000000000000000004f96f50edb37a19216d87693e5db241e31bd37350000000000000000000000004f96f50edb37a19216d87693e5db241e31bd373500000000000000000000000000000000000000000000000164dc0424419e22c200000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -671,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec340000000000000000000000008e7126dc2ba9e19d84c7d708f294a743fa4bce630000000000000000000000008e7126dc2ba9e19d84c7d708f294a743fa4bce6300000000000000000000000000000000000000000000000000b552f14bae975900000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -672,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec340000000000000000000000000896d781ddd4949990ad530e77550577a5cf4b990000000000000000000000000896d781ddd4949990ad530e77550577a5cf4b9900000000000000000000000000000000000000000000000002c1745542ba214200000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -673,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec340000000000000000000000000f4b7ba1fb6fea41b7f159f1b86b8295f269abde0000000000000000000000000f4b7ba1fb6fea41b7f159f1b86b8295f269abde0000000000000000000000000000000000000000000000000011c37937e0800000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -677,0xcd9d4988c0ae61887b075ba77f08cbfad2b65068,0x3f87ff1de58128ef8fcb4c807efd776e1ac72e51,0xf4f7b41a0000000000000000000000003e17fac953de2cd729b0ace7f6d4353387717e9e0000000000000000000000000000000000000000000000117b0e7dd162419429,,,1,true -681,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec340000000000000000000000005eee0073017bd5a3bc0f031c3ff84cf12302c04c0000000000000000000000005eee0073017bd5a3bc0f031c3ff84cf12302c04c00000000000000000000000000000000000000000000000005f8837463f91e9800000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -684,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec34000000000000000000000000479de3aaf6151ae39f74d55e1f440de66e85ddd4000000000000000000000000479de3aaf6151ae39f74d55e1f440de66e85ddd40000000000000000000000000000000000000000000000000159b5206e3c225d00000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -687,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec34000000000000000000000000fe9f4e4fc884fbab008947c09c6bd7ecab1d9510000000000000000000000000fe9f4e4fc884fbab008947c09c6bd7ecab1d951000000000000000000000000000000000000000000000000000079fb988364a0000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -690,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec340000000000000000000000008d41a8fc6c7a6f07ce60b421f0f24c958e09211f0000000000000000000000008d41a8fc6c7a6f07ce60b421f0f24c958e09211f000000000000000000000000000000000000000000000000003b66a05eb12f2a00000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -691,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec340000000000000000000000008d41a8fc6c7a6f07ce60b421f0f24c958e09211f0000000000000000000000008d41a8fc6c7a6f07ce60b421f0f24c958e09211f000000000000000000000000000000000000000000000000002384e11c371cee00000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -692,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec340000000000000000000000007d105dd0a16290f4a3729cac5c4acaae8492b2590000000000000000000000007d105dd0a16290f4a3729cac5c4acaae8492b259000000000000000000000000000000000000000000000000001d568764f9ee1000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -694,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec34000000000000000000000000b35e598fc643037facde62dba4343e99f6294958000000000000000000000000b35e598fc643037facde62dba4343e99f62949580000000000000000000000000000000000000000000000000186cc6acd4b000000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -698,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec340000000000000000000000009fcdce0361c3a8a1b5d21afa25383605d26b0f350000000000000000000000009fcdce0361c3a8a1b5d21afa25383605d26b0f35000000000000000000000000000000000000000000000000013720fbf76cd94000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -699,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec340000000000000000000000003b9a250ef1a6a3673d2d4b6805bdb1059d22ecb30000000000000000000000003b9a250ef1a6a3673d2d4b6805bdb1059d22ecb300000000000000000000000000000000000000000000000000470de4df82000000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -704,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec340000000000000000000000007c7cb0f3a890df6b8c1de1d22ab9caecf81b172c0000000000000000000000007c7cb0f3a890df6b8c1de1d22ab9caecf81b172c000000000000000000000000000000000000000000000000006abe60bea5c73800000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -705,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec340000000000000000000000009f62dd1a43d79cc5acbf94abf823cd33f816bdb90000000000000000000000009f62dd1a43d79cc5acbf94abf823cd33f816bdb9000000000000000000000000000000000000000000000000004e28e2290f000000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -706,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec340000000000000000000000008da4bf2f8f0cd17849cc563eba0aa8fd6c14a3ac0000000000000000000000008da4bf2f8f0cd17849cc563eba0aa8fd6c14a3ac000000000000000000000000000000000000000000000000001c6bf52634000000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -707,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec340000000000000000000000003f14347ae79a734dbf84883bf2bfd3c285f860220000000000000000000000003f14347ae79a734dbf84883bf2bfd3c285f86022000000000000000000000000000000000000000000000000009c9328f7c9450000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -713,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0xa9f9e6750000000000000000000000002260fac5e5542a773aa44fbcfedf7c193bc2c59900000000000000000000000068f180fcce6836688e9084f035309e29bf0a20950000000000000000000000004ec6b6f9bcdda4432cc134779b62bf8770d925b20000000000000000000000004ec6b6f9bcdda4432cc134779b62bf8770d925b200000000000000000000000000000000000000000000000000000000000a68b300000000000000000000000000000000000000000000000000000000000000c00000000000000000000000000000000000000000000000000000000000000000,,,1,true -715,0x10e6593cdda8c58a1d0f14c5164b376352a55f2f,0x467194771dae2967aef3ecbedd3bf9a310c76c65,0xa9f9e6750000000000000000000000006b175474e89094c44da98b954eedeac495271d0f000000000000000000000000da10009cbd5d07dd0cecc66161fc93d7c9000da1000000000000000000000000bfddb0906e960c1b3d965b6bd291208e8c5bbad1000000000000000000000000bfddb0906e960c1b3d965b6bd291208e8c5bbad1000000000000000000000000000000000000000000000002fcf22664b680c2c200000000000000000000000000000000000000000000000000000000000000c00000000000000000000000000000000000000000000000000000000000000000,,,1,true -716,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec34000000000000000000000000bfddb0906e960c1b3d965b6bd291208e8c5bbad1000000000000000000000000bfddb0906e960c1b3d965b6bd291208e8c5bbad1000000000000000000000000000000000000000000000000001f1311dfbb5bc000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -718,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec34000000000000000000000000820d2e1f0e75e83078730605ee6fb436d7a7762f000000000000000000000000820d2e1f0e75e83078730605ee6fb436d7a7762f0000000000000000000000000000000000000000000000000169db2e213ce3d900000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -723,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec34000000000000000000000000af4f9aa4a83133ae981b5afeda7d764621c5fae6000000000000000000000000af4f9aa4a83133ae981b5afeda7d764621c5fae600000000000000000000000000000000000000000000000000031c84d188bd8300000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -728,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec340000000000000000000000005bcc90a9ed7be531d2be62cbdb6324f0b9bf632f0000000000000000000000005bcc90a9ed7be531d2be62cbdb6324f0b9bf632f00000000000000000000000000000000000000000000000000049cd4f2c773c000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -729,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec340000000000000000000000005cf2565d3f2711093ea24d4021248c7bc04697490000000000000000000000005cf2565d3f2711093ea24d4021248c7bc046974900000000000000000000000000000000000000000000000000b1a2bc2ec5000000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -733,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec34000000000000000000000000102e14acfc47ef75167763112024a9ed38596da0000000000000000000000000102e14acfc47ef75167763112024a9ed38596da0000000000000000000000000000000000000000000000000007c58508723800000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,0x34f7bd635826f3bee79626633f454af90ae72171da7641bf354155128c179267,2022-02-26 12:48:03.000 UTC,0,true -738,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0xa9f9e675000000000000000000000000dac17f958d2ee523a2206206994597c13d831ec700000000000000000000000094b008aa00579c1307b0ef2c499ad98a8ce58e58000000000000000000000000c9037fd858069e2fa03ce1eff31bda66ea3075c1000000000000000000000000c9037fd858069e2fa03ce1eff31bda66ea3075c100000000000000000000000000000000000000000000000000000000f732eff400000000000000000000000000000000000000000000000000000000000000c00000000000000000000000000000000000000000000000000000000000000000,,,1,true -739,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec34000000000000000000000000c024559c710123b6caf5d225b56913aab339aad0000000000000000000000000c024559c710123b6caf5d225b56913aab339aad0000000000000000000000000000000000000000000000000002386f26fc1000000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -742,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec34000000000000000000000000b08112a69b572e4b05000cfd837ef06b6a255bf1000000000000000000000000b08112a69b572e4b05000cfd837ef06b6a255bf100000000000000000000000000000000000000000000000006eacb8d12142b0000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -749,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec340000000000000000000000000b4afac1f985afd50cabaa1a607cc0e0e666fadc0000000000000000000000000b4afac1f985afd50cabaa1a607cc0e0e666fadc0000000000000000000000000000000000000000000000000014ef5dc3e86f0000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -752,0x10e6593cdda8c58a1d0f14c5164b376352a55f2f,0x467194771dae2967aef3ecbedd3bf9a310c76c65,0xa9f9e6750000000000000000000000006b175474e89094c44da98b954eedeac495271d0f000000000000000000000000da10009cbd5d07dd0cecc66161fc93d7c9000da100000000000000000000000017ba7a44e90155bb2bf1375bae9c423e48afd48e00000000000000000000000017ba7a44e90155bb2bf1375bae9c423e48afd48e0000000000000000000000000000000000000000000000008ac7230489e8000000000000000000000000000000000000000000000000000000000000000000c00000000000000000000000000000000000000000000000000000000000000000,,,1,true -755,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec340000000000000000000000003b9a250ef1a6a3673d2d4b6805bdb1059d22ecb30000000000000000000000003b9a250ef1a6a3673d2d4b6805bdb1059d22ecb300000000000000000000000000000000000000000000000000424de64d71700000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -759,0xcd9d4988c0ae61887b075ba77f08cbfad2b65068,0x3f87ff1de58128ef8fcb4c807efd776e1ac72e51,0xf4f7b41a000000000000000000000000743c9d620d2b1943d3347e2120ff9998637042ac000000000000000000000000000000000000000000000002c06fad6cebdb4e00,,,1,true -761,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec34000000000000000000000000015fc0f9a30b6353b6ea191d7c4ba6c8aade92d7000000000000000000000000015fc0f9a30b6353b6ea191d7c4ba6c8aade92d7000000000000000000000000000000000000000000000000003a7a486500c00000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,0x9baae0cb8f88dc4d64233bbfa72431b50f38e7eb78671dd2f5e3ba69b34d8ae9,2022-03-14 09:24:52.000 UTC,0,true -762,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec340000000000000000000000002d7d64469f37bab258e084f4b5e43677789d3ce80000000000000000000000002d7d64469f37bab258e084f4b5e43677789d3ce800000000000000000000000000000000000000000000000000883e62b58fc9a800000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -767,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec34000000000000000000000000156825670f19b704d54249f6d4d053a217bf3115000000000000000000000000156825670f19b704d54249f6d4d053a217bf311500000000000000000000000000000000000000000000000000538411c27d619d00000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -768,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec340000000000000000000000001420bddee23e28a2fab3d91b716dcfbfc2165ff90000000000000000000000001420bddee23e28a2fab3d91b716dcfbfc2165ff900000000000000000000000000000000000000000000000000439fe1e30c815e00000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -771,0x10e6593cdda8c58a1d0f14c5164b376352a55f2f,0x467194771dae2967aef3ecbedd3bf9a310c76c65,0xa9f9e6750000000000000000000000006b175474e89094c44da98b954eedeac495271d0f000000000000000000000000da10009cbd5d07dd0cecc66161fc93d7c9000da10000000000000000000000000111bbc1f307cc9bde8dd181e17c36b17d342efd0000000000000000000000000111bbc1f307cc9bde8dd181e17c36b17d342efd00000000000000000000000000000000000000000000000057f6206a70a171d300000000000000000000000000000000000000000000000000000000000000c00000000000000000000000000000000000000000000000000000000000000000,,,1,true -772,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec340000000000000000000000000111bbc1f307cc9bde8dd181e17c36b17d342efd0000000000000000000000000111bbc1f307cc9bde8dd181e17c36b17d342efd0000000000000000000000000000000000000000000000000000f99a97f0ae6e00000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -773,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec340000000000000000000000000d01b7ff2b2544529ee092240d406051756607260000000000000000000000000d01b7ff2b2544529ee092240d40605175660726000000000000000000000000000000000000000000000000013d09ce8566c91f00000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -774,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec34000000000000000000000000c16e9ce31179909a69f92c6b587e9255bb77fb16000000000000000000000000c16e9ce31179909a69f92c6b587e9255bb77fb16000000000000000000000000000000000000000000000000015f15ecdd140dcd00000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -775,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec340000000000000000000000007c7c63070372f67b49a269940aa6853e1dccf2950000000000000000000000007c7c63070372f67b49a269940aa6853e1dccf29500000000000000000000000000000000000000000000000000166392a19ebc8200000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -777,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec340000000000000000000000006e6512dc17c28cb50ab0787c30a806bdc363930d0000000000000000000000006e6512dc17c28cb50ab0787c30a806bdc363930d0000000000000000000000000000000000000000000000000092c5488bbde8b900000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -778,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec34000000000000000000000000374b7cf2684850d687b25b13ebc0e3046980aaa8000000000000000000000000374b7cf2684850d687b25b13ebc0e3046980aaa8000000000000000000000000000000000000000000000000015f29b3382a05e700000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -779,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec34000000000000000000000000a9ee9b9620556054d5e400d0c12ba6393efbc05e000000000000000000000000a9ee9b9620556054d5e400d0c12ba6393efbc05e000000000000000000000000000000000000000000000000007b3fcb8e557aaa00000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -786,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec3400000000000000000000000094f6134e0879f82ecb3aabd67dba21fec57fd04300000000000000000000000094f6134e0879f82ecb3aabd67dba21fec57fd043000000000000000000000000000000000000000000000000000a3f04646f345100000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -787,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec3400000000000000000000000042fb7812297ca741c665b3fd60a9310351d1546600000000000000000000000042fb7812297ca741c665b3fd60a9310351d1546600000000000000000000000000000000000000000000000000f8b0a10e47000000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -793,0x10e6593cdda8c58a1d0f14c5164b376352a55f2f,0x467194771dae2967aef3ecbedd3bf9a310c76c65,0xa9f9e6750000000000000000000000006b175474e89094c44da98b954eedeac495271d0f000000000000000000000000da10009cbd5d07dd0cecc66161fc93d7c9000da100000000000000000000000058d797263f86ae8885c8757efe1a59bd179357c900000000000000000000000058d797263f86ae8885c8757efe1a59bd179357c90000000000000000000000000000000000000000000000ecaf0c2701a80d6a0000000000000000000000000000000000000000000000000000000000000000c00000000000000000000000000000000000000000000000000000000000000000,,,1,true -794,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec34000000000000000000000000e65b845d994b7eaa59456c36f590907afd896628000000000000000000000000e65b845d994b7eaa59456c36f590907afd89662800000000000000000000000000000000000000000000000000154b191061470000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -796,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec34000000000000000000000000c1dd073c0ee4bf474a5ce5b0d08a4e240115f176000000000000000000000000c1dd073c0ee4bf474a5ce5b0d08a4e240115f17600000000000000000000000000000000000000000000000000133af6d4f9a9c000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -802,0x10e6593cdda8c58a1d0f14c5164b376352a55f2f,0x467194771dae2967aef3ecbedd3bf9a310c76c65,0xa9f9e6750000000000000000000000006b175474e89094c44da98b954eedeac495271d0f000000000000000000000000da10009cbd5d07dd0cecc66161fc93d7c9000da1000000000000000000000000302d43d1a7c1313608f218446a4266fb312c461e000000000000000000000000302d43d1a7c1313608f218446a4266fb312c461e00000000000000000000000000000000000000000000000256b23d2620995e7200000000000000000000000000000000000000000000000000000000000000c00000000000000000000000000000000000000000000000000000000000000000,,,1,true -808,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec340000000000000000000000008da4bf2f8f0cd17849cc563eba0aa8fd6c14a3ac0000000000000000000000008da4bf2f8f0cd17849cc563eba0aa8fd6c14a3ac000000000000000000000000000000000000000000000000002aade72a6bae1900000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -812,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec3400000000000000000000000093f4de4246130b153149a2e26a469c555754559200000000000000000000000093f4de4246130b153149a2e26a469c5557545592000000000000000000000000000000000000000000000000026cd2012bc9000000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -813,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec34000000000000000000000000b7162203d69f761b8d899e8f6f2f12818f87738f000000000000000000000000b7162203d69f761b8d899e8f6f2f12818f87738f0000000000000000000000000000000000000000000000000060e3ed2b874c8100000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,0x0bbfefd6ef7834d869b7aabcbb5d1c538f3409ec1f4adeb6415c0d799800d406,2022-05-27 23:49:34.000 UTC,0,true -814,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec340000000000000000000000000298ed1d964a107517f2a135106e903fcf42e77c0000000000000000000000000298ed1d964a107517f2a135106e903fcf42e77c00000000000000000000000000000000000000000000000000398fd40c23830000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -815,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec3400000000000000000000000051d32336397884d86712814d73ee3f20610e395200000000000000000000000051d32336397884d86712814d73ee3f20610e3952000000000000000000000000000000000000000000000000000009184e72a00000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -816,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec340000000000000000000000005d0864beb3a80a530f494427d6a03b9ca71112fb0000000000000000000000005d0864beb3a80a530f494427d6a03b9ca71112fb00000000000000000000000000000000000000000000000000099dbf4165158400000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -819,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec34000000000000000000000000334c5b9f732174caa4b7a67d2178b7e74a527003000000000000000000000000334c5b9f732174caa4b7a67d2178b7e74a52700300000000000000000000000000000000000000000000000000014c77db5eac9800000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -821,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec3400000000000000000000000006089bceee94a485c61b311cb61934d5cf8a684e00000000000000000000000006089bceee94a485c61b311cb61934d5cf8a684e000000000000000000000000000000000000000000000000000029a18b7e930e00000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -823,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec3400000000000000000000000053c9286b4940281609433dc01c28d86c734b44c300000000000000000000000053c9286b4940281609433dc01c28d86c734b44c3000000000000000000000000000000000000000000000000002bcab74dd21e0000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -825,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec3400000000000000000000000032aa36adfe23c52de8737bdb7c7ebf2db4253e8900000000000000000000000032aa36adfe23c52de8737bdb7c7ebf2db4253e89000000000000000000000000000000000000000000000000002386f26fc1000000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -828,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec3400000000000000000000000032aa36adfe23c52de8737bdb7c7ebf2db4253e8900000000000000000000000032aa36adfe23c52de8737bdb7c7ebf2db4253e89000000000000000000000000000000000000000000000000002386f26fc1000000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -830,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec3400000000000000000000000041d657fd02fcedaa37df6cc785859423f03a58e900000000000000000000000041d657fd02fcedaa37df6cc785859423f03a58e900000000000000000000000000000000000000000000000000038d7ea4c6800000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -831,0xcd9d4988c0ae61887b075ba77f08cbfad2b65068,0x3f87ff1de58128ef8fcb4c807efd776e1ac72e51,0xf4f7b41a00000000000000000000000016b00db74167b7469dda63b674ca9a3b1b70c439000000000000000000000000000000000000000000000001c09b256500768132,,,1,true -832,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec34000000000000000000000000320ed2be452129381c87d0e4f4aabd7d9b7786fe000000000000000000000000320ed2be452129381c87d0e4f4aabd7d9b7786fe00000000000000000000000000000000000000000000000000000124ebd427c000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,0x678959ef46816db82cec80e038adec4bb506d28570d4ff5174acc79960e62b16,2022-08-25 07:58:33.000 UTC,0,true -833,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0xa9f9e675000000000000000000000000dac17f958d2ee523a2206206994597c13d831ec700000000000000000000000094b008aa00579c1307b0ef2c499ad98a8ce58e58000000000000000000000000320ed2be452129381c87d0e4f4aabd7d9b7786fe000000000000000000000000320ed2be452129381c87d0e4f4aabd7d9b7786fe00000000000000000000000000000000000000000000000000000000037c621500000000000000000000000000000000000000000000000000000000000000c00000000000000000000000000000000000000000000000000000000000000000,0xa0ca4994434f8808b3255e0d03507dd4ab4f48b5bc652e5fabef0a93677d52aa,2022-08-25 08:03:39.000 UTC,0,true -834,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec340000000000000000000000009476b5d92f0f6411007ed481405c80c1801a60ce0000000000000000000000009476b5d92f0f6411007ed481405c80c1801a60ce000000000000000000000000000000000000000000000000004497af4bf2343b00000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -836,0x10e6593cdda8c58a1d0f14c5164b376352a55f2f,0x467194771dae2967aef3ecbedd3bf9a310c76c65,0xa9f9e6750000000000000000000000006b175474e89094c44da98b954eedeac495271d0f000000000000000000000000da10009cbd5d07dd0cecc66161fc93d7c9000da1000000000000000000000000721c7fffe9ac426a028e616677811f755fa99eba000000000000000000000000721c7fffe9ac426a028e616677811f755fa99eba00000000000000000000000000000000000000000000000002c68af0bb14000000000000000000000000000000000000000000000000000000000000000000c00000000000000000000000000000000000000000000000000000000000000000,,,1,true -837,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec34000000000000000000000000fe60e3cb6bbdca1879d62796e1e0ea174334493b000000000000000000000000fe60e3cb6bbdca1879d62796e1e0ea174334493b0000000000000000000000000000000000000000000000000046ce59bcae17de00000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -838,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec340000000000000000000000007d346aaf41745f87e71c4f8af9647f4aab2c4c310000000000000000000000007d346aaf41745f87e71c4f8af9647f4aab2c4c31000000000000000000000000000000000000000000000000008736c880dac63700000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -842,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec340000000000000000000000003930934bfd0997f375c0749081b51dacee8d0aa40000000000000000000000003930934bfd0997f375c0749081b51dacee8d0aa40000000000000000000000000000000000000000000000000015265c76b9973900000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -845,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec34000000000000000000000000d6d301feb8c691989f4597cf37167a896085511b000000000000000000000000d6d301feb8c691989f4597cf37167a896085511b00000000000000000000000000000000000000000000000000005af3107a400000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -846,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec340000000000000000000000007b1815f2c8bf70385e23bf97ad86b152e8171cfc0000000000000000000000007b1815f2c8bf70385e23bf97ad86b152e8171cfc000000000000000000000000000000000000000000000000000009184e72a00000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -847,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec3400000000000000000000000076b7c065ee0ec58b4fcefdf8927063303d3e798900000000000000000000000076b7c065ee0ec58b4fcefdf8927063303d3e7989000000000000000000000000000000000000000000000000000009184e72a00000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -848,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec340000000000000000000000001632b9c770c809eab725e19cced79249c469aff40000000000000000000000001632b9c770c809eab725e19cced79249c469aff4000000000000000000000000000000000000000000000000000009184e72a00000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -849,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec3400000000000000000000000053f740aa1962c38b75da7e7eef74c8c05fe9f27600000000000000000000000053f740aa1962c38b75da7e7eef74c8c05fe9f27600000000000000000000000000000000000000000000000000005af3107a400000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -850,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec340000000000000000000000001852bdf59e59a6ef462f88976bc0e0208d022a2f0000000000000000000000001852bdf59e59a6ef462f88976bc0e0208d022a2f00000000000000000000000000000000000000000000000000005af3107a400000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -851,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec34000000000000000000000000cbe934124a766bee19c36aeda167a885c6063f55000000000000000000000000cbe934124a766bee19c36aeda167a885c6063f5500000000000000000000000000000000000000000000000000005af3107a400000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -852,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec34000000000000000000000000cfb3f38a19e1a37eb3b76cfa01ec78149fa7f950000000000000000000000000cfb3f38a19e1a37eb3b76cfa01ec78149fa7f95000000000000000000000000000000000000000000000000000005af3107a400000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -853,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec340000000000000000000000002dab481d9f9f3dde5157e10e7a3ed8ff4470d2390000000000000000000000002dab481d9f9f3dde5157e10e7a3ed8ff4470d23900000000000000000000000000000000000000000000000000005af3107a400000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -854,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec34000000000000000000000000c3e27850711e108033f2b007226bd29335092786000000000000000000000000c3e27850711e108033f2b007226bd2933509278600000000000000000000000000000000000000000000000000005af3107a400000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -855,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec3400000000000000000000000051d32336397884d86712814d73ee3f20610e395200000000000000000000000051d32336397884d86712814d73ee3f20610e395200000000000000000000000000000000000000000000000000005af3107a400000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -856,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec340000000000000000000000008c94a5d9648e17a0e30cc7f7f2e8f5cd8ef40bca0000000000000000000000008c94a5d9648e17a0e30cc7f7f2e8f5cd8ef40bca00000000000000000000000000000000000000000000000000005af3107a400000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -858,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec34000000000000000000000000146ab635fd9f49a57ceaeed6347fd4f9f4349ae4000000000000000000000000146ab635fd9f49a57ceaeed6347fd4f9f4349ae40000000000000000000000000000000000000000000000000078b29eef5bffd400000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -862,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec340000000000000000000000007e54ff8766bb1c0d6d978495454e7b2fb041faed0000000000000000000000007e54ff8766bb1c0d6d978495454e7b2fb041faed00000000000000000000000000000000000000000000000000470de4df82000000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -863,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec34000000000000000000000000ef08c3d5b02cf6240cf71908d5dbd497e361584f000000000000000000000000ef08c3d5b02cf6240cf71908d5dbd497e361584f0000000000000000000000000000000000000000000000000014c1801dac030000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -864,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec34000000000000000000000000ca87dfe624d3fc05abcceeac9d50ec3f7a3541d1000000000000000000000000ca87dfe624d3fc05abcceeac9d50ec3f7a3541d1000000000000000000000000000000000000000000000000001943d81419d2c000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -868,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec34000000000000000000000000d75741e7f919fe1ede40efcf920ff878de08a832000000000000000000000000d75741e7f919fe1ede40efcf920ff878de08a83200000000000000000000000000000000000000000000000000ea21ccda4fe51800000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -878,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec3400000000000000000000000064895794c76167dd1566646357592be45893de9800000000000000000000000064895794c76167dd1566646357592be45893de9800000000000000000000000000000000000000000000000000592d824a2ce18d00000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -881,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec34000000000000000000000000a7ce82898efc2afc8fe6e5bfa08c6f96536222a1000000000000000000000000a7ce82898efc2afc8fe6e5bfa08c6f96536222a10000000000000000000000000000000000000000000000000019945ca262000000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -887,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec34000000000000000000000000ef4b2f4ac237a4d52c6c3ae4e425cb174c583bf8000000000000000000000000ef4b2f4ac237a4d52c6c3ae4e425cb174c583bf800000000000000000000000000000000000000000000000000215f6fcde8180000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -889,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec3400000000000000000000000033d8b1655fa39d85ede7fdf89f98b0394166005000000000000000000000000033d8b1655fa39d85ede7fdf89f98b039416600500000000000000000000000000000000000000000000000000429d069189e000000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -890,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec34000000000000000000000000bef78bef9f383bf3bb5e337cec7a4d1160a7fa11000000000000000000000000bef78bef9f383bf3bb5e337cec7a4d1160a7fa1100000000000000000000000000000000000000000000000001617d9b5e28da0000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -891,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec3400000000000000000000000091f10cffdeb9701f2a03d72ff309fb08857a9b4900000000000000000000000091f10cffdeb9701f2a03d72ff309fb08857a9b49000000000000000000000000000000000000000000000000002386f26fc1000000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -892,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec34000000000000000000000000a949f950d4ed54822eda2a09a67131e2cbd9d4d7000000000000000000000000a949f950d4ed54822eda2a09a67131e2cbd9d4d700000000000000000000000000000000000000000000000000470de4df82000000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -893,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec34000000000000000000000000b9e62c014d644aebde25c253d0d8e3a40c83de47000000000000000000000000b9e62c014d644aebde25c253d0d8e3a40c83de47000000000000000000000000000000000000000000000000002386f26fc1000000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -898,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec34000000000000000000000000ed1d5da0059f42ad19fb9837f0ba7fdc674fe877000000000000000000000000ed1d5da0059f42ad19fb9837f0ba7fdc674fe877000000000000000000000000000000000000000000000000000efc33ae0b787900000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -901,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec34000000000000000000000000daccce559a0571083556f39d05b177579613d83b000000000000000000000000daccce559a0571083556f39d05b177579613d83b0000000000000000000000000000000000000000000000000000922936fa9c7c00000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -902,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec340000000000000000000000008ffc862d7954dbae096d2d1402c5a0aca1e45c890000000000000000000000008ffc862d7954dbae096d2d1402c5a0aca1e45c89000000000000000000000000000000000000000000000000003fb6b7148a826000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -916,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec3400000000000000000000000084e3e0f568ed68b4f6827fe797444b3d5b1fd8b500000000000000000000000084e3e0f568ed68b4f6827fe797444b3d5b1fd8b5000000000000000000000000000000000000000000000000006a94d74f43000000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -918,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec34000000000000000000000000a3de285e0dd68d90856007ba52bc2a26d6f70b6e000000000000000000000000a3de285e0dd68d90856007ba52bc2a26d6f70b6e00000000000000000000000000000000000000000000000003ecd513c54a24f200000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -920,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0xa9f9e675000000000000000000000000dac17f958d2ee523a2206206994597c13d831ec700000000000000000000000094b008aa00579c1307b0ef2c499ad98a8ce58e58000000000000000000000000bb50690db3897ca5b1f63cff6e0c061b93f9bfbd000000000000000000000000bb50690db3897ca5b1f63cff6e0c061b93f9bfbd0000000000000000000000000000000000000000000000000000000005f5e10000000000000000000000000000000000000000000000000000000000000000c00000000000000000000000000000000000000000000000000000000000000000,0x6e4bcfbf482237019641baefddee70e0d83f3bf05bbee8908f270dcda0333189,2022-06-22 09:54:41.000 UTC,0,true -922,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec3400000000000000000000000022536213791b04d8201ba219665dab3835d993f300000000000000000000000022536213791b04d8201ba219665dab3835d993f3000000000000000000000000000000000000000000000000002386f26fc1000000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -924,0xcd9d4988c0ae61887b075ba77f08cbfad2b65068,0x3f87ff1de58128ef8fcb4c807efd776e1ac72e51,0xf4f7b41a000000000000000000000000ca4a4e011bdeb6e5cbc229b882ee20ad3231096a000000000000000000000000000000000000000000000000431cc2c4404ddaa8,,,1,true -927,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec340000000000000000000000000d364c5c6c803feae75db05ac248fd9dbcc88c210000000000000000000000000d364c5c6c803feae75db05ac248fd9dbcc88c21000000000000000000000000000000000000000000000000003b0aa9caaa432d00000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -929,0xcd9d4988c0ae61887b075ba77f08cbfad2b65068,0x3f87ff1de58128ef8fcb4c807efd776e1ac72e51,0xf4f7b41a000000000000000000000000d64d37bdad19aa59d9c43ff4f756f19809bfd7610000000000000000000000000000000000000000000000001bc16d674ec80000,,,1,true -932,0xcd9d4988c0ae61887b075ba77f08cbfad2b65068,0x3f87ff1de58128ef8fcb4c807efd776e1ac72e51,0xf4f7b41a000000000000000000000000cde4d4fa46fe2878c6b0530c9b9ac9ab87a380390000000000000000000000000000000000000000000000254c3a5a4cbc5a1a6a,,,1,true -934,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec340000000000000000000000000a908362a06b3dbf4496f7d4a298060aaf4307a50000000000000000000000000a908362a06b3dbf4496f7d4a298060aaf4307a50000000000000000000000000000000000000000000000000020aa7d90d1230000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -935,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec340000000000000000000000008e2be318532598d2abf8cdb463c21847bae969580000000000000000000000008e2be318532598d2abf8cdb463c21847bae9695800000000000000000000000000000000000000000000000000f8b0a10e47000000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -936,0xcd9d4988c0ae61887b075ba77f08cbfad2b65068,0x3f87ff1de58128ef8fcb4c807efd776e1ac72e51,0xf4f7b41a000000000000000000000000d7e630afcf128feb8b9071a8412914478c00c22a0000000000000000000000000000000000000000000000021a085ff4c4dc3f8f,0x292ba9349489c85415df5cc382ab5a67fd5c9683c2c18316cba1349d1688531e,2022-01-07 08:02:58.000 UTC,0,true -937,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec34000000000000000000000000c1ade89bb702737a2d5a70f50c00360e1fc1ec5c000000000000000000000000c1ade89bb702737a2d5a70f50c00360e1fc1ec5c00000000000000000000000000000000000000000000000000ed625104278f8000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -940,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec34000000000000000000000000f7a7bd2c1f3c25b0420e71b7fa85fe03728392b6000000000000000000000000f7a7bd2c1f3c25b0420e71b7fa85fe03728392b600000000000000000000000000000000000000000000000006a94d74f430000000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -942,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec34000000000000000000000000d3fb28778630b99d76e4e4a68be58b50c38792a0000000000000000000000000d3fb28778630b99d76e4e4a68be58b50c38792a00000000000000000000000000000000000000000000000000058d15e1762800000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -943,0xcd9d4988c0ae61887b075ba77f08cbfad2b65068,0x3f87ff1de58128ef8fcb4c807efd776e1ac72e51,0xf4f7b41a000000000000000000000000ed963afed4188993754c045f2f7055d19a7a9da600000000000000000000000000000000000000000000000113ad12516d81cd00,,,1,true -950,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec340000000000000000000000004b2d5adcda64f8167c723105a8bccc542766208e0000000000000000000000004b2d5adcda64f8167c723105a8bccc542766208e000000000000000000000000000000000000000000000000005ac8162691fb7600000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -953,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec3400000000000000000000000082adf06307538950bee34802c094aaf9114a338200000000000000000000000082adf06307538950bee34802c094aaf9114a33820000000000000000000000000000000000000000000000000011df27237b55ab00000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -955,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec34000000000000000000000000e4ebb04b785136d815a0799018f497dc17984f98000000000000000000000000e4ebb04b785136d815a0799018f497dc17984f98000000000000000000000000000000000000000000000000004801933a55312000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -958,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec3400000000000000000000000009e29df3900f4ea3053e183cddb965f5a5b4559b00000000000000000000000009e29df3900f4ea3053e183cddb965f5a5b4559b00000000000000000000000000000000000000000000000000397e2a6ba1cf0000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -960,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec34000000000000000000000000614cc7e2fad0a7565f10346c3b9430527abd93e3000000000000000000000000614cc7e2fad0a7565f10346c3b9430527abd93e3000000000000000000000000000000000000000000000000014d3dc45fb7edf100000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -961,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec340000000000000000000000000e87e162ca440a1bc68f3e9ff6cba6f71c14e2060000000000000000000000000e87e162ca440a1bc68f3e9ff6cba6f71c14e206000000000000000000000000000000000000000000000000003610277d29410000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -963,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec340000000000000000000000003d16451a4b73e778bfec126025ba79716a17e32d0000000000000000000000003d16451a4b73e778bfec126025ba79716a17e32d000000000000000000000000000000000000000000000000003c67b5c3f5164000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -965,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec340000000000000000000000009ff8c5a477faac59fda54b7c517d4dc1674ebe560000000000000000000000009ff8c5a477faac59fda54b7c517d4dc1674ebe560000000000000000000000000000000000000000000000000000f233819ffe0000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -966,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec3400000000000000000000000079700e477be49b579a9984bb11edaadadbe9474900000000000000000000000079700e477be49b579a9984bb11edaadadbe94749000000000000000000000000000000000000000000000000087727c4a0fd000000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -969,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec34000000000000000000000000da0e0ada73f37744803cb481b41c6d48265c06c8000000000000000000000000da0e0ada73f37744803cb481b41c6d48265c06c80000000000000000000000000000000000000000000000000001c6bf5263400000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -974,0x10e6593cdda8c58a1d0f14c5164b376352a55f2f,0x467194771dae2967aef3ecbedd3bf9a310c76c65,0xa9f9e6750000000000000000000000006b175474e89094c44da98b954eedeac495271d0f000000000000000000000000da10009cbd5d07dd0cecc66161fc93d7c9000da10000000000000000000000002526ce6014e8c17aedea915fa7470d4b780ade980000000000000000000000002526ce6014e8c17aedea915fa7470d4b780ade98000000000000000000000000000000000000000000000010af192ca5e4c4158a00000000000000000000000000000000000000000000000000000000000000c00000000000000000000000000000000000000000000000000000000000000000,,,1,true -976,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec34000000000000000000000000f567a6ca93dec3203344094cb90f035cc853a248000000000000000000000000f567a6ca93dec3203344094cb90f035cc853a2480000000000000000000000000000000000000000000000000003a12138149e4000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -987,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec340000000000000000000000004e577e9ee5f508f8e859f4ecd941797a3e1b6fa20000000000000000000000004e577e9ee5f508f8e859f4ecd941797a3e1b6fa2000000000000000000000000000000000000000000000000001f144334de77ad00000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -989,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec34000000000000000000000000038788c3718faf8e4d783ba97925417de795fe8a000000000000000000000000038788c3718faf8e4d783ba97925417de795fe8a00000000000000000000000000000000000000000000000000470de4df82000000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -996,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec340000000000000000000000006e9a88971e957abb41bae4e2677cae258f0c1e760000000000000000000000006e9a88971e957abb41bae4e2677cae258f0c1e76000000000000000000000000000000000000000000000000001bb7a56f93966400000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -997,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec34000000000000000000000000d925cbbc53f8d70a05eba2f7abf4eb35d95f5180000000000000000000000000d925cbbc53f8d70a05eba2f7abf4eb35d95f5180000000000000000000000000000000000000000000000000004b74275052fb2900000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -999,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec34000000000000000000000000f0eaf0c77c1362ad4de668755be5559eb47cfb9f000000000000000000000000f0eaf0c77c1362ad4de668755be5559eb47cfb9f000000000000000000000000000000000000000000000000002386f26fc1000000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -1000,0xcd9d4988c0ae61887b075ba77f08cbfad2b65068,0x3f87ff1de58128ef8fcb4c807efd776e1ac72e51,0xf4f7b41a0000000000000000000000004c78dfd78482e2c7321d8d14cfae862918cf8b0f00000000000000000000000000000000000000000000000094c152e23fe5b317,,,1,true -1001,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec340000000000000000000000002a17479c80de5502e5f5baef0bde186b2a251c5d0000000000000000000000002a17479c80de5502e5f5baef0bde186b2a251c5d00000000000000000000000000000000000000000000000000416d1d7776cba800000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -1005,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec34000000000000000000000000140901c4487b1ea5a23271aa3debe02a42bcb3ed000000000000000000000000140901c4487b1ea5a23271aa3debe02a42bcb3ed0000000000000000000000000000000000000000000000000042d9087150f4c000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -1006,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec34000000000000000000000000337d1e27ac8a9c7b87bb4f07d409594142575388000000000000000000000000337d1e27ac8a9c7b87bb4f07d4095941425753880000000000000000000000000000000000000000000000000032d39032695dd600000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -1008,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec340000000000000000000000008e987cbfd0b8af69c93ea544db8b8efdd4aba0de0000000000000000000000008e987cbfd0b8af69c93ea544db8b8efdd4aba0de0000000000000000000000000000000000000000000000000038b3978b55a45800000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -1012,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec3400000000000000000000000076a7df68eed6bbc1d68543b7a471d41158803e9400000000000000000000000076a7df68eed6bbc1d68543b7a471d41158803e9400000000000000000000000000000000000000000000000000053fb7b9db6b3200000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -1014,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec34000000000000000000000000461b1938a232327a07bf47e202c5f6a27306812d000000000000000000000000461b1938a232327a07bf47e202c5f6a27306812d000000000000000000000000000000000000000000000000000ad6b9d7e928e700000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -1022,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec3400000000000000000000000006d7881358cf903f2c2db94a32d5c6ae9bc611f600000000000000000000000006d7881358cf903f2c2db94a32d5c6ae9bc611f60000000000000000000000000000000000000000000000000036b0cef2e6635200000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -1023,0xcd9d4988c0ae61887b075ba77f08cbfad2b65068,0x3f87ff1de58128ef8fcb4c807efd776e1ac72e51,0xf4f7b41a0000000000000000000000008c843233f4ac89fd1f98825c3707b023f8427c280000000000000000000000000000000000000000000000000de0b6b3a7640000,,,1,true -1025,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec34000000000000000000000000c330440814443d4774ba112819392c366f1bd978000000000000000000000000c330440814443d4774ba112819392c366f1bd9780000000000000000000000000000000000000000000000000068dd95d320801000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -1027,0x10e6593cdda8c58a1d0f14c5164b376352a55f2f,0x467194771dae2967aef3ecbedd3bf9a310c76c65,0xa9f9e6750000000000000000000000006b175474e89094c44da98b954eedeac495271d0f000000000000000000000000da10009cbd5d07dd0cecc66161fc93d7c9000da1000000000000000000000000e19e26becff917f057ebb35217fdf4ab3252dffe000000000000000000000000e19e26becff917f057ebb35217fdf4ab3252dffe000000000000000000000000000000000000000000000000002386f26fc1000000000000000000000000000000000000000000000000000000000000000000c00000000000000000000000000000000000000000000000000000000000000000,,,1,true -1028,0x10e6593cdda8c58a1d0f14c5164b376352a55f2f,0x467194771dae2967aef3ecbedd3bf9a310c76c65,0xa9f9e6750000000000000000000000006b175474e89094c44da98b954eedeac495271d0f000000000000000000000000da10009cbd5d07dd0cecc66161fc93d7c9000da1000000000000000000000000c4f1080f341e9bff5c2411745bb8e22221a6a5c3000000000000000000000000c4f1080f341e9bff5c2411745bb8e22221a6a5c300000000000000000000000000000000000000000000000000470de4df82000000000000000000000000000000000000000000000000000000000000000000c00000000000000000000000000000000000000000000000000000000000000000,,,1,true -1029,0x10e6593cdda8c58a1d0f14c5164b376352a55f2f,0x467194771dae2967aef3ecbedd3bf9a310c76c65,0xa9f9e6750000000000000000000000006b175474e89094c44da98b954eedeac495271d0f000000000000000000000000da10009cbd5d07dd0cecc66161fc93d7c9000da1000000000000000000000000ba2dfc38fdf8a5f8dadf1e1c4ab4f73348bbda57000000000000000000000000ba2dfc38fdf8a5f8dadf1e1c4ab4f73348bbda57000000000000000000000000000000000000000000000000002386f26fc1000000000000000000000000000000000000000000000000000000000000000000c00000000000000000000000000000000000000000000000000000000000000000,,,1,true -1030,0x10e6593cdda8c58a1d0f14c5164b376352a55f2f,0x467194771dae2967aef3ecbedd3bf9a310c76c65,0xa9f9e6750000000000000000000000006b175474e89094c44da98b954eedeac495271d0f000000000000000000000000da10009cbd5d07dd0cecc66161fc93d7c9000da1000000000000000000000000a0a961674f7eb74da9ef4087bb262b35a5191a82000000000000000000000000a0a961674f7eb74da9ef4087bb262b35a5191a82000000000000000000000000000000000000000000000000002386f26fc1000000000000000000000000000000000000000000000000000000000000000000c00000000000000000000000000000000000000000000000000000000000000000,,,1,true -1031,0x10e6593cdda8c58a1d0f14c5164b376352a55f2f,0x467194771dae2967aef3ecbedd3bf9a310c76c65,0xa9f9e6750000000000000000000000006b175474e89094c44da98b954eedeac495271d0f000000000000000000000000da10009cbd5d07dd0cecc66161fc93d7c9000da1000000000000000000000000848640772aa8b981c520084473c31aaad491ca75000000000000000000000000848640772aa8b981c520084473c31aaad491ca75000000000000000000000000000000000000000000000000002386f26fc1000000000000000000000000000000000000000000000000000000000000000000c00000000000000000000000000000000000000000000000000000000000000000,,,1,true -1032,0x10e6593cdda8c58a1d0f14c5164b376352a55f2f,0x467194771dae2967aef3ecbedd3bf9a310c76c65,0xa9f9e6750000000000000000000000006b175474e89094c44da98b954eedeac495271d0f000000000000000000000000da10009cbd5d07dd0cecc66161fc93d7c9000da10000000000000000000000003af154c87f854c934fc2a4fe45265dbce59bd4a30000000000000000000000003af154c87f854c934fc2a4fe45265dbce59bd4a3000000000000000000000000000000000000000000000000016345785d8a000000000000000000000000000000000000000000000000000000000000000000c00000000000000000000000000000000000000000000000000000000000000000,,,1,true -1033,0x10e6593cdda8c58a1d0f14c5164b376352a55f2f,0x467194771dae2967aef3ecbedd3bf9a310c76c65,0xa9f9e6750000000000000000000000006b175474e89094c44da98b954eedeac495271d0f000000000000000000000000da10009cbd5d07dd0cecc66161fc93d7c9000da1000000000000000000000000396546635b56c60d3597e5c558490754d20bc46c000000000000000000000000396546635b56c60d3597e5c558490754d20bc46c00000000000000000000000000000000000000000000000000470de4df82000000000000000000000000000000000000000000000000000000000000000000c00000000000000000000000000000000000000000000000000000000000000000,,,1,true -1034,0x10e6593cdda8c58a1d0f14c5164b376352a55f2f,0x467194771dae2967aef3ecbedd3bf9a310c76c65,0xa9f9e6750000000000000000000000006b175474e89094c44da98b954eedeac495271d0f000000000000000000000000da10009cbd5d07dd0cecc66161fc93d7c9000da100000000000000000000000007e320d04c059aa33f7dcfe3c3add07be5a31b8900000000000000000000000007e320d04c059aa33f7dcfe3c3add07be5a31b89000000000000000000000000000000000000000000000000002386f26fc1000000000000000000000000000000000000000000000000000000000000000000c00000000000000000000000000000000000000000000000000000000000000000,,,1,true -1036,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec3400000000000000000000000072713894bd21d2dea4c8f4eb6d0237af8fd2feb200000000000000000000000072713894bd21d2dea4c8f4eb6d0237af8fd2feb2000000000000000000000000000000000000000000000000007fce083dfbf71d00000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -1043,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec34000000000000000000000000ff6e3780b0b8645b797a889feebe876c2fccd06d000000000000000000000000ff6e3780b0b8645b797a889feebe876c2fccd06d000000000000000000000000000000000000000000000000000f1186da096b0000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -1047,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec340000000000000000000000009b707a58ee408ac8334eaedfc9988deb12c98ac30000000000000000000000009b707a58ee408ac8334eaedfc9988deb12c98ac3000000000000000000000000000000000000000000000000000952e470f45afe00000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -1048,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec34000000000000000000000000b023d464f60004438fb4a31014314febfebf98e4000000000000000000000000b023d464f60004438fb4a31014314febfebf98e400000000000000000000000000000000000000000000000000358795e50ffa6f00000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -1049,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec34000000000000000000000000b43300442baec524da4546f71548d28a391c2a1a000000000000000000000000b43300442baec524da4546f71548d28a391c2a1a0000000000000000000000000000000000000000000000000097fc871921dce500000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -1050,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec3400000000000000000000000018fd93c3bb72d41662d858afffb740c8f73a214a00000000000000000000000018fd93c3bb72d41662d858afffb740c8f73a214a0000000000000000000000000000000000000000000000000046f0f4de7cadff00000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -1052,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec340000000000000000000000009efd9fc88d4b950ae11411005ffe81efcf1b96350000000000000000000000009efd9fc88d4b950ae11411005ffe81efcf1b9635000000000000000000000000000000000000000000000000007cd38292ddccac00000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -1053,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec340000000000000000000000000eaed802a117a58a5e644a670a1b2d99be459be50000000000000000000000000eaed802a117a58a5e644a670a1b2d99be459be500000000000000000000000000000000000000000000000000470de4df82000000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -1054,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec34000000000000000000000000fd8f43f82697e17c507cfdfebf75b48d8db149b3000000000000000000000000fd8f43f82697e17c507cfdfebf75b48d8db149b3000000000000000000000000000000000000000000000000005c868c3fe6c2e200000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,0xaff2309b92b6577ef9f94fcdfaa2d40f280a87386dafaf4f98b298c98a81d141,2022-11-02 12:32:11.000 UTC,0,true -1055,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec340000000000000000000000007e54ff8766bb1c0d6d978495454e7b2fb041faed0000000000000000000000007e54ff8766bb1c0d6d978495454e7b2fb041faed00000000000000000000000000000000000000000000000000305591732cdfd500000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -1058,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec340000000000000000000000002bab814da5c1618815998f3e929ed11c24d7da380000000000000000000000002bab814da5c1618815998f3e929ed11c24d7da38000000000000000000000000000000000000000000000000001465c4d1332b0000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -1063,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec34000000000000000000000000353a3b43d34247cbc3f8092187cdd849b5b31a77000000000000000000000000353a3b43d34247cbc3f8092187cdd849b5b31a7700000000000000000000000000000000000000000000000000ab59003f284d0000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -1065,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec340000000000000000000000007afbac5f8f342ca0fba2019e2bcb0e0c57021c170000000000000000000000007afbac5f8f342ca0fba2019e2bcb0e0c57021c170000000000000000000000000000000000000000000000000c7d713b49da000000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -1072,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0xa9f9e675000000000000000000000000dac17f958d2ee523a2206206994597c13d831ec700000000000000000000000094b008aa00579c1307b0ef2c499ad98a8ce58e58000000000000000000000000ee9d1d1eb00e090ff0a7f7c9a835007a623a249f000000000000000000000000ee9d1d1eb00e090ff0a7f7c9a835007a623a249f0000000000000000000000000000000000000000000000000000000002160ec000000000000000000000000000000000000000000000000000000000000000c00000000000000000000000000000000000000000000000000000000000000000,,,1,true -1074,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0xa9f9e675000000000000000000000000dac17f958d2ee523a2206206994597c13d831ec700000000000000000000000094b008aa00579c1307b0ef2c499ad98a8ce58e580000000000000000000000001c9e6a87b6ebf2f7099b04ac2fc4b6f0005688d30000000000000000000000001c9e6a87b6ebf2f7099b04ac2fc4b6f0005688d300000000000000000000000000000000000000000000000000000000004c4b4000000000000000000000000000000000000000000000000000000000000000c00000000000000000000000000000000000000000000000000000000000000000,,,1,true -1075,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0xa9f9e675000000000000000000000000dac17f958d2ee523a2206206994597c13d831ec700000000000000000000000094b008aa00579c1307b0ef2c499ad98a8ce58e580000000000000000000000000e6b811ace2fad511e2f35d702a2cd93f703b71b0000000000000000000000000e6b811ace2fad511e2f35d702a2cd93f703b71b00000000000000000000000000000000000000000000000000000000004c4b4000000000000000000000000000000000000000000000000000000000000000c00000000000000000000000000000000000000000000000000000000000000000,,,1,true -1081,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec3400000000000000000000000031c09f0616532f7a6f33d9ee4e1f45ea529481af00000000000000000000000031c09f0616532f7a6f33d9ee4e1f45ea529481af00000000000000000000000000000000000000000000000000aac7dfc7dd62a600000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -1086,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec340000000000000000000000007455898a8f461ceb5510c3f264b7290499501b5b0000000000000000000000007455898a8f461ceb5510c3f264b7290499501b5b00000000000000000000000000000000000000000000000000b1a2bc2ec5000000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -1087,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec3400000000000000000000000025fb6a2730570702f9b2b5eba96a3cbb5e5b7fc300000000000000000000000025fb6a2730570702f9b2b5eba96a3cbb5e5b7fc30000000000000000000000000000000000000000000000000018de76816d800000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -1088,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec34000000000000000000000000a7debb68f2684074ec4354b68e36c34af363fd57000000000000000000000000a7debb68f2684074ec4354b68e36c34af363fd57000000000000000000000000000000000000000000000000026ac2d90ac6917c00000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -1089,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec34000000000000000000000000fbfb506a75cb4c32e6ed7490335de139ee0f69c0000000000000000000000000fbfb506a75cb4c32e6ed7490335de139ee0f69c0000000000000000000000000000000000000000000000000008a176a7ce1acba00000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -1095,0x10e6593cdda8c58a1d0f14c5164b376352a55f2f,0x467194771dae2967aef3ecbedd3bf9a310c76c65,0xa9f9e6750000000000000000000000006b175474e89094c44da98b954eedeac495271d0f000000000000000000000000da10009cbd5d07dd0cecc66161fc93d7c9000da1000000000000000000000000d35d60b1746caec2289c892eac7351d66d63455b000000000000000000000000d35d60b1746caec2289c892eac7351d66d63455b00000000000000000000000000000000000000000000000150328c82881d9f7a00000000000000000000000000000000000000000000000000000000000000c00000000000000000000000000000000000000000000000000000000000000000,,,1,true -1096,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec34000000000000000000000000a9786da5d3abb6c404b79df28b7f402e58ef7c5b000000000000000000000000a9786da5d3abb6c404b79df28b7f402e58ef7c5b0000000000000000000000000000000000000000000000000398c13ef7a9113900000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -1097,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec34000000000000000000000000327b9dee1830f8201efa751fd96f7b1ad0b300a1000000000000000000000000327b9dee1830f8201efa751fd96f7b1ad0b300a1000000000000000000000000000000000000000000000000cbdacd745c23cceb00000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,0xc9d484c7376c5ce6e8357e9c349536f3d32229135d97337e5c3282e173fd5b98,2022-02-26 07:10:11.000 UTC,0,true -1099,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0xa9f9e6750000000000000000000000002260fac5e5542a773aa44fbcfedf7c193bc2c59900000000000000000000000068f180fcce6836688e9084f035309e29bf0a209500000000000000000000000054174d013e49a80b91ee14f819cadbf59fdaea1400000000000000000000000054174d013e49a80b91ee14f819cadbf59fdaea14000000000000000000000000000000000000000000000000000000000008cd7100000000000000000000000000000000000000000000000000000000000000c00000000000000000000000000000000000000000000000000000000000000000,,,1,true -1100,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec3400000000000000000000000092eead2ea4b7044692dfdd524008c36c03b632fd00000000000000000000000092eead2ea4b7044692dfdd524008c36c03b632fd000000000000000000000000000000000000000000000000002b42758471029400000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -1103,0x10e6593cdda8c58a1d0f14c5164b376352a55f2f,0x467194771dae2967aef3ecbedd3bf9a310c76c65,0xa9f9e6750000000000000000000000006b175474e89094c44da98b954eedeac495271d0f000000000000000000000000da10009cbd5d07dd0cecc66161fc93d7c9000da10000000000000000000000000f5aa47a543f7e083f99d4b978653ec9abb621b30000000000000000000000000f5aa47a543f7e083f99d4b978653ec9abb621b3000000000000000000000000000000000000000000000001158e460913d0000000000000000000000000000000000000000000000000000000000000000000c00000000000000000000000000000000000000000000000000000000000000000,,,1,true -1104,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec34000000000000000000000000536a32e1448cc9e8910d319d8d4639abfb13fbd9000000000000000000000000536a32e1448cc9e8910d319d8d4639abfb13fbd900000000000000000000000000000000000000000000000000591d87458a455a00000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -1105,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec34000000000000000000000000b9d8b2ee00469d536cff87ebcd96a9a17ebb1fd7000000000000000000000000b9d8b2ee00469d536cff87ebcd96a9a17ebb1fd7000000000000000000000000000000000000000000000000001d6516992cd65c00000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -1106,0x10e6593cdda8c58a1d0f14c5164b376352a55f2f,0x467194771dae2967aef3ecbedd3bf9a310c76c65,0xa9f9e6750000000000000000000000006b175474e89094c44da98b954eedeac495271d0f000000000000000000000000da10009cbd5d07dd0cecc66161fc93d7c9000da1000000000000000000000000b9d8b2ee00469d536cff87ebcd96a9a17ebb1fd7000000000000000000000000b9d8b2ee00469d536cff87ebcd96a9a17ebb1fd70000000000000000000000000000000000000000000000000de0b6b3a764000000000000000000000000000000000000000000000000000000000000000000c00000000000000000000000000000000000000000000000000000000000000000,,,1,true -1107,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec340000000000000000000000002cc8e16afefc8819fa51bd6206632d97a306f8320000000000000000000000002cc8e16afefc8819fa51bd6206632d97a306f83200000000000000000000000000000000000000000000000003537258ab134b2f00000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -1115,0xcd9d4988c0ae61887b075ba77f08cbfad2b65068,0x3f87ff1de58128ef8fcb4c807efd776e1ac72e51,0xf4f7b41a0000000000000000000000006487ab75368b2d73a0aee92399253e41bc4487a2000000000000000000000000000000000000000000000001edff8724f21d6d8c,,,1,true -1117,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec34000000000000000000000000cfdda5827ed343b94e96a8fef9186646477753ac000000000000000000000000cfdda5827ed343b94e96a8fef9186646477753ac000000000000000000000000000000000000000000000000008c2224c367840000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -1118,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec34000000000000000000000000f1cff704c6e6ce459e3e1544a9533cccbdad7b99000000000000000000000000f1cff704c6e6ce459e3e1544a9533cccbdad7b9900000000000000000000000000000000000000000000000000038d7ea4c6800000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -1119,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec340000000000000000000000000d801699678375e43d14f67453e24f17ebbaef8a0000000000000000000000000d801699678375e43d14f67453e24f17ebbaef8a00000000000000000000000000000000000000000000000000ac0779dac4ca4000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -1120,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec34000000000000000000000000e421b5c6680bb06f25e0f8dd138c96913d2c1599000000000000000000000000e421b5c6680bb06f25e0f8dd138c96913d2c1599000000000000000000000000000000000000000000000000002137cc6296179500000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -1125,0x10e6593cdda8c58a1d0f14c5164b376352a55f2f,0x467194771dae2967aef3ecbedd3bf9a310c76c65,0xa9f9e6750000000000000000000000006b175474e89094c44da98b954eedeac495271d0f000000000000000000000000da10009cbd5d07dd0cecc66161fc93d7c9000da10000000000000000000000002e8c157bd8bfede1beafc20c68981ee0053da0ca0000000000000000000000002e8c157bd8bfede1beafc20c68981ee0053da0ca000000000000000000000000000000000000000000000004a14257f7a4baaeb800000000000000000000000000000000000000000000000000000000000000c00000000000000000000000000000000000000000000000000000000000000000,,,1,true -1126,0xcd9d4988c0ae61887b075ba77f08cbfad2b65068,0x3f87ff1de58128ef8fcb4c807efd776e1ac72e51,0xf4f7b41a000000000000000000000000c297434911d5a22eef2925a63e78d211a77c31c40000000000000000000000000000000000000000000000056bc75e2d6310001d,0x43059fc4e3f0fdb2a5a047225f80b2af5063aa96226f6785ac247bea7710d950,2022-02-21 21:34:49.000 UTC,0,true -1130,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec34000000000000000000000000e4e076ec8c75afea19a8ae686104d3a819ce8bd5000000000000000000000000e4e076ec8c75afea19a8ae686104d3a819ce8bd5000000000000000000000000000000000000000000000000002386f26fc1000000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -1149,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0xa9f9e675000000000000000000000000dac17f958d2ee523a2206206994597c13d831ec700000000000000000000000094b008aa00579c1307b0ef2c499ad98a8ce58e58000000000000000000000000ee9d1d1eb00e090ff0a7f7c9a835007a623a249f000000000000000000000000ee9d1d1eb00e090ff0a7f7c9a835007a623a249f0000000000000000000000000000000000000000000000000000000000e4e1c000000000000000000000000000000000000000000000000000000000000000c00000000000000000000000000000000000000000000000000000000000000000,,,1,true -1157,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec3400000000000000000000000016613d9c9f1fec0b1e08233602d7dedf27c5c86800000000000000000000000016613d9c9f1fec0b1e08233602d7dedf27c5c868000000000000000000000000000000000000000000000000012127e9d6e2624c00000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -1159,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec340000000000000000000000000a1037e4c9599ca3b64193b3f255e3b47890caae0000000000000000000000000a1037e4c9599ca3b64193b3f255e3b47890caae00000000000000000000000000000000000000000000000000af2616bb6d400000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -1163,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec340000000000000000000000007ef9e17f94a39daedc52dd45b4354a9b49991d350000000000000000000000007ef9e17f94a39daedc52dd45b4354a9b49991d3500000000000000000000000000000000000000000000000000b9bfcc07ade21e00000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -1164,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec34000000000000000000000000264d8292fe15333f0ac54b859b5397c4d4bcbabd000000000000000000000000264d8292fe15333f0ac54b859b5397c4d4bcbabd000000000000000000000000000000000000000000000000015221e1bab1164c00000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -1166,0x10e6593cdda8c58a1d0f14c5164b376352a55f2f,0x467194771dae2967aef3ecbedd3bf9a310c76c65,0xa9f9e6750000000000000000000000006b175474e89094c44da98b954eedeac495271d0f000000000000000000000000da10009cbd5d07dd0cecc66161fc93d7c9000da10000000000000000000000009f3716cb735a5caf42998c420f77a9c8a13fd3a40000000000000000000000009f3716cb735a5caf42998c420f77a9c8a13fd3a4000000000000000000000000000000000000000000000002b5e3af16b188000000000000000000000000000000000000000000000000000000000000000000c00000000000000000000000000000000000000000000000000000000000000000,,,1,true -1169,0xcd9d4988c0ae61887b075ba77f08cbfad2b65068,0x3f87ff1de58128ef8fcb4c807efd776e1ac72e51,0xf4f7b41a000000000000000000000000dbf6045e565f0a2ad62bca011b9878c1a4d111b6000000000000000000000000000000000000000000000004e72df8d23ac74482,,,1,true -1170,0x10e6593cdda8c58a1d0f14c5164b376352a55f2f,0x467194771dae2967aef3ecbedd3bf9a310c76c65,0xa9f9e6750000000000000000000000006b175474e89094c44da98b954eedeac495271d0f000000000000000000000000da10009cbd5d07dd0cecc66161fc93d7c9000da1000000000000000000000000e8b65b125afd293cdb2b496c4035ebf63e4d56a9000000000000000000000000e8b65b125afd293cdb2b496c4035ebf63e4d56a9000000000000000000000000000000000000000000000000cde8cfe6dadc110200000000000000000000000000000000000000000000000000000000000000c00000000000000000000000000000000000000000000000000000000000000000,,,1,true -1171,0xcd9d4988c0ae61887b075ba77f08cbfad2b65068,0x3f87ff1de58128ef8fcb4c807efd776e1ac72e51,0xf4f7b41a00000000000000000000000010d823b4818f2454d57a33311eab952c87f40fa90000000000000000000000000000000000000000000000007b21c4eec19fa8d2,,,1,true -1173,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec340000000000000000000000001854bb7718e8c5216de23d2e3eb5207d6d6d1a3a0000000000000000000000001854bb7718e8c5216de23d2e3eb5207d6d6d1a3a000000000000000000000000000000000000000000000000001e1c39e39c058700000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -1174,0xcd9d4988c0ae61887b075ba77f08cbfad2b65068,0x3f87ff1de58128ef8fcb4c807efd776e1ac72e51,0xf4f7b41a000000000000000000000000c5cf11a157937d8ead1c0c3782b52f820f9bf880000000000000000000000000000000000000000000000003df1c2e53242c4ee8,,,1,true -1175,0xcd9d4988c0ae61887b075ba77f08cbfad2b65068,0x3f87ff1de58128ef8fcb4c807efd776e1ac72e51,0xf4f7b41a000000000000000000000000ac87fbbf35e5504bee8daec50bef75d43ce20d920000000000000000000000000000000000000000000000004687a54cf7eba7b0,,,1,true -1176,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec340000000000000000000000005989ed76aa0ffc2d6b554d3867ae503e1e83f9800000000000000000000000005989ed76aa0ffc2d6b554d3867ae503e1e83f980000000000000000000000000000000000000000000000000007618a9245c66e400000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,0x63878412d8bdc9a60b7a7f18aa5d1873578115ee55fd11e60f677f15fb87b899,2022-04-17 07:30:44.000 UTC,0,true -1178,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec340000000000000000000000003374af09950ad2f02524f2edec52ecd62846c5080000000000000000000000003374af09950ad2f02524f2edec52ecd62846c508000000000000000000000000000000000000000000000000006a94d74f43000000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -1179,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec340000000000000000000000002127575c191bd304072ee2325c007758243f6c2c0000000000000000000000002127575c191bd304072ee2325c007758243f6c2c000000000000000000000000000000000000000000000000004e48214fce08dc00000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -1183,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec34000000000000000000000000bb72b4fd0e3de5e2794cbf55745102a047aeeb75000000000000000000000000bb72b4fd0e3de5e2794cbf55745102a047aeeb7500000000000000000000000000000000000000000000000001388521ac47684600000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -1184,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec340000000000000000000000002585d2b16bda2dbd183f2c3f0da9d38917b0a32a0000000000000000000000002585d2b16bda2dbd183f2c3f0da9d38917b0a32a000000000000000000000000000000000000000000000000004e1b760415c38500000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -1185,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec340000000000000000000000000d4cc652125ec9fd6db625f78f2a8bd9c3ba65db0000000000000000000000000d4cc652125ec9fd6db625f78f2a8bd9c3ba65db0000000000000000000000000000000000000000000000000afcb78257a172d700000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -1186,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec340000000000000000000000005285a30ecdc23188a46c0b0d9b16aa7c9490a0610000000000000000000000005285a30ecdc23188a46c0b0d9b16aa7c9490a0610000000000000000000000000000000000000000000000000080c5f981ab9bce00000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -1192,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec34000000000000000000000000bed68d4550c1cb3e57eb350031a38323545add92000000000000000000000000bed68d4550c1cb3e57eb350031a38323545add92000000000000000000000000000000000000000000000000007c186d5b74baad00000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -1193,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0xa9f9e675000000000000000000000000dac17f958d2ee523a2206206994597c13d831ec700000000000000000000000094b008aa00579c1307b0ef2c499ad98a8ce58e580000000000000000000000002f7b9f2f5f00dd2293b159b6e580a01e8da7acb10000000000000000000000002f7b9f2f5f00dd2293b159b6e580a01e8da7acb1000000000000000000000000000000000000000000000000000000001dcd650000000000000000000000000000000000000000000000000000000000000000c00000000000000000000000000000000000000000000000000000000000000000,,,1,true -1197,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0xa9f9e675000000000000000000000000dac17f958d2ee523a2206206994597c13d831ec700000000000000000000000094b008aa00579c1307b0ef2c499ad98a8ce58e58000000000000000000000000d7b1d6a7f71a9658a41b6d918ac89d8ff849d9f0000000000000000000000000d7b1d6a7f71a9658a41b6d918ac89d8ff849d9f00000000000000000000000000000000000000000000000000000000006756d0500000000000000000000000000000000000000000000000000000000000000c00000000000000000000000000000000000000000000000000000000000000000,,,1,true -1198,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0xa9f9e675000000000000000000000000dac17f958d2ee523a2206206994597c13d831ec700000000000000000000000094b008aa00579c1307b0ef2c499ad98a8ce58e5800000000000000000000000061fd58a054249e2f2360bdf2b84751c453c5415c00000000000000000000000061fd58a054249e2f2360bdf2b84751c453c5415c0000000000000000000000000000000000000000000000000000000010c96f0d00000000000000000000000000000000000000000000000000000000000000c00000000000000000000000000000000000000000000000000000000000000000,,,1,true -1199,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec3400000000000000000000000061fd58a054249e2f2360bdf2b84751c453c5415c00000000000000000000000061fd58a054249e2f2360bdf2b84751c453c5415c00000000000000000000000000000000000000000000000000301819e71d72f000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -1200,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0xa9f9e675000000000000000000000000dac17f958d2ee523a2206206994597c13d831ec700000000000000000000000094b008aa00579c1307b0ef2c499ad98a8ce58e58000000000000000000000000c6a45502408c9387442a2c7311fadb9fcfe3894c000000000000000000000000c6a45502408c9387442a2c7311fadb9fcfe3894c000000000000000000000000000000000000000000000000000000000fcff4c500000000000000000000000000000000000000000000000000000000000000c00000000000000000000000000000000000000000000000000000000000000000,,,1,true -1201,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec34000000000000000000000000c6a45502408c9387442a2c7311fadb9fcfe3894c000000000000000000000000c6a45502408c9387442a2c7311fadb9fcfe3894c000000000000000000000000000000000000000000000000002c89cbf199b81400000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -1202,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0xa9f9e675000000000000000000000000dac17f958d2ee523a2206206994597c13d831ec700000000000000000000000094b008aa00579c1307b0ef2c499ad98a8ce58e580000000000000000000000000a92380b1ca69ac47d1ea14af62d85a54461c7770000000000000000000000000a92380b1ca69ac47d1ea14af62d85a54461c7770000000000000000000000000000000000000000000000000000000006eaf84f00000000000000000000000000000000000000000000000000000000000000c00000000000000000000000000000000000000000000000000000000000000000,,,1,true -1203,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec340000000000000000000000000a92380b1ca69ac47d1ea14af62d85a54461c7770000000000000000000000000a92380b1ca69ac47d1ea14af62d85a54461c7770000000000000000000000000000000000000000000000000012754918ea8e4b00000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -1204,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec340000000000000000000000000d6d92fc686d58b39a0e340364f7d2c476042d210000000000000000000000000d6d92fc686d58b39a0e340364f7d2c476042d21000000000000000000000000000000000000000000000000000e1825bac0c00000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -1205,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0xa9f9e675000000000000000000000000dac17f958d2ee523a2206206994597c13d831ec700000000000000000000000094b008aa00579c1307b0ef2c499ad98a8ce58e580000000000000000000000003b9288ba5dcc2051b1cd243bbaeddec8149ec50c0000000000000000000000003b9288ba5dcc2051b1cd243bbaeddec8149ec50c000000000000000000000000000000000000000000000000000000000661167000000000000000000000000000000000000000000000000000000000000000c00000000000000000000000000000000000000000000000000000000000000000,,,1,true -1206,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec340000000000000000000000003b9288ba5dcc2051b1cd243bbaeddec8149ec50c0000000000000000000000003b9288ba5dcc2051b1cd243bbaeddec8149ec50c000000000000000000000000000000000000000000000000000d3b583ed1457000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -1208,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0xa9f9e675000000000000000000000000dac17f958d2ee523a2206206994597c13d831ec700000000000000000000000094b008aa00579c1307b0ef2c499ad98a8ce58e58000000000000000000000000e12e1354ce5b1b9f34fbdfb9a1d5c202ba772a8b000000000000000000000000e12e1354ce5b1b9f34fbdfb9a1d5c202ba772a8b000000000000000000000000000000000000000000000000000000001d2dcfbc00000000000000000000000000000000000000000000000000000000000000c00000000000000000000000000000000000000000000000000000000000000000,,,1,true -1209,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0xa9f9e675000000000000000000000000dac17f958d2ee523a2206206994597c13d831ec700000000000000000000000094b008aa00579c1307b0ef2c499ad98a8ce58e58000000000000000000000000b9e28d206a8b83d49adc829cf9436967e2271cbb000000000000000000000000b9e28d206a8b83d49adc829cf9436967e2271cbb00000000000000000000000000000000000000000000000000000000257a9b9000000000000000000000000000000000000000000000000000000000000000c00000000000000000000000000000000000000000000000000000000000000000,,,1,true -1211,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec34000000000000000000000000b4fb4c2c91735cae6c2f4460351fbc2cf7fefeeb000000000000000000000000b4fb4c2c91735cae6c2f4460351fbc2cf7fefeeb00000000000000000000000000000000000000000000000000131459b9a8e14000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -1213,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec3400000000000000000000000032fbefd8c98f4c0e5a32065d738311a40753cf6800000000000000000000000032fbefd8c98f4c0e5a32065d738311a40753cf680000000000000000000000000000000000000000000000000031bced02db000000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -1215,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec34000000000000000000000000520fa873d99b54d9b2b81858d5a875105bdc89ce000000000000000000000000520fa873d99b54d9b2b81858d5a875105bdc89ce0000000000000000000000000000000000000000000000000b90ffea65f5212e00000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -1219,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec34000000000000000000000000f9b40f964ffd09289eb5673802424662bc810d48000000000000000000000000f9b40f964ffd09289eb5673802424662bc810d480000000000000000000000000000000000000000000000005f5cab4e3629e00900000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,0x60fa219d00468668aea56eb572d0662ea1c315f27a199151706318a644549697,2021-11-26 05:15:37.000 UTC,0,true -1222,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec34000000000000000000000000a2ef0d026b5723bdeb4dc65c1e9e9847b4c8df36000000000000000000000000a2ef0d026b5723bdeb4dc65c1e9e9847b4c8df360000000000000000000000000000000000000000000000000044d552eb89410000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -1232,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec34000000000000000000000000ee20f85dd3f826700a6a42af4873a04af8ac6d75000000000000000000000000ee20f85dd3f826700a6a42af4873a04af8ac6d75000000000000000000000000000000000000000000000000013ef9cf04b74c1900000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -1233,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec340000000000000000000000007d7f583e20351d0c6d1012411522f7f1191233500000000000000000000000007d7f583e20351d0c6d1012411522f7f119123350000000000000000000000000000000000000000000000000001f8dc842d1030000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -1239,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0xa9f9e675000000000000000000000000dac17f958d2ee523a2206206994597c13d831ec700000000000000000000000094b008aa00579c1307b0ef2c499ad98a8ce58e5800000000000000000000000000afe81bbbbf6ef34080e6e7431933ca61760c0300000000000000000000000000afe81bbbbf6ef34080e6e7431933ca61760c0300000000000000000000000000000000000000000000000000000000808840c500000000000000000000000000000000000000000000000000000000000000c00000000000000000000000000000000000000000000000000000000000000000,,,1,true -1240,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec340000000000000000000000004673d1246248976ce891a39baf2b18fb54bad3f00000000000000000000000004673d1246248976ce891a39baf2b18fb54bad3f000000000000000000000000000000000000000000000000000002d79883d200000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -1244,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec340000000000000000000000007fbd935c9972b6a4c0b6f7c6f650996677bf6e0a0000000000000000000000007fbd935c9972b6a4c0b6f7c6f650996677bf6e0a00000000000000000000000000000000000000000000000000470de4df82000000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -1245,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec34000000000000000000000000681f284c82eb81054d6696acea2020fdc68f7ca3000000000000000000000000681f284c82eb81054d6696acea2020fdc68f7ca3000000000000000000000000000000000000000000000000000d46de5bad330000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -1247,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec340000000000000000000000001ec9dd67af275fa69b6ecf7e4c3c4c0968a28fa80000000000000000000000001ec9dd67af275fa69b6ecf7e4c3c4c0968a28fa800000000000000000000000000000000000000000000000000292105c3ffa10000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -1248,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec340000000000000000000000002178be208cd14257c3ff58a164a25fe510f14f9a0000000000000000000000002178be208cd14257c3ff58a164a25fe510f14f9a0000000000000000000000000000000000000000000000000096f5388ad3d8d900000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,0x59c6a1dc4b43c8a3a58854e88fead24b1c242705ea4b640c72a796d4a0c8e4e8,2022-04-28 09:29:56.000 UTC,0,true -1251,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec3400000000000000000000000023af55034fe477c99c8eaa9586e6a21042bd39f000000000000000000000000023af55034fe477c99c8eaa9586e6a21042bd39f0000000000000000000000000000000000000000000000000011cf9cc0d600c9000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -1252,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec34000000000000000000000000c18e70163dfdb13e4057f67fbd1f4ad9c231653b000000000000000000000000c18e70163dfdb13e4057f67fbd1f4ad9c231653b00000000000000000000000000000000000000000000000001f61d86f432866000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -1253,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec34000000000000000000000000cc6f6e3d3948def0199f111b3a272555b0b18641000000000000000000000000cc6f6e3d3948def0199f111b3a272555b0b18641000000000000000000000000000000000000000000000000005166584f96c80000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -1261,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec340000000000000000000000009241f27daffd0bb1df4f2a022584dd6c77843e640000000000000000000000009241f27daffd0bb1df4f2a022584dd6c77843e64000000000000000000000000000000000000000000000000013fbe85edc9000000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -1268,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec3400000000000000000000000072872adaea835f855d6303c130c7531208a7664200000000000000000000000072872adaea835f855d6303c130c7531208a76642000000000000000000000000000000000000000000000000004036246a43f55f00000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -1272,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec3400000000000000000000000086c3d2697e675bb069a8c2d549f774cf73dcb04700000000000000000000000086c3d2697e675bb069a8c2d549f774cf73dcb04700000000000000000000000000000000000000000000000000201eef731c6a0000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -1274,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec34000000000000000000000000e891f3072ea7c072e063f04ae78feed357256adc000000000000000000000000e891f3072ea7c072e063f04ae78feed357256adc00000000000000000000000000000000000000000000000000305fc5c17163dc00000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -1275,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec34000000000000000000000000e843e87405219c50590da9f1c2e373b1ffc46cd2000000000000000000000000e843e87405219c50590da9f1c2e373b1ffc46cd2000000000000000000000000000000000000000000000000018785e89a3168ff00000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -1276,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec340000000000000000000000009da6e45e26a972cb86528abaeed47d010991d5650000000000000000000000009da6e45e26a972cb86528abaeed47d010991d565000000000000000000000000000000000000000000000000015947453f72902b00000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -1277,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec34000000000000000000000000bd7b2c3e167a1ffbda56917e13f0802affc326d5000000000000000000000000bd7b2c3e167a1ffbda56917e13f0802affc326d500000000000000000000000000000000000000000000000000237d2a77824f0000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -1280,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec340000000000000000000000007774a41c4dc14702c443140015f6aefc5989ff7f0000000000000000000000007774a41c4dc14702c443140015f6aefc5989ff7f0000000000000000000000000000000000000000000000000066ba2a33075c0000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,0x2205674f3dab6aa7a87e02575d31492aa2f849164a56b0ec2213ed1726a1c3ab,2022-08-24 21:54:45.000 UTC,0,true -1281,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec340000000000000000000000008e02e1dd6585b294b029640a929cfb11fd945f3d0000000000000000000000008e02e1dd6585b294b029640a929cfb11fd945f3d000000000000000000000000000000000000000000000000002393510ea1ed0000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -1282,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec3400000000000000000000000084c0430f3564520dcde45c3dfd7ceb79372e4fa300000000000000000000000084c0430f3564520dcde45c3dfd7ceb79372e4fa30000000000000000000000000000000000000000000000000026c7429d125c0000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -1286,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec340000000000000000000000003ffe50d1f402276e73e581fb275f623c7e215f970000000000000000000000003ffe50d1f402276e73e581fb275f623c7e215f970000000000000000000000000000000000000000000000000023c12eb4de590000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -1287,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec34000000000000000000000000f2a46bd8bf27c5c1d0531dc6a61ccf6810c70127000000000000000000000000f2a46bd8bf27c5c1d0531dc6a61ccf6810c701270000000000000000000000000000000000000000000000000023eb6c86985b0000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -1290,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec34000000000000000000000000aa26c9b0e44ae0a6eb5a7019ef35defbac52f40b000000000000000000000000aa26c9b0e44ae0a6eb5a7019ef35defbac52f40b00000000000000000000000000000000000000000000000000248fea46a6330000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -1291,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec34000000000000000000000000bc05c664843bb1840e7bce0590ccdd7ce4145369000000000000000000000000bc05c664843bb1840e7bce0590ccdd7ce414536900000000000000000000000000000000000000000000000000f8b0a10e47000000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -1292,0xcd9d4988c0ae61887b075ba77f08cbfad2b65068,0x3f87ff1de58128ef8fcb4c807efd776e1ac72e51,0xf4f7b41a0000000000000000000000009bac86db92e864e455a9ed08fac10c540b5fca4f0000000000000000000000000000000000000000000000033306863a53bee088,,,1,true -1293,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec340000000000000000000000009f032d8bbc918f7535256ab4fc6d8042f4f69f860000000000000000000000009f032d8bbc918f7535256ab4fc6d8042f4f69f8600000000000000000000000000000000000000000000000000231cf5a42f470000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -1294,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec3400000000000000000000000001066f6f80fd2717594959a6cf5b24c4e2a348f800000000000000000000000001066f6f80fd2717594959a6cf5b24c4e2a348f8000000000000000000000000000000000000000000000000002509ce3d245b0000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -1297,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec34000000000000000000000000205319257fc9772c0add32950fac182a74dbeb3c000000000000000000000000205319257fc9772c0add32950fac182a74dbeb3c0000000000000000000000000000000000000000000000000022ff08ee5c260000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -1298,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec340000000000000000000000007ca099a0636d7e9d1d347616ac822ff675e6e1e70000000000000000000000007ca099a0636d7e9d1d347616ac822ff675e6e1e7000000000000000000000000000000000000000000000000003ce662eae5882200000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -1300,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec34000000000000000000000000a79da05566ea8ffd181c45efd6f484616f6eadef000000000000000000000000a79da05566ea8ffd181c45efd6f484616f6eadef00000000000000000000000000000000000000000000000001cac0897fecfa8600000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -1301,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec34000000000000000000000000f6cd700ecb0d37cd7cf6eaddd6b60a8ce44942c9000000000000000000000000f6cd700ecb0d37cd7cf6eaddd6b60a8ce44942c90000000000000000000000000000000000000000000000000018e8d8a3ef3a8000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -1302,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec340000000000000000000000007fbd935c9972b6a4c0b6f7c6f650996677bf6e0a0000000000000000000000007fbd935c9972b6a4c0b6f7c6f650996677bf6e0a00000000000000000000000000000000000000000000000000a4b14591901e7000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -1303,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec340000000000000000000000005592e2e200ea9435c840d53fcc60ab5f78574fc90000000000000000000000005592e2e200ea9435c840d53fcc60ab5f78574fc900000000000000000000000000000000000000000000000000c55b3a2dea3bf800000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -1304,0xcd9d4988c0ae61887b075ba77f08cbfad2b65068,0x3f87ff1de58128ef8fcb4c807efd776e1ac72e51,0xf4f7b41a0000000000000000000000006c15f3f8dd7418effc9090d54285f8e2af4d94a700000000000000000000000000000000000000000000000043f04042833e4ca4,,,1,true -1305,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec3400000000000000000000000042ce658f25e182772cfe8b905f0971ef513f839100000000000000000000000042ce658f25e182772cfe8b905f0971ef513f839100000000000000000000000000000000000000000000000002b036e8e2deec8d00000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -1308,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0xa9f9e675000000000000000000000000dac17f958d2ee523a2206206994597c13d831ec700000000000000000000000094b008aa00579c1307b0ef2c499ad98a8ce58e58000000000000000000000000b17237ee9553b7b07c0622cc436d97694cbbb53a000000000000000000000000b17237ee9553b7b07c0622cc436d97694cbbb53a0000000000000000000000000000000000000000000000000000000009c699c800000000000000000000000000000000000000000000000000000000000000c00000000000000000000000000000000000000000000000000000000000000000,,,1,true -1311,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec34000000000000000000000000f4d9c88c924079422e5ad77ee64b967ce4efd828000000000000000000000000f4d9c88c924079422e5ad77ee64b967ce4efd82800000000000000000000000000000000000000000000000000587ed569c7637e00000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -1318,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec340000000000000000000000002d19f32620f647d08fa8b9a0fa5206fae15c0ed50000000000000000000000002d19f32620f647d08fa8b9a0fa5206fae15c0ed50000000000000000000000000000000000000000000000000093d286135fd7fb00000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -1319,0xcd9d4988c0ae61887b075ba77f08cbfad2b65068,0x3f87ff1de58128ef8fcb4c807efd776e1ac72e51,0xf4f7b41a000000000000000000000000dda42f12b8b2ccc6717c053a2b772bad24b08cbd00000000000000000000000000000000000000000000000029a2241af62c0000,,,1,true -1321,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec34000000000000000000000000bac79de245633fcc4fb32c19bc0ac93f406c9950000000000000000000000000bac79de245633fcc4fb32c19bc0ac93f406c99500000000000000000000000000000000000000000000000000011c37937e0800000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -1325,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec3400000000000000000000000011f3196443bfe5ad50513386e1c3826cbbd2d72f00000000000000000000000011f3196443bfe5ad50513386e1c3826cbbd2d72f00000000000000000000000000000000000000000000000000b8d560d0f4b8bd00000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -1326,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec34000000000000000000000000aa7ca3edcba0ebaf2eee83835881fb37710cfc87000000000000000000000000aa7ca3edcba0ebaf2eee83835881fb37710cfc8700000000000000000000000000000000000000000000000000b85e9e3992f5aa00000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -1327,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec34000000000000000000000000109bf98fabb56460bd1584e9410cf70982a80446000000000000000000000000109bf98fabb56460bd1584e9410cf70982a8044600000000000000000000000000000000000000000000000000b90497a830651700000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -1328,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec340000000000000000000000006ef540025be3d2c9932c4dcf7b9f45bf60dcb8a50000000000000000000000006ef540025be3d2c9932c4dcf7b9f45bf60dcb8a500000000000000000000000000000000000000000000000000b99942f9a1abee00000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -1329,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec340000000000000000000000003a1271284ba4a1c01ed016128738005131314b4a0000000000000000000000003a1271284ba4a1c01ed016128738005131314b4a000000000000000000000000000000000000000000000000002d381090ecae9000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -1330,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec3400000000000000000000000023cfbc88ebb82e730fcd1c35225d19da1958d80500000000000000000000000023cfbc88ebb82e730fcd1c35225d19da1958d80500000000000000000000000000000000000000000000000000b9ef7a2ded708200000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -1331,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec340000000000000000000000008752df4018957d0ad6a769a37fadd75a6a744b430000000000000000000000008752df4018957d0ad6a769a37fadd75a6a744b4300000000000000000000000000000000000000000000000000b2f2fad44fbcab00000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -1333,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec3400000000000000000000000034ebbe40cc5fa34140e8b3627d6743116ee2f3c800000000000000000000000034ebbe40cc5fa34140e8b3627d6743116ee2f3c800000000000000000000000000000000000000000000000000aecb5217508d9500000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -1334,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec34000000000000000000000000c94f16940c0fb741c938e247602b130fbed1ee24000000000000000000000000c94f16940c0fb741c938e247602b130fbed1ee2400000000000000000000000000000000000000000000000000ae4b51f08e869b00000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -1335,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec34000000000000000000000000fefd123d721c9a1e712b342dc7f0317760dfb8ab000000000000000000000000fefd123d721c9a1e712b342dc7f0317760dfb8ab00000000000000000000000000000000000000000000000000adba174d8a277500000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -1336,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec3400000000000000000000000064c263f0ff10b2cc940a7fad3f8b524792f39e0100000000000000000000000064c263f0ff10b2cc940a7fad3f8b524792f39e0100000000000000000000000000000000000000000000000000aee9f75b4d76c700000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -1339,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec3400000000000000000000000098098214ad5b1b08cc9d94e32f056e9a0de1811000000000000000000000000098098214ad5b1b08cc9d94e32f056e9a0de18110000000000000000000000000000000000000000000000000005a20720d1a580c00000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -1341,0x10e6593cdda8c58a1d0f14c5164b376352a55f2f,0x467194771dae2967aef3ecbedd3bf9a310c76c65,0xa9f9e6750000000000000000000000006b175474e89094c44da98b954eedeac495271d0f000000000000000000000000da10009cbd5d07dd0cecc66161fc93d7c9000da1000000000000000000000000ad3532392b4a3d427f3af5c7dd3b3dd882f74439000000000000000000000000ad3532392b4a3d427f3af5c7dd3b3dd882f744390000000000000000000000000000000000000000000000003782dace9d90000000000000000000000000000000000000000000000000000000000000000000c00000000000000000000000000000000000000000000000000000000000000000,,,1,true -1344,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec34000000000000000000000000cfbe0b8d935d6b65856c2f0eb39689abc0312e45000000000000000000000000cfbe0b8d935d6b65856c2f0eb39689abc0312e45000000000000000000000000000000000000000000000000000c67a263bf47ef00000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -1345,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec34000000000000000000000000ddfba3aad19d3f466472b5ea8a5b0f77e59b4fc6000000000000000000000000ddfba3aad19d3f466472b5ea8a5b0f77e59b4fc6000000000000000000000000000000000000000000000000003d7e90b2e50e9900000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -1346,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec34000000000000000000000000fccd02660f1dfb2ce9d0f12e113da9a7aae8c071000000000000000000000000fccd02660f1dfb2ce9d0f12e113da9a7aae8c071000000000000000000000000000000000000000000000000015bc8bb5ee4fc6000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -1348,0x10e6593cdda8c58a1d0f14c5164b376352a55f2f,0x467194771dae2967aef3ecbedd3bf9a310c76c65,0xa9f9e6750000000000000000000000006b175474e89094c44da98b954eedeac495271d0f000000000000000000000000da10009cbd5d07dd0cecc66161fc93d7c9000da1000000000000000000000000ba63faeb8ccd03776b3118f4dab186c03aa05121000000000000000000000000ba63faeb8ccd03776b3118f4dab186c03aa051210000000000000000000000000000000000000000000000003782dace9d90000000000000000000000000000000000000000000000000000000000000000000c00000000000000000000000000000000000000000000000000000000000000000,,,1,true -1349,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec34000000000000000000000000c4676e5e99b823e54b3e6c32c8143bb441633eea000000000000000000000000c4676e5e99b823e54b3e6c32c8143bb441633eea000000000000000000000000000000000000000000000000001b60a02488d03a00000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -1351,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec34000000000000000000000000be53bedb9c0989c56fc1f3da448783886283d22b000000000000000000000000be53bedb9c0989c56fc1f3da448783886283d22b000000000000000000000000000000000000000000000000001836e549dfab7500000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -1356,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec3400000000000000000000000032730120eeeb23d0e1bd4e16cc7c5247906382e000000000000000000000000032730120eeeb23d0e1bd4e16cc7c5247906382e0000000000000000000000000000000000000000000000000007a3ff2645cc48400000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -1357,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec34000000000000000000000000fbfb506a75cb4c32e6ed7490335de139ee0f69c0000000000000000000000000fbfb506a75cb4c32e6ed7490335de139ee0f69c000000000000000000000000000000000000000000000000000b33994503a2ab600000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -1358,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec34000000000000000000000000c388750a661cc0b99784bab2c55e1f38ff91643b000000000000000000000000c388750a661cc0b99784bab2c55e1f38ff91643b00000000000000000000000000000000000000000000000000470de4df82000000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -1360,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec34000000000000000000000000dadc03cd1b8b08b1bf60d3ef62bbe7f38ebeb216000000000000000000000000dadc03cd1b8b08b1bf60d3ef62bbe7f38ebeb216000000000000000000000000000000000000000000000000004c8d4405a4f87f00000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -1366,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec34000000000000000000000000257e746c20c91c84c06ca539675ff2981b35e35d000000000000000000000000257e746c20c91c84c06ca539675ff2981b35e35d000000000000000000000000000000000000000000000000002b0890e8c866b100000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,0xcddbef2353c0d633879b9da8fdfdce83ef160a08864a9f60ed200315fc0581da,2022-05-28 14:53:49.000 UTC,0,true -1372,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec340000000000000000000000004fa20d37e4dfbf3e8b22831f53ba028b753573950000000000000000000000004fa20d37e4dfbf3e8b22831f53ba028b7535739500000000000000000000000000000000000000000000000000a29fb3d5950e4500000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -1373,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec34000000000000000000000000989d21bd4ab37e523f7347a2cc54ef824b2f23eb000000000000000000000000989d21bd4ab37e523f7347a2cc54ef824b2f23eb00000000000000000000000000000000000000000000000000a35d5697c301f500000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -1374,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec340000000000000000000000001bdfe729e88070da6ae6b7bb9e85ce3c5fe204c30000000000000000000000001bdfe729e88070da6ae6b7bb9e85ce3c5fe204c300000000000000000000000000000000000000000000000000a1c9871d844ccf00000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -1375,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec34000000000000000000000000cb019359cd737d13d6391a18443b8b8a847f120b000000000000000000000000cb019359cd737d13d6391a18443b8b8a847f120b00000000000000000000000000000000000000000000000000a1b6c6a421e0f400000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -1376,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec340000000000000000000000003f8cd600c59dfd1f60b4a9472805e5e6e074155d0000000000000000000000003f8cd600c59dfd1f60b4a9472805e5e6e074155d00000000000000000000000000000000000000000000000000a195cab4cdacdc00000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -1377,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec3400000000000000000000000024f2716cf24cc67f04b893049de5f3ef134c40d800000000000000000000000024f2716cf24cc67f04b893049de5f3ef134c40d800000000000000000000000000000000000000000000000000a157f9d3c8d58000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -1378,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec340000000000000000000000004290f59947ea594e396ae1147fb3c4b029209bda0000000000000000000000004290f59947ea594e396ae1147fb3c4b029209bda00000000000000000000000000000000000000000000000000a01ffe00551d7e00000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -1380,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec340000000000000000000000008fe922789c0bd45e837e2becf103a1b456b52a260000000000000000000000008fe922789c0bd45e837e2becf103a1b456b52a26000000000000000000000000000000000000000000000000009d58108f2dd84f00000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -1381,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec340000000000000000000000008f32844357f27d8c185255832b914dd7e3ecfb9a0000000000000000000000008f32844357f27d8c185255832b914dd7e3ecfb9a000000000000000000000000000000000000000000000000009bf5556607f1ec00000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -1382,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec34000000000000000000000000bd52c13827f012797005f57e4db3b8db155580f2000000000000000000000000bd52c13827f012797005f57e4db3b8db155580f2000000000000000000000000000000000000000000000000009cfe2281354f1400000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -1383,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec3400000000000000000000000056c9656662fad432973e8743e1f6d2a79df61a3500000000000000000000000056c9656662fad432973e8743e1f6d2a79df61a35000000000000000000000000000000000000000000000000002e4e5c43094c6600000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -1384,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec340000000000000000000000007fc914aeba65ae085469f9830070f0ef731b43d00000000000000000000000007fc914aeba65ae085469f9830070f0ef731b43d0000000000000000000000000000000000000000000000000003ca40d113c15f300000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -1389,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec34000000000000000000000000a03fcdd101ce5b7ac2e072df832866f918c572ff000000000000000000000000a03fcdd101ce5b7ac2e072df832866f918c572ff000000000000000000000000000000000000000000000000002a2c43ad31ca8000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -1394,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0xa9f9e675000000000000000000000000dac17f958d2ee523a2206206994597c13d831ec700000000000000000000000094b008aa00579c1307b0ef2c499ad98a8ce58e580000000000000000000000007e2e5d94f11f358345a4ee14c4f1a8521315c03b0000000000000000000000007e2e5d94f11f358345a4ee14c4f1a8521315c03b0000000000000000000000000000000000000000000000000000000003831e1200000000000000000000000000000000000000000000000000000000000000c00000000000000000000000000000000000000000000000000000000000000000,0xbfbddc67d3be7a066fece984550e230e093b3e2c3cf382933224c0def974889f,2022-07-03 01:24:31.000 UTC,0,true -1395,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec340000000000000000000000007e2e5d94f11f358345a4ee14c4f1a8521315c03b0000000000000000000000007e2e5d94f11f358345a4ee14c4f1a8521315c03b0000000000000000000000000000000000000000000000000000339234aa9be200000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,0xd8c53105ff2eae627eae60dce8aa62cb0452b5aeb72a47d6f005d9ccf1188258,2022-07-03 00:19:21.000 UTC,0,true -1396,0x10e6593cdda8c58a1d0f14c5164b376352a55f2f,0x467194771dae2967aef3ecbedd3bf9a310c76c65,0xa9f9e6750000000000000000000000006b175474e89094c44da98b954eedeac495271d0f000000000000000000000000da10009cbd5d07dd0cecc66161fc93d7c9000da100000000000000000000000001162e3d2c6771b3eca319d054e554ffacf5549000000000000000000000000001162e3d2c6771b3eca319d054e554ffacf55490000000000000000000000000000000000000000000000000cbd9f6b17c75e59300000000000000000000000000000000000000000000000000000000000000c00000000000000000000000000000000000000000000000000000000000000000,,,1,true -1397,0x10e6593cdda8c58a1d0f14c5164b376352a55f2f,0x467194771dae2967aef3ecbedd3bf9a310c76c65,0xa9f9e6750000000000000000000000006b175474e89094c44da98b954eedeac495271d0f000000000000000000000000da10009cbd5d07dd0cecc66161fc93d7c9000da100000000000000000000000001162e3d2c6771b3eca319d054e554ffacf5549000000000000000000000000001162e3d2c6771b3eca319d054e554ffacf5549000000000000000000000000000000000000000000000000b80313c52f0bab66600000000000000000000000000000000000000000000000000000000000000c00000000000000000000000000000000000000000000000000000000000000000,,,1,true -1398,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec340000000000000000000000006f3c06b4c50b17b4ceaa9d609356ebd57963d0110000000000000000000000006f3c06b4c50b17b4ceaa9d609356ebd57963d01100000000000000000000000000000000000000000000000000a6f2d46fcbbb6000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -1399,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec340000000000000000000000007d9e6cd0e64a4e989499b1b4995570eec94519260000000000000000000000007d9e6cd0e64a4e989499b1b4995570eec945192600000000000000000000000000000000000000000000000000a5594a6814449c00000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -1400,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec34000000000000000000000000ff6097d4c652481f1a1e3f25f7a5edc9f5d5625b000000000000000000000000ff6097d4c652481f1a1e3f25f7a5edc9f5d5625b00000000000000000000000000000000000000000000000000a35ee2cc6ed62700000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -1401,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec3400000000000000000000000013d77053696d78eb23e64e503787163df9967b5a00000000000000000000000013d77053696d78eb23e64e503787163df9967b5a00000000000000000000000000000000000000000000000000a3d8d41242c90c00000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -1402,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec34000000000000000000000000e6e068e68ee243b856b57098310ce0f8b2e57e12000000000000000000000000e6e068e68ee243b856b57098310ce0f8b2e57e1200000000000000000000000000000000000000000000000000a26dc3fa3b373000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -1403,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec3400000000000000000000000092f7dfb5bfa167674441da031657417a0aaf3d8b00000000000000000000000092f7dfb5bfa167674441da031657417a0aaf3d8b00000000000000000000000000000000000000000000000000a2abe30e92503600000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -1404,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec34000000000000000000000000e47a137646c4499d9ca0c592224608f2f0d36cbe000000000000000000000000e47a137646c4499d9ca0c592224608f2f0d36cbe00000000000000000000000000000000000000000000000000a3b3836be701c100000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -1405,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec3400000000000000000000000001162e3d2c6771b3eca319d054e554ffacf5549000000000000000000000000001162e3d2c6771b3eca319d054e554ffacf554900000000000000000000000000000000000000000000000000078cad1e25d000000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -1406,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec34000000000000000000000000f567a6ca93dec3203344094cb90f035cc853a248000000000000000000000000f567a6ca93dec3203344094cb90f035cc853a2480000000000000000000000000000000000000000000000000011c37937e0800000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -1407,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec34000000000000000000000000af7b3c54e066c54e4bfc08762678fd1bc2ade9b4000000000000000000000000af7b3c54e066c54e4bfc08762678fd1bc2ade9b400000000000000000000000000000000000000000000000000a21751a301fe0400000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -1408,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec3400000000000000000000000004b6c1d2c9ea868e8e37c035e1c7fcadd475d26000000000000000000000000004b6c1d2c9ea868e8e37c035e1c7fcadd475d26000000000000000000000000000000000000000000000000000a2cb95d6f78f6700000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -1409,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec34000000000000000000000000032dda2351fd5d613db8dba322ef7a5e4fa08c83000000000000000000000000032dda2351fd5d613db8dba322ef7a5e4fa08c8300000000000000000000000000000000000000000000000000a263954eed155a00000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -1410,0xcd9d4988c0ae61887b075ba77f08cbfad2b65068,0x3f87ff1de58128ef8fcb4c807efd776e1ac72e51,0xf4f7b41a000000000000000000000000c877fcc358da9eb76f53aeebfbbdb6eefa0b313d00000000000000000000000000000000000000000000000e962d83195749bb35,0x64d2a01996b640311514acbd698e0870a5b9adc9ce3040338c0c521d0224439e,2021-11-23 09:17:37.000 UTC,0,true -1411,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec34000000000000000000000000125a2c1f7f2de8e47625c83e5eb012ab9ee9d113000000000000000000000000125a2c1f7f2de8e47625c83e5eb012ab9ee9d1130000000000000000000000000000000000000000000000000155e4498bb3208700000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,0x2181b9f7cc9c66e84f8811c0d94fda83a1a78459d49863d45748701d501273c9,2022-07-19 19:02:36.000 UTC,0,true -1414,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec3400000000000000000000000077109daf4c36b0af7975f539d22528b92f82ecae00000000000000000000000077109daf4c36b0af7975f539d22528b92f82ecae000000000000000000000000000000000000000000000000002ff3041cae3b0000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -1418,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec34000000000000000000000000706e8a1de4f372df952e26f01b6b7611b917bd2d000000000000000000000000706e8a1de4f372df952e26f01b6b7611b917bd2d0000000000000000000000000000000000000000000000000024f12ac0b6ff0900000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -1421,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec3400000000000000000000000082683f46c69e068f244d86103317b37ebbf9377900000000000000000000000082683f46c69e068f244d86103317b37ebbf937790000000000000000000000000000000000000000000000000010dbe79ee47c7000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -1422,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec340000000000000000000000006a62a664974939513f165703e76ab8e16ac8eb170000000000000000000000006a62a664974939513f165703e76ab8e16ac8eb170000000000000000000000000000000000000000000000000078e3288e5dfd0000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -1427,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec3400000000000000000000000025b99f078903f7702d3f44b1f8a4fe88bc5d103600000000000000000000000025b99f078903f7702d3f44b1f8a4fe88bc5d1036000000000000000000000000000000000000000000000000000ffcb9e57d400000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -1430,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec34000000000000000000000000d4a3fbd2434c9c1e846a039be62050a08b9fe783000000000000000000000000d4a3fbd2434c9c1e846a039be62050a08b9fe78300000000000000000000000000000000000000000000000002d30a217f0bd7a800000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -1431,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec34000000000000000000000000fff2bcc4313a064d8655b6911bc2db2b9e1c9c98000000000000000000000000fff2bcc4313a064d8655b6911bc2db2b9e1c9c980000000000000000000000000000000000000000000000000003d12e9b292e0000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -1436,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec3400000000000000000000000025f500fc10b0ce86cbe34b2290dc476742a8e0b900000000000000000000000025f500fc10b0ce86cbe34b2290dc476742a8e0b9000000000000000000000000000000000000000000000000004007ea86d6b90000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -1441,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec3400000000000000000000000089768ca7e116d7971519af950dbbdf6e80b9ded100000000000000000000000089768ca7e116d7971519af950dbbdf6e80b9ded1000000000000000000000000000000000000000000000000030d98d59a96000000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -1451,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec34000000000000000000000000d12301bcb812dbb016fbfa0faec1c1cb71ddc05f000000000000000000000000d12301bcb812dbb016fbfa0faec1c1cb71ddc05f00000000000000000000000000000000000000000000000000a5d8df81d7a1a700000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -1452,0x10e6593cdda8c58a1d0f14c5164b376352a55f2f,0x467194771dae2967aef3ecbedd3bf9a310c76c65,0xa9f9e6750000000000000000000000006b175474e89094c44da98b954eedeac495271d0f000000000000000000000000da10009cbd5d07dd0cecc66161fc93d7c9000da1000000000000000000000000517905ce3f8193c46421b2f03312986efbd8874e000000000000000000000000517905ce3f8193c46421b2f03312986efbd8874e000000000000000000000000000000000000000000000000112865cc2351ee7a00000000000000000000000000000000000000000000000000000000000000c00000000000000000000000000000000000000000000000000000000000000000,,,1,true -1453,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec340000000000000000000000001bad367c336522f7a47e18d51c1287bd55c681120000000000000000000000001bad367c336522f7a47e18d51c1287bd55c6811200000000000000000000000000000000000000000000000000a5088d5fc63e0f00000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -1454,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec34000000000000000000000000ece2b12273e6d56d54f2034f71fe8db1805bc394000000000000000000000000ece2b12273e6d56d54f2034f71fe8db1805bc39400000000000000000000000000000000000000000000000000a5b2f7188b274f00000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -1455,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec340000000000000000000000006ef7ec56d7d633a2c82af24f15a24182930310510000000000000000000000006ef7ec56d7d633a2c82af24f15a241829303105100000000000000000000000000000000000000000000000000a31ba5d9b31daa00000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -1456,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec340000000000000000000000000113be48e08958c98a066a9d21f0e0c6e9f4ce120000000000000000000000000113be48e08958c98a066a9d21f0e0c6e9f4ce1200000000000000000000000000000000000000000000000000a597e0b0b8bb6700000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -1457,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec34000000000000000000000000701f52342947c3bd1f20464b8d40e0c6333bc1a0000000000000000000000000701f52342947c3bd1f20464b8d40e0c6333bc1a000000000000000000000000000000000000000000000000000a5c695375318f300000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -1458,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec34000000000000000000000000946d691877f1775bf7e86ffbdabbb571ed8cfc3c000000000000000000000000946d691877f1775bf7e86ffbdabbb571ed8cfc3c00000000000000000000000000000000000000000000000000a7408840091e5500000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -1459,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec34000000000000000000000000e993f9f9f90205753dd99c85429b302770a7ea78000000000000000000000000e993f9f9f90205753dd99c85429b302770a7ea7800000000000000000000000000000000000000000000000000a5c6af5b5ba35500000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -1460,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec34000000000000000000000000da8cc3a462f7086a929f7cb985e9b937807cc165000000000000000000000000da8cc3a462f7086a929f7cb985e9b937807cc16500000000000000000000000000000000000000000000000000a517ce8c76281700000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -1461,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec34000000000000000000000000b327885341a84bb07a4c9d620e3c345e1b384349000000000000000000000000b327885341a84bb07a4c9d620e3c345e1b38434900000000000000000000000000000000000000000000000000a2cb67bda4c7cf00000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -1462,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec340000000000000000000000008969af66165d93f6124899f5af946635e1645d470000000000000000000000008969af66165d93f6124899f5af946635e1645d4700000000000000000000000000000000000000000000000000a2e77eb04f5f9a00000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -1463,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec34000000000000000000000000eacb7edd74f53c4f8c7445cd55381e4b096fec10000000000000000000000000eacb7edd74f53c4f8c7445cd55381e4b096fec1000000000000000000000000000000000000000000000000000a31ba81d47e3bb00000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -1464,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec34000000000000000000000000da1c5760fc4c48b3eae7c28b3cb53b3a8271035a000000000000000000000000da1c5760fc4c48b3eae7c28b3cb53b3a8271035a00000000000000000000000000000000000000000000000000a3c26a35dab4da00000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -1465,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec3400000000000000000000000087694c0a265346e6a3bfab4f1ae6b14eda7849c900000000000000000000000087694c0a265346e6a3bfab4f1ae6b14eda7849c900000000000000000000000000000000000000000000000000a1bfad5a02737d00000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -1466,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec3400000000000000000000000065e8d46a51ce9b5e83a72409c4257b2971f4217700000000000000000000000065e8d46a51ce9b5e83a72409c4257b2971f4217700000000000000000000000000000000000000000000000000a30aad6803ed6e00000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -1467,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec34000000000000000000000000a5e581cb20e40bdb884e6647c96ecb2a51b13cbe000000000000000000000000a5e581cb20e40bdb884e6647c96ecb2a51b13cbe00000000000000000000000000000000000000000000000000a5ee0e93a9ca5700000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -1468,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec340000000000000000000000005ef3077374ce35b8c937eb22d1c85a71a2f79aeb0000000000000000000000005ef3077374ce35b8c937eb22d1c85a71a2f79aeb00000000000000000000000000000000000000000000000000a53791a384c4e700000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -1469,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec34000000000000000000000000deea5b37603f88936f9ab2a932a4521b1e331c8a000000000000000000000000deea5b37603f88936f9ab2a932a4521b1e331c8a00000000000000000000000000000000000000000000000000a51a942d68312c00000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -1470,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec34000000000000000000000000ea3a5cb144b9922ada2a0148124a522cc3c00fa1000000000000000000000000ea3a5cb144b9922ada2a0148124a522cc3c00fa100000000000000000000000000000000000000000000000000a46a02456edf8e00000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -1471,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec340000000000000000000000000225d2b448852d9d582bdc262d1a37bf823650080000000000000000000000000225d2b448852d9d582bdc262d1a37bf8236500800000000000000000000000000000000000000000000000000a3de4a49757fde00000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -1476,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0xa9f9e675000000000000000000000000dac17f958d2ee523a2206206994597c13d831ec700000000000000000000000094b008aa00579c1307b0ef2c499ad98a8ce58e58000000000000000000000000748010fbe056562ef466901f1d38ce481f11b539000000000000000000000000748010fbe056562ef466901f1d38ce481f11b539000000000000000000000000000000000000000000000000000000001125d3b200000000000000000000000000000000000000000000000000000000000000c00000000000000000000000000000000000000000000000000000000000000000,,,1,true -1479,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec34000000000000000000000000b6ef13a56e52cf128d0881a4fcf1105754d7682e000000000000000000000000b6ef13a56e52cf128d0881a4fcf1105754d7682e000000000000000000000000000000000000000000000000005cc7a3362ea0e400000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -1481,0xcd9d4988c0ae61887b075ba77f08cbfad2b65068,0x3f87ff1de58128ef8fcb4c807efd776e1ac72e51,0xf4f7b41a00000000000000000000000002df99be208467d5b050d333244cdac0a998338e0000000000000000000000000000000000000000000000004563918244f40000,,,1,true -1485,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec34000000000000000000000000bf17fe365b6a160b48d8b2ba76f8a55becf4c7c1000000000000000000000000bf17fe365b6a160b48d8b2ba76f8a55becf4c7c100000000000000000000000000000000000000000000000000fcdc390dc0c13200000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -1487,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec340000000000000000000000002e84c2e90afec8491f94dd477bd11657cefc76900000000000000000000000002e84c2e90afec8491f94dd477bd11657cefc769000000000000000000000000000000000000000000000000000470de4df82000000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -1492,0x10e6593cdda8c58a1d0f14c5164b376352a55f2f,0x467194771dae2967aef3ecbedd3bf9a310c76c65,0xa9f9e6750000000000000000000000006b175474e89094c44da98b954eedeac495271d0f000000000000000000000000da10009cbd5d07dd0cecc66161fc93d7c9000da1000000000000000000000000818aa87368876d6864e64aa256cc6a2a43b54207000000000000000000000000818aa87368876d6864e64aa256cc6a2a43b542070000000000000000000000000000000000000000000000034214be8f108edb1a00000000000000000000000000000000000000000000000000000000000000c00000000000000000000000000000000000000000000000000000000000000000,,,1,true -1499,0xcd9d4988c0ae61887b075ba77f08cbfad2b65068,0x3f87ff1de58128ef8fcb4c807efd776e1ac72e51,0xf4f7b41a000000000000000000000000a5372ec86fa34436299a95d3c10f0d721cdd018a00000000000000000000000000000000000000000000000214df071e9d692338,,,1,true -1501,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec34000000000000000000000000aa08a02f79951f410edf661b0f23202e9681e4c8000000000000000000000000aa08a02f79951f410edf661b0f23202e9681e4c8000000000000000000000000000000000000000000000000001acff920bde8d300000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -1502,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec34000000000000000000000000e66bb5ef7359906b46d2a99b10fbefb643526fa3000000000000000000000000e66bb5ef7359906b46d2a99b10fbefb643526fa3000000000000000000000000000000000000000000000000029f79a3e8e804c000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -1504,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec3400000000000000000000000090a7b41610a25f7bf538bd27dc6e0434bd38933200000000000000000000000090a7b41610a25f7bf538bd27dc6e0434bd38933200000000000000000000000000000000000000000000000000109581ed03f62200000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -1505,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0xa9f9e675000000000000000000000000dac17f958d2ee523a2206206994597c13d831ec700000000000000000000000094b008aa00579c1307b0ef2c499ad98a8ce58e5800000000000000000000000090a7b41610a25f7bf538bd27dc6e0434bd38933200000000000000000000000090a7b41610a25f7bf538bd27dc6e0434bd38933200000000000000000000000000000000000000000000000000000000023161ee00000000000000000000000000000000000000000000000000000000000000c00000000000000000000000000000000000000000000000000000000000000000,,,1,true -1508,0xcd9d4988c0ae61887b075ba77f08cbfad2b65068,0x3f87ff1de58128ef8fcb4c807efd776e1ac72e51,0xf4f7b41a0000000000000000000000003bd59ed16c462b4464091830dab828dce079076f000000000000000000000000000000000000000000000000316a92244d1ca800,0x0c89331ede9019a096912f6686d40b5bc109782815dbb9ccc93199b577f5998c,2021-11-25 23:30:38.000 UTC,0,true -1509,0xcd9d4988c0ae61887b075ba77f08cbfad2b65068,0x3f87ff1de58128ef8fcb4c807efd776e1ac72e51,0xf4f7b41a0000000000000000000000009e63e63554469e0c98450c58e1472fdde65c07ec0000000000000000000000000000000000000000000000003782dace9d900000,,,1,true -1510,0xcd9d4988c0ae61887b075ba77f08cbfad2b65068,0x3f87ff1de58128ef8fcb4c807efd776e1ac72e51,0xf4f7b41a000000000000000000000000b9afc24c66d04f773c97d733e4c058a0784fd88a0000000000000000000000000000000000000000000000002725ef1d20bf9400,,,1,true -1511,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec340000000000000000000000007113457d2eb745bfaf2edcb586bc25658d637b7a0000000000000000000000007113457d2eb745bfaf2edcb586bc25658d637b7a0000000000000000000000000000000000000000000000000022764ad44f2a2400000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -1519,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec3400000000000000000000000061d04270a849004364795f5f3fde33a2068383fb00000000000000000000000061d04270a849004364795f5f3fde33a2068383fb00000000000000000000000000000000000000000000000000214880fac9e20000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -1525,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec34000000000000000000000000c3320b4b93a482924a299334c5cb6c0fd7ca0fd3000000000000000000000000c3320b4b93a482924a299334c5cb6c0fd7ca0fd3000000000000000000000000000000000000000000000000014c55bb915e969b00000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -1526,0x10e6593cdda8c58a1d0f14c5164b376352a55f2f,0x467194771dae2967aef3ecbedd3bf9a310c76c65,0xa9f9e6750000000000000000000000006b175474e89094c44da98b954eedeac495271d0f000000000000000000000000da10009cbd5d07dd0cecc66161fc93d7c9000da1000000000000000000000000ac0b447d5d976b1ec7d8a885c937e0efcc7edbe0000000000000000000000000ac0b447d5d976b1ec7d8a885c937e0efcc7edbe000000000000000000000000000000000000000000000000053c376bd45e001c700000000000000000000000000000000000000000000000000000000000000c00000000000000000000000000000000000000000000000000000000000000000,0x187a81c216dae186bad5bb5a505ac8c0a2418655808fb05f811907f539966a7b,2022-07-10 05:14:15.000 UTC,0,true -1528,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec340000000000000000000000008edb42bed2a8f10188096e2f90336e853deaac030000000000000000000000008edb42bed2a8f10188096e2f90336e853deaac03000000000000000000000000000000000000000000000000002386f26fc1000000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -1532,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec34000000000000000000000000d2e5d220874222ca63e45c419cc226c5f35e47bb000000000000000000000000d2e5d220874222ca63e45c419cc226c5f35e47bb000000000000000000000000000000000000000000000000002386f26fc1000000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -1533,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec34000000000000000000000000d0ebdfceee6e8fd3e9be7032c671ecbd2d229032000000000000000000000000d0ebdfceee6e8fd3e9be7032c671ecbd2d229032000000000000000000000000000000000000000000000000002386f26fc1000000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -1535,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec340000000000000000000000002aaa03a8293053bd4b7fa1740ac94d935c66ee840000000000000000000000002aaa03a8293053bd4b7fa1740ac94d935c66ee8400000000000000000000000000000000000000000000000001550db544c8362b00000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -1537,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0xa9f9e675000000000000000000000000dac17f958d2ee523a2206206994597c13d831ec700000000000000000000000094b008aa00579c1307b0ef2c499ad98a8ce58e580000000000000000000000000ef1ed3d10ce1c766291c7cf9153e1076a4220c20000000000000000000000000ef1ed3d10ce1c766291c7cf9153e1076a4220c20000000000000000000000000000000000000000000000000000000000f0f97000000000000000000000000000000000000000000000000000000000000000c00000000000000000000000000000000000000000000000000000000000000000,,,1,true -1539,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec340000000000000000000000009d842bbf50af49dd35291737a139852b7bc48dce0000000000000000000000009d842bbf50af49dd35291737a139852b7bc48dce0000000000000000000000000000000000000000000000000018de76816d800000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -1542,0xcd9d4988c0ae61887b075ba77f08cbfad2b65068,0x3f87ff1de58128ef8fcb4c807efd776e1ac72e51,0xf4f7b41a0000000000000000000000000d7c96322a62573b509ee0b1266e7aa713662c1300000000000000000000000000000000000000000000003683daaee596dcfdb4,,,1,true -1548,0xcd9d4988c0ae61887b075ba77f08cbfad2b65068,0x3f87ff1de58128ef8fcb4c807efd776e1ac72e51,0xf4f7b41a0000000000000000000000006719dc6c087ec40261bf08ac1286fa4ceeb6c92500000000000000000000000000000000000000000000000367d3c36a5d62d210,,,1,true -1549,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec340000000000000000000000001fe6a806e0a9858359e16c58e4f84c790171596b0000000000000000000000001fe6a806e0a9858359e16c58e4f84c790171596b00000000000000000000000000000000000000000000000000ed380acce0bf5800000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -1550,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec3400000000000000000000000033e580cee928d83a61b98905a1f9be68ea6279b800000000000000000000000033e580cee928d83a61b98905a1f9be68ea6279b800000000000000000000000000000000000000000000000003d6260ef6d43f3500000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -1551,0xcd9d4988c0ae61887b075ba77f08cbfad2b65068,0x3f87ff1de58128ef8fcb4c807efd776e1ac72e51,0xf4f7b41a000000000000000000000000b3d381c886f47bd2c091ae7c785229aaf140b0e900000000000000000000000000000000000000000000000f742888823a4f73d0,0x4eaa1f74b5612b0dbf69e36a42e7c34f672541ef8d2f55fff126d6d7984ebb23,2022-04-10 12:27:58.000 UTC,0,true -1554,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec3400000000000000000000000095b683dce50361469742e5184be34a7c6c02b78b00000000000000000000000095b683dce50361469742e5184be34a7c6c02b78b000000000000000000000000000000000000000000000000031fb736e764cce000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -1555,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec34000000000000000000000000c1c675dad880d1887c20b101e9a8fb604e6ad4eb000000000000000000000000c1c675dad880d1887c20b101e9a8fb604e6ad4eb000000000000000000000000000000000000000000000000005cbb9a209baeae00000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -1556,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec340000000000000000000000006ab525dd1016e88f68ca3832c943dbbfd577806e0000000000000000000000006ab525dd1016e88f68ca3832c943dbbfd577806e00000000000000000000000000000000000000000000000000005af3107a400000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -1595,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec34000000000000000000000000df10b1d95073a395b4ac15aba63edca8c0bcfea2000000000000000000000000df10b1d95073a395b4ac15aba63edca8c0bcfea200000000000000000000000000000000000000000000000000406b2a9cb110c500000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -1678,0x10e6593cdda8c58a1d0f14c5164b376352a55f2f,0x467194771dae2967aef3ecbedd3bf9a310c76c65,0xa9f9e6750000000000000000000000006b175474e89094c44da98b954eedeac495271d0f000000000000000000000000da10009cbd5d07dd0cecc66161fc93d7c9000da1000000000000000000000000c688cc5298ce97cf5b82a88229f3a40e3bf25530000000000000000000000000c688cc5298ce97cf5b82a88229f3a40e3bf255300000000000000000000000000000000000000000000000011dbe1f2dd930b4e200000000000000000000000000000000000000000000000000000000000000c00000000000000000000000000000000000000000000000000000000000000000,,,1,true -1681,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec34000000000000000000000000b41167f0729aa2b8adb237474a134659e8f279e7000000000000000000000000b41167f0729aa2b8adb237474a134659e8f279e700000000000000000000000000000000000000000000000000aae1ff661e8dc000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -1684,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec3400000000000000000000000012d8bfd7284b36e77501e842a3222b5f8f30bf2f00000000000000000000000012d8bfd7284b36e77501e842a3222b5f8f30bf2f00000000000000000000000000000000000000000000000000008f9f8c8ac68500000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -1685,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec34000000000000000000000000421cc7b6224accb6c12280e3b697c65d9d60ad70000000000000000000000000421cc7b6224accb6c12280e3b697c65d9d60ad7000000000000000000000000000000000000000000000000000437e2b560d000000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -1688,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec3400000000000000000000000085ea4171aec13c433b87a303f9c6dda1da4c619b00000000000000000000000085ea4171aec13c433b87a303f9c6dda1da4c619b000000000000000000000000000000000000000000000000006da44d320b725c00000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -1704,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec34000000000000000000000000acaec28670ff7ca851d4d802b123ac7c6dac25e3000000000000000000000000acaec28670ff7ca851d4d802b123ac7c6dac25e300000000000000000000000000000000000000000000000000089d8c5db7e3c000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -1705,0xcd9d4988c0ae61887b075ba77f08cbfad2b65068,0x3f87ff1de58128ef8fcb4c807efd776e1ac72e51,0xf4f7b41a00000000000000000000000052eebd82826a7b530839424ceab6ca3643eb0ef100000000000000000000000000000000000000000000000a5805f66b648d7777,,,1,true -1706,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec3400000000000000000000000089768ca7e116d7971519af950dbbdf6e80b9ded100000000000000000000000089768ca7e116d7971519af950dbbdf6e80b9ded100000000000000000000000000000000000000000000000000e3c5ab9623177000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -1707,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec34000000000000000000000000163f875efda73c07f2035f21d532c57131afa09d000000000000000000000000163f875efda73c07f2035f21d532c57131afa09d00000000000000000000000000000000000000000000000000ec2c4aae16cef300000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -1708,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec340000000000000000000000009e6640ac10ddf31aeb3a88d7853496c0955388a30000000000000000000000009e6640ac10ddf31aeb3a88d7853496c0955388a300000000000000000000000000000000000000000000000000f1f1a3671aefae00000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -1710,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec340000000000000000000000001dd7c29dba3cfc8cd64220f7331e214a791a59890000000000000000000000001dd7c29dba3cfc8cd64220f7331e214a791a598900000000000000000000000000000000000000000000000001e76082dbe1ae5700000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -1711,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec340000000000000000000000007819bffd6a93a941f9c9c68bb6eda17766fbe6090000000000000000000000007819bffd6a93a941f9c9c68bb6eda17766fbe60900000000000000000000000000000000000000000000000000faa9790caf06c500000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -1712,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec34000000000000000000000000c9bb68e9735de702cbf517aa6c2fb6a36a13b0ce000000000000000000000000c9bb68e9735de702cbf517aa6c2fb6a36a13b0ce0000000000000000000000000000000000000000000000000081eff3be3833cd00000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -1713,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec340000000000000000000000004f7b076d0fcc7641eb968b4bf9983a830699d92a0000000000000000000000004f7b076d0fcc7641eb968b4bf9983a830699d92a00000000000000000000000000000000000000000000000000f556aecaa6d3cd00000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -1714,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec34000000000000000000000000d6b070f15d10a39f429f25d10bbef42265b94dd1000000000000000000000000d6b070f15d10a39f429f25d10bbef42265b94dd1000000000000000000000000000000000000000000000000007d27de7f56687500000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -1715,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec34000000000000000000000000f71479d0e613ca73523e4f5d2051bd5c0003636d000000000000000000000000f71479d0e613ca73523e4f5d2051bd5c0003636d00000000000000000000000000000000000000000000000000f989b60b2663ea00000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -1716,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec340000000000000000000000006889f4dde0a2bc0830b49352d42e3a8707187daa0000000000000000000000006889f4dde0a2bc0830b49352d42e3a8707187daa0000000000000000000000000000000000000000000000000038c123fdd37d4300000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -1717,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec34000000000000000000000000ce65009e934732446c5d80aec4bb48d1c6f18984000000000000000000000000ce65009e934732446c5d80aec4bb48d1c6f189840000000000000000000000000000000000000000000000000494654067e1000000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -1718,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec34000000000000000000000000be31e3a92b3d0c2d9370663c7e1ff749322fa92f000000000000000000000000be31e3a92b3d0c2d9370663c7e1ff749322fa92f00000000000000000000000000000000000000000000000000564fef3460a1d100000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -1719,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec34000000000000000000000000c4053c76dc251c22ec6d676835ac0b1c63ff11d9000000000000000000000000c4053c76dc251c22ec6d676835ac0b1c63ff11d900000000000000000000000000000000000000000000000001476c424a747f1900000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -1729,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec3400000000000000000000000078d79b027e11b21e13a1887fde77347790b8bca600000000000000000000000078d79b027e11b21e13a1887fde77347790b8bca600000000000000000000000000000000000000000000000000da99c000531a4600000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -1733,0xcd9d4988c0ae61887b075ba77f08cbfad2b65068,0x3f87ff1de58128ef8fcb4c807efd776e1ac72e51,0xf4f7b41a0000000000000000000000004717c3df812351699483ce9ff8fc3ad191fa38f20000000000000000000000000000000000000000000000000de0b6b3a7640000,,,1,true -1734,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec340000000000000000000000003054f483ea0746c497c44bf4ab2468f133ee41900000000000000000000000003054f483ea0746c497c44bf4ab2468f133ee4190000000000000000000000000000000000000000000000000013fbe85edc9000000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -1741,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec34000000000000000000000000955d917e1fabf943bc670f87dfb75ce2fd44aee8000000000000000000000000955d917e1fabf943bc670f87dfb75ce2fd44aee80000000000000000000000000000000000000000000000000050cd3701bf847f00000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -1746,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec34000000000000000000000000cab55b0de19c01cdd284535a3fe8d73a657525bb000000000000000000000000cab55b0de19c01cdd284535a3fe8d73a657525bb000000000000000000000000000000000000000000000000008e1bc9bf04000000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -1747,0xcd9d4988c0ae61887b075ba77f08cbfad2b65068,0x3f87ff1de58128ef8fcb4c807efd776e1ac72e51,0xf4f7b41a000000000000000000000000bd7fbaf67cf30b5b95f646823dd0bc096e646b080000000000000000000000000000000000000000000000006dac8818ccca3a8d,,,1,true -1751,0xcd9d4988c0ae61887b075ba77f08cbfad2b65068,0x3f87ff1de58128ef8fcb4c807efd776e1ac72e51,0xf4f7b41a000000000000000000000000e699e8334d901986d9ff6bc5ae4b44ae5122f1ee0000000000000000000000000000000000000000000000007b0d1be7bfd9a806,0x6267f54b841217b6675df3ccd2d3f008649b4eae982f1f81cb736b377ade75db,2021-12-10 09:38:20.000 UTC,0,true -1755,0xcd9d4988c0ae61887b075ba77f08cbfad2b65068,0x3f87ff1de58128ef8fcb4c807efd776e1ac72e51,0xf4f7b41a00000000000000000000000058f4e544ed6a80af689b3d006659157b6ec4e0e300000000000000000000000000000000000000000000000036eeb4e0c66dc000,,,1,true -1756,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec340000000000000000000000002613052b58e51177fbcb5c6665c460dad5c593310000000000000000000000002613052b58e51177fbcb5c6665c460dad5c5933100000000000000000000000000000000000000000000000000354a6ba7a1800000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,0xa4974fabe8b6a9e44cfc718c8e37e89b4115d0092011669cbbab4e8c406b9e9b,2022-03-10 22:21:34.000 UTC,0,true -1764,0xcd9d4988c0ae61887b075ba77f08cbfad2b65068,0x3f87ff1de58128ef8fcb4c807efd776e1ac72e51,0xf4f7b41a0000000000000000000000007c614c9da4a195f209ef9e63e5c6f5801db86fab0000000000000000000000000000000000000000000000013c1ccb01b62c326c,,,1,true -1765,0x10e6593cdda8c58a1d0f14c5164b376352a55f2f,0x467194771dae2967aef3ecbedd3bf9a310c76c65,0xa9f9e6750000000000000000000000006b175474e89094c44da98b954eedeac495271d0f000000000000000000000000da10009cbd5d07dd0cecc66161fc93d7c9000da1000000000000000000000000e22ded5d8cb6c74bedca991c0f67925a38c5a6d2000000000000000000000000e22ded5d8cb6c74bedca991c0f67925a38c5a6d2000000000000000000000000000000000000000000000015b966eec8ec1f632900000000000000000000000000000000000000000000000000000000000000c00000000000000000000000000000000000000000000000000000000000000000,,,1,true -1766,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec34000000000000000000000000cd0ced634b49b8dc2032dae30e7125439ca7b909000000000000000000000000cd0ced634b49b8dc2032dae30e7125439ca7b909000000000000000000000000000000000000000000000000034e9d576016c51100000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -1772,0xcd9d4988c0ae61887b075ba77f08cbfad2b65068,0x3f87ff1de58128ef8fcb4c807efd776e1ac72e51,0xf4f7b41a00000000000000000000000025b1b0849a9653dcf70bf459c30763d5b7930706000000000000000000000000000000000000000000000000c110d83b2bffaa49,,,1,true -1777,0xcd9d4988c0ae61887b075ba77f08cbfad2b65068,0x3f87ff1de58128ef8fcb4c807efd776e1ac72e51,0xf4f7b41a0000000000000000000000007c614c9da4a195f209ef9e63e5c6f5801db86fab000000000000000000000000000000000000000000000004979851ad093e06ac,,,1,true -1778,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec340000000000000000000000006a8e8cd60e86262b7d9cc5d08f3ec2f172f856830000000000000000000000006a8e8cd60e86262b7d9cc5d08f3ec2f172f856830000000000000000000000000000000000000000000000000003585d62261e0000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -1781,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec34000000000000000000000000f17f232fb241c7cb6d200c0a7b2f77bb4268c280000000000000000000000000f17f232fb241c7cb6d200c0a7b2f77bb4268c280000000000000000000000000000000000000000000000000019cebd0b3d67f4900000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -1784,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec34000000000000000000000000cf99bf53caa598d312ee72055e42c8bcf35d24e8000000000000000000000000cf99bf53caa598d312ee72055e42c8bcf35d24e8000000000000000000000000000000000000000000000000002386f26fc1000000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -1787,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec34000000000000000000000000bcacaa2951eb0d03b788d355f1226701b7ee475e000000000000000000000000bcacaa2951eb0d03b788d355f1226701b7ee475e000000000000000000000000000000000000000000000000010a741a4627800000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -1792,0xcd9d4988c0ae61887b075ba77f08cbfad2b65068,0x3f87ff1de58128ef8fcb4c807efd776e1ac72e51,0xf4f7b41a0000000000000000000000008db02f4db3d165630ab4181994be509e8eaf7f8200000000000000000000000000000000000000000000000ca0a17e135d851158,0xad6f01c8434823d354f10726cda60bcac980f278322d38a8fee6e1f4e009d4da,2021-11-27 19:59:45.000 UTC,0,true -1794,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec340000000000000000000000005f4ef5c539a56291665fcca4e6b7a6446ad11cc10000000000000000000000005f4ef5c539a56291665fcca4e6b7a6446ad11cc10000000000000000000000000000000000000000000000000069290b0d5a000000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -1799,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec34000000000000000000000000db45e0edd323939129792c15278b1204bd29ddd6000000000000000000000000db45e0edd323939129792c15278b1204bd29ddd6000000000000000000000000000000000000000000000000005250aeeb45690000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -1807,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec34000000000000000000000000ee5c256721abe58af6f582c0efd6774dd2765038000000000000000000000000ee5c256721abe58af6f582c0efd6774dd276503800000000000000000000000000000000000000000000000001352e852f89511e00000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -1809,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec340000000000000000000000006ec15a5690361c73b9b60369ab1fa06c559496150000000000000000000000006ec15a5690361c73b9b60369ab1fa06c559496150000000000000000000000000000000000000000000000000078bec232ffe2df00000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -1812,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec340000000000000000000000006a81c50289f16a7e556385d6bab17707e2ea23c50000000000000000000000006a81c50289f16a7e556385d6bab17707e2ea23c5000000000000000000000000000000000000000000000000005f7e5b739ac1cf00000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -1814,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec34000000000000000000000000ccb23a9bbae99909b1102549f9a96c2b137a60ec000000000000000000000000ccb23a9bbae99909b1102549f9a96c2b137a60ec000000000000000000000000000000000000000000000000001dcf653460938000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -1816,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec34000000000000000000000000d8c9bdfbb887a44bf45692f6d4d0576412f8b577000000000000000000000000d8c9bdfbb887a44bf45692f6d4d0576412f8b5770000000000000000000000000000000000000000000000000373d7d3e85d290000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -1817,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec34000000000000000000000000e7394f05f97257958361329a3fd4f879773c0469000000000000000000000000e7394f05f97257958361329a3fd4f879773c04690000000000000000000000000000000000000000000000000050cd433f02912100000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -1818,0xcd9d4988c0ae61887b075ba77f08cbfad2b65068,0x3f87ff1de58128ef8fcb4c807efd776e1ac72e51,0xf4f7b41a00000000000000000000000060da990aebdd785f50ea3202ff05bff1d0963dbe00000000000000000000000000000000000000000000000081cba1d16e377a7d,,,1,true -1819,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec34000000000000000000000000c03b767ccc25b31a76cc50fa3c84cb859ef30f97000000000000000000000000c03b767ccc25b31a76cc50fa3c84cb859ef30f9700000000000000000000000000000000000000000000000000109a260574dcde00000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -1823,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec340000000000000000000000006f16c2bb24b4e844bd9fb9141cc6e812ee50f8330000000000000000000000006f16c2bb24b4e844bd9fb9141cc6e812ee50f833000000000000000000000000000000000000000000000000001c687f50fe852600000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -1825,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec34000000000000000000000000a434108cc9fe2a86796b4d4ac6bf61af1ad8eca1000000000000000000000000a434108cc9fe2a86796b4d4ac6bf61af1ad8eca1000000000000000000000000000000000000000000000000060422e3e632615e00000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -1830,0xcd9d4988c0ae61887b075ba77f08cbfad2b65068,0x3f87ff1de58128ef8fcb4c807efd776e1ac72e51,0xf4f7b41a00000000000000000000000013a9bcf887142f70c53f52df7ccd9a832a72a77500000000000000000000000000000000000000000000000fe52cea9f3e6a2842,,,1,true -1837,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec34000000000000000000000000342dbb1fcb0f693bc991b87cab2edfb4f25b69ee000000000000000000000000342dbb1fcb0f693bc991b87cab2edfb4f25b69ee00000000000000000000000000000000000000000000000001101d6c5e198e4f00000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -1838,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec3400000000000000000000000082683f46c69e068f244d86103317b37ebbf9377900000000000000000000000082683f46c69e068f244d86103317b37ebbf937790000000000000000000000000000000000000000000000000002dce362efac9c00000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -1841,0xcd9d4988c0ae61887b075ba77f08cbfad2b65068,0x3f87ff1de58128ef8fcb4c807efd776e1ac72e51,0xf4f7b41a000000000000000000000000004e6f61590eac8016f21ab170c488f0350a8fa0000000000000000000000000000000000000000000000000f7671cc47aa1f92c,,,1,true -1846,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec340000000000000000000000005d487c2f6f9dd15db0ce76181e6211a1ef9d8d920000000000000000000000005d487c2f6f9dd15db0ce76181e6211a1ef9d8d92000000000000000000000000000000000000000000000000d3b87598235f2cbf00000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -1847,0xcd9d4988c0ae61887b075ba77f08cbfad2b65068,0x3f87ff1de58128ef8fcb4c807efd776e1ac72e51,0xf4f7b41a00000000000000000000000009bbf793fe17c934a933b57a9fb4add10289aa6a000000000000000000000000000000000000000000000000621beb6d38839193,,,1,true -1848,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec340000000000000000000000004f13dffed9aa20fb22526463bed09c4e59e1b8330000000000000000000000004f13dffed9aa20fb22526463bed09c4e59e1b83300000000000000000000000000000000000000000000000000473a96fb049f6000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,0xe580c078056fcbb2086db9237a4ca2169706ec239035d62644ac0d4510eccfa9,2022-07-16 08:25:14.000 UTC,0,true -1850,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec3400000000000000000000000009bbf793fe17c934a933b57a9fb4add10289aa6a00000000000000000000000009bbf793fe17c934a933b57a9fb4add10289aa6a00000000000000000000000000000000000000000000000000166e0719f5ccc000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -1851,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec340000000000000000000000003637a131c537dfdabab3a5e964f70fa65c3640080000000000000000000000003637a131c537dfdabab3a5e964f70fa65c36400800000000000000000000000000000000000000000000000006e4641adad0a37d00000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -1852,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec3400000000000000000000000076cdca9ce4ac4804884e1e778e68d256c8b087c100000000000000000000000076cdca9ce4ac4804884e1e778e68d256c8b087c1000000000000000000000000000000000000000000000000045be402e365f2c700000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -1856,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec3400000000000000000000000080af0af8c7ab024039f49fb4bb5f440b1297c41300000000000000000000000080af0af8c7ab024039f49fb4bb5f440b1297c41300000000000000000000000000000000000000000000000000ae2c5d4b720b4000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,0xc53b08b7c3ef1f64dbd9828724950edd650cc7170ca5d675fb8c0be34f908890,2022-02-27 09:15:08.000 UTC,0,true -1857,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec34000000000000000000000000732052b8d446acdb4e43282ec39c1a385c811b02000000000000000000000000732052b8d446acdb4e43282ec39c1a385c811b0200000000000000000000000000000000000000000000000000005af3107a400000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -1859,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec34000000000000000000000000c2332295cfbcd03531a77b00a019f39335ab8d43000000000000000000000000c2332295cfbcd03531a77b00a019f39335ab8d43000000000000000000000000000000000000000000000000002386f26fc1000000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -1860,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec34000000000000000000000000c2a622b764878faf9ab9078ad31303b24fd4b707000000000000000000000000c2a622b764878faf9ab9078ad31303b24fd4b707000000000000000000000000000000000000000000000000002386f26fc1000000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -1861,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec34000000000000000000000000b355df7a527f215f51af23396c69094955840e2c000000000000000000000000b355df7a527f215f51af23396c69094955840e2c000000000000000000000000000000000000000000000000002386f26fc1000000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -1862,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec34000000000000000000000000608972868362504b4820fc26aa60787f45159913000000000000000000000000608972868362504b4820fc26aa60787f45159913000000000000000000000000000000000000000000000000002386f26fc1000000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -1863,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec340000000000000000000000004a7db7b42e26dc80a7091f72e2389b6cc9deb60d0000000000000000000000004a7db7b42e26dc80a7091f72e2389b6cc9deb60d000000000000000000000000000000000000000000000000002386f26fc1000000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -1866,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec340000000000000000000000009d0e4c670b1c3f9213ee13c79f16e2852d1582530000000000000000000000009d0e4c670b1c3f9213ee13c79f16e2852d158253000000000000000000000000000000000000000000000000001ed3bb1c4a6c0700000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -1867,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec340000000000000000000000009d0e4c670b1c3f9213ee13c79f16e2852d1582530000000000000000000000009d0e4c670b1c3f9213ee13c79f16e2852d15825300000000000000000000000000000000000000000000000000213e63812ae28100000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -1869,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec34000000000000000000000000f0f080b0ff503f6d59edbf8551df24d02c69deef000000000000000000000000f0f080b0ff503f6d59edbf8551df24d02c69deef000000000000000000000000000000000000000000000000003f2ced8ccf31d800000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -1873,0xcd9d4988c0ae61887b075ba77f08cbfad2b65068,0x3f87ff1de58128ef8fcb4c807efd776e1ac72e51,0xf4f7b41a0000000000000000000000002923be587904f3034ffab36c86c495df3c21bc970000000000000000000000000000000000000000000000008138721ac7458fe0,,,1,true -1879,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec34000000000000000000000000c59b1008d098b19489a76fd90ce1d870d998492c000000000000000000000000c59b1008d098b19489a76fd90ce1d870d998492c0000000000000000000000000000000000000000000000000084b7651040d1f000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -1880,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec34000000000000000000000000725147c2bfa26fca5984b5ac1f7abf8719dc795d000000000000000000000000725147c2bfa26fca5984b5ac1f7abf8719dc795d00000000000000000000000000000000000000000000000000935168819a2d0000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -1883,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec34000000000000000000000000d5bd9cec8ecaa2de229fff140d4343584a86b370000000000000000000000000d5bd9cec8ecaa2de229fff140d4343584a86b370000000000000000000000000000000000000000000000000004487374723448a00000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -1888,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec34000000000000000000000000bd67285ea7e8efa60e0162e7b6ad6bfb57bd6f44000000000000000000000000bd67285ea7e8efa60e0162e7b6ad6bfb57bd6f44000000000000000000000000000000000000000000000000058adbe9880b120000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -1890,0x10e6593cdda8c58a1d0f14c5164b376352a55f2f,0x467194771dae2967aef3ecbedd3bf9a310c76c65,0xa9f9e6750000000000000000000000006b175474e89094c44da98b954eedeac495271d0f000000000000000000000000da10009cbd5d07dd0cecc66161fc93d7c9000da100000000000000000000000082683f46c69e068f244d86103317b37ebbf9377900000000000000000000000082683f46c69e068f244d86103317b37ebbf937790000000000000000000000000000000000000000000000000035d1bd4bf9369600000000000000000000000000000000000000000000000000000000000000c00000000000000000000000000000000000000000000000000000000000000000,,,1,true -1893,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec340000000000000000000000008d0172e88bd400884708318bac77bc69f76ae0820000000000000000000000008d0172e88bd400884708318bac77bc69f76ae082000000000000000000000000000000000000000000000000006a94d74f43000000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -1895,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec34000000000000000000000000f89f1d06505962b95eca6f46387a75e2de1b3b68000000000000000000000000f89f1d06505962b95eca6f46387a75e2de1b3b68000000000000000000000000000000000000000000000000000017750f94750000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -1899,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec3400000000000000000000000064b857f38efe672d8938a1022248e7ce9444525500000000000000000000000064b857f38efe672d8938a1022248e7ce944452550000000000000000000000000000000000000000000000000058d15e1762800000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -1900,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec34000000000000000000000000889cb44823b35fc53dfc3a8b58a825beb6a737b5000000000000000000000000889cb44823b35fc53dfc3a8b58a825beb6a737b5000000000000000000000000000000000000000000000000007e18fb9c0a35ea00000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,0xcb1e847f54fa1d901d3fc50f565f8cad5816f717c841bbdac07d32ffe0b8429f,2022-03-06 05:36:44.000 UTC,0,true -1901,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec340000000000000000000000005c0fdf40988bf0c03b0a600a37ea57b5909ab28f0000000000000000000000005c0fdf40988bf0c03b0a600a37ea57b5909ab28f00000000000000000000000000000000000000000000000001b667a56d48800000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -1910,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec34000000000000000000000000982bfe6dac3ccdb324984311d5804dbb1cfd4faf000000000000000000000000982bfe6dac3ccdb324984311d5804dbb1cfd4faf000000000000000000000000000000000000000000000000022775fd824e31a700000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -1911,0x10e6593cdda8c58a1d0f14c5164b376352a55f2f,0x467194771dae2967aef3ecbedd3bf9a310c76c65,0xa9f9e6750000000000000000000000006b175474e89094c44da98b954eedeac495271d0f000000000000000000000000da10009cbd5d07dd0cecc66161fc93d7c9000da10000000000000000000000001aedc8c5a2f163685d8ea7b93101d57eab683a840000000000000000000000001aedc8c5a2f163685d8ea7b93101d57eab683a8400000000000000000000000000000000000000000000000098a1fbea3abc65f000000000000000000000000000000000000000000000000000000000000000c00000000000000000000000000000000000000000000000000000000000000000,,,1,true -1912,0x10e6593cdda8c58a1d0f14c5164b376352a55f2f,0x467194771dae2967aef3ecbedd3bf9a310c76c65,0xa9f9e6750000000000000000000000006b175474e89094c44da98b954eedeac495271d0f000000000000000000000000da10009cbd5d07dd0cecc66161fc93d7c9000da1000000000000000000000000bd978c0e11680717f5116f8fd62a19ca325b4877000000000000000000000000bd978c0e11680717f5116f8fd62a19ca325b4877000000000000000000000000000000000000000000000002a1075cd4b4a2f73100000000000000000000000000000000000000000000000000000000000000c00000000000000000000000000000000000000000000000000000000000000000,,,1,true -1917,0x10e6593cdda8c58a1d0f14c5164b376352a55f2f,0x467194771dae2967aef3ecbedd3bf9a310c76c65,0xa9f9e6750000000000000000000000006b175474e89094c44da98b954eedeac495271d0f000000000000000000000000da10009cbd5d07dd0cecc66161fc93d7c9000da1000000000000000000000000321f5373fc2b56153a997d88b7fffdc1d413fcdc000000000000000000000000321f5373fc2b56153a997d88b7fffdc1d413fcdc000000000000000000000000000000000000000000000001998427cc5c934ceb00000000000000000000000000000000000000000000000000000000000000c00000000000000000000000000000000000000000000000000000000000000000,,,1,true -1918,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec34000000000000000000000000321f5373fc2b56153a997d88b7fffdc1d413fcdc000000000000000000000000321f5373fc2b56153a997d88b7fffdc1d413fcdc00000000000000000000000000000000000000000000000000066a534ecab04000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -1922,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec34000000000000000000000000ab303fec8e53841653128610c44ceab5da46c23f000000000000000000000000ab303fec8e53841653128610c44ceab5da46c23f0000000000000000000000000000000000000000000000000011c37937e0800000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -1924,0xcd9d4988c0ae61887b075ba77f08cbfad2b65068,0x3f87ff1de58128ef8fcb4c807efd776e1ac72e51,0xf4f7b41a000000000000000000000000b361234dc46ec6cb034eb692e6330c1ad57fedcd0000000000000000000000000000000000000000000000093739534d28680000,,,1,true -1926,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec340000000000000000000000003fa93b2d9b95faf616c4c749e958f87f1463b4fe0000000000000000000000003fa93b2d9b95faf616c4c749e958f87f1463b4fe000000000000000000000000000000000000000000000000001f1e32d9f5e80000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -1933,0xcd9d4988c0ae61887b075ba77f08cbfad2b65068,0x3f87ff1de58128ef8fcb4c807efd776e1ac72e51,0xf4f7b41a000000000000000000000000e0b56bca567be6daa6dd3e95d484f892a915108900000000000000000000000000000000000000000000000104ae218c7a8b51a6,,,1,true -1936,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec34000000000000000000000000043221135be9d8f9da1345e0242155b779c7633f000000000000000000000000043221135be9d8f9da1345e0242155b779c7633f0000000000000000000000000000000000000000000000000020ab9bf287af0000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -1942,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec340000000000000000000000007ab384c78ec3a44dfe0e3bc1cdcdd042534b055d0000000000000000000000007ab384c78ec3a44dfe0e3bc1cdcdd042534b055d000000000000000000000000000000000000000000000000016345785d8a000000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -1945,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec34000000000000000000000000f223460832b3afe7161d87584cfefba7608e4f0c000000000000000000000000f223460832b3afe7161d87584cfefba7608e4f0c0000000000000000000000000000000000000000000000000020091f01b4c00000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -1946,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec34000000000000000000000000edb797dfab3c6fd90295e6264ec4d672d73ac7d3000000000000000000000000edb797dfab3c6fd90295e6264ec4d672d73ac7d300000000000000000000000000000000000000000000000000794d5b3f0a146800000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,0x810336c2a1dcd31b32485950e7faf34dd6867e81b83b70e399a46eb4e11e18bd,2022-03-13 10:34:11.000 UTC,0,true -1948,0x10e6593cdda8c58a1d0f14c5164b376352a55f2f,0x467194771dae2967aef3ecbedd3bf9a310c76c65,0xa9f9e6750000000000000000000000006b175474e89094c44da98b954eedeac495271d0f000000000000000000000000da10009cbd5d07dd0cecc66161fc93d7c9000da1000000000000000000000000304c161c3a71fbe5867022648fbc7d9aa994a02d000000000000000000000000304c161c3a71fbe5867022648fbc7d9aa994a02d000000000000000000000000000000000000000000000005e870b03b127d1cc100000000000000000000000000000000000000000000000000000000000000c00000000000000000000000000000000000000000000000000000000000000000,,,1,true -1953,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec34000000000000000000000000d38ac318aa5821a99b1fe1e6f0a6b5e8fe2941a7000000000000000000000000d38ac318aa5821a99b1fe1e6f0a6b5e8fe2941a70000000000000000000000000000000000000000000000000062f63cbdb886ae00000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -1954,0xcd9d4988c0ae61887b075ba77f08cbfad2b65068,0x3f87ff1de58128ef8fcb4c807efd776e1ac72e51,0xf4f7b41a000000000000000000000000a8e0f532656ab6c2cd83bef11f6e6ce1f7c18a9b00000000000000000000000000000000000000000000000a7669bd7132640000,,,1,true -1959,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec34000000000000000000000000a73a8cb53f91a903b4b6202e85e347000d5433a5000000000000000000000000a73a8cb53f91a903b4b6202e85e347000d5433a5000000000000000000000000000000000000000000000000001c6bf52634000000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -1960,0xcd9d4988c0ae61887b075ba77f08cbfad2b65068,0x3f87ff1de58128ef8fcb4c807efd776e1ac72e51,0xf4f7b41a0000000000000000000000008b82ea55b70e93746bd13d858648772daeaedb1a000000000000000000000000000000000000000000000028885341dd125aeab0,,,1,true -1961,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec3400000000000000000000000076ab70829b14430f35e600fd0dab42d2c88d570e00000000000000000000000076ab70829b14430f35e600fd0dab42d2c88d570e00000000000000000000000000000000000000000000000000534a3ccb0b680000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -1962,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec3400000000000000000000000078ace162a81d2588d6247478a39254b12b5c031600000000000000000000000078ace162a81d2588d6247478a39254b12b5c031600000000000000000000000000000000000000000000000000f2d7012e9b3c4000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,0x501760f15d70a9221ddc582626a214a087d33d42d15fdc1527dab0e9a2892eef,2022-03-06 10:59:59.000 UTC,0,true -1963,0xcd9d4988c0ae61887b075ba77f08cbfad2b65068,0x3f87ff1de58128ef8fcb4c807efd776e1ac72e51,0xf4f7b41a00000000000000000000000046d95954dd98b03820c69a7e85e1631a2d3f04250000000000000000000000000000000000000000000000003b2862c2a12ca150,,,1,true -1968,0xcd9d4988c0ae61887b075ba77f08cbfad2b65068,0x3f87ff1de58128ef8fcb4c807efd776e1ac72e51,0xf4f7b41a0000000000000000000000008afb85e94953c869f6652bc69f0e4c4bab0b9677000000000000000000000000000000000000000000000000aa54da1123ef48b4,,,1,true -1979,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec3400000000000000000000000044265dae5c21110b0dfdd421503ce3e1ca3280a500000000000000000000000044265dae5c21110b0dfdd421503ce3e1ca3280a500000000000000000000000000000000000000000000000000168fa0c1f2e6ad00000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -1980,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec340000000000000000000000006c03d9b3b58c8589172843f3deb7cb74a0d9d9e30000000000000000000000006c03d9b3b58c8589172843f3deb7cb74a0d9d9e300000000000000000000000000000000000000000000000000038d7ea4c6800000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -1981,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec3400000000000000000000000012235b260b113ebef4a77b27bdc1c8da3e00109d00000000000000000000000012235b260b113ebef4a77b27bdc1c8da3e00109d0000000000000000000000000000000000000000000000000061d2f881fd6a8300000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -1983,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec3400000000000000000000000080f0171d4844436549c1f83b0e5c5ef7ce94371600000000000000000000000080f0171d4844436549c1f83b0e5c5ef7ce9437160000000000000000000000000000000000000000000000000020d74f2b7db0a400000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -1984,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec340000000000000000000000005eb71caeadf22107a578bc5261ec9a1e16fad5f80000000000000000000000005eb71caeadf22107a578bc5261ec9a1e16fad5f8000000000000000000000000000000000000000000000000015bc0230dede8a400000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,0xe7a9176bbb48a1c6179f6d5c85b642065bdfdcde712658f80eadf9fd7a6e3e7a,2022-04-27 04:02:00.000 UTC,0,true -1985,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec340000000000000000000000007450fb048bd81d69c27676b93129f611af948c280000000000000000000000007450fb048bd81d69c27676b93129f611af948c2800000000000000000000000000000000000000000000000000853fcd8ddbdc5e00000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -1987,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec34000000000000000000000000b053b3105844613bc91cd10443739cb6123c1ab0000000000000000000000000b053b3105844613bc91cd10443739cb6123c1ab000000000000000000000000000000000000000000000000002e0a6e55898f65e00000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -1988,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec34000000000000000000000000ce21d998c7c79c48124583c3bf85d96dccbf8224000000000000000000000000ce21d998c7c79c48124583c3bf85d96dccbf82240000000000000000000000000000000000000000000000000011c37937e0800000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -1990,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec340000000000000000000000006c6344ba5ebe67f6118b8129e37f67ca9c0d10de0000000000000000000000006c6344ba5ebe67f6118b8129e37f67ca9c0d10de00000000000000000000000000000000000000000000000004d37662ceaf1dc900000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -1992,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec340000000000000000000000006d8bb86b43ecd8e84aa3542853ca25655f519c0e0000000000000000000000006d8bb86b43ecd8e84aa3542853ca25655f519c0e00000000000000000000000000000000000000000000000000069309dde49dc000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -1994,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec34000000000000000000000000d77900479ef30963f4b5aa7d752b15795192ee15000000000000000000000000d77900479ef30963f4b5aa7d752b15795192ee1500000000000000000000000000000000000000000000000002bcc373fa1731d100000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -1995,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec34000000000000000000000000a87469931a348664fdf3125670cc1599c2150d07000000000000000000000000a87469931a348664fdf3125670cc1599c2150d0700000000000000000000000000000000000000000000000000ad0eeae705da0000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -1996,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec34000000000000000000000000dda41e662f2ed6609170431d11c885ab7158e19b000000000000000000000000dda41e662f2ed6609170431d11c885ab7158e19b000000000000000000000000000000000000000000000000001e9ef2ef19330000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -1997,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec3400000000000000000000000043d19b7139089a63f051ab5b8c89cb425a9d861b00000000000000000000000043d19b7139089a63f051ab5b8c89cb425a9d861b000000000000000000000000000000000000000000000000001ef4872226090000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -1998,0x10e6593cdda8c58a1d0f14c5164b376352a55f2f,0x467194771dae2967aef3ecbedd3bf9a310c76c65,0xa9f9e6750000000000000000000000006b175474e89094c44da98b954eedeac495271d0f000000000000000000000000da10009cbd5d07dd0cecc66161fc93d7c9000da10000000000000000000000000a95d8ae3c78b779d5aff68764a195a6c634be920000000000000000000000000a95d8ae3c78b779d5aff68764a195a6c634be920000000000000000000000000000000000000000000000053b4ef76346c592cc00000000000000000000000000000000000000000000000000000000000000c00000000000000000000000000000000000000000000000000000000000000000,0x1e240da1e12e750274192d7e73d85f6589e51e74cddeb7f1fe2f96edb0d4eb53,2022-06-26 03:12:21.000 UTC,0,true -2003,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec34000000000000000000000000634775efe2d77ff787fa843a57e752b9bd515f41000000000000000000000000634775efe2d77ff787fa843a57e752b9bd515f4100000000000000000000000000000000000000000000000000d6e16de1e9520500000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -2008,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec3400000000000000000000000055ec74b554fd87fb1273236b483a973e2734b0a100000000000000000000000055ec74b554fd87fb1273236b483a973e2734b0a10000000000000000000000000000000000000000000000000018feaa7f62e1f700000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -2010,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec3400000000000000000000000033630b553dfd9a9647c689cbff36a6017400021200000000000000000000000033630b553dfd9a9647c689cbff36a60174000212000000000000000000000000000000000000000000000000001718b815ff2d2100000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -2011,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0xa9f9e675000000000000000000000000dac17f958d2ee523a2206206994597c13d831ec700000000000000000000000094b008aa00579c1307b0ef2c499ad98a8ce58e58000000000000000000000000882ae064b136eb4f6f0095b07b87257806c80bab000000000000000000000000882ae064b136eb4f6f0095b07b87257806c80bab0000000000000000000000000000000000000000000000000000000002aea54000000000000000000000000000000000000000000000000000000000000000c00000000000000000000000000000000000000000000000000000000000000000,,,1,true -2012,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0xa9f9e675000000000000000000000000dac17f958d2ee523a2206206994597c13d831ec700000000000000000000000094b008aa00579c1307b0ef2c499ad98a8ce58e5800000000000000000000000078902c0f6f7a3520340e38f87b36b2373e5f3f6a00000000000000000000000078902c0f6f7a3520340e38f87b36b2373e5f3f6a0000000000000000000000000000000000000000000000000000000002aea54000000000000000000000000000000000000000000000000000000000000000c00000000000000000000000000000000000000000000000000000000000000000,,,1,true -2013,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0xa9f9e675000000000000000000000000dac17f958d2ee523a2206206994597c13d831ec700000000000000000000000094b008aa00579c1307b0ef2c499ad98a8ce58e58000000000000000000000000ac495ea31d2002ac8fed73dfe98cffc04b9e82dc000000000000000000000000ac495ea31d2002ac8fed73dfe98cffc04b9e82dc0000000000000000000000000000000000000000000000000000000002aea54000000000000000000000000000000000000000000000000000000000000000c00000000000000000000000000000000000000000000000000000000000000000,,,1,true -2014,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0xa9f9e675000000000000000000000000dac17f958d2ee523a2206206994597c13d831ec700000000000000000000000094b008aa00579c1307b0ef2c499ad98a8ce58e58000000000000000000000000d02f64a4a523b6c981d7e1698f524e867c8d640c000000000000000000000000d02f64a4a523b6c981d7e1698f524e867c8d640c0000000000000000000000000000000000000000000000000000000002aea54000000000000000000000000000000000000000000000000000000000000000c00000000000000000000000000000000000000000000000000000000000000000,,,1,true -2015,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0xa9f9e675000000000000000000000000dac17f958d2ee523a2206206994597c13d831ec700000000000000000000000094b008aa00579c1307b0ef2c499ad98a8ce58e580000000000000000000000006a6d748b878629aabfb83acc10bb24ea5644f9480000000000000000000000006a6d748b878629aabfb83acc10bb24ea5644f9480000000000000000000000000000000000000000000000000000000002aea54000000000000000000000000000000000000000000000000000000000000000c00000000000000000000000000000000000000000000000000000000000000000,,,1,true -2016,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0xa9f9e675000000000000000000000000dac17f958d2ee523a2206206994597c13d831ec700000000000000000000000094b008aa00579c1307b0ef2c499ad98a8ce58e58000000000000000000000000fc073b372d57c56718127fcf712f5d84c1fa07ff000000000000000000000000fc073b372d57c56718127fcf712f5d84c1fa07ff0000000000000000000000000000000000000000000000000000000002bde78000000000000000000000000000000000000000000000000000000000000000c00000000000000000000000000000000000000000000000000000000000000000,,,1,true -2017,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0xa9f9e675000000000000000000000000dac17f958d2ee523a2206206994597c13d831ec700000000000000000000000094b008aa00579c1307b0ef2c499ad98a8ce58e58000000000000000000000000f9c05511c9baf7f1963d4c3c1cce87dff498ae41000000000000000000000000f9c05511c9baf7f1963d4c3c1cce87dff498ae410000000000000000000000000000000000000000000000000000000002bde78000000000000000000000000000000000000000000000000000000000000000c00000000000000000000000000000000000000000000000000000000000000000,,,1,true -2018,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0xa9f9e675000000000000000000000000dac17f958d2ee523a2206206994597c13d831ec700000000000000000000000094b008aa00579c1307b0ef2c499ad98a8ce58e58000000000000000000000000ac1866e1bfa099db65c77358e7c6e37833ebd899000000000000000000000000ac1866e1bfa099db65c77358e7c6e37833ebd8990000000000000000000000000000000000000000000000000000000002bde78000000000000000000000000000000000000000000000000000000000000000c00000000000000000000000000000000000000000000000000000000000000000,,,1,true -2019,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0xa9f9e675000000000000000000000000dac17f958d2ee523a2206206994597c13d831ec700000000000000000000000094b008aa00579c1307b0ef2c499ad98a8ce58e58000000000000000000000000f447b6eed0c522a0625e08d48af99f4b2cafc2fd000000000000000000000000f447b6eed0c522a0625e08d48af99f4b2cafc2fd0000000000000000000000000000000000000000000000000000000002bde78000000000000000000000000000000000000000000000000000000000000000c00000000000000000000000000000000000000000000000000000000000000000,,,1,true -2021,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0xa9f9e675000000000000000000000000dac17f958d2ee523a2206206994597c13d831ec700000000000000000000000094b008aa00579c1307b0ef2c499ad98a8ce58e58000000000000000000000000fa204a1b8d4d8da5577c1eacac9b7e5f3e896c70000000000000000000000000fa204a1b8d4d8da5577c1eacac9b7e5f3e896c7000000000000000000000000000000000000000000000000000000000014948e000000000000000000000000000000000000000000000000000000000000000c00000000000000000000000000000000000000000000000000000000000000000,,,1,true -2024,0xcd9d4988c0ae61887b075ba77f08cbfad2b65068,0x3f87ff1de58128ef8fcb4c807efd776e1ac72e51,0xf4f7b41a00000000000000000000000012e322ef04da64246412536f8eb60d6a402a59f9000000000000000000000000000000000000000000000000db44e049bb2c0000,,,1,true -2025,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0xa9f9e675000000000000000000000000a0b86991c6218b36c1d19d4a2e9eb0ce3606eb480000000000000000000000007f5c764cbc14f9669b88837ca1490cca17c31607000000000000000000000000ef58868d460c4d5784406960e1ef8aae1512be55000000000000000000000000ef58868d460c4d5784406960e1ef8aae1512be550000000000000000000000000000000000000000000000000000000005226fa700000000000000000000000000000000000000000000000000000000000000c00000000000000000000000000000000000000000000000000000000000000000,,,1,true -2026,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec34000000000000000000000000c563d8cfcc4f747ddbd7b7f9b243f7ff0f4108aa000000000000000000000000c563d8cfcc4f747ddbd7b7f9b243f7ff0f4108aa00000000000000000000000000000000000000000000000001608039ea25fc0000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -2027,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec34000000000000000000000000e0b56bca567be6daa6dd3e95d484f892a9151089000000000000000000000000e0b56bca567be6daa6dd3e95d484f892a915108900000000000000000000000000000000000000000000000000046a078eec2a8000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -2028,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec34000000000000000000000000db851d1c7bd4370089bf04641e628cab2a538586000000000000000000000000db851d1c7bd4370089bf04641e628cab2a538586000000000000000000000000000000000000000000000000009c51c4521e000000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -2033,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec34000000000000000000000000dc4a04c3a9e4f3d6674e3ea292d946a8185abed9000000000000000000000000dc4a04c3a9e4f3d6674e3ea292d946a8185abed90000000000000000000000000000000000000000000000000040b2b33891dace00000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -2035,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec34000000000000000000000000e633336f44c164654eb8e0577a2ba420c776bd5e000000000000000000000000e633336f44c164654eb8e0577a2ba420c776bd5e000000000000000000000000000000000000000000000000003868fbd5aa43e100000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -2036,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec3400000000000000000000000028886a8f7bc0a58e04deb35c1531b34dc61acb5e00000000000000000000000028886a8f7bc0a58e04deb35c1531b34dc61acb5e000000000000000000000000000000000000000000000000006848f66a57f24a00000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -2037,0xcd9d4988c0ae61887b075ba77f08cbfad2b65068,0x3f87ff1de58128ef8fcb4c807efd776e1ac72e51,0xf4f7b41a000000000000000000000000564a90617500a17eab836fcd9f811118079e19b7000000000000000000000000000000000000000000000000477dbd7cc4514834,,,1,true -2038,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec340000000000000000000000001b51c80fb02bb165593b3f82d845894fbadf1b040000000000000000000000001b51c80fb02bb165593b3f82d845894fbadf1b040000000000000000000000000000000000000000000000000250eaa302d9f98100000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,0x780f6544bfbb7da05b60c09f5f3b5c43606d4bbbe291c73e51459e208269413e,2021-12-09 23:27:04.000 UTC,0,true -2039,0xcd9d4988c0ae61887b075ba77f08cbfad2b65068,0x3f87ff1de58128ef8fcb4c807efd776e1ac72e51,0xf4f7b41a000000000000000000000000d0c3ba7132613925c6a5b5ed341f6b879d5e0f580000000000000000000000000000000000000000000000056cc00ece71570000,,,1,true -2040,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec3400000000000000000000000063d612aa37942803ba62e03c2f6fde6b061f6a6f00000000000000000000000063d612aa37942803ba62e03c2f6fde6b061f6a6f00000000000000000000000000000000000000000000000000058c0da2e2fc5800000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -2045,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec34000000000000000000000000c1e36163263b89bb2e5d2d694d28e496f1881749000000000000000000000000c1e36163263b89bb2e5d2d694d28e496f18817490000000000000000000000000000000000000000000000000020267c86ac9b0000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -2047,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec340000000000000000000000008318990fba5fd78d7c963924fc4f4eaade5c3df90000000000000000000000008318990fba5fd78d7c963924fc4f4eaade5c3df9000000000000000000000000000000000000000000000000000c05e921153cf700000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -2054,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec3400000000000000000000000057460ac29351491c402ad53b3630e93a1941f95100000000000000000000000057460ac29351491c402ad53b3630e93a1941f9510000000000000000000000000000000000000000000000000051feeec6ec274000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -2055,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec340000000000000000000000006a9d1138480226820ecb43abe6563ec0415fc2af0000000000000000000000006a9d1138480226820ecb43abe6563ec0415fc2af000000000000000000000000000000000000000000000000004db48f9a7e1e0000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -2056,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec340000000000000000000000003e4a0e0593df6ffd10d459e06429b93399a3d80a0000000000000000000000003e4a0e0593df6ffd10d459e06429b93399a3d80a000000000000000000000000000000000000000000000000000a40ee2576238000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -2059,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec340000000000000000000000002daec6744e092a586240e653fc715f9d2cee90270000000000000000000000002daec6744e092a586240e653fc715f9d2cee90270000000000000000000000000000000000000000000000000156a1c1c7197d3f00000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -2060,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec34000000000000000000000000f4eeb4d6b029effa2b79e279f94c08be50437d78000000000000000000000000f4eeb4d6b029effa2b79e279f94c08be50437d7800000000000000000000000000000000000000000000000000011fe26917b57500000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -2062,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec34000000000000000000000000f3de20dc08f50b3b5cbd68cb06ab798bcdae08a4000000000000000000000000f3de20dc08f50b3b5cbd68cb06ab798bcdae08a40000000000000000000000000000000000000000000000000010caae5801be4000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -2063,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec340000000000000000000000005e3b906074a29dd2fb1d9ab304bfd927f603b7200000000000000000000000005e3b906074a29dd2fb1d9ab304bfd927f603b720000000000000000000000000000000000000000000000000003fb349a22be82f00000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -2064,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec340000000000000000000000004ff36124356df5617dec6e9d40d49b32cc55909d0000000000000000000000004ff36124356df5617dec6e9d40d49b32cc55909d000000000000000000000000000000000000000000000000009ce40a98d8990000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -2066,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec340000000000000000000000002daec6744e092a586240e653fc715f9d2cee90270000000000000000000000002daec6744e092a586240e653fc715f9d2cee902700000000000000000000000000000000000000000000000000aa5d21b0199c8d00000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -2068,0x10e6593cdda8c58a1d0f14c5164b376352a55f2f,0x467194771dae2967aef3ecbedd3bf9a310c76c65,0xa9f9e6750000000000000000000000006b175474e89094c44da98b954eedeac495271d0f000000000000000000000000da10009cbd5d07dd0cecc66161fc93d7c9000da10000000000000000000000001511be1b433b06ab7c01980d45b2939ee500eb940000000000000000000000001511be1b433b06ab7c01980d45b2939ee500eb940000000000000000000000000000000000000000000000008ac7230489e8000000000000000000000000000000000000000000000000000000000000000000c00000000000000000000000000000000000000000000000000000000000000000,,,1,true -2069,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec34000000000000000000000000c5998e60aa4fa846bb7dab5e3522c2c61266bb52000000000000000000000000c5998e60aa4fa846bb7dab5e3522c2c61266bb52000000000000000000000000000000000000000000000000001c4bca86a8d4fd00000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -2073,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec34000000000000000000000000dc4171d7b45b9502ebc1d31c50d9d69a1aa6cd13000000000000000000000000dc4171d7b45b9502ebc1d31c50d9d69a1aa6cd1300000000000000000000000000000000000000000000000000005af3107a400000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -2074,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec340000000000000000000000004e4eecdb19d80c61cd1d0f28b17d44df1dfaa1870000000000000000000000004e4eecdb19d80c61cd1d0f28b17d44df1dfaa18700000000000000000000000000000000000000000000000000524597a14884fa00000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -2091,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec34000000000000000000000000494d035d1ad677b3fa5cc537a8cebd0bf2480971000000000000000000000000494d035d1ad677b3fa5cc537a8cebd0bf248097100000000000000000000000000000000000000000000000002c1f9a3cf2f950000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -2094,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0xa9f9e675000000000000000000000000a0b86991c6218b36c1d19d4a2e9eb0ce3606eb480000000000000000000000007f5c764cbc14f9669b88837ca1490cca17c31607000000000000000000000000924ac9910c09a0215b06458653b30471a152022f000000000000000000000000924ac9910c09a0215b06458653b30471a152022f00000000000000000000000000000000000000000000000000000000000f424000000000000000000000000000000000000000000000000000000000000000c00000000000000000000000000000000000000000000000000000000000000000,,,1,true -2095,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0xa9f9e675000000000000000000000000dac17f958d2ee523a2206206994597c13d831ec700000000000000000000000094b008aa00579c1307b0ef2c499ad98a8ce58e58000000000000000000000000924ac9910c09a0215b06458653b30471a152022f000000000000000000000000924ac9910c09a0215b06458653b30471a152022f00000000000000000000000000000000000000000000000000000000000f424000000000000000000000000000000000000000000000000000000000000000c00000000000000000000000000000000000000000000000000000000000000000,,,1,true -2096,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec34000000000000000000000000a172d783fc38efe8135e6a3aeaab5c4932cf2623000000000000000000000000a172d783fc38efe8135e6a3aeaab5c4932cf26230000000000000000000000000000000000000000000000000018de76816d800000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -2097,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec34000000000000000000000000f279d33db640c5ad6a53d0e847f98b65ce845a15000000000000000000000000f279d33db640c5ad6a53d0e847f98b65ce845a15000000000000000000000000000000000000000000000000001550f7dca7000000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -2100,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec3400000000000000000000000098656b644acaa9faa0d5919d2a2f311582093d1000000000000000000000000098656b644acaa9faa0d5919d2a2f311582093d1000000000000000000000000000000000000000000000000000abac938068210000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -2101,0xcd9d4988c0ae61887b075ba77f08cbfad2b65068,0x3f87ff1de58128ef8fcb4c807efd776e1ac72e51,0xf4f7b41a000000000000000000000000829f0811319625975292ee7d9d22a3a0b408eed900000000000000000000000000000000000000000000000019485ca897900f89,,,1,true -2103,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec34000000000000000000000000741bc936b183f8bcf807c0204bee62fa68ea561f000000000000000000000000741bc936b183f8bcf807c0204bee62fa68ea561f00000000000000000000000000000000000000000000000000470de4df82000000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,0x687b28487c0cab0ca83f0473f24353a60f5871d677fe96dec7e414ee556b3c26,2022-01-02 15:42:12.000 UTC,0,true -2108,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec3400000000000000000000000076916bdbd7b84317365fb3bd157e1606550665b900000000000000000000000076916bdbd7b84317365fb3bd157e1606550665b9000000000000000000000000000000000000000000000000001c6bf52634000000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -2111,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec34000000000000000000000000298caa03187ba3145bac8749ec258913632e0008000000000000000000000000298caa03187ba3145bac8749ec258913632e000800000000000000000000000000000000000000000000000000122bfa2203f9ed00000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -2114,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec34000000000000000000000000ac4bfcd893230a82f9f905f92457378b52a1d706000000000000000000000000ac4bfcd893230a82f9f905f92457378b52a1d7060000000000000000000000000000000000000000000000000160291918f8550000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -2116,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec340000000000000000000000009587de586dfa49cf33dd5b30679450f3f6d1fd9a0000000000000000000000009587de586dfa49cf33dd5b30679450f3f6d1fd9a0000000000000000000000000000000000000000000000000054ea9ffaa5944500000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -2118,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec3400000000000000000000000017480555ebf1d3a40341361132c18fbf88fb8aeb00000000000000000000000017480555ebf1d3a40341361132c18fbf88fb8aeb000000000000000000000000000000000000000000000000012305f355f3b77e00000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -2119,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec3400000000000000000000000037cc7e32f81f9165f5b09dbaae89c07512e3843300000000000000000000000037cc7e32f81f9165f5b09dbaae89c07512e384330000000000000000000000000000000000000000000000000036ae2cba6a0ccd00000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -2121,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec34000000000000000000000000262c5eaaaa8b5632d073d72df6a08ada25cdbb28000000000000000000000000262c5eaaaa8b5632d073d72df6a08ada25cdbb2800000000000000000000000000000000000000000000000000038d7ea4c6800000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -2122,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec34000000000000000000000000e78f896ce38833a6ae75e7bde08508563802a462000000000000000000000000e78f896ce38833a6ae75e7bde08508563802a46200000000000000000000000000000000000000000000000000336939c9bfc29300000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -2123,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec34000000000000000000000000d9fbbb3032dfef61a9abf183ab460f4e18ce2dd8000000000000000000000000d9fbbb3032dfef61a9abf183ab460f4e18ce2dd8000000000000000000000000000000000000000000000000003ff2e795f5000000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -2125,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec340000000000000000000000000afbe097a650ed9da24994739fe1e8b120d23b550000000000000000000000000afbe097a650ed9da24994739fe1e8b120d23b55000000000000000000000000000000000000000000000000005543df729c000000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -2126,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec34000000000000000000000000980b25f29dcc19f5ea6b723dc0d481774e787570000000000000000000000000980b25f29dcc19f5ea6b723dc0d481774e7875700000000000000000000000000000000000000000000000000021051a7b936f0000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -2128,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec34000000000000000000000000602f49db00e1c594ac1c86970047a7d188334b78000000000000000000000000602f49db00e1c594ac1c86970047a7d188334b7800000000000000000000000000000000000000000000000000354a6ba7a1800000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -2129,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec340000000000000000000000002387949f5fcfe2c61d32b23fb8be22fbd133f12b0000000000000000000000002387949f5fcfe2c61d32b23fb8be22fbd133f12b00000000000000000000000000000000000000000000000000a985cb89de3f8000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -2130,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec34000000000000000000000000e34cabba447e536086363094b5cec334ebd8d7b7000000000000000000000000e34cabba447e536086363094b5cec334ebd8d7b700000000000000000000000000000000000000000000000000354a6ba7a1800000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -2132,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec34000000000000000000000000760606741594125796c9da208dd156336e9ff4d2000000000000000000000000760606741594125796c9da208dd156336e9ff4d2000000000000000000000000000000000000000000000000002386f26fc1000000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -2134,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec34000000000000000000000000cf3f7fd16849636a132f921438ee593866fd4e24000000000000000000000000cf3f7fd16849636a132f921438ee593866fd4e24000000000000000000000000000000000000000000000000020e4ce871c8c12c00000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -2135,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec34000000000000000000000000e2e8d90533c0b5b91a201738e627aaf353e585df000000000000000000000000e2e8d90533c0b5b91a201738e627aaf353e585df00000000000000000000000000000000000000000000000000002d79883d200000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -2136,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec340000000000000000000000009072063a81bebc2bc246612e8c69891f080bd7f80000000000000000000000009072063a81bebc2bc246612e8c69891f080bd7f800000000000000000000000000000000000000000000000000354a6ba7a1800000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -2138,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec34000000000000000000000000a924c5eff11bcb4d2b00d922e0145510c7459843000000000000000000000000a924c5eff11bcb4d2b00d922e0145510c7459843000000000000000000000000000000000000000000000000001ec8e634ab4dd200000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -2140,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec34000000000000000000000000a52715a5cc5efad1be64865195d2ea39c7d98e7f000000000000000000000000a52715a5cc5efad1be64865195d2ea39c7d98e7f000000000000000000000000000000000000000000000000000248f3a02bec8400000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -2141,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec34000000000000000000000000b7747b82b79cb793f17fe0faf51b5b77d4c44cf1000000000000000000000000b7747b82b79cb793f17fe0faf51b5b77d4c44cf100000000000000000000000000000000000000000000000000aeb9f91cfd1f0000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -2142,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec340000000000000000000000002f3218e0434fbda514552fb8e64c90025a45bd520000000000000000000000002f3218e0434fbda514552fb8e64c90025a45bd520000000000000000000000000000000000000000000000000006db26f299913500000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -2143,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0xa9f9e675000000000000000000000000dac17f958d2ee523a2206206994597c13d831ec700000000000000000000000094b008aa00579c1307b0ef2c499ad98a8ce58e580000000000000000000000002f3218e0434fbda514552fb8e64c90025a45bd520000000000000000000000002f3218e0434fbda514552fb8e64c90025a45bd520000000000000000000000000000000000000000000000000000000001f9062e00000000000000000000000000000000000000000000000000000000000000c00000000000000000000000000000000000000000000000000000000000000000,,,1,true -2144,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec34000000000000000000000000d6bd2eb85c151a3eddd17bb17d0933bb40b06fd3000000000000000000000000d6bd2eb85c151a3eddd17bb17d0933bb40b06fd300000000000000000000000000000000000000000000000001cdda4faccd000000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,0x44f6b55ede28657345deac8f3f158b89e6e9186c9b7073078df3952e5fc5f6ae,2022-05-09 10:28:55.000 UTC,0,true -2151,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec34000000000000000000000000f85c77731efa8dddc03e6196a838711fa36b81e0000000000000000000000000f85c77731efa8dddc03e6196a838711fa36b81e0000000000000000000000000000000000000000000000000005c5edcbc29000000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -2162,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec34000000000000000000000000a63519e67dae9a551ad34ae679cf0e911a78381a000000000000000000000000a63519e67dae9a551ad34ae679cf0e911a78381a0000000000000000000000000000000000000000000000000589129f32e57c8000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -2164,0x72209fe68386b37a40d6bca04f78356fd342491f,0xe22d2bedb3eca35e6397e0c6d62857094aa26f52,0xef6ebe5e000000000000000000000000000000000000000000000000000000000000000ababf53063ad68050fd4dbe833dfcbe2a5e286becef761352d6698e7dbab9754300000000000000000000000000000000000000000000000000000000000000010000000000000000000000000000000000000000000000000000000002fd721500000000000000000000000000000000000000000000000000000000611ef238,,,1,true -2166,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0xa9f9e675000000000000000000000000dac17f958d2ee523a2206206994597c13d831ec700000000000000000000000094b008aa00579c1307b0ef2c499ad98a8ce58e580000000000000000000000009feb52de6fd4aac6a5b0aa3f35b9c411dc7bf5c50000000000000000000000009feb52de6fd4aac6a5b0aa3f35b9c411dc7bf5c50000000000000000000000000000000000000000000000000000000041da3d6000000000000000000000000000000000000000000000000000000000000000c00000000000000000000000000000000000000000000000000000000000000000,,,1,true -2167,0x10e6593cdda8c58a1d0f14c5164b376352a55f2f,0x467194771dae2967aef3ecbedd3bf9a310c76c65,0xa9f9e6750000000000000000000000006b175474e89094c44da98b954eedeac495271d0f000000000000000000000000da10009cbd5d07dd0cecc66161fc93d7c9000da1000000000000000000000000c4fb550fa8f2a6e5178711e56d5b48dedf897e5e000000000000000000000000c4fb550fa8f2a6e5178711e56d5b48dedf897e5e0000000000000000000000000000000000000000000000008ac7230489e8000000000000000000000000000000000000000000000000000000000000000000c00000000000000000000000000000000000000000000000000000000000000000,,,1,true -2169,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec34000000000000000000000000a4803d8c45fc2f82a9c14b7191b29ae896ab3540000000000000000000000000a4803d8c45fc2f82a9c14b7191b29ae896ab354000000000000000000000000000000000000000000000000000a8875554cbc83f00000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -2170,0x10e6593cdda8c58a1d0f14c5164b376352a55f2f,0x467194771dae2967aef3ecbedd3bf9a310c76c65,0xa9f9e6750000000000000000000000006b175474e89094c44da98b954eedeac495271d0f000000000000000000000000da10009cbd5d07dd0cecc66161fc93d7c9000da1000000000000000000000000a4803d8c45fc2f82a9c14b7191b29ae896ab3540000000000000000000000000a4803d8c45fc2f82a9c14b7191b29ae896ab35400000000000000000000000000000000000000000000000008ac7230489e8000000000000000000000000000000000000000000000000000000000000000000c00000000000000000000000000000000000000000000000000000000000000000,,,1,true -2171,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec34000000000000000000000000a4803d8c45fc2f82a9c14b7191b29ae896ab3540000000000000000000000000a4803d8c45fc2f82a9c14b7191b29ae896ab354000000000000000000000000000000000000000000000000000587b06aee2736a00000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -2172,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec34000000000000000000000000f4a54a3c6ef95e8df1365dade09b7061eeca9ef4000000000000000000000000f4a54a3c6ef95e8df1365dade09b7061eeca9ef4000000000000000000000000000000000000000000000000001fcb5822f3e48000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -2175,0xcd9d4988c0ae61887b075ba77f08cbfad2b65068,0x3f87ff1de58128ef8fcb4c807efd776e1ac72e51,0xf4f7b41a00000000000000000000000046d44471a055f0aa11ff23cb9b120c5612c3902d00000000000000000000000000000000000000000000000376095ccf371c82b6,,,1,true -2181,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec34000000000000000000000000bfdff8796b34ca75a95ebca3a37809b99dda9287000000000000000000000000bfdff8796b34ca75a95ebca3a37809b99dda9287000000000000000000000000000000000000000000000000008e1bc9bf04000000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -2189,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec340000000000000000000000007a51d0b0ee843c572f197c63bbb8277a957c04c50000000000000000000000007a51d0b0ee843c572f197c63bbb8277a957c04c5000000000000000000000000000000000000000000000000017ffe2e934ef3ae00000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -2221,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec340000000000000000000000001b005ed016b926ec8321516ecef995a6f26e1acf0000000000000000000000001b005ed016b926ec8321516ecef995a6f26e1acf000000000000000000000000000000000000000000000000001d0f63876dcf4700000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -2223,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec34000000000000000000000000eda9885b87c565d5570767e9dbd51c87c9c3d55b000000000000000000000000eda9885b87c565d5570767e9dbd51c87c9c3d55b00000000000000000000000000000000000000000000000000a8b5b155656d4100000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -2225,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec3400000000000000000000000001c52385216b430ed9a66450faf3a7e6e764b10f00000000000000000000000001c52385216b430ed9a66450faf3a7e6e764b10f000000000000000000000000000000000000000000000000006a94d74f43000000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -2247,0xcd9d4988c0ae61887b075ba77f08cbfad2b65068,0x3f87ff1de58128ef8fcb4c807efd776e1ac72e51,0xf4f7b41a00000000000000000000000032aa36adfe23c52de8737bdb7c7ebf2db4253e89000000000000000000000000000000000000000000000004c801e112d2aeb229,,,1,true -2248,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec340000000000000000000000005523b536390cab22029250ce3e54d6a4b833d8560000000000000000000000005523b536390cab22029250ce3e54d6a4b833d8560000000000000000000000000000000000000000000000000017210de057c27200000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -2250,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec340000000000000000000000002f939830659501a06f5cbf54d34f27f4fda7a1d80000000000000000000000002f939830659501a06f5cbf54d34f27f4fda7a1d800000000000000000000000000000000000000000000000000071afd498d000000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,0x0009fc3db2db2fe04ba7bd60b141e5fee14a84704713a9f66ae70447f2ca1b95,2021-12-22 17:41:07.000 UTC,0,true -2253,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec34000000000000000000000000fd974c71ae34eb4b1e0fc1c101318525b9588c5e000000000000000000000000fd974c71ae34eb4b1e0fc1c101318525b9588c5e000000000000000000000000000000000000000000000000009893b0d976fa0000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -2254,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec34000000000000000000000000bd132f10241105201d1de0c53c5e4a40c53687bc000000000000000000000000bd132f10241105201d1de0c53c5e4a40c53687bc0000000000000000000000000000000000000000000000000160df505bc2780000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -2257,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec34000000000000000000000000b7a46cb435ccc2756758afdd0475419be9648be1000000000000000000000000b7a46cb435ccc2756758afdd0475419be9648be10000000000000000000000000000000000000000000000000006ea7670eec28000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -2258,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec34000000000000000000000000e17637f59c56d1fbba3c89bd2f59ed09856cb103000000000000000000000000e17637f59c56d1fbba3c89bd2f59ed09856cb1030000000000000000000000000000000000000000000000000142154dfa56894900000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -2260,0x72209fe68386b37a40d6bca04f78356fd342491f,0xe22d2bedb3eca35e6397e0c6d62857094aa26f52,0xef6ebe5e000000000000000000000000000000000000000000000000000000000000000a5e2582c330f89a6bdb96366f93e1985f1097b6ed4de7ed5b70bfe2a3c1b474fd000000000000000000000000000000000000000000000000000000000000008900000000000000000000000000000000000000000000000000000000004c6af600000000000000000000000000000000000000000000000000000000611f2c8b,,,1,true -2263,0x72209fe68386b37a40d6bca04f78356fd342491f,0xe22d2bedb3eca35e6397e0c6d62857094aa26f52,0xef6ebe5e000000000000000000000000000000000000000000000000000000000000000aa6411e6f9bf6c7641b1578fb8946142acfa5ce0f2f784f312955adc7a7e69f700000000000000000000000000000000000000000000000000000000000000001000000000000000000000000000000000000000000000000000000000262ba9e00000000000000000000000000000000000000000000000000000000611fcfb9,,,1,true -2264,0x72209fe68386b37a40d6bca04f78356fd342491f,0xe22d2bedb3eca35e6397e0c6d62857094aa26f52,0xef6ebe5e000000000000000000000000000000000000000000000000000000000000000a81144e8a2805832e702f790068d5a026d1aef165cbe8be26e261121d39dba81c0000000000000000000000000000000000000000000000000000000000000001000000000000000000000000000000000000000000000000000000000268b75400000000000000000000000000000000000000000000000000000000611fd453,,,1,true -2266,0x72209fe68386b37a40d6bca04f78356fd342491f,0xe22d2bedb3eca35e6397e0c6d62857094aa26f52,0xef6ebe5e000000000000000000000000000000000000000000000000000000000000000aec42b9bf3364149cb93bd8ddbb83021fce72d25311ef0fe2d9f30dc9d797e05e000000000000000000000000000000000000000000000000000000000000000100000000000000000000000000000000000000000000000000000000026543c800000000000000000000000000000000000000000000000000000000611fde1d,,,1,true -2267,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec34000000000000000000000000e1f9b4f01b04eb991143e719fd11071c1d0858da000000000000000000000000e1f9b4f01b04eb991143e719fd11071c1d0858da000000000000000000000000000000000000000000000000008719b1b195a7f000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -2268,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec3400000000000000000000000078298487706051b52d7e2beb9bea248d71a2973c00000000000000000000000078298487706051b52d7e2beb9bea248d71a2973c0000000000000000000000000000000000000000000000000006e9a94256e60000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -2269,0x72209fe68386b37a40d6bca04f78356fd342491f,0xe22d2bedb3eca35e6397e0c6d62857094aa26f52,0xef6ebe5e000000000000000000000000000000000000000000000000000000000000000a8014f057a49374783a520278262c85d5ac1632ec96da9c8f7665df29ee866f8f0000000000000000000000000000000000000000000000000000000000000001000000000000000000000000000000000000000000000000000000000263925d00000000000000000000000000000000000000000000000000000000611fe76b,,,1,true -2270,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0xa9f9e675000000000000000000000000a0b86991c6218b36c1d19d4a2e9eb0ce3606eb480000000000000000000000007f5c764cbc14f9669b88837ca1490cca17c31607000000000000000000000000f7801b408c5e3d352e9d67ee2774ae82800bc2d7000000000000000000000000f7801b408c5e3d352e9d67ee2774ae82800bc2d70000000000000000000000000000000000000000000000000000000041f101bf00000000000000000000000000000000000000000000000000000000000000c00000000000000000000000000000000000000000000000000000000000000000,,,1,true -2271,0x72209fe68386b37a40d6bca04f78356fd342491f,0xe22d2bedb3eca35e6397e0c6d62857094aa26f52,0xef6ebe5e000000000000000000000000000000000000000000000000000000000000000a35586a5938c614553ca6ca5b9dbec74bfa0faf069624c182d2cfeaf7190c9d4e000000000000000000000000000000000000000000000000000000000000008900000000000000000000000000000000000000000000000000000000002de8a700000000000000000000000000000000000000000000000000000000611ff26a,,,1,true -2272,0x72209fe68386b37a40d6bca04f78356fd342491f,0xe22d2bedb3eca35e6397e0c6d62857094aa26f52,0xef6ebe5e000000000000000000000000000000000000000000000000000000000000000a4ff42aeeee9e3571108ca7b75914990673291f9ceea74c608cc30a624a1a158b000000000000000000000000000000000000000000000000000000000000006400000000000000000000000000000000000000000000000000000000001e8b5000000000000000000000000000000000000000000000000000000000611ff26a,,,1,true -2274,0x72209fe68386b37a40d6bca04f78356fd342491f,0xe22d2bedb3eca35e6397e0c6d62857094aa26f52,0xef6ebe5e000000000000000000000000000000000000000000000000000000000000000a874a0917d2cb83658c4b3fd040a33bd7d639666f4869bba21841113ec5810226000000000000000000000000000000000000000000000000000000000000006400000000000000000000000000000000000000000000000000000000003d13ef00000000000000000000000000000000000000000000000000000000611ffa9a,,,1,true -2275,0x72209fe68386b37a40d6bca04f78356fd342491f,0xe22d2bedb3eca35e6397e0c6d62857094aa26f52,0xef6ebe5e000000000000000000000000000000000000000000000000000000000000000a7b4515fc57cf8f8d8923d3ac33263b75212b72cedc9b775bee020b419ffefce1000000000000000000000000000000000000000000000000000000000000008900000000000000000000000000000000000000000000000000000000001e89f700000000000000000000000000000000000000000000000000000000611ffa9a,,,1,true -2280,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec340000000000000000000000007964d88f569d11697493b0f28ffff16187504bc30000000000000000000000007964d88f569d11697493b0f28ffff16187504bc30000000000000000000000000000000000000000000000000060a8464a4a83d700000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -2286,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0xa9f9e675000000000000000000000000a0b86991c6218b36c1d19d4a2e9eb0ce3606eb480000000000000000000000007f5c764cbc14f9669b88837ca1490cca17c316070000000000000000000000007b37c58980683179fe841f9b2633ba2fe7bcff4e0000000000000000000000007b37c58980683179fe841f9b2633ba2fe7bcff4e0000000000000000000000000000000000000000000000000000000001e7fdb800000000000000000000000000000000000000000000000000000000000000c00000000000000000000000000000000000000000000000000000000000000000,,,1,true -2304,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec3400000000000000000000000059f846cfd67af3d403728edc0ebbc978f87fa84f00000000000000000000000059f846cfd67af3d403728edc0ebbc978f87fa84f000000000000000000000000000000000000000000000000016116210fb3440000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -2305,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec34000000000000000000000000d87db52a9d80812f67193cf7ab62a38c930a8542000000000000000000000000d87db52a9d80812f67193cf7ab62a38c930a85420000000000000000000000000000000000000000000000000208c8190b1d5aa800000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -2320,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec34000000000000000000000000ac4fbd8ac75bb5ee493c8a9f3d6c94d538f18370000000000000000000000000ac4fbd8ac75bb5ee493c8a9f3d6c94d538f18370000000000000000000000000000000000000000000000000001ee8000d978ec000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -2321,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec3400000000000000000000000012b385a87bb238429ee7ec0ba4554d54a54a6f2c00000000000000000000000012b385a87bb238429ee7ec0ba4554d54a54a6f2c000000000000000000000000000000000000000000000000001eb228ecc3a38000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,0xaed187d0790d27de4effebe7d4c47f50bad5913d9aab71ebe1b105ecf7974c85,2022-04-28 09:27:57.000 UTC,0,true -2347,0xcd9d4988c0ae61887b075ba77f08cbfad2b65068,0x3f87ff1de58128ef8fcb4c807efd776e1ac72e51,0xf4f7b41a000000000000000000000000030048b7d63853bb6439ef75f998a53e803e8929000000000000000000000000000000000000000000000004488a03553e3708d8,0xb412a3a12f61c0d869634e47ba5552f0f393e1eacb0318802a1f49d20556fbfc,2021-12-15 08:47:58.000 UTC,0,true -2364,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec34000000000000000000000000d4a96cde701bec80f26913af8a9ce35610b73470000000000000000000000000d4a96cde701bec80f26913af8a9ce35610b73470000000000000000000000000000000000000000000000000002096a24a68ee0000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -2366,0x10e6593cdda8c58a1d0f14c5164b376352a55f2f,0x467194771dae2967aef3ecbedd3bf9a310c76c65,0xa9f9e6750000000000000000000000006b175474e89094c44da98b954eedeac495271d0f000000000000000000000000da10009cbd5d07dd0cecc66161fc93d7c9000da10000000000000000000000003b522b2dd5d57ba9aa6099bf71511640fba4b9fa0000000000000000000000003b522b2dd5d57ba9aa6099bf71511640fba4b9fa00000000000000000000000000000000000000000000001482b5db9d0d29e31900000000000000000000000000000000000000000000000000000000000000c00000000000000000000000000000000000000000000000000000000000000000,0xb3c832f4ad85b43898ee10552fc91bf1d175cf077c2a5f7ff1bdd4ba644afac6,2022-02-28 07:18:38.000 UTC,0,true -2367,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec340000000000000000000000005d5ff14a0fbd6868d30db8387f68cf14c660db630000000000000000000000005d5ff14a0fbd6868d30db8387f68cf14c660db63000000000000000000000000000000000000000000000000001032894648458900000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -2370,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec34000000000000000000000000c7a2c1075e963886f001cbaa3a099fc04de7d170000000000000000000000000c7a2c1075e963886f001cbaa3a099fc04de7d170000000000000000000000000000000000000000000000000001550f7dca7000000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -2371,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec340000000000000000000000004a19216cead35d27dcb1596d969870b7580cc9840000000000000000000000004a19216cead35d27dcb1596d969870b7580cc9840000000000000000000000000000000000000000000000000152abb7d32a72ac00000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -2376,0xcd9d4988c0ae61887b075ba77f08cbfad2b65068,0x3f87ff1de58128ef8fcb4c807efd776e1ac72e51,0xf4f7b41a000000000000000000000000e6badf702f28de2d4e3efc92cb659821a9bd8981000000000000000000000000000000000000000000000002d6a97ffb1525d343,,,1,true -2378,0xcd9d4988c0ae61887b075ba77f08cbfad2b65068,0x3f87ff1de58128ef8fcb4c807efd776e1ac72e51,0xf4f7b41a000000000000000000000000752d9c212182da8118bffd3574b7c927fb4ff0b5000000000000000000000000000000000000000000000003151cb805af73524f,,,1,true -2379,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec340000000000000000000000002d3afcede3d78797e69d48ac7d72cf7b64e64b030000000000000000000000002d3afcede3d78797e69d48ac7d72cf7b64e64b0300000000000000000000000000000000000000000000000000008be4f825530000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -2380,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec340000000000000000000000006491c142bb7e892dfe01db2ba567bff2681b62dd0000000000000000000000006491c142bb7e892dfe01db2ba567bff2681b62dd000000000000000000000000000000000000000000000000001f02a391cbaec000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -2383,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0xa9f9e675000000000000000000000000a0b86991c6218b36c1d19d4a2e9eb0ce3606eb480000000000000000000000007f5c764cbc14f9669b88837ca1490cca17c316070000000000000000000000002c84bb38abdf4f92c74704f14df7c61ec70208c30000000000000000000000002c84bb38abdf4f92c74704f14df7c61ec70208c3000000000000000000000000000000000000000000000000000000000003ff1c00000000000000000000000000000000000000000000000000000000000000c00000000000000000000000000000000000000000000000000000000000000000,,,1,true -2384,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0xa9f9e675000000000000000000000000a0b86991c6218b36c1d19d4a2e9eb0ce3606eb480000000000000000000000007f5c764cbc14f9669b88837ca1490cca17c316070000000000000000000000007ffa9e0a5a7e31cf71d9643d4a9a0ae769a03d520000000000000000000000007ffa9e0a5a7e31cf71d9643d4a9a0ae769a03d52000000000000000000000000000000000000000000000000000000000004f5fa00000000000000000000000000000000000000000000000000000000000000c00000000000000000000000000000000000000000000000000000000000000000,,,1,true -2385,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec340000000000000000000000009e1ba1f108f829f882a469c7c552583a9a93c6660000000000000000000000009e1ba1f108f829f882a469c7c552583a9a93c666000000000000000000000000000000000000000000000000001afabfcaf096a000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -2386,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec3400000000000000000000000057ddccdd5817017493dc12bbfd4899d2dd74d18b00000000000000000000000057ddccdd5817017493dc12bbfd4899d2dd74d18b000000000000000000000000000000000000000000000000000b4378c885e2b200000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -2387,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0xa9f9e675000000000000000000000000a0b86991c6218b36c1d19d4a2e9eb0ce3606eb480000000000000000000000007f5c764cbc14f9669b88837ca1490cca17c31607000000000000000000000000f7a03f661f5d411e8abc410d3c446c0fbd141225000000000000000000000000f7a03f661f5d411e8abc410d3c446c0fbd1412250000000000000000000000000000000000000000000000000000000000117ddd00000000000000000000000000000000000000000000000000000000000000c00000000000000000000000000000000000000000000000000000000000000000,,,1,true -2388,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0xa9f9e675000000000000000000000000a0b86991c6218b36c1d19d4a2e9eb0ce3606eb480000000000000000000000007f5c764cbc14f9669b88837ca1490cca17c31607000000000000000000000000da4c9aeaad95dfbcf5e4948a00b7bd92da61c582000000000000000000000000da4c9aeaad95dfbcf5e4948a00b7bd92da61c5820000000000000000000000000000000000000000000000000000000000117da000000000000000000000000000000000000000000000000000000000000000c00000000000000000000000000000000000000000000000000000000000000000,,,1,true -2389,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec340000000000000000000000005e014aa0649102e07c074f498845f01bcd5203170000000000000000000000005e014aa0649102e07c074f498845f01bcd52031700000000000000000000000000000000000000000000000001058f45980fbda600000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,0xd1953899c214fa0e7f3ac86438e2aaf96c2225463e55554d0f8b180ac8702d7f,2022-03-23 15:43:41.000 UTC,0,true -2390,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0xa9f9e675000000000000000000000000a0b86991c6218b36c1d19d4a2e9eb0ce3606eb480000000000000000000000007f5c764cbc14f9669b88837ca1490cca17c31607000000000000000000000000153fc0056d2adad8f10f64ab9744acfca5b40c10000000000000000000000000153fc0056d2adad8f10f64ab9744acfca5b40c10000000000000000000000000000000000000000000000000000000000018f24a00000000000000000000000000000000000000000000000000000000000000c00000000000000000000000000000000000000000000000000000000000000000,,,1,true -2391,0xcd9d4988c0ae61887b075ba77f08cbfad2b65068,0x3f87ff1de58128ef8fcb4c807efd776e1ac72e51,0xf4f7b41a0000000000000000000000003478b441e07c418bba592e9ca395a056ddbb45010000000000000000000000000000000000000000000000001a53a97e43dc5a63,,,1,true -2392,0x10e6593cdda8c58a1d0f14c5164b376352a55f2f,0x467194771dae2967aef3ecbedd3bf9a310c76c65,0xa9f9e6750000000000000000000000006b175474e89094c44da98b954eedeac495271d0f000000000000000000000000da10009cbd5d07dd0cecc66161fc93d7c9000da100000000000000000000000028aa0f4a1877bf8d0a8200655849496455619de000000000000000000000000028aa0f4a1877bf8d0a8200655849496455619de0000000000000000000000000000000000000000000000005f68e8131ecf8000000000000000000000000000000000000000000000000000000000000000000c00000000000000000000000000000000000000000000000000000000000000000,0xb4f728821d27575322c4e4ce44203ea942e2b6b236b27d17a550cd8345c63139,2022-03-13 08:28:34.000 UTC,0,true -2394,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec34000000000000000000000000b4d207588ea3593ee5376b22eb61ee2895d8773d000000000000000000000000b4d207588ea3593ee5376b22eb61ee2895d8773d000000000000000000000000000000000000000000000000000024dd1617544000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -2395,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0xa9f9e675000000000000000000000000a0b86991c6218b36c1d19d4a2e9eb0ce3606eb480000000000000000000000007f5c764cbc14f9669b88837ca1490cca17c316070000000000000000000000007ffa9e0a5a7e31cf71d9643d4a9a0ae769a03d520000000000000000000000007ffa9e0a5a7e31cf71d9643d4a9a0ae769a03d52000000000000000000000000000000000000000000000000000000000011741600000000000000000000000000000000000000000000000000000000000000c00000000000000000000000000000000000000000000000000000000000000000,,,1,true -2396,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec34000000000000000000000000b9bd90265b963e6e79fb4e05e1373bd5952975a1000000000000000000000000b9bd90265b963e6e79fb4e05e1373bd5952975a1000000000000000000000000000000000000000000000000001ae124d10f734000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -2397,0x10e6593cdda8c58a1d0f14c5164b376352a55f2f,0x467194771dae2967aef3ecbedd3bf9a310c76c65,0xa9f9e6750000000000000000000000006b175474e89094c44da98b954eedeac495271d0f000000000000000000000000da10009cbd5d07dd0cecc66161fc93d7c9000da10000000000000000000000002c84bb38abdf4f92c74704f14df7c61ec70208c30000000000000000000000002c84bb38abdf4f92c74704f14df7c61ec70208c300000000000000000000000000000000000000000000000004804b94e5d51e5d00000000000000000000000000000000000000000000000000000000000000c00000000000000000000000000000000000000000000000000000000000000000,,,1,true -2398,0x10e6593cdda8c58a1d0f14c5164b376352a55f2f,0x467194771dae2967aef3ecbedd3bf9a310c76c65,0xa9f9e6750000000000000000000000006b175474e89094c44da98b954eedeac495271d0f000000000000000000000000da10009cbd5d07dd0cecc66161fc93d7c9000da10000000000000000000000002d3afcede3d78797e69d48ac7d72cf7b64e64b030000000000000000000000002d3afcede3d78797e69d48ac7d72cf7b64e64b030000000000000000000000000000000000000000000000000e649af5f189030300000000000000000000000000000000000000000000000000000000000000c00000000000000000000000000000000000000000000000000000000000000000,,,1,true -2399,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec340000000000000000000000005cdd5d7618713a7a40b2bb46d128c38872aa0a730000000000000000000000005cdd5d7618713a7a40b2bb46d128c38872aa0a730000000000000000000000000000000000000000000000000013eb1b23eecf4000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -2400,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec34000000000000000000000000eb31d7ac09dab51c9484e71b887da76f72de47ec000000000000000000000000eb31d7ac09dab51c9484e71b887da76f72de47ec00000000000000000000000000000000000000000000000000111c16d8669d2400000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -2401,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec340000000000000000000000001596ebcd5cfac8e21ebc6d28ad5b86b355ee53fc0000000000000000000000001596ebcd5cfac8e21ebc6d28ad5b86b355ee53fc000000000000000000000000000000000000000000000000000ef1ec4b18b1aa00000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -2402,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec34000000000000000000000000656f62ef0c8b808ce950af91ba310ee1982c150e000000000000000000000000656f62ef0c8b808ce950af91ba310ee1982c150e000000000000000000000000000000000000000000000000005d176d8d6319b300000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,0x82f79f1e918d83d7ce006d71669932dab4da57cd055680f142e0b3b6d5b4120b,2022-08-23 19:00:39.000 UTC,0,true -2403,0xcd9d4988c0ae61887b075ba77f08cbfad2b65068,0x3f87ff1de58128ef8fcb4c807efd776e1ac72e51,0xf4f7b41a0000000000000000000000008e17561ffc5177f35671863c1505b8e9ab307383000000000000000000000000000000000000000000000007cb62fd00a16f5867,0xec64e1a8b03a1ea0521a8c766065bf0268c80b62421799ecb6e07e204e617fc2,2021-11-27 19:16:16.000 UTC,0,true -2404,0xcd9d4988c0ae61887b075ba77f08cbfad2b65068,0x3f87ff1de58128ef8fcb4c807efd776e1ac72e51,0xf4f7b41a000000000000000000000000829f0811319625975292ee7d9d22a3a0b408eed900000000000000000000000000000000000000000000000066e97479d5f38001,,,1,true -2406,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec3400000000000000000000000014ad7074ffce47d8ba842ee6b3af8d44c618211900000000000000000000000014ad7074ffce47d8ba842ee6b3af8d44c618211900000000000000000000000000000000000000000000000000749c1193eddde700000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -2407,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec34000000000000000000000000d110a0298fbdb68b9f3b937b3a04cc65b65559b2000000000000000000000000d110a0298fbdb68b9f3b937b3a04cc65b65559b2000000000000000000000000000000000000000000000000006d75356a39401900000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -2408,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec340000000000000000000000005bfd83c76641bea157d670e8e0d42a46ac1442980000000000000000000000005bfd83c76641bea157d670e8e0d42a46ac1442980000000000000000000000000000000000000000000000000b939b7f06a5386900000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -2411,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec3400000000000000000000000058551816ab840af2310ec3ec157b03829fb1078200000000000000000000000058551816ab840af2310ec3ec157b03829fb1078200000000000000000000000000000000000000000000000001250893774bc81c00000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -2412,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec34000000000000000000000000a9035e9c4cdd6d3b3a3983f7ae739853f7840997000000000000000000000000a9035e9c4cdd6d3b3a3983f7ae739853f784099700000000000000000000000000000000000000000000000000470de4df82000000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -2413,0xcd9d4988c0ae61887b075ba77f08cbfad2b65068,0x3f87ff1de58128ef8fcb4c807efd776e1ac72e51,0xf4f7b41a00000000000000000000000052eebd82826a7b530839424ceab6ca3643eb0ef100000000000000000000000000000000000000000000006282064c36a13dcd09,0xf7efeb4ff5c1b56a7a5b5009231c3de3bba516d89e5b6ba93357b31649fcda57,2022-04-26 17:24:38.000 UTC,0,true -2414,0xcd9d4988c0ae61887b075ba77f08cbfad2b65068,0x3f87ff1de58128ef8fcb4c807efd776e1ac72e51,0xf4f7b41a0000000000000000000000003e03819123cc6e06de9692c2bd71da5afd777777000000000000000000000000000000000000000000000000016345785d8a0000,,,1,true -2415,0xcd9d4988c0ae61887b075ba77f08cbfad2b65068,0x3f87ff1de58128ef8fcb4c807efd776e1ac72e51,0xf4f7b41a00000000000000000000000041f0bdbed2122402d6d61815d558bc7b01000000000000000000000000000000000000000000000000000000013fbe85edc90000,,,1,true -2416,0xcd9d4988c0ae61887b075ba77f08cbfad2b65068,0x3f87ff1de58128ef8fcb4c807efd776e1ac72e51,0xf4f7b41a000000000000000000000000bd922eae7bffc9bf320ca224784af09422199999000000000000000000000000000000000000000000000000013fbe85edc90000,,,1,true -2417,0xcd9d4988c0ae61887b075ba77f08cbfad2b65068,0x3f87ff1de58128ef8fcb4c807efd776e1ac72e51,0xf4f7b41a000000000000000000000000b9428f4e0c0c104f89dfd1fd3f4ca89549666666000000000000000000000000000000000000000000000000013fbe85edc90000,,,1,true -2418,0xcd9d4988c0ae61887b075ba77f08cbfad2b65068,0x3f87ff1de58128ef8fcb4c807efd776e1ac72e51,0xf4f7b41a000000000000000000000000a89102b5e397f753c4fca0b0bcb593b290838888000000000000000000000000000000000000000000000000013fbe85edc90000,,,1,true -2419,0xcd9d4988c0ae61887b075ba77f08cbfad2b65068,0x3f87ff1de58128ef8fcb4c807efd776e1ac72e51,0xf4f7b41a00000000000000000000000020a1fef56e50d891475d964ef0f1bb604c355555000000000000000000000000000000000000000000000000013fbe85edc90000,,,1,true -2420,0xcd9d4988c0ae61887b075ba77f08cbfad2b65068,0x3f87ff1de58128ef8fcb4c807efd776e1ac72e51,0xf4f7b41a000000000000000000000000e28777719299c96fb583a73e77989cd54e044444000000000000000000000000000000000000000000000000013fbe85edc90000,,,1,true -2421,0xcd9d4988c0ae61887b075ba77f08cbfad2b65068,0x3f87ff1de58128ef8fcb4c807efd776e1ac72e51,0xf4f7b41a0000000000000000000000006df8ee83068463e578ef77ce2dd8673a01f3333300000000000000000000000000000000000000000000000001476414e1ef6090,,,1,true -2422,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec3400000000000000000000000092f15cbce433fdca0a87fd778e5bbbd0b3d7ee0f00000000000000000000000092f15cbce433fdca0a87fd778e5bbbd0b3d7ee0f0000000000000000000000000000000000000000000000000060517bcadd10bd00000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -2423,0xcd9d4988c0ae61887b075ba77f08cbfad2b65068,0x3f87ff1de58128ef8fcb4c807efd776e1ac72e51,0xf4f7b41a000000000000000000000000c507d79e987d57e8dc72bc92a5c4a38a93cd222200000000000000000000000000000000000000000000000001490f0d55acec32,,,1,true -2424,0xcd9d4988c0ae61887b075ba77f08cbfad2b65068,0x3f87ff1de58128ef8fcb4c807efd776e1ac72e51,0xf4f7b41a0000000000000000000000000dc035f2ba5d9aae02c873aa76714a98e6de1111000000000000000000000000000000000000000000000000014c9c2471a5d84c,,,1,true -2426,0xcd9d4988c0ae61887b075ba77f08cbfad2b65068,0x3f87ff1de58128ef8fcb4c807efd776e1ac72e51,0xf4f7b41a00000000000000000000000092d044230b5d92222fb8ac72913ac3bafee484e5000000000000000000000000000000000000000000000000917f38c76ea7b4ba,0x7f738e959458da4f239c17ffbaf6b79f885fb7ae3be951d00d4039a01d00c110,2022-01-28 18:04:10.000 UTC,0,true -2428,0x10e6593cdda8c58a1d0f14c5164b376352a55f2f,0x467194771dae2967aef3ecbedd3bf9a310c76c65,0xa9f9e6750000000000000000000000006b175474e89094c44da98b954eedeac495271d0f000000000000000000000000da10009cbd5d07dd0cecc66161fc93d7c9000da10000000000000000000000009a0ee0e21f9521e22f4b99c90c2066a38000e49e0000000000000000000000009a0ee0e21f9521e22f4b99c90c2066a38000e49e00000000000000000000000000000000000000000000000137f003f332c7abe800000000000000000000000000000000000000000000000000000000000000c00000000000000000000000000000000000000000000000000000000000000000,,,1,true -2433,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec340000000000000000000000004220418bc912c76f62ca70ec74c176424d0a9f190000000000000000000000004220418bc912c76f62ca70ec74c176424d0a9f190000000000000000000000000000000000000000000000000057fb0f1f80ca9a00000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -2436,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec340000000000000000000000001cf0912a7087c6b2e496414fec70832902b14f4f0000000000000000000000001cf0912a7087c6b2e496414fec70832902b14f4f00000000000000000000000000000000000000000000000000ad4bdaaeaa978200000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -2437,0x10e6593cdda8c58a1d0f14c5164b376352a55f2f,0x467194771dae2967aef3ecbedd3bf9a310c76c65,0xa9f9e6750000000000000000000000006b175474e89094c44da98b954eedeac495271d0f000000000000000000000000da10009cbd5d07dd0cecc66161fc93d7c9000da10000000000000000000000001d5340448b8eb32b1fef1e263755c1ca8bf6a05a0000000000000000000000001d5340448b8eb32b1fef1e263755c1ca8bf6a05a000000000000000000000000000000000000000000000002b5e3af16b188000000000000000000000000000000000000000000000000000000000000000000c00000000000000000000000000000000000000000000000000000000000000000,,,1,true -2438,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec34000000000000000000000000d1b86b6df3b7129fb346c7c2c4b4d179ba17c882000000000000000000000000d1b86b6df3b7129fb346c7c2c4b4d179ba17c8820000000000000000000000000000000000000000000000000122969ceb81410800000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,0x8d9d5b121c9aeb8e630e43068728f17238ac5ca2e9a63a5de5ea7fdccfa93410,2021-12-18 21:13:40.000 UTC,0,true -2440,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec34000000000000000000000000260980ff2c01392b8c4f7f04abc2f50c17c9b21f000000000000000000000000260980ff2c01392b8c4f7f04abc2f50c17c9b21f00000000000000000000000000000000000000000000000000e6edc1fbbc812600000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -2441,0xcd9d4988c0ae61887b075ba77f08cbfad2b65068,0x3f87ff1de58128ef8fcb4c807efd776e1ac72e51,0xf4f7b41a000000000000000000000000293f2986b027575fd7fc337465920185a5b9317e000000000000000000000000000000000000000000000000f9c8f7ba1c978724,,,1,true -2442,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec34000000000000000000000000ee5894bb440342457eea42e46d6af75bedb14805000000000000000000000000ee5894bb440342457eea42e46d6af75bedb14805000000000000000000000000000000000000000000000000006a94d74f43000000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -2448,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec340000000000000000000000001fd8563c594cb7480919a5470ebc21efbacdec9b0000000000000000000000001fd8563c594cb7480919a5470ebc21efbacdec9b000000000000000000000000000000000000000000000000000910f54e8f281800000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -2449,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec3400000000000000000000000054a0644e689df22accd7357c8e249272e79f5fee00000000000000000000000054a0644e689df22accd7357c8e249272e79f5fee00000000000000000000000000000000000000000000000000acf17d214dd73500000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -2450,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec34000000000000000000000000dc14f891346f298e0187720cc744572d3db11ea2000000000000000000000000dc14f891346f298e0187720cc744572d3db11ea20000000000000000000000000000000000000000000000000061aef49888557600000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -2452,0x10e6593cdda8c58a1d0f14c5164b376352a55f2f,0x467194771dae2967aef3ecbedd3bf9a310c76c65,0xa9f9e6750000000000000000000000006b175474e89094c44da98b954eedeac495271d0f000000000000000000000000da10009cbd5d07dd0cecc66161fc93d7c9000da10000000000000000000000009f45fa7845889a3076788e4849b0f5173cc6a76f0000000000000000000000009f45fa7845889a3076788e4849b0f5173cc6a76f00000000000000000000000000000000000000000000000813e1c28d64fd0e8a00000000000000000000000000000000000000000000000000000000000000c00000000000000000000000000000000000000000000000000000000000000000,0xcb403f82501dbce7044e13bfb817fa1b0514499c7edc5c4e01e2e6087032752e,2022-08-04 09:16:07.000 UTC,0,true -2454,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec3400000000000000000000000049f47d08ccff91010bfe5978b011c21472b4aee900000000000000000000000049f47d08ccff91010bfe5978b011c21472b4aee90000000000000000000000000000000000000000000000000070bd6228d2908a00000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -2456,0xcd9d4988c0ae61887b075ba77f08cbfad2b65068,0x3f87ff1de58128ef8fcb4c807efd776e1ac72e51,0xf4f7b41a000000000000000000000000f250345fda1d5e93b4781791556afaf8d696bad70000000000000000000000000000000000000000000000098a1d15c9dc4b24f6,,,1,true -2457,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec34000000000000000000000000fc6b0e0c50837f8a5785a3d03d4323d4cf7d1118000000000000000000000000fc6b0e0c50837f8a5785a3d03d4323d4cf7d111800000000000000000000000000000000000000000000000000052c4d4d7265c000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -2459,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec34000000000000000000000000fdd4186383fafd6bd41d0c59ed84708dfde004ff000000000000000000000000fdd4186383fafd6bd41d0c59ed84708dfde004ff000000000000000000000000000000000000000000000000001b67f2f770897c00000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -2460,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec340000000000000000000000004a64b2820a06a67ee878157a7f48611463d6bd780000000000000000000000004a64b2820a06a67ee878157a7f48611463d6bd7800000000000000000000000000000000000000000000000000b1a2bc2ec5000000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -2467,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec3400000000000000000000000066eeb3fb677bb8945c2750451720b78de421629400000000000000000000000066eeb3fb677bb8945c2750451720b78de42162940000000000000000000000000000000000000000000000000018de76816d800000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -2468,0xcd9d4988c0ae61887b075ba77f08cbfad2b65068,0x3f87ff1de58128ef8fcb4c807efd776e1ac72e51,0xf4f7b41a000000000000000000000000e019d4451a14ea686fb24e49b65b75ef4b05d68c000000000000000000000000000000000000000000000016f511cd75944d8bdc,,,1,true -2475,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec340000000000000000000000001aedc8c5a2f163685d8ea7b93101d57eab683a840000000000000000000000001aedc8c5a2f163685d8ea7b93101d57eab683a8400000000000000000000000000000000000000000000000000001433a2c977c000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -2476,0x10e6593cdda8c58a1d0f14c5164b376352a55f2f,0x467194771dae2967aef3ecbedd3bf9a310c76c65,0xa9f9e6750000000000000000000000006b175474e89094c44da98b954eedeac495271d0f000000000000000000000000da10009cbd5d07dd0cecc66161fc93d7c9000da100000000000000000000000092a686623d801fb043d19dddc0e034dad0958f8c00000000000000000000000092a686623d801fb043d19dddc0e034dad0958f8c00000000000000000000000000000000000000000000010ce9b9d89bf75e8cd500000000000000000000000000000000000000000000000000000000000000c00000000000000000000000000000000000000000000000000000000000000000,,,1,true -2479,0xcd9d4988c0ae61887b075ba77f08cbfad2b65068,0x3f87ff1de58128ef8fcb4c807efd776e1ac72e51,0xf4f7b41a0000000000000000000000006ceb397b68059ca73049874d0a30c62500ae9877000000000000000000000000000000000000000000000000551cd529f91d12d2,,,1,true -2480,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec34000000000000000000000000c3d4a6b3bfe187d7e328514f46db9928c569da21000000000000000000000000c3d4a6b3bfe187d7e328514f46db9928c569da2100000000000000000000000000000000000000000000000006f05b59d3b2000000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -2482,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec3400000000000000000000000091130ce2218265fe0bb02e25b11d652ee664c6f400000000000000000000000091130ce2218265fe0bb02e25b11d652ee664c6f4000000000000000000000000000000000000000000000000015181ff25a9800000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,0xeda0fd3a7d3e2c7f71848a254f6d0c0d3f92055fb997b9c7a98f1bf500c24e69,2022-03-21 15:39:20.000 UTC,0,true -2483,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec340000000000000000000000001dd3f55682eab3ddbf2d48dfb23a7b6bd80e05150000000000000000000000001dd3f55682eab3ddbf2d48dfb23a7b6bd80e0515000000000000000000000000000000000000000000000000008d8990b0236b1300000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -2491,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec34000000000000000000000000397cb2188ed99663640773f68e6198e65bb6184a000000000000000000000000397cb2188ed99663640773f68e6198e65bb6184a000000000000000000000000000000000000000000000000007baddcd1efdb5c00000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -2493,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec34000000000000000000000000e54317d37c4f4231334070e74033fdc37f79e797000000000000000000000000e54317d37c4f4231334070e74033fdc37f79e79700000000000000000000000000000000000000000000000001bce4508f16dd3900000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -2495,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec340000000000000000000000001d031dd22e80c2fd76c6563eb99d21d8e27338d80000000000000000000000001d031dd22e80c2fd76c6563eb99d21d8e27338d80000000000000000000000000000000000000000000000000050636955b7c44b00000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -2496,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec34000000000000000000000000f56b7647799e2c4d2fcf93a62b1b578723718814000000000000000000000000f56b7647799e2c4d2fcf93a62b1b5787237188140000000000000000000000000000000000000000000000000051bae348a043ce00000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -2498,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec3400000000000000000000000028e6aad8fe8a99deb68b78fa400136bb378c952d00000000000000000000000028e6aad8fe8a99deb68b78fa400136bb378c952d00000000000000000000000000000000000000000000000000665a84908f9a0000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -2499,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec34000000000000000000000000304ff03f1526300d5597dfede9a6be316f56569e000000000000000000000000304ff03f1526300d5597dfede9a6be316f56569e000000000000000000000000000000000000000000000000003ff2e795f5000000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -2500,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec340000000000000000000000007b37c58980683179fe841f9b2633ba2fe7bcff4e0000000000000000000000007b37c58980683179fe841f9b2633ba2fe7bcff4e000000000000000000000000000000000000000000000000000d128f5cfdd1c000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -2504,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec340000000000000000000000007fc6d0da9f4078ed1c1badd8dda5fbed257f11df0000000000000000000000007fc6d0da9f4078ed1c1badd8dda5fbed257f11df0000000000000000000000000000000000000000000000000020463c20fa560000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -2512,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec340000000000000000000000002b521bafffbfd6d865f1e859fbd704a2c040ec5b0000000000000000000000002b521bafffbfd6d865f1e859fbd704a2c040ec5b000000000000000000000000000000000000000000000000001ce3ffc8bea00000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -2515,0x10e6593cdda8c58a1d0f14c5164b376352a55f2f,0x467194771dae2967aef3ecbedd3bf9a310c76c65,0xa9f9e6750000000000000000000000006b175474e89094c44da98b954eedeac495271d0f000000000000000000000000da10009cbd5d07dd0cecc66161fc93d7c9000da1000000000000000000000000fb1b20b2b004b3d2022deb478389f40dd1db435c000000000000000000000000fb1b20b2b004b3d2022deb478389f40dd1db435c0000000000000000000000000000000000000000000000072f7c54bcc6334adc00000000000000000000000000000000000000000000000000000000000000c00000000000000000000000000000000000000000000000000000000000000000,,,1,true -2519,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec340000000000000000000000006ea24f3cdddf5b88f90b73a2d7df7ad9c0f9bec40000000000000000000000006ea24f3cdddf5b88f90b73a2d7df7ad9c0f9bec400000000000000000000000000000000000000000000000000720a2bc9e3410000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -2521,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec34000000000000000000000000683b067b7359ebcb3661336f1d72cd9d5798f524000000000000000000000000683b067b7359ebcb3661336f1d72cd9d5798f524000000000000000000000000000000000000000000000000009fa8d5b647958400000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -2529,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec34000000000000000000000000212a80a5cb63e38511c73bc6f33e454e911ee88d000000000000000000000000212a80a5cb63e38511c73bc6f33e454e911ee88d00000000000000000000000000000000000000000000000000d0cc1001476bff00000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -2530,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec3400000000000000000000000069eef3e0f28881385d8d376c5686d10b84e2f21f00000000000000000000000069eef3e0f28881385d8d376c5686d10b84e2f21f00000000000000000000000000000000000000000000000001eda8842809884f00000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -2536,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec340000000000000000000000007daedc837b9795e9235fba7204328d81b1de04200000000000000000000000007daedc837b9795e9235fba7204328d81b1de042000000000000000000000000000000000000000000000000000305f1101d60f0000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -2538,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec3400000000000000000000000037398f95a1ac3ad92c99fc39a7da0b6430d60a5500000000000000000000000037398f95a1ac3ad92c99fc39a7da0b6430d60a5500000000000000000000000000000000000000000000000000fc634dd19c5b7800000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -2543,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec34000000000000000000000000cc6b154fc804c3b2d38ded27c6ec4991da2ecb14000000000000000000000000cc6b154fc804c3b2d38ded27c6ec4991da2ecb14000000000000000000000000000000000000000000000000001e16049a62fa1a00000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -2552,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec340000000000000000000000007f867bc59670b6e263c29058caa87709f4aec3dc0000000000000000000000007f867bc59670b6e263c29058caa87709f4aec3dc0000000000000000000000000000000000000000000000000001c6bf5263400000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -2557,0x10e6593cdda8c58a1d0f14c5164b376352a55f2f,0x467194771dae2967aef3ecbedd3bf9a310c76c65,0xa9f9e6750000000000000000000000006b175474e89094c44da98b954eedeac495271d0f000000000000000000000000da10009cbd5d07dd0cecc66161fc93d7c9000da10000000000000000000000008db4b9289bcf79e3df14e2ba56f1ae0958f5a52f0000000000000000000000008db4b9289bcf79e3df14e2ba56f1ae0958f5a52f0000000000000000000000000000000000000000000000a79241b61e75ccf0b200000000000000000000000000000000000000000000000000000000000000c00000000000000000000000000000000000000000000000000000000000000000,0x9e1de8ac418c884ce295dcfb204cf1f67b40eff398fb966ea72a4786afd5b8cb,2021-11-25 14:13:15.000 UTC,0,true -2560,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec340000000000000000000000001a986b2d01020d4b066a7abebf6163a2b7f350040000000000000000000000001a986b2d01020d4b066a7abebf6163a2b7f350040000000000000000000000000000000000000000000000000005609186d2320000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -2564,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec34000000000000000000000000e8c3a3f1eb0a4f845ae1f2115d18db37ab55f51f000000000000000000000000e8c3a3f1eb0a4f845ae1f2115d18db37ab55f51f00000000000000000000000000000000000000000000000000ecaad21edfd39700000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -2591,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec34000000000000000000000000f05181360129ff94ea193298c939a444e87ffbbd000000000000000000000000f05181360129ff94ea193298c939a444e87ffbbd0000000000000000000000000000000000000000000000000061ca19ef459ffe00000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -2599,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec34000000000000000000000000a670ebdaaa258311a7c33a5bf795f07b97c83430000000000000000000000000a670ebdaaa258311a7c33a5bf795f07b97c834300000000000000000000000000000000000000000000000000008f06e723797c000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -2600,0x10e6593cdda8c58a1d0f14c5164b376352a55f2f,0x467194771dae2967aef3ecbedd3bf9a310c76c65,0xa9f9e6750000000000000000000000006b175474e89094c44da98b954eedeac495271d0f000000000000000000000000da10009cbd5d07dd0cecc66161fc93d7c9000da10000000000000000000000003b8d47f77c537842cfe003ffd751cbb8cf8f9f540000000000000000000000003b8d47f77c537842cfe003ffd751cbb8cf8f9f5400000000000000000000000000000000000000000000000361febd299e69eeec00000000000000000000000000000000000000000000000000000000000000c00000000000000000000000000000000000000000000000000000000000000000,,,1,true -2606,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec34000000000000000000000000f83a8074a017acb923b46464504bdda79c0bd37c000000000000000000000000f83a8074a017acb923b46464504bdda79c0bd37c000000000000000000000000000000000000000000000000009413b666d0c5a400000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -2608,0xcd9d4988c0ae61887b075ba77f08cbfad2b65068,0x3f87ff1de58128ef8fcb4c807efd776e1ac72e51,0xf4f7b41a0000000000000000000000004f24a6e61b7745b86e45f42c2bf19fe049d1ccdf000000000000000000000000000000000000000000000004bf6658ea430e64a6,0x861e35be6eeffc86a70db162e24a895582c5bd39966df80945321f9861947b38,2021-12-19 05:39:03.000 UTC,0,true -2610,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec34000000000000000000000000b6b2818aa57e7d4040c6f1b1307c0d904866a330000000000000000000000000b6b2818aa57e7d4040c6f1b1307c0d904866a3300000000000000000000000000000000000000000000000000050bbd77a62da3700000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,0x67cd886e14856a1ed42cdf19b5b635ff4b88c5e6b10b9584626f59df1a43a79a,2022-05-19 05:33:22.000 UTC,0,true -2611,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec3400000000000000000000000074077879cb2b9c1ec9a5785a7e0ff9afe50583a800000000000000000000000074077879cb2b9c1ec9a5785a7e0ff9afe50583a800000000000000000000000000000000000000000000000001357d433c53d30000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -2613,0xcd9d4988c0ae61887b075ba77f08cbfad2b65068,0x3f87ff1de58128ef8fcb4c807efd776e1ac72e51,0xf4f7b41a00000000000000000000000062443ff3f8733e31945f6b670f4599f9f00416bc0000000000000000000000000000000000000000000000083d6c7aab63600000,,,1,true -2614,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec3400000000000000000000000048b4e85accfb3177a26c6c39f739d867c07485f200000000000000000000000048b4e85accfb3177a26c6c39f739d867c07485f20000000000000000000000000000000000000000000000001cc82a3f025ce2fd00000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,0x2ff323e92f2f0a2801eb8b3c6699b7895b6fd7a52b82ac6949f86c483c2fe4d1,2021-12-10 15:43:21.000 UTC,0,true -2615,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec34000000000000000000000000820edf94cb50e09b0b9d4b945f0bdecd11c321d2000000000000000000000000820edf94cb50e09b0b9d4b945f0bdecd11c321d2000000000000000000000000000000000000000000000000008e1bc9bf04000000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,0xcc27cbd3f25c680cd51f82c48f01dd31e0a245272da05e48db4f8566b2559f22,2022-05-08 00:05:29.000 UTC,0,true -2616,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec3400000000000000000000000059f44829ae4f03a6d673399c99bfcb6eb3716d3200000000000000000000000059f44829ae4f03a6d673399c99bfcb6eb3716d32000000000000000000000000000000000000000000000000023212133018d10000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -2623,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec3400000000000000000000000017b324d8fdafb249cc218c781adf19752e8749d500000000000000000000000017b324d8fdafb249cc218c781adf19752e8749d5000000000000000000000000000000000000000000000000005b37259ff797d200000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -2624,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec340000000000000000000000000becebaf3ba4b6ed68d82b955cc5faa960f189f80000000000000000000000000becebaf3ba4b6ed68d82b955cc5faa960f189f800000000000000000000000000000000000000000000000002c16019ec11060000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -2625,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec3400000000000000000000000063fdb65cca5a9e66b7f8d925758cb935281b0ad200000000000000000000000063fdb65cca5a9e66b7f8d925758cb935281b0ad200000000000000000000000000000000000000000000000002d057154a75863c00000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -2626,0xcd9d4988c0ae61887b075ba77f08cbfad2b65068,0x3f87ff1de58128ef8fcb4c807efd776e1ac72e51,0xf4f7b41a0000000000000000000000000a908362a06b3dbf4496f7d4a298060aaf4307a5000000000000000000000000000000000000000000000000600d20f1c6764b4f,,,1,true -2627,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec3400000000000000000000000078a7b3846f6b0407c051aef02e365a76cef586e000000000000000000000000078a7b3846f6b0407c051aef02e365a76cef586e00000000000000000000000000000000000000000000000000011c37937e0800000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -2633,0xcd9d4988c0ae61887b075ba77f08cbfad2b65068,0x3f87ff1de58128ef8fcb4c807efd776e1ac72e51,0xf4f7b41a000000000000000000000000dbf6045e565f0a2ad62bca011b9878c1a4d111b600000000000000000000000000000000000000000000000005a4473c7470b159,,,1,true -2635,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec34000000000000000000000000ea24f605ff7a7faff0ec68859e9d28b21228aea7000000000000000000000000ea24f605ff7a7faff0ec68859e9d28b21228aea700000000000000000000000000000000000000000000000000b1a2bc2ec5000000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -2644,0xcd9d4988c0ae61887b075ba77f08cbfad2b65068,0x3f87ff1de58128ef8fcb4c807efd776e1ac72e51,0xf4f7b41a000000000000000000000000b604b9311ee4a7e30a47388f9c63ef53e97ab53d00000000000000000000000000000000000000000000000235e0d26160b8d13b,,,1,true -2649,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec34000000000000000000000000ecd1753bde9a17707f86dc4c0219360ece76ee8b000000000000000000000000ecd1753bde9a17707f86dc4c0219360ece76ee8b000000000000000000000000000000000000000000000000005c5304d5a957c000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -2650,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec34000000000000000000000000fa204a1b8d4d8da5577c1eacac9b7e5f3e896c70000000000000000000000000fa204a1b8d4d8da5577c1eacac9b7e5f3e896c700000000000000000000000000000000000000000000000000032673d6532561800000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -2653,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec3400000000000000000000000035aa23fdb2454f7bef15f144011093a5a96ac7c900000000000000000000000035aa23fdb2454f7bef15f144011093a5a96ac7c900000000000000000000000000000000000000000000000000a5a68589526d8000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -2655,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec34000000000000000000000000f65330d04f5000823d0bc6a4f7048457b4ecd1dd000000000000000000000000f65330d04f5000823d0bc6a4f7048457b4ecd1dd000000000000000000000000000000000000000000000000001881eec4489ca700000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -2656,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec3400000000000000000000000022e86ab483084053562ce713e94431c29d1adb8b00000000000000000000000022e86ab483084053562ce713e94431c29d1adb8b000000000000000000000000000000000000000000000000002386f26fc1000000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -2658,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec340000000000000000000000002380cf674acefbc515891f1e47339f4179dcd1630000000000000000000000002380cf674acefbc515891f1e47339f4179dcd163000000000000000000000000000000000000000000000000001dabea82eee40000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -2662,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec340000000000000000000000003477823dc687e24147494b910b367cc85298df8c0000000000000000000000003477823dc687e24147494b910b367cc85298df8c000000000000000000000000000000000000000000000000013fbe85edc9000000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -2666,0xcd9d4988c0ae61887b075ba77f08cbfad2b65068,0x3f87ff1de58128ef8fcb4c807efd776e1ac72e51,0xf4f7b41a000000000000000000000000ad453a7eded500955784cc1be9b44ef8fbd7aa16000000000000000000000000000000000000000000000000a1dfcd400d8107f1,,,1,true -2668,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec3400000000000000000000000074cf8b3d122a3cec3c18bbdcd9325aeac42e147000000000000000000000000074cf8b3d122a3cec3c18bbdcd9325aeac42e14700000000000000000000000000000000000000000000000000de0b6b3a764000000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -2672,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec34000000000000000000000000c80703c13de15b73b2e367d8aabb1b0db3922dfa000000000000000000000000c80703c13de15b73b2e367d8aabb1b0db3922dfa0000000000000000000000000000000000000000000000000024fb5259efd5f100000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -2675,0xcd9d4988c0ae61887b075ba77f08cbfad2b65068,0x3f87ff1de58128ef8fcb4c807efd776e1ac72e51,0xf4f7b41a000000000000000000000000d42ccaa658d460b5dfbcee6bbbeaf1b6667a30f10000000000000000000000000000000000000000000000001becba76eb8e61ce,,,1,true -2680,0xcd9d4988c0ae61887b075ba77f08cbfad2b65068,0x3f87ff1de58128ef8fcb4c807efd776e1ac72e51,0xf4f7b41a0000000000000000000000006c0cf880cb20eefabfb09341fba9e2bd29ad3dfa0000000000000000000000000000000000000000000001f6e605938955c72459,,,1,true -2682,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec34000000000000000000000000b01d0063978e8a6f96dbba91d681fc0c571040e9000000000000000000000000b01d0063978e8a6f96dbba91d681fc0c571040e9000000000000000000000000000000000000000000000000039bb49f599a000000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -2688,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec34000000000000000000000000201bb4f276c765df7225e5a4153e17edd23a67ec000000000000000000000000201bb4f276c765df7225e5a4153e17edd23a67ec0000000000000000000000000000000000000000000000000008e1bc9bf0400000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -2689,0xcd9d4988c0ae61887b075ba77f08cbfad2b65068,0x3f87ff1de58128ef8fcb4c807efd776e1ac72e51,0xf4f7b41a000000000000000000000000fa13b582b9d25da1949af33946803b265cb3f4fe0000000000000000000000000000000000000000000000048987425fb87d8118,,,1,true -2690,0xcd9d4988c0ae61887b075ba77f08cbfad2b65068,0x3f87ff1de58128ef8fcb4c807efd776e1ac72e51,0xf4f7b41a00000000000000000000000042fb05e09f8a477620defe49af76e577cbd791d80000000000000000000000000000000000000000000000017ea782127c5c28f9,,,1,true -2691,0xcd9d4988c0ae61887b075ba77f08cbfad2b65068,0x3f87ff1de58128ef8fcb4c807efd776e1ac72e51,0xf4f7b41a0000000000000000000000002923be587904f3034ffab36c86c495df3c21bc97000000000000000000000000000000000000000000000000513b21cedaeea1be,,,1,true -2694,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec340000000000000000000000002c90f88be812349fdd5655c9bad8288c03e7fb230000000000000000000000002c90f88be812349fdd5655c9bad8288c03e7fb23000000000000000000000000000000000000000000000000015b6a4d48065c0000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -2695,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec340000000000000000000000001060a694e21a2a8da7498a187a71969fafa454e40000000000000000000000001060a694e21a2a8da7498a187a71969fafa454e40000000000000000000000000000000000000000000000000054b271c7c30a3a00000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -2696,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec34000000000000000000000000d86cb47446eb8ca8147718ef1b48bffc9166c79f000000000000000000000000d86cb47446eb8ca8147718ef1b48bffc9166c79f000000000000000000000000000000000000000000000000007df57f97201ec300000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -2697,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec340000000000000000000000006cfe9755269786f6681518c00bd22801f98f9e570000000000000000000000006cfe9755269786f6681518c00bd22801f98f9e5700000000000000000000000000000000000000000000000005866c73ad83c34000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -2703,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec340000000000000000000000009ef1d4af28130d95e3144f92a47ed6230f3e06ce0000000000000000000000009ef1d4af28130d95e3144f92a47ed6230f3e06ce00000000000000000000000000000000000000000000000000dba9fea1ee8e8400000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -2704,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec340000000000000000000000002c90a1f7d2f7a2643e42a1d177505143190b061e0000000000000000000000002c90a1f7d2f7a2643e42a1d177505143190b061e0000000000000000000000000000000000000000000000000055b7cdd04aa64c00000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,0xf1504ae86758b2f13423a094619ea709f7380c570d6ef87409de8c4658253feb,2022-03-15 06:30:48.000 UTC,0,true -2705,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec340000000000000000000000006bad9a464a983fb5e0cb20c5e2b897f168749a870000000000000000000000006bad9a464a983fb5e0cb20c5e2b897f168749a870000000000000000000000000000000000000000000000000061ac0c7d99680f00000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -2707,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec34000000000000000000000000cdbd5046d1ed8ea807ae9f358eb1c1d4fe0dea21000000000000000000000000cdbd5046d1ed8ea807ae9f358eb1c1d4fe0dea2100000000000000000000000000000000000000000000000000a7353341cdfb3f00000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -2710,0x10e6593cdda8c58a1d0f14c5164b376352a55f2f,0x467194771dae2967aef3ecbedd3bf9a310c76c65,0xa9f9e6750000000000000000000000006b175474e89094c44da98b954eedeac495271d0f000000000000000000000000da10009cbd5d07dd0cecc66161fc93d7c9000da1000000000000000000000000de16bf2560329013156a976064e7e67c1ef58f06000000000000000000000000de16bf2560329013156a976064e7e67c1ef58f06000000000000000000000000000000000000000000000005b58e73b33f8053e400000000000000000000000000000000000000000000000000000000000000c00000000000000000000000000000000000000000000000000000000000000000,,,1,true -2711,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0xa9f9e675000000000000000000000000dac17f958d2ee523a2206206994597c13d831ec700000000000000000000000094b008aa00579c1307b0ef2c499ad98a8ce58e58000000000000000000000000848e40641cb32d03324b8db26f29ecc6dc996209000000000000000000000000848e40641cb32d03324b8db26f29ecc6dc99620900000000000000000000000000000000000000000000000000000000069f713400000000000000000000000000000000000000000000000000000000000000c00000000000000000000000000000000000000000000000000000000000000000,,,1,true -2713,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec34000000000000000000000000f776290d2e599ae0f90e04245d4b7590ac228b35000000000000000000000000f776290d2e599ae0f90e04245d4b7590ac228b3500000000000000000000000000000000000000000000000001aad60affb2629a00000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,0xb995009bafd7ce77c1fa13b469c6a7cb3d54c23af5b8cf7d1b4e60d21cf1c294,2022-05-24 09:49:49.000 UTC,0,true -2715,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec340000000000000000000000007988e3ae0d19eff3c8bc567ca0438f6df3cb28130000000000000000000000007988e3ae0d19eff3c8bc567ca0438f6df3cb2813000000000000000000000000000000000000000000000000004cfa9da2e1b05b00000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -2717,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec340000000000000000000000002a030fe052d5269a45e63421e7122226a28941680000000000000000000000002a030fe052d5269a45e63421e7122226a28941680000000000000000000000000000000000000000000000000036721a1286392800000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -2721,0xcd9d4988c0ae61887b075ba77f08cbfad2b65068,0x3f87ff1de58128ef8fcb4c807efd776e1ac72e51,0xf4f7b41a0000000000000000000000007cbff01d1f33dc1933292c0b0e00ec7aaeffa2b300000000000000000000000000000000000000000000000a29daa7e2da799cdc,,,1,true -2723,0x10e6593cdda8c58a1d0f14c5164b376352a55f2f,0x467194771dae2967aef3ecbedd3bf9a310c76c65,0xa9f9e6750000000000000000000000006b175474e89094c44da98b954eedeac495271d0f000000000000000000000000da10009cbd5d07dd0cecc66161fc93d7c9000da10000000000000000000000003b1e3d1ed70d2a17c8eaf7da1a6be9f805a130e20000000000000000000000003b1e3d1ed70d2a17c8eaf7da1a6be9f805a130e2000000000000000000000000000000000000000000000005f47119d59905211b00000000000000000000000000000000000000000000000000000000000000c00000000000000000000000000000000000000000000000000000000000000000,,,1,true -2724,0x10e6593cdda8c58a1d0f14c5164b376352a55f2f,0x467194771dae2967aef3ecbedd3bf9a310c76c65,0xa9f9e6750000000000000000000000006b175474e89094c44da98b954eedeac495271d0f000000000000000000000000da10009cbd5d07dd0cecc66161fc93d7c9000da10000000000000000000000008750e44dd494c88799d0fb0c6200d289c91d35ff0000000000000000000000008750e44dd494c88799d0fb0c6200d289c91d35ff000000000000000000000000000000000000000000000005bb5f25c22079947800000000000000000000000000000000000000000000000000000000000000c00000000000000000000000000000000000000000000000000000000000000000,,,1,true -2729,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec3400000000000000000000000096b3a83fe21c7382e6c5b565744af198dc4bba0300000000000000000000000096b3a83fe21c7382e6c5b565744af198dc4bba03000000000000000000000000000000000000000000000000020fd22ff89d93ff00000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -2730,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec340000000000000000000000005e1703625848a41f9259e928c8d7ecc67b6885700000000000000000000000005e1703625848a41f9259e928c8d7ecc67b688570000000000000000000000000000000000000000000000000020bcef7d40f9da700000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -2732,0x10e6593cdda8c58a1d0f14c5164b376352a55f2f,0x467194771dae2967aef3ecbedd3bf9a310c76c65,0xa9f9e6750000000000000000000000006b175474e89094c44da98b954eedeac495271d0f000000000000000000000000da10009cbd5d07dd0cecc66161fc93d7c9000da1000000000000000000000000e5214a481f2c2bbd501c14dfa66254a8a907cf39000000000000000000000000e5214a481f2c2bbd501c14dfa66254a8a907cf3900000000000000000000000000000000000000000000000057d9ec70c115b49000000000000000000000000000000000000000000000000000000000000000c00000000000000000000000000000000000000000000000000000000000000000,,,1,true -2740,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec34000000000000000000000000927521baeba66f707a77b91910a84ff5ccf3447a000000000000000000000000927521baeba66f707a77b91910a84ff5ccf3447a000000000000000000000000000000000000000000000000015e7ad661da0e0000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -2741,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec3400000000000000000000000013869f635f307b12919502a779cec0a8a9bcd27900000000000000000000000013869f635f307b12919502a779cec0a8a9bcd279000000000000000000000000000000000000000000000000015eb9c35a36510000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -2742,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0xa9f9e675000000000000000000000000a0b86991c6218b36c1d19d4a2e9eb0ce3606eb480000000000000000000000007f5c764cbc14f9669b88837ca1490cca17c31607000000000000000000000000d6c2ca9250bb228d7cf676127213f89ed6a147b0000000000000000000000000d6c2ca9250bb228d7cf676127213f89ed6a147b0000000000000000000000000000000000000000000000000000000000c6c2ddd00000000000000000000000000000000000000000000000000000000000000c00000000000000000000000000000000000000000000000000000000000000000,0xa8d4e2fce610e40ffe0708de338f3101faf19dc5e879469d93fbfcda0a867420,2022-05-29 06:35:11.000 UTC,0,true -2743,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec340000000000000000000000005ccf5ef7c438b95aea40b320ac03e4c9fceba2c70000000000000000000000005ccf5ef7c438b95aea40b320ac03e4c9fceba2c7000000000000000000000000000000000000000000000000004b74318a8d3f0800000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -2745,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec34000000000000000000000000d6c2ca9250bb228d7cf676127213f89ed6a147b0000000000000000000000000d6c2ca9250bb228d7cf676127213f89ed6a147b0000000000000000000000000000000000000000000000000011c37937e08000000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,0x64e20e946fcee8ca97f19b992bbaaa6361b75c284e059c72dd0102dcfc9938fc,2022-05-29 06:27:34.000 UTC,0,true -2746,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0xa9f9e675000000000000000000000000dac17f958d2ee523a2206206994597c13d831ec700000000000000000000000094b008aa00579c1307b0ef2c499ad98a8ce58e58000000000000000000000000349ea0b723e3692a2ddcc0ae5cc85640f372ffd1000000000000000000000000349ea0b723e3692a2ddcc0ae5cc85640f372ffd100000000000000000000000000000000000000000000000000000000036c08a500000000000000000000000000000000000000000000000000000000000000c00000000000000000000000000000000000000000000000000000000000000000,,,1,true -2747,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec34000000000000000000000000485464e51fba9955221a6263edde963dfd302a8b000000000000000000000000485464e51fba9955221a6263edde963dfd302a8b000000000000000000000000000000000000000000000000006b18bc01fe85ac00000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -2752,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec34000000000000000000000000c1c0501bd0d44164955a4ce50a6a753671f4450d000000000000000000000000c1c0501bd0d44164955a4ce50a6a753671f4450d000000000000000000000000000000000000000000000000006e000d68236d9000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -2753,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec3400000000000000000000000022e9a33fb0cc6c1c8c4369b0cd7d042a8845829700000000000000000000000022e9a33fb0cc6c1c8c4369b0cd7d042a884582970000000000000000000000000000000000000000000000000159866b3ad77e0000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -2759,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec340000000000000000000000007c5f132b6e83edce850920328818b09e9163fa720000000000000000000000007c5f132b6e83edce850920328818b09e9163fa720000000000000000000000000000000000000000000000000014c80a80b08d5100000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -2760,0xcd9d4988c0ae61887b075ba77f08cbfad2b65068,0x3f87ff1de58128ef8fcb4c807efd776e1ac72e51,0xf4f7b41a000000000000000000000000aa2f9f0798fab1f08cf508b721e3a81dbe007e83000000000000000000000000000000000000000000000001e8c0be52c16a3746,0xf3b7e907903ae6bacc6a126b331b090a8917ffe41f4d748d7d62fe194c9532bc,2022-03-20 08:34:41.000 UTC,0,true -2764,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec34000000000000000000000000cddfdeec87b3041efca0367fb030bd302c4ef23b000000000000000000000000cddfdeec87b3041efca0367fb030bd302c4ef23b000000000000000000000000000000000000000000000000002386f26fc1000000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -2765,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec34000000000000000000000000528f3840fbad570d84d9b42e00dc3ad0bccd7432000000000000000000000000528f3840fbad570d84d9b42e00dc3ad0bccd7432000000000000000000000000000000000000000000000000001c622f8201330000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -2767,0xcd9d4988c0ae61887b075ba77f08cbfad2b65068,0x3f87ff1de58128ef8fcb4c807efd776e1ac72e51,0xf4f7b41a000000000000000000000000ee49f82e58a1c2b306720d0c68047cbf70c11fb500000000000000000000000000000000000000000000002a0ad5a1bb32740c43,,,1,true -2768,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec3400000000000000000000000029b9650303f11b3f3b41ea8d6ee4372b460fdef400000000000000000000000029b9650303f11b3f3b41ea8d6ee4372b460fdef40000000000000000000000000000000000000000000000000008c7bd44e0930000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -2770,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec34000000000000000000000000d4a089e9def16a9ba97fc768dd0a5a3e6912c1b0000000000000000000000000d4a089e9def16a9ba97fc768dd0a5a3e6912c1b00000000000000000000000000000000000000000000000000036f88e8c4122e400000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,0x0b1bb9824c3715158ea500526bbf6d7cad10b6dd716a964e4fe83b48d386a5b9,2022-03-31 02:53:20.000 UTC,0,true -2772,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec340000000000000000000000000b8011ebb5e71100f49c7283e44e00d31bdce3920000000000000000000000000b8011ebb5e71100f49c7283e44e00d31bdce39200000000000000000000000000000000000000000000000000013e52b9abe00000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -2773,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec340000000000000000000000008b75af058d0095f334445e157a0eda61d649438c0000000000000000000000008b75af058d0095f334445e157a0eda61d649438c000000000000000000000000000000000000000000000000001167441342593f00000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -2774,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec3400000000000000000000000074ab161045a668b624085fd8cb5c22946e74afca00000000000000000000000074ab161045a668b624085fd8cb5c22946e74afca000000000000000000000000000000000000000000000000000e9bf49997757e00000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -2775,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec34000000000000000000000000c59ae3244f81ec51017943b1ed98cccc2345eaba000000000000000000000000c59ae3244f81ec51017943b1ed98cccc2345eaba000000000000000000000000000000000000000000000000000ffab1e53bf47800000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -2776,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0xa9f9e675000000000000000000000000a0b86991c6218b36c1d19d4a2e9eb0ce3606eb480000000000000000000000007f5c764cbc14f9669b88837ca1490cca17c31607000000000000000000000000e31c6a20381739291ee364ccfc0264cb7d3d9a0d000000000000000000000000e31c6a20381739291ee364ccfc0264cb7d3d9a0d0000000000000000000000000000000000000000000000000000000000175fc800000000000000000000000000000000000000000000000000000000000000c00000000000000000000000000000000000000000000000000000000000000000,,,1,true -2778,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0xa9f9e675000000000000000000000000a0b86991c6218b36c1d19d4a2e9eb0ce3606eb480000000000000000000000007f5c764cbc14f9669b88837ca1490cca17c316070000000000000000000000006c7409e7fd8ae66d0c5dde1e3b9093fbd0c69d670000000000000000000000006c7409e7fd8ae66d0c5dde1e3b9093fbd0c69d67000000000000000000000000000000000000000000000000000000000010f01d00000000000000000000000000000000000000000000000000000000000000c00000000000000000000000000000000000000000000000000000000000000000,,,1,true -2779,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec34000000000000000000000000e4e92a22fe7795aec2decf363d8f2e8bcf25105f000000000000000000000000e4e92a22fe7795aec2decf363d8f2e8bcf25105f000000000000000000000000000000000000000000000000000db8581f46825500000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -2780,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec34000000000000000000000000010217b5aa4704eab4c3224a5b1f3df610aa4aa7000000000000000000000000010217b5aa4704eab4c3224a5b1f3df610aa4aa700000000000000000000000000000000000000000000000000182d74b2f4e09100000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -2781,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec340000000000000000000000004efc2658a6f7e83527ac5d9897bb0f849fc4078a0000000000000000000000004efc2658a6f7e83527ac5d9897bb0f849fc4078a000000000000000000000000000000000000000000000000001772b8fe82566700000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -2782,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec34000000000000000000000000e4835ead0fe80bc3dcb4861f4bc14163aae9711f000000000000000000000000e4835ead0fe80bc3dcb4861f4bc14163aae9711f0000000000000000000000000000000000000000000000000018a8a5dd968cec00000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -2783,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec340000000000000000000000005696a90261307b12e96228549c71ae507c2895450000000000000000000000005696a90261307b12e96228549c71ae507c28954500000000000000000000000000000000000000000000000000184fe00fb5e8fd00000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -2784,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec340000000000000000000000008fae2b127c268174afaf3a022b365790096ba6b10000000000000000000000008fae2b127c268174afaf3a022b365790096ba6b100000000000000000000000000000000000000000000000000170c06142a0a6b00000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -2785,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec34000000000000000000000000a2b23a99acb2c5c3cfda13df9bf803d797afc975000000000000000000000000a2b23a99acb2c5c3cfda13df9bf803d797afc9750000000000000000000000000000000000000000000000000015a00e8ac60baf00000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -2786,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec340000000000000000000000005b0152655d10ac5689247d4a6c2229d01da444a80000000000000000000000005b0152655d10ac5689247d4a6c2229d01da444a8000000000000000000000000000000000000000000000000001530bfd662b83600000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -2788,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec34000000000000000000000000396ae68e4526f1f46245283a066c912d4d4fd24e000000000000000000000000396ae68e4526f1f46245283a066c912d4d4fd24e000000000000000000000000000000000000000000000000002a5c1dc6ce4e3d00000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -2789,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec34000000000000000000000000f6649002c7dee59a4019b1aa722c351c3a8e2af8000000000000000000000000f6649002c7dee59a4019b1aa722c351c3a8e2af80000000000000000000000000000000000000000000000000000b7a9e8e0cb4400000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -2792,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec340000000000000000000000005c797bbeefc7aa6124ec07ea6a0c581d9cb48fa70000000000000000000000005c797bbeefc7aa6124ec07ea6a0c581d9cb48fa700000000000000000000000000000000000000000000000000ae153d89fe800000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -2793,0x10e6593cdda8c58a1d0f14c5164b376352a55f2f,0x467194771dae2967aef3ecbedd3bf9a310c76c65,0xa9f9e6750000000000000000000000006b175474e89094c44da98b954eedeac495271d0f000000000000000000000000da10009cbd5d07dd0cecc66161fc93d7c9000da1000000000000000000000000456e580211757f57cb0eefb35db9283b2a969cb8000000000000000000000000456e580211757f57cb0eefb35db9283b2a969cb800000000000000000000000000000000000000000000000315f58f68cba75b2f00000000000000000000000000000000000000000000000000000000000000c00000000000000000000000000000000000000000000000000000000000000000,0xa4e209aff277776b5e52d8193c789b03f0a2486d10fe5347648eae33190362b3,2022-03-12 12:08:07.000 UTC,0,true -2796,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec340000000000000000000000001ae748c5a1358726a5935a658b5c8ddb3fecca6a0000000000000000000000001ae748c5a1358726a5935a658b5c8ddb3fecca6a00000000000000000000000000000000000000000000000000055ad034145b4000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -2798,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec34000000000000000000000000c02fadedc679cec2889bbaf8997caa1a7e06231e000000000000000000000000c02fadedc679cec2889bbaf8997caa1a7e06231e000000000000000000000000000000000000000000000000002386f26fc1000000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -2799,0xcd9d4988c0ae61887b075ba77f08cbfad2b65068,0x3f87ff1de58128ef8fcb4c807efd776e1ac72e51,0xf4f7b41a000000000000000000000000a48ccb8eaaa1e7450fe4a3c0988686ab07ec47d50000000000000000000000000000000000000000000000007a911de7cb73821e,,,1,true -2801,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec34000000000000000000000000de64ab675699eadb0abf518d6dbe2d2b90c0641f000000000000000000000000de64ab675699eadb0abf518d6dbe2d2b90c0641f000000000000000000000000000000000000000000000000015b372f422f8a0000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -2805,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec3400000000000000000000000004287dc8c78f605812d00c102663ebcec851e1c200000000000000000000000004287dc8c78f605812d00c102663ebcec851e1c2000000000000000000000000000000000000000000000000015b7b6c8aaee60000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -2807,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec34000000000000000000000000c61b1d11cd97842068b40af602a3efb53518124d000000000000000000000000c61b1d11cd97842068b40af602a3efb53518124d0000000000000000000000000000000000000000000000000d7fa27a7bce38ef00000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -2808,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec3400000000000000000000000049f9307536739580deb16f2dae82ba0d25a23b4700000000000000000000000049f9307536739580deb16f2dae82ba0d25a23b47000000000000000000000000000000000000000000000000068609e5f48d0b9900000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -2809,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec34000000000000000000000000d678a8f39dcb33503082220d143a55c58eee15af000000000000000000000000d678a8f39dcb33503082220d143a55c58eee15af00000000000000000000000000000000000000000000000001ecc30c778542f800000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -2810,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec34000000000000000000000000a34faa5b9b9e29c191e163a520edeea93a574ba3000000000000000000000000a34faa5b9b9e29c191e163a520edeea93a574ba3000000000000000000000000000000000000000000000000011684a847196e8400000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -2811,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0xa9f9e675000000000000000000000000dac17f958d2ee523a2206206994597c13d831ec700000000000000000000000094b008aa00579c1307b0ef2c499ad98a8ce58e58000000000000000000000000740f3065217ff67e3a13e2634600aed26d9a1368000000000000000000000000740f3065217ff67e3a13e2634600aed26d9a1368000000000000000000000000000000000000000000000000000000000381797400000000000000000000000000000000000000000000000000000000000000c00000000000000000000000000000000000000000000000000000000000000000,,,1,true -2816,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec34000000000000000000000000310a744e293ed94f411f9e20764e50af370190d5000000000000000000000000310a744e293ed94f411f9e20764e50af370190d500000000000000000000000000000000000000000000000000aa19927f459e0000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -2820,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec340000000000000000000000005aa8cd3337559a8f230d2043520474fbc19328b20000000000000000000000005aa8cd3337559a8f230d2043520474fbc19328b200000000000000000000000000000000000000000000000004db73254763000000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -2821,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec340000000000000000000000002a08325ad00da971cb66a5e9e04ad3529b8f59ab0000000000000000000000002a08325ad00da971cb66a5e9e04ad3529b8f59ab00000000000000000000000000000000000000000000000000cf4e65ae9c6fc700000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -2822,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec34000000000000000000000000a5835487b38fceafb04a4025dd16cecc8b8c70e3000000000000000000000000a5835487b38fceafb04a4025dd16cecc8b8c70e300000000000000000000000000000000000000000000000006ea9a5446b41b0000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -2823,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0xa9f9e6750000000000000000000000001f9840a85d5af5bf1d1762f925bdaddc4201f9840000000000000000000000006fd9d7ad17242c41f7131d257212c54a0e8166910000000000000000000000004b5f7206945951dc0bcf4c0bc5496dbee692a2c90000000000000000000000004b5f7206945951dc0bcf4c0bc5496dbee692a2c900000000000000000000000000000000000000000000000088fbc15536255e2f00000000000000000000000000000000000000000000000000000000000000c00000000000000000000000000000000000000000000000000000000000000000,,,1,true -2825,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec34000000000000000000000000d923afc2fa9c1e04c496a5d5c52a611244f62e0e000000000000000000000000d923afc2fa9c1e04c496a5d5c52a611244f62e0e000000000000000000000000000000000000000000000000006df46b0a5152b800000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -2827,0xcd9d4988c0ae61887b075ba77f08cbfad2b65068,0x3f87ff1de58128ef8fcb4c807efd776e1ac72e51,0xf4f7b41a000000000000000000000000eccd7127ed5c291fb1e91ef5aa62113d30769345000000000000000000000000000000000000000000000000bea27ec6e3d26de1,,,1,true -2828,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec340000000000000000000000005fd34bf29b43d7eedbd91dc664224ecb835a69270000000000000000000000005fd34bf29b43d7eedbd91dc664224ecb835a69270000000000000000000000000000000000000000000000000418c346d46fef0000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,0xc7828d0a187f65f16ca3efc2d6d710866b6b4e5fac1fd06683ee587a9aa5ba55,2022-01-12 15:50:56.000 UTC,0,true -2829,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec3400000000000000000000000088371ada6fc43d0fddc693bdf325b0cd50360dc300000000000000000000000088371ada6fc43d0fddc693bdf325b0cd50360dc3000000000000000000000000000000000000000000000000004e45ceeb63677100000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -2832,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec34000000000000000000000000fd64a097f72382e6d32a0712cdfdd45cc72b1a03000000000000000000000000fd64a097f72382e6d32a0712cdfdd45cc72b1a03000000000000000000000000000000000000000000000000002386f26fc1000000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -2833,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec340000000000000000000000002d86222e339787a874179a41c598bca46d5d3c9f0000000000000000000000002d86222e339787a874179a41c598bca46d5d3c9f000000000000000000000000000000000000000000000000008e1bc9bf04000000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -2836,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec34000000000000000000000000b3430b686daa829162d2aba22c815ad3b5882f00000000000000000000000000b3430b686daa829162d2aba22c815ad3b5882f0000000000000000000000000000000000000000000000000000038d7ea4c6800000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -2837,0xcd9d4988c0ae61887b075ba77f08cbfad2b65068,0x3f87ff1de58128ef8fcb4c807efd776e1ac72e51,0xf4f7b41a000000000000000000000000dc5edfeb777bdfaa851ebda34c102162738290da00000000000000000000000000000000000000000000000104af5f608946e774,,,1,true -2838,0xcd9d4988c0ae61887b075ba77f08cbfad2b65068,0x3f87ff1de58128ef8fcb4c807efd776e1ac72e51,0xf4f7b41a000000000000000000000000f7712f47bb2527b76a011656947b964c2f5733ba0000000000000000000000000000000000000000000000000fd25b65ebd0b805,,,1,true -2839,0xcd9d4988c0ae61887b075ba77f08cbfad2b65068,0x3f87ff1de58128ef8fcb4c807efd776e1ac72e51,0xf4f7b41a000000000000000000000000c1df5e5f5ac6112c9e6677550eb5e53e59651b3c000000000000000000000000000000000000000000000027fac89b0704e5bb61,,,1,true -2842,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec340000000000000000000000004be3ea1967d4117c93a39048316c058025e237c40000000000000000000000004be3ea1967d4117c93a39048316c058025e237c400000000000000000000000000000000000000000000000000470de4df82000000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -2844,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0xa9f9e675000000000000000000000000a0b86991c6218b36c1d19d4a2e9eb0ce3606eb480000000000000000000000007f5c764cbc14f9669b88837ca1490cca17c316070000000000000000000000004647116a410ca5e80ee2be0077335bbf0db351660000000000000000000000004647116a410ca5e80ee2be0077335bbf0db35166000000000000000000000000000000000000000000000000000000001dcd650000000000000000000000000000000000000000000000000000000000000000c00000000000000000000000000000000000000000000000000000000000000000,0x420ea7b3d530ee2cde60866f7e6dabc23414239c66f8954b8cacc7dd589b9eb6,2022-03-12 11:55:14.000 UTC,0,true -2845,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec340000000000000000000000002fa11fbb46e2e09c5e648780e2058d490075374a0000000000000000000000002fa11fbb46e2e09c5e648780e2058d490075374a000000000000000000000000000000000000000000000000002a2f3497df273500000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -2846,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec3400000000000000000000000077ca57216b0c71c3497ec7e62d622f559507333100000000000000000000000077ca57216b0c71c3497ec7e62d622f5595073331000000000000000000000000000000000000000000000000058503666c60fd0000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,0xabba7e32fabcbc9565be73583a7d5a8c64b3a234f4568ac2096fde18fb768567,2022-01-12 15:07:55.000 UTC,0,true -2847,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec34000000000000000000000000ea45236ceafd11e1771010ee65f3068f7b5d8875000000000000000000000000ea45236ceafd11e1771010ee65f3068f7b5d887500000000000000000000000000000000000000000000000000aa6ce9eee55c0000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -2849,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec34000000000000000000000000d62966761b3451e272f3498b8f1692b1c5cf6666000000000000000000000000d62966761b3451e272f3498b8f1692b1c5cf6666000000000000000000000000000000000000000000000000015a1e1ddbc6a30000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -2850,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec34000000000000000000000000ffec51798fef19426dfb32260a0967f9f7e6fd49000000000000000000000000ffec51798fef19426dfb32260a0967f9f7e6fd490000000000000000000000000000000000000000000000000244ac7c10ec94cf00000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -2851,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec34000000000000000000000000c26936faf3a8377211cf21ad6901c830f5fe960d000000000000000000000000c26936faf3a8377211cf21ad6901c830f5fe960d00000000000000000000000000000000000000000000000001553324fa1908fe00000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -2853,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec34000000000000000000000000cd041ba479812a3fb310f9553ce57830cb2e351d000000000000000000000000cd041ba479812a3fb310f9553ce57830cb2e351d0000000000000000000000000000000000000000000000001c4a7575523a3dad00000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -2858,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec34000000000000000000000000fc1199a5a915a162542ca155d432955151202f0c000000000000000000000000fc1199a5a915a162542ca155d432955151202f0c0000000000000000000000000000000000000000000000000043115f2cedc40900000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -2861,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec340000000000000000000000002a8b65faa0017439057d066e1ab0c597f455b2000000000000000000000000002a8b65faa0017439057d066e1ab0c597f455b20000000000000000000000000000000000000000000000000000567030cb69454600000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -2867,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec34000000000000000000000000532cb3e10f461280946d139ccb2bf1bd64ba047a000000000000000000000000532cb3e10f461280946d139ccb2bf1bd64ba047a00000000000000000000000000000000000000000000000000624e9f1e41320000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -2870,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0xa9f9e675000000000000000000000000dac17f958d2ee523a2206206994597c13d831ec700000000000000000000000094b008aa00579c1307b0ef2c499ad98a8ce58e580000000000000000000000003a0fbb2f36271ff92ed8a16ca0343a0f320cfcd50000000000000000000000003a0fbb2f36271ff92ed8a16ca0343a0f320cfcd500000000000000000000000000000000000000000000000000000000058e37e000000000000000000000000000000000000000000000000000000000000000c00000000000000000000000000000000000000000000000000000000000000000,,,1,true -2873,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec34000000000000000000000000a1a56693e8bde18b243a243c925fb2c9f411c205000000000000000000000000a1a56693e8bde18b243a243c925fb2c9f411c205000000000000000000000000000000000000000000000000005cbb71417b494900000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -2876,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec34000000000000000000000000662cc488fb749f4ed36396d23cfae84744d692ac000000000000000000000000662cc488fb749f4ed36396d23cfae84744d692ac00000000000000000000000000000000000000000000000004c9bc631c7f16cf00000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -2883,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec340000000000000000000000007f2204f49157651f314395f4703622e3fdc8df4e0000000000000000000000007f2204f49157651f314395f4703622e3fdc8df4e000000000000000000000000000000000000000000000000015935fda850290000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -2889,0xcd9d4988c0ae61887b075ba77f08cbfad2b65068,0x3f87ff1de58128ef8fcb4c807efd776e1ac72e51,0xf4f7b41a00000000000000000000000099a78666b72cb7c0e580e8fc77243146c8fddf59000000000000000000000000000000000000000000000000e86af39d60950e42,,,1,true -2890,0xcd9d4988c0ae61887b075ba77f08cbfad2b65068,0x3f87ff1de58128ef8fcb4c807efd776e1ac72e51,0xf4f7b41a00000000000000000000000069568f518102ea935ad2076d088243c6ab0d490f00000000000000000000000000000000000000000000000c5f79a53c5e43c96b,0x818d745b274097ace211a8f7bd36e05aa8a670ebcfe147b177abc3386dad9292,2021-11-28 01:39:28.000 UTC,0,true -2896,0xcd9d4988c0ae61887b075ba77f08cbfad2b65068,0x3f87ff1de58128ef8fcb4c807efd776e1ac72e51,0xf4f7b41a000000000000000000000000c2768e9353bf078ace3c345d279e27d393d5c4870000000000000000000000000000000000000000000000076511ac44d3090000,,,1,true -2902,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec340000000000000000000000000c82508ef698a893a603d5935305af7c319d61980000000000000000000000000c82508ef698a893a603d5935305af7c319d619800000000000000000000000000000000000000000000000000455d7255ca200000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -2905,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec3400000000000000000000000073d321b0d6639890a13b833777b6fd2b666b16e400000000000000000000000073d321b0d6639890a13b833777b6fd2b666b16e4000000000000000000000000000000000000000000000000001c4442cc2e120000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -2908,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec34000000000000000000000000f433bdbf45ae8396805f5882c9f395b246e62af8000000000000000000000000f433bdbf45ae8396805f5882c9f395b246e62af800000000000000000000000000000000000000000000000002c4b8a81e45a56700000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -2911,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec3400000000000000000000000024f1bb02c7195769acb9fd1d24fdeee6409df62000000000000000000000000024f1bb02c7195769acb9fd1d24fdeee6409df6200000000000000000000000000000000000000000000000000031bced02db000000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,0xba87426646b7d517a2f7dedcaa761d0dba7714ac0ae9a71fc683543872c7823d,2022-04-11 11:24:29.000 UTC,0,true -2913,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec34000000000000000000000000d94c5888ef3ab24ad580e8cd04dbc2e2a847b815000000000000000000000000d94c5888ef3ab24ad580e8cd04dbc2e2a847b81500000000000000000000000000000000000000000000000000038d7ea4c6800000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -2914,0xcd9d4988c0ae61887b075ba77f08cbfad2b65068,0x3f87ff1de58128ef8fcb4c807efd776e1ac72e51,0xf4f7b41a0000000000000000000000006e401916f9e149f20a1e3137d2897f843b510c64000000000000000000000000000000000000000000000000fd20433c6ed22175,,,1,true -2915,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec340000000000000000000000007d600fee9e4162c74a59c7ca3973342d8aa491c70000000000000000000000007d600fee9e4162c74a59c7ca3973342d8aa491c70000000000000000000000000000000000000000000000000008f7bf72006d2000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -2916,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec34000000000000000000000000f9461f543b102000193c3d7438d11f9135121f24000000000000000000000000f9461f543b102000193c3d7438d11f9135121f240000000000000000000000000000000000000000000000000012ae0b321c689100000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -2917,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec34000000000000000000000000731773eb516e29d9fa37710d9e5dcdc25411d5af000000000000000000000000731773eb516e29d9fa37710d9e5dcdc25411d5af0000000000000000000000000000000000000000000000000035deecb7c78e8300000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -2920,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec3400000000000000000000000050212068f8968b5ce25acdf662f030635d1aaecb00000000000000000000000050212068f8968b5ce25acdf662f030635d1aaecb000000000000000000000000000000000000000000000000017507f7e547903000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -2921,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0xa9f9e675000000000000000000000000dac17f958d2ee523a2206206994597c13d831ec700000000000000000000000094b008aa00579c1307b0ef2c499ad98a8ce58e5800000000000000000000000052a38af7d4000a763da8e6164286b59aaf11c51d00000000000000000000000052a38af7d4000a763da8e6164286b59aaf11c51d0000000000000000000000000000000000000000000000000000000029f24ffb00000000000000000000000000000000000000000000000000000000000000c00000000000000000000000000000000000000000000000000000000000000000,,,1,true -2923,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec34000000000000000000000000b843de66d048e87d986c6dda826a79e9a724d894000000000000000000000000b843de66d048e87d986c6dda826a79e9a724d8940000000000000000000000000000000000000000000000000086bd4808b2ee8900000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -2925,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec3400000000000000000000000045852f7653d50d9178545a024fb8d47840e7ca0800000000000000000000000045852f7653d50d9178545a024fb8d47840e7ca0800000000000000000000000000000000000000000000000008fdde787fc0c10000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -2931,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec3400000000000000000000000062183389f5ff91af9eef1c832ef5913bc34656f100000000000000000000000062183389f5ff91af9eef1c832ef5913bc34656f10000000000000000000000000000000000000000000000000048e3db2425d2fc00000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,0x9674231b5f21ffcbdca38352610cedae60f3b2ba80d05dbec936a68ea54c0a2b,2022-05-22 14:36:08.000 UTC,0,true -2935,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec340000000000000000000000009b17f6649326e8f8399dacd0ecd69e7251ca92700000000000000000000000009b17f6649326e8f8399dacd0ecd69e7251ca927000000000000000000000000000000000000000000000000000bfb0c17e5571c000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -2936,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec34000000000000000000000000c3dfba44f5c693315d33d85dd5ca965e09bbcbcb000000000000000000000000c3dfba44f5c693315d33d85dd5ca965e09bbcbcb0000000000000000000000000000000000000000000000000032bae7a20a5dd600000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -2939,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec340000000000000000000000007f3d41662bcfbf1ebb14917fcc006ee8ddf3fc7f0000000000000000000000007f3d41662bcfbf1ebb14917fcc006ee8ddf3fc7f000000000000000000000000000000000000000000000000001471362cbd76c000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -2940,0xcd9d4988c0ae61887b075ba77f08cbfad2b65068,0x3f87ff1de58128ef8fcb4c807efd776e1ac72e51,0xf4f7b41a000000000000000000000000f7674c70da5241c4f16c33988d6fa879c19072fd00000000000000000000000000000000000000000000000117651c236f3d320f,,,1,true -2943,0xcd9d4988c0ae61887b075ba77f08cbfad2b65068,0x3f87ff1de58128ef8fcb4c807efd776e1ac72e51,0xf4f7b41a00000000000000000000000041ceb0d694110b702e2999e54d192c3db4a469760000000000000000000000000000000000000000000000011d744b20a777d1ff,,,1,true -2946,0xcd9d4988c0ae61887b075ba77f08cbfad2b65068,0x3f87ff1de58128ef8fcb4c807efd776e1ac72e51,0xf4f7b41a0000000000000000000000004c622a5d55c5cf1bfb8d639ffe702f62a5f77af2000000000000000000000000000000000000000000000009b070adf56505f299,,,1,true -2947,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0xa9f9e675000000000000000000000000a0b86991c6218b36c1d19d4a2e9eb0ce3606eb480000000000000000000000007f5c764cbc14f9669b88837ca1490cca17c31607000000000000000000000000a13a510a8fe699c3eb703a5796475536b956aff9000000000000000000000000a13a510a8fe699c3eb703a5796475536b956aff900000000000000000000000000000000000000000000000000000000001053b000000000000000000000000000000000000000000000000000000000000000c00000000000000000000000000000000000000000000000000000000000000000,,,1,true -2948,0x10e6593cdda8c58a1d0f14c5164b376352a55f2f,0x467194771dae2967aef3ecbedd3bf9a310c76c65,0xa9f9e6750000000000000000000000006b175474e89094c44da98b954eedeac495271d0f000000000000000000000000da10009cbd5d07dd0cecc66161fc93d7c9000da10000000000000000000000001a4decf9f5756ca8cefc99651527dd207403a9f30000000000000000000000001a4decf9f5756ca8cefc99651527dd207403a9f30000000000000000000000000000000000000000000000000efcee47256c000000000000000000000000000000000000000000000000000000000000000000c00000000000000000000000000000000000000000000000000000000000000000,,,1,true -2949,0x10e6593cdda8c58a1d0f14c5164b376352a55f2f,0x467194771dae2967aef3ecbedd3bf9a310c76c65,0xa9f9e6750000000000000000000000006b175474e89094c44da98b954eedeac495271d0f000000000000000000000000da10009cbd5d07dd0cecc66161fc93d7c9000da100000000000000000000000046354310e7621674983306ab8a5085f27a12747a00000000000000000000000046354310e7621674983306ab8a5085f27a12747a0000000000000000000000000000000000000000000000000f207539952d000000000000000000000000000000000000000000000000000000000000000000c00000000000000000000000000000000000000000000000000000000000000000,,,1,true -2950,0x10e6593cdda8c58a1d0f14c5164b376352a55f2f,0x467194771dae2967aef3ecbedd3bf9a310c76c65,0xa9f9e6750000000000000000000000006b175474e89094c44da98b954eedeac495271d0f000000000000000000000000da10009cbd5d07dd0cecc66161fc93d7c9000da1000000000000000000000000ec4e39fa0442cbef61f9a9a09e696f599d1e0dfa000000000000000000000000ec4e39fa0442cbef61f9a9a09e696f599d1e0dfa0000000000000000000000000000000000000000000000000f43fc2c04ee000000000000000000000000000000000000000000000000000000000000000000c00000000000000000000000000000000000000000000000000000000000000000,,,1,true -2952,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec34000000000000000000000000a30bad98f277222ef1b732ee5d4d442f90c5b035000000000000000000000000a30bad98f277222ef1b732ee5d4d442f90c5b035000000000000000000000000000000000000000000000000002386f26fc1000000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -2953,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec34000000000000000000000000f6aae268ffdfd96eb01866c8b7b0b12cbdb73ac4000000000000000000000000f6aae268ffdfd96eb01866c8b7b0b12cbdb73ac400000000000000000000000000000000000000000000000001bc9ca405e4243700000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -2955,0xcd9d4988c0ae61887b075ba77f08cbfad2b65068,0x3f87ff1de58128ef8fcb4c807efd776e1ac72e51,0xf4f7b41a0000000000000000000000006e401916f9e149f20a1e3137d2897f843b510c64000000000000000000000000000000000000000000000000045ba9fb820dd512,,,1,true -2960,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec340000000000000000000000007f45fe3fc22116eb8cac9467ed992b2ee5b64bfe0000000000000000000000007f45fe3fc22116eb8cac9467ed992b2ee5b64bfe000000000000000000000000000000000000000000000000006b929aa06a9a8000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -2962,0x10e6593cdda8c58a1d0f14c5164b376352a55f2f,0x467194771dae2967aef3ecbedd3bf9a310c76c65,0xa9f9e6750000000000000000000000006b175474e89094c44da98b954eedeac495271d0f000000000000000000000000da10009cbd5d07dd0cecc66161fc93d7c9000da1000000000000000000000000c2142f5c34a7b0c01ef7cae326d4c16132996e33000000000000000000000000c2142f5c34a7b0c01ef7cae326d4c16132996e3300000000000000000000000000000000000000000000001cb93fe45e8d4bb3cf00000000000000000000000000000000000000000000000000000000000000c00000000000000000000000000000000000000000000000000000000000000000,,,1,true -2963,0x10e6593cdda8c58a1d0f14c5164b376352a55f2f,0x467194771dae2967aef3ecbedd3bf9a310c76c65,0xa9f9e6750000000000000000000000006b175474e89094c44da98b954eedeac495271d0f000000000000000000000000da10009cbd5d07dd0cecc66161fc93d7c9000da10000000000000000000000007bb0185b1ea004cee1e8d006394cc5d85897fe510000000000000000000000007bb0185b1ea004cee1e8d006394cc5d85897fe510000000000000000000000000000000000000000000000140ec80fa7ee88000000000000000000000000000000000000000000000000000000000000000000c00000000000000000000000000000000000000000000000000000000000000000,0x3d84f2dedac8912736dc91bb283a83f3c8b405e230d53fff39dc3b2e28573994,2022-04-24 07:31:07.000 UTC,0,true -2966,0xcd9d4988c0ae61887b075ba77f08cbfad2b65068,0x3f87ff1de58128ef8fcb4c807efd776e1ac72e51,0xf4f7b41a000000000000000000000000149762ef3b4ec34b015ee92ed9e64e2f6dfe8f6e000000000000000000000000000000000000000000000000e7255200bb918000,,,1,true -2967,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec34000000000000000000000000149762ef3b4ec34b015ee92ed9e64e2f6dfe8f6e000000000000000000000000149762ef3b4ec34b015ee92ed9e64e2f6dfe8f6e000000000000000000000000000000000000000000000000007bb9a73ac3d40000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -2974,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec34000000000000000000000000f5a9ee2ba013adfc5bf7412eb186a32d9677ba03000000000000000000000000f5a9ee2ba013adfc5bf7412eb186a32d9677ba030000000000000000000000000000000000000000000000000015ff5a92d0b50000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -2975,0x10e6593cdda8c58a1d0f14c5164b376352a55f2f,0x467194771dae2967aef3ecbedd3bf9a310c76c65,0xa9f9e6750000000000000000000000006b175474e89094c44da98b954eedeac495271d0f000000000000000000000000da10009cbd5d07dd0cecc66161fc93d7c9000da1000000000000000000000000ad9993d36bb4035bb908d685ad4090e7689d3edb000000000000000000000000ad9993d36bb4035bb908d685ad4090e7689d3edb0000000000000000000000000000000000000000000000000f67831e74af000000000000000000000000000000000000000000000000000000000000000000c00000000000000000000000000000000000000000000000000000000000000000,,,1,true -2981,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec34000000000000000000000000f0aaaeb39bd9b06905bfd85f37ab59440aa597d4000000000000000000000000f0aaaeb39bd9b06905bfd85f37ab59440aa597d4000000000000000000000000000000000000000000000000000cc9b30494ad3f00000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -2982,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec34000000000000000000000000a25ca2d4f30a9ad367910ee528c7ab65b8184e39000000000000000000000000a25ca2d4f30a9ad367910ee528c7ab65b8184e390000000000000000000000000000000000000000000000000005484b203355d100000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -2987,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec34000000000000000000000000569bfce7a6a72439d699a795c54f66826674e138000000000000000000000000569bfce7a6a72439d699a795c54f66826674e13800000000000000000000000000000000000000000000000000188b4bca2fe40000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -2993,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec34000000000000000000000000d7c8f980c23dd350ddb52905d5104b3eb6a3d035000000000000000000000000d7c8f980c23dd350ddb52905d5104b3eb6a3d03500000000000000000000000000000000000000000000000000b764ae64a3e8ad00000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,0x8aaa4751c162be82bb9c7bad6ae34eea99c354b4ed83e5bc353982ab76ec70cf,2022-02-06 12:28:02.000 UTC,0,true -3006,0x10e6593cdda8c58a1d0f14c5164b376352a55f2f,0x467194771dae2967aef3ecbedd3bf9a310c76c65,0xa9f9e6750000000000000000000000006b175474e89094c44da98b954eedeac495271d0f000000000000000000000000da10009cbd5d07dd0cecc66161fc93d7c9000da100000000000000000000000047eaaed95dc2b665b7c99e2c83e77552a290bc8100000000000000000000000047eaaed95dc2b665b7c99e2c83e77552a290bc810000000000000000000000000000000000000000000000000f8b0a10e470000000000000000000000000000000000000000000000000000000000000000000c00000000000000000000000000000000000000000000000000000000000000000,,,1,true -3007,0x10e6593cdda8c58a1d0f14c5164b376352a55f2f,0x467194771dae2967aef3ecbedd3bf9a310c76c65,0xa9f9e6750000000000000000000000006b175474e89094c44da98b954eedeac495271d0f000000000000000000000000da10009cbd5d07dd0cecc66161fc93d7c9000da10000000000000000000000003d8ec20c567180efa4ed40a56463ef7e544ccf470000000000000000000000003d8ec20c567180efa4ed40a56463ef7e544ccf470000000000000000000000000000000000000000000000000de0b6b3a764000000000000000000000000000000000000000000000000000000000000000000c00000000000000000000000000000000000000000000000000000000000000000,,,1,true -3008,0x10e6593cdda8c58a1d0f14c5164b376352a55f2f,0x467194771dae2967aef3ecbedd3bf9a310c76c65,0xa9f9e6750000000000000000000000006b175474e89094c44da98b954eedeac495271d0f000000000000000000000000da10009cbd5d07dd0cecc66161fc93d7c9000da10000000000000000000000006e28fd005399e9ea1354fea0374a8d24a67e70610000000000000000000000006e28fd005399e9ea1354fea0374a8d24a67e70610000000000000000000000000000000000000000000000000de0b6b3a764000000000000000000000000000000000000000000000000000000000000000000c00000000000000000000000000000000000000000000000000000000000000000,,,1,true -3009,0x10e6593cdda8c58a1d0f14c5164b376352a55f2f,0x467194771dae2967aef3ecbedd3bf9a310c76c65,0xa9f9e6750000000000000000000000006b175474e89094c44da98b954eedeac495271d0f000000000000000000000000da10009cbd5d07dd0cecc66161fc93d7c9000da10000000000000000000000007e273826908f8085a9a8b8e13536cc55a4542c8e0000000000000000000000007e273826908f8085a9a8b8e13536cc55a4542c8e0000000000000000000000000000000000000000000000000de0b6b3a764000000000000000000000000000000000000000000000000000000000000000000c00000000000000000000000000000000000000000000000000000000000000000,,,1,true -3010,0x10e6593cdda8c58a1d0f14c5164b376352a55f2f,0x467194771dae2967aef3ecbedd3bf9a310c76c65,0xa9f9e6750000000000000000000000006b175474e89094c44da98b954eedeac495271d0f000000000000000000000000da10009cbd5d07dd0cecc66161fc93d7c9000da10000000000000000000000004c3351aa306e945825d8531e4d63787b107c9ac20000000000000000000000004c3351aa306e945825d8531e4d63787b107c9ac20000000000000000000000000000000000000000000000000de0b6b3a764000000000000000000000000000000000000000000000000000000000000000000c00000000000000000000000000000000000000000000000000000000000000000,,,1,true -3011,0x10e6593cdda8c58a1d0f14c5164b376352a55f2f,0x467194771dae2967aef3ecbedd3bf9a310c76c65,0xa9f9e6750000000000000000000000006b175474e89094c44da98b954eedeac495271d0f000000000000000000000000da10009cbd5d07dd0cecc66161fc93d7c9000da100000000000000000000000035918cf35b5c97ea1879101c2fdc46296efec18e00000000000000000000000035918cf35b5c97ea1879101c2fdc46296efec18e0000000000000000000000000000000000000000000000000de0b6b3a764000000000000000000000000000000000000000000000000000000000000000000c00000000000000000000000000000000000000000000000000000000000000000,,,1,true -3012,0x10e6593cdda8c58a1d0f14c5164b376352a55f2f,0x467194771dae2967aef3ecbedd3bf9a310c76c65,0xa9f9e6750000000000000000000000006b175474e89094c44da98b954eedeac495271d0f000000000000000000000000da10009cbd5d07dd0cecc66161fc93d7c9000da10000000000000000000000002ea67afd407445ecffda6b010419da2cb85a8c1e0000000000000000000000002ea67afd407445ecffda6b010419da2cb85a8c1e0000000000000000000000000000000000000000000000000de0b6b3a764000000000000000000000000000000000000000000000000000000000000000000c00000000000000000000000000000000000000000000000000000000000000000,,,1,true -3013,0x10e6593cdda8c58a1d0f14c5164b376352a55f2f,0x467194771dae2967aef3ecbedd3bf9a310c76c65,0xa9f9e6750000000000000000000000006b175474e89094c44da98b954eedeac495271d0f000000000000000000000000da10009cbd5d07dd0cecc66161fc93d7c9000da10000000000000000000000000b716ac1490cb07340a58cdaee34abf9af7b2d510000000000000000000000000b716ac1490cb07340a58cdaee34abf9af7b2d510000000000000000000000000000000000000000000000000de0b6b3a764000000000000000000000000000000000000000000000000000000000000000000c00000000000000000000000000000000000000000000000000000000000000000,,,1,true -3014,0x10e6593cdda8c58a1d0f14c5164b376352a55f2f,0x467194771dae2967aef3ecbedd3bf9a310c76c65,0xa9f9e6750000000000000000000000006b175474e89094c44da98b954eedeac495271d0f000000000000000000000000da10009cbd5d07dd0cecc66161fc93d7c9000da10000000000000000000000006044e2ad9edce0ac262fb8e5048230dc83bffd760000000000000000000000006044e2ad9edce0ac262fb8e5048230dc83bffd760000000000000000000000000000000000000000000000000de0b6b3a764000000000000000000000000000000000000000000000000000000000000000000c00000000000000000000000000000000000000000000000000000000000000000,,,1,true -3016,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec34000000000000000000000000c691644b8095f9c4bb8a002acec957f4ffe368c1000000000000000000000000c691644b8095f9c4bb8a002acec957f4ffe368c1000000000000000000000000000000000000000000000000149b89020e50b7d500000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -3017,0xcd9d4988c0ae61887b075ba77f08cbfad2b65068,0x3f87ff1de58128ef8fcb4c807efd776e1ac72e51,0xf4f7b41a000000000000000000000000891acdefa5f01ab48bf69ff789ce9d3a9997f017000000000000000000000000000000000000000000000003afb087b876900000,,,1,true -3018,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec34000000000000000000000000f85c77731efa8dddc03e6196a838711fa36b81e0000000000000000000000000f85c77731efa8dddc03e6196a838711fa36b81e00000000000000000000000000000000000000000000000000033e2c078aaddb900000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -3022,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec3400000000000000000000000014e8b481bffa5df52a7513612c65003e6bb8237a00000000000000000000000014e8b481bffa5df52a7513612c65003e6bb8237a0000000000000000000000000000000000000000000000000076682ec4f3f1f900000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -3026,0xcd9d4988c0ae61887b075ba77f08cbfad2b65068,0x3f87ff1de58128ef8fcb4c807efd776e1ac72e51,0xf4f7b41a000000000000000000000000214016af97e9435189d81c57864f6256b86e9c330000000000000000000000000000000000000000000000059351d3b293df6355,,,1,true -3029,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec3400000000000000000000000038b15bfda512900fcd056ab43b009fa86234cda900000000000000000000000038b15bfda512900fcd056ab43b009fa86234cda90000000000000000000000000000000000000000000000000032c6b789309f6000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -3039,0xcd9d4988c0ae61887b075ba77f08cbfad2b65068,0x3f87ff1de58128ef8fcb4c807efd776e1ac72e51,0xf4f7b41a000000000000000000000000f23cd4c0cffc6cebd92c189b961b51bef93bd5f10000000000000000000000000000000000000000000000001dcbf130de84fdd1,,,1,true -3043,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0xa9f9e675000000000000000000000000baac2b4491727d78d2b78815144570b9f2fe88990000000000000000000000008f69ee043d52161fd29137aedf63f5e70cd504d500000000000000000000000023bc95f84bd43c1fcc2bc285fda4cb12f9aee2df00000000000000000000000023bc95f84bd43c1fcc2bc285fda4cb12f9aee2df000000000000000000000000000000000000000000000003bd913e6c1df4000000000000000000000000000000000000000000000000000000000000000000c00000000000000000000000000000000000000000000000000000000000000000,,,1,true -3044,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec340000000000000000000000005b1899d88b4ff0cf5a34651e7ce7164398211c660000000000000000000000005b1899d88b4ff0cf5a34651e7ce7164398211c66000000000000000000000000000000000000000000000000001841922677b8cd00000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -3050,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec340000000000000000000000009a4c18d444dc710828665f2fbfa6301e64412a560000000000000000000000009a4c18d444dc710828665f2fbfa6301e64412a56000000000000000000000000000000000000000000000000000110d9316ec00000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -3051,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec34000000000000000000000000f771cff1d5ffd05e877447c7604c4d0fe03ca884000000000000000000000000f771cff1d5ffd05e877447c7604c4d0fe03ca884000000000000000000000000000000000000000000000000000110d9316ec00000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -3053,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec34000000000000000000000000367bab5c08fd07956f6f70fa3871e1cbca917569000000000000000000000000367bab5c08fd07956f6f70fa3871e1cbca917569000000000000000000000000000000000000000000000000006a7054713fdb3600000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -3055,0xcd9d4988c0ae61887b075ba77f08cbfad2b65068,0x3f87ff1de58128ef8fcb4c807efd776e1ac72e51,0xf4f7b41a00000000000000000000000046ac0c9c530dc960a4df75b20b594fba243e5b7c00000000000000000000000000000000000000000000000090942a24a68a4cbe,,,1,true -3056,0xcd9d4988c0ae61887b075ba77f08cbfad2b65068,0x3f87ff1de58128ef8fcb4c807efd776e1ac72e51,0xf4f7b41a000000000000000000000000fc3551f3b51f27ca60efb25f45ed95d4e80e707100000000000000000000000000000000000000000000000071765f0478a614ed,,,1,true -3057,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec34000000000000000000000000cb9c0e20fa62e08e8f8d4588efbb8d63ed7331d3000000000000000000000000cb9c0e20fa62e08e8f8d4588efbb8d63ed7331d3000000000000000000000000000000000000000000000000027f7d0bdb92000000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -3058,0xcd9d4988c0ae61887b075ba77f08cbfad2b65068,0x3f87ff1de58128ef8fcb4c807efd776e1ac72e51,0xf4f7b41a00000000000000000000000046ac0c9c530dc960a4df75b20b594fba243e5b7c000000000000000000000000000000000000000000000000f869cca7ed0038b7,,,1,true -3059,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec34000000000000000000000000f4fcc2d19ae692a7aeb7d540139a37c7af1205c4000000000000000000000000f4fcc2d19ae692a7aeb7d540139a37c7af1205c40000000000000000000000000000000000000000000000000214e8348c4f000000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,0xb9b522c09ba76f609698b09c75be96a4dc66fc5b41e59e2dd9e1c01cdf7e3994,2021-11-28 14:32:49.000 UTC,0,true -3060,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec34000000000000000000000000cc89ec35fcecc62273603b6031f93ca692a54414000000000000000000000000cc89ec35fcecc62273603b6031f93ca692a54414000000000000000000000000000000000000000000000000021772c9b190a25800000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -3061,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec34000000000000000000000000384b123866cd169d1bd00c67a2c869cc836022bb000000000000000000000000384b123866cd169d1bd00c67a2c869cc836022bb000000000000000000000000000000000000000000000000002386f26fc1000000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -3062,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec3400000000000000000000000086e4bf82ce08af2202696cf432211ce782d02fb600000000000000000000000086e4bf82ce08af2202696cf432211ce782d02fb600000000000000000000000000000000000000000000000000ab9d2ba41f654b00000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -3063,0x10e6593cdda8c58a1d0f14c5164b376352a55f2f,0x467194771dae2967aef3ecbedd3bf9a310c76c65,0xa9f9e6750000000000000000000000006b175474e89094c44da98b954eedeac495271d0f000000000000000000000000da10009cbd5d07dd0cecc66161fc93d7c9000da1000000000000000000000000565fe00d8b1ea73adecd7bb86755866242219a31000000000000000000000000565fe00d8b1ea73adecd7bb86755866242219a310000000000000000000000000000000000000000000000065c74b174e14505d400000000000000000000000000000000000000000000000000000000000000c00000000000000000000000000000000000000000000000000000000000000000,,,1,true -3064,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec34000000000000000000000000f4e6e329e85673be7a15b5ed3c4399a8ba951bc6000000000000000000000000f4e6e329e85673be7a15b5ed3c4399a8ba951bc6000000000000000000000000000000000000000000000000029249fd61b8e1a900000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -3066,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec3400000000000000000000000095b391ce72da4fd408fd5f0e6c9b697db7ce181000000000000000000000000095b391ce72da4fd408fd5f0e6c9b697db7ce1810000000000000000000000000000000000000000000000000002453edde94d66400000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -3068,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec3400000000000000000000000087fbccf395d7637bb4baab7602ba78f3edd1277400000000000000000000000087fbccf395d7637bb4baab7602ba78f3edd1277400000000000000000000000000000000000000000000000014c9889c3328fb0000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,0x9803cad0b6096136d7f66e08886c960af2fb72eecfb5e4099a50f060b9a1045e,2022-06-17 06:36:16.000 UTC,0,true -3070,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec340000000000000000000000002f20872b1517b641bdc0680cc279e0ed33e9b41c0000000000000000000000002f20872b1517b641bdc0680cc279e0ed33e9b41c000000000000000000000000000000000000000000000000016345785d8a000000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -3071,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec34000000000000000000000000ac4bfcd893230a82f9f905f92457378b52a1d706000000000000000000000000ac4bfcd893230a82f9f905f92457378b52a1d706000000000000000000000000000000000000000000000000006377fc7ef7fc0000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -3074,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec34000000000000000000000000f278ac8e97dd418a3ce13307fa1b44ff87a18f7c000000000000000000000000f278ac8e97dd418a3ce13307fa1b44ff87a18f7c000000000000000000000000000000000000000000000000003873329a317a1700000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -3076,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec34000000000000000000000000e095d1a7ed1a1173d69d7bd724b2b7c6c81b0e4b000000000000000000000000e095d1a7ed1a1173d69d7bd724b2b7c6c81b0e4b000000000000000000000000000000000000000000000000005cd42e99b2990700000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -3077,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec340000000000000000000000000315483c35d2c1ea9d5be576b0f795ae8cd0d4de0000000000000000000000000315483c35d2c1ea9d5be576b0f795ae8cd0d4de000000000000000000000000000000000000000000000000003c37bf0ca21f5500000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -3078,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec340000000000000000000000006148c045497f07cda8c2d74a54e510fea4b4ee590000000000000000000000006148c045497f07cda8c2d74a54e510fea4b4ee59000000000000000000000000000000000000000000000000008187f32f0f290000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -3080,0xcd9d4988c0ae61887b075ba77f08cbfad2b65068,0x3f87ff1de58128ef8fcb4c807efd776e1ac72e51,0xf4f7b41a0000000000000000000000006ed916e093ebccc790109f4a2073bff50cf9160e0000000000000000000000000000000000000000000000022b1c8c1227a00000,,,1,true -3081,0xcd9d4988c0ae61887b075ba77f08cbfad2b65068,0x3f87ff1de58128ef8fcb4c807efd776e1ac72e51,0xf4f7b41a0000000000000000000000000d20fc3c32b213a39b0314ce804ba33aa5c6ed6f000000000000000000000000000000000000000000000004e341d84852aef2c9,,,1,true -3092,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec34000000000000000000000000549750e6b5b40e627365bdcf7f7780dbfde113a4000000000000000000000000549750e6b5b40e627365bdcf7f7780dbfde113a4000000000000000000000000000000000000000000000000015bbfa9d32e420000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -3094,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec3400000000000000000000000084f1e7260d927e3d2ea4f5c4ba1f52946420ff0400000000000000000000000084f1e7260d927e3d2ea4f5c4ba1f52946420ff0400000000000000000000000000000000000000000000000000005af3107a400000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -3095,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec34000000000000000000000000781cdc81cc8a315433bdc1c581a649c4c0d61ee7000000000000000000000000781cdc81cc8a315433bdc1c581a649c4c0d61ee7000000000000000000000000000000000000000000000000052b4c0a4ee1dbff00000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -3103,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec34000000000000000000000000b62832f8b38570909411d32088fa3eb5d5752bed000000000000000000000000b62832f8b38570909411d32088fa3eb5d5752bed00000000000000000000000000000000000000000000000004f924563be6636900000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -3105,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec34000000000000000000000000aa3c2d7d282de8cdd14e97e61d0887d6ce2edafd000000000000000000000000aa3c2d7d282de8cdd14e97e61d0887d6ce2edafd00000000000000000000000000000000000000000000000001f833f035ec0b0000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,0x0c3a265d41b13d33f24b2a1611738fafc2be4ad5eb0f9597602b3e37152e5f6d,2021-12-02 23:39:35.000 UTC,0,true -3106,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec34000000000000000000000000aa1fbe434eb61ca6d7967e7ddc13d93422007892000000000000000000000000aa1fbe434eb61ca6d7967e7ddc13d93422007892000000000000000000000000000000000000000000000000006b4231355963bc00000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -3107,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec34000000000000000000000000a0b0a2b343a6cbfb1a2c4eb70ab06b6829e9db9a000000000000000000000000a0b0a2b343a6cbfb1a2c4eb70ab06b6829e9db9a0000000000000000000000000000000000000000000000000095fa88b4a6a67a00000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -3108,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec34000000000000000000000000a1de8febdeda64438bdff1ceb70bf6e0820794b1000000000000000000000000a1de8febdeda64438bdff1ceb70bf6e0820794b1000000000000000000000000000000000000000000000000008f2b935ff7c07200000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -3109,0x10e6593cdda8c58a1d0f14c5164b376352a55f2f,0x467194771dae2967aef3ecbedd3bf9a310c76c65,0xa9f9e6750000000000000000000000006b175474e89094c44da98b954eedeac495271d0f000000000000000000000000da10009cbd5d07dd0cecc66161fc93d7c9000da1000000000000000000000000fd65af1a0f332c6ee4d3c787a65b0ad674e847ef000000000000000000000000fd65af1a0f332c6ee4d3c787a65b0ad674e847ef00000000000000000000000000000000000000000000000010cac896d239000000000000000000000000000000000000000000000000000000000000000000c00000000000000000000000000000000000000000000000000000000000000000,,,1,true -3110,0x10e6593cdda8c58a1d0f14c5164b376352a55f2f,0x467194771dae2967aef3ecbedd3bf9a310c76c65,0xa9f9e6750000000000000000000000006b175474e89094c44da98b954eedeac495271d0f000000000000000000000000da10009cbd5d07dd0cecc66161fc93d7c9000da1000000000000000000000000bb24fdb708e47f85712ab07df417056e4c1438a4000000000000000000000000bb24fdb708e47f85712ab07df417056e4c1438a400000000000000000000000000000000000000000000000010ee4f8941fa000000000000000000000000000000000000000000000000000000000000000000c00000000000000000000000000000000000000000000000000000000000000000,,,1,true -3111,0x10e6593cdda8c58a1d0f14c5164b376352a55f2f,0x467194771dae2967aef3ecbedd3bf9a310c76c65,0xa9f9e6750000000000000000000000006b175474e89094c44da98b954eedeac495271d0f000000000000000000000000da10009cbd5d07dd0cecc66161fc93d7c9000da1000000000000000000000000e7166fd81bb217a5c05cefb6e1570bda50cfb21f000000000000000000000000e7166fd81bb217a5c05cefb6e1570bda50cfb21f0000000000000000000000000000000000000000000000001111d67bb1bb000000000000000000000000000000000000000000000000000000000000000000c00000000000000000000000000000000000000000000000000000000000000000,,,1,true -3112,0x10e6593cdda8c58a1d0f14c5164b376352a55f2f,0x467194771dae2967aef3ecbedd3bf9a310c76c65,0xa9f9e6750000000000000000000000006b175474e89094c44da98b954eedeac495271d0f000000000000000000000000da10009cbd5d07dd0cecc66161fc93d7c9000da10000000000000000000000004d9248bd9809b4acc33fedb4ee6101e27e5adbc50000000000000000000000004d9248bd9809b4acc33fedb4ee6101e27e5adbc500000000000000000000000000000000000000000000000011355d6e217c000000000000000000000000000000000000000000000000000000000000000000c00000000000000000000000000000000000000000000000000000000000000000,,,1,true -3113,0x10e6593cdda8c58a1d0f14c5164b376352a55f2f,0x467194771dae2967aef3ecbedd3bf9a310c76c65,0xa9f9e6750000000000000000000000006b175474e89094c44da98b954eedeac495271d0f000000000000000000000000da10009cbd5d07dd0cecc66161fc93d7c9000da1000000000000000000000000dd8836898c60e12c064e9b33f78adbebd54a2d14000000000000000000000000dd8836898c60e12c064e9b33f78adbebd54a2d140000000000000000000000000000000000000000000000001158e460913d000000000000000000000000000000000000000000000000000000000000000000c00000000000000000000000000000000000000000000000000000000000000000,,,1,true -3114,0x10e6593cdda8c58a1d0f14c5164b376352a55f2f,0x467194771dae2967aef3ecbedd3bf9a310c76c65,0xa9f9e6750000000000000000000000006b175474e89094c44da98b954eedeac495271d0f000000000000000000000000da10009cbd5d07dd0cecc66161fc93d7c9000da1000000000000000000000000b838af0c27e59dd996dd8f4e9a6b758f589a92d7000000000000000000000000b838af0c27e59dd996dd8f4e9a6b758f589a92d7000000000000000000000000000000000000000000000000117c6b5300fe000000000000000000000000000000000000000000000000000000000000000000c00000000000000000000000000000000000000000000000000000000000000000,,,1,true -3115,0x10e6593cdda8c58a1d0f14c5164b376352a55f2f,0x467194771dae2967aef3ecbedd3bf9a310c76c65,0xa9f9e6750000000000000000000000006b175474e89094c44da98b954eedeac495271d0f000000000000000000000000da10009cbd5d07dd0cecc66161fc93d7c9000da100000000000000000000000004d9c2724ae629133e695a6b68b257bb2537263500000000000000000000000004d9c2724ae629133e695a6b68b257bb25372635000000000000000000000000000000000000000000000000119ff24570bf000000000000000000000000000000000000000000000000000000000000000000c00000000000000000000000000000000000000000000000000000000000000000,,,1,true -3116,0x10e6593cdda8c58a1d0f14c5164b376352a55f2f,0x467194771dae2967aef3ecbedd3bf9a310c76c65,0xa9f9e6750000000000000000000000006b175474e89094c44da98b954eedeac495271d0f000000000000000000000000da10009cbd5d07dd0cecc66161fc93d7c9000da1000000000000000000000000c2f0b9c7da3494c6fe553c48dc103bb8b5b4b27d000000000000000000000000c2f0b9c7da3494c6fe553c48dc103bb8b5b4b27d00000000000000000000000000000000000000000000000011c37937e080000000000000000000000000000000000000000000000000000000000000000000c00000000000000000000000000000000000000000000000000000000000000000,,,1,true -3117,0x10e6593cdda8c58a1d0f14c5164b376352a55f2f,0x467194771dae2967aef3ecbedd3bf9a310c76c65,0xa9f9e6750000000000000000000000006b175474e89094c44da98b954eedeac495271d0f000000000000000000000000da10009cbd5d07dd0cecc66161fc93d7c9000da10000000000000000000000007f07fc54c59286b42267f550447b3341ef086c200000000000000000000000007f07fc54c59286b42267f550447b3341ef086c2000000000000000000000000000000000000000000000000011e7002a5041000000000000000000000000000000000000000000000000000000000000000000c00000000000000000000000000000000000000000000000000000000000000000,,,1,true -3118,0x10e6593cdda8c58a1d0f14c5164b376352a55f2f,0x467194771dae2967aef3ecbedd3bf9a310c76c65,0xa9f9e6750000000000000000000000006b175474e89094c44da98b954eedeac495271d0f000000000000000000000000da10009cbd5d07dd0cecc66161fc93d7c9000da1000000000000000000000000c7cf2ecccece264008aa10dd26fbfcf17b8a1a60000000000000000000000000c7cf2ecccece264008aa10dd26fbfcf17b8a1a60000000000000000000000000000000000000000000000000120a871cc002000000000000000000000000000000000000000000000000000000000000000000c00000000000000000000000000000000000000000000000000000000000000000,,,1,true -3119,0x10e6593cdda8c58a1d0f14c5164b376352a55f2f,0x467194771dae2967aef3ecbedd3bf9a310c76c65,0xa9f9e6750000000000000000000000006b175474e89094c44da98b954eedeac495271d0f000000000000000000000000da10009cbd5d07dd0cecc66161fc93d7c9000da1000000000000000000000000596e114e8ff94a75645e67b3d2e3b7fc277cee75000000000000000000000000596e114e8ff94a75645e67b3d2e3b7fc277cee75000000000000000000000000000000000000000000000000122e0e0f2fc3000000000000000000000000000000000000000000000000000000000000000000c00000000000000000000000000000000000000000000000000000000000000000,,,1,true -3120,0x10e6593cdda8c58a1d0f14c5164b376352a55f2f,0x467194771dae2967aef3ecbedd3bf9a310c76c65,0xa9f9e6750000000000000000000000006b175474e89094c44da98b954eedeac495271d0f000000000000000000000000da10009cbd5d07dd0cecc66161fc93d7c9000da1000000000000000000000000bd4a8e573a9dd2d20edae1c43c7477e719043296000000000000000000000000bd4a8e573a9dd2d20edae1c43c7477e719043296000000000000000000000000000000000000000000000000125195019f84000000000000000000000000000000000000000000000000000000000000000000c00000000000000000000000000000000000000000000000000000000000000000,,,1,true -3121,0x10e6593cdda8c58a1d0f14c5164b376352a55f2f,0x467194771dae2967aef3ecbedd3bf9a310c76c65,0xa9f9e6750000000000000000000000006b175474e89094c44da98b954eedeac495271d0f000000000000000000000000da10009cbd5d07dd0cecc66161fc93d7c9000da1000000000000000000000000dcf71305489604918dc84a42c613104e50a25b4f000000000000000000000000dcf71305489604918dc84a42c613104e50a25b4f00000000000000000000000000000000000000000000000012751bf40f45000000000000000000000000000000000000000000000000000000000000000000c00000000000000000000000000000000000000000000000000000000000000000,,,1,true -3122,0x10e6593cdda8c58a1d0f14c5164b376352a55f2f,0x467194771dae2967aef3ecbedd3bf9a310c76c65,0xa9f9e6750000000000000000000000006b175474e89094c44da98b954eedeac495271d0f000000000000000000000000da10009cbd5d07dd0cecc66161fc93d7c9000da10000000000000000000000008ec827c95d55f097365e47c46cdd0e6d178362f70000000000000000000000008ec827c95d55f097365e47c46cdd0e6d178362f70000000000000000000000000000000000000000000000001298a2e67f06000000000000000000000000000000000000000000000000000000000000000000c00000000000000000000000000000000000000000000000000000000000000000,,,1,true -3123,0x10e6593cdda8c58a1d0f14c5164b376352a55f2f,0x467194771dae2967aef3ecbedd3bf9a310c76c65,0xa9f9e6750000000000000000000000006b175474e89094c44da98b954eedeac495271d0f000000000000000000000000da10009cbd5d07dd0cecc66161fc93d7c9000da1000000000000000000000000c65b964cc64973ec71af5345145a6808117127d0000000000000000000000000c65b964cc64973ec71af5345145a6808117127d000000000000000000000000000000000000000000000000012bc29d8eec7000000000000000000000000000000000000000000000000000000000000000000c00000000000000000000000000000000000000000000000000000000000000000,,,1,true -3124,0x10e6593cdda8c58a1d0f14c5164b376352a55f2f,0x467194771dae2967aef3ecbedd3bf9a310c76c65,0xa9f9e6750000000000000000000000006b175474e89094c44da98b954eedeac495271d0f000000000000000000000000da10009cbd5d07dd0cecc66161fc93d7c9000da10000000000000000000000000678ddbda74966f453472fa6c56e15b76ccc162e0000000000000000000000000678ddbda74966f453472fa6c56e15b76ccc162e00000000000000000000000000000000000000000000000012dfb0cb5e88000000000000000000000000000000000000000000000000000000000000000000c00000000000000000000000000000000000000000000000000000000000000000,,,1,true -3125,0x10e6593cdda8c58a1d0f14c5164b376352a55f2f,0x467194771dae2967aef3ecbedd3bf9a310c76c65,0xa9f9e6750000000000000000000000006b175474e89094c44da98b954eedeac495271d0f000000000000000000000000da10009cbd5d07dd0cecc66161fc93d7c9000da100000000000000000000000095db6d4e7596331e6a4c433f58414ac8f1d354b000000000000000000000000095db6d4e7596331e6a4c433f58414ac8f1d354b0000000000000000000000000000000000000000000000000130337bdce49000000000000000000000000000000000000000000000000000000000000000000c00000000000000000000000000000000000000000000000000000000000000000,,,1,true -3126,0x10e6593cdda8c58a1d0f14c5164b376352a55f2f,0x467194771dae2967aef3ecbedd3bf9a310c76c65,0xa9f9e6750000000000000000000000006b175474e89094c44da98b954eedeac495271d0f000000000000000000000000da10009cbd5d07dd0cecc66161fc93d7c9000da1000000000000000000000000fe87e90e5a93f099faabc86fc2647001f723cd79000000000000000000000000fe87e90e5a93f099faabc86fc2647001f723cd790000000000000000000000000000000000000000000000001326beb03e0a000000000000000000000000000000000000000000000000000000000000000000c00000000000000000000000000000000000000000000000000000000000000000,,,1,true -3127,0x10e6593cdda8c58a1d0f14c5164b376352a55f2f,0x467194771dae2967aef3ecbedd3bf9a310c76c65,0xa9f9e6750000000000000000000000006b175474e89094c44da98b954eedeac495271d0f000000000000000000000000da10009cbd5d07dd0cecc66161fc93d7c9000da10000000000000000000000008c351deac0d2fb6ee213f6a460de47feba26fe5e0000000000000000000000008c351deac0d2fb6ee213f6a460de47feba26fe5e000000000000000000000000000000000000000000000000134a45a2adcb000000000000000000000000000000000000000000000000000000000000000000c00000000000000000000000000000000000000000000000000000000000000000,,,1,true -3128,0x10e6593cdda8c58a1d0f14c5164b376352a55f2f,0x467194771dae2967aef3ecbedd3bf9a310c76c65,0xa9f9e6750000000000000000000000006b175474e89094c44da98b954eedeac495271d0f000000000000000000000000da10009cbd5d07dd0cecc66161fc93d7c9000da1000000000000000000000000faf24f3eaee54b20f1cb50f9ec27674a3a7f7b51000000000000000000000000faf24f3eaee54b20f1cb50f9ec27674a3a7f7b51000000000000000000000000000000000000000000000000136dcc951d8c000000000000000000000000000000000000000000000000000000000000000000c00000000000000000000000000000000000000000000000000000000000000000,,,1,true -3129,0x10e6593cdda8c58a1d0f14c5164b376352a55f2f,0x467194771dae2967aef3ecbedd3bf9a310c76c65,0xa9f9e6750000000000000000000000006b175474e89094c44da98b954eedeac495271d0f000000000000000000000000da10009cbd5d07dd0cecc66161fc93d7c9000da1000000000000000000000000d582528b2ced3ea73d247dd6015757c84f83531e000000000000000000000000d582528b2ced3ea73d247dd6015757c84f83531e000000000000000000000000000000000000000000000000139153878d4d000000000000000000000000000000000000000000000000000000000000000000c00000000000000000000000000000000000000000000000000000000000000000,,,1,true -3130,0x10e6593cdda8c58a1d0f14c5164b376352a55f2f,0x467194771dae2967aef3ecbedd3bf9a310c76c65,0xa9f9e6750000000000000000000000006b175474e89094c44da98b954eedeac495271d0f000000000000000000000000da10009cbd5d07dd0cecc66161fc93d7c9000da1000000000000000000000000581dcd3c175619057557d9c504578def15f394de000000000000000000000000581dcd3c175619057557d9c504578def15f394de00000000000000000000000000000000000000000000000013b4da79fd0e000000000000000000000000000000000000000000000000000000000000000000c00000000000000000000000000000000000000000000000000000000000000000,,,1,true -3131,0x10e6593cdda8c58a1d0f14c5164b376352a55f2f,0x467194771dae2967aef3ecbedd3bf9a310c76c65,0xa9f9e6750000000000000000000000006b175474e89094c44da98b954eedeac495271d0f000000000000000000000000da10009cbd5d07dd0cecc66161fc93d7c9000da10000000000000000000000004f88513b32d2a747355cc98d8eb7c617c91b9f670000000000000000000000004f88513b32d2a747355cc98d8eb7c617c91b9f6700000000000000000000000000000000000000000000000013d8616c6ccf000000000000000000000000000000000000000000000000000000000000000000c00000000000000000000000000000000000000000000000000000000000000000,,,1,true -3132,0x10e6593cdda8c58a1d0f14c5164b376352a55f2f,0x467194771dae2967aef3ecbedd3bf9a310c76c65,0xa9f9e6750000000000000000000000006b175474e89094c44da98b954eedeac495271d0f000000000000000000000000da10009cbd5d07dd0cecc66161fc93d7c9000da1000000000000000000000000dee9350fc8e38d1dca06fdf916bffeddeff468d7000000000000000000000000dee9350fc8e38d1dca06fdf916bffeddeff468d700000000000000000000000000000000000000000000000013fbe85edc90000000000000000000000000000000000000000000000000000000000000000000c00000000000000000000000000000000000000000000000000000000000000000,,,1,true -3133,0x10e6593cdda8c58a1d0f14c5164b376352a55f2f,0x467194771dae2967aef3ecbedd3bf9a310c76c65,0xa9f9e6750000000000000000000000006b175474e89094c44da98b954eedeac495271d0f000000000000000000000000da10009cbd5d07dd0cecc66161fc93d7c9000da1000000000000000000000000acb1e9a1dc81c64520f300793f076295929d6b19000000000000000000000000acb1e9a1dc81c64520f300793f076295929d6b19000000000000000000000000000000000000000000000000141f6f514c51000000000000000000000000000000000000000000000000000000000000000000c00000000000000000000000000000000000000000000000000000000000000000,,,1,true -3134,0x10e6593cdda8c58a1d0f14c5164b376352a55f2f,0x467194771dae2967aef3ecbedd3bf9a310c76c65,0xa9f9e6750000000000000000000000006b175474e89094c44da98b954eedeac495271d0f000000000000000000000000da10009cbd5d07dd0cecc66161fc93d7c9000da1000000000000000000000000f953a0f3335574e1f4b2f77c3fb7a7a465fa5f20000000000000000000000000f953a0f3335574e1f4b2f77c3fb7a7a465fa5f200000000000000000000000000000000000000000000000001442f643bc12000000000000000000000000000000000000000000000000000000000000000000c00000000000000000000000000000000000000000000000000000000000000000,,,1,true -3137,0xcd9d4988c0ae61887b075ba77f08cbfad2b65068,0x3f87ff1de58128ef8fcb4c807efd776e1ac72e51,0xf4f7b41a000000000000000000000000ae2adf9a0727e69b6f5105d183e684894a75d39a00000000000000000000000000000000000000000000000087f76835c87c8b71,,,1,true -3141,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec34000000000000000000000000ea3088c92ccf0874c6a13062745fc6b1552a1a87000000000000000000000000ea3088c92ccf0874c6a13062745fc6b1552a1a8700000000000000000000000000000000000000000000000000034b3c6e5f6b0000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -3143,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0xa9f9e675000000000000000000000000dac17f958d2ee523a2206206994597c13d831ec700000000000000000000000094b008aa00579c1307b0ef2c499ad98a8ce58e58000000000000000000000000e4e87ef976eab568fda866d23141d37950baf4d9000000000000000000000000e4e87ef976eab568fda866d23141d37950baf4d900000000000000000000000000000000000000000000000000000000da6a919800000000000000000000000000000000000000000000000000000000000000c00000000000000000000000000000000000000000000000000000000000000000,,,1,true -3146,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec34000000000000000000000000cffd91182d94fb37a49fbd626400468197291ccd000000000000000000000000cffd91182d94fb37a49fbd626400468197291ccd0000000000000000000000000000000000000000000000000429d069189e000000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -3147,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec34000000000000000000000000a4bc8e08f7ba01043b2088040255036b57edaf91000000000000000000000000a4bc8e08f7ba01043b2088040255036b57edaf9100000000000000000000000000000000000000000000000001e3a602772762cd00000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -3148,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec3400000000000000000000000047f80003f5dfa14c12d25dd52c2bbab9f206504e00000000000000000000000047f80003f5dfa14c12d25dd52c2bbab9f206504e0000000000000000000000000000000000000000000000001b52dc7772062e8a00000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -3149,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec34000000000000000000000000e1344576ad891ac66e5252dba5365b88da1fd99b000000000000000000000000e1344576ad891ac66e5252dba5365b88da1fd99b00000000000000000000000000000000000000000000000000934b72171c0d6b00000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -3151,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec34000000000000000000000000dba4f369e6fce16c0552bb9cb6e0df6b89a0eed1000000000000000000000000dba4f369e6fce16c0552bb9cb6e0df6b89a0eed100000000000000000000000000000000000000000000000000470de4df82000000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -3153,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec340000000000000000000000009c9fd4438cbc2a251bbf67877c4b70e18e74e4530000000000000000000000009c9fd4438cbc2a251bbf67877c4b70e18e74e45300000000000000000000000000000000000000000000000001547251fa85e06f00000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -3155,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec3400000000000000000000000081d7d26fbc67b56bebf9c6b1937ff3ebeae6e7bc00000000000000000000000081d7d26fbc67b56bebf9c6b1937ff3ebeae6e7bc0000000000000000000000000000000000000000000000000031a6981644520900000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -3160,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec34000000000000000000000000ae6686600f0019b56b4c890225ce7526690b83c1000000000000000000000000ae6686600f0019b56b4c890225ce7526690b83c10000000000000000000000000000000000000000000000000a333e9b15e9800000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -3164,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec34000000000000000000000000a80383f17a92b110921c07fb5261798f3a99377f000000000000000000000000a80383f17a92b110921c07fb5261798f3a99377f00000000000000000000000000000000000000000000000000ed877d6e13faae00000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -3166,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec34000000000000000000000000f3effc5393cdbe8779c39c4c8d9a934e6f1f390f000000000000000000000000f3effc5393cdbe8779c39c4c8d9a934e6f1f390f0000000000000000000000000000000000000000000000000dd23cedcb7425e300000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -3171,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec34000000000000000000000000286060cd2e24e0bd0814a83e3621c4ed6d5e2466000000000000000000000000286060cd2e24e0bd0814a83e3621c4ed6d5e2466000000000000000000000000000000000000000000000000002386f26fc1000000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -3172,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec340000000000000000000000006b3900179e0d9e20712ed41f8bb9ff8cb1e3fc880000000000000000000000006b3900179e0d9e20712ed41f8bb9ff8cb1e3fc8800000000000000000000000000000000000000000000000000a4f4e11115ae0000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -3173,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec34000000000000000000000000489872f68bd0da1ca97383a97342f0e230c8f24f000000000000000000000000489872f68bd0da1ca97383a97342f0e230c8f24f000000000000000000000000000000000000000000000000015b4cb81b29910000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -3177,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0xa9f9e675000000000000000000000000a0b86991c6218b36c1d19d4a2e9eb0ce3606eb480000000000000000000000007f5c764cbc14f9669b88837ca1490cca17c31607000000000000000000000000c50c8c222c35830f74dcc13200570f1203d987d5000000000000000000000000c50c8c222c35830f74dcc13200570f1203d987d5000000000000000000000000000000000000000000000000000000000af33ed000000000000000000000000000000000000000000000000000000000000000c00000000000000000000000000000000000000000000000000000000000000000,0x2ac23bd99eb6500e0e5f639cc413adcefd0b70799d5cf007db34d44798ef808d,2022-02-27 08:23:16.000 UTC,0,true -3178,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec34000000000000000000000000c50c8c222c35830f74dcc13200570f1203d987d5000000000000000000000000c50c8c222c35830f74dcc13200570f1203d987d500000000000000000000000000000000000000000000000000788efe072b90b100000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,0xb5bfb78296ff2811032f3222adb951b97d365cc6a3fe54ed9b5c443fc411dd66,2022-02-27 08:14:41.000 UTC,0,true -3179,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0xa9f9e675000000000000000000000000a0b86991c6218b36c1d19d4a2e9eb0ce3606eb480000000000000000000000007f5c764cbc14f9669b88837ca1490cca17c316070000000000000000000000004599080d9b74316af108884f506ba4a595ea50910000000000000000000000004599080d9b74316af108884f506ba4a595ea5091000000000000000000000000000000000000000000000000000000000ac3030500000000000000000000000000000000000000000000000000000000000000c00000000000000000000000000000000000000000000000000000000000000000,0xa22a7311378aa22c95826245ca7483b0fe0c8a6a9364f01787c6725bbaaf3f15,2022-02-27 08:14:41.000 UTC,0,true -3180,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec34000000000000000000000000bb9950d9400cc1542bad1803a1e5df7ac666e5d5000000000000000000000000bb9950d9400cc1542bad1803a1e5df7ac666e5d500000000000000000000000000000000000000000000000001153f1eabfb52de00000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -3182,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec34000000000000000000000000cf4701ca4a43d0028c46b67c92ac436ec290e33e000000000000000000000000cf4701ca4a43d0028c46b67c92ac436ec290e33e00000000000000000000000000000000000000000000000000422f08813e73fa00000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -3184,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec340000000000000000000000003a0fbb2f36271ff92ed8a16ca0343a0f320cfcd50000000000000000000000003a0fbb2f36271ff92ed8a16ca0343a0f320cfcd50000000000000000000000000000000000000000000000000014e58f1d3045c000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -3185,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec340000000000000000000000005b3beffe27430d4ac916b8e9c7715611270d93a90000000000000000000000005b3beffe27430d4ac916b8e9c7715611270d93a900000000000000000000000000000000000000000000000000141a9b3a9f890000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -3187,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec34000000000000000000000000b65ed9846d774942370620581645c430410f3ab9000000000000000000000000b65ed9846d774942370620581645c430410f3ab900000000000000000000000000000000000000000000000005a853b074c8566600000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,0x7c64bbfe4ec9e75c806d01a167416d910a4f8950097663f7c076de27b2d90b0c,2022-02-26 21:41:04.000 UTC,0,true -3190,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec34000000000000000000000000b0a9de2479f5cd97669b0fbd4d1ee1ef70c99b22000000000000000000000000b0a9de2479f5cd97669b0fbd4d1ee1ef70c99b22000000000000000000000000000000000000000000000000009645dc4d8b334a00000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -3192,0xcd9d4988c0ae61887b075ba77f08cbfad2b65068,0x3f87ff1de58128ef8fcb4c807efd776e1ac72e51,0xf4f7b41a000000000000000000000000dc18c785ee9f9d3b797f4b034af8d20bb2ca1e2500000000000000000000000000000000000000000000007d181e3d487f2dd352,,,1,true -3193,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec34000000000000000000000000be0f0f1077e5f5ed5e9b1dac16b6873163889381000000000000000000000000be0f0f1077e5f5ed5e9b1dac16b6873163889381000000000000000000000000000000000000000000000000015b6aa4d0fcb20000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -3195,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec34000000000000000000000000068557e2154013a1c5564175271c1d107c241521000000000000000000000000068557e2154013a1c5564175271c1d107c2415210000000000000000000000000000000000000000000000000016e6fdcb72148000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -3199,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec340000000000000000000000000cb036c18b9c382d3ff9ab1319e2964a732961080000000000000000000000000cb036c18b9c382d3ff9ab1319e2964a7329610800000000000000000000000000000000000000000000000000a1aeb5ff8297dd00000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -3203,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec34000000000000000000000000321700a6493f8865d7f5a541c7007c1ff07d9370000000000000000000000000321700a6493f8865d7f5a541c7007c1ff07d937000000000000000000000000000000000000000000000000000038d7ea4c6800000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -3204,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec34000000000000000000000000d12f7211071a20ce76bf9fb8e069036b6fb63c6a000000000000000000000000d12f7211071a20ce76bf9fb8e069036b6fb63c6a000000000000000000000000000000000000000000000000014c872a5b4dbe7b00000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -3205,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec34000000000000000000000000c86a39e67d1d64071d443721083839bb16c5273f000000000000000000000000c86a39e67d1d64071d443721083839bb16c5273f0000000000000000000000000000000000000000000000000328d829df31030000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -3208,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec34000000000000000000000000faef04074a99713bb25f1fefd7cbff5d65235265000000000000000000000000faef04074a99713bb25f1fefd7cbff5d6523526500000000000000000000000000000000000000000000000000038d7ea4c6800000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -3209,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec3400000000000000000000000092c2aa78ae7248f788f14a42e6daba156d3c898100000000000000000000000092c2aa78ae7248f788f14a42e6daba156d3c898100000000000000000000000000000000000000000000000000038d7ea4c6800000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -3210,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec34000000000000000000000000b45d0c759524ae9ce9d2091a1b2e663b1f5c6a6a000000000000000000000000b45d0c759524ae9ce9d2091a1b2e663b1f5c6a6a00000000000000000000000000000000000000000000000000038d7ea4c6800000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -3211,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec34000000000000000000000000ed374ece52ab111bdbaee9f1013429f474c883ba000000000000000000000000ed374ece52ab111bdbaee9f1013429f474c883ba00000000000000000000000000000000000000000000000000038d7ea4c6800000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -3213,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec340000000000000000000000002babe76345d7eb15f6a1c0cddba04d8ee44491d50000000000000000000000002babe76345d7eb15f6a1c0cddba04d8ee44491d500000000000000000000000000000000000000000000000000014add956eb90000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -3215,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec3400000000000000000000000004bbb7ea18ea570ae47d4489991645e4e49bbf3700000000000000000000000004bbb7ea18ea570ae47d4489991645e4e49bbf37000000000000000000000000000000000000000000000000016345785d8a000000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -3216,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec340000000000000000000000003c00a3fa2eef1afccf044af59ce105b8200272cd0000000000000000000000003c00a3fa2eef1afccf044af59ce105b8200272cd00000000000000000000000000000000000000000000000000074f0df332dd8300000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -3217,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec340000000000000000000000001040a43093b700d9bfe90346990afaa4d11515080000000000000000000000001040a43093b700d9bfe90346990afaa4d115150800000000000000000000000000000000000000000000000000b1a2bc2ec5000000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -3218,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec34000000000000000000000000a8f4d5f35b3d819caa21ff649a1dce9674acd9d1000000000000000000000000a8f4d5f35b3d819caa21ff649a1dce9674acd9d1000000000000000000000000000000000000000000000000002f904483a7ecd300000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -3219,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec340000000000000000000000006916ea1489b98a932f8da3b884864383b00c13090000000000000000000000006916ea1489b98a932f8da3b884864383b00c130900000000000000000000000000000000000000000000000000dad8dfa62a000000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -3222,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec340000000000000000000000003e58dd42d7908d8924a599e5e28e15f4f58c40750000000000000000000000003e58dd42d7908d8924a599e5e28e15f4f58c407500000000000000000000000000000000000000000000000000b602529f40777c00000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -3223,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec34000000000000000000000000ec787b619878d0b237bad72f8f7ecfd02716fa07000000000000000000000000ec787b619878d0b237bad72f8f7ecfd02716fa07000000000000000000000000000000000000000000000000016345785d8a000000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -3229,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec340000000000000000000000006bb74a933655bd91c14f29c53cde15dcc747fc080000000000000000000000006bb74a933655bd91c14f29c53cde15dcc747fc08000000000000000000000000000000000000000000000000009ed4c2e0726c8600000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,0x7da0ebe1069e4070336264ce02eb9d753ce671a43ea53f3a9ab887c4c4f421d9,2022-09-07 08:34:53.000 UTC,0,true -3231,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec34000000000000000000000000afef7e6c7cc8ee1ce7140fdacee481ed5f219113000000000000000000000000afef7e6c7cc8ee1ce7140fdacee481ed5f21911300000000000000000000000000000000000000000000000000071afd498d000000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -3233,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec34000000000000000000000000449833c57904f9d88cd3c26932060a329b93fe94000000000000000000000000449833c57904f9d88cd3c26932060a329b93fe940000000000000000000000000000000000000000000000000011c37937e0800000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -3234,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec340000000000000000000000005516a8e92c56017699437689959098d7454669260000000000000000000000005516a8e92c56017699437689959098d74546692600000000000000000000000000000000000000000000000000ce8f2b09b9b90400000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,0xf06371c25e66dc83ef6b838bd73c68db17552f18c653fd39e65f5157cec3e02e,2022-06-01 11:26:36.000 UTC,0,true -3235,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec34000000000000000000000000400d7004932cbbf9cecdf4adc879f41d6d21446d000000000000000000000000400d7004932cbbf9cecdf4adc879f41d6d21446d00000000000000000000000000000000000000000000000000470de4df82000000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,0x7c82eb2e8e7ec23e1a172c3195e2113ebfa0a10f5bc610bfdf66e5423bebcfd3,2022-03-13 18:41:26.000 UTC,0,true -3236,0x10e6593cdda8c58a1d0f14c5164b376352a55f2f,0x467194771dae2967aef3ecbedd3bf9a310c76c65,0xa9f9e6750000000000000000000000006b175474e89094c44da98b954eedeac495271d0f000000000000000000000000da10009cbd5d07dd0cecc66161fc93d7c9000da10000000000000000000000009d842ea243d72d025d3765e262d65a3d67e3eee50000000000000000000000009d842ea243d72d025d3765e262d65a3d67e3eee500000000000000000000000000000000000000000000000029a2241af62c000000000000000000000000000000000000000000000000000000000000000000c00000000000000000000000000000000000000000000000000000000000000000,,,1,true -3237,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec340000000000000000000000001a80ffb74fc19d8a6d30ecd2cd0fd9402840cbcc0000000000000000000000001a80ffb74fc19d8a6d30ecd2cd0fd9402840cbcc000000000000000000000000000000000000000000000000015abb4a7c76790000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,0x43d6fa1fd970ed5d5b5ad360e37d3e72a4c066e0667ebee20ed26b5c3d30a36f,2022-03-26 10:00:56.000 UTC,0,true -3238,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec34000000000000000000000000efa5d5c4816b2fdca66a6cbfb01b7f1767e82176000000000000000000000000efa5d5c4816b2fdca66a6cbfb01b7f1767e8217600000000000000000000000000000000000000000000000000071afd498d000000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -3240,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec34000000000000000000000000495e9ac565e21f89589675d8a93133a54d7d831c000000000000000000000000495e9ac565e21f89589675d8a93133a54d7d831c00000000000000000000000000000000000000000000000002c68af0bb14000000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -3243,0xcd9d4988c0ae61887b075ba77f08cbfad2b65068,0x3f87ff1de58128ef8fcb4c807efd776e1ac72e51,0xf4f7b41a00000000000000000000000083d420a602b5cd560ac5fa9bbca0d5e91e4cb975000000000000000000000000000000000000000000000002f61d2ac547c71cfe,,,1,true -3244,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec34000000000000000000000000d2a4fe75cca5fce383be6550a87a05bf3653789a000000000000000000000000d2a4fe75cca5fce383be6550a87a05bf3653789a000000000000000000000000000000000000000000000000013ba2bd2330a77300000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -3247,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec340000000000000000000000002d81c7a2ca633703c7f171c460413ee590ff33e40000000000000000000000002d81c7a2ca633703c7f171c460413ee590ff33e4000000000000000000000000000000000000000000000000014e242122773ce700000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -3250,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec34000000000000000000000000187da357c4470445f2cb9476afc445875eefc6e5000000000000000000000000187da357c4470445f2cb9476afc445875eefc6e50000000000000000000000000000000000000000000000000096fd865af4400000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -3251,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec340000000000000000000000002e5745f3136e1023b7db402f2f20d59ece802f4a0000000000000000000000002e5745f3136e1023b7db402f2f20d59ece802f4a000000000000000000000000000000000000000000000000000ee96c5d2f714800000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -3253,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec340000000000000000000000002e5745f3136e1023b7db402f2f20d59ece802f4a0000000000000000000000002e5745f3136e1023b7db402f2f20d59ece802f4a000000000000000000000000000000000000000000000000003d1dca1ae882de00000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -3254,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec34000000000000000000000000dc18c785ee9f9d3b797f4b034af8d20bb2ca1e25000000000000000000000000dc18c785ee9f9d3b797f4b034af8d20bb2ca1e250000000000000000000000000000000000000000000000000ee48f826966c94100000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -3255,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec3400000000000000000000000088a4b2e09b7c47f0c1434f277c56a5baba0f564400000000000000000000000088a4b2e09b7c47f0c1434f277c56a5baba0f56440000000000000000000000000000000000000000000000000098c445ad57800000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -3256,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec34000000000000000000000000a39ab9a6e560dbc803a9f5a4ce733e567d35de8b000000000000000000000000a39ab9a6e560dbc803a9f5a4ce733e567d35de8b00000000000000000000000000000000000000000000000000809b16e8257a8600000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -3259,0x72209fe68386b37a40d6bca04f78356fd342491f,0xe22d2bedb3eca35e6397e0c6d62857094aa26f52,0xef6ebe5e000000000000000000000000000000000000000000000000000000000000000adca2d0e82c65c3c9bde8441a665eb73b95dd5c91230bab3d96eeec005f12e889000000000000000000000000000000000000000000000000000000000000006400000000000000000000000000000000000000000000000000000000000f446700000000000000000000000000000000000000000000000000000000613bd7fe,,,1,true -3263,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec34000000000000000000000000f310e3613336773ba176fc7b9f90bdb43f7126c3000000000000000000000000f310e3613336773ba176fc7b9f90bdb43f7126c300000000000000000000000000000000000000000000000000510c5675d24b4000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -3267,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec34000000000000000000000000e2c7acc7679eb83585fe171f7f7f5974adf77183000000000000000000000000e2c7acc7679eb83585fe171f7f7f5974adf771830000000000000000000000000000000000000000000000000034b29848cb369f00000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -3269,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec34000000000000000000000000ca5bf99cdeb411d7f4db43a9bc41d5ed0ce9f979000000000000000000000000ca5bf99cdeb411d7f4db43a9bc41d5ed0ce9f9790000000000000000000000000000000000000000000000000009030fa91c68c000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -3271,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec34000000000000000000000000767d7106ee69d311d0e483d0f1bbbf109b85429c000000000000000000000000767d7106ee69d311d0e483d0f1bbbf109b85429c000000000000000000000000000000000000000000000000029e24cae0ad987000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -3272,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec34000000000000000000000000211db282704d8b184450c123950c4f45ffa95383000000000000000000000000211db282704d8b184450c123950c4f45ffa95383000000000000000000000000000000000000000000000000001c9515dff3150000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -3273,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec34000000000000000000000000282f7783c091b115c96f0de119b0fe104b40813f000000000000000000000000282f7783c091b115c96f0de119b0fe104b40813f00000000000000000000000000000000000000000000000002a1e5ac7c671e8f00000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -3274,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec3400000000000000000000000091a4f00bac6190d6bcbd10ee83ccee83f094f8a500000000000000000000000091a4f00bac6190d6bcbd10ee83ccee83f094f8a500000000000000000000000000000000000000000000000000753d533d96800000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -3275,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec3400000000000000000000000051b0c5368c7efb044efa2e3f39f851e7617db28600000000000000000000000051b0c5368c7efb044efa2e3f39f851e7617db28600000000000000000000000000000000000000000000000002aa19ea93d69c1300000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -3276,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec34000000000000000000000000db41304d12e287c1bfd74d6965afb106583839b4000000000000000000000000db41304d12e287c1bfd74d6965afb106583839b400000000000000000000000000000000000000000000000002a1229f3baf469000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -3278,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec34000000000000000000000000f9d9eb50b69be30cde50e1875bb82fb90f1b2695000000000000000000000000f9d9eb50b69be30cde50e1875bb82fb90f1b269500000000000000000000000000000000000000000000000002a3f2a22d254e4200000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -3279,0x10e6593cdda8c58a1d0f14c5164b376352a55f2f,0x467194771dae2967aef3ecbedd3bf9a310c76c65,0xa9f9e6750000000000000000000000006b175474e89094c44da98b954eedeac495271d0f000000000000000000000000da10009cbd5d07dd0cecc66161fc93d7c9000da10000000000000000000000005a98f0a07458621598e591a1255316e6515813e40000000000000000000000005a98f0a07458621598e591a1255316e6515813e400000000000000000000000000000000000000000000000014667d362bd3000000000000000000000000000000000000000000000000000000000000000000c00000000000000000000000000000000000000000000000000000000000000000,,,1,true -3280,0x10e6593cdda8c58a1d0f14c5164b376352a55f2f,0x467194771dae2967aef3ecbedd3bf9a310c76c65,0xa9f9e6750000000000000000000000006b175474e89094c44da98b954eedeac495271d0f000000000000000000000000da10009cbd5d07dd0cecc66161fc93d7c9000da100000000000000000000000093adf2405d5a96e854b35401a3d38673ecdab70800000000000000000000000093adf2405d5a96e854b35401a3d38673ecdab708000000000000000000000000000000000000000000000000148a04289b94000000000000000000000000000000000000000000000000000000000000000000c00000000000000000000000000000000000000000000000000000000000000000,,,1,true -3281,0x10e6593cdda8c58a1d0f14c5164b376352a55f2f,0x467194771dae2967aef3ecbedd3bf9a310c76c65,0xa9f9e6750000000000000000000000006b175474e89094c44da98b954eedeac495271d0f000000000000000000000000da10009cbd5d07dd0cecc66161fc93d7c9000da10000000000000000000000004ca8aea046f531bee57a41556ebf948accf8db6b0000000000000000000000004ca8aea046f531bee57a41556ebf948accf8db6b00000000000000000000000000000000000000000000000014ad8b1b0b55000000000000000000000000000000000000000000000000000000000000000000c00000000000000000000000000000000000000000000000000000000000000000,,,1,true -3282,0x10e6593cdda8c58a1d0f14c5164b376352a55f2f,0x467194771dae2967aef3ecbedd3bf9a310c76c65,0xa9f9e6750000000000000000000000006b175474e89094c44da98b954eedeac495271d0f000000000000000000000000da10009cbd5d07dd0cecc66161fc93d7c9000da10000000000000000000000004c5cc3eab1f3b9c2c86859721fcb1e9e7920c48d0000000000000000000000004c5cc3eab1f3b9c2c86859721fcb1e9e7920c48d00000000000000000000000000000000000000000000000014d1120d7b16000000000000000000000000000000000000000000000000000000000000000000c00000000000000000000000000000000000000000000000000000000000000000,,,1,true -3284,0x10e6593cdda8c58a1d0f14c5164b376352a55f2f,0x467194771dae2967aef3ecbedd3bf9a310c76c65,0xa9f9e6750000000000000000000000006b175474e89094c44da98b954eedeac495271d0f000000000000000000000000da10009cbd5d07dd0cecc66161fc93d7c9000da10000000000000000000000000a4cc2af15be61924bf69a677fc86140534b83320000000000000000000000000a4cc2af15be61924bf69a677fc86140534b833200000000000000000000000000000000000000000000000014f498ffead7000000000000000000000000000000000000000000000000000000000000000000c00000000000000000000000000000000000000000000000000000000000000000,,,1,true -3285,0x10e6593cdda8c58a1d0f14c5164b376352a55f2f,0x467194771dae2967aef3ecbedd3bf9a310c76c65,0xa9f9e6750000000000000000000000006b175474e89094c44da98b954eedeac495271d0f000000000000000000000000da10009cbd5d07dd0cecc66161fc93d7c9000da1000000000000000000000000dda1beb63aa1e4e3b0b0defeef32d843d99cf02e000000000000000000000000dda1beb63aa1e4e3b0b0defeef32d843d99cf02e00000000000000000000000000000000000000000000000015181ff25a98000000000000000000000000000000000000000000000000000000000000000000c00000000000000000000000000000000000000000000000000000000000000000,,,1,true -3286,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec3400000000000000000000000082f6c30e1bd3c41e7d21c4c42fc71836c1e9738700000000000000000000000082f6c30e1bd3c41e7d21c4c42fc71836c1e9738700000000000000000000000000000000000000000000000002a2276d2960fcca00000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -3287,0x10e6593cdda8c58a1d0f14c5164b376352a55f2f,0x467194771dae2967aef3ecbedd3bf9a310c76c65,0xa9f9e6750000000000000000000000006b175474e89094c44da98b954eedeac495271d0f000000000000000000000000da10009cbd5d07dd0cecc66161fc93d7c9000da10000000000000000000000000314dcaacfceb25363ffb8c3888068de978d64060000000000000000000000000314dcaacfceb25363ffb8c3888068de978d6406000000000000000000000000000000000000000000000000153ba6e4ca59000000000000000000000000000000000000000000000000000000000000000000c00000000000000000000000000000000000000000000000000000000000000000,,,1,true -3288,0x10e6593cdda8c58a1d0f14c5164b376352a55f2f,0x467194771dae2967aef3ecbedd3bf9a310c76c65,0xa9f9e6750000000000000000000000006b175474e89094c44da98b954eedeac495271d0f000000000000000000000000da10009cbd5d07dd0cecc66161fc93d7c9000da10000000000000000000000001e63f2bb3abdc22fea164895c756c732d55086d10000000000000000000000001e63f2bb3abdc22fea164895c756c732d55086d1000000000000000000000000000000000000000000000000155f2dd73a1a000000000000000000000000000000000000000000000000000000000000000000c00000000000000000000000000000000000000000000000000000000000000000,,,1,true -3289,0x10e6593cdda8c58a1d0f14c5164b376352a55f2f,0x467194771dae2967aef3ecbedd3bf9a310c76c65,0xa9f9e6750000000000000000000000006b175474e89094c44da98b954eedeac495271d0f000000000000000000000000da10009cbd5d07dd0cecc66161fc93d7c9000da10000000000000000000000001494636d65ed41ffb4b614f395b17fc8fa57b3550000000000000000000000001494636d65ed41ffb4b614f395b17fc8fa57b3550000000000000000000000000000000000000000000000001582b4c9a9db000000000000000000000000000000000000000000000000000000000000000000c00000000000000000000000000000000000000000000000000000000000000000,,,1,true -3290,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0xa9f9e675000000000000000000000000dac17f958d2ee523a2206206994597c13d831ec700000000000000000000000094b008aa00579c1307b0ef2c499ad98a8ce58e58000000000000000000000000c14795b0683e2ba07d4b59d1dc21ac5142116079000000000000000000000000c14795b0683e2ba07d4b59d1dc21ac5142116079000000000000000000000000000000000000000000000000000000000017cdc000000000000000000000000000000000000000000000000000000000000000c00000000000000000000000000000000000000000000000000000000000000000,,,1,true -3291,0x10e6593cdda8c58a1d0f14c5164b376352a55f2f,0x467194771dae2967aef3ecbedd3bf9a310c76c65,0xa9f9e6750000000000000000000000006b175474e89094c44da98b954eedeac495271d0f000000000000000000000000da10009cbd5d07dd0cecc66161fc93d7c9000da100000000000000000000000012d1c9ce4475201e93fa9a18952efb549dd8273100000000000000000000000012d1c9ce4475201e93fa9a18952efb549dd8273100000000000000000000000000000000000000000000000015c9c2ae895d000000000000000000000000000000000000000000000000000000000000000000c00000000000000000000000000000000000000000000000000000000000000000,,,1,true -3292,0x10e6593cdda8c58a1d0f14c5164b376352a55f2f,0x467194771dae2967aef3ecbedd3bf9a310c76c65,0xa9f9e6750000000000000000000000006b175474e89094c44da98b954eedeac495271d0f000000000000000000000000da10009cbd5d07dd0cecc66161fc93d7c9000da1000000000000000000000000c00e2fcc125ad1258fe8a0c2d677d56129ad972d000000000000000000000000c00e2fcc125ad1258fe8a0c2d677d56129ad972d00000000000000000000000000000000000000000000000015ed49a0f91e000000000000000000000000000000000000000000000000000000000000000000c00000000000000000000000000000000000000000000000000000000000000000,,,1,true -3293,0x10e6593cdda8c58a1d0f14c5164b376352a55f2f,0x467194771dae2967aef3ecbedd3bf9a310c76c65,0xa9f9e6750000000000000000000000006b175474e89094c44da98b954eedeac495271d0f000000000000000000000000da10009cbd5d07dd0cecc66161fc93d7c9000da1000000000000000000000000288da700ec522cf8db1c8b275077c87918d3f09e000000000000000000000000288da700ec522cf8db1c8b275077c87918d3f09e0000000000000000000000000000000000000000000000001610d09368df000000000000000000000000000000000000000000000000000000000000000000c00000000000000000000000000000000000000000000000000000000000000000,,,1,true -3294,0x10e6593cdda8c58a1d0f14c5164b376352a55f2f,0x467194771dae2967aef3ecbedd3bf9a310c76c65,0xa9f9e6750000000000000000000000006b175474e89094c44da98b954eedeac495271d0f000000000000000000000000da10009cbd5d07dd0cecc66161fc93d7c9000da10000000000000000000000000ce07fab029d302412d6af25958c7ffa624aa4c30000000000000000000000000ce07fab029d302412d6af25958c7ffa624aa4c300000000000000000000000000000000000000000000000016345785d8a0000000000000000000000000000000000000000000000000000000000000000000c00000000000000000000000000000000000000000000000000000000000000000,,,1,true -3295,0x10e6593cdda8c58a1d0f14c5164b376352a55f2f,0x467194771dae2967aef3ecbedd3bf9a310c76c65,0xa9f9e6750000000000000000000000006b175474e89094c44da98b954eedeac495271d0f000000000000000000000000da10009cbd5d07dd0cecc66161fc93d7c9000da1000000000000000000000000dda831e92882db02f5c7a41f81cb1a6686143a09000000000000000000000000dda831e92882db02f5c7a41f81cb1a6686143a090000000000000000000000000000000000000000000000001657de784861000000000000000000000000000000000000000000000000000000000000000000c00000000000000000000000000000000000000000000000000000000000000000,,,1,true -3296,0x10e6593cdda8c58a1d0f14c5164b376352a55f2f,0x467194771dae2967aef3ecbedd3bf9a310c76c65,0xa9f9e6750000000000000000000000006b175474e89094c44da98b954eedeac495271d0f000000000000000000000000da10009cbd5d07dd0cecc66161fc93d7c9000da1000000000000000000000000132e62f776a7d4ea7f699dc254cf0183f676bfb4000000000000000000000000132e62f776a7d4ea7f699dc254cf0183f676bfb4000000000000000000000000000000000000000000000000167b656ab822000000000000000000000000000000000000000000000000000000000000000000c00000000000000000000000000000000000000000000000000000000000000000,,,1,true -3297,0x10e6593cdda8c58a1d0f14c5164b376352a55f2f,0x467194771dae2967aef3ecbedd3bf9a310c76c65,0xa9f9e6750000000000000000000000006b175474e89094c44da98b954eedeac495271d0f000000000000000000000000da10009cbd5d07dd0cecc66161fc93d7c9000da1000000000000000000000000417990fb7123caf0408ab8e6bf0ce940bcbc1984000000000000000000000000417990fb7123caf0408ab8e6bf0ce940bcbc1984000000000000000000000000000000000000000000000000169eec5d27e3000000000000000000000000000000000000000000000000000000000000000000c00000000000000000000000000000000000000000000000000000000000000000,,,1,true -3298,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec3400000000000000000000000051ceb0212c459d33f2abd2ef42aa032148c63ff700000000000000000000000051ceb0212c459d33f2abd2ef42aa032148c63ff7000000000000000000000000000000000000000000000000009fdf42f6e4800000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -3299,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec34000000000000000000000000bdf600a6d8a8afba5f04a98332819aa3a5780c1a000000000000000000000000bdf600a6d8a8afba5f04a98332819aa3a5780c1a000000000000000000000000000000000000000000000000025dd7c56866a34600000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -3300,0x10e6593cdda8c58a1d0f14c5164b376352a55f2f,0x467194771dae2967aef3ecbedd3bf9a310c76c65,0xa9f9e6750000000000000000000000006b175474e89094c44da98b954eedeac495271d0f000000000000000000000000da10009cbd5d07dd0cecc66161fc93d7c9000da100000000000000000000000078375e9e5718166d1bc359a83a70b9f1616d729700000000000000000000000078375e9e5718166d1bc359a83a70b9f1616d729700000000000000000000000000000000000000000000000016c2734f97a4000000000000000000000000000000000000000000000000000000000000000000c00000000000000000000000000000000000000000000000000000000000000000,,,1,true -3301,0x10e6593cdda8c58a1d0f14c5164b376352a55f2f,0x467194771dae2967aef3ecbedd3bf9a310c76c65,0xa9f9e6750000000000000000000000006b175474e89094c44da98b954eedeac495271d0f000000000000000000000000da10009cbd5d07dd0cecc66161fc93d7c9000da1000000000000000000000000b5e80f61156a718da4e38370e7b05ce996ebe682000000000000000000000000b5e80f61156a718da4e38370e7b05ce996ebe68200000000000000000000000000000000000000000000000016e5fa420765000000000000000000000000000000000000000000000000000000000000000000c00000000000000000000000000000000000000000000000000000000000000000,,,1,true -3302,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec34000000000000000000000000a3c983daa3288f2b15bba878a97042dcbf61c698000000000000000000000000a3c983daa3288f2b15bba878a97042dcbf61c6980000000000000000000000000000000000000000000000000023b95a97533e0000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -3303,0x10e6593cdda8c58a1d0f14c5164b376352a55f2f,0x467194771dae2967aef3ecbedd3bf9a310c76c65,0xa9f9e6750000000000000000000000006b175474e89094c44da98b954eedeac495271d0f000000000000000000000000da10009cbd5d07dd0cecc66161fc93d7c9000da10000000000000000000000002b9f0d9259597fabeeed9c3f24f80804a708f6ac0000000000000000000000002b9f0d9259597fabeeed9c3f24f80804a708f6ac000000000000000000000000000000000000000000000000170981347726000000000000000000000000000000000000000000000000000000000000000000c00000000000000000000000000000000000000000000000000000000000000000,,,1,true -3304,0x10e6593cdda8c58a1d0f14c5164b376352a55f2f,0x467194771dae2967aef3ecbedd3bf9a310c76c65,0xa9f9e6750000000000000000000000006b175474e89094c44da98b954eedeac495271d0f000000000000000000000000da10009cbd5d07dd0cecc66161fc93d7c9000da1000000000000000000000000ea91b1d966822bed13d43ffe992e98560175a1c0000000000000000000000000ea91b1d966822bed13d43ffe992e98560175a1c0000000000000000000000000000000000000000000000000172d0826e6e7000000000000000000000000000000000000000000000000000000000000000000c00000000000000000000000000000000000000000000000000000000000000000,,,1,true -3305,0x10e6593cdda8c58a1d0f14c5164b376352a55f2f,0x467194771dae2967aef3ecbedd3bf9a310c76c65,0xa9f9e6750000000000000000000000006b175474e89094c44da98b954eedeac495271d0f000000000000000000000000da10009cbd5d07dd0cecc66161fc93d7c9000da1000000000000000000000000b9662f040de73de8ef26ea04bfcdb6ffbb8087c1000000000000000000000000b9662f040de73de8ef26ea04bfcdb6ffbb8087c100000000000000000000000000000000000000000000000017508f1956a8000000000000000000000000000000000000000000000000000000000000000000c00000000000000000000000000000000000000000000000000000000000000000,,,1,true -3306,0x10e6593cdda8c58a1d0f14c5164b376352a55f2f,0x467194771dae2967aef3ecbedd3bf9a310c76c65,0xa9f9e6750000000000000000000000006b175474e89094c44da98b954eedeac495271d0f000000000000000000000000da10009cbd5d07dd0cecc66161fc93d7c9000da1000000000000000000000000aa164df04a535f6d7db441e5657fb06157132142000000000000000000000000aa164df04a535f6d7db441e5657fb061571321420000000000000000000000000000000000000000000000001774160bc669000000000000000000000000000000000000000000000000000000000000000000c00000000000000000000000000000000000000000000000000000000000000000,,,1,true -3307,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec3400000000000000000000000090ff89c637fd1537e151b8ced1d1d0cb94e31ca600000000000000000000000090ff89c637fd1537e151b8ced1d1d0cb94e31ca6000000000000000000000000000000000000000000000000000ced4c2338705800000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -3308,0x10e6593cdda8c58a1d0f14c5164b376352a55f2f,0x467194771dae2967aef3ecbedd3bf9a310c76c65,0xa9f9e6750000000000000000000000006b175474e89094c44da98b954eedeac495271d0f000000000000000000000000da10009cbd5d07dd0cecc66161fc93d7c9000da10000000000000000000000001141c2896cb6b5409181f76b172bea039e85e7030000000000000000000000001141c2896cb6b5409181f76b172bea039e85e70300000000000000000000000000000000000000000000000017979cfe362a000000000000000000000000000000000000000000000000000000000000000000c00000000000000000000000000000000000000000000000000000000000000000,,,1,true -3309,0x10e6593cdda8c58a1d0f14c5164b376352a55f2f,0x467194771dae2967aef3ecbedd3bf9a310c76c65,0xa9f9e6750000000000000000000000006b175474e89094c44da98b954eedeac495271d0f000000000000000000000000da10009cbd5d07dd0cecc66161fc93d7c9000da100000000000000000000000019d3b5a309ca1d80a65db63981b753c292122ab600000000000000000000000019d3b5a309ca1d80a65db63981b753c292122ab600000000000000000000000000000000000000000000000017bb23f0a5eb000000000000000000000000000000000000000000000000000000000000000000c00000000000000000000000000000000000000000000000000000000000000000,,,1,true -3310,0x10e6593cdda8c58a1d0f14c5164b376352a55f2f,0x467194771dae2967aef3ecbedd3bf9a310c76c65,0xa9f9e6750000000000000000000000006b175474e89094c44da98b954eedeac495271d0f000000000000000000000000da10009cbd5d07dd0cecc66161fc93d7c9000da10000000000000000000000002b1975dc5ccbcbd9eadb427c3c5e3e16d84585130000000000000000000000002b1975dc5ccbcbd9eadb427c3c5e3e16d845851300000000000000000000000000000000000000000000000017deaae315ac000000000000000000000000000000000000000000000000000000000000000000c00000000000000000000000000000000000000000000000000000000000000000,,,1,true -3312,0x10e6593cdda8c58a1d0f14c5164b376352a55f2f,0x467194771dae2967aef3ecbedd3bf9a310c76c65,0xa9f9e6750000000000000000000000006b175474e89094c44da98b954eedeac495271d0f000000000000000000000000da10009cbd5d07dd0cecc66161fc93d7c9000da1000000000000000000000000896efe04e776e61958d955ccf7818813a8854d38000000000000000000000000896efe04e776e61958d955ccf7818813a8854d38000000000000000000000000000000000000000000000000180231d5856d000000000000000000000000000000000000000000000000000000000000000000c00000000000000000000000000000000000000000000000000000000000000000,,,1,true -3313,0x10e6593cdda8c58a1d0f14c5164b376352a55f2f,0x467194771dae2967aef3ecbedd3bf9a310c76c65,0xa9f9e6750000000000000000000000006b175474e89094c44da98b954eedeac495271d0f000000000000000000000000da10009cbd5d07dd0cecc66161fc93d7c9000da10000000000000000000000002dcdba685fdb924a4f871f3f898d14a7217db8350000000000000000000000002dcdba685fdb924a4f871f3f898d14a7217db8350000000000000000000000000000000000000000000000001825b8c7f52e000000000000000000000000000000000000000000000000000000000000000000c00000000000000000000000000000000000000000000000000000000000000000,,,1,true -3314,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec34000000000000000000000000bf62408b238fd7713c897b976fdabab99acdc978000000000000000000000000bf62408b238fd7713c897b976fdabab99acdc9780000000000000000000000000000000000000000000000000194e6f86a19876b00000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -3316,0x10e6593cdda8c58a1d0f14c5164b376352a55f2f,0x467194771dae2967aef3ecbedd3bf9a310c76c65,0xa9f9e6750000000000000000000000006b175474e89094c44da98b954eedeac495271d0f000000000000000000000000da10009cbd5d07dd0cecc66161fc93d7c9000da100000000000000000000000081901a580db0e4cc3f23d7e643486189747d5c7d00000000000000000000000081901a580db0e4cc3f23d7e643486189747d5c7d00000000000000000000000000000000000000000000000018493fba64ef000000000000000000000000000000000000000000000000000000000000000000c00000000000000000000000000000000000000000000000000000000000000000,,,1,true -3317,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec3400000000000000000000000026eccf86bc1ebdb8da230611c722e8e39ba0738300000000000000000000000026eccf86bc1ebdb8da230611c722e8e39ba07383000000000000000000000000000000000000000000000000001d1be2de5ffb0000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -3318,0x10e6593cdda8c58a1d0f14c5164b376352a55f2f,0x467194771dae2967aef3ecbedd3bf9a310c76c65,0xa9f9e6750000000000000000000000006b175474e89094c44da98b954eedeac495271d0f000000000000000000000000da10009cbd5d07dd0cecc66161fc93d7c9000da10000000000000000000000009c8de489ced4a11e8307cfe405283b0e6c81c6110000000000000000000000009c8de489ced4a11e8307cfe405283b0e6c81c611000000000000000000000000000000000000000000000000186cc6acd4b0000000000000000000000000000000000000000000000000000000000000000000c00000000000000000000000000000000000000000000000000000000000000000,,,1,true -3320,0x10e6593cdda8c58a1d0f14c5164b376352a55f2f,0x467194771dae2967aef3ecbedd3bf9a310c76c65,0xa9f9e6750000000000000000000000006b175474e89094c44da98b954eedeac495271d0f000000000000000000000000da10009cbd5d07dd0cecc66161fc93d7c9000da1000000000000000000000000639ebb299c6faa4d1d8e2e6ffed0e8942df2ade9000000000000000000000000639ebb299c6faa4d1d8e2e6ffed0e8942df2ade900000000000000000000000000000000000000000000000018904d9f4471000000000000000000000000000000000000000000000000000000000000000000c00000000000000000000000000000000000000000000000000000000000000000,,,1,true -3321,0x10e6593cdda8c58a1d0f14c5164b376352a55f2f,0x467194771dae2967aef3ecbedd3bf9a310c76c65,0xa9f9e6750000000000000000000000006b175474e89094c44da98b954eedeac495271d0f000000000000000000000000da10009cbd5d07dd0cecc66161fc93d7c9000da1000000000000000000000000e13cbd05f314c4eeb5882cc6f4e827c6b4269ade000000000000000000000000e13cbd05f314c4eeb5882cc6f4e827c6b4269ade00000000000000000000000000000000000000000000000018b3d491b432000000000000000000000000000000000000000000000000000000000000000000c00000000000000000000000000000000000000000000000000000000000000000,,,1,true -3322,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec3400000000000000000000000004c17d923fd9f18f2399e9589ab80ab62f85b40700000000000000000000000004c17d923fd9f18f2399e9589ab80ab62f85b40700000000000000000000000000000000000000000000000001543e98f74f8b5900000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -3325,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec34000000000000000000000000e103a6e98867f56c35aba038e630700d8a305f1c000000000000000000000000e103a6e98867f56c35aba038e630700d8a305f1c000000000000000000000000000000000000000000000000006a94d74f43000000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -3326,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec340000000000000000000000001b55348c5b5c44c3912b3e306096f0d69bf85c6e0000000000000000000000001b55348c5b5c44c3912b3e306096f0d69bf85c6e00000000000000000000000000000000000000000000000000a17c436687784400000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -3327,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec34000000000000000000000000f9c877f2456fc3eb2e2d398dadc4d5a4b5531896000000000000000000000000f9c877f2456fc3eb2e2d398dadc4d5a4b553189600000000000000000000000000000000000000000000000000621ea9271a850000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -3329,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec34000000000000000000000000eceab9cb452a1912437e43bc96a12a0279803c51000000000000000000000000eceab9cb452a1912437e43bc96a12a0279803c51000000000000000000000000000000000000000000000000005fec5b60ef800000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -3330,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec34000000000000000000000000200241c7796b3b9dde312d330e847807d087ec4e000000000000000000000000200241c7796b3b9dde312d330e847807d087ec4e00000000000000000000000000000000000000000000000001328743305a80dc00000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -3331,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec34000000000000000000000000f9c877f2456fc3eb2e2d398dadc4d5a4b5531896000000000000000000000000f9c877f2456fc3eb2e2d398dadc4d5a4b5531896000000000000000000000000000000000000000000000000000073521eb9b70000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -3332,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec340000000000000000000000005cb6eca18d1514300e3f7a49334bcdcc4d7c32730000000000000000000000005cb6eca18d1514300e3f7a49334bcdcc4d7c3273000000000000000000000000000000000000000000000000015e96cdecadba0000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -3334,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec340000000000000000000000009626de291c92247b1688b829eee73111e1b836a20000000000000000000000009626de291c92247b1688b829eee73111e1b836a200000000000000000000000000000000000000000000000006f05b59d3b2000000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,0x8caf3b89edc7aa8ad08654522e6fcfde34252f1c627983783b615769dd5b3669,2021-12-21 10:37:44.000 UTC,0,true -3337,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec34000000000000000000000000ff4debb853d522d7038197c398385e5dfdbcdd55000000000000000000000000ff4debb853d522d7038197c398385e5dfdbcdd5500000000000000000000000000000000000000000000000002c059c56a59c80000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -3338,0xcd9d4988c0ae61887b075ba77f08cbfad2b65068,0x3f87ff1de58128ef8fcb4c807efd776e1ac72e51,0xf4f7b41a00000000000000000000000090bd35fc5e4375fc1c600e606927bd545696136100000000000000000000000000000000000000000000000098b3c96fdd34784c,,,1,true -3340,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec34000000000000000000000000f16d8d189b9066ffe94ba9df555c8dcc852b2dcb000000000000000000000000f16d8d189b9066ffe94ba9df555c8dcc852b2dcb000000000000000000000000000000000000000000000000028a17be1b94f10200000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -3341,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec3400000000000000000000000013269e29c6f58bd495fd3c12b94f85b2e22d88f600000000000000000000000013269e29c6f58bd495fd3c12b94f85b2e22d88f6000000000000000000000000000000000000000000000000000aa87bee53800000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -3342,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec340000000000000000000000009008d095c9abbeca43e837bc22066be3ba261c4f0000000000000000000000009008d095c9abbeca43e837bc22066be3ba261c4f00000000000000000000000000000000000000000000000000038d7ea4c6800000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -3343,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec340000000000000000000000004d477f1aabcfc2fc3fc9b802e861c013e0123ad90000000000000000000000004d477f1aabcfc2fc3fc9b802e861c013e0123ad900000000000000000000000000000000000000000000000000038d7ea4c6800000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -3344,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec34000000000000000000000000e474e4be5c881f17189fa229b69cee52160384ab000000000000000000000000e474e4be5c881f17189fa229b69cee52160384ab00000000000000000000000000000000000000000000000000b9742ff41970ce00000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -3346,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec34000000000000000000000000bfc7c7d2a8313b72ce2fea977286a0809a8a6dc2000000000000000000000000bfc7c7d2a8313b72ce2fea977286a0809a8a6dc20000000000000000000000000000000000000000000000000152ae9fda35fd0a00000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -3348,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec340000000000000000000000003b0f2700b69a59dc6d1a9eb0c0cf86c5530a0d620000000000000000000000003b0f2700b69a59dc6d1a9eb0c0cf86c5530a0d62000000000000000000000000000000000000000000000000007c58508723800000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -3349,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec34000000000000000000000000a515be738624462672cc7a4c3e0a3076716d7bee000000000000000000000000a515be738624462672cc7a4c3e0a3076716d7bee00000000000000000000000000000000000000000000000000b1a2bc2ec5000000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -3350,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec340000000000000000000000008990ed15e254593ce605c7cc4c1b8c836fd615d00000000000000000000000008990ed15e254593ce605c7cc4c1b8c836fd615d000000000000000000000000000000000000000000000000000b1a2bc2ec5000000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -3351,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec340000000000000000000000002d503f029266c7603094dcdca75e8529702a6d700000000000000000000000002d503f029266c7603094dcdca75e8529702a6d70000000000000000000000000000000000000000000000000000d013b1909a80000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -3352,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec3400000000000000000000000033cf288a08fac26094289e48b32f9d790642701e00000000000000000000000033cf288a08fac26094289e48b32f9d790642701e000000000000000000000000000000000000000000000000015e833a3eb3280000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -3353,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec340000000000000000000000006e3e80d88fd4e3417831b8686db83fc36dbe5fee0000000000000000000000006e3e80d88fd4e3417831b8686db83fc36dbe5fee000000000000000000000000000000000000000000000000015e76ec0bdb240000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -3354,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec34000000000000000000000000d63d28282eeeace4d4d2c67ebb798f3a2ca782b1000000000000000000000000d63d28282eeeace4d4d2c67ebb798f3a2ca782b1000000000000000000000000000000000000000000000000015e76ec0bdb240000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -3355,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec3400000000000000000000000081077dea57decabfbbeb8648adca22d42d106c8c00000000000000000000000081077dea57decabfbbeb8648adca22d42d106c8c0000000000000000000000000000000000000000000000000081519b6dd3000000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -3357,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec34000000000000000000000000ddcc4cf0463838e508014d5f131f38c29171835e000000000000000000000000ddcc4cf0463838e508014d5f131f38c29171835e0000000000000000000000000000000000000000000000000090ffe62823132a00000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -3362,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec34000000000000000000000000f76562172ad54453a3e3fab93560cb3aee9750d4000000000000000000000000f76562172ad54453a3e3fab93560cb3aee9750d4000000000000000000000000000000000000000000000000001e32b47897400000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -3364,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec3400000000000000000000000059c57d18c14ab828dcfe1fbc212319ed3980448000000000000000000000000059c57d18c14ab828dcfe1fbc212319ed3980448000000000000000000000000000000000000000000000000000038d7ea4c6800000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -3365,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0xa9f9e675000000000000000000000000dac17f958d2ee523a2206206994597c13d831ec700000000000000000000000094b008aa00579c1307b0ef2c499ad98a8ce58e5800000000000000000000000058fce926a96977e4090a021935ec8832e9d1453000000000000000000000000058fce926a96977e4090a021935ec8832e9d1453000000000000000000000000000000000000000000000000000000000000f424000000000000000000000000000000000000000000000000000000000000000c00000000000000000000000000000000000000000000000000000000000000000,,,1,true -3366,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec3400000000000000000000000087a40539b3f0ad7dec878f332ce1ba01f90f815c00000000000000000000000087a40539b3f0ad7dec878f332ce1ba01f90f815c000000000000000000000000000000000000000000000000005fe752f07faa2900000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -3367,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec34000000000000000000000000cda2aaaf034bc06efa3c7f0af5ae2a05e4d5cd82000000000000000000000000cda2aaaf034bc06efa3c7f0af5ae2a05e4d5cd8200000000000000000000000000000000000000000000000000038d7ea4c6800000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -3369,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec34000000000000000000000000530bdc7b11bd02875fdc9d7a4441478c8ca5ccfd000000000000000000000000530bdc7b11bd02875fdc9d7a4441478c8ca5ccfd00000000000000000000000000000000000000000000000000038d7ea4c6800000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -3370,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec34000000000000000000000000b2ddb1f4c1404b9e35ba5c3012119bc0aa4d687e000000000000000000000000b2ddb1f4c1404b9e35ba5c3012119bc0aa4d687e000000000000000000000000000000000000000000000000007ed4f5fa7b400000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -3371,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec340000000000000000000000000f1c7f93771ccbaf028482e843040559b42998430000000000000000000000000f1c7f93771ccbaf028482e843040559b429984300000000000000000000000000000000000000000000000000038d7ea4c6800000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -3372,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec340000000000000000000000007f8025c35f4ef7e015fbd4becb2d3b9fe7f6683a0000000000000000000000007f8025c35f4ef7e015fbd4becb2d3b9fe7f6683a000000000000000000000000000000000000000000000000002386f26fc1000000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -3374,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec340000000000000000000000009c3c47833c7a277df1e0e5f17deceea1534a75470000000000000000000000009c3c47833c7a277df1e0e5f17deceea1534a75470000000000000000000000000000000000000000000000000036372a332aa84700000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -3375,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec340000000000000000000000008a259ac7276b58b49b9f2dcc8addd19cc31659430000000000000000000000008a259ac7276b58b49b9f2dcc8addd19cc3165943000000000000000000000000000000000000000000000000001d5969dc980f0000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -3376,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec3400000000000000000000000087a670ea67703d1268d93634eac67cb8549627a600000000000000000000000087a670ea67703d1268d93634eac67cb8549627a6000000000000000000000000000000000000000000000000005987443857000000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -3378,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec3400000000000000000000000043b68fdacc9069a33554ec2964bd21ce5a282d6500000000000000000000000043b68fdacc9069a33554ec2964bd21ce5a282d65000000000000000000000000000000000000000000000000003914c4e7ac523d00000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -3379,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec340000000000000000000000004998b45f0ceebe955ddce8afdab92338945695590000000000000000000000004998b45f0ceebe955ddce8afdab9233894569559000000000000000000000000000000000000000000000000007980b80351800000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -3381,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec340000000000000000000000004d477f1aabcfc2fc3fc9b802e861c013e0123ad90000000000000000000000004d477f1aabcfc2fc3fc9b802e861c013e0123ad900000000000000000000000000000000000000000000000000038d7ea4c6800000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -3384,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec340000000000000000000000002ed4df7a1795021bc6c6b4767d36dd755f7b5de10000000000000000000000002ed4df7a1795021bc6c6b4767d36dd755f7b5de1000000000000000000000000000000000000000000000000024829b72b2b9acf00000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -3385,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec34000000000000000000000000ffed310be751fc94780f12884a641a507122cf0e000000000000000000000000ffed310be751fc94780f12884a641a507122cf0e000000000000000000000000000000000000000000000000007d0e36a818000000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -3388,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec34000000000000000000000000f9dc2911ba911112b4d587a4fc6e9725c565dd45000000000000000000000000f9dc2911ba911112b4d587a4fc6e9725c565dd4500000000000000000000000000000000000000000000000006d82474d9cee7af00000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -3390,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec340000000000000000000000002e3b7571a9cc44eb7a1057ee4a61cc564dd5783e0000000000000000000000002e3b7571a9cc44eb7a1057ee4a61cc564dd5783e0000000000000000000000000000000000000000000000000032fa3ec820da4000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -3392,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec3400000000000000000000000027e8769cdc626d0ff052ea52c783176a87fe52ce00000000000000000000000027e8769cdc626d0ff052ea52c783176a87fe52ce00000000000000000000000000000000000000000000000000038d7ea4c6800000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -3393,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec34000000000000000000000000def2262aa7c28dea9aeaf43603ac2b6913e19dee000000000000000000000000def2262aa7c28dea9aeaf43603ac2b6913e19dee000000000000000000000000000000000000000000000000007f2fe90af5800000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -3395,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0xa9f9e675000000000000000000000000a0b86991c6218b36c1d19d4a2e9eb0ce3606eb480000000000000000000000007f5c764cbc14f9669b88837ca1490cca17c3160700000000000000000000000006d7881358cf903f2c2db94a32d5c6ae9bc611f600000000000000000000000006d7881358cf903f2c2db94a32d5c6ae9bc611f60000000000000000000000000000000000000000000000000000000014cd475200000000000000000000000000000000000000000000000000000000000000c00000000000000000000000000000000000000000000000000000000000000000,,,1,true -3396,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec340000000000000000000000001bfd59fbc137d6d98416679d0d59ed9f0c2438d60000000000000000000000001bfd59fbc137d6d98416679d0d59ed9f0c2438d6000000000000000000000000000000000000000000000000007ef9573445c00000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -3397,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec34000000000000000000000000f9a1ded45d94ffde63cde4a504bf2d9ca38f53db000000000000000000000000f9a1ded45d94ffde63cde4a504bf2d9ca38f53db000000000000000000000000000000000000000000000000004b12b4a459bd4a00000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -3398,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec34000000000000000000000000b5918d2d19162d2b047f02c89fb27a95e018a409000000000000000000000000b5918d2d19162d2b047f02c89fb27a95e018a409000000000000000000000000000000000000000000000000005a066eacb6303d00000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -3399,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec3400000000000000000000000060948b99d47b5d6ae1201252ccf5208990bb55a500000000000000000000000060948b99d47b5d6ae1201252ccf5208990bb55a5000000000000000000000000000000000000000000000000007ef9573445c00000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -3400,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec34000000000000000000000000620f871707fe81697aa579dce88b49e9c28521aa000000000000000000000000620f871707fe81697aa579dce88b49e9c28521aa000000000000000000000000000000000000000000000000001c6bf52634000000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -3403,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec340000000000000000000000004365ffda68e2c62bbbf268f14513f94cdca633090000000000000000000000004365ffda68e2c62bbbf268f14513f94cdca63309000000000000000000000000000000000000000000000000002b76b6c924274f00000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -3404,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec34000000000000000000000000f1a021b880c6014292adcc9e034d9590ec85cfaf000000000000000000000000f1a021b880c6014292adcc9e034d9590ec85cfaf0000000000000000000000000000000000000000000000001873eda7cb4225a600000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -3406,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec34000000000000000000000000a94c1f22649181e825a70e7254e7c5357e908fd6000000000000000000000000a94c1f22649181e825a70e7254e7c5357e908fd600000000000000000000000000000000000000000000000000a93c12ec15560000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -3407,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec340000000000000000000000007442278f3223f890a450db47fb2f36788457bbb10000000000000000000000007442278f3223f890a450db47fb2f36788457bbb10000000000000000000000000000000000000000000000000dd8951e767c9b0000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -3409,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec3400000000000000000000000076911b907a11d18d52a4209265753f4244b9bf3900000000000000000000000076911b907a11d18d52a4209265753f4244b9bf3900000000000000000000000000000000000000000000000000071fc4efab330000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -3410,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec34000000000000000000000000607b03b3b4b8074142c7aec415e99ebe73a2f21f000000000000000000000000607b03b3b4b8074142c7aec415e99ebe73a2f21f000000000000000000000000000000000000000000000000002386f26fc1000000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -3413,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec34000000000000000000000000f847e9d51989033b691b8be943f8e9e268f99b9e000000000000000000000000f847e9d51989033b691b8be943f8e9e268f99b9e000000000000000000000000000000000000000000000000003ea82c7f8cbb2000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -3415,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec34000000000000000000000000dc72bd8115311209270c453d52a031773372c52f000000000000000000000000dc72bd8115311209270c453d52a031773372c52f000000000000000000000000000000000000000000000000016345785d8a000000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -3416,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec3400000000000000000000000063bf83c11c50627f44119336a3c2f616b7c6522800000000000000000000000063bf83c11c50627f44119336a3c2f616b7c65228000000000000000000000000000000000000000000000000002386f26fc1000000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -3419,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec340000000000000000000000000dd2e2c676485fa398cdad7a4e9863edffd32fb70000000000000000000000000dd2e2c676485fa398cdad7a4e9863edffd32fb700000000000000000000000000000000000000000000000000003691d6afc00000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -3420,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec340000000000000000000000002497dffc5ed6e49678302c48a29cd930928dc1c80000000000000000000000002497dffc5ed6e49678302c48a29cd930928dc1c8000000000000000000000000000000000000000000000000003838d15b9af90000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,0xce17efe8c27c247493c483522c477c7df6c45ddccd8d1b2efe9bd5c069dad904,2022-04-16 14:03:45.000 UTC,0,true -3422,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec34000000000000000000000000fefb25be42c402dc5d3e317fd1ba5294e050f5c8000000000000000000000000fefb25be42c402dc5d3e317fd1ba5294e050f5c8000000000000000000000000000000000000000000000000015e4c2d76da800000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -3424,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec34000000000000000000000000c01dde207a84c71149cde8b3657c5535c208aa20000000000000000000000000c01dde207a84c71149cde8b3657c5535c208aa200000000000000000000000000000000000000000000000000007313970c7970000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -3428,0x10e6593cdda8c58a1d0f14c5164b376352a55f2f,0x467194771dae2967aef3ecbedd3bf9a310c76c65,0xa9f9e6750000000000000000000000006b175474e89094c44da98b954eedeac495271d0f000000000000000000000000da10009cbd5d07dd0cecc66161fc93d7c9000da10000000000000000000000000f18fc88312cd9b0049668638b84f7d7a48bab650000000000000000000000000f18fc88312cd9b0049668638b84f7d7a48bab65000000000000000000000000000000000000000000000000f922c1c7dc3bfa7800000000000000000000000000000000000000000000000000000000000000c00000000000000000000000000000000000000000000000000000000000000000,,,1,true -3429,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec340000000000000000000000000363775b4e9dc4ec8e32be7f6a6b64f0f897d36c0000000000000000000000000363775b4e9dc4ec8e32be7f6a6b64f0f897d36c000000000000000000000000000000000000000000000000009b69608ebbbe7300000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -3430,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec34000000000000000000000000a3e6d6600ce982be43976ec5b8d4cd1a88d5baf4000000000000000000000000a3e6d6600ce982be43976ec5b8d4cd1a88d5baf400000000000000000000000000000000000000000000000000852cb840adf7e600000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -3433,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec3400000000000000000000000090f11bcf68f44a7edc142186fced2314da35655d00000000000000000000000090f11bcf68f44a7edc142186fced2314da35655d000000000000000000000000000000000000000000000000004ddac5402fafc000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -3437,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec3400000000000000000000000066508ac073baab27706b5f02260e990388a004c800000000000000000000000066508ac073baab27706b5f02260e990388a004c800000000000000000000000000000000000000000000000002b26a53373e1d0000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -3438,0x10e6593cdda8c58a1d0f14c5164b376352a55f2f,0x467194771dae2967aef3ecbedd3bf9a310c76c65,0xa9f9e6750000000000000000000000006b175474e89094c44da98b954eedeac495271d0f000000000000000000000000da10009cbd5d07dd0cecc66161fc93d7c9000da1000000000000000000000000f89fc7c27f885185afa09a38b29daa1bdaf32d4a000000000000000000000000f89fc7c27f885185afa09a38b29daa1bdaf32d4a00000000000000000000000000000000000000000000000014d1120d7b16000000000000000000000000000000000000000000000000000000000000000000c00000000000000000000000000000000000000000000000000000000000000000,,,1,true -3439,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec3400000000000000000000000004a42a0eb458b1babdbbb685f7e3e1bb4599fdbf00000000000000000000000004a42a0eb458b1babdbbb685f7e3e1bb4599fdbf000000000000000000000000000000000000000000000000003dbaa514941bcc00000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -3441,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec34000000000000000000000000dc88b41b71890b64ec34e7af035c1b3b77df467d000000000000000000000000dc88b41b71890b64ec34e7af035c1b3b77df467d000000000000000000000000000000000000000000000000000213d8e824a28000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -3442,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec340000000000000000000000001b0a5aaa86cf5278746e48e09a732b0fc4d3f8590000000000000000000000001b0a5aaa86cf5278746e48e09a732b0fc4d3f859000000000000000000000000000000000000000000000000001daa01bf2cbcd900000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -3445,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec3400000000000000000000000031561811d3dd53cfe7850c27dabf9fffe747dca200000000000000000000000031561811d3dd53cfe7850c27dabf9fffe747dca2000000000000000000000000000000000000000000000000002f8e800fc755bc00000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -3447,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec340000000000000000000000007eeb48736ca53b10220e8676b832efd4ecd4a90c0000000000000000000000007eeb48736ca53b10220e8676b832efd4ecd4a90c00000000000000000000000000000000000000000000000000341981cfa442a900000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -3448,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec34000000000000000000000000767065ebdd77a964d0cc8eae6998a1821866672c000000000000000000000000767065ebdd77a964d0cc8eae6998a1821866672c000000000000000000000000000000000000000000000000001687e5912bed4e00000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -3449,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec34000000000000000000000000893837ee290413f5349f3ce47a665f531df56c72000000000000000000000000893837ee290413f5349f3ce47a665f531df56c7200000000000000000000000000000000000000000000000000038d7ea4c6800000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -3450,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec34000000000000000000000000d53b1c352f96986eb065bdb2ef7eaf045c16b756000000000000000000000000d53b1c352f96986eb065bdb2ef7eaf045c16b75600000000000000000000000000000000000000000000000000105df0766168c000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -3451,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec34000000000000000000000000dccbfaa8ab8d37757e403b869f43eebfeb96391f000000000000000000000000dccbfaa8ab8d37757e403b869f43eebfeb96391f00000000000000000000000000000000000000000000000000038d7ea4c6800000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -3458,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec3400000000000000000000000059b02e6738d03f1f501ed74dfb2d9b43fdd9ee4d00000000000000000000000059b02e6738d03f1f501ed74dfb2d9b43fdd9ee4d0000000000000000000000000000000000000000000000000429d069189e000000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -3465,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec34000000000000000000000000f997558ae6ab4e5b7df35b6686becf512a50202c000000000000000000000000f997558ae6ab4e5b7df35b6686becf512a50202c00000000000000000000000000000000000000000000000007c585087238000000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -3466,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec340000000000000000000000001a23eeff7353c5e6995a6d76957f28e00e3620e20000000000000000000000001a23eeff7353c5e6995a6d76957f28e00e3620e20000000000000000000000000000000000000000000000000015d002442d2f0500000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -3471,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec34000000000000000000000000e90737dd2a9ef97ccfbfbdf91756a353d3533a11000000000000000000000000e90737dd2a9ef97ccfbfbdf91756a353d3533a1100000000000000000000000000000000000000000000000000d0720b9aa0063600000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -3473,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec34000000000000000000000000597ddaf79527d46a3d838ed4b06bb37ebba8fc87000000000000000000000000597ddaf79527d46a3d838ed4b06bb37ebba8fc870000000000000000000000000000000000000000000000000853a0d2313c000000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -3476,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec34000000000000000000000000533a85eeeabb3e9d7e3ae8d2cc020ab35f19af7f000000000000000000000000533a85eeeabb3e9d7e3ae8d2cc020ab35f19af7f0000000000000000000000000000000000000000000000000037af6899dd9b7300000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -3478,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec34000000000000000000000000e34e61d1ec3de092eac80983fc6480a57dba1cd7000000000000000000000000e34e61d1ec3de092eac80983fc6480a57dba1cd7000000000000000000000000000000000000000000000000013781f240d5721900000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,0xaf2b1bd7538835236b46a645287918976d6834b677dd1c06125a2184964b215f,2022-03-05 02:28:24.000 UTC,0,true -3480,0x10e6593cdda8c58a1d0f14c5164b376352a55f2f,0x467194771dae2967aef3ecbedd3bf9a310c76c65,0xa9f9e6750000000000000000000000006b175474e89094c44da98b954eedeac495271d0f000000000000000000000000da10009cbd5d07dd0cecc66161fc93d7c9000da10000000000000000000000004cb780fd3286f2d10199b61423d1c804bd2a5d2b0000000000000000000000004cb780fd3286f2d10199b61423d1c804bd2a5d2b00000000000000000000000000000000000000000000001192e7cf4f7885055a00000000000000000000000000000000000000000000000000000000000000c00000000000000000000000000000000000000000000000000000000000000000,,,1,true -3483,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec340000000000000000000000008166e2bbe05d961287a1097193f9cccf61dd42e40000000000000000000000008166e2bbe05d961287a1097193f9cccf61dd42e4000000000000000000000000000000000000000000000000002e269a6f3ecc1300000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -3484,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec340000000000000000000000005a252234c2359ad3c1908dd564ae8da74b4910250000000000000000000000005a252234c2359ad3c1908dd564ae8da74b4910250000000000000000000000000000000000000000000000000060c372c91c830000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -3485,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec34000000000000000000000000bb16dacfbb40bc630298bcd8f3e0bc3d7e1a3631000000000000000000000000bb16dacfbb40bc630298bcd8f3e0bc3d7e1a3631000000000000000000000000000000000000000000000000008ac534ce73625600000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -3488,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec34000000000000000000000000a3708b99c1c3cbb4a27e5b8caace1f5a1d9362ac000000000000000000000000a3708b99c1c3cbb4a27e5b8caace1f5a1d9362ac00000000000000000000000000000000000000000000000000b1a2bc2ec5000000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -3490,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec34000000000000000000000000c88533351059765f165a3b51f1a5d2b8dfec3c08000000000000000000000000c88533351059765f165a3b51f1a5d2b8dfec3c08000000000000000000000000000000000000000000000000001c6bf52634000000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -3491,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec3400000000000000000000000092c06cc32b45ae9a335be36305e619191ed666fe00000000000000000000000092c06cc32b45ae9a335be36305e619191ed666fe000000000000000000000000000000000000000000000000013e55d22080dcbf00000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -3492,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec340000000000000000000000004bff9b3ede66c6daf42d6deae4c784c520ce5ac10000000000000000000000004bff9b3ede66c6daf42d6deae4c784c520ce5ac10000000000000000000000000000000000000000000000000de0b6b3a764000000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -3493,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec34000000000000000000000000b7ca8db84717c98dcf59be2b3a612e75ef5d54b0000000000000000000000000b7ca8db84717c98dcf59be2b3a612e75ef5d54b00000000000000000000000000000000000000000000000000008f0f3d1d6fff400000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -3494,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec34000000000000000000000000300c8115f3bbcba6b11ea660bb6b8ad9b50e5095000000000000000000000000300c8115f3bbcba6b11ea660bb6b8ad9b50e5095000000000000000000000000000000000000000000000000000aa87bee53800000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -3496,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec34000000000000000000000000c2b0ada1b72646964b3303c3612f3bfc85139dc8000000000000000000000000c2b0ada1b72646964b3303c3612f3bfc85139dc8000000000000000000000000000000000000000000000000001d0b1b24adc70000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -3497,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec34000000000000000000000000c29fedb24a18af65ac769a1c3432882b73e5a3a2000000000000000000000000c29fedb24a18af65ac769a1c3432882b73e5a3a200000000000000000000000000000000000000000000000000000002540be40000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -3498,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec3400000000000000000000000022b7d824428d53100c8f841c383d77aa7489a5f400000000000000000000000022b7d824428d53100c8f841c383d77aa7489a5f400000000000000000000000000000000000000000000000001509018d26db98900000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -3499,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec34000000000000000000000000e69619a71cdd7696b34c52a5c1709c8a811faab8000000000000000000000000e69619a71cdd7696b34c52a5c1709c8a811faab8000000000000000000000000000000000000000000000000012e017786c1794200000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -3501,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec340000000000000000000000006f6e754e84fc4bb7c4ecf296964ad29e5130d8c60000000000000000000000006f6e754e84fc4bb7c4ecf296964ad29e5130d8c6000000000000000000000000000000000000000000000000000000003b9aca0000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -3502,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec34000000000000000000000000b8983d041f4e752032f2964b8e095c1f1c61956b000000000000000000000000b8983d041f4e752032f2964b8e095c1f1c61956b000000000000000000000000000000000000000000000000003890d2358b1a4f00000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -3503,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec34000000000000000000000000bb8b8a7894a85dce08a79789cd794abfa0109614000000000000000000000000bb8b8a7894a85dce08a79789cd794abfa010961400000000000000000000000000000000000000000000000000ac86ff86e2680000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -3504,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec34000000000000000000000000dfc387d937488a300bb73ed805b1e46cdfcf28ae000000000000000000000000dfc387d937488a300bb73ed805b1e46cdfcf28ae00000000000000000000000000000000000000000000000000acb9e5e4d44a0000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -3507,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec3400000000000000000000000059d369c01da6e051409489ed9878bb21037095a900000000000000000000000059d369c01da6e051409489ed9878bb21037095a90000000000000000000000000000000000000000000000000001c6bf5263400000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -3510,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec340000000000000000000000005f40324ed97badd9079e67e162c83b1fb9168a120000000000000000000000005f40324ed97badd9079e67e162c83b1fb9168a1200000000000000000000000000000000000000000000000000038d7ea4c6800000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -3511,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec34000000000000000000000000cca8329feb40eae13b6bbe26ca2dfc8406b64236000000000000000000000000cca8329feb40eae13b6bbe26ca2dfc8406b64236000000000000000000000000000000000000000000000000001550f7dca7000000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -3512,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec34000000000000000000000000842fcd1d99c0c3469022a51685dada5afa91a4e2000000000000000000000000842fcd1d99c0c3469022a51685dada5afa91a4e2000000000000000000000000000000000000000000000000000e35fa931a000000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -3514,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec34000000000000000000000000da0285ff49800536a53cbef7a7188da10a656efe000000000000000000000000da0285ff49800536a53cbef7a7188da10a656efe000000000000000000000000000000000000000000000000015bd2ae504d8e0000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -3516,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec34000000000000000000000000445c9da83c4211fa8829672785599dd8180ade7c000000000000000000000000445c9da83c4211fa8829672785599dd8180ade7c000000000000000000000000000000000000000000000000009e1d9bbdca638300000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -3518,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec3400000000000000000000000050f7c1a1db6ac509d4a9e684617a191f3b400c0400000000000000000000000050f7c1a1db6ac509d4a9e684617a191f3b400c040000000000000000000000000000000000000000000000000038f83f9bcedbff00000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -3519,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec3400000000000000000000000079748bfc42a567c58682add44a072f8900a8499800000000000000000000000079748bfc42a567c58682add44a072f8900a84998000000000000000000000000000000000000000000000000002386f26fc1000000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -3520,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec34000000000000000000000000ea7914b48d8ebd203a7721ccaf083b1c3e78586c000000000000000000000000ea7914b48d8ebd203a7721ccaf083b1c3e78586c000000000000000000000000000000000000000000000000000ec458d7e1930000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -3522,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec3400000000000000000000000046ad16c95afd5946b6810d03d7dff72b75f58f7500000000000000000000000046ad16c95afd5946b6810d03d7dff72b75f58f75000000000000000000000000000000000000000000000000005262f360ddd70000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -3528,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec340000000000000000000000005bca75d1512939dd30f91416c02f1454175a0fb00000000000000000000000005bca75d1512939dd30f91416c02f1454175a0fb0000000000000000000000000000000000000000000000000009c1a4e702a255600000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -3529,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec340000000000000000000000005c675e0363add2cd4e61abde87a952d5c07492f40000000000000000000000005c675e0363add2cd4e61abde87a952d5c07492f400000000000000000000000000000000000000000000000000017f9dc2d4590000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -3531,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec34000000000000000000000000393a4fc32b1311c4fa5774d61fa99230670c604b000000000000000000000000393a4fc32b1311c4fa5774d61fa99230670c604b0000000000000000000000000000000000000000000000000076d637f281de0000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -3533,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec340000000000000000000000003a11749a0b6b2cc397dc2fcb11b1c6c1478cd4290000000000000000000000003a11749a0b6b2cc397dc2fcb11b1c6c1478cd429000000000000000000000000000000000000000000000000009fc8448c3cc06800000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -3534,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec340000000000000000000000000c162389a94467e4827401afed99b4401c46ade90000000000000000000000000c162389a94467e4827401afed99b4401c46ade900000000000000000000000000000000000000000000000000a02ba903725edb00000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -3535,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec3400000000000000000000000012afc0c2c09166892cfc167d35e5907c0b2ccb2d00000000000000000000000012afc0c2c09166892cfc167d35e5907c0b2ccb2d00000000000000000000000000000000000000000000000000e66e97a099c54000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -3537,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec340000000000000000000000005a707a440e0a34f11c3c259a20622440cbed19700000000000000000000000005a707a440e0a34f11c3c259a20622440cbed1970000000000000000000000000000000000000000000000000008e1bc9bf04000000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,0x2555ce66cd0bf76150036d44c313632137622b33f595155bbf80cd4a2b7e88be,2021-12-24 23:28:46.000 UTC,0,true -3538,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec340000000000000000000000004579685d695f917e74165177294cfc6924ef8ca10000000000000000000000004579685d695f917e74165177294cfc6924ef8ca1000000000000000000000000000000000000000000000000009df226d114f8ef00000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -3540,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec34000000000000000000000000bcc9ff4a52a0e972b20f3dd63e88396685a57636000000000000000000000000bcc9ff4a52a0e972b20f3dd63e88396685a57636000000000000000000000000000000000000000000000000002386f26fc1000000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -3541,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec3400000000000000000000000092cae64f9937bc218c8e1737625717f379f9720000000000000000000000000092cae64f9937bc218c8e1737625717f379f9720000000000000000000000000000000000000000000000000000ae787df528efc000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -3543,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec34000000000000000000000000a45481a6446a33e283c992ae11feaf9237ff421b000000000000000000000000a45481a6446a33e283c992ae11feaf9237ff421b00000000000000000000000000000000000000000000000000038d7ea4c6800000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -3544,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec34000000000000000000000000bcc9ff4a52a0e972b20f3dd63e88396685a57636000000000000000000000000bcc9ff4a52a0e972b20f3dd63e88396685a576360000000000000000000000000000000000000000000000000011c37937e0800000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -3545,0xcd9d4988c0ae61887b075ba77f08cbfad2b65068,0x3f87ff1de58128ef8fcb4c807efd776e1ac72e51,0xf4f7b41a000000000000000000000000531c64cc8796d85e79f96a4507652f67a75bbc020000000000000000000000000000000000000000000000002891e41d1d38844c,,,1,true -3547,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec34000000000000000000000000863e308c6153eee5fcafcc2728b330e9f86c51b9000000000000000000000000863e308c6153eee5fcafcc2728b330e9f86c51b900000000000000000000000000000000000000000000000000038d7ea4c6800000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -3548,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec3400000000000000000000000036fcd9f92d79b45bdcef267e834e276f45f0d27d00000000000000000000000036fcd9f92d79b45bdcef267e834e276f45f0d27d00000000000000000000000000000000000000000000000000fffdf87d4d541e00000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -3549,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec3400000000000000000000000017187a7d2a7106f7c9d3fe8db1461ece5a70351d00000000000000000000000017187a7d2a7106f7c9d3fe8db1461ece5a70351d00000000000000000000000000000000000000000000000000038d7ea4c6800000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -3550,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec34000000000000000000000000264313b93e8073db685a3d24a4d6c7778fd5e964000000000000000000000000264313b93e8073db685a3d24a4d6c7778fd5e96400000000000000000000000000000000000000000000000000038d7ea4c6800000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -3551,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec34000000000000000000000000358abb5b95f814c833746a2d0e98bbc227cb6e3c000000000000000000000000358abb5b95f814c833746a2d0e98bbc227cb6e3c000000000000000000000000000000000000000000000000000cca2e5131000000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -3552,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec34000000000000000000000000bcc9ff4a52a0e972b20f3dd63e88396685a57636000000000000000000000000bcc9ff4a52a0e972b20f3dd63e88396685a576360000000000000000000000000000000000000000000000000011c37937e0800000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -3554,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec34000000000000000000000000df5ebfaece255f16e8ddb8d51f0d4c7a422a9686000000000000000000000000df5ebfaece255f16e8ddb8d51f0d4c7a422a968600000000000000000000000000000000000000000000000000038d7ea4c6800000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -3555,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec3400000000000000000000000095a98188d689715f7a194448fc8c2068adbfe6ee00000000000000000000000095a98188d689715f7a194448fc8c2068adbfe6ee00000000000000000000000000000000000000000000000000038d7ea4c6800000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -3556,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec3400000000000000000000000004f205715aa91275dabc59cf5be7c79eb2a2bd5e00000000000000000000000004f205715aa91275dabc59cf5be7c79eb2a2bd5e00000000000000000000000000000000000000000000000000038d7ea4c6800000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -3558,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec3400000000000000000000000037e49f50da9eec60c16c7632d71de572687da1fb00000000000000000000000037e49f50da9eec60c16c7632d71de572687da1fb00000000000000000000000000000000000000000000000000038d7ea4c6800000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -3559,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0xa9f9e675000000000000000000000000dac17f958d2ee523a2206206994597c13d831ec700000000000000000000000094b008aa00579c1307b0ef2c499ad98a8ce58e58000000000000000000000000555860b9cc8a1d1e9e48538c8c6d8b85300a77c5000000000000000000000000555860b9cc8a1d1e9e48538c8c6d8b85300a77c50000000000000000000000000000000000000000000000000000000001f74d0e00000000000000000000000000000000000000000000000000000000000000c00000000000000000000000000000000000000000000000000000000000000000,,,1,true -3560,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec34000000000000000000000000abef0e8cd40ff9ee1023d71357aec1f1ad3acf47000000000000000000000000abef0e8cd40ff9ee1023d71357aec1f1ad3acf4700000000000000000000000000000000000000000000000000005af3107a400000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -3561,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec34000000000000000000000000748f61c456fb1317572cfb550dfd0089f2834030000000000000000000000000748f61c456fb1317572cfb550dfd0089f283403000000000000000000000000000000000000000000000000000005af3107a400000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -3562,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec340000000000000000000000006b954a49833515c62fcfcddbb0a1f69f9d9923d50000000000000000000000006b954a49833515c62fcfcddbb0a1f69f9d9923d500000000000000000000000000000000000000000000000000005af3107a400000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -3563,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec34000000000000000000000000c70cd990e0e595fd3df8c8c05aa52cd1cc9d76f6000000000000000000000000c70cd990e0e595fd3df8c8c05aa52cd1cc9d76f600000000000000000000000000000000000000000000000000005af3107a400000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -3565,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec340000000000000000000000006c07a4c89d5b82fc5263bac78385fac2ee403aef0000000000000000000000006c07a4c89d5b82fc5263bac78385fac2ee403aef00000000000000000000000000000000000000000000000000005af3107a400000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -3566,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec34000000000000000000000000b2a929a25ad4c77e071376968d4ceb94fee26312000000000000000000000000b2a929a25ad4c77e071376968d4ceb94fee2631200000000000000000000000000000000000000000000000000005af3107a400000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -3568,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec340000000000000000000000001c441f84108848fc7f8b8fcb7b27784acc5bece50000000000000000000000001c441f84108848fc7f8b8fcb7b27784acc5bece500000000000000000000000000000000000000000000000001562e03c79f4d1800000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -3569,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec34000000000000000000000000a7e757bb7e887b99f14de1f88bfbb42d7df1c65c000000000000000000000000a7e757bb7e887b99f14de1f88bfbb42d7df1c65c00000000000000000000000000000000000000000000000000034ebd179c246500000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -3570,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec3400000000000000000000000076b5eac3af4a09949b99b2fc573e345ec640faa200000000000000000000000076b5eac3af4a09949b99b2fc573e345ec640faa2000000000000000000000000000000000000000000000000000000003b9aca0000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -3572,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec34000000000000000000000000b484c02002f3360cfa3439e260055c41c6df654e000000000000000000000000b484c02002f3360cfa3439e260055c41c6df654e00000000000000000000000000000000000000000000000000a2c1360ac459e500000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -3575,0xcd9d4988c0ae61887b075ba77f08cbfad2b65068,0x3f87ff1de58128ef8fcb4c807efd776e1ac72e51,0xf4f7b41a000000000000000000000000435c52bb29e3a8380ba9045db70910205a4e6eab0000000000000000000000000000000000000000000000000de0b6b3a7640000,,,1,true -3576,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec34000000000000000000000000bd662e3684770880686264a4bb6632b53244cd9a000000000000000000000000bd662e3684770880686264a4bb6632b53244cd9a000000000000000000000000000000000000000000000000007f4ee741a258e000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -3581,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec34000000000000000000000000bd662e3684770880686264a4bb6632b53244cd9a000000000000000000000000bd662e3684770880686264a4bb6632b53244cd9a000000000000000000000000000000000000000000000000003c79b7d3add40000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -3582,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec34000000000000000000000000cf70f1d525a3802df885dd4b35176730608729b4000000000000000000000000cf70f1d525a3802df885dd4b35176730608729b4000000000000000000000000000000000000000000000000015e917d9c8aa10000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -3583,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec34000000000000000000000000281f9fd6d8dfa9a73539c98030d5071c04ab62c1000000000000000000000000281f9fd6d8dfa9a73539c98030d5071c04ab62c100000000000000000000000000000000000000000000000000aca9714815800000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -3586,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec34000000000000000000000000add76744e587bd74ab9c23813f883daa4a92a945000000000000000000000000add76744e587bd74ab9c23813f883daa4a92a94500000000000000000000000000000000000000000000000000a34aab7463239e00000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -3588,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec3400000000000000000000000014c963f01f369c96ffbadbd5209f016759f9209300000000000000000000000014c963f01f369c96ffbadbd5209f016759f92093000000000000000000000000000000000000000000000000015c62b0a167aa4000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -3589,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec34000000000000000000000000ef665af21a52fe3c9f0c4afe0ebe825975d687cb000000000000000000000000ef665af21a52fe3c9f0c4afe0ebe825975d687cb000000000000000000000000000000000000000000000000014462ff5dac2d8000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -3592,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec34000000000000000000000000ae2f175948821430330b2aaed19cea2b60570740000000000000000000000000ae2f175948821430330b2aaed19cea2b60570740000000000000000000000000000000000000000000000000005a322c4cb67adf00000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -3597,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec34000000000000000000000000d23e5a77ac2adbddaa1569389581732f2ea09e61000000000000000000000000d23e5a77ac2adbddaa1569389581732f2ea09e6100000000000000000000000000000000000000000000000000b1a2bc2ec5000000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,0xb938cfa703d14262efc7b88b91aca6974b9650d19e9277a1fb6615d35d4d498c,2022-07-10 08:15:37.000 UTC,0,true -3600,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec34000000000000000000000000b8faa54d01fb06ac8c55d7ac95f5e1cfe7f2a467000000000000000000000000b8faa54d01fb06ac8c55d7ac95f5e1cfe7f2a46700000000000000000000000000000000000000000000000000a6a2d1836f305f00000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -3601,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec34000000000000000000000000acdceb490c614fa827c4f20710ee38e6b27d0eb2000000000000000000000000acdceb490c614fa827c4f20710ee38e6b27d0eb200000000000000000000000000000000000000000000000000470de4df82000000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -3602,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec34000000000000000000000000656e4f4777f0ada62dfc8d2e6e4b860cc2dea7db000000000000000000000000656e4f4777f0ada62dfc8d2e6e4b860cc2dea7db0000000000000000000000000000000000000000000000000001c6bf5263400000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -3606,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec34000000000000000000000000edac8917d97c61f4160ab0483637823d70083017000000000000000000000000edac8917d97c61f4160ab0483637823d70083017000000000000000000000000000000000000000000000000009e68cd212edbed00000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -3609,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec34000000000000000000000000bbca1093f731fb2e4a3625deb1967e6fc9127ffe000000000000000000000000bbca1093f731fb2e4a3625deb1967e6fc9127ffe000000000000000000000000000000000000000000000000004311a84fe1f40000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -3613,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec3400000000000000000000000069a25973f320c8bd0caa634c76f4464a3d2c5d7d00000000000000000000000069a25973f320c8bd0caa634c76f4464a3d2c5d7d00000000000000000000000000000000000000000000000000a407ab19d10adc00000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -3616,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec340000000000000000000000003114a7881e41d38f4ca1de432bbe279b2d532db20000000000000000000000003114a7881e41d38f4ca1de432bbe279b2d532db2000000000000000000000000000000000000000000000000004df870439c0d6500000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -3619,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec34000000000000000000000000f02feaa50363d3f42fb122e5d7676fff2b24e2af000000000000000000000000f02feaa50363d3f42fb122e5d7676fff2b24e2af0000000000000000000000000000000000000000000000000001c6bf5263400000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -3623,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec34000000000000000000000000762cfde23d0882729f43eabfe28a50c43a18d2f4000000000000000000000000762cfde23d0882729f43eabfe28a50c43a18d2f40000000000000000000000000000000000000000000000000001c6bf5263400000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -3624,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec34000000000000000000000000188aaf665b2e0a2f7b6b4dbc1d5004657d104132000000000000000000000000188aaf665b2e0a2f7b6b4dbc1d5004657d104132000000000000000000000000000000000000000000000000000482af5157b7ce00000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -3625,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec34000000000000000000000000f0a6ab30167c35e9e8c4a3f8df7ce7e38c76831c000000000000000000000000f0a6ab30167c35e9e8c4a3f8df7ce7e38c76831c000000000000000000000000000000000000000000000000002e8312683c84e100000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -3627,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec34000000000000000000000000086ae1358fc00fcbc32d48ae831bf90558550181000000000000000000000000086ae1358fc00fcbc32d48ae831bf905585501810000000000000000000000000000000000000000000000000003d6037c20ce5900000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -3628,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec34000000000000000000000000e6b0fa6750e6e65867431e53e180dd87e365f46e000000000000000000000000e6b0fa6750e6e65867431e53e180dd87e365f46e000000000000000000000000000000000000000000000000010096d7f1fa7e5d00000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -3630,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec3400000000000000000000000055d7af293204dda491de0509b44e5d47ae4a3b3300000000000000000000000055d7af293204dda491de0509b44e5d47ae4a3b3300000000000000000000000000000000000000000000000000071924a16ad40f00000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -3631,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec34000000000000000000000000711fb130ce68576bf819683598efe46bf5e149fb000000000000000000000000711fb130ce68576bf819683598efe46bf5e149fb0000000000000000000000000000000000000000000000000425d26b34dcb49200000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -3632,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec34000000000000000000000000d182f2ff6aa0293a7be976de0018909c9ab1568b000000000000000000000000d182f2ff6aa0293a7be976de0018909c9ab1568b00000000000000000000000000000000000000000000000000004ec14d6625ae00000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -3633,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec340000000000000000000000002add3cb18e5a40cf0472eb9aef8248dc99b2ade80000000000000000000000002add3cb18e5a40cf0472eb9aef8248dc99b2ade800000000000000000000000000000000000000000000000000015361c836211a00000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -3634,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec34000000000000000000000000a7dac61d49a6ca90b5ef1b6c84f40c1cc8d8c469000000000000000000000000a7dac61d49a6ca90b5ef1b6c84f40c1cc8d8c4690000000000000000000000000000000000000000000000000e92596fd629000000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -3635,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec34000000000000000000000000f1bd1d7f4794ded7133ebc607aa9f98182397359000000000000000000000000f1bd1d7f4794ded7133ebc607aa9f98182397359000000000000000000000000000000000000000000000000039bb49f599a000000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -3637,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec34000000000000000000000000770e071e6a2fd30c5ac8ee3c5355760b30744435000000000000000000000000770e071e6a2fd30c5ac8ee3c5355760b30744435000000000000000000000000000000000000000000000000008a2f387187cb9a00000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -3638,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec340000000000000000000000002bbb1ac9a6f2cd51a066dded1d0554db7fd51b2f0000000000000000000000002bbb1ac9a6f2cd51a066dded1d0554db7fd51b2f00000000000000000000000000000000000000000000000000038d7ea4c6800000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -3639,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec3400000000000000000000000062b485d3ac74b876582dcb1c3c65c92b92f32c8300000000000000000000000062b485d3ac74b876582dcb1c3c65c92b92f32c83000000000000000000000000000000000000000000000000009600607c3807fd00000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -3640,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec340000000000000000000000009fb7563a1969f034e8feb83e499c967d31538e860000000000000000000000009fb7563a1969f034e8feb83e499c967d31538e860000000000000000000000000000000000000000000000000007e3c47664c0b100000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -3641,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec340000000000000000000000005bdf630a97936201955b25b279fbe016fe2f04490000000000000000000000005bdf630a97936201955b25b279fbe016fe2f0449000000000000000000000000000000000000000000000000000138232bc379db00000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -3642,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec3400000000000000000000000011e9df05c3a5adc42c7bfae4f0360b4e2423f29b00000000000000000000000011e9df05c3a5adc42c7bfae4f0360b4e2423f29b0000000000000000000000000000000000000000000000000011c37937e0800000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -3643,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec34000000000000000000000000deaef36fa8a391fa09a4b5f8ba67a655435cf07e000000000000000000000000deaef36fa8a391fa09a4b5f8ba67a655435cf07e00000000000000000000000000000000000000000000000000006af3e97ed2c000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -3644,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec3400000000000000000000000062ff2b32c2c1fb42d95cd2b5439c840cfeb1652a00000000000000000000000062ff2b32c2c1fb42d95cd2b5439c840cfeb1652a00000000000000000000000000000000000000000000000000005af3107a400000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -3646,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec34000000000000000000000000c5dcaf4f9edd062d1c8589cf9611253afb982a40000000000000000000000000c5dcaf4f9edd062d1c8589cf9611253afb982a400000000000000000000000000000000000000000000000000101fca146ffb61600000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -3648,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec34000000000000000000000000a16ba1c0084ffdf78849c25d933f2ca49c873f97000000000000000000000000a16ba1c0084ffdf78849c25d933f2ca49c873f9700000000000000000000000000000000000000000000000000470de4df82000000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -3650,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec340000000000000000000000002036d5417e963825de1299d88cf8a7b5d61b5c8b0000000000000000000000002036d5417e963825de1299d88cf8a7b5d61b5c8b0000000000000000000000000000000000000000000000000083be228e54b68000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -3655,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec34000000000000000000000000101f4c1944e1f15d3dec809cec589921ed56d006000000000000000000000000101f4c1944e1f15d3dec809cec589921ed56d0060000000000000000000000000000000000000000000000000125754782fc284700000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -3656,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec340000000000000000000000009fada4ec572fdb820a00a5607099f4a5049b89a50000000000000000000000009fada4ec572fdb820a00a5607099f4a5049b89a5000000000000000000000000000000000000000000000000001291046558b1c000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -3657,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec340000000000000000000000009fada4ec572fdb820a00a5607099f4a5049b89a50000000000000000000000009fada4ec572fdb820a00a5607099f4a5049b89a500000000000000000000000000000000000000000000000000456498511c740f00000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -3658,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec34000000000000000000000000ec4b0aada8d46640b7296df77132e299c40cc2f7000000000000000000000000ec4b0aada8d46640b7296df77132e299c40cc2f70000000000000000000000000000000000000000000000000055ea748820b50400000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -3659,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec340000000000000000000000007834c9a4b652f096a84c364b1c44828bb750924b0000000000000000000000007834c9a4b652f096a84c364b1c44828bb750924b00000000000000000000000000000000000000000000000001cdda4faccd000000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -3660,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0xa9f9e675000000000000000000000000a0b86991c6218b36c1d19d4a2e9eb0ce3606eb480000000000000000000000007f5c764cbc14f9669b88837ca1490cca17c31607000000000000000000000000ca64e575083e0a8f9c73ffc214d78027d98fc51b000000000000000000000000ca64e575083e0a8f9c73ffc214d78027d98fc51b0000000000000000000000000000000000000000000000000000000007df1b8e00000000000000000000000000000000000000000000000000000000000000c00000000000000000000000000000000000000000000000000000000000000000,,,1,true -3661,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec34000000000000000000000000234cf11ffb859f228bef972bac3116375f45c2eb000000000000000000000000234cf11ffb859f228bef972bac3116375f45c2eb000000000000000000000000000000000000000000000000006a94d74f43000000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -3662,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec34000000000000000000000000fd728faf4c65cc9af041a5376791c4699f49f0d2000000000000000000000000fd728faf4c65cc9af041a5376791c4699f49f0d200000000000000000000000000000000000000000000000000f8b0a10e47000000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -3663,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec340000000000000000000000006caba1b5bf7ffd11e061e652e8040527c1b6dd130000000000000000000000006caba1b5bf7ffd11e061e652e8040527c1b6dd1300000000000000000000000000000000000000000000000000a93485d885250000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,0x96f1dd5e23b91fa9cbbd60ce9fcf5656f1e8b2ba93fb1c817c481417ea78d5fc,2022-05-01 14:05:11.000 UTC,0,true -3664,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec3400000000000000000000000076ae8013e0271a2bf0b8d434433c9672cdac06e400000000000000000000000076ae8013e0271a2bf0b8d434433c9672cdac06e4000000000000000000000000000000000000000000000000013fbe85edc9000000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -3666,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec34000000000000000000000000a717310f71b2e7809c8941d14e95ef6fba990c16000000000000000000000000a717310f71b2e7809c8941d14e95ef6fba990c16000000000000000000000000000000000000000000000000001c0c9b4ef45d0000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -3667,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec340000000000000000000000002c4f717e9fd9c01b68cf68f3e984c3603aecfa1e0000000000000000000000002c4f717e9fd9c01b68cf68f3e984c3603aecfa1e00000000000000000000000000000000000000000000000002adaf74d2984a4100000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -3668,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec340000000000000000000000003074601bb1f3f0fea734c26d684ba9fd2c2871fa0000000000000000000000003074601bb1f3f0fea734c26d684ba9fd2c2871fa00000000000000000000000000000000000000000000000000354a6ba7a1800000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -3669,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec340000000000000000000000003beca87dd176c613db59af20619dd9e0a99c66060000000000000000000000003beca87dd176c613db59af20619dd9e0a99c660600000000000000000000000000000000000000000000000000203092fd43c6e000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -3670,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec3400000000000000000000000005c69e40ed489b88fd694ad7e31776e469859afd00000000000000000000000005c69e40ed489b88fd694ad7e31776e469859afd000000000000000000000000000000000000000000000000007c58508723800000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,0x0025d1da6ffd6c3005f710cfd1ef8d9386b8008b39a0008b579625b68855f701,2022-06-20 04:37:06.000 UTC,0,true -3671,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec34000000000000000000000000b73a132677af8a3ff0e3e940dde2c89148fa0fe1000000000000000000000000b73a132677af8a3ff0e3e940dde2c89148fa0fe100000000000000000000000000000000000000000000000000354a6ba7a1800000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -3672,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec34000000000000000000000000aa95ccaff6b6cb4cf3ec479cab22c60d53d508ec000000000000000000000000aa95ccaff6b6cb4cf3ec479cab22c60d53d508ec00000000000000000000000000000000000000000000000000354a6ba7a1800000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -3673,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec340000000000000000000000008d36511ef12161df48da2d618e73586f910ecf380000000000000000000000008d36511ef12161df48da2d618e73586f910ecf3800000000000000000000000000000000000000000000000000354a6ba7a1800000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -3675,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec3400000000000000000000000027688f913d6d40f39ae1dfde8a1a82e1496e927800000000000000000000000027688f913d6d40f39ae1dfde8a1a82e1496e927800000000000000000000000000000000000000000000000000b6f92e9456149300000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -3676,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec340000000000000000000000002aaf8308ecabf4b13475437ae1a311076cbb5a0c0000000000000000000000002aaf8308ecabf4b13475437ae1a311076cbb5a0c00000000000000000000000000000000000000000000000000354a6ba7a1800000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -3677,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec34000000000000000000000000d730517b1a6066a5746d7f2dcce47b0713e2ae50000000000000000000000000d730517b1a6066a5746d7f2dcce47b0713e2ae50000000000000000000000000000000000000000000000000003b0dacedbc380000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -3678,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec34000000000000000000000000b83e28f3fdd1d2fa98e4aeb7a5f063d91261d36b000000000000000000000000b83e28f3fdd1d2fa98e4aeb7a5f063d91261d36b00000000000000000000000000000000000000000000000000354a6ba7a1800000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -3679,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec3400000000000000000000000023a3b309b616b8d25a6a6c1bf9d95969ad010f8900000000000000000000000023a3b309b616b8d25a6a6c1bf9d95969ad010f890000000000000000000000000000000000000000000000000147f2872ece120700000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -3680,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec34000000000000000000000000d291a341157f6566c3520e5f920089c243a1b9bb000000000000000000000000d291a341157f6566c3520e5f920089c243a1b9bb00000000000000000000000000000000000000000000000000354a6ba7a1800000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -3681,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec34000000000000000000000000cc8d40e13f2738844355aa381dd790f83ae0804f000000000000000000000000cc8d40e13f2738844355aa381dd790f83ae0804f00000000000000000000000000000000000000000000000000354a6ba7a1800000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -3682,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec34000000000000000000000000f0615906491bad3ecfb38194f32818ffe0590593000000000000000000000000f0615906491bad3ecfb38194f32818ffe05905930000000000000000000000000000000000000000000000000108ad322cac485200000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -3684,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec34000000000000000000000000d52251d6f7c7348b3d4d76b22a666f5ce2ee4641000000000000000000000000d52251d6f7c7348b3d4d76b22a666f5ce2ee464100000000000000000000000000000000000000000000000000354a6ba7a1800000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -3685,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec34000000000000000000000000f435f8278c740b9d866d87e6b1903d33329398cf000000000000000000000000f435f8278c740b9d866d87e6b1903d33329398cf000000000000000000000000000000000000000000000000000b0c11950e2d3500000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -3686,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec3400000000000000000000000017d0a01c3a3b138363501450e6f2b4c0f1a89acb00000000000000000000000017d0a01c3a3b138363501450e6f2b4c0f1a89acb000000000000000000000000000000000000000000000000011c37937e08000000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -3690,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec3400000000000000000000000023c00c3e224fb25f07d7cf445d802c442fe7af5000000000000000000000000023c00c3e224fb25f07d7cf445d802c442fe7af5000000000000000000000000000000000000000000000000000354a6ba7a1800000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -3691,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0xa9f9e675000000000000000000000000a0b86991c6218b36c1d19d4a2e9eb0ce3606eb480000000000000000000000007f5c764cbc14f9669b88837ca1490cca17c3160700000000000000000000000039af6952f2fbe751a10f28a63f9f57d65f64e3fa00000000000000000000000039af6952f2fbe751a10f28a63f9f57d65f64e3fa0000000000000000000000000000000000000000000000000000000002faf08000000000000000000000000000000000000000000000000000000000000000c00000000000000000000000000000000000000000000000000000000000000000,,,1,true -3692,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec34000000000000000000000000fa6c38979931cf3aa631ddcb0cfb664a4674c5fc000000000000000000000000fa6c38979931cf3aa631ddcb0cfb664a4674c5fc00000000000000000000000000000000000000000000000000038d7ea4c6800000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -3693,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec340000000000000000000000009e8d3b936f8ffef0d816c489f74ad79cd1c7824e0000000000000000000000009e8d3b936f8ffef0d816c489f74ad79cd1c7824e00000000000000000000000000000000000000000000000000038d7ea4c6800000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -3694,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec340000000000000000000000007636fcbffc81d543c8a439022902b834073dea3e0000000000000000000000007636fcbffc81d543c8a439022902b834073dea3e00000000000000000000000000000000000000000000000000038d7ea4c6800000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -3695,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec3400000000000000000000000097b1b4fe3b85ae6cc85323bb91c62ac9f56aa9ad00000000000000000000000097b1b4fe3b85ae6cc85323bb91c62ac9f56aa9ad00000000000000000000000000000000000000000000000000038d7ea4c6800000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -3696,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec34000000000000000000000000c544cf87f37d5862bef3c0a89ac6aa94f8d74e7c000000000000000000000000c544cf87f37d5862bef3c0a89ac6aa94f8d74e7c000000000000000000000000000000000000000000000000016345785d8a000000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -3697,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec340000000000000000000000008ba7a0136cc8e056e8641c8bb006113c8e0caf640000000000000000000000008ba7a0136cc8e056e8641c8bb006113c8e0caf640000000000000000000000000000000000000000000000000054d5fcf923250000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -3698,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec340000000000000000000000008346867972983eca1b7ceb5d3a60bb18f23a96010000000000000000000000008346867972983eca1b7ceb5d3a60bb18f23a960100000000000000000000000000000000000000000000000000932892ecc8224800000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,0x146a7f6bacd30db43ed1a0a6052f91063cce9d1d1e6080563dcbf9ac3bb5ff77,2022-03-04 12:04:17.000 UTC,0,true -3699,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec34000000000000000000000000b08b9f29edfd8feed9a6f1c23db3d7ffe9bc89f9000000000000000000000000b08b9f29edfd8feed9a6f1c23db3d7ffe9bc89f900000000000000000000000000000000000000000000000000354a6ba7a1800000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -3700,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec3400000000000000000000000073ce4c69c1e4b26b324f62da4a2439bae8957d3800000000000000000000000073ce4c69c1e4b26b324f62da4a2439bae8957d380000000000000000000000000000000000000000000000000060076ad2445b2e00000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -3701,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec34000000000000000000000000073b1245ec728ae5fc4ffe3287873c89aa057334000000000000000000000000073b1245ec728ae5fc4ffe3287873c89aa05733400000000000000000000000000000000000000000000000001933eb75c39efb200000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -3702,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec340000000000000000000000007cf1e827a248123f68de5879687ae9e928e5ff7f0000000000000000000000007cf1e827a248123f68de5879687ae9e928e5ff7f00000000000000000000000000000000000000000000000000ce54e7fb424d0000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -3704,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec34000000000000000000000000fb5e5e296186ad319c7cd221e47febbfebb2555f000000000000000000000000fb5e5e296186ad319c7cd221e47febbfebb2555f000000000000000000000000000000000000000000000000013fbe85edc9000000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -3706,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec340000000000000000000000006f986a3e141dc29b77160fd313faa9c7a3cc983a0000000000000000000000006f986a3e141dc29b77160fd313faa9c7a3cc983a0000000000000000000000000000000000000000000000000150cc1904b5000000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -3707,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec340000000000000000000000004cdf67d66a4958ea1364db82437afaffa6f3295d0000000000000000000000004cdf67d66a4958ea1364db82437afaffa6f3295d000000000000000000000000000000000000000000000000000aa87bee53800000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -3709,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec34000000000000000000000000e6999a8508d9f36c5ee6ad0152b393e145481aa5000000000000000000000000e6999a8508d9f36c5ee6ad0152b393e145481aa5000000000000000000000000000000000000000000000000006a94d74f43000000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -3710,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec34000000000000000000000000dd27ef02c889230ee98465e570fd4a3a2724abd5000000000000000000000000dd27ef02c889230ee98465e570fd4a3a2724abd50000000000000000000000000000000000000000000000000032e12ac200d3a700000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -3711,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec340000000000000000000000007f275599564fd00281c450ee6c50f03214fce8960000000000000000000000007f275599564fd00281c450ee6c50f03214fce896000000000000000000000000000000000000000000000000015af694b741750000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -3712,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec340000000000000000000000001b4aa4ad0fa6cb4079ead2b0fb2239ae01f464b60000000000000000000000001b4aa4ad0fa6cb4079ead2b0fb2239ae01f464b60000000000000000000000000000000000000000000000000009dd75da31ba0000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -3713,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec340000000000000000000000005b25c1a12ace49fe05979041b763b4982e8bdd3e0000000000000000000000005b25c1a12ace49fe05979041b763b4982e8bdd3e00000000000000000000000000000000000000000000000000c8c2ea4839940000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -3714,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec340000000000000000000000001c06efe1b692083d3d823687ffdc3b0e4332d12b0000000000000000000000001c06efe1b692083d3d823687ffdc3b0e4332d12b000000000000000000000000000000000000000000000000033d0e4796df2bd500000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,0x56eb5ddb861a5caad51b6d2083933a95e6b9b73a83580a34a957794e8e6af758,2022-04-21 01:58:31.000 UTC,0,true -3716,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec34000000000000000000000000a1302555eae657335fb9829cc5afdbe878239cf4000000000000000000000000a1302555eae657335fb9829cc5afdbe878239cf400000000000000000000000000000000000000000000000000a8835de65528b200000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -3722,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0xa9f9e675000000000000000000000000a0b86991c6218b36c1d19d4a2e9eb0ce3606eb480000000000000000000000007f5c764cbc14f9669b88837ca1490cca17c31607000000000000000000000000c24679ce898676e0cbecc1e5c216c5619feaa255000000000000000000000000c24679ce898676e0cbecc1e5c216c5619feaa25500000000000000000000000000000000000000000000000000000000254f578b00000000000000000000000000000000000000000000000000000000000000c00000000000000000000000000000000000000000000000000000000000000000,,,1,true -3726,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec34000000000000000000000000c7e4ca65590e5d0630f5fde7ca5a0bb880522391000000000000000000000000c7e4ca65590e5d0630f5fde7ca5a0bb8805223910000000000000000000000000000000000000000000000000038abb391a804c000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -3729,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec340000000000000000000000004283e38da7815ab32ded99cd7008fb134b5f3f4b0000000000000000000000004283e38da7815ab32ded99cd7008fb134b5f3f4b000000000000000000000000000000000000000000000000009ad3631d922d7000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -3730,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec3400000000000000000000000041f3e6e3c08ef0800d4e563265f55317932c734200000000000000000000000041f3e6e3c08ef0800d4e563265f55317932c73420000000000000000000000000000000000000000000000000016eabcc00d5ea000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -3731,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec340000000000000000000000007f275599564fd00281c450ee6c50f03214fce8960000000000000000000000007f275599564fd00281c450ee6c50f03214fce896000000000000000000000000000000000000000000000000036f7e03bc6e180000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -3732,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec340000000000000000000000000f9175f2cbdf68c1f983db87c41e6d2b7be126c50000000000000000000000000f9175f2cbdf68c1f983db87c41e6d2b7be126c5000000000000000000000000000000000000000000000000001535985d90de0000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -3734,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec34000000000000000000000000108efaaefa1f2b96928bdb5c78b935458feb8dd5000000000000000000000000108efaaefa1f2b96928bdb5c78b935458feb8dd5000000000000000000000000000000000000000000000000002386f26fc1000000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -3736,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec340000000000000000000000009aa405d5ffd65bd6ebbde196170c34bf8e9ae94e0000000000000000000000009aa405d5ffd65bd6ebbde196170c34bf8e9ae94e00000000000000000000000000000000000000000000000000470de4df82000000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -3738,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec34000000000000000000000000e5cfe9f9ff617a274960dc84f82c03e5098b2d53000000000000000000000000e5cfe9f9ff617a274960dc84f82c03e5098b2d53000000000000000000000000000000000000000000000000001a904188826d0000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -3739,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec3400000000000000000000000071c77a0e30b4c2f3ca4cf2cfbaee0e039b2e7b5900000000000000000000000071c77a0e30b4c2f3ca4cf2cfbaee0e039b2e7b59000000000000000000000000000000000000000000000000025bf6196bd1000000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -3740,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec34000000000000000000000000b843d5ddf91de2dec8e77dc133aba21a7d013dac000000000000000000000000b843d5ddf91de2dec8e77dc133aba21a7d013dac00000000000000000000000000000000000000000000000000038d7ea4c6800000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -3741,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0xa9f9e675000000000000000000000000dac17f958d2ee523a2206206994597c13d831ec700000000000000000000000094b008aa00579c1307b0ef2c499ad98a8ce58e58000000000000000000000000bf1751f32bd0cbd8b44d9d3064aadf9df3757349000000000000000000000000bf1751f32bd0cbd8b44d9d3064aadf9df37573490000000000000000000000000000000000000000000000000000000007e8939f00000000000000000000000000000000000000000000000000000000000000c00000000000000000000000000000000000000000000000000000000000000000,,,1,true -3742,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec34000000000000000000000000cf49bf6e2e975325bbea284d615f0cb3d928a20f000000000000000000000000cf49bf6e2e975325bbea284d615f0cb3d928a20f000000000000000000000000000000000000000000000000001a39d68c2cae0000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -3745,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0xa9f9e675000000000000000000000000dac17f958d2ee523a2206206994597c13d831ec700000000000000000000000094b008aa00579c1307b0ef2c499ad98a8ce58e5800000000000000000000000078275af1a67c7bb4c88c23601db4066499387c7f00000000000000000000000078275af1a67c7bb4c88c23601db4066499387c7f000000000000000000000000000000000000000000000000000000001b5bc8c000000000000000000000000000000000000000000000000000000000000000c00000000000000000000000000000000000000000000000000000000000000000,,,1,true -3746,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec3400000000000000000000000022838365403af97f06a287c97441a2f37b70165a00000000000000000000000022838365403af97f06a287c97441a2f37b70165a000000000000000000000000000000000000000000000000001b87344aaba60000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -3747,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec340000000000000000000000009e9aab52fbc67240ed8e0df4ac47f9bd8e502b790000000000000000000000009e9aab52fbc67240ed8e0df4ac47f9bd8e502b7900000000000000000000000000000000000000000000000000b3883cecdbec9b00000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -3748,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec34000000000000000000000000c0667fef209ff1469c334d4de9ee6c78a372b3c2000000000000000000000000c0667fef209ff1469c334d4de9ee6c78a372b3c2000000000000000000000000000000000000000000000000003fff819405230000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -3749,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec34000000000000000000000000d504f282cd20bff9f0e2b7d006771e3a81f6bdbd000000000000000000000000d504f282cd20bff9f0e2b7d006771e3a81f6bdbd000000000000000000000000000000000000000000000000011c4e0db4e21ba200000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -3750,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec34000000000000000000000000369378f65bea146234fd290fc1ac59d0ecf921ed000000000000000000000000369378f65bea146234fd290fc1ac59d0ecf921ed00000000000000000000000000000000000000000000000000872dcf7b1423d900000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -3751,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec34000000000000000000000000d3d2e2a1de238241ae90e098d06e101e2a428d80000000000000000000000000d3d2e2a1de238241ae90e098d06e101e2a428d80000000000000000000000000000000000000000000000000001550f7dca7000000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -3752,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec34000000000000000000000000e3a38bb08446a114ba0081aaf55b496f18d9bdcd000000000000000000000000e3a38bb08446a114ba0081aaf55b496f18d9bdcd000000000000000000000000000000000000000000000000000124c7d16723c000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -3753,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec340000000000000000000000009dd092ead78363e9a86889d70727d1d9037f39f80000000000000000000000009dd092ead78363e9a86889d70727d1d9037f39f8000000000000000000000000000000000000000000000000004559e1a8aed42e00000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -3754,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec3400000000000000000000000002c95fef9de755f18144615ea3e93fd23e677f9b00000000000000000000000002c95fef9de755f18144615ea3e93fd23e677f9b000000000000000000000000000000000000000000000000001cee9468fed50000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -3755,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec340000000000000000000000003e0f589d68f839c5b9e92598370e4728a193edfb0000000000000000000000003e0f589d68f839c5b9e92598370e4728a193edfb00000000000000000000000000000000000000000000000000404b938882530000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -3756,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec34000000000000000000000000b079b3333e2fba074438c42b2c75be2c60a453fe000000000000000000000000b079b3333e2fba074438c42b2c75be2c60a453fe000000000000000000000000000000000000000000000000003ff2e795f5000000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -3758,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec3400000000000000000000000077d9418d284f2bfd8bfac5428bbf2d7e3372c27e00000000000000000000000077d9418d284f2bfd8bfac5428bbf2d7e3372c27e00000000000000000000000000000000000000000000000000c5f9b15062393d00000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -3759,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec34000000000000000000000000d88d5b3dbe8790369799012310c31eb210eeec81000000000000000000000000d88d5b3dbe8790369799012310c31eb210eeec810000000000000000000000000000000000000000000000000af4a5368de1b44000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -3761,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec34000000000000000000000000dd841182e5c586f917015bfb2665bc335267f753000000000000000000000000dd841182e5c586f917015bfb2665bc335267f75300000000000000000000000000000000000000000000000000354a6ba7a1800000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -3763,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec34000000000000000000000000423f024de8137ecb8396f7f5e657f441f2879dab000000000000000000000000423f024de8137ecb8396f7f5e657f441f2879dab0000000000000000000000000000000000000000000000000031bced02db000000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -3764,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec340000000000000000000000004cb0032536cef0e50d670dd72b03eaa004d578400000000000000000000000004cb0032536cef0e50d670dd72b03eaa004d57840000000000000000000000000000000000000000000000000002386f26fc1000000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,0x86eced8d9a730eb85494b1b3cb8cad3f34a916f875d24f189497024d4b39711e,2022-04-28 15:19:38.000 UTC,0,true -3765,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec340000000000000000000000006548e04bd2303fb34cfb89d6bdbfb96200a7ac980000000000000000000000006548e04bd2303fb34cfb89d6bdbfb96200a7ac98000000000000000000000000000000000000000000000000000b3bdbe270136a00000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -3766,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec340000000000000000000000009564d7aed0f3bf0d2ca204fc07a6ec75e969fa8b0000000000000000000000009564d7aed0f3bf0d2ca204fc07a6ec75e969fa8b000000000000000000000000000000000000000000000000000ab565db430b2300000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -3768,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec34000000000000000000000000d74c56c55573d810a130599aac4bec2337b4dc3d000000000000000000000000d74c56c55573d810a130599aac4bec2337b4dc3d000000000000000000000000000000000000000000000000002386f26fc1000000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -3769,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec340000000000000000000000003afff5535509253870fc986483328d7eed93f4050000000000000000000000003afff5535509253870fc986483328d7eed93f40500000000000000000000000000000000000000000000000000a1b3d75693691300000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -3770,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec34000000000000000000000000750477199971bd75e8d75810cfa8a429d7b55828000000000000000000000000750477199971bd75e8d75810cfa8a429d7b55828000000000000000000000000000000000000000000000000004e83d53989400000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -3771,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec34000000000000000000000000b1667baf1bcb5631e45d007d849ecbed61c92537000000000000000000000000b1667baf1bcb5631e45d007d849ecbed61c92537000000000000000000000000000000000000000000000000002386f26fc1000000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -3772,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec3400000000000000000000000095d8c745c7073b981c3cc76f9cf739bac0d532c200000000000000000000000095d8c745c7073b981c3cc76f9cf739bac0d532c2000000000000000000000000000000000000000000000000000a444d64d3956900000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -3774,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec340000000000000000000000000677ec29dbbb8e301e508d4f1bcd59cc0632f66b0000000000000000000000000677ec29dbbb8e301e508d4f1bcd59cc0632f66b00000000000000000000000000000000000000000000000000d529ae9e86000000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -3775,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec3400000000000000000000000058f54129b66adb13dd2ef12537fa51e300363dbd00000000000000000000000058f54129b66adb13dd2ef12537fa51e300363dbd000000000000000000000000000000000000000000000000000b9ce5059e533b00000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -3776,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec340000000000000000000000001f9ad14de2590813d0788526b22ef112df7286d70000000000000000000000001f9ad14de2590813d0788526b22ef112df7286d700000000000000000000000000000000000000000000000000470de4df82000000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -3777,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec34000000000000000000000000570cf8eb179d6f8293a88fa79ae0b13fca888898000000000000000000000000570cf8eb179d6f8293a88fa79ae0b13fca888898000000000000000000000000000000000000000000000000008f19aed0609d7e00000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -3779,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec34000000000000000000000000b1667baf1bcb5631e45d007d849ecbed61c92537000000000000000000000000b1667baf1bcb5631e45d007d849ecbed61c925370000000000000000000000000000000000000000000000000012795f58d5000000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -3780,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec3400000000000000000000000075f1b7ae6e1f307088b2e65a366ec345e717d3f900000000000000000000000075f1b7ae6e1f307088b2e65a366ec345e717d3f9000000000000000000000000000000000000000000000000000d3f3df217770100000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -3782,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec3400000000000000000000000089d11c7c7bd8699ac6e089c79b2faac66509ccbf00000000000000000000000089d11c7c7bd8699ac6e089c79b2faac66509ccbf00000000000000000000000000000000000000000000000000a5b952f4f1ba2a00000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -3783,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec34000000000000000000000000bd519f2206a441738042e7b3af6daacc26b03b0f000000000000000000000000bd519f2206a441738042e7b3af6daacc26b03b0f0000000000000000000000000000000000000000000000000007be578a7f380000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -3785,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec34000000000000000000000000754d92358e0d4dff0aad19a21c5e989b9411c698000000000000000000000000754d92358e0d4dff0aad19a21c5e989b9411c698000000000000000000000000000000000000000000000000011c37937e08000000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -3786,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec34000000000000000000000000516a4adbffa2cd62865effb0bd27a9eb9735d2b0000000000000000000000000516a4adbffa2cd62865effb0bd27a9eb9735d2b000000000000000000000000000000000000000000000000000ad6697411420e400000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -3787,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec34000000000000000000000000c6b0e93a33e7d1e18199147d4bf6d0ebf8f8500a000000000000000000000000c6b0e93a33e7d1e18199147d4bf6d0ebf8f8500a000000000000000000000000000000000000000000000000002386f26fc1000000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -3788,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec34000000000000000000000000db415f659a141e3abdf3367d7761066515511163000000000000000000000000db415f659a141e3abdf3367d776106651551116300000000000000000000000000000000000000000000000000f8b0a10e47000000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -3789,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec340000000000000000000000000e2dbaacde75dfe48b03260d7f0ff15feef3c4c20000000000000000000000000e2dbaacde75dfe48b03260d7f0ff15feef3c4c2000000000000000000000000000000000000000000000000010eaee42a632fc100000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -3790,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec3400000000000000000000000072c3c76bad4ead8a5d737a006663cc0a491c79b300000000000000000000000072c3c76bad4ead8a5d737a006663cc0a491c79b3000000000000000000000000000000000000000000000000002aa1efb94e000000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -3791,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0xa9f9e675000000000000000000000000dac17f958d2ee523a2206206994597c13d831ec700000000000000000000000094b008aa00579c1307b0ef2c499ad98a8ce58e580000000000000000000000008849ee2e94f6c7437292fdc0c9d85c2577ba69050000000000000000000000008849ee2e94f6c7437292fdc0c9d85c2577ba6905000000000000000000000000000000000000000000000000000000000098968000000000000000000000000000000000000000000000000000000000000000c00000000000000000000000000000000000000000000000000000000000000000,,,1,true -3792,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec34000000000000000000000000d78e07f410cedcc234447881e5574f0cd0583b48000000000000000000000000d78e07f410cedcc234447881e5574f0cd0583b48000000000000000000000000000000000000000000000000007c101ca157a0c200000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -3794,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec3400000000000000000000000007e2ab7bd1eb35269d9714dade8ac0302c2146a600000000000000000000000007e2ab7bd1eb35269d9714dade8ac0302c2146a600000000000000000000000000000000000000000000000000071afd498d000000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -3796,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec340000000000000000000000000813407596e7c63cd3958ff081ca078cb31ddbf10000000000000000000000000813407596e7c63cd3958ff081ca078cb31ddbf1000000000000000000000000000000000000000000000000001efd34eb78aa0000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -3797,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec34000000000000000000000000e01b7a8262bd737068126769c21c86e57a250f53000000000000000000000000e01b7a8262bd737068126769c21c86e57a250f5300000000000000000000000000000000000000000000000000005af3107a400000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -3799,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec3400000000000000000000000096aae12d0d97428bbd24d4e5e43c1db73149bcc400000000000000000000000096aae12d0d97428bbd24d4e5e43c1db73149bcc4000000000000000000000000000000000000000000000000006a94d74f43000000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -3800,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec34000000000000000000000000d9a5f53cc1c4a32ed891d8a3585905db3ced6689000000000000000000000000d9a5f53cc1c4a32ed891d8a3585905db3ced668900000000000000000000000000000000000000000000000001ccc91ae74612a300000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -3801,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec34000000000000000000000000489a776cbd29e9f986c8a194cddb3527a6e4d8b8000000000000000000000000489a776cbd29e9f986c8a194cddb3527a6e4d8b800000000000000000000000000000000000000000000000000ae153d89fe800000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -3802,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec34000000000000000000000000315e1a5c796b734585c27e615b774441372fbd08000000000000000000000000315e1a5c796b734585c27e615b774441372fbd0800000000000000000000000000000000000000000000000000b1a2bc2ec5000000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -3803,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec34000000000000000000000000a4fcee82f6c8664d63fa93b90dee3ebf940a907d000000000000000000000000a4fcee82f6c8664d63fa93b90dee3ebf940a907d000000000000000000000000000000000000000000000000001a81d2324aa09800000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -3804,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec34000000000000000000000000f412b5f5faa69082ffbf9497480b2596c5097e63000000000000000000000000f412b5f5faa69082ffbf9497480b2596c5097e630000000000000000000000000000000000000000000000000018de76816d800000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -3805,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec34000000000000000000000000c634aa608ccdba729f540bd4f740d8671aa4ff68000000000000000000000000c634aa608ccdba729f540bd4f740d8671aa4ff680000000000000000000000000000000000000000000000000001902d7bb3800000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -3806,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec340000000000000000000000006a05dfcb3e061675bb1628e26161db7c886f707a0000000000000000000000006a05dfcb3e061675bb1628e26161db7c886f707a0000000000000000000000000000000000000000000000000018de76816d800000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -3807,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec3400000000000000000000000078d56686655978326009c884fb12482ea1afd99000000000000000000000000078d56686655978326009c884fb12482ea1afd990000000000000000000000000000000000000000000000000001ce1fe9db92e0000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -3808,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec34000000000000000000000000f1955833b0786b2f5b725e13f220c3abba9ea89f000000000000000000000000f1955833b0786b2f5b725e13f220c3abba9ea89f00000000000000000000000000000000000000000000000000b5700c4d927dbe00000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -3809,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec340000000000000000000000003fcc251bcc3a519cd4c8b984c6dda0744fcb4ff40000000000000000000000003fcc251bcc3a519cd4c8b984c6dda0744fcb4ff400000000000000000000000000000000000000000000000000354a6ba7a1800000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -3810,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec340000000000000000000000002c4f717e9fd9c01b68cf68f3e984c3603aecfa1e0000000000000000000000002c4f717e9fd9c01b68cf68f3e984c3603aecfa1e00000000000000000000000000000000000000000000000001493b5b91df58ff00000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -3811,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0xa9f9e675000000000000000000000000dac17f958d2ee523a2206206994597c13d831ec700000000000000000000000094b008aa00579c1307b0ef2c499ad98a8ce58e580000000000000000000000008d2800996df63489bbc72291b5105b47dff7c1db0000000000000000000000008d2800996df63489bbc72291b5105b47dff7c1db000000000000000000000000000000000000000000000000000000000097673200000000000000000000000000000000000000000000000000000000000000c00000000000000000000000000000000000000000000000000000000000000000,,,1,true -3812,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec34000000000000000000000000b2f6d20ca538d094bc14f7f5f78dbb59a2dab941000000000000000000000000b2f6d20ca538d094bc14f7f5f78dbb59a2dab941000000000000000000000000000000000000000000000000002da473a405890000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -3813,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec34000000000000000000000000a7ebd39478c6d0f4ff652cb3ad1f268f80fc180b000000000000000000000000a7ebd39478c6d0f4ff652cb3ad1f268f80fc180b00000000000000000000000000000000000000000000000000071afd498d000000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -3814,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec3400000000000000000000000072f55b96e746075da2932a5518251aa641f79e4d00000000000000000000000072f55b96e746075da2932a5518251aa641f79e4d000000000000000000000000000000000000000000000000002386f26fc1000000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -3815,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec34000000000000000000000000300c8115f3bbcba6b11ea660bb6b8ad9b50e5095000000000000000000000000300c8115f3bbcba6b11ea660bb6b8ad9b50e509500000000000000000000000000000000000000000000000000be513f2e3b538c00000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -3816,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec340000000000000000000000000375004acccfb6c51ece8f8e9d392ac3ee1fc7b50000000000000000000000000375004acccfb6c51ece8f8e9d392ac3ee1fc7b5000000000000000000000000000000000000000000000000002386f26fc1000000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -3817,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec340000000000000000000000003f0a7f7182a7efee4eb6f2284a18fb3db388f4a30000000000000000000000003f0a7f7182a7efee4eb6f2284a18fb3db388f4a3000000000000000000000000000000000000000000000000002ee474461e847400000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -3818,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec3400000000000000000000000010611590e8b86fd369ba0053af0d9d94b4d5e2fd00000000000000000000000010611590e8b86fd369ba0053af0d9d94b4d5e2fd000000000000000000000000000000000000000000000000002386f26fc1000000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -3819,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec340000000000000000000000000281b87fd1c6e9889a640ea433701a50c188353f0000000000000000000000000281b87fd1c6e9889a640ea433701a50c188353f00000000000000000000000000000000000000000000000000341cbace10a9c100000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -3820,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec34000000000000000000000000491830a07fb1e9a0ad0594350f4ec40dca7221c9000000000000000000000000491830a07fb1e9a0ad0594350f4ec40dca7221c900000000000000000000000000000000000000000000000000071afd498d000000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -3821,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec340000000000000000000000006b9fca59517f111b12ed215066c6acb8b047e9f40000000000000000000000006b9fca59517f111b12ed215066c6acb8b047e9f4000000000000000000000000000000000000000000000000003c0a5dfe68008e00000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -3822,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec340000000000000000000000001f0641456068a18bf7c650fa8baa10a16a91e9d20000000000000000000000001f0641456068a18bf7c650fa8baa10a16a91e9d200000000000000000000000000000000000000000000000000b1c8c44c27f84d00000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -3824,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec3400000000000000000000000005974bba5c87c1cbfd49ccfa523d2c43a39effa100000000000000000000000005974bba5c87c1cbfd49ccfa523d2c43a39effa10000000000000000000000000000000000000000000000000003be644b1aeb8200000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -3825,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec34000000000000000000000000771bb178d252a53539bed32a81feed638bece156000000000000000000000000771bb178d252a53539bed32a81feed638bece15600000000000000000000000000000000000000000000000000261b5f5d6ead3c00000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -3826,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0xa9f9e675000000000000000000000000dac17f958d2ee523a2206206994597c13d831ec700000000000000000000000094b008aa00579c1307b0ef2c499ad98a8ce58e5800000000000000000000000043b2dab2c28e6775626f41d2cdfde0cb2b0fee2300000000000000000000000043b2dab2c28e6775626f41d2cdfde0cb2b0fee230000000000000000000000000000000000000000000000000000000000ca027100000000000000000000000000000000000000000000000000000000000000c00000000000000000000000000000000000000000000000000000000000000000,,,1,true -3827,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec340000000000000000000000006fcb0c131c5648808ed90b651dac3ee52167ab300000000000000000000000006fcb0c131c5648808ed90b651dac3ee52167ab30000000000000000000000000000000000000000000000000009a0d5cd60e1c9700000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -3829,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec3400000000000000000000000091a56b8c4203821bf4267e071b42122f5aef99b500000000000000000000000091a56b8c4203821bf4267e071b42122f5aef99b50000000000000000000000000000000000000000000000000001c6bf5263400000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -3830,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec3400000000000000000000000039449e70f8c4840d594dc39206ac255250c3de1a00000000000000000000000039449e70f8c4840d594dc39206ac255250c3de1a000000000000000000000000000000000000000000000000014c1782a2b1a85c00000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -3832,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec34000000000000000000000000226d4e9559b91a58f5763d11722178a983e8efd6000000000000000000000000226d4e9559b91a58f5763d11722178a983e8efd60000000000000000000000000000000000000000000000000411084ff1221ca900000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -3833,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec3400000000000000000000000047896f79d4b3f5e67993c3abdb91554a8be03a1100000000000000000000000047896f79d4b3f5e67993c3abdb91554a8be03a11000000000000000000000000000000000000000000000000002386f26fc1000000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -3834,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec34000000000000000000000000cdf5fa5ddfe6b18c43dfcbf0606a18d03814de62000000000000000000000000cdf5fa5ddfe6b18c43dfcbf0606a18d03814de62000000000000000000000000000000000000000000000000002386f26fc1000000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -3835,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec340000000000000000000000009f127e08fe04acbe8562cdd83bc3cb4911264efc0000000000000000000000009f127e08fe04acbe8562cdd83bc3cb4911264efc000000000000000000000000000000000000000000000000004d00ef8d868e1f00000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -3836,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0xa9f9e675000000000000000000000000dac17f958d2ee523a2206206994597c13d831ec700000000000000000000000094b008aa00579c1307b0ef2c499ad98a8ce58e580000000000000000000000008408e984be85f93f4b8fdab8c326a300e1299a130000000000000000000000008408e984be85f93f4b8fdab8c326a300e1299a130000000000000000000000000000000000000000000000000000000000fc87b700000000000000000000000000000000000000000000000000000000000000c00000000000000000000000000000000000000000000000000000000000000000,,,1,true -3837,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec34000000000000000000000000e0251c065aa6a144d573d2b25d8c0b3c07ad0d44000000000000000000000000e0251c065aa6a144d573d2b25d8c0b3c07ad0d4400000000000000000000000000000000000000000000000000038d7ea4c6800000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -3839,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec3400000000000000000000000040f97c33ec682c872eabe60e24bba862a2152ae200000000000000000000000040f97c33ec682c872eabe60e24bba862a2152ae20000000000000000000000000000000000000000000000000555ac9c03666ff200000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -3841,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec3400000000000000000000000067ba8b7a6cf8b93451422ecbd43152f2c0e101c800000000000000000000000067ba8b7a6cf8b93451422ecbd43152f2c0e101c8000000000000000000000000000000000000000000000000009b4d586152198700000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -3842,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0xa9f9e675000000000000000000000000dac17f958d2ee523a2206206994597c13d831ec700000000000000000000000094b008aa00579c1307b0ef2c499ad98a8ce58e58000000000000000000000000f4f342ffb2122ec36ddc77ff5825ff8f430991a4000000000000000000000000f4f342ffb2122ec36ddc77ff5825ff8f430991a40000000000000000000000000000000000000000000000000000000002faf08000000000000000000000000000000000000000000000000000000000000000c00000000000000000000000000000000000000000000000000000000000000000,,,1,true -3843,0x10e6593cdda8c58a1d0f14c5164b376352a55f2f,0x467194771dae2967aef3ecbedd3bf9a310c76c65,0xa9f9e6750000000000000000000000006b175474e89094c44da98b954eedeac495271d0f000000000000000000000000da10009cbd5d07dd0cecc66161fc93d7c9000da100000000000000000000000040b32f1e906fa57b30e2059b29c698c19dd6fe9500000000000000000000000040b32f1e906fa57b30e2059b29c698c19dd6fe95000000000000000000000000000000000000000000000001c9ca0e4f144b148600000000000000000000000000000000000000000000000000000000000000c00000000000000000000000000000000000000000000000000000000000000000,,,1,true -3844,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec3400000000000000000000000004f25877c6ab337aab6898cf70db3ea00bad83a900000000000000000000000004f25877c6ab337aab6898cf70db3ea00bad83a90000000000000000000000000000000000000000000000000009fd6f4d17d2c000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -3845,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec340000000000000000000000007558899d8109d8a2ce457837ade56c3d6ebfe90d0000000000000000000000007558899d8109d8a2ce457837ade56c3d6ebfe90d00000000000000000000000000000000000000000000000000038d7ea4c6800000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -3846,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0xa9f9e675000000000000000000000000dac17f958d2ee523a2206206994597c13d831ec700000000000000000000000094b008aa00579c1307b0ef2c499ad98a8ce58e5800000000000000000000000038bdb2f63e6ac5996cec5cea17ed0c6da066978100000000000000000000000038bdb2f63e6ac5996cec5cea17ed0c6da06697810000000000000000000000000000000000000000000000000000000000975ea200000000000000000000000000000000000000000000000000000000000000c00000000000000000000000000000000000000000000000000000000000000000,,,1,true -3847,0x10e6593cdda8c58a1d0f14c5164b376352a55f2f,0x467194771dae2967aef3ecbedd3bf9a310c76c65,0xa9f9e6750000000000000000000000006b175474e89094c44da98b954eedeac495271d0f000000000000000000000000da10009cbd5d07dd0cecc66161fc93d7c9000da10000000000000000000000003b8d47f77c537842cfe003ffd751cbb8cf8f9f540000000000000000000000003b8d47f77c537842cfe003ffd751cbb8cf8f9f5400000000000000000000000000000000000000000000000059f0841efbdff9bd00000000000000000000000000000000000000000000000000000000000000c00000000000000000000000000000000000000000000000000000000000000000,,,1,true -3849,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0xa9f9e675000000000000000000000000dac17f958d2ee523a2206206994597c13d831ec700000000000000000000000094b008aa00579c1307b0ef2c499ad98a8ce58e58000000000000000000000000b12fa3e8c3db55cbd103c6f12174c091304eeb1f000000000000000000000000b12fa3e8c3db55cbd103c6f12174c091304eeb1f00000000000000000000000000000000000000000000000000000000007985cd00000000000000000000000000000000000000000000000000000000000000c00000000000000000000000000000000000000000000000000000000000000000,,,1,true -3850,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec34000000000000000000000000c3a038cb837ff7cdb038c72d3714951a835e6a36000000000000000000000000c3a038cb837ff7cdb038c72d3714951a835e6a36000000000000000000000000000000000000000000000000008b921b2cf6e9f900000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -3851,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec340000000000000000000000008923b496d365c6de1d694de37e9e11c18627dec20000000000000000000000008923b496d365c6de1d694de37e9e11c18627dec200000000000000000000000000000000000000000000000000307a67ed8bb4ad00000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -3852,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec340000000000000000000000004012460b81a1b975149071eea32f7391a82e54750000000000000000000000004012460b81a1b975149071eea32f7391a82e5475000000000000000000000000000000000000000000000000009871f15500ad6500000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -3853,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec34000000000000000000000000fa5b9a2dc716bd732c0633d576db4d9cceb36f55000000000000000000000000fa5b9a2dc716bd732c0633d576db4d9cceb36f55000000000000000000000000000000000000000000000000013e5769b518517600000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -3854,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec340000000000000000000000003159fb204e29c5666780d60bd34bffbd1bb1b9660000000000000000000000003159fb204e29c5666780d60bd34bffbd1bb1b9660000000000000000000000000000000000000000000000000102009878bae82600000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -3855,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec3400000000000000000000000029ab02016fd6a2c6fe199f8a2c28c1dd8735dd8100000000000000000000000029ab02016fd6a2c6fe199f8a2c28c1dd8735dd81000000000000000000000000000000000000000000000000005e63b9ee7bec0000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -3856,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec3400000000000000000000000087497f866184d7e32281e5ba09e36ba476ffbbc400000000000000000000000087497f866184d7e32281e5ba09e36ba476ffbbc4000000000000000000000000000000000000000000000000002905749d1ec11900000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -3857,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec340000000000000000000000000d3eb1796600fddd8128b4ce284f789a942bd1a80000000000000000000000000d3eb1796600fddd8128b4ce284f789a942bd1a8000000000000000000000000000000000000000000000000000b98c538fe4ab600000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -3858,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec34000000000000000000000000ca6a99150fa9a555de0b4cd56a3d3cc7ee74591a000000000000000000000000ca6a99150fa9a555de0b4cd56a3d3cc7ee74591a0000000000000000000000000000000000000000000000001af044837ce2a9f100000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -3860,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0xa9f9e675000000000000000000000000dac17f958d2ee523a2206206994597c13d831ec700000000000000000000000094b008aa00579c1307b0ef2c499ad98a8ce58e58000000000000000000000000bac76b4c06d7c642601e995a68cb5186ee3154e6000000000000000000000000bac76b4c06d7c642601e995a68cb5186ee3154e60000000000000000000000000000000000000000000000000000000006cb41c600000000000000000000000000000000000000000000000000000000000000c00000000000000000000000000000000000000000000000000000000000000000,,,1,true -3861,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec34000000000000000000000000250c60517a09bfe0ce2614f168482d4cdde54521000000000000000000000000250c60517a09bfe0ce2614f168482d4cdde54521000000000000000000000000000000000000000000000000013ebcaf9702341e00000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -3862,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0xa9f9e6750000000000000000000000001f9840a85d5af5bf1d1762f925bdaddc4201f9840000000000000000000000006fd9d7ad17242c41f7131d257212c54a0e816691000000000000000000000000e614436af4dce18bb711a46a1eb88c9bd6752f90000000000000000000000000e614436af4dce18bb711a46a1eb88c9bd6752f9000000000000000000000000000000000000000000000000006d013da300ad47200000000000000000000000000000000000000000000000000000000000000c00000000000000000000000000000000000000000000000000000000000000000,,,1,true -3863,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec34000000000000000000000000a699e3109bf34f6b175287b5d87c3b880ecf36b3000000000000000000000000a699e3109bf34f6b175287b5d87c3b880ecf36b300000000000000000000000000000000000000000000000000ae4473db5f92d900000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -3867,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec34000000000000000000000000864a269bf59800a7b07c2e543cbcad1339009038000000000000000000000000864a269bf59800a7b07c2e543cbcad1339009038000000000000000000000000000000000000000000000000002bf3c7a7c06a9d00000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -3868,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec340000000000000000000000001eba4156edbc932dbba3ab346df0bc5dad090ca50000000000000000000000001eba4156edbc932dbba3ab346df0bc5dad090ca500000000000000000000000000000000000000000000000000aa2ff221888e0000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -3869,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0xa9f9e6750000000000000000000000001f9840a85d5af5bf1d1762f925bdaddc4201f9840000000000000000000000006fd9d7ad17242c41f7131d257212c54a0e816691000000000000000000000000eb40d183faec21ca7abc4af1a5afe59b1e887149000000000000000000000000eb40d183faec21ca7abc4af1a5afe59b1e8871490000000000000000000000000000000000000000000000000605fb92345780c100000000000000000000000000000000000000000000000000000000000000c00000000000000000000000000000000000000000000000000000000000000000,,,1,true -3870,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec34000000000000000000000000e39d6f3a84ca26c65c941f7de02ea748308781a5000000000000000000000000e39d6f3a84ca26c65c941f7de02ea748308781a5000000000000000000000000000000000000000000000000003fc1fa95cd0f0000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -3871,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec34000000000000000000000000865e56dc344831e91e7618201987a9f7ddf6a716000000000000000000000000865e56dc344831e91e7618201987a9f7ddf6a716000000000000000000000000000000000000000000000000019c1d62a9f2000000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -3872,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec3400000000000000000000000017d8319926eb181225cf3c75dfd91e36a065612d00000000000000000000000017d8319926eb181225cf3c75dfd91e36a065612d0000000000000000000000000000000000000000000000000058d15e1762800000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -3873,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec34000000000000000000000000c93ffb6ccfa0fbe215de35afb3c7020a76accb4b000000000000000000000000c93ffb6ccfa0fbe215de35afb3c7020a76accb4b0000000000000000000000000000000000000000000000000086279d5758568f00000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -3875,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec340000000000000000000000000a8ff6463f2887c4f1b9fc7e6291d38940e43dd80000000000000000000000000a8ff6463f2887c4f1b9fc7e6291d38940e43dd8000000000000000000000000000000000000000000000000000cb8e41403cb4a00000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -3876,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0xa9f9e675000000000000000000000000dac17f958d2ee523a2206206994597c13d831ec700000000000000000000000094b008aa00579c1307b0ef2c499ad98a8ce58e58000000000000000000000000aa76c67ab68fa37df3821d41192f21b275f0beac000000000000000000000000aa76c67ab68fa37df3821d41192f21b275f0beac0000000000000000000000000000000000000000000000000000000011e1a30000000000000000000000000000000000000000000000000000000000000000c00000000000000000000000000000000000000000000000000000000000000000,,,1,true -3877,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec34000000000000000000000000c8460c65f8ecf0e590e0dfeb8ac5a4786370235b000000000000000000000000c8460c65f8ecf0e590e0dfeb8ac5a4786370235b000000000000000000000000000000000000000000000000013fbe85edc9000000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -3879,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec340000000000000000000000008a83bbbee6a05eb158371bc888deda2c853958a60000000000000000000000008a83bbbee6a05eb158371bc888deda2c853958a600000000000000000000000000000000000000000000000000f28d969b8644f500000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -3880,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec34000000000000000000000000fc83ece75cdc5f481f2221ca64dc27c7d3a3a360000000000000000000000000fc83ece75cdc5f481f2221ca64dc27c7d3a3a360000000000000000000000000000000000000000000000000002386f26fc1000000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -3881,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec34000000000000000000000000ca4410fed843bd3a596b4b9a825b3ee50eed339f000000000000000000000000ca4410fed843bd3a596b4b9a825b3ee50eed339f00000000000000000000000000000000000000000000000000071afd498d000000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -3882,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec34000000000000000000000000fc83ece75cdc5f481f2221ca64dc27c7d3a3a360000000000000000000000000fc83ece75cdc5f481f2221ca64dc27c7d3a3a360000000000000000000000000000000000000000000000000002386f26fc1000000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -3883,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec340000000000000000000000003e92d661bd5063f7df955d68e123b96d069069e90000000000000000000000003e92d661bd5063f7df955d68e123b96d069069e9000000000000000000000000000000000000000000000000009101098c2958ea00000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -3884,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec34000000000000000000000000cdcc0d3d741dd6501ad2f8109cd9d9f5d4784668000000000000000000000000cdcc0d3d741dd6501ad2f8109cd9d9f5d4784668000000000000000000000000000000000000000000000000008fe660daa7ac4d00000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -3885,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0xa9f9e675000000000000000000000000a0b86991c6218b36c1d19d4a2e9eb0ce3606eb480000000000000000000000007f5c764cbc14f9669b88837ca1490cca17c31607000000000000000000000000d08487457f8c37ef5a021af28280d4f915dd32f6000000000000000000000000d08487457f8c37ef5a021af28280d4f915dd32f600000000000000000000000000000000000000000000000000000000012ea65400000000000000000000000000000000000000000000000000000000000000c00000000000000000000000000000000000000000000000000000000000000000,,,1,true -3887,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec34000000000000000000000000171814db6dcaa27d2f88b1d31e306abda53e7526000000000000000000000000171814db6dcaa27d2f88b1d31e306abda53e752600000000000000000000000000000000000000000000000000038d7ea4c6800000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -3888,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec34000000000000000000000000cfa6a349a1e9c5f3bf109d5f00232f3855004567000000000000000000000000cfa6a349a1e9c5f3bf109d5f00232f38550045670000000000000000000000000000000000000000000000000093170bbcef3fc700000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -3889,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec3400000000000000000000000000c62fb0ed991c19edffedf58136f42d188c3cf200000000000000000000000000c62fb0ed991c19edffedf58136f42d188c3cf2000000000000000000000000000000000000000000000000012ccd9bfd26900200000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -3890,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec3400000000000000000000000044bbe4e4ef96278a80637b5f5622faba5e32803400000000000000000000000044bbe4e4ef96278a80637b5f5622faba5e3280340000000000000000000000000000000000000000000000000138d5d18ea5b9e800000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -3891,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec34000000000000000000000000cd9e3a9ac8741155abfeee31dbe138dd7ad30069000000000000000000000000cd9e3a9ac8741155abfeee31dbe138dd7ad3006900000000000000000000000000000000000000000000000002780cdbd55d803000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -3892,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec34000000000000000000000000b9c24db3d1a4b41813e77ecfe12d4397b438791e000000000000000000000000b9c24db3d1a4b41813e77ecfe12d4397b438791e000000000000000000000000000000000000000000000000027002878ae4905b00000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -3893,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec3400000000000000000000000060913b55ae54c325be3a8960536f1266aa64819700000000000000000000000060913b55ae54c325be3a8960536f1266aa64819700000000000000000000000000000000000000000000000000038d7ea4c6800000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -3894,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec340000000000000000000000001b53012acbac544b88a6a2dc881012b1eaad87d00000000000000000000000001b53012acbac544b88a6a2dc881012b1eaad87d000000000000000000000000000000000000000000000000000038d7ea4c6800000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -3895,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec34000000000000000000000000e5bd323d83b66be9c0b841e9774d9098db30f9f7000000000000000000000000e5bd323d83b66be9c0b841e9774d9098db30f9f700000000000000000000000000000000000000000000000000266e9b03cc378d00000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -3896,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec3400000000000000000000000046a2eaa65b8090124478813b690514e96411d60600000000000000000000000046a2eaa65b8090124478813b690514e96411d6060000000000000000000000000000000000000000000000000022fe5e75f0f98900000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -3897,0xcd9d4988c0ae61887b075ba77f08cbfad2b65068,0x3f87ff1de58128ef8fcb4c807efd776e1ac72e51,0xf4f7b41a0000000000000000000000005acfbbf0aa370f232e341bc0b1a40e996c960e07000000000000000000000000000000000000000000000003bd913e6c1df40000,,,1,true -3899,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec34000000000000000000000000e2c096bd1e7dec77fd08d5d18792c88a51f85c28000000000000000000000000e2c096bd1e7dec77fd08d5d18792c88a51f85c28000000000000000000000000000000000000000000000000004632ad75f4997100000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -3900,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec34000000000000000000000000ca26545fe29370565c2533d39b5294c7b7c89f17000000000000000000000000ca26545fe29370565c2533d39b5294c7b7c89f1700000000000000000000000000000000000000000000000000038d7ea4c6800000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -3902,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec34000000000000000000000000ae1a62bc5e7f80a45fd02d20520359972143c1e4000000000000000000000000ae1a62bc5e7f80a45fd02d20520359972143c1e400000000000000000000000000000000000000000000000000283d179aab4a7100000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -3903,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec3400000000000000000000000005476e4af71ae0ec991986752a30fd57c2425de200000000000000000000000005476e4af71ae0ec991986752a30fd57c2425de200000000000000000000000000000000000000000000000000183da6981b60e200000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -3904,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec34000000000000000000000000932adf2d3cea3c8238580e81ecfa79c0ad6032b3000000000000000000000000932adf2d3cea3c8238580e81ecfa79c0ad6032b3000000000000000000000000000000000000000000000000011c37937e08000000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,0xa6dc233b0dbd379e8ebc639fe8ccb7fcd23e5d5aa4381d63d22bf0d34b949767,2022-05-30 08:04:37.000 UTC,0,true -3905,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec34000000000000000000000000de213eeb9c3c2a1bf8d95d66a6e025ab97d49de3000000000000000000000000de213eeb9c3c2a1bf8d95d66a6e025ab97d49de300000000000000000000000000000000000000000000000000fd5bfefa9eefc400000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -3906,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec34000000000000000000000000165accdd467426d974d652bde5c714e38f1311fa000000000000000000000000165accdd467426d974d652bde5c714e38f1311fa0000000000000000000000000000000000000000000000000051fc6c6f02fc0c00000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -3908,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec340000000000000000000000001af331dc34dd7c5c62af28b5685328318b61888a0000000000000000000000001af331dc34dd7c5c62af28b5685328318b61888a0000000000000000000000000000000000000000000000000120d7ee01d5206900000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -3909,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec340000000000000000000000001bd4b3788f36cfaf2382c7b3727a61adb1dddac70000000000000000000000001bd4b3788f36cfaf2382c7b3727a61adb1dddac70000000000000000000000000000000000000000000000000002c8ec8e7fd28000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -3911,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0xa9f9e675000000000000000000000000a0b86991c6218b36c1d19d4a2e9eb0ce3606eb480000000000000000000000007f5c764cbc14f9669b88837ca1490cca17c316070000000000000000000000008f3d7c5cf34d33df17627091ca16f129e91395f50000000000000000000000008f3d7c5cf34d33df17627091ca16f129e91395f5000000000000000000000000000000000000000000000000000000000121eac000000000000000000000000000000000000000000000000000000000000000c00000000000000000000000000000000000000000000000000000000000000000,,,1,true -3912,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec3400000000000000000000000064b449bcd01d8b5c64187e5f42f913e48c4706fa00000000000000000000000064b449bcd01d8b5c64187e5f42f913e48c4706fa00000000000000000000000000000000000000000000000000038d7ea4c6800000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -3913,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec340000000000000000000000004c59cea94ee8b05bd851af1bf9d243ba585e29620000000000000000000000004c59cea94ee8b05bd851af1bf9d243ba585e29620000000000000000000000000000000000000000000000000011c37937e0800000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -3914,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec34000000000000000000000000f53d5e7a853b23e9fe83271e23213fb895492746000000000000000000000000f53d5e7a853b23e9fe83271e23213fb8954927460000000000000000000000000000000000000000000000000031e43dac33400000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -3916,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec34000000000000000000000000aa0712940ce249c177a00703fa185a9879bccdd8000000000000000000000000aa0712940ce249c177a00703fa185a9879bccdd8000000000000000000000000000000000000000000000000005550edb490ba8700000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -3917,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec34000000000000000000000000712fcde4fbf129bb73582b1e2b82eeea556fdf28000000000000000000000000712fcde4fbf129bb73582b1e2b82eeea556fdf2800000000000000000000000000000000000000000000000000038d7ea4c6800000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -3918,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec34000000000000000000000000a284fbfb32a2f9be4945aac11b09fd092031f056000000000000000000000000a284fbfb32a2f9be4945aac11b09fd092031f056000000000000000000000000000000000000000000000000002af4b67ab8bc8000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -3919,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec34000000000000000000000000afabc4dafdf690d69bb02a55678d2e1b8b3feedf000000000000000000000000afabc4dafdf690d69bb02a55678d2e1b8b3feedf000000000000000000000000000000000000000000000000001bdebda8b7f10000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -3920,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec34000000000000000000000000d6162f7e7cc842566601e8f98de7eff88377a448000000000000000000000000d6162f7e7cc842566601e8f98de7eff88377a4480000000000000000000000000000000000000000000000000052f0e7a9f3ad9400000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -3921,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec3400000000000000000000000046be90355eec9acb93a0063f3ef7243f3cd3bcf400000000000000000000000046be90355eec9acb93a0063f3ef7243f3cd3bcf400000000000000000000000000000000000000000000000000354a6ba7a1800000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -3922,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec340000000000000000000000008e76cd0f7944fc8c8243db331890e57d6fdf854e0000000000000000000000008e76cd0f7944fc8c8243db331890e57d6fdf854e000000000000000000000000000000000000000000000000001a6eb4a7ba996000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -3923,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec34000000000000000000000000880e38366e241344c32d546f21fafb50d612d857000000000000000000000000880e38366e241344c32d546f21fafb50d612d85700000000000000000000000000000000000000000000000000b1a2bc2ec5000000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -3925,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec340000000000000000000000004c59cea94ee8b05bd851af1bf9d243ba585e29620000000000000000000000004c59cea94ee8b05bd851af1bf9d243ba585e296200000000000000000000000000000000000000000000000000038d7ea4c6800000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -3926,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec34000000000000000000000000f5639057d150e6db16a5b2851e7602633ed5e562000000000000000000000000f5639057d150e6db16a5b2851e7602633ed5e562000000000000000000000000000000000000000000000000001d4812f20a950000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -3927,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec340000000000000000000000004c59cea94ee8b05bd851af1bf9d243ba585e29620000000000000000000000004c59cea94ee8b05bd851af1bf9d243ba585e296200000000000000000000000000000000000000000000000000038d7ea4c6800000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -3928,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0xa9f9e675000000000000000000000000a0b86991c6218b36c1d19d4a2e9eb0ce3606eb480000000000000000000000007f5c764cbc14f9669b88837ca1490cca17c316070000000000000000000000009029057074ab04e98de5e016271100357e7f8d5b0000000000000000000000009029057074ab04e98de5e016271100357e7f8d5b000000000000000000000000000000000000000000000000000000000064643c00000000000000000000000000000000000000000000000000000000000000c00000000000000000000000000000000000000000000000000000000000000000,,,1,true -3929,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec340000000000000000000000002dc8c538004708dc54696fb46f94ea701f0eb9290000000000000000000000002dc8c538004708dc54696fb46f94ea701f0eb92900000000000000000000000000000000000000000000000000470de4df82000000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -3930,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0xa9f9e675000000000000000000000000a0b86991c6218b36c1d19d4a2e9eb0ce3606eb480000000000000000000000007f5c764cbc14f9669b88837ca1490cca17c31607000000000000000000000000acb7f456858bc9ff605028bac6f6f2972a5015da000000000000000000000000acb7f456858bc9ff605028bac6f6f2972a5015da000000000000000000000000000000000000000000000000000000000064737400000000000000000000000000000000000000000000000000000000000000c00000000000000000000000000000000000000000000000000000000000000000,,,1,true -3931,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec340000000000000000000000006edc29b9115b6e5601ed88711f0baac0a38a251e0000000000000000000000006edc29b9115b6e5601ed88711f0baac0a38a251e000000000000000000000000000000000000000000000000001c54f5b2f9a16a00000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -3933,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec340000000000000000000000002f68cb6bf5df2d7f0b1a42a814b0939e14f318610000000000000000000000002f68cb6bf5df2d7f0b1a42a814b0939e14f3186100000000000000000000000000000000000000000000000000038d7ea4c6800000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -3934,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec340000000000000000000000009828dd2e0690405617b755ca81e7decac8c9ddfa0000000000000000000000009828dd2e0690405617b755ca81e7decac8c9ddfa000000000000000000000000000000000000000000000000000aa87bee53800000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -3935,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec340000000000000000000000008f55d10ce6dd8315ac022a5f367b776925968b9b0000000000000000000000008f55d10ce6dd8315ac022a5f367b776925968b9b00000000000000000000000000000000000000000000000000038d7ea4c6800000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -3936,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec34000000000000000000000000ccf2677ba63913fbf929aad879236a895e704b4c000000000000000000000000ccf2677ba63913fbf929aad879236a895e704b4c00000000000000000000000000000000000000000000000000064672a2cfb00000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -3937,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec34000000000000000000000000a0d07d3fac606bc1693f79aa706f9e7abd934cd7000000000000000000000000a0d07d3fac606bc1693f79aa706f9e7abd934cd7000000000000000000000000000000000000000000000000000d0643d0bf1e0000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -3938,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec340000000000000000000000009a5c53e3aa62bdc23a9e56ce6e1936435d9cf9430000000000000000000000009a5c53e3aa62bdc23a9e56ce6e1936435d9cf94300000000000000000000000000000000000000000000000000038d7ea4c6800000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -3940,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec34000000000000000000000000fe3baf2e9352fb4d894b005a2923a0711b106dcf000000000000000000000000fe3baf2e9352fb4d894b005a2923a0711b106dcf00000000000000000000000000000000000000000000000000038d7ea4c6800000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -3941,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec340000000000000000000000003fa38d04b6e2bb406842a2950f9ac13b51b2b1620000000000000000000000003fa38d04b6e2bb406842a2950f9ac13b51b2b16200000000000000000000000000000000000000000000000000038d7ea4c6800000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -3942,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec340000000000000000000000008886f10011806825b1bc560ceb6f06dfc49719c30000000000000000000000008886f10011806825b1bc560ceb6f06dfc49719c30000000000000000000000000000000000000000000000000049fd13f05e8e7a00000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -3943,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec3400000000000000000000000083f4337272794930d596119e04d84dd4e1310fcd00000000000000000000000083f4337272794930d596119e04d84dd4e1310fcd00000000000000000000000000000000000000000000000000038d7ea4c6800000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -3944,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec34000000000000000000000000e5bd323d83b66be9c0b841e9774d9098db30f9f7000000000000000000000000e5bd323d83b66be9c0b841e9774d9098db30f9f70000000000000000000000000000000000000000000000000024ab490f11c53700000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -3945,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec34000000000000000000000000eb2c098011513bb2bb8655b3dec65a33e7a09dd5000000000000000000000000eb2c098011513bb2bb8655b3dec65a33e7a09dd500000000000000000000000000000000000000000000000000038d7ea4c6800000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -3946,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec340000000000000000000000008d31e04df08efbcaa4d92dd1e3af2ec7dd217d330000000000000000000000008d31e04df08efbcaa4d92dd1e3af2ec7dd217d330000000000000000000000000000000000000000000000000011c37937e0800000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -3947,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec34000000000000000000000000afabc4dafdf690d69bb02a55678d2e1b8b3feedf000000000000000000000000afabc4dafdf690d69bb02a55678d2e1b8b3feedf000000000000000000000000000000000000000000000000000110d9316ec00000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -3952,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec34000000000000000000000000c6ef1ad881c35290dd663ad91165876488abf96c000000000000000000000000c6ef1ad881c35290dd663ad91165876488abf96c00000000000000000000000000000000000000000000000000140e7ad104673600000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -3953,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec3400000000000000000000000000ac60b8fd10e8fee113676ac25532879b2b5de400000000000000000000000000ac60b8fd10e8fee113676ac25532879b2b5de400000000000000000000000000000000000000000000000000179886821ef82600000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -3954,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec3400000000000000000000000035e70d60d16352a8cbecc3fdac6d1347579a0de200000000000000000000000035e70d60d16352a8cbecc3fdac6d1347579a0de2000000000000000000000000000000000000000000000000001ee3fc16c639e300000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -3955,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec34000000000000000000000000b43310714f0eaf3ef00f59d1cb960b9f0a2864f2000000000000000000000000b43310714f0eaf3ef00f59d1cb960b9f0a2864f2000000000000000000000000000000000000000000000000000e35fa931a000000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -3956,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec34000000000000000000000000f925a8e3707414ecc334719d34663738b1e8b3fe000000000000000000000000f925a8e3707414ecc334719d34663738b1e8b3fe00000000000000000000000000000000000000000000000000038d7ea4c6800000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -3957,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec34000000000000000000000000c0113b17a290b7e6275c1140dc2c76c785a662f1000000000000000000000000c0113b17a290b7e6275c1140dc2c76c785a662f1000000000000000000000000000000000000000000000000001f4dbe12c4260000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -3958,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec34000000000000000000000000e7acb53b483cdd9ddadbe94458665d3dc5050e73000000000000000000000000e7acb53b483cdd9ddadbe94458665d3dc5050e73000000000000000000000000000000000000000000000000022f372fb5da7fb500000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -3959,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec340000000000000000000000000206403bc57fe7d0b68e81d4bfdddc67bb0567b70000000000000000000000000206403bc57fe7d0b68e81d4bfdddc67bb0567b7000000000000000000000000000000000000000000000000000e35fa931a000000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -3960,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec34000000000000000000000000024a26a581ec9018419c0f1f4a096f1862dd70dc000000000000000000000000024a26a581ec9018419c0f1f4a096f1862dd70dc000000000000000000000000000000000000000000000000000aa87bee53800000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -3961,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec34000000000000000000000000e0bdfe8fb79376bd51a824d8a7d1438981a9a8fa000000000000000000000000e0bdfe8fb79376bd51a824d8a7d1438981a9a8fa00000000000000000000000000000000000000000000000000038d7ea4c6800000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -3962,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec34000000000000000000000000c9122d0f8ca7811a7a88a36b614ea619bd21622f000000000000000000000000c9122d0f8ca7811a7a88a36b614ea619bd21622f00000000000000000000000000000000000000000000000000038d7ea4c6800000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -3963,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec34000000000000000000000000af4807d083287f205d897e6d00c6fde1bf0a241a000000000000000000000000af4807d083287f205d897e6d00c6fde1bf0a241a000000000000000000000000000000000000000000000000000aa87bee53800000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -3964,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec34000000000000000000000000f962a4b2692783babab48e4dae6e874dd9f491f1000000000000000000000000f962a4b2692783babab48e4dae6e874dd9f491f100000000000000000000000000000000000000000000000000038d7ea4c6800000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -3965,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec340000000000000000000000009c1f605b0f4433ebe2670df134c561798caf140c0000000000000000000000009c1f605b0f4433ebe2670df134c561798caf140c00000000000000000000000000000000000000000000000001565ab0e181e9c100000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -3966,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec34000000000000000000000000cdc8e4560cf8ab71713eeaa923bb8dd03bb0259a000000000000000000000000cdc8e4560cf8ab71713eeaa923bb8dd03bb0259a000000000000000000000000000000000000000000000000009fa666e34e120700000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -3968,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec3400000000000000000000000059dc6b5e1fd34abc2f472960f3519d12a8afa82d00000000000000000000000059dc6b5e1fd34abc2f472960f3519d12a8afa82d000000000000000000000000000000000000000000000000007d5824fc59636000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -3969,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec34000000000000000000000000de64ea282b06ae636263a28ec305bda1d45d6440000000000000000000000000de64ea282b06ae636263a28ec305bda1d45d644000000000000000000000000000000000000000000000000000038d7ea4c6800000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -3970,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec340000000000000000000000007eb1e94d2aa01d39b7c238ec00e51608ff7ef7c70000000000000000000000007eb1e94d2aa01d39b7c238ec00e51608ff7ef7c70000000000000000000000000000000000000000000000000079b7b86b2a203800000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -3971,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0xa9f9e675000000000000000000000000a0b86991c6218b36c1d19d4a2e9eb0ce3606eb480000000000000000000000007f5c764cbc14f9669b88837ca1490cca17c316070000000000000000000000002212f6a413793df232c3dfd8e38bb9acd95097a80000000000000000000000002212f6a413793df232c3dfd8e38bb9acd95097a8000000000000000000000000000000000000000000000000000000000096786e00000000000000000000000000000000000000000000000000000000000000c00000000000000000000000000000000000000000000000000000000000000000,,,1,true -3972,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec3400000000000000000000000077e88d310614957a5ff962f0a24390da69f906a000000000000000000000000077e88d310614957a5ff962f0a24390da69f906a000000000000000000000000000000000000000000000000000005af3107a400000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -3974,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec34000000000000000000000000045bf2f411439cec318b9593fd4e7c7aac78756e000000000000000000000000045bf2f411439cec318b9593fd4e7c7aac78756e000000000000000000000000000000000000000000000000000e7bccdc1399a800000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -3975,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec340000000000000000000000009539e2ed84961b56c6bb275a3e2999e4bfa0a25d0000000000000000000000009539e2ed84961b56c6bb275a3e2999e4bfa0a25d000000000000000000000000000000000000000000000000000da76e9a6e16fa00000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -3976,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec34000000000000000000000000b760b50c921847aa9a5a47f9903a6600b7995f73000000000000000000000000b760b50c921847aa9a5a47f9903a6600b7995f7300000000000000000000000000000000000000000000000000127398a688d3c000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -3977,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec34000000000000000000000000b30367238ac1da91b0cf31bb4b0b4efb777488e5000000000000000000000000b30367238ac1da91b0cf31bb4b0b4efb777488e500000000000000000000000000000000000000000000000003782dace9d9000000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -3979,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec34000000000000000000000000da906a6ca40f9eb04b83f0194c1bfe7ac50ae19a000000000000000000000000da906a6ca40f9eb04b83f0194c1bfe7ac50ae19a000000000000000000000000000000000000000000000000002bf2abb2fce4d700000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -3980,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec34000000000000000000000000afe1a3fe7c227d7c0246b50289ea82e99d036c1e000000000000000000000000afe1a3fe7c227d7c0246b50289ea82e99d036c1e000000000000000000000000000000000000000000000000001f8a506ab31b3500000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -3981,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec340000000000000000000000004421de8bfb150486936a4e8da325ce64862f5ac80000000000000000000000004421de8bfb150486936a4e8da325ce64862f5ac8000000000000000000000000000000000000000000000000015aa3408c7b1d0000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,0xbbc1a332792675522743ac484a78c2ece1224e33dda1dfac793563bf18ee4041,2022-03-15 09:48:33.000 UTC,0,true -3983,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec3400000000000000000000000015d9ff71b5ab06626a2ca7fd5aab934323b334ac00000000000000000000000015d9ff71b5ab06626a2ca7fd5aab934323b334ac00000000000000000000000000000000000000000000000000038d7ea4c6800000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -3984,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec340000000000000000000000009ffd03ed5bd3d94806730144bcec2fd673b109cd0000000000000000000000009ffd03ed5bd3d94806730144bcec2fd673b109cd0000000000000000000000000000000000000000000000000018020711cb1e6b00000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -3985,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec340000000000000000000000000e69b1f36a3a7044dfcc56e1a21e2ffee6f429d00000000000000000000000000e69b1f36a3a7044dfcc56e1a21e2ffee6f429d0000000000000000000000000000000000000000000000000001011251bc203bd00000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -3987,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec340000000000000000000000002d75713b70205d97de79a754853fe944bfd7b6f10000000000000000000000002d75713b70205d97de79a754853fe944bfd7b6f1000000000000000000000000000000000000000000000000009e3f0dcc50f05700000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -3990,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec34000000000000000000000000f0737564e414efd5c436970014960245f4490bcc000000000000000000000000f0737564e414efd5c436970014960245f4490bcc00000000000000000000000000000000000000000000000000c434b7c0eafdff00000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -3991,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec340000000000000000000000009320563d7619bfc9230f5ac0aec7401c16e3acad0000000000000000000000009320563d7619bfc9230f5ac0aec7401c16e3acad000000000000000000000000000000000000000000000000003072157ef55b0000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,0xf3d12db8997aed8edfa089e7ad9f7501590f4a17b62e4f7c14b779b511cbe196,2022-03-15 09:28:59.000 UTC,0,true -3992,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec340000000000000000000000007a6c1373768e81328372bad188173bf2da5214f90000000000000000000000007a6c1373768e81328372bad188173bf2da5214f900000000000000000000000000000000000000000000000001046d57ddaeae6a00000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,0x678d1b4e615ba482e406bf763cb5de43fe75f7640d5171e682d8de97e8a9ef91,2022-03-15 09:52:14.000 UTC,0,true -3993,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec340000000000000000000000005f7aea0293d5b9b68d119582636315df69513c9a0000000000000000000000005f7aea0293d5b9b68d119582636315df69513c9a0000000000000000000000000000000000000000000000000023bf2ef964c7a800000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -3994,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec34000000000000000000000000b347957d6d017f8783a14abd017065d92cf739e8000000000000000000000000b347957d6d017f8783a14abd017065d92cf739e8000000000000000000000000000000000000000000000000010ae192271ffa3000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,0x59c2dd02e934c297322d2d92d4eb63388d783464e0c7903e1d3fe18d4c7531b1,2022-03-15 10:01:33.000 UTC,0,true -3997,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0xa9f9e675000000000000000000000000a0b86991c6218b36c1d19d4a2e9eb0ce3606eb480000000000000000000000007f5c764cbc14f9669b88837ca1490cca17c31607000000000000000000000000208693c01c3d711fd41b1b1c183ef6b7747cec37000000000000000000000000208693c01c3d711fd41b1b1c183ef6b7747cec370000000000000000000000000000000000000000000000000000000000644c2500000000000000000000000000000000000000000000000000000000000000c00000000000000000000000000000000000000000000000000000000000000000,,,1,true -3999,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec34000000000000000000000000d11494a6d9c10a28edd722eb9f5d4492a321799c000000000000000000000000d11494a6d9c10a28edd722eb9f5d4492a321799c0000000000000000000000000000000000000000000000000011c37937e0800000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -4000,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec340000000000000000000000001d16ce08f15108d9214eece309f90c119749d29a0000000000000000000000001d16ce08f15108d9214eece309f90c119749d29a000000000000000000000000000000000000000000000000027f7d0bdb92000000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -4004,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec3400000000000000000000000094a6ceb8c80b560f28c9048d40b994ea778c453f00000000000000000000000094a6ceb8c80b560f28c9048d40b994ea778c453f0000000000000000000000000000000000000000000000000055e76776d5623e00000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -4005,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec34000000000000000000000000ec6da4426f0ad6982fdd9b26b5816be8dc077f0a000000000000000000000000ec6da4426f0ad6982fdd9b26b5816be8dc077f0a000000000000000000000000000000000000000000000000008e1bc9bf04000000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -4006,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec340000000000000000000000005d688982b60b26d86fcd726c7277b903dc68a4150000000000000000000000005d688982b60b26d86fcd726c7277b903dc68a4150000000000000000000000000000000000000000000000000049afa6dbb9f16400000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -4007,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec34000000000000000000000000fd749d32f727122ead72a9de788165bc51950083000000000000000000000000fd749d32f727122ead72a9de788165bc519500830000000000000000000000000000000000000000000000000065788b7685220000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -4008,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec34000000000000000000000000b161b3e4b117505cd7252c726f5ce431a33ca2b4000000000000000000000000b161b3e4b117505cd7252c726f5ce431a33ca2b4000000000000000000000000000000000000000000000000002edbdee0f1da7400000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -4011,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec34000000000000000000000000e2df5f33f06375d396c121ff312eb6166503121b000000000000000000000000e2df5f33f06375d396c121ff312eb6166503121b000000000000000000000000000000000000000000000000009881ac573d5dec00000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -4012,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec340000000000000000000000006699c7a0592cccb1d60f5abd52dc824b70baa5700000000000000000000000006699c7a0592cccb1d60f5abd52dc824b70baa57000000000000000000000000000000000000000000000000000a181726f4c932600000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -4013,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec34000000000000000000000000a1e5ac5cbbc8ea4e154c571a8412d5f601338a52000000000000000000000000a1e5ac5cbbc8ea4e154c571a8412d5f601338a52000000000000000000000000000000000000000000000000005cbfa95b51238900000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -4014,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec34000000000000000000000000e782bdb152e26d2b3dbe701cd5b427b820e0e7b3000000000000000000000000e782bdb152e26d2b3dbe701cd5b427b820e0e7b3000000000000000000000000000000000000000000000000000b5e3084bd603500000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -4015,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec3400000000000000000000000095cb87a1c385ed84414c499220056227e98762c000000000000000000000000095cb87a1c385ed84414c499220056227e98762c00000000000000000000000000000000000000000000000000022302502da081800000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -4016,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec3400000000000000000000000000d07ba7c276533c9061d99830bef0ea5e0f562300000000000000000000000000d07ba7c276533c9061d99830bef0ea5e0f5623000000000000000000000000000000000000000000000000001fec50ad982b0000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -4019,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0xa9f9e675000000000000000000000000a0b86991c6218b36c1d19d4a2e9eb0ce3606eb480000000000000000000000007f5c764cbc14f9669b88837ca1490cca17c3160700000000000000000000000011333555f7806f8ea21c55ec933e3151fe3e012600000000000000000000000011333555f7806f8ea21c55ec933e3151fe3e012600000000000000000000000000000000000000000000000000000000118de8b600000000000000000000000000000000000000000000000000000000000000c00000000000000000000000000000000000000000000000000000000000000000,,,1,true -4021,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec34000000000000000000000000f19e9b808eca47db283de76eed94fbbf3e9fdf96000000000000000000000000f19e9b808eca47db283de76eed94fbbf3e9fdf96000000000000000000000000000000000000000000000000002714711487800000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -4022,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec340000000000000000000000004e874f4c7e12cccae67e55e08a29588e709b6bc20000000000000000000000004e874f4c7e12cccae67e55e08a29588e709b6bc2000000000000000000000000000000000000000000000000005c5edcbc29000000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -4023,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec3400000000000000000000000006b971d297528f8db06c069c644ae9e6e1d1dae100000000000000000000000006b971d297528f8db06c069c644ae9e6e1d1dae1000000000000000000000000000000000000000000000000002386f26fc1000000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -4024,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec34000000000000000000000000d2c912039ae856874814150f0b51921cb4ff25a9000000000000000000000000d2c912039ae856874814150f0b51921cb4ff25a9000000000000000000000000000000000000000000000000014858f4a079a6d200000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -4027,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec3400000000000000000000000051ad4751da4f13974a9e18c27f845f6f3276f11d00000000000000000000000051ad4751da4f13974a9e18c27f845f6f3276f11d000000000000000000000000000000000000000000000000001cd7552d8de26000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -4029,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec340000000000000000000000004880d1488f8c2aaadb04ff1e742796998b03cc990000000000000000000000004880d1488f8c2aaadb04ff1e742796998b03cc9900000000000000000000000000000000000000000000000000038d7ea4c6800000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -4033,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec34000000000000000000000000b2c6ed80cc5075802ccb59c2466ea61e344fbec5000000000000000000000000b2c6ed80cc5075802ccb59c2466ea61e344fbec5000000000000000000000000000000000000000000000000001fb528a311120200000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -4035,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec34000000000000000000000000b8aacbfab425fd86e8b8ae0b30745468d32d387a000000000000000000000000b8aacbfab425fd86e8b8ae0b30745468d32d387a000000000000000000000000000000000000000000000000001a063d7436d7c000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -4036,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec340000000000000000000000006f3070e25db6da541f2aa5e1331b2e5a05ffd62d0000000000000000000000006f3070e25db6da541f2aa5e1331b2e5a05ffd62d000000000000000000000000000000000000000000000000006a94d74f43000000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -4038,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec34000000000000000000000000c88b861f6bc812449574e8640aa975de087f5a8a000000000000000000000000c88b861f6bc812449574e8640aa975de087f5a8a00000000000000000000000000000000000000000000000000a552b49ca2d8c800000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -4040,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec340000000000000000000000006ea98c8218a5e6758f283e51d1516cc52764858e0000000000000000000000006ea98c8218a5e6758f283e51d1516cc52764858e00000000000000000000000000000000000000000000000000038d7ea4c6800000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -4041,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec340000000000000000000000008c57e3c4af5b1ac13b2895db009cdd7eaccaecf10000000000000000000000008c57e3c4af5b1ac13b2895db009cdd7eaccaecf1000000000000000000000000000000000000000000000000000d33031544fe0000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,0xe8e3726a57dfcc0f69a6ebdcde8f971d3588e051d358e64933c80d3dc41ca825,2022-06-01 07:48:53.000 UTC,0,true -4042,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec3400000000000000000000000012f666cf593b412dc88cb156584198e2f620b8dc00000000000000000000000012f666cf593b412dc88cb156584198e2f620b8dc000000000000000000000000000000000000000000000000007be38dc092442300000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -4043,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec3400000000000000000000000090cb71ca70d3bbd831766fa526242715c2a9656300000000000000000000000090cb71ca70d3bbd831766fa526242715c2a96563000000000000000000000000000000000000000000000000001e05f83cd5ea0000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -4044,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec340000000000000000000000008e5a471e1f75ba6ad49a58bbb8ce4dabbb2c95240000000000000000000000008e5a471e1f75ba6ad49a58bbb8ce4dabbb2c952400000000000000000000000000000000000000000000000000470de4df82000000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -4045,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec340000000000000000000000008e5a471e1f75ba6ad49a58bbb8ce4dabbb2c95240000000000000000000000008e5a471e1f75ba6ad49a58bbb8ce4dabbb2c952400000000000000000000000000000000000000000000000000470de4df82000000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -4048,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec3400000000000000000000000045e5d313030be8e40fceb8f03d55300da6a8799e00000000000000000000000045e5d313030be8e40fceb8f03d55300da6a8799e00000000000000000000000000000000000000000000000001536d68579f343700000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -4050,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec34000000000000000000000000cc8b4cb035812186ca94af3def98aca690be8a16000000000000000000000000cc8b4cb035812186ca94af3def98aca690be8a160000000000000000000000000000000000000000000000000045c54d8dff0b5f00000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -4051,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec3400000000000000000000000050e37f8b9f344eed54e2de92aaaba4d7bdeb8a5800000000000000000000000050e37f8b9f344eed54e2de92aaaba4d7bdeb8a5800000000000000000000000000000000000000000000000000345e6c85e2a44a00000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -4052,0xcd9d4988c0ae61887b075ba77f08cbfad2b65068,0x3f87ff1de58128ef8fcb4c807efd776e1ac72e51,0xf4f7b41a000000000000000000000000ec86b0cfef9a8533197c19663de0b1767fbefe07000000000000000000000000000000000000000000000005218aaa91b104e986,,,1,true -4053,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec340000000000000000000000007438b42d2dc59d089e2527d706563dc9b40b913a0000000000000000000000007438b42d2dc59d089e2527d706563dc9b40b913a00000000000000000000000000000000000000000000000000d162dcc8b2910000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -4054,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec34000000000000000000000000cbbd72bd4e0a8598e2ea0a9ebf9431a3737050f8000000000000000000000000cbbd72bd4e0a8598e2ea0a9ebf9431a3737050f800000000000000000000000000000000000000000000000000d142241e97120000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -4055,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec34000000000000000000000000da8639ebade510607414fe396e98171280ee86f1000000000000000000000000da8639ebade510607414fe396e98171280ee86f10000000000000000000000000000000000000000000000000091a94863ca800000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,0x95e4a4c00711e65034f0cad47c5aab4af5257e2854f9ac003b21d6ee1be02883,2022-02-26 09:54:24.000 UTC,0,true -4056,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec34000000000000000000000000012345e6fa44eed2df2443c739e65165861e0842000000000000000000000000012345e6fa44eed2df2443c739e65165861e084200000000000000000000000000000000000000000000000001108d56ccb8064b00000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -4057,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec34000000000000000000000000ca640134967f982dee6754c76b8c386340c8782f000000000000000000000000ca640134967f982dee6754c76b8c386340c8782f000000000000000000000000000000000000000000000000000000e8d4a5100000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -4058,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec34000000000000000000000000f9ebccface465d13ec8ce1fa8faa482030661abb000000000000000000000000f9ebccface465d13ec8ce1fa8faa482030661abb000000000000000000000000000000000000000000000000001e3361c485458f00000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -4059,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec34000000000000000000000000f4de6e19b30f3efeef30328ea1e46e29db7a56fb000000000000000000000000f4de6e19b30f3efeef30328ea1e46e29db7a56fb000000000000000000000000000000000000000000000000000000e8d4a5100000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -4060,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec34000000000000000000000000fff8524d56408a9d26c22475530a595714448191000000000000000000000000fff8524d56408a9d26c22475530a595714448191000000000000000000000000000000000000000000000000000000e8d4a5100000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -4061,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec340000000000000000000000001b2ade7b54e4ad80b6899bddd7cbc4547cc6263b0000000000000000000000001b2ade7b54e4ad80b6899bddd7cbc4547cc6263b00000000000000000000000000000000000000000000000000a78db0835c249000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -4062,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec340000000000000000000000002a611b1251096d59846765297e8af43e74be3c160000000000000000000000002a611b1251096d59846765297e8af43e74be3c16000000000000000000000000000000000000000000000000016345785d8a000000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -4063,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec34000000000000000000000000e8a2e41ee85551d0afab35373290ed670ab2e191000000000000000000000000e8a2e41ee85551d0afab35373290ed670ab2e191000000000000000000000000000000000000000000000000000000e8d4a5100000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -4064,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec34000000000000000000000000f7a15b1514cce1ac722f2b99428cbaa0f453d56a000000000000000000000000f7a15b1514cce1ac722f2b99428cbaa0f453d56a000000000000000000000000000000000000000000000000000000e8d4a5100000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -4065,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec34000000000000000000000000e139506d198c1d5e6dec533ce9ba9987466488cc000000000000000000000000e139506d198c1d5e6dec533ce9ba9987466488cc000000000000000000000000000000000000000000000000000000e8d4a5100000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -4066,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec34000000000000000000000000616cc348b0e5cccc5cd9e8900c151c2f6baf3612000000000000000000000000616cc348b0e5cccc5cd9e8900c151c2f6baf361200000000000000000000000000000000000000000000000000354a6ba7a1800000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -4067,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec34000000000000000000000000acb80c6446f57ebab29983638040859b89590fc2000000000000000000000000acb80c6446f57ebab29983638040859b89590fc2000000000000000000000000000000000000000000000000000000e8d4a5100000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -4068,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec3400000000000000000000000023d5a1d24fef3fe084717babe3c24ce82b4844a400000000000000000000000023d5a1d24fef3fe084717babe3c24ce82b4844a4000000000000000000000000000000000000000000000000000000e8d4a5100000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -4069,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec3400000000000000000000000046dcfb1655036313dac622de7d05337e235a9cf300000000000000000000000046dcfb1655036313dac622de7d05337e235a9cf3000000000000000000000000000000000000000000000000000000e8d4a5100000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -4070,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec34000000000000000000000000797f0cb60dcfa9a6a6d9cc8f576d763c9407f5c5000000000000000000000000797f0cb60dcfa9a6a6d9cc8f576d763c9407f5c5000000000000000000000000000000000000000000000000000000e8d4a5100000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -4071,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec3400000000000000000000000040b2de9d83eb776d414950a4bdee6a9dd981444c00000000000000000000000040b2de9d83eb776d414950a4bdee6a9dd981444c00000000000000000000000000000000000000000000000000038d7ea4c6800000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -4072,0x10e6593cdda8c58a1d0f14c5164b376352a55f2f,0x467194771dae2967aef3ecbedd3bf9a310c76c65,0xa9f9e6750000000000000000000000006b175474e89094c44da98b954eedeac495271d0f000000000000000000000000da10009cbd5d07dd0cecc66161fc93d7c9000da1000000000000000000000000616cc348b0e5cccc5cd9e8900c151c2f6baf3612000000000000000000000000616cc348b0e5cccc5cd9e8900c151c2f6baf361200000000000000000000000000000000000000000000000010a741a46278000000000000000000000000000000000000000000000000000000000000000000c00000000000000000000000000000000000000000000000000000000000000000,,,1,true -4073,0xcd9d4988c0ae61887b075ba77f08cbfad2b65068,0x3f87ff1de58128ef8fcb4c807efd776e1ac72e51,0xf4f7b41a000000000000000000000000a8bb2e8898192852a08e52f504aee6e1378d41510000000000000000000000000000000000000000000000007815743d2f0dbb9c,,,1,true -4074,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec340000000000000000000000001bdb54f09b7dbb7a9ac737e91b399e8f5f5eaced0000000000000000000000001bdb54f09b7dbb7a9ac737e91b399e8f5f5eaced000000000000000000000000000000000000000000000000009d06b588ad83a700000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -4075,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec34000000000000000000000000be28ff6bf1adf9aa3084873e0aa20838b1910c40000000000000000000000000be28ff6bf1adf9aa3084873e0aa20838b1910c40000000000000000000000000000000000000000000000000000000e8d4a5100000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -4076,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec3400000000000000000000000088c0d341a415448a117b7b4723f729a5b9d734a000000000000000000000000088c0d341a415448a117b7b4723f729a5b9d734a0000000000000000000000000000000000000000000000000000000e8d4a5100000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -4078,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec34000000000000000000000000b0d9cf48ffee0a6bdc49954b5e77058cdafb9532000000000000000000000000b0d9cf48ffee0a6bdc49954b5e77058cdafb9532000000000000000000000000000000000000000000000000000000e8d4a5100000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -4079,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec340000000000000000000000006f295da57176a11218f24dd4d95014a89345444f0000000000000000000000006f295da57176a11218f24dd4d95014a89345444f000000000000000000000000000000000000000000000000009efcf7a1c4715e00000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -4080,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec340000000000000000000000004a1a5d51e81a588f3f65a449fc6c39aa22d39b5b0000000000000000000000004a1a5d51e81a588f3f65a449fc6c39aa22d39b5b000000000000000000000000000000000000000000000000015758987517449400000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -4081,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec34000000000000000000000000990e66466826bc07c5c148c5085e654a2d7a8c23000000000000000000000000990e66466826bc07c5c148c5085e654a2d7a8c2300000000000000000000000000000000000000000000000000386d0130e16ece00000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -4082,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec34000000000000000000000000b686dcf9d959ebc90131f1b9e5aed58b60c83a14000000000000000000000000b686dcf9d959ebc90131f1b9e5aed58b60c83a1400000000000000000000000000000000000000000000000000a5b5d9d828cb5d00000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -4083,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec34000000000000000000000000945728797887fdebc2d2df277b5b506a43d6435d000000000000000000000000945728797887fdebc2d2df277b5b506a43d6435d000000000000000000000000000000000000000000000000002386f26fc1000000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -4084,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec34000000000000000000000000b95b839bdd5851a8e1655f916743b8229fe40131000000000000000000000000b95b839bdd5851a8e1655f916743b8229fe4013100000000000000000000000000000000000000000000000000038d7ea4c6800000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -4085,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec340000000000000000000000006b8abbada1f108e86d04f412b9320d8cfea648170000000000000000000000006b8abbada1f108e86d04f412b9320d8cfea64817000000000000000000000000000000000000000000000000004c6222d6abc00000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -4086,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec34000000000000000000000000531c64cc8796d85e79f96a4507652f67a75bbc02000000000000000000000000531c64cc8796d85e79f96a4507652f67a75bbc02000000000000000000000000000000000000000000000000004c2e05f02afd7e00000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -4087,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec340000000000000000000000005a49571f870108da21bd55b6b9c092a318f316370000000000000000000000005a49571f870108da21bd55b6b9c092a318f316370000000000000000000000000000000000000000000000000020c7e562ae758b00000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -4088,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec34000000000000000000000000f7b338817049f5126c820b6097ff177ea8aa839c000000000000000000000000f7b338817049f5126c820b6097ff177ea8aa839c000000000000000000000000000000000000000000000000031234e30d6ce3bf00000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -4090,0x10e6593cdda8c58a1d0f14c5164b376352a55f2f,0x467194771dae2967aef3ecbedd3bf9a310c76c65,0xa9f9e6750000000000000000000000006b175474e89094c44da98b954eedeac495271d0f000000000000000000000000da10009cbd5d07dd0cecc66161fc93d7c9000da1000000000000000000000000e83906d6c19939dcc3ffcc317556d940c87847ec000000000000000000000000e83906d6c19939dcc3ffcc317556d940c87847ec0000000000000000000000000000000000000000000000008ac7230489e8000000000000000000000000000000000000000000000000000000000000000000c00000000000000000000000000000000000000000000000000000000000000000,,,1,true -4092,0x10e6593cdda8c58a1d0f14c5164b376352a55f2f,0x467194771dae2967aef3ecbedd3bf9a310c76c65,0xa9f9e6750000000000000000000000006b175474e89094c44da98b954eedeac495271d0f000000000000000000000000da10009cbd5d07dd0cecc66161fc93d7c9000da10000000000000000000000006b4c4b4e038f7348812f649136c189ffb75b4cd20000000000000000000000006b4c4b4e038f7348812f649136c189ffb75b4cd2000000000000000000000000000000000000000000000001ef5b6f00001e8bff00000000000000000000000000000000000000000000000000000000000000c00000000000000000000000000000000000000000000000000000000000000000,,,1,true -4093,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec34000000000000000000000000de7f0e2128a1c95b63f6bf48825788a7090bfdb6000000000000000000000000de7f0e2128a1c95b63f6bf48825788a7090bfdb6000000000000000000000000000000000000000000000000006b243f479cca0200000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -4094,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec34000000000000000000000000000f9987b3352802ad6934402da1a215b1ecef13000000000000000000000000000f9987b3352802ad6934402da1a215b1ecef130000000000000000000000000000000000000000000000000043154b0d733b0000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -4095,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec3400000000000000000000000044b5f2e81bba7b496d91dfbba1487811ed8821eb00000000000000000000000044b5f2e81bba7b496d91dfbba1487811ed8821eb0000000000000000000000000000000000000000000000000024bcb0d03d222000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -4096,0x10e6593cdda8c58a1d0f14c5164b376352a55f2f,0x467194771dae2967aef3ecbedd3bf9a310c76c65,0xa9f9e6750000000000000000000000006b175474e89094c44da98b954eedeac495271d0f000000000000000000000000da10009cbd5d07dd0cecc66161fc93d7c9000da1000000000000000000000000a6f55078b4651ca9330d8c7b4e5503e70b0b1520000000000000000000000000a6f55078b4651ca9330d8c7b4e5503e70b0b15200000000000000000000000000000000000000000000000008ac7230489e8000000000000000000000000000000000000000000000000000000000000000000c00000000000000000000000000000000000000000000000000000000000000000,,,1,true -4097,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0xa9f9e675000000000000000000000000a0b86991c6218b36c1d19d4a2e9eb0ce3606eb480000000000000000000000007f5c764cbc14f9669b88837ca1490cca17c316070000000000000000000000009f914156f4ef42ae375e77270dc452e9b364db4b0000000000000000000000009f914156f4ef42ae375e77270dc452e9b364db4b000000000000000000000000000000000000000000000000000000000064700800000000000000000000000000000000000000000000000000000000000000c00000000000000000000000000000000000000000000000000000000000000000,,,1,true -4098,0xcd9d4988c0ae61887b075ba77f08cbfad2b65068,0x3f87ff1de58128ef8fcb4c807efd776e1ac72e51,0xf4f7b41a000000000000000000000000e83906d6c19939dcc3ffcc317556d940c87847ec0000000000000000000000000000000000000000000000000d0820cad21264aa,,,1,true -4099,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec3400000000000000000000000077d25848b2396250df5860ae566f7c341d81efac00000000000000000000000077d25848b2396250df5860ae566f7c341d81efac000000000000000000000000000000000000000000000000009f038e93808b6600000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,0x4082c93ffd4d54d96b3a421eaab46b4dab06e9b445856d527fb2d5d77e24520b,2022-02-26 09:42:37.000 UTC,0,true -4100,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec34000000000000000000000000e9bfcdbf0bab01807bb3908f4abef78013d52042000000000000000000000000e9bfcdbf0bab01807bb3908f4abef78013d5204200000000000000000000000000000000000000000000000001565638bba4cf1d00000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -4101,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0xa9f9e6750000000000000000000000001f9840a85d5af5bf1d1762f925bdaddc4201f9840000000000000000000000006fd9d7ad17242c41f7131d257212c54a0e816691000000000000000000000000dc5c7e9b97149e5d5b9c22f73c5eee23d80c9d4f000000000000000000000000dc5c7e9b97149e5d5b9c22f73c5eee23d80c9d4f00000000000000000000000000000000000000000000000000d529ae9e86000000000000000000000000000000000000000000000000000000000000000000c00000000000000000000000000000000000000000000000000000000000000000,,,1,true -4102,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec340000000000000000000000008ca3e96fa7fb225776b3bb8140483b7eb4c9233f0000000000000000000000008ca3e96fa7fb225776b3bb8140483b7eb4c9233f000000000000000000000000000000000000000000000000001e612458737c0000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -4104,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec34000000000000000000000000c3a0a3dd9d954ede6ba93bfcd0c9e70b92e0b266000000000000000000000000c3a0a3dd9d954ede6ba93bfcd0c9e70b92e0b266000000000000000000000000000000000000000000000000001db18086bb073700000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -4105,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0xa9f9e6750000000000000000000000001f9840a85d5af5bf1d1762f925bdaddc4201f9840000000000000000000000006fd9d7ad17242c41f7131d257212c54a0e816691000000000000000000000000c7d2c67bc38b0e8b15b632c19ef629022fd56543000000000000000000000000c7d2c67bc38b0e8b15b632c19ef629022fd5654300000000000000000000000000000000000000000000000098a7d9b8314c000000000000000000000000000000000000000000000000000000000000000000c00000000000000000000000000000000000000000000000000000000000000000,0xcb8da5b58d3e2723fcb47978eff796c109ec2b176491d6bf43569b05bc20fa73,2022-02-05 10:33:06.000 UTC,0,true -4107,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec34000000000000000000000000865437fd0e361e6482876a5b46a0128f36962706000000000000000000000000865437fd0e361e6482876a5b46a0128f3696270600000000000000000000000000000000000000000000000000128da487ff6f3d00000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -4109,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec3400000000000000000000000059fafea537e14c7fdfa88eefc5e364c1a51dd64100000000000000000000000059fafea537e14c7fdfa88eefc5e364c1a51dd6410000000000000000000000000000000000000000000000000011c37937e0800000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -4110,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec34000000000000000000000000ce364bae6274f1b14bfadef0f88e82be96e47814000000000000000000000000ce364bae6274f1b14bfadef0f88e82be96e47814000000000000000000000000000000000000000000000000015dc1f9cec42f0000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -4111,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec3400000000000000000000000069f1e4b906e30755c8a0d77399dc81c4346de96f00000000000000000000000069f1e4b906e30755c8a0d77399dc81c4346de96f0000000000000000000000000000000000000000000000000010a9684080034e00000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -4113,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec34000000000000000000000000cb351047ea888746a827fb0d5645430e2016f39b000000000000000000000000cb351047ea888746a827fb0d5645430e2016f39b0000000000000000000000000000000000000000000000000152b5fc046b12fd00000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -4115,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec340000000000000000000000006cced1fb5a36d7d8eeab74b893913ebfb2b4c5840000000000000000000000006cced1fb5a36d7d8eeab74b893913ebfb2b4c584000000000000000000000000000000000000000000000000005f5ec4877c873100000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -4116,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec34000000000000000000000000090f923e1484912285d07f7e643599b8ebf945ce000000000000000000000000090f923e1484912285d07f7e643599b8ebf945ce0000000000000000000000000000000000000000000000000033dd5a937d450100000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -4117,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec340000000000000000000000002ff3637c180274682b9d292389dbff866aa0a1f10000000000000000000000002ff3637c180274682b9d292389dbff866aa0a1f1000000000000000000000000000000000000000000000000002386f26fc1000000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -4118,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0xa9f9e675000000000000000000000000dac17f958d2ee523a2206206994597c13d831ec700000000000000000000000094b008aa00579c1307b0ef2c499ad98a8ce58e580000000000000000000000002422d5d8ee568903f42f2a8a887565970569c1cc0000000000000000000000002422d5d8ee568903f42f2a8a887565970569c1cc00000000000000000000000000000000000000000000000000000000ae7cdf8200000000000000000000000000000000000000000000000000000000000000c00000000000000000000000000000000000000000000000000000000000000000,,,1,true -4119,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec3400000000000000000000000004cdc20567a5783ac84c1a18655a312b4be2625c00000000000000000000000004cdc20567a5783ac84c1a18655a312b4be2625c00000000000000000000000000000000000000000000000002c68af0bb14000000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -4120,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec34000000000000000000000000235f5de73d5194e3f0f409639eb5e00662059da0000000000000000000000000235f5de73d5194e3f0f409639eb5e00662059da0000000000000000000000000000000000000000000000000015035c07b3a1bc000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -4121,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec340000000000000000000000002331e097c09c9d8cbc7c75ad35d71368aebfb5ff0000000000000000000000002331e097c09c9d8cbc7c75ad35d71368aebfb5ff000000000000000000000000000000000000000000000000003786d53fba932c00000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -4122,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec3400000000000000000000000099a2114c99a6e927c9206f30f66e065f5060754500000000000000000000000099a2114c99a6e927c9206f30f66e065f506075450000000000000000000000000000000000000000000000000011c37937e0800000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -4123,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec340000000000000000000000002c04a91219d7d3c3a59c4b0aedff0ff12953e8dd0000000000000000000000002c04a91219d7d3c3a59c4b0aedff0ff12953e8dd00000000000000000000000000000000000000000000000000878a2202891d0000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -4125,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec340000000000000000000000006540d7f11983c01a2e656b944cb0172db311963d0000000000000000000000006540d7f11983c01a2e656b944cb0172db311963d000000000000000000000000000000000000000000000000008cfeb44c7ae68100000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -4126,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec340000000000000000000000000557007505b53a399a59a93509673fdc5a3dc4540000000000000000000000000557007505b53a399a59a93509673fdc5a3dc45400000000000000000000000000000000000000000000000000038d7ea4c6800000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -4127,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec340000000000000000000000008f5411d1da0774fe0f888da5d144faced85a9dc60000000000000000000000008f5411d1da0774fe0f888da5d144faced85a9dc6000000000000000000000000000000000000000000000000005ffaa7d970248000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -4128,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0xa9f9e675000000000000000000000000dac17f958d2ee523a2206206994597c13d831ec700000000000000000000000094b008aa00579c1307b0ef2c499ad98a8ce58e580000000000000000000000005d55ee935d1aad8cace20528c63b26bc6417b6ce0000000000000000000000005d55ee935d1aad8cace20528c63b26bc6417b6ce000000000000000000000000000000000000000000000000000000000605234000000000000000000000000000000000000000000000000000000000000000c00000000000000000000000000000000000000000000000000000000000000000,,,1,true -4129,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec340000000000000000000000002b02a522eccc2494f5c2efbc56dba4eace5ba7ff0000000000000000000000002b02a522eccc2494f5c2efbc56dba4eace5ba7ff00000000000000000000000000000000000000000000000000038d7ea4c6800000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -4130,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec34000000000000000000000000c5de1beff4c2b8f959c4b1859bc490c4216d3d29000000000000000000000000c5de1beff4c2b8f959c4b1859bc490c4216d3d290000000000000000000000000000000000000000000000000011c37937e0800000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -4131,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec340000000000000000000000005466488073d3dc5a70c885fa41918e654f5027ab0000000000000000000000005466488073d3dc5a70c885fa41918e654f5027ab0000000000000000000000000000000000000000000000000010d13fde21ddfc00000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -4132,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec34000000000000000000000000787f640ca8b506e9ed61be2085e95fff78bf5bd3000000000000000000000000787f640ca8b506e9ed61be2085e95fff78bf5bd3000000000000000000000000000000000000000000000000001c6bf52634000000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -4133,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec340000000000000000000000005830db927c7edfff6a095f65f13ab5009011cbc80000000000000000000000005830db927c7edfff6a095f65f13ab5009011cbc8000000000000000000000000000000000000000000000000014236b9afe4b1e900000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -4134,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec34000000000000000000000000e0a755e8414806e06090e1f7859ab1379c7ff494000000000000000000000000e0a755e8414806e06090e1f7859ab1379c7ff4940000000000000000000000000000000000000000000000000001c6bf5263400000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -4135,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec34000000000000000000000000e5690d11ac1b6133dbb482973de8c712a43c8a75000000000000000000000000e5690d11ac1b6133dbb482973de8c712a43c8a75000000000000000000000000000000000000000000000000000009184e72a00000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -4136,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec340000000000000000000000002481e59a934369ce3c86f019b2bd845dd478158e0000000000000000000000002481e59a934369ce3c86f019b2bd845dd478158e00000000000000000000000000000000000000000000000000016bcc41e9000000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -4137,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0xa9f9e675000000000000000000000000a0b86991c6218b36c1d19d4a2e9eb0ce3606eb480000000000000000000000007f5c764cbc14f9669b88837ca1490cca17c31607000000000000000000000000e8a29e984681002725d547ee8103695283d2e629000000000000000000000000e8a29e984681002725d547ee8103695283d2e62900000000000000000000000000000000000000000000000000000000000003e800000000000000000000000000000000000000000000000000000000000000c00000000000000000000000000000000000000000000000000000000000000000,,,1,true -4138,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec3400000000000000000000000018e4a65a844a501826e4e9bf24590ba38b33389300000000000000000000000018e4a65a844a501826e4e9bf24590ba38b333893000000000000000000000000000000000000000000000000000009184e72a00000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -4139,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec340000000000000000000000004165114102bfeb40285253581f6b703dbd20a9070000000000000000000000004165114102bfeb40285253581f6b703dbd20a907000000000000000000000000000000000000000000000000000009184e72a00000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -4140,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec3400000000000000000000000031b33586364621b39da91fa84f18538efa5ad6b700000000000000000000000031b33586364621b39da91fa84f18538efa5ad6b700000000000000000000000000000000000000000000000000405212104eaa2800000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -4141,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec3400000000000000000000000026fe31cd7807297f98f23fbc4d9c7b8deb0c963000000000000000000000000026fe31cd7807297f98f23fbc4d9c7b8deb0c9630000000000000000000000000000000000000000000000000000009184e72a00000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -4142,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec34000000000000000000000000b23a7c2525df85f8be881da6bfa7ee0bb902def8000000000000000000000000b23a7c2525df85f8be881da6bfa7ee0bb902def8000000000000000000000000000000000000000000000000001ae9e67883e78a00000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,0x418597cd761779cf93b2719475c0c62d71fde7992bf2c652d0f21ee619006f70,2022-11-01 17:26:11.000 UTC,0,true -4143,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec34000000000000000000000000923c28cc5a05df0664a7ce74915777e5fc500d95000000000000000000000000923c28cc5a05df0664a7ce74915777e5fc500d95000000000000000000000000000000000000000000000000000009184e72a00000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -4144,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec3400000000000000000000000036887cca4fdd9cfffba357de259a7619afd4d28900000000000000000000000036887cca4fdd9cfffba357de259a7619afd4d28900000000000000000000000000000000000000000000000000059b03a6d8ecf700000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -4145,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec34000000000000000000000000f5710774fe287539e825769f5d0c28dd0a4f6b8b000000000000000000000000f5710774fe287539e825769f5d0c28dd0a4f6b8b000000000000000000000000000000000000000000000000000009184e72a00000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -4146,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec340000000000000000000000005af10de36b591901e40677492e209c70fcb48edd0000000000000000000000005af10de36b591901e40677492e209c70fcb48edd000000000000000000000000000000000000000000000000000dae8c3fd439aa00000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -4147,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec3400000000000000000000000068e30fdded49610eb349f7c18535a86244a8260100000000000000000000000068e30fdded49610eb349f7c18535a86244a826010000000000000000000000000000000000000000000000000001c6bf5263400000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -4148,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec3400000000000000000000000036a78936c69de7f41773b99652c3f6977c0d7a8300000000000000000000000036a78936c69de7f41773b99652c3f6977c0d7a8300000000000000000000000000000000000000000000000001657e44c152a90000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -4149,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec34000000000000000000000000a94025b216890204fd6c882f9399bd23a6591693000000000000000000000000a94025b216890204fd6c882f9399bd23a6591693000000000000000000000000000000000000000000000000008a8b0ebcbfc4e900000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,0x5fb0b09bf2dc9b295e1a370c48f9fb07555b7d406b698ccb28a557b03075e96c,2022-11-01 17:38:35.000 UTC,0,true -4150,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec34000000000000000000000000876e96699bb6aad17e05c7adeff46eb969031795000000000000000000000000876e96699bb6aad17e05c7adeff46eb96903179500000000000000000000000000000000000000000000000000038d7ea4c6800000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -4151,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec34000000000000000000000000c00bf8daad8273c4cc8463f7333b27e952164268000000000000000000000000c00bf8daad8273c4cc8463f7333b27e952164268000000000000000000000000000000000000000000000000000009184e72a00000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -4152,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec340000000000000000000000007e53d27c6925a8e9dc103d0749adf9d5b63a847f0000000000000000000000007e53d27c6925a8e9dc103d0749adf9d5b63a847f000000000000000000000000000000000000000000000000001550f7dca7000000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -4153,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec34000000000000000000000000e98281408c920fe8b5182df4bb3feb7324130ed7000000000000000000000000e98281408c920fe8b5182df4bb3feb7324130ed7000000000000000000000000000000000000000000000000000009184e72a00000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -4154,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec34000000000000000000000000857e0e6d38a24c795624415782ed3e937c333c33000000000000000000000000857e0e6d38a24c795624415782ed3e937c333c33000000000000000000000000000000000000000000000000000009184e72a00000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -4155,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec3400000000000000000000000098a764931a82c8c71b278d5fc2ecae00440cf23200000000000000000000000098a764931a82c8c71b278d5fc2ecae00440cf232000000000000000000000000000000000000000000000000000009184e72a00000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -4156,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec3400000000000000000000000063e640294cb0f46859d08ebabcd67fc755c4e14700000000000000000000000063e640294cb0f46859d08ebabcd67fc755c4e147000000000000000000000000000000000000000000000000001aa535d3d0c00000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -4157,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec34000000000000000000000000a955d5eeb52232d017bc1793db2db2bb5503a0ef000000000000000000000000a955d5eeb52232d017bc1793db2db2bb5503a0ef000000000000000000000000000000000000000000000000000009184e72a00000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -4158,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec3400000000000000000000000023a719a16b5db2ccfdc4650273ee7e9c42af45bf00000000000000000000000023a719a16b5db2ccfdc4650273ee7e9c42af45bf00000000000000000000000000000000000000000000000000016bcc41e9000000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -4159,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec340000000000000000000000008af8154724d919c3dedb05d7dfd6f011f50f48090000000000000000000000008af8154724d919c3dedb05d7dfd6f011f50f4809000000000000000000000000000000000000000000000000000110d9316ec00000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -4160,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec34000000000000000000000000c0ce266aa75ac876f300c13d6f2393c843cd5b3b000000000000000000000000c0ce266aa75ac876f300c13d6f2393c843cd5b3b000000000000000000000000000000000000000000000000000009184e72a00000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -4161,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec34000000000000000000000000aaa920264671d7fc5ac823e96995edc6bcc5edf3000000000000000000000000aaa920264671d7fc5ac823e96995edc6bcc5edf3000000000000000000000000000000000000000000000000002386f26fc1000000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -4162,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec340000000000000000000000002dd55c9d6d939da000a630f31a43ddbee2f410cd0000000000000000000000002dd55c9d6d939da000a630f31a43ddbee2f410cd00000000000000000000000000000000000000000000000000016bcc41e9000000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -4163,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec3400000000000000000000000027c041cf26b1b6a092737ae37dca8b121a54867300000000000000000000000027c041cf26b1b6a092737ae37dca8b121a548673000000000000000000000000000000000000000000000000013c0644145d183d00000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -4164,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec34000000000000000000000000d2dfdcfcb6309546d27423d421874f3827847ebe000000000000000000000000d2dfdcfcb6309546d27423d421874f3827847ebe000000000000000000000000000000000000000000000000003cc1dadfb742c000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -4165,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec34000000000000000000000000f7e442ae668656d6dfa51b2e795e701d04442977000000000000000000000000f7e442ae668656d6dfa51b2e795e701d0444297700000000000000000000000000000000000000000000000000013e52b9abe00000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -4166,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec34000000000000000000000000d300517e3b0f205cb538c4bcb084ed0941650a43000000000000000000000000d300517e3b0f205cb538c4bcb084ed0941650a4300000000000000000000000000000000000000000000000000590b92e3c9f77200000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -4167,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec340000000000000000000000007709b63f77b79bec56033370f5a30fa19823b68d0000000000000000000000007709b63f77b79bec56033370f5a30fa19823b68d000000000000000000000000000000000000000000000000000b222ba17bcb0000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -4168,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec34000000000000000000000000faff89949b506dcb0d945779da968d4f996bb68a000000000000000000000000faff89949b506dcb0d945779da968d4f996bb68a000000000000000000000000000000000000000000000000063941678490f39800000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -4169,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec34000000000000000000000000ae7b12ea3fd7dfb0e89c48d5bda7c404cdf91ad5000000000000000000000000ae7b12ea3fd7dfb0e89c48d5bda7c404cdf91ad5000000000000000000000000000000000000000000000000000aa87bee53800000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -4170,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec340000000000000000000000001f1501185fc7ec323d5163fed7ea6d79556b61590000000000000000000000001f1501185fc7ec323d5163fed7ea6d79556b615900000000000000000000000000000000000000000000000000c821f6fa3c533800000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -4173,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec3400000000000000000000000006d7dcf2dc399d4d84fcbf312c20aee71e327b4400000000000000000000000006d7dcf2dc399d4d84fcbf312c20aee71e327b44000000000000000000000000000000000000000000000000005d356d2addf58d00000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -4174,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec340000000000000000000000006cacd0aeade45ead6badae6bd7830cc65889fca90000000000000000000000006cacd0aeade45ead6badae6bd7830cc65889fca900000000000000000000000000000000000000000000000000cb381eb01b0bc000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -4175,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec34000000000000000000000000d70a0b9e5f1717d2bb09a4aacea03fe4630133e9000000000000000000000000d70a0b9e5f1717d2bb09a4aacea03fe4630133e900000000000000000000000000000000000000000000000000097c9c9a20da4f00000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -4176,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec34000000000000000000000000c596df4b9eb215bb3057f7241f7997d04332cd12000000000000000000000000c596df4b9eb215bb3057f7241f7997d04332cd12000000000000000000000000000000000000000000000000002386f26fc1000000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -4178,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec3400000000000000000000000026b400eb576a693c77fa2753b540db4218c0412a00000000000000000000000026b400eb576a693c77fa2753b540db4218c0412a00000000000000000000000000000000000000000000000000200fb9e97f531500000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -4179,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec34000000000000000000000000c596df4b9eb215bb3057f7241f7997d04332cd12000000000000000000000000c596df4b9eb215bb3057f7241f7997d04332cd12000000000000000000000000000000000000000000000000002386f26fc1000000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -4180,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec34000000000000000000000000c596df4b9eb215bb3057f7241f7997d04332cd12000000000000000000000000c596df4b9eb215bb3057f7241f7997d04332cd12000000000000000000000000000000000000000000000000002386f26fc1000000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -4181,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec34000000000000000000000000f196de1269c81c5c3f8fe0e8836b6f1a54eeac9a000000000000000000000000f196de1269c81c5c3f8fe0e8836b6f1a54eeac9a000000000000000000000000000000000000000000000000012aa896ccf5ebe300000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -4182,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0xa9f9e6750000000000000000000000001f9840a85d5af5bf1d1762f925bdaddc4201f9840000000000000000000000006fd9d7ad17242c41f7131d257212c54a0e816691000000000000000000000000d884587e95aa4cf73eca390abeab64881826df5d000000000000000000000000d884587e95aa4cf73eca390abeab64881826df5d0000000000000000000000000000000000000000000000000a271178207ab74c00000000000000000000000000000000000000000000000000000000000000c00000000000000000000000000000000000000000000000000000000000000000,,,1,true -4183,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec34000000000000000000000000dc6657a6e3ee8ec7004dadd99a7a030b975556f8000000000000000000000000dc6657a6e3ee8ec7004dadd99a7a030b975556f80000000000000000000000000000000000000000000000000003fcb22a77bb4000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -4184,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec34000000000000000000000000c1cebd3e2e2317b420bbf1808eabda450b20225c000000000000000000000000c1cebd3e2e2317b420bbf1808eabda450b20225c0000000000000000000000000000000000000000000000000020666e25abb17b00000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -4186,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0xa9f9e6750000000000000000000000001f9840a85d5af5bf1d1762f925bdaddc4201f9840000000000000000000000006fd9d7ad17242c41f7131d257212c54a0e81669100000000000000000000000088b1950ea550d2425d47ade6c74b427343ce181000000000000000000000000088b1950ea550d2425d47ade6c74b427343ce1810000000000000000000000000000000000000000000000000009d07aa7312800000000000000000000000000000000000000000000000000000000000000000c00000000000000000000000000000000000000000000000000000000000000000,,,1,true -4187,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec34000000000000000000000000bd4fe8beefdabf942c9c3a4c3911991d4391add7000000000000000000000000bd4fe8beefdabf942c9c3a4c3911991d4391add7000000000000000000000000000000000000000000000000011c26f76d8a3bd800000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -4189,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec34000000000000000000000000665551f558999ee17e09bfef3b678c6f6d399fdf000000000000000000000000665551f558999ee17e09bfef3b678c6f6d399fdf0000000000000000000000000000000000000000000000000064c58e646da20000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -4190,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec34000000000000000000000000fba1905f6d569a1c2d61d1b1fdecc7951aab37bf000000000000000000000000fba1905f6d569a1c2d61d1b1fdecc7951aab37bf00000000000000000000000000000000000000000000000000038d7ea4c6800000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -4191,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec34000000000000000000000000b9d2ee9ea9ab887b00aef85156f504ba1699ef5f000000000000000000000000b9d2ee9ea9ab887b00aef85156f504ba1699ef5f00000000000000000000000000000000000000000000000001537c55c9c214bd00000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -4192,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec3400000000000000000000000052a1ee866213e20123d52a89d03b9aa89315460d00000000000000000000000052a1ee866213e20123d52a89d03b9aa89315460d000000000000000000000000000000000000000000000000001ef948416ddc0000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -4193,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0xa9f9e675000000000000000000000000dac17f958d2ee523a2206206994597c13d831ec700000000000000000000000094b008aa00579c1307b0ef2c499ad98a8ce58e580000000000000000000000002fd20abab2ad403ce4246b82e9f078ec9e23979b0000000000000000000000002fd20abab2ad403ce4246b82e9f078ec9e23979b0000000000000000000000000000000000000000000000000000000001f4b38100000000000000000000000000000000000000000000000000000000000000c00000000000000000000000000000000000000000000000000000000000000000,,,1,true -4194,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec3400000000000000000000000057b724f412bd00fde73c6113d8ec0ac1b3d79e9700000000000000000000000057b724f412bd00fde73c6113d8ec0ac1b3d79e9700000000000000000000000000000000000000000000000000b1a2bc2ec5000000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -4195,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec34000000000000000000000000f1cf787e28e15423139045047e17cfb17142c5d0000000000000000000000000f1cf787e28e15423139045047e17cfb17142c5d000000000000000000000000000000000000000000000000000038d7ea4c6800000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -4196,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec34000000000000000000000000f64ed0d305c8821e3f9d93e0fcec41e3eba9c013000000000000000000000000f64ed0d305c8821e3f9d93e0fcec41e3eba9c0130000000000000000000000000000000000000000000000000060b2b18eedb38300000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -4197,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec340000000000000000000000005d1a05cf8f23e2f6f9b0849c623a8437c410d2df0000000000000000000000005d1a05cf8f23e2f6f9b0849c623a8437c410d2df000000000000000000000000000000000000000000000000003520fef4d449c000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -4198,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec3400000000000000000000000071803170c1a0298c0ab62fcb540ae769949e495800000000000000000000000071803170c1a0298c0ab62fcb540ae769949e495800000000000000000000000000000000000000000000000000854f0f865f180000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -4201,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec340000000000000000000000008b79ae7d5a9417d83cca3bf7a08a2a1e36600ec10000000000000000000000008b79ae7d5a9417d83cca3bf7a08a2a1e36600ec1000000000000000000000000000000000000000000000000001bc0895a772d0000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -4202,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec340000000000000000000000002c046dacf5d6068585eb84720fb89fe6c69e37c20000000000000000000000002c046dacf5d6068585eb84720fb89fe6c69e37c2000000000000000000000000000000000000000000000000009ea8dfa325123f00000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -4203,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec3400000000000000000000000057803326193f31bb7b45e5a7a6760476c8e199cb00000000000000000000000057803326193f31bb7b45e5a7a6760476c8e199cb0000000000000000000000000000000000000000000000000058d15e1762800000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -4204,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec34000000000000000000000000c9c7b0c3cbab74892e22054dae909adf05e16e85000000000000000000000000c9c7b0c3cbab74892e22054dae909adf05e16e8500000000000000000000000000000000000000000000000000000002540be40000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -4205,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0xa9f9e675000000000000000000000000dac17f958d2ee523a2206206994597c13d831ec700000000000000000000000094b008aa00579c1307b0ef2c499ad98a8ce58e580000000000000000000000005c9038b998debec6f7545925850c8ed1d55d89410000000000000000000000005c9038b998debec6f7545925850c8ed1d55d89410000000000000000000000000000000000000000000000000000000005f5e10000000000000000000000000000000000000000000000000000000000000000c00000000000000000000000000000000000000000000000000000000000000000,,,1,true -4206,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec34000000000000000000000000639e482f52d9f8655e2fd4b3b2244c5ca6eba81c000000000000000000000000639e482f52d9f8655e2fd4b3b2244c5ca6eba81c0000000000000000000000000000000000000000000000000058a628267473e500000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -4207,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec34000000000000000000000000c8fec39aa6e80575bafe7e7b9a8b2e15762a7175000000000000000000000000c8fec39aa6e80575bafe7e7b9a8b2e15762a7175000000000000000000000000000000000000000000000000014df48080e3000000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -4208,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec34000000000000000000000000cb775d1882cd4b4a86b1361e430b5640c9149888000000000000000000000000cb775d1882cd4b4a86b1361e430b5640c91498880000000000000000000000000000000000000000000000000142961e719b000000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -4209,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec3400000000000000000000000053db3491c03160d722f039f8361b16e9fcc1765800000000000000000000000053db3491c03160d722f039f8361b16e9fcc176580000000000000000000000000000000000000000000000000006fae9b03d39bb00000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -4210,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec34000000000000000000000000e0a491c43221e065b182659655920fe2fde3c57e000000000000000000000000e0a491c43221e065b182659655920fe2fde3c57e00000000000000000000000000000000000000000000000000038d7ea4c6800000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -4211,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec3400000000000000000000000015bb7a84eb873d5ea59013187e2f488b4955f7f600000000000000000000000015bb7a84eb873d5ea59013187e2f488b4955f7f6000000000000000000000000000000000000000000000000002386f26fc1000000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -4212,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec34000000000000000000000000947acb351394674cc17011c6c662d06ba2a06eee000000000000000000000000947acb351394674cc17011c6c662d06ba2a06eee000000000000000000000000000000000000000000000000003eededd74af18400000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -4214,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec34000000000000000000000000a984cf31de92eb079617338c288265120a56af0c000000000000000000000000a984cf31de92eb079617338c288265120a56af0c00000000000000000000000000000000000000000000000005d1f6ae9bcf1d4800000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -4215,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec340000000000000000000000008d682350bfa1e1db407d75e30e9c749dc02ddd110000000000000000000000008d682350bfa1e1db407d75e30e9c749dc02ddd11000000000000000000000000000000000000000000000000003351106247386e00000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -4216,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec34000000000000000000000000fd64b96f5e9a68abbd0cb3d11106c71c3d6abf12000000000000000000000000fd64b96f5e9a68abbd0cb3d11106c71c3d6abf120000000000000000000000000000000000000000000000000011c37937e0800000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -4217,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec3400000000000000000000000015bb7a84eb873d5ea59013187e2f488b4955f7f600000000000000000000000015bb7a84eb873d5ea59013187e2f488b4955f7f6000000000000000000000000000000000000000000000000002386f26fc1000000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -4218,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0xa9f9e675000000000000000000000000dac17f958d2ee523a2206206994597c13d831ec700000000000000000000000094b008aa00579c1307b0ef2c499ad98a8ce58e58000000000000000000000000391181a69c0e69fad0c4c961c6791b3d5b2d0f6a000000000000000000000000391181a69c0e69fad0c4c961c6791b3d5b2d0f6a0000000000000000000000000000000000000000000000000000000003e9183500000000000000000000000000000000000000000000000000000000000000c00000000000000000000000000000000000000000000000000000000000000000,,,1,true -4219,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec3400000000000000000000000015bb7a84eb873d5ea59013187e2f488b4955f7f600000000000000000000000015bb7a84eb873d5ea59013187e2f488b4955f7f600000000000000000000000000000000000000000000000000354a6ba7a1800000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -4220,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec340000000000000000000000001b06674d798d4d8c8eab9bf7f1ef2d94da5c19640000000000000000000000001b06674d798d4d8c8eab9bf7f1ef2d94da5c1964000000000000000000000000000000000000000000000000006a0d591df4b9ed00000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -4221,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec34000000000000000000000000254fe50f65ce3bc5221ee251226e7f78631cd684000000000000000000000000254fe50f65ce3bc5221ee251226e7f78631cd684000000000000000000000000000000000000000000000000002ada524f275a0000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -4222,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec3400000000000000000000000093f09282490c9b71c65e559c54be76c8d70a1e3f00000000000000000000000093f09282490c9b71c65e559c54be76c8d70a1e3f00000000000000000000000000000000000000000000000002c05a9c33a2b10000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -4223,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0xa9f9e675000000000000000000000000dac17f958d2ee523a2206206994597c13d831ec700000000000000000000000094b008aa00579c1307b0ef2c499ad98a8ce58e580000000000000000000000003e05ea1732de84ce5122f4bafc2def475176c9200000000000000000000000003e05ea1732de84ce5122f4bafc2def475176c9200000000000000000000000000000000000000000000000000000000005dd48ec00000000000000000000000000000000000000000000000000000000000000c00000000000000000000000000000000000000000000000000000000000000000,,,1,true -4224,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec340000000000000000000000001b692fe3764a3c7400a7c27732dbc1b0c6f0d07b0000000000000000000000001b692fe3764a3c7400a7c27732dbc1b0c6f0d07b00000000000000000000000000000000000000000000000000a2654c9babb48900000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -4225,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec3400000000000000000000000093d154116d1d9bb5080e9f0e919d71e2690ab8a200000000000000000000000093d154116d1d9bb5080e9f0e919d71e2690ab8a200000000000000000000000000000000000000000000000000a36d5a7341990000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -4226,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec340000000000000000000000006103169e4ebda70d28a8dc6fa8eced2f6c9b83000000000000000000000000006103169e4ebda70d28a8dc6fa8eced2f6c9b830000000000000000000000000000000000000000000000000000001b48eb57e00000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -4228,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec34000000000000000000000000526fa515c11251ab665040710e2e118ccfa04031000000000000000000000000526fa515c11251ab665040710e2e118ccfa0403100000000000000000000000000000000000000000000000005868377ee1c699d00000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -4229,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec340000000000000000000000000a27fb641b4e2aa9ab98f5620ab6ce3de1aa7b870000000000000000000000000a27fb641b4e2aa9ab98f5620ab6ce3de1aa7b8700000000000000000000000000000000000000000000000001475c17bdfd70dd00000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -4230,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec340000000000000000000000000faed754f9108cd26d467e9752f4e30bb49cf4180000000000000000000000000faed754f9108cd26d467e9752f4e30bb49cf418000000000000000000000000000000000000000000000000001a515490262a0000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -4232,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0xa9f9e675000000000000000000000000dac17f958d2ee523a2206206994597c13d831ec700000000000000000000000094b008aa00579c1307b0ef2c499ad98a8ce58e58000000000000000000000000017c0153066f0dfbdd15b3fab9a70890a13e6282000000000000000000000000017c0153066f0dfbdd15b3fab9a70890a13e62820000000000000000000000000000000000000000000000000000000005f5e10000000000000000000000000000000000000000000000000000000000000000c00000000000000000000000000000000000000000000000000000000000000000,,,1,true -4233,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec34000000000000000000000000cb5e81182dcf7040e729ef39c46dffd62e30ea92000000000000000000000000cb5e81182dcf7040e729ef39c46dffd62e30ea9200000000000000000000000000000000000000000000000000005af3107a400000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -4234,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec340000000000000000000000009ac6074d198de1a36a9733e5c752196c792458b00000000000000000000000009ac6074d198de1a36a9733e5c752196c792458b0000000000000000000000000000000000000000000000000002b0ed62de6e96100000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -4236,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0xa9f9e675000000000000000000000000dac17f958d2ee523a2206206994597c13d831ec700000000000000000000000094b008aa00579c1307b0ef2c499ad98a8ce58e580000000000000000000000003700b2cb2b79ef5166d54519b0e91bbe58ec69ed0000000000000000000000003700b2cb2b79ef5166d54519b0e91bbe58ec69ed0000000000000000000000000000000000000000000000000000000005f5e10000000000000000000000000000000000000000000000000000000000000000c00000000000000000000000000000000000000000000000000000000000000000,,,1,true -4240,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec34000000000000000000000000190fbeb640480ce706df35c6a6a515543a079b62000000000000000000000000190fbeb640480ce706df35c6a6a515543a079b6200000000000000000000000000000000000000000000000000003691d6afc00000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -4248,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec34000000000000000000000000f90c4ca068955811f6b57b953c552ed73946ab86000000000000000000000000f90c4ca068955811f6b57b953c552ed73946ab8600000000000000000000000000000000000000000000000000038d7ea4c6800000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -4250,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec3400000000000000000000000050a92cf3a378ac7b4921e6a11b110b230fe2005500000000000000000000000050a92cf3a378ac7b4921e6a11b110b230fe2005500000000000000000000000000000000000000000000000000005af3107a400000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -4255,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec34000000000000000000000000f76ae976145fb249d51c6bdb4819cfa445f12501000000000000000000000000f76ae976145fb249d51c6bdb4819cfa445f12501000000000000000000000000000000000000000000000000001b86ecb23e030000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -4269,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec34000000000000000000000000bd4fe8beefdabf942c9c3a4c3911991d4391add7000000000000000000000000bd4fe8beefdabf942c9c3a4c3911991d4391add70000000000000000000000000000000000000000000000000077d11bf46a114200000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -4271,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec34000000000000000000000000f90c4ca068955811f6b57b953c552ed73946ab86000000000000000000000000f90c4ca068955811f6b57b953c552ed73946ab8600000000000000000000000000000000000000000000000000038d7ea4c6800000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -4274,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0xa9f9e675000000000000000000000000dac17f958d2ee523a2206206994597c13d831ec700000000000000000000000094b008aa00579c1307b0ef2c499ad98a8ce58e58000000000000000000000000941be76b1c8a44401d98b59144055d526586f36f000000000000000000000000941be76b1c8a44401d98b59144055d526586f36f0000000000000000000000000000000000000000000000000000000005f5e10000000000000000000000000000000000000000000000000000000000000000c00000000000000000000000000000000000000000000000000000000000000000,,,1,true -4276,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec34000000000000000000000000a8672f2b380be795e8ac446d5c4e01648e56abed000000000000000000000000a8672f2b380be795e8ac446d5c4e01648e56abed00000000000000000000000000000000000000000000000000005af3107a400000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -4277,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec3400000000000000000000000061166703a196deb1e9cbbce6b8740b370396f36b00000000000000000000000061166703a196deb1e9cbbce6b8740b370396f36b000000000000000000000000000000000000000000000000038fcff4df133e3600000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -4279,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec340000000000000000000000006a305637fe35e193c341b4244218f292fecd0bed0000000000000000000000006a305637fe35e193c341b4244218f292fecd0bed00000000000000000000000000000000000000000000000000038d7ea4c6800000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -4295,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0xa9f9e675000000000000000000000000dac17f958d2ee523a2206206994597c13d831ec700000000000000000000000094b008aa00579c1307b0ef2c499ad98a8ce58e5800000000000000000000000040ceaf006224a429f8dfeb593b480d34d636bade00000000000000000000000040ceaf006224a429f8dfeb593b480d34d636bade0000000000000000000000000000000000000000000000000000000005f5e10000000000000000000000000000000000000000000000000000000000000000c00000000000000000000000000000000000000000000000000000000000000000,,,1,true -4301,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec34000000000000000000000000dd90f026b0acd019f52e97ccb0cf634b75e933e7000000000000000000000000dd90f026b0acd019f52e97ccb0cf634b75e933e70000000000000000000000000000000000000000000000000038c10f9205a13100000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -4325,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec34000000000000000000000000928abfcdbef4acd34fc6196830fe193765ee13dd000000000000000000000000928abfcdbef4acd34fc6196830fe193765ee13dd0000000000000000000000000000000000000000000000000016f76d6e3f03d700000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -4340,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec3400000000000000000000000009b97b677c70297accab2a91e345c121b51372fd00000000000000000000000009b97b677c70297accab2a91e345c121b51372fd000000000000000000000000000000000000000000000000001116fe33e36f5900000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -4342,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec34000000000000000000000000be1e0184b5812569cbb3bd6dcf95719575b03d87000000000000000000000000be1e0184b5812569cbb3bd6dcf95719575b03d87000000000000000000000000000000000000000000000000001072eba779714800000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -4345,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec34000000000000000000000000e795eb19b7248757dbe1e43fc77b527f51eb4c37000000000000000000000000e795eb19b7248757dbe1e43fc77b527f51eb4c37000000000000000000000000000000000000000000000000001081c60f02b08b00000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -4346,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec3400000000000000000000000016b658270ac50c0063940ed287c401b3df7ccf7000000000000000000000000016b658270ac50c0063940ed287c401b3df7ccf7000000000000000000000000000000000000000000000000001515f192daf056e00000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -4348,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec340000000000000000000000005d960344674d5386e7577db411172cfd2a242c600000000000000000000000005d960344674d5386e7577db411172cfd2a242c6000000000000000000000000000000000000000000000000000108a611965039000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -4350,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec3400000000000000000000000067920f8552db96b7eca9ea26545811624f4d091a00000000000000000000000067920f8552db96b7eca9ea26545811624f4d091a00000000000000000000000000000000000000000000000000f8b0a10e47000000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -4351,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec34000000000000000000000000844c6522a9e21ad82fbea22ad68aaf8fd32a5d57000000000000000000000000844c6522a9e21ad82fbea22ad68aaf8fd32a5d5700000000000000000000000000000000000000000000000002a3be74d411c06200000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -4352,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec34000000000000000000000000292eae73323683763a558ec8c42c69b76f247e37000000000000000000000000292eae73323683763a558ec8c42c69b76f247e370000000000000000000000000000000000000000000000000010aa2831f9448100000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -4359,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec34000000000000000000000000c6ef132ede48d791ca94b98cd5f5ecc5e55f181f000000000000000000000000c6ef132ede48d791ca94b98cd5f5ecc5e55f181f0000000000000000000000000000000000000000000000000018de76816d800000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -4360,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec34000000000000000000000000edf5b6a5194eaa36726fefc8f8c6a4f8e739f54a000000000000000000000000edf5b6a5194eaa36726fefc8f8c6a4f8e739f54a00000000000000000000000000000000000000000000000000038d7ea4c6800000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -4362,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec340000000000000000000000004af15e6cef17bd154e1c2b676cfce18fe0811e8e0000000000000000000000004af15e6cef17bd154e1c2b676cfce18fe0811e8e000000000000000000000000000000000000000000000000001118e5646aadf200000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -4365,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec34000000000000000000000000db743a2f9f47c615bfae18ddc5a51c59a4a70eef000000000000000000000000db743a2f9f47c615bfae18ddc5a51c59a4a70eef000000000000000000000000000000000000000000000000006a94d74f43000000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -4369,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec34000000000000000000000000549f890dc98320b1bd7012233178a1bba55a0d7f000000000000000000000000549f890dc98320b1bd7012233178a1bba55a0d7f00000000000000000000000000000000000000000000000000038d7ea4c6800000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -4370,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec34000000000000000000000000f25aba378c7bf5f90f47db14b8056ffa762b7221000000000000000000000000f25aba378c7bf5f90f47db14b8056ffa762b7221000000000000000000000000000000000000000000000000002ba9df9248778600000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -4376,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec34000000000000000000000000e341fbf7bbd43e06f4eadab1ad9e41b01b074bdb000000000000000000000000e341fbf7bbd43e06f4eadab1ad9e41b01b074bdb000000000000000000000000000000000000000000000000000e35fa931a000000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -4382,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec34000000000000000000000000128bc803a104748db0259c90867fcebfb4877a1d000000000000000000000000128bc803a104748db0259c90867fcebfb4877a1d00000000000000000000000000000000000000000000000000acded07d5c560000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -4387,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec34000000000000000000000000d58045868c84793d378876d31e17d90124c82e05000000000000000000000000d58045868c84793d378876d31e17d90124c82e0500000000000000000000000000000000000000000000000000406fa757c1760000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -4388,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec34000000000000000000000000fc64f1b4a1d6854b8c014014621b4e579687fb2c000000000000000000000000fc64f1b4a1d6854b8c014014621b4e579687fb2c00000000000000000000000000000000000000000000000000186f478ebd259700000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -4392,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec34000000000000000000000000cc132bbcaf8fefd6ed55c05ffa8d1021a222f119000000000000000000000000cc132bbcaf8fefd6ed55c05ffa8d1021a222f1190000000000000000000000000000000000000000000000000061b4a73c15ee2b00000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -4393,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec34000000000000000000000000d829e171dd8e86279d89dc9a7f5ad7ffbad5a86a000000000000000000000000d829e171dd8e86279d89dc9a7f5ad7ffbad5a86a000000000000000000000000000000000000000000000000004e50d8cf7e02c600000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -4397,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec340000000000000000000000007daa0065dd5bcc24d8829ed3c6281b846387d6040000000000000000000000007daa0065dd5bcc24d8829ed3c6281b846387d60400000000000000000000000000000000000000000000000000b1a2bc2ec5000000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -4398,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec34000000000000000000000000135cd9223f46b2287d593afceb278224d9a5da2e000000000000000000000000135cd9223f46b2287d593afceb278224d9a5da2e000000000000000000000000000000000000000000000000001907b66e23721500000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -4399,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec34000000000000000000000000cf8c84f4fa5861d718271d0a676e53a5d7922c61000000000000000000000000cf8c84f4fa5861d718271d0a676e53a5d7922c6100000000000000000000000000000000000000000000000000b1a2bc2ec5000000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -4400,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec34000000000000000000000000a01ec139b82e3e04fc4430317b442800b747fc09000000000000000000000000a01ec139b82e3e04fc4430317b442800b747fc0900000000000000000000000000000000000000000000000000b1a2bc2ec5000000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -4401,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec34000000000000000000000000da01a63a39c5caaad82c18d5640edc74dd08f016000000000000000000000000da01a63a39c5caaad82c18d5640edc74dd08f01600000000000000000000000000000000000000000000000000b1a2bc2ec5000000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -4403,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec3400000000000000000000000016a2f972d8b163f56830834a994159c268e5a6d000000000000000000000000016a2f972d8b163f56830834a994159c268e5a6d000000000000000000000000000000000000000000000000000b1a2bc2ec5000000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -4404,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec340000000000000000000000002c61edc942bb6a5fca34a207d1d08e2caccbb93c0000000000000000000000002c61edc942bb6a5fca34a207d1d08e2caccbb93c000000000000000000000000000000000000000000000000002386f26fc1000000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -4411,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec34000000000000000000000000136ba2f844d4a88fba2f961329ee01d8eb217d2b000000000000000000000000136ba2f844d4a88fba2f961329ee01d8eb217d2b00000000000000000000000000000000000000000000000000038d7ea4c6800000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -4413,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec340000000000000000000000005346ad8067250f4a579ade87201ff309533640f80000000000000000000000005346ad8067250f4a579ade87201ff309533640f8000000000000000000000000000000000000000000000000001a171a93f43b3600000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -4421,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec340000000000000000000000001a3d37e257919ee3f59f7fcb776510e332e3aebf0000000000000000000000001a3d37e257919ee3f59f7fcb776510e332e3aebf00000000000000000000000000000000000000000000000000354a6ba7a1800000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -4423,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec340000000000000000000000002891d57e0d43d01b1e5e4f0fdbf246ebe6ffecd40000000000000000000000002891d57e0d43d01b1e5e4f0fdbf246ebe6ffecd400000000000000000000000000000000000000000000000000a00128ef49310700000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -4425,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec34000000000000000000000000811a6fdd51dc16ca90beec8cc1575cf55c55a6f8000000000000000000000000811a6fdd51dc16ca90beec8cc1575cf55c55a6f80000000000000000000000000000000000000000000000000011c37937e0800000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -4428,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec340000000000000000000000000e3cbd67b2e89cb57fd3dc852484136ec768dd680000000000000000000000000e3cbd67b2e89cb57fd3dc852484136ec768dd68000000000000000000000000000000000000000000000000002386f26fc1000000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -4431,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec3400000000000000000000000047e282d7b1737592b034fef7b427cef8f5a820e600000000000000000000000047e282d7b1737592b034fef7b427cef8f5a820e6000000000000000000000000000000000000000000000000002386f26fc1000000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -4433,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec34000000000000000000000000a3e66a4e786fcf397c6c33c3a973a1105363eb40000000000000000000000000a3e66a4e786fcf397c6c33c3a973a1105363eb400000000000000000000000000000000000000000000000000003e871b540c00000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -4437,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec34000000000000000000000000d92b8841178d8a314c845da46276097c37c6c76b000000000000000000000000d92b8841178d8a314c845da46276097c37c6c76b00000000000000000000000000000000000000000000000001485aaad7bb8e5100000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -4438,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec340000000000000000000000002d9f6a085af7acb73e01fe334180c4e9ef5532c80000000000000000000000002d9f6a085af7acb73e01fe334180c4e9ef5532c800000000000000000000000000000000000000000000000000336e152e3e65d500000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -4444,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec34000000000000000000000000a93bfb17b9d9edd76539041f563eecf6e0523c9e000000000000000000000000a93bfb17b9d9edd76539041f563eecf6e0523c9e000000000000000000000000000000000000000000000000003c6568f12e800000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -4449,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec340000000000000000000000006f5d8ba12af7681206be37cee36d2fbd4ebff3f40000000000000000000000006f5d8ba12af7681206be37cee36d2fbd4ebff3f4000000000000000000000000000000000000000000000000003b858e468fa14200000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -4452,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec34000000000000000000000000982fc54604b391a11211543014711f12b843110a000000000000000000000000982fc54604b391a11211543014711f12b843110a0000000000000000000000000000000000000000000000000060a4609196978e00000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -4455,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec340000000000000000000000002587a07278d72481d1d1d768b4e22abee7c4c8250000000000000000000000002587a07278d72481d1d1d768b4e22abee7c4c82500000000000000000000000000000000000000000000000000038d7ea4c6800000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -4456,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec34000000000000000000000000aebc6fd1db7c9a882248b1078569b2eb85218363000000000000000000000000aebc6fd1db7c9a882248b1078569b2eb852183630000000000000000000000000000000000000000000000000151970c759ada2600000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -4457,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec3400000000000000000000000000e1ac9a2272185c546f8e2f7852a3adfdd91f8300000000000000000000000000e1ac9a2272185c546f8e2f7852a3adfdd91f8300000000000000000000000000000000000000000000000000b1a2bc2ec5000000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -4459,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0xa9f9e675000000000000000000000000a0b86991c6218b36c1d19d4a2e9eb0ce3606eb480000000000000000000000007f5c764cbc14f9669b88837ca1490cca17c31607000000000000000000000000ca8339fb523b86526efa90a4b305e1a75068ac15000000000000000000000000ca8339fb523b86526efa90a4b305e1a75068ac15000000000000000000000000000000000000000000000000000000000000271000000000000000000000000000000000000000000000000000000000000000c00000000000000000000000000000000000000000000000000000000000000000,,,1,true -4460,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec3400000000000000000000000029a5c9e2226bc78fccecb4f9ef50bbfc6a86c24200000000000000000000000029a5c9e2226bc78fccecb4f9ef50bbfc6a86c2420000000000000000000000000000000000000000000000000151970c759ada2600000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -4462,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec34000000000000000000000000b84604433c16105afb4e33495e7e64c4b71d1824000000000000000000000000b84604433c16105afb4e33495e7e64c4b71d18240000000000000000000000000000000000000000000000000001c6bf5263400000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -4463,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec34000000000000000000000000b569fb627ca1e0b51b0a405c456328005019053f000000000000000000000000b569fb627ca1e0b51b0a405c456328005019053f00000000000000000000000000000000000000000000000000a650caee92393900000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -4464,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec3400000000000000000000000009a6d6640555dbb959466d574402da12fa56fe8f00000000000000000000000009a6d6640555dbb959466d574402da12fa56fe8f000000000000000000000000000000000000000000000000013c2feac60a8c0000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,0xed03f507528873b7016df194117900bcb9c2c2fab013051bd38ddf956c5b8ba4,2021-12-12 05:27:46.000 UTC,0,true -4465,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec3400000000000000000000000075ea7a4301c676b3ef194f00643e40a6ff5c508400000000000000000000000075ea7a4301c676b3ef194f00643e40a6ff5c508400000000000000000000000000000000000000000000000000a6052714bf6f0100000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -4466,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec34000000000000000000000000f531b9b9cddb5394f3577e34807220e410809093000000000000000000000000f531b9b9cddb5394f3577e34807220e41080909300000000000000000000000000000000000000000000000000edd0d7cea903bf00000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -4469,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec3400000000000000000000000004f8ffeed97d56242424b0fabe846fd1627002a600000000000000000000000004f8ffeed97d56242424b0fabe846fd1627002a60000000000000000000000000000000000000000000000000153b0525a28a62300000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -4470,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec340000000000000000000000008c6b63b05696bbe015f28f4315e470a98e7c48f40000000000000000000000008c6b63b05696bbe015f28f4315e470a98e7c48f4000000000000000000000000000000000000000000000000002386f26fc1000000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -4471,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec3400000000000000000000000086dac5a07e05a3caadf86c1ad9681bd23ca8221500000000000000000000000086dac5a07e05a3caadf86c1ad9681bd23ca822150000000000000000000000000000000000000000000000000014a8a7dbd9633e00000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -4478,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec34000000000000000000000000cc7fd26298a95b5a6a305c6330513261a0108597000000000000000000000000cc7fd26298a95b5a6a305c6330513261a0108597000000000000000000000000000000000000000000000000001cb46d7be4c57f00000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -4480,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec34000000000000000000000000255749ce8ab1dd14c09787e7405a15ff17c24459000000000000000000000000255749ce8ab1dd14c09787e7405a15ff17c2445900000000000000000000000000000000000000000000000000038d7ea4c6800000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -4495,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec340000000000000000000000001a6e21fbf6cf82dcfc804602c6f9857c24c80c590000000000000000000000001a6e21fbf6cf82dcfc804602c6f9857c24c80c590000000000000000000000000000000000000000000000000038d7ea4c68000000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -4496,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec34000000000000000000000000466cfe385d25ddc6ef7ffa1fd16d2fd75362146d000000000000000000000000466cfe385d25ddc6ef7ffa1fd16d2fd75362146d00000000000000000000000000000000000000000000000000597e53f5dce96900000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -4504,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec340000000000000000000000001bb006840ec39d2bc8e9c8766aec6cfc0161c2330000000000000000000000001bb006840ec39d2bc8e9c8766aec6cfc0161c233000000000000000000000000000000000000000000000000003445407c807f6b00000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,0xc57c1cbe7ef62f873d452a2a9f430b2e174f2dabf180758b3fe636dd07504ca8,2022-03-12 12:10:48.000 UTC,0,true -4506,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec34000000000000000000000000df1c13b1fffa2ac5984516719cbdbfa22240efbb000000000000000000000000df1c13b1fffa2ac5984516719cbdbfa22240efbb000000000000000000000000000000000000000000000000006f96d8ea35f8d000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -4509,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec340000000000000000000000002b1df9010790002f57090902c78292cc7e7d948a0000000000000000000000002b1df9010790002f57090902c78292cc7e7d948a000000000000000000000000000000000000000000000000025bf6196bd1000000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -4511,0xcd9d4988c0ae61887b075ba77f08cbfad2b65068,0x3f87ff1de58128ef8fcb4c807efd776e1ac72e51,0xf4f7b41a00000000000000000000000006f398ce76acc1fce97b7cab0eb2a96ba9230c9b00000000000000000000000000000000000000000000000098a7d9b8314c0000,,,1,true -4515,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec340000000000000000000000003605c9fe039f3bdacbc2003a33b2586f7bfb67000000000000000000000000003605c9fe039f3bdacbc2003a33b2586f7bfb6700000000000000000000000000000000000000000000000000003972878204a00000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -4518,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec340000000000000000000000005f3582b06b6697fd64e791ab7ace882fe66bc8350000000000000000000000005f3582b06b6697fd64e791ab7ace882fe66bc83500000000000000000000000000000000000000000000000002b7ea9f4ac5307e00000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -4520,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec34000000000000000000000000952f28087fd8df38251ea862e300dd8260ad0feb000000000000000000000000952f28087fd8df38251ea862e300dd8260ad0feb0000000000000000000000000000000000000000000000000012d763c766a05100000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -4521,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec3400000000000000000000000043469718666fbf0d76d53d1aa5e8adaa51aa03c500000000000000000000000043469718666fbf0d76d53d1aa5e8adaa51aa03c5000000000000000000000000000000000000000000000000004262dd2c37010000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -4523,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec34000000000000000000000000f66c88f9c59a78b3b5435838aeb0465a0805c011000000000000000000000000f66c88f9c59a78b3b5435838aeb0465a0805c01100000000000000000000000000000000000000000000000000005af3107a400000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -4525,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec34000000000000000000000000f1912c7917b6da214a7118d323c3049229d765b3000000000000000000000000f1912c7917b6da214a7118d323c3049229d765b300000000000000000000000000000000000000000000000000354a6ba7a1800000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -4526,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec34000000000000000000000000d317e99e1d2357c6d61568f7e23f95f31eb132d5000000000000000000000000d317e99e1d2357c6d61568f7e23f95f31eb132d5000000000000000000000000000000000000000000000000005d11f25948917e00000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -4527,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec340000000000000000000000005030a9280a75cb91cc70d0bf3b02c14d3b01d3270000000000000000000000005030a9280a75cb91cc70d0bf3b02c14d3b01d32700000000000000000000000000000000000000000000000000422c5410b3d80000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -4528,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec3400000000000000000000000032360705da597f8c77c67e46986818e199f2d44100000000000000000000000032360705da597f8c77c67e46986818e199f2d441000000000000000000000000000000000000000000000000023428a2fc92712300000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -4529,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec3400000000000000000000000015591129be9019d57fd6439525b8517d616e8c8f00000000000000000000000015591129be9019d57fd6439525b8517d616e8c8f0000000000000000000000000000000000000000000000000155cd19a78f21d700000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -4530,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec34000000000000000000000000b90adc44da6c179c7d2c048d2cffb7c80c1620f9000000000000000000000000b90adc44da6c179c7d2c048d2cffb7c80c1620f900000000000000000000000000000000000000000000000000a5bf634083be5500000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -4531,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec34000000000000000000000000fe75966551cea0792d65d3b72e4a82918d2675f1000000000000000000000000fe75966551cea0792d65d3b72e4a82918d2675f10000000000000000000000000000000000000000000000000000f85b2a300d7400000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -4532,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec340000000000000000000000004c2b60bcb07410427dc1c6a1328c0dea1d7c9baa0000000000000000000000004c2b60bcb07410427dc1c6a1328c0dea1d7c9baa0000000000000000000000000000000000000000000000000001e7c1d2a2fe9b00000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -4533,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec340000000000000000000000005d8b8f4ad3e18983e9fe2ca59d03acd8dac9e0000000000000000000000000005d8b8f4ad3e18983e9fe2ca59d03acd8dac9e0000000000000000000000000000000000000000000000000000081b6280f0678bd00000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -4534,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec34000000000000000000000000fbfc958e0d464459edaf31beea4ebf6fcb9614e7000000000000000000000000fbfc958e0d464459edaf31beea4ebf6fcb9614e7000000000000000000000000000000000000000000000000000e1d7cbe6e507f00000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -4535,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec34000000000000000000000000514f2c26d7c56c0857dceb5f84fb875d315f7a09000000000000000000000000514f2c26d7c56c0857dceb5f84fb875d315f7a09000000000000000000000000000000000000000000000000001f91b3c2d5df0000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -4536,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec340000000000000000000000003652f12c39a23dcb0d1e51a98736ec6334f902990000000000000000000000003652f12c39a23dcb0d1e51a98736ec6334f9029900000000000000000000000000000000000000000000000000a5a43afc15541b00000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -4537,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec34000000000000000000000000cbb30c604b349078f2ee48e4649ee682898d0d6f000000000000000000000000cbb30c604b349078f2ee48e4649ee682898d0d6f0000000000000000000000000000000000000000000000000039b387761ee11700000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -4538,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec3400000000000000000000000045e508aaf9267855e05f93793c9979b0ffc2975000000000000000000000000045e508aaf9267855e05f93793c9979b0ffc2975000000000000000000000000000000000000000000000000000eaa0e2731f687800000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -4540,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec34000000000000000000000000e2658d224b9f1ec2cdeb6400730a57dafbba9ac9000000000000000000000000e2658d224b9f1ec2cdeb6400730a57dafbba9ac900000000000000000000000000000000000000000000000000354a6ba7a1800000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -4541,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec340000000000000000000000008615a0536bddc38701560a4b577b4b7c505e4f980000000000000000000000008615a0536bddc38701560a4b577b4b7c505e4f9800000000000000000000000000000000000000000000000001551f8750ba84ed00000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -4542,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec34000000000000000000000000618ae54643d161d19cd2e2249dd5be383cd44a69000000000000000000000000618ae54643d161d19cd2e2249dd5be383cd44a69000000000000000000000000000000000000000000000000010eb0ee0d6f2a4b00000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -4543,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec340000000000000000000000007002f465c7ab3d7433d4b90cb2fac271ae03d34c0000000000000000000000007002f465c7ab3d7433d4b90cb2fac271ae03d34c000000000000000000000000000000000000000000000000010eea438fbffc9600000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -4544,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec340000000000000000000000008595ec582c6dc4aed52f4550f734be56d59967ce0000000000000000000000008595ec582c6dc4aed52f4550f734be56d59967ce00000000000000000000000000000000000000000000000000354a6ba7a1800000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -4545,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec340000000000000000000000002f6e4525899f4dd05e8532bc2afff78313840aeb0000000000000000000000002f6e4525899f4dd05e8532bc2afff78313840aeb000000000000000000000000000000000000000000000000010ddf1fad6e152300000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -4546,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec3400000000000000000000000075c328b104580b2bd9153e9dd0037742d006690a00000000000000000000000075c328b104580b2bd9153e9dd0037742d006690a00000000000000000000000000000000000000000000000000f8b0a10e47000000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -4547,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec3400000000000000000000000009c653c6683dcaf67db2980041d116ef48ad91b500000000000000000000000009c653c6683dcaf67db2980041d116ef48ad91b5000000000000000000000000000000000000000000000000010cedb6b12901c600000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -4548,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec340000000000000000000000001b4073b13dab3f671e28e3fbcada9a9c5ffc3fc40000000000000000000000001b4073b13dab3f671e28e3fbcada9a9c5ffc3fc40000000000000000000000000000000000000000000000000154394a8595f7fe00000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -4549,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec34000000000000000000000000df1448337af7529a3b2086982e9916c1a0f96c7b000000000000000000000000df1448337af7529a3b2086982e9916c1a0f96c7b00000000000000000000000000000000000000000000000000354a6ba7a1800000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -4550,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec340000000000000000000000007a3f01f0d2bbc0cf1f58a5c40aaf8b95d5cf437a0000000000000000000000007a3f01f0d2bbc0cf1f58a5c40aaf8b95d5cf437a000000000000000000000000000000000000000000000000010c51b85b9a9dea00000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -4551,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec340000000000000000000000005b7b2da7d40db2e07ce7bacdc10eb88a24829c910000000000000000000000005b7b2da7d40db2e07ce7bacdc10eb88a24829c91000000000000000000000000000000000000000000000000010c51b85b9a9dea00000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -4552,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec340000000000000000000000003404fad8173217d296883be88c7ff401d12d7a560000000000000000000000003404fad8173217d296883be88c7ff401d12d7a5600000000000000000000000000000000000000000000000000eb3d9deb81370100000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -4553,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec34000000000000000000000000b3618500c58cc7993e42cc05aea9469fa5458acf000000000000000000000000b3618500c58cc7993e42cc05aea9469fa5458acf00000000000000000000000000000000000000000000000000354a6ba7a1800000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -4554,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec34000000000000000000000000340eecc4e7b04a063e31dbf041c5211f7a7fb7b0000000000000000000000000340eecc4e7b04a063e31dbf041c5211f7a7fb7b000000000000000000000000000000000000000000000000000038d7ea4c6800000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -4555,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec34000000000000000000000000fc4af6320db7e65e0ee251e081deaacaae0920f8000000000000000000000000fc4af6320db7e65e0ee251e081deaacaae0920f8000000000000000000000000000000000000000000000000006a94d74f43000000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -4556,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec34000000000000000000000000340eecc4e7b04a063e31dbf041c5211f7a7fb7b0000000000000000000000000340eecc4e7b04a063e31dbf041c5211f7a7fb7b000000000000000000000000000000000000000000000000000038d7ea4c6800000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -4557,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec34000000000000000000000000c739d8aafc091735c9996dcb940023eb23528fed000000000000000000000000c739d8aafc091735c9996dcb940023eb23528fed0000000000000000000000000000000000000000000000000011c37937e0800000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -4558,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec3400000000000000000000000013293a9b2d51dc0f82a695d8c2809318df57235500000000000000000000000013293a9b2d51dc0f82a695d8c2809318df57235500000000000000000000000000000000000000000000000000354a6ba7a1800000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -4559,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec34000000000000000000000000fca872ffe467c4983d75148f7584f3afd7877927000000000000000000000000fca872ffe467c4983d75148f7584f3afd787792700000000000000000000000000000000000000000000000000354a6ba7a1800000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -4561,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec340000000000000000000000000f2076030aab9e7f83c30c210e37af594b10497e0000000000000000000000000f2076030aab9e7f83c30c210e37af594b10497e00000000000000000000000000000000000000000000000000354a6ba7a1800000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -4562,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0xa9f9e675000000000000000000000000a0b86991c6218b36c1d19d4a2e9eb0ce3606eb480000000000000000000000007f5c764cbc14f9669b88837ca1490cca17c31607000000000000000000000000340eecc4e7b04a063e31dbf041c5211f7a7fb7b0000000000000000000000000340eecc4e7b04a063e31dbf041c5211f7a7fb7b00000000000000000000000000000000000000000000000000000000000004e2000000000000000000000000000000000000000000000000000000000000000c00000000000000000000000000000000000000000000000000000000000000000,,,1,true -4563,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec34000000000000000000000000d5eeb2692bbb03932d7b645aa65fc4f5261e5c52000000000000000000000000d5eeb2692bbb03932d7b645aa65fc4f5261e5c5200000000000000000000000000000000000000000000000000878ee35577f02e00000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -4564,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec34000000000000000000000000d7e7c33cd3bf10a7f60b8b539217d2d9ac42e93b000000000000000000000000d7e7c33cd3bf10a7f60b8b539217d2d9ac42e93b000000000000000000000000000000000000000000000000004b718aa0bc3f6000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -4565,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec3400000000000000000000000055c3a72eff435c46abc1726c7f945050806eabd500000000000000000000000055c3a72eff435c46abc1726c7f945050806eabd500000000000000000000000000000000000000000000000000354a6ba7a1800000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -4567,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec340000000000000000000000008916fb668334de7548eaaa65f5a9c3c7aaaeda980000000000000000000000008916fb668334de7548eaaa65f5a9c3c7aaaeda98000000000000000000000000000000000000000000000000002fb743c0e0070000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -4568,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec340000000000000000000000005cff30cb947670f57631fe03e5e29cb5b0dfa1480000000000000000000000005cff30cb947670f57631fe03e5e29cb5b0dfa14800000000000000000000000000000000000000000000000000354a6ba7a1800000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -4569,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec340000000000000000000000002828b1cd64ce9cd865f6cb8cc1427c5b05d665160000000000000000000000002828b1cd64ce9cd865f6cb8cc1427c5b05d6651600000000000000000000000000000000000000000000000000453d19ac94a68000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -4570,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec3400000000000000000000000033bd157a226ff92e3184a5955938327b4d0785f400000000000000000000000033bd157a226ff92e3184a5955938327b4d0785f400000000000000000000000000000000000000000000000000354a6ba7a1800000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -4572,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec34000000000000000000000000c942a745f881b58891a853d8a41172b30b726967000000000000000000000000c942a745f881b58891a853d8a41172b30b726967000000000000000000000000000000000000000000000000003ac94eecef7c1500000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -4574,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec34000000000000000000000000f7676a93a10350518fc2804cd023cf19084920d8000000000000000000000000f7676a93a10350518fc2804cd023cf19084920d800000000000000000000000000000000000000000000000002c19f06e46d490000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -4575,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec3400000000000000000000000043e4148d51f72f5d01be90632ea4a3bce0834f1700000000000000000000000043e4148d51f72f5d01be90632ea4a3bce0834f170000000000000000000000000000000000000000000000000014f31f314ec1be00000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -4576,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec3400000000000000000000000063ded784c8da63a79ee47f9a53bcb1bad1d9f3e000000000000000000000000063ded784c8da63a79ee47f9a53bcb1bad1d9f3e000000000000000000000000000000000000000000000000000a0a145a3e5e20700000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -4577,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec34000000000000000000000000a3d1d153fd90347c4e48f9611503524e9162598f000000000000000000000000a3d1d153fd90347c4e48f9611503524e9162598f0000000000000000000000000000000000000000000000000235a164dd2b9e8000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -4578,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec34000000000000000000000000c2de88aae74121a05b8ecf066eac4e6ec404a92e000000000000000000000000c2de88aae74121a05b8ecf066eac4e6ec404a92e00000000000000000000000000000000000000000000000000230133f16f603f00000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -4579,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec34000000000000000000000000f18ff2dc14ead656227349209119c0cc5079f00e000000000000000000000000f18ff2dc14ead656227349209119c0cc5079f00e0000000000000000000000000000000000000000000000000003e1e44a99dc5f00000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -4580,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec34000000000000000000000000b43310714f0eaf3ef00f59d1cb960b9f0a2864f2000000000000000000000000b43310714f0eaf3ef00f59d1cb960b9f0a2864f200000000000000000000000000000000000000000000000000071afd498d000000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -4581,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec340000000000000000000000000d01b7ff2b2544529ee092240d406051756607260000000000000000000000000d01b7ff2b2544529ee092240d40605175660726000000000000000000000000000000000000000000000000009bad5fbccb58db00000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -4582,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec340000000000000000000000004743ed9e06fe530798654e27db3508fa146836710000000000000000000000004743ed9e06fe530798654e27db3508fa1468367100000000000000000000000000000000000000000000000000a9688a982d930000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -4584,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec3400000000000000000000000022014722f748564486414ec1c73c70f6c6484e3d00000000000000000000000022014722f748564486414ec1c73c70f6c6484e3d000000000000000000000000000000000000000000000000001749b0b45fc33500000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -4586,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec34000000000000000000000000a054517dab4695751c5276148a29a245c2163550000000000000000000000000a054517dab4695751c5276148a29a245c2163550000000000000000000000000000000000000000000000000000aa87bee53800000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -4587,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec3400000000000000000000000085f5b414aaf84ec70cb54cc84682cfe9e69d3c2900000000000000000000000085f5b414aaf84ec70cb54cc84682cfe9e69d3c29000000000000000000000000000000000000000000000000006379da05b6000000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -4588,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec34000000000000000000000000fa833a5540c3520582dca433013046a3cb1c3603000000000000000000000000fa833a5540c3520582dca433013046a3cb1c360300000000000000000000000000000000000000000000000000950bff17947ff500000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -4589,0x10e6593cdda8c58a1d0f14c5164b376352a55f2f,0x467194771dae2967aef3ecbedd3bf9a310c76c65,0xa9f9e6750000000000000000000000006b175474e89094c44da98b954eedeac495271d0f000000000000000000000000da10009cbd5d07dd0cecc66161fc93d7c9000da1000000000000000000000000b9bd441e853d180d9749315619fe1c4786f866ad000000000000000000000000b9bd441e853d180d9749315619fe1c4786f866ad00000000000000000000000000000000000000000000000000000000000001f200000000000000000000000000000000000000000000000000000000000000c00000000000000000000000000000000000000000000000000000000000000000,,,1,true -4590,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec340000000000000000000000000fd6fa501ec50109c6f0f7d848941df9dae44b4b0000000000000000000000000fd6fa501ec50109c6f0f7d848941df9dae44b4b0000000000000000000000000000000000000000000000000043cc3f67ade4d200000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -4592,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec34000000000000000000000000f4f6cecae5c1292ccc6e7d5cb99f45275fffa771000000000000000000000000f4f6cecae5c1292ccc6e7d5cb99f45275fffa771000000000000000000000000000000000000000000000000005bbb04035f625500000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -4593,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec34000000000000000000000000511fb72e1b71eedc17f11b79fd262c66fbe1c235000000000000000000000000511fb72e1b71eedc17f11b79fd262c66fbe1c23500000000000000000000000000000000000000000000000000038d7ea4c6800000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -4595,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec340000000000000000000000004f098f3429d43d080ba0c8ec27a1ab7dbcfb85f10000000000000000000000004f098f3429d43d080ba0c8ec27a1ab7dbcfb85f100000000000000000000000000000000000000000000000000071afd498d000000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -4597,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec340000000000000000000000004f098f3429d43d080ba0c8ec27a1ab7dbcfb85f10000000000000000000000004f098f3429d43d080ba0c8ec27a1ab7dbcfb85f100000000000000000000000000000000000000000000000000071afd498d000000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -4598,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec34000000000000000000000000dce620ed8be234b948bcea5694d543d4f7c5438d000000000000000000000000dce620ed8be234b948bcea5694d543d4f7c5438d000000000000000000000000000000000000000000000000001550f7dca7000000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -4599,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec340000000000000000000000005675e8037a4c0e32ba06124313680bdd3393c90f0000000000000000000000005675e8037a4c0e32ba06124313680bdd3393c90f00000000000000000000000000000000000000000000000000005af3107a400000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -4600,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec340000000000000000000000002e44fce3fdd9ea80ef3e6242121a76d08dcb31d20000000000000000000000002e44fce3fdd9ea80ef3e6242121a76d08dcb31d2000000000000000000000000000000000000000000000000005e50b7c568840000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -4601,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec3400000000000000000000000093493ee5a1dc42a1ab6581add73dc2a22fa28cb600000000000000000000000093493ee5a1dc42a1ab6581add73dc2a22fa28cb60000000000000000000000000000000000000000000000000156512561d47e0000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -4602,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec34000000000000000000000000e6991fa0ac2e1276f645a84de8629d3bcf5a451b000000000000000000000000e6991fa0ac2e1276f645a84de8629d3bcf5a451b00000000000000000000000000000000000000000000000000038d7ea4c6800000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -4603,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec340000000000000000000000004f44f957c6cae5adab9bbdb384e5a9b6175bad3f0000000000000000000000004f44f957c6cae5adab9bbdb384e5a9b6175bad3f00000000000000000000000000000000000000000000000000005af3107a400000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -4604,0x10e6593cdda8c58a1d0f14c5164b376352a55f2f,0x467194771dae2967aef3ecbedd3bf9a310c76c65,0xa9f9e6750000000000000000000000006b175474e89094c44da98b954eedeac495271d0f000000000000000000000000da10009cbd5d07dd0cecc66161fc93d7c9000da1000000000000000000000000881057ff08da8464d044bb839bd914daff95a4a5000000000000000000000000881057ff08da8464d044bb839bd914daff95a4a500000000000000000000000000000000000000000000000722bdd19b6c075b8600000000000000000000000000000000000000000000000000000000000000c00000000000000000000000000000000000000000000000000000000000000000,0x810bd9369ed5c762dde5876f844ff6cd0e5f27509168be3d6009900a4df994ca,2022-03-20 08:42:00.000 UTC,0,true -4605,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec340000000000000000000000004f44f957c6cae5adab9bbdb384e5a9b6175bad3f0000000000000000000000004f44f957c6cae5adab9bbdb384e5a9b6175bad3f00000000000000000000000000000000000000000000000000005af3107a400000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -4607,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec340000000000000000000000003b55031d7272324ade1960dcbb916ad6fbbe6ca40000000000000000000000003b55031d7272324ade1960dcbb916ad6fbbe6ca40000000000000000000000000000000000000000000000000155de33a9cfcd0000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -4608,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec3400000000000000000000000028caead6b34e86e9e37c816e5143c1d072a90f3000000000000000000000000028caead6b34e86e9e37c816e5143c1d072a90f3000000000000000000000000000000000000000000000000000005af3107a400000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -4609,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec340000000000000000000000004b436f6d8db824a46524610bbf67463f822376390000000000000000000000004b436f6d8db824a46524610bbf67463f8223763900000000000000000000000000000000000000000000000000005af3107a400000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -4610,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec34000000000000000000000000f46da3e42ffa142be596d5bd81d464e99edca3d6000000000000000000000000f46da3e42ffa142be596d5bd81d464e99edca3d600000000000000000000000000000000000000000000000000005af3107a400000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -4611,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec34000000000000000000000000a2c67be3dbe29ce0273b0e6876a00e1e0f52dcf0000000000000000000000000a2c67be3dbe29ce0273b0e6876a00e1e0f52dcf000000000000000000000000000000000000000000000000000005af3107a400000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -4612,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec340000000000000000000000000188632ee3c4e8c7b3e4a7f1315e1b0e1e8db4f00000000000000000000000000188632ee3c4e8c7b3e4a7f1315e1b0e1e8db4f000000000000000000000000000000000000000000000000000005af3107a400000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -4613,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec340000000000000000000000004bb84c87410baa2836a3b4271c25cce24ba5119b0000000000000000000000004bb84c87410baa2836a3b4271c25cce24ba5119b00000000000000000000000000000000000000000000000000005af3107a400000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -4615,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec34000000000000000000000000bdd974c9081b38392fc2ea125f933666f0cb25b7000000000000000000000000bdd974c9081b38392fc2ea125f933666f0cb25b700000000000000000000000000000000000000000000000000470de4df82000000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -4616,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec34000000000000000000000000ea3803125845d12ea9a1e5f882198d7bb796ace8000000000000000000000000ea3803125845d12ea9a1e5f882198d7bb796ace800000000000000000000000000000000000000000000000000005af3107a400000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -4617,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec3400000000000000000000000061365358ff2bcc08cf81f22b37d97ab3d8c9924000000000000000000000000061365358ff2bcc08cf81f22b37d97ab3d8c99240000000000000000000000000000000000000000000000000004a2a1962946af400000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -4618,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec34000000000000000000000000657359a2a5d4ce8cfbca626974c0583d59b072cc000000000000000000000000657359a2a5d4ce8cfbca626974c0583d59b072cc00000000000000000000000000000000000000000000000000005af3107a400000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -4621,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec340000000000000000000000005a9f489a464a5818f4bcea5b02d149eafa8e6c7d0000000000000000000000005a9f489a464a5818f4bcea5b02d149eafa8e6c7d00000000000000000000000000000000000000000000000000038d7ea4c6800000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,0xdd3844b58cc9690689eb793943820248680041ad57ac66047f723744d50e8b47,2022-02-05 12:03:31.000 UTC,0,true -4622,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec34000000000000000000000000ce34e2d460771465ed2632e61fe5c4786c9ab631000000000000000000000000ce34e2d460771465ed2632e61fe5c4786c9ab6310000000000000000000000000000000000000000000000000143fa62d016580a00000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -4624,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec34000000000000000000000000df7df9267d415da4f85db9b14c8a7ecb6f093560000000000000000000000000df7df9267d415da4f85db9b14c8a7ecb6f093560000000000000000000000000000000000000000000000000008e1bc9bf04000000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -4625,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec340000000000000000000000006dbfea06f4151be174ed028870bf84256d98fd210000000000000000000000006dbfea06f4151be174ed028870bf84256d98fd210000000000000000000000000000000000000000000000000019de62d821790000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -4626,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec34000000000000000000000000a6780b375cae098a3bb5c465753e57386d0f7023000000000000000000000000a6780b375cae098a3bb5c465753e57386d0f7023000000000000000000000000000000000000000000000000007fb3ac485c2b0000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -4627,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec34000000000000000000000000f7c31c0279ebe723922f1a5864d8c8a4a0a2810d000000000000000000000000f7c31c0279ebe723922f1a5864d8c8a4a0a2810d0000000000000000000000000000000000000000000000000016884418270b0000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -4628,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec34000000000000000000000000ee7dfb575538c2d33783fdef89dc18de0ffd09e1000000000000000000000000ee7dfb575538c2d33783fdef89dc18de0ffd09e10000000000000000000000000000000000000000000000000016841229ba7e0000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -4629,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec34000000000000000000000000ff0ed05999292f9c586db005e5992aa7289ac2f1000000000000000000000000ff0ed05999292f9c586db005e5992aa7289ac2f10000000000000000000000000000000000000000000000000016841229ba7e0000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -4630,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec340000000000000000000000004826af4b70b248fd9377615ec4409d92cbe5a9fd0000000000000000000000004826af4b70b248fd9377615ec4409d92cbe5a9fd00000000000000000000000000000000000000000000000000084e1796a07e0000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -4631,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec340000000000000000000000006a13b69bb3cd138757f58c59c16eed00b43cc60f0000000000000000000000006a13b69bb3cd138757f58c59c16eed00b43cc60f0000000000000000000000000000000000000000000000000012f8411785d00000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -4632,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec340000000000000000000000007cac2ad175c5b87be2b45688c9f64b74ddfa2d1b0000000000000000000000007cac2ad175c5b87be2b45688c9f64b74ddfa2d1b000000000000000000000000000000000000000000000000000bdd43cdf8d00000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -4633,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec3400000000000000000000000045026d1eb0212a7cf9ff202f7abd0ac06778597800000000000000000000000045026d1eb0212a7cf9ff202f7abd0ac06778597800000000000000000000000000000000000000000000000000034fbb6ccf09e500000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -4634,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec34000000000000000000000000d0b2b774a915cb4b1ef7fc433dd48fd186e0d251000000000000000000000000d0b2b774a915cb4b1ef7fc433dd48fd186e0d2510000000000000000000000000000000000000000000000000013a17452a0070000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -4635,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec3400000000000000000000000073b919fbeb9b767466c254b9c438f00c2ace0ff500000000000000000000000073b919fbeb9b767466c254b9c438f00c2ace0ff50000000000000000000000000000000000000000000000000013a17452a0070000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -4636,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec34000000000000000000000000ea0d1c1b2807613c72ea2b8940674ed599b5d724000000000000000000000000ea0d1c1b2807613c72ea2b8940674ed599b5d72400000000000000000000000000000000000000000000000000071afd498d000000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -4638,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec34000000000000000000000000e80dc71b16c059edf302e1d5b151a537696e03da000000000000000000000000e80dc71b16c059edf302e1d5b151a537696e03da00000000000000000000000000000000000000000000000000066327c7fe069700000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -4639,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec34000000000000000000000000f521d0b62a19d3227e16acc4a8b93ace6f76132e000000000000000000000000f521d0b62a19d3227e16acc4a8b93ace6f76132e000000000000000000000000000000000000000000000000000a0b38dc6ac8f900000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -4641,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec3400000000000000000000000045026d1eb0212a7cf9ff202f7abd0ac06778597800000000000000000000000045026d1eb0212a7cf9ff202f7abd0ac06778597800000000000000000000000000000000000000000000000000005af3107a400000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -4642,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec34000000000000000000000000b173e192bde6c29bf42b3777b024df38e56663eb000000000000000000000000b173e192bde6c29bf42b3777b024df38e56663eb00000000000000000000000000000000000000000000000000524886156d2a9800000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -4643,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec34000000000000000000000000f351d019ba2727168b9b53331216a927b87fb95d000000000000000000000000f351d019ba2727168b9b53331216a927b87fb95d000000000000000000000000000000000000000000000000017f373a83613d0000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -4644,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec34000000000000000000000000c81fb1989d329ae0ab48fa69494c26bf244cf50b000000000000000000000000c81fb1989d329ae0ab48fa69494c26bf244cf50b0000000000000000000000000000000000000000000000000098e5d97c95e83a00000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -4645,0x10e6593cdda8c58a1d0f14c5164b376352a55f2f,0x467194771dae2967aef3ecbedd3bf9a310c76c65,0xa9f9e6750000000000000000000000006b175474e89094c44da98b954eedeac495271d0f000000000000000000000000da10009cbd5d07dd0cecc66161fc93d7c9000da1000000000000000000000000c12bbd6f806a33406c33e6ad708bf20162269924000000000000000000000000c12bbd6f806a33406c33e6ad708bf20162269924000000000000000000000000000000000000000000000000000000000000091200000000000000000000000000000000000000000000000000000000000000c00000000000000000000000000000000000000000000000000000000000000000,,,1,true -4646,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec34000000000000000000000000f7cd438311c7919adc2475b50c9aaffd89ec76d9000000000000000000000000f7cd438311c7919adc2475b50c9aaffd89ec76d9000000000000000000000000000000000000000000000000000e35fa931a000000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -4647,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec34000000000000000000000000dccddb7432b7371745233410c943f4882df07937000000000000000000000000dccddb7432b7371745233410c943f4882df0793700000000000000000000000000000000000000000000000000038d7ea4c6800000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -4648,0x10e6593cdda8c58a1d0f14c5164b376352a55f2f,0x467194771dae2967aef3ecbedd3bf9a310c76c65,0xa9f9e6750000000000000000000000006b175474e89094c44da98b954eedeac495271d0f000000000000000000000000da10009cbd5d07dd0cecc66161fc93d7c9000da1000000000000000000000000e4ebf512413efb8902929fda582a8619928210e8000000000000000000000000e4ebf512413efb8902929fda582a8619928210e8000000000000000000000000000000000000000000000000000000000000065100000000000000000000000000000000000000000000000000000000000000c00000000000000000000000000000000000000000000000000000000000000000,,,1,true -4650,0x10e6593cdda8c58a1d0f14c5164b376352a55f2f,0x467194771dae2967aef3ecbedd3bf9a310c76c65,0xa9f9e6750000000000000000000000006b175474e89094c44da98b954eedeac495271d0f000000000000000000000000da10009cbd5d07dd0cecc66161fc93d7c9000da1000000000000000000000000b800cf62d8017003d56aa100359253f478121c54000000000000000000000000b800cf62d8017003d56aa100359253f478121c540000000000000000000000000000000000000000000000000000000000000e4500000000000000000000000000000000000000000000000000000000000000c00000000000000000000000000000000000000000000000000000000000000000,,,1,true -4651,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec3400000000000000000000000060c8a712ad7995eee20945c174cec13a8228eabc00000000000000000000000060c8a712ad7995eee20945c174cec13a8228eabc000000000000000000000000000000000000000000000000002e2f6e5e14800000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -4652,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec34000000000000000000000000a29ea6dea81530b173a29cd3815be9868285e438000000000000000000000000a29ea6dea81530b173a29cd3815be9868285e43800000000000000000000000000000000000000000000000000b91d6c2e956c6800000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -4653,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec34000000000000000000000000ff9f20367488f3386a97bc3897798b0e8bd1b2da000000000000000000000000ff9f20367488f3386a97bc3897798b0e8bd1b2da000000000000000000000000000000000000000000000000002aa1efb94e000000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -4655,0x10e6593cdda8c58a1d0f14c5164b376352a55f2f,0x467194771dae2967aef3ecbedd3bf9a310c76c65,0xa9f9e6750000000000000000000000006b175474e89094c44da98b954eedeac495271d0f000000000000000000000000da10009cbd5d07dd0cecc66161fc93d7c9000da10000000000000000000000004aef5372bf1cc6b50be36dbe09038fa6c34db05c0000000000000000000000004aef5372bf1cc6b50be36dbe09038fa6c34db05c000000000000000000000000000000000000000000000000000000000000049f00000000000000000000000000000000000000000000000000000000000000c00000000000000000000000000000000000000000000000000000000000000000,,,1,true -4656,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec34000000000000000000000000f2c5b9949add165aa74b784a55b14ab57e8845d5000000000000000000000000f2c5b9949add165aa74b784a55b14ab57e8845d5000000000000000000000000000000000000000000000000002386f26fc1000000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -4658,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0xa9f9e675000000000000000000000000a0b86991c6218b36c1d19d4a2e9eb0ce3606eb480000000000000000000000007f5c764cbc14f9669b88837ca1490cca17c316070000000000000000000000007da0e97cb78832463914392b5d414c1befa1fb010000000000000000000000007da0e97cb78832463914392b5d414c1befa1fb01000000000000000000000000000000000000000000000000000000000032825100000000000000000000000000000000000000000000000000000000000000c00000000000000000000000000000000000000000000000000000000000000000,,,1,true -4659,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec34000000000000000000000000491d7f48150522596262d677792306732863b0ef000000000000000000000000491d7f48150522596262d677792306732863b0ef00000000000000000000000000000000000000000000000000998737e2cb495000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -4660,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec3400000000000000000000000007c9bae1d479858ef7dde063c0cce31f1ec2fbcb00000000000000000000000007c9bae1d479858ef7dde063c0cce31f1ec2fbcb0000000000000000000000000000000000000000000000000051aa3873ec5e9700000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -4663,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec340000000000000000000000008c60d93b1a9bcce3791c53d05d63e41fa7a67aa10000000000000000000000008c60d93b1a9bcce3791c53d05d63e41fa7a67aa1000000000000000000000000000000000000000000000000002bf6299af051dc00000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -4665,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec34000000000000000000000000ff9ddb1f1a0174ff61c935232b2c84c122c4d7d8000000000000000000000000ff9ddb1f1a0174ff61c935232b2c84c122c4d7d800000000000000000000000000000000000000000000000000038d7ea4c6800000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -4666,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec3400000000000000000000000003dc2ff9d48cd59085b37cbaae8d56948780373600000000000000000000000003dc2ff9d48cd59085b37cbaae8d56948780373600000000000000000000000000000000000000000000000000524d9e87e7c05700000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -4668,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec340000000000000000000000004ae3f69994b090f2531ae452c20c5a573ed8d81e0000000000000000000000004ae3f69994b090f2531ae452c20c5a573ed8d81e00000000000000000000000000000000000000000000000000354a6ba7a1800000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -4669,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec3400000000000000000000000063496a256167a704445108df3da25a3e8f1a4de300000000000000000000000063496a256167a704445108df3da25a3e8f1a4de3000000000000000000000000000000000000000000000000000110d9316ec00000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -4670,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec34000000000000000000000000100f82b00e6488ae8c2c6cda5f3162c0fc0107da000000000000000000000000100f82b00e6488ae8c2c6cda5f3162c0fc0107da00000000000000000000000000000000000000000000000000a025b14927e11d00000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,0x47f8bafbbd4811a8bb6ef5d35f41be99e56befb6aa95f3db93d0b16a8c9b1145,2022-05-07 12:37:46.000 UTC,0,true -4672,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec34000000000000000000000000bc34cb3b39ee317e1f353c71b4542ecbd23357f4000000000000000000000000bc34cb3b39ee317e1f353c71b4542ecbd23357f400000000000000000000000000000000000000000000000001151c96347b000000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -4673,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec340000000000000000000000000d88f2e415698f472b265d45f0bcc65f61c405b80000000000000000000000000d88f2e415698f472b265d45f0bcc65f61c405b8000000000000000000000000000000000000000000000000027f7d0bdb92000000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -4677,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec34000000000000000000000000416365993481e52e0472e7417656276d4e147a00000000000000000000000000416365993481e52e0472e7417656276d4e147a000000000000000000000000000000000000000000000000000007428a3d7d935900000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -4678,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec3400000000000000000000000037f7ff1864f5d5cba2b63592656049f2d7d06fb400000000000000000000000037f7ff1864f5d5cba2b63592656049f2d7d06fb4000000000000000000000000000000000000000000000000002c0febc3181f9600000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -4679,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec34000000000000000000000000b36f1cd4ad753bc4034ef24f45b97606041f7066000000000000000000000000b36f1cd4ad753bc4034ef24f45b97606041f7066000000000000000000000000000000000000000000000000001ec9302bd03c0000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -4681,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec34000000000000000000000000b89bdb7d7bf95273b0d783ee88980fbfc80a269f000000000000000000000000b89bdb7d7bf95273b0d783ee88980fbfc80a269f000000000000000000000000000000000000000000000000004ce03d590bb81f00000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -4682,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec340000000000000000000000001666859ff3c6e3bfcb6165be7a93141afefa8b6c0000000000000000000000001666859ff3c6e3bfcb6165be7a93141afefa8b6c000000000000000000000000000000000000000000000000001c72680ad8210000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -4683,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec340000000000000000000000007870cbe0a8dfd925988cc51a3707378018e96c130000000000000000000000007870cbe0a8dfd925988cc51a3707378018e96c13000000000000000000000000000000000000000000000000008e1bc9bf04000000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -4684,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec340000000000000000000000005e72d65bfbc2d89662406037c860fa794ea914a50000000000000000000000005e72d65bfbc2d89662406037c860fa794ea914a50000000000000000000000000000000000000000000000000002c544cfdfac3a00000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -4687,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec340000000000000000000000007373f50c13ab510517edae5a632c9896e04ad46e0000000000000000000000007373f50c13ab510517edae5a632c9896e04ad46e0000000000000000000000000000000000000000000000000018e48641d0a88000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -4688,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec340000000000000000000000002cfc429665e84fbe34c73caca17942decbd55bb00000000000000000000000002cfc429665e84fbe34c73caca17942decbd55bb0000000000000000000000000000000000000000000000000002e2f6e5e14800000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -4689,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec34000000000000000000000000f9de87ee602681da783dcb73bdd43e04a11a6f14000000000000000000000000f9de87ee602681da783dcb73bdd43e04a11a6f1400000000000000000000000000000000000000000000000001f4e4fb104dd60a00000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -4690,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec340000000000000000000000000655efb468c40ac277e2b4605f70c3063bae3f6c0000000000000000000000000655efb468c40ac277e2b4605f70c3063bae3f6c000000000000000000000000000000000000000000000000006d7e3a7f6235ed00000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -4691,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec340000000000000000000000007a928306c20bbe9a3adfda0243b562dad439b7860000000000000000000000007a928306c20bbe9a3adfda0243b562dad439b786000000000000000000000000000000000000000000000000000110d9316ec00000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -4692,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec3400000000000000000000000027971daeb537ac9597cca37800ad64037fe53bac00000000000000000000000027971daeb537ac9597cca37800ad64037fe53bac000000000000000000000000000000000000000000000000003dfd235cfbf35b00000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -4697,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec3400000000000000000000000058101605da53b9d7727677d1922ee752dde7fa9f00000000000000000000000058101605da53b9d7727677d1922ee752dde7fa9f00000000000000000000000000000000000000000000000000470de4df82000000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -4699,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec340000000000000000000000005ee4bb8cf037a6c88da5fc3e84f5e260984daeb30000000000000000000000005ee4bb8cf037a6c88da5fc3e84f5e260984daeb3000000000000000000000000000000000000000000000000002386f26fc1000000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -4700,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec3400000000000000000000000089cdd0275599011b4eed9e168149b07aad983b2300000000000000000000000089cdd0275599011b4eed9e168149b07aad983b2300000000000000000000000000000000000000000000000000038d7ea4c6800000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -4701,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec34000000000000000000000000c39dc8a181bf7ea6fd59f7883a43e1aa220b7d99000000000000000000000000c39dc8a181bf7ea6fd59f7883a43e1aa220b7d9900000000000000000000000000000000000000000000000001225bdfc6a0575c00000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -4702,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec34000000000000000000000000fd39664cbdafc960e3d022aa0c50ea1ec0c23d60000000000000000000000000fd39664cbdafc960e3d022aa0c50ea1ec0c23d6000000000000000000000000000000000000000000000000000026f1fa8f7e59d00000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -4703,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec3400000000000000000000000089cdd0275599011b4eed9e168149b07aad983b2300000000000000000000000089cdd0275599011b4eed9e168149b07aad983b2300000000000000000000000000000000000000000000000000038d7ea4c6800000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -4704,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec3400000000000000000000000006f4acf78fc4749051e2c3203ca21ed2afa7d39300000000000000000000000006f4acf78fc4749051e2c3203ca21ed2afa7d393000000000000000000000000000000000000000000000000006ac43025170d3600000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -4705,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec34000000000000000000000000faa5d7211dfa5669948434efbf5e701b22625852000000000000000000000000faa5d7211dfa5669948434efbf5e701b22625852000000000000000000000000000000000000000000000000003b1671687d05fd00000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -4706,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec34000000000000000000000000ac642a2dd6fbdbe118bf5ae8e5ef5d7f573a07e4000000000000000000000000ac642a2dd6fbdbe118bf5ae8e5ef5d7f573a07e4000000000000000000000000000000000000000000000000001f17df00fba6d200000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -4707,0x10e6593cdda8c58a1d0f14c5164b376352a55f2f,0x467194771dae2967aef3ecbedd3bf9a310c76c65,0xa9f9e6750000000000000000000000006b175474e89094c44da98b954eedeac495271d0f000000000000000000000000da10009cbd5d07dd0cecc66161fc93d7c9000da1000000000000000000000000e84429bcdc2362e8af0c82aa7a02214cbf2b0eaf000000000000000000000000e84429bcdc2362e8af0c82aa7a02214cbf2b0eaf00000000000000000000000000000000000000000000000ad78ebc5ac620000000000000000000000000000000000000000000000000000000000000000000c00000000000000000000000000000000000000000000000000000000000000000,,,1,true -4708,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec34000000000000000000000000e84429bcdc2362e8af0c82aa7a02214cbf2b0eaf000000000000000000000000e84429bcdc2362e8af0c82aa7a02214cbf2b0eaf0000000000000000000000000000000000000000000000000142a3635c5511c000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -4710,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec340000000000000000000000005c951c03c0f66a9e38110de89857d9d05c972f860000000000000000000000005c951c03c0f66a9e38110de89857d9d05c972f8600000000000000000000000000000000000000000000000002c68af0bb14000000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -4711,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec3400000000000000000000000013f729864e43ea27ee473fb51ceabf3936f4ccef00000000000000000000000013f729864e43ea27ee473fb51ceabf3936f4ccef00000000000000000000000000000000000000000000000000038d7ea4c6800000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -4712,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec3400000000000000000000000003834cd6774ccfcd3c865a39732d1d8b20abdad700000000000000000000000003834cd6774ccfcd3c865a39732d1d8b20abdad70000000000000000000000000000000000000000000000000050708e44eec39c00000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -4713,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec340000000000000000000000004743ed9e06fe530798654e27db3508fa146836710000000000000000000000004743ed9e06fe530798654e27db3508fa146836710000000000000000000000000000000000000000000000000045a3f57118602e00000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -4714,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec3400000000000000000000000036e48e548c8ed0ae685bcba3ca37640870fc9ed100000000000000000000000036e48e548c8ed0ae685bcba3ca37640870fc9ed1000000000000000000000000000000000000000000000000005fe1346ab04c0000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,0x109bac4441f95254ad48117cf081251a8e1947959ef78b7b4305dcf14426797f,2022-03-15 08:25:53.000 UTC,0,true -4716,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec34000000000000000000000000b9cd2daac4e0ebcf2da51705a0f02eee13072c3c000000000000000000000000b9cd2daac4e0ebcf2da51705a0f02eee13072c3c00000000000000000000000000000000000000000000000001141c07aace4f4300000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -4717,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec340000000000000000000000000e37e33d1325122da5d901292e9b6bda142146000000000000000000000000000e37e33d1325122da5d901292e9b6bda1421460000000000000000000000000000000000000000000000000000220d4ce149553000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -4718,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec340000000000000000000000008db8b5cffaf0ab0bcc91906bf5a6739afd9058770000000000000000000000008db8b5cffaf0ab0bcc91906bf5a6739afd90587700000000000000000000000000000000000000000000000000420c32792d715800000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -4720,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec340000000000000000000000008a8f00438d53e09c3c5813d42cabf3c8a912cf700000000000000000000000008a8f00438d53e09c3c5813d42cabf3c8a912cf7000000000000000000000000000000000000000000000000000470de4df82000000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -4721,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec34000000000000000000000000b937a4938eaef8d5525f156defb83a9382c4cc14000000000000000000000000b937a4938eaef8d5525f156defb83a9382c4cc1400000000000000000000000000000000000000000000000000005af3107a400000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -4724,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec34000000000000000000000000d2a8a73cd8f888da3e8beba1fcacf50ab8be301f000000000000000000000000d2a8a73cd8f888da3e8beba1fcacf50ab8be301f0000000000000000000000000000000000000000000000000003e871b540c00000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -4725,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec340000000000000000000000002c2cc945dcb203a4e88639dce34c647337503ae30000000000000000000000002c2cc945dcb203a4e88639dce34c647337503ae3000000000000000000000000000000000000000000000000003e5e2afb21c1ed00000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -4726,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec34000000000000000000000000ab5b1148453093aa5d4c6cf6bb7b3a373b4ff620000000000000000000000000ab5b1148453093aa5d4c6cf6bb7b3a373b4ff620000000000000000000000000000000000000000000000000000009184e72a00000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -4727,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec3400000000000000000000000089c8121115955831056958861c6800f0298b820a00000000000000000000000089c8121115955831056958861c6800f0298b820a000000000000000000000000000000000000000000000000016799f60ae1ead600000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,0x5d3aec761a1bb488b5356307b70f328f0e339112dc367fcc06eb69983e430ff5,2022-04-23 09:43:47.000 UTC,0,true -4729,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec340000000000000000000000004454f2128db755031e43f63ed5113f93bfc70f130000000000000000000000004454f2128db755031e43f63ed5113f93bfc70f13000000000000000000000000000000000000000000000000000009184e72a00000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -4730,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec34000000000000000000000000b4fdaf72796a7cdf40382a12a63b228088d755c2000000000000000000000000b4fdaf72796a7cdf40382a12a63b228088d755c2000000000000000000000000000000000000000000000000000009184e72a00000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -4731,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec340000000000000000000000003309ffbc8665d129a0dc3ffe1b1e9976445f60de0000000000000000000000003309ffbc8665d129a0dc3ffe1b1e9976445f60de000000000000000000000000000000000000000000000000000009184e72a00000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -4733,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec340000000000000000000000000ecd74bb8f8f5cdd94b1f429d03e2d16c31cb1d10000000000000000000000000ecd74bb8f8f5cdd94b1f429d03e2d16c31cb1d1000000000000000000000000000000000000000000000000000009184e72a00000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -4734,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec340000000000000000000000000dbf317122027066b969b847a1e21d0bde4a1ee10000000000000000000000000dbf317122027066b969b847a1e21d0bde4a1ee1000000000000000000000000000000000000000000000000010ee8c900c3f34000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -4735,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec34000000000000000000000000c9f6ba779a33b8e230d5794e9e159b9122f78e08000000000000000000000000c9f6ba779a33b8e230d5794e9e159b9122f78e08000000000000000000000000000000000000000000000000000009184e72a00000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -4736,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec340000000000000000000000005bb6fa6f73683f145c627ba1f46781b1a56817350000000000000000000000005bb6fa6f73683f145c627ba1f46781b1a5681735000000000000000000000000000000000000000000000000000009184e72a00000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -4737,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec34000000000000000000000000f3405dc862b8acfca80f06c40a0287e351964557000000000000000000000000f3405dc862b8acfca80f06c40a0287e351964557000000000000000000000000000000000000000000000000000009184e72a00000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -4738,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec340000000000000000000000005c1ed8c5739c256bc1c7c32887bf4af86f4324f70000000000000000000000005c1ed8c5739c256bc1c7c32887bf4af86f4324f7000000000000000000000000000000000000000000000000000009184e72a00000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -4739,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec34000000000000000000000000c732272e39a7b9a628465098fda86968d3a7d740000000000000000000000000c732272e39a7b9a628465098fda86968d3a7d740000000000000000000000000000000000000000000000000000009184e72a00000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -4741,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec34000000000000000000000000cd1ef68bff82f8501ad607567488fc03a4cb594d000000000000000000000000cd1ef68bff82f8501ad607567488fc03a4cb594d000000000000000000000000000000000000000000000000000009184e72a00000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -4742,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec34000000000000000000000000668689179097d44aa0919d0f2e3a8a9d539ca524000000000000000000000000668689179097d44aa0919d0f2e3a8a9d539ca524000000000000000000000000000000000000000000000000000009184e72a00000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -4743,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec340000000000000000000000004a4a8fff4c203387148bcaec54a82da00d4e2cba0000000000000000000000004a4a8fff4c203387148bcaec54a82da00d4e2cba000000000000000000000000000000000000000000000000000009184e72a00000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -4744,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec3400000000000000000000000049f5b222888775a0d45dc0ce38e462dcdc9c6f7300000000000000000000000049f5b222888775a0d45dc0ce38e462dcdc9c6f73000000000000000000000000000000000000000000000000000009184e72a00000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -4745,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec3400000000000000000000000044dd1c77393e95166ef23a0ec525efc6ea1da1a800000000000000000000000044dd1c77393e95166ef23a0ec525efc6ea1da1a8000000000000000000000000000000000000000000000000000009184e72a00000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -4746,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec340000000000000000000000004c29fd8fb70c7b6bec53164f3e501686df90f67c0000000000000000000000004c29fd8fb70c7b6bec53164f3e501686df90f67c000000000000000000000000000000000000000000000000000009184e72a00000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -4747,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec34000000000000000000000000cc852fae19bf05c7b6135afa27a7ff168d8fbcaa000000000000000000000000cc852fae19bf05c7b6135afa27a7ff168d8fbcaa000000000000000000000000000000000000000000000000000009184e72a00000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -4748,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec3400000000000000000000000061fea594187504cfe6b148699a3ca5835572f3b900000000000000000000000061fea594187504cfe6b148699a3ca5835572f3b9000000000000000000000000000000000000000000000000000009184e72a00000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -4749,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec34000000000000000000000000a18c44237322b8a6e2fd749e71817db64e62f9b1000000000000000000000000a18c44237322b8a6e2fd749e71817db64e62f9b1000000000000000000000000000000000000000000000000000009184e72a00000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -4750,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec3400000000000000000000000031df8042fee3fd9aafa4002b75d2555e249996a500000000000000000000000031df8042fee3fd9aafa4002b75d2555e249996a5000000000000000000000000000000000000000000000000000009184e72a00000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -4751,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec340000000000000000000000004d6bc66c28294abe7b1eec57caf17d1ec9b368220000000000000000000000004d6bc66c28294abe7b1eec57caf17d1ec9b36822000000000000000000000000000000000000000000000000000009184e72a00000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -4752,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec34000000000000000000000000a8dbcde95465f64ab7db516c77f198e83030485c000000000000000000000000a8dbcde95465f64ab7db516c77f198e83030485c000000000000000000000000000000000000000000000000000009184e72a00000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -4753,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec340000000000000000000000006a2d58ce3df52bd8e6d3f67ce476d034a7f30f0b0000000000000000000000006a2d58ce3df52bd8e6d3f67ce476d034a7f30f0b000000000000000000000000000000000000000000000000000009184e72a00000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -4754,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec34000000000000000000000000ca47c17967c740085df98db42c65fd6897c827ac000000000000000000000000ca47c17967c740085df98db42c65fd6897c827ac000000000000000000000000000000000000000000000000004b98dffd817b3100000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -4755,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec3400000000000000000000000009b15debe0d17473d5cbd655e475567c08bea32400000000000000000000000009b15debe0d17473d5cbd655e475567c08bea324000000000000000000000000000000000000000000000000000009184e72a00000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -4756,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec3400000000000000000000000041a40816f4ba5f979aa1249b51220b4f4296205500000000000000000000000041a40816f4ba5f979aa1249b51220b4f42962055000000000000000000000000000000000000000000000000000009184e72a00000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -4757,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec34000000000000000000000000efffcf5297bee262fcc9a283ebbf8745939b90b9000000000000000000000000efffcf5297bee262fcc9a283ebbf8745939b90b9000000000000000000000000000000000000000000000000000009184e72a00000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -4758,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec3400000000000000000000000013f550f918df5800619d5eb884beb5bf20b52b3600000000000000000000000013f550f918df5800619d5eb884beb5bf20b52b36000000000000000000000000000000000000000000000000000009184e72a00000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -4759,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec3400000000000000000000000078509bedf3de8c803604335951080de8ab35631300000000000000000000000078509bedf3de8c803604335951080de8ab356313000000000000000000000000000000000000000000000000000009184e72a00000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -4760,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec340000000000000000000000006a8fa6774d7e952992b26c3949eeab9dedade0990000000000000000000000006a8fa6774d7e952992b26c3949eeab9dedade099000000000000000000000000000000000000000000000000000009184e72a00000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -4761,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec3400000000000000000000000075179bc29d0f22268496f0389e89bf18e4a8a16600000000000000000000000075179bc29d0f22268496f0389e89bf18e4a8a166000000000000000000000000000000000000000000000000000009184e72a00000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -4762,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec3400000000000000000000000054b81b4acfcba29164b43b600d66359ed15d296300000000000000000000000054b81b4acfcba29164b43b600d66359ed15d2963000000000000000000000000000000000000000000000000000009184e72a00000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -4763,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec3400000000000000000000000043c213b5cd3229ba96ac096b2f1a3f7aa7637c2300000000000000000000000043c213b5cd3229ba96ac096b2f1a3f7aa7637c23000000000000000000000000000000000000000000000000000009184e72a00000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -4764,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec3400000000000000000000000032c15485930203d0ea3a57cd17d2d1fb1d76f0f600000000000000000000000032c15485930203d0ea3a57cd17d2d1fb1d76f0f6000000000000000000000000000000000000000000000000000009184e72a00000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -4765,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec3400000000000000000000000096f6acd6573c41accb01f4d391ef8437a1d9d12200000000000000000000000096f6acd6573c41accb01f4d391ef8437a1d9d122000000000000000000000000000000000000000000000000000009184e72a00000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -4766,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec3400000000000000000000000087ad6c4137d73352937d1e784c51787808a5221400000000000000000000000087ad6c4137d73352937d1e784c51787808a52214000000000000000000000000000000000000000000000000000009184e72a00000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -4767,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec34000000000000000000000000840dcb18ddd75d048f3c0320687017dd7420b638000000000000000000000000840dcb18ddd75d048f3c0320687017dd7420b6380000000000000000000000000000000000000000000000000006f2051af0d67d00000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -4768,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec34000000000000000000000000d94be38ddce7331e6b393f05060a1089a5c0b73f000000000000000000000000d94be38ddce7331e6b393f05060a1089a5c0b73f000000000000000000000000000000000000000000000000000009184e72a00000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -4769,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec340000000000000000000000008eef779818afa953b0652e45438423ebe089f55a0000000000000000000000008eef779818afa953b0652e45438423ebe089f55a0000000000000000000000000000000000000000000000000040555d5f7f9c0000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -4770,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec340000000000000000000000002808f7a3ffb1d1ab93020c662bce8630e82ef5870000000000000000000000002808f7a3ffb1d1ab93020c662bce8630e82ef587000000000000000000000000000000000000000000000000001d1916ea179d0000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -4771,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec34000000000000000000000000a102cd7610a51ccf33fd837bc4b51fbe45986766000000000000000000000000a102cd7610a51ccf33fd837bc4b51fbe45986766000000000000000000000000000000000000000000000000000009184e72a00000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -4772,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec34000000000000000000000000de63c51d5db76e8a6286c8a95cf8bf040630aa12000000000000000000000000de63c51d5db76e8a6286c8a95cf8bf040630aa12000000000000000000000000000000000000000000000000000009184e72a00000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -4773,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec34000000000000000000000000774b8d5187e46b2466d9f93253b043de211d25ee000000000000000000000000774b8d5187e46b2466d9f93253b043de211d25ee000000000000000000000000000000000000000000000000000009184e72a00000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -4775,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec340000000000000000000000004934a209bdad5dc81f69344c20e083800062b78b0000000000000000000000004934a209bdad5dc81f69344c20e083800062b78b000000000000000000000000000000000000000000000000009a6a7f0bb4975c00000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -4776,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec3400000000000000000000000093ae918fee314a1d5f01e153273f4b906a03fb4300000000000000000000000093ae918fee314a1d5f01e153273f4b906a03fb43000000000000000000000000000000000000000000000000000009184e72a00000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -4777,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec3400000000000000000000000019a10dae9aa55939b48eb5883f058212c2e461de00000000000000000000000019a10dae9aa55939b48eb5883f058212c2e461de000000000000000000000000000000000000000000000000000009184e72a00000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -4778,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec34000000000000000000000000da800ea1c982da53a97d2b3648ca06f7073332f1000000000000000000000000da800ea1c982da53a97d2b3648ca06f7073332f1000000000000000000000000000000000000000000000000005fa48c4590b34000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -4779,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec34000000000000000000000000fb7c5932a406301b421cfa87bc084c7e4ec50ffb000000000000000000000000fb7c5932a406301b421cfa87bc084c7e4ec50ffb000000000000000000000000000000000000000000000000000009184e72a00000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -4781,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec340000000000000000000000006cf220738ebca441142a4a9e04f1acc54e33ede70000000000000000000000006cf220738ebca441142a4a9e04f1acc54e33ede7000000000000000000000000000000000000000000000000000009184e72a00000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -4782,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec34000000000000000000000000c1b2f28da2b5ba4a0cc8810b37050c144eccee4f000000000000000000000000c1b2f28da2b5ba4a0cc8810b37050c144eccee4f000000000000000000000000000000000000000000000000000009184e72a00000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -4783,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec34000000000000000000000000128be462b4c51a03d24841f13bb76357b946dc30000000000000000000000000128be462b4c51a03d24841f13bb76357b946dc30000000000000000000000000000000000000000000000000000009184e72a00000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -4784,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec340000000000000000000000005dbada3143b4742ea99609f99d467b77bf314c720000000000000000000000005dbada3143b4742ea99609f99d467b77bf314c72000000000000000000000000000000000000000000000000005f78996678460000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,0xd7ab4c287251b191148832008d393bcb070212e8bd6cda7b4f74be61fa9029a5,2022-05-28 10:21:39.000 UTC,0,true -4785,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec34000000000000000000000000bc7d7d83538f554b58021ca5f68c5a8370e6aa85000000000000000000000000bc7d7d83538f554b58021ca5f68c5a8370e6aa85000000000000000000000000000000000000000000000000000009184e72a00000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -4786,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec340000000000000000000000003621a4ceca5abceb6edb07261777ca761c06a3180000000000000000000000003621a4ceca5abceb6edb07261777ca761c06a318000000000000000000000000000000000000000000000000000009184e72a00000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -4788,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec340000000000000000000000003cfec638039e8226580b1aa18ef7c81594aab4de0000000000000000000000003cfec638039e8226580b1aa18ef7c81594aab4de000000000000000000000000000000000000000000000000000009184e72a00000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -4789,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec34000000000000000000000000565dac8a20c7ba67e2475998ec94891681303bf3000000000000000000000000565dac8a20c7ba67e2475998ec94891681303bf3000000000000000000000000000000000000000000000000000009184e72a00000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -4790,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec340000000000000000000000004a03a2dbbe963f48d6db2f52654865cced8a55a00000000000000000000000004a03a2dbbe963f48d6db2f52654865cced8a55a0000000000000000000000000000000000000000000000000000009184e72a00000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -4791,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec3400000000000000000000000002c7c25035572ac801ae1c1389fbc547e53cefc400000000000000000000000002c7c25035572ac801ae1c1389fbc547e53cefc4000000000000000000000000000000000000000000000000000009184e72a00000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -4792,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec34000000000000000000000000b32969386bf3367efc46f43c847e5f0fbc9e9352000000000000000000000000b32969386bf3367efc46f43c847e5f0fbc9e9352000000000000000000000000000000000000000000000000000009184e72a00000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -4793,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec340000000000000000000000008413db0f5627121d175db1e28a7b9d6a53a057a40000000000000000000000008413db0f5627121d175db1e28a7b9d6a53a057a4000000000000000000000000000000000000000000000000000009184e72a00000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -4794,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec34000000000000000000000000e7bd5bfa094427f38edc4e22b968df5bc628d1ba000000000000000000000000e7bd5bfa094427f38edc4e22b968df5bc628d1ba000000000000000000000000000000000000000000000000000000e8d4a5100000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -4795,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec34000000000000000000000000b515572a7dfa96e3bdcf5da8c07f87c78eb481dd000000000000000000000000b515572a7dfa96e3bdcf5da8c07f87c78eb481dd000000000000000000000000000000000000000000000000000009184e72a00000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -4797,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec340000000000000000000000006704a6ab026013784b12d551910754e6b6d420c80000000000000000000000006704a6ab026013784b12d551910754e6b6d420c80000000000000000000000000000000000000000000000000091cd127707bd5700000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -4798,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec34000000000000000000000000dd53a43681d0f7dc8c7365d9e9e967f0ae439733000000000000000000000000dd53a43681d0f7dc8c7365d9e9e967f0ae439733000000000000000000000000000000000000000000000000000009184e72a00000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -4799,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec3400000000000000000000000047e82d9eaec31f4af15c4e6cf750ee92d4671f4100000000000000000000000047e82d9eaec31f4af15c4e6cf750ee92d4671f41000000000000000000000000000000000000000000000000000009184e72a00000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -4801,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec34000000000000000000000000a6c8e08840c4c1cecf72c210a7767a6bc0708ef6000000000000000000000000a6c8e08840c4c1cecf72c210a7767a6bc0708ef6000000000000000000000000000000000000000000000000000009184e72a00000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -4802,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec340000000000000000000000005d70efdebd7bf7a18d99dc5743775d2403aedca40000000000000000000000005d70efdebd7bf7a18d99dc5743775d2403aedca4000000000000000000000000000000000000000000000000000009184e72a00000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -4803,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec340000000000000000000000003f36f8b6f0978f30e3b4ebc40fffb33614a140870000000000000000000000003f36f8b6f0978f30e3b4ebc40fffb33614a14087000000000000000000000000000000000000000000000000000009184e72a00000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -4804,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec34000000000000000000000000bd60788b1e68b1829698de4220935609c20640d9000000000000000000000000bd60788b1e68b1829698de4220935609c20640d9000000000000000000000000000000000000000000000000000009184e72a00000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -4805,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec340000000000000000000000001d2e5c70cb5be0ac3f98e8541ad5fe8122a77f3f0000000000000000000000001d2e5c70cb5be0ac3f98e8541ad5fe8122a77f3f000000000000000000000000000000000000000000000000000009184e72a00000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -4806,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0xa9f9e675000000000000000000000000dac17f958d2ee523a2206206994597c13d831ec700000000000000000000000094b008aa00579c1307b0ef2c499ad98a8ce58e580000000000000000000000007e44f3d32c23f44e83bc194ec6811d8ddad507b50000000000000000000000007e44f3d32c23f44e83bc194ec6811d8ddad507b5000000000000000000000000000000000000000000000000000000003a09093600000000000000000000000000000000000000000000000000000000000000c00000000000000000000000000000000000000000000000000000000000000000,0xa859406d75f1e8cecd4a0e11a41b5e6cab2afebb99c5d550639fc81141011d66,2022-04-28 08:43:31.000 UTC,0,true -4807,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec340000000000000000000000005caafbe3b1a065656a7d62cfb527f6dd0983769e0000000000000000000000005caafbe3b1a065656a7d62cfb527f6dd0983769e000000000000000000000000000000000000000000000000000009184e72a00000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -4808,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec34000000000000000000000000bf28c3909d77b08aba6535ba714a0e0f247b7e24000000000000000000000000bf28c3909d77b08aba6535ba714a0e0f247b7e24000000000000000000000000000000000000000000000000000009184e72a00000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -4809,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec34000000000000000000000000d3f04dd1048b899a604ead8673e877f74382e83f000000000000000000000000d3f04dd1048b899a604ead8673e877f74382e83f000000000000000000000000000000000000000000000000000009184e72a00000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -4810,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec34000000000000000000000000e9cd2cd9411b9ab2641a96f7f2308997cc8a7ba8000000000000000000000000e9cd2cd9411b9ab2641a96f7f2308997cc8a7ba8000000000000000000000000000000000000000000000000000000e8d4a5100000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -4811,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec34000000000000000000000000193030f0925cb2a303f643f47b885f8884bcde51000000000000000000000000193030f0925cb2a303f643f47b885f8884bcde51000000000000000000000000000000000000000000000000000009184e72a00000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -4812,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec3400000000000000000000000019990c1151ea0d9af1a7f001af99369036c6b37700000000000000000000000019990c1151ea0d9af1a7f001af99369036c6b377000000000000000000000000000000000000000000000000000009184e72a00000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -4813,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec34000000000000000000000000bf6a1374d4ee577e75ff817fb636d5f7a78df437000000000000000000000000bf6a1374d4ee577e75ff817fb636d5f7a78df437000000000000000000000000000000000000000000000000000009184e72a00000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -4814,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec34000000000000000000000000386e85f8041b4c1bb7636187a20d1faf824c7371000000000000000000000000386e85f8041b4c1bb7636187a20d1faf824c7371000000000000000000000000000000000000000000000000000000e8d4a5100000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -4816,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec340000000000000000000000007659f447322b1a7c8a7762d8e887a14036bc79ac0000000000000000000000007659f447322b1a7c8a7762d8e887a14036bc79ac000000000000000000000000000000000000000000000000000009184e72a00000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -4817,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec340000000000000000000000008a6ad7ded9157b42ac20b12fdeb420a1356024c90000000000000000000000008a6ad7ded9157b42ac20b12fdeb420a1356024c9000000000000000000000000000000000000000000000000000000e8d4a5100000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -4818,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec340000000000000000000000004ae8f908ce70b12879af88a94843d1f21bc973630000000000000000000000004ae8f908ce70b12879af88a94843d1f21bc97363000000000000000000000000000000000000000000000000000009184e72a00000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -4819,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec34000000000000000000000000a38840567ef21e89f5e23b701b0d4be22738dd65000000000000000000000000a38840567ef21e89f5e23b701b0d4be22738dd65000000000000000000000000000000000000000000000000000009184e72a00000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -4820,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec34000000000000000000000000eeb9e883dd52bf41d672bf61792d32eec7f7d632000000000000000000000000eeb9e883dd52bf41d672bf61792d32eec7f7d632000000000000000000000000000000000000000000000000000009184e72a00000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -4821,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec34000000000000000000000000df65527e7d88953234614efe4b72cbe7a848fb8a000000000000000000000000df65527e7d88953234614efe4b72cbe7a848fb8a000000000000000000000000000000000000000000000000000009184e72a00000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -4822,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec34000000000000000000000000a07b077c585a0789939520706c9e71207f91e78b000000000000000000000000a07b077c585a0789939520706c9e71207f91e78b000000000000000000000000000000000000000000000000000000e8d4a5100000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -4823,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec34000000000000000000000000bf6ae5bd3f76b1b8a4c8be14e93272ef1c214b77000000000000000000000000bf6ae5bd3f76b1b8a4c8be14e93272ef1c214b77000000000000000000000000000000000000000000000000000009184e72a00000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -4824,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec340000000000000000000000000d9596218d9f81403c542815dbd56d44ee1e920d0000000000000000000000000d9596218d9f81403c542815dbd56d44ee1e920d0000000000000000000000000000000000000000000000000006656d6d0b7f5e00000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -4825,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec340000000000000000000000006e9c4103c54cd5d8c9a79d13225031cae4e8b3f50000000000000000000000006e9c4103c54cd5d8c9a79d13225031cae4e8b3f5000000000000000000000000000000000000000000000000000009184e72a00000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -4826,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec340000000000000000000000009285d24f30390af0cb8331401d9f609275f7813f0000000000000000000000009285d24f30390af0cb8331401d9f609275f7813f000000000000000000000000000000000000000000000000000000e8d4a5100000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -4827,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec3400000000000000000000000011089817570a67c42dc6a57a545bd4679c17e07600000000000000000000000011089817570a67c42dc6a57a545bd4679c17e076000000000000000000000000000000000000000000000000000009184e72a00000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -4828,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec340000000000000000000000005e12fd8f8a438f7c767c4dc3ba2f9d1819f8d3bd0000000000000000000000005e12fd8f8a438f7c767c4dc3ba2f9d1819f8d3bd000000000000000000000000000000000000000000000000000009184e72a00000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -4829,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec34000000000000000000000000d2efe33e14541da6ad389f36f21b15fe5d305f30000000000000000000000000d2efe33e14541da6ad389f36f21b15fe5d305f30000000000000000000000000000000000000000000000000000009184e72a00000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -4830,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec340000000000000000000000006693b7ef7bcc300dde5830231a3ee0bd972bd85c0000000000000000000000006693b7ef7bcc300dde5830231a3ee0bd972bd85c000000000000000000000000000000000000000000000000000009184e72a00000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -4831,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec34000000000000000000000000c05e84cd03035a0a6ab98fb5e5b981adebe6733b000000000000000000000000c05e84cd03035a0a6ab98fb5e5b981adebe6733b000000000000000000000000000000000000000000000000000000e8d4a5100000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -4832,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec34000000000000000000000000b287ecc518df66f380405563196b80039fbdd89c000000000000000000000000b287ecc518df66f380405563196b80039fbdd89c000000000000000000000000000000000000000000000000000009184e72a00000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -4833,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec340000000000000000000000003340308bdd50f503d3c5efbd69450551b3e8f81f0000000000000000000000003340308bdd50f503d3c5efbd69450551b3e8f81f000000000000000000000000000000000000000000000000000009184e72a00000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -4834,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec34000000000000000000000000197d5852e702f4685e370d0c9fd582ec55a531cd000000000000000000000000197d5852e702f4685e370d0c9fd582ec55a531cd000000000000000000000000000000000000000000000000000000e8d4a5100000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -4835,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec340000000000000000000000000de38392adc601037dfd89a3d83354b1beaafc660000000000000000000000000de38392adc601037dfd89a3d83354b1beaafc66000000000000000000000000000000000000000000000000000009184e72a00000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -4836,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec3400000000000000000000000083b2245cfbe1d0047f30feaeb61e8043595934fc00000000000000000000000083b2245cfbe1d0047f30feaeb61e8043595934fc000000000000000000000000000000000000000000000000000009184e72a00000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -4837,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec3400000000000000000000000033e7609bfdad6117943b00370a5cb49add49c46400000000000000000000000033e7609bfdad6117943b00370a5cb49add49c464000000000000000000000000000000000000000000000000000009184e72a00000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -4838,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec340000000000000000000000008da9c63c1bcf8598dd44fffbc5dbea53aebd54f60000000000000000000000008da9c63c1bcf8598dd44fffbc5dbea53aebd54f6000000000000000000000000000000000000000000000000000000e8d4a5100000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -4839,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec34000000000000000000000000b7d1f72101b9ba6ea3bcdd1db1826fbbde182892000000000000000000000000b7d1f72101b9ba6ea3bcdd1db1826fbbde182892000000000000000000000000000000000000000000000000000009184e72a00000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -4840,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec340000000000000000000000001197fe10cedf5bbe3f161e1a13d7f6a56f0e4a0f0000000000000000000000001197fe10cedf5bbe3f161e1a13d7f6a56f0e4a0f000000000000000000000000000000000000000000000000000000e8d4a5100000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -4841,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec3400000000000000000000000008fef97ccbc5d7dfcfdac1aa992fcfb69633c20000000000000000000000000008fef97ccbc5d7dfcfdac1aa992fcfb69633c200000000000000000000000000000000000000000000000000000009184e72a00000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -4842,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec34000000000000000000000000c151a1e3123f9eda4f63de7ca6bc461a97f39700000000000000000000000000c151a1e3123f9eda4f63de7ca6bc461a97f39700000000000000000000000000000000000000000000000000000009184e72a00000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -4843,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec340000000000000000000000008a6302c1fb65827304e77d868a770aafe34bbd580000000000000000000000008a6302c1fb65827304e77d868a770aafe34bbd58000000000000000000000000000000000000000000000000000009184e72a00000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -4844,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec34000000000000000000000000a8dad3f33f7d585ac789447d93cb697ebcaf1ca7000000000000000000000000a8dad3f33f7d585ac789447d93cb697ebcaf1ca7000000000000000000000000000000000000000000000000000000e8d4a5100000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -4845,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec34000000000000000000000000fa49e30b302dc29ce9f1e96eb5576a70cdfc0542000000000000000000000000fa49e30b302dc29ce9f1e96eb5576a70cdfc0542000000000000000000000000000000000000000000000000000009184e72a00000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -4846,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec3400000000000000000000000033c5a1eb527d804543c64b1008b61f78dfecf72600000000000000000000000033c5a1eb527d804543c64b1008b61f78dfecf726000000000000000000000000000000000000000000000000000009184e72a00000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -4847,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec34000000000000000000000000a2d2de2f92f297b9a0401a5b815c051c557be376000000000000000000000000a2d2de2f92f297b9a0401a5b815c051c557be376000000000000000000000000000000000000000000000000000009184e72a00000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -4848,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec340000000000000000000000007892bf19be53018a032067925e482620ff67ffcf0000000000000000000000007892bf19be53018a032067925e482620ff67ffcf000000000000000000000000000000000000000000000000000000e8d4a5100000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -4849,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec34000000000000000000000000bcf03bb0dce296dd615d16bc9c338a8a37a020cc000000000000000000000000bcf03bb0dce296dd615d16bc9c338a8a37a020cc000000000000000000000000000000000000000000000000000009184e72a00000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -4850,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec3400000000000000000000000019d1d0e20dd15b0743652f3e0dde9aea0617fd8d00000000000000000000000019d1d0e20dd15b0743652f3e0dde9aea0617fd8d000000000000000000000000000000000000000000000000000009184e72a00000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -4851,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec340000000000000000000000003ce0118d1bfe9a5f0fa5b381d444f187527623200000000000000000000000003ce0118d1bfe9a5f0fa5b381d444f18752762320000000000000000000000000000000000000000000000000000009184e72a00000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -4852,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec34000000000000000000000000df0644d98fc986d6bd4638489e20063fadf8d7d8000000000000000000000000df0644d98fc986d6bd4638489e20063fadf8d7d8000000000000000000000000000000000000000000000000000000e8d4a5100000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -4853,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec34000000000000000000000000f51bc7e52bde3c27e6045d00d3f9c609d305c6b5000000000000000000000000f51bc7e52bde3c27e6045d00d3f9c609d305c6b5000000000000000000000000000000000000000000000000000009184e72a00000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -4854,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec34000000000000000000000000e960624cd53229d341bf9158255ddf53bad04dac000000000000000000000000e960624cd53229d341bf9158255ddf53bad04dac000000000000000000000000000000000000000000000000000009184e72a00000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -4855,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec340000000000000000000000006c9031e178a976f8d3697ef5f644b24db615fd9b0000000000000000000000006c9031e178a976f8d3697ef5f644b24db615fd9b000000000000000000000000000000000000000000000000000000e8d4a5100000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -4856,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec3400000000000000000000000000e1a6e86c6a8375d63555127bd8c15436932c8400000000000000000000000000e1a6e86c6a8375d63555127bd8c15436932c84000000000000000000000000000000000000000000000000000009184e72a00000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -4857,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec340000000000000000000000000b938f823d2da78ec005634a0742b969560d40bc0000000000000000000000000b938f823d2da78ec005634a0742b969560d40bc000000000000000000000000000000000000000000000000000009184e72a00000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -4858,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec34000000000000000000000000ca7278bffaa541f4fff875a93bf4f4ea72ad43af000000000000000000000000ca7278bffaa541f4fff875a93bf4f4ea72ad43af000000000000000000000000000000000000000000000000000000e8d4a5100000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -4860,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec3400000000000000000000000010936a472f257dda330bd65bce68dce8b169f69600000000000000000000000010936a472f257dda330bd65bce68dce8b169f696000000000000000000000000000000000000000000000000009e8dff889350b800000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -4862,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec34000000000000000000000000c6c0d7a92446b508b49c4a044a6571949bb8b62d000000000000000000000000c6c0d7a92446b508b49c4a044a6571949bb8b62d000000000000000000000000000000000000000000000000000009184e72a00000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -4863,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec340000000000000000000000006e34bc9b5dd24f71dfebc45ab46d9f2feeded52b0000000000000000000000006e34bc9b5dd24f71dfebc45ab46d9f2feeded52b000000000000000000000000000000000000000000000000000009184e72a00000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -4864,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec3400000000000000000000000059d7f642c0df533bd32b971a09d4205a1c1444b900000000000000000000000059d7f642c0df533bd32b971a09d4205a1c1444b9000000000000000000000000000000000000000000000000000000e8d4a5100000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -4865,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec3400000000000000000000000034e91cf6b9305f13ef4b92f312168ac98be6160f00000000000000000000000034e91cf6b9305f13ef4b92f312168ac98be6160f000000000000000000000000000000000000000000000000000009184e72a00000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -4866,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec34000000000000000000000000907ce6dc4016d472c645906575e59cfaf6db8bee000000000000000000000000907ce6dc4016d472c645906575e59cfaf6db8bee000000000000000000000000000000000000000000000000000000e8d4a5100000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -4867,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec3400000000000000000000000010dbf82a8bb191bd1c082de5ef915e998aa5ccd700000000000000000000000010dbf82a8bb191bd1c082de5ef915e998aa5ccd70000000000000000000000000000000000000000000000000207a305eff8d32500000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,0x2ee0b98892e2afb067bf39c3a5e17182c14ff6796b1aa27fcb14ef28629d7140,2022-02-02 13:39:28.000 UTC,0,true -4868,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec3400000000000000000000000034ce141b83a754705cb36df3f826eba268257dab00000000000000000000000034ce141b83a754705cb36df3f826eba268257dab000000000000000000000000000000000000000000000000000009184e72a00000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -4869,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec34000000000000000000000000502e2a36dba47d881458e03e9e2b6ba47f1196e8000000000000000000000000502e2a36dba47d881458e03e9e2b6ba47f1196e8000000000000000000000000000000000000000000000000000009184e72a00000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -4870,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec34000000000000000000000000c1014980a9591c59f1d95adc14b56edd171bbf00000000000000000000000000c1014980a9591c59f1d95adc14b56edd171bbf00000000000000000000000000000000000000000000000000000000e8d4a5100000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -4871,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec340000000000000000000000007212b43213e8bd36ad390e86e405867c2adee09e0000000000000000000000007212b43213e8bd36ad390e86e405867c2adee09e000000000000000000000000000000000000000000000000000009184e72a00000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -4872,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec3400000000000000000000000017b3e588a306dd47855aeb1c423cafdacf3a665200000000000000000000000017b3e588a306dd47855aeb1c423cafdacf3a665200000000000000000000000000000000000000000000000000014805e10bf6f300000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -4873,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec3400000000000000000000000007ebb7978e5f752d1af50133d677b4ae84474d0100000000000000000000000007ebb7978e5f752d1af50133d677b4ae84474d0100000000000000000000000000000000000000000000000000005af3107a400000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -4874,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec3400000000000000000000000043ec54a69923cf55e5d8cfaffd79b5a52b8202bf00000000000000000000000043ec54a69923cf55e5d8cfaffd79b5a52b8202bf000000000000000000000000000000000000000000000000000f45f0e825925500000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -4875,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec340000000000000000000000006fae1e971bd93a141eef542b4197a3476d03dacd0000000000000000000000006fae1e971bd93a141eef542b4197a3476d03dacd000000000000000000000000000000000000000000000000000009184e72a00000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -4876,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec340000000000000000000000007ee9c1ff90f649a7d02e68bd3dcd7d185d68e5020000000000000000000000007ee9c1ff90f649a7d02e68bd3dcd7d185d68e502000000000000000000000000000000000000000000000000000000e8d4a5100000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -4877,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec34000000000000000000000000591125dbb201bd90635b90e74555f341c4c12196000000000000000000000000591125dbb201bd90635b90e74555f341c4c12196000000000000000000000000000000000000000000000000000009184e72a00000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -4878,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec34000000000000000000000000f2415d4f25c37df7f15b84138f370f55ad4fb434000000000000000000000000f2415d4f25c37df7f15b84138f370f55ad4fb434000000000000000000000000000000000000000000000000000009184e72a00000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -4879,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec3400000000000000000000000044f2edfaa320b6b7540fbbff4758b925c5f9c7ac00000000000000000000000044f2edfaa320b6b7540fbbff4758b925c5f9c7ac000000000000000000000000000000000000000000000000000009184e72a00000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -4880,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec34000000000000000000000000c72299609537a857c48a3fae2b06e09318d3f6bb000000000000000000000000c72299609537a857c48a3fae2b06e09318d3f6bb000000000000000000000000000000000000000000000000000009184e72a00000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -4881,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec34000000000000000000000000c658b02473ae79c2826e770db890c815788788bd000000000000000000000000c658b02473ae79c2826e770db890c815788788bd00000000000000000000000000000000000000000000000000005af3107a400000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -4882,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec3400000000000000000000000079e03e5718268fdd2c219807406a231e2fccb2ef00000000000000000000000079e03e5718268fdd2c219807406a231e2fccb2ef000000000000000000000000000000000000000000000000000000e8d4a5100000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -4883,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec34000000000000000000000000527625a238857be593920238ea9dee3fa7ce5433000000000000000000000000527625a238857be593920238ea9dee3fa7ce5433000000000000000000000000000000000000000000000000000009184e72a00000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -4884,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec3400000000000000000000000066ac5a53db5349152db5f3c9fab2b93664044a1000000000000000000000000066ac5a53db5349152db5f3c9fab2b93664044a1000000000000000000000000000000000000000000000000000005af3107a400000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -4885,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec34000000000000000000000000afdf046b8eb9f7ec6d341ba923a663633ac0d7a2000000000000000000000000afdf046b8eb9f7ec6d341ba923a663633ac0d7a2000000000000000000000000000000000000000000000000000000e8d4a5100000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -4886,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec340000000000000000000000008f7609d42cd0393ba6e8a3168b20096943eb006f0000000000000000000000008f7609d42cd0393ba6e8a3168b20096943eb006f000000000000000000000000000000000000000000000000000009184e72a00000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -4887,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec34000000000000000000000000c3fac74d23767ba74ec0842e24ea39708faad1c8000000000000000000000000c3fac74d23767ba74ec0842e24ea39708faad1c8000000000000000000000000000000000000000000000000000009184e72a00000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -4888,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec34000000000000000000000000e987723597050e6d073bc3660df5365b764c651c000000000000000000000000e987723597050e6d073bc3660df5365b764c651c00000000000000000000000000000000000000000000000000005af3107a400000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -4889,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec340000000000000000000000007aab79eca85f6259f40ef23d140e39e0ee44d75a0000000000000000000000007aab79eca85f6259f40ef23d140e39e0ee44d75a000000000000000000000000000000000000000000000000000000e8d4a5100000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -4890,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec3400000000000000000000000016cd17e90d1b5f623505c0796be1e85607defbcb00000000000000000000000016cd17e90d1b5f623505c0796be1e85607defbcb00000000000000000000000000000000000000000000000000005af3107a400000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -4891,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec34000000000000000000000000978260921f7a56a98011e752e3b6847387dd9e13000000000000000000000000978260921f7a56a98011e752e3b6847387dd9e13000000000000000000000000000000000000000000000000028d036819b634ba00000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -4892,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec34000000000000000000000000b45a7d322136ceeb741f153a2d795eb4696799bb000000000000000000000000b45a7d322136ceeb741f153a2d795eb4696799bb000000000000000000000000000000000000000000000000000009184e72a00000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -4893,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec340000000000000000000000004b9a1dfc451d7e6233cde79b627e7c5319e0f1bc0000000000000000000000004b9a1dfc451d7e6233cde79b627e7c5319e0f1bc00000000000000000000000000000000000000000000000000005af3107a400000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -4894,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec340000000000000000000000003ed22136c186e2f017d872f6c106cfe21991e8e90000000000000000000000003ed22136c186e2f017d872f6c106cfe21991e8e9000000000000000000000000000000000000000000000000000000e8d4a5100000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -4895,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec340000000000000000000000004a4307a69e4adfab939f3d89c9121a391ad146a20000000000000000000000004a4307a69e4adfab939f3d89c9121a391ad146a2000000000000000000000000000000000000000000000000000009184e72a00000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -4896,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec34000000000000000000000000322ee168f95d3d151105d784fbdcdc8c1ea7d2e2000000000000000000000000322ee168f95d3d151105d784fbdcdc8c1ea7d2e200000000000000000000000000000000000000000000000000005af3107a400000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -4897,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec3400000000000000000000000078018b3e65ed26601f9c428383d62e037a0ad5bf00000000000000000000000078018b3e65ed26601f9c428383d62e037a0ad5bf000000000000000000000000000000000000000000000000000009184e72a00000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -4898,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec34000000000000000000000000800400391b32df4c5a2c575c1fffaf8a71f9c22e000000000000000000000000800400391b32df4c5a2c575c1fffaf8a71f9c22e000000000000000000000000000000000000000000000000000000e8d4a5100000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -4900,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec34000000000000000000000000e6256af6d7bf502a25309c7b9017d4c5ea82433b000000000000000000000000e6256af6d7bf502a25309c7b9017d4c5ea82433b00000000000000000000000000000000000000000000000000005af3107a400000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -4901,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec340000000000000000000000009cf52a8174c1a841f9e20e629dd420974b587ba40000000000000000000000009cf52a8174c1a841f9e20e629dd420974b587ba400000000000000000000000000000000000000000000000000005af3107a400000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -4902,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec340000000000000000000000006f2ce4f450d9acf7bedacdf7879f68a2e9308e540000000000000000000000006f2ce4f450d9acf7bedacdf7879f68a2e9308e54000000000000000000000000000000000000000000000000000009184e72a00000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -4903,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec340000000000000000000000002a5636e3c10390e6f06482f1336f1973e767d9e60000000000000000000000002a5636e3c10390e6f06482f1336f1973e767d9e6000000000000000000000000000000000000000000000000000000e8d4a5100000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -4904,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec34000000000000000000000000c57578c767d48ba722058dfad80ac83f9a2e4860000000000000000000000000c57578c767d48ba722058dfad80ac83f9a2e48600000000000000000000000000000000000000000000000000109c5e7809757c900000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -4905,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec340000000000000000000000004a813569d4fc9a0d2fb0150c2fdfbd6c1645b5df0000000000000000000000004a813569d4fc9a0d2fb0150c2fdfbd6c1645b5df000000000000000000000000000000000000000000000000000009184e72a00000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -4906,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec340000000000000000000000003ec4a557a6e430d10a6acaf265610199c49411100000000000000000000000003ec4a557a6e430d10a6acaf265610199c4941110000000000000000000000000000000000000000000000000000009184e72a00000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -4907,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec34000000000000000000000000a4e67873e7983f8ed98da6f4b5f9d2719b72ffb5000000000000000000000000a4e67873e7983f8ed98da6f4b5f9d2719b72ffb5000000000000000000000000000000000000000000000000000000e8d4a5100000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -4909,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec34000000000000000000000000c0552d9b83590294ab9e5da073c4fde14359d1dd000000000000000000000000c0552d9b83590294ab9e5da073c4fde14359d1dd000000000000000000000000000000000000000000000000000009184e72a00000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -4910,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec3400000000000000000000000074a20a756c25d124a4dba853dfd996274c69b4ac00000000000000000000000074a20a756c25d124a4dba853dfd996274c69b4ac000000000000000000000000000000000000000000000000000009184e72a00000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -4911,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec340000000000000000000000008ff745694113df5ea6317f41fa3b371b0f5d7b350000000000000000000000008ff745694113df5ea6317f41fa3b371b0f5d7b3500000000000000000000000000000000000000000000000000fa61bafa78615500000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -4912,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec3400000000000000000000000017e7989777c7b23ac2d8523816df154d8c47123700000000000000000000000017e7989777c7b23ac2d8523816df154d8c471237000000000000000000000000000000000000000000000000000000e8d4a5100000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -4913,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec3400000000000000000000000082919de1450c9884ecd1aa89fe6c5ef03b56f58e00000000000000000000000082919de1450c9884ecd1aa89fe6c5ef03b56f58e000000000000000000000000000000000000000000000000000009184e72a00000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -4914,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec34000000000000000000000000cef7d2a50cb0e6c5f1be47ee71578c93c6966671000000000000000000000000cef7d2a50cb0e6c5f1be47ee71578c93c6966671000000000000000000000000000000000000000000000000000000e8d4a5100000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -4915,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec3400000000000000000000000047f3edb4cf66644514618d98cdc9b813cec77f5c00000000000000000000000047f3edb4cf66644514618d98cdc9b813cec77f5c000000000000000000000000000000000000000000000000000009184e72a00000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -4916,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec34000000000000000000000000de1a86cd877c622a7fc71739f37e9430317616e2000000000000000000000000de1a86cd877c622a7fc71739f37e9430317616e20000000000000000000000000000000000000000000000000101a553643ec30000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -4917,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec34000000000000000000000000bfc2cf0fc6e6fd3f9c06ea5178426ad2d2e48a06000000000000000000000000bfc2cf0fc6e6fd3f9c06ea5178426ad2d2e48a06000000000000000000000000000000000000000000000000000009184e72a00000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -4918,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec3400000000000000000000000062a80918dde9b992d32a2b59bc7109ccf08b8b6000000000000000000000000062a80918dde9b992d32a2b59bc7109ccf08b8b60000000000000000000000000000000000000000000000000000009184e72a00000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -4919,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec34000000000000000000000000d6a7c8869359b4ea34f3069b0d84742d76b1bf3d000000000000000000000000d6a7c8869359b4ea34f3069b0d84742d76b1bf3d000000000000000000000000000000000000000000000000009fb43761e5658e00000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -4920,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec34000000000000000000000000d2772761152a8779bad1004e04a1db547521da6f000000000000000000000000d2772761152a8779bad1004e04a1db547521da6f000000000000000000000000000000000000000000000000000000e8d4a5100000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -4921,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec34000000000000000000000000246846d6ec87e7b415fcdb2899a81294522316c6000000000000000000000000246846d6ec87e7b415fcdb2899a81294522316c600000000000000000000000000000000000000000000000000057b89e890ed2f00000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -4922,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec34000000000000000000000000fa9a1a93ab327fba20384caf9921491f3917ee6a000000000000000000000000fa9a1a93ab327fba20384caf9921491f3917ee6a00000000000000000000000000000000000000000000000000f618f83096749900000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -4923,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec3400000000000000000000000016fc72333f77568b782d386e82aa400999c8c23a00000000000000000000000016fc72333f77568b782d386e82aa400999c8c23a000000000000000000000000000000000000000000000000000000e8d4a5100000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -4924,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec34000000000000000000000000a577494f74b5f4e7ec517bd66b4403806e8e0378000000000000000000000000a577494f74b5f4e7ec517bd66b4403806e8e0378000000000000000000000000000000000000000000000000000009184e72a00000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -4925,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec340000000000000000000000004e6eb978a9cbdb57a02856b3d0b8e6571a2bd6970000000000000000000000004e6eb978a9cbdb57a02856b3d0b8e6571a2bd697000000000000000000000000000000000000000000000000000009184e72a00000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -4926,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec340000000000000000000000006051a9863d97addaf708154e3d5ab3c456b0c1250000000000000000000000006051a9863d97addaf708154e3d5ab3c456b0c12500000000000000000000000000000000000000000000000000fc30f8c65df32d00000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -4927,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec34000000000000000000000000affc3444310c1df92f35fdeeadf4de5be977df06000000000000000000000000affc3444310c1df92f35fdeeadf4de5be977df06000000000000000000000000000000000000000000000000000000e8d4a5100000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -4929,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec340000000000000000000000001a60eb1065aea0d4b78ce2859b6977ac417d3aab0000000000000000000000001a60eb1065aea0d4b78ce2859b6977ac417d3aab0000000000000000000000000000000000000000000000000018de76816d800000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -4930,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec340000000000000000000000008637aa682344f1e70a37f2d7da02ef79024f6bf50000000000000000000000008637aa682344f1e70a37f2d7da02ef79024f6bf50000000000000000000000000000000000000000000000000101cbc7478a774300000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -4931,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec34000000000000000000000000ac45bde4f7869e45e475028ccaf437e6213c2827000000000000000000000000ac45bde4f7869e45e475028ccaf437e6213c2827000000000000000000000000000000000000000000000000000000e8d4a5100000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -4932,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec34000000000000000000000000d5fdafe5b1903ecd1748b109eba3891e6276a0b6000000000000000000000000d5fdafe5b1903ecd1748b109eba3891e6276a0b6000000000000000000000000000000000000000000000000000009184e72a00000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -4933,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec34000000000000000000000000bf0e864ae108d71db1c710409c7fc5aeb40b43fb000000000000000000000000bf0e864ae108d71db1c710409c7fc5aeb40b43fb000000000000000000000000000000000000000000000000000000e8d4a5100000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -4934,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec34000000000000000000000000b39aec4b84f042677fea1439d1e104326cbc84ac000000000000000000000000b39aec4b84f042677fea1439d1e104326cbc84ac0000000000000000000000000000000000000000000000000060c1c9a353fa4000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -4935,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec340000000000000000000000004b58e15c56be04743b84dd60d225085c296de2db0000000000000000000000004b58e15c56be04743b84dd60d225085c296de2db0000000000000000000000000000000000000000000000000104a026b15b2cd500000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -4936,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec34000000000000000000000000d78f4935778764a9c64d32a3f590b7da9f5bbb60000000000000000000000000d78f4935778764a9c64d32a3f590b7da9f5bbb60000000000000000000000000000000000000000000000000000000e8d4a5100000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -4937,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec340000000000000000000000003a86d959853519975aba591bc19579682faab1770000000000000000000000003a86d959853519975aba591bc19579682faab177000000000000000000000000000000000000000000000000000009184e72a00000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -4938,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec34000000000000000000000000bfe2e4a14e2b77a2d37fda2bd304feca175ea544000000000000000000000000bfe2e4a14e2b77a2d37fda2bd304feca175ea54400000000000000000000000000000000000000000000000001086c348dd0b7e700000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -4939,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec340000000000000000000000006836cc238567d32a59f6c717e9991e482afbc5bd0000000000000000000000006836cc238567d32a59f6c717e9991e482afbc5bd000000000000000000000000000000000000000000000000000000e8d4a5100000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -4940,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec340000000000000000000000008bde3ad8a20852e04afd2b2f27b5a59fc287789f0000000000000000000000008bde3ad8a20852e04afd2b2f27b5a59fc287789f000000000000000000000000000000000000000000000000000000e8d4a5100000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -4941,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec3400000000000000000000000031dc4372b19e2d923813224a31368c88076c29e000000000000000000000000031dc4372b19e2d923813224a31368c88076c29e0000000000000000000000000000000000000000000000000000009184e72a00000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -4942,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec34000000000000000000000000a55cfb15941f1692751b2b3a527d94265c7d156e000000000000000000000000a55cfb15941f1692751b2b3a527d94265c7d156e000000000000000000000000000000000000000000000000000000e8d4a5100000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -4943,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec3400000000000000000000000005e75611ea6c050ca1036ec5df6f609b034a5de700000000000000000000000005e75611ea6c050ca1036ec5df6f609b034a5de7000000000000000000000000000000000000000000000000004149842d60770000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,0xd4bb2c4fd4fb4f7d3956541ea347769fcbf8da4ea4ce43ef228f86068b60ea35,2022-04-17 09:27:29.000 UTC,0,true -4944,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec34000000000000000000000000ff2e53d6da18e31d607f4399220db033d2931d1f000000000000000000000000ff2e53d6da18e31d607f4399220db033d2931d1f000000000000000000000000000000000000000000000000000000e8d4a5100000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -4945,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec340000000000000000000000004ef2ebfb2eba4c63d38c5ad1322104176b165ff40000000000000000000000004ef2ebfb2eba4c63d38c5ad1322104176b165ff4000000000000000000000000000000000000000000000000000009184e72a00000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -4946,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec3400000000000000000000000030bddda2620a715eb5892810b199218b50ea7fdb00000000000000000000000030bddda2620a715eb5892810b199218b50ea7fdb000000000000000000000000000000000000000000000000000000e8d4a5100000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -4947,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec34000000000000000000000000a95a05410921e8190ca1adbaaa45a8917cddae09000000000000000000000000a95a05410921e8190ca1adbaaa45a8917cddae09000000000000000000000000000000000000000000000000000000e8d4a5100000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -4948,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec34000000000000000000000000c2b82e071cfa045d938716e2b2108b022f695df4000000000000000000000000c2b82e071cfa045d938716e2b2108b022f695df4000000000000000000000000000000000000000000000000000000e8d4a5100000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -4949,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec34000000000000000000000000172b1d027d9f532c8412249c668a87f8f7c328d0000000000000000000000000172b1d027d9f532c8412249c668a87f8f7c328d0000000000000000000000000000000000000000000000000000009184e72a00000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -4950,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec34000000000000000000000000f93afebf1e21460e7e9c1ad099c21650e879eedc000000000000000000000000f93afebf1e21460e7e9c1ad099c21650e879eedc000000000000000000000000000000000000000000000000000000e8d4a5100000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -4952,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec34000000000000000000000000b47726b44d8e004e11555431035bbb2930ffd9fc000000000000000000000000b47726b44d8e004e11555431035bbb2930ffd9fc000000000000000000000000000000000000000000000000000000e8d4a5100000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -4953,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec34000000000000000000000000819b172906649f91c8bce341f08141e3bcbb6fbc000000000000000000000000819b172906649f91c8bce341f08141e3bcbb6fbc000000000000000000000000000000000000000000000000000009184e72a00000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -4954,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec34000000000000000000000000f8a2c2c3140b1801a4afdbda89db20e02f736ba9000000000000000000000000f8a2c2c3140b1801a4afdbda89db20e02f736ba9000000000000000000000000000000000000000000000000000000e8d4a5100000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -4955,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec340000000000000000000000008169dfecd99e8a0945068f8d26a80b4396d3820b0000000000000000000000008169dfecd99e8a0945068f8d26a80b4396d3820b000000000000000000000000000000000000000000000000000000e8d4a5100000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -4956,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec34000000000000000000000000c17da57ee13e8a9e7d3f3c6ac2c011d18071723b000000000000000000000000c17da57ee13e8a9e7d3f3c6ac2c011d18071723b000000000000000000000000000000000000000000000000000009184e72a00000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -4957,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec34000000000000000000000000951bf925dc5d5d4849c1b2b93e742ef10012b48e000000000000000000000000951bf925dc5d5d4849c1b2b93e742ef10012b48e000000000000000000000000000000000000000000000000000000e8d4a5100000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -4958,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec340000000000000000000000003188684ed5b446751851edec8067826d593a76fd0000000000000000000000003188684ed5b446751851edec8067826d593a76fd000000000000000000000000000000000000000000000000000000e8d4a5100000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -4959,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec34000000000000000000000000dfdc09776116cbbc3485bb0b53507a0ec0acbf38000000000000000000000000dfdc09776116cbbc3485bb0b53507a0ec0acbf38000000000000000000000000000000000000000000000000000000e8d4a5100000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -4960,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec34000000000000000000000000c6e6a4dc851680fd200367021df4b8d84e4764a5000000000000000000000000c6e6a4dc851680fd200367021df4b8d84e4764a5000000000000000000000000000000000000000000000000000009184e72a00000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -4961,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec3400000000000000000000000043ec54a69923cf55e5d8cfaffd79b5a52b8202bf00000000000000000000000043ec54a69923cf55e5d8cfaffd79b5a52b8202bf0000000000000000000000000000000000000000000000000018de76816d800000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -4962,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec34000000000000000000000000ef575844bfe8c7872a8ccc9fb2af8318c1550fad000000000000000000000000ef575844bfe8c7872a8ccc9fb2af8318c1550fad00000000000000000000000000000000000000000000000000668b929e7ef09700000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -4964,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec340000000000000000000000000331189161575a5f9cb7637f6544156889fc77a60000000000000000000000000331189161575a5f9cb7637f6544156889fc77a6000000000000000000000000000000000000000000000000000009184e72a00000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -4965,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec34000000000000000000000000c8e4dd49948dc43443e14d7563623b2669779a71000000000000000000000000c8e4dd49948dc43443e14d7563623b2669779a71000000000000000000000000000000000000000000000000000000e8d4a5100000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -4966,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec340000000000000000000000001f15f71188c240c3d7bdfa5a5c44ebe37e30112f0000000000000000000000001f15f71188c240c3d7bdfa5a5c44ebe37e30112f000000000000000000000000000000000000000000000000000009184e72a00000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -4968,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec340000000000000000000000008c939678d75bb552bf3d22aecba8184f0eb9c7ba0000000000000000000000008c939678d75bb552bf3d22aecba8184f0eb9c7ba000000000000000000000000000000000000000000000000000000e8d4a5100000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -4969,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec34000000000000000000000000e021990f6142a5d2bdfe2cb1e6535fcd967d221e000000000000000000000000e021990f6142a5d2bdfe2cb1e6535fcd967d221e000000000000000000000000000000000000000000000000000e80d8b437e92900000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -4970,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec3400000000000000000000000086845ebf40b3141e18e1fdbd91d845b51fa1242e00000000000000000000000086845ebf40b3141e18e1fdbd91d845b51fa1242e000000000000000000000000000000000000000000000000000009184e72a00000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -4972,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec340000000000000000000000008ea63889a9eba186ee050d6c42d5580ef388face0000000000000000000000008ea63889a9eba186ee050d6c42d5580ef388face000000000000000000000000000000000000000000000000000009184e72a00000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -4973,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec340000000000000000000000001f537cdead4ac51eea305e800692459eeb64f7980000000000000000000000001f537cdead4ac51eea305e800692459eeb64f798000000000000000000000000000000000000000000000000000009184e72a00000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -4974,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec340000000000000000000000001c6b50f3593ac3ddb5e1e38db6a780456b1e49c70000000000000000000000001c6b50f3593ac3ddb5e1e38db6a780456b1e49c7000000000000000000000000000000000000000000000000002f11349bc4d1e400000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -4975,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec3400000000000000000000000043ec54a69923cf55e5d8cfaffd79b5a52b8202bf00000000000000000000000043ec54a69923cf55e5d8cfaffd79b5a52b8202bf0000000000000000000000000000000000000000000000000000088119ffd50000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -4976,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec34000000000000000000000000a17cc8fe40175c9ecaa64f07c88f784b4664f805000000000000000000000000a17cc8fe40175c9ecaa64f07c88f784b4664f805000000000000000000000000000000000000000000000000000009184e72a00000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -4977,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec3400000000000000000000000043ec54a69923cf55e5d8cfaffd79b5a52b8202bf00000000000000000000000043ec54a69923cf55e5d8cfaffd79b5a52b8202bf0000000000000000000000000000000000000000000000000000088119ffd50000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -4978,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec34000000000000000000000000455f982fe6dfa24c72c304f319de71ea806af223000000000000000000000000455f982fe6dfa24c72c304f319de71ea806af223000000000000000000000000000000000000000000000000000009184e72a00000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -4980,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec3400000000000000000000000006eba72cbfa2a136e35056b6451dcc7b412bcc2200000000000000000000000006eba72cbfa2a136e35056b6451dcc7b412bcc2200000000000000000000000000000000000000000000000000732f8e01e8d1bd00000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -4981,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec340000000000000000000000008a020e94c2377c4f22dd16ce609b20ed7b350e410000000000000000000000008a020e94c2377c4f22dd16ce609b20ed7b350e41000000000000000000000000000000000000000000000000000009184e72a00000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -4982,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec34000000000000000000000000b7575e23b33a2db2937202fd65d9f8be466f4705000000000000000000000000b7575e23b33a2db2937202fd65d9f8be466f4705000000000000000000000000000000000000000000000000000009184e72a00000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -4983,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec340000000000000000000000000ea4616d1a8d0e67fbde645cdf8aa29889fa5ff90000000000000000000000000ea4616d1a8d0e67fbde645cdf8aa29889fa5ff9000000000000000000000000000000000000000000000000000009184e72a00000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -4984,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec340000000000000000000000001e565d1128b56525e69e8acad62fe5d08469581e0000000000000000000000001e565d1128b56525e69e8acad62fe5d08469581e000000000000000000000000000000000000000000000000000009184e72a00000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -4986,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec34000000000000000000000000d81a7755f7c2fec66f327e4a9b0363943884afb8000000000000000000000000d81a7755f7c2fec66f327e4a9b0363943884afb8000000000000000000000000000000000000000000000000000009184e72a00000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -4987,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec34000000000000000000000000374c0ca51fba5702c8b087344a12455676c60ee2000000000000000000000000374c0ca51fba5702c8b087344a12455676c60ee200000000000000000000000000000000000000000000000000005af3107a400000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -4988,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec3400000000000000000000000094de68e06d7aea8effab7f454850646040daea9300000000000000000000000094de68e06d7aea8effab7f454850646040daea9300000000000000000000000000000000000000000000000000005af3107a400000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -4989,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec34000000000000000000000000e6a38ffeec8ab6d0ac884c9b3bfebdd901f04241000000000000000000000000e6a38ffeec8ab6d0ac884c9b3bfebdd901f0424100000000000000000000000000000000000000000000000000005af3107a400000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -4990,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec34000000000000000000000000ec8d2c72c00062bdc20e0114fb766470f778a6ac000000000000000000000000ec8d2c72c00062bdc20e0114fb766470f778a6ac000000000000000000000000000000000000000000000000000009184e72a00000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -4991,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec340000000000000000000000003e43ba864a61900bd2a23585c6a8d49ba806b8ff0000000000000000000000003e43ba864a61900bd2a23585c6a8d49ba806b8ff00000000000000000000000000000000000000000000000000005af3107a400000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -4992,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec34000000000000000000000000fcec9538657e734511c93a4e6a6ea1cffd8fda85000000000000000000000000fcec9538657e734511c93a4e6a6ea1cffd8fda8500000000000000000000000000000000000000000000000000005af3107a400000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -4993,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec34000000000000000000000000c96588b5f9e6fd600f3dcab3b1fd762db8e37cbb000000000000000000000000c96588b5f9e6fd600f3dcab3b1fd762db8e37cbb00000000000000000000000000000000000000000000000000005af3107a400000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -4994,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec34000000000000000000000000ac296e024b243a852e3be0ba06c60768c7673c69000000000000000000000000ac296e024b243a852e3be0ba06c60768c7673c69000000000000000000000000000000000000000000000000000009184e72a00000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -4995,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec34000000000000000000000000b575fb20f76844dd7b6f7eee023853ac30929750000000000000000000000000b575fb20f76844dd7b6f7eee023853ac3092975000000000000000000000000000000000000000000000000000005af3107a400000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -4996,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec34000000000000000000000000c2d61e516e839ac73f28fb1221c10a67228bd45c000000000000000000000000c2d61e516e839ac73f28fb1221c10a67228bd45c00000000000000000000000000000000000000000000000000005af3107a400000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -4997,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec340000000000000000000000006f65ab942c891d416a8769afe0c391d20406b59e0000000000000000000000006f65ab942c891d416a8769afe0c391d20406b59e00000000000000000000000000000000000000000000000000005af3107a400000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -4998,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec34000000000000000000000000fca21664dc233ff13fc5a495625f7917ff2be070000000000000000000000000fca21664dc233ff13fc5a495625f7917ff2be07000000000000000000000000000000000000000000000000000005af3107a400000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -4999,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec34000000000000000000000000935d6c2f716a3a0918e8490bf3a4d4e87419df6f000000000000000000000000935d6c2f716a3a0918e8490bf3a4d4e87419df6f000000000000000000000000000000000000000000000000000009184e72a00000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -5000,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec34000000000000000000000000e243cd3a0155dc19d8a8f32ce74a83d5860e18b9000000000000000000000000e243cd3a0155dc19d8a8f32ce74a83d5860e18b900000000000000000000000000000000000000000000000000005af3107a400000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -5001,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec34000000000000000000000000ba741874a06713b2bc166671b176773d00f7c6d1000000000000000000000000ba741874a06713b2bc166671b176773d00f7c6d100000000000000000000000000000000000000000000000000005af3107a400000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -5002,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec34000000000000000000000000e4d6c5e77d31dac186f05528eec0a4746d23c7db000000000000000000000000e4d6c5e77d31dac186f05528eec0a4746d23c7db00000000000000000000000000000000000000000000000000005af3107a400000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -5003,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec340000000000000000000000003f006417289e9fa4d389a1af4820d48199fb16480000000000000000000000003f006417289e9fa4d389a1af4820d48199fb164800000000000000000000000000000000000000000000000000005af3107a400000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -5004,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec34000000000000000000000000af362e53cbc16264fdd94ba3ea18a8cd9b3180f1000000000000000000000000af362e53cbc16264fdd94ba3ea18a8cd9b3180f1000000000000000000000000000000000000000000000000000009184e72a00000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -5005,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec340000000000000000000000004c031d60dad0ce9d34206fd69c0b9abc7e13f6830000000000000000000000004c031d60dad0ce9d34206fd69c0b9abc7e13f68300000000000000000000000000000000000000000000000000005af3107a400000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -5006,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec34000000000000000000000000c2c2dd738f3f7e343eab709ed2d22051073690dd000000000000000000000000c2c2dd738f3f7e343eab709ed2d22051073690dd00000000000000000000000000000000000000000000000000005af3107a400000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -5008,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec34000000000000000000000000ab4d61d82ceb64a08746ac480eb5167de0c2da08000000000000000000000000ab4d61d82ceb64a08746ac480eb5167de0c2da0800000000000000000000000000000000000000000000000000005af3107a400000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -5009,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec34000000000000000000000000a5404a3cf7d03bbd89132894c1ac01bcac00ac4d000000000000000000000000a5404a3cf7d03bbd89132894c1ac01bcac00ac4d00000000000000000000000000000000000000000000000000038d7ea4c6800000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -5010,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec34000000000000000000000000809a585650f22cff10919f2948f37f0a1d9f33b7000000000000000000000000809a585650f22cff10919f2948f37f0a1d9f33b700000000000000000000000000000000000000000000000000005af3107a400000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -5011,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec340000000000000000000000006c78d3dfe8f26585a032dd8abf79b365346f33c80000000000000000000000006c78d3dfe8f26585a032dd8abf79b365346f33c800000000000000000000000000000000000000000000000000005af3107a400000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -5012,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec34000000000000000000000000fb875567a3ed86e74d3737cbee33225b6473a3d5000000000000000000000000fb875567a3ed86e74d3737cbee33225b6473a3d500000000000000000000000000000000000000000000000000005af3107a400000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -5013,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec34000000000000000000000000515b96a55c07a19f8746d12007202f277b1dabaa000000000000000000000000515b96a55c07a19f8746d12007202f277b1dabaa00000000000000000000000000000000000000000000000000005af3107a400000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -5014,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec34000000000000000000000000b7b698ba27395fae0465abd58beba754cc5ae3ca000000000000000000000000b7b698ba27395fae0465abd58beba754cc5ae3ca00000000000000000000000000000000000000000000000000005af3107a400000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -5015,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec34000000000000000000000000855560d275ed022d5b6d45fba80ae67f53051d31000000000000000000000000855560d275ed022d5b6d45fba80ae67f53051d3100000000000000000000000000000000000000000000000000005af3107a400000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -5016,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec340000000000000000000000000d8d20beb8f82b5b8d102fa93d8b605f7242105e0000000000000000000000000d8d20beb8f82b5b8d102fa93d8b605f7242105e00000000000000000000000000000000000000000000000000005af3107a400000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -5017,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec34000000000000000000000000a42ad380770c10cfe312e5ef065074f11a5a8ab7000000000000000000000000a42ad380770c10cfe312e5ef065074f11a5a8ab700000000000000000000000000000000000000000000000000005af3107a400000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -5018,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec340000000000000000000000008bec3f6747c84d8af97a832a6b53030075f703e80000000000000000000000008bec3f6747c84d8af97a832a6b53030075f703e800000000000000000000000000000000000000000000000000005af3107a400000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -5019,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec3400000000000000000000000022841f046f9761539534ce93f842943812a2c01a00000000000000000000000022841f046f9761539534ce93f842943812a2c01a00000000000000000000000000000000000000000000000000005af3107a400000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -5020,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec34000000000000000000000000a5404a3cf7d03bbd89132894c1ac01bcac00ac4d000000000000000000000000a5404a3cf7d03bbd89132894c1ac01bcac00ac4d00000000000000000000000000000000000000000000000000038d7ea4c6800000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -5021,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec34000000000000000000000000474f5e6716658554003ab54b97bba005622293c6000000000000000000000000474f5e6716658554003ab54b97bba005622293c600000000000000000000000000000000000000000000000000071afd498d000000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -5023,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec3400000000000000000000000007c3d560e0f7ae4decb435172b85c7bfde30f76100000000000000000000000007c3d560e0f7ae4decb435172b85c7bfde30f76100000000000000000000000000000000000000000000000000071afd498d000000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -5024,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec340000000000000000000000000c7a06a1decad2430c0f785520caf40830a58dd70000000000000000000000000c7a06a1decad2430c0f785520caf40830a58dd700000000000000000000000000000000000000000000000000005af3107a400000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -5025,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec34000000000000000000000000114d2e9ce76c1adb54327bdee1580101e5b10899000000000000000000000000114d2e9ce76c1adb54327bdee1580101e5b1089900000000000000000000000000000000000000000000000000005af3107a400000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -5026,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec340000000000000000000000006c6d80a298edb9350611812fb0b6faaab16531d90000000000000000000000006c6d80a298edb9350611812fb0b6faaab16531d900000000000000000000000000000000000000000000000000005af3107a400000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -5027,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec3400000000000000000000000088aa5837fd33ddc353fb55983d99f19d6dbbc4aa00000000000000000000000088aa5837fd33ddc353fb55983d99f19d6dbbc4aa00000000000000000000000000000000000000000000000000b4d397ecf3a7f800000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -5028,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec34000000000000000000000000d94f2fb24978abcd03d6211861624f4762ead476000000000000000000000000d94f2fb24978abcd03d6211861624f4762ead47600000000000000000000000000000000000000000000000000005af3107a400000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -5029,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec34000000000000000000000000347f37f4ed042a208f1be1202aa0577b1d5f1a31000000000000000000000000347f37f4ed042a208f1be1202aa0577b1d5f1a3100000000000000000000000000000000000000000000000000005af3107a400000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -5030,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec34000000000000000000000000215b9442daa7055c8b732d557ff01cd2ee22cba5000000000000000000000000215b9442daa7055c8b732d557ff01cd2ee22cba500000000000000000000000000000000000000000000000000071afd498d000000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -5031,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec34000000000000000000000000ea2903d63ac3cf003a9b7a05084c29c463c89892000000000000000000000000ea2903d63ac3cf003a9b7a05084c29c463c8989200000000000000000000000000000000000000000000000000005af3107a400000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -5032,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec34000000000000000000000000feef8f3abff528358d86294ddb6fbb4ff0e26d8a000000000000000000000000feef8f3abff528358d86294ddb6fbb4ff0e26d8a00000000000000000000000000000000000000000000000000005af3107a400000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -5033,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec34000000000000000000000000234e5ece80de8d99de5cf12e4a8dabe1ae1c9cde000000000000000000000000234e5ece80de8d99de5cf12e4a8dabe1ae1c9cde00000000000000000000000000000000000000000000000000005af3107a400000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -5034,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec34000000000000000000000000a75ff1bad5d7949e80cea17d64af301bdcc74dcb000000000000000000000000a75ff1bad5d7949e80cea17d64af301bdcc74dcb00000000000000000000000000000000000000000000000000005af3107a400000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -5035,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec34000000000000000000000000fad12de52a35f4c7dc73b89368f20f38efbf406e000000000000000000000000fad12de52a35f4c7dc73b89368f20f38efbf406e00000000000000000000000000000000000000000000000000005af3107a400000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -5036,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec34000000000000000000000000e895819c3b9a0d2eb84ffbe745a6a9881c2322d1000000000000000000000000e895819c3b9a0d2eb84ffbe745a6a9881c2322d1000000000000000000000000000000000000000000000000000110d9316ec00000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -5037,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec34000000000000000000000000d28c29828fada742312f92a5c53188c3654666c9000000000000000000000000d28c29828fada742312f92a5c53188c3654666c9000000000000000000000000000000000000000000000000000e35fa931a000000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -5038,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec34000000000000000000000000fb16bc5c386ee0714fde56f78832695e569f5643000000000000000000000000fb16bc5c386ee0714fde56f78832695e569f564300000000000000000000000000000000000000000000000000005af3107a400000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -5039,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec34000000000000000000000000f39772b205e4e74b4eb2aefacc4208aca60c23ff000000000000000000000000f39772b205e4e74b4eb2aefacc4208aca60c23ff000000000000000000000000000000000000000000000000006d82c6d4a77f6300000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -5040,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec34000000000000000000000000b63d6fb10663f481a8b6f2be5c4dcbddb8fb12ac000000000000000000000000b63d6fb10663f481a8b6f2be5c4dcbddb8fb12ac00000000000000000000000000000000000000000000000000005af3107a400000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -5041,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec340000000000000000000000002507c70bd624a4e873fb016e45b60e65ceb9e68a0000000000000000000000002507c70bd624a4e873fb016e45b60e65ceb9e68a00000000000000000000000000000000000000000000000000038d7ea4c6800000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -5042,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec34000000000000000000000000e315d07fd063fc2c6784a1ab0bdc5292402c0564000000000000000000000000e315d07fd063fc2c6784a1ab0bdc5292402c056400000000000000000000000000000000000000000000000000038d7ea4c6800000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -5043,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec3400000000000000000000000038e47a84ab5fb6970a50d282bf46db995f1cd6cb00000000000000000000000038e47a84ab5fb6970a50d282bf46db995f1cd6cb000000000000000000000000000000000000000000000000003570ffc60a1c7900000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -5045,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec340000000000000000000000007e5af51bd0edbfa5a622370427331466ad140cc30000000000000000000000007e5af51bd0edbfa5a622370427331466ad140cc300000000000000000000000000000000000000000000000000038d7ea4c6800000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -5048,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec34000000000000000000000000acd559d2284cc8c01d0e9bcb0d802f66efb5cd45000000000000000000000000acd559d2284cc8c01d0e9bcb0d802f66efb5cd450000000000000000000000000000000000000000000000000011c37937e0800000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -5049,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec34000000000000000000000000d9c152cd51f1f4bc34395f0cd8e906bccf9a103b000000000000000000000000d9c152cd51f1f4bc34395f0cd8e906bccf9a103b00000000000000000000000000000000000000000000000000f6d4bf351f523d00000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -5050,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec340000000000000000000000006328647e2fadfee689f1bd53d4fd6958e3ae8dc00000000000000000000000006328647e2fadfee689f1bd53d4fd6958e3ae8dc00000000000000000000000000000000000000000000000000022718923b9ce0000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -5051,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec3400000000000000000000000020c609472f22804ed2dbc161a6dcc7495e577ff700000000000000000000000020c609472f22804ed2dbc161a6dcc7495e577ff7000000000000000000000000000000000000000000000000000110d9316ec00000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -5053,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec34000000000000000000000000ea1705996645f718a575ca7bafee22e27e2faf52000000000000000000000000ea1705996645f718a575ca7bafee22e27e2faf5200000000000000000000000000000000000000000000000000243030f2a131d600000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -5054,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec340000000000000000000000005365471fdc9e4e2423026b4120243b8cd43f44820000000000000000000000005365471fdc9e4e2423026b4120243b8cd43f448200000000000000000000000000000000000000000000000000005af3107a400000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -5055,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec34000000000000000000000000744369c5ca6caae54c50bc8afb2fab3492b4e9b5000000000000000000000000744369c5ca6caae54c50bc8afb2fab3492b4e9b5000000000000000000000000000000000000000000000000001c196b162ad80000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -5056,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec34000000000000000000000000b005d1f62b0ef700b7fecc88c53e725a5e7ef115000000000000000000000000b005d1f62b0ef700b7fecc88c53e725a5e7ef11500000000000000000000000000000000000000000000000000005af3107a400000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -5057,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec34000000000000000000000000fb150564534e5c910bffafac2e114d5766ad523e000000000000000000000000fb150564534e5c910bffafac2e114d5766ad523e00000000000000000000000000000000000000000000000000005af3107a400000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -5058,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec340000000000000000000000009672bf43e2e9092b28c9450f0e6cea60245d3f100000000000000000000000009672bf43e2e9092b28c9450f0e6cea60245d3f1000000000000000000000000000000000000000000000000000005af3107a400000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -5059,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec3400000000000000000000000068ebd81edcf5f1e11c3807c75b98ddee6409513700000000000000000000000068ebd81edcf5f1e11c3807c75b98ddee6409513700000000000000000000000000000000000000000000000000005af3107a400000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -5060,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec34000000000000000000000000ee6b7a44d790a125c0fa574e113dc7d9b0d7722c000000000000000000000000ee6b7a44d790a125c0fa574e113dc7d9b0d7722c0000000000000000000000000000000000000000000000000019000c7ba8480000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -5061,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec340000000000000000000000008262e1fe3ad8dedae6610b108bd0e17ecbce70320000000000000000000000008262e1fe3ad8dedae6610b108bd0e17ecbce703200000000000000000000000000000000000000000000000000005af3107a400000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -5062,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec340000000000000000000000008ac738ef43a130a3f72e600c2719df1889e5c96c0000000000000000000000008ac738ef43a130a3f72e600c2719df1889e5c96c000000000000000000000000000000000000000000000000000110d9316ec00000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -5063,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec3400000000000000000000000006a77e6b069cecf50bb5b4d4b0359619c91b6b1100000000000000000000000006a77e6b069cecf50bb5b4d4b0359619c91b6b1100000000000000000000000000000000000000000000000000005af3107a400000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -5064,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec340000000000000000000000008a74324b8fa2c48c88ccf73bc440e06b92a487800000000000000000000000008a74324b8fa2c48c88ccf73bc440e06b92a4878000000000000000000000000000000000000000000000000000005af3107a400000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -5065,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec340000000000000000000000000917b0d7b1ae65924d096a3d726c882b20828ff90000000000000000000000000917b0d7b1ae65924d096a3d726c882b20828ff900000000000000000000000000000000000000000000000000005af3107a400000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -5066,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec340000000000000000000000000e2057ac34968dc23e40b8a926531afa4950777b0000000000000000000000000e2057ac34968dc23e40b8a926531afa4950777b00000000000000000000000000000000000000000000000000005af3107a400000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -5067,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec34000000000000000000000000c5c9821a3166b745500dfefbcf75eebe94f3bc31000000000000000000000000c5c9821a3166b745500dfefbcf75eebe94f3bc3100000000000000000000000000000000000000000000000000040b1783e7c30000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -5068,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec340000000000000000000000001828ea84f0fc021a437f387b09e9efa92da08a0b0000000000000000000000001828ea84f0fc021a437f387b09e9efa92da08a0b00000000000000000000000000000000000000000000000000005af3107a400000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -5069,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec3400000000000000000000000032f5b4a9cddc363919f0f4a3d558b2fec57c082a00000000000000000000000032f5b4a9cddc363919f0f4a3d558b2fec57c082a00000000000000000000000000000000000000000000000000158d80bd91057200000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -5070,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec34000000000000000000000000c2b45fd77c27d30bbbffad298e9c19dd658e179a000000000000000000000000c2b45fd77c27d30bbbffad298e9c19dd658e179a0000000000000000000000000000000000000000000000000061b24946da450000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -5071,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec34000000000000000000000000adfed7f23a61f2e7a5f2033f3de64c3c19322c1c000000000000000000000000adfed7f23a61f2e7a5f2033f3de64c3c19322c1c000000000000000000000000000000000000000000000000002386f26fc1000000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -5072,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec34000000000000000000000000bccd47e23ff721f0f14078c6d6b3dfc8d1250128000000000000000000000000bccd47e23ff721f0f14078c6d6b3dfc8d1250128000000000000000000000000000000000000000000000000000110d9316ec00000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -5073,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec340000000000000000000000008174ea753c3625514685426b042f1a590d2b84d60000000000000000000000008174ea753c3625514685426b042f1a590d2b84d6000000000000000000000000000000000000000000000000000110d9316ec00000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -5074,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec34000000000000000000000000d81fc84e3efa1022809a03d4a43dfd83ad695fbd000000000000000000000000d81fc84e3efa1022809a03d4a43dfd83ad695fbd000000000000000000000000000000000000000000000000002b0583e48f280000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -5075,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec340000000000000000000000001ca849c36a41e248bcb1bf3b61d0c1d3a05330160000000000000000000000001ca849c36a41e248bcb1bf3b61d0c1d3a053301600000000000000000000000000000000000000000000000000901471898663ee00000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,0x2d46ca45812591aac5b3c5720321a653456d820965cb8ddfdf9caec058c4ed97,2022-05-22 09:40:49.000 UTC,0,true -5076,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec3400000000000000000000000083d553362dfc0c1295e98f879edc98d54a8d885400000000000000000000000083d553362dfc0c1295e98f879edc98d54a8d885400000000000000000000000000000000000000000000000000a8cd9abaead50000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -5077,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec34000000000000000000000000b264a584feeb81978319c84c96aa71fc7fccc652000000000000000000000000b264a584feeb81978319c84c96aa71fc7fccc6520000000000000000000000000000000000000000000000000017969a87065a3900000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -5078,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec34000000000000000000000000f964a658db4f29d1942eb07abc7927a0c09f10c8000000000000000000000000f964a658db4f29d1942eb07abc7927a0c09f10c80000000000000000000000000000000000000000000000000048cf7afa779d4c00000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -5079,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec34000000000000000000000000e4b5364b23202aa18bb38c6b82bcc0910ad8eec4000000000000000000000000e4b5364b23202aa18bb38c6b82bcc0910ad8eec400000000000000000000000000000000000000000000000000411de34a91230000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -5080,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec34000000000000000000000000434a8f647db4b515560a3f9b8d2518550fc351e2000000000000000000000000434a8f647db4b515560a3f9b8d2518550fc351e2000000000000000000000000000000000000000000000000001d96f0dad0230000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -5081,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec340000000000000000000000003efedddeed8d7eaeb7d2d964f4f365cc66cd9e130000000000000000000000003efedddeed8d7eaeb7d2d964f4f365cc66cd9e1300000000000000000000000000000000000000000000000000038d7ea4c6800000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -5082,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0xa9f9e675000000000000000000000000dac17f958d2ee523a2206206994597c13d831ec700000000000000000000000094b008aa00579c1307b0ef2c499ad98a8ce58e580000000000000000000000007b8bafdbbfb50a891e627d20508cda2988b817260000000000000000000000007b8bafdbbfb50a891e627d20508cda2988b81726000000000000000000000000000000000000000000000000000000000098968000000000000000000000000000000000000000000000000000000000000000c00000000000000000000000000000000000000000000000000000000000000000,,,1,true -5083,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec3400000000000000000000000090f21c3b410072a886703c1a30f70378c8367bac00000000000000000000000090f21c3b410072a886703c1a30f70378c8367bac00000000000000000000000000000000000000000000000000038d7ea4c6800000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -5084,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec34000000000000000000000000d83d580e194ed1d3df1d1315912c905ebb21d26a000000000000000000000000d83d580e194ed1d3df1d1315912c905ebb21d26a00000000000000000000000000000000000000000000000000038d7ea4c6800000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -5085,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec3400000000000000000000000060a4c36f24e7c8668a5533766d51d50a5331366d00000000000000000000000060a4c36f24e7c8668a5533766d51d50a5331366d00000000000000000000000000000000000000000000000000038d7ea4c6800000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -5086,0x10e6593cdda8c58a1d0f14c5164b376352a55f2f,0x467194771dae2967aef3ecbedd3bf9a310c76c65,0xa9f9e6750000000000000000000000006b175474e89094c44da98b954eedeac495271d0f000000000000000000000000da10009cbd5d07dd0cecc66161fc93d7c9000da10000000000000000000000005c2930356784c160a667c5673b2ef1996b9d69570000000000000000000000005c2930356784c160a667c5673b2ef1996b9d6957000000000000000000000000000000000000000000000001de2bdb8264d4cb8500000000000000000000000000000000000000000000000000000000000000c00000000000000000000000000000000000000000000000000000000000000000,,,1,true -5087,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec3400000000000000000000000091f886f277cb32c24455b2fb8695dc1a1aad01d600000000000000000000000091f886f277cb32c24455b2fb8695dc1a1aad01d600000000000000000000000000000000000000000000000000038d7ea4c6800000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -5088,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec340000000000000000000000001b7645f44ab4bd0a4edd00db6a4da9074fb8d8f80000000000000000000000001b7645f44ab4bd0a4edd00db6a4da9074fb8d8f800000000000000000000000000000000000000000000000000038d7ea4c6800000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -5089,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec34000000000000000000000000642970fa022ea7e17d4927691f59c3ba46554cb2000000000000000000000000642970fa022ea7e17d4927691f59c3ba46554cb200000000000000000000000000000000000000000000000000038d7ea4c6800000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -5090,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec34000000000000000000000000f3b9ce7f164a8a7e520ac46ba7eac65ae2394d74000000000000000000000000f3b9ce7f164a8a7e520ac46ba7eac65ae2394d7400000000000000000000000000000000000000000000000000038d7ea4c6800000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -5091,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec34000000000000000000000000363508d7b605b4ef829f16a1b29968b7553733ae000000000000000000000000363508d7b605b4ef829f16a1b29968b7553733ae00000000000000000000000000000000000000000000000000038d7ea4c6800000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -5092,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec340000000000000000000000000d3b604a8f4cf11588ede649f1bd8f89569198d40000000000000000000000000d3b604a8f4cf11588ede649f1bd8f89569198d400000000000000000000000000000000000000000000000000038d7ea4c6800000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -5093,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec34000000000000000000000000375ec6cf33b035b8cf5f68bcdcd4aca8bf92aea1000000000000000000000000375ec6cf33b035b8cf5f68bcdcd4aca8bf92aea100000000000000000000000000000000000000000000000000038d7ea4c6800000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -5094,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0xa9f9e675000000000000000000000000dac17f958d2ee523a2206206994597c13d831ec700000000000000000000000094b008aa00579c1307b0ef2c499ad98a8ce58e58000000000000000000000000877b97d30ab9fdec5e09da78d5caf245ad25e027000000000000000000000000877b97d30ab9fdec5e09da78d5caf245ad25e02700000000000000000000000000000000000000000000000000000000020a0df000000000000000000000000000000000000000000000000000000000000000c00000000000000000000000000000000000000000000000000000000000000000,,,1,true -5095,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec340000000000000000000000001168a9a9d9bbe07530df288e268f73e704f45c350000000000000000000000001168a9a9d9bbe07530df288e268f73e704f45c3500000000000000000000000000000000000000000000000000038d7ea4c6800000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -5096,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec3400000000000000000000000074b56f1c91a2557939db5faf7b0c8df190e653b800000000000000000000000074b56f1c91a2557939db5faf7b0c8df190e653b800000000000000000000000000000000000000000000000000038d7ea4c6800000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -5097,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec340000000000000000000000003cf61f00721fddf7ee026c33fdcd5f23d70d5ec50000000000000000000000003cf61f00721fddf7ee026c33fdcd5f23d70d5ec500000000000000000000000000000000000000000000000000038d7ea4c6800000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -5098,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec3400000000000000000000000059651d28e14a422e14cac75a1adc07fa8d743afb00000000000000000000000059651d28e14a422e14cac75a1adc07fa8d743afb00000000000000000000000000000000000000000000000000038d7ea4c6800000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -5099,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec340000000000000000000000005b1030ddf0fec2b6136550c8195ae99caddf4a680000000000000000000000005b1030ddf0fec2b6136550c8195ae99caddf4a6800000000000000000000000000000000000000000000000000038d7ea4c6800000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -5100,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec340000000000000000000000001b6db660ec54b809579f70b901aad272c45834910000000000000000000000001b6db660ec54b809579f70b901aad272c458349100000000000000000000000000000000000000000000000000038d7ea4c6800000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -5101,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec34000000000000000000000000db23e2c8d54973df91917e22943b65d99b050b78000000000000000000000000db23e2c8d54973df91917e22943b65d99b050b7800000000000000000000000000000000000000000000000000038d7ea4c6800000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -5102,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec3400000000000000000000000037a8209e3e658e16ad62361cc1560359324f703400000000000000000000000037a8209e3e658e16ad62361cc1560359324f703400000000000000000000000000000000000000000000000000038d7ea4c6800000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -5103,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec3400000000000000000000000070cf8841372eab5d939ce3f7703f068ac4ea92e000000000000000000000000070cf8841372eab5d939ce3f7703f068ac4ea92e000000000000000000000000000000000000000000000000000038d7ea4c6800000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -5104,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec340000000000000000000000002f45f9b40c7a7fa66e2d1eb259a463ed60d0701b0000000000000000000000002f45f9b40c7a7fa66e2d1eb259a463ed60d0701b00000000000000000000000000000000000000000000000000038d7ea4c6800000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -5105,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec340000000000000000000000003664349a38d509eba3b9477f26b8c9c900bec89b0000000000000000000000003664349a38d509eba3b9477f26b8c9c900bec89b00000000000000000000000000000000000000000000000000038d7ea4c6800000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -5106,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec3400000000000000000000000042b801dedb7f2c90bff9c787ca7d50be659c925900000000000000000000000042b801dedb7f2c90bff9c787ca7d50be659c925900000000000000000000000000000000000000000000000000038d7ea4c6800000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -5107,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec340000000000000000000000007ec5b8820356f4b53b6985e7fed01a7911f54d2d0000000000000000000000007ec5b8820356f4b53b6985e7fed01a7911f54d2d00000000000000000000000000000000000000000000000000038d7ea4c6800000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -5108,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec340000000000000000000000001125f5d40d3708bf9ba2438d542b125707be24620000000000000000000000001125f5d40d3708bf9ba2438d542b125707be246200000000000000000000000000000000000000000000000000038d7ea4c6800000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -5109,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec3400000000000000000000000091db989532cb978665423ad55fd8b9cb0476f5d100000000000000000000000091db989532cb978665423ad55fd8b9cb0476f5d100000000000000000000000000000000000000000000000000038d7ea4c6800000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -5110,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec340000000000000000000000006b140f83c7a2502a36f71fca69aef1bea0223e460000000000000000000000006b140f83c7a2502a36f71fca69aef1bea0223e4600000000000000000000000000000000000000000000000000038d7ea4c6800000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -5111,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec34000000000000000000000000f77c54df6e8783ebb224695866dea18757cfce1a000000000000000000000000f77c54df6e8783ebb224695866dea18757cfce1a00000000000000000000000000000000000000000000000000038d7ea4c6800000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -5112,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec34000000000000000000000000dd7b0dc4cc48e8748fb3d30be2b4b05ac2dcb32b000000000000000000000000dd7b0dc4cc48e8748fb3d30be2b4b05ac2dcb32b00000000000000000000000000000000000000000000000000038d7ea4c6800000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -5115,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec34000000000000000000000000a43e62c525531a21620addbac63a1c31f36d1fc6000000000000000000000000a43e62c525531a21620addbac63a1c31f36d1fc600000000000000000000000000000000000000000000000000038d7ea4c6800000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -5116,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec340000000000000000000000006ab120e7d26d6aadd2034e7dc8ee9e71b6776c010000000000000000000000006ab120e7d26d6aadd2034e7dc8ee9e71b6776c0100000000000000000000000000000000000000000000000000038d7ea4c6800000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -5117,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec34000000000000000000000000d4f6c31a81d46725c352889c6b2e12d2f9108d9a000000000000000000000000d4f6c31a81d46725c352889c6b2e12d2f9108d9a00000000000000000000000000000000000000000000000000038d7ea4c6800000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -5118,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec340000000000000000000000009ac03be125c9dc1ba195a4724246f4e2938191800000000000000000000000009ac03be125c9dc1ba195a4724246f4e29381918000000000000000000000000000000000000000000000000000038d7ea4c6800000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -5119,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec340000000000000000000000007604a95fa996c51ed0c7b79cc932441efe403fe40000000000000000000000007604a95fa996c51ed0c7b79cc932441efe403fe400000000000000000000000000000000000000000000000000038d7ea4c6800000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -5120,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec340000000000000000000000002b8663965dc40d17aad211936daf6267b5f7a16b0000000000000000000000002b8663965dc40d17aad211936daf6267b5f7a16b000000000000000000000000000000000000000000000000001f1abf669efb5e00000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -5121,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec34000000000000000000000000081a473df6d2c7ed704230153ccb8c5d9a505b07000000000000000000000000081a473df6d2c7ed704230153ccb8c5d9a505b0700000000000000000000000000000000000000000000000000038d7ea4c6800000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -5122,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec3400000000000000000000000045ea183a7daf2b82610a4f8e68f65243c0f360e900000000000000000000000045ea183a7daf2b82610a4f8e68f65243c0f360e9000000000000000000000000000000000000000000000000000110d9316ec00000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -5123,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec34000000000000000000000000c53a9720211ad3370fae5837371462b1eb1de0db000000000000000000000000c53a9720211ad3370fae5837371462b1eb1de0db000000000000000000000000000000000000000000000000002386f26fc1000000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -5124,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec34000000000000000000000000f55ef9fcad3d864cd08d30d6c92acd61f5ce5f86000000000000000000000000f55ef9fcad3d864cd08d30d6c92acd61f5ce5f8600000000000000000000000000000000000000000000000000038d7ea4c6800000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -5125,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec34000000000000000000000000731ae2c51a3f8d765fde66d14e669dcf030a4a4b000000000000000000000000731ae2c51a3f8d765fde66d14e669dcf030a4a4b00000000000000000000000000000000000000000000000000038d7ea4c6800000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -5126,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec340000000000000000000000003daa719ad16020634aacfebf13defeceead15f510000000000000000000000003daa719ad16020634aacfebf13defeceead15f510000000000000000000000000000000000000000000000000008a5ec77e6053b00000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -5127,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec3400000000000000000000000015c09552494f8e969f1d96b4b83735b72f491db400000000000000000000000015c09552494f8e969f1d96b4b83735b72f491db4000000000000000000000000000000000000000000000000000110d9316ec00000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -5128,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec34000000000000000000000000c13ffa37fdc78fadd8ed0e9bf9833a435725fd77000000000000000000000000c13ffa37fdc78fadd8ed0e9bf9833a435725fd7700000000000000000000000000000000000000000000000000356e1cd5a0107200000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -5129,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec3400000000000000000000000025caf39455495c39c599700bf7187718d195f49100000000000000000000000025caf39455495c39c599700bf7187718d195f49100000000000000000000000000000000000000000000000000038d7ea4c6800000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -5130,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec340000000000000000000000003fde77ca6fab639e4b4d02509b5dab5c6e6fcefe0000000000000000000000003fde77ca6fab639e4b4d02509b5dab5c6e6fcefe00000000000000000000000000000000000000000000000000038d7ea4c6800000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -5131,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec340000000000000000000000001d17e9a93e0396d0eb5d5e48b9b54782f6d1a8360000000000000000000000001d17e9a93e0396d0eb5d5e48b9b54782f6d1a836000000000000000000000000000000000000000000000000001c6bf52634000000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -5132,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec340000000000000000000000000d4d00d3fc5aa2cba1df644ab6e89df38cb276730000000000000000000000000d4d00d3fc5aa2cba1df644ab6e89df38cb2767300000000000000000000000000000000000000000000000000038d7ea4c6800000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -5133,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec34000000000000000000000000534453452c6f72e5bbf7c4afa9e76228c2d0c0a4000000000000000000000000534453452c6f72e5bbf7c4afa9e76228c2d0c0a400000000000000000000000000000000000000000000000000038d7ea4c6800000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -5134,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec340000000000000000000000009437cadead20b62e178494105c9023c874ceef9a0000000000000000000000009437cadead20b62e178494105c9023c874ceef9a00000000000000000000000000000000000000000000000000005af3107a400000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -5135,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec3400000000000000000000000046dfac775041c1fa8ca013c25fdb1fb61cd6642000000000000000000000000046dfac775041c1fa8ca013c25fdb1fb61cd6642000000000000000000000000000000000000000000000000000038d7ea4c6800000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -5136,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec340000000000000000000000000464cd1b13f62d25226f1d38dc0ecfea2a38e1a10000000000000000000000000464cd1b13f62d25226f1d38dc0ecfea2a38e1a1000000000000000000000000000000000000000000000000001d413fda682e4f00000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -5137,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec340000000000000000000000003a8b1567856358e3f0009c90c2075fac8a4019620000000000000000000000003a8b1567856358e3f0009c90c2075fac8a40196200000000000000000000000000000000000000000000000000038d7ea4c6800000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -5138,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec3400000000000000000000000071a5f9098e14d527bf9f183a6902fa423f0c5ec800000000000000000000000071a5f9098e14d527bf9f183a6902fa423f0c5ec8000000000000000000000000000000000000000000000000000110d9316ec00000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -5139,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec340000000000000000000000006483218c93004f184b20f9a8eba04c408104ca4e0000000000000000000000006483218c93004f184b20f9a8eba04c408104ca4e00000000000000000000000000000000000000000000000000038d7ea4c6800000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -5140,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec340000000000000000000000006c9ecedb72533f58e189c4d1291d87312f1253880000000000000000000000006c9ecedb72533f58e189c4d1291d87312f12538800000000000000000000000000000000000000000000000000005af3107a400000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -5141,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec34000000000000000000000000a0f8f9ba307045ffd866add6f7c6ddcc99f35cac000000000000000000000000a0f8f9ba307045ffd866add6f7c6ddcc99f35cac00000000000000000000000000000000000000000000000000038d7ea4c6800000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -5142,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec34000000000000000000000000d44b22adcbb1be539ade0b45c392996863180ceb000000000000000000000000d44b22adcbb1be539ade0b45c392996863180ceb00000000000000000000000000000000000000000000000000005af3107a400000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -5143,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec34000000000000000000000000f913066302af3e8872bbc65496872d1d6f270429000000000000000000000000f913066302af3e8872bbc65496872d1d6f27042900000000000000000000000000000000000000000000000000038d7ea4c6800000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -5144,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec34000000000000000000000000f579dda8080dd092e891dc6a00622f46d9b4e7b2000000000000000000000000f579dda8080dd092e891dc6a00622f46d9b4e7b200000000000000000000000000000000000000000000000000005af3107a400000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -5145,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec3400000000000000000000000041f3e0ff13d91feb6f0cc3f3b5269b8d519aedd200000000000000000000000041f3e0ff13d91feb6f0cc3f3b5269b8d519aedd200000000000000000000000000000000000000000000000000038d7ea4c6800000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -5146,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec34000000000000000000000000c58bc4a0a869b901644982c99f038b8268c3c9f3000000000000000000000000c58bc4a0a869b901644982c99f038b8268c3c9f300000000000000000000000000000000000000000000000000005af3107a400000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -5147,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec340000000000000000000000004926f61b042442166a2942a3ec46f37cb97ba6f40000000000000000000000004926f61b042442166a2942a3ec46f37cb97ba6f4000000000000000000000000000000000000000000000000000110d9316ec00000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -5148,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec3400000000000000000000000096aa6052c7abf2f9a578008b3435b1cca027e0e900000000000000000000000096aa6052c7abf2f9a578008b3435b1cca027e0e900000000000000000000000000000000000000000000000000038d7ea4c6800000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -5149,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec34000000000000000000000000efb3e1a1a4a553248f7c4742a4f3ecdeb614b0c7000000000000000000000000efb3e1a1a4a553248f7c4742a4f3ecdeb614b0c7000000000000000000000000000000000000000000000000000009184e72a00000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -5150,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec34000000000000000000000000ccd3be5225cb8f7e58202398330d343a8254b8e4000000000000000000000000ccd3be5225cb8f7e58202398330d343a8254b8e400000000000000000000000000000000000000000000000000005af3107a400000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -5151,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec34000000000000000000000000ae2d97a7d5e2923bae593bcec28f950bde7e7623000000000000000000000000ae2d97a7d5e2923bae593bcec28f950bde7e762300000000000000000000000000000000000000000000000000038d7ea4c6800000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -5152,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec34000000000000000000000000efb3e1a1a4a553248f7c4742a4f3ecdeb614b0c7000000000000000000000000efb3e1a1a4a553248f7c4742a4f3ecdeb614b0c7000000000000000000000000000000000000000000000000000009184e72a00000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -5153,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec34000000000000000000000000a11d47eebdca5a10125047259c123ab22716f4f0000000000000000000000000a11d47eebdca5a10125047259c123ab22716f4f0000000000000000000000000000000000000000000000000000009184e72a00000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -5154,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec340000000000000000000000007e6ce0ba52556d871edfdef653b2b8c570cc89e80000000000000000000000007e6ce0ba52556d871edfdef653b2b8c570cc89e800000000000000000000000000000000000000000000000000038d7ea4c6800000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -5155,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec340000000000000000000000004637d0439527619e3dc8482c11bbc5a97ef6c4090000000000000000000000004637d0439527619e3dc8482c11bbc5a97ef6c409000000000000000000000000000000000000000000000000000009184e72a00000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -5156,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec34000000000000000000000000a7076b2a73c654a23d73b1007f31e0518fc3dfe4000000000000000000000000a7076b2a73c654a23d73b1007f31e0518fc3dfe4000000000000000000000000000000000000000000000000000009184e72a00000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -5157,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec34000000000000000000000000681874d70d2ee3fe858c02c56e96ec722e864c6a000000000000000000000000681874d70d2ee3fe858c02c56e96ec722e864c6a000000000000000000000000000000000000000000000000000009184e72a00000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -5158,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec34000000000000000000000000b6612097eff6defa0f70a20308d98db40f0d8b73000000000000000000000000b6612097eff6defa0f70a20308d98db40f0d8b7300000000000000000000000000000000000000000000000000038d7ea4c6800000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -5159,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec34000000000000000000000000003d17633cde823657abce86e514785e4fc19161000000000000000000000000003d17633cde823657abce86e514785e4fc19161000000000000000000000000000000000000000000000000000009184e72a00000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -5161,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec34000000000000000000000000d75ffa03684d7b92f50b72833047963a1029f04b000000000000000000000000d75ffa03684d7b92f50b72833047963a1029f04b000000000000000000000000000000000000000000000000000009184e72a00000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -5162,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec340000000000000000000000006856b58f89ac4646039b5e2adcddb20fa18b590c0000000000000000000000006856b58f89ac4646039b5e2adcddb20fa18b590c00000000000000000000000000000000000000000000000000038d7ea4c6800000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -5163,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec3400000000000000000000000069e9a4dcb5cfe4776083a2a4f93437ae78e9166900000000000000000000000069e9a4dcb5cfe4776083a2a4f93437ae78e91669000000000000000000000000000000000000000000000000000009184e72a00000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -5164,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec3400000000000000000000000037fd65e19beccae404be8f4fb5e65b8ac7dd96fe00000000000000000000000037fd65e19beccae404be8f4fb5e65b8ac7dd96fe000000000000000000000000000000000000000000000000000009184e72a00000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -5165,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec340000000000000000000000004867063da4d6c3717bdc0a5d87a370a022bbb8aa0000000000000000000000004867063da4d6c3717bdc0a5d87a370a022bbb8aa000000000000000000000000000000000000000000000000000009184e72a00000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -5166,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec340000000000000000000000008c03086a0db933b7e5ffe8430f698a955b25859b0000000000000000000000008c03086a0db933b7e5ffe8430f698a955b25859b00000000000000000000000000000000000000000000000000038d7ea4c6800000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -5167,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec34000000000000000000000000ce3711b0900c00912b8b388ab0c619437e9bf6a9000000000000000000000000ce3711b0900c00912b8b388ab0c619437e9bf6a9000000000000000000000000000000000000000000000000000009184e72a00000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -5168,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec340000000000000000000000001641669254cb47d614586c0c049b653f247a54a40000000000000000000000001641669254cb47d614586c0c049b653f247a54a4000000000000000000000000000000000000000000000000000009184e72a00000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -5169,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec34000000000000000000000000470bd03ead42a683dc30ac39ec136a0c0325fb2b000000000000000000000000470bd03ead42a683dc30ac39ec136a0c0325fb2b000000000000000000000000000000000000000000000000000110d9316ec00000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -5170,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec3400000000000000000000000054baccf09a47265b1166364dc17f560e58462c2e00000000000000000000000054baccf09a47265b1166364dc17f560e58462c2e00000000000000000000000000000000000000000000000000038d7ea4c6800000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -5171,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec3400000000000000000000000012897bcabbdb34a9761562c59eab49b22b59e8b700000000000000000000000012897bcabbdb34a9761562c59eab49b22b59e8b70000000000000000000000000000000000000000000000000009a0c5a5428f0000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -5172,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec340000000000000000000000004778c3cd7bd498e8c8212775876c95352b6780ab0000000000000000000000004778c3cd7bd498e8c8212775876c95352b6780ab000000000000000000000000000000000000000000000000000009184e72a00000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -5173,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec340000000000000000000000009a288945a3524d996265ff3c2ecf5ed329b192f60000000000000000000000009a288945a3524d996265ff3c2ecf5ed329b192f6000000000000000000000000000000000000000000000000000009184e72a00000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -5174,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec34000000000000000000000000400b1f85bcac75499ac094d72a2aee0aa88b9236000000000000000000000000400b1f85bcac75499ac094d72a2aee0aa88b923600000000000000000000000000000000000000000000000000038d7ea4c6800000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -5175,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec34000000000000000000000000efb3e1a1a4a553248f7c4742a4f3ecdeb614b0c7000000000000000000000000efb3e1a1a4a553248f7c4742a4f3ecdeb614b0c7000000000000000000000000000000000000000000000000000009184e72a00000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -5176,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec34000000000000000000000000e900fd85cae85971e684dd56b2eee1c542bb08e0000000000000000000000000e900fd85cae85971e684dd56b2eee1c542bb08e000000000000000000000000000000000000000000000000000038d7ea4c6800000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -5177,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec34000000000000000000000000a55e93fd3cce2cf40d43824b2f18889f404ddf57000000000000000000000000a55e93fd3cce2cf40d43824b2f18889f404ddf57000000000000000000000000000000000000000000000000000009184e72a00000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -5178,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec340000000000000000000000001eea4cd714c11cbfa1117325743fab95140c71050000000000000000000000001eea4cd714c11cbfa1117325743fab95140c710500000000000000000000000000000000000000000000000000038d7ea4c6800000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -5179,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec340000000000000000000000005ec0153679dc5f92de0e593a11a855f68e79263a0000000000000000000000005ec0153679dc5f92de0e593a11a855f68e79263a00000000000000000000000000000000000000000000000001d5c3e8b3145a7200000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -5180,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec340000000000000000000000008212abb29d65e20b5dba67950abc03d8e88af32d0000000000000000000000008212abb29d65e20b5dba67950abc03d8e88af32d000000000000000000000000000000000000000000000000000009184e72a00000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -5181,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec340000000000000000000000004608a905c141dfd4bd31280bafacdc29d40092c70000000000000000000000004608a905c141dfd4bd31280bafacdc29d40092c7000000000000000000000000000000000000000000000000000009184e72a00000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -5182,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec3400000000000000000000000034b5b3a130dc7fee0ba9eab67dcfa7bb9342d0b800000000000000000000000034b5b3a130dc7fee0ba9eab67dcfa7bb9342d0b800000000000000000000000000000000000000000000000000038d7ea4c6800000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -5183,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec3400000000000000000000000057c6fc00ada30222a5d25f48c07692f352d11abd00000000000000000000000057c6fc00ada30222a5d25f48c07692f352d11abd000000000000000000000000000000000000000000000000000009184e72a00000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -5184,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec340000000000000000000000006cbda63ab9186d62792b6cacb45ce9dcef4faee90000000000000000000000006cbda63ab9186d62792b6cacb45ce9dcef4faee9000000000000000000000000000000000000000000000000000009184e72a00000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -5185,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec34000000000000000000000000d88b64bdea80595c13e0bde5782998a3dc314903000000000000000000000000d88b64bdea80595c13e0bde5782998a3dc31490300000000000000000000000000000000000000000000000000038d7ea4c6800000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -5186,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec34000000000000000000000000fcd02843e312979e7e07e65725136ab91e0bd460000000000000000000000000fcd02843e312979e7e07e65725136ab91e0bd46000000000000000000000000000000000000000000000000000038d7ea4c6800000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -5187,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec340000000000000000000000002a3d0b7a441e85b99b876c72d0d031ed27b307ff0000000000000000000000002a3d0b7a441e85b99b876c72d0d031ed27b307ff00000000000000000000000000000000000000000000000000038d7ea4c6800000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -5188,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec34000000000000000000000000a886fb5ae7e8f1d45e9f76e5c8d352f829968726000000000000000000000000a886fb5ae7e8f1d45e9f76e5c8d352f82996872600000000000000000000000000000000000000000000000000038d7ea4c6800000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -5189,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec340000000000000000000000000c52971bb63f84c467e38b95e1492d613c9380910000000000000000000000000c52971bb63f84c467e38b95e1492d613c93809100000000000000000000000000000000000000000000000000038d7ea4c6800000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -5190,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec340000000000000000000000006abff89d51064459b897e00a5416aec2c4ce2ea70000000000000000000000006abff89d51064459b897e00a5416aec2c4ce2ea700000000000000000000000000000000000000000000000000038d7ea4c6800000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -5191,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec340000000000000000000000008b700bd8e560b63738c7ca36a22ad47b51af3fdd0000000000000000000000008b700bd8e560b63738c7ca36a22ad47b51af3fdd00000000000000000000000000000000000000000000000000038d7ea4c6800000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -5192,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec34000000000000000000000000f541d31546b4c1cc5f3c78f26515dcb7290d2e63000000000000000000000000f541d31546b4c1cc5f3c78f26515dcb7290d2e6300000000000000000000000000000000000000000000000000038d7ea4c6800000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -5194,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec34000000000000000000000000b63aba9dd4b07c20d1d21430274e2f1b927cad01000000000000000000000000b63aba9dd4b07c20d1d21430274e2f1b927cad0100000000000000000000000000000000000000000000000000038d7ea4c6800000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -5196,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec34000000000000000000000000d6e43242bc4eaf2fedd216884524951a296e9883000000000000000000000000d6e43242bc4eaf2fedd216884524951a296e9883000000000000000000000000000000000000000000000000000009184e72a00000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -5197,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec340000000000000000000000004c57e133430fc4fc73d9994afc75e9a3e3a2bfdd0000000000000000000000004c57e133430fc4fc73d9994afc75e9a3e3a2bfdd00000000000000000000000000000000000000000000000000038d7ea4c6800000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -5198,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec34000000000000000000000000f6af8f97c444fe8454af14023e4f316815101af2000000000000000000000000f6af8f97c444fe8454af14023e4f316815101af200000000000000000000000000000000000000000000000000038d7ea4c6800000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -5199,0xcd9d4988c0ae61887b075ba77f08cbfad2b65068,0x3f87ff1de58128ef8fcb4c807efd776e1ac72e51,0xf4f7b41a0000000000000000000000009accc104a0453083c5c6e225c77fef20775c1ddf0000000000000000000000000000000000000000000000172238756f25ef922f,0x1a983c22304ace95fe4f64f7b08a227bfdbe9702ceca7a824aafcd59e4b43b0d,2022-04-17 18:14:58.000 UTC,0,true -5200,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec34000000000000000000000000f69269c8bed1981b5532e2aaeadfbab34dc596fe000000000000000000000000f69269c8bed1981b5532e2aaeadfbab34dc596fe000000000000000000000000000000000000000000000000004b98dffd817b3100000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -5201,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec3400000000000000000000000017d2af86b679a934431fb0530f6dec73c572ba2e00000000000000000000000017d2af86b679a934431fb0530f6dec73c572ba2e000000000000000000000000000000000000000000000000000009184e72a00000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -5202,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec34000000000000000000000000b23e35e554c48005f8fe2dff278ef8518133a02a000000000000000000000000b23e35e554c48005f8fe2dff278ef8518133a02a00000000000000000000000000000000000000000000000000038d7ea4c6800000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -5203,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec340000000000000000000000004ddf2649e6bc35d8af214da61308bf4e43b0f6b20000000000000000000000004ddf2649e6bc35d8af214da61308bf4e43b0f6b2000000000000000000000000000000000000000000000000000009184e72a00000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -5204,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec34000000000000000000000000757f2b4dc16549d1171ed9afa9ce79408e07e8c4000000000000000000000000757f2b4dc16549d1171ed9afa9ce79408e07e8c400000000000000000000000000000000000000000000000000038d7ea4c6800000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -5205,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec340000000000000000000000003a27a24432421dcbd4a7f62c444ab68277e705420000000000000000000000003a27a24432421dcbd4a7f62c444ab68277e70542000000000000000000000000000000000000000000000000000009184e72a00000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -5206,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec340000000000000000000000001febf84fee73d9618f213a201ddad1651fdecc110000000000000000000000001febf84fee73d9618f213a201ddad1651fdecc1100000000000000000000000000000000000000000000000000038d7ea4c6800000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -5207,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec34000000000000000000000000d3e03bf610c2abc4888aa24a15ff225ac9a6df3b000000000000000000000000d3e03bf610c2abc4888aa24a15ff225ac9a6df3b00000000000000000000000000000000000000000000000000038d7ea4c6800000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -5208,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec3400000000000000000000000025edbddad5c8842dfe510b96f0b64a6fe48ba5d900000000000000000000000025edbddad5c8842dfe510b96f0b64a6fe48ba5d9000000000000000000000000000000000000000000000000000009184e72a00000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -5209,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec340000000000000000000000004043bff29f796ecbb2df2d3527b736436321e1bb0000000000000000000000004043bff29f796ecbb2df2d3527b736436321e1bb00000000000000000000000000000000000000000000000000038d7ea4c6800000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -5210,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec340000000000000000000000001a875bbb57298590f72ee1659fbd45973cdf7ff30000000000000000000000001a875bbb57298590f72ee1659fbd45973cdf7ff3000000000000000000000000000000000000000000000000000009184e72a00000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -5211,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec34000000000000000000000000f4a4813fb0285d92ec2f66cb4c90491776fd279a000000000000000000000000f4a4813fb0285d92ec2f66cb4c90491776fd279a00000000000000000000000000000000000000000000000000038d7ea4c6800000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -5212,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec3400000000000000000000000084336491f96883b1c236ce63a3921cfcf6dbadd500000000000000000000000084336491f96883b1c236ce63a3921cfcf6dbadd5000000000000000000000000000000000000000000000000000009184e72a00000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -5213,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec340000000000000000000000006f2edd4daae9e807dc607b84c98a919fad8ac2120000000000000000000000006f2edd4daae9e807dc607b84c98a919fad8ac21200000000000000000000000000000000000000000000000000038d7ea4c6800000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -5214,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec340000000000000000000000002cb4bb6da78577e18b183f5ec93995b3e42fe4c80000000000000000000000002cb4bb6da78577e18b183f5ec93995b3e42fe4c8000000000000000000000000000000000000000000000000013fbe85edc9000000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -5215,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec34000000000000000000000000136ef350085641008bdc271a4eb19b084d40bc55000000000000000000000000136ef350085641008bdc271a4eb19b084d40bc5500000000000000000000000000000000000000000000000000038d7ea4c6800000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -5216,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec34000000000000000000000000c3f0ecec2511bc9c80f9a22f581bc8ded71b5dac000000000000000000000000c3f0ecec2511bc9c80f9a22f581bc8ded71b5dac00000000000000000000000000000000000000000000000000038d7ea4c6800000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -5217,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec340000000000000000000000001d967a67e2f3a87952cb61aa47bee567ed9801d60000000000000000000000001d967a67e2f3a87952cb61aa47bee567ed9801d600000000000000000000000000000000000000000000000000038d7ea4c6800000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -5218,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec340000000000000000000000006492af84362e4a176b9672ef3759099bf401051d0000000000000000000000006492af84362e4a176b9672ef3759099bf401051d00000000000000000000000000000000000000000000000000038d7ea4c6800000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -5219,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec34000000000000000000000000ee67daf4d0e40af9bb29d0c8a9ef7e88bee4a67a000000000000000000000000ee67daf4d0e40af9bb29d0c8a9ef7e88bee4a67a000000000000000000000000000000000000000000000000000009184e72a00000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -5220,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec340000000000000000000000005a932e8b317d3193e258a5b47e8932f961f1ad380000000000000000000000005a932e8b317d3193e258a5b47e8932f961f1ad38000000000000000000000000000000000000000000000000000009184e72a00000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -5221,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec34000000000000000000000000b38857d4c47997ebb95cb6b43c9fcdf212504c11000000000000000000000000b38857d4c47997ebb95cb6b43c9fcdf212504c1100000000000000000000000000000000000000000000000000038d7ea4c6800000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -5222,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec34000000000000000000000000a192e8015f2e7fc714f7ccafc4a8cc951dae32d0000000000000000000000000a192e8015f2e7fc714f7ccafc4a8cc951dae32d000000000000000000000000000000000000000000000000000038d7ea4c6800000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -5223,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec340000000000000000000000002901e47e5ca1f6b3a1a8fa1dfff88fda27782e0c0000000000000000000000002901e47e5ca1f6b3a1a8fa1dfff88fda27782e0c000000000000000000000000000000000000000000000000000009184e72a00000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -5224,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec340000000000000000000000001e31fdb4dec937e220b28adeef0cd4c2563f3a5c0000000000000000000000001e31fdb4dec937e220b28adeef0cd4c2563f3a5c00000000000000000000000000000000000000000000000000038d7ea4c6800000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -5225,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec3400000000000000000000000051f7851943420194e50dbbf76abbc60faa5cb24400000000000000000000000051f7851943420194e50dbbf76abbc60faa5cb244000000000000000000000000000000000000000000000000000009184e72a00000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -5226,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec340000000000000000000000001a18d51cd028e4cb4fffd44c385dc67144fefcb00000000000000000000000001a18d51cd028e4cb4fffd44c385dc67144fefcb0000000000000000000000000000000000000000000000000004a9b638448800000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -5227,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec340000000000000000000000004748a7408abac38fcefc62e35da9868eb3b78ebe0000000000000000000000004748a7408abac38fcefc62e35da9868eb3b78ebe000000000000000000000000000000000000000000000000000009184e72a00000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -5228,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec34000000000000000000000000d343187fe6ec0578a350c8255bae21ecf2643ca0000000000000000000000000d343187fe6ec0578a350c8255bae21ecf2643ca000000000000000000000000000000000000000000000000000038d7ea4c6800000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -5229,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec34000000000000000000000000b43b826750f2e99b722254b860f7235d15c6c736000000000000000000000000b43b826750f2e99b722254b860f7235d15c6c73600000000000000000000000000000000000000000000000000038d7ea4c6800000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -5230,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec34000000000000000000000000df0ce34b903c62a5cfb43b620eaeb4dd726b92c8000000000000000000000000df0ce34b903c62a5cfb43b620eaeb4dd726b92c8000000000000000000000000000000000000000000000000000009184e72a00000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -5231,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec34000000000000000000000000f3503c57358b3b792ece9351c0630b3f35721712000000000000000000000000f3503c57358b3b792ece9351c0630b3f35721712000000000000000000000000000000000000000000000000000009184e72a00000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -5232,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec3400000000000000000000000055a134595ded9987d1ebd6bd39e28c177bbf5cf900000000000000000000000055a134595ded9987d1ebd6bd39e28c177bbf5cf900000000000000000000000000000000000000000000000000038d7ea4c6800000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -5233,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec34000000000000000000000000c166c81a8dcfd45a44267b10dfd6192a5a27ea3b000000000000000000000000c166c81a8dcfd45a44267b10dfd6192a5a27ea3b000000000000000000000000000000000000000000000000000009184e72a00000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -5234,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec340000000000000000000000003f210e462eef3da98fc1a4ebff0706e74d4f521d0000000000000000000000003f210e462eef3da98fc1a4ebff0706e74d4f521d000000000000000000000000000000000000000000000000000009184e72a00000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -5235,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec3400000000000000000000000039ebb809e994739b83c0d51106af549fbd0fb21f00000000000000000000000039ebb809e994739b83c0d51106af549fbd0fb21f000000000000000000000000000000000000000000000000000009184e72a00000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -5236,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec340000000000000000000000002c78e2adc94900e03fe98cfa7aecfa6d8b32559d0000000000000000000000002c78e2adc94900e03fe98cfa7aecfa6d8b32559d00000000000000000000000000000000000000000000000000038d7ea4c6800000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -5237,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec340000000000000000000000005f9d95c03776186f58d6021d6cff7eedea4ece030000000000000000000000005f9d95c03776186f58d6021d6cff7eedea4ece03000000000000000000000000000000000000000000000000000009184e72a00000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -5239,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec34000000000000000000000000c13f93146dd9cf19a1b1a6e99c19dbec4dc10979000000000000000000000000c13f93146dd9cf19a1b1a6e99c19dbec4dc109790000000000000000000000000000000000000000000000000119854e788acd0000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -5240,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec34000000000000000000000000a5d583aa33b9d2970714f37d9a4d3dd4dc39690d000000000000000000000000a5d583aa33b9d2970714f37d9a4d3dd4dc39690d000000000000000000000000000000000000000000000000000009184e72a00000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -5241,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec34000000000000000000000000a6fe9aa605b0aceef8891076489204334d50b7c3000000000000000000000000a6fe9aa605b0aceef8891076489204334d50b7c300000000000000000000000000000000000000000000000000038d7ea4c6800000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -5243,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec340000000000000000000000008210cee4975b26ae67ec7f4e8cc505740924bee60000000000000000000000008210cee4975b26ae67ec7f4e8cc505740924bee60000000000000000000000000000000000000000000000000012094fad0d8ea700000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -5244,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec3400000000000000000000000084df5e05e52d377ac45f588e736e37b9c77a6f3100000000000000000000000084df5e05e52d377ac45f588e736e37b9c77a6f31000000000000000000000000000000000000000000000000000009184e72a00000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -5245,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec34000000000000000000000000a2bcba5310c6a93eb4613e7a5ecce02b25be4a4d000000000000000000000000a2bcba5310c6a93eb4613e7a5ecce02b25be4a4d00000000000000000000000000000000000000000000000000038d7ea4c6800000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -5246,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec34000000000000000000000000477222d8683f29947c50c67d8c8ba9955aa0269e000000000000000000000000477222d8683f29947c50c67d8c8ba9955aa0269e000000000000000000000000000000000000000000000000000009184e72a00000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -5247,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec3400000000000000000000000021f23c8bc2875fcec3f9690cdb22a32fd389e89600000000000000000000000021f23c8bc2875fcec3f9690cdb22a32fd389e896000000000000000000000000000000000000000000000000000009184e72a00000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -5248,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec34000000000000000000000000e92e41395d76c7255c0cc2cafc41ecaa4bc15050000000000000000000000000e92e41395d76c7255c0cc2cafc41ecaa4bc1505000000000000000000000000000000000000000000000000000038d7ea4c6800000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -5249,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec340000000000000000000000009a5cac76fbbdcc0f1ef8e1a07ff188f6e42374000000000000000000000000009a5cac76fbbdcc0f1ef8e1a07ff188f6e4237400000000000000000000000000000000000000000000000000000009184e72a00000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -5250,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec3400000000000000000000000068a180a647b6e1f0ab4d6c3930adf66d06b64d0400000000000000000000000068a180a647b6e1f0ab4d6c3930adf66d06b64d04000000000000000000000000000000000000000000000000000009184e72a00000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -5251,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec34000000000000000000000000d5f879cfbc6ff77b60b063ecc01b92716dbaa1af000000000000000000000000d5f879cfbc6ff77b60b063ecc01b92716dbaa1af00000000000000000000000000000000000000000000000000038d7ea4c6800000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -5252,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec34000000000000000000000000ef3afb502c56a4a3ce43586d62e6e4c775fc5edc000000000000000000000000ef3afb502c56a4a3ce43586d62e6e4c775fc5edc000000000000000000000000000000000000000000000000000009184e72a00000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -5254,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec34000000000000000000000000e8d0f7cfed9ac546a6261c0c3bd99e005e8d1bc6000000000000000000000000e8d0f7cfed9ac546a6261c0c3bd99e005e8d1bc6000000000000000000000000000000000000000000000000000009184e72a00000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -5255,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec340000000000000000000000001f10e1ad433711989d1620baa81c0e28aef43eff0000000000000000000000001f10e1ad433711989d1620baa81c0e28aef43eff00000000000000000000000000000000000000000000000000038d7ea4c6800000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -5256,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec34000000000000000000000000fc046ce31027ac1c8ac6333f686f574aa4da5e8e000000000000000000000000fc046ce31027ac1c8ac6333f686f574aa4da5e8e000000000000000000000000000000000000000000000000000009184e72a00000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -5257,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec3400000000000000000000000042e4229a7aac161fac4bd0e8a8ecc7b26970aaa400000000000000000000000042e4229a7aac161fac4bd0e8a8ecc7b26970aaa4000000000000000000000000000000000000000000000000000009184e72a00000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -5258,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec3400000000000000000000000004dd9e316a13e69e1a1955e9b080c3eda84c839d00000000000000000000000004dd9e316a13e69e1a1955e9b080c3eda84c839d000000000000000000000000000000000000000000000000000009184e72a00000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -5259,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec340000000000000000000000008177d61d9ebcf431dea91a44a3de5ad9912761470000000000000000000000008177d61d9ebcf431dea91a44a3de5ad99127614700000000000000000000000000000000000000000000000000038d7ea4c6800000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -5260,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec34000000000000000000000000e3bf310a2a8f882788dae5bb2266863d6bb35bf8000000000000000000000000e3bf310a2a8f882788dae5bb2266863d6bb35bf8000000000000000000000000000000000000000000000000000009184e72a00000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -5261,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec34000000000000000000000000eff30cfe706c00caa925bfb6b7a2b3a469dd7587000000000000000000000000eff30cfe706c00caa925bfb6b7a2b3a469dd7587000000000000000000000000000000000000000000000000000009184e72a00000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -5262,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec34000000000000000000000000e23ea4f5031a7ff95c35f59be23915548af3ecf2000000000000000000000000e23ea4f5031a7ff95c35f59be23915548af3ecf2000000000000000000000000000000000000000000000000000009184e72a00000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -5263,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec34000000000000000000000000a23c1688d867fa92db4af59f579612128d443b61000000000000000000000000a23c1688d867fa92db4af59f579612128d443b6100000000000000000000000000000000000000000000000000038d7ea4c6800000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -5264,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec34000000000000000000000000b6ad626bbfe42a100e17881844a4b0a7b5c90ca0000000000000000000000000b6ad626bbfe42a100e17881844a4b0a7b5c90ca0000000000000000000000000000000000000000000000000004bb0cf277174a900000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -5265,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec34000000000000000000000000de4f6dd4723cfa55e0a82cb19fd82e264c2bc395000000000000000000000000de4f6dd4723cfa55e0a82cb19fd82e264c2bc395000000000000000000000000000000000000000000000000006ba0016b980a2600000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -5266,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec340000000000000000000000004acc7859f692c540a8f18fe63f6aa4f847c076e10000000000000000000000004acc7859f692c540a8f18fe63f6aa4f847c076e100000000000000000000000000000000000000000000000000038d7ea4c6800000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -5267,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec3400000000000000000000000027ed73802cbeb0fe1653873dbb80d2ff31f3f52e00000000000000000000000027ed73802cbeb0fe1653873dbb80d2ff31f3f52e00000000000000000000000000000000000000000000000000038d7ea4c6800000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -5268,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec34000000000000000000000000213d547441446f4a9f27cc9af59bcaac052ee933000000000000000000000000213d547441446f4a9f27cc9af59bcaac052ee93300000000000000000000000000000000000000000000000000038d7ea4c6800000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -5269,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec340000000000000000000000003a8de74cbe47c1602b64a4d40607761fe1cebca80000000000000000000000003a8de74cbe47c1602b64a4d40607761fe1cebca800000000000000000000000000000000000000000000000000038d7ea4c6800000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -5270,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec34000000000000000000000000ea20a895f36b7d8c45e2a75efed8b88945b0dfe6000000000000000000000000ea20a895f36b7d8c45e2a75efed8b88945b0dfe600000000000000000000000000000000000000000000000000038d7ea4c6800000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -5271,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec34000000000000000000000000085f5228040a3a56506a3dfdd8ddb110f5fa2532000000000000000000000000085f5228040a3a56506a3dfdd8ddb110f5fa253200000000000000000000000000000000000000000000000000038d7ea4c6800000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -5272,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec340000000000000000000000008fc2236ac32307df8ab5116024b5c73827c37ceb0000000000000000000000008fc2236ac32307df8ab5116024b5c73827c37ceb0000000000000000000000000000000000000000000000000095dc1de61d34b000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -5273,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec34000000000000000000000000ec4738df2cd2e8c5b438720f0cc046d91db5c7d9000000000000000000000000ec4738df2cd2e8c5b438720f0cc046d91db5c7d900000000000000000000000000000000000000000000000000038d7ea4c6800000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -5274,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0xa9f9e675000000000000000000000000a0b86991c6218b36c1d19d4a2e9eb0ce3606eb480000000000000000000000007f5c764cbc14f9669b88837ca1490cca17c31607000000000000000000000000dcdbc5ef852964945ba5d4772b26dacffcd9f59d000000000000000000000000dcdbc5ef852964945ba5d4772b26dacffcd9f59d0000000000000000000000000000000000000000000000000000000002fc352a00000000000000000000000000000000000000000000000000000000000000c00000000000000000000000000000000000000000000000000000000000000000,,,1,true -5275,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec3400000000000000000000000035026c1fd9e765c43e335f5be94d96def205834d00000000000000000000000035026c1fd9e765c43e335f5be94d96def205834d00000000000000000000000000000000000000000000000000038d7ea4c6800000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -5276,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec34000000000000000000000000e8d15c8b69d542b37cb046c0381f1d4bccf93b39000000000000000000000000e8d15c8b69d542b37cb046c0381f1d4bccf93b3900000000000000000000000000000000000000000000000000038d7ea4c6800000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -5278,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec34000000000000000000000000cfbc289e4660ebd611f880c263dd52b81024b041000000000000000000000000cfbc289e4660ebd611f880c263dd52b81024b04100000000000000000000000000000000000000000000000000038d7ea4c6800000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -5279,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec340000000000000000000000001a49d9c803a500248b8718eaa39a893bf486e6100000000000000000000000001a49d9c803a500248b8718eaa39a893bf486e61000000000000000000000000000000000000000000000000000038d7ea4c6800000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -5280,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec340000000000000000000000004cd3a4ae02572ee2889511615b0418a5692b6c2c0000000000000000000000004cd3a4ae02572ee2889511615b0418a5692b6c2c000000000000000000000000000000000000000000000000000e86572714a1ad00000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -5281,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec3400000000000000000000000081148ff43841d273b9c0ce73c39758e68a5cedeb00000000000000000000000081148ff43841d273b9c0ce73c39758e68a5cedeb00000000000000000000000000000000000000000000000000b218429a13a4ab00000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -5282,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec34000000000000000000000000ff01ee666547c77061c49b87f613a26c7de81638000000000000000000000000ff01ee666547c77061c49b87f613a26c7de8163800000000000000000000000000000000000000000000000000038d7ea4c6800000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -5283,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec34000000000000000000000000033d15d8d7e51a5875640e7e580d86e84dd16ab4000000000000000000000000033d15d8d7e51a5875640e7e580d86e84dd16ab4000000000000000000000000000000000000000000000000001a4358cabc540000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -5284,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec34000000000000000000000000699d69f311c745187510aa6130c55f6b79d9e083000000000000000000000000699d69f311c745187510aa6130c55f6b79d9e08300000000000000000000000000000000000000000000000000038d7ea4c6800000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -5285,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec34000000000000000000000000f118f2728e205bf589d871cfe7cb8cab937a3ed5000000000000000000000000f118f2728e205bf589d871cfe7cb8cab937a3ed500000000000000000000000000000000000000000000000000038d7ea4c6800000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -5286,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec34000000000000000000000000ff10964bbe2e6accd98c159dc49525c8c8092976000000000000000000000000ff10964bbe2e6accd98c159dc49525c8c809297600000000000000000000000000000000000000000000000000038d7ea4c6800000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -5287,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec34000000000000000000000000fab259ec89398d21704b880628c9127c0b813851000000000000000000000000fab259ec89398d21704b880628c9127c0b81385100000000000000000000000000000000000000000000000000038d7ea4c6800000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -5288,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec34000000000000000000000000ff9f20367488f3386a97bc3897798b0e8bd1b2da000000000000000000000000ff9f20367488f3386a97bc3897798b0e8bd1b2da0000000000000000000000000000000000000000000000000000f9f14221b43b00000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -5289,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec34000000000000000000000000f65d674d08d881ed614b5a10384870f5208cdb8a000000000000000000000000f65d674d08d881ed614b5a10384870f5208cdb8a00000000000000000000000000000000000000000000000000038d7ea4c6800000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -5290,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec34000000000000000000000000a94db14a4979e91e573caf7ac710d18514e7c43d000000000000000000000000a94db14a4979e91e573caf7ac710d18514e7c43d00000000000000000000000000000000000000000000000000038d7ea4c6800000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -5293,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec34000000000000000000000000033d15d8d7e51a5875640e7e580d86e84dd16ab4000000000000000000000000033d15d8d7e51a5875640e7e580d86e84dd16ab400000000000000000000000000000000000000000000000000005af3107a400000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -5294,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec34000000000000000000000000aa3a931e382151ab19a6f239a88275729139ee5e000000000000000000000000aa3a931e382151ab19a6f239a88275729139ee5e0000000000000000000000000000000000000000000000000005b8883354787400000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -5295,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec34000000000000000000000000052f11eb31ea2b16d2a38d9e24f32a9c60366742000000000000000000000000052f11eb31ea2b16d2a38d9e24f32a9c6036674200000000000000000000000000000000000000000000000000038d7ea4c6800000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -5296,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec34000000000000000000000000c0a70396fb43b8ba490060c95aa18edc3fd75499000000000000000000000000c0a70396fb43b8ba490060c95aa18edc3fd7549900000000000000000000000000000000000000000000000001416bb02880d06300000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -5299,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec34000000000000000000000000fcabd0beb3322ae01bb0f7a6ddceb7ae08816496000000000000000000000000fcabd0beb3322ae01bb0f7a6ddceb7ae0881649600000000000000000000000000000000000000000000000000153ad037d13f7e00000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -5300,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec340000000000000000000000007cf9e4db024bafc59fbae2264b6ab91eb902a8dc0000000000000000000000007cf9e4db024bafc59fbae2264b6ab91eb902a8dc00000000000000000000000000000000000000000000000000071afd498d000000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -5301,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec340000000000000000000000006e58bdee94a421f967ad93a0c937681e9c75aafc0000000000000000000000006e58bdee94a421f967ad93a0c937681e9c75aafc0000000000000000000000000000000000000000000000000034ecbb6f8b00b700000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -5302,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec340000000000000000000000008ef16fc940c3e88f1bfa1edb3615ca0ae8496a310000000000000000000000008ef16fc940c3e88f1bfa1edb3615ca0ae8496a3100000000000000000000000000000000000000000000000000038d7ea4c6800000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -5303,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec34000000000000000000000000b9442b2a71a85967f59c799c0b45ea048620dad0000000000000000000000000b9442b2a71a85967f59c799c0b45ea048620dad00000000000000000000000000000000000000000000000000015e6f5ac9efb8000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -5304,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec340000000000000000000000003eeb6da567597f5e61609ea2cd55531f61663b0a0000000000000000000000003eeb6da567597f5e61609ea2cd55531f61663b0a000000000000000000000000000000000000000000000000000e35fa931a000000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -5305,0x10e6593cdda8c58a1d0f14c5164b376352a55f2f,0x467194771dae2967aef3ecbedd3bf9a310c76c65,0xa9f9e6750000000000000000000000006b175474e89094c44da98b954eedeac495271d0f000000000000000000000000da10009cbd5d07dd0cecc66161fc93d7c9000da100000000000000000000000093907de38066d70109935732757b625d636e47b600000000000000000000000093907de38066d70109935732757b625d636e47b60000000000000000000000000000000000000000000000059569dbfedc46237e00000000000000000000000000000000000000000000000000000000000000c00000000000000000000000000000000000000000000000000000000000000000,,,1,true -5307,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec34000000000000000000000000f785621f8ebf63207559ed2df3a087ef44d9b2c4000000000000000000000000f785621f8ebf63207559ed2df3a087ef44d9b2c4000000000000000000000000000000000000000000000000003654696dc0650000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -5308,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec34000000000000000000000000de34f7c26fa503a3b8fe80e2df4e62a30d4dc86c000000000000000000000000de34f7c26fa503a3b8fe80e2df4e62a30d4dc86c000000000000000000000000000000000000000000000000008abda7d91f037900000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -5309,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec34000000000000000000000000255749ce8ab1dd14c09787e7405a15ff17c24459000000000000000000000000255749ce8ab1dd14c09787e7405a15ff17c2445900000000000000000000000000000000000000000000000000038d7ea4c6800000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -5310,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec3400000000000000000000000095b3d55ebee4dda802f8b86cf08779a3ef97015b00000000000000000000000095b3d55ebee4dda802f8b86cf08779a3ef97015b000000000000000000000000000000000000000000000000000110d9316ec00000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -5311,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec34000000000000000000000000b44367a09051fe452f9b2a2955ad97c73ad355bb000000000000000000000000b44367a09051fe452f9b2a2955ad97c73ad355bb0000000000000000000000000000000000000000000000000096e72c32e30acd00000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -5312,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec340000000000000000000000001aa008151d2dd54679a48653b4527bb4ca82e3fe0000000000000000000000001aa008151d2dd54679a48653b4527bb4ca82e3fe000000000000000000000000000000000000000000000000000110d9316ec00000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -5313,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec34000000000000000000000000b169602074599dea52fff5e89787dca7744f42e7000000000000000000000000b169602074599dea52fff5e89787dca7744f42e70000000000000000000000000000000000000000000000000015aac31bfa817e00000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -5314,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec340000000000000000000000002af3c89625e7679083cd1c48b0b9e54387d5f5390000000000000000000000002af3c89625e7679083cd1c48b0b9e54387d5f539000000000000000000000000000000000000000000000000002e2f6e5e14800000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -5315,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec340000000000000000000000001961b12feffeac651c293277920636d6cdd0e4dc0000000000000000000000001961b12feffeac651c293277920636d6cdd0e4dc000000000000000000000000000000000000000000000000000110d9316ec00000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -5317,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec3400000000000000000000000013bf4152e8b499b15f272fd61eb4dabe88072d9f00000000000000000000000013bf4152e8b499b15f272fd61eb4dabe88072d9f0000000000000000000000000000000000000000000000000096e051387c824c00000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -5318,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec3400000000000000000000000081178b143737677629d61d47199d76a32b537d9600000000000000000000000081178b143737677629d61d47199d76a32b537d960000000000000000000000000000000000000000000000000107f272d040b65200000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,0xf380a24ef40672bcacf8bc5cc2b5f38ef58081293b95ce3eaae1ef3d866b9e96,2022-08-15 20:42:51.000 UTC,0,true -5319,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec34000000000000000000000000b3bcf7fb3ece89c19e58ea5460dffc28ffd43aa0000000000000000000000000b3bcf7fb3ece89c19e58ea5460dffc28ffd43aa00000000000000000000000000000000000000000000000000099d8f8a5c684c500000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -5320,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec34000000000000000000000000471f5c9e664827b81f7fc7297f64da33bd8b18b5000000000000000000000000471f5c9e664827b81f7fc7297f64da33bd8b18b5000000000000000000000000000000000000000000000000001c0289df89710000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -5321,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec34000000000000000000000000c08f3cc0aa473f15113d36fa2398d1532e9feec2000000000000000000000000c08f3cc0aa473f15113d36fa2398d1532e9feec2000000000000000000000000000000000000000000000000004296d3418d05e800000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -5322,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec34000000000000000000000000b8c29c1c75efe25e27c1d0c9e97c4ac18f24a60a000000000000000000000000b8c29c1c75efe25e27c1d0c9e97c4ac18f24a60a0000000000000000000000000000000000000000000000000033cfd4b9b19bc000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -5323,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec340000000000000000000000009303002f61b7db55fd981e16bb01177a9bcd8bcf0000000000000000000000009303002f61b7db55fd981e16bb01177a9bcd8bcf00000000000000000000000000000000000000000000000000ab4ee308efd40000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -5324,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec34000000000000000000000000f8d870c2b7f63e9af2ec1e4690cbe196c05efc7f000000000000000000000000f8d870c2b7f63e9af2ec1e4690cbe196c05efc7f000000000000000000000000000000000000000000000000009affdd6c1757db00000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -5327,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec340000000000000000000000004c01e57d6de118e3384ce41d6cee30627af254de0000000000000000000000004c01e57d6de118e3384ce41d6cee30627af254de000000000000000000000000000000000000000000000000009f9b176b0f4df400000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -5329,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec340000000000000000000000000835283ae92194e867f98c70d6183a5bf4923a6a0000000000000000000000000835283ae92194e867f98c70d6183a5bf4923a6a0000000000000000000000000000000000000000000000000016fc6e43b2600000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -5331,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec340000000000000000000000008732d8a9fa97537d8c286697e9d9adc0126171750000000000000000000000008732d8a9fa97537d8c286697e9d9adc0126171750000000000000000000000000000000000000000000000000009c63e70e9c81200000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -5333,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec340000000000000000000000000a0bc05c307eda344f2a6afb2a228780e8b383af0000000000000000000000000a0bc05c307eda344f2a6afb2a228780e8b383af0000000000000000000000000000000000000000000000000059087b34ce061b00000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -5334,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec34000000000000000000000000b995486de4bd894079097717fb1152ee1e6c754f000000000000000000000000b995486de4bd894079097717fb1152ee1e6c754f0000000000000000000000000000000000000000000000000008658a56c19e6000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -5336,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec34000000000000000000000000b7596ed9c1d6e76ebeca641b810e6dddbe6ea9c5000000000000000000000000b7596ed9c1d6e76ebeca641b810e6dddbe6ea9c50000000000000000000000000000000000000000000000000042f20e077d010000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -5337,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec340000000000000000000000001279b4ee0d53a0056ec829fb1051e8a1356c5d9e0000000000000000000000001279b4ee0d53a0056ec829fb1051e8a1356c5d9e0000000000000000000000000000000000000000000000000031bced02db000000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -5338,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec340000000000000000000000005f70967c0256c7bb263313058858a2cd5feb65440000000000000000000000005f70967c0256c7bb263313058858a2cd5feb654400000000000000000000000000000000000000000000000000f195a3c4ba000000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -5339,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec34000000000000000000000000d8b95a0a595a9c01f1e152c07fbdba6de643472f000000000000000000000000d8b95a0a595a9c01f1e152c07fbdba6de643472f000000000000000000000000000000000000000000000000002386f26fc1000000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -5341,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec34000000000000000000000000aad7bd9bf8523b6812a262ecb2ca5bef5256a24e000000000000000000000000aad7bd9bf8523b6812a262ecb2ca5bef5256a24e00000000000000000000000000000000000000000000000000354a6ba7a1800000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -5342,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec340000000000000000000000002fd11c68f235ed87a4a25e0764ec1aa0c67a631c0000000000000000000000002fd11c68f235ed87a4a25e0764ec1aa0c67a631c000000000000000000000000000000000000000000000000001f8133a1914e0000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -5343,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec34000000000000000000000000c977df4bbe96fe101675313874284b7e0561d8de000000000000000000000000c977df4bbe96fe101675313874284b7e0561d8de0000000000000000000000000000000000000000000000000155785e56f36ea400000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -5344,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec340000000000000000000000007765a840b2a90464d4f4e85ba014ffe170b135be0000000000000000000000007765a840b2a90464d4f4e85ba014ffe170b135be00000000000000000000000000000000000000000000000000aa87bee538000000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -5345,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec34000000000000000000000000a308a53d18c8428339a03fe0f44ceb25c32259c0000000000000000000000000a308a53d18c8428339a03fe0f44ceb25c32259c0000000000000000000000000000000000000000000000000000110d9316ec00000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -5348,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec34000000000000000000000000ba6a5d1d74e056fb7ec1263a110f5bd9462df58a000000000000000000000000ba6a5d1d74e056fb7ec1263a110f5bd9462df58a0000000000000000000000000000000000000000000000000073b8c569e24ccb00000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -5349,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec340000000000000000000000009f507ef3ef4d3d5cef569d72666672bfdd0a5d270000000000000000000000009f507ef3ef4d3d5cef569d72666672bfdd0a5d27000000000000000000000000000000000000000000000000000110d9316ec00000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -5351,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec34000000000000000000000000ae57f5971b276289182c02cb0a9886881d3a336d000000000000000000000000ae57f5971b276289182c02cb0a9886881d3a336d00000000000000000000000000000000000000000000000000a24c17255e857f00000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -5352,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec340000000000000000000000005e89f9a34ab21e7858da997eb17d8dcdd684245b0000000000000000000000005e89f9a34ab21e7858da997eb17d8dcdd684245b000000000000000000000000000000000000000000000000000110d9316ec00000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -5353,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec340000000000000000000000001e6e21237fd68911c9e4f17690ca016aebf58f190000000000000000000000001e6e21237fd68911c9e4f17690ca016aebf58f19000000000000000000000000000000000000000000000000002386f26fc1000000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -5355,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec340000000000000000000000004b23da66d3a9689cde3e694ce0c0b8aafd97e1d10000000000000000000000004b23da66d3a9689cde3e694ce0c0b8aafd97e1d1000000000000000000000000000000000000000000000000009b4b9734ba9fa200000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -5356,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec340000000000000000000000005ecbc7e35d03bfb5310adb50f3208d68e57436f90000000000000000000000005ecbc7e35d03bfb5310adb50f3208d68e57436f9000000000000000000000000000000000000000000000000001550f7dca7000000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -5359,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec3400000000000000000000000040b41de1e402e42646aa9648a6091d670618435800000000000000000000000040b41de1e402e42646aa9648a6091d6706184358000000000000000000000000000000000000000000000000000110d9316ec00000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -5361,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec34000000000000000000000000232e9346eeecac4d51e14c02dde61a0729a204ee000000000000000000000000232e9346eeecac4d51e14c02dde61a0729a204ee00000000000000000000000000000000000000000000000000038d7ea4c6800000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -5363,0x10e6593cdda8c58a1d0f14c5164b376352a55f2f,0x467194771dae2967aef3ecbedd3bf9a310c76c65,0xa9f9e6750000000000000000000000006b175474e89094c44da98b954eedeac495271d0f000000000000000000000000da10009cbd5d07dd0cecc66161fc93d7c9000da10000000000000000000000006463dbd8ae7dfb08cfe903cdf98ea7558faf36e60000000000000000000000006463dbd8ae7dfb08cfe903cdf98ea7558faf36e600000000000000000000000000000000000000000000016b39d0ac6fafcbb8f600000000000000000000000000000000000000000000000000000000000000c00000000000000000000000000000000000000000000000000000000000000000,0x6d5aca5fcfc7bc6bff488931e7467a36c2ef502b03f4ab9e779a82d6e65b30b6,2022-03-26 20:16:11.000 UTC,0,true -5364,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec3400000000000000000000000080565b854b3f9b3697ee45b3e20a8cdadaab746e00000000000000000000000080565b854b3f9b3697ee45b3e20a8cdadaab746e00000000000000000000000000000000000000000000000000354a6ba7a1800000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -5365,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec340000000000000000000000001e6e21237fd68911c9e4f17690ca016aebf58f190000000000000000000000001e6e21237fd68911c9e4f17690ca016aebf58f19000000000000000000000000000000000000000000000000002386f26fc1000000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -5367,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec34000000000000000000000000f84f89fb1bfc303ac9744fe63a1c4f41b799b57a000000000000000000000000f84f89fb1bfc303ac9744fe63a1c4f41b799b57a00000000000000000000000000000000000000000000000000470de4df82000000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -5368,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec3400000000000000000000000017b64570484aae779d718e727e21a1b05b975da300000000000000000000000017b64570484aae779d718e727e21a1b05b975da3000000000000000000000000000000000000000000000000002386f26fc1000000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -5369,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec34000000000000000000000000918fe5fa6304f4bbc548aa64269352b2c7bf9489000000000000000000000000918fe5fa6304f4bbc548aa64269352b2c7bf9489000000000000000000000000000000000000000000000000001e25a45a05747900000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -5370,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec340000000000000000000000000329ddef7737094022baefe6d6a8b258cbdd210d0000000000000000000000000329ddef7737094022baefe6d6a8b258cbdd210d000000000000000000000000000000000000000000000000002386f26fc1000000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -5372,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec340000000000000000000000006f0fdeaa067f641bcb5932ef44629e9b4a96f5d60000000000000000000000006f0fdeaa067f641bcb5932ef44629e9b4a96f5d60000000000000000000000000000000000000000000000000093f7eb0f1f106000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -5373,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec34000000000000000000000000ebe911df04f665f84a5ba93da5090cc4076b3d46000000000000000000000000ebe911df04f665f84a5ba93da5090cc4076b3d460000000000000000000000000000000000000000000000000058d15e1762800000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -5374,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec340000000000000000000000009b602f5b8e0a87bb91f410bc88012b2a4b54ce360000000000000000000000009b602f5b8e0a87bb91f410bc88012b2a4b54ce36000000000000000000000000000000000000000000000000009536c70891000000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -5376,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec3400000000000000000000000087b57ac904dac73e9bc7938f510ec80d70951a0700000000000000000000000087b57ac904dac73e9bc7938f510ec80d70951a07000000000000000000000000000000000000000000000000002e1b55279714e600000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -5377,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec340000000000000000000000002e5d38340cb06c770bcff353f4ab90a1c83f1a100000000000000000000000002e5d38340cb06c770bcff353f4ab90a1c83f1a10000000000000000000000000000000000000000000000000002386f26fc1000000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -5378,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec340000000000000000000000001f31bdf0003f7c6d6747728f6cd9741117619b470000000000000000000000001f31bdf0003f7c6d6747728f6cd9741117619b470000000000000000000000000000000000000000000000000050cbe758eab20b00000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -5379,0x10e6593cdda8c58a1d0f14c5164b376352a55f2f,0x467194771dae2967aef3ecbedd3bf9a310c76c65,0xa9f9e6750000000000000000000000006b175474e89094c44da98b954eedeac495271d0f000000000000000000000000da10009cbd5d07dd0cecc66161fc93d7c9000da1000000000000000000000000e60d9c72c5ec15136b942525407d07527f2df2b7000000000000000000000000e60d9c72c5ec15136b942525407d07527f2df2b7000000000000000000000000000000000000000000000024b777f3586239995c00000000000000000000000000000000000000000000000000000000000000c00000000000000000000000000000000000000000000000000000000000000000,,,1,true -5380,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec3400000000000000000000000097a7415e1a2651f8700006f2111bc575f393773100000000000000000000000097a7415e1a2651f8700006f2111bc575f3937731000000000000000000000000000000000000000000000000002386f26fc1000000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -5381,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec340000000000000000000000001b1fcf0eaf1e02e7ff9592bac7a42202a5d116d30000000000000000000000001b1fcf0eaf1e02e7ff9592bac7a42202a5d116d3000000000000000000000000000000000000000000000000002386f26fc1000000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -5382,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec34000000000000000000000000e944fc5ad408665f758ece18b2e5ffe3b8eaedc9000000000000000000000000e944fc5ad408665f758ece18b2e5ffe3b8eaedc9000000000000000000000000000000000000000000000000002386f26fc1000000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -5383,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec3400000000000000000000000096668c69449b38995e6f6fd742f128b221ba0fe400000000000000000000000096668c69449b38995e6f6fd742f128b221ba0fe40000000000000000000000000000000000000000000000000107c57b2e9519d500000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -5385,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec34000000000000000000000000883c781c07abc91798bd8fd231563a0cc8bd9a1e000000000000000000000000883c781c07abc91798bd8fd231563a0cc8bd9a1e00000000000000000000000000000000000000000000000000002d79883d200000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -5386,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec340000000000000000000000004c19f3377cb50b2b8dc4169a6073316e1abb67c20000000000000000000000004c19f3377cb50b2b8dc4169a6073316e1abb67c20000000000000000000000000000000000000000000000000866402d2256033d00000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -5387,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec340000000000000000000000001267f79d6988977411338bb494f26678c7f281ba0000000000000000000000001267f79d6988977411338bb494f26678c7f281ba000000000000000000000000000000000000000000000000002386f26fc1000000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -5390,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec340000000000000000000000009ea0af889357f6ba2caa7e7e0899d518e396f0270000000000000000000000009ea0af889357f6ba2caa7e7e0899d518e396f027000000000000000000000000000000000000000000000000004b9cf364fe91c200000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -5391,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec34000000000000000000000000f6bce9a326d67703691dda5cbcc0fa381733e6ae000000000000000000000000f6bce9a326d67703691dda5cbcc0fa381733e6ae000000000000000000000000000000000000000000000000002386f26fc1000000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -5392,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0xa9f9e675000000000000000000000000a0b86991c6218b36c1d19d4a2e9eb0ce3606eb480000000000000000000000007f5c764cbc14f9669b88837ca1490cca17c316070000000000000000000000007ee17c26699fe707ac1e5f5074f4a4dafc9fa26f0000000000000000000000007ee17c26699fe707ac1e5f5074f4a4dafc9fa26f0000000000000000000000000000000000000000000000000000000007351c2600000000000000000000000000000000000000000000000000000000000000c00000000000000000000000000000000000000000000000000000000000000000,,,1,true -5393,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec34000000000000000000000000e740245d5c4afec7655ade6854b788ec755d24d6000000000000000000000000e740245d5c4afec7655ade6854b788ec755d24d6000000000000000000000000000000000000000000000000014eebc66ccee69000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -5394,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec3400000000000000000000000054c66b94f3b4eef7ae8cc6d95bf5dfbce778a04800000000000000000000000054c66b94f3b4eef7ae8cc6d95bf5dfbce778a048000000000000000000000000000000000000000000000000014e4384ea89f9be00000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -5395,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec34000000000000000000000000d25f942adbb4d53a53160f419abcf6b73b0aa4b9000000000000000000000000d25f942adbb4d53a53160f419abcf6b73b0aa4b90000000000000000000000000000000000000000000000000194938cce2b75ca00000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -5396,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec340000000000000000000000003ba7604330b8eb2933644ba3522855d2a320dad30000000000000000000000003ba7604330b8eb2933644ba3522855d2a320dad3000000000000000000000000000000000000000000000000002386f26fc1000000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -5397,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec340000000000000000000000002ba5f02bd1e8c6feec3561ebb34cc87f348d458a0000000000000000000000002ba5f02bd1e8c6feec3561ebb34cc87f348d458a00000000000000000000000000000000000000000000000000038d7ea4c6800000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -5398,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec34000000000000000000000000b758a373cb815941ad7e0657d5ff671e4bbf49d7000000000000000000000000b758a373cb815941ad7e0657d5ff671e4bbf49d7000000000000000000000000000000000000000000000000000110d9316ec00000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -5399,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec34000000000000000000000000b885084a6c9f8ebe365ed6cdd12c9c7c9ca2b2cf000000000000000000000000b885084a6c9f8ebe365ed6cdd12c9c7c9ca2b2cf00000000000000000000000000000000000000000000000002239b9a80d42d7d00000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -5400,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec34000000000000000000000000bf41127a9ac8b5d19fbd196b8ad8295b2a2579f5000000000000000000000000bf41127a9ac8b5d19fbd196b8ad8295b2a2579f500000000000000000000000000000000000000000000000002216c1dc011b2db00000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -5401,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec3400000000000000000000000072c3c76bad4ead8a5d737a006663cc0a491c79b300000000000000000000000072c3c76bad4ead8a5d737a006663cc0a491c79b3000000000000000000000000000000000000000000000000006379da05b6000000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -5402,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec34000000000000000000000000d122f221d9c56afac72b04ddc48f415e540376eb000000000000000000000000d122f221d9c56afac72b04ddc48f415e540376eb000000000000000000000000000000000000000000000000002386f26fc1000000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -5403,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec340000000000000000000000006edc318c3103b6ba19b40ff9b009b836ebcf3f4e0000000000000000000000006edc318c3103b6ba19b40ff9b009b836ebcf3f4e000000000000000000000000000000000000000000000000009581ea081c233500000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -5404,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec34000000000000000000000000ee40e804b25fc915fd2c2f6d8d2f650afbf9709a000000000000000000000000ee40e804b25fc915fd2c2f6d8d2f650afbf9709a000000000000000000000000000000000000000000000000000110d9316ec00000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -5405,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec34000000000000000000000000634cea5cbe400f8d19bac14b43735bce52f20680000000000000000000000000634cea5cbe400f8d19bac14b43735bce52f206800000000000000000000000000000000000000000000000000138c1e766f5a0b800000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -5406,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec34000000000000000000000000660a9d3363178cd677adb15b6acb196507176074000000000000000000000000660a9d3363178cd677adb15b6acb1965071760740000000000000000000000000000000000000000000000000011c37937e0800000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -5407,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec3400000000000000000000000035e5ac4c7cb20350321459813f42df14f9ffc1fb00000000000000000000000035e5ac4c7cb20350321459813f42df14f9ffc1fb000000000000000000000000000000000000000000000000000110d9316ec00000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -5408,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec34000000000000000000000000be7fee1d7fd765ed350319424dc2b1630a1343e7000000000000000000000000be7fee1d7fd765ed350319424dc2b1630a1343e7000000000000000000000000000000000000000000000000000119f17fe1600000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -5411,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec34000000000000000000000000091816394be18d923a45b3ef57201aef19dfe116000000000000000000000000091816394be18d923a45b3ef57201aef19dfe1160000000000000000000000000000000000000000000000000031bced02db000000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -5412,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec34000000000000000000000000a97459776e144c6554d03a95868fe258e70d69a8000000000000000000000000a97459776e144c6554d03a95868fe258e70d69a800000000000000000000000000000000000000000000000000470de4df82000000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -5414,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec34000000000000000000000000ca2cbf8ab2b4662bf992a9651c03bab54279d16d000000000000000000000000ca2cbf8ab2b4662bf992a9651c03bab54279d16d00000000000000000000000000000000000000000000000000517c11eeac177800000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -5415,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec34000000000000000000000000c8cdb4ef8d93572f8217a157db8ad0a0f7b4c486000000000000000000000000c8cdb4ef8d93572f8217a157db8ad0a0f7b4c48600000000000000000000000000000000000000000000000000470de4df82000000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -5416,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec34000000000000000000000000641ef149db1c2fa150b045b9881c3cc8306439db000000000000000000000000641ef149db1c2fa150b045b9881c3cc8306439db000000000000000000000000000000000000000000000000002386f26fc1000000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -5417,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec340000000000000000000000000d9b7c19cf1a55abd4458634752751840576156c0000000000000000000000000d9b7c19cf1a55abd4458634752751840576156c000000000000000000000000000000000000000000000000009c51c4521e000000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -5418,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec34000000000000000000000000d3c6d6e24fe8629e2961467fd15144f701154c57000000000000000000000000d3c6d6e24fe8629e2961467fd15144f701154c57000000000000000000000000000000000000000000000000002386f26fc1000000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -5419,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec3400000000000000000000000074845afc929b47d7886cdb266eba8054831b1e5e00000000000000000000000074845afc929b47d7886cdb266eba8054831b1e5e000000000000000000000000000000000000000000000000002386f26fc1000000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -5420,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec34000000000000000000000000c0d771006a4578f338f2043c99b74503207a67b1000000000000000000000000c0d771006a4578f338f2043c99b74503207a67b1000000000000000000000000000000000000000000000000002386f26fc1000000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -5421,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec340000000000000000000000007839c9bc2d4d61296ddf85667aaac421601bb9740000000000000000000000007839c9bc2d4d61296ddf85667aaac421601bb97400000000000000000000000000000000000000000000000000470de4df82000000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -5422,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec34000000000000000000000000d38f4411539ce4c0050dc4015bda014eb911178f000000000000000000000000d38f4411539ce4c0050dc4015bda014eb911178f000000000000000000000000000000000000000000000000002386f26fc1000000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -5424,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec34000000000000000000000000df3bdca9ebb45cbe0e9f4205d8107126ab4aacd7000000000000000000000000df3bdca9ebb45cbe0e9f4205d8107126ab4aacd700000000000000000000000000000000000000000000000000038d7ea4c6800000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -5425,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec34000000000000000000000000744eba6f0476d5d57b937b7ad1c44607931955b2000000000000000000000000744eba6f0476d5d57b937b7ad1c44607931955b2000000000000000000000000000000000000000000000000002386f26fc1000000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -5426,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec34000000000000000000000000b970984bdd183724bd872b1b9b5db5471b125223000000000000000000000000b970984bdd183724bd872b1b9b5db5471b12522300000000000000000000000000000000000000000000000000b1a2bc2ec5000000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -5427,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec34000000000000000000000000a58171e75565922e0557a940f1f10eb0d897fde9000000000000000000000000a58171e75565922e0557a940f1f10eb0d897fde9000000000000000000000000000000000000000000000000003f13bea2fd620000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -5428,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0xa9f9e675000000000000000000000000a0b86991c6218b36c1d19d4a2e9eb0ce3606eb480000000000000000000000007f5c764cbc14f9669b88837ca1490cca17c31607000000000000000000000000078ad5270b0240d8529f600f35a271fc6e2b2bd8000000000000000000000000078ad5270b0240d8529f600f35a271fc6e2b2bd8000000000000000000000000000000000000000000000000000000000001a87600000000000000000000000000000000000000000000000000000000000000c00000000000000000000000000000000000000000000000000000000000000000,,,1,true -5429,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec34000000000000000000000000d7e07c80f79874e6867deb580d63746f6c072bc2000000000000000000000000d7e07c80f79874e6867deb580d63746f6c072bc2000000000000000000000000000000000000000000000000008e1bc9bf04000000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -5430,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0xa9f9e675000000000000000000000000a0b86991c6218b36c1d19d4a2e9eb0ce3606eb480000000000000000000000007f5c764cbc14f9669b88837ca1490cca17c3160700000000000000000000000071213a9c9504e406d3242436a4bf69c6bfe7446100000000000000000000000071213a9c9504e406d3242436a4bf69c6bfe74461000000000000000000000000000000000000000000000000000000000001980300000000000000000000000000000000000000000000000000000000000000c00000000000000000000000000000000000000000000000000000000000000000,,,1,true -5431,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec3400000000000000000000000079d87b8a6bbaee0b7aa9b0c7da5586406474a0ab00000000000000000000000079d87b8a6bbaee0b7aa9b0c7da5586406474a0ab00000000000000000000000000000000000000000000000000b1a2bc2ec5000000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -5432,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec34000000000000000000000000a90a1a41750946246a532224593a48313bb7f983000000000000000000000000a90a1a41750946246a532224593a48313bb7f983000000000000000000000000000000000000000000000000003119d47d228e8000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -5433,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec34000000000000000000000000ea79e50d57dc3248da486861ec5891f445c45dad000000000000000000000000ea79e50d57dc3248da486861ec5891f445c45dad00000000000000000000000000000000000000000000000000470de4df82000000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -5435,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec3400000000000000000000000058192d5eb9c774cf3de1efab41371a1e392f941d00000000000000000000000058192d5eb9c774cf3de1efab41371a1e392f941d0000000000000000000000000000000000000000000000000051bd7bba4832a100000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -5436,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec340000000000000000000000001d239ca503f55bdfab65f1c2e22966b4195daacd0000000000000000000000001d239ca503f55bdfab65f1c2e22966b4195daacd00000000000000000000000000000000000000000000000000470de4df82000000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -5437,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec34000000000000000000000000920fba25c6e266930ca3fbaf958c0d5145cb6a50000000000000000000000000920fba25c6e266930ca3fbaf958c0d5145cb6a50000000000000000000000000000000000000000000000000001130b0cdf7610000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,0x1e6b7681d1b15a6ed71fe2f0b2b9b6b745f1722abd4e644b3437e8afc872f361,2021-12-27 08:13:55.000 UTC,0,true -5438,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec34000000000000000000000000bff987e43331cc5958b982563ff6c6378432f8f0000000000000000000000000bff987e43331cc5958b982563ff6c6378432f8f0000000000000000000000000000000000000000000000000002386f26fc1000000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -5439,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec34000000000000000000000000bff987e43331cc5958b982563ff6c6378432f8f0000000000000000000000000bff987e43331cc5958b982563ff6c6378432f8f0000000000000000000000000000000000000000000000000002386f26fc1000000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -5440,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec34000000000000000000000000199c92538e4946451c2b2bca3c0f5722e008615f000000000000000000000000199c92538e4946451c2b2bca3c0f5722e008615f0000000000000000000000000000000000000000000000000074bdda7849287500000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -5441,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec3400000000000000000000000062f1cfe35428566baa6e0206b089abe0a6068d4b00000000000000000000000062f1cfe35428566baa6e0206b089abe0a6068d4b000000000000000000000000000000000000000000000000002386f26fc1000000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -5442,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec340000000000000000000000004768393fbbfce919fcc3fa3e324dd216a4a0b3fd0000000000000000000000004768393fbbfce919fcc3fa3e324dd216a4a0b3fd00000000000000000000000000000000000000000000000003a84c44f042578900000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,0x79c4e88b1bddaed64b3ea0cf05c061f3b90dcb94e99309d941d44b3013a8ea98,2022-05-01 13:45:13.000 UTC,0,true -5443,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec340000000000000000000000004d65fa86720661bae0692b7e1fe5637e553494c60000000000000000000000004d65fa86720661bae0692b7e1fe5637e553494c6000000000000000000000000000000000000000000000000002386f26fc1000000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -5444,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec34000000000000000000000000c72b76292f925a5b65289084c0c26305bd313ea8000000000000000000000000c72b76292f925a5b65289084c0c26305bd313ea800000000000000000000000000000000000000000000000000998a9b6a04e50000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -5445,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec340000000000000000000000001cb15998a75f4628a2bdcbd86a632a33d906c1160000000000000000000000001cb15998a75f4628a2bdcbd86a632a33d906c116000000000000000000000000000000000000000000000000014912b611ee8d0000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -5446,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec340000000000000000000000009c49cadc89a3b8cb6239a37a692ba370c32bdfd30000000000000000000000009c49cadc89a3b8cb6239a37a692ba370c32bdfd30000000000000000000000000000000000000000000000000011e20ada8780fb00000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -5447,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec3400000000000000000000000026b7929ce02124e8ff4aa380da99f92abc45f16700000000000000000000000026b7929ce02124e8ff4aa380da99f92abc45f16700000000000000000000000000000000000000000000000000071afd498d000000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -5449,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec3400000000000000000000000067cda0e16f96ab6ec66295159615df54d607661200000000000000000000000067cda0e16f96ab6ec66295159615df54d6076612000000000000000000000000000000000000000000000000001d341429e237ee00000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,0x67299c88982db6dd1cc41ced8b97867f62df9d7400dc587d634d99f15cc2ad7a,2022-04-12 19:24:31.000 UTC,0,true -5451,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec34000000000000000000000000d7c1025fc4d558e4fd0f4e072b92a89616ddbb3e000000000000000000000000d7c1025fc4d558e4fd0f4e072b92a89616ddbb3e00000000000000000000000000000000000000000000000000011ada5486700000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -5452,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec3400000000000000000000000011a4373cdbe76eb7dda4aa36093bf95f4d41192900000000000000000000000011a4373cdbe76eb7dda4aa36093bf95f4d411929000000000000000000000000000000000000000000000000019c895744a7e16800000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -5453,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec34000000000000000000000000d1bd9d66437549cdc30420fa3d5162d49f0fbc8d000000000000000000000000d1bd9d66437549cdc30420fa3d5162d49f0fbc8d0000000000000000000000000000000000000000000000000027aff71ec9300000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -5454,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec34000000000000000000000000a5aaab5f12216e049ec43b85e15d1127e79becfd000000000000000000000000a5aaab5f12216e049ec43b85e15d1127e79becfd00000000000000000000000000000000000000000000000000012c221cc6a00000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -5456,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec34000000000000000000000000da89fc38046b64328da0661108959c5616faa339000000000000000000000000da89fc38046b64328da0661108959c5616faa339000000000000000000000000000000000000000000000000001d137f0186e10000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,0xd41b85713a6c2bafedc970e18e6ec9dfc5d1c888f0ae8783a7d566fdc96c1102,2022-05-25 22:10:50.000 UTC,0,true -5457,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec340000000000000000000000009e2fc870b3350ab8c9973b33ed56a3b2e45d1d180000000000000000000000009e2fc870b3350ab8c9973b33ed56a3b2e45d1d1800000000000000000000000000000000000000000000000002b4c7cb0463ec8d00000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -5459,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec34000000000000000000000000855de1c89382ffef9615c5430db23cdc38d36bc9000000000000000000000000855de1c89382ffef9615c5430db23cdc38d36bc900000000000000000000000000000000000000000000000000038d7ea4c6800000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -5460,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec34000000000000000000000000409540398e05fe99ff11702d80cc1a249a1f8c50000000000000000000000000409540398e05fe99ff11702d80cc1a249a1f8c5000000000000000000000000000000000000000000000000000005af3107a400000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -5461,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec3400000000000000000000000051c2522d728e2f011bb35a96e5aaa2a3e867228200000000000000000000000051c2522d728e2f011bb35a96e5aaa2a3e867228200000000000000000000000000000000000000000000000000011393af5df00000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -5462,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec3400000000000000000000000084a7b031d90b7d50f1c49bb0b6379b4306cd8a5100000000000000000000000084a7b031d90b7d50f1c49bb0b6379b4306cd8a5100000000000000000000000000000000000000000000000002e2c15ea55b0d4800000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -5463,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec340000000000000000000000001b4bb5d055613bef3bab73a8c75e70eca6e199590000000000000000000000001b4bb5d055613bef3bab73a8c75e70eca6e19959000000000000000000000000000000000000000000000000001168862766400000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -5465,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec34000000000000000000000000c6d1b80b6cfab7fa7f16402ea9fa6580bb99f7d8000000000000000000000000c6d1b80b6cfab7fa7f16402ea9fa6580bb99f7d8000000000000000000000000000000000000000000000000078cad1e25d0000000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -5467,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec340000000000000000000000001b4bb5d055613bef3bab73a8c75e70eca6e199590000000000000000000000001b4bb5d055613bef3bab73a8c75e70eca6e19959000000000000000000000000000000000000000000000000001168862766400000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -5468,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec34000000000000000000000000dccb3b984c89f97afd551bede081f72e5c50c223000000000000000000000000dccb3b984c89f97afd551bede081f72e5c50c22300000000000000000000000000000000000000000000000000005af3107a400000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -5470,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec34000000000000000000000000a3aa7c9b3bd025fe59bbc4e8a1b402c52fd25247000000000000000000000000a3aa7c9b3bd025fe59bbc4e8a1b402c52fd252470000000000000000000000000000000000000000000000000001353a6b39400000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -5471,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec3400000000000000000000000007e62aa7fde60ceebfcb72c49018ede750f7353200000000000000000000000007e62aa7fde60ceebfcb72c49018ede750f7353200000000000000000000000000000000000000000000000000d529ae9e86000000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -5472,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec340000000000000000000000009e7ece53974e4914f7448d4dad027ed3cbf69b5e0000000000000000000000009e7ece53974e4914f7448d4dad027ed3cbf69b5e000000000000000000000000000000000000000000000000000fc9e774ed58c000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -5473,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec34000000000000000000000000159764bf0f3aec21b3df78d4f2a8fcf20fdbe864000000000000000000000000159764bf0f3aec21b3df78d4f2a8fcf20fdbe864000000000000000000000000000000000000000000000000013acce631adebf900000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -5474,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec34000000000000000000000000d6916424ff1361c780e82919abc8c9255d4ff5ff000000000000000000000000d6916424ff1361c780e82919abc8c9255d4ff5ff000000000000000000000000000000000000000000000000001c6bf52634000000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -5475,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec340000000000000000000000002572742a4017aa0e77771e1288617b7105eb86ee0000000000000000000000002572742a4017aa0e77771e1288617b7105eb86ee00000000000000000000000000000000000000000000000000470de4df82000000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -5476,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec34000000000000000000000000bfa61059504bc913d1e79a01116e7d83cf6248ab000000000000000000000000bfa61059504bc913d1e79a01116e7d83cf6248ab000000000000000000000000000000000000000000000000004996f1be7c9bc000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -5477,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec34000000000000000000000000e9241fc168e087fb39c1c864d5975a62e5a29b81000000000000000000000000e9241fc168e087fb39c1c864d5975a62e5a29b81000000000000000000000000000000000000000000000000000110d9316ec00000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -5478,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec34000000000000000000000000d7fdd807d73593b1a09b2ab31e8159c88e50daf3000000000000000000000000d7fdd807d73593b1a09b2ab31e8159c88e50daf300000000000000000000000000000000000000000000000000013e52b9abe00000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -5479,0xcd9d4988c0ae61887b075ba77f08cbfad2b65068,0x3f87ff1de58128ef8fcb4c807efd776e1ac72e51,0xf4f7b41a0000000000000000000000005acfbbf0aa370f232e341bc0b1a40e996c960e07000000000000000000000000000000000000000000000003cabde168b1bef25c,,,1,true -5480,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec340000000000000000000000000aeb9a479ddb28ac9aa3eddb24290b4d58cf7e9e0000000000000000000000000aeb9a479ddb28ac9aa3eddb24290b4d58cf7e9e000000000000000000000000000000000000000000000000001c32a44932f50000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,0x5ae62350336d7cd2e2901cd7698db1cb220b2b10519bb822c75ce3cc67faf96e,2022-05-25 22:14:44.000 UTC,0,true -5484,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec340000000000000000000000006627d5eeaf0d706853cfb41eaa68604c06ab97450000000000000000000000006627d5eeaf0d706853cfb41eaa68604c06ab9745000000000000000000000000000000000000000000000000000119f17fe1600000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -5485,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec340000000000000000000000008ad1f20830e3bfd4f81eaa850989e3b1133d90d50000000000000000000000008ad1f20830e3bfd4f81eaa850989e3b1133d90d50000000000000000000000000000000000000000000000000062e55d0d17630000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -5486,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec3400000000000000000000000047bbf8e3251aed23abda3d13ff75e2471e726aa100000000000000000000000047bbf8e3251aed23abda3d13ff75e2471e726aa10000000000000000000000000000000000000000000000000040a5a33d87200000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -5488,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec3400000000000000000000000020753667309b033d24d11d5ab564b3cab3b52e9f00000000000000000000000020753667309b033d24d11d5ab564b3cab3b52e9f000000000000000000000000000000000000000000000000000009184e72a00000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -5490,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec34000000000000000000000000967f3fee8ba153c8b05b638d44c6adeb7b0c620d000000000000000000000000967f3fee8ba153c8b05b638d44c6adeb7b0c620d00000000000000000000000000000000000000000000000000038d7ea4c6800000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -5492,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec340000000000000000000000000c784de0eacbe31eb87e0ec7a7f612ca011e33030000000000000000000000000c784de0eacbe31eb87e0ec7a7f612ca011e330300000000000000000000000000000000000000000000000000016bcc41e9000000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -5494,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec3400000000000000000000000004e3499142cb3191ea3ad1ee1eb218539e2b246b00000000000000000000000004e3499142cb3191ea3ad1ee1eb218539e2b246b000000000000000000000000000000000000000000000000000009184e72a00000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -5495,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec340000000000000000000000004e421482ca059264a9179423fceb76b9f2055a8c0000000000000000000000004e421482ca059264a9179423fceb76b9f2055a8c00000000000000000000000000000000000000000000000000100eea8262800000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -5496,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec3400000000000000000000000037d1ea02b0ece0fb3dacd345173a8d6b82f41bc000000000000000000000000037d1ea02b0ece0fb3dacd345173a8d6b82f41bc0000000000000000000000000000000000000000000000000000897df5811670300000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -5497,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec3400000000000000000000000021038df6c33b259e3a41c83424b27f9b7a20398700000000000000000000000021038df6c33b259e3a41c83424b27f9b7a2039870000000000000000000000000000000000000000000000000020e5916de78b1100000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -5498,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec34000000000000000000000000e248e69ddb1f8164476034da503fe9b19a5780a0000000000000000000000000e248e69ddb1f8164476034da503fe9b19a5780a0000000000000000000000000000000000000000000000000000009184e72a00000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -5499,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec34000000000000000000000000ad2d23dcff6cdbb8a15e71d9acef313690933145000000000000000000000000ad2d23dcff6cdbb8a15e71d9acef313690933145000000000000000000000000000000000000000000000000004e28e2290f000000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -5500,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec3400000000000000000000000078b1ccc9aa17f8e6bbb39cdb2c0b137ba92e240e00000000000000000000000078b1ccc9aa17f8e6bbb39cdb2c0b137ba92e240e000000000000000000000000000000000000000000000000000009184e72a00000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -5501,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec34000000000000000000000000bdac4cf4a0b261c383049dc692aede5360a08752000000000000000000000000bdac4cf4a0b261c383049dc692aede5360a0875200000000000000000000000000000000000000000000000000298656c76b068200000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -5503,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec340000000000000000000000002477e1fe36b8359432a24ae3a933896a3b6588a00000000000000000000000002477e1fe36b8359432a24ae3a933896a3b6588a000000000000000000000000000000000000000000000000000005af3107a400000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -5504,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec34000000000000000000000000d493217b1f4bf46bf5b4627663bec9529d6e7f43000000000000000000000000d493217b1f4bf46bf5b4627663bec9529d6e7f4300000000000000000000000000000000000000000000000000038d7ea4c6800000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -5505,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec34000000000000000000000000490573336c7733a899f8c3b1b3067d3d42eb26ee000000000000000000000000490573336c7733a899f8c3b1b3067d3d42eb26ee0000000000000000000000000000000000000000000000000093481b808d1dfd00000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,0x424d9991ba1fd9057c6d522eb5f6e51badc39f21a73b9be130cfc59279493042,2022-08-09 05:15:19.000 UTC,0,true -5506,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec34000000000000000000000000056e1029173d5b6b39943eb5967dde3c6da74351000000000000000000000000056e1029173d5b6b39943eb5967dde3c6da7435100000000000000000000000000000000000000000000000000005af3107a400000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -5507,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec34000000000000000000000000825dbbf50ee12b278139dd03fd88f49e57c7f84d000000000000000000000000825dbbf50ee12b278139dd03fd88f49e57c7f84d000000000000000000000000000000000000000000000000002f4d081e1a867500000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -5510,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec34000000000000000000000000eb73fd2afd47cd70747bfb6d1245f711533e5901000000000000000000000000eb73fd2afd47cd70747bfb6d1245f711533e590100000000000000000000000000000000000000000000000000005af3107a400000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -5512,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec3400000000000000000000000011b5580c708a14bf5c39cba6e84bd07584753ac400000000000000000000000011b5580c708a14bf5c39cba6e84bd07584753ac40000000000000000000000000000000000000000000000000011b85607cd6c5200000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -5513,0xcd9d4988c0ae61887b075ba77f08cbfad2b65068,0x3f87ff1de58128ef8fcb4c807efd776e1ac72e51,0xf4f7b41a000000000000000000000000571965667a29abd76d5d43fa8788c0bc0cfe8088000000000000000000000000000000000000000000000000530548c1ddbdca98,,,1,true -5514,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec34000000000000000000000000e0e7943a7500ec3d6ee0e6205461c1aaa6850a46000000000000000000000000e0e7943a7500ec3d6ee0e6205461c1aaa6850a460000000000000000000000000000000000000000000000000098ffab3587bdf800000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -5515,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec340000000000000000000000009889e4cc3c754f892c32388c08c9384c7c17a0080000000000000000000000009889e4cc3c754f892c32388c08c9384c7c17a00800000000000000000000000000000000000000000000000000fc4101b654f43500000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -5516,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec3400000000000000000000000094f33be325f62b5d584312a65c9a1ae3254360e700000000000000000000000094f33be325f62b5d584312a65c9a1ae3254360e7000000000000000000000000000000000000000000000000010dcbff0e119d1600000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -5519,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec34000000000000000000000000573a35ccea5dd981e7e2adb5d570c50296f91262000000000000000000000000573a35ccea5dd981e7e2adb5d570c50296f91262000000000000000000000000000000000000000000000000002386f26fc1000000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -5520,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec34000000000000000000000000949ffe8488aed787de11c95ccd5fc258141b4f28000000000000000000000000949ffe8488aed787de11c95ccd5fc258141b4f2800000000000000000000000000000000000000000000000000d01919a6bc0b9800000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -5523,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec34000000000000000000000000a7137da63b53138a6dcdc9d9a010f42f951f1113000000000000000000000000a7137da63b53138a6dcdc9d9a010f42f951f111300000000000000000000000000000000000000000000000000a08787534379d000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -5524,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec340000000000000000000000008867d4a10a1a5b9cab771deb5dcbb5fb14db28020000000000000000000000008867d4a10a1a5b9cab771deb5dcbb5fb14db2802000000000000000000000000000000000000000000000000009abe8f672939c700000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -5525,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec3400000000000000000000000017eda91a844f303a8184f826e8ffae9924ec978200000000000000000000000017eda91a844f303a8184f826e8ffae9924ec97820000000000000000000000000000000000000000000000000cfb29a034a20b1700000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -5526,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec34000000000000000000000000b4054e9d66229d5605946dedfeca96eee6590377000000000000000000000000b4054e9d66229d5605946dedfeca96eee6590377000000000000000000000000000000000000000000000000022750d1b0ee1d8d00000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -5527,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec340000000000000000000000000edca050e06b595616c6365d2630837c63b331cb0000000000000000000000000edca050e06b595616c6365d2630837c63b331cb00000000000000000000000000000000000000000000000000a2e6e27f020dd000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -5528,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec340000000000000000000000005fde45087d5ed774ea077ada40e82cc48a77df5d0000000000000000000000005fde45087d5ed774ea077ada40e82cc48a77df5d00000000000000000000000000000000000000000000000000e56c87d339580200000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -5529,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec34000000000000000000000000178c05cf60526ea3e35bc4ac05d3141027ee15ce000000000000000000000000178c05cf60526ea3e35bc4ac05d3141027ee15ce000000000000000000000000000000000000000000000000001c6bf52634000000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -5531,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec34000000000000000000000000571965667a29abd76d5d43fa8788c0bc0cfe8088000000000000000000000000571965667a29abd76d5d43fa8788c0bc0cfe8088000000000000000000000000000000000000000000000000001fb59dfa24371d00000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -5534,0x10e6593cdda8c58a1d0f14c5164b376352a55f2f,0x467194771dae2967aef3ecbedd3bf9a310c76c65,0xa9f9e6750000000000000000000000006b175474e89094c44da98b954eedeac495271d0f000000000000000000000000da10009cbd5d07dd0cecc66161fc93d7c9000da1000000000000000000000000880db1abee87651b667615c24db3a30aa6aaa716000000000000000000000000880db1abee87651b667615c24db3a30aa6aaa716000000000000000000000000000000000000000000000001d44d2f325763eab500000000000000000000000000000000000000000000000000000000000000c00000000000000000000000000000000000000000000000000000000000000000,,,1,true -5535,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec34000000000000000000000000851807a2cf79c10228d2729e4983072a1b99bf5c000000000000000000000000851807a2cf79c10228d2729e4983072a1b99bf5c000000000000000000000000000000000000000000000000002386f26fc1000000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -5536,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec34000000000000000000000000063acae9fce2f889e35b703f7b831cc585aabbe0000000000000000000000000063acae9fce2f889e35b703f7b831cc585aabbe00000000000000000000000000000000000000000000000000149841644f10e4700000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -5537,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0xa9f9e675000000000000000000000000dac17f958d2ee523a2206206994597c13d831ec700000000000000000000000094b008aa00579c1307b0ef2c499ad98a8ce58e580000000000000000000000002ffcbc0ba249219e02e84e4273847f8e7d4ff6e60000000000000000000000002ffcbc0ba249219e02e84e4273847f8e7d4ff6e6000000000000000000000000000000000000000000000000000000000807ddc900000000000000000000000000000000000000000000000000000000000000c00000000000000000000000000000000000000000000000000000000000000000,,,1,true -5538,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec34000000000000000000000000820d36cb2728dff7625ff66454eb964b3afa7cce000000000000000000000000820d36cb2728dff7625ff66454eb964b3afa7cce0000000000000000000000000000000000000000000000000013cabda263469300000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -5539,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec34000000000000000000000000d4701f5ab31d4104c091a9b5504827ec6aacdf39000000000000000000000000d4701f5ab31d4104c091a9b5504827ec6aacdf39000000000000000000000000000000000000000000000000002386f26fc1000000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -5540,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec3400000000000000000000000071d2f08f217e0e81feb1143677850dd872694ee500000000000000000000000071d2f08f217e0e81feb1143677850dd872694ee500000000000000000000000000000000000000000000000000038d7ea4c6800000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -5542,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec3400000000000000000000000071d2f08f217e0e81feb1143677850dd872694ee500000000000000000000000071d2f08f217e0e81feb1143677850dd872694ee500000000000000000000000000000000000000000000000000038d7ea4c6800000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -5544,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec34000000000000000000000000aead1f2626c4ef3b0246ba9a343a310931a7ded5000000000000000000000000aead1f2626c4ef3b0246ba9a343a310931a7ded500000000000000000000000000000000000000000000000000470de4df82000000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -5545,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec34000000000000000000000000d2e6466956f9184ccf9f03e8b933239562209b6e000000000000000000000000d2e6466956f9184ccf9f03e8b933239562209b6e00000000000000000000000000000000000000000000000000e7a2505b0c15df00000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -5547,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec34000000000000000000000000a9ce001353e021767264f5ab6102e65bc9cd2023000000000000000000000000a9ce001353e021767264f5ab6102e65bc9cd20230000000000000000000000000000000000000000000000000018de76816d800000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -5548,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec34000000000000000000000000e46eeacefe95efcc1ca54371bc88d7eae261dcbc000000000000000000000000e46eeacefe95efcc1ca54371bc88d7eae261dcbc00000000000000000000000000000000000000000000000000f9bb3890f8b81200000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -5549,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec34000000000000000000000000ca922b1454c4cbe30a965047d51b0dace5b808d6000000000000000000000000ca922b1454c4cbe30a965047d51b0dace5b808d600000000000000000000000000000000000000000000000000005af3107a400000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -5551,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec340000000000000000000000009fc9b76e8c2485c769c899c6c598688c56b0c52c0000000000000000000000009fc9b76e8c2485c769c899c6c598688c56b0c52c00000000000000000000000000000000000000000000000000a3309af71f642500000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -5552,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec34000000000000000000000000b6e8e8739e98d36fa5dfb8d9c512175fc69db30f000000000000000000000000b6e8e8739e98d36fa5dfb8d9c512175fc69db30f0000000000000000000000000000000000000000000000000029062798b06ca300000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -5553,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec3400000000000000000000000029eaa8c7ea07a452b90da24b216f8af5a6f85cee00000000000000000000000029eaa8c7ea07a452b90da24b216f8af5a6f85cee00000000000000000000000000000000000000000000000000219d159b48770f00000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -5554,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec3400000000000000000000000026a5a22570d8a4408cb21e333486ca04e60dec4d00000000000000000000000026a5a22570d8a4408cb21e333486ca04e60dec4d0000000000000000000000000000000000000000000000000015a6b183d97e9300000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -5555,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec340000000000000000000000002a1430ae58cc8ebcc4e47e08fa16bfc78972b39a0000000000000000000000002a1430ae58cc8ebcc4e47e08fa16bfc78972b39a000000000000000000000000000000000000000000000000000e35fa931a000000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -5556,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec340000000000000000000000002e08d5492488d710350408c22d328162af4be8620000000000000000000000002e08d5492488d710350408c22d328162af4be8620000000000000000000000000000000000000000000000000011c37937e0800000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -5557,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec340000000000000000000000004d54243a81f132ca4db3174194145373490b469c0000000000000000000000004d54243a81f132ca4db3174194145373490b469c00000000000000000000000000000000000000000000000000075ea80fdf005200000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -5558,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec3400000000000000000000000078cbd3ac362577935a2421ea4b2ee548b7eb76ba00000000000000000000000078cbd3ac362577935a2421ea4b2ee548b7eb76ba0000000000000000000000000000000000000000000000000004169f662966c400000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -5559,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec34000000000000000000000000620f6600496e0466f3341dff311d43c82fa953a5000000000000000000000000620f6600496e0466f3341dff311d43c82fa953a5000000000000000000000000000000000000000000000000001dd1644c52360000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -5561,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec34000000000000000000000000bcfc60c0c0a12408499bdf8ab20955d491e3b178000000000000000000000000bcfc60c0c0a12408499bdf8ab20955d491e3b17800000000000000000000000000000000000000000000000000038d7ea4c6800000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -5562,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec34000000000000000000000000d32c1d33bf023aae1d9666e714c5ac3418cdede3000000000000000000000000d32c1d33bf023aae1d9666e714c5ac3418cdede300000000000000000000000000000000000000000000000000038d7ea4c6800000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -5563,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec34000000000000000000000000b2a9aef4bbb101be350b6dcf20de0551b5b628ae000000000000000000000000b2a9aef4bbb101be350b6dcf20de0551b5b628ae000000000000000000000000000000000000000000000000002386f26fc1000000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -5564,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec34000000000000000000000000edb00e1646b8bf9d9cc3c8b1d364e371bf57ab2b000000000000000000000000edb00e1646b8bf9d9cc3c8b1d364e371bf57ab2b00000000000000000000000000000000000000000000000000ee9a2049a22dc800000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -5565,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec34000000000000000000000000941169fff3c353be965e3f34823eea63b772219c000000000000000000000000941169fff3c353be965e3f34823eea63b772219c000000000000000000000000000000000000000000000000008b878d12c0b0aa00000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -5566,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec340000000000000000000000008da53d90095a3af28a8f7c706c2b08b59ca9a4c50000000000000000000000008da53d90095a3af28a8f7c706c2b08b59ca9a4c50000000000000000000000000000000000000000000000000111a2b2639f5fa200000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -5567,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec340000000000000000000000004fc920c69979da8194875d06f7c6d6ee99d5001f0000000000000000000000004fc920c69979da8194875d06f7c6d6ee99d5001f00000000000000000000000000000000000000000000000000470de4df82000000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -5568,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec34000000000000000000000000a48c2dd26e09fd78083df35e5f92ffd7156be402000000000000000000000000a48c2dd26e09fd78083df35e5f92ffd7156be40200000000000000000000000000000000000000000000000000d52b1ac5dc2ced00000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -5569,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec3400000000000000000000000044a999a01cf6fc3de03fc1739f8826d5e46a84fa00000000000000000000000044a999a01cf6fc3de03fc1739f8826d5e46a84fa000000000000000000000000000000000000000000000000010053dea3eceb9700000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -5571,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec34000000000000000000000000347f715dd0f6f09bf75fc98b4b4f356208ad2fb2000000000000000000000000347f715dd0f6f09bf75fc98b4b4f356208ad2fb2000000000000000000000000000000000000000000000000010041076283b80800000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -5572,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec3400000000000000000000000090741e1fdca0e490ccfdec50917f13a9be9cdc7a00000000000000000000000090741e1fdca0e490ccfdec50917f13a9be9cdc7a000000000000000000000000000000000000000000000000001fefd337b19f1400000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -5573,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec34000000000000000000000000c0f25775ced2dd9613d588f67765708fb317ac1d000000000000000000000000c0f25775ced2dd9613d588f67765708fb317ac1d00000000000000000000000000000000000000000000000000d54771877a56fd00000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -5574,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec34000000000000000000000000500d0f63df0b7daec3155ff7d68e59204e7bcc29000000000000000000000000500d0f63df0b7daec3155ff7d68e59204e7bcc2900000000000000000000000000000000000000000000000000f8438bb2a5ceb900000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -5575,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec340000000000000000000000007f10937d5a4531754449ac0ddbdf23331e1487890000000000000000000000007f10937d5a4531754449ac0ddbdf23331e14878900000000000000000000000000000000000000000000000000071afd498d000000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -5577,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec34000000000000000000000000964a69b94386b95077798ae475d0660975413faa000000000000000000000000964a69b94386b95077798ae475d0660975413faa00000000000000000000000000000000000000000000000000edd01b47f12c2c00000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -5578,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec34000000000000000000000000c6f1459439258798391df7a9d60dcac96b3afa9e000000000000000000000000c6f1459439258798391df7a9d60dcac96b3afa9e00000000000000000000000000000000000000000000000000b1a2bc2ec5000000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -5579,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec3400000000000000000000000014441fac45abfe6fa3c3889a5dde3dbd8977c23600000000000000000000000014441fac45abfe6fa3c3889a5dde3dbd8977c23600000000000000000000000000000000000000000000000000dd6c3d4bf7f81100000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -5580,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec34000000000000000000000000cf3a4a0dda2e5d94ef6d30d218cff62252c32cd1000000000000000000000000cf3a4a0dda2e5d94ef6d30d218cff62252c32cd100000000000000000000000000000000000000000000000000470de4df82000000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -5581,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec340000000000000000000000001fe7c5f80aa20b042cbe590f2984c6be98270a850000000000000000000000001fe7c5f80aa20b042cbe590f2984c6be98270a8500000000000000000000000000000000000000000000000000f7f64f7269977600000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -5582,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec34000000000000000000000000b4e7abab7389c9c7d5bb49c6e437485676ff9cb3000000000000000000000000b4e7abab7389c9c7d5bb49c6e437485676ff9cb3000000000000000000000000000000000000000000000000002d3e3e5745eb8900000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -5583,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec340000000000000000000000003597ed66ea2a8d6b93d23b15f2fd30d308bf83180000000000000000000000003597ed66ea2a8d6b93d23b15f2fd30d308bf83180000000000000000000000000000000000000000000000000028079e4d14ab6300000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -5584,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec340000000000000000000000002847184449afc8f238076ea4d3969121d8adeb460000000000000000000000002847184449afc8f238076ea4d3969121d8adeb4600000000000000000000000000000000000000000000000001b44e9ee2eeb41000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -5585,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec34000000000000000000000000d328feb7ad9fc26a050cbb0495da38bd3f751e40000000000000000000000000d328feb7ad9fc26a050cbb0495da38bd3f751e4000000000000000000000000000000000000000000000000001e03c17f6ce8c2200000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,0x01bf05ef8043a9452b164a88bee54dec16e896b25ccfb1e8ecfe8e5a23596dd6,2022-05-07 02:34:46.000 UTC,0,true -5586,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec34000000000000000000000000629c4565be654c4a5f742da05ced064e16224981000000000000000000000000629c4565be654c4a5f742da05ced064e1622498100000000000000000000000000000000000000000000000000d367e7ee4dacfb00000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -5587,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec340000000000000000000000006e0832f9519c3a09fb2e6acb63df7d2b7155c4060000000000000000000000006e0832f9519c3a09fb2e6acb63df7d2b7155c40600000000000000000000000000000000000000000000000001a0a52d5479d54500000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -5589,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec34000000000000000000000000bf59e62f6add0b2f0914d47ef0375103cdebcbf9000000000000000000000000bf59e62f6add0b2f0914d47ef0375103cdebcbf900000000000000000000000000000000000000000000000001ac808a831d894500000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -5590,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec34000000000000000000000000257f99fd962db35704a3ed32523eede0f6b04fa6000000000000000000000000257f99fd962db35704a3ed32523eede0f6b04fa600000000000000000000000000000000000000000000000004db73254763000000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -5591,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec3400000000000000000000000098ec2fec32a8a9e321c6655693868b1d301848ae00000000000000000000000098ec2fec32a8a9e321c6655693868b1d301848ae000000000000000000000000000000000000000000000000019e27971a47a90f00000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -5593,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec340000000000000000000000004645e30cac1df7bfc5752eadfdf37ef331178f570000000000000000000000004645e30cac1df7bfc5752eadfdf37ef331178f570000000000000000000000000000000000000000000000000011c37937e0800000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -5595,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec34000000000000000000000000d76ef4e3e749aece088c0d674002fd4234fc6bbb000000000000000000000000d76ef4e3e749aece088c0d674002fd4234fc6bbb00000000000000000000000000000000000000000000000001ba8829041700ba00000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -5597,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec3400000000000000000000000009bbec2d116d4a4986f752907c77f85abab71b9e00000000000000000000000009bbec2d116d4a4986f752907c77f85abab71b9e00000000000000000000000000000000000000000000000000b1a2bc2ec5000000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -5599,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec34000000000000000000000000793745e010dbed0d859d3f83e7dafafb210860b1000000000000000000000000793745e010dbed0d859d3f83e7dafafb210860b100000000000000000000000000000000000000000000000000b1a2bc2ec5000000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -5600,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec34000000000000000000000000c0c76ea5c4bb71f32cd08462bb48d43c0ecf85e2000000000000000000000000c0c76ea5c4bb71f32cd08462bb48d43c0ecf85e2000000000000000000000000000000000000000000000000002779c433836c1300000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -5602,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec34000000000000000000000000566b56bdc1f5c1bbe388d44479524b07f30f7d60000000000000000000000000566b56bdc1f5c1bbe388d44479524b07f30f7d6000000000000000000000000000000000000000000000000000038d7ea4c6800000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -5609,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec3400000000000000000000000017eda91a844f303a8184f826e8ffae9924ec978200000000000000000000000017eda91a844f303a8184f826e8ffae9924ec978200000000000000000000000000000000000000000000000001a383abbc60c88800000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -5610,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec34000000000000000000000000e1d59d7edce98aa7444b7383f8c27d4ab3e19eb5000000000000000000000000e1d59d7edce98aa7444b7383f8c27d4ab3e19eb5000000000000000000000000000000000000000000000000002386f26fc1000000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -5611,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec3400000000000000000000000076da8cf045ed1a404f8fc9f8513dac885d1afad000000000000000000000000076da8cf045ed1a404f8fc9f8513dac885d1afad000000000000000000000000000000000000000000000000000a0c42a2513ac7300000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -5612,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec340000000000000000000000004fc920c69979da8194875d06f7c6d6ee99d5001f0000000000000000000000004fc920c69979da8194875d06f7c6d6ee99d5001f00000000000000000000000000000000000000000000000000470de4df82000000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -5613,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec340000000000000000000000004331a6f53f75b215b1a6d6292acaa564bd89464f0000000000000000000000004331a6f53f75b215b1a6d6292acaa564bd89464f00000000000000000000000000000000000000000000000000a3e7cd0d4a035600000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -5614,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec34000000000000000000000000a6e0ac20117184fce07470205c27fdd1f01c266f000000000000000000000000a6e0ac20117184fce07470205c27fdd1f01c266f00000000000000000000000000000000000000000000000000005af3107a400000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -5615,0x10e6593cdda8c58a1d0f14c5164b376352a55f2f,0x467194771dae2967aef3ecbedd3bf9a310c76c65,0xa9f9e6750000000000000000000000006b175474e89094c44da98b954eedeac495271d0f000000000000000000000000da10009cbd5d07dd0cecc66161fc93d7c9000da1000000000000000000000000286fe436539b18407b3fd8285c20e5eeb56de5f4000000000000000000000000286fe436539b18407b3fd8285c20e5eeb56de5f4000000000000000000000000000000000000000000000001a055690d9db8060300000000000000000000000000000000000000000000000000000000000000c00000000000000000000000000000000000000000000000000000000000000000,,,1,true -5616,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec3400000000000000000000000033b2c9c2a6050316c2aa96891f47fd43e08c49d200000000000000000000000033b2c9c2a6050316c2aa96891f47fd43e08c49d2000000000000000000000000000000000000000000000000000009184e72a00000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -5617,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec3400000000000000000000000078777450f3a2a76f21abd549c125849cf5f5006700000000000000000000000078777450f3a2a76f21abd549c125849cf5f5006700000000000000000000000000000000000000000000000000284c96a0dc137500000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -5618,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec34000000000000000000000000286fe436539b18407b3fd8285c20e5eeb56de5f4000000000000000000000000286fe436539b18407b3fd8285c20e5eeb56de5f4000000000000000000000000000000000000000000000000002386f26fc1000000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -5619,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec34000000000000000000000000e773c91f242bd1cb26889ff0210f7cf3815ddc99000000000000000000000000e773c91f242bd1cb26889ff0210f7cf3815ddc9900000000000000000000000000000000000000000000000007af31844ced7fdd00000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -5620,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec340000000000000000000000007a16d006da707a3286e6ced7931b8259be1604970000000000000000000000007a16d006da707a3286e6ced7931b8259be16049700000000000000000000000000000000000000000000000000005af3107a400000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -5621,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec340000000000000000000000004910eff6b570542153f33b6a3404efe27f2f86670000000000000000000000004910eff6b570542153f33b6a3404efe27f2f866700000000000000000000000000000000000000000000000000038d7ea4c6800000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -5623,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec34000000000000000000000000cca632a308cad16d4396f67a7b312e55edc24061000000000000000000000000cca632a308cad16d4396f67a7b312e55edc240610000000000000000000000000000000000000000000000000098c445ad57800000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -5624,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec3400000000000000000000000043ec54a69923cf55e5d8cfaffd79b5a52b8202bf00000000000000000000000043ec54a69923cf55e5d8cfaffd79b5a52b8202bf0000000000000000000000000000000000000000000000000000008bb2c9700000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -5625,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec340000000000000000000000007472aab4e5e4d993f1ce8f51dc1edfa3724e8ca10000000000000000000000007472aab4e5e4d993f1ce8f51dc1edfa3724e8ca100000000000000000000000000000000000000000000000000b1a2bc2ec5000000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -5626,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec34000000000000000000000000a57e22bf556074dabe4e456792dd71a846ad8d38000000000000000000000000a57e22bf556074dabe4e456792dd71a846ad8d380000000000000000000000000000000000000000000000000017c726144388c000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -5628,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec3400000000000000000000000075b995c813da60dd3055d98b73dd1b32f588367f00000000000000000000000075b995c813da60dd3055d98b73dd1b32f588367f00000000000000000000000000000000000000000000000000005af3107a400000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -5629,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec340000000000000000000000007a1130cf808f53492997d68b838306b3d52c101f0000000000000000000000007a1130cf808f53492997d68b838306b3d52c101f0000000000000000000000000000000000000000000000000028f1c0908d7cb800000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -5631,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec340000000000000000000000006f598aab7895eba4b86035353f9152a2ee9568550000000000000000000000006f598aab7895eba4b86035353f9152a2ee956855000000000000000000000000000000000000000000000000000aa87bee53800000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -5633,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec34000000000000000000000000e1245aa226c025094ff0ce7e7e5a35eec214ac8e000000000000000000000000e1245aa226c025094ff0ce7e7e5a35eec214ac8e00000000000000000000000000000000000000000000000000005af3107a400000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -5634,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec34000000000000000000000000f276c6ae5fe256d5cfcbf02f352fd63b2d41b07b000000000000000000000000f276c6ae5fe256d5cfcbf02f352fd63b2d41b07b00000000000000000000000000000000000000000000000000005af3107a400000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -5635,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec34000000000000000000000000fcb48913ffd25a4a3a940600e9b28769785b4467000000000000000000000000fcb48913ffd25a4a3a940600e9b28769785b446700000000000000000000000000000000000000000000000000005af3107a400000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -5636,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec340000000000000000000000009a259270e869dd40ddcba90cd82a9f49e41269430000000000000000000000009a259270e869dd40ddcba90cd82a9f49e412694300000000000000000000000000000000000000000000000000005af3107a400000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -5637,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec34000000000000000000000000cc56dd5f5a70f7dbdb10e7390af65622f78fbfdc000000000000000000000000cc56dd5f5a70f7dbdb10e7390af65622f78fbfdc00000000000000000000000000000000000000000000000000005af3107a400000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -5638,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec34000000000000000000000000b11e0cb32ddc622f89ad62068758e42bbf973ff4000000000000000000000000b11e0cb32ddc622f89ad62068758e42bbf973ff400000000000000000000000000000000000000000000000000005af3107a400000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -5639,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec340000000000000000000000007b5ef088312939b249271bb7f8a61e77749ab5390000000000000000000000007b5ef088312939b249271bb7f8a61e77749ab53900000000000000000000000000000000000000000000000000038d7ea4c6800000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -5641,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec340000000000000000000000006d0d6bc9ba4d93a8ed8fe0283b48c71b818b48230000000000000000000000006d0d6bc9ba4d93a8ed8fe0283b48c71b818b482300000000000000000000000000000000000000000000000000005af3107a400000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -5642,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec3400000000000000000000000076a833c76e6238215f9aaca3f6ad2e5e9847e92400000000000000000000000076a833c76e6238215f9aaca3f6ad2e5e9847e92400000000000000000000000000000000000000000000000000005af3107a400000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -5643,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec340000000000000000000000006985ae552d11a091b75f446ba38508d7668d7b720000000000000000000000006985ae552d11a091b75f446ba38508d7668d7b720000000000000000000000000000000000000000000000000077c604eccf863000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -5645,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec34000000000000000000000000222e79ab40d859e50f0161d48aa4f0c1e8e5ded8000000000000000000000000222e79ab40d859e50f0161d48aa4f0c1e8e5ded800000000000000000000000000000000000000000000000000038d7ea4c6800000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -5646,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec3400000000000000000000000091162672cc2feb0e8627f384ff93294c79fbf36100000000000000000000000091162672cc2feb0e8627f384ff93294c79fbf3610000000000000000000000000000000000000000000000000158a60943cc837500000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,0xbe8a216bafa7ad4ac4b90f3c2abd57648f8bb25394e874f9ba3e7e37152be61e,2022-04-27 10:57:39.000 UTC,0,true -5649,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec3400000000000000000000000082abe0456afbd32abf1f0c5add8c4199dc4a3bc300000000000000000000000082abe0456afbd32abf1f0c5add8c4199dc4a3bc30000000000000000000000000000000000000000000000000000b5e620f4800000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -5654,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec34000000000000000000000000af2686a65a101ba79971561c128bdfe7fb1157f3000000000000000000000000af2686a65a101ba79971561c128bdfe7fb1157f30000000000000000000000000000000000000000000000000006c1afcaa8fdc400000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -5655,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec34000000000000000000000000d3d9bc84e30ca21277d0bc7a943f3ad1ea3208d7000000000000000000000000d3d9bc84e30ca21277d0bc7a943f3ad1ea3208d7000000000000000000000000000000000000000000000000002386f26fc1000000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -5656,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec34000000000000000000000000ba35b90e51c42e1069bad364b65512c1e7d87f39000000000000000000000000ba35b90e51c42e1069bad364b65512c1e7d87f39000000000000000000000000000000000000000000000000015181ff25a9800000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -5657,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec340000000000000000000000002aa85a041e7af248ae2e9aee7f5b32daabe133370000000000000000000000002aa85a041e7af248ae2e9aee7f5b32daabe13337000000000000000000000000000000000000000000000000009a8b04ffbac00000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -5659,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec34000000000000000000000000404b7233782034330ed760d56979338789546567000000000000000000000000404b7233782034330ed760d5697933878954656700000000000000000000000000000000000000000000000000174c986cac1b1200000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -5660,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec340000000000000000000000004a1459f5991a9e07a64ec4b49e2292131d3ebd520000000000000000000000004a1459f5991a9e07a64ec4b49e2292131d3ebd5200000000000000000000000000000000000000000000000000a1f64934f6070000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -5662,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec340000000000000000000000001e6cf371e21e7a1ad36b440b80f8be79526b0bb70000000000000000000000001e6cf371e21e7a1ad36b440b80f8be79526b0bb7000000000000000000000000000000000000000000000000000f55306c71bb1a00000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -5663,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec34000000000000000000000000a6e0ac20117184fce07470205c27fdd1f01c266f000000000000000000000000a6e0ac20117184fce07470205c27fdd1f01c266f0000000000000000000000000000000000000000000000000145b4bbdedef18000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -5664,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec34000000000000000000000000eaf60507489320623b9f4485b33e112421d4c900000000000000000000000000eaf60507489320623b9f4485b33e112421d4c90000000000000000000000000000000000000000000000000000a0ccb0c32152a000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -5665,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec3400000000000000000000000033cb44260a7564d3cac8da5a6d0fffbcacbfcfea00000000000000000000000033cb44260a7564d3cac8da5a6d0fffbcacbfcfea0000000000000000000000000000000000000000000000000084dcbba72b4cc100000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -5667,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec3400000000000000000000000047075648c0c715e68b49d938b87552fab718a9c800000000000000000000000047075648c0c715e68b49d938b87552fab718a9c8000000000000000000000000000000000000000000000000005543df729c000000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,0x90d39395e12172a11c1ceadd655316bb3d20562f4c2f147c924484b4c61a5790,2022-03-12 20:30:31.000 UTC,0,true -5668,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec340000000000000000000000006b51ae3a0de15387b8f1d602a40704db9e137c5d0000000000000000000000006b51ae3a0de15387b8f1d602a40704db9e137c5d000000000000000000000000000000000000000000000000014d63bc86d98f8f00000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -5669,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec3400000000000000000000000017202b62feb408b478d3c247e2001311a48f5f3200000000000000000000000017202b62feb408b478d3c247e2001311a48f5f32000000000000000000000000000000000000000000000000002386f26fc1000000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -5670,0x10e6593cdda8c58a1d0f14c5164b376352a55f2f,0x467194771dae2967aef3ecbedd3bf9a310c76c65,0xa9f9e6750000000000000000000000006b175474e89094c44da98b954eedeac495271d0f000000000000000000000000da10009cbd5d07dd0cecc66161fc93d7c9000da1000000000000000000000000c223f476b4f44cf01b296fbeab782daf6b101e81000000000000000000000000c223f476b4f44cf01b296fbeab782daf6b101e8100000000000000000000000000000000000000000000000053444878b2ca5ef400000000000000000000000000000000000000000000000000000000000000c00000000000000000000000000000000000000000000000000000000000000000,,,1,true -5674,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec3400000000000000000000000095d27c7dcbd1fb45e70585a3a71f2f229229715700000000000000000000000095d27c7dcbd1fb45e70585a3a71f2f229229715700000000000000000000000000000000000000000000000000005af3107a400000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -5677,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec34000000000000000000000000444444cc7fe267251797d8592c3f4d5ee6888d62000000000000000000000000444444cc7fe267251797d8592c3f4d5ee6888d62000000000000000000000000000000000000000000000000014bf403eb5c488000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -5678,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec3400000000000000000000000084a198db31ea79734b58bc70ac0484b8b23ae9f500000000000000000000000084a198db31ea79734b58bc70ac0484b8b23ae9f500000000000000000000000000000000000000000000000000005af3107a400000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -5679,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec34000000000000000000000000be9f07d564b0c6f47d56980d055925d798441792000000000000000000000000be9f07d564b0c6f47d56980d055925d79844179200000000000000000000000000000000000000000000000000005af3107a400000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -5680,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec3400000000000000000000000023236075c29ab1ddc1731a1271dbf448ffd8688000000000000000000000000023236075c29ab1ddc1731a1271dbf448ffd8688000000000000000000000000000000000000000000000000000005af3107a400000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -5681,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec3400000000000000000000000071f5280932a10eee4deadbe08898087452f64d0500000000000000000000000071f5280932a10eee4deadbe08898087452f64d0500000000000000000000000000000000000000000000000000005af3107a400000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -5682,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec34000000000000000000000000b30919008eabe486fbb04bde517875788dbb3abe000000000000000000000000b30919008eabe486fbb04bde517875788dbb3abe00000000000000000000000000000000000000000000000000005af3107a400000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -5683,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec340000000000000000000000002b78d6814d1894edfd0d9e369d024fb47842540d0000000000000000000000002b78d6814d1894edfd0d9e369d024fb47842540d00000000000000000000000000000000000000000000000000005af3107a400000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -5684,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec34000000000000000000000000738fdd122cf588106832e6b1f73a44aab20066b4000000000000000000000000738fdd122cf588106832e6b1f73a44aab20066b400000000000000000000000000000000000000000000000000005af3107a400000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -5685,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec34000000000000000000000000ac3446f9e80e20f370d9a50d9c85daf216f5afdc000000000000000000000000ac3446f9e80e20f370d9a50d9c85daf216f5afdc00000000000000000000000000000000000000000000000000005af3107a400000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -5686,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec34000000000000000000000000e1d59d7edce98aa7444b7383f8c27d4ab3e19eb5000000000000000000000000e1d59d7edce98aa7444b7383f8c27d4ab3e19eb500000000000000000000000000000000000000000000000000005af3107a400000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -5687,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec340000000000000000000000000fb61a8e5cf37cc1de7c1fe155ee5295c3d023600000000000000000000000000fb61a8e5cf37cc1de7c1fe155ee5295c3d0236000000000000000000000000000000000000000000000000000ab95ec45b78e0000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -5688,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec34000000000000000000000000a1651b690addfc93caa656a2870fcc40487c7bc5000000000000000000000000a1651b690addfc93caa656a2870fcc40487c7bc500000000000000000000000000000000000000000000000000a017d0784e3e1f00000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -5689,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec340000000000000000000000007cb508b3d71f5fc3ad9815ac72602e1dadf16c3b0000000000000000000000007cb508b3d71f5fc3ad9815ac72602e1dadf16c3b000000000000000000000000000000000000000000000000005b9cb4431999e600000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -5694,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec340000000000000000000000003a4b0316afc04371092a2019158edc213dbb4ffc0000000000000000000000003a4b0316afc04371092a2019158edc213dbb4ffc000000000000000000000000000000000000000000000000001d6b085f932c0000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -5696,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec3400000000000000000000000098ff454c5d8a367c5532c057c665410610d409ec00000000000000000000000098ff454c5d8a367c5532c057c665410610d409ec000000000000000000000000000000000000000000000000002614941f8c2b0000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -5699,0xcd9d4988c0ae61887b075ba77f08cbfad2b65068,0x3f87ff1de58128ef8fcb4c807efd776e1ac72e51,0xf4f7b41a0000000000000000000000001574a47822dc67d7ffd5e9de7b9fa85dbe98ac5f0000000000000000000000000000000000000000000000016f4f2e86035451a9,,,1,true -5702,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec3400000000000000000000000013b1a8a6770eb031f23af46292df580aa3c2ab0000000000000000000000000013b1a8a6770eb031f23af46292df580aa3c2ab000000000000000000000000000000000000000000000000000055a797c3f443af00000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -5703,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec340000000000000000000000001cbb4c62da977613636a7a779a3f364dfd6906a40000000000000000000000001cbb4c62da977613636a7a779a3f364dfd6906a400000000000000000000000000000000000000000000000000f6616c3475d18500000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -5704,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec340000000000000000000000004ab27b843f3f02d98f072e2ce937eeec0c0b9ce90000000000000000000000004ab27b843f3f02d98f072e2ce937eeec0c0b9ce900000000000000000000000000000000000000000000000000a2e5b5dfb2bb0000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -5706,0x10e6593cdda8c58a1d0f14c5164b376352a55f2f,0x467194771dae2967aef3ecbedd3bf9a310c76c65,0xa9f9e6750000000000000000000000006b175474e89094c44da98b954eedeac495271d0f000000000000000000000000da10009cbd5d07dd0cecc66161fc93d7c9000da1000000000000000000000000c05079e4a384b51df73f2b632d81a92282d4125e000000000000000000000000c05079e4a384b51df73f2b632d81a92282d4125e00000000000000000000000000000000000000000000000ad4cdcc52a321fe0800000000000000000000000000000000000000000000000000000000000000c00000000000000000000000000000000000000000000000000000000000000000,,,1,true -5707,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec34000000000000000000000000c05079e4a384b51df73f2b632d81a92282d4125e000000000000000000000000c05079e4a384b51df73f2b632d81a92282d4125e00000000000000000000000000000000000000000000000001a20fc1d1aa06f500000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -5708,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec340000000000000000000000003411cb2b60694d43f8f242fd8b48e28f2b4cafe90000000000000000000000003411cb2b60694d43f8f242fd8b48e28f2b4cafe90000000000000000000000000000000000000000000000000002279192f8bc2000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -5709,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec3400000000000000000000000011180325b253dad82be5855af67496ea2a7d207200000000000000000000000011180325b253dad82be5855af67496ea2a7d20720000000000000000000000000000000000000000000000000018f255faa0310000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -5710,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec3400000000000000000000000060e15f715ce1739d00280970aee91ded8644484500000000000000000000000060e15f715ce1739d00280970aee91ded86444845000000000000000000000000000000000000000000000000004263744d3897d900000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -5711,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec3400000000000000000000000014189b7286fa5674bc1eda3b9846ba50b527570e00000000000000000000000014189b7286fa5674bc1eda3b9846ba50b527570e0000000000000000000000000000000000000000000000000034ffaf0b84688700000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -5714,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec34000000000000000000000000118b2b107009ef2e874aca0eca4628dac947d64b000000000000000000000000118b2b107009ef2e874aca0eca4628dac947d64b00000000000000000000000000000000000000000000000000ac4c8c1560550000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -5716,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec34000000000000000000000000e8e5d2c181ee73458142792c2659cfe3ed10cb02000000000000000000000000e8e5d2c181ee73458142792c2659cfe3ed10cb02000000000000000000000000000000000000000000000000000b50fb934b0d8000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -5717,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec340000000000000000000000008242b4304d70948b53d3a09ae1fc5542c0d4292a0000000000000000000000008242b4304d70948b53d3a09ae1fc5542c0d4292a000000000000000000000000000000000000000000000000015ac1b3b7fced0000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -5718,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec340000000000000000000000009ef90a7c2581b17b8db0980cfed761745ec3f74b0000000000000000000000009ef90a7c2581b17b8db0980cfed761745ec3f74b000000000000000000000000000000000000000000000000002e5ba2cce65ed900000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -5719,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec3400000000000000000000000052509e3d2a165416e14cc5603e99957b9ce83b0f00000000000000000000000052509e3d2a165416e14cc5603e99957b9ce83b0f000000000000000000000000000000000000000000000000003a0b0662d4792300000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -5720,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec34000000000000000000000000e23735c25becc2838e2f053886cd9c983a75449a000000000000000000000000e23735c25becc2838e2f053886cd9c983a75449a000000000000000000000000000000000000000000000000006e2255f409800000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -5722,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec34000000000000000000000000e5f55468585ef91cf1a87aa3af4c830fa7ae78de000000000000000000000000e5f55468585ef91cf1a87aa3af4c830fa7ae78de0000000000000000000000000000000000000000000000000063a7f10cdcb4e000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -5723,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec340000000000000000000000009981e8c28824392eb77396e3fd183c83208b7cc80000000000000000000000009981e8c28824392eb77396e3fd183c83208b7cc8000000000000000000000000000000000000000000000000006a94d74f43000000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -5724,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec340000000000000000000000004ce822ff7ae1cce0223ff7d44fcde422889c5a230000000000000000000000004ce822ff7ae1cce0223ff7d44fcde422889c5a23000000000000000000000000000000000000000000000000002b72ce23a37d1300000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -5725,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec34000000000000000000000000d3ce8c5ef43afebab7e35bcca6b7f363ba14a10b000000000000000000000000d3ce8c5ef43afebab7e35bcca6b7f363ba14a10b000000000000000000000000000000000000000000000000002386f26fc1000000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -5726,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec34000000000000000000000000f321716db6d2e5318a1cdbc15af80df25f2f8244000000000000000000000000f321716db6d2e5318a1cdbc15af80df25f2f824400000000000000000000000000000000000000000000000002386f26fc10000000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -5729,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec34000000000000000000000000e1031825e9667178167df00c485911847e4f91fe000000000000000000000000e1031825e9667178167df00c485911847e4f91fe000000000000000000000000000000000000000000000000002386f26fc1000000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -5730,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0xa9f9e675000000000000000000000000dac17f958d2ee523a2206206994597c13d831ec700000000000000000000000094b008aa00579c1307b0ef2c499ad98a8ce58e58000000000000000000000000207b113566f3182208a28fb8c8e4f23ab8b0c42a000000000000000000000000207b113566f3182208a28fb8c8e4f23ab8b0c42a00000000000000000000000000000000000000000000000000000000026fd3d700000000000000000000000000000000000000000000000000000000000000c00000000000000000000000000000000000000000000000000000000000000000,,,1,true -5731,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec34000000000000000000000000aa9ccef24415475e88d644d3c33fb4ed1b29ffaf000000000000000000000000aa9ccef24415475e88d644d3c33fb4ed1b29ffaf00000000000000000000000000000000000000000000000000005af3107a400000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -5732,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec340000000000000000000000007af91cc664841f22e00f32efbd08c75da629d0110000000000000000000000007af91cc664841f22e00f32efbd08c75da629d01100000000000000000000000000000000000000000000000000038d7ea4c6800000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -5733,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec34000000000000000000000000883c6898713f968dde996467af2a20ff034a2e7b000000000000000000000000883c6898713f968dde996467af2a20ff034a2e7b0000000000000000000000000000000000000000000000000001c6bf5263400000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -5735,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec340000000000000000000000007277e46511d46981b2d63bb2e8304710e85075e70000000000000000000000007277e46511d46981b2d63bb2e8304710e85075e70000000000000000000000000000000000000000000000000001c6bf5263400000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -5736,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec34000000000000000000000000931e8a21e4714ff99b4514dc891f357bff8e54f8000000000000000000000000931e8a21e4714ff99b4514dc891f357bff8e54f80000000000000000000000000000000000000000000000000001c6bf5263400000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -5737,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec34000000000000000000000000b6e56fd011fde843410914e8c58ba005b447a64e000000000000000000000000b6e56fd011fde843410914e8c58ba005b447a64e0000000000000000000000000000000000000000000000000001c6bf5263400000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -5739,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec34000000000000000000000000c434436ad93c531f47b0a6415dafad6ebfa6d823000000000000000000000000c434436ad93c531f47b0a6415dafad6ebfa6d823000000000000000000000000000000000000000000000000007c58508723800000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -5740,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec34000000000000000000000000de50587f77e7cb30c3cceb2bcf19affb12668865000000000000000000000000de50587f77e7cb30c3cceb2bcf19affb126688650000000000000000000000000000000000000000000000000001c6bf5263400000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -5741,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0xa9f9e675000000000000000000000000dac17f958d2ee523a2206206994597c13d831ec700000000000000000000000094b008aa00579c1307b0ef2c499ad98a8ce58e58000000000000000000000000943be0102bdd5eab787e510ff7d578cf1a499a8a000000000000000000000000943be0102bdd5eab787e510ff7d578cf1a499a8a0000000000000000000000000000000000000000000000000000000004f78c7200000000000000000000000000000000000000000000000000000000000000c00000000000000000000000000000000000000000000000000000000000000000,,,1,true -5743,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec3400000000000000000000000080f534afdb982ef359f3d9de8d82a8d3f3b965c500000000000000000000000080f534afdb982ef359f3d9de8d82a8d3f3b965c50000000000000000000000000000000000000000000000000011c37937e0800000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -5744,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec340000000000000000000000008d83abb0e7a9643c9b9040d6ca9238a4b78ab0210000000000000000000000008d83abb0e7a9643c9b9040d6ca9238a4b78ab0210000000000000000000000000000000000000000000000000011c37937e0800000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -5745,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec34000000000000000000000000575db8bf64d74df770386196f651f5e920634b72000000000000000000000000575db8bf64d74df770386196f651f5e920634b72000000000000000000000000000000000000000000000000000110d9316ec00000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -5746,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec3400000000000000000000000098aa52dc061b008f3c11866c1294fb878b34e10d00000000000000000000000098aa52dc061b008f3c11866c1294fb878b34e10d000000000000000000000000000000000000000000000000000110d9316ec00000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -5747,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec3400000000000000000000000060c1b9739000dd2ae75f3bc27d93f4181d77e3d200000000000000000000000060c1b9739000dd2ae75f3bc27d93f4181d77e3d2000000000000000000000000000000000000000000000000000110d9316ec00000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -5748,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec34000000000000000000000000b4d09b441573b8169341be1d0d2e6cb42e2bf721000000000000000000000000b4d09b441573b8169341be1d0d2e6cb42e2bf721000000000000000000000000000000000000000000000000000110d9316ec00000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -5749,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec34000000000000000000000000e6b59759ec807879baa25ca6cc19aabef6191692000000000000000000000000e6b59759ec807879baa25ca6cc19aabef6191692000000000000000000000000000000000000000000000000000110d9316ec00000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -5750,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec340000000000000000000000000813407596e7c63cd3958ff081ca078cb31ddbf10000000000000000000000000813407596e7c63cd3958ff081ca078cb31ddbf100000000000000000000000000000000000000000000000000a7fff78c0ecf9200000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -5751,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec34000000000000000000000000a1ca2cd95c881800d86a3b3ba6b120b49cd7da03000000000000000000000000a1ca2cd95c881800d86a3b3ba6b120b49cd7da03000000000000000000000000000000000000000000000000000110d9316ec00000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -5752,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec3400000000000000000000000050849ee0e1b4b87ddd43fb3de905ce2783c2ad5000000000000000000000000050849ee0e1b4b87ddd43fb3de905ce2783c2ad50000000000000000000000000000000000000000000000000000110d9316ec00000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -5753,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec34000000000000000000000000dff97b7634cb8df4d2b29185667b982118f1e620000000000000000000000000dff97b7634cb8df4d2b29185667b982118f1e620000000000000000000000000000000000000000000000000000110d9316ec00000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -5754,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec3400000000000000000000000047f4ee0ecc560668854ea1b0b0c64742fe778b7500000000000000000000000047f4ee0ecc560668854ea1b0b0c64742fe778b75000000000000000000000000000000000000000000000000000110d9316ec00000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -5755,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec34000000000000000000000000eca01f7d3efaedadd45786ad4bf6b10f471f0a29000000000000000000000000eca01f7d3efaedadd45786ad4bf6b10f471f0a29000000000000000000000000000000000000000000000000000110d9316ec00000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -5757,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec340000000000000000000000007f06a88da83f93a4028b3917523d66e409c070b60000000000000000000000007f06a88da83f93a4028b3917523d66e409c070b6000000000000000000000000000000000000000000000000000110d9316ec00000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -5758,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec3400000000000000000000000000f14994ffd06b8c352e12b41113bc0f77fc404200000000000000000000000000f14994ffd06b8c352e12b41113bc0f77fc4042000000000000000000000000000000000000000000000000000110d9316ec00000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -5759,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec34000000000000000000000000b4f9d59a0bc92cfe2103a4862573b58d86be3424000000000000000000000000b4f9d59a0bc92cfe2103a4862573b58d86be342400000000000000000000000000000000000000000000000000354a6ba7a1800000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -5761,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec34000000000000000000000000aa9ccef24415475e88d644d3c33fb4ed1b29ffaf000000000000000000000000aa9ccef24415475e88d644d3c33fb4ed1b29ffaf000000000000000000000000000000000000000000000000000009184e72a00000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -5762,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec340000000000000000000000001a6fd5764581c142213140e17fabef2db70692c40000000000000000000000001a6fd5764581c142213140e17fabef2db70692c4000000000000000000000000000000000000000000000000000009184e72a00000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -5764,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec340000000000000000000000009f13365f0d9c0470b86817e05a9c0cca4d17c8ae0000000000000000000000009f13365f0d9c0470b86817e05a9c0cca4d17c8ae0000000000000000000000000000000000000000000000000011c37937e0800000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -5765,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec3400000000000000000000000085a0ae757f88dae8b14f59e86b5f5616ba9de3c200000000000000000000000085a0ae757f88dae8b14f59e86b5f5616ba9de3c2000000000000000000000000000000000000000000000000000009184e72a00000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -5766,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec3400000000000000000000000032d641b2d54a46b9e4448bf35f667e17da2fd14d00000000000000000000000032d641b2d54a46b9e4448bf35f667e17da2fd14d00000000000000000000000000000000000000000000000000b1a2bc2ec5000000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -5767,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec34000000000000000000000000b4a08ddb47fb1ab70b5bcc561caa39c3f63827a2000000000000000000000000b4a08ddb47fb1ab70b5bcc561caa39c3f63827a200000000000000000000000000000000000000000000000000499c8322914c6300000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -5768,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec34000000000000000000000000d071194f93de2461b545c85d621c730704a02343000000000000000000000000d071194f93de2461b545c85d621c730704a02343000000000000000000000000000000000000000000000000008e1bc9bf04000000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -5770,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec34000000000000000000000000d703a8918da1bb6ee7073a481e89ae04581a5342000000000000000000000000d703a8918da1bb6ee7073a481e89ae04581a53420000000000000000000000000000000000000000000000000002433b35bafe4000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -5771,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec34000000000000000000000000c56569af55410b2922e116a233494972b8dc3474000000000000000000000000c56569af55410b2922e116a233494972b8dc34740000000000000000000000000000000000000000000000000031bced02db000000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -5772,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec34000000000000000000000000822759d8f48a42b9ff29c040619b5539c31b727b000000000000000000000000822759d8f48a42b9ff29c040619b5539c31b727b000000000000000000000000000000000000000000000000013fbe85edc9000000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -5774,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec3400000000000000000000000067e3d581dbfe600510b0aed1a74b2840ef4ea3db00000000000000000000000067e3d581dbfe600510b0aed1a74b2840ef4ea3db000000000000000000000000000000000000000000000000000110d9316ec00000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -5775,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec34000000000000000000000000d10aa04285b5f85d22901b9d01d89d75077a9657000000000000000000000000d10aa04285b5f85d22901b9d01d89d75077a96570000000000000000000000000000000000000000000000000006b88d918b780000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -5776,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec34000000000000000000000000520d54f75777b58fee71a3074256aabbdb47074c000000000000000000000000520d54f75777b58fee71a3074256aabbdb47074c00000000000000000000000000000000000000000000000000b1a2bc2ec5000000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -5777,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec3400000000000000000000000087105752954887b1140b7cea133eacc8ae8607b500000000000000000000000087105752954887b1140b7cea133eacc8ae8607b5000000000000000000000000000000000000000000000000005fec5b60ef800000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -5778,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec3400000000000000000000000035f78a470000c9974aab3e37a6882e374f42566300000000000000000000000035f78a470000c9974aab3e37a6882e374f425663000000000000000000000000000000000000000000000000000009184e72a00000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -5779,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0xa9f9e6750000000000000000000000002260fac5e5542a773aa44fbcfedf7c193bc2c59900000000000000000000000068f180fcce6836688e9084f035309e29bf0a209500000000000000000000000008968309443465c03244c9206052aa20cdbb679700000000000000000000000008968309443465c03244c9206052aa20cdbb6797000000000000000000000000000000000000000000000000000000000ccf22bb00000000000000000000000000000000000000000000000000000000000000c00000000000000000000000000000000000000000000000000000000000000000,0x45e79fb50a21687be2a39626198e4b64260ee10f3a43ca36c409f2913507eda4,2022-01-11 16:07:02.000 UTC,0,true -5780,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec340000000000000000000000009f9f1a9c106cadb1f776cc582d3c78da4043dd510000000000000000000000009f9f1a9c106cadb1f776cc582d3c78da4043dd51000000000000000000000000000000000000000000000000015d7d2d55698d0000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -5783,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec34000000000000000000000000ef101ffdcef941b6fad240226f754e99f84e177c000000000000000000000000ef101ffdcef941b6fad240226f754e99f84e177c000000000000000000000000000000000000000000000000000009184e72a00000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -5784,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec3400000000000000000000000018a842c315c6a8c54d041c65b0aa2732f50c00da00000000000000000000000018a842c315c6a8c54d041c65b0aa2732f50c00da000000000000000000000000000000000000000000000000003c6568f12e800000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -5785,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec340000000000000000000000003e3b749409d240c7f50b483079e0df003c8c181f0000000000000000000000003e3b749409d240c7f50b483079e0df003c8c181f000000000000000000000000000000000000000000000000000009184e72a00000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -5786,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec34000000000000000000000000cb55475384aa31c5100986cda2476df2103fc2ee000000000000000000000000cb55475384aa31c5100986cda2476df2103fc2ee000000000000000000000000000000000000000000000000000009184e72a00000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -5787,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec3400000000000000000000000086d7667cb7b0d33e81300cb6a220b553360b3d3400000000000000000000000086d7667cb7b0d33e81300cb6a220b553360b3d34000000000000000000000000000000000000000000000000000009184e72a00000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -5789,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec34000000000000000000000000445bf7bab73ab0bdb84c882f8f7b3ee6bd28a2ba000000000000000000000000445bf7bab73ab0bdb84c882f8f7b3ee6bd28a2ba000000000000000000000000000000000000000000000000000009184e72a00000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -5793,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec34000000000000000000000000d565a49e5caa0eb79d5175405283fc0e3326c097000000000000000000000000d565a49e5caa0eb79d5175405283fc0e3326c097000000000000000000000000000000000000000000000000000aa87bee53800000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -5797,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec3400000000000000000000000067a6076958f88b4944c7281b6fc2e67c76bcb9e200000000000000000000000067a6076958f88b4944c7281b6fc2e67c76bcb9e2000000000000000000000000000000000000000000000000002386f26fc1000000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -5799,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec34000000000000000000000000187f7311a58baa258855fd190071411110d685f0000000000000000000000000187f7311a58baa258855fd190071411110d685f000000000000000000000000000000000000000000000000001d882cb9b20800000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,0x4aa6164a39bbbd80526f575a4715ac329342863884ac948c4c8617a98e25aade,2022-03-04 10:57:07.000 UTC,0,true -5800,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec3400000000000000000000000068abe26c2e9fae42c4daeed9d1ac68b3488fc83900000000000000000000000068abe26c2e9fae42c4daeed9d1ac68b3488fc839000000000000000000000000000000000000000000000000002386f26fc1000000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -5802,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec340000000000000000000000002e124f9182d36cf13c2cc6b4657394080b5807d20000000000000000000000002e124f9182d36cf13c2cc6b4657394080b5807d200000000000000000000000000000000000000000000000000a4c59d670a7f4100000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -5803,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec340000000000000000000000000dc1d71121c0880e02ea1bad4f8fde0ae2c018f50000000000000000000000000dc1d71121c0880e02ea1bad4f8fde0ae2c018f5000000000000000000000000000000000000000000000000002386f26fc1000000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -5804,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec34000000000000000000000000d7101e2e0680d30623e59de267ec4b2f4ecfd3ce000000000000000000000000d7101e2e0680d30623e59de267ec4b2f4ecfd3ce000000000000000000000000000000000000000000000000002386f26fc1000000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -5806,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec34000000000000000000000000c5e7c5032d203b69da4d8feb7f3c3179fd9cb83b000000000000000000000000c5e7c5032d203b69da4d8feb7f3c3179fd9cb83b00000000000000000000000000000000000000000000000000470de4df82000000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -5808,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0xa9f9e675000000000000000000000000dac17f958d2ee523a2206206994597c13d831ec700000000000000000000000094b008aa00579c1307b0ef2c499ad98a8ce58e580000000000000000000000001b6fc127150282b390e255f0772e6f8d806e264d0000000000000000000000001b6fc127150282b390e255f0772e6f8d806e264d00000000000000000000000000000000000000000000000000000000000f424000000000000000000000000000000000000000000000000000000000000000c00000000000000000000000000000000000000000000000000000000000000000,,,1,true -5809,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0xa9f9e675000000000000000000000000a0b86991c6218b36c1d19d4a2e9eb0ce3606eb480000000000000000000000007f5c764cbc14f9669b88837ca1490cca17c31607000000000000000000000000eed8403b6513c80bfcedeb8b616796e4b91d1a0b000000000000000000000000eed8403b6513c80bfcedeb8b616796e4b91d1a0b000000000000000000000000000000000000000000000000000000007735940000000000000000000000000000000000000000000000000000000000000000c00000000000000000000000000000000000000000000000000000000000000000,,,1,true -5810,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0xa9f9e675000000000000000000000000dac17f958d2ee523a2206206994597c13d831ec700000000000000000000000094b008aa00579c1307b0ef2c499ad98a8ce58e580000000000000000000000000444c019c90402033ff8246bcea440ceb9468c880000000000000000000000000444c019c90402033ff8246bcea440ceb9468c8800000000000000000000000000000000000000000000000000000000000f424000000000000000000000000000000000000000000000000000000000000000c00000000000000000000000000000000000000000000000000000000000000000,,,1,true -5811,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec34000000000000000000000000d0d6e0e58fe68bd495b4fd56bff3b19676460272000000000000000000000000d0d6e0e58fe68bd495b4fd56bff3b196764602720000000000000000000000000000000000000000000000000332e7e028cc6b7e00000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -5812,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec34000000000000000000000000d565a49e5caa0eb79d5175405283fc0e3326c097000000000000000000000000d565a49e5caa0eb79d5175405283fc0e3326c0970000000000000000000000000000000000000000000000000003bde3f4c6630000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -5815,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec34000000000000000000000000d41b30ea59b8e7fca13ac85172411bd98779fb9d000000000000000000000000d41b30ea59b8e7fca13ac85172411bd98779fb9d000000000000000000000000000000000000000000000000000009184e72a00000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -5816,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec34000000000000000000000000d41b30ea59b8e7fca13ac85172411bd98779fb9d000000000000000000000000d41b30ea59b8e7fca13ac85172411bd98779fb9d000000000000000000000000000000000000000000000000000009184e72a00000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -5817,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec34000000000000000000000000d41b30ea59b8e7fca13ac85172411bd98779fb9d000000000000000000000000d41b30ea59b8e7fca13ac85172411bd98779fb9d000000000000000000000000000000000000000000000000000009184e72a00000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -5818,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec340000000000000000000000005f079c9d3f5b212698f30359d1bea0fe9a037e620000000000000000000000005f079c9d3f5b212698f30359d1bea0fe9a037e62000000000000000000000000000000000000000000000000003fc3a8285ee10000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -5819,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec340000000000000000000000003bb97b97fa7499d688251eabae41ab0810f6dea50000000000000000000000003bb97b97fa7499d688251eabae41ab0810f6dea5000000000000000000000000000000000000000000000000009ee3b65cf3854b00000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -5820,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec34000000000000000000000000ffea6035d1300c983d2cbbe42e48351a2c1f27b9000000000000000000000000ffea6035d1300c983d2cbbe42e48351a2c1f27b90000000000000000000000000000000000000000000000000040d9ed9a7f6a0000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -5822,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec34000000000000000000000000958f5a41ba65d1eed7aae15a03a6e557c17b91fd000000000000000000000000958f5a41ba65d1eed7aae15a03a6e557c17b91fd00000000000000000000000000000000000000000000000001469b1fe578b62400000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -5824,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec3400000000000000000000000039be4b0a0b0486a28eb60bf16061be14f51ef91400000000000000000000000039be4b0a0b0486a28eb60bf16061be14f51ef91400000000000000000000000000000000000000000000000000acc4ce1d881f0000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -5826,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec340000000000000000000000004b3dab9f937030d14eb25f6f25ce749c68dd57ab0000000000000000000000004b3dab9f937030d14eb25f6f25ce749c68dd57ab00000000000000000000000000000000000000000000000000013e52b9abe00000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -5827,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec34000000000000000000000000068e70285e515aeda9a99dcea429d0c9dc36a85b000000000000000000000000068e70285e515aeda9a99dcea429d0c9dc36a85b00000000000000000000000000000000000000000000000000013e52b9abe00000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -5828,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec34000000000000000000000000e703b5d3abbfbf7d64c3e164f812b1998f097f47000000000000000000000000e703b5d3abbfbf7d64c3e164f812b1998f097f4700000000000000000000000000000000000000000000000000013e52b9abe00000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -5829,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec34000000000000000000000000ba35b90e51c42e1069bad364b65512c1e7d87f39000000000000000000000000ba35b90e51c42e1069bad364b65512c1e7d87f39000000000000000000000000000000000000000000000000002386f26fc1000000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -5830,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec34000000000000000000000000e34076bc4355792c789a46ada9fa8a3e8b57f03b000000000000000000000000e34076bc4355792c789a46ada9fa8a3e8b57f03b00000000000000000000000000000000000000000000000000013e52b9abe00000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -5831,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec3400000000000000000000000098908c98a27a26189f5f226aa16171c0cb9fdb3600000000000000000000000098908c98a27a26189f5f226aa16171c0cb9fdb3600000000000000000000000000000000000000000000000000013e52b9abe00000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -5832,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec34000000000000000000000000938780de40be92d05bfe2dac27ecc4c69f4cd6ac000000000000000000000000938780de40be92d05bfe2dac27ecc4c69f4cd6ac00000000000000000000000000000000000000000000000000013e52b9abe00000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -5834,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec34000000000000000000000000059b254553bb97ca61a99c2bbdbefb594aa94365000000000000000000000000059b254553bb97ca61a99c2bbdbefb594aa94365000000000000000000000000000000000000000000000000001947f6d5c72d4600000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -5835,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec34000000000000000000000000a4e2be266106268849f75138db3f0ad66d804aad000000000000000000000000a4e2be266106268849f75138db3f0ad66d804aad000000000000000000000000000000000000000000000000006a94d74f43000000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -5836,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec34000000000000000000000000a8c650ccdec6078828b30bd52ae82caf31a38aae000000000000000000000000a8c650ccdec6078828b30bd52ae82caf31a38aae00000000000000000000000000000000000000000000000000005af3107a400000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -5837,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec34000000000000000000000000913cf0f5d17c595a36c94dfec86f16efaa50f5b1000000000000000000000000913cf0f5d17c595a36c94dfec86f16efaa50f5b10000000000000000000000000000000000000000000000000038d494eb1715d100000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -5838,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec340000000000000000000000005cf0931ac79d56ef8ecef6842e0c78f7b3be789f0000000000000000000000005cf0931ac79d56ef8ecef6842e0c78f7b3be789f0000000000000000000000000000000000000000000000000154e7b83e4f34c000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -5839,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec3400000000000000000000000099e0ba8e8919d18fad1977208d50bdbabd868b1200000000000000000000000099e0ba8e8919d18fad1977208d50bdbabd868b12000000000000000000000000000000000000000000000000000c6f3b40b6c00000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -5840,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec3400000000000000000000000053eb86f6d4d65d0325142844b4dac80ccf92404f00000000000000000000000053eb86f6d4d65d0325142844b4dac80ccf92404f0000000000000000000000000000000000000000000000000de0b6b3a764000000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -5841,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec3400000000000000000000000067e3d581dbfe600510b0aed1a74b2840ef4ea3db00000000000000000000000067e3d581dbfe600510b0aed1a74b2840ef4ea3db00000000000000000000000000000000000000000000000000013e52b9abe00000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -5842,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec3400000000000000000000000089b2439ed5a0579c9dd1ec0060dca78aa9e0276500000000000000000000000089b2439ed5a0579c9dd1ec0060dca78aa9e0276500000000000000000000000000000000000000000000000000013e52b9abe00000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -5843,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec34000000000000000000000000b41ea083efb19b5a42e548f5b82594688b2a46c7000000000000000000000000b41ea083efb19b5a42e548f5b82594688b2a46c700000000000000000000000000000000000000000000000000013e52b9abe00000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -5844,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec34000000000000000000000000ad2df9bc2fe3438f5b67a25ef31557fa63420b0d000000000000000000000000ad2df9bc2fe3438f5b67a25ef31557fa63420b0d00000000000000000000000000000000000000000000000000013e52b9abe00000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -5845,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec3400000000000000000000000081242be4885f8da938bc1795a0fc86b12bc7a01300000000000000000000000081242be4885f8da938bc1795a0fc86b12bc7a01300000000000000000000000000000000000000000000000000013e52b9abe00000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -5846,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec340000000000000000000000003035a1bbd824041b07f8ab2297a71a81e00127c50000000000000000000000003035a1bbd824041b07f8ab2297a71a81e00127c500000000000000000000000000000000000000000000000006f05b59d3b2000000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,0x3e470a3549faf6faad097a10ea574689edfc0ddfee58d7911e408f30905b6326,2021-12-03 08:47:30.000 UTC,0,true -5847,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec34000000000000000000000000432c4407683f2a751da658448f14a9fc76bf4887000000000000000000000000432c4407683f2a751da658448f14a9fc76bf488700000000000000000000000000000000000000000000000000013e52b9abe00000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -5848,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec340000000000000000000000008dbd7d8fad56a6698063c77447cd0d31f59c839f0000000000000000000000008dbd7d8fad56a6698063c77447cd0d31f59c839f00000000000000000000000000000000000000000000000000531d4f1ebe547d00000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -5849,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec34000000000000000000000000b4455961533f9bff3db0ffc51197679e76a044f0000000000000000000000000b4455961533f9bff3db0ffc51197679e76a044f000000000000000000000000000000000000000000000000000013e52b9abe00000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -5850,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec34000000000000000000000000257989cfdb248c515807d7e5892eeca350518c83000000000000000000000000257989cfdb248c515807d7e5892eeca350518c8300000000000000000000000000000000000000000000000000013e52b9abe00000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -5851,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec34000000000000000000000000942030d115a5895d1412604e4302dcd674875722000000000000000000000000942030d115a5895d1412604e4302dcd67487572200000000000000000000000000000000000000000000000000013e52b9abe00000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -5852,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec34000000000000000000000000592d646b32e06cbeb37eca996bc3de09b9284f02000000000000000000000000592d646b32e06cbeb37eca996bc3de09b9284f02000000000000000000000000000000000000000000000000000009184e72a00000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -5853,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec3400000000000000000000000053eb86f6d4d65d0325142844b4dac80ccf92404f00000000000000000000000053eb86f6d4d65d0325142844b4dac80ccf92404f000000000000000000000000000000000000000000000000058d15e17628000000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -5854,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec34000000000000000000000000ed79e33546d13ae3e0bc5a295cdd16648bd3d1c7000000000000000000000000ed79e33546d13ae3e0bc5a295cdd16648bd3d1c700000000000000000000000000000000000000000000000000013e52b9abe00000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -5855,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec34000000000000000000000000a90ee5a3bec0d9313b7992cd94dfc2f495f39041000000000000000000000000a90ee5a3bec0d9313b7992cd94dfc2f495f3904100000000000000000000000000000000000000000000000000638a5e59c50d0000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -5856,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec34000000000000000000000000334af0de88370100861140ad7d01d99ac0af1159000000000000000000000000334af0de88370100861140ad7d01d99ac0af1159000000000000000000000000000000000000000000000000001377384c99a6e200000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -5857,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec34000000000000000000000000400d190cc5451e8127b3dd393559a7ed12249123000000000000000000000000400d190cc5451e8127b3dd393559a7ed1224912300000000000000000000000000000000000000000000000000ab856c2472fd0000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -5860,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec34000000000000000000000000b843de66d048e87d986c6dda826a79e9a724d894000000000000000000000000b843de66d048e87d986c6dda826a79e9a724d89400000000000000000000000000000000000000000000000000013969cc61790000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -5861,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec340000000000000000000000007453019b806919563eac33870fe5f8e5154fdf380000000000000000000000007453019b806919563eac33870fe5f8e5154fdf3800000000000000000000000000000000000000000000000000c4ea764436a10600000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,0x8df0392700003ce47d3e1a40ad85f1a91c215d7d3bb5684c4777db996277a6a5,2022-05-29 05:47:39.000 UTC,0,true -5863,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec340000000000000000000000003459566b907c90be7868c2aad3a951b63ad631d90000000000000000000000003459566b907c90be7868c2aad3a951b63ad631d9000000000000000000000000000000000000000000000000001ff973cafa800000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -5864,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec34000000000000000000000000edadb841ffa02e2eb1f9b61829ad6ac318c38588000000000000000000000000edadb841ffa02e2eb1f9b61829ad6ac318c3858800000000000000000000000000000000000000000000000000406cdb6379180000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -5868,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec34000000000000000000000000151b079d1f51ff2dda6a4bcb7077380b0d76d721000000000000000000000000151b079d1f51ff2dda6a4bcb7077380b0d76d7210000000000000000000000000000000000000000000000000000b50c85fa2c0000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -5869,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec34000000000000000000000000ccc93c66c6e80bf3d68bc63f546cbb42ab4895d6000000000000000000000000ccc93c66c6e80bf3d68bc63f546cbb42ab4895d6000000000000000000000000000000000000000000000000000e35fa931a000000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -5870,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec340000000000000000000000001bd91efda871150bf54d11ee87ef67c2036b52460000000000000000000000001bd91efda871150bf54d11ee87ef67c2036b524600000000000000000000000000000000000000000000000000038d7ea4c6800000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -5871,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec34000000000000000000000000d21dac3f1a8672d385ab7caeeb3eb31b5eee1947000000000000000000000000d21dac3f1a8672d385ab7caeeb3eb31b5eee194700000000000000000000000000000000000000000000000002c156df45ef030000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -5872,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec3400000000000000000000000082fd529006e13beea50f5cf906d268de905ce7f900000000000000000000000082fd529006e13beea50f5cf906d268de905ce7f900000000000000000000000000000000000000000000000000068b14feb6870200000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -5878,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec34000000000000000000000000b8983d041f4e752032f2964b8e095c1f1c61956b000000000000000000000000b8983d041f4e752032f2964b8e095c1f1c61956b0000000000000000000000000000000000000000000000000375ebcf5a6ba6f900000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -5879,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec340000000000000000000000007fa3402befaf74404c531c878f433aac27bad2340000000000000000000000007fa3402befaf74404c531c878f433aac27bad23400000000000000000000000000000000000000000000000000ac12603c4be50000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -5880,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec34000000000000000000000000bfa3f52d271883e11c0210b1bfd2fa061bf49d8a000000000000000000000000bfa3f52d271883e11c0210b1bfd2fa061bf49d8a00000000000000000000000000000000000000000000000002a0871a679c199a00000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -5883,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec340000000000000000000000007841ca40b1ae5e5b19818817ecd784a496f87df00000000000000000000000007841ca40b1ae5e5b19818817ecd784a496f87df00000000000000000000000000000000000000000000000000137ac9eb581b1c000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -5884,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec3400000000000000000000000099f0b621c3cb9149bd653ae5fcb79481764eb5f200000000000000000000000099f0b621c3cb9149bd653ae5fcb79481764eb5f200000000000000000000000000000000000000000000000000071afd498d000000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -5885,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec34000000000000000000000000196aafc8f801c749196062e19774ba747a8ac3c4000000000000000000000000196aafc8f801c749196062e19774ba747a8ac3c4000000000000000000000000000000000000000000000000002386f26fc1000000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -5887,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec340000000000000000000000000eb4b776bd8dadbe54b4de754338ac1f07897d3e0000000000000000000000000eb4b776bd8dadbe54b4de754338ac1f07897d3e0000000000000000000000000000000000000000000000000008d539894c0cc000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -5893,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec34000000000000000000000000f1912c7917b6da214a7118d323c3049229d765b3000000000000000000000000f1912c7917b6da214a7118d323c3049229d765b300000000000000000000000000000000000000000000000000470de4df82000000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -5894,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec3400000000000000000000000036e7f8a7e490f6b10f55c985441bbba13e04f5be00000000000000000000000036e7f8a7e490f6b10f55c985441bbba13e04f5be00000000000000000000000000000000000000000000000000464ac2467aa00700000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -5895,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec3400000000000000000000000007a64826e5798109d75b519010bcc833ee80d99d00000000000000000000000007a64826e5798109d75b519010bcc833ee80d99d000000000000000000000000000000000000000000000000015c9e002fa7730000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -5897,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec340000000000000000000000000490fcefab0dfbd85aeda3eef8fb4a0628bba2060000000000000000000000000490fcefab0dfbd85aeda3eef8fb4a0628bba206000000000000000000000000000000000000000000000000000443a6bd55edc000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -5898,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec34000000000000000000000000e3c92ebf0eaa833207e49183a485c362489640a9000000000000000000000000e3c92ebf0eaa833207e49183a485c362489640a900000000000000000000000000000000000000000000000000005af3107a400000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -5899,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec34000000000000000000000000b114bd2fd24258a9ba8fe40e0c7081bda923f6aa000000000000000000000000b114bd2fd24258a9ba8fe40e0c7081bda923f6aa00000000000000000000000000000000000000000000000004022a29bd180c3800000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -5900,0x10e6593cdda8c58a1d0f14c5164b376352a55f2f,0x467194771dae2967aef3ecbedd3bf9a310c76c65,0xa9f9e6750000000000000000000000006b175474e89094c44da98b954eedeac495271d0f000000000000000000000000da10009cbd5d07dd0cecc66161fc93d7c9000da1000000000000000000000000353b03d97f644bb6c296e07cd347af64083e918b000000000000000000000000353b03d97f644bb6c296e07cd347af64083e918b00000000000000000000000000000000000000000000001814d08819d47036aa00000000000000000000000000000000000000000000000000000000000000c00000000000000000000000000000000000000000000000000000000000000000,,,1,true -5901,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec34000000000000000000000000ce7e5098619f8660aad4bac0de6ac57ef709d8a7000000000000000000000000ce7e5098619f8660aad4bac0de6ac57ef709d8a7000000000000000000000000000000000000000000000000016345785d8a000000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -5902,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec34000000000000000000000000cbab5f03e366b48459110f582953fe81fb88ec30000000000000000000000000cbab5f03e366b48459110f582953fe81fb88ec3000000000000000000000000000000000000000000000000000c29fb5eb32e5c900000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -5903,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec34000000000000000000000000b389b98659d17ec8c264b523064e246bb464e755000000000000000000000000b389b98659d17ec8c264b523064e246bb464e755000000000000000000000000000000000000000000000000002386f26fc1000000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -5904,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec34000000000000000000000000e08a4b01143443f3beb5768748543d6347360f5b000000000000000000000000e08a4b01143443f3beb5768748543d6347360f5b0000000000000000000000000000000000000000000000000011c37937e0800000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -5905,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0xa9f9e675000000000000000000000000dac17f958d2ee523a2206206994597c13d831ec700000000000000000000000094b008aa00579c1307b0ef2c499ad98a8ce58e58000000000000000000000000410d9cbadd36333d98c2391bc6525f1724d53949000000000000000000000000410d9cbadd36333d98c2391bc6525f1724d539490000000000000000000000000000000000000000000000000000000001e6aa3200000000000000000000000000000000000000000000000000000000000000c00000000000000000000000000000000000000000000000000000000000000000,,,1,true -5906,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec34000000000000000000000000e6e0f3c0c361675c8c08afb33eaea33880eaf239000000000000000000000000e6e0f3c0c361675c8c08afb33eaea33880eaf2390000000000000000000000000000000000000000000000000004dc00c864c2c000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -5907,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec34000000000000000000000000410d9cbadd36333d98c2391bc6525f1724d53949000000000000000000000000410d9cbadd36333d98c2391bc6525f1724d5394900000000000000000000000000000000000000000000000000152cbe698a3f4000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -5908,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec340000000000000000000000004bc6480367e6e572e503b2b6b579031105b3c5c80000000000000000000000004bc6480367e6e572e503b2b6b579031105b3c5c800000000000000000000000000000000000000000000000000038d7ea4c6800000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -5909,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec340000000000000000000000003ebc1818f2c4803cd8ecfb6dc0ee0da0dd42f31d0000000000000000000000003ebc1818f2c4803cd8ecfb6dc0ee0da0dd42f31d0000000000000000000000000000000000000000000000000008b8b072a6624a00000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -5910,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec340000000000000000000000002875403e0d69641cf631f10e48e63c40e4b27fc30000000000000000000000002875403e0d69641cf631f10e48e63c40e4b27fc3000000000000000000000000000000000000000000000000001becd9a8d38cb500000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -5911,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec340000000000000000000000001778cb9fd8d489c740568a9bf16004d948d9b6bf0000000000000000000000001778cb9fd8d489c740568a9bf16004d948d9b6bf000000000000000000000000000000000000000000000000002d12be6ce4ce0000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -5912,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec340000000000000000000000006241ad77084b023f13e9ef075610452d1b51725f0000000000000000000000006241ad77084b023f13e9ef075610452d1b51725f000000000000000000000000000000000000000000000000002e72d910156f0000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -5913,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec3400000000000000000000000005a07d49f109207f5b23c6405a321d14fe8f130c00000000000000000000000005a07d49f109207f5b23c6405a321d14fe8f130c00000000000000000000000000000000000000000000000000038d7ea4c6800000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -5914,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0xa9f9e675000000000000000000000000dac17f958d2ee523a2206206994597c13d831ec700000000000000000000000094b008aa00579c1307b0ef2c499ad98a8ce58e5800000000000000000000000087b1f518ca6bec87d70af81e378fe961012e988200000000000000000000000087b1f518ca6bec87d70af81e378fe961012e98820000000000000000000000000000000000000000000000000000000001853e4500000000000000000000000000000000000000000000000000000000000000c00000000000000000000000000000000000000000000000000000000000000000,,,1,true -5915,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec34000000000000000000000000bb8248ab9b9e4e82beb10c74622975270643ee8d000000000000000000000000bb8248ab9b9e4e82beb10c74622975270643ee8d0000000000000000000000000000000000000000000000000011c37937e0800000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -5916,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec3400000000000000000000000061656eb3ce807894625d4a87510e53e719186af000000000000000000000000061656eb3ce807894625d4a87510e53e719186af000000000000000000000000000000000000000000000000000ea7aa67b2d000000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -5918,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec340000000000000000000000007aa3c6a33ec4bbfc6319e3c98333a018efdb1e680000000000000000000000007aa3c6a33ec4bbfc6319e3c98333a018efdb1e6800000000000000000000000000000000000000000000000000a80290b961acc600000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -5919,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec34000000000000000000000000a9bb8b1211ed7648982ac37cbaf4f381efb3db32000000000000000000000000a9bb8b1211ed7648982ac37cbaf4f381efb3db32000000000000000000000000000000000000000000000000002386f26fc1000000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -5920,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec34000000000000000000000000e9e2b81fd37418a8d2b276e257e9e129a79c1c21000000000000000000000000e9e2b81fd37418a8d2b276e257e9e129a79c1c2100000000000000000000000000000000000000000000000000038d7ea4c6800000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -5922,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec34000000000000000000000000f5771dd835880fff8cede5a8f5d0f2843ee9869e000000000000000000000000f5771dd835880fff8cede5a8f5d0f2843ee9869e00000000000000000000000000000000000000000000000000069dc7a032cb0000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -5923,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec34000000000000000000000000319aeb370f46a08477fa577a9b3567799dbae57d000000000000000000000000319aeb370f46a08477fa577a9b3567799dbae57d0000000000000000000000000000000000000000000000000005543df729c00000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -5924,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec340000000000000000000000006dfb311f0be648cd0b1fe2065b6d0ca41397bd140000000000000000000000006dfb311f0be648cd0b1fe2065b6d0ca41397bd14000000000000000000000000000000000000000000000000000009184e72a00000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -5927,0xcd9d4988c0ae61887b075ba77f08cbfad2b65068,0x3f87ff1de58128ef8fcb4c807efd776e1ac72e51,0xf4f7b41a0000000000000000000000004d9618239044a2ab2581f0cc954d28873afa4d7b00000000000000000000000000000000000000000000000194755ac36206ac0a,,,1,true -5928,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec34000000000000000000000000275c6cb0d5ce33ae2268438fe40fcf51bbc989bc000000000000000000000000275c6cb0d5ce33ae2268438fe40fcf51bbc989bc000000000000000000000000000000000000000000000000000009184e72a00000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -5929,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec340000000000000000000000008cf368d64aabb3996ff23707e9e326e8c707ef400000000000000000000000008cf368d64aabb3996ff23707e9e326e8c707ef40000000000000000000000000000000000000000000000000000009184e72a00000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -5930,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec34000000000000000000000000c33a2966a7559b41d0f4b1ad85a0d8468c3517c9000000000000000000000000c33a2966a7559b41d0f4b1ad85a0d8468c3517c9000000000000000000000000000000000000000000000000015e9f7961f4770000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -5931,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec340000000000000000000000009e16a7785336f411796bbdd2246e13d506009c590000000000000000000000009e16a7785336f411796bbdd2246e13d506009c590000000000000000000000000000000000000000000000000001c6bf5263400000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -5932,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec340000000000000000000000005150fe3c1407fe9ccc2821feb94cf7dd6ca789c80000000000000000000000005150fe3c1407fe9ccc2821feb94cf7dd6ca789c800000000000000000000000000000000000000000000000000005af3107a400000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -5933,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec340000000000000000000000006148cb29b9fadc348ddb3f87900f31bcc2dc645d0000000000000000000000006148cb29b9fadc348ddb3f87900f31bcc2dc645d00000000000000000000000000000000000000000000000000005af3107a400000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -5934,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec340000000000000000000000004d5b7e62d31fcb77b0765a27b26b29bb76af54a80000000000000000000000004d5b7e62d31fcb77b0765a27b26b29bb76af54a800000000000000000000000000000000000000000000000000038d7ea4c6800000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -5937,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec34000000000000000000000000de05d52a6a2f06399511098e408b37b24d1c0923000000000000000000000000de05d52a6a2f06399511098e408b37b24d1c092300000000000000000000000000000000000000000000000000005af3107a400000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -5938,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec340000000000000000000000004bed34780515bc6d6d4dec9cbc178dc7c3f523730000000000000000000000004bed34780515bc6d6d4dec9cbc178dc7c3f5237300000000000000000000000000000000000000000000000000005af3107a400000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -5939,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec340000000000000000000000006dc681ae0d0a0525e302a9e0b26f4ea60015bc9e0000000000000000000000006dc681ae0d0a0525e302a9e0b26f4ea60015bc9e00000000000000000000000000000000000000000000000000169c9eee8f61e500000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -5940,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec34000000000000000000000000fa81d0ab5fa49f4f0881fc6b8c51b53911c99336000000000000000000000000fa81d0ab5fa49f4f0881fc6b8c51b53911c99336000000000000000000000000000000000000000000000000000009184e72a00000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -5941,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec34000000000000000000000000dbbea5db8e58f569ac80cc71a9d8c7e9201d6205000000000000000000000000dbbea5db8e58f569ac80cc71a9d8c7e9201d6205000000000000000000000000000000000000000000000000002386f26fc1000000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -5942,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec34000000000000000000000000bdafef987dfe2e90c68b303d82f84fda268e43dc000000000000000000000000bdafef987dfe2e90c68b303d82f84fda268e43dc000000000000000000000000000000000000000000000000000009184e72a00000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -5943,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec340000000000000000000000008fc9ae9b556a138c30c3bb4b149ebc0ebc419e500000000000000000000000008fc9ae9b556a138c30c3bb4b149ebc0ebc419e5000000000000000000000000000000000000000000000000000005af3107a400000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -5944,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec34000000000000000000000000a13f02db8b4f27531ceaeadf341ee69ea731ee4f000000000000000000000000a13f02db8b4f27531ceaeadf341ee69ea731ee4f00000000000000000000000000000000000000000000000000038d7ea4c6800000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -5945,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec3400000000000000000000000055b07b1efe15bbeff6209045775dc3d3aee1731b00000000000000000000000055b07b1efe15bbeff6209045775dc3d3aee1731b000000000000000000000000000000000000000000000000000009184e72a00000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -5946,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec34000000000000000000000000af30b0285bb41bdbb732e4a533874901e4943522000000000000000000000000af30b0285bb41bdbb732e4a533874901e4943522000000000000000000000000000000000000000000000000002386f26fc1000000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -5947,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec3400000000000000000000000054a212e596846a3e59c694f33073e6b4dc9f7d8e00000000000000000000000054a212e596846a3e59c694f33073e6b4dc9f7d8e00000000000000000000000000000000000000000000000000038d7ea4c6800000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -5948,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec340000000000000000000000006291a2710471c6689b22acf546cc8c7379011ad00000000000000000000000006291a2710471c6689b22acf546cc8c7379011ad0000000000000000000000000000000000000000000000000006a94d74f43000000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -5951,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec3400000000000000000000000049caffd56bf1e854ccfe40579a446553ba5f531200000000000000000000000049caffd56bf1e854ccfe40579a446553ba5f53120000000000000000000000000000000000000000000000000001c6bf5263400000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -5952,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec3400000000000000000000000006d74a139d0181056baae5bb64db44e15e74ccbd00000000000000000000000006d74a139d0181056baae5bb64db44e15e74ccbd0000000000000000000000000000000000000000000000000021bb2d6e6cd40000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -5954,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec34000000000000000000000000b2206efd4292d7722856670c7acfc8c5a36fbb8c000000000000000000000000b2206efd4292d7722856670c7acfc8c5a36fbb8c00000000000000000000000000000000000000000000000000005af3107a400000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -5955,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec340000000000000000000000006291a2710471c6689b22acf546cc8c7379011ad00000000000000000000000006291a2710471c6689b22acf546cc8c7379011ad000000000000000000000000000000000000000000000000000b1a2bc2ec5000000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -5956,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec34000000000000000000000000325a250b27c689717327997de95e0d71303729b0000000000000000000000000325a250b27c689717327997de95e0d71303729b000000000000000000000000000000000000000000000000000005af3107a400000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -5957,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec34000000000000000000000000d5a99d45458fcd9bad227d94190fad98157c565d000000000000000000000000d5a99d45458fcd9bad227d94190fad98157c565d00000000000000000000000000000000000000000000000000005af3107a400000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -5958,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec340000000000000000000000008ed64b84c54763d4ea9ffd645431176e1471034d0000000000000000000000008ed64b84c54763d4ea9ffd645431176e1471034d00000000000000000000000000000000000000000000000000005af3107a400000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -5959,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec34000000000000000000000000b5b41c5b4bf57c4fbe4fb638b1106e00b9210b79000000000000000000000000b5b41c5b4bf57c4fbe4fb638b1106e00b9210b7900000000000000000000000000000000000000000000000000005af3107a400000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -5960,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec3400000000000000000000000006d71e7ea3a5b4a2f0760a06d0b393a29b4ace7e00000000000000000000000006d71e7ea3a5b4a2f0760a06d0b393a29b4ace7e0000000000000000000000000000000000000000000000000000b5e620f4800000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -5961,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec340000000000000000000000008a878215d4cf364777b75b4e35ed8e004fdcde1f0000000000000000000000008a878215d4cf364777b75b4e35ed8e004fdcde1f0000000000000000000000000000000000000000000000000000b5e620f4800000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -5962,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec34000000000000000000000000410d9cbadd36333d98c2391bc6525f1724d53949000000000000000000000000410d9cbadd36333d98c2391bc6525f1724d53949000000000000000000000000000000000000000000000000002d010feed42fc000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -5963,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec340000000000000000000000005b82b8a947c5e4c4a5d2a9ca659712d92394135c0000000000000000000000005b82b8a947c5e4c4a5d2a9ca659712d92394135c0000000000000000000000000000000000000000000000000000b5e620f4800000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -5964,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec3400000000000000000000000014f0b038c7d8487a40d05da17d7e0c412b9e712e00000000000000000000000014f0b038c7d8487a40d05da17d7e0c412b9e712e0000000000000000000000000000000000000000000000000000b5e620f4800000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -5965,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec34000000000000000000000000ffd70adf0fc48fc2f0e3866ef02f893794588d0f000000000000000000000000ffd70adf0fc48fc2f0e3866ef02f893794588d0f00000000000000000000000000000000000000000000000000805bbf5222998700000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -5966,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec340000000000000000000000008c9082b3eccbbb7a83a1d54317735f126bf990170000000000000000000000008c9082b3eccbbb7a83a1d54317735f126bf990170000000000000000000000000000000000000000000000000000b5e620f4800000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -5967,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec34000000000000000000000000e0678aff40449aa5d26292558846da4b5e745bfd000000000000000000000000e0678aff40449aa5d26292558846da4b5e745bfd00000000000000000000000000000000000000000000000000005af3107a400000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -5968,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec34000000000000000000000000c6bc3639127cac8e38cefc1670109d8fedfd1ac0000000000000000000000000c6bc3639127cac8e38cefc1670109d8fedfd1ac000000000000000000000000000000000000000000000000000005af3107a400000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -5969,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec340000000000000000000000001ba2fc93c2306110c6cedc576e7e150c0d32f67b0000000000000000000000001ba2fc93c2306110c6cedc576e7e150c0d32f67b00000000000000000000000000000000000000000000000000005af3107a400000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -5970,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec34000000000000000000000000be0c773fa345a04f1570fda6859cf6500e437dc6000000000000000000000000be0c773fa345a04f1570fda6859cf6500e437dc600000000000000000000000000000000000000000000000000038d7ea4c6800000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -5971,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec3400000000000000000000000023a88b6fcb58dbc37d415e654384d9bf7a51a50800000000000000000000000023a88b6fcb58dbc37d415e654384d9bf7a51a5080000000000000000000000000000000000000000000000000000b5e620f4800000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -5972,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec34000000000000000000000000989111660f5c0872ad46881d56267c186782db22000000000000000000000000989111660f5c0872ad46881d56267c186782db2200000000000000000000000000000000000000000000000000038d7ea4c6800000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -5973,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec34000000000000000000000000a738b833927a7ac96e05aa27aa49c5ded511f345000000000000000000000000a738b833927a7ac96e05aa27aa49c5ded511f34500000000000000000000000000000000000000000000000000038d7ea4c6800000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -5974,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec3400000000000000000000000045d036d3a342248eb2e3880d144079630cccba2800000000000000000000000045d036d3a342248eb2e3880d144079630cccba2800000000000000000000000000000000000000000000000000038d7ea4c6800000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -5975,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec34000000000000000000000000bf0b8850992a8ebd82b2247d9c5d296f26add866000000000000000000000000bf0b8850992a8ebd82b2247d9c5d296f26add86600000000000000000000000000000000000000000000000000005af3107a400000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -5976,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec340000000000000000000000008ce6d8964996007feab7d718264a0a31791bcc020000000000000000000000008ce6d8964996007feab7d718264a0a31791bcc0200000000000000000000000000000000000000000000000000005af3107a400000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -5978,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec34000000000000000000000000215b32d9c41b217328b9a185fb68e82a43afa3d0000000000000000000000000215b32d9c41b217328b9a185fb68e82a43afa3d000000000000000000000000000000000000000000000000000005af3107a400000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -5979,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec340000000000000000000000008cf6eb2048d61f1d36e33331a20110c42cded27f0000000000000000000000008cf6eb2048d61f1d36e33331a20110c42cded27f00000000000000000000000000000000000000000000000000005af3107a400000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -5980,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec340000000000000000000000006e796b8b4d0646e7d2717840372020a431b738410000000000000000000000006e796b8b4d0646e7d2717840372020a431b7384100000000000000000000000000000000000000000000000000005af3107a400000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -5981,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec3400000000000000000000000065a3c7d35b7deb7a76000b9e6118b4ce8a6ce99000000000000000000000000065a3c7d35b7deb7a76000b9e6118b4ce8a6ce9900000000000000000000000000000000000000000000000000005543df729c00000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -5982,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec3400000000000000000000000093af239db06c41adea389ab30b3b6a9e69d34a8f00000000000000000000000093af239db06c41adea389ab30b3b6a9e69d34a8f00000000000000000000000000000000000000000000000000005af3107a400000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -5983,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec34000000000000000000000000ecf30ad77bc17ca2959cadbbf23f791da44c3ca3000000000000000000000000ecf30ad77bc17ca2959cadbbf23f791da44c3ca30000000000000000000000000000000000000000000000000002d79883d2000000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -5984,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec340000000000000000000000007e29d74db1f1147cc3717102e64f6e7cfa66c7430000000000000000000000007e29d74db1f1147cc3717102e64f6e7cfa66c74300000000000000000000000000000000000000000000000000038d7ea4c6800000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -5985,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec34000000000000000000000000347cc2875d007d2ffd5ccfd2f700538fbb66a0d0000000000000000000000000347cc2875d007d2ffd5ccfd2f700538fbb66a0d00000000000000000000000000000000000000000000000000002d79883d2000000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -5986,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec34000000000000000000000000422a4fa6b254f24718d79bd6f86f6315cf50d139000000000000000000000000422a4fa6b254f24718d79bd6f86f6315cf50d13900000000000000000000000000000000000000000000000000005af3107a400000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -5988,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec3400000000000000000000000010d456618cd9ad73e0bbfe060d9b6c92e54b858e00000000000000000000000010d456618cd9ad73e0bbfe060d9b6c92e54b858e00000000000000000000000000000000000000000000000000005af3107a400000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -5989,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec34000000000000000000000000de0d201cffb9e692ef999bed8aefee0dcc7b2cb4000000000000000000000000de0d201cffb9e692ef999bed8aefee0dcc7b2cb40000000000000000000000000000000000000000000000000081277a09edf8a100000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -5990,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec340000000000000000000000001f26286c4b6c7edbeb055405fe653a2c5cec27ae0000000000000000000000001f26286c4b6c7edbeb055405fe653a2c5cec27ae00000000000000000000000000000000000000000000000000005af3107a400000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -5991,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec34000000000000000000000000804d91166fd352e5712482dd1f5c5c329c4d64a8000000000000000000000000804d91166fd352e5712482dd1f5c5c329c4d64a80000000000000000000000000000000000000000000000000001c6bf5263400000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -5992,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec34000000000000000000000000a0f0a3f1d464119592504540ca9893f1ecc11539000000000000000000000000a0f0a3f1d464119592504540ca9893f1ecc11539000000000000000000000000000000000000000000000000000e35fa931a000000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -5993,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec3400000000000000000000000092c5d762103ddfca8d2ded96dd503317873afb1e00000000000000000000000092c5d762103ddfca8d2ded96dd503317873afb1e00000000000000000000000000000000000000000000000000005af3107a400000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -5994,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec340000000000000000000000006111bfff26b60a5b45a2693db6fef1a52897f84c0000000000000000000000006111bfff26b60a5b45a2693db6fef1a52897f84c00000000000000000000000000000000000000000000000000027ca57357c00000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -5995,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec34000000000000000000000000316e0ba8105e8bbf53a9549ceff8cc36f8761e75000000000000000000000000316e0ba8105e8bbf53a9549ceff8cc36f8761e7500000000000000000000000000000000000000000000000000005af3107a400000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -5997,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec34000000000000000000000000a618250db48aca188d44d3827ed627166a2f7be1000000000000000000000000a618250db48aca188d44d3827ed627166a2f7be100000000000000000000000000000000000000000000000000005af3107a400000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -5998,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec340000000000000000000000009efbebcc6e7284d8e97a3ccd06d735d25391a9b10000000000000000000000009efbebcc6e7284d8e97a3ccd06d735d25391a9b100000000000000000000000000000000000000000000000002390c216e8f067000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -6000,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec340000000000000000000000007b2798b32b5006641265f86c823d4938cad329070000000000000000000000007b2798b32b5006641265f86c823d4938cad3290700000000000000000000000000000000000000000000000000005af3107a400000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -6001,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec34000000000000000000000000f92305d31299a049387e78992961cffbad0315b5000000000000000000000000f92305d31299a049387e78992961cffbad0315b500000000000000000000000000000000000000000000000000005af3107a400000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -6002,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec3400000000000000000000000020ff9ae90bd2751559bdc01bf425cc395831d09100000000000000000000000020ff9ae90bd2751559bdc01bf425cc395831d091000000000000000000000000000000000000000000000000001550f7dca7000000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -6003,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec34000000000000000000000000239f09dfa18d501cbd283237f3985c04047b7a57000000000000000000000000239f09dfa18d501cbd283237f3985c04047b7a57000000000000000000000000000000000000000000000000083361c02feb308000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,0x73837927bca29223e9527991ff947f94b48bd6f7e2939dc77cfdcc2b110c662f,2022-04-28 09:49:33.000 UTC,0,true -6004,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec34000000000000000000000000860ecd7df22ec9c7d8535fd9e59faae93b20bb9a000000000000000000000000860ecd7df22ec9c7d8535fd9e59faae93b20bb9a00000000000000000000000000000000000000000000000000a66e480ee9c92300000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -6005,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec34000000000000000000000000c80651d6ddd6d35b380d1c9e7d56d25e400163a4000000000000000000000000c80651d6ddd6d35b380d1c9e7d56d25e400163a400000000000000000000000000000000000000000000000000005af3107a400000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -6006,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec340000000000000000000000004e7243c2681857f05891be7e91a6049402dd74060000000000000000000000004e7243c2681857f05891be7e91a6049402dd740600000000000000000000000000000000000000000000000000038d7ea4c6800000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -6007,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec3400000000000000000000000084a1830b4ca5c9ec317a380756cf3fd9ea9889f700000000000000000000000084a1830b4ca5c9ec317a380756cf3fd9ea9889f700000000000000000000000000000000000000000000000000005af3107a400000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -6008,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec340000000000000000000000005cf60c4bd43defd4e62096e7a82f615b4fe156840000000000000000000000005cf60c4bd43defd4e62096e7a82f615b4fe1568400000000000000000000000000000000000000000000000000005af3107a400000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -6009,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec3400000000000000000000000053c0e301d886723f7e76ca2db4b9fd673ff690ab00000000000000000000000053c0e301d886723f7e76ca2db4b9fd673ff690ab00000000000000000000000000000000000000000000000000005af3107a400000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -6010,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec340000000000000000000000001a8d1e6a7af3ff1b85f5056af6aed9caa5a670840000000000000000000000001a8d1e6a7af3ff1b85f5056af6aed9caa5a6708400000000000000000000000000000000000000000000000000005af3107a400000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -6012,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec340000000000000000000000003f35f15297404e21d832232cca28933dc1ff75bb0000000000000000000000003f35f15297404e21d832232cca28933dc1ff75bb00000000000000000000000000000000000000000000000000005af3107a400000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -6013,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec340000000000000000000000002c14eaa5467971a22a8d0198f6319595055208c80000000000000000000000002c14eaa5467971a22a8d0198f6319595055208c800000000000000000000000000000000000000000000000000005af3107a400000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -6014,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec34000000000000000000000000100ceb2adcfdbd339a2926ea670298a91ee3d501000000000000000000000000100ceb2adcfdbd339a2926ea670298a91ee3d501000000000000000000000000000000000000000000000000010a741a4627800000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -6015,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0xa9f9e675000000000000000000000000dac17f958d2ee523a2206206994597c13d831ec700000000000000000000000094b008aa00579c1307b0ef2c499ad98a8ce58e58000000000000000000000000d6d085f6b641799f70e0446fa96c828d66b1bc1d000000000000000000000000d6d085f6b641799f70e0446fa96c828d66b1bc1d0000000000000000000000000000000000000000000000000000000002f6b2da00000000000000000000000000000000000000000000000000000000000000c00000000000000000000000000000000000000000000000000000000000000000,,,1,true -6017,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec34000000000000000000000000d6d085f6b641799f70e0446fa96c828d66b1bc1d000000000000000000000000d6d085f6b641799f70e0446fa96c828d66b1bc1d0000000000000000000000000000000000000000000000000035b6219134d70000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -6019,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec3400000000000000000000000073da2ab610c2e570740ec6e6aeb857b22240227000000000000000000000000073da2ab610c2e570740ec6e6aeb857b2224022700000000000000000000000000000000000000000000000000036ceeccdf7194000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,0xe59037c08ab16d1757f0f85617051c227a744e969f18cedcc4bf7b61cc4113c7,2022-03-12 06:40:03.000 UTC,0,true -6020,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec3400000000000000000000000088a3dd4a42cb8f0655e0807b99969fcf45a2f9f700000000000000000000000088a3dd4a42cb8f0655e0807b99969fcf45a2f9f700000000000000000000000000000000000000000000000000a30ca23cb262b500000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -6023,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec34000000000000000000000000aaaca4aae53881cca5f86b9b46f5b04e9ae3b0f2000000000000000000000000aaaca4aae53881cca5f86b9b46f5b04e9ae3b0f2000000000000000000000000000000000000000000000000002386f26fc1000000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -6024,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec340000000000000000000000007e3d993a8d63c25d1db5f7ff8a8d6c59091003b10000000000000000000000007e3d993a8d63c25d1db5f7ff8a8d6c59091003b1000000000000000000000000000000000000000000000000029fb0b4300d0aff00000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -6025,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec34000000000000000000000000be13517a2b520b2449068d2ec45280992b04047b000000000000000000000000be13517a2b520b2449068d2ec45280992b04047b000000000000000000000000000000000000000000000000007dd601852ed8a400000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -6026,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec340000000000000000000000002db35527a753850b4396367a03fa834d13a32f100000000000000000000000002db35527a753850b4396367a03fa834d13a32f10000000000000000000000000000000000000000000000000000a747dcc27c90000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -6027,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec34000000000000000000000000da1cb7ea9b5ee288bce3bb4cac2b6642c5421411000000000000000000000000da1cb7ea9b5ee288bce3bb4cac2b6642c5421411000000000000000000000000000000000000000000000000001f0bbd8db1e20000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -6028,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec34000000000000000000000000d3784cfaf0471b99f37c339db3d302e8a13b1a7a000000000000000000000000d3784cfaf0471b99f37c339db3d302e8a13b1a7a00000000000000000000000000000000000000000000000000a51beaf8f1d45200000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -6029,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec34000000000000000000000000ce788cacc9211fa93af8747d6c652fb425280d72000000000000000000000000ce788cacc9211fa93af8747d6c652fb425280d72000000000000000000000000000000000000000000000000005d2ac67a8c578000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -6030,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec34000000000000000000000000b919a9fdf4d9f8f812ad64bd8599850e9f810e2c000000000000000000000000b919a9fdf4d9f8f812ad64bd8599850e9f810e2c000000000000000000000000000000000000000000000000003e61535f69a6c000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -6032,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec3400000000000000000000000098f82578da11c79c95459a26fb27baa3ca7f906a00000000000000000000000098f82578da11c79c95459a26fb27baa3ca7f906a00000000000000000000000000000000000000000000000000038d7ea4c6800000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -6035,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec34000000000000000000000000c9d4f265d008b0fc42829e80dcf3d5f14835d0b4000000000000000000000000c9d4f265d008b0fc42829e80dcf3d5f14835d0b40000000000000000000000000000000000000000000000000039f6c353d8c44b00000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -6037,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec340000000000000000000000009458c4ad1c97e9f26315a8c904175db628ff9f930000000000000000000000009458c4ad1c97e9f26315a8c904175db628ff9f93000000000000000000000000000000000000000000000000000aa87bee53800000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -6038,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec34000000000000000000000000837550f148ebf3e7de481f8778582c429f1e8274000000000000000000000000837550f148ebf3e7de481f8778582c429f1e8274000000000000000000000000000000000000000000000000000aa87bee53800000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -6039,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec34000000000000000000000000716ae766ee5c3590b516f2da5921540044fcdd93000000000000000000000000716ae766ee5c3590b516f2da5921540044fcdd93000000000000000000000000000000000000000000000000003d1cf622b4ab8700000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -6042,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec3400000000000000000000000054b7f8fe8d3aaeeb115d2ae1ac9ea5d6b824e2dc00000000000000000000000054b7f8fe8d3aaeeb115d2ae1ac9ea5d6b824e2dc000000000000000000000000000000000000000000000000003da48c1309d78d00000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -6044,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec34000000000000000000000000f198c77d9c968840995e0172a003388d4aa02352000000000000000000000000f198c77d9c968840995e0172a003388d4aa023520000000000000000000000000000000000000000000000000001c6bf5263400000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -6046,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec340000000000000000000000007f7bac92aa3e28351f9e89535ca334e8a44542d00000000000000000000000007f7bac92aa3e28351f9e89535ca334e8a44542d000000000000000000000000000000000000000000000000000038d7ea4c6800000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -6047,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec340000000000000000000000007a38b009f9e176f07978c2e75bab2a5b657ca37a0000000000000000000000007a38b009f9e176f07978c2e75bab2a5b657ca37a00000000000000000000000000000000000000000000000000000000006acfc000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -6049,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec34000000000000000000000000f830a902a162874c946bf9e9b11e1388caee3029000000000000000000000000f830a902a162874c946bf9e9b11e1388caee302900000000000000000000000000000000000000000000000000354a6ba7a1800000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -6051,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec34000000000000000000000000e220bfb0d093e2b1fdc7d3af08c97f5b22f7f908000000000000000000000000e220bfb0d093e2b1fdc7d3af08c97f5b22f7f908000000000000000000000000000000000000000000000000001cab25204daf0000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -6052,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec34000000000000000000000000acc452a494b59a3f536d717f6222d09c5acf20a8000000000000000000000000acc452a494b59a3f536d717f6222d09c5acf20a8000000000000000000000000000000000000000000000000008d3438f6e5930e00000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -6053,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec34000000000000000000000000d16ef7f37544a3792463a44d0557eab4c21d89a1000000000000000000000000d16ef7f37544a3792463a44d0557eab4c21d89a10000000000000000000000000000000000000000000000000001de405f21460000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -6054,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec34000000000000000000000000a2bf6ac67aee061297775043ccd9b613e53413a5000000000000000000000000a2bf6ac67aee061297775043ccd9b613e53413a5000000000000000000000000000000000000000000000000015396a49d67732a00000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -6055,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec34000000000000000000000000d89fb7b2953670b03c28f81c77658191b6036c91000000000000000000000000d89fb7b2953670b03c28f81c77658191b6036c9100000000000000000000000000000000000000000000000000005af3107a400000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -6056,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec340000000000000000000000009b5f0ceaa46a28dcefa619e14a3536fbd6296f270000000000000000000000009b5f0ceaa46a28dcefa619e14a3536fbd6296f2700000000000000000000000000000000000000000000000000038d7ea4c6800000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -6057,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec3400000000000000000000000000f3a2fc40c421a320d235e70543a06620e50b5400000000000000000000000000f3a2fc40c421a320d235e70543a06620e50b5400000000000000000000000000000000000000000000000000005af3107a400000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -6058,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec34000000000000000000000000da5c938837e5cd21c8e37a2811bb9bda6515955c000000000000000000000000da5c938837e5cd21c8e37a2811bb9bda6515955c00000000000000000000000000000000000000000000000000005af3107a400000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -6059,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec34000000000000000000000000505d2d3979f41ac084851a89b2ef154a65dd8a0f000000000000000000000000505d2d3979f41ac084851a89b2ef154a65dd8a0f00000000000000000000000000000000000000000000000000005af3107a400000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -6060,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec34000000000000000000000000df60be630e94a957b5f4033c7def69e1c4554bb6000000000000000000000000df60be630e94a957b5f4033c7def69e1c4554bb6000000000000000000000000000000000000000000000000016345785d8a000000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -6061,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec3400000000000000000000000038e75b73c046372b353c9b4bb3e11ca6f6e7515800000000000000000000000038e75b73c046372b353c9b4bb3e11ca6f6e7515800000000000000000000000000000000000000000000000000005af3107a400000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -6062,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec340000000000000000000000003ffdf260bb7dbeac048c593166260a960bf71b7a0000000000000000000000003ffdf260bb7dbeac048c593166260a960bf71b7a00000000000000000000000000000000000000000000000000005af3107a400000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -6063,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec34000000000000000000000000ae966d3bf115eb480ee121dc20dc2b7e8326911d000000000000000000000000ae966d3bf115eb480ee121dc20dc2b7e8326911d00000000000000000000000000000000000000000000000000005af3107a400000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -6064,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec34000000000000000000000000535a625fd19e7dafa1bd07f60576f780e50711e0000000000000000000000000535a625fd19e7dafa1bd07f60576f780e50711e000000000000000000000000000000000000000000000000000005af3107a400000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -6065,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec340000000000000000000000006177da08f66984b7e116d9f2079b98c5fe6f507e0000000000000000000000006177da08f66984b7e116d9f2079b98c5fe6f507e00000000000000000000000000000000000000000000000000005af3107a400000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -6066,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec34000000000000000000000000550305bd6b572fef436002aad6fb5fdec9f3e8b2000000000000000000000000550305bd6b572fef436002aad6fb5fdec9f3e8b200000000000000000000000000000000000000000000000000005af3107a400000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -6067,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec34000000000000000000000000b3ef731cee95b989fafcf3ee2949dbaa8bd04f3f000000000000000000000000b3ef731cee95b989fafcf3ee2949dbaa8bd04f3f00000000000000000000000000000000000000000000000000005af3107a400000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -6068,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec34000000000000000000000000bec87160d56dd6d3c41c56613088e0559fabb689000000000000000000000000bec87160d56dd6d3c41c56613088e0559fabb68900000000000000000000000000000000000000000000000000005af3107a400000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -6069,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec34000000000000000000000000e8f1091949750d217e8fb7aab56269e6595e27e9000000000000000000000000e8f1091949750d217e8fb7aab56269e6595e27e9000000000000000000000000000000000000000000000000005802b8233a3f4900000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -6070,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec34000000000000000000000000a169d8ad32ce1a54c456b446e182aac42420b9d2000000000000000000000000a169d8ad32ce1a54c456b446e182aac42420b9d200000000000000000000000000000000000000000000000000005af3107a400000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -6071,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec34000000000000000000000000ea5e21ef5ff21d7cb4c83df80620226e19f6cf08000000000000000000000000ea5e21ef5ff21d7cb4c83df80620226e19f6cf0800000000000000000000000000000000000000000000000000005af3107a400000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -6072,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec3400000000000000000000000097310815e5fe521d95428ff81034ca1000144cfd00000000000000000000000097310815e5fe521d95428ff81034ca1000144cfd00000000000000000000000000000000000000000000000000005af3107a400000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -6073,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec34000000000000000000000000a0fdf298d1be0cc74cf50d4be0d2289ce3a6f713000000000000000000000000a0fdf298d1be0cc74cf50d4be0d2289ce3a6f71300000000000000000000000000000000000000000000000000005af3107a400000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -6074,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec34000000000000000000000000ef5c351763eeb26c2be15d6d649c3bffa5b2e62e000000000000000000000000ef5c351763eeb26c2be15d6d649c3bffa5b2e62e00000000000000000000000000000000000000000000000000005af3107a400000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -6075,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec340000000000000000000000006d0a78bca674769691690edb78890ddd3ac787800000000000000000000000006d0a78bca674769691690edb78890ddd3ac7878000000000000000000000000000000000000000000000000000005af3107a400000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -6076,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec34000000000000000000000000e8a17e27c663954a6b13102dbf1d6e8be11f2a1e000000000000000000000000e8a17e27c663954a6b13102dbf1d6e8be11f2a1e00000000000000000000000000000000000000000000000000005af3107a400000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -6077,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec34000000000000000000000000de1fa30568693e95411d978f50d61d95583cc41c000000000000000000000000de1fa30568693e95411d978f50d61d95583cc41c00000000000000000000000000000000000000000000000000005af3107a400000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -6078,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec340000000000000000000000001c7004540ad0735906fc803f4d4fad1a1dbd264b0000000000000000000000001c7004540ad0735906fc803f4d4fad1a1dbd264b00000000000000000000000000000000000000000000000000005af3107a400000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -6079,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec340000000000000000000000007b1e1e51b869d5c3098314708243fe6a70e0b73b0000000000000000000000007b1e1e51b869d5c3098314708243fe6a70e0b73b00000000000000000000000000000000000000000000000000005af3107a400000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -6080,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec34000000000000000000000000ab881a681a63d6da7eddbea7008355780f84cbcc000000000000000000000000ab881a681a63d6da7eddbea7008355780f84cbcc000000000000000000000000000000000000000000000000000009184e72a00000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -6081,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec3400000000000000000000000072418814ddece4a58be3a8c772b817c5d0985bab00000000000000000000000072418814ddece4a58be3a8c772b817c5d0985bab00000000000000000000000000000000000000000000000000005af3107a400000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -6082,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec34000000000000000000000000dc518a752f63e70ae1d902359c627fc3b16eabf4000000000000000000000000dc518a752f63e70ae1d902359c627fc3b16eabf400000000000000000000000000000000000000000000000000005af3107a400000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -6083,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec34000000000000000000000000fdbb828d024bca418e7d381f4a51b17943f3ff0f000000000000000000000000fdbb828d024bca418e7d381f4a51b17943f3ff0f00000000000000000000000000000000000000000000000000005af3107a400000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -6084,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec3400000000000000000000000042ade5caf115cca078731afb4e74da068db7546a00000000000000000000000042ade5caf115cca078731afb4e74da068db7546a00000000000000000000000000000000000000000000000000a639bd2a06204700000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -6085,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec3400000000000000000000000023ac809fab9fcd6845150bb5b60836b0f37b2be300000000000000000000000023ac809fab9fcd6845150bb5b60836b0f37b2be300000000000000000000000000000000000000000000000000005af3107a400000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -6086,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec34000000000000000000000000f2906419014f9bc87a0bad857630716a22e821a1000000000000000000000000f2906419014f9bc87a0bad857630716a22e821a100000000000000000000000000000000000000000000000000005af3107a400000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -6087,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec3400000000000000000000000034316123517658e803efaa1d01e6c943bfd54a5200000000000000000000000034316123517658e803efaa1d01e6c943bfd54a5200000000000000000000000000000000000000000000000000005af3107a400000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -6088,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec3400000000000000000000000019563a18135447a1227a415f2464329b76095c2100000000000000000000000019563a18135447a1227a415f2464329b76095c2100000000000000000000000000000000000000000000000000005af3107a400000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -6089,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec34000000000000000000000000d696bb2a273469e81db818eedf3e55020a69fe49000000000000000000000000d696bb2a273469e81db818eedf3e55020a69fe4900000000000000000000000000000000000000000000000000005af3107a400000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -6090,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec34000000000000000000000000abd91342f65fdf85b2803eb2b26b0c5a849ec204000000000000000000000000abd91342f65fdf85b2803eb2b26b0c5a849ec20400000000000000000000000000000000000000000000000000005af3107a400000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -6091,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec340000000000000000000000009f5ba92a3f6cd97151be5091add73fb87ebd40650000000000000000000000009f5ba92a3f6cd97151be5091add73fb87ebd406500000000000000000000000000000000000000000000000000005af3107a400000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -6092,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec34000000000000000000000000d3e543f609321e0ecac4e60a322bc833402bccf0000000000000000000000000d3e543f609321e0ecac4e60a322bc833402bccf000000000000000000000000000000000000000000000000000005af3107a400000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -6093,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec34000000000000000000000000d5350d0cfc2947655b08386ae6a257428df6e7b6000000000000000000000000d5350d0cfc2947655b08386ae6a257428df6e7b600000000000000000000000000000000000000000000000000005af3107a400000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -6094,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec34000000000000000000000000102d8693ae4f47366b50218e1e6a4752c90a1356000000000000000000000000102d8693ae4f47366b50218e1e6a4752c90a135600000000000000000000000000000000000000000000000000005af3107a400000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -6095,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec34000000000000000000000000c4d43e87d85fec5339e8517fb677b6884c8895c4000000000000000000000000c4d43e87d85fec5339e8517fb677b6884c8895c400000000000000000000000000000000000000000000000000005af3107a400000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -6096,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec34000000000000000000000000ddacf2b28b3c5f08c9e638bc0c28f1e3d0dde6de000000000000000000000000ddacf2b28b3c5f08c9e638bc0c28f1e3d0dde6de00000000000000000000000000000000000000000000000000005af3107a400000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -6097,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec34000000000000000000000000e55b4c05d74d84931a513f3c7b37d609a487c0ea000000000000000000000000e55b4c05d74d84931a513f3c7b37d609a487c0ea0000000000000000000000000000000000000000000000000001c6bf5263400000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -6098,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec34000000000000000000000000265c7ee6c12d5450cf883a8c1d448d5862dd52af000000000000000000000000265c7ee6c12d5450cf883a8c1d448d5862dd52af000000000000000000000000000000000000000000000000005d8d5c28d6173d00000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -6099,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec340000000000000000000000008bb0dbb962e6add906c6fbf8d30620a757074a650000000000000000000000008bb0dbb962e6add906c6fbf8d30620a757074a6500000000000000000000000000000000000000000000000000005af3107a400000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -6100,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec34000000000000000000000000874f15934503cad67c145bed096e03966b2639e6000000000000000000000000874f15934503cad67c145bed096e03966b2639e600000000000000000000000000000000000000000000000000005af3107a400000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -6101,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec34000000000000000000000000e5126ae26d383d2bf95315ae952aa78127b8ac7f000000000000000000000000e5126ae26d383d2bf95315ae952aa78127b8ac7f000000000000000000000000000000000000000000000000004adda27681328d00000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -6102,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec340000000000000000000000007412e63420f327482b0513fb63b8c7ffc04d7a400000000000000000000000007412e63420f327482b0513fb63b8c7ffc04d7a4000000000000000000000000000000000000000000000000000005af3107a400000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -6103,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec3400000000000000000000000033a081ac356765e4f084772d4490890567015a8900000000000000000000000033a081ac356765e4f084772d4490890567015a8900000000000000000000000000000000000000000000000000005af3107a400000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -6104,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec3400000000000000000000000092cc1672390d00636e107d190222a530b266c41e00000000000000000000000092cc1672390d00636e107d190222a530b266c41e0000000000000000000000000000000000000000000000000001c6bf5263400000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -6105,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec34000000000000000000000000bf61155471f6f338b282c3ec5e65e4f5eeee8354000000000000000000000000bf61155471f6f338b282c3ec5e65e4f5eeee835400000000000000000000000000000000000000000000000000005af3107a400000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -6106,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec34000000000000000000000000bba6cd8b55cb2952bb24a987686aa74d2d27d633000000000000000000000000bba6cd8b55cb2952bb24a987686aa74d2d27d63300000000000000000000000000000000000000000000000000005af3107a400000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -6107,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec340000000000000000000000000ed63aaad9f9e4aec77b06858e2ccb1afadc2d340000000000000000000000000ed63aaad9f9e4aec77b06858e2ccb1afadc2d3400000000000000000000000000000000000000000000000000ab4a21e9a8010000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -6108,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec34000000000000000000000000e401b9bcab9929b0aaabf0ec0d189122084ecf58000000000000000000000000e401b9bcab9929b0aaabf0ec0d189122084ecf580000000000000000000000000000000000000000000000000001794a6c866b0000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -6109,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec3400000000000000000000000027099c76408a157c934a1d41e98ec545f5d1d77b00000000000000000000000027099c76408a157c934a1d41e98ec545f5d1d77b00000000000000000000000000000000000000000000000000017777ce9a7aab00000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -6111,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec3400000000000000000000000065f4ab2661a4e5c8f5c37e121819db86ee93b2cd00000000000000000000000065f4ab2661a4e5c8f5c37e121819db86ee93b2cd0000000000000000000000000000000000000000000000000001c6bf5263400000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -6112,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec340000000000000000000000008e70d82324cf51b204a875f72a4648c03694043f0000000000000000000000008e70d82324cf51b204a875f72a4648c03694043f0000000000000000000000000000000000000000000000000001ede9b71cee0000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -6114,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec34000000000000000000000000a31723b2e0bdfe317f4e07589436ecf5515622d2000000000000000000000000a31723b2e0bdfe317f4e07589436ecf5515622d20000000000000000000000000000000000000000000000000001c6bf5263400000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -6115,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec340000000000000000000000005c6d446d4b7ff3a5bd4cfa8b91e2fcdb9af984f90000000000000000000000005c6d446d4b7ff3a5bd4cfa8b91e2fcdb9af984f90000000000000000000000000000000000000000000000000001fc74ad620a0000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -6116,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec34000000000000000000000000754501440645e89d8a06dd698ad55fadd0b4a556000000000000000000000000754501440645e89d8a06dd698ad55fadd0b4a5560000000000000000000000000000000000000000000000000001c6bf5263400000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -6117,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec34000000000000000000000000e2c67e0b55f80738ad264c1a973929362dee3213000000000000000000000000e2c67e0b55f80738ad264c1a973929362dee32130000000000000000000000000000000000000000000000000002c9741f4dc10000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -6118,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec3400000000000000000000000057ade2bed67c61f01176997a2c87c8eb8e4ddd4c00000000000000000000000057ade2bed67c61f01176997a2c87c8eb8e4ddd4c0000000000000000000000000000000000000000000000000002dd96fe23990000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -6119,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec3400000000000000000000000087db5fff1928edfaa0dcdf531e821e28721b3f1c00000000000000000000000087db5fff1928edfaa0dcdf531e821e28721b3f1c000000000000000000000000000000000000000000000000002386f26fc1000000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -6120,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec34000000000000000000000000aae53a6ead2a4c07e34e49f1e658152355450d7f000000000000000000000000aae53a6ead2a4c07e34e49f1e658152355450d7f0000000000000000000000000000000000000000000000000001c6bf5263400000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -6121,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec34000000000000000000000000be6b0ef7b49e4bb39a44ed4c629c559c229a6b05000000000000000000000000be6b0ef7b49e4bb39a44ed4c629c559c229a6b050000000000000000000000000000000000000000000000000002dd96fe23990000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -6122,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec34000000000000000000000000259e397108514b8a2cc910429590a17ceb14f772000000000000000000000000259e397108514b8a2cc910429590a17ceb14f772000000000000000000000000000000000000000000000000000215111312120000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -6123,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec340000000000000000000000004acddeea281310d00756555e42be3802f9bf771e0000000000000000000000004acddeea281310d00756555e42be3802f9bf771e0000000000000000000000000000000000000000000000000001f4e799d1d90000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -6124,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec34000000000000000000000000070330e027a3e4327ba69f0c8a1885df4b545837000000000000000000000000070330e027a3e4327ba69f0c8a1885df4b54583700000000000000000000000000000000000000000000000000005af3107a400000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -6125,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec3400000000000000000000000023b31301bffdc9c7f55661a4db9c0a904d1eb62e00000000000000000000000023b31301bffdc9c7f55661a4db9c0a904d1eb62e0000000000000000000000000000000000000000000000000002e01b59fe540000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -6126,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec34000000000000000000000000301feaced087a254b09874551da70d4c58689f04000000000000000000000000301feaced087a254b09874551da70d4c58689f040000000000000000000000000000000000000000000000000001c6bf5263400000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -6127,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec3400000000000000000000000077edee3b888d9ce54df25b18a4badf9f6340d73300000000000000000000000077edee3b888d9ce54df25b18a4badf9f6340d73300000000000000000000000000000000000000000000000000005af3107a400000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -6128,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec340000000000000000000000006afd0cf9e929bf7c46b8b729233697bc226078880000000000000000000000006afd0cf9e929bf7c46b8b729233697bc2260788800000000000000000000000000000000000000000000000000005af3107a400000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -6129,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec340000000000000000000000006b75b8c39c3c42c9dee4b82363606cb28c3d0a2f0000000000000000000000006b75b8c39c3c42c9dee4b82363606cb28c3d0a2f0000000000000000000000000000000000000000000000000001c6bf5263400000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -6130,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec34000000000000000000000000131b76b9b89dd3d98147ec3b7e2cb73adf245133000000000000000000000000131b76b9b89dd3d98147ec3b7e2cb73adf24513300000000000000000000000000000000000000000000000000005af3107a400000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -6131,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec34000000000000000000000000db9718552f6b5a06422d7ce790a0f47241178753000000000000000000000000db9718552f6b5a06422d7ce790a0f4724117875300000000000000000000000000000000000000000000000000005af3107a400000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -6132,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec34000000000000000000000000576bf86b5e5f52632b98ac3bdb2a8291cdf79337000000000000000000000000576bf86b5e5f52632b98ac3bdb2a8291cdf793370000000000000000000000000000000000000000000000000001c6bf5263400000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -6135,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec340000000000000000000000006bd78ab5053a84cb285b81024fb10ea2c465b0450000000000000000000000006bd78ab5053a84cb285b81024fb10ea2c465b0450000000000000000000000000000000000000000000000000102a336dba6000000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -6136,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec34000000000000000000000000c0ad0a7a432e058733cd4819efb1e859bae49b68000000000000000000000000c0ad0a7a432e058733cd4819efb1e859bae49b68000000000000000000000000000000000000000000000000015d576bf398980000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -6137,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec3400000000000000000000000073ab8be850af291e989039bad78a65a32347286700000000000000000000000073ab8be850af291e989039bad78a65a3234728670000000000000000000000000000000000000000000000000001c6bf5263400000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -6138,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec34000000000000000000000000f3227760f77cd04dc27de314b02efd2850676b66000000000000000000000000f3227760f77cd04dc27de314b02efd2850676b66000000000000000000000000000000000000000000000000015e49a47c439e4000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -6139,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0xa9f9e675000000000000000000000000a0b86991c6218b36c1d19d4a2e9eb0ce3606eb480000000000000000000000007f5c764cbc14f9669b88837ca1490cca17c316070000000000000000000000001001ed634ff8b495479783a0620fdd71a6151b6c0000000000000000000000001001ed634ff8b495479783a0620fdd71a6151b6c000000000000000000000000000000000000000000000000000000000f4c0c6c00000000000000000000000000000000000000000000000000000000000000c00000000000000000000000000000000000000000000000000000000000000000,,,1,true -6140,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec34000000000000000000000000a6536a05bdbbcdaf352ad53382136ebe9d277eb5000000000000000000000000a6536a05bdbbcdaf352ad53382136ebe9d277eb50000000000000000000000000000000000000000000000000001c6bf5263400000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -6141,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec340000000000000000000000008de42a7b282832b84bfcf7c2e9edb882b99abaac0000000000000000000000008de42a7b282832b84bfcf7c2e9edb882b99abaac00000000000000000000000000000000000000000000000000005af3107a400000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -6142,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec34000000000000000000000000200d4376a05189581fc658c0ffdad4a56861331d000000000000000000000000200d4376a05189581fc658c0ffdad4a56861331d00000000000000000000000000000000000000000000000000bd4a7fa937ec8b00000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -6146,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec3400000000000000000000000028b4f08d1f1aa9bfe787447dcf75ff3fea1fd4d200000000000000000000000028b4f08d1f1aa9bfe787447dcf75ff3fea1fd4d20000000000000000000000000000000000000000000000000090851ef9cb3c9000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -6148,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec340000000000000000000000000cf7a503b76b63e8c8642f3bf6af64fffe1e8efb0000000000000000000000000cf7a503b76b63e8c8642f3bf6af64fffe1e8efb00000000000000000000000000000000000000000000000000038d7ea4c6800000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -6151,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec3400000000000000000000000005a71143c2cb2c26d0a94553534ee2059d275ad400000000000000000000000005a71143c2cb2c26d0a94553534ee2059d275ad40000000000000000000000000000000000000000000000000001c6bf5263400000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -6152,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec340000000000000000000000008613b7748af1126a07d522869cb48a9d0485fe310000000000000000000000008613b7748af1126a07d522869cb48a9d0485fe31000000000000000000000000000000000000000000000000002386f26fc1000000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -6153,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec34000000000000000000000000680e0e17a8998c5d3221f470706f0d20c66c6a7b000000000000000000000000680e0e17a8998c5d3221f470706f0d20c66c6a7b000000000000000000000000000000000000000000000000014b7db4e94fb01d00000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -6154,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec3400000000000000000000000061c33a73354e33e297948d60b3a83fd14b3ca21900000000000000000000000061c33a73354e33e297948d60b3a83fd14b3ca219000000000000000000000000000000000000000000000000003a8321cc8d7c5300000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -6156,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec34000000000000000000000000280b04d23618f2983b8008f8d4b796d1a37ecd21000000000000000000000000280b04d23618f2983b8008f8d4b796d1a37ecd2100000000000000000000000000000000000000000000000000038d7ea4c6800000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -6157,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec34000000000000000000000000489872f68bd0da1ca97383a97342f0e230c8f24f000000000000000000000000489872f68bd0da1ca97383a97342f0e230c8f24f00000000000000000000000000000000000000000000000002c28a7efb0a6d0000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -6158,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec3400000000000000000000000043769e73238a7cc8ad08fabc427620a5361ef19900000000000000000000000043769e73238a7cc8ad08fabc427620a5361ef199000000000000000000000000000000000000000000000000003f835535de6f0000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -6159,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec3400000000000000000000000075db933f690903730724498e1767bd7bbbf5a45c00000000000000000000000075db933f690903730724498e1767bd7bbbf5a45c000000000000000000000000000000000000000000000000009c35bf3ca1488400000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -6161,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec340000000000000000000000001d07ca009d9e507e780fd921d63c90c2bcd1052c0000000000000000000000001d07ca009d9e507e780fd921d63c90c2bcd1052c00000000000000000000000000000000000000000000000000005af3107a400000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -6162,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec340000000000000000000000008efcd8400655a9a0887368b13ec631e8bf0a7d540000000000000000000000008efcd8400655a9a0887368b13ec631e8bf0a7d540000000000000000000000000000000000000000000000000001c6bf5263400000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -6163,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec34000000000000000000000000c036c021402451242cd413a6a6b863ff41b8e6ac000000000000000000000000c036c021402451242cd413a6a6b863ff41b8e6ac00000000000000000000000000000000000000000000000000005af3107a400000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -6164,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec340000000000000000000000000f98490ed481611ae1945c62274a20480c8cdc400000000000000000000000000f98490ed481611ae1945c62274a20480c8cdc40000000000000000000000000000000000000000000000000008c2864635c488000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,0x5415e9b0b366662bbd8500692460bbf3aba81387e664839dc877bfd7a1672b1c,2021-12-11 12:51:43.000 UTC,0,true -6165,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec3400000000000000000000000035164610721ffab73d28e4a16e32607288946af400000000000000000000000035164610721ffab73d28e4a16e32607288946af40000000000000000000000000000000000000000000000000011ca63fd75a5c000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -6166,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec3400000000000000000000000056df4482739435c82d8129a98555ac93d1f3f52500000000000000000000000056df4482739435c82d8129a98555ac93d1f3f52500000000000000000000000000000000000000000000000000005af3107a400000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -6168,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec34000000000000000000000000c43cd6565c758ea8331ffd1fc40dd2eb685cdf40000000000000000000000000c43cd6565c758ea8331ffd1fc40dd2eb685cdf40000000000000000000000000000000000000000000000000015cdb872ddf870000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -6169,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec340000000000000000000000007bf37710f7139be98db50b2259051f84e41397f80000000000000000000000007bf37710f7139be98db50b2259051f84e41397f800000000000000000000000000000000000000000000000000005af3107a400000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -6171,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec340000000000000000000000004a4bdd1484b10c2b77da547bd8c58b05896d18930000000000000000000000004a4bdd1484b10c2b77da547bd8c58b05896d189300000000000000000000000000000000000000000000000000038d7ea4c6800000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -6172,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec340000000000000000000000006b60edeab595a8e908e12ee2c11e744883b2d61a0000000000000000000000006b60edeab595a8e908e12ee2c11e744883b2d61a00000000000000000000000000000000000000000000000000005af3107a400000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -6173,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec34000000000000000000000000827f2155e5d6cc98b176c0d6033cc08849e7a863000000000000000000000000827f2155e5d6cc98b176c0d6033cc08849e7a86300000000000000000000000000000000000000000000000000005af3107a400000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -6174,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec34000000000000000000000000495fc90677e398d70b5066f294337f164a996b52000000000000000000000000495fc90677e398d70b5066f294337f164a996b5200000000000000000000000000000000000000000000000000005af3107a400000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -6175,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec34000000000000000000000000a2460960451ec2482b2ee668c844d59aa7f2f7f1000000000000000000000000a2460960451ec2482b2ee668c844d59aa7f2f7f100000000000000000000000000000000000000000000000000005af3107a400000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -6176,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec34000000000000000000000000d42ad56aac4b4dd8a5173b440e511d66ef268b93000000000000000000000000d42ad56aac4b4dd8a5173b440e511d66ef268b93000000000000000000000000000000000000000000000000016345785d8a000000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -6177,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec340000000000000000000000005cf968f202abb9f97063c5ce1a0ed07ff2f3e6280000000000000000000000005cf968f202abb9f97063c5ce1a0ed07ff2f3e628000000000000000000000000000000000000000000000000000179b5479f971c00000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -6178,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec34000000000000000000000000d1ef5b3dffd39b3e40b9b6ccefcb1b9020c49348000000000000000000000000d1ef5b3dffd39b3e40b9b6ccefcb1b9020c49348000000000000000000000000000000000000000000000000006a94d74f43000000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,0x103d287f08f7487a6e59416c97ae80eb0999027818c090561a200a6e92d948a2,2022-09-11 09:39:19.000 UTC,0,true -6179,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec34000000000000000000000000ba09d569676f00a800144a557ce45729f9067bf7000000000000000000000000ba09d569676f00a800144a557ce45729f9067bf700000000000000000000000000000000000000000000000000038d7ea4c6800000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -6180,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec34000000000000000000000000fd2e96e66c9508029d5520f1f991e8cd8dc6e562000000000000000000000000fd2e96e66c9508029d5520f1f991e8cd8dc6e5620000000000000000000000000000000000000000000000000008d7749523930000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -6181,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec34000000000000000000000000bab442313afd6650d8cf23cf5bdc29255694df2a000000000000000000000000bab442313afd6650d8cf23cf5bdc29255694df2a00000000000000000000000000000000000000000000000000a917e195bb6aac00000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -6182,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec34000000000000000000000000d4f28a98f1f3f45acffc42dea779467516a9c486000000000000000000000000d4f28a98f1f3f45acffc42dea779467516a9c486000000000000000000000000000000000000000000000000000009184e72a00000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -6187,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec34000000000000000000000000c0901490ea1dbbb439aa472e89945fb2d7a077b7000000000000000000000000c0901490ea1dbbb439aa472e89945fb2d7a077b70000000000000000000000000000000000000000000000000076add99dfcc82600000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -6188,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec340000000000000000000000003d2fc24c8e0a517be44017c363738feacc336f460000000000000000000000003d2fc24c8e0a517be44017c363738feacc336f4600000000000000000000000000000000000000000000000000005af3107a400000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -6190,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec340000000000000000000000003296fb4fb0188d3c4ebbc6ee55ce636ac1ab5b4b0000000000000000000000003296fb4fb0188d3c4ebbc6ee55ce636ac1ab5b4b000000000000000000000000000000000000000000000000009317d79afac68000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -6191,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec34000000000000000000000000b6e8d29a8c5d0fcef149c5641e1eee004582d07e000000000000000000000000b6e8d29a8c5d0fcef149c5641e1eee004582d07e00000000000000000000000000000000000000000000000000005af3107a400000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -6192,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec3400000000000000000000000067a0fe77d11bb228e4abc8303e11a70221ece23d00000000000000000000000067a0fe77d11bb228e4abc8303e11a70221ece23d00000000000000000000000000000000000000000000000000005af3107a400000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -6193,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec34000000000000000000000000c40326ea38b5b7ad6f21b6d2725a736320b2b13a000000000000000000000000c40326ea38b5b7ad6f21b6d2725a736320b2b13a00000000000000000000000000000000000000000000000000005af3107a400000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -6194,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec34000000000000000000000000af4c12f61ec66327b8230215ce76bb5d5d87ae41000000000000000000000000af4c12f61ec66327b8230215ce76bb5d5d87ae4100000000000000000000000000000000000000000000000000005af3107a400000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -6195,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec340000000000000000000000002f73d8cf6974c675e8fb695180eebb693a0c90f40000000000000000000000002f73d8cf6974c675e8fb695180eebb693a0c90f400000000000000000000000000000000000000000000000000005af3107a400000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -6196,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec34000000000000000000000000594185ad7267edbc4d909660e36dae73642279ac000000000000000000000000594185ad7267edbc4d909660e36dae73642279ac00000000000000000000000000000000000000000000000000005af3107a400000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -6197,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec340000000000000000000000004c1828e25724846b84b75fe89d984464da43a3b50000000000000000000000004c1828e25724846b84b75fe89d984464da43a3b500000000000000000000000000000000000000000000000000005af3107a400000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -6198,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec3400000000000000000000000017c434152967287d37601a331c998f7569532d5800000000000000000000000017c434152967287d37601a331c998f7569532d5800000000000000000000000000000000000000000000000000005af3107a400000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -6199,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec340000000000000000000000004a3416da2690142c4d29833c3ccba07ad91fd2e50000000000000000000000004a3416da2690142c4d29833c3ccba07ad91fd2e500000000000000000000000000000000000000000000000000005af3107a400000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -6200,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec340000000000000000000000007485416586bb2c820d8e17dc9f08e13d769dcb900000000000000000000000007485416586bb2c820d8e17dc9f08e13d769dcb9000000000000000000000000000000000000000000000000000470de4df82000000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -6201,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec3400000000000000000000000010a262209be8c3e5293b4d2744c7591180b06fb500000000000000000000000010a262209be8c3e5293b4d2744c7591180b06fb500000000000000000000000000000000000000000000000000005af3107a400000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -6202,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec34000000000000000000000000aa8c135316894210564b4bd6a62d711efffe6ab3000000000000000000000000aa8c135316894210564b4bd6a62d711efffe6ab300000000000000000000000000000000000000000000000000005af3107a400000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -6203,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec340000000000000000000000005c82309fb96679c4a246effb6cae82e4f5a503a90000000000000000000000005c82309fb96679c4a246effb6cae82e4f5a503a900000000000000000000000000000000000000000000000000005af3107a400000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -6204,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec340000000000000000000000007a3a97e9548c1d7b6b271586c3df7d598401195d0000000000000000000000007a3a97e9548c1d7b6b271586c3df7d598401195d00000000000000000000000000000000000000000000000000005af3107a400000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -6205,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec34000000000000000000000000c16c6707c225bcfe6cb45d70c2c3b60fa1dd8684000000000000000000000000c16c6707c225bcfe6cb45d70c2c3b60fa1dd868400000000000000000000000000000000000000000000000000005af3107a400000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -6206,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec34000000000000000000000000476cf12d3a58803a6396fa9d996b16bd5fd5bc97000000000000000000000000476cf12d3a58803a6396fa9d996b16bd5fd5bc9700000000000000000000000000000000000000000000000000005af3107a400000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -6207,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec3400000000000000000000000076d70b9f4d57b9a142402a10e6dd66d23434d66300000000000000000000000076d70b9f4d57b9a142402a10e6dd66d23434d66300000000000000000000000000000000000000000000000000005af3107a400000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -6208,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec340000000000000000000000001300ad33bb8615e965d9ae24faefd917859c51690000000000000000000000001300ad33bb8615e965d9ae24faefd917859c516900000000000000000000000000000000000000000000000000005af3107a400000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -6209,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec34000000000000000000000000534a350439c0d8ef6bd87dbd8ae87a98d7a19fee000000000000000000000000534a350439c0d8ef6bd87dbd8ae87a98d7a19fee00000000000000000000000000000000000000000000000000005af3107a400000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -6210,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec34000000000000000000000000779a4fe40cd3d0e522e6acd979355bd13319d4eb000000000000000000000000779a4fe40cd3d0e522e6acd979355bd13319d4eb00000000000000000000000000000000000000000000000000005af3107a400000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -6211,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec34000000000000000000000000a259607466a7f8c233a90f8056c7c2b088e44a3b000000000000000000000000a259607466a7f8c233a90f8056c7c2b088e44a3b00000000000000000000000000000000000000000000000000005af3107a400000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -6212,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec340000000000000000000000002b4074eacf0d93b51da37cf2fdb2b92a29f7a62b0000000000000000000000002b4074eacf0d93b51da37cf2fdb2b92a29f7a62b00000000000000000000000000000000000000000000000000005af3107a400000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -6213,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec34000000000000000000000000cd5743a88dbd7283c7b62969315737d0c09108b9000000000000000000000000cd5743a88dbd7283c7b62969315737d0c09108b900000000000000000000000000000000000000000000000000005af3107a400000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -6214,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec340000000000000000000000006c4162902791407e9c97f0d103cc7f18014e05000000000000000000000000006c4162902791407e9c97f0d103cc7f18014e050000000000000000000000000000000000000000000000000000d529ae9e86000000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -6215,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec340000000000000000000000001e1339e1c320fba582437346f5f8f255ccc0298b0000000000000000000000001e1339e1c320fba582437346f5f8f255ccc0298b00000000000000000000000000000000000000000000000000005af3107a400000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -6217,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec3400000000000000000000000086ab8050fa2dbf473b6b2b835eaeecf79fdb853a00000000000000000000000086ab8050fa2dbf473b6b2b835eaeecf79fdb853a00000000000000000000000000000000000000000000000000005af3107a400000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -6218,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec34000000000000000000000000c6e8f993e38a2080bfcf6059e0e53035cc6e4c70000000000000000000000000c6e8f993e38a2080bfcf6059e0e53035cc6e4c7000000000000000000000000000000000000000000000000000005af3107a400000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -6219,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec34000000000000000000000000e5c45509af209bda85bba4eed08b8ee109ccdef7000000000000000000000000e5c45509af209bda85bba4eed08b8ee109ccdef700000000000000000000000000000000000000000000000000005af3107a400000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -6220,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec34000000000000000000000000fed459299bd99747cec1f0a5422a930aea38ff66000000000000000000000000fed459299bd99747cec1f0a5422a930aea38ff6600000000000000000000000000000000000000000000000000005af3107a400000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -6221,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec34000000000000000000000000315bbdc92a1d5ac1d5cd72fcab68db625932b546000000000000000000000000315bbdc92a1d5ac1d5cd72fcab68db625932b54600000000000000000000000000000000000000000000000000005af3107a400000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -6222,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec3400000000000000000000000066b3ae9ce70bf1f8adf6164086881a9d3a59f79900000000000000000000000066b3ae9ce70bf1f8adf6164086881a9d3a59f79900000000000000000000000000000000000000000000000000005af3107a400000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -6223,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec340000000000000000000000000a0b5dd11e6b7a32f72f20354cd28cfd525bf2610000000000000000000000000a0b5dd11e6b7a32f72f20354cd28cfd525bf26100000000000000000000000000000000000000000000000000005af3107a400000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -6224,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec34000000000000000000000000a252c6caff320a0a2349ec78f2eed5e5d6958e89000000000000000000000000a252c6caff320a0a2349ec78f2eed5e5d6958e8900000000000000000000000000000000000000000000000000005af3107a400000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -6225,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec340000000000000000000000000c5b16f1b8eefded06173ca6fce42a5b624043d40000000000000000000000000c5b16f1b8eefded06173ca6fce42a5b624043d400000000000000000000000000000000000000000000000000005af3107a400000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -6226,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec34000000000000000000000000cbc44dd131bc2ab9e555cc4b43485874e10ec6eb000000000000000000000000cbc44dd131bc2ab9e555cc4b43485874e10ec6eb00000000000000000000000000000000000000000000000000005af3107a400000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -6227,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec34000000000000000000000000cefbf484039b2d4ea0bc018c1857170c7b1b481c000000000000000000000000cefbf484039b2d4ea0bc018c1857170c7b1b481c00000000000000000000000000000000000000000000000000005af3107a400000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -6228,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec34000000000000000000000000aaa9722e144867288e390dee76b2ac90a703d233000000000000000000000000aaa9722e144867288e390dee76b2ac90a703d23300000000000000000000000000000000000000000000000000005af3107a400000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -6229,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec3400000000000000000000000049196ccd96632f3c2ed79e7ee02b22ce89860cd800000000000000000000000049196ccd96632f3c2ed79e7ee02b22ce89860cd800000000000000000000000000000000000000000000000000005af3107a400000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -6230,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec340000000000000000000000009595cd099429cbd13327b2add9c9af1ac1495faf0000000000000000000000009595cd099429cbd13327b2add9c9af1ac1495faf00000000000000000000000000000000000000000000000000005af3107a400000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -6231,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec3400000000000000000000000082ceb6c9bde6f0d141da7c62374d4b8cfdde321200000000000000000000000082ceb6c9bde6f0d141da7c62374d4b8cfdde3212000000000000000000000000000000000000000000000000002e2f6e5e14800000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -6232,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec340000000000000000000000008286d5a11fe8737c80f52436ef58ae880b156db90000000000000000000000008286d5a11fe8737c80f52436ef58ae880b156db900000000000000000000000000000000000000000000000000005af3107a400000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -6233,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec340000000000000000000000008d78ee648e21f36ac5881b356f57605773efe1950000000000000000000000008d78ee648e21f36ac5881b356f57605773efe19500000000000000000000000000000000000000000000000000005af3107a400000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -6234,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec340000000000000000000000003fcaaa3062b75ceb9a9a230310c71250e33835990000000000000000000000003fcaaa3062b75ceb9a9a230310c71250e338359900000000000000000000000000000000000000000000000000005af3107a400000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -6235,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec340000000000000000000000006f5c1d799431338c9266a20a31ebd7ff8565f9e40000000000000000000000006f5c1d799431338c9266a20a31ebd7ff8565f9e400000000000000000000000000000000000000000000000000005af3107a400000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -6236,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec34000000000000000000000000d1b7bbf015f73bff3c8a8ef105c2d3d857d48186000000000000000000000000d1b7bbf015f73bff3c8a8ef105c2d3d857d4818600000000000000000000000000000000000000000000000000005af3107a400000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -6237,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec34000000000000000000000000c42662d950a9b86b37e992737edaf24ae1eefd52000000000000000000000000c42662d950a9b86b37e992737edaf24ae1eefd5200000000000000000000000000000000000000000000000000005af3107a400000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -6238,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec340000000000000000000000009c28c11326d22dd12cae0bac4442cf339c5b2a7b0000000000000000000000009c28c11326d22dd12cae0bac4442cf339c5b2a7b000000000000000000000000000000000000000000000000001550f7dca7000000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -6240,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec340000000000000000000000009238516001504cf6228e1e18f6f1d5c6dc3366b70000000000000000000000009238516001504cf6228e1e18f6f1d5c6dc3366b700000000000000000000000000000000000000000000000006e3a298ab351d0000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -6241,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec340000000000000000000000004369e98806b77c31fb8aaaf22fd99392d2ecd1f10000000000000000000000004369e98806b77c31fb8aaaf22fd99392d2ecd1f100000000000000000000000000000000000000000000000000fc4562136c383f00000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -6242,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec3400000000000000000000000037c53c4146c9952e806ed05d358c55b6ee13a14d00000000000000000000000037c53c4146c9952e806ed05d358c55b6ee13a14d000000000000000000000000000000000000000000000000007a2f0ddd43fa0000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -6244,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec340000000000000000000000003c8af873ccf3379491750835130d1d81beecc9c30000000000000000000000003c8af873ccf3379491750835130d1d81beecc9c300000000000000000000000000000000000000000000000000470de4df82000000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -6248,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec340000000000000000000000004e8215ff2db1ac1d023eee2040cb81f73fa4b8fb0000000000000000000000004e8215ff2db1ac1d023eee2040cb81f73fa4b8fb0000000000000000000000000000000000000000000000000005cf3606cecb4c00000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -6250,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec3400000000000000000000000041f7fc9cd42e9559e1f73aaa2d06653bc815998d00000000000000000000000041f7fc9cd42e9559e1f73aaa2d06653bc815998d0000000000000000000000000000000000000000000000000039c01982d1f9a400000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -6252,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec3400000000000000000000000016da895d3b3e77f25e6035c01981a7126f99f9da00000000000000000000000016da895d3b3e77f25e6035c01981a7126f99f9da00000000000000000000000000000000000000000000000000e6ed27d666800000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,0xedefa5bd834783935fa51ac9a850177a1366b3338e4c9d80ad21ed6907d5d68d,2022-02-17 12:06:48.000 UTC,0,true -6253,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec34000000000000000000000000df5758524fcb5f096a07830bc72a815f5701dbd4000000000000000000000000df5758524fcb5f096a07830bc72a815f5701dbd4000000000000000000000000000000000000000000000000000aa87bee53800000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -6256,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec340000000000000000000000002ed688a91f3a1a466a719dfd933e32cdd69fe92a0000000000000000000000002ed688a91f3a1a466a719dfd933e32cdd69fe92a0000000000000000000000000000000000000000000000000017659cca426ec000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -6258,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec34000000000000000000000000940214134c5e8d81dbd5e9015908c697dab5e0dd000000000000000000000000940214134c5e8d81dbd5e9015908c697dab5e0dd000000000000000000000000000000000000000000000000013fbe85edc9000000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -6260,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec3400000000000000000000000053a67719f7e50beb47e6cae7fbbb04cf65d2962600000000000000000000000053a67719f7e50beb47e6cae7fbbb04cf65d2962600000000000000000000000000000000000000000000000000babe8103e6a10d00000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -6261,0xcd9d4988c0ae61887b075ba77f08cbfad2b65068,0x3f87ff1de58128ef8fcb4c807efd776e1ac72e51,0xf4f7b41a00000000000000000000000055f86e2214dadb7e364fba38c12fe44fff6870d20000000000000000000000000000000000000000000000008cfe9010eb30ec02,,,1,true -6262,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec34000000000000000000000000a889b33e317c507fc4a8d116b2a1884a65d6d90a000000000000000000000000a889b33e317c507fc4a8d116b2a1884a65d6d90a00000000000000000000000000000000000000000000000000038d7ea4c6800000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -6263,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec3400000000000000000000000087b61e7e1bf4cc3e9e6b40518ded79439924f9e200000000000000000000000087b61e7e1bf4cc3e9e6b40518ded79439924f9e2000000000000000000000000000000000000000000000000002386f26fc1000000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -6264,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec34000000000000000000000000c78366cc2aa23ef0409bf13803b5cc6145fba0f5000000000000000000000000c78366cc2aa23ef0409bf13803b5cc6145fba0f5000000000000000000000000000000000000000000000000000009184e72a00000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -6266,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec340000000000000000000000007af27b2ed937f738f6fa81048c8be89cf04991140000000000000000000000007af27b2ed937f738f6fa81048c8be89cf049911400000000000000000000000000000000000000000000000000b1a2bc2ec5000000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -6268,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec3400000000000000000000000020b99860d324741aabc4c208f5464060a08db84a00000000000000000000000020b99860d324741aabc4c208f5464060a08db84a00000000000000000000000000000000000000000000000000038d7ea4c6800000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -6270,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec340000000000000000000000004e910cc299f45787e5eca168085618fa44148a1e0000000000000000000000004e910cc299f45787e5eca168085618fa44148a1e00000000000000000000000000000000000000000000000001e8a3bbd098939800000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -6271,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec340000000000000000000000009092164dcde75456862c7ac90c52120fa87094fb0000000000000000000000009092164dcde75456862c7ac90c52120fa87094fb000000000000000000000000000000000000000000000000005f74af10795c0000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -6273,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec340000000000000000000000005a61c698fb2b2913c194ba98445a12338e3288440000000000000000000000005a61c698fb2b2913c194ba98445a12338e32884400000000000000000000000000000000000000000000000000b1a2bc2ec5000000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -6274,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec34000000000000000000000000d445d31483882576e8eda27b51491be77cbb69d4000000000000000000000000d445d31483882576e8eda27b51491be77cbb69d400000000000000000000000000000000000000000000000000987b6fea6e1f8b00000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -6276,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec34000000000000000000000000ba6ffaea3206d86e04dc1b2c029efcb99494549e000000000000000000000000ba6ffaea3206d86e04dc1b2c029efcb99494549e000000000000000000000000000000000000000000000000000009184e72a00000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -6277,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec34000000000000000000000000b0f770c3de2fff71850e35bee24be4f4ddcc9c59000000000000000000000000b0f770c3de2fff71850e35bee24be4f4ddcc9c5900000000000000000000000000000000000000000000000000628a6d33774ec400000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -6278,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec3400000000000000000000000030d84e2c44d2b66975d02ad194363324cd3dfb9b00000000000000000000000030d84e2c44d2b66975d02ad194363324cd3dfb9b0000000000000000000000000000000000000000000000000032af6a70f4850000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -6281,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec3400000000000000000000000071628a735b74ba74d93fbbb14131c846c13d8eed00000000000000000000000071628a735b74ba74d93fbbb14131c846c13d8eed000000000000000000000000000000000000000000000000000009184e72a00000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -6282,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec340000000000000000000000005fb02812573f49cf965f1881878fa804ba7c63160000000000000000000000005fb02812573f49cf965f1881878fa804ba7c6316000000000000000000000000000000000000000000000000000009184e72a00000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -6283,0x10e6593cdda8c58a1d0f14c5164b376352a55f2f,0x467194771dae2967aef3ecbedd3bf9a310c76c65,0xa9f9e6750000000000000000000000006b175474e89094c44da98b954eedeac495271d0f000000000000000000000000da10009cbd5d07dd0cecc66161fc93d7c9000da10000000000000000000000006810dba12317406828d64b07d34ad22338644bb30000000000000000000000006810dba12317406828d64b07d34ad22338644bb300000000000000000000000000000000000000000000000443172f0bfe46b9ee00000000000000000000000000000000000000000000000000000000000000c00000000000000000000000000000000000000000000000000000000000000000,0x19168165ce2657720a459f6931d9a24a8e86b1431b1401d6fc8d977edab49f68,2022-06-28 11:54:08.000 UTC,0,true -6285,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec34000000000000000000000000b0552ba5df6da78e609e3af1f5e566e2b96f000b000000000000000000000000b0552ba5df6da78e609e3af1f5e566e2b96f000b000000000000000000000000000000000000000000000000002f82bfd2c5820100000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -6286,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec3400000000000000000000000024875e064103cf1f8f1a3f0951d07afb302256ad00000000000000000000000024875e064103cf1f8f1a3f0951d07afb302256ad000000000000000000000000000000000000000000000000015c24e75e36c00000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,0x1d4e411895fdd35f25bfa0144df50110817a860743eb2d63c345aa5172eb4f42,2022-05-25 10:12:28.000 UTC,0,true -6287,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec340000000000000000000000005678e3d553cc261b690126952ce58828add4b0380000000000000000000000005678e3d553cc261b690126952ce58828add4b038000000000000000000000000000000000000000000000000000009184e72a00000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -6288,0x10e6593cdda8c58a1d0f14c5164b376352a55f2f,0x467194771dae2967aef3ecbedd3bf9a310c76c65,0xa9f9e6750000000000000000000000006b175474e89094c44da98b954eedeac495271d0f000000000000000000000000da10009cbd5d07dd0cecc66161fc93d7c9000da10000000000000000000000006810dba12317406828d64b07d34ad22338644bb30000000000000000000000006810dba12317406828d64b07d34ad22338644bb3000000000000000000000000000000000000000000000001314fb3706298000000000000000000000000000000000000000000000000000000000000000000c00000000000000000000000000000000000000000000000000000000000000000,0xe8f0bf0df1d0e8b63c9a7cb97af3040fc3ddfa3453b71ac6971369e244ff0b8e,2022-07-23 04:30:41.000 UTC,0,true -6289,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec340000000000000000000000003af22eadb1319617c8ab95c04d2ba96ca6728e050000000000000000000000003af22eadb1319617c8ab95c04d2ba96ca6728e0500000000000000000000000000000000000000000000000000d9b967236676d200000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -6290,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec340000000000000000000000005f01a4acc32c5834786a3fe20a40dc8697fcb6b20000000000000000000000005f01a4acc32c5834786a3fe20a40dc8697fcb6b2000000000000000000000000000000000000000000000000000009184e72a00000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -6292,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec340000000000000000000000008f22deebdf3eead96a0609f29c49ef7f9f652ade0000000000000000000000008f22deebdf3eead96a0609f29c49ef7f9f652ade000000000000000000000000000000000000000000000000000009184e72a00000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -6294,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec340000000000000000000000000d5e388b530864423b27d3394edffc9510bf5ed40000000000000000000000000d5e388b530864423b27d3394edffc9510bf5ed4000000000000000000000000000000000000000000000000009ad0531208b12e00000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -6296,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec340000000000000000000000005e3a1d91c232d7e6887ae83bf99ac38e777fbcd90000000000000000000000005e3a1d91c232d7e6887ae83bf99ac38e777fbcd90000000000000000000000000000000000000000000000000040db0b9968f26200000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -6297,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec340000000000000000000000001ce58ec06f621fee629c5ea2e790a39924cc8e210000000000000000000000001ce58ec06f621fee629c5ea2e790a39924cc8e21000000000000000000000000000000000000000000000000000009184e72a00000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -6298,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec34000000000000000000000000bb907d3b1d7db12314279a954dd8b5a86c0e86fc000000000000000000000000bb907d3b1d7db12314279a954dd8b5a86c0e86fc000000000000000000000000000000000000000000000000000009184e72a00000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -6300,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec34000000000000000000000000111b58c01afa72d04bc0adb523266aa55749ed92000000000000000000000000111b58c01afa72d04bc0adb523266aa55749ed920000000000000000000000000000000000000000000000000131f7e2cbb633b400000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -6301,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec34000000000000000000000000beb3662c34c8be5172b32ef9d3012e5c7b8680c0000000000000000000000000beb3662c34c8be5172b32ef9d3012e5c7b8680c000000000000000000000000000000000000000000000000007a1fe160277000000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -6304,0xcd9d4988c0ae61887b075ba77f08cbfad2b65068,0x3f87ff1de58128ef8fcb4c807efd776e1ac72e51,0xf4f7b41a00000000000000000000000070b1e584456ad5d8dc8f7ad0b410374984e1e75200000000000000000000000000000000000000000000000039b6204432e90373,,,1,true -6305,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec34000000000000000000000000f66945895001023cf1cf9ef36a361ad909ca9336000000000000000000000000f66945895001023cf1cf9ef36a361ad909ca9336000000000000000000000000000000000000000000000000000009184e72a00000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -6306,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec34000000000000000000000000f4627cec6ea1c46963942c076f39746814b7aa9e000000000000000000000000f4627cec6ea1c46963942c076f39746814b7aa9e0000000000000000000000000000000000000000000000000062d2e8a6ebaae100000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -6308,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec34000000000000000000000000662d9c83c75ec4c2622cb6a45a764eaa6e1be89b000000000000000000000000662d9c83c75ec4c2622cb6a45a764eaa6e1be89b00000000000000000000000000000000000000000000000000497d70d0430b0700000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -6309,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec340000000000000000000000005a64f54ca8af1eafbcb31fec17042fc05c10aa140000000000000000000000005a64f54ca8af1eafbcb31fec17042fc05c10aa140000000000000000000000000000000000000000000000000018de76816d800000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -6310,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec34000000000000000000000000648b7355aea321b558ed5609570c179e41751e26000000000000000000000000648b7355aea321b558ed5609570c179e41751e2600000000000000000000000000000000000000000000000001a072041bb64a8000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,0x838fa964f5d78315fae8279605f8f5c80feeda481d80d97ef60a4b0b78267126,2021-12-08 16:08:28.000 UTC,0,true -6311,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec3400000000000000000000000022d2380f3d396fb9ffb3523f1d570138b404a4e200000000000000000000000022d2380f3d396fb9ffb3523f1d570138b404a4e200000000000000000000000000000000000000000000000000a204c415bec1b500000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -6312,0xcd9d4988c0ae61887b075ba77f08cbfad2b65068,0x3f87ff1de58128ef8fcb4c807efd776e1ac72e51,0xf4f7b41a000000000000000000000000546c35a376735dad1ada63b63550f4528853d32200000000000000000000000000000000000000000000000ad78ebc5ac6200000,,,1,true -6314,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec34000000000000000000000000aa23be134c9bdfa8bda5ee6034b2083e09d8a4d9000000000000000000000000aa23be134c9bdfa8bda5ee6034b2083e09d8a4d90000000000000000000000000000000000000000000000000152afb15f65af3700000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -6315,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec34000000000000000000000000700b81ebc4854cc92c0f8726384b8165379101c6000000000000000000000000700b81ebc4854cc92c0f8726384b8165379101c60000000000000000000000000000000000000000000000000018de76816d800000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -6316,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec34000000000000000000000000d466900fea4c92cf0dc3dd354c2013b6037e734d000000000000000000000000d466900fea4c92cf0dc3dd354c2013b6037e734d000000000000000000000000000000000000000000000000004c5ab53cb0cad600000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -6317,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec3400000000000000000000000089a23f067054fcec705e64d4f4aac36ff0db6b2c00000000000000000000000089a23f067054fcec705e64d4f4aac36ff0db6b2c00000000000000000000000000000000000000000000000000071afd498d000000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -6322,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec34000000000000000000000000f2d3c29bcf8b7db513fcb09937bb69de81475e05000000000000000000000000f2d3c29bcf8b7db513fcb09937bb69de81475e0500000000000000000000000000000000000000000000000000a34a257751602a00000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -6323,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec34000000000000000000000000bcf0fd9c42cc8cb2060c4930d2c1d277f18146a5000000000000000000000000bcf0fd9c42cc8cb2060c4930d2c1d277f18146a5000000000000000000000000000000000000000000000000000110d9316ec00000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -6325,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec3400000000000000000000000060663af31be6fb5f4c89cc2cca07f0bf3b2cfa9400000000000000000000000060663af31be6fb5f4c89cc2cca07f0bf3b2cfa940000000000000000000000000000000000000000000000000042a0642a6f150000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -6326,0xcd9d4988c0ae61887b075ba77f08cbfad2b65068,0x3f87ff1de58128ef8fcb4c807efd776e1ac72e51,0xf4f7b41a000000000000000000000000f8ae64665c750207ac62203a29c70edc7f91784d000000000000000000000000000000000000000000000000226abadc42f80000,,,1,true -6328,0xcd9d4988c0ae61887b075ba77f08cbfad2b65068,0x3f87ff1de58128ef8fcb4c807efd776e1ac72e51,0xf4f7b41a0000000000000000000000008a6838b8ce1e427892c0069e40c81ac3af1444fe00000000000000000000000000000000000000000000001ae2bf3612bb93a0f5,0x3f2733185c0c9552b8fcdb0096e6ddd4f30bdfbfffa4cf4fb7ede2c531a98adf,2021-11-26 07:02:24.000 UTC,0,true -6329,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec340000000000000000000000002f34293b6f2617e676a25a6b823396c6e63de7980000000000000000000000002f34293b6f2617e676a25a6b823396c6e63de798000000000000000000000000000000000000000000000000006acf9437f14e0000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,0xccc621b60c73dd77808a99cecd16eeacdea0e480d560d0300252974e930f0556,2022-06-05 07:27:45.000 UTC,0,true -6331,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec34000000000000000000000000d1a5b91957530e1b3e9cfac1543467c60c352f69000000000000000000000000d1a5b91957530e1b3e9cfac1543467c60c352f690000000000000000000000000000000000000000000000000029281dfd38090d00000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -6332,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec340000000000000000000000000aa87daf0dd4ecaa131d68d888a2a636c405393c0000000000000000000000000aa87daf0dd4ecaa131d68d888a2a636c405393c00000000000000000000000000000000000000000000000002ae3331f8143d0000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,0x4b82c8a1e96caab53f631664ee54109ac953ff4080aff20c749c2b967b8b1fcc,2022-03-02 22:32:22.000 UTC,0,true -6333,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec34000000000000000000000000b840dfec84de16e0ad8143ae3536b1d592876228000000000000000000000000b840dfec84de16e0ad8143ae3536b1d59287622800000000000000000000000000000000000000000000000000a6abc3f786f1e600000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -6334,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec34000000000000000000000000e8e856fd16c4e38e8ff7643aa1a7f1b5dfa9938c000000000000000000000000e8e856fd16c4e38e8ff7643aa1a7f1b5dfa9938c0000000000000000000000000000000000000000000000000018fc6c600eb19600000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -6335,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec3400000000000000000000000083381ee6b054a70226363aa4a98b8dfd7ce8aee000000000000000000000000083381ee6b054a70226363aa4a98b8dfd7ce8aee00000000000000000000000000000000000000000000000000001370c1483600000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -6336,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec34000000000000000000000000bd2ff170381c1299550ddc2e142723c8fca7d685000000000000000000000000bd2ff170381c1299550ddc2e142723c8fca7d6850000000000000000000000000000000000000000000000000001370c1483600000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -6337,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec34000000000000000000000000dfdeb82e4893a7357dc941fcc5cdb8b1a2d08915000000000000000000000000dfdeb82e4893a7357dc941fcc5cdb8b1a2d089150000000000000000000000000000000000000000000000000001373aa571300000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -6338,0xcd9d4988c0ae61887b075ba77f08cbfad2b65068,0x3f87ff1de58128ef8fcb4c807efd776e1ac72e51,0xf4f7b41a000000000000000000000000818c4df073ec43b80fd6e3bdd451382a390d0466000000000000000000000000000000000000000000000000a2a632f9d1e30b3a,,,1,true -6339,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec3400000000000000000000000052d2ee31368104138d5fe98effd7ce8f5558d37300000000000000000000000052d2ee31368104138d5fe98effd7ce8f5558d3730000000000000000000000000000000000000000000000000001370e688f440000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -6340,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec34000000000000000000000000c641582d9eb6c40b2b07f3848b917e686c3fe49b000000000000000000000000c641582d9eb6c40b2b07f3848b917e686c3fe49b0000000000000000000000000000000000000000000000000001370ea42a0e0000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -6341,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec340000000000000000000000009eb4eb18cf1d8a8451fe062d914d81c5bf9ce1e30000000000000000000000009eb4eb18cf1d8a8451fe062d914d81c5bf9ce1e300000000000000000000000000000000000000000000000000038d7ea4c6800000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -6342,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec340000000000000000000000003ba5d980d983164803d1a9f90485f6ef1cebe9480000000000000000000000003ba5d980d983164803d1a9f90485f6ef1cebe9480000000000000000000000000000000000000000000000000001370fce30000000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -6343,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec34000000000000000000000000f9dc1ea1b25a752cc4882f7b5fdf3aa53cc32ebe000000000000000000000000f9dc1ea1b25a752cc4882f7b5fdf3aa53cc32ebe00000000000000000000000000000000000000000000000000714a0420d4132200000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -6344,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec34000000000000000000000000c62fedcc778e49daf606416ead602e40a002dec1000000000000000000000000c62fedcc778e49daf606416ead602e40a002dec10000000000000000000000000000000000000000000000000001370eaa1fef0000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -6345,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec340000000000000000000000000824e79aabb599a969d07ef67391c33ceb39ac800000000000000000000000000824e79aabb599a969d07ef67391c33ceb39ac800000000000000000000000000000000000000000000000000044a7d1b245773a00000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -6347,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec34000000000000000000000000923c0d5dbb0be64eac9c79a7781762b4395f17ce000000000000000000000000923c0d5dbb0be64eac9c79a7781762b4395f17ce00000000000000000000000000000000000000000000000000044364c5bb000000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -6348,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec340000000000000000000000004598a3b9f8e61e5cf6b4f50cda88b0666bba23d40000000000000000000000004598a3b9f8e61e5cf6b4f50cda88b0666bba23d4000000000000000000000000000000000000000000000000000d3c3dbb67010000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -6349,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec3400000000000000000000000081069f658da5fac80bbeee0023a21f0531d144dc00000000000000000000000081069f658da5fac80bbeee0023a21f0531d144dc00000000000000000000000000000000000000000000000000354a6ba7a1800000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -6350,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec34000000000000000000000000c6726399a01376f1dc6e5b81adf6d41c19de0cc1000000000000000000000000c6726399a01376f1dc6e5b81adf6d41c19de0cc10000000000000000000000000000000000000000000000000051b660cdd5800000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -6351,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0xa9f9e675000000000000000000000000dac17f958d2ee523a2206206994597c13d831ec700000000000000000000000094b008aa00579c1307b0ef2c499ad98a8ce58e580000000000000000000000001558c24d917026f552dc74dbd7202485795680df0000000000000000000000001558c24d917026f552dc74dbd7202485795680df000000000000000000000000000000000000000000000000000000000100ed7d00000000000000000000000000000000000000000000000000000000000000c00000000000000000000000000000000000000000000000000000000000000000,,,1,true -6352,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec340000000000000000000000001558c24d917026f552dc74dbd7202485795680df0000000000000000000000001558c24d917026f552dc74dbd7202485795680df000000000000000000000000000000000000000000000000002258044a403e4000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -6353,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec34000000000000000000000000a2bca9a3911dbdd6968fbf0bdbf22bb750aa4ed7000000000000000000000000a2bca9a3911dbdd6968fbf0bdbf22bb750aa4ed7000000000000000000000000000000000000000000000000000c6f3b40b6c00000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -6354,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec340000000000000000000000006bc51aefc2eccc5916825f96bfe0215b7626c1a40000000000000000000000006bc51aefc2eccc5916825f96bfe0215b7626c1a4000000000000000000000000000000000000000000000000002386f26fc1000000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -6356,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec340000000000000000000000002bc57482492d63420c29fa88e6654e2b42769f690000000000000000000000002bc57482492d63420c29fa88e6654e2b42769f690000000000000000000000000000000000000000000000000007ec1d64d71ac000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -6357,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec34000000000000000000000000764b908d96fcff7df8792e66a9c43c0014e3df3e000000000000000000000000764b908d96fcff7df8792e66a9c43c0014e3df3e0000000000000000000000000000000000000000000000000001c6bf5263400000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -6358,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec340000000000000000000000001a432b8023270db100a316ebf47871733df263d10000000000000000000000001a432b8023270db100a316ebf47871733df263d10000000000000000000000000000000000000000000000000001c6bf5263400000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -6359,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec340000000000000000000000004fc4aa1af42db84b5befcdef7a7618a3a59e108e0000000000000000000000004fc4aa1af42db84b5befcdef7a7618a3a59e108e0000000000000000000000000000000000000000000000000001c6bf5263400000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -6360,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec34000000000000000000000000f198c77d9c968840995e0172a003388d4aa02352000000000000000000000000f198c77d9c968840995e0172a003388d4aa0235200000000000000000000000000000000000000000000000000038d7ea4c6800000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -6361,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec34000000000000000000000000f11556dc1c53440c769b33542fd1ca0c373ca28b000000000000000000000000f11556dc1c53440c769b33542fd1ca0c373ca28b0000000000000000000000000000000000000000000000000001c6bf5263400000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -6362,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec340000000000000000000000002f1a3f4f7dfacf318a7c7a6a9773add3c9ff82f60000000000000000000000002f1a3f4f7dfacf318a7c7a6a9773add3c9ff82f60000000000000000000000000000000000000000000000000001c6bf5263400000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -6364,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec3400000000000000000000000055f0c1e1c64d656bdc369e50a7935eb4417b3eb600000000000000000000000055f0c1e1c64d656bdc369e50a7935eb4417b3eb60000000000000000000000000000000000000000000000000001c6bf5263400000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -6365,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec34000000000000000000000000a2966908f05b065d7006c25d91f991b3260c9250000000000000000000000000a2966908f05b065d7006c25d91f991b3260c92500000000000000000000000000000000000000000000000000066543a9944a5ba00000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -6366,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec34000000000000000000000000f820c77a87d0c29b2fc0127d4043c3ac12f7a3c3000000000000000000000000f820c77a87d0c29b2fc0127d4043c3ac12f7a3c300000000000000000000000000000000000000000000000000044364c5bb000000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -6367,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec34000000000000000000000000af423790163935a517b229019088c0388ad24551000000000000000000000000af423790163935a517b229019088c0388ad245510000000000000000000000000000000000000000000000000001c6bf5263400000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -6368,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec34000000000000000000000000d72dd704147ac65e0ade2a030088329396d27615000000000000000000000000d72dd704147ac65e0ade2a030088329396d276150000000000000000000000000000000000000000000000000001c6bf5263400000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -6370,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec3400000000000000000000000088c7de054c28e03deb4c6feb393b40b08780150100000000000000000000000088c7de054c28e03deb4c6feb393b40b0878015010000000000000000000000000000000000000000000000000001c6bf5263400000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -6372,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec34000000000000000000000000a713b2af2c6a1452c0c87b742f97700560fc6eca000000000000000000000000a713b2af2c6a1452c0c87b742f97700560fc6eca0000000000000000000000000000000000000000000000000001c6bf5263400000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -6373,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec340000000000000000000000003aa2f6138599a7d22b742881b77c78c07bd549030000000000000000000000003aa2f6138599a7d22b742881b77c78c07bd549030000000000000000000000000000000000000000000000000001c6bf5263400000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -6374,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec340000000000000000000000005bd166035bb746ff5c2bc190ed615e5761e2ad310000000000000000000000005bd166035bb746ff5c2bc190ed615e5761e2ad3100000000000000000000000000000000000000000000000000b1a2bc2ec5000000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -6375,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec34000000000000000000000000e2991ccb1dd1d9f10a5d4bcbdade6a97289b5e5e000000000000000000000000e2991ccb1dd1d9f10a5d4bcbdade6a97289b5e5e0000000000000000000000000000000000000000000000000001c6bf5263400000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -6376,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec34000000000000000000000000b4dceb958f0e2472811ab21669712f63ac6e9ee9000000000000000000000000b4dceb958f0e2472811ab21669712f63ac6e9ee90000000000000000000000000000000000000000000000000001c6bf5263400000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -6377,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec340000000000000000000000007030b4b422546c60b4e77896344c781f116c43200000000000000000000000007030b4b422546c60b4e77896344c781f116c43200000000000000000000000000000000000000000000000000001c6bf5263400000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -6378,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec3400000000000000000000000010e08067623e27fba375b9dabf5e8366da6bc06d00000000000000000000000010e08067623e27fba375b9dabf5e8366da6bc06d0000000000000000000000000000000000000000000000000001c6bf5263400000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -6379,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec34000000000000000000000000fcacd4ed1f378163d15101d8f20900b1c4d9662e000000000000000000000000fcacd4ed1f378163d15101d8f20900b1c4d9662e0000000000000000000000000000000000000000000000000001c6bf5263400000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -6380,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec3400000000000000000000000032cce025af9e68044937c2377d403a72013ea44e00000000000000000000000032cce025af9e68044937c2377d403a72013ea44e0000000000000000000000000000000000000000000000000001c6bf5263400000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -6381,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec34000000000000000000000000ae60140b46282c9caca0fe3241447b63b884a2f2000000000000000000000000ae60140b46282c9caca0fe3241447b63b884a2f20000000000000000000000000000000000000000000000000001c6bf5263400000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -6382,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec34000000000000000000000000bb446eeb0453d24b012910336dc4170063a8d130000000000000000000000000bb446eeb0453d24b012910336dc4170063a8d1300000000000000000000000000000000000000000000000000020e57016d196eb00000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -6383,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec34000000000000000000000000b6ec2a147ed598ab72d1578f92a400ca99a46260000000000000000000000000b6ec2a147ed598ab72d1578f92a400ca99a46260000000000000000000000000000000000000000000000000013a9396d78af54700000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -6384,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec340000000000000000000000001d62865a54e3fc57c43a1c7401e2499f241ba6450000000000000000000000001d62865a54e3fc57c43a1c7401e2499f241ba6450000000000000000000000000000000000000000000000000001c6bf5263400000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -6385,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec34000000000000000000000000dc2b2e250e315c8d024b14cd5503131ae7c8ecc5000000000000000000000000dc2b2e250e315c8d024b14cd5503131ae7c8ecc50000000000000000000000000000000000000000000000000001c6bf5263400000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -6386,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec340000000000000000000000006daf6dc3c8aa3ee860478645205b5f9d6397616d0000000000000000000000006daf6dc3c8aa3ee860478645205b5f9d6397616d00000000000000000000000000000000000000000000000000049e57d635400000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -6387,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec340000000000000000000000008bf8ef0a3cd17245300936ab8069bce536f7d6c60000000000000000000000008bf8ef0a3cd17245300936ab8069bce536f7d6c60000000000000000000000000000000000000000000000000001c6bf5263400000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -6388,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec3400000000000000000000000016d3529382e60edd749942589771c579a72c479500000000000000000000000016d3529382e60edd749942589771c579a72c47950000000000000000000000000000000000000000000000000001c6bf5263400000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -6389,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec340000000000000000000000000a4474516897af9015887f6f784c865b7922cf800000000000000000000000000a4474516897af9015887f6f784c865b7922cf800000000000000000000000000000000000000000000000000001c6bf5263400000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -6391,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec3400000000000000000000000035b92fd72c499ece40298df93fa9552f08f9373f00000000000000000000000035b92fd72c499ece40298df93fa9552f08f9373f0000000000000000000000000000000000000000000000000019ef4fb2dc400000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -6392,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec34000000000000000000000000e7e01621c46b43d030949e474348c2b835c3de84000000000000000000000000e7e01621c46b43d030949e474348c2b835c3de840000000000000000000000000000000000000000000000000001c6bf5263400000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -6393,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec340000000000000000000000002a816876f1750d88636c678240c5ab049e851e3b0000000000000000000000002a816876f1750d88636c678240c5ab049e851e3b000000000000000000000000000000000000000000000000003ff2e795f5000000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -6394,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec340000000000000000000000001faeb47d071f796dc9ce31b0212efa31fe65ea110000000000000000000000001faeb47d071f796dc9ce31b0212efa31fe65ea110000000000000000000000000000000000000000000000000039ed2ca295c20a00000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -6395,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec340000000000000000000000008aa40f0bf095a7974396b55ca8056d2892efda610000000000000000000000008aa40f0bf095a7974396b55ca8056d2892efda6100000000000000000000000000000000000000000000000000063dba24d5de6a00000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -6396,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec3400000000000000000000000059636a3198c7718037c8f4e47ff476a997611e8000000000000000000000000059636a3198c7718037c8f4e47ff476a997611e80000000000000000000000000000000000000000000000000005ba9e844fff8f200000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -6397,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec34000000000000000000000000f9373046a064c700f27c878cf881f31dc07ebff2000000000000000000000000f9373046a064c700f27c878cf881f31dc07ebff20000000000000000000000000000000000000000000000000001c6bf5263400000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -6398,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec3400000000000000000000000075de74801c5c9771bec4c5695f917cf3b951ba4100000000000000000000000075de74801c5c9771bec4c5695f917cf3b951ba410000000000000000000000000000000000000000000000000001c6bf5263400000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -6399,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec340000000000000000000000005cf968f202abb9f97063c5ce1a0ed07ff2f3e6280000000000000000000000005cf968f202abb9f97063c5ce1a0ed07ff2f3e6280000000000000000000000000000000000000000000000000013305ca623f00000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -6400,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec34000000000000000000000000c57598b68719641dbe3bc5eb9edbf5fcf14193cd000000000000000000000000c57598b68719641dbe3bc5eb9edbf5fcf14193cd00000000000000000000000000000000000000000000000000470de4df82000000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -6401,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec340000000000000000000000009cd57ab451145a5705dcd0a0e5608cd309c36ac00000000000000000000000009cd57ab451145a5705dcd0a0e5608cd309c36ac00000000000000000000000000000000000000000000000000001c6bf5263400000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -6402,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec34000000000000000000000000ddddb71d309c54f0838e1d48faeef2634c197fb6000000000000000000000000ddddb71d309c54f0838e1d48faeef2634c197fb6000000000000000000000000000000000000000000000000001ad7b431d3d66900000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -6403,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec3400000000000000000000000085046ee159fbde94eed825855638c173b450a11c00000000000000000000000085046ee159fbde94eed825855638c173b450a11c0000000000000000000000000000000000000000000000000001c6bf5263400000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -6405,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec34000000000000000000000000c4d43e87d85fec5339e8517fb677b6884c8895c4000000000000000000000000c4d43e87d85fec5339e8517fb677b6884c8895c40000000000000000000000000000000000000000000000000214e8348c4f000000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -6406,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec3400000000000000000000000024926a489189fc1475541149d45c1c8872246fef00000000000000000000000024926a489189fc1475541149d45c1c8872246fef000000000000000000000000000000000000000000000000023fc04fe2804a1c00000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -6407,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec34000000000000000000000000b00d522543e1530dc5f9eccced7e055a877231ae000000000000000000000000b00d522543e1530dc5f9eccced7e055a877231ae0000000000000000000000000000000000000000000000000001c6bf5263400000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -6408,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec34000000000000000000000000a3d2939eb7e59daaa7e11f1d31057f86164e8b98000000000000000000000000a3d2939eb7e59daaa7e11f1d31057f86164e8b980000000000000000000000000000000000000000000000000021e3d105c88c8e00000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -6410,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec340000000000000000000000000f1c877774262fc6d467f626d077d2fbb276f9680000000000000000000000000f1c877774262fc6d467f626d077d2fbb276f9680000000000000000000000000000000000000000000000000001c6bf5263400000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -6411,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec340000000000000000000000003796a49560f4ec38cae0c451fbc8f1ec33649fa10000000000000000000000003796a49560f4ec38cae0c451fbc8f1ec33649fa1000000000000000000000000000000000000000000000000000221b262dd800000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -6412,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec34000000000000000000000000414e4df902397f3f459cf59d2ca778e4d6230ab6000000000000000000000000414e4df902397f3f459cf59d2ca778e4d6230ab60000000000000000000000000000000000000000000000000001c6bf5263400000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -6413,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec3400000000000000000000000091f4202fcc0521c745a44c3097650c0757c5291400000000000000000000000091f4202fcc0521c745a44c3097650c0757c529140000000000000000000000000000000000000000000000000001c6bf5263400000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -6415,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec340000000000000000000000005adfd3ea26e023098903bbcbe9a0cb3361446e5c0000000000000000000000005adfd3ea26e023098903bbcbe9a0cb3361446e5c0000000000000000000000000000000000000000000000000001c6bf5263400000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -6416,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec340000000000000000000000008d595547a6cf1d082b0f342f4827c1360125a70c0000000000000000000000008d595547a6cf1d082b0f342f4827c1360125a70c000000000000000000000000000000000000000000000000000aa87bee53800000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -6417,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec34000000000000000000000000c3f49f97a71b0dde68e40653c938ed8697fc7841000000000000000000000000c3f49f97a71b0dde68e40653c938ed8697fc78410000000000000000000000000000000000000000000000000001c6bf5263400000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -6418,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec3400000000000000000000000059a62f8bd4a72417a762fef9104c11e92e1205dc00000000000000000000000059a62f8bd4a72417a762fef9104c11e92e1205dc0000000000000000000000000000000000000000000000000038c0d61369504000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -6419,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec34000000000000000000000000c30bec87bead77c71942e89600d8f669d76a56a7000000000000000000000000c30bec87bead77c71942e89600d8f669d76a56a700000000000000000000000000000000000000000000000000071afd498d000000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -6420,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec340000000000000000000000000ff73618c2029909ae2d62e6dc05eec8b64bd39c0000000000000000000000000ff73618c2029909ae2d62e6dc05eec8b64bd39c0000000000000000000000000000000000000000000000000001c6bf5263400000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -6421,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec3400000000000000000000000059a62f8bd4a72417a762fef9104c11e92e1205dc00000000000000000000000059a62f8bd4a72417a762fef9104c11e92e1205dc0000000000000000000000000000000000000000000000000016e4739dfa5c5a00000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -6422,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec3400000000000000000000000055ba7f8c5ea45109bfdef64b101c5da25c5ac6a800000000000000000000000055ba7f8c5ea45109bfdef64b101c5da25c5ac6a80000000000000000000000000000000000000000000000000001c6bf5263400000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -6423,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec340000000000000000000000004fdb7bd4f6f301e132e93457943ecb93be79399d0000000000000000000000004fdb7bd4f6f301e132e93457943ecb93be79399d0000000000000000000000000000000000000000000000000001c6bf5263400000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -6424,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec34000000000000000000000000aaad594018955dee2541465ea2fdda1777026fc7000000000000000000000000aaad594018955dee2541465ea2fdda1777026fc70000000000000000000000000000000000000000000000000001c6bf5263400000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -6425,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec340000000000000000000000001c2d8da83b4cf891db819cbcda16ccf42dbeb9030000000000000000000000001c2d8da83b4cf891db819cbcda16ccf42dbeb9030000000000000000000000000000000000000000000000000001c6bf5263400000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -6426,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec34000000000000000000000000b6632c27d31499f4490462bcfe623b24b8dff8db000000000000000000000000b6632c27d31499f4490462bcfe623b24b8dff8db0000000000000000000000000000000000000000000000000099def4160021ee00000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -6427,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec340000000000000000000000000063d937ed6dec82f33141f89026a8d15eb2d6520000000000000000000000000063d937ed6dec82f33141f89026a8d15eb2d6520000000000000000000000000000000000000000000000000001c6bf5263400000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -6428,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec340000000000000000000000003414b9ce85a5c17c16226c018ffa712b997e27110000000000000000000000003414b9ce85a5c17c16226c018ffa712b997e2711000000000000000000000000000000000000000000000000000aa87bee53800000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -6429,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec34000000000000000000000000e86ffe5ecd8b6da1796d2737dee86d9ad585f76f000000000000000000000000e86ffe5ecd8b6da1796d2737dee86d9ad585f76f0000000000000000000000000000000000000000000000000098a3d1c2ad9e7e00000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -6430,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec340000000000000000000000008cefa30ccaddd6228c0bd93aa67e0945546d29540000000000000000000000008cefa30ccaddd6228c0bd93aa67e0945546d29540000000000000000000000000000000000000000000000000001c6bf5263400000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -6432,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec340000000000000000000000003bc8a01e685eb5277e57f5081f7704f2a061a0a90000000000000000000000003bc8a01e685eb5277e57f5081f7704f2a061a0a90000000000000000000000000000000000000000000000000001c6bf5263400000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -6433,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec34000000000000000000000000cccd945857e6f70e9249e6e9509fe8ab3f4d9feb000000000000000000000000cccd945857e6f70e9249e6e9509fe8ab3f4d9feb0000000000000000000000000000000000000000000000000001c6bf5263400000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -6435,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec3400000000000000000000000052b24e9f816f9d0121fa47e545b86e0f74a872ee00000000000000000000000052b24e9f816f9d0121fa47e545b86e0f74a872ee0000000000000000000000000000000000000000000000000001c6bf5263400000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -6436,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec340000000000000000000000006db8a50c879f17da3d6d3c94ab99aec3e21229940000000000000000000000006db8a50c879f17da3d6d3c94ab99aec3e21229940000000000000000000000000000000000000000000000000001c6bf5263400000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -6437,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec34000000000000000000000000b25c6474f6e10e9c9930a36c32fb29e6243c3a19000000000000000000000000b25c6474f6e10e9c9930a36c32fb29e6243c3a190000000000000000000000000000000000000000000000000001c6bf5263400000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -6438,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0xa9f9e675000000000000000000000000dac17f958d2ee523a2206206994597c13d831ec700000000000000000000000094b008aa00579c1307b0ef2c499ad98a8ce58e58000000000000000000000000f5f6eb014093902d9367517e23c4b418d9becd6a000000000000000000000000f5f6eb014093902d9367517e23c4b418d9becd6a0000000000000000000000000000000000000000000000000000000001ee1eb800000000000000000000000000000000000000000000000000000000000000c00000000000000000000000000000000000000000000000000000000000000000,,,1,true -6439,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec340000000000000000000000006c4a55dbc592555f8c96d520054cb52e90e29bb20000000000000000000000006c4a55dbc592555f8c96d520054cb52e90e29bb20000000000000000000000000000000000000000000000000001c6bf5263400000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -6440,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec3400000000000000000000000086f5ee2ada23227d8b75791c64c32a467b566e5600000000000000000000000086f5ee2ada23227d8b75791c64c32a467b566e560000000000000000000000000000000000000000000000000001c6bf5263400000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -6441,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec340000000000000000000000006e35ed5fc914da2e02f79dc8ee80f7fce750d0080000000000000000000000006e35ed5fc914da2e02f79dc8ee80f7fce750d008000000000000000000000000000000000000000000000000004a407073ce400000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -6442,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec34000000000000000000000000427c6de41db0619a101dd5323463ed4d82ee822e000000000000000000000000427c6de41db0619a101dd5323463ed4d82ee822e000000000000000000000000000000000000000000000000006740af99069f0000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -6444,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec34000000000000000000000000becf8bb57afd39baca320b1177bf23dc53f2fe30000000000000000000000000becf8bb57afd39baca320b1177bf23dc53f2fe3000000000000000000000000000000000000000000000000000deca9399e5875f00000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -6445,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec34000000000000000000000000e235a100b610f1bbf27f6cf826828bccfdb45e55000000000000000000000000e235a100b610f1bbf27f6cf826828bccfdb45e5500000000000000000000000000000000000000000000000000619f19428d7faf00000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -6446,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec34000000000000000000000000a273f8eb3f4203e3058b5c6bc4d459dcbc3557c8000000000000000000000000a273f8eb3f4203e3058b5c6bc4d459dcbc3557c8000000000000000000000000000000000000000000000000008bf959f55bae0c00000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -6447,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec340000000000000000000000004e892622181587805df303338a43759d20ba13500000000000000000000000004e892622181587805df303338a43759d20ba135000000000000000000000000000000000000000000000000000a6c2c0be7808b800000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -6448,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec34000000000000000000000000a7d1323199e48e20c43db56f5f082e4fa88b3ec5000000000000000000000000a7d1323199e48e20c43db56f5f082e4fa88b3ec50000000000000000000000000000000000000000000000000043aaea9a92e00000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -6449,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec34000000000000000000000000ad1e365152589d3501340af5c004bfa1ef0d724a000000000000000000000000ad1e365152589d3501340af5c004bfa1ef0d724a0000000000000000000000000000000000000000000000000354a6ba7a18000000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -6451,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec34000000000000000000000000422fc6d98bfc720be3b9c594a324dbdce79c9967000000000000000000000000422fc6d98bfc720be3b9c594a324dbdce79c9967000000000000000000000000000000000000000000000000002386f26fc1000000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -6453,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec34000000000000000000000000a51d52ea55af256e2cd323c44839ec4ad7809edd000000000000000000000000a51d52ea55af256e2cd323c44839ec4ad7809edd0000000000000000000000000000000000000000000000000029e0884c47f71d00000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -6455,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec340000000000000000000000007c8e8dc76b61d473a59373d05f64e6272ef481420000000000000000000000007c8e8dc76b61d473a59373d05f64e6272ef481420000000000000000000000000000000000000000000000000001c6bf5263400000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -6456,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec34000000000000000000000000b62b3f714036e8d973109f55727e6f9da416513e000000000000000000000000b62b3f714036e8d973109f55727e6f9da416513e0000000000000000000000000000000000000000000000000005455b3469dd6c00000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -6457,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec3400000000000000000000000047fa565d61fd4d97b93b3d6dd559d97c321fecd800000000000000000000000047fa565d61fd4d97b93b3d6dd559d97c321fecd80000000000000000000000000000000000000000000000000001c6bf5263400000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -6459,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec34000000000000000000000000c821da8f59947715030e0a0c301719b77fbe6be9000000000000000000000000c821da8f59947715030e0a0c301719b77fbe6be900000000000000000000000000000000000000000000000000470de4df82000000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -6460,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec3400000000000000000000000090e796ca6ab5fda3692eb327038d540f07ded70000000000000000000000000090e796ca6ab5fda3692eb327038d540f07ded7000000000000000000000000000000000000000000000000000001c6bf5263400000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -6461,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec340000000000000000000000008a030931e0df303c601f743c8b73f12ba15b3bd80000000000000000000000008a030931e0df303c601f743c8b73f12ba15b3bd800000000000000000000000000000000000000000000000000038d7ea4c6800000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -6462,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec3400000000000000000000000003fbbf87d84733e70c54e93b669d3e4c4716432800000000000000000000000003fbbf87d84733e70c54e93b669d3e4c471643280000000000000000000000000000000000000000000000000001c6bf5263400000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -6463,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec3400000000000000000000000055be352901e49213f5467d55c1383ef888da6bbf00000000000000000000000055be352901e49213f5467d55c1383ef888da6bbf0000000000000000000000000000000000000000000000000001c6bf5263400000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -6465,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec34000000000000000000000000dfbc8fea29cec36cad1fee29c2ddf176d4810063000000000000000000000000dfbc8fea29cec36cad1fee29c2ddf176d48100630000000000000000000000000000000000000000000000000001c6bf5263400000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -6466,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec34000000000000000000000000b6ce241b44b26286d4c3d7c13b9fece7b4ce159b000000000000000000000000b6ce241b44b26286d4c3d7c13b9fece7b4ce159b0000000000000000000000000000000000000000000000000001c6bf5263400000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -6467,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec340000000000000000000000008002323f8b78fb24b65edb5563025278611593fa0000000000000000000000008002323f8b78fb24b65edb5563025278611593fa0000000000000000000000000000000000000000000000000001c6bf5263400000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -6468,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec34000000000000000000000000fb390ea6f867bbfe6aa709c05edc7cd948ba5707000000000000000000000000fb390ea6f867bbfe6aa709c05edc7cd948ba57070000000000000000000000000000000000000000000000000001c6bf5263400000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -6469,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec34000000000000000000000000cd81320bfa0105241fcf099541802fc4fd396aca000000000000000000000000cd81320bfa0105241fcf099541802fc4fd396aca0000000000000000000000000000000000000000000000000001c6bf5263400000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -6470,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec3400000000000000000000000030be19e4887663efa1d153205d7df97b35d81d7900000000000000000000000030be19e4887663efa1d153205d7df97b35d81d790000000000000000000000000000000000000000000000000001c6bf5263400000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -6471,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec34000000000000000000000000f4c2444cd28c052b140c94957b19b616335775e2000000000000000000000000f4c2444cd28c052b140c94957b19b616335775e2000000000000000000000000000000000000000000000000001e857fc020420000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -6472,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec3400000000000000000000000064d8a22881fdb8984737f4c4760cd256e126f7ea00000000000000000000000064d8a22881fdb8984737f4c4760cd256e126f7ea000000000000000000000000000000000000000000000000003a585005f155ad00000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -6473,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec34000000000000000000000000473dff3f18d2b44e98129b7b1ef6f5a7d28b5270000000000000000000000000473dff3f18d2b44e98129b7b1ef6f5a7d28b527000000000000000000000000000000000000000000000000000a24ebf1c816f3b00000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -6474,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec340000000000000000000000000cdd02d15521f7a7fbb4e5d6d0cbab90a29463730000000000000000000000000cdd02d15521f7a7fbb4e5d6d0cbab90a2946373000000000000000000000000000000000000000000000000015e421082e9cd0000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -6475,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec34000000000000000000000000c5614db57a4e24bee825e08a03e41af281273fef000000000000000000000000c5614db57a4e24bee825e08a03e41af281273fef000000000000000000000000000000000000000000000000001791157627b6c000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -6476,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec34000000000000000000000000ec643cc2bd8ee525f1784c6505d60b8d9452bf9b000000000000000000000000ec643cc2bd8ee525f1784c6505d60b8d9452bf9b0000000000000000000000000000000000000000000000000003b0910c86334000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -6477,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec34000000000000000000000000381af25e0264eaa2233d0c8d69bdd40cfe60e833000000000000000000000000381af25e0264eaa2233d0c8d69bdd40cfe60e8330000000000000000000000000000000000000000000000000024bd01f873541000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -6479,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec340000000000000000000000000039f22efb07a647557c7c5d17854cfd6d489ef30000000000000000000000000039f22efb07a647557c7c5d17854cfd6d489ef300000000000000000000000000000000000000000000000006e7dc258e0028e200000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -6480,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec340000000000000000000000000063d80caa6d0ea78f9a502c9c2c8b5079a666d60000000000000000000000000063d80caa6d0ea78f9a502c9c2c8b5079a666d600000000000000000000000000000000000000000000000000038d7ea4c6800000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -6482,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec34000000000000000000000000ecfe3326223df6f99f6527213222af3fabba93e7000000000000000000000000ecfe3326223df6f99f6527213222af3fabba93e70000000000000000000000000000000000000000000000000001599ba503c00000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -6483,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec3400000000000000000000000077fab6facc647806593c3e670058fc13699da5da00000000000000000000000077fab6facc647806593c3e670058fc13699da5da000000000000000000000000000000000000000000000000002386f26fc1000000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -6484,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec34000000000000000000000000360751b3b6d58a63b24709694de5169136016281000000000000000000000000360751b3b6d58a63b24709694de516913601628100000000000000000000000000000000000000000000000002483e1dcdbe7d1500000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -6485,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec340000000000000000000000008b4e927fcef617a7e6c92fae48bc1b3d956bd8c50000000000000000000000008b4e927fcef617a7e6c92fae48bc1b3d956bd8c50000000000000000000000000000000000000000000000000006cbe25efe853400000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -6486,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec3400000000000000000000000055ed55e77fd107829bc3bc3bde78ed2d0598d11e00000000000000000000000055ed55e77fd107829bc3bc3bde78ed2d0598d11e000000000000000000000000000000000000000000000000001a766dacdc374c00000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -6487,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec34000000000000000000000000ae2ec43d0c061cede6cbeb4157e6a3d67acf780a000000000000000000000000ae2ec43d0c061cede6cbeb4157e6a3d67acf780a00000000000000000000000000000000000000000000000001feb4211821a82900000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -6488,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec34000000000000000000000000c0081e6380af5d61da4a4d17e7532c123c70ad38000000000000000000000000c0081e6380af5d61da4a4d17e7532c123c70ad3800000000000000000000000000000000000000000000000000b1a2bc2ec5000000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -6490,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec340000000000000000000000009a72c4275919b54401c9665ae6e4ea070c50c9230000000000000000000000009a72c4275919b54401c9665ae6e4ea070c50c923000000000000000000000000000000000000000000000000002386f26fc1000000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -6491,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec3400000000000000000000000048d540daa0a0da768b6ace1a0981968e179b207b00000000000000000000000048d540daa0a0da768b6ace1a0981968e179b207b0000000000000000000000000000000000000000000000000059f8602e70abb000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -6492,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec340000000000000000000000000bdab303ff2a5804065970d1b750895d834a57710000000000000000000000000bdab303ff2a5804065970d1b750895d834a577100000000000000000000000000000000000000000000000000068ab7b8087e0100000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -6494,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec340000000000000000000000003997e11f8e25b96e8d4e9d72d2ce1d22dd962bfb0000000000000000000000003997e11f8e25b96e8d4e9d72d2ce1d22dd962bfb0000000000000000000000000000000000000000000000000005a53ceda36b3c00000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -6495,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec3400000000000000000000000007f9186026deaa14e242a1f209b3f85be99c27d500000000000000000000000007f9186026deaa14e242a1f209b3f85be99c27d500000000000000000000000000000000000000000000000000091100e5f458ce00000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -6496,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec34000000000000000000000000d5db0328428f9980b9d3dad9ee8606dfbaa54085000000000000000000000000d5db0328428f9980b9d3dad9ee8606dfbaa540850000000000000000000000000000000000000000000000000081dd9430b17ee000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -6497,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec340000000000000000000000003e0619f4301f6b8f013fc603574bc52484296c2b0000000000000000000000003e0619f4301f6b8f013fc603574bc52484296c2b0000000000000000000000000000000000000000000000000470de4df820000000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,0x98d4f947a1855c63c04f83fb96820cc9eb5d2a19de2461450ef4826b5c68d9e3,2022-05-29 05:50:13.000 UTC,0,true -6498,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec34000000000000000000000000c0081e6380af5d61da4a4d17e7532c123c70ad38000000000000000000000000c0081e6380af5d61da4a4d17e7532c123c70ad38000000000000000000000000000000000000000000000000014af4c48c7050fe00000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -6500,0xcd9d4988c0ae61887b075ba77f08cbfad2b65068,0x3f87ff1de58128ef8fcb4c807efd776e1ac72e51,0xf4f7b41a000000000000000000000000a71cabc14966c6fae86c05630a20ba1c90944a1f000000000000000000000000000000000000000000000000cadf5fa1648ec4cb,,,1,true -6502,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec34000000000000000000000000bc83d4d0356f65da131cad32ddee510ffbe299c9000000000000000000000000bc83d4d0356f65da131cad32ddee510ffbe299c900000000000000000000000000000000000000000000000000038d7ea4c6800000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -6503,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec34000000000000000000000000cd37d23fb161f96efef5f7463abaf5b63169caa4000000000000000000000000cd37d23fb161f96efef5f7463abaf5b63169caa4000000000000000000000000000000000000000000000000000307269dbf415800000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -6504,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec34000000000000000000000000b876ec1045badcb845acfd6f5182f200af6a0861000000000000000000000000b876ec1045badcb845acfd6f5182f200af6a086100000000000000000000000000000000000000000000000000a47e6b89de3d5800000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -6505,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec340000000000000000000000007efcaa576e55449a1645b1f493436fc0959e78c60000000000000000000000007efcaa576e55449a1645b1f493436fc0959e78c600000000000000000000000000000000000000000000000001f69013913835e600000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -6506,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec3400000000000000000000000004bbb7ea18ea570ae47d4489991645e4e49bbf3700000000000000000000000004bbb7ea18ea570ae47d4489991645e4e49bbf3700000000000000000000000000000000000000000000000008b41a36c41b5ec800000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -6507,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec34000000000000000000000000b9e8029395c758e1359bd6308e8c2b85907658c9000000000000000000000000b9e8029395c758e1359bd6308e8c2b85907658c90000000000000000000000000000000000000000000000000001c6bf5263400000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -6508,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec3400000000000000000000000014150988c18b8ca4b9d91b0b064a228e83b91a4d00000000000000000000000014150988c18b8ca4b9d91b0b064a228e83b91a4d0000000000000000000000000000000000000000000000000001c6bf5263400000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -6509,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec34000000000000000000000000176537296f7b527e00c61f6f303e8ca1b4d34125000000000000000000000000176537296f7b527e00c61f6f303e8ca1b4d341250000000000000000000000000000000000000000000000000001c6bf5263400000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -6510,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec34000000000000000000000000ae5defa9e0e94b461029b09c3bd500f9cb1be1ae000000000000000000000000ae5defa9e0e94b461029b09c3bd500f9cb1be1ae0000000000000000000000000000000000000000000000000001c6bf5263400000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -6511,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec34000000000000000000000000b8a3eb612c36858955939579c920329c8c93b081000000000000000000000000b8a3eb612c36858955939579c920329c8c93b0810000000000000000000000000000000000000000000000000001c6bf5263400000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -6512,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec34000000000000000000000000b1a3826ea3270facd57ded4aeda05966bb72cc4b000000000000000000000000b1a3826ea3270facd57ded4aeda05966bb72cc4b0000000000000000000000000000000000000000000000000001c6bf5263400000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -6513,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec3400000000000000000000000064aec6d32fb6a4bf80347fa7e38fd3504c83cecc00000000000000000000000064aec6d32fb6a4bf80347fa7e38fd3504c83cecc0000000000000000000000000000000000000000000000000001c6bf5263400000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -6514,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec34000000000000000000000000cd37ef933d0aa9c260dd4b24bae16d2fe1387fb8000000000000000000000000cd37ef933d0aa9c260dd4b24bae16d2fe1387fb800000000000000000000000000000000000000000000000000499a5fc88afb4000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -6515,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec34000000000000000000000000c86628b4170652db03ea1e67762deaa156ec1df6000000000000000000000000c86628b4170652db03ea1e67762deaa156ec1df600000000000000000000000000000000000000000000000000092e6ed2935d5400000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -6516,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec3400000000000000000000000045627772199e4a1d89cd345d93ee52763d85bee800000000000000000000000045627772199e4a1d89cd345d93ee52763d85bee80000000000000000000000000000000000000000000000000001c6bf5263400000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -6519,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec34000000000000000000000000c1166aa914487997a72227ee5f1fc346deb31ad4000000000000000000000000c1166aa914487997a72227ee5f1fc346deb31ad40000000000000000000000000000000000000000000000000001c6bf5263400000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -6520,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec34000000000000000000000000ef92dc32c64ac6c96e5bd1d6fd3f2f5bbc6f7552000000000000000000000000ef92dc32c64ac6c96e5bd1d6fd3f2f5bbc6f75520000000000000000000000000000000000000000000000000001c6bf5263400000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -6522,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec340000000000000000000000003b0f66f556208c7ecce91002b983aa310c87f31f0000000000000000000000003b0f66f556208c7ecce91002b983aa310c87f31f0000000000000000000000000000000000000000000000000001c6bf5263400000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -6523,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec340000000000000000000000003ac830c73b295bdc178b0d337db55e7cf141c7850000000000000000000000003ac830c73b295bdc178b0d337db55e7cf141c7850000000000000000000000000000000000000000000000000001c6bf5263400000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -6524,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec3400000000000000000000000094862c5241d46251f1e3fac1d2c5ea7f93ba0de200000000000000000000000094862c5241d46251f1e3fac1d2c5ea7f93ba0de20000000000000000000000000000000000000000000000000001c6bf5263400000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -6525,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec34000000000000000000000000aa16ad6d01c0a67cfdf933a64f320c221abbcf97000000000000000000000000aa16ad6d01c0a67cfdf933a64f320c221abbcf970000000000000000000000000000000000000000000000000001c6bf5263400000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -6526,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec34000000000000000000000000e9fb3cebf326388bd6f9bc374a035cbd8a4dc000000000000000000000000000e9fb3cebf326388bd6f9bc374a035cbd8a4dc0000000000000000000000000000000000000000000000000000001c6bf5263400000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -6527,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec3400000000000000000000000078fcc9ed722de1bc459ce108102f3e25b1c3255600000000000000000000000078fcc9ed722de1bc459ce108102f3e25b1c325560000000000000000000000000000000000000000000000000001c6bf5263400000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -6528,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec34000000000000000000000000dce8344556e362016cb5981dd22dfe8021a271e2000000000000000000000000dce8344556e362016cb5981dd22dfe8021a271e200000000000000000000000000000000000000000000000001ff90b365edef2100000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -6529,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec340000000000000000000000001b404acbf9a5408f15952497dd596308b646c2cb0000000000000000000000001b404acbf9a5408f15952497dd596308b646c2cb0000000000000000000000000000000000000000000000000001c6bf5263400000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -6530,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec340000000000000000000000005d0511b8785d6f1161d917b1c9057f61a21e753e0000000000000000000000005d0511b8785d6f1161d917b1c9057f61a21e753e000000000000000000000000000000000000000000000000000e864054c2550000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -6531,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec34000000000000000000000000d7a8aac126dbbc027c1b6c745e819827b519215b000000000000000000000000d7a8aac126dbbc027c1b6c745e819827b519215b0000000000000000000000000000000000000000000000000001c6bf5263400000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -6532,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec3400000000000000000000000048cca6555b1f7119e01f3a534a2ddd7b3d14a9b800000000000000000000000048cca6555b1f7119e01f3a534a2ddd7b3d14a9b80000000000000000000000000000000000000000000000000001c6bf5263400000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -6533,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec340000000000000000000000000208e47293cff4e85dce018ae704948049083a550000000000000000000000000208e47293cff4e85dce018ae704948049083a5500000000000000000000000000000000000000000000000000005af3107a400000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -6534,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec34000000000000000000000000634c994e9f1945016d90d30d540971fade8b26f8000000000000000000000000634c994e9f1945016d90d30d540971fade8b26f8000000000000000000000000000000000000000000000000001fd24e4dc3f40000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -6535,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec340000000000000000000000000208e47293cff4e85dce018ae704948049083a550000000000000000000000000208e47293cff4e85dce018ae704948049083a5500000000000000000000000000000000000000000000000000005af3107a400000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -6536,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec34000000000000000000000000446aceb97d5191ba737c48879a70fe8b397a5f58000000000000000000000000446aceb97d5191ba737c48879a70fe8b397a5f580000000000000000000000000000000000000000000000000001f42adc5218b800000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -6537,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec340000000000000000000000002a281527a3d9521fcb1aba3738ad694c9cb4f17d0000000000000000000000002a281527a3d9521fcb1aba3738ad694c9cb4f17d0000000000000000000000000000000000000000000000000001c6bf5263400000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -6538,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec340000000000000000000000008940715d8501f1a29268ed7082fda356aec0f2170000000000000000000000008940715d8501f1a29268ed7082fda356aec0f2170000000000000000000000000000000000000000000000000024be9eb62b880000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -6539,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec340000000000000000000000007c8f98a42499a960c36388c3423b375f9330589f0000000000000000000000007c8f98a42499a960c36388c3423b375f9330589f0000000000000000000000000000000000000000000000000001c6bf5263400000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -6540,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec34000000000000000000000000189f88a82cb02a0299f8017cdd23183bb7422a0d000000000000000000000000189f88a82cb02a0299f8017cdd23183bb7422a0d0000000000000000000000000000000000000000000000000001c6bf5263400000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -6541,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec34000000000000000000000000211c370b256f83f67f1c95a7a71da623cea02fa9000000000000000000000000211c370b256f83f67f1c95a7a71da623cea02fa9000000000000000000000000000000000000000000000000000aa87bee53800000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -6542,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0xa9f9e675000000000000000000000000dac17f958d2ee523a2206206994597c13d831ec700000000000000000000000094b008aa00579c1307b0ef2c499ad98a8ce58e58000000000000000000000000d3c2ededebfabf6b29e2aeba4ce82a4bf99d1082000000000000000000000000d3c2ededebfabf6b29e2aeba4ce82a4bf99d1082000000000000000000000000000000000000000000000000000000000118e01a00000000000000000000000000000000000000000000000000000000000000c00000000000000000000000000000000000000000000000000000000000000000,,,1,true -6543,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec3400000000000000000000000085d2d1d094ffbd688d8bcb7034a336902fcea93400000000000000000000000085d2d1d094ffbd688d8bcb7034a336902fcea9340000000000000000000000000000000000000000000000000003e871b540c00000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -6544,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec340000000000000000000000007ce827705e7c4f67169dadd925a05f097af35d450000000000000000000000007ce827705e7c4f67169dadd925a05f097af35d4500000000000000000000000000000000000000000000000000753d533d96800000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -6545,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec3400000000000000000000000071231c3aee4a32cd2344f70d5e3ef8245c8a5fcf00000000000000000000000071231c3aee4a32cd2344f70d5e3ef8245c8a5fcf0000000000000000000000000000000000000000000000000001c6bf5263400000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -6546,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec340000000000000000000000004dbfda2864b5ccdbea5b30419d1778e42bb6cc660000000000000000000000004dbfda2864b5ccdbea5b30419d1778e42bb6cc660000000000000000000000000000000000000000000000000001c6bf5263400000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -6547,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec340000000000000000000000001b1f457238c422d97d231ac10137aafd4b9a37030000000000000000000000001b1f457238c422d97d231ac10137aafd4b9a37030000000000000000000000000000000000000000000000000027a8bb138bdf0000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -6548,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec34000000000000000000000000e8beec2b0facca7be0f25a2468a06ddea9f9bfe2000000000000000000000000e8beec2b0facca7be0f25a2468a06ddea9f9bfe20000000000000000000000000000000000000000000000000001c6bf5263400000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -6549,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec340000000000000000000000003883694454d4afa41b30e8bcf2c1810139d7348e0000000000000000000000003883694454d4afa41b30e8bcf2c1810139d7348e0000000000000000000000000000000000000000000000000026b248f4f39b0000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -6550,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec34000000000000000000000000916766e8259e05eb941abcdecb3dc79aa72e16cc000000000000000000000000916766e8259e05eb941abcdecb3dc79aa72e16cc00000000000000000000000000000000000000000000000000234227d524f60000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -6551,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec3400000000000000000000000059ba2fd919585cf0620518f7691b044303c0f6df00000000000000000000000059ba2fd919585cf0620518f7691b044303c0f6df0000000000000000000000000000000000000000000000000001c6bf5263400000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -6552,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec34000000000000000000000000846dc401933c01742242a1a515ee2843af41ec8e000000000000000000000000846dc401933c01742242a1a515ee2843af41ec8e000000000000000000000000000000000000000000000000000aa87bee53800000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -6553,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec34000000000000000000000000ddd6578efdf7a516dc13487d38720947bb225da6000000000000000000000000ddd6578efdf7a516dc13487d38720947bb225da600000000000000000000000000000000000000000000000000234227d524f60000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -6554,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec34000000000000000000000000f1a004a8c2a462f057c7e83dcced62fb48eb6fc0000000000000000000000000f1a004a8c2a462f057c7e83dcced62fb48eb6fc00000000000000000000000000000000000000000000000000001c6bf5263400000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -6555,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec340000000000000000000000007d23bc8da7fb9fa49af7d74db3328e7970452a280000000000000000000000007d23bc8da7fb9fa49af7d74db3328e7970452a280000000000000000000000000000000000000000000000000026d10c740fa50000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -6556,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec34000000000000000000000000bc73d43cd1553d512d631206fc90696651964c4a000000000000000000000000bc73d43cd1553d512d631206fc90696651964c4a00000000000000000000000000000000000000000000000000038d7ea4c6800000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -6557,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec340000000000000000000000007c718d6ee2dad9e27b985e7c34cd2214410316f10000000000000000000000007c718d6ee2dad9e27b985e7c34cd2214410316f10000000000000000000000000000000000000000000000000021b1f2c84ad10000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -6559,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec34000000000000000000000000686d26d709a11f4da840f4fc4b14b94fed5f90c7000000000000000000000000686d26d709a11f4da840f4fc4b14b94fed5f90c700000000000000000000000000000000000000000000000000260572fc481d0000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -6560,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec340000000000000000000000009345c48c1dbcf90b73a095a261cd7777aff6d8e50000000000000000000000009345c48c1dbcf90b73a095a261cd7777aff6d8e5000000000000000000000000000000000000000000000000002398f7847cfa0000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -6561,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec3400000000000000000000000027b0fc6c4a5a0cf213a570097279a5bde61214d200000000000000000000000027b0fc6c4a5a0cf213a570097279a5bde61214d200000000000000000000000000000000000000000000000000038d7ea4c6800000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -6562,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec34000000000000000000000000e5a1e201c6c621b1bc4782a89beefbcec833d105000000000000000000000000e5a1e201c6c621b1bc4782a89beefbcec833d1050000000000000000000000000000000000000000000000000030bd984297450000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -6564,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec34000000000000000000000000098c54e453e5fb273fa6c0cdc22d340bea23ef1b000000000000000000000000098c54e453e5fb273fa6c0cdc22d340bea23ef1b00000000000000000000000000000000000000000000000000049e57d635400000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -6565,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec3400000000000000000000000072500ffa253799327f5963fcc35e34ea6a6880b100000000000000000000000072500ffa253799327f5963fcc35e34ea6a6880b1000000000000000000000000000000000000000000000000002386f26fc1000000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -6566,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec34000000000000000000000000f1d10dd665f35dd6f1e595bb42e3924f92aef005000000000000000000000000f1d10dd665f35dd6f1e595bb42e3924f92aef0050000000000000000000000000000000000000000000000000001c6bf5263400000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -6567,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec3400000000000000000000000055a55bdd1259809061cd677308e385603271ee4900000000000000000000000055a55bdd1259809061cd677308e385603271ee490000000000000000000000000000000000000000000000000001c6bf5263400000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -6568,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec340000000000000000000000001edec03eab28cbd0940ad39d684bf1aa3eb131260000000000000000000000001edec03eab28cbd0940ad39d684bf1aa3eb131260000000000000000000000000000000000000000000000000001c6bf5263400000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -6571,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec34000000000000000000000000ae9150e882d17fa39e668ea1f6a0e08ebdd7e562000000000000000000000000ae9150e882d17fa39e668ea1f6a0e08ebdd7e56200000000000000000000000000000000000000000000000000e92e14ceaea0e700000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -6572,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec340000000000000000000000009cc84e44fac29559654fd3b51e7ae2213dfab4fc0000000000000000000000009cc84e44fac29559654fd3b51e7ae2213dfab4fc0000000000000000000000000000000000000000000000000001c6bf5263400000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -6573,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec34000000000000000000000000887e2120c2d75c75faf422bb856768726d1e8ad6000000000000000000000000887e2120c2d75c75faf422bb856768726d1e8ad600000000000000000000000000000000000000000000000001196180a3f71c1f00000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -6574,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec34000000000000000000000000d023313bb4e503a0277ae7a8da0a81f8e887c0b4000000000000000000000000d023313bb4e503a0277ae7a8da0a81f8e887c0b40000000000000000000000000000000000000000000000000001c6bf5263400000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -6575,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec34000000000000000000000000cb23b4df2cc272eda72ad7e41e919cf02b164c4b000000000000000000000000cb23b4df2cc272eda72ad7e41e919cf02b164c4b000000000000000000000000000000000000000000000000010d3d79b37e969700000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -6576,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec34000000000000000000000000440e0140aae0e85344f4c1853697d7159217b70e000000000000000000000000440e0140aae0e85344f4c1853697d7159217b70e0000000000000000000000000000000000000000000000000118d5eb028a708200000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -6577,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec340000000000000000000000004c40b49313fb10ec7ca60293168097ed332daee70000000000000000000000004c40b49313fb10ec7ca60293168097ed332daee70000000000000000000000000000000000000000000000000001c6bf5263400000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -6578,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec34000000000000000000000000a92ad7e0bd2670c9130edf9534be003b5b06bf92000000000000000000000000a92ad7e0bd2670c9130edf9534be003b5b06bf92000000000000000000000000000000000000000000000000003519d7d9929d8200000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -6579,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec34000000000000000000000000419a60d57f2dd0a0d332a86de04d3d7c5da95509000000000000000000000000419a60d57f2dd0a0d332a86de04d3d7c5da955090000000000000000000000000000000000000000000000000114b2dbf86435a700000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -6580,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec3400000000000000000000000032243242dbc34c9a80f66f4047848f3bca1ed1ed00000000000000000000000032243242dbc34c9a80f66f4047848f3bca1ed1ed0000000000000000000000000000000000000000000000000110447667c5ac7000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -6581,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec34000000000000000000000000523fd220eb4172214dc811b7d4e8781df50836b4000000000000000000000000523fd220eb4172214dc811b7d4e8781df50836b40000000000000000000000000000000000000000000000000112ec300c5588a600000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -6582,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec340000000000000000000000004aa706defd337b3c86eb236151223ecfc73c9d3a0000000000000000000000004aa706defd337b3c86eb236151223ecfc73c9d3a000000000000000000000000000000000000000000000000000aa87bee53800000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -6583,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec340000000000000000000000005f9aa8be086b2343407496f4fe58c5054d040c5a0000000000000000000000005f9aa8be086b2343407496f4fe58c5054d040c5a0000000000000000000000000000000000000000000000000113f36cfbdd1b2200000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -6584,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec34000000000000000000000000f2b8624f63a45e445b854c86c0ac028e195b8092000000000000000000000000f2b8624f63a45e445b854c86c0ac028e195b80920000000000000000000000000000000000000000000000000113e0dde14f2c5d00000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -6585,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec34000000000000000000000000cc0ab9f9e603031fb53d69ff80928b335494c4a2000000000000000000000000cc0ab9f9e603031fb53d69ff80928b335494c4a2000000000000000000000000000000000000000000000000011168da3b1bd49600000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -6586,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec3400000000000000000000000006c4865ab16c9c760622f19a313a2e637e2e66a200000000000000000000000006c4865ab16c9c760622f19a313a2e637e2e66a2000000000000000000000000000000000000000000000000008e1bc9bf04000000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -6588,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec340000000000000000000000009b0cd7ff30f19ef4b3d031f7c84cb22a63080cd30000000000000000000000009b0cd7ff30f19ef4b3d031f7c84cb22a63080cd300000000000000000000000000000000000000000000000000ad0136ba09a70000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -6589,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec340000000000000000000000005f6ff6ea50edfa7852d194a79b414a5de0891dd90000000000000000000000005f6ff6ea50edfa7852d194a79b414a5de0891dd900000000000000000000000000000000000000000000000000071afd498d000000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -6590,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec340000000000000000000000008901baea259b7aa8d00da8a109a5bed145b5f5dc0000000000000000000000008901baea259b7aa8d00da8a109a5bed145b5f5dc0000000000000000000000000000000000000000000000000023a48fa834505b00000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -6591,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec34000000000000000000000000e095d1a7ed1a1173d69d7bd724b2b7c6c81b0e4b000000000000000000000000e095d1a7ed1a1173d69d7bd724b2b7c6c81b0e4b00000000000000000000000000000000000000000000000000223953dbbfa10000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -6595,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec34000000000000000000000000623db2c9a0a8e1d3825f57e5cbf1dc8e034e8a48000000000000000000000000623db2c9a0a8e1d3825f57e5cbf1dc8e034e8a4800000000000000000000000000000000000000000000000000a4ee2c2d88cedf00000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -6599,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec34000000000000000000000000abfdbdfd20440c6495ca4036807e62bd7b38b88a000000000000000000000000abfdbdfd20440c6495ca4036807e62bd7b38b88a000000000000000000000000000000000000000000000000007ca2b347503fcd00000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -6604,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec34000000000000000000000000f661216d01f19b7510b2231c9011d36fdc43fb28000000000000000000000000f661216d01f19b7510b2231c9011d36fdc43fb28000000000000000000000000000000000000000000000000005833ccd169b17a00000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -6614,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec340000000000000000000000003d0bd436d80ce813267a856167db48f598f2c9dc0000000000000000000000003d0bd436d80ce813267a856167db48f598f2c9dc000000000000000000000000000000000000000000000000009414471f5aa18900000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -6618,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec34000000000000000000000000015a2c6080f554ad428632a89a0743fcf766eacc000000000000000000000000015a2c6080f554ad428632a89a0743fcf766eacc00000000000000000000000000000000000000000000000000038d7ea4c6800000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -6621,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec3400000000000000000000000073b877d6f891d3f621571098b537b756cf028fef00000000000000000000000073b877d6f891d3f621571098b537b756cf028fef0000000000000000000000000000000000000000000000000002d79883d2000000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -6625,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec34000000000000000000000000a3e4254aead0870d17a20624d7b2a466de98d216000000000000000000000000a3e4254aead0870d17a20624d7b2a466de98d216000000000000000000000000000000000000000000000000001c3e38a5b399c000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -6628,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec34000000000000000000000000b1ab8886163021b940362d01e432cd213f74879c000000000000000000000000b1ab8886163021b940362d01e432cd213f74879c000000000000000000000000000000000000000000000000003c6b7e61199c2000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -6631,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec34000000000000000000000000dac1e9ceda1b0576585185c289f3544b3f6f3966000000000000000000000000dac1e9ceda1b0576585185c289f3544b3f6f3966000000000000000000000000000000000000000000000000001b689fb847f50000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -6632,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec34000000000000000000000000874ffb0ec913131bd9c26984f1d9d911c4c897cc000000000000000000000000874ffb0ec913131bd9c26984f1d9d911c4c897cc00000000000000000000000000000000000000000000000000f8b0a10e47000000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -6633,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec340000000000000000000000006e5af1f11ad9856d8c6e1ab27fe2c0c40b579b370000000000000000000000006e5af1f11ad9856d8c6e1ab27fe2c0c40b579b37000000000000000000000000000000000000000000000000002386f26fc1000000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -6634,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec34000000000000000000000000874ffb0ec913131bd9c26984f1d9d911c4c897cc000000000000000000000000874ffb0ec913131bd9c26984f1d9d911c4c897cc0000000000000000000000000000000000000000000000000011c37937e0800000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -6635,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec34000000000000000000000000a13594f72403765bbf45270a74375f2e81a3dc8f000000000000000000000000a13594f72403765bbf45270a74375f2e81a3dc8f000000000000000000000000000000000000000000000000001fc0afcac8d70000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -6636,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec34000000000000000000000000745c0fa858115b9ccc4148fb9b41049e729fdbb5000000000000000000000000745c0fa858115b9ccc4148fb9b41049e729fdbb5000000000000000000000000000000000000000000000000007b52d7d7472ede00000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -6637,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec340000000000000000000000008a8c448e8bbe80b9022bcac1e3a67d9e717e17640000000000000000000000008a8c448e8bbe80b9022bcac1e3a67d9e717e1764000000000000000000000000000000000000000000000000019218a6fffe7f0900000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -6638,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec3400000000000000000000000067dbb60cb215f601e33ae776ea7ca40ad62dcde700000000000000000000000067dbb60cb215f601e33ae776ea7ca40ad62dcde700000000000000000000000000000000000000000000000000470de4df82000000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -6639,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec34000000000000000000000000ca8f7ddeb3ba7864e71e161d6bfc7ef86b1b275d000000000000000000000000ca8f7ddeb3ba7864e71e161d6bfc7ef86b1b275d000000000000000000000000000000000000000000000000004062f5df3b410c00000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -6640,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec3400000000000000000000000069428b8507d725a12a3f367edc79c928a490452b00000000000000000000000069428b8507d725a12a3f367edc79c928a490452b00000000000000000000000000000000000000000000000000aef21da8d16f2400000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -6641,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec34000000000000000000000000d19b5de52d139b4d2c683d986830c6a621474292000000000000000000000000d19b5de52d139b4d2c683d986830c6a62147429200000000000000000000000000000000000000000000000000c1fa5c05b7bbfa00000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -6642,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec34000000000000000000000000fb5cf7ecfddca71ee8d88780d1d5c90dd392c64c000000000000000000000000fb5cf7ecfddca71ee8d88780d1d5c90dd392c64c00000000000000000000000000000000000000000000000000603c37d925fb6600000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -6643,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec340000000000000000000000003d8b19af2638856b3984d02015b6230d1daadbf20000000000000000000000003d8b19af2638856b3984d02015b6230d1daadbf20000000000000000000000000000000000000000000000000018de76816d800000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -6644,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec340000000000000000000000004ad06f116674a878336914171ade46fd8f8a62490000000000000000000000004ad06f116674a878336914171ade46fd8f8a624900000000000000000000000000000000000000000000000000a87b5ce9b3b08b00000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -6645,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec34000000000000000000000000ac16c8fd47716cd64161d8c3f1f804cec36861cb000000000000000000000000ac16c8fd47716cd64161d8c3f1f804cec36861cb0000000000000000000000000000000000000000000000000076b27b40522bd800000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -6646,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec3400000000000000000000000029c0ce4cbd333b5c1eca001ae59cd8587c6970c500000000000000000000000029c0ce4cbd333b5c1eca001ae59cd8587c6970c500000000000000000000000000000000000000000000000000a42fd7776d7d2e00000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -6647,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec3400000000000000000000000016e868c6d41a1a9d4f4d48a1961130c1538524e400000000000000000000000016e868c6d41a1a9d4f4d48a1961130c1538524e4000000000000000000000000000000000000000000000000015971de36d84d8000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -6648,0x10e6593cdda8c58a1d0f14c5164b376352a55f2f,0x467194771dae2967aef3ecbedd3bf9a310c76c65,0xa9f9e6750000000000000000000000006b175474e89094c44da98b954eedeac495271d0f000000000000000000000000da10009cbd5d07dd0cecc66161fc93d7c9000da1000000000000000000000000601496f365423b60fceb676829d8a6598a9d7a0b000000000000000000000000601496f365423b60fceb676829d8a6598a9d7a0b000000000000000000000000000000000000000000000000e54d3e150694144200000000000000000000000000000000000000000000000000000000000000c00000000000000000000000000000000000000000000000000000000000000000,,,1,true -6649,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec3400000000000000000000000090d5713068c4c4f889a086b7cec5044ce773963e00000000000000000000000090d5713068c4c4f889a086b7cec5044ce773963e00000000000000000000000000000000000000000000000000097f30723aa68000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -6650,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec34000000000000000000000000a233deb08bcb3a54b183749398663dad0ec4b55c000000000000000000000000a233deb08bcb3a54b183749398663dad0ec4b55c00000000000000000000000000000000000000000000000000a68b949106aac600000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -6652,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec34000000000000000000000000508e37a6a77620053b5cdf627dd25b30ebe0d0de000000000000000000000000508e37a6a77620053b5cdf627dd25b30ebe0d0de000000000000000000000000000000000000000000000000001fa8a295f4150000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -6653,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec3400000000000000000000000025b3a312525a5a80da92ccd034d1359bff74eedd00000000000000000000000025b3a312525a5a80da92ccd034d1359bff74eedd00000000000000000000000000000000000000000000000000038d7ea4c6800000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -6654,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec34000000000000000000000000cb974bf9c76290d4216a0d2124a213e1167d087a000000000000000000000000cb974bf9c76290d4216a0d2124a213e1167d087a0000000000000000000000000000000000000000000000000001c6bf5263400000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -6655,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec340000000000000000000000008c1c0baccc78de4b02e4f3c83209294ccd462c450000000000000000000000008c1c0baccc78de4b02e4f3c83209294ccd462c4500000000000000000000000000000000000000000000000000038d7ea4c6800000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -6656,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec34000000000000000000000000267d3062be04e8101e2b0522e949f1369dba38dd000000000000000000000000267d3062be04e8101e2b0522e949f1369dba38dd0000000000000000000000000000000000000000000000000001c6bf5263400000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -6657,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec34000000000000000000000000867fe52d01283053bd3edac93ec50a70ff47443f000000000000000000000000867fe52d01283053bd3edac93ec50a70ff47443f00000000000000000000000000000000000000000000000000470de4df82000000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -6659,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec34000000000000000000000000fc62c6c6ac36ce092da2110be9cd8b7ce8031173000000000000000000000000fc62c6c6ac36ce092da2110be9cd8b7ce80311730000000000000000000000000000000000000000000000000001c6bf5263400000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -6660,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec34000000000000000000000000e6d5b68f4c928d709182f06b4279c09240d2ad89000000000000000000000000e6d5b68f4c928d709182f06b4279c09240d2ad8900000000000000000000000000000000000000000000000000038d7ea4c6800000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -6661,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec34000000000000000000000000d6f8157f6e36763ea04af3969ae519f74b202012000000000000000000000000d6f8157f6e36763ea04af3969ae519f74b2020120000000000000000000000000000000000000000000000000001c6bf5263400000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -6662,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec340000000000000000000000005f62cd4ff9291c5745139043c8882061a8d4b4360000000000000000000000005f62cd4ff9291c5745139043c8882061a8d4b4360000000000000000000000000000000000000000000000000001c6bf5263400000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -6663,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec340000000000000000000000000063d80caa6d0ea78f9a502c9c2c8b5079a666d60000000000000000000000000063d80caa6d0ea78f9a502c9c2c8b5079a666d60000000000000000000000000000000000000000000000000001c6bf5263400000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -6664,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec34000000000000000000000000ff071c783c770c715575fd1c3948ca8808d09ba1000000000000000000000000ff071c783c770c715575fd1c3948ca8808d09ba10000000000000000000000000000000000000000000000000001c6bf5263400000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -6665,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec34000000000000000000000000f6d4f52d978252947554a529fe151833c2441988000000000000000000000000f6d4f52d978252947554a529fe151833c244198800000000000000000000000000000000000000000000000000038d7ea4c6800000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -6666,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec34000000000000000000000000286f9209ad18ecb53e655a2b2d67ba4836eca37c000000000000000000000000286f9209ad18ecb53e655a2b2d67ba4836eca37c0000000000000000000000000000000000000000000000000001c6bf5263400000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -6667,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec3400000000000000000000000025b3a312525a5a80da92ccd034d1359bff74eedd00000000000000000000000025b3a312525a5a80da92ccd034d1359bff74eedd00000000000000000000000000000000000000000000000000038d7ea4c6800000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -6668,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec34000000000000000000000000c7e4efc63d964fb54d158f935da146bc1d110111000000000000000000000000c7e4efc63d964fb54d158f935da146bc1d11011100000000000000000000000000000000000000000000000000038d7ea4c6800000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -6669,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec3400000000000000000000000067483bd638e743def96cc6ec22370890e806266700000000000000000000000067483bd638e743def96cc6ec22370890e80626670000000000000000000000000000000000000000000000000001c6bf5263400000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -6670,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec3400000000000000000000000025ab40e11289f84c7922d6c9701482d2ce71bb3b00000000000000000000000025ab40e11289f84c7922d6c9701482d2ce71bb3b00000000000000000000000000000000000000000000000000038d7ea4c6800000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -6671,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec34000000000000000000000000bc83d4d0356f65da131cad32ddee510ffbe299c9000000000000000000000000bc83d4d0356f65da131cad32ddee510ffbe299c900000000000000000000000000000000000000000000000000038d7ea4c6800000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -6672,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec34000000000000000000000000dd8cbf8346fd11605d3ab90f70119f16c96c36d7000000000000000000000000dd8cbf8346fd11605d3ab90f70119f16c96c36d70000000000000000000000000000000000000000000000000001c6bf5263400000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -6673,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec3400000000000000000000000071ef8f6abd528f29ff6f72fa065e28e029a4333f00000000000000000000000071ef8f6abd528f29ff6f72fa065e28e029a4333f00000000000000000000000000000000000000000000000000038d7ea4c6800000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -6674,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec34000000000000000000000000c3e756bc7166c59a16feaecf6f4ef79809602500000000000000000000000000c3e756bc7166c59a16feaecf6f4ef7980960250000000000000000000000000000000000000000000000000000038d7ea4c6800000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -6675,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec340000000000000000000000001e9b8031a39b2d7c75923b7bb008c68aff0857770000000000000000000000001e9b8031a39b2d7c75923b7bb008c68aff08577700000000000000000000000000000000000000000000000000038d7ea4c6800000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -6676,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec34000000000000000000000000718f4656f2ca7651703b8fc4f0f4bdfef6c2f5f4000000000000000000000000718f4656f2ca7651703b8fc4f0f4bdfef6c2f5f40000000000000000000000000000000000000000000000000001c6bf5263400000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -6677,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec340000000000000000000000003d17e59eddd8ece9dee0a080a59ec054f1f088cc0000000000000000000000003d17e59eddd8ece9dee0a080a59ec054f1f088cc00000000000000000000000000000000000000000000000000027ca57357c00000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -6678,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec340000000000000000000000009f40ec377e00a8824af15fda1f594f7529a244950000000000000000000000009f40ec377e00a8824af15fda1f594f7529a244950000000000000000000000000000000000000000000000000001c6bf5263400000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -6679,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec340000000000000000000000003e869afc9e11808553dd26cb14e3a6e4d02f81880000000000000000000000003e869afc9e11808553dd26cb14e3a6e4d02f818800000000000000000000000000000000000000000000000000027ca57357c00000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -6681,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec34000000000000000000000000effc506ccea7885f1e9b083ca335f5461c825055000000000000000000000000effc506ccea7885f1e9b083ca335f5461c82505500000000000000000000000000000000000000000000000000038d7ea4c6800000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -6682,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec3400000000000000000000000057b8aa42c89c1665d5bbf2a905b5e13b88a2c2ca00000000000000000000000057b8aa42c89c1665d5bbf2a905b5e13b88a2c2ca000000000000000000000000000000000000000000000000005bb1030379c58000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -6683,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec34000000000000000000000000615dc9211890d374b5e8238aa0a1e1d610dae2a3000000000000000000000000615dc9211890d374b5e8238aa0a1e1d610dae2a30000000000000000000000000000000000000000000000000001c6bf5263400000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -6684,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec3400000000000000000000000015ba2529b499a8d4a1f2023b2cccef67255b223300000000000000000000000015ba2529b499a8d4a1f2023b2cccef67255b223300000000000000000000000000000000000000000000000000027ca57357c00000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -6685,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec34000000000000000000000000b58dd5de6947a9af979b6319c7764d00d86599ee000000000000000000000000b58dd5de6947a9af979b6319c7764d00d86599ee00000000000000000000000000000000000000000000000000038d7ea4c6800000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -6686,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec340000000000000000000000001533a8bee6a563156b93cd173e0b082aed5977a10000000000000000000000001533a8bee6a563156b93cd173e0b082aed5977a10000000000000000000000000000000000000000000000000001c6bf5263400000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -6687,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec3400000000000000000000000075334ff3095e21595eeda01a6cf45e3344561abc00000000000000000000000075334ff3095e21595eeda01a6cf45e3344561abc00000000000000000000000000000000000000000000000000038d7ea4c6800000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -6688,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec34000000000000000000000000a332a063fa84977d9b3e702e82832a4263d63eef000000000000000000000000a332a063fa84977d9b3e702e82832a4263d63eef0000000000000000000000000000000000000000000000000001c6bf5263400000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -6689,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0xa9f9e675000000000000000000000000dac17f958d2ee523a2206206994597c13d831ec700000000000000000000000094b008aa00579c1307b0ef2c499ad98a8ce58e5800000000000000000000000096283598b4f1ff22d25938c38e4fd6c20c74bb3300000000000000000000000096283598b4f1ff22d25938c38e4fd6c20c74bb3300000000000000000000000000000000000000000000000000000000003157ed00000000000000000000000000000000000000000000000000000000000000c00000000000000000000000000000000000000000000000000000000000000000,,,1,true -6690,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec340000000000000000000000000284439da6039b2e2fdd4dca08444856b9b7a6b90000000000000000000000000284439da6039b2e2fdd4dca08444856b9b7a6b90000000000000000000000000000000000000000000000000017c917612441de00000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -6691,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec340000000000000000000000005ae2795fbfe8c0f9cd111b7b10ffb7aef69c5d000000000000000000000000005ae2795fbfe8c0f9cd111b7b10ffb7aef69c5d000000000000000000000000000000000000000000000000000001c6bf5263400000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -6692,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec34000000000000000000000000acf2b39a6fe489cbcbcb34d767f2c1ede152e3ff000000000000000000000000acf2b39a6fe489cbcbcb34d767f2c1ede152e3ff0000000000000000000000000000000000000000000000000001c6bf5263400000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -6693,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec340000000000000000000000003162d262871948881d5c7829d97ef60945a486540000000000000000000000003162d262871948881d5c7829d97ef60945a486540000000000000000000000000000000000000000000000000001c6bf5263400000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -6694,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec34000000000000000000000000fd3beee5318121bd40a84db070da51799df6e42d000000000000000000000000fd3beee5318121bd40a84db070da51799df6e42d00000000000000000000000000000000000000000000000000487fd36235eb2b00000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -6695,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec34000000000000000000000000a5f7c27187665f1493257f215bab01513d945bd0000000000000000000000000a5f7c27187665f1493257f215bab01513d945bd00000000000000000000000000000000000000000000000000001c6bf5263400000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -6696,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec34000000000000000000000000b9b95c3e7b283df258a8243989d57d234290e7ee000000000000000000000000b9b95c3e7b283df258a8243989d57d234290e7ee0000000000000000000000000000000000000000000000000001c6bf5263400000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -6697,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec340000000000000000000000005ce9f98f11357a8cefc00ae30c5bb631d1358f270000000000000000000000005ce9f98f11357a8cefc00ae30c5bb631d1358f270000000000000000000000000000000000000000000000000001c6bf5263400000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -6698,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec340000000000000000000000008137d0a34a169af74193b378982ec2799beafefa0000000000000000000000008137d0a34a169af74193b378982ec2799beafefa0000000000000000000000000000000000000000000000000001c6bf5263400000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -6699,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec34000000000000000000000000e067258fd4a337568325fe9013bdf5f863556941000000000000000000000000e067258fd4a337568325fe9013bdf5f8635569410000000000000000000000000000000000000000000000000015e886c679eb7000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -6700,0x10e6593cdda8c58a1d0f14c5164b376352a55f2f,0x467194771dae2967aef3ecbedd3bf9a310c76c65,0xa9f9e6750000000000000000000000006b175474e89094c44da98b954eedeac495271d0f000000000000000000000000da10009cbd5d07dd0cecc66161fc93d7c9000da1000000000000000000000000f33f8b6dde723ad36be008d958418cbef9362f79000000000000000000000000f33f8b6dde723ad36be008d958418cbef9362f79000000000000000000000000000000000000000000000011fe9fb60ff9246d8f00000000000000000000000000000000000000000000000000000000000000c00000000000000000000000000000000000000000000000000000000000000000,0x399ae0fd92433078e23ab91f3dd853fa0ffb6010d68ab5b4af786aba1b5db633,2022-03-08 08:28:26.000 UTC,0,true -6701,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec340000000000000000000000000583ed46aeb355b2ac96e5225ec3d6004077965b0000000000000000000000000583ed46aeb355b2ac96e5225ec3d6004077965b0000000000000000000000000000000000000000000000000001c6bf5263400000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -6702,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec340000000000000000000000003e780e711a483d291d25f8a6b3e17c71dd71f7860000000000000000000000003e780e711a483d291d25f8a6b3e17c71dd71f78600000000000000000000000000000000000000000000000000019e82c4f47a5f00000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -6703,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec34000000000000000000000000da42e741a6c75ef7a644574485d530667b4cc509000000000000000000000000da42e741a6c75ef7a644574485d530667b4cc5090000000000000000000000000000000000000000000000000001c6bf5263400000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -6705,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec3400000000000000000000000096f838cccf3299b4a456f39c393c0d6ec959649000000000000000000000000096f838cccf3299b4a456f39c393c0d6ec95964900000000000000000000000000000000000000000000000000001c6bf5263400000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -6706,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec34000000000000000000000000989b82ed1e240597c0ead2e1734235784ff865c0000000000000000000000000989b82ed1e240597c0ead2e1734235784ff865c000000000000000000000000000000000000000000000000000985792b17b37c200000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -6707,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec34000000000000000000000000e9d52c08223533751fea859b8751b10617fea736000000000000000000000000e9d52c08223533751fea859b8751b10617fea7360000000000000000000000000000000000000000000000000001c6bf5263400000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -6708,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec34000000000000000000000000dae14824041cb79bc4b6b036fc398e6fcd17af36000000000000000000000000dae14824041cb79bc4b6b036fc398e6fcd17af360000000000000000000000000000000000000000000000000001c6bf5263400000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -6709,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec34000000000000000000000000ef8c15fd7476664e3ce5c5dc1bf1a41587eaa9df000000000000000000000000ef8c15fd7476664e3ce5c5dc1bf1a41587eaa9df0000000000000000000000000000000000000000000000000001c6bf5263400000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -6710,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec340000000000000000000000005c0ab71b90e97662bbd2ce0bd50663a3218925f80000000000000000000000005c0ab71b90e97662bbd2ce0bd50663a3218925f80000000000000000000000000000000000000000000000000001c6bf5263400000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -6711,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec34000000000000000000000000eb665bba0648c249e6e80d254610d8722cf16e06000000000000000000000000eb665bba0648c249e6e80d254610d8722cf16e06000000000000000000000000000000000000000000000000000aa87bee53800000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -6713,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec340000000000000000000000002d06a071d682387800aa4cfdf4bc041286fae29c0000000000000000000000002d06a071d682387800aa4cfdf4bc041286fae29c0000000000000000000000000000000000000000000000000001c6bf5263400000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -6714,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec34000000000000000000000000c2427fc07cb9eba0524813f81628b40a6e085008000000000000000000000000c2427fc07cb9eba0524813f81628b40a6e085008000000000000000000000000000000000000000000000000005c4d9ced308fbf00000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -6715,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec34000000000000000000000000a78ef0a38e4f7e6de8c1188bf1e23be7fde6d163000000000000000000000000a78ef0a38e4f7e6de8c1188bf1e23be7fde6d1630000000000000000000000000000000000000000000000000001c6bf5263400000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -6716,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec34000000000000000000000000593a39b3049a37b69aa20f76e1ba82cf4dd3d8df000000000000000000000000593a39b3049a37b69aa20f76e1ba82cf4dd3d8df0000000000000000000000000000000000000000000000000001c6bf5263400000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -6717,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec3400000000000000000000000068e227245a15aebffb30e2119ac8471b2d585fe700000000000000000000000068e227245a15aebffb30e2119ac8471b2d585fe7000000000000000000000000000000000000000000000000002bf638399c56cd00000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -6718,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec34000000000000000000000000743ee42aea17236e6e352291f5af19985340b5ef000000000000000000000000743ee42aea17236e6e352291f5af19985340b5ef0000000000000000000000000000000000000000000000000001c6bf5263400000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -6719,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec340000000000000000000000009a6875bd4551e2ce409735128cc3ea0f679dde450000000000000000000000009a6875bd4551e2ce409735128cc3ea0f679dde450000000000000000000000000000000000000000000000000001c6bf5263400000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -6721,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec34000000000000000000000000a24ef7cb10bbf9a13f72efee6704dd2ed00a7a37000000000000000000000000a24ef7cb10bbf9a13f72efee6704dd2ed00a7a37000000000000000000000000000000000000000000000000004fea443334973000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -6723,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec340000000000000000000000009ddc3b986528d899d6e8c83b43854f239a8ce9370000000000000000000000009ddc3b986528d899d6e8c83b43854f239a8ce9370000000000000000000000000000000000000000000000000001c6bf5263400000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -6724,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec340000000000000000000000002739490a39ecd9627a4a62c6a09d3cccb7d0cce10000000000000000000000002739490a39ecd9627a4a62c6a09d3cccb7d0cce1000000000000000000000000000000000000000000000000000137ed63e19a9a00000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -6725,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec34000000000000000000000000aa4efd397ed95854a1aabbd0d3c0f9a22583aca7000000000000000000000000aa4efd397ed95854a1aabbd0d3c0f9a22583aca700000000000000000000000000000000000000000000000000071afd498d000000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -6726,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec34000000000000000000000000bfd7b3c53d7e9dff11c8325c3fdad957849de552000000000000000000000000bfd7b3c53d7e9dff11c8325c3fdad957849de5520000000000000000000000000000000000000000000000000001c6bf5263400000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -6727,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec3400000000000000000000000050eae46b07f2773c9743f393df2a546a0a5bd08e00000000000000000000000050eae46b07f2773c9743f393df2a546a0a5bd08e00000000000000000000000000000000000000000000000000193f6ba6304c0000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -6729,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec34000000000000000000000000d6227a80ffeba38ea32ab6b9713be920289cb3cf000000000000000000000000d6227a80ffeba38ea32ab6b9713be920289cb3cf0000000000000000000000000000000000000000000000000001c6bf5263400000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -6731,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec3400000000000000000000000017ed4599964c08a7e87ac85d5260fac711dcb20800000000000000000000000017ed4599964c08a7e87ac85d5260fac711dcb2080000000000000000000000000000000000000000000000000001064b62f3e60600000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -6732,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec34000000000000000000000000dd128dd4f3bc1087003b118f7b605d0acecc87af000000000000000000000000dd128dd4f3bc1087003b118f7b605d0acecc87af0000000000000000000000000000000000000000000000000001c6bf5263400000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -6733,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec340000000000000000000000001a86efb65073925ab10a0d7afcd380de728e8a940000000000000000000000001a86efb65073925ab10a0d7afcd380de728e8a9400000000000000000000000000000000000000000000000000038d7ea4c6800000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -6734,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec34000000000000000000000000cc948a999aa852f1be4059cb9a35c3b0c7d8d5c7000000000000000000000000cc948a999aa852f1be4059cb9a35c3b0c7d8d5c70000000000000000000000000000000000000000000000000001c6bf5263400000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -6735,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec34000000000000000000000000da074a0cea8b865dcd6f29840c7cc43117d7e7cf000000000000000000000000da074a0cea8b865dcd6f29840c7cc43117d7e7cf00000000000000000000000000000000000000000000000000053cd2d6ecc36900000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -6736,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec34000000000000000000000000b4ec5cbec873b8b856151707bbc108959b878d60000000000000000000000000b4ec5cbec873b8b856151707bbc108959b878d600000000000000000000000000000000000000000000000000001c6bf5263400000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -6737,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec34000000000000000000000000d910066ad7695771c59596b7d18a5b17a1e19fa9000000000000000000000000d910066ad7695771c59596b7d18a5b17a1e19fa900000000000000000000000000000000000000000000000000604051253ea9f300000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -6738,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec3400000000000000000000000078aa649f3650210370473af4d2e76d0134bad04200000000000000000000000078aa649f3650210370473af4d2e76d0134bad04200000000000000000000000000000000000000000000000000038d7ea4c6800000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -6739,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec3400000000000000000000000061797bbe124100ed5ccab9563e846d4032e6bddb00000000000000000000000061797bbe124100ed5ccab9563e846d4032e6bddb0000000000000000000000000000000000000000000000000002f31db95900f100000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -6740,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec340000000000000000000000000d70cb8d1d6f6c5c0103590aaaa89728ef1c71bc0000000000000000000000000d70cb8d1d6f6c5c0103590aaaa89728ef1c71bc0000000000000000000000000000000000000000000000000001c6bf5263400000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -6742,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec3400000000000000000000000078aa649f3650210370473af4d2e76d0134bad04200000000000000000000000078aa649f3650210370473af4d2e76d0134bad0420000000000000000000000000000000000000000000000000018de76816d800000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -6743,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec340000000000000000000000002e8b2321803b479333c94415e8d5a6ea62bb7af50000000000000000000000002e8b2321803b479333c94415e8d5a6ea62bb7af50000000000000000000000000000000000000000000000000001c6bf5263400000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -6744,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec3400000000000000000000000068990547d34fc703c923be5ffe823b73005accc800000000000000000000000068990547d34fc703c923be5ffe823b73005accc80000000000000000000000000000000000000000000000000001c6bf5263400000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -6745,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec340000000000000000000000001a86efb65073925ab10a0d7afcd380de728e8a940000000000000000000000001a86efb65073925ab10a0d7afcd380de728e8a94000000000000000000000000000000000000000000000000001c6bf52634000000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -6746,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec34000000000000000000000000debbca93d481a510ce1b84a6413b8b4b858b17f0000000000000000000000000debbca93d481a510ce1b84a6413b8b4b858b17f0000000000000000000000000000000000000000000000000000427b31cbf515a00000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -6747,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec340000000000000000000000005cfbcbf4b01eac0631b0a2864f670e829716390b0000000000000000000000005cfbcbf4b01eac0631b0a2864f670e829716390b0000000000000000000000000000000000000000000000000001c6bf5263400000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -6748,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec34000000000000000000000000f4867a97a644c0ba2cfa01251c5f444247e1d4a9000000000000000000000000f4867a97a644c0ba2cfa01251c5f444247e1d4a90000000000000000000000000000000000000000000000000005543df729c00000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -6749,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec34000000000000000000000000ea0cfed9a954ef5058bea5489932759fe433bd25000000000000000000000000ea0cfed9a954ef5058bea5489932759fe433bd250000000000000000000000000000000000000000000000000001bd64e8a389c500000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -6750,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec340000000000000000000000000a0f8028a63bee304d331e54a420a581bcff254d0000000000000000000000000a0f8028a63bee304d331e54a420a581bcff254d000000000000000000000000000000000000000000000000002165400ce3800000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -6751,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec34000000000000000000000000cc11da00aaf47cde957b20f8e6ba3289b5b12755000000000000000000000000cc11da00aaf47cde957b20f8e6ba3289b5b1275500000000000000000000000000000000000000000000000000ae0cdb8be3fe0000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -6752,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec34000000000000000000000000cd5f81f7a74b48d4d7bc9014ef8bbfe68adff7ef000000000000000000000000cd5f81f7a74b48d4d7bc9014ef8bbfe68adff7ef0000000000000000000000000000000000000000000000000001c6bf5263400000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -6753,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec34000000000000000000000000255ae1b7ea3e90a693c577116a9a6b9e8ad9d7a0000000000000000000000000255ae1b7ea3e90a693c577116a9a6b9e8ad9d7a00000000000000000000000000000000000000000000000000019de182d7fa29f00000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -6754,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec340000000000000000000000001f13e23fca742b91b5dd0ce6dbdbaade23d5a8510000000000000000000000001f13e23fca742b91b5dd0ce6dbdbaade23d5a851000000000000000000000000000000000000000000000000000c1448303c800000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -6755,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec340000000000000000000000002d4e3332ad0148a1f9dc2c3f22962a4ac01fe9380000000000000000000000002d4e3332ad0148a1f9dc2c3f22962a4ac01fe93800000000000000000000000000000000000000000000000000049db5c31bba7c00000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -6756,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec34000000000000000000000000dd05389364119733c81c11326f2a10c5525674da000000000000000000000000dd05389364119733c81c11326f2a10c5525674da00000000000000000000000000000000000000000000000000320c0d1cca362100000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -6757,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec34000000000000000000000000ddd57633ec77f9c4dae0eb10ec3ae92e8bf2b8c7000000000000000000000000ddd57633ec77f9c4dae0eb10ec3ae92e8bf2b8c70000000000000000000000000000000000000000000000000001c6bf5263400000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -6758,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec34000000000000000000000000f7685b061bcbe69aa0f5805b0f9044fe27c26219000000000000000000000000f7685b061bcbe69aa0f5805b0f9044fe27c2621900000000000000000000000000000000000000000000000000a79e07db20f27000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -6759,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec340000000000000000000000006ec6295bf707b896efe73fb9f9a8aca0855c22460000000000000000000000006ec6295bf707b896efe73fb9f9a8aca0855c2246000000000000000000000000000000000000000000000000000818ccbc67cec000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -6760,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec340000000000000000000000007f3dec91e024382085c5eb75c53c9e1affcddcda0000000000000000000000007f3dec91e024382085c5eb75c53c9e1affcddcda000000000000000000000000000000000000000000000000000e35fa931a000000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -6761,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec34000000000000000000000000e85a3e42bcb125c4f002877590783cfe043af38a000000000000000000000000e85a3e42bcb125c4f002877590783cfe043af38a0000000000000000000000000000000000000000000000000001c6bf5263400000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -6762,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec34000000000000000000000000382f7e0d466fde37662adab977b43ff3408fbadc000000000000000000000000382f7e0d466fde37662adab977b43ff3408fbadc00000000000000000000000000000000000000000000000000016bcc41e9000000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -6763,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec3400000000000000000000000061df273850e894883ea2a07abb83412bd3ac7ac300000000000000000000000061df273850e894883ea2a07abb83412bd3ac7ac30000000000000000000000000000000000000000000000000001c6bf5263400000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -6764,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec340000000000000000000000002bd7911ad761733ed33e5c3759c11ac8950a9b810000000000000000000000002bd7911ad761733ed33e5c3759c11ac8950a9b8100000000000000000000000000000000000000000000000000016bcc41e9000000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -6765,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec340000000000000000000000003ec20a48606ed812d4ff83cddff24f056e9567a00000000000000000000000003ec20a48606ed812d4ff83cddff24f056e9567a00000000000000000000000000000000000000000000000000001c6bf5263400000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -6766,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec340000000000000000000000003e04e81d73664ab466181f467d37b065021e78b50000000000000000000000003e04e81d73664ab466181f467d37b065021e78b500000000000000000000000000000000000000000000000001902e262da0e2d700000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -6767,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec340000000000000000000000005d752d7f9ac9b31181ad78a8ff650d3bfaa56b3a0000000000000000000000005d752d7f9ac9b31181ad78a8ff650d3bfaa56b3a0000000000000000000000000000000000000000000000000056308a22b602f200000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -6768,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec34000000000000000000000000562156551d44f126d4a062c1acf3982191f9e75f000000000000000000000000562156551d44f126d4a062c1acf3982191f9e75f00000000000000000000000000000000000000000000000000016bcc41e9000000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -6769,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec34000000000000000000000000338485735554d67e60826cf8a7a0f16168657301000000000000000000000000338485735554d67e60826cf8a7a0f161686573010000000000000000000000000000000000000000000000000001c6bf5263400000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -6770,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec3400000000000000000000000094c4ddf43ad5caf17155961c427b3bca8fcb5e6700000000000000000000000094c4ddf43ad5caf17155961c427b3bca8fcb5e670000000000000000000000000000000000000000000000000001c6bf5263400000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -6771,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec34000000000000000000000000dbf1ac97a4174328ed8f72f973f6048e9ea7eef2000000000000000000000000dbf1ac97a4174328ed8f72f973f6048e9ea7eef2000000000000000000000000000000000000000000000000000110d9316ec00000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -6772,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec34000000000000000000000000661e6111844f9e63c9c9f64ae285fbf771b753a7000000000000000000000000661e6111844f9e63c9c9f64ae285fbf771b753a7000000000000000000000000000000000000000000000000000ec42f934ec70b00000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -6773,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec3400000000000000000000000056ee385e4cb6f046cba4bca258888e05d6b2ed3f00000000000000000000000056ee385e4cb6f046cba4bca258888e05d6b2ed3f0000000000000000000000000000000000000000000000000001c6bf5263400000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -6774,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec34000000000000000000000000c82877142407489d1c287b9477c5dd207fdd3403000000000000000000000000c82877142407489d1c287b9477c5dd207fdd34030000000000000000000000000000000000000000000000000001c6bf5263400000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -6775,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec340000000000000000000000000fd31e056c2efaea5c7f2434361675c86aa46b190000000000000000000000000fd31e056c2efaea5c7f2434361675c86aa46b190000000000000000000000000000000000000000000000000000b5e620f4800000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -6776,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec34000000000000000000000000bdfa32808e6c14fd1a237271fecc6e4e65332213000000000000000000000000bdfa32808e6c14fd1a237271fecc6e4e653322130000000000000000000000000000000000000000000000000000b5e620f4800000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -6777,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec340000000000000000000000005455f0d4c30bdf9674e4ab2874e9c35ee56bb1750000000000000000000000005455f0d4c30bdf9674e4ab2874e9c35ee56bb1750000000000000000000000000000000000000000000000000001c6bf5263400000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -6778,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec3400000000000000000000000092db20ba1eef01e50ee4b77aadc381a13a6e5c9b00000000000000000000000092db20ba1eef01e50ee4b77aadc381a13a6e5c9b0000000000000000000000000000000000000000000000000000b5e620f4800000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -6779,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec34000000000000000000000000b070973752ee0d32b297fae01fc949b1f8895458000000000000000000000000b070973752ee0d32b297fae01fc949b1f88954580000000000000000000000000000000000000000000000000001c6bf5263400000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -6780,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec34000000000000000000000000d20cefb170c77788c958b33c3d3c1df5001c0081000000000000000000000000d20cefb170c77788c958b33c3d3c1df5001c00810000000000000000000000000000000000000000000000000001c6bf5263400000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -6781,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec34000000000000000000000000f2df6eb279693cd4df01b3cee95ad7edd6c18a49000000000000000000000000f2df6eb279693cd4df01b3cee95ad7edd6c18a490000000000000000000000000000000000000000000000000000b5e620f4800000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -6782,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec34000000000000000000000000bd6d9d0e7a11eca7be5dc7617901203e8fb90c73000000000000000000000000bd6d9d0e7a11eca7be5dc7617901203e8fb90c730000000000000000000000000000000000000000000000000001c6bf5263400000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -6783,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec340000000000000000000000008f2dd81fc7b7a5d603864c4bbc0b5a0db2b818560000000000000000000000008f2dd81fc7b7a5d603864c4bbc0b5a0db2b818560000000000000000000000000000000000000000000000000000b5e620f4800000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -6784,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec340000000000000000000000005ffb52199b115b695aa1b0153bb6f167330de7550000000000000000000000005ffb52199b115b695aa1b0153bb6f167330de7550000000000000000000000000000000000000000000000000001c6bf5263400000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -6785,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec340000000000000000000000005dbbc46e95b9abb77a49296b0baf6e464cefe8da0000000000000000000000005dbbc46e95b9abb77a49296b0baf6e464cefe8da0000000000000000000000000000000000000000000000000001c6bf5263400000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -6786,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec340000000000000000000000009790062ed975a3d3df2926fe677a970d63608b030000000000000000000000009790062ed975a3d3df2926fe677a970d63608b03000000000000000000000000000000000000000000000000000110d9316ec00000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -6787,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec34000000000000000000000000e8300f627164a1bfd983b43e7b75825f0ac3d659000000000000000000000000e8300f627164a1bfd983b43e7b75825f0ac3d6590000000000000000000000000000000000000000000000000016932a38a315ff00000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -6789,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec340000000000000000000000006743dc6c402b4ec457d243a3fe39b5fd3cbd68a60000000000000000000000006743dc6c402b4ec457d243a3fe39b5fd3cbd68a6000000000000000000000000000000000000000000000000001e82bdbc5dc65c00000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -6790,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec340000000000000000000000005fe4c41bdc99fc8c93b443a048fe453fd480263f0000000000000000000000005fe4c41bdc99fc8c93b443a048fe453fd480263f0000000000000000000000000000000000000000000000000001c6bf5263400000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -6791,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec34000000000000000000000000f9f170e6ce173e753ecc2161676a89a45e413d6d000000000000000000000000f9f170e6ce173e753ecc2161676a89a45e413d6d00000000000000000000000000000000000000000000000000a4928b3a8663a000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -6792,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec340000000000000000000000007f77cec2fcaa9cd0cd57207fff081791433da5420000000000000000000000007f77cec2fcaa9cd0cd57207fff081791433da5420000000000000000000000000000000000000000000000000001c6bf5263400000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -6793,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec3400000000000000000000000073d5cee28154860b4c74544e97243e24c498eb9400000000000000000000000073d5cee28154860b4c74544e97243e24c498eb940000000000000000000000000000000000000000000000000001c6bf5263400000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -6794,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec34000000000000000000000000f3c90e136e0ef3a784a409fd03ebdc441d281bba000000000000000000000000f3c90e136e0ef3a784a409fd03ebdc441d281bba000000000000000000000000000000000000000000000000000110d9316ec00000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -6795,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec3400000000000000000000000077f957271c6603f5e09f98ae3a832fc807b9f5ba00000000000000000000000077f957271c6603f5e09f98ae3a832fc807b9f5ba0000000000000000000000000000000000000000000000000001c6bf5263400000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -6796,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec34000000000000000000000000cf494685a64273fd97682572c4d18ac3a8dd8541000000000000000000000000cf494685a64273fd97682572c4d18ac3a8dd8541000000000000000000000000000000000000000000000000000110d9316ec00000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -6797,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec34000000000000000000000000e55b4c05d74d84931a513f3c7b37d609a487c0ea000000000000000000000000e55b4c05d74d84931a513f3c7b37d609a487c0ea0000000000000000000000000000000000000000000000000001c6bf5263400000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -6798,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec3400000000000000000000000026ef3b71bd9fb55cd9e5e78cc00cf47c469e607100000000000000000000000026ef3b71bd9fb55cd9e5e78cc00cf47c469e6071000000000000000000000000000000000000000000000000000110d9316ec00000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -6799,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec340000000000000000000000003ee2bf824a123cdeaafae3a48d815389346592ff0000000000000000000000003ee2bf824a123cdeaafae3a48d815389346592ff0000000000000000000000000000000000000000000000000001c6bf5263400000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -6800,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec3400000000000000000000000052018495652d3306a488c491cf26814ce2cb0efc00000000000000000000000052018495652d3306a488c491cf26814ce2cb0efc000000000000000000000000000000000000000000000000000110d9316ec00000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -6801,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec340000000000000000000000003b86f41e27467435e82602009db717f22f7dbb6f0000000000000000000000003b86f41e27467435e82602009db717f22f7dbb6f0000000000000000000000000000000000000000000000000000b5e620f4800000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -6802,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec34000000000000000000000000dd6f5a15a452ae14538624da5035fd86d2bdd4e0000000000000000000000000dd6f5a15a452ae14538624da5035fd86d2bdd4e00000000000000000000000000000000000000000000000000001c6bf5263400000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -6803,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec340000000000000000000000000c00b37353608eaa0602304b68eab325914799310000000000000000000000000c00b37353608eaa0602304b68eab325914799310000000000000000000000000000000000000000000000000072bfc62055f97500000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -6804,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec340000000000000000000000004ea73574617b991c15be1ab57fc018465d29147b0000000000000000000000004ea73574617b991c15be1ab57fc018465d29147b000000000000000000000000000000000000000000000000000110d9316ec00000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -6805,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec34000000000000000000000000158e1aa7940735af8edaca168bf60e5707ff91d0000000000000000000000000158e1aa7940735af8edaca168bf60e5707ff91d00000000000000000000000000000000000000000000000000001c6bf5263400000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -6807,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec340000000000000000000000000d7e9f89c3cf7a6ea7e820ae8737ec624f6586c70000000000000000000000000d7e9f89c3cf7a6ea7e820ae8737ec624f6586c7000000000000000000000000000000000000000000000000000110d9316ec00000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -6808,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec3400000000000000000000000062df12cc459f484e670845804706849fcc83788500000000000000000000000062df12cc459f484e670845804706849fcc8378850000000000000000000000000000000000000000000000000001c6bf5263400000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -6809,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec340000000000000000000000004a70d9c59ad7418abec8155ec8154ade6d1a31c50000000000000000000000004a70d9c59ad7418abec8155ec8154ade6d1a31c50000000000000000000000000000000000000000000000000001c6bf5263400000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -6810,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec340000000000000000000000001907037c1acf968cefa05f730ccdc522b94720ad0000000000000000000000001907037c1acf968cefa05f730ccdc522b94720ad0000000000000000000000000000000000000000000000000001c6bf5263400000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -6811,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec34000000000000000000000000b5fe3482344526cf9d6234703c074e3880907b8b000000000000000000000000b5fe3482344526cf9d6234703c074e3880907b8b0000000000000000000000000000000000000000000000000001c6bf5263400000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -6812,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec34000000000000000000000000f97722f8c20461c77da6b696f41b5b908c6cf6b5000000000000000000000000f97722f8c20461c77da6b696f41b5b908c6cf6b50000000000000000000000000000000000000000000000000000b5e620f4800000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -6813,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec3400000000000000000000000031e9b62825f0ffa39cf95df3eba4e97065fee33700000000000000000000000031e9b62825f0ffa39cf95df3eba4e97065fee3370000000000000000000000000000000000000000000000000001c6bf5263400000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -6814,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec34000000000000000000000000da1c3d4df3281ca6a6b14bde37a509959a096759000000000000000000000000da1c3d4df3281ca6a6b14bde37a509959a096759000000000000000000000000000000000000000000000000008a663c5a4fdf8b00000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,0xd2c242f68eec50d30940c9d17f2662e138ad8440be1385d24ed142ccb8ed043f,2022-02-04 00:49:13.000 UTC,0,true -6815,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec34000000000000000000000000610dd633fc5d2f573b10b1b614a00c5d6d75b451000000000000000000000000610dd633fc5d2f573b10b1b614a00c5d6d75b4510000000000000000000000000000000000000000000000000001c6bf5263400000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -6816,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec340000000000000000000000002dd057787bd3301549277f7e93b5b5380ec4b5470000000000000000000000002dd057787bd3301549277f7e93b5b5380ec4b5470000000000000000000000000000000000000000000000000000e35fa931a00000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -6817,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec3400000000000000000000000065089bbedf4a46b336c969ae1abdbb79ffe1f60200000000000000000000000065089bbedf4a46b336c969ae1abdbb79ffe1f6020000000000000000000000000000000000000000000000000001c6bf5263400000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -6818,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec34000000000000000000000000cef1526a2e3aacd6a404c69ee7b6a29a3417d3aa000000000000000000000000cef1526a2e3aacd6a404c69ee7b6a29a3417d3aa0000000000000000000000000000000000000000000000000001c6bf5263400000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -6820,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec340000000000000000000000000684ac097ee23a5cf3a74265d34ad557c17d694a0000000000000000000000000684ac097ee23a5cf3a74265d34ad557c17d694a0000000000000000000000000000000000000000000000000000e35fa931a00000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -6822,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec340000000000000000000000003cdc7a4c7185d73cffb7c2e4b3c80a95609d95040000000000000000000000003cdc7a4c7185d73cffb7c2e4b3c80a95609d95040000000000000000000000000000000000000000000000000001c6bf5263400000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -6823,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec3400000000000000000000000064986e67ef13776ac665142cfb10f049f93443a600000000000000000000000064986e67ef13776ac665142cfb10f049f93443a6000000000000000000000000000000000000000000000000002eef9496c9af3e00000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -6824,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec34000000000000000000000000ed19639b0bb87b3f5547eaa514e289d4ea79c34c000000000000000000000000ed19639b0bb87b3f5547eaa514e289d4ea79c34c00000000000000000000000000000000000000000000000000a4c0900a5c774600000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -6825,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec3400000000000000000000000019f875200b36f910c05d32cc8016132a7cfbdd2900000000000000000000000019f875200b36f910c05d32cc8016132a7cfbdd290000000000000000000000000000000000000000000000000001c6bf5263400000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -6826,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec34000000000000000000000000f5a67baeb7c7ddfd5e214739e9a4f737ed7f0556000000000000000000000000f5a67baeb7c7ddfd5e214739e9a4f737ed7f05560000000000000000000000000000000000000000000000000001c6bf5263400000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -6827,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec34000000000000000000000000073797185afa718066af2927a916a07daee1edae000000000000000000000000073797185afa718066af2927a916a07daee1edae0000000000000000000000000000000000000000000000000001c6bf5263400000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -6828,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec34000000000000000000000000e5076f22e60df3ab138191b745c5252ed43d5989000000000000000000000000e5076f22e60df3ab138191b745c5252ed43d59890000000000000000000000000000000000000000000000000001c6bf5263400000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -6829,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec34000000000000000000000000fa65879e61241800b5c7f89ab6992920f3c08d75000000000000000000000000fa65879e61241800b5c7f89ab6992920f3c08d750000000000000000000000000000000000000000000000000001c6bf5263400000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -6830,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec3400000000000000000000000013be29e577d8d967cd74b4c5c0452bb5a875e49c00000000000000000000000013be29e577d8d967cd74b4c5c0452bb5a875e49c000000000000000000000000000000000000000000000000000110d9316ec00000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -6831,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec34000000000000000000000000fc2101a89696a4f6f94fb526ffc8a1d97714e81d000000000000000000000000fc2101a89696a4f6f94fb526ffc8a1d97714e81d00000000000000000000000000000000000000000000000000071afd498d000000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -6832,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec34000000000000000000000000e610f8d228a51f3370a4f862234fcbb3ac5cc01b000000000000000000000000e610f8d228a51f3370a4f862234fcbb3ac5cc01b0000000000000000000000000000000000000000000000000001c6bf5263400000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -6834,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec34000000000000000000000000518b77149261f06abab57d7bdfcc10b7577c111c000000000000000000000000518b77149261f06abab57d7bdfcc10b7577c111c0000000000000000000000000000000000000000000000000001c6bf5263400000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -6835,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec34000000000000000000000000b75dad96ff6758f330856f3fdd3a6b873769b2f6000000000000000000000000b75dad96ff6758f330856f3fdd3a6b873769b2f60000000000000000000000000000000000000000000000000001c6bf5263400000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -6836,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec34000000000000000000000000a3cc830800591174492fb5ee692941dfdb6a6a4b000000000000000000000000a3cc830800591174492fb5ee692941dfdb6a6a4b000000000000000000000000000000000000000000000000006fdf9a7a614d2500000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -6837,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec34000000000000000000000000478c189ac3424841b16a11aff581720913c345f4000000000000000000000000478c189ac3424841b16a11aff581720913c345f40000000000000000000000000000000000000000000000000001c6bf5263400000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -6838,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec340000000000000000000000009a898dacad27fb10e1cef7c6a3bb61d08299962c0000000000000000000000009a898dacad27fb10e1cef7c6a3bb61d08299962c0000000000000000000000000000000000000000000000000001c6bf5263400000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -6839,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec34000000000000000000000000d2f89d9e4f8984a5028a9fd7a84e07ac6d5cc430000000000000000000000000d2f89d9e4f8984a5028a9fd7a84e07ac6d5cc4300000000000000000000000000000000000000000000000000001c6bf5263400000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -6840,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec340000000000000000000000007525fc2e118d8e931c820d4d0937d42bc42537280000000000000000000000007525fc2e118d8e931c820d4d0937d42bc425372800000000000000000000000000000000000000000000000000a450e30c8be73400000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -6841,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec340000000000000000000000008f3c1c2ecc94e7117d29629930393186d998ce1b0000000000000000000000008f3c1c2ecc94e7117d29629930393186d998ce1b0000000000000000000000000000000000000000000000000001c6bf5263400000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -6842,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec340000000000000000000000004e224e7e9e6084877856f147ce06a33ccb88eeff0000000000000000000000004e224e7e9e6084877856f147ce06a33ccb88eeff000000000000000000000000000000000000000000000000008305a4a951b09000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -6843,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec340000000000000000000000002cf69d546ea33258d7f14303758dda665ab90f640000000000000000000000002cf69d546ea33258d7f14303758dda665ab90f6400000000000000000000000000000000000000000000000000a733bf557b260200000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -6844,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec34000000000000000000000000f6480446fafda6d13e228cc69eb594ea3a995e74000000000000000000000000f6480446fafda6d13e228cc69eb594ea3a995e74000000000000000000000000000000000000000000000000000bf2e4a1a1868000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -6845,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec34000000000000000000000000d2a8a73cd8f888da3e8beba1fcacf50ab8be301f000000000000000000000000d2a8a73cd8f888da3e8beba1fcacf50ab8be301f000000000000000000000000000000000000000000000000002e478127f3b10000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -6846,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec340000000000000000000000003d662b686995eca77d59a52228afd1bb7188687e0000000000000000000000003d662b686995eca77d59a52228afd1bb7188687e0000000000000000000000000000000000000000000000000073b4c1c535898200000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -6847,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec3400000000000000000000000082932cd9589c1ac167c2a902abd27cd15fcf825000000000000000000000000082932cd9589c1ac167c2a902abd27cd15fcf8250000000000000000000000000000000000000000000000000004ee415767e601900000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -6848,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec3400000000000000000000000091af4e20a9610c0ddd99ee81af75161fedcf9d5100000000000000000000000091af4e20a9610c0ddd99ee81af75161fedcf9d5100000000000000000000000000000000000000000000000000a8fe484cb3c02000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -6849,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec34000000000000000000000000c92d9d1d611c0efe375e32c0aa41b543dcfabc76000000000000000000000000c92d9d1d611c0efe375e32c0aa41b543dcfabc7600000000000000000000000000000000000000000000000000659c3ae8e2f34000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -6850,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec34000000000000000000000000cb84d1fdd67eee26015c46cf938d5f651890e3df000000000000000000000000cb84d1fdd67eee26015c46cf938d5f651890e3df00000000000000000000000000000000000000000000000000a9a4b187e5773c00000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -6851,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec3400000000000000000000000049b48f5d813301700e22e654501156fb2d58c89800000000000000000000000049b48f5d813301700e22e654501156fb2d58c89800000000000000000000000000000000000000000000000000a3ef86815e8ef000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -6852,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec34000000000000000000000000f2ff8196b4ae960e3a1b533857f6f054bffa92fb000000000000000000000000f2ff8196b4ae960e3a1b533857f6f054bffa92fb00000000000000000000000000000000000000000000000001c03f5ff499958d00000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -6854,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec340000000000000000000000000fc0475cecca273e96152768d9739a1b8b9e7c750000000000000000000000000fc0475cecca273e96152768d9739a1b8b9e7c7500000000000000000000000000000000000000000000000000005af3107a400000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -6855,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec340000000000000000000000005180ba6607473001ae52cef5a9f267eb3a2d22580000000000000000000000005180ba6607473001ae52cef5a9f267eb3a2d2258000000000000000000000000000000000000000000000000000110d9316ec00000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -6856,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec340000000000000000000000007e799e5672106f838dacf3a5f2044a2cc8ae6efb0000000000000000000000007e799e5672106f838dacf3a5f2044a2cc8ae6efb000000000000000000000000000000000000000000000000000110d9316ec00000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -6857,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec340000000000000000000000009e2a20d6298438532e4830cd33350541dc057a7e0000000000000000000000009e2a20d6298438532e4830cd33350541dc057a7e000000000000000000000000000000000000000000000000003771aa6e89f50000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -6858,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec34000000000000000000000000055605545adaca40212837f988aa6bd1066b873c000000000000000000000000055605545adaca40212837f988aa6bd1066b873c00000000000000000000000000000000000000000000000000a39d153894c6ff00000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -6859,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec340000000000000000000000007a08bba2a71665cc607af4124f61bdb0983fa37a0000000000000000000000007a08bba2a71665cc607af4124f61bdb0983fa37a0000000000000000000000000000000000000000000000000000b5e620f4800000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -6860,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec34000000000000000000000000681f284c82eb81054d6696acea2020fdc68f7ca3000000000000000000000000681f284c82eb81054d6696acea2020fdc68f7ca3000000000000000000000000000000000000000000000000004fdc3050a9fb8000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,0xf92f12f784cc351b5ce6640e2d0fbe040bdfc91c8fa13fbe2062a6e322af3ef1,2022-05-24 09:00:13.000 UTC,0,true -6861,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec34000000000000000000000000b13a4dbaa41983319782438646f37eaf2fc1ae5e000000000000000000000000b13a4dbaa41983319782438646f37eaf2fc1ae5e000000000000000000000000000000000000000000000000000110d9316ec00000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -6862,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec3400000000000000000000000064ab0caf0bd155a5b696ea4b08c68424bcc16a4400000000000000000000000064ab0caf0bd155a5b696ea4b08c68424bcc16a44000000000000000000000000000000000000000000000000000110d9316ec00000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -6863,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec34000000000000000000000000b359d90f2a827afb6a9e9b84a5d2a99064cd4723000000000000000000000000b359d90f2a827afb6a9e9b84a5d2a99064cd4723000000000000000000000000000000000000000000000000000110d9316ec00000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -6864,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec34000000000000000000000000d39bd8ab97f6421fdb43f64e9af444759a5b1bac000000000000000000000000d39bd8ab97f6421fdb43f64e9af444759a5b1bac000000000000000000000000000000000000000000000000000110d9316ec00000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -6865,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec34000000000000000000000000f07790bf96c6e6d967d89a5c3a9be8d55c36ade3000000000000000000000000f07790bf96c6e6d967d89a5c3a9be8d55c36ade3000000000000000000000000000000000000000000000000000110d9316ec00000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -6866,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec34000000000000000000000000397eb4ba465dd51ebfc02a5832cd0d849c629e11000000000000000000000000397eb4ba465dd51ebfc02a5832cd0d849c629e11000000000000000000000000000000000000000000000000000110d9316ec00000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -6867,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec34000000000000000000000000bd66a3148866f5bfd68fd324ef4afc3a96301ec4000000000000000000000000bd66a3148866f5bfd68fd324ef4afc3a96301ec400000000000000000000000000000000000000000000000000a7009deb6f608000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -6868,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec34000000000000000000000000a3f68d305ab94fcfd7ee595f217160b9e544f2a9000000000000000000000000a3f68d305ab94fcfd7ee595f217160b9e544f2a900000000000000000000000000000000000000000000000000016bcc41e9000000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -6869,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec340000000000000000000000003d679e36e57535c4c4f220b6404d115afa3dcc060000000000000000000000003d679e36e57535c4c4f220b6404d115afa3dcc0600000000000000000000000000000000000000000000000000016bcc41e9000000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -6871,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec34000000000000000000000000d0c7ff038c90aeaec83327f5fb5ae748df81a389000000000000000000000000d0c7ff038c90aeaec83327f5fb5ae748df81a38900000000000000000000000000000000000000000000000000016bcc41e9000000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -6872,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec3400000000000000000000000096f0ce0e9cc9fdba644341d7c5fb5fad5eb8d3c400000000000000000000000096f0ce0e9cc9fdba644341d7c5fb5fad5eb8d3c400000000000000000000000000000000000000000000000000470de4df82000000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -6873,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec3400000000000000000000000060e308ac2a46e528f6f9821e9533f272fdbcc6d300000000000000000000000060e308ac2a46e528f6f9821e9533f272fdbcc6d3000000000000000000000000000000000000000000000000000110d9316ec00000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -6874,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec34000000000000000000000000e40c1139ff356545caa2ca22b2527be092dfac5e000000000000000000000000e40c1139ff356545caa2ca22b2527be092dfac5e000000000000000000000000000000000000000000000000000110d9316ec00000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -6875,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec3400000000000000000000000029eb0da916392512919fb2e423d9a23db2bf459000000000000000000000000029eb0da916392512919fb2e423d9a23db2bf45900000000000000000000000000000000000000000000000000000b5e620f4800000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -6876,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec34000000000000000000000000cf9a724613095d5704eb3ac79ea61dbc4854957f000000000000000000000000cf9a724613095d5704eb3ac79ea61dbc4854957f000000000000000000000000000000000000000000000000000110d9316ec00000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -6877,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec34000000000000000000000000e9d0bb52d740d5b1195468ce9194b82df48465b9000000000000000000000000e9d0bb52d740d5b1195468ce9194b82df48465b9000000000000000000000000000000000000000000000000000110d9316ec00000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -6878,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec34000000000000000000000000d4d6b0db4bf5efb57e02bdba258e6978774c2678000000000000000000000000d4d6b0db4bf5efb57e02bdba258e6978774c267800000000000000000000000000000000000000000000000000728a1c936f52ac00000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -6879,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec34000000000000000000000000bcf210ed32285b8a2e3cd4f7ae6c8e252cce93a3000000000000000000000000bcf210ed32285b8a2e3cd4f7ae6c8e252cce93a3000000000000000000000000000000000000000000000000000110d9316ec00000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -6880,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec34000000000000000000000000b27e1f879c4a1061d99682d5cc7680190a48200e000000000000000000000000b27e1f879c4a1061d99682d5cc7680190a48200e000000000000000000000000000000000000000000000000000110d9316ec00000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -6881,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec3400000000000000000000000034361fa5987629afbeeaada70f1aa29bb60c51a400000000000000000000000034361fa5987629afbeeaada70f1aa29bb60c51a4000000000000000000000000000000000000000000000000000110d9316ec00000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -6882,0xcd9d4988c0ae61887b075ba77f08cbfad2b65068,0x3f87ff1de58128ef8fcb4c807efd776e1ac72e51,0xf4f7b41a000000000000000000000000647dbb5ca567702688ef0e458bd8f1af302e98e600000000000000000000000000000000000000000000000531136396bb290000,,,1,true -6883,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec34000000000000000000000000f1c4806d27ecf6d09a2f14c5edab5a61dcfbe48d000000000000000000000000f1c4806d27ecf6d09a2f14c5edab5a61dcfbe48d000000000000000000000000000000000000000000000000000110d9316ec00000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -6884,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec34000000000000000000000000d66a7a3d590c0b892db851d2278cb76d1decfbd9000000000000000000000000d66a7a3d590c0b892db851d2278cb76d1decfbd900000000000000000000000000000000000000000000000000a85ba7593fa82000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -6885,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec34000000000000000000000000f69f1bf59fa788f894d5693d75a7250ffcd7f878000000000000000000000000f69f1bf59fa788f894d5693d75a7250ffcd7f87800000000000000000000000000000000000000000000000000d529ae9e86000000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -6886,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec3400000000000000000000000025a2ebfaa31d4312204ba2be4973cdcf4253587700000000000000000000000025a2ebfaa31d4312204ba2be4973cdcf42535877000000000000000000000000000000000000000000000000000110d9316ec00000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -6887,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec34000000000000000000000000bfd1f46ef8eef67e51796e183f4ba00cdbb078f7000000000000000000000000bfd1f46ef8eef67e51796e183f4ba00cdbb078f70000000000000000000000000000000000000000000000000075c2455e1871e900000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -6888,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec3400000000000000000000000068662163a2e664f8f81a751463db74864eea752200000000000000000000000068662163a2e664f8f81a751463db74864eea75220000000000000000000000000000000000000000000000000018f5441a31cfec00000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -6889,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec3400000000000000000000000053bb4a4eafed31b562d766a61c8bc4681caf2ee100000000000000000000000053bb4a4eafed31b562d766a61c8bc4681caf2ee100000000000000000000000000000000000000000000000000038d7ea4c6800000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -6890,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec34000000000000000000000000e90d5f1d9e1634eefb1849ea6870ad9c615ede24000000000000000000000000e90d5f1d9e1634eefb1849ea6870ad9c615ede240000000000000000000000000000000000000000000000000091a94863ca800000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -6891,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec340000000000000000000000001f48e0a83e07541d9b60a29bb249db703574b8c20000000000000000000000001f48e0a83e07541d9b60a29bb249db703574b8c20000000000000000000000000000000000000000000000000053e108c83e5e0f00000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -6892,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec34000000000000000000000000a3da7b05bf56a6b090f21b0513316851ddf839a8000000000000000000000000a3da7b05bf56a6b090f21b0513316851ddf839a800000000000000000000000000000000000000000000000000a7b1ac6ee236fe00000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -6893,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec34000000000000000000000000e6f0cb5d962d453f05ef628278c544dc2e9b58ff000000000000000000000000e6f0cb5d962d453f05ef628278c544dc2e9b58ff00000000000000000000000000000000000000000000000000c6f3b40b6c000000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -6894,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec34000000000000000000000000140ebfbbd62e51d45c2a4fccf6aa44b10eff32fb000000000000000000000000140ebfbbd62e51d45c2a4fccf6aa44b10eff32fb00000000000000000000000000000000000000000000000001f2a9c76eb8fceb00000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -6896,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec3400000000000000000000000025c6acc11d1814a3ca59562957cada7d673ae0ac00000000000000000000000025c6acc11d1814a3ca59562957cada7d673ae0ac0000000000000000000000000000000000000000000000000077129cb6e560a100000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -6899,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec34000000000000000000000000417be1be8e825bde060a365c5e1754403ca281b6000000000000000000000000417be1be8e825bde060a365c5e1754403ca281b6000000000000000000000000000000000000000000000000001bff73fec78c0000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -6900,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec340000000000000000000000006e5af1f11ad9856d8c6e1ab27fe2c0c40b579b370000000000000000000000006e5af1f11ad9856d8c6e1ab27fe2c0c40b579b3700000000000000000000000000000000000000000000000000d529ae9e86000000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -6901,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec340000000000000000000000008e7ea7126a10df07b3ed6f425ebf7632d6df15480000000000000000000000008e7ea7126a10df07b3ed6f425ebf7632d6df154800000000000000000000000000000000000000000000000000038d7ea4c6800000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -6902,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec34000000000000000000000000a46119d6d8faf6a482b14fb7185de29f5a241293000000000000000000000000a46119d6d8faf6a482b14fb7185de29f5a241293000000000000000000000000000000000000000000000000003dc754a067e39f00000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -6904,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec3400000000000000000000000078807e8347fd291a22e4e798ac8b2c373abd070f00000000000000000000000078807e8347fd291a22e4e798ac8b2c373abd070f00000000000000000000000000000000000000000000000006e497f4bab19c4900000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -6905,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec340000000000000000000000005615b91b204e2d5a342972b2aeaafb30ad3d11840000000000000000000000005615b91b204e2d5a342972b2aeaafb30ad3d1184000000000000000000000000000000000000000000000000002386f26fc1000000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -6906,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec34000000000000000000000000c794b210337339ce83f5be21f0f62802c029b332000000000000000000000000c794b210337339ce83f5be21f0f62802c029b332000000000000000000000000000000000000000000000000002043cb9a67fc1900000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -6909,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec340000000000000000000000000953995ac114b527b97f6c5070de898962b8c7ad0000000000000000000000000953995ac114b527b97f6c5070de898962b8c7ad00000000000000000000000000000000000000000000000000a98b0d5f31eb2e00000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -6910,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec340000000000000000000000005842aa91fde70566883c12b07ec700792630e9c50000000000000000000000005842aa91fde70566883c12b07ec700792630e9c500000000000000000000000000000000000000000000000000c86e454d307f3900000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -6911,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec34000000000000000000000000cc139276ff0be2dd9485d24c8e33e1c0b9d2e2df000000000000000000000000cc139276ff0be2dd9485d24c8e33e1c0b9d2e2df000000000000000000000000000000000000000000000000003bb36eb25045e100000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -6912,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec34000000000000000000000000ad5b935a336fa91d049a07071cc80b22625377ad000000000000000000000000ad5b935a336fa91d049a07071cc80b22625377ad000000000000000000000000000000000000000000000000002386f26fc1000000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -6913,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec34000000000000000000000000c9b8bc71e8d0a948c90e776db9986f394cc65a23000000000000000000000000c9b8bc71e8d0a948c90e776db9986f394cc65a2300000000000000000000000000000000000000000000000000038d7ea4c6800000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -6914,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec34000000000000000000000000699db59f23d4fc9aeb9dc770eb3f30e84cc5acf1000000000000000000000000699db59f23d4fc9aeb9dc770eb3f30e84cc5acf100000000000000000000000000000000000000000000000000071afd498d000000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -6915,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec34000000000000000000000000f79ed2e7846523719875fb10a6b0cd1ea40c05cc000000000000000000000000f79ed2e7846523719875fb10a6b0cd1ea40c05cc0000000000000000000000000000000000000000000000000c81d245ac433fc400000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -6916,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec340000000000000000000000008dd42c713d06633f2bbcc9f7571d0cdb0a20777c0000000000000000000000008dd42c713d06633f2bbcc9f7571d0cdb0a20777c00000000000000000000000000000000000000000000000000489c6d7a469c0b00000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -6917,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0xa9f9e675000000000000000000000000dac17f958d2ee523a2206206994597c13d831ec700000000000000000000000094b008aa00579c1307b0ef2c499ad98a8ce58e58000000000000000000000000eac4899b7ab841ad7d68550b43d877aab93f143b000000000000000000000000eac4899b7ab841ad7d68550b43d877aab93f143b0000000000000000000000000000000000000000000000000000000002faefbc00000000000000000000000000000000000000000000000000000000000000c00000000000000000000000000000000000000000000000000000000000000000,,,1,true -6918,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec34000000000000000000000000ace8be2bbf60b8d8beb956175eff03e49240ee5e000000000000000000000000ace8be2bbf60b8d8beb956175eff03e49240ee5e000000000000000000000000000000000000000000000000010d0beb5dd7a1a000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -6920,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec3400000000000000000000000094dcb38e3901a0d2a6d1bbf8fe232d626632571900000000000000000000000094dcb38e3901a0d2a6d1bbf8fe232d626632571900000000000000000000000000000000000000000000000000833461775ce5b700000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -6922,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec340000000000000000000000004d2dea9c4cdced177021f25a879d3cbf4c89e46d0000000000000000000000004d2dea9c4cdced177021f25a879d3cbf4c89e46d00000000000000000000000000000000000000000000000000000433cd2b250000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -6923,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec34000000000000000000000000d3907cef128f29a4c20a53ef803039a8ceb3db40000000000000000000000000d3907cef128f29a4c20a53ef803039a8ceb3db40000000000000000000000000000000000000000000000000002386f26fc1000000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -6924,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec340000000000000000000000001d7f3e7477509e5aaef96cc8c45879b6de3414860000000000000000000000001d7f3e7477509e5aaef96cc8c45879b6de34148600000000000000000000000000000000000000000000000000038d7ea4c6800000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -6925,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec34000000000000000000000000e0be25bbaf45c32f1b494ad1428570cda54ffbbb000000000000000000000000e0be25bbaf45c32f1b494ad1428570cda54ffbbb00000000000000000000000000000000000000000000000000038d7ea4c6800000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -6926,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec34000000000000000000000000634c994e9f1945016d90d30d540971fade8b26f8000000000000000000000000634c994e9f1945016d90d30d540971fade8b26f8000000000000000000000000000000000000000000000000001e4a70ab4c0c0000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -6927,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec340000000000000000000000005113260b89790bcf675083fece6c66ce6ab3b6390000000000000000000000005113260b89790bcf675083fece6c66ce6ab3b63900000000000000000000000000000000000000000000000000a4f784696b1de400000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -6928,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec34000000000000000000000000e1240655fe99f9e8f225258bd1d664a030ad46de000000000000000000000000e1240655fe99f9e8f225258bd1d664a030ad46de000000000000000000000000000000000000000000000000000009184e72a00000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -6929,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec34000000000000000000000000b5ad56a8708f50ba9e0cef123bfaa4684f6c7331000000000000000000000000b5ad56a8708f50ba9e0cef123bfaa4684f6c73310000000000000000000000000000000000000000000000000092ba219539400000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -6931,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec3400000000000000000000000013a875ea21c9f2f599f667a02ee90f4758f1c87300000000000000000000000013a875ea21c9f2f599f667a02ee90f4758f1c87300000000000000000000000000000000000000000000000000ba1352924c125800000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -6932,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec3400000000000000000000000040333b174f38dbdc909b7e2763e7764e133fbaf600000000000000000000000040333b174f38dbdc909b7e2763e7764e133fbaf600000000000000000000000000000000000000000000000000a8661a217bcd2200000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -6933,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec34000000000000000000000000bdc3a9a543aa7029085dc500d639f0868be7eaea000000000000000000000000bdc3a9a543aa7029085dc500d639f0868be7eaea00000000000000000000000000000000000000000000000000a8660c825a800000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,0xbd0fd524ef9c6c721476e31ef9737967588586e6f861991cf0d29ff3047b2a91,2021-12-12 03:23:38.000 UTC,0,true -6936,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec34000000000000000000000000685704e8a92c1f57e0c697697738412886ccb6e3000000000000000000000000685704e8a92c1f57e0c697697738412886ccb6e3000000000000000000000000000000000000000000000000000009184e72a00000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -6937,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec34000000000000000000000000575ab966f12c09eee2fd0888b63ed81115088269000000000000000000000000575ab966f12c09eee2fd0888b63ed8111508826900000000000000000000000000000000000000000000000000438600020ad40000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,0x2654cbb590daa9a2b7dcbdc2e24fc6ac3a46fa0f407f23819944d09be23ac5d3,2022-03-04 10:22:14.000 UTC,0,true -6938,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec34000000000000000000000000e5c1cbb2717cb644b7c84cce6519c58e560ee007000000000000000000000000e5c1cbb2717cb644b7c84cce6519c58e560ee0070000000000000000000000000000000000000000000000000097d9e0ad74360800000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -6939,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec3400000000000000000000000043a2ec2991f189cff8c024fb34a3fce9a33c5ae200000000000000000000000043a2ec2991f189cff8c024fb34a3fce9a33c5ae2000000000000000000000000000000000000000000000000003d25828834f8e100000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -6940,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0xa9f9e675000000000000000000000000dac17f958d2ee523a2206206994597c13d831ec700000000000000000000000094b008aa00579c1307b0ef2c499ad98a8ce58e5800000000000000000000000029fca5052da9b93b2b25809135022ec36735599500000000000000000000000029fca5052da9b93b2b25809135022ec367355995000000000000000000000000000000000000000000000000000000000851572900000000000000000000000000000000000000000000000000000000000000c00000000000000000000000000000000000000000000000000000000000000000,,,1,true -6941,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec340000000000000000000000003de35c78f166828a9723d1b9d29a54bc159b3aa70000000000000000000000003de35c78f166828a9723d1b9d29a54bc159b3aa70000000000000000000000000000000000000000000000000014cabbedd3f80000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -6942,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec340000000000000000000000004375c14f100c563dd92b34f8fb41e764e7c9f3530000000000000000000000004375c14f100c563dd92b34f8fb41e764e7c9f35300000000000000000000000000000000000000000000000000cd63f6b2e62e4f00000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -6943,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec34000000000000000000000000705c7909e5d4b833778cb95fee849c7dff1d0681000000000000000000000000705c7909e5d4b833778cb95fee849c7dff1d068100000000000000000000000000000000000000000000000000354a6ba7a1800000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -6944,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec340000000000000000000000003ef0430c20044bf343e26edfdd992c67807cf64d0000000000000000000000003ef0430c20044bf343e26edfdd992c67807cf64d00000000000000000000000000000000000000000000000000a64fddbdf7280200000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -6946,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec34000000000000000000000000afa841fab90d5b2f68d04799ed35a458d856d1e5000000000000000000000000afa841fab90d5b2f68d04799ed35a458d856d1e5000000000000000000000000000000000000000000000000000aa87bee53800000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -6949,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec34000000000000000000000000cf207d607ffd7c7174b997a879125e5301c526af000000000000000000000000cf207d607ffd7c7174b997a879125e5301c526af00000000000000000000000000000000000000000000000000350647ebd9f85400000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -6950,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec34000000000000000000000000dccede7fc9210649eb6e593aeb351f89adb92831000000000000000000000000dccede7fc9210649eb6e593aeb351f89adb92831000000000000000000000000000000000000000000000000027f7d0bdb92000000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -6951,0xcd9d4988c0ae61887b075ba77f08cbfad2b65068,0x3f87ff1de58128ef8fcb4c807efd776e1ac72e51,0xf4f7b41a000000000000000000000000cf64a18bc553eb5a8c97ced14799223d2e37e53d000000000000000000000000000000000000000000000000a81ed803516f8775,,,1,true -6952,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec34000000000000000000000000be13517a2b520b2449068d2ec45280992b04047b000000000000000000000000be13517a2b520b2449068d2ec45280992b04047b000000000000000000000000000000000000000000000000003f37cc711c78e300000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -6953,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec34000000000000000000000000a1be60a3dd728c15004344ace9039dae426a707b000000000000000000000000a1be60a3dd728c15004344ace9039dae426a707b00000000000000000000000000000000000000000000000000c3c5d5f6376d7000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,0x5a8c6a35ba00a69fe63451d4ba267eea1c69d5f70f1659d7dc2b3884e44c5f59,2021-12-15 09:51:43.000 UTC,0,true -6954,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec34000000000000000000000000f54c655ac5f39b5f5d9e0f843d3150d9730eb33a000000000000000000000000f54c655ac5f39b5f5d9e0f843d3150d9730eb33a0000000000000000000000000000000000000000000000000a2874de7c7be64f00000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,0x1cd6cd0b9a28eba0eb249794f1440bf64f35988cd0ddedfa94ecea721719f64a,2021-11-23 07:58:16.000 UTC,0,true -6956,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec34000000000000000000000000e6ec83200fa6f55a3ada624e074e599d74cffa86000000000000000000000000e6ec83200fa6f55a3ada624e074e599d74cffa8600000000000000000000000000000000000000000000000000038d7ea4c6800000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -6958,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec340000000000000000000000006df6f687918352b0a8548e6e4770ae97888c18d80000000000000000000000006df6f687918352b0a8548e6e4770ae97888c18d8000000000000000000000000000000000000000000000000001133316a91286f00000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -6959,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec340000000000000000000000003db3065790799c9d8e8c64a2b9148b81f2fa06540000000000000000000000003db3065790799c9d8e8c64a2b9148b81f2fa06540000000000000000000000000000000000000000000000000011c37937e0800000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -6962,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec34000000000000000000000000a78589943301b0ba9f41a24068cf46531feb37c3000000000000000000000000a78589943301b0ba9f41a24068cf46531feb37c3000000000000000000000000000000000000000000000000003efed42c129d8000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -6963,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec34000000000000000000000000033469566baf1484f2e65b747a4eae1296d33db4000000000000000000000000033469566baf1484f2e65b747a4eae1296d33db4000000000000000000000000000000000000000000000000004293d094d5213500000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -6965,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec340000000000000000000000007f9976003c160d52905f143cda321ad4007dbb730000000000000000000000007f9976003c160d52905f143cda321ad4007dbb73000000000000000000000000000000000000000000000000008e1bc9bf04000000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -6966,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec3400000000000000000000000070c2fd9fe3d7c927a90b3e28d561d30c6412384800000000000000000000000070c2fd9fe3d7c927a90b3e28d561d30c64123848000000000000000000000000000000000000000000000000000aa87bee53800000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -6967,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec34000000000000000000000000aa1ac469e3868e8852d396d901e4adeeec6560c8000000000000000000000000aa1ac469e3868e8852d396d901e4adeeec6560c800000000000000000000000000000000000000000000000000188c3d9634eb8000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -6968,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec3400000000000000000000000075d2bfe4eb037c00cb6797ce803ef6b22e13485d00000000000000000000000075d2bfe4eb037c00cb6797ce803ef6b22e13485d000000000000000000000000000000000000000000000000009d11b489df795300000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -6969,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec340000000000000000000000006ae1254db23febf6b70d911ed68051011cf974f00000000000000000000000006ae1254db23febf6b70d911ed68051011cf974f0000000000000000000000000000000000000000000000000010a741a4627800000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,0x98329802bae06e23ca6dd8af45f717b8f8a385f2d7340a2e78d5c1439b8bb361,2022-04-21 09:24:56.000 UTC,0,true -6971,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec340000000000000000000000004f7028fc52f77cb3a17f8fbca6291197a93be9ee0000000000000000000000004f7028fc52f77cb3a17f8fbca6291197a93be9ee00000000000000000000000000000000000000000000000000038d7ea4c6800000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -6972,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec34000000000000000000000000d4880e59f3d4da1ea2202c71a7440ac3065c1a8d000000000000000000000000d4880e59f3d4da1ea2202c71a7440ac3065c1a8d00000000000000000000000000000000000000000000000000071afd498d000000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -6976,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec34000000000000000000000000ea6887f2b7d9eac0149b13f1a61019cba4b8a512000000000000000000000000ea6887f2b7d9eac0149b13f1a61019cba4b8a51200000000000000000000000000000000000000000000000000193bdc8f3c7ac800000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -6979,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec34000000000000000000000000a6edb0a8dec9e7dc90568d3bfe21ecfc7aacf974000000000000000000000000a6edb0a8dec9e7dc90568d3bfe21ecfc7aacf974000000000000000000000000000000000000000000000000002386f26fc1000000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -6980,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec34000000000000000000000000a3f09b35627af530077582052bffadd545123d39000000000000000000000000a3f09b35627af530077582052bffadd545123d39000000000000000000000000000000000000000000000000000aa87bee53800000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -6981,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec34000000000000000000000000fa308d5c5ff97708bf1bd5775a46ccfbe5dd027d000000000000000000000000fa308d5c5ff97708bf1bd5775a46ccfbe5dd027d000000000000000000000000000000000000000000000000005acd2d4b7f2f0d00000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -6982,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec3400000000000000000000000064df66e938ad5cbc8f0de19684ab3e3af958d42400000000000000000000000064df66e938ad5cbc8f0de19684ab3e3af958d424000000000000000000000000000000000000000000000000001f0a0ffb20100000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -6984,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec34000000000000000000000000b3d0d1322c8f24ce8d449514e2c9e95acbef9e38000000000000000000000000b3d0d1322c8f24ce8d449514e2c9e95acbef9e38000000000000000000000000000000000000000000000000000c1448303c800000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -6985,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec34000000000000000000000000e1bc356915a235f748ae37a27a170ffecbc32474000000000000000000000000e1bc356915a235f748ae37a27a170ffecbc32474000000000000000000000000000000000000000000000000001629e6c5c0d65f00000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -6986,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec34000000000000000000000000b7f95b574bfcbe1a7d809ff628b5514ba8a1ba87000000000000000000000000b7f95b574bfcbe1a7d809ff628b5514ba8a1ba870000000000000000000000000000000000000000000000000058d15e1762800000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -6987,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec340000000000000000000000003ef15bcedc4886379fbbf27e5f4cd40228cf52ca0000000000000000000000003ef15bcedc4886379fbbf27e5f4cd40228cf52ca0000000000000000000000000000000000000000000000000014d797c6d4018500000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -6988,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec340000000000000000000000001cd6d041d8881049488c0cd0d83637404abc433c0000000000000000000000001cd6d041d8881049488c0cd0d83637404abc433c000000000000000000000000000000000000000000000000005543df729c000000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -6990,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec340000000000000000000000000fdddd15ced3b169ac8496ecfad78645c4ca27370000000000000000000000000fdddd15ced3b169ac8496ecfad78645c4ca2737000000000000000000000000000000000000000000000000007ee78a0be8366b00000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -6991,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec34000000000000000000000000678a3d4ce40e13ab864862db6728e38481f83865000000000000000000000000678a3d4ce40e13ab864862db6728e38481f83865000000000000000000000000000000000000000000000000000000174876e80000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -6993,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec340000000000000000000000003c16ea242b5b063d7840d99be1c08088a63070280000000000000000000000003c16ea242b5b063d7840d99be1c08088a63070280000000000000000000000000000000000000000000000000009db6a87ff570a00000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -6994,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec34000000000000000000000000335396fc4c0ae063015af959c6815387e529fad4000000000000000000000000335396fc4c0ae063015af959c6815387e529fad40000000000000000000000000000000000000000000000000000000005f5e10000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -6995,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec3400000000000000000000000047f8f31858cc5e2325241451f7166f625d2ea0db00000000000000000000000047f8f31858cc5e2325241451f7166f625d2ea0db000000000000000000000000000000000000000000000000005b65568c96a4dd00000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -6996,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec34000000000000000000000000e1ddafb6de9c840c1d769c9a51ca27e65fbbb4df000000000000000000000000e1ddafb6de9c840c1d769c9a51ca27e65fbbb4df0000000000000000000000000000000000000000000000000099033cd65e2b7300000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -6997,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec340000000000000000000000004e42980f6b1c3c3c51833393d3e77082201644490000000000000000000000004e42980f6b1c3c3c51833393d3e7708220164449000000000000000000000000000000000000000000000000002386f26fc1000000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,0x6f52ca45ad92cca6c2c1fac04ad1a141ace76ca0f20a673b12736a47a6cb4b12,2021-12-01 11:44:14.000 UTC,0,true -6999,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec340000000000000000000000005ad592ca81266c661717d23d3faa0077f2993bca0000000000000000000000005ad592ca81266c661717d23d3faa0077f2993bca0000000000000000000000000000000000000000000000000002c8e3b880c70000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -7000,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec34000000000000000000000000f9a4b682d3a0134e9886ca4acbe02bcc879447fa000000000000000000000000f9a4b682d3a0134e9886ca4acbe02bcc879447fa000000000000000000000000000000000000000000000000003080a0d0b6dc4d00000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -7004,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec3400000000000000000000000034a8166ce58363440aba38f0bbcddfb99b282c5500000000000000000000000034a8166ce58363440aba38f0bbcddfb99b282c550000000000000000000000000000000000000000000000000011c37937e0800000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -7005,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec34000000000000000000000000ce5d510ca05f897cd489e03276ce680344005bcd000000000000000000000000ce5d510ca05f897cd489e03276ce680344005bcd00000000000000000000000000000000000000000000000001540b4286588eed00000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -7008,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec34000000000000000000000000160da53315b0b84317c97b0e400a74f0d0e5476c000000000000000000000000160da53315b0b84317c97b0e400a74f0d0e5476c000000000000000000000000000000000000000000000000001550f7dca7000000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -7009,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec340000000000000000000000006db5f521fd5117733f774dd9ee0325ccbf8c1d190000000000000000000000006db5f521fd5117733f774dd9ee0325ccbf8c1d19000000000000000000000000000000000000000000000000004a9b638448800000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -7011,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec340000000000000000000000001db2c763aa6a2951de67f63003c126dede0d56050000000000000000000000001db2c763aa6a2951de67f63003c126dede0d56050000000000000000000000000000000000000000000000000002525078dc830000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -7012,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec34000000000000000000000000c6091be65c67346421fad6b626dc4bedd6f1f21e000000000000000000000000c6091be65c67346421fad6b626dc4bedd6f1f21e0000000000000000000000000000000000000000000000000002075ce615df0000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -7013,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec34000000000000000000000000d8586fa8844e678e257cfbed87bd84df2dc49602000000000000000000000000d8586fa8844e678e257cfbed87bd84df2dc496020000000000000000000000000000000000000000000000000007e2d1050b060f00000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -7014,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec34000000000000000000000000bd0ce2f515c2c0a3e553014ac1ed44843b5515c1000000000000000000000000bd0ce2f515c2c0a3e553014ac1ed44843b5515c1000000000000000000000000000000000000000000000000009d2803a7744f1b00000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -7015,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec340000000000000000000000005e05d64b0e6226d31845b01458e405bccaec5b5f0000000000000000000000005e05d64b0e6226d31845b01458e405bccaec5b5f00000000000000000000000000000000000000000000000000017902d418c80000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -7016,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec340000000000000000000000002bfc44dbbccd59e3cbd85ae8c019ff381e5601ef0000000000000000000000002bfc44dbbccd59e3cbd85ae8c019ff381e5601ef0000000000000000000000000000000000000000000000000001a6e07a55340000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -7017,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec34000000000000000000000000fde131f300b1b4d142860c919e4f426c2c521389000000000000000000000000fde131f300b1b4d142860c919e4f426c2c5213890000000000000000000000000000000000000000000000000001a6e07a55340000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -7018,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec340000000000000000000000007ffc746c826cd4386c722773b7bb859d49f5edf30000000000000000000000007ffc746c826cd4386c722773b7bb859d49f5edf30000000000000000000000000000000000000000000000000041a9716845dc0000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -7019,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec34000000000000000000000000a9e34dbebb9b4f900ac0e763042ea42ea16016e8000000000000000000000000a9e34dbebb9b4f900ac0e763042ea42ea16016e80000000000000000000000000000000000000000000000000001ad0793c1360000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -7021,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec3400000000000000000000000055e6569cf39fba89d321055eb3706fabb715337700000000000000000000000055e6569cf39fba89d321055eb3706fabb7153377000000000000000000000000000000000000000000000000002386f26fc1000000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -7022,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec340000000000000000000000002b39722c490406f5ee58f347d962c2e1db91da570000000000000000000000002b39722c490406f5ee58f347d962c2e1db91da570000000000000000000000000000000000000000000000000005fd1512ce265c00000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -7023,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec3400000000000000000000000005ebb8027fa5a9faaa289cda2e6ffbdee82cd71000000000000000000000000005ebb8027fa5a9faaa289cda2e6ffbdee82cd710000000000000000000000000000000000000000000000000009a40ffab0f118500000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -7025,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec340000000000000000000000007af8c067719f38f324ecd3fa99431178160ff0230000000000000000000000007af8c067719f38f324ecd3fa99431178160ff0230000000000000000000000000000000000000000000000000001cca1dc26290000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -7026,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec340000000000000000000000009531246b6beae6ae8f778aa576c477dd214a7c530000000000000000000000009531246b6beae6ae8f778aa576c477dd214a7c5300000000000000000000000000000000000000000000000000000e4790a1f50000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -7027,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec340000000000000000000000001778a453a689e347e623208e46d7365fed31a6fd0000000000000000000000001778a453a689e347e623208e46d7365fed31a6fd000000000000000000000000000000000000000000000000000008f7407edc0000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -7028,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec340000000000000000000000002b2c36e80f45ab84b11cec92e468cffd79d510bf0000000000000000000000002b2c36e80f45ab84b11cec92e468cffd79d510bf000000000000000000000000000000000000000000000000000178bb3bab250000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -7029,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec34000000000000000000000000e025f492e4e635126861039783d960c575905f43000000000000000000000000e025f492e4e635126861039783d960c575905f4300000000000000000000000000000000000000000000000000957ead4d10083f00000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -7030,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec34000000000000000000000000f8f6fb663954aa3229c366307aad2fa4190464aa000000000000000000000000f8f6fb663954aa3229c366307aad2fa4190464aa0000000000000000000000000000000000000000000000000001c6bf5263400000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -7031,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec3400000000000000000000000090fba8deb4857adb55f5f211cb7c8ab6efd8b05900000000000000000000000090fba8deb4857adb55f5f211cb7c8ab6efd8b05900000000000000000000000000000000000000000000000000071afd498d000000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -7032,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec340000000000000000000000008f1a0d5de668ddb632145df59baa81cbbf5767b60000000000000000000000008f1a0d5de668ddb632145df59baa81cbbf5767b600000000000000000000000000000000000000000000000000038d7ea4c6800000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -7033,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec340000000000000000000000008c953b9ca9cf6dd7a1cb526537f8f7f8d61a01ff0000000000000000000000008c953b9ca9cf6dd7a1cb526537f8f7f8d61a01ff00000000000000000000000000000000000000000000000000038d7ea4c6800000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -7034,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec34000000000000000000000000b30367238ac1da91b0cf31bb4b0b4efb777488e5000000000000000000000000b30367238ac1da91b0cf31bb4b0b4efb777488e5000000000000000000000000000000000000000000000000005543df729c000000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -7035,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec340000000000000000000000009ff598ed5e0a5c1790bfe210d0a61d077f6e83ab0000000000000000000000009ff598ed5e0a5c1790bfe210d0a61d077f6e83ab00000000000000000000000000000000000000000000000000038d7ea4c6800000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -7036,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec340000000000000000000000009453620d6e882a7018a3ee9a4ec2b1fca5d0205c0000000000000000000000009453620d6e882a7018a3ee9a4ec2b1fca5d0205c000000000000000000000000000000000000000000000000008cf5bc9790ca3900000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -7037,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec34000000000000000000000000336bdf7a8dc958ca317197b764a29eae90c14f7d000000000000000000000000336bdf7a8dc958ca317197b764a29eae90c14f7d000000000000000000000000000000000000000000000000005ac3a30356e6a700000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -7040,0x10e6593cdda8c58a1d0f14c5164b376352a55f2f,0x467194771dae2967aef3ecbedd3bf9a310c76c65,0xa9f9e6750000000000000000000000006b175474e89094c44da98b954eedeac495271d0f000000000000000000000000da10009cbd5d07dd0cecc66161fc93d7c9000da1000000000000000000000000dea777f50b238bdb932cde9453ed8a8c2ce34e17000000000000000000000000dea777f50b238bdb932cde9453ed8a8c2ce34e170000000000000000000000000000000000000000000000008af3e5acfad6006800000000000000000000000000000000000000000000000000000000000000c00000000000000000000000000000000000000000000000000000000000000000,,,1,true -7041,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec34000000000000000000000000767a60f295aedd958932088f9cd6a4951d8739b6000000000000000000000000767a60f295aedd958932088f9cd6a4951d8739b6000000000000000000000000000000000000000000000000001ff973cafa800000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,0x3186d9e91f3dfd4c6ca5bc5cf928b74bb590ae9a39c28683f6c6f00d9ac09bcd,2022-03-01 09:35:19.000 UTC,0,true -7042,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec34000000000000000000000000e8c3eb10a717183b6c23bf785bedc147f5296b55000000000000000000000000e8c3eb10a717183b6c23bf785bedc147f5296b55000000000000000000000000000000000000000000000000008fe731254cd5a900000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -7045,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec340000000000000000000000001085498ad079c5e2ead3a2b4262aa164194c36b00000000000000000000000001085498ad079c5e2ead3a2b4262aa164194c36b00000000000000000000000000000000000000000000000000051f06e54c05ed100000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -7047,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec3400000000000000000000000079b1a68f67de6625433e79665fd00e2ffc7e02c100000000000000000000000079b1a68f67de6625433e79665fd00e2ffc7e02c100000000000000000000000000000000000000000000000001388244fc0fb70000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -7049,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec34000000000000000000000000b30367238ac1da91b0cf31bb4b0b4efb777488e5000000000000000000000000b30367238ac1da91b0cf31bb4b0b4efb777488e5000000000000000000000000000000000000000000000000004a9b638448800000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -7050,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec34000000000000000000000000a33a46408c871c0c4d172e8036dfcdcb19e6f226000000000000000000000000a33a46408c871c0c4d172e8036dfcdcb19e6f226000000000000000000000000000000000000000000000000005824934da52a0000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -7051,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec34000000000000000000000000448e1bee08d6fab78160762beb05a3672ddea0b2000000000000000000000000448e1bee08d6fab78160762beb05a3672ddea0b200000000000000000000000000000000000000000000000002c5bf8e1616543900000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -7052,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec34000000000000000000000000b03ec0b8ef92c5f7ee5c95c442850eeb0b3cc358000000000000000000000000b03ec0b8ef92c5f7ee5c95c442850eeb0b3cc358000000000000000000000000000000000000000000000000002386f26fc1000000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -7053,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec3400000000000000000000000028011e8364199981caf8c2bad99f9462faa0141700000000000000000000000028011e8364199981caf8c2bad99f9462faa0141700000000000000000000000000000000000000000000000000471b6843f2f94500000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -7054,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec34000000000000000000000000f619fc95d58b25b708f36a6452760314bf8bb173000000000000000000000000f619fc95d58b25b708f36a6452760314bf8bb173000000000000000000000000000000000000000000000000002386f26fc1000000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -7055,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec3400000000000000000000000073c17da35fb211b7c0eef1b474b560b01d9a0a4c00000000000000000000000073c17da35fb211b7c0eef1b474b560b01d9a0a4c0000000000000000000000000000000000000000000000000002c3b3d3f77b9f00000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -7056,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec34000000000000000000000000618aa9d95c4119d623be6a40f6b7f543d12e97e8000000000000000000000000618aa9d95c4119d623be6a40f6b7f543d12e97e80000000000000000000000000000000000000000000000000048d3d165e7bc7400000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -7057,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec340000000000000000000000005f33734d47761b1578f20808714adf2a669d23a80000000000000000000000005f33734d47761b1578f20808714adf2a669d23a8000000000000000000000000000000000000000000000000004fefa17b72400000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -7058,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec34000000000000000000000000bc41150bbe0c60c40473c2864f0fed89732d311c000000000000000000000000bc41150bbe0c60c40473c2864f0fed89732d311c000000000000000000000000000000000000000000000000023595f03635285f00000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -7059,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec34000000000000000000000000fee6f809f099b91639a7070b30aaaf3f45d313ca000000000000000000000000fee6f809f099b91639a7070b30aaaf3f45d313ca000000000000000000000000000000000000000000000000000a9d8dbd2e8a4000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -7060,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec34000000000000000000000000e9a393258d34d4b26bd456d727117900ef38f37c000000000000000000000000e9a393258d34d4b26bd456d727117900ef38f37c0000000000000000000000000000000000000000000000000008e0cd9f2c5d0f00000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -7062,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec3400000000000000000000000011bccb4b866b7a0c46d488d1531f80b9253b7bd200000000000000000000000011bccb4b866b7a0c46d488d1531f80b9253b7bd20000000000000000000000000000000000000000000000000012eaf211246fcb00000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -7063,0xcd9d4988c0ae61887b075ba77f08cbfad2b65068,0x3f87ff1de58128ef8fcb4c807efd776e1ac72e51,0xf4f7b41a000000000000000000000000001be549fa377710b9e59d57bbdf593ce1e379ca0000000000000000000000000000000000000000000000006124fee993bc0000,,,1,true -7065,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec34000000000000000000000000f12bb7b027e51baa96dd0f4c78e2bdf2b24da26a000000000000000000000000f12bb7b027e51baa96dd0f4c78e2bdf2b24da26a000000000000000000000000000000000000000000000000001b0ca02bffdb8100000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -7068,0xcd9d4988c0ae61887b075ba77f08cbfad2b65068,0x3f87ff1de58128ef8fcb4c807efd776e1ac72e51,0xf4f7b41a000000000000000000000000573c78a4a1fe8e77ffd340fb5e42c8b80d6e6009000000000000000000000000000000000000000000000000ea9ab5eafbc77b66,,,1,true -7069,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec340000000000000000000000002746976a56c7778a55ad115fc7c1c87e02d357790000000000000000000000002746976a56c7778a55ad115fc7c1c87e02d35779000000000000000000000000000000000000000000000000000009184e72a00000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -7071,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec340000000000000000000000009cbf67c82ba7b1ebf45731c360582de85a5e9dcb0000000000000000000000009cbf67c82ba7b1ebf45731c360582de85a5e9dcb000000000000000000000000000000000000000000000000001258caf0404f9000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -7072,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec3400000000000000000000000068a6dde19e0f736f0eba178807c1cb8e8e7782d600000000000000000000000068a6dde19e0f736f0eba178807c1cb8e8e7782d60000000000000000000000000000000000000000000000000092073f315d620100000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -7073,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec34000000000000000000000000c94fa7be6e276d699bcd1587a172bf5f32e7657a000000000000000000000000c94fa7be6e276d699bcd1587a172bf5f32e7657a0000000000000000000000000000000000000000000000000052d123f99ab50000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -7074,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec340000000000000000000000002d25e30c27841514e0bf05d7f6f0d0f6d87dde740000000000000000000000002d25e30c27841514e0bf05d7f6f0d0f6d87dde74000000000000000000000000000000000000000000000000006405fb87107b0000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -7075,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec340000000000000000000000006fe1911c5bacbc593e558ac33212176f1c12b6590000000000000000000000006fe1911c5bacbc593e558ac33212176f1c12b6590000000000000000000000000000000000000000000000000064590b5e42960000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -7076,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec34000000000000000000000000aa2d70ff6fe9ef712f21e182c4590a03a5d9f01b000000000000000000000000aa2d70ff6fe9ef712f21e182c4590a03a5d9f01b0000000000000000000000000000000000000000000000000063e1e7b7d1580000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -7077,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec34000000000000000000000000c352439a276f26684195a49afeb116e99059fd64000000000000000000000000c352439a276f26684195a49afeb116e99059fd6400000000000000000000000000000000000000000000000000641900042fc70000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -7078,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec340000000000000000000000004cfef319625be2d783978a554b2e4a340e64e3a10000000000000000000000004cfef319625be2d783978a554b2e4a340e64e3a100000000000000000000000000000000000000000000000000641900042fc70000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -7079,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec340000000000000000000000004e3625b95ffbc956a2ae5573fc446c1a04aa08de0000000000000000000000004e3625b95ffbc956a2ae5573fc446c1a04aa08de00000000000000000000000000000000000000000000000000641900042fc70000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -7080,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec340000000000000000000000002b404c6e33fb20f5e576a5530afdbc846edc002f0000000000000000000000002b404c6e33fb20f5e576a5530afdbc846edc002f0000000000000000000000000000000000000000000000000064c47002b7160000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -7081,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec34000000000000000000000000e2ff704732987e191cf37918bd32701ca2a5849c000000000000000000000000e2ff704732987e191cf37918bd32701ca2a5849c00000000000000000000000000000000000000000000000000640e17cb7bf20000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -7082,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec3400000000000000000000000072bd148bbbb381fc0b248e832ad65db9b6ce20b600000000000000000000000072bd148bbbb381fc0b248e832ad65db9b6ce20b60000000000000000000000000000000000000000000000000063415ff1fdde0000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -7083,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec34000000000000000000000000429f260fe1cdca577c7bd1f811e6931fd018dcd8000000000000000000000000429f260fe1cdca577c7bd1f811e6931fd018dcd800000000000000000000000000000000000000000000000000631459150a5b0000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -7084,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec340000000000000000000000003eeb932003862c0a12a7ace91d427dc254adf1570000000000000000000000003eeb932003862c0a12a7ace91d427dc254adf157000000000000000000000000000000000000000000000000006421ab7976840000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -7085,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec34000000000000000000000000f05ac484206b348b1fbb0094da58739a4ffdaab4000000000000000000000000f05ac484206b348b1fbb0094da58739a4ffdaab4000000000000000000000000000000000000000000000000001b9fce5c4fca0000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -7086,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec340000000000000000000000009d9c1715c66cbee0566f509b8db7344095d936220000000000000000000000009d9c1715c66cbee0566f509b8db7344095d936220000000000000000000000000000000000000000000000000038257e49ea5e0000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -7088,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec340000000000000000000000000e798fa801e25858176c9c3f8586078a681c29c60000000000000000000000000e798fa801e25858176c9c3f8586078a681c29c600000000000000000000000000000000000000000000000000038d7ea4c6800000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -7089,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec3400000000000000000000000052761ed75d8c14568a6c4b2964d7effed2fb15d400000000000000000000000052761ed75d8c14568a6c4b2964d7effed2fb15d40000000000000000000000000000000000000000000000000018de76816d800000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -7092,0xcd9d4988c0ae61887b075ba77f08cbfad2b65068,0x3f87ff1de58128ef8fcb4c807efd776e1ac72e51,0xf4f7b41a00000000000000000000000073ce4c69c1e4b26b324f62da4a2439bae8957d3800000000000000000000000000000000000000000000000006f05b59d3b20000,,,1,true -7093,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec340000000000000000000000006b62d985c806e447ebdc1ec9666c0c3462323c240000000000000000000000006b62d985c806e447ebdc1ec9666c0c3462323c24000000000000000000000000000000000000000000000000000e3706c714751b00000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -7098,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec340000000000000000000000004d8be8dcc4f78d4ecbdd77e260c113dbc17767a70000000000000000000000004d8be8dcc4f78d4ecbdd77e260c113dbc17767a7000000000000000000000000000000000000000000000000004a9b638448800000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -7099,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec34000000000000000000000000b918d6fab29ffcdbaa5d75e893c78bcdd1f08844000000000000000000000000b918d6fab29ffcdbaa5d75e893c78bcdd1f088440000000000000000000000000000000000000000000000000072be0627831cc000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -7101,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec34000000000000000000000000334bc680d521d64f48bd09b10bd24e598dc0da0d000000000000000000000000334bc680d521d64f48bd09b10bd24e598dc0da0d00000000000000000000000000000000000000000000000000b1a2bc2ec5000000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -7102,0xcd9d4988c0ae61887b075ba77f08cbfad2b65068,0x3f87ff1de58128ef8fcb4c807efd776e1ac72e51,0xf4f7b41a00000000000000000000000014987ba7b4dfdadbde5c4b43089e0c47110cbd970000000000000000000000000000000000000000000000002eef165df63b9e0a,,,1,true -7104,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec340000000000000000000000006b1a2d3b948c1dd866c66c986e8637fb715df42a0000000000000000000000006b1a2d3b948c1dd866c66c986e8637fb715df42a00000000000000000000000000000000000000000000000000053c8c8a01dc9000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -7105,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec340000000000000000000000000b29607ded2d70f962406685bbb59dc7028dcc2b0000000000000000000000000b29607ded2d70f962406685bbb59dc7028dcc2b000000000000000000000000000000000000000000000000000636fa33c609d500000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -7106,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec34000000000000000000000000bf8ed0fae2a2a37b131b7891d525bb992eefa744000000000000000000000000bf8ed0fae2a2a37b131b7891d525bb992eefa7440000000000000000000000000000000000000000000000000007ee5d4a2b1f9c00000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -7111,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec34000000000000000000000000f08793c6e14d4d7f8baece3af748094aa2876858000000000000000000000000f08793c6e14d4d7f8baece3af748094aa28768580000000000000000000000000000000000000000000000000041b590c7ec497d00000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -7112,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec34000000000000000000000000cabbb8207dd2bfaf3aa2b82ef62d710a2b168157000000000000000000000000cabbb8207dd2bfaf3aa2b82ef62d710a2b168157000000000000000000000000000000000000000000000000005fec5b60ef800000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -7113,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec34000000000000000000000000aa1ebb3e079c6d7b516fc5beee64955c15e395f9000000000000000000000000aa1ebb3e079c6d7b516fc5beee64955c15e395f900000000000000000000000000000000000000000000000002de0591183342b000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -7114,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec34000000000000000000000000d2fd5efb267cd7f7a0ba2af47fbabf53443fb36f000000000000000000000000d2fd5efb267cd7f7a0ba2af47fbabf53443fb36f00000000000000000000000000000000000000000000000000044364c5bb000000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -7115,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec3400000000000000000000000064a1ca8b4f19571ebc7d92ec8eb8d04fa4d63e1100000000000000000000000064a1ca8b4f19571ebc7d92ec8eb8d04fa4d63e1100000000000000000000000000000000000000000000000000101d87d0ba5fcd00000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -7118,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec3400000000000000000000000022bd8c9e6a8485965c39fc99e83ebfd9a5ed5cfb00000000000000000000000022bd8c9e6a8485965c39fc99e83ebfd9a5ed5cfb0000000000000000000000000000000000000000000000000005543df729c00000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -7119,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec3400000000000000000000000005c8ea2b3fbd168a291c59576505fc853d24631200000000000000000000000005c8ea2b3fbd168a291c59576505fc853d24631200000000000000000000000000000000000000000000000000cccaa5e32f811400000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -7120,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec3400000000000000000000000009adfe827e504a4cce2df5f5217f0749401e6c5b00000000000000000000000009adfe827e504a4cce2df5f5217f0749401e6c5b0000000000000000000000000000000000000000000000000147efdac48ea80700000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -7121,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec34000000000000000000000000139f9efe062caaf5e967fb6eb9c569f017fe3520000000000000000000000000139f9efe062caaf5e967fb6eb9c569f017fe352000000000000000000000000000000000000000000000000000071afd498d000000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -7122,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec34000000000000000000000000c4a65de4593362c91579c62d78e3285bdb9115a4000000000000000000000000c4a65de4593362c91579c62d78e3285bdb9115a400000000000000000000000000000000000000000000000000195334b9b7c64000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -7123,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec34000000000000000000000000e97cf541ecf916cde6907addad109e4dc973b98f000000000000000000000000e97cf541ecf916cde6907addad109e4dc973b98f00000000000000000000000000000000000000000000000000681b0bce31f0fa00000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -7124,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec340000000000000000000000000d64f4c6d227d1e2c8fc9f90e0dad742ef77e7810000000000000000000000000d64f4c6d227d1e2c8fc9f90e0dad742ef77e78100000000000000000000000000000000000000000000000000eff3ab213357c700000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -7125,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec34000000000000000000000000ffc6642e1fd5a2eb6853dcaac53bfef845d4daa8000000000000000000000000ffc6642e1fd5a2eb6853dcaac53bfef845d4daa800000000000000000000000000000000000000000000000000f8b0a10e47000000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -7130,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec3400000000000000000000000045b381a5b6ed9312926c1fac846696d33ae1c0db00000000000000000000000045b381a5b6ed9312926c1fac846696d33ae1c0db000000000000000000000000000000000000000000000000006e7d490483c00000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -7131,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec3400000000000000000000000039eb58cd54b082766a99851706744f5b6724677c00000000000000000000000039eb58cd54b082766a99851706744f5b6724677c000000000000000000000000000000000000000000000000013b4cd34a49880000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -7132,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec34000000000000000000000000cd750f5854ece8252fb7d59d4a8be7864241d50d000000000000000000000000cd750f5854ece8252fb7d59d4a8be7864241d50d00000000000000000000000000000000000000000000000000b1a2bc2ec5000000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -7133,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec34000000000000000000000000dca9c88434ba8a6a7e23f2fc3eba2527af825e46000000000000000000000000dca9c88434ba8a6a7e23f2fc3eba2527af825e460000000000000000000000000000000000000000000000000159adf74f1b5c5600000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -7134,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec34000000000000000000000000b72c1c7a79b19f927781edacd19e6a9512a3554c000000000000000000000000b72c1c7a79b19f927781edacd19e6a9512a3554c00000000000000000000000000000000000000000000000000005af3107a400000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -7135,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec34000000000000000000000000bdc357a38867b05a3355c1345aba9bd3eb5cb935000000000000000000000000bdc357a38867b05a3355c1345aba9bd3eb5cb9350000000000000000000000000000000000000000000000000005543df729c00000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -7136,0x10e6593cdda8c58a1d0f14c5164b376352a55f2f,0x467194771dae2967aef3ecbedd3bf9a310c76c65,0xa9f9e6750000000000000000000000006b175474e89094c44da98b954eedeac495271d0f000000000000000000000000da10009cbd5d07dd0cecc66161fc93d7c9000da1000000000000000000000000a4127b892653964ffefc9fab4809eabacc5acc77000000000000000000000000a4127b892653964ffefc9fab4809eabacc5acc770000000000000000000000000000000000000000000000da1af5dece48c942fe00000000000000000000000000000000000000000000000000000000000000c00000000000000000000000000000000000000000000000000000000000000000,,,1,true -7137,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec34000000000000000000000000cbb04ee9ed69ae934db51165aa95492fdb018d76000000000000000000000000cbb04ee9ed69ae934db51165aa95492fdb018d76000000000000000000000000000000000000000000000000000110d9316ec00000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -7139,0x10e6593cdda8c58a1d0f14c5164b376352a55f2f,0x467194771dae2967aef3ecbedd3bf9a310c76c65,0xa9f9e6750000000000000000000000006b175474e89094c44da98b954eedeac495271d0f000000000000000000000000da10009cbd5d07dd0cecc66161fc93d7c9000da1000000000000000000000000ca1e244c6064993dc7cf86dd0b3375fcebd9d9e0000000000000000000000000ca1e244c6064993dc7cf86dd0b3375fcebd9d9e00000000000000000000000000000000000000000000000004563918244f4000000000000000000000000000000000000000000000000000000000000000000c00000000000000000000000000000000000000000000000000000000000000000,,,1,true -7140,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec34000000000000000000000000e07f06b27d051924d918d76bbf10973c9fd5e8be000000000000000000000000e07f06b27d051924d918d76bbf10973c9fd5e8be000000000000000000000000000000000000000000000000018aef634863737900000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -7143,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec34000000000000000000000000882a75525c81e70f1c712e4446287e636958b4e4000000000000000000000000882a75525c81e70f1c712e4446287e636958b4e40000000000000000000000000000000000000000000000000001d5dabedca1f400000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -7145,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec3400000000000000000000000049b48f5d813301700e22e654501156fb2d58c89800000000000000000000000049b48f5d813301700e22e654501156fb2d58c89800000000000000000000000000000000000000000000000000849d237080a93b00000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -7146,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec34000000000000000000000000f2ff8196b4ae960e3a1b533857f6f054bffa92fb000000000000000000000000f2ff8196b4ae960e3a1b533857f6f054bffa92fb00000000000000000000000000000000000000000000000001bb77495794ac5a00000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -7147,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec340000000000000000000000009730e08737d1a3d6364d76dafc4ab334d3f3430e0000000000000000000000009730e08737d1a3d6364d76dafc4ab334d3f3430e0000000000000000000000000000000000000000000000000020b44767ce6c0000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -7148,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec34000000000000000000000000b30367238ac1da91b0cf31bb4b0b4efb777488e5000000000000000000000000b30367238ac1da91b0cf31bb4b0b4efb777488e5000000000000000000000000000000000000000000000000027f7d0bdb92000000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -7149,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec340000000000000000000000009a0a84be18cbe5dbaba7cfbe58d180288c3a08da0000000000000000000000009a0a84be18cbe5dbaba7cfbe58d180288c3a08da00000000000000000000000000000000000000000000000002086dbecadc164800000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -7150,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec3400000000000000000000000023c0bae29b2c92d90ebdf2b78ff86f1cb1bb667d00000000000000000000000023c0bae29b2c92d90ebdf2b78ff86f1cb1bb667d0000000000000000000000000000000000000000000000000b1a2bc2ec50000000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -7151,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec34000000000000000000000000cc713097f3e7ffcbb4e60e4f4efee4a0ae8af234000000000000000000000000cc713097f3e7ffcbb4e60e4f4efee4a0ae8af234000000000000000000000000000000000000000000000000002511fd7970425500000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -7152,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec34000000000000000000000000cc713097f3e7ffcbb4e60e4f4efee4a0ae8af234000000000000000000000000cc713097f3e7ffcbb4e60e4f4efee4a0ae8af2340000000000000000000000000000000000000000000000000073541deb5da5c100000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -7153,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec34000000000000000000000000b5bd472975dd3e335541d84c0790cb836a70b7a4000000000000000000000000b5bd472975dd3e335541d84c0790cb836a70b7a4000000000000000000000000000000000000000000000000001db2fc28be00c700000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -7154,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec340000000000000000000000000bee62d215c1bfb54aaa6a554f398b33056a7f120000000000000000000000000bee62d215c1bfb54aaa6a554f398b33056a7f120000000000000000000000000000000000000000000000000002b62809c0d20000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -7155,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec34000000000000000000000000eab112b9a150ab981fb9680ed89f7caaa3a9b7c0000000000000000000000000eab112b9a150ab981fb9680ed89f7caaa3a9b7c0000000000000000000000000000000000000000000000000014393708307005f00000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -7156,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec340000000000000000000000002973c156d9e4019bcb7e65e371c4d2755bcb02e40000000000000000000000002973c156d9e4019bcb7e65e371c4d2755bcb02e400000000000000000000000000000000000000000000000000b1a2bc2ec5000000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -7158,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec340000000000000000000000007f63a25197ae0715db718e9ec2e96620b3ba3f940000000000000000000000007f63a25197ae0715db718e9ec2e96620b3ba3f940000000000000000000000000000000000000000000000000034948586ad000000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -7160,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec34000000000000000000000000f7460912011c86fc57bc49096f209e482b50cb36000000000000000000000000f7460912011c86fc57bc49096f209e482b50cb3600000000000000000000000000000000000000000000000000049e57d635400000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -7161,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec34000000000000000000000000f6ffbf4428b1c4fe6ce1470d307a8ccac7887ce4000000000000000000000000f6ffbf4428b1c4fe6ce1470d307a8ccac7887ce40000000000000000000000000000000000000000000000000031bced02db000000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -7162,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec34000000000000000000000000f521800ca503321dbfd319d0cb22693fbafbb161000000000000000000000000f521800ca503321dbfd319d0cb22693fbafbb1610000000000000000000000000000000000000000000000000006dd28a1ee2f4600000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -7163,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec34000000000000000000000000877a891877d98c611e16bcf53fe64fa6a36c1bbb000000000000000000000000877a891877d98c611e16bcf53fe64fa6a36c1bbb000000000000000000000000000000000000000000000000016345785d8a000000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -7165,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0xa9f9e675000000000000000000000000a0b86991c6218b36c1d19d4a2e9eb0ce3606eb480000000000000000000000007f5c764cbc14f9669b88837ca1490cca17c316070000000000000000000000005ed6a87517914eb67cce0930fed72e61ce2d64450000000000000000000000005ed6a87517914eb67cce0930fed72e61ce2d6445000000000000000000000000000000000000000000000000000000000098968000000000000000000000000000000000000000000000000000000000000000c00000000000000000000000000000000000000000000000000000000000000000,,,1,true -7166,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec34000000000000000000000000651291caa0ea151434c068a02d154f7a6e6fd139000000000000000000000000651291caa0ea151434c068a02d154f7a6e6fd139000000000000000000000000000000000000000000000000002aa1efb94e000000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -7168,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec34000000000000000000000000f9649565e81d86679c570dc774fa70772cb3814c000000000000000000000000f9649565e81d86679c570dc774fa70772cb3814c000000000000000000000000000000000000000000000000001550f7dca7000000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -7169,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec34000000000000000000000000b23168f076caca9563d814acd3f584cfc1401fd0000000000000000000000000b23168f076caca9563d814acd3f584cfc1401fd00000000000000000000000000000000000000000000000000031bced02db000000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -7170,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec340000000000000000000000008d7ad1f4cf604ea8bf64d10d1d8e2d04076c49cb0000000000000000000000008d7ad1f4cf604ea8bf64d10d1d8e2d04076c49cb000000000000000000000000000000000000000000000000004406ed7f795b0000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -7172,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec34000000000000000000000000f52157000356c034bba9e04707acf9a40ebd49a2000000000000000000000000f52157000356c034bba9e04707acf9a40ebd49a2000000000000000000000000000000000000000000000000012a5d84cea55a7f00000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -7174,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec340000000000000000000000000dc277d26a32808b9517ec5809164305f38ab2e30000000000000000000000000dc277d26a32808b9517ec5809164305f38ab2e3000000000000000000000000000000000000000000000000001f7dd87c6daa0000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -7175,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec3400000000000000000000000021606ee18fc1c9b398c25f56e98e6035ab43429900000000000000000000000021606ee18fc1c9b398c25f56e98e6035ab43429900000000000000000000000000000000000000000000000000080975a2e3d64700000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -7176,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec34000000000000000000000000b53547656127e8a43f686eeebf10d2c4229b3ec6000000000000000000000000b53547656127e8a43f686eeebf10d2c4229b3ec600000000000000000000000000000000000000000000000000b1a2bc2ec5000000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -7177,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec340000000000000000000000000457787467c2f5600a7b70ac22cb27d206735bad0000000000000000000000000457787467c2f5600a7b70ac22cb27d206735bad0000000000000000000000000000000000000000000000000018649dfd2e6cb100000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -7179,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec3400000000000000000000000063baa2dc5597bcce4bbbf60f27901d726c34436c00000000000000000000000063baa2dc5597bcce4bbbf60f27901d726c34436c000000000000000000000000000000000000000000000000001f23832a19010000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -7182,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec340000000000000000000000000b777aba39f4194f2f1f43b6e6432252b6976a990000000000000000000000000b777aba39f4194f2f1f43b6e6432252b6976a9900000000000000000000000000000000000000000000000000a3f0f5562e547800000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -7183,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec3400000000000000000000000052704f183db6b8f526387dca0fb9f3ca911babc800000000000000000000000052704f183db6b8f526387dca0fb9f3ca911babc8000000000000000000000000000000000000000000000000001f74e56eb94a0000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -7184,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec34000000000000000000000000a33a46408c871c0c4d172e8036dfcdcb19e6f226000000000000000000000000a33a46408c871c0c4d172e8036dfcdcb19e6f22600000000000000000000000000000000000000000000000000062db54b8b130000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -7185,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec34000000000000000000000000d9d8d43edcd9817db8ba5c4779cf2f2b431e6955000000000000000000000000d9d8d43edcd9817db8ba5c4779cf2f2b431e6955000000000000000000000000000000000000000000000000000c780476f6dc4500000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -7186,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec3400000000000000000000000071cc92c87c43e38bf6039a70ca9fdc39515aace600000000000000000000000071cc92c87c43e38bf6039a70ca9fdc39515aace600000000000000000000000000000000000000000000000000071afd498d000000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -7188,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec3400000000000000000000000017b8042e8254d262fbaa6851be938e94aaec9f0100000000000000000000000017b8042e8254d262fbaa6851be938e94aaec9f0100000000000000000000000000000000000000000000000001472eacccfb4f1100000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,0x24fbca117442e2a0bd805ce5f690f34bb568d44c2b1e6cb42ba451b422c62efc,2022-04-29 10:17:47.000 UTC,0,true -7189,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec34000000000000000000000000b1eb054e725c69234b9c3ac321756dd3159201b0000000000000000000000000b1eb054e725c69234b9c3ac321756dd3159201b00000000000000000000000000000000000000000000000000018de76816d800000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -7190,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec34000000000000000000000000b9557fc2dead39953982973df776734f469ef20b000000000000000000000000b9557fc2dead39953982973df776734f469ef20b0000000000000000000000000000000000000000000000000018de76816d800000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -7192,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec34000000000000000000000000c83710dd670126ff42fcfb29a0a42114c8239eaa000000000000000000000000c83710dd670126ff42fcfb29a0a42114c8239eaa00000000000000000000000000000000000000000000000001d5d2c44a992b9300000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -7193,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec3400000000000000000000000095e6ddd5d0483157731629acbaf4df02172c093900000000000000000000000095e6ddd5d0483157731629acbaf4df02172c09390000000000000000000000000000000000000000000000000018de76816d800000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -7194,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec34000000000000000000000000a87470c769608bbde6df513a7d1730be3afb8371000000000000000000000000a87470c769608bbde6df513a7d1730be3afb837100000000000000000000000000000000000000000000000000a6be51f94913a100000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -7196,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec34000000000000000000000000248f4e6c5dcd9ef1892704770a93373bbad93154000000000000000000000000248f4e6c5dcd9ef1892704770a93373bbad931540000000000000000000000000000000000000000000000000018de76816d800000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -7198,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec34000000000000000000000000fbfbd5f3ba79c2ef8f121b871ac00ddd5bd19251000000000000000000000000fbfbd5f3ba79c2ef8f121b871ac00ddd5bd1925100000000000000000000000000000000000000000000000000ac2e9f5f8d340000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -7200,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec34000000000000000000000000bc078cb21b5772a12f1cff4e96eba3d13c4d390a000000000000000000000000bc078cb21b5772a12f1cff4e96eba3d13c4d390a0000000000000000000000000000000000000000000000000018de76816d800000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -7201,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec3400000000000000000000000069e1d848848c37d72526664535a6bf5a8bf8c63500000000000000000000000069e1d848848c37d72526664535a6bf5a8bf8c6350000000000000000000000000000000000000000000000000018de76816d800000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -7202,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec34000000000000000000000000cebc634afdeb7b151c38561dddbb65d594e074e4000000000000000000000000cebc634afdeb7b151c38561dddbb65d594e074e400000000000000000000000000000000000000000000000000ae6b62cca5340000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -7203,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec3400000000000000000000000099fbca51e564b974a573a3e49ffadecefe3fcbab00000000000000000000000099fbca51e564b974a573a3e49ffadecefe3fcbab00000000000000000000000000000000000000000000000000670758aa7c800000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -7205,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec340000000000000000000000000326691f419883359a641ae9488042b1ebce7c9e0000000000000000000000000326691f419883359a641ae9488042b1ebce7c9e0000000000000000000000000000000000000000000000000018de76816d800000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -7206,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec340000000000000000000000000ee4a248cd7000bb93e60afbc9dcdce485b75fb30000000000000000000000000ee4a248cd7000bb93e60afbc9dcdce485b75fb30000000000000000000000000000000000000000000000000018de76816d800000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -7207,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec34000000000000000000000000fff73f5a1f6c01902bde607ffcc9de8f0e64ea2c000000000000000000000000fff73f5a1f6c01902bde607ffcc9de8f0e64ea2c00000000000000000000000000000000000000000000000000071afd498d000000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -7208,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec340000000000000000000000009caac316559a88a8dfa585e4b9ac9969248e2fd80000000000000000000000009caac316559a88a8dfa585e4b9ac9969248e2fd8000000000000000000000000000000000000000000000000008e1bc9bf04000000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -7210,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec34000000000000000000000000aa8e079c420d8b950129b5a007bd4374673cae65000000000000000000000000aa8e079c420d8b950129b5a007bd4374673cae65000000000000000000000000000000000000000000000000006a94d74f43000000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -7211,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec34000000000000000000000000ac273a987cd2f8dec4a0eb5be71029f7cb97b769000000000000000000000000ac273a987cd2f8dec4a0eb5be71029f7cb97b76900000000000000000000000000000000000000000000000000038d7ea4c6800000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -7212,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec340000000000000000000000002f92d581df7f9396e014d481d44102227d90cd570000000000000000000000002f92d581df7f9396e014d481d44102227d90cd570000000000000000000000000000000000000000000000000018de76816d800000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -7213,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec340000000000000000000000008eb9cb5ab64d04f1b92dd0b548be4335f34419550000000000000000000000008eb9cb5ab64d04f1b92dd0b548be4335f34419550000000000000000000000000000000000000000000000000018de76816d800000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -7214,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec34000000000000000000000000259c84808553bb13458703882dd14a8a03639231000000000000000000000000259c84808553bb13458703882dd14a8a0363923100000000000000000000000000000000000000000000000000038d7ea4c6800000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -7215,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec34000000000000000000000000259c84808553bb13458703882dd14a8a03639231000000000000000000000000259c84808553bb13458703882dd14a8a0363923100000000000000000000000000000000000000000000000000038d7ea4c6800000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -7216,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec34000000000000000000000000ac273a987cd2f8dec4a0eb5be71029f7cb97b769000000000000000000000000ac273a987cd2f8dec4a0eb5be71029f7cb97b76900000000000000000000000000000000000000000000000000038d7ea4c6800000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -7218,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec3400000000000000000000000099d218d6de7f4f0b3166c16d4efd46a19aa276a700000000000000000000000099d218d6de7f4f0b3166c16d4efd46a19aa276a7000000000000000000000000000000000000000000000000015e432ee4a0590000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -7220,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec340000000000000000000000008460328a53fd608713a12c2b3ea35124a077b9c00000000000000000000000008460328a53fd608713a12c2b3ea35124a077b9c0000000000000000000000000000000000000000000000000001f974bab669b0000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,0x659bc230587386912c40fb39a5f9c6c0fa0d6238aec64b0637717eddb37b857a,2022-08-27 06:30:24.000 UTC,0,true -7221,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec34000000000000000000000000f09ab3dac50e4f2e4dc2f5b9f4dbcd50c27341ed000000000000000000000000f09ab3dac50e4f2e4dc2f5b9f4dbcd50c27341ed00000000000000000000000000000000000000000000000000228ebe2b2312e600000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -7223,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec3400000000000000000000000047de76492cf9fc04a01dbe042c3b39d95709063900000000000000000000000047de76492cf9fc04a01dbe042c3b39d957090639000000000000000000000000000000000000000000000000000e35fa931a000000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -7224,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec34000000000000000000000000de55ae6ea569f75c955e5f3d551b4682732d5b11000000000000000000000000de55ae6ea569f75c955e5f3d551b4682732d5b11000000000000000000000000000000000000000000000000001fd7e63654b00000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -7225,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec3400000000000000000000000086250c2ca9aa91e66cf6ec2925278ce89b89fe1a00000000000000000000000086250c2ca9aa91e66cf6ec2925278ce89b89fe1a000000000000000000000000000000000000000000000000002386f26fc1000000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -7226,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec3400000000000000000000000024acce6cd49ab809deb477bfee50338554a6dbeb00000000000000000000000024acce6cd49ab809deb477bfee50338554a6dbeb000000000000000000000000000000000000000000000000005c5edcbc29000000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -7229,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec34000000000000000000000000702f776f5943784c4a9040c886cac15a76d22729000000000000000000000000702f776f5943784c4a9040c886cac15a76d22729000000000000000000000000000000000000000000000000011c37937e08000000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -7230,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec3400000000000000000000000036410ae136e07af5c99ccf97c8e9398558f82b5400000000000000000000000036410ae136e07af5c99ccf97c8e9398558f82b54000000000000000000000000000000000000000000000000002386f26fc1000000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -7231,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec340000000000000000000000000f80f38152c9e55ce951fd25bf8a0ac43e0fd29a0000000000000000000000000f80f38152c9e55ce951fd25bf8a0ac43e0fd29a0000000000000000000000000000000000000000000000000086c7ec2f7a958000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -7232,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec34000000000000000000000000be7ae762dc142a1b4a56e36ed86dc90ba3484b44000000000000000000000000be7ae762dc142a1b4a56e36ed86dc90ba3484b4400000000000000000000000000000000000000000000000000071afd498d000000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -7233,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec34000000000000000000000000ad0610250a14faa0cb46fd65a5e0f69613f2e623000000000000000000000000ad0610250a14faa0cb46fd65a5e0f69613f2e6230000000000000000000000000000000000000000000000000038d7ea4c68000000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -7234,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec340000000000000000000000004e4762e9ee58589b0f2cbc5fe2dec55e27086d6c0000000000000000000000004e4762e9ee58589b0f2cbc5fe2dec55e27086d6c00000000000000000000000000000000000000000000000000000a3b5840f40000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -7236,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec3400000000000000000000000017fcdf505d90821be2c1cc9defa930153e73e7a700000000000000000000000017fcdf505d90821be2c1cc9defa930153e73e7a700000000000000000000000000000000000000000000000000000b242ce6040000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -7237,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec340000000000000000000000001094bbe0bb8cbfa94d549df5ce122020f6add50a0000000000000000000000001094bbe0bb8cbfa94d549df5ce122020f6add50a0000000000000000000000000000000000000000000000000000143c7b58a40000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -7238,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec34000000000000000000000000438bf64cf9c6c23c1b5263dc85100dd3b4fe801a000000000000000000000000438bf64cf9c6c23c1b5263dc85100dd3b4fe801a0000000000000000000000000000000000000000000000000000143c7b58a40000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -7239,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec340000000000000000000000008ba2666ee8376a2134551c85e5415cb19c67f8fb0000000000000000000000008ba2666ee8376a2134551c85e5415cb19c67f8fb0000000000000000000000000000000000000000000000000000143c7b58a40000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -7240,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec340000000000000000000000001a6d4517c7a00089ee0ea54a6fffd59d4180ef800000000000000000000000001a6d4517c7a00089ee0ea54a6fffd59d4180ef800000000000000000000000000000000000000000000000000063648aa216748000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -7241,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec340000000000000000000000003c4497fffdcfe9a5ce1de09c1b4b4623fd158c130000000000000000000000003c4497fffdcfe9a5ce1de09c1b4b4623fd158c130000000000000000000000000000000000000000000000000000143c7b58a40000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -7242,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec340000000000000000000000003c5bf796b9ce740d8f7132e5da6ab04aa76467e30000000000000000000000003c5bf796b9ce740d8f7132e5da6ab04aa76467e30000000000000000000000000000000000000000000000000000143c7b58a40000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -7244,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec3400000000000000000000000088b1c5da745171d7fca547972d28fa7b0646870000000000000000000000000088b1c5da745171d7fca547972d28fa7b06468700000000000000000000000000000000000000000000000000001818c7d0cdd73800000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -7245,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec340000000000000000000000008b34070951e16b87dce3d6421629dbf9a4a932610000000000000000000000008b34070951e16b87dce3d6421629dbf9a4a9326100000000000000000000000000000000000000000000000000001d54c9cb440000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -7246,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec34000000000000000000000000103324828119cce56ccb05208079b5462a5904d3000000000000000000000000103324828119cce56ccb05208079b5462a5904d300000000000000000000000000000000000000000000000000001d54c9cb440000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -7247,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec340000000000000000000000009f45e4a6564ac682461d6389aceb034277a224f80000000000000000000000009f45e4a6564ac682461d6389aceb034277a224f800000000000000000000000000000000000000000000000000001d54c9cb440000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -7248,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec34000000000000000000000000fecdddff12ce2dff360fbc34235867d10212a9c2000000000000000000000000fecdddff12ce2dff360fbc34235867d10212a9c200000000000000000000000000000000000000000000000000001d54c9cb440000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -7250,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec34000000000000000000000000b5901d9007c4b4a06151378276822e4bba8839af000000000000000000000000b5901d9007c4b4a06151378276822e4bba8839af00000000000000000000000000000000000000000000000000001d1a94a2000000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -7251,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec3400000000000000000000000099738d3492513ac17750a235544eadadf753e11f00000000000000000000000099738d3492513ac17750a235544eadadf753e11f00000000000000000000000000000000000000000000000000001d1a94a2000000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -7252,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec34000000000000000000000000fa4877ee2154d7b1c3119d15c6f6e12456c360ff000000000000000000000000fa4877ee2154d7b1c3119d15c6f6e12456c360ff00000000000000000000000000000000000000000000000000001d1a94a2000000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -7253,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec3400000000000000000000000082fe7f91b2a685457429a3a15a6153aed4a3d03000000000000000000000000082fe7f91b2a685457429a3a15a6153aed4a3d03000000000000000000000000000000000000000000000000000001d1a94a2000000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -7254,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec340000000000000000000000002c3ea3451399f27851700d3be86fa131c7c319130000000000000000000000002c3ea3451399f27851700d3be86fa131c7c3191300000000000000000000000000000000000000000000000000001d1a94a2000000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -7255,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec34000000000000000000000000bd4fa60bfc1acf77ecc8cbe12cfd8eb99de3fca2000000000000000000000000bd4fa60bfc1acf77ecc8cbe12cfd8eb99de3fca200000000000000000000000000000000000000000000000000001d1a94a2000000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -7256,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec3400000000000000000000000054c98e9bfc80e365630fbc32c730fa14bcea643e00000000000000000000000054c98e9bfc80e365630fbc32c730fa14bcea643e00000000000000000000000000000000000000000000000000001d1a94a2000000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -7257,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec340000000000000000000000003198097c3afc75144d36f860b2d85a0c1798d1d20000000000000000000000003198097c3afc75144d36f860b2d85a0c1798d1d200000000000000000000000000000000000000000000000000bbfd820f1b5f3e00000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -7259,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec340000000000000000000000008dd42c713d06633f2bbcc9f7571d0cdb0a20777c0000000000000000000000008dd42c713d06633f2bbcc9f7571d0cdb0a20777c000000000000000000000000000000000000000000000000000388b973d44e8600000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -7260,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec34000000000000000000000000decdae05f91aa2729e1347c09f5877c52c83fa56000000000000000000000000decdae05f91aa2729e1347c09f5877c52c83fa5600000000000000000000000000000000000000000000000000005af3107a400000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -7261,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec340000000000000000000000001fca81a8257d78e5c3520e94dc34d6ee9f6937b40000000000000000000000001fca81a8257d78e5c3520e94dc34d6ee9f6937b40000000000000000000000000000000000000000000000000047bf0f79fe991600000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -7262,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec34000000000000000000000000456ec7f61e3821bd589b0b12f86706f7ad489a6f000000000000000000000000456ec7f61e3821bd589b0b12f86706f7ad489a6f0000000000000000000000000000000000000000000000000018de76816d800000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -7263,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec34000000000000000000000000c1f69449730e70e4f85fa878307d73ed69bd9b16000000000000000000000000c1f69449730e70e4f85fa878307d73ed69bd9b160000000000000000000000000000000000000000000000000018de76816d800000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -7264,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec34000000000000000000000000b00af2f40f5f581a78d93c803e7b90aebc21139b000000000000000000000000b00af2f40f5f581a78d93c803e7b90aebc21139b000000000000000000000000000000000000000000000000004952c17d1caf3a00000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -7265,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec340000000000000000000000002bdf1a400eb0b46bcc9919b712ef231126a9e37e0000000000000000000000002bdf1a400eb0b46bcc9919b712ef231126a9e37e0000000000000000000000000000000000000000000000000059a421015de11d00000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -7266,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec3400000000000000000000000096f0ce0e9cc9fdba644341d7c5fb5fad5eb8d3c400000000000000000000000096f0ce0e9cc9fdba644341d7c5fb5fad5eb8d3c400000000000000000000000000000000000000000000000000074464494a4cd600000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -7267,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec3400000000000000000000000015a2adfe8e91a077198d0ecd2614b34c894f6af100000000000000000000000015a2adfe8e91a077198d0ecd2614b34c894f6af1000000000000000000000000000000000000000000000000003ff2e795f5000000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -7268,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec3400000000000000000000000038333730107be4c1ec0249326b5f5616c151330f00000000000000000000000038333730107be4c1ec0249326b5f5616c151330f0000000000000000000000000000000000000000000000000018de76816d800000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -7269,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec340000000000000000000000004d3d44ce35875cbe8f9b26b9456c658e8ff019590000000000000000000000004d3d44ce35875cbe8f9b26b9456c658e8ff01959000000000000000000000000000000000000000000000000001429cafd7e831e00000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -7271,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec34000000000000000000000000015635645dca64c04a239c453a10ec5cf4a7e2ad000000000000000000000000015635645dca64c04a239c453a10ec5cf4a7e2ad000000000000000000000000000000000000000000000000003e2c284391c00000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -7274,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec340000000000000000000000005b93f432baa191c5452d783e473f0b24a2f9631c0000000000000000000000005b93f432baa191c5452d783e473f0b24a2f9631c0000000000000000000000000000000000000000000000000018de76816d800000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -7275,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec3400000000000000000000000001923ccd42a7ef8cb10898bbdfb927a4db3eb36000000000000000000000000001923ccd42a7ef8cb10898bbdfb927a4db3eb36000000000000000000000000000000000000000000000000000005af3107a400000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -7276,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec340000000000000000000000003c137489cc02fe09e95d3f98f94d9ad832df67b70000000000000000000000003c137489cc02fe09e95d3f98f94d9ad832df67b700000000000000000000000000000000000000000000000001581cf87716812500000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -7277,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec340000000000000000000000000edd6041b630ae6606296f7d656adae8f8f3037f0000000000000000000000000edd6041b630ae6606296f7d656adae8f8f3037f0000000000000000000000000000000000000000000000000018de76816d800000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -7278,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec34000000000000000000000000a068efbc6e7debac6465204b64c2f4f29152364e000000000000000000000000a068efbc6e7debac6465204b64c2f4f29152364e00000000000000000000000000000000000000000000000000005af3107a400000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -7279,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec340000000000000000000000005b4a625a5bda77d9fa03e3cfc0fa9bd1fd86d9760000000000000000000000005b4a625a5bda77d9fa03e3cfc0fa9bd1fd86d976000000000000000000000000000000000000000000000000001f3508b729a2c000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -7280,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec340000000000000000000000002b239f10fed415a29ebe3adb3d601d986e8fd3970000000000000000000000002b239f10fed415a29ebe3adb3d601d986e8fd3970000000000000000000000000000000000000000000000000018de76816d800000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -7282,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec340000000000000000000000002ebbf71a8c4cf3788e7ae7a9427e9d3a23cdfa6e0000000000000000000000002ebbf71a8c4cf3788e7ae7a9427e9d3a23cdfa6e00000000000000000000000000000000000000000000000000005af3107a400000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -7283,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec34000000000000000000000000da346e4251ea91efed55dd01ee16f9a6d3e3d003000000000000000000000000da346e4251ea91efed55dd01ee16f9a6d3e3d00300000000000000000000000000000000000000000000000000dd206d2524e26100000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -7285,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec340000000000000000000000007e58a6006c66838ef57afb04d9b9bbd1251cd84f0000000000000000000000007e58a6006c66838ef57afb04d9b9bbd1251cd84f000000000000000000000000000000000000000000000000013b3df1ef6a724000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -7286,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec340000000000000000000000008164e9c410588e97965169f07294e697438b87630000000000000000000000008164e9c410588e97965169f07294e697438b8763000000000000000000000000000000000000000000000000001b466b4b6cbcc200000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -7287,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec3400000000000000000000000058e7e60534251b5ca9a5e48f3aad2621578c1be600000000000000000000000058e7e60534251b5ca9a5e48f3aad2621578c1be60000000000000000000000000000000000000000000000000020d73cd557030000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -7288,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec34000000000000000000000000c415ec56185161339ed545428218426a36dfd44e000000000000000000000000c415ec56185161339ed545428218426a36dfd44e000000000000000000000000000000000000000000000000008d62056256b19f00000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -7289,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec34000000000000000000000000cfe286b207d067d43733059c906197c611b9e64f000000000000000000000000cfe286b207d067d43733059c906197c611b9e64f00000000000000000000000000000000000000000000000000005af3107a400000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -7290,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec340000000000000000000000008e77c563c2b2f35cd5560828e197e4ec575566870000000000000000000000008e77c563c2b2f35cd5560828e197e4ec57556687000000000000000000000000000000000000000000000000008ca72b909cb64600000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,0x5d0df63db77e0067d4f05d69e0dcab8431c232a0f83ba72b4bacf4d41df03fcf,2022-05-29 04:47:41.000 UTC,0,true -7292,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec34000000000000000000000000e92d559f99857114c610abef473c31be38e4a08b000000000000000000000000e92d559f99857114c610abef473c31be38e4a08b00000000000000000000000000000000000000000000000000005af3107a400000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -7293,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec3400000000000000000000000052a3a7d1d84772ba1384ee0385275fe16a8513cc00000000000000000000000052a3a7d1d84772ba1384ee0385275fe16a8513cc000000000000000000000000000000000000000000000000001119b4ae9b03d000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -7294,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec34000000000000000000000000f367549ecda1259b749f25b624a98a39190891ab000000000000000000000000f367549ecda1259b749f25b624a98a39190891ab00000000000000000000000000000000000000000000000000005af3107a400000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -7296,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec34000000000000000000000000886f136d699ebf04e06038183c445578e69acc6f000000000000000000000000886f136d699ebf04e06038183c445578e69acc6f000000000000000000000000000000000000000000000000005543df729c000000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -7297,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec34000000000000000000000000b8ccb62cc5adf1bf23612107e3782f4ced3b9ace000000000000000000000000b8ccb62cc5adf1bf23612107e3782f4ced3b9ace00000000000000000000000000000000000000000000000000005af3107a400000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -7298,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec34000000000000000000000000e0f695742052fd558ca627a4f93feb75fa526f84000000000000000000000000e0f695742052fd558ca627a4f93feb75fa526f84000000000000000000000000000000000000000000000000002d1e952ca5c00000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -7300,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec340000000000000000000000001679665f47ef61552abf555f9c34f826dc6852220000000000000000000000001679665f47ef61552abf555f9c34f826dc685222000000000000000000000000000000000000000000000000002802c58c79514000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -7301,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec34000000000000000000000000a1135bce14a1bbe1084d45d35431cc4702e08234000000000000000000000000a1135bce14a1bbe1084d45d35431cc4702e08234000000000000000000000000000000000000000000000000000a46ca0670c95400000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -7302,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec34000000000000000000000000f0d3a10267ede65800ac01f6ee40c8353826521c000000000000000000000000f0d3a10267ede65800ac01f6ee40c8353826521c00000000000000000000000000000000000000000000000000005af3107a400000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -7303,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec34000000000000000000000000639e2ea573935f7dc62effd6314269b82e6fa9a2000000000000000000000000639e2ea573935f7dc62effd6314269b82e6fa9a2000000000000000000000000000000000000000000000000009bc446b8e8c77200000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -7305,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec3400000000000000000000000045988c3d7a4ba9b93a0fef23476ad689df7eddb000000000000000000000000045988c3d7a4ba9b93a0fef23476ad689df7eddb000000000000000000000000000000000000000000000000001368685b133398000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -7306,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec340000000000000000000000001872c1bbb51c9d1129420f8baa4e6b7ddef79dfb0000000000000000000000001872c1bbb51c9d1129420f8baa4e6b7ddef79dfb000000000000000000000000000000000000000000000000015d1f7cddf1400000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -7307,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec34000000000000000000000000536aec407c77142c4a19a4978e3d78c2beef81f6000000000000000000000000536aec407c77142c4a19a4978e3d78c2beef81f600000000000000000000000000000000000000000000000000005af3107a400000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -7309,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec34000000000000000000000000b860014d1891ed95bf2cde0d47e1b415194c6808000000000000000000000000b860014d1891ed95bf2cde0d47e1b415194c6808000000000000000000000000000000000000000000000000000268ee4cb72f0000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -7310,0xcd9d4988c0ae61887b075ba77f08cbfad2b65068,0x3f87ff1de58128ef8fcb4c807efd776e1ac72e51,0xf4f7b41a00000000000000000000000060da990aebdd785f50ea3202ff05bff1d0963dbe0000000000000000000000000000000000000000000000006ada64be50311102,,,1,true -7312,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec34000000000000000000000000ac57640958516bf078fd52dd48edf11fe418d7a8000000000000000000000000ac57640958516bf078fd52dd48edf11fe418d7a80000000000000000000000000000000000000000000000000011c37937e0800000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -7313,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec340000000000000000000000007306509a72803bc7027d694c71f641943dde27d50000000000000000000000007306509a72803bc7027d694c71f641943dde27d5000000000000000000000000000000000000000000000000000009184e72a00000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -7314,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec340000000000000000000000001b8b2a20c8ad6c35eaf670cb8d856da62553bf010000000000000000000000001b8b2a20c8ad6c35eaf670cb8d856da62553bf0100000000000000000000000000000000000000000000000002ed37aee8ecd25c00000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,0xbd7461df248e52485296296afba396d6ed36225119b99de0bfbd8d4f4f8f486d,2022-02-17 07:15:23.000 UTC,0,true -7315,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec340000000000000000000000002a8008c0645bd21f5cef33d2d38b2ba2cc66aedf0000000000000000000000002a8008c0645bd21f5cef33d2d38b2ba2cc66aedf00000000000000000000000000000000000000000000000000b1a2bc2ec5000000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -7318,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec340000000000000000000000003e9c94870b662ea4a7f66f95d517866407ed7b2b0000000000000000000000003e9c94870b662ea4a7f66f95d517866407ed7b2b000000000000000000000000000000000000000000000000007d44e2f5015d8200000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -7320,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec3400000000000000000000000056479ace4817c0cd5601e6e70cd2b067275cd02400000000000000000000000056479ace4817c0cd5601e6e70cd2b067275cd02400000000000000000000000000000000000000000000000001364cceb90e4f0000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -7321,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec34000000000000000000000000328bef21aa2f291482250fdab11112a65366061c000000000000000000000000328bef21aa2f291482250fdab11112a65366061c00000000000000000000000000000000000000000000000000369c1af66a4b9500000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -7322,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0xa9f9e675000000000000000000000000dac17f958d2ee523a2206206994597c13d831ec700000000000000000000000094b008aa00579c1307b0ef2c499ad98a8ce58e58000000000000000000000000d726723da8c4e8ecabd559ea8c8ae22fb2331066000000000000000000000000d726723da8c4e8ecabd559ea8c8ae22fb2331066000000000000000000000000000000000000000000000000000000001349713d00000000000000000000000000000000000000000000000000000000000000c00000000000000000000000000000000000000000000000000000000000000000,,,1,true -7323,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec34000000000000000000000000d726723da8c4e8ecabd559ea8c8ae22fb2331066000000000000000000000000d726723da8c4e8ecabd559ea8c8ae22fb23310660000000000000000000000000000000000000000000000000019427f6b585fc000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -7324,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec340000000000000000000000006d0675cd26b17a535fd4e5f21e735d4aabcd2ef30000000000000000000000006d0675cd26b17a535fd4e5f21e735d4aabcd2ef3000000000000000000000000000000000000000000000000000009184e72a00000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -7325,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec3400000000000000000000000025132de651514b6c417c734558694fc576294d0300000000000000000000000025132de651514b6c417c734558694fc576294d030000000000000000000000000000000000000000000000000732d2641409510400000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -7326,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec340000000000000000000000009231cdc62e929be11297a1a733d5088c85b7600a0000000000000000000000009231cdc62e929be11297a1a733d5088c85b7600a000000000000000000000000000000000000000000000000013839052419924000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -7327,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec340000000000000000000000008451b41b170d8a510cc85c1cf3fd3c82a6b250880000000000000000000000008451b41b170d8a510cc85c1cf3fd3c82a6b2508800000000000000000000000000000000000000000000000000005af3107a400000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -7329,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec34000000000000000000000000da8f9e5595cf71006ab107c5609bc445a61172f9000000000000000000000000da8f9e5595cf71006ab107c5609bc445a61172f900000000000000000000000000000000000000000000000000a4ff5955bc09e100000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -7330,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec3400000000000000000000000061a4ab28b1b2024d2e087baba8fb7ac8630a9e0300000000000000000000000061a4ab28b1b2024d2e087baba8fb7ac8630a9e030000000000000000000000000000000000000000000000000016b96e7f2f4b9e00000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -7331,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec34000000000000000000000000ba6745edf8f0f3fab7a58d06a4165620adc0a075000000000000000000000000ba6745edf8f0f3fab7a58d06a4165620adc0a07500000000000000000000000000000000000000000000000000005af3107a400000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -7333,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec34000000000000000000000000f475cb1e982f794cde073ac6303fecbc1e95ca4f000000000000000000000000f475cb1e982f794cde073ac6303fecbc1e95ca4f00000000000000000000000000000000000000000000000000618c765856164000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -7334,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec3400000000000000000000000040d6f0f43a7e31e8e9bfc8c5f3b41b17e3509be200000000000000000000000040d6f0f43a7e31e8e9bfc8c5f3b41b17e3509be200000000000000000000000000000000000000000000000000005af3107a400000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -7337,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec340000000000000000000000001a524ee7f9137f208bcc0105f8864c9a5b674b1c0000000000000000000000001a524ee7f9137f208bcc0105f8864c9a5b674b1c00000000000000000000000000000000000000000000000000005af3107a400000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -7338,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec34000000000000000000000000208f6a3551ef656325aaab922feb0a3b9888a05f000000000000000000000000208f6a3551ef656325aaab922feb0a3b9888a05f000000000000000000000000000000000000000000000000001db7f11d59450000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -7339,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec340000000000000000000000003188c2d18e3a0c972ec68d71787d724834c117610000000000000000000000003188c2d18e3a0c972ec68d71787d724834c1176100000000000000000000000000000000000000000000000000b1a2bc2ec5000000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -7340,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec34000000000000000000000000ca1cd76832aa9a3ba08efe3625e80ab06217b9b6000000000000000000000000ca1cd76832aa9a3ba08efe3625e80ab06217b9b600000000000000000000000000000000000000000000000000005af3107a400000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -7341,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec340000000000000000000000003d24e9e6ff7915f9353e2614050528b776d120ee0000000000000000000000003d24e9e6ff7915f9353e2614050528b776d120ee000000000000000000000000000000000000000000000000000000e8d4a5100000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -7342,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec340000000000000000000000003188c2d18e3a0c972ec68d71787d724834c117610000000000000000000000003188c2d18e3a0c972ec68d71787d724834c11761000000000000000000000000000000000000000000000000002386f26fc1000000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -7343,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec34000000000000000000000000398259c183a1ef12d8f3a900b734b7d2e064cb25000000000000000000000000398259c183a1ef12d8f3a900b734b7d2e064cb250000000000000000000000000000000000000000000000000084f0229ac5918000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -7344,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec34000000000000000000000000835f658ec7db45e18e6f7b78a08267d89ca8ac13000000000000000000000000835f658ec7db45e18e6f7b78a08267d89ca8ac13000000000000000000000000000000000000000000000000001bbabc726494c000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -7345,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec34000000000000000000000000ca1cd76832aa9a3ba08efe3625e80ab06217b9b6000000000000000000000000ca1cd76832aa9a3ba08efe3625e80ab06217b9b600000000000000000000000000000000000000000000000000005af3107a400000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -7346,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec34000000000000000000000000902f1f73320c1e25473a5694d954fd96def3afc8000000000000000000000000902f1f73320c1e25473a5694d954fd96def3afc8000000000000000000000000000000000000000000000000000009184e72a00000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -7348,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec34000000000000000000000000ca1cd76832aa9a3ba08efe3625e80ab06217b9b6000000000000000000000000ca1cd76832aa9a3ba08efe3625e80ab06217b9b600000000000000000000000000000000000000000000000000005af3107a400000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -7349,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec34000000000000000000000000cb185d133406df9ae3c1c4bcd73cda595383fff8000000000000000000000000cb185d133406df9ae3c1c4bcd73cda595383fff8000000000000000000000000000000000000000000000000000009184e72a00000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -7350,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec3400000000000000000000000061413ac783df9ccc7690272112f95ff3991a290e00000000000000000000000061413ac783df9ccc7690272112f95ff3991a290e000000000000000000000000000000000000000000000000001f416fdfec220000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -7351,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec3400000000000000000000000084e2834759cc2e6957cb05bf46bbf4a6e71830df00000000000000000000000084e2834759cc2e6957cb05bf46bbf4a6e71830df0000000000000000000000000000000000000000000000000087ad1a6ab5e8c000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -7353,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec340000000000000000000000007d756d9f86ea38006b93007e9fe02fe5d697c1b00000000000000000000000007d756d9f86ea38006b93007e9fe02fe5d697c1b0000000000000000000000000000000000000000000000000002386f26fc1000000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -7355,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec3400000000000000000000000020ff0f42101e3638194ed6b442e13f8f5c32b93b00000000000000000000000020ff0f42101e3638194ed6b442e13f8f5c32b93b0000000000000000000000000000000000000000000000000129f5e89b13bf4c00000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -7356,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0xa9f9e675000000000000000000000000dac17f958d2ee523a2206206994597c13d831ec700000000000000000000000094b008aa00579c1307b0ef2c499ad98a8ce58e58000000000000000000000000eaa5e98b286bd6e4cb13fca6665cb72e0fc93ffc000000000000000000000000eaa5e98b286bd6e4cb13fca6665cb72e0fc93ffc0000000000000000000000000000000000000000000000000000000007effe6f00000000000000000000000000000000000000000000000000000000000000c00000000000000000000000000000000000000000000000000000000000000000,,,1,true -7357,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec34000000000000000000000000492d61ab91dfbad8d376fca1fca57afc95a03551000000000000000000000000492d61ab91dfbad8d376fca1fca57afc95a035510000000000000000000000000000000000000000000000000018de76816d800000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -7358,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec340000000000000000000000009ec77f3922707e16d7dd12750707f0213175d81f0000000000000000000000009ec77f3922707e16d7dd12750707f0213175d81f0000000000000000000000000000000000000000000000000018de76816d800000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -7359,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec34000000000000000000000000595aedd52e88a1db7041b52b239d0980fd65d621000000000000000000000000595aedd52e88a1db7041b52b239d0980fd65d6210000000000000000000000000000000000000000000000000018de76816d800000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -7360,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec3400000000000000000000000085ce3c5a646ab55e5d1bd871cd8b4cde7d7cd16900000000000000000000000085ce3c5a646ab55e5d1bd871cd8b4cde7d7cd169000000000000000000000000000000000000000000000000002386f26fc1000000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -7361,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec340000000000000000000000007d756d9f86ea38006b93007e9fe02fe5d697c1b00000000000000000000000007d756d9f86ea38006b93007e9fe02fe5d697c1b0000000000000000000000000000000000000000000000000003024a5fa0397d400000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -7362,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec3400000000000000000000000029a9842dd19e154656747ed5bd2f2a1efedc368900000000000000000000000029a9842dd19e154656747ed5bd2f2a1efedc368900000000000000000000000000000000000000000000000001548d75c2e589b000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -7363,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec340000000000000000000000003188c2d18e3a0c972ec68d71787d724834c117610000000000000000000000003188c2d18e3a0c972ec68d71787d724834c11761000000000000000000000000000000000000000000000000002386f26fc1000000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -7365,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec340000000000000000000000003188c2d18e3a0c972ec68d71787d724834c117610000000000000000000000003188c2d18e3a0c972ec68d71787d724834c11761000000000000000000000000000000000000000000000000002386f26fc1000000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -7367,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0xa9f9e675000000000000000000000000dac17f958d2ee523a2206206994597c13d831ec700000000000000000000000094b008aa00579c1307b0ef2c499ad98a8ce58e58000000000000000000000000d540dfe0c05dd8f6b4f204b77b4fafd425a13dcc000000000000000000000000d540dfe0c05dd8f6b4f204b77b4fafd425a13dcc000000000000000000000000000000000000000000000000000000000bee973900000000000000000000000000000000000000000000000000000000000000c00000000000000000000000000000000000000000000000000000000000000000,,,1,true -7368,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec340000000000000000000000004c0f690f3c1539d0951b1131275266a298002fee0000000000000000000000004c0f690f3c1539d0951b1131275266a298002fee00000000000000000000000000000000000000000000000000005af3107a400000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -7369,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec340000000000000000000000008c32ec10a689cbbcaef9f921ebaff01735b2ac690000000000000000000000008c32ec10a689cbbcaef9f921ebaff01735b2ac690000000000000000000000000000000000000000000000000011c37937e0800000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -7370,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec340000000000000000000000007fc95b6e4d11bd603bbe7833a53ad0317f8104de0000000000000000000000007fc95b6e4d11bd603bbe7833a53ad0317f8104de0000000000000000000000000000000000000000000000000018de76816d800000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -7371,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec34000000000000000000000000dd7b789e8815122be16ed246c32922b8e4bab0df000000000000000000000000dd7b789e8815122be16ed246c32922b8e4bab0df0000000000000000000000000000000000000000000000000018de76816d800000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -7372,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec34000000000000000000000000083666f9aaca4f97239a1770817c9c3b0dfa9cad000000000000000000000000083666f9aaca4f97239a1770817c9c3b0dfa9cad00000000000000000000000000000000000000000000000000005af3107a400000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -7373,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec340000000000000000000000000981f4663eae659910357daae7b9c66d4261e5140000000000000000000000000981f4663eae659910357daae7b9c66d4261e514000000000000000000000000000000000000000000000000030e5281024d607f00000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -7374,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec340000000000000000000000005a872b8ae4df25903fcb6f0c7d31a50b29b6d4a50000000000000000000000005a872b8ae4df25903fcb6f0c7d31a50b29b6d4a5000000000000000000000000000000000000000000000000000a7e841d85811c00000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -7375,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec340000000000000000000000001be79610b81df611526351968c2dbb81dc8d36dd0000000000000000000000001be79610b81df611526351968c2dbb81dc8d36dd000000000000000000000000000000000000000000000000000be8ff35ea631500000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -7377,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec34000000000000000000000000c64a53627910055b602571b6ea801e78fd52c737000000000000000000000000c64a53627910055b602571b6ea801e78fd52c737000000000000000000000000000000000000000000000000002892efb39b86fe00000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -7382,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec340000000000000000000000006e3345fe824f8bdbdeea4610c6be5427282f7b890000000000000000000000006e3345fe824f8bdbdeea4610c6be5427282f7b8900000000000000000000000000000000000000000000000000670758aa7c800000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -7384,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec340000000000000000000000006ad755be12464f87c7ad1b10bdba9027f1519f750000000000000000000000006ad755be12464f87c7ad1b10bdba9027f1519f750000000000000000000000000000000000000000000000000001fee3518e613000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -7385,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec3400000000000000000000000026da4f747dd974f873be9422918faf1c3c0049d600000000000000000000000026da4f747dd974f873be9422918faf1c3c0049d6000000000000000000000000000000000000000000000000008e1bc9bf04000000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -7386,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec34000000000000000000000000f9179bf69d9162e09ac3ca5773481946e158cd62000000000000000000000000f9179bf69d9162e09ac3ca5773481946e158cd620000000000000000000000000000000000000000000000000001c6bf5263400000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -7387,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0xa9f9e675000000000000000000000000dac17f958d2ee523a2206206994597c13d831ec700000000000000000000000094b008aa00579c1307b0ef2c499ad98a8ce58e58000000000000000000000000373b6285ee0b3053c73c55e0198960842c762eb8000000000000000000000000373b6285ee0b3053c73c55e0198960842c762eb800000000000000000000000000000000000000000000000000000000000f424000000000000000000000000000000000000000000000000000000000000000c00000000000000000000000000000000000000000000000000000000000000000,,,1,true -7388,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec34000000000000000000000000059150b4dcb622f260ca0882aac487fe8701981e000000000000000000000000059150b4dcb622f260ca0882aac487fe8701981e000000000000000000000000000000000000000000000000002386f26fc1000000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -7389,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec34000000000000000000000000897b264586ca7dfe3ccd80505f8bc4844d058a38000000000000000000000000897b264586ca7dfe3ccd80505f8bc4844d058a38000000000000000000000000000000000000000000000000002386f26fc1000000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -7390,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec340000000000000000000000009f31009532a60709d19e7a2ac09fc2e013394e850000000000000000000000009f31009532a60709d19e7a2ac09fc2e013394e85000000000000000000000000000000000000000000000000002386f26fc1000000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -7392,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0xa9f9e675000000000000000000000000dac17f958d2ee523a2206206994597c13d831ec700000000000000000000000094b008aa00579c1307b0ef2c499ad98a8ce58e580000000000000000000000005aab0dc1817324363ff993d93616346f4f999d240000000000000000000000005aab0dc1817324363ff993d93616346f4f999d2400000000000000000000000000000000000000000000000000000000000f424000000000000000000000000000000000000000000000000000000000000000c00000000000000000000000000000000000000000000000000000000000000000,,,1,true -7393,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec3400000000000000000000000044a4d81102e3cd02a9dfdf1404e8db09826a08ce00000000000000000000000044a4d81102e3cd02a9dfdf1404e8db09826a08ce000000000000000000000000000000000000000000000000002cedda1c3297c000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -7394,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec34000000000000000000000000dcc6fec3f5393c453b38e9af061fa5c4285cc363000000000000000000000000dcc6fec3f5393c453b38e9af061fa5c4285cc363000000000000000000000000000000000000000000000000000048351cb39e0000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -7395,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec3400000000000000000000000048511fa38fed232c7b1b6d40085f5e6ee5a485f200000000000000000000000048511fa38fed232c7b1b6d40085f5e6ee5a485f200000000000000000000000000000000000000000000000000038d7ea4c6800000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -7396,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0xa9f9e675000000000000000000000000dac17f958d2ee523a2206206994597c13d831ec700000000000000000000000094b008aa00579c1307b0ef2c499ad98a8ce58e580000000000000000000000005a10bb23698ee66aff584523a92c7a2f275c833e0000000000000000000000005a10bb23698ee66aff584523a92c7a2f275c833e00000000000000000000000000000000000000000000000000000000000f424000000000000000000000000000000000000000000000000000000000000000c00000000000000000000000000000000000000000000000000000000000000000,,,1,true -7397,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec34000000000000000000000000c076a075f9a6a79288fb7c2ac782e6b3e9550b6b000000000000000000000000c076a075f9a6a79288fb7c2ac782e6b3e9550b6b000000000000000000000000000000000000000000000000000ad2b92e826f4100000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -7398,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec340000000000000000000000001379b4508d23ee2f661aa49429c38f9cb0d8721f0000000000000000000000001379b4508d23ee2f661aa49429c38f9cb0d8721f00000000000000000000000000000000000000000000000000020645c2f88bc000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -7399,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec340000000000000000000000004dc7e2e195f78a4fed312c3e6eb6a32eada3d8ce0000000000000000000000004dc7e2e195f78a4fed312c3e6eb6a32eada3d8ce00000000000000000000000000000000000000000000000000a07569135bd2dc00000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -7400,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec3400000000000000000000000076e922dc720a166c61f2121ddd8f20fdf4a7629700000000000000000000000076e922dc720a166c61f2121ddd8f20fdf4a7629700000000000000000000000000000000000000000000000000ae56692486730000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -7401,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec34000000000000000000000000cf881401a8455249f030914c10b85378062ccdc7000000000000000000000000cf881401a8455249f030914c10b85378062ccdc700000000000000000000000000000000000000000000000000ae626fbef0d40000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -7402,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0xa9f9e675000000000000000000000000dac17f958d2ee523a2206206994597c13d831ec700000000000000000000000094b008aa00579c1307b0ef2c499ad98a8ce58e580000000000000000000000007212c64b39a1e53a5e79ca826738d0d94e6a9c040000000000000000000000007212c64b39a1e53a5e79ca826738d0d94e6a9c0400000000000000000000000000000000000000000000000000000000000f424000000000000000000000000000000000000000000000000000000000000000c00000000000000000000000000000000000000000000000000000000000000000,,,1,true -7403,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec340000000000000000000000006704b17cc393cabfa02c376772e613bba9130b820000000000000000000000006704b17cc393cabfa02c376772e613bba9130b8200000000000000000000000000000000000000000000000000ae44caa18b560000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -7404,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec3400000000000000000000000006d390a4f4151d8edc5de04b2087009691c7c1cb00000000000000000000000006d390a4f4151d8edc5de04b2087009691c7c1cb00000000000000000000000000000000000000000000000000ae56692486730000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,0x0cba90d703dad3e7989905a76e717e52b34cca8caea6618631810a6a210601d0,2022-08-29 07:53:30.000 UTC,0,true -7405,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec3400000000000000000000000010bd0cffbdd0710d5d66f9260be7b4298246d9cc00000000000000000000000010bd0cffbdd0710d5d66f9260be7b4298246d9cc00000000000000000000000000000000000000000000000000addd08baa81d0000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -7406,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec340000000000000000000000006cb47dc2eec74215fea0ade40ffcd1c4dbf482190000000000000000000000006cb47dc2eec74215fea0ade40ffcd1c4dbf4821900000000000000000000000000000000000000000000000000ae83700179f60000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -7407,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec34000000000000000000000000ad1dd4267aa78ca8098d12d3a8a6f517c7d1fc69000000000000000000000000ad1dd4267aa78ca8098d12d3a8a6f517c7d1fc6900000000000000000000000000000000000000000000000000005af3107a400000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -7408,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec34000000000000000000000000dcc6fec3f5393c453b38e9af061fa5c4285cc363000000000000000000000000dcc6fec3f5393c453b38e9af061fa5c4285cc36300000000000000000000000000000000000000000000000000005af3107a400000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -7409,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec340000000000000000000000001cd6219211c5bc7c14dd38e4095db4b2378687c90000000000000000000000001cd6219211c5bc7c14dd38e4095db4b2378687c90000000000000000000000000000000000000000000000000159a1d7760e155200000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -7410,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec34000000000000000000000000a62e8ebcbd4026f1cd1829d0617c15ceca863dcc000000000000000000000000a62e8ebcbd4026f1cd1829d0617c15ceca863dcc000000000000000000000000000000000000000000000000000009184e72a00000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -7411,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec340000000000000000000000003a258aca19ea33ea0c21f2d6de8e2a3093acfee40000000000000000000000003a258aca19ea33ea0c21f2d6de8e2a3093acfee400000000000000000000000000000000000000000000000000ade9e61e5b670000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -7412,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec34000000000000000000000000f32c082a5f2ecbcec5c44416646fb44d16b76732000000000000000000000000f32c082a5f2ecbcec5c44416646fb44d16b76732000000000000000000000000000000000000000000000000000009184e72a00000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -7413,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec34000000000000000000000000c86b505cad0b39497a9d7420a582a277f7175398000000000000000000000000c86b505cad0b39497a9d7420a582a277f717539800000000000000000000000000000000000000000000000000adc0c99766ce0000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -7414,0x10e6593cdda8c58a1d0f14c5164b376352a55f2f,0x467194771dae2967aef3ecbedd3bf9a310c76c65,0xa9f9e6750000000000000000000000006b175474e89094c44da98b954eedeac495271d0f000000000000000000000000da10009cbd5d07dd0cecc66161fc93d7c9000da1000000000000000000000000908dbd31ed8ac9ae70db0228c0ca0df59af8fb56000000000000000000000000908dbd31ed8ac9ae70db0228c0ca0df59af8fb5600000000000000000000000000000000000000000000000166913cbfe1e33c2000000000000000000000000000000000000000000000000000000000000000c00000000000000000000000000000000000000000000000000000000000000000,,,1,true -7415,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec340000000000000000000000009fbc667c68f448904962aad8eac3d5b7aa41af750000000000000000000000009fbc667c68f448904962aad8eac3d5b7aa41af7500000000000000000000000000000000000000000000000000adf17331eb980000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -7416,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec340000000000000000000000000190a8bed2282f4be3ca0263cfb1cc355760185a0000000000000000000000000190a8bed2282f4be3ca0263cfb1cc355760185a0000000000000000000000000000000000000000000000000021f965ffe54c2500000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -7417,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec340000000000000000000000008dfff0573a6f0b40864f874d64122c4815e887dc0000000000000000000000008dfff0573a6f0b40864f874d64122c4815e887dc00000000000000000000000000000000000000000000000000ade68af937c30000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -7418,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec34000000000000000000000000c2db46798bebf1a0276b92e88c01f5ae80422784000000000000000000000000c2db46798bebf1a0276b92e88c01f5ae8042278400000000000000000000000000000000000000000000000000ade68af937c30000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -7419,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec34000000000000000000000000fc2b5939cfbed9bdee0b7fc4d901e070a40713ab000000000000000000000000fc2b5939cfbed9bdee0b7fc4d901e070a40713ab00000000000000000000000000000000000000000000000000ae180b5d05760000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -7420,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec34000000000000000000000000e4038e4de3d9f19f24af03a25ba3442606b03c44000000000000000000000000e4038e4de3d9f19f24af03a25ba3442606b03c4400000000000000000000000000000000000000000000000000ae5ecd015f8d0000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -7421,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec3400000000000000000000000026ed9f944312483a6daeab7fad4184a2ef7f9b2d00000000000000000000000026ed9f944312483a6daeab7fad4184a2ef7f9b2d00000000000000000000000000000000000000000000000000ae36cedc21800000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -7422,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec340000000000000000000000001c12886bd97ee471c336275199c2f6f269bf4adc0000000000000000000000001c12886bd97ee471c336275199c2f6f269bf4adc00000000000000000000000000000000000000000000000000ae7ac48c33390000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -7423,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec34000000000000000000000000f03cff0446685d04434c165d181b696ff36056f9000000000000000000000000f03cff0446685d04434c165d181b696ff36056f900000000000000000000000000000000000000000000000000ae189a8de0bc0000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -7424,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec340000000000000000000000005515cc4193b736fb49f1afb0bb5f5c7ea92a3e110000000000000000000000005515cc4193b736fb49f1afb0bb5f5c7ea92a3e1100000000000000000000000000000000000000000000000000ae55d9f3ab2d0000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -7425,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec34000000000000000000000000e8b044956d8dd77340f71451c509c1d0fdd4d57a000000000000000000000000e8b044956d8dd77340f71451c509c1d0fdd4d57a00000000000000000000000000000000000000000000000000ae24a1284b1d0000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -7426,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec34000000000000000000000000f7acf65694d468de909d5acbc300fcab9c420a88000000000000000000000000f7acf65694d468de909d5acbc300fcab9c420a8800000000000000000000000000000000000000000000000000ae180b5d05760000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -7427,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec34000000000000000000000000c21ae590cd1e60786a20df85215b0345ca5114ce000000000000000000000000c21ae590cd1e60786a20df85215b0345ca5114ce00000000000000000000000000000000000000000000000000adab40be6cc70000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -7428,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec340000000000000000000000001b2a2bf256b65d151bd1fa53d46317eba8a215c80000000000000000000000001b2a2bf256b65d151bd1fa53d46317eba8a215c800000000000000000000000000000000000000000000000000ad353b79b2150000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -7429,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec34000000000000000000000000bf8f553b1cebeb9a6fec9a9fae7486aeb68e2be6000000000000000000000000bf8f553b1cebeb9a6fec9a9fae7486aeb68e2be600000000000000000000000000000000000000000000000000addefde5a7920000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -7430,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec340000000000000000000000000ec0e504fb50a08ae7eebb3e35b097d3b4720bf10000000000000000000000000ec0e504fb50a08ae7eebb3e35b097d3b4720bf1000000000000000000000000000000000000000000000000015905133188f80b00000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -7431,0x10e6593cdda8c58a1d0f14c5164b376352a55f2f,0x467194771dae2967aef3ecbedd3bf9a310c76c65,0xa9f9e6750000000000000000000000006b175474e89094c44da98b954eedeac495271d0f000000000000000000000000da10009cbd5d07dd0cecc66161fc93d7c9000da100000000000000000000000082ae721301dda20654fc1fb7a12c660c3bfb461200000000000000000000000082ae721301dda20654fc1fb7a12c660c3bfb46120000000000000000000000000000000000000000000000000de2973d1eaa4da900000000000000000000000000000000000000000000000000000000000000c00000000000000000000000000000000000000000000000000000000000000000,,,1,true -7432,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec34000000000000000000000000c71f9673daa6d65dd389f5bc211295104e8a38d6000000000000000000000000c71f9673daa6d65dd389f5bc211295104e8a38d600000000000000000000000000000000000000000000000000ae4b80ebd29e0000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -7433,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec34000000000000000000000000f6aab2339285450df21ca210ac3c2163e0f07a6e000000000000000000000000f6aab2339285450df21ca210ac3c2163e0f07a6e00000000000000000000000000000000000000000000000000038d7ea4c6800000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -7434,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec34000000000000000000000000ad891e1f33e356ac839657fee01f324d75fe8141000000000000000000000000ad891e1f33e356ac839657fee01f324d75fe8141000000000000000000000000000000000000000000000000000344a034a0670d00000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -7435,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec340000000000000000000000005fa44a75162b58198e431a6b5b413b0197a1e0910000000000000000000000005fa44a75162b58198e431a6b5b413b0197a1e091000000000000000000000000000000000000000000000000015635dbfc0f5a2d00000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -7436,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec34000000000000000000000000efc621666b128e0c64fe5be97d2be33b701e3e64000000000000000000000000efc621666b128e0c64fe5be97d2be33b701e3e6400000000000000000000000000000000000000000000000000ae26ddebb8350000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -7437,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec34000000000000000000000000c0f076450b38cf7d41a2e92e95549cb02bcde08c000000000000000000000000c0f076450b38cf7d41a2e92e95549cb02bcde08c0000000000000000000000000000000000000000000000000003f1fd6743cf3800000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -7439,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec340000000000000000000000004ecbaa7d2f86f2d78c04f49986ec2c57938752a60000000000000000000000004ecbaa7d2f86f2d78c04f49986ec2c57938752a60000000000000000000000000000000000000000000000000043d525833e050000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -7440,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec340000000000000000000000001c600c447ae7602780a778ac9fac97672af2ec6f0000000000000000000000001c600c447ae7602780a778ac9fac97672af2ec6f00000000000000000000000000000000000000000000000000071afd498d000000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -7441,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec340000000000000000000000002e6c30e98c92f9e9d8b60ac043dc6efdaa909a380000000000000000000000002e6c30e98c92f9e9d8b60ac043dc6efdaa909a3800000000000000000000000000000000000000000000000000adc158c842140000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -7442,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec340000000000000000000000004ff0e2ae0042972a39495cce0b669de7bdbe184f0000000000000000000000004ff0e2ae0042972a39495cce0b669de7bdbe184f00000000000000000000000000000000000000000000000000adc9bca51b2e0000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -7443,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec340000000000000000000000000815d234bdb6f1e818c6f80da33d2a285c588b730000000000000000000000000815d234bdb6f1e818c6f80da33d2a285c588b7300000000000000000000000000000000000000000000000000addacbf73b050000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -7444,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec34000000000000000000000000b43d75915742a36307d071dd3fb33e27c08e0e7c000000000000000000000000b43d75915742a36307d071dd3fb33e27c08e0e7c00000000000000000000000000000000000000000000000000ae1c3d4b72030000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -7445,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec340000000000000000000000004a6add0031caafa83311e47171a97a54e30f4cff0000000000000000000000004a6add0031caafa83311e47171a97a54e30f4cff00000000000000000000000000000000000000000000000000ae1a4820728e0000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -7446,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec34000000000000000000000000566f4717a58a0fbde8952454c715a8ec14ebe774000000000000000000000000566f4717a58a0fbde8952454c715a8ec14ebe77400000000000000000000000000000000000000000000000000ae26ddebb8350000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -7447,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec3400000000000000000000000089445c90cf4d3cfde19861a55691134e3b68abff00000000000000000000000089445c90cf4d3cfde19861a55691134e3b68abff00000000000000000000000000000000000000000000000000ae24e8c0b8c00000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -7448,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec34000000000000000000000000ce59b53303e225dbf581b9eb8aa4ff1ee7f33601000000000000000000000000ce59b53303e225dbf581b9eb8aa4ff1ee7f3360100000000000000000000000000000000000000000000000000ad8c7d3f50bd0000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -7449,0x10e6593cdda8c58a1d0f14c5164b376352a55f2f,0x467194771dae2967aef3ecbedd3bf9a310c76c65,0xa9f9e6750000000000000000000000006b175474e89094c44da98b954eedeac495271d0f000000000000000000000000da10009cbd5d07dd0cecc66161fc93d7c9000da1000000000000000000000000d1b726adc4093c773b934d1223003a43fa0fc914000000000000000000000000d1b726adc4093c773b934d1223003a43fa0fc9140000000000000000000000000000000000000000000000000dcf2679cfee633200000000000000000000000000000000000000000000000000000000000000c00000000000000000000000000000000000000000000000000000000000000000,,,1,true -7450,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec34000000000000000000000000ce9863e4ae1423d644b653db56d95a2017a374d8000000000000000000000000ce9863e4ae1423d644b653db56d95a2017a374d800000000000000000000000000000000000000000000000000ae50420b1a710000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -7451,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec3400000000000000000000000077e2938deee318ddcc320a66cc19c03db50979ce00000000000000000000000077e2938deee318ddcc320a66cc19c03db50979ce00000000000000000000000000000000000000000000000000ba6a198897faf500000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -7452,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec340000000000000000000000000266b41a8c5368df78a5ba327df04c2df6fc5e020000000000000000000000000266b41a8c5368df78a5ba327df04c2df6fc5e0200000000000000000000000000000000000000000000000000ae0cdb8be3fe0000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -7453,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec340000000000000000000000008d51a0ac942ea64705b472fb09ab87b98d38d4cd0000000000000000000000008d51a0ac942ea64705b472fb09ab87b98d38d4cd00000000000000000000000000000000000000000000000000ae363fab463a0000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -7454,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec340000000000000000000000007ab0a4be35d0a5541ac28b23b4de6d00f7ef8a5e0000000000000000000000007ab0a4be35d0a5541ac28b23b4de6d00f7ef8a5e00000000000000000000000000000000000000000000000000adcb6a37ad000000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -7455,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec34000000000000000000000000f1e407b2f39cf536e29d6cd3ff23ee39444efd35000000000000000000000000f1e407b2f39cf536e29d6cd3ff23ee39444efd3500000000000000000000000000000000000000000000000000ad548e29a9650000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -7456,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec340000000000000000000000001fa280ed16803d8338010ddb496d9a4285d0fa0e0000000000000000000000001fa280ed16803d8338010ddb496d9a4285d0fa0e00000000000000000000000000000000000000000000000000a0c97fbcad5b7d00000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -7457,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec34000000000000000000000000064a1f73d89381b60de444a15af69caea1dafd25000000000000000000000000064a1f73d89381b60de444a15af69caea1dafd2500000000000000000000000000000000000000000000000000ad8a407be3a50000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -7458,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec34000000000000000000000000dbe9b37777d1d8a62b5d102e7e1bd98db67c3e25000000000000000000000000dbe9b37777d1d8a62b5d102e7e1bd98db67c3e2500000000000000000000000000000000000000000000000000038d7ea4c6800000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -7459,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec34000000000000000000000000d8610fede62ce73f5badced1fa3b31064358d442000000000000000000000000d8610fede62ce73f5badced1fa3b31064358d44200000000000000000000000000000000000000000000000000ad76f46656b60000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -7460,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec340000000000000000000000001555f1925e30242e6bea7c61535ca37c5b5296e70000000000000000000000001555f1925e30242e6bea7c61535ca37c5b5296e700000000000000000000000000000000000000000000000000ad76f46656b60000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -7461,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec34000000000000000000000000075b79f415445ad96c502cc40a3207d784aa253d000000000000000000000000075b79f415445ad96c502cc40a3207d784aa253d00000000000000000000000000000000000000000000000000a658094349467d00000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -7462,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec3400000000000000000000000031e5910ab03575cddf4a8c5e960af53ae8644ea000000000000000000000000031e5910ab03575cddf4a8c5e960af53ae8644ea000000000000000000000000000000000000000000000000000ad3c80f4d4a30000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -7464,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec34000000000000000000000000c11c53143696077d3bbd52d5a229e619069be1c7000000000000000000000000c11c53143696077d3bbd52d5a229e619069be1c700000000000000000000000000000000000000000000000000ade4dd66a5f10000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -7465,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec3400000000000000000000000074ef14b3dd4df02cc46a2c0794fb23e63d61a2e000000000000000000000000074ef14b3dd4df02cc46a2c0794fb23e63d61a2e000000000000000000000000000000000000000000000000000adcbb1d01aa30000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -7466,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec34000000000000000000000000564473919343604508a0a629de4358f05b6217e3000000000000000000000000564473919343604508a0a629de4358f05b6217e300000000000000000000000000000000000000000000000000adcbb1d01aa30000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -7467,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec34000000000000000000000000a258434cbb2ede8d85fc9793f86c616236ee00db000000000000000000000000a258434cbb2ede8d85fc9793f86c616236ee00db00000000000000000000000000000000000000000000000000adcbb1d01aa30000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -7468,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec34000000000000000000000000036d00e21a271287f3ba0905f59fdc2954613a92000000000000000000000000036d00e21a271287f3ba0905f59fdc2954613a9200000000000000000000000000000000000000000000000000ad7a4f8b7a5a0000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -7469,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec340000000000000000000000004f8c2d3c16f7e6d8c34f8e152c15a8689d1296cd0000000000000000000000004f8c2d3c16f7e6d8c34f8e152c15a8689d1296cd00000000000000000000000000000000000000000000000000ad60059338800000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -7470,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec34000000000000000000000000d7cbd7e623a1622cc16a252e796710c6073a1489000000000000000000000000d7cbd7e623a1622cc16a252e796710c6073a148900000000000000000000000000000000000000000000000000add3867c18770000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -7471,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec3400000000000000000000000051d03118eb9206f5118372ca58ec7397e54655ed00000000000000000000000051d03118eb9206f5118372ca58ec7397e54655ed00000000000000000000000000000000000000000000000000add3867c18770000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -7472,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec340000000000000000000000001fa280ed16803d8338010ddb496d9a4285d0fa0e0000000000000000000000001fa280ed16803d8338010ddb496d9a4285d0fa0e000000000000000000000000000000000000000000000000001dc3ce3c689ab400000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -7474,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec34000000000000000000000000f426fadc9ae9ba557887b706e391d766df0f0fa5000000000000000000000000f426fadc9ae9ba557887b706e391d766df0f0fa500000000000000000000000000000000000000000000000000ad4ef64118a90000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -7475,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec340000000000000000000000008aea5dea3876e506eae703509ef214becff891df0000000000000000000000008aea5dea3876e506eae703509ef214becff891df00000000000000000000000000000000000000000000000000adc3065ad3e60000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -7476,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec34000000000000000000000000f3320052a474497938b9acfb3615918767257758000000000000000000000000f3320052a474497938b9acfb361591876725775800000000000000000000000000000000000000000000000000addd505315c00000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -7477,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec34000000000000000000000000d72895f98c83d7528b05329c75b463dc511e22a4000000000000000000000000d72895f98c83d7528b05329c75b463dc511e22a400000000000000000000000000000000000000000000000000adff6ef7556e0000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -7479,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec34000000000000000000000000f00ff423a370e6cbbdd08768fc5bf39635f22352000000000000000000000000f00ff423a370e6cbbdd08768fc5bf39635f2235200000000000000000000000000000000000000000000000000ae301891da380000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -7481,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec34000000000000000000000000315ff0594cdc932fb91ccdfab5b713d3f86b9b0a000000000000000000000000315ff0594cdc932fb91ccdfab5b713d3f86b9b0a00000000000000000000000000000000000000000000000000ae233b2e26ee0000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -7482,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec340000000000000000000000005668a0a0a359e17e2bb27ac3978400e67fa09c2a0000000000000000000000005668a0a0a359e17e2bb27ac3978400e67fa09c2a00000000000000000000000000000000000000000000000000ae8bd3de53100000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -7483,0x10e6593cdda8c58a1d0f14c5164b376352a55f2f,0x467194771dae2967aef3ecbedd3bf9a310c76c65,0xa9f9e6750000000000000000000000006b175474e89094c44da98b954eedeac495271d0f000000000000000000000000da10009cbd5d07dd0cecc66161fc93d7c9000da1000000000000000000000000f6e7aad312ec5b59a360091eafb4e2db2be0ce02000000000000000000000000f6e7aad312ec5b59a360091eafb4e2db2be0ce020000000000000000000000000000000000000000000000000dcf877b646fe8a300000000000000000000000000000000000000000000000000000000000000c00000000000000000000000000000000000000000000000000000000000000000,,,1,true -7484,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec340000000000000000000000007c1df74089df99917816cc2ada2ac3f817520a470000000000000000000000007c1df74089df99917816cc2ada2ac3f817520a4700000000000000000000000000000000000000000000000000ae83700179f60000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -7485,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec34000000000000000000000000d13acab6a8e805e1c9d6221cfaa4f07f4e947d0c000000000000000000000000d13acab6a8e805e1c9d6221cfaa4f07f4e947d0c00000000000000000000000000000000000000000000000000aedd7dbb60fc0000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -7486,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec340000000000000000000000002b65deb1b5db4699193006f90301f01d3aa62f710000000000000000000000002b65deb1b5db4699193006f90301f01d3aa62f7100000000000000000000000000000000000000000000000000ae894f8278550000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -7487,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec3400000000000000000000000092f209f5c4ba44273f692f3776e5c2764386c81800000000000000000000000092f209f5c4ba44273f692f3776e5c2764386c81800000000000000000000000000000000000000000000000000ae12bb0ce25d0000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -7488,0x10e6593cdda8c58a1d0f14c5164b376352a55f2f,0x467194771dae2967aef3ecbedd3bf9a310c76c65,0xa9f9e6750000000000000000000000006b175474e89094c44da98b954eedeac495271d0f000000000000000000000000da10009cbd5d07dd0cecc66161fc93d7c9000da10000000000000000000000003dcb335bb0c288ac15a1bca6002fc074221b1fc00000000000000000000000003dcb335bb0c288ac15a1bca6002fc074221b1fc00000000000000000000000000000000000000000000000000dcb8bddfe72a9df00000000000000000000000000000000000000000000000000000000000000c00000000000000000000000000000000000000000000000000000000000000000,,,1,true -7489,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec3400000000000000000000000063ee5872e8549acb99f7b24508d5fee5f3ca5ef000000000000000000000000063ee5872e8549acb99f7b24508d5fee5f3ca5ef000000000000000000000000000000000000000000000000000ae6c3995ee1d0000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -7490,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec34000000000000000000000000459ce113d1a1cbf4fbf08e951a7336518f6d02d5000000000000000000000000459ce113d1a1cbf4fbf08e951a7336518f6d02d500000000000000000000000000000000000000000000000000ae6c3995ee1d0000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -7491,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec34000000000000000000000000c9f8ccf9e8a020c00d7796d2ecb62886a438a3cb000000000000000000000000c9f8ccf9e8a020c00d7796d2ecb62886a438a3cb00000000000000000000000000000000000000000000000000ae6c3995ee1d0000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -7492,0x10e6593cdda8c58a1d0f14c5164b376352a55f2f,0x467194771dae2967aef3ecbedd3bf9a310c76c65,0xa9f9e6750000000000000000000000006b175474e89094c44da98b954eedeac495271d0f000000000000000000000000da10009cbd5d07dd0cecc66161fc93d7c9000da10000000000000000000000003768cb4dd86eb023351ed692b7a2914e9bafa6db0000000000000000000000003768cb4dd86eb023351ed692b7a2914e9bafa6db0000000000000000000000000000000000000000000000000dcb76c5bc2565ab00000000000000000000000000000000000000000000000000000000000000c00000000000000000000000000000000000000000000000000000000000000000,,,1,true -7493,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec3400000000000000000000000079e614793261bb897479ba2695e12e52a917479d00000000000000000000000079e614793261bb897479ba2695e12e52a917479d00000000000000000000000000000000000000000000000000adbb794743b50000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -7494,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec34000000000000000000000000034ac975586e7d8fbd6a9b70531d47de1ebb3b8f000000000000000000000000034ac975586e7d8fbd6a9b70531d47de1ebb3b8f00000000000000000000000000000000000000000000000000adbb794743b50000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -7495,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec34000000000000000000000000639aee9a0395d9bcb76078c6c1da119a2ea83078000000000000000000000000639aee9a0395d9bcb76078c6c1da119a2ea8307800000000000000000000000000000000000000000000000000adbb794743b50000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -7496,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec34000000000000000000000000edc113cb810b4b6fb87770e80376e0947d27e3c7000000000000000000000000edc113cb810b4b6fb87770e80376e0947d27e3c700000000000000000000000000000000000000000000000000adf8b8ad0e260000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -7497,0x10e6593cdda8c58a1d0f14c5164b376352a55f2f,0x467194771dae2967aef3ecbedd3bf9a310c76c65,0xa9f9e6750000000000000000000000006b175474e89094c44da98b954eedeac495271d0f000000000000000000000000da10009cbd5d07dd0cecc66161fc93d7c9000da10000000000000000000000005f4b6fd9b735438cf5b8a3288497933249cd8ae50000000000000000000000005f4b6fd9b735438cf5b8a3288497933249cd8ae50000000000000000000000000000000000000000000000000dcb5f47ca0cee7d00000000000000000000000000000000000000000000000000000000000000c00000000000000000000000000000000000000000000000000000000000000000,,,1,true -7498,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec34000000000000000000000000a891a1ced2d7289a643a92e788a271dcdcabb2eb000000000000000000000000a891a1ced2d7289a643a92e788a271dcdcabb2eb00000000000000000000000000000000000000000000000000adf8b8ad0e260000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -7499,0x10e6593cdda8c58a1d0f14c5164b376352a55f2f,0x467194771dae2967aef3ecbedd3bf9a310c76c65,0xa9f9e6750000000000000000000000006b175474e89094c44da98b954eedeac495271d0f000000000000000000000000da10009cbd5d07dd0cecc66161fc93d7c9000da1000000000000000000000000cb1daeebc6a365c6968ad8fe53f8fccdfa05aba1000000000000000000000000cb1daeebc6a365c6968ad8fe53f8fccdfa05aba10000000000000000000000000000000000000000000000000dc5ef108125f78900000000000000000000000000000000000000000000000000000000000000c00000000000000000000000000000000000000000000000000000000000000000,,,1,true -7500,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec34000000000000000000000000a54a961158f8e4611c544b47af75f8a002ac1eb0000000000000000000000000a54a961158f8e4611c544b47af75f8a002ac1eb0000000000000000000000000000000000000000000000000000784f25631540000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -7501,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec34000000000000000000000000219929399f860d4598976051288d2e7b224dc301000000000000000000000000219929399f860d4598976051288d2e7b224dc301000000000000000000000000000000000000000000000000003bf846dec395bb00000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -7504,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec3400000000000000000000000089b559e0286ddd85197694f7b51dcc2d69e2cf3d00000000000000000000000089b559e0286ddd85197694f7b51dcc2d69e2cf3d0000000000000000000000000000000000000000000000000006268f1f360d0600000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -7507,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec3400000000000000000000000060bb17be832944e648c979ab76f40902db27d7df00000000000000000000000060bb17be832944e648c979ab76f40902db27d7df000000000000000000000000000000000000000000000000003d6d04c1f0cb6000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -7509,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec34000000000000000000000000f24b327b0df485a44ff4d7b1289e9e1b4da93fe0000000000000000000000000f24b327b0df485a44ff4d7b1289e9e1b4da93fe000000000000000000000000000000000000000000000000000ae88c0519d0f0000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -7510,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec340000000000000000000000000f801b192adef546d8da04ae9e8c8d134d0157a90000000000000000000000000f801b192adef546d8da04ae9e8c8d134d0157a900000000000000000000000000000000000000000000000000085f61d330706100000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -7513,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec34000000000000000000000000d37bab7903aa966b9a997e3d32ae8bf64b6044d6000000000000000000000000d37bab7903aa966b9a997e3d32ae8bf64b6044d600000000000000000000000000000000000000000000000000adea7811b1fac700000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,0x9fbc98e2b46f938d2f4955fb27b460cb64da110bb6ab43b1c8c8a6d009c314e2,2021-12-13 09:32:28.000 UTC,0,true -7514,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec34000000000000000000000000a846a337ad081e78984ca9f2c20504151b66c29b000000000000000000000000a846a337ad081e78984ca9f2c20504151b66c29b00000000000000000000000000000000000000000000000000adcfe3be87300000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -7515,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec34000000000000000000000000d4961a88513692fd878f1b44986c5c4a639980cc000000000000000000000000d4961a88513692fd878f1b44986c5c4a639980cc00000000000000000000000000000000000000000000000000ae6d9f90124c0000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -7516,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec3400000000000000000000000004c0186d8bc845ae8e09e707bf5dc3fa03f91bed00000000000000000000000004c0186d8bc845ae8e09e707bf5dc3fa03f91bed00000000000000000000000000000000000000000000000000ae6d9f90124c0000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -7517,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec3400000000000000000000000035445c18ff0b5be58fb4397ef6c9072a0b76368500000000000000000000000035445c18ff0b5be58fb4397ef6c9072a0b76368500000000000000000000000000000000000000000000000000ad4ef64118a90000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -7518,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec3400000000000000000000000010e66cc24b7b91c26ee80a284d3e85246f8ca2b700000000000000000000000010e66cc24b7b91c26ee80a284d3e85246f8ca2b700000000000000000000000000000000000000000000000000ae30ef5b23210000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -7519,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec3400000000000000000000000057b62746a34614143c48a26d84f95dab0329d11100000000000000000000000057b62746a34614143c48a26d84f95dab0329d111000000000000000000000000000000000000000000000000003c27d8aeefaac900000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -7520,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec340000000000000000000000009252160105181fbe25dc8aca2e5e4367b2c362f10000000000000000000000009252160105181fbe25dc8aca2e5e4367b2c362f100000000000000000000000000000000000000000000000000ae0e891e75d00000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -7521,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec34000000000000000000000000b3b87a20fe00b4bb4d62107d7f6aebe2e8dc3aa7000000000000000000000000b3b87a20fe00b4bb4d62107d7f6aebe2e8dc3aa7000000000000000000000000000000000000000000000000001ff2bf5f71d00000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -7522,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec34000000000000000000000000772cc8808e7bbeee498ac01f2cb54684bc9737a6000000000000000000000000772cc8808e7bbeee498ac01f2cb54684bc9737a600000000000000000000000000000000000000000000000000ae0e891e75d00000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -7523,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec340000000000000000000000003a876938b4db24735393e0060d2b9ac0998d8e4f0000000000000000000000003a876938b4db24735393e0060d2b9ac0998d8e4f00000000000000000000000000000000000000000000000000ae2be6a36dab0000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -7524,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec340000000000000000000000009997919e8e35921da36a3296926b9b75e54823f30000000000000000000000009997919e8e35921da36a3296926b9b75e54823f300000000000000000000000000000000000000000000000000ae134a3dbda30000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -7525,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec34000000000000000000000000a9a0dc7a3f7216cfbfae6895bc8624575e3aa947000000000000000000000000a9a0dc7a3f7216cfbfae6895bc8624575e3aa94700000000000000000000000000000000000000000000000000ae6d9f90124c0000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -7526,0xcd9d4988c0ae61887b075ba77f08cbfad2b65068,0x3f87ff1de58128ef8fcb4c807efd776e1ac72e51,0xf4f7b41a0000000000000000000000001567fe56a6eb4b473a4ddde014fe8f1731c951060000000000000000000000000000000000000000000000004d73a39e2b1491f9,,,1,true -7527,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec3400000000000000000000000060814e6e0242f07a1ada442fc47918159d0af5fb00000000000000000000000060814e6e0242f07a1ada442fc47918159d0af5fb00000000000000000000000000000000000000000000000000ae5787863cff0000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -7528,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec34000000000000000000000000588235b8980662b2d8aa248c894820c70772d0fe000000000000000000000000588235b8980662b2d8aa248c894820c70772d0fe00000000000000000000000000000000000000000000000000038d7ea4c6800000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -7529,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec340000000000000000000000007f62a6c144422c49d322ab53ebe94081dcc7e0a70000000000000000000000007f62a6c144422c49d322ab53ebe94081dcc7e0a70000000000000000000000000000000000000000000000000003e8f437904d0000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -7530,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec3400000000000000000000000044d0e5b18f58782304750680f5d08df1dc5f2ed100000000000000000000000044d0e5b18f58782304750680f5d08df1dc5f2ed100000000000000000000000000000000000000000000000000ae5787863cff0000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -7531,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec340000000000000000000000000ec7de88937299efad9e2d1a252e4dc6da9e043a0000000000000000000000000ec7de88937299efad9e2d1a252e4dc6da9e043a00000000000000000000000000000000000000000000000000aeb4f06547a90000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -7532,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec34000000000000000000000000492ad0dfa799db64344e97af57249cf921e5ee09000000000000000000000000492ad0dfa799db64344e97af57249cf921e5ee0900000000000000000000000000000000000000000000000000ae8a264bc13e0000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -7533,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec3400000000000000000000000099829510a9bb0bdb0db43300c1def5be184c399e00000000000000000000000099829510a9bb0bdb0db43300c1def5be184c399e00000000000000000000000000000000000000000000000000aebba6af8ef10000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -7534,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec340000000000000000000000005bada7f9158b13cc63b5ff0a1d4cfc7b4687418c0000000000000000000000005bada7f9158b13cc63b5ff0a1d4cfc7b4687418c00000000000000000000000000000000000000000000000000ae9aee0573720000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -7535,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec34000000000000000000000000ad28fc8cccd7a56904f0aac295f46fa5f0e6ce7c000000000000000000000000ad28fc8cccd7a56904f0aac295f46fa5f0e6ce7c00000000000000000000000000000000000000000000000000aeb02f45ffd60000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -7536,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec340000000000000000000000008daf76b646554f9a0b5c12c554653ab7360f200a0000000000000000000000008daf76b646554f9a0b5c12c554653ab7360f200a00000000000000000000000000000000000000000000000000aedc5f59aa700000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -7537,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec3400000000000000000000000056472645efa1c71dc206c6caf9424b5cc281e54800000000000000000000000056472645efa1c71dc206c6caf9424b5cc281e54800000000000000000000000000000000000000000000000000ae46309baf850000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -7538,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec34000000000000000000000000281e5b0130168236f475b0565dd1f03c47c8cf7a000000000000000000000000281e5b0130168236f475b0565dd1f03c47c8cf7a00000000000000000000000000000000000000000000000000aed443153ef90000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -7539,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec34000000000000000000000000b074550f54bb62ca7e770704edcdfb5f285c2a98000000000000000000000000b074550f54bb62ca7e770704edcdfb5f285c2a9800000000000000000000000000000000000000000000000000af1cf9e498850000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -7540,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec34000000000000000000000000c5fae7d266f5890110b285d5b732a908e5624339000000000000000000000000c5fae7d266f5890110b285d5b732a908e562433900000000000000000000000000000000000000000000000000aeb26c096cee0000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -7541,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec340000000000000000000000009a08382adbebaa283ba7780269c9f7703ea3363e0000000000000000000000009a08382adbebaa283ba7780269c9f7703ea3363e00000000000000000000000000000000000000000000000000aeb26c096cee0000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -7542,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec34000000000000000000000000ff9470aa9ab2c0763c5223028df0d160c6ccf018000000000000000000000000ff9470aa9ab2c0763c5223028df0d160c6ccf01800000000000000000000000000000000000000000000000000ae820a0755c70000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -7543,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec3400000000000000000000000022532682436ad59a16baf0e986042e1e640f37ca00000000000000000000000022532682436ad59a16baf0e986042e1e640f37ca00000000000000000000000000000000000000000000000000aea783d0b9190000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -7544,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec34000000000000000000000000df04be0d58741743c1152c78fc3d1bc4a33dcd3a000000000000000000000000df04be0d58741743c1152c78fc3d1bc4a33dcd3a00000000000000000000000000000000000000000000000000ae9d2ac8e08a0000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -7545,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec34000000000000000000000000f772ce83e0411588bd6318d1a7b6585854b11188000000000000000000000000f772ce83e0411588bd6318d1a7b6585854b1118800000000000000000000000000000000000000000000000000aee002173bb70000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -7546,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec34000000000000000000000000d80a617cd71449abda8585fb9895a0c80b99001d000000000000000000000000d80a617cd71449abda8585fb9895a0c80b99001d00000000000000000000000000000000000000000000000000ae8e9fd29b6e0000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -7547,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec3400000000000000000000000018d729566ae764c238c2a9bc9cef3a1710cedaad00000000000000000000000018d729566ae764c238c2a9bc9cef3a1710cedaad00000000000000000000000000000000000000000000000000ae8f769be4570000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -7548,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec3400000000000000000000000014e4be76d2152b25553509459cf20394cf581fef00000000000000000000000014e4be76d2152b25553509459cf20394cf581fef00000000000000000000000000000000000000000000000000ae63d5b915030000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -7549,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec340000000000000000000000006ffa47af2bda483d1c94795223020774aeb3d3f30000000000000000000000006ffa47af2bda483d1c94795223020774aeb3d3f300000000000000000000000000000000000000000000000000aec88413423b0000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -7550,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec3400000000000000000000000054cbc1c6f27e32abb247ed24931041f545ffcfa900000000000000000000000054cbc1c6f27e32abb247ed24931041f545ffcfa900000000000000000000000000000000000000000000000000ae85acc4e70e0000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -7551,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec34000000000000000000000000562cb434b6b0163e78cbcefea6557ceb18ed0d2a000000000000000000000000562cb434b6b0163e78cbcefea6557ceb18ed0d2a00000000000000000000000000000000000000000000000000aeab6e26b8030000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -7552,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec340000000000000000000000009ca24558487bb0e0b7d919c10b68bd4766b65ba90000000000000000000000009ca24558487bb0e0b7d919c10b68bd4766b65ba900000000000000000000000000000000000000000000000000ae9aee0573720000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -7553,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec34000000000000000000000000533c373483ced08185769e8b75c5ae7a0913420e000000000000000000000000533c373483ced08185769e8b75c5ae7a0913420e00000000000000000000000000000000000000000000000000ae9aee0573720000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -7554,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec340000000000000000000000006960f073f21f08f9e70d92a3829a9639883860160000000000000000000000006960f073f21f08f9e70d92a3829a96398838601600000000000000000000000000000000000000000000000000ae3dccbed66b0000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -7555,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec340000000000000000000000004610982bc3942433c50ce6ea228da3d118a467810000000000000000000000004610982bc3942433c50ce6ea228da3d118a4678100000000000000000000000000000000000000000000000000ae3dccbed66b0000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -7556,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec34000000000000000000000000f30859796a0d2618a1e6dd27a47f27ce03bb210d000000000000000000000000f30859796a0d2618a1e6dd27a47f27ce03bb210d00000000000000000000000000000000000000000000000000add60ad7f3320000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -7557,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec34000000000000000000000000a16a05b1833a0bb47226e35b18f60c6145a4039a000000000000000000000000a16a05b1833a0bb47226e35b18f60c6145a4039a00000000000000000000000000000000000000000000000000ad8bee0e75770000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -7558,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec3400000000000000000000000081f019fb5dbc4123d0273f7fbab06e78f889189800000000000000000000000081f019fb5dbc4123d0273f7fbab06e78f889189800000000000000000000000000000000000000000000000000ad2c00d390120000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -7559,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec34000000000000000000000000c10dbf2acf476b2e64beecefb531cd42ec6c4531000000000000000000000000c10dbf2acf476b2e64beecefb531cd42ec6c453100000000000000000000000000000000000000000000000000ad2c00d390120000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -7560,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec3400000000000000000000000087ac26530ba964e0b63df037adb69c050f42683100000000000000000000000087ac26530ba964e0b63df037adb69c050f42683100000000000000000000000000000000000000000000000000ad9bdefedec20000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -7561,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec34000000000000000000000000d5b1318c4c0a00d9a6bd2d1a5df78849671d4451000000000000000000000000d5b1318c4c0a00d9a6bd2d1a5df78849671d445100000000000000000000000000000000000000000000000000ad1edbd76f250000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -7562,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec3400000000000000000000000083af5f707e02c7fe0a08e6fe1e680028848e1b6900000000000000000000000083af5f707e02c7fe0a08e6fe1e680028848e1b6900000000000000000000000000000000000000000000000000acf06f0057730000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -7563,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec34000000000000000000000000599f9850a621ed6f53d4ea55f905b24a6001bada000000000000000000000000599f9850a621ed6f53d4ea55f905b24a6001bada00000000000000000000000000000000000000000000000000ad69cf6a35c90000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -7564,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec34000000000000000000000000209e56d2595d1b2506d73b97e26b09ed01b83649000000000000000000000000209e56d2595d1b2506d73b97e26b09ed01b8364900000000000000000000000000000000000000000000000000adb35d02d83e0000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -7566,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec34000000000000000000000000c369d580e0edddbc4ae412febd6754db90461aa0000000000000000000000000c369d580e0edddbc4ae412febd6754db90461aa000000000000000000000000000000000000000000000000000adb35d02d83e0000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -7567,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec340000000000000000000000005133ba94f973019f002dbce1a90c250422defa1c0000000000000000000000005133ba94f973019f002dbce1a90c250422defa1c00000000000000000000000000000000000000000000000000addeb64d39ef0000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -7569,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec34000000000000000000000000fc9dc3b6dc79e8801e1b5f57f0e255f28b0499bd000000000000000000000000fc9dc3b6dc79e8801e1b5f57f0e255f28b0499bd00000000000000000000000000000000000000000000000000ae4364a767270000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -7570,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec34000000000000000000000000cffa2bad785cc2d369830692fbbf7ed3d8a0f983000000000000000000000000cffa2bad785cc2d369830692fbbf7ed3d8a0f98300000000000000000000000000000000000000000000000000ae2696534a920000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -7571,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec3400000000000000000000000040bc79e4558c74168f3c113a9d9a4aad6f29624c00000000000000000000000040bc79e4558c74168f3c113a9d9a4aad6f29624c00000000000000000000000000000000000000000000000000ae2696534a920000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -7572,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec340000000000000000000000007720064a8dc14750449304ba9307f9567bfad0960000000000000000000000007720064a8dc14750449304ba9307f9567bfad09600000000000000000000000000000000000000000000000000ae25bf8a01a90000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -7573,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec34000000000000000000000000e17b3c19eb8e4ca5eb0af01c2d5c944b73d1eeeb000000000000000000000000e17b3c19eb8e4ca5eb0af01c2d5c944b73d1eeeb00000000000000000000000000000000000000000000000000ae25bf8a01a90000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -7574,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec3400000000000000000000000047d713f03e4520c3949093c90c8e0f40c60ca19000000000000000000000000047d713f03e4520c3949093c90c8e0f40c60ca19000000000000000000000000000000000000000000000000000ae904d652d400000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -7575,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec340000000000000000000000008582fdfa0003af19f26470ed2f7d18e5aeb000060000000000000000000000008582fdfa0003af19f26470ed2f7d18e5aeb0000600000000000000000000000000000000000000000000000000adc6a918652d0000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -7576,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec34000000000000000000000000f7fbb67ca1f7db16e798952a7b4e1ef84b247054000000000000000000000000f7fbb67ca1f7db16e798952a7b4e1ef84b24705400000000000000000000000000000000000000000000000000ad995aa304070000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -7577,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec34000000000000000000000000432e0d86aa20743fc53e361b06975cd34fce2e4f000000000000000000000000432e0d86aa20743fc53e361b06975cd34fce2e4f00000000000000000000000000000000000000000000000000ad884b50e4300000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -7578,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec340000000000000000000000008159bb4c392c0d904a0372933683f60cf3cc4f100000000000000000000000008159bb4c392c0d904a0372933683f60cf3cc4f10000000000000000000000000000000000000000000000000000aa87bee53800000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -7579,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec34000000000000000000000000e5b5dbb678b8b4314384b60d6f9a293ae1b58b8d000000000000000000000000e5b5dbb678b8b4314384b60d6f9a293ae1b58b8d00000000000000000000000000000000000000000000000000adc58ab6aea10000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -7580,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec3400000000000000000000000005cd19361680979905686aaa5870d73991bb362900000000000000000000000005cd19361680979905686aaa5870d73991bb362900000000000000000000000000000000000000000000000000addddf83f1060000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -7581,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec34000000000000000000000000c89b8dd7e3e137db108575eeae301e52b6c72d9f000000000000000000000000c89b8dd7e3e137db108575eeae301e52b6c72d9f000000000000000000000000000000000000000000000000016a264bacc1280000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -7582,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec34000000000000000000000000638f308e92240793b35910cb87bf9a580a3fa162000000000000000000000000638f308e92240793b35910cb87bf9a580a3fa16200000000000000000000000000000000000000000000000000adf9d70ec4b20000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -7583,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec34000000000000000000000000d3a4cc5bbd5a061575a019f4e2c5f8cb1167be11000000000000000000000000d3a4cc5bbd5a061575a019f4e2c5f8cb1167be1100000000000000000000000000000000000000000000000000ad8803b8768d0000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -7585,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec34000000000000000000000000a80f1a7623fd8e04b0e0f4e2a8d393852da63211000000000000000000000000a80f1a7623fd8e04b0e0f4e2a8d393852da6321100000000000000000000000000000000000000000000000000adbcdf4167e40000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -7586,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec34000000000000000000000000c6b51cf482a0bed3f88614e1fa8484ad9117039e000000000000000000000000c6b51cf482a0bed3f88614e1fa8484ad9117039e00000000000000000000000000000000000000000000000000adbcdf4167e40000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -7587,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec34000000000000000000000000b89defa50227491d7587eeef3e706ce0fcc3b595000000000000000000000000b89defa50227491d7587eeef3e706ce0fcc3b59500000000000000000000000000000000000000000000000000acde414c81100000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -7588,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec34000000000000000000000000eeaa75be33235789287252d238cbe9f2c58ac051000000000000000000000000eeaa75be33235789287252d238cbe9f2c58ac051000000000000000000000000000000000000000000000000000aa87bee53800000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -7589,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec34000000000000000000000000a5036e0c6217193784ba3f50e2cafa5056edfd25000000000000000000000000a5036e0c6217193784ba3f50e2cafa5056edfd2500000000000000000000000000000000000000000000000000ad43c66ff7310000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -7590,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec34000000000000000000000000a3e358543a57a213d4df6cf884570a1b9e0de7ea000000000000000000000000a3e358543a57a213d4df6cf884570a1b9e0de7ea00000000000000000000000000000000000000000000000000adac5f2023530000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -7591,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec34000000000000000000000000e8bbe5d99fe12ad0f5db68ab893f408ebdf4d5d2000000000000000000000000e8bbe5d99fe12ad0f5db68ab893f408ebdf4d5d20000000000000000000000000000000000000000000000000005c5ba7442b96e00000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -7592,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec3400000000000000000000000060024087c862f75febe1f249808a54ec6a7da89e00000000000000000000000060024087c862f75febe1f249808a54ec6a7da89e00000000000000000000000000000000000000000000000000ade211725d930000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -7593,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec340000000000000000000000008780aa9160d3da8fbb2b1a05278c5dac31ad36720000000000000000000000008780aa9160d3da8fbb2b1a05278c5dac31ad367200000000000000000000000000000000000000000000000000ade211725d930000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -7594,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec34000000000000000000000000d218950ec60eb78201acf20f2c3b8fd66888da94000000000000000000000000d218950ec60eb78201acf20f2c3b8fd66888da9400000000000000000000000000000000000000000000000000ad5f2ec9ef970000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -7595,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec34000000000000000000000000d2b96cdd902ba47b97dc98d4da4e7b696f5e0f1d000000000000000000000000d2b96cdd902ba47b97dc98d4da4e7b696f5e0f1d00000000000000000000000000000000000000000000000000adde271c5ea90000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -7597,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec3400000000000000000000000001a8a09311d1d558f07f6d05d0e8bc6fd8fe8b8a00000000000000000000000001a8a09311d1d558f07f6d05d0e8bc6fd8fe8b8a00000000000000000000000000000000000000000000000000f8b0a10e47000000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -7598,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec34000000000000000000000000d7789cdf5b5ff0cf171b4b389986f35844e502a6000000000000000000000000d7789cdf5b5ff0cf171b4b389986f35844e502a600000000000000000000000000000000000000000000000000adf320c47d6a0000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -7599,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec340000000000000000000000005a56de955933d795418532eec5b4690c2f7e64350000000000000000000000005a56de955933d795418532eec5b4690c2f7e643500000000000000000000000000000000000000000000000000ae6a8c035c4b0000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -7600,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec340000000000000000000000000a4bbd1b7b224c31d62d4042e0c08a032c8d77350000000000000000000000000a4bbd1b7b224c31d62d4042e0c08a032c8d773500000000000000000000000000000000000000000000000000adc9750cad8b0000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -7601,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec34000000000000000000000000dc289f97fc3446ecdecd30dd19c56960a24ae950000000000000000000000000dc289f97fc3446ecdecd30dd19c56960a24ae95000000000000000000000000000000000000000000000000000ae30ef5b23210000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -7602,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec3400000000000000000000000038811574db392d15d0827f8cc903283af3ca29ae00000000000000000000000038811574db392d15d0827f8cc903283af3ca29ae00000000000000000000000000000000000000000000000000ae30ef5b23210000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -7603,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec34000000000000000000000000a428bdcb44eb5306bc7991239bba5179872b30de000000000000000000000000a428bdcb44eb5306bc7991239bba5179872b30de00000000000000000000000000000000000000000000000000ad9b9766711f0000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -7604,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec340000000000000000000000006b92df354b82594f63ddbc4cac6eebe2009f155b0000000000000000000000006b92df354b82594f63ddbc4cac6eebe2009f155b00000000000000000000000000000000000000000000000000ad9b9766711f0000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -7605,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec340000000000000000000000007a34169af16e1d8a7d6649b0dbfe85ea18d7ce070000000000000000000000007a34169af16e1d8a7d6649b0dbfe85ea18d7ce0700000000000000000000000000000000000000000000000000ae16ecfb4eea0000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -7606,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec34000000000000000000000000d9682971028449408ae5e809246d056cabbff3fc000000000000000000000000d9682971028449408ae5e809246d056cabbff3fc00000000000000000000000000000000000000000000000000ad7665357b700000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -7607,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec34000000000000000000000000bdb8ed3779a0d42b996fa1d24b2617015450b9a9000000000000000000000000bdb8ed3779a0d42b996fa1d24b2617015450b9a900000000000000000000000000000000000000000000000000adc6f0b0d2d00000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -7608,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec34000000000000000000000000b36118ddb7586072b359fda10d90cd39b24fdf42000000000000000000000000b36118ddb7586072b359fda10d90cd39b24fdf4200000000000000000000000000000000000000000000000000005af3107a400000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -7609,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec3400000000000000000000000022e3bd619ae5c006afec292774d3b6b645dc1c1900000000000000000000000022e3bd619ae5c006afec292774d3b6b645dc1c19000000000000000000000000000000000000000000000000003bade431716b8300000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -7610,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec340000000000000000000000009260bb6c9b32e04547be20db02f6aaa530fc36080000000000000000000000009260bb6c9b32e04547be20db02f6aaa530fc360800000000000000000000000000000000000000000000000000005af3107a400000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -7611,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec340000000000000000000000004088f2fd285c51de2203db3a0c6014b36c7c4d610000000000000000000000004088f2fd285c51de2203db3a0c6014b36c7c4d6100000000000000000000000000000000000000000000000000005af3107a400000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -7612,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec340000000000000000000000001431a59a078a6cba473c3899b6ad358ad698d2a50000000000000000000000001431a59a078a6cba473c3899b6ad358ad698d2a500000000000000000000000000000000000000000000000000adf6c3820eb10000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -7613,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec3400000000000000000000000059bd3cb9cd4c016f0dbcd93bfbdc56b05063de0f00000000000000000000000059bd3cb9cd4c016f0dbcd93bfbdc56b05063de0f00000000000000000000000000000000000000000000000000005af3107a400000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -7614,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec34000000000000000000000000156181484c8a8b3983f5be98a63dce1372eaa7b1000000000000000000000000156181484c8a8b3983f5be98a63dce1372eaa7b100000000000000000000000000000000000000000000000000038d7ea4c6800000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -7615,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec340000000000000000000000007a74627ee05cb76db741f66542a1fbcfed29a20f0000000000000000000000007a74627ee05cb76db741f66542a1fbcfed29a20f00000000000000000000000000000000000000000000000000005af3107a400000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -7616,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec3400000000000000000000000054c1349cff8b5fd7cf4124a778f4aa4676d3599f00000000000000000000000054c1349cff8b5fd7cf4124a778f4aa4676d3599f00000000000000000000000000000000000000000000000000043bf0082b4d8800000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -7618,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec34000000000000000000000000830e7ef90616c0ac756899a26e36fe291a4ea635000000000000000000000000830e7ef90616c0ac756899a26e36fe291a4ea635000000000000000000000000000000000000000000000000004e753cd36cbe0b00000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -7619,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec34000000000000000000000000303e60ea993c8f6bcfd7d0f7d5270a71b458b4c7000000000000000000000000303e60ea993c8f6bcfd7d0f7d5270a71b458b4c700000000000000000000000000000000000000000000000000a56ced518fd7ac00000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -7620,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec3400000000000000000000000086d004eb704b385d2c75c8ff70dcd52ba789ab3a00000000000000000000000086d004eb704b385d2c75c8ff70dcd52ba789ab3a00000000000000000000000000000000000000000000000000005af3107a400000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -7621,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec340000000000000000000000009b361ac29c912fb2b9565719dfff901cf6904d310000000000000000000000009b361ac29c912fb2b9565719dfff901cf6904d31000000000000000000000000000000000000000000000000007119e5e0c33f3800000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -7622,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec340000000000000000000000002c35a338756c87b3f9cc2283ed58e6a36d0508b80000000000000000000000002c35a338756c87b3f9cc2283ed58e6a36d0508b80000000000000000000000000000000000000000000000000020ba9e148b17c000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -7623,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec34000000000000000000000000012e0301eb01dd35007cc04e09051834cb22212c000000000000000000000000012e0301eb01dd35007cc04e09051834cb22212c0000000000000000000000000000000000000000000000000030c2a0fa4cbb0000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -7624,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0xa9f9e675000000000000000000000000a0b86991c6218b36c1d19d4a2e9eb0ce3606eb480000000000000000000000007f5c764cbc14f9669b88837ca1490cca17c31607000000000000000000000000420e26061672cc8d6bf4e0ac93e71fb8b07b542c000000000000000000000000420e26061672cc8d6bf4e0ac93e71fb8b07b542c0000000000000000000000000000000000000000000000000000000001c9c38000000000000000000000000000000000000000000000000000000000000000c00000000000000000000000000000000000000000000000000000000000000000,,,1,true -7626,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec34000000000000000000000000376ff58d081d75732730b57dd516462c07c8a7a9000000000000000000000000376ff58d081d75732730b57dd516462c07c8a7a900000000000000000000000000000000000000000000000000a2ca713d68562e00000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -7627,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec34000000000000000000000000ab0da4e336bc4d777364d14de819aa712a4161c7000000000000000000000000ab0da4e336bc4d777364d14de819aa712a4161c700000000000000000000000000000000000000000000000000a3971e86b06ad800000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -7628,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec3400000000000000000000000023d208c963d9945695882ba278e1769918a241fd00000000000000000000000023d208c963d9945695882ba278e1769918a241fd00000000000000000000000000000000000000000000000000a43508ab10fe4e00000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -7629,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec34000000000000000000000000766c1ee5fe7c684b22becef250e110f61842a01e000000000000000000000000766c1ee5fe7c684b22becef250e110f61842a01e0000000000000000000000000000000000000000000000000039320be8cd412e00000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -7630,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec34000000000000000000000000aafcbe22104766f57d1d60e169cc466697b41913000000000000000000000000aafcbe22104766f57d1d60e169cc466697b4191300000000000000000000000000000000000000000000000000a3272993bf0eef00000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -7631,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec34000000000000000000000000d199eefa598894d13adafce1ef015c758b0fa06f000000000000000000000000d199eefa598894d13adafce1ef015c758b0fa06f00000000000000000000000000000000000000000000000000a32a7937ca7a0200000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -7633,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec340000000000000000000000003f038b3a2adb14326be2c6c011b2b2fe334f1c440000000000000000000000003f038b3a2adb14326be2c6c011b2b2fe334f1c4400000000000000000000000000000000000000000000000000a46d2b2d81b6af00000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -7634,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec34000000000000000000000000a5a9715581c227dbc3c2c7567121dc5118751a7b000000000000000000000000a5a9715581c227dbc3c2c7567121dc5118751a7b0000000000000000000000000000000000000000000000000047f27f41e4138600000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -7635,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec3400000000000000000000000050cf9ddccdeed303f9bc1296bcd09083a62c725f00000000000000000000000050cf9ddccdeed303f9bc1296bcd09083a62c725f0000000000000000000000000000000000000000000000000030b1249eeb127700000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -7638,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec34000000000000000000000000303b464c2b8f94c3f107655e0dfd595fd070f43b000000000000000000000000303b464c2b8f94c3f107655e0dfd595fd070f43b000000000000000000000000000000000000000000000000004e6b8db9ad3a2e00000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -7640,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec34000000000000000000000000f14319280aa9757e41bf7c3fcd02af8b87009aec000000000000000000000000f14319280aa9757e41bf7c3fcd02af8b87009aec0000000000000000000000000000000000000000000000000081e7863b3b1be200000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,0x517e438da569f7389f7f7c8703fe1974054cfbe0a835081af811520234f24931,2022-06-09 08:47:55.000 UTC,0,true -7641,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec340000000000000000000000006577d0b14abfce382d3912a9eff263b7981fb35b0000000000000000000000006577d0b14abfce382d3912a9eff263b7981fb35b00000000000000000000000000000000000000000000000000005af3107a400000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -7642,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec34000000000000000000000000adcfb436689d356ad27bfe508adb5b9d3bd5268e000000000000000000000000adcfb436689d356ad27bfe508adb5b9d3bd5268e00000000000000000000000000000000000000000000000000005af3107a400000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -7643,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec34000000000000000000000000bf10a9e1380ad7f369898e55491c54ce4baa3d67000000000000000000000000bf10a9e1380ad7f369898e55491c54ce4baa3d6700000000000000000000000000000000000000000000000000005af3107a400000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -7644,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0xa9f9e675000000000000000000000000a0b86991c6218b36c1d19d4a2e9eb0ce3606eb480000000000000000000000007f5c764cbc14f9669b88837ca1490cca17c31607000000000000000000000000b4f1ed9aff74e4d0c75e3bb0e3fc637b3c040fca000000000000000000000000b4f1ed9aff74e4d0c75e3bb0e3fc637b3c040fca000000000000000000000000000000000000000000000000000000000000004100000000000000000000000000000000000000000000000000000000000000c00000000000000000000000000000000000000000000000000000000000000000,,,1,true -7645,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec340000000000000000000000006686db6ede1acd9d912710debcac2f7ab35fd2e90000000000000000000000006686db6ede1acd9d912710debcac2f7ab35fd2e900000000000000000000000000000000000000000000000000b1a2bc2ec5000000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -7646,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec3400000000000000000000000070498fbc17815115d12482f3666415853ef9b70e00000000000000000000000070498fbc17815115d12482f3666415853ef9b70e0000000000000000000000000000000000000000000000000036b67ce1e1629300000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -7647,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec340000000000000000000000000283141f359a0aa691cb294072924dd449f98b560000000000000000000000000283141f359a0aa691cb294072924dd449f98b5600000000000000000000000000000000000000000000000002be01c867c2dc4200000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -7649,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec340000000000000000000000006668460ef71721227b6d59a0cd091ce655bc9f7a0000000000000000000000006668460ef71721227b6d59a0cd091ce655bc9f7a000000000000000000000000000000000000000000000000001e87f2bb63444000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -7651,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec340000000000000000000000002922804f9d43dd90737c3c2d47eb787ed5d800e20000000000000000000000002922804f9d43dd90737c3c2d47eb787ed5d800e2000000000000000000000000000000000000000000000000008b93a93c26c00200000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -7653,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec3400000000000000000000000084e89efbead5707b3665707cd273704d36b3b98a00000000000000000000000084e89efbead5707b3665707cd273704d36b3b98a000000000000000000000000000000000000000000000000018109287ce0030000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -7654,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec340000000000000000000000009d70c7fc7e403b88ef65ea7581dd209314fce6df0000000000000000000000009d70c7fc7e403b88ef65ea7581dd209314fce6df000000000000000000000000000000000000000000000000006341a660658f0000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -7656,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0xa9f9e675000000000000000000000000dac17f958d2ee523a2206206994597c13d831ec700000000000000000000000094b008aa00579c1307b0ef2c499ad98a8ce58e58000000000000000000000000df60be630e94a957b5f4033c7def69e1c4554bb6000000000000000000000000df60be630e94a957b5f4033c7def69e1c4554bb6000000000000000000000000000000000000000000000000000000001330c1f300000000000000000000000000000000000000000000000000000000000000c00000000000000000000000000000000000000000000000000000000000000000,,,1,true -7657,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec340000000000000000000000003e04e81d73664ab466181f467d37b065021e78b50000000000000000000000003e04e81d73664ab466181f467d37b065021e78b5000000000000000000000000000000000000000000000000003ff2e795f5000000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -7658,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec34000000000000000000000000c5dc13274c280a380fda4490f3cab944338a01ee000000000000000000000000c5dc13274c280a380fda4490f3cab944338a01ee0000000000000000000000000000000000000000000000000050dc7bd9f5ec1500000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -7660,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec340000000000000000000000006860fe601068c2ed033fdb17ca1bc8351db6a8a80000000000000000000000006860fe601068c2ed033fdb17ca1bc8351db6a8a8000000000000000000000000000000000000000000000000013a73e82249930000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -7662,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec34000000000000000000000000bf39ddbac5cfedc4476b4088904131ce3cad1d14000000000000000000000000bf39ddbac5cfedc4476b4088904131ce3cad1d140000000000000000000000000000000000000000000000000131f9a1516d1cf000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -7663,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec3400000000000000000000000082a87dc8b036f8542d8373ef194b46b096eb41ad00000000000000000000000082a87dc8b036f8542d8373ef194b46b096eb41ad0000000000000000000000000000000000000000000000000015dfa32da4fb4300000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -7664,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec34000000000000000000000000a509ef076b42e1face74c267f454e60f1ce779bd000000000000000000000000a509ef076b42e1face74c267f454e60f1ce779bd00000000000000000000000000000000000000000000000000038d7ea4c6800000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -7665,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec34000000000000000000000000443571116e56aa45b6bf8408641ef13474708c21000000000000000000000000443571116e56aa45b6bf8408641ef13474708c210000000000000000000000000000000000000000000000000003e871b540c00000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -7666,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec34000000000000000000000000af297dec752c909092a117a932a8ca4aaaff9795000000000000000000000000af297dec752c909092a117a932a8ca4aaaff979500000000000000000000000000000000000000000000000002b834d8500c4c8400000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,0xa477a8986a9ef854b6a43e97ae05ecd585d39c8eb9a97fa19646fca1ee05704f,2022-08-06 22:25:41.000 UTC,0,true -7671,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec34000000000000000000000000b050e6833ae2d750c90183259d45fee366436e34000000000000000000000000b050e6833ae2d750c90183259d45fee366436e34000000000000000000000000000000000000000000000000002aa1efb94e000000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -7672,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec3400000000000000000000000045c0b853c382516ff6aa825ea1bb59d1aeafb1de00000000000000000000000045c0b853c382516ff6aa825ea1bb59d1aeafb1de000000000000000000000000000000000000000000000000002977670646daa000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -7674,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec3400000000000000000000000026462ddd25e757d3f8dae688be7d78e6154a005000000000000000000000000026462ddd25e757d3f8dae688be7d78e6154a005000000000000000000000000000000000000000000000000000038d7ea4c6800000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -7677,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec34000000000000000000000000541f1e027ed075e356d895014c2da8778694ea6a000000000000000000000000541f1e027ed075e356d895014c2da8778694ea6a00000000000000000000000000000000000000000000000000eaaf3737da138400000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -7678,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec34000000000000000000000000b82f413c1efd1a2a6e7639d5c38fbec70ebe7941000000000000000000000000b82f413c1efd1a2a6e7639d5c38fbec70ebe79410000000000000000000000000000000000000000000000000001c6bf5263400000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -7679,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec3400000000000000000000000005d4c5b72a62ca1e2548f1914252d31a9023fec700000000000000000000000005d4c5b72a62ca1e2548f1914252d31a9023fec7000000000000000000000000000000000000000000000000000ab5ea67a7910500000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,0x093d477e04e391668e29a96121574ea4eba65185870fc84935fed4c9a6b61446,2022-04-26 17:44:13.000 UTC,0,true -7681,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec3400000000000000000000000037824015ff5d2337339c7fde958fcdd2fd99151a00000000000000000000000037824015ff5d2337339c7fde958fcdd2fd99151a000000000000000000000000000000000000000000000000001c6bf52634000000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -7682,0x10e6593cdda8c58a1d0f14c5164b376352a55f2f,0x467194771dae2967aef3ecbedd3bf9a310c76c65,0xa9f9e6750000000000000000000000006b175474e89094c44da98b954eedeac495271d0f000000000000000000000000da10009cbd5d07dd0cecc66161fc93d7c9000da1000000000000000000000000f16d205fb2ad682e9c844357194358ee3505706c000000000000000000000000f16d205fb2ad682e9c844357194358ee3505706c00000000000000000000000000000000000000000000000f21518bbffea3386300000000000000000000000000000000000000000000000000000000000000c00000000000000000000000000000000000000000000000000000000000000000,,,1,true -7683,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec3400000000000000000000000039885aacc9dc0b053131605fc2f43b2f1275014300000000000000000000000039885aacc9dc0b053131605fc2f43b2f12750143000000000000000000000000000000000000000000000000001dd477d908370000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -7684,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec340000000000000000000000005f48fc75f1dfc63d2f0636ca0292dd33918091c30000000000000000000000005f48fc75f1dfc63d2f0636ca0292dd33918091c300000000000000000000000000000000000000000000000000f38f04e566090000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -7685,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec34000000000000000000000000ea33cf28ccbf57277428c1c03c70c0a482efda52000000000000000000000000ea33cf28ccbf57277428c1c03c70c0a482efda52000000000000000000000000000000000000000000000000030d98d59a96000000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -7687,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec340000000000000000000000008b32f9141f100ebcc304f78bbd8ef9da730342170000000000000000000000008b32f9141f100ebcc304f78bbd8ef9da73034217000000000000000000000000000000000000000000000000002386f26fc1000000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -7688,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec340000000000000000000000008b32f9141f100ebcc304f78bbd8ef9da730342170000000000000000000000008b32f9141f100ebcc304f78bbd8ef9da73034217000000000000000000000000000000000000000000000000002386f26fc1000000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -7692,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec3400000000000000000000000043ccda6275973913ec16392afec6b1f547afded300000000000000000000000043ccda6275973913ec16392afec6b1f547afded30000000000000000000000000000000000000000000000000086633e873fdcb600000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -7693,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec34000000000000000000000000b6bc866c9110ce7c29c197197d0e76204be1175e000000000000000000000000b6bc866c9110ce7c29c197197d0e76204be1175e000000000000000000000000000000000000000000000000001aaba9e27ad30000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -7694,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec3400000000000000000000000019935d31af29c8c7dd7a975b86ea63d712e4270f00000000000000000000000019935d31af29c8c7dd7a975b86ea63d712e4270f000000000000000000000000000000000000000000000000001866704f306e0000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -7695,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec340000000000000000000000007bcbeb74cf9297dc3bff964478bf8637f61c30a60000000000000000000000007bcbeb74cf9297dc3bff964478bf8637f61c30a6000000000000000000000000000000000000000000000000002a81827431cd4000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -7697,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec34000000000000000000000000b2e81226fad8b5e2ca20145d6d06880e4bd2cf18000000000000000000000000b2e81226fad8b5e2ca20145d6d06880e4bd2cf180000000000000000000000000000000000000000000000000011c37937e0800000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -7698,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec3400000000000000000000000016217daf5a44a7b610ee836d51c5ee177b0efe7500000000000000000000000016217daf5a44a7b610ee836d51c5ee177b0efe750000000000000000000000000000000000000000000000000041399c31a0119a00000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -7700,0xcd9d4988c0ae61887b075ba77f08cbfad2b65068,0x3f87ff1de58128ef8fcb4c807efd776e1ac72e51,0xf4f7b41a0000000000000000000000005bca305df5b8446546224d7e548ef4e681eacfc9000000000000000000000000000000000000000000000000a0c0676b65a05728,0x3ec8b5d5194d2e830f576c3f5cfd981389dcaef4c2a71871172f29eff58e51ca,2022-04-27 06:06:25.000 UTC,0,true -7701,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec3400000000000000000000000018361c087e74e742a84dc724dfec5b1565c6005800000000000000000000000018361c087e74e742a84dc724dfec5b1565c60058000000000000000000000000000000000000000000000000001b9241725cf3fb00000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -7702,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec34000000000000000000000000a7ce80b7681693de60bc0e1e5d5ad37080523990000000000000000000000000a7ce80b7681693de60bc0e1e5d5ad370805239900000000000000000000000000000000000000000000000000034e06092dd1ac800000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -7703,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec340000000000000000000000007ef449eee029a136bf7d43ba1e1ba2350252b1d40000000000000000000000007ef449eee029a136bf7d43ba1e1ba2350252b1d400000000000000000000000000000000000000000000000000df9cc405d75f0000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -7704,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec34000000000000000000000000ab38b08d03e8011b9badb8472fb2a61d901754e1000000000000000000000000ab38b08d03e8011b9badb8472fb2a61d901754e1000000000000000000000000000000000000000000000000013fbe85edc9000000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -7705,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec340000000000000000000000001ff29c355d137c263062bde72a48523893bbd2440000000000000000000000001ff29c355d137c263062bde72a48523893bbd2440000000000000000000000000000000000000000000000000037bc3d8277c3c000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -7706,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec3400000000000000000000000002c5220549c03c01b8bc9435efa65a65a946b43300000000000000000000000002c5220549c03c01b8bc9435efa65a65a946b4330000000000000000000000000000000000000000000000000038463680fc668000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -7707,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec3400000000000000000000000049c8eb6dd499473c368b7429f6d5110816bf1bb400000000000000000000000049c8eb6dd499473c368b7429f6d5110816bf1bb400000000000000000000000000000000000000000000000000363f4bcffdf6c000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -7708,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec34000000000000000000000000ceb97387e83c6a6f7d846bb5d8ab4deb2d16bebc000000000000000000000000ceb97387e83c6a6f7d846bb5d8ab4deb2d16bebc00000000000000000000000000000000000000000000000000268d857d475ac000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -7709,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec34000000000000000000000000350b6bc3134039195e9a35663a5943f52d33734e000000000000000000000000350b6bc3134039195e9a35663a5943f52d33734e000000000000000000000000000000000000000000000000002e4dbe3087798000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -7710,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec34000000000000000000000000d9d90b7a1cc20b181560229e7263b9e1abaf66ee000000000000000000000000d9d90b7a1cc20b181560229e7263b9e1abaf66ee00000000000000000000000000000000000000000000000000263f8ae4d1db0000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -7711,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec340000000000000000000000001bd425a743300559d70490c4bb2c68d4e1bd80cd0000000000000000000000001bd425a743300559d70490c4bb2c68d4e1bd80cd00000000000000000000000000000000000000000000000000265805cff49b8000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -7712,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec3400000000000000000000000061d6edb871b41d0adbf263070c15a2af992e7f9d00000000000000000000000061d6edb871b41d0adbf263070c15a2af992e7f9d0000000000000000000000000000000000000000000000000028bbc836e1144000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -7713,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec34000000000000000000000000f6d3d319584ed3e9630f9592c4b51252a3f4c770000000000000000000000000f6d3d319584ed3e9630f9592c4b51252a3f4c770000000000000000000000000000000000000000000000000000a4d88ddd9400000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -7714,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec3400000000000000000000000082dd0a466e873367cc171335bf8b699f6045918f00000000000000000000000082dd0a466e873367cc171335bf8b699f6045918f000000000000000000000000000000000000000000000000002e1869fe5f95c000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -7717,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec34000000000000000000000000ab40f53f84ad9a8dc03ccb2acf192df56236b573000000000000000000000000ab40f53f84ad9a8dc03ccb2acf192df56236b5730000000000000000000000000000000000000000000000000035366a0992e9d500000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -7718,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec34000000000000000000000000d1bcdc1594dd5511c7cdeaf0dc149b7cfaf87cf1000000000000000000000000d1bcdc1594dd5511c7cdeaf0dc149b7cfaf87cf100000000000000000000000000000000000000000000000000007f4978ad333600000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -7720,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec3400000000000000000000000097c9b49b19b7f5cad4bec2933a68cfef21f4593900000000000000000000000097c9b49b19b7f5cad4bec2933a68cfef21f459390000000000000000000000000000000000000000000000000018de76816d800000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -7722,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec34000000000000000000000000c76dc52cdc620480c81c8de2c2d71e6fc853a7ff000000000000000000000000c76dc52cdc620480c81c8de2c2d71e6fc853a7ff000000000000000000000000000000000000000000000000000e6506a1faeaad00000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -7723,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec340000000000000000000000006e1e28903dab85d87f00feacaea6596fb41ec4e70000000000000000000000006e1e28903dab85d87f00feacaea6596fb41ec4e700000000000000000000000000000000000000000000000000010b8113f0304800000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -7727,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec340000000000000000000000006cb37d07f9314d47e81a8eb4447120e7521f9dea0000000000000000000000006cb37d07f9314d47e81a8eb4447120e7521f9dea000000000000000000000000000000000000000000000000008dc358448a182d00000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,0xd497fb4a129b54902bf49068784e564d1f0ad56e5c8cc8d31bab028852b23c31,2021-12-12 11:55:52.000 UTC,0,true -7732,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec34000000000000000000000000c204f33f3bc17dd8d637d1edeb1b36c4696c64b4000000000000000000000000c204f33f3bc17dd8d637d1edeb1b36c4696c64b4000000000000000000000000000000000000000000000000008ec12ecd2a5fc500000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -7733,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec34000000000000000000000000e1ddb13c83f96dd45f4db58d76dfbbe0f8c5d5e5000000000000000000000000e1ddb13c83f96dd45f4db58d76dfbbe0f8c5d5e500000000000000000000000000000000000000000000000000ab8bdad64ca20000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -7734,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec34000000000000000000000000b82238511d1e7e28f284c2691823ea971a382a96000000000000000000000000b82238511d1e7e28f284c2691823ea971a382a9600000000000000000000000000000000000000000000000000ab8bdad64ca20000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -7735,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec34000000000000000000000000ce1976f7002d827388c76250173a6cbab0c5ad0d000000000000000000000000ce1976f7002d827388c76250173a6cbab0c5ad0d00000000000000000000000000000000000000000000000000a9f57eb0067b0000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -7736,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec3400000000000000000000000046f7cd2d49ca9ced4ceb57ed5ef81337c576e30c00000000000000000000000046f7cd2d49ca9ced4ceb57ed5ef81337c576e30c00000000000000000000000000000000000000000000000000a904b30749440000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -7737,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec34000000000000000000000000dc103822d42b9861a0d98ae6506de2fd3e23b1d5000000000000000000000000dc103822d42b9861a0d98ae6506de2fd3e23b1d50000000000000000000000000000000000000000000000000011c37937e0800000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -7738,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec34000000000000000000000000ff7bdbe12a3ad62b2815425c9f0d13d059c729a5000000000000000000000000ff7bdbe12a3ad62b2815425c9f0d13d059c729a500000000000000000000000000000000000000000000000000091fbff51e158000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -7739,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec340000000000000000000000009db71fb4da06a8cd93efeaf5bb2f685dced691110000000000000000000000009db71fb4da06a8cd93efeaf5bb2f685dced69111000000000000000000000000000000000000000000000000000ca6076d769e0000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -7740,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec34000000000000000000000000269a042f10fac5b5cf40d2c09810870150773a23000000000000000000000000269a042f10fac5b5cf40d2c09810870150773a23000000000000000000000000000000000000000000000000000ab70d1c7516c000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -7741,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec34000000000000000000000000794f8281c1a4eb3c631d89bce6b30d60b9f542b0000000000000000000000000794f8281c1a4eb3c631d89bce6b30d60b9f542b00000000000000000000000000000000000000000000000000009345102f4f84000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -7742,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec34000000000000000000000000fc4503e550465fbc3086cf218152ecf9db58144a000000000000000000000000fc4503e550465fbc3086cf218152ecf9db58144a00000000000000000000000000000000000000000000000000038d7ea4c6800000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -7743,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec34000000000000000000000000ab13daf038e0b10544e14638c1de3052b66b0771000000000000000000000000ab13daf038e0b10544e14638c1de3052b66b077100000000000000000000000000000000000000000000000000038d7ea4c6800000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -7745,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec34000000000000000000000000fe1bb644c349dfc485086715c8d80c491a273491000000000000000000000000fe1bb644c349dfc485086715c8d80c491a2734910000000000000000000000000000000000000000000000000011aafcb9c2b6f800000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -7749,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec34000000000000000000000000f815b421839515bf2a277739cc259b16b8e55293000000000000000000000000f815b421839515bf2a277739cc259b16b8e552930000000000000000000000000000000000000000000000000005a207389f7b8000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -7750,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec34000000000000000000000000472da78b116e06940876819dee6011be15fd85e2000000000000000000000000472da78b116e06940876819dee6011be15fd85e2000000000000000000000000000000000000000000000000000aa87bee53800000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -7754,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec340000000000000000000000000618ca00c244fcf86f0f64338a1b480569e312a20000000000000000000000000618ca00c244fcf86f0f64338a1b480569e312a2000000000000000000000000000000000000000000000000020c0fb7f351310000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -7755,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec34000000000000000000000000fa2740d9e5462b4ffe05d15c3d168c99fbcf76f2000000000000000000000000fa2740d9e5462b4ffe05d15c3d168c99fbcf76f200000000000000000000000000000000000000000000000000c2c97a96bc188000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -7756,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec340000000000000000000000007f361aa96041eb143ec27f65620dbd7a0ea325540000000000000000000000007f361aa96041eb143ec27f65620dbd7a0ea3255400000000000000000000000000000000000000000000000004ac404080f4f44000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -7758,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec34000000000000000000000000238baa6b4a877a55e18295d3be8ff6ffe4ab73c3000000000000000000000000238baa6b4a877a55e18295d3be8ff6ffe4ab73c3000000000000000000000000000000000000000000000000002386f26fc1000000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -7759,0xcd9d4988c0ae61887b075ba77f08cbfad2b65068,0x3f87ff1de58128ef8fcb4c807efd776e1ac72e51,0xf4f7b41a0000000000000000000000005a9e51f5796310f633a90a9caf21eb57fb3b48bb0000000000000000000000000000000000000000000000000de0b6b3a7640000,,,1,true -7760,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec340000000000000000000000002f5f2223ba5756eb5403d05fd0b9df9fffed253f0000000000000000000000002f5f2223ba5756eb5403d05fd0b9df9fffed253f000000000000000000000000000000000000000000000000009eb4ad0c2c684000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -7761,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec34000000000000000000000000bf70e07186c442055218bf20c50522478235c4a0000000000000000000000000bf70e07186c442055218bf20c50522478235c4a000000000000000000000000000000000000000000000000000c3ab54e9e6533100000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,0x4ebde6ebefd2185e27add497979e148f928cf7888da245af8bfec2aaf1007fdc,2022-03-11 19:10:41.000 UTC,0,true -7762,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec340000000000000000000000004bed6811c6bb261ab1a1059d5c4b779efa5735b40000000000000000000000004bed6811c6bb261ab1a1059d5c4b779efa5735b40000000000000000000000000000000000000000000000000085e7bf41d8950000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -7765,0xcd9d4988c0ae61887b075ba77f08cbfad2b65068,0x3f87ff1de58128ef8fcb4c807efd776e1ac72e51,0xf4f7b41a000000000000000000000000bdee104f077fc445b066c2378559d801fac58a0f000000000000000000000000000000000000000000000002c83956ea49404da0,,,1,true -7766,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec34000000000000000000000000f5b1c6d34ce0060f5b6fd6d23bbafcfce44a8ce5000000000000000000000000f5b1c6d34ce0060f5b6fd6d23bbafcfce44a8ce500000000000000000000000000000000000000000000000000a0e731003d117f00000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -7767,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec340000000000000000000000001cbb4c62da977613636a7a779a3f364dfd6906a40000000000000000000000001cbb4c62da977613636a7a779a3f364dfd6906a4000000000000000000000000000000000000000000000000000075d426888e0000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -7772,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec340000000000000000000000001d2d56a152a454d8463ebad575fd85de790e28d30000000000000000000000001d2d56a152a454d8463ebad575fd85de790e28d300000000000000000000000000000000000000000000000000038d7ea4c6800000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -7774,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec340000000000000000000000006816cb8a561000742f459baf54a355cb38bcb01d0000000000000000000000006816cb8a561000742f459baf54a355cb38bcb01d00000000000000000000000000000000000000000000000000129d5951a94d0000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -7776,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec3400000000000000000000000082c9c2dd525a4b3d549b4e2df70d3df9b9a738ed00000000000000000000000082c9c2dd525a4b3d549b4e2df70d3df9b9a738ed0000000000000000000000000000000000000000000000000011da09f214e3eb00000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -7779,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec34000000000000000000000000d10f76a657d52adace28314787450d1753d39f85000000000000000000000000d10f76a657d52adace28314787450d1753d39f8500000000000000000000000000000000000000000000000000968603ec148dfd00000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -7781,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec340000000000000000000000008a83bbbee6a05eb158371bc888deda2c853958a60000000000000000000000008a83bbbee6a05eb158371bc888deda2c853958a6000000000000000000000000000000000000000000000000000049281764c70000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -7782,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec34000000000000000000000000e9034bcd20119ee7563d145dc817820690afd5fb000000000000000000000000e9034bcd20119ee7563d145dc817820690afd5fb000000000000000000000000000000000000000000000000002386f26fc1000000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -7785,0x10e6593cdda8c58a1d0f14c5164b376352a55f2f,0x467194771dae2967aef3ecbedd3bf9a310c76c65,0xa9f9e6750000000000000000000000006b175474e89094c44da98b954eedeac495271d0f000000000000000000000000da10009cbd5d07dd0cecc66161fc93d7c9000da1000000000000000000000000eba34ce0cd07f2df484ce6f04c6f89b18a2a4760000000000000000000000000eba34ce0cd07f2df484ce6f04c6f89b18a2a47600000000000000000000000000000000000000000000000000eb8a4df52fb0f6800000000000000000000000000000000000000000000000000000000000000c00000000000000000000000000000000000000000000000000000000000000000,,,1,true -7786,0x10e6593cdda8c58a1d0f14c5164b376352a55f2f,0x467194771dae2967aef3ecbedd3bf9a310c76c65,0xa9f9e6750000000000000000000000006b175474e89094c44da98b954eedeac495271d0f000000000000000000000000da10009cbd5d07dd0cecc66161fc93d7c9000da1000000000000000000000000bddf8194ccc04be52d3e66d5dfb63edba8735e40000000000000000000000000bddf8194ccc04be52d3e66d5dfb63edba8735e400000000000000000000000000000000000000000000000000de0db79f17ea7d600000000000000000000000000000000000000000000000000000000000000c00000000000000000000000000000000000000000000000000000000000000000,,,1,true -7787,0x10e6593cdda8c58a1d0f14c5164b376352a55f2f,0x467194771dae2967aef3ecbedd3bf9a310c76c65,0xa9f9e6750000000000000000000000006b175474e89094c44da98b954eedeac495271d0f000000000000000000000000da10009cbd5d07dd0cecc66161fc93d7c9000da1000000000000000000000000f11a600d875f83bf02337622c47d106e45f126d3000000000000000000000000f11a600d875f83bf02337622c47d106e45f126d30000000000000000000000000000000000000000000000000ec2b71761c60c0100000000000000000000000000000000000000000000000000000000000000c00000000000000000000000000000000000000000000000000000000000000000,,,1,true -7789,0x10e6593cdda8c58a1d0f14c5164b376352a55f2f,0x467194771dae2967aef3ecbedd3bf9a310c76c65,0xa9f9e6750000000000000000000000006b175474e89094c44da98b954eedeac495271d0f000000000000000000000000da10009cbd5d07dd0cecc66161fc93d7c9000da1000000000000000000000000b42bc255de791f979a4b5ef296e1cff15e60cd55000000000000000000000000b42bc255de791f979a4b5ef296e1cff15e60cd550000000000000000000000000000000000000000000000000ec2b6d32080fd1800000000000000000000000000000000000000000000000000000000000000c00000000000000000000000000000000000000000000000000000000000000000,,,1,true -7790,0x10e6593cdda8c58a1d0f14c5164b376352a55f2f,0x467194771dae2967aef3ecbedd3bf9a310c76c65,0xa9f9e6750000000000000000000000006b175474e89094c44da98b954eedeac495271d0f000000000000000000000000da10009cbd5d07dd0cecc66161fc93d7c9000da10000000000000000000000009c4665f252378a1c6d1aaa6172be1885b9cf87570000000000000000000000009c4665f252378a1c6d1aaa6172be1885b9cf87570000000000000000000000000000000000000000000000000ec2b52e8a335d8b00000000000000000000000000000000000000000000000000000000000000c00000000000000000000000000000000000000000000000000000000000000000,,,1,true -7791,0x10e6593cdda8c58a1d0f14c5164b376352a55f2f,0x467194771dae2967aef3ecbedd3bf9a310c76c65,0xa9f9e6750000000000000000000000006b175474e89094c44da98b954eedeac495271d0f000000000000000000000000da10009cbd5d07dd0cecc66161fc93d7c9000da1000000000000000000000000192755ce697d06f694e3b218d1c462b17e7bac50000000000000000000000000192755ce697d06f694e3b218d1c462b17e7bac500000000000000000000000000000000000000000000000000eb429ad131557bf00000000000000000000000000000000000000000000000000000000000000c00000000000000000000000000000000000000000000000000000000000000000,,,1,true -7792,0x10e6593cdda8c58a1d0f14c5164b376352a55f2f,0x467194771dae2967aef3ecbedd3bf9a310c76c65,0xa9f9e6750000000000000000000000006b175474e89094c44da98b954eedeac495271d0f000000000000000000000000da10009cbd5d07dd0cecc66161fc93d7c9000da100000000000000000000000088146955a7207a1cee4213c3c92b411993588ae200000000000000000000000088146955a7207a1cee4213c3c92b411993588ae20000000000000000000000000000000000000000000000000eb30827623d65a100000000000000000000000000000000000000000000000000000000000000c00000000000000000000000000000000000000000000000000000000000000000,,,1,true -7793,0x10e6593cdda8c58a1d0f14c5164b376352a55f2f,0x467194771dae2967aef3ecbedd3bf9a310c76c65,0xa9f9e6750000000000000000000000006b175474e89094c44da98b954eedeac495271d0f000000000000000000000000da10009cbd5d07dd0cecc66161fc93d7c9000da1000000000000000000000000e11f1b9b2e41e1bdc4ffee660c4414ce10867f1e000000000000000000000000e11f1b9b2e41e1bdc4ffee660c4414ce10867f1e0000000000000000000000000000000000000000000000000eb5d4f036c13ab600000000000000000000000000000000000000000000000000000000000000c00000000000000000000000000000000000000000000000000000000000000000,,,1,true -7794,0x10e6593cdda8c58a1d0f14c5164b376352a55f2f,0x467194771dae2967aef3ecbedd3bf9a310c76c65,0xa9f9e6750000000000000000000000006b175474e89094c44da98b954eedeac495271d0f000000000000000000000000da10009cbd5d07dd0cecc66161fc93d7c9000da10000000000000000000000004ab31beab901c582cbf32d38f041ecb30f4096d80000000000000000000000004ab31beab901c582cbf32d38f041ecb30f4096d80000000000000000000000000000000000000000000000000eb45b0f8da491b600000000000000000000000000000000000000000000000000000000000000c00000000000000000000000000000000000000000000000000000000000000000,,,1,true -7795,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0xa9f9e675000000000000000000000000dac17f958d2ee523a2206206994597c13d831ec700000000000000000000000094b008aa00579c1307b0ef2c499ad98a8ce58e58000000000000000000000000ebf2658fae3ddae5e4065c3426066ca5b8eb2218000000000000000000000000ebf2658fae3ddae5e4065c3426066ca5b8eb22180000000000000000000000000000000000000000000000000000000000103c8100000000000000000000000000000000000000000000000000000000000000c00000000000000000000000000000000000000000000000000000000000000000,,,1,true -7796,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec340000000000000000000000000a3c473b5f1d471d7cfc0d0f9b7fb76a8e554ff70000000000000000000000000a3c473b5f1d471d7cfc0d0f9b7fb76a8e554ff7000000000000000000000000000000000000000000000000001675cc77d7210000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -7797,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0xa9f9e675000000000000000000000000dac17f958d2ee523a2206206994597c13d831ec700000000000000000000000094b008aa00579c1307b0ef2c499ad98a8ce58e5800000000000000000000000060d5a2efa14e0772ae04e4f31d1ecb6f4dfd03cf00000000000000000000000060d5a2efa14e0772ae04e4f31d1ecb6f4dfd03cf0000000000000000000000000000000000000000000000000000000000103ade00000000000000000000000000000000000000000000000000000000000000c00000000000000000000000000000000000000000000000000000000000000000,,,1,true -7798,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0xa9f9e675000000000000000000000000dac17f958d2ee523a2206206994597c13d831ec700000000000000000000000094b008aa00579c1307b0ef2c499ad98a8ce58e58000000000000000000000000bd4f6a77a34bd6527b915bf7de56dc61b947d924000000000000000000000000bd4f6a77a34bd6527b915bf7de56dc61b947d9240000000000000000000000000000000000000000000000000000000000104f9200000000000000000000000000000000000000000000000000000000000000c00000000000000000000000000000000000000000000000000000000000000000,,,1,true -7799,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec3400000000000000000000000008ea5804927b508057c7361ece58b9604a79da2800000000000000000000000008ea5804927b508057c7361ece58b9604a79da2800000000000000000000000000000000000000000000000000937007b62dc00000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,0x35bde942b8e53ad00ced8db112038bc7eee03b041703c591b05ca2560892a448,2021-12-12 08:20:07.000 UTC,0,true -7800,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0xa9f9e675000000000000000000000000dac17f958d2ee523a2206206994597c13d831ec700000000000000000000000094b008aa00579c1307b0ef2c499ad98a8ce58e58000000000000000000000000b90b37c007cafda8154d6cf6e1b74924b781f37c000000000000000000000000b90b37c007cafda8154d6cf6e1b74924b781f37c000000000000000000000000000000000000000000000000000000000010529100000000000000000000000000000000000000000000000000000000000000c00000000000000000000000000000000000000000000000000000000000000000,,,1,true -7803,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0xa9f9e675000000000000000000000000dac17f958d2ee523a2206206994597c13d831ec700000000000000000000000094b008aa00579c1307b0ef2c499ad98a8ce58e5800000000000000000000000019c7ff37b882829d6d821733d7a102ee37653df800000000000000000000000019c7ff37b882829d6d821733d7a102ee37653df80000000000000000000000000000000000000000000000000000000001ba814000000000000000000000000000000000000000000000000000000000000000c00000000000000000000000000000000000000000000000000000000000000000,,,1,true -7805,0xcd9d4988c0ae61887b075ba77f08cbfad2b65068,0x3f87ff1de58128ef8fcb4c807efd776e1ac72e51,0xf4f7b41a00000000000000000000000046d22bcfeedc27c643953b5945d766ae73d4852d0000000000000000000000000000000000000000000000291819341b91c52987,0xe726b47830149d9b59d751af4a4091452eead1d70576d69c7047943920bf81fc,2021-11-26 06:22:09.000 UTC,0,true -7806,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec34000000000000000000000000c590ed9c6b18cefb629917280b25e7f08914220d000000000000000000000000c590ed9c6b18cefb629917280b25e7f08914220d000000000000000000000000000000000000000000000000004b52cd32c783ea00000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -7807,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec340000000000000000000000007aff06e2f0e25d0e291b086b92889ec2df3aa2240000000000000000000000007aff06e2f0e25d0e291b086b92889ec2df3aa224000000000000000000000000000000000000000000000000002642bc8e9667fa00000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -7809,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec34000000000000000000000000c730b3763297722f73a2eef7bef8939bfa0900ec000000000000000000000000c730b3763297722f73a2eef7bef8939bfa0900ec00000000000000000000000000000000000000000000000000005af3107a400000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -7810,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec340000000000000000000000001bba1ab4d90cf352c7f4efbaa1a4d782845391a80000000000000000000000001bba1ab4d90cf352c7f4efbaa1a4d782845391a800000000000000000000000000000000000000000000000000071afd498d000000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -7813,0x10e6593cdda8c58a1d0f14c5164b376352a55f2f,0x467194771dae2967aef3ecbedd3bf9a310c76c65,0xa9f9e6750000000000000000000000006b175474e89094c44da98b954eedeac495271d0f000000000000000000000000da10009cbd5d07dd0cecc66161fc93d7c9000da10000000000000000000000007ef5cf7ee561ce57250faca9a99e9f85d50705b60000000000000000000000007ef5cf7ee561ce57250faca9a99e9f85d50705b600000000000000000000000000000000000000000000005adcdd4461fb9b7db200000000000000000000000000000000000000000000000000000000000000c00000000000000000000000000000000000000000000000000000000000000000,,,1,true -7814,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec34000000000000000000000000ff059d87096d1edf40ab0af9f1bd32efebcfb386000000000000000000000000ff059d87096d1edf40ab0af9f1bd32efebcfb386000000000000000000000000000000000000000000000000016e7333114ebfc000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -7816,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec340000000000000000000000001df9b5a2ad6b5b4611de9cb8a069ff1d200bb8280000000000000000000000001df9b5a2ad6b5b4611de9cb8a069ff1d200bb8280000000000000000000000000000000000000000000000000000befe6f67200000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -7817,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec3400000000000000000000000087dc8ee4ce4feef4c4d38a84fda9768d39e51cec00000000000000000000000087dc8ee4ce4feef4c4d38a84fda9768d39e51cec00000000000000000000000000000000000000000000000000071afd498d000000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -7818,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec34000000000000000000000000061751119a686def10ee8f60671c670c290f927a000000000000000000000000061751119a686def10ee8f60671c670c290f927a00000000000000000000000000000000000000000000000000313146e991560900000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -7819,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec3400000000000000000000000067c1bb9d5408655bacd89773f5534d039bfa765a00000000000000000000000067c1bb9d5408655bacd89773f5534d039bfa765a00000000000000000000000000000000000000000000000001515bc7f76f3e8e00000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -7821,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec34000000000000000000000000017c8616c5744bc4b3660238d7c34f1747466c54000000000000000000000000017c8616c5744bc4b3660238d7c34f1747466c54000000000000000000000000000000000000000000000000000009184e72a00000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -7823,0x10e6593cdda8c58a1d0f14c5164b376352a55f2f,0x467194771dae2967aef3ecbedd3bf9a310c76c65,0xa9f9e6750000000000000000000000006b175474e89094c44da98b954eedeac495271d0f000000000000000000000000da10009cbd5d07dd0cecc66161fc93d7c9000da1000000000000000000000000439ab76ed2369bb987d958a0ee7d1c7c50d7c898000000000000000000000000439ab76ed2369bb987d958a0ee7d1c7c50d7c89800000000000000000000000000000000000000000000021e6f49f35c5e70796600000000000000000000000000000000000000000000000000000000000000c00000000000000000000000000000000000000000000000000000000000000000,,,1,true -7824,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec34000000000000000000000000f9346c2cfd24541af4c54c8ef2e5aa6f3d4834c1000000000000000000000000f9346c2cfd24541af4c54c8ef2e5aa6f3d4834c10000000000000000000000000000000000000000000000000027b8e76324600000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -7826,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec34000000000000000000000000be7dd3a9bede56136bef4669337b64d8dc463146000000000000000000000000be7dd3a9bede56136bef4669337b64d8dc46314600000000000000000000000000000000000000000000000000ac37da05af370000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -7827,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec34000000000000000000000000361cf5e2fe3925ff2e7ce5a44bf1a38c12e2fafd000000000000000000000000361cf5e2fe3925ff2e7ce5a44bf1a38c12e2fafd00000000000000000000000000000000000000000000000000abb5868e1c810000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -7828,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec34000000000000000000000000035e0050e5c244bdf5a1c8e9b68b8ce51df73de4000000000000000000000000035e0050e5c244bdf5a1c8e9b68b8ce51df73de400000000000000000000000000000000000000000000000000aad806faec390000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -7829,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec340000000000000000000000000dd71c2b33bc97260575c53003ec68c65b9d85e00000000000000000000000000dd71c2b33bc97260575c53003ec68c65b9d85e000000000000000000000000000000000000000000000000000ab66f03dc4960000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -7830,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec340000000000000000000000003c9fd82a2bd26b4cd848e0255b5e77a2f055921b0000000000000000000000003c9fd82a2bd26b4cd848e0255b5e77a2f055921b00000000000000000000000000000000000000000000000000ac17215b93b80000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -7831,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec34000000000000000000000000c9ba8d9576c19b61e2ad21963af0dfb9d6d65d7b000000000000000000000000c9ba8d9576c19b61e2ad21963af0dfb9d6d65d7b00000000000000000000000000000000000000000000000000acabea1f6a740000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -7833,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec340000000000000000000000007cc5163b4409c1ad7b0395c5deca0e515020fc300000000000000000000000007cc5163b4409c1ad7b0395c5deca0e515020fc3000000000000000000000000000000000000000000000000000ac10b2a9ba130000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -7834,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec34000000000000000000000000cfea3acaaae83da01c21baeb33c261b0e863616c000000000000000000000000cfea3acaaae83da01c21baeb33c261b0e863616c00000000000000000000000000000000000000000000000000ac17215b93b80000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -7835,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec34000000000000000000000000ae93d722db362e3f146dfc35f4eb0eaec71eae3f000000000000000000000000ae93d722db362e3f146dfc35f4eb0eaec71eae3f00000000000000000000000000000000000000000000000000ac847b2b07ad0000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -7836,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec34000000000000000000000000031bd88e60b7fd952a9b99914de2781b28bf3f35000000000000000000000000031bd88e60b7fd952a9b99914de2781b28bf3f3500000000000000000000000000000000000000000000000000ac847b2b07ad0000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -7837,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec34000000000000000000000000d12acade9a3e66e0fb2c9de727bdd28d12655160000000000000000000000000d12acade9a3e66e0fb2c9de727bdd28d1265516000000000000000000000000000000000000000000000000000ab301f89d3ca0000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -7838,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec34000000000000000000000000643207a711f81626d8eb3c605097efa50aa3ef6f000000000000000000000000643207a711f81626d8eb3c605097efa50aa3ef6f00000000000000000000000000000000000000000000000000aae4552dc43d0000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -7839,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec34000000000000000000000000a82b4429156db6d64ea3977816676b66863309ff000000000000000000000000a82b4429156db6d64ea3977816676b66863309ff00000000000000000000000000000000000000000000000000abc88b0b3bcd0000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -7840,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec34000000000000000000000000cfd0ae189d1e08df256d4a4f9031f684489ef72a000000000000000000000000cfd0ae189d1e08df256d4a4f9031f684489ef72a00000000000000000000000000000000000000000000000000abf041980c370000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -7841,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec34000000000000000000000000ea88074ed8a8ba08fa038a59d3fb8387e1c5268c000000000000000000000000ea88074ed8a8ba08fa038a59d3fb8387e1c5268c00000000000000000000000000000000000000000000000000ab1bb512904f0000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -7842,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec340000000000000000000000000139106c7afede02d0957ebc49756e3156c88c7f0000000000000000000000000139106c7afede02d0957ebc49756e3156c88c7f00000000000000000000000000000000000000000000000000ac893c4a4f800000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -7843,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec340000000000000000000000003e0badf855e6e92b94ab584bb6a8699add1b985b0000000000000000000000003e0badf855e6e92b94ab584bb6a8699add1b985b00000000000000000000000000000000000000000000000000ac9081c5720e0000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -7844,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec3400000000000000000000000078699b7ab6ccbc5af1d36cef503045b67c614d6800000000000000000000000078699b7ab6ccbc5af1d36cef503045b67c614d6800000000000000000000000000000000000000000000000000aace84bc5c930000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -7845,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec3400000000000000000000000008fde022fb6c8020c8ba21b890c24d6a9df0fc9100000000000000000000000008fde022fb6c8020c8ba21b890c24d6a9df0fc9100000000000000000000000000000000000000000000000000ac010951be6b0000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -7848,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec34000000000000000000000000ffc1100973a5247afcd0c008e48a8030d3c00bb0000000000000000000000000ffc1100973a5247afcd0c008e48a8030d3c00bb000000000000000000000000000000000000000000000000000ab28da0eb13c0000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -7849,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec3400000000000000000000000040a5f5b02af3e1d3eb64d28c19e840f56490503f00000000000000000000000040a5f5b02af3e1d3eb64d28c19e840f56490503f00000000000000000000000000000000000000000000000000aa8733e727360000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -7850,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec340000000000000000000000003054e421b52338d44a1d95e88fc58ba773b0a1120000000000000000000000003054e421b52338d44a1d95e88fc58ba773b0a11200000000000000000000000000000000000000000000000000aa6a1dfa9cfe0000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -7851,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec34000000000000000000000000c5b009d80019070b71c83cd41d79e564418ec4c1000000000000000000000000c5b009d80019070b71c83cd41d79e564418ec4c100000000000000000000000000000000000000000000000000ab8b4ba5715c0000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -7852,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec34000000000000000000000000539eb2aee60122d1a9b5b59554b5648eeadd83a8000000000000000000000000539eb2aee60122d1a9b5b59554b5648eeadd83a800000000000000000000000000000000000000000000000000ace10d40c96e0000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -7853,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec34000000000000000000000000a4217061de88bb05f2bac6d8aea3699282db3b9c000000000000000000000000a4217061de88bb05f2bac6d8aea3699282db3b9c00000000000000000000000000000000000000000000000000acebf5797d430000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -7854,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec34000000000000000000000000f2c61e450304898b7ebf700db2e3e1c0a58daaee000000000000000000000000f2c61e450304898b7ebf700db2e3e1c0a58daaee00000000000000000000000000000000000000000000000000a3f94729f1e49200000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -7855,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec34000000000000000000000000499428155f893e88abfa89dbef4d5017ee3b92ff000000000000000000000000499428155f893e88abfa89dbef4d5017ee3b92ff0000000000000000000000000000000000000000000000000005fcdc92d4dbe500000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -7856,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec340000000000000000000000008621bf24c4fe541faa4f3e3d6abf05dbe657b4630000000000000000000000008621bf24c4fe541faa4f3e3d6abf05dbe657b46300000000000000000000000000000000000000000000000000acda56f682260000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -7857,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec34000000000000000000000000488c0746bbc745ecdf26498499319ec89a2f96fe000000000000000000000000488c0746bbc745ecdf26498499319ec89a2f96fe00000000000000000000000000000000000000000000000000ac53425fa79d0000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -7858,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec3400000000000000000000000039c950d42f47d4d29cb4a581c2bfedb824774cf400000000000000000000000039c950d42f47d4d29cb4a581c2bfedb824774cf400000000000000000000000000000000000000000000000000abd32bab81ff0000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -7859,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec34000000000000000000000000246bce86884439b5de18730ad32c20bd65216417000000000000000000000000246bce86884439b5de18730ad32c20bd6521641700000000000000000000000000000000000000000000000000ac149cffb8fd0000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -7860,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec34000000000000000000000000b856c3909aa63f205fba6c3c3f18bb90c9b0611a000000000000000000000000b856c3909aa63f205fba6c3c3f18bb90c9b0611a00000000000000000000000000000000000000000000000000abcb0f6716880000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -7861,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec34000000000000000000000000ebda3411c77a6a2f6381432f41336d826fe458dd000000000000000000000000ebda3411c77a6a2f6381432f41336d826fe458dd00000000000000000000000000000000000000000000000000ac20eb3291010000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -7862,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec34000000000000000000000000b0386d27624ed1b0eceb501b075446a73152619f000000000000000000000000b0386d27624ed1b0eceb501b075446a73152619f00000000000000000000000000000000000000000000000000ac8001a42d7d0000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -7863,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec34000000000000000000000000d6e2ca8299f23ca47493bdf5a03c8cf6d15e1fbb000000000000000000000000d6e2ca8299f23ca47493bdf5a03c8cf6d15e1fbb00000000000000000000000000000000000000000000000000ac8001a42d7d0000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -7864,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec340000000000000000000000009c5a6123f4fa37f8563d437c13f7a221dfaf19e10000000000000000000000009c5a6123f4fa37f8563d437c13f7a221dfaf19e100000000000000000000000000000000000000000000000000ac2ee6f7fad70000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -7865,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec340000000000000000000000002fa5d33b4ef02758cac386cb12b48f7510e5d7fd0000000000000000000000002fa5d33b4ef02758cac386cb12b48f7510e5d7fd00000000000000000000000000000000000000000000000000abcf415583150000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -7866,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec340000000000000000000000001fab1a103edc0e7020dcd764c2b621c7da1297e70000000000000000000000001fab1a103edc0e7020dcd764c2b621c7da1297e700000000000000000000000000000000000000000000000000abcf415583150000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -7867,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0xa9f9e67500000000000000000000000057ab1ec28d129707052df4df418d58a2d46d5f510000000000000000000000008c6f28f2f1a3c87f0f938b96d27520d9751ec8d9000000000000000000000000656fafabbf1b8c42b4f63ab15f9bee8027a25978000000000000000000000000656fafabbf1b8c42b4f63ab15f9bee8027a259780000000000000000000000000000000000000000000000000de0b6b3a764000000000000000000000000000000000000000000000000000000000000000000c00000000000000000000000000000000000000000000000000000000000000000,,,1,true -7868,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec34000000000000000000000000878bc19bb4c346bd7db6189a2c3733d1844b0b19000000000000000000000000878bc19bb4c346bd7db6189a2c3733d1844b0b1900000000000000000000000000000000000000000000000000aa4dded75baf0000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -7869,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec3400000000000000000000000095dacc17b990d7f010109ae64765f67b2748b64a00000000000000000000000095dacc17b990d7f010109ae64765f67b2748b64a00000000000000000000000000000000000000000000000000aa8ccbcfb7f20000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -7870,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec340000000000000000000000002ba1c716dcbcf2ae512d275752d38b027c9d1ff50000000000000000000000002ba1c716dcbcf2ae512d275752d38b027c9d1ff500000000000000000000000000000000000000000000000000a9e9307d2e770000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -7871,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec34000000000000000000000000d1f25c3605a4d6ba7f213e3bcaef2001603b98b0000000000000000000000000d1f25c3605a4d6ba7f213e3bcaef2001603b98b000000000000000000000000000000000000000000000000000aa7a0eeb06490000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -7872,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec3400000000000000000000000032d641b2d54a46b9e4448bf35f667e17da2fd14d00000000000000000000000032d641b2d54a46b9e4448bf35f667e17da2fd14d000000000000000000000000000000000000000000000000026a3bd6fd71075e00000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -7873,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec34000000000000000000000000c272a7f4cb36058880362dfa5c5fcd330e8084ad000000000000000000000000c272a7f4cb36058880362dfa5c5fcd330e8084ad00000000000000000000000000000000000000000000000000ac0ad328bbb40000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -7874,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec3400000000000000000000000076052b96412a486647a911562f1c395394587dd900000000000000000000000076052b96412a486647a911562f1c395394587dd900000000000000000000000000000000000000000000000000ac5c356d5bfd0000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -7875,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec34000000000000000000000000a920cd19f49f14185fba187b6cb45a8f909ea31c000000000000000000000000a920cd19f49f14185fba187b6cb45a8f909ea31c00000000000000000000000000000000000000000000000000ac5c356d5bfd0000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -7876,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec3400000000000000000000000043d968da7bb8d89a9eae51088bde865fc636cb9400000000000000000000000043d968da7bb8d89a9eae51088bde865fc636cb9400000000000000000000000000000000000000000000000000ac2ee6f7fad70000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -7877,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec3400000000000000000000000048d932097ea2e401fab65426a14c7d58b0a0e40700000000000000000000000048d932097ea2e401fab65426a14c7d58b0a0e40700000000000000000000000000000000000000000000000000ac2ee6f7fad70000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -7878,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec3400000000000000000000000075e41492b7915ace101d66946f36e61885efe3fc00000000000000000000000075e41492b7915ace101d66946f36e61885efe3fc00000000000000000000000000000000000000000000000000ac2ee6f7fad70000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -7879,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec34000000000000000000000000b6ab573c00e0c4340bbe89c500d16452e2e203b9000000000000000000000000b6ab573c00e0c4340bbe89c500d16452e2e203b900000000000000000000000000000000000000000000000000aac54a163a900000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -7880,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec34000000000000000000000000f8d16f7695bb0232619f183f2903854ec33670cc000000000000000000000000f8d16f7695bb0232619f183f2903854ec33670cc00000000000000000000000000000000000000000000000000abece672e8930000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -7881,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec34000000000000000000000000985abc5fd8d85cc4e0d0c17275535d5d27bf2bd0000000000000000000000000985abc5fd8d85cc4e0d0c17275535d5d27bf2bd000000000000000000000000000000000000000000000000000a7233d69492c2b00000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -7883,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec34000000000000000000000000ba22884e029afd269c42b069cf41df45170ef3da000000000000000000000000ba22884e029afd269c42b069cf41df45170ef3da0000000000000000000000000000000000000000000000000148a6a40063021900000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -7885,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec340000000000000000000000004009526a0679bfca93056822ffef50265ac1c1f50000000000000000000000004009526a0679bfca93056822ffef50265ac1c1f50000000000000000000000000000000000000000000000000159dd434c812bd300000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,0x29c36db02a90d6484f45427336bad3cce0f702829c98687c798e07f218862e0b,2022-03-21 01:19:27.000 UTC,0,true -7886,0xcd9d4988c0ae61887b075ba77f08cbfad2b65068,0x3f87ff1de58128ef8fcb4c807efd776e1ac72e51,0xf4f7b41a0000000000000000000000003d2a9ff2e85b64fbdc433dc8ffe8f4bf3358999e0000000000000000000000000000000000000000000000a1224e02cddb531aaa,,,1,true -7887,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec34000000000000000000000000985ced69658f06727ecb691b16987191a5250634000000000000000000000000985ced69658f06727ecb691b16987191a5250634000000000000000000000000000000000000000000000000005a1e203eae76b400000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -7889,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec34000000000000000000000000fe18fa79295de47b6602236c7b46b487f6927a30000000000000000000000000fe18fa79295de47b6602236c7b46b487f6927a30000000000000000000000000000000000000000000000000002cd2692658780000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -7890,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec340000000000000000000000009be5ca1ac018460574933a2e065cb04f675ee6260000000000000000000000009be5ca1ac018460574933a2e065cb04f675ee626000000000000000000000000000000000000000000000000015713afb7ebc07800000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,0xd03d5e3cee5945c85d1fede621cafb7543e972dc61183926fb8ba6c1e7a52630,2022-04-13 06:28:11.000 UTC,0,true -7891,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec34000000000000000000000000187d7570362140deda52d4ead921b00c3a2efb1f000000000000000000000000187d7570362140deda52d4ead921b00c3a2efb1f000000000000000000000000000000000000000000000000005f74f5e92becaf00000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -7892,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec34000000000000000000000000e5cf553b66ce0dafb2acf1c70e0e8af7232459cf000000000000000000000000e5cf553b66ce0dafb2acf1c70e0e8af7232459cf00000000000000000000000000000000000000000000000000240b882cf9b8df00000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -7893,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec340000000000000000000000009039326a3c562bcb02c04db463e4790f0ec79ab30000000000000000000000009039326a3c562bcb02c04db463e4790f0ec79ab3000000000000000000000000000000000000000000000000011338eaf7ccfafd00000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -7894,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec340000000000000000000000007ad014a4dd7893447242333dfeed5852d57b72d00000000000000000000000007ad014a4dd7893447242333dfeed5852d57b72d000000000000000000000000000000000000000000000000000442361743b9ed700000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -7896,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec34000000000000000000000000cc36df9e64431481fd24eac8afe9adafe8f449ec000000000000000000000000cc36df9e64431481fd24eac8afe9adafe8f449ec000000000000000000000000000000000000000000000000005dc919cb8a3a3d00000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -7897,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec34000000000000000000000000b5c34f3bc6e950e1c4756b058ee31a744716a64e000000000000000000000000b5c34f3bc6e950e1c4756b058ee31a744716a64e000000000000000000000000000000000000000000000000004f2764812ae5d800000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -7898,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec34000000000000000000000000e4bbec1cee2de29632cfdfddae9b22243afb9c16000000000000000000000000e4bbec1cee2de29632cfdfddae9b22243afb9c1600000000000000000000000000000000000000000000000000a2aa6450d95c4000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -7901,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec34000000000000000000000000820b0cbe7f4df3b3f186377a2fa9d626062ae98e000000000000000000000000820b0cbe7f4df3b3f186377a2fa9d626062ae98e00000000000000000000000000000000000000000000000000146de3bfcb794000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -7902,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec34000000000000000000000000f9f513d12057e23b0719ead57af009e77f23a9d5000000000000000000000000f9f513d12057e23b0719ead57af009e77f23a9d5000000000000000000000000000000000000000000000000001e7e3a44fdb40000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -7903,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec34000000000000000000000000018695c5660fc0bf3a3f50c5d81477686c2ffa5e000000000000000000000000018695c5660fc0bf3a3f50c5d81477686c2ffa5e000000000000000000000000000000000000000000000000005da6a79d1eaef400000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -7904,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec3400000000000000000000000056498320e99df15093e6e052c956bb188da210af00000000000000000000000056498320e99df15093e6e052c956bb188da210af000000000000000000000000000000000000000000000000006c22ad5047791c00000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,0x9f88d38960c80ab785d15875de42de9984fa55a19be3febe151a94db9f47c40a,2022-03-10 10:13:02.000 UTC,0,true -7905,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec340000000000000000000000000c65c2ee6e87264139139553d5e4266ebc29b4020000000000000000000000000c65c2ee6e87264139139553d5e4266ebc29b40200000000000000000000000000000000000000000000000000470de4df82000000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -7906,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec34000000000000000000000000d41cc18d57125fb07e3cd2ebb322c6c4cb4eef3e000000000000000000000000d41cc18d57125fb07e3cd2ebb322c6c4cb4eef3e00000000000000000000000000000000000000000000000000035fc57210514000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -7907,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec34000000000000000000000000bc47bfe4887b82cccf2b1af40d1bf6a6e6708e89000000000000000000000000bc47bfe4887b82cccf2b1af40d1bf6a6e6708e89000000000000000000000000000000000000000000000000002386f26fc1000000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -7908,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec34000000000000000000000000d907f8a147df1120602818039ee7e0d801e9db0a000000000000000000000000d907f8a147df1120602818039ee7e0d801e9db0a000000000000000000000000000000000000000000000000005ce6301578e68500000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -7909,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec34000000000000000000000000c01528c7e09ce05e7734d915f5009ad40e056886000000000000000000000000c01528c7e09ce05e7734d915f5009ad40e05688600000000000000000000000000000000000000000000000000669a34fd1d000000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -7911,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec34000000000000000000000000b1118ad43a3184850475d1fb35080c9c00720885000000000000000000000000b1118ad43a3184850475d1fb35080c9c0072088500000000000000000000000000000000000000000000000000d420dee112365600000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -7912,0xcd9d4988c0ae61887b075ba77f08cbfad2b65068,0x3f87ff1de58128ef8fcb4c807efd776e1ac72e51,0xf4f7b41a000000000000000000000000528db62f1828b284eb2041296aecb4dac9f0515c00000000000000000000000000000000000000000000000059cc6d80cb5ca42c,,,1,true -7914,0x10e6593cdda8c58a1d0f14c5164b376352a55f2f,0x467194771dae2967aef3ecbedd3bf9a310c76c65,0xa9f9e6750000000000000000000000006b175474e89094c44da98b954eedeac495271d0f000000000000000000000000da10009cbd5d07dd0cecc66161fc93d7c9000da100000000000000000000000003a58d948bbc6e4ee1cac210f1b4451bc3274c3e00000000000000000000000003a58d948bbc6e4ee1cac210f1b4451bc3274c3e00000000000000000000000000000000000000000000000029a2241af62c070800000000000000000000000000000000000000000000000000000000000000c00000000000000000000000000000000000000000000000000000000000000000,,,1,true -7915,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec34000000000000000000000000499428155f893e88abfa89dbef4d5017ee3b92ff000000000000000000000000499428155f893e88abfa89dbef4d5017ee3b92ff00000000000000000000000000000000000000000000000000302eb67d7142f800000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -7916,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec340000000000000000000000002edf166a658af79c5c8bb268265a7def157eb62e0000000000000000000000002edf166a658af79c5c8bb268265a7def157eb62e000000000000000000000000000000000000000000000000002386f26fc1000000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -7917,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec3400000000000000000000000035164610721ffab73d28e4a16e32607288946af400000000000000000000000035164610721ffab73d28e4a16e32607288946af40000000000000000000000000000000000000000000000000000b74e279e070000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -7920,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec340000000000000000000000003a12747381fa12208b493f57fe0e28d59a42ce7e0000000000000000000000003a12747381fa12208b493f57fe0e28d59a42ce7e00000000000000000000000000000000000000000000000000038d7ea4c6800000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -7924,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec34000000000000000000000000c5a8674e1e244c61a4587849ccb0e66653072a00000000000000000000000000c5a8674e1e244c61a4587849ccb0e66653072a00000000000000000000000000000000000000000000000000003712499b08218000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -7925,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec340000000000000000000000008659adf49357be438c6337a524c4d08559aa09f20000000000000000000000008659adf49357be438c6337a524c4d08559aa09f2000000000000000000000000000000000000000000000000005a4daa4e80ad7d00000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -7926,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec34000000000000000000000000f2f064a3e85308efbd67ea1fa9f3d58c8f8e8123000000000000000000000000f2f064a3e85308efbd67ea1fa9f3d58c8f8e81230000000000000000000000000000000000000000000000000dc7d83d25f6800000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -7927,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec34000000000000000000000000bdb8e2cb7e7af95ca2e9c327ce255d1f92e19efb000000000000000000000000bdb8e2cb7e7af95ca2e9c327ce255d1f92e19efb000000000000000000000000000000000000000000000000043555f6d2a7705a00000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -7928,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec340000000000000000000000005795b03e97c48c57864c383186921cde539806ef0000000000000000000000005795b03e97c48c57864c383186921cde539806ef00000000000000000000000000000000000000000000000000615a740c351f9200000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -7929,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec34000000000000000000000000c7f34f09416de766e03003e50dcf6f27e072ce73000000000000000000000000c7f34f09416de766e03003e50dcf6f27e072ce7300000000000000000000000000000000000000000000000001459ca2ae03484100000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,0x451d9237d699ac260867e39c15c9d9f136d2e79422a0a99b1d9bdc565a081320,2022-01-08 11:00:32.000 UTC,0,true -7930,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec34000000000000000000000000e11f47e997c19f39b0559d3a2be89501e0615e18000000000000000000000000e11f47e997c19f39b0559d3a2be89501e0615e18000000000000000000000000000000000000000000000000001ea9db27cd080000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -7932,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec34000000000000000000000000f1c6f64a27a3134aac5808e862601747d9bd0bcb000000000000000000000000f1c6f64a27a3134aac5808e862601747d9bd0bcb000000000000000000000000000000000000000000000000057df149cd31822400000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,0x322e9aa1863a8dc85ba7a390f40b7e369f79e487421374cbdec8283b25acc4e7,2021-12-20 09:38:08.000 UTC,0,true -7934,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec34000000000000000000000000e5475abd39d6b73a3b74fb535e46bc6c9c032b2d000000000000000000000000e5475abd39d6b73a3b74fb535e46bc6c9c032b2d00000000000000000000000000000000000000000000000000038d7ea4c6800000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -7935,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec340000000000000000000000002f5bf901261249bae99c6eaaddf8e9907b756de10000000000000000000000002f5bf901261249bae99c6eaaddf8e9907b756de1000000000000000000000000000000000000000000000000005d6e183917a0b200000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -7936,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec340000000000000000000000009094eff2adf2ad7c22c5419c427042e707fe70160000000000000000000000009094eff2adf2ad7c22c5419c427042e707fe7016000000000000000000000000000000000000000000000000000110d9316ec00000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -7938,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec340000000000000000000000009094eff2adf2ad7c22c5419c427042e707fe70160000000000000000000000009094eff2adf2ad7c22c5419c427042e707fe70160000000000000000000000000000000000000000000000000003328b944c400000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -7939,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec340000000000000000000000004ce09978479907597943dd81dc3c318b0ed5ef6d0000000000000000000000004ce09978479907597943dd81dc3c318b0ed5ef6d00000000000000000000000000000000000000000000000000a4ebc75921a46700000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -7940,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec34000000000000000000000000ab8e1229e0d1ba185f2940a7f4e3835bcb106acf000000000000000000000000ab8e1229e0d1ba185f2940a7f4e3835bcb106acf0000000000000000000000000000000000000000000000000001c6bf5263400000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -7941,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0xa9f9e675000000000000000000000000dac17f958d2ee523a2206206994597c13d831ec700000000000000000000000094b008aa00579c1307b0ef2c499ad98a8ce58e58000000000000000000000000b5e2f50af7be3724198a74f8529ada0b135bb87d000000000000000000000000b5e2f50af7be3724198a74f8529ada0b135bb87d0000000000000000000000000000000000000000000000000000000006d0f46800000000000000000000000000000000000000000000000000000000000000c00000000000000000000000000000000000000000000000000000000000000000,0x79fa17de86315bdaf90cad35956338624cbc5787a33c97daa21b9a0c486f0a4d,2022-09-07 15:15:32.000 UTC,0,true -7942,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec3400000000000000000000000005f4b9a4300cbd45b113f6028f7f6dbd1b5955f800000000000000000000000005f4b9a4300cbd45b113f6028f7f6dbd1b5955f80000000000000000000000000000000000000000000000000001c6bf5263400000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -7943,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec34000000000000000000000000f90c4ca068955811f6b57b953c552ed73946ab86000000000000000000000000f90c4ca068955811f6b57b953c552ed73946ab86000000000000000000000000000000000000000000000000002e2f6e5e14800000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -7944,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec34000000000000000000000000e83c1c23fe932de2b3e9048623f6ec812c837478000000000000000000000000e83c1c23fe932de2b3e9048623f6ec812c83747800000000000000000000000000000000000000000000000000071afd498d000000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -7946,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec340000000000000000000000003807865c2b82eb2b41dbfe51a328be275d8433980000000000000000000000003807865c2b82eb2b41dbfe51a328be275d84339800000000000000000000000000000000000000000000000000421878ca4ba30000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,0xac7b225d07d1e53214a66c7a6538388a85239e942afd3cc094876209fb5c5f5c,2022-03-13 09:17:38.000 UTC,0,true -7947,0x10e6593cdda8c58a1d0f14c5164b376352a55f2f,0x467194771dae2967aef3ecbedd3bf9a310c76c65,0xa9f9e6750000000000000000000000006b175474e89094c44da98b954eedeac495271d0f000000000000000000000000da10009cbd5d07dd0cecc66161fc93d7c9000da1000000000000000000000000e4e87ef976eab568fda866d23141d37950baf4d9000000000000000000000000e4e87ef976eab568fda866d23141d37950baf4d9000000000000000000000000000000000000000000000460d5281b496a5f4bc300000000000000000000000000000000000000000000000000000000000000c00000000000000000000000000000000000000000000000000000000000000000,,,1,true -7949,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec34000000000000000000000000e4e87ef976eab568fda866d23141d37950baf4d9000000000000000000000000e4e87ef976eab568fda866d23141d37950baf4d90000000000000000000000000000000000000000000000000b428ceb6623e85400000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -7950,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec340000000000000000000000005d274079a4157cd9ad7545f0ff7fb3d7b472fb570000000000000000000000005d274079a4157cd9ad7545f0ff7fb3d7b472fb570000000000000000000000000000000000000000000000000001c6bf5263400000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -7951,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec34000000000000000000000000a509ef076b42e1face74c267f454e60f1ce779bd000000000000000000000000a509ef076b42e1face74c267f454e60f1ce779bd00000000000000000000000000000000000000000000000000002d79883d200000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -7952,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec340000000000000000000000006577d0b14abfce382d3912a9eff263b7981fb35b0000000000000000000000006577d0b14abfce382d3912a9eff263b7981fb35b00000000000000000000000000000000000000000000000000002d79883d200000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -7953,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec34000000000000000000000000eeaa75be33235789287252d238cbe9f2c58ac051000000000000000000000000eeaa75be33235789287252d238cbe9f2c58ac05100000000000000000000000000000000000000000000000000002d79883d200000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -7954,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec340000000000000000000000006577d0b14abfce382d3912a9eff263b7981fb35b0000000000000000000000006577d0b14abfce382d3912a9eff263b7981fb35b00000000000000000000000000000000000000000000000000002d79883d200000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -7955,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec34000000000000000000000000443571116e56aa45b6bf8408641ef13474708c21000000000000000000000000443571116e56aa45b6bf8408641ef13474708c2100000000000000000000000000000000000000000000000000002d79883d200000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -7956,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec34000000000000000000000000a6b9b2568b071e4d06cf740371b7607ba6469fe2000000000000000000000000a6b9b2568b071e4d06cf740371b7607ba6469fe2000000000000000000000000000000000000000000000000001ef6c3e593210000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -7957,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec34000000000000000000000000bfd3ab57c7a6b5a1e8fd18d728123d26373bec66000000000000000000000000bfd3ab57c7a6b5a1e8fd18d728123d26373bec6600000000000000000000000000000000000000000000000000002d79883d200000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -7958,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec34000000000000000000000000f78944945b0e0450f5ecde5d8e2004fba5b8a3f4000000000000000000000000f78944945b0e0450f5ecde5d8e2004fba5b8a3f400000000000000000000000000000000000000000000000000005af3107a400000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -7959,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec340000000000000000000000002b32476579accb1dab72bbb39c843857d92d076b0000000000000000000000002b32476579accb1dab72bbb39c843857d92d076b00000000000000000000000000000000000000000000000000038d7ea4c6800000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -7961,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec3400000000000000000000000002e9a5f06ad0c9b372e696991b4091534cf3e7c200000000000000000000000002e9a5f06ad0c9b372e696991b4091534cf3e7c2000000000000000000000000000000000000000000000000000997a2bce4c00000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -7962,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec34000000000000000000000000e08cc99723d23b660f7c4aabffae784e2e5aaaee000000000000000000000000e08cc99723d23b660f7c4aabffae784e2e5aaaee00000000000000000000000000000000000000000000000000005af3107a400000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -7964,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec34000000000000000000000000e9c8c0adb686ba89c18d4b5428223c6111349f68000000000000000000000000e9c8c0adb686ba89c18d4b5428223c6111349f6800000000000000000000000000000000000000000000000000005af3107a400000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -7966,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec340000000000000000000000002b32476579accb1dab72bbb39c843857d92d076b0000000000000000000000002b32476579accb1dab72bbb39c843857d92d076b0000000000000000000000000000000000000000000000000001c6bf5263400000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -7967,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec34000000000000000000000000f784bcac40eb7ba2b3969e8e13227679f62d0c27000000000000000000000000f784bcac40eb7ba2b3969e8e13227679f62d0c2700000000000000000000000000000000000000000000000000051d8e26c99d1c00000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -7969,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec34000000000000000000000000826b31fc2badc1cc8724de4b3f69b79201877d61000000000000000000000000826b31fc2badc1cc8724de4b3f69b79201877d61000000000000000000000000000000000000000000000000001f5c90a176e50000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -7970,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec34000000000000000000000000245f36c27de0d8f371b303cca1239b797802a25e000000000000000000000000245f36c27de0d8f371b303cca1239b797802a25e000000000000000000000000000000000000000000000000000c41c1b879a00000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -7972,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec340000000000000000000000004be97ec3f1c6a386d5ddf2c0a72e98463bb107ad0000000000000000000000004be97ec3f1c6a386d5ddf2c0a72e98463bb107ad0000000000000000000000000000000000000000000000000008b53920d0bf8000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -7973,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec340000000000000000000000000fc0e14cf00122df50f0fc8ea599572a0386b1e20000000000000000000000000fc0e14cf00122df50f0fc8ea599572a0386b1e20000000000000000000000000000000000000000000000000001c6bf5263400000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -7974,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec34000000000000000000000000e24f8451461a17aacfbfdd1521cc47f432c8d349000000000000000000000000e24f8451461a17aacfbfdd1521cc47f432c8d349000000000000000000000000000000000000000000000000025205397e0b7a4500000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,0xf87933b5e67a59e1825c4a399362b821379e586fc4898365326558164b1fee3f,2022-02-25 15:39:20.000 UTC,0,true -7976,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec34000000000000000000000000302e559551f93374ef1a0feaed42e34f36ff72e4000000000000000000000000302e559551f93374ef1a0feaed42e34f36ff72e4000000000000000000000000000000000000000000000000001550f7dca7000000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -7977,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec34000000000000000000000000c7913ee1f2a4f307917a7099b6903b5251745d24000000000000000000000000c7913ee1f2a4f307917a7099b6903b5251745d24000000000000000000000000000000000000000000000000001ebb79aac8250000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -7979,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec34000000000000000000000000a0c5b14cdf7daeaae92a0313d81322d4f7f92275000000000000000000000000a0c5b14cdf7daeaae92a0313d81322d4f7f922750000000000000000000000000000000000000000000000000044a88afd6c21c000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -7980,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec340000000000000000000000006b5f4db264257d14c84c2cfe4beb8dbe2e93de1a0000000000000000000000006b5f4db264257d14c84c2cfe4beb8dbe2e93de1a000000000000000000000000000000000000000000000000001f36400ecaaa0000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -7982,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec34000000000000000000000000e153b3f9fce55abc3ab26d6513a634c5cb5f9213000000000000000000000000e153b3f9fce55abc3ab26d6513a634c5cb5f9213000000000000000000000000000000000000000000000000000b5e620f48000000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -7983,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec34000000000000000000000000e292babb03689c7d55d83a903f9da81b55ec8959000000000000000000000000e292babb03689c7d55d83a903f9da81b55ec89590000000000000000000000000000000000000000000000000011c37937e0800000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -7986,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec340000000000000000000000002370ab10aa4965abad72e08ee40df72aaede124f0000000000000000000000002370ab10aa4965abad72e08ee40df72aaede124f0000000000000000000000000000000000000000000000000001c6bf5263400000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -7987,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec34000000000000000000000000c9feb729a473a46b1939a5b409096f754f97eeb9000000000000000000000000c9feb729a473a46b1939a5b409096f754f97eeb900000000000000000000000000000000000000000000000000005af3107a400000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -7988,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec3400000000000000000000000003ba15bf6d3c597d9e7e0eb76ea522fc089ec30200000000000000000000000003ba15bf6d3c597d9e7e0eb76ea522fc089ec30200000000000000000000000000000000000000000000000000b807d3575d800000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -7989,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec340000000000000000000000004e5d20108ffcbdcf9bf9be93c0bb0fb0c7fa83130000000000000000000000004e5d20108ffcbdcf9bf9be93c0bb0fb0c7fa831300000000000000000000000000000000000000000000000000201b051d1d800000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -7990,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec34000000000000000000000000762009efa840eb7ed893049b2d2b787502879d7c000000000000000000000000762009efa840eb7ed893049b2d2b787502879d7c000000000000000000000000000000000000000000000000001f1c3daef6730000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -7991,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec3400000000000000000000000021a8394c620a3ed1327f689ccf319aba059aca8e00000000000000000000000021a8394c620a3ed1327f689ccf319aba059aca8e00000000000000000000000000000000000000000000000000ca8132b032800000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -7992,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec34000000000000000000000000e5788c5d9a05c7b9b85eef7501a0689451823bc2000000000000000000000000e5788c5d9a05c7b9b85eef7501a0689451823bc200000000000000000000000000000000000000000000000000038d7ea4c6800000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -7993,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec34000000000000000000000000c353fa34b747faef8035f09c1aa90136eaf5a153000000000000000000000000c353fa34b747faef8035f09c1aa90136eaf5a153000000000000000000000000000000000000000000000000001fa470a787880000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -7994,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec34000000000000000000000000274c3e5dc565a4845fa73acf6536a01f3e43104f000000000000000000000000274c3e5dc565a4845fa73acf6536a01f3e43104f00000000000000000000000000000000000000000000000000a6fa404071800000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -7995,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec340000000000000000000000000d830ee097539cc5602cca64cb67ccab851d08210000000000000000000000000d830ee097539cc5602cca64cb67ccab851d0821000000000000000000000000000000000000000000000000001fa470a787880000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -7996,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec34000000000000000000000000852390120f80a07537d20a97c94627edbf58adb1000000000000000000000000852390120f80a07537d20a97c94627edbf58adb100000000000000000000000000000000000000000000000000ee08251ff3800000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -7997,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec34000000000000000000000000e5788c5d9a05c7b9b85eef7501a0689451823bc2000000000000000000000000e5788c5d9a05c7b9b85eef7501a0689451823bc200000000000000000000000000000000000000000000000000a36cc19bab000000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -7998,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec3400000000000000000000000046b6f4f9c11a9fc95c13fc49eb8d16871075aa2200000000000000000000000046b6f4f9c11a9fc95c13fc49eb8d16871075aa22000000000000000000000000000000000000000000000000000aa87bee53800000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -7999,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec340000000000000000000000003a04550e15035c1145d8692edcc6f5f8ab7101040000000000000000000000003a04550e15035c1145d8692edcc6f5f8ab710104000000000000000000000000000000000000000000000000000000e8d4a5100000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -8000,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec34000000000000000000000000b6cc8af1b4299eb37bee7de464f4c5152ba3137e000000000000000000000000b6cc8af1b4299eb37bee7de464f4c5152ba3137e000000000000000000000000000000000000000000000000000000e8d4a5100000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -8001,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec3400000000000000000000000071ea03598702d2fef81cf676d8fa7083c2b58f4300000000000000000000000071ea03598702d2fef81cf676d8fa7083c2b58f43000000000000000000000000000000000000000000000000000000e8d4a5100000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -8002,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec340000000000000000000000001ca9e9cc095b0bc7d863c8f23c40d2bfa81ddec20000000000000000000000001ca9e9cc095b0bc7d863c8f23c40d2bfa81ddec2000000000000000000000000000000000000000000000000000000e8d4a5100000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -8003,0x10e6593cdda8c58a1d0f14c5164b376352a55f2f,0x467194771dae2967aef3ecbedd3bf9a310c76c65,0xa9f9e6750000000000000000000000006b175474e89094c44da98b954eedeac495271d0f000000000000000000000000da10009cbd5d07dd0cecc66161fc93d7c9000da1000000000000000000000000595ef74cfca44eac149740e18d6d8c80309c4e1b000000000000000000000000595ef74cfca44eac149740e18d6d8c80309c4e1b0000000000000000000000000000000000000000000000008da7acf4eb27156b00000000000000000000000000000000000000000000000000000000000000c00000000000000000000000000000000000000000000000000000000000000000,,,1,true -8004,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec340000000000000000000000002f4213796a6ce2c24bcbc2074ad66b14c94804a40000000000000000000000002f4213796a6ce2c24bcbc2074ad66b14c94804a40000000000000000000000000000000000000000000000000001c6bf5263400000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -8006,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec34000000000000000000000000602c0269eb2d8a5dbadca05998eb72d9246d850d000000000000000000000000602c0269eb2d8a5dbadca05998eb72d9246d850d00000000000000000000000000000000000000000000000000003f78ce229bc000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -8007,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec34000000000000000000000000301b15702fafe00394f3ff772bcf97cf18cfc668000000000000000000000000301b15702fafe00394f3ff772bcf97cf18cfc66800000000000000000000000000000000000000000000000002c1a76ac146630000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -8008,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec340000000000000000000000007b9c1807a853fc1ecc1bf4b86e190835d17cd71b0000000000000000000000007b9c1807a853fc1ecc1bf4b86e190835d17cd71b00000000000000000000000000000000000000000000000000071afd498d000000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -8009,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec340000000000000000000000002237ea9cc8bc70eaa5a9bf898f186c7a0e89c8820000000000000000000000002237ea9cc8bc70eaa5a9bf898f186c7a0e89c88200000000000000000000000000000000000000000000000000016bcc41e9000000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -8011,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec34000000000000000000000000b3d8bfee35c6272095db789b6eaa45ac2fb571b1000000000000000000000000b3d8bfee35c6272095db789b6eaa45ac2fb571b10000000000000000000000000000000000000000000000000028b87ee55e9f8000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -8013,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec340000000000000000000000005cc123eabfd7f93e562e28ab5592d5575536ef240000000000000000000000005cc123eabfd7f93e562e28ab5592d5575536ef240000000000000000000000000000000000000000000000000038d7ea4c68000000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -8014,0xcd9d4988c0ae61887b075ba77f08cbfad2b65068,0x3f87ff1de58128ef8fcb4c807efd776e1ac72e51,0xf4f7b41a00000000000000000000000045ecd61c87bd0df7993da8f2b7b9084429da496c0000000000000000000000000000000000000000000000000de0b6b3a7640000,,,1,true -8017,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec3400000000000000000000000054bc0b774feac29bba39fb6b5f88d39cb8ca669800000000000000000000000054bc0b774feac29bba39fb6b5f88d39cb8ca6698000000000000000000000000000000000000000000000000003b0bf3ac14f38a00000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -8018,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec34000000000000000000000000585e9ce05b06a863edd448a7e6b7ff67494b27ab000000000000000000000000585e9ce05b06a863edd448a7e6b7ff67494b27ab00000000000000000000000000000000000000000000000000038d7ea4c6800000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -8020,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec340000000000000000000000001ae1220658bf9cd4d02cfd17409c09fb9e8fd9f50000000000000000000000001ae1220658bf9cd4d02cfd17409c09fb9e8fd9f5000000000000000000000000000000000000000000000000002ef7500153378d00000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -8021,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec340000000000000000000000000b248c1f8f0c8dc709acbcd8b83d8ef58571231b0000000000000000000000000b248c1f8f0c8dc709acbcd8b83d8ef58571231b00000000000000000000000000000000000000000000000000038d7ea4c6800000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -8023,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec34000000000000000000000000e3d8720e780ad1db79ee16f08f164dfc688a9135000000000000000000000000e3d8720e780ad1db79ee16f08f164dfc688a9135000000000000000000000000000000000000000000000000001e8eba6642450000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -8024,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec34000000000000000000000000667cea6cd8665c5de673ce447aaee3ec60c93e22000000000000000000000000667cea6cd8665c5de673ce447aaee3ec60c93e22000000000000000000000000000000000000000000000000001f221d2ff4d20000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -8025,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec340000000000000000000000001eac26a4ef3ab37d79ab27fa2c753fdc1d75d6570000000000000000000000001eac26a4ef3ab37d79ab27fa2c753fdc1d75d657000000000000000000000000000000000000000000000000001aaf45d1055a1200000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -8026,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec34000000000000000000000000b34c0cfe54b6249bcb4ae4baca21e44e53199ea7000000000000000000000000b34c0cfe54b6249bcb4ae4baca21e44e53199ea7000000000000000000000000000000000000000000000000001efe50f923520000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -8027,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec34000000000000000000000000ec51820b336f661af970527098b8347f4f0938c6000000000000000000000000ec51820b336f661af970527098b8347f4f0938c600000000000000000000000000000000000000000000000000038d7ea4c6800000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -8028,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec3400000000000000000000000081d7d26fbc67b56bebf9c6b1937ff3ebeae6e7bc00000000000000000000000081d7d26fbc67b56bebf9c6b1937ff3ebeae6e7bc0000000000000000000000000000000000000000000000000001a72724d1c10000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -8029,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec340000000000000000000000008f9013b8bff314203b13f6d20fa4af1b1024eeb70000000000000000000000008f9013b8bff314203b13f6d20fa4af1b1024eeb7000000000000000000000000000000000000000000000000001940543d67ad3900000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -8030,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec3400000000000000000000000015735d481dadf3dcb8be78f716be048112796ba400000000000000000000000015735d481dadf3dcb8be78f716be048112796ba4000000000000000000000000000000000000000000000000005bebe4aa1aa28a00000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -8032,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec34000000000000000000000000ba637c7f42470561dcf609ca673550ee6832cf63000000000000000000000000ba637c7f42470561dcf609ca673550ee6832cf630000000000000000000000000000000000000000000000000018de76816d800000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -8033,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec3400000000000000000000000063b2eb82073447bad2e02113e615c207c5ee616700000000000000000000000063b2eb82073447bad2e02113e615c207c5ee616700000000000000000000000000000000000000000000000000038d7ea4c6800000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -8034,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec3400000000000000000000000041f0bef1b9b6002d2a8826067613e83d41384f5800000000000000000000000041f0bef1b9b6002d2a8826067613e83d41384f5800000000000000000000000000000000000000000000000000038d7ea4c6800000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -8035,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec34000000000000000000000000ab5dd55a7c1632fdca0d3b60c28b5461a62f0aa6000000000000000000000000ab5dd55a7c1632fdca0d3b60c28b5461a62f0aa600000000000000000000000000000000000000000000000000038d7ea4c6800000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -8036,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec340000000000000000000000007014a2c9a116742947faabe727b6eb6242fc38fe0000000000000000000000007014a2c9a116742947faabe727b6eb6242fc38fe00000000000000000000000000000000000000000000000000038d7ea4c6800000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -8037,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec34000000000000000000000000bf9cedfde652368a9b9bb490b3253583d5763967000000000000000000000000bf9cedfde652368a9b9bb490b3253583d576396700000000000000000000000000000000000000000000000000038d7ea4c6800000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -8038,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec340000000000000000000000005fa73bea8e33f6fd4441b60db920b038e979ec7e0000000000000000000000005fa73bea8e33f6fd4441b60db920b038e979ec7e000000000000000000000000000000000000000000000000000b2cf37ea16a4000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -8039,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec34000000000000000000000000b6b1ee03c47be152c024a8879edafca28cf9258c000000000000000000000000b6b1ee03c47be152c024a8879edafca28cf9258c00000000000000000000000000000000000000000000000000038d7ea4c6800000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -8040,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec340000000000000000000000007d0cfc0f638f7496193356c3e4f0bcf9747b55310000000000000000000000007d0cfc0f638f7496193356c3e4f0bcf9747b55310000000000000000000000000000000000000000000000000071314894c8730300000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,0xfcf8e57290a0e647d393a201c25021e755ac92abd3f6b610bf6322cf24d85f3b,2022-05-26 03:57:41.000 UTC,0,true -8042,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec340000000000000000000000001c4dc8ced26e8b4714fbe4c9e9e21e517ec29eae0000000000000000000000001c4dc8ced26e8b4714fbe4c9e9e21e517ec29eae00000000000000000000000000000000000000000000000000038d7ea4c6800000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -8043,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec3400000000000000000000000032e0aa7d26551ab64d834bb6c19bd4ee38e4979b00000000000000000000000032e0aa7d26551ab64d834bb6c19bd4ee38e4979b00000000000000000000000000000000000000000000000000038d7ea4c6800000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -8044,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec3400000000000000000000000098b577dbeec67660dceff6eb7d05321a233eec1800000000000000000000000098b577dbeec67660dceff6eb7d05321a233eec1800000000000000000000000000000000000000000000000000026c4c2863d3be00000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -8045,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec340000000000000000000000000883fbb89b7afeca8f58301a40e579e95c612e540000000000000000000000000883fbb89b7afeca8f58301a40e579e95c612e5400000000000000000000000000000000000000000000000000038d7ea4c6800000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -8046,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec34000000000000000000000000f57af0c2231726e584086faa4266bee467109fa2000000000000000000000000f57af0c2231726e584086faa4266bee467109fa200000000000000000000000000000000000000000000000000735356d3f223ce00000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -8047,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec34000000000000000000000000d3234d4e330ad5e8a7e6a0c6bc458b24bdf7d3bf000000000000000000000000d3234d4e330ad5e8a7e6a0c6bc458b24bdf7d3bf0000000000000000000000000000000000000000000000000002ee06a83ecc0f00000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -8048,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec3400000000000000000000000001dadf8110a7b5f2dc6d13bcb26599ae255b493000000000000000000000000001dadf8110a7b5f2dc6d13bcb26599ae255b4930000000000000000000000000000000000000000000000000001ea70f3384aa0000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -8050,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec34000000000000000000000000725313887d5651f0f2d676d354334b70cf84ec8a000000000000000000000000725313887d5651f0f2d676d354334b70cf84ec8a00000000000000000000000000000000000000000000000005881b0df04f6bf500000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -8051,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec34000000000000000000000000469b83988610b92aac8c3ec1fdac42d531b9178a000000000000000000000000469b83988610b92aac8c3ec1fdac42d531b9178a0000000000000000000000000000000000000000000000000c7d713b49da000000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -8052,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec340000000000000000000000001e7197e7cca2355b83a33e345bc6a65c722d03630000000000000000000000001e7197e7cca2355b83a33e345bc6a65c722d0363000000000000000000000000000000000000000000000000002718e5c01ed21600000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -8053,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec340000000000000000000000003f33856be70bb5fbccb08cbe5753336beab04ba40000000000000000000000003f33856be70bb5fbccb08cbe5753336beab04ba40000000000000000000000000000000000000000000000000000b5e620f4800000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -8055,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec34000000000000000000000000ea22e2411b5c1812aa27724f61178e439f0cc7aa000000000000000000000000ea22e2411b5c1812aa27724f61178e439f0cc7aa00000000000000000000000000000000000000000000000002c1d4719e39e60000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -8057,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec340000000000000000000000003f33856be70bb5fbccb08cbe5753336beab04ba40000000000000000000000003f33856be70bb5fbccb08cbe5753336beab04ba40000000000000000000000000000000000000000000000000000b5e620f4800000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -8058,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec340000000000000000000000003f33856be70bb5fbccb08cbe5753336beab04ba40000000000000000000000003f33856be70bb5fbccb08cbe5753336beab04ba40000000000000000000000000000000000000000000000000000b5e620f4800000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -8059,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec340000000000000000000000005ee3479373e6a31185a5cf9a40a00469814b21420000000000000000000000005ee3479373e6a31185a5cf9a40a00469814b214200000000000000000000000000000000000000000000000000b1a2bc2ec5000000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -8060,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec34000000000000000000000000eb7c67585ca996b4b20529f02ff2046c75edcafc000000000000000000000000eb7c67585ca996b4b20529f02ff2046c75edcafc000000000000000000000000000000000000000000000000012e991fb9cbaddf00000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -8061,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec340000000000000000000000007525af9498280da3fc2f5498c495e89561b8ee790000000000000000000000007525af9498280da3fc2f5498c495e89561b8ee79000000000000000000000000000000000000000000000000015fb7f9b8c3800000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,0xbcc8124d5316c46cfa4f767d04abc2fdf98b78372209179b0ad6fef18392234c,2021-12-08 02:48:38.000 UTC,0,true -8062,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec34000000000000000000000000ca7c767854b1e7305de07247ab85e30543d1d9c9000000000000000000000000ca7c767854b1e7305de07247ab85e30543d1d9c90000000000000000000000000000000000000000000000000ddc46ae96765a0000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -8063,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec340000000000000000000000003526f94b578c224601d5f198dbb1643910c2f93b0000000000000000000000003526f94b578c224601d5f198dbb1643910c2f93b000000000000000000000000000000000000000000000000002d200865bf880600000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -8065,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec34000000000000000000000000667816ea7e29233aa2c4f5e6d2d17b658156902d000000000000000000000000667816ea7e29233aa2c4f5e6d2d17b658156902d000000000000000000000000000000000000000000000000003c01cb5c59898000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -8067,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec3400000000000000000000000092eead2ea4b7044692dfdd524008c36c03b632fd00000000000000000000000092eead2ea4b7044692dfdd524008c36c03b632fd0000000000000000000000000000000000000000000000000056f3d8a43ab78400000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -8069,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec340000000000000000000000007d7955d1e697389c6b748ce52cfca7b536fa2ebf0000000000000000000000007d7955d1e697389c6b748ce52cfca7b536fa2ebf00000000000000000000000000000000000000000000000000446b247ef4e48c00000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -8070,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec34000000000000000000000000216e36333cfed41cdfcda3fa2642f6c4b14d4358000000000000000000000000216e36333cfed41cdfcda3fa2642f6c4b14d43580000000000000000000000000000000000000000000000000001c6bf5263400000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -8072,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec3400000000000000000000000066f742da1ec05f3531c161e1412ac58abed58ba100000000000000000000000066f742da1ec05f3531c161e1412ac58abed58ba100000000000000000000000000000000000000000000000000369c1405ce37be00000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -8073,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec34000000000000000000000000deaa628859122cb4b570882aa8bc9c786e8a932a000000000000000000000000deaa628859122cb4b570882aa8bc9c786e8a932a000000000000000000000000000000000000000000000000016916718eae33bd00000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -8077,0xcd9d4988c0ae61887b075ba77f08cbfad2b65068,0x3f87ff1de58128ef8fcb4c807efd776e1ac72e51,0xf4f7b41a0000000000000000000000001b2e7503a3da1f16c11be33d35640e379c80b94a0000000000000000000000000000000000000000000000008963dd8c2c5e0000,,,1,true -8078,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec3400000000000000000000000004f71a91733f55c82fd29f064b37f7d83b2ee86d00000000000000000000000004f71a91733f55c82fd29f064b37f7d83b2ee86d0000000000000000000000000000000000000000000000000015ae60b7a4110000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -8079,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec34000000000000000000000000ac7adda48ffb1b1c756bcacde9dec410927509e5000000000000000000000000ac7adda48ffb1b1c756bcacde9dec410927509e5000000000000000000000000000000000000000000000000005fec5b60ef800000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -8080,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec340000000000000000000000007c85d1682a48ae42ed1923b53e7b0e2c4bd72b050000000000000000000000007c85d1682a48ae42ed1923b53e7b0e2c4bd72b050000000000000000000000000000000000000000000000000062eb842683650000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -8081,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec34000000000000000000000000d70327e5620f5b8199f9e83e7281839286870dd7000000000000000000000000d70327e5620f5b8199f9e83e7281839286870dd700000000000000000000000000000000000000000000000007796610160dd14900000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -8083,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec34000000000000000000000000345cec5bb2626e347c02d493950c20dd16f63ad9000000000000000000000000345cec5bb2626e347c02d493950c20dd16f63ad9000000000000000000000000000000000000000000000000000137a9046d8e0000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -8084,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec340000000000000000000000004fe62c9735b59c8a1c6b6e10e657b976401a43b00000000000000000000000004fe62c9735b59c8a1c6b6e10e657b976401a43b000000000000000000000000000000000000000000000000006866332e9e57ee800000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,0x7c4e5dcb3929603f4cc6148a16f3254c4b5869d1c5fe075eb2cd66a3c8917c1b,2022-03-28 08:39:08.000 UTC,0,true -8085,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec34000000000000000000000000ad2b87c7b0e86401660c3ba70ab1222556dac987000000000000000000000000ad2b87c7b0e86401660c3ba70ab1222556dac9870000000000000000000000000000000000000000000000003ad855409f5d70d000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,0x2a402fbe79d58916a1419619edaea3e530858a0630e20901830bc39bbdd3123d,2021-11-25 11:47:04.000 UTC,0,true -8087,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec3400000000000000000000000055b1edfe744e4544f9d1668efff6e8ba2290377800000000000000000000000055b1edfe744e4544f9d1668efff6e8ba2290377800000000000000000000000000000000000000000000000000652a3cbe9ada0000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -8089,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec34000000000000000000000000ba081d2bcf60b2f4d25468daeab35e44227f0aa6000000000000000000000000ba081d2bcf60b2f4d25468daeab35e44227f0aa6000000000000000000000000000000000000000000000000015be4946bb64e0000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -8091,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec34000000000000000000000000a9ef4b1d2eb0102a5169ea6f2bd7934474e6f7d7000000000000000000000000a9ef4b1d2eb0102a5169ea6f2bd7934474e6f7d7000000000000000000000000000000000000000000000000013083f18a4c970d00000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -8092,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec34000000000000000000000000ea0cd27bf777e480700a083513e605f0bfef3202000000000000000000000000ea0cd27bf777e480700a083513e605f0bfef3202000000000000000000000000000000000000000000000000011c37937e08000000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,0x7c2a5cc45ba3f68a31c0e17125723aad146508b15fe3a6994c7a7e2dcd4f5aa8,2021-11-25 18:32:37.000 UTC,0,true -8093,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec3400000000000000000000000072c083ccbb46b6960a541c9850dbedc0257850be00000000000000000000000072c083ccbb46b6960a541c9850dbedc0257850be000000000000000000000000000000000000000000000000003e70577a47010000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -8095,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec340000000000000000000000009da5c4c283c2fe334e2a1081a7fdae45475ceb410000000000000000000000009da5c4c283c2fe334e2a1081a7fdae45475ceb41000000000000000000000000000000000000000000000000001de9b919949b0000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -8096,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec34000000000000000000000000e397a17d0f5c554a3fca64bfc99267db286ab155000000000000000000000000e397a17d0f5c554a3fca64bfc99267db286ab15500000000000000000000000000000000000000000000000006b4cb63cde35be600000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,0x0490578e0cf6d6c0a5c8417bcc0900f6aeb79b17a1fc2b5360043a95ff4a3d0e,2021-12-08 13:19:35.000 UTC,0,true -8097,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec3400000000000000000000000018d1d461ce665094821d17b82730f3fd923d435200000000000000000000000018d1d461ce665094821d17b82730f3fd923d435200000000000000000000000000000000000000000000000006be36de3721d26f00000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,0x9ae57d30b21d1d2535b5cf04fdc2385e989d253bab4d378a5746e35ecbdc9427,2022-02-22 17:52:55.000 UTC,0,true -8098,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec34000000000000000000000000cb2fabbfa866570768bf6b0439f69b9f2fa72fec000000000000000000000000cb2fabbfa866570768bf6b0439f69b9f2fa72fec000000000000000000000000000000000000000000000000000aa2657d23c78000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -8099,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec34000000000000000000000000b38638d4e09a66a9ef98ca5d36aa57fcbf12e26f000000000000000000000000b38638d4e09a66a9ef98ca5d36aa57fcbf12e26f00000000000000000000000000000000000000000000000000071afd498d000000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -8101,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec340000000000000000000000003cd27bc0c2fe10705578e62fb11c110a14778bcf0000000000000000000000003cd27bc0c2fe10705578e62fb11c110a14778bcf0000000000000000000000000000000000000000000000000002cd042f01d11500000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -8102,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec3400000000000000000000000076744f4fd8ad6627e838bcabec82c25bdb06a9f100000000000000000000000076744f4fd8ad6627e838bcabec82c25bdb06a9f10000000000000000000000000000000000000000000000000002e48981dcc73400000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -8104,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec34000000000000000000000000cdfe073bfdb8d8f9d8db26621d7e33b803a06670000000000000000000000000cdfe073bfdb8d8f9d8db26621d7e33b803a066700000000000000000000000000000000000000000000000000000204f36f1e91500000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -8105,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec34000000000000000000000000a62bb8263dcb26d1c5f77f4b747cd8e246fa4fe6000000000000000000000000a62bb8263dcb26d1c5f77f4b747cd8e246fa4fe60000000000000000000000000000000000000000000000000000204f36f1e91500000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -8106,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec3400000000000000000000000072681b6fa7e64d790260831a0c62d640f83789e300000000000000000000000072681b6fa7e64d790260831a0c62d640f83789e3000000000000000000000000000000000000000000000000000101faa271941800000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -8107,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec34000000000000000000000000f2af0268a8b83b9581dfbf67011b0957ee4c31a0000000000000000000000000f2af0268a8b83b9581dfbf67011b0957ee4c31a0000000000000000000000000000000000000000000000000000101faa271941800000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -8108,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec34000000000000000000000000f2af0268a8b83b9581dfbf67011b0957ee4c31a0000000000000000000000000f2af0268a8b83b9581dfbf67011b0957ee4c31a0000000000000000000000000000000000000000000000000000101faa271941800000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -8109,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec34000000000000000000000000e58a15be9b5377e9b457768595af7f5a537cd4dd000000000000000000000000e58a15be9b5377e9b457768595af7f5a537cd4dd000000000000000000000000000000000000000000000000000101faa271941800000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -8110,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec34000000000000000000000000dd8eb22b2e8d78982166f66149f258b8ac7a8bc1000000000000000000000000dd8eb22b2e8d78982166f66149f258b8ac7a8bc100000000000000000000000000000000000000000000000000005fc946ddb48000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -8111,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec340000000000000000000000000cdac7bca5da93eef2e0d00c337f917d3f6639330000000000000000000000000cdac7bca5da93eef2e0d00c337f917d3f663933000000000000000000000000000000000000000000000000007ac0aeb874bbbd00000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -8118,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec340000000000000000000000009a97dbc9baa91707b5bde45c810536c17b8ceb150000000000000000000000009a97dbc9baa91707b5bde45c810536c17b8ceb1500000000000000000000000000000000000000000000000006391f4ea4bf850000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,0x675e9a22219def7c57e025758944ecaf45c2387e81c3f2d0f2857507786f9689,2022-06-01 10:34:42.000 UTC,0,true -8119,0x10e6593cdda8c58a1d0f14c5164b376352a55f2f,0x467194771dae2967aef3ecbedd3bf9a310c76c65,0xa9f9e6750000000000000000000000006b175474e89094c44da98b954eedeac495271d0f000000000000000000000000da10009cbd5d07dd0cecc66161fc93d7c9000da10000000000000000000000003c00a3fa2eef1afccf044af59ce105b8200272cd0000000000000000000000003c00a3fa2eef1afccf044af59ce105b8200272cd00000000000000000000000000000000000000000000000057be307ed8b2177300000000000000000000000000000000000000000000000000000000000000c00000000000000000000000000000000000000000000000000000000000000000,,,1,true -8120,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec34000000000000000000000000324e0b53cefa84cf970833939249880f814557c6000000000000000000000000324e0b53cefa84cf970833939249880f814557c60000000000000000000000000000000000000000000000000dcee9c35fe2020000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -8121,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec3400000000000000000000000017f0cef921129890f57cc660ce7d67b9b17edbf800000000000000000000000017f0cef921129890f57cc660ce7d67b9b17edbf80000000000000000000000000000000000000000000000000026c22c182497cf00000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -8122,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec340000000000000000000000000a7ac9632080867423f8fb3e922ed212734e0fc10000000000000000000000000a7ac9632080867423f8fb3e922ed212734e0fc1000000000000000000000000000000000000000000000000002dbbc9f5c1aaf700000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -8123,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec34000000000000000000000000ef09db43283c53b2fe1e56bb46feb42f57a5e3cf000000000000000000000000ef09db43283c53b2fe1e56bb46feb42f57a5e3cf0000000000000000000000000000000000000000000000000dd7d780c41ee90000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -8124,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec34000000000000000000000000687549b38e7453a88e271404250c659908de7d80000000000000000000000000687549b38e7453a88e271404250c659908de7d80000000000000000000000000000000000000000000000000000cc1d48a81382d00000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -8125,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec34000000000000000000000000691819b746a82592d36abbfaac0ed4a1a64e666d000000000000000000000000691819b746a82592d36abbfaac0ed4a1a64e666d0000000000000000000000000000000000000000000000000009d53c5af3a9f600000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -8126,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec3400000000000000000000000014d74016422f9a923c6e995e6576d1539a4f4c1800000000000000000000000014d74016422f9a923c6e995e6576d1539a4f4c18000000000000000000000000000000000000000000000000006067ff15114e0000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -8129,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec34000000000000000000000000a679c6154b8d4619af9f83f0bf9a13a680e01ecf000000000000000000000000a679c6154b8d4619af9f83f0bf9a13a680e01ecf000000000000000000000000000000000000000000000000041ccea40f5817c000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -8130,0x10e6593cdda8c58a1d0f14c5164b376352a55f2f,0x467194771dae2967aef3ecbedd3bf9a310c76c65,0xa9f9e6750000000000000000000000006b175474e89094c44da98b954eedeac495271d0f000000000000000000000000da10009cbd5d07dd0cecc66161fc93d7c9000da1000000000000000000000000650aede9768d80cbdbfda2d1e2d35250ee0691e0000000000000000000000000650aede9768d80cbdbfda2d1e2d35250ee0691e00000000000000000000000000000000000000000000000e0eea9d435dbffc53b00000000000000000000000000000000000000000000000000000000000000c00000000000000000000000000000000000000000000000000000000000000000,0xaaa4b0a233fa23546c41b141ccb1d775d44de4af0c1575e657e359c7842903e8,2022-02-01 19:25:46.000 UTC,0,true -8131,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec34000000000000000000000000cc13514bc2b74b1886e7aff16645756436f2de82000000000000000000000000cc13514bc2b74b1886e7aff16645756436f2de820000000000000000000000000000000000000000000000000011c37937e0800000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -8133,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec34000000000000000000000000216e36333cfed41cdfcda3fa2642f6c4b14d4358000000000000000000000000216e36333cfed41cdfcda3fa2642f6c4b14d435800000000000000000000000000000000000000000000000000005af3107a400000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -8135,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec34000000000000000000000000759d669fd65cc5a42c02e9d22c291ec09e066023000000000000000000000000759d669fd65cc5a42c02e9d22c291ec09e0660230000000000000000000000000000000000000000000000000018d2186f66612400000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -8136,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec340000000000000000000000002cab3a5c1d3cfea0abaa075d0eeb5fcff08852460000000000000000000000002cab3a5c1d3cfea0abaa075d0eeb5fcff088524600000000000000000000000000000000000000000000000000dfe2af11f8936d00000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -8139,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec34000000000000000000000000858d150df99c308b406b2796d933689d9ac3cffa000000000000000000000000858d150df99c308b406b2796d933689d9ac3cffa000000000000000000000000000000000000000000000000006a0011af4deebf00000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -8142,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec34000000000000000000000000c8c6094a3288a5e20dddde2c466edf9b3fdf3d04000000000000000000000000c8c6094a3288a5e20dddde2c466edf9b3fdf3d04000000000000000000000000000000000000000000000000001e3bf2277dcd0000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -8143,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec3400000000000000000000000041fa51fffe4b6d2d5d5a45fd050531a74cc3fc1300000000000000000000000041fa51fffe4b6d2d5d5a45fd050531a74cc3fc13000000000000000000000000000000000000000000000000001db5fbf259d00000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -8144,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec34000000000000000000000000b63101940135b7c85f5f536ce41ccf5818aa2e5b000000000000000000000000b63101940135b7c85f5f536ce41ccf5818aa2e5b000000000000000000000000000000000000000000000000001ed2b01653fe0000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -8145,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec340000000000000000000000007c82bdcf970f33866c2b7f73a3628418f8229eb90000000000000000000000007c82bdcf970f33866c2b7f73a3628418f8229eb9000000000000000000000000000000000000000000000000001ed2b01653fe0000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -8146,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec3400000000000000000000000010590af6d0cdef12d9608c442170c3f76a6fc97600000000000000000000000010590af6d0cdef12d9608c442170c3f76a6fc976000000000000000000000000000000000000000000000000001ed2b01653fe0000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -8147,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec34000000000000000000000000dc4f1956f7261a120238df9861731b84c1a94066000000000000000000000000dc4f1956f7261a120238df9861731b84c1a94066000000000000000000000000000000000000000000000000001ed2b01653fe0000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -8148,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec34000000000000000000000000e61c985ac87b493b8bf98fabdff0a86c0bb223a4000000000000000000000000e61c985ac87b493b8bf98fabdff0a86c0bb223a4000000000000000000000000000000000000000000000000001e7d1be347280000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -8149,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec340000000000000000000000006d7c09c7ab07424d74e47e1fa1e7eea02933c8e20000000000000000000000006d7c09c7ab07424d74e47e1fa1e7eea02933c8e2000000000000000000000000000000000000000000000000001e7d1be347280000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -8150,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec3400000000000000000000000000bcd328f7bb87399ff5c363d244355094b0614100000000000000000000000000bcd328f7bb87399ff5c363d244355094b06141000000000000000000000000000000000000000000000000001de2bb36dfb00000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -8151,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec3400000000000000000000000097b96d3d407257e0602c3b107a169861bb1b0ff900000000000000000000000097b96d3d407257e0602c3b107a169861bb1b0ff9000000000000000000000000000000000000000000000000001de2bb36dfb00000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -8152,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec340000000000000000000000009d3c63dd02af2f8832c8725cfdb15bb445e129120000000000000000000000009d3c63dd02af2f8832c8725cfdb15bb445e12912000000000000000000000000000000000000000000000000001d5803e273e00000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -8153,0xcd9d4988c0ae61887b075ba77f08cbfad2b65068,0x3f87ff1de58128ef8fcb4c807efd776e1ac72e51,0xf4f7b41a00000000000000000000000060da990aebdd785f50ea3202ff05bff1d0963dbe000000000000000000000000000000000000000000000000e77c1395f1a6b324,,,1,true -8156,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec34000000000000000000000000ec3b481c482e92850edf554a3ad5bcd89e15c662000000000000000000000000ec3b481c482e92850edf554a3ad5bcd89e15c66200000000000000000000000000000000000000000000000000005af3107a400000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -8157,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec340000000000000000000000008de3c3891268502f77db7e876d727257dec0f8520000000000000000000000008de3c3891268502f77db7e876d727257dec0f852000000000000000000000000000000000000000000000000017199c64bb8c00600000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -8159,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec340000000000000000000000000c4402ceee20579a0b3c5cad83883b3d6e2bdb490000000000000000000000000c4402ceee20579a0b3c5cad83883b3d6e2bdb49000000000000000000000000000000000000000000000000001f291b12a9bd0000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -8160,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec340000000000000000000000006e6b39bffd69557145611c746d5b13cc125972860000000000000000000000006e6b39bffd69557145611c746d5b13cc12597286000000000000000000000000000000000000000000000000001f344ae3cb350000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -8161,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec34000000000000000000000000f1a5161d604d7348d7f5c534517b5404a8edefe4000000000000000000000000f1a5161d604d7348d7f5c534517b5404a8edefe4000000000000000000000000000000000000000000000000016dc800f1af8c9c00000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -8163,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec34000000000000000000000000c2af77dce51511a0663053ea7fa5043e0f4227d5000000000000000000000000c2af77dce51511a0663053ea7fa5043e0f4227d500000000000000000000000000000000000000000000000000056c94fbfa558000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -8164,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec340000000000000000000000007d19eb5ed5838da9806681688f03ac2b9cbc389e0000000000000000000000007d19eb5ed5838da9806681688f03ac2b9cbc389e00000000000000000000000000000000000000000000000000002a91fd59fc7400000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -8166,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0xa9f9e675000000000000000000000000dac17f958d2ee523a2206206994597c13d831ec700000000000000000000000094b008aa00579c1307b0ef2c499ad98a8ce58e58000000000000000000000000ec83e4768e314cdd88f910e397affcde78a52f92000000000000000000000000ec83e4768e314cdd88f910e397affcde78a52f92000000000000000000000000000000000000000000000000000000001dcd650000000000000000000000000000000000000000000000000000000000000000c00000000000000000000000000000000000000000000000000000000000000000,0x5f8cc08c8a019ebb5e26286c5de9818c192aef3125dc52ec8d7540ef67df8e01,2022-06-26 01:19:36.000 UTC,0,true -8168,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec34000000000000000000000000e2ae50242c85577be214e5e48120a4012096f751000000000000000000000000e2ae50242c85577be214e5e48120a4012096f7510000000000000000000000000000000000000000000000000004d70254e4d93e00000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -8169,0xcd9d4988c0ae61887b075ba77f08cbfad2b65068,0x3f87ff1de58128ef8fcb4c807efd776e1ac72e51,0xf4f7b41a00000000000000000000000003414bc24c60cfe67b3a1ef2720c6677dc1634910000000000000000000000000000000000000000000000001d390c3de779d324,,,1,true -8170,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec34000000000000000000000000b813cecf4fa33172f5fedf635e363cb35d7c361b000000000000000000000000b813cecf4fa33172f5fedf635e363cb35d7c361b000000000000000000000000000000000000000000000000004ab72822fd8c7f00000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -8172,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec3400000000000000000000000091edb26c6abdfb69e4f3360808157ed100b13b5d00000000000000000000000091edb26c6abdfb69e4f3360808157ed100b13b5d0000000000000000000000000000000000000000000000000030967bf921d7c000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -8174,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec340000000000000000000000000813407596e7c63cd3958ff081ca078cb31ddbf10000000000000000000000000813407596e7c63cd3958ff081ca078cb31ddbf1000000000000000000000000000000000000000000000000008165265da50d4700000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -8177,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec34000000000000000000000000406c00ac4b3d865931c66bcd3f8621c4230af7bb000000000000000000000000406c00ac4b3d865931c66bcd3f8621c4230af7bb0000000000000000000000000000000000000000000000000019396991e7c00000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -8178,0xcd9d4988c0ae61887b075ba77f08cbfad2b65068,0x3f87ff1de58128ef8fcb4c807efd776e1ac72e51,0xf4f7b41a000000000000000000000000db326c0f5f60ef7940a319e386db26f9e5810656000000000000000000000000000000000000000000000001da166835f41a135d,,,1,true -8179,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec34000000000000000000000000db49553ff31e88e5cd561c9b6c1d90ebf165d6bf000000000000000000000000db49553ff31e88e5cd561c9b6c1d90ebf165d6bf0000000000000000000000000000000000000000000000000018ccf5c64c51c000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -8180,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec3400000000000000000000000011c4f894cc4cd2d96e87ff90bb30a4a99c97df1b00000000000000000000000011c4f894cc4cd2d96e87ff90bb30a4a99c97df1b0000000000000000000000000000000000000000000000000008d6cd0360cac000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -8181,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec34000000000000000000000000e1376738101036030b76723154f4db4b0ab3ae33000000000000000000000000e1376738101036030b76723154f4db4b0ab3ae33000000000000000000000000000000000000000000000000000aa87bee53800000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -8182,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec34000000000000000000000000770464ef67b6e276cd76576100cba00ca91fc02c000000000000000000000000770464ef67b6e276cd76576100cba00ca91fc02c0000000000000000000000000000000000000000000000000089e9069317bc1b00000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -8183,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec34000000000000000000000000cfe33c2a47d74f24ae0c1e434ced836dd78a43eb000000000000000000000000cfe33c2a47d74f24ae0c1e434ced836dd78a43eb00000000000000000000000000000000000000000000000000b1a2bc2ec5000000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -8184,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec3400000000000000000000000041cc4a3fe2227953da7eadecd77e366d2cda886600000000000000000000000041cc4a3fe2227953da7eadecd77e366d2cda8866000000000000000000000000000000000000000000000000010e207120ed966000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -8185,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec34000000000000000000000000b4e9abcf9f98cae5088cee01862a43c239ee963c000000000000000000000000b4e9abcf9f98cae5088cee01862a43c239ee963c000000000000000000000000000000000000000000000000002b50be4fe7538200000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -8186,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0xa9f9e675000000000000000000000000a0b86991c6218b36c1d19d4a2e9eb0ce3606eb480000000000000000000000007f5c764cbc14f9669b88837ca1490cca17c316070000000000000000000000008810a2d251df25b4fbce3c1fcfeb050034e50ff60000000000000000000000008810a2d251df25b4fbce3c1fcfeb050034e50ff600000000000000000000000000000000000000000000000000000000109a305600000000000000000000000000000000000000000000000000000000000000c00000000000000000000000000000000000000000000000000000000000000000,,,1,true -8187,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec34000000000000000000000000ffaa7ee8fe0d828e5844d3fd991fcfd7288390c9000000000000000000000000ffaa7ee8fe0d828e5844d3fd991fcfd7288390c9000000000000000000000000000000000000000000000000002b50be4fe7538200000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -8188,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec34000000000000000000000000498f39362d1bd31a673fadc57efa53969aefbbea000000000000000000000000498f39362d1bd31a673fadc57efa53969aefbbea000000000000000000000000000000000000000000000000001857214a18e84000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -8189,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec34000000000000000000000000273ec095fe4c3c023b6e5d3dcd3642af950ac930000000000000000000000000273ec095fe4c3c023b6e5d3dcd3642af950ac9300000000000000000000000000000000000000000000000000b3b01229605b9dc00000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -8191,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec34000000000000000000000000dddf40605bcb1f8346b328e4bd0f873f75d66690000000000000000000000000dddf40605bcb1f8346b328e4bd0f873f75d666900000000000000000000000000000000000000000000000000015684fc149653b00000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -8192,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0xa9f9e675000000000000000000000000dac17f958d2ee523a2206206994597c13d831ec700000000000000000000000094b008aa00579c1307b0ef2c499ad98a8ce58e58000000000000000000000000dddf40605bcb1f8346b328e4bd0f873f75d66690000000000000000000000000dddf40605bcb1f8346b328e4bd0f873f75d6669000000000000000000000000000000000000000000000000000000000000f424000000000000000000000000000000000000000000000000000000000000000c00000000000000000000000000000000000000000000000000000000000000000,,,1,true -8194,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec34000000000000000000000000cfe33c2a47d74f24ae0c1e434ced836dd78a43eb000000000000000000000000cfe33c2a47d74f24ae0c1e434ced836dd78a43eb0000000000000000000000000000000000000000000000000056840fa85e791100000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -8195,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0xa9f9e675000000000000000000000000a0b86991c6218b36c1d19d4a2e9eb0ce3606eb480000000000000000000000007f5c764cbc14f9669b88837ca1490cca17c316070000000000000000000000009fe553de68865f425d8071c81640855a7c9613eb0000000000000000000000009fe553de68865f425d8071c81640855a7c9613eb000000000000000000000000000000000000000000000000000000003a15328200000000000000000000000000000000000000000000000000000000000000c00000000000000000000000000000000000000000000000000000000000000000,,,1,true -8199,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec3400000000000000000000000052905a5e83a83f6a9d0e64ad24e79a37512d35b900000000000000000000000052905a5e83a83f6a9d0e64ad24e79a37512d35b900000000000000000000000000000000000000000000000002af9e74268d935200000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -8200,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0xa9f9e6750000000000000000000000001f9840a85d5af5bf1d1762f925bdaddc4201f9840000000000000000000000006fd9d7ad17242c41f7131d257212c54a0e816691000000000000000000000000139c6b1985656a6a2727b714060eb2f0230d8a81000000000000000000000000139c6b1985656a6a2727b714060eb2f0230d8a810000000000000000000000000000000000000000000000000de0b6b3a764000000000000000000000000000000000000000000000000000000000000000000c00000000000000000000000000000000000000000000000000000000000000000,,,1,true -8201,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec340000000000000000000000006f8a10b701c58aa99f9a240208c7be64381c313f0000000000000000000000006f8a10b701c58aa99f9a240208c7be64381c313f000000000000000000000000000000000000000000000000000f873df4294f9b00000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -8202,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec3400000000000000000000000067320a4323eb84534cc5dce232c69b57f9a8cf6400000000000000000000000067320a4323eb84534cc5dce232c69b57f9a8cf6400000000000000000000000000000000000000000000000001a20c7aaf8aa44f00000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -8203,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec3400000000000000000000000040077ad46d6f11e4d2dc3cc8a09227355c70e45700000000000000000000000040077ad46d6f11e4d2dc3cc8a09227355c70e45700000000000000000000000000000000000000000000000000038d7ea4c6800000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -8204,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec34000000000000000000000000d88463cc7b5d448f4457614f16556be46060b3d6000000000000000000000000d88463cc7b5d448f4457614f16556be46060b3d6000000000000000000000000000000000000000000000000002867448af4f9f400000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -8205,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec34000000000000000000000000df62defaf89a4f4ff370854a9d521fab2edd1734000000000000000000000000df62defaf89a4f4ff370854a9d521fab2edd1734000000000000000000000000000000000000000000000000009d1b6ecba12eab00000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -8207,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec340000000000000000000000008bb1390a642e4dc2a5a6b9b8f32d34f37144fcdc0000000000000000000000008bb1390a642e4dc2a5a6b9b8f32d34f37144fcdc00000000000000000000000000000000000000000000000003c1b483c16e19ec00000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -8209,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec340000000000000000000000004568b388342840f2d249873f197ed383da25de7f0000000000000000000000004568b388342840f2d249873f197ed383da25de7f000000000000000000000000000000000000000000000000019878f10f3471a600000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -8210,0x10e6593cdda8c58a1d0f14c5164b376352a55f2f,0x467194771dae2967aef3ecbedd3bf9a310c76c65,0xa9f9e6750000000000000000000000006b175474e89094c44da98b954eedeac495271d0f000000000000000000000000da10009cbd5d07dd0cecc66161fc93d7c9000da1000000000000000000000000300117c369a7d1b32413a255723ef0cb5c5f95c7000000000000000000000000300117c369a7d1b32413a255723ef0cb5c5f95c700000000000000000000000000000000000000000000000045a40f357504cf0200000000000000000000000000000000000000000000000000000000000000c00000000000000000000000000000000000000000000000000000000000000000,,,1,true -8212,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec3400000000000000000000000078a90951bc30582fb8f5b1ec218a15463418374400000000000000000000000078a90951bc30582fb8f5b1ec218a15463418374400000000000000000000000000000000000000000000000000b1a2bc2ec5000000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -8213,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec340000000000000000000000003e42a67f51dce014ae17fe0b0e6a0c692ef5eae60000000000000000000000003e42a67f51dce014ae17fe0b0e6a0c692ef5eae600000000000000000000000000000000000000000000000000a2033cb4ff14b100000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -8214,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec34000000000000000000000000025d64f2d94807613ecfdae56fa9ec7bcdb29da2000000000000000000000000025d64f2d94807613ecfdae56fa9ec7bcdb29da200000000000000000000000000000000000000000000000000038d7ea4c6800000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -8215,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec3400000000000000000000000060b6eade8258a52bfda3c80df3fde715ef47df7300000000000000000000000060b6eade8258a52bfda3c80df3fde715ef47df7300000000000000000000000000000000000000000000000000b763687f50dd6600000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -8216,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec34000000000000000000000000ae0f777ccd5cbf23dd99c93d52a8a0f630dc47ae000000000000000000000000ae0f777ccd5cbf23dd99c93d52a8a0f630dc47ae00000000000000000000000000000000000000000000000000522317276c5eb800000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -8217,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec34000000000000000000000000985cb01e8830aaa1a3dff87151ccdf5ce2ce999b000000000000000000000000985cb01e8830aaa1a3dff87151ccdf5ce2ce999b00000000000000000000000000000000000000000000000000039c95d2925ec000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -8218,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec34000000000000000000000000510bbd7b7408c073e9e6e7f50f46bff1e6f2867f000000000000000000000000510bbd7b7408c073e9e6e7f50f46bff1e6f2867f0000000000000000000000000000000000000000000000000015ec3ee7d893f200000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -8219,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec34000000000000000000000000f9981f4cb68bcc98e7e3ebd28e80cd30661e111c000000000000000000000000f9981f4cb68bcc98e7e3ebd28e80cd30661e111c0000000000000000000000000000000000000000000000000083740cd93a448000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -8220,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec340000000000000000000000004324a7c9679dbdf26ea2f98a0c1545cab2a9d9350000000000000000000000004324a7c9679dbdf26ea2f98a0c1545cab2a9d935000000000000000000000000000000000000000000000000004ae7772bffae6900000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -8221,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec3400000000000000000000000096e76dacbbcbad74b82bb893bf3e8bf4b7b06c9f00000000000000000000000096e76dacbbcbad74b82bb893bf3e8bf4b7b06c9f000000000000000000000000000000000000000000000000003b57276d8144cb00000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -8227,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec34000000000000000000000000d31600bf70eb4d5921247ff3931176ea81566e5d000000000000000000000000d31600bf70eb4d5921247ff3931176ea81566e5d000000000000000000000000000000000000000000000000008e1bc9bf04000000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -8231,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec34000000000000000000000000b4bcde3ccfe072892aebbba1f0532bcc37043a1a000000000000000000000000b4bcde3ccfe072892aebbba1f0532bcc37043a1a00000000000000000000000000000000000000000000000000038d7ea4c6800000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -8233,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec34000000000000000000000000cc713097f3e7ffcbb4e60e4f4efee4a0ae8af234000000000000000000000000cc713097f3e7ffcbb4e60e4f4efee4a0ae8af23400000000000000000000000000000000000000000000000000c502ac76ef29ab00000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -8234,0x10e6593cdda8c58a1d0f14c5164b376352a55f2f,0x467194771dae2967aef3ecbedd3bf9a310c76c65,0xa9f9e6750000000000000000000000006b175474e89094c44da98b954eedeac495271d0f000000000000000000000000da10009cbd5d07dd0cecc66161fc93d7c9000da1000000000000000000000000a00a4135c45a9cce73688b5660b2d018e1aac3d2000000000000000000000000a00a4135c45a9cce73688b5660b2d018e1aac3d2000000000000000000000000000000000000000000000003bea23e9421de4dfc00000000000000000000000000000000000000000000000000000000000000c00000000000000000000000000000000000000000000000000000000000000000,,,1,true -8235,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec3400000000000000000000000080f715be0f5516501bb49bfda53975bdcb7e3c1b00000000000000000000000080f715be0f5516501bb49bfda53975bdcb7e3c1b00000000000000000000000000000000000000000000000000c7483ca2561bae00000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -8236,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec340000000000000000000000002b8625b05db41aff7f66ce7a540745b941078e400000000000000000000000002b8625b05db41aff7f66ce7a540745b941078e40000000000000000000000000000000000000000000000000010a0d78c3b0e76300000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -8237,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec3400000000000000000000000012b81e4275fbd5834320252841949f6973b405f900000000000000000000000012b81e4275fbd5834320252841949f6973b405f9000000000000000000000000000000000000000000000000014979f2c190c7c800000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -8238,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec3400000000000000000000000093d154116d1d9bb5080e9f0e919d71e2690ab8a200000000000000000000000093d154116d1d9bb5080e9f0e919d71e2690ab8a200000000000000000000000000000000000000000000000000a2348402c60d4900000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -8239,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec3400000000000000000000000080f715be0f5516501bb49bfda53975bdcb7e3c1b00000000000000000000000080f715be0f5516501bb49bfda53975bdcb7e3c1b000000000000000000000000000000000000000000000000003e67e7fee81fe600000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -8240,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec34000000000000000000000000513989e0ab20f597145600e837d05b4aa96b4e8e000000000000000000000000513989e0ab20f597145600e837d05b4aa96b4e8e00000000000000000000000000000000000000000000000000287559223283b300000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -8241,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec34000000000000000000000000041c1e0d927248d5d3341041c416a6f8fa894faf000000000000000000000000041c1e0d927248d5d3341041c416a6f8fa894faf000000000000000000000000000000000000000000000000014d57d62293301000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -8243,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec34000000000000000000000000053858909e782b7af40d7ae8673c140aa0bb4751000000000000000000000000053858909e782b7af40d7ae8673c140aa0bb47510000000000000000000000000000000000000000000000000147a6baa4dbdf4300000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -8244,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec3400000000000000000000000070b0fbd3176d5a0871fae1325dbe5657e1607bb000000000000000000000000070b0fbd3176d5a0871fae1325dbe5657e1607bb0000000000000000000000000000000000000000000000000014b0e141307a6f800000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -8245,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec34000000000000000000000000e969ef6523502ec36917bc925ef1b729c6d4e9c3000000000000000000000000e969ef6523502ec36917bc925ef1b729c6d4e9c3000000000000000000000000000000000000000000000000004902a6f5571b5d00000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -8246,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec3400000000000000000000000097812657db486589c1b2171b19ef9045e14c69ea00000000000000000000000097812657db486589c1b2171b19ef9045e14c69ea00000000000000000000000000000000000000000000000000038d7ea4c6800000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -8247,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec3400000000000000000000000088f6872cf20351bb46a2c3ec7863c9541327774e00000000000000000000000088f6872cf20351bb46a2c3ec7863c9541327774e000000000000000000000000000000000000000000000000014a288c3cf3c35d00000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -8250,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec34000000000000000000000000d2ff32278bd611168c3798682fe90bb20dc825e1000000000000000000000000d2ff32278bd611168c3798682fe90bb20dc825e1000000000000000000000000000000000000000000000000014dccbf9ba71d3900000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -8251,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec340000000000000000000000000fe8f8ce0c13f826e1a17383524dba614d4c399e0000000000000000000000000fe8f8ce0c13f826e1a17383524dba614d4c399e000000000000000000000000000000000000000000000000014c088c2d3f986700000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -8252,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec34000000000000000000000000b96a958a82ecabab9e7cf14ae538c38996f2c7b6000000000000000000000000b96a958a82ecabab9e7cf14ae538c38996f2c7b600000000000000000000000000000000000000000000000000038d7ea4c6800000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -8253,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec3400000000000000000000000009628d07ab4cabe66400f6a627732b4c11ab057500000000000000000000000009628d07ab4cabe66400f6a627732b4c11ab057500000000000000000000000000000000000000000000000000071afd498d000000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -8254,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec340000000000000000000000002ef6c440ca6f7dfe8f87bb9c0df4f7d58112e12b0000000000000000000000002ef6c440ca6f7dfe8f87bb9c0df4f7d58112e12b00000000000000000000000000000000000000000000000001464b9b6dc4bea400000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -8255,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec3400000000000000000000000016ea30ba1a15fc03ba3b563bf6312d5813f2e3c200000000000000000000000016ea30ba1a15fc03ba3b563bf6312d5813f2e3c200000000000000000000000000000000000000000000000001421bc5c811427200000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -8256,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec34000000000000000000000000899929b4e35a1e29b940ab41ab278a41a6a4947d000000000000000000000000899929b4e35a1e29b940ab41ab278a41a6a4947d000000000000000000000000000000000000000000000000013d477c079f254600000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -8257,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec34000000000000000000000000c6fe2689141ebe625dcb91b7d9be8fad54099d25000000000000000000000000c6fe2689141ebe625dcb91b7d9be8fad54099d2500000000000000000000000000000000000000000000000001419f6dc5b6d03a00000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -8258,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec34000000000000000000000000a03a90eb2910debbb3fbda9568e2f5a9e0bbd92f000000000000000000000000a03a90eb2910debbb3fbda9568e2f5a9e0bbd92f000000000000000000000000000000000000000000000000014790098f1baf8000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -8259,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec340000000000000000000000003d917e96568ac609a86c7c1578911c31d197bb5f0000000000000000000000003d917e96568ac609a86c7c1578911c31d197bb5f00000000000000000000000000000000000000000000000001450c4554847bc500000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -8260,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec340000000000000000000000003bab2479b992440e597dc69363b9bec012811a7c0000000000000000000000003bab2479b992440e597dc69363b9bec012811a7c0000000000000000000000000000000000000000000000000149547b2040316c00000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -8261,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec34000000000000000000000000bba974083e667ad7a9809cc378ca1fd9c3341eb8000000000000000000000000bba974083e667ad7a9809cc378ca1fd9c3341eb80000000000000000000000000000000000000000000000000148dec4fb08529000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -8262,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec340000000000000000000000004eff6050c03742c0ec10bdf483bc1f2ab8479bd20000000000000000000000004eff6050c03742c0ec10bdf483bc1f2ab8479bd200000000000000000000000000000000000000000000000000a8f5875375a84500000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -8263,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec340000000000000000000000004c3f445d067442b439056fd1a118a4c1dcc7d7d60000000000000000000000004c3f445d067442b439056fd1a118a4c1dcc7d7d600000000000000000000000000000000000000000000000001f161421c8e000000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -8264,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec34000000000000000000000000570f9e457463d263560c76ecc9e41d16a5a25373000000000000000000000000570f9e457463d263560c76ecc9e41d16a5a25373000000000000000000000000000000000000000000000000008e1bc9bf04000000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -8266,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec34000000000000000000000000e8c0fe3699db673486c391a4eefa5a18c7cfd4d6000000000000000000000000e8c0fe3699db673486c391a4eefa5a18c7cfd4d600000000000000000000000000000000000000000000000000654d79c491140000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,0xcf1a901e0c9f629cd75c4317121a51cef9f95f25d1c5e852cd44fbb82892849b,2022-03-22 14:43:39.000 UTC,0,true -8267,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec34000000000000000000000000ac8dec6722d5fe329f93377978c1e661a6c021e8000000000000000000000000ac8dec6722d5fe329f93377978c1e661a6c021e8000000000000000000000000000000000000000000000000023557e4531ba00000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -8268,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec3400000000000000000000000000a67ff33dcc411fa327f752cbcd8dd63acb0f6c00000000000000000000000000a67ff33dcc411fa327f752cbcd8dd63acb0f6c000000000000000000000000000000000000000000000000007aa5d83964068500000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -8269,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec34000000000000000000000000ef56c8d320ebf6b79e3cb7e3e098dc01ce186a0d000000000000000000000000ef56c8d320ebf6b79e3cb7e3e098dc01ce186a0d000000000000000000000000000000000000000000000000001a42c745d52a0000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -8270,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec340000000000000000000000007372a7934b86c2015721af1367bbce24e5fa17b20000000000000000000000007372a7934b86c2015721af1367bbce24e5fa17b20000000000000000000000000000000000000000000000000065c916f1dc820000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -8272,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec34000000000000000000000000a017279b02e3b92f252cf7239bdc2a5f7fe6223e000000000000000000000000a017279b02e3b92f252cf7239bdc2a5f7fe6223e000000000000000000000000000000000000000000000000007dcc775f2541df00000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -8273,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec340000000000000000000000008d38c3879cb3ddab7cab997f27345bd7aad860680000000000000000000000008d38c3879cb3ddab7cab997f27345bd7aad86068000000000000000000000000000000000000000000000000003aff271232df2600000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -8275,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec3400000000000000000000000039338033df3b80ed5fa78780bf4f4ba175f23b2600000000000000000000000039338033df3b80ed5fa78780bf4f4ba175f23b26000000000000000000000000000000000000000000000000003b990c903fa17600000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -8276,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec34000000000000000000000000144c94ad5bb9d7c8b59c60cc5f5b0b984ff71a53000000000000000000000000144c94ad5bb9d7c8b59c60cc5f5b0b984ff71a530000000000000000000000000000000000000000000000000003d092431e650000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -8277,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec340000000000000000000000008676c970dd185479ae889bcea18b84201bad57ce0000000000000000000000008676c970dd185479ae889bcea18b84201bad57ce00000000000000000000000000000000000000000000000000038d7ea4c6800000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -8279,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec340000000000000000000000004b18d92b4c88e8e0a718a9ea8d1271e5277e6e100000000000000000000000004b18d92b4c88e8e0a718a9ea8d1271e5277e6e1000000000000000000000000000000000000000000000000001339a771575d18000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -8281,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec340000000000000000000000006d3c85f7d2e8222d4a0f6df4b76a9911f3e4bcdc0000000000000000000000006d3c85f7d2e8222d4a0f6df4b76a9911f3e4bcdc00000000000000000000000000000000000000000000000000071afd498d000000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -8283,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec3400000000000000000000000021503af4d1c8e71ce2a575e57376e5f60dac152900000000000000000000000021503af4d1c8e71ce2a575e57376e5f60dac15290000000000000000000000000000000000000000000000000001313dd0a5bf0000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -8284,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec3400000000000000000000000011ff5d408f6aa0366620f2833b4cd35603c08eeb00000000000000000000000011ff5d408f6aa0366620f2833b4cd35603c08eeb00000000000000000000000000000000000000000000000000128aeb18cb199400000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -8287,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec340000000000000000000000006b0e455abf6736380f6ca69d0ac0d81163ebb8cc0000000000000000000000006b0e455abf6736380f6ca69d0ac0d81163ebb8cc000000000000000000000000000000000000000000000000002386f26fc1000000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -8288,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec340000000000000000000000008e44b4f50210126d44b5a601f551dc5d6af14e3f0000000000000000000000008e44b4f50210126d44b5a601f551dc5d6af14e3f00000000000000000000000000000000000000000000000000a323b2ad5d677900000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -8293,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec34000000000000000000000000dc3b00a6548fbf13293cb47910ded9cd275765b9000000000000000000000000dc3b00a6548fbf13293cb47910ded9cd275765b9000000000000000000000000000000000000000000000000002aa1efb94e000000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -8294,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec340000000000000000000000004c3f445d067442b439056fd1a118a4c1dcc7d7d60000000000000000000000004c3f445d067442b439056fd1a118a4c1dcc7d7d6000000000000000000000000000000000000000000000000003f086f2a02f40000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -8295,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec340000000000000000000000002cd75b057dc88ea5c5bd7f9396507712481066b50000000000000000000000002cd75b057dc88ea5c5bd7f9396507712481066b500000000000000000000000000000000000000000000000000005af3107a400000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -8298,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec340000000000000000000000002cd75b057dc88ea5c5bd7f9396507712481066b50000000000000000000000002cd75b057dc88ea5c5bd7f9396507712481066b5000000000000000000000000000000000000000000000000001bb1391c3365cb00000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -8299,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0xa9f9e67500000000000000000000000057ab1ec28d129707052df4df418d58a2d46d5f510000000000000000000000008c6f28f2f1a3c87f0f938b96d27520d9751ec8d90000000000000000000000000b7c43af43d76f79b6f6cfbafb3a01dde04682250000000000000000000000000b7c43af43d76f79b6f6cfbafb3a01dde04682250000000000000000000000000000000000000000000000000de0b6b3a764000000000000000000000000000000000000000000000000000000000000000000c00000000000000000000000000000000000000000000000000000000000000000,,,1,true -8303,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec34000000000000000000000000c7f12307ee6002f7fd2aa6c10b9e8cfcc67b0bf9000000000000000000000000c7f12307ee6002f7fd2aa6c10b9e8cfcc67b0bf9000000000000000000000000000000000000000000000000001550f7dca7000000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -8304,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec34000000000000000000000000ef731d11c5076b983857815f99daf612c46f030b000000000000000000000000ef731d11c5076b983857815f99daf612c46f030b0000000000000000000000000000000000000000000000000030ec16cdaa3ef000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -8305,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec34000000000000000000000000c1f897e2311bfc2af1f42bf87fe4e1cbfd23e4ac000000000000000000000000c1f897e2311bfc2af1f42bf87fe4e1cbfd23e4ac000000000000000000000000000000000000000000000000000c32db4908686700000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -8306,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec3400000000000000000000000002c7867c3beffdbc1dbaaa15e8a711f183f9d8d900000000000000000000000002c7867c3beffdbc1dbaaa15e8a711f183f9d8d9000000000000000000000000000000000000000000000000000aa87bee53800000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -8307,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec34000000000000000000000000fa3ce4b82cc4dd303104b5c43eecf72871d31632000000000000000000000000fa3ce4b82cc4dd303104b5c43eecf72871d316320000000000000000000000000000000000000000000000000011ca37adaee3b000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -8308,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec340000000000000000000000007737c517986e8030610c31a9686d04a63f6ef5560000000000000000000000007737c517986e8030610c31a9686d04a63f6ef55600000000000000000000000000000000000000000000000000095a655d3dfb2400000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -8309,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec3400000000000000000000000076766ce199954d2dc52e14577e2434ed00fb4bb000000000000000000000000076766ce199954d2dc52e14577e2434ed00fb4bb000000000000000000000000000000000000000000000000000ebc1a185edce7800000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -8310,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec340000000000000000000000005cf968f202abb9f97063c5ce1a0ed07ff2f3e6280000000000000000000000005cf968f202abb9f97063c5ce1a0ed07ff2f3e628000000000000000000000000000000000000000000000000003fec7cd071f38000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -8311,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec34000000000000000000000000192cdfc4edf00fb06c888bc25aae8acbe8d7fa7e000000000000000000000000192cdfc4edf00fb06c888bc25aae8acbe8d7fa7e00000000000000000000000000000000000000000000000000071afd498d000000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -8312,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec34000000000000000000000000781cdc81cc8a315433bdc1c581a649c4c0d61ee7000000000000000000000000781cdc81cc8a315433bdc1c581a649c4c0d61ee700000000000000000000000000000000000000000000000004d7eb18333f255900000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -8313,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec3400000000000000000000000019ca3875c04e64cdc097759225452ad3982fbc4500000000000000000000000019ca3875c04e64cdc097759225452ad3982fbc4500000000000000000000000000000000000000000000000000b6a90f8921696500000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -8316,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec34000000000000000000000000349ea0b723e3692a2ddcc0ae5cc85640f372ffd1000000000000000000000000349ea0b723e3692a2ddcc0ae5cc85640f372ffd1000000000000000000000000000000000000000000000000003b93918f5c881300000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -8317,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec3400000000000000000000000047b2efa18736c6c211505aefd321bec3ac3e877900000000000000000000000047b2efa18736c6c211505aefd321bec3ac3e877900000000000000000000000000000000000000000000000000eaf5fc44be8ae400000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,0x06710b719473e4197fe2bbd00253d172ee3dd13d766cb928e18cd30b1d4914f3,2022-02-06 15:12:38.000 UTC,0,true -8318,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec340000000000000000000000004af48abe68f94e32d03dd6dfeb2e73281f479c800000000000000000000000004af48abe68f94e32d03dd6dfeb2e73281f479c80000000000000000000000000000000000000000000000000001f36400ecaaa0000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -8319,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec34000000000000000000000000a353b568cf88770d9627b27082851de0e58347ea000000000000000000000000a353b568cf88770d9627b27082851de0e58347ea0000000000000000000000000000000000000000000000000b405adfc274e1b000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -8320,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec3400000000000000000000000057768da7994d07d56e1f348e48e1bf8fd4b9934500000000000000000000000057768da7994d07d56e1f348e48e1bf8fd4b9934500000000000000000000000000000000000000000000000000a57d470dedb81400000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -8321,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec34000000000000000000000000ce2f3600d79ea3608feb1ea0f51a88bfc7d485c7000000000000000000000000ce2f3600d79ea3608feb1ea0f51a88bfc7d485c700000000000000000000000000000000000000000000000000071afd498d000000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,0x2e98534267738a3f1cef3a8bdf004004f18dd896883a8cbb90b18e463c4a9995,2022-03-08 15:03:16.000 UTC,0,true -8324,0xcd9d4988c0ae61887b075ba77f08cbfad2b65068,0x3f87ff1de58128ef8fcb4c807efd776e1ac72e51,0xf4f7b41a00000000000000000000000000efa5c7ba17a797a867820ffd51b890125bda360000000000000000000000000000000000000000000000003782dace9d900000,,,1,true -8326,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec340000000000000000000000009181256f04ba5fbc3381354832cdab22e60918b50000000000000000000000009181256f04ba5fbc3381354832cdab22e60918b500000000000000000000000000000000000000000000000000038d7ea4c6800000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -8327,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec34000000000000000000000000bc9a0bcb451329a5c30b4dfbbf96024588521053000000000000000000000000bc9a0bcb451329a5c30b4dfbbf96024588521053000000000000000000000000000000000000000000000000003ff2e795f5000000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -8328,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec34000000000000000000000000383e96959e6c1dc55885f5437e8a01a41f5dc5a9000000000000000000000000383e96959e6c1dc55885f5437e8a01a41f5dc5a900000000000000000000000000000000000000000000000000038d7ea4c6800000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -8330,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec3400000000000000000000000049df5d7e42cc8c0bbb6f54f132bc07f8e5e046f700000000000000000000000049df5d7e42cc8c0bbb6f54f132bc07f8e5e046f7000000000000000000000000000000000000000000000000002af758bd01288000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -8333,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec3400000000000000000000000028e452555f12e461c6b21588efed281b22e7c97f00000000000000000000000028e452555f12e461c6b21588efed281b22e7c97f00000000000000000000000000000000000000000000000000470de4df82000000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -8335,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0xa9f9e67500000000000000000000000003ab458634910aad20ef5f1c8ee96f1d6ac549190000000000000000000000007fb688ccf682d58f86d7e38e03f9d22e7705448b00000000000000000000000083437112034414883ee20b3a2f98d0cd9e53b45b00000000000000000000000083437112034414883ee20b3a2f98d0cd9e53b45b000000000000000000000000000000000000000000000000984a439f1afe227800000000000000000000000000000000000000000000000000000000000000c00000000000000000000000000000000000000000000000000000000000000000,,,1,true -8336,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec34000000000000000000000000b814bc7e97996e341157f43e711faebe32b81a75000000000000000000000000b814bc7e97996e341157f43e711faebe32b81a750000000000000000000000000000000000000000000000000245168ed4d6df6200000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -8337,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec340000000000000000000000009086226729f6cc36ab626d8e341cbec912d21b7c0000000000000000000000009086226729f6cc36ab626d8e341cbec912d21b7c00000000000000000000000000000000000000000000000000f88290bacc56e300000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -8338,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec3400000000000000000000000051e6e2df45186fd18e11e76b487552cb80a8de6800000000000000000000000051e6e2df45186fd18e11e76b487552cb80a8de6800000000000000000000000000000000000000000000000000e6b9d33ecfd52d00000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -8339,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec34000000000000000000000000616964aa4652812da73a8ca0cd9b1f0fac5b49e5000000000000000000000000616964aa4652812da73a8ca0cd9b1f0fac5b49e5000000000000000000000000000000000000000000000000027f7d0bdb92000000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,0x222a3984e54eec86ae9b7faac0d10cd383b31fd15334cd870c0d30bb7f79bfb5,2021-12-06 15:10:08.000 UTC,0,true -8340,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec340000000000000000000000005af12635675427ea85358ac42b8550027b10f4910000000000000000000000005af12635675427ea85358ac42b8550027b10f491000000000000000000000000000000000000000000000000000e35fa931a000000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -8342,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec3400000000000000000000000008315fa4d626aafb8f170270f7692d685d6646c000000000000000000000000008315fa4d626aafb8f170270f7692d685d6646c0000000000000000000000000000000000000000000000000007b6ff547b2b42e00000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -8343,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec3400000000000000000000000079904d39117d5fec74ce78ef08ba0e90e426e8d300000000000000000000000079904d39117d5fec74ce78ef08ba0e90e426e8d300000000000000000000000000000000000000000000000000423ec11d8695a500000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -8347,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec34000000000000000000000000232b26c22d14428b20f9885a1ec0a9567ef9f080000000000000000000000000232b26c22d14428b20f9885a1ec0a9567ef9f080000000000000000000000000000000000000000000000000008998b5b003410b00000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -8349,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec34000000000000000000000000ab04c70d86143193990371d691995325ecbed717000000000000000000000000ab04c70d86143193990371d691995325ecbed7170000000000000000000000000000000000000000000000000082e1056b0a444200000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -8351,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec340000000000000000000000006da3e90a3aeb11353e54c4830a7903947e519bfc0000000000000000000000006da3e90a3aeb11353e54c4830a7903947e519bfc00000000000000000000000000000000000000000000000004011bb1b087312b00000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -8354,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec340000000000000000000000003108f1ffc15716ad537e039d4e33deb221f4982d0000000000000000000000003108f1ffc15716ad537e039d4e33deb221f4982d00000000000000000000000000000000000000000000000000c48541ff0dbe9000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -8355,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec34000000000000000000000000fd6972254906c2ccd4c325f67dcc1a2ebc80652b000000000000000000000000fd6972254906c2ccd4c325f67dcc1a2ebc80652b00000000000000000000000000000000000000000000000001e0fd0dbcf1660a00000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -8356,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec340000000000000000000000000f7de8cd5e0fd700af34c5d5ff214b0aca5c49d70000000000000000000000000f7de8cd5e0fd700af34c5d5ff214b0aca5c49d7000000000000000000000000000000000000000000000000015c31c4c1ea0a0000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -8357,0xcd9d4988c0ae61887b075ba77f08cbfad2b65068,0x3f87ff1de58128ef8fcb4c807efd776e1ac72e51,0xf4f7b41a00000000000000000000000083d420a602b5cd560ac5fa9bbca0d5e91e4cb9750000000000000000000000000000000000000000000000036bc7cbd7666adda4,,,1,true -8358,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec340000000000000000000000002fb4aaa9c305f9888d1131325259a31378fa36ab0000000000000000000000002fb4aaa9c305f9888d1131325259a31378fa36ab00000000000000000000000000000000000000000000000000d8d7be4dec417300000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -8360,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec34000000000000000000000000eb6c46c494f6468cfb7b02d708cc17589662ee53000000000000000000000000eb6c46c494f6468cfb7b02d708cc17589662ee53000000000000000000000000000000000000000000000000000d1ea736c19fb400000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -8362,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec340000000000000000000000006d4b09c164cd54aef6c5cbafba305bb162b98c490000000000000000000000006d4b09c164cd54aef6c5cbafba305bb162b98c4900000000000000000000000000000000000000000000000004005e72322d2e8600000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -8363,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec34000000000000000000000000e68055d6d79498ee3f90ebf1a8301094a25a38e0000000000000000000000000e68055d6d79498ee3f90ebf1a8301094a25a38e0000000000000000000000000000000000000000000000000009f678b05d4a6ad00000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -8364,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec34000000000000000000000000b8d1b13e56d1a680ee306364628cdc07a4be8072000000000000000000000000b8d1b13e56d1a680ee306364628cdc07a4be8072000000000000000000000000000000000000000000000000009f678b05d4a6ad00000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -8365,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec340000000000000000000000003777786a1717a93bf950d16d4e6c0faa35995eff0000000000000000000000003777786a1717a93bf950d16d4e6c0faa35995eff000000000000000000000000000000000000000000000000009f678b05d4a6ad00000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -8366,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec34000000000000000000000000274fa9f7bbc8a1bb4cd8bf33c6c23e3f36fc2502000000000000000000000000274fa9f7bbc8a1bb4cd8bf33c6c23e3f36fc2502000000000000000000000000000000000000000000000000009f678b05d4a6ad00000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -8367,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec3400000000000000000000000074af1733a7cefdfa34fd028e8b7aee68a1c76c8300000000000000000000000074af1733a7cefdfa34fd028e8b7aee68a1c76c83000000000000000000000000000000000000000000000000009f678b05d4a6ad00000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -8368,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec34000000000000000000000000d89c351b97dff632a38ff10265ee0d74f4573b20000000000000000000000000d89c351b97dff632a38ff10265ee0d74f4573b20000000000000000000000000000000000000000000000000009f678b05d4a6ad00000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -8370,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec34000000000000000000000000c869639d0c999f8cd29a87cd7cc0b93de0c10e88000000000000000000000000c869639d0c999f8cd29a87cd7cc0b93de0c10e88000000000000000000000000000000000000000000000000008afb2401777acb00000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -8371,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec34000000000000000000000000905777492201f8cc36e2b5981df9fc532023b7d7000000000000000000000000905777492201f8cc36e2b5981df9fc532023b7d700000000000000000000000000000000000000000000000000929e8a2a2fb67800000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -8372,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec340000000000000000000000003c002ddf1bdd3878c6b1c93c2a215158d24fbfdb0000000000000000000000003c002ddf1bdd3878c6b1c93c2a215158d24fbfdb000000000000000000000000000000000000000000000000008fce5515a65eb600000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -8373,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec340000000000000000000000004a57d88e37658471f64eb906835cd634cb2181e80000000000000000000000004a57d88e37658471f64eb906835cd634cb2181e800000000000000000000000000000000000000000000000000964e3c48c11a1400000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -8375,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec34000000000000000000000000a384da004bba6297921c8d684cfe6102e4737647000000000000000000000000a384da004bba6297921c8d684cfe6102e4737647000000000000000000000000000000000000000000000000009813359878059900000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -8376,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec34000000000000000000000000015438e55fd7558576369c0cab84e6a96b70e430000000000000000000000000015438e55fd7558576369c0cab84e6a96b70e4300000000000000000000000000000000000000000000000000098908391377eea00000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -8377,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec34000000000000000000000000fd31cb624261d7c4626d103c5cee441add892ade000000000000000000000000fd31cb624261d7c4626d103c5cee441add892ade000000000000000000000000000000000000000000000000009b001906f4436e00000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -8378,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec340000000000000000000000006416e7c281a55e76973546c9d3175f69fd4a8aeb0000000000000000000000006416e7c281a55e76973546c9d3175f69fd4a8aeb00000000000000000000000000000000000000000000000000969752b302c9e000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -8379,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec3400000000000000000000000039140487e6b09d073e3c859039a9088a11cf1ae600000000000000000000000039140487e6b09d073e3c859039a9088a11cf1ae600000000000000000000000000000000000000000000000000aba5959db3360000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -8380,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec340000000000000000000000007ae344fd27bd50cdcd807bccecf747c8218dc30d0000000000000000000000007ae344fd27bd50cdcd807bccecf747c8218dc30d000000000000000000000000000000000000000000000000009c797429c5288800000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -8381,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec34000000000000000000000000606f62cdb593a03dc158e39fa06c5c1c12c730d9000000000000000000000000606f62cdb593a03dc158e39fa06c5c1c12c730d9000000000000000000000000000000000000000000000000009ccc69c688c73800000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -8382,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec3400000000000000000000000081e11c21016dd61c94c9a9d4251dd9702bbf770300000000000000000000000081e11c21016dd61c94c9a9d4251dd9702bbf770300000000000000000000000000000000000000000000000000975e5e01ff4a7000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -8383,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec3400000000000000000000000078a613d8c147e3c1a9b9b103410260d82ec4ca4800000000000000000000000078a613d8c147e3c1a9b9b103410260d82ec4ca48000000000000000000000000000000000000000000000000009d6b7be496935d00000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -8384,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec3400000000000000000000000046f6abf7566711db611a79162bb587a1d8a319fa00000000000000000000000046f6abf7566711db611a79162bb587a1d8a319fa000000000000000000000000000000000000000000000000009dd76536c8181b00000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -8385,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec34000000000000000000000000dcd695bb523fd1ef04f0a17f8cc0f7b270759adf000000000000000000000000dcd695bb523fd1ef04f0a17f8cc0f7b270759adf000000000000000000000000000000000000000000000000009d81db750823f200000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -8386,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec3400000000000000000000000064176d54674c06414a9e3dffb5d1857ecb97044900000000000000000000000064176d54674c06414a9e3dffb5d1857ecb970449000000000000000000000000000000000000000000000000009d81db750823f200000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -8387,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec34000000000000000000000000664d72a63847339b5e7d76a1ffb3656d465042c6000000000000000000000000664d72a63847339b5e7d76a1ffb3656d465042c600000000000000000000000000000000000000000000000000a0aa48e7cc8ab500000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -8388,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec340000000000000000000000000f35693a104ba7fad7ac91530cfb0625c9fbae240000000000000000000000000f35693a104ba7fad7ac91530cfb0625c9fbae24000000000000000000000000000000000000000000000000009ed58cf833830c00000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -8389,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec340000000000000000000000007321723c2e19cd27190dcfb888abd44fd6627d4e0000000000000000000000007321723c2e19cd27190dcfb888abd44fd6627d4e000000000000000000000000000000000000000000000000009a83943cf6d01700000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -8390,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec3400000000000000000000000030c4af4fa29e0d3c7b840d55b6db4646d52b23e700000000000000000000000030c4af4fa29e0d3c7b840d55b6db4646d52b23e7000000000000000000000000000000000000000000000000009ccef6c1cfb4ff00000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -8391,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec3400000000000000000000000099ae174133946e7ea01cba09555069f0a67b9b6100000000000000000000000099ae174133946e7ea01cba09555069f0a67b9b61000000000000000000000000000000000000000000000000009d8b9b7f575ec800000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -8392,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec34000000000000000000000000863ce1bf06fe1a066310d4e5aea3f11bd2473675000000000000000000000000863ce1bf06fe1a066310d4e5aea3f11bd2473675000000000000000000000000000000000000000000000000009d88419d16bce000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -8393,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec3400000000000000000000000004235dd69859c58fa0ebdd7b5e6df255a24a5bc700000000000000000000000004235dd69859c58fa0ebdd7b5e6df255a24a5bc7000000000000000000000000000000000000000000000000009d7613e49c9c8200000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -8394,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec34000000000000000000000000e4c03e75b92f7e07a15376850a4cae9f9e1b1803000000000000000000000000e4c03e75b92f7e07a15376850a4cae9f9e1b1803000000000000000000000000000000000000000000000000009e5481dd89aec900000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -8395,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec34000000000000000000000000c6dde5e70c254c141caa6b1b00f171fc1178c9f6000000000000000000000000c6dde5e70c254c141caa6b1b00f171fc1178c9f6000000000000000000000000000000000000000000000000009e275fd1f575e000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -8396,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec34000000000000000000000000bd31b1775610896ea9e1dd2ab40ab16c7d03c29b000000000000000000000000bd31b1775610896ea9e1dd2ab40ab16c7d03c29b000000000000000000000000000000000000000000000000009f55b0d202dbda00000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -8397,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec340000000000000000000000009dc97597e33ffbbf56f7304bcc520f855b49b55d0000000000000000000000009dc97597e33ffbbf56f7304bcc520f855b49b55d00000000000000000000000000000000000000000000000000a1717573d4e32a00000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -8398,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec3400000000000000000000000022e27e1997a4017643c273e4fa8552f885bd477400000000000000000000000022e27e1997a4017643c273e4fa8552f885bd477400000000000000000000000000000000000000000000000000a28ff7424894e300000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -8399,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec340000000000000000000000000a1efd1ce051d9be9f16d3452887c1a44a9b93780000000000000000000000000a1efd1ce051d9be9f16d3452887c1a44a9b937800000000000000000000000000000000000000000000000001978395190a630f00000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -8400,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec340000000000000000000000008874803a8040e343d60734d99689c1aa809c58c20000000000000000000000008874803a8040e343d60734d99689c1aa809c58c200000000000000000000000000000000000000000000000000a08a1adae03e7000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -8402,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec340000000000000000000000006f217c58af896247d18150ef76a5112e34a97be60000000000000000000000006f217c58af896247d18150ef76a5112e34a97be60000000000000000000000000000000000000000000000000058d15e1762800000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -8404,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec34000000000000000000000000c49a331ce7186b1e7294ed3a5a2af1e73b53a921000000000000000000000000c49a331ce7186b1e7294ed3a5a2af1e73b53a92100000000000000000000000000000000000000000000000000071afd498d000000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -8405,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec340000000000000000000000000d2537201050756a7e53da2006becfaa02727de50000000000000000000000000d2537201050756a7e53da2006becfaa02727de5000000000000000000000000000000000000000000000000003fe303e8a9fcd400000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -8406,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec34000000000000000000000000a8337a50441a3e5b2d187961e130b070bc9df09a000000000000000000000000a8337a50441a3e5b2d187961e130b070bc9df09a00000000000000000000000000000000000000000000000000413d86570bd6e400000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -8407,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec34000000000000000000000000783db0d30e2ce47b9ef9eaee9e32a6caef8022f4000000000000000000000000783db0d30e2ce47b9ef9eaee9e32a6caef8022f40000000000000000000000000000000000000000000000000004536a4212a6c000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -8408,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec34000000000000000000000000270815659d4f6ecd770546c161f9b7a929d31877000000000000000000000000270815659d4f6ecd770546c161f9b7a929d318770000000000000000000000000000000000000000000000000013bc3e39ba300000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -8409,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec3400000000000000000000000020344897c84492526169005a77e5c31277362edb00000000000000000000000020344897c84492526169005a77e5c31277362edb000000000000000000000000000000000000000000000000003ee4f362f7cd0d00000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -8410,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec34000000000000000000000000ec3b481c482e92850edf554a3ad5bcd89e15c662000000000000000000000000ec3b481c482e92850edf554a3ad5bcd89e15c66200000000000000000000000000000000000000000000000000038d7ea4c6800000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -8411,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec34000000000000000000000000a02f48636a3a71d4c9e4377c562fd2e90f9485ae000000000000000000000000a02f48636a3a71d4c9e4377c562fd2e90f9485ae00000000000000000000000000000000000000000000000000028a64b14e777c00000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -8412,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec34000000000000000000000000abde762e8e7155b766200d291aeefb3cb96b8729000000000000000000000000abde762e8e7155b766200d291aeefb3cb96b87290000000000000000000000000000000000000000000000000002c337218e1ac000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -8413,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec340000000000000000000000007deff0333176bb6b998dc54f924bdc34f36e2f560000000000000000000000007deff0333176bb6b998dc54f924bdc34f36e2f560000000000000000000000000000000000000000000000000042eba2c376663900000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -8414,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec34000000000000000000000000c18776e78e4a5a295ab99d86912a36d38c11f3ef000000000000000000000000c18776e78e4a5a295ab99d86912a36d38c11f3ef0000000000000000000000000000000000000000000000000015abeaed21400000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -8415,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec340000000000000000000000000541bbdbdcb20462eab5c0abaeff1f75450223c70000000000000000000000000541bbdbdcb20462eab5c0abaeff1f75450223c7000000000000000000000000000000000000000000000000000221b262dd800000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -8416,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec34000000000000000000000000cc13514bc2b74b1886e7aff16645756436f2de82000000000000000000000000cc13514bc2b74b1886e7aff16645756436f2de8200000000000000000000000000000000000000000000000000038d7ea4c6800000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -8417,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec34000000000000000000000000cc13514bc2b74b1886e7aff16645756436f2de82000000000000000000000000cc13514bc2b74b1886e7aff16645756436f2de8200000000000000000000000000000000000000000000000000038d7ea4c6800000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -8418,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec34000000000000000000000000e194ceedda82ca630ff495911683937b6b0c5c48000000000000000000000000e194ceedda82ca630ff495911683937b6b0c5c48000000000000000000000000000000000000000000000000000419103e50cd8600000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -8419,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec34000000000000000000000000765a90ee3610330e76ae4d4010bf8abfef83ba2a000000000000000000000000765a90ee3610330e76ae4d4010bf8abfef83ba2a0000000000000000000000000000000000000000000000000005af3107a4000000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -8420,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec340000000000000000000000005ee97dbc9491f74f72a3f6e6e84eefd4d5873e8e0000000000000000000000005ee97dbc9491f74f72a3f6e6e84eefd4d5873e8e00000000000000000000000000000000000000000000000000005af3107a400000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -8421,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec34000000000000000000000000b379f5cf09ec93ef91162f79ecd37c32c60fb6d4000000000000000000000000b379f5cf09ec93ef91162f79ecd37c32c60fb6d400000000000000000000000000000000000000000000000000038d7ea4c6800000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -8422,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec34000000000000000000000000b59543592a4cf2c9cd89ae37a0ddf589b52ab4a1000000000000000000000000b59543592a4cf2c9cd89ae37a0ddf589b52ab4a100000000000000000000000000000000000000000000000000489d562cb25a9b00000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -8423,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec340000000000000000000000005ee97dbc9491f74f72a3f6e6e84eefd4d5873e8e0000000000000000000000005ee97dbc9491f74f72a3f6e6e84eefd4d5873e8e00000000000000000000000000000000000000000000000000038d7ea4c6800000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -8424,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec340000000000000000000000006f923918aa540eae6756e8b0be6e84003bbcebfe0000000000000000000000006f923918aa540eae6756e8b0be6e84003bbcebfe00000000000000000000000000000000000000000000000000005af3107a400000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -8425,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec34000000000000000000000000a913be969fd81224a9b7022c97ee52aabaa5d1ce000000000000000000000000a913be969fd81224a9b7022c97ee52aabaa5d1ce00000000000000000000000000000000000000000000000000071afd498d000000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -8426,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec34000000000000000000000000fce1fbc0b5dec54e400118dc40e6bf4d7c1d7b87000000000000000000000000fce1fbc0b5dec54e400118dc40e6bf4d7c1d7b8700000000000000000000000000000000000000000000000000aa87bee538000000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -8427,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec34000000000000000000000000156d07be5ce6cffadbe92f8171427c9bf71ffb94000000000000000000000000156d07be5ce6cffadbe92f8171427c9bf71ffb9400000000000000000000000000000000000000000000000000427a5fd37eaf6c00000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -8428,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec340000000000000000000000001876ac47bc2bcc8ccc70ff6e25206585e923923e0000000000000000000000001876ac47bc2bcc8ccc70ff6e25206585e923923e00000000000000000000000000000000000000000000000000005af3107a400000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -8429,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec34000000000000000000000000e605e60773ce0ee4f528159d237e80dce064331e000000000000000000000000e605e60773ce0ee4f528159d237e80dce064331e000000000000000000000000000000000000000000000000003c7b6a9e6b595200000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -8430,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec34000000000000000000000000fe489e78f1d3f8d076544ecc1242aacdb0fb6215000000000000000000000000fe489e78f1d3f8d076544ecc1242aacdb0fb621500000000000000000000000000000000000000000000000000005af3107a400000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -8431,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec340000000000000000000000009d3f616e9e9179a6e9922b2eeff37dc563981ce90000000000000000000000009d3f616e9e9179a6e9922b2eeff37dc563981ce900000000000000000000000000000000000000000000000000005af3107a400000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -8432,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec3400000000000000000000000092ca74bdb45f90b87770fbe3e1473df47a51b8d100000000000000000000000092ca74bdb45f90b87770fbe3e1473df47a51b8d100000000000000000000000000000000000000000000000000038d7ea4c6800000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -8433,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec340000000000000000000000004dc08221af9352f411d69648d960369d137332f00000000000000000000000004dc08221af9352f411d69648d960369d137332f000000000000000000000000000000000000000000000000000038d7ea4c6800000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -8434,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec340000000000000000000000000e0a2d1950a8f9552d91d234bda7df9327e333eb0000000000000000000000000e0a2d1950a8f9552d91d234bda7df9327e333eb00000000000000000000000000000000000000000000000000180fc32d2cb60000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -8435,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec34000000000000000000000000c515d7c837c9896399d0bfeb69e74dbff9e9925c000000000000000000000000c515d7c837c9896399d0bfeb69e74dbff9e9925c00000000000000000000000000000000000000000000000000005af3107a400000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -8436,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec340000000000000000000000001506942a580e61f3afd004fbdd94136bb4e5fefa0000000000000000000000001506942a580e61f3afd004fbdd94136bb4e5fefa00000000000000000000000000000000000000000000000000005af3107a400000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -8437,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec340000000000000000000000004a9aab3e6dbafb5c23c174066374778d957b45660000000000000000000000004a9aab3e6dbafb5c23c174066374778d957b456600000000000000000000000000000000000000000000000000005af3107a400000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -8438,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec34000000000000000000000000991f88662a8a9e071b4f963b006d88af5e2631bd000000000000000000000000991f88662a8a9e071b4f963b006d88af5e2631bd00000000000000000000000000000000000000000000000000005af3107a400000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -8439,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec34000000000000000000000000cc0faf8887cef250b2b692ae6cf2a710a79960be000000000000000000000000cc0faf8887cef250b2b692ae6cf2a710a79960be00000000000000000000000000000000000000000000000000005af3107a400000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -8440,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec340000000000000000000000002deb9bc20b0ee85156bd1b453f6ace54552c3e100000000000000000000000002deb9bc20b0ee85156bd1b453f6ace54552c3e1000000000000000000000000000000000000000000000000000005af3107a400000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -8441,0xcd9d4988c0ae61887b075ba77f08cbfad2b65068,0x3f87ff1de58128ef8fcb4c807efd776e1ac72e51,0xf4f7b41a0000000000000000000000002602cda64237b42a8c90c33bd7074edd1f4c07070000000000000000000000000000000000000000000000037c1b86be361fe9bc,0xd619b3b7749864d770ac06fcea4d19d72e6992a498c21bf501d228d8fc3aa08e,2022-02-08 09:49:55.000 UTC,0,true -8442,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec34000000000000000000000000068617ba9993be213696b3d2935c042a2a35dfb8000000000000000000000000068617ba9993be213696b3d2935c042a2a35dfb800000000000000000000000000000000000000000000000000005af3107a400000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -8443,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec34000000000000000000000000a93fe41bfb59f631b76810caf26ec6c013ed6b43000000000000000000000000a93fe41bfb59f631b76810caf26ec6c013ed6b43000000000000000000000000000000000000000000000000000238cc48d7b00000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -8444,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec34000000000000000000000000ebcdd05e56182063a0521556d71ba062576ceecc000000000000000000000000ebcdd05e56182063a0521556d71ba062576ceecc0000000000000000000000000000000000000000000000000042a143ee988ecb00000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -8445,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec3400000000000000000000000067ccdfeac464d9fa9bcafdeee13c928fa223181700000000000000000000000067ccdfeac464d9fa9bcafdeee13c928fa22318170000000000000000000000000000000000000000000000000001acbc5d8c100000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -8446,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec34000000000000000000000000519928fd018de695b5e39d3343404ceea2cf26f8000000000000000000000000519928fd018de695b5e39d3343404ceea2cf26f8000000000000000000000000000000000000000000000000000110d9316ec00000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -8447,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec340000000000000000000000008db89388fa485c6b85074140b865c946dc23f6520000000000000000000000008db89388fa485c6b85074140b865c946dc23f65200000000000000000000000000000000000000000000000000a23a161324da0000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -8448,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec340000000000000000000000003777ac398a53a27409f8caf284871b6a9dca1d710000000000000000000000003777ac398a53a27409f8caf284871b6a9dca1d71000000000000000000000000000000000000000000000000000221b262dd800000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -8449,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec34000000000000000000000000e8cd49bd45db93e80c995e9eea06106896aaf290000000000000000000000000e8cd49bd45db93e80c995e9eea06106896aaf29000000000000000000000000000000000000000000000000000eb4b34a72b008000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -8451,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec340000000000000000000000005bab8e08de34b1c00e07767f865a8b986474d4690000000000000000000000005bab8e08de34b1c00e07767f865a8b986474d4690000000000000000000000000000000000000000000000000049e487ab9a71c800000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -8452,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec3400000000000000000000000022f501feb15ef39026cc4eae6863f2423427a64e00000000000000000000000022f501feb15ef39026cc4eae6863f2423427a64e000000000000000000000000000000000000000000000000000252e68625c80000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -8459,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec34000000000000000000000000421cc7b6224accb6c12280e3b697c65d9d60ad70000000000000000000000000421cc7b6224accb6c12280e3b697c65d9d60ad7000000000000000000000000000000000000000000000000000120fca2831e1ec00000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -8460,0xcd9d4988c0ae61887b075ba77f08cbfad2b65068,0x3f87ff1de58128ef8fcb4c807efd776e1ac72e51,0xf4f7b41a000000000000000000000000d5fae9a76de0bf1063eee5d4ae05be77cb08e68a0000000000000000000000000000000000000000000000001d64e0ffd574af32,,,1,true -8461,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec34000000000000000000000000071d9d738d494d4a8e2de76f3df081c24a096fbe000000000000000000000000071d9d738d494d4a8e2de76f3df081c24a096fbe00000000000000000000000000000000000000000000000000038d7ea4c6800000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -8462,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0xa9f9e675000000000000000000000000dac17f958d2ee523a2206206994597c13d831ec700000000000000000000000094b008aa00579c1307b0ef2c499ad98a8ce58e58000000000000000000000000d061cbfcd7749558f635dea77428f83d15455f4f000000000000000000000000d061cbfcd7749558f635dea77428f83d15455f4f00000000000000000000000000000000000000000000000000000000001cfde000000000000000000000000000000000000000000000000000000000000000c00000000000000000000000000000000000000000000000000000000000000000,0x1c3a1f543319ade8b064fc581d339ea36ae33f9d6942b81e141eab90bfb09492,2022-05-07 05:56:39.000 UTC,0,true -8463,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec3400000000000000000000000022f501feb15ef39026cc4eae6863f2423427a64e00000000000000000000000022f501feb15ef39026cc4eae6863f2423427a64e00000000000000000000000000000000000000000000000000016bcc41e9000000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -8464,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec340000000000000000000000006ccec22598f81b2df2060b4803987d734ac79ea00000000000000000000000006ccec22598f81b2df2060b4803987d734ac79ea00000000000000000000000000000000000000000000000000001c6bf5263400000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -8465,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec340000000000000000000000009a515e8879d4e389da004a35aeffdc6fcc0608600000000000000000000000009a515e8879d4e389da004a35aeffdc6fcc06086000000000000000000000000000000000000000000000000000071afd498d000000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -8466,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec34000000000000000000000000184f35026bc65ae1116ce640b1d7751fde0c7cc8000000000000000000000000184f35026bc65ae1116ce640b1d7751fde0c7cc8000000000000000000000000000000000000000000000000000182890607900000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -8467,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec340000000000000000000000009a515e8879d4e389da004a35aeffdc6fcc0608600000000000000000000000009a515e8879d4e389da004a35aeffdc6fcc0608600000000000000000000000000000000000000000000000000000b5e620f4800000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -8468,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec340000000000000000000000003db125bed35332943fb9b7d74da6ed0dcde16d9f0000000000000000000000003db125bed35332943fb9b7d74da6ed0dcde16d9f0000000000000000000000000000000000000000000000000001d37af36a200000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -8469,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec340000000000000000000000009caf735c8c949e465a4f35c426e5ba50abb7a4870000000000000000000000009caf735c8c949e465a4f35c426e5ba50abb7a4870000000000000000000000000000000000000000000000000002d79883d2000000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -8470,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec340000000000000000000000003cf96cad02b1c82087f11aa7c892ff91109a34150000000000000000000000003cf96cad02b1c82087f11aa7c892ff91109a34150000000000000000000000000000000000000000000000000003328b944c400000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -8471,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec3400000000000000000000000067f53a7f020b545bb1ec501bd17b30d0202462c500000000000000000000000067f53a7f020b545bb1ec501bd17b30d0202462c5000000000000000000000000000000000000000000000000000110d9316ec00000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -8472,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec3400000000000000000000000053f338161f177268034c5d38f77679b72c1a284c00000000000000000000000053f338161f177268034c5d38f77679b72c1a284c0000000000000000000000000000000000000000000000000001d0d7bdf1d80000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -8473,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec340000000000000000000000001153b404e2d3f0dfaba51a74f89f404977225c9b0000000000000000000000001153b404e2d3f0dfaba51a74f89f404977225c9b000000000000000000000000000000000000000000000000000221b262dd800000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -8474,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec34000000000000000000000000e62fca375844029c7ecf251a3f6320329b84e4ad000000000000000000000000e62fca375844029c7ecf251a3f6320329b84e4ad00000000000000000000000000000000000000000000000000030b6fdc92900000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -8475,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec340000000000000000000000003475dca1b35e709328e94344882bf56c023db0fc0000000000000000000000003475dca1b35e709328e94344882bf56c023db0fc00000000000000000000000000000000000000000000000002a303fe4b53000000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -8476,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec340000000000000000000000009f886192d5c6f3c8e4478b1a0bde79ba3a68bb4f0000000000000000000000009f886192d5c6f3c8e4478b1a0bde79ba3a68bb4f0000000000000000000000000000000000000000000000000001eec3dec2000000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -8477,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec34000000000000000000000000d491c4f7291e1d0a60774635218edb35857ff09f000000000000000000000000d491c4f7291e1d0a60774635218edb35857ff09f000000000000000000000000000000000000000000000000000175cd6500b00000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -8479,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec34000000000000000000000000687966bd74782f3585d471442231100abb5a46d8000000000000000000000000687966bd74782f3585d471442231100abb5a46d8000000000000000000000000000000000000000000000000002a59568f9e6f0600000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -8480,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec34000000000000000000000000877ace1b6e0f421fffb33fe73856ef011de158c9000000000000000000000000877ace1b6e0f421fffb33fe73856ef011de158c90000000000000000000000000000000000000000000000000045314e81f8955d00000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -8481,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec34000000000000000000000000e9006c3732dde8c2d5c4ce65568179035ace744d000000000000000000000000e9006c3732dde8c2d5c4ce65568179035ace744d00000000000000000000000000000000000000000000000000071afd498d000000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -8482,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec34000000000000000000000000c032a30d6446d70963a91694693cad2c7fa25ca8000000000000000000000000c032a30d6446d70963a91694693cad2c7fa25ca80000000000000000000000000000000000000000000000000018de76816d800000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -8483,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec340000000000000000000000007fe33afe1109a52d7f6311cc0b8b8388d547ea5c0000000000000000000000007fe33afe1109a52d7f6311cc0b8b8388d547ea5c00000000000000000000000000000000000000000000000000a50aae61d1b86600000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -8485,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec34000000000000000000000000adfd117f7e3fca69a28ac4f415bee1132b2c265c000000000000000000000000adfd117f7e3fca69a28ac4f415bee1132b2c265c0000000000000000000000000000000000000000000000000006484a6b74f72f00000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -8486,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec34000000000000000000000000678970c3f6ed29662a580dc276d40fd1db5412d6000000000000000000000000678970c3f6ed29662a580dc276d40fd1db5412d600000000000000000000000000000000000000000000000000911f41f5b47c9300000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -8487,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec3400000000000000000000000002d885d747c93fc075ffbfe43074a3ebd7c2c21a00000000000000000000000002d885d747c93fc075ffbfe43074a3ebd7c2c21a000000000000000000000000000000000000000000000000000c69b36465b63f00000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -8488,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec34000000000000000000000000a6c34c40ee88667d145a789516dd3aac6ff66569000000000000000000000000a6c34c40ee88667d145a789516dd3aac6ff665690000000000000000000000000000000000000000000000000016f59fa05cfdd600000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -8489,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec34000000000000000000000000c3b9fe8c9cb09360f1b72d91681cdaaf7d9fe575000000000000000000000000c3b9fe8c9cb09360f1b72d91681cdaaf7d9fe575000000000000000000000000000000000000000000000000008845c95fe1680000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -8490,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec34000000000000000000000000a6c34c40ee88667d145a789516dd3aac6ff66569000000000000000000000000a6c34c40ee88667d145a789516dd3aac6ff66569000000000000000000000000000000000000000000000000001dc1811eddd51e00000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -8491,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec34000000000000000000000000a6c34c40ee88667d145a789516dd3aac6ff66569000000000000000000000000a6c34c40ee88667d145a789516dd3aac6ff665690000000000000000000000000000000000000000000000000000d12c7f080bff00000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -8492,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec34000000000000000000000000365a3ec18ea9e4591dbd2e7687cb14f472f4b559000000000000000000000000365a3ec18ea9e4591dbd2e7687cb14f472f4b559000000000000000000000000000000000000000000000000001550f7dca7000000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -8493,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec3400000000000000000000000050f71937e2ca4cff80e713f188db1a989d76dcae00000000000000000000000050f71937e2ca4cff80e713f188db1a989d76dcae00000000000000000000000000000000000000000000000000038d7ea4c6800000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -8494,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec34000000000000000000000000dbeab3ac04a0b633bf9c7aaf102330fbc50387dd000000000000000000000000dbeab3ac04a0b633bf9c7aaf102330fbc50387dd000000000000000000000000000000000000000000000000006782b01e18e30000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -8495,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec3400000000000000000000000011d26bd5b0cc0762431e5be22ed10317a6440e6b00000000000000000000000011d26bd5b0cc0762431e5be22ed10317a6440e6b000000000000000000000000000000000000000000000000000c23ad62f3ff4000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -8496,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec340000000000000000000000008a7a56ab6d5bb974f2d3e35e2ebc2ed261feacb00000000000000000000000008a7a56ab6d5bb974f2d3e35e2ebc2ed261feacb0000000000000000000000000000000000000000000000000002714711487800000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -8498,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec34000000000000000000000000407410d84e15f79642272edaeb437ac65d7298e6000000000000000000000000407410d84e15f79642272edaeb437ac65d7298e60000000000000000000000000000000000000000000000000007d0e36a81800000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -8499,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec340000000000000000000000004cb62717bfee56bd65111dc7006afbe53a41e6c90000000000000000000000004cb62717bfee56bd65111dc7006afbe53a41e6c90000000000000000000000000000000000000000000000000077c6985a22e64500000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -8500,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec340000000000000000000000001d1870a437031ea33add0d3e1cb9fbbb89cac91c0000000000000000000000001d1870a437031ea33add0d3e1cb9fbbb89cac91c00000000000000000000000000000000000000000000000000c15831e3c6781e00000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -8501,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec3400000000000000000000000063968e995e962375d3bc514bef7fd9b78aaa550b00000000000000000000000063968e995e962375d3bc514bef7fd9b78aaa550b00000000000000000000000000000000000000000000000000038d7ea4c6800000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -8502,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec34000000000000000000000000c03cd00d464faa73dd37111358905f3c6c96999f000000000000000000000000c03cd00d464faa73dd37111358905f3c6c96999f0000000000000000000000000000000000000000000000000000d15d9251d44000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -8503,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec34000000000000000000000000134342210990c23e58cac9224af88882f455a75c000000000000000000000000134342210990c23e58cac9224af88882f455a75c00000000000000000000000000000000000000000000000000e858af89f5948300000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,0x3c31b2075c0ed0d5464c432cc8ced58c31b403630592cdf88dc18ccfb83168d5,2022-05-16 06:55:13.000 UTC,0,true -8504,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec340000000000000000000000009682b2878122d178dcf20185c7ad9f5a39a1d0fa0000000000000000000000009682b2878122d178dcf20185c7ad9f5a39a1d0fa00000000000000000000000000000000000000000000000000005af3107a400000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -8506,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec34000000000000000000000000cf42be03d6c9ecabcc98b0b8198c63d5062d078b000000000000000000000000cf42be03d6c9ecabcc98b0b8198c63d5062d078b00000000000000000000000000000000000000000000000000038d7ea4c6800000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -8507,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec3400000000000000000000000037ee45e654e4d602a5487faa14197a8a2d45e34c00000000000000000000000037ee45e654e4d602a5487faa14197a8a2d45e34c0000000000000000000000000000000000000000000000000005543df729c00000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -8508,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec34000000000000000000000000b30f8c4b4957333f905a8fa1a4cb5fb3876ad37f000000000000000000000000b30f8c4b4957333f905a8fa1a4cb5fb3876ad37f0000000000000000000000000000000000000000000000000001aa1a47315e4000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -8510,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec34000000000000000000000000cc0920a6a94919c3bba20ee0d53612b9054a013a000000000000000000000000cc0920a6a94919c3bba20ee0d53612b9054a013a00000000000000000000000000000000000000000000000000038d7ea4c6800000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -8511,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec340000000000000000000000009dc922ae6cf0b888592a72d32839fac7c43f55870000000000000000000000009dc922ae6cf0b888592a72d32839fac7c43f558700000000000000000000000000000000000000000000000000038d7ea4c6800000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -8514,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec340000000000000000000000004988ec8fa41ac3430611e9abfc453329f26fa3770000000000000000000000004988ec8fa41ac3430611e9abfc453329f26fa3770000000000000000000000000000000000000000000000000001c6bf5263400000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -8515,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec34000000000000000000000000d7f8a31c11193b801785993894cbce9af3b23368000000000000000000000000d7f8a31c11193b801785993894cbce9af3b2336800000000000000000000000000000000000000000000000000968f1757353f9e00000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -8516,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec340000000000000000000000005167078032728ab3f1915c353badd2441edbc7920000000000000000000000005167078032728ab3f1915c353badd2441edbc792000000000000000000000000000000000000000000000000000414aafc9d368000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -8517,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec34000000000000000000000000934c53be5f96f298e55b83763aa9aa84bd2ed438000000000000000000000000934c53be5f96f298e55b83763aa9aa84bd2ed43800000000000000000000000000000000000000000000000000004d4e9ace500000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -8519,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec340000000000000000000000001fca6887e8f99f3f40f980a837f487d46224a1d80000000000000000000000001fca6887e8f99f3f40f980a837f487d46224a1d8000000000000000000000000000000000000000000000000000044936e37500000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -8520,0xcd9d4988c0ae61887b075ba77f08cbfad2b65068,0x3f87ff1de58128ef8fcb4c807efd776e1ac72e51,0xf4f7b41a0000000000000000000000008e7488075d58158083330e9f37db55056b5edb33000000000000000000000000000000000000000000000002b5e3af16b1880000,0x6533748c005fd3fb6c2b567228a6b32ce60d9f890f6857a60c8c51c6d4ed18ec,2021-12-24 08:12:51.000 UTC,0,true -8521,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec3400000000000000000000000091cf62d238d64103ebe29f65e53fe5cbeff60f7f00000000000000000000000091cf62d238d64103ebe29f65e53fe5cbeff60f7f00000000000000000000000000000000000000000000000000005666e940f00000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -8522,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec34000000000000000000000000b6d3c16c3f3414ff268efb043f913a4d492e825c000000000000000000000000b6d3c16c3f3414ff268efb043f913a4d492e825c0000000000000000000000000000000000000000000000000000338740c1200000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -8523,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec34000000000000000000000000197ee44e8749419f4d87ebc9d311b15345137657000000000000000000000000197ee44e8749419f4d87ebc9d311b15345137657000000000000000000000000000000000000000000000000000046f0ca4ae00000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -8524,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec3400000000000000000000000058b02cca85bfe859a9a5f1957bd27d29aacb71f300000000000000000000000058b02cca85bfe859a9a5f1957bd27d29aacb71f30000000000000000000000000000000000000000000000000000327a19c8f80000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -8525,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec34000000000000000000000000101539495fdb941639fca27c8e17424c7fbe37e6000000000000000000000000101539495fdb941639fca27c8e17424c7fbe37e600000000000000000000000000000000000000000000000000003be191cfe00000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -8526,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec34000000000000000000000000177e6d1beaee7a3331d8dacbd829fdda1a4e8356000000000000000000000000177e6d1beaee7a3331d8dacbd829fdda1a4e835600000000000000000000000000000000000000000000000000470de4df82000000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -8528,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec34000000000000000000000000dd12c0787a0d9eab016cfd2ef26620f2ae9cbb79000000000000000000000000dd12c0787a0d9eab016cfd2ef26620f2ae9cbb790000000000000000000000000000000000000000000000000000434d77b6a00000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -8529,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec34000000000000000000000000685a6447906bd6ffafaa27cc1867abb87ee87c6b000000000000000000000000685a6447906bd6ffafaa27cc1867abb87ee87c6b0000000000000000000000000000000000000000000000000000356328a5f80000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -8530,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec340000000000000000000000005a5ff89a6331e1b7145d9024523ab7bc92f0853c0000000000000000000000005a5ff89a6331e1b7145d9024523ab7bc92f0853c00000000000000000000000000000000000000000000000000001719e5fa300000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -8531,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec340000000000000000000000004b05dafc5da73a5c20163568c18c58daa40ab8540000000000000000000000004b05dafc5da73a5c20163568c18c58daa40ab85400000000000000000000000000000000000000000000000000005ac47f8c700000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -8532,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec34000000000000000000000000e4ba7e02b90527dbb0cbb5173e42ae486cb8ae89000000000000000000000000e4ba7e02b90527dbb0cbb5173e42ae486cb8ae8900000000000000000000000000000000000000000000000000003291623fe00000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -8533,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec3400000000000000000000000049fc3f948a2374e5d3d92bfb8dbc2173d27882cc00000000000000000000000049fc3f948a2374e5d3d92bfb8dbc2173d27882cc00000000000000000000000000000000000000000000000000003b7b1fc4b00000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -8535,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec340000000000000000000000003d90c9f524e9b2c01a043d546456560db4af16130000000000000000000000003d90c9f524e9b2c01a043d546456560db4af161300000000000000000000000000000000000000000000000000008c0feb4ba00000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -8537,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec34000000000000000000000000e227b016dd30cdea3d72ff050cf90a5de57c8dc4000000000000000000000000e227b016dd30cdea3d72ff050cf90a5de57c8dc40000000000000000000000000000000000000000000000000000b5e620f4800000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -8538,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec34000000000000000000000000764c417532dc983b80294a3da65b269da712c564000000000000000000000000764c417532dc983b80294a3da65b269da712c56400000000000000000000000000000000000000000000000000376e4164382e1700000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -8539,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec3400000000000000000000000099c2fd7a0e0820ddcc859ff8567426d28f74557600000000000000000000000099c2fd7a0e0820ddcc859ff8567426d28f74557600000000000000000000000000000000000000000000000000130d551f49d9e700000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -8540,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec340000000000000000000000008ae882adb8c6c87f33896069c64f44bdf1f3f1820000000000000000000000008ae882adb8c6c87f33896069c64f44bdf1f3f182000000000000000000000000000000000000000000000000069f9d23bdc3f85600000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -8541,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec3400000000000000000000000099c2fd7a0e0820ddcc859ff8567426d28f74557600000000000000000000000099c2fd7a0e0820ddcc859ff8567426d28f745576000000000000000000000000000000000000000000000000000009184e72a00000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -8543,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec3400000000000000000000000099c2fd7a0e0820ddcc859ff8567426d28f74557600000000000000000000000099c2fd7a0e0820ddcc859ff8567426d28f745576000000000000000000000000000000000000000000000000000009184e72a00000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -8544,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec34000000000000000000000000cab55b0de19c01cdd284535a3fe8d73a657525bb000000000000000000000000cab55b0de19c01cdd284535a3fe8d73a657525bb0000000000000000000000000000000000000000000000000096193d81d8dd8900000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -8545,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec3400000000000000000000000063e077bf9b0faf76704cafe9f053e415112271c300000000000000000000000063e077bf9b0faf76704cafe9f053e415112271c3000000000000000000000000000000000000000000000000002386f26fc1000000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -8547,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec34000000000000000000000000e5ffc23c7fc71d65a5a9e30a161b4fbd3d6a093a000000000000000000000000e5ffc23c7fc71d65a5a9e30a161b4fbd3d6a093a00000000000000000000000000000000000000000000000000005af3107a400000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -8548,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec3400000000000000000000000078b6849ca39cfb26b1de6742a3349ad54a18e02e00000000000000000000000078b6849ca39cfb26b1de6742a3349ad54a18e02e00000000000000000000000000000000000000000000000000911fbea4781c7a00000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -8550,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec3400000000000000000000000008efebae61c2abfd41181dcc04f3c36334cb820a00000000000000000000000008efebae61c2abfd41181dcc04f3c36334cb820a000000000000000000000000000000000000000000000000002039396b5e440000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -8551,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec34000000000000000000000000d06240b68a66fc009cd81ef695b4b4cc31e37bf9000000000000000000000000d06240b68a66fc009cd81ef695b4b4cc31e37bf900000000000000000000000000000000000000000000000002c68af0bb14000000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -8552,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec34000000000000000000000000aa692efef3f2d1d0639755299c797c6a3579b25e000000000000000000000000aa692efef3f2d1d0639755299c797c6a3579b25e000000000000000000000000000000000000000000000000009c757ce290c5d200000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -8553,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec3400000000000000000000000056d662d0e2dbe179dfeee9f8fc4038f3128ccdc600000000000000000000000056d662d0e2dbe179dfeee9f8fc4038f3128ccdc600000000000000000000000000000000000000000000000000168fcc219efbae00000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -8555,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec340000000000000000000000005734d110867db331fce3c5e863ddb6a4f0201ed20000000000000000000000005734d110867db331fce3c5e863ddb6a4f0201ed2000000000000000000000000000000000000000000000000002386f26fc1000000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -8559,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec340000000000000000000000007607ee99410e57e5da56cc9f334235c7663930940000000000000000000000007607ee99410e57e5da56cc9f334235c766393094000000000000000000000000000000000000000000000000000aa87bee53800000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -8560,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec3400000000000000000000000048cf31c151b1a2dfb5d2c9a90552f05c8aeca9cd00000000000000000000000048cf31c151b1a2dfb5d2c9a90552f05c8aeca9cd000000000000000000000000000000000000000000000000000aa87bee53800000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -8561,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec34000000000000000000000000be76ec0c017db75da73254ce30c65fd2c6e7058d000000000000000000000000be76ec0c017db75da73254ce30c65fd2c6e7058d000000000000000000000000000000000000000000000000000aa87bee53800000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -8566,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec34000000000000000000000000e2cfb11253c219e8af1623a3b29788717e7b3db2000000000000000000000000e2cfb11253c219e8af1623a3b29788717e7b3db2000000000000000000000000000000000000000000000000006ec714722ede9a00000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -8567,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec340000000000000000000000004e64c5aaddfa2f0274aa73367bee6e3879b0f9540000000000000000000000004e64c5aaddfa2f0274aa73367bee6e3879b0f954000000000000000000000000000000000000000000000000004f94ae6af8000000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -8568,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec34000000000000000000000000b255d025a6a1da4e5a707f8501dac148a0be382c000000000000000000000000b255d025a6a1da4e5a707f8501dac148a0be382c000000000000000000000000000000000000000000000000015f271d29aa460000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,0xffb196ad45f6b6f4b718b043f3a14b1658ac1c037dfaa64a58201e58e39a039f,2021-12-18 11:47:14.000 UTC,0,true -8569,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec34000000000000000000000000bb62fab8d0e5303310d90ec325fe84f342671b43000000000000000000000000bb62fab8d0e5303310d90ec325fe84f342671b430000000000000000000000000000000000000000000000000138f2f038467b4f00000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -8570,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec34000000000000000000000000775dcdcff29bd88721172ecb35da4e948bcc8667000000000000000000000000775dcdcff29bd88721172ecb35da4e948bcc866700000000000000000000000000000000000000000000000000193223118055fb00000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -8572,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec3400000000000000000000000097a136d6b1ab9fc5e8ae9dbaec812e2d6eb4893e00000000000000000000000097a136d6b1ab9fc5e8ae9dbaec812e2d6eb4893e0000000000000000000000000000000000000000000000000014db79f698080e00000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -8574,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0xa9f9e675000000000000000000000000a0b86991c6218b36c1d19d4a2e9eb0ce3606eb480000000000000000000000007f5c764cbc14f9669b88837ca1490cca17c31607000000000000000000000000ad268606cec97ef0fa77f74ddbebdcebbbd8d7c4000000000000000000000000ad268606cec97ef0fa77f74ddbebdcebbbd8d7c4000000000000000000000000000000000000000000000000000000000319750000000000000000000000000000000000000000000000000000000000000000c00000000000000000000000000000000000000000000000000000000000000000,,,1,true -8575,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec34000000000000000000000000fcf03727718cccaa55123eb6f21e57a60d972481000000000000000000000000fcf03727718cccaa55123eb6f21e57a60d97248100000000000000000000000000000000000000000000000000038d7ea4c6800000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -8576,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec340000000000000000000000007823ac7dd217d0f7cb5c49410b2c894d052bda760000000000000000000000007823ac7dd217d0f7cb5c49410b2c894d052bda7600000000000000000000000000000000000000000000000000288529f74657ee00000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -8577,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec34000000000000000000000000fcf03727718cccaa55123eb6f21e57a60d972481000000000000000000000000fcf03727718cccaa55123eb6f21e57a60d972481000000000000000000000000000000000000000000000000003af6a58e9e650000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -8578,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec34000000000000000000000000a054517dab4695751c5276148a29a245c2163550000000000000000000000000a054517dab4695751c5276148a29a245c216355000000000000000000000000000000000000000000000000000352526bcc9ee0000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -8579,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec340000000000000000000000004e64c5aaddfa2f0274aa73367bee6e3879b0f9540000000000000000000000004e64c5aaddfa2f0274aa73367bee6e3879b0f95400000000000000000000000000000000000000000000000000399ca53698600000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -8581,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec340000000000000000000000006972fe17e3b739a9851da27ba3602ad0e76aabb80000000000000000000000006972fe17e3b739a9851da27ba3602ad0e76aabb80000000000000000000000000000000000000000000000000060681d79af9f6c00000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,0xc887e18fc8be649f4b2a72fc2767d892754572952385ec4fd2eda91d2de64a9d,2022-03-12 07:32:39.000 UTC,0,true -8583,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec34000000000000000000000000dd925e0bac97cd4b988539620141753d6345969d000000000000000000000000dd925e0bac97cd4b988539620141753d6345969d000000000000000000000000000000000000000000000000002917e64fa5b11a00000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -8584,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec34000000000000000000000000815c971b10315a50ecc1fe77cfcb5ff8093f2493000000000000000000000000815c971b10315a50ecc1fe77cfcb5ff8093f2493000000000000000000000000000000000000000000000000002badafaa018d7200000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -8585,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec3400000000000000000000000091b597ad2ff79cc5266e326ca728adfe44757c5700000000000000000000000091b597ad2ff79cc5266e326ca728adfe44757c570000000000000000000000000000000000000000000000000015c8ac92b21c0000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -8586,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec340000000000000000000000005099683a6a18d13f025cfd19a4767d00448176200000000000000000000000005099683a6a18d13f025cfd19a4767d0044817620000000000000000000000000000000000000000000000000002bd91620ecbb8a00000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -8589,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec34000000000000000000000000a4cfca09d930c6634f074ca6bea7ec69c0625037000000000000000000000000a4cfca09d930c6634f074ca6bea7ec69c06250370000000000000000000000000000000000000000000000000058d15e1762800000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -8590,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec34000000000000000000000000e8846f368ccb46308a40379c28d85408fa891baf000000000000000000000000e8846f368ccb46308a40379c28d85408fa891baf000000000000000000000000000000000000000000000000001f04307a21b10000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -8591,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec340000000000000000000000007c629a744d5d4641ae11032630432ce48e74971b0000000000000000000000007c629a744d5d4641ae11032630432ce48e74971b00000000000000000000000000000000000000000000000000295d641fda672300000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -8592,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec34000000000000000000000000f119602f96bbcf31604360a46dda1ed10b501b57000000000000000000000000f119602f96bbcf31604360a46dda1ed10b501b570000000000000000000000000000000000000000000000000000b5e620f4800000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -8593,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec34000000000000000000000000d489f49c614deac1ed8463ebe789555b1e519485000000000000000000000000d489f49c614deac1ed8463ebe789555b1e51948500000000000000000000000000000000000000000000000000071afd498d000000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -8595,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec34000000000000000000000000c7a99e49910499eb0f78eff09a422068ea438fa6000000000000000000000000c7a99e49910499eb0f78eff09a422068ea438fa60000000000000000000000000000000000000000000000000031091b06392f0000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -8597,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec34000000000000000000000000d1da2a98a7d498d6bd18b053359fc11c9d9e079d000000000000000000000000d1da2a98a7d498d6bd18b053359fc11c9d9e079d00000000000000000000000000000000000000000000000000000002540be40000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -8598,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec34000000000000000000000000b5ea922bd46a0c1cb6a6699a3b7b5964a4b7f6cc000000000000000000000000b5ea922bd46a0c1cb6a6699a3b7b5964a4b7f6cc000000000000000000000000000000000000000000000000000000e8d4a5100000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -8599,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec3400000000000000000000000047a72907b9d6488cb0d164de592b0be0bb95554f00000000000000000000000047a72907b9d6488cb0d164de592b0be0bb95554f000000000000000000000000000000000000000000000000000000e8d4a5100000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -8600,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec340000000000000000000000002d4d97dea692f8cb1f3e80dbd1724ae7b3305d180000000000000000000000002d4d97dea692f8cb1f3e80dbd1724ae7b3305d18000000000000000000000000000000000000000000000000000000e8d4a5100000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -8601,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec34000000000000000000000000e085c4425e8a3a7b05fe77e929c6db8779f25f41000000000000000000000000e085c4425e8a3a7b05fe77e929c6db8779f25f41000000000000000000000000000000000000000000000000000000e8d4a5100000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -8602,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec3400000000000000000000000089329fcc52c2e5ad78f32cddc92a75aadb7ad2b600000000000000000000000089329fcc52c2e5ad78f32cddc92a75aadb7ad2b6000000000000000000000000000000000000000000000000000000e8d4a5100000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -8603,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec340000000000000000000000002055d8ef30cfa3ba2f14d8cc4be8738ae09400d80000000000000000000000002055d8ef30cfa3ba2f14d8cc4be8738ae09400d800000000000000000000000000000000000000000000000000838ff79d0fee6700000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -8604,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec34000000000000000000000000255af8e20e5ff15268bf4ca81f4679d0abe32102000000000000000000000000255af8e20e5ff15268bf4ca81f4679d0abe32102000000000000000000000000000000000000000000000000000000e8d4a5100000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -8605,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec34000000000000000000000000dae836e608110d6c81d6ff7dafd327d52126e976000000000000000000000000dae836e608110d6c81d6ff7dafd327d52126e976000000000000000000000000000000000000000000000000000000e8d4a5100000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -8606,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec34000000000000000000000000bb18a38061a5ed1490dcee7d6941a0a9c2a82b50000000000000000000000000bb18a38061a5ed1490dcee7d6941a0a9c2a82b50000000000000000000000000000000000000000000000000000000e8d4a5100000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -8607,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec340000000000000000000000001933baa0d5e98fd53e60f237b67e39d40cda19e50000000000000000000000001933baa0d5e98fd53e60f237b67e39d40cda19e5000000000000000000000000000000000000000000000000000000e8d4a5100000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -8608,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec3400000000000000000000000041d5def13c7602b129bbed114c44ee0fec5ef74400000000000000000000000041d5def13c7602b129bbed114c44ee0fec5ef744000000000000000000000000000000000000000000000000000000e8d4a5100000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -8609,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec3400000000000000000000000076aa729dc76da61b5a59b06ca678fefec86c332200000000000000000000000076aa729dc76da61b5a59b06ca678fefec86c3322000000000000000000000000000000000000000000000000000000e8d4a5100000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -8610,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec34000000000000000000000000d954013b3866152d5c788eff83eb69704621a497000000000000000000000000d954013b3866152d5c788eff83eb69704621a497000000000000000000000000000000000000000000000000004380663abb800000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -8611,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec340000000000000000000000004c9f580d9062c41f0858f6b19d2491217b76cb9f0000000000000000000000004c9f580d9062c41f0858f6b19d2491217b76cb9f000000000000000000000000000000000000000000000000000000e8d4a5100000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -8612,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec340000000000000000000000009554c02da9113f9cca954405ad401090751178c20000000000000000000000009554c02da9113f9cca954405ad401090751178c2000000000000000000000000000000000000000000000000000000e8d4a5100000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -8613,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec34000000000000000000000000e7ab243035c94a87ee3d97d8bbab9b8514e52b86000000000000000000000000e7ab243035c94a87ee3d97d8bbab9b8514e52b86000000000000000000000000000000000000000000000000000000e8d4a5100000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -8614,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec340000000000000000000000007ea49c6dc749d2a34d51f24de63b9ea1fe3605100000000000000000000000007ea49c6dc749d2a34d51f24de63b9ea1fe360510000000000000000000000000000000000000000000000000000000e8d4a5100000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -8615,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec34000000000000000000000000ff22a6b7d20a0eacd62b428da07171fa7be6e67a000000000000000000000000ff22a6b7d20a0eacd62b428da07171fa7be6e67a00000000000000000000000000000000000000000000000003fe9ee53deae91c00000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -8616,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec340000000000000000000000001eb4b6976d04e9df25d7426fcb409e5d9d99cb6f0000000000000000000000001eb4b6976d04e9df25d7426fcb409e5d9d99cb6f000000000000000000000000000000000000000000000000000000e8d4a5100000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -8618,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec340000000000000000000000005aa07a9d950f1b496b928dd455d6be761ccc0f8d0000000000000000000000005aa07a9d950f1b496b928dd455d6be761ccc0f8d000000000000000000000000000000000000000000000000000000e8d4a5100000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -8619,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec340000000000000000000000004660a02784d60ad35a50005df3981f1ad40c491f0000000000000000000000004660a02784d60ad35a50005df3981f1ad40c491f000000000000000000000000000000000000000000000000000000e8d4a5100000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -8620,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec34000000000000000000000000c0b78ccc36a78a6ab0b8ddcc56a00fd292e222d3000000000000000000000000c0b78ccc36a78a6ab0b8ddcc56a00fd292e222d3000000000000000000000000000000000000000000000000000000e8d4a5100000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -8621,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec340000000000000000000000001ab6a10692855a79b34644ec47ecbe04071579350000000000000000000000001ab6a10692855a79b34644ec47ecbe0407157935000000000000000000000000000000000000000000000000000000e8d4a5100000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -8622,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec34000000000000000000000000681df54a8672b76796b29f5402866da2065249c0000000000000000000000000681df54a8672b76796b29f5402866da2065249c0000000000000000000000000000000000000000000000000000000e8d4a5100000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -8623,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec340000000000000000000000004eb1bf3c42fc1c394078c33174479f550c11430f0000000000000000000000004eb1bf3c42fc1c394078c33174479f550c11430f000000000000000000000000000000000000000000000000000000e8d4a5100000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -8624,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec3400000000000000000000000021c64d4d94938af244e1c80dc3c52c0d23b2af8f00000000000000000000000021c64d4d94938af244e1c80dc3c52c0d23b2af8f000000000000000000000000000000000000000000000000000000e8d4a5100000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -8625,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec340000000000000000000000000926051a979aa8dd87a4cc49fcc40ac3eacc57750000000000000000000000000926051a979aa8dd87a4cc49fcc40ac3eacc5775000000000000000000000000000000000000000000000000005e17bd19b47c4100000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -8626,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0xa9f9e675000000000000000000000000dac17f958d2ee523a2206206994597c13d831ec700000000000000000000000094b008aa00579c1307b0ef2c499ad98a8ce58e58000000000000000000000000d954013b3866152d5c788eff83eb69704621a497000000000000000000000000d954013b3866152d5c788eff83eb69704621a497000000000000000000000000000000000000000000000000000000000112a88000000000000000000000000000000000000000000000000000000000000000c00000000000000000000000000000000000000000000000000000000000000000,,,1,true -8627,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec340000000000000000000000003c981cb893a285cb5276488099023389afa134650000000000000000000000003c981cb893a285cb5276488099023389afa13465000000000000000000000000000000000000000000000000000000e8d4a5100000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -8629,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec340000000000000000000000007c3dd65805ed46f78e3665f15899146140c0e30e0000000000000000000000007c3dd65805ed46f78e3665f15899146140c0e30e000000000000000000000000000000000000000000000000000000e8d4a5100000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -8630,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec3400000000000000000000000023c63cb0b2fc6925f5ca3bf0fe2bf0a22ba39b6f00000000000000000000000023c63cb0b2fc6925f5ca3bf0fe2bf0a22ba39b6f000000000000000000000000000000000000000000000000000000e8d4a5100000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -8631,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec34000000000000000000000000e12c11e98b97f5788baa0c8a1034ae68a9662482000000000000000000000000e12c11e98b97f5788baa0c8a1034ae68a9662482000000000000000000000000000000000000000000000000007393ee87573e7d00000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -8632,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec340000000000000000000000006ccab53eda7efb901cbb4d52454ff382c7a8afb00000000000000000000000006ccab53eda7efb901cbb4d52454ff382c7a8afb0000000000000000000000000000000000000000000000000000000e8d4a5100000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -8633,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec34000000000000000000000000c6241b99a30554c52c3713026b1d6e485158ea73000000000000000000000000c6241b99a30554c52c3713026b1d6e485158ea73000000000000000000000000000000000000000000000000000000e8d4a5100000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -8634,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec3400000000000000000000000098566c84c47c5d9eba54a3931b150e4e2327c72000000000000000000000000098566c84c47c5d9eba54a3931b150e4e2327c720000000000000000000000000000000000000000000000000000000e8d4a5100000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -8635,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec34000000000000000000000000b437e238bf5ee4fd2240fc5ff4740691ad440549000000000000000000000000b437e238bf5ee4fd2240fc5ff4740691ad4405490000000000000000000000000000000000000000000000000012202d1274aca800000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -8636,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec3400000000000000000000000067a63f68052d70bdaebb15786d73ca55c8ecae0f00000000000000000000000067a63f68052d70bdaebb15786d73ca55c8ecae0f000000000000000000000000000000000000000000000000000000e8d4a5100000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -8637,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec340000000000000000000000009729e4584afb7ae74aca69d982c43c2c02d03a2b0000000000000000000000009729e4584afb7ae74aca69d982c43c2c02d03a2b000000000000000000000000000000000000000000000000000000e8d4a5100000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -8638,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec340000000000000000000000000f81cfeab6217a0d2b0144cb1238dad0b55be6f90000000000000000000000000f81cfeab6217a0d2b0144cb1238dad0b55be6f9000000000000000000000000000000000000000000000000000000e8d4a5100000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -8639,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec340000000000000000000000008e060d80e2e284282a710f08a105db7328110c920000000000000000000000008e060d80e2e284282a710f08a105db7328110c92000000000000000000000000000000000000000000000000000000e8d4a5100000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -8640,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec340000000000000000000000005f3f94b8bae2b195e8efe85d5872ee76602af3f90000000000000000000000005f3f94b8bae2b195e8efe85d5872ee76602af3f9000000000000000000000000000000000000000000000000000000e8d4a5100000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -8641,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec34000000000000000000000000a109e8af4af849bf79add6649e67ae07663a284a000000000000000000000000a109e8af4af849bf79add6649e67ae07663a284a000000000000000000000000000000000000000000000000000000e8d4a5100000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -8642,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec34000000000000000000000000fb008401e9ad8e98b9b1999b45b7a094813930dd000000000000000000000000fb008401e9ad8e98b9b1999b45b7a094813930dd000000000000000000000000000000000000000000000000000000e8d4a5100000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -8643,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec34000000000000000000000000e8ec9189b9a8e6fff4081b02798229e9667b0ff4000000000000000000000000e8ec9189b9a8e6fff4081b02798229e9667b0ff4000000000000000000000000000000000000000000000000020279e9a77a5afc00000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,0x7c0d52c0d6984b3fa98313995751521880fe89eb6850bf7438fb119881c88eb4,2021-11-28 07:36:08.000 UTC,0,true -8644,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec34000000000000000000000000f29c7278d460b590f8e0ed780c6266837a7e98d7000000000000000000000000f29c7278d460b590f8e0ed780c6266837a7e98d7000000000000000000000000000000000000000000000000000000e8d4a5100000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -8645,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec34000000000000000000000000dfb2546ad9b9e461abb03fe5491bad95250d0f75000000000000000000000000dfb2546ad9b9e461abb03fe5491bad95250d0f75000000000000000000000000000000000000000000000000000000e8d4a5100000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -8647,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec340000000000000000000000001de786dc3586de4eac8627d2eaf8164dd3fc506d0000000000000000000000001de786dc3586de4eac8627d2eaf8164dd3fc506d000000000000000000000000000000000000000000000000000000e8d4a5100000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -8648,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec34000000000000000000000000e475fb57a19f7acbb16734560c2ba4de8f093b12000000000000000000000000e475fb57a19f7acbb16734560c2ba4de8f093b12000000000000000000000000000000000000000000000000000000e8d4a5100000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -8649,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec34000000000000000000000000ecfc2f7c4f7d98e27b801d78dc58a26217d7707c000000000000000000000000ecfc2f7c4f7d98e27b801d78dc58a26217d7707c000000000000000000000000000000000000000000000000000000e8d4a5100000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -8650,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec340000000000000000000000005bf506ef751596fd72c7346f078232070b253c0e0000000000000000000000005bf506ef751596fd72c7346f078232070b253c0e000000000000000000000000000000000000000000000000000000e8d4a5100000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -8651,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec34000000000000000000000000b910ba7e631c642965b58308b1d29b84341c32f8000000000000000000000000b910ba7e631c642965b58308b1d29b84341c32f8000000000000000000000000000000000000000000000000000000e8d4a5100000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -8652,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec3400000000000000000000000055fb49b462a42d5af6078717c77f0ffb28859d7200000000000000000000000055fb49b462a42d5af6078717c77f0ffb28859d72000000000000000000000000000000000000000000000000000000e8d4a5100000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -8653,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec34000000000000000000000000ca3811070abc940e95643bef8c47a9a108aaa768000000000000000000000000ca3811070abc940e95643bef8c47a9a108aaa768000000000000000000000000000000000000000000000000000000e8d4a5100000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -8654,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec340000000000000000000000002f6b2f2ecebf791768ec0c583d41fd3ffff17a120000000000000000000000002f6b2f2ecebf791768ec0c583d41fd3ffff17a12000000000000000000000000000000000000000000000000000000e8d4a5100000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -8655,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec34000000000000000000000000e8b3bbe9c82a4e64550f30b0a100d51eff99a618000000000000000000000000e8b3bbe9c82a4e64550f30b0a100d51eff99a61800000000000000000000000000000000000000000000000000100ca6d56a7a0000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -8656,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec34000000000000000000000000f4530ca9327217af710f382c9209973a1e66d04d000000000000000000000000f4530ca9327217af710f382c9209973a1e66d04d000000000000000000000000000000000000000000000000000000e8d4a5100000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -8657,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec340000000000000000000000005840379db6f88f09492cd090dc6837b09097c5160000000000000000000000005840379db6f88f09492cd090dc6837b09097c516000000000000000000000000000000000000000000000000000000e8d4a5100000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -8658,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec34000000000000000000000000573a7938d10b9b89f01642bd459cb4650c11474b000000000000000000000000573a7938d10b9b89f01642bd459cb4650c11474b000000000000000000000000000000000000000000000000000000e8d4a5100000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -8659,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec340000000000000000000000004cb780fd3286f2d10199b61423d1c804bd2a5d2b0000000000000000000000004cb780fd3286f2d10199b61423d1c804bd2a5d2b000000000000000000000000000000000000000000000000001368c8aca8e44000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -8663,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec34000000000000000000000000463bb4e552cf87d88319ddb1012fac4682c61b28000000000000000000000000463bb4e552cf87d88319ddb1012fac4682c61b28000000000000000000000000000000000000000000000000001898fa413d2c3700000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -8664,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec34000000000000000000000000076655696e3abcc91f86e6d91c7019f9bae6f014000000000000000000000000076655696e3abcc91f86e6d91c7019f9bae6f014000000000000000000000000000000000000000000000000002aa1efb94e000000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -8665,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec340000000000000000000000002b72f0a2e5269951e3bcbeb50e8e35f182043f790000000000000000000000002b72f0a2e5269951e3bcbeb50e8e35f182043f790000000000000000000000000000000000000000000000000014da53dfae255d00000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -8667,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec34000000000000000000000000e9fbc77427074635331abcf9e57b47dbfdc3edf2000000000000000000000000e9fbc77427074635331abcf9e57b47dbfdc3edf200000000000000000000000000000000000000000000000000038d7ea4c6800000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -8669,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec34000000000000000000000000e9fbc77427074635331abcf9e57b47dbfdc3edf2000000000000000000000000e9fbc77427074635331abcf9e57b47dbfdc3edf200000000000000000000000000000000000000000000000000038d7ea4c6800000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -8670,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec34000000000000000000000000d99d383ff00a24a5af94b64c09570b8d8fb7aa0f000000000000000000000000d99d383ff00a24a5af94b64c09570b8d8fb7aa0f0000000000000000000000000000000000000000000000000005543df729c00000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -8671,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec34000000000000000000000000e9f3b9e68ead6179dedbbbc781e3ccca4f7409ad000000000000000000000000e9f3b9e68ead6179dedbbbc781e3ccca4f7409ad000000000000000000000000000000000000000000000000003c6568f12e800000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -8672,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec340000000000000000000000005686633573ceaca844621daf102a0c5dd1b102150000000000000000000000005686633573ceaca844621daf102a0c5dd1b1021500000000000000000000000000000000000000000000000000518f6e506c1c0000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -8673,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec34000000000000000000000000c1c3e416c5592fdc87f538dd6d7f8f5bc4a908a2000000000000000000000000c1c3e416c5592fdc87f538dd6d7f8f5bc4a908a200000000000000000000000000000000000000000000000000aff92204a3e6ad00000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -8674,0xcd9d4988c0ae61887b075ba77f08cbfad2b65068,0x3f87ff1de58128ef8fcb4c807efd776e1ac72e51,0xf4f7b41a0000000000000000000000000e3cbd67b2e89cb57fd3dc852484136ec768dd680000000000000000000000000000000000000000000000001bc16d674ec80000,,,1,true -8675,0xcd9d4988c0ae61887b075ba77f08cbfad2b65068,0x3f87ff1de58128ef8fcb4c807efd776e1ac72e51,0xf4f7b41a0000000000000000000000000ad65afa08e18ae282088bbae83526d6f14554b5000000000000000000000000000000000000000000000000140e46e10013c2ab,,,1,true -8676,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec340000000000000000000000006a9ee69b6781c18164ee9f7c58f1763bcffc7c510000000000000000000000006a9ee69b6781c18164ee9f7c58f1763bcffc7c510000000000000000000000000000000000000000000000000dc2f6866b062a0000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -8679,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec3400000000000000000000000045a5549b2baf17dcaa883e1b4f40bc89abce8a2e00000000000000000000000045a5549b2baf17dcaa883e1b4f40bc89abce8a2e000000000000000000000000000000000000000000000000005b4bab14e4329c00000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,0x275a3e27205f29d81676da4ef45bea7ea9109e9d0402e9051a937611c9b8f227,2021-12-12 06:26:21.000 UTC,0,true -8680,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec34000000000000000000000000c6305f5b950f22b1997247017bdab763d9a5e224000000000000000000000000c6305f5b950f22b1997247017bdab763d9a5e22400000000000000000000000000000000000000000000000000038d7ea4c6800000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -8681,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec34000000000000000000000000a93718595a93c81cc4e34104092eda31e43a9499000000000000000000000000a93718595a93c81cc4e34104092eda31e43a94990000000000000000000000000000000000000000000000000011c37937e0800000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -8683,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec34000000000000000000000000b68c9cb7d998c0959ad97d47ec7e6b0f3e93d8be000000000000000000000000b68c9cb7d998c0959ad97d47ec7e6b0f3e93d8be0000000000000000000000000000000000000000000000000011c37937e0800000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -8684,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec34000000000000000000000000c1035d8072333180191ad98d7971d9015f6e7b26000000000000000000000000c1035d8072333180191ad98d7971d9015f6e7b26000000000000000000000000000000000000000000000000002714711487800000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -8685,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec34000000000000000000000000ae3d48ad47ad3a446c0205d3d0f6a94c439bd163000000000000000000000000ae3d48ad47ad3a446c0205d3d0f6a94c439bd163000000000000000000000000000000000000000000000000001550f7dca7000000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -8687,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec340000000000000000000000000fdbfceecd0df13f8ed2311211eb08f52dea041f0000000000000000000000000fdbfceecd0df13f8ed2311211eb08f52dea041f000000000000000000000000000000000000000000000000002386f26fc1000000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -8688,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec34000000000000000000000000fcdf99014248fc287a1dd2747caa7a52035b63b2000000000000000000000000fcdf99014248fc287a1dd2747caa7a52035b63b20000000000000000000000000000000000000000000000000011c37937e0800000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -8689,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec340000000000000000000000007f87cc56adf0d44f8e2da7023f5403534bf2c9f80000000000000000000000007f87cc56adf0d44f8e2da7023f5403534bf2c9f8000000000000000000000000000000000000000000000000001e98843d3f8e0000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -8691,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec34000000000000000000000000c02230f20dfa84e8ea2102fd1be5f20f22089bc9000000000000000000000000c02230f20dfa84e8ea2102fd1be5f20f22089bc90000000000000000000000000000000000000000000000000055c275c73d221b00000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -8692,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec34000000000000000000000000774058bea27013e38f2182fbcfa8883beb870ec8000000000000000000000000774058bea27013e38f2182fbcfa8883beb870ec8000000000000000000000000000000000000000000000000001af262f25a71b100000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -8694,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec340000000000000000000000006665fec3fa3ff6b0d318d6d9348ea0808cfae8be0000000000000000000000006665fec3fa3ff6b0d318d6d9348ea0808cfae8be000000000000000000000000000000000000000000000000000009184e72a00000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -8695,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec34000000000000000000000000716e5d3550948c68ecf9966c39bda74da13c0613000000000000000000000000716e5d3550948c68ecf9966c39bda74da13c061300000000000000000000000000000000000000000000000000005af3107a400000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -8696,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec34000000000000000000000000761634ae1f79ce06d658a9a08f2521c88276b898000000000000000000000000761634ae1f79ce06d658a9a08f2521c88276b898000000000000000000000000000000000000000000000000000009184e72a00000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -8697,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec34000000000000000000000000c75de1d876334f103f795b7b931a0dba0d627941000000000000000000000000c75de1d876334f103f795b7b931a0dba0d62794100000000000000000000000000000000000000000000000000005af3107a400000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -8698,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec34000000000000000000000000c9be27da8deaa03fdf2a40558e5100e91f39594f000000000000000000000000c9be27da8deaa03fdf2a40558e5100e91f39594f000000000000000000000000000000000000000000000000001bc5fbb89fd37700000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -8699,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec34000000000000000000000000eb2ca0d610f449c65ccdc4151200643ffd956e7e000000000000000000000000eb2ca0d610f449c65ccdc4151200643ffd956e7e000000000000000000000000000000000000000000000000000009184e72a00000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -8700,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec340000000000000000000000005fe6cb581fef51949022a4960b74ff2c2903e77f0000000000000000000000005fe6cb581fef51949022a4960b74ff2c2903e77f000000000000000000000000000000000000000000000000000009184e72a00000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -8701,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec34000000000000000000000000a6a5965a7f8998b5b8e1febddb34d394252f5c13000000000000000000000000a6a5965a7f8998b5b8e1febddb34d394252f5c13000000000000000000000000000000000000000000000000000009184e72a00000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -8702,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec3400000000000000000000000022e45db423c0974de0f5f2dde836519d1a173e5f00000000000000000000000022e45db423c0974de0f5f2dde836519d1a173e5f000000000000000000000000000000000000000000000000000009184e72a00000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -8703,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec34000000000000000000000000ffb19ed04a94d3cefe20e8a89f7c13085d5e244e000000000000000000000000ffb19ed04a94d3cefe20e8a89f7c13085d5e244e000000000000000000000000000000000000000000000000000009184e72a00000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -8704,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec34000000000000000000000000cbe51818354300f2b95f224e584967819260de80000000000000000000000000cbe51818354300f2b95f224e584967819260de80000000000000000000000000000000000000000000000000000009184e72a00000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -8705,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec3400000000000000000000000068adeb69fe02f191f744dbc8ce53cb5f517e823600000000000000000000000068adeb69fe02f191f744dbc8ce53cb5f517e8236000000000000000000000000000000000000000000000000000009184e72a00000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -8706,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec340000000000000000000000002e15430ebbc70a4d32bcd8d9f1861c68a68888f60000000000000000000000002e15430ebbc70a4d32bcd8d9f1861c68a68888f600000000000000000000000000000000000000000000000000002d79883d200000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -8707,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec34000000000000000000000000b804c290fc1e2d6bbd7c7099e0738d12a0b4437c000000000000000000000000b804c290fc1e2d6bbd7c7099e0738d12a0b4437c0000000000000000000000000000000000000000000000000d9ab6fa344a5bbe00000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -8712,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec34000000000000000000000000bacbccda5f670437d2d5473e21d1b41f027dea0d000000000000000000000000bacbccda5f670437d2d5473e21d1b41f027dea0d00000000000000000000000000000000000000000000000000392ec52d5c152500000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -8713,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec34000000000000000000000000495e9ac565e21f89589675d8a93133a54d7d831c000000000000000000000000495e9ac565e21f89589675d8a93133a54d7d831c000000000000000000000000000000000000000000000000016345785d8a000000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -8715,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec3400000000000000000000000087df47f57fa337a7deeb12e01220d0a72ef9bf3200000000000000000000000087df47f57fa337a7deeb12e01220d0a72ef9bf32000000000000000000000000000000000000000000000000004221b3706da60000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -8721,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec34000000000000000000000000b7aa0e8b7a67d11ec26f6b13a70fc0e510f760bb000000000000000000000000b7aa0e8b7a67d11ec26f6b13a70fc0e510f760bb00000000000000000000000000000000000000000000000000a33fbf40f665f100000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -8722,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec34000000000000000000000000f4d9529df32208efa4cfc7ef2711c49546ad87b0000000000000000000000000f4d9529df32208efa4cfc7ef2711c49546ad87b0000000000000000000000000000000000000000000000000003882824f5bf77f00000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -8723,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec34000000000000000000000000fcb830302bc8994d2b518d29e29f53e012a10fe8000000000000000000000000fcb830302bc8994d2b518d29e29f53e012a10fe8000000000000000000000000000000000000000000000000000de5295e13950000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -8724,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec34000000000000000000000000434290f0f31723a16e07b705bdd0e8f5e49b6b04000000000000000000000000434290f0f31723a16e07b705bdd0e8f5e49b6b04000000000000000000000000000000000000000000000000000dbf2063d4fd0000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -8727,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec34000000000000000000000000f09473bead03711eb34f3efd5e59c369cc11c3aa000000000000000000000000f09473bead03711eb34f3efd5e59c369cc11c3aa000000000000000000000000000000000000000000000000015de891f9de0d0000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -8728,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec34000000000000000000000000e7c51775505458cd958ae06985d44eb891d07e7a000000000000000000000000e7c51775505458cd958ae06985d44eb891d07e7a000000000000000000000000000000000000000000000000002386f26fc1000000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -8729,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec3400000000000000000000000067d63c52806f9ee874763a3eeca4fe11ebc286be00000000000000000000000067d63c52806f9ee874763a3eeca4fe11ebc286be000000000000000000000000000000000000000000000000005754660fc9c40a00000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -8730,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec3400000000000000000000000086d7c37933ab22ee4a744dcdb12ca7c6c57b593100000000000000000000000086d7c37933ab22ee4a744dcdb12ca7c6c57b593100000000000000000000000000000000000000000000000000a5fd5da26c4ddd00000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -8731,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec34000000000000000000000000964ac758e00402b2b590fc5e75cb72c4fc0ebe74000000000000000000000000964ac758e00402b2b590fc5e75cb72c4fc0ebe74000000000000000000000000000000000000000000000000005ec2d61a8591f700000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -8732,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec34000000000000000000000000702580f7ab23fd4f9d739180b852b8ea7881a1fb000000000000000000000000702580f7ab23fd4f9d739180b852b8ea7881a1fb000000000000000000000000000000000000000000000000003784f42f8ea96a00000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -8733,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec34000000000000000000000000d51c508f3e3e2e34fb35919a7fe932634b2f1b2f000000000000000000000000d51c508f3e3e2e34fb35919a7fe932634b2f1b2f000000000000000000000000000000000000000000000000009d5aa83ef6c73000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -8734,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec34000000000000000000000000311c13e8ccab5b3af959ad4aa95c612920f615c2000000000000000000000000311c13e8ccab5b3af959ad4aa95c612920f615c20000000000000000000000000000000000000000000000000039b46ac9c590af00000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,0x02e05057db4eb8079b3762e7cde25832188c2bb9869c5dfde2268842aee43d46,2022-05-09 05:59:17.000 UTC,0,true -8735,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec34000000000000000000000000f1a5161d604d7348d7f5c534517b5404a8edefe4000000000000000000000000f1a5161d604d7348d7f5c534517b5404a8edefe400000000000000000000000000000000000000000000000001602849c120640000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -8737,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec3400000000000000000000000042c3f118eae67ff35d7f81d00b15241e02a8378c00000000000000000000000042c3f118eae67ff35d7f81d00b15241e02a8378c000000000000000000000000000000000000000000000000001550f7dca7000000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -8738,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec340000000000000000000000005ee68feb9c2e9619b57ea15c5274fb153e0927f40000000000000000000000005ee68feb9c2e9619b57ea15c5274fb153e0927f40000000000000000000000000000000000000000000000000011c37937e0800000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -8739,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec3400000000000000000000000081114446302eb82364ebe39b218fb8d4ea52607d00000000000000000000000081114446302eb82364ebe39b218fb8d4ea52607d0000000000000000000000000000000000000000000000000011c37937e0800000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -8740,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec3400000000000000000000000062d2db1dc5376850241cfc3dbc0990632df277e500000000000000000000000062d2db1dc5376850241cfc3dbc0990632df277e50000000000000000000000000000000000000000000000000011c37937e0800000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -8741,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec340000000000000000000000006be86b163524c2e541865547caf732ed831f30120000000000000000000000006be86b163524c2e541865547caf732ed831f30120000000000000000000000000000000000000000000000000011c37937e0800000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -8742,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec3400000000000000000000000053670d5c5f55355dc72a718ad6b06f1d114ca49500000000000000000000000053670d5c5f55355dc72a718ad6b06f1d114ca4950000000000000000000000000000000000000000000000000011c37937e0800000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -8744,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec34000000000000000000000000c83852e1290e2a573d2dc8571d51c1b26fa3f7c9000000000000000000000000c83852e1290e2a573d2dc8571d51c1b26fa3f7c90000000000000000000000000000000000000000000000000060a3dda142a9f200000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -8746,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec3400000000000000000000000069f21a1f0328016ae026896957b05e27ec33db9900000000000000000000000069f21a1f0328016ae026896957b05e27ec33db9900000000000000000000000000000000000000000000000000038d7ea4c6800000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -8747,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec34000000000000000000000000febd841555eb34de9b082a9f43ae6b12e408de48000000000000000000000000febd841555eb34de9b082a9f43ae6b12e408de480000000000000000000000000000000000000000000000000004ab9bdd3ebec000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -8749,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec340000000000000000000000009da2ee83b7eac61783c6b60c553cebcad934a4950000000000000000000000009da2ee83b7eac61783c6b60c553cebcad934a49500000000000000000000000000000000000000000000000000038d7ea4c6800000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -8750,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec34000000000000000000000000e09a92b75b32f7a9faca607b15823952dcdef354000000000000000000000000e09a92b75b32f7a9faca607b15823952dcdef35400000000000000000000000000000000000000000000000000005af3107a400000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -8755,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec34000000000000000000000000d7bd5f4d7e13b11b948f7cc90cb4f2128c31c9b2000000000000000000000000d7bd5f4d7e13b11b948f7cc90cb4f2128c31c9b2000000000000000000000000000000000000000000000000003a9ea99ecb400000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -8756,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec34000000000000000000000000ae39869ed77d33f4a25aee3e47946249539f21ce000000000000000000000000ae39869ed77d33f4a25aee3e47946249539f21ce000000000000000000000000000000000000000000000000000e8fc29351fb0000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -8758,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec340000000000000000000000005150fe3c1407fe9ccc2821feb94cf7dd6ca789c80000000000000000000000005150fe3c1407fe9ccc2821feb94cf7dd6ca789c800000000000000000000000000000000000000000000000000005af3107a400000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -8760,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec34000000000000000000000000682668912cb71471b87733e95a6d51af2d3b1da8000000000000000000000000682668912cb71471b87733e95a6d51af2d3b1da8000000000000000000000000000000000000000000000000005dafbf922d05cf00000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -8767,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec340000000000000000000000009634388afb4ed1aa04be2231866811b01f43a2910000000000000000000000009634388afb4ed1aa04be2231866811b01f43a2910000000000000000000000000000000000000000000000000011c37937e0800000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -8768,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec34000000000000000000000000024f36b02608a5129c61f8df54dc7286f9113dee000000000000000000000000024f36b02608a5129c61f8df54dc7286f9113dee00000000000000000000000000000000000000000000000002d9b3d0462f075700000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -8770,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec34000000000000000000000000555860b9cc8a1d1e9e48538c8c6d8b85300a77c5000000000000000000000000555860b9cc8a1d1e9e48538c8c6d8b85300a77c50000000000000000000000000000000000000000000000000000000005f5e10000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -8771,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec34000000000000000000000000711a1e1cd8da2d5c4f46118c1a1373e9d2610d04000000000000000000000000711a1e1cd8da2d5c4f46118c1a1373e9d2610d04000000000000000000000000000000000000000000000000000e35fa931a000000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -8774,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec34000000000000000000000000a8eac5592228f1108fd4a488bd13d2201268cc3f000000000000000000000000a8eac5592228f1108fd4a488bd13d2201268cc3f00000000000000000000000000000000000000000000000000753d533d96800000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -8776,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec340000000000000000000000001071a56413701b104f35fcd0a94822457e5121140000000000000000000000001071a56413701b104f35fcd0a94822457e51211400000000000000000000000000000000000000000000000003bb935379282d1500000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -8777,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec340000000000000000000000009a2d82e134fd7b79cb0445a8f5f0afab34760a530000000000000000000000009a2d82e134fd7b79cb0445a8f5f0afab34760a5300000000000000000000000000000000000000000000000000005af3107a400000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -8778,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec34000000000000000000000000d637b55735c538072d2da83c7bf154b46cb1ad98000000000000000000000000d637b55735c538072d2da83c7bf154b46cb1ad9800000000000000000000000000000000000000000000000000b1a2bc2ec5000000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,0x1b1eccb05fbe31b5bb02cbba0a6fdc3daee5f09201cbd27344a9020ea479c1fd,2022-02-21 06:33:59.000 UTC,0,true -8779,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec34000000000000000000000000e06cdcae2113a6a14ca994fff730a6de1b7edca9000000000000000000000000e06cdcae2113a6a14ca994fff730a6de1b7edca9000000000000000000000000000000000000000000000000002386f26fc1000000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -8780,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec340000000000000000000000008f0d3e8bcf90fc2bd9d5aba1458daf4965f85d0a0000000000000000000000008f0d3e8bcf90fc2bd9d5aba1458daf4965f85d0a0000000000000000000000000000000000000000000000000060a2fcc2e1f6cc00000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,0xe2bc66479b1a42c75600c0215cb1609ef3813485ecd1053310d29ee5bcfabc40,2022-03-12 07:48:53.000 UTC,0,true -8781,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec340000000000000000000000007f9cc0aef516e99dd66a6b75bbc719db95d05fc40000000000000000000000007f9cc0aef516e99dd66a6b75bbc719db95d05fc40000000000000000000000000000000000000000000000000001c6bf5263400000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -8782,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0xa9f9e675000000000000000000000000dac17f958d2ee523a2206206994597c13d831ec700000000000000000000000094b008aa00579c1307b0ef2c499ad98a8ce58e5800000000000000000000000019cbda26aba474b7367b9a71ab58f9838435c60600000000000000000000000019cbda26aba474b7367b9a71ab58f9838435c60600000000000000000000000000000000000000000000000000000000004c4b4000000000000000000000000000000000000000000000000000000000000000c00000000000000000000000000000000000000000000000000000000000000000,,,1,true -8783,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec34000000000000000000000000268a743f3e052a91363dc1ca330e9e772a27bf8a000000000000000000000000268a743f3e052a91363dc1ca330e9e772a27bf8a0000000000000000000000000000000000000000000000000025d7a027526b1d00000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -8784,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec34000000000000000000000000bfdff69e12c0cc9dcd14188a247dfe4763d0ee56000000000000000000000000bfdff69e12c0cc9dcd14188a247dfe4763d0ee56000000000000000000000000000000000000000000000000000000e8d4a5100000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -8785,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec34000000000000000000000000864fa05ae397ce827b1d7fc70a962b9af3c819ef000000000000000000000000864fa05ae397ce827b1d7fc70a962b9af3c819ef000000000000000000000000000000000000000000000000000000e8d4a5100000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -8786,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec3400000000000000000000000020e3dab8c6d71932077eef37da9267aeef3206ab00000000000000000000000020e3dab8c6d71932077eef37da9267aeef3206ab000000000000000000000000000000000000000000000000000000e8d4a5100000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -8787,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec34000000000000000000000000c924f2e488fea9e7e1b6243dac0097254a61140f000000000000000000000000c924f2e488fea9e7e1b6243dac0097254a61140f000000000000000000000000000000000000000000000000000000e8d4a5100000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -8788,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec3400000000000000000000000091587456d06fbb36a522b7bb4887f8892a30535100000000000000000000000091587456d06fbb36a522b7bb4887f8892a305351000000000000000000000000000000000000000000000000000000e8d4a5100000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -8789,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec34000000000000000000000000b62a725a00f98955f81cd0c63f9cc0431b7c597e000000000000000000000000b62a725a00f98955f81cd0c63f9cc0431b7c597e00000000000000000000000000000000000000000000000002c2bd689af9490000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -8790,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec34000000000000000000000000e28c5ef710db84fd95298abbbb50f07d97bc235a000000000000000000000000e28c5ef710db84fd95298abbbb50f07d97bc235a000000000000000000000000000000000000000000000000000000e8d4a5100000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -8791,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec340000000000000000000000005ba556f042776d8c590b1c6da6122511f36258e80000000000000000000000005ba556f042776d8c590b1c6da6122511f36258e8000000000000000000000000000000000000000000000000000000e8d4a5100000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -8792,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec3400000000000000000000000019f6d81ca164ab9b2b9b20a0a854b06ce425621700000000000000000000000019f6d81ca164ab9b2b9b20a0a854b06ce4256217000000000000000000000000000000000000000000000000000000e8d4a5100000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -8793,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec34000000000000000000000000baacf9486835683a8e7ee0e528bb5117fab98671000000000000000000000000baacf9486835683a8e7ee0e528bb5117fab986710000000000000000000000000000000000000000000000000011c37937e0800000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -8794,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec34000000000000000000000000a728f11510ec1ec8421f3962ea5ffc936f6650d6000000000000000000000000a728f11510ec1ec8421f3962ea5ffc936f6650d600000000000000000000000000000000000000000000000000071afd498d000000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -8795,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec34000000000000000000000000a1db64fc6151f7985c8b9df32503a2b9a4125752000000000000000000000000a1db64fc6151f7985c8b9df32503a2b9a4125752000000000000000000000000000000000000000000000000011dd8269942589100000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -8796,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec34000000000000000000000000e50dd0bfc9c4dec6d9206be428414322dc9cabe4000000000000000000000000e50dd0bfc9c4dec6d9206be428414322dc9cabe4000000000000000000000000000000000000000000000000000000e8d4a5100000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -8797,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec34000000000000000000000000b035b9678bf874b3cb91c64bdcc9a95b4b3ffb28000000000000000000000000b035b9678bf874b3cb91c64bdcc9a95b4b3ffb28000000000000000000000000000000000000000000000000000000e8d4a5100000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -8798,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec34000000000000000000000000bbb40b4b71d5ff88199f5279df505eac4eab434c000000000000000000000000bbb40b4b71d5ff88199f5279df505eac4eab434c000000000000000000000000000000000000000000000000000000e8d4a5100000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -8799,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec34000000000000000000000000bca46727116c2fbb2284c49bba696f40749cd341000000000000000000000000bca46727116c2fbb2284c49bba696f40749cd341000000000000000000000000000000000000000000000000000000e8d4a5100000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -8800,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec34000000000000000000000000a310038314884dea1f909a13539bcef7f5a06111000000000000000000000000a310038314884dea1f909a13539bcef7f5a06111000000000000000000000000000000000000000000000000000000e8d4a5100000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -8801,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0xa9f9e675000000000000000000000000a0b86991c6218b36c1d19d4a2e9eb0ce3606eb480000000000000000000000007f5c764cbc14f9669b88837ca1490cca17c3160700000000000000000000000031f2a75c0c79dbc7537d2b9687f74e90aa6503a000000000000000000000000031f2a75c0c79dbc7537d2b9687f74e90aa6503a00000000000000000000000000000000000000000000000000000000006d53b9500000000000000000000000000000000000000000000000000000000000000c00000000000000000000000000000000000000000000000000000000000000000,,,1,true -8802,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec34000000000000000000000000d2d755c62aa4d9493808b62d68939b1e095dfb4c000000000000000000000000d2d755c62aa4d9493808b62d68939b1e095dfb4c00000000000000000000000000000000000000000000000000201f184922d81b00000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -8803,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec34000000000000000000000000423db69b9161fb4697d002bce6934682472cf34f000000000000000000000000423db69b9161fb4697d002bce6934682472cf34f000000000000000000000000000000000000000000000000000000e8d4a5100000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -8804,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec340000000000000000000000007276fe1c8f90f47b3c5d63a63f5b28f2b346e1640000000000000000000000007276fe1c8f90f47b3c5d63a63f5b28f2b346e16400000000000000000000000000000000000000000000000000858ce2bb7fcbf400000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -8805,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec340000000000000000000000004db1c1a03e80b340a230425f598ab0583661ad1d0000000000000000000000004db1c1a03e80b340a230425f598ab0583661ad1d000000000000000000000000000000000000000000000000000000e8d4a5100000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -8806,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec34000000000000000000000000e655016b2183dee463197f0c176eafe14bbfc304000000000000000000000000e655016b2183dee463197f0c176eafe14bbfc3040000000000000000000000000000000000000000000000000000a04e793e018000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -8807,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec3400000000000000000000000094790546b7e618f86148da978035846d24da670200000000000000000000000094790546b7e618f86148da978035846d24da6702000000000000000000000000000000000000000000000000000000e8d4a5100000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -8808,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec340000000000000000000000009c22c8a0d3027fb01ab0248353b9616446cd40e80000000000000000000000009c22c8a0d3027fb01ab0248353b9616446cd40e8000000000000000000000000000000000000000000000000000000e8d4a5100000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -8809,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec34000000000000000000000000ca04f881b6c5524465b4334c0d175ad88d49a555000000000000000000000000ca04f881b6c5524465b4334c0d175ad88d49a55500000000000000000000000000000000000000000000000000a22c59e441574200000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -8810,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec3400000000000000000000000014d2eb90a237990132cce5b398d3ce0b382d4f8700000000000000000000000014d2eb90a237990132cce5b398d3ce0b382d4f87000000000000000000000000000000000000000000000000000000e8d4a5100000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -8811,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec340000000000000000000000000f474f2ae653064a1619da919d85a9003151ab5c0000000000000000000000000f474f2ae653064a1619da919d85a9003151ab5c000000000000000000000000000000000000000000000000000000e8d4a5100000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -8812,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec34000000000000000000000000353e21433a5d15774c1689119922b68d0db9ec66000000000000000000000000353e21433a5d15774c1689119922b68d0db9ec66000000000000000000000000000000000000000000000000000000e8d4a5100000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -8813,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec340000000000000000000000007aad778f6de4d7fda0001ebe559103ad76e1486f0000000000000000000000007aad778f6de4d7fda0001ebe559103ad76e1486f000000000000000000000000000000000000000000000000000000e8d4a5100000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -8814,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec34000000000000000000000000e98a63a88d50a88ffe83c2d553e1a8b0ece0d035000000000000000000000000e98a63a88d50a88ffe83c2d553e1a8b0ece0d035000000000000000000000000000000000000000000000000000000e8d4a5100000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -8815,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec340000000000000000000000003878c9ba53af40037271b076411a95e86378f7ed0000000000000000000000003878c9ba53af40037271b076411a95e86378f7ed000000000000000000000000000000000000000000000000000000e8d4a5100000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -8816,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec34000000000000000000000000370645b655fa20f247411b323cc5c7824e1193f3000000000000000000000000370645b655fa20f247411b323cc5c7824e1193f3000000000000000000000000000000000000000000000000000000e8d4a5100000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -8817,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec3400000000000000000000000012970106add28486a63ed6deef4f0076ddc50aa200000000000000000000000012970106add28486a63ed6deef4f0076ddc50aa20000000000000000000000000000000000000000000000000069a5be3cf9ec0000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -8818,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec34000000000000000000000000286dcfcd06c5575fa64dd1eb94d2d9587196d4c0000000000000000000000000286dcfcd06c5575fa64dd1eb94d2d9587196d4c0000000000000000000000000000000000000000000000000000000e8d4a5100000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -8819,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec340000000000000000000000001c86e28d27f4a5655acf0a94fafcfec394d4fa990000000000000000000000001c86e28d27f4a5655acf0a94fafcfec394d4fa99000000000000000000000000000000000000000000000000000000e8d4a5100000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -8820,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec340000000000000000000000006df1eaf904462ab2c27ce1290dc9819ea01f52490000000000000000000000006df1eaf904462ab2c27ce1290dc9819ea01f5249000000000000000000000000000000000000000000000000000000e8d4a5100000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -8821,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec34000000000000000000000000126413913ef8735a58d4763613e473cd3320846a000000000000000000000000126413913ef8735a58d4763613e473cd3320846a0000000000000000000000000000000000000000000000000160991de843a70000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -8823,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec34000000000000000000000000e67911a7c234e7813f654fdb20a31deb2ad4c415000000000000000000000000e67911a7c234e7813f654fdb20a31deb2ad4c415000000000000000000000000000000000000000000000000000000e8d4a5100000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -8824,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec3400000000000000000000000027733dedd8ce55de434a80df65e161aa39d7b73500000000000000000000000027733dedd8ce55de434a80df65e161aa39d7b735000000000000000000000000000000000000000000000000015f9e40d01b840000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -8825,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec34000000000000000000000000911769d523e8e51819525db932f8822174009777000000000000000000000000911769d523e8e51819525db932f88221740097770000000000000000000000000000000000000000000000000063a07fdcffe0cc00000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -8826,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec340000000000000000000000006646ad58d4b213f59abf859b85b0ac68c05ec1440000000000000000000000006646ad58d4b213f59abf859b85b0ac68c05ec144000000000000000000000000000000000000000000000000000000e8d4a5100000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -8827,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec340000000000000000000000006b90bd5489126d80f5aa021880e30297c35d964a0000000000000000000000006b90bd5489126d80f5aa021880e30297c35d964a000000000000000000000000000000000000000000000000000000e8d4a5100000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -8828,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec3400000000000000000000000074a6263578c5b9fd42fa7afeff1ca52d04e90e3600000000000000000000000074a6263578c5b9fd42fa7afeff1ca52d04e90e36000000000000000000000000000000000000000000000000000000e8d4a5100000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -8829,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec34000000000000000000000000365883c5d9ae80760d8b3296d11cb33cfe53ab24000000000000000000000000365883c5d9ae80760d8b3296d11cb33cfe53ab24000000000000000000000000000000000000000000000000000000e8d4a5100000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -8830,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec340000000000000000000000004c2095fc42ef164f317a0b93835a052acf03fd3e0000000000000000000000004c2095fc42ef164f317a0b93835a052acf03fd3e000000000000000000000000000000000000000000000000000000e8d4a5100000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -8831,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec34000000000000000000000000daf0910920f4bbc5ccfb70b3e9db797959ba0674000000000000000000000000daf0910920f4bbc5ccfb70b3e9db797959ba0674000000000000000000000000000000000000000000000000000000e8d4a5100000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -8832,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec34000000000000000000000000dd72ad6175868a55f4508c6973223ea7795f7121000000000000000000000000dd72ad6175868a55f4508c6973223ea7795f7121000000000000000000000000000000000000000000000000000000e8d4a5100000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -8833,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0xa9f9e675000000000000000000000000dac17f958d2ee523a2206206994597c13d831ec700000000000000000000000094b008aa00579c1307b0ef2c499ad98a8ce58e580000000000000000000000000f1a011fbfb9911ab2bb6bdba208e5892579c8b50000000000000000000000000f1a011fbfb9911ab2bb6bdba208e5892579c8b50000000000000000000000000000000000000000000000000000000059452fa300000000000000000000000000000000000000000000000000000000000000c00000000000000000000000000000000000000000000000000000000000000000,,,1,true -8834,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec3400000000000000000000000044836f9fd50a63a609e88c4d225570f6592509ac00000000000000000000000044836f9fd50a63a609e88c4d225570f6592509ac0000000000000000000000000000000000000000000000000011c37937e0800000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -8835,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec34000000000000000000000000a5f5e1a2e17e680476eefff135a7f9ab87c2e9f5000000000000000000000000a5f5e1a2e17e680476eefff135a7f9ab87c2e9f50000000000000000000000000000000000000000000000000057a8d0410268f600000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -8836,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec340000000000000000000000006f164b1818c1a1ef344a15124c5dd769071460e90000000000000000000000006f164b1818c1a1ef344a15124c5dd769071460e9000000000000000000000000000000000000000000000000002386f26fc1000000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -8837,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec340000000000000000000000008999938863f37c05c4ebb1752ab9987aa565b3fd0000000000000000000000008999938863f37c05c4ebb1752ab9987aa565b3fd00000000000000000000000000000000000000000000000000516fb6636c529300000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -8838,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec340000000000000000000000000f1a011fbfb9911ab2bb6bdba208e5892579c8b50000000000000000000000000f1a011fbfb9911ab2bb6bdba208e5892579c8b5000000000000000000000000000000000000000000000000013fbe85edc9000000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -8839,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec340000000000000000000000003f9654f52b3ed762bc07bdd01c592a95b28d5ba40000000000000000000000003f9654f52b3ed762bc07bdd01c592a95b28d5ba4000000000000000000000000000000000000000000000000000000e8d4a5100000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -8840,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec3400000000000000000000000015d1eba25db9075c87afb1055c84e1259228566c00000000000000000000000015d1eba25db9075c87afb1055c84e1259228566c0000000000000000000000000000000000000000000000000013891ef3f7601200000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -8841,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec34000000000000000000000000249f752c53dbf2486a57678b95f0f200d06a9913000000000000000000000000249f752c53dbf2486a57678b95f0f200d06a9913000000000000000000000000000000000000000000000000000000e8d4a5100000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -8842,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec3400000000000000000000000036d5ed41f464e19a48db0559d89eea3f8861916100000000000000000000000036d5ed41f464e19a48db0559d89eea3f88619161000000000000000000000000000000000000000000000000000000e8d4a5100000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -8843,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec340000000000000000000000000a72e92738e6a667a063d8c042a9495cb9d732b70000000000000000000000000a72e92738e6a667a063d8c042a9495cb9d732b7000000000000000000000000000000000000000000000000000000e8d4a5100000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -8844,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec3400000000000000000000000041926365e4c9ea29d6905932043c1573e4d7cc8600000000000000000000000041926365e4c9ea29d6905932043c1573e4d7cc86000000000000000000000000000000000000000000000000000000e8d4a5100000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -8845,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec340000000000000000000000008854c59ba3416f09c87a26f7a93edc1f756574b40000000000000000000000008854c59ba3416f09c87a26f7a93edc1f756574b40000000000000000000000000000000000000000000000000058191e8324d6f400000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -8846,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec34000000000000000000000000a9e2cc6ec8cba89ce3231bcc6735afc099fb7e30000000000000000000000000a9e2cc6ec8cba89ce3231bcc6735afc099fb7e30000000000000000000000000000000000000000000000000000000e8d4a5100000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -8848,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec340000000000000000000000006f8798c9d86543c8fb222660d1246e4bf83f03d40000000000000000000000006f8798c9d86543c8fb222660d1246e4bf83f03d400000000000000000000000000000000000000000000000000601779a9aecd3a00000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,0x01b97acd33224dfa3d9cc03c644d6b2e2bf9730046d7bf54fd2f5963b5056414,2022-03-12 07:57:19.000 UTC,0,true -8850,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec340000000000000000000000004f38b00150550d4acc65f55c566fab97a7e3aa090000000000000000000000004f38b00150550d4acc65f55c566fab97a7e3aa0900000000000000000000000000000000000000000000000001579f09689b637200000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -8851,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec3400000000000000000000000030988a15f85640e1bed9a61bdb85d13fa35d11d300000000000000000000000030988a15f85640e1bed9a61bdb85d13fa35d11d3000000000000000000000000000000000000000000000000000000e8d4a5100000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -8852,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec340000000000000000000000009e4e9e3e80144c274c324597ae9cc2f29e99bd610000000000000000000000009e4e9e3e80144c274c324597ae9cc2f29e99bd61000000000000000000000000000000000000000000000000000000e8d4a5100000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -8853,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec340000000000000000000000008be5f5b6428f9cb2d8753881d7f48507684f90510000000000000000000000008be5f5b6428f9cb2d8753881d7f48507684f905100000000000000000000000000000000000000000000000000005af3107a400000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -8855,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec34000000000000000000000000a13e0359ceeb8724b620a63c19c21d88ec48cc1a000000000000000000000000a13e0359ceeb8724b620a63c19c21d88ec48cc1a000000000000000000000000000000000000000000000000000000e8d4a5100000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -8856,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec34000000000000000000000000e3f33164c5a61069f24dc99dc454795be210ff51000000000000000000000000e3f33164c5a61069f24dc99dc454795be210ff51000000000000000000000000000000000000000000000000000000e8d4a5100000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -8857,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec340000000000000000000000005a99223e73a879d347ef018f580ac524fcc356690000000000000000000000005a99223e73a879d347ef018f580ac524fcc35669000000000000000000000000000000000000000000000000000000e8d4a5100000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -8858,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec34000000000000000000000000866b95fc824ba7e0419336cb92e754db15b29a0b000000000000000000000000866b95fc824ba7e0419336cb92e754db15b29a0b0000000000000000000000000000000000000000000000000009e0a2c5d8c76200000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -8859,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec34000000000000000000000000be57fc806770cc832124a18daee0db1c9fd50b37000000000000000000000000be57fc806770cc832124a18daee0db1c9fd50b37000000000000000000000000000000000000000000000000000000e8d4a5100000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -8860,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec340000000000000000000000006af2c7083249beb46d6ced78b52deae781a6fd520000000000000000000000006af2c7083249beb46d6ced78b52deae781a6fd52000000000000000000000000000000000000000000000000000000e8d4a5100000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -8861,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0xa9f9e675000000000000000000000000a0b86991c6218b36c1d19d4a2e9eb0ce3606eb480000000000000000000000007f5c764cbc14f9669b88837ca1490cca17c31607000000000000000000000000c344f940332d3aa76e4f20d7352aaf086480111f000000000000000000000000c344f940332d3aa76e4f20d7352aaf086480111f0000000000000000000000000000000000000000000000000000000131cf5b9c00000000000000000000000000000000000000000000000000000000000000c00000000000000000000000000000000000000000000000000000000000000000,,,1,true -8863,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec34000000000000000000000000175099aff5a2c7ce22b2b0884cf53b1cb661525f000000000000000000000000175099aff5a2c7ce22b2b0884cf53b1cb661525f000000000000000000000000000000000000000000000000000000e8d4a5100000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -8864,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec34000000000000000000000000322403c2a3281aad788910ff8d8139fc4c790fe5000000000000000000000000322403c2a3281aad788910ff8d8139fc4c790fe5000000000000000000000000000000000000000000000000001142ca2b96b69100000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -8865,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec340000000000000000000000005b231eca44fb2002a24f9579ddaf2d7d263d1f350000000000000000000000005b231eca44fb2002a24f9579ddaf2d7d263d1f35000000000000000000000000000000000000000000000000000000e8d4a5100000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -8866,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec3400000000000000000000000010fce6f17d33dca4eb13cf2447b7dfce7588d68c00000000000000000000000010fce6f17d33dca4eb13cf2447b7dfce7588d68c000000000000000000000000000000000000000000000000000000174876e80000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -8867,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec34000000000000000000000000bcb0f53f0dfac2de3d050ed8136f20298611e3ee000000000000000000000000bcb0f53f0dfac2de3d050ed8136f20298611e3ee000000000000000000000000000000000000000000000000000000174876e80000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -8868,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec340000000000000000000000003f78da5055cc38971f93918de4760403f9cc80e40000000000000000000000003f78da5055cc38971f93918de4760403f9cc80e4000000000000000000000000000000000000000000000000000000174876e80000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -8869,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec340000000000000000000000007ea88468068108c07ccabccf7794c390998c6f8b0000000000000000000000007ea88468068108c07ccabccf7794c390998c6f8b000000000000000000000000000000000000000000000000000000174876e80000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -8870,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0xa9f9e675000000000000000000000000a0b86991c6218b36c1d19d4a2e9eb0ce3606eb480000000000000000000000007f5c764cbc14f9669b88837ca1490cca17c316070000000000000000000000005ed6a87517914eb67cce0930fed72e61ce2d64450000000000000000000000005ed6a87517914eb67cce0930fed72e61ce2d6445000000000000000000000000000000000000000000000000000000000058159c00000000000000000000000000000000000000000000000000000000000000c00000000000000000000000000000000000000000000000000000000000000000,,,1,true -8871,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec34000000000000000000000000196d70d55142d3510a9206501e5c818a6287abcd000000000000000000000000196d70d55142d3510a9206501e5c818a6287abcd000000000000000000000000000000000000000000000000000000174876e80000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -8872,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec34000000000000000000000000e1d66a314eee0e0ba234b935181c9ce0cc265c93000000000000000000000000e1d66a314eee0e0ba234b935181c9ce0cc265c93000000000000000000000000000000000000000000000000000000174876e80000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -8873,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec3400000000000000000000000045fbece740f52641d32b99bd97d2765462ab437d00000000000000000000000045fbece740f52641d32b99bd97d2765462ab437d000000000000000000000000000000000000000000000000000000174876e80000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -8874,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec34000000000000000000000000c2489676b3acfd19deb01c01c264db83b789e6c8000000000000000000000000c2489676b3acfd19deb01c01c264db83b789e6c80000000000000000000000000000000000000000000000000059e801176e7b6700000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -8875,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec34000000000000000000000000da3d001988a48a34bdb3c940c83bd420fc187d82000000000000000000000000da3d001988a48a34bdb3c940c83bd420fc187d82000000000000000000000000000000000000000000000000000000174876e80000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -8876,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec34000000000000000000000000eaadabcc0c849a514372d4717e87c0a69dd4d571000000000000000000000000eaadabcc0c849a514372d4717e87c0a69dd4d571000000000000000000000000000000000000000000000000000000174876e80000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -8877,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec34000000000000000000000000077f30de8d26c4050f7b158c93472d8900b2d8f4000000000000000000000000077f30de8d26c4050f7b158c93472d8900b2d8f4000000000000000000000000000000000000000000000000000000174876e80000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -8878,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec34000000000000000000000000bea93b95f66a229b1760bb5390d7bbe99429893c000000000000000000000000bea93b95f66a229b1760bb5390d7bbe99429893c000000000000000000000000000000000000000000000000000000174876e80000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -8880,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec340000000000000000000000007fccaa885bf22d3f343611f28313f900d9e1761d0000000000000000000000007fccaa885bf22d3f343611f28313f900d9e1761d000000000000000000000000000000000000000000000000000000174876e80000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -8881,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec34000000000000000000000000f924e374699737ab57e42207a7c4003c09320f64000000000000000000000000f924e374699737ab57e42207a7c4003c09320f640000000000000000000000000000000000000000000000000011c37937e0800000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -8882,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec3400000000000000000000000092e0c901a768a4998f45eb746e37fdf75ae80d1400000000000000000000000092e0c901a768a4998f45eb746e37fdf75ae80d14000000000000000000000000000000000000000000000000000000174876e80000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -8884,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec34000000000000000000000000ffe48f83372f528dd649c162c28175bb5bebce9c000000000000000000000000ffe48f83372f528dd649c162c28175bb5bebce9c000000000000000000000000000000000000000000000000008526e8978f117900000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -8885,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec34000000000000000000000000c04f345d5a50fe433de3235ca88333aba11b90a7000000000000000000000000c04f345d5a50fe433de3235ca88333aba11b90a7000000000000000000000000000000000000000000000000000000174876e80000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -8886,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec34000000000000000000000000fba243e2fd77d4100ca89aacc42b6968db695be2000000000000000000000000fba243e2fd77d4100ca89aacc42b6968db695be2000000000000000000000000000000000000000000000000000000174876e80000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -8887,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec34000000000000000000000000bf237300b8901169f8729ca0dc46a19d2a452a1b000000000000000000000000bf237300b8901169f8729ca0dc46a19d2a452a1b000000000000000000000000000000000000000000000000000000174876e80000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -8888,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec34000000000000000000000000c293b5cd5b02567977497984357394a90ed0f98e000000000000000000000000c293b5cd5b02567977497984357394a90ed0f98e0000000000000000000000000000000000000000000000000002fbcb4c645d0000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -8889,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec3400000000000000000000000041aacbff90f535abfbae4146a425dc27353a685c00000000000000000000000041aacbff90f535abfbae4146a425dc27353a685c000000000000000000000000000000000000000000000000000000174876e80000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -8890,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec34000000000000000000000000fa750efd7cd4af96172c906e30c13c535a0d706f000000000000000000000000fa750efd7cd4af96172c906e30c13c535a0d706f000000000000000000000000000000000000000000000000000000174876e80000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -8891,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec34000000000000000000000000a810f3441b89d370b36d9eea0dd8c614f102b687000000000000000000000000a810f3441b89d370b36d9eea0dd8c614f102b687000000000000000000000000000000000000000000000000000000174876e80000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -8892,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec340000000000000000000000008ea52f410e8374e1e97c5f200c0c2eb11bae49220000000000000000000000008ea52f410e8374e1e97c5f200c0c2eb11bae4922000000000000000000000000000000000000000000000000000000174876e80000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -8893,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec34000000000000000000000000e9eb8da6832be27b8ae4176f2ee91ed55a86c50d000000000000000000000000e9eb8da6832be27b8ae4176f2ee91ed55a86c50d000000000000000000000000000000000000000000000000000000174876e80000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -8894,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec34000000000000000000000000a59aad96fbcaaa2c04e18c6cf63921b216171c33000000000000000000000000a59aad96fbcaaa2c04e18c6cf63921b216171c33000000000000000000000000000000000000000000000000005fc9e6cf2323ab00000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,0x5079d84bbf013de8a66ad0cb776045fc62ea09d43b11d654a5cd801ef297f4a6,2022-03-12 08:04:08.000 UTC,0,true -8896,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec340000000000000000000000005d6a6cefb6505f5c0f68391a15da873a5924a6cc0000000000000000000000005d6a6cefb6505f5c0f68391a15da873a5924a6cc00000000000000000000000000000000000000000000000001600ac3d646900000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -8897,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec340000000000000000000000002119498db925ca740e32f2d8aca72baa05eadef00000000000000000000000002119498db925ca740e32f2d8aca72baa05eadef0000000000000000000000000000000000000000000000000000000174876e80000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -8898,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec3400000000000000000000000093498bf17fa04b8d331d863edc350f596396802900000000000000000000000093498bf17fa04b8d331d863edc350f5963968029000000000000000000000000000000000000000000000000000000174876e80000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -8899,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec340000000000000000000000007e12eb4fc9e44180942875aae0599c1c0739a96f0000000000000000000000007e12eb4fc9e44180942875aae0599c1c0739a96f000000000000000000000000000000000000000000000000003ccab5584f19ca00000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -8900,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec3400000000000000000000000069a38f5bedf8ef24ccd1a8f7c68b88921d663ecc00000000000000000000000069a38f5bedf8ef24ccd1a8f7c68b88921d663ecc000000000000000000000000000000000000000000000000000000174876e80000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -8901,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec34000000000000000000000000f69191567b0140cdfd3014218d8198fff5ae1d0f000000000000000000000000f69191567b0140cdfd3014218d8198fff5ae1d0f00000000000000000000000000000000000000000000000000ae08a99d77710000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -8902,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec340000000000000000000000008f7c581759cf23f121af82f0415900f38ac243050000000000000000000000008f7c581759cf23f121af82f0415900f38ac243050000000000000000000000000000000000000000000000000021332e4580830200000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -8903,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec34000000000000000000000000e7e1852b2fd7598c8588435d56d9f881067955eb000000000000000000000000e7e1852b2fd7598c8588435d56d9f881067955eb0000000000000000000000000000000000000000000000000003c25c0c766f0000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -8904,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec3400000000000000000000000062875df71a7a09501db20e97988fe19d052babef00000000000000000000000062875df71a7a09501db20e97988fe19d052babef00000000000000000000000000000000000000000000000000ae7eaee232230000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -8905,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec34000000000000000000000000adbe153bda9a214d057ca9b2173130b66329e65d000000000000000000000000adbe153bda9a214d057ca9b2173130b66329e65d000000000000000000000000000000000000000000000000000000174876e80000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -8906,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec3400000000000000000000000056c10dfc9b7d713be569bee473653774d6325acd00000000000000000000000056c10dfc9b7d713be569bee473653774d6325acd0000000000000000000000000000000000000000000000000039898d61bb2c2500000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -8909,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec3400000000000000000000000066dcd3279dcba7039f4dcc5a6dc5a6c7ff3dbcbf00000000000000000000000066dcd3279dcba7039f4dcc5a6dc5a6c7ff3dbcbf00000000000000000000000000000000000000000000000000601cc915706f9f00000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -8910,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec34000000000000000000000000de3a05d226b96b39d1522cfe88fec8596bfde209000000000000000000000000de3a05d226b96b39d1522cfe88fec8596bfde2090000000000000000000000000000000000000000000000000119ff31e53128f300000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -8911,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec34000000000000000000000000bdafbeb555e9752720f8a72778c1273efa27d97d000000000000000000000000bdafbeb555e9752720f8a72778c1273efa27d97d000000000000000000000000000000000000000000000000000000174876e80000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -8912,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec340000000000000000000000005af79a5d8f099555380d4ae7b467a6e0cf35014f0000000000000000000000005af79a5d8f099555380d4ae7b467a6e0cf35014f0000000000000000000000000000000000000000000000000060be026755a9ef00000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,0x042bc55478901857d473d69418341216ee5597df3d845b1658b3f0ef80e224e5,2022-03-12 08:00:15.000 UTC,0,true -8913,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec34000000000000000000000000df4bebb2e9d31d5d3372907d3d59d10ef497449e000000000000000000000000df4bebb2e9d31d5d3372907d3d59d10ef497449e000000000000000000000000000000000000000000000000000000174876e80000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -8914,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec34000000000000000000000000021dc4d87969d1888adba243240942093c80e0fd000000000000000000000000021dc4d87969d1888adba243240942093c80e0fd000000000000000000000000000000000000000000000000000000174876e80000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -8915,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec340000000000000000000000005bc751bc8dcda36b88802727ad1ef0bb97216cc70000000000000000000000005bc751bc8dcda36b88802727ad1ef0bb97216cc700000000000000000000000000000000000000000000000000005af3107a400000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -8916,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec34000000000000000000000000df7502f3b51b488f38bfacad00a0eab5c238d4ad000000000000000000000000df7502f3b51b488f38bfacad00a0eab5c238d4ad000000000000000000000000000000000000000000000000000000174876e80000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -8917,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec34000000000000000000000000328c209ae03146f5b460f87a637968fff5c279c1000000000000000000000000328c209ae03146f5b460f87a637968fff5c279c10000000000000000000000000000000000000000000000000009e36c0f88e9c000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -8919,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec340000000000000000000000000034ea897392ee016fadaa50569247b66c5c906b0000000000000000000000000034ea897392ee016fadaa50569247b66c5c906b000000000000000000000000000000000000000000000000000000174876e80000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -8920,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec34000000000000000000000000f53159644a7939b5708cc02914553d110e7080c7000000000000000000000000f53159644a7939b5708cc02914553d110e7080c7000000000000000000000000000000000000000000000000000000174876e80000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -8921,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec340000000000000000000000002b88cb83038bd20d370df898af18b2ee21e68e430000000000000000000000002b88cb83038bd20d370df898af18b2ee21e68e43000000000000000000000000000000000000000000000000009fdf42f6e4800000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -8922,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec3400000000000000000000000069ea386172228de29c65ccf4d3a8792b1009d14700000000000000000000000069ea386172228de29c65ccf4d3a8792b1009d147000000000000000000000000000000000000000000000000000000174876e80000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -8923,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec3400000000000000000000000048a232b662951419b0385240c27908b4e3191cf200000000000000000000000048a232b662951419b0385240c27908b4e3191cf2000000000000000000000000000000000000000000000000000aa87bee53800000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -8924,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec34000000000000000000000000f2263baf15778c87a6210c5da74af291b465c021000000000000000000000000f2263baf15778c87a6210c5da74af291b465c021000000000000000000000000000000000000000000000000000000174876e80000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -8925,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec34000000000000000000000000e1a6dccbfcd05baeba7dfdbda27e56a4100cf93c000000000000000000000000e1a6dccbfcd05baeba7dfdbda27e56a4100cf93c000000000000000000000000000000000000000000000000000000174876e80000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -8926,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec340000000000000000000000009f071f182396c342e54c52b6d264c21c23a3218c0000000000000000000000009f071f182396c342e54c52b6d264c21c23a3218c000000000000000000000000000000000000000000000000000000174876e80000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -8927,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec34000000000000000000000000bc87b155e610adf3505d19f0182db2db3d8af3f1000000000000000000000000bc87b155e610adf3505d19f0182db2db3d8af3f1000000000000000000000000000000000000000000000000000000174876e80000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -8928,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec34000000000000000000000000069d2ad62ce28b648afa5f9229c15a9ace6611df000000000000000000000000069d2ad62ce28b648afa5f9229c15a9ace6611df000000000000000000000000000000000000000000000000000000174876e80000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -8929,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec3400000000000000000000000069c9e86257e0c9d26639cec3fad8f2ba0a827dae00000000000000000000000069c9e86257e0c9d26639cec3fad8f2ba0a827dae00000000000000000000000000000000000000000000000000042367a912600000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -8930,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec34000000000000000000000000799f328d9bb00045c15d68ab226c18512f67def8000000000000000000000000799f328d9bb00045c15d68ab226c18512f67def8000000000000000000000000000000000000000000000000000000174876e80000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -8931,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec34000000000000000000000000945f09790a3d310004994e23b9c0bc84629d2cf8000000000000000000000000945f09790a3d310004994e23b9c0bc84629d2cf8000000000000000000000000000000000000000000000000000000174876e80000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -8932,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec340000000000000000000000007f325ff7250180548b86b17bce8e18d8aa266c850000000000000000000000007f325ff7250180548b86b17bce8e18d8aa266c85000000000000000000000000000000000000000000000000000000174876e80000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -8933,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec34000000000000000000000000f09b73fb5831b05b1f09b78822034475a1773028000000000000000000000000f09b73fb5831b05b1f09b78822034475a1773028000000000000000000000000000000000000000000000000000000174876e80000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -8934,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec3400000000000000000000000029c81999158c10e54f87ac4e1d30c5aed4bc28ed00000000000000000000000029c81999158c10e54f87ac4e1d30c5aed4bc28ed000000000000000000000000000000000000000000000000000000174876e80000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -8935,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec34000000000000000000000000a2cdf89e1988e2d2fd31e887a7917be6fde8cb7b000000000000000000000000a2cdf89e1988e2d2fd31e887a7917be6fde8cb7b000000000000000000000000000000000000000000000000000000174876e80000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -8936,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec3400000000000000000000000042b7484733a843cc587c43aae0e3aac2b1b03cbb00000000000000000000000042b7484733a843cc587c43aae0e3aac2b1b03cbb000000000000000000000000000000000000000000000000000000174876e80000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -8938,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec340000000000000000000000008a8fca9ea97e3d6bd81173757f9824fa2b46e8e60000000000000000000000008a8fca9ea97e3d6bd81173757f9824fa2b46e8e6000000000000000000000000000000000000000000000000000000174876e80000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -8939,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec34000000000000000000000000f1fc1579e285ced99a8cdb7546d6b6829f9f197e000000000000000000000000f1fc1579e285ced99a8cdb7546d6b6829f9f197e00000000000000000000000000000000000000000000000000aedfba7ece140000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -8940,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec34000000000000000000000000f32c92f838edfe0de82e41d1619ad4b39fd8e61c000000000000000000000000f32c92f838edfe0de82e41d1619ad4b39fd8e61c000000000000000000000000000000000000000000000000016345785d8a000000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -8942,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec34000000000000000000000000162231e6e9616747983113dc4952cbfc5fce440b000000000000000000000000162231e6e9616747983113dc4952cbfc5fce440b000000000000000000000000000000000000000000000000000000174876e80000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -8943,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec3400000000000000000000000018e27597614fe3d251d91a3ff2386c8a24c5984600000000000000000000000018e27597614fe3d251d91a3ff2386c8a24c59846000000000000000000000000000000000000000000000000000000174876e80000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -8944,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec3400000000000000000000000011620e95a173280c84f46fa965d5ceb9fbf86e6500000000000000000000000011620e95a173280c84f46fa965d5ceb9fbf86e65000000000000000000000000000000000000000000000000000000174876e80000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -8945,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec34000000000000000000000000a491fc7f3e6d40a17f9c19c4b423fbe643cbe64f000000000000000000000000a491fc7f3e6d40a17f9c19c4b423fbe643cbe64f000000000000000000000000000000000000000000000000000000174876e80000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -8946,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec34000000000000000000000000105af1dcddb73a25ab4f95299766c36ba36cde06000000000000000000000000105af1dcddb73a25ab4f95299766c36ba36cde06000000000000000000000000000000000000000000000000000000174876e80000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -8949,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec34000000000000000000000000b5e9625abea5c2fcb6081d3e4007811c4933cc69000000000000000000000000b5e9625abea5c2fcb6081d3e4007811c4933cc69000000000000000000000000000000000000000000000000000110d9316ec00000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -8950,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec340000000000000000000000001279ee81560cd636eed9e97a599c765f2b3b0c900000000000000000000000001279ee81560cd636eed9e97a599c765f2b3b0c90000000000000000000000000000000000000000000000000000000e8d4a5100000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -8951,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec34000000000000000000000000cb49735d72ff7747dba184fac99ac53aa441c668000000000000000000000000cb49735d72ff7747dba184fac99ac53aa441c668000000000000000000000000000000000000000000000000003d7642229d400000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -8952,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec3400000000000000000000000004eb82de8377a63821940db41ccceabf6d48336600000000000000000000000004eb82de8377a63821940db41ccceabf6d483366000000000000000000000000000000000000000000000000000000e8d4a5100000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -8953,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec3400000000000000000000000008aa49c5de68507f98ca4f3ad95dd016cf96a2ac00000000000000000000000008aa49c5de68507f98ca4f3ad95dd016cf96a2ac0000000000000000000000000000000000000000000000000032f0aba6407a1500000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -8955,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec34000000000000000000000000e27558dd3c386c6c3990c7a60ad44efba6376f1c000000000000000000000000e27558dd3c386c6c3990c7a60ad44efba6376f1c000000000000000000000000000000000000000000000000000000e8d4a5100000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -8957,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec34000000000000000000000000400a63ed396e27b28f1eec510221085d5593e539000000000000000000000000400a63ed396e27b28f1eec510221085d5593e539000000000000000000000000000000000000000000000000000000e8d4a5100000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -8958,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec34000000000000000000000000f351bd0a80d2632b2a07d4420062aee1def17193000000000000000000000000f351bd0a80d2632b2a07d4420062aee1def17193000000000000000000000000000000000000000000000000011318133c27860a00000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -8959,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec3400000000000000000000000074a51448cadd6fe66f1d73694f13fac400062bab00000000000000000000000074a51448cadd6fe66f1d73694f13fac400062bab000000000000000000000000000000000000000000000000000000e8d4a5100000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -8960,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec3400000000000000000000000080fc9e301517ef5cb59da70a9806a8613075619000000000000000000000000080fc9e301517ef5cb59da70a9806a86130756190000000000000000000000000000000000000000000000000002386f26fc1000000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -8961,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec34000000000000000000000000c7c3b3cbb9c1dc64333ce8a715472950d096c11f000000000000000000000000c7c3b3cbb9c1dc64333ce8a715472950d096c11f000000000000000000000000000000000000000000000000000000e8d4a5100000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -8962,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec34000000000000000000000000a2df54f12d8c18e801e4cfaed6b20ac38c7073a2000000000000000000000000a2df54f12d8c18e801e4cfaed6b20ac38c7073a2000000000000000000000000000000000000000000000000000000e8d4a5100000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -8963,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec34000000000000000000000000e0e2808091ea445226d56be85aa5c8356bb6d3af000000000000000000000000e0e2808091ea445226d56be85aa5c8356bb6d3af000000000000000000000000000000000000000000000000000000e8d4a5100000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -8964,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec340000000000000000000000001b88d6d394d74c46a491d36f74f40a76dd32bbe30000000000000000000000001b88d6d394d74c46a491d36f74f40a76dd32bbe3000000000000000000000000000000000000000000000000000000e8d4a5100000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -8965,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec340000000000000000000000001f9e53485ac9bfc9d6827ee746d00b3fd5ef2caa0000000000000000000000001f9e53485ac9bfc9d6827ee746d00b3fd5ef2caa000000000000000000000000000000000000000000000000000000e8d4a5100000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -8966,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec340000000000000000000000003f158f2b5a046c2c8a7d99629f52fe0317e528ca0000000000000000000000003f158f2b5a046c2c8a7d99629f52fe0317e528ca000000000000000000000000000000000000000000000000000000e8d4a5100000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -8967,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec3400000000000000000000000060c1d1b2e4f018baf3933580642ca5364adf08c800000000000000000000000060c1d1b2e4f018baf3933580642ca5364adf08c8000000000000000000000000000000000000000000000000000000e8d4a5100000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -8968,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec34000000000000000000000000819131ed60022fd60f411f1153c7412a473cbeb0000000000000000000000000819131ed60022fd60f411f1153c7412a473cbeb0000000000000000000000000000000000000000000000000000000e8d4a5100000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -8969,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec34000000000000000000000000f76a9cfc41ef3257bb9eba87a312eae1d94cca27000000000000000000000000f76a9cfc41ef3257bb9eba87a312eae1d94cca27000000000000000000000000000000000000000000000000000429472a10bf0000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -8970,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec3400000000000000000000000043b7c3c20896476635ab7b35c73a2435de1ad68f00000000000000000000000043b7c3c20896476635ab7b35c73a2435de1ad68f000000000000000000000000000000000000000000000000000000e8d4a5100000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -8971,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec340000000000000000000000009d78787c47c16bfc36ccd1461f8afb7993badf8a0000000000000000000000009d78787c47c16bfc36ccd1461f8afb7993badf8a0000000000000000000000000000000000000000000000000003a4fe877e940000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -8972,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec340000000000000000000000003c4d43670ff357845a63c8dc62e4aee02da646bf0000000000000000000000003c4d43670ff357845a63c8dc62e4aee02da646bf000000000000000000000000000000000000000000000000002386f26fc1000000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -8973,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec34000000000000000000000000e1ded22ca713eb479bbd50c055714abcca8ca57e000000000000000000000000e1ded22ca713eb479bbd50c055714abcca8ca57e00000000000000000000000000000000000000000000000000357b931622479000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,0xc63f4172d0127c6174a09ec3d0186131be8c1aeb66327b22726f1c0f0430407b,2022-03-13 07:30:48.000 UTC,0,true -8974,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec340000000000000000000000005ccc6090d602f0c024a0c3331b1bb794659350450000000000000000000000005ccc6090d602f0c024a0c3331b1bb7946593504500000000000000000000000000000000000000000000000000033567f49d870000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -8975,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec34000000000000000000000000dd97107587e7dcaccf87e23e68d8101c089e2c6d000000000000000000000000dd97107587e7dcaccf87e23e68d8101c089e2c6d0000000000000000000000000000000000000000000000000160834d76dbfd0000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -8976,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec34000000000000000000000000549e2463558389f90b0f6d298d291d7f2ac7127a000000000000000000000000549e2463558389f90b0f6d298d291d7f2ac7127a00000000000000000000000000000000000000000000000000992f268b64e91d00000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -8977,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec3400000000000000000000000088bdeb67570c6f33d1e938f8760d0fe37570065300000000000000000000000088bdeb67570c6f33d1e938f8760d0fe37570065300000000000000000000000000000000000000000000000000071afd498d000000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -8978,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec3400000000000000000000000017183bc3e7c63eff7aed65d336142beecbb6457c00000000000000000000000017183bc3e7c63eff7aed65d336142beecbb6457c00000000000000000000000000000000000000000000000000b1a2bc2ec5000000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -8979,0x10e6593cdda8c58a1d0f14c5164b376352a55f2f,0x467194771dae2967aef3ecbedd3bf9a310c76c65,0xa9f9e6750000000000000000000000006b175474e89094c44da98b954eedeac495271d0f000000000000000000000000da10009cbd5d07dd0cecc66161fc93d7c9000da10000000000000000000000002c1aae9710c09b68f7c51d11a5ff994297d4b3880000000000000000000000002c1aae9710c09b68f7c51d11a5ff994297d4b38800000000000000000000000000000000000000000000000f005f88f8f8c1649800000000000000000000000000000000000000000000000000000000000000c00000000000000000000000000000000000000000000000000000000000000000,,,1,true -8982,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec34000000000000000000000000e834defdc52a103cb34e0871555dae81e1bcd225000000000000000000000000e834defdc52a103cb34e0871555dae81e1bcd225000000000000000000000000000000000000000000000000003ded7fdd80392800000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -8983,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec34000000000000000000000000f263f99b27e37e97720b9ddaf525b565e18a89c2000000000000000000000000f263f99b27e37e97720b9ddaf525b565e18a89c2000000000000000000000000000000000000000000000000004a9b638448800000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -8984,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec3400000000000000000000000015404b45517abf78cc4b77459c4883f551f105f300000000000000000000000015404b45517abf78cc4b77459c4883f551f105f30000000000000000000000000000000000000000000000000092ea7784b5e79000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -8985,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec3400000000000000000000000020f976206f66ef58cd27d2d11379a0666acd232300000000000000000000000020f976206f66ef58cd27d2d11379a0666acd23230000000000000000000000000000000000000000000000000082a98449da00ce00000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -8987,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec340000000000000000000000003b8d47f77c537842cfe003ffd751cbb8cf8f9f540000000000000000000000003b8d47f77c537842cfe003ffd751cbb8cf8f9f54000000000000000000000000000000000000000000000000002bce3a03f88d3e00000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -8988,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec3400000000000000000000000035ed001589911bf0a465a2bd9eeead1c0143dac900000000000000000000000035ed001589911bf0a465a2bd9eeead1c0143dac9000000000000000000000000000000000000000000000000000aae432e2009c000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -8989,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec34000000000000000000000000faac26eac65ecff478dcc6f0ab9d9e414cad3bed000000000000000000000000faac26eac65ecff478dcc6f0ab9d9e414cad3bed00000000000000000000000000000000000000000000000000038d7ea4c6800000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -8990,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec3400000000000000000000000098802c66883bad4e9a66f4093c7e961b4224840600000000000000000000000098802c66883bad4e9a66f4093c7e961b42248406000000000000000000000000000000000000000000000000001813b555e2f00000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -8991,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec3400000000000000000000000032099d8bbab07d71991623f31501e1882265218c00000000000000000000000032099d8bbab07d71991623f31501e1882265218c00000000000000000000000000000000000000000000000000a63312366eaed800000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,0xcca3f2d7ec89db253714cfdc857b4bc0b407e4cf740cd43bbeee91938361d0ff,2021-12-11 08:11:16.000 UTC,0,true -8993,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec3400000000000000000000000010dbf82a8bb191bd1c082de5ef915e998aa5ccd700000000000000000000000010dbf82a8bb191bd1c082de5ef915e998aa5ccd70000000000000000000000000000000000000000000000000002eec68ffbcb0000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,0x672bae9275a17505583d1024280179b56747b1133b2ec4854ed300af053794a4,2022-02-02 13:33:59.000 UTC,0,true -8994,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec34000000000000000000000000da7ab1cd50f3af487cc76b422a3bdd8140c03a32000000000000000000000000da7ab1cd50f3af487cc76b422a3bdd8140c03a3200000000000000000000000000000000000000000000000006ed8aeb8f2c840000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,0x2648832248012d645b182736bfa3d092eeb936a42953045e1492b7c45e17d681,2022-03-03 09:13:47.000 UTC,0,true -8995,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec340000000000000000000000004522f131d03f994fe9aa354ebc9e2553deaee05c0000000000000000000000004522f131d03f994fe9aa354ebc9e2553deaee05c00000000000000000000000000000000000000000000000000a9f25e14c5c40f00000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -8997,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec34000000000000000000000000a9381071abc4267d5d30a605ab2dbfcde644b41f000000000000000000000000a9381071abc4267d5d30a605ab2dbfcde644b41f0000000000000000000000000000000000000000000000000158e07dcd53757b00000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -8998,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec3400000000000000000000000078ce14fefa2847cc8672d2850b72d10b1ccb849a00000000000000000000000078ce14fefa2847cc8672d2850b72d10b1ccb849a0000000000000000000000000000000000000000000000000005ac79cf919c4000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -9000,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0xa9f9e675000000000000000000000000dac17f958d2ee523a2206206994597c13d831ec700000000000000000000000094b008aa00579c1307b0ef2c499ad98a8ce58e58000000000000000000000000a895f950150145b5b9a646af8ce4c06edcb116cf000000000000000000000000a895f950150145b5b9a646af8ce4c06edcb116cf000000000000000000000000000000000000000000000000000000000484090b00000000000000000000000000000000000000000000000000000000000000c00000000000000000000000000000000000000000000000000000000000000000,,,1,true -9001,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec34000000000000000000000000a895f950150145b5b9a646af8ce4c06edcb116cf000000000000000000000000a895f950150145b5b9a646af8ce4c06edcb116cf000000000000000000000000000000000000000000000000003ee1348978b94000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -9003,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec3400000000000000000000000013f692432324e050c928ac24699b2a0da6601f7100000000000000000000000013f692432324e050c928ac24699b2a0da6601f7100000000000000000000000000000000000000000000000000038d7ea4c6800000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -9004,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec340000000000000000000000004c219e9887dfa58a783f9d6270b5eefcc81ba7100000000000000000000000004c219e9887dfa58a783f9d6270b5eefcc81ba710000000000000000000000000000000000000000000000000000aa87bee53800000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -9006,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec34000000000000000000000000c4f31fa1dba138aa9d1c0c40f740bda817f966ee000000000000000000000000c4f31fa1dba138aa9d1c0c40f740bda817f966ee00000000000000000000000000000000000000000000000000a5112ff8aceff900000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,0xc81b268f69c061a976a21576ff37acb462cff66576ec0a2dcc99c0221adbae5b,2022-04-16 02:22:35.000 UTC,0,true -9007,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec3400000000000000000000000024a13ed318a3e9e64533667178987d8db4787a9400000000000000000000000024a13ed318a3e9e64533667178987d8db4787a94000000000000000000000000000000000000000000000000002307773b11df4100000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -9008,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec340000000000000000000000009fc6fed9dd777ff731d093491f82e6e5d9b0bea00000000000000000000000009fc6fed9dd777ff731d093491f82e6e5d9b0bea000000000000000000000000000000000000000000000000000071afd498d000000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -9010,0xcd9d4988c0ae61887b075ba77f08cbfad2b65068,0x3f87ff1de58128ef8fcb4c807efd776e1ac72e51,0xf4f7b41a00000000000000000000000050e8e455b2c9db89a5843ed175da060c3a1f1cac000000000000000000000000000000000000000000000000ccb3d3354e1fe433,,,1,true -9011,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec34000000000000000000000000632659f18682013ab15da51fd7f7448237421d53000000000000000000000000632659f18682013ab15da51fd7f7448237421d5300000000000000000000000000000000000000000000000001b6c73ade6b779e00000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -9012,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0xa9f9e675000000000000000000000000a0b86991c6218b36c1d19d4a2e9eb0ce3606eb480000000000000000000000007f5c764cbc14f9669b88837ca1490cca17c31607000000000000000000000000965ace0642921168f54fc0b84d9e5c20fc2cd3f0000000000000000000000000965ace0642921168f54fc0b84d9e5c20fc2cd3f000000000000000000000000000000000000000000000000000000000001b503000000000000000000000000000000000000000000000000000000000000000c00000000000000000000000000000000000000000000000000000000000000000,,,1,true -9013,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec34000000000000000000000000c460b612054d64df1bb417ffe78c630a85ba270b000000000000000000000000c460b612054d64df1bb417ffe78c630a85ba270b00000000000000000000000000000000000000000000000000071afd498d000000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -9018,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec34000000000000000000000000c460b612054d64df1bb417ffe78c630a85ba270b000000000000000000000000c460b612054d64df1bb417ffe78c630a85ba270b0000000000000000000000000000000000000000000000000024a3271e7accfe00000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -9021,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0xa9f9e675000000000000000000000000a0b86991c6218b36c1d19d4a2e9eb0ce3606eb480000000000000000000000007f5c764cbc14f9669b88837ca1490cca17c31607000000000000000000000000ed3909aba279b46a2feb97d878d402a8ea5faea8000000000000000000000000ed3909aba279b46a2feb97d878d402a8ea5faea800000000000000000000000000000000000000000000000000000000000f424000000000000000000000000000000000000000000000000000000000000000c00000000000000000000000000000000000000000000000000000000000000000,,,1,true -9022,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec340000000000000000000000009ccc5cf77d794fc89a610a43e2231c427e8d498d0000000000000000000000009ccc5cf77d794fc89a610a43e2231c427e8d498d00000000000000000000000000000000000000000000000000038d7ea4c6800000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -9023,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec34000000000000000000000000fc332d328b8854d52c18023d00b984341dba8968000000000000000000000000fc332d328b8854d52c18023d00b984341dba8968000000000000000000000000000000000000000000000000001d6910d580f2c000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -9024,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec34000000000000000000000000fc332d328b8854d52c18023d00b984341dba8968000000000000000000000000fc332d328b8854d52c18023d00b984341dba89680000000000000000000000000000000000000000000000000000b5e620f4800000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -9025,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec34000000000000000000000000e37821edeeea8f94cf90472dba3efa2c9010c4a1000000000000000000000000e37821edeeea8f94cf90472dba3efa2c9010c4a10000000000000000000000000000000000000000000000000001c6bf5263400000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -9026,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec34000000000000000000000000c6a2361cd991dd31e69c92da7ebf322bb0ce4a2f000000000000000000000000c6a2361cd991dd31e69c92da7ebf322bb0ce4a2f0000000000000000000000000000000000000000000000000001c6bf5263400000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -9027,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec340000000000000000000000001e34801ea425691b512c384aa000bd3e4f7099f70000000000000000000000001e34801ea425691b512c384aa000bd3e4f7099f7000000000000000000000000000000000000000000000000001b0dc63d8a851a00000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -9028,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec3400000000000000000000000031452cc486d6decb90ca5effa9868bed982b4b7d00000000000000000000000031452cc486d6decb90ca5effa9868bed982b4b7d000000000000000000000000000000000000000000000000001c6bf52634000000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -9029,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec34000000000000000000000000f934bc0ce2607b4c3b78cf33dd8e16ead186acaf000000000000000000000000f934bc0ce2607b4c3b78cf33dd8e16ead186acaf0000000000000000000000000000000000000000000000000020ff829302b30000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -9030,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec340000000000000000000000005d96551879f9d50f1886bfe8ab3ee4d9220a9d180000000000000000000000005d96551879f9d50f1886bfe8ab3ee4d9220a9d180000000000000000000000000000000000000000000000000005691c6372770000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -9031,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec34000000000000000000000000420c0cbc0da2c4b85e5aaefe95a9350f217c4882000000000000000000000000420c0cbc0da2c4b85e5aaefe95a9350f217c48820000000000000000000000000000000000000000000000000007d0e36a81800000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -9032,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec340000000000000000000000007dc4d33e3e28214751260102dc46431a7b9780d00000000000000000000000007dc4d33e3e28214751260102dc46431a7b9780d0000000000000000000000000000000000000000000000000032cb86e6eb0170000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -9033,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec34000000000000000000000000e96114e7bc582cee09edb84af5cb544cacaea1dc000000000000000000000000e96114e7bc582cee09edb84af5cb544cacaea1dc0000000000000000000000000000000000000000000000000026d34a9441830200000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -9034,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec340000000000000000000000007019e04f5c7a20bbc686ce071f128d85e08bb89a0000000000000000000000007019e04f5c7a20bbc686ce071f128d85e08bb89a000000000000000000000000000000000000000000000000000aa87bee53800000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -9035,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec34000000000000000000000000882c34e0a3405f713581b8c8c9650f3cc28df488000000000000000000000000882c34e0a3405f713581b8c8c9650f3cc28df488000000000000000000000000000000000000000000000000015fbc751e5c480000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,0x1356ed6e8398eaea48cc66c56428fb2facc2163dbccfd70376fc050bb827ca38,2022-08-04 23:27:48.000 UTC,0,true -9037,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec3400000000000000000000000085dc21776b349c07c080b454e27387e32d3a2e6900000000000000000000000085dc21776b349c07c080b454e27387e32d3a2e6900000000000000000000000000000000000000000000000000adcf0cf53e470000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -9038,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec34000000000000000000000000b033961bd425926c12f622eff02b5a1a1ef807dd000000000000000000000000b033961bd425926c12f622eff02b5a1a1ef807dd000000000000000000000000000000000000000000000000016345785d8a000000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -9039,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec340000000000000000000000008e72fb69d6f28bf6b9d171ea5cc4e2bcd5a406f20000000000000000000000008e72fb69d6f28bf6b9d171ea5cc4e2bcd5a406f2000000000000000000000000000000000000000000000000000aa87bee53800000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -9040,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec340000000000000000000000002d6756e1a072c3edf08451494eba0787c61eebe60000000000000000000000002d6756e1a072c3edf08451494eba0787c61eebe600000000000000000000000000000000000000000000000000394092f7c0780300000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -9041,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec34000000000000000000000000fa5a5a0a4ac902522e83eb0c00a0f8bfa0493a5a000000000000000000000000fa5a5a0a4ac902522e83eb0c00a0f8bfa0493a5a0000000000000000000000000000000000000000000000000139d78a1965dc8000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -9042,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec34000000000000000000000000de6bb34a2f8c0465bcc6a0f692b8fa59737e9994000000000000000000000000de6bb34a2f8c0465bcc6a0f692b8fa59737e999400000000000000000000000000000000000000000000000000b8a7eec4f0bb3700000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -9044,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec3400000000000000000000000042c6b48ef77d01203ba920872b6b011f1ed9717600000000000000000000000042c6b48ef77d01203ba920872b6b011f1ed971760000000000000000000000000000000000000000000000000058d15e1762800000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -9045,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec3400000000000000000000000056170df5f737bd4578a6785eee0ce9e008aea09e00000000000000000000000056170df5f737bd4578a6785eee0ce9e008aea09e00000000000000000000000000000000000000000000000000569757e3c965a900000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -9046,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0xa9f9e675000000000000000000000000a0b86991c6218b36c1d19d4a2e9eb0ce3606eb480000000000000000000000007f5c764cbc14f9669b88837ca1490cca17c316070000000000000000000000009d5d5048a937e4ac8beae2ce7cb5cae7545041ec0000000000000000000000009d5d5048a937e4ac8beae2ce7cb5cae7545041ec0000000000000000000000000000000000000000000000000000000000a7d8c000000000000000000000000000000000000000000000000000000000000000c00000000000000000000000000000000000000000000000000000000000000000,,,1,true -9047,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec34000000000000000000000000372fa25ea9647da526b5b001bd18361f00f2d408000000000000000000000000372fa25ea9647da526b5b001bd18361f00f2d40800000000000000000000000000000000000000000000000000894ff86091a00000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -9048,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec34000000000000000000000000885477124122b1547df1d1fae946c15bb4149b98000000000000000000000000885477124122b1547df1d1fae946c15bb4149b98000000000000000000000000000000000000000000000000005c07475d6f808300000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -9049,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec34000000000000000000000000621351604e300f3f4990aafcc17d0bb23f98ff6e000000000000000000000000621351604e300f3f4990aafcc17d0bb23f98ff6e00000000000000000000000000000000000000000000000001608d174dd9460000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -9050,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec340000000000000000000000005e0e76d32ecfee51bad0360245d4cb710abfa1d70000000000000000000000005e0e76d32ecfee51bad0360245d4cb710abfa1d700000000000000000000000000000000000000000000000000003903c0c7ba8000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -9051,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec340000000000000000000000005d96551879f9d50f1886bfe8ab3ee4d9220a9d180000000000000000000000005d96551879f9d50f1886bfe8ab3ee4d9220a9d1800000000000000000000000000000000000000000000000000003903c0c7ba8000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -9052,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec34000000000000000000000000596504bec398f7a1a6542731a461ebb381bc33c8000000000000000000000000596504bec398f7a1a6542731a461ebb381bc33c800000000000000000000000000000000000000000000000000003903c0c7ba8000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -9054,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec34000000000000000000000000ff54d42aead3ca357ce09cc084845151d47e76de000000000000000000000000ff54d42aead3ca357ce09cc084845151d47e76de000000000000000000000000000000000000000000000000005958f70438be9700000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -9057,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec3400000000000000000000000010fedd3a2ecc9abbde294c1d13e1f71eb71f3aad00000000000000000000000010fedd3a2ecc9abbde294c1d13e1f71eb71f3aad000000000000000000000000000000000000000000000000002b898b0971e5a700000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,0x1a0f8d5757f3ee04fa9a1c36291d64070a2a2b4c25636496d88b89418c9bb6f0,2022-06-02 23:37:00.000 UTC,0,true -9058,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec340000000000000000000000007f543504a1f2076fffcc5892f5511ca08e664f2c0000000000000000000000007f543504a1f2076fffcc5892f5511ca08e664f2c00000000000000000000000000000000000000000000000000038d7ea4c6800000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -9059,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec340000000000000000000000002dec44a6acf386368f6468461b810a5b2d60982f0000000000000000000000002dec44a6acf386368f6468461b810a5b2d60982f000000000000000000000000000000000000000000000000016345785d8a000000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -9061,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec340000000000000000000000005530a2bb579402819042c8a4ea06b7020b37fee60000000000000000000000005530a2bb579402819042c8a4ea06b7020b37fee6000000000000000000000000000000000000000000000000016345785d8a000000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -9062,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec34000000000000000000000000f21eb9fc6843e8d8816113589d6282bab6369184000000000000000000000000f21eb9fc6843e8d8816113589d6282bab6369184000000000000000000000000000000000000000000000000016345785d8a000000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -9063,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec340000000000000000000000003c8af873ccf3379491750835130d1d81beecc9c30000000000000000000000003c8af873ccf3379491750835130d1d81beecc9c3000000000000000000000000000000000000000000000000002386f26fc1000000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -9064,0x10e6593cdda8c58a1d0f14c5164b376352a55f2f,0x467194771dae2967aef3ecbedd3bf9a310c76c65,0xa9f9e6750000000000000000000000006b175474e89094c44da98b954eedeac495271d0f000000000000000000000000da10009cbd5d07dd0cecc66161fc93d7c9000da10000000000000000000000003c8af873ccf3379491750835130d1d81beecc9c30000000000000000000000003c8af873ccf3379491750835130d1d81beecc9c3000000000000000000000000000000000000000000000001158e460913d0000000000000000000000000000000000000000000000000000000000000000000c00000000000000000000000000000000000000000000000000000000000000000,,,1,true -9066,0xcd9d4988c0ae61887b075ba77f08cbfad2b65068,0x3f87ff1de58128ef8fcb4c807efd776e1ac72e51,0xf4f7b41a000000000000000000000000573c78a4a1fe8e77ffd340fb5e42c8b80d6e60090000000000000000000000000000000000000000000000019cb9e11561173021,,,1,true -9067,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec34000000000000000000000000ee3fbdfac79b7a4ce9f20ef67677a502680f137e000000000000000000000000ee3fbdfac79b7a4ce9f20ef67677a502680f137e00000000000000000000000000000000000000000000000002105d30da002ef800000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -9068,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec340000000000000000000000008e461b332fa92694b8aba65fff93d591bb0b4c840000000000000000000000008e461b332fa92694b8aba65fff93d591bb0b4c840000000000000000000000000000000000000000000000000155501839c6112900000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -9069,0x10e6593cdda8c58a1d0f14c5164b376352a55f2f,0x467194771dae2967aef3ecbedd3bf9a310c76c65,0xa9f9e6750000000000000000000000006b175474e89094c44da98b954eedeac495271d0f000000000000000000000000da10009cbd5d07dd0cecc66161fc93d7c9000da10000000000000000000000000c80b51912c089bea4c5dc8accba11cb0e8aaf410000000000000000000000000c80b51912c089bea4c5dc8accba11cb0e8aaf410000000000000000000000000000000000000000000000082339333e0bb16d0300000000000000000000000000000000000000000000000000000000000000c00000000000000000000000000000000000000000000000000000000000000000,,,1,true -9071,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec340000000000000000000000007f543504a1f2076fffcc5892f5511ca08e664f2c0000000000000000000000007f543504a1f2076fffcc5892f5511ca08e664f2c000000000000000000000000000000000000000000000000000009184e72a00000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -9075,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec3400000000000000000000000000a379b8266faee951aaefecf15a484b438fe59b00000000000000000000000000a379b8266faee951aaefecf15a484b438fe59b00000000000000000000000000000000000000000000000000038d7ea4c6800000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -9076,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec34000000000000000000000000d1bcdc1594dd5511c7cdeaf0dc149b7cfaf87cf1000000000000000000000000d1bcdc1594dd5511c7cdeaf0dc149b7cfaf87cf100000000000000000000000000000000000000000000000000c46517a3e56fa900000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -9077,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec34000000000000000000000000a1ad95ed4ded15200df4220fde31c8b6b3b7a723000000000000000000000000a1ad95ed4ded15200df4220fde31c8b6b3b7a72300000000000000000000000000000000000000000000000000590c47973fcac000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -9078,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec3400000000000000000000000000a379b8266faee951aaefecf15a484b438fe59b00000000000000000000000000a379b8266faee951aaefecf15a484b438fe59b00000000000000000000000000000000000000000000000000038d7ea4c6800000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -9079,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec340000000000000000000000004372de44f255a78b3a3b89a923fdca35ef4157f60000000000000000000000004372de44f255a78b3a3b89a923fdca35ef4157f60000000000000000000000000000000000000000000000000df83069ad91790b00000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -9080,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec34000000000000000000000000dfc3914aafa7cbcc897bd9ec5a6d8ec6b63e9a90000000000000000000000000dfc3914aafa7cbcc897bd9ec5a6d8ec6b63e9a900000000000000000000000000000000000000000000000000000b5e620f4800000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -9082,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec340000000000000000000000005ae1bb3c234ce4436133d4c4b6a8665257cc0acb0000000000000000000000005ae1bb3c234ce4436133d4c4b6a8665257cc0acb000000000000000000000000000000000000000000000000006673f7bf888b0000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -9084,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec340000000000000000000000009650f48230a0be8106bab9d978456da25f74189c0000000000000000000000009650f48230a0be8106bab9d978456da25f74189c00000000000000000000000000000000000000000000000000038d7ea4c6800000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -9086,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec34000000000000000000000000813377240d97bb58aac5f22266a6215e53d7889c000000000000000000000000813377240d97bb58aac5f22266a6215e53d7889c000000000000000000000000000000000000000000000000000a03588723becb00000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -9087,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec34000000000000000000000000d6b69502b58f4ef1186a23345779b32d1b512eb5000000000000000000000000d6b69502b58f4ef1186a23345779b32d1b512eb500000000000000000000000000000000000000000000000000038d7ea4c6800000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -9088,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec34000000000000000000000000ddc2a3c06590b7401c41bbe7f6ff742f2101a946000000000000000000000000ddc2a3c06590b7401c41bbe7f6ff742f2101a9460000000000000000000000000000000000000000000000000008aca26a56b44a00000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -9089,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec34000000000000000000000000374cb27a8753520bb153906a0a34cc823cea3c3e000000000000000000000000374cb27a8753520bb153906a0a34cc823cea3c3e000000000000000000000000000000000000000000000000008e1bc9bf04000000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -9091,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0xa9f9e6750000000000000000000000001f9840a85d5af5bf1d1762f925bdaddc4201f9840000000000000000000000006fd9d7ad17242c41f7131d257212c54a0e816691000000000000000000000000374cb27a8753520bb153906a0a34cc823cea3c3e000000000000000000000000374cb27a8753520bb153906a0a34cc823cea3c3e000000000000000000000000000000000000000000000000003524343e6bd79800000000000000000000000000000000000000000000000000000000000000c00000000000000000000000000000000000000000000000000000000000000000,,,1,true -9092,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec34000000000000000000000000b8e4e00aad7a9bcf6f6376662b83bb1e6bdc5212000000000000000000000000b8e4e00aad7a9bcf6f6376662b83bb1e6bdc5212000000000000000000000000000000000000000000000000000000e8d4a5100000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -9093,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec340000000000000000000000004e33d600655f808805dd21bfd00b4f56db28f0b40000000000000000000000004e33d600655f808805dd21bfd00b4f56db28f0b4000000000000000000000000000000000000000000000000000000e8d4a5100000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -9094,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec340000000000000000000000000004784ac6aea2d4dff992c46b560d3a94264c740000000000000000000000000004784ac6aea2d4dff992c46b560d3a94264c74000000000000000000000000000000000000000000000000000000e8d4a5100000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -9095,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec34000000000000000000000000ae805c15ed60aa9cb1b0111f00a9f616b72a546d000000000000000000000000ae805c15ed60aa9cb1b0111f00a9f616b72a546d000000000000000000000000000000000000000000000000000000e8d4a5100000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -9096,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec34000000000000000000000000b31abfef6710675de9e17e053c8466ed3497757d000000000000000000000000b31abfef6710675de9e17e053c8466ed3497757d000000000000000000000000000000000000000000000000002fef9e96bc879100000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -9097,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec340000000000000000000000003d2d34366edfb727a704980330e62bd822bac0f50000000000000000000000003d2d34366edfb727a704980330e62bd822bac0f5000000000000000000000000000000000000000000000000000000e8d4a5100000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -9098,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec34000000000000000000000000f93f111beae29fd649d0dae7c26de4fcd2edbdb1000000000000000000000000f93f111beae29fd649d0dae7c26de4fcd2edbdb1000000000000000000000000000000000000000000000000000000e8d4a5100000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -9099,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec3400000000000000000000000081dce610c64f7ad9cdb23db11d3c72eb17ebddb400000000000000000000000081dce610c64f7ad9cdb23db11d3c72eb17ebddb4000000000000000000000000000000000000000000000000000000e8d4a5100000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -9101,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec340000000000000000000000002996fe21cf925d4304ac11ef7c61481e97e739790000000000000000000000002996fe21cf925d4304ac11ef7c61481e97e73979000000000000000000000000000000000000000000000000005dc8924fd150f000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -9102,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec3400000000000000000000000067e7246bf971318a9d4d7145ef7e9cca7a7190a100000000000000000000000067e7246bf971318a9d4d7145ef7e9cca7a7190a1000000000000000000000000000000000000000000000000000000e8d4a5100000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -9103,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec340000000000000000000000003cd2d3e932e4e2f567544196b429a628cb9389210000000000000000000000003cd2d3e932e4e2f567544196b429a628cb93892100000000000000000000000000000000000000000000000000a76803fe0d10be00000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -9104,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec340000000000000000000000001fe07a3e5d15f3f6b7d7529253566a5341e59b140000000000000000000000001fe07a3e5d15f3f6b7d7529253566a5341e59b14000000000000000000000000000000000000000000000000000000e8d4a5100000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -9105,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec34000000000000000000000000977093b83bc716507c7952faf8e968fb1a5f3212000000000000000000000000977093b83bc716507c7952faf8e968fb1a5f3212000000000000000000000000000000000000000000000000000000e8d4a5100000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -9106,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec3400000000000000000000000021d13cc7560792aaa19f482d1ee9797e0d06abb900000000000000000000000021d13cc7560792aaa19f482d1ee9797e0d06abb9000000000000000000000000000000000000000000000000000000e8d4a5100000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -9107,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec34000000000000000000000000a11f1b016ce50b352bff0e8502b9b8f8c83fa8de000000000000000000000000a11f1b016ce50b352bff0e8502b9b8f8c83fa8de000000000000000000000000000000000000000000000000000000e8d4a5100000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -9108,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec34000000000000000000000000ccc0a27a01d7cad1bef84bf1b8f266e0eeea273b000000000000000000000000ccc0a27a01d7cad1bef84bf1b8f266e0eeea273b000000000000000000000000000000000000000000000000000000e8d4a5100000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -9109,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec3400000000000000000000000027ead2e036bbb1d22092768adf6088de83d9773a00000000000000000000000027ead2e036bbb1d22092768adf6088de83d9773a000000000000000000000000000000000000000000000000000000e8d4a5100000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -9110,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec340000000000000000000000006a2f3ea41324fe1aa34b0ebc97df66beb5597c550000000000000000000000006a2f3ea41324fe1aa34b0ebc97df66beb5597c55000000000000000000000000000000000000000000000000000000e8d4a5100000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -9111,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec340000000000000000000000001322743e9407421991c9e4d405f166f0c4e5430e0000000000000000000000001322743e9407421991c9e4d405f166f0c4e5430e000000000000000000000000000000000000000000000000000000e8d4a5100000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -9112,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec340000000000000000000000006870fdf5a38791bcc11177cc05d9c3164482dad40000000000000000000000006870fdf5a38791bcc11177cc05d9c3164482dad400000000000000000000000000000000000000000000000000d25b799b90faaa00000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -9113,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0xa9f9e675000000000000000000000000dac17f958d2ee523a2206206994597c13d831ec700000000000000000000000094b008aa00579c1307b0ef2c499ad98a8ce58e58000000000000000000000000130b9676da337441df79706be0640daa7ccb1a52000000000000000000000000130b9676da337441df79706be0640daa7ccb1a5200000000000000000000000000000000000000000000000000000000009dd21100000000000000000000000000000000000000000000000000000000000000c00000000000000000000000000000000000000000000000000000000000000000,,,1,true -9114,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec34000000000000000000000000c26f5e1ef92f0001492184c67bcb5219733671af000000000000000000000000c26f5e1ef92f0001492184c67bcb5219733671af000000000000000000000000000000000000000000000000000000e8d4a5100000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -9115,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec34000000000000000000000000c6eec7c3c5763fd83631237fd9425bc8b7adad7a000000000000000000000000c6eec7c3c5763fd83631237fd9425bc8b7adad7a000000000000000000000000000000000000000000000000007a69afbb1e4b7200000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -9116,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec34000000000000000000000000c6fcb29f0d8b9058882d801522f85a2b2e3ae7ad000000000000000000000000c6fcb29f0d8b9058882d801522f85a2b2e3ae7ad000000000000000000000000000000000000000000000000000000e8d4a5100000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -9117,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec34000000000000000000000000ddeb3d70574d4e11330fa69999d0c5cc74b7a1be000000000000000000000000ddeb3d70574d4e11330fa69999d0c5cc74b7a1be0000000000000000000000000000000000000000000000000052e2ec0493eff000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -9118,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec34000000000000000000000000326600085aad2407b951bd8dc2ca004e3cb94824000000000000000000000000326600085aad2407b951bd8dc2ca004e3cb94824000000000000000000000000000000000000000000000000000000e8d4a5100000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -9119,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec340000000000000000000000003ca1111888bcd15992f4bab4fe11ed748be9db2e0000000000000000000000003ca1111888bcd15992f4bab4fe11ed748be9db2e000000000000000000000000000000000000000000000000000000e8d4a5100000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -9120,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec34000000000000000000000000549f70392f4035ed0b4467e304e65a0c5c0b80f2000000000000000000000000549f70392f4035ed0b4467e304e65a0c5c0b80f2000000000000000000000000000000000000000000000000000000e8d4a5100000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -9121,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec34000000000000000000000000ed38e91fd9896c95458b7304a47110fcb4c419ea000000000000000000000000ed38e91fd9896c95458b7304a47110fcb4c419ea000000000000000000000000000000000000000000000000000000e8d4a5100000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -9122,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec3400000000000000000000000045fde6b2977e251637a2c19759a00d0f2ab7c35000000000000000000000000045fde6b2977e251637a2c19759a00d0f2ab7c350000000000000000000000000000000000000000000000000000000e8d4a5100000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -9123,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec34000000000000000000000000d9b817a4a54ff7b9bf912cfe6946cd66dd709717000000000000000000000000d9b817a4a54ff7b9bf912cfe6946cd66dd709717000000000000000000000000000000000000000000000000000000e8d4a5100000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -9124,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec34000000000000000000000000a06e36648fe747dbe4fea0fd3cec9da632193a8e000000000000000000000000a06e36648fe747dbe4fea0fd3cec9da632193a8e000000000000000000000000000000000000000000000000000000e8d4a5100000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -9125,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec340000000000000000000000003d85d934577c027433f4cacb53210b79f1a039470000000000000000000000003d85d934577c027433f4cacb53210b79f1a03947000000000000000000000000000000000000000000000000000b54ef82454e0600000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -9126,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec34000000000000000000000000fc0834397ac2147387f71c6097f4e593b3655feb000000000000000000000000fc0834397ac2147387f71c6097f4e593b3655feb000000000000000000000000000000000000000000000000000000e8d4a5100000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -9127,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec34000000000000000000000000a56777fbae59666a2f58bb19cfe02861566c3d8f000000000000000000000000a56777fbae59666a2f58bb19cfe02861566c3d8f000000000000000000000000000000000000000000000000000000e8d4a5100000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -9128,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec34000000000000000000000000835215ceca121e78263d2ebde6d12fae6bf49d11000000000000000000000000835215ceca121e78263d2ebde6d12fae6bf49d110000000000000000000000000000000000000000000000000002f9646cdeae0000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -9129,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec3400000000000000000000000004570b3d9feebb2f0b033ef7cbfc45d9b5399fd300000000000000000000000004570b3d9feebb2f0b033ef7cbfc45d9b5399fd3000000000000000000000000000000000000000000000000000c0c9dd2640b1300000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -9130,0xcd9d4988c0ae61887b075ba77f08cbfad2b65068,0x3f87ff1de58128ef8fcb4c807efd776e1ac72e51,0xf4f7b41a000000000000000000000000584313319d0bfead2a9d98a7154f5dcb5a62887f000000000000000000000000000000000000000000000001c9f78d2893e40000,,,1,true -9131,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec3400000000000000000000000008dcff10b76083afa20679ae0203c84479df71c300000000000000000000000008dcff10b76083afa20679ae0203c84479df71c3000000000000000000000000000000000000000000000000000000e8d4a5100000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -9132,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec34000000000000000000000000ed26122ff39147a40457fe1a7d9443e3dabb7063000000000000000000000000ed26122ff39147a40457fe1a7d9443e3dabb7063000000000000000000000000000000000000000000000000000000e8d4a5100000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -9133,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec340000000000000000000000007319c9390a8e4b9434c8ebc04fce609a72ee2aa00000000000000000000000007319c9390a8e4b9434c8ebc04fce609a72ee2aa0000000000000000000000000000000000000000000000000000000e8d4a5100000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -9134,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec340000000000000000000000003f181b16663fd416dcd466591e841ca407d9c6590000000000000000000000003f181b16663fd416dcd466591e841ca407d9c659000000000000000000000000000000000000000000000000000000e8d4a5100000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -9135,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec34000000000000000000000000d7ea3ffc8e17e4127969b9b05e218c830e317d9d000000000000000000000000d7ea3ffc8e17e4127969b9b05e218c830e317d9d000000000000000000000000000000000000000000000000000000e8d4a5100000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -9136,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec34000000000000000000000000e51e885186f384dd7f95f5f39a750059e84f04b2000000000000000000000000e51e885186f384dd7f95f5f39a750059e84f04b2000000000000000000000000000000000000000000000000000000e8d4a5100000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -9137,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec3400000000000000000000000012e016811f2d6244f77ea21a171230d4d787ed5b00000000000000000000000012e016811f2d6244f77ea21a171230d4d787ed5b000000000000000000000000000000000000000000000000000000e8d4a5100000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -9139,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec340000000000000000000000008163e1014b2aa4e19712707a954c3dcef05910690000000000000000000000008163e1014b2aa4e19712707a954c3dcef0591069000000000000000000000000000000000000000000000000000000e8d4a5100000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -9140,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec34000000000000000000000000d9054cb84c86fd1a262edce44df65120359cb1ce000000000000000000000000d9054cb84c86fd1a262edce44df65120359cb1ce000000000000000000000000000000000000000000000000000000e8d4a5100000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -9141,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec34000000000000000000000000b60e289b9faa929c6a3211cd9aba95f655b0b381000000000000000000000000b60e289b9faa929c6a3211cd9aba95f655b0b3810000000000000000000000000000000000000000000000000005543df729c00000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -9142,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec3400000000000000000000000090558eb23d1d1183d8a18dd507179e87d66764ef00000000000000000000000090558eb23d1d1183d8a18dd507179e87d66764ef0000000000000000000000000000000000000000000000000005543df729c00000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -9143,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec34000000000000000000000000e88d2e687093ce4342ecfb51441ade926320c077000000000000000000000000e88d2e687093ce4342ecfb51441ade926320c0770000000000000000000000000000000000000000000000000005543df729c00000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -9144,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec34000000000000000000000000692059c9391d9d0d2072867bdb75f4499a70261c000000000000000000000000692059c9391d9d0d2072867bdb75f4499a70261c00000000000000000000000000000000000000000000000000071afd498d000000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -9145,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec340000000000000000000000004b1ec19beac9c7542d0055a1527c3bb9c276ecd20000000000000000000000004b1ec19beac9c7542d0055a1527c3bb9c276ecd2000000000000000000000000000000000000000000000000007dac86834637e500000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,0xcc6d775dbd9bd34b83854896ad21b2401c4a2c0b57767601469b383be38da36c,2022-05-27 12:36:07.000 UTC,0,true -9146,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0xa9f9e675000000000000000000000000a0b86991c6218b36c1d19d4a2e9eb0ce3606eb480000000000000000000000007f5c764cbc14f9669b88837ca1490cca17c3160700000000000000000000000025bec8158b13394095aeb6412a5b06ca416eeb5700000000000000000000000025bec8158b13394095aeb6412a5b06ca416eeb570000000000000000000000000000000000000000000000000000000001312d0000000000000000000000000000000000000000000000000000000000000000c00000000000000000000000000000000000000000000000000000000000000000,,,1,true -9147,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec34000000000000000000000000198286fdf097bc1178c89aee772a7c505afeffcc000000000000000000000000198286fdf097bc1178c89aee772a7c505afeffcc000000000000000000000000000000000000000000000000010fcd70f577a0d400000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -9148,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec34000000000000000000000000a9e2322e585ad31fb3f126fe4621f60bb5df3c5f000000000000000000000000a9e2322e585ad31fb3f126fe4621f60bb5df3c5f00000000000000000000000000000000000000000000000000c2df8ec054cbbf00000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -9149,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec34000000000000000000000000e94629793d7cd090bb863f185c29f4316eee0590000000000000000000000000e94629793d7cd090bb863f185c29f4316eee059000000000000000000000000000000000000000000000000001c5d67098290acc00000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,0x28fb8b0a43577e9bae1ab1b51f6b6d97518cf3b74396f831ec1af7e464d550de,2021-12-18 19:40:20.000 UTC,0,true -9151,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec3400000000000000000000000065f6e3f32dca337fd8cea78ac25e0b590906b6fb00000000000000000000000065f6e3f32dca337fd8cea78ac25e0b590906b6fb0000000000000000000000000000000000000000000000000160975da9b4be7a00000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,0x2e0e3680cadffc19211d6b25b77f2d0167ddb9b8472d53a96893ff44dedbbce2,2022-04-30 05:30:46.000 UTC,0,true -9153,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec340000000000000000000000007aa3c6a33ec4bbfc6319e3c98333a018efdb1e680000000000000000000000007aa3c6a33ec4bbfc6319e3c98333a018efdb1e680000000000000000000000000000000000000000000000000152b4421ba4783f00000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -9157,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec34000000000000000000000000bfa3a0e1d36f51e50d2d8e1318506f52c1a136e3000000000000000000000000bfa3a0e1d36f51e50d2d8e1318506f52c1a136e3000000000000000000000000000000000000000000000000009e0459c803abbe00000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -9159,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec34000000000000000000000000f4f96a548f847ca2c97aa7b801d683b92353fce9000000000000000000000000f4f96a548f847ca2c97aa7b801d683b92353fce900000000000000000000000000000000000000000000000000088cb0ede33ac000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -9160,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec34000000000000000000000000ce11f7d8a72536aebfd5a7b35ad90cc9d4e31bf8000000000000000000000000ce11f7d8a72536aebfd5a7b35ad90cc9d4e31bf8000000000000000000000000000000000000000000000000015d77956cd8d10000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -9164,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec340000000000000000000000008376b16bb899cb80e07fe758a7a04dd6ed0b6e580000000000000000000000008376b16bb899cb80e07fe758a7a04dd6ed0b6e580000000000000000000000000000000000000000000000000060fa99e35b5cb400000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -9165,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec340000000000000000000000009dd8ef100e98f980bd6d79374b9b4c10c8dc52840000000000000000000000009dd8ef100e98f980bd6d79374b9b4c10c8dc5284000000000000000000000000000000000000000000000000004c6e7a7c9214e800000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -9166,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec34000000000000000000000000c9b98fc6810dc95954e3f9e951118b2f0fc4cf4d000000000000000000000000c9b98fc6810dc95954e3f9e951118b2f0fc4cf4d0000000000000000000000000000000000000000000000000774c9670cf3080000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,0xe73825d2a32056928761d14071907dda8e1e3ae27fdc24a7af9ca36b96abe442,2022-02-03 12:34:24.000 UTC,0,true -9167,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec3400000000000000000000000028a4f1c13fc3af4b4ac9ce8dac5eb7de9dd35ca100000000000000000000000028a4f1c13fc3af4b4ac9ce8dac5eb7de9dd35ca1000000000000000000000000000000000000000000000000019b66a1e1470efb00000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,0x858b58079605f577b99d9c3875f7ec111d60bb196bd7e48114368fea0fa8595d,2022-02-19 18:39:08.000 UTC,0,true -9170,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec340000000000000000000000007764afa522fcf3f2f9c681d8b987a6b87ba22e790000000000000000000000007764afa522fcf3f2f9c681d8b987a6b87ba22e7900000000000000000000000000000000000000000000000000470de4df82000000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -9171,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec340000000000000000000000005c2930356784c160a667c5673b2ef1996b9d69570000000000000000000000005c2930356784c160a667c5673b2ef1996b9d6957000000000000000000000000000000000000000000000000001b2d5f27f999c000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -9172,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec34000000000000000000000000c4d6cbe3e704f5f8d18d3b3125b45a4cf82bb5a6000000000000000000000000c4d6cbe3e704f5f8d18d3b3125b45a4cf82bb5a600000000000000000000000000000000000000000000000000f09609c014860000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -9174,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec340000000000000000000000001ed43339d2c883b40519ec49c82b94897db7b1e10000000000000000000000001ed43339d2c883b40519ec49c82b94897db7b1e10000000000000000000000000000000000000000000000000051b660cdd5800000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -9176,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec340000000000000000000000001e1173b4410ea8142690d2be8fcf4022ba442a300000000000000000000000001e1173b4410ea8142690d2be8fcf4022ba442a3000000000000000000000000000000000000000000000000001597d1ac0b35f1100000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,0x2c80f47ec56c231c484b87a7343ff218072651d9a24eb6c6961f7dd77715276b,2021-12-20 02:27:31.000 UTC,0,true -9177,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec34000000000000000000000000e6ce84fb35db1cd9e17016abef2b06f7630f97b2000000000000000000000000e6ce84fb35db1cd9e17016abef2b06f7630f97b2000000000000000000000000000000000000000000000000006a94d74f43000000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -9178,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec3400000000000000000000000095538e1ab67caaf337e5048c097390af8119f74300000000000000000000000095538e1ab67caaf337e5048c097390af8119f743000000000000000000000000000000000000000000000000000e35fa931a000000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -9179,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec3400000000000000000000000061eaa93248e9b4c317058d223ad59a4b5ae050e700000000000000000000000061eaa93248e9b4c317058d223ad59a4b5ae050e7000000000000000000000000000000000000000000000000000cca2e5131000000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -9180,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec34000000000000000000000000ffe8b3425cc5c5c5e425ad5565b334f7074778a7000000000000000000000000ffe8b3425cc5c5c5e425ad5565b334f7074778a7000000000000000000000000000000000000000000000000000cca2e5131000000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -9181,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec34000000000000000000000000410d7f8d3d48d7f596f51c89f30ac2be06f2c8a0000000000000000000000000410d7f8d3d48d7f596f51c89f30ac2be06f2c8a0000000000000000000000000000000000000000000000000000cca2e5131000000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -9182,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec34000000000000000000000000aec42dae1d9550d83fe147fcb33b138a8084f0bd000000000000000000000000aec42dae1d9550d83fe147fcb33b138a8084f0bd000000000000000000000000000000000000000000000000000cca2e5131000000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -9185,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec34000000000000000000000000f708191c907fdb52f4359b169429ec03321036a4000000000000000000000000f708191c907fdb52f4359b169429ec03321036a4000000000000000000000000000000000000000000000000007857bb56be5e8f00000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -9187,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec3400000000000000000000000011d89a9b799c54aa3add4af585c929ad22b1f90600000000000000000000000011d89a9b799c54aa3add4af585c929ad22b1f90600000000000000000000000000000000000000000000000000190ca1ad26420000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -9188,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec3400000000000000000000000027bde5a4806188c84d6d6cbdce01f23cf5d492ac00000000000000000000000027bde5a4806188c84d6d6cbdce01f23cf5d492ac000000000000000000000000000000000000000000000000001bcfeb1a05320000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -9189,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec34000000000000000000000000c27a8c3090cc5daa057f71cfef75b68ef9d75cfe000000000000000000000000c27a8c3090cc5daa057f71cfef75b68ef9d75cfe00000000000000000000000000000000000000000000000000002a104b02463500000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -9190,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec34000000000000000000000000c27a8c3090cc5daa057f71cfef75b68ef9d75cfe000000000000000000000000c27a8c3090cc5daa057f71cfef75b68ef9d75cfe00000000000000000000000000000000000000000000000000002a104b02463500000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -9195,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec340000000000000000000000008efe405ed383ca3cdc4d71905f2891caec7f78520000000000000000000000008efe405ed383ca3cdc4d71905f2891caec7f78520000000000000000000000000000000000000000000000000020e4b6da66d86b00000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -9196,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec340000000000000000000000006702db7613fa734d9d59e3ae756c41236ac87a440000000000000000000000006702db7613fa734d9d59e3ae756c41236ac87a440000000000000000000000000000000000000000000000000060f333a3c3c57a00000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -9198,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec340000000000000000000000009f603173b7f845e8c05a5c325ecb2bdbe1a1db6c0000000000000000000000009f603173b7f845e8c05a5c325ecb2bdbe1a1db6c00000000000000000000000000000000000000000000000000053b8deab29b8b00000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -9199,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec34000000000000000000000000b02000c80e381fe5a55b543cdf6abc7aeb44662f000000000000000000000000b02000c80e381fe5a55b543cdf6abc7aeb44662f00000000000000000000000000000000000000000000000000db43a93501972e00000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -9200,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec34000000000000000000000000583e4f6400ca8b7dbb0d9912a6627f80065287eb000000000000000000000000583e4f6400ca8b7dbb0d9912a6627f80065287eb0000000000000000000000000000000000000000000000000035a55eb81bc00000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -9204,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec3400000000000000000000000054776f34b7d8f92671884a33dba19aa356580a6700000000000000000000000054776f34b7d8f92671884a33dba19aa356580a67000000000000000000000000000000000000000000000000005593560798bfcf00000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -9205,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0xa9f9e675000000000000000000000000dac17f958d2ee523a2206206994597c13d831ec700000000000000000000000094b008aa00579c1307b0ef2c499ad98a8ce58e5800000000000000000000000020e4c5a2e44250b251e5018ab08e01a8a0990ca100000000000000000000000020e4c5a2e44250b251e5018ab08e01a8a0990ca10000000000000000000000000000000000000000000000000000000002fc1c4000000000000000000000000000000000000000000000000000000000000000c00000000000000000000000000000000000000000000000000000000000000000,,,1,true -9206,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0xa9f9e675000000000000000000000000dac17f958d2ee523a2206206994597c13d831ec700000000000000000000000094b008aa00579c1307b0ef2c499ad98a8ce58e580000000000000000000000006ff5c188b977bbfe299244b5c8adab10db3df9360000000000000000000000006ff5c188b977bbfe299244b5c8adab10db3df9360000000000000000000000000000000000000000000000000000000002fb407100000000000000000000000000000000000000000000000000000000000000c00000000000000000000000000000000000000000000000000000000000000000,,,1,true -9207,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec34000000000000000000000000fe254efa26aebfd48693e214f30fca97f9ff91b8000000000000000000000000fe254efa26aebfd48693e214f30fca97f9ff91b80000000000000000000000000000000000000000000000000027de1e0462d5ea00000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -9209,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0xa9f9e675000000000000000000000000dac17f958d2ee523a2206206994597c13d831ec700000000000000000000000094b008aa00579c1307b0ef2c499ad98a8ce58e58000000000000000000000000505f6d43864de1d3e10a3615f68f67a39714e5b8000000000000000000000000505f6d43864de1d3e10a3615f68f67a39714e5b80000000000000000000000000000000000000000000000000000000002faf65400000000000000000000000000000000000000000000000000000000000000c00000000000000000000000000000000000000000000000000000000000000000,,,1,true -9210,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0xa9f9e675000000000000000000000000dac17f958d2ee523a2206206994597c13d831ec700000000000000000000000094b008aa00579c1307b0ef2c499ad98a8ce58e58000000000000000000000000fd9272d6fd33507356a86f62c0070c1d5652f4df000000000000000000000000fd9272d6fd33507356a86f62c0070c1d5652f4df0000000000000000000000000000000000000000000000000000000002fab22700000000000000000000000000000000000000000000000000000000000000c00000000000000000000000000000000000000000000000000000000000000000,,,1,true -9211,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec34000000000000000000000000dcedc4a80f03ba8ff3a7fc545fc9f4461b5788be000000000000000000000000dcedc4a80f03ba8ff3a7fc545fc9f4461b5788be00000000000000000000000000000000000000000000000000005af3107a400000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -9212,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec34000000000000000000000000cc6e9f322c5e694139228cfbfef35b9bfe846e84000000000000000000000000cc6e9f322c5e694139228cfbfef35b9bfe846e84000000000000000000000000000000000000000000000000000aa87bee53800000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -9214,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec34000000000000000000000000d1e33539ac9169415dac3bd2b2a8f63efb602479000000000000000000000000d1e33539ac9169415dac3bd2b2a8f63efb60247900000000000000000000000000000000000000000000000000044bd14142fd8000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -9215,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec34000000000000000000000000b34bd1d3ce820b56ab9adc2ebc81b819080a6403000000000000000000000000b34bd1d3ce820b56ab9adc2ebc81b819080a6403000000000000000000000000000000000000000000000000000504d56923008000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -9217,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec34000000000000000000000000e54c2e783e8fde040096404e67688d5744596b3a000000000000000000000000e54c2e783e8fde040096404e67688d5744596b3a00000000000000000000000000000000000000000000000000921c83f1284f0600000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -9218,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec34000000000000000000000000114b88f671c2fcb4b5457cbedf8a1da5a11f9611000000000000000000000000114b88f671c2fcb4b5457cbedf8a1da5a11f961100000000000000000000000000000000000000000000000000962f6229d07a4500000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -9219,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0xa9f9e675000000000000000000000000a0b86991c6218b36c1d19d4a2e9eb0ce3606eb480000000000000000000000007f5c764cbc14f9669b88837ca1490cca17c316070000000000000000000000006539028b70a88f11b853f0b08aa8740ded60c1080000000000000000000000006539028b70a88f11b853f0b08aa8740ded60c108000000000000000000000000000000000000000000000000000000002faf080000000000000000000000000000000000000000000000000000000000000000c00000000000000000000000000000000000000000000000000000000000000000,,,1,true -9222,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec3400000000000000000000000071c04e28317150e78903047407d5253edc15819c00000000000000000000000071c04e28317150e78903047407d5253edc15819c00000000000000000000000000000000000000000000000000672366cf64cdac00000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -9223,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec34000000000000000000000000dced0b4ef8c9e236307726c8d18496009b8693d0000000000000000000000000dced0b4ef8c9e236307726c8d18496009b8693d000000000000000000000000000000000000000000000000000254d59e672b70000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -9225,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec34000000000000000000000000f09f00cb348571d0f9f03ca1e1efa77f25b3ba43000000000000000000000000f09f00cb348571d0f9f03ca1e1efa77f25b3ba4300000000000000000000000000000000000000000000000003ee63bcd23a8e5c00000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -9229,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec3400000000000000000000000044d0b1b261d980fbaedc869d909bc59a9ca1342700000000000000000000000044d0b1b261d980fbaedc869d909bc59a9ca1342700000000000000000000000000000000000000000000000000080cb955bba4ed00000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -9230,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec340000000000000000000000002a23469cf23dc27054610c2b12bbe4d86abeffea0000000000000000000000002a23469cf23dc27054610c2b12bbe4d86abeffea000000000000000000000000000000000000000000000000002aa1efb94e000000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -9231,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec3400000000000000000000000034f4f78e412c6ab52a4c1f58e257f21547584ca500000000000000000000000034f4f78e412c6ab52a4c1f58e257f21547584ca50000000000000000000000000000000000000000000000000022548ecd850d4900000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -9233,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec34000000000000000000000000a007b5d85f67a4d882927ef2ca992735a21d5028000000000000000000000000a007b5d85f67a4d882927ef2ca992735a21d50280000000000000000000000000000000000000000000000000060b9ce4961130200000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,0x2ce949ccd67d40b5a62a63f2fc3ffcdd2708537a55bd58ed6bbe77c370f06f0a,2022-04-20 10:40:09.000 UTC,0,true -9236,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec340000000000000000000000007d4e6ac859e207036f0bd1f891a7661122f871980000000000000000000000007d4e6ac859e207036f0bd1f891a7661122f87198000000000000000000000000000000000000000000000000015a4c3ae94033c000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -9238,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec34000000000000000000000000cf4701ca4a43d0028c46b67c92ac436ec290e33e000000000000000000000000cf4701ca4a43d0028c46b67c92ac436ec290e33e0000000000000000000000000000000000000000000000000098bb42ad93b0a100000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -9239,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec34000000000000000000000000f9cb3aa3f3fff85918904fa341db511866f9f4fe000000000000000000000000f9cb3aa3f3fff85918904fa341db511866f9f4fe000000000000000000000000000000000000000000000000000665172898800000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -9240,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec340000000000000000000000002cb4bb6da78577e18b183f5ec93995b3e42fe4c80000000000000000000000002cb4bb6da78577e18b183f5ec93995b3e42fe4c8000000000000000000000000000000000000000000000000000d0591bf1d3e0000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -9241,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec340000000000000000000000002e4230ceea610111f3bd7925aa27dd1de1bfe2a80000000000000000000000002e4230ceea610111f3bd7925aa27dd1de1bfe2a8000000000000000000000000000000000000000000000000001a9def5bd2195700000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -9242,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec340000000000000000000000005ea6838036e80f29f8e06c07e2bd225aa324e9560000000000000000000000005ea6838036e80f29f8e06c07e2bd225aa324e9560000000000000000000000000000000000000000000000000089a62cc5859e0000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -9243,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec340000000000000000000000002fd053df2901ec08938aa235e2c48fc3f2a751210000000000000000000000002fd053df2901ec08938aa235e2c48fc3f2a75121000000000000000000000000000000000000000000000000002d3eeba754dfe100000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -9244,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec340000000000000000000000002abcacef500c0a228450a0c605c5fce842ec32890000000000000000000000002abcacef500c0a228450a0c605c5fce842ec3289000000000000000000000000000000000000000000000000000b3810b171c93200000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -9245,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec34000000000000000000000000a9dd44ed03ca24ac14f193d3ceb43c89dac7cf9c000000000000000000000000a9dd44ed03ca24ac14f193d3ceb43c89dac7cf9c0000000000000000000000000000000000000000000000000011c37937e0800000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -9246,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec3400000000000000000000000048e5bc4d87bf5878ed75c0755cc6385389752f9200000000000000000000000048e5bc4d87bf5878ed75c0755cc6385389752f92000000000000000000000000000000000000000000000000000221b262dd800000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -9247,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec3400000000000000000000000052727488692711bf76b8114b28765733341d99b500000000000000000000000052727488692711bf76b8114b28765733341d99b50000000000000000000000000000000000000000000000000080e71cd4aa600000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -9248,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec340000000000000000000000003fe87af9c27243ab2e70f55daacd990ea4f971280000000000000000000000003fe87af9c27243ab2e70f55daacd990ea4f9712800000000000000000000000000000000000000000000000000197f9c1d453a7200000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -9249,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec34000000000000000000000000ff54b8ff7bd8f58295055606b59abdf3ac2eb27a000000000000000000000000ff54b8ff7bd8f58295055606b59abdf3ac2eb27a00000000000000000000000000000000000000000000000000071afd498d000000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -9250,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec3400000000000000000000000080439db68611029d6e8a46f49b7747242fac203900000000000000000000000080439db68611029d6e8a46f49b7747242fac203900000000000000000000000000000000000000000000000000611298a3f2d57d00000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -9251,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec34000000000000000000000000cd9746d5bd872cccb178099553dccfb9c93f5b79000000000000000000000000cd9746d5bd872cccb178099553dccfb9c93f5b790000000000000000000000000000000000000000000000000001c6bf5263400000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -9255,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec3400000000000000000000000021f14394d1eb6cf83743a1cfb78f1fb1049e7d6c00000000000000000000000021f14394d1eb6cf83743a1cfb78f1fb1049e7d6c000000000000000000000000000000000000000000000000000d726db46be90e00000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -9257,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec34000000000000000000000000599c5c2df0b8c398d151ac2a13ae576bbcecb671000000000000000000000000599c5c2df0b8c398d151ac2a13ae576bbcecb671000000000000000000000000000000000000000000000000001f06e3e2f66cbc00000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -9258,0x10e6593cdda8c58a1d0f14c5164b376352a55f2f,0x467194771dae2967aef3ecbedd3bf9a310c76c65,0xa9f9e6750000000000000000000000006b175474e89094c44da98b954eedeac495271d0f000000000000000000000000da10009cbd5d07dd0cecc66161fc93d7c9000da100000000000000000000000042ba2a84c1440290d9d66bea78248db81c160a6400000000000000000000000042ba2a84c1440290d9d66bea78248db81c160a64000000000000000000000000000000000000000000000000e70baa9f4b7f3cc400000000000000000000000000000000000000000000000000000000000000c00000000000000000000000000000000000000000000000000000000000000000,,,1,true -9259,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec340000000000000000000000008dc804d15747266979f6a1929fb2446301cee87b0000000000000000000000008dc804d15747266979f6a1929fb2446301cee87b0000000000000000000000000000000000000000000000000006c00a3912c00000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -9262,0x10e6593cdda8c58a1d0f14c5164b376352a55f2f,0x467194771dae2967aef3ecbedd3bf9a310c76c65,0xa9f9e6750000000000000000000000006b175474e89094c44da98b954eedeac495271d0f000000000000000000000000da10009cbd5d07dd0cecc66161fc93d7c9000da10000000000000000000000004285286356a91735d56bf3d072e49b72be370d270000000000000000000000004285286356a91735d56bf3d072e49b72be370d2700000000000000000000000000000000000000000000000056ff03f7d19c214800000000000000000000000000000000000000000000000000000000000000c00000000000000000000000000000000000000000000000000000000000000000,0xe0f8974f6533fd34f8a403ebf1f027726e411a95404c22b513f38c36745b1660,2021-12-17 05:34:09.000 UTC,0,true -9263,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0xa9f9e6750000000000000000000000001f9840a85d5af5bf1d1762f925bdaddc4201f9840000000000000000000000006fd9d7ad17242c41f7131d257212c54a0e816691000000000000000000000000a87df5f4ff03ac496988b87e25f025415118324c000000000000000000000000a87df5f4ff03ac496988b87e25f025415118324c0000000000000000000000000000000000000000000000000785a4bee73b569b00000000000000000000000000000000000000000000000000000000000000c00000000000000000000000000000000000000000000000000000000000000000,0x1745c8a044007993744768851862593b2e7306086a3a1d99a89404358505c66e,2022-05-28 06:33:45.000 UTC,0,true -9264,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec3400000000000000000000000047c5402a052957c9f0f126d956b2bccfb2a33a8400000000000000000000000047c5402a052957c9f0f126d956b2bccfb2a33a84000000000000000000000000000000000000000000000000000dcf6a5b91bfc000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -9265,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec34000000000000000000000000ee9dd8df1e32a3299796fd133b0a19fd27d5a78d000000000000000000000000ee9dd8df1e32a3299796fd133b0a19fd27d5a78d0000000000000000000000000000000000000000000000000011c37937e0800000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -9268,0xcd9d4988c0ae61887b075ba77f08cbfad2b65068,0x3f87ff1de58128ef8fcb4c807efd776e1ac72e51,0xf4f7b41a000000000000000000000000459dabca5ada6670cbc4da49593f8abb1bd849ba0000000000000000000000000000000000000000000000003761758e90ac8000,,,1,true -9271,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec34000000000000000000000000bf6380c18387dfacbb2a5a6d5c5064c05ceb707d000000000000000000000000bf6380c18387dfacbb2a5a6d5c5064c05ceb707d00000000000000000000000000000000000000000000000000560ec7e179493600000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -9272,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec3400000000000000000000000001b3eb2d3e6eccb1b276bf9b3b35ce6f970652b000000000000000000000000001b3eb2d3e6eccb1b276bf9b3b35ce6f970652b000000000000000000000000000000000000000000000000000648924d793154d00000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -9274,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec3400000000000000000000000034fc0c81594d49caa2da7f218d4232a67fe9f8cd00000000000000000000000034fc0c81594d49caa2da7f218d4232a67fe9f8cd0000000000000000000000000000000000000000000000000032c0e63eb172a400000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -9275,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec3400000000000000000000000008d0b5f85c1517c94742ceb2b56b36fbb63717d400000000000000000000000008d0b5f85c1517c94742ceb2b56b36fbb63717d400000000000000000000000000000000000000000000000000173b7b514ea77c00000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -9276,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec34000000000000000000000000ca47aaea6120929ce02ada914a46165481ec270f000000000000000000000000ca47aaea6120929ce02ada914a46165481ec270f000000000000000000000000000000000000000000000000001a4747e9aacbb700000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -9277,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec34000000000000000000000000f7d18ca327701c4ebffc8d7df123fa03eecb65b2000000000000000000000000f7d18ca327701c4ebffc8d7df123fa03eecb65b2000000000000000000000000000000000000000000000000014a236bedf9fb2b00000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -9278,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec34000000000000000000000000196bd4b3c76dec0f12bae6c97c86745880f330dd000000000000000000000000196bd4b3c76dec0f12bae6c97c86745880f330dd000000000000000000000000000000000000000000000000006a8c9930ca629a00000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -9279,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec34000000000000000000000000d528c1d6e3b5d544f161b5670183da6398e4ea83000000000000000000000000d528c1d6e3b5d544f161b5670183da6398e4ea830000000000000000000000000000000000000000000000000013c9abf30b4d3100000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,0xdfe26960e002b57af9221dd365396a99900f02ef3e898d8c60c4a318eb5f1f0a,2022-03-16 11:26:15.000 UTC,0,true -9280,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec34000000000000000000000000bfa11ee4870d08acd8530056a738e4fec094bb01000000000000000000000000bfa11ee4870d08acd8530056a738e4fec094bb01000000000000000000000000000000000000000000000000001f8f206ee6b05700000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -9281,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec340000000000000000000000006eaab50da15fda48238a463012241b91b92fda140000000000000000000000006eaab50da15fda48238a463012241b91b92fda140000000000000000000000000000000000000000000000000013c285ed92ae7000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -9282,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec34000000000000000000000000b54f3fb9731b3486136ed35d2786672793eac37b000000000000000000000000b54f3fb9731b3486136ed35d2786672793eac37b0000000000000000000000000000000000000000000000000023756f5a033f6f00000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -9283,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec340000000000000000000000009f457c86f33ed9072055e549b0573dd4eec99c600000000000000000000000009f457c86f33ed9072055e549b0573dd4eec99c6000000000000000000000000000000000000000000000000000283161f22cb56900000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,0x5e527358bc01b64be29549d446a75dc73051329fb159e4569c589ec10a8e1e48,2022-05-18 14:59:01.000 UTC,0,true -9284,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec3400000000000000000000000013c65f9acdf88140bc900e848f383462db39144b00000000000000000000000013c65f9acdf88140bc900e848f383462db39144b0000000000000000000000000000000000000000000000000009f295cd5f000000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -9285,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec34000000000000000000000000f46d8d3da0ad193c3830d0c4674d836453c1f730000000000000000000000000f46d8d3da0ad193c3830d0c4674d836453c1f730000000000000000000000000000000000000000000000000000b54452c383c7700000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -9286,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec34000000000000000000000000555d164196c81b8eb43b8222ae54c3d2edf432b5000000000000000000000000555d164196c81b8eb43b8222ae54c3d2edf432b5000000000000000000000000000000000000000000000000002c7648b123bcca00000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -9287,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec340000000000000000000000004c3f8214027a3bd2b9f2a3c0b25d6dff3b524be70000000000000000000000004c3f8214027a3bd2b9f2a3c0b25d6dff3b524be700000000000000000000000000000000000000000000000000858ab8ac2a973d00000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -9288,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec34000000000000000000000000511fd147204c6d0ca4559eb6d87c1fe4bd1fa006000000000000000000000000511fd147204c6d0ca4559eb6d87c1fe4bd1fa0060000000000000000000000000000000000000000000000000001c6bf5263400000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -9293,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec340000000000000000000000001877a64a37778e58ac2646107ece72a24d07021d0000000000000000000000001877a64a37778e58ac2646107ece72a24d07021d00000000000000000000000000000000000000000000000000005af3107a400000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -9295,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec34000000000000000000000000be0f0f1077e5f5ed5e9b1dac16b6873163889381000000000000000000000000be0f0f1077e5f5ed5e9b1dac16b687316388938100000000000000000000000000000000000000000000000000215c7330bae20000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,0x5d8d3d298cb3a3592f301c75c0a1063535216a71023dcd0b71957e977f367d13,2022-01-09 08:58:25.000 UTC,0,true -9298,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec340000000000000000000000002478c895d589c86f8a3b4166bf50532250449c470000000000000000000000002478c895d589c86f8a3b4166bf50532250449c4700000000000000000000000000000000000000000000000000994ac868457a6200000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -9300,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec34000000000000000000000000b1f0b017a8a1cf913056bd813c3e1958045feca4000000000000000000000000b1f0b017a8a1cf913056bd813c3e1958045feca400000000000000000000000000000000000000000000000000470de4df82000000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -9301,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec340000000000000000000000002a068f207215241f406d01c5b0f767ead62f28f10000000000000000000000002a068f207215241f406d01c5b0f767ead62f28f10000000000000000000000000000000000000000000000000093f87c9f9bd07500000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,0xc2e5af446d8b40cd61aecac17e07df8510ae753fd548ea2ea686ebdafd59c58e,2022-05-07 02:43:56.000 UTC,0,true -9302,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec34000000000000000000000000b25e559bd09e91f3b28f787c17530b2da5d2b5fe000000000000000000000000b25e559bd09e91f3b28f787c17530b2da5d2b5fe00000000000000000000000000000000000000000000000000038d7ea4c6800000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -9303,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec34000000000000000000000000b25e559bd09e91f3b28f787c17530b2da5d2b5fe000000000000000000000000b25e559bd09e91f3b28f787c17530b2da5d2b5fe0000000000000000000000000000000000000000000000000001c6bf5263400000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -9305,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec34000000000000000000000000f09473bead03711eb34f3efd5e59c369cc11c3aa000000000000000000000000f09473bead03711eb34f3efd5e59c369cc11c3aa00000000000000000000000000000000000000000000000002c0a5566257e60000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -9306,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec34000000000000000000000000e18c444e82ddac4046a55355d97241ec59c7184c000000000000000000000000e18c444e82ddac4046a55355d97241ec59c7184c0000000000000000000000000000000000000000000000000de0b6b3a764000000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -9308,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec34000000000000000000000000be88f94781de8d77f0af8fb312eae9839e3a6837000000000000000000000000be88f94781de8d77f0af8fb312eae9839e3a6837000000000000000000000000000000000000000000000000015f46284133f30000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -9310,0xcd9d4988c0ae61887b075ba77f08cbfad2b65068,0x3f87ff1de58128ef8fcb4c807efd776e1ac72e51,0xf4f7b41a000000000000000000000000ae15032ef0fd26cd64379d1320cd480641c1de9400000000000000000000000000000000000000000000000635963db041b4e000,,,1,true -9311,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec3400000000000000000000000037f9349dfb6c8875e40421eb32be9fc1e20f2e4600000000000000000000000037f9349dfb6c8875e40421eb32be9fc1e20f2e4600000000000000000000000000000000000000000000000000178a2ba80d0f0000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -9316,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec34000000000000000000000000bd2dc5fb8b6222d9f743b3eeec059790c07ca2a4000000000000000000000000bd2dc5fb8b6222d9f743b3eeec059790c07ca2a4000000000000000000000000000000000000000000000000001c3e3054eb723500000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -9317,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec34000000000000000000000000f0c09d91aa30e491e1a3a20c6fd35838257e2648000000000000000000000000f0c09d91aa30e491e1a3a20c6fd35838257e26480000000000000000000000000000000000000000000000000019519394a8c3ea00000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -9318,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec340000000000000000000000006a06716d67727dfd6ab1d2ea59be872a9164c17f0000000000000000000000006a06716d67727dfd6ab1d2ea59be872a9164c17f00000000000000000000000000000000000000000000000002b5a9c2fa34d2c000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -9320,0x10e6593cdda8c58a1d0f14c5164b376352a55f2f,0x467194771dae2967aef3ecbedd3bf9a310c76c65,0xa9f9e6750000000000000000000000006b175474e89094c44da98b954eedeac495271d0f000000000000000000000000da10009cbd5d07dd0cecc66161fc93d7c9000da10000000000000000000000006a06716d67727dfd6ab1d2ea59be872a9164c17f0000000000000000000000006a06716d67727dfd6ab1d2ea59be872a9164c17f0000000000000000000000000000000000000000000000360af9ae23bb59135800000000000000000000000000000000000000000000000000000000000000c00000000000000000000000000000000000000000000000000000000000000000,,,1,true -9323,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec34000000000000000000000000655790887ba1125627a35b1402121f85619c4ce9000000000000000000000000655790887ba1125627a35b1402121f85619c4ce90000000000000000000000000000000000000000000000000032e69d7292a58000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -9324,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec34000000000000000000000000af25f79ffd2fc428c80392f0796ec9c3b2e37fac000000000000000000000000af25f79ffd2fc428c80392f0796ec9c3b2e37fac000000000000000000000000000000000000000000000000036ae123beeec7bb00000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,0x2573bdff57c0c2aee2eacfe6e8bc1e4d894f5b454ef998458289c88433ce739d,2022-05-07 04:47:34.000 UTC,0,true -9325,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec340000000000000000000000002fa7d6b46a2e88ba99c7b3aa150916eedd3401b90000000000000000000000002fa7d6b46a2e88ba99c7b3aa150916eedd3401b9000000000000000000000000000000000000000000000000001e2ad1d57b627500000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -9332,0xcd9d4988c0ae61887b075ba77f08cbfad2b65068,0x3f87ff1de58128ef8fcb4c807efd776e1ac72e51,0xf4f7b41a0000000000000000000000003224a28d565ccd730e815affd83772ece93e1760000000000000000000000000000000000000000000000069bb18b4790727b3e4,,,1,true -9334,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec340000000000000000000000002996fe21cf925d4304ac11ef7c61481e97e739790000000000000000000000002996fe21cf925d4304ac11ef7c61481e97e7397900000000000000000000000000000000000000000000000000b4cb58a4efe73900000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -9335,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec34000000000000000000000000067e056e707834cde7635023da431ba5eb3dff28000000000000000000000000067e056e707834cde7635023da431ba5eb3dff280000000000000000000000000000000000000000000000000153f909e7ca181b00000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -9336,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec34000000000000000000000000e9686237455fd803f1fafecd58b194569462dc3e000000000000000000000000e9686237455fd803f1fafecd58b194569462dc3e0000000000000000000000000000000000000000000000001796ee934707dd6500000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -9338,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec340000000000000000000000002f6b34da0a9272d9e178345cdc9cdffcaf22e0c50000000000000000000000002f6b34da0a9272d9e178345cdc9cdffcaf22e0c5000000000000000000000000000000000000000000000000001696d36a3aebad00000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -9339,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec34000000000000000000000000ebd026b41b789b7d6085e42fee4fef5f566bc51e000000000000000000000000ebd026b41b789b7d6085e42fee4fef5f566bc51e0000000000000000000000000000000000000000000000000000169f544d2ca200000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -9340,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec34000000000000000000000000353814d9e14c5b225c53d2405a88b54926a52f19000000000000000000000000353814d9e14c5b225c53d2405a88b54926a52f190000000000000000000000000000000000000000000000000c20b280db71303d00000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -9342,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec340000000000000000000000004993c856bf66dc5fe26f2760b6eb5795d4d1c1b20000000000000000000000004993c856bf66dc5fe26f2760b6eb5795d4d1c1b200000000000000000000000000000000000000000000000000861251576f90d200000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -9345,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec34000000000000000000000000837e285fd01be3720b8d39d685721372da434505000000000000000000000000837e285fd01be3720b8d39d685721372da434505000000000000000000000000000000000000000000000000000665172898800000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -9346,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec340000000000000000000000000a251df99a88a20a93876205fb7f5faf2e85a4810000000000000000000000000a251df99a88a20a93876205fb7f5faf2e85a481000000000000000000000000000000000000000000000000003c7ad7f46d4b0000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -9347,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec340000000000000000000000004710bd5bf91c3e56be0f8f60a4f70b1eb8fb0a7c0000000000000000000000004710bd5bf91c3e56be0f8f60a4f70b1eb8fb0a7c0000000000000000000000000000000000000000000000000002e78c1604f96300000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -9351,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec3400000000000000000000000057f257e58b1831e4e57815026e889203c4338c2200000000000000000000000057f257e58b1831e4e57815026e889203c4338c22000000000000000000000000000000000000000000000000005fec5b60ef800000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -9352,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec34000000000000000000000000137bc42fb993998427f77ea9fa00428b15eb6e9c000000000000000000000000137bc42fb993998427f77ea9fa00428b15eb6e9c000000000000000000000000000000000000000000000000000df91a9fb2d24a00000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -9353,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec34000000000000000000000000fdc1fdaefc803081705b6828be4dabe657a38b63000000000000000000000000fdc1fdaefc803081705b6828be4dabe657a38b63000000000000000000000000000000000000000000000000000665172898800000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -9354,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec34000000000000000000000000ed3657715825bb97462f54a4e9954c0b567a527c000000000000000000000000ed3657715825bb97462f54a4e9954c0b567a527c00000000000000000000000000000000000000000000000000119ecc9f07cd0b00000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -9356,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec3400000000000000000000000021efeb91568e267861805964a49b52de13b3214300000000000000000000000021efeb91568e267861805964a49b52de13b32143000000000000000000000000000000000000000000000000000f07fe7fab2c6000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -9358,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec340000000000000000000000002720c59ec77de3c95bc96f7331094e6d2c424d540000000000000000000000002720c59ec77de3c95bc96f7331094e6d2c424d54000000000000000000000000000000000000000000000000001b27692b42438000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -9359,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec34000000000000000000000000ef3c98e82e07e20b727320c8007cad35cdfcae82000000000000000000000000ef3c98e82e07e20b727320c8007cad35cdfcae820000000000000000000000000000000000000000000000000022ff2c2c5705a000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -9360,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec34000000000000000000000000cf5271dfce67df0c4ab7508990a396dac9260fb7000000000000000000000000cf5271dfce67df0c4ab7508990a396dac9260fb70000000000000000000000000000000000000000000000000010cfd7f1d93b6a00000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -9365,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec34000000000000000000000000be4619bfec05b3f08626e371f683c966fb20c03e000000000000000000000000be4619bfec05b3f08626e371f683c966fb20c03e00000000000000000000000000000000000000000000000000408089599f349100000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -9366,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec34000000000000000000000000090f0c594f6a091adf6e8a2d5f542c393dda2bcc000000000000000000000000090f0c594f6a091adf6e8a2d5f542c393dda2bcc000000000000000000000000000000000000000000000000002e2c01e24d5b0000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -9367,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec3400000000000000000000000092e8eb0cc8cb7aa6c315deb3d6901b17e58d063b00000000000000000000000092e8eb0cc8cb7aa6c315deb3d6901b17e58d063b000000000000000000000000000000000000000000000000002b749ddf128ade00000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -9368,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec3400000000000000000000000012152e86425e2177951468219474b9ba6b7af02b00000000000000000000000012152e86425e2177951468219474b9ba6b7af02b0000000000000000000000000000000000000000000000000089475dec56c50000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -9369,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec340000000000000000000000004f41e7b786ba3dcc794a1798e4b940f83b828b1b0000000000000000000000004f41e7b786ba3dcc794a1798e4b940f83b828b1b00000000000000000000000000000000000000000000000000f234409b70023b00000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -9371,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec3400000000000000000000000008be1c270218a2468f720b8d00a7de43eadbc29a00000000000000000000000008be1c270218a2468f720b8d00a7de43eadbc29a000000000000000000000000000000000000000000000000015e99e17963bb0000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -9372,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec34000000000000000000000000201dc733562b29eb35f358f401b8cff97297d340000000000000000000000000201dc733562b29eb35f358f401b8cff97297d34000000000000000000000000000000000000000000000000000038d7ea4c6800000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -9373,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec34000000000000000000000000ab6e6ef4d98a59c76769f7ab4e30bd3895e96005000000000000000000000000ab6e6ef4d98a59c76769f7ab4e30bd3895e9600500000000000000000000000000000000000000000000000000038d7ea4c6800000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -9374,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec3400000000000000000000000005c49f81bdabbfc584ed69a448df43506a50079000000000000000000000000005c49f81bdabbfc584ed69a448df43506a50079000000000000000000000000000000000000000000000000000038d7ea4c6800000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -9375,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec340000000000000000000000003645219d84c202e86e5a0652d198ab176bd1b18b0000000000000000000000003645219d84c202e86e5a0652d198ab176bd1b18b00000000000000000000000000000000000000000000000000038d7ea4c6800000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -9376,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec3400000000000000000000000084285466b55d6f377e32005bd26848c85cb0020600000000000000000000000084285466b55d6f377e32005bd26848c85cb0020600000000000000000000000000000000000000000000000000038d7ea4c6800000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -9378,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec340000000000000000000000000b3c8597032cce4fc2af68cc48783455c2fd7a5c0000000000000000000000000b3c8597032cce4fc2af68cc48783455c2fd7a5c00000000000000000000000000000000000000000000000000038d7ea4c6800000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -9379,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec3400000000000000000000000025e6fccf1b93555aa9e2c58fea2f469507cf76a500000000000000000000000025e6fccf1b93555aa9e2c58fea2f469507cf76a500000000000000000000000000000000000000000000000000038d7ea4c6800000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -9380,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec3400000000000000000000000069612b3c79d214aa9fbbed24e758ea296d373c3600000000000000000000000069612b3c79d214aa9fbbed24e758ea296d373c3600000000000000000000000000000000000000000000000000038d7ea4c6800000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -9381,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec34000000000000000000000000215dc4f0eebb4e57fd0e5827add3403035109704000000000000000000000000215dc4f0eebb4e57fd0e5827add340303510970400000000000000000000000000000000000000000000000000038d7ea4c6800000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -9382,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec34000000000000000000000000781c3d6bacb3417c2c5dae348e35c6cb801a425d000000000000000000000000781c3d6bacb3417c2c5dae348e35c6cb801a425d00000000000000000000000000000000000000000000000000038d7ea4c6800000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -9383,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec34000000000000000000000000813c36852827c230c3f53dd2ab319d2d59797bcd000000000000000000000000813c36852827c230c3f53dd2ab319d2d59797bcd00000000000000000000000000000000000000000000000000038d7ea4c6800000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -9384,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec34000000000000000000000000f1ee081974bd829eb8f88fe283d4cab03099abd6000000000000000000000000f1ee081974bd829eb8f88fe283d4cab03099abd600000000000000000000000000000000000000000000000000038d7ea4c6800000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -9385,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec34000000000000000000000000ed16299c9f3ad2b85342991fd1c7fb5b7641f28e000000000000000000000000ed16299c9f3ad2b85342991fd1c7fb5b7641f28e00000000000000000000000000000000000000000000000000038d7ea4c6800000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -9386,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec34000000000000000000000000502b811e4d4e89ab278e3d5edd70c1142d0f7207000000000000000000000000502b811e4d4e89ab278e3d5edd70c1142d0f720700000000000000000000000000000000000000000000000000038d7ea4c6800000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -9387,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec340000000000000000000000001810bc0600f9c0c008e0bccc980d40a651f0992a0000000000000000000000001810bc0600f9c0c008e0bccc980d40a651f0992a00000000000000000000000000000000000000000000000000038d7ea4c6800000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -9388,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec3400000000000000000000000074297dba00d452cedde835c6f7c3a8a903104e4e00000000000000000000000074297dba00d452cedde835c6f7c3a8a903104e4e00000000000000000000000000000000000000000000000000038d7ea4c6800000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -9389,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec3400000000000000000000000071e76dc3bebc994087b736c277fd343df20ec37900000000000000000000000071e76dc3bebc994087b736c277fd343df20ec37900000000000000000000000000000000000000000000000000038d7ea4c6800000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -9390,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec34000000000000000000000000731fd0bee5e6586376a71abb99ff8163564e5940000000000000000000000000731fd0bee5e6586376a71abb99ff8163564e594000000000000000000000000000000000000000000000000000038d7ea4c6800000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -9391,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0xa9f9e675000000000000000000000000a0b86991c6218b36c1d19d4a2e9eb0ce3606eb480000000000000000000000007f5c764cbc14f9669b88837ca1490cca17c31607000000000000000000000000e80d4eb607984b26c488f265801c997a259dd80b000000000000000000000000e80d4eb607984b26c488f265801c997a259dd80b000000000000000000000000000000000000000000000000000000003528a93900000000000000000000000000000000000000000000000000000000000000c00000000000000000000000000000000000000000000000000000000000000000,,,1,true -9392,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec340000000000000000000000006d646c61d4588d27491ce4fb3d56301f2a493c280000000000000000000000006d646c61d4588d27491ce4fb3d56301f2a493c28000000000000000000000000000000000000000000000000004d304e1fa4e2c800000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -9393,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec34000000000000000000000000ef45e94c3e03979ad47d6aeb1170ed86bae00d1e000000000000000000000000ef45e94c3e03979ad47d6aeb1170ed86bae00d1e00000000000000000000000000000000000000000000000000038d7ea4c6800000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -9394,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec34000000000000000000000000454e08277cf48c2db7e619c921f22db9360494e3000000000000000000000000454e08277cf48c2db7e619c921f22db9360494e300000000000000000000000000000000000000000000000000038d7ea4c6800000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -9395,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec3400000000000000000000000043dda16a8e5fa5d5bee9f8e442ea812cc5a80c8900000000000000000000000043dda16a8e5fa5d5bee9f8e442ea812cc5a80c8900000000000000000000000000000000000000000000000000038d7ea4c6800000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -9396,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec340000000000000000000000001d17cf7dbe048807ddc142fe887dc174d9e59ec90000000000000000000000001d17cf7dbe048807ddc142fe887dc174d9e59ec900000000000000000000000000000000000000000000000000038d7ea4c6800000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -9397,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec34000000000000000000000000c69b47d4c9ba5f6440183ecff4749f12905933fd000000000000000000000000c69b47d4c9ba5f6440183ecff4749f12905933fd00000000000000000000000000000000000000000000000000038d7ea4c6800000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -9398,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec34000000000000000000000000be41953010251d94ad5de4f4a7c6b970ca7be4d0000000000000000000000000be41953010251d94ad5de4f4a7c6b970ca7be4d000000000000000000000000000000000000000000000000000038d7ea4c6800000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -9399,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec3400000000000000000000000085704b4b37cdb762a66d15e5fff3096620456d5c00000000000000000000000085704b4b37cdb762a66d15e5fff3096620456d5c00000000000000000000000000000000000000000000000000038d7ea4c6800000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -9400,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec34000000000000000000000000dbae11ccb6b39d2fbda0ccb4712b9d40cbc63d3e000000000000000000000000dbae11ccb6b39d2fbda0ccb4712b9d40cbc63d3e00000000000000000000000000000000000000000000000000038d7ea4c6800000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -9401,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec3400000000000000000000000099e86304a71df6e3181d4dc594e9da2c7b91e72d00000000000000000000000099e86304a71df6e3181d4dc594e9da2c7b91e72d000000000000000000000000000000000000000000000000007ffb96364d9ea300000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -9402,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec3400000000000000000000000072cc613ab9d908cf47ba1eda214f8db5afcef1ce00000000000000000000000072cc613ab9d908cf47ba1eda214f8db5afcef1ce000000000000000000000000000000000000000000000000002386f26fc1000000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -9403,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec3400000000000000000000000030ca51c31a25a8a581903ca37647eee1c827602b00000000000000000000000030ca51c31a25a8a581903ca37647eee1c827602b00000000000000000000000000000000000000000000000000ad3227ecfc140000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -9405,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec340000000000000000000000005f24b98ad804e6e87b1d90ff843f6a46b3feab4e0000000000000000000000005f24b98ad804e6e87b1d90ff843f6a46b3feab4e000000000000000000000000000000000000000000000000000d63f448376b0000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -9406,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec3400000000000000000000000070c969b616e0e400d55b5ada2cd544a5d7c160bf00000000000000000000000070c969b616e0e400d55b5ada2cd544a5d7c160bf0000000000000000000000000000000000000000000000000040846d7982345b00000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -9407,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec3400000000000000000000000003e23505d4c3a701c6ae843a3bd48997a7376fb400000000000000000000000003e23505d4c3a701c6ae843a3bd48997a7376fb40000000000000000000000000000000000000000000000001bb7c64f114bca4000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -9408,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec340000000000000000000000005483d50d366b2c47b16ec6f0f0a66963754c3d030000000000000000000000005483d50d366b2c47b16ec6f0f0a66963754c3d0300000000000000000000000000000000000000000000000000884925af0afe0000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -9409,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec34000000000000000000000000e63ddc147253f8d004b14224df49b529de47a665000000000000000000000000e63ddc147253f8d004b14224df49b529de47a6650000000000000000000000000000000000000000000000000080aa1e7c9ee07b00000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -9410,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec340000000000000000000000000bfa9f6741056c180a0ac825bac06a665898d44c0000000000000000000000000bfa9f6741056c180a0ac825bac06a665898d44c000000000000000000000000000000000000000000000000005ff3db60039fc000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -9411,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec340000000000000000000000006c29696ebd2a47ccf361dc7fb421da4532e897fb0000000000000000000000006c29696ebd2a47ccf361dc7fb421da4532e897fb000000000000000000000000000000000000000000000000006042c8aa21bd4b00000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -9412,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec3400000000000000000000000097bab1b1353f3717aefab2f9ae319e1f4f614b0100000000000000000000000097bab1b1353f3717aefab2f9ae319e1f4f614b010000000000000000000000000000000000000000000000000042da6f7ae3784e00000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -9413,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec34000000000000000000000000ce00ca9e1675fe532dda35a8784bef9f276a0165000000000000000000000000ce00ca9e1675fe532dda35a8784bef9f276a016500000000000000000000000000000000000000000000000000470de4df82000000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,0x8d64c56ffd31140fc4df58691b76ffb0ea752e34a7b48794506fdb758c63280b,2022-07-04 07:14:28.000 UTC,0,true -9414,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec3400000000000000000000000084c57ac9448b9fd931d2b4803716aa4e76c8e82a00000000000000000000000084c57ac9448b9fd931d2b4803716aa4e76c8e82a000000000000000000000000000000000000000000000000016345785d8a000000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,0xcb9c0343593a2f248d3e41cca83577bb495a1f6f75a660fa1002da21bc938f41,2022-06-11 19:28:32.000 UTC,0,true -9415,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec34000000000000000000000000d01df8cde50458831a311cc114f2e2fc262b4573000000000000000000000000d01df8cde50458831a311cc114f2e2fc262b4573000000000000000000000000000000000000000000000000001c6bf52634000000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -9416,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec340000000000000000000000009119c41ad7a14e53b5882210a4acc31eaf23275e0000000000000000000000009119c41ad7a14e53b5882210a4acc31eaf23275e00000000000000000000000000000000000000000000000000f740b7c15c580200000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,0x71afdbec735c684d14c15ae3716d112438710a2a829ceb0eab4a0faf0804c2fb,2022-03-04 07:22:33.000 UTC,0,true -9417,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec34000000000000000000000000843a315006c23eb34b4b0dc6a4284e80c3db86d4000000000000000000000000843a315006c23eb34b4b0dc6a4284e80c3db86d4000000000000000000000000000000000000000000000000013c31d34ed01ae300000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,0xacd3bf31ad1250ae7e92bed70fd588af0d5b25be91c92a0191bf6914033be4d5,2021-12-15 10:01:54.000 UTC,0,true -9420,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec340000000000000000000000006722222812d18958a0ee6c2a75ac4ed3f2048ca40000000000000000000000006722222812d18958a0ee6c2a75ac4ed3f2048ca4000000000000000000000000000000000000000000000000006a94d74f43000000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -9421,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec34000000000000000000000000fe9cdb03ebf1508f8dae114a7095cee140ed9cf2000000000000000000000000fe9cdb03ebf1508f8dae114a7095cee140ed9cf200000000000000000000000000000000000000000000000000071afd498d000000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -9422,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec34000000000000000000000000d01df8cde50458831a311cc114f2e2fc262b4573000000000000000000000000d01df8cde50458831a311cc114f2e2fc262b4573000000000000000000000000000000000000000000000000000aa87bee53800000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -9423,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec3400000000000000000000000059bd4ae28ac8b6215f722a9a813c7f67fc0e929400000000000000000000000059bd4ae28ac8b6215f722a9a813c7f67fc0e92940000000000000000000000000000000000000000000000000000b5e620f4800000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -9424,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec34000000000000000000000000172f7bcf2ab7f5066ab4e22c85f366e36a28820a000000000000000000000000172f7bcf2ab7f5066ab4e22c85f366e36a28820a0000000000000000000000000000000000000000000000000000b5e620f4800000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -9425,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec34000000000000000000000000fe9cdb03ebf1508f8dae114a7095cee140ed9cf2000000000000000000000000fe9cdb03ebf1508f8dae114a7095cee140ed9cf200000000000000000000000000000000000000000000000000071afd498d000000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -9426,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec34000000000000000000000000fe9cdb03ebf1508f8dae114a7095cee140ed9cf2000000000000000000000000fe9cdb03ebf1508f8dae114a7095cee140ed9cf200000000000000000000000000000000000000000000000000071afd498d000000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -9427,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec340000000000000000000000001ed92d98c7204084d9d86c80cf1cecfba64e11cc0000000000000000000000001ed92d98c7204084d9d86c80cf1cecfba64e11cc0000000000000000000000000000000000000000000000000000b5e620f4800000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -9428,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec34000000000000000000000000a14d9797878c6592e53ec17b81b6729f3a0c19d6000000000000000000000000a14d9797878c6592e53ec17b81b6729f3a0c19d60000000000000000000000000000000000000000000000000000b5e620f4800000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -9429,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec3400000000000000000000000090450285065bd2aae5539e7dec285c2b909cbbdc00000000000000000000000090450285065bd2aae5539e7dec285c2b909cbbdc000000000000000000000000000000000000000000000000008a271a42f4250000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -9432,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec3400000000000000000000000009102ab6f2c92b7fae7d35687a4d9654c2bc309c00000000000000000000000009102ab6f2c92b7fae7d35687a4d9654c2bc309c000000000000000000000000000000000000000000000000005102d67afffd2d00000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -9433,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec340000000000000000000000004f78c76667750062a28470fa9d17636cf99e7ff60000000000000000000000004f78c76667750062a28470fa9d17636cf99e7ff60000000000000000000000000000000000000000000000000062af5123b128cc00000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -9434,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec34000000000000000000000000867f2c3854a0feb9f0e2fa7da9484831732f302f000000000000000000000000867f2c3854a0feb9f0e2fa7da9484831732f302f00000000000000000000000000000000000000000000000000060a24181e400000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -9435,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec34000000000000000000000000cf9d50f495e489f03419c9037d437c3c6122b744000000000000000000000000cf9d50f495e489f03419c9037d437c3c6122b74400000000000000000000000000000000000000000000000000178773a2ba85f500000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -9436,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec340000000000000000000000006450da461d027a49c2b30f8cf41bd72798699a6b0000000000000000000000006450da461d027a49c2b30f8cf41bd72798699a6b000000000000000000000000000000000000000000000000001c6bf52634000000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -9437,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec34000000000000000000000000870b93d72d217d4b85f11d6507896f49d5f08feb000000000000000000000000870b93d72d217d4b85f11d6507896f49d5f08feb000000000000000000000000000000000000000000000000004e7c2c255a26b300000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -9439,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec34000000000000000000000000a2034241e6ed97b11e5dabba229c968c747a19e5000000000000000000000000a2034241e6ed97b11e5dabba229c968c747a19e5000000000000000000000000000000000000000000000000000221b262dd800000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -9440,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec34000000000000000000000000e46c821441771cf14f1d07602b27c64ca3341a12000000000000000000000000e46c821441771cf14f1d07602b27c64ca3341a120000000000000000000000000000000000000000000000000a71bf54649d37af00000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -9441,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec34000000000000000000000000383aca4e21388e32faf89fd941dffac9e3b33ff8000000000000000000000000383aca4e21388e32faf89fd941dffac9e3b33ff80000000000000000000000000000000000000000000000000018de76816d800000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -9442,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec340000000000000000000000007ef70c1bb25f298ff9827d522e3b1c2a38fb95e60000000000000000000000007ef70c1bb25f298ff9827d522e3b1c2a38fb95e6000000000000000000000000000000000000000000000000001ff973cafa800000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -9444,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec3400000000000000000000000009923338e76f7e853d93a3a5a4924f046ec7550e00000000000000000000000009923338e76f7e853d93a3a5a4924f046ec7550e000000000000000000000000000000000000000000000000000e1c8942dfa70000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -9445,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec34000000000000000000000000ee33af102f6fef6c3c155499adaa804ffbd0398f000000000000000000000000ee33af102f6fef6c3c155499adaa804ffbd0398f00000000000000000000000000000000000000000000000000154dcaf4770c3b00000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -9447,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec3400000000000000000000000063798de1a0e801de233034d57cb9b033f7606d2d00000000000000000000000063798de1a0e801de233034d57cb9b033f7606d2d000000000000000000000000000000000000000000000000001c19fc81eb0fea00000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -9448,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec34000000000000000000000000f93bee3e6c159f51581e39dcbf97db9727690a6a000000000000000000000000f93bee3e6c159f51581e39dcbf97db9727690a6a000000000000000000000000000000000000000000000000015adf6a8488945e00000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,0x6cfbb271749cb8eb91e6a2d0dad558cd696f12f8141ca319de956de91328a4b6,2022-02-15 14:00:21.000 UTC,0,true -9449,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec340000000000000000000000005a45672f14c8272a9443c6255e52ac4eae882bfc0000000000000000000000005a45672f14c8272a9443c6255e52ac4eae882bfc00000000000000000000000000000000000000000000000000b1a2bc2ec5000000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -9450,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec34000000000000000000000000e835af9a97134dd295174ca9ac0718db63b07ad7000000000000000000000000e835af9a97134dd295174ca9ac0718db63b07ad700000000000000000000000000000000000000000000000000f8b0a10e47000000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -9451,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec34000000000000000000000000d3f982b963a063440cf4a93ee2f2b7262473a2a8000000000000000000000000d3f982b963a063440cf4a93ee2f2b7262473a2a800000000000000000000000000000000000000000000000000b1a2bc2ec5000000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -9452,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec34000000000000000000000000ac82d6a9e995b3b8dcc24456218b816e5e5832aa000000000000000000000000ac82d6a9e995b3b8dcc24456218b816e5e5832aa00000000000000000000000000000000000000000000000000ca8132b032800000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -9453,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec34000000000000000000000000d3770cef12ca18f738778a65d4ed793af09b05ef000000000000000000000000d3770cef12ca18f738778a65d4ed793af09b05ef0000000000000000000000000000000000000000000000000121e6c485ac000000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -9454,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec340000000000000000000000000b4283d33efa4c509242f33147f0c6ccd20a8d980000000000000000000000000b4283d33efa4c509242f33147f0c6ccd20a8d980000000000000000000000000000000000000000000000000045e1c069e0c49700000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -9455,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec34000000000000000000000000bb9a04ec522d4d2de555d3c32032728f44ceac6f000000000000000000000000bb9a04ec522d4d2de555d3c32032728f44ceac6f00000000000000000000000000000000000000000000000000db8ec5c71e800000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -9456,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec3400000000000000000000000020b181d2f2afed425eced4cc680f97973a64060500000000000000000000000020b181d2f2afed425eced4cc680f97973a64060500000000000000000000000000000000000000000000000000fc9912c387c00000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -9457,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec3400000000000000000000000049f44c6df326ac1577bad16b85d902c59196dce100000000000000000000000049f44c6df326ac1577bad16b85d902c59196dce100000000000000000000000000000000000000000000000001c10a77b72d76e600000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,0xc8f1177068c454162da1bb1e585517286844ce1963e626a631509c6ca4a46e58,2022-02-14 08:42:28.000 UTC,0,true -9458,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec340000000000000000000000004ec53fc9628c449bffebf3aa47c6f57d0608c18e0000000000000000000000004ec53fc9628c449bffebf3aa47c6f57d0608c18e00000000000000000000000000000000000000000000000001478f69584a800000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -9459,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec340000000000000000000000001629052ed55b2198eec166a26a17db252a2e094f0000000000000000000000001629052ed55b2198eec166a26a17db252a2e094f00000000000000000000000000000000000000000000000001207af843c3000000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -9460,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec3400000000000000000000000036a656d41bbc80953e1d7aff9b704db5070d940e00000000000000000000000036a656d41bbc80953e1d7aff9b704db5070d940e000000000000000000000000000000000000000000000000000aa87bee53800000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -9461,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec340000000000000000000000002032dd3a8779d3fe81809af004b7bfe6ebd612f50000000000000000000000002032dd3a8779d3fe81809af004b7bfe6ebd612f500000000000000000000000000000000000000000000000000ffcb9e57d4000000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -9463,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0xa9f9e675000000000000000000000000a0b86991c6218b36c1d19d4a2e9eb0ce3606eb480000000000000000000000007f5c764cbc14f9669b88837ca1490cca17c31607000000000000000000000000edc2fdcc98b72e6e0406e795e485f1665ec8cfc6000000000000000000000000edc2fdcc98b72e6e0406e795e485f1665ec8cfc6000000000000000000000000000000000000000000000000000000003b9224f000000000000000000000000000000000000000000000000000000000000000c00000000000000000000000000000000000000000000000000000000000000000,0xa1554d6712b9c794da107909c2269f16602cfd55f251b748c195b9af0967085b,2022-04-20 10:33:15.000 UTC,0,true -9465,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec34000000000000000000000000b6fcd3e0e93e92d7f26aa0567bb3bb09528cdd79000000000000000000000000b6fcd3e0e93e92d7f26aa0567bb3bb09528cdd79000000000000000000000000000000000000000000000000013150f3779a922700000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -9466,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec34000000000000000000000000fd5344ac489cad99bac38b6e1a1ad718289e074b000000000000000000000000fd5344ac489cad99bac38b6e1a1ad718289e074b00000000000000000000000000000000000000000000000000038d7ea4c6800000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -9467,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec34000000000000000000000000b1833e3a5eb53d3700517e6466a1844c9dfb5bd4000000000000000000000000b1833e3a5eb53d3700517e6466a1844c9dfb5bd400000000000000000000000000000000000000000000000000038d7ea4c6800000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -9468,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec34000000000000000000000000852958a22a290e7dc0702d9bc2f3d60f3bc24f00000000000000000000000000852958a22a290e7dc0702d9bc2f3d60f3bc24f0000000000000000000000000000000000000000000000000000038d7ea4c6800000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -9469,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec34000000000000000000000000c459fa807062efc84c4d18e032ae05da9e1272cd000000000000000000000000c459fa807062efc84c4d18e032ae05da9e1272cd00000000000000000000000000000000000000000000000000038d7ea4c6800000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -9470,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec34000000000000000000000000517da7183897730aa3424898c44c8bc0d0206bf2000000000000000000000000517da7183897730aa3424898c44c8bc0d0206bf200000000000000000000000000000000000000000000000000038d7ea4c6800000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -9471,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec340000000000000000000000006e260ac9ecb4f1e4e19222a6442ce8ce0267e5a30000000000000000000000006e260ac9ecb4f1e4e19222a6442ce8ce0267e5a300000000000000000000000000000000000000000000000000038d7ea4c6800000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -9472,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec3400000000000000000000000058a4da2ce842e7df975eb1077ec1e4c06a0b866100000000000000000000000058a4da2ce842e7df975eb1077ec1e4c06a0b866100000000000000000000000000000000000000000000000000038d7ea4c6800000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -9473,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec340000000000000000000000003c7f6a9a32cdf437b6390b713bcd45a779e5492e0000000000000000000000003c7f6a9a32cdf437b6390b713bcd45a779e5492e00000000000000000000000000000000000000000000000000038d7ea4c6800000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -9474,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec340000000000000000000000007d12e0865917014e64e30afea6cf235b6ce830640000000000000000000000007d12e0865917014e64e30afea6cf235b6ce8306400000000000000000000000000000000000000000000000000038d7ea4c6800000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -9475,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec34000000000000000000000000395d583fe840c275bc528d285682e81a8e7c6b0d000000000000000000000000395d583fe840c275bc528d285682e81a8e7c6b0d000000000000000000000000000000000000000000000000002a1bb74be714e900000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -9476,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec340000000000000000000000006d11a7d1e3f3d1aad17294a513940312347922d40000000000000000000000006d11a7d1e3f3d1aad17294a513940312347922d400000000000000000000000000000000000000000000000000038d7ea4c6800000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -9477,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec34000000000000000000000000440c50687f35f0f251525dbd50f381a3084373ac000000000000000000000000440c50687f35f0f251525dbd50f381a3084373ac00000000000000000000000000000000000000000000000000354a6ba7a1800000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -9478,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec3400000000000000000000000076873fb189363a8c4a8d69ba6fba300ac5b1d91600000000000000000000000076873fb189363a8c4a8d69ba6fba300ac5b1d91600000000000000000000000000000000000000000000000000038d7ea4c6800000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -9479,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec34000000000000000000000000473e3eaf7961585fcd80626af4a07882db86a904000000000000000000000000473e3eaf7961585fcd80626af4a07882db86a90400000000000000000000000000000000000000000000000000038d7ea4c6800000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -9480,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec340000000000000000000000002feb6a35b7ba6aac0442364532a06d12409b10900000000000000000000000002feb6a35b7ba6aac0442364532a06d12409b109000000000000000000000000000000000000000000000000000038d7ea4c6800000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -9481,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec34000000000000000000000000053c0068da58dc80de6f3ec50ed67ae9aad3209a000000000000000000000000053c0068da58dc80de6f3ec50ed67ae9aad3209a00000000000000000000000000000000000000000000000000038d7ea4c6800000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -9482,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec3400000000000000000000000051aae740d3b49c91e2b584adc30d50cbb27b798e00000000000000000000000051aae740d3b49c91e2b584adc30d50cbb27b798e00000000000000000000000000000000000000000000000000038d7ea4c6800000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -9483,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec34000000000000000000000000719a04e7710a1709d7b30237121c023450da512c000000000000000000000000719a04e7710a1709d7b30237121c023450da512c00000000000000000000000000000000000000000000000000038d7ea4c6800000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -9484,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec34000000000000000000000000be68697ec3450fecfef189ce70a05f2f289c6e8b000000000000000000000000be68697ec3450fecfef189ce70a05f2f289c6e8b00000000000000000000000000000000000000000000000000038d7ea4c6800000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -9485,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec34000000000000000000000000256cd210943dc84c9164320a439c3e71c74527d5000000000000000000000000256cd210943dc84c9164320a439c3e71c74527d500000000000000000000000000000000000000000000000000038d7ea4c6800000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -9486,0x10e6593cdda8c58a1d0f14c5164b376352a55f2f,0x467194771dae2967aef3ecbedd3bf9a310c76c65,0xa9f9e6750000000000000000000000006b175474e89094c44da98b954eedeac495271d0f000000000000000000000000da10009cbd5d07dd0cecc66161fc93d7c9000da100000000000000000000000079c7df7740e999872277fe97eb3f8c106ee2af4b00000000000000000000000079c7df7740e999872277fe97eb3f8c106ee2af4b000000000000000000000000000000000000000000000010965bef679745935200000000000000000000000000000000000000000000000000000000000000c00000000000000000000000000000000000000000000000000000000000000000,,,1,true -9487,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec340000000000000000000000003137f5c744eb1ad89501841aa556c50b02f953d90000000000000000000000003137f5c744eb1ad89501841aa556c50b02f953d900000000000000000000000000000000000000000000000000038d7ea4c6800000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -9488,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec34000000000000000000000000bd273f64246432fe8d73e88397b6b683b4e39bd1000000000000000000000000bd273f64246432fe8d73e88397b6b683b4e39bd100000000000000000000000000000000000000000000000000038d7ea4c6800000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -9489,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec34000000000000000000000000b02dba56bcfa33564826aaf3c2a85b47e9f2c1c4000000000000000000000000b02dba56bcfa33564826aaf3c2a85b47e9f2c1c400000000000000000000000000000000000000000000000000038d7ea4c6800000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -9490,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec34000000000000000000000000fe4d75e540d6706b85d887992187fea4be84de78000000000000000000000000fe4d75e540d6706b85d887992187fea4be84de7800000000000000000000000000000000000000000000000000038d7ea4c6800000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -9491,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec340000000000000000000000004da38517372d424636e81632cd991fdf437514170000000000000000000000004da38517372d424636e81632cd991fdf4375141700000000000000000000000000000000000000000000000000038d7ea4c6800000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -9492,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec340000000000000000000000006dd20eb7d91144f0fa2b2a001105ae9322db8e990000000000000000000000006dd20eb7d91144f0fa2b2a001105ae9322db8e9900000000000000000000000000000000000000000000000000038d7ea4c6800000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -9493,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec340000000000000000000000005db7f5fce4f251701d4c5dc398177c0318a75efe0000000000000000000000005db7f5fce4f251701d4c5dc398177c0318a75efe00000000000000000000000000000000000000000000000000038d7ea4c6800000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -9494,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec340000000000000000000000005fdbda741479644440c061f79d3c0e5982086ebb0000000000000000000000005fdbda741479644440c061f79d3c0e5982086ebb00000000000000000000000000000000000000000000000000038d7ea4c6800000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -9495,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec3400000000000000000000000010cf17d2b35f2acbb348ea89da5d184f3b5d2a9f00000000000000000000000010cf17d2b35f2acbb348ea89da5d184f3b5d2a9f00000000000000000000000000000000000000000000000000038d7ea4c6800000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -9496,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec34000000000000000000000000f5654f35da5afc0a9a73021574830f79ad953d6d000000000000000000000000f5654f35da5afc0a9a73021574830f79ad953d6d000000000000000000000000000000000000000000000000014461965063196600000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -9497,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec340000000000000000000000008c427e9e0e014476a6351ed0608fa7c6e433cb550000000000000000000000008c427e9e0e014476a6351ed0608fa7c6e433cb5500000000000000000000000000000000000000000000000000038d7ea4c6800000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -9498,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec340000000000000000000000006b987ee8e3943b982d2c3e7e162a6ca99dd532210000000000000000000000006b987ee8e3943b982d2c3e7e162a6ca99dd5322100000000000000000000000000000000000000000000000000038d7ea4c6800000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -9499,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec34000000000000000000000000fb5296a3df62e12af6f96ab7f7e83386964535fc000000000000000000000000fb5296a3df62e12af6f96ab7f7e83386964535fc00000000000000000000000000000000000000000000000000038d7ea4c6800000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -9500,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec34000000000000000000000000c5f565848e3bbb1d616dcb1cc80b412e5ff12e45000000000000000000000000c5f565848e3bbb1d616dcb1cc80b412e5ff12e4500000000000000000000000000000000000000000000000000038d7ea4c6800000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -9501,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec340000000000000000000000002a7fc63c64f4c8769919247d3dfcc16fa408cc3b0000000000000000000000002a7fc63c64f4c8769919247d3dfcc16fa408cc3b00000000000000000000000000000000000000000000000000038d7ea4c6800000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -9502,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec340000000000000000000000008fdf7681d2f5ec9896df42075d884c6dc03669a30000000000000000000000008fdf7681d2f5ec9896df42075d884c6dc03669a300000000000000000000000000000000000000000000000000038d7ea4c6800000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -9503,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec34000000000000000000000000be1bbd830083f371edbc41517781255427c5ea5a000000000000000000000000be1bbd830083f371edbc41517781255427c5ea5a00000000000000000000000000000000000000000000000000038d7ea4c6800000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -9504,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec34000000000000000000000000026aefab14d61df7a3973160abfcf22145b2ab61000000000000000000000000026aefab14d61df7a3973160abfcf22145b2ab6100000000000000000000000000000000000000000000000000038d7ea4c6800000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -9505,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec340000000000000000000000002af88171fe9668210705ea5633ca48a1a8a36efe0000000000000000000000002af88171fe9668210705ea5633ca48a1a8a36efe00000000000000000000000000000000000000000000000000038d7ea4c6800000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -9506,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec340000000000000000000000008b6284f86b21575aaa4240f6852db428ad5c0d0a0000000000000000000000008b6284f86b21575aaa4240f6852db428ad5c0d0a00000000000000000000000000000000000000000000000000038d7ea4c6800000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -9508,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec340000000000000000000000004805c22f5f813fc05c4d825290f33c228bbe8dc20000000000000000000000004805c22f5f813fc05c4d825290f33c228bbe8dc200000000000000000000000000000000000000000000000000038d7ea4c6800000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -9511,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec340000000000000000000000006b05e05aa636d41bab5cb58a6c80f7dddd6fc8a90000000000000000000000006b05e05aa636d41bab5cb58a6c80f7dddd6fc8a900000000000000000000000000000000000000000000000000038d7ea4c6800000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -9512,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec34000000000000000000000000493b6750f108726df8e60b082adf9a59472d784d000000000000000000000000493b6750f108726df8e60b082adf9a59472d784d00000000000000000000000000000000000000000000000000038d7ea4c6800000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -9513,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec3400000000000000000000000080c9f47a8e6be7da9cb8e5076fa3955a7b29873700000000000000000000000080c9f47a8e6be7da9cb8e5076fa3955a7b29873700000000000000000000000000000000000000000000000000038d7ea4c6800000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -9515,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec34000000000000000000000000014aa9f6dbfdda9dc79c6f456926ba9f6226381f000000000000000000000000014aa9f6dbfdda9dc79c6f456926ba9f6226381f00000000000000000000000000000000000000000000000000038d7ea4c6800000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -9516,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec34000000000000000000000000e718661eea5cc11fcc4340430dec3b2c11fc4eaf000000000000000000000000e718661eea5cc11fcc4340430dec3b2c11fc4eaf00000000000000000000000000000000000000000000000000038d7ea4c6800000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -9517,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec34000000000000000000000000cedf07b70896aa2f08af2828d8f82689d721c19b000000000000000000000000cedf07b70896aa2f08af2828d8f82689d721c19b00000000000000000000000000000000000000000000000000038d7ea4c6800000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -9518,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec34000000000000000000000000d5987d44e206af78e9aab666ca76d1cf963f1aa8000000000000000000000000d5987d44e206af78e9aab666ca76d1cf963f1aa800000000000000000000000000000000000000000000000000038d7ea4c6800000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -9519,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec3400000000000000000000000080fc9e301517ef5cb59da70a9806a8613075619000000000000000000000000080fc9e301517ef5cb59da70a9806a8613075619000000000000000000000000000000000000000000000000000038d7ea4c6800000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -9521,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec34000000000000000000000000da5f734c3c9a7c0370f1412a87ba2524e996c399000000000000000000000000da5f734c3c9a7c0370f1412a87ba2524e996c39900000000000000000000000000000000000000000000000000b1a2bc2ec5000000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -9522,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec340000000000000000000000001cc25aca4516a33cd3f61515048498823e2391850000000000000000000000001cc25aca4516a33cd3f61515048498823e239185000000000000000000000000000000000000000000000000000a3e7a178476ab00000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -9523,0xcd9d4988c0ae61887b075ba77f08cbfad2b65068,0x3f87ff1de58128ef8fcb4c807efd776e1ac72e51,0xf4f7b41a0000000000000000000000007165efe18fbf79a3e8fdbf3211927ca32ad86bb50000000000000000000000000000000000000000000000006124fee993bc0000,,,1,true -9524,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec34000000000000000000000000f39dd7675baa0ba061659fdc44bafc6ebc14d71f000000000000000000000000f39dd7675baa0ba061659fdc44bafc6ebc14d71f000000000000000000000000000000000000000000000000000a6f5a049ab93f00000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -9525,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec34000000000000000000000000cb5d817cfed6f47ebcdb8a1b0833552e999351bb000000000000000000000000cb5d817cfed6f47ebcdb8a1b0833552e999351bb0000000000000000000000000000000000000000000000000014a854db45241400000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -9526,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec340000000000000000000000007cbe610551f4e48ceed8056ac217dcc3f4f4ca180000000000000000000000007cbe610551f4e48ceed8056ac217dcc3f4f4ca18000000000000000000000000000000000000000000000000003babaf0d76b5f100000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -9527,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec34000000000000000000000000e8ddac677012e293b47ca5a00d2e33d6c8988c6e000000000000000000000000e8ddac677012e293b47ca5a00d2e33d6c8988c6e00000000000000000000000000000000000000000000000000cebc36cb66030900000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -9528,0xcd9d4988c0ae61887b075ba77f08cbfad2b65068,0x3f87ff1de58128ef8fcb4c807efd776e1ac72e51,0xf4f7b41a000000000000000000000000af7610346b2da6194780085e1629ca57e53f2b540000000000000000000000000000000000000000000000001feb3dd067660000,,,1,true -9530,0xcd9d4988c0ae61887b075ba77f08cbfad2b65068,0x3f87ff1de58128ef8fcb4c807efd776e1ac72e51,0xf4f7b41a000000000000000000000000376236b8277bbd26b7163caf4870691c37e751070000000000000000000000000000000000000000000000056bc75e2d63100000,,,1,true -9531,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec34000000000000000000000000051a0e3e0fe5783f7c0d5c1003fc121cb9981183000000000000000000000000051a0e3e0fe5783f7c0d5c1003fc121cb9981183000000000000000000000000000000000000000000000000037318a1b6ea283400000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -9532,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec34000000000000000000000000e7e3d2e485520aa0af765aafc54f030d51729bd7000000000000000000000000e7e3d2e485520aa0af765aafc54f030d51729bd700000000000000000000000000000000000000000000000000038d7ea4c6800000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -9533,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec3400000000000000000000000009d685739feec6d10cef02889957386c876fbd1f00000000000000000000000009d685739feec6d10cef02889957386c876fbd1f0000000000000000000000000000000000000000000000000064b017ae72b8fc00000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -9535,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec34000000000000000000000000d3d8abfbd8069a8fb255b94c9c2ecdb04bd2f210000000000000000000000000d3d8abfbd8069a8fb255b94c9c2ecdb04bd2f21000000000000000000000000000000000000000000000000000815c23343f4d2000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,0x23886566fe0b30b38e015ae68fbc9958d29f46208ee3399c8ea9282907bc1f60,2022-06-10 03:25:18.000 UTC,0,true -9536,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec34000000000000000000000000af25c239db4533c1958f823665db2e44cbf9c6f7000000000000000000000000af25c239db4533c1958f823665db2e44cbf9c6f700000000000000000000000000000000000000000000000000005af3107a400000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -9537,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec34000000000000000000000000e75a3c620a1f1a1b8047e1f03083956b8781f715000000000000000000000000e75a3c620a1f1a1b8047e1f03083956b8781f715000000000000000000000000000000000000000000000000000009184e72a00000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -9538,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec34000000000000000000000000382d96d6a2f7f32ca6292c35d7175fa6b7ba9da7000000000000000000000000382d96d6a2f7f32ca6292c35d7175fa6b7ba9da700000000000000000000000000000000000000000000000000034d6f1b212e8000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -9539,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec34000000000000000000000000250249f3f5d3c6860bd880ee4af0a334e0a0cba4000000000000000000000000250249f3f5d3c6860bd880ee4af0a334e0a0cba4000000000000000000000000000000000000000000000000006d53dd79ffaeb600000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -9540,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec3400000000000000000000000006f9f5be183eb34f447b39de0ecc55ebba219a2b00000000000000000000000006f9f5be183eb34f447b39de0ecc55ebba219a2b00000000000000000000000000000000000000000000000000254a5bde0f57a700000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -9541,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec3400000000000000000000000049214bf0a657c0d6cbc5f20526a563a6dca448f100000000000000000000000049214bf0a657c0d6cbc5f20526a563a6dca448f1000000000000000000000000000000000000000000000000003d909039944b1000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -9542,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec3400000000000000000000000019f372338364550b5fe17fb1c97852ecb08579ed00000000000000000000000019f372338364550b5fe17fb1c97852ecb08579ed00000000000000000000000000000000000000000000000000336cf0446c67eb00000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -9543,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec3400000000000000000000000056c8ed6d0e36b639544466381834e404615755d300000000000000000000000056c8ed6d0e36b639544466381834e404615755d3000000000000000000000000000000000000000000000000001cb671da4b663400000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -9544,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec340000000000000000000000002a7c6d9ae1371930c0b4856a71811174a6a92daa0000000000000000000000002a7c6d9ae1371930c0b4856a71811174a6a92daa0000000000000000000000000000000000000000000000000027425c7b19781000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -9545,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec340000000000000000000000003394a1ae60679c07a4af07c92d674818cb1c2ba60000000000000000000000003394a1ae60679c07a4af07c92d674818cb1c2ba60000000000000000000000000000000000000000000000000023cbdce95776b100000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -9546,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec3400000000000000000000000014c963f01f369c96ffbadbd5209f016759f9209300000000000000000000000014c963f01f369c96ffbadbd5209f016759f920930000000000000000000000000000000000000000000000000668d2426581086300000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -9549,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec34000000000000000000000000e155396dfd335ef16dccfdc28c159ab92c88058c000000000000000000000000e155396dfd335ef16dccfdc28c159ab92c88058c00000000000000000000000000000000000000000000000000258000fc39382e00000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -9550,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec34000000000000000000000000687624745396900e2c942c4e32f10651615e294a000000000000000000000000687624745396900e2c942c4e32f10651615e294a0000000000000000000000000000000000000000000000000023b62c9bf7d68000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -9551,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec3400000000000000000000000095dc79b0ccb34cc6622df8282d77c03b63e0240700000000000000000000000095dc79b0ccb34cc6622df8282d77c03b63e02407000000000000000000000000000000000000000000000000001d2e1f2650c36000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -9552,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec340000000000000000000000008cd7b3cfd0dd527e21e491b49568e35dad44d0f30000000000000000000000008cd7b3cfd0dd527e21e491b49568e35dad44d0f3000000000000000000000000000000000000000000000000002300bf9a120a2000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -9553,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec34000000000000000000000000d5abd30462e816da67b9a954b1961213bb8a2e92000000000000000000000000d5abd30462e816da67b9a954b1961213bb8a2e920000000000000000000000000000000000000000000000000026c8d31e70ab8000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -9554,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec34000000000000000000000000b0ed794e70d438f2b1fe0d8d2f39152a7b408ba1000000000000000000000000b0ed794e70d438f2b1fe0d8d2f39152a7b408ba100000000000000000000000000000000000000000000000000200be6ef205c4000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -9556,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0xa9f9e675000000000000000000000000a0b86991c6218b36c1d19d4a2e9eb0ce3606eb480000000000000000000000007f5c764cbc14f9669b88837ca1490cca17c31607000000000000000000000000f2fc892056888e637cb2d77f0cd03b05676dbd5e000000000000000000000000f2fc892056888e637cb2d77f0cd03b05676dbd5e0000000000000000000000000000000000000000000000000000000000cec93500000000000000000000000000000000000000000000000000000000000000c00000000000000000000000000000000000000000000000000000000000000000,,,1,true -9557,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec34000000000000000000000000f2fc892056888e637cb2d77f0cd03b05676dbd5e000000000000000000000000f2fc892056888e637cb2d77f0cd03b05676dbd5e000000000000000000000000000000000000000000000000001e4c716cd16f8000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -9558,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec34000000000000000000000000128c3c6d48434c8713ec00358c1ecf252319b4c7000000000000000000000000128c3c6d48434c8713ec00358c1ecf252319b4c7000000000000000000000000000000000000000000000000003d1521a9aab49000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -9559,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec340000000000000000000000000facf1ead3b42f6855175dd655a65f9ff5a48dc10000000000000000000000000facf1ead3b42f6855175dd655a65f9ff5a48dc10000000000000000000000000000000000000000000000000038ef0e78cab86e00000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -9561,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec34000000000000000000000000742cfe2a1fb49ae444c91b696c771a7b2f65e9f4000000000000000000000000742cfe2a1fb49ae444c91b696c771a7b2f65e9f40000000000000000000000000000000000000000000000000003e871b540c00000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -9562,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec34000000000000000000000000ccc93c66c6e80bf3d68bc63f546cbb42ab4895d6000000000000000000000000ccc93c66c6e80bf3d68bc63f546cbb42ab4895d600000000000000000000000000000000000000000000000000038d7ea4c6800000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -9563,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec3400000000000000000000000083df74e7114079b98e69089edcdc8de377fb7cb000000000000000000000000083df74e7114079b98e69089edcdc8de377fb7cb000000000000000000000000000000000000000000000000000fa6ad8a4d4788200000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -9564,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec340000000000000000000000002e370c9c93014ca879da928274324f0253cde8490000000000000000000000002e370c9c93014ca879da928274324f0253cde849000000000000000000000000000000000000000000000000007044fb523604ae00000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,0x1c4ac2986b29b5ec2454a09ead225ca65a949314999f99783e099d37d8249aff,2022-05-20 09:07:52.000 UTC,0,true -9567,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec340000000000000000000000002ee11be943141c5073680cbc587aa60c4c8dd78b0000000000000000000000002ee11be943141c5073680cbc587aa60c4c8dd78b0000000000000000000000000000000000000000000000000058d15e1762800000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -9569,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec3400000000000000000000000025b99f078903f7702d3f44b1f8a4fe88bc5d103600000000000000000000000025b99f078903f7702d3f44b1f8a4fe88bc5d103600000000000000000000000000000000000000000000000000c9b83e3a31027900000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -9571,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec3400000000000000000000000075e094cee2ddf4ee04f782d9670eb6dce88dcc9800000000000000000000000075e094cee2ddf4ee04f782d9670eb6dce88dcc98000000000000000000000000000000000000000000000000001aa535d3d0c00000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -9573,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec34000000000000000000000000e75a3c620a1f1a1b8047e1f03083956b8781f715000000000000000000000000e75a3c620a1f1a1b8047e1f03083956b8781f715000000000000000000000000000000000000000000000000000009184e72a00000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -9576,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec34000000000000000000000000e75a3c620a1f1a1b8047e1f03083956b8781f715000000000000000000000000e75a3c620a1f1a1b8047e1f03083956b8781f715000000000000000000000000000000000000000000000000000009184e72a00000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -9577,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec34000000000000000000000000728b6672bceee270e92637bae8bacb54a9b32888000000000000000000000000728b6672bceee270e92637bae8bacb54a9b3288800000000000000000000000000000000000000000000000000005af3107a400000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -9578,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec3400000000000000000000000094054865f83f9df3fae7d4b8e6b08b7ff420b0e200000000000000000000000094054865f83f9df3fae7d4b8e6b08b7ff420b0e2000000000000000000000000000000000000000000000000007c00e7bfc5e7a500000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -9579,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec34000000000000000000000000f1b3aeb7afd5642b1d20d00636b7c70163c3a15d000000000000000000000000f1b3aeb7afd5642b1d20d00636b7c70163c3a15d000000000000000000000000000000000000000000000000004360a091733e8c00000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -9580,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec34000000000000000000000000cad3c3d957bcf6f3a3af9caaaadd2804ab132928000000000000000000000000cad3c3d957bcf6f3a3af9caaaadd2804ab13292800000000000000000000000000000000000000000000000000263d804fb3a83b00000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -9585,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec34000000000000000000000000076b68dc2509a483223256d56877bdc5c3ca4bce000000000000000000000000076b68dc2509a483223256d56877bdc5c3ca4bce000000000000000000000000000000000000000000000000003eb7f2a8b2c89200000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -9587,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0xa9f9e675000000000000000000000000dac17f958d2ee523a2206206994597c13d831ec700000000000000000000000094b008aa00579c1307b0ef2c499ad98a8ce58e580000000000000000000000006bd996abee08d068ea284787a1b66ddf4145072a0000000000000000000000006bd996abee08d068ea284787a1b66ddf4145072a000000000000000000000000000000000000000000000000000000001f40a15b00000000000000000000000000000000000000000000000000000000000000c00000000000000000000000000000000000000000000000000000000000000000,,,1,true -9588,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0xa9f9e675000000000000000000000000dac17f958d2ee523a2206206994597c13d831ec700000000000000000000000094b008aa00579c1307b0ef2c499ad98a8ce58e58000000000000000000000000ba7a90a128eeb1d74ea2152ec2d808b30ebead13000000000000000000000000ba7a90a128eeb1d74ea2152ec2d808b30ebead1300000000000000000000000000000000000000000000000000000000401d9de500000000000000000000000000000000000000000000000000000000000000c00000000000000000000000000000000000000000000000000000000000000000,,,1,true -9589,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec34000000000000000000000000076b68dc2509a483223256d56877bdc5c3ca4bce000000000000000000000000076b68dc2509a483223256d56877bdc5c3ca4bce0000000000000000000000000000000000000000000000000011f86c7b3f8d0000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -9591,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec340000000000000000000000008bde2372200e80d22212dc27b036080e929b779c0000000000000000000000008bde2372200e80d22212dc27b036080e929b779c00000000000000000000000000000000000000000000000000005af3107a400000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,0xa38959380281110ffdab2118246dd993f44573b0a53fe156629d4efe8ab50d32,2021-11-21 04:18:40.000 UTC,0,true -9596,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec340000000000000000000000007934b4344d6308dc7aecd2f8cfe006ed875504220000000000000000000000007934b4344d6308dc7aecd2f8cfe006ed87550422000000000000000000000000000000000000000000000000009c51c4521e000000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -9598,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec34000000000000000000000000bac76b4c06d7c642601e995a68cb5186ee3154e6000000000000000000000000bac76b4c06d7c642601e995a68cb5186ee3154e600000000000000000000000000000000000000000000000000e62df32ebf295000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -9599,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec34000000000000000000000000a82446df8eec33acc2a88cf61044f0ce9e561077000000000000000000000000a82446df8eec33acc2a88cf61044f0ce9e56107700000000000000000000000000000000000000000000000000470de4df82000000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -9600,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec3400000000000000000000000086beae41e798b3f1114d6e26e944c5c604c32ac600000000000000000000000086beae41e798b3f1114d6e26e944c5c604c32ac60000000000000000000000000000000000000000000000000001c6bf5263400000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -9612,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec34000000000000000000000000bc98abbbe01f19826bdb72953a6ec712b25f0aa3000000000000000000000000bc98abbbe01f19826bdb72953a6ec712b25f0aa300000000000000000000000000000000000000000000000003782dace9d9000000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -9623,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec34000000000000000000000000dafe428c48841ffa6166e3695f1e0572db988f02000000000000000000000000dafe428c48841ffa6166e3695f1e0572db988f0200000000000000000000000000000000000000000000000000318bb61639880000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -9668,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec34000000000000000000000000b5bbd1f0b42b1c40e13c83d8918b81616ee4c683000000000000000000000000b5bbd1f0b42b1c40e13c83d8918b81616ee4c683000000000000000000000000000000000000000000000000004c41434dc4336d00000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -9670,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec34000000000000000000000000b2dac809cc20f01b1933d8a1d9317bfd971f82e1000000000000000000000000b2dac809cc20f01b1933d8a1d9317bfd971f82e1000000000000000000000000000000000000000000000000003c5b1b9cc217c000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -9681,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec340000000000000000000000007b619744e17158dc2a53aec56c734f9195007f490000000000000000000000007b619744e17158dc2a53aec56c734f9195007f49000000000000000000000000000000000000000000000000000d415a2ee721c000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -9696,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec34000000000000000000000000defb5b606ec1a3da6cc145f6498748cc456df21b000000000000000000000000defb5b606ec1a3da6cc145f6498748cc456df21b000000000000000000000000000000000000000000000000004ea69ae416c75d00000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -9700,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec34000000000000000000000000c167064cb32f4923ebe2d1c47d621af2c73213fc000000000000000000000000c167064cb32f4923ebe2d1c47d621af2c73213fc000000000000000000000000000000000000000000000000008f7a1fcefbfa7e00000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -9714,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec340000000000000000000000004f06ed24667f0bb586730c20fb968f9303368fee0000000000000000000000004f06ed24667f0bb586730c20fb968f9303368fee0000000000000000000000000000000000000000000000000046507a8b4360fd00000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -9715,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec340000000000000000000000007cf9977c3907624da58d69cfdc7f86f5552ddc2b0000000000000000000000007cf9977c3907624da58d69cfdc7f86f5552ddc2b00000000000000000000000000000000000000000000000000daf11b2f3f1f8000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -9716,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec34000000000000000000000000aab1db5591a190242210b78f8895c9929d0a9efb000000000000000000000000aab1db5591a190242210b78f8895c9929d0a9efb0000000000000000000000000000000000000000000000000049e85e865c176700000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -9718,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec340000000000000000000000009e9d7531e717da3aa7cf6fb2f059a9e7ca4dd1760000000000000000000000009e9d7531e717da3aa7cf6fb2f059a9e7ca4dd176000000000000000000000000000000000000000000000000000110d9316ec00000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -9720,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec340000000000000000000000008c64263d33d2a07d23976904b9d2dcf83f7270f50000000000000000000000008c64263d33d2a07d23976904b9d2dcf83f7270f500000000000000000000000000000000000000000000000000a798a47c4a6c6b00000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,0x4afeb4c2cf6e213ee49a5d1c0093b553397821c2b19d67c2a9a2e03af0fd3c94,2021-12-20 09:25:41.000 UTC,0,true -9721,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec3400000000000000000000000064f99d8d532e2418a29199b84bc41cf702c6fc3300000000000000000000000064f99d8d532e2418a29199b84bc41cf702c6fc3300000000000000000000000000000000000000000000000000aa5c5f3a544f9100000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -9722,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec34000000000000000000000000e5afaa33e1557dd72c2187557c4d6820c4f5467f000000000000000000000000e5afaa33e1557dd72c2187557c4d6820c4f5467f0000000000000000000000000000000000000000000000000039ccd125c9649000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -9723,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0xa9f9e675000000000000000000000000dac17f958d2ee523a2206206994597c13d831ec700000000000000000000000094b008aa00579c1307b0ef2c499ad98a8ce58e580000000000000000000000002b26975022d55b218ef2b29df3f8d3047102c56b0000000000000000000000002b26975022d55b218ef2b29df3f8d3047102c56b0000000000000000000000000000000000000000000000000000000001edbb4100000000000000000000000000000000000000000000000000000000000000c00000000000000000000000000000000000000000000000000000000000000000,,,1,true -9724,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec34000000000000000000000000154e0f9554170e39447b72c6f4230dbfdc6afc56000000000000000000000000154e0f9554170e39447b72c6f4230dbfdc6afc5600000000000000000000000000000000000000000000000000200b5bc521d80000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -9729,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec34000000000000000000000000185fdf7b36c6a002d0803c37d2597ca9906b62f5000000000000000000000000185fdf7b36c6a002d0803c37d2597ca9906b62f5000000000000000000000000000000000000000000000000004e465dc6611a8700000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -9730,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec34000000000000000000000000b12cc021009006cc87da206394a4951a1c7d5aef000000000000000000000000b12cc021009006cc87da206394a4951a1c7d5aef00000000000000000000000000000000000000000000000000a754fdef82af6800000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -9731,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec34000000000000000000000000924b569b23935a0bf7a422594c94a046fa0e3491000000000000000000000000924b569b23935a0bf7a422594c94a046fa0e34910000000000000000000000000000000000000000000000000015b04ff816429000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -9732,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec340000000000000000000000008fe1636a434d139fa7bc80552b966af6e4b417f40000000000000000000000008fe1636a434d139fa7bc80552b966af6e4b417f400000000000000000000000000000000000000000000000000cfb9c3bdbac10000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,0x3229f36fed9ae97be04c873a9c51dab612f6b5ba0f98673c37354789aaeda025,2022-03-24 10:32:12.000 UTC,0,true -9733,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec340000000000000000000000002c61edc942bb6a5fca34a207d1d08e2caccbb93c0000000000000000000000002c61edc942bb6a5fca34a207d1d08e2caccbb93c000000000000000000000000000000000000000000000000001468190b49c47300000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -9735,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec34000000000000000000000000ca84c49bd0f4fa84b5a16a3f30a6754c312d079a000000000000000000000000ca84c49bd0f4fa84b5a16a3f30a6754c312d079a000000000000000000000000000000000000000000000000004e180f2ca67d6a00000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -9737,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec3400000000000000000000000079dafd0da626f23a66e63fe06a0f2b97781f819800000000000000000000000079dafd0da626f23a66e63fe06a0f2b97781f81980000000000000000000000000000000000000000000000000018e3a3ee86298000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -9738,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec34000000000000000000000000452008779b6bd5b2bcdd113d1e3f10c5e27b5cf8000000000000000000000000452008779b6bd5b2bcdd113d1e3f10c5e27b5cf800000000000000000000000000000000000000000000000000721440adfa9b8100000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -9739,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec340000000000000000000000007d1b71a98d689ad670a2966837f83740cf5b4d600000000000000000000000007d1b71a98d689ad670a2966837f83740cf5b4d600000000000000000000000000000000000000000000000000045b239dd41825100000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -9740,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec34000000000000000000000000ca89925c2693cf6e2c37572ee3ceec485ce642fb000000000000000000000000ca89925c2693cf6e2c37572ee3ceec485ce642fb00000000000000000000000000000000000000000000000000a8ccc77fe5b5bc00000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -9742,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec340000000000000000000000003742799e12a6850e9ec9f8bf4db4461de958cc920000000000000000000000003742799e12a6850e9ec9f8bf4db4461de958cc9200000000000000000000000000000000000000000000000000071afd498d000000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -9743,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec340000000000000000000000007018c432bd81a91b3b8deaf5408547efe783548f0000000000000000000000007018c432bd81a91b3b8deaf5408547efe783548f0000000000000000000000000000000000000000000000000050a53a9589dffe00000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -9744,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec340000000000000000000000002abee2293455f0b6803a8326ab6d746c721d78c80000000000000000000000002abee2293455f0b6803a8326ab6d746c721d78c8000000000000000000000000000000000000000000000000006a94d74f43000000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,0x76c2e173a17edda1ca84e6e1489c5618fef7a84fb08d543b95128ac9889f7247,2022-03-06 10:28:43.000 UTC,0,true -9745,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0xa9f9e675000000000000000000000000a0b86991c6218b36c1d19d4a2e9eb0ce3606eb480000000000000000000000007f5c764cbc14f9669b88837ca1490cca17c31607000000000000000000000000871f95a4966be1f2dd7d8fb1a32f450b51e74ecb000000000000000000000000871f95a4966be1f2dd7d8fb1a32f450b51e74ecb000000000000000000000000000000000000000000000000000000001265f7df00000000000000000000000000000000000000000000000000000000000000c00000000000000000000000000000000000000000000000000000000000000000,,,1,true -9747,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec340000000000000000000000000e1037ac10790f8514f7540e05ccae6f9d41f2150000000000000000000000000e1037ac10790f8514f7540e05ccae6f9d41f21500000000000000000000000000000000000000000000000002b9c5eeafb4bd0a00000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,0xdc657337ce083d3c3602c1dd013c1cf9c696119abe50a64a0249e24d7a98cf18,2022-06-11 20:24:59.000 UTC,0,true -9748,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec340000000000000000000000002fd55370391e5e099aa300a587d93c35dd8986b40000000000000000000000002fd55370391e5e099aa300a587d93c35dd8986b4000000000000000000000000000000000000000000000000009c51c4521e000000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -9749,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec3400000000000000000000000074a279a3fcfa3b078413277026d82acdf2eac5c700000000000000000000000074a279a3fcfa3b078413277026d82acdf2eac5c7000000000000000000000000000000000000000000000000004c3c5c248591b500000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -9750,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec340000000000000000000000008d126b531e39f1838db27bc88e861a76612b96970000000000000000000000008d126b531e39f1838db27bc88e861a76612b96970000000000000000000000000000000000000000000000000029110738fc7ac200000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -9751,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec3400000000000000000000000053fad1623bc32399dcabcc2164e57e1bc549593d00000000000000000000000053fad1623bc32399dcabcc2164e57e1bc549593d00000000000000000000000000000000000000000000000004c9afac0f82800000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -9752,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec34000000000000000000000000eb3153798373cf5f13a97e34fc72e1e3170e15d2000000000000000000000000eb3153798373cf5f13a97e34fc72e1e3170e15d2000000000000000000000000000000000000000000000000004cb159054ba2d100000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -9756,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec3400000000000000000000000064b7fcc8c17540139bdd84d00c7261035602cb6600000000000000000000000064b7fcc8c17540139bdd84d00c7261035602cb66000000000000000000000000000000000000000000000000001d24762cb31c6200000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -9757,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec3400000000000000000000000004af78ad4d68ac32bde6ad79849e4356e530879100000000000000000000000004af78ad4d68ac32bde6ad79849e4356e530879100000000000000000000000000000000000000000000000000618c3a423e005200000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -9758,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec340000000000000000000000007c0ce17de0c79c59b40ffcc024e56cf6121440ae0000000000000000000000007c0ce17de0c79c59b40ffcc024e56cf6121440ae000000000000000000000000000000000000000000000000004ef46a8345646300000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -9762,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec34000000000000000000000000abd8cee5a93265fc7d1f9e45f0169294d01b8802000000000000000000000000abd8cee5a93265fc7d1f9e45f0169294d01b8802000000000000000000000000000000000000000000000000002386f26fc1000000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -9768,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec340000000000000000000000004b4f9e20415833c250e6a64a364e7126b25241b30000000000000000000000004b4f9e20415833c250e6a64a364e7126b25241b300000000000000000000000000000000000000000000000000847a30ee1ce2cf00000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -9770,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec340000000000000000000000002dfddc72b4a0b6027282539ed22e6239268c1cfb0000000000000000000000002dfddc72b4a0b6027282539ed22e6239268c1cfb000000000000000000000000000000000000000000000000377a8ecd65cb520000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -9771,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec34000000000000000000000000aae4b5f8eb2e6aaaf6ee98072e1c58826f75e261000000000000000000000000aae4b5f8eb2e6aaaf6ee98072e1c58826f75e261000000000000000000000000000000000000000000000000001ff973cafa800000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -9772,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec34000000000000000000000000b13a4cf595b46f38ce0090bf84add5acea5ff227000000000000000000000000b13a4cf595b46f38ce0090bf84add5acea5ff22700000000000000000000000000000000000000000000000000005af3107a400000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,0xeae9cc2c256947f8f9483ae7ca13026e4026f273c5ddc4e0f20c82d435ac58da,2022-07-30 11:37:12.000 UTC,0,true -9775,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec3400000000000000000000000063bb1caab997a6b9743e62034d9ccc7fda7359f100000000000000000000000063bb1caab997a6b9743e62034d9ccc7fda7359f100000000000000000000000000000000000000000000000000207e9515942c0000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -9781,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec34000000000000000000000000b6b4a5c74c29dafbf671fd931dfb26fc0a5adf8a000000000000000000000000b6b4a5c74c29dafbf671fd931dfb26fc0a5adf8a00000000000000000000000000000000000000000000000000005af3107a400000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -9782,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec3400000000000000000000000061a0fc420ae17760e328f5713b87d812dca163c300000000000000000000000061a0fc420ae17760e328f5713b87d812dca163c300000000000000000000000000000000000000000000000000b8882dfd8be03a00000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -9783,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec340000000000000000000000008335bff7ce4cdbd37baf0aae5bddbd58ab0f68540000000000000000000000008335bff7ce4cdbd37baf0aae5bddbd58ab0f6854000000000000000000000000000000000000000000000000014941aac1ec2e6f00000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -9784,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec340000000000000000000000000a2a343bb1f29a1ef123fa358a9f61c42ab6e4b70000000000000000000000000a2a343bb1f29a1ef123fa358a9f61c42ab6e4b7000000000000000000000000000000000000000000000000003a3d931158076800000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -9785,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec34000000000000000000000000d14141da76488f5bb17e54ebb8ed4538fd2b82c8000000000000000000000000d14141da76488f5bb17e54ebb8ed4538fd2b82c80000000000000000000000000000000000000000000000000039925ccdc0a49100000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -9786,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec340000000000000000000000004ef9318a615dc080033fb5f51a6ecbba3327ae1b0000000000000000000000004ef9318a615dc080033fb5f51a6ecbba3327ae1b000000000000000000000000000000000000000000000000003b19673e1ba01d00000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -9787,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec340000000000000000000000003900971c3ce486b9506303f821d04f7c2b769b530000000000000000000000003900971c3ce486b9506303f821d04f7c2b769b53000000000000000000000000000000000000000000000000003b7504c181ca4200000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -9789,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec34000000000000000000000000c6919543a40d33a39ddf109372f2128b34b46727000000000000000000000000c6919543a40d33a39ddf109372f2128b34b46727000000000000000000000000000000000000000000000000029d3071634e777500000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,0x2a60471747c33d39f7f63c90ef7d4aa6395a1f4f29bc172b8ee4766c71d90e65,2022-02-13 04:59:30.000 UTC,0,true -9790,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec34000000000000000000000000195f61d13576f2ec92c812dc01faafd6433b6af7000000000000000000000000195f61d13576f2ec92c812dc01faafd6433b6af700000000000000000000000000000000000000000000000000038d7ea4c6800000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -9792,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec3400000000000000000000000058a168e0ad6fb41bee9e89e9d1762fef50d6637c00000000000000000000000058a168e0ad6fb41bee9e89e9d1762fef50d6637c00000000000000000000000000000000000000000000000000ad18258d27dd0000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -9793,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec340000000000000000000000006bf3d2c240ff569e11e75dfb2c42b57b7ae8be9d0000000000000000000000006bf3d2c240ff569e11e75dfb2c42b57b7ae8be9d00000000000000000000000000000000000000000000000000b1a2bc2ec5000000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,0x06c49a403db079de4a3e5b741729cbb94e76475333f5fe8b4da017dc81894821,2021-12-09 01:11:52.000 UTC,0,true -9794,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec34000000000000000000000000d62f72c8d8809325cc94b43d8f5c50f306e8318e000000000000000000000000d62f72c8d8809325cc94b43d8f5c50f306e8318e000000000000000000000000000000000000000000000000003a715e7281d30d00000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -9795,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec34000000000000000000000000fdbbfb0fe2986672af97eca0e797d76a0bbf35c9000000000000000000000000fdbbfb0fe2986672af97eca0e797d76a0bbf35c9000000000000000000000000000000000000000000000000145d94a4694b6ff100000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -9796,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec34000000000000000000000000d9e65ae225f20d29de51ce8d5998d9456f80b9c4000000000000000000000000d9e65ae225f20d29de51ce8d5998d9456f80b9c4000000000000000000000000000000000000000000000000005aba364c1cdc8600000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -9798,0x10e6593cdda8c58a1d0f14c5164b376352a55f2f,0x467194771dae2967aef3ecbedd3bf9a310c76c65,0xa9f9e6750000000000000000000000006b175474e89094c44da98b954eedeac495271d0f000000000000000000000000da10009cbd5d07dd0cecc66161fc93d7c9000da10000000000000000000000007ec4ce8860cb6c4516675e494884369ca874ba6c0000000000000000000000007ec4ce8860cb6c4516675e494884369ca874ba6c0000000000000000000000000000000000000000000000000de0b6b3a764000000000000000000000000000000000000000000000000000000000000000000c00000000000000000000000000000000000000000000000000000000000000000,,,1,true -9799,0x10e6593cdda8c58a1d0f14c5164b376352a55f2f,0x467194771dae2967aef3ecbedd3bf9a310c76c65,0xa9f9e6750000000000000000000000006b175474e89094c44da98b954eedeac495271d0f000000000000000000000000da10009cbd5d07dd0cecc66161fc93d7c9000da1000000000000000000000000e18d66ffab7ef9a44579288c39854b42f03edab2000000000000000000000000e18d66ffab7ef9a44579288c39854b42f03edab20000000000000000000000000000000000000000000000000de0b6b3a764000000000000000000000000000000000000000000000000000000000000000000c00000000000000000000000000000000000000000000000000000000000000000,,,1,true -9800,0x10e6593cdda8c58a1d0f14c5164b376352a55f2f,0x467194771dae2967aef3ecbedd3bf9a310c76c65,0xa9f9e6750000000000000000000000006b175474e89094c44da98b954eedeac495271d0f000000000000000000000000da10009cbd5d07dd0cecc66161fc93d7c9000da1000000000000000000000000293761f789b5fa61d0b871cf603ece3a73942ac6000000000000000000000000293761f789b5fa61d0b871cf603ece3a73942ac60000000000000000000000000000000000000000000000000de0b6b3a764000000000000000000000000000000000000000000000000000000000000000000c00000000000000000000000000000000000000000000000000000000000000000,,,1,true -9801,0x10e6593cdda8c58a1d0f14c5164b376352a55f2f,0x467194771dae2967aef3ecbedd3bf9a310c76c65,0xa9f9e6750000000000000000000000006b175474e89094c44da98b954eedeac495271d0f000000000000000000000000da10009cbd5d07dd0cecc66161fc93d7c9000da10000000000000000000000008a88ccb818702afdd390b7e7938377d9afb9e3200000000000000000000000008a88ccb818702afdd390b7e7938377d9afb9e32000000000000000000000000000000000000000000000000009b6e64a8ec6000000000000000000000000000000000000000000000000000000000000000000c00000000000000000000000000000000000000000000000000000000000000000,,,1,true -9802,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec34000000000000000000000000ad9a89e66ba5c1af450a304829401cb5545b92bc000000000000000000000000ad9a89e66ba5c1af450a304829401cb5545b92bc000000000000000000000000000000000000000000000000015ddaddcce1da0000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -9804,0x10e6593cdda8c58a1d0f14c5164b376352a55f2f,0x467194771dae2967aef3ecbedd3bf9a310c76c65,0xa9f9e6750000000000000000000000006b175474e89094c44da98b954eedeac495271d0f000000000000000000000000da10009cbd5d07dd0cecc66161fc93d7c9000da1000000000000000000000000c101a05d6aea4f14ea0e303c22fe10556f28a205000000000000000000000000c101a05d6aea4f14ea0e303c22fe10556f28a2050000000000000000000000000000000000000000000000000de0b6b3a764000000000000000000000000000000000000000000000000000000000000000000c00000000000000000000000000000000000000000000000000000000000000000,,,1,true -9806,0x10e6593cdda8c58a1d0f14c5164b376352a55f2f,0x467194771dae2967aef3ecbedd3bf9a310c76c65,0xa9f9e6750000000000000000000000006b175474e89094c44da98b954eedeac495271d0f000000000000000000000000da10009cbd5d07dd0cecc66161fc93d7c9000da100000000000000000000000074515748caf5cc74b1b86f5baaa25c2f5652daff00000000000000000000000074515748caf5cc74b1b86f5baaa25c2f5652daff0000000000000000000000000000000000000000000000000de0b6b3a764000000000000000000000000000000000000000000000000000000000000000000c00000000000000000000000000000000000000000000000000000000000000000,,,1,true -9807,0x10e6593cdda8c58a1d0f14c5164b376352a55f2f,0x467194771dae2967aef3ecbedd3bf9a310c76c65,0xa9f9e6750000000000000000000000006b175474e89094c44da98b954eedeac495271d0f000000000000000000000000da10009cbd5d07dd0cecc66161fc93d7c9000da10000000000000000000000007bdf3a24169303cfa2fcdcac49013f3c06eaad8b0000000000000000000000007bdf3a24169303cfa2fcdcac49013f3c06eaad8b0000000000000000000000000000000000000000000000000de0b6b3a764000000000000000000000000000000000000000000000000000000000000000000c00000000000000000000000000000000000000000000000000000000000000000,,,1,true -9808,0x10e6593cdda8c58a1d0f14c5164b376352a55f2f,0x467194771dae2967aef3ecbedd3bf9a310c76c65,0xa9f9e6750000000000000000000000006b175474e89094c44da98b954eedeac495271d0f000000000000000000000000da10009cbd5d07dd0cecc66161fc93d7c9000da1000000000000000000000000558fb9800de9453a5f4c7ac2d2398e42d1bc7351000000000000000000000000558fb9800de9453a5f4c7ac2d2398e42d1bc73510000000000000000000000000000000000000000000000000de0b6b3a764000000000000000000000000000000000000000000000000000000000000000000c00000000000000000000000000000000000000000000000000000000000000000,,,1,true -9809,0x10e6593cdda8c58a1d0f14c5164b376352a55f2f,0x467194771dae2967aef3ecbedd3bf9a310c76c65,0xa9f9e6750000000000000000000000006b175474e89094c44da98b954eedeac495271d0f000000000000000000000000da10009cbd5d07dd0cecc66161fc93d7c9000da1000000000000000000000000a69acd8419e3b3a8a57ccadf69fb65fa21a33fb0000000000000000000000000a69acd8419e3b3a8a57ccadf69fb65fa21a33fb00000000000000000000000000000000000000000000000000de0b6b3a764000000000000000000000000000000000000000000000000000000000000000000c00000000000000000000000000000000000000000000000000000000000000000,,,1,true -9810,0x10e6593cdda8c58a1d0f14c5164b376352a55f2f,0x467194771dae2967aef3ecbedd3bf9a310c76c65,0xa9f9e6750000000000000000000000006b175474e89094c44da98b954eedeac495271d0f000000000000000000000000da10009cbd5d07dd0cecc66161fc93d7c9000da1000000000000000000000000231d24f024d074cec551e768a17d4ff246575f6b000000000000000000000000231d24f024d074cec551e768a17d4ff246575f6b0000000000000000000000000000000000000000000000000de0b6b3a764000000000000000000000000000000000000000000000000000000000000000000c00000000000000000000000000000000000000000000000000000000000000000,,,1,true -9811,0x10e6593cdda8c58a1d0f14c5164b376352a55f2f,0x467194771dae2967aef3ecbedd3bf9a310c76c65,0xa9f9e6750000000000000000000000006b175474e89094c44da98b954eedeac495271d0f000000000000000000000000da10009cbd5d07dd0cecc66161fc93d7c9000da10000000000000000000000001059aaed4254afe9a6e88ce5c089683171b59eff0000000000000000000000001059aaed4254afe9a6e88ce5c089683171b59eff0000000000000000000000000000000000000000000000000de0b6b3a764000000000000000000000000000000000000000000000000000000000000000000c00000000000000000000000000000000000000000000000000000000000000000,,,1,true -9812,0x10e6593cdda8c58a1d0f14c5164b376352a55f2f,0x467194771dae2967aef3ecbedd3bf9a310c76c65,0xa9f9e6750000000000000000000000006b175474e89094c44da98b954eedeac495271d0f000000000000000000000000da10009cbd5d07dd0cecc66161fc93d7c9000da100000000000000000000000072a7b09495bb6e8309b8e76460a38a425a62354100000000000000000000000072a7b09495bb6e8309b8e76460a38a425a6235410000000000000000000000000000000000000000000000000de0b6b3a764000000000000000000000000000000000000000000000000000000000000000000c00000000000000000000000000000000000000000000000000000000000000000,,,1,true -9813,0x10e6593cdda8c58a1d0f14c5164b376352a55f2f,0x467194771dae2967aef3ecbedd3bf9a310c76c65,0xa9f9e6750000000000000000000000006b175474e89094c44da98b954eedeac495271d0f000000000000000000000000da10009cbd5d07dd0cecc66161fc93d7c9000da1000000000000000000000000f31364e33ef5b11a69877df8e173e0392e288da2000000000000000000000000f31364e33ef5b11a69877df8e173e0392e288da20000000000000000000000000000000000000000000000000de0b6b3a764000000000000000000000000000000000000000000000000000000000000000000c00000000000000000000000000000000000000000000000000000000000000000,,,1,true -9814,0x10e6593cdda8c58a1d0f14c5164b376352a55f2f,0x467194771dae2967aef3ecbedd3bf9a310c76c65,0xa9f9e6750000000000000000000000006b175474e89094c44da98b954eedeac495271d0f000000000000000000000000da10009cbd5d07dd0cecc66161fc93d7c9000da10000000000000000000000008a1c15068ef08ea8abcfdc158fb60230f74fdb6c0000000000000000000000008a1c15068ef08ea8abcfdc158fb60230f74fdb6c0000000000000000000000000000000000000000000000000de0b6b3a764000000000000000000000000000000000000000000000000000000000000000000c00000000000000000000000000000000000000000000000000000000000000000,,,1,true -9815,0x10e6593cdda8c58a1d0f14c5164b376352a55f2f,0x467194771dae2967aef3ecbedd3bf9a310c76c65,0xa9f9e6750000000000000000000000006b175474e89094c44da98b954eedeac495271d0f000000000000000000000000da10009cbd5d07dd0cecc66161fc93d7c9000da100000000000000000000000026f5901547f837f0b987d4f9ae2984560f4ae29b00000000000000000000000026f5901547f837f0b987d4f9ae2984560f4ae29b0000000000000000000000000000000000000000000000000de0b6b3a764000000000000000000000000000000000000000000000000000000000000000000c00000000000000000000000000000000000000000000000000000000000000000,,,1,true -9816,0x10e6593cdda8c58a1d0f14c5164b376352a55f2f,0x467194771dae2967aef3ecbedd3bf9a310c76c65,0xa9f9e6750000000000000000000000006b175474e89094c44da98b954eedeac495271d0f000000000000000000000000da10009cbd5d07dd0cecc66161fc93d7c9000da10000000000000000000000004e0cc752ca23f5a6c99fd13cb86654396cf0e68e0000000000000000000000004e0cc752ca23f5a6c99fd13cb86654396cf0e68e0000000000000000000000000000000000000000000000000de0b6b3a764000000000000000000000000000000000000000000000000000000000000000000c00000000000000000000000000000000000000000000000000000000000000000,,,1,true -9817,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0xa9f9e675000000000000000000000000a0b86991c6218b36c1d19d4a2e9eb0ce3606eb480000000000000000000000007f5c764cbc14f9669b88837ca1490cca17c316070000000000000000000000002c58196a9b8916f888771917cb219dd6eaf801010000000000000000000000002c58196a9b8916f888771917cb219dd6eaf8010100000000000000000000000000000000000000000000000000000000017a818900000000000000000000000000000000000000000000000000000000000000c00000000000000000000000000000000000000000000000000000000000000000,,,1,true -9818,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec34000000000000000000000000bb9bc462592676f5911da0bad269bd11a2212b55000000000000000000000000bb9bc462592676f5911da0bad269bd11a2212b5500000000000000000000000000000000000000000000000000413519b61cfc0000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -9821,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0xa9f9e675000000000000000000000000dac17f958d2ee523a2206206994597c13d831ec700000000000000000000000094b008aa00579c1307b0ef2c499ad98a8ce58e58000000000000000000000000918bb2298c60955053f64833b4a804fcdb8f29ed000000000000000000000000918bb2298c60955053f64833b4a804fcdb8f29ed0000000000000000000000000000000000000000000000000000000002a5352f00000000000000000000000000000000000000000000000000000000000000c00000000000000000000000000000000000000000000000000000000000000000,,,1,true -9822,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec34000000000000000000000000b23a7c2525df85f8be881da6bfa7ee0bb902def8000000000000000000000000b23a7c2525df85f8be881da6bfa7ee0bb902def800000000000000000000000000000000000000000000000006d48d9510a7763700000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,0x6c8834779362cf17f2a53419a5bda8b0364dd537c07ce50cbc271c5290eff35c,2022-11-01 17:23:11.000 UTC,0,true -9823,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec34000000000000000000000000626dcaae150e6240b5b24413cfd6b2aeb8ad443c000000000000000000000000626dcaae150e6240b5b24413cfd6b2aeb8ad443c00000000000000000000000000000000000000000000000000a8c3f5794ec74400000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -9824,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec34000000000000000000000000875d0e316c50b4d167167335e539a8579ddff934000000000000000000000000875d0e316c50b4d167167335e539a8579ddff93400000000000000000000000000000000000000000000000000aa89a370bee2d300000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -9825,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec340000000000000000000000005067823770154868970ce35a50782c35d0a4e76d0000000000000000000000005067823770154868970ce35a50782c35d0a4e76d000000000000000000000000000000000000000000000000006d60881ba3cd3e00000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -9826,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec34000000000000000000000000317890de9ee2d5987e30662b3cb640cffce62ce6000000000000000000000000317890de9ee2d5987e30662b3cb640cffce62ce6000000000000000000000000000000000000000000000000002898f52107e04000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -9832,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec34000000000000000000000000d450c85676f20271b773903cf3fec32e94086118000000000000000000000000d450c85676f20271b773903cf3fec32e94086118000000000000000000000000000000000000000000000000001c46c72808cd0000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -9842,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec340000000000000000000000005f4148dffca80f4c66c65d2a3c0d3342f20a313b0000000000000000000000005f4148dffca80f4c66c65d2a3c0d3342f20a313b000000000000000000000000000000000000000000000000005543df729c000000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -9843,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec340000000000000000000000005f4148dffca80f4c66c65d2a3c0d3342f20a313b0000000000000000000000005f4148dffca80f4c66c65d2a3c0d3342f20a313b00000000000000000000000000000000000000000000000000071afd498d000000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -9846,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec34000000000000000000000000228bf23ca1a080c0cb564bd2a074a8426de15247000000000000000000000000228bf23ca1a080c0cb564bd2a074a8426de15247000000000000000000000000000000000000000000000000000833de5811c0c000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -9847,0xcd9d4988c0ae61887b075ba77f08cbfad2b65068,0x3f87ff1de58128ef8fcb4c807efd776e1ac72e51,0xf4f7b41a0000000000000000000000004935d32f454085a3de3766e48b5cf0b85c107531000000000000000000000000000000000000000000000001d6db934fba36c057,,,1,true -9849,0xcd9d4988c0ae61887b075ba77f08cbfad2b65068,0x3f87ff1de58128ef8fcb4c807efd776e1ac72e51,0xf4f7b41a00000000000000000000000057bc04ca8608bc33f7d5486edbb6876f88eb700d000000000000000000000000000000000000000000000018c4c62833642554eb,,,1,true -9850,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec340000000000000000000000008ad5918400a49fe9c2f515800fed7f4bb48bfeee0000000000000000000000008ad5918400a49fe9c2f515800fed7f4bb48bfeee00000000000000000000000000000000000000000000000002bbaeb4363fcb4700000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -9852,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec3400000000000000000000000095814996f2d2ab5882debca4c7d37b9f3a53bac800000000000000000000000095814996f2d2ab5882debca4c7d37b9f3a53bac800000000000000000000000000000000000000000000000000071afd498d000000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -9854,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec3400000000000000000000000055d36e1644a4db37c57ba133d127a7216b1f19b400000000000000000000000055d36e1644a4db37c57ba133d127a7216b1f19b400000000000000000000000000000000000000000000000000051eef581dc04900000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -9857,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec340000000000000000000000000557007505b53a399a59a93509673fdc5a3dc4540000000000000000000000000557007505b53a399a59a93509673fdc5a3dc454000000000000000000000000000000000000000000000000005e87cb3076bb0000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -9860,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec340000000000000000000000002d36663aea03c3cdf0d508595659fa0524e2cf5b0000000000000000000000002d36663aea03c3cdf0d508595659fa0524e2cf5b000000000000000000000000000000000000000000000000004d181f37b9773400000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,0x8dbbbd889ce1267443056a06fafb779d6785459c09ac9c30a5eccd8de5823ec2,2022-05-20 12:18:01.000 UTC,0,true -9861,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec340000000000000000000000004c8882b1bfa6cdd7dcc065f6b86450992ce679190000000000000000000000004c8882b1bfa6cdd7dcc065f6b86450992ce6791900000000000000000000000000000000000000000000000003782dace9d9000000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,0x69406854f4a0e24ef562734edad82515d5abb36575817f2bc82bf64f3ddcf746,2022-03-15 05:51:00.000 UTC,0,true -9864,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec3400000000000000000000000062725eac2bd3d2a1f3ac17e41c4f94dfbd47c22c00000000000000000000000062725eac2bd3d2a1f3ac17e41c4f94dfbd47c22c0000000000000000000000000000000000000000000000000002d79883d2000000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -9869,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec34000000000000000000000000944f9f9b31f4de729b60e2c0b89de7cbdd5ac878000000000000000000000000944f9f9b31f4de729b60e2c0b89de7cbdd5ac87800000000000000000000000000000000000000000000000015cccfb275f46a8700000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,0xf28b5ea051b37a504078d77c13a88086a29aa56f7d1f9a7d98cc40e2ae4fb3c3,2021-12-17 15:10:05.000 UTC,0,true -9871,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec340000000000000000000000006df9525658fd2c864fab747274579f5b0c1c11b00000000000000000000000006df9525658fd2c864fab747274579f5b0c1c11b00000000000000000000000000000000000000000000000000297aa4a74e43b2d00000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -9872,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec34000000000000000000000000c0568c83470e77f4c5891d190361e4340f954a0d000000000000000000000000c0568c83470e77f4c5891d190361e4340f954a0d000000000000000000000000000000000000000000000000000730b1113de0e000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -9873,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec3400000000000000000000000019ba331d6adfc46e829ea33fa2a24ee87d7a676d00000000000000000000000019ba331d6adfc46e829ea33fa2a24ee87d7a676d000000000000000000000000000000000000000000000000002386f26fc1000000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -9874,0xcd9d4988c0ae61887b075ba77f08cbfad2b65068,0x3f87ff1de58128ef8fcb4c807efd776e1ac72e51,0xf4f7b41a0000000000000000000000001ec5eae8306a271e7b2a0054f46455264217c5ba000000000000000000000000000000000000000000000000285d3b2dc5a86e3f,,,1,true -9875,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec340000000000000000000000003132c2259c22cf2b60d104436c90150edca037690000000000000000000000003132c2259c22cf2b60d104436c90150edca037690000000000000000000000000000000000000000000000000051bda6a156a0f500000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -9876,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec340000000000000000000000003132c2259c22cf2b60d104436c90150edca037690000000000000000000000003132c2259c22cf2b60d104436c90150edca03769000000000000000000000000000000000000000000000000000009184e72a00000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -9877,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec340000000000000000000000000fcc8ec856092f49c640ab945d7f842655fc30b50000000000000000000000000fcc8ec856092f49c640ab945d7f842655fc30b50000000000000000000000000000000000000000000000000001ff973cafa80000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -9878,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec34000000000000000000000000c943aecd667d9239b7b0ce7f64747fab323f90a2000000000000000000000000c943aecd667d9239b7b0ce7f64747fab323f90a2000000000000000000000000000000000000000000000000003fefe8bb292e4800000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -9880,0x10e6593cdda8c58a1d0f14c5164b376352a55f2f,0x467194771dae2967aef3ecbedd3bf9a310c76c65,0xa9f9e6750000000000000000000000006b175474e89094c44da98b954eedeac495271d0f000000000000000000000000da10009cbd5d07dd0cecc66161fc93d7c9000da1000000000000000000000000f42cfe525388486554f8fc3c2ea2ba3414c4f16c000000000000000000000000f42cfe525388486554f8fc3c2ea2ba3414c4f16c0000000000000000000000000000000000000000000000000de0b6b3a764000000000000000000000000000000000000000000000000000000000000000000c00000000000000000000000000000000000000000000000000000000000000000,,,1,true -9885,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec34000000000000000000000000ccf7a254f35c89468c0884a31de5eedaf6a5771b000000000000000000000000ccf7a254f35c89468c0884a31de5eedaf6a5771b000000000000000000000000000000000000000000000000004a7f36fee5300700000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -9888,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec34000000000000000000000000698fa8dfa821489cf4b69225347f28a56e3c3129000000000000000000000000698fa8dfa821489cf4b69225347f28a56e3c3129000000000000000000000000000000000000000000000000000e535e8c64602700000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -9889,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec3400000000000000000000000004199181f2510ec0486a40611042fab40492548600000000000000000000000004199181f2510ec0486a40611042fab404925486000000000000000000000000000000000000000000000000004559b9ca9423a900000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -9890,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec340000000000000000000000004f612dcbca32bb3943de530d21d21970380cd39d0000000000000000000000004f612dcbca32bb3943de530d21d21970380cd39d00000000000000000000000000000000000000000000000000fb58f763584cdf00000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -9891,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec34000000000000000000000000b67fbf8c8d51253e4b3a943fe6e095468345b39e000000000000000000000000b67fbf8c8d51253e4b3a943fe6e095468345b39e000000000000000000000000000000000000000000000000003577f60f1d244000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -9893,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec340000000000000000000000001ec5eae8306a271e7b2a0054f46455264217c5ba0000000000000000000000001ec5eae8306a271e7b2a0054f46455264217c5ba0000000000000000000000000000000000000000000000000092a9f8908034ce00000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -9895,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec34000000000000000000000000be1c5ae29a2eb9548db9a8625f89e762f323a8a6000000000000000000000000be1c5ae29a2eb9548db9a8625f89e762f323a8a600000000000000000000000000000000000000000000000000277a5f981b9c2500000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -9896,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec34000000000000000000000000ad769178ffff88945f175317b0e57ed9e7a5a680000000000000000000000000ad769178ffff88945f175317b0e57ed9e7a5a6800000000000000000000000000000000000000000000000000038ced1ba29c77600000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -9897,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec34000000000000000000000000d09418a23be24ad2f17192920df37f182629d269000000000000000000000000d09418a23be24ad2f17192920df37f182629d269000000000000000000000000000000000000000000000000003b41dae10709f600000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -9899,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec340000000000000000000000000bab67a3e542138f0562b5ce572cd85ad14232ee0000000000000000000000000bab67a3e542138f0562b5ce572cd85ad14232ee0000000000000000000000000000000000000000000000000031e43d1bedb23a00000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -9900,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec340000000000000000000000004dd8a7631842772f42d5a54ac018143757b7790d0000000000000000000000004dd8a7631842772f42d5a54ac018143757b7790d0000000000000000000000000000000000000000000000000006110952cfec8000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -9902,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec340000000000000000000000008f70b585acf0030bdd393239f54bffcad1ea14f50000000000000000000000008f70b585acf0030bdd393239f54bffcad1ea14f5000000000000000000000000000000000000000000000000002613554619446000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -9906,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec34000000000000000000000000734d784f7ce1e164807785e2ba2425fae40c1da6000000000000000000000000734d784f7ce1e164807785e2ba2425fae40c1da600000000000000000000000000000000000000000000000000acbe17d340d70000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -9908,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec340000000000000000000000006a333c62787d3173395fb8bc7fb898cb17063caf0000000000000000000000006a333c62787d3173395fb8bc7fb898cb17063caf00000000000000000000000000000000000000000000000000181db7b8374a6300000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -9910,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec340000000000000000000000006264e4eab94e93ee2afa9a47e689ce00cecd3f610000000000000000000000006264e4eab94e93ee2afa9a47e689ce00cecd3f61000000000000000000000000000000000000000000000000003d90e31830ab9800000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -9912,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec34000000000000000000000000783f7a1a160e75d88eb08c44c47144b87a22a3ba000000000000000000000000783f7a1a160e75d88eb08c44c47144b87a22a3ba0000000000000000000000000000000000000000000000000045866f0f6b6ec800000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -9913,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec340000000000000000000000004a40eb870dcf533d4dc097c3d87aafe9f64490a10000000000000000000000004a40eb870dcf533d4dc097c3d87aafe9f64490a10000000000000000000000000000000000000000000000000214e8348c4f000000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -9914,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec34000000000000000000000000bdb8e2cb7e7af95ca2e9c327ce255d1f92e19efb000000000000000000000000bdb8e2cb7e7af95ca2e9c327ce255d1f92e19efb0000000000000000000000000000000000000000000000000100a8ccf26d254f00000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -9915,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0xa9f9e6750000000000000000000000001f9840a85d5af5bf1d1762f925bdaddc4201f9840000000000000000000000006fd9d7ad17242c41f7131d257212c54a0e816691000000000000000000000000092840aee0f4659a089d09572d1b219bcd540850000000000000000000000000092840aee0f4659a089d09572d1b219bcd540850000000000000000000000000000000000000000000000000021d8aa85d3edb4e00000000000000000000000000000000000000000000000000000000000000c00000000000000000000000000000000000000000000000000000000000000000,,,1,true -9916,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec34000000000000000000000000ee44b8e9c0f7238887220564da32afee8ce92b08000000000000000000000000ee44b8e9c0f7238887220564da32afee8ce92b08000000000000000000000000000000000000000000000000003a89fb6d5a0cee00000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -9917,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec340000000000000000000000005937626ef988f82973de5c57bd389b86c113a3c20000000000000000000000005937626ef988f82973de5c57bd389b86c113a3c2000000000000000000000000000000000000000000000000000aa87bee53800000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -9918,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec340000000000000000000000004484fdb3a9d3973cd6d250b6d22608509b01d7920000000000000000000000004484fdb3a9d3973cd6d250b6d22608509b01d792000000000000000000000000000000000000000000000000001597bcb23bf69400000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -9919,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec340000000000000000000000000a54691936d4330435ed0f388e191df34499e7410000000000000000000000000a54691936d4330435ed0f388e191df34499e74100000000000000000000000000000000000000000000000000170c66cfc69dbd00000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -9920,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec34000000000000000000000000b67620e8c9e19592b616942f895153e2dcf9ccb6000000000000000000000000b67620e8c9e19592b616942f895153e2dcf9ccb60000000000000000000000000000000000000000000000000de0b6b3a764000000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,0x5bedd996786147d19805e9cc6e5501e2e0b2b9c3b5940088a2ea14a6809c8460,2021-12-12 02:10:02.000 UTC,0,true -9921,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec34000000000000000000000000b1eebc9ad0f4df141ef429bd0d7fdb0de9e4120c000000000000000000000000b1eebc9ad0f4df141ef429bd0d7fdb0de9e4120c000000000000000000000000000000000000000000000000001310c8ba769fc500000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -9923,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec34000000000000000000000000e32a1b6a0947b7843b541b0d2ff6c99a41e80b8f000000000000000000000000e32a1b6a0947b7843b541b0d2ff6c99a41e80b8f0000000000000000000000000000000000000000000000000048f46308111e1200000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -9924,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec34000000000000000000000000f47f60cb5426f63a8dd3786387742c2c49ad96e3000000000000000000000000f47f60cb5426f63a8dd3786387742c2c49ad96e300000000000000000000000000000000000000000000000000002acc90c1992600000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -9925,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec34000000000000000000000000c7faec15d7da6f3d67ce27c6fd7236877f0ae95c000000000000000000000000c7faec15d7da6f3d67ce27c6fd7236877f0ae95c0000000000000000000000000000000000000000000000000005ca574c3c7a5000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -9926,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec34000000000000000000000000429c92eedc46e27bd1a6aa5da61c22255390f6b1000000000000000000000000429c92eedc46e27bd1a6aa5da61c22255390f6b1000000000000000000000000000000000000000000000000005dc15917e7567100000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -9927,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec34000000000000000000000000bfa4042acf723c60d9e873dd884ae8760fd6b620000000000000000000000000bfa4042acf723c60d9e873dd884ae8760fd6b620000000000000000000000000000000000000000000000000000009184e72a00000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -9928,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec340000000000000000000000007daa0dcf42e969e407449d4c869f862f8d361b270000000000000000000000007daa0dcf42e969e407449d4c869f862f8d361b27000000000000000000000000000000000000000000000000004058d01d56115c00000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -9930,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec34000000000000000000000000c861d1eeea4b595603621e967fcd9887a72a74a9000000000000000000000000c861d1eeea4b595603621e967fcd9887a72a74a90000000000000000000000000000000000000000000000000017d2e1d192e95600000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -9931,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec340000000000000000000000005b8c68e6a69cf500675ae2f6c1f6816bd5a8788f0000000000000000000000005b8c68e6a69cf500675ae2f6c1f6816bd5a8788f000000000000000000000000000000000000000000000000002386f26fc1000000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -9932,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec34000000000000000000000000b25f162913c84f94f23a9f0e89ed294ef4024871000000000000000000000000b25f162913c84f94f23a9f0e89ed294ef40248710000000000000000000000000000000000000000000000000028683e679e536300000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -9933,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec3400000000000000000000000000ecd428e33ed22b060625e7649ab0ed274bad9200000000000000000000000000ecd428e33ed22b060625e7649ab0ed274bad920000000000000000000000000000000000000000000000000047153bae43ffc600000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -9935,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec3400000000000000000000000025a0452f00529d7471ca0941ffc58c52c500d6ce00000000000000000000000025a0452f00529d7471ca0941ffc58c52c500d6ce00000000000000000000000000000000000000000000000000448f0cab58e8ae00000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -9936,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec3400000000000000000000000080ebc88a66c217ad08ebd62476af0ebb00512bc700000000000000000000000080ebc88a66c217ad08ebd62476af0ebb00512bc7000000000000000000000000000000000000000000000000001c208dc050b2e300000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -9937,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec3400000000000000000000000001d754f2a403bf165aa04aff1940176581263ba300000000000000000000000001d754f2a403bf165aa04aff1940176581263ba30000000000000000000000000000000000000000000000000194df65be4a7ee100000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -9938,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec340000000000000000000000009c1a9cf8b192359795361e22ec22a18a1569a2780000000000000000000000009c1a9cf8b192359795361e22ec22a18a1569a27800000000000000000000000000000000000000000000000001a8697b3528344e00000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -9939,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec34000000000000000000000000ddd57e2a98cdd576e73c5e86c56b34e3d94a2158000000000000000000000000ddd57e2a98cdd576e73c5e86c56b34e3d94a21580000000000000000000000000000000000000000000000000045a6be04d433c100000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -9943,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec340000000000000000000000008d5a7f961133a8d8b05cde8f113bb7c4f81c70550000000000000000000000008d5a7f961133a8d8b05cde8f113bb7c4f81c705500000000000000000000000000000000000000000000000000497ebb533af40400000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -9945,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec34000000000000000000000000f847e9d51989033b691b8be943f8e9e268f99b9e000000000000000000000000f847e9d51989033b691b8be943f8e9e268f99b9e0000000000000000000000000000000000000000000000000062d734cdb35ec000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -9948,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec340000000000000000000000007b5e58994020fc30836d8506bcd8739385fb5f380000000000000000000000007b5e58994020fc30836d8506bcd8739385fb5f380000000000000000000000000000000000000000000000000018de76816d800000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -9949,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec340000000000000000000000009f216ce5ff7219b7c889e981e02346e7fc2ac6240000000000000000000000009f216ce5ff7219b7c889e981e02346e7fc2ac624000000000000000000000000000000000000000000000000009176d72a784bca00000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -9950,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec340000000000000000000000000f133919b60bdf696b0ebfa625ee7b16d92c17e60000000000000000000000000f133919b60bdf696b0ebfa625ee7b16d92c17e6000000000000000000000000000000000000000000000000015aba5bb12af4b400000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -9957,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec340000000000000000000000005dad2e60516aead381996b18258828ca778b3cc70000000000000000000000005dad2e60516aead381996b18258828ca778b3cc7000000000000000000000000000000000000000000000000051f2bcb226c054f00000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -9959,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec340000000000000000000000007de44516f45761ef42e5d654b98c9943a615f8e60000000000000000000000007de44516f45761ef42e5d654b98c9943a615f8e600000000000000000000000000000000000000000000000000034fc4510b208000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -9962,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec34000000000000000000000000173c39a48c61035a1fedc5e880dc711c3d387814000000000000000000000000173c39a48c61035a1fedc5e880dc711c3d38781400000000000000000000000000000000000000000000000000038d7ea4c6800000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -9963,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec340000000000000000000000007f73615d9c4ceb2afa641e14a07039eb862802d60000000000000000000000007f73615d9c4ceb2afa641e14a07039eb862802d600000000000000000000000000000000000000000000000000038d7ea4c6800000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -9964,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec340000000000000000000000003c2f6f572d847d7c3fa36b2b77b2c118dec6102e0000000000000000000000003c2f6f572d847d7c3fa36b2b77b2c118dec6102e00000000000000000000000000000000000000000000000000038d7ea4c6800000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -9965,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec340000000000000000000000006c2e0172da35a9411b5fd1b873cbbe08dc5a54b40000000000000000000000006c2e0172da35a9411b5fd1b873cbbe08dc5a54b400000000000000000000000000000000000000000000000000038d7ea4c6800000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -9966,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec34000000000000000000000000cda31aae920b358d6933b05b14f3af183781162e000000000000000000000000cda31aae920b358d6933b05b14f3af183781162e00000000000000000000000000000000000000000000000000038d7ea4c6800000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -9967,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec340000000000000000000000002cbe5cc94b176619b9ca63f0fe8475d1f64c7fe90000000000000000000000002cbe5cc94b176619b9ca63f0fe8475d1f64c7fe900000000000000000000000000000000000000000000000000038d7ea4c6800000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -9968,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec34000000000000000000000000f1d88743a9b35185e035a903369783f595d2be1d000000000000000000000000f1d88743a9b35185e035a903369783f595d2be1d00000000000000000000000000000000000000000000000000038d7ea4c6800000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -9969,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec340000000000000000000000006c19abd29fc942fbf749a9346f5f21aac3cbfde90000000000000000000000006c19abd29fc942fbf749a9346f5f21aac3cbfde900000000000000000000000000000000000000000000000000038d7ea4c6800000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -9970,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec34000000000000000000000000292410be51ee882d7f1f83f2a953c16e240c122b000000000000000000000000292410be51ee882d7f1f83f2a953c16e240c122b00000000000000000000000000000000000000000000000000038d7ea4c6800000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -9971,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec3400000000000000000000000051b619f48a8e8fe3fff8c6b6149485577e2fc8c000000000000000000000000051b619f48a8e8fe3fff8c6b6149485577e2fc8c000000000000000000000000000000000000000000000000000038d7ea4c6800000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -9972,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec340000000000000000000000007f74ebcb5750836cc2107e12637c285c21a3f2190000000000000000000000007f74ebcb5750836cc2107e12637c285c21a3f21900000000000000000000000000000000000000000000000000038d7ea4c6800000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -9973,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec34000000000000000000000000c69fb9e079efc3dac4f5037f6324e89b4def0c0c000000000000000000000000c69fb9e079efc3dac4f5037f6324e89b4def0c0c00000000000000000000000000000000000000000000000000207aaabf95420000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -9974,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec34000000000000000000000000b2240f1d714f6016259edac934c1d61b1cef4110000000000000000000000000b2240f1d714f6016259edac934c1d61b1cef411000000000000000000000000000000000000000000000000000038d7ea4c6800000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -9975,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec34000000000000000000000000b6d7259c494db121d490b07bbb31ba7966d395a0000000000000000000000000b6d7259c494db121d490b07bbb31ba7966d395a000000000000000000000000000000000000000000000000000038d7ea4c6800000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -9976,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec34000000000000000000000000adb39595cfe21bb87f0ef1c4ad3f4d85144d2db4000000000000000000000000adb39595cfe21bb87f0ef1c4ad3f4d85144d2db400000000000000000000000000000000000000000000000000038d7ea4c6800000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -9977,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec340000000000000000000000004da4ca139ff7868d9e84da98086386ac7a4f42620000000000000000000000004da4ca139ff7868d9e84da98086386ac7a4f426200000000000000000000000000000000000000000000000000038d7ea4c6800000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -9978,0xcd9d4988c0ae61887b075ba77f08cbfad2b65068,0x3f87ff1de58128ef8fcb4c807efd776e1ac72e51,0xf4f7b41a0000000000000000000000006e401916f9e149f20a1e3137d2897f843b510c6400000000000000000000000000000000000000000000000002b8b22448d7bfcc,,,1,true -9980,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec34000000000000000000000000750ea760b19f87dde87492b69479a5b0a094b018000000000000000000000000750ea760b19f87dde87492b69479a5b0a094b018000000000000000000000000000000000000000000000000001f17c4281c430000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,0x018d967a923e864744595484b5da8c0744b0a943316d593b6c2763784c230fbf,2022-06-05 10:29:35.000 UTC,0,true -9981,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec34000000000000000000000000193a14bd9ec595cb9f17c35926869925ea2d9607000000000000000000000000193a14bd9ec595cb9f17c35926869925ea2d960700000000000000000000000000000000000000000000000000002e60f9a3ce0000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -9982,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec34000000000000000000000000e46a5c54225e347e138fffd648362e190948c3ed000000000000000000000000e46a5c54225e347e138fffd648362e190948c3ed000000000000000000000000000000000000000000000000002581c786a9875400000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -9984,0xcd9d4988c0ae61887b075ba77f08cbfad2b65068,0x3f87ff1de58128ef8fcb4c807efd776e1ac72e51,0xf4f7b41a000000000000000000000000fd61d925fed7c3bf871f34f4a73cbcfab06d76790000000000000000000000000000000000000000000000028d5b0d2af6eee3c4,,,1,true -9985,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec340000000000000000000000001332f3755f48a9c7f618681ae3bdbe618ddf65d90000000000000000000000001332f3755f48a9c7f618681ae3bdbe618ddf65d900000000000000000000000000000000000000000000000000c4b13afcc00fc500000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -9986,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec340000000000000000000000001446e8f97318d7115483dfe09a43c2614b2e995d0000000000000000000000001446e8f97318d7115483dfe09a43c2614b2e995d0000000000000000000000000000000000000000000000000011c37937e0800000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -9987,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec34000000000000000000000000396bff8a62a4c8b3cf4c385d45e77795d9ed6b42000000000000000000000000396bff8a62a4c8b3cf4c385d45e77795d9ed6b4200000000000000000000000000000000000000000000000002b9ab14524493e800000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -9990,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec340000000000000000000000003d07dc0e3d1e9e8e85fcb6200816cda57ea027810000000000000000000000003d07dc0e3d1e9e8e85fcb6200816cda57ea0278100000000000000000000000000000000000000000000000000d134ff2276250000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -9991,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec34000000000000000000000000bf96c38e87dc3b7734ce61c48f30ea156c29e06f000000000000000000000000bf96c38e87dc3b7734ce61c48f30ea156c29e06f0000000000000000000000000000000000000000000000000011c37937e0800000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -9992,0x10e6593cdda8c58a1d0f14c5164b376352a55f2f,0x467194771dae2967aef3ecbedd3bf9a310c76c65,0xa9f9e6750000000000000000000000006b175474e89094c44da98b954eedeac495271d0f000000000000000000000000da10009cbd5d07dd0cecc66161fc93d7c9000da10000000000000000000000001ab4bea4d7acc413c34bc2c467cec21f9141f0710000000000000000000000001ab4bea4d7acc413c34bc2c467cec21f9141f0710000000000000000000000000000000000000000000000026269b1b5dde1f2bd00000000000000000000000000000000000000000000000000000000000000c00000000000000000000000000000000000000000000000000000000000000000,,,1,true -9993,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec34000000000000000000000000a226b0069ea5a21a97d2e799c9746f25bd685fb3000000000000000000000000a226b0069ea5a21a97d2e799c9746f25bd685fb3000000000000000000000000000000000000000000000000004c0cf7196af4f600000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -9997,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec340000000000000000000000006c29696ebd2a47ccf361dc7fb421da4532e897fb0000000000000000000000006c29696ebd2a47ccf361dc7fb421da4532e897fb000000000000000000000000000000000000000000000000000aa87bee53800000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -9998,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec3400000000000000000000000007514ec83c05ae7406eab24ed8ca54fc3710550200000000000000000000000007514ec83c05ae7406eab24ed8ca54fc37105502000000000000000000000000000000000000000000000000005543df729c000000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -10000,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec3400000000000000000000000050856959952516c0183c3570fbddcf071a81826a00000000000000000000000050856959952516c0183c3570fbddcf071a81826a00000000000000000000000000000000000000000000000000038d7ea4c6800000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -10002,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec34000000000000000000000000fdd317f6507556ef5733a7b8c6fa5947a0b6df52000000000000000000000000fdd317f6507556ef5733a7b8c6fa5947a0b6df52000000000000000000000000000000000000000000000000000d6518a764b9e500000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -10003,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec340000000000000000000000002efdd444da9e1823208e96e138add4d8b8063bf20000000000000000000000002efdd444da9e1823208e96e138add4d8b8063bf20000000000000000000000000000000000000000000000000051b660cdd5800000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -10004,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec34000000000000000000000000aa4209660e4663f321186a84cd4be739bf405e57000000000000000000000000aa4209660e4663f321186a84cd4be739bf405e57000000000000000000000000000000000000000000000000003ff2e795f5000000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -10005,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec340000000000000000000000008a6e9957e9177adaf95ca41f7e1243899687fbdf0000000000000000000000008a6e9957e9177adaf95ca41f7e1243899687fbdf00000000000000000000000000000000000000000000000001c6bf526340000000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -10007,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec340000000000000000000000004012972309aaff4793885eac13857b6f33851d810000000000000000000000004012972309aaff4793885eac13857b6f33851d810000000000000000000000000000000000000000000000000012e20b65da6d3200000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -10009,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec34000000000000000000000000086fb865af41659dcdb86410b32b44c7e087ff14000000000000000000000000086fb865af41659dcdb86410b32b44c7e087ff140000000000000000000000000000000000000000000000000022e6ad3a2b4db400000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -10011,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec34000000000000000000000000394f5d7096bc8acc82ff09cb83be4ada8897efbd000000000000000000000000394f5d7096bc8acc82ff09cb83be4ada8897efbd0000000000000000000000000000000000000000000000000018de76816d800000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -10018,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec340000000000000000000000007f07c87105d334c4349059513713226d75ed23160000000000000000000000007f07c87105d334c4349059513713226d75ed2316000000000000000000000000000000000000000000000000002386f26fc1000000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -10020,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec340000000000000000000000004871c5532d7a56f70f4d9c85dd616595a28d62860000000000000000000000004871c5532d7a56f70f4d9c85dd616595a28d6286000000000000000000000000000000000000000000000000003ff2e795f5000000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -10021,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec340000000000000000000000004df622c2d7df728960230ec203e833034cac84610000000000000000000000004df622c2d7df728960230ec203e833034cac846100000000000000000000000000000000000000000000000000038d7ea4c6800000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -10024,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec340000000000000000000000007bd3939f47d5e9b001583b795e575aa06cb8e2450000000000000000000000007bd3939f47d5e9b001583b795e575aa06cb8e2450000000000000000000000000000000000000000000000000005bbfa4fb47d4000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -10026,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec340000000000000000000000006f3bf62d91baccc69c93c5f944a9eba13bed8ba70000000000000000000000006f3bf62d91baccc69c93c5f944a9eba13bed8ba700000000000000000000000000000000000000000000000000c18efce3b2b4d400000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -10027,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec340000000000000000000000006aa4e37240e5002c086867408cfe6fc5d2708de30000000000000000000000006aa4e37240e5002c086867408cfe6fc5d2708de3000000000000000000000000000000000000000000000000020e831d63b6800000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -10029,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec34000000000000000000000000742cfe2a1fb49ae444c91b696c771a7b2f65e9f4000000000000000000000000742cfe2a1fb49ae444c91b696c771a7b2f65e9f4000000000000000000000000000000000000000000000000000221b262dd800000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -10030,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec340000000000000000000000003bd13e5254b6d0dee77b7b9cb6328eb59ea058bc0000000000000000000000003bd13e5254b6d0dee77b7b9cb6328eb59ea058bc000000000000000000000000000000000000000000000000000221b262dd800000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -10031,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec34000000000000000000000000cf09c3560b7176bffe3700d1a1283fb85eaf85f9000000000000000000000000cf09c3560b7176bffe3700d1a1283fb85eaf85f9000000000000000000000000000000000000000000000000000221b262dd800000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -10032,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec340000000000000000000000002f999e7c8e06c0128b6d030f80fad725d4da1a8b0000000000000000000000002f999e7c8e06c0128b6d030f80fad725d4da1a8b00000000000000000000000000000000000000000000000000199d19747f280000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -10033,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec34000000000000000000000000582f19a6934a1d5b04592b4b5418022ba1d78941000000000000000000000000582f19a6934a1d5b04592b4b5418022ba1d7894100000000000000000000000000000000000000000000000000038d7ea4c6800000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -10034,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec34000000000000000000000000d3ddb4aa7af5d73a1c019bedfcc179006d6c7329000000000000000000000000d3ddb4aa7af5d73a1c019bedfcc179006d6c732900000000000000000000000000000000000000000000000000038d7ea4c6800000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -10035,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec3400000000000000000000000037b2ab0cb7d20646e54463f7453b88756cc6ac5d00000000000000000000000037b2ab0cb7d20646e54463f7453b88756cc6ac5d0000000000000000000000000000000000000000000000000245c4c6c6b1c94000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -10036,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec3400000000000000000000000040bb18f181938acfbb62bac84cc2812376fe817d00000000000000000000000040bb18f181938acfbb62bac84cc2812376fe817d00000000000000000000000000000000000000000000000000038d7ea4c6800000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -10037,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec3400000000000000000000000014008f25de5a57c9a6c5c64d8275e99b8001138b00000000000000000000000014008f25de5a57c9a6c5c64d8275e99b8001138b000000000000000000000000000000000000000000000000000221b262dd800000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -10039,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec34000000000000000000000000ec4839fa846aa47aee6ad551cd6dcc8c9355bf1c000000000000000000000000ec4839fa846aa47aee6ad551cd6dcc8c9355bf1c000000000000000000000000000000000000000000000000000221b262dd800000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -10040,0x10e6593cdda8c58a1d0f14c5164b376352a55f2f,0x467194771dae2967aef3ecbedd3bf9a310c76c65,0xa9f9e6750000000000000000000000006b175474e89094c44da98b954eedeac495271d0f000000000000000000000000da10009cbd5d07dd0cecc66161fc93d7c9000da10000000000000000000000002e4230ceea610111f3bd7925aa27dd1de1bfe2a80000000000000000000000002e4230ceea610111f3bd7925aa27dd1de1bfe2a80000000000000000000000000000000000000000000000058788cb94b1d8000000000000000000000000000000000000000000000000000000000000000000c00000000000000000000000000000000000000000000000000000000000000000,,,1,true -10041,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec34000000000000000000000000ec4839fa846aa47aee6ad551cd6dcc8c9355bf1c000000000000000000000000ec4839fa846aa47aee6ad551cd6dcc8c9355bf1c0000000000000000000000000000000000000000000000000003e871b540c00000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -10042,0x10e6593cdda8c58a1d0f14c5164b376352a55f2f,0x467194771dae2967aef3ecbedd3bf9a310c76c65,0xa9f9e6750000000000000000000000006b175474e89094c44da98b954eedeac495271d0f000000000000000000000000da10009cbd5d07dd0cecc66161fc93d7c9000da100000000000000000000000030f84f0aa9cad152d1852a8767b3e7ad63e056e100000000000000000000000030f84f0aa9cad152d1852a8767b3e7ad63e056e10000000000000000000000000000000000000000000000264ceed6c7efec4c9800000000000000000000000000000000000000000000000000000000000000c00000000000000000000000000000000000000000000000000000000000000000,,,1,true -10047,0x10e6593cdda8c58a1d0f14c5164b376352a55f2f,0x467194771dae2967aef3ecbedd3bf9a310c76c65,0xa9f9e6750000000000000000000000006b175474e89094c44da98b954eedeac495271d0f000000000000000000000000da10009cbd5d07dd0cecc66161fc93d7c9000da100000000000000000000000072bf82b40dbe01b1e832042d62b4f794405bb2e900000000000000000000000072bf82b40dbe01b1e832042d62b4f794405bb2e90000000000000000000000000000000000000000000000000de0b6b3a764000000000000000000000000000000000000000000000000000000000000000000c00000000000000000000000000000000000000000000000000000000000000000,,,1,true -10048,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec340000000000000000000000003d6e381035ab5995e06a5b1661ee58e92be755a90000000000000000000000003d6e381035ab5995e06a5b1661ee58e92be755a9000000000000000000000000000000000000000000000000015b36e7a9c1e70000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -10050,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec340000000000000000000000004ae488d14ff5622ca5ab1df32a8c26e775d4a7d30000000000000000000000004ae488d14ff5622ca5ab1df32a8c26e775d4a7d3000000000000000000000000000000000000000000000000002386f26fc1000000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -10055,0xcd9d4988c0ae61887b075ba77f08cbfad2b65068,0x3f87ff1de58128ef8fcb4c807efd776e1ac72e51,0xf4f7b41a000000000000000000000000064e9ea8eeb3ea9a0e68b397db271fb7ac525e330000000000000000000000000000000000000000000000004563918244f40000,,,1,true -10058,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec3400000000000000000000000087602bee24cb297397265ef2b47755f6a7858b2000000000000000000000000087602bee24cb297397265ef2b47755f6a7858b20000000000000000000000000000000000000000000000000006d27dfb67fa16d00000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -10059,0xcd9d4988c0ae61887b075ba77f08cbfad2b65068,0x3f87ff1de58128ef8fcb4c807efd776e1ac72e51,0xf4f7b41a000000000000000000000000c1df5e5f5ac6112c9e6677550eb5e53e59651b3c000000000000000000000000000000000000000000000000ba7f18071c0fd89d,,,1,true -10060,0xcd9d4988c0ae61887b075ba77f08cbfad2b65068,0x3f87ff1de58128ef8fcb4c807efd776e1ac72e51,0xf4f7b41a00000000000000000000000062223bb2a4781c9512e5b78cef1655d1d9cd216d0000000000000000000000000000000000000000000000006aefe2c9c540b038,,,1,true -10061,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec34000000000000000000000000abcbc48537de3b2120feee5f7eafb78cda48f00c000000000000000000000000abcbc48537de3b2120feee5f7eafb78cda48f00c000000000000000000000000000000000000000000000000013fbe85edc9000000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -10065,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec340000000000000000000000006cb4f60f5806e2eb260cdc33f81523f93795107a0000000000000000000000006cb4f60f5806e2eb260cdc33f81523f93795107a000000000000000000000000000000000000000000000000002a5a55b037944000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -10067,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec340000000000000000000000008823fd46766a52ad9e4587df2b6eb93a6c6922290000000000000000000000008823fd46766a52ad9e4587df2b6eb93a6c6922290000000000000000000000000000000000000000000000000058d15e1762800000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -10071,0x10e6593cdda8c58a1d0f14c5164b376352a55f2f,0x467194771dae2967aef3ecbedd3bf9a310c76c65,0xa9f9e6750000000000000000000000006b175474e89094c44da98b954eedeac495271d0f000000000000000000000000da10009cbd5d07dd0cecc66161fc93d7c9000da100000000000000000000000072bf82b40dbe01b1e832042d62b4f794405bb2e900000000000000000000000072bf82b40dbe01b1e832042d62b4f794405bb2e90000000000000000000000000000000000000000000000000de0b6b3a764000000000000000000000000000000000000000000000000000000000000000000c00000000000000000000000000000000000000000000000000000000000000000,,,1,true -10072,0x10e6593cdda8c58a1d0f14c5164b376352a55f2f,0x467194771dae2967aef3ecbedd3bf9a310c76c65,0xa9f9e6750000000000000000000000006b175474e89094c44da98b954eedeac495271d0f000000000000000000000000da10009cbd5d07dd0cecc66161fc93d7c9000da100000000000000000000000072bf82b40dbe01b1e832042d62b4f794405bb2e900000000000000000000000072bf82b40dbe01b1e832042d62b4f794405bb2e90000000000000000000000000000000000000000000000000de0b6b3a764000000000000000000000000000000000000000000000000000000000000000000c00000000000000000000000000000000000000000000000000000000000000000,,,1,true -10073,0x10e6593cdda8c58a1d0f14c5164b376352a55f2f,0x467194771dae2967aef3ecbedd3bf9a310c76c65,0xa9f9e6750000000000000000000000006b175474e89094c44da98b954eedeac495271d0f000000000000000000000000da10009cbd5d07dd0cecc66161fc93d7c9000da100000000000000000000000072bf82b40dbe01b1e832042d62b4f794405bb2e900000000000000000000000072bf82b40dbe01b1e832042d62b4f794405bb2e90000000000000000000000000000000000000000000000000de0b6b3a764000000000000000000000000000000000000000000000000000000000000000000c00000000000000000000000000000000000000000000000000000000000000000,,,1,true -10074,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec3400000000000000000000000075fef9a38b2f816d31077d34802fd2ebcad79ce600000000000000000000000075fef9a38b2f816d31077d34802fd2ebcad79ce600000000000000000000000000000000000000000000000000546bb20e4d690000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -10075,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0xa9f9e675000000000000000000000000dac17f958d2ee523a2206206994597c13d831ec700000000000000000000000094b008aa00579c1307b0ef2c499ad98a8ce58e5800000000000000000000000049ed1732cec6d80a8163aa053fa78d35e56a608a00000000000000000000000049ed1732cec6d80a8163aa053fa78d35e56a608a000000000000000000000000000000000000000000000000000000000198ef8000000000000000000000000000000000000000000000000000000000000000c00000000000000000000000000000000000000000000000000000000000000000,,,1,true -10076,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec340000000000000000000000001ca9e9cc095b0bc7d863c8f23c40d2bfa81ddec20000000000000000000000001ca9e9cc095b0bc7d863c8f23c40d2bfa81ddec2000000000000000000000000000000000000000000000000000009184e72a00000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -10077,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec3400000000000000000000000071ea03598702d2fef81cf676d8fa7083c2b58f4300000000000000000000000071ea03598702d2fef81cf676d8fa7083c2b58f43000000000000000000000000000000000000000000000000000009184e72a00000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -10079,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec34000000000000000000000000d107fb7d638216a641827517011e54982a8ea1f2000000000000000000000000d107fb7d638216a641827517011e54982a8ea1f2000000000000000000000000000000000000000000000000000009184e72a00000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -10080,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec340000000000000000000000002f038d81d37dc40182742c38f096d3821ba07c190000000000000000000000002f038d81d37dc40182742c38f096d3821ba07c19000000000000000000000000000000000000000000000000000009184e72a00000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -10081,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec3400000000000000000000000057230c0d93aaea20709c49dc80272a06df0c401200000000000000000000000057230c0d93aaea20709c49dc80272a06df0c4012000000000000000000000000000000000000000000000000000009184e72a00000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -10082,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec3400000000000000000000000021a86e150450d2751435ab390c026e0cdd12664200000000000000000000000021a86e150450d2751435ab390c026e0cdd126642000000000000000000000000000000000000000000000000000009184e72a00000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -10083,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec340000000000000000000000008ac2537286e8168df4ae7971a8d56716a3110ab40000000000000000000000008ac2537286e8168df4ae7971a8d56716a3110ab4000000000000000000000000000000000000000000000000000009184e72a00000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -10084,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec340000000000000000000000000458af2c1ed0e782bced4ad7c6af87d9a7a6fd790000000000000000000000000458af2c1ed0e782bced4ad7c6af87d9a7a6fd79000000000000000000000000000000000000000000000000000009184e72a00000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -10085,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec3400000000000000000000000075c2c8a53eccdf562c6c2f9fb96751f2e2bf970900000000000000000000000075c2c8a53eccdf562c6c2f9fb96751f2e2bf9709000000000000000000000000000000000000000000000000000009184e72a00000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -10086,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec340000000000000000000000000518c302322cdc7a2597b2df46be285bc23a74500000000000000000000000000518c302322cdc7a2597b2df46be285bc23a7450000000000000000000000000000000000000000000000000002e2f6e5e14800000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -10087,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec3400000000000000000000000097db23710a380967fcea208540d4e70be7797f8300000000000000000000000097db23710a380967fcea208540d4e70be7797f83000000000000000000000000000000000000000000000000000009184e72a00000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -10088,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec340000000000000000000000007d0d0f44e92bc9a9278cf8a4f9e5027d56d68d4f0000000000000000000000007d0d0f44e92bc9a9278cf8a4f9e5027d56d68d4f000000000000000000000000000000000000000000000000000009184e72a00000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -10089,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec340000000000000000000000003cd66418db4c9a559c8bba52c80e5c328771d5670000000000000000000000003cd66418db4c9a559c8bba52c80e5c328771d567000000000000000000000000000000000000000000000000000009184e72a00000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -10090,0x10e6593cdda8c58a1d0f14c5164b376352a55f2f,0x467194771dae2967aef3ecbedd3bf9a310c76c65,0xa9f9e6750000000000000000000000006b175474e89094c44da98b954eedeac495271d0f000000000000000000000000da10009cbd5d07dd0cecc66161fc93d7c9000da1000000000000000000000000ce685b14e8ba490b37be916982610ce1a984d401000000000000000000000000ce685b14e8ba490b37be916982610ce1a984d4010000000000000000000000000000000000000000000000000de0b6b3a764000000000000000000000000000000000000000000000000000000000000000000c00000000000000000000000000000000000000000000000000000000000000000,,,1,true -10091,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec3400000000000000000000000000315c272cfda98d59b0671d5c7736f404b0929f00000000000000000000000000315c272cfda98d59b0671d5c7736f404b0929f000000000000000000000000000000000000000000000000000009184e72a00000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -10092,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec34000000000000000000000000c0b152dc2a4dd5700927430c4e2c10c6d1f59d01000000000000000000000000c0b152dc2a4dd5700927430c4e2c10c6d1f59d0100000000000000000000000000000000000000000000000000545dfde151360000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -10093,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec3400000000000000000000000036f5a5c87f44e2cf2bde4976878527f934f7e24b00000000000000000000000036f5a5c87f44e2cf2bde4976878527f934f7e24b000000000000000000000000000000000000000000000000000009184e72a00000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -10094,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec340000000000000000000000004ffaa410e323cb0f594ff2bde976993b3a32cacb0000000000000000000000004ffaa410e323cb0f594ff2bde976993b3a32cacb000000000000000000000000000000000000000000000000000009184e72a00000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -10095,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec34000000000000000000000000bfcfd6875dead16273e3d2c9cbf4e310aa61b8f0000000000000000000000000bfcfd6875dead16273e3d2c9cbf4e310aa61b8f0000000000000000000000000000000000000000000000000000009184e72a00000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -10096,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec34000000000000000000000000fa0e64bb7405e198912b789f0a034cb406c27ad8000000000000000000000000fa0e64bb7405e198912b789f0a034cb406c27ad8000000000000000000000000000000000000000000000000000009184e72a00000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -10097,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec34000000000000000000000000bd2422c3a18c477b455eeca76336299b71a782bd000000000000000000000000bd2422c3a18c477b455eeca76336299b71a782bd000000000000000000000000000000000000000000000000000009184e72a00000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -10098,0x10e6593cdda8c58a1d0f14c5164b376352a55f2f,0x467194771dae2967aef3ecbedd3bf9a310c76c65,0xa9f9e6750000000000000000000000006b175474e89094c44da98b954eedeac495271d0f000000000000000000000000da10009cbd5d07dd0cecc66161fc93d7c9000da100000000000000000000000085f5aded0b12fefbf87d44106465eef6fd2b8fbc00000000000000000000000085f5aded0b12fefbf87d44106465eef6fd2b8fbc0000000000000000000000000000000000000000000000000de0b6b3a764000000000000000000000000000000000000000000000000000000000000000000c00000000000000000000000000000000000000000000000000000000000000000,,,1,true -10100,0x10e6593cdda8c58a1d0f14c5164b376352a55f2f,0x467194771dae2967aef3ecbedd3bf9a310c76c65,0xa9f9e6750000000000000000000000006b175474e89094c44da98b954eedeac495271d0f000000000000000000000000da10009cbd5d07dd0cecc66161fc93d7c9000da1000000000000000000000000c7e1b198a199c1eaa3d5065c2f14c3710e456ec0000000000000000000000000c7e1b198a199c1eaa3d5065c2f14c3710e456ec00000000000000000000000000000000000000000000000000de0b6b3a764000000000000000000000000000000000000000000000000000000000000000000c00000000000000000000000000000000000000000000000000000000000000000,,,1,true -10101,0x10e6593cdda8c58a1d0f14c5164b376352a55f2f,0x467194771dae2967aef3ecbedd3bf9a310c76c65,0xa9f9e6750000000000000000000000006b175474e89094c44da98b954eedeac495271d0f000000000000000000000000da10009cbd5d07dd0cecc66161fc93d7c9000da1000000000000000000000000b1b749f5325c6b9692093575e519a4191432379f000000000000000000000000b1b749f5325c6b9692093575e519a4191432379f0000000000000000000000000000000000000000000000000de0b6b3a764000000000000000000000000000000000000000000000000000000000000000000c00000000000000000000000000000000000000000000000000000000000000000,,,1,true -10102,0x10e6593cdda8c58a1d0f14c5164b376352a55f2f,0x467194771dae2967aef3ecbedd3bf9a310c76c65,0xa9f9e6750000000000000000000000006b175474e89094c44da98b954eedeac495271d0f000000000000000000000000da10009cbd5d07dd0cecc66161fc93d7c9000da100000000000000000000000052b78e734ab4239a31c4df316f515d2a67aa09ad00000000000000000000000052b78e734ab4239a31c4df316f515d2a67aa09ad0000000000000000000000000000000000000000000000000de0b6b3a764000000000000000000000000000000000000000000000000000000000000000000c00000000000000000000000000000000000000000000000000000000000000000,,,1,true -10103,0x10e6593cdda8c58a1d0f14c5164b376352a55f2f,0x467194771dae2967aef3ecbedd3bf9a310c76c65,0xa9f9e6750000000000000000000000006b175474e89094c44da98b954eedeac495271d0f000000000000000000000000da10009cbd5d07dd0cecc66161fc93d7c9000da10000000000000000000000007f4825c7d1faf7400a500a4da4c356c89f7193880000000000000000000000007f4825c7d1faf7400a500a4da4c356c89f7193880000000000000000000000000000000000000000000000000de0b6b3a764000000000000000000000000000000000000000000000000000000000000000000c00000000000000000000000000000000000000000000000000000000000000000,,,1,true -10104,0x10e6593cdda8c58a1d0f14c5164b376352a55f2f,0x467194771dae2967aef3ecbedd3bf9a310c76c65,0xa9f9e6750000000000000000000000006b175474e89094c44da98b954eedeac495271d0f000000000000000000000000da10009cbd5d07dd0cecc66161fc93d7c9000da1000000000000000000000000d8e12edc97ca9432dae369a0a9b42c4ed9338e1b000000000000000000000000d8e12edc97ca9432dae369a0a9b42c4ed9338e1b0000000000000000000000000000000000000000000000000de0b6b3a764000000000000000000000000000000000000000000000000000000000000000000c00000000000000000000000000000000000000000000000000000000000000000,,,1,true -10106,0x10e6593cdda8c58a1d0f14c5164b376352a55f2f,0x467194771dae2967aef3ecbedd3bf9a310c76c65,0xa9f9e6750000000000000000000000006b175474e89094c44da98b954eedeac495271d0f000000000000000000000000da10009cbd5d07dd0cecc66161fc93d7c9000da1000000000000000000000000cdc5a129d5c21f57e0b4030f14dcc0736a6e0fbf000000000000000000000000cdc5a129d5c21f57e0b4030f14dcc0736a6e0fbf0000000000000000000000000000000000000000000000000de0b6b3a764000000000000000000000000000000000000000000000000000000000000000000c00000000000000000000000000000000000000000000000000000000000000000,,,1,true -10107,0x10e6593cdda8c58a1d0f14c5164b376352a55f2f,0x467194771dae2967aef3ecbedd3bf9a310c76c65,0xa9f9e6750000000000000000000000006b175474e89094c44da98b954eedeac495271d0f000000000000000000000000da10009cbd5d07dd0cecc66161fc93d7c9000da10000000000000000000000002b81cad571025bc0003724602f9f1981aa0e272c0000000000000000000000002b81cad571025bc0003724602f9f1981aa0e272c0000000000000000000000000000000000000000000000000de0b6b3a764000000000000000000000000000000000000000000000000000000000000000000c00000000000000000000000000000000000000000000000000000000000000000,,,1,true -10108,0x10e6593cdda8c58a1d0f14c5164b376352a55f2f,0x467194771dae2967aef3ecbedd3bf9a310c76c65,0xa9f9e6750000000000000000000000006b175474e89094c44da98b954eedeac495271d0f000000000000000000000000da10009cbd5d07dd0cecc66161fc93d7c9000da10000000000000000000000008e081ed1dc015d6c240ce53c1f2ef34f4b494c3f0000000000000000000000008e081ed1dc015d6c240ce53c1f2ef34f4b494c3f0000000000000000000000000000000000000000000000000de0b6b3a764000000000000000000000000000000000000000000000000000000000000000000c00000000000000000000000000000000000000000000000000000000000000000,,,1,true -10109,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec34000000000000000000000000733849262454294011ab8dec5324c94f5cb56286000000000000000000000000733849262454294011ab8dec5324c94f5cb562860000000000000000000000000000000000000000000000000042acb25d47190000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -10110,0x10e6593cdda8c58a1d0f14c5164b376352a55f2f,0x467194771dae2967aef3ecbedd3bf9a310c76c65,0xa9f9e6750000000000000000000000006b175474e89094c44da98b954eedeac495271d0f000000000000000000000000da10009cbd5d07dd0cecc66161fc93d7c9000da1000000000000000000000000454d998f8bb9a7c15f057a65fdf2ece62ed10717000000000000000000000000454d998f8bb9a7c15f057a65fdf2ece62ed107170000000000000000000000000000000000000000000000000de0b6b3a764000000000000000000000000000000000000000000000000000000000000000000c00000000000000000000000000000000000000000000000000000000000000000,,,1,true -10111,0x10e6593cdda8c58a1d0f14c5164b376352a55f2f,0x467194771dae2967aef3ecbedd3bf9a310c76c65,0xa9f9e6750000000000000000000000006b175474e89094c44da98b954eedeac495271d0f000000000000000000000000da10009cbd5d07dd0cecc66161fc93d7c9000da10000000000000000000000005f73e68a8f4e35509cc9489ffc1bace4cdfd39580000000000000000000000005f73e68a8f4e35509cc9489ffc1bace4cdfd39580000000000000000000000000000000000000000000000000de0b6b3a764000000000000000000000000000000000000000000000000000000000000000000c00000000000000000000000000000000000000000000000000000000000000000,,,1,true -10112,0x10e6593cdda8c58a1d0f14c5164b376352a55f2f,0x467194771dae2967aef3ecbedd3bf9a310c76c65,0xa9f9e6750000000000000000000000006b175474e89094c44da98b954eedeac495271d0f000000000000000000000000da10009cbd5d07dd0cecc66161fc93d7c9000da1000000000000000000000000ba6b247cb6183fd5ad3b1e3381c7832036881f13000000000000000000000000ba6b247cb6183fd5ad3b1e3381c7832036881f130000000000000000000000000000000000000000000000000de0b6b3a764000000000000000000000000000000000000000000000000000000000000000000c00000000000000000000000000000000000000000000000000000000000000000,,,1,true -10113,0x10e6593cdda8c58a1d0f14c5164b376352a55f2f,0x467194771dae2967aef3ecbedd3bf9a310c76c65,0xa9f9e6750000000000000000000000006b175474e89094c44da98b954eedeac495271d0f000000000000000000000000da10009cbd5d07dd0cecc66161fc93d7c9000da100000000000000000000000092f65115b22ca4b1c30eb1f5e884ccec076aff0500000000000000000000000092f65115b22ca4b1c30eb1f5e884ccec076aff050000000000000000000000000000000000000000000000000de0b6b3a764000000000000000000000000000000000000000000000000000000000000000000c00000000000000000000000000000000000000000000000000000000000000000,,,1,true -10115,0x10e6593cdda8c58a1d0f14c5164b376352a55f2f,0x467194771dae2967aef3ecbedd3bf9a310c76c65,0xa9f9e6750000000000000000000000006b175474e89094c44da98b954eedeac495271d0f000000000000000000000000da10009cbd5d07dd0cecc66161fc93d7c9000da1000000000000000000000000d3303476f4444ae95bd24a17bfc3205f53efe840000000000000000000000000d3303476f4444ae95bd24a17bfc3205f53efe8400000000000000000000000000000000000000000000000000de0b6b3a764000000000000000000000000000000000000000000000000000000000000000000c00000000000000000000000000000000000000000000000000000000000000000,,,1,true -10116,0x10e6593cdda8c58a1d0f14c5164b376352a55f2f,0x467194771dae2967aef3ecbedd3bf9a310c76c65,0xa9f9e6750000000000000000000000006b175474e89094c44da98b954eedeac495271d0f000000000000000000000000da10009cbd5d07dd0cecc66161fc93d7c9000da100000000000000000000000050d569614dd212ac6ac46702696ae8116985a99300000000000000000000000050d569614dd212ac6ac46702696ae8116985a9930000000000000000000000000000000000000000000000000de0b6b3a764000000000000000000000000000000000000000000000000000000000000000000c00000000000000000000000000000000000000000000000000000000000000000,,,1,true -10117,0x10e6593cdda8c58a1d0f14c5164b376352a55f2f,0x467194771dae2967aef3ecbedd3bf9a310c76c65,0xa9f9e6750000000000000000000000006b175474e89094c44da98b954eedeac495271d0f000000000000000000000000da10009cbd5d07dd0cecc66161fc93d7c9000da1000000000000000000000000e8496213adbaecf2186be49e5bf5e5da3b079da4000000000000000000000000e8496213adbaecf2186be49e5bf5e5da3b079da40000000000000000000000000000000000000000000000000de0b6b3a764000000000000000000000000000000000000000000000000000000000000000000c00000000000000000000000000000000000000000000000000000000000000000,,,1,true -10118,0x10e6593cdda8c58a1d0f14c5164b376352a55f2f,0x467194771dae2967aef3ecbedd3bf9a310c76c65,0xa9f9e6750000000000000000000000006b175474e89094c44da98b954eedeac495271d0f000000000000000000000000da10009cbd5d07dd0cecc66161fc93d7c9000da1000000000000000000000000c7e441581383460082f3face8021c7aa7d0bf1c0000000000000000000000000c7e441581383460082f3face8021c7aa7d0bf1c00000000000000000000000000000000000000000000000000de0b6b3a764000000000000000000000000000000000000000000000000000000000000000000c00000000000000000000000000000000000000000000000000000000000000000,,,1,true -10119,0x10e6593cdda8c58a1d0f14c5164b376352a55f2f,0x467194771dae2967aef3ecbedd3bf9a310c76c65,0xa9f9e6750000000000000000000000006b175474e89094c44da98b954eedeac495271d0f000000000000000000000000da10009cbd5d07dd0cecc66161fc93d7c9000da1000000000000000000000000fea4c9731d15337539116d07f61bd6f5b889e6d0000000000000000000000000fea4c9731d15337539116d07f61bd6f5b889e6d00000000000000000000000000000000000000000000000000de0b6b3a764000000000000000000000000000000000000000000000000000000000000000000c00000000000000000000000000000000000000000000000000000000000000000,,,1,true -10120,0x10e6593cdda8c58a1d0f14c5164b376352a55f2f,0x467194771dae2967aef3ecbedd3bf9a310c76c65,0xa9f9e6750000000000000000000000006b175474e89094c44da98b954eedeac495271d0f000000000000000000000000da10009cbd5d07dd0cecc66161fc93d7c9000da10000000000000000000000004b591f78e5fb4097964a35d3322fdbcde179d2ad0000000000000000000000004b591f78e5fb4097964a35d3322fdbcde179d2ad0000000000000000000000000000000000000000000000000de0b6b3a764000000000000000000000000000000000000000000000000000000000000000000c00000000000000000000000000000000000000000000000000000000000000000,,,1,true -10121,0x10e6593cdda8c58a1d0f14c5164b376352a55f2f,0x467194771dae2967aef3ecbedd3bf9a310c76c65,0xa9f9e6750000000000000000000000006b175474e89094c44da98b954eedeac495271d0f000000000000000000000000da10009cbd5d07dd0cecc66161fc93d7c9000da10000000000000000000000008ae15e79144fc11428faeb99ec025d0b525dacf40000000000000000000000008ae15e79144fc11428faeb99ec025d0b525dacf40000000000000000000000000000000000000000000000000de0b6b3a764000000000000000000000000000000000000000000000000000000000000000000c00000000000000000000000000000000000000000000000000000000000000000,,,1,true -10122,0x10e6593cdda8c58a1d0f14c5164b376352a55f2f,0x467194771dae2967aef3ecbedd3bf9a310c76c65,0xa9f9e6750000000000000000000000006b175474e89094c44da98b954eedeac495271d0f000000000000000000000000da10009cbd5d07dd0cecc66161fc93d7c9000da10000000000000000000000007e44734df1f5270c0f461b3159ef9065769d09c00000000000000000000000007e44734df1f5270c0f461b3159ef9065769d09c00000000000000000000000000000000000000000000000000de0b6b3a764000000000000000000000000000000000000000000000000000000000000000000c00000000000000000000000000000000000000000000000000000000000000000,,,1,true -10123,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec34000000000000000000000000d9b98b2c4ff722d5a1cdac65725f5d609782b225000000000000000000000000d9b98b2c4ff722d5a1cdac65725f5d609782b2250000000000000000000000000000000000000000000000000076508955cb840000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -10124,0x10e6593cdda8c58a1d0f14c5164b376352a55f2f,0x467194771dae2967aef3ecbedd3bf9a310c76c65,0xa9f9e6750000000000000000000000006b175474e89094c44da98b954eedeac495271d0f000000000000000000000000da10009cbd5d07dd0cecc66161fc93d7c9000da100000000000000000000000081993c552d3a9923acff5f0c74a7fe3714781c8800000000000000000000000081993c552d3a9923acff5f0c74a7fe3714781c880000000000000000000000000000000000000000000000000de0b6b3a764000000000000000000000000000000000000000000000000000000000000000000c00000000000000000000000000000000000000000000000000000000000000000,,,1,true -10125,0x10e6593cdda8c58a1d0f14c5164b376352a55f2f,0x467194771dae2967aef3ecbedd3bf9a310c76c65,0xa9f9e6750000000000000000000000006b175474e89094c44da98b954eedeac495271d0f000000000000000000000000da10009cbd5d07dd0cecc66161fc93d7c9000da1000000000000000000000000702b564c22f3c715c3f0a6ced062a3a1c938aaae000000000000000000000000702b564c22f3c715c3f0a6ced062a3a1c938aaae0000000000000000000000000000000000000000000000000de0b6b3a764000000000000000000000000000000000000000000000000000000000000000000c00000000000000000000000000000000000000000000000000000000000000000,,,1,true -10126,0x10e6593cdda8c58a1d0f14c5164b376352a55f2f,0x467194771dae2967aef3ecbedd3bf9a310c76c65,0xa9f9e6750000000000000000000000006b175474e89094c44da98b954eedeac495271d0f000000000000000000000000da10009cbd5d07dd0cecc66161fc93d7c9000da1000000000000000000000000573207197d089e98ca46ea6d8fa24a1d6ba7cac4000000000000000000000000573207197d089e98ca46ea6d8fa24a1d6ba7cac40000000000000000000000000000000000000000000000000de0b6b3a764000000000000000000000000000000000000000000000000000000000000000000c00000000000000000000000000000000000000000000000000000000000000000,,,1,true -10127,0x10e6593cdda8c58a1d0f14c5164b376352a55f2f,0x467194771dae2967aef3ecbedd3bf9a310c76c65,0xa9f9e6750000000000000000000000006b175474e89094c44da98b954eedeac495271d0f000000000000000000000000da10009cbd5d07dd0cecc66161fc93d7c9000da10000000000000000000000006aa459e7eb8d057ece344bccaabfbe37fb2d777b0000000000000000000000006aa459e7eb8d057ece344bccaabfbe37fb2d777b0000000000000000000000000000000000000000000000000de0b6b3a764000000000000000000000000000000000000000000000000000000000000000000c00000000000000000000000000000000000000000000000000000000000000000,,,1,true -10129,0x10e6593cdda8c58a1d0f14c5164b376352a55f2f,0x467194771dae2967aef3ecbedd3bf9a310c76c65,0xa9f9e6750000000000000000000000006b175474e89094c44da98b954eedeac495271d0f000000000000000000000000da10009cbd5d07dd0cecc66161fc93d7c9000da1000000000000000000000000bddf8194ccc04be52d3e66d5dfb63edba8735e40000000000000000000000000bddf8194ccc04be52d3e66d5dfb63edba8735e400000000000000000000000000000000000000000000000000de0b6b3a764000000000000000000000000000000000000000000000000000000000000000000c00000000000000000000000000000000000000000000000000000000000000000,,,1,true -10130,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0xa9f9e675000000000000000000000000dac17f958d2ee523a2206206994597c13d831ec700000000000000000000000094b008aa00579c1307b0ef2c499ad98a8ce58e580000000000000000000000008ccf1bb8e9664863040f9ec000db69a98c01095c0000000000000000000000008ccf1bb8e9664863040f9ec000db69a98c01095c0000000000000000000000000000000000000000000000000000000003adc7e300000000000000000000000000000000000000000000000000000000000000c00000000000000000000000000000000000000000000000000000000000000000,,,1,true -10131,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec340000000000000000000000004b5568579983f59b1bac36926c0cb8ef03883bab0000000000000000000000004b5568579983f59b1bac36926c0cb8ef03883bab000000000000000000000000000000000000000000000000003b64767291b94000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -10134,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec34000000000000000000000000b460d7ffa9d9dc485d73bbb0dcd6086dbe11486e000000000000000000000000b460d7ffa9d9dc485d73bbb0dcd6086dbe11486e000000000000000000000000000000000000000000000000003326139aeb092d00000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -10138,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec340000000000000000000000005121d18eae0be5bb57d6bb7907a9d49d9e5af1ef0000000000000000000000005121d18eae0be5bb57d6bb7907a9d49d9e5af1ef0000000000000000000000000000000000000000000000000031bced02db000000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,0x371a90ee0a969e3223f940a0007dde944e478c8b171ee418adf6a4d55667563b,2022-05-29 09:29:12.000 UTC,0,true -10139,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec34000000000000000000000000c7f06d3ae0aad1d5c1f5602d93c0f44927b91fba000000000000000000000000c7f06d3ae0aad1d5c1f5602d93c0f44927b91fba00000000000000000000000000000000000000000000000000403bf970f702a900000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -10140,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec340000000000000000000000004de67d3e4dbe226f216022c2f1c2ff80311a1d960000000000000000000000004de67d3e4dbe226f216022c2f1c2ff80311a1d9600000000000000000000000000000000000000000000000000ad9b9766711f0000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,0x0c80e2a3ae845c2d255b9d5f72636cf4679130ecbf1566d77fcf1cf1f64de099,2021-12-26 08:12:45.000 UTC,0,true -10143,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec34000000000000000000000000aa6dc8d75c0be59983207f16da1168068fe816da000000000000000000000000aa6dc8d75c0be59983207f16da1168068fe816da00000000000000000000000000000000000000000000000000354a6ba7a1800000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -10145,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec3400000000000000000000000026f0b7289933220d76e9e11257d741454cf3cce000000000000000000000000026f0b7289933220d76e9e11257d741454cf3cce0000000000000000000000000000000000000000000000000000009184e72a00000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -10146,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec3400000000000000000000000045f425484d66db4f639ba8d17c0b218044323eee00000000000000000000000045f425484d66db4f639ba8d17c0b218044323eee000000000000000000000000000000000000000000000000000009184e72a00000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -10147,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec3400000000000000000000000027e52eeb0d7b910dec57fd66833ad1d4ba2d4c7700000000000000000000000027e52eeb0d7b910dec57fd66833ad1d4ba2d4c77000000000000000000000000000000000000000000000000000009184e72a00000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -10148,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec34000000000000000000000000197cf41f02f380ca1c135eed92321aa1b663d06d000000000000000000000000197cf41f02f380ca1c135eed92321aa1b663d06d000000000000000000000000000000000000000000000000000009184e72a00000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -10149,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec34000000000000000000000000eaca773f51c4a561ae622a6d7d6b98cc490e929e000000000000000000000000eaca773f51c4a561ae622a6d7d6b98cc490e929e000000000000000000000000000000000000000000000000000009184e72a00000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -10150,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec34000000000000000000000000e5577bb739ac71d1d2af723b29fdd48246622690000000000000000000000000e5577bb739ac71d1d2af723b29fdd48246622690000000000000000000000000000000000000000000000000000009184e72a00000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -10152,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec34000000000000000000000000742f477a2ec86b9ea08769a56a1d1dcdf42808f8000000000000000000000000742f477a2ec86b9ea08769a56a1d1dcdf42808f8000000000000000000000000000000000000000000000000000009184e72a00000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -10153,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec340000000000000000000000000f11913257505b756071462301810a189ec635390000000000000000000000000f11913257505b756071462301810a189ec63539000000000000000000000000000000000000000000000000000009184e72a00000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -10154,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec34000000000000000000000000724d0c36c59e1e8b872e7513242678a90dcc693e000000000000000000000000724d0c36c59e1e8b872e7513242678a90dcc693e000000000000000000000000000000000000000000000000000009184e72a00000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -10156,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec34000000000000000000000000c230098ca60a8805605dcb8162edb7ac2c2ec03a000000000000000000000000c230098ca60a8805605dcb8162edb7ac2c2ec03a000000000000000000000000000000000000000000000000002fddb9c7d4685600000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -10158,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec34000000000000000000000000a6c8118a562029638ebb4a268a14aa148e66320a000000000000000000000000a6c8118a562029638ebb4a268a14aa148e66320a00000000000000000000000000000000000000000000000000038d7ea4c6800000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -10159,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec3400000000000000000000000042acc6c41ba0085452b0abc0385b45af73bc030100000000000000000000000042acc6c41ba0085452b0abc0385b45af73bc03010000000000000000000000000000000000000000000000000043306bcefdfe0000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -10160,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec3400000000000000000000000049c0dce4dd4f830cbf99c9012e556c5032aea3fe00000000000000000000000049c0dce4dd4f830cbf99c9012e556c5032aea3fe00000000000000000000000000000000000000000000000000005af3107a400000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -10162,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec34000000000000000000000000daa201fe714db677be1ce4ddcb1671db58536e9e000000000000000000000000daa201fe714db677be1ce4ddcb1671db58536e9e00000000000000000000000000000000000000000000000000005af3107a400000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -10163,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec34000000000000000000000000a0545180d0f14ecff7195fe4dedaec4463aa9477000000000000000000000000a0545180d0f14ecff7195fe4dedaec4463aa947700000000000000000000000000000000000000000000000000038d7ea4c6800000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -10166,0xcd9d4988c0ae61887b075ba77f08cbfad2b65068,0x3f87ff1de58128ef8fcb4c807efd776e1ac72e51,0xf4f7b41a00000000000000000000000064409b6f951b944cd474112596918443e949d73a00000000000000000000000000000000000000000000000049b4a92da3d541cc,,,1,true -10167,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec340000000000000000000000004c14e3364f5f6e642a4258ef1ec1f4fdcb6192380000000000000000000000004c14e3364f5f6e642a4258ef1ec1f4fdcb6192380000000000000000000000000000000000000000000000000018de76816d800000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -10168,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec340000000000000000000000002b6ca557426ef32205cbd3521fcd84df73c023970000000000000000000000002b6ca557426ef32205cbd3521fcd84df73c0239700000000000000000000000000000000000000000000000000d529ae9e86000000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -10169,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec340000000000000000000000003fe00711f5bc714bdd9cd02c078212735c752ad20000000000000000000000003fe00711f5bc714bdd9cd02c078212735c752ad20000000000000000000000000000000000000000000000000067fd768e86b7e000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -10171,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec34000000000000000000000000b6c86df56d0a5c574658bf2831d8dda94e6fee58000000000000000000000000b6c86df56d0a5c574658bf2831d8dda94e6fee580000000000000000000000000000000000000000000000000000f3e017c4d74000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -10173,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec3400000000000000000000000046f64499d85f2c9c2da909c23ae14171ad497a8000000000000000000000000046f64499d85f2c9c2da909c23ae14171ad497a800000000000000000000000000000000000000000000000000018de76816d800000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -10174,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec34000000000000000000000000940f065eeef9895db3e7f0c6e81285a23999ef62000000000000000000000000940f065eeef9895db3e7f0c6e81285a23999ef62000000000000000000000000000000000000000000000000003f411813d9b51f00000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -10175,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec34000000000000000000000000220b573118f76e07e39378debab10229f81088f3000000000000000000000000220b573118f76e07e39378debab10229f81088f300000000000000000000000000000000000000000000000000038d7ea4c6800000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -10177,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec34000000000000000000000000d225664800111cb92bfada74d2f7ddb64dbb5fa6000000000000000000000000d225664800111cb92bfada74d2f7ddb64dbb5fa600000000000000000000000000000000000000000000000000038d7ea4c6800000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -10178,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec340000000000000000000000009d7129923d67697398506754af137c7ed14240f90000000000000000000000009d7129923d67697398506754af137c7ed14240f900000000000000000000000000000000000000000000000000038d7ea4c6800000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -10179,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec34000000000000000000000000704e37fad86c7c83c4815705cfc1d05b428fcb16000000000000000000000000704e37fad86c7c83c4815705cfc1d05b428fcb1600000000000000000000000000000000000000000000000000038d7ea4c6800000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -10180,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec340000000000000000000000004cde9d17ffe865b52abba7f6c24d4ab00dd81ee30000000000000000000000004cde9d17ffe865b52abba7f6c24d4ab00dd81ee300000000000000000000000000000000000000000000000000038d7ea4c6800000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -10181,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec3400000000000000000000000029347aaf07d8e9d97bb4ca54c17de6f008b0081200000000000000000000000029347aaf07d8e9d97bb4ca54c17de6f008b0081200000000000000000000000000000000000000000000000000038d7ea4c6800000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -10182,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec340000000000000000000000005a8727c34188323c7de9a2c50965d11e8601a2cc0000000000000000000000005a8727c34188323c7de9a2c50965d11e8601a2cc00000000000000000000000000000000000000000000000000038d7ea4c6800000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -10185,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec340000000000000000000000004a4e54944bb193f47967df9c872107d7dafe279a0000000000000000000000004a4e54944bb193f47967df9c872107d7dafe279a00000000000000000000000000000000000000000000000000038d7ea4c6800000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -10186,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec3400000000000000000000000018a468f1001dedb8ae05dca5d565b9717eae214500000000000000000000000018a468f1001dedb8ae05dca5d565b9717eae214500000000000000000000000000000000000000000000000000038d7ea4c6800000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -10188,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec34000000000000000000000000b8699196330d4f5f336447e714af78f7ddce10f4000000000000000000000000b8699196330d4f5f336447e714af78f7ddce10f400000000000000000000000000000000000000000000000000038d7ea4c6800000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -10232,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec34000000000000000000000000a8fe31643fb7106966f7f6f4022a9089097fd577000000000000000000000000a8fe31643fb7106966f7f6f4022a9089097fd577000000000000000000000000000000000000000000000000015c9f5156085e9c00000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -10234,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0xa9f9e675000000000000000000000000dac17f958d2ee523a2206206994597c13d831ec700000000000000000000000094b008aa00579c1307b0ef2c499ad98a8ce58e5800000000000000000000000008eafda6638457c05c210df7bc7331ce01b8fa3a00000000000000000000000008eafda6638457c05c210df7bc7331ce01b8fa3a000000000000000000000000000000000000000000000000000000004d7c6d0000000000000000000000000000000000000000000000000000000000000000c00000000000000000000000000000000000000000000000000000000000000000,0x2bb6234353e0e6e023d68077c5f57d8e460a84cf89e05921da6df587a9e3c124,2021-12-20 14:30:00.000 UTC,0,true -10235,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec3400000000000000000000000000f23ca10acd56f752737db7286478dfcf6e5dd700000000000000000000000000f23ca10acd56f752737db7286478dfcf6e5dd700000000000000000000000000000000000000000000000000038d7ea4c6800000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -10238,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec34000000000000000000000000f6fb0f6063e851a21091c12a8e030dfe27caeff0000000000000000000000000f6fb0f6063e851a21091c12a8e030dfe27caeff000000000000000000000000000000000000000000000000000b02bf9db96800000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -10239,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec34000000000000000000000000cf9f420d42c6c55be64ff4631b6aa1a38934f73c000000000000000000000000cf9f420d42c6c55be64ff4631b6aa1a38934f73c000000000000000000000000000000000000000000000000002386f26fc1000000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -10241,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0xa9f9e675000000000000000000000000514910771af9ca656af840dff83e8264ecf986ca000000000000000000000000350a791bfc2c21f9ed5d10980dad2e2638ffa7f6000000000000000000000000317854d799bf228f22ae1af441f0e3cededcebae000000000000000000000000317854d799bf228f22ae1af441f0e3cededcebae00000000000000000000000000000000000000000000000000048f83ef278ff000000000000000000000000000000000000000000000000000000000000000c00000000000000000000000000000000000000000000000000000000000000000,,,1,true -10242,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec340000000000000000000000003d0eb55100cf5e2a70cd8773275dfa50e679270e0000000000000000000000003d0eb55100cf5e2a70cd8773275dfa50e679270e000000000000000000000000000000000000000000000000004521ac7874140000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -10243,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec3400000000000000000000000005d4c5b72a62ca1e2548f1914252d31a9023fec700000000000000000000000005d4c5b72a62ca1e2548f1914252d31a9023fec700000000000000000000000000000000000000000000000000017c2fa463780000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,0x3ad2bad724109d9d82fb2398e41e50c89660b5e1f02230da8f462c2f9cd4cad7,2022-04-26 17:42:12.000 UTC,0,true -10244,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0xa9f9e675000000000000000000000000dac17f958d2ee523a2206206994597c13d831ec700000000000000000000000094b008aa00579c1307b0ef2c499ad98a8ce58e58000000000000000000000000af8bc4650698b53d8d2cedfe180ddf1f3cba5bf6000000000000000000000000af8bc4650698b53d8d2cedfe180ddf1f3cba5bf6000000000000000000000000000000000000000000000000000000000660b0c000000000000000000000000000000000000000000000000000000000000000c00000000000000000000000000000000000000000000000000000000000000000,,,1,true -10245,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec34000000000000000000000000102c13752113c8d60000bf3fbf9205a80ca245e7000000000000000000000000102c13752113c8d60000bf3fbf9205a80ca245e7000000000000000000000000000000000000000000000000005d27d837a977fd00000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -10246,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec34000000000000000000000000b255d025a6a1da4e5a707f8501dac148a0be382c000000000000000000000000b255d025a6a1da4e5a707f8501dac148a0be382c00000000000000000000000000000000000000000000000000000dda5e87f50000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -10249,0x10e6593cdda8c58a1d0f14c5164b376352a55f2f,0x467194771dae2967aef3ecbedd3bf9a310c76c65,0xa9f9e6750000000000000000000000006b175474e89094c44da98b954eedeac495271d0f000000000000000000000000da10009cbd5d07dd0cecc66161fc93d7c9000da10000000000000000000000007bd3939f47d5e9b001583b795e575aa06cb8e2450000000000000000000000007bd3939f47d5e9b001583b795e575aa06cb8e245000000000000000000000000000000000000000000000002fe0ba986973593cc00000000000000000000000000000000000000000000000000000000000000c00000000000000000000000000000000000000000000000000000000000000000,,,1,true -10250,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec340000000000000000000000007ecb769fb7e68cda5026349c0d0e446105bdce880000000000000000000000007ecb769fb7e68cda5026349c0d0e446105bdce88000000000000000000000000000000000000000000000000006d0d660b17ad2500000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -10251,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec3400000000000000000000000063bb1caab997a6b9743e62034d9ccc7fda7359f100000000000000000000000063bb1caab997a6b9743e62034d9ccc7fda7359f1000000000000000000000000000000000000000000000000000974d1c1df000000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -10252,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec34000000000000000000000000a658f95d3b82fcf45a0c4758474c6f3564e4cb9f000000000000000000000000a658f95d3b82fcf45a0c4758474c6f3564e4cb9f000000000000000000000000000000000000000000000000000c60c9cde5ca4d00000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -10253,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec34000000000000000000000000086fb865af41659dcdb86410b32b44c7e087ff14000000000000000000000000086fb865af41659dcdb86410b32b44c7e087ff140000000000000000000000000000000000000000000000000000a533b777d90000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -10254,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec340000000000000000000000000217a347ad2daac7d2e0fc0185df1c57ecd532ad0000000000000000000000000217a347ad2daac7d2e0fc0185df1c57ecd532ad00000000000000000000000000000000000000000000000000000a6e55200be300000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -10255,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec34000000000000000000000000f1825e8203d05434534756f1c0c639f74792fcd6000000000000000000000000f1825e8203d05434534756f1c0c639f74792fcd60000000000000000000000000000000000000000000000000068894b86ce6f4700000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -10256,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec34000000000000000000000000727d55cd776946e4cad03a26915d5c0f5bb12a63000000000000000000000000727d55cd776946e4cad03a26915d5c0f5bb12a6300000000000000000000000000000000000000000000000000000a6e55200be300000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -10257,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec34000000000000000000000000b4f60da1acfa4f0c0897c34a9c830cb16494ed6d000000000000000000000000b4f60da1acfa4f0c0897c34a9c830cb16494ed6d0000000000000000000000000000000000000000000000000000e10adb56387300000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -10258,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec34000000000000000000000000659e15424b6f24b66e5c3cb0a9e2d591bba93b88000000000000000000000000659e15424b6f24b66e5c3cb0a9e2d591bba93b8800000000000000000000000000000000000000000000000000003240e2cda1a500000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -10259,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec34000000000000000000000000b1eebc9ad0f4df141ef429bd0d7fdb0de9e4120c000000000000000000000000b1eebc9ad0f4df141ef429bd0d7fdb0de9e4120c00000000000000000000000000000000000000000000000000003240e2cda1a500000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -10260,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec340000000000000000000000008f70b585acf0030bdd393239f54bffcad1ea14f50000000000000000000000008f70b585acf0030bdd393239f54bffcad1ea14f500000000000000000000000000000000000000000000000000003240e2cda1a500000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -10261,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec34000000000000000000000000c0568c83470e77f4c5891d190361e4340f954a0d000000000000000000000000c0568c83470e77f4c5891d190361e4340f954a0d00000000000000000000000000000000000000000000000000003240e2cda1a500000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -10262,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec340000000000000000000000005055b56dd5f68a77ce57c6dac3b64f4fc17fab890000000000000000000000005055b56dd5f68a77ce57c6dac3b64f4fc17fab8900000000000000000000000000000000000000000000000000003240e2cda1a500000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -10263,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec34000000000000000000000000573e97a089ada31d62d42b61c248cc86be764b99000000000000000000000000573e97a089ada31d62d42b61c248cc86be764b9900000000000000000000000000000000000000000000000000003240e2cda1a500000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -10264,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec34000000000000000000000000c7faec15d7da6f3d67ce27c6fd7236877f0ae95c000000000000000000000000c7faec15d7da6f3d67ce27c6fd7236877f0ae95c00000000000000000000000000000000000000000000000000003240e2cda1a500000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -10265,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec34000000000000000000000000ccf7a254f35c89468c0884a31de5eedaf6a5771b000000000000000000000000ccf7a254f35c89468c0884a31de5eedaf6a5771b0000000000000000000000000000000000000000000000000001c6bf5263400000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -10266,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec340000000000000000000000003132c2259c22cf2b60d104436c90150edca037690000000000000000000000003132c2259c22cf2b60d104436c90150edca037690000000000000000000000000000000000000000000000000001c6bf5263400000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -10267,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec3400000000000000000000000043ae58171e667dd417db1ef49ee5f18e466f581200000000000000000000000043ae58171e667dd417db1ef49ee5f18e466f581200000000000000000000000000000000000000000000000000016bcc41e9000000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -10268,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec340000000000000000000000000b0ce2f4a9ecc7c94d89f4288efe11dbfc139bce0000000000000000000000000b0ce2f4a9ecc7c94d89f4288efe11dbfc139bce0000000000000000000000000000000000000000000000000000b5e620f4800000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -10269,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec34000000000000000000000000727d55cd776946e4cad03a26915d5c0f5bb12a63000000000000000000000000727d55cd776946e4cad03a26915d5c0f5bb12a630000000000000000000000000000000000000000000000000000b5e620f4800000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -10270,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec34000000000000000000000000fb1b4f5fc05eca6e86e33d0719ae4cab47b9fc6d000000000000000000000000fb1b4f5fc05eca6e86e33d0719ae4cab47b9fc6d00000000000000000000000000000000000000000000000000005af3107a400000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -10271,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec34000000000000000000000000c915cdd6254a77125280f4e58070229e942f6dff000000000000000000000000c915cdd6254a77125280f4e58070229e942f6dff000000000000000000000000000000000000000000000000008e1bc9bf04000000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -10272,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec34000000000000000000000000ff08f4394a19c5e01b2d16b9faaf905581e2a16e000000000000000000000000ff08f4394a19c5e01b2d16b9faaf905581e2a16e00000000000000000000000000000000000000000000000000005af3107a400000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -10273,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec340000000000000000000000007233bc516651ece192db7502b97648bee50488070000000000000000000000007233bc516651ece192db7502b97648bee5048807000000000000000000000000000000000000000000000000000221b262dd800000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -10274,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec34000000000000000000000000f9bea21a2ecd9296f722e91fe806972728d890fd000000000000000000000000f9bea21a2ecd9296f722e91fe806972728d890fd0000000000000000000000000000000000000000000000000001c6bf5263400000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -10275,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec34000000000000000000000000b4f60da1acfa4f0c0897c34a9c830cb16494ed6d000000000000000000000000b4f60da1acfa4f0c0897c34a9c830cb16494ed6d0000000000000000000000000000000000000000000000000000b5e620f4800000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -10276,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec3400000000000000000000000080b0e7dcbe436fa8a614f25c872f43539de1461f00000000000000000000000080b0e7dcbe436fa8a614f25c872f43539de1461f0000000000000000000000000000000000000000000000000001c6bf5263400000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -10277,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec34000000000000000000000000e1f404ef1cea424a35fa4cbe373e74f0154eeb0e000000000000000000000000e1f404ef1cea424a35fa4cbe373e74f0154eeb0e0000000000000000000000000000000000000000000000000003328b944c400000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -10278,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec340000000000000000000000006a0a8017c2af6212a96ce718c12f90b89bee11a60000000000000000000000006a0a8017c2af6212a96ce718c12f90b89bee11a6000000000000000000000000000000000000000000000000000110d9316ec00000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -10279,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec34000000000000000000000000d055c2753009604e1dcbacc648c0b2744aa620ce000000000000000000000000d055c2753009604e1dcbacc648c0b2744aa620ce00000000000000000000000000000000000000000000000000024f2beb1aa00000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -10281,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec34000000000000000000000000169d31b52d8de8d1235e54cb29ab1d1a466f14d9000000000000000000000000169d31b52d8de8d1235e54cb29ab1d1a466f14d900000000000000000000000000000000000000000000000000038d7ea4c6800000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -10282,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec34000000000000000000000000212a7f5ea445d92d0d900cffdcf6cac9bffb850b000000000000000000000000212a7f5ea445d92d0d900cffdcf6cac9bffb850b00000000000000000000000000000000000000000000000000027ca57357c00000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -10283,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec34000000000000000000000000d2c07722d72bd0bba8360ed4e91c97df17cfd1cd000000000000000000000000d2c07722d72bd0bba8360ed4e91c97df17cfd1cd000000000000000000000000000000000000000000000000000110d9316ec00000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -10284,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec340000000000000000000000008c6eab90d841ab91affe69a0409e0b6de14d95070000000000000000000000008c6eab90d841ab91affe69a0409e0b6de14d950700000000000000000000000000000000000000000000000000005af3107a400000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -10285,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec34000000000000000000000000586a911410d6bfc5281b641539f159032b745ea1000000000000000000000000586a911410d6bfc5281b641539f159032b745ea1000000000000000000000000000000000000000000000000001b658611edae0000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -10289,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec34000000000000000000000000a3e9b7e2cc8dd20837d97e53359584434bdb177a000000000000000000000000a3e9b7e2cc8dd20837d97e53359584434bdb177a0000000000000000000000000000000000000000000000000001c6bf5263400000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -10290,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec34000000000000000000000000c01aa6d5c839555c4de1a5b3ecbdf4bc49aded0e000000000000000000000000c01aa6d5c839555c4de1a5b3ecbdf4bc49aded0e00000000000000000000000000000000000000000000000000354a6ba7a1800000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -10291,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec340000000000000000000000007772e14acc07bbc8feac62134450bb96c9b75af50000000000000000000000007772e14acc07bbc8feac62134450bb96c9b75af5000000000000000000000000000000000000000000000000050540d84e58629d00000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -10292,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec3400000000000000000000000029958d6de6a7eb94859a1a2f14cc95956497fe9500000000000000000000000029958d6de6a7eb94859a1a2f14cc95956497fe95000000000000000000000000000000000000000000000000008361f8c4e19e0000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -10293,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec340000000000000000000000009d62f9f64135eb257d54e3e7bfcd7af5461e038d0000000000000000000000009d62f9f64135eb257d54e3e7bfcd7af5461e038d000000000000000000000000000000000000000000000000002386f26fc1000000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -10294,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec3400000000000000000000000013af0bcef44bb79eb362b9fdce618b3d5687251200000000000000000000000013af0bcef44bb79eb362b9fdce618b3d56872512000000000000000000000000000000000000000000000000015741231033621300000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -10295,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec34000000000000000000000000964ae9de12550092156981ef8e90f1f728b54488000000000000000000000000964ae9de12550092156981ef8e90f1f728b5448800000000000000000000000000000000000000000000000000354a6ba7a1800000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -10296,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec34000000000000000000000000d71f8d6a355196391bd22eb45dd991addec97b3d000000000000000000000000d71f8d6a355196391bd22eb45dd991addec97b3d0000000000000000000000000000000000000000000000000036515138f29c0000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,0x0fc1db5b578e450291e4f8773213680656e019f3a2f42ff28bae810ce5fae2c0,2022-04-20 10:37:33.000 UTC,0,true -10297,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec340000000000000000000000009cc7285272b1d0561f58002b38fdc62dc4d58c7c0000000000000000000000009cc7285272b1d0561f58002b38fdc62dc4d58c7c000000000000000000000000000000000000000000000000016345785d8a000000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -10298,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec340000000000000000000000003d13a94dee746792b1d1eb6c5c2dde9abaaf4f410000000000000000000000003d13a94dee746792b1d1eb6c5c2dde9abaaf4f41000000000000000000000000000000000000000000000000003affc7c9cb277c00000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -10299,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec34000000000000000000000000aa2d5b6b5b1e3955c0d15c0a8973bb40a6445a0b000000000000000000000000aa2d5b6b5b1e3955c0d15c0a8973bb40a6445a0b00000000000000000000000000000000000000000000000000354a6ba7a1800000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -10301,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec340000000000000000000000000ebbd86806394e54dc5910f643c746c4ea6bc7180000000000000000000000000ebbd86806394e54dc5910f643c746c4ea6bc718000000000000000000000000000000000000000000000000004482431457260000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -10304,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec3400000000000000000000000071fde05ed1cd7e5f15605f155d568cfc4a11169f00000000000000000000000071fde05ed1cd7e5f15605f155d568cfc4a11169f000000000000000000000000000000000000000000000000002386f26fc1000000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -10305,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec34000000000000000000000000002556d2ff1766dc2dcfe95c3066745c0eb2d885000000000000000000000000002556d2ff1766dc2dcfe95c3066745c0eb2d88500000000000000000000000000000000000000000000000000394290a8e95a8200000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -10307,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0xa9f9e675000000000000000000000000a0b86991c6218b36c1d19d4a2e9eb0ce3606eb480000000000000000000000007f5c764cbc14f9669b88837ca1490cca17c3160700000000000000000000000073c486d8828778d1113fc251bb0f8051cf4831d100000000000000000000000073c486d8828778d1113fc251bb0f8051cf4831d100000000000000000000000000000000000000000000000000000000853e594400000000000000000000000000000000000000000000000000000000000000c00000000000000000000000000000000000000000000000000000000000000000,,,1,true -10310,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec340000000000000000000000002495fbe9664d0cb6fa64ff82ab0c09828c6fec5d0000000000000000000000002495fbe9664d0cb6fa64ff82ab0c09828c6fec5d00000000000000000000000000000000000000000000000000071afd498d000000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -10311,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec34000000000000000000000000f1e65b35a31bbd0e3be874107077668b890eca71000000000000000000000000f1e65b35a31bbd0e3be874107077668b890eca710000000000000000000000000000000000000000000000000033d1fe15ed120000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -10313,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec34000000000000000000000000fd62ff34e049b1aa707cc2354b284d1d14d05feb000000000000000000000000fd62ff34e049b1aa707cc2354b284d1d14d05feb0000000000000000000000000000000000000000000000000029cee12b25d50000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -10315,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec340000000000000000000000006adadd07bc925e5b1ee66ab7882cd9123659b3070000000000000000000000006adadd07bc925e5b1ee66ab7882cd9123659b30700000000000000000000000000000000000000000000000000f5fb428d649b1600000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -10316,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec3400000000000000000000000080aaf7d99a2fc604f597b3e4aa5caeb309fb8ff300000000000000000000000080aaf7d99a2fc604f597b3e4aa5caeb309fb8ff3000000000000000000000000000000000000000000000000000009184e72a00000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -10317,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0xa9f9e675000000000000000000000000a0b86991c6218b36c1d19d4a2e9eb0ce3606eb480000000000000000000000007f5c764cbc14f9669b88837ca1490cca17c31607000000000000000000000000075259cc3a74fde232f8219af4c6f11bfb3ae4f7000000000000000000000000075259cc3a74fde232f8219af4c6f11bfb3ae4f7000000000000000000000000000000000000000000000000000000000000006400000000000000000000000000000000000000000000000000000000000000c00000000000000000000000000000000000000000000000000000000000000000,,,1,true -10318,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec34000000000000000000000000ad24ff5b503be5b6dd3936f842a252b0843ab808000000000000000000000000ad24ff5b503be5b6dd3936f842a252b0843ab80800000000000000000000000000000000000000000000000000a5c44c2413bc3400000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -10320,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0xa9f9e675000000000000000000000000dac17f958d2ee523a2206206994597c13d831ec700000000000000000000000094b008aa00579c1307b0ef2c499ad98a8ce58e5800000000000000000000000012592819286ea4352dc732edd6b65492325d33f000000000000000000000000012592819286ea4352dc732edd6b65492325d33f000000000000000000000000000000000000000000000000000000009411cfd1d00000000000000000000000000000000000000000000000000000000000000c00000000000000000000000000000000000000000000000000000000000000000,,,1,true -10321,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0xa9f9e675000000000000000000000000dac17f958d2ee523a2206206994597c13d831ec700000000000000000000000094b008aa00579c1307b0ef2c499ad98a8ce58e58000000000000000000000000009fddfa181c05f23eab8b17f15719dbeffcb060000000000000000000000000009fddfa181c05f23eab8b17f15719dbeffcb06000000000000000000000000000000000000000000000000000000000060905df00000000000000000000000000000000000000000000000000000000000000c00000000000000000000000000000000000000000000000000000000000000000,0x991d81d23dd63378654c79d88281a9398d8097bfc9c8a29914e79b68c3dd1ac4,2022-08-26 07:10:26.000 UTC,0,true -10322,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0xa9f9e675000000000000000000000000a0b86991c6218b36c1d19d4a2e9eb0ce3606eb480000000000000000000000007f5c764cbc14f9669b88837ca1490cca17c31607000000000000000000000000075259cc3a74fde232f8219af4c6f11bfb3ae4f7000000000000000000000000075259cc3a74fde232f8219af4c6f11bfb3ae4f700000000000000000000000000000000000000000000000000000000000003e800000000000000000000000000000000000000000000000000000000000000c00000000000000000000000000000000000000000000000000000000000000000,,,1,true -10323,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec340000000000000000000000003c2b1742dac3d8e05c8f4497a14c8be56834d6320000000000000000000000003c2b1742dac3d8e05c8f4497a14c8be56834d63200000000000000000000000000000000000000000000000000071afd498d000000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -10324,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0xa9f9e675000000000000000000000000dac17f958d2ee523a2206206994597c13d831ec700000000000000000000000094b008aa00579c1307b0ef2c499ad98a8ce58e58000000000000000000000000115c5b00726c22797c7dac1e614bc85aecf4d629000000000000000000000000115c5b00726c22797c7dac1e614bc85aecf4d629000000000000000000000000000000000000000000000000000000000666bafb00000000000000000000000000000000000000000000000000000000000000c00000000000000000000000000000000000000000000000000000000000000000,0x39ccd67a7700b997967bf0bbc08251c796652a75e34a8fd41be387856791a2d3,2022-08-26 07:06:59.000 UTC,0,true -10325,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec340000000000000000000000001e3c20cdfb58665c6b5ef73a3c6e3bb915dbe5d10000000000000000000000001e3c20cdfb58665c6b5ef73a3c6e3bb915dbe5d100000000000000000000000000000000000000000000000002eed84182f5f57100000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -10326,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec34000000000000000000000000f6c3c3621f42ec1f1cd1207bb1571d93646ab29a000000000000000000000000f6c3c3621f42ec1f1cd1207bb1571d93646ab29a000000000000000000000000000000000000000000000000015ebfea73a2530000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -10327,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec3400000000000000000000000060a2653f59dedafb8097d2ebb7306faaa396969400000000000000000000000060a2653f59dedafb8097d2ebb7306faaa396969400000000000000000000000000000000000000000000000000255cf559e8911b00000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -10328,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec34000000000000000000000000ba84c858a959d236b375a969412e3d78dc49d01e000000000000000000000000ba84c858a959d236b375a969412e3d78dc49d01e000000000000000000000000000000000000000000000000007d31275d4edc4100000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -10329,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec3400000000000000000000000085e8f7c8a4c0dad2ad621a0452fca994202c924000000000000000000000000085e8f7c8a4c0dad2ad621a0452fca994202c9240000000000000000000000000000000000000000000000000003abbf91aa5519900000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -10330,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec34000000000000000000000000477c43b4835cfdabbeca1db95ca830b9865a588e000000000000000000000000477c43b4835cfdabbeca1db95ca830b9865a588e00000000000000000000000000000000000000000000000000005af3107a400000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -10333,0xcd9d4988c0ae61887b075ba77f08cbfad2b65068,0x3f87ff1de58128ef8fcb4c807efd776e1ac72e51,0xf4f7b41a00000000000000000000000049205e7f66591d3742bdf61b5477dd5579896e9a000000000000000000000000000000000000000000000005f68e8131ecf80000,,,1,true -10334,0xcd9d4988c0ae61887b075ba77f08cbfad2b65068,0x3f87ff1de58128ef8fcb4c807efd776e1ac72e51,0xf4f7b41a00000000000000000000000049205e7f66591d3742bdf61b5477dd5579896e9a0000000000000000000000000000000000000000000000000de0b6b3a7640000,,,1,true -10336,0xcd9d4988c0ae61887b075ba77f08cbfad2b65068,0x3f87ff1de58128ef8fcb4c807efd776e1ac72e51,0xf4f7b41a00000000000000000000000049205e7f66591d3742bdf61b5477dd5579896e9a0000000000000000000000000000000000000000000000006124fee993bc0000,,,1,true -10337,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec34000000000000000000000000974250fa680bcf173d77c1950f2a9662d80c094b000000000000000000000000974250fa680bcf173d77c1950f2a9662d80c094b000000000000000000000000000000000000000000000000005629e98d33e95000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -10338,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec34000000000000000000000000c7a3cf40a424706362a4e7593826bf7976e8caf2000000000000000000000000c7a3cf40a424706362a4e7593826bf7976e8caf20000000000000000000000000000000000000000000000000000910ffc834bc000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -10339,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec34000000000000000000000000eee8def7aff805bd3d34ce2926e55308af6fdea7000000000000000000000000eee8def7aff805bd3d34ce2926e55308af6fdea70000000000000000000000000000000000000000000000000051acebe37b8d8400000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -10340,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec34000000000000000000000000a3265d44000d2dffe2987b379759f657912c0df7000000000000000000000000a3265d44000d2dffe2987b379759f657912c0df70000000000000000000000000000000000000000000000000038d62a5f060fc000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -10342,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec340000000000000000000000000ef0f60b0de23ef1943545392d9999acc2bf93a90000000000000000000000000ef0f60b0de23ef1943545392d9999acc2bf93a900000000000000000000000000000000000000000000000000524c1560ffebfe00000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -10343,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec340000000000000000000000003027e896eb33338ee957c75c850dfa5675192dd30000000000000000000000003027e896eb33338ee957c75c850dfa5675192dd300000000000000000000000000000000000000000000000000005af3107a400000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -10344,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec340000000000000000000000003027e896eb33338ee957c75c850dfa5675192dd30000000000000000000000003027e896eb33338ee957c75c850dfa5675192dd300000000000000000000000000000000000000000000000000005af3107a400000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -10345,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec340000000000000000000000000c2d10e462338c73aa623c66d7ab7000e3113d0c0000000000000000000000000c2d10e462338c73aa623c66d7ab7000e3113d0c00000000000000000000000000000000000000000000000000540fc1d5bdc0a200000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -10346,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec34000000000000000000000000ba1a0bea968df4223863751bb1d38e6598875994000000000000000000000000ba1a0bea968df4223863751bb1d38e6598875994000000000000000000000000000000000000000000000000005755daaa5fc49b00000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -10347,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec3400000000000000000000000020d6827df2cb81cc673e2d8aaf1a551ba4a223ef00000000000000000000000020d6827df2cb81cc673e2d8aaf1a551ba4a223ef00000000000000000000000000000000000000000000000000535f100862a1a800000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -10349,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec340000000000000000000000005de56eff8cca0aacba2843ea6f4d95bd3f18fb6f0000000000000000000000005de56eff8cca0aacba2843ea6f4d95bd3f18fb6f0000000000000000000000000000000000000000000000000066851c120c91ca00000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -10350,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec340000000000000000000000002c9f2f77293528e7d2e8b02e6176d8eef9d35ec30000000000000000000000002c9f2f77293528e7d2e8b02e6176d8eef9d35ec3000000000000000000000000000000000000000000000000000d145bc1e07f6000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -10351,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec3400000000000000000000000016d95d23a1c8004791c6054eb44e5ab0247b91d500000000000000000000000016d95d23a1c8004791c6054eb44e5ab0247b91d50000000000000000000000000000000000000000000000000131493891a5f2b200000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -10352,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec3400000000000000000000000024efda7b7781f877bd1ea07d50db5f4f39378bd600000000000000000000000024efda7b7781f877bd1ea07d50db5f4f39378bd6000000000000000000000000000000000000000000000000000efca6e002cdc000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -10353,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0xa9f9e6750000000000000000000000001f9840a85d5af5bf1d1762f925bdaddc4201f9840000000000000000000000006fd9d7ad17242c41f7131d257212c54a0e81669100000000000000000000000024efda7b7781f877bd1ea07d50db5f4f39378bd600000000000000000000000024efda7b7781f877bd1ea07d50db5f4f39378bd60000000000000000000000000000000000000000000000001e8210322557b37500000000000000000000000000000000000000000000000000000000000000c00000000000000000000000000000000000000000000000000000000000000000,,,1,true -10357,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec34000000000000000000000000b7a0a0b2b1f6a256dcbf6516aaecd6a5c616a020000000000000000000000000b7a0a0b2b1f6a256dcbf6516aaecd6a5c616a02000000000000000000000000000000000000000000000000000845e39c720d1df00000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -10359,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec3400000000000000000000000051cfff329f4e823c370b1d210bc52a53c084e7d300000000000000000000000051cfff329f4e823c370b1d210bc52a53c084e7d300000000000000000000000000000000000000000000000000303d2b6931c19b00000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,0x73813adc4c0da4fedfce1011fdaa2bba0c66889f2ea5a4663707577d3ff27b32,2022-08-25 00:51:03.000 UTC,0,true -10360,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec34000000000000000000000000ac30912712612e1b8cd3ece688fb1e917ae3d62b000000000000000000000000ac30912712612e1b8cd3ece688fb1e917ae3d62b000000000000000000000000000000000000000000000000000b2d034bb75cfc00000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -10361,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec340000000000000000000000005465b4f4ea1cb0222063fe68812e064688d55fe70000000000000000000000005465b4f4ea1cb0222063fe68812e064688d55fe700000000000000000000000000000000000000000000000000b3a2307b20a3f600000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -10363,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec340000000000000000000000007c0fa5ab1a86cba0321d7b173b751e264fba955b0000000000000000000000007c0fa5ab1a86cba0321d7b173b751e264fba955b000000000000000000000000000000000000000000000000000c4940304217d400000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -10364,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec340000000000000000000000002731d63bd9dcc8954a00ce371ee684f3a80731670000000000000000000000002731d63bd9dcc8954a00ce371ee684f3a80731670000000000000000000000000000000000000000000000000de24152aa6c010000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,0xf7d7e75e42294d5c18a1b180f49710329b550cf22bd6039c219dd3d9743664af,2022-01-06 11:09:27.000 UTC,0,true -10365,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec34000000000000000000000000a751840c88c172fd286ed65d7370e80af88f77a6000000000000000000000000a751840c88c172fd286ed65d7370e80af88f77a6000000000000000000000000000000000000000000000000000ba6331297b7c400000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -10366,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec34000000000000000000000000a72315bf50892d6c75341446b890ec0064b2eec4000000000000000000000000a72315bf50892d6c75341446b890ec0064b2eec4000000000000000000000000000000000000000000000000000b51c38f73e0c900000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -10367,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec340000000000000000000000003b9bf228ef7c4fe0f27338944e56babcbe1363540000000000000000000000003b9bf228ef7c4fe0f27338944e56babcbe13635400000000000000000000000000000000000000000000000000d827f523ed588800000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -10368,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec34000000000000000000000000a07014c48675e60949a2324400e2a783c4c8e3db000000000000000000000000a07014c48675e60949a2324400e2a783c4c8e3db000000000000000000000000000000000000000000000000001b3ebfdfe218c000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -10369,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec3400000000000000000000000029c56a174a6407ded4297fa9b3db40986eeae49200000000000000000000000029c56a174a6407ded4297fa9b3db40986eeae492000000000000000000000000000000000000000000000000000d4c94a4f3c64700000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -10370,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec3400000000000000000000000025132bb3a3276d1cb05f975e790f86b5122b34e400000000000000000000000025132bb3a3276d1cb05f975e790f86b5122b34e4000000000000000000000000000000000000000000000000000c6a8a8d77d60000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -10371,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec34000000000000000000000000d6310c4d5e6680d891d1ebf25d0783fe60c40520000000000000000000000000d6310c4d5e6680d891d1ebf25d0783fe60c405200000000000000000000000000000000000000000000000000060fb56aab1ee3800000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -10372,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec34000000000000000000000000290ea250ce53f591a3343967683702e43c2b4f3f000000000000000000000000290ea250ce53f591a3343967683702e43c2b4f3f000000000000000000000000000000000000000000000000004705057d8edd7c00000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -10373,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec340000000000000000000000006780f586701c31e08eecef12302fc97c0ae994490000000000000000000000006780f586701c31e08eecef12302fc97c0ae99449000000000000000000000000000000000000000000000000002386f26fc1000000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -10374,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec340000000000000000000000008e988e5332a1bbd17dc7392cc94f391ff27e7e2f0000000000000000000000008e988e5332a1bbd17dc7392cc94f391ff27e7e2f000000000000000000000000000000000000000000000000000d4651ea74c44500000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -10375,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec340000000000000000000000000edc11c59261bc0df4bfe982aae936f7f213ab260000000000000000000000000edc11c59261bc0df4bfe982aae936f7f213ab26000000000000000000000000000000000000000000000000000d181962a8f39400000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -10377,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec34000000000000000000000000e8c0fe3699db673486c391a4eefa5a18c7cfd4d6000000000000000000000000e8c0fe3699db673486c391a4eefa5a18c7cfd4d60000000000000000000000000000000000000000000000000059bd223f7c06c200000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,0x1e65de2fa611ffe46c6d4df47841ff787a8163af1432b13e5e67e90bbea998d6,2022-03-22 14:28:02.000 UTC,0,true -10380,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec340000000000000000000000002076a89dd5fc291ebd740a83b4ca3e8ea8909e4d0000000000000000000000002076a89dd5fc291ebd740a83b4ca3e8ea8909e4d000000000000000000000000000000000000000000000000000e14ff25ee120200000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -10381,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec3400000000000000000000000076766ce199954d2dc52e14577e2434ed00fb4bb000000000000000000000000076766ce199954d2dc52e14577e2434ed00fb4bb00000000000000000000000000000000000000000000000000001dab777c54d0000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -10383,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec340000000000000000000000007a31e57d956e539de434d1c7d8685c4971bd6fb80000000000000000000000007a31e57d956e539de434d1c7d8685c4971bd6fb8000000000000000000000000000000000000000000000000001e63e0cca6755900000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -10384,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec340000000000000000000000003bfcfcb32ff59f173d834fa3b354d0bb7c86956f0000000000000000000000003bfcfcb32ff59f173d834fa3b354d0bb7c86956f000000000000000000000000000000000000000000000000000e045c4cff80e500000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -10389,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec340000000000000000000000001e1c63ce6d149b35ed6daba02cc354d34c9faa180000000000000000000000001e1c63ce6d149b35ed6daba02cc354d34c9faa1800000000000000000000000000000000000000000000000000b1a2bc2ec5000000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -10391,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec340000000000000000000000001f8155e3886a9c97013982d38aec63c2193775d30000000000000000000000001f8155e3886a9c97013982d38aec63c2193775d3000000000000000000000000000000000000000000000000000d105fc1be372400000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -10392,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec34000000000000000000000000459a546e809a0e0c62681c37246e38d95953aa54000000000000000000000000459a546e809a0e0c62681c37246e38d95953aa54000000000000000000000000000000000000000000000000000c15529be51da700000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -10393,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0xa9f9e675000000000000000000000000a0b86991c6218b36c1d19d4a2e9eb0ce3606eb480000000000000000000000007f5c764cbc14f9669b88837ca1490cca17c31607000000000000000000000000bdf115e1d046d7349a661eaa251d48608e3f939e000000000000000000000000bdf115e1d046d7349a661eaa251d48608e3f939e0000000000000000000000000000000000000000000000000000000001312d0000000000000000000000000000000000000000000000000000000000000000c00000000000000000000000000000000000000000000000000000000000000000,,,1,true -10398,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec34000000000000000000000000bc390424dfea40cfd543e587990b2b5f7b4cc915000000000000000000000000bc390424dfea40cfd543e587990b2b5f7b4cc915000000000000000000000000000000000000000000000000000c57c32afd240000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -10399,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec34000000000000000000000000b4aead784c4e59ee9d1b317f82603b769bdba982000000000000000000000000b4aead784c4e59ee9d1b317f82603b769bdba98200000000000000000000000000000000000000000000000000038d7ea4c6800000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -10400,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec34000000000000000000000000306499ad40e5bdbe11f9a6d033f007ee20fe345a000000000000000000000000306499ad40e5bdbe11f9a6d033f007ee20fe345a0000000000000000000000000000000000000000000000000033edf34cb4da0000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -10401,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec3400000000000000000000000033ef01af8b91f84e1c0c6b08bae0c5c4e65b7fc100000000000000000000000033ef01af8b91f84e1c0c6b08bae0c5c4e65b7fc1000000000000000000000000000000000000000000000000000d1b7004b4446000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -10403,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec340000000000000000000000002fee36c9f72e1da974805789a8b5733653d679b80000000000000000000000002fee36c9f72e1da974805789a8b5733653d679b8000000000000000000000000000000000000000000000000002588b8679d0d0000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -10404,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec34000000000000000000000000f109367d4ace9ae46031b69edd5412f892d3d1d7000000000000000000000000f109367d4ace9ae46031b69edd5412f892d3d1d70000000000000000000000000000000000000000000000000011c37937e0800000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -10405,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec340000000000000000000000001afb2264e1bbbf65f452626328d040eefcb92e0c0000000000000000000000001afb2264e1bbbf65f452626328d040eefcb92e0c000000000000000000000000000000000000000000000000000d380f258d8c0700000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -10407,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec34000000000000000000000000a5bd1f7a3dac45018d73f1214b87363801af7ede000000000000000000000000a5bd1f7a3dac45018d73f1214b87363801af7ede000000000000000000000000000000000000000000000000000d60bc5d1e387200000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -10409,0xcd9d4988c0ae61887b075ba77f08cbfad2b65068,0x3f87ff1de58128ef8fcb4c807efd776e1ac72e51,0xf4f7b41a0000000000000000000000000fe4cc87fe5cbf2fc26bf1884538ec47b5aaf012000000000000000000000000000000000000000000000000004cfb4352ddefe9,0xaa820607003db3ab74700a02f2629c7c02600022c8c0a91416627ab1c8e78d4c,2022-04-27 09:18:18.000 UTC,0,true -10410,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec34000000000000000000000000dc9aefd6d7f074c382f193546a79491eb421a80b000000000000000000000000dc9aefd6d7f074c382f193546a79491eb421a80b00000000000000000000000000000000000000000000000000ae953c13ad3bdb00000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -10412,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec34000000000000000000000000dc6c17eacee54c466f081689975a861c0a7698ff000000000000000000000000dc6c17eacee54c466f081689975a861c0a7698ff00000000000000000000000000000000000000000000000000310658aa6c335b00000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -10413,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec3400000000000000000000000095529429a073b6fe1c6b21a6d92ba9879fafbdee00000000000000000000000095529429a073b6fe1c6b21a6d92ba9879fafbdee000000000000000000000000000000000000000000000000007e49daa7c5d10000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -10414,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec34000000000000000000000000758a1e3e12ef6c74d77b4320ea4ef017ad5a4fc4000000000000000000000000758a1e3e12ef6c74d77b4320ea4ef017ad5a4fc400000000000000000000000000000000000000000000000000473f64cde6048000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -10415,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec34000000000000000000000000e591a4be7dea045f49159cf671ed41f55191dbb1000000000000000000000000e591a4be7dea045f49159cf671ed41f55191dbb10000000000000000000000000000000000000000000000000021e3293f9efd0000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -10416,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec34000000000000000000000000047c4df460eec9929bd791792f018a795b306a2a000000000000000000000000047c4df460eec9929bd791792f018a795b306a2a000000000000000000000000000000000000000000000000000aa87bee53800000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -10417,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec34000000000000000000000000e5584e0a5e18c086e20f28eef05dcb6be676c555000000000000000000000000e5584e0a5e18c086e20f28eef05dcb6be676c55500000000000000000000000000000000000000000000000000222fe6fa62056e00000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -10419,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec34000000000000000000000000f7e76789cc5d88a7214c5c32121f4d1e2f0c2f77000000000000000000000000f7e76789cc5d88a7214c5c32121f4d1e2f0c2f77000000000000000000000000000000000000000000000000015b8bc5b8f0535400000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,0x68e3c3c3665281b703e7b7596aed47a0f1601edadba36f038b70a3d8b5671f5b,2021-12-11 11:00:54.000 UTC,0,true -10420,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec340000000000000000000000005ccf5ef7c438b95aea40b320ac03e4c9fceba2c70000000000000000000000005ccf5ef7c438b95aea40b320ac03e4c9fceba2c700000000000000000000000000000000000000000000000000018b369621c10000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -10423,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec34000000000000000000000000f81ccb8e57b2ed0adcaf8b897c9a0f02a129189c000000000000000000000000f81ccb8e57b2ed0adcaf8b897c9a0f02a129189c000000000000000000000000000000000000000000000000006cfe6cc923b13800000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -10424,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec340000000000000000000000009628f11c8fbf15df1307ad5284398ad7dcdf573c0000000000000000000000009628f11c8fbf15df1307ad5284398ad7dcdf573c000000000000000000000000000000000000000000000000002386f26fc1000000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -10426,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec3400000000000000000000000072187a33d6f951afc3c1d7755b605f02fa498b2d00000000000000000000000072187a33d6f951afc3c1d7755b605f02fa498b2d0000000000000000000000000000000000000000000000000157ee701579a06400000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -10429,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec340000000000000000000000000efdb6a72c4481baf344d128822e8904f1f9d1720000000000000000000000000efdb6a72c4481baf344d128822e8904f1f9d17200000000000000000000000000000000000000000000000000a7edf0d93cac1300000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -10430,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec34000000000000000000000000af7075810810db4f9a248946f5d4cdd165df4a68000000000000000000000000af7075810810db4f9a248946f5d4cdd165df4a6800000000000000000000000000000000000000000000000000599235cec2c53f00000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -10431,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec34000000000000000000000000662402017f2b470c0bc3cd2eec7d5aba295e5a80000000000000000000000000662402017f2b470c0bc3cd2eec7d5aba295e5a800000000000000000000000000000000000000000000000000031281ea042f4cd00000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -10432,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec34000000000000000000000000190145bf14bb40dd7b0ba8ed664c43cd6cbe2a88000000000000000000000000190145bf14bb40dd7b0ba8ed664c43cd6cbe2a88000000000000000000000000000000000000000000000000004546dea969c30000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -10433,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec34000000000000000000000000b9d67ddaaa7b695c4e10b24950dae1b992addae8000000000000000000000000b9d67ddaaa7b695c4e10b24950dae1b992addae80000000000000000000000000000000000000000000000000045aea0904cfc0000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -10436,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec340000000000000000000000002ed688a91f3a1a466a719dfd933e32cdd69fe92a0000000000000000000000002ed688a91f3a1a466a719dfd933e32cdd69fe92a000000000000000000000000000000000000000000000000019bf74f7eb51a2d00000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -10437,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec34000000000000000000000000bdefae79ca8c7ee5c7d34e45d4a63453dbc0363c000000000000000000000000bdefae79ca8c7ee5c7d34e45d4a63453dbc0363c000000000000000000000000000000000000000000000000000ecd47e32dcd7c00000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -10438,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec340000000000000000000000006abc41db02e8a2eb9bdd6fc4095325f0b2b721360000000000000000000000006abc41db02e8a2eb9bdd6fc4095325f0b2b7213600000000000000000000000000000000000000000000000000254db1c224400000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -10439,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec34000000000000000000000000bf1d8a0504262f9f66ffa62beacc4102be4661f8000000000000000000000000bf1d8a0504262f9f66ffa62beacc4102be4661f8000000000000000000000000000000000000000000000000000d0c2e31ae3dfe00000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -10440,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec340000000000000000000000009e695566c9ac320367556a16af50cd272d577c7f0000000000000000000000009e695566c9ac320367556a16af50cd272d577c7f000000000000000000000000000000000000000000000000015e565549ac8b6700000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -10442,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec34000000000000000000000000feefe20c0f5627ecd1b7b0f6d2a9a5ff0e64d3ab000000000000000000000000feefe20c0f5627ecd1b7b0f6d2a9a5ff0e64d3ab000000000000000000000000000000000000000000000000000e098a21e3f27400000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -10443,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec340000000000000000000000001e7197e7cca2355b83a33e345bc6a65c722d03630000000000000000000000001e7197e7cca2355b83a33e345bc6a65c722d036300000000000000000000000000000000000000000000000000011563f569ae0000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -10444,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec340000000000000000000000001efabc745a24d9b957dc383f2e422203c4f2889f0000000000000000000000001efabc745a24d9b957dc383f2e422203c4f2889f000000000000000000000000000000000000000000000000000abcc4d43595c000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -10445,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec34000000000000000000000000c19d05ae498b8143a14463eb78b84a4cd71b7d53000000000000000000000000c19d05ae498b8143a14463eb78b84a4cd71b7d53000000000000000000000000000000000000000000000000000dbc30fd03389900000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -10446,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec34000000000000000000000000256ff537f23af82ad81ab9d9f5af0135a9fc6f29000000000000000000000000256ff537f23af82ad81ab9d9f5af0135a9fc6f290000000000000000000000000000000000000000000000000156b2164c3106df00000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -10447,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec34000000000000000000000000ebf7b028d7388828c806d6dd79d776fe39e19e3c000000000000000000000000ebf7b028d7388828c806d6dd79d776fe39e19e3c000000000000000000000000000000000000000000000000001f322b984cad2200000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -10448,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec34000000000000000000000000d89b1bd184f350fdf7d14e7158b184deb236f999000000000000000000000000d89b1bd184f350fdf7d14e7158b184deb236f999000000000000000000000000000000000000000000000000000dd67a35380b2b00000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -10449,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0xa9f9e675000000000000000000000000dac17f958d2ee523a2206206994597c13d831ec700000000000000000000000094b008aa00579c1307b0ef2c499ad98a8ce58e580000000000000000000000004df622c2d7df728960230ec203e833034cac84610000000000000000000000004df622c2d7df728960230ec203e833034cac84610000000000000000000000000000000000000000000000000000000002faf08000000000000000000000000000000000000000000000000000000000000000c00000000000000000000000000000000000000000000000000000000000000000,,,1,true -10450,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec34000000000000000000000000477693335ab58bbd009b6b796f5bbeb13bd10cd0000000000000000000000000477693335ab58bbd009b6b796f5bbeb13bd10cd0000000000000000000000000000000000000000000000000000e59f15c94493a00000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -10452,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec34000000000000000000000000bc3bd9d13fea7ffff52b7d2e32cd64a8cf1387f3000000000000000000000000bc3bd9d13fea7ffff52b7d2e32cd64a8cf1387f3000000000000000000000000000000000000000000000000000d45234dbafca800000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -10453,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec34000000000000000000000000b684e3800bd805c14b52031467c3c42373ad65f8000000000000000000000000b684e3800bd805c14b52031467c3c42373ad65f80000000000000000000000000000000000000000000000000068de98d2dcf70000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -10456,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec34000000000000000000000000ab11283c156a1703a4f5e1aa42e9780d52bcf73f000000000000000000000000ab11283c156a1703a4f5e1aa42e9780d52bcf73f000000000000000000000000000000000000000000000000002386f26fc1000000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -10457,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec3400000000000000000000000017680a3936ff75d52535d1e33d3e68c647e48a3300000000000000000000000017680a3936ff75d52535d1e33d3e68c647e48a33000000000000000000000000000000000000000000000000000aa87bee53800000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -10458,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec34000000000000000000000000a2a7262fc073aac863e3e48e3bcb00558093bff3000000000000000000000000a2a7262fc073aac863e3e48e3bcb00558093bff3000000000000000000000000000000000000000000000000000e35fa931a000000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -10459,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec3400000000000000000000000093dde3d39f3154adf86a9ab0ae6397363fc590cd00000000000000000000000093dde3d39f3154adf86a9ab0ae6397363fc590cd000000000000000000000000000000000000000000000000000e35fa931a000000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -10460,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec340000000000000000000000004156507bf3ade70dfa9e682b4cb1cdd8b24e705a0000000000000000000000004156507bf3ade70dfa9e682b4cb1cdd8b24e705a00000000000000000000000000000000000000000000000000038d7ea4c6800000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -10461,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec34000000000000000000000000b2f56984239bcb2d062bc7788ec5aab25f686fbb000000000000000000000000b2f56984239bcb2d062bc7788ec5aab25f686fbb000000000000000000000000000000000000000000000000001550f7dca7000000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -10462,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec34000000000000000000000000248f389281687095198ccceb16fd2b92efc8b7bd000000000000000000000000248f389281687095198ccceb16fd2b92efc8b7bd0000000000000000000000000000000000000000000000000018de76816d800000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -10463,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec34000000000000000000000000255c391f2c1c64bc135fb394362bf310e09f3328000000000000000000000000255c391f2c1c64bc135fb394362bf310e09f33280000000000000000000000000000000000000000000000000018de76816d800000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -10464,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec34000000000000000000000000581edc6ba25b2e56d59a2e82b038caa35b7b1f4d000000000000000000000000581edc6ba25b2e56d59a2e82b038caa35b7b1f4d000000000000000000000000000000000000000000000000000009184e72a00000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -10465,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0xa9f9e675000000000000000000000000dac17f958d2ee523a2206206994597c13d831ec700000000000000000000000094b008aa00579c1307b0ef2c499ad98a8ce58e58000000000000000000000000a9a64cb1b4119f8db3ee530702190aa10694c24d000000000000000000000000a9a64cb1b4119f8db3ee530702190aa10694c24d000000000000000000000000000000000000000000000000000000000633d64100000000000000000000000000000000000000000000000000000000000000c00000000000000000000000000000000000000000000000000000000000000000,,,1,true -10466,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec34000000000000000000000000fbe9c1b0f02686a8402ec81e347779a564c09c84000000000000000000000000fbe9c1b0f02686a8402ec81e347779a564c09c84000000000000000000000000000000000000000000000000000be4d61616648f00000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -10467,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec34000000000000000000000000256aa98410eb7b35bf24ee99e7524024d99a26ad000000000000000000000000256aa98410eb7b35bf24ee99e7524024d99a26ad0000000000000000000000000000000000000000000000000078cd007cd583ae00000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -10468,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec3400000000000000000000000019971072299d8b90fdaa3db41ba90fc0025f914000000000000000000000000019971072299d8b90fdaa3db41ba90fc0025f9140000000000000000000000000000000000000000000000000000d56053960c04100000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -10469,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec34000000000000000000000000bd2dc5fb8b6222d9f743b3eeec059790c07ca2a4000000000000000000000000bd2dc5fb8b6222d9f743b3eeec059790c07ca2a40000000000000000000000000000000000000000000000000005a1e6918c630000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -10470,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec34000000000000000000000000cf4b2306c778e05583a70e8292cd8b249d2f8b23000000000000000000000000cf4b2306c778e05583a70e8292cd8b249d2f8b23000000000000000000000000000000000000000000000000000ce808aa26c15400000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -10471,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec34000000000000000000000000e17e0015b6ca59718544629173ef950f71b58bf9000000000000000000000000e17e0015b6ca59718544629173ef950f71b58bf9000000000000000000000000000000000000000000000000000cd2b6fc03d92a00000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -10472,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec34000000000000000000000000a8c61ac44459438cc507a374e4d795bf02dd55ba000000000000000000000000a8c61ac44459438cc507a374e4d795bf02dd55ba00000000000000000000000000000000000000000000000001988fe4052b800000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -10473,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec3400000000000000000000000021e23a038552857d2c4618b025e62c1a800bf52900000000000000000000000021e23a038552857d2c4618b025e62c1a800bf529000000000000000000000000000000000000000000000000015c2a7b13fd000000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -10475,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec34000000000000000000000000710adece5ee716c3607352ea34736fe0a186b16b000000000000000000000000710adece5ee716c3607352ea34736fe0a186b16b000000000000000000000000000000000000000000000000000c6fc30ab9230b00000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -10477,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec340000000000000000000000003324e3701dbc3143b39ca02e3c72b88d9757cf7b0000000000000000000000003324e3701dbc3143b39ca02e3c72b88d9757cf7b000000000000000000000000000000000000000000000000000dce63a989b4e100000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -10478,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec34000000000000000000000000a3be5ba3ada495ee2977e624347db8a2a79a10f7000000000000000000000000a3be5ba3ada495ee2977e624347db8a2a79a10f700000000000000000000000000000000000000000000000000b1a2bc2ec5000000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -10481,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec3400000000000000000000000037e7262cb909dd674e102ed54d186e27b371c88f00000000000000000000000037e7262cb909dd674e102ed54d186e27b371c88f000000000000000000000000000000000000000000000000005cd319724f977100000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,0x7430ed0891ec4564e91ebcddc1ced1ef35ce12087e9d8292a6cd82be3dbdc736,2022-05-15 04:58:05.000 UTC,0,true -10482,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec340000000000000000000000004e0bb9621fe9260272fa3bb754d6ad2e6d93062d0000000000000000000000004e0bb9621fe9260272fa3bb754d6ad2e6d93062d000000000000000000000000000000000000000000000000000c6fe94b550f2400000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -10483,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec34000000000000000000000000a2d9240c737c2db2acacbe96d925d701893bac4d000000000000000000000000a2d9240c737c2db2acacbe96d925d701893bac4d0000000000000000000000000000000000000000000000000038f020adcc529600000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -10484,0x10e6593cdda8c58a1d0f14c5164b376352a55f2f,0x467194771dae2967aef3ecbedd3bf9a310c76c65,0xa9f9e6750000000000000000000000006b175474e89094c44da98b954eedeac495271d0f000000000000000000000000da10009cbd5d07dd0cecc66161fc93d7c9000da10000000000000000000000002d66f67924d41f82c5cb76f83bd08511b8c543b10000000000000000000000002d66f67924d41f82c5cb76f83bd08511b8c543b10000000000000000000000000000000000000000000000000429d069189e000000000000000000000000000000000000000000000000000000000000000000c00000000000000000000000000000000000000000000000000000000000000000,,,1,true -10485,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec3400000000000000000000000007657b4ea5812f03232e553549ab93f54c2d38c100000000000000000000000007657b4ea5812f03232e553549ab93f54c2d38c1000000000000000000000000000000000000000000000000000c87b79f6e99e700000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -10487,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec3400000000000000000000000051cc2245a1ef254091b081221096ca8df45410a800000000000000000000000051cc2245a1ef254091b081221096ca8df45410a8000000000000000000000000000000000000000000000000011c37937e08000000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -10488,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec34000000000000000000000000ffd7e2c88dabcdcd2c8525dfb53f133084e64c4a000000000000000000000000ffd7e2c88dabcdcd2c8525dfb53f133084e64c4a000000000000000000000000000000000000000000000000000b386ae4b49d6a00000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -10489,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec34000000000000000000000000d06cb12b9c761bb73707b180637f13d08e495b71000000000000000000000000d06cb12b9c761bb73707b180637f13d08e495b71000000000000000000000000000000000000000000000000000c4ea07e3c82c500000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -10490,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec34000000000000000000000000f88196d9a8eab8c950d8233271268f9e47a26405000000000000000000000000f88196d9a8eab8c950d8233271268f9e47a26405000000000000000000000000000000000000000000000000000c8858a0eb0aed00000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -10491,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec3400000000000000000000000083e91c72cd9fb3ab637c285127a46590cb7d3c9700000000000000000000000083e91c72cd9fb3ab637c285127a46590cb7d3c97000000000000000000000000000000000000000000000000000b8a3f66289b2500000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -10492,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec340000000000000000000000007aaabbafdd47479d9f6a57470b83a65169b9e15b0000000000000000000000007aaabbafdd47479d9f6a57470b83a65169b9e15b000000000000000000000000000000000000000000000000000c36ad0f6c0a6600000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -10493,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec340000000000000000000000009eb832fcc5bf2d7f29863f508c21d63fb11d1f430000000000000000000000009eb832fcc5bf2d7f29863f508c21d63fb11d1f43000000000000000000000000000000000000000000000000000cf0498673fac000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -10494,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec34000000000000000000000000aa2500bc101fdadb2226a2e41e597f28cdac39c1000000000000000000000000aa2500bc101fdadb2226a2e41e597f28cdac39c1000000000000000000000000000000000000000000000000000d9a62a278ef6b00000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -10495,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec340000000000000000000000000549b8995b9701126dd48b8dc0b46299273714c60000000000000000000000000549b8995b9701126dd48b8dc0b46299273714c600000000000000000000000000000000000000000000000001176a5c84ee058000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -10496,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0xa9f9e6750000000000000000000000001f9840a85d5af5bf1d1762f925bdaddc4201f9840000000000000000000000006fd9d7ad17242c41f7131d257212c54a0e8166910000000000000000000000005c3d205052b1b081b2d31b8a9caad7a7dea6690c0000000000000000000000005c3d205052b1b081b2d31b8a9caad7a7dea6690c00000000000000000000000000000000000000000000000019db110828b7993200000000000000000000000000000000000000000000000000000000000000c00000000000000000000000000000000000000000000000000000000000000000,,,1,true -10497,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec34000000000000000000000000b5860fb66477149695d65c3dbf3483a89853398d000000000000000000000000b5860fb66477149695d65c3dbf3483a89853398d0000000000000000000000000000000000000000000000000098c445ad57800000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -10499,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec34000000000000000000000000a7ce80b7681693de60bc0e1e5d5ad37080523990000000000000000000000000a7ce80b7681693de60bc0e1e5d5ad3708052399000000000000000000000000000000000000000000000000000038d7ea4c6800000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -10500,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec34000000000000000000000000683cb0cfb74d7ae69af0b1b7c747fe916bd51612000000000000000000000000683cb0cfb74d7ae69af0b1b7c747fe916bd51612000000000000000000000000000000000000000000000000003d6c3e0395d93700000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -10501,0x10e6593cdda8c58a1d0f14c5164b376352a55f2f,0x467194771dae2967aef3ecbedd3bf9a310c76c65,0xa9f9e6750000000000000000000000006b175474e89094c44da98b954eedeac495271d0f000000000000000000000000da10009cbd5d07dd0cecc66161fc93d7c9000da1000000000000000000000000239884357cdf794825d17433d7e53f2a2dd282f6000000000000000000000000239884357cdf794825d17433d7e53f2a2dd282f60000000000000000000000000000000000000000000000056bc75e2d6310000000000000000000000000000000000000000000000000000000000000000000c00000000000000000000000000000000000000000000000000000000000000000,0xc70d8e9f68f5fbc6675ee7cec19d2a45eb2b2ef83026c388f55e20f3a74e13b0,2022-02-25 11:13:44.000 UTC,0,true -10504,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0xa9f9e675000000000000000000000000a0b86991c6218b36c1d19d4a2e9eb0ce3606eb480000000000000000000000007f5c764cbc14f9669b88837ca1490cca17c31607000000000000000000000000e8ea1dcaf34ca901b9702d32cf47cc4ad5fad63b000000000000000000000000e8ea1dcaf34ca901b9702d32cf47cc4ad5fad63b000000000000000000000000000000000000000000000000000000004d408f6d00000000000000000000000000000000000000000000000000000000000000c00000000000000000000000000000000000000000000000000000000000000000,,,1,true -10506,0x10e6593cdda8c58a1d0f14c5164b376352a55f2f,0x467194771dae2967aef3ecbedd3bf9a310c76c65,0xa9f9e6750000000000000000000000006b175474e89094c44da98b954eedeac495271d0f000000000000000000000000da10009cbd5d07dd0cecc66161fc93d7c9000da1000000000000000000000000884fd3cc1440ab13451fbbab18317b784930e7f2000000000000000000000000884fd3cc1440ab13451fbbab18317b784930e7f20000000000000000000000000000000000000000000000003782dace9d90000000000000000000000000000000000000000000000000000000000000000000c00000000000000000000000000000000000000000000000000000000000000000,,,1,true -10507,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec34000000000000000000000000f82e9b159e39dbac277bd3041be6b1e240676fa6000000000000000000000000f82e9b159e39dbac277bd3041be6b1e240676fa60000000000000000000000000000000000000000000000000053d101b53d989000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -10508,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0xa9f9e675000000000000000000000000a0b86991c6218b36c1d19d4a2e9eb0ce3606eb480000000000000000000000007f5c764cbc14f9669b88837ca1490cca17c316070000000000000000000000006b77ba93c90918e8183015e1d34ea560849c65d20000000000000000000000006b77ba93c90918e8183015e1d34ea560849c65d200000000000000000000000000000000000000000000000000000000004c4b4000000000000000000000000000000000000000000000000000000000000000c00000000000000000000000000000000000000000000000000000000000000000,,,1,true -10509,0xcd9d4988c0ae61887b075ba77f08cbfad2b65068,0x3f87ff1de58128ef8fcb4c807efd776e1ac72e51,0xf4f7b41a00000000000000000000000087e897fe3270ceaf6d6fda5d7244a9656814d4c4000000000000000000000000000000000000000000000000165b2c3acd098ef4,,,1,true -10511,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec3400000000000000000000000030a07e234288d0f0da72222f76b9f838d8f35f2d00000000000000000000000030a07e234288d0f0da72222f76b9f838d8f35f2d00000000000000000000000000000000000000000000000000482515a12529b900000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -10512,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0xa9f9e675000000000000000000000000dac17f958d2ee523a2206206994597c13d831ec700000000000000000000000094b008aa00579c1307b0ef2c499ad98a8ce58e580000000000000000000000000c0f6e714ea96c4b984e03ef848b50e2ad5c1a450000000000000000000000000c0f6e714ea96c4b984e03ef848b50e2ad5c1a450000000000000000000000000000000000000000000000000000000009740b4000000000000000000000000000000000000000000000000000000000000000c00000000000000000000000000000000000000000000000000000000000000000,0xba38e66c9e7f453fd9c074496c2066714d62cfa797149f60880217d696acb3ec,2022-08-25 06:53:31.000 UTC,0,true -10513,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0xa9f9e675000000000000000000000000dac17f958d2ee523a2206206994597c13d831ec700000000000000000000000094b008aa00579c1307b0ef2c499ad98a8ce58e58000000000000000000000000626a06dfd07e6c74ad68ee1ccad71db0081f7069000000000000000000000000626a06dfd07e6c74ad68ee1ccad71db0081f7069000000000000000000000000000000000000000000000000000000000814c96000000000000000000000000000000000000000000000000000000000000000c00000000000000000000000000000000000000000000000000000000000000000,0x9e901d5a425313528d890a106cf0b51d487b1a5d55e7e8be17f4344b9df35e37,2022-08-24 06:15:50.000 UTC,0,true -10515,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec34000000000000000000000000682057e6e33d5d7beff7d95215273abe218b02b9000000000000000000000000682057e6e33d5d7beff7d95215273abe218b02b900000000000000000000000000000000000000000000000000007c923688bb8000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -10516,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec34000000000000000000000000cb165605142b60ef97688dc8890cebda3a31b694000000000000000000000000cb165605142b60ef97688dc8890cebda3a31b6940000000000000000000000000000000000000000000000000000a32de099514000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -10517,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0xa9f9e675000000000000000000000000dac17f958d2ee523a2206206994597c13d831ec700000000000000000000000094b008aa00579c1307b0ef2c499ad98a8ce58e5800000000000000000000000004bad03f2cf3e05dcd033b19cfc5da26a05a2d5700000000000000000000000004bad03f2cf3e05dcd033b19cfc5da26a05a2d57000000000000000000000000000000000000000000000000000000000848f8c000000000000000000000000000000000000000000000000000000000000000c00000000000000000000000000000000000000000000000000000000000000000,0x27cf4d03d91db3520338bb12d1eff2faa381bfa0ba18a518c15a5640d78273e1,2022-08-22 06:07:25.000 UTC,0,true -10518,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0xa9f9e675000000000000000000000000dac17f958d2ee523a2206206994597c13d831ec700000000000000000000000094b008aa00579c1307b0ef2c499ad98a8ce58e5800000000000000000000000073a0afc565454f4618d07732a79471d60486338a00000000000000000000000073a0afc565454f4618d07732a79471d60486338a00000000000000000000000000000000000000000000000000000000081b320000000000000000000000000000000000000000000000000000000000000000c00000000000000000000000000000000000000000000000000000000000000000,0xfc9bfe03844c563a153037d86c44fc92202695976d2b99e2b502d9db13b48aa9,2022-08-22 07:07:53.000 UTC,0,true -10519,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec34000000000000000000000000c677d82671ab99fb881d7bd22d597d29c7b5ae60000000000000000000000000c677d82671ab99fb881d7bd22d597d29c7b5ae6000000000000000000000000000000000000000000000000003f3d6c9baf193c300000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -10520,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0xa9f9e675000000000000000000000000dac17f958d2ee523a2206206994597c13d831ec700000000000000000000000094b008aa00579c1307b0ef2c499ad98a8ce58e5800000000000000000000000009b9c9bc11ece77edbead7d545eb9d1ca6bd115d00000000000000000000000009b9c9bc11ece77edbead7d545eb9d1ca6bd115d00000000000000000000000000000000000000000000000000000000074096ab00000000000000000000000000000000000000000000000000000000000000c00000000000000000000000000000000000000000000000000000000000000000,0xdfae0b1dd1347b0aaac615c011664c988e9ba287d9ff18e6695eebdadc120147,2022-08-23 07:02:18.000 UTC,0,true -10521,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec34000000000000000000000000e818f9e0023a1a19c0da79a33b8d02dd993006ea000000000000000000000000e818f9e0023a1a19c0da79a33b8d02dd993006ea00000000000000000000000000000000000000000000000000a595b521f57dd400000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,0x18aa0dd5c651a7cc4efa53bd41d487dc73b1260f24eee57734fcfdfcab2c905f,2022-03-09 14:38:36.000 UTC,0,true -10522,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec34000000000000000000000000e17c5cec6cb7587c28f2b9a16a93c97e4d93e871000000000000000000000000e17c5cec6cb7587c28f2b9a16a93c97e4d93e8710000000000000000000000000000000000000000000000000032cdc63449c00000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,0x9b7dc8ee74002073518c84ec070c46d77659d281a9125a4b468e62c9cef2e4ed,2022-06-20 22:48:49.000 UTC,0,true -10523,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec34000000000000000000000000b0e2e1edbe4029e55bd217f82724420023b90cd4000000000000000000000000b0e2e1edbe4029e55bd217f82724420023b90cd4000000000000000000000000000000000000000000000000004411d696c3ebb200000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -10528,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec34000000000000000000000000912026a2b3c52984830a1848ef5828d1dccc0c0b000000000000000000000000912026a2b3c52984830a1848ef5828d1dccc0c0b0000000000000000000000000000000000000000000000000021f9d07a4f900000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,0xb3e80fbfa8bfc01b732523605a5f456dec59f38bf7841ddc57128f9081bfdb77,2022-05-28 21:46:40.000 UTC,0,true -10529,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec34000000000000000000000000349ea0b723e3692a2ddcc0ae5cc85640f372ffd1000000000000000000000000349ea0b723e3692a2ddcc0ae5cc85640f372ffd1000000000000000000000000000000000000000000000000005af5a38e20373900000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -10530,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec340000000000000000000000007394dd6e970ecce75b1c36631c170d66aa172fc60000000000000000000000007394dd6e970ecce75b1c36631c170d66aa172fc60000000000000000000000000000000000000000000000000001c77c45f0ed0000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -10531,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec34000000000000000000000000d1453c1310846ec5ba080fcb1d3e128e9d124745000000000000000000000000d1453c1310846ec5ba080fcb1d3e128e9d124745000000000000000000000000000000000000000000000000007e6f918cce6e5100000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -10533,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec34000000000000000000000000a2fc64900dc0591e2bc8d8dcca8f758115bab519000000000000000000000000a2fc64900dc0591e2bc8d8dcca8f758115bab51900000000000000000000000000000000000000000000000000ad0b7ac8eb48f500000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,0x0070034200f7acf6ef113110b661f31c2f46a5ece2cbbe4b1be864448e7edd0e,2022-04-25 09:07:01.000 UTC,0,true -10536,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0xa9f9e675000000000000000000000000a0b86991c6218b36c1d19d4a2e9eb0ce3606eb480000000000000000000000007f5c764cbc14f9669b88837ca1490cca17c31607000000000000000000000000b2dd50d400d4e82768c4204bad49cde6186356e5000000000000000000000000b2dd50d400d4e82768c4204bad49cde6186356e5000000000000000000000000000000000000000000000000000000003c0c43f500000000000000000000000000000000000000000000000000000000000000c00000000000000000000000000000000000000000000000000000000000000000,0x22985cd7f07143938f0b0c1767d52715335bd4c0d2a2cadb87e9a1d751263bb2,2022-04-30 04:55:41.000 UTC,0,true -10537,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0xa9f9e675000000000000000000000000a0b86991c6218b36c1d19d4a2e9eb0ce3606eb480000000000000000000000007f5c764cbc14f9669b88837ca1490cca17c316070000000000000000000000001d3476db54dd1058b6d8a5bf8748cf1b8a7813e90000000000000000000000001d3476db54dd1058b6d8a5bf8748cf1b8a7813e90000000000000000000000000000000000000000000000000000000044d7081800000000000000000000000000000000000000000000000000000000000000c00000000000000000000000000000000000000000000000000000000000000000,0x4fe5f45375db48c4c88b130bf8a0131be183ce0e6d823c43f3e6e88660895d4e,2022-04-29 08:54:00.000 UTC,0,true -10540,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec34000000000000000000000000230221cae667969b423a3cf335891f30b1829caa000000000000000000000000230221cae667969b423a3cf335891f30b1829caa00000000000000000000000000000000000000000000000002c68af0bb14000000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -10543,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec34000000000000000000000000d308cc699614de8cf75c89f7ea6c604a59f216c2000000000000000000000000d308cc699614de8cf75c89f7ea6c604a59f216c2000000000000000000000000000000000000000000000000001fcb992932d3a800000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -10544,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec34000000000000000000000000c184e921d0c51ea0c12194050f2791d23f991f68000000000000000000000000c184e921d0c51ea0c12194050f2791d23f991f680000000000000000000000000000000000000000000000000374fead7ea2e92d00000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -10546,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec340000000000000000000000007f275599564fd00281c450ee6c50f03214fce8960000000000000000000000007f275599564fd00281c450ee6c50f03214fce8960000000000000000000000000000000000000000000000000003f53fbd6e500000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -10549,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec340000000000000000000000004ca58d8c7635e1f555aaa1bc522e4b9be477a0ed0000000000000000000000004ca58d8c7635e1f555aaa1bc522e4b9be477a0ed00000000000000000000000000000000000000000000000001aa535d3d0c000000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -10551,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec3400000000000000000000000064e6d480acc5944c90e4c7d04f56f8099f6d317300000000000000000000000064e6d480acc5944c90e4c7d04f56f8099f6d3173000000000000000000000000000000000000000000000000015a31782aad37be00000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -10554,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec34000000000000000000000000b7d865c7c63d758db991b191e9c80c3867b34b8e000000000000000000000000b7d865c7c63d758db991b191e9c80c3867b34b8e0000000000000000000000000000000000000000000000000033c4d66561629d00000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -10555,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec3400000000000000000000000085ae5cade318b59742c490fc07490e298a4e6d8400000000000000000000000085ae5cade318b59742c490fc07490e298a4e6d84000000000000000000000000000000000000000000000000001a8e16e89354b100000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -10556,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec34000000000000000000000000b1a3fdae3c2f48f3b943cc2c1234e4b3d77a1d6e000000000000000000000000b1a3fdae3c2f48f3b943cc2c1234e4b3d77a1d6e00000000000000000000000000000000000000000000000000857179ebcc3c4900000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -10557,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec340000000000000000000000007ea9b8ba0d889ba42458f657ed27244ad593dfe70000000000000000000000007ea9b8ba0d889ba42458f657ed27244ad593dfe7000000000000000000000000000000000000000000000000004fb3de9058e0db00000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -10558,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec34000000000000000000000000748bef7395e2559d83374e820e598213dd547773000000000000000000000000748bef7395e2559d83374e820e598213dd5477730000000000000000000000000000000000000000000000000066819177a2487d00000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -10560,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec34000000000000000000000000fddbc85a20014ee4e6cad2fcd1b925ae6cd5f61b000000000000000000000000fddbc85a20014ee4e6cad2fcd1b925ae6cd5f61b00000000000000000000000000000000000000000000000000c6f3b40b6c000000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -10564,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec34000000000000000000000000bce09efa4d3297e63f4deb685c2cf73af0019617000000000000000000000000bce09efa4d3297e63f4deb685c2cf73af00196170000000000000000000000000000000000000000000000000000dde123eb400000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -10566,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec3400000000000000000000000057aa3edb78fea6a5adb99e285597d7a8edcc41f400000000000000000000000057aa3edb78fea6a5adb99e285597d7a8edcc41f4000000000000000000000000000000000000000000000000005f264b590d273c00000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -10568,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec34000000000000000000000000854d7b23d48377b2e658685909668b7683f5d983000000000000000000000000854d7b23d48377b2e658685909668b7683f5d983000000000000000000000000000000000000000000000000000aa87bee53800000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -10571,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec340000000000000000000000006ec6295bf707b896efe73fb9f9a8aca0855c22460000000000000000000000006ec6295bf707b896efe73fb9f9a8aca0855c22460000000000000000000000000000000000000000000000000070413f59fa067900000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -10572,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec34000000000000000000000000d70804c92a0660bc8e6420e6755f87cb96f5bd4e000000000000000000000000d70804c92a0660bc8e6420e6755f87cb96f5bd4e000000000000000000000000000000000000000000000000004214e94911e3b800000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -10591,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec34000000000000000000000000e8c907430e1ed83797e0a8bf1eda14a8087cac92000000000000000000000000e8c907430e1ed83797e0a8bf1eda14a8087cac92000000000000000000000000000000000000000000000000005905de0ba3703700000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -10593,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec34000000000000000000000000f973582d2966d752285caacd17e153b393914357000000000000000000000000f973582d2966d752285caacd17e153b39391435700000000000000000000000000000000000000000000000000bc4b381d18800000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -10596,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec34000000000000000000000000ad5fddadf2507c54115b1d7fca7d1e5885edfaaa000000000000000000000000ad5fddadf2507c54115b1d7fca7d1e5885edfaaa000000000000000000000000000000000000000000000000001f2a397460490000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -10597,0xcd9d4988c0ae61887b075ba77f08cbfad2b65068,0x3f87ff1de58128ef8fcb4c807efd776e1ac72e51,0xf4f7b41a000000000000000000000000d880ec117a107eec557ebb84dfa7e88a69a2377a0000000000000000000000000000000000000000000000391207eb67e7b78540,,,1,true -10599,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec34000000000000000000000000f436f60887a30a44a1bf4c935dda240121eedaf1000000000000000000000000f436f60887a30a44a1bf4c935dda240121eedaf1000000000000000000000000000000000000000000000000000e8b90a4e56e0000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -10600,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec34000000000000000000000000c805ef4eef0b47a7084530603fb41225e24da42f000000000000000000000000c805ef4eef0b47a7084530603fb41225e24da42f000000000000000000000000000000000000000000000000000f1c277a4f9d0000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -10601,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec34000000000000000000000000af8ffe93bc58efe850fee556ccca7698927a2112000000000000000000000000af8ffe93bc58efe850fee556ccca7698927a2112000000000000000000000000000000000000000000000000007b43635b4d0f9800000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -10602,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec3400000000000000000000000052bbcd3ebfd6183852ee91b39efd5a07caa0d50000000000000000000000000052bbcd3ebfd6183852ee91b39efd5a07caa0d50000000000000000000000000000000000000000000000000000772a204ba62fee00000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -10604,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec340000000000000000000000003317b15136eaa9e17ffadad0aa911fb8ec37e7690000000000000000000000003317b15136eaa9e17ffadad0aa911fb8ec37e769000000000000000000000000000000000000000000000000004281813a5a123700000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -10605,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec34000000000000000000000000788600fac3c4e2f72ce0961827442b310b5f4f62000000000000000000000000788600fac3c4e2f72ce0961827442b310b5f4f62000000000000000000000000000000000000000000000000002d5d5dc048abd500000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -10608,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec340000000000000000000000006fb57707d462679fd44a22a5afeb965f201fefd50000000000000000000000006fb57707d462679fd44a22a5afeb965f201fefd50000000000000000000000000000000000000000000000000001c6bf5263400000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -10609,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec34000000000000000000000000a19c369eeae40e88c75cea6583c57962f88f061c000000000000000000000000a19c369eeae40e88c75cea6583c57962f88f061c0000000000000000000000000000000000000000000000000002d79883d2000000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -10610,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec340000000000000000000000007209533bac94838146af34bdc4d97af96e6a42ca0000000000000000000000007209533bac94838146af34bdc4d97af96e6a42ca0000000000000000000000000000000000000000000000000000b5e620f4800000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -10611,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec340000000000000000000000002b1fe2cbc08935d3bc4f4e0f3bcc61296312e5d70000000000000000000000002b1fe2cbc08935d3bc4f4e0f3bcc61296312e5d70000000000000000000000000000000000000000000000000007d0e36a81800000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -10612,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec3400000000000000000000000017549fed7c40297742e14ae86d75e99627c9686100000000000000000000000017549fed7c40297742e14ae86d75e99627c96861000000000000000000000000000000000000000000000000000e35fa931a000000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -10613,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec34000000000000000000000000f21050d9e3f52eafee77eeccf753d20a0bcbc5ff000000000000000000000000f21050d9e3f52eafee77eeccf753d20a0bcbc5ff0000000000000000000000000000000000000000000000000000b5e620f4800000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -10614,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec34000000000000000000000000ae61eefc847e057d08dce23f7a1f7dddbf2f3783000000000000000000000000ae61eefc847e057d08dce23f7a1f7dddbf2f378300000000000000000000000000000000000000000000000000005af3107a400000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -10616,0xcd9d4988c0ae61887b075ba77f08cbfad2b65068,0x3f87ff1de58128ef8fcb4c807efd776e1ac72e51,0xf4f7b41a000000000000000000000000d15472d58e1bf8fbfa4a9f87c5f3d4108d965b8f000000000000000000000000000000000000000000000017c1f1c18e6c8bc583,0x8553b02a7a241a02994414581bf56cf2dd1b762f5bab83bcd5897412a774edd5,2022-01-29 10:20:17.000 UTC,0,true -10617,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec34000000000000000000000000ea3088c92ccf0874c6a13062745fc6b1552a1a87000000000000000000000000ea3088c92ccf0874c6a13062745fc6b1552a1a87000000000000000000000000000000000000000000000000000245d5b034760000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -10618,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec3400000000000000000000000094d14ebb36a69f621e458f4b06dbdd8c317097f300000000000000000000000094d14ebb36a69f621e458f4b06dbdd8c317097f3000000000000000000000000000000000000000000000000000009184e72a00000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -10619,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec34000000000000000000000000206884cad656298f3cb333b4a9afaadd085381e8000000000000000000000000206884cad656298f3cb333b4a9afaadd085381e800000000000000000000000000000000000000000000000000169f974d37920000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -10620,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec340000000000000000000000005a01760f3a473ef7d917fe48a39a99e648089d2b0000000000000000000000005a01760f3a473ef7d917fe48a39a99e648089d2b00000000000000000000000000000000000000000000000000ab85862f797f1200000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -10621,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec340000000000000000000000009ccd71558efe1fcf62ae92c033fb710b626036e00000000000000000000000009ccd71558efe1fcf62ae92c033fb710b626036e000000000000000000000000000000000000000000000000000aae0bbc225b5b000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,0xc057389c91718fc4052ad5102e8aad21e33151a234933c7e20259c0218698fe9,2021-12-12 08:54:48.000 UTC,0,true -10622,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec340000000000000000000000008469ad2042364ad39d0318849c6865e435c527230000000000000000000000008469ad2042364ad39d0318849c6865e435c52723000000000000000000000000000000000000000000000000004bd5997de745b400000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -10623,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec3400000000000000000000000039626030e577b306a931772d553bbbfc941295bc00000000000000000000000039626030e577b306a931772d553bbbfc941295bc00000000000000000000000000000000000000000000000000228f9def75ef9f00000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -10626,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec34000000000000000000000000a5cee6dd64166899a5fd92d9f2bb6a6c407f3ffb000000000000000000000000a5cee6dd64166899a5fd92d9f2bb6a6c407f3ffb000000000000000000000000000000000000000000000000003707e3732583a200000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -10627,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec34000000000000000000000000c9fef11e493a712dc9b3b9f9d970bee8a763f177000000000000000000000000c9fef11e493a712dc9b3b9f9d970bee8a763f177000000000000000000000000000000000000000000000000003fae3c9139be3000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -10628,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec34000000000000000000000000f31241fdd27965db448393e80bc8a6cc107c1e70000000000000000000000000f31241fdd27965db448393e80bc8a6cc107c1e700000000000000000000000000000000000000000000000000041a8308b94c50e00000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -10629,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec340000000000000000000000000fafd58b0f488a6df3d583ee684ca2b77049b0c90000000000000000000000000fafd58b0f488a6df3d583ee684ca2b77049b0c9000000000000000000000000000000000000000000000000003742d4b208a5c900000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -10630,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec34000000000000000000000000b709fba2035eb9941afc53f21acf2c4f78cda8b0000000000000000000000000b709fba2035eb9941afc53f21acf2c4f78cda8b000000000000000000000000000000000000000000000000000ad55b9cef52f0500000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -10631,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec3400000000000000000000000072dc02b8168f36d2d51fd40a6b8a553eeb638a8500000000000000000000000072dc02b8168f36d2d51fd40a6b8a553eeb638a8500000000000000000000000000000000000000000000000000290f90fd5169ef00000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -10633,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec340000000000000000000000002a26429316a286f629c2833db44f780f3092ee480000000000000000000000002a26429316a286f629c2833db44f780f3092ee480000000000000000000000000000000000000000000000000041084dff6409c900000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -10634,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec340000000000000000000000004f8fc4816bbb2c992a149cdacd05f7839663e6ff0000000000000000000000004f8fc4816bbb2c992a149cdacd05f7839663e6ff00000000000000000000000000000000000000000000000001f9e80ba804000000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -10635,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec34000000000000000000000000e0ae3197635e6f4106515050800feecb61de79b0000000000000000000000000e0ae3197635e6f4106515050800feecb61de79b0000000000000000000000000000000000000000000000000003ff6627eec8ac100000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -10636,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec3400000000000000000000000064e143009e01fc9887779a80256e2b65771e8a1c00000000000000000000000064e143009e01fc9887779a80256e2b65771e8a1c000000000000000000000000000000000000000000000000001bb934ea07b7c000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -10637,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec340000000000000000000000009bab8a8719351ea0ae583e2c80e869d9926f27830000000000000000000000009bab8a8719351ea0ae583e2c80e869d9926f27830000000000000000000000000000000000000000000000000030071d0b858f8900000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -10638,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec34000000000000000000000000215836ae9dbe97fba1f18bf6ff6a2ebf0f6a98d2000000000000000000000000215836ae9dbe97fba1f18bf6ff6a2ebf0f6a98d20000000000000000000000000000000000000000000000000011c2f60abd428000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -10639,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec340000000000000000000000002f170020148f41ba8e0e00b43cf6a807090c9f970000000000000000000000002f170020148f41ba8e0e00b43cf6a807090c9f9700000000000000000000000000000000000000000000000000071afd498d000000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -10640,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec34000000000000000000000000512298d291dc51246db4c7a8fd4079b3e384524d000000000000000000000000512298d291dc51246db4c7a8fd4079b3e384524d00000000000000000000000000000000000000000000000000ab9eeb8fd3645500000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,0xfdf38331b64e54a4ccb4ec7172e6feda3d894b43cda27ef7b2467c4e323dc7b6,2021-12-12 08:58:00.000 UTC,0,true -10641,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec3400000000000000000000000006f8fb853d9aec922fc467cb09837042a858760100000000000000000000000006f8fb853d9aec922fc467cb09837042a858760100000000000000000000000000000000000000000000000000ba8c309f6f5f4100000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -10642,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec3400000000000000000000000052d0fc1cab209eebbff485b93fe7d8d88f6c0d2900000000000000000000000052d0fc1cab209eebbff485b93fe7d8d88f6c0d290000000000000000000000000000000000000000000000000853a0d2313c000000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,0x97349f6f704e26d991eb01e711fefbf20e7e225c05a75bb89882b9f2aead1acf,2021-12-13 00:54:06.000 UTC,0,true -10643,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec340000000000000000000000002a77d40ab6ccfb109291ac584087cee05438b8830000000000000000000000002a77d40ab6ccfb109291ac584087cee05438b883000000000000000000000000000000000000000000000000001172465f55c65800000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -10645,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec34000000000000000000000000c2039de34d52fcbc6f7ffcb30c16048af919aaf7000000000000000000000000c2039de34d52fcbc6f7ffcb30c16048af919aaf700000000000000000000000000000000000000000000000000714006c9390b5400000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -10650,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec340000000000000000000000004d03aea34ffefd6af6cc154b3f03501ae083fb920000000000000000000000004d03aea34ffefd6af6cc154b3f03501ae083fb92000000000000000000000000000000000000000000000000136dcc951d8c000000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -10651,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec34000000000000000000000000c8289523abfa9e2fecc53a73d041adcbb3bea5ab000000000000000000000000c8289523abfa9e2fecc53a73d041adcbb3bea5ab000000000000000000000000000000000000000000000000015a6ebb4c170d7800000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -10655,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec34000000000000000000000000a92959842ceecd4a49a36de06d7fde1050c65fb5000000000000000000000000a92959842ceecd4a49a36de06d7fde1050c65fb500000000000000000000000000000000000000000000000000407858abf690c000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -10658,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec34000000000000000000000000283c3524dca01f348303988d98613e5ad61e6d65000000000000000000000000283c3524dca01f348303988d98613e5ad61e6d6500000000000000000000000000000000000000000000000000038d7ea4c6800000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -10659,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec340000000000000000000000003a2235e33e7ed5e95a508ba2ca6947aa85af4f620000000000000000000000003a2235e33e7ed5e95a508ba2ca6947aa85af4f62000000000000000000000000000000000000000000000000000894d492e2cd0000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -10660,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec34000000000000000000000000505a194a0c4dbb3915f60aa7f949720800738fb1000000000000000000000000505a194a0c4dbb3915f60aa7f949720800738fb100000000000000000000000000000000000000000000000000080bb781b9234000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -10661,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec3400000000000000000000000073965314f82945b88132330de1dcad4c89c943de00000000000000000000000073965314f82945b88132330de1dcad4c89c943de0000000000000000000000000000000000000000000000000007f36eedb52b4000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -10662,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec34000000000000000000000000bb527a976b904307d62d8230b91bf54d219e029a000000000000000000000000bb527a976b904307d62d8230b91bf54d219e029a0000000000000000000000000000000000000000000000000007a6ed36fd3b4000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -10663,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec340000000000000000000000006663d8b52d878cdc92e8c63e61f4d8c6d13314d70000000000000000000000006663d8b52d878cdc92e8c63e61f4d8c6d13314d7000000000000000000000000000000000000000000000000009faeaa0ae971c200000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -10664,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec340000000000000000000000007da0047f7801d88cd6d3731c75621a2d03eaf4410000000000000000000000007da0047f7801d88cd6d3731c75621a2d03eaf4410000000000000000000000000000000000000000000000000007fabee30d3b4000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -10665,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec34000000000000000000000000d88d6c3e5721099a64674a347f145f6859b671f6000000000000000000000000d88d6c3e5721099a64674a347f145f6859b671f600000000000000000000000000000000000000000000000000080eb99815f64000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -10666,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec34000000000000000000000000ead2cf05f3e772d3345b1daa24bca46b9f809a52000000000000000000000000ead2cf05f3e772d3345b1daa24bca46b9f809a520000000000000000000000000000000000000000000000000007ff2c30a8fe4000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -10667,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec34000000000000000000000000513644f432e4ce7fb8578617af90cc072ae1f80b000000000000000000000000513644f432e4ce7fb8578617af90cc072ae1f80b0000000000000000000000000000000000000000000000000007ece44b4cd64000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -10668,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec34000000000000000000000000803aade81954d851c1d72ae5b7204bfa505031b5000000000000000000000000803aade81954d851c1d72ae5b7204bfa505031b500000000000000000000000000000000000000000000000000094bb191baa7e000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -10669,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec3400000000000000000000000026583cf3a90d69277c8c9d46c0fe3734ec7f5d5c00000000000000000000000026583cf3a90d69277c8c9d46c0fe3734ec7f5d5c0000000000000000000000000000000000000000000000000008650de0f7c64000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -10670,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec34000000000000000000000000c9521819a9de0ba71e802a02304dc3c557af2549000000000000000000000000c9521819a9de0ba71e802a02304dc3c557af2549000000000000000000000000000000000000000000000000004b510eade99eba00000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -10671,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec34000000000000000000000000ba8c244aeb70d524ecac46fe2f48d80cb66abc6b000000000000000000000000ba8c244aeb70d524ecac46fe2f48d80cb66abc6b0000000000000000000000000000000000000000000000000008a3ece10cb14000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -10672,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec3400000000000000000000000053834efefba6623225ea7b58fa764e76dfe8912c00000000000000000000000053834efefba6623225ea7b58fa764e76dfe8912c0000000000000000000000000000000000000000000000000003f4c999daf74000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -10673,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec340000000000000000000000006a81742216906c904e9b94ab9872e50993eae4fe0000000000000000000000006a81742216906c904e9b94ab9872e50993eae4fe00000000000000000000000000000000000000000000000000ab76f2164a1f9500000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,0x551d730adbbb91e5661cf74b5d20a3f2d894bd1157c05c6a9e1f92b575c6342a,2021-12-12 08:46:54.000 UTC,0,true -10674,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec34000000000000000000000000bb1bcb22ea8a88dcb63a4f7e5a00afe6e859f709000000000000000000000000bb1bcb22ea8a88dcb63a4f7e5a00afe6e859f7090000000000000000000000000000000000000000000000000022c466a2035d0000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -10677,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec34000000000000000000000000dc8afb40b6f6897b66830a763c2c589dcc97136a000000000000000000000000dc8afb40b6f6897b66830a763c2c589dcc97136a000000000000000000000000000000000000000000000000009fd989cee184d900000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -10678,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec340000000000000000000000007e993a1f4b615138114825e4055ad9212d5d08680000000000000000000000007e993a1f4b615138114825e4055ad9212d5d086800000000000000000000000000000000000000000000000001bf192137f5338600000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,0x5d08bf1a4071bbee69ee3f6bc5ec69724ecbba985c40a257533958e5e0b94b32,2022-03-06 15:01:30.000 UTC,0,true -10679,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0xa9f9e6750000000000000000000000001f9840a85d5af5bf1d1762f925bdaddc4201f9840000000000000000000000006fd9d7ad17242c41f7131d257212c54a0e8166910000000000000000000000000fdf96094afc4c1f87b24d793af0ba987c1ab6540000000000000000000000000fdf96094afc4c1f87b24d793af0ba987c1ab654000000000000000000000000000000000000000000000003955a98b826e4a42700000000000000000000000000000000000000000000000000000000000000c00000000000000000000000000000000000000000000000000000000000000000,,,1,true -10680,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec34000000000000000000000000f6be3816ca29e641bd532aa089672a0d306e3012000000000000000000000000f6be3816ca29e641bd532aa089672a0d306e301200000000000000000000000000000000000000000000000000038d7ea4c6800000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -10681,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec34000000000000000000000000d777ad175dd8aba028101fda9c9ed322e34b221e000000000000000000000000d777ad175dd8aba028101fda9c9ed322e34b221e000000000000000000000000000000000000000000000000005529d1d9744b4800000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -10683,0xcd9d4988c0ae61887b075ba77f08cbfad2b65068,0x3f87ff1de58128ef8fcb4c807efd776e1ac72e51,0xf4f7b41a000000000000000000000000c84bc2a90de4e0b95fc40a464f364401e13e53800000000000000000000000000000000000000000000000000dc4afd08074d154,,,1,true -10684,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec340000000000000000000000006120719070c7f83592c166a056d2c728fb063e4d0000000000000000000000006120719070c7f83592c166a056d2c728fb063e4d0000000000000000000000000000000000000000000000000021dc72f557b50000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -10686,0xcd9d4988c0ae61887b075ba77f08cbfad2b65068,0x3f87ff1de58128ef8fcb4c807efd776e1ac72e51,0xf4f7b41a000000000000000000000000d84c2fdf2f8733a5bbea65eec0bb211947792871000000000000000000000000000000000000000000000003db19d6b436d44c3a,,,1,true -10688,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec340000000000000000000000003fa0f53fc06dc5d7df77505dea6e96cdd6e99b050000000000000000000000003fa0f53fc06dc5d7df77505dea6e96cdd6e99b0500000000000000000000000000000000000000000000000001253464d17cd85400000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -10690,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec34000000000000000000000000c9e197deb88d82e2d45f29c396dbfd94bc8212ea000000000000000000000000c9e197deb88d82e2d45f29c396dbfd94bc8212ea00000000000000000000000000000000000000000000000000830668df772eb000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,0x70ec5aeaee850328fb932907675776614c2705cc3d362db8858a9ce890948f40,2022-05-14 21:04:54.000 UTC,0,true -10691,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec34000000000000000000000000f436f60887a30a44a1bf4c935dda240121eedaf1000000000000000000000000f436f60887a30a44a1bf4c935dda240121eedaf100000000000000000000000000000000000000000000000000004242a72cb60000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -10692,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec3400000000000000000000000031bae26218f30dbbb1db787233fa71fa7d1b8cc000000000000000000000000031bae26218f30dbbb1db787233fa71fa7d1b8cc0000000000000000000000000000000000000000000000000000fe6a29060990000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -10693,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec34000000000000000000000000988b5a5e972fbedcba97968f927ed31054715a81000000000000000000000000988b5a5e972fbedcba97968f927ed31054715a81000000000000000000000000000000000000000000000000001007a2d2e9bb0000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -10694,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec340000000000000000000000006503558d76d2672b2870883fdf96d45f698c2e000000000000000000000000006503558d76d2672b2870883fdf96d45f698c2e00000000000000000000000000000000000000000000000000000f96edde52220000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -10695,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec34000000000000000000000000f5b241d83c7244861d642e519bc47fd84b4518cd000000000000000000000000f5b241d83c7244861d642e519bc47fd84b4518cd0000000000000000000000000000000000000000000000000010083203c5010000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -10696,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec34000000000000000000000000548c25259f8652eb25379c6affbcb5b8091d67f1000000000000000000000000548c25259f8652eb25379c6affbcb5b8091d67f10000000000000000000000000000000000000000000000000010083203c5010000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -10697,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec34000000000000000000000000113b448a88727d28cf4f54f27c9c0acab1990f45000000000000000000000000113b448a88727d28cf4f54f27c9c0acab1990f45000000000000000000000000000000000000000000000000000fb403cadc5a0000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -10698,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec340000000000000000000000007f8afd5b1a75877af89bcd6e0800ae109078576a0000000000000000000000007f8afd5b1a75877af89bcd6e0800ae109078576a000000000000000000000000000000000000000000000000000fb403cadc5a0000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -10699,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec340000000000000000000000005e18f002cfeed23e630ca25007905db0197649420000000000000000000000005e18f002cfeed23e630ca25007905db019764942000000000000000000000000000000000000000000000000000fc0999622010000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -10700,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec340000000000000000000000004a969330b6ce9393a8227153e3f7fe7b90314c9d0000000000000000000000004a969330b6ce9393a8227153e3f7fe7b90314c9d000000000000000000000000000000000000000000000000000f823bcea1040000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -10701,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec3400000000000000000000000017bce7876ea7a11ee9ebd5c00eff32adb4ccb70800000000000000000000000017bce7876ea7a11ee9ebd5c00eff32adb4ccb7080000000000000000000000000000000000000000000000000001c6bf5263400000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -10703,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec34000000000000000000000000a83e84a9d7073b7f219fb397cc7d512342def56f000000000000000000000000a83e84a9d7073b7f219fb397cc7d512342def56f0000000000000000000000000000000000000000000000000001c6bf5263400000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -10704,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec34000000000000000000000000fa26023bbc43247722e21af76a5c5821a63ae712000000000000000000000000fa26023bbc43247722e21af76a5c5821a63ae7120000000000000000000000000000000000000000000000000001c6bf5263400000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -10706,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec3400000000000000000000000007812ab25fd042bc7cd1b6cc2a51554c3b6ce28b00000000000000000000000007812ab25fd042bc7cd1b6cc2a51554c3b6ce28b0000000000000000000000000000000000000000000000000001c6bf5263400000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -10707,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec34000000000000000000000000faf8a58c781476f9a7be7bc9399c39d22243b2f8000000000000000000000000faf8a58c781476f9a7be7bc9399c39d22243b2f80000000000000000000000000000000000000000000000000001c6bf5263400000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -10708,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec340000000000000000000000006adb60a1683997c914eca540916d44ece685675c0000000000000000000000006adb60a1683997c914eca540916d44ece685675c0000000000000000000000000000000000000000000000000001c6bf5263400000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -10709,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec340000000000000000000000008f967d75fd0e579b7cc68568e47663894206d7ef0000000000000000000000008f967d75fd0e579b7cc68568e47663894206d7ef0000000000000000000000000000000000000000000000000001c6bf5263400000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -10712,0xcd9d4988c0ae61887b075ba77f08cbfad2b65068,0x3f87ff1de58128ef8fcb4c807efd776e1ac72e51,0xf4f7b41a000000000000000000000000a3cb5b568529b27e93ae726c7d8aef18cd55162100000000000000000000000000000000000000000000000019d72bb383476094,,,1,true -10713,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec3400000000000000000000000030548feb73b495391e409866e84cceb5adee973000000000000000000000000030548feb73b495391e409866e84cceb5adee9730000000000000000000000000000000000000000000000000001efc410027c5c000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -10714,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec340000000000000000000000009ead5e6e90440e69b5f28fef5942a5b273387c130000000000000000000000009ead5e6e90440e69b5f28fef5942a5b273387c13000000000000000000000000000000000000000000000000015ad327aec96a5a00000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -10716,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec34000000000000000000000000d45b2e4bad581fe6b43cc6d6532487d8986c6d38000000000000000000000000d45b2e4bad581fe6b43cc6d6532487d8986c6d380000000000000000000000000000000000000000000000000044886a2dc3280000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -10717,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec34000000000000000000000000165e4b9ab6cdf7d6920c8594e5ef63cd62255ca7000000000000000000000000165e4b9ab6cdf7d6920c8594e5ef63cd62255ca70000000000000000000000000000000000000000000000000068b4ed1b0d180000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -10719,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec34000000000000000000000000d9f059459e64d3c1d11fa73381f75f297359de40000000000000000000000000d9f059459e64d3c1d11fa73381f75f297359de40000000000000000000000000000000000000000000000000009ce63668caa2ad00000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -10720,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec34000000000000000000000000b47fee8ff0436deadbf0cb5d65275165967e2c43000000000000000000000000b47fee8ff0436deadbf0cb5d65275165967e2c4300000000000000000000000000000000000000000000000000a90b94052cc6fb00000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -10721,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec34000000000000000000000000d6304410e1e130f092c6a37c7e10811788e6e10d000000000000000000000000d6304410e1e130f092c6a37c7e10811788e6e10d000000000000000000000000000000000000000000000000005250b6b89f6e8000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -10725,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec340000000000000000000000005a1851237ebd4883376d6bd603eca2d169b6f2b20000000000000000000000005a1851237ebd4883376d6bd603eca2d169b6f2b200000000000000000000000000000000000000000000000000337d0ec07ce08f00000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -10727,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec3400000000000000000000000071d8e8b2a0098869d60793a2af743e414da22b4600000000000000000000000071d8e8b2a0098869d60793a2af743e414da22b4600000000000000000000000000000000000000000000000000acfb4c0a1d200000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -10731,0xcd9d4988c0ae61887b075ba77f08cbfad2b65068,0x3f87ff1de58128ef8fcb4c807efd776e1ac72e51,0xf4f7b41a000000000000000000000000c05bc25eaa52a23476e113b9a139a66e7473b3640000000000000000000000000000000000000000000000011d947904d826cfc0,,,1,true -10732,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec34000000000000000000000000cb61edc2007b476e44be5bbe81486247425e5f8b000000000000000000000000cb61edc2007b476e44be5bbe81486247425e5f8b0000000000000000000000000000000000000000000000000025c548655c4e3300000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -10735,0xcd9d4988c0ae61887b075ba77f08cbfad2b65068,0x3f87ff1de58128ef8fcb4c807efd776e1ac72e51,0xf4f7b41a000000000000000000000000b91b076e014a9b127fe2e5084786c27ecaff8409000000000000000000000000000000000000000000000003777cdc3d984bd92b,0x4a6eaf3e6b9e91a4ad73e1c4b52674062fe57653d5202f2d8a86e77b146e3b3c,2022-03-21 06:12:35.000 UTC,0,true -10736,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec3400000000000000000000000092765c4301ae115861a79cc015603bc8ce6510c900000000000000000000000092765c4301ae115861a79cc015603bc8ce6510c90000000000000000000000000000000000000000000000000051ba90f3bec35c00000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -10738,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec340000000000000000000000005d682c7a14f0821c7bf1bd0349210167d394034c0000000000000000000000005d682c7a14f0821c7bf1bd0349210167d394034c00000000000000000000000000000000000000000000000002bc56b04fbe5d0600000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -10739,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec3400000000000000000000000009923338e76f7e853d93a3a5a4924f046ec7550e00000000000000000000000009923338e76f7e853d93a3a5a4924f046ec7550e0000000000000000000000000000000000000000000000000402bbf80416800000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -10740,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec3400000000000000000000000060606e92777b6097a2c4d19c79433837f725c5bb00000000000000000000000060606e92777b6097a2c4d19c79433837f725c5bb00000000000000000000000000000000000000000000000000217421dd99360000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -10760,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec340000000000000000000000001d6b74d149c2ed9a43125891308fea3a223694d80000000000000000000000001d6b74d149c2ed9a43125891308fea3a223694d800000000000000000000000000000000000000000000000000d2b6a9390b2e0000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -10763,0x10e6593cdda8c58a1d0f14c5164b376352a55f2f,0x467194771dae2967aef3ecbedd3bf9a310c76c65,0xa9f9e6750000000000000000000000006b175474e89094c44da98b954eedeac495271d0f000000000000000000000000da10009cbd5d07dd0cecc66161fc93d7c9000da100000000000000000000000042ba2a84c1440290d9d66bea78248db81c160a6400000000000000000000000042ba2a84c1440290d9d66bea78248db81c160a6400000000000000000000000000000000000000000000000a687c606904d4433a00000000000000000000000000000000000000000000000000000000000000c00000000000000000000000000000000000000000000000000000000000000000,,,1,true -10766,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec3400000000000000000000000042103c5793d4998c8da3203e541c7692c0bcb81700000000000000000000000042103c5793d4998c8da3203e541c7692c0bcb81700000000000000000000000000000000000000000000000001510e804f39ea9400000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -10767,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0xa9f9e675000000000000000000000000a0b86991c6218b36c1d19d4a2e9eb0ce3606eb480000000000000000000000007f5c764cbc14f9669b88837ca1490cca17c31607000000000000000000000000834344cfa5956899997fb1a70fd17f7f87572f8d000000000000000000000000834344cfa5956899997fb1a70fd17f7f87572f8d00000000000000000000000000000000000000000000000000000000007a120000000000000000000000000000000000000000000000000000000000000000c00000000000000000000000000000000000000000000000000000000000000000,,,1,true -10768,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec340000000000000000000000004a2c3596d664f5a0e59580c2bd3000fc9a7d5bb20000000000000000000000004a2c3596d664f5a0e59580c2bd3000fc9a7d5bb200000000000000000000000000000000000000000000000000470de4df82000000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -10769,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec3400000000000000000000000093b514be39415f6c746f57de8d7d50d686d7ae3600000000000000000000000093b514be39415f6c746f57de8d7d50d686d7ae360000000000000000000000000000000000000000000000000083af25b864b23900000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -10772,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec3400000000000000000000000007c6b4a3202e1ed3f6fe94c78b12ba261968aaa400000000000000000000000007c6b4a3202e1ed3f6fe94c78b12ba261968aaa400000000000000000000000000000000000000000000000001382a0c1448958000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -10773,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec34000000000000000000000000bfe0b47d3155d85318aecdef21caa8adf80e88dc000000000000000000000000bfe0b47d3155d85318aecdef21caa8adf80e88dc000000000000000000000000000000000000000000000000009a11c329b8931e00000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,0x7fd65b2c3b9a8224ce2af42f646f251d77a0bc186983fe566dcd91a7c8388a07,2022-06-21 09:55:57.000 UTC,0,true -10774,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec34000000000000000000000000384fd7b2211b37fbf8506b3e9b29de1c98b5bef1000000000000000000000000384fd7b2211b37fbf8506b3e9b29de1c98b5bef1000000000000000000000000000000000000000000000000007c58508723800000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,0x2b8015779ee7294e31f6570302c6ce794eb41c32705867ac5e828ac5e4158e07,2022-06-07 12:49:08.000 UTC,0,true -10776,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec34000000000000000000000000a0628df86fee0fdb325b813c9c3dd8f0ec67e002000000000000000000000000a0628df86fee0fdb325b813c9c3dd8f0ec67e002000000000000000000000000000000000000000000000000000bab94d478990000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -10777,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec34000000000000000000000000f0a4cd57ac7e75b92d8b23881e99d73b24946bd4000000000000000000000000f0a4cd57ac7e75b92d8b23881e99d73b24946bd4000000000000000000000000000000000000000000000000000009184e72a00000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -10779,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec340000000000000000000000000d3b8744600da2e200d2a46f676fd5a29b7bd1bc0000000000000000000000000d3b8744600da2e200d2a46f676fd5a29b7bd1bc00000000000000000000000000000000000000000000000000b4133a718b653200000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -10780,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec340000000000000000000000001053f4b74a78342ed5708dc96482f37bcab5a8b20000000000000000000000001053f4b74a78342ed5708dc96482f37bcab5a8b200000000000000000000000000000000000000000000000001d4341ca057d33600000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -10783,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec34000000000000000000000000f8a371dc3b89bbb3653992c5b3bafaed1b13c466000000000000000000000000f8a371dc3b89bbb3653992c5b3bafaed1b13c466000000000000000000000000000000000000000000000000001550f7dca7000000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -10787,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec34000000000000000000000000ff902bfb0618b5c0b423a09d7aacf41cf86e4937000000000000000000000000ff902bfb0618b5c0b423a09d7aacf41cf86e4937000000000000000000000000000000000000000000000000001aa73708721f5800000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -10788,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec340000000000000000000000009d0b9e7b1054efcbb7dd090ac10c07046f5811260000000000000000000000009d0b9e7b1054efcbb7dd090ac10c07046f58112600000000000000000000000000000000000000000000000000038d7ea4c6800000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -10789,0xcd9d4988c0ae61887b075ba77f08cbfad2b65068,0x3f87ff1de58128ef8fcb4c807efd776e1ac72e51,0xf4f7b41a00000000000000000000000088fa395aa8a7b57cff6572fd37b585e1e8ce3dac000000000000000000000000000000000000000000000000136e0e69f5d8d787,,,1,true -10790,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec34000000000000000000000000a5d779284f4a319621ec7ff1ca88479a6c1308e7000000000000000000000000a5d779284f4a319621ec7ff1ca88479a6c1308e700000000000000000000000000000000000000000000000001edd63133246eca00000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -10791,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec34000000000000000000000000bf6a2f8247c439ec0b3c61b2546cb05e49c41644000000000000000000000000bf6a2f8247c439ec0b3c61b2546cb05e49c416440000000000000000000000000000000000000000000000000021608e2f9ea40000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -10793,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec34000000000000000000000000b3e5497d22d80be71d34a3eaf191426d0b2bb4ba000000000000000000000000b3e5497d22d80be71d34a3eaf191426d0b2bb4ba000000000000000000000000000000000000000000000000013c31074902800000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -10794,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec3400000000000000000000000019edc3bead34b13da9a742127b9fa060fc1169db00000000000000000000000019edc3bead34b13da9a742127b9fa060fc1169db0000000000000000000000000000000000000000000000000021c5cbbaa7220000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -10796,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec340000000000000000000000007286e7d3afa7c56f52e28263e0df68cc016776ad0000000000000000000000007286e7d3afa7c56f52e28263e0df68cc016776ad00000000000000000000000000000000000000000000000000218f8a37919c0000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -10797,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec3400000000000000000000000076d010682c309037ffc0af9c24b0f3daeb61cb4c00000000000000000000000076d010682c309037ffc0af9c24b0f3daeb61cb4c000000000000000000000000000000000000000000000000002152033959880000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -10799,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec34000000000000000000000000192227fa32d81c101ad5f1da4f0219cd967f3e18000000000000000000000000192227fa32d81c101ad5f1da4f0219cd967f3e180000000000000000000000000000000000000000000000000008f47a355a8f0000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -10800,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec34000000000000000000000000ee8b7d0d4bc1fbb8ed182b10ad174bf7d20ebfaa000000000000000000000000ee8b7d0d4bc1fbb8ed182b10ad174bf7d20ebfaa000000000000000000000000000000000000000000000000000d84873d0dbb4000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -10801,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec34000000000000000000000000b05cb4612f9886a6a604f4c1f416cecb772c3194000000000000000000000000b05cb4612f9886a6a604f4c1f416cecb772c31940000000000000000000000000000000000000000000000000008a09394df8b0000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -10803,0xcd9d4988c0ae61887b075ba77f08cbfad2b65068,0x3f87ff1de58128ef8fcb4c807efd776e1ac72e51,0xf4f7b41a000000000000000000000000ee8b7d0d4bc1fbb8ed182b10ad174bf7d20ebfaa0000000000000000000000000000000000000000000000003e33aa820173f8ae,,,1,true -10804,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec34000000000000000000000000935cb2f7e86d395d0692d39cf8be5ffb8fcd51fa000000000000000000000000935cb2f7e86d395d0692d39cf8be5ffb8fcd51fa000000000000000000000000000000000000000000000000006196007a15970100000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -10805,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0xa9f9e675000000000000000000000000dac17f958d2ee523a2206206994597c13d831ec700000000000000000000000094b008aa00579c1307b0ef2c499ad98a8ce58e5800000000000000000000000099a409fc717ec84acb7d48bff1fd9981190d46ab00000000000000000000000099a409fc717ec84acb7d48bff1fd9981190d46ab000000000000000000000000000000000000000000000000000000000078bdcd00000000000000000000000000000000000000000000000000000000000000c00000000000000000000000000000000000000000000000000000000000000000,,,1,true -10806,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec3400000000000000000000000052477254b96ceaa05613c078b3fde56a92d6255600000000000000000000000052477254b96ceaa05613c078b3fde56a92d6255600000000000000000000000000000000000000000000000000a4a39f0de54de600000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -10829,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec3400000000000000000000000001a8a09311d1d558f07f6d05d0e8bc6fd8fe8b8a00000000000000000000000001a8a09311d1d558f07f6d05d0e8bc6fd8fe8b8a000000000000000000000000000000000000000000000000004042e547153c4000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -10830,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec34000000000000000000000000e9ecb55ce5b1b38abdf767433f6b35fc89c2ceb0000000000000000000000000e9ecb55ce5b1b38abdf767433f6b35fc89c2ceb0000000000000000000000000000000000000000000000000001ff973cafa800000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -10831,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0xa9f9e675000000000000000000000000a0b86991c6218b36c1d19d4a2e9eb0ce3606eb480000000000000000000000007f5c764cbc14f9669b88837ca1490cca17c316070000000000000000000000004240268a3ad66fab234e124c31c9cecc8b457e820000000000000000000000004240268a3ad66fab234e124c31c9cecc8b457e82000000000000000000000000000000000000000000000000000000003d25ab3400000000000000000000000000000000000000000000000000000000000000c00000000000000000000000000000000000000000000000000000000000000000,,,1,true -10834,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec34000000000000000000000000336bdf7a8dc958ca317197b764a29eae90c14f7d000000000000000000000000336bdf7a8dc958ca317197b764a29eae90c14f7d00000000000000000000000000000000000000000000000000013e10ba23870000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -10835,0xcd9d4988c0ae61887b075ba77f08cbfad2b65068,0x3f87ff1de58128ef8fcb4c807efd776e1ac72e51,0xf4f7b41a000000000000000000000000bebe6acde175848b79606fa0de9b17ab2749d7d20000000000000000000000000000000000000000000000004abc49e16e331046,,,1,true -10838,0x10e6593cdda8c58a1d0f14c5164b376352a55f2f,0x467194771dae2967aef3ecbedd3bf9a310c76c65,0xa9f9e6750000000000000000000000006b175474e89094c44da98b954eedeac495271d0f000000000000000000000000da10009cbd5d07dd0cecc66161fc93d7c9000da1000000000000000000000000d5096b4d21abd25d0d3e0cf9e2ff7a840b202906000000000000000000000000d5096b4d21abd25d0d3e0cf9e2ff7a840b20290600000000000000000000000000000000000000000000007d95f141f7e8b3f91600000000000000000000000000000000000000000000000000000000000000c00000000000000000000000000000000000000000000000000000000000000000,,,1,true -10839,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0xa9f9e675000000000000000000000000dac17f958d2ee523a2206206994597c13d831ec700000000000000000000000094b008aa00579c1307b0ef2c499ad98a8ce58e58000000000000000000000000e540a58cb58a4ee5c35a980fd030d8a449b52695000000000000000000000000e540a58cb58a4ee5c35a980fd030d8a449b52695000000000000000000000000000000000000000000000000000000000062369400000000000000000000000000000000000000000000000000000000000000c00000000000000000000000000000000000000000000000000000000000000000,,,1,true -10841,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec34000000000000000000000000e07c9b38ef430c9a79b78a505b321084ffd354c3000000000000000000000000e07c9b38ef430c9a79b78a505b321084ffd354c30000000000000000000000000000000000000000000000000000a0761641dc0000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -10843,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec34000000000000000000000000cb61edc2007b476e44be5bbe81486247425e5f8b000000000000000000000000cb61edc2007b476e44be5bbe81486247425e5f8b00000000000000000000000000000000000000000000000000154ff58a9dddd900000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -10846,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec34000000000000000000000000672926d500e20ffc44ec712aa86277a85f72f4c6000000000000000000000000672926d500e20ffc44ec712aa86277a85f72f4c6000000000000000000000000000000000000000000000000003af3ea470a8d9900000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -10847,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0xa9f9e675000000000000000000000000dac17f958d2ee523a2206206994597c13d831ec700000000000000000000000094b008aa00579c1307b0ef2c499ad98a8ce58e58000000000000000000000000e540a58cb58a4ee5c35a980fd030d8a449b52695000000000000000000000000e540a58cb58a4ee5c35a980fd030d8a449b5269500000000000000000000000000000000000000000000000000000000004c4b4000000000000000000000000000000000000000000000000000000000000000c00000000000000000000000000000000000000000000000000000000000000000,,,1,true -10849,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec340000000000000000000000005f33734d47761b1578f20808714adf2a669d23a80000000000000000000000005f33734d47761b1578f20808714adf2a669d23a800000000000000000000000000000000000000000000000000038d7ea4c6800000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -10852,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec34000000000000000000000000c330130e49398bf5311b030c620b0d2ba361552e000000000000000000000000c330130e49398bf5311b030c620b0d2ba361552e000000000000000000000000000000000000000000000000002833a4521c1e2400000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -10856,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec34000000000000000000000000474f47707ae222c3a4dd1520de1aceed8d40643a000000000000000000000000474f47707ae222c3a4dd1520de1aceed8d40643a000000000000000000000000000000000000000000000000004ec89c84df33e900000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -10859,0xcd9d4988c0ae61887b075ba77f08cbfad2b65068,0x3f87ff1de58128ef8fcb4c807efd776e1ac72e51,0xf4f7b41a000000000000000000000000ba07c823f84bb2aa1cfda61cfa957750f2cf002200000000000000000000000000000000000000000000000dbbd4b593e2dce33c,,,1,true -10860,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0xa9f9e675000000000000000000000000a0b86991c6218b36c1d19d4a2e9eb0ce3606eb480000000000000000000000007f5c764cbc14f9669b88837ca1490cca17c3160700000000000000000000000037223d721901ec493906ddf800b71dbcb347fa6800000000000000000000000037223d721901ec493906ddf800b71dbcb347fa68000000000000000000000000000000000000000000000000000000000c6eb59600000000000000000000000000000000000000000000000000000000000000c00000000000000000000000000000000000000000000000000000000000000000,0x40fcb1b68dfd8edf1a14e02116bdb05da8340f1602f6261a18901ad8cf07ab13,2022-03-20 12:24:21.000 UTC,0,true -10861,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec340000000000000000000000002a81579aab05701838b80c826844e618aa023ed40000000000000000000000002a81579aab05701838b80c826844e618aa023ed4000000000000000000000000000000000000000000000000002e46d65eb68d0d00000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -10863,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec34000000000000000000000000a163d40de9dc681d7850ed24564d1805414ac468000000000000000000000000a163d40de9dc681d7850ed24564d1805414ac46800000000000000000000000000000000000000000000000002c40dd9e62e420000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -10865,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec340000000000000000000000002edf166a658af79c5c8bb268265a7def157eb62e0000000000000000000000002edf166a658af79c5c8bb268265a7def157eb62e0000000000000000000000000000000000000000000000000008e1bc9bf0400000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -10867,0xcd9d4988c0ae61887b075ba77f08cbfad2b65068,0x3f87ff1de58128ef8fcb4c807efd776e1ac72e51,0xf4f7b41a0000000000000000000000004e27452b03dbfdbb36e796cd0167a30b242871d20000000000000000000000000000000000000000000000013ef134172978f2e5,,,1,true -10868,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0xa9f9e675000000000000000000000000dac17f958d2ee523a2206206994597c13d831ec700000000000000000000000094b008aa00579c1307b0ef2c499ad98a8ce58e58000000000000000000000000e540a58cb58a4ee5c35a980fd030d8a449b52695000000000000000000000000e540a58cb58a4ee5c35a980fd030d8a449b5269500000000000000000000000000000000000000000000000000000000004c4b4000000000000000000000000000000000000000000000000000000000000000c00000000000000000000000000000000000000000000000000000000000000000,,,1,true -10870,0xcd9d4988c0ae61887b075ba77f08cbfad2b65068,0x3f87ff1de58128ef8fcb4c807efd776e1ac72e51,0xf4f7b41a000000000000000000000000443d12a4a89ae225df8460eed40f3dfd3f2ea8a80000000000000000000000000000000000000000000000000de0b6b3a7640000,,,1,true -10871,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec34000000000000000000000000223c930c6ad42f7e9cdebf88c68a29c508a616f6000000000000000000000000223c930c6ad42f7e9cdebf88c68a29c508a616f600000000000000000000000000000000000000000000000002869809251f000000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,0x946a735ce3e5092ed3b0ef730738a2f45411ba2b56824d72e23e60bba9aedec2,2022-02-27 03:01:16.000 UTC,0,true -10872,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec34000000000000000000000000710751fde40475ae92c8b267a1e5738de609156a000000000000000000000000710751fde40475ae92c8b267a1e5738de609156a00000000000000000000000000000000000000000000000000fd107932132a4000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -10873,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec34000000000000000000000000cc5e0b41320fec3821e6c2e70fd6fd548c9e609a000000000000000000000000cc5e0b41320fec3821e6c2e70fd6fd548c9e609a000000000000000000000000000000000000000000000000017b6435a682fc6900000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -10879,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec340000000000000000000000007f28b24d61cabd44aa94142f58e70be3722a23a10000000000000000000000007f28b24d61cabd44aa94142f58e70be3722a23a100000000000000000000000000000000000000000000000000ea0be46dd01b5100000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -10880,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec3400000000000000000000000085a61295752440af1f3071abfcd8233491a1621800000000000000000000000085a61295752440af1f3071abfcd8233491a162180000000000000000000000000000000000000000000000000033b35a5f44e12500000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -10881,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec3400000000000000000000000094d14ebb36a69f621e458f4b06dbdd8c317097f300000000000000000000000094d14ebb36a69f621e458f4b06dbdd8c317097f3000000000000000000000000000000000000000000000000000009184e72a00000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -10884,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec3400000000000000000000000037505d100c98de9d9026f621cb11bb222275af3a00000000000000000000000037505d100c98de9d9026f621cb11bb222275af3a0000000000000000000000000000000000000000000000000018de76816d800000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -10885,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec34000000000000000000000000d7cd0406c712510813a257b19d852c3d1dfb817b000000000000000000000000d7cd0406c712510813a257b19d852c3d1dfb817b000000000000000000000000000000000000000000000000006e0f97cbfa0ebf00000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -10886,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec340000000000000000000000000eb5bc0465292f0df1003207cb9cce17707c83600000000000000000000000000eb5bc0465292f0df1003207cb9cce17707c8360000000000000000000000000000000000000000000000000000009184e72a00000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -10888,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec34000000000000000000000000939fef762c9ba24d802a9def26e2ecf32212072c000000000000000000000000939fef762c9ba24d802a9def26e2ecf32212072c00000000000000000000000000000000000000000000000000470de4df82000000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -10889,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec340000000000000000000000007d181a7312cad7bdc5208f5bb65368fab933ca260000000000000000000000007d181a7312cad7bdc5208f5bb65368fab933ca26000000000000000000000000000000000000000000000000003dc4ab23255ab500000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -10890,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec340000000000000000000000003a6b7cdaef5d67fed5d470c94006c2197924f1c10000000000000000000000003a6b7cdaef5d67fed5d470c94006c2197924f1c100000000000000000000000000000000000000000000000000b1a2bc2ec5000000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -10891,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec340000000000000000000000003947217dc84e655d42371683a5b80f461903b2940000000000000000000000003947217dc84e655d42371683a5b80f461903b2940000000000000000000000000000000000000000000000000a6b51382b7c992800000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,0x6dfc238924705d8663911a909973867febe62b88a8c65eef8918322ac8898792,2022-05-30 09:16:56.000 UTC,0,true -10892,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec340000000000000000000000006521f20f2e82dedefbabc0047f6a82acab125d4b0000000000000000000000006521f20f2e82dedefbabc0047f6a82acab125d4b000000000000000000000000000000000000000000000000003ef29626e86a7a00000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -10893,0x10e6593cdda8c58a1d0f14c5164b376352a55f2f,0x467194771dae2967aef3ecbedd3bf9a310c76c65,0xa9f9e6750000000000000000000000006b175474e89094c44da98b954eedeac495271d0f000000000000000000000000da10009cbd5d07dd0cecc66161fc93d7c9000da1000000000000000000000000d073a15d57f958f8098ac87e421a2c9983885ac8000000000000000000000000d073a15d57f958f8098ac87e421a2c9983885ac80000000000000000000000000000000000000000000000022b1c8c1227a0000000000000000000000000000000000000000000000000000000000000000000c00000000000000000000000000000000000000000000000000000000000000000,,,1,true -10894,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec3400000000000000000000000006bc8e668402f5c1b895aced390aa1871cc6352900000000000000000000000006bc8e668402f5c1b895aced390aa1871cc63529000000000000000000000000000000000000000000000000003fa03caedc0dbe00000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -10895,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec34000000000000000000000000c98c0741a5d439ca7ec73e49f2735388a96cf3e2000000000000000000000000c98c0741a5d439ca7ec73e49f2735388a96cf3e2000000000000000000000000000000000000000000000000001c31d9b037a78000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -10897,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec34000000000000000000000000ae89056d488eebe4331613daad6a2bace2cb77e7000000000000000000000000ae89056d488eebe4331613daad6a2bace2cb77e70000000000000000000000000000000000000000000000000040e300c85408ba00000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -10899,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec34000000000000000000000000d9c032b435d1163a7f6c894aab9924d3c0dc1989000000000000000000000000d9c032b435d1163a7f6c894aab9924d3c0dc1989000000000000000000000000000000000000000000000000023043508114400000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,0x4e178aded85fe4de0dcf58d9b9fe36987bd2c5a0633e65c918ed1d44c9e274de,2022-02-27 03:07:00.000 UTC,0,true -10903,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec34000000000000000000000000b95152d72c9e182f2edd1e6a611a615f3d1a8033000000000000000000000000b95152d72c9e182f2edd1e6a611a615f3d1a8033000000000000000000000000000000000000000000000000002023c960aba00000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -10927,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec3400000000000000000000000084d0654d741fc89ab8610ec9c3fed33b68b7694800000000000000000000000084d0654d741fc89ab8610ec9c3fed33b68b7694800000000000000000000000000000000000000000000000000ede3c3e629000000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -10928,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec3400000000000000000000000084d0654d741fc89ab8610ec9c3fed33b68b7694800000000000000000000000084d0654d741fc89ab8610ec9c3fed33b68b76948000000000000000000000000000000000000000000000000004089d9c9f1c73800000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -10932,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec3400000000000000000000000092dd06f1cf1b9d086ce2bae7facdcf7067a35ccf00000000000000000000000092dd06f1cf1b9d086ce2bae7facdcf7067a35ccf000000000000000000000000000000000000000000000000015181ff25a9800000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,0x30fb2fe3044f63668c54bef3b1030e089f51cddf45f80a0dc0b29aa20fa76bd9,2022-02-27 03:15:02.000 UTC,0,true -10957,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec340000000000000000000000002b1df9010790002f57090902c78292cc7e7d948a0000000000000000000000002b1df9010790002f57090902c78292cc7e7d948a00000000000000000000000000000000000000000000000000043b30e5b86fab00000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -10958,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec3400000000000000000000000006b912dc08176500e2a5b2221b9e54ea3fa547f100000000000000000000000006b912dc08176500e2a5b2221b9e54ea3fa547f100000000000000000000000000000000000000000000000000afe19579ab220000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,0x7ac308a24db2c414373c8efdc59a6f4f13c9cd6f7bdc4841d69809ba03b3a46b,2022-03-16 01:10:44.000 UTC,0,true -10959,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec34000000000000000000000000bdf15d94f8e4cd2c8d422225f194755534f63464000000000000000000000000bdf15d94f8e4cd2c8d422225f194755534f63464000000000000000000000000000000000000000000000000000009184e72a00000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -10960,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec340000000000000000000000000eb5bc0465292f0df1003207cb9cce17707c83600000000000000000000000000eb5bc0465292f0df1003207cb9cce17707c8360000000000000000000000000000000000000000000000000000009184e72a00000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -10961,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec34000000000000000000000000695473b868a5ae578df18ce0e9002a97f0a5eb8f000000000000000000000000695473b868a5ae578df18ce0e9002a97f0a5eb8f000000000000000000000000000000000000000000000000006bc0ba559023fd00000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -10962,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec34000000000000000000000000c92e9fa369fa4e94c462d9fad4a79ad16f54ef08000000000000000000000000c92e9fa369fa4e94c462d9fad4a79ad16f54ef08000000000000000000000000000000000000000000000000000009184e72a00000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -10963,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec34000000000000000000000000191e1b3df06260d8813d8bfe666bbb36851068f5000000000000000000000000191e1b3df06260d8813d8bfe666bbb36851068f500000000000000000000000000000000000000000000000000d0858bd80570c000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,0x32891689d5a48cba308da37d973188a375a98fe5e387a4865315798304ec2f8b,2022-01-05 10:59:11.000 UTC,0,true -10964,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec3400000000000000000000000009e1d470604b79d1ed9ba77166928373773b273e00000000000000000000000009e1d470604b79d1ed9ba77166928373773b273e00000000000000000000000000000000000000000000000000408bba061df51900000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -10966,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec34000000000000000000000000827123b697289543ccc99d5c41bc5a5a9575a087000000000000000000000000827123b697289543ccc99d5c41bc5a5a9575a087000000000000000000000000000000000000000000000000000009184e72a00000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -10969,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec34000000000000000000000000866db22cf538fd470db7fe3c8bdb0416f6760874000000000000000000000000866db22cf538fd470db7fe3c8bdb0416f676087400000000000000000000000000000000000000000000000000037fc4e05c771100000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -10970,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec34000000000000000000000000722246643c7bb3d15ccef7e72fc5f90e53b9f457000000000000000000000000722246643c7bb3d15ccef7e72fc5f90e53b9f4570000000000000000000000000000000000000000000000000093f851baa0c0d600000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -10972,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec34000000000000000000000000d65bf5e2843463ad1857cd1f464598d79332d0b6000000000000000000000000d65bf5e2843463ad1857cd1f464598d79332d0b600000000000000000000000000000000000000000000000000db4e8e0ff8bb0200000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,0x5dde0bf7ad06d20b0d6a4871bc5b47d731317085efa7c0c93df368b6ed7f56be,2022-04-20 12:55:23.000 UTC,0,true -10974,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec34000000000000000000000000be7ae762dc142a1b4a56e36ed86dc90ba3484b44000000000000000000000000be7ae762dc142a1b4a56e36ed86dc90ba3484b440000000000000000000000000000000000000000000000000002f0865f34c8c000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -10975,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec34000000000000000000000000365be1502c03306a39a945d3e1f33b0a560c5ecc000000000000000000000000365be1502c03306a39a945d3e1f33b0a560c5ecc000000000000000000000000000000000000000000000000013fbe85edc9000000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -10976,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec34000000000000000000000000f506f4bc57ac62f72e846a781882d037d1dde02b000000000000000000000000f506f4bc57ac62f72e846a781882d037d1dde02b000000000000000000000000000000000000000000000000000009184e72a00000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -10977,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec3400000000000000000000000005bc0a8aab1923237dd18d5b1b57efcdfc39849500000000000000000000000005bc0a8aab1923237dd18d5b1b57efcdfc398495000000000000000000000000000000000000000000000000000009184e72a00000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -10978,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec34000000000000000000000000827123b697289543ccc99d5c41bc5a5a9575a087000000000000000000000000827123b697289543ccc99d5c41bc5a5a9575a08700000000000000000000000000000000000000000000000000470de4df82000000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -10980,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec34000000000000000000000000c29d88b3776aea8abab1d322cf54b05215858ea9000000000000000000000000c29d88b3776aea8abab1d322cf54b05215858ea9000000000000000000000000000000000000000000000000000009184e72a00000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -10981,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec34000000000000000000000000eebc42b3bb20c202f7941a0ce1febf7cbd23e114000000000000000000000000eebc42b3bb20c202f7941a0ce1febf7cbd23e114000000000000000000000000000000000000000000000000000009184e72a00000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -10982,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec34000000000000000000000000b8c3b004f4380b219e220f747661ab7d0f42c10a000000000000000000000000b8c3b004f4380b219e220f747661ab7d0f42c10a000000000000000000000000000000000000000000000000000009184e72a00000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -10983,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec340000000000000000000000000d41aa4577d756c05bff040abfd9b106056479290000000000000000000000000d41aa4577d756c05bff040abfd9b10605647929000000000000000000000000000000000000000000000000000009184e72a00000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -10984,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec34000000000000000000000000d741776da5549e31bf419178b0d031e59401f419000000000000000000000000d741776da5549e31bf419178b0d031e59401f419000000000000000000000000000000000000000000000000000009184e72a00000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -10985,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec34000000000000000000000000262efc46e2723b4552e5cc3ddbec23141d328092000000000000000000000000262efc46e2723b4552e5cc3ddbec23141d328092000000000000000000000000000000000000000000000000000009184e72a00000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -10986,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec3400000000000000000000000050cf6c627b7284f210e3b4fbe791867f4411022700000000000000000000000050cf6c627b7284f210e3b4fbe791867f44110227000000000000000000000000000000000000000000000000000009184e72a00000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -10987,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec34000000000000000000000000461460989787016397e1b2c1ecb5f6c306ee577d000000000000000000000000461460989787016397e1b2c1ecb5f6c306ee577d000000000000000000000000000000000000000000000000000009184e72a00000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -10988,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec3400000000000000000000000071e56c34b9b74fd2f195e545ab4d5d14b78cd88800000000000000000000000071e56c34b9b74fd2f195e545ab4d5d14b78cd888000000000000000000000000000000000000000000000000000009184e72a00000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -10989,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec34000000000000000000000000247680b6a3af46db33680373e8dcc6cc86e6d798000000000000000000000000247680b6a3af46db33680373e8dcc6cc86e6d798000000000000000000000000000000000000000000000000000009184e72a00000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -10992,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec340000000000000000000000001941f0ab39dbbe69855fe819991e6dac2bcc45ed0000000000000000000000001941f0ab39dbbe69855fe819991e6dac2bcc45ed00000000000000000000000000000000000000000000000000d12a5e822ff30000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,0x08e666cfdd1d672aeb4a71f4e947a296b519a2af6bceabebd1927bcfa3eaac98,2021-12-19 07:25:26.000 UTC,0,true -10994,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec340000000000000000000000001227b6eeb15510badf14b1683fe41676ffcf2b1d0000000000000000000000001227b6eeb15510badf14b1683fe41676ffcf2b1d00000000000000000000000000000000000000000000000000071afd498d000000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -10996,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec3400000000000000000000000039b370dca90663ffdd30838cd97c93a5042cceaa00000000000000000000000039b370dca90663ffdd30838cd97c93a5042cceaa0000000000000000000000000000000000000000000000000040311dc578c5ee00000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -11009,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec34000000000000000000000000bafd5b823eb5b00207e0e1f9ba4ca7a57cc01ce2000000000000000000000000bafd5b823eb5b00207e0e1f9ba4ca7a57cc01ce2000000000000000000000000000000000000000000000000002ed320df92200000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -11013,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec34000000000000000000000000835bdd5f86919022837efd01cd684d5b1e75e19c000000000000000000000000835bdd5f86919022837efd01cd684d5b1e75e19c000000000000000000000000000000000000000000000000009493d3acc111cb00000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -11017,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec340000000000000000000000007ba50a11c2b726abb4b4f945b04e11c192cd1d3d0000000000000000000000007ba50a11c2b726abb4b4f945b04e11c192cd1d3d00000000000000000000000000000000000000000000000000470de4df82000000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -11019,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec3400000000000000000000000007b488f9e43a834a136147315016593fb6128ae500000000000000000000000007b488f9e43a834a136147315016593fb6128ae5000000000000000000000000000000000000000000000000007c58508723800000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -11020,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec34000000000000000000000000851064900dcb11351e53a39e5af340e9fc2b7689000000000000000000000000851064900dcb11351e53a39e5af340e9fc2b7689000000000000000000000000000000000000000000000000012ffff40b947e5a00000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -11021,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec340000000000000000000000006beb35a80a6e34aed6cc639517856df28cf938850000000000000000000000006beb35a80a6e34aed6cc639517856df28cf93885000000000000000000000000000000000000000000000000003fa5ceaabdb19800000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -11022,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec340000000000000000000000004bce3cec9ffebdc48b90cccbe3f568b5b03f31c20000000000000000000000004bce3cec9ffebdc48b90cccbe3f568b5b03f31c2000000000000000000000000000000000000000000000000013c4bd0697f37fa00000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,0xf8deb7916eac32583f9ec0ed24c75f4407ea1578febc05a05818b6e47fc06fb7,2022-05-22 18:25:07.000 UTC,0,true -11023,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec340000000000000000000000008617e81ab3ecf651f8b94b2d472efd37f724c1330000000000000000000000008617e81ab3ecf651f8b94b2d472efd37f724c133000000000000000000000000000000000000000000000000002386f26fc1000000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -11024,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec3400000000000000000000000024c9440ee1add29a03fb2e18d18fc3ec463d357900000000000000000000000024c9440ee1add29a03fb2e18d18fc3ec463d3579000000000000000000000000000000000000000000000000002386f26fc1000000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -11025,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec34000000000000000000000000e90ac62991600ba537d6c8c567f42f0cd4b346c9000000000000000000000000e90ac62991600ba537d6c8c567f42f0cd4b346c9000000000000000000000000000000000000000000000000002386f26fc1000000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -11026,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec34000000000000000000000000cbcfa66204895046b47313dd761a981e6a99f33b000000000000000000000000cbcfa66204895046b47313dd761a981e6a99f33b0000000000000000000000000000000000000000000000000018de76816d800000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -11027,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec34000000000000000000000000869fd339567356ff41d8e9a6d0fbb7afc679d7b1000000000000000000000000869fd339567356ff41d8e9a6d0fbb7afc679d7b100000000000000000000000000000000000000000000000000138a388a43c00000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -11028,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec34000000000000000000000000983ae2cfe680c18300154bc910ca8d117a1ed20f000000000000000000000000983ae2cfe680c18300154bc910ca8d117a1ed20f000000000000000000000000000000000000000000000000000ffcb9e57d400000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -11029,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec340000000000000000000000009eaaf4db9a9ba7b1404877568c7f93356bd1dcf70000000000000000000000009eaaf4db9a9ba7b1404877568c7f93356bd1dcf7000000000000000000000000000000000000000000000000000ffcb9e57d400000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -11030,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec34000000000000000000000000a9aabc663eb801a970807ea3a0e36d49ab03fc1e000000000000000000000000a9aabc663eb801a970807ea3a0e36d49ab03fc1e000000000000000000000000000000000000000000000000001717b72f0a400000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -11031,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec34000000000000000000000000efe8ee8b892b88f2e7acca277e128074ece49b6b000000000000000000000000efe8ee8b892b88f2e7acca277e128074ece49b6b000000000000000000000000000000000000000000000000001aa535d3d0c00000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -11032,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec34000000000000000000000000ccf5ce1115395c99feab660911e59f2c1a80684e000000000000000000000000ccf5ce1115395c99feab660911e59f2c1a80684e000000000000000000000000000000000000000000000000001e32b47897400000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -11033,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec34000000000000000000000000d572beca83dd4c1a49ad56c6aa6126653678555f000000000000000000000000d572beca83dd4c1a49ad56c6aa6126653678555f00000000000000000000000000000000000000000000000000138a388a43c00000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -11034,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec3400000000000000000000000061339e9f27a21bfbd309bb5d9c00dbeb9b88562300000000000000000000000061339e9f27a21bfbd309bb5d9c00dbeb9b88562300000000000000000000000000000000000000000000000000138a388a43c00000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -11036,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec34000000000000000000000000fc465f297e18bd50befa610d503c5571c56e925a000000000000000000000000fc465f297e18bd50befa610d503c5571c56e925a00000000000000000000000000000000000000000000000000f451e45a9c830000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,0x1127e3f96f2df912d4e830ee7d91559cfe2d6f370a8978a6ae444b08d1cc5397,2022-03-12 06:51:43.000 UTC,0,true -11039,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec340000000000000000000000002c3a62f16ea361cdd5c65ac22dfd1ef4cb5560bb0000000000000000000000002c3a62f16ea361cdd5c65ac22dfd1ef4cb5560bb0000000000000000000000000000000000000000000000000034a558ab62380000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -11041,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec34000000000000000000000000bb22ffae8c9205cc3677f16c5b79dffba9479b4a000000000000000000000000bb22ffae8c9205cc3677f16c5b79dffba9479b4a000000000000000000000000000000000000000000000000003776a76816644000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -11043,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec3400000000000000000000000017d4dac6081d305209c693b702f9a8cf0e4df15100000000000000000000000017d4dac6081d305209c693b702f9a8cf0e4df1510000000000000000000000000000000000000000000000000071afd498d0000000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -11044,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec34000000000000000000000000da485bc95377b68f19721d3c661bcd9c7e0a616f000000000000000000000000da485bc95377b68f19721d3c661bcd9c7e0a616f00000000000000000000000000000000000000000000000002ed182ae759b8d300000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -11048,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec34000000000000000000000000214013e8e5d8264b27e824077ce9fff49bc20e8e000000000000000000000000214013e8e5d8264b27e824077ce9fff49bc20e8e00000000000000000000000000000000000000000000000000ad9f018e2c600000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -11049,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec34000000000000000000000000ecaf5554b3e7acc936cf5b9f7e9173a7b85cba73000000000000000000000000ecaf5554b3e7acc936cf5b9f7e9173a7b85cba73000000000000000000000000000000000000000000000000015b4dca52666abc00000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -11051,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec340000000000000000000000007464c993af64925ba9f38fa36e8e7578c31773540000000000000000000000007464c993af64925ba9f38fa36e8e7578c3177354000000000000000000000000000000000000000000000000007fe5cf2bea000000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -11052,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec340000000000000000000000006f797f8b349b34821d8ec65f3fd754e9c60cfde60000000000000000000000006f797f8b349b34821d8ec65f3fd754e9c60cfde600000000000000000000000000000000000000000000000000249f00b6c89a4000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -11053,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec34000000000000000000000000d365821a7a763ca01021ae5ef00bb9ab9ecc553d000000000000000000000000d365821a7a763ca01021ae5ef00bb9ab9ecc553d00000000000000000000000000000000000000000000000000ab73e1d6c5258000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,0xe67ccda1fffc26dd6bba2c3c7530cbbf5c10e3b394390c162103cd583dea0188,2021-12-19 12:20:13.000 UTC,0,true -11054,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0xa9f9e675000000000000000000000000dac17f958d2ee523a2206206994597c13d831ec700000000000000000000000094b008aa00579c1307b0ef2c499ad98a8ce58e58000000000000000000000000ceb5591110444504bf02283c05bfaf42d6ea0f07000000000000000000000000ceb5591110444504bf02283c05bfaf42d6ea0f070000000000000000000000000000000000000000000000000000000006e95e1c00000000000000000000000000000000000000000000000000000000000000c00000000000000000000000000000000000000000000000000000000000000000,,,1,true -11056,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0xa9f9e675000000000000000000000000dac17f958d2ee523a2206206994597c13d831ec700000000000000000000000094b008aa00579c1307b0ef2c499ad98a8ce58e580000000000000000000000003296fb4fb0188d3c4ebbc6ee55ce636ac1ab5b4b0000000000000000000000003296fb4fb0188d3c4ebbc6ee55ce636ac1ab5b4b00000000000000000000000000000000000000000000000000000000078b44d900000000000000000000000000000000000000000000000000000000000000c00000000000000000000000000000000000000000000000000000000000000000,,,1,true -11057,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec3400000000000000000000000082b2001c9adfc027ffba3fa37b1e18c11cc5c3e600000000000000000000000082b2001c9adfc027ffba3fa37b1e18c11cc5c3e6000000000000000000000000000000000000000000000000000009184e72a00000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -11059,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec340000000000000000000000002ffc9c646cf9399a3adfde4ad042c5e0c2ffa1210000000000000000000000002ffc9c646cf9399a3adfde4ad042c5e0c2ffa121000000000000000000000000000000000000000000000000002386f26fc1000000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -11060,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec34000000000000000000000000c92e9fa369fa4e94c462d9fad4a79ad16f54ef08000000000000000000000000c92e9fa369fa4e94c462d9fad4a79ad16f54ef08000000000000000000000000000000000000000000000000000009184e72a00000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -11061,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec34000000000000000000000000f506f4bc57ac62f72e846a781882d037d1dde02b000000000000000000000000f506f4bc57ac62f72e846a781882d037d1dde02b000000000000000000000000000000000000000000000000000009184e72a00000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -11062,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec3400000000000000000000000032255bda08d9dfb5af628818075c78c6ead1336900000000000000000000000032255bda08d9dfb5af628818075c78c6ead1336900000000000000000000000000000000000000000000000000005af3107a400000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -11063,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec3400000000000000000000000005bc0a8aab1923237dd18d5b1b57efcdfc39849500000000000000000000000005bc0a8aab1923237dd18d5b1b57efcdfc398495000000000000000000000000000000000000000000000000000009184e72a00000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -11064,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec34000000000000000000000000f419db6a84d599b5802fe555f6e1c4e4ca71d1c2000000000000000000000000f419db6a84d599b5802fe555f6e1c4e4ca71d1c2000000000000000000000000000000000000000000000000001e75f6d4130fa800000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -11065,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec34000000000000000000000000827123b697289543ccc99d5c41bc5a5a9575a087000000000000000000000000827123b697289543ccc99d5c41bc5a5a9575a087000000000000000000000000000000000000000000000000000009184e72a00000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -11066,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec34000000000000000000000000c29d88b3776aea8abab1d322cf54b05215858ea9000000000000000000000000c29d88b3776aea8abab1d322cf54b05215858ea9000000000000000000000000000000000000000000000000000009184e72a00000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -11067,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec34000000000000000000000000eebc42b3bb20c202f7941a0ce1febf7cbd23e114000000000000000000000000eebc42b3bb20c202f7941a0ce1febf7cbd23e114000000000000000000000000000000000000000000000000000009184e72a00000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -11068,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec34000000000000000000000000b8c3b004f4380b219e220f747661ab7d0f42c10a000000000000000000000000b8c3b004f4380b219e220f747661ab7d0f42c10a000000000000000000000000000000000000000000000000000009184e72a00000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -11069,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec340000000000000000000000003880a75cc09b8ccd4adbbce0d29ecd33a77115ec0000000000000000000000003880a75cc09b8ccd4adbbce0d29ecd33a77115ec00000000000000000000000000000000000000000000000000005af3107a400000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -11070,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec340000000000000000000000000d41aa4577d756c05bff040abfd9b106056479290000000000000000000000000d41aa4577d756c05bff040abfd9b10605647929000000000000000000000000000000000000000000000000000009184e72a00000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -11071,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec34000000000000000000000000a33698d7ce3d595934c3a580e043f48e8c52f3dd000000000000000000000000a33698d7ce3d595934c3a580e043f48e8c52f3dd00000000000000000000000000000000000000000000000000005af3107a400000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -11072,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec34000000000000000000000000d741776da5549e31bf419178b0d031e59401f419000000000000000000000000d741776da5549e31bf419178b0d031e59401f419000000000000000000000000000000000000000000000000000009184e72a00000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -11073,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec34000000000000000000000000c074be0305e9ee1b5a69c94aaf9e0546e3d70fff000000000000000000000000c074be0305e9ee1b5a69c94aaf9e0546e3d70fff00000000000000000000000000000000000000000000000000005af3107a400000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -11074,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec34000000000000000000000000262efc46e2723b4552e5cc3ddbec23141d328092000000000000000000000000262efc46e2723b4552e5cc3ddbec23141d328092000000000000000000000000000000000000000000000000000009184e72a00000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -11075,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec340000000000000000000000004318d15cab26aff5995a3993581dd2264bc81e770000000000000000000000004318d15cab26aff5995a3993581dd2264bc81e7700000000000000000000000000000000000000000000000000005af3107a400000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -11076,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec3400000000000000000000000050cf6c627b7284f210e3b4fbe791867f4411022700000000000000000000000050cf6c627b7284f210e3b4fbe791867f44110227000000000000000000000000000000000000000000000000000009184e72a00000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -11077,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec3400000000000000000000000025e250f4144811f1e7e3aa3b8bff4ce49e06fe6900000000000000000000000025e250f4144811f1e7e3aa3b8bff4ce49e06fe6900000000000000000000000000000000000000000000000000005af3107a400000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -11078,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec34000000000000000000000000461460989787016397e1b2c1ecb5f6c306ee577d000000000000000000000000461460989787016397e1b2c1ecb5f6c306ee577d000000000000000000000000000000000000000000000000000009184e72a00000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -11079,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec3400000000000000000000000071e56c34b9b74fd2f195e545ab4d5d14b78cd88800000000000000000000000071e56c34b9b74fd2f195e545ab4d5d14b78cd888000000000000000000000000000000000000000000000000000009184e72a00000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -11080,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec340000000000000000000000006099c5863f280a81532be79afe969821ac92feb30000000000000000000000006099c5863f280a81532be79afe969821ac92feb300000000000000000000000000000000000000000000000000005af3107a400000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -11081,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec34000000000000000000000000a25cf88f762e4a9e75ceab2b6c71138f07a2e6f4000000000000000000000000a25cf88f762e4a9e75ceab2b6c71138f07a2e6f400000000000000000000000000000000000000000000000000005af3107a400000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -11082,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec34000000000000000000000000ef55dd49e4ef9df47669f0e8fd44c26b6ed41a8b000000000000000000000000ef55dd49e4ef9df47669f0e8fd44c26b6ed41a8b00000000000000000000000000000000000000000000000000005af3107a400000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -11083,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec340000000000000000000000000ffb49827cdf0d398970919a37e0218a9f01509c0000000000000000000000000ffb49827cdf0d398970919a37e0218a9f01509c00000000000000000000000000000000000000000000000000005af3107a400000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -11084,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec34000000000000000000000000a960cd9dd85d6f1dc2ece6f8dff862f81a409483000000000000000000000000a960cd9dd85d6f1dc2ece6f8dff862f81a40948300000000000000000000000000000000000000000000000000005af3107a400000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -11085,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec3400000000000000000000000048a99f12ac0bac569b846422a35775f98e59bba600000000000000000000000048a99f12ac0bac569b846422a35775f98e59bba600000000000000000000000000000000000000000000000000005af3107a400000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -11086,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec34000000000000000000000000c6fe30e32cfe1e1e6c0f40a4c7c0ffe77edc2eaa000000000000000000000000c6fe30e32cfe1e1e6c0f40a4c7c0ffe77edc2eaa00000000000000000000000000000000000000000000000000005af3107a400000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -11087,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec34000000000000000000000000a99ca43db25dee844eb6a55f78b9bfaea0e2d96d000000000000000000000000a99ca43db25dee844eb6a55f78b9bfaea0e2d96d00000000000000000000000000000000000000000000000000005af3107a400000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -11088,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec34000000000000000000000000247680b6a3af46db33680373e8dcc6cc86e6d798000000000000000000000000247680b6a3af46db33680373e8dcc6cc86e6d798000000000000000000000000000000000000000000000000000009184e72a00000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -11089,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec34000000000000000000000000247680b6a3af46db33680373e8dcc6cc86e6d798000000000000000000000000247680b6a3af46db33680373e8dcc6cc86e6d798000000000000000000000000000000000000000000000000000009184e72a00000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -11090,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec34000000000000000000000000bdf15d94f8e4cd2c8d422225f194755534f63464000000000000000000000000bdf15d94f8e4cd2c8d422225f194755534f63464000000000000000000000000000000000000000000000000000009184e72a00000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -11091,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec34000000000000000000000000ca79106a1a187c40e4830eca639b63b2dc0415fb000000000000000000000000ca79106a1a187c40e4830eca639b63b2dc0415fb00000000000000000000000000000000000000000000000000005af3107a400000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -11092,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec34000000000000000000000000f73f2ad9434cd2e86d298b9f03d3ad135320dd71000000000000000000000000f73f2ad9434cd2e86d298b9f03d3ad135320dd7100000000000000000000000000000000000000000000000000005af3107a400000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -11093,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec34000000000000000000000000ed668c3aacc5411b9116aac58c9e41efdc7e1e12000000000000000000000000ed668c3aacc5411b9116aac58c9e41efdc7e1e1200000000000000000000000000000000000000000000000000005af3107a400000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -11094,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec34000000000000000000000000f8c2efb6a45096afbfc4617b1aa4941d28d3531b000000000000000000000000f8c2efb6a45096afbfc4617b1aa4941d28d3531b00000000000000000000000000000000000000000000000000005af3107a400000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -11095,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec340000000000000000000000006bd8e8275b285fd66a36b66abe6a9021e58be82a0000000000000000000000006bd8e8275b285fd66a36b66abe6a9021e58be82a00000000000000000000000000000000000000000000000003731728748c6d4000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -11096,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec34000000000000000000000000b441a9e5d5581fa859858f35f437790228b956ed000000000000000000000000b441a9e5d5581fa859858f35f437790228b956ed00000000000000000000000000000000000000000000000000005af3107a400000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -11097,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec34000000000000000000000000a4db982a2761cb7abe328f09d5992bd5a79c9e16000000000000000000000000a4db982a2761cb7abe328f09d5992bd5a79c9e1600000000000000000000000000000000000000000000000000220bb695b8500000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -11100,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec34000000000000000000000000b6c86df56d0a5c574658bf2831d8dda94e6fee58000000000000000000000000b6c86df56d0a5c574658bf2831d8dda94e6fee58000000000000000000000000000000000000000000000000002386f26fc1000000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -11103,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec340000000000000000000000001f41219828d15fc06786aea5026597fba62471950000000000000000000000001f41219828d15fc06786aea5026597fba6247195000000000000000000000000000000000000000000000000001c6bf52634000000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -11105,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec34000000000000000000000000f21c72dc8c8dca4ee2b60996636cb65f14109452000000000000000000000000f21c72dc8c8dca4ee2b60996636cb65f14109452000000000000000000000000000000000000000000000000002061749153584000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -11106,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec34000000000000000000000000babd94d14a221936a4b13f9db96e241a3abddb81000000000000000000000000babd94d14a221936a4b13f9db96e241a3abddb8100000000000000000000000000000000000000000000000000586497ea697d0400000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -11107,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec340000000000000000000000002b26975022d55b218ef2b29df3f8d3047102c56b0000000000000000000000002b26975022d55b218ef2b29df3f8d3047102c56b0000000000000000000000000000000000000000000000000085bff4b4b1e4c000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -11108,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec340000000000000000000000004bec9722651a94f1999d22e6895314566b3f54330000000000000000000000004bec9722651a94f1999d22e6895314566b3f543300000000000000000000000000000000000000000000000000207fb87b2d090000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -11109,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec340000000000000000000000008619c0c06e1f601ee60dd9a7330f9c4d2c869fbf0000000000000000000000008619c0c06e1f601ee60dd9a7330f9c4d2c869fbf00000000000000000000000000000000000000000000000000c630340eee02d600000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -11113,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec34000000000000000000000000a47e6a0bd3b361ba2784e61be35ae5407502cd82000000000000000000000000a47e6a0bd3b361ba2784e61be35ae5407502cd8200000000000000000000000000000000000000000000000000fba74299a8528000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -11114,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec34000000000000000000000000140f0479b7db7e1643e66a1dfad79b1537bca1df000000000000000000000000140f0479b7db7e1643e66a1dfad79b1537bca1df000000000000000000000000000000000000000000000000014a99912ddf556300000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -11115,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec34000000000000000000000000f5f3fac8634369bbf50606eee7d49bbb97f3c686000000000000000000000000f5f3fac8634369bbf50606eee7d49bbb97f3c68600000000000000000000000000000000000000000000000000522667f90adf0000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -11116,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec3400000000000000000000000048e492c0acc7f277c0f0a8335a35aa33caa0365200000000000000000000000048e492c0acc7f277c0f0a8335a35aa33caa036520000000000000000000000000000000000000000000000000037ed803d38378100000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -11117,0xcd9d4988c0ae61887b075ba77f08cbfad2b65068,0x3f87ff1de58128ef8fcb4c807efd776e1ac72e51,0xf4f7b41a000000000000000000000000e366355e53169d030c6af3de0e48b15ad657892f000000000000000000000000000000000000000000000000004dc0da02a8cc12,,,1,true -11119,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec34000000000000000000000000de55e26ac20c5aca6dc7d5768631840eb53d6868000000000000000000000000de55e26ac20c5aca6dc7d5768631840eb53d686800000000000000000000000000000000000000000000000000b1a2bc2ec5000000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -11121,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec34000000000000000000000000c60e967fb9ecf571cf69f007971d487ce748528b000000000000000000000000c60e967fb9ecf571cf69f007971d487ce748528b000000000000000000000000000000000000000000000000007a583cd9ad5f0000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -11122,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec34000000000000000000000000bdf15d94f8e4cd2c8d422225f194755534f63464000000000000000000000000bdf15d94f8e4cd2c8d422225f194755534f63464000000000000000000000000000000000000000000000000000009184e72a00000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -11123,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec34000000000000000000000000bdf15d94f8e4cd2c8d422225f194755534f63464000000000000000000000000bdf15d94f8e4cd2c8d422225f194755534f63464000000000000000000000000000000000000000000000000000009184e72a00000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -11124,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec34000000000000000000000000bdf15d94f8e4cd2c8d422225f194755534f63464000000000000000000000000bdf15d94f8e4cd2c8d422225f194755534f63464000000000000000000000000000000000000000000000000000009184e72a00000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -11125,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec34000000000000000000000000bdf15d94f8e4cd2c8d422225f194755534f63464000000000000000000000000bdf15d94f8e4cd2c8d422225f194755534f63464000000000000000000000000000000000000000000000000000009184e72a00000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -11126,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec34000000000000000000000000bdf15d94f8e4cd2c8d422225f194755534f63464000000000000000000000000bdf15d94f8e4cd2c8d422225f194755534f63464000000000000000000000000000000000000000000000000000009184e72a00000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -11127,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec34000000000000000000000000bdf15d94f8e4cd2c8d422225f194755534f63464000000000000000000000000bdf15d94f8e4cd2c8d422225f194755534f63464000000000000000000000000000000000000000000000000000009184e72a00000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -11128,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec34000000000000000000000000bdf15d94f8e4cd2c8d422225f194755534f63464000000000000000000000000bdf15d94f8e4cd2c8d422225f194755534f63464000000000000000000000000000000000000000000000000000009184e72a00000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -11129,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec34000000000000000000000000bdf15d94f8e4cd2c8d422225f194755534f63464000000000000000000000000bdf15d94f8e4cd2c8d422225f194755534f63464000000000000000000000000000000000000000000000000000009184e72a00000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -11130,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec34000000000000000000000000bdf15d94f8e4cd2c8d422225f194755534f63464000000000000000000000000bdf15d94f8e4cd2c8d422225f194755534f63464000000000000000000000000000000000000000000000000000009184e72a00000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -11131,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec34000000000000000000000000bdf15d94f8e4cd2c8d422225f194755534f63464000000000000000000000000bdf15d94f8e4cd2c8d422225f194755534f63464000000000000000000000000000000000000000000000000000009184e72a00000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -11132,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec34000000000000000000000000bdf15d94f8e4cd2c8d422225f194755534f63464000000000000000000000000bdf15d94f8e4cd2c8d422225f194755534f63464000000000000000000000000000000000000000000000000000009184e72a00000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -11133,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec34000000000000000000000000bdf15d94f8e4cd2c8d422225f194755534f63464000000000000000000000000bdf15d94f8e4cd2c8d422225f194755534f63464000000000000000000000000000000000000000000000000000009184e72a00000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -11134,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec34000000000000000000000000bdf15d94f8e4cd2c8d422225f194755534f63464000000000000000000000000bdf15d94f8e4cd2c8d422225f194755534f63464000000000000000000000000000000000000000000000000000009184e72a00000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -11135,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec34000000000000000000000000bdf15d94f8e4cd2c8d422225f194755534f63464000000000000000000000000bdf15d94f8e4cd2c8d422225f194755534f63464000000000000000000000000000000000000000000000000000009184e72a00000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -11136,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec34000000000000000000000000bdf15d94f8e4cd2c8d422225f194755534f63464000000000000000000000000bdf15d94f8e4cd2c8d422225f194755534f63464000000000000000000000000000000000000000000000000000009184e72a00000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -11138,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec3400000000000000000000000078c8e648e99c53c5b320d16fae7cf667db3a521300000000000000000000000078c8e648e99c53c5b320d16fae7cf667db3a521300000000000000000000000000000000000000000000000006cc4350c474f01400000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,0x2b1aa31ebc9cc1d45571b4a37dd287b99ea8908b1e7fa891c0c4f57c88550959,2022-03-01 15:54:56.000 UTC,0,true -11139,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0xa9f9e675000000000000000000000000dac17f958d2ee523a2206206994597c13d831ec700000000000000000000000094b008aa00579c1307b0ef2c499ad98a8ce58e5800000000000000000000000064fde70dc6d475fd5482e788b0391a9b1f5a6a6700000000000000000000000064fde70dc6d475fd5482e788b0391a9b1f5a6a67000000000000000000000000000000000000000000000000000000005b3b4d8800000000000000000000000000000000000000000000000000000000000000c00000000000000000000000000000000000000000000000000000000000000000,0x2b1cae93e5109bba5f5ee06aa9098bc7d44611efd8bf92d80832d6918e5c42e9,2022-06-08 16:42:39.000 UTC,0,true -11147,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec34000000000000000000000000b45c64303eee659e573597335473467b6222ea9a000000000000000000000000b45c64303eee659e573597335473467b6222ea9a0000000000000000000000000000000000000000000000000021c10a9b5f4f0000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -11149,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec34000000000000000000000000b0929a7fa093c6219789a592856f8e67ccf0500b000000000000000000000000b0929a7fa093c6219789a592856f8e67ccf0500b00000000000000000000000000000000000000000000000000011f7b0985e5dd00000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -11150,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec34000000000000000000000000b0929a7fa093c6219789a592856f8e67ccf0500b000000000000000000000000b0929a7fa093c6219789a592856f8e67ccf0500b000000000000000000000000000000000000000000000000015d85436020bf2000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -11151,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec34000000000000000000000000169bc617dfdd54623132f9cc633dfe4d786d5bc0000000000000000000000000169bc617dfdd54623132f9cc633dfe4d786d5bc0000000000000000000000000000000000000000000000000017d0cdfededc11900000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -11155,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec3400000000000000000000000052dd96ce3ad7f658cc0645ed9cb4ac896c1360f900000000000000000000000052dd96ce3ad7f658cc0645ed9cb4ac896c1360f9000000000000000000000000000000000000000000000000016c35d5523e4d1f00000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -11156,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec34000000000000000000000000c0a98e6477003e2e889a774dd5e75cce6e4d8a68000000000000000000000000c0a98e6477003e2e889a774dd5e75cce6e4d8a68000000000000000000000000000000000000000000000000002386f26fc1000000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -11157,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec34000000000000000000000000d74c56c55573d810a130599aac4bec2337b4dc3d000000000000000000000000d74c56c55573d810a130599aac4bec2337b4dc3d0000000000000000000000000000000000000000000000000137dc155d22ce0000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -11158,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec340000000000000000000000003ad0f834fd587c0f11bdb5654a7c53c4198f70600000000000000000000000003ad0f834fd587c0f11bdb5654a7c53c4198f70600000000000000000000000000000000000000000000000000813adea9b47000000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,0x68b7fff14bb9979cc0cc7c9e983b903aef7f837f039586daecfe6b767bdbd48c,2021-11-29 07:33:40.000 UTC,0,true -11167,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec340000000000000000000000006d6dff1f616b9af592fd4092c3df123746a3168b0000000000000000000000006d6dff1f616b9af592fd4092c3df123746a3168b000000000000000000000000000000000000000000000000000009184e72a00000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -11168,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec340000000000000000000000006d6dff1f616b9af592fd4092c3df123746a3168b0000000000000000000000006d6dff1f616b9af592fd4092c3df123746a3168b000000000000000000000000000000000000000000000000000009184e72a00000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -11169,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec340000000000000000000000006d6dff1f616b9af592fd4092c3df123746a3168b0000000000000000000000006d6dff1f616b9af592fd4092c3df123746a3168b000000000000000000000000000000000000000000000000000009184e72a00000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -11170,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec340000000000000000000000006d6dff1f616b9af592fd4092c3df123746a3168b0000000000000000000000006d6dff1f616b9af592fd4092c3df123746a3168b000000000000000000000000000000000000000000000000000009184e72a00000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -11171,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec340000000000000000000000006d6dff1f616b9af592fd4092c3df123746a3168b0000000000000000000000006d6dff1f616b9af592fd4092c3df123746a3168b000000000000000000000000000000000000000000000000000009184e72a00000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -11172,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec340000000000000000000000006d6dff1f616b9af592fd4092c3df123746a3168b0000000000000000000000006d6dff1f616b9af592fd4092c3df123746a3168b000000000000000000000000000000000000000000000000000009184e72a00000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -11173,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec340000000000000000000000006d6dff1f616b9af592fd4092c3df123746a3168b0000000000000000000000006d6dff1f616b9af592fd4092c3df123746a3168b000000000000000000000000000000000000000000000000000009184e72a00000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -11174,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec340000000000000000000000006d6dff1f616b9af592fd4092c3df123746a3168b0000000000000000000000006d6dff1f616b9af592fd4092c3df123746a3168b000000000000000000000000000000000000000000000000000009184e72a00000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -11175,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec340000000000000000000000006d6dff1f616b9af592fd4092c3df123746a3168b0000000000000000000000006d6dff1f616b9af592fd4092c3df123746a3168b000000000000000000000000000000000000000000000000000009184e72a00000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -11176,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec340000000000000000000000006d6dff1f616b9af592fd4092c3df123746a3168b0000000000000000000000006d6dff1f616b9af592fd4092c3df123746a3168b000000000000000000000000000000000000000000000000000009184e72a00000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -11177,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec340000000000000000000000006d6dff1f616b9af592fd4092c3df123746a3168b0000000000000000000000006d6dff1f616b9af592fd4092c3df123746a3168b000000000000000000000000000000000000000000000000000009184e72a00000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -11179,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec34000000000000000000000000a18af6843286143afcc833ce9a310cbf8b3c2d2f000000000000000000000000a18af6843286143afcc833ce9a310cbf8b3c2d2f00000000000000000000000000000000000000000000000000aee865f414d10000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -11180,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec340000000000000000000000006d6dff1f616b9af592fd4092c3df123746a3168b0000000000000000000000006d6dff1f616b9af592fd4092c3df123746a3168b000000000000000000000000000000000000000000000000000009184e72a00000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -11181,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec340000000000000000000000006d6dff1f616b9af592fd4092c3df123746a3168b0000000000000000000000006d6dff1f616b9af592fd4092c3df123746a3168b000000000000000000000000000000000000000000000000000009184e72a00000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -11182,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec340000000000000000000000006d6dff1f616b9af592fd4092c3df123746a3168b0000000000000000000000006d6dff1f616b9af592fd4092c3df123746a3168b000000000000000000000000000000000000000000000000000009184e72a00000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -11183,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec340000000000000000000000006d6dff1f616b9af592fd4092c3df123746a3168b0000000000000000000000006d6dff1f616b9af592fd4092c3df123746a3168b000000000000000000000000000000000000000000000000000009184e72a00000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -11184,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec340000000000000000000000006d6dff1f616b9af592fd4092c3df123746a3168b0000000000000000000000006d6dff1f616b9af592fd4092c3df123746a3168b000000000000000000000000000000000000000000000000000009184e72a00000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -11185,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec340000000000000000000000006d6dff1f616b9af592fd4092c3df123746a3168b0000000000000000000000006d6dff1f616b9af592fd4092c3df123746a3168b000000000000000000000000000000000000000000000000000009184e72a00000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -11186,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec34000000000000000000000000cbd89600a173f377be4d59d155c9c59e6030fda3000000000000000000000000cbd89600a173f377be4d59d155c9c59e6030fda3000000000000000000000000000000000000000000000000000009184e72a00000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -11187,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec34000000000000000000000000cbd89600a173f377be4d59d155c9c59e6030fda3000000000000000000000000cbd89600a173f377be4d59d155c9c59e6030fda3000000000000000000000000000000000000000000000000000009184e72a00000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -11188,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec34000000000000000000000000cbd89600a173f377be4d59d155c9c59e6030fda3000000000000000000000000cbd89600a173f377be4d59d155c9c59e6030fda3000000000000000000000000000000000000000000000000000009184e72a00000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -11189,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec34000000000000000000000000cbd89600a173f377be4d59d155c9c59e6030fda3000000000000000000000000cbd89600a173f377be4d59d155c9c59e6030fda3000000000000000000000000000000000000000000000000000009184e72a00000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -11190,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec340000000000000000000000002d03d8bd1fd8e208b163a5e7304dff35c10310770000000000000000000000002d03d8bd1fd8e208b163a5e7304dff35c103107700000000000000000000000000000000000000000000000000038d7ea4c6800000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -11191,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec34000000000000000000000000cbd89600a173f377be4d59d155c9c59e6030fda3000000000000000000000000cbd89600a173f377be4d59d155c9c59e6030fda3000000000000000000000000000000000000000000000000000009184e72a00000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -11193,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec34000000000000000000000000cbd89600a173f377be4d59d155c9c59e6030fda3000000000000000000000000cbd89600a173f377be4d59d155c9c59e6030fda3000000000000000000000000000000000000000000000000000009184e72a00000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -11194,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec34000000000000000000000000cbd89600a173f377be4d59d155c9c59e6030fda3000000000000000000000000cbd89600a173f377be4d59d155c9c59e6030fda3000000000000000000000000000000000000000000000000000009184e72a00000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -11195,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec34000000000000000000000000cbd89600a173f377be4d59d155c9c59e6030fda3000000000000000000000000cbd89600a173f377be4d59d155c9c59e6030fda3000000000000000000000000000000000000000000000000000009184e72a00000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -11196,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec3400000000000000000000000083ea9d59eb73d2c7183072fa22efcbf35ef6e55500000000000000000000000083ea9d59eb73d2c7183072fa22efcbf35ef6e5550000000000000000000000000000000000000000000000000037962084227d1100000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -11197,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec34000000000000000000000000cbd89600a173f377be4d59d155c9c59e6030fda3000000000000000000000000cbd89600a173f377be4d59d155c9c59e6030fda3000000000000000000000000000000000000000000000000000009184e72a00000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -11198,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec34000000000000000000000000cbd89600a173f377be4d59d155c9c59e6030fda3000000000000000000000000cbd89600a173f377be4d59d155c9c59e6030fda3000000000000000000000000000000000000000000000000000009184e72a00000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -11199,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec34000000000000000000000000cbd89600a173f377be4d59d155c9c59e6030fda3000000000000000000000000cbd89600a173f377be4d59d155c9c59e6030fda3000000000000000000000000000000000000000000000000000009184e72a00000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -11201,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec34000000000000000000000000cbd89600a173f377be4d59d155c9c59e6030fda3000000000000000000000000cbd89600a173f377be4d59d155c9c59e6030fda3000000000000000000000000000000000000000000000000000009184e72a00000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -11202,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec34000000000000000000000000cbd89600a173f377be4d59d155c9c59e6030fda3000000000000000000000000cbd89600a173f377be4d59d155c9c59e6030fda3000000000000000000000000000000000000000000000000000009184e72a00000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -11203,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec34000000000000000000000000cbd89600a173f377be4d59d155c9c59e6030fda3000000000000000000000000cbd89600a173f377be4d59d155c9c59e6030fda3000000000000000000000000000000000000000000000000000009184e72a00000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -11204,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec34000000000000000000000000581edc6ba25b2e56d59a2e82b038caa35b7b1f4d000000000000000000000000581edc6ba25b2e56d59a2e82b038caa35b7b1f4d000000000000000000000000000000000000000000000000000009184e72a00000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -11205,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec34000000000000000000000000581edc6ba25b2e56d59a2e82b038caa35b7b1f4d000000000000000000000000581edc6ba25b2e56d59a2e82b038caa35b7b1f4d000000000000000000000000000000000000000000000000000009184e72a00000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -11206,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec34000000000000000000000000581edc6ba25b2e56d59a2e82b038caa35b7b1f4d000000000000000000000000581edc6ba25b2e56d59a2e82b038caa35b7b1f4d000000000000000000000000000000000000000000000000000009184e72a00000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -11207,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec34000000000000000000000000581edc6ba25b2e56d59a2e82b038caa35b7b1f4d000000000000000000000000581edc6ba25b2e56d59a2e82b038caa35b7b1f4d000000000000000000000000000000000000000000000000000009184e72a00000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -11208,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec34000000000000000000000000581edc6ba25b2e56d59a2e82b038caa35b7b1f4d000000000000000000000000581edc6ba25b2e56d59a2e82b038caa35b7b1f4d000000000000000000000000000000000000000000000000000009184e72a00000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -11209,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec34000000000000000000000000581edc6ba25b2e56d59a2e82b038caa35b7b1f4d000000000000000000000000581edc6ba25b2e56d59a2e82b038caa35b7b1f4d000000000000000000000000000000000000000000000000000009184e72a00000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -11210,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec34000000000000000000000000581edc6ba25b2e56d59a2e82b038caa35b7b1f4d000000000000000000000000581edc6ba25b2e56d59a2e82b038caa35b7b1f4d000000000000000000000000000000000000000000000000000009184e72a00000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -11211,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec34000000000000000000000000581edc6ba25b2e56d59a2e82b038caa35b7b1f4d000000000000000000000000581edc6ba25b2e56d59a2e82b038caa35b7b1f4d000000000000000000000000000000000000000000000000000009184e72a00000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -11212,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec34000000000000000000000000581edc6ba25b2e56d59a2e82b038caa35b7b1f4d000000000000000000000000581edc6ba25b2e56d59a2e82b038caa35b7b1f4d000000000000000000000000000000000000000000000000000009184e72a00000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -11213,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec34000000000000000000000000581edc6ba25b2e56d59a2e82b038caa35b7b1f4d000000000000000000000000581edc6ba25b2e56d59a2e82b038caa35b7b1f4d000000000000000000000000000000000000000000000000000009184e72a00000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -11214,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec34000000000000000000000000581edc6ba25b2e56d59a2e82b038caa35b7b1f4d000000000000000000000000581edc6ba25b2e56d59a2e82b038caa35b7b1f4d000000000000000000000000000000000000000000000000000009184e72a00000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -11215,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec34000000000000000000000000581edc6ba25b2e56d59a2e82b038caa35b7b1f4d000000000000000000000000581edc6ba25b2e56d59a2e82b038caa35b7b1f4d000000000000000000000000000000000000000000000000000009184e72a00000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -11216,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec34000000000000000000000000581edc6ba25b2e56d59a2e82b038caa35b7b1f4d000000000000000000000000581edc6ba25b2e56d59a2e82b038caa35b7b1f4d000000000000000000000000000000000000000000000000000009184e72a00000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -11217,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec34000000000000000000000000581edc6ba25b2e56d59a2e82b038caa35b7b1f4d000000000000000000000000581edc6ba25b2e56d59a2e82b038caa35b7b1f4d000000000000000000000000000000000000000000000000000009184e72a00000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -11218,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec34000000000000000000000000581edc6ba25b2e56d59a2e82b038caa35b7b1f4d000000000000000000000000581edc6ba25b2e56d59a2e82b038caa35b7b1f4d000000000000000000000000000000000000000000000000000009184e72a00000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -11219,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec340000000000000000000000002ffafb6a09999d2cb2cff49af667c084bf12aa930000000000000000000000002ffafb6a09999d2cb2cff49af667c084bf12aa93000000000000000000000000000000000000000000000000000009184e72a00000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -11220,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec340000000000000000000000002ffafb6a09999d2cb2cff49af667c084bf12aa930000000000000000000000002ffafb6a09999d2cb2cff49af667c084bf12aa93000000000000000000000000000000000000000000000000000009184e72a00000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -11221,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec340000000000000000000000002ffafb6a09999d2cb2cff49af667c084bf12aa930000000000000000000000002ffafb6a09999d2cb2cff49af667c084bf12aa93000000000000000000000000000000000000000000000000000009184e72a00000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -11222,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec340000000000000000000000002ffafb6a09999d2cb2cff49af667c084bf12aa930000000000000000000000002ffafb6a09999d2cb2cff49af667c084bf12aa93000000000000000000000000000000000000000000000000000009184e72a00000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -11223,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec340000000000000000000000002ffafb6a09999d2cb2cff49af667c084bf12aa930000000000000000000000002ffafb6a09999d2cb2cff49af667c084bf12aa93000000000000000000000000000000000000000000000000000009184e72a00000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -11224,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec340000000000000000000000002ffafb6a09999d2cb2cff49af667c084bf12aa930000000000000000000000002ffafb6a09999d2cb2cff49af667c084bf12aa93000000000000000000000000000000000000000000000000000009184e72a00000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -11225,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec340000000000000000000000002ffafb6a09999d2cb2cff49af667c084bf12aa930000000000000000000000002ffafb6a09999d2cb2cff49af667c084bf12aa93000000000000000000000000000000000000000000000000000009184e72a00000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -11226,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec340000000000000000000000002ffafb6a09999d2cb2cff49af667c084bf12aa930000000000000000000000002ffafb6a09999d2cb2cff49af667c084bf12aa93000000000000000000000000000000000000000000000000000009184e72a00000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -11227,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec340000000000000000000000002ffafb6a09999d2cb2cff49af667c084bf12aa930000000000000000000000002ffafb6a09999d2cb2cff49af667c084bf12aa93000000000000000000000000000000000000000000000000000009184e72a00000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -11228,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec340000000000000000000000002ffafb6a09999d2cb2cff49af667c084bf12aa930000000000000000000000002ffafb6a09999d2cb2cff49af667c084bf12aa93000000000000000000000000000000000000000000000000000009184e72a00000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -11229,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec340000000000000000000000002ffafb6a09999d2cb2cff49af667c084bf12aa930000000000000000000000002ffafb6a09999d2cb2cff49af667c084bf12aa93000000000000000000000000000000000000000000000000000009184e72a00000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -11230,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec340000000000000000000000002ffafb6a09999d2cb2cff49af667c084bf12aa930000000000000000000000002ffafb6a09999d2cb2cff49af667c084bf12aa93000000000000000000000000000000000000000000000000000009184e72a00000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -11231,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec340000000000000000000000002ffafb6a09999d2cb2cff49af667c084bf12aa930000000000000000000000002ffafb6a09999d2cb2cff49af667c084bf12aa93000000000000000000000000000000000000000000000000000009184e72a00000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -11232,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec340000000000000000000000002ffafb6a09999d2cb2cff49af667c084bf12aa930000000000000000000000002ffafb6a09999d2cb2cff49af667c084bf12aa93000000000000000000000000000000000000000000000000000009184e72a00000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -11233,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec340000000000000000000000002ffafb6a09999d2cb2cff49af667c084bf12aa930000000000000000000000002ffafb6a09999d2cb2cff49af667c084bf12aa93000000000000000000000000000000000000000000000000000009184e72a00000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -11234,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec340000000000000000000000002ffafb6a09999d2cb2cff49af667c084bf12aa930000000000000000000000002ffafb6a09999d2cb2cff49af667c084bf12aa93000000000000000000000000000000000000000000000000000009184e72a00000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -11235,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec340000000000000000000000002ffafb6a09999d2cb2cff49af667c084bf12aa930000000000000000000000002ffafb6a09999d2cb2cff49af667c084bf12aa93000000000000000000000000000000000000000000000000000009184e72a00000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -11236,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec34000000000000000000000000aeebeab3168ec11d58bddb633fe498f78f2811cd000000000000000000000000aeebeab3168ec11d58bddb633fe498f78f2811cd000000000000000000000000000000000000000000000000000009184e72a00000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -11237,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec34000000000000000000000000aeebeab3168ec11d58bddb633fe498f78f2811cd000000000000000000000000aeebeab3168ec11d58bddb633fe498f78f2811cd000000000000000000000000000000000000000000000000000009184e72a00000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -11238,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec34000000000000000000000000aeebeab3168ec11d58bddb633fe498f78f2811cd000000000000000000000000aeebeab3168ec11d58bddb633fe498f78f2811cd000000000000000000000000000000000000000000000000000009184e72a00000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -11239,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec34000000000000000000000000aeebeab3168ec11d58bddb633fe498f78f2811cd000000000000000000000000aeebeab3168ec11d58bddb633fe498f78f2811cd000000000000000000000000000000000000000000000000000009184e72a00000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -11240,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec34000000000000000000000000aeebeab3168ec11d58bddb633fe498f78f2811cd000000000000000000000000aeebeab3168ec11d58bddb633fe498f78f2811cd000000000000000000000000000000000000000000000000000009184e72a00000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -11242,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec34000000000000000000000000aeebeab3168ec11d58bddb633fe498f78f2811cd000000000000000000000000aeebeab3168ec11d58bddb633fe498f78f2811cd000000000000000000000000000000000000000000000000000009184e72a00000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -11243,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec34000000000000000000000000aeebeab3168ec11d58bddb633fe498f78f2811cd000000000000000000000000aeebeab3168ec11d58bddb633fe498f78f2811cd000000000000000000000000000000000000000000000000000009184e72a00000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -11244,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec34000000000000000000000000aeebeab3168ec11d58bddb633fe498f78f2811cd000000000000000000000000aeebeab3168ec11d58bddb633fe498f78f2811cd000000000000000000000000000000000000000000000000000009184e72a00000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -11245,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec34000000000000000000000000aeebeab3168ec11d58bddb633fe498f78f2811cd000000000000000000000000aeebeab3168ec11d58bddb633fe498f78f2811cd000000000000000000000000000000000000000000000000000009184e72a00000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -11246,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec34000000000000000000000000aeebeab3168ec11d58bddb633fe498f78f2811cd000000000000000000000000aeebeab3168ec11d58bddb633fe498f78f2811cd000000000000000000000000000000000000000000000000000009184e72a00000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -11247,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec34000000000000000000000000aeebeab3168ec11d58bddb633fe498f78f2811cd000000000000000000000000aeebeab3168ec11d58bddb633fe498f78f2811cd000000000000000000000000000000000000000000000000000009184e72a00000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -11248,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec34000000000000000000000000aeebeab3168ec11d58bddb633fe498f78f2811cd000000000000000000000000aeebeab3168ec11d58bddb633fe498f78f2811cd000000000000000000000000000000000000000000000000000009184e72a00000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -11249,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec34000000000000000000000000aeebeab3168ec11d58bddb633fe498f78f2811cd000000000000000000000000aeebeab3168ec11d58bddb633fe498f78f2811cd000000000000000000000000000000000000000000000000000009184e72a00000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -11250,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec34000000000000000000000000aeebeab3168ec11d58bddb633fe498f78f2811cd000000000000000000000000aeebeab3168ec11d58bddb633fe498f78f2811cd000000000000000000000000000000000000000000000000000009184e72a00000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -11251,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec340000000000000000000000003f298b99f6a38d56df11afdc6b7cb7d351c8d7800000000000000000000000003f298b99f6a38d56df11afdc6b7cb7d351c8d780000000000000000000000000000000000000000000000000000009184e72a00000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -11252,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec340000000000000000000000003f298b99f6a38d56df11afdc6b7cb7d351c8d7800000000000000000000000003f298b99f6a38d56df11afdc6b7cb7d351c8d780000000000000000000000000000000000000000000000000000009184e72a00000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -11253,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec340000000000000000000000003f298b99f6a38d56df11afdc6b7cb7d351c8d7800000000000000000000000003f298b99f6a38d56df11afdc6b7cb7d351c8d780000000000000000000000000000000000000000000000000000009184e72a00000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -11254,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec340000000000000000000000003f298b99f6a38d56df11afdc6b7cb7d351c8d7800000000000000000000000003f298b99f6a38d56df11afdc6b7cb7d351c8d780000000000000000000000000000000000000000000000000000009184e72a00000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -11255,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec340000000000000000000000003f298b99f6a38d56df11afdc6b7cb7d351c8d7800000000000000000000000003f298b99f6a38d56df11afdc6b7cb7d351c8d780000000000000000000000000000000000000000000000000000009184e72a00000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -11256,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec340000000000000000000000003f298b99f6a38d56df11afdc6b7cb7d351c8d7800000000000000000000000003f298b99f6a38d56df11afdc6b7cb7d351c8d780000000000000000000000000000000000000000000000000000009184e72a00000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -11257,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec340000000000000000000000003f298b99f6a38d56df11afdc6b7cb7d351c8d7800000000000000000000000003f298b99f6a38d56df11afdc6b7cb7d351c8d780000000000000000000000000000000000000000000000000000009184e72a00000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -11258,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec340000000000000000000000003f298b99f6a38d56df11afdc6b7cb7d351c8d7800000000000000000000000003f298b99f6a38d56df11afdc6b7cb7d351c8d780000000000000000000000000000000000000000000000000000009184e72a00000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -11259,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec340000000000000000000000003f298b99f6a38d56df11afdc6b7cb7d351c8d7800000000000000000000000003f298b99f6a38d56df11afdc6b7cb7d351c8d780000000000000000000000000000000000000000000000000000009184e72a00000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -11260,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec340000000000000000000000003f298b99f6a38d56df11afdc6b7cb7d351c8d7800000000000000000000000003f298b99f6a38d56df11afdc6b7cb7d351c8d780000000000000000000000000000000000000000000000000000009184e72a00000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -11261,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec340000000000000000000000003f298b99f6a38d56df11afdc6b7cb7d351c8d7800000000000000000000000003f298b99f6a38d56df11afdc6b7cb7d351c8d780000000000000000000000000000000000000000000000000000009184e72a00000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -11262,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec340000000000000000000000003f298b99f6a38d56df11afdc6b7cb7d351c8d7800000000000000000000000003f298b99f6a38d56df11afdc6b7cb7d351c8d780000000000000000000000000000000000000000000000000000009184e72a00000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -11263,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec340000000000000000000000003f298b99f6a38d56df11afdc6b7cb7d351c8d7800000000000000000000000003f298b99f6a38d56df11afdc6b7cb7d351c8d780000000000000000000000000000000000000000000000000000009184e72a00000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -11264,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec340000000000000000000000003f298b99f6a38d56df11afdc6b7cb7d351c8d7800000000000000000000000003f298b99f6a38d56df11afdc6b7cb7d351c8d780000000000000000000000000000000000000000000000000000009184e72a00000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -11265,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec34000000000000000000000000888a721ede33cbdc79325843ae786c0ae41a927c000000000000000000000000888a721ede33cbdc79325843ae786c0ae41a927c000000000000000000000000000000000000000000000000000009184e72a00000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -11266,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec34000000000000000000000000888a721ede33cbdc79325843ae786c0ae41a927c000000000000000000000000888a721ede33cbdc79325843ae786c0ae41a927c000000000000000000000000000000000000000000000000000009184e72a00000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -11267,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec34000000000000000000000000888a721ede33cbdc79325843ae786c0ae41a927c000000000000000000000000888a721ede33cbdc79325843ae786c0ae41a927c000000000000000000000000000000000000000000000000000009184e72a00000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -11268,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec34000000000000000000000000888a721ede33cbdc79325843ae786c0ae41a927c000000000000000000000000888a721ede33cbdc79325843ae786c0ae41a927c000000000000000000000000000000000000000000000000000009184e72a00000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -11269,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec34000000000000000000000000888a721ede33cbdc79325843ae786c0ae41a927c000000000000000000000000888a721ede33cbdc79325843ae786c0ae41a927c000000000000000000000000000000000000000000000000000009184e72a00000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -11270,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec34000000000000000000000000888a721ede33cbdc79325843ae786c0ae41a927c000000000000000000000000888a721ede33cbdc79325843ae786c0ae41a927c000000000000000000000000000000000000000000000000000009184e72a00000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -11271,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec34000000000000000000000000888a721ede33cbdc79325843ae786c0ae41a927c000000000000000000000000888a721ede33cbdc79325843ae786c0ae41a927c000000000000000000000000000000000000000000000000000009184e72a00000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -11272,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec34000000000000000000000000888a721ede33cbdc79325843ae786c0ae41a927c000000000000000000000000888a721ede33cbdc79325843ae786c0ae41a927c000000000000000000000000000000000000000000000000000009184e72a00000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -11273,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec34000000000000000000000000888a721ede33cbdc79325843ae786c0ae41a927c000000000000000000000000888a721ede33cbdc79325843ae786c0ae41a927c000000000000000000000000000000000000000000000000000009184e72a00000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -11274,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec34000000000000000000000000888a721ede33cbdc79325843ae786c0ae41a927c000000000000000000000000888a721ede33cbdc79325843ae786c0ae41a927c000000000000000000000000000000000000000000000000000009184e72a00000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -11275,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec34000000000000000000000000888a721ede33cbdc79325843ae786c0ae41a927c000000000000000000000000888a721ede33cbdc79325843ae786c0ae41a927c000000000000000000000000000000000000000000000000000009184e72a00000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -11276,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec34000000000000000000000000888a721ede33cbdc79325843ae786c0ae41a927c000000000000000000000000888a721ede33cbdc79325843ae786c0ae41a927c000000000000000000000000000000000000000000000000000009184e72a00000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -11277,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec34000000000000000000000000888a721ede33cbdc79325843ae786c0ae41a927c000000000000000000000000888a721ede33cbdc79325843ae786c0ae41a927c000000000000000000000000000000000000000000000000000009184e72a00000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -11278,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec34000000000000000000000000888a721ede33cbdc79325843ae786c0ae41a927c000000000000000000000000888a721ede33cbdc79325843ae786c0ae41a927c000000000000000000000000000000000000000000000000000009184e72a00000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -11279,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec34000000000000000000000000888a721ede33cbdc79325843ae786c0ae41a927c000000000000000000000000888a721ede33cbdc79325843ae786c0ae41a927c000000000000000000000000000000000000000000000000000009184e72a00000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -11280,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec340000000000000000000000007fb50bf1b2dbfc249d5327c01713daa9ff92eff80000000000000000000000007fb50bf1b2dbfc249d5327c01713daa9ff92eff8000000000000000000000000000000000000000000000000000009184e72a00000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -11281,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec340000000000000000000000007fb50bf1b2dbfc249d5327c01713daa9ff92eff80000000000000000000000007fb50bf1b2dbfc249d5327c01713daa9ff92eff8000000000000000000000000000000000000000000000000000009184e72a00000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -11282,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec340000000000000000000000007fb50bf1b2dbfc249d5327c01713daa9ff92eff80000000000000000000000007fb50bf1b2dbfc249d5327c01713daa9ff92eff8000000000000000000000000000000000000000000000000000009184e72a00000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -11283,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec340000000000000000000000007fb50bf1b2dbfc249d5327c01713daa9ff92eff80000000000000000000000007fb50bf1b2dbfc249d5327c01713daa9ff92eff8000000000000000000000000000000000000000000000000000009184e72a00000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -11284,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec340000000000000000000000007fb50bf1b2dbfc249d5327c01713daa9ff92eff80000000000000000000000007fb50bf1b2dbfc249d5327c01713daa9ff92eff8000000000000000000000000000000000000000000000000000009184e72a00000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -11285,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec340000000000000000000000007fb50bf1b2dbfc249d5327c01713daa9ff92eff80000000000000000000000007fb50bf1b2dbfc249d5327c01713daa9ff92eff8000000000000000000000000000000000000000000000000000009184e72a00000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -11286,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec340000000000000000000000007fb50bf1b2dbfc249d5327c01713daa9ff92eff80000000000000000000000007fb50bf1b2dbfc249d5327c01713daa9ff92eff8000000000000000000000000000000000000000000000000000009184e72a00000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -11287,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec340000000000000000000000007fb50bf1b2dbfc249d5327c01713daa9ff92eff80000000000000000000000007fb50bf1b2dbfc249d5327c01713daa9ff92eff8000000000000000000000000000000000000000000000000000009184e72a00000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -11288,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec340000000000000000000000007fb50bf1b2dbfc249d5327c01713daa9ff92eff80000000000000000000000007fb50bf1b2dbfc249d5327c01713daa9ff92eff8000000000000000000000000000000000000000000000000000009184e72a00000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -11289,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec340000000000000000000000007fb50bf1b2dbfc249d5327c01713daa9ff92eff80000000000000000000000007fb50bf1b2dbfc249d5327c01713daa9ff92eff8000000000000000000000000000000000000000000000000000009184e72a00000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -11290,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec340000000000000000000000007fb50bf1b2dbfc249d5327c01713daa9ff92eff80000000000000000000000007fb50bf1b2dbfc249d5327c01713daa9ff92eff8000000000000000000000000000000000000000000000000000009184e72a00000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -11291,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec340000000000000000000000007fb50bf1b2dbfc249d5327c01713daa9ff92eff80000000000000000000000007fb50bf1b2dbfc249d5327c01713daa9ff92eff8000000000000000000000000000000000000000000000000000009184e72a00000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -11292,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec340000000000000000000000007fb50bf1b2dbfc249d5327c01713daa9ff92eff80000000000000000000000007fb50bf1b2dbfc249d5327c01713daa9ff92eff8000000000000000000000000000000000000000000000000000009184e72a00000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -11293,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec340000000000000000000000007fb50bf1b2dbfc249d5327c01713daa9ff92eff80000000000000000000000007fb50bf1b2dbfc249d5327c01713daa9ff92eff8000000000000000000000000000000000000000000000000000009184e72a00000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -11294,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec3400000000000000000000000094d14ebb36a69f621e458f4b06dbdd8c317097f300000000000000000000000094d14ebb36a69f621e458f4b06dbdd8c317097f3000000000000000000000000000000000000000000000000000009184e72a00000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -11295,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec3400000000000000000000000094d14ebb36a69f621e458f4b06dbdd8c317097f300000000000000000000000094d14ebb36a69f621e458f4b06dbdd8c317097f3000000000000000000000000000000000000000000000000000009184e72a00000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -11296,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec3400000000000000000000000094d14ebb36a69f621e458f4b06dbdd8c317097f300000000000000000000000094d14ebb36a69f621e458f4b06dbdd8c317097f3000000000000000000000000000000000000000000000000000009184e72a00000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -11297,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec3400000000000000000000000094d14ebb36a69f621e458f4b06dbdd8c317097f300000000000000000000000094d14ebb36a69f621e458f4b06dbdd8c317097f3000000000000000000000000000000000000000000000000000009184e72a00000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -11298,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec3400000000000000000000000094d14ebb36a69f621e458f4b06dbdd8c317097f300000000000000000000000094d14ebb36a69f621e458f4b06dbdd8c317097f3000000000000000000000000000000000000000000000000000009184e72a00000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -11299,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec3400000000000000000000000094d14ebb36a69f621e458f4b06dbdd8c317097f300000000000000000000000094d14ebb36a69f621e458f4b06dbdd8c317097f3000000000000000000000000000000000000000000000000000009184e72a00000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -11300,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec3400000000000000000000000094d14ebb36a69f621e458f4b06dbdd8c317097f300000000000000000000000094d14ebb36a69f621e458f4b06dbdd8c317097f3000000000000000000000000000000000000000000000000000009184e72a00000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -11301,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec3400000000000000000000000094d14ebb36a69f621e458f4b06dbdd8c317097f300000000000000000000000094d14ebb36a69f621e458f4b06dbdd8c317097f3000000000000000000000000000000000000000000000000000009184e72a00000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -11302,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec3400000000000000000000000094d14ebb36a69f621e458f4b06dbdd8c317097f300000000000000000000000094d14ebb36a69f621e458f4b06dbdd8c317097f3000000000000000000000000000000000000000000000000000009184e72a00000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -11303,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec3400000000000000000000000094d14ebb36a69f621e458f4b06dbdd8c317097f300000000000000000000000094d14ebb36a69f621e458f4b06dbdd8c317097f3000000000000000000000000000000000000000000000000000009184e72a00000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -11304,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec3400000000000000000000000094d14ebb36a69f621e458f4b06dbdd8c317097f300000000000000000000000094d14ebb36a69f621e458f4b06dbdd8c317097f3000000000000000000000000000000000000000000000000000009184e72a00000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -11305,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec3400000000000000000000000094d14ebb36a69f621e458f4b06dbdd8c317097f300000000000000000000000094d14ebb36a69f621e458f4b06dbdd8c317097f3000000000000000000000000000000000000000000000000000009184e72a00000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -11306,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec3400000000000000000000000094d14ebb36a69f621e458f4b06dbdd8c317097f300000000000000000000000094d14ebb36a69f621e458f4b06dbdd8c317097f3000000000000000000000000000000000000000000000000000009184e72a00000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -11307,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec340000000000000000000000000eb5bc0465292f0df1003207cb9cce17707c83600000000000000000000000000eb5bc0465292f0df1003207cb9cce17707c8360000000000000000000000000000000000000000000000000000009184e72a00000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -11308,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec340000000000000000000000000eb5bc0465292f0df1003207cb9cce17707c83600000000000000000000000000eb5bc0465292f0df1003207cb9cce17707c8360000000000000000000000000000000000000000000000000000009184e72a00000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -11309,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec340000000000000000000000000eb5bc0465292f0df1003207cb9cce17707c83600000000000000000000000000eb5bc0465292f0df1003207cb9cce17707c8360000000000000000000000000000000000000000000000000000009184e72a00000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -11310,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec340000000000000000000000000eb5bc0465292f0df1003207cb9cce17707c83600000000000000000000000000eb5bc0465292f0df1003207cb9cce17707c8360000000000000000000000000000000000000000000000000000009184e72a00000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -11311,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec340000000000000000000000000eb5bc0465292f0df1003207cb9cce17707c83600000000000000000000000000eb5bc0465292f0df1003207cb9cce17707c8360000000000000000000000000000000000000000000000000000009184e72a00000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -11312,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec340000000000000000000000000eb5bc0465292f0df1003207cb9cce17707c83600000000000000000000000000eb5bc0465292f0df1003207cb9cce17707c8360000000000000000000000000000000000000000000000000000009184e72a00000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -11313,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec340000000000000000000000000eb5bc0465292f0df1003207cb9cce17707c83600000000000000000000000000eb5bc0465292f0df1003207cb9cce17707c8360000000000000000000000000000000000000000000000000000009184e72a00000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -11314,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec340000000000000000000000000eb5bc0465292f0df1003207cb9cce17707c83600000000000000000000000000eb5bc0465292f0df1003207cb9cce17707c8360000000000000000000000000000000000000000000000000000009184e72a00000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -11315,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec340000000000000000000000000eb5bc0465292f0df1003207cb9cce17707c83600000000000000000000000000eb5bc0465292f0df1003207cb9cce17707c8360000000000000000000000000000000000000000000000000000009184e72a00000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -11316,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec340000000000000000000000000eb5bc0465292f0df1003207cb9cce17707c83600000000000000000000000000eb5bc0465292f0df1003207cb9cce17707c8360000000000000000000000000000000000000000000000000000009184e72a00000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -11317,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec340000000000000000000000000eb5bc0465292f0df1003207cb9cce17707c83600000000000000000000000000eb5bc0465292f0df1003207cb9cce17707c8360000000000000000000000000000000000000000000000000000009184e72a00000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -11318,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec340000000000000000000000000eb5bc0465292f0df1003207cb9cce17707c83600000000000000000000000000eb5bc0465292f0df1003207cb9cce17707c8360000000000000000000000000000000000000000000000000000009184e72a00000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -11319,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec340000000000000000000000000eb5bc0465292f0df1003207cb9cce17707c83600000000000000000000000000eb5bc0465292f0df1003207cb9cce17707c8360000000000000000000000000000000000000000000000000000009184e72a00000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -11320,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec340000000000000000000000000eb5bc0465292f0df1003207cb9cce17707c83600000000000000000000000000eb5bc0465292f0df1003207cb9cce17707c8360000000000000000000000000000000000000000000000000000009184e72a00000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -11321,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec340000000000000000000000000eb5bc0465292f0df1003207cb9cce17707c83600000000000000000000000000eb5bc0465292f0df1003207cb9cce17707c8360000000000000000000000000000000000000000000000000000009184e72a00000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -11322,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec340000000000000000000000000eb5bc0465292f0df1003207cb9cce17707c83600000000000000000000000000eb5bc0465292f0df1003207cb9cce17707c8360000000000000000000000000000000000000000000000000000009184e72a00000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -11323,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec340000000000000000000000000eb5bc0465292f0df1003207cb9cce17707c83600000000000000000000000000eb5bc0465292f0df1003207cb9cce17707c8360000000000000000000000000000000000000000000000000000009184e72a00000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -11324,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec34000000000000000000000000cbcda62ad56791f9a3f8ab16e0a45ca376cf5c9c000000000000000000000000cbcda62ad56791f9a3f8ab16e0a45ca376cf5c9c000000000000000000000000000000000000000000000000001c063b3bfa60c000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -11325,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec34000000000000000000000000c92e9fa369fa4e94c462d9fad4a79ad16f54ef08000000000000000000000000c92e9fa369fa4e94c462d9fad4a79ad16f54ef08000000000000000000000000000000000000000000000000000009184e72a00000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -11326,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec34000000000000000000000000c92e9fa369fa4e94c462d9fad4a79ad16f54ef08000000000000000000000000c92e9fa369fa4e94c462d9fad4a79ad16f54ef08000000000000000000000000000000000000000000000000000009184e72a00000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -11327,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec34000000000000000000000000c92e9fa369fa4e94c462d9fad4a79ad16f54ef08000000000000000000000000c92e9fa369fa4e94c462d9fad4a79ad16f54ef08000000000000000000000000000000000000000000000000000009184e72a00000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -11328,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec34000000000000000000000000c92e9fa369fa4e94c462d9fad4a79ad16f54ef08000000000000000000000000c92e9fa369fa4e94c462d9fad4a79ad16f54ef08000000000000000000000000000000000000000000000000000009184e72a00000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -11329,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec34000000000000000000000000c92e9fa369fa4e94c462d9fad4a79ad16f54ef08000000000000000000000000c92e9fa369fa4e94c462d9fad4a79ad16f54ef08000000000000000000000000000000000000000000000000000009184e72a00000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -11330,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec34000000000000000000000000c92e9fa369fa4e94c462d9fad4a79ad16f54ef08000000000000000000000000c92e9fa369fa4e94c462d9fad4a79ad16f54ef08000000000000000000000000000000000000000000000000000009184e72a00000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -11331,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec34000000000000000000000000c92e9fa369fa4e94c462d9fad4a79ad16f54ef08000000000000000000000000c92e9fa369fa4e94c462d9fad4a79ad16f54ef08000000000000000000000000000000000000000000000000000009184e72a00000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -11332,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec34000000000000000000000000c92e9fa369fa4e94c462d9fad4a79ad16f54ef08000000000000000000000000c92e9fa369fa4e94c462d9fad4a79ad16f54ef08000000000000000000000000000000000000000000000000000009184e72a00000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -11333,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec34000000000000000000000000c92e9fa369fa4e94c462d9fad4a79ad16f54ef08000000000000000000000000c92e9fa369fa4e94c462d9fad4a79ad16f54ef08000000000000000000000000000000000000000000000000000009184e72a00000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -11334,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec34000000000000000000000000c92e9fa369fa4e94c462d9fad4a79ad16f54ef08000000000000000000000000c92e9fa369fa4e94c462d9fad4a79ad16f54ef08000000000000000000000000000000000000000000000000000009184e72a00000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -11335,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec34000000000000000000000000c92e9fa369fa4e94c462d9fad4a79ad16f54ef08000000000000000000000000c92e9fa369fa4e94c462d9fad4a79ad16f54ef08000000000000000000000000000000000000000000000000000009184e72a00000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -11336,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec34000000000000000000000000c92e9fa369fa4e94c462d9fad4a79ad16f54ef08000000000000000000000000c92e9fa369fa4e94c462d9fad4a79ad16f54ef08000000000000000000000000000000000000000000000000000009184e72a00000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -11337,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec34000000000000000000000000c92e9fa369fa4e94c462d9fad4a79ad16f54ef08000000000000000000000000c92e9fa369fa4e94c462d9fad4a79ad16f54ef08000000000000000000000000000000000000000000000000000009184e72a00000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -11338,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec34000000000000000000000000c92e9fa369fa4e94c462d9fad4a79ad16f54ef08000000000000000000000000c92e9fa369fa4e94c462d9fad4a79ad16f54ef08000000000000000000000000000000000000000000000000000009184e72a00000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -11339,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec34000000000000000000000000c92e9fa369fa4e94c462d9fad4a79ad16f54ef08000000000000000000000000c92e9fa369fa4e94c462d9fad4a79ad16f54ef08000000000000000000000000000000000000000000000000000009184e72a00000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -11340,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec34000000000000000000000000c92e9fa369fa4e94c462d9fad4a79ad16f54ef08000000000000000000000000c92e9fa369fa4e94c462d9fad4a79ad16f54ef08000000000000000000000000000000000000000000000000000009184e72a00000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -11341,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec34000000000000000000000000f506f4bc57ac62f72e846a781882d037d1dde02b000000000000000000000000f506f4bc57ac62f72e846a781882d037d1dde02b000000000000000000000000000000000000000000000000000009184e72a00000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -11342,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec34000000000000000000000000f506f4bc57ac62f72e846a781882d037d1dde02b000000000000000000000000f506f4bc57ac62f72e846a781882d037d1dde02b000000000000000000000000000000000000000000000000000009184e72a00000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -11343,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec34000000000000000000000000f506f4bc57ac62f72e846a781882d037d1dde02b000000000000000000000000f506f4bc57ac62f72e846a781882d037d1dde02b000000000000000000000000000000000000000000000000000009184e72a00000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -11344,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec34000000000000000000000000f506f4bc57ac62f72e846a781882d037d1dde02b000000000000000000000000f506f4bc57ac62f72e846a781882d037d1dde02b000000000000000000000000000000000000000000000000000009184e72a00000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -11345,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec34000000000000000000000000f506f4bc57ac62f72e846a781882d037d1dde02b000000000000000000000000f506f4bc57ac62f72e846a781882d037d1dde02b000000000000000000000000000000000000000000000000000009184e72a00000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -11346,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec34000000000000000000000000f506f4bc57ac62f72e846a781882d037d1dde02b000000000000000000000000f506f4bc57ac62f72e846a781882d037d1dde02b000000000000000000000000000000000000000000000000000009184e72a00000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -11347,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec34000000000000000000000000f506f4bc57ac62f72e846a781882d037d1dde02b000000000000000000000000f506f4bc57ac62f72e846a781882d037d1dde02b000000000000000000000000000000000000000000000000000009184e72a00000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -11348,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec34000000000000000000000000f506f4bc57ac62f72e846a781882d037d1dde02b000000000000000000000000f506f4bc57ac62f72e846a781882d037d1dde02b000000000000000000000000000000000000000000000000000009184e72a00000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -11349,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec34000000000000000000000000f506f4bc57ac62f72e846a781882d037d1dde02b000000000000000000000000f506f4bc57ac62f72e846a781882d037d1dde02b000000000000000000000000000000000000000000000000000009184e72a00000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -11350,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec34000000000000000000000000f506f4bc57ac62f72e846a781882d037d1dde02b000000000000000000000000f506f4bc57ac62f72e846a781882d037d1dde02b000000000000000000000000000000000000000000000000000009184e72a00000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -11351,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec34000000000000000000000000f506f4bc57ac62f72e846a781882d037d1dde02b000000000000000000000000f506f4bc57ac62f72e846a781882d037d1dde02b000000000000000000000000000000000000000000000000000009184e72a00000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -11352,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec34000000000000000000000000f506f4bc57ac62f72e846a781882d037d1dde02b000000000000000000000000f506f4bc57ac62f72e846a781882d037d1dde02b000000000000000000000000000000000000000000000000000009184e72a00000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -11353,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec34000000000000000000000000f506f4bc57ac62f72e846a781882d037d1dde02b000000000000000000000000f506f4bc57ac62f72e846a781882d037d1dde02b000000000000000000000000000000000000000000000000000009184e72a00000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -11354,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec34000000000000000000000000f506f4bc57ac62f72e846a781882d037d1dde02b000000000000000000000000f506f4bc57ac62f72e846a781882d037d1dde02b000000000000000000000000000000000000000000000000000009184e72a00000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -11355,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec34000000000000000000000000f506f4bc57ac62f72e846a781882d037d1dde02b000000000000000000000000f506f4bc57ac62f72e846a781882d037d1dde02b000000000000000000000000000000000000000000000000000009184e72a00000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -11357,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec3400000000000000000000000005bc0a8aab1923237dd18d5b1b57efcdfc39849500000000000000000000000005bc0a8aab1923237dd18d5b1b57efcdfc398495000000000000000000000000000000000000000000000000000009184e72a00000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -11358,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec3400000000000000000000000005bc0a8aab1923237dd18d5b1b57efcdfc39849500000000000000000000000005bc0a8aab1923237dd18d5b1b57efcdfc398495000000000000000000000000000000000000000000000000000009184e72a00000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -11359,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec3400000000000000000000000005bc0a8aab1923237dd18d5b1b57efcdfc39849500000000000000000000000005bc0a8aab1923237dd18d5b1b57efcdfc398495000000000000000000000000000000000000000000000000000009184e72a00000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -11360,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec3400000000000000000000000005bc0a8aab1923237dd18d5b1b57efcdfc39849500000000000000000000000005bc0a8aab1923237dd18d5b1b57efcdfc398495000000000000000000000000000000000000000000000000000009184e72a00000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -11361,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec3400000000000000000000000005bc0a8aab1923237dd18d5b1b57efcdfc39849500000000000000000000000005bc0a8aab1923237dd18d5b1b57efcdfc398495000000000000000000000000000000000000000000000000000009184e72a00000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -11362,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec3400000000000000000000000005bc0a8aab1923237dd18d5b1b57efcdfc39849500000000000000000000000005bc0a8aab1923237dd18d5b1b57efcdfc398495000000000000000000000000000000000000000000000000000009184e72a00000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -11363,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec3400000000000000000000000005bc0a8aab1923237dd18d5b1b57efcdfc39849500000000000000000000000005bc0a8aab1923237dd18d5b1b57efcdfc398495000000000000000000000000000000000000000000000000000009184e72a00000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -11364,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec3400000000000000000000000005bc0a8aab1923237dd18d5b1b57efcdfc39849500000000000000000000000005bc0a8aab1923237dd18d5b1b57efcdfc398495000000000000000000000000000000000000000000000000000009184e72a00000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -11365,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec3400000000000000000000000005bc0a8aab1923237dd18d5b1b57efcdfc39849500000000000000000000000005bc0a8aab1923237dd18d5b1b57efcdfc398495000000000000000000000000000000000000000000000000000009184e72a00000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -11366,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec3400000000000000000000000005bc0a8aab1923237dd18d5b1b57efcdfc39849500000000000000000000000005bc0a8aab1923237dd18d5b1b57efcdfc398495000000000000000000000000000000000000000000000000000009184e72a00000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -11367,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec3400000000000000000000000005bc0a8aab1923237dd18d5b1b57efcdfc39849500000000000000000000000005bc0a8aab1923237dd18d5b1b57efcdfc398495000000000000000000000000000000000000000000000000000009184e72a00000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -11368,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec3400000000000000000000000005bc0a8aab1923237dd18d5b1b57efcdfc39849500000000000000000000000005bc0a8aab1923237dd18d5b1b57efcdfc398495000000000000000000000000000000000000000000000000000009184e72a00000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -11369,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec3400000000000000000000000005bc0a8aab1923237dd18d5b1b57efcdfc39849500000000000000000000000005bc0a8aab1923237dd18d5b1b57efcdfc398495000000000000000000000000000000000000000000000000000009184e72a00000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -11370,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec3400000000000000000000000005bc0a8aab1923237dd18d5b1b57efcdfc39849500000000000000000000000005bc0a8aab1923237dd18d5b1b57efcdfc398495000000000000000000000000000000000000000000000000000009184e72a00000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -11371,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec3400000000000000000000000005bc0a8aab1923237dd18d5b1b57efcdfc39849500000000000000000000000005bc0a8aab1923237dd18d5b1b57efcdfc398495000000000000000000000000000000000000000000000000000009184e72a00000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -11372,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec3400000000000000000000000005bc0a8aab1923237dd18d5b1b57efcdfc39849500000000000000000000000005bc0a8aab1923237dd18d5b1b57efcdfc398495000000000000000000000000000000000000000000000000000009184e72a00000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -11373,0xcd9d4988c0ae61887b075ba77f08cbfad2b65068,0x3f87ff1de58128ef8fcb4c807efd776e1ac72e51,0xf4f7b41a000000000000000000000000c3ba25500e7ad8e7c6d78682b204fb9e59d7473200000000000000000000000000000000000000000000000d0fdd35ab37e456e1,,,1,true -11374,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec34000000000000000000000000827123b697289543ccc99d5c41bc5a5a9575a087000000000000000000000000827123b697289543ccc99d5c41bc5a5a9575a087000000000000000000000000000000000000000000000000000009184e72a00000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -11375,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec34000000000000000000000000827123b697289543ccc99d5c41bc5a5a9575a087000000000000000000000000827123b697289543ccc99d5c41bc5a5a9575a087000000000000000000000000000000000000000000000000000009184e72a00000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -11376,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec34000000000000000000000000827123b697289543ccc99d5c41bc5a5a9575a087000000000000000000000000827123b697289543ccc99d5c41bc5a5a9575a087000000000000000000000000000000000000000000000000000009184e72a00000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -11377,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec34000000000000000000000000827123b697289543ccc99d5c41bc5a5a9575a087000000000000000000000000827123b697289543ccc99d5c41bc5a5a9575a087000000000000000000000000000000000000000000000000000009184e72a00000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -11378,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec34000000000000000000000000827123b697289543ccc99d5c41bc5a5a9575a087000000000000000000000000827123b697289543ccc99d5c41bc5a5a9575a087000000000000000000000000000000000000000000000000000009184e72a00000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -11379,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec34000000000000000000000000827123b697289543ccc99d5c41bc5a5a9575a087000000000000000000000000827123b697289543ccc99d5c41bc5a5a9575a087000000000000000000000000000000000000000000000000000009184e72a00000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -11380,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec34000000000000000000000000827123b697289543ccc99d5c41bc5a5a9575a087000000000000000000000000827123b697289543ccc99d5c41bc5a5a9575a087000000000000000000000000000000000000000000000000000009184e72a00000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -11381,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec34000000000000000000000000497793742d0774c653fbaa82cde35d1b13252c8e000000000000000000000000497793742d0774c653fbaa82cde35d1b13252c8e00000000000000000000000000000000000000000000000000844acea669563600000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -11383,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec34000000000000000000000000e1031825e9667178167df00c485911847e4f91fe000000000000000000000000e1031825e9667178167df00c485911847e4f91fe000000000000000000000000000000000000000000000000003c6568f12e800000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -11384,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0xa9f9e675000000000000000000000000a0b86991c6218b36c1d19d4a2e9eb0ce3606eb480000000000000000000000007f5c764cbc14f9669b88837ca1490cca17c316070000000000000000000000009349c8c39dd1d5a6271861ce6f9974b2b76142bc0000000000000000000000009349c8c39dd1d5a6271861ce6f9974b2b76142bc000000000000000000000000000000000000000000000000000000004b7df6f700000000000000000000000000000000000000000000000000000000000000c00000000000000000000000000000000000000000000000000000000000000000,,,1,true -11385,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec3400000000000000000000000076916bdbd7b84317365fb3bd157e1606550665b900000000000000000000000076916bdbd7b84317365fb3bd157e1606550665b90000000000000000000000000000000000000000000000000056c9d9e93e3db700000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -11386,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec3400000000000000000000000071a89164464e2c76693c4675254288eb7006af3b00000000000000000000000071a89164464e2c76693c4675254288eb7006af3b000000000000000000000000000000000000000000000000007fdc9a5c17c36500000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -11387,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec34000000000000000000000000ca12f90047176053a219a0046091478de20b3e87000000000000000000000000ca12f90047176053a219a0046091478de20b3e870000000000000000000000000000000000000000000000000018de76816d800000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -11388,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec34000000000000000000000000c7c70dfd9c8a035dcd7c9df7b8e8fe0822ceab6e000000000000000000000000c7c70dfd9c8a035dcd7c9df7b8e8fe0822ceab6e00000000000000000000000000000000000000000000000000a5ccf32cbd974000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,0x06138a8c1028448831c112fb061c00e4f58d7e393856b8db76afc5fdbf86111d,2022-03-22 06:13:54.000 UTC,0,true -11389,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec340000000000000000000000001a8a33b9ce7f931335311ab2add963981ef20e080000000000000000000000001a8a33b9ce7f931335311ab2add963981ef20e0800000000000000000000000000000000000000000000000000470de4df82000000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -11392,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec34000000000000000000000000827123b697289543ccc99d5c41bc5a5a9575a087000000000000000000000000827123b697289543ccc99d5c41bc5a5a9575a087000000000000000000000000000000000000000000000000000009184e72a00000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -11393,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec34000000000000000000000000827123b697289543ccc99d5c41bc5a5a9575a087000000000000000000000000827123b697289543ccc99d5c41bc5a5a9575a087000000000000000000000000000000000000000000000000000009184e72a00000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -11394,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec34000000000000000000000000827123b697289543ccc99d5c41bc5a5a9575a087000000000000000000000000827123b697289543ccc99d5c41bc5a5a9575a087000000000000000000000000000000000000000000000000000009184e72a00000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -11395,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec34000000000000000000000000827123b697289543ccc99d5c41bc5a5a9575a087000000000000000000000000827123b697289543ccc99d5c41bc5a5a9575a087000000000000000000000000000000000000000000000000000009184e72a00000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -11396,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec34000000000000000000000000827123b697289543ccc99d5c41bc5a5a9575a087000000000000000000000000827123b697289543ccc99d5c41bc5a5a9575a087000000000000000000000000000000000000000000000000000009184e72a00000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -11398,0xcd9d4988c0ae61887b075ba77f08cbfad2b65068,0x3f87ff1de58128ef8fcb4c807efd776e1ac72e51,0xf4f7b41a000000000000000000000000f18ad2dc771e36426b96163141b9bf25f8edbc0c000000000000000000000000000000000000000000000000470143d205ae4f4e,,,1,true -11399,0xcd9d4988c0ae61887b075ba77f08cbfad2b65068,0x3f87ff1de58128ef8fcb4c807efd776e1ac72e51,0xf4f7b41a000000000000000000000000d3db1a276dd5571a94863a02c4e02d4513f7aa64000000000000000000000000000000000000000000000007302bd1afcb95c403,,,1,true -11400,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec34000000000000000000000000c29d88b3776aea8abab1d322cf54b05215858ea9000000000000000000000000c29d88b3776aea8abab1d322cf54b05215858ea9000000000000000000000000000000000000000000000000000009184e72a00000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -11401,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec34000000000000000000000000c29d88b3776aea8abab1d322cf54b05215858ea9000000000000000000000000c29d88b3776aea8abab1d322cf54b05215858ea9000000000000000000000000000000000000000000000000000009184e72a00000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -11402,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec34000000000000000000000000c29d88b3776aea8abab1d322cf54b05215858ea9000000000000000000000000c29d88b3776aea8abab1d322cf54b05215858ea9000000000000000000000000000000000000000000000000000009184e72a00000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -11403,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec34000000000000000000000000c29d88b3776aea8abab1d322cf54b05215858ea9000000000000000000000000c29d88b3776aea8abab1d322cf54b05215858ea9000000000000000000000000000000000000000000000000000009184e72a00000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -11404,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec34000000000000000000000000c29d88b3776aea8abab1d322cf54b05215858ea9000000000000000000000000c29d88b3776aea8abab1d322cf54b05215858ea9000000000000000000000000000000000000000000000000000009184e72a00000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -11405,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec34000000000000000000000000c29d88b3776aea8abab1d322cf54b05215858ea9000000000000000000000000c29d88b3776aea8abab1d322cf54b05215858ea9000000000000000000000000000000000000000000000000000009184e72a00000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -11406,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec34000000000000000000000000c29d88b3776aea8abab1d322cf54b05215858ea9000000000000000000000000c29d88b3776aea8abab1d322cf54b05215858ea9000000000000000000000000000000000000000000000000000009184e72a00000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -11407,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec34000000000000000000000000c29d88b3776aea8abab1d322cf54b05215858ea9000000000000000000000000c29d88b3776aea8abab1d322cf54b05215858ea9000000000000000000000000000000000000000000000000000009184e72a00000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -11408,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec34000000000000000000000000c29d88b3776aea8abab1d322cf54b05215858ea9000000000000000000000000c29d88b3776aea8abab1d322cf54b05215858ea9000000000000000000000000000000000000000000000000000009184e72a00000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -11409,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec34000000000000000000000000eebc42b3bb20c202f7941a0ce1febf7cbd23e114000000000000000000000000eebc42b3bb20c202f7941a0ce1febf7cbd23e114000000000000000000000000000000000000000000000000000009184e72a00000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -11410,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec34000000000000000000000000eebc42b3bb20c202f7941a0ce1febf7cbd23e114000000000000000000000000eebc42b3bb20c202f7941a0ce1febf7cbd23e114000000000000000000000000000000000000000000000000000009184e72a00000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -11411,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec34000000000000000000000000eebc42b3bb20c202f7941a0ce1febf7cbd23e114000000000000000000000000eebc42b3bb20c202f7941a0ce1febf7cbd23e114000000000000000000000000000000000000000000000000000009184e72a00000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -11412,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec34000000000000000000000000eebc42b3bb20c202f7941a0ce1febf7cbd23e114000000000000000000000000eebc42b3bb20c202f7941a0ce1febf7cbd23e114000000000000000000000000000000000000000000000000000009184e72a00000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -11413,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec34000000000000000000000000eebc42b3bb20c202f7941a0ce1febf7cbd23e114000000000000000000000000eebc42b3bb20c202f7941a0ce1febf7cbd23e114000000000000000000000000000000000000000000000000000009184e72a00000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -11414,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec34000000000000000000000000eebc42b3bb20c202f7941a0ce1febf7cbd23e114000000000000000000000000eebc42b3bb20c202f7941a0ce1febf7cbd23e114000000000000000000000000000000000000000000000000000009184e72a00000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -11415,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec34000000000000000000000000eebc42b3bb20c202f7941a0ce1febf7cbd23e114000000000000000000000000eebc42b3bb20c202f7941a0ce1febf7cbd23e114000000000000000000000000000000000000000000000000000009184e72a00000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -11416,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec34000000000000000000000000eebc42b3bb20c202f7941a0ce1febf7cbd23e114000000000000000000000000eebc42b3bb20c202f7941a0ce1febf7cbd23e114000000000000000000000000000000000000000000000000000009184e72a00000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -11417,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec34000000000000000000000000eebc42b3bb20c202f7941a0ce1febf7cbd23e114000000000000000000000000eebc42b3bb20c202f7941a0ce1febf7cbd23e114000000000000000000000000000000000000000000000000000009184e72a00000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -11418,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec34000000000000000000000000eebc42b3bb20c202f7941a0ce1febf7cbd23e114000000000000000000000000eebc42b3bb20c202f7941a0ce1febf7cbd23e114000000000000000000000000000000000000000000000000000009184e72a00000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -11419,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec34000000000000000000000000eebc42b3bb20c202f7941a0ce1febf7cbd23e114000000000000000000000000eebc42b3bb20c202f7941a0ce1febf7cbd23e114000000000000000000000000000000000000000000000000000009184e72a00000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -11420,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec34000000000000000000000000eebc42b3bb20c202f7941a0ce1febf7cbd23e114000000000000000000000000eebc42b3bb20c202f7941a0ce1febf7cbd23e114000000000000000000000000000000000000000000000000000009184e72a00000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -11421,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec34000000000000000000000000eebc42b3bb20c202f7941a0ce1febf7cbd23e114000000000000000000000000eebc42b3bb20c202f7941a0ce1febf7cbd23e114000000000000000000000000000000000000000000000000000009184e72a00000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -11422,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec34000000000000000000000000eebc42b3bb20c202f7941a0ce1febf7cbd23e114000000000000000000000000eebc42b3bb20c202f7941a0ce1febf7cbd23e114000000000000000000000000000000000000000000000000000009184e72a00000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -11423,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec34000000000000000000000000b8c3b004f4380b219e220f747661ab7d0f42c10a000000000000000000000000b8c3b004f4380b219e220f747661ab7d0f42c10a000000000000000000000000000000000000000000000000000009184e72a00000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -11424,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec34000000000000000000000000b8c3b004f4380b219e220f747661ab7d0f42c10a000000000000000000000000b8c3b004f4380b219e220f747661ab7d0f42c10a000000000000000000000000000000000000000000000000000009184e72a00000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -11425,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec34000000000000000000000000b8c3b004f4380b219e220f747661ab7d0f42c10a000000000000000000000000b8c3b004f4380b219e220f747661ab7d0f42c10a000000000000000000000000000000000000000000000000000009184e72a00000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -11426,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec34000000000000000000000000b8c3b004f4380b219e220f747661ab7d0f42c10a000000000000000000000000b8c3b004f4380b219e220f747661ab7d0f42c10a000000000000000000000000000000000000000000000000000009184e72a00000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -11427,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec34000000000000000000000000b8c3b004f4380b219e220f747661ab7d0f42c10a000000000000000000000000b8c3b004f4380b219e220f747661ab7d0f42c10a000000000000000000000000000000000000000000000000000009184e72a00000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -11428,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec34000000000000000000000000b8c3b004f4380b219e220f747661ab7d0f42c10a000000000000000000000000b8c3b004f4380b219e220f747661ab7d0f42c10a000000000000000000000000000000000000000000000000000009184e72a00000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -11429,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec34000000000000000000000000b8c3b004f4380b219e220f747661ab7d0f42c10a000000000000000000000000b8c3b004f4380b219e220f747661ab7d0f42c10a000000000000000000000000000000000000000000000000000009184e72a00000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -11430,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec34000000000000000000000000b8c3b004f4380b219e220f747661ab7d0f42c10a000000000000000000000000b8c3b004f4380b219e220f747661ab7d0f42c10a000000000000000000000000000000000000000000000000000009184e72a00000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -11431,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec34000000000000000000000000b8c3b004f4380b219e220f747661ab7d0f42c10a000000000000000000000000b8c3b004f4380b219e220f747661ab7d0f42c10a000000000000000000000000000000000000000000000000000009184e72a00000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -11432,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec34000000000000000000000000b8c3b004f4380b219e220f747661ab7d0f42c10a000000000000000000000000b8c3b004f4380b219e220f747661ab7d0f42c10a000000000000000000000000000000000000000000000000000009184e72a00000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -11433,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec34000000000000000000000000d8ae114d43770bea2b50ec7c8ac2fec87a1d872a000000000000000000000000d8ae114d43770bea2b50ec7c8ac2fec87a1d872a0000000000000000000000000000000000000000000000000028d332a8552d6900000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -11434,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec3400000000000000000000000072bb27dec00202d977aa870fdc8487c89939713900000000000000000000000072bb27dec00202d977aa870fdc8487c89939713900000000000000000000000000000000000000000000000000138a388a43c00000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -11435,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec3400000000000000000000000052a7160ab9e27d5cf95fc572d93c39d8b0559a5900000000000000000000000052a7160ab9e27d5cf95fc572d93c39d8b0559a59000000000000000000000000000000000000000000000000054ccb1648dfe00000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -11436,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec3400000000000000000000000077e39267e87fdd02d62d831708b7e1152710397c00000000000000000000000077e39267e87fdd02d62d831708b7e1152710397c0000000000000000000000000000000000000000000000000de0471ef3418b0000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,0x9f9ffcfb613b16551bfdea64531c1b7e088a5c09180b53c9a4ac63931443751f,2022-01-06 11:04:31.000 UTC,0,true -11437,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec340000000000000000000000009c57037d4dbbb992ed3984b20a24ed08007475ab0000000000000000000000009c57037d4dbbb992ed3984b20a24ed08007475ab0000000000000000000000000000000000000000000000001bc032473adb080000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -11438,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec34000000000000000000000000bb2879457867f5aa85f6e5a789905ed8c1a83403000000000000000000000000bb2879457867f5aa85f6e5a789905ed8c1a834030000000000000000000000000000000000000000000000000de14438ced6c60000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,0xd037f8611717f669076002704fcf28acf3435862da99d0b2dac33c8864502abc,2022-01-06 10:52:38.000 UTC,0,true -11439,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec34000000000000000000000000f9c123d5642e424f1b059e17ea09fc596b6469bb000000000000000000000000f9c123d5642e424f1b059e17ea09fc596b6469bb0000000000000000000000000000000000000000000000000ddda681a139580000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -11440,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec34000000000000000000000000daaf3d7ce4c025714586c2590c9072a4698fc4b3000000000000000000000000daaf3d7ce4c025714586c2590c9072a4698fc4b30000000000000000000000000000000000000000000000000033ade4f34f250c00000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -11443,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec340000000000000000000000003a892bf6aebae2de008edefa9a25eae5e7a9313a0000000000000000000000003a892bf6aebae2de008edefa9a25eae5e7a9313a00000000000000000000000000000000000000000000000000071afd498d000000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -11444,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec340000000000000000000000008989eb731524c22e2c76f161a10dfdb7051205040000000000000000000000008989eb731524c22e2c76f161a10dfdb70512050400000000000000000000000000000000000000000000000000038d7ea4c6800000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -11445,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec34000000000000000000000000bff4062c3029ea1591c13b3ba0574f4d50c66c76000000000000000000000000bff4062c3029ea1591c13b3ba0574f4d50c66c7600000000000000000000000000000000000000000000000000bfab2a59d2aec200000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -11446,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec34000000000000000000000000783da486c76b4f2767605869e2c88d145c307818000000000000000000000000783da486c76b4f2767605869e2c88d145c30781800000000000000000000000000000000000000000000000000071afd498d000000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -11447,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec34000000000000000000000000f9107317b0ff77ed5b7adea15e50514a3564002b000000000000000000000000f9107317b0ff77ed5b7adea15e50514a3564002b0000000000000000000000000000000000000000000000000de0b6b3a764000000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -11448,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec34000000000000000000000000c447e511495c761808b76e9d0792a9f45bd145be000000000000000000000000c447e511495c761808b76e9d0792a9f45bd145be00000000000000000000000000000000000000000000000000071afd498d000000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -11452,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec34000000000000000000000000b16c8220b3a2f31e569f6dda03ec0bf39e9be439000000000000000000000000b16c8220b3a2f31e569f6dda03ec0bf39e9be43900000000000000000000000000000000000000000000000000475fbfa842118d00000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -11454,0xcd9d4988c0ae61887b075ba77f08cbfad2b65068,0x3f87ff1de58128ef8fcb4c807efd776e1ac72e51,0xf4f7b41a0000000000000000000000007782c1c31f0eed9ebf466d78beec0cb0cd2b51af000000000000000000000000000000000000000000000000976b35e09eb77c1a,,,1,true -11455,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec340000000000000000000000004351884e49eef08ea1bc7528f3e32ad4ef1f4b080000000000000000000000004351884e49eef08ea1bc7528f3e32ad4ef1f4b08000000000000000000000000000000000000000000000000002d49faef92660200000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -11456,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec3400000000000000000000000035a07be085ecac45aee8dddd71467b6b45a7aa1200000000000000000000000035a07be085ecac45aee8dddd71467b6b45a7aa12000000000000000000000000000000000000000000000000007c58508723800000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -11460,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec3400000000000000000000000080046121d4c997e9affccce59bef6689795c8c0d00000000000000000000000080046121d4c997e9affccce59bef6689795c8c0d00000000000000000000000000000000000000000000000000013e52b9abe00000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -11462,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0xa9f9e675000000000000000000000000a0b86991c6218b36c1d19d4a2e9eb0ce3606eb480000000000000000000000007f5c764cbc14f9669b88837ca1490cca17c31607000000000000000000000000db5d39414fab620dd38e5a477ab58320b10f42c9000000000000000000000000db5d39414fab620dd38e5a477ab58320b10f42c9000000000000000000000000000000000000000000000000000000000073d3cb00000000000000000000000000000000000000000000000000000000000000c00000000000000000000000000000000000000000000000000000000000000000,,,1,true -11463,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec34000000000000000000000000db5d39414fab620dd38e5a477ab58320b10f42c9000000000000000000000000db5d39414fab620dd38e5a477ab58320b10f42c900000000000000000000000000000000000000000000000000a86e9f68f2fac000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -11464,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec34000000000000000000000000d9c8863c71377123ba2ea383b8c537d0d683db85000000000000000000000000d9c8863c71377123ba2ea383b8c537d0d683db850000000000000000000000000000000000000000000000000013246c8318a20000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -11465,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec3400000000000000000000000072988183250af3ffeeb3ab47731b924a8cc6c16000000000000000000000000072988183250af3ffeeb3ab47731b924a8cc6c16000000000000000000000000000000000000000000000000000013e52b9abe00000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -11467,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec340000000000000000000000000dc277d26a32808b9517ec5809164305f38ab2e30000000000000000000000000dc277d26a32808b9517ec5809164305f38ab2e3000000000000000000000000000000000000000000000000001314bef78d2f0900000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -11468,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec3400000000000000000000000063baa2dc5597bcce4bbbf60f27901d726c34436c00000000000000000000000063baa2dc5597bcce4bbbf60f27901d726c34436c0000000000000000000000000000000000000000000000000019d820b6a02d4900000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -11469,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec34000000000000000000000000c81de614aa8f239c355671ddb21caa46ce3e7e2d000000000000000000000000c81de614aa8f239c355671ddb21caa46ce3e7e2d0000000000000000000000000000000000000000000000000078cad1e25d000000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -11470,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec34000000000000000000000000c81de614aa8f239c355671ddb21caa46ce3e7e2d000000000000000000000000c81de614aa8f239c355671ddb21caa46ce3e7e2d000000000000000000000000000000000000000000000000000009184e72a00000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -11471,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec34000000000000000000000000246d62740b17059764ae74a8c44de2d85836da8b000000000000000000000000246d62740b17059764ae74a8c44de2d85836da8b0000000000000000000000000000000000000000000000000078cad1e25d000000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -11472,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec34000000000000000000000000246d62740b17059764ae74a8c44de2d85836da8b000000000000000000000000246d62740b17059764ae74a8c44de2d85836da8b000000000000000000000000000000000000000000000000000009184e72a00000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -11473,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec3400000000000000000000000007e8e46620dfbe263f7a90ac2e3ae5aa5bfe528100000000000000000000000007e8e46620dfbe263f7a90ac2e3ae5aa5bfe52810000000000000000000000000000000000000000000000000078cad1e25d000000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -11474,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec3400000000000000000000000007e8e46620dfbe263f7a90ac2e3ae5aa5bfe528100000000000000000000000007e8e46620dfbe263f7a90ac2e3ae5aa5bfe5281000000000000000000000000000000000000000000000000000009184e72a00000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -11475,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec340000000000000000000000008cbdf071dea2ea6fb8d69ddb2b67d7bbdc5f544f0000000000000000000000008cbdf071dea2ea6fb8d69ddb2b67d7bbdc5f544f0000000000000000000000000000000000000000000000000078cad1e25d000000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -11476,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec340000000000000000000000008cbdf071dea2ea6fb8d69ddb2b67d7bbdc5f544f0000000000000000000000008cbdf071dea2ea6fb8d69ddb2b67d7bbdc5f544f000000000000000000000000000000000000000000000000000009184e72a00000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -11477,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec340000000000000000000000000814069653b9538da6d3c78281125c62f38736e20000000000000000000000000814069653b9538da6d3c78281125c62f38736e20000000000000000000000000000000000000000000000000078cad1e25d000000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -11478,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec340000000000000000000000000814069653b9538da6d3c78281125c62f38736e20000000000000000000000000814069653b9538da6d3c78281125c62f38736e2000000000000000000000000000000000000000000000000000009184e72a00000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -11479,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec34000000000000000000000000205c0c15b6ca60b7388947f9a300423212f514be000000000000000000000000205c0c15b6ca60b7388947f9a300423212f514be0000000000000000000000000000000000000000000000000078cad1e25d000000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -11480,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec34000000000000000000000000205c0c15b6ca60b7388947f9a300423212f514be000000000000000000000000205c0c15b6ca60b7388947f9a300423212f514be000000000000000000000000000000000000000000000000000009184e72a00000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -11481,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec340000000000000000000000009bada5a8d176bc93fde52317ae018a411324e1be0000000000000000000000009bada5a8d176bc93fde52317ae018a411324e1be0000000000000000000000000000000000000000000000000078cad1e25d000000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -11482,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec340000000000000000000000009bada5a8d176bc93fde52317ae018a411324e1be0000000000000000000000009bada5a8d176bc93fde52317ae018a411324e1be000000000000000000000000000000000000000000000000000009184e72a00000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -11483,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec34000000000000000000000000b2402f982a63800207dd232b6a05f4239173ec76000000000000000000000000b2402f982a63800207dd232b6a05f4239173ec760000000000000000000000000000000000000000000000000078cad1e25d000000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -11484,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec34000000000000000000000000b2402f982a63800207dd232b6a05f4239173ec76000000000000000000000000b2402f982a63800207dd232b6a05f4239173ec76000000000000000000000000000000000000000000000000000009184e72a00000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -11485,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec34000000000000000000000000b0ab5a849eee3e75068333c4b771833f9c828ace000000000000000000000000b0ab5a849eee3e75068333c4b771833f9c828ace0000000000000000000000000000000000000000000000000078cad1e25d000000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -11486,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec34000000000000000000000000b0ab5a849eee3e75068333c4b771833f9c828ace000000000000000000000000b0ab5a849eee3e75068333c4b771833f9c828ace000000000000000000000000000000000000000000000000000009184e72a00000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -11487,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec340000000000000000000000006bce4d74a1306acc91ee88ad1eb14844f1e0d9780000000000000000000000006bce4d74a1306acc91ee88ad1eb14844f1e0d9780000000000000000000000000000000000000000000000000078cad1e25d000000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -11488,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec340000000000000000000000006bce4d74a1306acc91ee88ad1eb14844f1e0d9780000000000000000000000006bce4d74a1306acc91ee88ad1eb14844f1e0d9780000000000000000000000000000000000000000000000000078cad1e25d000000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -11489,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec340000000000000000000000006bce4d74a1306acc91ee88ad1eb14844f1e0d9780000000000000000000000006bce4d74a1306acc91ee88ad1eb14844f1e0d978000000000000000000000000000000000000000000000000000009184e72a00000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -11490,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec34000000000000000000000000a0f4c9de49d53d84709df1ed8c4947591c571dd2000000000000000000000000a0f4c9de49d53d84709df1ed8c4947591c571dd20000000000000000000000000000000000000000000000000078cad1e25d000000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -11491,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec34000000000000000000000000a0f4c9de49d53d84709df1ed8c4947591c571dd2000000000000000000000000a0f4c9de49d53d84709df1ed8c4947591c571dd2000000000000000000000000000000000000000000000000000009184e72a00000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -11492,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec34000000000000000000000000b058cd01a21a907453e201b927f258646ce75175000000000000000000000000b058cd01a21a907453e201b927f258646ce751750000000000000000000000000000000000000000000000000078cad1e25d000000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -11493,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec34000000000000000000000000b058cd01a21a907453e201b927f258646ce75175000000000000000000000000b058cd01a21a907453e201b927f258646ce75175000000000000000000000000000000000000000000000000000009184e72a00000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -11494,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec3400000000000000000000000020a85c450eb7c40c89dab5ab61ac43eedd6a211300000000000000000000000020a85c450eb7c40c89dab5ab61ac43eedd6a21130000000000000000000000000000000000000000000000000078cad1e25d000000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -11495,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec3400000000000000000000000020a85c450eb7c40c89dab5ab61ac43eedd6a211300000000000000000000000020a85c450eb7c40c89dab5ab61ac43eedd6a2113000000000000000000000000000000000000000000000000000009184e72a00000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -11496,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec3400000000000000000000000081e4286ae422fa457cefa1435dd44ae0bb9286ef00000000000000000000000081e4286ae422fa457cefa1435dd44ae0bb9286ef0000000000000000000000000000000000000000000000000078cad1e25d000000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -11497,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec3400000000000000000000000081e4286ae422fa457cefa1435dd44ae0bb9286ef00000000000000000000000081e4286ae422fa457cefa1435dd44ae0bb9286ef000000000000000000000000000000000000000000000000000009184e72a00000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -11498,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec340000000000000000000000000297b4d91270a60e31336cfe27175168ba37949f0000000000000000000000000297b4d91270a60e31336cfe27175168ba37949f000000000000000000000000000000000000000000000000015cf863e114dd4000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -11500,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec340000000000000000000000004d75e5fdf2ffd3453434d89ca32e67b94b9331b70000000000000000000000004d75e5fdf2ffd3453434d89ca32e67b94b9331b7000000000000000000000000000000000000000000000000000009184e72a00000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -11501,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0xa9f9e675000000000000000000000000a0b86991c6218b36c1d19d4a2e9eb0ce3606eb480000000000000000000000007f5c764cbc14f9669b88837ca1490cca17c3160700000000000000000000000004c411485477522813167cfecc71393ea8b2ca0100000000000000000000000004c411485477522813167cfecc71393ea8b2ca0100000000000000000000000000000000000000000000000000000000034e21d000000000000000000000000000000000000000000000000000000000000000c00000000000000000000000000000000000000000000000000000000000000000,,,1,true -11503,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec34000000000000000000000000ba8180be54f0ba63b522cf0b7aa0c224e8f85e2f000000000000000000000000ba8180be54f0ba63b522cf0b7aa0c224e8f85e2f000000000000000000000000000000000000000000000000001aa71cdf88da3100000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -11504,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec340000000000000000000000000d41aa4577d756c05bff040abfd9b106056479290000000000000000000000000d41aa4577d756c05bff040abfd9b10605647929000000000000000000000000000000000000000000000000000009184e72a00000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -11505,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec340000000000000000000000000d41aa4577d756c05bff040abfd9b106056479290000000000000000000000000d41aa4577d756c05bff040abfd9b10605647929000000000000000000000000000000000000000000000000000009184e72a00000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -11506,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec340000000000000000000000000d41aa4577d756c05bff040abfd9b106056479290000000000000000000000000d41aa4577d756c05bff040abfd9b10605647929000000000000000000000000000000000000000000000000000009184e72a00000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -11507,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec3400000000000000000000000029acac16c2d740838ad2ea70906f7770ff7d61d500000000000000000000000029acac16c2d740838ad2ea70906f7770ff7d61d500000000000000000000000000000000000000000000000002b3b697072410f400000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,0xa819870defd32e40a530bba66ce1c2a20587ec83732ec8c4d7e1aa93fcde9fe3,2022-04-21 00:40:19.000 UTC,0,true -11509,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec340000000000000000000000008be11e449bc40d84c94ef7cc4b7fc7e05fda80110000000000000000000000008be11e449bc40d84c94ef7cc4b7fc7e05fda801100000000000000000000000000000000000000000000000000683a6e4f78360000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -11510,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec34000000000000000000000000d52d6970660cf9b5fb02be7c8c9accd14e57de30000000000000000000000000d52d6970660cf9b5fb02be7c8c9accd14e57de300000000000000000000000000000000000000000000000000152451ac8208f8400000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -11512,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec340000000000000000000000000a0d941e4ab7ae78b1f287a5df076d88338466460000000000000000000000000a0d941e4ab7ae78b1f287a5df076d8833846646000000000000000000000000000000000000000000000000000009184e72a00000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -11513,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec340000000000000000000000000a0d941e4ab7ae78b1f287a5df076d88338466460000000000000000000000000a0d941e4ab7ae78b1f287a5df076d8833846646000000000000000000000000000000000000000000000000000009184e72a00000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -11514,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec34000000000000000000000000e4b5364b23202aa18bb38c6b82bcc0910ad8eec4000000000000000000000000e4b5364b23202aa18bb38c6b82bcc0910ad8eec40000000000000000000000000000000000000000000000000000ffd0a23a250000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -11515,0xcd9d4988c0ae61887b075ba77f08cbfad2b65068,0x3f87ff1de58128ef8fcb4c807efd776e1ac72e51,0xf4f7b41a00000000000000000000000039f6a4c70c582d90b403f2d72d897577830fa45b0000000000000000000000000000000000000000000000002a9046a26e95f6e2,0x92ad0957ac447e4bf29551326dfb8aea7318333b9e7f494395f6f336716e5ee1,2022-05-06 09:32:13.000 UTC,0,true -11516,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec3400000000000000000000000048618c2aa5367a39d3e5b50c1c73a20c8a526dc600000000000000000000000048618c2aa5367a39d3e5b50c1c73a20c8a526dc600000000000000000000000000000000000000000000000000b1a2bc2ec5000000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,0xe7bce3571c11d9b4643de81b6be89e2114c144a75f01a1c44d33e639557c805f,2022-08-04 12:57:56.000 UTC,0,true -11519,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0xa9f9e675000000000000000000000000a0b86991c6218b36c1d19d4a2e9eb0ce3606eb480000000000000000000000007f5c764cbc14f9669b88837ca1490cca17c31607000000000000000000000000c42bf74b2994882212034f15342cbe3520ef50d5000000000000000000000000c42bf74b2994882212034f15342cbe3520ef50d5000000000000000000000000000000000000000000000000000000000a31acbd00000000000000000000000000000000000000000000000000000000000000c00000000000000000000000000000000000000000000000000000000000000000,,,1,true -11521,0x10e6593cdda8c58a1d0f14c5164b376352a55f2f,0x467194771dae2967aef3ecbedd3bf9a310c76c65,0xa9f9e6750000000000000000000000006b175474e89094c44da98b954eedeac495271d0f000000000000000000000000da10009cbd5d07dd0cecc66161fc93d7c9000da100000000000000000000000060a9a65a99fdb184b6d2ba75010a789b725979c600000000000000000000000060a9a65a99fdb184b6d2ba75010a789b725979c60000000000000000000000000000000000000000000000000de433da14b5d66200000000000000000000000000000000000000000000000000000000000000c00000000000000000000000000000000000000000000000000000000000000000,,,1,true -11527,0x10e6593cdda8c58a1d0f14c5164b376352a55f2f,0x467194771dae2967aef3ecbedd3bf9a310c76c65,0xa9f9e6750000000000000000000000006b175474e89094c44da98b954eedeac495271d0f000000000000000000000000da10009cbd5d07dd0cecc66161fc93d7c9000da10000000000000000000000006710f4d73f116f7204629d511dbfff128f6aed290000000000000000000000006710f4d73f116f7204629d511dbfff128f6aed290000000000000000000000000000000000000000000000000f123f3f0213000000000000000000000000000000000000000000000000000000000000000000c00000000000000000000000000000000000000000000000000000000000000000,,,1,true -11528,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec340000000000000000000000004e558abb2f5a0dec4192a71ffcce766a2986fc900000000000000000000000004e558abb2f5a0dec4192a71ffcce766a2986fc9000000000000000000000000000000000000000000000000000060a24181e400000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -11529,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec3400000000000000000000000057cc8aeb3765b260fa6e058104cf56dbf7cf051300000000000000000000000057cc8aeb3765b260fa6e058104cf56dbf7cf051300000000000000000000000000000000000000000000000000e835dc79935ad100000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,0x085b6dbd607994e4287a09a0020f1c5b1e5ee0b909020acd3ff39836b23ec6e1,2022-04-21 00:43:07.000 UTC,0,true -11530,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec34000000000000000000000000f2fe5797f43f6e1932b9e78c3aa4599ca8f92e83000000000000000000000000f2fe5797f43f6e1932b9e78c3aa4599ca8f92e830000000000000000000000000000000000000000000000000045a17b942c0f0000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -11531,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec340000000000000000000000000e760f55753a38ef936aab6c1e6e9b6951afca1f0000000000000000000000000e760f55753a38ef936aab6c1e6e9b6951afca1f00000000000000000000000000000000000000000000000000354a6ba7a1800000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -11532,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec34000000000000000000000000890bf4a988c8c846fdeb8a35aed0f53fb139904c000000000000000000000000890bf4a988c8c846fdeb8a35aed0f53fb139904c000000000000000000000000000000000000000000000000003a96c516ac3b2a00000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -11533,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec340000000000000000000000009e939d5f4ea6566a1a1f674d16446d83d60dbba40000000000000000000000009e939d5f4ea6566a1a1f674d16446d83d60dbba400000000000000000000000000000000000000000000000000016bcc41e9000000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -11534,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec340000000000000000000000003d226904f0584d1ed41bacb99d295d41757719330000000000000000000000003d226904f0584d1ed41bacb99d295d41757719330000000000000000000000000000000000000000000000000011c37937e0800000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -11535,0x10e6593cdda8c58a1d0f14c5164b376352a55f2f,0x467194771dae2967aef3ecbedd3bf9a310c76c65,0xa9f9e6750000000000000000000000006b175474e89094c44da98b954eedeac495271d0f000000000000000000000000da10009cbd5d07dd0cecc66161fc93d7c9000da10000000000000000000000003d226904f0584d1ed41bacb99d295d41757719330000000000000000000000003d226904f0584d1ed41bacb99d295d41757719330000000000000000000000000000000000000000000000008ac7230489e8000000000000000000000000000000000000000000000000000000000000000000c00000000000000000000000000000000000000000000000000000000000000000,,,1,true -11537,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec340000000000000000000000004372586e924a21264c5c2ef74aeea85dda9d17b60000000000000000000000004372586e924a21264c5c2ef74aeea85dda9d17b6000000000000000000000000000000000000000000000000011a571a18f6d20000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -11541,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec340000000000000000000000002f9ea193a21b446f62264a8f0c354c293447507f0000000000000000000000002f9ea193a21b446f62264a8f0c354c293447507f0000000000000000000000000000000000000000000000000015b83a6a9a5eb600000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -11542,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0xa9f9e675000000000000000000000000a0b86991c6218b36c1d19d4a2e9eb0ce3606eb480000000000000000000000007f5c764cbc14f9669b88837ca1490cca17c31607000000000000000000000000c61f03c27a1df9c5f1967c98f0c33a86db2e5e87000000000000000000000000c61f03c27a1df9c5f1967c98f0c33a86db2e5e870000000000000000000000000000000000000000000000000000000000b71b0000000000000000000000000000000000000000000000000000000000000000c00000000000000000000000000000000000000000000000000000000000000000,,,1,true -11544,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0xa9f9e675000000000000000000000000dac17f958d2ee523a2206206994597c13d831ec700000000000000000000000094b008aa00579c1307b0ef2c499ad98a8ce58e580000000000000000000000000694580c722c01e65125a2013d3e83a360d78faa0000000000000000000000000694580c722c01e65125a2013d3e83a360d78faa000000000000000000000000000000000000000000000000000000000296baa800000000000000000000000000000000000000000000000000000000000000c00000000000000000000000000000000000000000000000000000000000000000,,,1,true -11545,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec340000000000000000000000000694580c722c01e65125a2013d3e83a360d78faa0000000000000000000000000694580c722c01e65125a2013d3e83a360d78faa000000000000000000000000000000000000000000000000001611a9b980b6c000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -11547,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec340000000000000000000000008620262510c86943fd841ec2047dfc2953afaea40000000000000000000000008620262510c86943fd841ec2047dfc2953afaea4000000000000000000000000000000000000000000000000006b6a681ce4941f00000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -11551,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec340000000000000000000000006e9d2c76cf11bd7720b723743a49a422a41744990000000000000000000000006e9d2c76cf11bd7720b723743a49a422a417449900000000000000000000000000000000000000000000000000012c221cc6a00000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -11553,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0xa9f9e675000000000000000000000000a0b86991c6218b36c1d19d4a2e9eb0ce3606eb480000000000000000000000007f5c764cbc14f9669b88837ca1490cca17c31607000000000000000000000000158dc5b8d904b089e60f26dc6e46c7eaaa45ab19000000000000000000000000158dc5b8d904b089e60f26dc6e46c7eaaa45ab190000000000000000000000000000000000000000000000000000000001cd048700000000000000000000000000000000000000000000000000000000000000c00000000000000000000000000000000000000000000000000000000000000000,,,1,true -11555,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec340000000000000000000000003ad8c8b5e49ca573b5773d1341f94a0cf4a7f87e0000000000000000000000003ad8c8b5e49ca573b5773d1341f94a0cf4a7f87e000000000000000000000000000000000000000000000000000009184e72a00000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -11556,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec34000000000000000000000000acb7acab4753e146b4b96dba23001a6e4b9641f4000000000000000000000000acb7acab4753e146b4b96dba23001a6e4b9641f40000000000000000000000000000000000000000000000000001267fd9b60f0000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -11557,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec3400000000000000000000000009adcfbb8130121d16f97f8b3c85577290eada2100000000000000000000000009adcfbb8130121d16f97f8b3c85577290eada2100000000000000000000000000000000000000000000000000015c79c45df20000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -11558,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec34000000000000000000000000a74b807ba83d2d8e1eb89c52e7755d71b6997b7e000000000000000000000000a74b807ba83d2d8e1eb89c52e7755d71b6997b7e00000000000000000000000000000000000000000000000000014a047819ec0000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -11559,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec34000000000000000000000000577261ec9ee56d7aba53992a461b5354a93bb18e000000000000000000000000577261ec9ee56d7aba53992a461b5354a93bb18e00000000000000000000000000000000000000000000000000018b75cc50ea0000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -11560,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec3400000000000000000000000008a5a39e310735d307bdf5a9d85cd43ea68a763d00000000000000000000000008a5a39e310735d307bdf5a9d85cd43ea68a763d0000000000000000000000000000000000000000000000000001398456d55b0000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -11561,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec3400000000000000000000000091dfa6495e82f9693d8861df38000c07c45e5c6100000000000000000000000091dfa6495e82f9693d8861df38000c07c45e5c610000000000000000000000000000000000000000000000000001398456d55b0000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -11562,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec340000000000000000000000008774e03db6408f86a0ba2c0efa72785da6aba95e0000000000000000000000008774e03db6408f86a0ba2c0efa72785da6aba95e00000000000000000000000000000000000000000000000000014395c640470000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -11563,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec3400000000000000000000000064811f98714304766366fe5aa4c46113f1045d9700000000000000000000000064811f98714304766366fe5aa4c46113f1045d9700000000000000000000000000000000000000000000000000014395c640470000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -11564,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec34000000000000000000000000f6e8bbf21e37a54e03350d535f929e1817cb6efc000000000000000000000000f6e8bbf21e37a54e03350d535f929e1817cb6efc000000000000000000000000000000000000000000000000000104a8cde4040000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -11565,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec340000000000000000000000003779a82f00cd8d1aa38f29645553511b8730692b0000000000000000000000003779a82f00cd8d1aa38f29645553511b8730692b000000000000000000000000000000000000000000000000000104a8cde4040000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -11566,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec34000000000000000000000000dcd47ce5f406cc7538a421c6370e9205fd3bc58e000000000000000000000000dcd47ce5f406cc7538a421c6370e9205fd3bc58e000000000000000000000000000000000000000000000000000104a8cde4040000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -11567,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec340000000000000000000000000a0d941e4ab7ae78b1f287a5df076d88338466460000000000000000000000000a0d941e4ab7ae78b1f287a5df076d8833846646000000000000000000000000000000000000000000000000000009184e72a00000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -11568,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec34000000000000000000000000fbd1532d9e42a011f96a5525ab92ad65e7aa84bb000000000000000000000000fbd1532d9e42a011f96a5525ab92ad65e7aa84bb0000000000000000000000000000000000000000000000000000a118d56d580000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -11569,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec340000000000000000000000000a0d941e4ab7ae78b1f287a5df076d88338466460000000000000000000000000a0d941e4ab7ae78b1f287a5df076d8833846646000000000000000000000000000000000000000000000000000009184e72a00000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -11570,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec34000000000000000000000000f1b8fe74b07117cd9366efb8b8dac6a297f4c342000000000000000000000000f1b8fe74b07117cd9366efb8b8dac6a297f4c34200000000000000000000000000000000000000000000000000039ccef756f84000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -11571,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec34000000000000000000000000e73a86165f7af016a226ac479e0bac466014609e000000000000000000000000e73a86165f7af016a226ac479e0bac466014609e0000000000000000000000000000000000000000000000000000a118d56d580000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -11572,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec340000000000000000000000000a0d941e4ab7ae78b1f287a5df076d88338466460000000000000000000000000a0d941e4ab7ae78b1f287a5df076d8833846646000000000000000000000000000000000000000000000000000009184e72a00000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -11573,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec3400000000000000000000000002abe428abc766f084717edd95719e2db9b43d0300000000000000000000000002abe428abc766f084717edd95719e2db9b43d030000000000000000000000000000000000000000000000000000a118d56d580000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -11574,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec340000000000000000000000000e8414bc362f1467660f38745dd8bfc0d6e28dbc0000000000000000000000000e8414bc362f1467660f38745dd8bfc0d6e28dbc0000000000000000000000000000000000000000000000000000a118d56d580000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -11575,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec34000000000000000000000000f0b65f3c1f0b85431296df9340e34388a63891c1000000000000000000000000f0b65f3c1f0b85431296df9340e34388a63891c100000000000000000000000000000000000000000000000000001b22a0495b0000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -11576,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec340000000000000000000000008894e730951204b7d64e1f59d49709338545bcc80000000000000000000000008894e730951204b7d64e1f59d49709338545bcc80000000000000000000000000000000000000000000000000000a473fa90fc0000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -11577,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec340000000000000000000000008753f2d2c6ae30915ff0f0c2c6dbc4bcb538ffef0000000000000000000000008753f2d2c6ae30915ff0f0c2c6dbc4bcb538ffef0000000000000000000000000000000000000000000000000001002f4709d40000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -11578,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec34000000000000000000000000bcffb44d92c56976fabcd4de6115cf56a7bc7146000000000000000000000000bcffb44d92c56976fabcd4de6115cf56a7bc714600000000000000000000000000000000000000000000000000006d5bae328d0000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -11579,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec34000000000000000000000000f8892b736ffc855e4eecf6b3ab947c61a340cb28000000000000000000000000f8892b736ffc855e4eecf6b3ab947c61a340cb2800000000000000000000000000000000000000000000000000006d5bae328d0000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -11580,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec3400000000000000000000000030cd54e2a9d82760ba591a51c83cd883974dab5200000000000000000000000030cd54e2a9d82760ba591a51c83cd883974dab5200000000000000000000000000000000000000000000000000006d5bae328d0000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -11581,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec340000000000000000000000003c61c0b9ff192b495a1099cbf917c833c8c086190000000000000000000000003c61c0b9ff192b495a1099cbf917c833c8c086190000000000000000000000000000000000000000000000000000c1424ead910000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -11582,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec340000000000000000000000006bb1d9bd63345e604f020558e9058df365285fc00000000000000000000000006bb1d9bd63345e604f020558e9058df365285fc00000000000000000000000000000000000000000000000000000c1424ead910000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -11583,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec340000000000000000000000000a0d941e4ab7ae78b1f287a5df076d88338466460000000000000000000000000a0d941e4ab7ae78b1f287a5df076d8833846646000000000000000000000000000000000000000000000000000009184e72a00000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -11584,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec340000000000000000000000000a0d941e4ab7ae78b1f287a5df076d88338466460000000000000000000000000a0d941e4ab7ae78b1f287a5df076d8833846646000000000000000000000000000000000000000000000000000009184e72a00000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -11585,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec3400000000000000000000000093e4abd1c5460d06260eca4de43c31ec5264c5af00000000000000000000000093e4abd1c5460d06260eca4de43c31ec5264c5af0000000000000000000000000000000000000000000000000000d5652d83690000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -11586,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec34000000000000000000000000646131fdebeb2db7a1b3c4cb174b916cd0a319be000000000000000000000000646131fdebeb2db7a1b3c4cb174b916cd0a319be0000000000000000000000000000000000000000000000000000899ad173dc0000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -11587,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec34000000000000000000000000cb49c0142bb393376f1e7504f159fca9a46e9e44000000000000000000000000cb49c0142bb393376f1e7504f159fca9a46e9e4400000000000000000000000000000000000000000000000000009f6b42db860000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -11588,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec340000000000000000000000003c94b4d98fe35e7334bfc8cb8415830b9de454f90000000000000000000000003c94b4d98fe35e7334bfc8cb8415830b9de454f900000000000000000000000000000000000000000000000000004320c587680000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -11589,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec34000000000000000000000000525e1aac73a5d4f5d61dc802fe2246673fea9e92000000000000000000000000525e1aac73a5d4f5d61dc802fe2246673fea9e9200000000000000000000000000000000000000000000000000004320c587680000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -11590,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec3400000000000000000000000007cb7e8fae5ceafa9ef063b54aa3258045c5023000000000000000000000000007cb7e8fae5ceafa9ef063b54aa3258045c5023000000000000000000000000000000000000000000000000000004320c587680000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -11591,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec340000000000000000000000004ab5f2ab0de0455ba06ecea8502da721f005b5330000000000000000000000004ab5f2ab0de0455ba06ecea8502da721f005b53300000000000000000000000000000000000000000000000000004320c587680000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -11592,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec34000000000000000000000000e4a6bb16eca4a584cf8ba21dd86fc52da6693c50000000000000000000000000e4a6bb16eca4a584cf8ba21dd86fc52da6693c5000000000000000000000000000000000000000000000000000004320c587680000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -11593,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec340000000000000000000000003960f374c35d8b13502528b24f55c3037387eca70000000000000000000000003960f374c35d8b13502528b24f55c3037387eca700000000000000000000000000000000000000000000000000004320c587680000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -11594,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec340000000000000000000000007730fa4b23e5a0f6e01aa058eff275f155dc40030000000000000000000000007730fa4b23e5a0f6e01aa058eff275f155dc400300000000000000000000000000000000000000000000000000002ddf84fb040000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -11595,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec3400000000000000000000000047a20e747763e82dd6e6339cc4f551c6d94552f200000000000000000000000047a20e747763e82dd6e6339cc4f551c6d94552f200000000000000000000000000000000000000000000000000002ddf84fb040000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -11596,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec34000000000000000000000000e38452c4571ae2259dd5362df4559bb5c4e0d6f3000000000000000000000000e38452c4571ae2259dd5362df4559bb5c4e0d6f30000000000000000000000000000000000000000000000000000c8cf623dc20000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -11597,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec34000000000000000000000000f1b8fe74b07117cd9366efb8b8dac6a297f4c342000000000000000000000000f1b8fe74b07117cd9366efb8b8dac6a297f4c34200000000000000000000000000000000000000000000000000affad2c2a47a0000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -11598,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec340000000000000000000000001a2b0cbec59fa79c1239db2668afff910be0fb780000000000000000000000001a2b0cbec59fa79c1239db2668afff910be0fb78000000000000000000000000000000000000000000000000000110d9316ec00000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -11599,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec3400000000000000000000000052870639beb9df97757882384538f8c0d2e056c300000000000000000000000052870639beb9df97757882384538f8c0d2e056c3000000000000000000000000000000000000000000000000000110d9316ec00000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -11600,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec340000000000000000000000008f12b92d14415f71fb12b6b000e962ecd8a65f1c0000000000000000000000008f12b92d14415f71fb12b6b000e962ecd8a65f1c000000000000000000000000000000000000000000000000000110d9316ec00000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -11601,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec34000000000000000000000000a00d212fd92b45bd0cc810c93d014916adb6bd4f000000000000000000000000a00d212fd92b45bd0cc810c93d014916adb6bd4f000000000000000000000000000000000000000000000000000110d9316ec00000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -11602,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec3400000000000000000000000091382e33a385470061c3586d11a4716758257d1800000000000000000000000091382e33a385470061c3586d11a4716758257d18000000000000000000000000000000000000000000000000000110d9316ec00000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -11603,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec34000000000000000000000000ce31f92369461850e7a6824ce8c9c77f2ce4279b000000000000000000000000ce31f92369461850e7a6824ce8c9c77f2ce4279b000000000000000000000000000000000000000000000000000110d9316ec00000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -11604,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec34000000000000000000000000ba67979a4d652ca11c1c545739eec468abbbe122000000000000000000000000ba67979a4d652ca11c1c545739eec468abbbe122000000000000000000000000000000000000000000000000000110d9316ec00000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -11605,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec3400000000000000000000000061afdca5ab3b32a5b54460a7e57d9f63434a3d5b00000000000000000000000061afdca5ab3b32a5b54460a7e57d9f63434a3d5b000000000000000000000000000000000000000000000000000110d9316ec00000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -11606,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec340000000000000000000000006dc8583a625298aaa8671b70eb3ce3b86197a5cb0000000000000000000000006dc8583a625298aaa8671b70eb3ce3b86197a5cb00000000000000000000000000000000000000000000000000470de4df82000000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -11607,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec34000000000000000000000000f15c653f85315a36f843f8fb85cbe587171274ca000000000000000000000000f15c653f85315a36f843f8fb85cbe587171274ca000000000000000000000000000000000000000000000000000110d9316ec00000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -11608,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec340000000000000000000000007edebd14451fa80394d486602cede9b12d28ca290000000000000000000000007edebd14451fa80394d486602cede9b12d28ca29000000000000000000000000000000000000000000000000000110d9316ec00000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -11609,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec340000000000000000000000007c431698ca9876356e7c323eac9cc35da28182650000000000000000000000007c431698ca9876356e7c323eac9cc35da2818265000000000000000000000000000000000000000000000000000110d9316ec00000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -11610,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec34000000000000000000000000c536b179274d0e545631200f8c9244fb65bc30c3000000000000000000000000c536b179274d0e545631200f8c9244fb65bc30c300000000000000000000000000000000000000000000000000016bcc41e9000000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -11611,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec34000000000000000000000000caee6f7d0562ea2f12964aacab17cb011bfafe9d000000000000000000000000caee6f7d0562ea2f12964aacab17cb011bfafe9d000000000000000000000000000000000000000000000000001e94524ed3010000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -11612,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec340000000000000000000000007b3e1735989bf78a070231aecc6b13166d085a4b0000000000000000000000007b3e1735989bf78a070231aecc6b13166d085a4b00000000000000000000000000000000000000000000000000016bcc41e9000000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -11613,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec340000000000000000000000006635fdbdbbeb9df291121aff8cf143ef99f98dfc0000000000000000000000006635fdbdbbeb9df291121aff8cf143ef99f98dfc00000000000000000000000000000000000000000000000000016bcc41e9000000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -11614,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec34000000000000000000000000aee527ad6aee9243b49ed7dfb6a533bf355b60f4000000000000000000000000aee527ad6aee9243b49ed7dfb6a533bf355b60f400000000000000000000000000000000000000000000000000016bcc41e9000000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -11615,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec34000000000000000000000000f9085ee5e61775c7a88d329d6829e77f6a712c59000000000000000000000000f9085ee5e61775c7a88d329d6829e77f6a712c5900000000000000000000000000000000000000000000000000016bcc41e9000000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -11616,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec34000000000000000000000000dba18812ee9b2f25773ace23bf34ef2db7e79737000000000000000000000000dba18812ee9b2f25773ace23bf34ef2db7e7973700000000000000000000000000000000000000000000000000016bcc41e9000000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -11617,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec34000000000000000000000000b198861ea2c62ff1c96d3424a441296c4a54fae1000000000000000000000000b198861ea2c62ff1c96d3424a441296c4a54fae100000000000000000000000000000000000000000000000000016bcc41e9000000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -11618,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec3400000000000000000000000074aa8463874aebb1ae29be8f8ba1adc322a9402d00000000000000000000000074aa8463874aebb1ae29be8f8ba1adc322a9402d000000000000000000000000000000000000000000000000001b7dd8d2d8a67000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -11619,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec34000000000000000000000000b198861ea2c62ff1c96d3424a441296c4a54fae1000000000000000000000000b198861ea2c62ff1c96d3424a441296c4a54fae1000000000000000000000000000000000000000000000000000c7606fae9420000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -11620,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec34000000000000000000000000516f7df8b3ff2787e6086534435e8fea9f14fd29000000000000000000000000516f7df8b3ff2787e6086534435e8fea9f14fd29000000000000000000000000000000000000000000000000000e35fa931a000000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -11621,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec340000000000000000000000000001c7de0e480812e74f76b83a81cd6453da5bf30000000000000000000000000001c7de0e480812e74f76b83a81cd6453da5bf3000000000000000000000000000000000000000000000000000e35fa931a000000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -11622,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec3400000000000000000000000084c641b467ba83ea61d68d0bb589a3e47f447c2b00000000000000000000000084c641b467ba83ea61d68d0bb589a3e47f447c2b0000000000000000000000000000000000000000000000000001c6bf5263400000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -11623,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec34000000000000000000000000f6463d3bb34f80da48008eb8610c6a221e782808000000000000000000000000f6463d3bb34f80da48008eb8610c6a221e7828080000000000000000000000000000000000000000000000000001c6bf5263400000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -11624,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec3400000000000000000000000099f316195d72f7627d22a7994f0abac609af751400000000000000000000000099f316195d72f7627d22a7994f0abac609af75140000000000000000000000000000000000000000000000000001c6bf5263400000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -11625,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec34000000000000000000000000f07780f9a8e3835befaa4bfee05fe1fe60b1f4cb000000000000000000000000f07780f9a8e3835befaa4bfee05fe1fe60b1f4cb0000000000000000000000000000000000000000000000000001c6bf5263400000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -11626,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec340000000000000000000000005956e5e6b032f5b0f34faf2f8f99ec158f278f9c0000000000000000000000005956e5e6b032f5b0f34faf2f8f99ec158f278f9c000000000000000000000000000000000000000000000000000110d9316ec00000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -11627,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec34000000000000000000000000d3e5ff75cf6e0f0c90d0baa305b2ce33dbfeced3000000000000000000000000d3e5ff75cf6e0f0c90d0baa305b2ce33dbfeced30000000000000000000000000000000000000000000000000001c6bf5263400000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -11628,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec3400000000000000000000000048ee21533af3087ea90b3efeb94334cc528f512800000000000000000000000048ee21533af3087ea90b3efeb94334cc528f51280000000000000000000000000000000000000000000000000001c6bf5263400000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -11629,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec3400000000000000000000000068d227556054b7bf14ca43a1b9b96387098033e800000000000000000000000068d227556054b7bf14ca43a1b9b96387098033e80000000000000000000000000000000000000000000000000001c6bf5263400000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -11630,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec3400000000000000000000000021617c7270f645e59e9da4a6fd1269b56953199600000000000000000000000021617c7270f645e59e9da4a6fd1269b5695319960000000000000000000000000000000000000000000000000001c6bf5263400000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -11631,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec34000000000000000000000000d5bd0596b241e9954ca6da08132de7fea11238d0000000000000000000000000d5bd0596b241e9954ca6da08132de7fea11238d00000000000000000000000000000000000000000000000000001c6bf5263400000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -11632,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec340000000000000000000000008aa6869c58b6be38dc61c1ca883cff5a59b2d3020000000000000000000000008aa6869c58b6be38dc61c1ca883cff5a59b2d3020000000000000000000000000000000000000000000000000001c6bf5263400000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -11633,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec34000000000000000000000000d43867c2bb79bc362e96b14528c977053aefff6f000000000000000000000000d43867c2bb79bc362e96b14528c977053aefff6f0000000000000000000000000000000000000000000000000001c6bf5263400000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -11634,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec34000000000000000000000000c40082505b0d4481384b2208c0c61a0ca55ebaa4000000000000000000000000c40082505b0d4481384b2208c0c61a0ca55ebaa40000000000000000000000000000000000000000000000000001c6bf5263400000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -11635,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec340000000000000000000000000a0101ede2d003f78d70310379b1d294eba4c4530000000000000000000000000a0101ede2d003f78d70310379b1d294eba4c4530000000000000000000000000000000000000000000000000001c6bf5263400000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -11637,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec34000000000000000000000000d391e8aeac08f158c789d15de0862b25f5b8f32a000000000000000000000000d391e8aeac08f158c789d15de0862b25f5b8f32a000000000000000000000000000000000000000000000000016345785d8a000000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -11638,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0xa9f9e675000000000000000000000000a0b86991c6218b36c1d19d4a2e9eb0ce3606eb480000000000000000000000007f5c764cbc14f9669b88837ca1490cca17c31607000000000000000000000000b24adeb0b9fbbca38192c4104120d0065d3d67fe000000000000000000000000b24adeb0b9fbbca38192c4104120d0065d3d67fe0000000000000000000000000000000000000000000000000000000001c8cfaa00000000000000000000000000000000000000000000000000000000000000c00000000000000000000000000000000000000000000000000000000000000000,,,1,true -11640,0xcd9d4988c0ae61887b075ba77f08cbfad2b65068,0x3f87ff1de58128ef8fcb4c807efd776e1ac72e51,0xf4f7b41a0000000000000000000000003c264c1366ebd96542098d3506f0d3be8d25ee380000000000000000000000000000000000000000000000001b56d88fff850000,,,1,true -11642,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0xa9f9e675000000000000000000000000a0b86991c6218b36c1d19d4a2e9eb0ce3606eb480000000000000000000000007f5c764cbc14f9669b88837ca1490cca17c31607000000000000000000000000a70fe1e31c432658b1903502979a6e01092113ff000000000000000000000000a70fe1e31c432658b1903502979a6e01092113ff0000000000000000000000000000000000000000000000000000000001c9c38000000000000000000000000000000000000000000000000000000000000000c00000000000000000000000000000000000000000000000000000000000000000,,,1,true -11643,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec340000000000000000000000001b18e2769c8f29bb604d517e6f4167869adb88ab0000000000000000000000001b18e2769c8f29bb604d517e6f4167869adb88ab000000000000000000000000000000000000000000000000015418c5f4bc438900000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -11645,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec340000000000000000000000006f804bc24fca7df18e5fee7ceabf553f00c049f90000000000000000000000006f804bc24fca7df18e5fee7ceabf553f00c049f900000000000000000000000000000000000000000000000000044364c5bb000000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -11646,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec340000000000000000000000008b1d10ac24be13ddd7c4186490dacf50727ffff40000000000000000000000008b1d10ac24be13ddd7c4186490dacf50727ffff4000000000000000000000000000000000000000000000000000665172898800000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -11648,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec340000000000000000000000003e695826d245ea190c9414df6c4eae980174bcbb0000000000000000000000003e695826d245ea190c9414df6c4eae980174bcbb000000000000000000000000000000000000000000000000000665172898800000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -11649,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec34000000000000000000000000db7ffb5ef7d6a059f914884fc7c33f7eeb194b5c000000000000000000000000db7ffb5ef7d6a059f914884fc7c33f7eeb194b5c000000000000000000000000000000000000000000000000000665172898800000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -11653,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec340000000000000000000000005dff7f38b4869eac1639e32c0c32e824d3be6cc60000000000000000000000005dff7f38b4869eac1639e32c0c32e824d3be6cc600000000000000000000000000000000000000000000000000071afd498d000000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -11654,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec340000000000000000000000004adce7bbd76ac682b51a83a2b41562a3c17449900000000000000000000000004adce7bbd76ac682b51a83a2b41562a3c174499000000000000000000000000000000000000000000000000000071afd498d000000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -11655,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec34000000000000000000000000b67fff3fb149c9009502e107fd51815ab329b4ea000000000000000000000000b67fff3fb149c9009502e107fd51815ab329b4ea00000000000000000000000000000000000000000000000000071afd498d000000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -11656,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec34000000000000000000000000824b83fce26b47e3f362610ea0e24af489ae4fb4000000000000000000000000824b83fce26b47e3f362610ea0e24af489ae4fb400000000000000000000000000000000000000000000000000071afd498d000000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -11657,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec34000000000000000000000000254be7b39396b1a9fceac3685f57d3b04d717ab2000000000000000000000000254be7b39396b1a9fceac3685f57d3b04d717ab2000000000000000000000000000000000000000000000000000aa87bee53800000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -11658,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec3400000000000000000000000093ea069784ba3580805ca976455201dff1cdc53f00000000000000000000000093ea069784ba3580805ca976455201dff1cdc53f0000000000000000000000000000000000000000000000000010a153a7476cab00000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -11659,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec34000000000000000000000000c4839c439a8646a64c7ce5a7da008a5d0062d4bc000000000000000000000000c4839c439a8646a64c7ce5a7da008a5d0062d4bc00000000000000000000000000000000000000000000000000277ce89ab52ae300000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -11660,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec3400000000000000000000000000aa33d9bcdcebe2db009ac6849aa305f8a7ee5600000000000000000000000000aa33d9bcdcebe2db009ac6849aa305f8a7ee56000000000000000000000000000000000000000000000000009e3a48c03141ce00000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -11665,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec3400000000000000000000000036c88373b259a8e7947e0a36072adaa733c794b900000000000000000000000036c88373b259a8e7947e0a36072adaa733c794b900000000000000000000000000000000000000000000000000ffd8e1655634b100000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -11666,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec34000000000000000000000000e866fb89265ae8f9f9ef5f4b0d30f6f30eb13c84000000000000000000000000e866fb89265ae8f9f9ef5f4b0d30f6f30eb13c8400000000000000000000000000000000000000000000000000e31bfcf8ba820000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -11667,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec34000000000000000000000000a668818c0e0f43811ed647e49799ba22181d832a000000000000000000000000a668818c0e0f43811ed647e49799ba22181d832a00000000000000000000000000000000000000000000000000470de4df82000000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -11671,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec3400000000000000000000000078f4775fb0ad590d7790bcbe460ae4304b06d02b00000000000000000000000078f4775fb0ad590d7790bcbe460ae4304b06d02b0000000000000000000000000000000000000000000000000076097db36b977d00000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,0x24f718c2a3349a1230aba5e5d663b3bd4be2b819cb92251fc322f5ed2c30dc80,2022-03-28 06:50:26.000 UTC,0,true -11672,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec340000000000000000000000007d27cfb08a7e2c32dfddb0ca0496af5a9d1148f30000000000000000000000007d27cfb08a7e2c32dfddb0ca0496af5a9d1148f3000000000000000000000000000000000000000000000000003630fb5e01fdc000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -11674,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec340000000000000000000000005234ec9b99d1ded2c9bd394cd0e786b1a43806c10000000000000000000000005234ec9b99d1ded2c9bd394cd0e786b1a43806c1000000000000000000000000000000000000000000000000014ed85e68f59fe500000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -11675,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec34000000000000000000000000403c2d4099179e178a0b9860139f0284a63c8690000000000000000000000000403c2d4099179e178a0b9860139f0284a63c86900000000000000000000000000000000000000000000000000c7d713b49da000000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -11679,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec3400000000000000000000000049d2db5f6c17a5a2894f52125048aaa98885000900000000000000000000000049d2db5f6c17a5a2894f52125048aaa98885000900000000000000000000000000000000000000000000000000564e2aaf3b19f600000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -11683,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec340000000000000000000000004ba9e3d69f573c1c79c7d66e8a0d096583b524540000000000000000000000004ba9e3d69f573c1c79c7d66e8a0d096583b5245400000000000000000000000000000000000000000000000006e151cceff9115a00000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -11684,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec34000000000000000000000000bcc34be4cce3c236ccc2e4b9940c874c13d05ed3000000000000000000000000bcc34be4cce3c236ccc2e4b9940c874c13d05ed300000000000000000000000000000000000000000000000002c68af0bb14000000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -11687,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec340000000000000000000000008c9d9fc19515b544f84b597af87da1f7d60c86460000000000000000000000008c9d9fc19515b544f84b597af87da1f7d60c864600000000000000000000000000000000000000000000000001670911247c87bf00000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -11690,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec34000000000000000000000000af884a663e7353d8adf6a2cbea90eb5961296136000000000000000000000000af884a663e7353d8adf6a2cbea90eb596129613600000000000000000000000000000000000000000000000006dd1fce7a1ce40500000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,0x2795f799d8095f694b7362dad309550236506b3e91a93d372687353f6b199e48,2022-02-15 10:53:27.000 UTC,0,true -11697,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec340000000000000000000000006f6510b68c671514190e6c3bc74ec4a316970e0e0000000000000000000000006f6510b68c671514190e6c3bc74ec4a316970e0e00000000000000000000000000000000000000000000000000a5185ce924dbca00000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -11699,0xcd9d4988c0ae61887b075ba77f08cbfad2b65068,0x3f87ff1de58128ef8fcb4c807efd776e1ac72e51,0xf4f7b41a0000000000000000000000006f6634b2aab01df7f47f615fb4e2b876bd3ae5ea0000000000000000000000000000000000000000000000043b6293db1d233a0e,0x548764f6aceeddd484701201a1dcd73b7898582a84d87550710b9b1afcd5aaed,2021-12-26 23:37:59.000 UTC,0,true -11702,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec34000000000000000000000000cf053cd97db53e930e03ca1e6dab3c7507b6e2fb000000000000000000000000cf053cd97db53e930e03ca1e6dab3c7507b6e2fb000000000000000000000000000000000000000000000000001f467897a1980000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -11705,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec34000000000000000000000000885fbc6e02db6b1d26de3f73e80ad7f1ddc10021000000000000000000000000885fbc6e02db6b1d26de3f73e80ad7f1ddc1002100000000000000000000000000000000000000000000000000cb7dd7974e1e9100000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,0x658d664b433c9ae3c7b6af92b84de682cce84f0e36ef18f6761d5092df8bdf24,2022-02-13 14:11:20.000 UTC,0,true -11710,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec34000000000000000000000000fd46396d5a6f7429edde41020601c37fb986f1f0000000000000000000000000fd46396d5a6f7429edde41020601c37fb986f1f0000000000000000000000000000000000000000000000000001b5113435414c000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -11711,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec34000000000000000000000000b6a7b804644124978896dc656c886fa4dcd36156000000000000000000000000b6a7b804644124978896dc656c886fa4dcd36156000000000000000000000000000000000000000000000000009d73da8bdfc12700000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,0x8d9a32e521b309f01766b00d3b1cdf886025092bcb33165086d696c6f0a38ca5,2022-02-13 14:11:59.000 UTC,0,true -11713,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec3400000000000000000000000045c1cc34a0981e5d91fb683a6f7756698a643e7b00000000000000000000000045c1cc34a0981e5d91fb683a6f7756698a643e7b000000000000000000000000000000000000000000000000000e7e241056de0000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -11717,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec340000000000000000000000005be10f3434bc1ac6c0a34f86da39ea0095392f210000000000000000000000005be10f3434bc1ac6c0a34f86da39ea0095392f21000000000000000000000000000000000000000000000000003c29d8fcb4790000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -11720,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec34000000000000000000000000cf9ffdfb47332beee87adbd06724459a82cf639f000000000000000000000000cf9ffdfb47332beee87adbd06724459a82cf639f000000000000000000000000000000000000000000000000009b6a90700b6bcf00000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -11722,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec34000000000000000000000000e19adc684c906dda7f425eb49763adddcb83f81e000000000000000000000000e19adc684c906dda7f425eb49763adddcb83f81e0000000000000000000000000000000000000000000000000de0b6b3a764000000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -11724,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec34000000000000000000000000467ba81768726359f4a5172e2c548902ff880ef0000000000000000000000000467ba81768726359f4a5172e2c548902ff880ef000000000000000000000000000000000000000000000000000ac48f4bde5d52d00000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,0x44207f02f8a62576f7e259d5042ebe5a21d9b13a10d8b85985cfef6015cd26ab,2022-08-01 01:28:30.000 UTC,0,true -11730,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec340000000000000000000000006da005df546294539904fd749a953849db2b45e00000000000000000000000006da005df546294539904fd749a953849db2b45e00000000000000000000000000000000000000000000000000057c7a330b8d60200000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,0x084eed396a65c452d14f68a981a02c59f17387f101a58b3c984696e8c9854f34,2022-03-15 06:39:59.000 UTC,0,true -11733,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec34000000000000000000000000f6c8c9479772775c7577c5fecea9621df7c1175a000000000000000000000000f6c8c9479772775c7577c5fecea9621df7c1175a00000000000000000000000000000000000000000000000000a3fbf3d40a14ca00000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -11742,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec3400000000000000000000000025950f980176941e146b8a4bf8cdf48b2631463400000000000000000000000025950f980176941e146b8a4bf8cdf48b263146340000000000000000000000000000000000000000000000000080e373da35bd6400000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -11743,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec3400000000000000000000000019601a8469f4e1ff0ecbae0b5be957efe7f7f1e100000000000000000000000019601a8469f4e1ff0ecbae0b5be957efe7f7f1e1000000000000000000000000000000000000000000000000001a51bfc567e1c000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -11744,0x10e6593cdda8c58a1d0f14c5164b376352a55f2f,0x467194771dae2967aef3ecbedd3bf9a310c76c65,0xa9f9e6750000000000000000000000006b175474e89094c44da98b954eedeac495271d0f000000000000000000000000da10009cbd5d07dd0cecc66161fc93d7c9000da10000000000000000000000002e50a97212a0c1bef5cea4a5edb0f6309b11a8a90000000000000000000000002e50a97212a0c1bef5cea4a5edb0f6309b11a8a900000000000000000000000000000000000000000000003ed493ca13f1dba7be00000000000000000000000000000000000000000000000000000000000000c00000000000000000000000000000000000000000000000000000000000000000,,,1,true -11748,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec340000000000000000000000003755b30ed3f778c526fd8eebd7b8adefce1f62970000000000000000000000003755b30ed3f778c526fd8eebd7b8adefce1f6297000000000000000000000000000000000000000000000000006a94d74f43000000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -11751,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec34000000000000000000000000dab8c2d612826775ecfeb22c46298bfcdf456649000000000000000000000000dab8c2d612826775ecfeb22c46298bfcdf456649000000000000000000000000000000000000000000000000058d15e17628000000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -11756,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec3400000000000000000000000064364de05b2fa5255e9733e4ef6394a98d5fd16c00000000000000000000000064364de05b2fa5255e9733e4ef6394a98d5fd16c00000000000000000000000000000000000000000000000000470de4df82000000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -11758,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec340000000000000000000000008fb682dba959981243ee93a73ee81bc38f9983f00000000000000000000000008fb682dba959981243ee93a73ee81bc38f9983f000000000000000000000000000000000000000000000000000595e70acea06f100000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -11761,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec340000000000000000000000003a3a9196408d30e8b3809780432d35ee090a31d10000000000000000000000003a3a9196408d30e8b3809780432d35ee090a31d100000000000000000000000000000000000000000000000003782dace9d9000000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -11762,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec340000000000000000000000000fc6bc21172b32b445c84e07e4d219fcf04756140000000000000000000000000fc6bc21172b32b445c84e07e4d219fcf047561400000000000000000000000000000000000000000000000000c9897e80af132700000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,0x9a04f3b03ee261c57149ec9b00031b187bf59207f2cc54cfb87af6ec25400dfd,2022-03-06 04:58:54.000 UTC,0,true -11769,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec340000000000000000000000004f459dc2a1dac3cfb64dc5dceba6ab02d8e1fc1c0000000000000000000000004f459dc2a1dac3cfb64dc5dceba6ab02d8e1fc1c0000000000000000000000000000000000000000000000000018a2000fa188c000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -11771,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec340000000000000000000000001de489664453556166157824d6b853df73cb4e8e0000000000000000000000001de489664453556166157824d6b853df73cb4e8e0000000000000000000000000000000000000000000000000ddac67e2f17319000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -11777,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec34000000000000000000000000da0495efc637cb645d4c81f684bbc5af7d8a3fdc000000000000000000000000da0495efc637cb645d4c81f684bbc5af7d8a3fdc00000000000000000000000000000000000000000000000001988fe4052b800000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,0xd737e94b8e5f9530d2450892e46e7c6facaab937f54f96281f57a7eebca3f5a4,2022-02-27 03:23:05.000 UTC,0,true -11779,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec34000000000000000000000000528c81bf6af32e5f6a4a39a0990cb01d1a121a49000000000000000000000000528c81bf6af32e5f6a4a39a0990cb01d1a121a4900000000000000000000000000000000000000000000000002a303fe4b53000000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,0xbe08285497966bb82f98d899dd5914129caaf3bb6826b1584fa04eb18f39d3a0,2022-02-27 03:19:59.000 UTC,0,true -11783,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec340000000000000000000000002282bc8e090439a0195e0c862ae3ffc47bd2edd80000000000000000000000002282bc8e090439a0195e0c862ae3ffc47bd2edd80000000000000000000000000000000000000000000000000020fe64314c270000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -11785,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec3400000000000000000000000029867e23140a908770b750fb4e30f35c619a3b3a00000000000000000000000029867e23140a908770b750fb4e30f35c619a3b3a00000000000000000000000000000000000000000000000000cc5c6677b702f800000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -11787,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0xa9f9e675000000000000000000000000514910771af9ca656af840dff83e8264ecf986ca000000000000000000000000350a791bfc2c21f9ed5d10980dad2e2638ffa7f60000000000000000000000007e363fd04efec7050be8e8bb1adfb22f44e7c3e60000000000000000000000007e363fd04efec7050be8e8bb1adfb22f44e7c3e6000000000000000000000000000000000000000000000000ae88baa6de28dbef00000000000000000000000000000000000000000000000000000000000000c00000000000000000000000000000000000000000000000000000000000000000,,,1,true -11788,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0xa9f9e6750000000000000000000000001f9840a85d5af5bf1d1762f925bdaddc4201f9840000000000000000000000006fd9d7ad17242c41f7131d257212c54a0e81669100000000000000000000000082b7062e1bd9a0e1b6caaf031311fcba585a8fd600000000000000000000000082b7062e1bd9a0e1b6caaf031311fcba585a8fd6000000000000000000000000000000000000000000000000a531b37bb7d66b4000000000000000000000000000000000000000000000000000000000000000c00000000000000000000000000000000000000000000000000000000000000000,,,1,true -11789,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec34000000000000000000000000741f0e84e8115dc41a03f27ade25ce8bfca3cd35000000000000000000000000741f0e84e8115dc41a03f27ade25ce8bfca3cd3500000000000000000000000000000000000000000000000001cdda4faccd000000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,0xb1f304788f99ac59828b3f4f377032661e60c6dbd33ae8058513e60c580beb6f,2022-05-08 01:15:20.000 UTC,0,true -11790,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec34000000000000000000000000098ae0e9d9b63cbed47db9b456b51e58c7b87328000000000000000000000000098ae0e9d9b63cbed47db9b456b51e58c7b8732800000000000000000000000000000000000000000000000000ac4d594064aa8000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -11791,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0xa9f9e6750000000000000000000000002260fac5e5542a773aa44fbcfedf7c193bc2c59900000000000000000000000068f180fcce6836688e9084f035309e29bf0a2095000000000000000000000000bef448d1598e91e37a037fef50993af4a0f827be000000000000000000000000bef448d1598e91e37a037fef50993af4a0f827be000000000000000000000000000000000000000000000000000000000004880100000000000000000000000000000000000000000000000000000000000000c00000000000000000000000000000000000000000000000000000000000000000,,,1,true -11792,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec34000000000000000000000000b77a6d92fc116a6a3e2bd441e9623172e7f0623a000000000000000000000000b77a6d92fc116a6a3e2bd441e9623172e7f0623a0000000000000000000000000000000000000000000000000160eeb21b507d0000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -11797,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec34000000000000000000000000968cb804437f8698bd2bcc5481bd56bec96c1a1c000000000000000000000000968cb804437f8698bd2bcc5481bd56bec96c1a1c00000000000000000000000000000000000000000000000000a6f8cd5d2d046700000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,0x5d6cd6a575a387eaacb9d27e23c67de82879a9c593ef93a4de2d29c552e204a5,2022-04-17 00:12:45.000 UTC,0,true -11798,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0xa9f9e675000000000000000000000000a0b86991c6218b36c1d19d4a2e9eb0ce3606eb480000000000000000000000007f5c764cbc14f9669b88837ca1490cca17c316070000000000000000000000004defc44cdfd3eee7fae1d5a3901e97b27cd01e3c0000000000000000000000004defc44cdfd3eee7fae1d5a3901e97b27cd01e3c00000000000000000000000000000000000000000000000000000000018b5bc300000000000000000000000000000000000000000000000000000000000000c00000000000000000000000000000000000000000000000000000000000000000,,,1,true -11799,0xcd9d4988c0ae61887b075ba77f08cbfad2b65068,0x3f87ff1de58128ef8fcb4c807efd776e1ac72e51,0xf4f7b41a00000000000000000000000064c0ff667164e973b2c4d7fbab01cbe41ef84c3e000000000000000000000000000000000000000000000001975567701a9e1179,,,1,true -11800,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec340000000000000000000000002282bc8e090439a0195e0c862ae3ffc47bd2edd80000000000000000000000002282bc8e090439a0195e0c862ae3ffc47bd2edd80000000000000000000000000000000000000000000000000022cd8672976b0000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -11802,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec340000000000000000000000006a365df59857437932bd0394775ac957745edce20000000000000000000000006a365df59857437932bd0394775ac957745edce200000000000000000000000000000000000000000000000002fdf30fe18606aa00000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -11805,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec340000000000000000000000008e07a438db3505bcec55417096d4361ef9e8f30f0000000000000000000000008e07a438db3505bcec55417096d4361ef9e8f30f0000000000000000000000000000000000000000000000000dcf70ef714dc79900000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -11808,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec34000000000000000000000000509e427f5b930822094f203a7ea67d22aa32076b000000000000000000000000509e427f5b930822094f203a7ea67d22aa32076b0000000000000000000000000000000000000000000000000dd0565ed3444ca400000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,0x5075031f937830a3daf7ae5c3089aeb8fd8a5db1c018e203c59da700fee35dc1,2022-06-01 01:55:47.000 UTC,0,true -11810,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec3400000000000000000000000044c485a970fc789a64584edacbb32088df5c3ec400000000000000000000000044c485a970fc789a64584edacbb32088df5c3ec4000000000000000000000000000000000000000000000000042e4b861038adec00000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -11819,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec340000000000000000000000002c9e03c778ec2196c84b0f9281761e5f0c966bd80000000000000000000000002c9e03c778ec2196c84b0f9281761e5f0c966bd800000000000000000000000000000000000000000000000000a8735a5928b5ee00000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,0xcad1ab53d788e90076a6728de272fdc139f38e9fce25d19bf59a44c16b133e7f,2022-05-19 05:56:09.000 UTC,0,true -11823,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec34000000000000000000000000bb5337c8f4f0ba489a995b863eea29e8c2999664000000000000000000000000bb5337c8f4f0ba489a995b863eea29e8c299966400000000000000000000000000000000000000000000000003e650740306620500000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,0x3ddf90e32936b03deb7b035e41b0a761fe764a7cbd27cce15727408c14f2209a,2022-04-13 06:23:46.000 UTC,0,true -11824,0x10e6593cdda8c58a1d0f14c5164b376352a55f2f,0x467194771dae2967aef3ecbedd3bf9a310c76c65,0xa9f9e6750000000000000000000000006b175474e89094c44da98b954eedeac495271d0f000000000000000000000000da10009cbd5d07dd0cecc66161fc93d7c9000da10000000000000000000000004a9a4e4098dadf71d63b53e1b948b501a56fa9920000000000000000000000004a9a4e4098dadf71d63b53e1b948b501a56fa9920000000000000000000000000000000000000000000000a621f311b9214edc6c00000000000000000000000000000000000000000000000000000000000000c00000000000000000000000000000000000000000000000000000000000000000,,,1,true -11825,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec340000000000000000000000004a9a4e4098dadf71d63b53e1b948b501a56fa9920000000000000000000000004a9a4e4098dadf71d63b53e1b948b501a56fa9920000000000000000000000000000000000000000000000000e692456d8b2e4c000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -11826,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec340000000000000000000000008f82a06ee5c6ec735a49bb646f6e401b60f464f10000000000000000000000008f82a06ee5c6ec735a49bb646f6e401b60f464f100000000000000000000000000000000000000000000000002be23d896db90f500000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -11827,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec3400000000000000000000000003a1eeb08c6df9348956414192c16f00d206291f00000000000000000000000003a1eeb08c6df9348956414192c16f00d206291f0000000000000000000000000000000000000000000000000dd00157fd89767700000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -11828,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec34000000000000000000000000055affa6bdc01d0cfa8a738b068ece76e56dad51000000000000000000000000055affa6bdc01d0cfa8a738b068ece76e56dad510000000000000000000000000000000000000000000000000012da295010a75700000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -11829,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec34000000000000000000000000a196c9a7d4c5bae6e7f6bec1a5af7ea9a4cac2ef000000000000000000000000a196c9a7d4c5bae6e7f6bec1a5af7ea9a4cac2ef0000000000000000000000000000000000000000000000000017719bc4bfa40100000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -11832,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec34000000000000000000000000acecb5340a939ee1b9e7ceb975d9ecef88e25bc6000000000000000000000000acecb5340a939ee1b9e7ceb975d9ecef88e25bc6000000000000000000000000000000000000000000000000008e1bc9bf04000000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -11834,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec340000000000000000000000002e5ed3d9e994b6e8cbf1e82e303bfbd0d89b3f890000000000000000000000002e5ed3d9e994b6e8cbf1e82e303bfbd0d89b3f890000000000000000000000000000000000000000000000000ad0ef5d88402d0000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -11835,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec3400000000000000000000000031229af0915aa6b3a0f7badac595f8fc90a6534f00000000000000000000000031229af0915aa6b3a0f7badac595f8fc90a6534f00000000000000000000000000000000000000000000000000689ff372ee570000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -11837,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec34000000000000000000000000d9744cd4aa86dd1b338f02e00ae02c3ddfa39d18000000000000000000000000d9744cd4aa86dd1b338f02e00ae02c3ddfa39d18000000000000000000000000000000000000000000000000009801e77f02404800000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -11838,0xcd9d4988c0ae61887b075ba77f08cbfad2b65068,0x3f87ff1de58128ef8fcb4c807efd776e1ac72e51,0xf4f7b41a000000000000000000000000bd825705ffe24abed5dc12cd1e3b789253b82e3e00000000000000000000000000000000000000000000000031c9703005a731f1,,,1,true -11840,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec34000000000000000000000000f9c45b6e9a9c2d58dedc192f3eee627dde5d9a3f000000000000000000000000f9c45b6e9a9c2d58dedc192f3eee627dde5d9a3f000000000000000000000000000000000000000000000000003db6579b2724fa00000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -11843,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec3400000000000000000000000099c794b7a618f72e89387821b6f184598d75fb4800000000000000000000000099c794b7a618f72e89387821b6f184598d75fb480000000000000000000000000000000000000000000000000160b486423c0d0000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -11846,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec34000000000000000000000000abdcfd11af016bbd617847a464a87993cc61c050000000000000000000000000abdcfd11af016bbd617847a464a87993cc61c050000000000000000000000000000000000000000000000000060cfbb0a212000000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,0xcdb881647ef8144a3583faa156dda9d4ae209f34f1b23aed47b136b5220a2e2c,2022-03-08 04:13:25.000 UTC,0,true -11847,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec3400000000000000000000000066d9679255db0d846c60aeaa6eb8ffb91e57751b00000000000000000000000066d9679255db0d846c60aeaa6eb8ffb91e57751b0000000000000000000000000000000000000000000000000064c13096283b5e00000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -11848,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec34000000000000000000000000588ea768aeb968da685022c5b28760d39937dd9f000000000000000000000000588ea768aeb968da685022c5b28760d39937dd9f00000000000000000000000000000000000000000000000002e86a9cc2020a8a00000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,0x57b0ac509a37aac6941d7cc8e820345b6d4705d921b0d1f179fe978a16d9c798,2021-11-28 10:49:01.000 UTC,0,true -11852,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec34000000000000000000000000082747972853c8da3d53ad554cf0c3fed8eed4c1000000000000000000000000082747972853c8da3d53ad554cf0c3fed8eed4c100000000000000000000000000000000000000000000000000b1a2bc2ec5000000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -11853,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec34000000000000000000000000082747972853c8da3d53ad554cf0c3fed8eed4c1000000000000000000000000082747972853c8da3d53ad554cf0c3fed8eed4c1000000000000000000000000000000000000000000000000016345785d8a000000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -11854,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec34000000000000000000000000478c1cdd7f51b9ff7e08434363364e9e79784d85000000000000000000000000478c1cdd7f51b9ff7e08434363364e9e79784d8500000000000000000000000000000000000000000000000001546ed86f36746a00000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -11857,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec340000000000000000000000002d8e211913247a0ec5454137e7a6ed18ed727a2f0000000000000000000000002d8e211913247a0ec5454137e7a6ed18ed727a2f000000000000000000000000000000000000000000000000002386f26fc1000000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -11859,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec3400000000000000000000000037ef6c69278b5107dfa058d86e13a1c0cb7f54c900000000000000000000000037ef6c69278b5107dfa058d86e13a1c0cb7f54c9000000000000000000000000000000000000000000000000015f0d455ac1e00000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -11861,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec34000000000000000000000000a9b867c876a81d1b82278872cd9fab15462196f1000000000000000000000000a9b867c876a81d1b82278872cd9fab15462196f100000000000000000000000000000000000000000000000000038d7ea4c6800000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -11862,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec340000000000000000000000006316c0c5d19e9c5a957d7e411d2179ec05637d0b0000000000000000000000006316c0c5d19e9c5a957d7e411d2179ec05637d0b00000000000000000000000000000000000000000000000001611502adfcb80000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -11864,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec3400000000000000000000000061f3be073bd5c5a6ed11443e51744ce505e27b8500000000000000000000000061f3be073bd5c5a6ed11443e51744ce505e27b85000000000000000000000000000000000000000000000000008142d82123380000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -11867,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec340000000000000000000000009a8f606325d5f74e58575353dcee9993b032b2380000000000000000000000009a8f606325d5f74e58575353dcee9993b032b23800000000000000000000000000000000000000000000000000038d7ea4c6800000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -11870,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec34000000000000000000000000d3925751f682f1dc13310ca2bafb96cd1cf770a7000000000000000000000000d3925751f682f1dc13310ca2bafb96cd1cf770a700000000000000000000000000000000000000000000000000038d7ea4c6800000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -11873,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec3400000000000000000000000099e5eb0fa8ce36525cfe5c434b3f26befd7f0d6700000000000000000000000099e5eb0fa8ce36525cfe5c434b3f26befd7f0d67000000000000000000000000000000000000000000000000015c4678bd3ebfd500000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -11874,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec34000000000000000000000000fcb6b92e6e5460a9f6d759988b04af1fc30d75f6000000000000000000000000fcb6b92e6e5460a9f6d759988b04af1fc30d75f60000000000000000000000000000000000000000000000000373002f2e01edd000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -11876,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec34000000000000000000000000a9a796d3cc151556e04fd6e5a6b01de7f5ae343e000000000000000000000000a9a796d3cc151556e04fd6e5a6b01de7f5ae343e00000000000000000000000000000000000000000000000000aef15901c9310000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -11877,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec34000000000000000000000000f3aa68cadb8f25ad25b054841df221d234b8b374000000000000000000000000f3aa68cadb8f25ad25b054841df221d234b8b37400000000000000000000000000000000000000000000000000038d7ea4c6800000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -11878,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec340000000000000000000000001c1757cdde3b690ac887ff89974758f3d07e44480000000000000000000000001c1757cdde3b690ac887ff89974758f3d07e444800000000000000000000000000000000000000000000000000a51544cbd30d9700000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -11879,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec34000000000000000000000000fe332afd6dea8f0f741462aec785b902f0315d7c000000000000000000000000fe332afd6dea8f0f741462aec785b902f0315d7c000000000000000000000000000000000000000000000000010117756f62d88000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -11880,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0xa9f9e6750000000000000000000000001f9840a85d5af5bf1d1762f925bdaddc4201f9840000000000000000000000006fd9d7ad17242c41f7131d257212c54a0e81669100000000000000000000000099c794b7a618f72e89387821b6f184598d75fb4800000000000000000000000099c794b7a618f72e89387821b6f184598d75fb4800000000000000000000000000000000000000000000000045a7230a2814096f00000000000000000000000000000000000000000000000000000000000000c00000000000000000000000000000000000000000000000000000000000000000,,,1,true -11882,0x10e6593cdda8c58a1d0f14c5164b376352a55f2f,0x467194771dae2967aef3ecbedd3bf9a310c76c65,0xa9f9e6750000000000000000000000006b175474e89094c44da98b954eedeac495271d0f000000000000000000000000da10009cbd5d07dd0cecc66161fc93d7c9000da100000000000000000000000087ebf5038cacde1891683176a802c0a5b6da3cc600000000000000000000000087ebf5038cacde1891683176a802c0a5b6da3cc6000000000000000000000000000000000000000000000002c94c71ca0b6e714b00000000000000000000000000000000000000000000000000000000000000c00000000000000000000000000000000000000000000000000000000000000000,,,1,true -11883,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec34000000000000000000000000d633e9a50647707279dc8aa4c20f57959cf4c393000000000000000000000000d633e9a50647707279dc8aa4c20f57959cf4c39300000000000000000000000000000000000000000000000000038d7ea4c6800000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -11885,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec34000000000000000000000000d6b754372dd1c0f47652e989b2405d10783195e7000000000000000000000000d6b754372dd1c0f47652e989b2405d10783195e700000000000000000000000000000000000000000000000000038d7ea4c6800000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -11887,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec34000000000000000000000000de09b5a841a33ab73099349a7927d7609b5b3cce000000000000000000000000de09b5a841a33ab73099349a7927d7609b5b3cce000000000000000000000000000000000000000000000000004ca599354b265900000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -11888,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec340000000000000000000000009d7a199c805650468374e5d76c7dce15ec9a97090000000000000000000000009d7a199c805650468374e5d76c7dce15ec9a9709000000000000000000000000000000000000000000000000002e2f6e5e14800000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -11890,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec3400000000000000000000000023beea0467685c3e8ce4b31d7306b2d758010f5600000000000000000000000023beea0467685c3e8ce4b31d7306b2d758010f56000000000000000000000000000000000000000000000000002d4d45171035c000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -11892,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec34000000000000000000000000e0bd01517c0ab68988c54e52b811587a9e744744000000000000000000000000e0bd01517c0ab68988c54e52b811587a9e74474400000000000000000000000000000000000000000000000001152c1292cd408b00000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -11893,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0xa9f9e675000000000000000000000000dac17f958d2ee523a2206206994597c13d831ec700000000000000000000000094b008aa00579c1307b0ef2c499ad98a8ce58e58000000000000000000000000c28fda731c13ccf4f513f187fda345f870fc6392000000000000000000000000c28fda731c13ccf4f513f187fda345f870fc6392000000000000000000000000000000000000000000000000000000000182fd5b00000000000000000000000000000000000000000000000000000000000000c00000000000000000000000000000000000000000000000000000000000000000,,,1,true -11897,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec340000000000000000000000001442f26e93c193e9c2107d3f90f43a841cc0faec0000000000000000000000001442f26e93c193e9c2107d3f90f43a841cc0faec0000000000000000000000000000000000000000000000000125bb1da9c30c8400000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -11898,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec34000000000000000000000000d51afe8c20a429fe6555ca4db037f6b9d26490a4000000000000000000000000d51afe8c20a429fe6555ca4db037f6b9d26490a40000000000000000000000000000000000000000000000000216e633e41b7a0200000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,0x60b5d1c78cdd9a7b7e6a53c6ca260a813ef6da9dba24c004620c644abf8da9a9,2022-06-19 07:00:45.000 UTC,0,true -11899,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec340000000000000000000000005df63bf3545acfbeaf608332d767a0ef957021610000000000000000000000005df63bf3545acfbeaf608332d767a0ef9570216100000000000000000000000000000000000000000000000006edb68c71fbd80000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -11900,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec340000000000000000000000005c872cfe1511c0671c3182629d600e2f7be672750000000000000000000000005c872cfe1511c0671c3182629d600e2f7be6727500000000000000000000000000000000000000000000000000af6886b0abf5af00000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -11901,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec340000000000000000000000001d01e2010c7018aa9a10ee81beb8e88f212a12090000000000000000000000001d01e2010c7018aa9a10ee81beb8e88f212a120900000000000000000000000000000000000000000000000002be627611b7797400000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,0x11a9d6784e037282645aec7d4aeff27acae0bce477e49d12bb6e5a927acdee66,2022-01-31 04:22:40.000 UTC,0,true -11903,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec340000000000000000000000007ca97ae70e38736a94eea00427d50846bab978dd0000000000000000000000007ca97ae70e38736a94eea00427d50846bab978dd000000000000000000000000000000000000000000000000003bdc7143f8b43d00000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,0x4f41cfbf4e4647501149e710af3083d8ed0b5807eebd1c37444f26486e351282,2021-12-26 09:09:22.000 UTC,0,true -11904,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec3400000000000000000000000084bfbb65c8e7ad4cd835de354ad43a0f0f10e3b600000000000000000000000084bfbb65c8e7ad4cd835de354ad43a0f0f10e3b6000000000000000000000000000000000000000000000000012dfb0cb5e8800000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -11905,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec34000000000000000000000000a218d0ce0693c41a96f58667ba34f5f489e75628000000000000000000000000a218d0ce0693c41a96f58667ba34f5f489e7562800000000000000000000000000000000000000000000000000038d7ea4c6800000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -11906,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec340000000000000000000000006ae8c2812447c23c8b721011d40fe1448e1e64b90000000000000000000000006ae8c2812447c23c8b721011d40fe1448e1e64b900000000000000000000000000000000000000000000000000038d7ea4c6800000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -11907,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec340000000000000000000000009f5bf5011770655c751aa54a8a60839bf8f596ff0000000000000000000000009f5bf5011770655c751aa54a8a60839bf8f596ff00000000000000000000000000000000000000000000000000320dc09fa5168700000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -11908,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0xa9f9e675000000000000000000000000dac17f958d2ee523a2206206994597c13d831ec700000000000000000000000094b008aa00579c1307b0ef2c499ad98a8ce58e580000000000000000000000007c84d134d1ac55126fb215fc35438a3c278f81b20000000000000000000000007c84d134d1ac55126fb215fc35438a3c278f81b20000000000000000000000000000000000000000000000000000000005f5e10000000000000000000000000000000000000000000000000000000000000000c00000000000000000000000000000000000000000000000000000000000000000,,,1,true -11909,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec340000000000000000000000006fabc23baefcd1f1e34a25f6e54ea4d033b9362d0000000000000000000000006fabc23baefcd1f1e34a25f6e54ea4d033b9362d0000000000000000000000000000000000000000000000000087f620e8d2c2ac00000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,0x3de4ef7f69d53c0ab22ca6d90ef82f9b184720fedcdfaf0a8dd21a70a10094fb,2022-02-28 03:42:38.000 UTC,0,true -11910,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec3400000000000000000000000004efeb767b3b0941ccbadd6cb897a391499324fd00000000000000000000000004efeb767b3b0941ccbadd6cb897a391499324fd0000000000000000000000000000000000000000000000000005543df729c00000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -11911,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec3400000000000000000000000014f650b3cfbcd901893ae90fcde1b38c7077575c00000000000000000000000014f650b3cfbcd901893ae90fcde1b38c7077575c00000000000000000000000000000000000000000000000000071afd498d000000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -11913,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec34000000000000000000000000ce9ad2ccacb8f5f36d04d1d30c1daa17f7dbb541000000000000000000000000ce9ad2ccacb8f5f36d04d1d30c1daa17f7dbb54100000000000000000000000000000000000000000000000000038d7ea4c6800000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -11915,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec3400000000000000000000000037ca2fb13f200e3f922d7f07e9bef1fcfa3e8b4a00000000000000000000000037ca2fb13f200e3f922d7f07e9bef1fcfa3e8b4a00000000000000000000000000000000000000000000000000038d7ea4c6800000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -11916,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec34000000000000000000000000345ebd1b3c20a7c249f9a8f1b6fcde7e531f2985000000000000000000000000345ebd1b3c20a7c249f9a8f1b6fcde7e531f29850000000000000000000000000000000000000000000000000005543df729c00000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -11917,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec340000000000000000000000002a651e5c177cc60fb60529631e1b5bdd93a82fb70000000000000000000000002a651e5c177cc60fb60529631e1b5bdd93a82fb7000000000000000000000000000000000000000000000000012dfb0cb5e8800000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -11919,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec340000000000000000000000007143c902f08212861aa5e9749f019f2feba117540000000000000000000000007143c902f08212861aa5e9749f019f2feba117540000000000000000000000000000000000000000000000000214e8348c4f000000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -11923,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec34000000000000000000000000d28bf17c6b194a0aa6db97afb5c6781fc96c3fec000000000000000000000000d28bf17c6b194a0aa6db97afb5c6781fc96c3fec00000000000000000000000000000000000000000000000000038d7ea4c6800000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -11924,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec340000000000000000000000000a9643a822abe24a62d989cba0ef57a8168ba3730000000000000000000000000a9643a822abe24a62d989cba0ef57a8168ba37300000000000000000000000000000000000000000000000000060a24181e400000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -11925,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec34000000000000000000000000ac32406f31634322662bdc1e9f9d5ea247de7e2a000000000000000000000000ac32406f31634322662bdc1e9f9d5ea247de7e2a00000000000000000000000000000000000000000000000000aa13b7c87c0dd900000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -11926,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec3400000000000000000000000073342f619780312b3f6d85af48c64aaf8c32315d00000000000000000000000073342f619780312b3f6d85af48c64aaf8c32315d00000000000000000000000000000000000000000000000000082bd67afbc00000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -11930,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec340000000000000000000000001c139649763b154b18a3407dbbc7c29c63f8e0e60000000000000000000000001c139649763b154b18a3407dbbc7c29c63f8e0e600000000000000000000000000000000000000000000000000038d7ea4c6800000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -11931,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec34000000000000000000000000568c7b10f0b0d87e88401f5167bc6db5934dfcc4000000000000000000000000568c7b10f0b0d87e88401f5167bc6db5934dfcc4000000000000000000000000000000000000000000000000000aa87bee53800000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -11933,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec3400000000000000000000000079ce1426b21bb2cfae014388ade594666ecef4c000000000000000000000000079ce1426b21bb2cfae014388ade594666ecef4c0000000000000000000000000000000000000000000000000000c6f3b40b6c00000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -11935,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec340000000000000000000000005d2b49dd577a65bb18208fb7e9be307f4b028a200000000000000000000000005d2b49dd577a65bb18208fb7e9be307f4b028a2000000000000000000000000000000000000000000000000000060a24181e400000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -11938,0xcd9d4988c0ae61887b075ba77f08cbfad2b65068,0x3f87ff1de58128ef8fcb4c807efd776e1ac72e51,0xf4f7b41a000000000000000000000000d6129da37dad28b70ba29e542e3a0a074084c6260000000000000000000000000000000000000000000000009d4120c707de5e06,,,1,true -11939,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec34000000000000000000000000bf1967f9ec206f4bbb009eb5947f252db58e10f8000000000000000000000000bf1967f9ec206f4bbb009eb5947f252db58e10f800000000000000000000000000000000000000000000000000060a24181e400000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -11940,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec340000000000000000000000006220c72064620a4aacc99c68677eef8bf36877f70000000000000000000000006220c72064620a4aacc99c68677eef8bf36877f700000000000000000000000000000000000000000000000006f05b59d3b2000000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -11942,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec34000000000000000000000000ba139847cd31ac73d2df5862dd1b9a1269b05bf5000000000000000000000000ba139847cd31ac73d2df5862dd1b9a1269b05bf50000000000000000000000000000000000000000000000000dd4892e096c46b900000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -11945,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0xa9f9e675000000000000000000000000a0b86991c6218b36c1d19d4a2e9eb0ce3606eb480000000000000000000000007f5c764cbc14f9669b88837ca1490cca17c316070000000000000000000000002f67566867a23b5fc56b26a4cbe0d7eb2c76df050000000000000000000000002f67566867a23b5fc56b26a4cbe0d7eb2c76df05000000000000000000000000000000000000000000000000000000001ba2a86d00000000000000000000000000000000000000000000000000000000000000c00000000000000000000000000000000000000000000000000000000000000000,0xde0e617c86199de66b80a053111b1f4ccf97174e5963e0fd6482e42c6e7f43a3,2021-12-12 07:49:39.000 UTC,0,true -11947,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec34000000000000000000000000ea4e3a392b7a94dde227a5df50645229a69d12f7000000000000000000000000ea4e3a392b7a94dde227a5df50645229a69d12f700000000000000000000000000000000000000000000000000201a32bc25778000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -11949,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec34000000000000000000000000ea4e3a392b7a94dde227a5df50645229a69d12f7000000000000000000000000ea4e3a392b7a94dde227a5df50645229a69d12f7000000000000000000000000000000000000000000000000013a0a79480b4cdf00000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -11953,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec34000000000000000000000000d28bf17c6b194a0aa6db97afb5c6781fc96c3fec000000000000000000000000d28bf17c6b194a0aa6db97afb5c6781fc96c3fec000000000000000000000000000000000000000000000000002386f26fc1000000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -11957,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec340000000000000000000000005558430f593a32be28dd369fab48c291a7ccfb960000000000000000000000005558430f593a32be28dd369fab48c291a7ccfb9600000000000000000000000000000000000000000000000000b1a2bc2ec5000000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -11959,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec34000000000000000000000000107e60e09c1b9399c2f9c51051051acc2d5db0db000000000000000000000000107e60e09c1b9399c2f9c51051051acc2d5db0db000000000000000000000000000000000000000000000000002386f26fc1000000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -11961,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec34000000000000000000000000ac5f837b8c55c0acfef6d900db388533866050f5000000000000000000000000ac5f837b8c55c0acfef6d900db388533866050f500000000000000000000000000000000000000000000000002c06611853df7ef00000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,0x8bef80cd7a2214296355ed60b1c79cb30f2efca908004921610993295c920541,2022-03-04 10:35:33.000 UTC,0,true -11962,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec340000000000000000000000002ab46674dfb8539ab5380173f9c86138df5230b90000000000000000000000002ab46674dfb8539ab5380173f9c86138df5230b9000000000000000000000000000000000000000000000000021e6d1855e43b8e00000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -11963,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec34000000000000000000000000a7c4f4c108efbe0a0ad9c0dc0920e5ecfaa52108000000000000000000000000a7c4f4c108efbe0a0ad9c0dc0920e5ecfaa521080000000000000000000000000000000000000000000000000001c6bf5263400000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -11964,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec34000000000000000000000000f36a4ccb3b96f1e7718b12cc076506e5c0c602d3000000000000000000000000f36a4ccb3b96f1e7718b12cc076506e5c0c602d3000000000000000000000000000000000000000000000000015c622b4c412bd400000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -11965,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec340000000000000000000000008358672afa934969f986ed644c3a8b8bcc17eec40000000000000000000000008358672afa934969f986ed644c3a8b8bcc17eec400000000000000000000000000000000000000000000000000016bcc41e9000000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -11968,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec340000000000000000000000001930f414f04adc142aafebf7f6651a31e6a708de0000000000000000000000001930f414f04adc142aafebf7f6651a31e6a708de000000000000000000000000000000000000000000000000000110d9316ec00000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -11971,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec340000000000000000000000001651106085698f19912753ef131d6a5c9c8024c40000000000000000000000001651106085698f19912753ef131d6a5c9c8024c40000000000000000000000000000000000000000000000000467e10df683db6300000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -11972,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec340000000000000000000000005d833a03f32bd62070bfc53f1e02497bb7fbbe720000000000000000000000005d833a03f32bd62070bfc53f1e02497bb7fbbe7200000000000000000000000000000000000000000000000000038d7ea4c6800000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -11973,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec3400000000000000000000000050738cf28a47f00537da8cfbd2c51efc384a134a00000000000000000000000050738cf28a47f00537da8cfbd2c51efc384a134a000000000000000000000000000000000000000000000000002386f26fc1000000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -11974,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec34000000000000000000000000042d9ebf0e126b29824fffeb4fc4ba5393ce1975000000000000000000000000042d9ebf0e126b29824fffeb4fc4ba5393ce197500000000000000000000000000000000000000000000000000038d7ea4c6800000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -11975,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec340000000000000000000000009cdd2b751f0f88468348b6ec3f47cc6e818bcf570000000000000000000000009cdd2b751f0f88468348b6ec3f47cc6e818bcf5700000000000000000000000000000000000000000000000000aaf3bce37e735700000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -11977,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec3400000000000000000000000055ab119210fc6b44177b5c6ec08ec8289e360ce000000000000000000000000055ab119210fc6b44177b5c6ec08ec8289e360ce0000000000000000000000000000000000000000000000000000110d9316ec00000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -11978,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec34000000000000000000000000cfc2b9c3000ec2ab725b925a83b4d693077f2be1000000000000000000000000cfc2b9c3000ec2ab725b925a83b4d693077f2be100000000000000000000000000000000000000000000000000b7e1fd124360a200000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -11979,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec3400000000000000000000000047dd44a601daf48b7a5dd18fb1eb1cee14be416900000000000000000000000047dd44a601daf48b7a5dd18fb1eb1cee14be416900000000000000000000000000000000000000000000000000aab7a2e9171e0800000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -11981,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec340000000000000000000000000d5901ecad0bc8786a9b6fa53a19ce465ccba1990000000000000000000000000d5901ecad0bc8786a9b6fa53a19ce465ccba19900000000000000000000000000000000000000000000000000038d7ea4c6800000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -11982,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec34000000000000000000000000a842261c0f3c9c3a9c5cb99116a4f2af7d55f8bd000000000000000000000000a842261c0f3c9c3a9c5cb99116a4f2af7d55f8bd000000000000000000000000000000000000000000000000000110d9316ec00000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -11984,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec340000000000000000000000000c5a05853401bc0631a693ec719ca8725407db190000000000000000000000000c5a05853401bc0631a693ec719ca8725407db19000000000000000000000000000000000000000000000000000110d9316ec00000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -11985,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec3400000000000000000000000030051dc685a3e27bc94928858d02f3b5e8835ae200000000000000000000000030051dc685a3e27bc94928858d02f3b5e8835ae2000000000000000000000000000000000000000000000000000110d9316ec00000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -11987,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec34000000000000000000000000890a0047f8d573347872cb6c019f86552f2367d6000000000000000000000000890a0047f8d573347872cb6c019f86552f2367d6000000000000000000000000000000000000000000000000002aa1efb94e000000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -11990,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec3400000000000000000000000014a90490a5439ae28ed1b2214355d20b5927ef8500000000000000000000000014a90490a5439ae28ed1b2214355d20b5927ef85000000000000000000000000000000000000000000000000000110d9316ec00000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -11992,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec3400000000000000000000000075ac65073d45d3f53c66fe338827ad13ed362a8800000000000000000000000075ac65073d45d3f53c66fe338827ad13ed362a88000000000000000000000000000000000000000000000000015aeab2d7ff93a500000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -11997,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec340000000000000000000000007eff1b48ff4e4c1fad9879eef26670d49347def60000000000000000000000007eff1b48ff4e4c1fad9879eef26670d49347def6000000000000000000000000000000000000000000000000000110d9316ec00000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -11999,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec34000000000000000000000000467dff5627f13b71a10a62c9d79a34be4043ae69000000000000000000000000467dff5627f13b71a10a62c9d79a34be4043ae69000000000000000000000000000000000000000000000000015c2a7b13fd000000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -12000,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec34000000000000000000000000bd55c5bad3a6faab9cc7e917d03af0e91ef38f2d000000000000000000000000bd55c5bad3a6faab9cc7e917d03af0e91ef38f2d00000000000000000000000000000000000000000000000001d7aaff0c21cb9700000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,0x357f628ca652889dc3a402959e3956dd07d675d1e62d49334317dfbd8a62bb14,2022-03-11 03:46:32.000 UTC,0,true -12003,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec34000000000000000000000000e5dc734123047c8c2a85fe9c6c86992b575bda91000000000000000000000000e5dc734123047c8c2a85fe9c6c86992b575bda910000000000000000000000000000000000000000000000000dbd2fc137a3000000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -12004,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec340000000000000000000000004bf0d6b03588ce8a00d2c3d7fd9d1933a039c9dc0000000000000000000000004bf0d6b03588ce8a00d2c3d7fd9d1933a039c9dc00000000000000000000000000000000000000000000000001526acb1803a88000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -12009,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec340000000000000000000000000929a2d59f6d8f8b63d976f8053d1349032127900000000000000000000000000929a2d59f6d8f8b63d976f8053d1349032127900000000000000000000000000000000000000000000000000058d15e1762800000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -12015,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec34000000000000000000000000989680e560b3374798559a1a9c11ca8eb811c979000000000000000000000000989680e560b3374798559a1a9c11ca8eb811c9790000000000000000000000000000000000000000000000000de0b6b3a764000000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -12016,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec34000000000000000000000000ed6c97a0bd5c0bb5e5f3d9fc844a1b031327cb72000000000000000000000000ed6c97a0bd5c0bb5e5f3d9fc844a1b031327cb720000000000000000000000000000000000000000000000000069c84558c6391900000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -12017,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec34000000000000000000000000487590f027355961c9f9811b602fe29c6f88055a000000000000000000000000487590f027355961c9f9811b602fe29c6f88055a00000000000000000000000000000000000000000000000000a801d1d68ceefd00000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -12018,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec34000000000000000000000000e2070eddf64822e36b7c57353319e2c531815b2c000000000000000000000000e2070eddf64822e36b7c57353319e2c531815b2c0000000000000000000000000000000000000000000000000289b4ac6fd6a86e00000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -12020,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec340000000000000000000000005fdc62e19a5bfdc1b56a7843bf378635eb362e6e0000000000000000000000005fdc62e19a5bfdc1b56a7843bf378635eb362e6e000000000000000000000000000000000000000000000000014c1ce34b1b570400000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,0x274cbd5daae237de00a23a25b96ced81231cd88590e0c9026fbf399cbba5acdc,2021-12-26 09:00:54.000 UTC,0,true -12021,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec3400000000000000000000000094db391a8298d6de90892d78406551e8987c2c1a00000000000000000000000094db391a8298d6de90892d78406551e8987c2c1a0000000000000000000000000000000000000000000000000000fb90a5bda5b100000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -12022,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec3400000000000000000000000030ceb5248d27cc826a7563a7abc1ce5ab166c41200000000000000000000000030ceb5248d27cc826a7563a7abc1ce5ab166c412000000000000000000000000000000000000000000000000001c04ce2b08a97500000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -12023,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec340000000000000000000000003eb40255eecc782507c4b98c0ef7944d03a67e5d0000000000000000000000003eb40255eecc782507c4b98c0ef7944d03a67e5d0000000000000000000000000000000000000000000000000000b5e620f4800000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -12026,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec3400000000000000000000000014f4785e5f8738eb589eb0bf9edc6a5f8675594400000000000000000000000014f4785e5f8738eb589eb0bf9edc6a5f86755944000000000000000000000000000000000000000000000000001d2190327665e900000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -12027,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec3400000000000000000000000029541aa4328e1cb4d820eda83ca84dcb1a1ccd1a00000000000000000000000029541aa4328e1cb4d820eda83ca84dcb1a1ccd1a00000000000000000000000000000000000000000000000003cda88363e920ad00000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,0x1144dd5fce53d2b82cea0da4d97150ee584486db707cfa0cd9bdddb24d2dd635,2022-02-20 20:39:14.000 UTC,0,true -12028,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec3400000000000000000000000096e0ea298c54f058f73e52ebf1050d0dc2c7368600000000000000000000000096e0ea298c54f058f73e52ebf1050d0dc2c736860000000000000000000000000000000000000000000000000062c446aa696af300000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -12029,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec340000000000000000000000005ed6a87517914eb67cce0930fed72e61ce2d64450000000000000000000000005ed6a87517914eb67cce0930fed72e61ce2d6445000000000000000000000000000000000000000000000000000aa87bee53800000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -12031,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec34000000000000000000000000a7ac3c661368cff60e87464b19915eaf9a5d3f8a000000000000000000000000a7ac3c661368cff60e87464b19915eaf9a5d3f8a0000000000000000000000000000000000000000000000000009adbf5e9016e200000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -12037,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec34000000000000000000000000c3f2a7d831a35fba958028f4a6ca0b2003390099000000000000000000000000c3f2a7d831a35fba958028f4a6ca0b200339009900000000000000000000000000000000000000000000000003311fc80a57000000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -12040,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec3400000000000000000000000015b2745b585a07a449f4dc1c61fca4c7a446459500000000000000000000000015b2745b585a07a449f4dc1c61fca4c7a4464595000000000000000000000000000000000000000000000000003f84a6338bd6da00000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -12041,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec3400000000000000000000000069279507fc76feb6b3e455b064b52bae5043cb2500000000000000000000000069279507fc76feb6b3e455b064b52bae5043cb2500000000000000000000000000000000000000000000000000b1a2bc2ec5000000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -12042,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec34000000000000000000000000fd2e96e66c9508029d5520f1f991e8cd8dc6e562000000000000000000000000fd2e96e66c9508029d5520f1f991e8cd8dc6e562000000000000000000000000000000000000000000000000000ba9fbe228620000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -12043,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec340000000000000000000000005b0e303fdac2f18509793aec7e53676540f434c20000000000000000000000005b0e303fdac2f18509793aec7e53676540f434c2000000000000000000000000000000000000000000000000008e1bc9bf04000000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,0x11722756f3f34237cfca034c171999466a88d9614d07ba69fb92e593a2a99de8,2022-05-18 08:59:44.000 UTC,0,true -12045,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec340000000000000000000000002e39d2fa4c2881445e50ecb9319b9308a0de3b540000000000000000000000002e39d2fa4c2881445e50ecb9319b9308a0de3b5400000000000000000000000000000000000000000000000000995116b48e17a400000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -12046,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec340000000000000000000000001e5847c75c961c25ecd81fcae4bb24ed5023da2a0000000000000000000000001e5847c75c961c25ecd81fcae4bb24ed5023da2a000000000000000000000000000000000000000000000000005dc59b98ecc0c100000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -12051,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec340000000000000000000000002f726679d42ce2a8e67064e090768fb2468225800000000000000000000000002f726679d42ce2a8e67064e090768fb246822580000000000000000000000000000000000000000000000000014f069a55ca39a400000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -12056,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec34000000000000000000000000f75350e9e70c2531345d7b567b742923b2d8ef43000000000000000000000000f75350e9e70c2531345d7b567b742923b2d8ef4300000000000000000000000000000000000000000000000001610d759a6c870000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -12057,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec3400000000000000000000000015097e42b6e80063967b33257d7eae981273c13500000000000000000000000015097e42b6e80063967b33257d7eae981273c1350000000000000000000000000000000000000000000000000018de76816d800000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -12059,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec340000000000000000000000006094d4b6b8d6710dd56682a73c0e6c09b4aa08c60000000000000000000000006094d4b6b8d6710dd56682a73c0e6c09b4aa08c6000000000000000000000000000000000000000000000000036e230927e3378000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -12060,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec340000000000000000000000005fc7ef8128b2a49067783fdd0c5b58c3f8c0a8980000000000000000000000005fc7ef8128b2a49067783fdd0c5b58c3f8c0a89800000000000000000000000000000000000000000000000006e04c673618af5c00000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,0xda464806c12b2ebb4d0cfd59e4e4ae43ebee248d5236d95d97af9dcab98fd011,2022-02-16 03:29:43.000 UTC,0,true -12061,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec34000000000000000000000000771e53058313a5f0eb388d676cdfcd4d273ce052000000000000000000000000771e53058313a5f0eb388d676cdfcd4d273ce052000000000000000000000000000000000000000000000000000581b77f66e00000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -12064,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec34000000000000000000000000ba5651e3d4f3d63d19cb6e351147773dbf505095000000000000000000000000ba5651e3d4f3d63d19cb6e351147773dbf50509500000000000000000000000000000000000000000000000000a9124ad2032e2e00000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -12065,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec3400000000000000000000000093074926da1378296243fc766208b841c61cde6600000000000000000000000093074926da1378296243fc766208b841c61cde66000000000000000000000000000000000000000000000000000581b77f66e00000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -12068,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec34000000000000000000000000c18237f4facf817839b229ea67b94ae073be0fa9000000000000000000000000c18237f4facf817839b229ea67b94ae073be0fa9000000000000000000000000000000000000000000000000000581b77f66e00000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -12069,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec340000000000000000000000005d0295e32371bc61b0c35cd9b6caf89106ad01ea0000000000000000000000005d0295e32371bc61b0c35cd9b6caf89106ad01ea000000000000000000000000000000000000000000000000001a4a42c356800000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -12070,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec340000000000000000000000009558882b792bb58c469ad20e072e50f8bdf065cd0000000000000000000000009558882b792bb58c469ad20e072e50f8bdf065cd000000000000000000000000000000000000000000000000000581b77f66e00000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -12076,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec34000000000000000000000000268f91e2e132fde501ac194f347ae78cb907f64e000000000000000000000000268f91e2e132fde501ac194f347ae78cb907f64e00000000000000000000000000000000000000000000000000f0150773ea0dcb00000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,0x2db8529fd4092888fd8137354b50d6c554c1a7daf2f2a8580a9e1c6677f63b35,2021-11-21 13:20:24.000 UTC,0,true -12078,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec34000000000000000000000000a5777aa4045d2fa53b41a2012d5d4fe814537fee000000000000000000000000a5777aa4045d2fa53b41a2012d5d4fe814537fee00000000000000000000000000000000000000000000000003311fc80a57000000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -12080,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec34000000000000000000000000b9b73a69c1a59de5c89e18574adf3ce6b6d9102b000000000000000000000000b9b73a69c1a59de5c89e18574adf3ce6b6d9102b000000000000000000000000000000000000000000000000003fbc1268ef14bf00000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -12081,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec340000000000000000000000007c789404d651cfc68f39b2f3dcf2feb0360460ce0000000000000000000000007c789404d651cfc68f39b2f3dcf2feb0360460ce000000000000000000000000000000000000000000000000008e1bc9bf04000000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,0x6256ddff5264c3a0b3310ca673f36ea34c66945a75aa8e3092edb05a7cde595a,2022-05-18 12:55:50.000 UTC,0,true -12084,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec340000000000000000000000005430c0b289a72895062941368d7ac4a78b9f94c40000000000000000000000005430c0b289a72895062941368d7ac4a78b9f94c400000000000000000000000000000000000000000000000000398b3102235ded00000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -12086,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec3400000000000000000000000060590470118e4b4797132c98fb395c18f12aa87a00000000000000000000000060590470118e4b4797132c98fb395c18f12aa87a000000000000000000000000000000000000000000000000015b151fc2d9e5f000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -12087,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec3400000000000000000000000078b8690e940df55554fa1fde360921ee39e6ba2d00000000000000000000000078b8690e940df55554fa1fde360921ee39e6ba2d000000000000000000000000000000000000000000000000004db470adaecf0200000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -12089,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec3400000000000000000000000013b65bc0885e7d9f11f6affd0ba44c19ddc12c4100000000000000000000000013b65bc0885e7d9f11f6affd0ba44c19ddc12c41000000000000000000000000000000000000000000000000007f2e335c2e47c000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -12092,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec34000000000000000000000000fe958a22c1f453c797e341c202c86ba607276c88000000000000000000000000fe958a22c1f453c797e341c202c86ba607276c88000000000000000000000000000000000000000000000000032938a8f5b0e36a00000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -12095,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0xa9f9e675000000000000000000000000a0b86991c6218b36c1d19d4a2e9eb0ce3606eb480000000000000000000000007f5c764cbc14f9669b88837ca1490cca17c3160700000000000000000000000067ffb0c645f5843ff88a6ff0fc91fd1798974e5700000000000000000000000067ffb0c645f5843ff88a6ff0fc91fd1798974e570000000000000000000000000000000000000000000000000000000000c0641000000000000000000000000000000000000000000000000000000000000000c00000000000000000000000000000000000000000000000000000000000000000,,,1,true -12101,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec34000000000000000000000000659f7952cf483abcb29111f0e79730328a3ca612000000000000000000000000659f7952cf483abcb29111f0e79730328a3ca61200000000000000000000000000000000000000000000000001c9ec6dfeb0a22c00000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -12102,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec34000000000000000000000000ca39fdb1ec1d885318e6111f2eef8b600bc33db9000000000000000000000000ca39fdb1ec1d885318e6111f2eef8b600bc33db9000000000000000000000000000000000000000000000000000d42623645a28000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -12103,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec340000000000000000000000004defc44cdfd3eee7fae1d5a3901e97b27cd01e3c0000000000000000000000004defc44cdfd3eee7fae1d5a3901e97b27cd01e3c0000000000000000000000000000000000000000000000000043917c6ccd9ac000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -12105,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec340000000000000000000000009d19aa0d24e604f77aba4cd250ffbaf6b15819b70000000000000000000000009d19aa0d24e604f77aba4cd250ffbaf6b15819b70000000000000000000000000000000000000000000000000040c67ea3a989b500000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -12107,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec34000000000000000000000000106d5bcd38f25e584150e1915687675c36d28ea8000000000000000000000000106d5bcd38f25e584150e1915687675c36d28ea8000000000000000000000000000000000000000000000000005e489a8390697500000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -12109,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec3400000000000000000000000079a549989e7aecd4c0e40ed0ebb9a30350a870bd00000000000000000000000079a549989e7aecd4c0e40ed0ebb9a30350a870bd0000000000000000000000000000000000000000000000000113d7bbcf92158500000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,0x2069a1d6e737681d6dfb154e86e61c6629318116df688f0238d718546306e6da,2022-04-23 17:50:07.000 UTC,0,true -12110,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec34000000000000000000000000f167ddd0d854c524d5f8b16a09471a63772a8ffb000000000000000000000000f167ddd0d854c524d5f8b16a09471a63772a8ffb00000000000000000000000000000000000000000000000001596d834ee4efa200000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -12112,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec34000000000000000000000000764ef8aba8e67af506fa65bad1342bf34571ec3e000000000000000000000000764ef8aba8e67af506fa65bad1342bf34571ec3e0000000000000000000000000000000000000000000000000002e3c65acf830000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -12115,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec34000000000000000000000000c581081214b403b8aa2fd1098e250e0f82cd4605000000000000000000000000c581081214b403b8aa2fd1098e250e0f82cd4605000000000000000000000000000000000000000000000000020b305717a605f500000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -12116,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec340000000000000000000000003e990486968daeac95fdf07ef6722ab71db276c40000000000000000000000003e990486968daeac95fdf07ef6722ab71db276c4000000000000000000000000000000000000000000000000000458d262defd0000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -12117,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0xa9f9e675000000000000000000000000a0b86991c6218b36c1d19d4a2e9eb0ce3606eb480000000000000000000000007f5c764cbc14f9669b88837ca1490cca17c31607000000000000000000000000e865637cbc8468ad4214f5055b9a7500a2b96e32000000000000000000000000e865637cbc8468ad4214f5055b9a7500a2b96e3200000000000000000000000000000000000000000000000000000000078a1cb700000000000000000000000000000000000000000000000000000000000000c00000000000000000000000000000000000000000000000000000000000000000,0x0b4e154ff93557de368a5dd1db67e2daf991a966e4cb4ae99809cc63b8fa8be1,2022-06-01 04:45:12.000 UTC,0,true -12120,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec34000000000000000000000000b882b087bd80a0258f19d907849c8d64cac3dba1000000000000000000000000b882b087bd80a0258f19d907849c8d64cac3dba10000000000000000000000000000000000000000000000000005543df729c00000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -12121,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec340000000000000000000000002a7a1c07b74806800eff667c5de512404810684f0000000000000000000000002a7a1c07b74806800eff667c5de512404810684f00000000000000000000000000000000000000000000000002b9c4e91a857eb800000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,0xb3b1918badb67b6e032052dddc7174e8adec6006aa3bf6cea7bd1e8d79ad0471,2022-02-27 18:58:51.000 UTC,0,true -12124,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec3400000000000000000000000021bc50129dd6c34162ec0cf715857042cd09ec2300000000000000000000000021bc50129dd6c34162ec0cf715857042cd09ec230000000000000000000000000000000000000000000000000020e96a892d660000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -12125,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec340000000000000000000000000aa350fb487f75d4f5d6ed920a5ae0923ded06e10000000000000000000000000aa350fb487f75d4f5d6ed920a5ae0923ded06e100000000000000000000000000000000000000000000000002c68af0bb14000000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -12126,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec34000000000000000000000000357e6a98da9c3bde7e17f5bcbbbd3e2107d117ba000000000000000000000000357e6a98da9c3bde7e17f5bcbbbd3e2107d117ba00000000000000000000000000000000000000000000000002bb0098c93cc62000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -12129,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec340000000000000000000000003ca68692fc89e29f7e79cd74aeec92af4ed166460000000000000000000000003ca68692fc89e29f7e79cd74aeec92af4ed166460000000000000000000000000000000000000000000000000005543df729c00000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -12131,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec3400000000000000000000000029c7ec5e8ca184ba83b970b4a89a2adb4a083dba00000000000000000000000029c7ec5e8ca184ba83b970b4a89a2adb4a083dba000000000000000000000000000000000000000000000000005286bd43a3730000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -12132,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec34000000000000000000000000fcc64593075d713bfc9e927d7161ba7b53a33898000000000000000000000000fcc64593075d713bfc9e927d7161ba7b53a33898000000000000000000000000000000000000000000000000003bc46397c3ddf600000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -12133,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec34000000000000000000000000b882b087bd80a0258f19d907849c8d64cac3dba1000000000000000000000000b882b087bd80a0258f19d907849c8d64cac3dba100000000000000000000000000000000000000000000000000071afd498d000000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -12135,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec340000000000000000000000002dec44a6acf386368f6468461b810a5b2d60982f0000000000000000000000002dec44a6acf386368f6468461b810a5b2d60982f00000000000000000000000000000000000000000000000002c68af0bb14000000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -12136,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec3400000000000000000000000093433264cccb31c80a62b0eee78e37ebbb0377e300000000000000000000000093433264cccb31c80a62b0eee78e37ebbb0377e30000000000000000000000000000000000000000000000000d77cf52a1946b3c00000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -12143,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec34000000000000000000000000cb7a4c047a5b152b1319b2d7f3a590d5388e78a3000000000000000000000000cb7a4c047a5b152b1319b2d7f3a590d5388e78a3000000000000000000000000000000000000000000000000003c105824cfe10000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -12145,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec34000000000000000000000000cf8c7f3aef546992c9f8f42900b4ca245ceb5c88000000000000000000000000cf8c7f3aef546992c9f8f42900b4ca245ceb5c880000000000000000000000000000000000000000000000000139b4b5118bc91100000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -12148,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec34000000000000000000000000c7083893735f9aa7e9ccc4b41f8a3a0b188e9fda000000000000000000000000c7083893735f9aa7e9ccc4b41f8a3a0b188e9fda00000000000000000000000000000000000000000000000006bb10ee2c10800000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -12151,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec340000000000000000000000002b72f0a2e5269951e3bcbeb50e8e35f182043f790000000000000000000000002b72f0a2e5269951e3bcbeb50e8e35f182043f79000000000000000000000000000000000000000000000000003dc64337b204f600000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -12152,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec34000000000000000000000000492261c62c8f0e1783b6f3e60d5c03e2e532f167000000000000000000000000492261c62c8f0e1783b6f3e60d5c03e2e532f1670000000000000000000000000000000000000000000000000079638a034e2c2500000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,0x5c6c1a3acd6b03fb837f15ee8cc60796b2fef4673bd31f7ff5266f33c8b76df9,2022-03-14 06:54:17.000 UTC,0,true -12156,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec34000000000000000000000000dd533307557ac9e1b9ee7fce0256ae909d6aedc8000000000000000000000000dd533307557ac9e1b9ee7fce0256ae909d6aedc800000000000000000000000000000000000000000000000000497384c12aa18000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -12157,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec34000000000000000000000000dd533307557ac9e1b9ee7fce0256ae909d6aedc8000000000000000000000000dd533307557ac9e1b9ee7fce0256ae909d6aedc800000000000000000000000000000000000000000000000000309dbd04fa3e0100000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -12159,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec340000000000000000000000005e4038eb6f1e7316a45ed569e94c8cd1706a5ec50000000000000000000000005e4038eb6f1e7316a45ed569e94c8cd1706a5ec50000000000000000000000000000000000000000000000000048c36b4374b7ce00000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -12163,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec340000000000000000000000003f339fa28e328d783b991bcc6785d1eba0b4fe2d0000000000000000000000003f339fa28e328d783b991bcc6785d1eba0b4fe2d00000000000000000000000000000000000000000000000000411ae864d78fe900000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -12164,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec34000000000000000000000000f5a9ca279a99365d83c6c744ca5d3e0b87ec060d000000000000000000000000f5a9ca279a99365d83c6c744ca5d3e0b87ec060d000000000000000000000000000000000000000000000000003f532fbd67641400000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -12167,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec34000000000000000000000000f7a3668f8bc40af03579fc00bedc31e4cc662624000000000000000000000000f7a3668f8bc40af03579fc00bedc31e4cc662624000000000000000000000000000000000000000000000000089d0381984f555600000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -12168,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec34000000000000000000000000927fd99fc1cc1d0da4c421149e708a6db193b239000000000000000000000000927fd99fc1cc1d0da4c421149e708a6db193b239000000000000000000000000000000000000000000000000005e920e7547557c00000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -12170,0x10e6593cdda8c58a1d0f14c5164b376352a55f2f,0x467194771dae2967aef3ecbedd3bf9a310c76c65,0xa9f9e6750000000000000000000000006b175474e89094c44da98b954eedeac495271d0f000000000000000000000000da10009cbd5d07dd0cecc66161fc93d7c9000da100000000000000000000000099e201231e44ba38af6fea7f54eaa19c90bef80600000000000000000000000099e201231e44ba38af6fea7f54eaa19c90bef80600000000000000000000000000000000000000000000000c18751e446e5e912f00000000000000000000000000000000000000000000000000000000000000c00000000000000000000000000000000000000000000000000000000000000000,0xa32478d043bb4df36c41b33eced66255503aee33b2d15c0aa3bddc50bea0b465,2021-11-28 12:52:31.000 UTC,0,true -12183,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec34000000000000000000000000edbcf860bee646199b84a351f4a55d7e929a7a36000000000000000000000000edbcf860bee646199b84a351f4a55d7e929a7a36000000000000000000000000000000000000000000000000002386f26fc1000000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -12186,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec3400000000000000000000000081304f07bb9c9c66cc64100a5d827810e6a6530300000000000000000000000081304f07bb9c9c66cc64100a5d827810e6a653030000000000000000000000000000000000000000000000000005543df729c00000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -12189,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec340000000000000000000000004a9e11c0fe965f551fd21d448a9861d10b9b6c5e0000000000000000000000004a9e11c0fe965f551fd21d448a9861d10b9b6c5e0000000000000000000000000000000000000000000000000005543df729c00000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -12191,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec34000000000000000000000000b2274d48ae08c580e08d316530b64a32fde0fbb0000000000000000000000000b2274d48ae08c580e08d316530b64a32fde0fbb00000000000000000000000000000000000000000000000000002d7272244020000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -12193,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec340000000000000000000000004d70e9499b2d791b5eb15759b2c2e6f3947ab4980000000000000000000000004d70e9499b2d791b5eb15759b2c2e6f3947ab4980000000000000000000000000000000000000000000000000005543df729c00000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -12194,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec340000000000000000000000006a7f769421e4486eb2f8bc3067f8c79a354552930000000000000000000000006a7f769421e4486eb2f8bc3067f8c79a354552930000000000000000000000000000000000000000000000000005543df729c00000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -12196,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec34000000000000000000000000c2db6c1cdd02b8bf48c9d30fea6c8ac13eff5a0a000000000000000000000000c2db6c1cdd02b8bf48c9d30fea6c8ac13eff5a0a0000000000000000000000000000000000000000000000000044da35120a0dcd00000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -12197,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec34000000000000000000000000d93b019f298b369adb1ce53b72cdf239a9b0b838000000000000000000000000d93b019f298b369adb1ce53b72cdf239a9b0b8380000000000000000000000000000000000000000000000000005543df729c00000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -12199,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec34000000000000000000000000a87a104b9601874d981436738546337d94e4be02000000000000000000000000a87a104b9601874d981436738546337d94e4be020000000000000000000000000000000000000000000000000005543df729c00000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -12203,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec34000000000000000000000000618208c77c81898331ec6880ef5f1ffa758d3915000000000000000000000000618208c77c81898331ec6880ef5f1ffa758d39150000000000000000000000000000000000000000000000000011c37937e0800000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -12204,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec340000000000000000000000003170b8bfbe8b8938c9c42006ddd5faec04232bbf0000000000000000000000003170b8bfbe8b8938c9c42006ddd5faec04232bbf0000000000000000000000000000000000000000000000000011c37937e0800000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -12206,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec34000000000000000000000000b0196dedba94cb41a9480eb2cc38cbe044ec0496000000000000000000000000b0196dedba94cb41a9480eb2cc38cbe044ec04960000000000000000000000000000000000000000000000000011c37937e0800000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -12214,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec34000000000000000000000000bf5310fae4d7a0c6df0452bcda09aefa2748ad59000000000000000000000000bf5310fae4d7a0c6df0452bcda09aefa2748ad59000000000000000000000000000000000000000000000000000c6f3b40b6c00000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -12215,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec340000000000000000000000002e604e03d0b90e8aa058bb8bb6313e749606832c0000000000000000000000002e604e03d0b90e8aa058bb8bb6313e749606832c000000000000000000000000000000000000000000000000002441157bb525dd00000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -12216,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec34000000000000000000000000467a755ba59267678e14e414ed214c3cea836498000000000000000000000000467a755ba59267678e14e414ed214c3cea83649800000000000000000000000000000000000000000000000000354a6ba7a1800000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -12217,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec34000000000000000000000000eb4413d6ac1b0225523eeb00f1dd4c1d733621dd000000000000000000000000eb4413d6ac1b0225523eeb00f1dd4c1d733621dd00000000000000000000000000000000000000000000000000071afd498d000000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -12219,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec34000000000000000000000000435be2e484393babeaa4a919f8e30bb5dbd808ce000000000000000000000000435be2e484393babeaa4a919f8e30bb5dbd808ce0000000000000000000000000000000000000000000000000429d069189e000000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -12221,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0xa9f9e675000000000000000000000000514910771af9ca656af840dff83e8264ecf986ca000000000000000000000000350a791bfc2c21f9ed5d10980dad2e2638ffa7f60000000000000000000000006bc4c6cfd03decb17657e71d5b6eca3cbaf8a4360000000000000000000000006bc4c6cfd03decb17657e71d5b6eca3cbaf8a43600000000000000000000000000000000000000000000000025c838dcff60c4aa00000000000000000000000000000000000000000000000000000000000000c00000000000000000000000000000000000000000000000000000000000000000,,,1,true -12222,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec34000000000000000000000000322cc309626a170df4385a7a5624dee44d4e5e1f000000000000000000000000322cc309626a170df4385a7a5624dee44d4e5e1f0000000000000000000000000000000000000000000000000067cccce7969e0000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -12225,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec340000000000000000000000009d7ad2d86beae9f82f35b1f3fa9a246a5e6ff7fc0000000000000000000000009d7ad2d86beae9f82f35b1f3fa9a246a5e6ff7fc000000000000000000000000000000000000000000000000007d7b9c5b6a05d500000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -12226,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec3400000000000000000000000084861b33ba6c7ae0dc01e0e3192e74d133d9a13a00000000000000000000000084861b33ba6c7ae0dc01e0e3192e74d133d9a13a000000000000000000000000000000000000000000000000001bbba96a3612e100000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -12233,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec340000000000000000000000007269f818a33779b8f1f517e0bc1466110ce915050000000000000000000000007269f818a33779b8f1f517e0bc1466110ce91505000000000000000000000000000000000000000000000000001c28cd70b1b70000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -12235,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec34000000000000000000000000e9cd8427ba55bef4ee8cd22b5f82f88d04f17619000000000000000000000000e9cd8427ba55bef4ee8cd22b5f82f88d04f1761900000000000000000000000000000000000000000000000000b1a2bc2ec5000000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -12239,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec34000000000000000000000000f3e11d89b07e738f31de12e8d8cfa0eac7867a37000000000000000000000000f3e11d89b07e738f31de12e8d8cfa0eac7867a37000000000000000000000000000000000000000000000000006416a75da11bf500000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,0x15ebfe79959c1800128378e37a74757f6cc82fefdd9694b4afd79289aaf24606,2021-12-07 02:37:27.000 UTC,0,true -12240,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec340000000000000000000000000373622442c34e0c0d9cc1c3cb79a773eb3635ec0000000000000000000000000373622442c34e0c0d9cc1c3cb79a773eb3635ec00000000000000000000000000000000000000000000000000b9630f607e4b4200000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -12243,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec3400000000000000000000000021aa38a4f7943f5088347765b210c7148edbadc000000000000000000000000021aa38a4f7943f5088347765b210c7148edbadc000000000000000000000000000000000000000000000000000470de4df82000000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -12246,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec34000000000000000000000000c3d4a6b3bfe187d7e328514f46db9928c569da21000000000000000000000000c3d4a6b3bfe187d7e328514f46db9928c569da210000000000000000000000000000000000000000000000001158d61588b2628300000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -12251,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec34000000000000000000000000c691ac73cd49e2c0b0e0ea4cae51bae1387f466a000000000000000000000000c691ac73cd49e2c0b0e0ea4cae51bae1387f466a00000000000000000000000000000000000000000000000001e3209cdaef050000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,0x297264e529b6b2f3d8584cfbf609f6d12046abc7f0a73547873d369a42ad3733,2022-05-23 08:57:25.000 UTC,0,true -12253,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec3400000000000000000000000054f37eb4e1b42409db572bd4661b003eebaf71d100000000000000000000000054f37eb4e1b42409db572bd4661b003eebaf71d10000000000000000000000000000000000000000000000000009e48b3595f8fe00000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -12254,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec340000000000000000000000005d06c65961476fc3d5d812e14b9a8dbf995c06f60000000000000000000000005d06c65961476fc3d5d812e14b9a8dbf995c06f60000000000000000000000000000000000000000000000000131867863646f9000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -12256,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec34000000000000000000000000dc5bc0ccc7ffd05aece6231373844f3d86ccb114000000000000000000000000dc5bc0ccc7ffd05aece6231373844f3d86ccb11400000000000000000000000000000000000000000000000000d52de26bb1250000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -12258,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec3400000000000000000000000033fe1df4c09e4ddd4e880f9cedd0ae638b048ea900000000000000000000000033fe1df4c09e4ddd4e880f9cedd0ae638b048ea9000000000000000000000000000000000000000000000000048b3f9040c9a94600000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,0x84c8c9a97d045abf61a65fdca44f7f8d4f899c0014a1343b694eb53e25b73781,2022-02-23 08:23:23.000 UTC,0,true -12259,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec34000000000000000000000000ef0905745ce28ebe1ded7004146132fbfba548ba000000000000000000000000ef0905745ce28ebe1ded7004146132fbfba548ba000000000000000000000000000000000000000000000000007d5713ea7d4eda00000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -12260,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec3400000000000000000000000095b18b7721ee14714ab9d50f21fd8027d9b9643200000000000000000000000095b18b7721ee14714ab9d50f21fd8027d9b964320000000000000000000000000000000000000000000000000167e9a71ed79d3900000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,0xcdf49f180f2cc9270a6925a8c753485348103799362db8589f24ae1434587aef,2022-02-23 08:20:16.000 UTC,0,true -12261,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec3400000000000000000000000066da1e3a39516a5e07c7f3e36e683a81393ecd3a00000000000000000000000066da1e3a39516a5e07c7f3e36e683a81393ecd3a0000000000000000000000000000000000000000000000000529ee0633db488000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,0x31fb299649fb109641f257a5feb83851ce6b6892d261316a17654802430023a1,2022-02-23 08:25:57.000 UTC,0,true -12262,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec34000000000000000000000000fae87a37ade1a92d2ec6c5d4a7c29d635a505a91000000000000000000000000fae87a37ade1a92d2ec6c5d4a7c29d635a505a910000000000000000000000000000000000000000000000000092fa0befdd856b00000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -12263,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec3400000000000000000000000022a4954445046a65fd7054e598f2feb6ed54a61800000000000000000000000022a4954445046a65fd7054e598f2feb6ed54a61800000000000000000000000000000000000000000000000003f6e352c532444d00000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,0x8973c49612dda1aacc7bc37427dcb5be17183740cbcdbd87fddf3d79cd586fa8,2021-12-19 06:32:36.000 UTC,0,true -12266,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec340000000000000000000000000105c70544b7f806f5b424ccffff34dcabc813a10000000000000000000000000105c70544b7f806f5b424ccffff34dcabc813a1000000000000000000000000000000000000000000000000002386f26fc1000000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -12273,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0xa9f9e675000000000000000000000000514910771af9ca656af840dff83e8264ecf986ca000000000000000000000000350a791bfc2c21f9ed5d10980dad2e2638ffa7f6000000000000000000000000d5ac6365ae4ce0008789888fd2e03a5db84d2ccb000000000000000000000000d5ac6365ae4ce0008789888fd2e03a5db84d2ccb000000000000000000000000000000000000000000000000891de09c74496f3d00000000000000000000000000000000000000000000000000000000000000c00000000000000000000000000000000000000000000000000000000000000000,,,1,true -12274,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec34000000000000000000000000d5ac6365ae4ce0008789888fd2e03a5db84d2ccb000000000000000000000000d5ac6365ae4ce0008789888fd2e03a5db84d2ccb000000000000000000000000000000000000000000000000001d75e00d11bf4000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -12275,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec340000000000000000000000005c2ea83cb2b21cf11ce1fe19a46c2eaf1668d0880000000000000000000000005c2ea83cb2b21cf11ce1fe19a46c2eaf1668d0880000000000000000000000000000000000000000000000000084a01b0133db3b00000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -12277,0xcd9d4988c0ae61887b075ba77f08cbfad2b65068,0x3f87ff1de58128ef8fcb4c807efd776e1ac72e51,0xf4f7b41a000000000000000000000000748010fbe056562ef466901f1d38ce481f11b539000000000000000000000000000000000000000000000001a71b0bfa7d6e59f8,,,1,true -12279,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec34000000000000000000000000d6b78b3717dfa5118ae60263a0b547a8ec43896b000000000000000000000000d6b78b3717dfa5118ae60263a0b547a8ec43896b00000000000000000000000000000000000000000000000000cc74c44c2f77b900000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -12280,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec3400000000000000000000000063060f713b377af8d7d50669ec0fdce1d31e3f2800000000000000000000000063060f713b377af8d7d50669ec0fdce1d31e3f2800000000000000000000000000000000000000000000000000dd79dbd3511aa200000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -12281,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec34000000000000000000000000ac1c9fd0405296598b0b6ca8e290784197198fa7000000000000000000000000ac1c9fd0405296598b0b6ca8e290784197198fa70000000000000000000000000000000000000000000000000032ea2718d4b3f300000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -12282,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec34000000000000000000000000a12213d1bba68432be1fb5e9ac8d8169c0e66201000000000000000000000000a12213d1bba68432be1fb5e9ac8d8169c0e6620100000000000000000000000000000000000000000000000000038d7ea4c6800000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -12284,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec340000000000000000000000001906bd0244b749381e2974192fc581fe0da4d3630000000000000000000000001906bd0244b749381e2974192fc581fe0da4d363000000000000000000000000000000000000000000000000008d4f56c175acb500000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -12288,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec340000000000000000000000002438375ee587b54e0dbcc0704dbe90670265b4cd0000000000000000000000002438375ee587b54e0dbcc0704dbe90670265b4cd0000000000000000000000000000000000000000000000000853a0d2313c000000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -12289,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec34000000000000000000000000c05846781c8c0745464d8dc5673ea821b23d4aa3000000000000000000000000c05846781c8c0745464d8dc5673ea821b23d4aa300000000000000000000000000000000000000000000000000c8928211b4fc1300000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -12290,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec34000000000000000000000000d606452ee5d7ae5f31ee14a7273265db77a1b7f4000000000000000000000000d606452ee5d7ae5f31ee14a7273265db77a1b7f400000000000000000000000000000000000000000000000000c70ff4a6f52d8800000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -12291,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec3400000000000000000000000081a35224db38747caccbd8e980c875de9e3fc13900000000000000000000000081a35224db38747caccbd8e980c875de9e3fc139000000000000000000000000000000000000000000000000015992133a82fa6e00000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -12292,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec34000000000000000000000000d6b78b3717dfa5118ae60263a0b547a8ec43896b000000000000000000000000d6b78b3717dfa5118ae60263a0b547a8ec43896b0000000000000000000000000000000000000000000000000147a507e05a2a4e00000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -12294,0x10e6593cdda8c58a1d0f14c5164b376352a55f2f,0x467194771dae2967aef3ecbedd3bf9a310c76c65,0xa9f9e6750000000000000000000000006b175474e89094c44da98b954eedeac495271d0f000000000000000000000000da10009cbd5d07dd0cecc66161fc93d7c9000da1000000000000000000000000000ea455f073321b662635245e32ef1a488fb093000000000000000000000000000ea455f073321b662635245e32ef1a488fb0930000000000000000000000000000000000000000000000000de0b6b3a764000000000000000000000000000000000000000000000000000000000000000000c00000000000000000000000000000000000000000000000000000000000000000,,,1,true -12296,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec340000000000000000000000007605fa24b13e9f61a2fc7b636a165b863116f9a20000000000000000000000007605fa24b13e9f61a2fc7b636a165b863116f9a200000000000000000000000000000000000000000000000000660a7865a49fe800000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -12298,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec34000000000000000000000000bdbfdf3e82fc9d2be1352e252ab1ce2287fc2122000000000000000000000000bdbfdf3e82fc9d2be1352e252ab1ce2287fc2122000000000000000000000000000000000000000000000000007957fdcb4812a100000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,0x7736f636106ec904dc0c6e4157cf33c136114e201c82c71a5dcee5aeee0c528e,2022-02-17 10:41:49.000 UTC,0,true -12300,0x10e6593cdda8c58a1d0f14c5164b376352a55f2f,0x467194771dae2967aef3ecbedd3bf9a310c76c65,0xa9f9e6750000000000000000000000006b175474e89094c44da98b954eedeac495271d0f000000000000000000000000da10009cbd5d07dd0cecc66161fc93d7c9000da1000000000000000000000000b68c0d55d467f901bb1c62950b441f7bfe8ec3ea000000000000000000000000b68c0d55d467f901bb1c62950b441f7bfe8ec3ea0000000000000000000000000000000000000000000000019573086fe285bae500000000000000000000000000000000000000000000000000000000000000c00000000000000000000000000000000000000000000000000000000000000000,,,1,true -12302,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec34000000000000000000000000398259c183a1ef12d8f3a900b734b7d2e064cb25000000000000000000000000398259c183a1ef12d8f3a900b734b7d2e064cb2500000000000000000000000000000000000000000000000000883c797cfdb3f900000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -12303,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0xa9f9e675000000000000000000000000dac17f958d2ee523a2206206994597c13d831ec700000000000000000000000094b008aa00579c1307b0ef2c499ad98a8ce58e58000000000000000000000000e56bbbb98982c8476bdabbcc5f27f3d354dff3a8000000000000000000000000e56bbbb98982c8476bdabbcc5f27f3d354dff3a800000000000000000000000000000000000000000000000000000000004c4b4000000000000000000000000000000000000000000000000000000000000000c00000000000000000000000000000000000000000000000000000000000000000,,,1,true -12306,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0xa9f9e675000000000000000000000000dac17f958d2ee523a2206206994597c13d831ec700000000000000000000000094b008aa00579c1307b0ef2c499ad98a8ce58e58000000000000000000000000e56bbbb98982c8476bdabbcc5f27f3d354dff3a8000000000000000000000000e56bbbb98982c8476bdabbcc5f27f3d354dff3a800000000000000000000000000000000000000000000000000000000004c4b4000000000000000000000000000000000000000000000000000000000000000c00000000000000000000000000000000000000000000000000000000000000000,,,1,true -12307,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0xa9f9e675000000000000000000000000514910771af9ca656af840dff83e8264ecf986ca000000000000000000000000350a791bfc2c21f9ed5d10980dad2e2638ffa7f60000000000000000000000007599bd674137e9109a4bab48e3d68bf99c39b3190000000000000000000000007599bd674137e9109a4bab48e3d68bf99c39b31900000000000000000000000000000000000000000000000007e0428d85c29dc700000000000000000000000000000000000000000000000000000000000000c00000000000000000000000000000000000000000000000000000000000000000,,,1,true -12312,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec340000000000000000000000006399ef7d7be677e0f7afee94a343935ab933cf800000000000000000000000006399ef7d7be677e0f7afee94a343935ab933cf80000000000000000000000000000000000000000000000000016137f81b854f0000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -12316,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0xa9f9e675000000000000000000000000514910771af9ca656af840dff83e8264ecf986ca000000000000000000000000350a791bfc2c21f9ed5d10980dad2e2638ffa7f6000000000000000000000000b50e8634486e329a64dfdc2a55ee5b1a05c24751000000000000000000000000b50e8634486e329a64dfdc2a55ee5b1a05c2475100000000000000000000000000000000000000000000000014d1120d7b16000000000000000000000000000000000000000000000000000000000000000000c00000000000000000000000000000000000000000000000000000000000000000,,,1,true -12317,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec34000000000000000000000000dc5bfdaf66371bcbb2edffac04eee810685e79b9000000000000000000000000dc5bfdaf66371bcbb2edffac04eee810685e79b900000000000000000000000000000000000000000000000000ce6123896dfdf100000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -12318,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0xa9f9e675000000000000000000000000514910771af9ca656af840dff83e8264ecf986ca000000000000000000000000350a791bfc2c21f9ed5d10980dad2e2638ffa7f600000000000000000000000032c601a2ba37db9c6a9716f951c893a0ec9002d800000000000000000000000032c601a2ba37db9c6a9716f951c893a0ec9002d8000000000000000000000000000000000000000000000000333027d55fc2178200000000000000000000000000000000000000000000000000000000000000c00000000000000000000000000000000000000000000000000000000000000000,0xa02e2d6eb6d3706ddcd080453aebcbb1e10bcdd3711b9c20a4091fa53b6e53a9,2022-05-29 00:28:04.000 UTC,0,true -12320,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec340000000000000000000000004b8b511851a8e11d8e729005dafefdf05e3d3b5f0000000000000000000000004b8b511851a8e11d8e729005dafefdf05e3d3b5f00000000000000000000000000000000000000000000000001a31a834b3025d100000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -12323,0xcd9d4988c0ae61887b075ba77f08cbfad2b65068,0x3f87ff1de58128ef8fcb4c807efd776e1ac72e51,0xf4f7b41a000000000000000000000000bfd011afe4b326817db13df58f0dea7188154aac0000000000000000000000000000000000000000000000300d5bcb349b77e5dd,0x09368beafa461833e1b099bd0bb3c6efcd4c539c249e047793d7143390732556,2021-12-13 02:25:47.000 UTC,0,true -12326,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec34000000000000000000000000e9fcd609bfd554d051de2e1adc413c6443daf7da000000000000000000000000e9fcd609bfd554d051de2e1adc413c6443daf7da000000000000000000000000000000000000000000000000012bd93c902296a900000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -12327,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec340000000000000000000000008e049c3c7736ce67883b19f3d2b50c9d71bc83e10000000000000000000000008e049c3c7736ce67883b19f3d2b50c9d71bc83e10000000000000000000000000000000000000000000000000154eb7e9a230c9200000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -12329,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec340000000000000000000000001dd3479d59950e6f756c2d3fd0ab0647713e09bb0000000000000000000000001dd3479d59950e6f756c2d3fd0ab0647713e09bb00000000000000000000000000000000000000000000000000c95bd3a56e8f3600000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -12330,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec3400000000000000000000000043d13bbdcbdf43f376bc696f7742a9aebb6e0ce700000000000000000000000043d13bbdcbdf43f376bc696f7742a9aebb6e0ce700000000000000000000000000000000000000000000000000a51019dee4457800000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -12335,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec3400000000000000000000000031e7f474d5d02ff11a270218107b8e3ae783205600000000000000000000000031e7f474d5d02ff11a270218107b8e3ae783205600000000000000000000000000000000000000000000000000724a3324654d2100000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -12336,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec34000000000000000000000000425f76e3cb1ba3b65a9ddba16b31e5454d08a1a1000000000000000000000000425f76e3cb1ba3b65a9ddba16b31e5454d08a1a1000000000000000000000000000000000000000000000000001e6db5d323ca0500000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -12339,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec3400000000000000000000000024b25321490839428ea48a456d5d76586eca025d00000000000000000000000024b25321490839428ea48a456d5d76586eca025d00000000000000000000000000000000000000000000000000769285f0c3211f00000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -12340,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec34000000000000000000000000b805d4dd668758536f210bed08476b58c4142a5e000000000000000000000000b805d4dd668758536f210bed08476b58c4142a5e0000000000000000000000000000000000000000000000000001c6bf5263400000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -12341,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec34000000000000000000000000d3020016900be232d277743d10893064be7cc7f9000000000000000000000000d3020016900be232d277743d10893064be7cc7f90000000000000000000000000000000000000000000000000354a6ba7a18000000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -12347,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec34000000000000000000000000e68d7feca592cca0ab9a5d0be4b3b22c996430dd000000000000000000000000e68d7feca592cca0ab9a5d0be4b3b22c996430dd0000000000000000000000000000000000000000000000000070b002272d6e4e00000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -12349,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec34000000000000000000000000801510553f5b523f75f40d77ce9e476e7f48e192000000000000000000000000801510553f5b523f75f40d77ce9e476e7f48e19200000000000000000000000000000000000000000000000000a6a26335c27f9500000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -12351,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec340000000000000000000000009c858345d95f2d8eef33cf31e9f119eb85bc3f660000000000000000000000009c858345d95f2d8eef33cf31e9f119eb85bc3f66000000000000000000000000000000000000000000000000015d7e23c3dc9eb500000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -12352,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec34000000000000000000000000b9dad802f0febae1fb84c1910e8bb8215ce68ea4000000000000000000000000b9dad802f0febae1fb84c1910e8bb8215ce68ea400000000000000000000000000000000000000000000000000a830cf1a4e138600000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -12353,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec340000000000000000000000001fcca7466fb4a3a6c15d5f901ad93aed2c3ada340000000000000000000000001fcca7466fb4a3a6c15d5f901ad93aed2c3ada3400000000000000000000000000000000000000000000000002d36a78013c6da600000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -12354,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec34000000000000000000000000064e9ea8eeb3ea9a0e68b397db271fb7ac525e33000000000000000000000000064e9ea8eeb3ea9a0e68b397db271fb7ac525e33000000000000000000000000000000000000000000000000000aa87bee53800000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -12355,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec34000000000000000000000000be003db78e91d32fba49a5a93f8ec6f3398d8df6000000000000000000000000be003db78e91d32fba49a5a93f8ec6f3398d8df600000000000000000000000000000000000000000000000000a74186094273b600000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -12356,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec340000000000000000000000008e72ce1ece575f66792f5d35aeb1111a615aebda0000000000000000000000008e72ce1ece575f66792f5d35aeb1111a615aebda0000000000000000000000000000000000000000000000000073528b83edc91d00000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -12357,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec34000000000000000000000000f5d8f53a36c4bbef078e352ef38cc06132320d3c000000000000000000000000f5d8f53a36c4bbef078e352ef38cc06132320d3c0000000000000000000000000000000000000000000000000ddafe7a671a57ff00000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,0xc1492a75f1fe47964580f647401b443552eadbde916e7159fa909826cd061e53,2021-11-28 05:21:23.000 UTC,0,true -12358,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec34000000000000000000000000f4df4d5c7b7cea92d403903c67f5005df3081681000000000000000000000000f4df4d5c7b7cea92d403903c67f5005df308168100000000000000000000000000000000000000000000000000a3b0e21b6a441f00000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -12360,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec340000000000000000000000009f341472663d4d328c58477d04c27aee530b03e10000000000000000000000009f341472663d4d328c58477d04c27aee530b03e100000000000000000000000000000000000000000000000000a2ec7ed9121eed00000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -12362,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec34000000000000000000000000e8584d1552c0e68ef8fc580169456a8806a9ee5f000000000000000000000000e8584d1552c0e68ef8fc580169456a8806a9ee5f00000000000000000000000000000000000000000000000000005af3107a400000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -12363,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec3400000000000000000000000034222096a91c73ba06bd1dd3eeea16e250dde36a00000000000000000000000034222096a91c73ba06bd1dd3eeea16e250dde36a00000000000000000000000000000000000000000000000000a4ff45ee21769000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -12364,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec340000000000000000000000000700efd158f49f0958d85cdb0b28e1f24fdfb7db0000000000000000000000000700efd158f49f0958d85cdb0b28e1f24fdfb7db0000000000000000000000000000000000000000000000000011c37937e0800000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -12365,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec3400000000000000000000000030d3f805c896d8b6290d7978d7121ff24ce4ab2200000000000000000000000030d3f805c896d8b6290d7978d7121ff24ce4ab2200000000000000000000000000000000000000000000000000038d7ea4c6800000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -12366,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec3400000000000000000000000095dd317732fbc595206928c4974b653da65f59e300000000000000000000000095dd317732fbc595206928c4974b653da65f59e300000000000000000000000000000000000000000000000000cf4d293f509bb400000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -12367,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec340000000000000000000000006b778b4616b024c4de5686dc064a9c7de3435cc70000000000000000000000006b778b4616b024c4de5686dc064a9c7de3435cc700000000000000000000000000000000000000000000000000a64c2c9badefdc00000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -12368,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec34000000000000000000000000ac87fbbf35e5504bee8daec50bef75d43ce20d92000000000000000000000000ac87fbbf35e5504bee8daec50bef75d43ce20d920000000000000000000000000000000000000000000000000429d069189e000000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,0x0a6fb8ec52aea5b3548eec6463151dca2425a54c07e6f720eb73363b4bfcf93e,2022-03-11 18:12:12.000 UTC,0,true -12369,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec3400000000000000000000000036b0440e2106edc46b632722c531b6f6d5d4fc6d00000000000000000000000036b0440e2106edc46b632722c531b6f6d5d4fc6d00000000000000000000000000000000000000000000000000a50ce658f7244d00000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -12370,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec3400000000000000000000000048c84fb52dd6fd66cf4c150224b1d41b5f0729c400000000000000000000000048c84fb52dd6fd66cf4c150224b1d41b5f0729c4000000000000000000000000000000000000000000000000001550f7dca7000000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -12372,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec3400000000000000000000000049fe6d0096ec9a51a59231c2d46f09a339d1629600000000000000000000000049fe6d0096ec9a51a59231c2d46f09a339d162960000000000000000000000000000000000000000000000000088e622139322e700000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -12376,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec3400000000000000000000000053be6809662db6de0db5c8d9081b9a6c29b3e0a700000000000000000000000053be6809662db6de0db5c8d9081b9a6c29b3e0a700000000000000000000000000000000000000000000000000038d7ea4c6800000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -12377,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec34000000000000000000000000aa07bab7248dc4e752ab42950ef8a66686c31db1000000000000000000000000aa07bab7248dc4e752ab42950ef8a66686c31db100000000000000000000000000000000000000000000000000038d7ea4c6800000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -12378,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec34000000000000000000000000da4bd497c38a6acb9c98d133614faa5d9c8e9598000000000000000000000000da4bd497c38a6acb9c98d133614faa5d9c8e95980000000000000000000000000000000000000000000000000000470fe6c8c98000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -12379,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec34000000000000000000000000da4bd497c38a6acb9c98d133614faa5d9c8e9598000000000000000000000000da4bd497c38a6acb9c98d133614faa5d9c8e95980000000000000000000000000000000000000000000000000000470fe6c8c98000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -12381,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec34000000000000000000000000da4bd497c38a6acb9c98d133614faa5d9c8e9598000000000000000000000000da4bd497c38a6acb9c98d133614faa5d9c8e95980000000000000000000000000000000000000000000000000000470fe6c8c98000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -12382,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec34000000000000000000000000da4bd497c38a6acb9c98d133614faa5d9c8e9598000000000000000000000000da4bd497c38a6acb9c98d133614faa5d9c8e95980000000000000000000000000000000000000000000000000000af7c0fce8c0000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -12384,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec34000000000000000000000000e4272bca6da323391ae38bbcdc9c864345541597000000000000000000000000e4272bca6da323391ae38bbcdc9c8643455415970000000000000000000000000000000000000000000000000040fb8958066f1800000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -12387,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec340000000000000000000000001bc467b322875a3abafd99e21edd410e9eacd3390000000000000000000000001bc467b322875a3abafd99e21edd410e9eacd3390000000000000000000000000000000000000000000000000071afd498d0000000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -12390,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec340000000000000000000000001cb2abfca6f0799526913a6f934b4d43c3d4b7fe0000000000000000000000001cb2abfca6f0799526913a6f934b4d43c3d4b7fe00000000000000000000000000000000000000000000000000038d7ea4c6800000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -12391,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec34000000000000000000000000237d3ee0674782599c6df583f8b7bc62b9850034000000000000000000000000237d3ee0674782599c6df583f8b7bc62b985003400000000000000000000000000000000000000000000000000038d7ea4c6800000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -12393,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec340000000000000000000000009ecf59234351a4557e62178b07ef83f98d6e86520000000000000000000000009ecf59234351a4557e62178b07ef83f98d6e86520000000000000000000000000000000000000000000000001aec16906a10b11000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -12394,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec34000000000000000000000000571fc4de243e743ccabf46bfd10d878406f82042000000000000000000000000571fc4de243e743ccabf46bfd10d878406f8204200000000000000000000000000000000000000000000000000038d7ea4c6800000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -12395,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec34000000000000000000000000e8a8cc3939a8c3c148c7d328d8455c3f73703b08000000000000000000000000e8a8cc3939a8c3c148c7d328d8455c3f73703b08000000000000000000000000000000000000000000000000002386f26fc1000000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -12398,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec34000000000000000000000000597d2d5bba8bb938474b0234450edebabe4b3c1b000000000000000000000000597d2d5bba8bb938474b0234450edebabe4b3c1b00000000000000000000000000000000000000000000000000038d7ea4c6800000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -12399,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec34000000000000000000000000466f0ac408d52e7eb082aca07f2835a0d5b8d89b000000000000000000000000466f0ac408d52e7eb082aca07f2835a0d5b8d89b00000000000000000000000000000000000000000000000000038d7ea4c6800000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -12400,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec3400000000000000000000000039cc43b3068a208ae87042f927fb53b85586c65400000000000000000000000039cc43b3068a208ae87042f927fb53b85586c65400000000000000000000000000000000000000000000000000038d7ea4c6800000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -12401,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec34000000000000000000000000cc3de6ab97634192cbb2d9d82d2216f33292dc2e000000000000000000000000cc3de6ab97634192cbb2d9d82d2216f33292dc2e0000000000000000000000000000000000000000000000000000b5e620f4800000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -12403,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec34000000000000000000000000c4d18fc7d98f204e393a3045ee9073e87c137e8b000000000000000000000000c4d18fc7d98f204e393a3045ee9073e87c137e8b00000000000000000000000000000000000000000000000000038d7ea4c6800000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -12404,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec34000000000000000000000000eb29cbf4b3d04e003b3c82fbbf45f0c97cab3451000000000000000000000000eb29cbf4b3d04e003b3c82fbbf45f0c97cab345100000000000000000000000000000000000000000000000000038d7ea4c6800000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -12405,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec34000000000000000000000000123317f544d620465d938789656edfcf9699330f000000000000000000000000123317f544d620465d938789656edfcf9699330f00000000000000000000000000000000000000000000000000038d7ea4c6800000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -12406,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec340000000000000000000000001171697a3f96a3790e6c265fd1d9f0c601f08f790000000000000000000000001171697a3f96a3790e6c265fd1d9f0c601f08f7900000000000000000000000000000000000000000000000000038d7ea4c6800000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -12407,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec340000000000000000000000000f93149d54461a783c1517b23974113b89e382410000000000000000000000000f93149d54461a783c1517b23974113b89e3824100000000000000000000000000000000000000000000000000038d7ea4c6800000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -12409,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec340000000000000000000000005d4d36ced9a3096fb1916fc83675bc3785afc9710000000000000000000000005d4d36ced9a3096fb1916fc83675bc3785afc97100000000000000000000000000000000000000000000000000038d7ea4c6800000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -12410,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec3400000000000000000000000056584ee28735e10b381275b913b934ed656b0e2800000000000000000000000056584ee28735e10b381275b913b934ed656b0e2800000000000000000000000000000000000000000000000001886e2d09d3620900000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -12416,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec3400000000000000000000000002f5f4ac52b217828c8fa780a5fe675674bb761700000000000000000000000002f5f4ac52b217828c8fa780a5fe675674bb76170000000000000000000000000000000000000000000000000000b5e620f4800000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -12417,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec3400000000000000000000000002f5f4ac52b217828c8fa780a5fe675674bb761700000000000000000000000002f5f4ac52b217828c8fa780a5fe675674bb76170000000000000000000000000000000000000000000000000000008bb2c9700000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -12419,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec340000000000000000000000008a2ea71352fd4a3fdcbf33dc847a7aaf85dd0b040000000000000000000000008a2ea71352fd4a3fdcbf33dc847a7aaf85dd0b0400000000000000000000000000000000000000000000000000060a24181e400000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -12420,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec34000000000000000000000000cf8445a17f25d149e63ba8662eb602e5103a236b000000000000000000000000cf8445a17f25d149e63ba8662eb602e5103a236b0000000000000000000000000000000000000000000000000dcf39df802b162900000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -12423,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec3400000000000000000000000048a0a3ae50991044e5d797e73394f0dfff92180b00000000000000000000000048a0a3ae50991044e5d797e73394f0dfff92180b00000000000000000000000000000000000000000000000000038d7ea4c6800000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -12424,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec34000000000000000000000000521d8d1a5c001895a8f735137b4e0fc4aebc91ae000000000000000000000000521d8d1a5c001895a8f735137b4e0fc4aebc91ae00000000000000000000000000000000000000000000000000b1a2bc2ec5000000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -12425,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec34000000000000000000000000b0d7561c786b5f5fb702f59f026a5011e25b95f1000000000000000000000000b0d7561c786b5f5fb702f59f026a5011e25b95f100000000000000000000000000000000000000000000000000157f7e818c82c000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -12428,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec340000000000000000000000001eaf2bfccc4f09ea373e0f7cd79b7d6803e1aace0000000000000000000000001eaf2bfccc4f09ea373e0f7cd79b7d6803e1aace00000000000000000000000000000000000000000000000000645f6d065403e000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -12429,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec340000000000000000000000004e281add1e87f5aa0fd9c39d8bcfd7c1a6da61fd0000000000000000000000004e281add1e87f5aa0fd9c39d8bcfd7c1a6da61fd0000000000000000000000000000000000000000000000000011c37937e0800000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -12431,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec34000000000000000000000000af435f714502846ca912b6225964ef7a62714564000000000000000000000000af435f714502846ca912b6225964ef7a6271456400000000000000000000000000000000000000000000000000017d2684ae983800000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -12433,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec3400000000000000000000000099436be04157c939f548abd8e3cae9ce01c7abca00000000000000000000000099436be04157c939f548abd8e3cae9ce01c7abca000000000000000000000000000000000000000000000000002386f26fc1000000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -12435,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec34000000000000000000000000d79add81d0b801eaa6e7fc9e1aca731cb28381f7000000000000000000000000d79add81d0b801eaa6e7fc9e1aca731cb28381f7000000000000000000000000000000000000000000000000003b460fb1d669d200000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -12436,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec34000000000000000000000000404551724744d0dfc51cda2731f0fd8c62923173000000000000000000000000404551724744d0dfc51cda2731f0fd8c62923173000000000000000000000000000000000000000000000000005af2bab4353fd500000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -12442,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec3400000000000000000000000017aab8b3ffe10f1ab840d90dc2a788a3fdef505c00000000000000000000000017aab8b3ffe10f1ab840d90dc2a788a3fdef505c00000000000000000000000000000000000000000000000006ccd46763f1000000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -12444,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec34000000000000000000000000c3f01f6e61c0cedba21b6e22ea5a005e7b5ece03000000000000000000000000c3f01f6e61c0cedba21b6e22ea5a005e7b5ece03000000000000000000000000000000000000000000000000015bb4896242211200000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -12445,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec34000000000000000000000000d2b6fe0d48498b892992c2e8b018160f21a6e104000000000000000000000000d2b6fe0d48498b892992c2e8b018160f21a6e10400000000000000000000000000000000000000000000000000038d7ea4c6800000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -12447,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec34000000000000000000000000078259703c92b0ba6491f1162f4a4b17a2ada0ae000000000000000000000000078259703c92b0ba6491f1162f4a4b17a2ada0ae000000000000000000000000000000000000000000000000015d9f93ef4d8f9a00000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -12449,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec34000000000000000000000000443dfb2a4b76693ba596742d6bd2ae52a39ad0c8000000000000000000000000443dfb2a4b76693ba596742d6bd2ae52a39ad0c80000000000000000000000000000000000000000000000000077ed8698a8dcc000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -12450,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec3400000000000000000000000049f63b254ea9043e57678c13e06aef257fab45c100000000000000000000000049f63b254ea9043e57678c13e06aef257fab45c1000000000000000000000000000000000000000000000000015407c84249e36100000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,0x26cfbf229aff2ae8f27a32b7de6e1de00c2828e5e8023076cbbddfca9e238e28,2021-12-20 17:01:31.000 UTC,0,true -12453,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec34000000000000000000000000a71504de8712ab1405bb6d007365f56f3886d0f1000000000000000000000000a71504de8712ab1405bb6d007365f56f3886d0f1000000000000000000000000000000000000000000000000004053c8ddc9654500000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,0xe3e90cc6793235b8145495d50a8b95bab5895375810a34c53e835e384569eba8,2022-06-28 11:58:41.000 UTC,0,true -12457,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec34000000000000000000000000524fddf4a772b34846553c6765fad662f207a090000000000000000000000000524fddf4a772b34846553c6765fad662f207a090000000000000000000000000000000000000000000000000007240e19ff4428700000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -12458,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec3400000000000000000000000027490c1fccfd250cca46d17cf3f35960e1d7863700000000000000000000000027490c1fccfd250cca46d17cf3f35960e1d7863700000000000000000000000000000000000000000000000001157fa250dde2c000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -12459,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0xa9f9e675000000000000000000000000a0b86991c6218b36c1d19d4a2e9eb0ce3606eb480000000000000000000000007f5c764cbc14f9669b88837ca1490cca17c3160700000000000000000000000054291d14e7b1c33abe9d59765b065a2f782b202b00000000000000000000000054291d14e7b1c33abe9d59765b065a2f782b202b0000000000000000000000000000000000000000000000000000000022be61e200000000000000000000000000000000000000000000000000000000000000c00000000000000000000000000000000000000000000000000000000000000000,0x7c6d7058062f078a9675ef7d77a25dd22ac2516576a4ab2a4d8ec16bf127b434,2022-05-21 06:52:31.000 UTC,0,true -12462,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec340000000000000000000000000ef531802e40883e1867215b66f304412188bcc60000000000000000000000000ef531802e40883e1867215b66f304412188bcc600000000000000000000000000000000000000000000000000b1a2bc2ec5000000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -12468,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec340000000000000000000000005cd11fae257afe4638141c27cabc2830896f97ed0000000000000000000000005cd11fae257afe4638141c27cabc2830896f97ed000000000000000000000000000000000000000000000000006559cc98e1873c00000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -12470,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec340000000000000000000000000c5d1cd7ec090a6186164fee2e648001dc7ed3d70000000000000000000000000c5d1cd7ec090a6186164fee2e648001dc7ed3d700000000000000000000000000000000000000000000000000038d7ea4c6800000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -12471,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec340000000000000000000000003e6ce8f922512551527d6670d6d41861b5128c220000000000000000000000003e6ce8f922512551527d6670d6d41861b5128c220000000000000000000000000000000000000000000000000008e1bc9bf0400000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -12472,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec34000000000000000000000000319fdba64234fcbdc4c884cc7d9db1cc00c429b7000000000000000000000000319fdba64234fcbdc4c884cc7d9db1cc00c429b700000000000000000000000000000000000000000000000001c39f40a0c4092c00000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -12473,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec34000000000000000000000000220a6cb04d48ca2c33735e94df78c17f8b0f7c9f000000000000000000000000220a6cb04d48ca2c33735e94df78c17f8b0f7c9f0000000000000000000000000000000000000000000000000008e1bc9bf0400000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -12474,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec340000000000000000000000009fec7a5b0ba8a8dc5e32ab479bc15e13b6577a510000000000000000000000009fec7a5b0ba8a8dc5e32ab479bc15e13b6577a51000000000000000000000000000000000000000000000000002ad25e289cd60900000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -12482,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec34000000000000000000000000c60048fd2bccd82da8a1c0d06b3cf1bfd7d740a2000000000000000000000000c60048fd2bccd82da8a1c0d06b3cf1bfd7d740a2000000000000000000000000000000000000000000000000001eb0062ff1fc8000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -12485,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec34000000000000000000000000df74afb1a98682d0163000beaa91a40b2fb04b5e000000000000000000000000df74afb1a98682d0163000beaa91a40b2fb04b5e000000000000000000000000000000000000000000000000012f99c1aadd635900000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -12486,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec34000000000000000000000000c93224c75ded80416f0c90d26acf22328e62dede000000000000000000000000c93224c75ded80416f0c90d26acf22328e62dede000000000000000000000000000000000000000000000000002030bafc871f8f00000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -12488,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec340000000000000000000000006b5b14f21fa818596414614ddc954e17ded368b90000000000000000000000006b5b14f21fa818596414614ddc954e17ded368b9000000000000000000000000000000000000000000000000000119f17fe1600000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -12491,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec34000000000000000000000000e030d0727b116a30b4858cb395a4ee7f0557ef10000000000000000000000000e030d0727b116a30b4858cb395a4ee7f0557ef100000000000000000000000000000000000000000000000000198047866b3072400000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -12493,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec340000000000000000000000009a930c154dfb62b1dddf26d8c78bc93d5e6f17500000000000000000000000009a930c154dfb62b1dddf26d8c78bc93d5e6f175000000000000000000000000000000000000000000000000003dba786ef8f000000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -12494,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0xa9f9e675000000000000000000000000dac17f958d2ee523a2206206994597c13d831ec700000000000000000000000094b008aa00579c1307b0ef2c499ad98a8ce58e5800000000000000000000000069bbeaf77d38a812d448ad92216ecce1228d108100000000000000000000000069bbeaf77d38a812d448ad92216ecce1228d10810000000000000000000000000000000000000000000000000000000041587ec100000000000000000000000000000000000000000000000000000000000000c00000000000000000000000000000000000000000000000000000000000000000,0x7fbc7e39791ec715851c97a61e8e7d089b6ef61a918d1d75c5f97ebcbabeff6b,2022-04-29 08:54:00.000 UTC,0,true -12495,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0xa9f9e675000000000000000000000000dac17f958d2ee523a2206206994597c13d831ec700000000000000000000000094b008aa00579c1307b0ef2c499ad98a8ce58e580000000000000000000000000fc95af4cfb33dddc2d8144fd36dcdcac2a5e01c0000000000000000000000000fc95af4cfb33dddc2d8144fd36dcdcac2a5e01c000000000000000000000000000000000000000000000000000000004232d52400000000000000000000000000000000000000000000000000000000000000c00000000000000000000000000000000000000000000000000000000000000000,0xcd6a470db49ca4efca7abb11e3de703b38001f19b7488454675289c2e9d4d7fa,2022-04-30 04:55:41.000 UTC,0,true -12496,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0xa9f9e675000000000000000000000000dac17f958d2ee523a2206206994597c13d831ec700000000000000000000000094b008aa00579c1307b0ef2c499ad98a8ce58e58000000000000000000000000c1daa72eb73b036def6e1287967695e40d197a58000000000000000000000000c1daa72eb73b036def6e1287967695e40d197a580000000000000000000000000000000000000000000000000000000040e7411300000000000000000000000000000000000000000000000000000000000000c00000000000000000000000000000000000000000000000000000000000000000,0x7971f4f1113227a0b305b6d7617747466a7d36b20cece379276a8b3ea2be17e8,2022-04-30 04:55:41.000 UTC,0,true -12497,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0xa9f9e675000000000000000000000000dac17f958d2ee523a2206206994597c13d831ec700000000000000000000000094b008aa00579c1307b0ef2c499ad98a8ce58e58000000000000000000000000c1a3b5c321d73065449f25d40fa61a2b4036f9c1000000000000000000000000c1a3b5c321d73065449f25d40fa61a2b4036f9c1000000000000000000000000000000000000000000000000000000004020137900000000000000000000000000000000000000000000000000000000000000c00000000000000000000000000000000000000000000000000000000000000000,0x9501f92578cc94b7a4327fac5a26550c13d8cf6074cf25d2166bb03ff8c3cea6,2022-04-30 07:47:45.000 UTC,0,true -12498,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0xa9f9e675000000000000000000000000dac17f958d2ee523a2206206994597c13d831ec700000000000000000000000094b008aa00579c1307b0ef2c499ad98a8ce58e5800000000000000000000000046f05604850563c5caf174bd14a7e346f0767e1e00000000000000000000000046f05604850563c5caf174bd14a7e346f0767e1e00000000000000000000000000000000000000000000000000000000484a7f4900000000000000000000000000000000000000000000000000000000000000c00000000000000000000000000000000000000000000000000000000000000000,0x06a7d5e5deaec3b3858eecc61adf72d62547e082356899afa4f33aef1ca5fc9c,2022-04-30 10:26:47.000 UTC,0,true -12501,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec34000000000000000000000000a95bc97d8b30795cc5fbadb149fe2e9144912d9c000000000000000000000000a95bc97d8b30795cc5fbadb149fe2e9144912d9c0000000000000000000000000000000000000000000000000090cf211193f56000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -12507,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec3400000000000000000000000006d6dec719e2acf3480e9478ad368e2eff1368cd00000000000000000000000006d6dec719e2acf3480e9478ad368e2eff1368cd00000000000000000000000000000000000000000000000000520c21fa67c24600000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -12510,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec34000000000000000000000000bfb786bef16ed161829ba9e4c0eb94d026a338c5000000000000000000000000bfb786bef16ed161829ba9e4c0eb94d026a338c5000000000000000000000000000000000000000000000000005840452088dde600000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -12512,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec340000000000000000000000007e8e651e8c22609d0f86528c98829023165d78560000000000000000000000007e8e651e8c22609d0f86528c98829023165d7856000000000000000000000000000000000000000000000000001a4676d705c1f700000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -12514,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec34000000000000000000000000aec769ae46b7d4baa9215e1775a37c9984656c27000000000000000000000000aec769ae46b7d4baa9215e1775a37c9984656c2700000000000000000000000000000000000000000000000001aa535d3d0c000000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -12515,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec34000000000000000000000000a79648a1a89219a135e55bc2a8803eeae4b03772000000000000000000000000a79648a1a89219a135e55bc2a8803eeae4b037720000000000000000000000000000000000000000000000000082d85aeff600c800000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -12518,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec34000000000000000000000000ba715566ebb933102651465b02e8dba50b29dd43000000000000000000000000ba715566ebb933102651465b02e8dba50b29dd43000000000000000000000000000000000000000000000000015d76908fb6b38f00000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -12521,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec340000000000000000000000004f6bad66ba1e4bf8d2c328c11653bb47b3f3449f0000000000000000000000004f6bad66ba1e4bf8d2c328c11653bb47b3f3449f000000000000000000000000000000000000000000000000058b1733c2d60e0000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -12524,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec34000000000000000000000000eb1eaf530ed313103b2450d188012b3f5b03e68b000000000000000000000000eb1eaf530ed313103b2450d188012b3f5b03e68b000000000000000000000000000000000000000000000000058b58ecaf7aaf0000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -12529,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec340000000000000000000000008d51e9f882465b20a1ea3063e8ac98e720057b240000000000000000000000008d51e9f882465b20a1ea3063e8ac98e720057b24000000000000000000000000000000000000000000000000005e1928929a653d00000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,0x52bc0a60508f1a40c9136479c94b47ddbda8551f5982642ef48ca7f0946d2bf0,2021-12-20 08:21:56.000 UTC,0,true -12534,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec34000000000000000000000000af61206578fb4e4ad1842efde1dc74fb44b497d3000000000000000000000000af61206578fb4e4ad1842efde1dc74fb44b497d300000000000000000000000000000000000000000000000001564531e6436a0700000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -12536,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec34000000000000000000000000dd65c5e9d1d4124a4730a9bad9ba5784f9b1d1ec000000000000000000000000dd65c5e9d1d4124a4730a9bad9ba5784f9b1d1ec00000000000000000000000000000000000000000000000000b3ea62ddd50e5800000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -12537,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec340000000000000000000000004f93a736784091e6292f7c6bad4d97836ce06a920000000000000000000000004f93a736784091e6292f7c6bad4d97836ce06a92000000000000000000000000000000000000000000000000037189a38ee5571200000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -12539,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec3400000000000000000000000061f4442da3ba5875916073697e96ee44019275fd00000000000000000000000061f4442da3ba5875916073697e96ee44019275fd0000000000000000000000000000000000000000000000000159a42c0d57749f00000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -12541,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec340000000000000000000000007db7bf3177b157fe9e8be57915e6bb653423a8e20000000000000000000000007db7bf3177b157fe9e8be57915e6bb653423a8e20000000000000000000000000000000000000000000000000159d9c30fb2bde000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -12542,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec3400000000000000000000000033853501d457b975eded3398fa3f127f7c30073900000000000000000000000033853501d457b975eded3398fa3f127f7c300739000000000000000000000000000000000000000000000000015803af67d108fe00000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -12543,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec340000000000000000000000009ca2c5e91ef49549819d805a0c38f348d33078cc0000000000000000000000009ca2c5e91ef49549819d805a0c38f348d33078cc000000000000000000000000000000000000000000000000015ca8f3f2cf889b00000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -12545,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec34000000000000000000000000e2837d50d9c8f48262340ebb953a7525d13e2540000000000000000000000000e2837d50d9c8f48262340ebb953a7525d13e2540000000000000000000000000000000000000000000000000015bc11cf4ea1d1400000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -12546,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec340000000000000000000000003a04d7df825fa6a0c1daddc4285ae41762b92a230000000000000000000000003a04d7df825fa6a0c1daddc4285ae41762b92a2300000000000000000000000000000000000000000000000002bfab037dc4d19500000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -12547,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec3400000000000000000000000027d204b561bf99ddfb872c8e1ca023ae468820ca00000000000000000000000027d204b561bf99ddfb872c8e1ca023ae468820ca000000000000000000000000000000000000000000000000015c033cf2411b6d00000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -12548,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec340000000000000000000000005c1c6ca180ac3446302bb396ade4ba392c26c7b20000000000000000000000005c1c6ca180ac3446302bb396ade4ba392c26c7b2000000000000000000000000000000000000000000000000015b88480c6f71b800000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -12549,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec34000000000000000000000000f6484a1e627f425aea442482d2ed3a71c3dbf474000000000000000000000000f6484a1e627f425aea442482d2ed3a71c3dbf474000000000000000000000000000000000000000000000000015c22d9bd95664800000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -12550,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec34000000000000000000000000a1225cde04c3f5d4b233aa3901eca3bc3fb83f41000000000000000000000000a1225cde04c3f5d4b233aa3901eca3bc3fb83f41000000000000000000000000000000000000000000000000015d74c7223a273f00000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -12551,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec3400000000000000000000000044be41c7efd167737b78fcaa93eb55bd8bf8165700000000000000000000000044be41c7efd167737b78fcaa93eb55bd8bf81657000000000000000000000000000000000000000000000000015ba4ff9cd40c2d00000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -12552,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec34000000000000000000000000061014b6fb0b97646762d2b1e523ed3af0b76f98000000000000000000000000061014b6fb0b97646762d2b1e523ed3af0b76f98000000000000000000000000000000000000000000000000015cee3c4c03f8b000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -12553,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec3400000000000000000000000030e17308b734d6f7177fef54018e552c6242b1ba00000000000000000000000030e17308b734d6f7177fef54018e552c6242b1ba00000000000000000000000000000000000000000000000000b504f03d5ad5bf00000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -12554,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec34000000000000000000000000c13d5f2a4c59b897ebe4f3dc3e4a7893feb322c9000000000000000000000000c13d5f2a4c59b897ebe4f3dc3e4a7893feb322c900000000000000000000000000000000000000000000000000ee08251ff3800000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -12555,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec34000000000000000000000000814390720bf3f2b45c31d3d1dc39cf609e6731e5000000000000000000000000814390720bf3f2b45c31d3d1dc39cf609e6731e500000000000000000000000000000000000000000000000000455c678263ca0000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -12556,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec34000000000000000000000000a5851a0ad5205d3c49f70c6b8f73a1b1cae259b1000000000000000000000000a5851a0ad5205d3c49f70c6b8f73a1b1cae259b1000000000000000000000000000000000000000000000000012b48797546277200000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -12558,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec34000000000000000000000000d1d9169f3dd1e7a2e89b1a5e62b7425f6fdb8fe6000000000000000000000000d1d9169f3dd1e7a2e89b1a5e62b7425f6fdb8fe6000000000000000000000000000000000000000000000000002386f26fc1000000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -12560,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec34000000000000000000000000e296113009c902bb372db1d2bb04756c787990a5000000000000000000000000e296113009c902bb372db1d2bb04756c787990a500000000000000000000000000000000000000000000000000216b2ecfe4d60000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -12562,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec34000000000000000000000000f0e97deadff3a31601c5a6f92600a5bee2946afb000000000000000000000000f0e97deadff3a31601c5a6f92600a5bee2946afb000000000000000000000000000000000000000000000000001c6bf52634000000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -12563,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec3400000000000000000000000047c0510103840dac5af896a027219231630d40ae00000000000000000000000047c0510103840dac5af896a027219231630d40ae000000000000000000000000000000000000000000000000001c6bf52634000000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -12564,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec340000000000000000000000001575c7913329e382ccc91afdd2adf735b6686e170000000000000000000000001575c7913329e382ccc91afdd2adf735b6686e17000000000000000000000000000000000000000000000000001c6bf52634000000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -12565,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec34000000000000000000000000c04bab572576adf321f0002963b70c715a49ec30000000000000000000000000c04bab572576adf321f0002963b70c715a49ec30000000000000000000000000000000000000000000000000001c6bf52634000000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -12584,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec3400000000000000000000000046e94a8ceb7bf9666ca8da233838fbcd924d466500000000000000000000000046e94a8ceb7bf9666ca8da233838fbcd924d4665000000000000000000000000000000000000000000000000000107c0e2fc200000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -12605,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec340000000000000000000000005a80d3dec587d242f06db92a4398668b66f183c60000000000000000000000005a80d3dec587d242f06db92a4398668b66f183c60000000000000000000000000000000000000000000000001ba6ccee3a25143900000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,0xdc9b7ec5d338c0ec72ade7ba1af0971e433f584d877d5380731e70aabbf90158,2022-02-23 07:54:45.000 UTC,0,true -12606,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec340000000000000000000000001b13ca2d6f12407f2430e8da4a30269b22ef07bd0000000000000000000000001b13ca2d6f12407f2430e8da4a30269b22ef07bd000000000000000000000000000000000000000000000000001c6bf52634000000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -12607,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec3400000000000000000000000068430574da4bdaa97680d7697f2580e46fef559200000000000000000000000068430574da4bdaa97680d7697f2580e46fef5592000000000000000000000000000000000000000000000000001c6bf52634000000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -12609,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec340000000000000000000000005427190f27b844b71f47aa4ea1028b73e01224250000000000000000000000005427190f27b844b71f47aa4ea1028b73e0122425000000000000000000000000000000000000000000000000001c6bf52634000000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -12611,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec340000000000000000000000000159254bf9fe9856e593a23373513548f7ea6c980000000000000000000000000159254bf9fe9856e593a23373513548f7ea6c98000000000000000000000000000000000000000000000000001c6bf52634000000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -12612,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec34000000000000000000000000d3b053a95db2da8ada39f892b17eb7f886216992000000000000000000000000d3b053a95db2da8ada39f892b17eb7f88621699200000000000000000000000000000000000000000000000001a229d893a0c5ea00000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,0x93e71a99de387904ec8ccbf0a88a54d45f5ccf7abfeae14da3dd5b8f374cc998,2022-06-28 07:18:45.000 UTC,0,true -12613,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec3400000000000000000000000028b273920f12584387bd886175d4f6e0bec446b400000000000000000000000028b273920f12584387bd886175d4f6e0bec446b4000000000000000000000000000000000000000000000000001c6bf52634000000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -12614,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec340000000000000000000000005b3b7eefd64b11fc3f55fdf36514e591745eef260000000000000000000000005b3b7eefd64b11fc3f55fdf36514e591745eef2600000000000000000000000000000000000000000000000000470de4df82000000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -12618,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec340000000000000000000000007ad6278079874587d7d56b185ae66f54a857670a0000000000000000000000007ad6278079874587d7d56b185ae66f54a857670a000000000000000000000000000000000000000000000000001c6bf52634000000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -12621,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec3400000000000000000000000041c71043ef53a2185523ee0af27ee17a3c7ff03900000000000000000000000041c71043ef53a2185523ee0af27ee17a3c7ff039000000000000000000000000000000000000000000000000001c6bf52634000000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -12625,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec34000000000000000000000000218c16b3a742a99a4616b76acab015d53c39665e000000000000000000000000218c16b3a742a99a4616b76acab015d53c39665e000000000000000000000000000000000000000000000000001c6bf52634000000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -12626,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec340000000000000000000000006539dd3f72d798693e4f4b2290d84de3c5115f3d0000000000000000000000006539dd3f72d798693e4f4b2290d84de3c5115f3d000000000000000000000000000000000000000000000000001c6bf52634000000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -12627,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec34000000000000000000000000b9edf1c495f910f100a1b3f3eccc9583cb7eefcd000000000000000000000000b9edf1c495f910f100a1b3f3eccc9583cb7eefcd000000000000000000000000000000000000000000000000001c6bf52634000000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -12628,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec34000000000000000000000000d51765816727e250f7a565745d769236b8e2b05f000000000000000000000000d51765816727e250f7a565745d769236b8e2b05f0000000000000000000000000000000000000000000000000032d5013509054000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -12629,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec34000000000000000000000000139eeb895d86939eb18b52b3347402dddeaad378000000000000000000000000139eeb895d86939eb18b52b3347402dddeaad37800000000000000000000000000000000000000000000000000a73b849db7688f00000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -12632,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec340000000000000000000000001e342d8cd201ce9d9c14f3a015c8dae0f41e40fa0000000000000000000000001e342d8cd201ce9d9c14f3a015c8dae0f41e40fa00000000000000000000000000000000000000000000000002bdfb72cb4f837300000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -12634,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec34000000000000000000000000a946173859026fc1e83341210b919b0b7d60d45d000000000000000000000000a946173859026fc1e83341210b919b0b7d60d45d00000000000000000000000000000000000000000000000000016bcc41e9000000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -12635,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec3400000000000000000000000020b45ffb7bdd01a17c7477acf706ce6781d259f200000000000000000000000020b45ffb7bdd01a17c7477acf706ce6781d259f20000000000000000000000000000000000000000000000000019a46adeaaf1c000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -12641,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec34000000000000000000000000fe8648813901b86ea9d8ec0a4594c76a6af8dd04000000000000000000000000fe8648813901b86ea9d8ec0a4594c76a6af8dd0400000000000000000000000000000000000000000000000000d52107cdda176600000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,0xe93937dfe5ee78b3982fc6260a6a3ca315264dde4b7d375722d89078f0c171dc,2022-03-14 12:02:18.000 UTC,0,true -12645,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec3400000000000000000000000061067823763a87b7029e43f1583be9be9658e31000000000000000000000000061067823763a87b7029e43f1583be9be9658e3100000000000000000000000000000000000000000000000000000f5904616e00000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -12648,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec34000000000000000000000000e4796a49c6a7b316612f7a095ffd33ac2b078953000000000000000000000000e4796a49c6a7b316612f7a095ffd33ac2b078953000000000000000000000000000000000000000000000000002579a693e21fa900000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -12652,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec340000000000000000000000008a99fd459b17ca41258bd85704f6ed8db8ea2e720000000000000000000000008a99fd459b17ca41258bd85704f6ed8db8ea2e72000000000000000000000000000000000000000000000000001c267d3ce0528000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -12653,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec34000000000000000000000000ba003e0ac4a61f3ba9d7f60ebdf8c0d76e8f6d7d000000000000000000000000ba003e0ac4a61f3ba9d7f60ebdf8c0d76e8f6d7d000000000000000000000000000000000000000000000000003e8456d93aaad900000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -12654,0x10e6593cdda8c58a1d0f14c5164b376352a55f2f,0x467194771dae2967aef3ecbedd3bf9a310c76c65,0xa9f9e6750000000000000000000000006b175474e89094c44da98b954eedeac495271d0f000000000000000000000000da10009cbd5d07dd0cecc66161fc93d7c9000da1000000000000000000000000cfa366350853663ac7d6128217138a02af8af66e000000000000000000000000cfa366350853663ac7d6128217138a02af8af66e0000000000000000000000000000000000000000000000006f05b59d3b20000000000000000000000000000000000000000000000000000000000000000000c00000000000000000000000000000000000000000000000000000000000000000,,,1,true -12655,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec3400000000000000000000000087e4c23cc70d2f83d94748709d6337bd7a3a700000000000000000000000000087e4c23cc70d2f83d94748709d6337bd7a3a70000000000000000000000000000000000000000000000000000041647b1a6e853400000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -12657,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec3400000000000000000000000047769fcdfd4a92b858d1fa8b89569fcd5865db1100000000000000000000000047769fcdfd4a92b858d1fa8b89569fcd5865db11000000000000000000000000000000000000000000000000006387ecff04b63100000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -12658,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec34000000000000000000000000191390bf43d7d987684a7fb2a0aacfa509984a2e000000000000000000000000191390bf43d7d987684a7fb2a0aacfa509984a2e000000000000000000000000000000000000000000000000002e4412dc7d513a00000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -12659,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec34000000000000000000000000cc262a30c95ec32fe38ca820660febe4e206cede000000000000000000000000cc262a30c95ec32fe38ca820660febe4e206cede000000000000000000000000000000000000000000000000000110d9316ec00000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -12660,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec3400000000000000000000000091c0cba20f536cd7e8163f0335ae98f5eb0eeff400000000000000000000000091c0cba20f536cd7e8163f0335ae98f5eb0eeff400000000000000000000000000000000000000000000000000060a24181e400000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -12661,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec34000000000000000000000000abf2eb2b127c8de7e6cc34fa236dedf28a9761ce000000000000000000000000abf2eb2b127c8de7e6cc34fa236dedf28a9761ce00000000000000000000000000000000000000000000000000012309ce54000000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -12662,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec340000000000000000000000007dbcfb15d9945c0651319982425d4daa4eeea56d0000000000000000000000007dbcfb15d9945c0651319982425d4daa4eeea56d00000000000000000000000000000000000000000000000000060a24181e400000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -12664,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec34000000000000000000000000d270c1d351e54520e42a809e3072865cbcb397db000000000000000000000000d270c1d351e54520e42a809e3072865cbcb397db00000000000000000000000000000000000000000000000000005af3107a400000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -12665,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec3400000000000000000000000024c275c4b6303b2dccb2fe5800c9b3c4fe1ac8c600000000000000000000000024c275c4b6303b2dccb2fe5800c9b3c4fe1ac8c600000000000000000000000000000000000000000000000000a72fc21487ac8000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -12668,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec3400000000000000000000000089709569ace26c3202bc29ba1149c77fe9cd1ceb00000000000000000000000089709569ace26c3202bc29ba1149c77fe9cd1ceb00000000000000000000000000000000000000000000000000005af3107a400000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -12669,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec340000000000000000000000003e97f96e80e3a324f0564b4b2e806238d9666fc50000000000000000000000003e97f96e80e3a324f0564b4b2e806238d9666fc500000000000000000000000000000000000000000000000000744ca984f499b600000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -12671,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec340000000000000000000000002108e0845a138c031731e756117e71d5f87671b40000000000000000000000002108e0845a138c031731e756117e71d5f87671b400000000000000000000000000000000000000000000000000002d79883d200000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -12676,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec3400000000000000000000000086d7b8065f85eba4cc25d9476478c033c9a31c8800000000000000000000000086d7b8065f85eba4cc25d9476478c033c9a31c880000000000000000000000000000000000000000000000000dde368945c8410000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -12677,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec340000000000000000000000000d9450faa3a0d1a68ef7d259db484e9f2b9927d40000000000000000000000000d9450faa3a0d1a68ef7d259db484e9f2b9927d4000000000000000000000000000000000000000000000000005b6ee628b48a1000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -12679,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec3400000000000000000000000075671888fd4090fbe05bd130ab8999e72e21b7c000000000000000000000000075671888fd4090fbe05bd130ab8999e72e21b7c000000000000000000000000000000000000000000000000002066968eba9c63e00000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -12684,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec34000000000000000000000000c889f649bcf28072c5aaf6e853568e506dee0c6a000000000000000000000000c889f649bcf28072c5aaf6e853568e506dee0c6a00000000000000000000000000000000000000000000000000448704339ef90000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -12685,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec340000000000000000000000006b95a4f17e9792afc6d9fc585e57b7f8bab97b1a0000000000000000000000006b95a4f17e9792afc6d9fc585e57b7f8bab97b1a000000000000000000000000000000000000000000000000007819c56fbeb77300000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -12686,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec34000000000000000000000000f514e198143ed375ad99c224059a3bc301766adb000000000000000000000000f514e198143ed375ad99c224059a3bc301766adb0000000000000000000000000000000000000000000000000045c913cd7b328000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -12688,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec340000000000000000000000009b11b6d5eaf7dcc3dc2d65067e585ac814a0e29c0000000000000000000000009b11b6d5eaf7dcc3dc2d65067e585ac814a0e29c000000000000000000000000000000000000000000000000006a94d74f43000000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,0x0d945151be2be0ba1c94fd3ad7441596cfe281d585c54ff465280e6a153d6c2b,2022-03-12 12:04:38.000 UTC,0,true -12689,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec340000000000000000000000003fedefe818aad7901954bae7efe677542c6177f00000000000000000000000003fedefe818aad7901954bae7efe677542c6177f0000000000000000000000000000000000000000000000000005b0d15f0743f0700000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -12690,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec34000000000000000000000000e20337ca0354a7007a0fb1ac4b3bbc6229d8e99d000000000000000000000000e20337ca0354a7007a0fb1ac4b3bbc6229d8e99d00000000000000000000000000000000000000000000000000581ac2ecac5b1900000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -12692,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec34000000000000000000000000f8ba35cc5493e2dc4e0780d4e299fd627265baaf000000000000000000000000f8ba35cc5493e2dc4e0780d4e299fd627265baaf0000000000000000000000000000000000000000000000000413c2366c04bd2000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -12694,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec34000000000000000000000000fce1466cd1533580d6988fd3f6de2312e7f9b478000000000000000000000000fce1466cd1533580d6988fd3f6de2312e7f9b47800000000000000000000000000000000000000000000000002dcb9be0f6ed76e00000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -12695,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec3400000000000000000000000077341b139631a179397692815b6fc3e015244aec00000000000000000000000077341b139631a179397692815b6fc3e015244aec000000000000000000000000000000000000000000000000001f5de40cd14bc000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -12697,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec3400000000000000000000000013faff37f9d615514d88c38d5371b74012a159f500000000000000000000000013faff37f9d615514d88c38d5371b74012a159f50000000000000000000000000000000000000000000000000117906885aec5c000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -12698,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec340000000000000000000000002a55920c86b7b277aa9e46dd35b5243b7024d4da0000000000000000000000002a55920c86b7b277aa9e46dd35b5243b7024d4da000000000000000000000000000000000000000000000000001c6bf52634000000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -12699,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec34000000000000000000000000b1e192e0c53412eea8ea2e83c4773c5682f615ee000000000000000000000000b1e192e0c53412eea8ea2e83c4773c5682f615ee000000000000000000000000000000000000000000000000001c6bf52634000000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -12700,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec3400000000000000000000000004b57903f6089e017cb58cf3106685c46ca52f9f00000000000000000000000004b57903f6089e017cb58cf3106685c46ca52f9f000000000000000000000000000000000000000000000000001c6bf52634000000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -12701,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec340000000000000000000000008a54641040bcb58b095f7e2c1ce7cb9fbd9b89730000000000000000000000008a54641040bcb58b095f7e2c1ce7cb9fbd9b897300000000000000000000000000000000000000000000000000a68329c833fefd00000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -12702,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec340000000000000000000000001876761f051f548d5e645a971a235860f8cb07420000000000000000000000001876761f051f548d5e645a971a235860f8cb0742000000000000000000000000000000000000000000000000001c6bf52634000000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -12704,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec34000000000000000000000000a166a2403953146f27f4d3fae975ce2c71f0c85f000000000000000000000000a166a2403953146f27f4d3fae975ce2c71f0c85f000000000000000000000000000000000000000000000000001c6bf52634000000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -12707,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec34000000000000000000000000ba18e462a6145c1b45b57642b7116f5e4625945b000000000000000000000000ba18e462a6145c1b45b57642b7116f5e4625945b000000000000000000000000000000000000000000000000001c6bf52634000000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -12708,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec34000000000000000000000000fb50e64a84303861f4ce3cb7ec2c278719f0e736000000000000000000000000fb50e64a84303861f4ce3cb7ec2c278719f0e736000000000000000000000000000000000000000000000000000a3886eaca5c8100000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -12709,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec34000000000000000000000000a961583fa5d5bce5303873f1e03ab47404709b2a000000000000000000000000a961583fa5d5bce5303873f1e03ab47404709b2a000000000000000000000000000000000000000000000000001c6bf52634000000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -12710,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec34000000000000000000000000b24adeb0b9fbbca38192c4104120d0065d3d67fe000000000000000000000000b24adeb0b9fbbca38192c4104120d0065d3d67fe000000000000000000000000000000000000000000000000001f36d97df45cc000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -12711,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec340000000000000000000000006ae52eedb15f230f5808f7534f9dc7ce714263e30000000000000000000000006ae52eedb15f230f5808f7534f9dc7ce714263e3000000000000000000000000000000000000000000000000001c6bf52634000000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -12712,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec34000000000000000000000000130ff3c7481bdda0341a8bf9b49d7576405e2ae5000000000000000000000000130ff3c7481bdda0341a8bf9b49d7576405e2ae5000000000000000000000000000000000000000000000000001c6bf52634000000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -12713,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec34000000000000000000000000aab30cec92a8340dd03f3b53192957beb46ce602000000000000000000000000aab30cec92a8340dd03f3b53192957beb46ce602000000000000000000000000000000000000000000000000001c6bf52634000000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -12714,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec3400000000000000000000000065eda3923fe4a0da4457f7386d0d53160deed0ef00000000000000000000000065eda3923fe4a0da4457f7386d0d53160deed0ef000000000000000000000000000000000000000000000000001c6bf52634000000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -12715,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec34000000000000000000000000b5803ab7d40541c08bba4b604537f8a1ec1ff111000000000000000000000000b5803ab7d40541c08bba4b604537f8a1ec1ff111000000000000000000000000000000000000000000000000001c6bf52634000000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -12716,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec340000000000000000000000000d3a16071fb668aa901f9779d0224fd806f790610000000000000000000000000d3a16071fb668aa901f9779d0224fd806f79061000000000000000000000000000000000000000000000000001c6bf52634000000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -12717,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec340000000000000000000000004c500a923764edb66541d2d73ba7976784f2fc860000000000000000000000004c500a923764edb66541d2d73ba7976784f2fc86000000000000000000000000000000000000000000000000001c6bf52634000000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -12718,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec3400000000000000000000000058f1449c9ed689d565a44391cae37391e54ed79200000000000000000000000058f1449c9ed689d565a44391cae37391e54ed792000000000000000000000000000000000000000000000000001c6bf52634000000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -12719,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec340000000000000000000000009326d59692f9e9b81be83e5bb3dde124ce1929750000000000000000000000009326d59692f9e9b81be83e5bb3dde124ce192975000000000000000000000000000000000000000000000000001c6bf52634000000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -12720,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec34000000000000000000000000a5ec11a3c2d0d16a237962739877eed9fda44444000000000000000000000000a5ec11a3c2d0d16a237962739877eed9fda44444000000000000000000000000000000000000000000000000001c6bf52634000000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -12721,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec3400000000000000000000000031f87119d2d00f2647494a4b621ca52d228f32e900000000000000000000000031f87119d2d00f2647494a4b621ca52d228f32e9000000000000000000000000000000000000000000000000001c6bf52634000000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -12722,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec3400000000000000000000000081c2e1491bb91821d847b24312c5ef47c39b73a700000000000000000000000081c2e1491bb91821d847b24312c5ef47c39b73a7000000000000000000000000000000000000000000000000001c6bf52634000000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -12723,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec34000000000000000000000000a11e87dea51429fa7db5f082dd924adbd69049eb000000000000000000000000a11e87dea51429fa7db5f082dd924adbd69049eb0000000000000000000000000000000000000000000000000d7cb58247ad936c00000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -12724,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec34000000000000000000000000fca5d3cbe52d1b6271f4281c42402113ffac582b000000000000000000000000fca5d3cbe52d1b6271f4281c42402113ffac582b000000000000000000000000000000000000000000000000001c6bf52634000000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -12725,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec340000000000000000000000008f4e9af1249e6ab82ac6d0ec433a97c9107b62470000000000000000000000008f4e9af1249e6ab82ac6d0ec433a97c9107b6247000000000000000000000000000000000000000000000000001c6bf52634000000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -12726,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec34000000000000000000000000ff590b4ccb8c7759cef24e9d808852628d837ddf000000000000000000000000ff590b4ccb8c7759cef24e9d808852628d837ddf000000000000000000000000000000000000000000000000001c6bf52634000000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -12727,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec340000000000000000000000004e281add1e87f5aa0fd9c39d8bcfd7c1a6da61fd0000000000000000000000004e281add1e87f5aa0fd9c39d8bcfd7c1a6da61fd000000000000000000000000000000000000000000000000002657444e6a800000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -12728,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec34000000000000000000000000cfc6b3bd3c6b935f81f5adf4d6f7c2e7775f728a000000000000000000000000cfc6b3bd3c6b935f81f5adf4d6f7c2e7775f728a000000000000000000000000000000000000000000000000001c6bf52634000000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -12729,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec34000000000000000000000000e3f319e3d501d5f4dc5d3fd33d18e6ba604d0184000000000000000000000000e3f319e3d501d5f4dc5d3fd33d18e6ba604d0184000000000000000000000000000000000000000000000000001c6bf52634000000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -12730,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec340000000000000000000000006fd9ef433f64e6bbd329c97bd4b896c27e209ee70000000000000000000000006fd9ef433f64e6bbd329c97bd4b896c27e209ee7000000000000000000000000000000000000000000000000001c6bf52634000000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -12731,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec34000000000000000000000000a213f4e26ad5d1e446deb665a36f062d6bd26966000000000000000000000000a213f4e26ad5d1e446deb665a36f062d6bd26966000000000000000000000000000000000000000000000000001c6bf52634000000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -12732,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec34000000000000000000000000ea02854800d8c005f1f66df7ddd8512501ccb6d3000000000000000000000000ea02854800d8c005f1f66df7ddd8512501ccb6d300000000000000000000000000000000000000000000000000038d7ea4c6800000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -12733,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec34000000000000000000000000a139bff325056bced6728154733a3c6198e5e946000000000000000000000000a139bff325056bced6728154733a3c6198e5e946000000000000000000000000000000000000000000000000001c6bf52634000000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -12739,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec3400000000000000000000000083540f4e22064133f42671ebf6bc8c70dc2d3adc00000000000000000000000083540f4e22064133f42671ebf6bc8c70dc2d3adc000000000000000000000000000000000000000000000000002386f26fc1000000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -12740,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec34000000000000000000000000b15c515b73817cedebf7501735c6e0da8344e3df000000000000000000000000b15c515b73817cedebf7501735c6e0da8344e3df00000000000000000000000000000000000000000000000002bde0a65af2303800000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -12741,0xcd9d4988c0ae61887b075ba77f08cbfad2b65068,0x3f87ff1de58128ef8fcb4c807efd776e1ac72e51,0xf4f7b41a0000000000000000000000004a85db7967db16bd82f93f2f426eff3cc9261e7e000000000000000000000000000000000000000000000003f45a2d2e460cf8dc,,,1,true -12742,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec3400000000000000000000000057424e704d9912129445cadae8c321a3bede349d00000000000000000000000057424e704d9912129445cadae8c321a3bede349d000000000000000000000000000000000000000000000000017e9c164ba03bfb00000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -12747,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec340000000000000000000000004a492dbab5fdbd910ec4120aca58ac72999eed160000000000000000000000004a492dbab5fdbd910ec4120aca58ac72999eed1600000000000000000000000000000000000000000000000000207c4cf86d1c8000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -12748,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec34000000000000000000000000755d95d8374e861b970ab341494ab2016555611a000000000000000000000000755d95d8374e861b970ab341494ab2016555611a0000000000000000000000000000000000000000000000000018cee9a1a7627f00000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -12752,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec34000000000000000000000000d661570546cfceccb801c02bd043248a36cfbc99000000000000000000000000d661570546cfceccb801c02bd043248a36cfbc990000000000000000000000000000000000000000000000000020d0868b0fbb0000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -12753,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec34000000000000000000000000071c1812bb93315c214a3855504dc6cb1f910545000000000000000000000000071c1812bb93315c214a3855504dc6cb1f91054500000000000000000000000000000000000000000000000000354a6ba7a1800000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -12754,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec34000000000000000000000000158dc5b8d904b089e60f26dc6e46c7eaaa45ab19000000000000000000000000158dc5b8d904b089e60f26dc6e46c7eaaa45ab1900000000000000000000000000000000000000000000000000207d9ea1c3a7c000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -12756,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec34000000000000000000000000e1344576ad891ac66e5252dba5365b88da1fd99b000000000000000000000000e1344576ad891ac66e5252dba5365b88da1fd99b000000000000000000000000000000000000000000000000000702eb3368060000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -12757,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec340000000000000000000000004a492dbab5fdbd910ec4120aca58ac72999eed160000000000000000000000004a492dbab5fdbd910ec4120aca58ac72999eed16000000000000000000000000000000000000000000000000061cc5d8345ac09700000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -12759,0xcd9d4988c0ae61887b075ba77f08cbfad2b65068,0x3f87ff1de58128ef8fcb4c807efd776e1ac72e51,0xf4f7b41a0000000000000000000000007461f3b3d064138f1cb963f0d1322c6568c3c0910000000000000000000000000000000000000000000000174dd0001a9d4accf9,,,1,true -12760,0xcd9d4988c0ae61887b075ba77f08cbfad2b65068,0x3f87ff1de58128ef8fcb4c807efd776e1ac72e51,0xf4f7b41a0000000000000000000000007461f3b3d064138f1cb963f0d1322c6568c3c091000000000000000000000000000000000000000000000051b6477b647f405e12,,,1,true -12762,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec3400000000000000000000000075586c3a0bc01ca9a0e36a712bee1523a1cc631200000000000000000000000075586c3a0bc01ca9a0e36a712bee1523a1cc63120000000000000000000000000000000000000000000000002980e84cbd48c67d00000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,0x7a626ddae1b5bb518fc9ecf24c96b772cf5645a0ae662566360bddd439346c56,2021-11-21 08:42:13.000 UTC,0,true -12763,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec34000000000000000000000000705c7909e5d4b833778cb95fee849c7dff1d0681000000000000000000000000705c7909e5d4b833778cb95fee849c7dff1d0681000000000000000000000000000000000000000000000000004cfd3251019af800000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -12766,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec34000000000000000000000000f3c6beb2f0de8e0d5c88f8dc7a801ad76b93b3ee000000000000000000000000f3c6beb2f0de8e0d5c88f8dc7a801ad76b93b3ee00000000000000000000000000000000000000000000000000062a5fde78d17e00000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -12769,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec34000000000000000000000000c1116f024b707e3640b2a0f312af3fdcc336d4a7000000000000000000000000c1116f024b707e3640b2a0f312af3fdcc336d4a7000000000000000000000000000000000000000000000000015714a295308f0000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -12772,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec340000000000000000000000009bd1f47bf530f5e0eb44dda1236e4c8e817dcd8d0000000000000000000000009bd1f47bf530f5e0eb44dda1236e4c8e817dcd8d00000000000000000000000000000000000000000000000004db73254763000000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -12774,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec3400000000000000000000000055d4deb9198118354f9edb1a0d0efd754a3b765b00000000000000000000000055d4deb9198118354f9edb1a0d0efd754a3b765b000000000000000000000000000000000000000000000000005b4b64304f482400000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -12775,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec34000000000000000000000000809505a32511e8d1a04cf40b15ca1ef86929cf4c000000000000000000000000809505a32511e8d1a04cf40b15ca1ef86929cf4c0000000000000000000000000000000000000000000000000117191b3f0fe1c100000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,0x46b423fafd82e1b9314ed49ad3ee97f6f3f369006cf74ecf09434e5e84294872,2022-05-07 06:09:43.000 UTC,0,true -12776,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec340000000000000000000000008e693edbbfbd115a36c438a02584a23c36c329190000000000000000000000008e693edbbfbd115a36c438a02584a23c36c329190000000000000000000000000000000000000000000000000ddb55e27d5ff42600000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,0xaa1d4f12a955d125b3338ea70941a1e5b099ca720719e009b9e27f5a493d900f,2021-11-29 01:03:57.000 UTC,0,true -12777,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec340000000000000000000000007fb32aa7933be746a166199eb498114915df22cb0000000000000000000000007fb32aa7933be746a166199eb498114915df22cb000000000000000000000000000000000000000000000000005730e38f31f63c00000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -12780,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec340000000000000000000000008c10c675b9aee3cb7dca0c455f4b94d45367ddbf0000000000000000000000008c10c675b9aee3cb7dca0c455f4b94d45367ddbf00000000000000000000000000000000000000000000000006f05b59d3b2000000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -12781,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec34000000000000000000000000719618e0a60a1bed6e136be73533ff057c227148000000000000000000000000719618e0a60a1bed6e136be73533ff057c22714800000000000000000000000000000000000000000000000000038d7ea4c6800000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -12783,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec3400000000000000000000000091f6a0688c1fcd87edf8dd094b709f0626f5960d00000000000000000000000091f6a0688c1fcd87edf8dd094b709f0626f5960d00000000000000000000000000000000000000000000000000038d7ea4c6800000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -12784,0x10e6593cdda8c58a1d0f14c5164b376352a55f2f,0x467194771dae2967aef3ecbedd3bf9a310c76c65,0xa9f9e6750000000000000000000000006b175474e89094c44da98b954eedeac495271d0f000000000000000000000000da10009cbd5d07dd0cecc66161fc93d7c9000da1000000000000000000000000809505a32511e8d1a04cf40b15ca1ef86929cf4c000000000000000000000000809505a32511e8d1a04cf40b15ca1ef86929cf4c0000000000000000000000000000000000000000000000093ae73131b2ce43ce00000000000000000000000000000000000000000000000000000000000000c00000000000000000000000000000000000000000000000000000000000000000,0xb57799339a131dd602339412db52c1a302a25a12ddc54d63716561511f0ea4cb,2022-05-07 06:00:02.000 UTC,0,true -12785,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec340000000000000000000000005326b539394f053ddbc1277362bb1719ecb0f67f0000000000000000000000005326b539394f053ddbc1277362bb1719ecb0f67f00000000000000000000000000000000000000000000000000038d7ea4c6800000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -12787,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec34000000000000000000000000a629ed28c4d37c5571f70ee756faee46a00ff06a000000000000000000000000a629ed28c4d37c5571f70ee756faee46a00ff06a00000000000000000000000000000000000000000000000000038d7ea4c6800000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -12788,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec340000000000000000000000009943bf91aa4b0fc79ff880a62d3b3880b7dd117d0000000000000000000000009943bf91aa4b0fc79ff880a62d3b3880b7dd117d00000000000000000000000000000000000000000000000000038d7ea4c6800000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -12789,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec34000000000000000000000000c085aea011244074edc9a58e8687ade6c4cbc81a000000000000000000000000c085aea011244074edc9a58e8687ade6c4cbc81a00000000000000000000000000000000000000000000000000038d7ea4c6800000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -12791,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec3400000000000000000000000007bdf143f15b3b7d83d1b49e8ad3d6a496bd3b8300000000000000000000000007bdf143f15b3b7d83d1b49e8ad3d6a496bd3b8300000000000000000000000000000000000000000000000000038d7ea4c6800000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -12792,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec340000000000000000000000004dbfaee2a9a1a4b453ff3c8b0fdcb98c10772f6b0000000000000000000000004dbfaee2a9a1a4b453ff3c8b0fdcb98c10772f6b00000000000000000000000000000000000000000000000000038d7ea4c6800000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -12793,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec340000000000000000000000005f7f14d3a32d1dd3e1c769a8c01b74cc6b927c860000000000000000000000005f7f14d3a32d1dd3e1c769a8c01b74cc6b927c8600000000000000000000000000000000000000000000000000038d7ea4c6800000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -12794,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec340000000000000000000000004b8d2e8fdcadd8524c25a59c1df7d6fbbf522a170000000000000000000000004b8d2e8fdcadd8524c25a59c1df7d6fbbf522a1700000000000000000000000000000000000000000000000000038d7ea4c6800000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -12795,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec34000000000000000000000000ab7d26bd08d4cc1274b337609ae50832a5f79953000000000000000000000000ab7d26bd08d4cc1274b337609ae50832a5f7995300000000000000000000000000000000000000000000000000038d7ea4c6800000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -12796,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec3400000000000000000000000066a67b1bc7304cce366e562617c07ddd0d41f35a00000000000000000000000066a67b1bc7304cce366e562617c07ddd0d41f35a00000000000000000000000000000000000000000000000000038d7ea4c6800000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -12797,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec34000000000000000000000000f71d5ce40059259b0dcc70c62e4bcd1186cafc6e000000000000000000000000f71d5ce40059259b0dcc70c62e4bcd1186cafc6e00000000000000000000000000000000000000000000000000038d7ea4c6800000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -12798,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec34000000000000000000000000c84758bc4d3e4f3c0412376e904fec06b675f088000000000000000000000000c84758bc4d3e4f3c0412376e904fec06b675f08800000000000000000000000000000000000000000000000000038d7ea4c6800000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -12799,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec34000000000000000000000000f3f595cf45c5b3bbc9866cd5893ea1a561603538000000000000000000000000f3f595cf45c5b3bbc9866cd5893ea1a56160353800000000000000000000000000000000000000000000000001a65169d00b10ff00000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -12801,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec340000000000000000000000001faa9b8c8eacffbae7c5cd2d5da4642cabfc3bf00000000000000000000000001faa9b8c8eacffbae7c5cd2d5da4642cabfc3bf00000000000000000000000000000000000000000000000000040ef039249039b00000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -12803,0xcd9d4988c0ae61887b075ba77f08cbfad2b65068,0x3f87ff1de58128ef8fcb4c807efd776e1ac72e51,0xf4f7b41a00000000000000000000000028bdc7378d6e28e1b7db3578e7553494e609b5060000000000000000000000000000000000000000000000008ac7230489e80000,,,1,true -12804,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec340000000000000000000000008cc4de9142fd56061197a0fc41e77446c5befb260000000000000000000000008cc4de9142fd56061197a0fc41e77446c5befb2600000000000000000000000000000000000000000000000002bcae08e5f95e7400000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,0xf3802b74f5e828bc424e869081d2579d6f9a14fa2c82b934fc3b86886231745f,2022-01-31 13:00:57.000 UTC,0,true -12805,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec34000000000000000000000000515c495808d85b1955e9cc99af4bffb59898c458000000000000000000000000515c495808d85b1955e9cc99af4bffb59898c45800000000000000000000000000000000000000000000000009b6de9a817efd3300000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -12810,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec340000000000000000000000006442e7898a122afec3cb6db82519461f8a30e8890000000000000000000000006442e7898a122afec3cb6db82519461f8a30e889000000000000000000000000000000000000000000000000006fdd3b0899f80000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -12811,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec34000000000000000000000000bc0274c302e5c90d092a02fd41f0238eba44b72b000000000000000000000000bc0274c302e5c90d092a02fd41f0238eba44b72b0000000000000000000000000000000000000000000000000dd0c7089e4cd75800000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -12812,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec34000000000000000000000000212e676d6252a03f9f2e06ae8de251fa5c9b4a14000000000000000000000000212e676d6252a03f9f2e06ae8de251fa5c9b4a14000000000000000000000000000000000000000000000000006f8e40053fc80000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -12814,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec340000000000000000000000004f97c713f909bbee228c76176de971b6ce0a03120000000000000000000000004f97c713f909bbee228c76176de971b6ce0a0312000000000000000000000000000000000000000000000000016901d16999a4e100000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -12818,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec34000000000000000000000000bb22ffae8c9205cc3677f16c5b79dffba9479b4a000000000000000000000000bb22ffae8c9205cc3677f16c5b79dffba9479b4a00000000000000000000000000000000000000000000000000000573039d050000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -12821,0x10e6593cdda8c58a1d0f14c5164b376352a55f2f,0x467194771dae2967aef3ecbedd3bf9a310c76c65,0xa9f9e6750000000000000000000000006b175474e89094c44da98b954eedeac495271d0f000000000000000000000000da10009cbd5d07dd0cecc66161fc93d7c9000da100000000000000000000000065d70debbab734a5af4c3c52db9442ae74c211b700000000000000000000000065d70debbab734a5af4c3c52db9442ae74c211b7000000000000000000000000000000000000000000000007a170773c6941199400000000000000000000000000000000000000000000000000000000000000c00000000000000000000000000000000000000000000000000000000000000000,,,1,true -12822,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec34000000000000000000000000addb10584f84d8afaaa3151c44104e667cc5f845000000000000000000000000addb10584f84d8afaaa3151c44104e667cc5f845000000000000000000000000000000000000000000000000003b939aff026ad500000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -12823,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec3400000000000000000000000021bc50129dd6c34162ec0cf715857042cd09ec2300000000000000000000000021bc50129dd6c34162ec0cf715857042cd09ec2300000000000000000000000000000000000000000000000000252cc852a6358000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -12824,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec34000000000000000000000000cd0229dc6b9d2977a6104d2d42e68d6646cba411000000000000000000000000cd0229dc6b9d2977a6104d2d42e68d6646cba411000000000000000000000000000000000000000000000000005d5ff49dd39c3200000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -12825,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec34000000000000000000000000458dc04bcd7e95c5bbbe0a7a997e2a6923add5c8000000000000000000000000458dc04bcd7e95c5bbbe0a7a997e2a6923add5c800000000000000000000000000000000000000000000000006e6d708d296866200000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,0x8e143b2b975340b1f3bc9877f0befd03bbf7fece4f2ef7addd4a94bc0a0ba605,2021-12-09 01:22:14.000 UTC,0,true -12826,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0xa9f9e675000000000000000000000000a0b86991c6218b36c1d19d4a2e9eb0ce3606eb480000000000000000000000007f5c764cbc14f9669b88837ca1490cca17c31607000000000000000000000000746e6c744fe06068a7a929d164537ed5f8b1763a000000000000000000000000746e6c744fe06068a7a929d164537ed5f8b1763a000000000000000000000000000000000000000000000000000000001215b93800000000000000000000000000000000000000000000000000000000000000c00000000000000000000000000000000000000000000000000000000000000000,,,1,true -12827,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec34000000000000000000000000c4ef68733ce0bbac45f02c2b183c9ce7c21843dd000000000000000000000000c4ef68733ce0bbac45f02c2b183c9ce7c21843dd00000000000000000000000000000000000000000000000006f05b59d3b2000000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -12828,0x10e6593cdda8c58a1d0f14c5164b376352a55f2f,0x467194771dae2967aef3ecbedd3bf9a310c76c65,0xa9f9e6750000000000000000000000006b175474e89094c44da98b954eedeac495271d0f000000000000000000000000da10009cbd5d07dd0cecc66161fc93d7c9000da100000000000000000000000016b53915280fdbcc205dc90b83f802ec5e3656e100000000000000000000000016b53915280fdbcc205dc90b83f802ec5e3656e100000000000000000000000000000000000000000000002828731523712523ff00000000000000000000000000000000000000000000000000000000000000c00000000000000000000000000000000000000000000000000000000000000000,,,1,true -12833,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec34000000000000000000000000370b3b4ceefd6778318ff01b7102be801d4fb661000000000000000000000000370b3b4ceefd6778318ff01b7102be801d4fb661000000000000000000000000000000000000000000000000006203718bd0b76300000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -12834,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec3400000000000000000000000092a966e56bbfb61f634cbeda33cd54efa068e99300000000000000000000000092a966e56bbfb61f634cbeda33cd54efa068e99300000000000000000000000000000000000000000000000000e6ed27d666800000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -12835,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec34000000000000000000000000b751649de24d0c89e1da9146a21d0edb856ab21c000000000000000000000000b751649de24d0c89e1da9146a21d0edb856ab21c00000000000000000000000000000000000000000000000000d529ae9e86000000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -12840,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec3400000000000000000000000051adc9e994b4fee643906fbf2c25c1dc101191bc00000000000000000000000051adc9e994b4fee643906fbf2c25c1dc101191bc0000000000000000000000000000000000000000000000000022102f217f257f00000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -12841,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec3400000000000000000000000066eaf73d1608983e349fc2ab7f54bac42f59cf1e00000000000000000000000066eaf73d1608983e349fc2ab7f54bac42f59cf1e00000000000000000000000000000000000000000000000000034ac267addfab00000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -12842,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec34000000000000000000000000cac3bfe014ee049d2eeec30c7a396a29b1fe1349000000000000000000000000cac3bfe014ee049d2eeec30c7a396a29b1fe13490000000000000000000000000000000000000000000000000001d565e5c2a7f700000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -12843,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec340000000000000000000000003a71f0695dacde00ccecc622556f711e2b4d50a00000000000000000000000003a71f0695dacde00ccecc622556f711e2b4d50a0000000000000000000000000000000000000000000000000010402a50fa3095d00000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,0x5f3eb59805654adf40549be292648881c654a3717d9ea5dd78581b1c62dc797f,2022-08-05 14:59:48.000 UTC,0,true -12844,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec34000000000000000000000000915d26fa87d887e165d6573a77461f79a3de37ed000000000000000000000000915d26fa87d887e165d6573a77461f79a3de37ed00000000000000000000000000000000000000000000000006e2029807ce00b600000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -12845,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec3400000000000000000000000073b2e83fa1ee3057053350e830ecc3b535672b6200000000000000000000000073b2e83fa1ee3057053350e830ecc3b535672b620000000000000000000000000000000000000000000000000049dabdd8e497f800000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,0xd149b57d5e2aacdeeb6c028b7daaa738f78739b107a381c3900e09cc7e14f59a,2022-07-17 11:26:13.000 UTC,0,true -12846,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec3400000000000000000000000021fb9d4351ec723fae6e643a92b8fdb5aaaf5b4a00000000000000000000000021fb9d4351ec723fae6e643a92b8fdb5aaaf5b4a00000000000000000000000000000000000000000000000000034ac267addfab00000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -12847,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec34000000000000000000000000378991fb57ee360b66a106eef83e362dc8ba8c1c000000000000000000000000378991fb57ee360b66a106eef83e362dc8ba8c1c000000000000000000000000000000000000000000000000001c5b2b6a0e93c700000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -12849,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec3400000000000000000000000046483f48fdf320b98700c7309270c0ad44f1d24400000000000000000000000046483f48fdf320b98700c7309270c0ad44f1d24400000000000000000000000000000000000000000000000001cdda4faccd000000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -12850,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec340000000000000000000000009a9da0a5be8c3fcdf748807186ae25618aa3d0cd0000000000000000000000009a9da0a5be8c3fcdf748807186ae25618aa3d0cd000000000000000000000000000000000000000000000000004c2cb8d197c90000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -12853,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec34000000000000000000000000954b0f9b718d637e3e748718538687a4779afc96000000000000000000000000954b0f9b718d637e3e748718538687a4779afc960000000000000000000000000000000000000000000000000047aad43b28ac7f00000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -12860,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec34000000000000000000000000dd079cc159b66c3a4c64ebbe1555226913c4a1c4000000000000000000000000dd079cc159b66c3a4c64ebbe1555226913c4a1c400000000000000000000000000000000000000000000000008cff922b85f800000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,0x662831a1c7275eedaa8dda8d086f4719d8904838cab7fdb8cc04477a557eb531,2022-11-01 19:49:11.000 UTC,0,true -12861,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec34000000000000000000000000828b3b3cb2fa9eb8c631d40db9de6b0809fcaacc000000000000000000000000828b3b3cb2fa9eb8c631d40db9de6b0809fcaacc000000000000000000000000000000000000000000000000004f7948c33f618d00000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,0xff8a829554519b0d6b3348dd373d4fa05b7009f961b4f5f97d9401a19d1957e5,2022-08-06 09:46:38.000 UTC,0,true -12864,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec34000000000000000000000000b6e3db3b88c1c9a5f19554df3736e6c5c6630ad0000000000000000000000000b6e3db3b88c1c9a5f19554df3736e6c5c6630ad0000000000000000000000000000000000000000000000000002386f26fc1000000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -12865,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec34000000000000000000000000a2966908f05b065d7006c25d91f991b3260c9250000000000000000000000000a2966908f05b065d7006c25d91f991b3260c92500000000000000000000000000000000000000000000000000001d8865af6030000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -12867,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec34000000000000000000000000659ba0b652fb66bb6c1261f5d0aeaeb30fcfec35000000000000000000000000659ba0b652fb66bb6c1261f5d0aeaeb30fcfec35000000000000000000000000000000000000000000000000005457648effdaec00000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -12876,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec34000000000000000000000000c6fd1ad1419a72cf120586bf741e7292872d91c4000000000000000000000000c6fd1ad1419a72cf120586bf741e7292872d91c4000000000000000000000000000000000000000000000000014af5dad985d03c00000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -12877,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec34000000000000000000000000e77a8fb60de5f73c610997976e619e4d51d09c98000000000000000000000000e77a8fb60de5f73c610997976e619e4d51d09c98000000000000000000000000000000000000000000000000001e00e95f906c0000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -12879,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec34000000000000000000000000f3f34c80b30ce105704e259a79cacb53fd35e124000000000000000000000000f3f34c80b30ce105704e259a79cacb53fd35e1240000000000000000000000000000000000000000000000002a53c6d724f1000000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -12881,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec34000000000000000000000000e71c9fc7f58baa5501f8f64c0b7b8fb11b7bdcd9000000000000000000000000e71c9fc7f58baa5501f8f64c0b7b8fb11b7bdcd90000000000000000000000000000000000000000000000000000cd3e077f172200000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -12882,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec34000000000000000000000000e9cef4b10b7461fc0db63bc55b01721583b4a620000000000000000000000000e9cef4b10b7461fc0db63bc55b01721583b4a620000000000000000000000000000000000000000000000000001283b363e5361a00000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -12883,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec34000000000000000000000000df621e4da74bb2249b7bdec7f5db6d00967d52a9000000000000000000000000df621e4da74bb2249b7bdec7f5db6d00967d52a90000000000000000000000000000000000000000000000000043a476d6e1006e00000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,0x83d3e95d584cd5c794dbc7b9547838b27fc3ae18af10baf5cc1ac49c9d4ed667,2022-05-17 07:45:36.000 UTC,0,true -12885,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec34000000000000000000000000ea62f4842744fc78400e7a6c7e5ff6b0dd9bea37000000000000000000000000ea62f4842744fc78400e7a6c7e5ff6b0dd9bea37000000000000000000000000000000000000000000000000010121dc0ad067b400000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -12886,0x10e6593cdda8c58a1d0f14c5164b376352a55f2f,0x467194771dae2967aef3ecbedd3bf9a310c76c65,0xa9f9e6750000000000000000000000006b175474e89094c44da98b954eedeac495271d0f000000000000000000000000da10009cbd5d07dd0cecc66161fc93d7c9000da1000000000000000000000000b4a1e68ec39294ee9d7bc92bcfe66c2cdc47f5dd000000000000000000000000b4a1e68ec39294ee9d7bc92bcfe66c2cdc47f5dd000000000000000000000000000000000000000000000000b9066c620cb5876900000000000000000000000000000000000000000000000000000000000000c00000000000000000000000000000000000000000000000000000000000000000,,,1,true -12887,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec340000000000000000000000008d03635c0adf3501ccfc69e5cefd8ecf88cadd3c0000000000000000000000008d03635c0adf3501ccfc69e5cefd8ecf88cadd3c0000000000000000000000000000000000000000000000000001c6bf5263400000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -12888,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec340000000000000000000000008176d3d058a568b3ec428105cd994cc4d7acdaca0000000000000000000000008176d3d058a568b3ec428105cd994cc4d7acdaca000000000000000000000000000000000000000000000000006a94d74f43000000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -12889,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec340000000000000000000000004e4c5a6730f373f43aa11f5c10b1f89bb4cd731f0000000000000000000000004e4c5a6730f373f43aa11f5c10b1f89bb4cd731f000000000000000000000000000000000000000000000000000018f88167808000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -12890,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec34000000000000000000000000e17634a96b2f1a0f9c0cde3d825f7345e2071dd5000000000000000000000000e17634a96b2f1a0f9c0cde3d825f7345e2071dd50000000000000000000000000000000000000000000000000001c6bf5263400000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -12891,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec34000000000000000000000000d6112bb75d036a4af8d1fae4eb6cb01e9731f703000000000000000000000000d6112bb75d036a4af8d1fae4eb6cb01e9731f7030000000000000000000000000000000000000000000000000021fdbe4608150000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -12892,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec34000000000000000000000000c8b53c62cb8b13993fba7bfcb0be04bec999bd8f000000000000000000000000c8b53c62cb8b13993fba7bfcb0be04bec999bd8f0000000000000000000000000000000000000000000000000001c6bf5263400000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -12893,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec340000000000000000000000004e4c5a6730f373f43aa11f5c10b1f89bb4cd731f0000000000000000000000004e4c5a6730f373f43aa11f5c10b1f89bb4cd731f00000000000000000000000000000000000000000000000000044b1bd821019300000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -12896,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec34000000000000000000000000d08c941d3d5e36ffcfa0a090a7247ac08b0473f5000000000000000000000000d08c941d3d5e36ffcfa0a090a7247ac08b0473f5000000000000000000000000000000000000000000000000001fb6edc125938000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -12897,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec34000000000000000000000000befb73c7f61ed9f3c5392a25acc58cfe00cc0554000000000000000000000000befb73c7f61ed9f3c5392a25acc58cfe00cc055400000000000000000000000000000000000000000000000000222eac0340e70000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -12900,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec340000000000000000000000004046d34aa2748a6d9d252526681b0d7d70ef8a4a0000000000000000000000004046d34aa2748a6d9d252526681b0d7d70ef8a4a00000000000000000000000000000000000000000000000001100d4b270c0a4700000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -12901,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec3400000000000000000000000075aa792a13f651a167ec764915ce19619342190100000000000000000000000075aa792a13f651a167ec764915ce1961934219010000000000000000000000000000000000000000000000000039843e1868fa2700000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -12902,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0xa9f9e675000000000000000000000000514910771af9ca656af840dff83e8264ecf986ca000000000000000000000000350a791bfc2c21f9ed5d10980dad2e2638ffa7f600000000000000000000000001687491cb797f011790f349cbf8969dad49fcd300000000000000000000000001687491cb797f011790f349cbf8969dad49fcd30000000000000000000000000000000000000000000000069131912f2c09a6f700000000000000000000000000000000000000000000000000000000000000c00000000000000000000000000000000000000000000000000000000000000000,,,1,true -12903,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec34000000000000000000000000d4701f5ab31d4104c091a9b5504827ec6aacdf39000000000000000000000000d4701f5ab31d4104c091a9b5504827ec6aacdf39000000000000000000000000000000000000000000000000000e35fa931a000000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -12907,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec340000000000000000000000009bd8f365fe9e81826ff3069516f01fdc7f7c81cf0000000000000000000000009bd8f365fe9e81826ff3069516f01fdc7f7c81cf0000000000000000000000000000000000000000000000000005f41a4b6b0a4100000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -12908,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec340000000000000000000000002282bc8e090439a0195e0c862ae3ffc47bd2edd80000000000000000000000002282bc8e090439a0195e0c862ae3ffc47bd2edd8000000000000000000000000000000000000000000000000008220c6a2c11be600000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -12909,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec34000000000000000000000000a787a56c43847a3b5a0110d0b5e004e47f57b22e000000000000000000000000a787a56c43847a3b5a0110d0b5e004e47f57b22e00000000000000000000000000000000000000000000000002115892d54d00c000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -12910,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec3400000000000000000000000019e2feb48d91ef9cddcc4efbad34f83d537e056b00000000000000000000000019e2feb48d91ef9cddcc4efbad34f83d537e056b0000000000000000000000000000000000000000000000000004758442a6703f00000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -12911,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec340000000000000000000000002921ad97c82508fc9d5ec82d588392c41e707aef0000000000000000000000002921ad97c82508fc9d5ec82d588392c41e707aef00000000000000000000000000000000000000000000000000087910629986b400000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -12912,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec340000000000000000000000009c28be66c952d1cd635323d22bb0ce47aa5e5b4e0000000000000000000000009c28be66c952d1cd635323d22bb0ce47aa5e5b4e0000000000000000000000000000000000000000000000000007c0ccd18b8e8500000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -12913,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec34000000000000000000000000aba29c745654aacfe8ffbdc9d41b908d18818dc9000000000000000000000000aba29c745654aacfe8ffbdc9d41b908d18818dc90000000000000000000000000000000000000000000000000009449e9cce5d8a00000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -12914,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec340000000000000000000000007e32c81de998997fed27be29e5a09be5202007fa0000000000000000000000007e32c81de998997fed27be29e5a09be5202007fa000000000000000000000000000000000000000000000000003c6568f12e800000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -12915,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec34000000000000000000000000777af6717e781652c513e6e3a90088d4e1d404f4000000000000000000000000777af6717e781652c513e6e3a90088d4e1d404f4000000000000000000000000000000000000000000000000003e0a8a66fedde000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -12918,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec34000000000000000000000000539b3f56d9e09e59d814ae8d89cd6a0376f1ee8d000000000000000000000000539b3f56d9e09e59d814ae8d89cd6a0376f1ee8d000000000000000000000000000000000000000000000000014f0b69a5d5efae00000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,0x93e5b6e3508153f1b6f653574d3d0b61906d3c94a76423690020d306ce860960,2022-04-21 09:27:28.000 UTC,0,true -12920,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec34000000000000000000000000e7913d85f52cf4010b1439c13043918cbedc3fb6000000000000000000000000e7913d85f52cf4010b1439c13043918cbedc3fb600000000000000000000000000000000000000000000000000af4c851d66c30000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -12921,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec340000000000000000000000004485524d6c604e5bac8b574c3a084da6d870bee90000000000000000000000004485524d6c604e5bac8b574c3a084da6d870bee9000000000000000000000000000000000000000000000000013fb438495583d700000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -12922,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec340000000000000000000000006840046c485f25b355efbcdd68f12b9af94af5e80000000000000000000000006840046c485f25b355efbcdd68f12b9af94af5e80000000000000000000000000000000000000000000000000328761afeaaded700000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -12924,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec340000000000000000000000009071d90ce852d0c5ab0a5fbdd5f79110246cfe8f0000000000000000000000009071d90ce852d0c5ab0a5fbdd5f79110246cfe8f00000000000000000000000000000000000000000000000000653d9290edc77a00000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -12925,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec340000000000000000000000003d3efc714ec1828967d3d13e65a2709c1639d5110000000000000000000000003d3efc714ec1828967d3d13e65a2709c1639d511000000000000000000000000000000000000000000000000002b208e82668d9500000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,0x971aca1eb95534c05ad2d19d1d1b3261445e1e271d42a888019e1672666569c8,2022-04-19 17:24:24.000 UTC,0,true -12926,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec3400000000000000000000000000255441d1244e801c4728b87f942e8299ae416400000000000000000000000000255441d1244e801c4728b87f942e8299ae41640000000000000000000000000000000000000000000000000006aa4592d3879100000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -12931,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec3400000000000000000000000092d9078f2d1e56d0027ebea225a132966ef199ca00000000000000000000000092d9078f2d1e56d0027ebea225a132966ef199ca0000000000000000000000000000000000000000000000000005dcaa8fe1200000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -12934,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec3400000000000000000000000027ee65c004cbc638b558719ec0b5ca79b7f6570400000000000000000000000027ee65c004cbc638b558719ec0b5ca79b7f657040000000000000000000000000000000000000000000000000c0b749a9b91c0cf00000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -12936,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec34000000000000000000000000bde9553f80906e869a07ef97e9e1bfce9990659a000000000000000000000000bde9553f80906e869a07ef97e9e1bfce9990659a00000000000000000000000000000000000000000000000000470de4df82000000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -12937,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec34000000000000000000000000426033ec3f5be02d1804d7f13156079fe4e8f375000000000000000000000000426033ec3f5be02d1804d7f13156079fe4e8f375000000000000000000000000000000000000000000000000001dafb87e5ec1bc00000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -12938,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec3400000000000000000000000038631194260edb73c589184037a4a853487d72dd00000000000000000000000038631194260edb73c589184037a4a853487d72dd00000000000000000000000000000000000000000000000000054ec37a271a3a00000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -12939,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec340000000000000000000000005043af16d5d2079310a08fb28ed574fb7791465f0000000000000000000000005043af16d5d2079310a08fb28ed574fb7791465f00000000000000000000000000000000000000000000000000a8ac8d0e25108100000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -12940,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec34000000000000000000000000dee8450efd643f7ee615ec6ae8b91bac59c49f1d000000000000000000000000dee8450efd643f7ee615ec6ae8b91bac59c49f1d0000000000000000000000000000000000000000000000000000352bff8879c000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -12945,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec340000000000000000000000003391b9df7de82946e87f1a0baa92bd962011245d0000000000000000000000003391b9df7de82946e87f1a0baa92bd962011245d00000000000000000000000000000000000000000000000001618fc911ff3d0000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -12947,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec34000000000000000000000000b54cb94f64697f723bdd16886de9e13b2fd11831000000000000000000000000b54cb94f64697f723bdd16886de9e13b2fd118310000000000000000000000000000000000000000000000000019105228d7c27d00000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -12949,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec34000000000000000000000000dd46b0537b49ea212ec86308c20bd0070477d60e000000000000000000000000dd46b0537b49ea212ec86308c20bd0070477d60e00000000000000000000000000000000000000000000000000c2fa3d9bc3d16900000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -12950,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec34000000000000000000000000ef20f2b7367028a1adf9d1d0bcb7f9cea6beb0c3000000000000000000000000ef20f2b7367028a1adf9d1d0bcb7f9cea6beb0c30000000000000000000000000000000000000000000000000000b5e620f4800000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -12952,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec3400000000000000000000000077cfb5f69dd4825c0ffd6fce079af786ac13a10800000000000000000000000077cfb5f69dd4825c0ffd6fce079af786ac13a1080000000000000000000000000000000000000000000000000058d15e1762800000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -12953,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec340000000000000000000000007bfeeafd6bdb6a87e9c3d9454311964f4feeec450000000000000000000000007bfeeafd6bdb6a87e9c3d9454311964f4feeec450000000000000000000000000000000000000000000000000001e69beac04f4000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -12954,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec340000000000000000000000007b22f4e0b10b2d3a09f8bddf02988d3ae34f82bf0000000000000000000000007b22f4e0b10b2d3a09f8bddf02988d3ae34f82bf0000000000000000000000000000000000000000000000000000b5e620f4800000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -12956,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec34000000000000000000000000dee8450efd643f7ee615ec6ae8b91bac59c49f1d000000000000000000000000dee8450efd643f7ee615ec6ae8b91bac59c49f1d000000000000000000000000000000000000000000000000000649efc657056400000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -12958,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec340000000000000000000000003f532929c0a50b84656394ff58e75c49a95270db0000000000000000000000003f532929c0a50b84656394ff58e75c49a95270db000000000000000000000000000000000000000000000000000e35fa931a000000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -12959,0xcd9d4988c0ae61887b075ba77f08cbfad2b65068,0x3f87ff1de58128ef8fcb4c807efd776e1ac72e51,0xf4f7b41a000000000000000000000000ca4eb9db9d8bc0d7dae95467d51ae72445e0aab1000000000000000000000000000000000000000000000000827b47667778a720,,,1,true -12961,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec34000000000000000000000000329934d67e38c93d2e86dff79826649e9bf6462a000000000000000000000000329934d67e38c93d2e86dff79826649e9bf6462a000000000000000000000000000000000000000000000000006681e11de380d700000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -12963,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec34000000000000000000000000563ac66ba17d69ea73c0b531556c922c31699474000000000000000000000000563ac66ba17d69ea73c0b531556c922c31699474000000000000000000000000000000000000000000000000008e1bc9bf04000000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -12965,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec34000000000000000000000000286e7c578f188cccc123075f7045b183ce85bc05000000000000000000000000286e7c578f188cccc123075f7045b183ce85bc050000000000000000000000000000000000000000000000000061e1da0666727100000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -12967,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec340000000000000000000000003f532929c0a50b84656394ff58e75c49a95270db0000000000000000000000003f532929c0a50b84656394ff58e75c49a95270db000000000000000000000000000000000000000000000000002386f26fc1000000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -12968,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec34000000000000000000000000e5277f97e41f39b84b255db419bb2a27936da075000000000000000000000000e5277f97e41f39b84b255db419bb2a27936da075000000000000000000000000000000000000000000000000005b8d2e56074a0000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -12969,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec34000000000000000000000000c38344d5aeb271938ee11dbb2488a89df4080db1000000000000000000000000c38344d5aeb271938ee11dbb2488a89df4080db10000000000000000000000000000000000000000000000000721f42f9297a84000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,0x65a1d69c4e12fc7f67ade6a51ebb5a0d3ae97e10bc3d6f29707208bd2818f081,2022-04-27 06:47:33.000 UTC,0,true -12971,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec34000000000000000000000000d385890bb9beae40d902a890ba04e8d1f87f10cd000000000000000000000000d385890bb9beae40d902a890ba04e8d1f87f10cd00000000000000000000000000000000000000000000000000ad128ddcce0da100000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -12972,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec340000000000000000000000007d4326b581615643d70a68f2d2ba0cfdf381c81f0000000000000000000000007d4326b581615643d70a68f2d2ba0cfdf381c81f00000000000000000000000000000000000000000000000000b1a2bc2ec5000000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -12974,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec340000000000000000000000006cd387adb134470953881c9a416806d636e7a0150000000000000000000000006cd387adb134470953881c9a416806d636e7a0150000000000000000000000000000000000000000000000000aa51f57014be30d00000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -12975,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec3400000000000000000000000004c1ecdfae5975ad3c0f91049a7daa0bac20579400000000000000000000000004c1ecdfae5975ad3c0f91049a7daa0bac20579400000000000000000000000000000000000000000000000000432d1c04ec16a500000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -12976,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec34000000000000000000000000b7ce42bf09ad09f696889eb5ea5341946d8fb22f000000000000000000000000b7ce42bf09ad09f696889eb5ea5341946d8fb22f00000000000000000000000000000000000000000000000000005af3107a400000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -12977,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec34000000000000000000000000ed20ba69d7977d97a930634beb75424edcceb235000000000000000000000000ed20ba69d7977d97a930634beb75424edcceb23500000000000000000000000000000000000000000000000002c4c8640bd5f30000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -12978,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec34000000000000000000000000e153ba6e7c8d5ff6ce6d5968044ce72cd4ba38fe000000000000000000000000e153ba6e7c8d5ff6ce6d5968044ce72cd4ba38fe00000000000000000000000000000000000000000000000002c1a6acfd69632100000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,0xefe34ced3e361a6bea117829b6dde6f242187114bfce7c061b7dc2b76642e5ed,2021-12-08 09:18:11.000 UTC,0,true -12979,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec34000000000000000000000000f84a3d0e725e2712f93e0db9560c603cc645451a000000000000000000000000f84a3d0e725e2712f93e0db9560c603cc645451a000000000000000000000000000000000000000000000000001d598832c7fac000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -12981,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec34000000000000000000000000f6acaf70c70390dcaab3c5653eac3ac564f0a084000000000000000000000000f6acaf70c70390dcaab3c5653eac3ac564f0a08400000000000000000000000000000000000000000000000000038d7ea4c6800000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -12982,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec340000000000000000000000009fb9625e34b3bf2e87e0c45c892fa8299c46422a0000000000000000000000009fb9625e34b3bf2e87e0c45c892fa8299c46422a00000000000000000000000000000000000000000000000003ed6b00276f800000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -12984,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec34000000000000000000000000333a9bcaa5b9e48d72f43032f99ed54aa572a60d000000000000000000000000333a9bcaa5b9e48d72f43032f99ed54aa572a60d00000000000000000000000000000000000000000000000002bc2042130e102600000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,0xeee240a23618757e9f72e48161344dffea48949a43e2717e25630a80d2eb5483,2021-12-08 09:13:08.000 UTC,0,true -12987,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec340000000000000000000000000ce1d028626c6a215a4e1619bbe695a564b674aa0000000000000000000000000ce1d028626c6a215a4e1619bbe695a564b674aa00000000000000000000000000000000000000000000000000038d7ea4c6800000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -12988,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec3400000000000000000000000008426ff787ecfecaa3754c2034f4c41c87c6ee5600000000000000000000000008426ff787ecfecaa3754c2034f4c41c87c6ee56000000000000000000000000000000000000000000000000001bc1d00fef278100000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -12989,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec340000000000000000000000001c1a54bb8d43d4a3c9f7b034ad673f737b8471c50000000000000000000000001c1a54bb8d43d4a3c9f7b034ad673f737b8471c5000000000000000000000000000000000000000000000000008c1d9439e443d800000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,0x9bb8abe860524e9d795e9a793d42ecad9883578433fdcec06f6aa404af765577,2022-06-01 14:38:31.000 UTC,0,true -12992,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0xa9f9e675000000000000000000000000dac17f958d2ee523a2206206994597c13d831ec700000000000000000000000094b008aa00579c1307b0ef2c499ad98a8ce58e5800000000000000000000000047c5402a052957c9f0f126d956b2bccfb2a33a8400000000000000000000000047c5402a052957c9f0f126d956b2bccfb2a33a840000000000000000000000000000000000000000000000000000000001dfcacd00000000000000000000000000000000000000000000000000000000000000c00000000000000000000000000000000000000000000000000000000000000000,,,1,true -12993,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec34000000000000000000000000025b2e51750f4dc6e3fdf0035eab833e50911509000000000000000000000000025b2e51750f4dc6e3fdf0035eab833e509115090000000000000000000000000000000000000000000000000070b3233a814e0400000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,0x4f4b95b0977a89402ea0d02cfbb4589fe6bb95b40e9858cb7b1302e68c7d47a9,2021-12-11 19:19:55.000 UTC,0,true -12994,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec340000000000000000000000003dde0fd04599c7c0e2a3b25ce6c0beb7804226e40000000000000000000000003dde0fd04599c7c0e2a3b25ce6c0beb7804226e400000000000000000000000000000000000000000000000006ec2af8301ba60300000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,0x074758eed77fa384beb98231576b01fef563828d2f5dd997fd1b0204e3c85fe3,2022-05-09 01:39:54.000 UTC,0,true -12995,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec34000000000000000000000000c41bcb170d402c0eb10b29c9f77deeb697d65295000000000000000000000000c41bcb170d402c0eb10b29c9f77deeb697d6529500000000000000000000000000000000000000000000000002c1ded1cbb88c1c00000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -12996,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec340000000000000000000000004bb5287127973ea561b6e2ce37eae7e624597a370000000000000000000000004bb5287127973ea561b6e2ce37eae7e624597a37000000000000000000000000000000000000000000000000006a94d74f43000000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -12999,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec340000000000000000000000008e3e3320bd3f8c48b334724a037688d9df2e76820000000000000000000000008e3e3320bd3f8c48b334724a037688d9df2e76820000000000000000000000000000000000000000000000000045278bf972730000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -13001,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec34000000000000000000000000e58ca5494079fb88dd5757af80960a912e753782000000000000000000000000e58ca5494079fb88dd5757af80960a912e753782000000000000000000000000000000000000000000000000007a823029eae10000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -13003,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0xa9f9e675000000000000000000000000514910771af9ca656af840dff83e8264ecf986ca000000000000000000000000350a791bfc2c21f9ed5d10980dad2e2638ffa7f6000000000000000000000000df8979cce6f1534df0a042543a187aaafbdcb671000000000000000000000000df8979cce6f1534df0a042543a187aaafbdcb671000000000000000000000000000000000000000000000000667449c3b49b933400000000000000000000000000000000000000000000000000000000000000c00000000000000000000000000000000000000000000000000000000000000000,,,1,true -13004,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec34000000000000000000000000820eac4125bace760d0ed89f801887ac0470d1ae000000000000000000000000820eac4125bace760d0ed89f801887ac0470d1ae000000000000000000000000000000000000000000000000004527d391e0160000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -13005,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec3400000000000000000000000033742965cc48d996b5884dfa574904f35613b2f100000000000000000000000033742965cc48d996b5884dfa574904f35613b2f10000000000000000000000000000000000000000000000000004caa21536dce900000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -13006,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec34000000000000000000000000a2ee68b520984c6144ef0ab128ab8e45afc21d8e000000000000000000000000a2ee68b520984c6144ef0ab128ab8e45afc21d8e00000000000000000000000000000000000000000000000000057be319977d2500000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -13009,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec34000000000000000000000000d6d8d40e682dd3539a7a4f49f908476cc28516b2000000000000000000000000d6d8d40e682dd3539a7a4f49f908476cc28516b2000000000000000000000000000000000000000000000000001cbbea393d3e8900000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -13011,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec34000000000000000000000000dde9eff243e499ad9ba862f30d7ce395cf5fb246000000000000000000000000dde9eff243e499ad9ba862f30d7ce395cf5fb2460000000000000000000000000000000000000000000000000000b5e620f4800000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -13012,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec3400000000000000000000000092a686623d801fb043d19dddc0e034dad0958f8c00000000000000000000000092a686623d801fb043d19dddc0e034dad0958f8c0000000000000000000000000000000000000000000000000421727f5c881a8000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -13014,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec34000000000000000000000000bc150be7d845838183728c8f578b8261044419b6000000000000000000000000bc150be7d845838183728c8f578b8261044419b60000000000000000000000000000000000000000000000000002cb8ed43e748000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -13016,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec340000000000000000000000006054c42b96ac2ddfadf3bad28263a6df9411cc190000000000000000000000006054c42b96ac2ddfadf3bad28263a6df9411cc19000000000000000000000000000000000000000000000000016168a1b60a190000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -13019,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec340000000000000000000000004e392ec084684dcb90fe6912af470ac8b687287a0000000000000000000000004e392ec084684dcb90fe6912af470ac8b687287a000000000000000000000000000000000000000000000000004f6b9f0d6f92b100000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -13020,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec34000000000000000000000000b7d40515946223afb8e1b241813c36593a609b5c000000000000000000000000b7d40515946223afb8e1b241813c36593a609b5c000000000000000000000000000000000000000000000000002d7e50a571875300000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -13022,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec3400000000000000000000000026ce053f2febc4c4c9aafcabfe0b9845e182229300000000000000000000000026ce053f2febc4c4c9aafcabfe0b9845e1822293000000000000000000000000000000000000000000000000002386f26fc1000000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -13023,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec34000000000000000000000000ea98b932441cd24f21cc7a633cdb6001208996b5000000000000000000000000ea98b932441cd24f21cc7a633cdb6001208996b5000000000000000000000000000000000000000000000000000009184e72a00000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -13024,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec340000000000000000000000008c50d3e6cc60a90ab04454efcff722fb4f03077d0000000000000000000000008c50d3e6cc60a90ab04454efcff722fb4f03077d000000000000000000000000000000000000000000000000000009184e72a00000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -13025,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec340000000000000000000000000bb33da2c8fca1a5d1f5d513a18fb66198759d220000000000000000000000000bb33da2c8fca1a5d1f5d513a18fb66198759d22000000000000000000000000000000000000000000000000000205d10c7cd42c00000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -13026,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec3400000000000000000000000065d6b31ec9413bf7918bda21ac7db401949fef4e00000000000000000000000065d6b31ec9413bf7918bda21ac7db401949fef4e000000000000000000000000000000000000000000000000000009184e72a00000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -13027,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec34000000000000000000000000e6fdf0c64c7f4536fc6776b80a895d770995d1ce000000000000000000000000e6fdf0c64c7f4536fc6776b80a895d770995d1ce000000000000000000000000000000000000000000000000000009184e72a00000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -13028,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec340000000000000000000000008916a89d83d9477d774da628e3e7c0b5170c05030000000000000000000000008916a89d83d9477d774da628e3e7c0b5170c0503000000000000000000000000000000000000000000000000000009184e72a00000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -13029,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec3400000000000000000000000023ef2693c7792e49ad2cdc5fe3fe910a17ff6c7d00000000000000000000000023ef2693c7792e49ad2cdc5fe3fe910a17ff6c7d000000000000000000000000000000000000000000000000000009184e72a00000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -13030,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec3400000000000000000000000073538c91eff3476c721439eed9c8b4fc239dab9d00000000000000000000000073538c91eff3476c721439eed9c8b4fc239dab9d0000000000000000000000000000000000000000000000000002733276cb110000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -13031,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec3400000000000000000000000081ba73b26a2d7b22407cd5933607571877d7eb4c00000000000000000000000081ba73b26a2d7b22407cd5933607571877d7eb4c0000000000000000000000000000000000000000000000000004660fd0333ad100000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -13033,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec34000000000000000000000000e00ee4f51fcca840afa8e68286127a2a189e8c3a000000000000000000000000e00ee4f51fcca840afa8e68286127a2a189e8c3a000000000000000000000000000000000000000000000000012dfb0cb5e8800000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -13034,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec34000000000000000000000000f0c6a569cf9d53dc2af4bab04a7c509afb45b515000000000000000000000000f0c6a569cf9d53dc2af4bab04a7c509afb45b515000000000000000000000000000000000000000000000000000446ae9c00cd3d00000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -13035,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec34000000000000000000000000c3539ed2536160488f3b3b312a137f76550b25b0000000000000000000000000c3539ed2536160488f3b3b312a137f76550b25b00000000000000000000000000000000000000000000000000005c78ee270664900000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -13036,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec34000000000000000000000000238edb437f8d98c48122964ec6d3ddcbdc3ec217000000000000000000000000238edb437f8d98c48122964ec6d3ddcbdc3ec217000000000000000000000000000000000000000000000000009b00c360c0750000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -13037,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec34000000000000000000000000d951a35a7b36971e0de44c938c247fa11d053934000000000000000000000000d951a35a7b36971e0de44c938c247fa11d05393400000000000000000000000000000000000000000000000000907a66ef7ccfd700000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -13038,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec340000000000000000000000000e2186f759e919896daec9d2e72d4ccd60141aba0000000000000000000000000e2186f759e919896daec9d2e72d4ccd60141aba0000000000000000000000000000000000000000000000000005f4b5f261f83a00000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -13039,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec34000000000000000000000000d5f1c2bf387894f4677e8a16b1d526614db4a08f000000000000000000000000d5f1c2bf387894f4677e8a16b1d526614db4a08f00000000000000000000000000000000000000000000000000d529ae9e86000000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -13041,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec34000000000000000000000000d5f1c2bf387894f4677e8a16b1d526614db4a08f000000000000000000000000d5f1c2bf387894f4677e8a16b1d526614db4a08f000000000000000000000000000000000000000000000000001e4e895b60c36c00000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -13044,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec340000000000000000000000006cabe296e0cd1e0a12105a8c063a51d54de65cdf0000000000000000000000006cabe296e0cd1e0a12105a8c063a51d54de65cdf000000000000000000000000000000000000000000000000007042553626f42800000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -13046,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec3400000000000000000000000004f47c2887a8f27aeadf4e15e418f311355510bf00000000000000000000000004f47c2887a8f27aeadf4e15e418f311355510bf000000000000000000000000000000000000000000000000005c4af283e97c4800000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -13047,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec340000000000000000000000001c5d969acf5234629fdd4543ef6c43ed557de9830000000000000000000000001c5d969acf5234629fdd4543ef6c43ed557de98300000000000000000000000000000000000000000000000000421499f8d2800000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -13049,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec340000000000000000000000003f91e9f141e252845cfb87dfc98a99dcdd85774f0000000000000000000000003f91e9f141e252845cfb87dfc98a99dcdd85774f0000000000000000000000000000000000000000000000000011c37937e0800000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -13050,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec34000000000000000000000000133e6693cc630f10cf35c82550b1a11fc450b102000000000000000000000000133e6693cc630f10cf35c82550b1a11fc450b102000000000000000000000000000000000000000000000000001c6bf52634000000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -13051,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec34000000000000000000000000c1db96f644be5f64fc090188046e213bb03c8828000000000000000000000000c1db96f644be5f64fc090188046e213bb03c88280000000000000000000000000000000000000000000000000011c37937e0800000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -13052,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec340000000000000000000000006192898cb6e6a6d3c37b0081803a3ede74cf49220000000000000000000000006192898cb6e6a6d3c37b0081803a3ede74cf49220000000000000000000000000000000000000000000000000011c37937e0800000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -13053,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec34000000000000000000000000e7bfe9b78d32469796deb029b2bea3d68773aec4000000000000000000000000e7bfe9b78d32469796deb029b2bea3d68773aec4000000000000000000000000000000000000000000000000058d15e17628000000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,0x7f9aaea2c628d508f3a1e63c13b44de19f9c50c1dce090925246f29a5cb58325,2021-11-30 10:45:40.000 UTC,0,true -13054,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec340000000000000000000000004344ffd6c8d3188f08671a2ea7eb257afb3137f90000000000000000000000004344ffd6c8d3188f08671a2ea7eb257afb3137f900000000000000000000000000000000000000000000000000036aeabb09bb1200000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -13055,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec34000000000000000000000000b63cd166b1108c7a4ed72d44c4676d46f088e079000000000000000000000000b63cd166b1108c7a4ed72d44c4676d46f088e079000000000000000000000000000000000000000000000000001f7b2e8cfc77db00000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -13056,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec3400000000000000000000000084433ec26d444159c8710858d4eddec0293874ec00000000000000000000000084433ec26d444159c8710858d4eddec0293874ec0000000000000000000000000000000000000000000000000003bbcdfc6248a600000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -13057,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec34000000000000000000000000a2d613d71d32237d9b6d1b979a3efcfd1519b931000000000000000000000000a2d613d71d32237d9b6d1b979a3efcfd1519b93100000000000000000000000000000000000000000000000000470de4df82000000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -13058,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec34000000000000000000000000646bf56e1d87b353611f456826977a8be2e04f6a000000000000000000000000646bf56e1d87b353611f456826977a8be2e04f6a00000000000000000000000000000000000000000000000000a797e04db537bb00000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -13059,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec340000000000000000000000008497daabaafcfb72389a2934e7400d4a8091981a0000000000000000000000008497daabaafcfb72389a2934e7400d4a8091981a0000000000000000000000000000000000000000000000000002602935d6a45b00000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -13060,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec340000000000000000000000001139db00d2815f99df958a7fb3a101d7c4bd39280000000000000000000000001139db00d2815f99df958a7fb3a101d7c4bd392800000000000000000000000000000000000000000000000000014fdc3bbb06e000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -13063,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec34000000000000000000000000de98f62c8773ed56c177cc5ecc44f152f040bf9b000000000000000000000000de98f62c8773ed56c177cc5ecc44f152f040bf9b000000000000000000000000000000000000000000000000001ed060be777fc400000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -13064,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec3400000000000000000000000093e0e4c16722a2330c41ed04c1a68490dc730f7500000000000000000000000093e0e4c16722a2330c41ed04c1a68490dc730f7500000000000000000000000000000000000000000000000001600811e33c588000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -13065,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec34000000000000000000000000f35f9e005d2dec0506bf41d618eeeca38c7b1143000000000000000000000000f35f9e005d2dec0506bf41d618eeeca38c7b11430000000000000000000000000000000000000000000000000041b9a6e858400000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -13068,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec340000000000000000000000005ee76180901e2b0edfb0d4b6cfa89b93969c7ad70000000000000000000000005ee76180901e2b0edfb0d4b6cfa89b93969c7ad7000000000000000000000000000000000000000000000000006a94d74f43000000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -13071,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec34000000000000000000000000899174e2b29fc08aced0d78c87a42b7b678881b9000000000000000000000000899174e2b29fc08aced0d78c87a42b7b678881b9000000000000000000000000000000000000000000000000000ce6293046a69900000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -13073,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec34000000000000000000000000ae4b590b3d79658cd8b304b006011036c18e2f7c000000000000000000000000ae4b590b3d79658cd8b304b006011036c18e2f7c0000000000000000000000000000000000000000000000000071cf06ec4da6be00000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,0x48bec2f0a3c1ba8a94f1d75062ca188db28e6f2deceb3fb7a7325b489cb8ddeb,2022-08-31 20:56:33.000 UTC,0,true -13075,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec34000000000000000000000000c1e95e8fe861230ed8d81235e58e056bde90d18d000000000000000000000000c1e95e8fe861230ed8d81235e58e056bde90d18d000000000000000000000000000000000000000000000000006a94d74f43000000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -13076,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec34000000000000000000000000ad268606cec97ef0fa77f74ddbebdcebbbd8d7c4000000000000000000000000ad268606cec97ef0fa77f74ddbebdcebbbd8d7c4000000000000000000000000000000000000000000000000000009184e72a00000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -13078,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec34000000000000000000000000aa48407b02024584665e6e1309bf7bc6d71be3e2000000000000000000000000aa48407b02024584665e6e1309bf7bc6d71be3e2000000000000000000000000000000000000000000000000000aa87bee53800000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -13079,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec340000000000000000000000002a50f0dec48d2554d7754c62c2c961198264221b0000000000000000000000002a50f0dec48d2554d7754c62c2c961198264221b00000000000000000000000000000000000000000000000000083de1c644834000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -13080,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec34000000000000000000000000808a5e3fbee7d2c068140270e4ecb30795b3e282000000000000000000000000808a5e3fbee7d2c068140270e4ecb30795b3e2820000000000000000000000000000000000000000000000000000e0fde331884800000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -13082,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec34000000000000000000000000a318ac48a52e44eea6192e3d85dfb832dc3bb9f0000000000000000000000000a318ac48a52e44eea6192e3d85dfb832dc3bb9f00000000000000000000000000000000000000000000000000043bb94c909a8d800000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -13083,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec3400000000000000000000000045067be6800ec34b13f2d595d6b1f4efbacd717600000000000000000000000045067be6800ec34b13f2d595d6b1f4efbacd717600000000000000000000000000000000000000000000000000aa72686399513d00000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -13085,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec340000000000000000000000002451b6106d6c1d6ec53a09bab352c9574c82f3210000000000000000000000002451b6106d6c1d6ec53a09bab352c9574c82f321000000000000000000000000000000000000000000000000009a00ea3ae76c7700000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -13086,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec340000000000000000000000005ddedd14f66904678b9354af59c6d32639bc45b80000000000000000000000005ddedd14f66904678b9354af59c6d32639bc45b800000000000000000000000000000000000000000000000001f161421c8e000000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -13089,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec34000000000000000000000000dd533307557ac9e1b9ee7fce0256ae909d6aedc8000000000000000000000000dd533307557ac9e1b9ee7fce0256ae909d6aedc800000000000000000000000000000000000000000000000000abe94d2914859f00000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -13091,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec34000000000000000000000000a4e3642e611553644e6fe0c47f6ed1d8eed66930000000000000000000000000a4e3642e611553644e6fe0c47f6ed1d8eed6693000000000000000000000000000000000000000000000000000254db1c224400000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -13093,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec340000000000000000000000002c522fe59a742562da44277d50163488b612458f0000000000000000000000002c522fe59a742562da44277d50163488b612458f00000000000000000000000000000000000000000000000000005af3107a400000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -13094,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec34000000000000000000000000abc0ce4652c76a36a6d79a21a43ab89610d3276f000000000000000000000000abc0ce4652c76a36a6d79a21a43ab89610d3276f00000000000000000000000000000000000000000000000000ab634420f5bb2500000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -13095,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec340000000000000000000000007564a1dff93744ba3f1bfb954fa17d9c81d4b3f30000000000000000000000007564a1dff93744ba3f1bfb954fa17d9c81d4b3f3000000000000000000000000000000000000000000000000006423dea00df34500000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,0xb25d1b997cf3cd6e398bce504ef354e9870e3765aa54df1d9de1f2a42cafd7f9,2022-03-20 11:48:25.000 UTC,0,true -13096,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec340000000000000000000000002c522fe59a742562da44277d50163488b612458f0000000000000000000000002c522fe59a742562da44277d50163488b612458f00000000000000000000000000000000000000000000000000005af3107a400000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -13097,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec340000000000000000000000002c522fe59a742562da44277d50163488b612458f0000000000000000000000002c522fe59a742562da44277d50163488b612458f00000000000000000000000000000000000000000000000000005af3107a400000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -13098,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec34000000000000000000000000764ef8aba8e67af506fa65bad1342bf34571ec3e000000000000000000000000764ef8aba8e67af506fa65bad1342bf34571ec3e0000000000000000000000000000000000000000000000000002df48f6d5b62f00000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -13101,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec34000000000000000000000000779e42b6eb275e5f396bb4f47f5dec036281e937000000000000000000000000779e42b6eb275e5f396bb4f47f5dec036281e937000000000000000000000000000000000000000000000000001c6bf52634000000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -13105,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec34000000000000000000000000c7a19118187f51f418d5112e72181ae137fa9997000000000000000000000000c7a19118187f51f418d5112e72181ae137fa9997000000000000000000000000000000000000000000000000011493432891830800000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -13109,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec3400000000000000000000000067e77561035265311e6895063926b2f2cec127a200000000000000000000000067e77561035265311e6895063926b2f2cec127a2000000000000000000000000000000000000000000000000042809aa7af3660000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -13116,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec34000000000000000000000000d38bebf9b178f9c52676ff5f8a44eeecf5f9f1ba000000000000000000000000d38bebf9b178f9c52676ff5f8a44eeecf5f9f1ba0000000000000000000000000000000000000000000000000046cce25e7ff95a00000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -13117,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec34000000000000000000000000495e827e540ca60c93bbac919b4627554211f33f000000000000000000000000495e827e540ca60c93bbac919b4627554211f33f00000000000000000000000000000000000000000000000000d529ae9e86000000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -13118,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec34000000000000000000000000a20ae6f0e88e6cb7c260d2513c0e337a08f6c52c000000000000000000000000a20ae6f0e88e6cb7c260d2513c0e337a08f6c52c000000000000000000000000000000000000000000000000004486a2393e9d4400000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -13119,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec34000000000000000000000000bffb5c7f47d801ed932539f02f99ffdb9f64ca66000000000000000000000000bffb5c7f47d801ed932539f02f99ffdb9f64ca66000000000000000000000000000000000000000000000000001fc27d2d23028000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -13120,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec34000000000000000000000000fbe6790b2221c6bb41af88f398254b9662c01a38000000000000000000000000fbe6790b2221c6bb41af88f398254b9662c01a380000000000000000000000000000000000000000000000000069239bf33e4e2d00000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -13121,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec34000000000000000000000000df6056a4673eb21fd6c957d84eb390b2a3fc9a6a000000000000000000000000df6056a4673eb21fd6c957d84eb390b2a3fc9a6a000000000000000000000000000000000000000000000000002cc8fdaba2cd0b00000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -13123,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec34000000000000000000000000d72708e95577f80056fd6a44ec30d644b5a86486000000000000000000000000d72708e95577f80056fd6a44ec30d644b5a86486000000000000000000000000000000000000000000000000112919ff6fb19bb800000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,0xa1a5adea3018cdf2198f376d1df8bfcfe84efe35d94e3f6c1d550b2e2cc7a62a,2021-12-12 20:15:36.000 UTC,0,true -13124,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec340000000000000000000000009841d9e166ed96aed9597f879835c6cc15ab46820000000000000000000000009841d9e166ed96aed9597f879835c6cc15ab468200000000000000000000000000000000000000000000000000087502535fa9b800000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -13125,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec340000000000000000000000007da37fd05f8a38886fd3d5a2f60474e4d179783e0000000000000000000000007da37fd05f8a38886fd3d5a2f60474e4d179783e00000000000000000000000000000000000000000000000000d96b3c50869d1f00000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -13132,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec34000000000000000000000000350a4b5ac6216902e095ef47f3bd5fdc9d387e23000000000000000000000000350a4b5ac6216902e095ef47f3bd5fdc9d387e23000000000000000000000000000000000000000000000000005bea2e85d978aa00000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -13133,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec34000000000000000000000000d183e645c5f1d36996d03ff730d45cf4bb57ea34000000000000000000000000d183e645c5f1d36996d03ff730d45cf4bb57ea3400000000000000000000000000000000000000000000000000038d7ea4c6800000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -13135,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec340000000000000000000000002e5745f3136e1023b7db402f2f20d59ece802f4a0000000000000000000000002e5745f3136e1023b7db402f2f20d59ece802f4a000000000000000000000000000000000000000000000000008cb11a91ec792800000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -13139,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec34000000000000000000000000af490b4a10b69d59bad2c95e9bd82223e2fb3386000000000000000000000000af490b4a10b69d59bad2c95e9bd82223e2fb3386000000000000000000000000000000000000000000000000024943f334bf45eb00000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -13141,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec34000000000000000000000000ef95f81a30b69d18fbc6e44fb33aa37135d0d1d1000000000000000000000000ef95f81a30b69d18fbc6e44fb33aa37135d0d1d1000000000000000000000000000000000000000000000000001739646eabace300000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -13143,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec34000000000000000000000000d17fc86bc9d50872df4d2b10d8855e1965a6baca000000000000000000000000d17fc86bc9d50872df4d2b10d8855e1965a6baca000000000000000000000000000000000000000000000000005c5edcbc29000000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -13150,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec340000000000000000000000001455cf52f007f7e474d3cb7525f4da0ef5313dde0000000000000000000000001455cf52f007f7e474d3cb7525f4da0ef5313dde00000000000000000000000000000000000000000000000000885c14487650c000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -13151,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec3400000000000000000000000052a5f7004723e4a6481ef9884ca1120b9c11fcc300000000000000000000000052a5f7004723e4a6481ef9884ca1120b9c11fcc30000000000000000000000000000000000000000000000000166a19531131f6d00000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -13152,0x10e6593cdda8c58a1d0f14c5164b376352a55f2f,0x467194771dae2967aef3ecbedd3bf9a310c76c65,0xa9f9e6750000000000000000000000006b175474e89094c44da98b954eedeac495271d0f000000000000000000000000da10009cbd5d07dd0cecc66161fc93d7c9000da100000000000000000000000013f5e3d06576a8aa0b9f72f1b6bf772f1addc80d00000000000000000000000013f5e3d06576a8aa0b9f72f1b6bf772f1addc80d000000000000000000000000000000000000000000000000a9cdbd11830db89b00000000000000000000000000000000000000000000000000000000000000c00000000000000000000000000000000000000000000000000000000000000000,,,1,true -13153,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec3400000000000000000000000025366b53f3976bd6f214ece12c2e8b2ad9e392fd00000000000000000000000025366b53f3976bd6f214ece12c2e8b2ad9e392fd0000000000000000000000000000000000000000000000000036eec92749427e00000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -13156,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec3400000000000000000000000013f5e3d06576a8aa0b9f72f1b6bf772f1addc80d00000000000000000000000013f5e3d06576a8aa0b9f72f1b6bf772f1addc80d000000000000000000000000000000000000000000000000000b2e8714f651a800000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -13158,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec340000000000000000000000003ae5edbdd1342ce6acaa48342792315d52e7b0670000000000000000000000003ae5edbdd1342ce6acaa48342792315d52e7b06700000000000000000000000000000000000000000000000003850aba094ccdcd00000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,0x6a5b8005e342a6a2bca835dbf3808cea6159f0696381359fa3b322ca5c21c7c9,2022-06-28 22:22:51.000 UTC,0,true -13160,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec3400000000000000000000000010256d931dd2bf74826cfd90b665c836381086be00000000000000000000000010256d931dd2bf74826cfd90b665c836381086be000000000000000000000000000000000000000000000000006138b56748b18b00000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -13161,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec34000000000000000000000000429a748be0acfcf0ddb7d1e7ec4917a4f04f6bbd000000000000000000000000429a748be0acfcf0ddb7d1e7ec4917a4f04f6bbd0000000000000000000000000000000000000000000000000070858df6901aa900000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -13163,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec3400000000000000000000000016c4e68b5ea69af57085b5152065100ba24ad71f00000000000000000000000016c4e68b5ea69af57085b5152065100ba24ad71f0000000000000000000000000000000000000000000000000074ab9ade6b130300000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,0x54af3d012d8eb66f5fecb55bc7a9386fe2ff26edce8fcb0e45f9fe66e261b3db,2022-07-20 09:10:13.000 UTC,0,true -13165,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec34000000000000000000000000d815e9109f8d9a9f5a21f47351df83134571eb56000000000000000000000000d815e9109f8d9a9f5a21f47351df83134571eb560000000000000000000000000000000000000000000000000061a761a2d89aaa00000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -13166,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec340000000000000000000000006fdf6b570a15f4a79f44501a6b56bd2b47ff46100000000000000000000000006fdf6b570a15f4a79f44501a6b56bd2b47ff461000000000000000000000000000000000000000000000000000465d6d4a1c83e300000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -13167,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec3400000000000000000000000055cc224cc1e686304d29ec32fd963c68ea83b17c00000000000000000000000055cc224cc1e686304d29ec32fd963c68ea83b17c00000000000000000000000000000000000000000000000003d2cec7d6b8375300000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -13168,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec340000000000000000000000002ddff29c54046bbde55702342a319be7fdb1c5200000000000000000000000002ddff29c54046bbde55702342a319be7fdb1c5200000000000000000000000000000000000000000000000000038b1b12319870000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -13171,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec34000000000000000000000000aed5ef0aa3d1461946257d9198475a8aced910d0000000000000000000000000aed5ef0aa3d1461946257d9198475a8aced910d000000000000000000000000000000000000000000000000001393e20f3158b9a00000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -13176,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec340000000000000000000000008bbd6aec68aef08b2d4cdd93b2cffa48b6e103520000000000000000000000008bbd6aec68aef08b2d4cdd93b2cffa48b6e1035200000000000000000000000000000000000000000000000000470de4df82000000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -13181,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec3400000000000000000000000035fbea3a80400948e97660cdcc9f82a3f79015a900000000000000000000000035fbea3a80400948e97660cdcc9f82a3f79015a9000000000000000000000000000000000000000000000000001fdb5586bf73df00000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -13183,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec340000000000000000000000005d4d3fae4d0282fd8a558b5f42ba700974cbfd1a0000000000000000000000005d4d3fae4d0282fd8a558b5f42ba700974cbfd1a0000000000000000000000000000000000000000000000000429d069189e000000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -13190,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec34000000000000000000000000e696871ba5afd8d467755bf698f102cfd08fe777000000000000000000000000e696871ba5afd8d467755bf698f102cfd08fe7770000000000000000000000000000000000000000000000000011d0069b6dd5d300000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -13194,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec340000000000000000000000006766cf760835b6617c77ce6c6caffc5f8af0b1860000000000000000000000006766cf760835b6617c77ce6c6caffc5f8af0b186000000000000000000000000000000000000000000000000002c3fce602f24b800000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -13195,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec34000000000000000000000000a40071a4ae125f72522c266b3bf0c300d9ed7aad000000000000000000000000a40071a4ae125f72522c266b3bf0c300d9ed7aad00000000000000000000000000000000000000000000000000417845cfd029a500000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -13198,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec34000000000000000000000000d2150ec582cb139ef273dc4b62c6a450d0fbd2c6000000000000000000000000d2150ec582cb139ef273dc4b62c6a450d0fbd2c6000000000000000000000000000000000000000000000000006843c0a9e2a2ac00000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -13200,0xcd9d4988c0ae61887b075ba77f08cbfad2b65068,0x3f87ff1de58128ef8fcb4c807efd776e1ac72e51,0xf4f7b41a000000000000000000000000facb1846d71b0f8d6e0d142c06380e60d8892d4b000000000000000000000000000000000000000000000024fa1eb1f2433d2ebf,0x2344c02d2893e59b4c8ed76e86c48adbba6412dcb699c08766e776dfa254be4f,2022-03-06 05:00:30.000 UTC,0,true -13201,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec34000000000000000000000000a5a80e7225c7bf9d3e7002efd6a16398e94d52ed000000000000000000000000a5a80e7225c7bf9d3e7002efd6a16398e94d52ed0000000000000000000000000000000000000000000000000dd279ca89c3169e00000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -13204,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec340000000000000000000000004176a257f28ea2ca86c92285b05c9fdde20b59c20000000000000000000000004176a257f28ea2ca86c92285b05c9fdde20b59c20000000000000000000000000000000000000000000000000001526a44e5063900000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -13206,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec34000000000000000000000000a4354a30064b53382f6653346bd86240d7251555000000000000000000000000a4354a30064b53382f6653346bd86240d72515550000000000000000000000000000000000000000000000000000f9c1fcd0a58300000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -13207,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec34000000000000000000000000cf84a80e155c35d0bd092b88c4453091447602c6000000000000000000000000cf84a80e155c35d0bd092b88c4453091447602c6000000000000000000000000000000000000000000000000000250d5e5aac18a00000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -13208,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec3400000000000000000000000001045e946c5469be8763e4127e27dcd1d4778ec600000000000000000000000001045e946c5469be8763e4127e27dcd1d4778ec6000000000000000000000000000000000000000000000000003165699e6ffe9b00000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -13209,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec340000000000000000000000000295dbd87c78019fa347ee6a65f2b98b2443550f0000000000000000000000000295dbd87c78019fa347ee6a65f2b98b2443550f0000000000000000000000000000000000000000000000000002b72fb9447f9b00000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -13210,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec340000000000000000000000001abe68d9bfc860852a7bb3a5bb67bcf2a248332c0000000000000000000000001abe68d9bfc860852a7bb3a5bb67bcf2a248332c00000000000000000000000000000000000000000000000000470de4df82000000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -13212,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec340000000000000000000000006b7c8205c3975497aa9dd464277b94fe33ef26860000000000000000000000006b7c8205c3975497aa9dd464277b94fe33ef26860000000000000000000000000000000000000000000000000022366f192fe00000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -13215,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec340000000000000000000000006cc150449d10afbc5d2f4b9041afcc8fbebeadf00000000000000000000000006cc150449d10afbc5d2f4b9041afcc8fbebeadf00000000000000000000000000000000000000000000000002a7094858647f89600000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,0x4dfd6c05d4387489817c724bf0d80c74374ed173cd8d8e39476c45c9ce84d527,2021-12-11 04:01:30.000 UTC,0,true -13217,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec34000000000000000000000000f184492b79f83224d42c29572fb4655d945861e8000000000000000000000000f184492b79f83224d42c29572fb4655d945861e800000000000000000000000000000000000000000000000000d5924624ac300000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -13219,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec340000000000000000000000004694725ca38a50fa08be9852edbaa9c7663f254e0000000000000000000000004694725ca38a50fa08be9852edbaa9c7663f254e000000000000000000000000000000000000000000000000001e5bbfda61238000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -13220,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec340000000000000000000000008be55503a932709606c4e8ee242533a6b50894f50000000000000000000000008be55503a932709606c4e8ee242533a6b50894f50000000000000000000000000000000000000000000000000190f7bcee8179a200000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -13221,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec340000000000000000000000003ee56188250e9ca6c359c7f636077c699dfc6caa0000000000000000000000003ee56188250e9ca6c359c7f636077c699dfc6caa000000000000000000000000000000000000000000000000000002ba7e218aa000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -13222,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec34000000000000000000000000940214134c5e8d81dbd5e9015908c697dab5e0dd000000000000000000000000940214134c5e8d81dbd5e9015908c697dab5e0dd00000000000000000000000000000000000000000000000002ea11e32ad5000000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -13224,0xcd9d4988c0ae61887b075ba77f08cbfad2b65068,0x3f87ff1de58128ef8fcb4c807efd776e1ac72e51,0xf4f7b41a000000000000000000000000be2849c3a4380af6735bfde32c940554feaa73d40000000000000000000000000000000000000000000000010f4c26725125c637,0xef529bf567756199e8b079dfa523458af5a6e82212fdb13f36c551ffa6bd0168,2022-03-05 13:04:48.000 UTC,0,true -13225,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec34000000000000000000000000940214134c5e8d81dbd5e9015908c697dab5e0dd000000000000000000000000940214134c5e8d81dbd5e9015908c697dab5e0dd000000000000000000000000000000000000000000000000016345785d8a000000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -13226,0x10e6593cdda8c58a1d0f14c5164b376352a55f2f,0x467194771dae2967aef3ecbedd3bf9a310c76c65,0xa9f9e6750000000000000000000000006b175474e89094c44da98b954eedeac495271d0f000000000000000000000000da10009cbd5d07dd0cecc66161fc93d7c9000da1000000000000000000000000a0ccc8e62a6b4b689a9031d27ab73157ce851aa8000000000000000000000000a0ccc8e62a6b4b689a9031d27ab73157ce851aa80000000000000000000000000000000000000000000000001bc16d674ec8000000000000000000000000000000000000000000000000000000000000000000c00000000000000000000000000000000000000000000000000000000000000000,,,1,true -13231,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec34000000000000000000000000fa2cc694b53d6e35d2ac2306ac9a0eb1af546ae0000000000000000000000000fa2cc694b53d6e35d2ac2306ac9a0eb1af546ae00000000000000000000000000000000000000000000000000023e1e5803b400000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -13232,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec34000000000000000000000000db743a2f9f47c615bfae18ddc5a51c59a4a70eef000000000000000000000000db743a2f9f47c615bfae18ddc5a51c59a4a70eef00000000000000000000000000000000000000000000000000038d7ea4c6800000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -13233,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec3400000000000000000000000095078871e27f88b19ee4bfbeb2de5a3e1a0bb19900000000000000000000000095078871e27f88b19ee4bfbeb2de5a3e1a0bb19900000000000000000000000000000000000000000000000000038d7ea4c6800000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -13234,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec34000000000000000000000000e71bf9d0e63fd3b82c96ed8bfdce4efff53bfdb7000000000000000000000000e71bf9d0e63fd3b82c96ed8bfdce4efff53bfdb7000000000000000000000000000000000000000000000000001cc76f42fbe4c000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -13235,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec340000000000000000000000004900c75345d4e38a47a4b985bdc39f8b3ce919df0000000000000000000000004900c75345d4e38a47a4b985bdc39f8b3ce919df0000000000000000000000000000000000000000000000000000b5e620f4800000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -13236,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec340000000000000000000000004b2d18056015fa4d08b8519e201ce741f804ea090000000000000000000000004b2d18056015fa4d08b8519e201ce741f804ea09000000000000000000000000000000000000000000000000008221f07e78fbeb00000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,0x7e3f0c00fc0e50f9c6d9ffe7c9ee40644fae66b2fd54673221ffaa25f49c9eb6,2022-03-15 05:19:45.000 UTC,0,true -13237,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec34000000000000000000000000891d9211ee72c5c7e188ab5ac9017c3904c54eef000000000000000000000000891d9211ee72c5c7e188ab5ac9017c3904c54eef0000000000000000000000000000000000000000000000000016b2684bf7367000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -13238,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec34000000000000000000000000b0ab05f8beba695ea4b724c3a1dc3a290f81a85d000000000000000000000000b0ab05f8beba695ea4b724c3a1dc3a290f81a85d0000000000000000000000000000000000000000000000000c7d713b49da000000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -13241,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0xa9f9e6750000000000000000000000002260fac5e5542a773aa44fbcfedf7c193bc2c59900000000000000000000000068f180fcce6836688e9084f035309e29bf0a2095000000000000000000000000c3e5789beec7f018cb983db2a673d603c7168f54000000000000000000000000c3e5789beec7f018cb983db2a673d603c7168f54000000000000000000000000000000000000000000000000000000000009909c00000000000000000000000000000000000000000000000000000000000000c00000000000000000000000000000000000000000000000000000000000000000,0x28cf12971ccaa5515d377eb6a34e08a10038ccab3f60fd1b953cd77a6d9fefb2,2022-02-17 09:06:35.000 UTC,0,true -13245,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec340000000000000000000000007745748f6361a2c3fd37022545e0a484e54c73600000000000000000000000007745748f6361a2c3fd37022545e0a484e54c7360000000000000000000000000000000000000000000000000007c58508723800000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,0x01c00ccd10b24b0ddd804d1fe76962122e4a88cac10b0be7f7021e36d5e2904c,2022-02-05 08:00:59.000 UTC,0,true -13246,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec340000000000000000000000001032b93af6dd3d287193bdac7e3e4c70e24c84be0000000000000000000000001032b93af6dd3d287193bdac7e3e4c70e24c84be00000000000000000000000000000000000000000000000000013a5c11ea094100000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -13250,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec34000000000000000000000000c179bea549dcac9a6313b2379a4290a8ee281d09000000000000000000000000c179bea549dcac9a6313b2379a4290a8ee281d09000000000000000000000000000000000000000000000000009fdf42f6e4800000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -13251,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec34000000000000000000000000fe90f17cc6428a5d2d940235512472c94c5a5a9d000000000000000000000000fe90f17cc6428a5d2d940235512472c94c5a5a9d0000000000000000000000000000000000000000000000000000a43efab541bc00000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -13252,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec340000000000000000000000002d1d093aae2604b2ce57acd3b7355ffac9f081e00000000000000000000000002d1d093aae2604b2ce57acd3b7355ffac9f081e0000000000000000000000000000000000000000000000000000008c9b1046f2000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -13255,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec3400000000000000000000000040d8a1d1603d47ff2f3a4b18ff4bbe4b0ad2e7eb00000000000000000000000040d8a1d1603d47ff2f3a4b18ff4bbe4b0ad2e7eb0000000000000000000000000000000000000000000000000000bdf55592d9e500000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -13256,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec3400000000000000000000000078f333e5cd98d0eec8257d442151429f013aaa0700000000000000000000000078f333e5cd98d0eec8257d442151429f013aaa070000000000000000000000000000000000000000000000000001d4910d26b84600000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -13257,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec3400000000000000000000000066da918f292d553ed698271e49641d6b1db75b9300000000000000000000000066da918f292d553ed698271e49641d6b1db75b9300000000000000000000000000000000000000000000000000012285861e7c9c00000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -13259,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec34000000000000000000000000a0e61e950e8415fa5f70d8ab2c26654cda80bd30000000000000000000000000a0e61e950e8415fa5f70d8ab2c26654cda80bd30000000000000000000000000000000000000000000000000000147d07f451c0100000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -13260,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec34000000000000000000000000b7c2831a3a8d424e8b66f3fbc49d5a68f1a5d724000000000000000000000000b7c2831a3a8d424e8b66f3fbc49d5a68f1a5d724000000000000000000000000000000000000000000000000000035d7bf41739800000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -13267,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec34000000000000000000000000659ba0b652fb66bb6c1261f5d0aeaeb30fcfec35000000000000000000000000659ba0b652fb66bb6c1261f5d0aeaeb30fcfec35000000000000000000000000000000000000000000000000016345785d8a000000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -13268,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec340000000000000000000000004103d6215ed19eb868a16eaff7baabd82dbb9ace0000000000000000000000004103d6215ed19eb868a16eaff7baabd82dbb9ace00000000000000000000000000000000000000000000000006ecb7c503d4cb0000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -13269,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec340000000000000000000000005d1d2db319ac20113dc1e816c62b38fdb57b72f80000000000000000000000005d1d2db319ac20113dc1e816c62b38fdb57b72f800000000000000000000000000000000000000000000000000018ea8d93cc8c000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -13271,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec34000000000000000000000000e595b6bb4e3bf27ebea22c3c52133126556ad17a000000000000000000000000e595b6bb4e3bf27ebea22c3c52133126556ad17a00000000000000000000000000000000000000000000000000d05f1709d5a57000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -13272,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec34000000000000000000000000684fb5d8b3611469e72bdf1282860b252e51c1f7000000000000000000000000684fb5d8b3611469e72bdf1282860b252e51c1f700000000000000000000000000000000000000000000000000058453f03244dd00000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -13273,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec340000000000000000000000000d0dd373463e787112850e00af51125ec418b4af0000000000000000000000000d0dd373463e787112850e00af51125ec418b4af000000000000000000000000000000000000000000000000000502d630bd9fe800000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -13275,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec340000000000000000000000003a7de19aa01cec13a7b3b930d068c03f6ee83ac90000000000000000000000003a7de19aa01cec13a7b3b930d068c03f6ee83ac900000000000000000000000000000000000000000000000000003da0af5fc77600000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -13277,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec340000000000000000000000005faa22b10b055441fdc0fe929d0b3de316a15c1e0000000000000000000000005faa22b10b055441fdc0fe929d0b3de316a15c1e000000000000000000000000000000000000000000000000000000a0fcb6cec800000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -13278,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec34000000000000000000000000605e552947868d1ffa35188308153da83978d4c9000000000000000000000000605e552947868d1ffa35188308153da83978d4c900000000000000000000000000000000000000000000000000019b396be7c25400000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -13279,0x10e6593cdda8c58a1d0f14c5164b376352a55f2f,0x467194771dae2967aef3ecbedd3bf9a310c76c65,0xa9f9e6750000000000000000000000006b175474e89094c44da98b954eedeac495271d0f000000000000000000000000da10009cbd5d07dd0cecc66161fc93d7c9000da100000000000000000000000088eeb79b0cce7000142bbb474562663b4ab623db00000000000000000000000088eeb79b0cce7000142bbb474562663b4ab623db0000000000000000000000000000000000000000000000003782dace9d9007af00000000000000000000000000000000000000000000000000000000000000c00000000000000000000000000000000000000000000000000000000000000000,0xf0735a6bd45ce5faad47589ba49edf81989bca306a7a803775c08880a99ddf30,2022-03-12 11:19:28.000 UTC,0,true -13280,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec34000000000000000000000000efbd2c4355ca73a236062d2650e503ba0f443d5f000000000000000000000000efbd2c4355ca73a236062d2650e503ba0f443d5f000000000000000000000000000000000000000000000000006f01b697f0c1c800000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -13281,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec34000000000000000000000000a71d1e79402ef838c626b4ae2d050c356448aa9d000000000000000000000000a71d1e79402ef838c626b4ae2d050c356448aa9d000000000000000000000000000000000000000000000000003c150a981ee5e300000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -13283,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec34000000000000000000000000b8961caf32692fe14b4b2d0fb89aa7675910ccd4000000000000000000000000b8961caf32692fe14b4b2d0fb89aa7675910ccd4000000000000000000000000000000000000000000000000005e0c51f2c7f9cd00000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -13285,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec34000000000000000000000000bf09dae602adae0c48de9ef743060696132f6a92000000000000000000000000bf09dae602adae0c48de9ef743060696132f6a92000000000000000000000000000000000000000000000000015181ff25a9800000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -13290,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec340000000000000000000000006bb550d3cfdb13d5feec42ed3d20e0b46e1994400000000000000000000000006bb550d3cfdb13d5feec42ed3d20e0b46e199440000000000000000000000000000000000000000000000000006a94d74f43000000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,0x16921de3849672735dcd47b62934718baa593eddc7eb3b421e998fcca7cb8148,2021-12-22 17:00:50.000 UTC,0,true -13291,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec340000000000000000000000006bb550d3cfdb13d5feec42ed3d20e0b46e1994400000000000000000000000006bb550d3cfdb13d5feec42ed3d20e0b46e199440000000000000000000000000000000000000000000000000013fbe85edc9000000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,0x712327294533d025b3447e6528aee85388965abf5fc4c5957245599d06ddbf19,2021-12-22 16:57:35.000 UTC,0,true -13292,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec3400000000000000000000000007a64826e5798109d75b519010bcc833ee80d99d00000000000000000000000007a64826e5798109d75b519010bcc833ee80d99d0000000000000000000000000000000000000000000000000001a7a3204aee0000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -13295,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec3400000000000000000000000088ec95ad2fd42866af4e2e5cc14a80f5ba2d83c200000000000000000000000088ec95ad2fd42866af4e2e5cc14a80f5ba2d83c2000000000000000000000000000000000000000000000000015492d1e7d5ed4000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -13298,0xcd9d4988c0ae61887b075ba77f08cbfad2b65068,0x3f87ff1de58128ef8fcb4c807efd776e1ac72e51,0xf4f7b41a000000000000000000000000f9ca61b2c3938d3c5ec8fa669622240a7a0cb3160000000000000000000000000000000000000000000000070c1cc73b00c80000,0xc38cc1108ec566b0b0c331c890b3d0fae24b384ff76a38f2df2c71a48d8527f1,2021-11-29 01:01:56.000 UTC,0,true -13301,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec340000000000000000000000007fc961737ce37fcb682935ccff859abdf009505c0000000000000000000000007fc961737ce37fcb682935ccff859abdf009505c00000000000000000000000000000000000000000000000000014f6bb3ff059700000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -13303,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0xa9f9e675000000000000000000000000dac17f958d2ee523a2206206994597c13d831ec700000000000000000000000094b008aa00579c1307b0ef2c499ad98a8ce58e58000000000000000000000000b35a8ef31e9f8c2002f5925c6e978e7570bf2d92000000000000000000000000b35a8ef31e9f8c2002f5925c6e978e7570bf2d9200000000000000000000000000000000000000000000000000000000076a3c9100000000000000000000000000000000000000000000000000000000000000c00000000000000000000000000000000000000000000000000000000000000000,,,1,true -13304,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec34000000000000000000000000de1d2cf646bfb8f3148364b9419cefc0f376226a000000000000000000000000de1d2cf646bfb8f3148364b9419cefc0f376226a0000000000000000000000000000000000000000000000000001afd133fdb00000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -13305,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec34000000000000000000000000c5b4c2a4d2d0706b61103769faaaf530d57de124000000000000000000000000c5b4c2a4d2d0706b61103769faaaf530d57de12400000000000000000000000000000000000000000000000000038d7ea4c6800000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -13307,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec340000000000000000000000000f844c1229095b11c191adf0c545f63a320576d90000000000000000000000000f844c1229095b11c191adf0c545f63a320576d9000000000000000000000000000000000000000000000000000aa87bee53800000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -13308,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec34000000000000000000000000de54074b547f325b9ea169273ade267192ad88fb000000000000000000000000de54074b547f325b9ea169273ade267192ad88fb00000000000000000000000000000000000000000000000000038d7ea4c6800000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -13311,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec34000000000000000000000000a8515527652ff795574cb9dc3f506ba336d261d2000000000000000000000000a8515527652ff795574cb9dc3f506ba336d261d200000000000000000000000000000000000000000000000000abb1a0c9385b6f00000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -13312,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec34000000000000000000000000982a1fde980e291e921fad931f2ae73d33d246ae000000000000000000000000982a1fde980e291e921fad931f2ae73d33d246ae00000000000000000000000000000000000000000000000000e7a3620b7690ec00000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,0x7da93384f145c60be24459761d54b6cf4769b00e88118685ad56f164b45012a6,2022-05-06 09:44:24.000 UTC,0,true -13313,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec34000000000000000000000000e8b5705547cdd26b9095f04bc431e1e8893e068c000000000000000000000000e8b5705547cdd26b9095f04bc431e1e8893e068c00000000000000000000000000000000000000000000000000abaa0dc6acfacc00000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -13314,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec34000000000000000000000000e585b5499586d7dd17f410367a8d17e301dee7ee000000000000000000000000e585b5499586d7dd17f410367a8d17e301dee7ee00000000000000000000000000000000000000000000000000ab3c7440e1b6d900000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -13315,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec340000000000000000000000003c07dfc765102bf07b6ade961b47f6ac0cd8461b0000000000000000000000003c07dfc765102bf07b6ade961b47f6ac0cd8461b000000000000000000000000000000000000000000000000002aa1efb94e000000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -13316,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec340000000000000000000000000e449afed04b9609e26609f5126b740f9edee5f00000000000000000000000000e449afed04b9609e26609f5126b740f9edee5f000000000000000000000000000000000000000000000000000aaf5e80a96f90100000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -13317,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec34000000000000000000000000de5e235808e2a1b3dd7b9e7c86383f48eda706e1000000000000000000000000de5e235808e2a1b3dd7b9e7c86383f48eda706e100000000000000000000000000000000000000000000000000abc38b40eb68d300000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -13318,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec340000000000000000000000002f0229b91244e37161c7974acd35e880ac6323060000000000000000000000002f0229b91244e37161c7974acd35e880ac63230600000000000000000000000000000000000000000000000000ab49ad6dfe92b700000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -13319,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec34000000000000000000000000648257704c8cc4d76c8bfeb1a900b3683368357a000000000000000000000000648257704c8cc4d76c8bfeb1a900b3683368357a00000000000000000000000000000000000000000000000000aa3520ba15ee7100000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -13321,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec34000000000000000000000000b768b2927175409da5254bf4187f77cba72ecec1000000000000000000000000b768b2927175409da5254bf4187f77cba72ecec10000000000000000000000000000000000000000000000000321b3278859810d00000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,0x986a2c16f6b8ccba37cdf8f84e5cac2b2c8c8a4244214ac6ff9448035eac59a0,2022-03-30 13:51:07.000 UTC,0,true -13323,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec3400000000000000000000000091b4210b7a1cbc503b192a130b10dbe8c4929c7600000000000000000000000091b4210b7a1cbc503b192a130b10dbe8c4929c7600000000000000000000000000000000000000000000000000aa900c7c62133400000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -13326,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec34000000000000000000000000add8b3a8b51d978b8266326f3b4904e132668403000000000000000000000000add8b3a8b51d978b8266326f3b4904e132668403000000000000000000000000000000000000000000000000000939131c88457f00000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -13327,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec340000000000000000000000009c5cc0954a7de04d108b4571991986c1ce96c94d0000000000000000000000009c5cc0954a7de04d108b4571991986c1ce96c94d00000000000000000000000000000000000000000000000000a20ce2555d97c200000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -13329,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec34000000000000000000000000672b370abce91f9df9c70819a160dff5bea4cfb3000000000000000000000000672b370abce91f9df9c70819a160dff5bea4cfb3000000000000000000000000000000000000000000000000008b1cc6bf538e9000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -13332,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec34000000000000000000000000ae8e2b4abb13de393515ef5abad7e35a2b11ba6d000000000000000000000000ae8e2b4abb13de393515ef5abad7e35a2b11ba6d000000000000000000000000000000000000000000000000002386f26fc1000000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,0xc0c1d270f3f52c3859f4b14b1367dcec26640bec4e83025a26588c314a719808,2022-05-25 06:34:53.000 UTC,0,true -13333,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec3400000000000000000000000028523ae8fc1ef411669a4f284d34f2030434d38a00000000000000000000000028523ae8fc1ef411669a4f284d34f2030434d38a00000000000000000000000000000000000000000000000002b9bb89d5afdb2800000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -13336,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec340000000000000000000000009658d095406b17b45b3109c7b8b57cfa641a2e150000000000000000000000009658d095406b17b45b3109c7b8b57cfa641a2e1500000000000000000000000000000000000000000000000001586d349ec3667100000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -13338,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec34000000000000000000000000c73567e09e1774f6e9e5f1f9de7fd0c3c4ce94fa000000000000000000000000c73567e09e1774f6e9e5f1f9de7fd0c3c4ce94fa00000000000000000000000000000000000000000000000006f05b59d3b2000000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -13339,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec34000000000000000000000000b0efeebaef875186d8b250aa69377aa8ccc93283000000000000000000000000b0efeebaef875186d8b250aa69377aa8ccc93283000000000000000000000000000000000000000000000000003feb7a8302056f00000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -13345,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec34000000000000000000000000a4ce5470a3854a2840e970d51de7810e65417b71000000000000000000000000a4ce5470a3854a2840e970d51de7810e65417b71000000000000000000000000000000000000000000000000003b5602554d95c000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -13346,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec34000000000000000000000000366bffc83477dbcdd5670859cb7f59081a53ea4c000000000000000000000000366bffc83477dbcdd5670859cb7f59081a53ea4c0000000000000000000000000000000000000000000000000011c37937e0800000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -13347,0xcd9d4988c0ae61887b075ba77f08cbfad2b65068,0x3f87ff1de58128ef8fcb4c807efd776e1ac72e51,0xf4f7b41a0000000000000000000000000d7c96322a62573b509ee0b1266e7aa713662c130000000000000000000000000000000000000000000000004563918244f40000,,,1,true -13351,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec340000000000000000000000002453a37cb6598b02631dbef572bd4848c119c8ed0000000000000000000000002453a37cb6598b02631dbef572bd4848c119c8ed00000000000000000000000000000000000000000000000002a19bad6fcfea7b00000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -13352,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec34000000000000000000000000123fb8874214032c05c661677004f36ad5569aa3000000000000000000000000123fb8874214032c05c661677004f36ad5569aa300000000000000000000000000000000000000000000000001518e3a83bf1fbc00000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -13353,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec3400000000000000000000000003c71ab47ad0263f57f274e1094a50b74c10f93400000000000000000000000003c71ab47ad0263f57f274e1094a50b74c10f93400000000000000000000000000000000000000000000000006df75a00e817cf800000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,0x99deffe6badcadf10238d723b80da24a5323c43a4a1f2ec42a0e10117c695dbf,2022-04-27 01:09:30.000 UTC,0,true -13355,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec340000000000000000000000007783b43770587a394d410c5330b25937f311acbd0000000000000000000000007783b43770587a394d410c5330b25937f311acbd00000000000000000000000000000000000000000000000006e5cf238f762f0000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -13356,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec34000000000000000000000000e0d91a3e9266a25fafa978d29fdf692d5aa79bae000000000000000000000000e0d91a3e9266a25fafa978d29fdf692d5aa79bae00000000000000000000000000000000000000000000000000a54dd2972c6c0000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -13357,0xcd9d4988c0ae61887b075ba77f08cbfad2b65068,0x3f87ff1de58128ef8fcb4c807efd776e1ac72e51,0xf4f7b41a000000000000000000000000a550215d922af5af685461887190cbe1cb7c807100000000000000000000000000000000000000000000004af91435611c752327,,,1,true -13361,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec340000000000000000000000006740888dad1a16931a1dcdd16538c9edd8c5ade00000000000000000000000006740888dad1a16931a1dcdd16538c9edd8c5ade000000000000000000000000000000000000000000000000000038d7ea4c6800000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -13363,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0xa9f9e675000000000000000000000000a0b86991c6218b36c1d19d4a2e9eb0ce3606eb480000000000000000000000007f5c764cbc14f9669b88837ca1490cca17c31607000000000000000000000000041dae192e88ca982f4db6d0fc80a64be74002b8000000000000000000000000041dae192e88ca982f4db6d0fc80a64be74002b80000000000000000000000000000000000000000000000000000000003db974900000000000000000000000000000000000000000000000000000000000000c00000000000000000000000000000000000000000000000000000000000000000,,,1,true -13366,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec3400000000000000000000000094fa0e817004844f358d5aadaac45b61d444e6cb00000000000000000000000094fa0e817004844f358d5aadaac45b61d444e6cb0000000000000000000000000000000000000000000000000133342fdcd36b7000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -13367,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0xa9f9e675000000000000000000000000a0b86991c6218b36c1d19d4a2e9eb0ce3606eb480000000000000000000000007f5c764cbc14f9669b88837ca1490cca17c316070000000000000000000000000d0eb908e66917e2da851eb837977eca176bf10d0000000000000000000000000d0eb908e66917e2da851eb837977eca176bf10d0000000000000000000000000000000000000000000000000000000001fd9f0400000000000000000000000000000000000000000000000000000000000000c00000000000000000000000000000000000000000000000000000000000000000,,,1,true -13368,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec340000000000000000000000000d0eb908e66917e2da851eb837977eca176bf10d0000000000000000000000000d0eb908e66917e2da851eb837977eca176bf10d000000000000000000000000000000000000000000000000001b75bb22a8a70000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -13369,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec340000000000000000000000002b62e0312d6a6790b07f3a87b9ec339f7d8d47a60000000000000000000000002b62e0312d6a6790b07f3a87b9ec339f7d8d47a600000000000000000000000000000000000000000000000000318544ec44921300000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -13370,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0xa9f9e675000000000000000000000000a0b86991c6218b36c1d19d4a2e9eb0ce3606eb480000000000000000000000007f5c764cbc14f9669b88837ca1490cca17c3160700000000000000000000000068dcff0b1175b0199f3ca65ace43cd82fb703ce200000000000000000000000068dcff0b1175b0199f3ca65ace43cd82fb703ce200000000000000000000000000000000000000000000000000000000016664b400000000000000000000000000000000000000000000000000000000000000c00000000000000000000000000000000000000000000000000000000000000000,,,1,true -13371,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec34000000000000000000000000e56e30a76f08e67a72dd9f360e422b9fa48a70c7000000000000000000000000e56e30a76f08e67a72dd9f360e422b9fa48a70c7000000000000000000000000000000000000000000000000002d5596036831ae00000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -13375,0xcd9d4988c0ae61887b075ba77f08cbfad2b65068,0x3f87ff1de58128ef8fcb4c807efd776e1ac72e51,0xf4f7b41a000000000000000000000000d7c1e4e4de7219a7adfe0a0843b785917411847400000000000000000000000000000000000000000000000038e62046fb1a0000,,,1,true -13376,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec34000000000000000000000000e65bc9d90619e0f98fdb6bda851aaa19e054355a000000000000000000000000e65bc9d90619e0f98fdb6bda851aaa19e054355a0000000000000000000000000000000000000000000000000003328b944c400000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -13380,0xcd9d4988c0ae61887b075ba77f08cbfad2b65068,0x3f87ff1de58128ef8fcb4c807efd776e1ac72e51,0xf4f7b41a00000000000000000000000083ac17696774768c26e48a98d115b5eccbf81a8600000000000000000000000000000000000000000000000b78c1217cd03784a9,0xbac2fd97ec5d4fd61f6f2eb8f4aaa974dd5ea0ec1936897cb57d2583091b47be,2022-01-07 22:11:22.000 UTC,0,true -13381,0x10e6593cdda8c58a1d0f14c5164b376352a55f2f,0x467194771dae2967aef3ecbedd3bf9a310c76c65,0xa9f9e6750000000000000000000000006b175474e89094c44da98b954eedeac495271d0f000000000000000000000000da10009cbd5d07dd0cecc66161fc93d7c9000da100000000000000000000000014bd7ca23817d50faecbd0cc09701a1246cbce8a00000000000000000000000014bd7ca23817d50faecbd0cc09701a1246cbce8a000000000000000000000000000000000000000000000001dd6f3c536656d31a00000000000000000000000000000000000000000000000000000000000000c00000000000000000000000000000000000000000000000000000000000000000,,,1,true -13382,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec3400000000000000000000000014bd7ca23817d50faecbd0cc09701a1246cbce8a00000000000000000000000014bd7ca23817d50faecbd0cc09701a1246cbce8a0000000000000000000000000000000000000000000000000077d19e62dd146e00000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -13383,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec3400000000000000000000000095dd74037b29fa89d2fbec452579b47e634503db00000000000000000000000095dd74037b29fa89d2fbec452579b47e634503db000000000000000000000000000000000000000000000000005edcd80fb5f5fa00000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -13387,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec34000000000000000000000000d95e0e2c3b10b361f5c1f624620a26fa2a07d760000000000000000000000000d95e0e2c3b10b361f5c1f624620a26fa2a07d760000000000000000000000000000000000000000000000000002e8ca081fa230000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -13388,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec3400000000000000000000000093f16d737e50c3aa47f9406b3cf79e0293f7b1c400000000000000000000000093f16d737e50c3aa47f9406b3cf79e0293f7b1c4000000000000000000000000000000000000000000000000002e9145b0b3460000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -13392,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec3400000000000000000000000054ec0f31378c8fef5abd9ff0be137f5a1fe765ae00000000000000000000000054ec0f31378c8fef5abd9ff0be137f5a1fe765ae000000000000000000000000000000000000000000000000025bf6196bd1000000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -13393,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec34000000000000000000000000706d32a171e4f7b32dbd9dd3d4d726122c6fc3b9000000000000000000000000706d32a171e4f7b32dbd9dd3d4d726122c6fc3b9000000000000000000000000000000000000000000000000011c37937e08000000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -13400,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0xa9f9e675000000000000000000000000514910771af9ca656af840dff83e8264ecf986ca000000000000000000000000350a791bfc2c21f9ed5d10980dad2e2638ffa7f60000000000000000000000000133d7b8e24d11a9b4c511e31d3ee94ef3c9a0e70000000000000000000000000133d7b8e24d11a9b4c511e31d3ee94ef3c9a0e7000000000000000000000000000000000000000000000000467b75af1884132a00000000000000000000000000000000000000000000000000000000000000c00000000000000000000000000000000000000000000000000000000000000000,,,1,true -13406,0xcd9d4988c0ae61887b075ba77f08cbfad2b65068,0x3f87ff1de58128ef8fcb4c807efd776e1ac72e51,0xf4f7b41a0000000000000000000000004257bc72ea94e5f7459190dee12236ee7ee0203c00000000000000000000000000000000000000000000002ac5861dc2e0019aad,0xa02e678afd7c1fc85484a8cf4b61f90e59aa2fee75d2039e8d8234b0e17e6a37,2021-11-29 10:44:43.000 UTC,0,true -13408,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0xa9f9e675000000000000000000000000514910771af9ca656af840dff83e8264ecf986ca000000000000000000000000350a791bfc2c21f9ed5d10980dad2e2638ffa7f60000000000000000000000002f4cc285bc316ba1ff2f1a71761839629c19d5a20000000000000000000000002f4cc285bc316ba1ff2f1a71761839629c19d5a2000000000000000000000000000000000000000000000000086b8baf635e393e00000000000000000000000000000000000000000000000000000000000000c00000000000000000000000000000000000000000000000000000000000000000,,,1,true -13414,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec340000000000000000000000009e882c4b9d59ab62c212c00db7aa9aefa3634ba30000000000000000000000009e882c4b9d59ab62c212c00db7aa9aefa3634ba300000000000000000000000000000000000000000000000003311fc80a57000000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -13417,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec34000000000000000000000000ec5b986c5c531d41ec6e2391a0d253fc3588628e000000000000000000000000ec5b986c5c531d41ec6e2391a0d253fc3588628e00000000000000000000000000000000000000000000000000860a11acad7ac000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -13418,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec34000000000000000000000000085622bc4f29911f6a8cbc2135c7c21e8f32c283000000000000000000000000085622bc4f29911f6a8cbc2135c7c21e8f32c28300000000000000000000000000000000000000000000000001b70fa471e588fd00000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -13424,0x10e6593cdda8c58a1d0f14c5164b376352a55f2f,0x467194771dae2967aef3ecbedd3bf9a310c76c65,0xa9f9e6750000000000000000000000006b175474e89094c44da98b954eedeac495271d0f000000000000000000000000da10009cbd5d07dd0cecc66161fc93d7c9000da100000000000000000000000060408fd5e5ed4c9824802e290c152c3023bbeaf600000000000000000000000060408fd5e5ed4c9824802e290c152c3023bbeaf60000000000000000000000000000000000000000000000063bf212b431ec000000000000000000000000000000000000000000000000000000000000000000c00000000000000000000000000000000000000000000000000000000000000000,,,1,true -13427,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec340000000000000000000000007ca9212b3b9640dcbe866f86b8601e5beb6666480000000000000000000000007ca9212b3b9640dcbe866f86b8601e5beb666648000000000000000000000000000000000000000000000000002da48aab845c8000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -13429,0x10e6593cdda8c58a1d0f14c5164b376352a55f2f,0x467194771dae2967aef3ecbedd3bf9a310c76c65,0xa9f9e6750000000000000000000000006b175474e89094c44da98b954eedeac495271d0f000000000000000000000000da10009cbd5d07dd0cecc66161fc93d7c9000da1000000000000000000000000fa5d04a5058d7f55cfd75487b62278421398f66b000000000000000000000000fa5d04a5058d7f55cfd75487b62278421398f66b000000000000000000000000000000000000000000000003cf40d8656828d2a300000000000000000000000000000000000000000000000000000000000000c00000000000000000000000000000000000000000000000000000000000000000,,,1,true -13430,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec34000000000000000000000000c21a0e64a7b39a3d41dd17942d74e63c0bb6ae12000000000000000000000000c21a0e64a7b39a3d41dd17942d74e63c0bb6ae120000000000000000000000000000000000000000000000000853a0d2313c000000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -13431,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec34000000000000000000000000e6aee6ec5a83010859e350cc07b16210a4641cbd000000000000000000000000e6aee6ec5a83010859e350cc07b16210a4641cbd000000000000000000000000000000000000000000000000002b49c61940db9000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -13432,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec34000000000000000000000000a734bf1acceaf44049898315f012fa240489d909000000000000000000000000a734bf1acceaf44049898315f012fa240489d90900000000000000000000000000000000000000000000000002ba2e5c07d9e82e00000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -13434,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec340000000000000000000000003d13e1c8b0315fbaa4f385ee44c6444c474c20f00000000000000000000000003d13e1c8b0315fbaa4f385ee44c6444c474c20f0000000000000000000000000000000000000000000000000000df8b16cca2e0b00000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -13436,0x10e6593cdda8c58a1d0f14c5164b376352a55f2f,0x467194771dae2967aef3ecbedd3bf9a310c76c65,0xa9f9e6750000000000000000000000006b175474e89094c44da98b954eedeac495271d0f000000000000000000000000da10009cbd5d07dd0cecc66161fc93d7c9000da1000000000000000000000000c7db50bfb824c4e60d107c2892313b127739b6fd000000000000000000000000c7db50bfb824c4e60d107c2892313b127739b6fd0000000000000000000000000000000000000000000000006f05b59d3b20000000000000000000000000000000000000000000000000000000000000000000c00000000000000000000000000000000000000000000000000000000000000000,,,1,true -13439,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec34000000000000000000000000a699720418f612558e2827bf68631686e9d1095e000000000000000000000000a699720418f612558e2827bf68631686e9d1095e000000000000000000000000000000000000000000000000015feb298de19d0000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -13440,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec34000000000000000000000000d7da9b0677d17341ada49902e9c0d5f4f11dfb3e000000000000000000000000d7da9b0677d17341ada49902e9c0d5f4f11dfb3e000000000000000000000000000000000000000000000000003b508d54a33e8200000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -13441,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec34000000000000000000000000f90f56afa1dae825db57fc305b2f8f1ccf337531000000000000000000000000f90f56afa1dae825db57fc305b2f8f1ccf337531000000000000000000000000000000000000000000000000003a43b68e51000000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,0x34f0eaf76174149f8b53a0f9f33ce91cae044fc7f360a576ccafd9ea08836519,2022-05-18 05:42:46.000 UTC,0,true -13442,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec3400000000000000000000000092c0689fe3c559657e5e3409dcb5eb5eab76f2b800000000000000000000000092c0689fe3c559657e5e3409dcb5eb5eab76f2b8000000000000000000000000000000000000000000000000000aa87bee53800000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -13443,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec34000000000000000000000000c7db50bfb824c4e60d107c2892313b127739b6fd000000000000000000000000c7db50bfb824c4e60d107c2892313b127739b6fd0000000000000000000000000000000000000000000000000008632c28b9737500000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -13444,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec34000000000000000000000000c6bee58695595ae32288b5afcbee1d4c030f62e5000000000000000000000000c6bee58695595ae32288b5afcbee1d4c030f62e50000000000000000000000000000000000000000000000000006959dd3aaf74100000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -13446,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec34000000000000000000000000d9590b6019c8e52718b85e7caa2bb3318be10f44000000000000000000000000d9590b6019c8e52718b85e7caa2bb3318be10f44000000000000000000000000000000000000000000000000000965dbce70760600000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -13447,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec3400000000000000000000000089c3d632031e77667bd8d752cea80bb185354df100000000000000000000000089c3d632031e77667bd8d752cea80bb185354df1000000000000000000000000000000000000000000000000000a76577aa35cb400000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -13448,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec3400000000000000000000000093ccaa2c29ea8b79899400c5a037f18bb9b2a60700000000000000000000000093ccaa2c29ea8b79899400c5a037f18bb9b2a60700000000000000000000000000000000000000000000000000091b93a4bba8fd00000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -13449,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec340000000000000000000000007761162e5d5e7143fafca23c76b1e91724f130090000000000000000000000007761162e5d5e7143fafca23c76b1e91724f130090000000000000000000000000000000000000000000000000009ed6c2fc9a8b800000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -13450,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec34000000000000000000000000e495b919885d93a2c16fc7ae9439d178377cf94d000000000000000000000000e495b919885d93a2c16fc7ae9439d178377cf94d0000000000000000000000000000000000000000000000000005a5660ff85fc700000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -13451,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec340000000000000000000000000573c5c8d84a892217ecbce14226394beb8329c40000000000000000000000000573c5c8d84a892217ecbce14226394beb8329c4000000000000000000000000000000000000000000000000009bc7c76f30f95100000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,0xe3116290c91802b53713f256af60e804f7ed999536c8b4fbc8dab54fb5b986a7,2021-12-26 11:49:23.000 UTC,0,true -13452,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec34000000000000000000000000d7bf83b30acb185654630f04612d71a84786e6cc000000000000000000000000d7bf83b30acb185654630f04612d71a84786e6cc000000000000000000000000000000000000000000000000000aac369e1e001900000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -13456,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec3400000000000000000000000028d4bd86a22befc00bfbb4f94950a4ac0b10fd5b00000000000000000000000028d4bd86a22befc00bfbb4f94950a4ac0b10fd5b000000000000000000000000000000000000000000000000000b663933acbf5a00000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -13458,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec340000000000000000000000005fbd43b140b9b84cfc05ef7b0afe930a58a1e8f60000000000000000000000005fbd43b140b9b84cfc05ef7b0afe930a58a1e8f600000000000000000000000000000000000000000000000000580a6871ec193100000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -13459,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec34000000000000000000000000ebf5049401a882c20690ec3e9dfa78f6ff93cadc000000000000000000000000ebf5049401a882c20690ec3e9dfa78f6ff93cadc000000000000000000000000000000000000000000000000004945df1084304000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -13460,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec34000000000000000000000000634dc398000d102cd78c8a707bef9f9813464983000000000000000000000000634dc398000d102cd78c8a707bef9f9813464983000000000000000000000000000000000000000000000000000aa87bee53800000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -13461,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec34000000000000000000000000b30a35bb3b3830626c97f0ea9b123a3d9439c468000000000000000000000000b30a35bb3b3830626c97f0ea9b123a3d9439c4680000000000000000000000000000000000000000000000000d98cc4ff03f280200000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -13462,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec34000000000000000000000000f90cae83a037e3e7600b842898f52fa87239d3a2000000000000000000000000f90cae83a037e3e7600b842898f52fa87239d3a20000000000000000000000000000000000000000000000000009dd503a02a7e800000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -13463,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec34000000000000000000000000c456f81419a4c0ab25d33677640715f62fe8462e000000000000000000000000c456f81419a4c0ab25d33677640715f62fe8462e0000000000000000000000000000000000000000000000000044e6f16e845e0000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -13465,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec34000000000000000000000000c83dff7353a75e5489f98a64e08619a10b796081000000000000000000000000c83dff7353a75e5489f98a64e08619a10b796081000000000000000000000000000000000000000000000000000aa87bee53800000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -13466,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec340000000000000000000000002a74e944fba53828d1f63ae3db91fdd966d5ae0d0000000000000000000000002a74e944fba53828d1f63ae3db91fdd966d5ae0d0000000000000000000000000000000000000000000000000009c826fea8c1dd00000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -13467,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec340000000000000000000000009418533015471c727d4aa4d8fd1effc1433fa6cd0000000000000000000000009418533015471c727d4aa4d8fd1effc1433fa6cd00000000000000000000000000000000000000000000000000062857ad59620a00000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -13469,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec34000000000000000000000000d00ab9ca2447832d570014835567392a47fb5568000000000000000000000000d00ab9ca2447832d570014835567392a47fb55680000000000000000000000000000000000000000000000000098f6677f4c2b0d00000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -13470,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec340000000000000000000000007d0d8bf8e14a6b3237195b8d28a19a07252c68850000000000000000000000007d0d8bf8e14a6b3237195b8d28a19a07252c6885000000000000000000000000000000000000000000000000014ccee5b47dc5c500000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -13471,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec340000000000000000000000000deb0488784f01d0bf118b536e4b7ad48357f8c40000000000000000000000000deb0488784f01d0bf118b536e4b7ad48357f8c400000000000000000000000000000000000000000000000000162fe12eea018a00000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -13472,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec34000000000000000000000000726ad4bdaf04ed2eb26c43881f8d8648f7abc047000000000000000000000000726ad4bdaf04ed2eb26c43881f8d8648f7abc047000000000000000000000000000000000000000000000000014f985e39f5fe9200000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -13473,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec34000000000000000000000000ff3c4e561df2b1573c367707794b5df25425ac6e000000000000000000000000ff3c4e561df2b1573c367707794b5df25425ac6e000000000000000000000000000000000000000000000000001c6bf52634000000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -13474,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec34000000000000000000000000f270fa131fea5d7e1798672f87a9da4e01b399ef000000000000000000000000f270fa131fea5d7e1798672f87a9da4e01b399ef000000000000000000000000000000000000000000000000046d989cbeec002600000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -13475,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0xa9f9e6750000000000000000000000001f9840a85d5af5bf1d1762f925bdaddc4201f9840000000000000000000000006fd9d7ad17242c41f7131d257212c54a0e816691000000000000000000000000c7d2c67bc38b0e8b15b632c19ef629022fd56543000000000000000000000000c7d2c67bc38b0e8b15b632c19ef629022fd565430000000000000000000000000000000000000000000000001b91f57b06ea36e500000000000000000000000000000000000000000000000000000000000000c00000000000000000000000000000000000000000000000000000000000000000,0x8117b77e95158c049fd22e71181d8557e1b663279ef08725b305c62e88222462,2022-02-05 09:37:55.000 UTC,0,true -13478,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec34000000000000000000000000d696e4aa7fb6e9d828ac804bef9baeee136ed40c000000000000000000000000d696e4aa7fb6e9d828ac804bef9baeee136ed40c00000000000000000000000000000000000000000000000000a31e78e853832400000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -13479,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec340000000000000000000000005b9b5f9c69aa245db149a6de6dadd3427da1fbbf0000000000000000000000005b9b5f9c69aa245db149a6de6dadd3427da1fbbf0000000000000000000000000000000000000000000000000026896f771f09ca00000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -13480,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec34000000000000000000000000a13f3599ff620500f360dc6185ad30f625ebfc38000000000000000000000000a13f3599ff620500f360dc6185ad30f625ebfc38000000000000000000000000000000000000000000000000018bc24f13e462d300000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -13486,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec3400000000000000000000000034a79f99185794408d3227bce62fff0adb36dc9600000000000000000000000034a79f99185794408d3227bce62fff0adb36dc9600000000000000000000000000000000000000000000000000005af3107a400000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -13489,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec3400000000000000000000000034be96d237998af9ec63986a266a81937ca208c200000000000000000000000034be96d237998af9ec63986a266a81937ca208c200000000000000000000000000000000000000000000000000005af3107a400000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -13490,0xcd9d4988c0ae61887b075ba77f08cbfad2b65068,0x3f87ff1de58128ef8fcb4c807efd776e1ac72e51,0xf4f7b41a0000000000000000000000009d374d3d5f9ce1f388994c98d7279bd1b4f87b330000000000000000000000000000000000000000000000000de0b6b3a7640000,,,1,true -13491,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec34000000000000000000000000e34c4cf29f9e06f4186dccd1853c6f0a17b54065000000000000000000000000e34c4cf29f9e06f4186dccd1853c6f0a17b5406500000000000000000000000000000000000000000000000000005af3107a400000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -13492,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec34000000000000000000000000463892108a1b2503dfb0c335893af1858bbc8777000000000000000000000000463892108a1b2503dfb0c335893af1858bbc877700000000000000000000000000000000000000000000000000005af3107a400000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -13493,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec34000000000000000000000000554047f6e0120ed3738e994b89d2a06462919e60000000000000000000000000554047f6e0120ed3738e994b89d2a06462919e6000000000000000000000000000000000000000000000000000005af3107a400000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -13494,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec34000000000000000000000000ede75dbcc5e9896126518a7741650aadb7dbe539000000000000000000000000ede75dbcc5e9896126518a7741650aadb7dbe53900000000000000000000000000000000000000000000000000005af3107a400000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -13495,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec340000000000000000000000002e4ee46cbecd6d340401d35b72d64b1ac9b63e3c0000000000000000000000002e4ee46cbecd6d340401d35b72d64b1ac9b63e3c00000000000000000000000000000000000000000000000000005af3107a400000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -13496,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec340000000000000000000000006eec9ed388f1ba3b1c4b08f2737149e4cbe3af4f0000000000000000000000006eec9ed388f1ba3b1c4b08f2737149e4cbe3af4f00000000000000000000000000000000000000000000000000005af3107a400000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -13497,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec340000000000000000000000001c620f148d7caec6073691d78f046d72ee099ad00000000000000000000000001c620f148d7caec6073691d78f046d72ee099ad000000000000000000000000000000000000000000000000000005af3107a400000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -13498,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec340000000000000000000000005a3b89800f47cbad213a496c96791a7ccb05eeb80000000000000000000000005a3b89800f47cbad213a496c96791a7ccb05eeb800000000000000000000000000000000000000000000000000005af3107a400000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -13499,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec34000000000000000000000000d79d6f19c2c10fa1ad06eba12a72e65905a99c01000000000000000000000000d79d6f19c2c10fa1ad06eba12a72e65905a99c0100000000000000000000000000000000000000000000000000005af3107a400000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -13500,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec34000000000000000000000000fbe6790b2221c6bb41af88f398254b9662c01a38000000000000000000000000fbe6790b2221c6bb41af88f398254b9662c01a38000000000000000000000000000000000000000000000000003f8967058c84e700000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -13501,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec340000000000000000000000000b6f6d8131b159ea36fd4eabd6d08ae3f6f0ba190000000000000000000000000b6f6d8131b159ea36fd4eabd6d08ae3f6f0ba1900000000000000000000000000000000000000000000000000005af3107a400000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -13502,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec34000000000000000000000000dff53ba0007507ccaaf30264b8212db37a84b6b4000000000000000000000000dff53ba0007507ccaaf30264b8212db37a84b6b400000000000000000000000000000000000000000000000000005af3107a400000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -13503,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec3400000000000000000000000095537634202c31521315078bc1b8837e1da7269900000000000000000000000095537634202c31521315078bc1b8837e1da7269900000000000000000000000000000000000000000000000000005af3107a400000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -13504,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec340000000000000000000000009ce7a5f00f7d83126520cb2916d16489b495169b0000000000000000000000009ce7a5f00f7d83126520cb2916d16489b495169b00000000000000000000000000000000000000000000000000005af3107a400000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -13505,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec340000000000000000000000000783b4926b83d666d6897b96f3049428b08343890000000000000000000000000783b4926b83d666d6897b96f3049428b083438900000000000000000000000000000000000000000000000000005af3107a400000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -13506,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec340000000000000000000000001b542568f06eef54ce03203fce472481b7d3cf7b0000000000000000000000001b542568f06eef54ce03203fce472481b7d3cf7b00000000000000000000000000000000000000000000000000005af3107a400000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -13507,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec340000000000000000000000006ab56fa34d26f674939b2947ea25d8a6097655970000000000000000000000006ab56fa34d26f674939b2947ea25d8a60976559700000000000000000000000000000000000000000000000000005af3107a400000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -13508,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec3400000000000000000000000041a083bab355451b1a4e4b5366a72271ce849c5100000000000000000000000041a083bab355451b1a4e4b5366a72271ce849c5100000000000000000000000000000000000000000000000000005af3107a400000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -13509,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec34000000000000000000000000bd4c9130c75659bd84ab5cb27fcb0663b78c006c000000000000000000000000bd4c9130c75659bd84ab5cb27fcb0663b78c006c000000000000000000000000000000000000000000000000015c2a7b13fd000000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -13510,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec34000000000000000000000000f6e315d113a0bb37986d581cc71d663a0e9b69ee000000000000000000000000f6e315d113a0bb37986d581cc71d663a0e9b69ee00000000000000000000000000000000000000000000000000005af3107a400000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -13511,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0xa9f9e675000000000000000000000000dac17f958d2ee523a2206206994597c13d831ec700000000000000000000000094b008aa00579c1307b0ef2c499ad98a8ce58e58000000000000000000000000c50a6f05500c941b080c56ea3764e6a920ad92f2000000000000000000000000c50a6f05500c941b080c56ea3764e6a920ad92f2000000000000000000000000000000000000000000000000000000001dcd650000000000000000000000000000000000000000000000000000000000000000c00000000000000000000000000000000000000000000000000000000000000000,,,1,true -13512,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec34000000000000000000000000dde199991ad1a917be29b92618dbb1daa464372e000000000000000000000000dde199991ad1a917be29b92618dbb1daa464372e0000000000000000000000000000000000000000000000000067e0609591300000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,0x1425a9f1c6798ccc9ebc51b76b177a118c8bda0c4b5e6d09868d3f91407b4b17,2022-05-21 05:56:16.000 UTC,0,true -13515,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec34000000000000000000000000cc9a5cdeff2d022a9e910c4c1c7c78e6be666a36000000000000000000000000cc9a5cdeff2d022a9e910c4c1c7c78e6be666a360000000000000000000000000000000000000000000000000068f0e3a147fc0000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,0xa1ddd0810574ab4ac5fa2367fd658f7b25b68671d0cddbf624d78fd81ba0628f,2022-05-22 18:42:06.000 UTC,0,true -13516,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec340000000000000000000000003734a41abe1cccbb4519fe361e7c5ce0dfe879f80000000000000000000000003734a41abe1cccbb4519fe361e7c5ce0dfe879f800000000000000000000000000000000000000000000000001f161421c8e000000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -13518,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec34000000000000000000000000308eb3dcc77391d02941944909dc85d23af03220000000000000000000000000308eb3dcc77391d02941944909dc85d23af03220000000000000000000000000000000000000000000000000004bfbcf4ff0609700000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,0xc3623a2f038be5deae8c09768729ef74acfd36d66a065052f92f5c99326eee63,2022-03-12 17:38:49.000 UTC,0,true -13523,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec340000000000000000000000006f030b74371167d3b71cf3214e749b0d1814c0490000000000000000000000006f030b74371167d3b71cf3214e749b0d1814c0490000000000000000000000000000000000000000000000000074fd5dd242dc9400000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,0x12949014e04b39fa458a2d59f92163e811d1d671378ef8a973e5352d0d0ed41e,2021-12-09 00:40:57.000 UTC,0,true -13526,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec340000000000000000000000005a30a5c6554fdc4b2a23e7f87150a192786b30b20000000000000000000000005a30a5c6554fdc4b2a23e7f87150a192786b30b200000000000000000000000000000000000000000000000000793a22bb8f020000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -13527,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec340000000000000000000000008cc5f52ca537df691f15f5f88a0ae7f95bdd72060000000000000000000000008cc5f52ca537df691f15f5f88a0ae7f95bdd7206000000000000000000000000000000000000000000000000000d7f72f39764c500000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -13528,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec34000000000000000000000000df8ce52f7a50c1ba79d778717d48357df4d9150e000000000000000000000000df8ce52f7a50c1ba79d778717d48357df4d9150e0000000000000000000000000000000000000000000000000072924212078b8000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -13529,0x10e6593cdda8c58a1d0f14c5164b376352a55f2f,0x467194771dae2967aef3ecbedd3bf9a310c76c65,0xa9f9e6750000000000000000000000006b175474e89094c44da98b954eedeac495271d0f000000000000000000000000da10009cbd5d07dd0cecc66161fc93d7c9000da100000000000000000000000049a1d052b0b3a5324ddfb4f4d374313edeea0d3700000000000000000000000049a1d052b0b3a5324ddfb4f4d374313edeea0d37000000000000000000000000000000000000000000000003c932de100869e29300000000000000000000000000000000000000000000000000000000000000c00000000000000000000000000000000000000000000000000000000000000000,,,1,true -13531,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec34000000000000000000000000e28d0e01d8f1501600b0f19bc142a6546626d605000000000000000000000000e28d0e01d8f1501600b0f19bc142a6546626d6050000000000000000000000000000000000000000000000000036fc685780307900000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -13532,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec34000000000000000000000000eec03bc36752a1e991d5df6022778a84bab9ac49000000000000000000000000eec03bc36752a1e991d5df6022778a84bab9ac490000000000000000000000000000000000000000000000000022766a152044dd00000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,0x0c18bf666f37cd37ed471f7db69e0c7fe11ebdfd8441e6a22c61bc682906b83b,2022-03-14 12:33:34.000 UTC,0,true -13533,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec34000000000000000000000000521f8c295b140d310bb8aee6bd9e008797953524000000000000000000000000521f8c295b140d310bb8aee6bd9e0087979535240000000000000000000000000000000000000000000000000061b3347238707700000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,0x68284e4de4a9d1aa534b7415aa77c0226cf31012817a9d7c87d6a0d8fbc530ab,2022-08-01 00:37:53.000 UTC,0,true -13535,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec34000000000000000000000000f119103ae79e98ecc7791e3b4a765f303d7d7da1000000000000000000000000f119103ae79e98ecc7791e3b4a765f303d7d7da1000000000000000000000000000000000000000000000000001fd9db6154250000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -13537,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec34000000000000000000000000e874b45764eedd2c76398a57b4d5f2fe0f05a4f2000000000000000000000000e874b45764eedd2c76398a57b4d5f2fe0f05a4f2000000000000000000000000000000000000000000000000000c195119000bd200000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -13539,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec34000000000000000000000000a183a8304c3523d7963096b831c2ae160ce9dac8000000000000000000000000a183a8304c3523d7963096b831c2ae160ce9dac8000000000000000000000000000000000000000000000000000947c655a0c38000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -13540,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec3400000000000000000000000017e555e5f72cd268453ad027666df4e3bad8f4db00000000000000000000000017e555e5f72cd268453ad027666df4e3bad8f4db000000000000000000000000000000000000000000000000000a296ebc7845e300000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -13541,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec34000000000000000000000000376236b8277bbd26b7163caf4870691c37e75107000000000000000000000000376236b8277bbd26b7163caf4870691c37e7510700000000000000000000000000000000000000000000000000c21d4dc767724200000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -13542,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec34000000000000000000000000052e9ac8200924ef2871208f34ce68ddb0b16e99000000000000000000000000052e9ac8200924ef2871208f34ce68ddb0b16e990000000000000000000000000000000000000000000000000009aae84f480fbc00000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -13543,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec34000000000000000000000000158169a722f85e8dd64fa4692af4ba0ee3ac3f1f000000000000000000000000158169a722f85e8dd64fa4692af4ba0ee3ac3f1f0000000000000000000000000000000000000000000000000081e4625b4b85d200000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -13544,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec3400000000000000000000000003ec99088cdc87b1927f87831b570995bea0f63500000000000000000000000003ec99088cdc87b1927f87831b570995bea0f635000000000000000000000000000000000000000000000000000b6737c298120a00000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -13546,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec3400000000000000000000000003322f34f6be8eb57642df8a768eb12478ffc40a00000000000000000000000003322f34f6be8eb57642df8a768eb12478ffc40a000000000000000000000000000000000000000000000000001116a29b23126a00000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -13547,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec340000000000000000000000006c4a2c30a7d8150a63cc4268ca86c85c22c461500000000000000000000000006c4a2c30a7d8150a63cc4268ca86c85c22c461500000000000000000000000000000000000000000000000000013f9713c6cec6300000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -13548,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec340000000000000000000000004b01cec888e8f3904966f53852ca95fdeb166a9b0000000000000000000000004b01cec888e8f3904966f53852ca95fdeb166a9b000000000000000000000000000000000000000000000000000e8409dcf9ef6400000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -13549,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec340000000000000000000000001d86aae1dcc5d4534dcac0f2d3daf962b4277b200000000000000000000000001d86aae1dcc5d4534dcac0f2d3daf962b4277b20000000000000000000000000000000000000000000000000000cd170a2baf0d300000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -13551,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec3400000000000000000000000062ab1cd519eafdb64ad685a686c6f5d67a544ad200000000000000000000000062ab1cd519eafdb64ad685a686c6f5d67a544ad20000000000000000000000000000000000000000000000000067802bc23e280000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,0xf6f02a4b061dbb92e4b987d64650b33e0e1d0a89b40ac7acdba4bd84d53d1c82,2022-05-29 09:20:45.000 UTC,0,true -13552,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec34000000000000000000000000101d5479a5b33bc7a0720c93df1715612d059a24000000000000000000000000101d5479a5b33bc7a0720c93df1715612d059a2400000000000000000000000000000000000000000000000000101398cd168dc800000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -13553,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec340000000000000000000000006730e06a5d67719c3895c56bcd01740734d411450000000000000000000000006730e06a5d67719c3895c56bcd01740734d41145000000000000000000000000000000000000000000000000000c8feabb3c345a00000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -13554,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec34000000000000000000000000e6732ddbd83c56fddf81d4e71074075b28b4fb9f000000000000000000000000e6732ddbd83c56fddf81d4e71074075b28b4fb9f000000000000000000000000000000000000000000000000000d452216a0b92600000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -13555,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec34000000000000000000000000c4629261cd1c28c439321567a211c5db9ad81c3f000000000000000000000000c4629261cd1c28c439321567a211c5db9ad81c3f00000000000000000000000000000000000000000000000000082a5e4aaf9a8000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -13556,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec3400000000000000000000000011e56f8a14d70896f7daf6695a18e4b2d965637000000000000000000000000011e56f8a14d70896f7daf6695a18e4b2d9656370000000000000000000000000000000000000000000000000012712404f735cb400000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -13557,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec3400000000000000000000000092c0689fe3c559657e5e3409dcb5eb5eab76f2b800000000000000000000000092c0689fe3c559657e5e3409dcb5eb5eab76f2b8000000000000000000000000000000000000000000000000000aa87bee53800000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -13559,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec34000000000000000000000000cf2144acdab6d0267faf627ae8ce57544df1f23a000000000000000000000000cf2144acdab6d0267faf627ae8ce57544df1f23a00000000000000000000000000000000000000000000000001369453121169f200000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -13560,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec3400000000000000000000000095c5a2f8053b5efdf84a640ae03ee5f449870c0000000000000000000000000095c5a2f8053b5efdf84a640ae03ee5f449870c0000000000000000000000000000000000000000000000000002062e8108ccd73e00000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -13561,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec340000000000000000000000007f30bc3626a28d6d5ce1af949043ccd2fc36440f0000000000000000000000007f30bc3626a28d6d5ce1af949043ccd2fc36440f000000000000000000000000000000000000000000000000015e466b398984cb00000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -13563,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec340000000000000000000000009ceba1d1c54282179b77e318b4b0561a14af71730000000000000000000000009ceba1d1c54282179b77e318b4b0561a14af7173000000000000000000000000000000000000000000000000000054291bfda50000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -13564,0xcd9d4988c0ae61887b075ba77f08cbfad2b65068,0x3f87ff1de58128ef8fcb4c807efd776e1ac72e51,0xf4f7b41a000000000000000000000000c819620fe48cfee437db472eb52b70946409aea2000000000000000000000000000000000000000000000020e0c83d1cad95e150,,,1,true -13567,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0xa9f9e675000000000000000000000000a0b86991c6218b36c1d19d4a2e9eb0ce3606eb480000000000000000000000007f5c764cbc14f9669b88837ca1490cca17c3160700000000000000000000000039f85ae146ce38e5f14eef5c90a007420a29f19c00000000000000000000000039f85ae146ce38e5f14eef5c90a007420a29f19c0000000000000000000000000000000000000000000000000000000007361f6c00000000000000000000000000000000000000000000000000000000000000c00000000000000000000000000000000000000000000000000000000000000000,,,1,true -13568,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec340000000000000000000000003c618a50e79eefc2a421e8203f9f70a29e6a48170000000000000000000000003c618a50e79eefc2a421e8203f9f70a29e6a481700000000000000000000000000000000000000000000000000038d7ea4c6800000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -13569,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec3400000000000000000000000032280087208adda9d2c5a1108969ea974ff95f4d00000000000000000000000032280087208adda9d2c5a1108969ea974ff95f4d000000000000000000000000000000000000000000000000005c5de18f44e2db00000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,0x9f4385e5308efc189f4ee67ce3bd0e117463a16cb60ecace06c6c0e68c45d46c,2022-07-24 05:16:53.000 UTC,0,true -13572,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec34000000000000000000000000f8611af181da9b5283d2bdf4c0799aaff3a278d6000000000000000000000000f8611af181da9b5283d2bdf4c0799aaff3a278d60000000000000000000000000000000000000000000000000009c01bb1eb3d3600000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -13573,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec340000000000000000000000009d89195a9322a9e8f5535512da06cdd165db0bc90000000000000000000000009d89195a9322a9e8f5535512da06cdd165db0bc9000000000000000000000000000000000000000000000000010af2595e3dd8a600000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -13577,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec34000000000000000000000000c04c7c2efc023731303e7bf81a9b6540e361c76a000000000000000000000000c04c7c2efc023731303e7bf81a9b6540e361c76a000000000000000000000000000000000000000000000000008a234e96f95da100000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -13581,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec34000000000000000000000000eccc3a11a481e992ce4fd4d37e1568f11399b053000000000000000000000000eccc3a11a481e992ce4fd4d37e1568f11399b053000000000000000000000000000000000000000000000000001ccdfe282810c000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -13586,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec34000000000000000000000000958118ab88b764151d6e67e779aae7ebfa064a48000000000000000000000000958118ab88b764151d6e67e779aae7ebfa064a48000000000000000000000000000000000000000000000000002b610a86cdaa0200000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -13589,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec34000000000000000000000000e46b89a906e70786f0ff94a40aaa63ebbf30aee0000000000000000000000000e46b89a906e70786f0ff94a40aaa63ebbf30aee000000000000000000000000000000000000000000000000001f4f6e4da65a63600000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -13592,0xcd9d4988c0ae61887b075ba77f08cbfad2b65068,0x3f87ff1de58128ef8fcb4c807efd776e1ac72e51,0xf4f7b41a000000000000000000000000982ad1aed87c4adf0de68939266c2cfe302567b90000000000000000000000000000000000000000000000013319a67d2993a96f,,,1,true -13596,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec34000000000000000000000000b50716974bb074a4d463cdd03152c495a0796ca2000000000000000000000000b50716974bb074a4d463cdd03152c495a0796ca200000000000000000000000000000000000000000000000000a1be53562fccda00000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -13598,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0xa9f9e675000000000000000000000000514910771af9ca656af840dff83e8264ecf986ca000000000000000000000000350a791bfc2c21f9ed5d10980dad2e2638ffa7f6000000000000000000000000d2d070dc9389506ec673938ef2a0c9a0f681d414000000000000000000000000d2d070dc9389506ec673938ef2a0c9a0f681d4140000000000000000000000000000000000000000000000008ac7230489e8000000000000000000000000000000000000000000000000000000000000000000c00000000000000000000000000000000000000000000000000000000000000000,,,1,true -13599,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec3400000000000000000000000006a5510dd227b846595500fea81b8f0761fa0f0a00000000000000000000000006a5510dd227b846595500fea81b8f0761fa0f0a0000000000000000000000000000000000000000000000000006d1e7adaa9c5c00000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -13601,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec340000000000000000000000000f7e63da70b47255073cf8528d5ac54fbfb8c3130000000000000000000000000f7e63da70b47255073cf8528d5ac54fbfb8c31300000000000000000000000000000000000000000000000000bfd8b6c1df000000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -13602,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0xa9f9e6750000000000000000000000002260fac5e5542a773aa44fbcfedf7c193bc2c59900000000000000000000000068f180fcce6836688e9084f035309e29bf0a20950000000000000000000000009d522c3aee1cbb7743b69a2e3d38f6b7348434920000000000000000000000009d522c3aee1cbb7743b69a2e3d38f6b7348434920000000000000000000000000000000000000000000000000000000000995cd300000000000000000000000000000000000000000000000000000000000000c00000000000000000000000000000000000000000000000000000000000000000,0x858b1e251ccd26f8fb60fc8abf6d56c1a1b621b23665b09b20cf34bc4ec76e10,2021-12-09 16:16:28.000 UTC,0,true -13603,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec34000000000000000000000000b293d010257a41484dbdf0699030a0661f0b3446000000000000000000000000b293d010257a41484dbdf0699030a0661f0b344600000000000000000000000000000000000000000000000000a0f0e25649817b00000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,0x01ae15db9c4ebdd6867944922b24df9708d490928b59a2c79ecdaa88f0b21fbe,2022-04-24 09:10:34.000 UTC,0,true -13604,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec34000000000000000000000000c73567e09e1774f6e9e5f1f9de7fd0c3c4ce94fa000000000000000000000000c73567e09e1774f6e9e5f1f9de7fd0c3c4ce94fa00000000000000000000000000000000000000000000000000038d7ea4c6800000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -13605,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec34000000000000000000000000d2d070dc9389506ec673938ef2a0c9a0f681d414000000000000000000000000d2d070dc9389506ec673938ef2a0c9a0f681d41400000000000000000000000000000000000000000000000000b1a2bc2ec5000000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -13607,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec34000000000000000000000000e5a117fdd91052627c75e40f06bf090205f233ff000000000000000000000000e5a117fdd91052627c75e40f06bf090205f233ff000000000000000000000000000000000000000000000000000200fa57fb508c00000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -13609,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec34000000000000000000000000e0f312c1d27e389061b6cbde969f5cf4b6033f04000000000000000000000000e0f312c1d27e389061b6cbde969f5cf4b6033f0400000000000000000000000000000000000000000000000000c3f0635499deda00000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -13610,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec3400000000000000000000000097b8e2856a360e11d8f2b29ec6a1d2d05be4310100000000000000000000000097b8e2856a360e11d8f2b29ec6a1d2d05be4310100000000000000000000000000000000000000000000000000102267eea76ae600000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -13611,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec340000000000000000000000003aeedcd329e91e352d6c3d42c2b90d4e33a9e7d50000000000000000000000003aeedcd329e91e352d6c3d42c2b90d4e33a9e7d500000000000000000000000000000000000000000000000000470de4df82000000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -13614,0xcd9d4988c0ae61887b075ba77f08cbfad2b65068,0x3f87ff1de58128ef8fcb4c807efd776e1ac72e51,0xf4f7b41a000000000000000000000000891acdefa5f01ab48bf69ff789ce9d3a9997f017000000000000000000000000000000000000000000000002e1b63a18a3938538,,,1,true -13615,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec34000000000000000000000000a5945b102d58b1c2ee3c6c48be47341307b97023000000000000000000000000a5945b102d58b1c2ee3c6c48be47341307b97023000000000000000000000000000000000000000000000000012a0295d08c170000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -13616,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec34000000000000000000000000bca589eee75761cbe808f9663ec62c1ed474bde5000000000000000000000000bca589eee75761cbe808f9663ec62c1ed474bde5000000000000000000000000000000000000000000000000009c184c7555ca0000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -13617,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec340000000000000000000000006a7bcbae98d2e410240045b6e6f2280e9d1523650000000000000000000000006a7bcbae98d2e410240045b6e6f2280e9d1523650000000000000000000000000000000000000000000000000056bf02012295c000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -13622,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0xa9f9e675000000000000000000000000dac17f958d2ee523a2206206994597c13d831ec700000000000000000000000094b008aa00579c1307b0ef2c499ad98a8ce58e58000000000000000000000000e26917d01160f51dc28a58be9e1489b52a3eae67000000000000000000000000e26917d01160f51dc28a58be9e1489b52a3eae67000000000000000000000000000000000000000000000000000000000e5c414e00000000000000000000000000000000000000000000000000000000000000c00000000000000000000000000000000000000000000000000000000000000000,,,1,true -13627,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec34000000000000000000000000970128b339a3223ac799af9c5b07ff15f253ed23000000000000000000000000970128b339a3223ac799af9c5b07ff15f253ed230000000000000000000000000000000000000000000000000040bfdcd201598500000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -13629,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec340000000000000000000000008c6c2c7d3a716ec100b7e3d1a99dbb7cee236b4e0000000000000000000000008c6c2c7d3a716ec100b7e3d1a99dbb7cee236b4e0000000000000000000000000000000000000000000000000249a5da5d34ac7d00000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -13632,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec34000000000000000000000000cf0b30daecb36a1cd35f409d2f219c2384c881b4000000000000000000000000cf0b30daecb36a1cd35f409d2f219c2384c881b4000000000000000000000000000000000000000000000000016b09e3eca3d03d00000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -13633,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec34000000000000000000000000873ec3e237fa0fafece9a1b25c0ad3bc9281adbd000000000000000000000000873ec3e237fa0fafece9a1b25c0ad3bc9281adbd0000000000000000000000000000000000000000000000000005f9a29020782100000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -13635,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec34000000000000000000000000b89c7fe5abe5c2a117e60f6222b88fed7d9d03ec000000000000000000000000b89c7fe5abe5c2a117e60f6222b88fed7d9d03ec00000000000000000000000000000000000000000000000000be2cbc77c47bbc00000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -13638,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0xa9f9e6750000000000000000000000001f9840a85d5af5bf1d1762f925bdaddc4201f9840000000000000000000000006fd9d7ad17242c41f7131d257212c54a0e816691000000000000000000000000c7cb3516ac75e8f2deeb86d831b907952f46fa41000000000000000000000000c7cb3516ac75e8f2deeb86d831b907952f46fa4100000000000000000000000000000000000000000000000012903918324c710400000000000000000000000000000000000000000000000000000000000000c00000000000000000000000000000000000000000000000000000000000000000,,,1,true -13640,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec34000000000000000000000000ba4f59ada21c3a8116f1b3fb644378fe1d7b2c95000000000000000000000000ba4f59ada21c3a8116f1b3fb644378fe1d7b2c9500000000000000000000000000000000000000000000000000afd68e3ec472b100000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -13642,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec34000000000000000000000000df25d35bd400d854006711efeb19a3530570d3cd000000000000000000000000df25d35bd400d854006711efeb19a3530570d3cd000000000000000000000000000000000000000000000000006f45e39ff7b5af00000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -13643,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec34000000000000000000000000cc9a5cdeff2d022a9e910c4c1c7c78e6be666a36000000000000000000000000cc9a5cdeff2d022a9e910c4c1c7c78e6be666a3600000000000000000000000000000000000000000000000000274d351264fc3e00000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,0x3c225aa226963fe3567090b3fb558c0dbdf25b30e4939585a92d126418967345,2022-05-22 18:40:31.000 UTC,0,true -13646,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec34000000000000000000000000bb11a95772ff45df169e8e917eeaeded0c1547d3000000000000000000000000bb11a95772ff45df169e8e917eeaeded0c1547d3000000000000000000000000000000000000000000000000004983bc275496a800000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -13647,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec340000000000000000000000007f7cf5cdc5ef913fa0066225a97f23b776d5821a0000000000000000000000007f7cf5cdc5ef913fa0066225a97f23b776d5821a000000000000000000000000000000000000000000000000006815fbd52c765e00000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -13651,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0xa9f9e675000000000000000000000000a0b86991c6218b36c1d19d4a2e9eb0ce3606eb480000000000000000000000007f5c764cbc14f9669b88837ca1490cca17c31607000000000000000000000000ff393874358530cf9740b5c90f8c9594cc1772ab000000000000000000000000ff393874358530cf9740b5c90f8c9594cc1772ab0000000000000000000000000000000000000000000000000000000009c3428d00000000000000000000000000000000000000000000000000000000000000c00000000000000000000000000000000000000000000000000000000000000000,,,1,true -13652,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec34000000000000000000000000ff393874358530cf9740b5c90f8c9594cc1772ab000000000000000000000000ff393874358530cf9740b5c90f8c9594cc1772ab00000000000000000000000000000000000000000000000001aa535d3d0c000000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -13653,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec3400000000000000000000000051cc2245a1ef254091b081221096ca8df45410a800000000000000000000000051cc2245a1ef254091b081221096ca8df45410a80000000000000000000000000000000000000000000000000005586f1156aeb900000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -13654,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec340000000000000000000000000937e277649d3af92f1fd1393369994ac10b8ed70000000000000000000000000937e277649d3af92f1fd1393369994ac10b8ed700000000000000000000000000000000000000000000000000bbf505a32aad7200000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -13655,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec34000000000000000000000000c0635e38a63c11c7f48cc94f473909d069660056000000000000000000000000c0635e38a63c11c7f48cc94f473909d069660056000000000000000000000000000000000000000000000000005c15d97dbca35a00000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -13657,0x10e6593cdda8c58a1d0f14c5164b376352a55f2f,0x467194771dae2967aef3ecbedd3bf9a310c76c65,0xa9f9e6750000000000000000000000006b175474e89094c44da98b954eedeac495271d0f000000000000000000000000da10009cbd5d07dd0cecc66161fc93d7c9000da1000000000000000000000000e468e0188041203f1617e8d08735c8f00b54d352000000000000000000000000e468e0188041203f1617e8d08735c8f00b54d3520000000000000000000000000000000000000000000001276deeec284f81d93500000000000000000000000000000000000000000000000000000000000000c00000000000000000000000000000000000000000000000000000000000000000,,,1,true -13659,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec34000000000000000000000000d346f2eecfab56f4fcc27b34eab78cce7080198a000000000000000000000000d346f2eecfab56f4fcc27b34eab78cce7080198a00000000000000000000000000000000000000000000000000610c079a612f9900000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,0xa2764bcab55a73f70427f75d6ae4353e2e81c985758b1c6644d5a0dde4b47d84,2022-03-06 11:13:27.000 UTC,0,true -13660,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec340000000000000000000000005d3944d5c30ebacac4b8ad3dc381a1f0ef821e760000000000000000000000005d3944d5c30ebacac4b8ad3dc381a1f0ef821e7600000000000000000000000000000000000000000000000000470de4df82000000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -13662,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec3400000000000000000000000005984000b183c5fc63c0b2e0e86d584ee269cabe00000000000000000000000005984000b183c5fc63c0b2e0e86d584ee269cabe0000000000000000000000000000000000000000000000000032b563be66b5ca00000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -13663,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec3400000000000000000000000038388a70999d3563dabdd906505d5dabce6660a200000000000000000000000038388a70999d3563dabdd906505d5dabce6660a2000000000000000000000000000000000000000000000000000d127a2a235e9100000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -13664,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec34000000000000000000000000f17dc054461600ea83bf571080cdb20cce4c5a22000000000000000000000000f17dc054461600ea83bf571080cdb20cce4c5a22000000000000000000000000000000000000000000000000000aa54ad79d861f00000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -13665,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec340000000000000000000000005314235ba5b766fb8e107c8e8109279264a2308e0000000000000000000000005314235ba5b766fb8e107c8e8109279264a2308e000000000000000000000000000000000000000000000000000c462da7d5ec4000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -13666,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec34000000000000000000000000866742a1f91f5fdbd473741b23acc42248694b51000000000000000000000000866742a1f91f5fdbd473741b23acc42248694b5100000000000000000000000000000000000000000000000000470de4df82000000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -13667,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec340000000000000000000000005c4e3de7c408f9a45592efaa2829d04dd88a3f720000000000000000000000005c4e3de7c408f9a45592efaa2829d04dd88a3f720000000000000000000000000000000000000000000000000033d79a8506582100000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,0x1890d3dd50416293df20b881a1aa75907b64733a2e0be3c72cdc544dd7c1eb66,2021-12-16 14:27:23.000 UTC,0,true -13668,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec3400000000000000000000000018d8b65f80454a74491a1265736a574973d9c78100000000000000000000000018d8b65f80454a74491a1265736a574973d9c78100000000000000000000000000000000000000000000000006f05b59d3b2000000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,0x15617ccc700ee119b063663d2499c41f26b7afe7822a24a808e1ff897caabf91,2022-04-27 01:05:04.000 UTC,0,true -13669,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec34000000000000000000000000bfe440c533f6861c00e71ce187f37a1a70b7b7e9000000000000000000000000bfe440c533f6861c00e71ce187f37a1a70b7b7e9000000000000000000000000000000000000000000000000015e02dbf21fe70000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -13681,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec34000000000000000000000000d9b558d97301783a6e00b27e122fcf4031eb12a6000000000000000000000000d9b558d97301783a6e00b27e122fcf4031eb12a60000000000000000000000000000000000000000000000000012cf779b2516fc00000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -13682,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec340000000000000000000000003c033aab89b26650057881dabbc0815146ffc0f20000000000000000000000003c033aab89b26650057881dabbc0815146ffc0f200000000000000000000000000000000000000000000000006db6291970d97b800000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,0xd61d3c32f39adac31ea52c0efe0074492cda6a8da7d06471be3f854e9dc82ba8,2021-11-24 11:59:22.000 UTC,0,true -13684,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec3400000000000000000000000025ae391a0f8b3254123a0278f599a43d4c44462700000000000000000000000025ae391a0f8b3254123a0278f599a43d4c4446270000000000000000000000000000000000000000000000000139a82c70392ec800000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -13685,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec3400000000000000000000000038720e3787058d56fafa38c0f034a9c94067c28000000000000000000000000038720e3787058d56fafa38c0f034a9c94067c2800000000000000000000000000000000000000000000000000008e1bc9bf0400000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -13686,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec3400000000000000000000000071cc3892dddad179cc6d8c9646ec82d65140f5ee00000000000000000000000071cc3892dddad179cc6d8c9646ec82d65140f5ee00000000000000000000000000000000000000000000000000a18553ee95f38000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -13687,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec340000000000000000000000004a73bfd196ae9e09925efb1ffb3e35593ab183bb0000000000000000000000004a73bfd196ae9e09925efb1ffb3e35593ab183bb000000000000000000000000000000000000000000000000014a81f9106dfd4000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -13689,0xcd9d4988c0ae61887b075ba77f08cbfad2b65068,0x3f87ff1de58128ef8fcb4c807efd776e1ac72e51,0xf4f7b41a000000000000000000000000e7e8336b7023386bdbc7b1f2b000783a463614b40000000000000000000000000000000000000000000000012a21cdfa744d5aa5,,,1,true -13691,0x10e6593cdda8c58a1d0f14c5164b376352a55f2f,0x467194771dae2967aef3ecbedd3bf9a310c76c65,0xa9f9e6750000000000000000000000006b175474e89094c44da98b954eedeac495271d0f000000000000000000000000da10009cbd5d07dd0cecc66161fc93d7c9000da1000000000000000000000000f1ccfa46b1356589ec6361468f3520aff95b21c3000000000000000000000000f1ccfa46b1356589ec6361468f3520aff95b21c300000000000000000000000000000000000000000000001b0da07c7d9262f67700000000000000000000000000000000000000000000000000000000000000c00000000000000000000000000000000000000000000000000000000000000000,,,1,true -13692,0xcd9d4988c0ae61887b075ba77f08cbfad2b65068,0x3f87ff1de58128ef8fcb4c807efd776e1ac72e51,0xf4f7b41a0000000000000000000000002a81579aab05701838b80c826844e618aa023ed4000000000000000000000000000000000000000000000000182fd7d1303545b1,,,1,true -13693,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec34000000000000000000000000a3f686811c223b701ea913b0ae7018c7ae2bd1c5000000000000000000000000a3f686811c223b701ea913b0ae7018c7ae2bd1c500000000000000000000000000000000000000000000000002b4e97044a834d000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -13694,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec34000000000000000000000000b412b96dbe138da98be8e475f632e1a8f0037748000000000000000000000000b412b96dbe138da98be8e475f632e1a8f003774800000000000000000000000000000000000000000000000000082b1cc6bc67c000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -13696,0xcd9d4988c0ae61887b075ba77f08cbfad2b65068,0x3f87ff1de58128ef8fcb4c807efd776e1ac72e51,0xf4f7b41a000000000000000000000000ea82a3403fa84dab71ef6146da215dcc5798e8ce00000000000000000000000000000000000000000000000018362ac6c93984b2,,,1,true -13697,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec3400000000000000000000000080d4d18e9e1407f8b7c6ecee4b7ece6ad847401200000000000000000000000080d4d18e9e1407f8b7c6ecee4b7ece6ad847401200000000000000000000000000000000000000000000000000ac49e2f770474400000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,0xfde3993f48729f1ac7641a629dc64e471cd520651ff43ccb78c576a305dde0a8,2022-03-05 15:20:46.000 UTC,0,true -13698,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec34000000000000000000000000cf8c7f3aef546992c9f8f42900b4ca245ceb5c88000000000000000000000000cf8c7f3aef546992c9f8f42900b4ca245ceb5c880000000000000000000000000000000000000000000000000077040e43ac810000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -13699,0xcd9d4988c0ae61887b075ba77f08cbfad2b65068,0x3f87ff1de58128ef8fcb4c807efd776e1ac72e51,0xf4f7b41a000000000000000000000000b3036b15fcd13d66131f5368c444ffc4cfa9b6db00000000000000000000000000000000000000000000000018368045a0390491,,,1,true -13700,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec34000000000000000000000000b0387235a4b51d1dfc8a9e4eaf864535e8ded7d8000000000000000000000000b0387235a4b51d1dfc8a9e4eaf864535e8ded7d8000000000000000000000000000000000000000000000000000aa87bee53800000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -13701,0xcd9d4988c0ae61887b075ba77f08cbfad2b65068,0x3f87ff1de58128ef8fcb4c807efd776e1ac72e51,0xf4f7b41a000000000000000000000000959db0e23993319053d28a5b9a056237a4eb9e8c0000000000000000000000000000000000000000000000001836acd458210044,,,1,true -13703,0xcd9d4988c0ae61887b075ba77f08cbfad2b65068,0x3f87ff1de58128ef8fcb4c807efd776e1ac72e51,0xf4f7b41a00000000000000000000000004a9337d7376219f7e2e24732b8096d92a079ad700000000000000000000000000000000000000000000000018363f88e61c7c4d,,,1,true -13704,0xcd9d4988c0ae61887b075ba77f08cbfad2b65068,0x3f87ff1de58128ef8fcb4c807efd776e1ac72e51,0xf4f7b41a000000000000000000000000a0f9e61bfd61c4f5ecdf7b5c838f402549d6b9ec0000000000000000000000000000000000000000000000001836544b1db1b9f5,,,1,true -13705,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec3400000000000000000000000039af6952f2fbe751a10f28a63f9f57d65f64e3fa00000000000000000000000039af6952f2fbe751a10f28a63f9f57d65f64e3fa00000000000000000000000000000000000000000000000000487504ba8eba6400000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -13707,0xcd9d4988c0ae61887b075ba77f08cbfad2b65068,0x3f87ff1de58128ef8fcb4c807efd776e1ac72e51,0xf4f7b41a00000000000000000000000043917a8174465dc01522e8e14335eaa2cde33f6f00000000000000000000000000000000000000000000000024b420a32e9e04c7,,,1,true -13708,0xcd9d4988c0ae61887b075ba77f08cbfad2b65068,0x3f87ff1de58128ef8fcb4c807efd776e1ac72e51,0xf4f7b41a00000000000000000000000043917a8174465dc01522e8e14335eaa2cde33f6f000000000000000000000000000000000000000000000000bbcda00c7cf990c2,,,1,true -13711,0x10e6593cdda8c58a1d0f14c5164b376352a55f2f,0x467194771dae2967aef3ecbedd3bf9a310c76c65,0xa9f9e6750000000000000000000000006b175474e89094c44da98b954eedeac495271d0f000000000000000000000000da10009cbd5d07dd0cecc66161fc93d7c9000da100000000000000000000000064f7939b100932308286400b6289e6d2d4d1b46200000000000000000000000064f7939b100932308286400b6289e6d2d4d1b46200000000000000000000000000000000000000000000001044e573f6f154039a00000000000000000000000000000000000000000000000000000000000000c00000000000000000000000000000000000000000000000000000000000000000,,,1,true -13714,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec3400000000000000000000000027b6d3610012461ec0aa3e4bb7155767d77f564f00000000000000000000000027b6d3610012461ec0aa3e4bb7155767d77f564f000000000000000000000000000000000000000000000000004d3a988820a00000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -13717,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec340000000000000000000000008947269c4c2ea8e6b91634d2c2f12c7bdfa95a1b0000000000000000000000008947269c4c2ea8e6b91634d2c2f12c7bdfa95a1b000000000000000000000000000000000000000000000000002fad4006ee84e600000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -13719,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec34000000000000000000000000c516ef1165b6f4f478c3a021d4333e2a1e73658a000000000000000000000000c516ef1165b6f4f478c3a021d4333e2a1e73658a000000000000000000000000000000000000000000000000002386f26fc1000000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,0x2d4e4bb39b094f9dce72f67e8980e19551c2732d6a0dda7834cc4022e4ab85dd,2022-06-19 17:02:51.000 UTC,0,true -13721,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec34000000000000000000000000219518e022f219a79900365b06c9c2a1ff51d767000000000000000000000000219518e022f219a79900365b06c9c2a1ff51d76700000000000000000000000000000000000000000000000000135154eaf46d6400000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,0xff936d8d80b15a29becb8b0cf540cccf61715149b5d6207584ff0da92f7e3513,2022-06-04 04:45:59.000 UTC,0,true -13722,0xcd9d4988c0ae61887b075ba77f08cbfad2b65068,0x3f87ff1de58128ef8fcb4c807efd776e1ac72e51,0xf4f7b41a000000000000000000000000546911aa23511b9b023d4cfa2d97b82f4d423a710000000000000000000000000000000000000000000000003b84acdf3738d5ca,,,1,true -13723,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec34000000000000000000000000aa8532152a2420b253fd775f9ddf482fdbe01061000000000000000000000000aa8532152a2420b253fd775f9ddf482fdbe01061000000000000000000000000000000000000000000000000001c6bf52634000000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -13724,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec34000000000000000000000000a6058d9f92befa23c21a63581daa82a0ade0ec14000000000000000000000000a6058d9f92befa23c21a63581daa82a0ade0ec1400000000000000000000000000000000000000000000000000753d533d96800000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -13725,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec3400000000000000000000000019be4885e21217a78c505713bae6869e3eaa391400000000000000000000000019be4885e21217a78c505713bae6869e3eaa3914000000000000000000000000000000000000000000000000006171551822660000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -13732,0xcd9d4988c0ae61887b075ba77f08cbfad2b65068,0x3f87ff1de58128ef8fcb4c807efd776e1ac72e51,0xf4f7b41a0000000000000000000000008d9793b6bf062146630154b8d59908b470523895000000000000000000000000000000000000000000000000aa487051d17ae4ab,,,1,true -13734,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec34000000000000000000000000ef28d0039f0ef5e859ee969908c4e96bc73ce91c000000000000000000000000ef28d0039f0ef5e859ee969908c4e96bc73ce91c00000000000000000000000000000000000000000000000000038d7ea4c6800000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -13735,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec34000000000000000000000000d2d070dc9389506ec673938ef2a0c9a0f681d414000000000000000000000000d2d070dc9389506ec673938ef2a0c9a0f681d41400000000000000000000000000000000000000000000000004c5dc152f1e801800000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -13737,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec34000000000000000000000000cae337b0c02f21e3785c84949cccd61b9a0ba996000000000000000000000000cae337b0c02f21e3785c84949cccd61b9a0ba996000000000000000000000000000000000000000000000000003c9561de46cfd400000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -13738,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec34000000000000000000000000cc3fd391414bf8f902726d465d2286ffdff91794000000000000000000000000cc3fd391414bf8f902726d465d2286ffdff9179400000000000000000000000000000000000000000000000002386f26fc10000000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -13739,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec340000000000000000000000005f01f75803f329a072a9243b11d7feb1d9ee4ebb0000000000000000000000005f01f75803f329a072a9243b11d7feb1d9ee4ebb000000000000000000000000000000000000000000000000000009184e72a00000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -13743,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec34000000000000000000000000b3e67de00916aca84260b4c243a89e0f5066333e000000000000000000000000b3e67de00916aca84260b4c243a89e0f5066333e000000000000000000000000000000000000000000000000000000e8d4a5100000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -13744,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec34000000000000000000000000b3e67de00916aca84260b4c243a89e0f5066333e000000000000000000000000b3e67de00916aca84260b4c243a89e0f5066333e0000000000000000000000000000000000000000000000000000febd88f4840000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -13745,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec3400000000000000000000000081423ad03f559a3a9ff38737c56b4497d6c7416600000000000000000000000081423ad03f559a3a9ff38737c56b4497d6c741660000000000000000000000000000000000000000000000000000febd88f4840000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -13746,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec340000000000000000000000008e88c5846b3575eb52fa73b622d34c9a7bcadd5f0000000000000000000000008e88c5846b3575eb52fa73b622d34c9a7bcadd5f0000000000000000000000000000000000000000000000000000febd88f4840000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -13747,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec34000000000000000000000000d33b32db98cf814f9117b75a7bb950f8a152c872000000000000000000000000d33b32db98cf814f9117b75a7bb950f8a152c8720000000000000000000000000000000000000000000000000000febd88f4840000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -13748,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec34000000000000000000000000acac85b03ce497fa43af7f39a40b59c749c7f627000000000000000000000000acac85b03ce497fa43af7f39a40b59c749c7f6270000000000000000000000000000000000000000000000000000febd88f4840000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -13749,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec340000000000000000000000008e6bdcfaf5e2d4862ddd85294cc0fa72cb2bfda10000000000000000000000008e6bdcfaf5e2d4862ddd85294cc0fa72cb2bfda10000000000000000000000000000000000000000000000000000febd88f4840000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -13750,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec3400000000000000000000000004f90835defacbaa0c9a44fd2528a53377d20e9b00000000000000000000000004f90835defacbaa0c9a44fd2528a53377d20e9b0000000000000000000000000000000000000000000000000000febd88f4840000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -13751,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec340000000000000000000000002127f3ee6080f0b4dbb1b68ad4e1a2bfcf68f31c0000000000000000000000002127f3ee6080f0b4dbb1b68ad4e1a2bfcf68f31c0000000000000000000000000000000000000000000000000000febd88f4840000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -13752,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec340000000000000000000000003610fedd465abd506fdddc1a27e599a3e60743890000000000000000000000003610fedd465abd506fdddc1a27e599a3e60743890000000000000000000000000000000000000000000000000000febd88f4840000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -13753,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec34000000000000000000000000579fd38a3456c82074be725f1460458c03d723d1000000000000000000000000579fd38a3456c82074be725f1460458c03d723d10000000000000000000000000000000000000000000000000000febd88f4840000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -13754,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec340000000000000000000000001e395cf1acb6ee2815f41485ad1a5ada34180e1e0000000000000000000000001e395cf1acb6ee2815f41485ad1a5ada34180e1e0000000000000000000000000000000000000000000000000000febd88f4840000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -13755,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec34000000000000000000000000b0877fd8349dea069bbe19945eb3ee2ee1919038000000000000000000000000b0877fd8349dea069bbe19945eb3ee2ee19190380000000000000000000000000000000000000000000000000000febd88f4840000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -13756,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec340000000000000000000000002148db985350559e78e4326dcc63b0ee42fb57e70000000000000000000000002148db985350559e78e4326dcc63b0ee42fb57e70000000000000000000000000000000000000000000000000000febd88f4840000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -13757,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec340000000000000000000000001ac1d1b238944e4cc46281899d139e48e36035b00000000000000000000000001ac1d1b238944e4cc46281899d139e48e36035b00000000000000000000000000000000000000000000000000000febd88f4840000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -13758,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec34000000000000000000000000063b8e7d341ca2629db6570e5d17bd137e72a601000000000000000000000000063b8e7d341ca2629db6570e5d17bd137e72a6010000000000000000000000000000000000000000000000000000febd88f4840000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -13759,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec34000000000000000000000000198dcf44001d05c04b5576db43ed22ee9510997f000000000000000000000000198dcf44001d05c04b5576db43ed22ee9510997f000000000000000000000000000000000000000000000000001debae4494100000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -13760,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec3400000000000000000000000051e7be9eec7e86198ae475ccdd5f03319f7522aa00000000000000000000000051e7be9eec7e86198ae475ccdd5f03319f7522aa0000000000000000000000000000000000000000000000000000febd88f4840000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -13762,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec34000000000000000000000000968774c040cf7ab7dd25657ff172d947cd0259d2000000000000000000000000968774c040cf7ab7dd25657ff172d947cd0259d20000000000000000000000000000000000000000000000000000febd88f4840000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -13763,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec34000000000000000000000000dbb1e8d856bffb7d9f28a49106904250ef3f9d80000000000000000000000000dbb1e8d856bffb7d9f28a49106904250ef3f9d800000000000000000000000000000000000000000000000000000febd88f4840000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -13764,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec34000000000000000000000000c1d6068e3cf2d020c26ed9f56375ac6244efbc48000000000000000000000000c1d6068e3cf2d020c26ed9f56375ac6244efbc480000000000000000000000000000000000000000000000000000febd88f4840000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -13765,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec34000000000000000000000000ce9d538cf6f65a62632e4f03811676be17162c68000000000000000000000000ce9d538cf6f65a62632e4f03811676be17162c680000000000000000000000000000000000000000000000000000febd88f4840000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -13766,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec34000000000000000000000000c87ec6959855718a4c20616d4468445df21c2064000000000000000000000000c87ec6959855718a4c20616d4468445df21c206400000000000000000000000000000000000000000000000000acd54e3eccb00000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,0xcac3f812ca41672bafd6d56516aff23e2278a0c620b4b33c47f6b75a699df25f,2022-03-30 08:44:09.000 UTC,0,true -13768,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec34000000000000000000000000315db0a3e7db5ba1a7c5cc7f26cf091ef05bd5c4000000000000000000000000315db0a3e7db5ba1a7c5cc7f26cf091ef05bd5c40000000000000000000000000000000000000000000000000000febd88f4840000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -13769,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec340000000000000000000000005575b51eae681fc57565717ef94f1ead2abe229c0000000000000000000000005575b51eae681fc57565717ef94f1ead2abe229c0000000000000000000000000000000000000000000000000000febd88f4840000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -13770,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec34000000000000000000000000364fae0eec5d11fa906878500c7edcde1466a92e000000000000000000000000364fae0eec5d11fa906878500c7edcde1466a92e0000000000000000000000000000000000000000000000000000ff62d840c00000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -13771,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec340000000000000000000000007cac9ca7914980ea03f30049d7cc34d2dd3aef680000000000000000000000007cac9ca7914980ea03f30049d7cc34d2dd3aef680000000000000000000000000000000000000000000000000000febb34e8a00000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -13772,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec34000000000000000000000000f9f3d4827f881f6c19d4cedfdf7316e7821cef2c000000000000000000000000f9f3d4827f881f6c19d4cedfdf7316e7821cef2c0000000000000000000000000000000000000000000000000000febb34e8a00000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -13773,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec34000000000000000000000000c4b8a67e9f66f0b01fda8d80d869a539b6bc320e000000000000000000000000c4b8a67e9f66f0b01fda8d80d869a539b6bc320e0000000000000000000000000000000000000000000000000000febb34e8a00000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -13774,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec34000000000000000000000000d6d641b2615db1e054aa3fea7a2e4e6427f4f136000000000000000000000000d6d641b2615db1e054aa3fea7a2e4e6427f4f1360000000000000000000000000000000000000000000000000000febb34e8a00000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -13775,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec340000000000000000000000009e0b2662e6474c57f48f597cb4454c4d74e94f0c0000000000000000000000009e0b2662e6474c57f48f597cb4454c4d74e94f0c0000000000000000000000000000000000000000000000000000febb34e8a00000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -13776,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec3400000000000000000000000054483a3074e5b300c9dfd5c291841d34e4a0a3f800000000000000000000000054483a3074e5b300c9dfd5c291841d34e4a0a3f80000000000000000000000000000000000000000000000000000febb34e8a00000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -13777,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec340000000000000000000000003a8dc224d071ea7c895a38ecdb8d4259de3f07940000000000000000000000003a8dc224d071ea7c895a38ecdb8d4259de3f07940000000000000000000000000000000000000000000000000000febb34e8a00000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -13780,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec3400000000000000000000000098bafa71334eae0037d7ce585702d340ece7138300000000000000000000000098bafa71334eae0037d7ce585702d340ece7138300000000000000000000000000000000000000000000000000fa81a83f6d894000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -13781,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec34000000000000000000000000084ba64ffc799272e5d52a724ff8f02cf0555832000000000000000000000000084ba64ffc799272e5d52a724ff8f02cf0555832000000000000000000000000000000000000000000000000011c68878f6c5d0c00000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -13784,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec34000000000000000000000000a2805dfd8a541b38493e2ebd5934e22ff106af5f000000000000000000000000a2805dfd8a541b38493e2ebd5934e22ff106af5f00000000000000000000000000000000000000000000000000ac9856716fe20000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -13786,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec34000000000000000000000000676e1705c3550dec29f2e03f6267f893af664d0c000000000000000000000000676e1705c3550dec29f2e03f6267f893af664d0c000000000000000000000000000000000000000000000000000db996be0d158000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -13792,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec34000000000000000000000000932adf2d3cea3c8238580e81ecfa79c0ad6032b3000000000000000000000000932adf2d3cea3c8238580e81ecfa79c0ad6032b3000000000000000000000000000000000000000000000000014ccbb8a6c358e000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -13796,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0xa9f9e675000000000000000000000000a0b86991c6218b36c1d19d4a2e9eb0ce3606eb480000000000000000000000007f5c764cbc14f9669b88837ca1490cca17c31607000000000000000000000000de0004eb5a2dfea5f5789c253da23cfe1c68a9f9000000000000000000000000de0004eb5a2dfea5f5789c253da23cfe1c68a9f90000000000000000000000000000000000000000000000000000000003f4797100000000000000000000000000000000000000000000000000000000000000c00000000000000000000000000000000000000000000000000000000000000000,,,1,true -13797,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec340000000000000000000000008aa77780e81dc51f8f90b80210aafa5b44be28010000000000000000000000008aa77780e81dc51f8f90b80210aafa5b44be280100000000000000000000000000000000000000000000000000ce4752812b3ea200000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -13801,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec3400000000000000000000000032181bedfcc11d5a14e23955fe5560b2ac46407600000000000000000000000032181bedfcc11d5a14e23955fe5560b2ac4640760000000000000000000000000000000000000000000000000de0b6b3a764000000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -13803,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec34000000000000000000000000e575233ed38f45c14d18205e6dc4bdbfeca637e4000000000000000000000000e575233ed38f45c14d18205e6dc4bdbfeca637e400000000000000000000000000000000000000000000000001576ce67541b1a500000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -13804,0xcd9d4988c0ae61887b075ba77f08cbfad2b65068,0x3f87ff1de58128ef8fcb4c807efd776e1ac72e51,0xf4f7b41a000000000000000000000000d861415f6703ab50ce101c7e6f6a80ada1fc2b1c0000000000000000000000000000000000000000000000006c8f76ad9111a6a6,0xe7606f11a82d9e2a5679cba45f79bd2a371104be26201346e9060b9ce7abde76,2022-02-14 01:13:29.000 UTC,0,true -13809,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec3400000000000000000000000041337285f9c00a3b2f7224cb2f591313ee1fb0f300000000000000000000000041337285f9c00a3b2f7224cb2f591313ee1fb0f300000000000000000000000000000000000000000000000000005af3107a400000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -13814,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec340000000000000000000000003dc29113a1fe2299714c1bbb855fba8bb0b4415c0000000000000000000000003dc29113a1fe2299714c1bbb855fba8bb0b4415c00000000000000000000000000000000000000000000000000502b04164c3e5100000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -13817,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec3400000000000000000000000076e2c6d6f961168dd892516438ec807933d0941f00000000000000000000000076e2c6d6f961168dd892516438ec807933d0941f000000000000000000000000000000000000000000000000034623d158f4acf000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,0x2e741cfb75495cb4293eee5a00b5a456c591d58d0fa06660dcc11aa5a37bfe1a,2021-11-27 22:06:02.000 UTC,0,true -13818,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec340000000000000000000000008f7c16d37a07ffd7e570533015a439c805fcb2c00000000000000000000000008f7c16d37a07ffd7e570533015a439c805fcb2c00000000000000000000000000000000000000000000000000020a41ec34825b100000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -13819,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec34000000000000000000000000c04d107c3f21d215772ead8af02d3f4f2321fcd4000000000000000000000000c04d107c3f21d215772ead8af02d3f4f2321fcd40000000000000000000000000000000000000000000000000017b0f70c6e41d000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -13821,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec340000000000000000000000002e8a40add5f9c5ba0745be38444e96c63d0d9b8b0000000000000000000000002e8a40add5f9c5ba0745be38444e96c63d0d9b8b00000000000000000000000000000000000000000000000002ea11e32ad5000000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -13822,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec34000000000000000000000000ae60da5f4f1ae7a4f18e5632f389ade1d1a8bcb2000000000000000000000000ae60da5f4f1ae7a4f18e5632f389ade1d1a8bcb200000000000000000000000000000000000000000000000000612d1b3a71de8f00000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -13823,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec34000000000000000000000000d6b30aba25fadd6acc0a7b314004ddc18cb35311000000000000000000000000d6b30aba25fadd6acc0a7b314004ddc18cb35311000000000000000000000000000000000000000000000000004e30757b97b51000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -13824,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec34000000000000000000000000dd3858559b8bf543333fbce1af7dde964f0f9461000000000000000000000000dd3858559b8bf543333fbce1af7dde964f0f94610000000000000000000000000000000000000000000000000153e6baf037079d00000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,0x346255597474201c3b0e665385377fbe23a924de8a6ec8825de979a46065c31b,2021-11-24 22:47:29.000 UTC,0,true -13825,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec340000000000000000000000001bece8c246e30d9067c9b0975651429e4d59c8800000000000000000000000001bece8c246e30d9067c9b0975651429e4d59c8800000000000000000000000000000000000000000000000000009edfebeb9a2a200000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -13826,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec340000000000000000000000002c46cfa41efdcef6e2f29da3b9303f67534b028b0000000000000000000000002c46cfa41efdcef6e2f29da3b9303f67534b028b000000000000000000000000000000000000000000000000000b0b49e6f8bfcd00000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -13827,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec3400000000000000000000000038dbb1eb69ba4e66e6c76526a30a537a584e5cc500000000000000000000000038dbb1eb69ba4e66e6c76526a30a537a584e5cc50000000000000000000000000000000000000000000000000009bb6122162f8400000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -13828,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec34000000000000000000000000d71da19b58b32781f67a5c22336b200f9c7ddf21000000000000000000000000d71da19b58b32781f67a5c22336b200f9c7ddf21000000000000000000000000000000000000000000000000000c2acd124a86c700000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -13830,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec3400000000000000000000000087fa43b5647d4d98c073de139ee4339394f349b200000000000000000000000087fa43b5647d4d98c073de139ee4339394f349b2000000000000000000000000000000000000000000000000000861316f5e3fe500000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -13832,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec340000000000000000000000003510bc6a39ef985c35b1562c610de464e45f025a0000000000000000000000003510bc6a39ef985c35b1562c610de464e45f025a000000000000000000000000000000000000000000000000000b9f7e5c6b7ae200000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -13833,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec340000000000000000000000001bb2aff9a50bd3fa0ec4c780198e6cc8f7dd068a0000000000000000000000001bb2aff9a50bd3fa0ec4c780198e6cc8f7dd068a00000000000000000000000000000000000000000000000000136d4d067f418600000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -13834,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec3400000000000000000000000027b77419682e8ff5c992c8663e3d3bfe8971256a00000000000000000000000027b77419682e8ff5c992c8663e3d3bfe8971256a0000000000000000000000000000000000000000000000000138757658ff9cca00000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -13836,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec34000000000000000000000000e2de13ed36177ad43cb2a399f8c53de407b13ab9000000000000000000000000e2de13ed36177ad43cb2a399f8c53de407b13ab90000000000000000000000000000000000000000000000000166e6438dabbe6800000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -13838,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec34000000000000000000000000471d854855c9bd2c92ff45c68dfdf35181c97993000000000000000000000000471d854855c9bd2c92ff45c68dfdf35181c9799300000000000000000000000000000000000000000000000000f9825970e4d10a00000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -13839,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec340000000000000000000000009e4d25d4d44899d53506464a7f8996ae9cc958f10000000000000000000000009e4d25d4d44899d53506464a7f8996ae9cc958f1000000000000000000000000000000000000000000000000000f401378df49cf00000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -13841,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec340000000000000000000000009ccb308c9f732f66b776e07805ea2109f9b1006e0000000000000000000000009ccb308c9f732f66b776e07805ea2109f9b1006e000000000000000000000000000000000000000000000000001e49d06674695d00000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -13842,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec34000000000000000000000000a06f48cf3780a5d1cfb243644249840ab459c82e000000000000000000000000a06f48cf3780a5d1cfb243644249840ab459c82e0000000000000000000000000000000000000000000000000016c60d3d244be900000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -13843,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec340000000000000000000000007f149bdfbf2d9ae300c8610b192c0faf4ea5dea50000000000000000000000007f149bdfbf2d9ae300c8610b192c0faf4ea5dea50000000000000000000000000000000000000000000000000019baa30756ddc400000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -13844,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec340000000000000000000000009da41a6beaf774ef78aaac226a946a5034aac85f0000000000000000000000009da41a6beaf774ef78aaac226a946a5034aac85f00000000000000000000000000000000000000000000000000198de0adb8596400000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -13845,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec3400000000000000000000000068ac76e092bd073864fc908f51199660157b16aa00000000000000000000000068ac76e092bd073864fc908f51199660157b16aa000000000000000000000000000000000000000000000000000928335ad9cb7000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -13846,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec340000000000000000000000004dd1e277bb273ef3b3b7ededb34e39ca90c0844d0000000000000000000000004dd1e277bb273ef3b3b7ededb34e39ca90c0844d0000000000000000000000000000000000000000000000000017ffb6218e529c00000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -13847,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec34000000000000000000000000540e17ccb9a4b9ab23cd9eea1f129b1343bbe89e000000000000000000000000540e17ccb9a4b9ab23cd9eea1f129b1343bbe89e00000000000000000000000000000000000000000000000000a41711cab156d100000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,0x14572f42cfe04bdd8774ef2881e449c612b96a7d0304335d1c2d5bd37b3ff0ca,2021-11-29 10:48:38.000 UTC,0,true -13848,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec3400000000000000000000000062c7bdc15d4c0a02d0a9f7c169c098ef9f44a98100000000000000000000000062c7bdc15d4c0a02d0a9f7c169c098ef9f44a98100000000000000000000000000000000000000000000000000182af521455e1700000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -13849,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec340000000000000000000000006d76503e7e454be25378f7a881c3737b2b21c9590000000000000000000000006d76503e7e454be25378f7a881c3737b2b21c959000000000000000000000000000000000000000000000000058d15e17628000000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -13856,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec34000000000000000000000000c9e52a623a6a19f16bde2cd0aa16df7bc2acc1ee000000000000000000000000c9e52a623a6a19f16bde2cd0aa16df7bc2acc1ee00000000000000000000000000000000000000000000000000005af3107a400000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -13863,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec34000000000000000000000000f77b1e693cc7ca589de9c75eec759448dc5ee74d000000000000000000000000f77b1e693cc7ca589de9c75eec759448dc5ee74d0000000000000000000000000000000000000000000000000003931a2b1ebf0000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -13866,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec340000000000000000000000003f7c14e402fcc3864d6e1ae1c4747ff1805d05120000000000000000000000003f7c14e402fcc3864d6e1ae1c4747ff1805d051200000000000000000000000000000000000000000000000000644d9f94d6221400000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,0x88455eec9c3283bcccbd41feb50e0cfb8b9fa7dd581ee88d8c7094dfda096ebb,2022-07-28 02:22:29.000 UTC,0,true -13869,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec340000000000000000000000004b0c28517d4f12024c61e8b5a4d09ad44cb876540000000000000000000000004b0c28517d4f12024c61e8b5a4d09ad44cb87654000000000000000000000000000000000000000000000000014a5449159dd40f00000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -13870,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec34000000000000000000000000386fc57656d7e2ef7a64d4b2d8586fc76b1a5921000000000000000000000000386fc57656d7e2ef7a64d4b2d8586fc76b1a5921000000000000000000000000000000000000000000000000014a5449159dd40f00000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -13876,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec34000000000000000000000000acd74381d49863a7d894e65d1a169bad28d4518d000000000000000000000000acd74381d49863a7d894e65d1a169bad28d4518d000000000000000000000000000000000000000000000000009a7270a91f654f00000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -13879,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec340000000000000000000000000aa911d5c666ba32641c88f902db24c2072c61c40000000000000000000000000aa911d5c666ba32641c88f902db24c2072c61c4000000000000000000000000000000000000000000000000007d39215ee4bd4700000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -13883,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec3400000000000000000000000046aef1f4da528d1fcf08ed3168e6dd0162b0caef00000000000000000000000046aef1f4da528d1fcf08ed3168e6dd0162b0caef00000000000000000000000000000000000000000000000001637522d0bcbf9100000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -13884,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec3400000000000000000000000045eb6f503216a9e790004ff9826a0ccc8354ff3600000000000000000000000045eb6f503216a9e790004ff9826a0ccc8354ff3600000000000000000000000000000000000000000000000000a44f12b27a2a7400000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -13886,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec34000000000000000000000000dd884503024358c06d20d286fe7abc99c1ab6fb3000000000000000000000000dd884503024358c06d20d286fe7abc99c1ab6fb30000000000000000000000000000000000000000000000000000feaae895640000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -13887,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec340000000000000000000000006c72bc234ee8da7c547fedaffe8fcc3b341594550000000000000000000000006c72bc234ee8da7c547fedaffe8fcc3b341594550000000000000000000000000000000000000000000000000000feaae895640000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -13888,0xcd9d4988c0ae61887b075ba77f08cbfad2b65068,0x3f87ff1de58128ef8fcb4c807efd776e1ac72e51,0xf4f7b41a00000000000000000000000069688011f03577887b75d392d207eb11281bab20000000000000000000000000000000000000000000000001043561a882930000,,,1,true -13889,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec340000000000000000000000007571eb1e3a18317a87f8d643aa72b921dc228fad0000000000000000000000007571eb1e3a18317a87f8d643aa72b921dc228fad0000000000000000000000000000000000000000000000000000feaae895640000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -13890,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec340000000000000000000000007ca8e720077bdd6066b2a346de9f450357eff1c50000000000000000000000007ca8e720077bdd6066b2a346de9f450357eff1c50000000000000000000000000000000000000000000000000000feaae895640000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -13891,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec34000000000000000000000000a70716545fa4557e08f21638da33ef1298840e7f000000000000000000000000a70716545fa4557e08f21638da33ef1298840e7f0000000000000000000000000000000000000000000000000000feaae895640000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -13893,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec34000000000000000000000000657b8bf0f4e281d832766b5943a91740a36b34e0000000000000000000000000657b8bf0f4e281d832766b5943a91740a36b34e00000000000000000000000000000000000000000000000000000feaae895640000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -13894,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec340000000000000000000000003763f804c7b15159fb1e0a9ab4fb5f552a179dd90000000000000000000000003763f804c7b15159fb1e0a9ab4fb5f552a179dd90000000000000000000000000000000000000000000000000000feaae895640000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -13895,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec3400000000000000000000000037f0311939fa7cd463a576e6c46e0a35fe562b5d00000000000000000000000037f0311939fa7cd463a576e6c46e0a35fe562b5d0000000000000000000000000000000000000000000000000000feaae895640000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -13896,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec340000000000000000000000000e6fc4bd7c821d191a210c1fd9a0738c4f73afbc0000000000000000000000000e6fc4bd7c821d191a210c1fd9a0738c4f73afbc0000000000000000000000000000000000000000000000000000feaae895640000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -13897,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec34000000000000000000000000d2c108451ef9a340ca738e470c874c4cc55b561a000000000000000000000000d2c108451ef9a340ca738e470c874c4cc55b561a0000000000000000000000000000000000000000000000000000feaae895640000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -13898,0xcd9d4988c0ae61887b075ba77f08cbfad2b65068,0x3f87ff1de58128ef8fcb4c807efd776e1ac72e51,0xf4f7b41a0000000000000000000000002abf33485edf704511dfa42dfb8afa71a0450a8e000000000000000000000000000000000000000000000000055a2966fa1696f2,,,1,true -13899,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec340000000000000000000000007eb0e5d522e3e1e5127bb41712744636b8c5485e0000000000000000000000007eb0e5d522e3e1e5127bb41712744636b8c5485e0000000000000000000000000000000000000000000000000000feaae895640000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -13900,0xcd9d4988c0ae61887b075ba77f08cbfad2b65068,0x3f87ff1de58128ef8fcb4c807efd776e1ac72e51,0xf4f7b41a0000000000000000000000002abf33485edf704511dfa42dfb8afa71a0450a8e00000000000000000000000000000000000000000000000008868d4cad4d690e,,,1,true -13902,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec34000000000000000000000000926db61b0dc59db81b2030e98a9887442e1ab9e7000000000000000000000000926db61b0dc59db81b2030e98a9887442e1ab9e70000000000000000000000000000000000000000000000000000feaae895640000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -13903,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec340000000000000000000000008be8b54bf1891e9cf5c7524ee145fdf112ac5da50000000000000000000000008be8b54bf1891e9cf5c7524ee145fdf112ac5da50000000000000000000000000000000000000000000000000000feaae895640000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -13905,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec34000000000000000000000000e583c8c7ec232d3bc00d8667f26c003b5032b6a3000000000000000000000000e583c8c7ec232d3bc00d8667f26c003b5032b6a30000000000000000000000000000000000000000000000000000febb34e8a00000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -13906,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec34000000000000000000000000e583c8c7ec232d3bc00d8667f26c003b5032b6a3000000000000000000000000e583c8c7ec232d3bc00d8667f26c003b5032b6a30000000000000000000000000000000000000000000000000000fed27d5f880000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -13907,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec34000000000000000000000000ed7bdd301418b06d96c895e4a1e68cf200d34389000000000000000000000000ed7bdd301418b06d96c895e4a1e68cf200d343890000000000000000000000000000000000000000000000000000fed27d5f880000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -13908,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec34000000000000000000000000fb998faf59b246cd6001772d44a265d16e5c0804000000000000000000000000fb998faf59b246cd6001772d44a265d16e5c08040000000000000000000000000000000000000000000000000000fed27d5f880000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -13909,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec34000000000000000000000000ac3cfb3d1ad099597474ec2a663aa3cac0a2c4d5000000000000000000000000ac3cfb3d1ad099597474ec2a663aa3cac0a2c4d50000000000000000000000000000000000000000000000000000fed27d5f880000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -13911,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec3400000000000000000000000038ea73c4299b86c733f7fb11b7ddc4f5bbc46e0b00000000000000000000000038ea73c4299b86c733f7fb11b7ddc4f5bbc46e0b0000000000000000000000000000000000000000000000000000fed27d5f880000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -13912,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec34000000000000000000000000f582a5819feab1c4e50c1da34405dd36f7300228000000000000000000000000f582a5819feab1c4e50c1da34405dd36f73002280000000000000000000000000000000000000000000000000000fed27d5f880000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -13913,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec34000000000000000000000000efabd4c414a7d5a5bafc3328c031e0bbe0b26524000000000000000000000000efabd4c414a7d5a5bafc3328c031e0bbe0b265240000000000000000000000000000000000000000000000000000fed27d5f880000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -13914,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec34000000000000000000000000378b280e96d6370dc5b2ba090a9add33d91c86fd000000000000000000000000378b280e96d6370dc5b2ba090a9add33d91c86fd00000000000000000000000000000000000000000000000002385215c8c1209500000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,0x1ae8f8565d9e807e12e54b888cc048314c3edd78c84306b8eb697db5b534f8e3,2022-04-09 09:21:29.000 UTC,0,true -13915,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec34000000000000000000000000ea581366ef46df7d2bb6a6b33718e5a2c25bbf41000000000000000000000000ea581366ef46df7d2bb6a6b33718e5a2c25bbf410000000000000000000000000000000000000000000000000000fed27d5f880000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -13916,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec34000000000000000000000000c97aec31eb8cfd2276296b8e4752ba8bf07d1772000000000000000000000000c97aec31eb8cfd2276296b8e4752ba8bf07d17720000000000000000000000000000000000000000000000000000fed27d5f880000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -13917,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec340000000000000000000000005b3e9cb38c3f3b2c9b32ea0b45cb1b84145845480000000000000000000000005b3e9cb38c3f3b2c9b32ea0b45cb1b84145845480000000000000000000000000000000000000000000000000000fed27d5f880000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -13918,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec34000000000000000000000000c778b86a9d91cbabd36277088024c24660de1ccc000000000000000000000000c778b86a9d91cbabd36277088024c24660de1ccc0000000000000000000000000000000000000000000000000061743c7719340d00000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -13919,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec34000000000000000000000000b73ecf578f050e9a1355b9c7e568c69660b3c1a3000000000000000000000000b73ecf578f050e9a1355b9c7e568c69660b3c1a30000000000000000000000000000000000000000000000000000fed27d5f880000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -13920,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec3400000000000000000000000094bfc5aae1a892c10387f2f7b45f76522f318ade00000000000000000000000094bfc5aae1a892c10387f2f7b45f76522f318ade0000000000000000000000000000000000000000000000000027385e23e4e40000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -13921,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec34000000000000000000000000a56b43ca0fa370e227e04f892bb1168e32805c47000000000000000000000000a56b43ca0fa370e227e04f892bb1168e32805c470000000000000000000000000000000000000000000000000000fed27d5f880000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -13922,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec34000000000000000000000000ed991ee4ebd2a9fc687faaa9834bb867b0f57d0c000000000000000000000000ed991ee4ebd2a9fc687faaa9834bb867b0f57d0c0000000000000000000000000000000000000000000000000000fed27d5f880000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -13923,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec3400000000000000000000000020d0b2841ea0f89a709e0b7c9abce1321edf084200000000000000000000000020d0b2841ea0f89a709e0b7c9abce1321edf08420000000000000000000000000000000000000000000000000001c6bf5263400000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -13924,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec34000000000000000000000000b346d91dfccbd53a43b4003a99f30c729412d15d000000000000000000000000b346d91dfccbd53a43b4003a99f30c729412d15d0000000000000000000000000000000000000000000000000000fed27d5f880000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -13925,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec34000000000000000000000000e9331396e253c39691ae73ac7da5127048e6a5bc000000000000000000000000e9331396e253c39691ae73ac7da5127048e6a5bc000000000000000000000000000000000000000000000000000009184e72a00000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -13926,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec34000000000000000000000000089d2fe7fd0bd029d0d1ddad4619a555a46ef4f5000000000000000000000000089d2fe7fd0bd029d0d1ddad4619a555a46ef4f50000000000000000000000000000000000000000000000000000fed27d5f880000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -13928,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec3400000000000000000000000093806f29ccf0c6d992107913f24c0796cada5d5800000000000000000000000093806f29ccf0c6d992107913f24c0796cada5d58000000000000000000000000000000000000000000000000000009184e72a00000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -13929,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec340000000000000000000000007428573fe900b09aee5d11913e81053cf386029c0000000000000000000000007428573fe900b09aee5d11913e81053cf386029c000000000000000000000000000000000000000000000000000009184e72a00000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -13930,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec340000000000000000000000006f71ade9a6f0e548b4c54fe6333c44acaa0277070000000000000000000000006f71ade9a6f0e548b4c54fe6333c44acaa027707000000000000000000000000000000000000000000000000000009184e72a00000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -13931,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec340000000000000000000000008b5a2ab94fa6065ec4d66a78b21be36c699d2bb80000000000000000000000008b5a2ab94fa6065ec4d66a78b21be36c699d2bb8000000000000000000000000000000000000000000000000000009184e72a00000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -13932,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec3400000000000000000000000049ac0a98c73a9da0d722c2d44dc2b6c261cf793600000000000000000000000049ac0a98c73a9da0d722c2d44dc2b6c261cf7936000000000000000000000000000000000000000000000000000009184e72a00000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -13933,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec34000000000000000000000000a33defcd8507b606bb1776246e24b9ac81de3e2b000000000000000000000000a33defcd8507b606bb1776246e24b9ac81de3e2b0000000000000000000000000000000000000000000000000000fed27d5f880000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -13934,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec340000000000000000000000004221eb734ecbbb279f356679edbee5bf21481fae0000000000000000000000004221eb734ecbbb279f356679edbee5bf21481fae000000000000000000000000000000000000000000000000000009184e72a00000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -13935,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec34000000000000000000000000ff1b8bd40f333a3daf9f2f5326e11ae38ca74249000000000000000000000000ff1b8bd40f333a3daf9f2f5326e11ae38ca74249000000000000000000000000000000000000000000000000000009184e72a00000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -13937,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec34000000000000000000000000adbc690ea8138a409cfaf4ad20c4687d437a8b7d000000000000000000000000adbc690ea8138a409cfaf4ad20c4687d437a8b7d000000000000000000000000000000000000000000000000000009184e72a00000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -13938,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec34000000000000000000000000d7cd515939a31a2880bf4d98ff01d0c98fe06c89000000000000000000000000d7cd515939a31a2880bf4d98ff01d0c98fe06c89000000000000000000000000000000000000000000000000000009184e72a00000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -13939,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec34000000000000000000000000b9d046134839453197704912587376e4d6fd4173000000000000000000000000b9d046134839453197704912587376e4d6fd4173000000000000000000000000000000000000000000000000000009184e72a00000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -13940,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec340000000000000000000000007ff1bd9e54a04c1d3a506ce65a310257165cfc1e0000000000000000000000007ff1bd9e54a04c1d3a506ce65a310257165cfc1e000000000000000000000000000000000000000000000000000009184e72a00000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -13941,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec340000000000000000000000006be80aa1185f13ad6413892a8cb011fe98607ad20000000000000000000000006be80aa1185f13ad6413892a8cb011fe98607ad2000000000000000000000000000000000000000000000000000009184e72a00000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -13942,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec340000000000000000000000007061ff738f5a687391033dfac6a13b319d01853c0000000000000000000000007061ff738f5a687391033dfac6a13b319d01853c0000000000000000000000000000000000000000000000000000fed27d5f880000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -13943,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec340000000000000000000000008a7f3bb21c1294ce86363c749d863de828fd8a420000000000000000000000008a7f3bb21c1294ce86363c749d863de828fd8a42000000000000000000000000000000000000000000000000000009184e72a00000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -13944,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec34000000000000000000000000b87445dae401ee96d23c1a764df0e51f5c0c7e00000000000000000000000000b87445dae401ee96d23c1a764df0e51f5c0c7e00000000000000000000000000000000000000000000000000000009184e72a00000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -13945,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec34000000000000000000000000dc619ccbe3767e9879795f503bdc307bf0471cdf000000000000000000000000dc619ccbe3767e9879795f503bdc307bf0471cdf000000000000000000000000000000000000000000000000000009184e72a00000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -13946,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec34000000000000000000000000d446d0f677aabc963e45a7e0282794dd382a56cb000000000000000000000000d446d0f677aabc963e45a7e0282794dd382a56cb000000000000000000000000000000000000000000000000000009184e72a00000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -13947,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec34000000000000000000000000c65af1aed293190166f140040c519264b82d97d3000000000000000000000000c65af1aed293190166f140040c519264b82d97d3000000000000000000000000000000000000000000000000000009184e72a00000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -13948,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec3400000000000000000000000013738ebdd225434c565d57166e557ce07e49f57a00000000000000000000000013738ebdd225434c565d57166e557ce07e49f57a000000000000000000000000000000000000000000000000000009184e72a00000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -13949,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec3400000000000000000000000055c74e5d2e12ff0a0aeafd8ddc4cc438b3ec490a00000000000000000000000055c74e5d2e12ff0a0aeafd8ddc4cc438b3ec490a000000000000000000000000000000000000000000000000000009184e72a00000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -13950,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec340000000000000000000000003699c0bdeb3d7489ef9123947afa7de57552226b0000000000000000000000003699c0bdeb3d7489ef9123947afa7de57552226b000000000000000000000000000000000000000000000000000009184e72a00000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -13951,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec34000000000000000000000000ea22ec383782641db5112198c11b1f782c1bb0b1000000000000000000000000ea22ec383782641db5112198c11b1f782c1bb0b1000000000000000000000000000000000000000000000000000009184e72a00000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -13952,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec340000000000000000000000008760e69e17351123d13d2a9102d3d787bed1206c0000000000000000000000008760e69e17351123d13d2a9102d3d787bed1206c000000000000000000000000000000000000000000000000000009184e72a00000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -13953,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec340000000000000000000000006ce972a8b898a1ec6f6a1f2254065a2e8edc943f0000000000000000000000006ce972a8b898a1ec6f6a1f2254065a2e8edc943f0000000000000000000000000000000000000000000000000000fed27d5f880000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -13954,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec3400000000000000000000000072cd5ab60d1494759ba1b76d8bbc732ae0e7a52700000000000000000000000072cd5ab60d1494759ba1b76d8bbc732ae0e7a527000000000000000000000000000000000000000000000000000009184e72a00000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -13955,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec34000000000000000000000000dcb876ccb0408266f75fe8ce7d19f15a5a25dc68000000000000000000000000dcb876ccb0408266f75fe8ce7d19f15a5a25dc68000000000000000000000000000000000000000000000000000009184e72a00000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -13956,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec340000000000000000000000001905bc213f329050fccfd8688a37f072c0ad522e0000000000000000000000001905bc213f329050fccfd8688a37f072c0ad522e000000000000000000000000000000000000000000000000000009184e72a00000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -13957,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec340000000000000000000000008a434cc9e0171d0dffc624268c34bc21fa827fcb0000000000000000000000008a434cc9e0171d0dffc624268c34bc21fa827fcb000000000000000000000000000000000000000000000000000009184e72a00000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -13958,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec340000000000000000000000004596fe685ee632aec056a39801c5c7cac7489f2f0000000000000000000000004596fe685ee632aec056a39801c5c7cac7489f2f000000000000000000000000000000000000000000000000000009184e72a00000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -13959,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec3400000000000000000000000043b438a636f6b7b5119caf80d0847f79b9f51b2200000000000000000000000043b438a636f6b7b5119caf80d0847f79b9f51b22000000000000000000000000000000000000000000000000000009184e72a00000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -13960,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec34000000000000000000000000a638b0cda2eb11f6481d93f49c9399c19e65ce94000000000000000000000000a638b0cda2eb11f6481d93f49c9399c19e65ce94000000000000000000000000000000000000000000000000000009184e72a00000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -13961,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec3400000000000000000000000054007de4177bdeb85934fd2d1b58b1082b6fb7bb00000000000000000000000054007de4177bdeb85934fd2d1b58b1082b6fb7bb000000000000000000000000000000000000000000000000000009184e72a00000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -13962,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec340000000000000000000000001517de48b5afccc8c676fdd99d0a6c4b1a1506a60000000000000000000000001517de48b5afccc8c676fdd99d0a6c4b1a1506a60000000000000000000000000000000000000000000000000000fed27d5f880000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -13963,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec34000000000000000000000000c10c3d54383c213b87bd41cc78f4a813d8cea24a000000000000000000000000c10c3d54383c213b87bd41cc78f4a813d8cea24a000000000000000000000000000000000000000000000000000009184e72a00000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -13964,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec340000000000000000000000002e59a8903894d1871765123a8e0e4a9188ce0bdf0000000000000000000000002e59a8903894d1871765123a8e0e4a9188ce0bdf000000000000000000000000000000000000000000000000000009184e72a00000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -13965,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec34000000000000000000000000f0a661b2648b4a39af50ca869ea718e9379df487000000000000000000000000f0a661b2648b4a39af50ca869ea718e9379df487000000000000000000000000000000000000000000000000000009184e72a00000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -13966,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec34000000000000000000000000d615d68db3b7f5a9ee4223e9cf4e213e56cb5412000000000000000000000000d615d68db3b7f5a9ee4223e9cf4e213e56cb5412000000000000000000000000000000000000000000000000000009184e72a00000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -13967,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec340000000000000000000000000ad1c55b19ad189562ab039198bc5259e41598ab0000000000000000000000000ad1c55b19ad189562ab039198bc5259e41598ab000000000000000000000000000000000000000000000000000009184e72a00000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -13968,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec34000000000000000000000000e431058e8937788e0a2b22a3037dd6c7243ec260000000000000000000000000e431058e8937788e0a2b22a3037dd6c7243ec260000000000000000000000000000000000000000000000000000009184e72a00000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -13969,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec34000000000000000000000000a9cf89096b79fc10ef3f175c5094dba8219dcad4000000000000000000000000a9cf89096b79fc10ef3f175c5094dba8219dcad4000000000000000000000000000000000000000000000000000009184e72a00000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -13970,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec34000000000000000000000000d72a737be8c884a5f93908b7257d1e5d186ec987000000000000000000000000d72a737be8c884a5f93908b7257d1e5d186ec987000000000000000000000000000000000000000000000000000009184e72a00000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -13971,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec3400000000000000000000000070e8e9e531eba77eddd0c6c42080a077254e435400000000000000000000000070e8e9e531eba77eddd0c6c42080a077254e43540000000000000000000000000000000000000000000000000000fed27d5f880000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -13972,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec34000000000000000000000000910b8e7f2e20e6899ad8d94b20aac648140213fe000000000000000000000000910b8e7f2e20e6899ad8d94b20aac648140213fe0000000000000000000000000000000000000000000000000000fed27d5f880000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -13973,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec34000000000000000000000000491cdd0df6458128de36676840b9f03e13444d68000000000000000000000000491cdd0df6458128de36676840b9f03e13444d6800000000000000000000000000000000000000000000000000005af3107a400000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -13974,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec34000000000000000000000000a049828c4c731619b712a85f7206c97654c98588000000000000000000000000a049828c4c731619b712a85f7206c97654c9858800000000000000000000000000000000000000000000000000005af3107a400000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -13975,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec3400000000000000000000000051352c34e58a430d0e2dd96baea5076b956d543200000000000000000000000051352c34e58a430d0e2dd96baea5076b956d54320000000000000000000000000000000000000000000000000000fed27d5f880000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -13976,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec340000000000000000000000004950c1b741e7db211c9934dc1c8af912e0af6d010000000000000000000000004950c1b741e7db211c9934dc1c8af912e0af6d010000000000000000000000000000000000000000000000000000fed27d5f880000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -13977,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec340000000000000000000000003b6cf92855c9e36b82babc001dfae0ae00837edf0000000000000000000000003b6cf92855c9e36b82babc001dfae0ae00837edf0000000000000000000000000000000000000000000000000000fed27d5f880000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -13978,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec340000000000000000000000004bb1236ea6dafe4e96e9f89c19e1cfbe080bd26e0000000000000000000000004bb1236ea6dafe4e96e9f89c19e1cfbe080bd26e0000000000000000000000000000000000000000000000000000fed27d5f880000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -13980,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec34000000000000000000000000731bdb08cdb43b510d5d65e41568325c2122c0b2000000000000000000000000731bdb08cdb43b510d5d65e41568325c2122c0b20000000000000000000000000000000000000000000000000000fed27d5f880000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -13981,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec34000000000000000000000000c43d5475758ae9dc53b5e586b6354cd2787dd603000000000000000000000000c43d5475758ae9dc53b5e586b6354cd2787dd6030000000000000000000000000000000000000000000000000000fed27d5f880000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -13983,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec34000000000000000000000000cc4fca3ce3571bfb598c475a95dedb02bee8feff000000000000000000000000cc4fca3ce3571bfb598c475a95dedb02bee8feff0000000000000000000000000000000000000000000000000000fed27d5f880000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -13984,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec34000000000000000000000000d63559f3fd761efc2eb35bb8bdd2fa95fb5cd446000000000000000000000000d63559f3fd761efc2eb35bb8bdd2fa95fb5cd446000000000000000000000000000000000000000000000000008286015568797400000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -13985,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec340000000000000000000000000ad549234d500b79608264ac69ed358f66e244e80000000000000000000000000ad549234d500b79608264ac69ed358f66e244e80000000000000000000000000000000000000000000000000000fed27d5f880000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -13986,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec3400000000000000000000000038084c3d816529d0909cfcff6c56a4da3f308d0300000000000000000000000038084c3d816529d0909cfcff6c56a4da3f308d030000000000000000000000000000000000000000000000000000fed27d5f880000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -13987,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec34000000000000000000000000f5d24542b2538f0c2b3eb291e7cdf0f3d5516a73000000000000000000000000f5d24542b2538f0c2b3eb291e7cdf0f3d5516a730000000000000000000000000000000000000000000000000000fed27d5f880000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -13988,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec3400000000000000000000000096b09c83e56efb894f9b37483b79d569e143ed1d00000000000000000000000096b09c83e56efb894f9b37483b79d569e143ed1d000000000000000000000000000000000000000000000000000000e8d4a5100000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -13989,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec34000000000000000000000000dc232401ff59c1457123a1b59e2da06c3b0c6102000000000000000000000000dc232401ff59c1457123a1b59e2da06c3b0c610200000000000000000000000000000000000000000000000000a46c1987f592c500000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,0x44718591410e8a6134882fcfabc04a84a4dfe4e9b0bad5472b42e76806550087,2022-02-12 07:14:02.000 UTC,0,true -14011,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec34000000000000000000000000b30096786fd20835715ddca2b60c0ec5343ca26a000000000000000000000000b30096786fd20835715ddca2b60c0ec5343ca26a000000000000000000000000000000000000000000000000008a7a17d8aa4dcd00000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -14012,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec340000000000000000000000003be5a478c352e786f747dcf2f77048460da198b30000000000000000000000003be5a478c352e786f747dcf2f77048460da198b300000000000000000000000000000000000000000000000000038d7ea4c6800000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -14013,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec340000000000000000000000002fbea2829b51ff4c5f202beae970075847baaba40000000000000000000000002fbea2829b51ff4c5f202beae970075847baaba400000000000000000000000000000000000000000000000001534c920cb8909400000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -14015,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec34000000000000000000000000435115b69f6c7377453e7122cce8ce645af30dc5000000000000000000000000435115b69f6c7377453e7122cce8ce645af30dc5000000000000000000000000000000000000000000000000001fb1dd3c16180000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -14017,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec3400000000000000000000000017738112576aa140e29b3b68d21269ef6bff7a4300000000000000000000000017738112576aa140e29b3b68d21269ef6bff7a430000000000000000000000000000000000000000000000000000fed27d5f880000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -14018,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec3400000000000000000000000003d60664aec76bb0ad73690f59a299dd0510b4dc00000000000000000000000003d60664aec76bb0ad73690f59a299dd0510b4dc0000000000000000000000000000000000000000000000000000fed27d5f880000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -14019,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec34000000000000000000000000fcecd9bf045f00dd5d826b091a13c8fc516938b0000000000000000000000000fcecd9bf045f00dd5d826b091a13c8fc516938b00000000000000000000000000000000000000000000000000000fed27d5f880000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -14020,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec34000000000000000000000000ae0fc1f7bd56fca484820e28435f060bb1d12d05000000000000000000000000ae0fc1f7bd56fca484820e28435f060bb1d12d050000000000000000000000000000000000000000000000000000fed27d5f880000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -14021,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec3400000000000000000000000006e8ed0e05741f50f71550aa557b0f8deb406d7c00000000000000000000000006e8ed0e05741f50f71550aa557b0f8deb406d7c0000000000000000000000000000000000000000000000000000fed27d5f880000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -14022,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec34000000000000000000000000a3b97b496d641d2c2123b8f2cd0cb07b4419b0c1000000000000000000000000a3b97b496d641d2c2123b8f2cd0cb07b4419b0c10000000000000000000000000000000000000000000000000000fed27d5f880000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -14023,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec340000000000000000000000003ffabe7d64185bc2d73e53d533d501e21a6877f90000000000000000000000003ffabe7d64185bc2d73e53d533d501e21a6877f90000000000000000000000000000000000000000000000000000fed27d5f880000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -14024,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec34000000000000000000000000a556b2ee089f046d986e61fd6d0facebb3abfd86000000000000000000000000a556b2ee089f046d986e61fd6d0facebb3abfd860000000000000000000000000000000000000000000000000000fed27d5f880000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -14025,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec34000000000000000000000000b833a762c2d7dd4d1c0ef82a182ed892195f5546000000000000000000000000b833a762c2d7dd4d1c0ef82a182ed892195f55460000000000000000000000000000000000000000000000000000fed27d5f880000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -14026,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec3400000000000000000000000080a6e3295723d9497bd9927433a21e8ae6b5d8a800000000000000000000000080a6e3295723d9497bd9927433a21e8ae6b5d8a80000000000000000000000000000000000000000000000000000fed27d5f880000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -14027,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec34000000000000000000000000f9c39034b4df95c96fb8c413755a2b6611fec832000000000000000000000000f9c39034b4df95c96fb8c413755a2b6611fec8320000000000000000000000000000000000000000000000000000fed27d5f880000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -14028,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec34000000000000000000000000423c207e9ca9797fa420f657ee8a68947d9a1fb9000000000000000000000000423c207e9ca9797fa420f657ee8a68947d9a1fb90000000000000000000000000000000000000000000000000000fed27d5f880000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -14029,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec34000000000000000000000000212ca1bdbeab58d4ece78a6c1fdbe95d23a7bea3000000000000000000000000212ca1bdbeab58d4ece78a6c1fdbe95d23a7bea30000000000000000000000000000000000000000000000000000fed27d5f880000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -14030,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec34000000000000000000000000de0eb11d50dd1a53a10554e9172c7efe6495a113000000000000000000000000de0eb11d50dd1a53a10554e9172c7efe6495a1130000000000000000000000000000000000000000000000000000fed27d5f880000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -14031,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec34000000000000000000000000b660eb39b1dc18330be9efdb91e4928ebc41d7df000000000000000000000000b660eb39b1dc18330be9efdb91e4928ebc41d7df0000000000000000000000000000000000000000000000000000fed27d5f880000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -14032,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec340000000000000000000000003b5aed04415ebe946cb366d088edf914fc66f0050000000000000000000000003b5aed04415ebe946cb366d088edf914fc66f0050000000000000000000000000000000000000000000000000000fed27d5f880000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -14033,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec34000000000000000000000000bc69cd67c58d7349d5648fdd2ea30e1564e20bdf000000000000000000000000bc69cd67c58d7349d5648fdd2ea30e1564e20bdf0000000000000000000000000000000000000000000000000000fed27d5f880000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -14034,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec34000000000000000000000000d27473941c088ffbf1f79dbd784fc64db783b1a6000000000000000000000000d27473941c088ffbf1f79dbd784fc64db783b1a60000000000000000000000000000000000000000000000000000fed27d5f880000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -14035,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec34000000000000000000000000eb544a124126a6d9ea07e8e94ac5a5fb0721c955000000000000000000000000eb544a124126a6d9ea07e8e94ac5a5fb0721c9550000000000000000000000000000000000000000000000000000fed27d5f880000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -14038,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec34000000000000000000000000e9054b28d9bf8861a3caba7b1d5160596587cbd5000000000000000000000000e9054b28d9bf8861a3caba7b1d5160596587cbd50000000000000000000000000000000000000000000000000000fed27d5f880000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -14039,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec340000000000000000000000003ee6119eb22f6f73a8ff42a2f7f591b6a8b332aa0000000000000000000000003ee6119eb22f6f73a8ff42a2f7f591b6a8b332aa0000000000000000000000000000000000000000000000000000fed27d5f880000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -14040,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec34000000000000000000000000583dc6999c5db47a477143b85a3cdfbd65bf3cc0000000000000000000000000583dc6999c5db47a477143b85a3cdfbd65bf3cc00000000000000000000000000000000000000000000000000000fed27d5f880000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -14041,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec3400000000000000000000000040aa839408d7c4a0bb7c4d03a8859f8d7c7a586200000000000000000000000040aa839408d7c4a0bb7c4d03a8859f8d7c7a58620000000000000000000000000000000000000000000000000000fed27d5f880000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -14042,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec34000000000000000000000000e1bcbd688e0c9f853f3a0d04654dd769c624848b000000000000000000000000e1bcbd688e0c9f853f3a0d04654dd769c624848b0000000000000000000000000000000000000000000000000000fed27d5f880000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -14044,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec340000000000000000000000002fca4727873be4b050026ecc4e3d555f246f762d0000000000000000000000002fca4727873be4b050026ecc4e3d555f246f762d0000000000000000000000000000000000000000000000000000fed27d5f880000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -14045,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec340000000000000000000000002a88efd6d2014aa6351f03129e233169288688080000000000000000000000002a88efd6d2014aa6351f03129e233169288688080000000000000000000000000000000000000000000000000017db32e1655d8000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -14046,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec340000000000000000000000009e9057e00024172126a37395118f49214dabd7910000000000000000000000009e9057e00024172126a37395118f49214dabd7910000000000000000000000000000000000000000000000000006a9be44aa103d00000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -14048,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec34000000000000000000000000b0deac064652083d2d39d331a9931218fac6c517000000000000000000000000b0deac064652083d2d39d331a9931218fac6c517000000000000000000000000000000000000000000000000001fd36cd60b4b4300000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -14049,0x10e6593cdda8c58a1d0f14c5164b376352a55f2f,0x467194771dae2967aef3ecbedd3bf9a310c76c65,0xa9f9e6750000000000000000000000006b175474e89094c44da98b954eedeac495271d0f000000000000000000000000da10009cbd5d07dd0cecc66161fc93d7c9000da1000000000000000000000000daf896a9888df3827737f29e8f8ba128a4026bce000000000000000000000000daf896a9888df3827737f29e8f8ba128a4026bce000000000000000000000000000000000000000000000002c5da7142cfe0185900000000000000000000000000000000000000000000000000000000000000c00000000000000000000000000000000000000000000000000000000000000000,,,1,true -14052,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0xa9f9e6750000000000000000000000002260fac5e5542a773aa44fbcfedf7c193bc2c59900000000000000000000000068f180fcce6836688e9084f035309e29bf0a2095000000000000000000000000485b29c2ce1e8ab267dfb1f66ae1d79ae65597ab000000000000000000000000485b29c2ce1e8ab267dfb1f66ae1d79ae65597ab000000000000000000000000000000000000000000000000000000000048e3f200000000000000000000000000000000000000000000000000000000000000c00000000000000000000000000000000000000000000000000000000000000000,0xee72b1d1d7aebcafec0a9913de0243fb5a4fd6f2f2536e257310f3de73a08501,2021-11-25 12:38:06.000 UTC,0,true -14055,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec34000000000000000000000000f16247eaec7517320ca3121619702c119039ede5000000000000000000000000f16247eaec7517320ca3121619702c119039ede500000000000000000000000000000000000000000000000000b1a2bc2ec5000000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -14059,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec34000000000000000000000000292cca8955b726a53c7ad7facea051f42d88f8a5000000000000000000000000292cca8955b726a53c7ad7facea051f42d88f8a5000000000000000000000000000000000000000000000000015e57e0f451770000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -14060,0xcd9d4988c0ae61887b075ba77f08cbfad2b65068,0x3f87ff1de58128ef8fcb4c807efd776e1ac72e51,0xf4f7b41a0000000000000000000000007e9a33df66d96a441f5783ce4bbd002fe14d6a42000000000000000000000000000000000000000000000000056a97255b65b0ec,,,1,true -14061,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec34000000000000000000000000ea24f605ff7a7faff0ec68859e9d28b21228aea7000000000000000000000000ea24f605ff7a7faff0ec68859e9d28b21228aea7000000000000000000000000000000000000000000000000009fdf42f6e4800000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -14064,0x10e6593cdda8c58a1d0f14c5164b376352a55f2f,0x467194771dae2967aef3ecbedd3bf9a310c76c65,0xa9f9e6750000000000000000000000006b175474e89094c44da98b954eedeac495271d0f000000000000000000000000da10009cbd5d07dd0cecc66161fc93d7c9000da1000000000000000000000000b06fabe92cc26f03ecc7d42ebc02201a06bccc0d000000000000000000000000b06fabe92cc26f03ecc7d42ebc02201a06bccc0d0000000000000000000000000000000000000000000000152ad43133965561d300000000000000000000000000000000000000000000000000000000000000c00000000000000000000000000000000000000000000000000000000000000000,,,1,true -14065,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec340000000000000000000000005a8167145a4b67c64c76d1a56ae713abee0a1e8f0000000000000000000000005a8167145a4b67c64c76d1a56ae713abee0a1e8f00000000000000000000000000000000000000000000000002c68af0bb14000000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -14068,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec3400000000000000000000000076288be212c272dd56dc9a73f1a25d2151dbb2c800000000000000000000000076288be212c272dd56dc9a73f1a25d2151dbb2c8000000000000000000000000000000000000000000000000003a2cee48243e5b00000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -14070,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec340000000000000000000000006f8a95c3213f1226385ad0d750a0dd0b73b501930000000000000000000000006f8a95c3213f1226385ad0d750a0dd0b73b501930000000000000000000000000000000000000000000000000036a3ed159101df00000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -14071,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec340000000000000000000000000c4ca96d4e63af64fb7896ab41e0aa871a59fabb0000000000000000000000000c4ca96d4e63af64fb7896ab41e0aa871a59fabb000000000000000000000000000000000000000000000000001c6bf52634000000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -14072,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec34000000000000000000000000e8fe303642401cfbb750b435854ceff9aa21fde6000000000000000000000000e8fe303642401cfbb750b435854ceff9aa21fde600000000000000000000000000000000000000000000000000a142b73870b7fe00000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -14073,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec34000000000000000000000000124c2c231a8bc7967c78172f51ea419e256fe1a9000000000000000000000000124c2c231a8bc7967c78172f51ea419e256fe1a9000000000000000000000000000000000000000000000000057f74bfda81e90900000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -14075,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec34000000000000000000000000e53ade7d9a62adc6e5ec926272d508ce8729f056000000000000000000000000e53ade7d9a62adc6e5ec926272d508ce8729f056000000000000000000000000000000000000000000000000001a662a2d75dd9900000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -14076,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec3400000000000000000000000078f28811eaf483a50a2c1776040a6189c3e5b28a00000000000000000000000078f28811eaf483a50a2c1776040a6189c3e5b28a0000000000000000000000000000000000000000000000000161e638c671a18700000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,0x5c6ac0f966d2159b20f39d400ecb320b94d52167e9f3359a4eeffb786f03900f,2022-02-20 22:51:55.000 UTC,0,true -14079,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec34000000000000000000000000c04d107c3f21d215772ead8af02d3f4f2321fcd4000000000000000000000000c04d107c3f21d215772ead8af02d3f4f2321fcd400000000000000000000000000000000000000000000000000009fc776c6100000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -14080,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec34000000000000000000000000c04d107c3f21d215772ead8af02d3f4f2321fcd4000000000000000000000000c04d107c3f21d215772ead8af02d3f4f2321fcd400000000000000000000000000000000000000000000000000677dd80f86d73e00000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -14081,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0xa9f9e675000000000000000000000000dac17f958d2ee523a2206206994597c13d831ec700000000000000000000000094b008aa00579c1307b0ef2c499ad98a8ce58e58000000000000000000000000bfe98ba61eb224f657d392333f213f6d75cc6972000000000000000000000000bfe98ba61eb224f657d392333f213f6d75cc6972000000000000000000000000000000000000000000000000000000001d5b950d00000000000000000000000000000000000000000000000000000000000000c00000000000000000000000000000000000000000000000000000000000000000,,,1,true -14082,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0xa9f9e675000000000000000000000000dac17f958d2ee523a2206206994597c13d831ec700000000000000000000000094b008aa00579c1307b0ef2c499ad98a8ce58e5800000000000000000000000030288b14c84a10ee2c3391da1f680482b6ef1f6a00000000000000000000000030288b14c84a10ee2c3391da1f680482b6ef1f6a000000000000000000000000000000000000000000000000000000001d72bdf600000000000000000000000000000000000000000000000000000000000000c00000000000000000000000000000000000000000000000000000000000000000,,,1,true -14083,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0xa9f9e675000000000000000000000000dac17f958d2ee523a2206206994597c13d831ec700000000000000000000000094b008aa00579c1307b0ef2c499ad98a8ce58e580000000000000000000000009508ef3443ef753e5ccf158bf7a8a6e2f5de56c00000000000000000000000009508ef3443ef753e5ccf158bf7a8a6e2f5de56c0000000000000000000000000000000000000000000000000000000001d79f68200000000000000000000000000000000000000000000000000000000000000c00000000000000000000000000000000000000000000000000000000000000000,,,1,true -14084,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0xa9f9e675000000000000000000000000dac17f958d2ee523a2206206994597c13d831ec700000000000000000000000094b008aa00579c1307b0ef2c499ad98a8ce58e580000000000000000000000000e53ff2dbbc64a45f21c020feeac042f5f15be390000000000000000000000000e53ff2dbbc64a45f21c020feeac042f5f15be39000000000000000000000000000000000000000000000000000000001d798ce800000000000000000000000000000000000000000000000000000000000000c00000000000000000000000000000000000000000000000000000000000000000,,,1,true -14085,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0xa9f9e675000000000000000000000000dac17f958d2ee523a2206206994597c13d831ec700000000000000000000000094b008aa00579c1307b0ef2c499ad98a8ce58e58000000000000000000000000df6526993e056e43241bdc9c8711cd2de2e5cc13000000000000000000000000df6526993e056e43241bdc9c8711cd2de2e5cc13000000000000000000000000000000000000000000000000000000001d6ebc3d00000000000000000000000000000000000000000000000000000000000000c00000000000000000000000000000000000000000000000000000000000000000,,,1,true -14086,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec3400000000000000000000000051e6e92e81c9ac173d45390f5f5bf9463ffd3ca000000000000000000000000051e6e92e81c9ac173d45390f5f5bf9463ffd3ca000000000000000000000000000000000000000000000000001419e3759e1976100000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -14092,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec34000000000000000000000000787e5e1f40881ddec138253d9735ac5207659096000000000000000000000000787e5e1f40881ddec138253d9735ac520765909600000000000000000000000000000000000000000000000000046a9a6083205500000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -14094,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec340000000000000000000000000f1687c086e7565c96b395f484c42aad406e6c140000000000000000000000000f1687c086e7565c96b395f484c42aad406e6c1400000000000000000000000000000000000000000000000000b5ef79e5c9a0d400000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,0x0905e088343a54e7ff334f8fb6bd47293852c499d4bc992fc01202a43b6e60b3,2021-12-25 18:00:46.000 UTC,0,true -14095,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec34000000000000000000000000d49e5771bea214f10a31ac160e6159717481c432000000000000000000000000d49e5771bea214f10a31ac160e6159717481c432000000000000000000000000000000000000000000000000017fb16d83be000000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -14097,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec34000000000000000000000000e95c0a312687e01bd27f62d56d80f2ff71c2cb11000000000000000000000000e95c0a312687e01bd27f62d56d80f2ff71c2cb110000000000000000000000000000000000000000000000000150d6e367d3c8d500000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -14099,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0xa9f9e675000000000000000000000000dac17f958d2ee523a2206206994597c13d831ec700000000000000000000000094b008aa00579c1307b0ef2c499ad98a8ce58e580000000000000000000000009f626dbfc2a3b9e140ee7b6c317ed6b60e0f33bc0000000000000000000000009f626dbfc2a3b9e140ee7b6c317ed6b60e0f33bc000000000000000000000000000000000000000000000000000000001cc1864b00000000000000000000000000000000000000000000000000000000000000c00000000000000000000000000000000000000000000000000000000000000000,0xa198d6248a2cb1d7c3a37bc15aed5a29df99e4e4f6782e906d90f2d3b080e247,2022-07-29 23:23:29.000 UTC,0,true -14100,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec340000000000000000000000008aef8de06aa03916eccd39d7552c81bbdf2693490000000000000000000000008aef8de06aa03916eccd39d7552c81bbdf26934900000000000000000000000000000000000000000000000000c73be88a799d5b00000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -14101,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec3400000000000000000000000066f0b8003010bc8fc592879ef700509d937f542300000000000000000000000066f0b8003010bc8fc592879ef700509d937f54230000000000000000000000000000000000000000000000000083470522a942d700000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -14102,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0xa9f9e6750000000000000000000000001f9840a85d5af5bf1d1762f925bdaddc4201f9840000000000000000000000006fd9d7ad17242c41f7131d257212c54a0e81669100000000000000000000000001a145c9338cad4720149cda57d2178d7906829900000000000000000000000001a145c9338cad4720149cda57d2178d7906829900000000000000000000000000000000000000000000000070e0b4640846e11000000000000000000000000000000000000000000000000000000000000000c00000000000000000000000000000000000000000000000000000000000000000,,,1,true -14103,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec340000000000000000000000004fba1425c65f42f8c3178d6c4738efa55de814d50000000000000000000000004fba1425c65f42f8c3178d6c4738efa55de814d5000000000000000000000000000000000000000000000000008e1bc9bf04000000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -14105,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec34000000000000000000000000da3d7dbb9fe32ed3b4455ba0507b9c66b4607710000000000000000000000000da3d7dbb9fe32ed3b4455ba0507b9c66b460771000000000000000000000000000000000000000000000000000dfcf68ae79960a00000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,0x91bb9cda780df4023f05acb666e3fc1a16b78113c224d399b15de06cb0fd8646,2022-03-05 05:30:07.000 UTC,0,true -14106,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec34000000000000000000000000d7a7c1cfc1d66ea62b9c06b0a1b05f8e835c76c8000000000000000000000000d7a7c1cfc1d66ea62b9c06b0a1b05f8e835c76c8000000000000000000000000000000000000000000000000003ff2e795f5000000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,0xd3a4551595e189ca77a59fe73acefd9afbefd4480827485f2a8d43d06aefc4bf,2022-06-28 07:00:56.000 UTC,0,true -14107,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec340000000000000000000000000c4ca96d4e63af64fb7896ab41e0aa871a59fabb0000000000000000000000000c4ca96d4e63af64fb7896ab41e0aa871a59fabb000000000000000000000000000000000000000000000000001c6bf52634000000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -14110,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec34000000000000000000000000dce8c8cc21841b1b257c6683fd4778a902c68c69000000000000000000000000dce8c8cc21841b1b257c6683fd4778a902c68c69000000000000000000000000000000000000000000000000001af43b103a96c000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -14113,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0xa9f9e6750000000000000000000000001f9840a85d5af5bf1d1762f925bdaddc4201f9840000000000000000000000006fd9d7ad17242c41f7131d257212c54a0e81669100000000000000000000000051f033a3eaf8e446bacd1b0a0c4f5c1dd783292200000000000000000000000051f033a3eaf8e446bacd1b0a0c4f5c1dd783292200000000000000000000000000000000000000000000000070df7fb51b387ee000000000000000000000000000000000000000000000000000000000000000c00000000000000000000000000000000000000000000000000000000000000000,,,1,true -14114,0x10e6593cdda8c58a1d0f14c5164b376352a55f2f,0x467194771dae2967aef3ecbedd3bf9a310c76c65,0xa9f9e6750000000000000000000000006b175474e89094c44da98b954eedeac495271d0f000000000000000000000000da10009cbd5d07dd0cecc66161fc93d7c9000da1000000000000000000000000e60d9c72c5ec15136b942525407d07527f2df2b7000000000000000000000000e60d9c72c5ec15136b942525407d07527f2df2b700000000000000000000000000000000000000000000000e5e5b8a4d481c42b100000000000000000000000000000000000000000000000000000000000000c00000000000000000000000000000000000000000000000000000000000000000,,,1,true -14115,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec340000000000000000000000004ed78d87d23c6df3c879fa185e4e45f285b756dc0000000000000000000000004ed78d87d23c6df3c879fa185e4e45f285b756dc000000000000000000000000000000000000000000000000016345785d8a000000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,0x176fa3118f5eea5b70e943cbe719f8909c3f7e79c9cc95b61027ac376ed8ef13,2022-01-31 19:02:14.000 UTC,0,true -14116,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec340000000000000000000000007362aba7c2667bf2dad14111de0252cf848dc2e60000000000000000000000007362aba7c2667bf2dad14111de0252cf848dc2e600000000000000000000000000000000000000000000000000038d7ea4c6800000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -14122,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec34000000000000000000000000e1f00ed84b2796bf54c44f7b2a1739005a978788000000000000000000000000e1f00ed84b2796bf54c44f7b2a1739005a978788000000000000000000000000000000000000000000000000019d10b6e1245adc00000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -14123,0xcd9d4988c0ae61887b075ba77f08cbfad2b65068,0x3f87ff1de58128ef8fcb4c807efd776e1ac72e51,0xf4f7b41a0000000000000000000000000258da40e011acb8e0f6308d6dda4de363c9b604000000000000000000000000000000000000000000000004ef3aacc1f6d7965b,,,1,true -14124,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec340000000000000000000000000258da40e011acb8e0f6308d6dda4de363c9b6040000000000000000000000000258da40e011acb8e0f6308d6dda4de363c9b604000000000000000000000000000000000000000000000000006a94d74f43000000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -14127,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec340000000000000000000000007a8e7b7197e94d2cb194dbed7a80575c047a75750000000000000000000000007a8e7b7197e94d2cb194dbed7a80575c047a757500000000000000000000000000000000000000000000000003f2cc7a70f7f90f00000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -14128,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec340000000000000000000000004020cfce02de3c10b440ec0f229ee583c456a81e0000000000000000000000004020cfce02de3c10b440ec0f229ee583c456a81e000000000000000000000000000000000000000000000000000073ca600c320000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -14130,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec34000000000000000000000000175d7ac3844ac969c1d17431e59ff057ad17ee3b000000000000000000000000175d7ac3844ac969c1d17431e59ff057ad17ee3b00000000000000000000000000000000000000000000000000006c71476e403d00000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -14131,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec34000000000000000000000000a34417c1837171910f4d72ad4876a83e9d3103c9000000000000000000000000a34417c1837171910f4d72ad4876a83e9d3103c9000000000000000000000000000000000000000000000000009eb2a15263458300000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -14134,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec3400000000000000000000000056279d1110c8adf39b2cf8e8657356d0854a5bbf00000000000000000000000056279d1110c8adf39b2cf8e8657356d0854a5bbf0000000000000000000000000000000000000000000000000207f5bed76f0adc00000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -14136,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec34000000000000000000000000d57f561135ea6fd6b2f37627dd836c1d7162ff0b000000000000000000000000d57f561135ea6fd6b2f37627dd836c1d7162ff0b0000000000000000000000000000000000000000000000000000fea89489800000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -14137,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec3400000000000000000000000055e7b3038aa65781ff936221447e2b6caa4a4e8b00000000000000000000000055e7b3038aa65781ff936221447e2b6caa4a4e8b0000000000000000000000000000000000000000000000000019d3c8e9c9c1c000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -14140,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec3400000000000000000000000001892ccee554fb70d50f96e42f287c155980bd8800000000000000000000000001892ccee554fb70d50f96e42f287c155980bd88000000000000000000000000000000000000000000000000009a8fc50ef2542600000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -14142,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec3400000000000000000000000032fd820024c3c6aac07b7aa58986961c94fa1f3800000000000000000000000032fd820024c3c6aac07b7aa58986961c94fa1f380000000000000000000000000000000000000000000000000000fea89489800000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -14144,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec34000000000000000000000000a9038d842354fd62d5604eefab491ec0a60b3869000000000000000000000000a9038d842354fd62d5604eefab491ec0a60b38690000000000000000000000000000000000000000000000000000fea89489800000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -14146,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec3400000000000000000000000098f990ef129d59a3e511fa6471cab60c215cdfeb00000000000000000000000098f990ef129d59a3e511fa6471cab60c215cdfeb00000000000000000000000000000000000000000000000003782dace9d9000000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,0x67f9e7a9ce31ab98561f0e49b387c30ea556fbffac0445d5cf56409702ee0cbd,2021-12-26 23:14:47.000 UTC,0,true -14148,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec34000000000000000000000000f12f8d68c75d4d8852808e1be5cd8cf7776ef2d0000000000000000000000000f12f8d68c75d4d8852808e1be5cd8cf7776ef2d0000000000000000000000000000000000000000000000000004402aaea81858b00000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -14149,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec34000000000000000000000000043c7df1186687da64730999e727a7ca668ec719000000000000000000000000043c7df1186687da64730999e727a7ca668ec7190000000000000000000000000000000000000000000000000000fea89489800000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -14151,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec3400000000000000000000000039d2d986dd5bfa5afb50a292b681f984591e7ebd00000000000000000000000039d2d986dd5bfa5afb50a292b681f984591e7ebd0000000000000000000000000000000000000000000000000000fea89489800000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -14152,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec34000000000000000000000000f26988ede871862233aed3773572ae22e6195e3b000000000000000000000000f26988ede871862233aed3773572ae22e6195e3b0000000000000000000000000000000000000000000000000046e96616fef20000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -14153,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec340000000000000000000000002ea39e9a3cf88258befd321bb747a20ab8a4b33b0000000000000000000000002ea39e9a3cf88258befd321bb747a20ab8a4b33b00000000000000000000000000000000000000000000000000038d7ea4c6800000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -14157,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec34000000000000000000000000262dca9b8906e73923736ba7ef71b0ff10f2da7a000000000000000000000000262dca9b8906e73923736ba7ef71b0ff10f2da7a0000000000000000000000000000000000000000000000000000fea89489800000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -14158,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec34000000000000000000000000e8c89e3cfe798e7dee53acfd61bc31355cceecb3000000000000000000000000e8c89e3cfe798e7dee53acfd61bc31355cceecb30000000000000000000000000000000000000000000000000000fea89489800000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -14159,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec340000000000000000000000006e6a8ca6bf0dfaa5e0c27be2fa32d8f242b3be9f0000000000000000000000006e6a8ca6bf0dfaa5e0c27be2fa32d8f242b3be9f000000000000000000000000000000000000000000000000005b3a0ecd8d9c2e00000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -14160,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec34000000000000000000000000b39d44640438d2dff075e8046569ef0f8d3510ed000000000000000000000000b39d44640438d2dff075e8046569ef0f8d3510ed0000000000000000000000000000000000000000000000000000fea89489800000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -14161,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec340000000000000000000000006f809a9b799697b4fdd656c29deac20ed55d330b0000000000000000000000006f809a9b799697b4fdd656c29deac20ed55d330b00000000000000000000000000000000000000000000000006ede09beedce60000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -14162,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec34000000000000000000000000bc2e7d827c788005ba971599d7f7dc911673a6f5000000000000000000000000bc2e7d827c788005ba971599d7f7dc911673a6f500000000000000000000000000000000000000000000000000901b15612cccd900000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -14163,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec340000000000000000000000007174c6cf7fa9c714feb89575c9431815cd595aa30000000000000000000000007174c6cf7fa9c714feb89575c9431815cd595aa30000000000000000000000000000000000000000000000000000fea89489800000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -14164,0xcd9d4988c0ae61887b075ba77f08cbfad2b65068,0x3f87ff1de58128ef8fcb4c807efd776e1ac72e51,0xf4f7b41a000000000000000000000000986a1de622305f441a3c763036ca06da417ffff40000000000000000000000000000000000000000000000002602dc56002bb0c7,,,1,true -14165,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec34000000000000000000000000d2c02702ea8f4fe7b8325e9d613a2ba99454f9ff000000000000000000000000d2c02702ea8f4fe7b8325e9d613a2ba99454f9ff0000000000000000000000000000000000000000000000000000fea89489800000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -14166,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec34000000000000000000000000b98fc0a7c413db271f93dd03aa828d6359564266000000000000000000000000b98fc0a7c413db271f93dd03aa828d635956426600000000000000000000000000000000000000000000000004d2131d003ea32300000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -14167,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec340000000000000000000000006d344a3e06ef05ffe63ec09472ca8dd9f01d05d00000000000000000000000006d344a3e06ef05ffe63ec09472ca8dd9f01d05d000000000000000000000000000000000000000000000000002c5536b24d12f8300000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,0xbfc9275b6bc817d565df2ccb9db4b2d89cc39f509bcd5d2b64e0f96a88c5be17,2021-12-20 08:12:21.000 UTC,0,true -14168,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec34000000000000000000000000faec9e70cba0b0f174cbab4b1c19b6cb7cfca25e000000000000000000000000faec9e70cba0b0f174cbab4b1c19b6cb7cfca25e0000000000000000000000000000000000000000000000000063a07b7f306a6d00000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -14169,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec34000000000000000000000000ee970cd2aee28778c1bd384283c80c50c19f1616000000000000000000000000ee970cd2aee28778c1bd384283c80c50c19f16160000000000000000000000000000000000000000000000002dc84eb27b7fb30000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -14171,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec34000000000000000000000000ee64532f1b2e2d32a9ed45689e879c04f9e5d648000000000000000000000000ee64532f1b2e2d32a9ed45689e879c04f9e5d64800000000000000000000000000000000000000000000000000730b5bae13705d00000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -14175,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec34000000000000000000000000182527962c891ef2b4cacec7b06618c902314bb3000000000000000000000000182527962c891ef2b4cacec7b06618c902314bb3000000000000000000000000000000000000000000000000004e3c0536bfe1fb00000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -14176,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec340000000000000000000000005cfaa12bbe1d09f29b4ccf91f795a7386b92b6250000000000000000000000005cfaa12bbe1d09f29b4ccf91f795a7386b92b625000000000000000000000000000000000000000000000000007c20bc202cceb900000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -14177,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec340000000000000000000000009511bab567161d053b43f56f416b113aba3e7c1d0000000000000000000000009511bab567161d053b43f56f416b113aba3e7c1d00000000000000000000000000000000000000000000000000a4391f86a6b2e700000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -14179,0xcd9d4988c0ae61887b075ba77f08cbfad2b65068,0x3f87ff1de58128ef8fcb4c807efd776e1ac72e51,0xf4f7b41a000000000000000000000000755aaa8fe876d7d6c28c8988ad0912150f72abce0000000000000000000000000000000000000000000000001b30390dbc701540,,,1,true -14180,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec34000000000000000000000000e3904f1a245dba803b6c5370da750988d475f4bd000000000000000000000000e3904f1a245dba803b6c5370da750988d475f4bd0000000000000000000000000000000000000000000000000364145bedf2353d00000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -14182,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec34000000000000000000000000d5e1e0fafe09bfe954f33f32fc624f0b2e2caaa3000000000000000000000000d5e1e0fafe09bfe954f33f32fc624f0b2e2caaa300000000000000000000000000000000000000000000000001e165fda8dc549e00000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -14185,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec340000000000000000000000006c50c278d4f3714919b046a01981698685093b470000000000000000000000006c50c278d4f3714919b046a01981698685093b4700000000000000000000000000000000000000000000000001d9dfebed4fa88400000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -14187,0xcd9d4988c0ae61887b075ba77f08cbfad2b65068,0x3f87ff1de58128ef8fcb4c807efd776e1ac72e51,0xf4f7b41a0000000000000000000000001dba9923efb6b28612f3a7ba90ece5657a1941250000000000000000000000000000000000000000000000004563918244f40000,,,1,true -14188,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec340000000000000000000000000d3ed789252bac04595ee5903d8a2421c43353030000000000000000000000000d3ed789252bac04595ee5903d8a2421c433530300000000000000000000000000000000000000000000000000399d9f8ade478400000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -14190,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0xa9f9e675000000000000000000000000a0b86991c6218b36c1d19d4a2e9eb0ce3606eb480000000000000000000000007f5c764cbc14f9669b88837ca1490cca17c3160700000000000000000000000095346e29fbee4c60bfa00d4e2d1912d579cdc76f00000000000000000000000095346e29fbee4c60bfa00d4e2d1912d579cdc76f0000000000000000000000000000000000000000000000000000000013d9f78e00000000000000000000000000000000000000000000000000000000000000c00000000000000000000000000000000000000000000000000000000000000000,,,1,true -14192,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec34000000000000000000000000edba99b8c5c6e1b9c8a9b34fcd00505d8511f913000000000000000000000000edba99b8c5c6e1b9c8a9b34fcd00505d8511f91300000000000000000000000000000000000000000000000000027ca57357c00000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -14193,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec3400000000000000000000000033d14308158623a785b6e85a30e64dbb16b4ceed00000000000000000000000033d14308158623a785b6e85a30e64dbb16b4ceed000000000000000000000000000000000000000000000000005e13b8fbe80a0000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -14194,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec34000000000000000000000000ff3883b3b82528bccfce4356cefaa6d7d07e4fc2000000000000000000000000ff3883b3b82528bccfce4356cefaa6d7d07e4fc200000000000000000000000000000000000000000000000000038d7ea4c6800000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -14199,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec34000000000000000000000000f1afea5a1d95982e4ebafa878b93feded22dc374000000000000000000000000f1afea5a1d95982e4ebafa878b93feded22dc374000000000000000000000000000000000000000000000000020ab2b0dcd6910000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,0xcb8de44e72d0049d8008cf758682db09ea3982f4ccc1a1b7aafc4bb87a39bb14,2022-04-27 12:47:38.000 UTC,0,true -14207,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec340000000000000000000000004ddf13201064ecae004306594c670acc7ac519aa0000000000000000000000004ddf13201064ecae004306594c670acc7ac519aa0000000000000000000000000000000000000000000000000017b341b4c97b2900000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -14208,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec340000000000000000000000007e9e0079c3b4003e4cb34b4e3fbd4a9f3482c6d80000000000000000000000007e9e0079c3b4003e4cb34b4e3fbd4a9f3482c6d80000000000000000000000000000000000000000000000000003b1843925e0f200000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -14209,0xcd9d4988c0ae61887b075ba77f08cbfad2b65068,0x3f87ff1de58128ef8fcb4c807efd776e1ac72e51,0xf4f7b41a0000000000000000000000001d08b5667c9de15b5ab40f882d2bff6deae2c83d000000000000000000000000000000000000000000000000b0723a590433f979,,,1,true -14212,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec34000000000000000000000000639eb289710d1ae2165ac0e76d02b739644883d2000000000000000000000000639eb289710d1ae2165ac0e76d02b739644883d2000000000000000000000000000000000000000000000000004380663abb800000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -14214,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0xa9f9e6750000000000000000000000001f9840a85d5af5bf1d1762f925bdaddc4201f9840000000000000000000000006fd9d7ad17242c41f7131d257212c54a0e81669100000000000000000000000026afa302c9d2f7659ecf800c0c606fd7faea16f300000000000000000000000026afa302c9d2f7659ecf800c0c606fd7faea16f300000000000000000000000000000000000000000000000821ab0d441498000000000000000000000000000000000000000000000000000000000000000000c00000000000000000000000000000000000000000000000000000000000000000,0xbc6a9dc7db85adaf9f19f15e884727fd2e63981fdf80afe775cefbc93de590aa,2022-06-02 02:24:06.000 UTC,0,true -14215,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec34000000000000000000000000d17fc86bc9d50872df4d2b10d8855e1965a6baca000000000000000000000000d17fc86bc9d50872df4d2b10d8855e1965a6baca00000000000000000000000000000000000000000000000000470de4df82000000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -14218,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec34000000000000000000000000a63e1239cea6c90107dbd1a8fe127be73efe2582000000000000000000000000a63e1239cea6c90107dbd1a8fe127be73efe258200000000000000000000000000000000000000000000000000810e1660b89f6d00000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -14226,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec34000000000000000000000000f530a21ecc87cfaf169ab2be3bf1766bb77a49df000000000000000000000000f530a21ecc87cfaf169ab2be3bf1766bb77a49df000000000000000000000000000000000000000000000000011c37937e08000000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -14229,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec34000000000000000000000000f0b481823ce1fd808f2196a2af17239f0f458b25000000000000000000000000f0b481823ce1fd808f2196a2af17239f0f458b2500000000000000000000000000000000000000000000000000226519828c8fc000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -14230,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec34000000000000000000000000b9cd2daac4e0ebcf2da51705a0f02eee13072c3c000000000000000000000000b9cd2daac4e0ebcf2da51705a0f02eee13072c3c0000000000000000000000000000000000000000000000000003baca8ce3520000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -14232,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec3400000000000000000000000049e1f9a244765bce02d3af4799da414c0256092600000000000000000000000049e1f9a244765bce02d3af4799da414c02560926000000000000000000000000000000000000000000000000012ff7a1125a66f500000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -14234,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec340000000000000000000000007cbfe5c2219bac8f00b3a4d6220cea26e4f8e14d0000000000000000000000007cbfe5c2219bac8f00b3a4d6220cea26e4f8e14d00000000000000000000000000000000000000000000000000f8b0a10e47000000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -14235,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0xa9f9e675000000000000000000000000a0b86991c6218b36c1d19d4a2e9eb0ce3606eb480000000000000000000000007f5c764cbc14f9669b88837ca1490cca17c316070000000000000000000000007cbfe5c2219bac8f00b3a4d6220cea26e4f8e14d0000000000000000000000007cbfe5c2219bac8f00b3a4d6220cea26e4f8e14d0000000000000000000000000000000000000000000000000000000007dd977500000000000000000000000000000000000000000000000000000000000000c00000000000000000000000000000000000000000000000000000000000000000,,,1,true -14236,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec34000000000000000000000000f560f36da0a8e73467f6561203762cd73f5caf2c000000000000000000000000f560f36da0a8e73467f6561203762cd73f5caf2c00000000000000000000000000000000000000000000000000e0d1ab747abac000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -14238,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec34000000000000000000000000a39653495ac64cdd4d63da235750ea7d7d88d553000000000000000000000000a39653495ac64cdd4d63da235750ea7d7d88d5530000000000000000000000000000000000000000000000000000fd38d4e8750000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -14239,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec340000000000000000000000008fbb51d6e0f91c6fac1045a7e4c851d88b8ee5450000000000000000000000008fbb51d6e0f91c6fac1045a7e4c851d88b8ee5450000000000000000000000000000000000000000000000000001e19a5a3ef80000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -14240,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec34000000000000000000000000093b59660f7aca23ae0371a1cc85ab1f9698895e000000000000000000000000093b59660f7aca23ae0371a1cc85ab1f9698895e000000000000000000000000000000000000000000000000000313f471c7cf0000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -14241,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec340000000000000000000000008d89ed93e36f45f2c619aa690732f52e1bdd4aec0000000000000000000000008d89ed93e36f45f2c619aa690732f52e1bdd4aec000000000000000000000000000000000000000000000000000313f471c7cf0000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -14242,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec340000000000000000000000006fab7bc5ebb46220eaa77b88b4a574233f76e1ee0000000000000000000000006fab7bc5ebb46220eaa77b88b4a574233f76e1ee000000000000000000000000000000000000000000000000000313f471c7cf0000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -14243,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec340000000000000000000000008ee7f67b307365ccc216311d61e6faad0265090f0000000000000000000000008ee7f67b307365ccc216311d61e6faad0265090f000000000000000000000000000000000000000000000000000313f471c7cf0000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -14244,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec34000000000000000000000000dbbcf0aee88ef5e75d55b74faaa65fea2eb0be43000000000000000000000000dbbcf0aee88ef5e75d55b74faaa65fea2eb0be4300000000000000000000000000000000000000000000000000032cc657e6760000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -14245,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec340000000000000000000000006ef6ef03a9f085953ca84b56c440a25dbc86aa4d0000000000000000000000006ef6ef03a9f085953ca84b56c440a25dbc86aa4d0000000000000000000000000000000000000000000000000002fbf1b7288f0000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -14246,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec340000000000000000000000008f6c94056f2ce538fc150156c328697a7c4aabb10000000000000000000000008f6c94056f2ce538fc150156c328697a7c4aabb1000000000000000000000000000000000000000000000000000356e4c7a2cf0000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -14247,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec34000000000000000000000000dff81dc1364bbfe7a2c9ba48e992cd38d54787f7000000000000000000000000dff81dc1364bbfe7a2c9ba48e992cd38d54787f7000000000000000000000000000000000000000000000000000aa87bee53800000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -14248,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec3400000000000000000000000033f68ebe57cf7d4010a7ca183e9da103791aeee300000000000000000000000033f68ebe57cf7d4010a7ca183e9da103791aeee30000000000000000000000000000000000000000000000000004c2b90fffc00000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -14249,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec34000000000000000000000000cc8dc4bfbb815b4625e27ab2944b9f34c1da0db8000000000000000000000000cc8dc4bfbb815b4625e27ab2944b9f34c1da0db800000000000000000000000000000000000000000000000004d1d2f32bd0971e00000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -14250,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec34000000000000000000000000f3bd721db7f7a260ab1766d24ae5381485bb78dc000000000000000000000000f3bd721db7f7a260ab1766d24ae5381485bb78dc0000000000000000000000000000000000000000000000000004f032983ce00000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -14258,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec3400000000000000000000000049aa1d51f3b20599921f1f970ffda42361a6e0be00000000000000000000000049aa1d51f3b20599921f1f970ffda42361a6e0be00000000000000000000000000000000000000000000000000739540706ab17d00000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -14259,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec340000000000000000000000007196ccdc9ba6214492e165a5dda53e20de5b53520000000000000000000000007196ccdc9ba6214492e165a5dda53e20de5b53520000000000000000000000000000000000000000000000000ddce46a6801760000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -14261,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec3400000000000000000000000062c42f0479fb731712b3ee290fe4e9178d79143b00000000000000000000000062c42f0479fb731712b3ee290fe4e9178d79143b00000000000000000000000000000000000000000000000000745e03f38b0cfe00000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -14264,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec34000000000000000000000000e9d498434b722855f14388fb2d734c4bbefaaae1000000000000000000000000e9d498434b722855f14388fb2d734c4bbefaaae100000000000000000000000000000000000000000000000001434f7128416f0a00000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,0xdda35a643081731901945991976d454328d82a62d7727e50b3ada41d5c5fe39f,2022-05-23 21:08:52.000 UTC,0,true -14265,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0xa9f9e675000000000000000000000000dac17f958d2ee523a2206206994597c13d831ec700000000000000000000000094b008aa00579c1307b0ef2c499ad98a8ce58e58000000000000000000000000da21dc5e01ef214adf55124fcc0b310c5832191b000000000000000000000000da21dc5e01ef214adf55124fcc0b310c5832191b000000000000000000000000000000000000000000000000000000000098968000000000000000000000000000000000000000000000000000000000000000c00000000000000000000000000000000000000000000000000000000000000000,0xebeb558cbf0ed0c082dfe27c58d32155cf03c7b0a5b506fdc1647a518592a35d,2022-08-18 10:11:48.000 UTC,0,true -14268,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec340000000000000000000000006e2cb253d7af60c49a3cc906ca3ea38916e1938a0000000000000000000000006e2cb253d7af60c49a3cc906ca3ea38916e1938a000000000000000000000000000000000000000000000000007fc199088c0d5a00000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -14272,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0xa9f9e675000000000000000000000000dac17f958d2ee523a2206206994597c13d831ec700000000000000000000000094b008aa00579c1307b0ef2c499ad98a8ce58e580000000000000000000000002185c428ee0ddbb23003dfb7b849ace5b86c4faa0000000000000000000000002185c428ee0ddbb23003dfb7b849ace5b86c4faa00000000000000000000000000000000000000000000000000000000000f541300000000000000000000000000000000000000000000000000000000000000c00000000000000000000000000000000000000000000000000000000000000000,,,1,true -14279,0x10e6593cdda8c58a1d0f14c5164b376352a55f2f,0x467194771dae2967aef3ecbedd3bf9a310c76c65,0xa9f9e6750000000000000000000000006b175474e89094c44da98b954eedeac495271d0f000000000000000000000000da10009cbd5d07dd0cecc66161fc93d7c9000da1000000000000000000000000169c4f390548ac0d3ed22b0c18e5c2a294b642a9000000000000000000000000169c4f390548ac0d3ed22b0c18e5c2a294b642a90000000000000000000000000000000000000000000000056e47e29fe29c0a3900000000000000000000000000000000000000000000000000000000000000c00000000000000000000000000000000000000000000000000000000000000000,,,1,true -14282,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec34000000000000000000000000be55369bfbfd4bccf13bd197ee7b1165c0b7a4f8000000000000000000000000be55369bfbfd4bccf13bd197ee7b1165c0b7a4f8000000000000000000000000000000000000000000000000000de0a8a7fe51d700000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -14283,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec340000000000000000000000002134240c7041ce4a50dcef6c40db82ec158793700000000000000000000000002134240c7041ce4a50dcef6c40db82ec158793700000000000000000000000000000000000000000000000000015fd3edd34ef2100000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -14287,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec3400000000000000000000000084509b4d29d486a55fa5e4c096848d286c7a027a00000000000000000000000084509b4d29d486a55fa5e4c096848d286c7a027a00000000000000000000000000000000000000000000000000038d7ea4c6800000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -14290,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec34000000000000000000000000969fba502f1c11d869676739c0a4dcb9a5ad95b2000000000000000000000000969fba502f1c11d869676739c0a4dcb9a5ad95b20000000000000000000000000000000000000000000000000137f806f2b775f600000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,0x704389f2ce140b906e33c94945beffd0e4f65cdf1fdf02df01b6489762bdda44,2022-03-12 07:39:33.000 UTC,0,true -14291,0x10e6593cdda8c58a1d0f14c5164b376352a55f2f,0x467194771dae2967aef3ecbedd3bf9a310c76c65,0xa9f9e6750000000000000000000000006b175474e89094c44da98b954eedeac495271d0f000000000000000000000000da10009cbd5d07dd0cecc66161fc93d7c9000da100000000000000000000000003f396735af8b4046d7de08ad8449f4db6f253f600000000000000000000000003f396735af8b4046d7de08ad8449f4db6f253f6000000000000000000000000000000000000000000000010904258cdee9b91c300000000000000000000000000000000000000000000000000000000000000c00000000000000000000000000000000000000000000000000000000000000000,0x387c89dad0f684d3028029b0a36c0e9d60b99b81dc4a2a3bd8c7679a4d467833,2021-12-21 11:56:19.000 UTC,0,true -14292,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec340000000000000000000000006250900f938cff02c43276af05badc2d06c1da5f0000000000000000000000006250900f938cff02c43276af05badc2d06c1da5f00000000000000000000000000000000000000000000000000807350737cc83a00000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -14293,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec34000000000000000000000000581f900fb75d4c37416f1d3ad86b815b4d07a884000000000000000000000000581f900fb75d4c37416f1d3ad86b815b4d07a8840000000000000000000000000000000000000000000000000093e1ab906375ac00000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,0xaf3664e632f72e7a43e49bfd4963965a3c0b7b3824fbf336798bfdb507af7b61,2021-12-16 11:56:03.000 UTC,0,true -14294,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec3400000000000000000000000012b3e17ee9bcf90763d11b67f3029ce54ea8ff0300000000000000000000000012b3e17ee9bcf90763d11b67f3029ce54ea8ff03000000000000000000000000000000000000000000000000002bab2eedbe86dc00000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -14295,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec34000000000000000000000000b389b98659d17ec8c264b523064e246bb464e755000000000000000000000000b389b98659d17ec8c264b523064e246bb464e755000000000000000000000000000000000000000000000000004a9b638448800000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -14296,0x10e6593cdda8c58a1d0f14c5164b376352a55f2f,0x467194771dae2967aef3ecbedd3bf9a310c76c65,0xa9f9e6750000000000000000000000006b175474e89094c44da98b954eedeac495271d0f000000000000000000000000da10009cbd5d07dd0cecc66161fc93d7c9000da1000000000000000000000000db5050691e32aaecb39946674737fb87c6230c15000000000000000000000000db5050691e32aaecb39946674737fb87c6230c150000000000000000000000000000000000000000000000000e043da61725000000000000000000000000000000000000000000000000000000000000000000c00000000000000000000000000000000000000000000000000000000000000000,,,1,true -14298,0x10e6593cdda8c58a1d0f14c5164b376352a55f2f,0x467194771dae2967aef3ecbedd3bf9a310c76c65,0xa9f9e6750000000000000000000000006b175474e89094c44da98b954eedeac495271d0f000000000000000000000000da10009cbd5d07dd0cecc66161fc93d7c9000da1000000000000000000000000d60efe9e4560bf32a785c39923caef1d580a0edd000000000000000000000000d60efe9e4560bf32a785c39923caef1d580a0edd0000000000000000000000000000000000000000000000000e043da61725000000000000000000000000000000000000000000000000000000000000000000c00000000000000000000000000000000000000000000000000000000000000000,,,1,true -14299,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec340000000000000000000000006710f4d73f116f7204629d511dbfff128f6aed290000000000000000000000006710f4d73f116f7204629d511dbfff128f6aed2900000000000000000000000000000000000000000000000000016bcc41e9000000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -14300,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec340000000000000000000000006710f4d73f116f7204629d511dbfff128f6aed290000000000000000000000006710f4d73f116f7204629d511dbfff128f6aed2900000000000000000000000000000000000000000000000000016bcc41e9000000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -14301,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec340000000000000000000000002185c428ee0ddbb23003dfb7b849ace5b86c4faa0000000000000000000000002185c428ee0ddbb23003dfb7b849ace5b86c4faa0000000000000000000000000000000000000000000000000000246139ca800000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -14302,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec3400000000000000000000000015c3d6298743e3115df3794f6da20ec4079d1eee00000000000000000000000015c3d6298743e3115df3794f6da20ec4079d1eee0000000000000000000000000000000000000000000000000dbd2fc137a3000000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -14303,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec34000000000000000000000000db5050691e32aaecb39946674737fb87c6230c15000000000000000000000000db5050691e32aaecb39946674737fb87c6230c1500000000000000000000000000000000000000000000000000001402462f600000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -14304,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec34000000000000000000000000d60efe9e4560bf32a785c39923caef1d580a0edd000000000000000000000000d60efe9e4560bf32a785c39923caef1d580a0edd0000000000000000000000000000000000000000000000000000246139ca800000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -14305,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec34000000000000000000000000d60efe9e4560bf32a785c39923caef1d580a0edd000000000000000000000000d60efe9e4560bf32a785c39923caef1d580a0edd0000000000000000000000000000000000000000000000000000246139ca800000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -14306,0x10e6593cdda8c58a1d0f14c5164b376352a55f2f,0x467194771dae2967aef3ecbedd3bf9a310c76c65,0xa9f9e6750000000000000000000000006b175474e89094c44da98b954eedeac495271d0f000000000000000000000000da10009cbd5d07dd0cecc66161fc93d7c9000da1000000000000000000000000ad4217cb594fe7a49cfa0daeb5556ea61ee45a88000000000000000000000000ad4217cb594fe7a49cfa0daeb5556ea61ee45a880000000000000000000000000000000000000000000000000f43fc2c04ee000000000000000000000000000000000000000000000000000000000000000000c00000000000000000000000000000000000000000000000000000000000000000,,,1,true -14308,0x10e6593cdda8c58a1d0f14c5164b376352a55f2f,0x467194771dae2967aef3ecbedd3bf9a310c76c65,0xa9f9e6750000000000000000000000006b175474e89094c44da98b954eedeac495271d0f000000000000000000000000da10009cbd5d07dd0cecc66161fc93d7c9000da10000000000000000000000004cf8c6f3a6653704cfa718b348588fda44f1d57d0000000000000000000000004cf8c6f3a6653704cfa718b348588fda44f1d57d0000000000000000000000000000000000000000000000000f43fc2c04ee000000000000000000000000000000000000000000000000000000000000000000c00000000000000000000000000000000000000000000000000000000000000000,,,1,true -14309,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec3400000000000000000000000028723161c5d1f50a9acb947c1633678f899910f700000000000000000000000028723161c5d1f50a9acb947c1633678f899910f70000000000000000000000000000000000000000000000000429d069189e000000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -14312,0x10e6593cdda8c58a1d0f14c5164b376352a55f2f,0x467194771dae2967aef3ecbedd3bf9a310c76c65,0xa9f9e6750000000000000000000000006b175474e89094c44da98b954eedeac495271d0f000000000000000000000000da10009cbd5d07dd0cecc66161fc93d7c9000da100000000000000000000000071ecf0b8b63ad6498e8adcb893e57173c474c8e900000000000000000000000071ecf0b8b63ad6498e8adcb893e57173c474c8e90000000000000000000000000000000000000000000000000e92596fd629000000000000000000000000000000000000000000000000000000000000000000c00000000000000000000000000000000000000000000000000000000000000000,,,1,true -14314,0x10e6593cdda8c58a1d0f14c5164b376352a55f2f,0x467194771dae2967aef3ecbedd3bf9a310c76c65,0xa9f9e6750000000000000000000000006b175474e89094c44da98b954eedeac495271d0f000000000000000000000000da10009cbd5d07dd0cecc66161fc93d7c9000da100000000000000000000000038d4cdf4b69aa2960974d3dd3d5318524c8c0e2000000000000000000000000038d4cdf4b69aa2960974d3dd3d5318524c8c0e200000000000000000000000000000000000000000000000000e0b58a360b2000000000000000000000000000000000000000000000000000000000000000000c00000000000000000000000000000000000000000000000000000000000000000,,,1,true -14316,0x10e6593cdda8c58a1d0f14c5164b376352a55f2f,0x467194771dae2967aef3ecbedd3bf9a310c76c65,0xa9f9e6750000000000000000000000006b175474e89094c44da98b954eedeac495271d0f000000000000000000000000da10009cbd5d07dd0cecc66161fc93d7c9000da1000000000000000000000000dfd5b125b629758c01047752917564521c98afa2000000000000000000000000dfd5b125b629758c01047752917564521c98afa20000000000000000000000000000000000000000000000000e4b4b8af6a7000000000000000000000000000000000000000000000000000000000000000000c00000000000000000000000000000000000000000000000000000000000000000,,,1,true -14317,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec34000000000000000000000000c2ef1173a4b051bbcc4474c407bbb2ac7e02e363000000000000000000000000c2ef1173a4b051bbcc4474c407bbb2ac7e02e3630000000000000000000000000000000000000000000000000095617a016b654000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -14318,0x10e6593cdda8c58a1d0f14c5164b376352a55f2f,0x467194771dae2967aef3ecbedd3bf9a310c76c65,0xa9f9e6750000000000000000000000006b175474e89094c44da98b954eedeac495271d0f000000000000000000000000da10009cbd5d07dd0cecc66161fc93d7c9000da1000000000000000000000000f7c200fec2cb4695b87e40bfbf8bd7dc52400635000000000000000000000000f7c200fec2cb4695b87e40bfbf8bd7dc524006350000000000000000000000000000000000000000000000000e6ed27d6668000000000000000000000000000000000000000000000000000000000000000000c00000000000000000000000000000000000000000000000000000000000000000,,,1,true -14322,0x10e6593cdda8c58a1d0f14c5164b376352a55f2f,0x467194771dae2967aef3ecbedd3bf9a310c76c65,0xa9f9e6750000000000000000000000006b175474e89094c44da98b954eedeac495271d0f000000000000000000000000da10009cbd5d07dd0cecc66161fc93d7c9000da1000000000000000000000000ba07c823f84bb2aa1cfda61cfa957750f2cf0022000000000000000000000000ba07c823f84bb2aa1cfda61cfa957750f2cf002200000000000000000000000000000000000000000000002d72f355c2fca1385e00000000000000000000000000000000000000000000000000000000000000c00000000000000000000000000000000000000000000000000000000000000000,,,1,true -14323,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec34000000000000000000000000b700e3039076924b6f801c72893810fe1ea44425000000000000000000000000b700e3039076924b6f801c72893810fe1ea444250000000000000000000000000000000000000000000000000007d10fc719190000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -14325,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec34000000000000000000000000382d2640a2838c8757feef06cb233f181a1d1eb9000000000000000000000000382d2640a2838c8757feef06cb233f181a1d1eb900000000000000000000000000000000000000000000000000adf429bd7327f200000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -14327,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec340000000000000000000000003f90715df94c96b6b4ede0b4f0731afd6a78b7b80000000000000000000000003f90715df94c96b6b4ede0b4f0731afd6a78b7b80000000000000000000000000000000000000000000000000068607749b6ce0000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,0x20552df6e2ae30ea2ec22d852499e7569cbbeb0bed61e79d4f0666f7fe42dd8c,2022-05-20 12:41:28.000 UTC,0,true -14328,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec340000000000000000000000009995dbde9a62e939b14c4236a9b027e3349bd05e0000000000000000000000009995dbde9a62e939b14c4236a9b027e3349bd05e0000000000000000000000000000000000000000000000000063bbe0ca22e69100000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -14330,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec34000000000000000000000000108ac19fa07d24a49965dccd53dc505ad3bf5acd000000000000000000000000108ac19fa07d24a49965dccd53dc505ad3bf5acd0000000000000000000000000000000000000000000000000140ddf0477868c900000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -14331,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec34000000000000000000000000b1aa11bb98e70000aac020045bc011db35097163000000000000000000000000b1aa11bb98e70000aac020045bc011db3509716300000000000000000000000000000000000000000000000000674cde2405ad0000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -14332,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec34000000000000000000000000c99f3b968b7a8c88414c266c4bd199bb1c7eb86c000000000000000000000000c99f3b968b7a8c88414c266c4bd199bb1c7eb86c000000000000000000000000000000000000000000000000013c53923ac6b94000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -14333,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec34000000000000000000000000885541c875019bc0d2dcd7576fe3d531efd5cb48000000000000000000000000885541c875019bc0d2dcd7576fe3d531efd5cb480000000000000000000000000000000000000000000000000dddb122417f8a0000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -14335,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec34000000000000000000000000c66cbebd9a8c00be01bde46d3d2d82d5b0630f04000000000000000000000000c66cbebd9a8c00be01bde46d3d2d82d5b0630f04000000000000000000000000000000000000000000000000001ff973cafa800000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -14336,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec34000000000000000000000000bcd522547f34273cb52886f5df5c65cf9381055a000000000000000000000000bcd522547f34273cb52886f5df5c65cf9381055a000000000000000000000000000000000000000000000000000000e8d4a5100000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -14339,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec34000000000000000000000000f8a09bf413576a2e8b406dae09732aae29a1c8d4000000000000000000000000f8a09bf413576a2e8b406dae09732aae29a1c8d40000000000000000000000000000000000000000000000000020842cfe24e80000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -14340,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec340000000000000000000000003e6b87ff2168d15794a865d09a6716415e7dbecf0000000000000000000000003e6b87ff2168d15794a865d09a6716415e7dbecf00000000000000000000000000000000000000000000000000212d60393f1f0000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -14341,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec340000000000000000000000002f4d0137d8433943cb58c4db97ef81a23eb9170c0000000000000000000000002f4d0137d8433943cb58c4db97ef81a23eb9170c000000000000000000000000000000000000000000000000000000174876e80000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -14343,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec34000000000000000000000000e365f00be0d20be799f89555dad65287fbcfb6cb000000000000000000000000e365f00be0d20be799f89555dad65287fbcfb6cb0000000000000000000000000000000000000000000000000011c37937e0800000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -14344,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec340000000000000000000000007d4875bd28c8fc049b3cd5fb1c62dbf3e954a8be0000000000000000000000007d4875bd28c8fc049b3cd5fb1c62dbf3e954a8be000000000000000000000000000000000000000000000000001c161164ac1aae00000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -14346,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec340000000000000000000000008f341966266afeb6d6ab89a0e9683ebd108692c20000000000000000000000008f341966266afeb6d6ab89a0e9683ebd108692c20000000000000000000000000000000000000000000000000011c37937e0800000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -14348,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec340000000000000000000000008f341966266afeb6d6ab89a0e9683ebd108692c20000000000000000000000008f341966266afeb6d6ab89a0e9683ebd108692c20000000000000000000000000000000000000000000000000011c37937e0800000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -14350,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec34000000000000000000000000907e8fef030bb24d63a6a3ee60e2aeca999540a2000000000000000000000000907e8fef030bb24d63a6a3ee60e2aeca999540a2000000000000000000000000000000000000000000000000000009184e72a00000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -14354,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec34000000000000000000000000676dac4935496dc09d51f3fbe8eab36d02155360000000000000000000000000676dac4935496dc09d51f3fbe8eab36d0215536000000000000000000000000000000000000000000000000003658b282e3d2a4e00000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -14355,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec34000000000000000000000000c3dcc314cc33f56ba4caad3d2885a5c23149923e000000000000000000000000c3dcc314cc33f56ba4caad3d2885a5c23149923e0000000000000000000000000000000000000000000000000037ddc65a30f7b600000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -14363,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec340000000000000000000000006add6a3a49c1583a3ecb62b3de1dbae9604b1dff0000000000000000000000006add6a3a49c1583a3ecb62b3de1dbae9604b1dff00000000000000000000000000000000000000000000000000670758aa7c800000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,0xd0ed299556ffbb495b4fd6a92106bf0b5e36fdeb2dbea6f90da495def0197a3a,2022-05-08 23:47:24.000 UTC,0,true -14364,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec34000000000000000000000000e0ba1356f184df2ec47d79cd69d144d985eaf625000000000000000000000000e0ba1356f184df2ec47d79cd69d144d985eaf62500000000000000000000000000000000000000000000000000c5105aa657689200000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -14365,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec34000000000000000000000000fecc81fff6ad516b005ce8b4cdb36d485ac252b4000000000000000000000000fecc81fff6ad516b005ce8b4cdb36d485ac252b40000000000000000000000000000000000000000000000000126789f618167e100000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -14368,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec3400000000000000000000000067248f105749b60045d89869c33b8bec986897eb00000000000000000000000067248f105749b60045d89869c33b8bec986897eb00000000000000000000000000000000000000000000000000a64c45d0fc9b2900000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -14369,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec34000000000000000000000000a5ecb25122e36b7b6816b50c100dda189c1857e8000000000000000000000000a5ecb25122e36b7b6816b50c100dda189c1857e80000000000000000000000000000000000000000000000000001ca39b9894f5b00000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -14370,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec34000000000000000000000000d657419b9eeb14472a76472d4269d3a9686f065f000000000000000000000000d657419b9eeb14472a76472d4269d3a9686f065f000000000000000000000000000000000000000000000000006a94d74f43000000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -14372,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec34000000000000000000000000277cb0775eb752862118987414944448b87bc679000000000000000000000000277cb0775eb752862118987414944448b87bc6790000000000000000000000000000000000000000000000000043364b4ffc5d0000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -14373,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec340000000000000000000000000c4d9d599a339f292560fa120d71875893d9a2af0000000000000000000000000c4d9d599a339f292560fa120d71875893d9a2af000000000000000000000000000000000000000000000000000000e8d4a5100000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -14374,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec34000000000000000000000000702f25a8c9c090239be779b567e5246ebb7e31cd000000000000000000000000702f25a8c9c090239be779b567e5246ebb7e31cd00000000000000000000000000000000000000000000000003e2c284391c000000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -14376,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec340000000000000000000000004103d6215ed19eb868a16eaff7baabd82dbb9ace0000000000000000000000004103d6215ed19eb868a16eaff7baabd82dbb9ace000000000000000000000000000000000000000000000000018d75ff0c716a0000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -14377,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec34000000000000000000000000ef7b11bb7d88d3b42e866fd40d0a974c9ed78188000000000000000000000000ef7b11bb7d88d3b42e866fd40d0a974c9ed781880000000000000000000000000000000000000000000000000182fae4463195cd00000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -14378,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec3400000000000000000000000003e23505d4c3a701c6ae843a3bd48997a7376fb400000000000000000000000003e23505d4c3a701c6ae843a3bd48997a7376fb40000000000000000000000000000000000000000000000000000f6da1673ef0000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -14381,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0xa9f9e675000000000000000000000000a0b86991c6218b36c1d19d4a2e9eb0ce3606eb480000000000000000000000007f5c764cbc14f9669b88837ca1490cca17c31607000000000000000000000000d0be70667943e357bb9be0f224854561d9909847000000000000000000000000d0be70667943e357bb9be0f224854561d990984700000000000000000000000000000000000000000000000000000000021f597800000000000000000000000000000000000000000000000000000000000000c00000000000000000000000000000000000000000000000000000000000000000,,,1,true -14383,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec34000000000000000000000000ed4df5ffa42559caa3905500e9e9e3e0eaf06d12000000000000000000000000ed4df5ffa42559caa3905500e9e9e3e0eaf06d120000000000000000000000000000000000000000000000000a5bc62c2184d68800000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -14385,0xcd9d4988c0ae61887b075ba77f08cbfad2b65068,0x3f87ff1de58128ef8fcb4c807efd776e1ac72e51,0xf4f7b41a0000000000000000000000004807cc1ea844f4e600848767bc5ad16a560bcb34000000000000000000000000000000000000000000000000bf5c1cb3f7d9cd3f,,,1,true -14387,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec34000000000000000000000000c9fe2d0c9c90ad3c90cc267c7d1da44bb4e4a4ff000000000000000000000000c9fe2d0c9c90ad3c90cc267c7d1da44bb4e4a4ff00000000000000000000000000000000000000000000000001307539711f6d7d00000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -14388,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec34000000000000000000000000f058b1f37596d606ac8585cbf197f692720d11b1000000000000000000000000f058b1f37596d606ac8585cbf197f692720d11b1000000000000000000000000000000000000000000000000003817283252a59400000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -14393,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec34000000000000000000000000658555cc8ff249c73ffd823cb1ede7b38c0a7f93000000000000000000000000658555cc8ff249c73ffd823cb1ede7b38c0a7f9300000000000000000000000000000000000000000000000001604f011ec5ec0000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -14395,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec34000000000000000000000000acad92fe0f90820b3300f64436be3cbd5d2af725000000000000000000000000acad92fe0f90820b3300f64436be3cbd5d2af72500000000000000000000000000000000000000000000000000c71029e928694500000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -14396,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec340000000000000000000000004bd142068e4220649ae629677ff1f073a48733330000000000000000000000004bd142068e4220649ae629677ff1f073a48733330000000000000000000000000000000000000000000000000587bb5d63f4c3d400000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -14398,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec34000000000000000000000000d6d6533a41f5c5dd4d10cef8a008217b3a6532a2000000000000000000000000d6d6533a41f5c5dd4d10cef8a008217b3a6532a200000000000000000000000000000000000000000000000000675324e54aa50000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -14399,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec34000000000000000000000000956331dc229f59643b2d1ef680f3a8442ba60921000000000000000000000000956331dc229f59643b2d1ef680f3a8442ba6092100000000000000000000000000000000000000000000000000d88da4bdf9e3ee00000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,0x71769dae020ed4a2930388f30e8594da2280559e5cb8fc123b0bf718a442750a,2022-06-03 16:08:24.000 UTC,0,true -14403,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0xa9f9e675000000000000000000000000dac17f958d2ee523a2206206994597c13d831ec700000000000000000000000094b008aa00579c1307b0ef2c499ad98a8ce58e58000000000000000000000000eb47fa16f2d2c911cd615124776fe0545f775520000000000000000000000000eb47fa16f2d2c911cd615124776fe0545f775520000000000000000000000000000000000000000000000000000000000c7f923900000000000000000000000000000000000000000000000000000000000000c00000000000000000000000000000000000000000000000000000000000000000,,,1,true -14405,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec34000000000000000000000000d969eec40f3c0497a221a0c0e19313dddfd5e167000000000000000000000000d969eec40f3c0497a221a0c0e19313dddfd5e1670000000000000000000000000000000000000000000000000b79c1e56ceb6a0e00000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -14409,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0xa9f9e675000000000000000000000000a0b86991c6218b36c1d19d4a2e9eb0ce3606eb480000000000000000000000007f5c764cbc14f9669b88837ca1490cca17c3160700000000000000000000000017e3c0330d2eaffc8a21acae5db958c50950bc0a00000000000000000000000017e3c0330d2eaffc8a21acae5db958c50950bc0a000000000000000000000000000000000000000000000000000000002c4e64f900000000000000000000000000000000000000000000000000000000000000c00000000000000000000000000000000000000000000000000000000000000000,,,1,true -14410,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec340000000000000000000000005d97e7a71824ae41ae4606762e06885eccb287e80000000000000000000000005d97e7a71824ae41ae4606762e06885eccb287e8000000000000000000000000000000000000000000000000015ac213ac7dd7cc00000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,0x929e90cd3813eaf4a27b20d5a65d9095894570f79bea62fef849455537610d0e,2022-08-26 19:36:40.000 UTC,0,true -14413,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec3400000000000000000000000032d5802d32ba81b28c85c6ab2d02867bd8c757d700000000000000000000000032d5802d32ba81b28c85c6ab2d02867bd8c757d7000000000000000000000000000000000000000000000000007b446d11c82b8000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -14417,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec34000000000000000000000000047034b82573d3ed0cd16d01dfb70881b3af4d92000000000000000000000000047034b82573d3ed0cd16d01dfb70881b3af4d9200000000000000000000000000000000000000000000000000a00d56eb8b3e0100000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -14419,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec340000000000000000000000009f9ec6b671f30ff554bc8ef93b7f111260e1b80a0000000000000000000000009f9ec6b671f30ff554bc8ef93b7f111260e1b80a00000000000000000000000000000000000000000000000000354a6ba7a1800000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -14421,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec340000000000000000000000008dc6e176391948aeb4aadf817e081d68dd20a2980000000000000000000000008dc6e176391948aeb4aadf817e081d68dd20a29800000000000000000000000000000000000000000000000000374a7309a7f7bf00000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -14424,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec340000000000000000000000000c43d79baeba1acb896b4e35f02615eb25c3e4aa0000000000000000000000000c43d79baeba1acb896b4e35f02615eb25c3e4aa000000000000000000000000000000000000000000000000008684f9d2c3d34000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -14425,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0xa9f9e675000000000000000000000000a0b86991c6218b36c1d19d4a2e9eb0ce3606eb480000000000000000000000007f5c764cbc14f9669b88837ca1490cca17c31607000000000000000000000000311d07b222519bff34bd42c032478ea98b5e6eee000000000000000000000000311d07b222519bff34bd42c032478ea98b5e6eee00000000000000000000000000000000000000000000000000000000a1963f0000000000000000000000000000000000000000000000000000000000000000c00000000000000000000000000000000000000000000000000000000000000000,,,1,true -14428,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec3400000000000000000000000047930c76790c865217472f2ddb4d14c640ee450a00000000000000000000000047930c76790c865217472f2ddb4d14c640ee450a0000000000000000000000000000000000000000000000000014e9c5db57b30000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -14429,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec340000000000000000000000009da89e29ab90c95efb8b4aa30825c7bfdbab80b80000000000000000000000009da89e29ab90c95efb8b4aa30825c7bfdbab80b8000000000000000000000000000000000000000000000000036fad342d8c265800000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,0x375d461b39ac7451ae71488c6b2de06db498c9b1c270a93438933a3f45e8cf02,2022-02-22 20:58:51.000 UTC,0,true -14433,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec34000000000000000000000000f3513c1261d7c9470c064bf3c7b80a8cb8a24e86000000000000000000000000f3513c1261d7c9470c064bf3c7b80a8cb8a24e8600000000000000000000000000000000000000000000000000da7f62d85f6af900000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,0x23100f30018e81430c2f95211cddcaf70527253e0d555fab27d9773227309661,2022-05-24 20:22:46.000 UTC,0,true -14434,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec340000000000000000000000009148fcc2b78bb12f960fd5c7bd5421b80d832cce0000000000000000000000009148fcc2b78bb12f960fd5c7bd5421b80d832cce00000000000000000000000000000000000000000000000000b1a2bc2ec5000000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,0x51a55607bd5ee7841f417aa637d6e5f9bf6fd00905627afc8b73f5463a342a16,2022-04-03 20:58:51.000 UTC,0,true -14435,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec34000000000000000000000000bd14cec791a6e925d482ed1205132bdf1e7ed74e000000000000000000000000bd14cec791a6e925d482ed1205132bdf1e7ed74e000000000000000000000000000000000000000000000000005c7dac57b9783f00000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -14438,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec3400000000000000000000000010e75f657fd34d9217e2a87ec30ccbbb23d0b5f300000000000000000000000010e75f657fd34d9217e2a87ec30ccbbb23d0b5f3000000000000000000000000000000000000000000000000003c6675a706db0400000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -14439,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec34000000000000000000000000ede97d279dabb60410b8ef0d8884a53a6f33a331000000000000000000000000ede97d279dabb60410b8ef0d8884a53a6f33a331000000000000000000000000000000000000000000000000020e4159b2aface800000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,0x09b5a4735b4178c0eea46c86ae226532c01ea4c380cb357b9632620aa1b697fb,2021-12-19 04:17:46.000 UTC,0,true -14440,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec340000000000000000000000002d867554fb5e44d0b120b5019dfcd20999fd43690000000000000000000000002d867554fb5e44d0b120b5019dfcd20999fd4369000000000000000000000000000000000000000000000000000009184e72a00000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -14441,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec340000000000000000000000009512b8c1b63c9893258920b5998134a1261db85d0000000000000000000000009512b8c1b63c9893258920b5998134a1261db85d000000000000000000000000000000000000000000000000002386f26fc1000000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -14444,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec340000000000000000000000006f5eea1e20e69c5db953db53267d0ab99b98bb030000000000000000000000006f5eea1e20e69c5db953db53267d0ab99b98bb030000000000000000000000000000000000000000000000001bc16d674ec8000000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -14445,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec340000000000000000000000006141ee2a0f53255c79b629e2830b9ab2617c76a00000000000000000000000006141ee2a0f53255c79b629e2830b9ab2617c76a0000000000000000000000000000000000000000000000000005e6e8b56941fbd00000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -14447,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec340000000000000000000000006ef5011856fb7a0d837340afc30522459a3899420000000000000000000000006ef5011856fb7a0d837340afc30522459a38994200000000000000000000000000000000000000000000000001787a68c02fd26900000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -14448,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec340000000000000000000000006871f7b5822439d13d37bfbcde61944e10863fe50000000000000000000000006871f7b5822439d13d37bfbcde61944e10863fe500000000000000000000000000000000000000000000000000000002540be40000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -14449,0xcd9d4988c0ae61887b075ba77f08cbfad2b65068,0x3f87ff1de58128ef8fcb4c807efd776e1ac72e51,0xf4f7b41a000000000000000000000000f988e0c45ee66006b7d815eeb3dd2c06b28ed1bc00000000000000000000000000000000000000000000000098a7d9b8314c0000,,,1,true -14452,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec34000000000000000000000000a3712bac7a9070647a4f7a0e671bbd1640857418000000000000000000000000a3712bac7a9070647a4f7a0e671bbd1640857418000000000000000000000000000000000000000000000000000009184e72a00000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -14455,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec34000000000000000000000000652330a1285f96e29053964913605a77acea38cb000000000000000000000000652330a1285f96e29053964913605a77acea38cb0000000000000000000000000000000000000000000000000018de76816d800000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -14456,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec34000000000000000000000000c899506db8549f1a1864e1938e290c90538c9990000000000000000000000000c899506db8549f1a1864e1938e290c90538c99900000000000000000000000000000000000000000000000000232053e3433655700000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,0x96d748df3ed5cd2f16982d60ce28dac62f21b015a42d459077a066847298982a,2021-12-19 04:39:48.000 UTC,0,true -14457,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec340000000000000000000000008123b9fc439e224387710d5443e0ba65741758ef0000000000000000000000008123b9fc439e224387710d5443e0ba65741758ef00000000000000000000000000000000000000000000000000005af3107a400000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -14458,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec34000000000000000000000000c431c7a0a3b877c5dd2c01280da5f3bbe4054944000000000000000000000000c431c7a0a3b877c5dd2c01280da5f3bbe40549440000000000000000000000000000000000000000000000000cf55d4d7a1aff6300000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -14460,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec3400000000000000000000000073b368c00bbbdaa25846d9c4530d32562ddb879200000000000000000000000073b368c00bbbdaa25846d9c4530d32562ddb87920000000000000000000000000000000000000000000000000005543df729c00000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -14461,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec34000000000000000000000000049063afec15f575944003e46ce5d614feeed99e000000000000000000000000049063afec15f575944003e46ce5d614feeed99e00000000000000000000000000000000000000000000000001588df28ad6e11a00000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -14462,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec34000000000000000000000000528aa39abab48b2dad03abe397be201a08bba8bf000000000000000000000000528aa39abab48b2dad03abe397be201a08bba8bf0000000000000000000000000000000000000000000000000000b5e620f4800000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -14463,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec34000000000000000000000000cfff7e57d91cbed35aaaa168fe4bf94bce120393000000000000000000000000cfff7e57d91cbed35aaaa168fe4bf94bce120393000000000000000000000000000000000000000000000000001b3fcd19a0c58000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -14464,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec34000000000000000000000000cb374b5829edc474f2fe713b05342f331b23f17e000000000000000000000000cb374b5829edc474f2fe713b05342f331b23f17e000000000000000000000000000000000000000000000000022f2f6689d416ec00000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,0x5b0e94a000cafc48f6e8c8353a5f44de015ae8e28f8f3c1fd96da43d9acf682d,2021-12-19 04:44:20.000 UTC,0,true -14465,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec34000000000000000000000000bc58a9eea6360167a0c3e81b13404a9b9b8803f0000000000000000000000000bc58a9eea6360167a0c3e81b13404a9b9b8803f0000000000000000000000000000000000000000000000000001ea533966d99c000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -14466,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec340000000000000000000000002bb524649296a6b8bede1cccf3b327852975e9b50000000000000000000000002bb524649296a6b8bede1cccf3b327852975e9b50000000000000000000000000000000000000000000000000000b5e620f4800000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -14467,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec34000000000000000000000000fab7efa4514a401f212b494c9cc4dfe28a8bd9ad000000000000000000000000fab7efa4514a401f212b494c9cc4dfe28a8bd9ad00000000000000000000000000000000000000000000000003311fc80a57000000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,0x3ffdae3a7a1edf932391f02ce22c9bf040402109f8244922015311fd3721ec0e,2021-11-27 02:45:46.000 UTC,0,true -14469,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec34000000000000000000000000aaade03035337dc4e64c9df724817ff0bf162acd000000000000000000000000aaade03035337dc4e64c9df724817ff0bf162acd0000000000000000000000000000000000000000000000000188c0c5241224a300000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -14470,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec34000000000000000000000000e9c0420c9b944a003d45b66f17d0c384e35b2139000000000000000000000000e9c0420c9b944a003d45b66f17d0c384e35b2139000000000000000000000000000000000000000000000000005fbdb13b34508900000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -14471,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec34000000000000000000000000a8808a771cf983d0ef33b2f8d1e34701ef5abf17000000000000000000000000a8808a771cf983d0ef33b2f8d1e34701ef5abf170000000000000000000000000000000000000000000000000200203500f0ea4000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -14472,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec340000000000000000000000006b2616fdcb783d326577bcd98c561bcaad16035d0000000000000000000000006b2616fdcb783d326577bcd98c561bcaad16035d00000000000000000000000000000000000000000000000002000632a11cb34000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -14473,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec3400000000000000000000000020b4c93fcc01db24666e7a3b1c1737527a4339fa00000000000000000000000020b4c93fcc01db24666e7a3b1c1737527a4339fa000000000000000000000000000000000000000000000000003de9f054d2417300000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -14474,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec34000000000000000000000000be79ced87649ea760589f56829dafc9f2c1cd6f2000000000000000000000000be79ced87649ea760589f56829dafc9f2c1cd6f20000000000000000000000000000000000000000000000000033387f911b4e6200000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -14475,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec340000000000000000000000006ac350ec997e3efb3d3253a77ea8a8f3a4eb95c00000000000000000000000006ac350ec997e3efb3d3253a77ea8a8f3a4eb95c000000000000000000000000000000000000000000000000000038d7ea4c6800000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -14476,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec340000000000000000000000004ab6012234a086b3312100f0299c93cff21c24cd0000000000000000000000004ab6012234a086b3312100f0299c93cff21c24cd00000000000000000000000000000000000000000000000000137a2786dd02cd00000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -14477,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec340000000000000000000000003e05898253609dc3b63fd71bb9d28243b1767abf0000000000000000000000003e05898253609dc3b63fd71bb9d28243b1767abf00000000000000000000000000000000000000000000000000566674f653250000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -14478,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec340000000000000000000000008f0ac690ae67ee389ef8b521758a4d5c13922c080000000000000000000000008f0ac690ae67ee389ef8b521758a4d5c13922c0800000000000000000000000000000000000000000000000000df6491915ca9c700000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -14479,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec340000000000000000000000002825ad2da5aa9356aed20d2aa876813d50d4bfd80000000000000000000000002825ad2da5aa9356aed20d2aa876813d50d4bfd80000000000000000000000000000000000000000000000000032ba50559c760000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -14481,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec340000000000000000000000003aa44ddc54f9ab8e82c0a457035097f53c8641780000000000000000000000003aa44ddc54f9ab8e82c0a457035097f53c86417800000000000000000000000000000000000000000000000000573ab10f2c220000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -14482,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec340000000000000000000000003b5f7c521eda2259aa12620a25cd71789e6471ca0000000000000000000000003b5f7c521eda2259aa12620a25cd71789e6471ca00000000000000000000000000000000000000000000000000133041c11fff2a00000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -14483,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec3400000000000000000000000029bea86ecb22fbf7f5cb764fdfd40f13199302ab00000000000000000000000029bea86ecb22fbf7f5cb764fdfd40f13199302ab0000000000000000000000000000000000000000000000000015c3d5b22cddd400000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -14485,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec34000000000000000000000000b32e99470c494256e3683493be6edbd6b943a0ed000000000000000000000000b32e99470c494256e3683493be6edbd6b943a0ed0000000000000000000000000000000000000000000000000016ac5bb2eeb47700000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -14486,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec3400000000000000000000000068d8882ab5b5ac332f5636a02808c8addd94882900000000000000000000000068d8882ab5b5ac332f5636a02808c8addd9488290000000000000000000000000000000000000000000000000000b5e620f4800000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -14487,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec340000000000000000000000005b7b80c8c25bea60f3d08d73dc7f5be827764ef00000000000000000000000005b7b80c8c25bea60f3d08d73dc7f5be827764ef000000000000000000000000000000000000000000000000000da4bec5dfc2d6400000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,0x01c6b46140a84777df79a4759fb84f2e83d8406965a395c14051560115d86eb9,2022-06-01 02:19:39.000 UTC,0,true -14489,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec34000000000000000000000000a1812222b05e44b90e0771f3d84387e2bfd981d0000000000000000000000000a1812222b05e44b90e0771f3d84387e2bfd981d00000000000000000000000000000000000000000000000000016ac9c7dcb74f600000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -14490,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec34000000000000000000000000f83fc1f2a97e5f014188775e228de9044ce98af6000000000000000000000000f83fc1f2a97e5f014188775e228de9044ce98af600000000000000000000000000000000000000000000000001f08f4e10c456fb00000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -14492,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec34000000000000000000000000080fc7793deb839d65a0d233d1ba6fec97444fcf000000000000000000000000080fc7793deb839d65a0d233d1ba6fec97444fcf000000000000000000000000000000000000000000000000000012309ce5400000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -14493,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec340000000000000000000000004d683f0f3c665488c2faaf11db87fab24e8ff0c80000000000000000000000004d683f0f3c665488c2faaf11db87fab24e8ff0c8000000000000000000000000000000000000000000000000003744e99d0c8c0000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -14494,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec340000000000000000000000004c3112778f18924da2c30dd865ab492a44990a190000000000000000000000004c3112778f18924da2c30dd865ab492a44990a190000000000000000000000000000000000000000000000000016d9a1753ee81000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -14495,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec34000000000000000000000000e21c83d1c3af9d1f3aea34863f576e97581e5953000000000000000000000000e21c83d1c3af9d1f3aea34863f576e97581e59530000000000000000000000000000000000000000000000000001476b081e800000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -14496,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec34000000000000000000000000e21333b29bad2e7471ec30658a693bda4d65d2ff000000000000000000000000e21333b29bad2e7471ec30658a693bda4d65d2ff00000000000000000000000000000000000000000000000000138113e4944af200000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -14497,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec340000000000000000000000003daed5bcaaa96264f1da7d092079dab6947dbc8f0000000000000000000000003daed5bcaaa96264f1da7d092079dab6947dbc8f000000000000000000000000000000000000000000000000001083c0ac5ebdad00000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -14498,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec3400000000000000000000000058863b10a5e7efe698b2546b3e91cbc28c06c81300000000000000000000000058863b10a5e7efe698b2546b3e91cbc28c06c813000000000000000000000000000000000000000000000000006122ac0656ba4000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -14499,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec3400000000000000000000000005eae41614a92e9cd5a017494fdb86df65672cb200000000000000000000000005eae41614a92e9cd5a017494fdb86df65672cb2000000000000000000000000000000000000000000000000000afde251fbcfc000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -14500,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec34000000000000000000000000d5aaf71264632b23af10a95c48a89bcb9d09c6d2000000000000000000000000d5aaf71264632b23af10a95c48a89bcb9d09c6d2000000000000000000000000000000000000000000000000000002ba7def300000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -14502,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec3400000000000000000000000075565fd255dce7d7c7911b38a26c841b850c1ca500000000000000000000000075565fd255dce7d7c7911b38a26c841b850c1ca5000000000000000000000000000000000000000000000000002c160232714b3300000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -14503,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec3400000000000000000000000048e91697f0cbbcafd1f3e53b25af7720c07ca0be00000000000000000000000048e91697f0cbbcafd1f3e53b25af7720c07ca0be0000000000000000000000000000000000000000000000000012645398b7887800000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -14504,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec34000000000000000000000000590ed1d0352a17fe5c7d5fb81d9df5b5e6233a75000000000000000000000000590ed1d0352a17fe5c7d5fb81d9df5b5e6233a75000000000000000000000000000000000000000000000000002ab4384cf51de600000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -14505,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec340000000000000000000000004bc5102023fa952e470720983633d74c400d73440000000000000000000000004bc5102023fa952e470720983633d74c400d734400000000000000000000000000000000000000000000000000153a661757f05700000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -14506,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec34000000000000000000000000e6bf88d7a74498f1bdb76fc917e4b6d259d12419000000000000000000000000e6bf88d7a74498f1bdb76fc917e4b6d259d12419000000000000000000000000000000000000000000000000004773c3d7812f5b00000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -14508,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec34000000000000000000000000862f5898ab9c9574cbdee239fce21cac6fd1c2d0000000000000000000000000862f5898ab9c9574cbdee239fce21cac6fd1c2d000000000000000000000000000000000000000000000000000195b4073dea4f400000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -14509,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec340000000000000000000000008890799c9a1e9ece844d8271347643843583087f0000000000000000000000008890799c9a1e9ece844d8271347643843583087f0000000000000000000000000000000000000000000000000021b532ce3a560100000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -14510,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec340000000000000000000000001a98d86ec1ebdd9122110aeff9ead46deefb09ce0000000000000000000000001a98d86ec1ebdd9122110aeff9ead46deefb09ce0000000000000000000000000000000000000000000000000015efcaa1d4268100000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -14511,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec34000000000000000000000000dfbd3dfa1c72cd64ecc504b97c111926ea3b94d7000000000000000000000000dfbd3dfa1c72cd64ecc504b97c111926ea3b94d70000000000000000000000000000000000000000000000000015ab2c0301005600000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -14513,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec3400000000000000000000000086a7f79b8f6d9c7542dc0c0f26ec52e1be7da90000000000000000000000000086a7f79b8f6d9c7542dc0c0f26ec52e1be7da9000000000000000000000000000000000000000000000000000001c6bf5263400000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -14514,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec34000000000000000000000000b1d94fcdb66dec18ece038bba08f4a465f630449000000000000000000000000b1d94fcdb66dec18ece038bba08f4a465f630449000000000000000000000000000000000000000000000000007e7a4792a6d5d800000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -14515,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec340000000000000000000000009fd1adb1f6d760b020f65940e56a59338cbff54c0000000000000000000000009fd1adb1f6d760b020f65940e56a59338cbff54c00000000000000000000000000000000000000000000000000c547ec8b15161400000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -14516,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec34000000000000000000000000067fc64e8681e590ddd35285c13d1fcb89deeb12000000000000000000000000067fc64e8681e590ddd35285c13d1fcb89deeb12000000000000000000000000000000000000000000000000032f198d4374dd0000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -14517,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec340000000000000000000000002aaf4e90520baeca9cdfed9ea92c5fa71993192a0000000000000000000000002aaf4e90520baeca9cdfed9ea92c5fa71993192a00000000000000000000000000000000000000000000000000153f302b7266a500000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -14518,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec340000000000000000000000006dc8583a625298aaa8671b70eb3ce3b86197a5cb0000000000000000000000006dc8583a625298aaa8671b70eb3ce3b86197a5cb000000000000000000000000000000000000000000000000018309b07b25e90000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,0x9b80769cc2efa99fbee48904e980523622b09b8c441abfd596d0c2fb33ccc16c,2022-03-04 08:04:03.000 UTC,0,true -14520,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec34000000000000000000000000c9471b4ec137853a1b5cae871bd6de9a8b08c5cf000000000000000000000000c9471b4ec137853a1b5cae871bd6de9a8b08c5cf0000000000000000000000000000000000000000000000000015b1d1baaea8c100000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -14521,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec34000000000000000000000000fc1dcaf774304ff2fa7920836c95400b237f349f000000000000000000000000fc1dcaf774304ff2fa7920836c95400b237f349f000000000000000000000000000000000000000000000000001322c1dea952aa00000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -14523,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec3400000000000000000000000041fa8cf2ae231a7e76881b935d374b4237aa998300000000000000000000000041fa8cf2ae231a7e76881b935d374b4237aa998300000000000000000000000000000000000000000000000000a10aa109566b3600000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -14524,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec34000000000000000000000000181a81e54da038370a88b95f5b6e352c27c5bdac000000000000000000000000181a81e54da038370a88b95f5b6e352c27c5bdac00000000000000000000000000000000000000000000000000a9b12a19f1451100000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,0xbe0f8569175eeffdae9592eb9c3ec921bb0f18b227ba2004a76db2426261572b,2022-03-17 06:34:23.000 UTC,0,true -14525,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec34000000000000000000000000302380cf390d95136ea80b5efe6366c11b32cb51000000000000000000000000302380cf390d95136ea80b5efe6366c11b32cb5100000000000000000000000000000000000000000000000000b6c452b8246fd200000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -14526,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec340000000000000000000000004774978adbd9a017e8f42ef1be55c2c058450fb30000000000000000000000004774978adbd9a017e8f42ef1be55c2c058450fb3000000000000000000000000000000000000000000000000000110d9316ec00000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -14527,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec340000000000000000000000002671b78e7cb60779e5409c588c9c11fa2ccbd34c0000000000000000000000002671b78e7cb60779e5409c588c9c11fa2ccbd34c0000000000000000000000000000000000000000000000000012a3e2bbd01c1400000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -14528,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec3400000000000000000000000083940789ecf1123ecda5259d180ff4c7637c736c00000000000000000000000083940789ecf1123ecda5259d180ff4c7637c736c0000000000000000000000000000000000000000000000000038d7ea4c68000000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -14529,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec34000000000000000000000000b41d08126deb4010da0b031d06dc543653f88329000000000000000000000000b41d08126deb4010da0b031d06dc543653f88329000000000000000000000000000000000000000000000000005ac5ada651f26a00000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -14530,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec340000000000000000000000004dc34ac1247e9d4cded76ce5cdd582804081c8fe0000000000000000000000004dc34ac1247e9d4cded76ce5cdd582804081c8fe00000000000000000000000000000000000000000000000000114ffeff82b12600000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -14531,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec34000000000000000000000000302380cf390d95136ea80b5efe6366c11b32cb51000000000000000000000000302380cf390d95136ea80b5efe6366c11b32cb51000000000000000000000000000000000000000000000000005fd9e6dc0b553000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -14532,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec34000000000000000000000000af583fe68440eec623fc223ebfc84d2ba75c9acf000000000000000000000000af583fe68440eec623fc223ebfc84d2ba75c9acf0000000000000000000000000000000000000000000000000015322f9510cad600000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -14533,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec34000000000000000000000000018c0ccd1b42a9781481d97a4b73ba8962b9f4d9000000000000000000000000018c0ccd1b42a9781481d97a4b73ba8962b9f4d900000000000000000000000000000000000000000000000002304d06820ef1d700000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,0x01419262a5d4aad4ef96c868a4bbd9da8653fbc8966527ed89e2ed063f30d61f,2021-12-19 04:48:04.000 UTC,0,true -14534,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec34000000000000000000000000b3f4cf4195b6fc1601b667e524f8b9bca720f996000000000000000000000000b3f4cf4195b6fc1601b667e524f8b9bca720f9960000000000000000000000000000000000000000000000000230d900bc05b1df00000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,0xdcd6bb59974c2f284b3ccf7d8a467ec85d4352dec8111bb4d8f1f331977e2c23,2021-12-19 04:51:19.000 UTC,0,true -14535,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec3400000000000000000000000045f99d8974120001c3300b320a266f40f1601f3900000000000000000000000045f99d8974120001c3300b320a266f40f1601f3900000000000000000000000000000000000000000000000000092456df261c0000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -14536,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec34000000000000000000000000a01ca6267c599388ccd9049d5c8f69db3baab041000000000000000000000000a01ca6267c599388ccd9049d5c8f69db3baab041000000000000000000000000000000000000000000000000022e718ab8ed6fc600000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,0xca226dca43bf3f8ceb607089e30842511812971157b6ea87103fa0c9c5ce9f63,2021-12-19 05:22:35.000 UTC,0,true -14537,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec3400000000000000000000000036a7a9f86189e6e548de91428304f347932e728100000000000000000000000036a7a9f86189e6e548de91428304f347932e7281000000000000000000000000000000000000000000000000001263d320a579d300000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -14538,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec3400000000000000000000000047e36a6edbcef05c3f697bab1d7d633c4ba4e49100000000000000000000000047e36a6edbcef05c3f697bab1d7d633c4ba4e49100000000000000000000000000000000000000000000000001dc104a3fe7000000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,0x4eb63412bc12490d40b03106345accf2fe9dfd6f6178b5ed39996b582d539002,2021-11-28 11:56:41.000 UTC,0,true -14539,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec34000000000000000000000000adfc26b6520a35c37af3ac5af174249737ec612c000000000000000000000000adfc26b6520a35c37af3ac5af174249737ec612c0000000000000000000000000000000000000000000000000082dced6e12d84a00000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -14540,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec3400000000000000000000000032f83b494fc594f8e57cba39e8a0c33214073f4000000000000000000000000032f83b494fc594f8e57cba39e8a0c33214073f40000000000000000000000000000000000000000000000000022f0fad90899e9100000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,0x009b61c67c41a9654a64f323e64230db3c8f849d332e63634a10859552aa48b7,2021-12-19 05:26:12.000 UTC,0,true -14541,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec34000000000000000000000000a7e7ebf02b8d9727f8406e97cb21ffd02250d57b000000000000000000000000a7e7ebf02b8d9727f8406e97cb21ffd02250d57b0000000000000000000000000000000000000000000000000015e41083cc00b900000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -14542,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec340000000000000000000000007de6aa8cd9a9654145fd9869ea08816992b59c870000000000000000000000007de6aa8cd9a9654145fd9869ea08816992b59c870000000000000000000000000000000000000000000000000000034630b8a00000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -14544,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec340000000000000000000000008ad865b57fb72870eb1daf309f92fb7ba327860b0000000000000000000000008ad865b57fb72870eb1daf309f92fb7ba327860b000000000000000000000000000000000000000000000000001138afa2de6fc100000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,0x5200f07ad61d09354ba78d1df1e4e1fb6ff5a14413474b6bba423a1b5ea5cae2,2022-07-30 22:41:27.000 UTC,0,true -14545,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec34000000000000000000000000162a9669c0e162d9ef545efe37f70b010f4bed77000000000000000000000000162a9669c0e162d9ef545efe37f70b010f4bed77000000000000000000000000000000000000000000000000008e4030122ae39500000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -14546,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec340000000000000000000000003df9f33d7caaf1b50cfd16738bdf308468ef0c140000000000000000000000003df9f33d7caaf1b50cfd16738bdf308468ef0c140000000000000000000000000000000000000000000000000016ad8b8140bc0f00000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -14547,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec34000000000000000000000000b06568d5f401012530139ece2667a5de6c85eec2000000000000000000000000b06568d5f401012530139ece2667a5de6c85eec200000000000000000000000000000000000000000000000000180d212006dce700000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -14549,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec34000000000000000000000000a9c67cb03729a72237ec6205fa5e32b645cc0a6f000000000000000000000000a9c67cb03729a72237ec6205fa5e32b645cc0a6f0000000000000000000000000000000000000000000000000013a2070e82c65c00000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -14550,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec34000000000000000000000000dee36b5856df7ebedc8fabcef0f86417547363bb000000000000000000000000dee36b5856df7ebedc8fabcef0f86417547363bb00000000000000000000000000000000000000000000000032cfb69b38ce453d00000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -14551,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec3400000000000000000000000057e4b7d3926e8970c94bbea676e4144fcc3866f300000000000000000000000057e4b7d3926e8970c94bbea676e4144fcc3866f30000000000000000000000000000000000000000000000000000034630b8a00000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -14552,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec34000000000000000000000000abc42b6a90c2a5962c1be78be7344a7d05848ee4000000000000000000000000abc42b6a90c2a5962c1be78be7344a7d05848ee400000000000000000000000000000000000000000000000001569f77dbcf766700000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -14553,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec3400000000000000000000000091b56d6bee38057e62b36eb844d793bfcca7d48600000000000000000000000091b56d6bee38057e62b36eb844d793bfcca7d48600000000000000000000000000000000000000000000000000149347a146511700000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -14554,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec34000000000000000000000000f5e5f687406d072c4bcccda452f426688df7a901000000000000000000000000f5e5f687406d072c4bcccda452f426688df7a9010000000000000000000000000000000000000000000000000010c9818331419a00000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -14556,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec34000000000000000000000000eb57544ac7ea46db54958f8a48af53fa5546c246000000000000000000000000eb57544ac7ea46db54958f8a48af53fa5546c2460000000000000000000000000000000000000000000000000010d850f07ede7400000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -14557,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec34000000000000000000000000f1007f903a8c583f8f9efa7a693d41eec2ed9bd0000000000000000000000000f1007f903a8c583f8f9efa7a693d41eec2ed9bd0000000000000000000000000000000000000000000000000000110d9316ec00000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -14558,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec340000000000000000000000007dc6155b6a5ec6bb0096dfc460ba69299bc7f6570000000000000000000000007dc6155b6a5ec6bb0096dfc460ba69299bc7f657000000000000000000000000000000000000000000000000003be4eebd68304000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -14559,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec340000000000000000000000007a32265bcd45c5f7d24db5ccd9051ce6f058e1db0000000000000000000000007a32265bcd45c5f7d24db5ccd9051ce6f058e1db000000000000000000000000000000000000000000000000005e7ab05cb1304500000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -14560,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec34000000000000000000000000f26998db738b9f6658d5a47b2666549dd524bb7b000000000000000000000000f26998db738b9f6658d5a47b2666549dd524bb7b000000000000000000000000000000000000000000000000008e1bc9bf04000000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -14563,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec340000000000000000000000004b8259591efce15da36232c473a83199e780a4110000000000000000000000004b8259591efce15da36232c473a83199e780a41100000000000000000000000000000000000000000000000000112e33b52acd3c00000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -14564,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec34000000000000000000000000a2b1d3508bb2e1d9caa5e91016847e8d73064793000000000000000000000000a2b1d3508bb2e1d9caa5e91016847e8d730647930000000000000000000000000000000000000000000000000010fe4b1ac7f41600000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -14565,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec34000000000000000000000000fc9c19d3277012a9c325cf355e5719f3cd3dfcf7000000000000000000000000fc9c19d3277012a9c325cf355e5719f3cd3dfcf700000000000000000000000000000000000000000000000000001b48eb57e00000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -14567,0xcd9d4988c0ae61887b075ba77f08cbfad2b65068,0x3f87ff1de58128ef8fcb4c807efd776e1ac72e51,0xf4f7b41a0000000000000000000000003be267c19ceff4a3a303faaeee5127cb0947c60e00000000000000000000000000000000000000000000000024f73ba9dcadf3d4,,,1,true -14568,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec34000000000000000000000000ae8e2b4abb13de393515ef5abad7e35a2b11ba6d000000000000000000000000ae8e2b4abb13de393515ef5abad7e35a2b11ba6d000000000000000000000000000000000000000000000000002386f26fc1000000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,0x4e96a73b6eba0022552641aa7f226ef3b0d5ddc63ed2583196700f0646d90f1d,2022-05-25 06:41:00.000 UTC,0,true -14570,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec34000000000000000000000000d87e4695d674635795966bd72a545ca54d253140000000000000000000000000d87e4695d674635795966bd72a545ca54d25314000000000000000000000000000000000000000000000000006d3350e05e9b4d700000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,0xa197cbde91d0b613faac888c7b5a0220e9b0d12ec307f70fa38aff595979e6f4,2022-05-27 06:52:15.000 UTC,0,true -14572,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec340000000000000000000000008ef01cc68a08dcdc771fcda60a402c0992ad87670000000000000000000000008ef01cc68a08dcdc771fcda60a402c0992ad87670000000000000000000000000000000000000000000000000014c8e4a2f764a100000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -14574,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec34000000000000000000000000d69de8e55e73e0b308b8c6c4424090febea5ced2000000000000000000000000d69de8e55e73e0b308b8c6c4424090febea5ced20000000000000000000000000000000000000000000000000267c26a8c021ea100000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -14575,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec34000000000000000000000000a0d715b20c3df8d3859e897dab846453beee2a53000000000000000000000000a0d715b20c3df8d3859e897dab846453beee2a53000000000000000000000000000000000000000000000000000221b262dd800000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -14576,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec3400000000000000000000000057005a8c8639a64327ea53c05d0a8f3359adcc8d00000000000000000000000057005a8c8639a64327ea53c05d0a8f3359adcc8d000000000000000000000000000000000000000000000000000001d1a94a200000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -14577,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec340000000000000000000000005a9e7432d487cc67eaf5c909fc10f8c1257723ba0000000000000000000000005a9e7432d487cc67eaf5c909fc10f8c1257723ba000000000000000000000000000000000000000000000000013ebc0208e7765700000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -14578,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec34000000000000000000000000442e074b32775ec36d84fe9c137074bc4e97c200000000000000000000000000442e074b32775ec36d84fe9c137074bc4e97c20000000000000000000000000000000000000000000000000001d0ef13cbb0ee6300000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -14582,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec340000000000000000000000002bab2e743a32a054eae3f26bd921f13116ee4f7a0000000000000000000000002bab2e743a32a054eae3f26bd921f13116ee4f7a00000000000000000000000000000000000000000000000000060a24181e400000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -14585,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec34000000000000000000000000bec5c94c0ce7a6b27e5d43d8b0da2701d6393537000000000000000000000000bec5c94c0ce7a6b27e5d43d8b0da2701d639353700000000000000000000000000000000000000000000000000071afd498d000000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -14586,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec34000000000000000000000000c5ed8bc55129b31e4a801fda5489b27bb96ded3f000000000000000000000000c5ed8bc55129b31e4a801fda5489b27bb96ded3f0000000000000000000000000000000000000000000000000059a7c3452b4c7c00000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -14587,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec340000000000000000000000003d0cd6508fd2a1baee0a0c7f596d63e23676616a0000000000000000000000003d0cd6508fd2a1baee0a0c7f596d63e23676616a000000000000000000000000000000000000000000000000000aa87bee53800000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -14590,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec3400000000000000000000000008449f8db1a87d8105d7e1e697c3b220193e344700000000000000000000000008449f8db1a87d8105d7e1e697c3b220193e3447000000000000000000000000000000000000000000000000001c7ced19a167c000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -14593,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec34000000000000000000000000e8d32f90d8283830145a95aebad1b83c565e045a000000000000000000000000e8d32f90d8283830145a95aebad1b83c565e045a000000000000000000000000000000000000000000000000000aa87bee53800000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -14605,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec340000000000000000000000000a2f1b8d1e3bfd649811a4944d155cffb6be54260000000000000000000000000a2f1b8d1e3bfd649811a4944d155cffb6be5426000000000000000000000000000000000000000000000000015d6f8b75cbb97500000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -14609,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec340000000000000000000000002932eb2cea773396e242423e401fba74c57ceb1d0000000000000000000000002932eb2cea773396e242423e401fba74c57ceb1d00000000000000000000000000000000000000000000000053444835ec58000000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -14619,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec340000000000000000000000002ed99802e97eb84809c07fa93f91bdddf27c61250000000000000000000000002ed99802e97eb84809c07fa93f91bdddf27c61250000000000000000000000000000000000000000000000000014d280ac5b05d900000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -14621,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec3400000000000000000000000073a54e1b681dfdba14d74226e2c88090e4c61ca300000000000000000000000073a54e1b681dfdba14d74226e2c88090e4c61ca300000000000000000000000000000000000000000000000000163c0356db051000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -14624,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec3400000000000000000000000068ed88ea02fbebd2538dadd3ba656d8e76bef5c100000000000000000000000068ed88ea02fbebd2538dadd3ba656d8e76bef5c1000000000000000000000000000000000000000000000000001752b5b30d85a500000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -14627,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec34000000000000000000000000b1598d77786da3748f8f6315494a88f9a190c55c000000000000000000000000b1598d77786da3748f8f6315494a88f9a190c55c0000000000000000000000000000000000000000000000000016145a9607d1ec00000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -14628,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec34000000000000000000000000d0d6ec6895a73a049bb380a1feb4f58c4003a933000000000000000000000000d0d6ec6895a73a049bb380a1feb4f58c4003a93300000000000000000000000000000000000000000000000000141adddd886a0d00000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -14630,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec34000000000000000000000000ec83585e2cbb3b178a9b457da006867c5d14a021000000000000000000000000ec83585e2cbb3b178a9b457da006867c5d14a021000000000000000000000000000000000000000000000000001890816ca567ff00000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -14632,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec34000000000000000000000000497eaef16a3b4ac502e0ecef0bf858228b531774000000000000000000000000497eaef16a3b4ac502e0ecef0bf858228b5317740000000000000000000000000000000000000000000000000150ecfa9e882da300000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,0x68f01dd88f03047f6d14497e8cbda9d70d026ba24edcdf9a17dd360bdbb18359,2021-12-13 11:33:41.000 UTC,0,true -14633,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec34000000000000000000000000ff690312a3791db3597148e69ebd411c99975159000000000000000000000000ff690312a3791db3597148e69ebd411c99975159000000000000000000000000000000000000000000000000001601a6db2812d300000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -14634,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec340000000000000000000000001c8ef4aae0d0c3f1ee879ee14d2713cfcd3676470000000000000000000000001c8ef4aae0d0c3f1ee879ee14d2713cfcd3676470000000000000000000000000000000000000000000000000062fa5e90a96dc200000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -14635,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec34000000000000000000000000c9dfd080ace9e813fb42d9e0ca34d07b758c8710000000000000000000000000c9dfd080ace9e813fb42d9e0ca34d07b758c8710000000000000000000000000000000000000000000000000001034fc105682cf00000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -14636,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec340000000000000000000000000555916e2b2a7b353f4d58486122587d57c9a1440000000000000000000000000555916e2b2a7b353f4d58486122587d57c9a1440000000000000000000000000000000000000000000000000011dc3242c55bc800000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -14641,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec34000000000000000000000000748a1bea1a431a0f424dd264af25ef67a0232fce000000000000000000000000748a1bea1a431a0f424dd264af25ef67a0232fce000000000000000000000000000000000000000000000000001316eeeb5a505300000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -14644,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec34000000000000000000000000d7030954e5a634bc690acd0ed59da14879bdb50b000000000000000000000000d7030954e5a634bc690acd0ed59da14879bdb50b00000000000000000000000000000000000000000000000001617cc494dff10000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -14646,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec340000000000000000000000000934124e672e932c0f686954db57cfd3fbd1d4ff0000000000000000000000000934124e672e932c0f686954db57cfd3fbd1d4ff000000000000000000000000000000000000000000000000005deda701dcb2de00000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,0x0851f068e16184864bd5ab418791346c3df5fc2778a278e91256ca3c30b5e807,2022-03-24 08:55:09.000 UTC,0,true -14648,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec34000000000000000000000000c223b9c56b0433387343fc23728fda353fe50ff0000000000000000000000000c223b9c56b0433387343fc23728fda353fe50ff000000000000000000000000000000000000000000000000000550057fbe2e82a00000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,0xacd86f96c1bef309d983ecffee05b28770345f2a88cb1ba34daf8b4715f9f750,2022-04-10 09:25:02.000 UTC,0,true -14652,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec34000000000000000000000000c223b9c56b0433387343fc23728fda353fe50ff0000000000000000000000000c223b9c56b0433387343fc23728fda353fe50ff000000000000000000000000000000000000000000000000000508f9e3ae06a8d00000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,0x9f26cc06c8d5c075d9b98bc625978008383892bf12d4ce9b3cf0d2f4095282e3,2022-04-10 09:01:34.000 UTC,0,true -14653,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec340000000000000000000000006ea36af93f0ab4c882c9d71a5d9f04dabcdcc4fd0000000000000000000000006ea36af93f0ab4c882c9d71a5d9f04dabcdcc4fd000000000000000000000000000000000000000000000000015e8b43b43e445000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -14654,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec340000000000000000000000002dcbc955b963534aa09572cfbe644a6f4f8b280f0000000000000000000000002dcbc955b963534aa09572cfbe644a6f4f8b280f0000000000000000000000000000000000000000000000000011c37937e0800000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -14656,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec340000000000000000000000000632501776bb853b435ecee64b1a99eaa4f5e2ad0000000000000000000000000632501776bb853b435ecee64b1a99eaa4f5e2ad00000000000000000000000000000000000000000000000009182356d327b92800000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -14664,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec34000000000000000000000000d8ea2af408ced89a6b09059c1f27aba3b37d1afd000000000000000000000000d8ea2af408ced89a6b09059c1f27aba3b37d1afd000000000000000000000000000000000000000000000000044443c5f165d00200000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -14666,0xcd9d4988c0ae61887b075ba77f08cbfad2b65068,0x3f87ff1de58128ef8fcb4c807efd776e1ac72e51,0xf4f7b41a0000000000000000000000001bedb365b833dea1dcfdd2a924874da9d37c80b70000000000000000000000000000000000000000000000040c8aa6e4a42c6083,0x5c0c4ad3e8aebfa7401f18888f851734ffa293d4e730cd97e33db14656f7c5ed,2022-03-15 11:08:08.000 UTC,0,true -14667,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec3400000000000000000000000020a97ad799236be3e4971f1fdc9a6a42f5e7f7b900000000000000000000000020a97ad799236be3e4971f1fdc9a6a42f5e7f7b9000000000000000000000000000000000000000000000000001ed5711348e11600000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -14668,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec34000000000000000000000000d942e0ac4f140ecf3bfb223421c73ec156dfcf53000000000000000000000000d942e0ac4f140ecf3bfb223421c73ec156dfcf5300000000000000000000000000000000000000000000000000245e3315b427a900000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -14669,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec340000000000000000000000008fb4f6ae091050630bccde15062cbf547ad173720000000000000000000000008fb4f6ae091050630bccde15062cbf547ad173720000000000000000000000000000000000000000000000000173ebc27c68637400000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -14670,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec340000000000000000000000001d5968b303ad5e782c052740e4bea456b90ba3470000000000000000000000001d5968b303ad5e782c052740e4bea456b90ba3470000000000000000000000000000000000000000000000000016f9936bfddefa00000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -14672,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec340000000000000000000000005a843d8033f630f4c1d43776cebd69a045301e090000000000000000000000005a843d8033f630f4c1d43776cebd69a045301e09000000000000000000000000000000000000000000000000000b5e620f48000000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -14674,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0xa9f9e675000000000000000000000000a0b86991c6218b36c1d19d4a2e9eb0ce3606eb480000000000000000000000007f5c764cbc14f9669b88837ca1490cca17c316070000000000000000000000009036f17af475c9793dd3baef5f5610a10920b40c0000000000000000000000009036f17af475c9793dd3baef5f5610a10920b40c000000000000000000000000000000000000000000000000000000000608a06700000000000000000000000000000000000000000000000000000000000000c00000000000000000000000000000000000000000000000000000000000000000,0x005cbf91d16ea2b0f797d8e3d1ee7bc3790bc4e7b5fcf2b2df0fa1591300eaab,2022-02-26 10:21:41.000 UTC,0,true -14675,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec34000000000000000000000000274cab0c9a1795add5e07cb478d8c1c072cc0bc1000000000000000000000000274cab0c9a1795add5e07cb478d8c1c072cc0bc1000000000000000000000000000000000000000000000000008e1bc9bf04000000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -14676,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec3400000000000000000000000032996dcc495f32eec85dcbbd79c7467a3217e81600000000000000000000000032996dcc495f32eec85dcbbd79c7467a3217e8160000000000000000000000000000000000000000000000000014cda00a75385600000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -14677,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec340000000000000000000000007c7e5cbabfa66f985f0ef32322c45014e193bd090000000000000000000000007c7e5cbabfa66f985f0ef32322c45014e193bd09000000000000000000000000000000000000000000000000052d93204ae3e08a00000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -14678,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec34000000000000000000000000687c5fba506025a4d633c4f2fcabdd3ff0524238000000000000000000000000687c5fba506025a4d633c4f2fcabdd3ff05242380000000000000000000000000000000000000000000000000012fe61583dbf7f00000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -14680,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec34000000000000000000000000f0b830fb6b31a3aac77fe37b6e946bb6f5c83744000000000000000000000000f0b830fb6b31a3aac77fe37b6e946bb6f5c83744000000000000000000000000000000000000000000000000020808be2a7b719b00000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -14683,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec34000000000000000000000000ff5207e5a1d0d8ccc2787215f8ed51b7daa5f1aa000000000000000000000000ff5207e5a1d0d8ccc2787215f8ed51b7daa5f1aa0000000000000000000000000000000000000000000000000038eb635efb4ab500000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -14684,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec340000000000000000000000005ee3479373e6a31185a5cf9a40a00469814b21420000000000000000000000005ee3479373e6a31185a5cf9a40a00469814b21420000000000000000000000000000000000000000000000000086863322a6358000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -14685,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec340000000000000000000000004d6b678a6f8ee90cecf5679d435fd2165b4b1f9b0000000000000000000000004d6b678a6f8ee90cecf5679d435fd2165b4b1f9b0000000000000000000000000000000000000000000000000012fd206edfeb9200000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -14686,0xcd9d4988c0ae61887b075ba77f08cbfad2b65068,0x3f87ff1de58128ef8fcb4c807efd776e1ac72e51,0xf4f7b41a0000000000000000000000007afc7f83b1ea7b96c480c3a70d7313ad5c89bca7000000000000000000000000000000000000000000000000947e094f18ae0000,,,1,true -14687,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec340000000000000000000000005b420f03437908be1d67ddf9686363f1a08de0f40000000000000000000000005b420f03437908be1d67ddf9686363f1a08de0f40000000000000000000000000000000000000000000000000023b4edfe657a8100000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -14688,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec3400000000000000000000000029200feddcb5993f6f59d5e475985c267a9fd87e00000000000000000000000029200feddcb5993f6f59d5e475985c267a9fd87e000000000000000000000000000000000000000000000000000e8764d3e1e9aa00000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -14690,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec34000000000000000000000000d18e84b21b6acb69628ecb85f8074fd441478050000000000000000000000000d18e84b21b6acb69628ecb85f8074fd441478050000000000000000000000000000000000000000000000000000e0ea594b3938b00000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -14691,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec340000000000000000000000006dafabb007a3f441a9de9b8ec245ba3fa07187080000000000000000000000006dafabb007a3f441a9de9b8ec245ba3fa071870800000000000000000000000000000000000000000000000009a19552b21f000000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,0xcc6eefe4261f08a048b5cd48caf57980085d591b578bb0aac4f8cdcf2fd3023e,2022-02-06 14:58:55.000 UTC,0,true -14692,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec340000000000000000000000007e20120d84d629e3c15fee39aa4d7c21e7d60f1d0000000000000000000000007e20120d84d629e3c15fee39aa4d7c21e7d60f1d00000000000000000000000000000000000000000000000000a1d467dabab3ae00000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -14693,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec3400000000000000000000000057d6c4efb2ca6703674343d1a7c0492fba49a6f300000000000000000000000057d6c4efb2ca6703674343d1a7c0492fba49a6f300000000000000000000000000000000000000000000000000548401628df7c000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -14694,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec340000000000000000000000001aeea3a2da3a47ed7bcf84448d535285914b02b50000000000000000000000001aeea3a2da3a47ed7bcf84448d535285914b02b5000000000000000000000000000000000000000000000000000bd0fcb09fe67500000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -14696,0x10e6593cdda8c58a1d0f14c5164b376352a55f2f,0x467194771dae2967aef3ecbedd3bf9a310c76c65,0xa9f9e6750000000000000000000000006b175474e89094c44da98b954eedeac495271d0f000000000000000000000000da10009cbd5d07dd0cecc66161fc93d7c9000da1000000000000000000000000b9d7a43bb331fc2736f617373d60aaf8a5dbf4e0000000000000000000000000b9d7a43bb331fc2736f617373d60aaf8a5dbf4e0000000000000000000000000000000000000000000000003cee13d497943fe6000000000000000000000000000000000000000000000000000000000000000c00000000000000000000000000000000000000000000000000000000000000000,,,1,true -14698,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec3400000000000000000000000084a14f52dcda17356ae54b29891c9f6c0c88703300000000000000000000000084a14f52dcda17356ae54b29891c9f6c0c887033000000000000000000000000000000000000000000000000001597bf3959afa400000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -14699,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec34000000000000000000000000091104c2f8f25be4ec4eaad392159e51c4e1f1b1000000000000000000000000091104c2f8f25be4ec4eaad392159e51c4e1f1b100000000000000000000000000000000000000000000000004f631a8fb3f21a300000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -14700,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec3400000000000000000000000087c2b4a504b76cf71179ace53654c4e115623af900000000000000000000000087c2b4a504b76cf71179ace53654c4e115623af900000000000000000000000000000000000000000000000000102a56192e2cf600000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -14701,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec3400000000000000000000000039885aacc9dc0b053131605fc2f43b2f1275014300000000000000000000000039885aacc9dc0b053131605fc2f43b2f1275014300000000000000000000000000000000000000000000000000fce30a6d5a97d400000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -14702,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec3400000000000000000000000008d3b3152265ed42c1fdfd8bcb553f4de4d4fef600000000000000000000000008d3b3152265ed42c1fdfd8bcb553f4de4d4fef6000000000000000000000000000000000000000000000000000bc69f4f8c70af00000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -14704,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0xa9f9e675000000000000000000000000a0b86991c6218b36c1d19d4a2e9eb0ce3606eb480000000000000000000000007f5c764cbc14f9669b88837ca1490cca17c31607000000000000000000000000250e936d39bcdbc0b84c15b248a8356d341f06c7000000000000000000000000250e936d39bcdbc0b84c15b248a8356d341f06c700000000000000000000000000000000000000000000000000000000015c051900000000000000000000000000000000000000000000000000000000000000c00000000000000000000000000000000000000000000000000000000000000000,,,1,true -14705,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec34000000000000000000000000dafb902776a0203d7e4cfecd5eef4e10bc5e48a9000000000000000000000000dafb902776a0203d7e4cfecd5eef4e10bc5e48a9000000000000000000000000000000000000000000000000019424f7e652d89100000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -14706,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec340000000000000000000000007983c62d7ad755343fc57c4a3592f94381da79220000000000000000000000007983c62d7ad755343fc57c4a3592f94381da792200000000000000000000000000000000000000000000000000a7b4b88ea5e1b300000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -14708,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec340000000000000000000000000b2720df9175987bef9e33ded3de06c78487310c0000000000000000000000000b2720df9175987bef9e33ded3de06c78487310c0000000000000000000000000000000000000000000000000019c17c77ad8d5c00000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -14709,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0xa9f9e675000000000000000000000000a0b86991c6218b36c1d19d4a2e9eb0ce3606eb480000000000000000000000007f5c764cbc14f9669b88837ca1490cca17c31607000000000000000000000000a2f8e4744fd85e9089a337fed259f05dd864a91e000000000000000000000000a2f8e4744fd85e9089a337fed259f05dd864a91e00000000000000000000000000000000000000000000000000000000000f424000000000000000000000000000000000000000000000000000000000000000c00000000000000000000000000000000000000000000000000000000000000000,,,1,true -14713,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0xa9f9e675000000000000000000000000a0b86991c6218b36c1d19d4a2e9eb0ce3606eb480000000000000000000000007f5c764cbc14f9669b88837ca1490cca17c316070000000000000000000000001c46bda792db342cc8899a0335713dd6980138ea0000000000000000000000001c46bda792db342cc8899a0335713dd6980138ea00000000000000000000000000000000000000000000000000000000000f424000000000000000000000000000000000000000000000000000000000000000c00000000000000000000000000000000000000000000000000000000000000000,,,1,true -14715,0x10e6593cdda8c58a1d0f14c5164b376352a55f2f,0x467194771dae2967aef3ecbedd3bf9a310c76c65,0xa9f9e6750000000000000000000000006b175474e89094c44da98b954eedeac495271d0f000000000000000000000000da10009cbd5d07dd0cecc66161fc93d7c9000da100000000000000000000000016f9a7d7877776b58625937333f9c9666470200900000000000000000000000016f9a7d7877776b58625937333f9c96664702009000000000000000000000000000000000000000000000000de6e8966c5e07d1000000000000000000000000000000000000000000000000000000000000000c00000000000000000000000000000000000000000000000000000000000000000,,,1,true -14716,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0xa9f9e675000000000000000000000000a0b86991c6218b36c1d19d4a2e9eb0ce3606eb480000000000000000000000007f5c764cbc14f9669b88837ca1490cca17c31607000000000000000000000000f57871a2f715f1a0d48965b6556cd14ef1577f33000000000000000000000000f57871a2f715f1a0d48965b6556cd14ef1577f3300000000000000000000000000000000000000000000000000000000000f424000000000000000000000000000000000000000000000000000000000000000c00000000000000000000000000000000000000000000000000000000000000000,,,1,true -14719,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec34000000000000000000000000170246b41adf6c859093b17b19548c25c7109f93000000000000000000000000170246b41adf6c859093b17b19548c25c7109f9300000000000000000000000000000000000000000000000010a64c426f4a3cc000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,0x39b4d4f5eb0ffab046b1482cb5dde3c200485fe8ea6b7916cb8886c5dff8e3cd,2021-11-30 09:47:57.000 UTC,0,true -14720,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec34000000000000000000000000dccb3b984c89f97afd551bede081f72e5c50c223000000000000000000000000dccb3b984c89f97afd551bede081f72e5c50c223000000000000000000000000000000000000000000000000076470f11aeba9a000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,0x15f16c287097ae4a5c2ed2199d30d7307ce743f655754d11f0c637fa6f197d70,2021-12-10 22:13:50.000 UTC,0,true -14721,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec3400000000000000000000000022edfb7d07ccc3a28cd315c5ad9b9808a867e56300000000000000000000000022edfb7d07ccc3a28cd315c5ad9b9808a867e56300000000000000000000000000000000000000000000000003a492a4feddf97d00000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,0x79f5d9d87d6fa5e4a1b05bf442dd15fe8ed3a846d080a79c08eaf699590b930c,2021-12-19 05:40:38.000 UTC,0,true -14730,0xcd9d4988c0ae61887b075ba77f08cbfad2b65068,0x3f87ff1de58128ef8fcb4c807efd776e1ac72e51,0xf4f7b41a000000000000000000000000e25ff9081a1d09897f255b5c557605c2d0bda77d0000000000000000000000000000000000000000000000007492cb7eb1480000,,,1,true -14732,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec34000000000000000000000000c5f10840a067045587761f5563bdaf758fa298b9000000000000000000000000c5f10840a067045587761f5563bdaf758fa298b900000000000000000000000000000000000000000000000000ee8e4d8fbfe23600000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -14736,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec34000000000000000000000000f9fc7c85de39f5b36f99a9ef5385d3267584ac06000000000000000000000000f9fc7c85de39f5b36f99a9ef5385d3267584ac0600000000000000000000000000000000000000000000000003fae9a875792bec00000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,0x67c38d53adff1620bc1ff373a5ca241fa41e8920de6a143a17e03a944d5d766c,2021-12-11 23:33:38.000 UTC,0,true -14738,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec340000000000000000000000006a95c6b020840f706d036af32143175b7a3d11ee0000000000000000000000006a95c6b020840f706d036af32143175b7a3d11ee000000000000000000000000000000000000000000000000000de307e461f55400000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -14741,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec34000000000000000000000000c0f90e81e6c89d7581c55dade471fff8fd3cff60000000000000000000000000c0f90e81e6c89d7581c55dade471fff8fd3cff600000000000000000000000000000000000000000000000000a616e0973fe000000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -14744,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec3400000000000000000000000065890d61f79db0e2b9107107d0a02daa35e123ee00000000000000000000000065890d61f79db0e2b9107107d0a02daa35e123ee000000000000000000000000000000000000000000000000008dd060e5804c6600000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -14745,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec340000000000000000000000007f7db26ef8eab61a68df3c285ccc04b9e60102510000000000000000000000007f7db26ef8eab61a68df3c285ccc04b9e6010251000000000000000000000000000000000000000000000000008e1bc9bf04000000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -14746,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec34000000000000000000000000c1fe1f074b32013a3eefd57d5fb1b853e38522e6000000000000000000000000c1fe1f074b32013a3eefd57d5fb1b853e38522e600000000000000000000000000000000000000000000000004b530b28cee817a00000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,0x94c4c137096132aac23ae9d5fbd392d7dc78edbf4b90ceef3f2f4d7735d0081a,2021-11-25 03:41:42.000 UTC,0,true -14747,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec34000000000000000000000000d819c62dde216ef3b508d348542b59477efd606f000000000000000000000000d819c62dde216ef3b508d348542b59477efd606f0000000000000000000000000000000000000000000000000011c37937e0800000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -14751,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0xa9f9e675000000000000000000000000a0b86991c6218b36c1d19d4a2e9eb0ce3606eb480000000000000000000000007f5c764cbc14f9669b88837ca1490cca17c31607000000000000000000000000478a4ad6fb7e44c2f0a5af299399a9c797fc98f2000000000000000000000000478a4ad6fb7e44c2f0a5af299399a9c797fc98f200000000000000000000000000000000000000000000000000000000000f424000000000000000000000000000000000000000000000000000000000000000c00000000000000000000000000000000000000000000000000000000000000000,,,1,true -14752,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0xa9f9e675000000000000000000000000a0b86991c6218b36c1d19d4a2e9eb0ce3606eb480000000000000000000000007f5c764cbc14f9669b88837ca1490cca17c31607000000000000000000000000b6365c4670076b90f7958f7d20455c3a8999fed9000000000000000000000000b6365c4670076b90f7958f7d20455c3a8999fed900000000000000000000000000000000000000000000000000000000000f424000000000000000000000000000000000000000000000000000000000000000c00000000000000000000000000000000000000000000000000000000000000000,,,1,true -14753,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec34000000000000000000000000a4ddc5af57f7fa6710346ebe18e5a3ca9e086a5d000000000000000000000000a4ddc5af57f7fa6710346ebe18e5a3ca9e086a5d000000000000000000000000000000000000000000000000020688cb3a02ceb600000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -14754,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0xa9f9e675000000000000000000000000a0b86991c6218b36c1d19d4a2e9eb0ce3606eb480000000000000000000000007f5c764cbc14f9669b88837ca1490cca17c31607000000000000000000000000ec64e346fddc63ab96486288294be8b6a346a40d000000000000000000000000ec64e346fddc63ab96486288294be8b6a346a40d00000000000000000000000000000000000000000000000000000000000f424000000000000000000000000000000000000000000000000000000000000000c00000000000000000000000000000000000000000000000000000000000000000,,,1,true -14760,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0xa9f9e675000000000000000000000000a0b86991c6218b36c1d19d4a2e9eb0ce3606eb480000000000000000000000007f5c764cbc14f9669b88837ca1490cca17c3160700000000000000000000000046f1a0b0af9eb44089fec8ee8bbe74f6e58661d300000000000000000000000046f1a0b0af9eb44089fec8ee8bbe74f6e58661d300000000000000000000000000000000000000000000000000000000000f424000000000000000000000000000000000000000000000000000000000000000c00000000000000000000000000000000000000000000000000000000000000000,,,1,true -14762,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0xa9f9e675000000000000000000000000a0b86991c6218b36c1d19d4a2e9eb0ce3606eb480000000000000000000000007f5c764cbc14f9669b88837ca1490cca17c316070000000000000000000000001646b30f2f5d1d94c58e78f748af25cd5831112f0000000000000000000000001646b30f2f5d1d94c58e78f748af25cd5831112f00000000000000000000000000000000000000000000000000000000000f424000000000000000000000000000000000000000000000000000000000000000c00000000000000000000000000000000000000000000000000000000000000000,,,1,true -14768,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0xa9f9e675000000000000000000000000a0b86991c6218b36c1d19d4a2e9eb0ce3606eb480000000000000000000000007f5c764cbc14f9669b88837ca1490cca17c31607000000000000000000000000f33ee8617e5db3e5f7ccf08f9f0159d40b5e7252000000000000000000000000f33ee8617e5db3e5f7ccf08f9f0159d40b5e725200000000000000000000000000000000000000000000000000000000000f424000000000000000000000000000000000000000000000000000000000000000c00000000000000000000000000000000000000000000000000000000000000000,,,1,true -14770,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0xa9f9e675000000000000000000000000a0b86991c6218b36c1d19d4a2e9eb0ce3606eb480000000000000000000000007f5c764cbc14f9669b88837ca1490cca17c3160700000000000000000000000029396eb0a246fa5321d30dbf01261fddaa16067e00000000000000000000000029396eb0a246fa5321d30dbf01261fddaa16067e00000000000000000000000000000000000000000000000000000000000f424000000000000000000000000000000000000000000000000000000000000000c00000000000000000000000000000000000000000000000000000000000000000,,,1,true -14771,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec34000000000000000000000000ddd6ae239a5eaf73608eedd8f47e0eb1fc1474ff000000000000000000000000ddd6ae239a5eaf73608eedd8f47e0eb1fc1474ff00000000000000000000000000000000000000000000000000099931b788348000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -14774,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0xa9f9e675000000000000000000000000a0b86991c6218b36c1d19d4a2e9eb0ce3606eb480000000000000000000000007f5c764cbc14f9669b88837ca1490cca17c31607000000000000000000000000b86777a778b30889765fa9e5230a24f6ffafa94f000000000000000000000000b86777a778b30889765fa9e5230a24f6ffafa94f0000000000000000000000000000000000000000000000000000000001198c7600000000000000000000000000000000000000000000000000000000000000c00000000000000000000000000000000000000000000000000000000000000000,,,1,true -14775,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0xa9f9e675000000000000000000000000a0b86991c6218b36c1d19d4a2e9eb0ce3606eb480000000000000000000000007f5c764cbc14f9669b88837ca1490cca17c31607000000000000000000000000a829116c1430c7431e037c0a71547ec247246a02000000000000000000000000a829116c1430c7431e037c0a71547ec247246a0200000000000000000000000000000000000000000000000000000000000f424000000000000000000000000000000000000000000000000000000000000000c00000000000000000000000000000000000000000000000000000000000000000,,,1,true -14776,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec340000000000000000000000007e44f3d32c23f44e83bc194ec6811d8ddad507b50000000000000000000000007e44f3d32c23f44e83bc194ec6811d8ddad507b500000000000000000000000000000000000000000000000000a9c8df4d443aac00000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,0xae9b9ede21e54cddc000adc7e59610c1556cc4efb41474f987de576c258901f1,2022-04-28 08:41:38.000 UTC,0,true -14777,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec340000000000000000000000001c99aa08febc29634b97100c576e2f0172f32fd60000000000000000000000001c99aa08febc29634b97100c576e2f0172f32fd6000000000000000000000000000000000000000000000000000e35fa931a000000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -14778,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec340000000000000000000000008185191ca6bfb4b76214abb3572be413e51d24bc0000000000000000000000008185191ca6bfb4b76214abb3572be413e51d24bc000000000000000000000000000000000000000000000000058d15e17628000000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -14780,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0xa9f9e675000000000000000000000000a0b86991c6218b36c1d19d4a2e9eb0ce3606eb480000000000000000000000007f5c764cbc14f9669b88837ca1490cca17c31607000000000000000000000000b1fd98f016718c905a9a5ce55cb9e4f8e163b9fc000000000000000000000000b1fd98f016718c905a9a5ce55cb9e4f8e163b9fc00000000000000000000000000000000000000000000000000000000000f424000000000000000000000000000000000000000000000000000000000000000c00000000000000000000000000000000000000000000000000000000000000000,,,1,true -14784,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec340000000000000000000000008185191ca6bfb4b76214abb3572be413e51d24bc0000000000000000000000008185191ca6bfb4b76214abb3572be413e51d24bc000000000000000000000000000000000000000000000000015b73de76859ec000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -14785,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0xa9f9e675000000000000000000000000a0b86991c6218b36c1d19d4a2e9eb0ce3606eb480000000000000000000000007f5c764cbc14f9669b88837ca1490cca17c31607000000000000000000000000f7f4352fa9b3fb1a57adcd9f62a11a5f5d40cea6000000000000000000000000f7f4352fa9b3fb1a57adcd9f62a11a5f5d40cea600000000000000000000000000000000000000000000000000000000000f424000000000000000000000000000000000000000000000000000000000000000c00000000000000000000000000000000000000000000000000000000000000000,,,1,true -14786,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0xa9f9e675000000000000000000000000a0b86991c6218b36c1d19d4a2e9eb0ce3606eb480000000000000000000000007f5c764cbc14f9669b88837ca1490cca17c31607000000000000000000000000d7b4b35bc317f731c86757c29a0c86754f15b0cd000000000000000000000000d7b4b35bc317f731c86757c29a0c86754f15b0cd00000000000000000000000000000000000000000000000000000000000f424000000000000000000000000000000000000000000000000000000000000000c00000000000000000000000000000000000000000000000000000000000000000,,,1,true -14787,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0xa9f9e675000000000000000000000000a0b86991c6218b36c1d19d4a2e9eb0ce3606eb480000000000000000000000007f5c764cbc14f9669b88837ca1490cca17c31607000000000000000000000000f67bc705466a5480190525436d36bc4e821dd7e2000000000000000000000000f67bc705466a5480190525436d36bc4e821dd7e200000000000000000000000000000000000000000000000000000000000f424000000000000000000000000000000000000000000000000000000000000000c00000000000000000000000000000000000000000000000000000000000000000,,,1,true -14788,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0xa9f9e675000000000000000000000000a0b86991c6218b36c1d19d4a2e9eb0ce3606eb480000000000000000000000007f5c764cbc14f9669b88837ca1490cca17c31607000000000000000000000000d1d6733de35ed9025fddea264d35b860edce3e25000000000000000000000000d1d6733de35ed9025fddea264d35b860edce3e2500000000000000000000000000000000000000000000000000000000000f424000000000000000000000000000000000000000000000000000000000000000c00000000000000000000000000000000000000000000000000000000000000000,,,1,true -14789,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec34000000000000000000000000275e096df57fa32aea8be81188ed0dbbe4c3efcf000000000000000000000000275e096df57fa32aea8be81188ed0dbbe4c3efcf00000000000000000000000000000000000000000000000000f98ba97396c6a400000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -14791,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec34000000000000000000000000635c5a713bbd9132617544db8dcdcae549e6f738000000000000000000000000635c5a713bbd9132617544db8dcdcae549e6f73800000000000000000000000000000000000000000000000002dac46a5f7dc84c00000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -14792,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec340000000000000000000000008d48f76b510197152810bd58b91bb5983020e9510000000000000000000000008d48f76b510197152810bd58b91bb5983020e9510000000000000000000000000000000000000000000000000086942faaf4828600000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,0x6c18ef0eb0db380611f07cce8e9573bcee9b636a608169a9528a39bbd6d98ee1,2022-05-24 04:24:07.000 UTC,0,true -14793,0xcd9d4988c0ae61887b075ba77f08cbfad2b65068,0x3f87ff1de58128ef8fcb4c807efd776e1ac72e51,0xf4f7b41a000000000000000000000000bfd687d8adf6b3ebe53e922b93d2915163ded26800000000000000000000000000000000000000000000000020020b6eaf8d493b,,,1,true -14794,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0xa9f9e675000000000000000000000000a0b86991c6218b36c1d19d4a2e9eb0ce3606eb480000000000000000000000007f5c764cbc14f9669b88837ca1490cca17c316070000000000000000000000005d25f77d1704a2c18e406404483aa594c83c23050000000000000000000000005d25f77d1704a2c18e406404483aa594c83c2305000000000000000000000000000000000000000000000000000000000645fa6a00000000000000000000000000000000000000000000000000000000000000c00000000000000000000000000000000000000000000000000000000000000000,,,1,true -14796,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec34000000000000000000000000a09f46e3b7165bf38af1ac13d89be34bdf662e7f000000000000000000000000a09f46e3b7165bf38af1ac13d89be34bdf662e7f000000000000000000000000000000000000000000000000001f79f61064fd8000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -14797,0xcd9d4988c0ae61887b075ba77f08cbfad2b65068,0x3f87ff1de58128ef8fcb4c807efd776e1ac72e51,0xf4f7b41a0000000000000000000000000e910a91f98ca9b5848b16d5c294645a2c4ba64300000000000000000000000000000000000000000000000698e90d908d162aab,,,1,true -14798,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec34000000000000000000000000bf53e53ac22160e47675fe7dfc7a9afb3547b0d2000000000000000000000000bf53e53ac22160e47675fe7dfc7a9afb3547b0d200000000000000000000000000000000000000000000000000036ecd0982094000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -14804,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec340000000000000000000000002cbc7ebafca5f1e33e15e5cccbc24ecfc0c55a3e0000000000000000000000002cbc7ebafca5f1e33e15e5cccbc24ecfc0c55a3e0000000000000000000000000000000000000000000000000001c6bf5263400000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -14805,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec3400000000000000000000000053d7043fb8a7d162eba5d9bb374868595d8d203b00000000000000000000000053d7043fb8a7d162eba5d9bb374868595d8d203b000000000000000000000000000000000000000000000000016345785d8a000000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -14806,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec34000000000000000000000000e7dc00521e64c3146ed4b9a94a0bdadc55d79b01000000000000000000000000e7dc00521e64c3146ed4b9a94a0bdadc55d79b01000000000000000000000000000000000000000000000000020a2aa21cbdf9a600000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,0xa96bf7fc59635e05a18318f417bf3d69c81b38bf6e85383f60ec211dff1a6a7e,2021-11-23 08:16:28.000 UTC,0,true -14807,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec34000000000000000000000000616ec7d0b66cad90f901e36bac4d91490ac3a99d000000000000000000000000616ec7d0b66cad90f901e36bac4d91490ac3a99d0000000000000000000000000000000000000000000000000429d069189e000000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -14808,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec340000000000000000000000009f16b1691277d60f084a2346c6c6e48393b471450000000000000000000000009f16b1691277d60f084a2346c6c6e48393b471450000000000000000000000000000000000000000000000000001c6bf5263400000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -14810,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec340000000000000000000000005553729d902df38cff09d3077250af73dc8244440000000000000000000000005553729d902df38cff09d3077250af73dc8244440000000000000000000000000000000000000000000000000001c6bf5263400000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -14811,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec340000000000000000000000005553729d902df38cff09d3077250af73dc8244440000000000000000000000005553729d902df38cff09d3077250af73dc8244440000000000000000000000000000000000000000000000000001c6bf5263400000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -14812,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec34000000000000000000000000a7c79534b52acb69b5231868dae7b81006689cf9000000000000000000000000a7c79534b52acb69b5231868dae7b81006689cf90000000000000000000000000000000000000000000000000001c6bf5263400000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -14813,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec3400000000000000000000000029d333e2bf6b75d669675ebb9ce0b5a78a6eace500000000000000000000000029d333e2bf6b75d669675ebb9ce0b5a78a6eace50000000000000000000000000000000000000000000000000001c6bf5263400000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -14814,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec340000000000000000000000004c8ef161fe4df88be6baf32ac8981d739529cdd70000000000000000000000004c8ef161fe4df88be6baf32ac8981d739529cdd70000000000000000000000000000000000000000000000000001c6bf5263400000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -14815,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec3400000000000000000000000065197fdf8de5ae05c3e622d116a682b01cf748d200000000000000000000000065197fdf8de5ae05c3e622d116a682b01cf748d2000000000000000000000000000000000000000000000000015cfa7c7d19314000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -14816,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec34000000000000000000000000dff855094f0bb1cf1a9f5284b7b095e402b946d5000000000000000000000000dff855094f0bb1cf1a9f5284b7b095e402b946d50000000000000000000000000000000000000000000000000001c6bf5263400000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -14817,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec34000000000000000000000000481f1e27ea5a1c542219677df58638d1135c0238000000000000000000000000481f1e27ea5a1c542219677df58638d1135c02380000000000000000000000000000000000000000000000000001c6bf5263400000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -14818,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec34000000000000000000000000959c21342d6a7c9f7b8197a7baa004c18eaa12c8000000000000000000000000959c21342d6a7c9f7b8197a7baa004c18eaa12c80000000000000000000000000000000000000000000000000001c6bf5263400000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -14819,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec34000000000000000000000000ca7ad9584ea2316922acc3c108fbb6cbdd8cc9c4000000000000000000000000ca7ad9584ea2316922acc3c108fbb6cbdd8cc9c40000000000000000000000000000000000000000000000000001c6bf5263400000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -14820,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec340000000000000000000000008b786c184fa67e87309f7ead62e193eff8ffa9970000000000000000000000008b786c184fa67e87309f7ead62e193eff8ffa997000000000000000000000000000000000000000000000000007bed343d4b085c00000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -14821,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec3400000000000000000000000059bae35cee6a074e4945376e65111c7f06cf3f5a00000000000000000000000059bae35cee6a074e4945376e65111c7f06cf3f5a0000000000000000000000000000000000000000000000000001c6bf5263400000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -14822,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec34000000000000000000000000c009516ff3a46d0bcb08ae979e55cf0b09e4a43c000000000000000000000000c009516ff3a46d0bcb08ae979e55cf0b09e4a43c0000000000000000000000000000000000000000000000000001c6bf5263400000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -14823,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec34000000000000000000000000d85b4c4c4f5781a957a1caef0f80934227f73ceb000000000000000000000000d85b4c4c4f5781a957a1caef0f80934227f73ceb0000000000000000000000000000000000000000000000000001c6bf5263400000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -14824,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec340000000000000000000000004a5fd3e33d3618432e7a062edd7c850657b2baf60000000000000000000000004a5fd3e33d3618432e7a062edd7c850657b2baf60000000000000000000000000000000000000000000000000001c6bf5263400000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -14825,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec34000000000000000000000000e530b61b19a2066d43542a45c4bc3bd428f9fbf7000000000000000000000000e530b61b19a2066d43542a45c4bc3bd428f9fbf7000000000000000000000000000000000000000000000000006488b27145784000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -14827,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec340000000000000000000000005757ef8da15fb2e01f4a743f12e0ec7d048e3ca50000000000000000000000005757ef8da15fb2e01f4a743f12e0ec7d048e3ca50000000000000000000000000000000000000000000000000001c6bf5263400000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -14828,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec340000000000000000000000005757ef8da15fb2e01f4a743f12e0ec7d048e3ca50000000000000000000000005757ef8da15fb2e01f4a743f12e0ec7d048e3ca50000000000000000000000000000000000000000000000000001c6bf5263400000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -14829,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec340000000000000000000000005757ef8da15fb2e01f4a743f12e0ec7d048e3ca50000000000000000000000005757ef8da15fb2e01f4a743f12e0ec7d048e3ca50000000000000000000000000000000000000000000000000001c6bf5263400000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -14830,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec340000000000000000000000005757ef8da15fb2e01f4a743f12e0ec7d048e3ca50000000000000000000000005757ef8da15fb2e01f4a743f12e0ec7d048e3ca50000000000000000000000000000000000000000000000000001c6bf5263400000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -14832,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec340000000000000000000000002a746a530bdc89096d012bbaefa4bf6dbb185b030000000000000000000000002a746a530bdc89096d012bbaefa4bf6dbb185b030000000000000000000000000000000000000000000000000001c6bf5263400000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -14833,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec340000000000000000000000002a746a530bdc89096d012bbaefa4bf6dbb185b030000000000000000000000002a746a530bdc89096d012bbaefa4bf6dbb185b030000000000000000000000000000000000000000000000000001c6bf5263400000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -14834,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec340000000000000000000000002a746a530bdc89096d012bbaefa4bf6dbb185b030000000000000000000000002a746a530bdc89096d012bbaefa4bf6dbb185b030000000000000000000000000000000000000000000000000001c6bf5263400000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -14835,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec340000000000000000000000002a746a530bdc89096d012bbaefa4bf6dbb185b030000000000000000000000002a746a530bdc89096d012bbaefa4bf6dbb185b030000000000000000000000000000000000000000000000000001c6bf5263400000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -14836,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec340000000000000000000000008d1df56799398477b16790eea966927808b8dead0000000000000000000000008d1df56799398477b16790eea966927808b8dead0000000000000000000000000000000000000000000000000001c6bf5263400000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -14837,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec340000000000000000000000008d1df56799398477b16790eea966927808b8dead0000000000000000000000008d1df56799398477b16790eea966927808b8dead0000000000000000000000000000000000000000000000000001c6bf5263400000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -14838,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec340000000000000000000000008d1df56799398477b16790eea966927808b8dead0000000000000000000000008d1df56799398477b16790eea966927808b8dead0000000000000000000000000000000000000000000000000001c6bf5263400000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -14839,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec340000000000000000000000008d1df56799398477b16790eea966927808b8dead0000000000000000000000008d1df56799398477b16790eea966927808b8dead0000000000000000000000000000000000000000000000000001c6bf5263400000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -14840,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec340000000000000000000000000d2ea91ea2ec05d54f01494da98c9739e41c71730000000000000000000000000d2ea91ea2ec05d54f01494da98c9739e41c71730000000000000000000000000000000000000000000000000075d579054f780000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,0x834cd48c00ac06a4423200ebabe38271d3c844a0832ef3e5a514c4288c58a568,2022-04-24 03:49:58.000 UTC,0,true -14841,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec34000000000000000000000000d127fbe1408696af0a9ab6c93b7449e33641fd0a000000000000000000000000d127fbe1408696af0a9ab6c93b7449e33641fd0a0000000000000000000000000000000000000000000000000001c6bf5263400000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -14842,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec34000000000000000000000000d127fbe1408696af0a9ab6c93b7449e33641fd0a000000000000000000000000d127fbe1408696af0a9ab6c93b7449e33641fd0a0000000000000000000000000000000000000000000000000001c6bf5263400000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -14843,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec34000000000000000000000000d127fbe1408696af0a9ab6c93b7449e33641fd0a000000000000000000000000d127fbe1408696af0a9ab6c93b7449e33641fd0a0000000000000000000000000000000000000000000000000001c6bf5263400000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -14844,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec34000000000000000000000000d127fbe1408696af0a9ab6c93b7449e33641fd0a000000000000000000000000d127fbe1408696af0a9ab6c93b7449e33641fd0a0000000000000000000000000000000000000000000000000001c6bf5263400000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -14845,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec340000000000000000000000004d00afd8f1cc62e50ac768f5f2a639070ab2ae7b0000000000000000000000004d00afd8f1cc62e50ac768f5f2a639070ab2ae7b0000000000000000000000000000000000000000000000000001c6bf5263400000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -14846,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec340000000000000000000000004d00afd8f1cc62e50ac768f5f2a639070ab2ae7b0000000000000000000000004d00afd8f1cc62e50ac768f5f2a639070ab2ae7b0000000000000000000000000000000000000000000000000001c6bf5263400000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -14847,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec340000000000000000000000004d00afd8f1cc62e50ac768f5f2a639070ab2ae7b0000000000000000000000004d00afd8f1cc62e50ac768f5f2a639070ab2ae7b0000000000000000000000000000000000000000000000000001c6bf5263400000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -14848,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec340000000000000000000000004d00afd8f1cc62e50ac768f5f2a639070ab2ae7b0000000000000000000000004d00afd8f1cc62e50ac768f5f2a639070ab2ae7b0000000000000000000000000000000000000000000000000001c6bf5263400000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -14849,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec3400000000000000000000000080b0bcdafbbd39bf74173c48a384e675a37ec74b00000000000000000000000080b0bcdafbbd39bf74173c48a384e675a37ec74b0000000000000000000000000000000000000000000000000001c6bf5263400000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -14850,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec3400000000000000000000000080b0bcdafbbd39bf74173c48a384e675a37ec74b00000000000000000000000080b0bcdafbbd39bf74173c48a384e675a37ec74b0000000000000000000000000000000000000000000000000001c6bf5263400000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -14851,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec3400000000000000000000000080b0bcdafbbd39bf74173c48a384e675a37ec74b00000000000000000000000080b0bcdafbbd39bf74173c48a384e675a37ec74b0000000000000000000000000000000000000000000000000001c6bf5263400000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -14852,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec3400000000000000000000000080b0bcdafbbd39bf74173c48a384e675a37ec74b00000000000000000000000080b0bcdafbbd39bf74173c48a384e675a37ec74b0000000000000000000000000000000000000000000000000001c6bf5263400000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -14853,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec34000000000000000000000000be3f3d91f54f93aacaa6bb7fb67eaa90b790de72000000000000000000000000be3f3d91f54f93aacaa6bb7fb67eaa90b790de720000000000000000000000000000000000000000000000000dd521f3c75540b500000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,0x36c2c721697b5d10df1a55ae533972abb00bc599d42a0fb7ef58f73fbfbc4a11,2021-11-25 07:59:06.000 UTC,0,true -14854,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec3400000000000000000000000059bae35cee6a074e4945376e65111c7f06cf3f5a00000000000000000000000059bae35cee6a074e4945376e65111c7f06cf3f5a0000000000000000000000000000000000000000000000000001c6bf5263400000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -14855,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec3400000000000000000000000059bae35cee6a074e4945376e65111c7f06cf3f5a00000000000000000000000059bae35cee6a074e4945376e65111c7f06cf3f5a0000000000000000000000000000000000000000000000000001c6bf5263400000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -14856,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec3400000000000000000000000059bae35cee6a074e4945376e65111c7f06cf3f5a00000000000000000000000059bae35cee6a074e4945376e65111c7f06cf3f5a0000000000000000000000000000000000000000000000000001c6bf5263400000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -14859,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec340000000000000000000000001c46bda792db342cc8899a0335713dd6980138ea0000000000000000000000001c46bda792db342cc8899a0335713dd6980138ea0000000000000000000000000000000000000000000000000001c6bf5263400000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -14860,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec340000000000000000000000001c46bda792db342cc8899a0335713dd6980138ea0000000000000000000000001c46bda792db342cc8899a0335713dd6980138ea0000000000000000000000000000000000000000000000000001c6bf5263400000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -14861,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec34000000000000000000000000c009516ff3a46d0bcb08ae979e55cf0b09e4a43c000000000000000000000000c009516ff3a46d0bcb08ae979e55cf0b09e4a43c0000000000000000000000000000000000000000000000000001c6bf5263400000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -14862,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec34000000000000000000000000c009516ff3a46d0bcb08ae979e55cf0b09e4a43c000000000000000000000000c009516ff3a46d0bcb08ae979e55cf0b09e4a43c0000000000000000000000000000000000000000000000000001c6bf5263400000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -14863,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec340000000000000000000000001c46bda792db342cc8899a0335713dd6980138ea0000000000000000000000001c46bda792db342cc8899a0335713dd6980138ea0000000000000000000000000000000000000000000000000001c6bf5263400000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -14864,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec34000000000000000000000000b6365c4670076b90f7958f7d20455c3a8999fed9000000000000000000000000b6365c4670076b90f7958f7d20455c3a8999fed90000000000000000000000000000000000000000000000000001c6bf5263400000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -14865,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec34000000000000000000000000c009516ff3a46d0bcb08ae979e55cf0b09e4a43c000000000000000000000000c009516ff3a46d0bcb08ae979e55cf0b09e4a43c0000000000000000000000000000000000000000000000000001c6bf5263400000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -14866,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec34000000000000000000000000b6365c4670076b90f7958f7d20455c3a8999fed9000000000000000000000000b6365c4670076b90f7958f7d20455c3a8999fed90000000000000000000000000000000000000000000000000001c6bf5263400000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -14867,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec34000000000000000000000000b6365c4670076b90f7958f7d20455c3a8999fed9000000000000000000000000b6365c4670076b90f7958f7d20455c3a8999fed90000000000000000000000000000000000000000000000000001c6bf5263400000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -14868,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec34000000000000000000000000d85b4c4c4f5781a957a1caef0f80934227f73ceb000000000000000000000000d85b4c4c4f5781a957a1caef0f80934227f73ceb0000000000000000000000000000000000000000000000000001c6bf5263400000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -14869,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec34000000000000000000000000a829116c1430c7431e037c0a71547ec247246a02000000000000000000000000a829116c1430c7431e037c0a71547ec247246a020000000000000000000000000000000000000000000000000001c6bf5263400000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -14870,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec34000000000000000000000000d85b4c4c4f5781a957a1caef0f80934227f73ceb000000000000000000000000d85b4c4c4f5781a957a1caef0f80934227f73ceb0000000000000000000000000000000000000000000000000001c6bf5263400000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -14871,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec34000000000000000000000000a829116c1430c7431e037c0a71547ec247246a02000000000000000000000000a829116c1430c7431e037c0a71547ec247246a020000000000000000000000000000000000000000000000000001c6bf5263400000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -14872,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec34000000000000000000000000d85b4c4c4f5781a957a1caef0f80934227f73ceb000000000000000000000000d85b4c4c4f5781a957a1caef0f80934227f73ceb0000000000000000000000000000000000000000000000000001c6bf5263400000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -14873,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec34000000000000000000000000a829116c1430c7431e037c0a71547ec247246a02000000000000000000000000a829116c1430c7431e037c0a71547ec247246a020000000000000000000000000000000000000000000000000001c6bf5263400000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -14874,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec340000000000000000000000004a5fd3e33d3618432e7a062edd7c850657b2baf60000000000000000000000004a5fd3e33d3618432e7a062edd7c850657b2baf60000000000000000000000000000000000000000000000000001c6bf5263400000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -14875,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec34000000000000000000000000d7b4b35bc317f731c86757c29a0c86754f15b0cd000000000000000000000000d7b4b35bc317f731c86757c29a0c86754f15b0cd0000000000000000000000000000000000000000000000000001c6bf5263400000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -14876,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec34000000000000000000000000d7b4b35bc317f731c86757c29a0c86754f15b0cd000000000000000000000000d7b4b35bc317f731c86757c29a0c86754f15b0cd0000000000000000000000000000000000000000000000000001c6bf5263400000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -14877,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec34000000000000000000000000d7b4b35bc317f731c86757c29a0c86754f15b0cd000000000000000000000000d7b4b35bc317f731c86757c29a0c86754f15b0cd0000000000000000000000000000000000000000000000000001c6bf5263400000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -14878,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec34000000000000000000000000f67bc705466a5480190525436d36bc4e821dd7e2000000000000000000000000f67bc705466a5480190525436d36bc4e821dd7e20000000000000000000000000000000000000000000000000001c6bf5263400000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -14879,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec34000000000000000000000000f67bc705466a5480190525436d36bc4e821dd7e2000000000000000000000000f67bc705466a5480190525436d36bc4e821dd7e20000000000000000000000000000000000000000000000000001c6bf5263400000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -14880,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec340000000000000000000000004a5fd3e33d3618432e7a062edd7c850657b2baf60000000000000000000000004a5fd3e33d3618432e7a062edd7c850657b2baf60000000000000000000000000000000000000000000000000001c6bf5263400000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -14881,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec340000000000000000000000004a5fd3e33d3618432e7a062edd7c850657b2baf60000000000000000000000004a5fd3e33d3618432e7a062edd7c850657b2baf60000000000000000000000000000000000000000000000000001c6bf5263400000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -14882,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec34000000000000000000000000f67bc705466a5480190525436d36bc4e821dd7e2000000000000000000000000f67bc705466a5480190525436d36bc4e821dd7e20000000000000000000000000000000000000000000000000001c6bf5263400000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -14883,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec34000000000000000000000000b1fd98f016718c905a9a5ce55cb9e4f8e163b9fc000000000000000000000000b1fd98f016718c905a9a5ce55cb9e4f8e163b9fc0000000000000000000000000000000000000000000000000001c6bf5263400000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -14884,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec34000000000000000000000000b1fd98f016718c905a9a5ce55cb9e4f8e163b9fc000000000000000000000000b1fd98f016718c905a9a5ce55cb9e4f8e163b9fc0000000000000000000000000000000000000000000000000001c6bf5263400000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -14885,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec34000000000000000000000000b1fd98f016718c905a9a5ce55cb9e4f8e163b9fc000000000000000000000000b1fd98f016718c905a9a5ce55cb9e4f8e163b9fc0000000000000000000000000000000000000000000000000001c6bf5263400000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -14886,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec34000000000000000000000000f7f4352fa9b3fb1a57adcd9f62a11a5f5d40cea6000000000000000000000000f7f4352fa9b3fb1a57adcd9f62a11a5f5d40cea60000000000000000000000000000000000000000000000000001c6bf5263400000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -14887,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec34000000000000000000000000f7f4352fa9b3fb1a57adcd9f62a11a5f5d40cea6000000000000000000000000f7f4352fa9b3fb1a57adcd9f62a11a5f5d40cea60000000000000000000000000000000000000000000000000001c6bf5263400000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -14888,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec34000000000000000000000000f7f4352fa9b3fb1a57adcd9f62a11a5f5d40cea6000000000000000000000000f7f4352fa9b3fb1a57adcd9f62a11a5f5d40cea60000000000000000000000000000000000000000000000000001c6bf5263400000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -14889,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec34000000000000000000000000d1d6733de35ed9025fddea264d35b860edce3e25000000000000000000000000d1d6733de35ed9025fddea264d35b860edce3e250000000000000000000000000000000000000000000000000001c6bf5263400000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -14890,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec34000000000000000000000000d1d6733de35ed9025fddea264d35b860edce3e25000000000000000000000000d1d6733de35ed9025fddea264d35b860edce3e250000000000000000000000000000000000000000000000000001c6bf5263400000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -14891,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec34000000000000000000000000d1d6733de35ed9025fddea264d35b860edce3e25000000000000000000000000d1d6733de35ed9025fddea264d35b860edce3e250000000000000000000000000000000000000000000000000001c6bf5263400000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -14892,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec34000000000000000000000000250e936d39bcdbc0b84c15b248a8356d341f06c7000000000000000000000000250e936d39bcdbc0b84c15b248a8356d341f06c70000000000000000000000000000000000000000000000000001c6bf5263400000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -14893,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec34000000000000000000000000250e936d39bcdbc0b84c15b248a8356d341f06c7000000000000000000000000250e936d39bcdbc0b84c15b248a8356d341f06c70000000000000000000000000000000000000000000000000001c6bf5263400000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -14894,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec34000000000000000000000000250e936d39bcdbc0b84c15b248a8356d341f06c7000000000000000000000000250e936d39bcdbc0b84c15b248a8356d341f06c70000000000000000000000000000000000000000000000000001c6bf5263400000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -14895,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec3400000000000000000000000057d6c4efb2ca6703674343d1a7c0492fba49a6f300000000000000000000000057d6c4efb2ca6703674343d1a7c0492fba49a6f30000000000000000000000000000000000000000000000000001c6bf5263400000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -14896,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec3400000000000000000000000057d6c4efb2ca6703674343d1a7c0492fba49a6f300000000000000000000000057d6c4efb2ca6703674343d1a7c0492fba49a6f30000000000000000000000000000000000000000000000000001c6bf5263400000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -14897,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec3400000000000000000000000057c6155a0bf0a040dc59021fd32c95f35dc632c000000000000000000000000057c6155a0bf0a040dc59021fd32c95f35dc632c00000000000000000000000000000000000000000000000000142e1355d8a88b800000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -14899,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec3400000000000000000000000021a38a7ee0675e249fe000a21efe55e4c366247d00000000000000000000000021a38a7ee0675e249fe000a21efe55e4c366247d0000000000000000000000000000000000000000000000000001c6bf5263400000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -14900,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec3400000000000000000000000021a38a7ee0675e249fe000a21efe55e4c366247d00000000000000000000000021a38a7ee0675e249fe000a21efe55e4c366247d0000000000000000000000000000000000000000000000000001c6bf5263400000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -14901,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec3400000000000000000000000021a38a7ee0675e249fe000a21efe55e4c366247d00000000000000000000000021a38a7ee0675e249fe000a21efe55e4c366247d0000000000000000000000000000000000000000000000000001c6bf5263400000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -14902,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec3400000000000000000000000021a38a7ee0675e249fe000a21efe55e4c366247d00000000000000000000000021a38a7ee0675e249fe000a21efe55e4c366247d0000000000000000000000000000000000000000000000000001c6bf5263400000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -14903,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec3400000000000000000000000021a38a7ee0675e249fe000a21efe55e4c366247d00000000000000000000000021a38a7ee0675e249fe000a21efe55e4c366247d0000000000000000000000000000000000000000000000000001c6bf5263400000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -14904,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec34000000000000000000000000f7a1e18a6cb3e98b3c01005484108f21cc50bdb4000000000000000000000000f7a1e18a6cb3e98b3c01005484108f21cc50bdb40000000000000000000000000000000000000000000000000001c6bf5263400000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -14905,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec34000000000000000000000000f7a1e18a6cb3e98b3c01005484108f21cc50bdb4000000000000000000000000f7a1e18a6cb3e98b3c01005484108f21cc50bdb40000000000000000000000000000000000000000000000000001c6bf5263400000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -14906,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec34000000000000000000000000f7a1e18a6cb3e98b3c01005484108f21cc50bdb4000000000000000000000000f7a1e18a6cb3e98b3c01005484108f21cc50bdb40000000000000000000000000000000000000000000000000001c6bf5263400000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -14907,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec34000000000000000000000000f7a1e18a6cb3e98b3c01005484108f21cc50bdb4000000000000000000000000f7a1e18a6cb3e98b3c01005484108f21cc50bdb40000000000000000000000000000000000000000000000000001c6bf5263400000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -14908,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec3400000000000000000000000039f8b4c776a3baac5bbfafc8f4abcf2a720c4b2100000000000000000000000039f8b4c776a3baac5bbfafc8f4abcf2a720c4b210000000000000000000000000000000000000000000000000001c6bf5263400000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -14909,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec3400000000000000000000000039f8b4c776a3baac5bbfafc8f4abcf2a720c4b2100000000000000000000000039f8b4c776a3baac5bbfafc8f4abcf2a720c4b210000000000000000000000000000000000000000000000000001c6bf5263400000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -14910,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec3400000000000000000000000039f8b4c776a3baac5bbfafc8f4abcf2a720c4b2100000000000000000000000039f8b4c776a3baac5bbfafc8f4abcf2a720c4b210000000000000000000000000000000000000000000000000001c6bf5263400000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -14911,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec3400000000000000000000000039f8b4c776a3baac5bbfafc8f4abcf2a720c4b2100000000000000000000000039f8b4c776a3baac5bbfafc8f4abcf2a720c4b210000000000000000000000000000000000000000000000000001c6bf5263400000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -14912,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec34000000000000000000000000250047cdeadd75c39b44c605a348bc46d8d28f8b000000000000000000000000250047cdeadd75c39b44c605a348bc46d8d28f8b0000000000000000000000000000000000000000000000000001c6bf5263400000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -14913,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec34000000000000000000000000250047cdeadd75c39b44c605a348bc46d8d28f8b000000000000000000000000250047cdeadd75c39b44c605a348bc46d8d28f8b0000000000000000000000000000000000000000000000000001c6bf5263400000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -14914,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec34000000000000000000000000250047cdeadd75c39b44c605a348bc46d8d28f8b000000000000000000000000250047cdeadd75c39b44c605a348bc46d8d28f8b0000000000000000000000000000000000000000000000000001c6bf5263400000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -14915,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec34000000000000000000000000250047cdeadd75c39b44c605a348bc46d8d28f8b000000000000000000000000250047cdeadd75c39b44c605a348bc46d8d28f8b0000000000000000000000000000000000000000000000000001c6bf5263400000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -14916,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec34000000000000000000000000e74fb25f9faafc4d957adc6109a9638150bcf6ed000000000000000000000000e74fb25f9faafc4d957adc6109a9638150bcf6ed0000000000000000000000000000000000000000000000000001c6bf5263400000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -14917,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec34000000000000000000000000e74fb25f9faafc4d957adc6109a9638150bcf6ed000000000000000000000000e74fb25f9faafc4d957adc6109a9638150bcf6ed0000000000000000000000000000000000000000000000000001c6bf5263400000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -14918,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec34000000000000000000000000e74fb25f9faafc4d957adc6109a9638150bcf6ed000000000000000000000000e74fb25f9faafc4d957adc6109a9638150bcf6ed0000000000000000000000000000000000000000000000000001c6bf5263400000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -14919,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec34000000000000000000000000e74fb25f9faafc4d957adc6109a9638150bcf6ed000000000000000000000000e74fb25f9faafc4d957adc6109a9638150bcf6ed0000000000000000000000000000000000000000000000000001c6bf5263400000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -14920,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec340000000000000000000000005c30ff3315038e68b94eca460002da04c72305580000000000000000000000005c30ff3315038e68b94eca460002da04c72305580000000000000000000000000000000000000000000000000001c6bf5263400000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -14921,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec340000000000000000000000005c30ff3315038e68b94eca460002da04c72305580000000000000000000000005c30ff3315038e68b94eca460002da04c72305580000000000000000000000000000000000000000000000000001c6bf5263400000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -14922,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec340000000000000000000000005c30ff3315038e68b94eca460002da04c72305580000000000000000000000005c30ff3315038e68b94eca460002da04c72305580000000000000000000000000000000000000000000000000001c6bf5263400000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -14923,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec340000000000000000000000005c30ff3315038e68b94eca460002da04c72305580000000000000000000000005c30ff3315038e68b94eca460002da04c72305580000000000000000000000000000000000000000000000000001c6bf5263400000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -14924,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec34000000000000000000000000bf87fd806711400405bfab60c9a78585324eb0b9000000000000000000000000bf87fd806711400405bfab60c9a78585324eb0b90000000000000000000000000000000000000000000000000001c6bf5263400000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -14926,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec34000000000000000000000000bf87fd806711400405bfab60c9a78585324eb0b9000000000000000000000000bf87fd806711400405bfab60c9a78585324eb0b90000000000000000000000000000000000000000000000000001c6bf5263400000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -14927,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec34000000000000000000000000bf87fd806711400405bfab60c9a78585324eb0b9000000000000000000000000bf87fd806711400405bfab60c9a78585324eb0b90000000000000000000000000000000000000000000000000001c6bf5263400000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -14928,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec34000000000000000000000000bf87fd806711400405bfab60c9a78585324eb0b9000000000000000000000000bf87fd806711400405bfab60c9a78585324eb0b90000000000000000000000000000000000000000000000000001c6bf5263400000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -14929,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec34000000000000000000000000f902c7eada99de8bf3cdaf3fa5bddba6a1ecc70a000000000000000000000000f902c7eada99de8bf3cdaf3fa5bddba6a1ecc70a0000000000000000000000000000000000000000000000000001c6bf5263400000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -14930,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec34000000000000000000000000f902c7eada99de8bf3cdaf3fa5bddba6a1ecc70a000000000000000000000000f902c7eada99de8bf3cdaf3fa5bddba6a1ecc70a0000000000000000000000000000000000000000000000000001c6bf5263400000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -14931,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec34000000000000000000000000f902c7eada99de8bf3cdaf3fa5bddba6a1ecc70a000000000000000000000000f902c7eada99de8bf3cdaf3fa5bddba6a1ecc70a0000000000000000000000000000000000000000000000000001c6bf5263400000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -14932,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec34000000000000000000000000f902c7eada99de8bf3cdaf3fa5bddba6a1ecc70a000000000000000000000000f902c7eada99de8bf3cdaf3fa5bddba6a1ecc70a0000000000000000000000000000000000000000000000000001c6bf5263400000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -14933,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec34000000000000000000000000081d0a08250e3bb8618ba3d10871fcf001bfd87d000000000000000000000000081d0a08250e3bb8618ba3d10871fcf001bfd87d0000000000000000000000000000000000000000000000000001c6bf5263400000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -14934,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec34000000000000000000000000081d0a08250e3bb8618ba3d10871fcf001bfd87d000000000000000000000000081d0a08250e3bb8618ba3d10871fcf001bfd87d0000000000000000000000000000000000000000000000000001c6bf5263400000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -14935,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec34000000000000000000000000081d0a08250e3bb8618ba3d10871fcf001bfd87d000000000000000000000000081d0a08250e3bb8618ba3d10871fcf001bfd87d0000000000000000000000000000000000000000000000000001c6bf5263400000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -14936,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec34000000000000000000000000081d0a08250e3bb8618ba3d10871fcf001bfd87d000000000000000000000000081d0a08250e3bb8618ba3d10871fcf001bfd87d0000000000000000000000000000000000000000000000000001c6bf5263400000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -14937,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec3400000000000000000000000011878d39b635e3d9a188dcafe3c7c4e8517674c900000000000000000000000011878d39b635e3d9a188dcafe3c7c4e8517674c90000000000000000000000000000000000000000000000000001c6bf5263400000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -14938,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec3400000000000000000000000011878d39b635e3d9a188dcafe3c7c4e8517674c900000000000000000000000011878d39b635e3d9a188dcafe3c7c4e8517674c90000000000000000000000000000000000000000000000000001c6bf5263400000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -14939,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec3400000000000000000000000011878d39b635e3d9a188dcafe3c7c4e8517674c900000000000000000000000011878d39b635e3d9a188dcafe3c7c4e8517674c90000000000000000000000000000000000000000000000000001c6bf5263400000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -14940,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec3400000000000000000000000011878d39b635e3d9a188dcafe3c7c4e8517674c900000000000000000000000011878d39b635e3d9a188dcafe3c7c4e8517674c90000000000000000000000000000000000000000000000000001c6bf5263400000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -14941,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec3400000000000000000000000011878d39b635e3d9a188dcafe3c7c4e8517674c900000000000000000000000011878d39b635e3d9a188dcafe3c7c4e8517674c90000000000000000000000000000000000000000000000000001c6bf5263400000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -14943,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0xa9f9e675000000000000000000000000dac17f958d2ee523a2206206994597c13d831ec700000000000000000000000094b008aa00579c1307b0ef2c499ad98a8ce58e580000000000000000000000007a557fff0f0ac24b11bda40650fd873e114ebcae0000000000000000000000007a557fff0f0ac24b11bda40650fd873e114ebcae00000000000000000000000000000000000000000000000000000000dc193bbf00000000000000000000000000000000000000000000000000000000000000c00000000000000000000000000000000000000000000000000000000000000000,,,1,true -14944,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec340000000000000000000000005d3335ada4acdc568d4a78e8ec7b402e99b082550000000000000000000000005d3335ada4acdc568d4a78e8ec7b402e99b082550000000000000000000000000000000000000000000000000001c6bf5263400000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -14946,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec340000000000000000000000005d3335ada4acdc568d4a78e8ec7b402e99b082550000000000000000000000005d3335ada4acdc568d4a78e8ec7b402e99b082550000000000000000000000000000000000000000000000000001c6bf5263400000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -14947,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec340000000000000000000000005d3335ada4acdc568d4a78e8ec7b402e99b082550000000000000000000000005d3335ada4acdc568d4a78e8ec7b402e99b082550000000000000000000000000000000000000000000000000001c6bf5263400000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -14948,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec340000000000000000000000005d3335ada4acdc568d4a78e8ec7b402e99b082550000000000000000000000005d3335ada4acdc568d4a78e8ec7b402e99b082550000000000000000000000000000000000000000000000000001c6bf5263400000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -14952,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec340000000000000000000000000e92d33a9709803d1bfdc82143cf7078406ece6b0000000000000000000000000e92d33a9709803d1bfdc82143cf7078406ece6b0000000000000000000000000000000000000000000000000001c6bf5263400000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -14953,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec340000000000000000000000000e92d33a9709803d1bfdc82143cf7078406ece6b0000000000000000000000000e92d33a9709803d1bfdc82143cf7078406ece6b0000000000000000000000000000000000000000000000000001c6bf5263400000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -14954,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec340000000000000000000000000e92d33a9709803d1bfdc82143cf7078406ece6b0000000000000000000000000e92d33a9709803d1bfdc82143cf7078406ece6b0000000000000000000000000000000000000000000000000001c6bf5263400000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -14955,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec340000000000000000000000000e92d33a9709803d1bfdc82143cf7078406ece6b0000000000000000000000000e92d33a9709803d1bfdc82143cf7078406ece6b0000000000000000000000000000000000000000000000000001c6bf5263400000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -14956,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec340000000000000000000000000e92d33a9709803d1bfdc82143cf7078406ece6b0000000000000000000000000e92d33a9709803d1bfdc82143cf7078406ece6b0000000000000000000000000000000000000000000000000001c6bf5263400000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -14957,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec34000000000000000000000000fae56b193a22404e9414247fedeb1c58f02ad2c4000000000000000000000000fae56b193a22404e9414247fedeb1c58f02ad2c40000000000000000000000000000000000000000000000000001c6bf5263400000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -14958,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec34000000000000000000000000fae56b193a22404e9414247fedeb1c58f02ad2c4000000000000000000000000fae56b193a22404e9414247fedeb1c58f02ad2c40000000000000000000000000000000000000000000000000001c6bf5263400000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -14959,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec34000000000000000000000000fae56b193a22404e9414247fedeb1c58f02ad2c4000000000000000000000000fae56b193a22404e9414247fedeb1c58f02ad2c40000000000000000000000000000000000000000000000000001c6bf5263400000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -14961,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec34000000000000000000000000fae56b193a22404e9414247fedeb1c58f02ad2c4000000000000000000000000fae56b193a22404e9414247fedeb1c58f02ad2c40000000000000000000000000000000000000000000000000001c6bf5263400000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -14962,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec34000000000000000000000000fae56b193a22404e9414247fedeb1c58f02ad2c4000000000000000000000000fae56b193a22404e9414247fedeb1c58f02ad2c40000000000000000000000000000000000000000000000000001c6bf5263400000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -14963,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec34000000000000000000000000cab2f322841c850e813ff3c5f4bc827d67a35614000000000000000000000000cab2f322841c850e813ff3c5f4bc827d67a356140000000000000000000000000000000000000000000000000001c6bf5263400000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -14964,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec34000000000000000000000000cab2f322841c850e813ff3c5f4bc827d67a35614000000000000000000000000cab2f322841c850e813ff3c5f4bc827d67a356140000000000000000000000000000000000000000000000000001c6bf5263400000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -14965,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec34000000000000000000000000cab2f322841c850e813ff3c5f4bc827d67a35614000000000000000000000000cab2f322841c850e813ff3c5f4bc827d67a356140000000000000000000000000000000000000000000000000001c6bf5263400000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -14966,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec34000000000000000000000000cab2f322841c850e813ff3c5f4bc827d67a35614000000000000000000000000cab2f322841c850e813ff3c5f4bc827d67a356140000000000000000000000000000000000000000000000000001c6bf5263400000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -14967,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec34000000000000000000000000cf1789a59818c9f3fa9261325de902f79aa03264000000000000000000000000cf1789a59818c9f3fa9261325de902f79aa032640000000000000000000000000000000000000000000000000001c6bf5263400000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -14968,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec34000000000000000000000000cf1789a59818c9f3fa9261325de902f79aa03264000000000000000000000000cf1789a59818c9f3fa9261325de902f79aa032640000000000000000000000000000000000000000000000000001c6bf5263400000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -14969,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec34000000000000000000000000cf1789a59818c9f3fa9261325de902f79aa03264000000000000000000000000cf1789a59818c9f3fa9261325de902f79aa032640000000000000000000000000000000000000000000000000001c6bf5263400000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -14970,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec34000000000000000000000000cf1789a59818c9f3fa9261325de902f79aa03264000000000000000000000000cf1789a59818c9f3fa9261325de902f79aa032640000000000000000000000000000000000000000000000000001c6bf5263400000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -14971,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec34000000000000000000000000afbc9dd7cee3646e8cff9500ce654b4185cbeabe000000000000000000000000afbc9dd7cee3646e8cff9500ce654b4185cbeabe0000000000000000000000000000000000000000000000000001c6bf5263400000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -14972,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec34000000000000000000000000afbc9dd7cee3646e8cff9500ce654b4185cbeabe000000000000000000000000afbc9dd7cee3646e8cff9500ce654b4185cbeabe0000000000000000000000000000000000000000000000000001c6bf5263400000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -14973,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec34000000000000000000000000afbc9dd7cee3646e8cff9500ce654b4185cbeabe000000000000000000000000afbc9dd7cee3646e8cff9500ce654b4185cbeabe0000000000000000000000000000000000000000000000000001c6bf5263400000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -14974,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec34000000000000000000000000afbc9dd7cee3646e8cff9500ce654b4185cbeabe000000000000000000000000afbc9dd7cee3646e8cff9500ce654b4185cbeabe0000000000000000000000000000000000000000000000000001c6bf5263400000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -14975,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec340000000000000000000000000432412ef806641cf51a8276616d28b98c086aef0000000000000000000000000432412ef806641cf51a8276616d28b98c086aef0000000000000000000000000000000000000000000000000001c6bf5263400000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -14976,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec340000000000000000000000000432412ef806641cf51a8276616d28b98c086aef0000000000000000000000000432412ef806641cf51a8276616d28b98c086aef0000000000000000000000000000000000000000000000000001c6bf5263400000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -14977,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec340000000000000000000000000432412ef806641cf51a8276616d28b98c086aef0000000000000000000000000432412ef806641cf51a8276616d28b98c086aef0000000000000000000000000000000000000000000000000001c6bf5263400000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -14978,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec340000000000000000000000000432412ef806641cf51a8276616d28b98c086aef0000000000000000000000000432412ef806641cf51a8276616d28b98c086aef0000000000000000000000000000000000000000000000000001c6bf5263400000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -14979,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec3400000000000000000000000037e03168c330d26ee749be0d7ab734ed2459af0300000000000000000000000037e03168c330d26ee749be0d7ab734ed2459af030000000000000000000000000000000000000000000000000001c6bf5263400000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -14980,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec3400000000000000000000000037e03168c330d26ee749be0d7ab734ed2459af0300000000000000000000000037e03168c330d26ee749be0d7ab734ed2459af030000000000000000000000000000000000000000000000000001c6bf5263400000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -14981,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec3400000000000000000000000037e03168c330d26ee749be0d7ab734ed2459af0300000000000000000000000037e03168c330d26ee749be0d7ab734ed2459af030000000000000000000000000000000000000000000000000001c6bf5263400000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -14982,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec3400000000000000000000000037e03168c330d26ee749be0d7ab734ed2459af0300000000000000000000000037e03168c330d26ee749be0d7ab734ed2459af030000000000000000000000000000000000000000000000000001c6bf5263400000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -14983,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec34000000000000000000000000ea324dc75c40ab87340c966e21c0ad1f74fe6a6c000000000000000000000000ea324dc75c40ab87340c966e21c0ad1f74fe6a6c0000000000000000000000000000000000000000000000000001c6bf5263400000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -14985,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec34000000000000000000000000ea324dc75c40ab87340c966e21c0ad1f74fe6a6c000000000000000000000000ea324dc75c40ab87340c966e21c0ad1f74fe6a6c0000000000000000000000000000000000000000000000000001c6bf5263400000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -14986,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec34000000000000000000000000ea324dc75c40ab87340c966e21c0ad1f74fe6a6c000000000000000000000000ea324dc75c40ab87340c966e21c0ad1f74fe6a6c0000000000000000000000000000000000000000000000000001c6bf5263400000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -14987,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec34000000000000000000000000ea324dc75c40ab87340c966e21c0ad1f74fe6a6c000000000000000000000000ea324dc75c40ab87340c966e21c0ad1f74fe6a6c0000000000000000000000000000000000000000000000000001c6bf5263400000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -14988,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec34000000000000000000000000b8c82153578a508c797d9f47087ff9a049d4a87c000000000000000000000000b8c82153578a508c797d9f47087ff9a049d4a87c0000000000000000000000000000000000000000000000000001c6bf5263400000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -14989,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec34000000000000000000000000b8c82153578a508c797d9f47087ff9a049d4a87c000000000000000000000000b8c82153578a508c797d9f47087ff9a049d4a87c0000000000000000000000000000000000000000000000000001c6bf5263400000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -14990,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec34000000000000000000000000b8c82153578a508c797d9f47087ff9a049d4a87c000000000000000000000000b8c82153578a508c797d9f47087ff9a049d4a87c0000000000000000000000000000000000000000000000000001c6bf5263400000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -14991,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec34000000000000000000000000b8c82153578a508c797d9f47087ff9a049d4a87c000000000000000000000000b8c82153578a508c797d9f47087ff9a049d4a87c0000000000000000000000000000000000000000000000000001c6bf5263400000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -14992,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec34000000000000000000000000e5c8069f3e04bc4acef97c499eff3e19b389e13e000000000000000000000000e5c8069f3e04bc4acef97c499eff3e19b389e13e0000000000000000000000000000000000000000000000000184311faa247e0000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -14993,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec3400000000000000000000000062a2d0f2bdb776da7bd258f076a716b14aef8fce00000000000000000000000062a2d0f2bdb776da7bd258f076a716b14aef8fce00000000000000000000000000000000000000000000000000cceec0fdfe4db900000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -14994,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec340000000000000000000000003c033aab89b26650057881dabbc0815146ffc0f20000000000000000000000003c033aab89b26650057881dabbc0815146ffc0f2000000000000000000000000000000000000000000000000026352913376ece400000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,0xd789b1aa8f7cfd47d397732924c2c77ab5bf500c7f8a5f8d78dbea72472c7988,2021-11-24 11:57:50.000 UTC,0,true -14995,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec3400000000000000000000000005f5a4ecf33fa9eba7f7e52a4bc0c2aab5dcb82b00000000000000000000000005f5a4ecf33fa9eba7f7e52a4bc0c2aab5dcb82b00000000000000000000000000000000000000000000000000f8b0a10e47000000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -14996,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec3400000000000000000000000060e203841ad895952990241374e8599d437dba8e00000000000000000000000060e203841ad895952990241374e8599d437dba8e000000000000000000000000000000000000000000000000005c28b3b3406c6100000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -14997,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec3400000000000000000000000080eadcd56c6ea034331bd9c72a86220c85a815c100000000000000000000000080eadcd56c6ea034331bd9c72a86220c85a815c100000000000000000000000000000000000000000000000000ee6cd6844e843a00000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,0x44ba34e68238003db9c84c9ff7fdccc2241ef5a268f8952a8546afcb6ba5117c,2022-02-26 23:01:17.000 UTC,0,true -14998,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec340000000000000000000000001778cb9fd8d489c740568a9bf16004d948d9b6bf0000000000000000000000001778cb9fd8d489c740568a9bf16004d948d9b6bf000000000000000000000000000000000000000000000000004205b433402fc000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -15000,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec34000000000000000000000000f58c3f6331d4acb595f9d1c799b88cc2bcd305b2000000000000000000000000f58c3f6331d4acb595f9d1c799b88cc2bcd305b2000000000000000000000000000000000000000000000000000110d9316ec00000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -15001,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec340000000000000000000000000fb61a8e5cf37cc1de7c1fe155ee5295c3d023600000000000000000000000000fb61a8e5cf37cc1de7c1fe155ee5295c3d0236000000000000000000000000000000000000000000000000005f7aab8c56b000000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -15003,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec34000000000000000000000000883758d9d67de6334496552897f31e5e5a2565ab000000000000000000000000883758d9d67de6334496552897f31e5e5a2565ab00000000000000000000000000000000000000000000000000106d10c95fa0f100000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -15004,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec34000000000000000000000000ffb7f2f91fea3212649a68c25f604c128968a2ba000000000000000000000000ffb7f2f91fea3212649a68c25f604c128968a2ba00000000000000000000000000000000000000000000000001a715603d7d9b4900000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -15007,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec3400000000000000000000000039074b2b4434bf3115890094e1360e36d42ecbbd00000000000000000000000039074b2b4434bf3115890094e1360e36d42ecbbd00000000000000000000000000000000000000000000000002587a6eeef4002a00000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -15009,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0xa9f9e675000000000000000000000000a0b86991c6218b36c1d19d4a2e9eb0ce3606eb480000000000000000000000007f5c764cbc14f9669b88837ca1490cca17c3160700000000000000000000000081cfc36ef7bffe9a1e95f8fa1bec6bad71e1db7e00000000000000000000000081cfc36ef7bffe9a1e95f8fa1bec6bad71e1db7e000000000000000000000000000000000000000000000000000000000173ad0300000000000000000000000000000000000000000000000000000000000000c00000000000000000000000000000000000000000000000000000000000000000,,,1,true -15011,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec340000000000000000000000008603c52132af298f90093d9697b954aceefdd1d60000000000000000000000008603c52132af298f90093d9697b954aceefdd1d6000000000000000000000000000000000000000000000000008e1bc9bf04000000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -15015,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec34000000000000000000000000bb62e25a011acfd4afef3c7e074d44c56a0867d7000000000000000000000000bb62e25a011acfd4afef3c7e074d44c56a0867d7000000000000000000000000000000000000000000000000001ec738acc4e30000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -15017,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec34000000000000000000000000d3ec605d078326b0a636ca90d496ebb5eb457a27000000000000000000000000d3ec605d078326b0a636ca90d496ebb5eb457a2700000000000000000000000000000000000000000000000000c9a4aa8882689700000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -15018,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec340000000000000000000000003ecc524bac33f76cc3b5bfcee2aed8b96e2053140000000000000000000000003ecc524bac33f76cc3b5bfcee2aed8b96e205314000000000000000000000000000000000000000000000000013fbe85edc9000000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -15019,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec340000000000000000000000004cd48098cec9db1019b19e232d39787fa58029f60000000000000000000000004cd48098cec9db1019b19e232d39787fa58029f6000000000000000000000000000000000000000000000000003cbc5c89c45d4000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -15021,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0xa9f9e675000000000000000000000000514910771af9ca656af840dff83e8264ecf986ca000000000000000000000000350a791bfc2c21f9ed5d10980dad2e2638ffa7f6000000000000000000000000f9629f4d682d5f81b1efc48197cd8f1813c7ff9c000000000000000000000000f9629f4d682d5f81b1efc48197cd8f1813c7ff9c0000000000000000000000000000000000000000000000007681b071ae64322400000000000000000000000000000000000000000000000000000000000000c00000000000000000000000000000000000000000000000000000000000000000,,,1,true -15023,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec3400000000000000000000000057424e704d9912129445cadae8c321a3bede349d00000000000000000000000057424e704d9912129445cadae8c321a3bede349d000000000000000000000000000000000000000000000000003c19beb550e32600000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -15024,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec3400000000000000000000000020f9151b1643f660bef88a5aa7c2ff0ba2bebe8200000000000000000000000020f9151b1643f660bef88a5aa7c2ff0ba2bebe820000000000000000000000000000000000000000000000000dcc004ea0ba75be00000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,0x527f5b9ae48cb051a8a8051d1b0b14ebaa446ce741d2009b843471d5e26ef4cb,2022-11-01 15:22:11.000 UTC,0,true -15028,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec34000000000000000000000000cdb921352f72fbfe5eecf0fa34d1b26a4e0c57ad000000000000000000000000cdb921352f72fbfe5eecf0fa34d1b26a4e0c57ad0000000000000000000000000000000000000000000000000f3162295c4c96c200000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,0x65a4914dbb010ce7002fcb2b8661efe6789d660fec7301acdb886aa9615fc71b,2021-11-21 17:44:44.000 UTC,0,true -15033,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec3400000000000000000000000078ee4d78d27b20d97e3e51c0cc917ebe55806b0000000000000000000000000078ee4d78d27b20d97e3e51c0cc917ebe55806b000000000000000000000000000000000000000000000000000159fc5d54628a4800000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -15035,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec3400000000000000000000000085ea7c5ee10c3e37865799faf1b0535986f143b300000000000000000000000085ea7c5ee10c3e37865799faf1b0535986f143b300000000000000000000000000000000000000000000000002b2a9b238f4e22900000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -15038,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec340000000000000000000000003a782d8b7cd409ce196a3ef1b9f44de41f4fa5b40000000000000000000000003a782d8b7cd409ce196a3ef1b9f44de41f4fa5b400000000000000000000000000000000000000000000000001eb8b1e1e46c93500000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -15040,0x10e6593cdda8c58a1d0f14c5164b376352a55f2f,0x467194771dae2967aef3ecbedd3bf9a310c76c65,0xa9f9e6750000000000000000000000006b175474e89094c44da98b954eedeac495271d0f000000000000000000000000da10009cbd5d07dd0cecc66161fc93d7c9000da1000000000000000000000000ac0b447d5d976b1ec7d8a885c937e0efcc7edbe0000000000000000000000000ac0b447d5d976b1ec7d8a885c937e0efcc7edbe00000000000000000000000000000000000000000000000006d9491212756b49600000000000000000000000000000000000000000000000000000000000000c00000000000000000000000000000000000000000000000000000000000000000,0xd5997f47c09d89f451188e90873bed99ea488108adf95af592c8ed8ada152a9c,2022-07-10 05:17:23.000 UTC,0,true -15042,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec34000000000000000000000000c154383b6ce66f0a9981544fc78a71526281ba78000000000000000000000000c154383b6ce66f0a9981544fc78a71526281ba78000000000000000000000000000000000000000000000000003cc7710635bc1c00000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -15044,0xcd9d4988c0ae61887b075ba77f08cbfad2b65068,0x3f87ff1de58128ef8fcb4c807efd776e1ac72e51,0xf4f7b41a000000000000000000000000a02513b5c1695940b87c835f5cd038ac13c1b53f00000000000000000000000000000000000000000000000037919d20e97e1496,,,1,true -15046,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0xa9f9e675000000000000000000000000dac17f958d2ee523a2206206994597c13d831ec700000000000000000000000094b008aa00579c1307b0ef2c499ad98a8ce58e5800000000000000000000000033e7a93470ae5b27dbfe27f94ad3c1b1ff7efe5e00000000000000000000000033e7a93470ae5b27dbfe27f94ad3c1b1ff7efe5e000000000000000000000000000000000000000000000000000000000dc445d800000000000000000000000000000000000000000000000000000000000000c00000000000000000000000000000000000000000000000000000000000000000,,,1,true -15048,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec34000000000000000000000000ef4981e9ced215d267ae900c5802c6966efd312a000000000000000000000000ef4981e9ced215d267ae900c5802c6966efd312a000000000000000000000000000000000000000000000000015ed886d9525b0000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -15049,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec34000000000000000000000000f278ac8e97dd418a3ce13307fa1b44ff87a18f7c000000000000000000000000f278ac8e97dd418a3ce13307fa1b44ff87a18f7c0000000000000000000000000000000000000000000000000000e5d0016ed90000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -15050,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec34000000000000000000000000cd8771ae2d6cb344663b8da7253c944f0801edd8000000000000000000000000cd8771ae2d6cb344663b8da7253c944f0801edd800000000000000000000000000000000000000000000000001833e37b527bb7100000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -15051,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec340000000000000000000000002c7121dcbd8e2288cd3e181d2c3b2477527c3e810000000000000000000000002c7121dcbd8e2288cd3e181d2c3b2477527c3e8100000000000000000000000000000000000000000000000000e1eafd8c4f803400000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -15053,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec34000000000000000000000000fad545d7391f9c9a93b6f2c6924c7b6aabb13d21000000000000000000000000fad545d7391f9c9a93b6f2c6924c7b6aabb13d2100000000000000000000000000000000000000000000000000e360f9ee45edcf00000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -15054,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec3400000000000000000000000052ad07a854ff71c27eeb85606a30600646ac84b700000000000000000000000052ad07a854ff71c27eeb85606a30600646ac84b700000000000000000000000000000000000000000000000000e5e5105a17fbca00000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -15056,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec34000000000000000000000000227443f8cb623e4e8e2e4e6505e0c5d20a9ab4e1000000000000000000000000227443f8cb623e4e8e2e4e6505e0c5d20a9ab4e10000000000000000000000000000000000000000000000000011c37937e0800000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -15057,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec3400000000000000000000000062009d75c7312dd460f9ac0682e705ac3ca57f1d00000000000000000000000062009d75c7312dd460f9ac0682e705ac3ca57f1d00000000000000000000000000000000000000000000000000e1b0911080971e00000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -15058,0x10e6593cdda8c58a1d0f14c5164b376352a55f2f,0x467194771dae2967aef3ecbedd3bf9a310c76c65,0xa9f9e6750000000000000000000000006b175474e89094c44da98b954eedeac495271d0f000000000000000000000000da10009cbd5d07dd0cecc66161fc93d7c9000da100000000000000000000000044cb2d713bda3858001f038645fd05e23e5de03d00000000000000000000000044cb2d713bda3858001f038645fd05e23e5de03d0000000000000000000000000000000000000000000000008ac7230489e8000000000000000000000000000000000000000000000000000000000000000000c00000000000000000000000000000000000000000000000000000000000000000,,,1,true -15060,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec340000000000000000000000002763347165cdb87d12ac3217cb9ee0d395f0d0070000000000000000000000002763347165cdb87d12ac3217cb9ee0d395f0d00700000000000000000000000000000000000000000000000000148836c082f89b00000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -15061,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec34000000000000000000000000aed09b2654bee737eead92dfcf451953cf88b448000000000000000000000000aed09b2654bee737eead92dfcf451953cf88b4480000000000000000000000000000000000000000000000000023a75513f2fda700000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -15064,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec34000000000000000000000000be2461207b633ea5da676a0e738ea80b7c95d8a6000000000000000000000000be2461207b633ea5da676a0e738ea80b7c95d8a600000000000000000000000000000000000000000000000002d62bfc5bb0c28000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -15065,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec34000000000000000000000000be2461207b633ea5da676a0e738ea80b7c95d8a6000000000000000000000000be2461207b633ea5da676a0e738ea80b7c95d8a600000000000000000000000000000000000000000000000002e3ba376a62c40000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -15066,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec34000000000000000000000000917d24f8d2c41a434796d16a53ad51aaaa9ec129000000000000000000000000917d24f8d2c41a434796d16a53ad51aaaa9ec129000000000000000000000000000000000000000000000000009c2d1104d6060000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -15068,0x10e6593cdda8c58a1d0f14c5164b376352a55f2f,0x467194771dae2967aef3ecbedd3bf9a310c76c65,0xa9f9e6750000000000000000000000006b175474e89094c44da98b954eedeac495271d0f000000000000000000000000da10009cbd5d07dd0cecc66161fc93d7c9000da10000000000000000000000006a45c27e47ecb7d51e69839ac949aa69f8f0f15f0000000000000000000000006a45c27e47ecb7d51e69839ac949aa69f8f0f15f00000000000000000000000000000000000000000000001539964beba9db13cf00000000000000000000000000000000000000000000000000000000000000c00000000000000000000000000000000000000000000000000000000000000000,0x3b789b63d3a38b0a5b76882013f22952f6c5f6ede63fad04e2a2d57b1817fadd,2022-02-13 04:50:20.000 UTC,0,true -15069,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec34000000000000000000000000c25c0092307a5b8afd8a4bd01351a92579040951000000000000000000000000c25c0092307a5b8afd8a4bd01351a925790409510000000000000000000000000000000000000000000000001582b4c9a9db000000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,0xac5fff10b1e5d6c58731a15ba2dcae4a15dd5151ca95390522f93ad6843694ec,2022-04-05 11:32:34.000 UTC,0,true -15072,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec3400000000000000000000000029c80c2690f91a47803445c5922e76597d1dd2b600000000000000000000000029c80c2690f91a47803445c5922e76597d1dd2b6000000000000000000000000000000000000000000000000003a56fcc7cca2e400000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -15075,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec340000000000000000000000001d50f52301e5ad3e9e6abbcd645a72b18df914f00000000000000000000000001d50f52301e5ad3e9e6abbcd645a72b18df914f00000000000000000000000000000000000000000000000000153615bda39c1ca00000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,0x1081f749592fbcc21bcd6dbfbaef31cf2bc06d2b26d1342e5fe5f36ef452f523,2022-08-09 23:34:35.000 UTC,0,true -15077,0x10e6593cdda8c58a1d0f14c5164b376352a55f2f,0x467194771dae2967aef3ecbedd3bf9a310c76c65,0xa9f9e6750000000000000000000000006b175474e89094c44da98b954eedeac495271d0f000000000000000000000000da10009cbd5d07dd0cecc66161fc93d7c9000da10000000000000000000000008e1083d25ce5c4c48a28f80445e79f27788f54d30000000000000000000000008e1083d25ce5c4c48a28f80445e79f27788f54d30000000000000000000000000000000000000000000000000e043da61725000000000000000000000000000000000000000000000000000000000000000000c00000000000000000000000000000000000000000000000000000000000000000,,,1,true -15079,0x10e6593cdda8c58a1d0f14c5164b376352a55f2f,0x467194771dae2967aef3ecbedd3bf9a310c76c65,0xa9f9e6750000000000000000000000006b175474e89094c44da98b954eedeac495271d0f000000000000000000000000da10009cbd5d07dd0cecc66161fc93d7c9000da1000000000000000000000000bcf5411619e85f92ded9f8835f230aefab84e41c000000000000000000000000bcf5411619e85f92ded9f8835f230aefab84e41c0000000000000000000000000000000000000000000000000de444324c2a800000000000000000000000000000000000000000000000000000000000000000c00000000000000000000000000000000000000000000000000000000000000000,,,1,true -15082,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec340000000000000000000000003e25031e37e0c111d6d3b510ea85be0347d375750000000000000000000000003e25031e37e0c111d6d3b510ea85be0347d37575000000000000000000000000000000000000000000000000008b12959b8e430000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -15083,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec340000000000000000000000008ac5e0ff3b00b2bc35b0382e7fcb738f27989fc00000000000000000000000008ac5e0ff3b00b2bc35b0382e7fcb738f27989fc00000000000000000000000000000000000000000000000000078a43b9601ba0000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -15086,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec340000000000000000000000000c920d0261ac02532922a4af66168fbcf8b0a8ed0000000000000000000000000c920d0261ac02532922a4af66168fbcf8b0a8ed0000000000000000000000000000000000000000000000000214e8348c4f000000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -15087,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec34000000000000000000000000a3fa725536edce8a7d3a169ef093c6ea17c796f1000000000000000000000000a3fa725536edce8a7d3a169ef093c6ea17c796f10000000000000000000000000000000000000000000000000051b660cdd5800000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -15088,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec34000000000000000000000000a3fa725536edce8a7d3a169ef093c6ea17c796f1000000000000000000000000a3fa725536edce8a7d3a169ef093c6ea17c796f1000000000000000000000000000000000000000000000000006a94d74f43000000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -15089,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec34000000000000000000000000a3fa725536edce8a7d3a169ef093c6ea17c796f1000000000000000000000000a3fa725536edce8a7d3a169ef093c6ea17c796f1000000000000000000000000000000000000000000000000002386f26fc1000000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -15090,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec3400000000000000000000000029c2fad45523f97940d8d2e7e0fa6c9081bc4a4f00000000000000000000000029c2fad45523f97940d8d2e7e0fa6c9081bc4a4f00000000000000000000000000000000000000000000000000038d7ea4c6800000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -15091,0x10e6593cdda8c58a1d0f14c5164b376352a55f2f,0x467194771dae2967aef3ecbedd3bf9a310c76c65,0xa9f9e6750000000000000000000000006b175474e89094c44da98b954eedeac495271d0f000000000000000000000000da10009cbd5d07dd0cecc66161fc93d7c9000da1000000000000000000000000679d91865fdb6792c61e7a275012380fc47022d3000000000000000000000000679d91865fdb6792c61e7a275012380fc47022d30000000000000000000000000000000000000000000000000e4b4b8af6a7000000000000000000000000000000000000000000000000000000000000000000c00000000000000000000000000000000000000000000000000000000000000000,,,1,true -15092,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec34000000000000000000000000eabb2157a5fc3cd650a0e3d0e8c9c6894e1b756b000000000000000000000000eabb2157a5fc3cd650a0e3d0e8c9c6894e1b756b000000000000000000000000000000000000000000000000023512699b531c7e00000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,0x8b3b67bdbcb00e4a2dc80c3c75e54baf51794573d4f731c5f78b73d43d4a9589,2022-08-02 20:47:32.000 UTC,0,true -15093,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec34000000000000000000000000ac5201f9e7d908a9877929807cd878051b7f2d50000000000000000000000000ac5201f9e7d908a9877929807cd878051b7f2d50000000000000000000000000000000000000000000000000104aa4469555649800000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -15094,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec340000000000000000000000001df8da860dd62a439361d1ec0446dd3a440cf1d90000000000000000000000001df8da860dd62a439361d1ec0446dd3a440cf1d900000000000000000000000000000000000000000000000000bc12d0749d289300000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -15097,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0xa9f9e675000000000000000000000000a0b86991c6218b36c1d19d4a2e9eb0ce3606eb480000000000000000000000007f5c764cbc14f9669b88837ca1490cca17c3160700000000000000000000000088f96204a47c3bd173b672a49f010149c4bd802c00000000000000000000000088f96204a47c3bd173b672a49f010149c4bd802c000000000000000000000000000000000000000000000000000000005355bab900000000000000000000000000000000000000000000000000000000000000c00000000000000000000000000000000000000000000000000000000000000000,,,1,true -15101,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec34000000000000000000000000cc29d61e6915b42f7c46465dfc854d63218a5d1a000000000000000000000000cc29d61e6915b42f7c46465dfc854d63218a5d1a0000000000000000000000000000000000000000000000000158f8c568781f6000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -15105,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0xa9f9e67500000000000000000000000003ab458634910aad20ef5f1c8ee96f1d6ac549190000000000000000000000007fb688ccf682d58f86d7e38e03f9d22e7705448b0000000000000000000000003b71f26ad2e05fee688391929dfa73fd672cb79d0000000000000000000000003b71f26ad2e05fee688391929dfa73fd672cb79d000000000000000000000000000000000000000000000001feb3dd067660000000000000000000000000000000000000000000000000000000000000000000c00000000000000000000000000000000000000000000000000000000000000000,,,1,true -15106,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec34000000000000000000000000d47666e190166383c1623ab7a806cc2b29bdcbd6000000000000000000000000d47666e190166383c1623ab7a806cc2b29bdcbd6000000000000000000000000000000000000000000000000032d0ae6378a94f700000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -15107,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec3400000000000000000000000099f9353111fdb15312af41c9646ac810b70980f000000000000000000000000099f9353111fdb15312af41c9646ac810b70980f000000000000000000000000000000000000000000000000000038d7ea4c6800000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -15108,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec3400000000000000000000000099f9353111fdb15312af41c9646ac810b70980f000000000000000000000000099f9353111fdb15312af41c9646ac810b70980f000000000000000000000000000000000000000000000000000071afd498d000000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -15110,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec3400000000000000000000000099f9353111fdb15312af41c9646ac810b70980f000000000000000000000000099f9353111fdb15312af41c9646ac810b70980f000000000000000000000000000000000000000000000000000071afd498d000000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -15112,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec340000000000000000000000001e054e91786d9eb097d166027b9c7428a6a96dd10000000000000000000000001e054e91786d9eb097d166027b9c7428a6a96dd10000000000000000000000000000000000000000000000000299543d679a183900000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -15114,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec340000000000000000000000002d242c1aba34d16ddb176aaa329cedb451bce2d00000000000000000000000002d242c1aba34d16ddb176aaa329cedb451bce2d0000000000000000000000000000000000000000000000000053ae705411254fd00000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,0x2bd0ccb4a763f70a29f01e5e9d85992c0801c304469da76c6a17a16a17452476,2022-03-29 20:30:15.000 UTC,0,true -15115,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec340000000000000000000000001028e34f2c628e364084c99f37e6260cf9db18d20000000000000000000000001028e34f2c628e364084c99f37e6260cf9db18d200000000000000000000000000000000000000000000000002c68af0bb14000000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,0x98683dfb35d314377de7e1ca7aec65df3e1c57cf2e5bc9446a8c5f45d0a43fc7,2021-11-23 08:16:12.000 UTC,0,true -15120,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec3400000000000000000000000085dc21776b349c07c080b454e27387e32d3a2e6900000000000000000000000085dc21776b349c07c080b454e27387e32d3a2e6900000000000000000000000000000000000000000000000000757d43dfee47ba00000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -15121,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec3400000000000000000000000033ba2329f4ed833a27e8a52c1999f3ad651b046f00000000000000000000000033ba2329f4ed833a27e8a52c1999f3ad651b046f000000000000000000000000000000000000000000000000016042b2ebede80000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,0xe6f3c1e8b2052b2f7b74f312156accd81b2bafd9d7bd7310843e7ba72f7febc2,2021-12-15 06:36:00.000 UTC,0,true -15123,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec3400000000000000000000000055a62cb69d2ac981b358aee432853f8865e934b100000000000000000000000055a62cb69d2ac981b358aee432853f8865e934b10000000000000000000000000000000000000000000000000089924782ec681f00000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -15125,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec34000000000000000000000000d4919ff6577f38a75a28d1848a37ebc3f04edaa5000000000000000000000000d4919ff6577f38a75a28d1848a37ebc3f04edaa500000000000000000000000000000000000000000000000000050f044f41a1c000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -15126,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec340000000000000000000000000b26185bd5cf165190cd8ccfe10f45fba1c929380000000000000000000000000b26185bd5cf165190cd8ccfe10f45fba1c9293800000000000000000000000000000000000000000000000000038d7ea4c6800000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -15127,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec34000000000000000000000000f3991840aa317390b08e021e644945535dc15bcf000000000000000000000000f3991840aa317390b08e021e644945535dc15bcf00000000000000000000000000000000000000000000000000038d7ea4c6800000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -15128,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec34000000000000000000000000aec73d60af3340627aff834a7f19742681c5500f000000000000000000000000aec73d60af3340627aff834a7f19742681c5500f00000000000000000000000000000000000000000000000000038d7ea4c6800000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -15129,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec3400000000000000000000000030de8c2ac674b359680ca58ea9cc52b3783e9f5900000000000000000000000030de8c2ac674b359680ca58ea9cc52b3783e9f5900000000000000000000000000000000000000000000000000038d7ea4c6800000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -15130,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec34000000000000000000000000c9171fe297b8f64f286ede0ca8f70c1ee381deeb000000000000000000000000c9171fe297b8f64f286ede0ca8f70c1ee381deeb00000000000000000000000000000000000000000000000000038d7ea4c6800000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -15131,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec340000000000000000000000008f3830815e699acf83348213742915e7fb9e23040000000000000000000000008f3830815e699acf83348213742915e7fb9e230400000000000000000000000000000000000000000000000000038d7ea4c6800000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -15132,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec34000000000000000000000000e676e97391094e95102795457ca9c3a8448ac093000000000000000000000000e676e97391094e95102795457ca9c3a8448ac09300000000000000000000000000000000000000000000000000038d7ea4c6800000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -15133,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec3400000000000000000000000050b45690c84ba86de44b4cf653639f96cf81304000000000000000000000000050b45690c84ba86de44b4cf653639f96cf81304000000000000000000000000000000000000000000000000000038d7ea4c6800000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -15134,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec340000000000000000000000002ecccb4ffeaf383a61781544e11a225be4d1170d0000000000000000000000002ecccb4ffeaf383a61781544e11a225be4d1170d00000000000000000000000000000000000000000000000000038d7ea4c6800000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -15135,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec340000000000000000000000003f01f671c66d803f87937e22a152c46936a5756d0000000000000000000000003f01f671c66d803f87937e22a152c46936a5756d00000000000000000000000000000000000000000000000000038d7ea4c6800000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -15136,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec34000000000000000000000000eb298417b4ba252f11d0cf132fdfc35f3b516bac000000000000000000000000eb298417b4ba252f11d0cf132fdfc35f3b516bac00000000000000000000000000000000000000000000000000038d7ea4c6800000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -15137,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec340000000000000000000000000336a06457c655d2ed2407bccf0945a96560f2170000000000000000000000000336a06457c655d2ed2407bccf0945a96560f21700000000000000000000000000000000000000000000000000038d7ea4c6800000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -15138,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec34000000000000000000000000284172e59721939f3fdd1e1306c84f6750140e2c000000000000000000000000284172e59721939f3fdd1e1306c84f6750140e2c00000000000000000000000000000000000000000000000000038d7ea4c6800000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -15139,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec3400000000000000000000000084b2411605959e7c2e11bfc35de428d582af4cf400000000000000000000000084b2411605959e7c2e11bfc35de428d582af4cf400000000000000000000000000000000000000000000000000038d7ea4c6800000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -15140,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec34000000000000000000000000e7af729ad4f5ba883c796375da406a0e2a4cec87000000000000000000000000e7af729ad4f5ba883c796375da406a0e2a4cec8700000000000000000000000000000000000000000000000000038d7ea4c6800000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -15141,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec3400000000000000000000000038fb9ecab5c65c40bea458b02b9df1d9e71a411100000000000000000000000038fb9ecab5c65c40bea458b02b9df1d9e71a411100000000000000000000000000000000000000000000000000038d7ea4c6800000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -15142,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec3400000000000000000000000002d8f962f019d32fb136bf4728407fbf951b37f600000000000000000000000002d8f962f019d32fb136bf4728407fbf951b37f600000000000000000000000000000000000000000000000000038d7ea4c6800000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -15143,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec340000000000000000000000004cd521c85edf64598537ffa8e6eefa16f5fd12db0000000000000000000000004cd521c85edf64598537ffa8e6eefa16f5fd12db00000000000000000000000000000000000000000000000000038d7ea4c6800000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -15144,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec3400000000000000000000000021b998c9d12ad8611e3375be5209d734c1e0285c00000000000000000000000021b998c9d12ad8611e3375be5209d734c1e0285c00000000000000000000000000000000000000000000000000038d7ea4c6800000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -15145,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec34000000000000000000000000e014080fcf47ee8eef764b1531f2fc8dc2d0e40c000000000000000000000000e014080fcf47ee8eef764b1531f2fc8dc2d0e40c00000000000000000000000000000000000000000000000000038d7ea4c6800000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -15146,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec34000000000000000000000000dd020a2987273c96bd31a9ac96a1fbd6f62b9318000000000000000000000000dd020a2987273c96bd31a9ac96a1fbd6f62b931800000000000000000000000000000000000000000000000000038d7ea4c6800000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -15147,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec3400000000000000000000000098abec5be0b3d45a2ceb96df9e161a0a325660cd00000000000000000000000098abec5be0b3d45a2ceb96df9e161a0a325660cd00000000000000000000000000000000000000000000000000038d7ea4c6800000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -15148,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec34000000000000000000000000b9581d747b3a339a0a57b1c47d892461e0261102000000000000000000000000b9581d747b3a339a0a57b1c47d892461e026110200000000000000000000000000000000000000000000000000038d7ea4c6800000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -15149,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec34000000000000000000000000ab9e2cfcfe7a1012bee720b93f84c902a4c87a76000000000000000000000000ab9e2cfcfe7a1012bee720b93f84c902a4c87a7600000000000000000000000000000000000000000000000000038d7ea4c6800000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -15150,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec34000000000000000000000000a356eba6ee53d43e227020390b19cc10c70b885c000000000000000000000000a356eba6ee53d43e227020390b19cc10c70b885c00000000000000000000000000000000000000000000000000038d7ea4c6800000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -15151,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec3400000000000000000000000077f3e03da404d32002616c6d88535b5a8859930800000000000000000000000077f3e03da404d32002616c6d88535b5a8859930800000000000000000000000000000000000000000000000000038d7ea4c6800000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -15152,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec340000000000000000000000005d71d32cb5fc0176fb084be646214e038bef21ab0000000000000000000000005d71d32cb5fc0176fb084be646214e038bef21ab00000000000000000000000000000000000000000000000000038d7ea4c6800000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -15153,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec340000000000000000000000001a3a2f7ff6bc14a9f5a58314aa155123a6db0c090000000000000000000000001a3a2f7ff6bc14a9f5a58314aa155123a6db0c0900000000000000000000000000000000000000000000000000155f8d2f8c44f800000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -15154,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec34000000000000000000000000677f8e0a8fc7befddba89c6c967f334fd4b8ee45000000000000000000000000677f8e0a8fc7befddba89c6c967f334fd4b8ee4500000000000000000000000000000000000000000000000000038d7ea4c6800000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -15155,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec340000000000000000000000002e5c9c95396c7ddff339243873664f6394d9a7e40000000000000000000000002e5c9c95396c7ddff339243873664f6394d9a7e400000000000000000000000000000000000000000000000000038d7ea4c6800000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -15156,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec34000000000000000000000000224515d82ef8751da30f54e98c9bcda58dc858b2000000000000000000000000224515d82ef8751da30f54e98c9bcda58dc858b200000000000000000000000000000000000000000000000000038d7ea4c6800000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -15157,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec340000000000000000000000007958121e61a478f6e2a4815ede4498838373a1280000000000000000000000007958121e61a478f6e2a4815ede4498838373a12800000000000000000000000000000000000000000000000000038d7ea4c6800000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -15158,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec34000000000000000000000000ed6edeafc994f3f7d41896726c774f8f5d29d5c3000000000000000000000000ed6edeafc994f3f7d41896726c774f8f5d29d5c300000000000000000000000000000000000000000000000000038d7ea4c6800000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -15159,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec340000000000000000000000003037cb40171c56cc895e9bd40fc608ff4f775c520000000000000000000000003037cb40171c56cc895e9bd40fc608ff4f775c5200000000000000000000000000000000000000000000000000038d7ea4c6800000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -15160,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec3400000000000000000000000070428f51cf940a073b6016c0529e98ff5e6004a200000000000000000000000070428f51cf940a073b6016c0529e98ff5e6004a200000000000000000000000000000000000000000000000000038d7ea4c6800000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -15161,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec34000000000000000000000000e61b95d17d60d6c892c65608a5b60ecd26d85375000000000000000000000000e61b95d17d60d6c892c65608a5b60ecd26d8537500000000000000000000000000000000000000000000000000038d7ea4c6800000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -15162,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec34000000000000000000000000c9f42f7bd627db7bc659805dca56b2f3d04a28f6000000000000000000000000c9f42f7bd627db7bc659805dca56b2f3d04a28f600000000000000000000000000000000000000000000000000038d7ea4c6800000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -15163,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec3400000000000000000000000018c70d13cf1da0fa7a7b2d39f6ca8fc81d9a3b3e00000000000000000000000018c70d13cf1da0fa7a7b2d39f6ca8fc81d9a3b3e00000000000000000000000000000000000000000000000000038d7ea4c6800000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -15164,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec340000000000000000000000008eeed9e71389f14a3b23ba34c3857a13202314500000000000000000000000008eeed9e71389f14a3b23ba34c3857a132023145000000000000000000000000000000000000000000000000000038d7ea4c6800000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -15165,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec34000000000000000000000000e24821319fd60fad948ddb2587e935a9d2f96ad1000000000000000000000000e24821319fd60fad948ddb2587e935a9d2f96ad100000000000000000000000000000000000000000000000000038d7ea4c6800000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -15166,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec340000000000000000000000004ce09978479907597943dd81dc3c318b0ed5ef6d0000000000000000000000004ce09978479907597943dd81dc3c318b0ed5ef6d0000000000000000000000000000000000000000000000000000253038b4540000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -15167,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec340000000000000000000000009bd157e3d49c683287f132400796bf12b8e84d0d0000000000000000000000009bd157e3d49c683287f132400796bf12b8e84d0d000000000000000000000000000000000000000000000000002386f26fc1000000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -15170,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec34000000000000000000000000949da94aecf949ea5a468aee1bdcadf60ec6b41d000000000000000000000000949da94aecf949ea5a468aee1bdcadf60ec6b41d00000000000000000000000000000000000000000000000000005af3107a400000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -15171,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0xa9f9e675000000000000000000000000dac17f958d2ee523a2206206994597c13d831ec700000000000000000000000094b008aa00579c1307b0ef2c499ad98a8ce58e58000000000000000000000000f5c44945671f4e9018ff0993e7bf9fdf573d07cb000000000000000000000000f5c44945671f4e9018ff0993e7bf9fdf573d07cb000000000000000000000000000000000000000000000000000000000098968000000000000000000000000000000000000000000000000000000000000000c00000000000000000000000000000000000000000000000000000000000000000,,,1,true -15172,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec340000000000000000000000008ad8541f86b30ea4c6a2604fd5f8924d704526360000000000000000000000008ad8541f86b30ea4c6a2604fd5f8924d70452636000000000000000000000000000000000000000000000000006649741469d10000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -15174,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec3400000000000000000000000009840f29b22a3c3427d8a9b98c6890164b859a1f00000000000000000000000009840f29b22a3c3427d8a9b98c6890164b859a1f0000000000000000000000000000000000000000000000000067f1284f43640000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -15175,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec340000000000000000000000003758ff8b7fca3faa76789940eeff8031e3ceeab50000000000000000000000003758ff8b7fca3faa76789940eeff8031e3ceeab500000000000000000000000000000000000000000000000000a4c21295fe77d700000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -15176,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0xa9f9e675000000000000000000000000a0b86991c6218b36c1d19d4a2e9eb0ce3606eb480000000000000000000000007f5c764cbc14f9669b88837ca1490cca17c31607000000000000000000000000fb47cc947e5257de494086ee29fe9121bd687078000000000000000000000000fb47cc947e5257de494086ee29fe9121bd687078000000000000000000000000000000000000000000000000000000000df6663700000000000000000000000000000000000000000000000000000000000000c00000000000000000000000000000000000000000000000000000000000000000,,,1,true -15177,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec3400000000000000000000000077388170fd75c3eda4427972a92d757764acc03100000000000000000000000077388170fd75c3eda4427972a92d757764acc031000000000000000000000000000000000000000000000000007f6f60d771bae000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -15178,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec34000000000000000000000000c1339235da383a92e18f7081cc1dc9a8bb00157f000000000000000000000000c1339235da383a92e18f7081cc1dc9a8bb00157f00000000000000000000000000000000000000000000000001eb8459891ed02d00000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -15180,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec34000000000000000000000000ab06c07dab7c8a220fda74b54296964c88941bc0000000000000000000000000ab06c07dab7c8a220fda74b54296964c88941bc000000000000000000000000000000000000000000000000000064ac0fdcdd34f00000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -15181,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0xa9f9e675000000000000000000000000a0b86991c6218b36c1d19d4a2e9eb0ce3606eb480000000000000000000000007f5c764cbc14f9669b88837ca1490cca17c316070000000000000000000000006554ac8069938943ea3f9acd7edc42c3b68850f70000000000000000000000006554ac8069938943ea3f9acd7edc42c3b68850f7000000000000000000000000000000000000000000000000000000001290d0ed00000000000000000000000000000000000000000000000000000000000000c00000000000000000000000000000000000000000000000000000000000000000,,,1,true -15182,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec34000000000000000000000000d7e834d31f953157480ff3533b7f885884ccd441000000000000000000000000d7e834d31f953157480ff3533b7f885884ccd441000000000000000000000000000000000000000000000000008098de11fd423500000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -15183,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec340000000000000000000000006554ac8069938943ea3f9acd7edc42c3b68850f70000000000000000000000006554ac8069938943ea3f9acd7edc42c3b68850f70000000000000000000000000000000000000000000000000011fd6484e15d0000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -15184,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec34000000000000000000000000b510fddc194f5f771d45e1ecdff32156c5bb1aea000000000000000000000000b510fddc194f5f771d45e1ecdff32156c5bb1aea000000000000000000000000000000000000000000000000000f065708e7f30000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -15194,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec34000000000000000000000000fc861260e9501ffa5b042e6ce233a637d98274d2000000000000000000000000fc861260e9501ffa5b042e6ce233a637d98274d200000000000000000000000000000000000000000000000000db3e750bf3a3b400000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -15197,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec340000000000000000000000004e239b011f5ae87a47a075562cca78d0b71706770000000000000000000000004e239b011f5ae87a47a075562cca78d0b71706770000000000000000000000000000000000000000000000000099afdfc683936100000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,0x083d9e5a87211b70eb0b1dc14a825e05b766dbf892e399b73fc2387b6dd98ca0,2022-05-21 14:01:01.000 UTC,0,true -15202,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec34000000000000000000000000ba8801a8e9f2ed103e89fd5acd605921bfa1cb62000000000000000000000000ba8801a8e9f2ed103e89fd5acd605921bfa1cb620000000000000000000000000000000000000000000000000060ccf3caec17d200000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -15203,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec340000000000000000000000008f7b460b8bad09e2d58fb879c8bd1141aaf6f1b90000000000000000000000008f7b460b8bad09e2d58fb879c8bd1141aaf6f1b900000000000000000000000000000000000000000000000000679d894736030000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -15204,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec34000000000000000000000000d11b1dd436fc09d61d7339e0127f92aefc88a2ae000000000000000000000000d11b1dd436fc09d61d7339e0127f92aefc88a2ae00000000000000000000000000000000000000000000000000168b4ad6e7f14000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -15205,0xcd9d4988c0ae61887b075ba77f08cbfad2b65068,0x3f87ff1de58128ef8fcb4c807efd776e1ac72e51,0xf4f7b41a00000000000000000000000015f490fe47a84a50c75b0cc4c1f4b17b7188306d000000000000000000000000000000000000000000000000316336151813c381,,,1,true -15206,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec340000000000000000000000001a31395f7ee44b6c5aef70bbd48718aa1b33b7890000000000000000000000001a31395f7ee44b6c5aef70bbd48718aa1b33b78900000000000000000000000000000000000000000000000001389e044d72381b00000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -15207,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec3400000000000000000000000098e1dc7c0b1b6d55433ccebbfeb7b016070445f200000000000000000000000098e1dc7c0b1b6d55433ccebbfeb7b016070445f20000000000000000000000000000000000000000000000000020041d5496ac2000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -15208,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec34000000000000000000000000de02faa2bc5a046a59c23e5667789037a5b776ed000000000000000000000000de02faa2bc5a046a59c23e5667789037a5b776ed000000000000000000000000000000000000000000000000000279cd0dfc2eb200000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -15209,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec3400000000000000000000000029552b08d2c5f98a3de6063ea9f7b54bf291889000000000000000000000000029552b08d2c5f98a3de6063ea9f7b54bf2918890000000000000000000000000000000000000000000000000005fec5b60ef800000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -15210,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec3400000000000000000000000042ff60bca5196455c8ae35a9ce6e423388e08c6800000000000000000000000042ff60bca5196455c8ae35a9ce6e423388e08c6800000000000000000000000000000000000000000000000000d21118bb823e0000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -15211,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec340000000000000000000000000150ac2efbb090921d5a6fdf089f9e9d285972430000000000000000000000000150ac2efbb090921d5a6fdf089f9e9d2859724300000000000000000000000000000000000000000000000000ac6256afe909cd00000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -15216,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec34000000000000000000000000539018e88aa7b5277fd074e3a06bdb025f0d1cf6000000000000000000000000539018e88aa7b5277fd074e3a06bdb025f0d1cf6000000000000000000000000000000000000000000000000000d12c276b88c8000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -15219,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec340000000000000000000000007b79004340f1c6641514f165dce2171e579edd340000000000000000000000007b79004340f1c6641514f165dce2171e579edd340000000000000000000000000000000000000000000000000000fea89489800000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -15220,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec340000000000000000000000004c2ca774cfabb33b7392af0c6ab73e858f3ba6580000000000000000000000004c2ca774cfabb33b7392af0c6ab73e858f3ba65800000000000000000000000000000000000000000000000000c0b0b1cf33b4fe00000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -15221,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec3400000000000000000000000064a73977fe3d49f6d2ed853e0f573b6e6e730a2f00000000000000000000000064a73977fe3d49f6d2ed853e0f573b6e6e730a2f000000000000000000000000000000000000000000000000007ede2e0035011800000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -15224,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec340000000000000000000000005af9aecb1850fc16181ebdef1f05fae66ad3f0b90000000000000000000000005af9aecb1850fc16181ebdef1f05fae66ad3f0b90000000000000000000000000000000000000000000000000dca416e776f980300000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -15228,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0xa9f9e675000000000000000000000000a0b86991c6218b36c1d19d4a2e9eb0ce3606eb480000000000000000000000007f5c764cbc14f9669b88837ca1490cca17c3160700000000000000000000000089d345e4910b201a4780e0bfe286f56adfad7be000000000000000000000000089d345e4910b201a4780e0bfe286f56adfad7be0000000000000000000000000000000000000000000000000000000000365c04000000000000000000000000000000000000000000000000000000000000000c00000000000000000000000000000000000000000000000000000000000000000,,,1,true -15230,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec3400000000000000000000000029d4d51dd07220879d014701bb89c03decfa7a9000000000000000000000000029d4d51dd07220879d014701bb89c03decfa7a900000000000000000000000000000000000000000000000000011e92c10b1c60000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -15232,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec3400000000000000000000000027f18241002c0d4899c08c76778dbb2229273dd500000000000000000000000027f18241002c0d4899c08c76778dbb2229273dd500000000000000000000000000000000000000000000000006b9c6bca486511600000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -15233,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec34000000000000000000000000a0bd4b75dc06c7f1860d6f123103404d3f1a1c93000000000000000000000000a0bd4b75dc06c7f1860d6f123103404d3f1a1c93000000000000000000000000000000000000000000000000002386f26fc1000000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -15234,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec34000000000000000000000000f8bd8b491928553da8440ad5b4a3354acc54b87e000000000000000000000000f8bd8b491928553da8440ad5b4a3354acc54b87e00000000000000000000000000000000000000000000000000c04cacfad4b95d00000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -15236,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0xa9f9e675000000000000000000000000a0b86991c6218b36c1d19d4a2e9eb0ce3606eb480000000000000000000000007f5c764cbc14f9669b88837ca1490cca17c31607000000000000000000000000e9554c002b8e72586e1d87f9c4f9c23b90a3b18b000000000000000000000000e9554c002b8e72586e1d87f9c4f9c23b90a3b18b000000000000000000000000000000000000000000000000000000008d539e8500000000000000000000000000000000000000000000000000000000000000c00000000000000000000000000000000000000000000000000000000000000000,0x4925811d8a0cab2f3d62b30745a56cbabd910d12b01b036878b92cd3fe0df248,2022-03-07 22:27:11.000 UTC,0,true -15238,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec340000000000000000000000008b147c4db4e2616c0bacfb29f5c61589bc0de4dc0000000000000000000000008b147c4db4e2616c0bacfb29f5c61589bc0de4dc0000000000000000000000000000000000000000000000000051b660cdd5800000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -15241,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec340000000000000000000000002f082d20cc4abebf31f2a2d0ddae522449d7d45d0000000000000000000000002f082d20cc4abebf31f2a2d0ddae522449d7d45d0000000000000000000000000000000000000000000000000036d7c674c973fe00000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -15243,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec340000000000000000000000005309ccead59405eabece0bddfd93e4a981522da70000000000000000000000005309ccead59405eabece0bddfd93e4a981522da7000000000000000000000000000000000000000000000000020f62f87a6eaa0000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -15244,0xcd9d4988c0ae61887b075ba77f08cbfad2b65068,0x3f87ff1de58128ef8fcb4c807efd776e1ac72e51,0xf4f7b41a000000000000000000000000ad5d9a0ffa01b99d0120262db629c9c69748ad4d00000000000000000000000000000000000000000000000266f70961288b7028,,,1,true -15247,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec340000000000000000000000008c3086dc59a92a5eeee98f28b14ddce5a2da15290000000000000000000000008c3086dc59a92a5eeee98f28b14ddce5a2da152900000000000000000000000000000000000000000000000001550f7dca70000000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -15250,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec34000000000000000000000000e6128ac5ed7993a17924bd473c98e25e053673f9000000000000000000000000e6128ac5ed7993a17924bd473c98e25e053673f900000000000000000000000000000000000000000000000000564e202910c00000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -15251,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec34000000000000000000000000b69307de914273bc58d9d1e176336320a9ade464000000000000000000000000b69307de914273bc58d9d1e176336320a9ade464000000000000000000000000000000000000000000000000003e0b768c21a7ad00000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -15253,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec34000000000000000000000000cbf16b26bb634027f0ca3b202edf478b2da9d4cf000000000000000000000000cbf16b26bb634027f0ca3b202edf478b2da9d4cf000000000000000000000000000000000000000000000000001c6bf52634000000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -15254,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec34000000000000000000000000db0c3b9548cd7de42c362ee4d9e66c15271a4efe000000000000000000000000db0c3b9548cd7de42c362ee4d9e66c15271a4efe0000000000000000000000000000000000000000000000000275a759ce8fa17c00000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -15255,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec34000000000000000000000000618e79fa928aa226c19b7afe5fef58649a8c59fb000000000000000000000000618e79fa928aa226c19b7afe5fef58649a8c59fb00000000000000000000000000000000000000000000000000032077bc3248ce00000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -15256,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec3400000000000000000000000029bd57d591ad823f98d3cd73da938a56ab4945e400000000000000000000000029bd57d591ad823f98d3cd73da938a56ab4945e4000000000000000000000000000000000000000000000000027f7d0bdb92000000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -15259,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec34000000000000000000000000909fdf2feea01276081253e2486dfbc81ab491d4000000000000000000000000909fdf2feea01276081253e2486dfbc81ab491d40000000000000000000000000000000000000000000000000e1730b663ce940000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -15260,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0xa9f9e675000000000000000000000000dac17f958d2ee523a2206206994597c13d831ec700000000000000000000000094b008aa00579c1307b0ef2c499ad98a8ce58e58000000000000000000000000c32fcbe1aaeccad035af0d371abeb41929efc4ed000000000000000000000000c32fcbe1aaeccad035af0d371abeb41929efc4ed00000000000000000000000000000000000000000000000000000000000f424000000000000000000000000000000000000000000000000000000000000000c00000000000000000000000000000000000000000000000000000000000000000,,,1,true -15261,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec34000000000000000000000000858804057376dad586029d21fe09b8a4f647781d000000000000000000000000858804057376dad586029d21fe09b8a4f647781d0000000000000000000000000000000000000000000000000051ab9b337db21000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -15262,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0xa9f9e675000000000000000000000000dac17f958d2ee523a2206206994597c13d831ec700000000000000000000000094b008aa00579c1307b0ef2c499ad98a8ce58e58000000000000000000000000cbf16b26bb634027f0ca3b202edf478b2da9d4cf000000000000000000000000cbf16b26bb634027f0ca3b202edf478b2da9d4cf0000000000000000000000000000000000000000000000000000000000ae162b00000000000000000000000000000000000000000000000000000000000000c00000000000000000000000000000000000000000000000000000000000000000,,,1,true -15264,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec340000000000000000000000005aad5dd01faa0d5e96a80d460560fdef84e3a46a0000000000000000000000005aad5dd01faa0d5e96a80d460560fdef84e3a46a000000000000000000000000000000000000000000000000015228f77c15370000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -15265,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec340000000000000000000000007357464a4692ca5466740b8f5ce0b26d6e4b01280000000000000000000000007357464a4692ca5466740b8f5ce0b26d6e4b0128000000000000000000000000000000000000000000000000000d14bd215acc4600000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,0xad82acbd60479dfecbbd8912c1e598636959c5626b726a129716ffbed6f7abaa,2022-03-13 05:35:14.000 UTC,0,true -15266,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0xa9f9e675000000000000000000000000dac17f958d2ee523a2206206994597c13d831ec700000000000000000000000094b008aa00579c1307b0ef2c499ad98a8ce58e58000000000000000000000000112e05297b5c03a849459868d1b1af7b2b10d68a000000000000000000000000112e05297b5c03a849459868d1b1af7b2b10d68a0000000000000000000000000000000000000000000000000000000003f9755800000000000000000000000000000000000000000000000000000000000000c00000000000000000000000000000000000000000000000000000000000000000,,,1,true -15269,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0xa9f9e675000000000000000000000000dac17f958d2ee523a2206206994597c13d831ec700000000000000000000000094b008aa00579c1307b0ef2c499ad98a8ce58e580000000000000000000000002d2b9e1732d729ee11dffa54f4b32a57f9cf7e550000000000000000000000002d2b9e1732d729ee11dffa54f4b32a57f9cf7e5500000000000000000000000000000000000000000000000000000000000f695000000000000000000000000000000000000000000000000000000000000000c00000000000000000000000000000000000000000000000000000000000000000,,,1,true -15270,0xcd9d4988c0ae61887b075ba77f08cbfad2b65068,0x3f87ff1de58128ef8fcb4c807efd776e1ac72e51,0xf4f7b41a0000000000000000000000008cf0354a5175ca1cf9c14dbfc6e66cabd3d224240000000000000000000000000000000000000000000000026c9c34ee2454fdf6,,,1,true -15272,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec34000000000000000000000000568e25f94a97e01865d966e244a65135e2c095c4000000000000000000000000568e25f94a97e01865d966e244a65135e2c095c4000000000000000000000000000000000000000000000000002386f26fc1000000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -15274,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec34000000000000000000000000f9fe40cc7297def42fd3759571e237b414d5c0cf000000000000000000000000f9fe40cc7297def42fd3759571e237b414d5c0cf00000000000000000000000000000000000000000000000000470de4df82000000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -15275,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec340000000000000000000000006e0b750efa5fb1bfed2a31ac6bb741551bcc98f40000000000000000000000006e0b750efa5fb1bfed2a31ac6bb741551bcc98f40000000000000000000000000000000000000000000000000083734dd0b0800000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,0xf10001df8d9f436ba0dd3e121474aaad50f6b5a591a1da642c1ff4b5036ba2af,2022-05-21 11:14:43.000 UTC,0,true -15276,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec34000000000000000000000000f1c7902f266c3360854ad9b6bbaaa82a52273908000000000000000000000000f1c7902f266c3360854ad9b6bbaaa82a52273908000000000000000000000000000000000000000000000000000009184e72a00000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -15277,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec34000000000000000000000000bd6b6f5b2e9527b3420c0751925e56f1bb08a02a000000000000000000000000bd6b6f5b2e9527b3420c0751925e56f1bb08a02a000000000000000000000000000000000000000000000000005cfaf9e3c2a47c00000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,0x6549effe1390db13e7df687e15add3689d0f86ee58e4e96823c0788a993b417e,2022-07-24 14:26:08.000 UTC,0,true -15279,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec340000000000000000000000001308443df8ff1da25bcd1a1b898a56dd66144b050000000000000000000000001308443df8ff1da25bcd1a1b898a56dd66144b05000000000000000000000000000000000000000000000000000009184e72a00000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -15280,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0xa9f9e675000000000000000000000000dac17f958d2ee523a2206206994597c13d831ec700000000000000000000000094b008aa00579c1307b0ef2c499ad98a8ce58e580000000000000000000000003e957dd41f95c213b3b9b772472dddf7ed3b00960000000000000000000000003e957dd41f95c213b3b9b772472dddf7ed3b009600000000000000000000000000000000000000000000000000000000000f695000000000000000000000000000000000000000000000000000000000000000c00000000000000000000000000000000000000000000000000000000000000000,,,1,true -15281,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec340000000000000000000000006ae18450b90b7b6847b9f26787d6529746bb417e0000000000000000000000006ae18450b90b7b6847b9f26787d6529746bb417e000000000000000000000000000000000000000000000000000009184e72a00000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -15282,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec34000000000000000000000000f61efd9365cdbfd86c76827f90a1a9ad7b9ada52000000000000000000000000f61efd9365cdbfd86c76827f90a1a9ad7b9ada5200000000000000000000000000000000000000000000000000005af3107a400000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -15283,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec3400000000000000000000000039d4bd8f3347734c523a6775f7e4edd67baec5da00000000000000000000000039d4bd8f3347734c523a6775f7e4edd67baec5da00000000000000000000000000000000000000000000000000005af3107a400000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -15284,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec340000000000000000000000003a94b2a63a069a1fc3e1f730d684e7955f76d6750000000000000000000000003a94b2a63a069a1fc3e1f730d684e7955f76d67500000000000000000000000000000000000000000000000001f68e5744b98f8a00000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -15285,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec340000000000000000000000007c556added55593a7da07b340a381af1278851c30000000000000000000000007c556added55593a7da07b340a381af1278851c300000000000000000000000000000000000000000000000000005af3107a400000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -15286,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec340000000000000000000000006ec383945e14de368782d8e063e9ac179c39f3590000000000000000000000006ec383945e14de368782d8e063e9ac179c39f359000000000000000000000000000000000000000000000000000009184e72a00000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -15287,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec340000000000000000000000009622348f0a2268983c90dd4c37b5a900a23c83900000000000000000000000009622348f0a2268983c90dd4c37b5a900a23c8390000000000000000000000000000000000000000000000000000009184e72a00000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -15289,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec34000000000000000000000000ddee7dc3288f18bd0ed48255c95f730f146738b3000000000000000000000000ddee7dc3288f18bd0ed48255c95f730f146738b300000000000000000000000000000000000000000000000000005af3107a400000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -15290,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0xa9f9e675000000000000000000000000dac17f958d2ee523a2206206994597c13d831ec700000000000000000000000094b008aa00579c1307b0ef2c499ad98a8ce58e58000000000000000000000000607c3eb4ad13036078fe5e346c092195ac7ddf0c000000000000000000000000607c3eb4ad13036078fe5e346c092195ac7ddf0c00000000000000000000000000000000000000000000000000000000000f695000000000000000000000000000000000000000000000000000000000000000c00000000000000000000000000000000000000000000000000000000000000000,,,1,true -15291,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec34000000000000000000000000f333193872a0dbbf8ad7c82579626e4c6216d5e3000000000000000000000000f333193872a0dbbf8ad7c82579626e4c6216d5e300000000000000000000000000000000000000000000000000905a3731df5cd200000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -15292,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec3400000000000000000000000053b4b974261c61ce81e433461ba5cd96fee63db100000000000000000000000053b4b974261c61ce81e433461ba5cd96fee63db1000000000000000000000000000000000000000000000000000009184e72a00000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -15294,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec3400000000000000000000000008e89d60af020a59aca87767f7440386dbbf6c6300000000000000000000000008e89d60af020a59aca87767f7440386dbbf6c63000000000000000000000000000000000000000000000000000009184e72a00000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -15295,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec34000000000000000000000000dc29516f75bb6d8e7e76566062cd90f8c3087072000000000000000000000000dc29516f75bb6d8e7e76566062cd90f8c3087072000000000000000000000000000000000000000000000000010b0e2f6b90a4df00000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -15296,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec34000000000000000000000000c7492674a89623bb0ab5577b658817b89e2e20ca000000000000000000000000c7492674a89623bb0ab5577b658817b89e2e20ca00000000000000000000000000000000000000000000000000005af3107a400000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -15297,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec340000000000000000000000009f0e8a28fb6d062c275dd20371c28e741aac880b0000000000000000000000009f0e8a28fb6d062c275dd20371c28e741aac880b000000000000000000000000000000000000000000000000000009184e72a00000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -15298,0xcd9d4988c0ae61887b075ba77f08cbfad2b65068,0x3f87ff1de58128ef8fcb4c807efd776e1ac72e51,0xf4f7b41a00000000000000000000000035c8bf626c7cd9d8604dbdb6fca693471e5dbb0b0000000000000000000000000000000000000000000000033633b826da50c000,,,1,true -15299,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec3400000000000000000000000094fdcf186e122ba9a507c58394a5295402d2dfd000000000000000000000000094fdcf186e122ba9a507c58394a5295402d2dfd000000000000000000000000000000000000000000000000000005af3107a400000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -15300,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec3400000000000000000000000035c8bf626c7cd9d8604dbdb6fca693471e5dbb0b00000000000000000000000035c8bf626c7cd9d8604dbdb6fca693471e5dbb0b00000000000000000000000000000000000000000000000000fe2ee4620dcf4000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -15301,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec34000000000000000000000000c0bd89eaa63dd244ae1d2bcced93d58d72d6d961000000000000000000000000c0bd89eaa63dd244ae1d2bcced93d58d72d6d961000000000000000000000000000000000000000000000000000009184e72a00000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -15302,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec34000000000000000000000000f4520d07cea9c1915b94c1d2b788256153ecfe27000000000000000000000000f4520d07cea9c1915b94c1d2b788256153ecfe27000000000000000000000000000000000000000000000000000009184e72a00000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -15303,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec34000000000000000000000000c014d4024ecf998456b226e38a7607991f1aac72000000000000000000000000c014d4024ecf998456b226e38a7607991f1aac7200000000000000000000000000000000000000000000000000005af3107a400000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -15304,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec34000000000000000000000000b80914f7918df483d216198d7e2fb8d4e14af408000000000000000000000000b80914f7918df483d216198d7e2fb8d4e14af40800000000000000000000000000000000000000000000000000005af3107a400000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -15305,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec34000000000000000000000000d24f83d0eac36cd83eed870f520b1c3caa5d2b07000000000000000000000000d24f83d0eac36cd83eed870f520b1c3caa5d2b0700000000000000000000000000000000000000000000000000000cbba106e00000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -15310,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0xa9f9e675000000000000000000000000dac17f958d2ee523a2206206994597c13d831ec700000000000000000000000094b008aa00579c1307b0ef2c499ad98a8ce58e5800000000000000000000000058e2d39109fa3a452b229fc03cf9d3b61324cbcd00000000000000000000000058e2d39109fa3a452b229fc03cf9d3b61324cbcd00000000000000000000000000000000000000000000000000000000000f424000000000000000000000000000000000000000000000000000000000000000c00000000000000000000000000000000000000000000000000000000000000000,,,1,true -15311,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0xa9f9e675000000000000000000000000dac17f958d2ee523a2206206994597c13d831ec700000000000000000000000094b008aa00579c1307b0ef2c499ad98a8ce58e5800000000000000000000000039ca2a2d5854c613fb1b3f8208e4f241942587b000000000000000000000000039ca2a2d5854c613fb1b3f8208e4f241942587b0000000000000000000000000000000000000000000000000000000000314e2a900000000000000000000000000000000000000000000000000000000000000c00000000000000000000000000000000000000000000000000000000000000000,,,1,true -15312,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec34000000000000000000000000c84ab5000d34a853231d6ce90a28431106f4ca55000000000000000000000000c84ab5000d34a853231d6ce90a28431106f4ca55000000000000000000000000000000000000000000000000007fe5cf2bea000000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -15313,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec3400000000000000000000000069a263804bc8ea966095ea21aea58b9ea6bf52a700000000000000000000000069a263804bc8ea966095ea21aea58b9ea6bf52a7000000000000000000000000000000000000000000000000000ef3528bc8a70000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -15315,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec34000000000000000000000000e3f1abd4fc3435c452b6267c407ec535800b52f0000000000000000000000000e3f1abd4fc3435c452b6267c407ec535800b52f00000000000000000000000000000000000000000000000000026ff85c3b8a9b400000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -15316,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec34000000000000000000000000122c85f702c56dda52c951f1d855652150a1e067000000000000000000000000122c85f702c56dda52c951f1d855652150a1e067000000000000000000000000000000000000000000000000001f157551dfaac000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -15317,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec340000000000000000000000004fa4c5ac56045630bf0c75b42ca8259fda61effe0000000000000000000000004fa4c5ac56045630bf0c75b42ca8259fda61effe0000000000000000000000000000000000000000000000000044e7809f5fa40000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -15318,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0xa9f9e675000000000000000000000000dac17f958d2ee523a2206206994597c13d831ec700000000000000000000000094b008aa00579c1307b0ef2c499ad98a8ce58e580000000000000000000000007345344510b1104514666a6f4c0aa85ff8f556360000000000000000000000007345344510b1104514666a6f4c0aa85ff8f5563600000000000000000000000000000000000000000000000000000000000f695000000000000000000000000000000000000000000000000000000000000000c00000000000000000000000000000000000000000000000000000000000000000,,,1,true -15319,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec340000000000000000000000002dee84d469ea2c8bb4af371ecdc95a71a77322a40000000000000000000000002dee84d469ea2c8bb4af371ecdc95a71a77322a40000000000000000000000000000000000000000000000000011c37937e0800000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -15322,0xcd9d4988c0ae61887b075ba77f08cbfad2b65068,0x3f87ff1de58128ef8fcb4c807efd776e1ac72e51,0xf4f7b41a0000000000000000000000000b173b9014a0a36aac51ee4957bc8c7e20686d3f0000000000000000000000000000000000000000000000005998fce1a86ecd1b,,,1,true -15323,0xcd9d4988c0ae61887b075ba77f08cbfad2b65068,0x3f87ff1de58128ef8fcb4c807efd776e1ac72e51,0xf4f7b41a000000000000000000000000ad0e907a3f3c517acbfd9054b43f743e4edbbe9500000000000000000000000000000000000000000000000ef644f9b077d00000,0xcdd420b678eb08cee4c6b481b887daa19d4d870142bcb2d0cdf6d4b29f91bf34,2021-11-30 00:28:36.000 UTC,0,true -15325,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec34000000000000000000000000122c85f702c56dda52c951f1d855652150a1e067000000000000000000000000122c85f702c56dda52c951f1d855652150a1e06700000000000000000000000000000000000000000000000000464a9e5e85a65d00000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -15332,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec34000000000000000000000000a708b4d523dca59b28b47e79851a5ca52f9dd78a000000000000000000000000a708b4d523dca59b28b47e79851a5ca52f9dd78a0000000000000000000000000000000000000000000000000001c6bf5263400000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -15335,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0xa9f9e675000000000000000000000000dac17f958d2ee523a2206206994597c13d831ec700000000000000000000000094b008aa00579c1307b0ef2c499ad98a8ce58e58000000000000000000000000895c5aa8f7abd95f5b152bb5c7f2052972013fa1000000000000000000000000895c5aa8f7abd95f5b152bb5c7f2052972013fa10000000000000000000000000000000000000000000000000000000002f98f6100000000000000000000000000000000000000000000000000000000000000c00000000000000000000000000000000000000000000000000000000000000000,,,1,true -15343,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec340000000000000000000000005e4b293c7fda80b545561ec599bd7de5208901fe0000000000000000000000005e4b293c7fda80b545561ec599bd7de5208901fe000000000000000000000000000000000000000000000000015bd15ba65dec8000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -15344,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec340000000000000000000000005a269a9cc18d1fb05ffd567e3b1f6e8bf2d841530000000000000000000000005a269a9cc18d1fb05ffd567e3b1f6e8bf2d841530000000000000000000000000000000000000000000000000020910a61d8320000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -15345,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec340000000000000000000000007c74619e359640019b1c9f53d95ad3489f8b0da60000000000000000000000007c74619e359640019b1c9f53d95ad3489f8b0da600000000000000000000000000000000000000000000000000009836e524090000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -15346,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec34000000000000000000000000ac844070b40db6042b99e206b4ed1dbdb5fa676d000000000000000000000000ac844070b40db6042b99e206b4ed1dbdb5fa676d000000000000000000000000000000000000000000000000001f83b7fd6c090000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -15347,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec3400000000000000000000000066e623994cd56fd05f6ec18f82110a8b6535819d00000000000000000000000066e623994cd56fd05f6ec18f82110a8b6535819d000000000000000000000000000000000000000000000000000ee9159a39984000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -15349,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec340000000000000000000000002f3111165ef850b11f50a5f45074e7becca7cbfd0000000000000000000000002f3111165ef850b11f50a5f45074e7becca7cbfd000000000000000000000000000000000000000000000000000d45786189040000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -15350,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec34000000000000000000000000eacc381ed43f477e8d74be5f3d87f583db82c89d000000000000000000000000eacc381ed43f477e8d74be5f3d87f583db82c89d000000000000000000000000000000000000000000000000000d40b74241310000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -15351,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec34000000000000000000000000d10248ef4907d54f012af7b2f8ddc2edd611adae000000000000000000000000d10248ef4907d54f012af7b2f8ddc2edd611adae000000000000000000000000000000000000000000000000000d40b74241310000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -15352,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec34000000000000000000000000bca10a7a49d1f56a92a541b91858abf7821f0a10000000000000000000000000bca10a7a49d1f56a92a541b91858abf7821f0a10000000000000000000000000000000000000000000000000000e94cb4b07710000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -15353,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec3400000000000000000000000043e7f3e1583216053f8bdbe300738d46f2dcd71800000000000000000000000043e7f3e1583216053f8bdbe300738d46f2dcd718000000000000000000000000000000000000000000000000000e81c6cde8250000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -15354,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec34000000000000000000000000f3aeedd405726b61bfc4c099309b237549b6d78f000000000000000000000000f3aeedd405726b61bfc4c099309b237549b6d78f000000000000000000000000000000000000000000000000000e81c6cde8250000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -15355,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec34000000000000000000000000f3aeedd405726b61bfc4c099309b237549b6d78f000000000000000000000000f3aeedd405726b61bfc4c099309b237549b6d78f00000000000000000000000000000000000000000000000000909a26d1c3334000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -15356,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec34000000000000000000000000eb9ef9eea95a4492e3f05973a08c75093d673dc5000000000000000000000000eb9ef9eea95a4492e3f05973a08c75093d673dc5000000000000000000000000000000000000000000000000001cd715640c076f00000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -15359,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec34000000000000000000000000a4a86fdfb80071d28f385bdc7b7a04811ef4c5eb000000000000000000000000a4a86fdfb80071d28f385bdc7b7a04811ef4c5eb0000000000000000000000000000000000000000000000000017550b48febb8000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -15364,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0xa9f9e675000000000000000000000000a0b86991c6218b36c1d19d4a2e9eb0ce3606eb480000000000000000000000007f5c764cbc14f9669b88837ca1490cca17c316070000000000000000000000000dcea91eb1418949cb112d733fc6c3603829e4d30000000000000000000000000dcea91eb1418949cb112d733fc6c3603829e4d300000000000000000000000000000000000000000000000000000000011b480a00000000000000000000000000000000000000000000000000000000000000c00000000000000000000000000000000000000000000000000000000000000000,,,1,true -15365,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec34000000000000000000000000729aefa54c7825f89c155683a133d60e7167e528000000000000000000000000729aefa54c7825f89c155683a133d60e7167e52800000000000000000000000000000000000000000000000000a87991d1a7208000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -15367,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec34000000000000000000000000cc29d61e6915b42f7c46465dfc854d63218a5d1a000000000000000000000000cc29d61e6915b42f7c46465dfc854d63218a5d1a00000000000000000000000000000000000000000000000000403fb64baae07c00000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -15368,0xcd9d4988c0ae61887b075ba77f08cbfad2b65068,0x3f87ff1de58128ef8fcb4c807efd776e1ac72e51,0xf4f7b41a000000000000000000000000a732b8f964eda419441e969e7a49392360e860f70000000000000000000000000000000000000000000000000cf1a3f4e4b748ee,,,1,true -15369,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec3400000000000000000000000054e6e074299b4b32ab7dcbe44952677fccca10f200000000000000000000000054e6e074299b4b32ab7dcbe44952677fccca10f200000000000000000000000000000000000000000000000001b262753631cbcd00000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,0xee9ad62e398258937bd32d66faea8869f870f9ef4ed89d5bd2ec03dc09f3a156,2021-12-13 06:44:40.000 UTC,0,true -15372,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec3400000000000000000000000046ced0e736cdbb8d467b56df1dea1edf7544495800000000000000000000000046ced0e736cdbb8d467b56df1dea1edf7544495800000000000000000000000000000000000000000000000001914a39af30436300000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,0xc0b360c8a277a0ed6bc115905983679f68238de71d51593f8e8a8d46636a7a90,2021-12-13 06:57:36.000 UTC,0,true -15374,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec34000000000000000000000000d7518d58aa2a0c05ee28e4589e9ba58165de2df5000000000000000000000000d7518d58aa2a0c05ee28e4589e9ba58165de2df50000000000000000000000000000000000000000000000000c7d713b49da000000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,0xfcc8e39964c3aad6ec6cffba797cca3fdf03901c916b9c8b43683ec8f064fa64,2022-01-17 13:27:45.000 UTC,0,true -15375,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec34000000000000000000000000b573b0781ebbff1301e26dfb15edd774f8f4cb85000000000000000000000000b573b0781ebbff1301e26dfb15edd774f8f4cb8500000000000000000000000000000000000000000000000000038d7ea4c6800000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -15377,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec34000000000000000000000000d3b5b2b7c2e97331a606466e88cda86e359e1f61000000000000000000000000d3b5b2b7c2e97331a606466e88cda86e359e1f6100000000000000000000000000000000000000000000000000176b8103bcc08000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -15383,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec34000000000000000000000000e6436d5c2b8a02cfdb853607418adc44eec38876000000000000000000000000e6436d5c2b8a02cfdb853607418adc44eec38876000000000000000000000000000000000000000000000000012927994b97cfd100000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -15384,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec34000000000000000000000000245a4887c7ca101419d629e447f2de60d8861de4000000000000000000000000245a4887c7ca101419d629e447f2de60d8861de400000000000000000000000000000000000000000000000000005af3107a400000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -15386,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec34000000000000000000000000d1c805676244085838262806ffb92b21421e5b8d000000000000000000000000d1c805676244085838262806ffb92b21421e5b8d00000000000000000000000000000000000000000000000000f8b0a10e47000000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -15387,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec3400000000000000000000000059e175bcb48a316b91bdbbaae8cd0758b8a7259500000000000000000000000059e175bcb48a316b91bdbbaae8cd0758b8a7259500000000000000000000000000000000000000000000000000006a439063453300000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -15388,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec3400000000000000000000000065240476b113ee6ea1325b3ebe47d21acfa037f700000000000000000000000065240476b113ee6ea1325b3ebe47d21acfa037f700000000000000000000000000000000000000000000000006df2da4bfb17e5e00000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -15390,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec34000000000000000000000000f4f80a0d2434fe62bae26627fe4c228c0723f0b2000000000000000000000000f4f80a0d2434fe62bae26627fe4c228c0723f0b200000000000000000000000000000000000000000000000006c7615549cfc0ca00000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -15391,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec34000000000000000000000000566bee2e257a1a606cb7632486f77d8b8b7be075000000000000000000000000566bee2e257a1a606cb7632486f77d8b8b7be075000000000000000000000000000000000000000000000000000287834ea7524800000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -15392,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec34000000000000000000000000cf9f99c643b28daec98de3f70a4b84c271c2b404000000000000000000000000cf9f99c643b28daec98de3f70a4b84c271c2b404000000000000000000000000000000000000000000000000006674e8fdee25d200000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,0xd786d10d0a2e7257ca750317b5fac5ba6b7185cc8aa99bf3ff7ef94a9b635c0e,2022-04-27 10:03:45.000 UTC,0,true -15393,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec340000000000000000000000002835720be787d30b58aa7c56aea19c1e3053e10b0000000000000000000000002835720be787d30b58aa7c56aea19c1e3053e10b000000000000000000000000000000000000000000000000000032c09176e4a200000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -15394,0xcd9d4988c0ae61887b075ba77f08cbfad2b65068,0x3f87ff1de58128ef8fcb4c807efd776e1ac72e51,0xf4f7b41a000000000000000000000000431e4b84e3b8a739af3394c3a4463e62a8c721c100000000000000000000000000000000000000000000001d89e11e88b65afb4f,0x023479b94b7eebcb8c1b8e2da3447695bca0b1d0f5d720368e05914f53ace59c,2021-11-22 09:56:35.000 UTC,0,true -15395,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec34000000000000000000000000d1490a127021f5dbeeb92a4156179a93679c76b6000000000000000000000000d1490a127021f5dbeeb92a4156179a93679c76b600000000000000000000000000000000000000000000000005801a3f2da94b3100000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,0x7e6214e3dec588af0a92f68f86b55540c5dec5c2f15ae23be2b64953d574c638,2022-01-19 08:35:44.000 UTC,0,true -15398,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec34000000000000000000000000f98fafa9f99a0e493e4220841a71c7475f5dee76000000000000000000000000f98fafa9f99a0e493e4220841a71c7475f5dee760000000000000000000000000000000000000000000000000017b9d4d0d2660000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -15399,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec3400000000000000000000000076e2c6d6f961168dd892516438ec807933d0941f00000000000000000000000076e2c6d6f961168dd892516438ec807933d0941f0000000000000000000000000000000000000000000000000042db1dd805406f00000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,0x95c3fedec2a0df0305d727e5c9671e74a2a21e7366bd947bd076c2867bc0454f,2021-11-27 22:03:17.000 UTC,0,true -15400,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec340000000000000000000000006777fca2ffb7376a6df2844bf684e48250a9ce0e0000000000000000000000006777fca2ffb7376a6df2844bf684e48250a9ce0e00000000000000000000000000000000000000000000000000ae37a5a56a690000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -15406,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec34000000000000000000000000e56d4397e492a5ce2867e30c5547f312c1c25f56000000000000000000000000e56d4397e492a5ce2867e30c5547f312c1c25f5600000000000000000000000000000000000000000000000000215a0028e0dfa500000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -15407,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec340000000000000000000000001a1423a1c631711dd2f64b887bceff09917e3ad50000000000000000000000001a1423a1c631711dd2f64b887bceff09917e3ad5000000000000000000000000000000000000000000000000000654c932203d6a00000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -15408,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec340000000000000000000000005ad68d0af76006c762edfe72aa49b8b088d26f1e0000000000000000000000005ad68d0af76006c762edfe72aa49b8b088d26f1e000000000000000000000000000000000000000000000000000e86a947e29f9700000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,0x50f92acb95d3986dd4944d2f5dd64233022bbf4dd0c0fbeed35e4f6c6347df9d,2022-05-28 22:44:03.000 UTC,0,true -15413,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec34000000000000000000000000c114b578dab1e6417afdf3f94f6bd4ced508d392000000000000000000000000c114b578dab1e6417afdf3f94f6bd4ced508d392000000000000000000000000000000000000000000000000002e2f6e5e14800000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -15414,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec34000000000000000000000000303308d5f4fef62ce6c246f00b886a2420a5bc0f000000000000000000000000303308d5f4fef62ce6c246f00b886a2420a5bc0f000000000000000000000000000000000000000000000000002c6b91062aaec300000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -15415,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec340000000000000000000000005a2566b9a398958590b39b9a9013383a71a73a2a0000000000000000000000005a2566b9a398958590b39b9a9013383a71a73a2a00000000000000000000000000000000000000000000000000049e57d635400000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -15416,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec3400000000000000000000000033e0f6b6c246fa636fd250a4af6166b83fa8a7e200000000000000000000000033e0f6b6c246fa636fd250a4af6166b83fa8a7e20000000000000000000000000000000000000000000000000000223d9d92e80000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -15417,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec34000000000000000000000000b9f34a609b6fbc2954d960feb88252a35d0c5c44000000000000000000000000b9f34a609b6fbc2954d960feb88252a35d0c5c440000000000000000000000000000000000000000000000000000ff84259fde0000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -15418,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec34000000000000000000000000b6118f12ef110c9c2c3168f08787af5d569cc62c000000000000000000000000b6118f12ef110c9c2c3168f08787af5d569cc62c000000000000000000000000000000000000000000000000002386f26fc1000000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -15419,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec3400000000000000000000000001687491cb797f011790f349cbf8969dad49fcd300000000000000000000000001687491cb797f011790f349cbf8969dad49fcd3000000000000000000000000000000000000000000000000001d55cf064e604000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -15420,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec340000000000000000000000000374098e411a4aaf574ca9080512125764df217d0000000000000000000000000374098e411a4aaf574ca9080512125764df217d0000000000000000000000000000000000000000000000000001c91b0f23920000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -15421,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec34000000000000000000000000dfc24a11ba5ce6be386444c46b79308189e991cb000000000000000000000000dfc24a11ba5ce6be386444c46b79308189e991cb0000000000000000000000000000000000000000000000000001ddcd1ed4b00000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -15422,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec34000000000000000000000000e12598b84a6e5e2436e268d403f2f79d1af23807000000000000000000000000e12598b84a6e5e2436e268d403f2f79d1af238070000000000000000000000000000000000000000000000000332555df265d71500000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,0x71b63083278921c32fb30f4ede37688b95df8c7af8df6ba89f6ea27b7d47931c,2021-12-11 09:53:04.000 UTC,0,true -15427,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0xa9f9e675000000000000000000000000a0b86991c6218b36c1d19d4a2e9eb0ce3606eb480000000000000000000000007f5c764cbc14f9669b88837ca1490cca17c31607000000000000000000000000c1a1c3bed7bff1418487b6af7f3fb9e13fc51969000000000000000000000000c1a1c3bed7bff1418487b6af7f3fb9e13fc519690000000000000000000000000000000000000000000000000000000000b5946000000000000000000000000000000000000000000000000000000000000000c00000000000000000000000000000000000000000000000000000000000000000,,,1,true -15428,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0xa9f9e675000000000000000000000000a0b86991c6218b36c1d19d4a2e9eb0ce3606eb480000000000000000000000007f5c764cbc14f9669b88837ca1490cca17c31607000000000000000000000000c1a1c3bed7bff1418487b6af7f3fb9e13fc51969000000000000000000000000c1a1c3bed7bff1418487b6af7f3fb9e13fc519690000000000000000000000000000000000000000000000000000000000b5c5b100000000000000000000000000000000000000000000000000000000000000c00000000000000000000000000000000000000000000000000000000000000000,,,1,true -15429,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec34000000000000000000000000c4ef68733ce0bbac45f02c2b183c9ce7c21843dd000000000000000000000000c4ef68733ce0bbac45f02c2b183c9ce7c21843dd000000000000000000000000000000000000000000000000005e1edc5305d4ea00000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -15431,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0xa9f9e675000000000000000000000000a0b86991c6218b36c1d19d4a2e9eb0ce3606eb480000000000000000000000007f5c764cbc14f9669b88837ca1490cca17c31607000000000000000000000000c1a1c3bed7bff1418487b6af7f3fb9e13fc51969000000000000000000000000c1a1c3bed7bff1418487b6af7f3fb9e13fc519690000000000000000000000000000000000000000000000000000000000c6006300000000000000000000000000000000000000000000000000000000000000c00000000000000000000000000000000000000000000000000000000000000000,,,1,true -15432,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0xa9f9e675000000000000000000000000a0b86991c6218b36c1d19d4a2e9eb0ce3606eb480000000000000000000000007f5c764cbc14f9669b88837ca1490cca17c31607000000000000000000000000c1a1c3bed7bff1418487b6af7f3fb9e13fc51969000000000000000000000000c1a1c3bed7bff1418487b6af7f3fb9e13fc519690000000000000000000000000000000000000000000000000000000000bbe60f00000000000000000000000000000000000000000000000000000000000000c00000000000000000000000000000000000000000000000000000000000000000,,,1,true -15433,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0xa9f9e675000000000000000000000000a0b86991c6218b36c1d19d4a2e9eb0ce3606eb480000000000000000000000007f5c764cbc14f9669b88837ca1490cca17c316070000000000000000000000008360cd7c6d87f9f4ad9434dd94b836c0ca61c8530000000000000000000000008360cd7c6d87f9f4ad9434dd94b836c0ca61c85300000000000000000000000000000000000000000000000000000000199f45bf00000000000000000000000000000000000000000000000000000000000000c00000000000000000000000000000000000000000000000000000000000000000,,,1,true -15434,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec3400000000000000000000000061fac34ed5aba1edc80e1267e830270401bcc89000000000000000000000000061fac34ed5aba1edc80e1267e830270401bcc8900000000000000000000000000000000000000000000000000001c6bf5263400000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -15435,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec340000000000000000000000008360cd7c6d87f9f4ad9434dd94b836c0ca61c8530000000000000000000000008360cd7c6d87f9f4ad9434dd94b836c0ca61c853000000000000000000000000000000000000000000000000001bb6282e8b0ec000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -15436,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec340000000000000000000000008e62556766debc521c4f745846d275578b7947400000000000000000000000008e62556766debc521c4f745846d275578b7947400000000000000000000000000000000000000000000000000181ed1f85e8911100000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -15437,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec34000000000000000000000000ae416e324029acb10367349234c13edf44b0ddfd000000000000000000000000ae416e324029acb10367349234c13edf44b0ddfd00000000000000000000000000000000000000000000000002b075761a6f4a5800000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -15438,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec34000000000000000000000000f4c458f31f1cd636c221e7e5d6e2f9d3105e4b17000000000000000000000000f4c458f31f1cd636c221e7e5d6e2f9d3105e4b1700000000000000000000000000000000000000000000000000770a91ac13adca00000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -15439,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0xa9f9e675000000000000000000000000dac17f958d2ee523a2206206994597c13d831ec700000000000000000000000094b008aa00579c1307b0ef2c499ad98a8ce58e580000000000000000000000007532551bed089a581d17618abb0286b6a93d7e8c0000000000000000000000007532551bed089a581d17618abb0286b6a93d7e8c00000000000000000000000000000000000000000000000000000000000f695000000000000000000000000000000000000000000000000000000000000000c00000000000000000000000000000000000000000000000000000000000000000,,,1,true -15440,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec34000000000000000000000000dd713a96cb3d6f1454ec644e8b017b419a0aa1c6000000000000000000000000dd713a96cb3d6f1454ec644e8b017b419a0aa1c600000000000000000000000000000000000000000000000000ac6c265dc5480000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -15441,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0xa9f9e675000000000000000000000000a0b86991c6218b36c1d19d4a2e9eb0ce3606eb480000000000000000000000007f5c764cbc14f9669b88837ca1490cca17c31607000000000000000000000000e8b8c88c0c2757f03679e2ef1b43a3ff2e021962000000000000000000000000e8b8c88c0c2757f03679e2ef1b43a3ff2e021962000000000000000000000000000000000000000000000000000000000187a3e500000000000000000000000000000000000000000000000000000000000000c00000000000000000000000000000000000000000000000000000000000000000,,,1,true -15442,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0xa9f9e675000000000000000000000000a0b86991c6218b36c1d19d4a2e9eb0ce3606eb480000000000000000000000007f5c764cbc14f9669b88837ca1490cca17c31607000000000000000000000000e8b8c88c0c2757f03679e2ef1b43a3ff2e021962000000000000000000000000e8b8c88c0c2757f03679e2ef1b43a3ff2e021962000000000000000000000000000000000000000000000000000000000a8a661700000000000000000000000000000000000000000000000000000000000000c00000000000000000000000000000000000000000000000000000000000000000,,,1,true -15443,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec34000000000000000000000000901f007510f776c978cce30df4a59b49e11650c6000000000000000000000000901f007510f776c978cce30df4a59b49e11650c6000000000000000000000000000000000000000000000000005c543dfaa1660000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -15444,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0xa9f9e675000000000000000000000000a0b86991c6218b36c1d19d4a2e9eb0ce3606eb480000000000000000000000007f5c764cbc14f9669b88837ca1490cca17c31607000000000000000000000000e8b8c88c0c2757f03679e2ef1b43a3ff2e021962000000000000000000000000e8b8c88c0c2757f03679e2ef1b43a3ff2e0219620000000000000000000000000000000000000000000000000000000000bc4e3700000000000000000000000000000000000000000000000000000000000000c00000000000000000000000000000000000000000000000000000000000000000,,,1,true -15446,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0xa9f9e675000000000000000000000000dac17f958d2ee523a2206206994597c13d831ec700000000000000000000000094b008aa00579c1307b0ef2c499ad98a8ce58e58000000000000000000000000e35e4a4b3db623f5997065068c0eefc6da752b19000000000000000000000000e35e4a4b3db623f5997065068c0eefc6da752b1900000000000000000000000000000000000000000000000000000000000f424000000000000000000000000000000000000000000000000000000000000000c00000000000000000000000000000000000000000000000000000000000000000,,,1,true -15447,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec3400000000000000000000000079d2f1e855ecbff1e3d24aa2d05bc8bab2dd7b7000000000000000000000000079d2f1e855ecbff1e3d24aa2d05bc8bab2dd7b70000000000000000000000000000000000000000000000000002da05de16ca93500000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -15448,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0xa9f9e675000000000000000000000000a0b86991c6218b36c1d19d4a2e9eb0ce3606eb480000000000000000000000007f5c764cbc14f9669b88837ca1490cca17c31607000000000000000000000000ecf67f602c23698ee680914271e900175a65a403000000000000000000000000ecf67f602c23698ee680914271e900175a65a4030000000000000000000000000000000000000000000000000000000000cfad0600000000000000000000000000000000000000000000000000000000000000c00000000000000000000000000000000000000000000000000000000000000000,,,1,true -15450,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0xa9f9e675000000000000000000000000dac17f958d2ee523a2206206994597c13d831ec700000000000000000000000094b008aa00579c1307b0ef2c499ad98a8ce58e580000000000000000000000009aa6d4697057fa85023930c2062410d38adc407d0000000000000000000000009aa6d4697057fa85023930c2062410d38adc407d0000000000000000000000000000000000000000000000000000000002254abf00000000000000000000000000000000000000000000000000000000000000c00000000000000000000000000000000000000000000000000000000000000000,,,1,true -15451,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec34000000000000000000000000b985fc8f4012a2df292da9aa323967b98c289faf000000000000000000000000b985fc8f4012a2df292da9aa323967b98c289faf000000000000000000000000000000000000000000000000001faf0bfd19092f00000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -15452,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0xa9f9e675000000000000000000000000a0b86991c6218b36c1d19d4a2e9eb0ce3606eb480000000000000000000000007f5c764cbc14f9669b88837ca1490cca17c31607000000000000000000000000d20574d9739f084b67b8a2ad0cebf670284d1c4b000000000000000000000000d20574d9739f084b67b8a2ad0cebf670284d1c4b000000000000000000000000000000000000000000000000000000000113221800000000000000000000000000000000000000000000000000000000000000c00000000000000000000000000000000000000000000000000000000000000000,,,1,true -15453,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0xa9f9e675000000000000000000000000a0b86991c6218b36c1d19d4a2e9eb0ce3606eb480000000000000000000000007f5c764cbc14f9669b88837ca1490cca17c31607000000000000000000000000ecf67f602c23698ee680914271e900175a65a403000000000000000000000000ecf67f602c23698ee680914271e900175a65a4030000000000000000000000000000000000000000000000000000000000b6211d00000000000000000000000000000000000000000000000000000000000000c00000000000000000000000000000000000000000000000000000000000000000,,,1,true -15454,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0xa9f9e675000000000000000000000000a0b86991c6218b36c1d19d4a2e9eb0ce3606eb480000000000000000000000007f5c764cbc14f9669b88837ca1490cca17c31607000000000000000000000000ecf67f602c23698ee680914271e900175a65a403000000000000000000000000ecf67f602c23698ee680914271e900175a65a4030000000000000000000000000000000000000000000000000000000000d6cb8300000000000000000000000000000000000000000000000000000000000000c00000000000000000000000000000000000000000000000000000000000000000,,,1,true -15456,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec340000000000000000000000005eb81691fd7505b796241dcf2f62231928d8f6ec0000000000000000000000005eb81691fd7505b796241dcf2f62231928d8f6ec0000000000000000000000000000000000000000000000000305a7e543d158cd00000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -15462,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec34000000000000000000000000f3c21b5d95f52635fab1d0c2a6b84c4f6924e54f000000000000000000000000f3c21b5d95f52635fab1d0c2a6b84c4f6924e54f0000000000000000000000000000000000000000000000000019defba741528000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -15463,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0xa9f9e675000000000000000000000000dac17f958d2ee523a2206206994597c13d831ec700000000000000000000000094b008aa00579c1307b0ef2c499ad98a8ce58e580000000000000000000000006d8fea199019d796c848ae1d67fc781f61aef1de0000000000000000000000006d8fea199019d796c848ae1d67fc781f61aef1de00000000000000000000000000000000000000000000000000000000000f695000000000000000000000000000000000000000000000000000000000000000c00000000000000000000000000000000000000000000000000000000000000000,,,1,true -15464,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec340000000000000000000000005a3533bc8606bcdaaa0a2ac6e8b5d81c9c6349940000000000000000000000005a3533bc8606bcdaaa0a2ac6e8b5d81c9c63499400000000000000000000000000000000000000000000000000071afd498d000000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -15465,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec340000000000000000000000009b2855918fff918739d96b1d930b1b3e3a0a95000000000000000000000000009b2855918fff918739d96b1d930b1b3e3a0a950000000000000000000000000000000000000000000000000000049e57d635400000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -15466,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec3400000000000000000000000098e640296317a9f5ab7078ebeb7e685da030a19a00000000000000000000000098e640296317a9f5ab7078ebeb7e685da030a19a00000000000000000000000000000000000000000000000000044364c5bb000000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -15467,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec34000000000000000000000000ebe4cdef0ccc5c84ab5259501e8ede675ee7cae2000000000000000000000000ebe4cdef0ccc5c84ab5259501e8ede675ee7cae200000000000000000000000000000000000000000000000003ed4e6d5a5ef86a00000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -15468,0xcd9d4988c0ae61887b075ba77f08cbfad2b65068,0x3f87ff1de58128ef8fcb4c807efd776e1ac72e51,0xf4f7b41a00000000000000000000000063389e216b926ec5f705d47028765c35c89825be0000000000000000000000000000000000000000000000004563918244f40000,,,1,true -15469,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec34000000000000000000000000c308b8857c2621685fbd9f762bea9fdb8bad1fc6000000000000000000000000c308b8857c2621685fbd9f762bea9fdb8bad1fc6000000000000000000000000000000000000000000000000001a85f051976a8000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -15470,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec340000000000000000000000000aa4ddacb7a5bf7613c10404dab72523569e77860000000000000000000000000aa4ddacb7a5bf7613c10404dab72523569e77860000000000000000000000000000000000000000000000000016800d4dde9f4000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -15484,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec34000000000000000000000000d23b036e1e0227631c76aa74b97b1e539661c9d1000000000000000000000000d23b036e1e0227631c76aa74b97b1e539661c9d1000000000000000000000000000000000000000000000000001ff973cafa800000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -15486,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec34000000000000000000000000e8b8c88c0c2757f03679e2ef1b43a3ff2e021962000000000000000000000000e8b8c88c0c2757f03679e2ef1b43a3ff2e02196200000000000000000000000000000000000000000000000000a7ccba815cb74000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -15487,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec34000000000000000000000000a928c403af1993eb309451a3559f8946e7d81f7f000000000000000000000000a928c403af1993eb309451a3559f8946e7d81f7f00000000000000000000000000000000000000000000000006d96b07d16e8a9e00000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -15491,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec34000000000000000000000000c33cf53b8e2b70a101ede8b334169dbf6e9a4ff3000000000000000000000000c33cf53b8e2b70a101ede8b334169dbf6e9a4ff3000000000000000000000000000000000000000000000000013d695097163b1500000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -15492,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec34000000000000000000000000fa27bcb140e9e2b64d7a54d77b7194052b330311000000000000000000000000fa27bcb140e9e2b64d7a54d77b7194052b33031100000000000000000000000000000000000000000000000003121c0638ace06f00000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -15494,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec34000000000000000000000000f3140bdbc0c880c3ee641ad72cf445d354a59012000000000000000000000000f3140bdbc0c880c3ee641ad72cf445d354a590120000000000000000000000000000000000000000000000000247fe25b1314fa700000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,0x9de017b537f3eaa0c360328ffd2f73b8bff5e3fc342aefdcd72af50f61d27a76,2022-06-01 12:25:28.000 UTC,0,true -15495,0xcd9d4988c0ae61887b075ba77f08cbfad2b65068,0x3f87ff1de58128ef8fcb4c807efd776e1ac72e51,0xf4f7b41a0000000000000000000000008e7488075d58158083330e9f37db55056b5edb330000000000000000000000000000000000000000000000000de0b6b3a7640000,0x9fc9c127408408704529378d2b7b40ea0f214244c41465dee757c2600e75ae90,2022-03-10 11:49:57.000 UTC,0,true -15497,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec340000000000000000000000002b9e03299d9449d3add284a1c13ab2566e876d640000000000000000000000002b9e03299d9449d3add284a1c13ab2566e876d64000000000000000000000000000000000000000000000000036ddc7ce2074ad100000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,0x2baab833765c964b6caddc27b84dbca79f9028e63a2d9fd3e0a6a4ff39372b78,2021-12-04 12:27:52.000 UTC,0,true -15500,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec34000000000000000000000000da263667e51f7bdd638abf6d9f67d7327745363d000000000000000000000000da263667e51f7bdd638abf6d9f67d7327745363d000000000000000000000000000000000000000000000000002386f26fc1000000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -15501,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec340000000000000000000000000c2f1004ad19f2ff281de8015c39a23702fc523f0000000000000000000000000c2f1004ad19f2ff281de8015c39a23702fc523f0000000000000000000000000000000000000000000000000b774bdb944a9c7000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,0x547805a689d5c4da7968db7ebc0c341f3eda99864aab28daacac2af5366ac42d,2022-03-26 13:07:54.000 UTC,0,true -15502,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0xa9f9e675000000000000000000000000514910771af9ca656af840dff83e8264ecf986ca000000000000000000000000350a791bfc2c21f9ed5d10980dad2e2638ffa7f600000000000000000000000084c567a704ba44a9166ddbd0cd73c2a7a8ac987f00000000000000000000000084c567a704ba44a9166ddbd0cd73c2a7a8ac987f000000000000000000000000000000000000000000000000f540559538888a9c00000000000000000000000000000000000000000000000000000000000000c00000000000000000000000000000000000000000000000000000000000000000,,,1,true -15503,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec34000000000000000000000000eeeaa0b5efdea861832e2efafc38dc9e8b47c888000000000000000000000000eeeaa0b5efdea861832e2efafc38dc9e8b47c88800000000000000000000000000000000000000000000000005d2a2807f73141800000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -15505,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec34000000000000000000000000621256092aa05304bd2dfb3eb1836a6b259444db000000000000000000000000621256092aa05304bd2dfb3eb1836a6b259444db0000000000000000000000000000000000000000000000004563918244f4000000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,0xe939bbfecd67f042dbb6e6f4348931149c6fa19d5006b947dbc257d1104c4dc5,2021-12-15 09:08:57.000 UTC,0,true -15506,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec340000000000000000000000002d44988f48d651ea649df93ea83fffe2e1f777d20000000000000000000000002d44988f48d651ea649df93ea83fffe2e1f777d2000000000000000000000000000000000000000000000000002386f26fc1000000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -15510,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec34000000000000000000000000b62d4d345cb18372e3375effd5ffaaaa591726b4000000000000000000000000b62d4d345cb18372e3375effd5ffaaaa591726b400000000000000000000000000000000000000000000000001a5578275fbfe0000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -15515,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec3400000000000000000000000032e2509cbee40743ccdda0af60ba43d5deb62d4700000000000000000000000032e2509cbee40743ccdda0af60ba43d5deb62d4700000000000000000000000000000000000000000000000000ad13ac064dad0000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -15516,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec34000000000000000000000000ab7b7ff0e3103d0ab5d87aa4f1988789bee3e504000000000000000000000000ab7b7ff0e3103d0ab5d87aa4f1988789bee3e5040000000000000000000000000000000000000000000000000d6212c57779f9f100000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -15517,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec340000000000000000000000005986115f255b23fe5904a62771f2506abda134760000000000000000000000005986115f255b23fe5904a62771f2506abda13476000000000000000000000000000000000000000000000000006f3c4773eae00000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -15518,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec340000000000000000000000004ce31bcaa6a0d361635ff3b16f5170bb2c78becb0000000000000000000000004ce31bcaa6a0d361635ff3b16f5170bb2c78becb000000000000000000000000000000000000000000000000006db53246aa000000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -15520,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec3400000000000000000000000045c960d3342f778939bd4e121c0d07bf3692ca2300000000000000000000000045c960d3342f778939bd4e121c0d07bf3692ca2300000000000000000000000000000000000000000000000000a20f19d898305400000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,0x95727129f89214160bfa9106ed4cc49ea1135b5dabd4d714bfdcf56bf2e02d8d,2022-02-21 03:42:32.000 UTC,0,true -15521,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec34000000000000000000000000f1f7c6a69ea406cad335a94af565d57b66cbaf0d000000000000000000000000f1f7c6a69ea406cad335a94af565d57b66cbaf0d000000000000000000000000000000000000000000000000014e195748e939d800000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -15525,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec34000000000000000000000000f0b3f4211808f21331952d18065921c7465efa63000000000000000000000000f0b3f4211808f21331952d18065921c7465efa63000000000000000000000000000000000000000000000000006a94d74f43000000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,0x1f493c549e296586be0c532bdb95a3bdccdd33984ca5c615e1a4f84802539c3e,2022-06-12 07:57:21.000 UTC,0,true -15527,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec34000000000000000000000000480d57dc208fd4c5a2306f0c8614621053b7c643000000000000000000000000480d57dc208fd4c5a2306f0c8614621053b7c6430000000000000000000000000000000000000000000000000091da9d457a0a9100000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -15528,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec340000000000000000000000004976af020929f31b79218567af8ef7b019f3d7bb0000000000000000000000004976af020929f31b79218567af8ef7b019f3d7bb000000000000000000000000000000000000000000000000008cb1f6f437025b00000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -15529,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec34000000000000000000000000657002379861b62b241cdf1e622c76902547cd65000000000000000000000000657002379861b62b241cdf1e622c76902547cd65000000000000000000000000000000000000000000000000008e1bc9bf04000000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -15530,0xcd9d4988c0ae61887b075ba77f08cbfad2b65068,0x3f87ff1de58128ef8fcb4c807efd776e1ac72e51,0xf4f7b41a00000000000000000000000086849b0122425c1ba46b0916562b36a6b799794200000000000000000000000000000000000000000000000011772214a1a6fc2e,,,1,true -15534,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec34000000000000000000000000f221d4a60e5610c74b017ecb3eaef32ca61730fe000000000000000000000000f221d4a60e5610c74b017ecb3eaef32ca61730fe00000000000000000000000000000000000000000000000000a13e59641a178800000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,0x1556c33248015034466923cee1895bef9a405346a6f231d70fc4f15f4eec9729,2022-03-20 10:05:49.000 UTC,0,true -15535,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec34000000000000000000000000139eeb895d86939eb18b52b3347402dddeaad378000000000000000000000000139eeb895d86939eb18b52b3347402dddeaad37800000000000000000000000000000000000000000000000000ade5040d7eff0000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -15538,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec340000000000000000000000009bd1f47bf530f5e0eb44dda1236e4c8e817dcd8d0000000000000000000000009bd1f47bf530f5e0eb44dda1236e4c8e817dcd8d00000000000000000000000000000000000000000000000001f35e87950f7f3200000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -15540,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec3400000000000000000000000090eb8081c94b56a8278d016252793fd82c0059e700000000000000000000000090eb8081c94b56a8278d016252793fd82c0059e700000000000000000000000000000000000000000000000000a717b0fe679a3a00000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,0x42e4d2a8f70491661b772fd9d0173d43152306f778a70ec1fb7caa73345889a7,2022-08-03 05:13:06.000 UTC,0,true -15541,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec340000000000000000000000004f61201a26d24891926c4066adbd98685a00f1f70000000000000000000000004f61201a26d24891926c4066adbd98685a00f1f7000000000000000000000000000000000000000000000000014f5d7be772aa5900000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -15542,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec3400000000000000000000000094520e2f86afd790263715f727d0d35f533f2a3600000000000000000000000094520e2f86afd790263715f727d0d35f533f2a360000000000000000000000000000000000000000000000000008d6d09ee0d2d600000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -15547,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec3400000000000000000000000009bbc644ec23f35d62cc09e68bfd9f18ba7a3ba900000000000000000000000009bbc644ec23f35d62cc09e68bfd9f18ba7a3ba90000000000000000000000000000000000000000000000000153ffcf40bc0f1900000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -15548,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec34000000000000000000000000a4b6508f51ba37765846a12d4362205acef278e1000000000000000000000000a4b6508f51ba37765846a12d4362205acef278e10000000000000000000000000000000000000000000000000587549450bc780000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,0xd3c3a4d4f82452eda6cead765e4cbb616b1ef207db8bb03801a940684b4eed45,2022-03-10 00:57:43.000 UTC,0,true -15552,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec34000000000000000000000000885f1d2f1f29adea24a8f23223f04f154bcc2e4f000000000000000000000000885f1d2f1f29adea24a8f23223f04f154bcc2e4f000000000000000000000000000000000000000000000000002d1fab3e0b9be800000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -15553,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec340000000000000000000000001675d5e5f800b117530d62b7da664dbf8bdc8f190000000000000000000000001675d5e5f800b117530d62b7da664dbf8bdc8f1900000000000000000000000000000000000000000000000000047f6e8d65bc8a00000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -15557,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec34000000000000000000000000da4bcd3ed7c54bbedca1012bdf9999140b9ec840000000000000000000000000da4bcd3ed7c54bbedca1012bdf9999140b9ec840000000000000000000000000000000000000000000000000016345785d8a000000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -15559,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0xa9f9e675000000000000000000000000dac17f958d2ee523a2206206994597c13d831ec700000000000000000000000094b008aa00579c1307b0ef2c499ad98a8ce58e58000000000000000000000000a5458cdb2608f25c874cf4d20dec1f6edace6b11000000000000000000000000a5458cdb2608f25c874cf4d20dec1f6edace6b1100000000000000000000000000000000000000000000000000000000000f695000000000000000000000000000000000000000000000000000000000000000c00000000000000000000000000000000000000000000000000000000000000000,,,1,true -15561,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec340000000000000000000000008b5a40b8563e721ef298c44ba4a4440f67b5af170000000000000000000000008b5a40b8563e721ef298c44ba4a4440f67b5af170000000000000000000000000000000000000000000000000000886c98b7600000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -15563,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec3400000000000000000000000038fa9da35d8905c0367e68ab3c90920be33ed64200000000000000000000000038fa9da35d8905c0367e68ab3c90920be33ed642000000000000000000000000000000000000000000000000002714711487800000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -15564,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0xa9f9e675000000000000000000000000dac17f958d2ee523a2206206994597c13d831ec700000000000000000000000094b008aa00579c1307b0ef2c499ad98a8ce58e58000000000000000000000000236187c608cfc18f602fe35625533395ecdd2ada000000000000000000000000236187c608cfc18f602fe35625533395ecdd2ada00000000000000000000000000000000000000000000000000000000000f695000000000000000000000000000000000000000000000000000000000000000c00000000000000000000000000000000000000000000000000000000000000000,,,1,true -15565,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec34000000000000000000000000f2f5207b459a3b6fbeaabdbc6ececed7ca878d1a000000000000000000000000f2f5207b459a3b6fbeaabdbc6ececed7ca878d1a00000000000000000000000000000000000000000000000002270128669ac7bb00000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -15566,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec340000000000000000000000008b5a40b8563e721ef298c44ba4a4440f67b5af170000000000000000000000008b5a40b8563e721ef298c44ba4a4440f67b5af170000000000000000000000000000000000000000000000000000886c98b7600000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -15570,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec340000000000000000000000006e89cf21911a160730d27e62589f52869a1abc5d0000000000000000000000006e89cf21911a160730d27e62589f52869a1abc5d0000000000000000000000000000000000000000000000000000b5e620f4800000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -15573,0xcd9d4988c0ae61887b075ba77f08cbfad2b65068,0x3f87ff1de58128ef8fcb4c807efd776e1ac72e51,0xf4f7b41a000000000000000000000000cfc7a084444c5a41ee0e3df3333a5f203c98f3ee000000000000000000000000000000000000000000000003420e179398fa0000,,,1,true -15574,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec340000000000000000000000000fbbac497570e775ae6bb6393b1ef9584ac2262c0000000000000000000000000fbbac497570e775ae6bb6393b1ef9584ac2262c0000000000000000000000000000000000000000000000000ddb6da88a20420000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -15578,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec34000000000000000000000000b0a7aade64bface56abb7f5ca2190e9f3c0efdcd000000000000000000000000b0a7aade64bface56abb7f5ca2190e9f3c0efdcd0000000000000000000000000000000000000000000000000000886c98b7600000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -15580,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec340000000000000000000000006503c34b11527e35a73fbb893bc18468aaee2e780000000000000000000000006503c34b11527e35a73fbb893bc18468aaee2e78000000000000000000000000000000000000000000000000002386f26fc1000000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -15582,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec34000000000000000000000000735b2f2a6cfcb2a3306f2b8805ca7f59358ce422000000000000000000000000735b2f2a6cfcb2a3306f2b8805ca7f59358ce4220000000000000000000000000000000000000000000000000018bb6fb4e92d0000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -15583,0xcd9d4988c0ae61887b075ba77f08cbfad2b65068,0x3f87ff1de58128ef8fcb4c807efd776e1ac72e51,0xf4f7b41a00000000000000000000000085d33380514aba3ae6cf1c58ad9717a2b1cf0272000000000000000000000000000000000000000000000000d02ab486cedc0000,,,1,true -15584,0x10e6593cdda8c58a1d0f14c5164b376352a55f2f,0x467194771dae2967aef3ecbedd3bf9a310c76c65,0xa9f9e6750000000000000000000000006b175474e89094c44da98b954eedeac495271d0f000000000000000000000000da10009cbd5d07dd0cecc66161fc93d7c9000da1000000000000000000000000735b2f2a6cfcb2a3306f2b8805ca7f59358ce422000000000000000000000000735b2f2a6cfcb2a3306f2b8805ca7f59358ce422000000000000000000000000000000000000000000000000d3397d48e46a863700000000000000000000000000000000000000000000000000000000000000c00000000000000000000000000000000000000000000000000000000000000000,,,1,true -15585,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec34000000000000000000000000735b2f2a6cfcb2a3306f2b8805ca7f59358ce422000000000000000000000000735b2f2a6cfcb2a3306f2b8805ca7f59358ce42200000000000000000000000000000000000000000000000000127c1396adfec000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -15587,0x10e6593cdda8c58a1d0f14c5164b376352a55f2f,0x467194771dae2967aef3ecbedd3bf9a310c76c65,0xa9f9e6750000000000000000000000006b175474e89094c44da98b954eedeac495271d0f000000000000000000000000da10009cbd5d07dd0cecc66161fc93d7c9000da100000000000000000000000080cffdca4d7e05eb25e703a183e98c7a4094eec000000000000000000000000080cffdca4d7e05eb25e703a183e98c7a4094eec000000000000000000000000000000000000000000000000e4d70fcb6dee77fd800000000000000000000000000000000000000000000000000000000000000c00000000000000000000000000000000000000000000000000000000000000000,0xd3515b1ae756c50ba48a56c7bd4f4f8979bc5910b786346598583bf2082691d7,2022-06-11 07:11:36.000 UTC,0,true -15588,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec3400000000000000000000000080cffdca4d7e05eb25e703a183e98c7a4094eec000000000000000000000000080cffdca4d7e05eb25e703a183e98c7a4094eec0000000000000000000000000000000000000000000000000007294135de941c500000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,0x14c37c119b5fcdee1db5d65d8359e2366e66b0f9eea03561bfbf177955071d9b,2022-06-05 07:10:15.000 UTC,0,true -15589,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec340000000000000000000000003181f3cfbe3137612e53f27e249f0e380e0e0ac30000000000000000000000003181f3cfbe3137612e53f27e249f0e380e0e0ac3000000000000000000000000000000000000000000000000003b2a943fceae3800000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -15590,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec34000000000000000000000000407e41dc7b2b69a97eb05e371b01257ecd68509f000000000000000000000000407e41dc7b2b69a97eb05e371b01257ecd68509f000000000000000000000000000000000000000000000000142f37477334f9c400000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -15591,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0xa9f9e675000000000000000000000000dac17f958d2ee523a2206206994597c13d831ec700000000000000000000000094b008aa00579c1307b0ef2c499ad98a8ce58e58000000000000000000000000db706ba75c0882fe5ab49e8369feb9646b7dc99c000000000000000000000000db706ba75c0882fe5ab49e8369feb9646b7dc99c00000000000000000000000000000000000000000000000000000000000f695000000000000000000000000000000000000000000000000000000000000000c00000000000000000000000000000000000000000000000000000000000000000,,,1,true -15594,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec340000000000000000000000002cac8830d0a4bb04728ccaf7bbeefead775172130000000000000000000000002cac8830d0a4bb04728ccaf7bbeefead775172130000000000000000000000000000000000000000000000000429d069189e000000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,0x48416e1070fee1598a30d75fea522f744ff59aa3bce28f95f6cc35488ce484d3,2021-12-11 09:01:42.000 UTC,0,true -15595,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0xa9f9e675000000000000000000000000dac17f958d2ee523a2206206994597c13d831ec700000000000000000000000094b008aa00579c1307b0ef2c499ad98a8ce58e5800000000000000000000000011c0a0a876bfe0aaf5092c5ac03518d67824ec6400000000000000000000000011c0a0a876bfe0aaf5092c5ac03518d67824ec6400000000000000000000000000000000000000000000000000000000000f695000000000000000000000000000000000000000000000000000000000000000c00000000000000000000000000000000000000000000000000000000000000000,,,1,true -15596,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec34000000000000000000000000c1d1280cbe4432f4ba29d1531952b968ce266fcc000000000000000000000000c1d1280cbe4432f4ba29d1531952b968ce266fcc000000000000000000000000000000000000000000000000001fd904980b3c0000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -15598,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec340000000000000000000000007848c04fb28d52fd52a5e63b6bb4a1a2e0528bbf0000000000000000000000007848c04fb28d52fd52a5e63b6bb4a1a2e0528bbf000000000000000000000000000000000000000000000000023b529939be0c3c00000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -15599,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec34000000000000000000000000bf1538fb243c868053b78a23e4a06612b4a45c7a000000000000000000000000bf1538fb243c868053b78a23e4a06612b4a45c7a00000000000000000000000000000000000000000000000001ee6258622bd30d00000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -15600,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec340000000000000000000000000c4e58d790453dbb161982657664e1a5b76032790000000000000000000000000c4e58d790453dbb161982657664e1a5b760327900000000000000000000000000000000000000000000000000016bcc41e9000000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -15602,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0xa9f9e675000000000000000000000000dac17f958d2ee523a2206206994597c13d831ec700000000000000000000000094b008aa00579c1307b0ef2c499ad98a8ce58e580000000000000000000000009ab3f9a3f33933d17967e95b74d29f5bdb8cb4910000000000000000000000009ab3f9a3f33933d17967e95b74d29f5bdb8cb49100000000000000000000000000000000000000000000000000000000000f695000000000000000000000000000000000000000000000000000000000000000c00000000000000000000000000000000000000000000000000000000000000000,,,1,true -15603,0xcd9d4988c0ae61887b075ba77f08cbfad2b65068,0x3f87ff1de58128ef8fcb4c807efd776e1ac72e51,0xf4f7b41a0000000000000000000000000951ce71f33c24af58c5253612938d107d537b970000000000000000000000000000000000000000000000002cabc97d71c9e09e,,,1,true -15605,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0xa9f9e675000000000000000000000000dac17f958d2ee523a2206206994597c13d831ec700000000000000000000000094b008aa00579c1307b0ef2c499ad98a8ce58e580000000000000000000000000cd543bebb1ec53e66e6c82694b4b5056c7056590000000000000000000000000cd543bebb1ec53e66e6c82694b4b5056c70565900000000000000000000000000000000000000000000000000000000000f695000000000000000000000000000000000000000000000000000000000000000c00000000000000000000000000000000000000000000000000000000000000000,,,1,true -15606,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec34000000000000000000000000b829c7dfec0373983e463351af11a96e61668f66000000000000000000000000b829c7dfec0373983e463351af11a96e61668f660000000000000000000000000000000000000000000000000408b73897132e9b00000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -15609,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec34000000000000000000000000fbc266b81ae6b630a854948ab2f222c9f44ff32d000000000000000000000000fbc266b81ae6b630a854948ab2f222c9f44ff32d00000000000000000000000000000000000000000000000000ad1be5e3f6b34000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -15613,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec340000000000000000000000005abf14ddcb863e2709201aaf932f826a181cd2e70000000000000000000000005abf14ddcb863e2709201aaf932f826a181cd2e700000000000000000000000000000000000000000000000001609efd6942060000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -15615,0x10e6593cdda8c58a1d0f14c5164b376352a55f2f,0x467194771dae2967aef3ecbedd3bf9a310c76c65,0xa9f9e6750000000000000000000000006b175474e89094c44da98b954eedeac495271d0f000000000000000000000000da10009cbd5d07dd0cecc66161fc93d7c9000da100000000000000000000000073b968d104cb550f4e28543a52ff7357b20c746800000000000000000000000073b968d104cb550f4e28543a52ff7357b20c7468000000000000000000000000000000000000000000000001bbcdedad1ca7b2b400000000000000000000000000000000000000000000000000000000000000c00000000000000000000000000000000000000000000000000000000000000000,,,1,true -15616,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec3400000000000000000000000044775476a3c87740f9ff7d013b601e8f3857a72600000000000000000000000044775476a3c87740f9ff7d013b601e8f3857a72600000000000000000000000000000000000000000000000000d5df4e3a60eb1900000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -15617,0xcd9d4988c0ae61887b075ba77f08cbfad2b65068,0x3f87ff1de58128ef8fcb4c807efd776e1ac72e51,0xf4f7b41a000000000000000000000000dee96105de27c6f47a610fba6b700b22abb26c040000000000000000000000000000000000000000000000009a2488cb49cce6ff,,,1,true -15619,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec340000000000000000000000001905c1e4278d34920fbd4a479b8f5d51ea065b3d0000000000000000000000001905c1e4278d34920fbd4a479b8f5d51ea065b3d0000000000000000000000000000000000000000000000006c8616e9a737f55a00000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,0xf94f7ce14399d5a2f5daae532c6aff898ca496ce620e5d0a44874ff3740325ca,2021-11-25 08:06:25.000 UTC,0,true -15621,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec34000000000000000000000000620c00e43aaa99ceee1b84bf1bb49c3fbee22b0c000000000000000000000000620c00e43aaa99ceee1b84bf1bb49c3fbee22b0c000000000000000000000000000000000000000000000000074e6602336f04c000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -15622,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec340000000000000000000000002ba03e80342ea3011dfcddeb2d1813d81c05caec0000000000000000000000002ba03e80342ea3011dfcddeb2d1813d81c05caec00000000000000000000000000000000000000000000000000fc5e3dd2ac1d2100000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,0x20124594972827f2e50c99074cc48a212ac61198812795595f2b0f41ccf624c9,2022-04-27 08:40:34.000 UTC,0,true -15623,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec34000000000000000000000000881cf1834434084b05fbd2d17d46bdf2ac685ee7000000000000000000000000881cf1834434084b05fbd2d17d46bdf2ac685ee7000000000000000000000000000000000000000000000000019602080c041b0000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -15625,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec34000000000000000000000000bbcb54119492581766c1256ffbe8f816c13f26e2000000000000000000000000bbcb54119492581766c1256ffbe8f816c13f26e200000000000000000000000000000000000000000000000002b97fa8c894b4ac00000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -15626,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec34000000000000000000000000ef60a333d909f97ca9f6248b831f979bf5e205d3000000000000000000000000ef60a333d909f97ca9f6248b831f979bf5e205d300000000000000000000000000000000000000000000000000034493c1291bb000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -15627,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec340000000000000000000000003d9b70f1b761e529f451898a821840f622794bf90000000000000000000000003d9b70f1b761e529f451898a821840f622794bf9000000000000000000000000000000000000000000000000034843e49e3cac4100000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,0x8ac58a40358e5f6456a6012cdcfd4611650206c05e9e4b95de0011c739677a8b,2021-12-12 10:04:19.000 UTC,0,true -15628,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec34000000000000000000000000ef60a333d909f97ca9f6248b831f979bf5e205d3000000000000000000000000ef60a333d909f97ca9f6248b831f979bf5e205d300000000000000000000000000000000000000000000000001340848f100f83b00000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -15629,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec34000000000000000000000000feee48a7d7eb20b4f9f3ec8246ab49b9e5e305a5000000000000000000000000feee48a7d7eb20b4f9f3ec8246ab49b9e5e305a50000000000000000000000000000000000000000000000000e82d332f8d3690600000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -15630,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec3400000000000000000000000067be7f6775bf056f9c1d1fd1debff44ef2ad67f000000000000000000000000067be7f6775bf056f9c1d1fd1debff44ef2ad67f0000000000000000000000000000000000000000000000000038edb0938993db000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,0xc8906005439c3886df6e01a7ad91cb43c0b72609e7d2d0d6633dca7d2480fad7,2021-12-18 16:14:46.000 UTC,0,true -15631,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec340000000000000000000000002255be730f41cbea4aabda73b17f6b6f511fd6a40000000000000000000000002255be730f41cbea4aabda73b17f6b6f511fd6a40000000000000000000000000000000000000000000000000dd0bda52890241f00000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -15632,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0xa9f9e6750000000000000000000000001f9840a85d5af5bf1d1762f925bdaddc4201f9840000000000000000000000006fd9d7ad17242c41f7131d257212c54a0e816691000000000000000000000000dc5aa4908abaf08a853fd459f35fe7df029fb1e5000000000000000000000000dc5aa4908abaf08a853fd459f35fe7df029fb1e50000000000000000000000000000000000000000000000004dd288cb44a30ccb00000000000000000000000000000000000000000000000000000000000000c00000000000000000000000000000000000000000000000000000000000000000,0x741757683093055e9b12528b7b2db066310bf0adef1b183829101573f4b7898c,2021-12-11 17:47:14.000 UTC,0,true -15633,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec340000000000000000000000005bb55c485319b2b770bfb03c08d7ba4c9bea33370000000000000000000000005bb55c485319b2b770bfb03c08d7ba4c9bea33370000000000000000000000000000000000000000000000000366135cf75cb53200000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -15635,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec34000000000000000000000000fe879cc3e4089f618cf5b8bbc8edd9a6cecdb60d000000000000000000000000fe879cc3e4089f618cf5b8bbc8edd9a6cecdb60d00000000000000000000000000000000000000000000000000cfb8162b28ef0000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,0xda33481248c65b04c479e3542a286b763589c3be4f7e187413c2fabdb7b3581a,2022-03-10 01:23:36.000 UTC,0,true -15637,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec34000000000000000000000000b1d5604b8ad680ceb7147ef9a23237b68a21d73b000000000000000000000000b1d5604b8ad680ceb7147ef9a23237b68a21d73b00000000000000000000000000000000000000000000000002bdde51d99e9bab00000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -15643,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec3400000000000000000000000016bb0ca466b8cafac10fd9c4325dc19040dec79900000000000000000000000016bb0ca466b8cafac10fd9c4325dc19040dec79900000000000000000000000000000000000000000000000000c079fc799567c000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -15644,0xcd9d4988c0ae61887b075ba77f08cbfad2b65068,0x3f87ff1de58128ef8fcb4c807efd776e1ac72e51,0xf4f7b41a0000000000000000000000002849ef9c4f4f8a2ba98279dcb4d61b7a4a982b320000000000000000000000000000000000000000000000001015089496b6027b,,,1,true -15651,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec3400000000000000000000000058e5453b2a2a3b0b62e84562384170796167cbd000000000000000000000000058e5453b2a2a3b0b62e84562384170796167cbd000000000000000000000000000000000000000000000000001512a74848fabe100000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -15653,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec34000000000000000000000000930c2db8ee04a798d215ae89ae957db5556917c0000000000000000000000000930c2db8ee04a798d215ae89ae957db5556917c0000000000000000000000000000000000000000000000000007f7666fc5b429300000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -15654,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec34000000000000000000000000653879c36be0552e44aeddf50bf3e9ab6eb2b895000000000000000000000000653879c36be0552e44aeddf50bf3e9ab6eb2b89500000000000000000000000000000000000000000000000000d0d4193be5c00000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -15656,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec34000000000000000000000000216902b0d12e37c1e0a6470f95daa24950bd2cb7000000000000000000000000216902b0d12e37c1e0a6470f95daa24950bd2cb70000000000000000000000000000000000000000000000000b1b464f3280584300000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -15657,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec34000000000000000000000000216902b0d12e37c1e0a6470f95daa24950bd2cb7000000000000000000000000216902b0d12e37c1e0a6470f95daa24950bd2cb70000000000000000000000000000000000000000000000000c3d49f23532269f00000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -15658,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec3400000000000000000000000016f1760ed9321eac4788514b1e5cce598ab3c43a00000000000000000000000016f1760ed9321eac4788514b1e5cce598ab3c43a000000000000000000000000000000000000000000000000008e1bc9bf04000000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -15661,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec34000000000000000000000000c9df1158c6da7e3dee926896a99388810c7c59cb000000000000000000000000c9df1158c6da7e3dee926896a99388810c7c59cb000000000000000000000000000000000000000000000000013d7ec8204b531d00000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -15663,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec34000000000000000000000000b917f2001b6143d43d2cdefefd02f8055e862c0e000000000000000000000000b917f2001b6143d43d2cdefefd02f8055e862c0e000000000000000000000000000000000000000000000000012c6cdbf7973df500000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -15664,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec340000000000000000000000002dbfe0adaf96f9da1d6f78057f73392894452a5e0000000000000000000000002dbfe0adaf96f9da1d6f78057f73392894452a5e00000000000000000000000000000000000000000000000000a706af3f4c415c00000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -15665,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec340000000000000000000000005c01d32809bbb33d585b4175d06b5ba7b8f0e96d0000000000000000000000005c01d32809bbb33d585b4175d06b5ba7b8f0e96d000000000000000000000000000000000000000000000000015a61df50f2ed0d00000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -15666,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0xa9f9e675000000000000000000000000a0b86991c6218b36c1d19d4a2e9eb0ce3606eb480000000000000000000000007f5c764cbc14f9669b88837ca1490cca17c316070000000000000000000000003422473b7de8204445edf001e33ef637d6cb60ad0000000000000000000000003422473b7de8204445edf001e33ef637d6cb60ad00000000000000000000000000000000000000000000000000000000000f424000000000000000000000000000000000000000000000000000000000000000c00000000000000000000000000000000000000000000000000000000000000000,,,1,true -15668,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec34000000000000000000000000ef4981e9ced215d267ae900c5802c6966efd312a000000000000000000000000ef4981e9ced215d267ae900c5802c6966efd312a00000000000000000000000000000000000000000000000000b08d49cea31a0000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -15672,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec34000000000000000000000000e7d1cfec62aec12320ef42bd59283590f4216151000000000000000000000000e7d1cfec62aec12320ef42bd59283590f421615100000000000000000000000000000000000000000000000000677e328e0f350c00000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -15673,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec340000000000000000000000008e25eecf3ebdea654861c59805c074657bd0a3680000000000000000000000008e25eecf3ebdea654861c59805c074657bd0a3680000000000000000000000000000000000000000000000000001c6bf5263400000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -15675,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec34000000000000000000000000a425fe8b53b1386ed496dd3ee143f2d8c3a624d3000000000000000000000000a425fe8b53b1386ed496dd3ee143f2d8c3a624d30000000000000000000000000000000000000000000000000003b602bac7763500000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -15678,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec3400000000000000000000000012ef99df0866b69754558cf7ab1650ccb4c04a0c00000000000000000000000012ef99df0866b69754558cf7ab1650ccb4c04a0c0000000000000000000000000000000000000000000000000067c77c9773850000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -15679,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec340000000000000000000000007d3b8ba6e97efd09aca212d79fc3b7ac0e2673100000000000000000000000007d3b8ba6e97efd09aca212d79fc3b7ac0e267310000000000000000000000000000000000000000000000000008f74daf0cdecf500000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -15681,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec34000000000000000000000000239d80a9243e6576be0b3ad7e9e8e5a29a796440000000000000000000000000239d80a9243e6576be0b3ad7e9e8e5a29a796440000000000000000000000000000000000000000000000000045103e79aeb98f800000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,0x70acccad5851f8e4a87a8c7e123e025f9457312d031dc29241f9763fe84190a3,2021-12-25 15:22:17.000 UTC,0,true -15682,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec3400000000000000000000000007de9f19149a86da212b97d30131f4ce1c3f6c7900000000000000000000000007de9f19149a86da212b97d30131f4ce1c3f6c7900000000000000000000000000000000000000000000000000747a04e594281a00000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,0xe052b3daad4cb6d23eae5032e1ad3e00c5ac5b7e4b2e999ace55b300fda261f1,2022-03-11 12:49:25.000 UTC,0,true -15684,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec34000000000000000000000000e725c37b2368d71c4976cfe7e3c69ffdc3635bba000000000000000000000000e725c37b2368d71c4976cfe7e3c69ffdc3635bba00000000000000000000000000000000000000000000000000354a6ba7a1800000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,0xa53c5f3ff5b61cd85acae0f9fb7adea8c162ce83b2efbdfb12fc92734584e2eb,2022-07-21 05:05:53.000 UTC,0,true -15685,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec34000000000000000000000000a0a29a5ea152da70f70ec9900a08bc55ff59bb01000000000000000000000000a0a29a5ea152da70f70ec9900a08bc55ff59bb01000000000000000000000000000000000000000000000000006258023832c84900000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -15688,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec34000000000000000000000000273ec095fe4c3c023b6e5d3dcd3642af950ac930000000000000000000000000273ec095fe4c3c023b6e5d3dcd3642af950ac930000000000000000000000000000000000000000000000000013ea0665957720700000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -15689,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec3400000000000000000000000043c76b04ed218a881346d8b2b65e5d29f87e985300000000000000000000000043c76b04ed218a881346d8b2b65e5d29f87e9853000000000000000000000000000000000000000000000000015fdd7560e56a0000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,0x47e6a8472abe99cff5917c8dbfb7b6fb9137bc17e4396ffe6effd8417d52ea2c,2021-11-28 05:35:26.000 UTC,0,true -15691,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec34000000000000000000000000970e1cbbea26bbbafe4608848f7add9b397343df000000000000000000000000970e1cbbea26bbbafe4608848f7add9b397343df0000000000000000000000000000000000000000000000000267480e976331f700000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -15693,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec34000000000000000000000000dd530b6604ad97989c09449a10df892c0206fc96000000000000000000000000dd530b6604ad97989c09449a10df892c0206fc96000000000000000000000000000000000000000000000000004fb641dd2701b800000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -15694,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec34000000000000000000000000fc69699b7f25a0311f055880a421abe5eb89f111000000000000000000000000fc69699b7f25a0311f055880a421abe5eb89f1110000000000000000000000000000000000000000000000000f3abe76b684734000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -15695,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec3400000000000000000000000070753fc8fcaafaf71df307799243d0152e1e774900000000000000000000000070753fc8fcaafaf71df307799243d0152e1e7749000000000000000000000000000000000000000000000000001b2b764c90d29400000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -15696,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec34000000000000000000000000e36957237b18282b8d08739b98922991759bc771000000000000000000000000e36957237b18282b8d08739b98922991759bc77100000000000000000000000000000000000000000000000002bb1f79f177567a00000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -15697,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec340000000000000000000000002c512e897ea2e17d49587a15ac8563a19c4514580000000000000000000000002c512e897ea2e17d49587a15ac8563a19c4514580000000000000000000000000000000000000000000000000067d7fcb8b8160000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -15698,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec3400000000000000000000000018b25c78b356a3247bcef5bf487a1ff0e5e0885200000000000000000000000018b25c78b356a3247bcef5bf487a1ff0e5e08852000000000000000000000000000000000000000000000000009812d0bb55244500000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -15702,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec34000000000000000000000000510b2fd4adee51d4ee6dfc6c15a2af9665a15a7e000000000000000000000000510b2fd4adee51d4ee6dfc6c15a2af9665a15a7e0000000000000000000000000000000000000000000000001b7967daaaa41ddf00000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -15703,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0xa9f9e675000000000000000000000000dac17f958d2ee523a2206206994597c13d831ec700000000000000000000000094b008aa00579c1307b0ef2c499ad98a8ce58e58000000000000000000000000a5ecbcda96210b6f93f60bb0002d008b2c4aced6000000000000000000000000a5ecbcda96210b6f93f60bb0002d008b2c4aced6000000000000000000000000000000000000000000000000000000000d0b5ade00000000000000000000000000000000000000000000000000000000000000c00000000000000000000000000000000000000000000000000000000000000000,0x5688c5f6aaafe2bc2fc1e3cbd357c7ebd9bcf3e1deda2b9c387e99985d9f9a52,2021-12-11 09:28:44.000 UTC,0,true -15706,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec340000000000000000000000003580e55e0157228f7d648dbb2d1ac8aa8a4f69450000000000000000000000003580e55e0157228f7d648dbb2d1ac8aa8a4f6945000000000000000000000000000000000000000000000000042346f0b63b000000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -15707,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec340000000000000000000000002dc2442365fd0389a3312107274adaa865513f0b0000000000000000000000002dc2442365fd0389a3312107274adaa865513f0b000000000000000000000000000000000000000000000000008e1bc9bf04000000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -15708,0xcd9d4988c0ae61887b075ba77f08cbfad2b65068,0x3f87ff1de58128ef8fcb4c807efd776e1ac72e51,0xf4f7b41a0000000000000000000000003580e55e0157228f7d648dbb2d1ac8aa8a4f694500000000000000000000000000000000000000000000000456a91d69381ae92f,,,1,true -15709,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec340000000000000000000000007036847a2a085df50bd2e5bcd42091eec9f2b9dc0000000000000000000000007036847a2a085df50bd2e5bcd42091eec9f2b9dc000000000000000000000000000000000000000000000000041f6fa3827d608000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -15714,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec34000000000000000000000000dc7f3c5fc1ce22e8d8f2c35029055bcc06ea1dfc000000000000000000000000dc7f3c5fc1ce22e8d8f2c35029055bcc06ea1dfc00000000000000000000000000000000000000000000000001605b96ea0b930000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -15717,0xcd9d4988c0ae61887b075ba77f08cbfad2b65068,0x3f87ff1de58128ef8fcb4c807efd776e1ac72e51,0xf4f7b41a000000000000000000000000aa2f9f0798fab1f08cf508b721e3a81dbe007e830000000000000000000000000000000000000000000000000aa27c94fbf9aece,,,1,true -15718,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec34000000000000000000000000a31cd363cd2867e98fb0102e07e0c226f8346e48000000000000000000000000a31cd363cd2867e98fb0102e07e0c226f8346e48000000000000000000000000000000000000000000000000004f94ae6af8000000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,0xe14c739ea867a22d7aab7284f54551735cf2fb463544838fad22930d92f0f5b6,2022-08-21 04:58:51.000 UTC,0,true -15719,0xcd9d4988c0ae61887b075ba77f08cbfad2b65068,0x3f87ff1de58128ef8fcb4c807efd776e1ac72e51,0xf4f7b41a0000000000000000000000003a01aeaf23caa39d85e8e06b1938f4f1af282fa7000000000000000000000000000000000000000000000000345e5a253e611c58,,,1,true -15720,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec34000000000000000000000000f372f8bf76c652b51d293038431f9deb8333e67b000000000000000000000000f372f8bf76c652b51d293038431f9deb8333e67b0000000000000000000000000000000000000000000000000360098d8359634b00000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,0x4fd5b3a7ab3a585bd9821b0ce7063bf263a14f99d7766d2d02da4a7376a22d10,2021-11-25 22:28:26.000 UTC,0,true -15723,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec340000000000000000000000005b9915aa990cea3f67e0af53c05573aafc4206560000000000000000000000005b9915aa990cea3f67e0af53c05573aafc4206560000000000000000000000000000000000000000000000000dd15bc36ce4653a00000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,0xc5354bdac33b6b07019d1a31e212e1a17a3fab2b56efdffcfca2e6bb91987043,2021-11-21 05:07:32.000 UTC,0,true -15725,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec34000000000000000000000000b70ec21d2908fd7f8553a7beab19ba0da4f0204c000000000000000000000000b70ec21d2908fd7f8553a7beab19ba0da4f0204c00000000000000000000000000000000000000000000000000bd1addfe8ee3e600000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,0x6e22d8dcc99c9a1be52548d2527eafdf78dcff3cd68b0227837f7048817713a2,2022-03-14 07:31:01.000 UTC,0,true -15727,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec3400000000000000000000000019f372338364550b5fe17fb1c97852ecb08579ed00000000000000000000000019f372338364550b5fe17fb1c97852ecb08579ed000000000000000000000000000000000000000000000000006ccc1accd5377500000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -15729,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec340000000000000000000000001fae7e1347cc2a5f625dec6d9d4e5d1c86deda380000000000000000000000001fae7e1347cc2a5f625dec6d9d4e5d1c86deda38000000000000000000000000000000000000000000000000003c84d21c65943600000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,0xf39d76e8c3f79c3f59fea47b25abb57643fe617bc7b26643265db11a5142bd20,2022-09-04 14:36:59.000 UTC,0,true -15731,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec34000000000000000000000000deb552b4fbd93b65cec9de13c8157e8cd634933e000000000000000000000000deb552b4fbd93b65cec9de13c8157e8cd634933e00000000000000000000000000000000000000000000000002c46afb2ccb490000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -15733,0xcd9d4988c0ae61887b075ba77f08cbfad2b65068,0x3f87ff1de58128ef8fcb4c807efd776e1ac72e51,0xf4f7b41a00000000000000000000000095b62a3e480f4944ab0949c2da586b6d39d692ef00000000000000000000000000000000000000000000000407ac9401792e5cf2,,,1,true -15734,0xcd9d4988c0ae61887b075ba77f08cbfad2b65068,0x3f87ff1de58128ef8fcb4c807efd776e1ac72e51,0xf4f7b41a00000000000000000000000095b62a3e480f4944ab0949c2da586b6d39d692ef000000000000000000000000000000000000000000000003d92f4d976c98551e,,,1,true -15736,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec3400000000000000000000000025c9ca23e7f4a857bf5ce4a343830560776a12ad00000000000000000000000025c9ca23e7f4a857bf5ce4a343830560776a12ad000000000000000000000000000000000000000000000000008a583afeac337200000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -15740,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec340000000000000000000000007c4a4734de9278982e0fbad7974615ab2b55f8960000000000000000000000007c4a4734de9278982e0fbad7974615ab2b55f896000000000000000000000000000000000000000000000000015a9e4209d2f35000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -15741,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec34000000000000000000000000b17bbfbd1cc5faee7976d7f0ee8249ebddf78726000000000000000000000000b17bbfbd1cc5faee7976d7f0ee8249ebddf7872600000000000000000000000000000000000000000000000006e6b6aeff4a122300000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,0x60065690965b034a5591bbf8be6d3274666e34dec788de0db582cca560bd2f18,2021-12-19 08:23:39.000 UTC,0,true -15743,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0xa9f9e675000000000000000000000000dac17f958d2ee523a2206206994597c13d831ec700000000000000000000000094b008aa00579c1307b0ef2c499ad98a8ce58e580000000000000000000000005600051d9924b05d7098157ad8d791d48a93185a0000000000000000000000005600051d9924b05d7098157ad8d791d48a93185a0000000000000000000000000000000000000000000000000000000013fc1e2300000000000000000000000000000000000000000000000000000000000000c00000000000000000000000000000000000000000000000000000000000000000,,,1,true -15745,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec34000000000000000000000000ac0da3a79a854b99b08ba6fae140617901453ba8000000000000000000000000ac0da3a79a854b99b08ba6fae140617901453ba8000000000000000000000000000000000000000000000000008e1bc9bf04000000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -15747,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec34000000000000000000000000ac0da3a79a854b99b08ba6fae140617901453ba8000000000000000000000000ac0da3a79a854b99b08ba6fae140617901453ba800000000000000000000000000000000000000000000000000431a1baad2e10000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -15752,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec34000000000000000000000000084411f2f63602504e25206d5b447ce16747cb01000000000000000000000000084411f2f63602504e25206d5b447ce16747cb01000000000000000000000000000000000000000000000000005b668820972f5100000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -15753,0xcd9d4988c0ae61887b075ba77f08cbfad2b65068,0x3f87ff1de58128ef8fcb4c807efd776e1ac72e51,0xf4f7b41a00000000000000000000000079855ef6cf3d3e4ba05fa7466e94c23adc0cc8c6000000000000000000000000000000000000000000000002b5e3af16b1880000,,,1,true -15754,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec340000000000000000000000001217211a1145e5388d45f98c98a6fe5cf29efbdc0000000000000000000000001217211a1145e5388d45f98c98a6fe5cf29efbdc00000000000000000000000000000000000000000000000000f0b0d67fbf11d200000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -15755,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec340000000000000000000000002f0935b128abb3b5074850247d615392366fa08a0000000000000000000000002f0935b128abb3b5074850247d615392366fa08a000000000000000000000000000000000000000000000000015175ab2c4528a300000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -15758,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec340000000000000000000000000273455e1d9c8b8f311a65d45e605978e57c88870000000000000000000000000273455e1d9c8b8f311a65d45e605978e57c88870000000000000000000000000000000000000000000000000443bbfe26b7e94000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -15761,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec340000000000000000000000006a9c49c64a020f19bd6af4f2ee4b2eb9758dd9bf0000000000000000000000006a9c49c64a020f19bd6af4f2ee4b2eb9758dd9bf0000000000000000000000000000000000000000000000000040bba76c20fe0000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -15762,0xcd9d4988c0ae61887b075ba77f08cbfad2b65068,0x3f87ff1de58128ef8fcb4c807efd776e1ac72e51,0xf4f7b41a00000000000000000000000063d1277b25710bfeb1e95085262f365a5cc8dfaf0000000000000000000000000000000000000000000000026d9888752fa0fd68,,,1,true -15763,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec340000000000000000000000008fe146b2ffe8b629a524dcb8913a358b386883610000000000000000000000008fe146b2ffe8b629a524dcb8913a358b3868836100000000000000000000000000000000000000000000000000f8d8c19f36e2e000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -15764,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec3400000000000000000000000034e2389ffc1d198e4aa275b8b2bcc2ef913be71300000000000000000000000034e2389ffc1d198e4aa275b8b2bcc2ef913be71300000000000000000000000000000000000000000000000000af23b02edfcd0000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -15766,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec3400000000000000000000000069b430d064874597632c3f2a019f0a8f6decc47900000000000000000000000069b430d064874597632c3f2a019f0a8f6decc47900000000000000000000000000000000000000000000000000e661aa24ea50d200000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,0xf16a1df9771ddaabc00f4eabb3c35ec9d7fc29602329ae047adc42239e10c12f,2021-12-22 08:29:57.000 UTC,0,true -15767,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0xa9f9e675000000000000000000000000dac17f958d2ee523a2206206994597c13d831ec700000000000000000000000094b008aa00579c1307b0ef2c499ad98a8ce58e58000000000000000000000000a74fb7544d54a1d8f8178b6ae3f2700ebd3a65ba000000000000000000000000a74fb7544d54a1d8f8178b6ae3f2700ebd3a65ba000000000000000000000000000000000000000000000000000000003b6456ea00000000000000000000000000000000000000000000000000000000000000c00000000000000000000000000000000000000000000000000000000000000000,,,1,true -15768,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0xa9f9e675000000000000000000000000a0b86991c6218b36c1d19d4a2e9eb0ce3606eb480000000000000000000000007f5c764cbc14f9669b88837ca1490cca17c31607000000000000000000000000500576d9501fff6fb42280df6d2994b36e7aefc1000000000000000000000000500576d9501fff6fb42280df6d2994b36e7aefc10000000000000000000000000000000000000000000000000000000044c0ae8e00000000000000000000000000000000000000000000000000000000000000c00000000000000000000000000000000000000000000000000000000000000000,0x4ac50a1bc67e2f6214179be701bb0722077c30ad9a8826f8fa2da1ab2a585101,2021-11-21 15:29:16.000 UTC,0,true -15769,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec34000000000000000000000000a74fb7544d54a1d8f8178b6ae3f2700ebd3a65ba000000000000000000000000a74fb7544d54a1d8f8178b6ae3f2700ebd3a65ba00000000000000000000000000000000000000000000000000e34759c3ace08200000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -15776,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec3400000000000000000000000017e3c0330d2eaffc8a21acae5db958c50950bc0a00000000000000000000000017e3c0330d2eaffc8a21acae5db958c50950bc0a000000000000000000000000000000000000000000000000008836b1517e6b4000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -15779,0x10e6593cdda8c58a1d0f14c5164b376352a55f2f,0x467194771dae2967aef3ecbedd3bf9a310c76c65,0xa9f9e6750000000000000000000000006b175474e89094c44da98b954eedeac495271d0f000000000000000000000000da10009cbd5d07dd0cecc66161fc93d7c9000da10000000000000000000000002e5745f3136e1023b7db402f2f20d59ece802f4a0000000000000000000000002e5745f3136e1023b7db402f2f20d59ece802f4a00000000000000000000000000000000000000000000000914fce452ed8c2d4c00000000000000000000000000000000000000000000000000000000000000c00000000000000000000000000000000000000000000000000000000000000000,,,1,true -15781,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec34000000000000000000000000934c76f53f7de96b39ab4f9b73f0e8f39ca23be2000000000000000000000000934c76f53f7de96b39ab4f9b73f0e8f39ca23be20000000000000000000000000000000000000000000000000114c7513b35da0d00000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,0x6560a6314a4600a4590516e92493a8fc322e97c1b35072cf641d4866944c1ad3,2022-03-02 11:24:14.000 UTC,0,true -15783,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec34000000000000000000000000999277e47e782a2f1efff2ea234ee7486c5cbb56000000000000000000000000999277e47e782a2f1efff2ea234ee7486c5cbb56000000000000000000000000000000000000000000000000006a94d74f43000000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -15785,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec34000000000000000000000000ceeb9e598bf6c31f3ca3eb944297c0826048bf2f000000000000000000000000ceeb9e598bf6c31f3ca3eb944297c0826048bf2f0000000000000000000000000000000000000000000000000019e74ca440ea4000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -15786,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec340000000000000000000000009b35884498aa02ba3fe3b290c287d8e9fc892e3d0000000000000000000000009b35884498aa02ba3fe3b290c287d8e9fc892e3d000000000000000000000000000000000000000000000000014ffba3b9c3055900000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -15787,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec3400000000000000000000000052841db83d2ddcae6afa935783c3d591b313feb500000000000000000000000052841db83d2ddcae6afa935783c3d591b313feb5000000000000000000000000000000000000000000000000021e56460e3a45a800000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -15789,0x10e6593cdda8c58a1d0f14c5164b376352a55f2f,0x467194771dae2967aef3ecbedd3bf9a310c76c65,0xa9f9e6750000000000000000000000006b175474e89094c44da98b954eedeac495271d0f000000000000000000000000da10009cbd5d07dd0cecc66161fc93d7c9000da1000000000000000000000000d0bd81eeee1d3abf0ad446a6f52c847a6904d233000000000000000000000000d0bd81eeee1d3abf0ad446a6f52c847a6904d23300000000000000000000000000000000000000000000003e805fcef407624a8700000000000000000000000000000000000000000000000000000000000000c00000000000000000000000000000000000000000000000000000000000000000,0xfff2895933b649184626dbe0cd43aec959330a9cb7b27e7503b4f6a0df2c6ca2,2021-12-08 08:43:18.000 UTC,0,true -15790,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec34000000000000000000000000d0bd81eeee1d3abf0ad446a6f52c847a6904d233000000000000000000000000d0bd81eeee1d3abf0ad446a6f52c847a6904d2330000000000000000000000000000000000000000000000000031050bda72d3e300000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,0xae95f6afc080c1e2cba52d89ac4e17fd952627d360352ab1b6ba509678a1fadc,2021-12-08 08:41:11.000 UTC,0,true -15793,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec34000000000000000000000000988cab9493ed968b6499e3419844ba3c117fc070000000000000000000000000988cab9493ed968b6499e3419844ba3c117fc07000000000000000000000000000000000000000000000000000d16a69dc42c20000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -15794,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec34000000000000000000000000343131422453b116d55955f99b27286a828bbba3000000000000000000000000343131422453b116d55955f99b27286a828bbba3000000000000000000000000000000000000000000000000023453fbf4c7ba1f00000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,0x40ae9a1f748813f53c3192f3e73223453a10cf9b53e0ccb49c8b2ec0f4c9e389,2022-02-16 10:07:03.000 UTC,0,true -15796,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec340000000000000000000000004c99320096dda3eeba6b3158f8c61bf993ef00e10000000000000000000000004c99320096dda3eeba6b3158f8c61bf993ef00e100000000000000000000000000000000000000000000000001ffa31dcd19f07f00000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,0xbb3379532e1b9285923808c90c7534afff71024a9c6e7ef909e2f8b06d522caf,2022-02-26 21:57:22.000 UTC,0,true -15799,0xcd9d4988c0ae61887b075ba77f08cbfad2b65068,0x3f87ff1de58128ef8fcb4c807efd776e1ac72e51,0xf4f7b41a00000000000000000000000067b5fb289c4701596e28bc3622e1f0021ee3bd24000000000000000000000000000000000000000000000003e51b4799438955e3,,,1,true -15802,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec3400000000000000000000000049bc79b5923273b1df30c67be9da6adcb0ad8a2300000000000000000000000049bc79b5923273b1df30c67be9da6adcb0ad8a23000000000000000000000000000000000000000000000000036af0b22bfc4dea00000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -15803,0xcd9d4988c0ae61887b075ba77f08cbfad2b65068,0x3f87ff1de58128ef8fcb4c807efd776e1ac72e51,0xf4f7b41a0000000000000000000000002911c55725bc15226d69a1799b6d45f18844834a0000000000000000000000000000000000000000000000014ff9cf9b24c2bced,,,1,true -15806,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec3400000000000000000000000082a214b23c0119f0c37be360889927d68c2caab600000000000000000000000082a214b23c0119f0c37be360889927d68c2caab6000000000000000000000000000000000000000000000000057cfd7d55fc455e00000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -15811,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec34000000000000000000000000db6c892f2392134524b85105cf4a85559acb82d3000000000000000000000000db6c892f2392134524b85105cf4a85559acb82d300000000000000000000000000000000000000000000000006dc26f5b7c2553a00000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -15812,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0xa9f9e675000000000000000000000000dac17f958d2ee523a2206206994597c13d831ec700000000000000000000000094b008aa00579c1307b0ef2c499ad98a8ce58e58000000000000000000000000d92ed5732d385381d00dc22792545086346bb63d000000000000000000000000d92ed5732d385381d00dc22792545086346bb63d000000000000000000000000000000000000000000000000000000006b2e9d2300000000000000000000000000000000000000000000000000000000000000c00000000000000000000000000000000000000000000000000000000000000000,,,1,true -15813,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec3400000000000000000000000036c448b1eb59f3b6fabbab8d1049548861687a0b00000000000000000000000036c448b1eb59f3b6fabbab8d1049548861687a0b000000000000000000000000000000000000000000000000010675001e50479600000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -15814,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec34000000000000000000000000c3b661f847e06c2b3bd9d5a356757f3e765a822e000000000000000000000000c3b661f847e06c2b3bd9d5a356757f3e765a822e00000000000000000000000000000000000000000000000000b1a2bc2ec5000000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -15818,0x10e6593cdda8c58a1d0f14c5164b376352a55f2f,0x467194771dae2967aef3ecbedd3bf9a310c76c65,0xa9f9e6750000000000000000000000006b175474e89094c44da98b954eedeac495271d0f000000000000000000000000da10009cbd5d07dd0cecc66161fc93d7c9000da1000000000000000000000000b3f7ef4c8c6aea014737165a98d41605cae4546e000000000000000000000000b3f7ef4c8c6aea014737165a98d41605cae4546e00000000000000000000000000000000000000000000001ca384754e508fca7600000000000000000000000000000000000000000000000000000000000000c00000000000000000000000000000000000000000000000000000000000000000,,,1,true -15819,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec340000000000000000000000007d73904f8b3a7fb1cf94d3497a26dc1e18b5543a0000000000000000000000007d73904f8b3a7fb1cf94d3497a26dc1e18b5543a00000000000000000000000000000000000000000000000000f657567032c20000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -15821,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0xa9f9e675000000000000000000000000dac17f958d2ee523a2206206994597c13d831ec700000000000000000000000094b008aa00579c1307b0ef2c499ad98a8ce58e58000000000000000000000000410b26c4509b9759ffe4ef4cfc418714daf4558a000000000000000000000000410b26c4509b9759ffe4ef4cfc418714daf4558a00000000000000000000000000000000000000000000000000000000000f695000000000000000000000000000000000000000000000000000000000000000c00000000000000000000000000000000000000000000000000000000000000000,,,1,true -15823,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec340000000000000000000000008959092b77f5b2f531e52041623ae90f8fd13d090000000000000000000000008959092b77f5b2f531e52041623ae90f8fd13d09000000000000000000000000000000000000000000000000000009184e72a00000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -15824,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec340000000000000000000000003b887932adda07db3dee4ec3aac0d01230e8ad2f0000000000000000000000003b887932adda07db3dee4ec3aac0d01230e8ad2f000000000000000000000000000000000000000000000000000009184e72a00000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -15825,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec34000000000000000000000000484f5add96dbc6744aa47052d3c7e46c9f1a0d94000000000000000000000000484f5add96dbc6744aa47052d3c7e46c9f1a0d94000000000000000000000000000000000000000000000000000009184e72a00000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -15826,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec34000000000000000000000000ec3e067ed83b71d59fa4cbd081c94944baf96734000000000000000000000000ec3e067ed83b71d59fa4cbd081c94944baf96734000000000000000000000000000000000000000000000000000009184e72a00000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -15827,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec3400000000000000000000000022e50124549c5265a50dec8dc14f9650b094915c00000000000000000000000022e50124549c5265a50dec8dc14f9650b094915c000000000000000000000000000000000000000000000000000009184e72a00000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -15828,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec340000000000000000000000004b492ae8421dca3f6f5c252fe53544a7b261f6f50000000000000000000000004b492ae8421dca3f6f5c252fe53544a7b261f6f5000000000000000000000000000000000000000000000000000009184e72a00000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -15829,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec340000000000000000000000007e2eb70730a90f46f6a5438f77f2fb28c2f110760000000000000000000000007e2eb70730a90f46f6a5438f77f2fb28c2f11076000000000000000000000000000000000000000000000000000009184e72a00000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -15830,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec34000000000000000000000000f44fbe168e7bbfe8a21e7fcf487c53782cd0ae19000000000000000000000000f44fbe168e7bbfe8a21e7fcf487c53782cd0ae19000000000000000000000000000000000000000000000000000009184e72a00000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -15831,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec3400000000000000000000000049e6f5ea02b107af84ebbe00e4998b8f51d51d9500000000000000000000000049e6f5ea02b107af84ebbe00e4998b8f51d51d95000000000000000000000000000000000000000000000000000009184e72a00000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -15832,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec340000000000000000000000001f2f542b6eaea0badb33bcf31af27636f6b45c830000000000000000000000001f2f542b6eaea0badb33bcf31af27636f6b45c83000000000000000000000000000000000000000000000000000009184e72a00000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -15833,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec3400000000000000000000000026048c504867a74ebb5cf7e06399f911274ae90100000000000000000000000026048c504867a74ebb5cf7e06399f911274ae901000000000000000000000000000000000000000000000000000009184e72a00000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -15834,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec340000000000000000000000006bf076cf12d96252ecc7987aae25c165a1861d880000000000000000000000006bf076cf12d96252ecc7987aae25c165a1861d88000000000000000000000000000000000000000000000000000009184e72a00000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -15835,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0xa9f9e675000000000000000000000000dac17f958d2ee523a2206206994597c13d831ec700000000000000000000000094b008aa00579c1307b0ef2c499ad98a8ce58e580000000000000000000000004f97e52d391a56976317c82e0fef586b77c76b480000000000000000000000004f97e52d391a56976317c82e0fef586b77c76b4800000000000000000000000000000000000000000000000000000000000f695000000000000000000000000000000000000000000000000000000000000000c00000000000000000000000000000000000000000000000000000000000000000,,,1,true -15836,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec340000000000000000000000003f012d13a5857fa5a81fcbed7b2d76fc000f53600000000000000000000000003f012d13a5857fa5a81fcbed7b2d76fc000f5360000000000000000000000000000000000000000000000000000009184e72a00000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -15837,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec34000000000000000000000000818e81671d2f1ffbf3cdaf2b9e6e171a3468face000000000000000000000000818e81671d2f1ffbf3cdaf2b9e6e171a3468face000000000000000000000000000000000000000000000000000009184e72a00000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -15838,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec340000000000000000000000003c194f01f4ceda4e94e76955702a7a5a7100944d0000000000000000000000003c194f01f4ceda4e94e76955702a7a5a7100944d000000000000000000000000000000000000000000000000000009184e72a00000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -15839,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec34000000000000000000000000c58ac50c22389ee0ef7839ec0dd7f2453930a793000000000000000000000000c58ac50c22389ee0ef7839ec0dd7f2453930a793000000000000000000000000000000000000000000000000000009184e72a00000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -15840,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec34000000000000000000000000c7797c9fcde9c1cf0fc69445873b841f78dbf0a6000000000000000000000000c7797c9fcde9c1cf0fc69445873b841f78dbf0a6000000000000000000000000000000000000000000000000000009184e72a00000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -15841,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec3400000000000000000000000089e42b5b59dbc160bd1482ba3f5aefe4576acc6500000000000000000000000089e42b5b59dbc160bd1482ba3f5aefe4576acc65000000000000000000000000000000000000000000000000000009184e72a00000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -15842,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec34000000000000000000000000d009413e55d4ec3723ef2e187a0fe2eab355cb57000000000000000000000000d009413e55d4ec3723ef2e187a0fe2eab355cb57000000000000000000000000000000000000000000000000000009184e72a00000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -15843,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec34000000000000000000000000243afda220b03bf3d3f8b8efde80d0acf4eb7918000000000000000000000000243afda220b03bf3d3f8b8efde80d0acf4eb7918000000000000000000000000000000000000000000000000000009184e72a00000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -15844,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec34000000000000000000000000d10ebb8f2eb9f42a4601c15d0c5ae0fcaf341338000000000000000000000000d10ebb8f2eb9f42a4601c15d0c5ae0fcaf341338000000000000000000000000000000000000000000000000000009184e72a00000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -15845,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec34000000000000000000000000d2f3ac06205b33f50d9573fd52a1f245bce87489000000000000000000000000d2f3ac06205b33f50d9573fd52a1f245bce87489000000000000000000000000000000000000000000000000000009184e72a00000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -15846,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec34000000000000000000000000199d03d61a91f44111156af6685e66df4b5cc47b000000000000000000000000199d03d61a91f44111156af6685e66df4b5cc47b000000000000000000000000000000000000000000000000000009184e72a00000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -15847,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec340000000000000000000000007dc04be3f84c761b7143f078dd8fa54b8e03de920000000000000000000000007dc04be3f84c761b7143f078dd8fa54b8e03de92000000000000000000000000000000000000000000000000000009184e72a00000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -15848,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec3400000000000000000000000096e61138134ad5aa24c00c6ede503614d0292df900000000000000000000000096e61138134ad5aa24c00c6ede503614d0292df9000000000000000000000000000000000000000000000000000009184e72a00000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -15849,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec34000000000000000000000000cf0e9234c9450e97b40a489c3911df26c3448ca9000000000000000000000000cf0e9234c9450e97b40a489c3911df26c3448ca9000000000000000000000000000000000000000000000000000009184e72a00000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -15850,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec34000000000000000000000000eea00ea19d3802ae07516afbc49a8a0a522db8fc000000000000000000000000eea00ea19d3802ae07516afbc49a8a0a522db8fc000000000000000000000000000000000000000000000000000009184e72a00000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -15851,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec34000000000000000000000000dfba4da6ff1c6ef56797914995b88d6d003ce3af000000000000000000000000dfba4da6ff1c6ef56797914995b88d6d003ce3af000000000000000000000000000000000000000000000000000009184e72a00000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -15852,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec34000000000000000000000000a6f898fab08a131a54b39495c0ef5aba32a66bcc000000000000000000000000a6f898fab08a131a54b39495c0ef5aba32a66bcc000000000000000000000000000000000000000000000000000009184e72a00000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -15853,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec3400000000000000000000000005bcc4977d9de3c95cdd3599dd8821dc826ef7fd00000000000000000000000005bcc4977d9de3c95cdd3599dd8821dc826ef7fd000000000000000000000000000000000000000000000000000009184e72a00000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -15854,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec34000000000000000000000000dbad2c166e00f8b6e73a0956278aca5a80d0fd83000000000000000000000000dbad2c166e00f8b6e73a0956278aca5a80d0fd83000000000000000000000000000000000000000000000000000009184e72a00000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -15855,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec3400000000000000000000000046b1162cf45ea72aafdd963c179cb1f9ed5391fe00000000000000000000000046b1162cf45ea72aafdd963c179cb1f9ed5391fe000000000000000000000000000000000000000000000000000009184e72a00000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -15856,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec34000000000000000000000000803c1791bec1f1bba4c78e5e3425f00f15200d2d000000000000000000000000803c1791bec1f1bba4c78e5e3425f00f15200d2d000000000000000000000000000000000000000000000000000009184e72a00000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -15857,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec340000000000000000000000007670b2f86766c079e411dd64b4f8634cca1030590000000000000000000000007670b2f86766c079e411dd64b4f8634cca103059000000000000000000000000000000000000000000000000000009184e72a00000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -15858,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec34000000000000000000000000c7d4c3b00bfa97d52087b4c15c0076d3c4a072fe000000000000000000000000c7d4c3b00bfa97d52087b4c15c0076d3c4a072fe000000000000000000000000000000000000000000000000000009184e72a00000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -15859,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec3400000000000000000000000037a841d75d87e4250fb5ae2f693bbc98c118975100000000000000000000000037a841d75d87e4250fb5ae2f693bbc98c1189751000000000000000000000000000000000000000000000000000009184e72a00000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -15860,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec34000000000000000000000000f191e949bb5da90e65c2ced253c7bbc4d709e4fe000000000000000000000000f191e949bb5da90e65c2ced253c7bbc4d709e4fe000000000000000000000000000000000000000000000000000009184e72a00000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -15861,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec34000000000000000000000000c1d9b182c0541d580e1fc536f6ee3a6e5b9a3bcd000000000000000000000000c1d9b182c0541d580e1fc536f6ee3a6e5b9a3bcd000000000000000000000000000000000000000000000000000009184e72a00000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -15862,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec34000000000000000000000000aae4513607ef680fab45679d81f47416eb445fac000000000000000000000000aae4513607ef680fab45679d81f47416eb445fac000000000000000000000000000000000000000000000000000009184e72a00000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -15864,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec34000000000000000000000000d07cda4e8441e11f34124dcddb65ba4e19c6dbb7000000000000000000000000d07cda4e8441e11f34124dcddb65ba4e19c6dbb7000000000000000000000000000000000000000000000000000009184e72a00000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -15865,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec34000000000000000000000000ed2242ff55ad0dec702c7dbac1cb22d61a42af7a000000000000000000000000ed2242ff55ad0dec702c7dbac1cb22d61a42af7a000000000000000000000000000000000000000000000000000009184e72a00000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -15866,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec340000000000000000000000009a1f36d8111fd8ad9a6d48f192884851876579bf0000000000000000000000009a1f36d8111fd8ad9a6d48f192884851876579bf000000000000000000000000000000000000000000000000000009184e72a00000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -15867,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec34000000000000000000000000232059053a33df592a159749979667acb54dbd34000000000000000000000000232059053a33df592a159749979667acb54dbd34000000000000000000000000000000000000000000000000000009184e72a00000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -15868,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec340000000000000000000000003389c4b2524b528ec068b1e62975b52a434310330000000000000000000000003389c4b2524b528ec068b1e62975b52a43431033000000000000000000000000000000000000000000000000000009184e72a00000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -15869,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec34000000000000000000000000ae4629ef6d42ecfa16199972ec7ba53a1803ee7b000000000000000000000000ae4629ef6d42ecfa16199972ec7ba53a1803ee7b000000000000000000000000000000000000000000000000000009184e72a00000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -15870,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec34000000000000000000000000529c9c42799d2c83ac1999937f36e0bdfecab4cf000000000000000000000000529c9c42799d2c83ac1999937f36e0bdfecab4cf000000000000000000000000000000000000000000000000000009184e72a00000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -15871,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec34000000000000000000000000dd7cdd38ca6354f5c1438c12ed0c2b4eed7dd1c1000000000000000000000000dd7cdd38ca6354f5c1438c12ed0c2b4eed7dd1c1000000000000000000000000000000000000000000000000000009184e72a00000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -15872,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec34000000000000000000000000707436e5148045c5b8b468bd28a3ce3c1c709a70000000000000000000000000707436e5148045c5b8b468bd28a3ce3c1c709a70000000000000000000000000000000000000000000000000000009184e72a00000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -15873,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec34000000000000000000000000e51ab0fe5af399bf1d4954e3b832b61c4bad4d27000000000000000000000000e51ab0fe5af399bf1d4954e3b832b61c4bad4d27000000000000000000000000000000000000000000000000000009184e72a00000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -15874,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec340000000000000000000000004420aea1d680bb28e137a24b06865500bdee48250000000000000000000000004420aea1d680bb28e137a24b06865500bdee4825000000000000000000000000000000000000000000000000000009184e72a00000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -15875,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec34000000000000000000000000f42b50e4bf895d12bcc2e0def2de33d87e3f4e84000000000000000000000000f42b50e4bf895d12bcc2e0def2de33d87e3f4e84000000000000000000000000000000000000000000000000000009184e72a00000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -15876,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec34000000000000000000000000fc873f545dbcbdb12796d3a7b1c5d9f8703460cd000000000000000000000000fc873f545dbcbdb12796d3a7b1c5d9f8703460cd000000000000000000000000000000000000000000000000000009184e72a00000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -15877,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec340000000000000000000000001ae33d484e2f076adf88ae8515500dcda78a35140000000000000000000000001ae33d484e2f076adf88ae8515500dcda78a3514000000000000000000000000000000000000000000000000000009184e72a00000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -15878,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec3400000000000000000000000038592eef244ea6699b2d05e30235c9483b775efe00000000000000000000000038592eef244ea6699b2d05e30235c9483b775efe000000000000000000000000000000000000000000000000000009184e72a00000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -15879,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec34000000000000000000000000787bb66c3f729bf35e777dfa2078511879ed27f4000000000000000000000000787bb66c3f729bf35e777dfa2078511879ed27f4000000000000000000000000000000000000000000000000000009184e72a00000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -15880,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec340000000000000000000000008338190e4886d154b5fb3da346c541899b4d401c0000000000000000000000008338190e4886d154b5fb3da346c541899b4d401c000000000000000000000000000000000000000000000000000009184e72a00000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -15881,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec34000000000000000000000000d7fe0171db5e7faeb4413122322b2ecae7430013000000000000000000000000d7fe0171db5e7faeb4413122322b2ecae7430013000000000000000000000000000000000000000000000000000009184e72a00000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -15882,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec340000000000000000000000003998f7679d637f55b83d14eaf34d2e3969e835240000000000000000000000003998f7679d637f55b83d14eaf34d2e3969e83524000000000000000000000000000000000000000000000000000009184e72a00000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -15883,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec34000000000000000000000000d8eec416ff747c2b0adfd93763c8dfc4b12ef8aa000000000000000000000000d8eec416ff747c2b0adfd93763c8dfc4b12ef8aa000000000000000000000000000000000000000000000000000009184e72a00000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -15884,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec34000000000000000000000000159da56108df786465591fdd7d9a702e20d60040000000000000000000000000159da56108df786465591fdd7d9a702e20d60040000000000000000000000000000000000000000000000000000009184e72a00000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -15885,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec340000000000000000000000000c24be493aee47664fe9814e1dcefbf5f01e661f0000000000000000000000000c24be493aee47664fe9814e1dcefbf5f01e661f000000000000000000000000000000000000000000000000000009184e72a00000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -15886,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec340000000000000000000000003bef62261ac99af57d487981356a52085acee01c0000000000000000000000003bef62261ac99af57d487981356a52085acee01c000000000000000000000000000000000000000000000000000009184e72a00000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -15887,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec34000000000000000000000000534b386f0cdf96cce3ecdb64cf756dcc0a8ae3de000000000000000000000000534b386f0cdf96cce3ecdb64cf756dcc0a8ae3de000000000000000000000000000000000000000000000000000009184e72a00000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -15888,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec340000000000000000000000009dda4fddf4ff734906fb8d5c62f0e8d25bacf6bc0000000000000000000000009dda4fddf4ff734906fb8d5c62f0e8d25bacf6bc000000000000000000000000000000000000000000000000000009184e72a00000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -15889,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec34000000000000000000000000021edb0df93524cbe1583e301966ba2a6242e899000000000000000000000000021edb0df93524cbe1583e301966ba2a6242e899000000000000000000000000000000000000000000000000000009184e72a00000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -15890,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec340000000000000000000000008f20463f65aa8bc812dc646cea23a9a836aa776c0000000000000000000000008f20463f65aa8bc812dc646cea23a9a836aa776c000000000000000000000000000000000000000000000000000009184e72a00000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -15891,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec340000000000000000000000007dc3237c4493a36f9161b15c6a3b9f9f9508029d0000000000000000000000007dc3237c4493a36f9161b15c6a3b9f9f9508029d000000000000000000000000000000000000000000000000000009184e72a00000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -15892,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec340000000000000000000000008fa9bb98ff760943a0cd142db51bb0d3bbcf78870000000000000000000000008fa9bb98ff760943a0cd142db51bb0d3bbcf7887000000000000000000000000000000000000000000000000000009184e72a00000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -15893,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec3400000000000000000000000052b376dcde73a992a86b1b93e93f71d2e3d06e9a00000000000000000000000052b376dcde73a992a86b1b93e93f71d2e3d06e9a000000000000000000000000000000000000000000000000000009184e72a00000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -15894,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec34000000000000000000000000da84d6eeb8247262bcbd5512fd9ce457209a75cd000000000000000000000000da84d6eeb8247262bcbd5512fd9ce457209a75cd000000000000000000000000000000000000000000000000000009184e72a00000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -15895,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec34000000000000000000000000438328b257d6c4c597dccdcb21697fcc638ac797000000000000000000000000438328b257d6c4c597dccdcb21697fcc638ac797000000000000000000000000000000000000000000000000000009184e72a00000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -15896,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec34000000000000000000000000d9ed82fd90560924d9f2f0ac0540ba9111fefe50000000000000000000000000d9ed82fd90560924d9f2f0ac0540ba9111fefe50000000000000000000000000000000000000000000000000000009184e72a00000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -15897,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec34000000000000000000000000f42bcf8fc4ba23eb5fd2a0d4c34522408df27dfe000000000000000000000000f42bcf8fc4ba23eb5fd2a0d4c34522408df27dfe000000000000000000000000000000000000000000000000000009184e72a00000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -15898,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec340000000000000000000000005ca1634f79f523a5a2b20da5d8b60ff8c5d9bf7f0000000000000000000000005ca1634f79f523a5a2b20da5d8b60ff8c5d9bf7f000000000000000000000000000000000000000000000000000009184e72a00000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -15899,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0xa9f9e675000000000000000000000000dac17f958d2ee523a2206206994597c13d831ec700000000000000000000000094b008aa00579c1307b0ef2c499ad98a8ce58e58000000000000000000000000755a2ae169bc0af03f2184df040793d770592ce9000000000000000000000000755a2ae169bc0af03f2184df040793d770592ce900000000000000000000000000000000000000000000000000000000000f695000000000000000000000000000000000000000000000000000000000000000c00000000000000000000000000000000000000000000000000000000000000000,,,1,true -15902,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec340000000000000000000000009a333f0f29cab0fdd9c53bce5394e4171bc314c30000000000000000000000009a333f0f29cab0fdd9c53bce5394e4171bc314c300000000000000000000000000000000000000000000000000588e3b09c2b2d300000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -15904,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec340000000000000000000000005b77249d67d9a40cc6a192cd9167e9e7ee8458bb0000000000000000000000005b77249d67d9a40cc6a192cd9167e9e7ee8458bb00000000000000000000000000000000000000000000000000f34fbe4590a6eb00000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -15906,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec34000000000000000000000000d321da0925318aa4b5d81e01c90e397f9461ea5d000000000000000000000000d321da0925318aa4b5d81e01c90e397f9461ea5d0000000000000000000000000000000000000000000000000082c5aa14df9cac00000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -15909,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec3400000000000000000000000000066ac5489afafa35b83819c8999b0c610958de00000000000000000000000000066ac5489afafa35b83819c8999b0c610958de000000000000000000000000000000000000000000000000012b8612256e390000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -15912,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec34000000000000000000000000e142e84c1b6edd4858a81999352d8af9a767521b000000000000000000000000e142e84c1b6edd4858a81999352d8af9a767521b000000000000000000000000000000000000000000000000000ef035c0786dc000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -15913,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec340000000000000000000000000ed5ac934bdbe04ea6d7fca1a9bacceb2d23ff1f0000000000000000000000000ed5ac934bdbe04ea6d7fca1a9bacceb2d23ff1f00000000000000000000000000000000000000000000000006e4de8120cdd84f00000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -15914,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec3400000000000000000000000055d891fa80809d30d650875d00b903c19e090aa000000000000000000000000055d891fa80809d30d650875d00b903c19e090aa0000000000000000000000000000000000000000000000000001e6e9fc4cdd98000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -15916,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec340000000000000000000000005225d258185f2c5dbcdc5ca0eb2bd251941a32fc0000000000000000000000005225d258185f2c5dbcdc5ca0eb2bd251941a32fc0000000000000000000000000000000000000000000000000032184b66b6d73d00000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -15917,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0xa9f9e675000000000000000000000000dac17f958d2ee523a2206206994597c13d831ec700000000000000000000000094b008aa00579c1307b0ef2c499ad98a8ce58e580000000000000000000000001acb8d661018ac209fab4c099cabffb37d73b74e0000000000000000000000001acb8d661018ac209fab4c099cabffb37d73b74e00000000000000000000000000000000000000000000000000000000000f695000000000000000000000000000000000000000000000000000000000000000c00000000000000000000000000000000000000000000000000000000000000000,,,1,true -15918,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec34000000000000000000000000d76d58e63a0c91b8914268902ec3dcd2d7101a32000000000000000000000000d76d58e63a0c91b8914268902ec3dcd2d7101a32000000000000000000000000000000000000000000000000005b7706e42d0b0200000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -15921,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec34000000000000000000000000de2e6020bcba5241ef81a588201713617759d4d1000000000000000000000000de2e6020bcba5241ef81a588201713617759d4d10000000000000000000000000000000000000000000000000052423101ba288e00000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -15923,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0xa9f9e675000000000000000000000000dac17f958d2ee523a2206206994597c13d831ec700000000000000000000000094b008aa00579c1307b0ef2c499ad98a8ce58e58000000000000000000000000436e4cf5f7e9f10195feec6a427f4821e844941d000000000000000000000000436e4cf5f7e9f10195feec6a427f4821e844941d00000000000000000000000000000000000000000000000000000000000f906000000000000000000000000000000000000000000000000000000000000000c00000000000000000000000000000000000000000000000000000000000000000,,,1,true -15924,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec3400000000000000000000000041cc4a3fe2227953da7eadecd77e366d2cda886600000000000000000000000041cc4a3fe2227953da7eadecd77e366d2cda88660000000000000000000000000000000000000000000000000000aea9bcc9120000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -15925,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec340000000000000000000000000139dde62bccc5bc1bf1eea7c74b91f44c58f71e0000000000000000000000000139dde62bccc5bc1bf1eea7c74b91f44c58f71e00000000000000000000000000000000000000000000000003b1a228ac46272b00000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,0xc78c3d6a724909c10a96f5dc414b1a7b3638276d899b7c67319d7ba008ad66cf,2022-05-21 11:35:00.000 UTC,0,true -15926,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0xa9f9e675000000000000000000000000dac17f958d2ee523a2206206994597c13d831ec700000000000000000000000094b008aa00579c1307b0ef2c499ad98a8ce58e580000000000000000000000002c2b24aa09c427ef9b61a83977832f0c7cb651b90000000000000000000000002c2b24aa09c427ef9b61a83977832f0c7cb651b900000000000000000000000000000000000000000000000000000000000fb77000000000000000000000000000000000000000000000000000000000000000c00000000000000000000000000000000000000000000000000000000000000000,,,1,true -15927,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec3400000000000000000000000058c58d02323af6659e8d94fe3feb14385503a8f900000000000000000000000058c58d02323af6659e8d94fe3feb14385503a8f90000000000000000000000000000000000000000000000000069666e7b6c0e8a00000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -15928,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0xa9f9e675000000000000000000000000dac17f958d2ee523a2206206994597c13d831ec700000000000000000000000094b008aa00579c1307b0ef2c499ad98a8ce58e58000000000000000000000000a55e48aab1d2eef88b6ad40c0663654c690c7750000000000000000000000000a55e48aab1d2eef88b6ad40c0663654c690c775000000000000000000000000000000000000000000000000000000000000fb77000000000000000000000000000000000000000000000000000000000000000c00000000000000000000000000000000000000000000000000000000000000000,,,1,true -15929,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec340000000000000000000000003e673ba53ae04d4d56c13621c60307cf3140fbb20000000000000000000000003e673ba53ae04d4d56c13621c60307cf3140fbb20000000000000000000000000000000000000000000000000159cbb6584cde4e00000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -15930,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec340000000000000000000000006e3faef6489ed6eb32844ee25514fe11a33f831c0000000000000000000000006e3faef6489ed6eb32844ee25514fe11a33f831c00000000000000000000000000000000000000000000000003af28f55dc0e27600000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,0x50e0d358ea9f1426623fdffdcaa5d0d8e56a08bf90c6c1face5b1a2f510c5ee1,2022-05-21 11:41:16.000 UTC,0,true -15931,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec340000000000000000000000003d1e52920476844c1d4f5b59d2796c535d41d75a0000000000000000000000003d1e52920476844c1d4f5b59d2796c535d41d75a00000000000000000000000000000000000000000000000001c390b7f5f0a89400000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,0xe2cb4618fe21af99ae30176093188cecb624e4ac5ecbde8561c5fffb65a1fda0,2022-02-25 11:31:20.000 UTC,0,true -15932,0x10e6593cdda8c58a1d0f14c5164b376352a55f2f,0x467194771dae2967aef3ecbedd3bf9a310c76c65,0xa9f9e6750000000000000000000000006b175474e89094c44da98b954eedeac495271d0f000000000000000000000000da10009cbd5d07dd0cecc66161fc93d7c9000da1000000000000000000000000a06c9cf8608b43c987ccc3a782bfb3ea4d30ce6a000000000000000000000000a06c9cf8608b43c987ccc3a782bfb3ea4d30ce6a000000000000000000000000000000000000000000000020827c8928d04dd03900000000000000000000000000000000000000000000000000000000000000c00000000000000000000000000000000000000000000000000000000000000000,0x1cebb49b08faf8b6e1c1e134fb43277d7db956d6d92d517e6412b6cb6c1a0a8d,2021-12-15 07:46:14.000 UTC,0,true -15934,0xcd9d4988c0ae61887b075ba77f08cbfad2b65068,0x3f87ff1de58128ef8fcb4c807efd776e1ac72e51,0xf4f7b41a000000000000000000000000f1ca045e8b77eb2c62b9c0e60708ce6fe54d4a570000000000000000000000000000000000000000000000005d0b7933c847594b,,,1,true -15935,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec34000000000000000000000000fd95878137bba373c2951652fe189190383247d6000000000000000000000000fd95878137bba373c2951652fe189190383247d60000000000000000000000000000000000000000000000000033706af1963b6700000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -15936,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec34000000000000000000000000ec1f704da3a038bc34371e672ba3ce3c632612fd000000000000000000000000ec1f704da3a038bc34371e672ba3ce3c632612fd00000000000000000000000000000000000000000000000003b96dc2c343076d00000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,0xdf63413ff328eb15df265d29ba6e39d7b2f3c14cd8c620bf4e4615d519aa9119,2022-05-21 11:44:56.000 UTC,0,true -15938,0xcd9d4988c0ae61887b075ba77f08cbfad2b65068,0x3f87ff1de58128ef8fcb4c807efd776e1ac72e51,0xf4f7b41a0000000000000000000000004164e19bf327a773b146cde403755660ad4ac55d000000000000000000000000000000000000000000000000196c0a0c57500f05,,,1,true -15939,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec340000000000000000000000007cfc810c14b69559f88b1ba82469a78311213fb50000000000000000000000007cfc810c14b69559f88b1ba82469a78311213fb500000000000000000000000000000000000000000000000000cf75edf5b21a4800000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,0xb518ca78f0f98553e1b033ac7111a3eb9ebe7d49e1b7ae99d4cc05c779e2e8d4,2022-03-19 06:10:45.000 UTC,0,true -15941,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec3400000000000000000000000087cb43594556ff576841b5db05641c895d87545e00000000000000000000000087cb43594556ff576841b5db05641c895d87545e000000000000000000000000000000000000000000000000002781820fbd827000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -15943,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec34000000000000000000000000ae8e2b4abb13de393515ef5abad7e35a2b11ba6d000000000000000000000000ae8e2b4abb13de393515ef5abad7e35a2b11ba6d000000000000000000000000000000000000000000000000013fbe85edc9000000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,0x0ac02717900528a7cb4863ad38f268437aa0b8b318c48fcec696fba95a9d1bd7,2022-05-25 06:42:26.000 UTC,0,true -15953,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec340000000000000000000000004e5caa02cd1d0ae5d670625d36b5a50d3e226a260000000000000000000000004e5caa02cd1d0ae5d670625d36b5a50d3e226a260000000000000000000000000000000000000000000000000254bd05bdefe0eb00000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -15957,0xcd9d4988c0ae61887b075ba77f08cbfad2b65068,0x3f87ff1de58128ef8fcb4c807efd776e1ac72e51,0xf4f7b41a000000000000000000000000171c1cf42c8e11589381f5e4846ffe4e2c7f6d95000000000000000000000000000000000000000000000000378500fe00f039e5,0x341c156f425e1e839ddafa962d42fc8f8b71e92f264528dfeb3f894df7a0cd11,2022-03-05 10:02:12.000 UTC,0,true -15960,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec3400000000000000000000000065fc8c391d7d258d01963825f619e725ac2a335f00000000000000000000000065fc8c391d7d258d01963825f619e725ac2a335f00000000000000000000000000000000000000000000000000b1a2bc2ec5000000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -15963,0xcd9d4988c0ae61887b075ba77f08cbfad2b65068,0x3f87ff1de58128ef8fcb4c807efd776e1ac72e51,0xf4f7b41a0000000000000000000000000f6dada0db6430d58c16207a9ba33015cc72635a0000000000000000000000000000000000000000000000027e60d44813f80000,,,1,true -15965,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec34000000000000000000000000a76d60c6b02f070b9fd631976e8d253b39cb1f56000000000000000000000000a76d60c6b02f070b9fd631976e8d253b39cb1f56000000000000000000000000000000000000000000000000008c065d97869e1900000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -15968,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec34000000000000000000000000a8e7d3078ac3020f6a8e597a165f161424c041fe000000000000000000000000a8e7d3078ac3020f6a8e597a165f161424c041fe0000000000000000000000000000000000000000000000000062a06d9f12eb3600000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -15969,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec340000000000000000000000004fdd8fc4d2b5a3ef49af517ef747d9f1c67108910000000000000000000000004fdd8fc4d2b5a3ef49af517ef747d9f1c6710891000000000000000000000000000000000000000000000000036f2ba6cad09d1f00000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,0x5516482a0bd4f4cd5870d9dc23681aa3a379dad92044d2c0601a0e98e11be69a,2022-05-08 20:39:21.000 UTC,0,true -15971,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec340000000000000000000000001098071bad894f3cce4dabc93cff9da3f6464c5e0000000000000000000000001098071bad894f3cce4dabc93cff9da3f6464c5e000000000000000000000000000000000000000000000000002ffccb297ee8d900000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -15972,0x10e6593cdda8c58a1d0f14c5164b376352a55f2f,0x467194771dae2967aef3ecbedd3bf9a310c76c65,0xa9f9e6750000000000000000000000006b175474e89094c44da98b954eedeac495271d0f000000000000000000000000da10009cbd5d07dd0cecc66161fc93d7c9000da1000000000000000000000000c948402983ed80bc79fe5e8c240779582d68d08a000000000000000000000000c948402983ed80bc79fe5e8c240779582d68d08a0000000000000000000000000000000000000000000000019feb44e0c8d2819700000000000000000000000000000000000000000000000000000000000000c00000000000000000000000000000000000000000000000000000000000000000,,,1,true -15973,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0xa9f9e675000000000000000000000000a0b86991c6218b36c1d19d4a2e9eb0ce3606eb480000000000000000000000007f5c764cbc14f9669b88837ca1490cca17c31607000000000000000000000000ff6bb7a7688f2a8b548d13212c65ec50ea918b4d000000000000000000000000ff6bb7a7688f2a8b548d13212c65ec50ea918b4d0000000000000000000000000000000000000000000000000000000000e737e300000000000000000000000000000000000000000000000000000000000000c00000000000000000000000000000000000000000000000000000000000000000,,,1,true -15974,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec34000000000000000000000000a563af28d54d8f2a81c33d5a3e4f8a76ceb1fdc9000000000000000000000000a563af28d54d8f2a81c33d5a3e4f8a76ceb1fdc90000000000000000000000000000000000000000000000000008e1bc9bf0400000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -15975,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec340000000000000000000000000952ecc0080ed9a0cbd5839a3cc6758b85c3a8350000000000000000000000000952ecc0080ed9a0cbd5839a3cc6758b85c3a835000000000000000000000000000000000000000000000000027536093001bf3c00000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -15976,0xcd9d4988c0ae61887b075ba77f08cbfad2b65068,0x3f87ff1de58128ef8fcb4c807efd776e1ac72e51,0xf4f7b41a000000000000000000000000c8e4b7b34befdc23007f13925a5c10e1b1c4729d0000000000000000000000000000000000000000000000002f2f39fc6c540000,,,1,true -15977,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec34000000000000000000000000fc9c451d7d58422c3734508c038bf9e608c214bf000000000000000000000000fc9c451d7d58422c3734508c038bf9e608c214bf0000000000000000000000000000000000000000000000000035de8800dbfb4000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -15978,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0xa9f9e675000000000000000000000000a0b86991c6218b36c1d19d4a2e9eb0ce3606eb480000000000000000000000007f5c764cbc14f9669b88837ca1490cca17c316070000000000000000000000002f3d886584cc4f9089c579b4877824975f8f217d0000000000000000000000002f3d886584cc4f9089c579b4877824975f8f217d000000000000000000000000000000000000000000000000000000000f735fc100000000000000000000000000000000000000000000000000000000000000c00000000000000000000000000000000000000000000000000000000000000000,,,1,true -15979,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec3400000000000000000000000083d9948019e680f3514866e5a5c16f2eaae140a800000000000000000000000083d9948019e680f3514866e5a5c16f2eaae140a800000000000000000000000000000000000000000000000005aa592c6ff8423800000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -15981,0xcd9d4988c0ae61887b075ba77f08cbfad2b65068,0x3f87ff1de58128ef8fcb4c807efd776e1ac72e51,0xf4f7b41a0000000000000000000000004e6fdce9b676c44b2c5e8800327e923696ddc62900000000000000000000000000000000000000000000001978b1bf4a3dfda8b2,0x28abf05c2c1b5e5bd886dcbbae773f6f105aea83717366dccc5094ca4497e813,2021-11-22 15:20:13.000 UTC,0,true -15982,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec34000000000000000000000000909c9406808f89b88b277d099c11d36283eb66f9000000000000000000000000909c9406808f89b88b277d099c11d36283eb66f900000000000000000000000000000000000000000000000000350cf6d42889f400000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -15985,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0xa9f9e675000000000000000000000000a0b86991c6218b36c1d19d4a2e9eb0ce3606eb480000000000000000000000007f5c764cbc14f9669b88837ca1490cca17c316070000000000000000000000001627902c8aa6572894ce678d0703ead3dbf74d5e0000000000000000000000001627902c8aa6572894ce678d0703ead3dbf74d5e00000000000000000000000000000000000000000000000000000000180946bc00000000000000000000000000000000000000000000000000000000000000c00000000000000000000000000000000000000000000000000000000000000000,0x3b51aec0829c0649dbdc4f2a5a9496db858eca943ab1d5c6bdb6ff4cfa51559e,2022-03-25 08:17:06.000 UTC,0,true -15987,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec34000000000000000000000000c61221b53a52fb48a6d5515681169da0612870d5000000000000000000000000c61221b53a52fb48a6d5515681169da0612870d50000000000000000000000000000000000000000000000000d2df35200f7244300000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,0x42a1eced86b1c51ff542ebcd8238ce67e0f45b9361d8868ad2ea9aad71dedc70,2022-02-13 07:16:05.000 UTC,0,true -15990,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec3400000000000000000000000024f99023f6741b27d3bf6189c7f3ae2fa45eed8f00000000000000000000000024f99023f6741b27d3bf6189c7f3ae2fa45eed8f0000000000000000000000000000000000000000000000000d26ee616dc708b700000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,0x03c801b40061d1b451b75488a214616f823e9d30257ad52794a9db1f3ab4ff77,2021-12-10 08:02:27.000 UTC,0,true -15991,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec340000000000000000000000009215f9bb7c38a3013b108099fd5d4494731ce02b0000000000000000000000009215f9bb7c38a3013b108099fd5d4494731ce02b000000000000000000000000000000000000000000000000008493e920868ec800000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -15992,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec34000000000000000000000000a62fdf90dacc91d98de3f72ab4f1f5bef64e48ba000000000000000000000000a62fdf90dacc91d98de3f72ab4f1f5bef64e48ba0000000000000000000000000000000000000000000000000153ec22501c7d8000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -15993,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0xa9f9e675000000000000000000000000a0b86991c6218b36c1d19d4a2e9eb0ce3606eb480000000000000000000000007f5c764cbc14f9669b88837ca1490cca17c3160700000000000000000000000082fbf1a9789613c266420d2b5110c9747ad52fcd00000000000000000000000082fbf1a9789613c266420d2b5110c9747ad52fcd0000000000000000000000000000000000000000000000000000000003d675d300000000000000000000000000000000000000000000000000000000000000c00000000000000000000000000000000000000000000000000000000000000000,,,1,true -15994,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec340000000000000000000000006ae8c7bab2c4861ba5a451dfd4b4a83c06c2a7c80000000000000000000000006ae8c7bab2c4861ba5a451dfd4b4a83c06c2a7c8000000000000000000000000000000000000000000000000003b35a381d3a00000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,0xc96c00e608ea6d5c2a35b623e8a87c31c7c7ed66e2c74a35e6061651b4b70417,2022-03-13 15:28:23.000 UTC,0,true -15995,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec340000000000000000000000008e841ba5b89142c196af4695ef200c56afd0d0300000000000000000000000008e841ba5b89142c196af4695ef200c56afd0d0300000000000000000000000000000000000000000000000000c7acf39dc6c360000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,0x2171dc8ad3964ffeac86de8c4f5805bbebcb82141cd2ec1ae560633d91bd0d21,2021-12-01 18:08:34.000 UTC,0,true -15996,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec34000000000000000000000000407410d84e15f79642272edaeb437ac65d7298e6000000000000000000000000407410d84e15f79642272edaeb437ac65d7298e6000000000000000000000000000000000000000000000000001370737b15f91700000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -15997,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec34000000000000000000000000a221b6a586e11268f2cce4123481e01de48c2b4b000000000000000000000000a221b6a586e11268f2cce4123481e01de48c2b4b000000000000000000000000000000000000000000000000008b18751c8ca20000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -15998,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec34000000000000000000000000006f4250cb856f928c62743fe6925740e90e6d5c000000000000000000000000006f4250cb856f928c62743fe6925740e90e6d5c00000000000000000000000000000000000000000000000005d38fd67792a5b600000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -15999,0xcd9d4988c0ae61887b075ba77f08cbfad2b65068,0x3f87ff1de58128ef8fcb4c807efd776e1ac72e51,0xf4f7b41a0000000000000000000000008a18a9dcbe1abf8cedd4781c10fb90fc5c28e4a50000000000000000000000000000000000000000000000018696417a3da0ec8b,,,1,true -16001,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec34000000000000000000000000ac8ad678b3ab523056c4c82f94d466ee778e373b000000000000000000000000ac8ad678b3ab523056c4c82f94d466ee778e373b00000000000000000000000000000000000000000000000000a941ced1366d2300000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -16003,0xcd9d4988c0ae61887b075ba77f08cbfad2b65068,0x3f87ff1de58128ef8fcb4c807efd776e1ac72e51,0xf4f7b41a00000000000000000000000043e4f031f795dcafd662ce097f53b5f908f39dc8000000000000000000000000000000000000000000000001bedafd7d055a9e15,0xca895f5cc0cb74950e32b7c08d55e7ecd6cc83eb7994f9f1961bcf69dae66bfd,2021-12-13 13:07:25.000 UTC,0,true -16006,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec3400000000000000000000000024749aedf18208ab74a8110e07e820286bb5acf800000000000000000000000024749aedf18208ab74a8110e07e820286bb5acf8000000000000000000000000000000000000000000000000006478fe5b8808fb00000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,0x7945f9a872671d217fe89785593d745eaa09e432e9b938aa1400e353f775a8a8,2022-05-28 03:24:12.000 UTC,0,true -16007,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec3400000000000000000000000063a6b026eff8f1abdab941cc0d18c5bb408e53e400000000000000000000000063a6b026eff8f1abdab941cc0d18c5bb408e53e400000000000000000000000000000000000000000000000000012bf0fe947c0000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -16008,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec3400000000000000000000000073b968d104cb550f4e28543a52ff7357b20c746800000000000000000000000073b968d104cb550f4e28543a52ff7357b20c746800000000000000000000000000000000000000000000000000070aca1038c8c200000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -16010,0xcd9d4988c0ae61887b075ba77f08cbfad2b65068,0x3f87ff1de58128ef8fcb4c807efd776e1ac72e51,0xf4f7b41a00000000000000000000000051c1e9bed89903e924611fa3c557b2827981848f000000000000000000000000000000000000000000000004d92c64a9dc61c669,0x63271b09fa2bd266ccd676d8a7f1b4ab16ac162db6d746de2140b694a001b358,2021-11-29 06:04:58.000 UTC,0,true -16011,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec34000000000000000000000000934c6cbc9e0266dd266e35fa16540a2422fff889000000000000000000000000934c6cbc9e0266dd266e35fa16540a2422fff88900000000000000000000000000000000000000000000000001aa535d3d0c000000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -16013,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec34000000000000000000000000880807ca35b45f007854e0e834a605e397354f42000000000000000000000000880807ca35b45f007854e0e834a605e397354f42000000000000000000000000000000000000000000000000037465ffeb24810700000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,0x199c1bc018f391d5ad61d0c35749fae330519a0917e26ea987f89d8072009581,2022-06-28 06:55:24.000 UTC,0,true -16015,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec34000000000000000000000000729b81511ebba7c95f6f43a5e3b778f40772f622000000000000000000000000729b81511ebba7c95f6f43a5e3b778f40772f622000000000000000000000000000000000000000000000000015fcf799b7b940000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -16017,0xcd9d4988c0ae61887b075ba77f08cbfad2b65068,0x3f87ff1de58128ef8fcb4c807efd776e1ac72e51,0xf4f7b41a000000000000000000000000fec958a68f2f46d67bf708f14badef9ab53c4e9200000000000000000000000000000000000000000000000ae401ad8ec9e75bd6,,,1,true -16018,0x10e6593cdda8c58a1d0f14c5164b376352a55f2f,0x467194771dae2967aef3ecbedd3bf9a310c76c65,0xa9f9e6750000000000000000000000006b175474e89094c44da98b954eedeac495271d0f000000000000000000000000da10009cbd5d07dd0cecc66161fc93d7c9000da1000000000000000000000000d7504409e859e84b126009c1a8a787b1475c8731000000000000000000000000d7504409e859e84b126009c1a8a787b1475c873100000000000000000000000000000000000000000000003635c9adc5dea0000000000000000000000000000000000000000000000000000000000000000000c00000000000000000000000000000000000000000000000000000000000000000,0xb0b919fee3625ba0475d8f38ef9d16a1847abe10dbc97b504cf24849882ff3bf,2021-12-05 13:47:50.000 UTC,0,true -16021,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0xa9f9e675000000000000000000000000dac17f958d2ee523a2206206994597c13d831ec700000000000000000000000094b008aa00579c1307b0ef2c499ad98a8ce58e58000000000000000000000000f4d6635a15f79d00700db4d8a40cc7baa655563d000000000000000000000000f4d6635a15f79d00700db4d8a40cc7baa655563d00000000000000000000000000000000000000000000000000000000b2d05e0000000000000000000000000000000000000000000000000000000000000000c00000000000000000000000000000000000000000000000000000000000000000,0x9a334505fe52575058c1fd5af523035b35e4593c65121ea01267b26af91774e3,2022-02-09 09:13:29.000 UTC,0,true -16022,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec340000000000000000000000004e538c32d73cc13610cb1fdc7191abc47be08ddd0000000000000000000000004e538c32d73cc13610cb1fdc7191abc47be08ddd000000000000000000000000000000000000000000000000008bf2e12306e90000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -16023,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec34000000000000000000000000784b90d1b653b12deb2352cf9fd18e7c780a9f8c000000000000000000000000784b90d1b653b12deb2352cf9fd18e7c780a9f8c0000000000000000000000000000000000000000000000000069212e2133ac1700000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -16024,0xcd9d4988c0ae61887b075ba77f08cbfad2b65068,0x3f87ff1de58128ef8fcb4c807efd776e1ac72e51,0xf4f7b41a000000000000000000000000f1ca045e8b77eb2c62b9c0e60708ce6fe54d4a570000000000000000000000000000000000000000000000000a021fcf4e4701fe,,,1,true -16025,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0xa9f9e675000000000000000000000000dac17f958d2ee523a2206206994597c13d831ec700000000000000000000000094b008aa00579c1307b0ef2c499ad98a8ce58e580000000000000000000000002646fd1cf53139c336db689ff104c6ce3ba9b18b0000000000000000000000002646fd1cf53139c336db689ff104c6ce3ba9b18b0000000000000000000000000000000000000000000000000000000008f7aa0800000000000000000000000000000000000000000000000000000000000000c00000000000000000000000000000000000000000000000000000000000000000,,,1,true -16026,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec34000000000000000000000000a345d187b9f4b68c0b3eedec152e8a1dd808d089000000000000000000000000a345d187b9f4b68c0b3eedec152e8a1dd808d0890000000000000000000000000000000000000000000000000057113f2731960000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -16027,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec34000000000000000000000000e87bfff3c69f58c8bf30f1b29bf11e60605780e1000000000000000000000000e87bfff3c69f58c8bf30f1b29bf11e60605780e1000000000000000000000000000000000000000000000000015d66b74d6909de00000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -16028,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec340000000000000000000000004e0515f80b238b785e8faae48cf0fa36b348b5e90000000000000000000000004e0515f80b238b785e8faae48cf0fa36b348b5e9000000000000000000000000000000000000000000000000001acba70d38060000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -16030,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec34000000000000000000000000d54e90597ec00914fa99c4fd62dda9d1924a2665000000000000000000000000d54e90597ec00914fa99c4fd62dda9d1924a26650000000000000000000000000000000000000000000000000069339071ca280000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -16031,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec34000000000000000000000000a6d1a769fa8232fcd858a9b4592d7ae2d6169bca000000000000000000000000a6d1a769fa8232fcd858a9b4592d7ae2d6169bca000000000000000000000000000000000000000000000000004b5e03fc7ccf8400000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -16032,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec340000000000000000000000009437be78cdca83cc83423fe85e734e49bea511e00000000000000000000000009437be78cdca83cc83423fe85e734e49bea511e00000000000000000000000000000000000000000000000000243c2293decf70e00000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -16035,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec34000000000000000000000000eaff78bc539dcc9b98e492f4e3bde6506f3ec238000000000000000000000000eaff78bc539dcc9b98e492f4e3bde6506f3ec2380000000000000000000000000000000000000000000000000154ff3827a91c3900000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -16036,0x10e6593cdda8c58a1d0f14c5164b376352a55f2f,0x467194771dae2967aef3ecbedd3bf9a310c76c65,0xa9f9e6750000000000000000000000006b175474e89094c44da98b954eedeac495271d0f000000000000000000000000da10009cbd5d07dd0cecc66161fc93d7c9000da1000000000000000000000000a0e4eccf02f9b83ee1f270c735751d602e88ea1e000000000000000000000000a0e4eccf02f9b83ee1f270c735751d602e88ea1e000000000000000000000000000000000000000000000007359bcae42b3a1f0400000000000000000000000000000000000000000000000000000000000000c00000000000000000000000000000000000000000000000000000000000000000,,,1,true -16041,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec340000000000000000000000003f748833f13f24c8872b4b83e14e63607df9ce8d0000000000000000000000003f748833f13f24c8872b4b83e14e63607df9ce8d000000000000000000000000000000000000000000000000057a3548e05c429700000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -16042,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0xa9f9e675000000000000000000000000dac17f958d2ee523a2206206994597c13d831ec700000000000000000000000094b008aa00579c1307b0ef2c499ad98a8ce58e580000000000000000000000004e0122cad4e35c83302a7fc3a402a215935f36070000000000000000000000004e0122cad4e35c83302a7fc3a402a215935f360700000000000000000000000000000000000000000000000000000000000fde8000000000000000000000000000000000000000000000000000000000000000c00000000000000000000000000000000000000000000000000000000000000000,,,1,true -16043,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0xa9f9e675000000000000000000000000dac17f958d2ee523a2206206994597c13d831ec700000000000000000000000094b008aa00579c1307b0ef2c499ad98a8ce58e5800000000000000000000000054656203833a6c6646c66acb3d246d96eb6bc34c00000000000000000000000054656203833a6c6646c66acb3d246d96eb6bc34c00000000000000000000000000000000000000000000000000000000000fc32800000000000000000000000000000000000000000000000000000000000000c00000000000000000000000000000000000000000000000000000000000000000,,,1,true -16044,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec34000000000000000000000000bbf8d46a69024593fcc0e692f1c0a2f38144ea84000000000000000000000000bbf8d46a69024593fcc0e692f1c0a2f38144ea8400000000000000000000000000000000000000000000000006ea53d65c36cfe300000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -16045,0xcd9d4988c0ae61887b075ba77f08cbfad2b65068,0x3f87ff1de58128ef8fcb4c807efd776e1ac72e51,0xf4f7b41a000000000000000000000000ae7bc2ecb4d293105cb0b21500b710eeb7ca83210000000000000000000000000000000000000000000000020abdd9bee328ebaf,,,1,true -16046,0xcd9d4988c0ae61887b075ba77f08cbfad2b65068,0x3f87ff1de58128ef8fcb4c807efd776e1ac72e51,0xf4f7b41a000000000000000000000000dbb94c392bd0c21c2e4a1e7005012ee9907a06a0000000000000000000000000000000000000000000000002e95aeb8850ef4265,,,1,true -16047,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec3400000000000000000000000046488b2cab4ba1406f6fa1d5827c8d16c1f5fdea00000000000000000000000046488b2cab4ba1406f6fa1d5827c8d16c1f5fdea000000000000000000000000000000000000000000000000001d8313405c0a0000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -16048,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec3400000000000000000000000049f63b254ea9043e57678c13e06aef257fab45c100000000000000000000000049f63b254ea9043e57678c13e06aef257fab45c1000000000000000000000000000000000000000000000000018431ef9971044000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,0x6c062bcb5317ff645cee0885db3d30bfcea05a02ffe1628db9fc983a061130be,2021-12-20 17:00:08.000 UTC,0,true -16049,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec340000000000000000000000004fe15e3b4e9f695d5712583c591ae52f1af616a10000000000000000000000004fe15e3b4e9f695d5712583c591ae52f1af616a1000000000000000000000000000000000000000000000000016fee38a5d9468900000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -16050,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0xa9f9e675000000000000000000000000dac17f958d2ee523a2206206994597c13d831ec700000000000000000000000094b008aa00579c1307b0ef2c499ad98a8ce58e5800000000000000000000000010fd37e98c79529ca2249ca6086971c6e92e549f00000000000000000000000010fd37e98c79529ca2249ca6086971c6e92e549f00000000000000000000000000000000000000000000000000000000000fb77000000000000000000000000000000000000000000000000000000000000000c00000000000000000000000000000000000000000000000000000000000000000,,,1,true -16051,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0xa9f9e675000000000000000000000000dac17f958d2ee523a2206206994597c13d831ec700000000000000000000000094b008aa00579c1307b0ef2c499ad98a8ce58e580000000000000000000000004e3b5a6c60c3f39d9ee4b8151348fd56aaceda080000000000000000000000004e3b5a6c60c3f39d9ee4b8151348fd56aaceda0800000000000000000000000000000000000000000000000000000000000f906000000000000000000000000000000000000000000000000000000000000000c00000000000000000000000000000000000000000000000000000000000000000,,,1,true -16053,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec340000000000000000000000005da70d2a1858a883b42d560edeb5a4ff4e7829fe0000000000000000000000005da70d2a1858a883b42d560edeb5a4ff4e7829fe0000000000000000000000000000000000000000000000000031cf2d28a336e100000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -16054,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec34000000000000000000000000f830726d6750b458bd10326a32bf53e7ffebda74000000000000000000000000f830726d6750b458bd10326a32bf53e7ffebda74000000000000000000000000000000000000000000000000096e2973de7221ad00000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -16055,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0xa9f9e675000000000000000000000000a0b86991c6218b36c1d19d4a2e9eb0ce3606eb480000000000000000000000007f5c764cbc14f9669b88837ca1490cca17c3160700000000000000000000000065935eeca6a9a5c9d5f3df0bd8341960b2516a5e00000000000000000000000065935eeca6a9a5c9d5f3df0bd8341960b2516a5e000000000000000000000000000000000000000000000000000000000a2b5cbc00000000000000000000000000000000000000000000000000000000000000c00000000000000000000000000000000000000000000000000000000000000000,,,1,true -16056,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0xa9f9e675000000000000000000000000dac17f958d2ee523a2206206994597c13d831ec700000000000000000000000094b008aa00579c1307b0ef2c499ad98a8ce58e58000000000000000000000000cc910f68502b40d2bcdfad952f34db8778426e5e000000000000000000000000cc910f68502b40d2bcdfad952f34db8778426e5e00000000000000000000000000000000000000000000000000000000000fb77000000000000000000000000000000000000000000000000000000000000000c00000000000000000000000000000000000000000000000000000000000000000,,,1,true -16058,0xcd9d4988c0ae61887b075ba77f08cbfad2b65068,0x3f87ff1de58128ef8fcb4c807efd776e1ac72e51,0xf4f7b41a000000000000000000000000ccf27f3dae039a4d2981fe0deb0621346ac9c58c0000000000000000000000000000000000000000000000003edaed08765ae042,,,1,true -16059,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec340000000000000000000000002e92a21b89b64de21f920acc875cd0b1e782c33c0000000000000000000000002e92a21b89b64de21f920acc875cd0b1e782c33c00000000000000000000000000000000000000000000000000ae153d89fe800000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,0xd392e158fee8aa4ec5de197aa32835f89ec4f8fd5e90ecf0f6d85aef09f647ff,2022-04-17 05:12:53.000 UTC,0,true -16060,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0xa9f9e675000000000000000000000000dac17f958d2ee523a2206206994597c13d831ec700000000000000000000000094b008aa00579c1307b0ef2c499ad98a8ce58e580000000000000000000000007bfc1a618783b32f57770d85c682fb04120858e70000000000000000000000007bfc1a618783b32f57770d85c682fb04120858e700000000000000000000000000000000000000000000000000000000000f906000000000000000000000000000000000000000000000000000000000000000c00000000000000000000000000000000000000000000000000000000000000000,,,1,true -16061,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec34000000000000000000000000dffa4c9d55d7b1a2dc8197718c48b593420b9399000000000000000000000000dffa4c9d55d7b1a2dc8197718c48b593420b939900000000000000000000000000000000000000000000000006de8f1fce81ec6700000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -16062,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0xa9f9e675000000000000000000000000dac17f958d2ee523a2206206994597c13d831ec700000000000000000000000094b008aa00579c1307b0ef2c499ad98a8ce58e58000000000000000000000000ffe9465c0458fdf8b8ad034aca2040324c3f9f02000000000000000000000000ffe9465c0458fdf8b8ad034aca2040324c3f9f020000000000000000000000000000000000000000000000000000000000102ca000000000000000000000000000000000000000000000000000000000000000c00000000000000000000000000000000000000000000000000000000000000000,,,1,true -16063,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec3400000000000000000000000045c155d926df6c2e66b0a3db407587d192affff600000000000000000000000045c155d926df6c2e66b0a3db407587d192affff60000000000000000000000000000000000000000000000000010c3b085fd494000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -16065,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec34000000000000000000000000b49883b3fe2aa3cdfaf9def7f3dba2816a681e16000000000000000000000000b49883b3fe2aa3cdfaf9def7f3dba2816a681e160000000000000000000000000000000000000000000000000032fdb6d4d2e90000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -16067,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0xa9f9e675000000000000000000000000dac17f958d2ee523a2206206994597c13d831ec700000000000000000000000094b008aa00579c1307b0ef2c499ad98a8ce58e580000000000000000000000009a36d5b3a4347a221efe23851ce7cb9745fea6ff0000000000000000000000009a36d5b3a4347a221efe23851ce7cb9745fea6ff0000000000000000000000000000000000000000000000000000000000102ca000000000000000000000000000000000000000000000000000000000000000c00000000000000000000000000000000000000000000000000000000000000000,,,1,true -16070,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec34000000000000000000000000f516ac25592ab08d6df0e6fdc934f14dad504369000000000000000000000000f516ac25592ab08d6df0e6fdc934f14dad5043690000000000000000000000000000000000000000000000000114809246492b3600000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,0xad4ede185325b2cf2420913e454233d44342f37c74d7b62954bd1a52af177f33,2022-05-21 13:54:23.000 UTC,0,true -16071,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec340000000000000000000000008894993046fa4c42816b3021de0bb1dabd5b0cd80000000000000000000000008894993046fa4c42816b3021de0bb1dabd5b0cd8000000000000000000000000000000000000000000000000014f796df858187200000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -16072,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0xa9f9e675000000000000000000000000dac17f958d2ee523a2206206994597c13d831ec700000000000000000000000094b008aa00579c1307b0ef2c499ad98a8ce58e5800000000000000000000000000ba7bdbdbd934320b8401646803ad939a4a9f3c00000000000000000000000000ba7bdbdbd934320b8401646803ad939a4a9f3c000000000000000000000000000000000000000000000000000000000010a1d000000000000000000000000000000000000000000000000000000000000000c00000000000000000000000000000000000000000000000000000000000000000,,,1,true -16073,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec3400000000000000000000000049ec1574f4e5f03d830bec6a9a4441e10dfed84d00000000000000000000000049ec1574f4e5f03d830bec6a9a4441e10dfed84d0000000000000000000000000000000000000000000000000214e8348c4f000000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,0x28eb1c15c650c6f9d26712fe2ffcf257b3f06138ff867421de20fb20b1c8a4d1,2021-12-21 10:49:55.000 UTC,0,true -16074,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0xa9f9e675000000000000000000000000dac17f958d2ee523a2206206994597c13d831ec700000000000000000000000094b008aa00579c1307b0ef2c499ad98a8ce58e580000000000000000000000008325bcbea40dbc59e4e9fe0e9ce41ca781db08880000000000000000000000008325bcbea40dbc59e4e9fe0e9ce41ca781db08880000000000000000000000000000000000000000000000000000000000102ca000000000000000000000000000000000000000000000000000000000000000c00000000000000000000000000000000000000000000000000000000000000000,,,1,true -16075,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec34000000000000000000000000a2b41b28fe1d007bd1008391e517c4c5d27c815c000000000000000000000000a2b41b28fe1d007bd1008391e517c4c5d27c815c00000000000000000000000000000000000000000000000001380f858730dcdd00000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,0x1be59af70e7ae3cb489c112a2b2c63b4590cd220047dab2ac1dfcabae98b7a61,2021-11-27 10:54:19.000 UTC,0,true -16076,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec34000000000000000000000000a083d45dc7b97eaf4532f19b112662bd3adf03a4000000000000000000000000a083d45dc7b97eaf4532f19b112662bd3adf03a40000000000000000000000000000000000000000000000000161714d2b50d60000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,0x9c5a8c3df69e7a196933d00fb2154f7ec979812c1394c4826c1bcd2b4871db83,2022-02-17 09:39:59.000 UTC,0,true -16077,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec34000000000000000000000000bf09dae602adae0c48de9ef743060696132f6a92000000000000000000000000bf09dae602adae0c48de9ef743060696132f6a92000000000000000000000000000000000000000000000000007944dbe91eb54000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -16078,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0xa9f9e675000000000000000000000000dac17f958d2ee523a2206206994597c13d831ec700000000000000000000000094b008aa00579c1307b0ef2c499ad98a8ce58e58000000000000000000000000cb5a1dc8307fc3f9c3fce8765232d42458f3aeb2000000000000000000000000cb5a1dc8307fc3f9c3fce8765232d42458f3aeb20000000000000000000000000000000000000000000000000000000000102ca000000000000000000000000000000000000000000000000000000000000000c00000000000000000000000000000000000000000000000000000000000000000,,,1,true -16079,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec34000000000000000000000000392bd4b4d4dfe5a3ab4370e348f90d1d508285bc000000000000000000000000392bd4b4d4dfe5a3ab4370e348f90d1d508285bc00000000000000000000000000000000000000000000000005c70b854a1c884000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -16080,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec340000000000000000000000008ce6c4777822be44ef0d749ec77028b215b475ba0000000000000000000000008ce6c4777822be44ef0d749ec77028b215b475ba0000000000000000000000000000000000000000000000000079eb3dd4840d7400000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,0xa830f8fc1a0db6a671e660593cd9fbd7417a16e7458aade34d3d27f7c83b5bb6,2022-05-21 20:23:11.000 UTC,0,true -16081,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0xa9f9e675000000000000000000000000dac17f958d2ee523a2206206994597c13d831ec700000000000000000000000094b008aa00579c1307b0ef2c499ad98a8ce58e58000000000000000000000000ef89f0bcfe2e3f6440ec2bbf0fe93646a9f6780d000000000000000000000000ef89f0bcfe2e3f6440ec2bbf0fe93646a9f6780d00000000000000000000000000000000000000000000000000000000000fb77000000000000000000000000000000000000000000000000000000000000000c00000000000000000000000000000000000000000000000000000000000000000,,,1,true -16082,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0xa9f9e675000000000000000000000000dac17f958d2ee523a2206206994597c13d831ec700000000000000000000000094b008aa00579c1307b0ef2c499ad98a8ce58e5800000000000000000000000035856a6a5f866ca903c5d33773a96308c5b696bc00000000000000000000000035856a6a5f866ca903c5d33773a96308c5b696bc000000000000000000000000000000000000000000000000000000002e224d8000000000000000000000000000000000000000000000000000000000000000c00000000000000000000000000000000000000000000000000000000000000000,,,1,true -16083,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec34000000000000000000000000a5224abfce9d3a1e6c25fedd61f36c44e1e684c8000000000000000000000000a5224abfce9d3a1e6c25fedd61f36c44e1e684c800000000000000000000000000000000000000000000000000dd55851981c00000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,0x61123618741d424d2d6081b7e095df40c5043e5951422c174c4641888f9ee90c,2021-12-10 07:38:36.000 UTC,0,true -16085,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0xa9f9e675000000000000000000000000dac17f958d2ee523a2206206994597c13d831ec700000000000000000000000094b008aa00579c1307b0ef2c499ad98a8ce58e580000000000000000000000001e3c45c9920310bc878e843db0ddaba304fa91150000000000000000000000001e3c45c9920310bc878e843db0ddaba304fa911500000000000000000000000000000000000000000000000000000000000f6d9c00000000000000000000000000000000000000000000000000000000000000c00000000000000000000000000000000000000000000000000000000000000000,,,1,true -16086,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec34000000000000000000000000b260669eb9471f8e1cac9f2897ff70e806e21af2000000000000000000000000b260669eb9471f8e1cac9f2897ff70e806e21af2000000000000000000000000000000000000000000000000004daf1126755d5d00000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -16087,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0xa9f9e675000000000000000000000000a0b86991c6218b36c1d19d4a2e9eb0ce3606eb480000000000000000000000007f5c764cbc14f9669b88837ca1490cca17c31607000000000000000000000000ab0619d952bf9ac0952c70ada9e62a227c698264000000000000000000000000ab0619d952bf9ac0952c70ada9e62a227c69826400000000000000000000000000000000000000000000000000000000017fbaf200000000000000000000000000000000000000000000000000000000000000c00000000000000000000000000000000000000000000000000000000000000000,,,1,true -16088,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec34000000000000000000000000be862b4d355ecd39bbf23d7f939dc35ab86c4dbd000000000000000000000000be862b4d355ecd39bbf23d7f939dc35ab86c4dbd000000000000000000000000000000000000000000000000069df95c1315dc8300000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,0x45d26aa01728be57493366da858e216f2ddc5b3ebc32362eb5444651eb82fd3a,2022-05-22 15:42:25.000 UTC,0,true -16093,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec34000000000000000000000000a6546c8d9306843350009d09e38705465673428a000000000000000000000000a6546c8d9306843350009d09e38705465673428a00000000000000000000000000000000000000000000000000005af3107a400000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -16094,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec340000000000000000000000004cae1cf90ec13e60a435e8fa638316ee337c472c0000000000000000000000004cae1cf90ec13e60a435e8fa638316ee337c472c000000000000000000000000000000000000000000000000000221b262dd800000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -16095,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec340000000000000000000000004cae1cf90ec13e60a435e8fa638316ee337c472c0000000000000000000000004cae1cf90ec13e60a435e8fa638316ee337c472c00000000000000000000000000000000000000000000000000005af3107a400000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -16097,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec3400000000000000000000000030a515c27534a346be6eb5d1d5bb3d1e50db060a00000000000000000000000030a515c27534a346be6eb5d1d5bb3d1e50db060a0000000000000000000000000000000000000000000000000061a9cf9333ccac00000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -16098,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec34000000000000000000000000e7846949d13003dbaa2f98d555426a2a3dca5e6f000000000000000000000000e7846949d13003dbaa2f98d555426a2a3dca5e6f000000000000000000000000000000000000000000000000013f1a797dc9c9de00000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -16099,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec34000000000000000000000000f31a41419e2aa2ab3cccd915aaf3585096ed7034000000000000000000000000f31a41419e2aa2ab3cccd915aaf3585096ed7034000000000000000000000000000000000000000000000000005ed4667876741b00000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,0x9ecd0952704f74692ee4b91849b5cdb552c31389e480c3a927f743added5ab98,2022-05-21 17:25:07.000 UTC,0,true -16101,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec340000000000000000000000004f30bb3d4198e6a839576f19a650aef2855e07150000000000000000000000004f30bb3d4198e6a839576f19a650aef2855e0715000000000000000000000000000000000000000000000000000aec234d240d9200000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -16102,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec340000000000000000000000005af34a3fffc67e7778393ad01f4204354ff889d10000000000000000000000005af34a3fffc67e7778393ad01f4204354ff889d100000000000000000000000000000000000000000000000000ee7994cb49ad6800000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -16103,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec3400000000000000000000000030a98bc74cc6a10a36332802fdad70fee516054100000000000000000000000030a98bc74cc6a10a36332802fdad70fee51605410000000000000000000000000000000000000000000000000487aaf06bc87ca300000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,0x4f49f1aca3846ff1cdf682caf641baea09349753acfa7783e794cf3ffc4d02b5,2021-11-28 08:52:38.000 UTC,0,true -16107,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec34000000000000000000000000e5d900cb9631b1195aa53f2a378f4facbc8ec663000000000000000000000000e5d900cb9631b1195aa53f2a378f4facbc8ec663000000000000000000000000000000000000000000000000167b656ab822000000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,0xed7ad251daac4062e107fbd7281fa671df5e19283fee7dff5b6b929a750417a2,2021-11-25 12:48:39.000 UTC,0,true -16111,0xcd9d4988c0ae61887b075ba77f08cbfad2b65068,0x3f87ff1de58128ef8fcb4c807efd776e1ac72e51,0xf4f7b41a000000000000000000000000798aafcaf1b9ee461d7d30f034dcab006dc495100000000000000000000000000000000000000000000000743bf75cfd3068a1fc,0xc3b89778850d4353c6be02cfce31dcacf04d23bbd69003ee0c6111330ad8db5f,2021-11-27 16:14:03.000 UTC,0,true -16113,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0xa9f9e675000000000000000000000000a0b86991c6218b36c1d19d4a2e9eb0ce3606eb480000000000000000000000007f5c764cbc14f9669b88837ca1490cca17c316070000000000000000000000002bed6fb507948e637179c175fe427f3205e345850000000000000000000000002bed6fb507948e637179c175fe427f3205e345850000000000000000000000000000000000000000000000000000000008a58a9e00000000000000000000000000000000000000000000000000000000000000c00000000000000000000000000000000000000000000000000000000000000000,,,1,true -16115,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec34000000000000000000000000f3058ab3e0fbd58853b7e14eab9041ee849e7a61000000000000000000000000f3058ab3e0fbd58853b7e14eab9041ee849e7a6100000000000000000000000000000000000000000000000002ab76ad0fed1f0d00000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -16120,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec34000000000000000000000000aabd00507b5df6f20819bc933f74d053ffa44ecd000000000000000000000000aabd00507b5df6f20819bc933f74d053ffa44ecd00000000000000000000000000000000000000000000000000aebc35e06a370000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -16122,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec34000000000000000000000000776678223fd719582183afa1865b041a18e83ee6000000000000000000000000776678223fd719582183afa1865b041a18e83ee6000000000000000000000000000000000000000000000000001ee13b0c991a0000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,0x657788da747086ae376a9ac3b99ef689d5e7d44db7a7c0597bf9850867394eb1,2022-08-28 15:27:53.000 UTC,0,true -16123,0x10e6593cdda8c58a1d0f14c5164b376352a55f2f,0x467194771dae2967aef3ecbedd3bf9a310c76c65,0xa9f9e6750000000000000000000000006b175474e89094c44da98b954eedeac495271d0f000000000000000000000000da10009cbd5d07dd0cecc66161fc93d7c9000da1000000000000000000000000d1516425127856704329b33a39240f1e5405bcad000000000000000000000000d1516425127856704329b33a39240f1e5405bcad000000000000000000000000000000000000000000000a7adbb7f6be0208000000000000000000000000000000000000000000000000000000000000000000c00000000000000000000000000000000000000000000000000000000000000000,0xde97beb72d923c5a9c58196bfef2ab55ab5f20b278f74c711627fa9768023a6b,2021-12-09 12:05:39.000 UTC,0,true -16124,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec34000000000000000000000000d1516425127856704329b33a39240f1e5405bcad000000000000000000000000d1516425127856704329b33a39240f1e5405bcad0000000000000000000000000000000000000000000000001cdcbf0409c631b700000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,0xa1ca8fd4dc2a54cdc4f17fc5a1cc87e97a98c3a4c0477d1bc5701c77d641c4b1,2021-12-09 12:04:29.000 UTC,0,true -16127,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec34000000000000000000000000edb183bda0993b01d95eee08ce74158b671fed76000000000000000000000000edb183bda0993b01d95eee08ce74158b671fed7600000000000000000000000000000000000000000000000001573e4987acd81b00000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -16130,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec34000000000000000000000000b211a2f3a1d20df7f8c3944e6228467e0abda9f4000000000000000000000000b211a2f3a1d20df7f8c3944e6228467e0abda9f40000000000000000000000000000000000000000000000000016811c7fded0d100000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -16131,0xcd9d4988c0ae61887b075ba77f08cbfad2b65068,0x3f87ff1de58128ef8fcb4c807efd776e1ac72e51,0xf4f7b41a00000000000000000000000070513a081114ed019361d7d6f0e575206da93810000000000000000000000000000000000000000000000028edd5b89ee18edb9d,0x42f2766d35ee0e0ac3199d3cf968998d64d503eada29cfea7871b0beaa69fef8,2021-11-24 14:49:16.000 UTC,0,true -16133,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec34000000000000000000000000caf268268ca94f53305c20cc92132fd51165c9a0000000000000000000000000caf268268ca94f53305c20cc92132fd51165c9a0000000000000000000000000000000000000000000000000001cc39dc64b3e0000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -16134,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec34000000000000000000000000caf268268ca94f53305c20cc92132fd51165c9a0000000000000000000000000caf268268ca94f53305c20cc92132fd51165c9a0000000000000000000000000000000000000000000000000005a7aff9324fdab00000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -16135,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec340000000000000000000000006167e0e49bb745c4665a77b53306ff4206fe70ff0000000000000000000000006167e0e49bb745c4665a77b53306ff4206fe70ff000000000000000000000000000000000000000000000000001a6adf86d786c000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,0xe178944852c30355bd786a756666f2dd8c64d1f67833ec296565f38352c29d1d,2021-12-15 17:39:10.000 UTC,0,true -16138,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec340000000000000000000000005d4d3fae4d0282fd8a558b5f42ba700974cbfd1a0000000000000000000000005d4d3fae4d0282fd8a558b5f42ba700974cbfd1a000000000000000000000000000000000000000000000000008093283475add900000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -16139,0x10e6593cdda8c58a1d0f14c5164b376352a55f2f,0x467194771dae2967aef3ecbedd3bf9a310c76c65,0xa9f9e6750000000000000000000000006b175474e89094c44da98b954eedeac495271d0f000000000000000000000000da10009cbd5d07dd0cecc66161fc93d7c9000da1000000000000000000000000bb86cd4020dc5120cbe6d443551e32f85980131d000000000000000000000000bb86cd4020dc5120cbe6d443551e32f85980131d000000000000000000000000000000000000000000000001db74bd5ef5d8719200000000000000000000000000000000000000000000000000000000000000c00000000000000000000000000000000000000000000000000000000000000000,,,1,true -16140,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec34000000000000000000000000113cd2467bc19c16b4ce4a070e57666d35828eb3000000000000000000000000113cd2467bc19c16b4ce4a070e57666d35828eb3000000000000000000000000000000000000000000000000001c74672c9f76c000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -16143,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec340000000000000000000000000c512544e8f33fcccfaa1aa3b236da8f4348c14d0000000000000000000000000c512544e8f33fcccfaa1aa3b236da8f4348c14d000000000000000000000000000000000000000000000000005eb6874c1542a200000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -16144,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec3400000000000000000000000010b7a7e9a5d527a821b574e688c71519bdf8a15700000000000000000000000010b7a7e9a5d527a821b574e688c71519bdf8a15700000000000000000000000000000000000000000000000002bc2b9ce43b9d2300000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -16145,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec34000000000000000000000000509da798f0af5bfd7a93e55d922c9e6795bc9b51000000000000000000000000509da798f0af5bfd7a93e55d922c9e6795bc9b5100000000000000000000000000000000000000000000000002072c08066ffe0200000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -16146,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec340000000000000000000000002d7554d0183e613e27cb4eda71622e57fb4150bb0000000000000000000000002d7554d0183e613e27cb4eda71622e57fb4150bb0000000000000000000000000000000000000000000000000158db44e201516b00000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -16147,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec34000000000000000000000000f23d209054debaaf0d295c1fa0b22c5eca34706a000000000000000000000000f23d209054debaaf0d295c1fa0b22c5eca34706a00000000000000000000000000000000000000000000000000f5f8c6706f3cdd00000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -16148,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec3400000000000000000000000049f4b1eac2a0fed5a7e58cef8af576c77495d6bf00000000000000000000000049f4b1eac2a0fed5a7e58cef8af576c77495d6bf00000000000000000000000000000000000000000000000001560a759083e10400000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -16149,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec34000000000000000000000000154e41602119aba736ff9d23a17e8a2cb51545b1000000000000000000000000154e41602119aba736ff9d23a17e8a2cb51545b1000000000000000000000000000000000000000000000000001b910ceeba278000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -16151,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec34000000000000000000000000a1dbd6c82ccb233dafb553146e34ebdca59174ca000000000000000000000000a1dbd6c82ccb233dafb553146e34ebdca59174ca000000000000000000000000000000000000000000000000041bd209b3d5bb5300000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -16152,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec340000000000000000000000002a28335f6f1a2fb847821215ae4d32695e040ca60000000000000000000000002a28335f6f1a2fb847821215ae4d32695e040ca6000000000000000000000000000000000000000000000000066c67d86233c15a00000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,0x355d14d483bf9cfeb63f39cb386ec0d02b058529d83c864c8dbe3a67966c19b1,2022-01-29 13:07:25.000 UTC,0,true -16153,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec34000000000000000000000000f841249c065984ba49c785977b872231c1b44374000000000000000000000000f841249c065984ba49c785977b872231c1b4437400000000000000000000000000000000000000000000000000e983534e74ca9500000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -16154,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec34000000000000000000000000ba2c8c57f57593956cfd612f97d9e882c44302f5000000000000000000000000ba2c8c57f57593956cfd612f97d9e882c44302f500000000000000000000000000000000000000000000000000f0807a9bbe232d00000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -16155,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec34000000000000000000000000c55cf36f9f16c75e7d4bbd97ddbbcd4e4b0bb959000000000000000000000000c55cf36f9f16c75e7d4bbd97ddbbcd4e4b0bb95900000000000000000000000000000000000000000000000000e8430445faf12c00000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -16156,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec34000000000000000000000000d1ef1058a3b75a914c2f15b42a5e4ee6b19edffe000000000000000000000000d1ef1058a3b75a914c2f15b42a5e4ee6b19edffe0000000000000000000000000000000000000000000000000a07b12e2b997cd100000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -16158,0xcd9d4988c0ae61887b075ba77f08cbfad2b65068,0x3f87ff1de58128ef8fcb4c807efd776e1ac72e51,0xf4f7b41a000000000000000000000000dc4e7b7b9ee70846125d89d7440a184d5ca68b170000000000000000000000000000000000000000000000001b59dbf02698c597,,,1,true -16159,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec3400000000000000000000000046c7860fa18ff68e1faf50630546dff7f35d2b2300000000000000000000000046c7860fa18ff68e1faf50630546dff7f35d2b2300000000000000000000000000000000000000000000000006623f9014ae000000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -16160,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec34000000000000000000000000f6890ba19de422639f7155a4a6c2fc7847d90bde000000000000000000000000f6890ba19de422639f7155a4a6c2fc7847d90bde00000000000000000000000000000000000000000000000001cd8c3e2dbea5ac00000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -16161,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec34000000000000000000000000ba067d3c09153aa959072da7516f71686f7a49a9000000000000000000000000ba067d3c09153aa959072da7516f71686f7a49a900000000000000000000000000000000000000000000000000679bdbb4a4310000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -16162,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec34000000000000000000000000408e1c415a52cc08abab3ad8b08dffe842a6df8c000000000000000000000000408e1c415a52cc08abab3ad8b08dffe842a6df8c00000000000000000000000000000000000000000000000006f05b59d3b2000000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -16163,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec34000000000000000000000000bc37fee294548c3cc4556757ad74241dc09ab644000000000000000000000000bc37fee294548c3cc4556757ad74241dc09ab64400000000000000000000000000000000000000000000000006f05b59d3b2000000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -16164,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec340000000000000000000000001d1a9f4e2e1730db50e46aa40c54fa41544092610000000000000000000000001d1a9f4e2e1730db50e46aa40c54fa415440926100000000000000000000000000000000000000000000000006f05b59d3b2000000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -16166,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec34000000000000000000000000a7d79d08c788860136fce0c3d6e82939b1d03a06000000000000000000000000a7d79d08c788860136fce0c3d6e82939b1d03a0600000000000000000000000000000000000000000000000018cb0ab861e24b6300000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -16167,0xcd9d4988c0ae61887b075ba77f08cbfad2b65068,0x3f87ff1de58128ef8fcb4c807efd776e1ac72e51,0xf4f7b41a00000000000000000000000097b04c20ca1cf1e89249b7b7b7462eb382e943e7000000000000000000000000000000000000000000000003456101d6c525df92,,,1,true -16171,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec34000000000000000000000000d16c33117e004fa8ea0dace84b942468e6b69798000000000000000000000000d16c33117e004fa8ea0dace84b942468e6b697980000000000000000000000000000000000000000000000000044f1920eca900000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -16175,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec3400000000000000000000000046ba65479c4c550fb602065c0bb15d67472f78d100000000000000000000000046ba65479c4c550fb602065c0bb15d67472f78d1000000000000000000000000000000000000000000000000008c825996ba8c0000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -16176,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0xa9f9e675000000000000000000000000dac17f958d2ee523a2206206994597c13d831ec700000000000000000000000094b008aa00579c1307b0ef2c499ad98a8ce58e580000000000000000000000005a4be3634039a27d00f7634aaa5dc687ce4a7a0f0000000000000000000000005a4be3634039a27d00f7634aaa5dc687ce4a7a0f00000000000000000000000000000000000000000000000000000000000f906000000000000000000000000000000000000000000000000000000000000000c00000000000000000000000000000000000000000000000000000000000000000,,,1,true -16177,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0xa9f9e675000000000000000000000000dac17f958d2ee523a2206206994597c13d831ec700000000000000000000000094b008aa00579c1307b0ef2c499ad98a8ce58e58000000000000000000000000ac7005eb5a78dcee54ac369d345e91eafe9c1f7d000000000000000000000000ac7005eb5a78dcee54ac369d345e91eafe9c1f7d0000000000000000000000000000000000000000000000000000000000109a0000000000000000000000000000000000000000000000000000000000000000c00000000000000000000000000000000000000000000000000000000000000000,,,1,true -16178,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec340000000000000000000000004630483f9edeb8dea6f5339bd8aa6c86fc6046de0000000000000000000000004630483f9edeb8dea6f5339bd8aa6c86fc6046de00000000000000000000000000000000000000000000000000870bb66d33c00000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,0x0241acb15920c72b50194b4b74ed76be1296252e5beef672ba17a92888134e31,2022-03-19 08:03:51.000 UTC,0,true -16179,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec34000000000000000000000000daf3a243e5109d67ad7749121751510a8b54094c000000000000000000000000daf3a243e5109d67ad7749121751510a8b54094c000000000000000000000000000000000000000000000000001e7bfebd2be5c000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -16180,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0xa9f9e675000000000000000000000000dac17f958d2ee523a2206206994597c13d831ec700000000000000000000000094b008aa00579c1307b0ef2c499ad98a8ce58e580000000000000000000000001793f656d03108ddbf56b5005a17142dc8fe1c400000000000000000000000001793f656d03108ddbf56b5005a17142dc8fe1c400000000000000000000000000000000000000000000000000000000000102ca000000000000000000000000000000000000000000000000000000000000000c00000000000000000000000000000000000000000000000000000000000000000,,,1,true -16183,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec34000000000000000000000000f32e2c3394353274573bbcf669afbfcd7402423b000000000000000000000000f32e2c3394353274573bbcf669afbfcd7402423b000000000000000000000000000000000000000000000000046858b5b26e56ea00000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -16185,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec340000000000000000000000003bfbdf4a113f267c5001d86cfb1a60c2ebbf425e0000000000000000000000003bfbdf4a113f267c5001d86cfb1a60c2ebbf425e000000000000000000000000000000000000000000000000001e3f3cbfa26bc000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -16186,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0xa9f9e675000000000000000000000000dac17f958d2ee523a2206206994597c13d831ec700000000000000000000000094b008aa00579c1307b0ef2c499ad98a8ce58e58000000000000000000000000ab232f3e0c775bbe09f6b5df0b0b7a71254f32a5000000000000000000000000ab232f3e0c775bbe09f6b5df0b0b7a71254f32a5000000000000000000000000000000000000000000000000000000000010c8e000000000000000000000000000000000000000000000000000000000000000c00000000000000000000000000000000000000000000000000000000000000000,,,1,true -16187,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec3400000000000000000000000099f566638eb23d708fba490f4d9798247a402d0f00000000000000000000000099f566638eb23d708fba490f4d9798247a402d0f0000000000000000000000000000000000000000000000002eceba19cfa7359800000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,0xd0875f9799e2e44b03736d043f9216f3da56b375caa7dd380691e9828fbc1c62,2021-11-23 07:04:50.000 UTC,0,true -16189,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec34000000000000000000000000e47bf5707d521074a09066f77a7586d2f613aae7000000000000000000000000e47bf5707d521074a09066f77a7586d2f613aae7000000000000000000000000000000000000000000000000011b368f0c0c1af600000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,0x0a0c6f5bc32b676c63696d87fd1a51623b8d4fdb35056575950381d8bac9a3d7,2021-12-19 13:28:34.000 UTC,0,true -16191,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec34000000000000000000000000d6e4600760fe4ad9c6a738569873728ff629c474000000000000000000000000d6e4600760fe4ad9c6a738569873728ff629c474000000000000000000000000000000000000000000000000002714711487800000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -16192,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0xa9f9e675000000000000000000000000dac17f958d2ee523a2206206994597c13d831ec700000000000000000000000094b008aa00579c1307b0ef2c499ad98a8ce58e58000000000000000000000000e0e8ba21dadd65341b098b83bc1d1a5c927baa36000000000000000000000000e0e8ba21dadd65341b098b83bc1d1a5c927baa3600000000000000000000000000000000000000000000000000000000000f695000000000000000000000000000000000000000000000000000000000000000c00000000000000000000000000000000000000000000000000000000000000000,,,1,true -16194,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec340000000000000000000000005f40324ed97badd9079e67e162c83b1fb9168a120000000000000000000000005f40324ed97badd9079e67e162c83b1fb9168a1200000000000000000000000000000000000000000000000000038d7ea4c6800000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -16195,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec34000000000000000000000000b52644ec19cff7e3fd37bd3f6c072724ed066b90000000000000000000000000b52644ec19cff7e3fd37bd3f6c072724ed066b9000000000000000000000000000000000000000000000000000038d7ea4c6800000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -16196,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec3400000000000000000000000041adf6dc0bf8d5d85050a9d88a3c4b9b25ae439b00000000000000000000000041adf6dc0bf8d5d85050a9d88a3c4b9b25ae439b00000000000000000000000000000000000000000000000000038d7ea4c6800000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -16197,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec340000000000000000000000000b38575bd4f8d4e65b304c667526c473ff02fb610000000000000000000000000b38575bd4f8d4e65b304c667526c473ff02fb6100000000000000000000000000000000000000000000000001618e6317db0e0000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -16198,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0xa9f9e675000000000000000000000000514910771af9ca656af840dff83e8264ecf986ca000000000000000000000000350a791bfc2c21f9ed5d10980dad2e2638ffa7f6000000000000000000000000714cf7b379e9ccc07a452eea459095a54a60af45000000000000000000000000714cf7b379e9ccc07a452eea459095a54a60af4500000000000000000000000000000000000000000000000185d4175a04c25a1c00000000000000000000000000000000000000000000000000000000000000c00000000000000000000000000000000000000000000000000000000000000000,0x4c5239ae63b7a5311d1af8ceaed7e3e96ea66cf033a81d0c1ea40840f88e0911,2021-11-21 15:27:51.000 UTC,0,true -16199,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0xa9f9e675000000000000000000000000dac17f958d2ee523a2206206994597c13d831ec700000000000000000000000094b008aa00579c1307b0ef2c499ad98a8ce58e58000000000000000000000000741cfe64d81b0929895237a0a858b4628d7adbc9000000000000000000000000741cfe64d81b0929895237a0a858b4628d7adbc900000000000000000000000000000000000000000000000000000000000fcee000000000000000000000000000000000000000000000000000000000000000c00000000000000000000000000000000000000000000000000000000000000000,,,1,true -16200,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec340000000000000000000000006e2cb253d7af60c49a3cc906ca3ea38916e1938a0000000000000000000000006e2cb253d7af60c49a3cc906ca3ea38916e1938a00000000000000000000000000000000000000000000000000019617d2b1ea0000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -16201,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec34000000000000000000000000f3fe811aa9ec8a0a94b48cd81121043cf5cd0513000000000000000000000000f3fe811aa9ec8a0a94b48cd81121043cf5cd051300000000000000000000000000000000000000000000000000013e52b9abe00000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -16202,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec34000000000000000000000000312b37ef3e483dad46de413dbf9b421c8c920c31000000000000000000000000312b37ef3e483dad46de413dbf9b421c8c920c3100000000000000000000000000000000000000000000000000013e52b9abe00000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -16203,0x10e6593cdda8c58a1d0f14c5164b376352a55f2f,0x467194771dae2967aef3ecbedd3bf9a310c76c65,0xa9f9e6750000000000000000000000006b175474e89094c44da98b954eedeac495271d0f000000000000000000000000da10009cbd5d07dd0cecc66161fc93d7c9000da10000000000000000000000002f318c8f9d3938372eb49303fb14567d62df28d70000000000000000000000002f318c8f9d3938372eb49303fb14567d62df28d700000000000000000000000000000000000000000000000e831c382ea2498d9e00000000000000000000000000000000000000000000000000000000000000c00000000000000000000000000000000000000000000000000000000000000000,,,1,true -16206,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec34000000000000000000000000272007d3625914bad0e1cc698e6d453f65c62f21000000000000000000000000272007d3625914bad0e1cc698e6d453f65c62f21000000000000000000000000000000000000000000000000000110d9316ec00000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,0x284ffb2c6e7d5b1708bc9f0c29746922461d4fbc2643d06a361c3bb03fbff69c,2022-04-15 04:45:59.000 UTC,0,true -16207,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec34000000000000000000000000ba0d2c9dde95078e97ad7052235da83b3018b585000000000000000000000000ba0d2c9dde95078e97ad7052235da83b3018b58500000000000000000000000000000000000000000000000004cb0aa27bbea18800000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,0x5a87f2febda9f4f1b6721c7972d080c9f4fd7f549a226bd08504b9994fbbf042,2021-12-06 11:35:58.000 UTC,0,true -16208,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec34000000000000000000000000dffa86ce7ee3aa3c1dcc6e884aaf4df86005b57e000000000000000000000000dffa86ce7ee3aa3c1dcc6e884aaf4df86005b57e00000000000000000000000000000000000000000000000004c1c7971c0656b700000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,0x04003942d0a7af5d0ee0e704a3bdead2f607e6956714e06859a36dfa8a456a9b,2021-12-06 11:39:31.000 UTC,0,true -16209,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec3400000000000000000000000050e1c1760db4681fcc6cf6935a27633e4441570700000000000000000000000050e1c1760db4681fcc6cf6935a27633e4441570700000000000000000000000000000000000000000000000004c42cfbaaaff1f700000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,0x1299262b3297301230e291537317707a3de6717657906929b3e0e57bd750b58d,2021-12-06 11:41:00.000 UTC,0,true -16210,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec340000000000000000000000003263decaa813a870862e32adbc85933060f9c46d0000000000000000000000003263decaa813a870862e32adbc85933060f9c46d00000000000000000000000000000000000000000000000004c4b9812fbff0a000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,0xf6afffd53f1788147ea96bf048ef8944c9427ca59cd224191b4509a978f05fd9,2021-12-06 12:09:12.000 UTC,0,true -16212,0xcd9d4988c0ae61887b075ba77f08cbfad2b65068,0x3f87ff1de58128ef8fcb4c807efd776e1ac72e51,0xf4f7b41a000000000000000000000000bd81af0236b3c3adcc59982015d1f5dbe337a5fe000000000000000000000000000000000000000000000010fa140f1616eb83ae,0xc8fad02ba353f26fa50bd4b2831e76f92830e703f5d7649b3ffda61dd6175bad,2021-12-10 06:15:19.000 UTC,0,true -16215,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec340000000000000000000000001e1c63ce6d149b35ed6daba02cc354d34c9faa180000000000000000000000001e1c63ce6d149b35ed6daba02cc354d34c9faa18000000000000000000000000000000000000000000000000001d5ceb30710cc000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -16216,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec34000000000000000000000000695ac4ba3412e209a248041d4e94f6fec6e26e5c000000000000000000000000695ac4ba3412e209a248041d4e94f6fec6e26e5c00000000000000000000000000000000000000000000000000daa577074afc7400000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -16217,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0xa9f9e675000000000000000000000000a0b86991c6218b36c1d19d4a2e9eb0ce3606eb480000000000000000000000007f5c764cbc14f9669b88837ca1490cca17c31607000000000000000000000000d0652b76639b93ae0e7829d5608e233c8e2eeb62000000000000000000000000d0652b76639b93ae0e7829d5608e233c8e2eeb6200000000000000000000000000000000000000000000000000000000443260af00000000000000000000000000000000000000000000000000000000000000c00000000000000000000000000000000000000000000000000000000000000000,0x32f7ad76bc4de5474b87355c506d6b70e3b275a00168ca24f16fbdc7b56a9003,2021-12-03 11:19:53.000 UTC,0,true -16218,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec3400000000000000000000000030c05b9066113696b2f6194e067a21d0a77108e900000000000000000000000030c05b9066113696b2f6194e067a21d0a77108e90000000000000000000000000000000000000000000000000058e3751f8aa28a00000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -16220,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec340000000000000000000000007c98ab80d060ca57dd067712d0ed084a58f69c490000000000000000000000007c98ab80d060ca57dd067712d0ed084a58f69c490000000000000000000000000000000000000000000000000026a46679ebdc7700000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,0xca5c91dca869dcab7ef4be90cd89aaba6d5b3268cea8b62db62a992ce43593c8,2022-08-19 05:50:17.000 UTC,0,true -16222,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0xa9f9e675000000000000000000000000dac17f958d2ee523a2206206994597c13d831ec700000000000000000000000094b008aa00579c1307b0ef2c499ad98a8ce58e580000000000000000000000000acbc858d78b2d3332cb96ace137ccfc49405a140000000000000000000000000acbc858d78b2d3332cb96ace137ccfc49405a1400000000000000000000000000000000000000000000000000000000000f906000000000000000000000000000000000000000000000000000000000000000c00000000000000000000000000000000000000000000000000000000000000000,,,1,true -16224,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec34000000000000000000000000344ae5a277c4cf1864941cfb35807f28d5241687000000000000000000000000344ae5a277c4cf1864941cfb35807f28d524168700000000000000000000000000000000000000000000000000b92f0e2f5d3f5100000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -16225,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec340000000000000000000000000056325a71d3ff95c8bca8b985903123ab2ab9c10000000000000000000000000056325a71d3ff95c8bca8b985903123ab2ab9c100000000000000000000000000000000000000000000000000cee48c9c29a2da00000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,0x1f19706c75bfe926b6cef6a9a8f44dd733d6e9445aef47224abdb0bf4aed772c,2021-12-20 12:58:16.000 UTC,0,true -16226,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec340000000000000000000000001f89f28490e4f4a544df6f23782f19b9dc0855db0000000000000000000000001f89f28490e4f4a544df6f23782f19b9dc0855db00000000000000000000000000000000000000000000000000adfa07ba85f60000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -16227,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0xa9f9e675000000000000000000000000dac17f958d2ee523a2206206994597c13d831ec700000000000000000000000094b008aa00579c1307b0ef2c499ad98a8ce58e5800000000000000000000000095c8287dc54aab2176a7ba495034e24f315693f500000000000000000000000095c8287dc54aab2176a7ba495034e24f315693f500000000000000000000000000000000000000000000000000000000000fb77000000000000000000000000000000000000000000000000000000000000000c00000000000000000000000000000000000000000000000000000000000000000,,,1,true -16231,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec340000000000000000000000004dfd01933c8af1151d208a897b97926a2a47867e0000000000000000000000004dfd01933c8af1151d208a897b97926a2a47867e0000000000000000000000000000000000000000000000000064658521bd409f00000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -16232,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0xa9f9e675000000000000000000000000dac17f958d2ee523a2206206994597c13d831ec700000000000000000000000094b008aa00579c1307b0ef2c499ad98a8ce58e58000000000000000000000000ab0e775f87cf8d1c77e617ef050bbd365ae37740000000000000000000000000ab0e775f87cf8d1c77e617ef050bbd365ae3774000000000000000000000000000000000000000000000000000000000000fa7d000000000000000000000000000000000000000000000000000000000000000c00000000000000000000000000000000000000000000000000000000000000000,,,1,true -16233,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0xa9f9e675000000000000000000000000a0b86991c6218b36c1d19d4a2e9eb0ce3606eb480000000000000000000000007f5c764cbc14f9669b88837ca1490cca17c31607000000000000000000000000843601e30bab716f5128cd3e269ae70ee4d218f0000000000000000000000000843601e30bab716f5128cd3e269ae70ee4d218f00000000000000000000000000000000000000000000000000000000008f0d18000000000000000000000000000000000000000000000000000000000000000c00000000000000000000000000000000000000000000000000000000000000000,,,1,true -16234,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0xa9f9e675000000000000000000000000dac17f958d2ee523a2206206994597c13d831ec700000000000000000000000094b008aa00579c1307b0ef2c499ad98a8ce58e58000000000000000000000000601d9a3d680b62e45b75e7d616e1024f1f5a3204000000000000000000000000601d9a3d680b62e45b75e7d616e1024f1f5a32040000000000000000000000000000000000000000000000000000000003df249900000000000000000000000000000000000000000000000000000000000000c00000000000000000000000000000000000000000000000000000000000000000,,,1,true -16235,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec34000000000000000000000000601d9a3d680b62e45b75e7d616e1024f1f5a3204000000000000000000000000601d9a3d680b62e45b75e7d616e1024f1f5a320400000000000000000000000000000000000000000000000000c234a4cd408fc500000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -16236,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0xa9f9e675000000000000000000000000dac17f958d2ee523a2206206994597c13d831ec700000000000000000000000094b008aa00579c1307b0ef2c499ad98a8ce58e580000000000000000000000003a3b5ae8cfe9fee4cc8d783da3b6e89cacca5c080000000000000000000000003a3b5ae8cfe9fee4cc8d783da3b6e89cacca5c0800000000000000000000000000000000000000000000000000000000000fcee000000000000000000000000000000000000000000000000000000000000000c00000000000000000000000000000000000000000000000000000000000000000,,,1,true -16237,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec34000000000000000000000000e241013cd6b4d4c70466cb1334ff500befaf10fb000000000000000000000000e241013cd6b4d4c70466cb1334ff500befaf10fb00000000000000000000000000000000000000000000000000038d7ea4c6800000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -16238,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec34000000000000000000000000e241013cd6b4d4c70466cb1334ff500befaf10fb000000000000000000000000e241013cd6b4d4c70466cb1334ff500befaf10fb00000000000000000000000000000000000000000000000000038d7ea4c6800000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -16239,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec34000000000000000000000000b05b03e6456d710d906b462f05d3403a0ded1c1b000000000000000000000000b05b03e6456d710d906b462f05d3403a0ded1c1b0000000000000000000000000000000000000000000000000104bcb131f6f11700000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -16241,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec34000000000000000000000000bfb4e5c4833ba5258cf5b805d5ddc52d7c0fc2c2000000000000000000000000bfb4e5c4833ba5258cf5b805d5ddc52d7c0fc2c2000000000000000000000000000000000000000000000000013bb448f83570bf00000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,0x458689ead127fb0e9103cc5b961645317e5c22f59e08d64e3f6f1fa3219d1daf,2021-12-26 08:10:47.000 UTC,0,true -16243,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec3400000000000000000000000034fca7ba58551dfa89e486c8934a7b35f4d02dd000000000000000000000000034fca7ba58551dfa89e486c8934a7b35f4d02dd000000000000000000000000000000000000000000000000003d49ccf811f1e7100000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -16244,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec340000000000000000000000007ab327d86e8a9cdc7bd516582ba3ca199ef431800000000000000000000000007ab327d86e8a9cdc7bd516582ba3ca199ef431800000000000000000000000000000000000000000000000000021f74c1e74d50000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -16245,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec34000000000000000000000000659db7f3ea1801dde55259fccbb1e8608f8ebdef000000000000000000000000659db7f3ea1801dde55259fccbb1e8608f8ebdef0000000000000000000000000000000000000000000000000002d79883d2000000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -16246,0x10e6593cdda8c58a1d0f14c5164b376352a55f2f,0x467194771dae2967aef3ecbedd3bf9a310c76c65,0xa9f9e6750000000000000000000000006b175474e89094c44da98b954eedeac495271d0f000000000000000000000000da10009cbd5d07dd0cecc66161fc93d7c9000da1000000000000000000000000659db7f3ea1801dde55259fccbb1e8608f8ebdef000000000000000000000000659db7f3ea1801dde55259fccbb1e8608f8ebdef0000000000000000000000000000000000000000000000001248be6158f4765f00000000000000000000000000000000000000000000000000000000000000c00000000000000000000000000000000000000000000000000000000000000000,,,1,true -16248,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0xa9f9e675000000000000000000000000a0b86991c6218b36c1d19d4a2e9eb0ce3606eb480000000000000000000000007f5c764cbc14f9669b88837ca1490cca17c31607000000000000000000000000659db7f3ea1801dde55259fccbb1e8608f8ebdef000000000000000000000000659db7f3ea1801dde55259fccbb1e8608f8ebdef0000000000000000000000000000000000000000000000000000000000135c6800000000000000000000000000000000000000000000000000000000000000c00000000000000000000000000000000000000000000000000000000000000000,,,1,true -16249,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0xa9f9e675000000000000000000000000a0b86991c6218b36c1d19d4a2e9eb0ce3606eb480000000000000000000000007f5c764cbc14f9669b88837ca1490cca17c31607000000000000000000000000659db7f3ea1801dde55259fccbb1e8608f8ebdef000000000000000000000000659db7f3ea1801dde55259fccbb1e8608f8ebdef0000000000000000000000000000000000000000000000000000000000135c6800000000000000000000000000000000000000000000000000000000000000c00000000000000000000000000000000000000000000000000000000000000000,,,1,true -16250,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec34000000000000000000000000b53672ab0315620662f31c429635bf8b3ac62345000000000000000000000000b53672ab0315620662f31c429635bf8b3ac62345000000000000000000000000000000000000000000000000002020aa16652ec000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -16251,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec34000000000000000000000000d2269145a8ebbe814be80284e1346bb428e49357000000000000000000000000d2269145a8ebbe814be80284e1346bb428e4935700000000000000000000000000000000000000000000000000335155dce04a0000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -16253,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec34000000000000000000000000bb81746a8af0738dd5a4412970a2224f3309749a000000000000000000000000bb81746a8af0738dd5a4412970a2224f3309749a00000000000000000000000000000000000000000000000000432b3043c3e57000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -16255,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec3400000000000000000000000048193168a19164c6f50c2fef223ebcd3cce803c900000000000000000000000048193168a19164c6f50c2fef223ebcd3cce803c900000000000000000000000000000000000000000000000000354a6ba7a1800000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -16256,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec340000000000000000000000002f09073676f37b4e8281b1be3b2f6a030fc188b70000000000000000000000002f09073676f37b4e8281b1be3b2f6a030fc188b700000000000000000000000000000000000000000000000000038d7ea4c6800000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -16258,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec340000000000000000000000002b129f1910a9e90a715b69a8dd42e7646a448dbb0000000000000000000000002b129f1910a9e90a715b69a8dd42e7646a448dbb0000000000000000000000000000000000000000000000000093e7bcd3f30a4600000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -16259,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec3400000000000000000000000043232604615a225aded5713e41161d82f616467200000000000000000000000043232604615a225aded5713e41161d82f616467200000000000000000000000000000000000000000000000001a91ce9a67b8c3100000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -16262,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0xa9f9e675000000000000000000000000a0b86991c6218b36c1d19d4a2e9eb0ce3606eb480000000000000000000000007f5c764cbc14f9669b88837ca1490cca17c31607000000000000000000000000806375720c42753be3d98109e93f5df192fb0222000000000000000000000000806375720c42753be3d98109e93f5df192fb022200000000000000000000000000000000000000000000000000000000043fa7db00000000000000000000000000000000000000000000000000000000000000c00000000000000000000000000000000000000000000000000000000000000000,0x29ef5e2db5ee67fb356073458da9b510d79302d1ab73bd1d3a6ab27aab527f4d,2022-03-05 14:33:11.000 UTC,0,true -16263,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec34000000000000000000000000806375720c42753be3d98109e93f5df192fb0222000000000000000000000000806375720c42753be3d98109e93f5df192fb0222000000000000000000000000000000000000000000000000007535f91d618cf500000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,0x43aadccc817072d42d37dcadbd346b77d18f23b102a8b02f6bf29993d7dccbf6,2022-03-05 14:36:55.000 UTC,0,true -16264,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec3400000000000000000000000097ca9c21af6b38aa7f8df9b2da2555f9346fb89c00000000000000000000000097ca9c21af6b38aa7f8df9b2da2555f9346fb89c0000000000000000000000000000000000000000000000000012b80f58fefa0200000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -16266,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec34000000000000000000000000ec712ce410df07c9a5a38954d1a85520410b8b83000000000000000000000000ec712ce410df07c9a5a38954d1a85520410b8b8300000000000000000000000000000000000000000000000000aaf4b2df7384be00000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,0x77c474eba6526ce4ba403c345af8d4138f1b60125248fd7d0f7c62e8f77ed4c8,2022-01-01 15:20:54.000 UTC,0,true -16267,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec340000000000000000000000000e26d88cd8deec6e5762cc5be6e33cb49a01932b0000000000000000000000000e26d88cd8deec6e5762cc5be6e33cb49a01932b00000000000000000000000000000000000000000000000002a0e1730340bfb200000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,0x9f902c41ab9c170177b91a4ce6530588ea9ff35f26d47b00a965e8f4f93010b4,2021-12-11 11:00:54.000 UTC,0,true -16268,0xcd9d4988c0ae61887b075ba77f08cbfad2b65068,0x3f87ff1de58128ef8fcb4c807efd776e1ac72e51,0xf4f7b41a00000000000000000000000069b1763765443f114212247d6f639427c90e331a0000000000000000000000000000000000000000000000045fbb1781ff7daeab,,,1,true -16269,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0xa9f9e675000000000000000000000000dac17f958d2ee523a2206206994597c13d831ec700000000000000000000000094b008aa00579c1307b0ef2c499ad98a8ce58e58000000000000000000000000daee2a62e9a1a13721bacb3f04d3f80b6a0719a5000000000000000000000000daee2a62e9a1a13721bacb3f04d3f80b6a0719a5000000000000000000000000000000000000000000000000000000000121b23d00000000000000000000000000000000000000000000000000000000000000c00000000000000000000000000000000000000000000000000000000000000000,,,1,true -16270,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec34000000000000000000000000be669d83fe4de792132aceb7cd84eb6479df76e3000000000000000000000000be669d83fe4de792132aceb7cd84eb6479df76e3000000000000000000000000000000000000000000000000030b3a1463b20f1900000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -16272,0xcd9d4988c0ae61887b075ba77f08cbfad2b65068,0x3f87ff1de58128ef8fcb4c807efd776e1ac72e51,0xf4f7b41a00000000000000000000000069b1763765443f114212247d6f639427c90e331a00000000000000000000000000000000000000000000000007f0b765bd31d9cc,,,1,true -16273,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec34000000000000000000000000daee2a62e9a1a13721bacb3f04d3f80b6a0719a5000000000000000000000000daee2a62e9a1a13721bacb3f04d3f80b6a0719a50000000000000000000000000000000000000000000000000028db3066eac00000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -16275,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec34000000000000000000000000223418ec0b76fa09f430ab36e609c71be901c559000000000000000000000000223418ec0b76fa09f430ab36e609c71be901c55900000000000000000000000000000000000000000000000001f161421c8e000000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -16278,0xcd9d4988c0ae61887b075ba77f08cbfad2b65068,0x3f87ff1de58128ef8fcb4c807efd776e1ac72e51,0xf4f7b41a0000000000000000000000000a8f515e37b1b074c9f1a41e5013252c607fcd7c000000000000000000000000000000000000000000000000288b24f6824425e8,,,1,true -16279,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec34000000000000000000000000a0c0adc8073b25431117f6d97368f743e3ee30c1000000000000000000000000a0c0adc8073b25431117f6d97368f743e3ee30c100000000000000000000000000000000000000000000000002e77a3ac53fc50000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,0x2a1c35503575c16b5b313a6e2f5bca81e336ec38b7ca8290836721e0571d4390,2021-12-31 10:27:32.000 UTC,0,true -16280,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec3400000000000000000000000049c884014dec517a066438b6b17a3d12862d0b6400000000000000000000000049c884014dec517a066438b6b17a3d12862d0b6400000000000000000000000000000000000000000000000000738f8943a437b600000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -16281,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec34000000000000000000000000d5f5902901bbe4221c633a4a491a21ab7e4ac091000000000000000000000000d5f5902901bbe4221c633a4a491a21ab7e4ac09100000000000000000000000000000000000000000000000000a0f2e2e18b34cd00000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -16282,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec340000000000000000000000005b808821a873774589c738a5d7191bf7d498d23c0000000000000000000000005b808821a873774589c738a5d7191bf7d498d23c00000000000000000000000000000000000000000000000000adeb048011f30000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -16283,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec34000000000000000000000000e7e5c18aa987d8c8a55e610ff39f3fa48d48dd15000000000000000000000000e7e5c18aa987d8c8a55e610ff39f3fa48d48dd1500000000000000000000000000000000000000000000000000a4762b38ba469b00000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -16286,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec34000000000000000000000000c3acf8b3e836bb75b8ea170a58967db79e54deb7000000000000000000000000c3acf8b3e836bb75b8ea170a58967db79e54deb700000000000000000000000000000000000000000000000000001fad739e454f00000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -16287,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec340000000000000000000000003345deb0e8552220eab98763309bce486efafecf0000000000000000000000003345deb0e8552220eab98763309bce486efafecf0000000000000000000000000000000000000000000000000083edb0cb6cc64700000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -16288,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0xa9f9e675000000000000000000000000a0b86991c6218b36c1d19d4a2e9eb0ce3606eb480000000000000000000000007f5c764cbc14f9669b88837ca1490cca17c31607000000000000000000000000823d0b781d951b22bd72e03a14a4656a4391c742000000000000000000000000823d0b781d951b22bd72e03a14a4656a4391c742000000000000000000000000000000000000000000000000000000001805ea7900000000000000000000000000000000000000000000000000000000000000c00000000000000000000000000000000000000000000000000000000000000000,0xa18cd3a2ce1803231268f83fd62fdc2f9ca141865bf0899a5ba3305c2c17f705,2022-02-26 10:46:02.000 UTC,0,true -16291,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec34000000000000000000000000c3acf8b3e836bb75b8ea170a58967db79e54deb7000000000000000000000000c3acf8b3e836bb75b8ea170a58967db79e54deb7000000000000000000000000000000000000000000000000007c85980e88c37700000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -16292,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec34000000000000000000000000ac5201f9e7d908a9877929807cd878051b7f2d50000000000000000000000000ac5201f9e7d908a9877929807cd878051b7f2d5000000000000000000000000000000000000000000000000014ccabc532e581b900000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -16294,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec34000000000000000000000000f4fcc2d19ae692a7aeb7d540139a37c7af1205c4000000000000000000000000f4fcc2d19ae692a7aeb7d540139a37c7af1205c40000000000000000000000000000000000000000000000001582b4c9a9db000000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,0x143675e019b6041cdc2c9f4e9ccccad2918597bfc3e23f889c606d88dadcaaad,2021-11-28 14:47:52.000 UTC,0,true -16295,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec34000000000000000000000000f0ebd71291bf99bf64a87e2094dcd8496f098bb8000000000000000000000000f0ebd71291bf99bf64a87e2094dcd8496f098bb800000000000000000000000000000000000000000000000003ab00f7b6f758d900000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,0x29bfda8c8b31eb112c47c22adc4d3ee2c4c9564196effa9ca0428a1e5e43aeb7,2021-11-29 15:47:39.000 UTC,0,true -16297,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec34000000000000000000000000047034b82573d3ed0cd16d01dfb70881b3af4d92000000000000000000000000047034b82573d3ed0cd16d01dfb70881b3af4d920000000000000000000000000000000000000000000000000157318fdf58fdbb00000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -16298,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec3400000000000000000000000090da0933225115da9df2829e2c16d85069cd7d9700000000000000000000000090da0933225115da9df2829e2c16d85069cd7d9700000000000000000000000000000000000000000000000001161dc8173c796800000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -16299,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec340000000000000000000000005e28f1e1a4bb46e9a6128b59c7550deada8095a40000000000000000000000005e28f1e1a4bb46e9a6128b59c7550deada8095a400000000000000000000000000000000000000000000000001c3d7e86ba821d900000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,0x4798089e4dbbeb6957442851f3f7bd8089b247ad30e48feabe12c71a2817446b,2021-12-26 19:25:52.000 UTC,0,true -16300,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec340000000000000000000000006365aacc94254318572bcd5fb2a6fe68a23068df0000000000000000000000006365aacc94254318572bcd5fb2a6fe68a23068df0000000000000000000000000000000000000000000000000c9257c7eb3790a500000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,0xaf0bc70c6971ea337aa24c89c3cf899fddd791669fa7152b21c4f458a6c770ea,2021-11-21 19:47:40.000 UTC,0,true -16301,0xcd9d4988c0ae61887b075ba77f08cbfad2b65068,0x3f87ff1de58128ef8fcb4c807efd776e1ac72e51,0xf4f7b41a00000000000000000000000083ac17696774768c26e48a98d115b5eccbf81a86000000000000000000000000000000000000000000000000200888947fddce22,0xba858621a76b860bee6cdae3a8bac4d4f75d2e4dfe2755cc5b74b66a13c931b2,2022-01-07 22:22:54.000 UTC,0,true -16303,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec34000000000000000000000000eb536f050d7ff33eb2d7a822ee4553f75372b72a000000000000000000000000eb536f050d7ff33eb2d7a822ee4553f75372b72a00000000000000000000000000000000000000000000000000205f42659cdc0000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -16304,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec340000000000000000000000004ebf1a5ffa9b693a8779aa3331796ab645ddcaf90000000000000000000000004ebf1a5ffa9b693a8779aa3331796ab645ddcaf9000000000000000000000000000000000000000000000000003440a6e228610000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -16305,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec34000000000000000000000000190522e3c7158e5462e0d4a6152cc00219368e90000000000000000000000000190522e3c7158e5462e0d4a6152cc00219368e900000000000000000000000000000000000000000000000000429d069189e000000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,0xd7f4b66eeacc1cfa328bf47ad7bee31b792de0fef024c7317489487d7f4dc93f,2022-01-18 18:27:36.000 UTC,0,true -16306,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec34000000000000000000000000569849661e1163a0ddbfe46f39a43c8ec65c3f81000000000000000000000000569849661e1163a0ddbfe46f39a43c8ec65c3f8100000000000000000000000000000000000000000000000000e6d50a3c2e05fe00000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -16307,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec34000000000000000000000000bd9f75b265dbdcf8460de10175f9f91bcccaf7c8000000000000000000000000bd9f75b265dbdcf8460de10175f9f91bcccaf7c800000000000000000000000000000000000000000000000003d72205ebb7f65b00000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -16308,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec34000000000000000000000000072868c29660f74cda76b23068e3f92075cb93c0000000000000000000000000072868c29660f74cda76b23068e3f92075cb93c0000000000000000000000000000000000000000000000000000e75406123288000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -16313,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec34000000000000000000000000ba763db587b947ea9bf33348189f6352c970404f000000000000000000000000ba763db587b947ea9bf33348189f6352c970404f00000000000000000000000000000000000000000000000000b1a2bc2ec5000000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -16314,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec34000000000000000000000000795080e2fe89afd22edc943b35a676f37d8f2f0a000000000000000000000000795080e2fe89afd22edc943b35a676f37d8f2f0a000000000000000000000000000000000000000000000000107694ca9cd875c300000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -16323,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec34000000000000000000000000d07d7fc9d70e703723cc08ee060a5969666934a6000000000000000000000000d07d7fc9d70e703723cc08ee060a5969666934a600000000000000000000000000000000000000000000000004bcfa8ab7807b5100000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -16324,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec3400000000000000000000000092b3346317eeafba459be28c7ffe38703dca45d800000000000000000000000092b3346317eeafba459be28c7ffe38703dca45d8000000000000000000000000000000000000000000000000001e5380cb3cd30000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -16329,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec340000000000000000000000007cc5e2bffbd7cfaf1fb68cd7ccbcb74ab2c355590000000000000000000000007cc5e2bffbd7cfaf1fb68cd7ccbcb74ab2c3555900000000000000000000000000000000000000000000000000402b38f1f4d7bf00000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -16332,0x10e6593cdda8c58a1d0f14c5164b376352a55f2f,0x467194771dae2967aef3ecbedd3bf9a310c76c65,0xa9f9e6750000000000000000000000006b175474e89094c44da98b954eedeac495271d0f000000000000000000000000da10009cbd5d07dd0cecc66161fc93d7c9000da1000000000000000000000000659db7f3ea1801dde55259fccbb1e8608f8ebdef000000000000000000000000659db7f3ea1801dde55259fccbb1e8608f8ebdef0000000000000000000000000000000000000000000000000de0b6b3a764000000000000000000000000000000000000000000000000000000000000000000c00000000000000000000000000000000000000000000000000000000000000000,,,1,true -16333,0x10e6593cdda8c58a1d0f14c5164b376352a55f2f,0x467194771dae2967aef3ecbedd3bf9a310c76c65,0xa9f9e6750000000000000000000000006b175474e89094c44da98b954eedeac495271d0f000000000000000000000000da10009cbd5d07dd0cecc66161fc93d7c9000da1000000000000000000000000659db7f3ea1801dde55259fccbb1e8608f8ebdef000000000000000000000000659db7f3ea1801dde55259fccbb1e8608f8ebdef0000000000000000000000000000000000000000000000000de0b6b3a764000000000000000000000000000000000000000000000000000000000000000000c00000000000000000000000000000000000000000000000000000000000000000,,,1,true -16334,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec34000000000000000000000000c7031208635987cad84d1ef694019d0bfaff0adb000000000000000000000000c7031208635987cad84d1ef694019d0bfaff0adb000000000000000000000000000000000000000000000000001f6438b6de52c000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -16335,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0xa9f9e675000000000000000000000000dac17f958d2ee523a2206206994597c13d831ec700000000000000000000000094b008aa00579c1307b0ef2c499ad98a8ce58e580000000000000000000000003ed50e3d283191ac4271606094b6a1bf0c8494cc0000000000000000000000003ed50e3d283191ac4271606094b6a1bf0c8494cc00000000000000000000000000000000000000000000000000000000000fb77000000000000000000000000000000000000000000000000000000000000000c00000000000000000000000000000000000000000000000000000000000000000,,,1,true -16336,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0xa9f9e675000000000000000000000000dac17f958d2ee523a2206206994597c13d831ec700000000000000000000000094b008aa00579c1307b0ef2c499ad98a8ce58e5800000000000000000000000065fa6ca0de117ce8cf124e68c3a320539d9975f300000000000000000000000065fa6ca0de117ce8cf124e68c3a320539d9975f3000000000000000000000000000000000000000000000000000000000010385800000000000000000000000000000000000000000000000000000000000000c00000000000000000000000000000000000000000000000000000000000000000,,,1,true -16338,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec34000000000000000000000000a6f425fc561201c4d5e9170e55ae3837ee9c0e90000000000000000000000000a6f425fc561201c4d5e9170e55ae3837ee9c0e90000000000000000000000000000000000000000000000000011c37937e08000000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,0x5ea6c1689e725bc6c624277e317778d1ce087c2371bccf8e578f56890f34f627,2022-06-01 08:04:54.000 UTC,0,true -16339,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0xa9f9e675000000000000000000000000dac17f958d2ee523a2206206994597c13d831ec700000000000000000000000094b008aa00579c1307b0ef2c499ad98a8ce58e580000000000000000000000009c119e6105b3e97c67a19afe3ca7ad487a129fc70000000000000000000000009c119e6105b3e97c67a19afe3ca7ad487a129fc700000000000000000000000000000000000000000000000000000000000f906000000000000000000000000000000000000000000000000000000000000000c00000000000000000000000000000000000000000000000000000000000000000,,,1,true -16340,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec340000000000000000000000009989cc2cc1ec46091ffc41b53b4f10e33744776b0000000000000000000000009989cc2cc1ec46091ffc41b53b4f10e33744776b00000000000000000000000000000000000000000000000000c4d4a33ddd484e00000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -16341,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec340000000000000000000000006af4cde70d344c2623361a9045489c7b3db8c6a50000000000000000000000006af4cde70d344c2623361a9045489c7b3db8c6a50000000000000000000000000000000000000000000000000070d0a3acd47f9f00000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -16342,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec34000000000000000000000000a8823d3e315a08e32bff594362066fa117420485000000000000000000000000a8823d3e315a08e32bff594362066fa117420485000000000000000000000000000000000000000000000000077e772392b6000000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,0x098e5704a110022e513f27ba67018de3ed61b9ea77bb993dbd47e3e038de43bb,2021-11-21 08:25:45.000 UTC,0,true -16343,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0xa9f9e675000000000000000000000000dac17f958d2ee523a2206206994597c13d831ec700000000000000000000000094b008aa00579c1307b0ef2c499ad98a8ce58e5800000000000000000000000084b1d109eb5334b79cc9e7572cea5a651bb844c800000000000000000000000084b1d109eb5334b79cc9e7572cea5a651bb844c800000000000000000000000000000000000000000000000000000000000fb77000000000000000000000000000000000000000000000000000000000000000c00000000000000000000000000000000000000000000000000000000000000000,,,1,true -16346,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0xa9f9e675000000000000000000000000dac17f958d2ee523a2206206994597c13d831ec700000000000000000000000094b008aa00579c1307b0ef2c499ad98a8ce58e58000000000000000000000000b7909a40025d939d087efedae3c7f95b7897cad9000000000000000000000000b7909a40025d939d087efedae3c7f95b7897cad900000000000000000000000000000000000000000000000000000000000fcee000000000000000000000000000000000000000000000000000000000000000c00000000000000000000000000000000000000000000000000000000000000000,,,1,true -16348,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec34000000000000000000000000e228f07818bc1dd1b42ad2edc604d1f2c200b1af000000000000000000000000e228f07818bc1dd1b42ad2edc604d1f2c200b1af000000000000000000000000000000000000000000000000000f907f2c787d0000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -16349,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec34000000000000000000000000a454c64d1ed985303c22135d2eacbadd3dfeb713000000000000000000000000a454c64d1ed985303c22135d2eacbadd3dfeb71300000000000000000000000000000000000000000000000000abff3aff6b46fe00000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -16350,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec3400000000000000000000000000de65e4c79b71931592fb489af49fa719d126b500000000000000000000000000de65e4c79b71931592fb489af49fa719d126b500000000000000000000000000000000000000000000000000e16fdeb32e6c9e00000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,0xa7b99c38f4a30681d39571b2640b11f974b30c20f88269d822ab0a17c194888b,2022-05-30 07:35:09.000 UTC,0,true -16351,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0xa9f9e675000000000000000000000000514910771af9ca656af840dff83e8264ecf986ca000000000000000000000000350a791bfc2c21f9ed5d10980dad2e2638ffa7f6000000000000000000000000f5a80332ad3652fc285f2ba6f04793d1a1590f46000000000000000000000000f5a80332ad3652fc285f2ba6f04793d1a1590f46000000000000000000000000000000000000000000000000138f54735b52fb4b00000000000000000000000000000000000000000000000000000000000000c00000000000000000000000000000000000000000000000000000000000000000,,,1,true -16352,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0xa9f9e675000000000000000000000000dac17f958d2ee523a2206206994597c13d831ec700000000000000000000000094b008aa00579c1307b0ef2c499ad98a8ce58e58000000000000000000000000bd2be39bf52a66de061ab2a70b740b6421e41a0d000000000000000000000000bd2be39bf52a66de061ab2a70b740b6421e41a0d000000000000000000000000000000000000000000000000000000000010308800000000000000000000000000000000000000000000000000000000000000c00000000000000000000000000000000000000000000000000000000000000000,,,1,true -16353,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec34000000000000000000000000a51ccd010b9122fee9a82c3428a9c4815beb34f5000000000000000000000000a51ccd010b9122fee9a82c3428a9c4815beb34f5000000000000000000000000000000000000000000000000001550f7dca7000000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -16354,0x10e6593cdda8c58a1d0f14c5164b376352a55f2f,0x467194771dae2967aef3ecbedd3bf9a310c76c65,0xa9f9e6750000000000000000000000006b175474e89094c44da98b954eedeac495271d0f000000000000000000000000da10009cbd5d07dd0cecc66161fc93d7c9000da10000000000000000000000008681943727aca47a0bdc9cd52be518a0f2d99fd60000000000000000000000008681943727aca47a0bdc9cd52be518a0f2d99fd60000000000000000000000000000000000000000000000000e043da61725000000000000000000000000000000000000000000000000000000000000000000c00000000000000000000000000000000000000000000000000000000000000000,,,1,true -16355,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec34000000000000000000000000447ccb085fb749b73bd15a697ab2bc8fe07057dd000000000000000000000000447ccb085fb749b73bd15a697ab2bc8fe07057dd0000000000000000000000000000000000000000000000000713e24c4373000000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,0x3f4b73ffb4a4865e3f5651ca81be96c06aa27e2ac891022f1141e049ede50aec,2021-12-10 00:28:06.000 UTC,0,true -16358,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0xa9f9e675000000000000000000000000dac17f958d2ee523a2206206994597c13d831ec700000000000000000000000094b008aa00579c1307b0ef2c499ad98a8ce58e5800000000000000000000000004e41002ec04fd598057095026e9d78ef852509000000000000000000000000004e41002ec04fd598057095026e9d78ef85250900000000000000000000000000000000000000000000000000000000000102ca000000000000000000000000000000000000000000000000000000000000000c00000000000000000000000000000000000000000000000000000000000000000,,,1,true -16359,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0xa9f9e675000000000000000000000000dac17f958d2ee523a2206206994597c13d831ec700000000000000000000000094b008aa00579c1307b0ef2c499ad98a8ce58e580000000000000000000000001636262f0303075118376bb00f77c942bad697940000000000000000000000001636262f0303075118376bb00f77c942bad6979400000000000000000000000000000000000000000000000000000000000fb77000000000000000000000000000000000000000000000000000000000000000c00000000000000000000000000000000000000000000000000000000000000000,,,1,true -16360,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec340000000000000000000000000cc0fdfa2a9edfc89087e405a4d4b6120ea686fb0000000000000000000000000cc0fdfa2a9edfc89087e405a4d4b6120ea686fb0000000000000000000000000000000000000000000000000711c26648b6032200000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,0xea7845e1cd7ff622e096f04d4c567260e46972b5ab3552bc3417e5aed1edc80e,2021-11-28 06:28:49.000 UTC,0,true -16361,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0xa9f9e675000000000000000000000000dac17f958d2ee523a2206206994597c13d831ec700000000000000000000000094b008aa00579c1307b0ef2c499ad98a8ce58e58000000000000000000000000eebf675984cd7ac1eb2cb70ac951118306b88288000000000000000000000000eebf675984cd7ac1eb2cb70ac951118306b88288000000000000000000000000000000000000000000000000000000000010059000000000000000000000000000000000000000000000000000000000000000c00000000000000000000000000000000000000000000000000000000000000000,,,1,true -16362,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0xa9f9e675000000000000000000000000dac17f958d2ee523a2206206994597c13d831ec700000000000000000000000094b008aa00579c1307b0ef2c499ad98a8ce58e58000000000000000000000000cd87388d31ccc184050a1afd75c980ccf800c890000000000000000000000000cd87388d31ccc184050a1afd75c980ccf800c89000000000000000000000000000000000000000000000000000000000000f906000000000000000000000000000000000000000000000000000000000000000c00000000000000000000000000000000000000000000000000000000000000000,,,1,true -16363,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0xa9f9e6750000000000000000000000001f9840a85d5af5bf1d1762f925bdaddc4201f9840000000000000000000000006fd9d7ad17242c41f7131d257212c54a0e816691000000000000000000000000b53672ab0315620662f31c429635bf8b3ac62345000000000000000000000000b53672ab0315620662f31c429635bf8b3ac62345000000000000000000000000000000000000000000000000326584266145792d00000000000000000000000000000000000000000000000000000000000000c00000000000000000000000000000000000000000000000000000000000000000,,,1,true -16365,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec34000000000000000000000000ee39c70efb6af381c15e949c53a2025e0303340d000000000000000000000000ee39c70efb6af381c15e949c53a2025e0303340d000000000000000000000000000000000000000000000000015b2a08b2c0e89300000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,0xe71492dee1e3a2b4572beab5a279cef8342e6db552bd3a9cd7c9f19f1efcb4dc,2022-05-21 10:59:50.000 UTC,0,true -16366,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0xa9f9e675000000000000000000000000dac17f958d2ee523a2206206994597c13d831ec700000000000000000000000094b008aa00579c1307b0ef2c499ad98a8ce58e58000000000000000000000000ceb96ee856fb4a0bd157e5912beb3d7542d10ac9000000000000000000000000ceb96ee856fb4a0bd157e5912beb3d7542d10ac9000000000000000000000000000000000000000000000000000000000010191800000000000000000000000000000000000000000000000000000000000000c00000000000000000000000000000000000000000000000000000000000000000,,,1,true -16368,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec34000000000000000000000000ecd9653829ac3908a73fb43d3a51e0f9b8c27193000000000000000000000000ecd9653829ac3908a73fb43d3a51e0f9b8c27193000000000000000000000000000000000000000000000000001f022da5887e0000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,0xfc82b6a6c942bcdd955d7fae5e717e47d95063152fc8a4f58e7773e278d5dac9,2022-06-16 14:58:39.000 UTC,0,true -16370,0x10e6593cdda8c58a1d0f14c5164b376352a55f2f,0x467194771dae2967aef3ecbedd3bf9a310c76c65,0xa9f9e6750000000000000000000000006b175474e89094c44da98b954eedeac495271d0f000000000000000000000000da10009cbd5d07dd0cecc66161fc93d7c9000da1000000000000000000000000a4a52844c02088e9289cb41a4601e1f8b1847384000000000000000000000000a4a52844c02088e9289cb41a4601e1f8b18473840000000000000000000000000000000000000000000000000e27c49886e6000000000000000000000000000000000000000000000000000000000000000000c00000000000000000000000000000000000000000000000000000000000000000,,,1,true -16372,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec3400000000000000000000000065deca52291340ee8af8476e7c2f7adcc869c69700000000000000000000000065deca52291340ee8af8476e7c2f7adcc869c6970000000000000000000000000000000000000000000000000394c6ad41ed318f00000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -16373,0x10e6593cdda8c58a1d0f14c5164b376352a55f2f,0x467194771dae2967aef3ecbedd3bf9a310c76c65,0xa9f9e6750000000000000000000000006b175474e89094c44da98b954eedeac495271d0f000000000000000000000000da10009cbd5d07dd0cecc66161fc93d7c9000da1000000000000000000000000843c45fb93515cfb6931353aad53cdb0570b326a000000000000000000000000843c45fb93515cfb6931353aad53cdb0570b326a0000000000000000000000000000000000000000000000000eb5e06245ea000000000000000000000000000000000000000000000000000000000000000000c00000000000000000000000000000000000000000000000000000000000000000,,,1,true -16375,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec34000000000000000000000000f787e89c570419bbefc7afea97e9a51e7a21ad2c000000000000000000000000f787e89c570419bbefc7afea97e9a51e7a21ad2c0000000000000000000000000000000000000000000000000329c6a1b533e73f00000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -16376,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec340000000000000000000000000fdee9fbb41c691025682e81534efeaf4723e9d60000000000000000000000000fdee9fbb41c691025682e81534efeaf4723e9d60000000000000000000000000000000000000000000000000394c5515113c70e00000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -16377,0x10e6593cdda8c58a1d0f14c5164b376352a55f2f,0x467194771dae2967aef3ecbedd3bf9a310c76c65,0xa9f9e6750000000000000000000000006b175474e89094c44da98b954eedeac495271d0f000000000000000000000000da10009cbd5d07dd0cecc66161fc93d7c9000da10000000000000000000000002d98ec3c5be60d9fb6f68c7f95a694b154f6e3b80000000000000000000000002d98ec3c5be60d9fb6f68c7f95a694b154f6e3b80000000000000000000000000000000000000000000000000e326d147539800000000000000000000000000000000000000000000000000000000000000000c00000000000000000000000000000000000000000000000000000000000000000,,,1,true -16379,0x10e6593cdda8c58a1d0f14c5164b376352a55f2f,0x467194771dae2967aef3ecbedd3bf9a310c76c65,0xa9f9e6750000000000000000000000006b175474e89094c44da98b954eedeac495271d0f000000000000000000000000da10009cbd5d07dd0cecc66161fc93d7c9000da10000000000000000000000007fb3507a58f8dd61944eb7d79160b16cf97e9edb0000000000000000000000007fb3507a58f8dd61944eb7d79160b16cf97e9edb0000000000000000000000000000000000000000000000000e609c82d34e000000000000000000000000000000000000000000000000000000000000000000c00000000000000000000000000000000000000000000000000000000000000000,,,1,true -16381,0x10e6593cdda8c58a1d0f14c5164b376352a55f2f,0x467194771dae2967aef3ecbedd3bf9a310c76c65,0xa9f9e6750000000000000000000000006b175474e89094c44da98b954eedeac495271d0f000000000000000000000000da10009cbd5d07dd0cecc66161fc93d7c9000da1000000000000000000000000a7ce39734d29a717ccacf7e6667de9353f09b75b000000000000000000000000a7ce39734d29a717ccacf7e6667de9353f09b75b0000000000000000000000000000000000000000000000000e4b4b8af6a7000000000000000000000000000000000000000000000000000000000000000000c00000000000000000000000000000000000000000000000000000000000000000,,,1,true -16382,0xcd9d4988c0ae61887b075ba77f08cbfad2b65068,0x3f87ff1de58128ef8fcb4c807efd776e1ac72e51,0xf4f7b41a000000000000000000000000eb6d85ff965506cf2639a828c3c04fa9f0d091120000000000000000000000000000000000000000000000012fa68ec8e62db52a,0x8d226af4e220c5a6a976c6a2155a054a68e186690c3f7bd45c6c3c4ef8c70511,2022-02-13 11:24:50.000 UTC,0,true -16383,0xcd9d4988c0ae61887b075ba77f08cbfad2b65068,0x3f87ff1de58128ef8fcb4c807efd776e1ac72e51,0xf4f7b41a000000000000000000000000f60c9808a0205535c6a211f2732c730157f163fc00000000000000000000000000000000000000000000000522938106c0f77572,0x422a579ea26966f4998cbee274231675504064a85d63bca3b0d6588c20cfb2d7,2021-12-12 16:58:44.000 UTC,0,true -16384,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec34000000000000000000000000f90181c1d7720d63588bf3578af0136082158542000000000000000000000000f90181c1d7720d63588bf3578af013608215854200000000000000000000000000000000000000000000000002bf25bfab1c87b100000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -16385,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec34000000000000000000000000d5f1fa7a6010b1afb2f08d799012390c178c2aba000000000000000000000000d5f1fa7a6010b1afb2f08d799012390c178c2aba00000000000000000000000000000000000000000000000002bea5b5ae5dd74a00000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -16386,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0xa9f9e675000000000000000000000000dac17f958d2ee523a2206206994597c13d831ec700000000000000000000000094b008aa00579c1307b0ef2c499ad98a8ce58e58000000000000000000000000f69560fd1fe5e89e57616b02540b16169a680ce6000000000000000000000000f69560fd1fe5e89e57616b02540b16169a680ce60000000000000000000000000000000000000000000000000000000000102ca000000000000000000000000000000000000000000000000000000000000000c00000000000000000000000000000000000000000000000000000000000000000,,,1,true -16387,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec34000000000000000000000000badb5a9584060b9559be9fd43793bfa233be5d95000000000000000000000000badb5a9584060b9559be9fd43793bfa233be5d95000000000000000000000000000000000000000000000000013654378ef00cb600000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,0xb5cce49a142b0adb04d300f56092405ae121f1d7492114ff13bee7b774700168,2022-03-15 12:55:05.000 UTC,0,true -16388,0x10e6593cdda8c58a1d0f14c5164b376352a55f2f,0x467194771dae2967aef3ecbedd3bf9a310c76c65,0xa9f9e6750000000000000000000000006b175474e89094c44da98b954eedeac495271d0f000000000000000000000000da10009cbd5d07dd0cecc66161fc93d7c9000da1000000000000000000000000a174fb1658f1f33ba012fa05d69bc132cca50a3c000000000000000000000000a174fb1658f1f33ba012fa05d69bc132cca50a3c0000000000000000000000000000000000000000000000000e609c82d34e000000000000000000000000000000000000000000000000000000000000000000c00000000000000000000000000000000000000000000000000000000000000000,,,1,true -16389,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec34000000000000000000000000e758f44477e1c2e131f871b061a5ca18beff6bcc000000000000000000000000e758f44477e1c2e131f871b061a5ca18beff6bcc000000000000000000000000000000000000000000000000076c57a76a4da10b00000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -16390,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec340000000000000000000000006365aacc94254318572bcd5fb2a6fe68a23068df0000000000000000000000006365aacc94254318572bcd5fb2a6fe68a23068df000000000000000000000000000000000000000000000000000020894af2460000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -16392,0x10e6593cdda8c58a1d0f14c5164b376352a55f2f,0x467194771dae2967aef3ecbedd3bf9a310c76c65,0xa9f9e6750000000000000000000000006b175474e89094c44da98b954eedeac495271d0f000000000000000000000000da10009cbd5d07dd0cecc66161fc93d7c9000da1000000000000000000000000bf130dd432296f17e7cce406735a48470ec56956000000000000000000000000bf130dd432296f17e7cce406735a48470ec569560000000000000000000000000000000000000000000000000eb5e06245ea000000000000000000000000000000000000000000000000000000000000000000c00000000000000000000000000000000000000000000000000000000000000000,,,1,true -16394,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec34000000000000000000000000a5df59adb90608f7906b66eb17d9efa8e5c4ab71000000000000000000000000a5df59adb90608f7906b66eb17d9efa8e5c4ab7100000000000000000000000000000000000000000000000007a01f91c865470000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -16395,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec3400000000000000000000000068a7d4056c98fbffa4f01f6c5496b768ebfab91500000000000000000000000068a7d4056c98fbffa4f01f6c5496b768ebfab91500000000000000000000000000000000000000000000000007661388fd0e54f100000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,0x9de02a1aeb4390524e68a475fe7d49a2fbeeea33f48dff8f578630e39dd2119c,2021-11-23 08:12:48.000 UTC,0,true -16396,0x10e6593cdda8c58a1d0f14c5164b376352a55f2f,0x467194771dae2967aef3ecbedd3bf9a310c76c65,0xa9f9e6750000000000000000000000006b175474e89094c44da98b954eedeac495271d0f000000000000000000000000da10009cbd5d07dd0cecc66161fc93d7c9000da10000000000000000000000002e87c017fa0140c482ed9f1dc424c364d555152b0000000000000000000000002e87c017fa0140c482ed9f1dc424c364d555152b0000000000000000000000000000000000000000000000000eb5e06245ea000000000000000000000000000000000000000000000000000000000000000000c00000000000000000000000000000000000000000000000000000000000000000,,,1,true -16397,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec340000000000000000000000004c6a5ec9677de01b8ee7b271dbd5c0383bf50a030000000000000000000000004c6a5ec9677de01b8ee7b271dbd5c0383bf50a030000000000000000000000000000000000000000000000000774fdabb3b65ccc00000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,0x4daa8b2c1d63b6df693b4643cae1a0c5f9e1ac35249ed6407a5b3effd6f5911d,2021-11-23 09:07:33.000 UTC,0,true -16398,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec34000000000000000000000000986b4eb9604972b9f0fe3e37dc531412bf19d39e000000000000000000000000986b4eb9604972b9f0fe3e37dc531412bf19d39e000000000000000000000000000000000000000000000000076e267049e741f200000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,0x29c5c972cf2b1a63a4171db00990d516d20261f1f8337eb5402b2c6b5a6a2973,2021-11-23 09:15:43.000 UTC,0,true -16399,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0xa9f9e675000000000000000000000000a0b86991c6218b36c1d19d4a2e9eb0ce3606eb480000000000000000000000007f5c764cbc14f9669b88837ca1490cca17c316070000000000000000000000009337aae58a723ce45f9d4ab24fb85b19ae6b6ee70000000000000000000000009337aae58a723ce45f9d4ab24fb85b19ae6b6ee700000000000000000000000000000000000000000000000000000000093ddc6e00000000000000000000000000000000000000000000000000000000000000c00000000000000000000000000000000000000000000000000000000000000000,0x4a0dedc00bccde5a709816b89690917c53613aa886df789e212271e1935e1118,2022-06-16 12:26:12.000 UTC,0,true -16400,0x10e6593cdda8c58a1d0f14c5164b376352a55f2f,0x467194771dae2967aef3ecbedd3bf9a310c76c65,0xa9f9e6750000000000000000000000006b175474e89094c44da98b954eedeac495271d0f000000000000000000000000da10009cbd5d07dd0cecc66161fc93d7c9000da1000000000000000000000000e1c57826461421f2acffd361673ceafdb71f349f000000000000000000000000e1c57826461421f2acffd361673ceafdb71f349f0000000000000000000000000000000000000000000000000e4b4b8af6a7000000000000000000000000000000000000000000000000000000000000000000c00000000000000000000000000000000000000000000000000000000000000000,,,1,true -16401,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec340000000000000000000000003a0d53d61037ac768a7e18a86428c3cfd662ed2a0000000000000000000000003a0d53d61037ac768a7e18a86428c3cfd662ed2a00000000000000000000000000000000000000000000000000305aae3e83e6b000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -16402,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec34000000000000000000000000fd5b1e1ce2b0284a6b716e15e82420f2b79d5f7b000000000000000000000000fd5b1e1ce2b0284a6b716e15e82420f2b79d5f7b000000000000000000000000000000000000000000000000013a80b2fd5eed2900000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -16404,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec3400000000000000000000000045a5549b2baf17dcaa883e1b4f40bc89abce8a2e00000000000000000000000045a5549b2baf17dcaa883e1b4f40bc89abce8a2e0000000000000000000000000000000000000000000000000000ed4d5daec70000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -16405,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec34000000000000000000000000209e3dcad4a178be4475238fd6cc4e62b7b6ac80000000000000000000000000209e3dcad4a178be4475238fd6cc4e62b7b6ac800000000000000000000000000000000000000000000000000986fd4c05d594c900000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -16410,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec34000000000000000000000000cba87d88699365cd440366719c21ac7f1b790a12000000000000000000000000cba87d88699365cd440366719c21ac7f1b790a120000000000000000000000000000000000000000000000000082b65d343cd14000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,0x06ba81ec66ee077dabc49e261b4598b3878549bac47dcea0880430fb00db5269,2021-11-21 15:35:06.000 UTC,0,true -16412,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec340000000000000000000000003ead180ae502757fc6e444e4cf3d861fe27fe0ac0000000000000000000000003ead180ae502757fc6e444e4cf3d861fe27fe0ac0000000000000000000000000000000000000000000000003efe1e383e5e4a0800000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,0xff672c0d2453349ac0f43b52568ed858b09c7b4aacad78cd1713693e4e5bfdb2,2021-11-23 01:57:45.000 UTC,0,true -16414,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec34000000000000000000000000fbcf84dec4d532881543edfab762844d5dd100dc000000000000000000000000fbcf84dec4d532881543edfab762844d5dd100dc00000000000000000000000000000000000000000000000002dd5af7a414616c00000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -16415,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec34000000000000000000000000677d9c4f92616e96b271af5c07eaf91804be6ac9000000000000000000000000677d9c4f92616e96b271af5c07eaf91804be6ac9000000000000000000000000000000000000000000000000000f6d48f4c67d7500000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -16417,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0xa9f9e675000000000000000000000000a0b86991c6218b36c1d19d4a2e9eb0ce3606eb480000000000000000000000007f5c764cbc14f9669b88837ca1490cca17c3160700000000000000000000000052f654faf01d809aba82e645bde093f5037924fb00000000000000000000000052f654faf01d809aba82e645bde093f5037924fb00000000000000000000000000000000000000000000000000000000050524b000000000000000000000000000000000000000000000000000000000000000c00000000000000000000000000000000000000000000000000000000000000000,,,1,true -16418,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec3400000000000000000000000004d96836b10b3fa48970e7a9929ab5c40d1ab4ec00000000000000000000000004d96836b10b3fa48970e7a9929ab5c40d1ab4ec00000000000000000000000000000000000000000000000000f8b0a10e47000000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -16424,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec340000000000000000000000003e5ae85b28b61cd23b9781ea8888352661e7fb5d0000000000000000000000003e5ae85b28b61cd23b9781ea8888352661e7fb5d00000000000000000000000000000000000000000000000001252471e143194700000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -16428,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec34000000000000000000000000d5bc81829141cc7ae5039cab8ea719798331f6f6000000000000000000000000d5bc81829141cc7ae5039cab8ea719798331f6f600000000000000000000000000000000000000000000000001397d082bc58e1f00000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,0x077110c41b2aeea0f25f2a05398cfba1ca64ab8de1c97426c184f60a022c27d0,2021-11-28 05:22:57.000 UTC,0,true -16430,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec34000000000000000000000000196e7bcc060303cf386e40095a111277f6c91f3b000000000000000000000000196e7bcc060303cf386e40095a111277f6c91f3b000000000000000000000000000000000000000000000000014efac9a304501300000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,0x7cca7d6fbba6459d52f46a2b2e0c25494bfc9ab89cb499930266dc4083bd8e14,2022-05-21 10:10:44.000 UTC,0,true -16431,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec340000000000000000000000006a26cae39c5d0ffa194f3ac438f4ffcae10da2130000000000000000000000006a26cae39c5d0ffa194f3ac438f4ffcae10da21300000000000000000000000000000000000000000000000000b1a2bc2ec5000000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -16432,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec340000000000000000000000006a26cae39c5d0ffa194f3ac438f4ffcae10da2130000000000000000000000006a26cae39c5d0ffa194f3ac438f4ffcae10da2130000000000000000000000000000000000000000000000000167a3f9761cf96b00000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -16433,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0xa9f9e675000000000000000000000000dac17f958d2ee523a2206206994597c13d831ec700000000000000000000000094b008aa00579c1307b0ef2c499ad98a8ce58e580000000000000000000000009ef9c73d7d8239b93fe48b35a6974292c2ff1e1c0000000000000000000000009ef9c73d7d8239b93fe48b35a6974292c2ff1e1c00000000000000000000000000000000000000000000000000000000200e7e8000000000000000000000000000000000000000000000000000000000000000c00000000000000000000000000000000000000000000000000000000000000000,0xf909b92d7c3e8ce7cbf767dfe9a4abb80988d8da17fdf076f1b244427829a10d,2021-12-13 11:25:22.000 UTC,0,true -16435,0xcd9d4988c0ae61887b075ba77f08cbfad2b65068,0x3f87ff1de58128ef8fcb4c807efd776e1ac72e51,0xf4f7b41a0000000000000000000000005b78f06123ee99dc8b21d4e1ef51afe08059d5ec00000000000000000000000000000000000000000000001003c2a21ecbd2e6b2,0x90885767125bec492a85c382c523a931c0849eb2e5374b1e08043a591a72b6e5,2022-01-24 17:12:09.000 UTC,0,true -16437,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec34000000000000000000000000968c9fd77857295327d6a516d2be3b03ceef3cc0000000000000000000000000968c9fd77857295327d6a516d2be3b03ceef3cc000000000000000000000000000000000000000000000000000b1a2bc2ec5000000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,0x3544edb6389e79875b2cae18b808baa7b3fe34155ba55ad2320bfb66b91753ad,2021-12-27 15:32:51.000 UTC,0,true -16438,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec3400000000000000000000000056a090734d40037545d617a5ef56309b3ed499a400000000000000000000000056a090734d40037545d617a5ef56309b3ed499a40000000000000000000000000000000000000000000000000085f15ef08539c000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,0x7653674a547ab3f6cae714170181051a8c7e1c233aea1349c4e00938b431fcea,2022-06-01 08:52:56.000 UTC,0,true -16439,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec340000000000000000000000002d705adf785cc44d3b8b0ab42819252633ccdaec0000000000000000000000002d705adf785cc44d3b8b0ab42819252633ccdaec0000000000000000000000000000000000000000000000000109eeec5930d1b600000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,0x2afc08446a1342037e6c1194ff69b61966c4d872949cc23711088abe1134a37e,2021-12-27 10:20:30.000 UTC,0,true -16440,0xcd9d4988c0ae61887b075ba77f08cbfad2b65068,0x3f87ff1de58128ef8fcb4c807efd776e1ac72e51,0xf4f7b41a000000000000000000000000891acdefa5f01ab48bf69ff789ce9d3a9997f01700000000000000000000000000000000000000000000000440e5988847f53549,,,1,true -16445,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec340000000000000000000000000d063eaceaa164db6eb296b6c7011cbb6f5355770000000000000000000000000d063eaceaa164db6eb296b6c7011cbb6f535577000000000000000000000000000000000000000000000000013fbe85edc9000000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -16446,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec34000000000000000000000000f256bb63d41a2c1fca4250d6c9a6fb7ff69df7a7000000000000000000000000f256bb63d41a2c1fca4250d6c9a6fb7ff69df7a700000000000000000000000000000000000000000000000001cdda4faccd000000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -16448,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec34000000000000000000000000beb3662c34c8be5172b32ef9d3012e5c7b8680c0000000000000000000000000beb3662c34c8be5172b32ef9d3012e5c7b8680c00000000000000000000000000000000000000000000000000424ea52507ecb0000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -16449,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec34000000000000000000000000c27581421dcdcdec3d3f916414e117f82e185465000000000000000000000000c27581421dcdcdec3d3f916414e117f82e18546500000000000000000000000000000000000000000000000000ae6a8c035c4b0000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -16450,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec34000000000000000000000000ffd5e9186f89ce3a22f836dab29115a5afb29992000000000000000000000000ffd5e9186f89ce3a22f836dab29115a5afb29992000000000000000000000000000000000000000000000000001b475ca8c2ad6800000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -16451,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec34000000000000000000000000a67a20dfc73c86f6ba5f4438d8914e3f6780d397000000000000000000000000a67a20dfc73c86f6ba5f4438d8914e3f6780d3970000000000000000000000000000000000000000000000000058aee4087cb95500000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -16452,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec34000000000000000000000000368f15629684eaeedc064926badd534e535dd79c000000000000000000000000368f15629684eaeedc064926badd534e535dd79c000000000000000000000000000000000000000000000000035c7041ea94814300000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -16453,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec3400000000000000000000000097ce2212e16138c638f90a873872de76aa1f6ec300000000000000000000000097ce2212e16138c638f90a873872de76aa1f6ec3000000000000000000000000000000000000000000000000027258b897331f1d00000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -16455,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec34000000000000000000000000e26917d01160f51dc28a58be9e1489b52a3eae67000000000000000000000000e26917d01160f51dc28a58be9e1489b52a3eae6700000000000000000000000000000000000000000000000000194dd5c046bac000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -16456,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec34000000000000000000000000f6a82e1452f38fdcb4f15e050ccec895bde84456000000000000000000000000f6a82e1452f38fdcb4f15e050ccec895bde84456000000000000000000000000000000000000000000000000046d29253f5c7ed600000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -16458,0xcd9d4988c0ae61887b075ba77f08cbfad2b65068,0x3f87ff1de58128ef8fcb4c807efd776e1ac72e51,0xf4f7b41a000000000000000000000000386f3f9d3f5bcefaefe962fbeb849ca6c4dadd7c00000000000000000000000000000000000000000000000000005af3107a4000,,,1,true -16459,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec34000000000000000000000000fbe3e8d699640cfa4cd808a247d0fd2349aef9b5000000000000000000000000fbe3e8d699640cfa4cd808a247d0fd2349aef9b5000000000000000000000000000000000000000000000000000acfec3eec1f8000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -16460,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec340000000000000000000000005533f954d78aaf3601b8e0aa1f3ce4140bde23d70000000000000000000000005533f954d78aaf3601b8e0aa1f3ce4140bde23d70000000000000000000000000000000000000000000000000f410cfa414c7a0000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -16467,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec34000000000000000000000000da445e727b9cfe07b83b4b8fe7fcb3f70e326500000000000000000000000000da445e727b9cfe07b83b4b8fe7fcb3f70e32650000000000000000000000000000000000000000000000000000a8371da2115a8e00000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -16469,0xcd9d4988c0ae61887b075ba77f08cbfad2b65068,0x3f87ff1de58128ef8fcb4c807efd776e1ac72e51,0xf4f7b41a000000000000000000000000f486d56cce70c481b3455af901fcc4f03fee8107000000000000000000000000000000000000000000000002e68d65f925534e36,,,1,true -16470,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec340000000000000000000000004d548894265f1ac957a4a9a6a9f0bbf28317949e0000000000000000000000004d548894265f1ac957a4a9a6a9f0bbf28317949e0000000000000000000000000000000000000000000000000aafd120b1854e5a00000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,0x7dc6b3af103c6ff2538eac1b54dd11a0134578ab7845e4d0ff1c7fe771385436,2021-12-07 11:21:53.000 UTC,0,true -16472,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec340000000000000000000000004ee538b3a9c12644a9d3ae20a67437e8d18b91c20000000000000000000000004ee538b3a9c12644a9d3ae20a67437e8d18b91c200000000000000000000000000000000000000000000000006156aea5d1265f100000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -16474,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec34000000000000000000000000350a4336c8acf120d23ef732d24969602d7b9b0b000000000000000000000000350a4336c8acf120d23ef732d24969602d7b9b0b00000000000000000000000000000000000000000000000001603a4f0f14ce0000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -16475,0xcd9d4988c0ae61887b075ba77f08cbfad2b65068,0x3f87ff1de58128ef8fcb4c807efd776e1ac72e51,0xf4f7b41a0000000000000000000000009c39e0731f467f4875d4938ca4a79502d137d7ad000000000000000000000000000000000000000000000009d300bfe10af7aebb,0xaec781e8f66b48dee3b2eb023a677a14579473964129ae619f8bfed6da2b2fd1,2022-03-21 08:59:51.000 UTC,0,true -16477,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec3400000000000000000000000065be5a73d072e8454d88c3ffe1a278d5ff2fff3400000000000000000000000065be5a73d072e8454d88c3ffe1a278d5ff2fff34000000000000000000000000000000000000000000000000013fbe85edc9000000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -16478,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec34000000000000000000000000decd4b961b1984c44afbadbe2844777a627572aa000000000000000000000000decd4b961b1984c44afbadbe2844777a627572aa0000000000000000000000000000000000000000000000000853a0d2313c000000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,0x20020ff990bc70dd94ff094a61208cc6c34a4b98493aa4a49caf7f397f3924b3,2022-01-13 00:24:33.000 UTC,0,true -16480,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec34000000000000000000000000a535d27b204d9c2280be5ccb73ae48bf19f52c94000000000000000000000000a535d27b204d9c2280be5ccb73ae48bf19f52c94000000000000000000000000000000000000000000000000001b4cbd353e684000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -16481,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0xa9f9e675000000000000000000000000a0b86991c6218b36c1d19d4a2e9eb0ce3606eb480000000000000000000000007f5c764cbc14f9669b88837ca1490cca17c31607000000000000000000000000a535d27b204d9c2280be5ccb73ae48bf19f52c94000000000000000000000000a535d27b204d9c2280be5ccb73ae48bf19f52c940000000000000000000000000000000000000000000000000000000023f2241300000000000000000000000000000000000000000000000000000000000000c00000000000000000000000000000000000000000000000000000000000000000,,,1,true -16482,0x10e6593cdda8c58a1d0f14c5164b376352a55f2f,0x467194771dae2967aef3ecbedd3bf9a310c76c65,0xa9f9e6750000000000000000000000006b175474e89094c44da98b954eedeac495271d0f000000000000000000000000da10009cbd5d07dd0cecc66161fc93d7c9000da10000000000000000000000000ab0bdde61532fa3df988646d606326f4c93f6dd0000000000000000000000000ab0bdde61532fa3df988646d606326f4c93f6dd0000000000000000000000000000000000000000000000000e4b4b8af6a7000000000000000000000000000000000000000000000000000000000000000000c00000000000000000000000000000000000000000000000000000000000000000,,,1,true -16483,0x10e6593cdda8c58a1d0f14c5164b376352a55f2f,0x467194771dae2967aef3ecbedd3bf9a310c76c65,0xa9f9e6750000000000000000000000006b175474e89094c44da98b954eedeac495271d0f000000000000000000000000da10009cbd5d07dd0cecc66161fc93d7c9000da1000000000000000000000000da7c9a05cde990986310b4c77a2e92da2db0f542000000000000000000000000da7c9a05cde990986310b4c77a2e92da2db0f5420000000000000000000000000000000000000000000000000e4b4b8af6a7000000000000000000000000000000000000000000000000000000000000000000c00000000000000000000000000000000000000000000000000000000000000000,,,1,true -16484,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec34000000000000000000000000b41b0b63018085c58b5ac521303e9f23bb2edd14000000000000000000000000b41b0b63018085c58b5ac521303e9f23bb2edd14000000000000000000000000000000000000000000000000013294476f8a944d00000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -16485,0x10e6593cdda8c58a1d0f14c5164b376352a55f2f,0x467194771dae2967aef3ecbedd3bf9a310c76c65,0xa9f9e6750000000000000000000000006b175474e89094c44da98b954eedeac495271d0f000000000000000000000000da10009cbd5d07dd0cecc66161fc93d7c9000da10000000000000000000000008fb6eb0df60b4b574d4dcd34b330b7c969b986390000000000000000000000008fb6eb0df60b4b574d4dcd34b330b7c969b986390000000000000000000000000000000000000000000000000e27c49886e6000000000000000000000000000000000000000000000000000000000000000000c00000000000000000000000000000000000000000000000000000000000000000,,,1,true -16486,0x10e6593cdda8c58a1d0f14c5164b376352a55f2f,0x467194771dae2967aef3ecbedd3bf9a310c76c65,0xa9f9e6750000000000000000000000006b175474e89094c44da98b954eedeac495271d0f000000000000000000000000da10009cbd5d07dd0cecc66161fc93d7c9000da1000000000000000000000000faeb5539ae06c460aa83e1849a69b9bfd52395d5000000000000000000000000faeb5539ae06c460aa83e1849a69b9bfd52395d50000000000000000000000000000000000000000000000000eb5e06245ea000000000000000000000000000000000000000000000000000000000000000000c00000000000000000000000000000000000000000000000000000000000000000,,,1,true -16487,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec34000000000000000000000000357d5b3b1527f642da8765b98b4717e907a930ec000000000000000000000000357d5b3b1527f642da8765b98b4717e907a930ec00000000000000000000000000000000000000000000000000f5b658930f605100000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,0x1c300505e51683db6eb1722d01ae9758261b6a4b40abb81d6c9bef9993fa4bed,2022-06-02 07:17:18.000 UTC,0,true -16488,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0xa9f9e675000000000000000000000000a0b86991c6218b36c1d19d4a2e9eb0ce3606eb480000000000000000000000007f5c764cbc14f9669b88837ca1490cca17c31607000000000000000000000000b5b783402b764ae687386af9a87da28eee027a46000000000000000000000000b5b783402b764ae687386af9a87da28eee027a46000000000000000000000000000000000000000000000000000000000102cefe00000000000000000000000000000000000000000000000000000000000000c00000000000000000000000000000000000000000000000000000000000000000,,,1,true -16489,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec34000000000000000000000000bb7e284fd7b65a64581d1aa227e79c640899e4b5000000000000000000000000bb7e284fd7b65a64581d1aa227e79c640899e4b500000000000000000000000000000000000000000000000001547e089196b43500000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -16490,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec3400000000000000000000000032aa102827efed975456b03f712337511f6b0a1500000000000000000000000032aa102827efed975456b03f712337511f6b0a1500000000000000000000000000000000000000000000000004db73254763000000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,0x34690ffc37d61a32cfc2984f18caee18976957426b0131db667bec35f43d0dca,2021-12-11 06:38:12.000 UTC,0,true -16494,0x10e6593cdda8c58a1d0f14c5164b376352a55f2f,0x467194771dae2967aef3ecbedd3bf9a310c76c65,0xa9f9e6750000000000000000000000006b175474e89094c44da98b954eedeac495271d0f000000000000000000000000da10009cbd5d07dd0cecc66161fc93d7c9000da10000000000000000000000007e0de437a96a9844dde4e43326aa83b3cc6384f00000000000000000000000007e0de437a96a9844dde4e43326aa83b3cc6384f00000000000000000000000000000000000000000000000000e4b4b8af6a7000000000000000000000000000000000000000000000000000000000000000000c00000000000000000000000000000000000000000000000000000000000000000,,,1,true -16495,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec34000000000000000000000000c5fd654ba7c9c9d6b5710fc347c1306e855ec582000000000000000000000000c5fd654ba7c9c9d6b5710fc347c1306e855ec58200000000000000000000000000000000000000000000000001d74d21b9ea085a00000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,0x9895cb951d6d8d37de3cc3426b1ba05e91a37b2548c3957c4d4c50e6d989d36b,2021-11-27 10:02:08.000 UTC,0,true -16498,0x10e6593cdda8c58a1d0f14c5164b376352a55f2f,0x467194771dae2967aef3ecbedd3bf9a310c76c65,0xa9f9e6750000000000000000000000006b175474e89094c44da98b954eedeac495271d0f000000000000000000000000da10009cbd5d07dd0cecc66161fc93d7c9000da1000000000000000000000000fcffa243e47f0f9607b426312a3f54daba0d4c93000000000000000000000000fcffa243e47f0f9607b426312a3f54daba0d4c930000000000000000000000000000000000000000000000000e4b4b8af6a7000000000000000000000000000000000000000000000000000000000000000000c00000000000000000000000000000000000000000000000000000000000000000,,,1,true -16499,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0xa9f9e675000000000000000000000000a0b86991c6218b36c1d19d4a2e9eb0ce3606eb480000000000000000000000007f5c764cbc14f9669b88837ca1490cca17c316070000000000000000000000000761b46d1a9309e449c06215827573143f85d7b60000000000000000000000000761b46d1a9309e449c06215827573143f85d7b6000000000000000000000000000000000000000000000000000000027f6a7e5600000000000000000000000000000000000000000000000000000000000000c00000000000000000000000000000000000000000000000000000000000000000,0xaf715fefcfcc6c26a2c745dd31f84db82a119134191d0abcb72a91abd114caeb,2021-12-01 10:09:59.000 UTC,0,true -16500,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec340000000000000000000000000761b46d1a9309e449c06215827573143f85d7b60000000000000000000000000761b46d1a9309e449c06215827573143f85d7b60000000000000000000000000000000000000000000000000182fc338fd1361b00000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,0xe00f3fc44303c7fd3065abf96315e481e722ac4dfe6d3dbbefbf5fbfcb4f399e,2021-12-01 10:06:06.000 UTC,0,true -16501,0x10e6593cdda8c58a1d0f14c5164b376352a55f2f,0x467194771dae2967aef3ecbedd3bf9a310c76c65,0xa9f9e6750000000000000000000000006b175474e89094c44da98b954eedeac495271d0f000000000000000000000000da10009cbd5d07dd0cecc66161fc93d7c9000da100000000000000000000000002260cf37fe45c007824d31815d561ed6204befd00000000000000000000000002260cf37fe45c007824d31815d561ed6204befd0000000000000000000000000000000000000000000000000e92596fd629000000000000000000000000000000000000000000000000000000000000000000c00000000000000000000000000000000000000000000000000000000000000000,,,1,true -16502,0x10e6593cdda8c58a1d0f14c5164b376352a55f2f,0x467194771dae2967aef3ecbedd3bf9a310c76c65,0xa9f9e6750000000000000000000000006b175474e89094c44da98b954eedeac495271d0f000000000000000000000000da10009cbd5d07dd0cecc66161fc93d7c9000da1000000000000000000000000151997baecc36419f91a03e3cfa79b06ae99669f000000000000000000000000151997baecc36419f91a03e3cfa79b06ae99669f0000000000000000000000000000000000000000000000000e2f957bf167800000000000000000000000000000000000000000000000000000000000000000c00000000000000000000000000000000000000000000000000000000000000000,,,1,true -16503,0x10e6593cdda8c58a1d0f14c5164b376352a55f2f,0x467194771dae2967aef3ecbedd3bf9a310c76c65,0xa9f9e6750000000000000000000000006b175474e89094c44da98b954eedeac495271d0f000000000000000000000000da10009cbd5d07dd0cecc66161fc93d7c9000da1000000000000000000000000c8fe1c27d568ee2177e27154d954352877d6899b000000000000000000000000c8fe1c27d568ee2177e27154d954352877d6899b0000000000000000000000000000000000000000000000000eb5e06245ea000000000000000000000000000000000000000000000000000000000000000000c00000000000000000000000000000000000000000000000000000000000000000,,,1,true -16504,0x10e6593cdda8c58a1d0f14c5164b376352a55f2f,0x467194771dae2967aef3ecbedd3bf9a310c76c65,0xa9f9e6750000000000000000000000006b175474e89094c44da98b954eedeac495271d0f000000000000000000000000da10009cbd5d07dd0cecc66161fc93d7c9000da1000000000000000000000000c674e0feb95a9203f670417a9aa1745e4c509842000000000000000000000000c674e0feb95a9203f670417a9aa1745e4c5098420000000000000000000000000000000000000000000000000eb5e06245ea000000000000000000000000000000000000000000000000000000000000000000c00000000000000000000000000000000000000000000000000000000000000000,,,1,true -16505,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec34000000000000000000000000f7e36f0a2af61953b20f0da39eb53d9d22b6c07d000000000000000000000000f7e36f0a2af61953b20f0da39eb53d9d22b6c07d00000000000000000000000000000000000000000000000000503b54323d336300000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -16506,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0xa9f9e675000000000000000000000000dac17f958d2ee523a2206206994597c13d831ec700000000000000000000000094b008aa00579c1307b0ef2c499ad98a8ce58e58000000000000000000000000d07f1b97fbd20521e53c69f4fd34de6542cb00b9000000000000000000000000d07f1b97fbd20521e53c69f4fd34de6542cb00b90000000000000000000000000000000000000000000000000000000000102ca000000000000000000000000000000000000000000000000000000000000000c00000000000000000000000000000000000000000000000000000000000000000,,,1,true -16507,0x10e6593cdda8c58a1d0f14c5164b376352a55f2f,0x467194771dae2967aef3ecbedd3bf9a310c76c65,0xa9f9e6750000000000000000000000006b175474e89094c44da98b954eedeac495271d0f000000000000000000000000da10009cbd5d07dd0cecc66161fc93d7c9000da1000000000000000000000000b7f08230e88f43df94fb2af78175de42f88e5148000000000000000000000000b7f08230e88f43df94fb2af78175de42f88e51480000000000000000000000000000000000000000000000000e609c82d34e000000000000000000000000000000000000000000000000000000000000000000c00000000000000000000000000000000000000000000000000000000000000000,,,1,true -16508,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec34000000000000000000000000ef0171fedb4bdd6f1713d204d5978bb2b138909d000000000000000000000000ef0171fedb4bdd6f1713d204d5978bb2b138909d00000000000000000000000000000000000000000000000000815b7486d3400000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,0x3ad2cdd33642ac431389dda238537c66c2c729c163c5b229eaa9736b22e75a76,2022-02-08 11:16:31.000 UTC,0,true -16509,0x10e6593cdda8c58a1d0f14c5164b376352a55f2f,0x467194771dae2967aef3ecbedd3bf9a310c76c65,0xa9f9e6750000000000000000000000006b175474e89094c44da98b954eedeac495271d0f000000000000000000000000da10009cbd5d07dd0cecc66161fc93d7c9000da1000000000000000000000000da21cd0183af61a6666988364f281092256fe6ab000000000000000000000000da21cd0183af61a6666988364f281092256fe6ab0000000000000000000000000000000000000000000000000eb5e06245ea000000000000000000000000000000000000000000000000000000000000000000c00000000000000000000000000000000000000000000000000000000000000000,,,1,true -16510,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec340000000000000000000000007b660807b7208cc17c80f606eed0e7da5f69e7710000000000000000000000007b660807b7208cc17c80f606eed0e7da5f69e771000000000000000000000000000000000000000000000000003f5fcd1968bc0000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -16511,0x10e6593cdda8c58a1d0f14c5164b376352a55f2f,0x467194771dae2967aef3ecbedd3bf9a310c76c65,0xa9f9e6750000000000000000000000006b175474e89094c44da98b954eedeac495271d0f000000000000000000000000da10009cbd5d07dd0cecc66161fc93d7c9000da100000000000000000000000000555c5a397d52b52d5f18f19695e30d2d7fe8cc00000000000000000000000000555c5a397d52b52d5f18f19695e30d2d7fe8cc0000000000000000000000000000000000000000000000000eb5e06245ea000000000000000000000000000000000000000000000000000000000000000000c00000000000000000000000000000000000000000000000000000000000000000,,,1,true -16512,0x10e6593cdda8c58a1d0f14c5164b376352a55f2f,0x467194771dae2967aef3ecbedd3bf9a310c76c65,0xa9f9e6750000000000000000000000006b175474e89094c44da98b954eedeac495271d0f000000000000000000000000da10009cbd5d07dd0cecc66161fc93d7c9000da100000000000000000000000066fda376c00d156e3c14767ae54f3e4b7e8c6d7400000000000000000000000066fda376c00d156e3c14767ae54f3e4b7e8c6d740000000000000000000000000000000000000000000000000eb5e06245ea000000000000000000000000000000000000000000000000000000000000000000c00000000000000000000000000000000000000000000000000000000000000000,,,1,true -16513,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec34000000000000000000000000dd15b4342a031bbd032a9bf1d34fbc7515f7933d000000000000000000000000dd15b4342a031bbd032a9bf1d34fbc7515f7933d00000000000000000000000000000000000000000000000001ea818d75fd81f300000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -16514,0x10e6593cdda8c58a1d0f14c5164b376352a55f2f,0x467194771dae2967aef3ecbedd3bf9a310c76c65,0xa9f9e6750000000000000000000000006b175474e89094c44da98b954eedeac495271d0f000000000000000000000000da10009cbd5d07dd0cecc66161fc93d7c9000da100000000000000000000000091104fd56af1e295c626108f49a144e44674e48d00000000000000000000000091104fd56af1e295c626108f49a144e44674e48d0000000000000000000000000000000000000000000000000e27c49886e6000000000000000000000000000000000000000000000000000000000000000000c00000000000000000000000000000000000000000000000000000000000000000,,,1,true -16515,0x10e6593cdda8c58a1d0f14c5164b376352a55f2f,0x467194771dae2967aef3ecbedd3bf9a310c76c65,0xa9f9e6750000000000000000000000006b175474e89094c44da98b954eedeac495271d0f000000000000000000000000da10009cbd5d07dd0cecc66161fc93d7c9000da1000000000000000000000000e78cbe52ab6f05dd39dde596b6885d36ece13f41000000000000000000000000e78cbe52ab6f05dd39dde596b6885d36ece13f410000000000000000000000000000000000000000000000000e2edf95d073000000000000000000000000000000000000000000000000000000000000000000c00000000000000000000000000000000000000000000000000000000000000000,,,1,true -16516,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec3400000000000000000000000088307d3bd0e4a1908c442d2d05c8651e643333b400000000000000000000000088307d3bd0e4a1908c442d2d05c8651e643333b400000000000000000000000000000000000000000000000000214fc675ec700000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -16517,0x10e6593cdda8c58a1d0f14c5164b376352a55f2f,0x467194771dae2967aef3ecbedd3bf9a310c76c65,0xa9f9e6750000000000000000000000006b175474e89094c44da98b954eedeac495271d0f000000000000000000000000da10009cbd5d07dd0cecc66161fc93d7c9000da10000000000000000000000004f904839aa85c581d91d45ab190609f3573275710000000000000000000000004f904839aa85c581d91d45ab190609f3573275710000000000000000000000000000000000000000000000000eb5e06245ea000000000000000000000000000000000000000000000000000000000000000000c00000000000000000000000000000000000000000000000000000000000000000,,,1,true -16518,0x10e6593cdda8c58a1d0f14c5164b376352a55f2f,0x467194771dae2967aef3ecbedd3bf9a310c76c65,0xa9f9e6750000000000000000000000006b175474e89094c44da98b954eedeac495271d0f000000000000000000000000da10009cbd5d07dd0cecc66161fc93d7c9000da10000000000000000000000000f51996a94205f0700b0090e5be3db5d08d887cb0000000000000000000000000f51996a94205f0700b0090e5be3db5d08d887cb0000000000000000000000000000000000000000000000000f43fc2c04ee000000000000000000000000000000000000000000000000000000000000000000c00000000000000000000000000000000000000000000000000000000000000000,,,1,true -16519,0x10e6593cdda8c58a1d0f14c5164b376352a55f2f,0x467194771dae2967aef3ecbedd3bf9a310c76c65,0xa9f9e6750000000000000000000000006b175474e89094c44da98b954eedeac495271d0f000000000000000000000000da10009cbd5d07dd0cecc66161fc93d7c9000da100000000000000000000000035afbcc1be94ed3b3c0bb9a71561aeae5d47dc8e00000000000000000000000035afbcc1be94ed3b3c0bb9a71561aeae5d47dc8e0000000000000000000000000000000000000000000000000e40481bf7d9400000000000000000000000000000000000000000000000000000000000000000c00000000000000000000000000000000000000000000000000000000000000000,,,1,true -16520,0x10e6593cdda8c58a1d0f14c5164b376352a55f2f,0x467194771dae2967aef3ecbedd3bf9a310c76c65,0xa9f9e6750000000000000000000000006b175474e89094c44da98b954eedeac495271d0f000000000000000000000000da10009cbd5d07dd0cecc66161fc93d7c9000da1000000000000000000000000623b22606612eff9d107d8acbdbdc54b2691190c000000000000000000000000623b22606612eff9d107d8acbdbdc54b2691190c0000000000000000000000000000000000000000000000000f43fc2c04ee000000000000000000000000000000000000000000000000000000000000000000c00000000000000000000000000000000000000000000000000000000000000000,,,1,true -16521,0x10e6593cdda8c58a1d0f14c5164b376352a55f2f,0x467194771dae2967aef3ecbedd3bf9a310c76c65,0xa9f9e6750000000000000000000000006b175474e89094c44da98b954eedeac495271d0f000000000000000000000000da10009cbd5d07dd0cecc66161fc93d7c9000da1000000000000000000000000ca81706c587a64a73e720b2a66894d52c5957b23000000000000000000000000ca81706c587a64a73e720b2a66894d52c5957b230000000000000000000000000000000000000000000000000e27c49886e6000000000000000000000000000000000000000000000000000000000000000000c00000000000000000000000000000000000000000000000000000000000000000,,,1,true -16522,0x10e6593cdda8c58a1d0f14c5164b376352a55f2f,0x467194771dae2967aef3ecbedd3bf9a310c76c65,0xa9f9e6750000000000000000000000006b175474e89094c44da98b954eedeac495271d0f000000000000000000000000da10009cbd5d07dd0cecc66161fc93d7c9000da1000000000000000000000000a3e1b18bdf4311a23894e9fd3a57c0f1ec4c859f000000000000000000000000a3e1b18bdf4311a23894e9fd3a57c0f1ec4c859f0000000000000000000000000000000000000000000000000e27c49886e6000000000000000000000000000000000000000000000000000000000000000000c00000000000000000000000000000000000000000000000000000000000000000,,,1,true -16523,0x10e6593cdda8c58a1d0f14c5164b376352a55f2f,0x467194771dae2967aef3ecbedd3bf9a310c76c65,0xa9f9e6750000000000000000000000006b175474e89094c44da98b954eedeac495271d0f000000000000000000000000da10009cbd5d07dd0cecc66161fc93d7c9000da10000000000000000000000006c8febfce14a32eda3e3a3f1246521d2ceb1701c0000000000000000000000006c8febfce14a32eda3e3a3f1246521d2ceb1701c0000000000000000000000000000000000000000000000000e4b4b8af6a7000000000000000000000000000000000000000000000000000000000000000000c00000000000000000000000000000000000000000000000000000000000000000,,,1,true -16524,0x10e6593cdda8c58a1d0f14c5164b376352a55f2f,0x467194771dae2967aef3ecbedd3bf9a310c76c65,0xa9f9e6750000000000000000000000006b175474e89094c44da98b954eedeac495271d0f000000000000000000000000da10009cbd5d07dd0cecc66161fc93d7c9000da10000000000000000000000009a1c5911f6bb5481ad63c103569bfd4f186c706b0000000000000000000000009a1c5911f6bb5481ad63c103569bfd4f186c706b0000000000000000000000000000000000000000000000000e27c49886e6000000000000000000000000000000000000000000000000000000000000000000c00000000000000000000000000000000000000000000000000000000000000000,,,1,true -16525,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec34000000000000000000000000ae9b8c92ba9cd153fe5e52cd623caae3f17dedf4000000000000000000000000ae9b8c92ba9cd153fe5e52cd623caae3f17dedf400000000000000000000000000000000000000000000000000a9a5047968430000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -16526,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0xa9f9e675000000000000000000000000dac17f958d2ee523a2206206994597c13d831ec700000000000000000000000094b008aa00579c1307b0ef2c499ad98a8ce58e58000000000000000000000000f240c40f09faf67cb254f7475b01287fd0583514000000000000000000000000f240c40f09faf67cb254f7475b01287fd058351400000000000000000000000000000000000000000000000000000000321d4dcb00000000000000000000000000000000000000000000000000000000000000c00000000000000000000000000000000000000000000000000000000000000000,0x84b05992479bfd8a13191c83f96ff6eebc2b37e5393d34fc80856edfa4cfcadc,2021-11-26 07:27:39.000 UTC,0,true -16527,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0xa9f9e675000000000000000000000000dac17f958d2ee523a2206206994597c13d831ec700000000000000000000000094b008aa00579c1307b0ef2c499ad98a8ce58e5800000000000000000000000020ba98f7f2a97af0b6b42e73d6fe905ea4bb475600000000000000000000000020ba98f7f2a97af0b6b42e73d6fe905ea4bb4756000000000000000000000000000000000000000000000000000000003b15b7b200000000000000000000000000000000000000000000000000000000000000c00000000000000000000000000000000000000000000000000000000000000000,0xba8c1dec7859f5f1cbda37f9c74216f9b0a12ecd074c7b4cb673c70d50c5e2bd,2021-11-26 07:34:33.000 UTC,0,true -16529,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec34000000000000000000000000c76fa990f9fc8e2d51647f48fc5b31af5e892b58000000000000000000000000c76fa990f9fc8e2d51647f48fc5b31af5e892b58000000000000000000000000000000000000000000000000031e381d6514f96400000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -16530,0x10e6593cdda8c58a1d0f14c5164b376352a55f2f,0x467194771dae2967aef3ecbedd3bf9a310c76c65,0xa9f9e6750000000000000000000000006b175474e89094c44da98b954eedeac495271d0f000000000000000000000000da10009cbd5d07dd0cecc66161fc93d7c9000da100000000000000000000000072d799a56ea651470e30b8cfdd6ba1be50db1ed100000000000000000000000072d799a56ea651470e30b8cfdd6ba1be50db1ed10000000000000000000000000000000000000000000000000e4b4b8af6a7000000000000000000000000000000000000000000000000000000000000000000c00000000000000000000000000000000000000000000000000000000000000000,,,1,true -16533,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec34000000000000000000000000390f824ae0d77b4e510e1e49f4ca4be45909386e000000000000000000000000390f824ae0d77b4e510e1e49f4ca4be45909386e000000000000000000000000000000000000000000000000034270e0333fb71100000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -16535,0x10e6593cdda8c58a1d0f14c5164b376352a55f2f,0x467194771dae2967aef3ecbedd3bf9a310c76c65,0xa9f9e6750000000000000000000000006b175474e89094c44da98b954eedeac495271d0f000000000000000000000000da10009cbd5d07dd0cecc66161fc93d7c9000da1000000000000000000000000dbc75c003e387e0503f269d645be9e1469f25ac7000000000000000000000000dbc75c003e387e0503f269d645be9e1469f25ac70000000000000000000000000000000000000000000000000e4b4b8af6a7000000000000000000000000000000000000000000000000000000000000000000c00000000000000000000000000000000000000000000000000000000000000000,,,1,true -16536,0x10e6593cdda8c58a1d0f14c5164b376352a55f2f,0x467194771dae2967aef3ecbedd3bf9a310c76c65,0xa9f9e6750000000000000000000000006b175474e89094c44da98b954eedeac495271d0f000000000000000000000000da10009cbd5d07dd0cecc66161fc93d7c9000da1000000000000000000000000023b76e8cce30575181a1fc3a245422857147279000000000000000000000000023b76e8cce30575181a1fc3a2454228571472790000000000000000000000000000000000000000000000000e27c49886e6000000000000000000000000000000000000000000000000000000000000000000c00000000000000000000000000000000000000000000000000000000000000000,,,1,true -16538,0x10e6593cdda8c58a1d0f14c5164b376352a55f2f,0x467194771dae2967aef3ecbedd3bf9a310c76c65,0xa9f9e6750000000000000000000000006b175474e89094c44da98b954eedeac495271d0f000000000000000000000000da10009cbd5d07dd0cecc66161fc93d7c9000da10000000000000000000000001aa6719c1e9198c9b5499303a3f7dbb81390db960000000000000000000000001aa6719c1e9198c9b5499303a3f7dbb81390db960000000000000000000000000000000000000000000000000e27c49886e6000000000000000000000000000000000000000000000000000000000000000000c00000000000000000000000000000000000000000000000000000000000000000,,,1,true -16539,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec340000000000000000000000000e1a5cd5bf397c10783dc6f92cf94057dcc345e30000000000000000000000000e1a5cd5bf397c10783dc6f92cf94057dcc345e30000000000000000000000000000000000000000000000000026e8e633ab6e8000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,0x860f64bc92f021eabe6f8e6568d5bf0f30412f0c4a5cd998242e3c217bd32fc9,2022-05-29 02:43:14.000 UTC,0,true -16540,0x10e6593cdda8c58a1d0f14c5164b376352a55f2f,0x467194771dae2967aef3ecbedd3bf9a310c76c65,0xa9f9e6750000000000000000000000006b175474e89094c44da98b954eedeac495271d0f000000000000000000000000da10009cbd5d07dd0cecc66161fc93d7c9000da100000000000000000000000093fa220a56f80355a960738dc34101c401d7062800000000000000000000000093fa220a56f80355a960738dc34101c401d706280000000000000000000000000000000000000000000000000e27c49886e6000000000000000000000000000000000000000000000000000000000000000000c00000000000000000000000000000000000000000000000000000000000000000,,,1,true -16541,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec34000000000000000000000000c7790a6880a166f79d44a12a7a91897a895b6420000000000000000000000000c7790a6880a166f79d44a12a7a91897a895b6420000000000000000000000000000000000000000000000000003122fd6e2c40db00000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -16542,0x10e6593cdda8c58a1d0f14c5164b376352a55f2f,0x467194771dae2967aef3ecbedd3bf9a310c76c65,0xa9f9e6750000000000000000000000006b175474e89094c44da98b954eedeac495271d0f000000000000000000000000da10009cbd5d07dd0cecc66161fc93d7c9000da10000000000000000000000009bd5448fe9d544339ef01bde163032ff612c3a570000000000000000000000009bd5448fe9d544339ef01bde163032ff612c3a570000000000000000000000000000000000000000000000000eb5e06245ea000000000000000000000000000000000000000000000000000000000000000000c00000000000000000000000000000000000000000000000000000000000000000,,,1,true -16543,0xcd9d4988c0ae61887b075ba77f08cbfad2b65068,0x3f87ff1de58128ef8fcb4c807efd776e1ac72e51,0xf4f7b41a000000000000000000000000511b820f3c51c529d47e240c36c18ce785b1369700000000000000000000000000000000000000000000000082bbdc0616b49281,,,1,true -16545,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0xa9f9e675000000000000000000000000a0b86991c6218b36c1d19d4a2e9eb0ce3606eb480000000000000000000000007f5c764cbc14f9669b88837ca1490cca17c31607000000000000000000000000a2bc88883ccc7e9cfa4af8ca05983336f2903d35000000000000000000000000a2bc88883ccc7e9cfa4af8ca05983336f2903d350000000000000000000000000000000000000000000000000000000015a31c2d00000000000000000000000000000000000000000000000000000000000000c00000000000000000000000000000000000000000000000000000000000000000,0x40f5e3654544c8d1bed0ea54680a746cfa4300ce1f3c88ad658e1537bc35582e,2022-03-14 01:43:51.000 UTC,0,true -16546,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec34000000000000000000000000a2bc88883ccc7e9cfa4af8ca05983336f2903d35000000000000000000000000a2bc88883ccc7e9cfa4af8ca05983336f2903d3500000000000000000000000000000000000000000000000000ad1fc8445fe90000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,0x1a4cc4c730fb8421ab066d687a081c1faa0ec2831a7f8a1dc3e18a70a165ab1c,2022-03-14 01:40:21.000 UTC,0,true -16547,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec3400000000000000000000000035fecc6d7ca3ce53e4eb3fbefda0681d664dd47a00000000000000000000000035fecc6d7ca3ce53e4eb3fbefda0681d664dd47a00000000000000000000000000000000000000000000000000a9a72343ebf07100000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -16548,0x10e6593cdda8c58a1d0f14c5164b376352a55f2f,0x467194771dae2967aef3ecbedd3bf9a310c76c65,0xa9f9e6750000000000000000000000006b175474e89094c44da98b954eedeac495271d0f000000000000000000000000da10009cbd5d07dd0cecc66161fc93d7c9000da1000000000000000000000000438e269cef2262b56d936617e0798fc242670316000000000000000000000000438e269cef2262b56d936617e0798fc2426703160000000000000000000000000000000000000000000000000e27c49886e6000000000000000000000000000000000000000000000000000000000000000000c00000000000000000000000000000000000000000000000000000000000000000,,,1,true -16549,0x10e6593cdda8c58a1d0f14c5164b376352a55f2f,0x467194771dae2967aef3ecbedd3bf9a310c76c65,0xa9f9e6750000000000000000000000006b175474e89094c44da98b954eedeac495271d0f000000000000000000000000da10009cbd5d07dd0cecc66161fc93d7c9000da10000000000000000000000009364c8d6ac5c00a585a0ecff16d0f73c336501cc0000000000000000000000009364c8d6ac5c00a585a0ecff16d0f73c336501cc0000000000000000000000000000000000000000000000000e4b4b8af6a7000000000000000000000000000000000000000000000000000000000000000000c00000000000000000000000000000000000000000000000000000000000000000,,,1,true -16550,0xcd9d4988c0ae61887b075ba77f08cbfad2b65068,0x3f87ff1de58128ef8fcb4c807efd776e1ac72e51,0xf4f7b41a000000000000000000000000ad453a7eded500955784cc1be9b44ef8fbd7aa160000000000000000000000000000000000000000000000000de0b6b3a7640000,,,1,true -16551,0x10e6593cdda8c58a1d0f14c5164b376352a55f2f,0x467194771dae2967aef3ecbedd3bf9a310c76c65,0xa9f9e6750000000000000000000000006b175474e89094c44da98b954eedeac495271d0f000000000000000000000000da10009cbd5d07dd0cecc66161fc93d7c9000da10000000000000000000000007c19d83f2661a3c5e0d3e175332e51d456a738a40000000000000000000000007c19d83f2661a3c5e0d3e175332e51d456a738a40000000000000000000000000000000000000000000000000e27c49886e6000000000000000000000000000000000000000000000000000000000000000000c00000000000000000000000000000000000000000000000000000000000000000,,,1,true -16554,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec34000000000000000000000000e37b714cffa4e0d7418701fc1ce0f3d11e42dd6a000000000000000000000000e37b714cffa4e0d7418701fc1ce0f3d11e42dd6a000000000000000000000000000000000000000000000000029913d5c397543000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,0x14e32791a64223040581b3bbe35bbd94f49848944fbf2bf364dc5075dcbd6791,2021-11-21 11:50:59.000 UTC,0,true -16555,0x10e6593cdda8c58a1d0f14c5164b376352a55f2f,0x467194771dae2967aef3ecbedd3bf9a310c76c65,0xa9f9e6750000000000000000000000006b175474e89094c44da98b954eedeac495271d0f000000000000000000000000da10009cbd5d07dd0cecc66161fc93d7c9000da1000000000000000000000000d1e3f3f6673159721f064ddc0030fb1d9d3a464b000000000000000000000000d1e3f3f6673159721f064ddc0030fb1d9d3a464b0000000000000000000000000000000000000000000000000e4b4b8af6a7000000000000000000000000000000000000000000000000000000000000000000c00000000000000000000000000000000000000000000000000000000000000000,,,1,true -16557,0x10e6593cdda8c58a1d0f14c5164b376352a55f2f,0x467194771dae2967aef3ecbedd3bf9a310c76c65,0xa9f9e6750000000000000000000000006b175474e89094c44da98b954eedeac495271d0f000000000000000000000000da10009cbd5d07dd0cecc66161fc93d7c9000da10000000000000000000000000d857dcb55d809cc60b28ccebd6e7f1c02e20b0e0000000000000000000000000d857dcb55d809cc60b28ccebd6e7f1c02e20b0e0000000000000000000000000000000000000000000000000e4b4b8af6a7000000000000000000000000000000000000000000000000000000000000000000c00000000000000000000000000000000000000000000000000000000000000000,,,1,true -16558,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec3400000000000000000000000074ffa23f2c4e62ce68c4ed591a454472bfb1486200000000000000000000000074ffa23f2c4e62ce68c4ed591a454472bfb14862000000000000000000000000000000000000000000000000003f2f9dad7571a000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -16559,0x10e6593cdda8c58a1d0f14c5164b376352a55f2f,0x467194771dae2967aef3ecbedd3bf9a310c76c65,0xa9f9e6750000000000000000000000006b175474e89094c44da98b954eedeac495271d0f000000000000000000000000da10009cbd5d07dd0cecc66161fc93d7c9000da1000000000000000000000000288346fa5695bcf9fafbd617b2a4becd94da4a11000000000000000000000000288346fa5695bcf9fafbd617b2a4becd94da4a110000000000000000000000000000000000000000000000000e326d147539800000000000000000000000000000000000000000000000000000000000000000c00000000000000000000000000000000000000000000000000000000000000000,,,1,true -16560,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0xa9f9e675000000000000000000000000dac17f958d2ee523a2206206994597c13d831ec700000000000000000000000094b008aa00579c1307b0ef2c499ad98a8ce58e58000000000000000000000000d5fd028115fbfcff0d4d546a542f6edff47da8cc000000000000000000000000d5fd028115fbfcff0d4d546a542f6edff47da8cc000000000000000000000000000000000000000000000000000000003b15697800000000000000000000000000000000000000000000000000000000000000c00000000000000000000000000000000000000000000000000000000000000000,0x45110db0bbf0f2ddc7d21d3d6650dbab2d86271aff34b3958f700a7357e4b20a,2021-11-26 07:42:07.000 UTC,0,true -16561,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec3400000000000000000000000027273a090d5e0a3ea65755b4073b53e0326bc76c00000000000000000000000027273a090d5e0a3ea65755b4073b53e0326bc76c000000000000000000000000000000000000000000000000027f56a6fb7be24300000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -16562,0x10e6593cdda8c58a1d0f14c5164b376352a55f2f,0x467194771dae2967aef3ecbedd3bf9a310c76c65,0xa9f9e6750000000000000000000000006b175474e89094c44da98b954eedeac495271d0f000000000000000000000000da10009cbd5d07dd0cecc66161fc93d7c9000da1000000000000000000000000f641f29fa14d753a2d1a623fd1b6a108bb099c89000000000000000000000000f641f29fa14d753a2d1a623fd1b6a108bb099c890000000000000000000000000000000000000000000000000eb5e06245ea000000000000000000000000000000000000000000000000000000000000000000c00000000000000000000000000000000000000000000000000000000000000000,,,1,true -16563,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec3400000000000000000000000097503816d20243c45be7575b7e8073d563e7407c00000000000000000000000097503816d20243c45be7575b7e8073d563e7407c000000000000000000000000000000000000000000000000027f71d2f1eadaf600000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -16565,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec340000000000000000000000008fbdc7f65515729a5a5c4f3456811599bf759f260000000000000000000000008fbdc7f65515729a5a5c4f3456811599bf759f2600000000000000000000000000000000000000000000000001a0eb308e6b7f0000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -16566,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec34000000000000000000000000004382672867e32f33e71f75689f4c2b5dcd347e000000000000000000000000004382672867e32f33e71f75689f4c2b5dcd347e00000000000000000000000000000000000000000000000002be41224e6017e900000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -16567,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0xa9f9e675000000000000000000000000dac17f958d2ee523a2206206994597c13d831ec700000000000000000000000094b008aa00579c1307b0ef2c499ad98a8ce58e580000000000000000000000005a34e436a32357eb845f9770002958c4202cd0180000000000000000000000005a34e436a32357eb845f9770002958c4202cd018000000000000000000000000000000000000000000000000000000003ba96e0c00000000000000000000000000000000000000000000000000000000000000c00000000000000000000000000000000000000000000000000000000000000000,0x854488f29855f4aed9679675379ad6f475f2b753bb9f3bd4f710a4ec32a435b9,2021-11-26 07:49:12.000 UTC,0,true -16568,0x10e6593cdda8c58a1d0f14c5164b376352a55f2f,0x467194771dae2967aef3ecbedd3bf9a310c76c65,0xa9f9e6750000000000000000000000006b175474e89094c44da98b954eedeac495271d0f000000000000000000000000da10009cbd5d07dd0cecc66161fc93d7c9000da1000000000000000000000000f0eba858b3ac74f1302695f87968acb3d42b6b02000000000000000000000000f0eba858b3ac74f1302695f87968acb3d42b6b020000000000000000000000000000000000000000000000000e92596fd629000000000000000000000000000000000000000000000000000000000000000000c00000000000000000000000000000000000000000000000000000000000000000,,,1,true -16569,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0xa9f9e675000000000000000000000000dac17f958d2ee523a2206206994597c13d831ec700000000000000000000000094b008aa00579c1307b0ef2c499ad98a8ce58e5800000000000000000000000022e524662e2bf804654517d40fa8124a8291953e00000000000000000000000022e524662e2bf804654517d40fa8124a8291953e000000000000000000000000000000000000000000000000000000003bc1f37100000000000000000000000000000000000000000000000000000000000000c00000000000000000000000000000000000000000000000000000000000000000,0x81e670ba95821d87cb427ecfdc26a0d064f6618725710199d5660172dd845a13,2021-11-26 07:57:24.000 UTC,0,true -16570,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0xa9f9e675000000000000000000000000dac17f958d2ee523a2206206994597c13d831ec700000000000000000000000094b008aa00579c1307b0ef2c499ad98a8ce58e580000000000000000000000003ddf486383cc45c4074ab41b3c116ad1f9241e660000000000000000000000003ddf486383cc45c4074ab41b3c116ad1f9241e66000000000000000000000000000000000000000000000000000000003bc1639400000000000000000000000000000000000000000000000000000000000000c00000000000000000000000000000000000000000000000000000000000000000,0xba16561d6575be0d88f573c9de52b9a6b1bcad7889afa6926cf0dcb08cd75ac9,2021-11-26 08:13:09.000 UTC,0,true -16571,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0xa9f9e675000000000000000000000000dac17f958d2ee523a2206206994597c13d831ec700000000000000000000000094b008aa00579c1307b0ef2c499ad98a8ce58e580000000000000000000000002b7bf82481f32fb20b0b99e751ba757c76f53dad0000000000000000000000002b7bf82481f32fb20b0b99e751ba757c76f53dad000000000000000000000000000000000000000000000000000000003baf69f600000000000000000000000000000000000000000000000000000000000000c00000000000000000000000000000000000000000000000000000000000000000,0x14eb889a0a1f061c7a43ffce423e1c812afcca7992ea97683b2e79acbe28b578,2021-11-26 08:17:40.000 UTC,0,true -16572,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec34000000000000000000000000a4cdcd9bfd5c11d0c9e1db05fe8706b99b822f7e000000000000000000000000a4cdcd9bfd5c11d0c9e1db05fe8706b99b822f7e00000000000000000000000000000000000000000000000000aa410173e4774d00000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -16573,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0xa9f9e675000000000000000000000000dac17f958d2ee523a2206206994597c13d831ec700000000000000000000000094b008aa00579c1307b0ef2c499ad98a8ce58e5800000000000000000000000091b778d58c92cf61325f5dcc4a5e117a6bdc0d8500000000000000000000000091b778d58c92cf61325f5dcc4a5e117a6bdc0d85000000000000000000000000000000000000000000000000000000003bb7c01000000000000000000000000000000000000000000000000000000000000000c00000000000000000000000000000000000000000000000000000000000000000,0x48ed0caa0ba892a7a34b15f754664b6366cd259c874d63411dd35ea2ec556112,2021-11-26 08:30:30.000 UTC,0,true -16574,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0xa9f9e675000000000000000000000000dac17f958d2ee523a2206206994597c13d831ec700000000000000000000000094b008aa00579c1307b0ef2c499ad98a8ce58e580000000000000000000000009867d2c7983aa2a163bb5837c9a9b5eb88d1a37b0000000000000000000000009867d2c7983aa2a163bb5837c9a9b5eb88d1a37b000000000000000000000000000000000000000000000000000000003bb72ba000000000000000000000000000000000000000000000000000000000000000c00000000000000000000000000000000000000000000000000000000000000000,0xd28b67bebb78ff76226993dfb6e646795a1d43a0c8fd2edef2ef9499e9e7eb56,2021-12-06 06:23:24.000 UTC,0,true -16575,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec340000000000000000000000001fe38aba75d5eb1a9b4bef00613ad225d8092d180000000000000000000000001fe38aba75d5eb1a9b4bef00613ad225d8092d18000000000000000000000000000000000000000000000000005d8c53afc1ba3000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -16576,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0xa9f9e675000000000000000000000000dac17f958d2ee523a2206206994597c13d831ec700000000000000000000000094b008aa00579c1307b0ef2c499ad98a8ce58e580000000000000000000000008a547c228fe1001ce8395d9820ac60d5de8c2bf80000000000000000000000008a547c228fe1001ce8395d9820ac60d5de8c2bf8000000000000000000000000000000000000000000000000000000003b9d2a9800000000000000000000000000000000000000000000000000000000000000c00000000000000000000000000000000000000000000000000000000000000000,0x2f1bf26c9c0781c6040a57fd49dbfec1432f08b44f8761b04f22fa59930054d7,2021-12-06 06:26:24.000 UTC,0,true -16577,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec340000000000000000000000007da91d7c55c818d06a7e405fbd719cea0310c43d0000000000000000000000007da91d7c55c818d06a7e405fbd719cea0310c43d000000000000000000000000000000000000000000000000000aa87bee53800000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -16578,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0xa9f9e675000000000000000000000000dac17f958d2ee523a2206206994597c13d831ec700000000000000000000000094b008aa00579c1307b0ef2c499ad98a8ce58e58000000000000000000000000dd801247f030dcc38e839d04fa9dc82b0ac92c51000000000000000000000000dd801247f030dcc38e839d04fa9dc82b0ac92c51000000000000000000000000000000000000000000000000000000003ba1e13c00000000000000000000000000000000000000000000000000000000000000c00000000000000000000000000000000000000000000000000000000000000000,0xa9d809efe4ecd53eb60417ad580b364176d24892013cdb410d59146497d294ba,2021-12-06 06:28:29.000 UTC,0,true -16579,0x10e6593cdda8c58a1d0f14c5164b376352a55f2f,0x467194771dae2967aef3ecbedd3bf9a310c76c65,0xa9f9e6750000000000000000000000006b175474e89094c44da98b954eedeac495271d0f000000000000000000000000da10009cbd5d07dd0cecc66161fc93d7c9000da100000000000000000000000080afc7e083e81ce2aeb0ed17c15c6253a11ae49f00000000000000000000000080afc7e083e81ce2aeb0ed17c15c6253a11ae49f0000000000000000000000000000000000000000000000000efcee47256c000000000000000000000000000000000000000000000000000000000000000000c00000000000000000000000000000000000000000000000000000000000000000,,,1,true -16580,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0xa9f9e675000000000000000000000000dac17f958d2ee523a2206206994597c13d831ec700000000000000000000000094b008aa00579c1307b0ef2c499ad98a8ce58e580000000000000000000000000d3a50bac8dd8b3c1b6d6a92a91c79a685a3800e0000000000000000000000000d3a50bac8dd8b3c1b6d6a92a91c79a685a3800e000000000000000000000000000000000000000000000000000000003bbf845800000000000000000000000000000000000000000000000000000000000000c00000000000000000000000000000000000000000000000000000000000000000,0xa3808fe50fef32f956ee9e2ddb05e09ab8885ceef9307de4b49e26baebc857d2,2021-12-06 06:30:25.000 UTC,0,true -16581,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0xa9f9e675000000000000000000000000dac17f958d2ee523a2206206994597c13d831ec700000000000000000000000094b008aa00579c1307b0ef2c499ad98a8ce58e58000000000000000000000000276eb3c55a80b005432a88de569a8be1bc4b2ad7000000000000000000000000276eb3c55a80b005432a88de569a8be1bc4b2ad7000000000000000000000000000000000000000000000000000000003bb439b800000000000000000000000000000000000000000000000000000000000000c00000000000000000000000000000000000000000000000000000000000000000,0x6628874dacff3f28c3df69cff586bbb02fc7b3f2a1a81c435ae178743b2e6c14,2021-12-06 06:34:14.000 UTC,0,true -16582,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0xa9f9e675000000000000000000000000dac17f958d2ee523a2206206994597c13d831ec700000000000000000000000094b008aa00579c1307b0ef2c499ad98a8ce58e580000000000000000000000004a6aafb11caf7e4c6d591707ffa421b0fbe4f2f20000000000000000000000004a6aafb11caf7e4c6d591707ffa421b0fbe4f2f20000000000000000000000000000000000000000000000000000000035cffbe200000000000000000000000000000000000000000000000000000000000000c00000000000000000000000000000000000000000000000000000000000000000,0x39e1d529c1d1b3eaa7997eb3376a3050ba182c016c0e10cba51bcc0a34039448,2021-12-06 06:37:12.000 UTC,0,true -16583,0x10e6593cdda8c58a1d0f14c5164b376352a55f2f,0x467194771dae2967aef3ecbedd3bf9a310c76c65,0xa9f9e6750000000000000000000000006b175474e89094c44da98b954eedeac495271d0f000000000000000000000000da10009cbd5d07dd0cecc66161fc93d7c9000da1000000000000000000000000825dd5f32adc2df67ae4bf503ff3f348299578c2000000000000000000000000825dd5f32adc2df67ae4bf503ff3f348299578c20000000000000000000000000000000000000000000000000e609c82d34e000000000000000000000000000000000000000000000000000000000000000000c00000000000000000000000000000000000000000000000000000000000000000,,,1,true -16584,0x10e6593cdda8c58a1d0f14c5164b376352a55f2f,0x467194771dae2967aef3ecbedd3bf9a310c76c65,0xa9f9e6750000000000000000000000006b175474e89094c44da98b954eedeac495271d0f000000000000000000000000da10009cbd5d07dd0cecc66161fc93d7c9000da100000000000000000000000035c59a6e195dac739a51a74c52d6ae986eb8d27300000000000000000000000035c59a6e195dac739a51a74c52d6ae986eb8d2730000000000000000000000000000000000000000000000000e55f406e4fa800000000000000000000000000000000000000000000000000000000000000000c00000000000000000000000000000000000000000000000000000000000000000,,,1,true -16585,0x10e6593cdda8c58a1d0f14c5164b376352a55f2f,0x467194771dae2967aef3ecbedd3bf9a310c76c65,0xa9f9e6750000000000000000000000006b175474e89094c44da98b954eedeac495271d0f000000000000000000000000da10009cbd5d07dd0cecc66161fc93d7c9000da1000000000000000000000000eba34ce0cd07f2df484ce6f04c6f89b18a2a4760000000000000000000000000eba34ce0cd07f2df484ce6f04c6f89b18a2a476000000000000000000000000000000000000000000000000006f05b59d3b2000000000000000000000000000000000000000000000000000000000000000000c00000000000000000000000000000000000000000000000000000000000000000,,,1,true -16586,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec34000000000000000000000000787c0764bfbb8bb191cc72425e859d7fed4ba050000000000000000000000000787c0764bfbb8bb191cc72425e859d7fed4ba0500000000000000000000000000000000000000000000000000057ef912bbd906f00000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -16587,0x10e6593cdda8c58a1d0f14c5164b376352a55f2f,0x467194771dae2967aef3ecbedd3bf9a310c76c65,0xa9f9e6750000000000000000000000006b175474e89094c44da98b954eedeac495271d0f000000000000000000000000da10009cbd5d07dd0cecc66161fc93d7c9000da1000000000000000000000000cf5c09df16f1c621f3c90af7d0d7b5d195980c44000000000000000000000000cf5c09df16f1c621f3c90af7d0d7b5d195980c440000000000000000000000000000000000000000000000000e5266884034000000000000000000000000000000000000000000000000000000000000000000c00000000000000000000000000000000000000000000000000000000000000000,,,1,true -16588,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec34000000000000000000000000b448d779599d13d599034ce158d998ecc81ca1ef000000000000000000000000b448d779599d13d599034ce158d998ecc81ca1ef00000000000000000000000000000000000000000000000000aad265f9ebc1a700000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -16589,0x10e6593cdda8c58a1d0f14c5164b376352a55f2f,0x467194771dae2967aef3ecbedd3bf9a310c76c65,0xa9f9e6750000000000000000000000006b175474e89094c44da98b954eedeac495271d0f000000000000000000000000da10009cbd5d07dd0cecc66161fc93d7c9000da1000000000000000000000000fb5a64c43128962277cd202310ab6662b72722b2000000000000000000000000fb5a64c43128962277cd202310ab6662b72722b20000000000000000000000000000000000000000000000000e609c82d34e000000000000000000000000000000000000000000000000000000000000000000c00000000000000000000000000000000000000000000000000000000000000000,,,1,true -16591,0xcd9d4988c0ae61887b075ba77f08cbfad2b65068,0x3f87ff1de58128ef8fcb4c807efd776e1ac72e51,0xf4f7b41a0000000000000000000000004477db1ec914ab90e20d9071cd760a5da47878f90000000000000000000000000000000000000000000000001a5e27eef13e0000,,,1,true -16593,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec3400000000000000000000000094ee763f9930ea718b9c131c58f20f227dc5279500000000000000000000000094ee763f9930ea718b9c131c58f20f227dc527950000000000000000000000000000000000000000000000000060f4dfcdd1285100000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -16594,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0xa9f9e675000000000000000000000000a0b86991c6218b36c1d19d4a2e9eb0ce3606eb480000000000000000000000007f5c764cbc14f9669b88837ca1490cca17c316070000000000000000000000000db7d61baf85ff477d683377ed140aa3af66039c0000000000000000000000000db7d61baf85ff477d683377ed140aa3af66039c000000000000000000000000000000000000000000000000000000001035464200000000000000000000000000000000000000000000000000000000000000c00000000000000000000000000000000000000000000000000000000000000000,,,1,true -16595,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec34000000000000000000000000834bd96881486ae605f3bac3595f7d635c6efd78000000000000000000000000834bd96881486ae605f3bac3595f7d635c6efd7800000000000000000000000000000000000000000000000000aa9fd30073452e00000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,0x2bc76e4b70144c85578fc3e4f3fb6b7c012fc0acbfc607015134cdcec55dacfe,2021-12-20 13:02:43.000 UTC,0,true -16596,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec340000000000000000000000001c1f677a42909cccc0f50b4c85d82977281b0c0c0000000000000000000000001c1f677a42909cccc0f50b4c85d82977281b0c0c00000000000000000000000000000000000000000000000000003f9d3d5e370000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -16597,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0xa9f9e6750000000000000000000000001f9840a85d5af5bf1d1762f925bdaddc4201f9840000000000000000000000006fd9d7ad17242c41f7131d257212c54a0e81669100000000000000000000000041e8e159b4bc5375827c26ca2be353bae277bb0200000000000000000000000041e8e159b4bc5375827c26ca2be353bae277bb0200000000000000000000000000000000000000000000000021062d3080e719c100000000000000000000000000000000000000000000000000000000000000c00000000000000000000000000000000000000000000000000000000000000000,,,1,true -16598,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec3400000000000000000000000041e8e159b4bc5375827c26ca2be353bae277bb0200000000000000000000000041e8e159b4bc5375827c26ca2be353bae277bb02000000000000000000000000000000000000000000000000005347f3036c7fa800000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -16601,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec34000000000000000000000000690dae9338ba55bffbd6e00e77c42d4fd1e04fe9000000000000000000000000690dae9338ba55bffbd6e00e77c42d4fd1e04fe90000000000000000000000000000000000000000000000000036386afea0910000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -16602,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec34000000000000000000000000543b32df9413874e8711fc71a40bd964fb322016000000000000000000000000543b32df9413874e8711fc71a40bd964fb32201600000000000000000000000000000000000000000000000000a90ec8b432590900000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -16609,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0xa9f9e6750000000000000000000000001f9840a85d5af5bf1d1762f925bdaddc4201f9840000000000000000000000006fd9d7ad17242c41f7131d257212c54a0e816691000000000000000000000000d004846f7676672414f50b39bcfd39c283c870cc000000000000000000000000d004846f7676672414f50b39bcfd39c283c870cc00000000000000000000000000000000000000000000000545a4a94bcaffe19f00000000000000000000000000000000000000000000000000000000000000c00000000000000000000000000000000000000000000000000000000000000000,0xda365c3530d52e127077394ee38c752cf4f9ea6298ec075490954cd012bc6195,2021-12-19 09:03:09.000 UTC,0,true -16611,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0xa9f9e675000000000000000000000000a0b86991c6218b36c1d19d4a2e9eb0ce3606eb480000000000000000000000007f5c764cbc14f9669b88837ca1490cca17c31607000000000000000000000000274a18ef14d86d00f4a07e811d1dca3ff8b180a9000000000000000000000000274a18ef14d86d00f4a07e811d1dca3ff8b180a9000000000000000000000000000000000000000000000000000000002217182c00000000000000000000000000000000000000000000000000000000000000c00000000000000000000000000000000000000000000000000000000000000000,0xcd3bc1f7a32a179cc2d70c23fbf7c4904d1e711603d20c7751be4d3ac7efcecc,2021-12-11 13:43:49.000 UTC,0,true -16612,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec3400000000000000000000000090066d6807ff44488331e7fa902fa50064c9785300000000000000000000000090066d6807ff44488331e7fa902fa50064c97853000000000000000000000000000000000000000000000000025ca5e83986ac8700000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -16616,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec34000000000000000000000000fd1fb4cab680c3f30dc2e45b416e0450d0c0e93f000000000000000000000000fd1fb4cab680c3f30dc2e45b416e0450d0c0e93f0000000000000000000000000000000000000000000000000e720e9ec352d79500000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,0x23a84e986640be1a661b81d00a6005c0662aae69363e30526e64c4c87d17f28e,2021-12-09 14:14:54.000 UTC,0,true -16617,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec34000000000000000000000000fa8083a23e16f78a4b64e154ab76aca50e8a8635000000000000000000000000fa8083a23e16f78a4b64e154ab76aca50e8a8635000000000000000000000000000000000000000000000000002014073a68950000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -16618,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec34000000000000000000000000a152b8488c89268d0e6f3b8e2217e2cbea87bb43000000000000000000000000a152b8488c89268d0e6f3b8e2217e2cbea87bb4300000000000000000000000000000000000000000000000001f4e9aae366df7400000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,0xcff929e2fe7aceb974ad77360a1c16aea57ba2fd7ef4cab04d208f9ba2b9463b,2021-12-18 18:11:48.000 UTC,0,true -16621,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec34000000000000000000000000d51e08e9518ef4eadf4df312ddad49e0f0febde0000000000000000000000000d51e08e9518ef4eadf4df312ddad49e0f0febde000000000000000000000000000000000000000000000000001f46daf7ed9f74b00000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,0xfa496664a66da62964ad90f49f76bc02947d6b38db01f777c7c50293498ddf25,2022-04-23 15:16:35.000 UTC,0,true -16622,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec340000000000000000000000001d812b38e4dffb92b21aba2338b529b72af6378e0000000000000000000000001d812b38e4dffb92b21aba2338b529b72af6378e00000000000000000000000000000000000000000000000002821e82d99220d500000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -16623,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec34000000000000000000000000e03a816fd580cbc6956027440d038041918b45b7000000000000000000000000e03a816fd580cbc6956027440d038041918b45b70000000000000000000000000000000000000000000000000005bfa98481f38b00000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -16624,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec34000000000000000000000000cb4620765165432b84130624e52b15dc209476c4000000000000000000000000cb4620765165432b84130624e52b15dc209476c400000000000000000000000000000000000000000000000000d43a002bb3354500000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -16625,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec34000000000000000000000000d8b62078a5b6219532a9a5f68cdb7cffaad07e9f000000000000000000000000d8b62078a5b6219532a9a5f68cdb7cffaad07e9f00000000000000000000000000000000000000000000000000038d7ea4c6800000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -16626,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec34000000000000000000000000ecc3be441d6ac9e977a36079014b4c920eb39585000000000000000000000000ecc3be441d6ac9e977a36079014b4c920eb39585000000000000000000000000000000000000000000000000022ae5ed018153bd00000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,0x88729d324d0bac13c16a0cb816088a67fbdfedd5e86fd2ff6459530b76b9475d,2021-12-18 18:11:48.000 UTC,0,true -16627,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec340000000000000000000000000d42a2fdea3714a15ffdf86ea3873e05d79838500000000000000000000000000d42a2fdea3714a15ffdf86ea3873e05d7983850000000000000000000000000000000000000000000000000024f8b00d610eb0a00000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,0x83bd91bccf410ebf8e6f2a50cea3a8169d331bc37ed5883d2e4bcd15156c7beb,2021-12-18 18:10:02.000 UTC,0,true -16628,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec3400000000000000000000000088977418747bbf018f1e8b38c94b9d4619e509f800000000000000000000000088977418747bbf018f1e8b38c94b9d4619e509f8000000000000000000000000000000000000000000000000027340ce1a4b8d0200000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,0x7bb5d6a7a67d317b070901246920531533376af6121e212a0e7422c59f34792f,2021-12-18 18:07:42.000 UTC,0,true -16629,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec340000000000000000000000008c9a03e2d7d169bf07e29cd2ee0452f1900099bd0000000000000000000000008c9a03e2d7d169bf07e29cd2ee0452f1900099bd00000000000000000000000000000000000000000000000002386f26fc10000000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,0x24a260280e5906e493125926907a89dc5e4ae226915b60879597a1c406ad512b,2021-12-18 18:07:40.000 UTC,0,true -16630,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec340000000000000000000000008c9a03e2d7d169bf07e29cd2ee0452f1900099bd0000000000000000000000008c9a03e2d7d169bf07e29cd2ee0452f1900099bd00000000000000000000000000000000000000000000000000669adac7e9720000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,0xeb85c0720b35459749ef53b6f1f91a74123e848003a6384072531633c2e56a92,2021-12-18 18:05:31.000 UTC,0,true -16631,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec340000000000000000000000009376569d21c11cf0b794a1738276fc6af3b26bba0000000000000000000000009376569d21c11cf0b794a1738276fc6af3b26bba00000000000000000000000000000000000000000000000002b9a4538e9ba12900000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,0xd97025d06fe7db62d33a6a71c57df47c28b2a2766fc3c55d68a2abdecafdc9ac,2021-12-18 18:01:28.000 UTC,0,true -16632,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec3400000000000000000000000087e8e70b6651cba5c7ab8a3cc808086437ccfda300000000000000000000000087e8e70b6651cba5c7ab8a3cc808086437ccfda300000000000000000000000000000000000000000000000002d9bb35da8c290c00000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,0x6c6f9863b25c1d39ad836810bfc0ab17e0535cb05063c4acbd52aed4f17005f9,2021-12-18 18:07:40.000 UTC,0,true -16633,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec340000000000000000000000006ce440d67394a858a69d8aa720c65d2bb769d5fe0000000000000000000000006ce440d67394a858a69d8aa720c65d2bb769d5fe0000000000000000000000000000000000000000000000000301b1338844df3200000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,0x9eb8640f521252e355cad9e347484832015c31a56604c144074eb81ec9064e6e,2021-12-18 18:00:30.000 UTC,0,true -16634,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec34000000000000000000000000876c06abb421abda10bdcc11c391e3c9ffa910b6000000000000000000000000876c06abb421abda10bdcc11c391e3c9ffa910b6000000000000000000000000000000000000000000000000032678de5cd749fe00000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,0x2cc28b524f87886666ffacc61f832bf1ec1bcfdd7165094e954b726bbf4b2a1a,2021-12-18 17:59:41.000 UTC,0,true -16635,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec34000000000000000000000000b82eb6c935525b961c31cd7ae3974c27b95b6f7f000000000000000000000000b82eb6c935525b961c31cd7ae3974c27b95b6f7f00000000000000000000000000000000000000000000000003016562ba5e289e00000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,0x8a66141421c78484b401585e18ecd0c5a20a754742b0b14f910ce393cfefa20b,2021-12-18 17:59:06.000 UTC,0,true -16636,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec34000000000000000000000000c29f4f7427313ec1faa6a82c972aa93a4e5e719c000000000000000000000000c29f4f7427313ec1faa6a82c972aa93a4e5e719c000000000000000000000000000000000000000000000000036c9e868696ea0d00000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,0x7e9b3b6d378bc96fc0820330059b6a169dc32878830ec03afce4ecc5ee200473,2021-12-18 17:56:57.000 UTC,0,true -16637,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec34000000000000000000000000832c238cee46cd0e763b48c234f06bfba551335c000000000000000000000000832c238cee46cd0e763b48c234f06bfba551335c0000000000000000000000000000000000000000000000000207444a9afa1a9300000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,0xfb35b38e690f5eec941d1ab6c938829e3be9c7b0803cbc4a40cbb1f5aa19fcee,2021-12-18 17:56:43.000 UTC,0,true -16638,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec34000000000000000000000000aba877ffb70502dbe16b2241dccb4428b192d1dc000000000000000000000000aba877ffb70502dbe16b2241dccb4428b192d1dc0000000000000000000000000000000000000000000000000048988ef1bd32ba00000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,0x3f120134b6e3606d5e414d7b786ac95f61fb50c1e73719010a6a6bade1f099b0,2022-05-18 07:30:56.000 UTC,0,true -16640,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec34000000000000000000000000264ba3fa47bd6c10536b8ef801109a84ab70b6fc000000000000000000000000264ba3fa47bd6c10536b8ef801109a84ab70b6fc000000000000000000000000000000000000000000000000022b54905e57736e00000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,0x02de9d87f164c5e2328354a7510abdf09866764de44d48184966917ae3f2143b,2021-12-18 18:04:08.000 UTC,0,true -16641,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec34000000000000000000000000567b1c49e7ab1435ccecd62459d8d1c5fa4356c3000000000000000000000000567b1c49e7ab1435ccecd62459d8d1c5fa4356c3000000000000000000000000000000000000000000000000022caf3a77a01da800000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,0x0145affcdcac6aeb446a62a23cf60a82b3672646d31a663a5195f19a2caa07b8,2021-12-18 17:57:50.000 UTC,0,true -16642,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec340000000000000000000000003aa68ac4765f1112611b598e59b2f3da624fbe600000000000000000000000003aa68ac4765f1112611b598e59b2f3da624fbe6000000000000000000000000000000000000000000000000002526a89d2fb598900000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,0x69e8bb94786c7cae651c52874d57c302f222c2827836752d10b6f89154482c6d,2021-12-18 17:47:55.000 UTC,0,true -16643,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec340000000000000000000000002ab77f357dcb26fb296bd4f8a757d3ec3f015a410000000000000000000000002ab77f357dcb26fb296bd4f8a757d3ec3f015a410000000000000000000000000000000000000000000000000250c56498eac5f800000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,0x6c172c02b0baa2e6cf0e22558fbff6f07e211b48c2c93167e8a1b70688fd72c9,2021-12-18 17:46:36.000 UTC,0,true -16644,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec340000000000000000000000001606cd117e229d2a6c97c0b33382c5a75932b9e30000000000000000000000001606cd117e229d2a6c97c0b33382c5a75932b9e3000000000000000000000000000000000000000000000000022d77876d8909a600000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,0x3107c8ebcecb27ea7c3c615ef3b20104eb99f17e6592de7721b8373f5a2a91e7,2021-12-18 17:46:26.000 UTC,0,true -16645,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec34000000000000000000000000465dca9995d6c2a81a9be80fbced5a770dee3dae000000000000000000000000465dca9995d6c2a81a9be80fbced5a770dee3dae000000000000000000000000000000000000000000000000035d8b7c89e60d2000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -16647,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec34000000000000000000000000bd244e565d07f2247ec8e2ff8bea7d7f5182566a000000000000000000000000bd244e565d07f2247ec8e2ff8bea7d7f5182566a0000000000000000000000000000000000000000000000000273c7a4c0ad1df400000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,0x4b5da98a1176d85257d650f0e4878c8530f065d39bc8cdfd6de466009504daf3,2021-12-18 17:46:26.000 UTC,0,true -16648,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec34000000000000000000000000375c42839d55b5c2fb51688e737d7645468c9b95000000000000000000000000375c42839d55b5c2fb51688e737d7645468c9b9500000000000000000000000000000000000000000000000002b8e81fc4627f3b00000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,0xf448395b5a95893ccd9b6fb97e990cab4136310933903f86a6d50666fe68e558,2021-12-18 17:44:29.000 UTC,0,true -16649,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec340000000000000000000000001b167f0c11d6813240099c9fbe32983d9a01078e0000000000000000000000001b167f0c11d6813240099c9fbe32983d9a01078e0000000000000000000000000000000000000000000000000300bc138126f0fc00000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,0x27e6088ba4f60ffe4cb5d43143f39fecb14bb70c1589513b5fba5fb0769763a2,2021-12-18 17:39:56.000 UTC,0,true -16650,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec340000000000000000000000008deeaa63b610bd4cf0bb54e11d5b8258d25267660000000000000000000000008deeaa63b610bd4cf0bb54e11d5b8258d252676600000000000000000000000000000000000000000000000001635e52cf283e6700000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -16651,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec3400000000000000000000000003e65612bb2ba3d98e3a4728e22fe4740237da3400000000000000000000000003e65612bb2ba3d98e3a4728e22fe4740237da3400000000000000000000000000000000000000000000000003273d20490ebcd000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,0x191956bc5cf0f7261f0ccce841d935626d70e50aef3e3b66195fd69de95bb827,2021-12-18 17:38:33.000 UTC,0,true -16652,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec34000000000000000000000000514040cf6b5c0fb7a5e245a0e628867ae675ae25000000000000000000000000514040cf6b5c0fb7a5e245a0e628867ae675ae250000000000000000000000000000000000000000000000000349cda3dabcece700000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,0x3bb5ce5ecc4bb2f56c71615682e75bf7cd0b6d163b028e41eb6166ba69e23bcc,2021-12-18 17:37:53.000 UTC,0,true -16653,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec34000000000000000000000000584b1c4db87c222bd7ff3b8fdeef337b1e8cf416000000000000000000000000584b1c4db87c222bd7ff3b8fdeef337b1e8cf41600000000000000000000000000000000000000000000000003253e3dbab0721e00000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,0x79e32123604dca1506b8a31a77bed15c5d54a18b159ebbd6f1c138654348a7fa,2021-12-18 17:35:00.000 UTC,0,true -16654,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec340000000000000000000000005638fe6b8fb55b2fc9a2ccc25a95404bd6b397350000000000000000000000005638fe6b8fb55b2fc9a2ccc25a95404bd6b3973500000000000000000000000000000000000000000000000003253e3dbab0721e00000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,0x4b4eba740f3a560c256d63db7f8b55646c68b0581536b13f68ed17addfbcfafe,2021-12-18 17:27:28.000 UTC,0,true -16655,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec340000000000000000000000007f08a9f930dcf9606facdaf6be404b0f3b11ca520000000000000000000000007f08a9f930dcf9606facdaf6be404b0f3b11ca5200000000000000000000000000000000000000000000000002505abd83c4d5df00000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,0x4cb1fa15370bb80179e9ca9412e47efadd49aabbe817f66be6f5381d745b4156,2021-12-18 17:19:20.000 UTC,0,true -16656,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec34000000000000000000000000594cb92be8f6153cf00f6500d6655397d1eefd39000000000000000000000000594cb92be8f6153cf00f6500d6655397d1eefd390000000000000000000000000000000000000000000000000207b2b618424e8300000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,0x12bc6113da5ee90bcca55f4dc6ba76fc93bf41c40f4ef00766145f23e17ba1af,2021-12-18 00:35:49.000 UTC,0,true -16657,0x10e6593cdda8c58a1d0f14c5164b376352a55f2f,0x467194771dae2967aef3ecbedd3bf9a310c76c65,0xa9f9e6750000000000000000000000006b175474e89094c44da98b954eedeac495271d0f000000000000000000000000da10009cbd5d07dd0cecc66161fc93d7c9000da1000000000000000000000000e1061be8f7590a2601ff3db6a16c4e7d41a9bd5c000000000000000000000000e1061be8f7590a2601ff3db6a16c4e7d41a9bd5c000000000000000000000000000000000000000000000303a13bd93eb18ace9a00000000000000000000000000000000000000000000000000000000000000c00000000000000000000000000000000000000000000000000000000000000000,0x3c3be6a741e45538809733683e255200d6c72f4bcff939f11cd70de0f2168ae0,2021-12-17 00:22:04.000 UTC,0,true -16658,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec34000000000000000000000000fbd140bf147bd4a38f6fa1f7bdfc6e35b7df9837000000000000000000000000fbd140bf147bd4a38f6fa1f7bdfc6e35b7df9837000000000000000000000000000000000000000000000000017c17d5472564ea00000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,0x8645611523e6b4dfd4218b9172bdd2fe4eb12f5e715493f136a14a00c0195000,2021-12-10 07:45:19.000 UTC,0,true -16659,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec340000000000000000000000007cc927f4a57dbd8cc29f2cb72c962ef5c5b0f6c20000000000000000000000007cc927f4a57dbd8cc29f2cb72c962ef5c5b0f6c200000000000000000000000000000000000000000000000000a4465becb9f2aa00000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -16661,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec3400000000000000000000000063e3213987ebce0517b6c6577534dcfa2e08c76c00000000000000000000000063e3213987ebce0517b6c6577534dcfa2e08c76c0000000000000000000000000000000000000000000000000128f55f405540a800000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,0xde2fef190b6b506fc802f3dc007189691272f954eedbf9810abafefb31978ccd,2021-12-10 14:00:49.000 UTC,0,true -16664,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec3400000000000000000000000069b49d9e84fa10548e432b7bb055e70324502f9a00000000000000000000000069b49d9e84fa10548e432b7bb055e70324502f9a00000000000000000000000000000000000000000000000000e90b3ea9fa84b700000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -16665,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec34000000000000000000000000358c84faa7f860ab41b93edccb7e64f7eb330bb1000000000000000000000000358c84faa7f860ab41b93edccb7e64f7eb330bb100000000000000000000000000000000000000000000000006e5193f899d6d7d00000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -16666,0xcd9d4988c0ae61887b075ba77f08cbfad2b65068,0x3f87ff1de58128ef8fcb4c807efd776e1ac72e51,0xf4f7b41a000000000000000000000000b4b04564f56f4795ea4e14d566af78da54a9998000000000000000000000000000000000000000000000001b0e86716a08449cff,,,1,true -16667,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec34000000000000000000000000b8f09b8d61dfa68389990b247c49101c9514d6d6000000000000000000000000b8f09b8d61dfa68389990b247c49101c9514d6d60000000000000000000000000000000000000000000000000049deca74ae260200000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -16668,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec34000000000000000000000000669a5e73ab710b7a2e5e060a3726f046f4e7b491000000000000000000000000669a5e73ab710b7a2e5e060a3726f046f4e7b491000000000000000000000000000000000000000000000000004d1869dbeb8ac000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -16670,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec3400000000000000000000000016957feb799ee6c8c4c97d37da5be553ec0039b600000000000000000000000016957feb799ee6c8c4c97d37da5be553ec0039b60000000000000000000000000000000000000000000000000e682ef66420e24d00000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,0x3a4f30764421d14d5a18e140588ce6b29be216b6d2e1afe0fa0f823fbb9ab0eb,2022-08-17 10:34:02.000 UTC,0,true -16674,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec34000000000000000000000000e2e8fee9ac2af4352a0e424650b77da25c36bf80000000000000000000000000e2e8fee9ac2af4352a0e424650b77da25c36bf80000000000000000000000000000000000000000000000000026df4ea282c3c1d00000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,0x8a95dca20df3911ef75736f1a0ddf539afedd19de01516b3666bd09a192dc60d,2021-12-27 02:07:20.000 UTC,0,true -16675,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec3400000000000000000000000021a8529a0180fb36037599c375bb37ac765359bd00000000000000000000000021a8529a0180fb36037599c375bb37ac765359bd0000000000000000000000000000000000000000000000000c0e7d8e6b7007a500000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -16677,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec34000000000000000000000000cbad01980e700fbf6bea01b3c25adcd25c22e4b2000000000000000000000000cbad01980e700fbf6bea01b3c25adcd25c22e4b2000000000000000000000000000000000000000000000000002d87d711a62c0f00000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -16681,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec34000000000000000000000000fdf05e7f3e9cd329fc58a08ed88e641d083d4a9f000000000000000000000000fdf05e7f3e9cd329fc58a08ed88e641d083d4a9f0000000000000000000000000000000000000000000000000ab8ba1861f2d8c000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -16682,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec34000000000000000000000000fd5250977d6d6b48789aea0cff78580796336bf2000000000000000000000000fd5250977d6d6b48789aea0cff78580796336bf2000000000000000000000000000000000000000000000000013fbe85edc9000000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,0x8d774f2fa010aaa5d0ce94bff1e6b70c6a482f91687eed85b257049fb81e5b19,2022-05-30 01:09:16.000 UTC,0,true -16683,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec34000000000000000000000000e5cb6552fd6561e3e4197020a4c941ebdd6876f6000000000000000000000000e5cb6552fd6561e3e4197020a4c941ebdd6876f600000000000000000000000000000000000000000000000001ff4dbbffde6b6000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -16684,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec34000000000000000000000000baa738690c4e617f64c00fcbdb2ee69281d5da80000000000000000000000000baa738690c4e617f64c00fcbdb2ee69281d5da80000000000000000000000000000000000000000000000000032ea341ea4a6f0300000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -16685,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec34000000000000000000000000a9ce001353e021767264f5ab6102e65bc9cd2023000000000000000000000000a9ce001353e021767264f5ab6102e65bc9cd20230000000000000000000000000000000000000000000000000013d5d5cc2d801200000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -16688,0x10e6593cdda8c58a1d0f14c5164b376352a55f2f,0x467194771dae2967aef3ecbedd3bf9a310c76c65,0xa9f9e6750000000000000000000000006b175474e89094c44da98b954eedeac495271d0f000000000000000000000000da10009cbd5d07dd0cecc66161fc93d7c9000da1000000000000000000000000469a04b76f03bbafc5ffc31c9e5a53ebab745fde000000000000000000000000469a04b76f03bbafc5ffc31c9e5a53ebab745fde0000000000000000000000000000000000000000000000000e27c49886e6000000000000000000000000000000000000000000000000000000000000000000c00000000000000000000000000000000000000000000000000000000000000000,,,1,true -16689,0x10e6593cdda8c58a1d0f14c5164b376352a55f2f,0x467194771dae2967aef3ecbedd3bf9a310c76c65,0xa9f9e6750000000000000000000000006b175474e89094c44da98b954eedeac495271d0f000000000000000000000000da10009cbd5d07dd0cecc66161fc93d7c9000da100000000000000000000000071c3c6df5f834a55e6edd4b5aa768990d2c5034d00000000000000000000000071c3c6df5f834a55e6edd4b5aa768990d2c5034d0000000000000000000000000000000000000000000000000e4b4b8af6a7000000000000000000000000000000000000000000000000000000000000000000c00000000000000000000000000000000000000000000000000000000000000000,,,1,true -16690,0x10e6593cdda8c58a1d0f14c5164b376352a55f2f,0x467194771dae2967aef3ecbedd3bf9a310c76c65,0xa9f9e6750000000000000000000000006b175474e89094c44da98b954eedeac495271d0f000000000000000000000000da10009cbd5d07dd0cecc66161fc93d7c9000da10000000000000000000000007ff9fa40aaadcc91374e69d4222fef34e7d644710000000000000000000000007ff9fa40aaadcc91374e69d4222fef34e7d644710000000000000000000000000000000000000000000000000e27c49886e6000000000000000000000000000000000000000000000000000000000000000000c00000000000000000000000000000000000000000000000000000000000000000,,,1,true -16691,0x10e6593cdda8c58a1d0f14c5164b376352a55f2f,0x467194771dae2967aef3ecbedd3bf9a310c76c65,0xa9f9e6750000000000000000000000006b175474e89094c44da98b954eedeac495271d0f000000000000000000000000da10009cbd5d07dd0cecc66161fc93d7c9000da10000000000000000000000005ac2371763dfc1b67b009b58e93f4a55779e50dd0000000000000000000000005ac2371763dfc1b67b009b58e93f4a55779e50dd0000000000000000000000000000000000000000000000000e47be0c51e0800000000000000000000000000000000000000000000000000000000000000000c00000000000000000000000000000000000000000000000000000000000000000,,,1,true -16692,0x10e6593cdda8c58a1d0f14c5164b376352a55f2f,0x467194771dae2967aef3ecbedd3bf9a310c76c65,0xa9f9e6750000000000000000000000006b175474e89094c44da98b954eedeac495271d0f000000000000000000000000da10009cbd5d07dd0cecc66161fc93d7c9000da10000000000000000000000000f298f2c578d25f9f59b03c6d0cb3725b42da7070000000000000000000000000f298f2c578d25f9f59b03c6d0cb3725b42da7070000000000000000000000000000000000000000000000000e92596fd629000000000000000000000000000000000000000000000000000000000000000000c00000000000000000000000000000000000000000000000000000000000000000,,,1,true -16693,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec340000000000000000000000005811bedd2cbde3f040cbf875fd3cd7ef2bc7878f0000000000000000000000005811bedd2cbde3f040cbf875fd3cd7ef2bc7878f00000000000000000000000000000000000000000000000000b3329905396a2200000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -16694,0x10e6593cdda8c58a1d0f14c5164b376352a55f2f,0x467194771dae2967aef3ecbedd3bf9a310c76c65,0xa9f9e6750000000000000000000000006b175474e89094c44da98b954eedeac495271d0f000000000000000000000000da10009cbd5d07dd0cecc66161fc93d7c9000da1000000000000000000000000e2f37ceaeff9549597fcbdadaf3e3545d1b0e0eb000000000000000000000000e2f37ceaeff9549597fcbdadaf3e3545d1b0e0eb0000000000000000000000000000000000000000000000000e6ed27d6668000000000000000000000000000000000000000000000000000000000000000000c00000000000000000000000000000000000000000000000000000000000000000,,,1,true -16695,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec340000000000000000000000004770cbf93bb7e113abdfdcf8ab71134f018b5d750000000000000000000000004770cbf93bb7e113abdfdcf8ab71134f018b5d7500000000000000000000000000000000000000000000000001143514dbdef79300000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,0x47e866afa67f7b20b7958a6c82728270c78ed9178f51eec79d2abd8b1449fcbc,2021-11-28 10:08:58.000 UTC,0,true -16696,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0xa9f9e675000000000000000000000000a0b86991c6218b36c1d19d4a2e9eb0ce3606eb480000000000000000000000007f5c764cbc14f9669b88837ca1490cca17c316070000000000000000000000005811bedd2cbde3f040cbf875fd3cd7ef2bc7878f0000000000000000000000005811bedd2cbde3f040cbf875fd3cd7ef2bc7878f000000000000000000000000000000000000000000000000000000000e483be700000000000000000000000000000000000000000000000000000000000000c00000000000000000000000000000000000000000000000000000000000000000,,,1,true -16697,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec34000000000000000000000000fa2ae7a2b9afea302839429a4307effe00f72d55000000000000000000000000fa2ae7a2b9afea302839429a4307effe00f72d550000000000000000000000000000000000000000000000000f0607ad232f864a00000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -16698,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0xa9f9e675000000000000000000000000dac17f958d2ee523a2206206994597c13d831ec700000000000000000000000094b008aa00579c1307b0ef2c499ad98a8ce58e580000000000000000000000005fb2a7793a08de719b0b750fb2961f1281d893a50000000000000000000000005fb2a7793a08de719b0b750fb2961f1281d893a5000000000000000000000000000000000000000000000000000000002fd6f7fe00000000000000000000000000000000000000000000000000000000000000c00000000000000000000000000000000000000000000000000000000000000000,,,1,true -16699,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec340000000000000000000000001e0012884cc3b4d6fe361dced4b748f53dc5c6fe0000000000000000000000001e0012884cc3b4d6fe361dced4b748f53dc5c6fe000000000000000000000000000000000000000000000000023fcb98613088fb00000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,0xb3f055c45ee86955b2b659587223f5124dabb1483115ef2bb0293645c40f21f9,2021-12-12 10:07:29.000 UTC,0,true -16700,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec34000000000000000000000000c9e52a623a6a19f16bde2cd0aa16df7bc2acc1ee000000000000000000000000c9e52a623a6a19f16bde2cd0aa16df7bc2acc1ee00000000000000000000000000000000000000000000000000005af3107a400000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -16701,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec34000000000000000000000000c9e52a623a6a19f16bde2cd0aa16df7bc2acc1ee000000000000000000000000c9e52a623a6a19f16bde2cd0aa16df7bc2acc1ee00000000000000000000000000000000000000000000000000005af3107a400000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -16702,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec34000000000000000000000000c9e52a623a6a19f16bde2cd0aa16df7bc2acc1ee000000000000000000000000c9e52a623a6a19f16bde2cd0aa16df7bc2acc1ee00000000000000000000000000000000000000000000000000005af3107a400000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -16703,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec340000000000000000000000009a13436984309295e093ccda722680befdc2a3de0000000000000000000000009a13436984309295e093ccda722680befdc2a3de00000000000000000000000000000000000000000000000000aa0294bdf7c1f500000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -16704,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec34000000000000000000000000c9e52a623a6a19f16bde2cd0aa16df7bc2acc1ee000000000000000000000000c9e52a623a6a19f16bde2cd0aa16df7bc2acc1ee00000000000000000000000000000000000000000000000000005af3107a400000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -16705,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec34000000000000000000000000abf48bbcb7816c4a89362537ae6719b62f8885e4000000000000000000000000abf48bbcb7816c4a89362537ae6719b62f8885e400000000000000000000000000000000000000000000000002fc35846d77e2b100000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,0x51f39d0df7a0d5b43e2befb3862d3fa724a1c0e210de44defb6678c1c4b3894c,2022-01-24 19:51:49.000 UTC,0,true -16709,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec34000000000000000000000000261f1a7031f27e55b8a89bfca26a625eb4036694000000000000000000000000261f1a7031f27e55b8a89bfca26a625eb4036694000000000000000000000000000000000000000000000000013875b27dd1001e00000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -16710,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec340000000000000000000000007ddbcb5be8b445a60c15380137e6f7d6ef4689190000000000000000000000007ddbcb5be8b445a60c15380137e6f7d6ef46891900000000000000000000000000000000000000000000000000cc90b4762ac00000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -16712,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec340000000000000000000000001f4c2e01760fc3dca50aba4b1bdca066592c57af0000000000000000000000001f4c2e01760fc3dca50aba4b1bdca066592c57af0000000000000000000000000000000000000000000000000257af48694d667f00000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,0x3b5380d46c626a38900680296ed9401e9ba2eb425955f084ceea18f930d3ac51,2021-11-21 07:11:26.000 UTC,0,true -16714,0x10e6593cdda8c58a1d0f14c5164b376352a55f2f,0x467194771dae2967aef3ecbedd3bf9a310c76c65,0xa9f9e6750000000000000000000000006b175474e89094c44da98b954eedeac495271d0f000000000000000000000000da10009cbd5d07dd0cecc66161fc93d7c9000da10000000000000000000000001f4c2e01760fc3dca50aba4b1bdca066592c57af0000000000000000000000001f4c2e01760fc3dca50aba4b1bdca066592c57af000000000000000000000000000000000000000000000014574994cdeafbf67000000000000000000000000000000000000000000000000000000000000000c00000000000000000000000000000000000000000000000000000000000000000,0x171833b83beb73806731096ab04b1af6fe8702254447a816cf4561836bfcedf6,2021-11-21 07:14:35.000 UTC,0,true -16715,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec340000000000000000000000007cea25d6a18abf648ef0bc70ad70c962b87564c40000000000000000000000007cea25d6a18abf648ef0bc70ad70c962b87564c400000000000000000000000000000000000000000000000003d890fa19610fb600000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,0x7bcbb0c1e1aeffb9b46c9a244f26f2fd6e1b4ae68c63aae40b7817d07f5783be,2021-11-24 11:52:33.000 UTC,0,true -16717,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec34000000000000000000000000a2e7d7abb825e77015a639f9d867117bd43a7c00000000000000000000000000a2e7d7abb825e77015a639f9d867117bd43a7c0000000000000000000000000000000000000000000000000000abe684e8226f2800000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -16718,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec340000000000000000000000002c7996f170cdeeae270f13d58e3e0d0ae1b9f3880000000000000000000000002c7996f170cdeeae270f13d58e3e0d0ae1b9f38800000000000000000000000000000000000000000000000001a2caf43939d9ba00000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -16719,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec34000000000000000000000000c0e1a32409cb788797035885d580a9493d346f5d000000000000000000000000c0e1a32409cb788797035885d580a9493d346f5d000000000000000000000000000000000000000000000000007303d28656748b00000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -16720,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec34000000000000000000000000978482015863de289a738cd9fa44ffa9a71156d1000000000000000000000000978482015863de289a738cd9fa44ffa9a71156d100000000000000000000000000000000000000000000000000488dc571d991ad00000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -16723,0x10e6593cdda8c58a1d0f14c5164b376352a55f2f,0x467194771dae2967aef3ecbedd3bf9a310c76c65,0xa9f9e6750000000000000000000000006b175474e89094c44da98b954eedeac495271d0f000000000000000000000000da10009cbd5d07dd0cecc66161fc93d7c9000da1000000000000000000000000311febd2efbe8d2b2646d708dfba70a2e6fae030000000000000000000000000311febd2efbe8d2b2646d708dfba70a2e6fae0300000000000000000000000000000000000000000000000000e27c49886e6000000000000000000000000000000000000000000000000000000000000000000c00000000000000000000000000000000000000000000000000000000000000000,,,1,true -16724,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec34000000000000000000000000abfd99a7da59e8b96f1cefa6e35fd03e6831bc10000000000000000000000000abfd99a7da59e8b96f1cefa6e35fd03e6831bc1000000000000000000000000000000000000000000000000000038d7ea4c6800000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -16725,0x10e6593cdda8c58a1d0f14c5164b376352a55f2f,0x467194771dae2967aef3ecbedd3bf9a310c76c65,0xa9f9e6750000000000000000000000006b175474e89094c44da98b954eedeac495271d0f000000000000000000000000da10009cbd5d07dd0cecc66161fc93d7c9000da10000000000000000000000008508cabb156b0624b3c3be004709c8890080b56b0000000000000000000000008508cabb156b0624b3c3be004709c8890080b56b0000000000000000000000000000000000000000000000000e043da61725000000000000000000000000000000000000000000000000000000000000000000c00000000000000000000000000000000000000000000000000000000000000000,,,1,true -16726,0x10e6593cdda8c58a1d0f14c5164b376352a55f2f,0x467194771dae2967aef3ecbedd3bf9a310c76c65,0xa9f9e6750000000000000000000000006b175474e89094c44da98b954eedeac495271d0f000000000000000000000000da10009cbd5d07dd0cecc66161fc93d7c9000da1000000000000000000000000d2df0d14a20bfa3be92ba9b694de41b0bf3a6287000000000000000000000000d2df0d14a20bfa3be92ba9b694de41b0bf3a62870000000000000000000000000000000000000000000000000e043da61725000000000000000000000000000000000000000000000000000000000000000000c00000000000000000000000000000000000000000000000000000000000000000,,,1,true -16727,0x10e6593cdda8c58a1d0f14c5164b376352a55f2f,0x467194771dae2967aef3ecbedd3bf9a310c76c65,0xa9f9e6750000000000000000000000006b175474e89094c44da98b954eedeac495271d0f000000000000000000000000da10009cbd5d07dd0cecc66161fc93d7c9000da10000000000000000000000002766c7a52e9cdb67372fa8b7139de9da8c63bdd70000000000000000000000002766c7a52e9cdb67372fa8b7139de9da8c63bdd70000000000000000000000000000000000000000000000000e4b4b8af6a7000000000000000000000000000000000000000000000000000000000000000000c00000000000000000000000000000000000000000000000000000000000000000,,,1,true -16729,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec34000000000000000000000000b3e7e79fdd91565fe0f16303377d87ef2b8e811d000000000000000000000000b3e7e79fdd91565fe0f16303377d87ef2b8e811d00000000000000000000000000000000000000000000000000b05a53b960f50000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -16733,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec34000000000000000000000000b00e4bbe8656c98a4d95f18c2f381e86da94243f000000000000000000000000b00e4bbe8656c98a4d95f18c2f381e86da94243f00000000000000000000000000000000000000000000000000a52234d99d98fd00000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,0x00ebb490ccefd3d2077d287c966e643ac919176837b62ce94c2a4bd9653e80ec,2022-08-14 12:46:07.000 UTC,0,true -16734,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec34000000000000000000000000032d2f9e5f38ac0459cb5a3c22374f1d826b1d7f000000000000000000000000032d2f9e5f38ac0459cb5a3c22374f1d826b1d7f000000000000000000000000000000000000000000000000003305efc166e4ee00000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -16735,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec34000000000000000000000000b3f3b7a78410e1d0214e9e704b0fa4d7145ff248000000000000000000000000b3f3b7a78410e1d0214e9e704b0fa4d7145ff24800000000000000000000000000000000000000000000000000ababec6b154e1e00000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -16736,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec34000000000000000000000000bd41805c022e23daa5703159f7439213ff57d243000000000000000000000000bd41805c022e23daa5703159f7439213ff57d24300000000000000000000000000000000000000000000000000038d7ea4c6800000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -16737,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec34000000000000000000000000797d27a0a90bf878350f6cb80c50f09598246ab9000000000000000000000000797d27a0a90bf878350f6cb80c50f09598246ab90000000000000000000000000000000000000000000000000006e62275544f0000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -16739,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec34000000000000000000000000a4f2ade0bc540edee69d3324abfe049655480c91000000000000000000000000a4f2ade0bc540edee69d3324abfe049655480c91000000000000000000000000000000000000000000000000003ccaf32149fcc000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,0xac36c877e38cbb70f346a8984ce6aa2d4ff7d9959d6872efe182753499655ec4,2021-12-11 11:35:47.000 UTC,0,true -16740,0xcd9d4988c0ae61887b075ba77f08cbfad2b65068,0x3f87ff1de58128ef8fcb4c807efd776e1ac72e51,0xf4f7b41a000000000000000000000000e5c37b43eaad5bcc72e0d5c42cb32a5f3edb048b00000000000000000000000000000000000000000000001c7f25062bfb730903,0xdb01c388f0b6ecee37197800056d31ba9fe494deff3745265f5aace678bd1605,2021-11-24 12:35:42.000 UTC,0,true -16744,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec34000000000000000000000000a41ad7e5556125d39fdd17a2846a731ffaa6f5fa000000000000000000000000a41ad7e5556125d39fdd17a2846a731ffaa6f5fa0000000000000000000000000000000000000000000000000024c66e40a11a8800000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -16745,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec340000000000000000000000003ce5261982fab4890176255b867ae9cdab4bab700000000000000000000000003ce5261982fab4890176255b867ae9cdab4bab7000000000000000000000000000000000000000000000000000552dc947854b0000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -16746,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0xa9f9e675000000000000000000000000dac17f958d2ee523a2206206994597c13d831ec700000000000000000000000094b008aa00579c1307b0ef2c499ad98a8ce58e580000000000000000000000005ec259773b76b215ac0fca91723445e002fa8e360000000000000000000000005ec259773b76b215ac0fca91723445e002fa8e3600000000000000000000000000000000000000000000000000000000020c5f1000000000000000000000000000000000000000000000000000000000000000c00000000000000000000000000000000000000000000000000000000000000000,,,1,true -16747,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec34000000000000000000000000618e09582b5f03b1fa2785ddce71b7d96b75017c000000000000000000000000618e09582b5f03b1fa2785ddce71b7d96b75017c00000000000000000000000000000000000000000000000002a303fe4b53000000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -16751,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec3400000000000000000000000021b9d16971a7dee4102689864f8ff9381943458c00000000000000000000000021b9d16971a7dee4102689864f8ff9381943458c000000000000000000000000000000000000000000000000200cec774738658000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,0x989622b4617cdc88a083e5c8445844f8b1789e71b8c8746c943e6bc8b427add1,2021-11-29 21:37:42.000 UTC,0,true -16752,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec340000000000000000000000007bcec44c7486143ee875103de66006047cae8df70000000000000000000000007bcec44c7486143ee875103de66006047cae8df700000000000000000000000000000000000000000000000000a7ef8e0df5851b00000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -16754,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec34000000000000000000000000b0b6b2e2d7d8e687d06ffded2632160377ee1f68000000000000000000000000b0b6b2e2d7d8e687d06ffded2632160377ee1f680000000000000000000000000000000000000000000000000392cba7145d7bfa00000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -16755,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec34000000000000000000000000b47f89c3ffa2adb6d539746589820695046e01b9000000000000000000000000b47f89c3ffa2adb6d539746589820695046e01b9000000000000000000000000000000000000000000000000004e3a828ac8b50000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -16758,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec340000000000000000000000004778b055dfed8f46a2966619f3d8291cf0c706680000000000000000000000004778b055dfed8f46a2966619f3d8291cf0c70668000000000000000000000000000000000000000000000000005281f0c6e777b600000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -16759,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec340000000000000000000000000a90ed84161e6a7c565de94e825e2b2a874e70e50000000000000000000000000a90ed84161e6a7c565de94e825e2b2a874e70e50000000000000000000000000000000000000000000000000ca99104766880cc00000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,0x2698cee79c9b71c8e64b68d54423ccbf39d97383b32bbddde82587c05058b4df,2021-11-27 21:39:51.000 UTC,0,true -16760,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec34000000000000000000000000b3f672982f319f1a141bd9ee91aa186126e43bab000000000000000000000000b3f672982f319f1a141bd9ee91aa186126e43bab0000000000000000000000000000000000000000000000000078292d7ff0f37300000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -16761,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec3400000000000000000000000015f8745b5f315d56403ecba5724cc222b9f271b300000000000000000000000015f8745b5f315d56403ecba5724cc222b9f271b300000000000000000000000000000000000000000000000000010e14d2e3f44000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -16762,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec34000000000000000000000000343a7316f1681cff3171438b8c7aa0e0e828b097000000000000000000000000343a7316f1681cff3171438b8c7aa0e0e828b0970000000000000000000000000000000000000000000000000017d6fa4b8c508000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -16766,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec340000000000000000000000008656eacc5ba829549f005da59d8040f1d73d2df90000000000000000000000008656eacc5ba829549f005da59d8040f1d73d2df9000000000000000000000000000000000000000000000000000aa87bee53800000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -16768,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec34000000000000000000000000ab3fcb1dac9e0eae480c49a832914a230d265a3e000000000000000000000000ab3fcb1dac9e0eae480c49a832914a230d265a3e00000000000000000000000000000000000000000000000000574d68931e147700000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -16771,0x10e6593cdda8c58a1d0f14c5164b376352a55f2f,0x467194771dae2967aef3ecbedd3bf9a310c76c65,0xa9f9e6750000000000000000000000006b175474e89094c44da98b954eedeac495271d0f000000000000000000000000da10009cbd5d07dd0cecc66161fc93d7c9000da100000000000000000000000080db58cc6b8a5818bbba36177010330fbf9af62b00000000000000000000000080db58cc6b8a5818bbba36177010330fbf9af62b00000000000000000000000000000000000000000000004737c65fa2b4e96e9a00000000000000000000000000000000000000000000000000000000000000c00000000000000000000000000000000000000000000000000000000000000000,0x9f7adc981bd7c28669fe4b23caf78c2e35924b8f1268c347816636760bbda89d,2022-05-16 01:38:33.000 UTC,0,true -16772,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec34000000000000000000000000c73da5668d34972fb210d3bb1fe7592e5716959e000000000000000000000000c73da5668d34972fb210d3bb1fe7592e5716959e0000000000000000000000000000000000000000000000000ccd62399ee926f400000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,0x148c1470a9b40199624f9fe5116bd17849bf493f64774ddc5828f02e8f984335,2021-11-23 10:20:34.000 UTC,0,true -16773,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec34000000000000000000000000659ba0b652fb66bb6c1261f5d0aeaeb30fcfec35000000000000000000000000659ba0b652fb66bb6c1261f5d0aeaeb30fcfec350000000000000000000000000000000000000000000000000855a6b44930182500000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -16774,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec34000000000000000000000000a0bd4b75dc06c7f1860d6f123103404d3f1a1c93000000000000000000000000a0bd4b75dc06c7f1860d6f123103404d3f1a1c930000000000000000000000000000000000000000000000000054dad1bb2cf1c000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -16775,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0xa9f9e675000000000000000000000000a0b86991c6218b36c1d19d4a2e9eb0ce3606eb480000000000000000000000007f5c764cbc14f9669b88837ca1490cca17c3160700000000000000000000000077ee282ab43cc815c12a33a18186c4c37e1ef3ea00000000000000000000000077ee282ab43cc815c12a33a18186c4c37e1ef3ea0000000000000000000000000000000000000000000000000000000027ddf1d300000000000000000000000000000000000000000000000000000000000000c00000000000000000000000000000000000000000000000000000000000000000,,,1,true -16777,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec340000000000000000000000000e0508e801cf6fca1c302495f91d47af582b6f090000000000000000000000000e0508e801cf6fca1c302495f91d47af582b6f0900000000000000000000000000000000000000000000000000947e91965ae5f100000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -16779,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec340000000000000000000000008c4b10eb0af780a6fd3f2b7ee2deca81a2e3befe0000000000000000000000008c4b10eb0af780a6fd3f2b7ee2deca81a2e3befe0000000000000000000000000000000000000000000000000000f5904616e00000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -16780,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec34000000000000000000000000ee00c54b0fa1b4eaf41685db0f8dbf95b0d7437d000000000000000000000000ee00c54b0fa1b4eaf41685db0f8dbf95b0d7437d0000000000000000000000000000000000000000000000000000ec77f7a4400000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -16782,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec34000000000000000000000000c36909271002ce677ad2f71a68704aeda2d3b3dd000000000000000000000000c36909271002ce677ad2f71a68704aeda2d3b3dd0000000000000000000000000000000000000000000000000000ec77f7a4400000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -16783,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec34000000000000000000000000537449d7e9011ed8ecfefc611850cdcb5d41a3b6000000000000000000000000537449d7e9011ed8ecfefc611850cdcb5d41a3b600000000000000000000000000000000000000000000000000470de4df82000000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -16784,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec3400000000000000000000000099a409fc717ec84acb7d48bff1fd9981190d46ab00000000000000000000000099a409fc717ec84acb7d48bff1fd9981190d46ab0000000000000000000000000000000000000000000000000011c37937e0800000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -16786,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec340000000000000000000000000b5b89f599b4a8859f4ca3f034e7affda6d08d8b0000000000000000000000000b5b89f599b4a8859f4ca3f034e7affda6d08d8b000000000000000000000000000000000000000000000000008c24a91f423f0000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -16787,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec340000000000000000000000006177c71d568960d87e958c38000350ed3276796b0000000000000000000000006177c71d568960d87e958c38000350ed3276796b000000000000000000000000000000000000000000000000028bc9c6b592c12800000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -16788,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec340000000000000000000000003f763c31379b7a717de8fef568600f84c407c7e00000000000000000000000003f763c31379b7a717de8fef568600f84c407c7e00000000000000000000000000000000000000000000000000000ec77f7a4400000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -16789,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec340000000000000000000000000ff05ce30fe57bff365a03fcc96e401bd42c97900000000000000000000000000ff05ce30fe57bff365a03fcc96e401bd42c97900000000000000000000000000000000000000000000000000000ec77f7a4400000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -16790,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec3400000000000000000000000040e5a0d553140989460511fe948c38689e791ded00000000000000000000000040e5a0d553140989460511fe948c38689e791ded0000000000000000000000000000000000000000000000000000eaa64e5a200000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -16791,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec34000000000000000000000000224de5157760bf46ef3981d8eb1beebea73b2114000000000000000000000000224de5157760bf46ef3981d8eb1beebea73b21140000000000000000000000000000000000000000000000000000ec77f7a4400000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -16792,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0xa9f9e675000000000000000000000000a0b86991c6218b36c1d19d4a2e9eb0ce3606eb480000000000000000000000007f5c764cbc14f9669b88837ca1490cca17c316070000000000000000000000005a513898b701c865091317e855cd8781304b781e0000000000000000000000005a513898b701c865091317e855cd8781304b781e0000000000000000000000000000000000000000000000000000000005f5e10000000000000000000000000000000000000000000000000000000000000000c00000000000000000000000000000000000000000000000000000000000000000,,,1,true -16793,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec340000000000000000000000005a513898b701c865091317e855cd8781304b781e0000000000000000000000005a513898b701c865091317e855cd8781304b781e00000000000000000000000000000000000000000000000000e1b93fb703856100000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -16794,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec340000000000000000000000001bf97cdadbdd6bc93f8bed9dd9f93d5818780bfa0000000000000000000000001bf97cdadbdd6bc93f8bed9dd9f93d5818780bfa0000000000000000000000000000000000000000000000000000e7ebd06af00000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -16795,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec340000000000000000000000006a177b1ec0c5e6324a586c3205b598466be5c2aa0000000000000000000000006a177b1ec0c5e6324a586c3205b598466be5c2aa0000000000000000000000000000000000000000000000000000e7ebd06af00000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -16796,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec340000000000000000000000007f8465260550f027511d8552a0f425ae66d055360000000000000000000000007f8465260550f027511d8552a0f425ae66d0553600000000000000000000000000000000000000000000000000a7d2e38172baa500000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -16797,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec3400000000000000000000000061a1353d6ac8cf95918545a63455557a55e5f82400000000000000000000000061a1353d6ac8cf95918545a63455557a55e5f8240000000000000000000000000000000000000000000000000000e8d4a510000000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -16798,0xcd9d4988c0ae61887b075ba77f08cbfad2b65068,0x3f87ff1de58128ef8fcb4c807efd776e1ac72e51,0xf4f7b41a000000000000000000000000bcd44ca0238940129f6d4e13af10ce1ba8d6c9b8000000000000000000000000000000000000000000000000b36ae3a8acf1a5f7,,,1,true -16799,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec34000000000000000000000000bc8a9cb6bdbad13a07d2fe70f2bda8a66a79811d000000000000000000000000bc8a9cb6bdbad13a07d2fe70f2bda8a66a79811d0000000000000000000000000000000000000000000000000000e8d4a510000000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -16800,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec3400000000000000000000000061be9402542ae211ef6b9476e7238d5f3331589f00000000000000000000000061be9402542ae211ef6b9476e7238d5f3331589f00000000000000000000000000000000000000000000000002a5b9a1fddaaf7d00000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,0xda58c252833426fbdc6a67a4b603f2b132c825faab15c402c762852841338527,2021-12-13 06:09:17.000 UTC,0,true -16801,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec340000000000000000000000009d70e1c5d4e01c6716565088d36a4e70370c25860000000000000000000000009d70e1c5d4e01c6716565088d36a4e70370c2586000000000000000000000000000000000000000000000000017a728abcb29a2700000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -16802,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec34000000000000000000000000c4fb48b7ba32babc400d078c73feda2593434fe3000000000000000000000000c4fb48b7ba32babc400d078c73feda2593434fe300000000000000000000000000000000000000000000000000bd022a386ac7ba00000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,0xe9d7b2ae14536c6469ffa2733c5544c633cfad9f32a9e36255e92adb526e1b96,2021-12-10 12:33:19.000 UTC,0,true -16803,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec340000000000000000000000003e3ed6938be54c51f2eb65aa8d97994fc881a5b00000000000000000000000003e3ed6938be54c51f2eb65aa8d97994fc881a5b000000000000000000000000000000000000000000000000000870d378f59a23300000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,0x115001e6c22fda0d80a0916547c4005f6b959efa08cca27148c58ea16057e2c1,2022-04-17 01:40:45.000 UTC,0,true -16804,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec34000000000000000000000000cab9a59019a7dc9627dfd16f63f20b8adda22b30000000000000000000000000cab9a59019a7dc9627dfd16f63f20b8adda22b30000000000000000000000000000000000000000000000000016865ce43e8972300000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,0x7d07b0b57b98a236affee77c71ee5c966cc4b57461e2f42fc8acf9576ccacdba,2021-12-04 05:07:28.000 UTC,0,true -16806,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec34000000000000000000000000f5f01c28d2b8b128e60528226576858742ddcdd0000000000000000000000000f5f01c28d2b8b128e60528226576858742ddcdd000000000000000000000000000000000000000000000000000aa2f8bd3f5efb700000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -16808,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec340000000000000000000000001458f005d3a56626e394fb17acd64dfae42f581c0000000000000000000000001458f005d3a56626e394fb17acd64dfae42f581c0000000000000000000000000000000000000000000000000000ec77f7a4400000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -16809,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec34000000000000000000000000aca9e6139683c8d131dd63dded180fb13f45eb6e000000000000000000000000aca9e6139683c8d131dd63dded180fb13f45eb6e0000000000000000000000000000000000000000000000000000ec77f7a4400000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -16810,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec340000000000000000000000006aaeb488295a48f51c08edaa11dce101d5339e2a0000000000000000000000006aaeb488295a48f51c08edaa11dce101d5339e2a0000000000000000000000000000000000000000000000000000ec77f7a4400000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -16811,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec340000000000000000000000007b71e07ca52415e7581c20391dd9880accc3abcd0000000000000000000000007b71e07ca52415e7581c20391dd9880accc3abcd0000000000000000000000000000000000000000000000000000ec77f7a4400000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -16812,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec34000000000000000000000000deb7daf37573cca2d722a994ec68048fd185483f000000000000000000000000deb7daf37573cca2d722a994ec68048fd185483f00000000000000000000000000000000000000000000000000a9b86b2fabb00a00000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -16813,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec3400000000000000000000000070675b0fffd9be1739ebfd8d70033a2a0d67727e00000000000000000000000070675b0fffd9be1739ebfd8d70033a2a0d67727e0000000000000000000000000000000000000000000000000001c6bf5263400000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -16814,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec340000000000000000000000001b157e467e9af944ea91e10d1ae5ae74d3be7ada0000000000000000000000001b157e467e9af944ea91e10d1ae5ae74d3be7ada0000000000000000000000000000000000000000000000000000ec77f7a4400000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -16815,0xcd9d4988c0ae61887b075ba77f08cbfad2b65068,0x3f87ff1de58128ef8fcb4c807efd776e1ac72e51,0xf4f7b41a000000000000000000000000065823e171f037b889c4e1029e8aa34d6b13430700000000000000000000000000000000000000000000011f87220d50ebc1d180,,,1,true -16816,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec3400000000000000000000000037d7f6f6845fce57068f6389283e6c9dd9ed710f00000000000000000000000037d7f6f6845fce57068f6389283e6c9dd9ed710f000000000000000000000000000000000000000000000000055778282dac0a0700000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,0x3e087d66c6aa2abc88ce2c92f7ea1c0c37feedc592b48566e7464c08aad267e4,2021-12-08 16:05:46.000 UTC,0,true -16817,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec34000000000000000000000000123dafc6ba0d25aa362f315486cee7bc823f433d000000000000000000000000123dafc6ba0d25aa362f315486cee7bc823f433d0000000000000000000000000000000000000000000000000000ec77f7a4400000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -16818,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec34000000000000000000000000fc1708fe24383cc91c46f9ee360e61335ade5b1a000000000000000000000000fc1708fe24383cc91c46f9ee360e61335ade5b1a0000000000000000000000000000000000000000000000000041b9a6e858400000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -16819,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec34000000000000000000000000a8d3a8717fa5488a817a5bb33822c07cd63a5abe000000000000000000000000a8d3a8717fa5488a817a5bb33822c07cd63a5abe0000000000000000000000000000000000000000000000000000ec77f7a4400000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -16820,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec3400000000000000000000000016c86b5f07080a6fcbde9b1e09926bea162df46b00000000000000000000000016c86b5f07080a6fcbde9b1e09926bea162df46b0000000000000000000000000000000000000000000000000075438a8a52f67500000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -16821,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec34000000000000000000000000b17a5ff2012ac401880c3e2d4a9fbca50d4baa60000000000000000000000000b17a5ff2012ac401880c3e2d4a9fbca50d4baa600000000000000000000000000000000000000000000000000000ec77f7a4400000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -16822,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec3400000000000000000000000071d314c69bc3167e4e7670f27c8f78e2b072aa4500000000000000000000000071d314c69bc3167e4e7670f27c8f78e2b072aa4500000000000000000000000000000000000000000000000000038d7ea4c6800000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -16823,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec34000000000000000000000000d104b361f416236bd4bcabe11e731dde2b4e0743000000000000000000000000d104b361f416236bd4bcabe11e731dde2b4e07430000000000000000000000000000000000000000000000000000ec77f7a4400000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -16824,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec34000000000000000000000000306734230a5b02d274cadff38770832ef8630ceb000000000000000000000000306734230a5b02d274cadff38770832ef8630ceb00000000000000000000000000000000000000000000000000507bb88566fea500000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -16825,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec340000000000000000000000005d52e479ced90fb13969e21695bd1d861eb3573b0000000000000000000000005d52e479ced90fb13969e21695bd1d861eb3573b0000000000000000000000000000000000000000000000000000ec77f7a4400000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -16826,0xcd9d4988c0ae61887b075ba77f08cbfad2b65068,0x3f87ff1de58128ef8fcb4c807efd776e1ac72e51,0xf4f7b41a000000000000000000000000afad93492b75cdfb3e685c09966aa8ee6ad872c400000000000000000000000000000000000000000000000001f7b325868aac02,,,1,true -16827,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec34000000000000000000000000bc41f7fdc1d13ad936d3b3f7032ebdad002f1390000000000000000000000000bc41f7fdc1d13ad936d3b3f7032ebdad002f1390000000000000000000000000000000000000000000000000000c3228b294510400000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -16828,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec340000000000000000000000001d9698671d792c42afded97b4df08f6b9c585a560000000000000000000000001d9698671d792c42afded97b4df08f6b9c585a56000000000000000000000000000000000000000000000000014dece145ec2c0900000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,0xfef8a83ca1e13494d14d4a5f09ff16758a126f0d046bee7d44d10578ea85097a,2021-12-19 07:56:55.000 UTC,0,true -16830,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec34000000000000000000000000cff22f51b57854b8e479d0d2be8c379400e684ad000000000000000000000000cff22f51b57854b8e479d0d2be8c379400e684ad000000000000000000000000000000000000000000000000003d17367d1bd98000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -16831,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec3400000000000000000000000096dfa1224bf898d7865ea8fbe077458bbef060f400000000000000000000000096dfa1224bf898d7865ea8fbe077458bbef060f40000000000000000000000000000000000000000000000000000ec77f7a4400000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -16832,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec34000000000000000000000000e464224ad69be6bd28c5bdb8e54087c35d2b2112000000000000000000000000e464224ad69be6bd28c5bdb8e54087c35d2b211200000000000000000000000000000000000000000000000000ac68158a6eb17b00000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -16833,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec34000000000000000000000000622c7344db7c5b64a31e19773e473caa886b4ab3000000000000000000000000622c7344db7c5b64a31e19773e473caa886b4ab30000000000000000000000000000000000000000000000000000ec77f7a4400000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -16834,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec34000000000000000000000000a69d57d1428b65720f0641ec69ef424873588b9b000000000000000000000000a69d57d1428b65720f0641ec69ef424873588b9b000000000000000000000000000000000000000000000000008933289e5a998800000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,0xba53b64802fb1d065e25dd4c9c25b4259855da8c6eada9a24dd42f9a6ce09088,2022-02-06 12:29:34.000 UTC,0,true -16835,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec34000000000000000000000000f232b391a27dd36b69f20e814c83eaa6c8370630000000000000000000000000f232b391a27dd36b69f20e814c83eaa6c83706300000000000000000000000000000000000000000000000000000ec77f7a4400000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -16836,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec34000000000000000000000000041ebf69c471122fbdaa1d543dbb7f15f5083c8e000000000000000000000000041ebf69c471122fbdaa1d543dbb7f15f5083c8e0000000000000000000000000000000000000000000000000000ec77f7a4400000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -16837,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec340000000000000000000000007599f83c36fa93310a5302c138af0001cf7e47830000000000000000000000007599f83c36fa93310a5302c138af0001cf7e4783000000000000000000000000000000000000000000000000040293cdb57c3d8c00000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,0x3a341ae9f48dc542189a71ab97ae4505e98580ada5b5e172ba03ef027cc6b731,2022-03-12 09:53:46.000 UTC,0,true -16838,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec340000000000000000000000002dfb60fcd21d919b26932d36368a8a7f053aa2ed0000000000000000000000002dfb60fcd21d919b26932d36368a8a7f053aa2ed000000000000000000000000000000000000000000000000000e35fa931a000000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -16839,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec340000000000000000000000001630028e5261856e58157e18a2378c68278dc2770000000000000000000000001630028e5261856e58157e18a2378c68278dc2770000000000000000000000000000000000000000000000000000ec77f7a4400000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -16840,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec340000000000000000000000005450f43f8b1995145f918ee0534452aa691418510000000000000000000000005450f43f8b1995145f918ee0534452aa691418510000000000000000000000000000000000000000000000000152f9d4fdf8291300000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -16841,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec34000000000000000000000000bbdc4b606d1d1d1201f1cf9682143abe7f4a0ece000000000000000000000000bbdc4b606d1d1d1201f1cf9682143abe7f4a0ece0000000000000000000000000000000000000000000000000000ec77f7a4400000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -16846,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec340000000000000000000000007c0ebe534ae135f84a8d0ac08119247923da10a50000000000000000000000007c0ebe534ae135f84a8d0ac08119247923da10a50000000000000000000000000000000000000000000000000007a22f133e7ec000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -16847,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec34000000000000000000000000417176e00b17a5cc618dbcc36b00ea8e0f0c9985000000000000000000000000417176e00b17a5cc618dbcc36b00ea8e0f0c998500000000000000000000000000000000000000000000000003d7ffc0d600866500000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,0xf9cc364326e9e1dac15a83a945c52682c0dbc153ab4c95411545ed8257098927,2022-02-05 18:31:41.000 UTC,0,true -16848,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec340000000000000000000000005c3fcf281d8c867fd867f78496c95addd8ad23910000000000000000000000005c3fcf281d8c867fd867f78496c95addd8ad23910000000000000000000000000000000000000000000000000007a22f133e7ec000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -16849,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec3400000000000000000000000024409f656e3cdb7fd0b24303898ae6ef4610d64c00000000000000000000000024409f656e3cdb7fd0b24303898ae6ef4610d64c0000000000000000000000000000000000000000000000000011ca20d85fc38000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -16850,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec34000000000000000000000000e5e494bdeb6c683e425816b44413fc788566618a000000000000000000000000e5e494bdeb6c683e425816b44413fc788566618a00000000000000000000000000000000000000000000000000b030e7f0b32e5600000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -16851,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec340000000000000000000000004523069170b38d1e3f618b9cf51ce0e05428318e0000000000000000000000004523069170b38d1e3f618b9cf51ce0e05428318e0000000000000000000000000000000000000000000000000034086e9e54af4c00000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -16853,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec34000000000000000000000000f1f2dbb03017fe558ae37b92e38c6d0bd22556c9000000000000000000000000f1f2dbb03017fe558ae37b92e38c6d0bd22556c900000000000000000000000000000000000000000000000000150729a82563c000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -16854,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec34000000000000000000000000f83acd92a8c2fe89199389c41e784b7c84e468bc000000000000000000000000f83acd92a8c2fe89199389c41e784b7c84e468bc00000000000000000000000000000000000000000000000000020572709a6ac000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -16855,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec3400000000000000000000000087b675e9219a3b870df51449268b8c8c2241bf0c00000000000000000000000087b675e9219a3b870df51449268b8c8c2241bf0c000000000000000000000000000000000000000000000000002386f26fc1000000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -16857,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec34000000000000000000000000ec8d98f1b747f00eef3b82f17d3a6fc14ef9fb64000000000000000000000000ec8d98f1b747f00eef3b82f17d3a6fc14ef9fb6400000000000000000000000000000000000000000000000000a372491167e71e00000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,0x32b8ecb990fd640b11aec774db2403d1392fb8da393f3bb8ac4a6b109b848ac3,2022-09-04 11:25:25.000 UTC,0,true -16859,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec34000000000000000000000000ed4292d00c52d1040e0e1f03949be10caa4ba885000000000000000000000000ed4292d00c52d1040e0e1f03949be10caa4ba885000000000000000000000000000000000000000000000000015d6279fd6aad4700000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,0xcf083625196e984745dfefd5ba44367b775505290ff5c86e93cd7e3ac7fa2bd4,2021-12-11 09:25:21.000 UTC,0,true -16860,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0xa9f9e675000000000000000000000000a0b86991c6218b36c1d19d4a2e9eb0ce3606eb480000000000000000000000007f5c764cbc14f9669b88837ca1490cca17c316070000000000000000000000000e331b752bc500d8699a183ad9594b95a5fdf5fe0000000000000000000000000e331b752bc500d8699a183ad9594b95a5fdf5fe000000000000000000000000000000000000000000000000000000000610612a00000000000000000000000000000000000000000000000000000000000000c00000000000000000000000000000000000000000000000000000000000000000,,,1,true -16864,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec340000000000000000000000002ad6be6a50d93a485a82b897991c6cba0879c87b0000000000000000000000002ad6be6a50d93a485a82b897991c6cba0879c87b00000000000000000000000000000000000000000000000000038d7ea4c6800000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -16865,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0xa9f9e675000000000000000000000000514910771af9ca656af840dff83e8264ecf986ca000000000000000000000000350a791bfc2c21f9ed5d10980dad2e2638ffa7f60000000000000000000000005ec259773b76b215ac0fca91723445e002fa8e360000000000000000000000005ec259773b76b215ac0fca91723445e002fa8e360000000000000000000000000000000000000000000000002b7e6808fdb629d700000000000000000000000000000000000000000000000000000000000000c00000000000000000000000000000000000000000000000000000000000000000,,,1,true -16866,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec340000000000000000000000005ec259773b76b215ac0fca91723445e002fa8e360000000000000000000000005ec259773b76b215ac0fca91723445e002fa8e36000000000000000000000000000000000000000000000000004d22ac15e0f74b00000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -16868,0xcd9d4988c0ae61887b075ba77f08cbfad2b65068,0x3f87ff1de58128ef8fcb4c807efd776e1ac72e51,0xf4f7b41a000000000000000000000000c102dd014ba57c1a5a431d996edc87cdf78b897a00000000000000000000000000000000000000000000002ae698982a47e28e30,,,1,true -16869,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec340000000000000000000000007ee41f2aca01759210b36a5361c3ef29e17a2aa40000000000000000000000007ee41f2aca01759210b36a5361c3ef29e17a2aa400000000000000000000000000000000000000000000000000aa2fac3f12909400000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -16870,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec340000000000000000000000002f07e2fc66c75982e7c35149d3d500e37b0e8b0b0000000000000000000000002f07e2fc66c75982e7c35149d3d500e37b0e8b0b0000000000000000000000000000000000000000000000000034c4f04feb6cd200000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -16871,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec34000000000000000000000000055d69ffabcc1137c4d8a7143d5cfcc03e7710c7000000000000000000000000055d69ffabcc1137c4d8a7143d5cfcc03e7710c700000000000000000000000000000000000000000000000000600d6d79d1d57e00000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -16872,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec340000000000000000000000009a5da4e26d99fb53daedae1e947158ecb656c6250000000000000000000000009a5da4e26d99fb53daedae1e947158ecb656c62500000000000000000000000000000000000000000000000000a9d9f7900cc33d00000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -16873,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec340000000000000000000000004bb02c6a86cc516e355bd25ff48ce800355af2b70000000000000000000000004bb02c6a86cc516e355bd25ff48ce800355af2b700000000000000000000000000000000000000000000000000aac186ad1c0e8e00000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -16874,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec34000000000000000000000000d3e425f2d8369287087fd149df99f108cb3f97d0000000000000000000000000d3e425f2d8369287087fd149df99f108cb3f97d000000000000000000000000000000000000000000000000000188fb4755d74c000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -16875,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec340000000000000000000000009408cd0da72bff5f87cddc07bdd2e44fd512b71a0000000000000000000000009408cd0da72bff5f87cddc07bdd2e44fd512b71a00000000000000000000000000000000000000000000000000349d2764a870c000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -16877,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec340000000000000000000000006b601a4bb4e2a09559cfcbbc73d0f3e5cfea262e0000000000000000000000006b601a4bb4e2a09559cfcbbc73d0f3e5cfea262e000000000000000000000000000000000000000000000000009aaeed27425c4d00000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -16878,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec3400000000000000000000000039a6afc920eab4722cf217ba84644ebd6adecf1500000000000000000000000039a6afc920eab4722cf217ba84644ebd6adecf1500000000000000000000000000000000000000000000000006edb40816211d0000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,0x850e46b9905a7097657368439928a878ea319398ee5ac1805cdc9c1ecdb42f17,2022-07-21 22:38:16.000 UTC,0,true -16880,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec34000000000000000000000000ed2d1e71eaebdbc4aec6e04cdc0b07bb0113d889000000000000000000000000ed2d1e71eaebdbc4aec6e04cdc0b07bb0113d8890000000000000000000000000000000000000000000000000028ad1e9502c04000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -16881,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec34000000000000000000000000709fea9fac17d22c704042968823f1742226b2d1000000000000000000000000709fea9fac17d22c704042968823f1742226b2d100000000000000000000000000000000000000000000000000609f9eddf9ae8000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -16884,0xcd9d4988c0ae61887b075ba77f08cbfad2b65068,0x3f87ff1de58128ef8fcb4c807efd776e1ac72e51,0xf4f7b41a000000000000000000000000bbb06f09101965daf51756b0b59620a245140cc2000000000000000000000000000000000000000000000000244bf69364bd6179,,,1,true -16886,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec34000000000000000000000000cf9ed12538fcb472f33e2e8bc2d0a4669ac0913c000000000000000000000000cf9ed12538fcb472f33e2e8bc2d0a4669ac0913c000000000000000000000000000000000000000000000000008700cc7577000000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -16887,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec34000000000000000000000000e25fab412cc70cac0104ca99362d2331a7d69b8e000000000000000000000000e25fab412cc70cac0104ca99362d2331a7d69b8e000000000000000000000000000000000000000000000000027fe6abb9a1ec7f00000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -16888,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec340000000000000000000000002a8c411e0b012dba8ced3ccbbcf0335739ec75b30000000000000000000000002a8c411e0b012dba8ced3ccbbcf0335739ec75b300000000000000000000000000000000000000000000000000491ae2f89695a400000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -16889,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec34000000000000000000000000a57e6e37092062f467fef468e1b714beb2c343f7000000000000000000000000a57e6e37092062f467fef468e1b714beb2c343f7000000000000000000000000000000000000000000000000031d7f9d5caa084c00000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,0x109810ad9f7915c35e46118727dfe21a76f3038ed6570aa19de58f8982a15ef8,2022-02-05 08:44:49.000 UTC,0,true -16891,0xcd9d4988c0ae61887b075ba77f08cbfad2b65068,0x3f87ff1de58128ef8fcb4c807efd776e1ac72e51,0xf4f7b41a00000000000000000000000025a4cb8b9da1d3218165d6f296f42cf8d049afdd00000000000000000000000000000000000000000000000a21c22fc2e8820000,,,1,true -16893,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec3400000000000000000000000069dd97aee3d665e75ba685a6ad13bac889a9837700000000000000000000000069dd97aee3d665e75ba685a6ad13bac889a983770000000000000000000000000000000000000000000000001b9863cfc665948000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -16895,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec34000000000000000000000000365a3ec18ea9e4591dbd2e7687cb14f472f4b559000000000000000000000000365a3ec18ea9e4591dbd2e7687cb14f472f4b55900000000000000000000000000000000000000000000000000013462b8634fb200000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -16896,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec34000000000000000000000000172b6e023c25a1962129177f18d5b5dce441e8e6000000000000000000000000172b6e023c25a1962129177f18d5b5dce441e8e600000000000000000000000000000000000000000000000000125bc30a984fe100000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -16898,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0xa9f9e675000000000000000000000000dac17f958d2ee523a2206206994597c13d831ec700000000000000000000000094b008aa00579c1307b0ef2c499ad98a8ce58e58000000000000000000000000e8ac385ae701d3c431a8f4bef2e1177796110745000000000000000000000000e8ac385ae701d3c431a8f4bef2e11777961107450000000000000000000000000000000000000000000000000000000009e8e18100000000000000000000000000000000000000000000000000000000000000c00000000000000000000000000000000000000000000000000000000000000000,,,1,true -16908,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec3400000000000000000000000036fb3c8d2174285888a97c6f398a8ba91673eee400000000000000000000000036fb3c8d2174285888a97c6f398a8ba91673eee400000000000000000000000000000000000000000000000003e2c284391c000000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,0x642f30f8cf1e35d41d43ae59542aa9add3a2ea0194b3a36a9e53b87874934855,2021-12-11 10:38:15.000 UTC,0,true -16909,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0xa9f9e675000000000000000000000000dac17f958d2ee523a2206206994597c13d831ec700000000000000000000000094b008aa00579c1307b0ef2c499ad98a8ce58e5800000000000000000000000005d5955fc64d46b33b636c3db72b863be184fe9600000000000000000000000005d5955fc64d46b33b636c3db72b863be184fe9600000000000000000000000000000000000000000000000000000000060f3c2200000000000000000000000000000000000000000000000000000000000000c00000000000000000000000000000000000000000000000000000000000000000,0x319231b3b32db4fb647a8073a1206b3cc25fbe8464a6d243559adf4b1bc84cdf,2022-05-09 00:19:55.000 UTC,0,true -16910,0xcd9d4988c0ae61887b075ba77f08cbfad2b65068,0x3f87ff1de58128ef8fcb4c807efd776e1ac72e51,0xf4f7b41a000000000000000000000000de8878aa52d2eea1f8b83edca567afea71f970db00000000000000000000000000000000000000000000000f29a76a9e5dbbbdb6,0x39320fb3657729da59b38f052ca84cf458ee02007353a4e07a4db0d875709599,2021-11-28 01:15:28.000 UTC,0,true -16911,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec3400000000000000000000000047bb57496ae8c10b3b714bc7f064f3ac049b28e000000000000000000000000047bb57496ae8c10b3b714bc7f064f3ac049b28e0000000000000000000000000000000000000000000000000001f52d5ff411f8000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -16913,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec340000000000000000000000009dd0e68ef913df841826450f843233484d418bb30000000000000000000000009dd0e68ef913df841826450f843233484d418bb300000000000000000000000000000000000000000000000000af40c61b6a050000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -16915,0xcd9d4988c0ae61887b075ba77f08cbfad2b65068,0x3f87ff1de58128ef8fcb4c807efd776e1ac72e51,0xf4f7b41a00000000000000000000000008d088c12e979f2bf94045b7ba092377db7727ba0000000000000000000000000000000000000000000000722b3e304b15017c7a,0x4a851087ec8df25827cfd9faa0850d8ca0aec98e59248ef683d3dc10cdf46604,2022-04-10 16:25:18.000 UTC,0,true -16920,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec340000000000000000000000008840a72627f06d1def290e6de5d1c70e0dd9c44a0000000000000000000000008840a72627f06d1def290e6de5d1c70e0dd9c44a00000000000000000000000000000000000000000000000000aa885991c7666b00000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -16924,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec340000000000000000000000006235489a0c0a6eaafade625766f6f28a760830890000000000000000000000006235489a0c0a6eaafade625766f6f28a76083089000000000000000000000000000000000000000000000000029e68fedb0a328000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -16925,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec3400000000000000000000000045b8231073ce8e8c5d88dd451c8a2badbeec05fd00000000000000000000000045b8231073ce8e8c5d88dd451c8a2badbeec05fd00000000000000000000000000000000000000000000000000ab059981404a1600000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -16926,0xcd9d4988c0ae61887b075ba77f08cbfad2b65068,0x3f87ff1de58128ef8fcb4c807efd776e1ac72e51,0xf4f7b41a000000000000000000000000d3fb28778630b99d76e4e4a68be58b50c38792a00000000000000000000000000000000000000000000000000de0b6b3a7640000,0xdaf7a9c06912b32f48c3e44a8eeb17c76b02bdbcbf830840f8e6e751a5aad699,2022-05-08 05:21:38.000 UTC,0,true -16927,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec340000000000000000000000007338f56e2f0de5c7664cbe5bd7de30fb923956570000000000000000000000007338f56e2f0de5c7664cbe5bd7de30fb923956570000000000000000000000000000000000000000000000000208e09d545a594800000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,0x190b960c62b38aa32b64b78a0b207f3c08e85c2faabc16fe42207ed5e771eb89,2021-12-24 12:55:46.000 UTC,0,true -16928,0xcd9d4988c0ae61887b075ba77f08cbfad2b65068,0x3f87ff1de58128ef8fcb4c807efd776e1ac72e51,0xf4f7b41a00000000000000000000000024f8d92794a283b454d1fc32722f51a4f3bc1ae500000000000000000000000000000000000000000000000765384ce234f5f10b,,,1,true -16929,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec34000000000000000000000000c4cb01191ad5bba5a471294bc1977e726c9b8059000000000000000000000000c4cb01191ad5bba5a471294bc1977e726c9b8059000000000000000000000000000000000000000000000000007580fe08bd922900000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -16930,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec340000000000000000000000000a5b711d5db1e50ddae8ce732a1b967a4908ed710000000000000000000000000a5b711d5db1e50ddae8ce732a1b967a4908ed710000000000000000000000000000000000000000000000000dd85bb46e19f28000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,0x59bf5b45feb1805bdb7f3d5ee2c736f10c0ef93106314e262cc9ff392df6ef1e,2021-11-28 04:12:56.000 UTC,0,true -16932,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec340000000000000000000000006abcf6820ad0386402933117ceb6e831b906e0710000000000000000000000006abcf6820ad0386402933117ceb6e831b906e0710000000000000000000000000000000000000000000000000221576fcd05c00000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -16933,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec3400000000000000000000000063e7098e900e28f2d0c22344d42ca8cc5a1a855000000000000000000000000063e7098e900e28f2d0c22344d42ca8cc5a1a855000000000000000000000000000000000000000000000000000ad1071f045b2d800000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -16934,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec34000000000000000000000000ccdde9b51cb5ed1caa7c0f58c8c8be573463ee13000000000000000000000000ccdde9b51cb5ed1caa7c0f58c8c8be573463ee1300000000000000000000000000000000000000000000000000d822416ca3ba5400000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,0x321287d2dae70d3e40852978168148aca3023f19a6809ae407cfd6444f9fcf3b,2021-11-28 09:41:07.000 UTC,0,true -16935,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec340000000000000000000000004a58362d60e81bb5596c546881312c820abb5eda0000000000000000000000004a58362d60e81bb5596c546881312c820abb5eda00000000000000000000000000000000000000000000000000d71519692b45d900000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -16936,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec34000000000000000000000000e4e41c26bb48c72d91f73eda93cc19c9f65644b6000000000000000000000000e4e41c26bb48c72d91f73eda93cc19c9f65644b60000000000000000000000000000000000000000000000000021b2380cac900000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,0xf508012f63b9a8e77d2eac216ba49fcabc2d2fccf3f7b5cad7110415cab63340,2022-07-01 07:20:08.000 UTC,0,true -16937,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec340000000000000000000000005e656a9f107cb5fbe26d3fe349b123da2d4e463d0000000000000000000000005e656a9f107cb5fbe26d3fe349b123da2d4e463d000000000000000000000000000000000000000000000000003823e693f3ccd700000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -16938,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec3400000000000000000000000093c9a74f211c44c2ebc5d90aa43ab6ec2d896e4600000000000000000000000093c9a74f211c44c2ebc5d90aa43ab6ec2d896e4600000000000000000000000000000000000000000000000000ac55d7738339e900000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -16939,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec34000000000000000000000000294631547727b128bff92f7d1b996bad0edfbe68000000000000000000000000294631547727b128bff92f7d1b996bad0edfbe680000000000000000000000000000000000000000000000000dcebed3a4a2103200000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,0xf1053732d488c89742c50c26bebefe75dfbe9977591dc71e7db749e422adbc05,2021-11-24 21:21:56.000 UTC,0,true -16941,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec340000000000000000000000005b1cd4eeaa0f0574f7bd243b69099cd6da033bbf0000000000000000000000005b1cd4eeaa0f0574f7bd243b69099cd6da033bbf000000000000000000000000000000000000000000000000002913d138b1040200000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -16943,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec34000000000000000000000000dca75c930758cd0a4c64ead527e21e3d61174073000000000000000000000000dca75c930758cd0a4c64ead527e21e3d611740730000000000000000000000000000000000000000000000000186cc6acd4b000000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -16946,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec34000000000000000000000000e724a5756406b6ec652b2fd82704456efa540e54000000000000000000000000e724a5756406b6ec652b2fd82704456efa540e5400000000000000000000000000000000000000000000000000d27db1fb26a62000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -16947,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec34000000000000000000000000062486ae25f0b44bb4b51e11fc7208fbcd375a7a000000000000000000000000062486ae25f0b44bb4b51e11fc7208fbcd375a7a0000000000000000000000000000000000000000000000000007e3e8e7eefc1000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -16948,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0xa9f9e675000000000000000000000000a0b86991c6218b36c1d19d4a2e9eb0ce3606eb480000000000000000000000007f5c764cbc14f9669b88837ca1490cca17c316070000000000000000000000002df67caf0dd06d05c867b5a72bd2d6726ae7ac7e0000000000000000000000002df67caf0dd06d05c867b5a72bd2d6726ae7ac7e000000000000000000000000000000000000000000000000000000000b44290300000000000000000000000000000000000000000000000000000000000000c00000000000000000000000000000000000000000000000000000000000000000,,,1,true -16949,0xcd9d4988c0ae61887b075ba77f08cbfad2b65068,0x3f87ff1de58128ef8fcb4c807efd776e1ac72e51,0xf4f7b41a0000000000000000000000004ee4e1147f0138ce606cbc9dc8e94b602963a844000000000000000000000000000000000000000000000000cb63480e47622769,,,1,true -16950,0xcd9d4988c0ae61887b075ba77f08cbfad2b65068,0x3f87ff1de58128ef8fcb4c807efd776e1ac72e51,0xf4f7b41a000000000000000000000000d11beeac6eea20f48145b86ea14abcab3d8f9f9b0000000000000000000000000000000000000000000000003ba8d1d19e14f82d,,,1,true -16951,0xcd9d4988c0ae61887b075ba77f08cbfad2b65068,0x3f87ff1de58128ef8fcb4c807efd776e1ac72e51,0xf4f7b41a000000000000000000000000d11beeac6eea20f48145b86ea14abcab3d8f9f9b0000000000000000000000000000000000000000000000008a85226f8dab360d,,,1,true -16952,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec340000000000000000000000004d9ba778b7f121e58e5d3bb6aef514e035a7c7f50000000000000000000000004d9ba778b7f121e58e5d3bb6aef514e035a7c7f500000000000000000000000000000000000000000000000000a7e4f0794ac00900000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -16953,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec3400000000000000000000000064816835a84d48f1de570d07f007b110315a93b300000000000000000000000064816835a84d48f1de570d07f007b110315a93b300000000000000000000000000000000000000000000000001517903d615863e00000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,0x7207d22251f7fe734b07120d2bdad35c01dbbe2ae62a26082f49bd2f6ad6b648,2022-03-27 07:38:42.000 UTC,0,true -16954,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec34000000000000000000000000077c5d343e226e7e152246780be2bca2af91631e000000000000000000000000077c5d343e226e7e152246780be2bca2af91631e000000000000000000000000000000000000000000000000004502e4b3bf7bd400000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,0xe94e3e04b4641e7e686bcdb17cfac62af2cfa41c0c4ccfeff05ca0aee7bf5796,2022-03-10 16:43:11.000 UTC,0,true -16956,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec34000000000000000000000000e87bf6541249102772516185156e59b649b7bcb9000000000000000000000000e87bf6541249102772516185156e59b649b7bcb900000000000000000000000000000000000000000000000000457a9bd0a48e0000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -16958,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec34000000000000000000000000a29012a376716fbd163ae8693974422eaf4b194c000000000000000000000000a29012a376716fbd163ae8693974422eaf4b194c000000000000000000000000000000000000000000000000008e1bc9bf04000000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,0x695253567b6c9c4439711d413b111a755f7b8291f549f018ba0c941fd934c89c,2022-09-07 10:58:25.000 UTC,0,true -16959,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec340000000000000000000000007053d9262b7a6aea8ca0eb172d9fb2f3f09a35c70000000000000000000000007053d9262b7a6aea8ca0eb172d9fb2f3f09a35c7000000000000000000000000000000000000000000000000018faa3dce5a857500000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -16960,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec34000000000000000000000000d56460e9b6235b59ef881cd5f7adc137ed0b2f13000000000000000000000000d56460e9b6235b59ef881cd5f7adc137ed0b2f13000000000000000000000000000000000000000000000000018f0833d64c78cc00000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -16961,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec340000000000000000000000004d3da6d4ff825d0f97f96b423c06f14a6d0c92780000000000000000000000004d3da6d4ff825d0f97f96b423c06f14a6d0c9278000000000000000000000000000000000000000000000000018f0833d64c78cc00000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -16962,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec34000000000000000000000000b699fafba3d0ad9ed0583ef2aed0dd88fee4652f000000000000000000000000b699fafba3d0ad9ed0583ef2aed0dd88fee4652f000000000000000000000000000000000000000000000000018e86c5204966f200000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -16963,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec34000000000000000000000000c019f390abe0e94885ce3eecffe5e2b3875be8ea000000000000000000000000c019f390abe0e94885ce3eecffe5e2b3875be8ea00000000000000000000000000000000000000000000000000456af278a8e60000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -16965,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec340000000000000000000000002bd99c2680f9dacf898dd4088187323f5149323a0000000000000000000000002bd99c2680f9dacf898dd4088187323f5149323a000000000000000000000000000000000000000000000000002d59bdceff818900000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -16966,0x10e6593cdda8c58a1d0f14c5164b376352a55f2f,0x467194771dae2967aef3ecbedd3bf9a310c76c65,0xa9f9e6750000000000000000000000006b175474e89094c44da98b954eedeac495271d0f000000000000000000000000da10009cbd5d07dd0cecc66161fc93d7c9000da10000000000000000000000004a64b2820a06a67ee878157a7f48611463d6bd780000000000000000000000004a64b2820a06a67ee878157a7f48611463d6bd7800000000000000000000000000000000000000000000002acdcab48e97bb8f4c00000000000000000000000000000000000000000000000000000000000000c00000000000000000000000000000000000000000000000000000000000000000,,,1,true -16967,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec340000000000000000000000000e69b3e9e744219ecd5f40fa392f73f2c98762690000000000000000000000000e69b3e9e744219ecd5f40fa392f73f2c98762690000000000000000000000000000000000000000000000000b5e45ca13dd4ee000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -16970,0xcd9d4988c0ae61887b075ba77f08cbfad2b65068,0x3f87ff1de58128ef8fcb4c807efd776e1ac72e51,0xf4f7b41a0000000000000000000000000fe4cc87fe5cbf2fc26bf1884538ec47b5aaf0120000000000000000000000000000000000000000000000003dc6ca52ebeb99d5,,,1,true -16971,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0xa9f9e675000000000000000000000000a0b86991c6218b36c1d19d4a2e9eb0ce3606eb480000000000000000000000007f5c764cbc14f9669b88837ca1490cca17c31607000000000000000000000000c1a1182d98f146be42927a4a78db8ac75296acf0000000000000000000000000c1a1182d98f146be42927a4a78db8ac75296acf000000000000000000000000000000000000000000000000000000000d372843600000000000000000000000000000000000000000000000000000000000000c00000000000000000000000000000000000000000000000000000000000000000,,,1,true -16974,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec340000000000000000000000009e319d9ae1f0c493bc047f8a6ca6541a09e2c86a0000000000000000000000009e319d9ae1f0c493bc047f8a6ca6541a09e2c86a000000000000000000000000000000000000000000000000020dcd3742c2000000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -16979,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec340000000000000000000000002f5c839627849e20f7e67313e1598c7fd33924860000000000000000000000002f5c839627849e20f7e67313e1598c7fd339248600000000000000000000000000000000000000000000000000af56968cd1af0000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -16982,0xcd9d4988c0ae61887b075ba77f08cbfad2b65068,0x3f87ff1de58128ef8fcb4c807efd776e1ac72e51,0xf4f7b41a000000000000000000000000f1915aba3c55ba20258e6ad98760eece256eff28000000000000000000000000000000000000000000000000107cf03b0591cc48,,,1,true -16983,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec34000000000000000000000000731ca97a11a7e0c1be91a979c37ec0ac811293fd000000000000000000000000731ca97a11a7e0c1be91a979c37ec0ac811293fd0000000000000000000000000000000000000000000000000240bff3b0484b2900000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -16987,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec34000000000000000000000000b325ecd1463ca55c399765061956377b3f47b1ea000000000000000000000000b325ecd1463ca55c399765061956377b3f47b1ea0000000000000000000000000000000000000000000000000001b400ce5e590000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -16988,0xcd9d4988c0ae61887b075ba77f08cbfad2b65068,0x3f87ff1de58128ef8fcb4c807efd776e1ac72e51,0xf4f7b41a00000000000000000000000085e645fe242a8ceae70f517dd5a773f1129be3170000000000000000000000000000000000000000000000027b40c5e5c2b486a2,,,1,true -16989,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec340000000000000000000000000ac1c1c174c0177bd7ec4b1067a2fc4563d398540000000000000000000000000ac1c1c174c0177bd7ec4b1067a2fc4563d39854000000000000000000000000000000000000000000000000000c78293794838000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -16993,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec340000000000000000000000002c3adf438022b055b069cda225ed522d2391fd840000000000000000000000002c3adf438022b055b069cda225ed522d2391fd840000000000000000000000000000000000000000000000001c8351a4fa3e5ceb00000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,0x014b6286d400bdb9ae76008a18483fdb696ac4d9bd7be65d209d6a7dd18c4fdb,2021-11-28 14:32:49.000 UTC,0,true -16994,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec34000000000000000000000000b724845049cbf7e09f98f673c1bec7208db39a37000000000000000000000000b724845049cbf7e09f98f673c1bec7208db39a37000000000000000000000000000000000000000000000000004d4bfbf5c6cc1f00000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -16995,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec340000000000000000000000006cd8401984a8dd15382dcbb44d87dd249472fd8b0000000000000000000000006cd8401984a8dd15382dcbb44d87dd249472fd8b0000000000000000000000000000000000000000000000000130eee4c84fc3a200000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,0x3cfb8b6a90cf09e495444d79279e10a86c2a4240022f1805d0201547ef44a0ea,2022-03-08 08:26:51.000 UTC,0,true -16996,0x10e6593cdda8c58a1d0f14c5164b376352a55f2f,0x467194771dae2967aef3ecbedd3bf9a310c76c65,0xa9f9e6750000000000000000000000006b175474e89094c44da98b954eedeac495271d0f000000000000000000000000da10009cbd5d07dd0cecc66161fc93d7c9000da10000000000000000000000006cd8401984a8dd15382dcbb44d87dd249472fd8b0000000000000000000000006cd8401984a8dd15382dcbb44d87dd249472fd8b000000000000000000000000000000000000000000000010bf4e3f542e674be700000000000000000000000000000000000000000000000000000000000000c00000000000000000000000000000000000000000000000000000000000000000,0x6f80afaad6e8765cbe4e2c7e0a118d72ebd681b03c19c2e0e10af93ba6cf221e,2022-03-08 08:25:06.000 UTC,0,true -16997,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec34000000000000000000000000553ef84376c68008f665473268d4a6fb9abf11fe000000000000000000000000553ef84376c68008f665473268d4a6fb9abf11fe000000000000000000000000000000000000000000000000002e9519b911fe3500000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,0x596c0f02788f0a3e0680b9da4d4f704f5e2cebe8140cf0d567812f7c307ba3c4,2022-05-29 15:11:43.000 UTC,0,true -16999,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec34000000000000000000000000be659018e3e8afe7838e6c786996d663a5699813000000000000000000000000be659018e3e8afe7838e6c786996d663a569981300000000000000000000000000000000000000000000000000a5a74df156adb800000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -17000,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec34000000000000000000000000d937b707737b81d1da49a0995f93f77cdf0e4608000000000000000000000000d937b707737b81d1da49a0995f93f77cdf0e4608000000000000000000000000000000000000000000000000025d0f870b6cbcab00000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,0xd8329c41b10bc93f9619a144abb12eacd372a195dd82ef1e8c2da676334254c3,2021-12-12 07:16:05.000 UTC,0,true -17001,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec340000000000000000000000003bf3077256842bd9409b3645797855e721ab22f40000000000000000000000003bf3077256842bd9409b3645797855e721ab22f4000000000000000000000000000000000000000000000000003b7918dd0b9e1800000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -17002,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec3400000000000000000000000078e7d7d4b454ab02904477ea71e6f15270bbb71600000000000000000000000078e7d7d4b454ab02904477ea71e6f15270bbb71600000000000000000000000000000000000000000000000002e689b6b4f0310000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,0xb1f3290022081453ac401163418c71fed9babf6463df38723a845d07b3673a7b,2021-11-28 01:41:16.000 UTC,0,true -17003,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec34000000000000000000000000e71da5f8f6e90fa92f794963ba90f5c1cd16a6a6000000000000000000000000e71da5f8f6e90fa92f794963ba90f5c1cd16a6a600000000000000000000000000000000000000000000000000aa87bee538000000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,0xd1861440fb71d7f90fee5df06b1e8f21008f9ea9a63ab9451fe9ac2507566fb7,2022-06-17 20:05:45.000 UTC,0,true -17004,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec340000000000000000000000009141e07491347467855e16a2d973bf84c6ecd8de0000000000000000000000009141e07491347467855e16a2d973bf84c6ecd8de000000000000000000000000000000000000000000000000012790550d6e43d100000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -17007,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec34000000000000000000000000cb1d07354fc52380ca0adc16d781ad7be0a0064a000000000000000000000000cb1d07354fc52380ca0adc16d781ad7be0a0064a000000000000000000000000000000000000000000000000003e331efcbe1a6d00000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -17012,0x10e6593cdda8c58a1d0f14c5164b376352a55f2f,0x467194771dae2967aef3ecbedd3bf9a310c76c65,0xa9f9e6750000000000000000000000006b175474e89094c44da98b954eedeac495271d0f000000000000000000000000da10009cbd5d07dd0cecc66161fc93d7c9000da1000000000000000000000000aa9ccef24415475e88d644d3c33fb4ed1b29ffaf000000000000000000000000aa9ccef24415475e88d644d3c33fb4ed1b29ffaf00000000000000000000000000000000000000000000004b4c3f4cc33994000000000000000000000000000000000000000000000000000000000000000000c00000000000000000000000000000000000000000000000000000000000000000,0x5e12a29a2624037467c67d82c193b048159aca9bb736776d9e4bbf2edd25c1ac,2021-11-23 12:11:31.000 UTC,0,true -17013,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec34000000000000000000000000e3c42dff9c595f6c1538d9e98396b9220d304b80000000000000000000000000e3c42dff9c595f6c1538d9e98396b9220d304b80000000000000000000000000000000000000000000000000016345785d8a000000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,0x717f916573dd54a48e0908bcf3eb14008f6f8776476c607ac382f009f417a466,2021-12-03 11:39:02.000 UTC,0,true -17014,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec3400000000000000000000000094fce1ba7ba586f1fbc14b6970e7c1cb6a04402e00000000000000000000000094fce1ba7ba586f1fbc14b6970e7c1cb6a04402e000000000000000000000000000000000000000000000000020c408c4e4641d200000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,0xf7d5937d41ee8c81d1406e68e42fd2a906d68cf4e645ba5fc93c1623105a93c5,2021-12-25 09:29:02.000 UTC,0,true -17016,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec34000000000000000000000000222c006c2e1956383caf63b761d73e804cb47118000000000000000000000000222c006c2e1956383caf63b761d73e804cb471180000000000000000000000000000000000000000000000000000ec77f7a4400000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -17017,0xcd9d4988c0ae61887b075ba77f08cbfad2b65068,0x3f87ff1de58128ef8fcb4c807efd776e1ac72e51,0xf4f7b41a00000000000000000000000027b1f8343c5509fd0b5d63a7fdd920507c7e0da700000000000000000000000000000000000000000000000238fd42c5cf040000,0x2df01c8b7252b0c16ec199867972b5f959b6b7bfd1f13a7db415b4e47d3104e1,2022-03-13 06:13:31.000 UTC,0,true -17020,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec34000000000000000000000000678e1e7a4c55b5bc3735df2355c4c1240c079846000000000000000000000000678e1e7a4c55b5bc3735df2355c4c1240c0798460000000000000000000000000000000000000000000000000035b77aed2c399200000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -17021,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec340000000000000000000000003774afdd53d42f21c106f9fa1abf66a9acf4ff970000000000000000000000003774afdd53d42f21c106f9fa1abf66a9acf4ff970000000000000000000000000000000000000000000000000000e35fa931a00000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -17022,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec340000000000000000000000001be5f9df988c06400780d53df143c1bbff2988b50000000000000000000000001be5f9df988c06400780d53df143c1bbff2988b5000000000000000000000000000000000000000000000000015eee5c95bdfaa300000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -17023,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec3400000000000000000000000010f53b57c6a6f07c9d9684e774cd77a4d29ceb3a00000000000000000000000010f53b57c6a6f07c9d9684e774cd77a4d29ceb3a00000000000000000000000000000000000000000000000001033b9e8a203b9900000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -17024,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec34000000000000000000000000f13d1861f0f26ecd8700a021cc1767a59c1ff3c2000000000000000000000000f13d1861f0f26ecd8700a021cc1767a59c1ff3c20000000000000000000000000000000000000000000000000000e4487dd6b00000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -17025,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec34000000000000000000000000ffdebb7ea3ab60bbc1e2ca9d7b4997f2e5f601bb000000000000000000000000ffdebb7ea3ab60bbc1e2ca9d7b4997f2e5f601bb0000000000000000000000000000000000000000000000000000e35fa931a00000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -17026,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec34000000000000000000000000d50521ca9abc795148cb881ce3ee4fd739bf2c0f000000000000000000000000d50521ca9abc795148cb881ce3ee4fd739bf2c0f0000000000000000000000000000000000000000000000000000ec77f7a4400000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -17027,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec34000000000000000000000000f4be26f5cd223b61f9fc1bd22241646e02fef5bd000000000000000000000000f4be26f5cd223b61f9fc1bd22241646e02fef5bd0000000000000000000000000000000000000000000000000000e35fa931a00000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -17028,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec3400000000000000000000000094d297963f98aeef31211e442ece6d7f620039b500000000000000000000000094d297963f98aeef31211e442ece6d7f620039b50000000000000000000000000000000000000000000000000000ec77f7a4400000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -17029,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec340000000000000000000000008b67ca567bed1a234c4938a7e89d91e86ad4fbc50000000000000000000000008b67ca567bed1a234c4938a7e89d91e86ad4fbc50000000000000000000000000000000000000000000000000000e35fa931a00000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -17030,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec340000000000000000000000002a5a819afa55000bbc9b9e909613189eb92c37390000000000000000000000002a5a819afa55000bbc9b9e909613189eb92c37390000000000000000000000000000000000000000000000000000e35fa931a00000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -17031,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec340000000000000000000000004cc76a4e7036fad1a348249c73b922c2715a6c730000000000000000000000004cc76a4e7036fad1a348249c73b922c2715a6c730000000000000000000000000000000000000000000000000000e35fa931a00000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -17032,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec340000000000000000000000009aeda209c979408798397336277c690f72b521540000000000000000000000009aeda209c979408798397336277c690f72b521540000000000000000000000000000000000000000000000000000e35fa931a00000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -17034,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec340000000000000000000000007f7627169b4c1b0dddf40daaa2dca03f0ca6037a0000000000000000000000007f7627169b4c1b0dddf40daaa2dca03f0ca6037a0000000000000000000000000000000000000000000000000000e35fa931a00000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -17035,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec340000000000000000000000005df004d8653297117319d015168238d47b21d2d70000000000000000000000005df004d8653297117319d015168238d47b21d2d70000000000000000000000000000000000000000000000000000e35fa931a00000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -17043,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec34000000000000000000000000cdcf64bcd5ecc4990798110bd4ad8ed3c5dc6f1e000000000000000000000000cdcf64bcd5ecc4990798110bd4ad8ed3c5dc6f1e0000000000000000000000000000000000000000000000000000e35fa931a00000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -17052,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec340000000000000000000000002975d61c9884eb506886d7ecc60ef86d019c818a0000000000000000000000002975d61c9884eb506886d7ecc60ef86d019c818a0000000000000000000000000000000000000000000000000000e35fa931a00000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -17088,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0xa9f9e6750000000000000000000000001f9840a85d5af5bf1d1762f925bdaddc4201f9840000000000000000000000006fd9d7ad17242c41f7131d257212c54a0e816691000000000000000000000000bc3b0fa064869296faea0467f97984ab60ddec3d000000000000000000000000bc3b0fa064869296faea0467f97984ab60ddec3d0000000000000000000000000000000000000000000000000c47b6c66e3ae6a900000000000000000000000000000000000000000000000000000000000000c00000000000000000000000000000000000000000000000000000000000000000,,,1,true -17089,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec34000000000000000000000000f2d822fc64381b44a036295bcaa1ead4848f8ecf000000000000000000000000f2d822fc64381b44a036295bcaa1ead4848f8ecf0000000000000000000000000000000000000000000000000023ea88fe4109c000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -17090,0xcd9d4988c0ae61887b075ba77f08cbfad2b65068,0x3f87ff1de58128ef8fcb4c807efd776e1ac72e51,0xf4f7b41a000000000000000000000000c2768e9353bf078ace3c345d279e27d393d5c4870000000000000000000000000000000000000000000000121e9814442075020b,,,1,true -17091,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0xa9f9e675000000000000000000000000a0b86991c6218b36c1d19d4a2e9eb0ce3606eb480000000000000000000000007f5c764cbc14f9669b88837ca1490cca17c31607000000000000000000000000fae86fa6eb0d21e198c74956217dec00842adc99000000000000000000000000fae86fa6eb0d21e198c74956217dec00842adc990000000000000000000000000000000000000000000000000000000015f2a14c00000000000000000000000000000000000000000000000000000000000000c00000000000000000000000000000000000000000000000000000000000000000,,,1,true -17092,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec34000000000000000000000000aae301463fbb85789b888661f113c18a35e623b4000000000000000000000000aae301463fbb85789b888661f113c18a35e623b40000000000000000000000000000000000000000000000000000e35fa931a00000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -17093,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec34000000000000000000000000cfcdfe2b8c5fd921f0cb1554deef92e8595f6c9b000000000000000000000000cfcdfe2b8c5fd921f0cb1554deef92e8595f6c9b0000000000000000000000000000000000000000000000000000e35fa931a00000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -17094,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec34000000000000000000000000c8cf7ece3065aa6117ae2dde3c5f311b56bf430b000000000000000000000000c8cf7ece3065aa6117ae2dde3c5f311b56bf430b0000000000000000000000000000000000000000000000000000e18dffe7800000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -17095,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec3400000000000000000000000002f779cd8d2d37f719dd6f14563ba3fde845625500000000000000000000000002f779cd8d2d37f719dd6f14563ba3fde84562550000000000000000000000000000000000000000000000000000e35fa931a00000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -17096,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec340000000000000000000000001482974cb66f425c1c2d3fc580a5c7d4b3bdedf70000000000000000000000001482974cb66f425c1c2d3fc580a5c7d4b3bdedf7000000000000000000000000000000000000000000000000033fd2a64598263600000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,0xd30778c18102533bb41852514ac1ca0849f403edaa6aa7a79364b7710005079d,2022-04-24 03:53:15.000 UTC,0,true -17097,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec340000000000000000000000007bae9ff328da5530501e2f05d07b1f79acf321ec0000000000000000000000007bae9ff328da5530501e2f05d07b1f79acf321ec0000000000000000000000000000000000000000000000000000e35fa931a00000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -17098,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec340000000000000000000000005436d1b90693655eaf8eb656fb69136d9c37c58a0000000000000000000000005436d1b90693655eaf8eb656fb69136d9c37c58a0000000000000000000000000000000000000000000000000000ded381f8500000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -17099,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec34000000000000000000000000595f4f65072917c337cd31afce860777ad0e2261000000000000000000000000595f4f65072917c337cd31afce860777ad0e22610000000000000000000000000000000000000000000000000000dd01d8ae300000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -17100,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec340000000000000000000000007b8aa49debb429ce54df296520b68331d669cdce0000000000000000000000007b8aa49debb429ce54df296520b68331d669cdce0000000000000000000000000000000000000000000000000000e18dffe7800000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -17101,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec340000000000000000000000007b9e41122be54a08999b1100ebf9221d5246d50b0000000000000000000000007b9e41122be54a08999b1100ebf9221d5246d50b0000000000000000000000000000000000000000000000000000ded381f8500000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -17102,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec340000000000000000000000005e885198c6c34ee90bf65c4958794ba65f4da0d90000000000000000000000005e885198c6c34ee90bf65c4958794ba65f4da0d90000000000000000000000000000000000000000000000000000e35fa931a00000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -17103,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec340000000000000000000000004b4ef2441c53360d3aacd06c95bdbba51c791b790000000000000000000000004b4ef2441c53360d3aacd06c95bdbba51c791b790000000000000000000000000000000000000000000000000147b8d4fe413d5600000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -17104,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec340000000000000000000000001e6f3bf96e9bce7da411920e5e7e118ef3cdd1a00000000000000000000000001e6f3bf96e9bce7da411920e5e7e118ef3cdd1a00000000000000000000000000000000000000000000000000000e35fa931a00000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -17105,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec340000000000000000000000002e2c056c3f1c9eeb3315321b8dd83b7e8aea05ea0000000000000000000000002e2c056c3f1c9eeb3315321b8dd83b7e8aea05ea0000000000000000000000000000000000000000000000000000e35fa931a00000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -17107,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec340000000000000000000000004999c3a36f8ed0ae7ad33abd828cac81a6d7af230000000000000000000000004999c3a36f8ed0ae7ad33abd828cac81a6d7af230000000000000000000000000000000000000000000000000000e35fa931a00000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -17108,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec34000000000000000000000000917bcd9ed06da0c81eca88dd2dee9ca8df6e4522000000000000000000000000917bcd9ed06da0c81eca88dd2dee9ca8df6e45220000000000000000000000000000000000000000000000000000e35fa931a00000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -17112,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec340000000000000000000000003c8b02b5b18e7c6ae87876cb94e1d273a04fbfe90000000000000000000000003c8b02b5b18e7c6ae87876cb94e1d273a04fbfe900000000000000000000000000000000000000000000000000ab4e26016b7ffa00000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,0x82e990794cfba8a8120792e4a5f311066316bcc020f187853d90b92dbd4114f3,2021-12-16 12:18:43.000 UTC,0,true -17117,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec34000000000000000000000000480ccf469f7f2d65baad9c97413c64a9b9ff6ff2000000000000000000000000480ccf469f7f2d65baad9c97413c64a9b9ff6ff2000000000000000000000000000000000000000000000000037c90b1541a67d000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -17118,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec3400000000000000000000000030eeff183dce51bd0738e931f6d7b73e2323886800000000000000000000000030eeff183dce51bd0738e931f6d7b73e232388680000000000000000000000000000000000000000000000001c7a552b0a49ac3300000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,0xcb22a7eacf81eabc4b97d66c5d3e2de185e98df259e257ff18aa0037279d61d5,2021-11-24 10:13:43.000 UTC,0,true -17120,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec340000000000000000000000001b965034eb2256079d7dc8e5b0bba5ed030fffd10000000000000000000000001b965034eb2256079d7dc8e5b0bba5ed030fffd10000000000000000000000000000000000000000000000000049db11f5bd992900000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,0x9bd1d2765f49efdddc8eb6199d20421f58c6cd2bc9200b3c90d74da4dc0235c2,2022-02-17 16:33:19.000 UTC,0,true -17122,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec3400000000000000000000000065ac569e966648cf629d8b0e5e15ce644b3a01a900000000000000000000000065ac569e966648cf629d8b0e5e15ce644b3a01a9000000000000000000000000000000000000000000000000003ed5f6b1da8a4500000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -17123,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec340000000000000000000000000f9897fd1163dc6995acbfe3db1e35c2821281550000000000000000000000000f9897fd1163dc6995acbfe3db1e35c282128155000000000000000000000000000000000000000000000000009d0aedce82bc0900000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,0xbe364e60a5477c74aa5fc573314489cc1f3e9acead60a36904b0713c8534f9db,2021-12-17 11:22:20.000 UTC,0,true -17125,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec340000000000000000000000009f8e08c542fac3ffdc450c6dcf92deb2863a9efb0000000000000000000000009f8e08c542fac3ffdc450c6dcf92deb2863a9efb000000000000000000000000000000000000000000000000010cbfe83185d21200000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,0x3a983ea4e5c5cc810ee6c427456634830763bf611ba336a671eab210be84fadd,2021-12-02 04:14:08.000 UTC,0,true -17126,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec34000000000000000000000000d8f43fba05d633a71bdfcd536c3fc836fe23558a000000000000000000000000d8f43fba05d633a71bdfcd536c3fc836fe23558a000000000000000000000000000000000000000000000000010d5a306e041dec00000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,0x57aa9493eb62973a0991121537bb06c36d70ecdc8fe990e9ec4e49dbf2d37fc4,2021-12-02 04:20:10.000 UTC,0,true -17127,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec34000000000000000000000000b7f7d8fce54c53ad964e4dc3538cbf4b0e3b1395000000000000000000000000b7f7d8fce54c53ad964e4dc3538cbf4b0e3b1395000000000000000000000000000000000000000000000000010ea2ad9cb3d82400000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,0x21ba2bba5ac12ae4b46b00eee102783a37f23e6235261f0177cf1b2c4919dcb7,2021-12-02 04:23:34.000 UTC,0,true -17128,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec34000000000000000000000000c62bec5f0a750260f98bea79b820e9f18d5bad44000000000000000000000000c62bec5f0a750260f98bea79b820e9f18d5bad4400000000000000000000000000000000000000000000000001103c993c03b81700000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,0xe263e12580fedbb647a1c6a90d3ae6f2d42c981af44231fa084873aa29d63009,2021-12-02 04:27:41.000 UTC,0,true -17129,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec3400000000000000000000000075f6a7d7c8aaa0db29e9cd4c49b17df5b829e31e00000000000000000000000075f6a7d7c8aaa0db29e9cd4c49b17df5b829e31e000000000000000000000000000000000000000000000000010edd0dce74daf000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,0x69f5800e38cf4269850e250d329d6f8472712fedfc22eff216fe95b5c91bf282,2021-12-02 04:30:15.000 UTC,0,true -17130,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec34000000000000000000000000cc969c8fe6299fcdc4785153540ea2da4efd3834000000000000000000000000cc969c8fe6299fcdc4785153540ea2da4efd3834000000000000000000000000000000000000000000000000010ce032ce88b72300000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,0xa24e98697ea53c5d42b97d63107e167e8d4205028809d7439b9f2700d10dacb2,2021-12-02 04:34:47.000 UTC,0,true -17131,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec3400000000000000000000000099a288b8cc9c581af9aa2deed29a4f73c7c199f600000000000000000000000099a288b8cc9c581af9aa2deed29a4f73c7c199f6000000000000000000000000000000000000000000000000010eb0a78bc61bf500000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,0x328f336e9b35b1b5cd44475ebd65972d38ce0a01bcd296d344b0184081ae2533,2021-12-02 04:42:40.000 UTC,0,true -17132,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec340000000000000000000000005e5e48f3f09748a8854103981a836a964b816c420000000000000000000000005e5e48f3f09748a8854103981a836a964b816c42000000000000000000000000000000000000000000000000010f989f9451aca300000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,0x5da816a4c8db071f3e23e19c40b0da171d70d04778f9ff6e2cc683c6eb8a2126,2021-12-02 04:47:26.000 UTC,0,true -17133,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec34000000000000000000000000a240707caeb1fcc72404f964d697f78a1239d07a000000000000000000000000a240707caeb1fcc72404f964d697f78a1239d07a00000000000000000000000000000000000000000000000001109a1009d3a73100000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -17134,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec3400000000000000000000000028f8f8ab489f65cac52b1aeec9a213e424a9853100000000000000000000000028f8f8ab489f65cac52b1aeec9a213e424a98531000000000000000000000000000000000000000000000000010f30d203d6dbd100000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,0x626edf0e93ee5023050a523a8b94a04f79a340397cde559a48407665452f6ebd,2021-12-02 04:55:55.000 UTC,0,true -17135,0xcd9d4988c0ae61887b075ba77f08cbfad2b65068,0x3f87ff1de58128ef8fcb4c807efd776e1ac72e51,0xf4f7b41a000000000000000000000000f99b31f3dc3b05975cf6924988d4a0b4813505f4000000000000000000000000000000000000000000000002b613371e38c86589,,,1,true -17136,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec3400000000000000000000000053ed1cb341d105673d85763ec7889469455b46f000000000000000000000000053ed1cb341d105673d85763ec7889469455b46f000000000000000000000000000000000000000000000000000c749178a0c1ad200000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -17137,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec34000000000000000000000000ad539ef1257f61fe15e878b9b7d5d1abe2156678000000000000000000000000ad539ef1257f61fe15e878b9b7d5d1abe215667800000000000000000000000000000000000000000000000000c8a38b9472673e00000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,0x001c0efc3bb5a70874db95ae06ff053e9334ba43a2fc772bac97bfef8a6e272c,2022-02-26 12:51:54.000 UTC,0,true -17139,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec3400000000000000000000000047a80f9d951d4fcfc34a7c04e671a2d663760a1900000000000000000000000047a80f9d951d4fcfc34a7c04e671a2d663760a1900000000000000000000000000000000000000000000000001587a9c76d8129400000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -17140,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0xa9f9e675000000000000000000000000514910771af9ca656af840dff83e8264ecf986ca000000000000000000000000350a791bfc2c21f9ed5d10980dad2e2638ffa7f6000000000000000000000000078ec322eef36f157600bf3ce43211e28adbc07b000000000000000000000000078ec322eef36f157600bf3ce43211e28adbc07b000000000000000000000000000000000000000000000000ca9071965e4fe06100000000000000000000000000000000000000000000000000000000000000c00000000000000000000000000000000000000000000000000000000000000000,,,1,true -17142,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec34000000000000000000000000e25ba8ec283a86a3dbfb471ec262e26dd8137c59000000000000000000000000e25ba8ec283a86a3dbfb471ec262e26dd8137c59000000000000000000000000000000000000000000000000000bc72f2ebe6c9400000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -17143,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec34000000000000000000000000566e62982f0318616977dac873e83d1d0c825ddb000000000000000000000000566e62982f0318616977dac873e83d1d0c825ddb000000000000000000000000000000000000000000000000004576847595350700000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -17144,0xcd9d4988c0ae61887b075ba77f08cbfad2b65068,0x3f87ff1de58128ef8fcb4c807efd776e1ac72e51,0xf4f7b41a00000000000000000000000090157efaaa8dc6006434d98e60231a7ae81162e10000000000000000000000000000000000000000000000061317e7748a8f234f,,,1,true -17145,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec340000000000000000000000001830dbb1d9054ff82d8c2efa4c2107a1e28305a40000000000000000000000001830dbb1d9054ff82d8c2efa4c2107a1e28305a400000000000000000000000000000000000000000000000001aa535d3d0c000000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -17146,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec34000000000000000000000000abdcfd11af016bbd617847a464a87993cc61c050000000000000000000000000abdcfd11af016bbd617847a464a87993cc61c05000000000000000000000000000000000000000000000000000d1dd398444537800000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -17150,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec3400000000000000000000000090a247279b94f4609481d0ca8459b68aa79959ea00000000000000000000000090a247279b94f4609481d0ca8459b68aa79959ea00000000000000000000000000000000000000000000000002cda5ee04a1000000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -17153,0xcd9d4988c0ae61887b075ba77f08cbfad2b65068,0x3f87ff1de58128ef8fcb4c807efd776e1ac72e51,0xf4f7b41a000000000000000000000000a61443cdf751dcb8d95f24633522562fb93f512400000000000000000000000000000000000000000000000c5d4c6b0cb78097fe,0x6988598a4aeaaa2efe660ce979c881e61c11af78a3eb8c2c013b6e3d8a61b947,2021-11-26 07:16:58.000 UTC,0,true -17154,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec34000000000000000000000000ae08eba835fc6c2b9726b31c7e248171457cc44a000000000000000000000000ae08eba835fc6c2b9726b31c7e248171457cc44a00000000000000000000000000000000000000000000000000561117f211d76800000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -17156,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec34000000000000000000000000f85385347f56819c316939434d427d0c9537eddc000000000000000000000000f85385347f56819c316939434d427d0c9537eddc000000000000000000000000000000000000000000000000a6ef525ab4e2c51b00000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -17157,0xcd9d4988c0ae61887b075ba77f08cbfad2b65068,0x3f87ff1de58128ef8fcb4c807efd776e1ac72e51,0xf4f7b41a000000000000000000000000324cac984d3f7f40bc00ba9621d341769c90a97a00000000000000000000000000000000000000000000010f611e8b1b85461d44,0x5fb95d43b8f10d3e637f527cd66826fdfad712ce5f478d0aa9c4c0096e961fed,2021-12-02 00:32:48.000 UTC,0,true -17158,0xcd9d4988c0ae61887b075ba77f08cbfad2b65068,0x3f87ff1de58128ef8fcb4c807efd776e1ac72e51,0xf4f7b41a000000000000000000000000df938d253a6fb2845eb4b96f27cf8b3d61216b93000000000000000000000000000000000000000000000007372a8dcc56ab11b1,,,1,true -17160,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec340000000000000000000000004fc7f0fd2a353b7694deb8da43684f3d50c928130000000000000000000000004fc7f0fd2a353b7694deb8da43684f3d50c92813000000000000000000000000000000000000000000000000004aae626c506aa300000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -17161,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec34000000000000000000000000312761d81670c5906e487620cec73b1556add74d000000000000000000000000312761d81670c5906e487620cec73b1556add74d0000000000000000000000000000000000000000000000000000ded381f8500000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -17162,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec340000000000000000000000007b0105344845232f19100471c24ca4c320ebf2e00000000000000000000000007b0105344845232f19100471c24ca4c320ebf2e000000000000000000000000000000000000000000000000000798387ee84f0fd00000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -17163,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec3400000000000000000000000038bba1f6d1e9a703744774beadad5a477cc3a9cf00000000000000000000000038bba1f6d1e9a703744774beadad5a477cc3a9cf0000000000000000000000000000000000000000000000000000ddeaad53400000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -17165,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec340000000000000000000000003598143d676dc58eb7a2a159326d26f3c09363fb0000000000000000000000003598143d676dc58eb7a2a159326d26f3c09363fb000000000000000000000000000000000000000000000000019571e36245517b00000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,0x39bd2797798b0569bab2f6f0d70ba973662f59b65fd0c2ce1eaead94596fbb2a,2022-03-22 10:27:58.000 UTC,0,true -17168,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec3400000000000000000000000059d12abaefdf2233380f08f2ab9f7944aaba165600000000000000000000000059d12abaefdf2233380f08f2ab9f7944aaba16560000000000000000000000000000000000000000000000000000ded381f8500000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -17169,0xcd9d4988c0ae61887b075ba77f08cbfad2b65068,0x3f87ff1de58128ef8fcb4c807efd776e1ac72e51,0xf4f7b41a000000000000000000000000b7c484d9eca2fd5a9b670c25b33f45daf7d9b85f0000000000000000000000000000000000000000000000121f57872c129ce2f5,,,1,true -17172,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec340000000000000000000000008c7231008f957439294ff4f5bf10a7b373dfbbfa0000000000000000000000008c7231008f957439294ff4f5bf10a7b373dfbbfa00000000000000000000000000000000000000000000000002b154638f62987700000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,0xb8cf97d1bb6ed6136ddc942ad6bb99fd81d20cc3d1c60dc6cbac2c646468e8cf,2021-12-01 08:33:50.000 UTC,0,true -17173,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec34000000000000000000000000c5459faea42aa128423cb494a7fa29bbb41f5d42000000000000000000000000c5459faea42aa128423cb494a7fa29bbb41f5d4200000000000000000000000000000000000000000000000000caddd9c68c876800000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -17174,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec340000000000000000000000003a6e7e18314f36cf2ef4f0bd0035fdd1b126f84e0000000000000000000000003a6e7e18314f36cf2ef4f0bd0035fdd1b126f84e0000000000000000000000000000000000000000000000000000ddeaad53400000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -17175,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec3400000000000000000000000055cd6f4a80d0e62e5557ef266d0fa00372fd9a9300000000000000000000000055cd6f4a80d0e62e5557ef266d0fa00372fd9a93000000000000000000000000000000000000000000000000003c6fb31adc483f00000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -17176,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec34000000000000000000000000f998e2ff04e6b1c367837da0d4f42c4aa764f08d000000000000000000000000f998e2ff04e6b1c367837da0d4f42c4aa764f08d0000000000000000000000000000000000000000000000000000dd01d8ae300000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -17177,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec34000000000000000000000000e2567fde0415f238fa424e5be49b11b64b253de7000000000000000000000000e2567fde0415f238fa424e5be49b11b64b253de70000000000000000000000000000000000000000000000000000dd01d8ae300000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -17178,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec3400000000000000000000000019e80654656af3fa27ea3b8f68b04e070de1423700000000000000000000000019e80654656af3fa27ea3b8f68b04e070de1423700000000000000000000000000000000000000000000000000d529ae9e86000000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -17179,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec340000000000000000000000008f4adcaafc1769c8cb34ea6b128beb777a58a6bc0000000000000000000000008f4adcaafc1769c8cb34ea6b128beb777a58a6bc000000000000000000000000000000000000000000000000002ea7a052fb556900000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -17180,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec34000000000000000000000000d734dcc789e84a61cb154b1812af6e3d02d09dad000000000000000000000000d734dcc789e84a61cb154b1812af6e3d02d09dad0000000000000000000000000000000000000000000000000000dc190409200000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -17181,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec34000000000000000000000000bd7ac85da56c0bfb3373380e2396d453d094970a000000000000000000000000bd7ac85da56c0bfb3373380e2396d453d094970a0000000000000000000000000000000000000000000000000000dd01d8ae300000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -17182,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec34000000000000000000000000b0b044e0dfa39199fb5cbcf466762b8b80c2d85d000000000000000000000000b0b044e0dfa39199fb5cbcf466762b8b80c2d85d000000000000000000000000000000000000000000000000009e21a698b1baeb00000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -17183,0xcd9d4988c0ae61887b075ba77f08cbfad2b65068,0x3f87ff1de58128ef8fcb4c807efd776e1ac72e51,0xf4f7b41a0000000000000000000000008bcf9320497028119da1c99525d19a9f0d86f92a0000000000000000000000000000000000000000000000000bbab876113c2ca8,,,1,true -17184,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec34000000000000000000000000fc65c103438b426f02940a351415f52e11431f98000000000000000000000000fc65c103438b426f02940a351415f52e11431f980000000000000000000000000000000000000000000000000000dd01d8ae300000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -17185,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec340000000000000000000000001b8c72154b9766f4b05895738ef217914c9be6b90000000000000000000000001b8c72154b9766f4b05895738ef217914c9be6b90000000000000000000000000000000000000000000000000000dd01d8ae300000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -17186,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec340000000000000000000000001e8d9f46f1526d8f5640000c83a81b92578bb3800000000000000000000000001e8d9f46f1526d8f5640000c83a81b92578bb38000000000000000000000000000000000000000000000000001c2d7d3874b8d2b00000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -17188,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec340000000000000000000000001b4916641c4975ebf23585b3d6845955d01d504e0000000000000000000000001b4916641c4975ebf23585b3d6845955d01d504e0000000000000000000000000000000000000000000000000000dc190409200000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -17190,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec34000000000000000000000000699053f19f64217206d2d1cb34006b355180718b000000000000000000000000699053f19f64217206d2d1cb34006b355180718b000000000000000000000000000000000000000000000000000110d9316ec00000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -17192,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec34000000000000000000000000117266cdd328d8c59b85c68cb4d4ae6c71a78c5e000000000000000000000000117266cdd328d8c59b85c68cb4d4ae6c71a78c5e000000000000000000000000000000000000000000000000000110d9316ec00000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -17193,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec340000000000000000000000006e71bc1a0c50b7356ec5ff9e54088e55ef63e1a80000000000000000000000006e71bc1a0c50b7356ec5ff9e54088e55ef63e1a8000000000000000000000000000000000000000000000000057d1dfe9ad1083d00000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,0xaedd13fdc63313981afa909c3c248bc116fe4704212fdd487c14fcedf2deb79e,2021-12-14 10:54:18.000 UTC,0,true -17194,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec34000000000000000000000000da5dfd2d4807741fe0eb6ee1fd88a04000c88e5c000000000000000000000000da5dfd2d4807741fe0eb6ee1fd88a04000c88e5c000000000000000000000000000000000000000000000000000110d9316ec00000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -17195,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec3400000000000000000000000077e1105c4782493ab490d7151b6ce690ee2bb7a400000000000000000000000077e1105c4782493ab490d7151b6ce690ee2bb7a4000000000000000000000000000000000000000000000000000110d9316ec00000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -17198,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec340000000000000000000000004421de8bfb150486936a4e8da325ce64862f5ac80000000000000000000000004421de8bfb150486936a4e8da325ce64862f5ac800000000000000000000000000000000000000000000000000003aa41d43570000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,0x1689aee63e65f7d827c41621f9ee17654b0c6891120a3b9f1d4fef5fa3e1044d,2022-03-15 09:34:39.000 UTC,0,true -17199,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec340000000000000000000000000bc9522834584aee4502d999b0f0cb71e1fa5fac0000000000000000000000000bc9522834584aee4502d999b0f0cb71e1fa5fac00000000000000000000000000000000000000000000000000af1b04b999100000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -17200,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec3400000000000000000000000064509cdbda147bd7ccad34ff0c9ac8d59f7cedb900000000000000000000000064509cdbda147bd7ccad34ff0c9ac8d59f7cedb90000000000000000000000000000000000000000000000000033e3f2e5d0c3a800000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -17201,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec34000000000000000000000000471b9a239acbdcfed92b754ca76273e57aae507d000000000000000000000000471b9a239acbdcfed92b754ca76273e57aae507d00000000000000000000000000000000000000000000000004002afa86cbdc4900000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -17202,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec34000000000000000000000000973b78c7d8ab8f92bed18ee594baeea5bdaa4052000000000000000000000000973b78c7d8ab8f92bed18ee594baeea5bdaa40520000000000000000000000000000000000000000000000000000dc190409200000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -17204,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec34000000000000000000000000a0fc3bc1ca1e4346b1c4cb71db3b9e1d9c5454dd000000000000000000000000a0fc3bc1ca1e4346b1c4cb71db3b9e1d9c5454dd000000000000000000000000000000000000000000000000013d0f3b9c4de24900000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -17205,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec340000000000000000000000006c272244c7c0dda6017402d8bc357e5b283930030000000000000000000000006c272244c7c0dda6017402d8bc357e5b283930030000000000000000000000000000000000000000000000000000db302f64100000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -17206,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec34000000000000000000000000214cf6b080aa5c7371eeb0e2a15f28fe25fddaa8000000000000000000000000214cf6b080aa5c7371eeb0e2a15f28fe25fddaa800000000000000000000000000000000000000000000000001e0f90eea632b9300000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -17207,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec34000000000000000000000000382d14d295ecbcb67fd834bc31e894e420529a4a000000000000000000000000382d14d295ecbcb67fd834bc31e894e420529a4a0000000000000000000000000000000000000000000000000000dd01d8ae300000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -17209,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec34000000000000000000000000ef8622b58fb925b3819cadce537b0ffafa0a1a6b000000000000000000000000ef8622b58fb925b3819cadce537b0ffafa0a1a6b000000000000000000000000000000000000000000000000003cb99a17b7f8d200000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -17210,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec34000000000000000000000000f277720138dd910a8f27a5a624f297fec4c1f8c1000000000000000000000000f277720138dd910a8f27a5a624f297fec4c1f8c1000000000000000000000000000000000000000000000000015a105b4412380000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -17211,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec340000000000000000000000003f1e2c281f699cd0773cf4489ea1d569329258da0000000000000000000000003f1e2c281f699cd0773cf4489ea1d569329258da0000000000000000000000000000000000000000000000000000db302f64100000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -17212,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec34000000000000000000000000ae69dac9e28bdf65480e0d88a4c46d1c702fa506000000000000000000000000ae69dac9e28bdf65480e0d88a4c46d1c702fa506000000000000000000000000000000000000000000000000047c3adae4fe8b5d00000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -17214,0xcd9d4988c0ae61887b075ba77f08cbfad2b65068,0x3f87ff1de58128ef8fcb4c807efd776e1ac72e51,0xf4f7b41a000000000000000000000000528869eb2d3b35597a32779cb1b9c2d62cca923d00000000000000000000000000000000000000000000000523fb2972e2fa1566,,,1,true -17216,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec3400000000000000000000000091a7c920007e1db566f88eb8eb99f5dc7ed7223800000000000000000000000091a7c920007e1db566f88eb8eb99f5dc7ed722380000000000000000000000000000000000000000000000000000db302f64100000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -17218,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec34000000000000000000000000be9e50182ea6e23362a003a131a6173e884f259c000000000000000000000000be9e50182ea6e23362a003a131a6173e884f259c0000000000000000000000000000000000000000000000000195c8074677ce2200000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,0x955269866c0ae81bf9f302cf427fc6a7b3cb26b0774499e36d4068662028d8f0,2022-02-02 09:00:29.000 UTC,0,true -17220,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec34000000000000000000000000df7e033a2c8b167f857184971493f70326d200be000000000000000000000000df7e033a2c8b167f857184971493f70326d200be00000000000000000000000000000000000000000000000001cb9e644f8a3dbe00000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,0x0281355da0285f38e8bb99c53ea09c9f5e69605f36a9841274969f67acae9c5e,2022-02-02 09:05:33.000 UTC,0,true -17221,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec3400000000000000000000000068ba19fb87380b86f6bd2462da0fbc83f4b5b1ee00000000000000000000000068ba19fb87380b86f6bd2462da0fbc83f4b5b1ee000000000000000000000000000000000000000000000000017412dec23b2e4c00000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,0xc9de0b497e2955e924e1c613dcb51c0144c609931b8e7a652eb2e2fcb13027a6,2022-02-02 09:16:29.000 UTC,0,true -17222,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec34000000000000000000000000e0ea7fb67036150b7797727235a0e6b2166456f5000000000000000000000000e0ea7fb67036150b7797727235a0e6b2166456f500000000000000000000000000000000000000000000000001da18fad1d259c000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,0x588cd9b975eea69daf76cd6649474fc3abbb4af1c8b596ebffb0e6df8b1af4f9,2022-02-02 09:22:13.000 UTC,0,true -17223,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec34000000000000000000000000dbdc7394909d893eb0c99a0a56d177728314fd9c000000000000000000000000dbdc7394909d893eb0c99a0a56d177728314fd9c00000000000000000000000000000000000000000000000001af101fee19806f00000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,0x5554dbde96339e753baaaae6b071cbbf634281fa5d54a04fca8acb214f88e2fa,2022-02-02 09:26:43.000 UTC,0,true -17224,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec34000000000000000000000000628ec392726fddc854ad574f06d24a772d21fa53000000000000000000000000628ec392726fddc854ad574f06d24a772d21fa5300000000000000000000000000000000000000000000000001fd38a657ce100200000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,0x20b20973112ac567f379abba0bfc85b639c809169012e648b8df2b86160c67fb,2022-02-02 09:30:25.000 UTC,0,true -17225,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec3400000000000000000000000005f601a092974b52853ffbbef763d19186b8e6ad00000000000000000000000005f601a092974b52853ffbbef763d19186b8e6ad0000000000000000000000000000000000000000000000000171224de43c04d600000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,0x3d206fa7971978461111103fae60d00c00d9a10538b8e2c9ac857fff6bb8562f,2022-02-02 09:35:54.000 UTC,0,true -17226,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec34000000000000000000000000f7b2229beee1de8cf84973fd59b641efc9a894c6000000000000000000000000f7b2229beee1de8cf84973fd59b641efc9a894c60000000000000000000000000000000000000000000000000000da475abf000000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -17227,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec3400000000000000000000000086ec96ff8d423910b26dab62dfe30720fc47605f00000000000000000000000086ec96ff8d423910b26dab62dfe30720fc47605f0000000000000000000000000000000000000000000000000161a99fcd89b35800000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,0x632bac6537b7b6a121faf970ef7c17b9c32a855d9816b26f4a9cacf16f1238ed,2022-02-02 09:42:20.000 UTC,0,true -17228,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec34000000000000000000000000b6b624a91d3b98c38ad619e6c3f27d291c617385000000000000000000000000b6b624a91d3b98c38ad619e6c3f27d291c6173850000000000000000000000000000000000000000000000000000db302f64100000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -17230,0xcd9d4988c0ae61887b075ba77f08cbfad2b65068,0x3f87ff1de58128ef8fcb4c807efd776e1ac72e51,0xf4f7b41a0000000000000000000000002fb733c3239a1e807d380fa0845b9101ee54c69300000000000000000000000000000000000000000000004bdef0437ede6cbc80,0x28f4f35f05a365617ee7a35be46994154fe8c92e34479cfd1422c778330ec538,2022-04-02 07:17:52.000 UTC,0,true -17231,0x10e6593cdda8c58a1d0f14c5164b376352a55f2f,0x467194771dae2967aef3ecbedd3bf9a310c76c65,0xa9f9e6750000000000000000000000006b175474e89094c44da98b954eedeac495271d0f000000000000000000000000da10009cbd5d07dd0cecc66161fc93d7c9000da1000000000000000000000000e1da16be636a5775f0c7eac9eab670b6db17b707000000000000000000000000e1da16be636a5775f0c7eac9eab670b6db17b707000000000000000000000000000000000000000000000001c4e1db48bab19bd800000000000000000000000000000000000000000000000000000000000000c00000000000000000000000000000000000000000000000000000000000000000,0x5623442e7c7f03441aacd60ee0e6dab3ccae50db855ae62c150d4fbc022fc4c3,2022-05-28 09:51:44.000 UTC,0,true -17232,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec34000000000000000000000000c1c2d0860a213c630c7e285eb5b8b1ebdfa205b1000000000000000000000000c1c2d0860a213c630c7e285eb5b8b1ebdfa205b100000000000000000000000000000000000000000000000000992e501987f2e800000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,0x784d2629e7bbed5abc12e45ef5ab5a0389c50d40c1c7c98841db07bfed29d910,2021-12-03 12:25:56.000 UTC,0,true -17234,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec3400000000000000000000000061a275fca0242363c658edbdb0527bfc1ee140d100000000000000000000000061a275fca0242363c658edbdb0527bfc1ee140d10000000000000000000000000000000000000000000000000049d8bef8f3f00000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -17235,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec340000000000000000000000004fc7f0fd2a353b7694deb8da43684f3d50c928130000000000000000000000004fc7f0fd2a353b7694deb8da43684f3d50c92813000000000000000000000000000000000000000000000000008ce1f4c272d59500000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -17236,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec34000000000000000000000000df82ee79e40bbe3d088fc8620feedd6793283c8f000000000000000000000000df82ee79e40bbe3d088fc8620feedd6793283c8f00000000000000000000000000000000000000000000000000cbb0bc63e0fb4b00000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -17237,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0xa9f9e675000000000000000000000000514910771af9ca656af840dff83e8264ecf986ca000000000000000000000000350a791bfc2c21f9ed5d10980dad2e2638ffa7f600000000000000000000000046d54bf2c77d02f1b19b54e6fac2bcd5a05a980200000000000000000000000046d54bf2c77d02f1b19b54e6fac2bcd5a05a98020000000000000000000000000000000000000000000000004442dd683b34ee7500000000000000000000000000000000000000000000000000000000000000c00000000000000000000000000000000000000000000000000000000000000000,,,1,true -17239,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec34000000000000000000000000e4c86cf4302deb8c4757a6a46359fee49438dbc2000000000000000000000000e4c86cf4302deb8c4757a6a46359fee49438dbc2000000000000000000000000000000000000000000000000013f3cee05096dfe00000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -17242,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec34000000000000000000000000e4493623399fbf0a622eb87f52210c20f13054c4000000000000000000000000e4493623399fbf0a622eb87f52210c20f13054c40000000000000000000000000000000000000000000000000de0b6b3a764000000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -17243,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec34000000000000000000000000dd31937ededa450105a75e28b0a3246b22ebf030000000000000000000000000dd31937ededa450105a75e28b0a3246b22ebf030000000000000000000000000000000000000000000000000009fdf42f6e4800000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -17244,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec3400000000000000000000000006515ac8eab778dd6a533e60e4cda41e0a8e4fcf00000000000000000000000006515ac8eab778dd6a533e60e4cda41e0a8e4fcf0000000000000000000000000000000000000000000000000e84ab227b66cc5100000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,0x4f472721804924e7afd67d66c4ae13f2f2ee3c76ed95191785ac817703ea7e5d,2021-11-25 17:54:52.000 UTC,0,true -17246,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0xa9f9e675000000000000000000000000dac17f958d2ee523a2206206994597c13d831ec700000000000000000000000094b008aa00579c1307b0ef2c499ad98a8ce58e580000000000000000000000001296d4a9fa924a289c270c4fa09e5332484c489c0000000000000000000000001296d4a9fa924a289c270c4fa09e5332484c489c000000000000000000000000000000000000000000000000000000001442189100000000000000000000000000000000000000000000000000000000000000c00000000000000000000000000000000000000000000000000000000000000000,0xa3dc89e032969457169147ece203c0fd34bd2c98cb5ce98fb23fde186356a947,2021-11-26 14:54:54.000 UTC,0,true -17247,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec34000000000000000000000000f4039e492374dd1008322dd7536fbe7f43cfd33e000000000000000000000000f4039e492374dd1008322dd7536fbe7f43cfd33e0000000000000000000000000000000000000000000000003ada84007264841300000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -17249,0xcd9d4988c0ae61887b075ba77f08cbfad2b65068,0x3f87ff1de58128ef8fcb4c807efd776e1ac72e51,0xf4f7b41a0000000000000000000000005f56e5ade609d0869351bd43b768568bc690c6f900000000000000000000000000000000000000000000010193e476a20d4b0000,0xe9a507eb120ba34c6c0ecf1324e2feb63786fecf8fc0236c1a4da0b34326ed01,2021-11-24 07:13:25.000 UTC,0,true -17252,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec3400000000000000000000000001744e87f864eed8ff1e87ff83cc203a7dc44bd100000000000000000000000001744e87f864eed8ff1e87ff83cc203a7dc44bd1000000000000000000000000000000000000000000000000002fde6cbdd649f500000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -17253,0xcd9d4988c0ae61887b075ba77f08cbfad2b65068,0x3f87ff1de58128ef8fcb4c807efd776e1ac72e51,0xf4f7b41a00000000000000000000000070513a081114ed019361d7d6f0e575206da938100000000000000000000000000000000000000000000000000f65120188a664cb,,,1,true -17254,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec34000000000000000000000000482d685a17c90d7bb3e0c753f72c870f76aaa850000000000000000000000000482d685a17c90d7bb3e0c753f72c870f76aaa8500000000000000000000000000000000000000000000000126342bb15d57e905100000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,0xbba597349f6230600b0f587b505de6c0e5c721c996fc545222aafc2cb116de19,2021-12-02 12:21:01.000 UTC,0,true -17255,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec34000000000000000000000000917e4e563701e9d94b8d00775dcbd4ab86efd479000000000000000000000000917e4e563701e9d94b8d00775dcbd4ab86efd47900000000000000000000000000000000000000000000000000131bfd304bb72b00000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -17257,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec340000000000000000000000003210cc31ba9c6788eebddc3f5de02b9cedde2c6f0000000000000000000000003210cc31ba9c6788eebddc3f5de02b9cedde2c6f00000000000000000000000000000000000000000000000006d33393818bde9900000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -17258,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec340000000000000000000000000522afb5d3bae59b08fa6114dcc043a88aff12fe0000000000000000000000000522afb5d3bae59b08fa6114dcc043a88aff12fe00000000000000000000000000000000000000000000000000045c7a1ea8ff4000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -17259,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0xa9f9e675000000000000000000000000a0b86991c6218b36c1d19d4a2e9eb0ce3606eb480000000000000000000000007f5c764cbc14f9669b88837ca1490cca17c31607000000000000000000000000acd003ed939fb8f80b2f4fe33769d13bc04e5847000000000000000000000000acd003ed939fb8f80b2f4fe33769d13bc04e58470000000000000000000000000000000000000000000000000000000008c45ef400000000000000000000000000000000000000000000000000000000000000c00000000000000000000000000000000000000000000000000000000000000000,,,1,true -17260,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec34000000000000000000000000acd003ed939fb8f80b2f4fe33769d13bc04e5847000000000000000000000000acd003ed939fb8f80b2f4fe33769d13bc04e5847000000000000000000000000000000000000000000000000005f4f2bcc07ed6f00000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -17262,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec34000000000000000000000000c15175feef26f9d8e9ea44e1dded1c493a7948d7000000000000000000000000c15175feef26f9d8e9ea44e1dded1c493a7948d70000000000000000000000000000000000000000000000000139f8c47bd7114e00000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -17263,0xcd9d4988c0ae61887b075ba77f08cbfad2b65068,0x3f87ff1de58128ef8fcb4c807efd776e1ac72e51,0xf4f7b41a0000000000000000000000007d279221e3c6b88f550f0056a4a8506dd1999841000000000000000000000000000000000000000000000000120a871cc0020000,,,1,true -17264,0xcd9d4988c0ae61887b075ba77f08cbfad2b65068,0x3f87ff1de58128ef8fcb4c807efd776e1ac72e51,0xf4f7b41a00000000000000000000000038619ab48fa7be0550646024513b198e00349fb3000000000000000000000000000000000000000000000007551800ed3c149eb8,0x6241acf9fa459615207017ddef3bc306a831c9aac39e65ba51a8abc954f9169a,2022-04-14 15:23:50.000 UTC,0,true -17265,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0xa9f9e675000000000000000000000000b6ed7644c69416d67b522e20bc294a9a9b405b31000000000000000000000000e0bb0d3de8c10976511e5030ca403dbf4c25165b000000000000000000000000034f5590a08c2ca060494ef0b424b5620cc5ddce000000000000000000000000034f5590a08c2ca060494ef0b424b5620cc5ddce000000000000000000000000000000000000000000000000000000000bebc20000000000000000000000000000000000000000000000000000000000000000c00000000000000000000000000000000000000000000000000000000000000000,,,1,true -17269,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec34000000000000000000000000251d14ea6929fc5163db5de098f82bed3710bb32000000000000000000000000251d14ea6929fc5163db5de098f82bed3710bb320000000000000000000000000000000000000000000000000038366020c30c7900000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -17270,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec340000000000000000000000000172d9a724ce598bdfcaf5617d920cae6969e1070000000000000000000000000172d9a724ce598bdfcaf5617d920cae6969e1070000000000000000000000000000000000000000000000000dd0fbf75d11c2b200000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -17271,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec340000000000000000000000008013ccf525b4b9cabf6f19846d409c9d8bc820b50000000000000000000000008013ccf525b4b9cabf6f19846d409c9d8bc820b500000000000000000000000000000000000000000000000000a43ba9fb96730100000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -17272,0xcd9d4988c0ae61887b075ba77f08cbfad2b65068,0x3f87ff1de58128ef8fcb4c807efd776e1ac72e51,0xf4f7b41a0000000000000000000000000545a605a6b0c42bb5bd01f918e17d7347095acc0000000000000000000000000000000000000000000000000dacd0ae5481d68f,,,1,true -17277,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec34000000000000000000000000d106794a34e67744a71cf9ecd1e7ec2089c557db000000000000000000000000d106794a34e67744a71cf9ecd1e7ec2089c557db000000000000000000000000000000000000000000000000004b0041de31fec000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -17278,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec340000000000000000000000002f833b4a48395ce96c6fa26ee834fef6e5a421270000000000000000000000002f833b4a48395ce96c6fa26ee834fef6e5a421270000000000000000000000000000000000000000000000000000dc190409200000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -17279,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec34000000000000000000000000b7398a7aecac2c18e2dd25f38666900be73c09eb000000000000000000000000b7398a7aecac2c18e2dd25f38666900be73c09eb0000000000000000000000000000000000000000000000000000da475abf000000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -17280,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec34000000000000000000000000240f6e31e1f4c7afd30000d779a3e64bf183c19a000000000000000000000000240f6e31e1f4c7afd30000d779a3e64bf183c19a00000000000000000000000000000000000000000000000001876cc9adc581b000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -17281,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec340000000000000000000000007e73fa7e1ca276ded206fcb1e4ca7d500e426dde0000000000000000000000007e73fa7e1ca276ded206fcb1e4ca7d500e426dde0000000000000000000000000000000000000000000000000000da475abf000000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -17282,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec34000000000000000000000000909402b195b28065ff1ae4d44214eb9a84934c5c000000000000000000000000909402b195b28065ff1ae4d44214eb9a84934c5c0000000000000000000000000000000000000000000000000000da475abf000000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -17283,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec34000000000000000000000000258aa64c04c29835115ef539263b44d407d1865f000000000000000000000000258aa64c04c29835115ef539263b44d407d1865f000000000000000000000000000000000000000000000000019f0cb4d7b3c93200000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,0xcbd1aa34320cda82a8b4702a7920826e91115bb75d4cfbc2c4accda707774707,2022-08-14 19:02:55.000 UTC,0,true -17284,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec34000000000000000000000000724a6685ce532eaa6d7e50fc190121ba0e125fdb000000000000000000000000724a6685ce532eaa6d7e50fc190121ba0e125fdb0000000000000000000000000000000000000000000000000000da475abf000000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -17285,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec3400000000000000000000000052981b61cec2ec625d543a917c06b26c2b2a647600000000000000000000000052981b61cec2ec625d543a917c06b26c2b2a64760000000000000000000000000000000000000000000000000000da475abf000000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -17286,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec340000000000000000000000001d7729531091e66190f59690ea3aa661dbd0e1ba0000000000000000000000001d7729531091e66190f59690ea3aa661dbd0e1ba0000000000000000000000000000000000000000000000000000da475abf000000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -17288,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec340000000000000000000000009239e943376c9a700b8c3232d1754fd88cdd20870000000000000000000000009239e943376c9a700b8c3232d1754fd88cdd20870000000000000000000000000000000000000000000000000000da475abf000000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -17289,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec34000000000000000000000000666cdb303b6ce4c27995570e06273a66d8c4bb63000000000000000000000000666cdb303b6ce4c27995570e06273a66d8c4bb630000000000000000000000000000000000000000000000000000da475abf000000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -17290,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec3400000000000000000000000039652d24da8893e7d3316046f531649dc0764f9a00000000000000000000000039652d24da8893e7d3316046f531649dc0764f9a0000000000000000000000000000000000000000000000000000da475abf000000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -17291,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec340000000000000000000000000a251df99a88a20a93876205fb7f5faf2e85a4810000000000000000000000000a251df99a88a20a93876205fb7f5faf2e85a481000000000000000000000000000000000000000000000000008b0d39f93e954600000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -17292,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec340000000000000000000000002173d6e48199512a24ef95a9293f1ed5d46f5f2e0000000000000000000000002173d6e48199512a24ef95a9293f1ed5d46f5f2e0000000000000000000000000000000000000000000000000000da475abf000000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -17293,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec3400000000000000000000000060ca0cff985910b8f2d582f766ffa920b50ecc8f00000000000000000000000060ca0cff985910b8f2d582f766ffa920b50ecc8f0000000000000000000000000000000000000000000000000000dc190409200000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -17294,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec34000000000000000000000000f3fe5596e7d3a1845ea032ae9062527a91e56fcd000000000000000000000000f3fe5596e7d3a1845ea032ae9062527a91e56fcd0000000000000000000000000000000000000000000000000000ded381f8500000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -17296,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec3400000000000000000000000049da81cea71f4290f637f1a62be5876d25c4ca6000000000000000000000000049da81cea71f4290f637f1a62be5876d25c4ca600000000000000000000000000000000000000000000000000000ded381f8500000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -17298,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec340000000000000000000000003a5269423a6cb778237a276d7209f746f9664f060000000000000000000000003a5269423a6cb778237a276d7209f746f9664f060000000000000000000000000000000000000000000000000000e35fa931a00000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -17299,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec340000000000000000000000007a70973471f8a71ffefe0fda91e905fc730926a60000000000000000000000007a70973471f8a71ffefe0fda91e905fc730926a60000000000000000000000000000000000000000000000000000e35fa931a00000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -17300,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec34000000000000000000000000698d4cf17ee2bbd49afd287328b74e36d5666654000000000000000000000000698d4cf17ee2bbd49afd287328b74e36d56666540000000000000000000000000000000000000000000000000000e531527bc00000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -17301,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec34000000000000000000000000e9991995a403b33f9059bacb85666d0e43afb28c000000000000000000000000e9991995a403b33f9059bacb85666d0e43afb28c0000000000000000000000000000000000000000000000000000e61a2720d00000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -17302,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec340000000000000000000000006ac45e7f57912beae2535fb6d941eb64c6feb13f0000000000000000000000006ac45e7f57912beae2535fb6d941eb64c6feb13f0000000000000000000000000000000000000000000000000000e61a2720d00000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -17304,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec34000000000000000000000000c0d561bcb3bb59fda309c26b037079f2ecbb2cf0000000000000000000000000c0d561bcb3bb59fda309c26b037079f2ecbb2cf00000000000000000000000000000000000000000000000000000e702fbc5e00000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -17305,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec34000000000000000000000000084437d9084fbf39acae49ca7faff9946131b433000000000000000000000000084437d9084fbf39acae49ca7faff9946131b4330000000000000000000000000000000000000000000000000000e702fbc5e00000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -17306,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec3400000000000000000000000031ab4b11c342d2dde0d087fb2d7d8d7b12275fe500000000000000000000000031ab4b11c342d2dde0d087fb2d7d8d7b12275fe50000000000000000000000000000000000000000000000000000e61a2720d00000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -17308,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec340000000000000000000000004fa4d4524502998372716acda9e639af84d3e0310000000000000000000000004fa4d4524502998372716acda9e639af84d3e0310000000000000000000000000000000000000000000000000000e61a2720d00000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -17309,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec3400000000000000000000000033668616f8a8ce314afbe27b250be6ce45d361cb00000000000000000000000033668616f8a8ce314afbe27b250be6ce45d361cb0000000000000000000000000000000000000000000000000000e61a2720d00000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -17310,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec340000000000000000000000001177e92fc87372f1df6f478d538ccf19436df2430000000000000000000000001177e92fc87372f1df6f478d538ccf19436df2430000000000000000000000000000000000000000000000000000e61a2720d00000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -17311,0xcd9d4988c0ae61887b075ba77f08cbfad2b65068,0x3f87ff1de58128ef8fcb4c807efd776e1ac72e51,0xf4f7b41a00000000000000000000000084356ffcaeb364f4e5bcbe71862a67c97842a16b0000000000000000000000000000000000000000000000000a55b1b272983993,,,1,true -17312,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec340000000000000000000000007f6dfddb6a056fd03951d17ef45dd5e1612093e10000000000000000000000007f6dfddb6a056fd03951d17ef45dd5e1612093e1000000000000000000000000000000000000000000000000011c37937e08000000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -17313,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec34000000000000000000000000ec17a12cad66bd5758d4887008440435a5ac4062000000000000000000000000ec17a12cad66bd5758d4887008440435a5ac4062000000000000000000000000000000000000000000000000001081872a8fb67f00000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -17314,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0xa9f9e6750000000000000000000000001f9840a85d5af5bf1d1762f925bdaddc4201f9840000000000000000000000006fd9d7ad17242c41f7131d257212c54a0e8166910000000000000000000000007ecd9a6364fe493f5ea902851243f24622a3078b0000000000000000000000007ecd9a6364fe493f5ea902851243f24622a3078b00000000000000000000000000000000000000000000000034695e07c333932f00000000000000000000000000000000000000000000000000000000000000c00000000000000000000000000000000000000000000000000000000000000000,,,1,true -17315,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec340000000000000000000000007ecd9a6364fe493f5ea902851243f24622a3078b0000000000000000000000007ecd9a6364fe493f5ea902851243f24622a3078b0000000000000000000000000000000000000000000000000017c4d83647cbc000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -17316,0x10e6593cdda8c58a1d0f14c5164b376352a55f2f,0x467194771dae2967aef3ecbedd3bf9a310c76c65,0xa9f9e6750000000000000000000000006b175474e89094c44da98b954eedeac495271d0f000000000000000000000000da10009cbd5d07dd0cecc66161fc93d7c9000da1000000000000000000000000b11c46a0601b0329d2e069900a675da75d1df6dd000000000000000000000000b11c46a0601b0329d2e069900a675da75d1df6dd00000000000000000000000000000000000000000000000897bf32e4714b14e600000000000000000000000000000000000000000000000000000000000000c00000000000000000000000000000000000000000000000000000000000000000,,,1,true -17317,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec34000000000000000000000000b11c46a0601b0329d2e069900a675da75d1df6dd000000000000000000000000b11c46a0601b0329d2e069900a675da75d1df6dd00000000000000000000000000000000000000000000000000a5c0111d5efe4000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -17318,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec34000000000000000000000000882ce9e1307cd42e3daf573bdb76055cc89a4df8000000000000000000000000882ce9e1307cd42e3daf573bdb76055cc89a4df800000000000000000000000000000000000000000000000004059597f8e7969500000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -17321,0xcd9d4988c0ae61887b075ba77f08cbfad2b65068,0x3f87ff1de58128ef8fcb4c807efd776e1ac72e51,0xf4f7b41a0000000000000000000000006d49e448194f5425ae1120e5fac54bb0ec67631a0000000000000000000000000000000000000000000000021d3bd55e803c0000,,,1,true -17323,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec340000000000000000000000005533f954d78aaf3601b8e0aa1f3ce4140bde23d70000000000000000000000005533f954d78aaf3601b8e0aa1f3ce4140bde23d700000000000000000000000000000000000000000000000001bc16d674ec800000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -17324,0xcd9d4988c0ae61887b075ba77f08cbfad2b65068,0x3f87ff1de58128ef8fcb4c807efd776e1ac72e51,0xf4f7b41a0000000000000000000000004682f0ccc7bd7cd668bc319fce8497a6b35277e300000000000000000000000000000000000000000000002d14378f3944f4bef7,0x4c169aceba4439b62cce13af459090f859554accb539d5d80882d63d14de8648,2021-12-01 17:04:39.000 UTC,0,true -17328,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec3400000000000000000000000070f52b922e9eabf97c8d39828a045f8f81eb467b00000000000000000000000070f52b922e9eabf97c8d39828a045f8f81eb467b000000000000000000000000000000000000000000000000006a94d74f43000000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -17329,0xcd9d4988c0ae61887b075ba77f08cbfad2b65068,0x3f87ff1de58128ef8fcb4c807efd776e1ac72e51,0xf4f7b41a0000000000000000000000005faa51f65e1dc92ab7c18faadb1435f90ac5fa9c00000000000000000000000000000000000000000000000b02acf2e392709e8e,0x9f9888a69077b73863794f7773d0689ef61ab7eebbca5323853c0a618eb08a1f,2021-11-28 12:10:47.000 UTC,0,true -17331,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec3400000000000000000000000051679136e1a3407912f8fa131bc5f611c52d9fee00000000000000000000000051679136e1a3407912f8fa131bc5f611c52d9fee00000000000000000000000000000000000000000000000001425dbf8daff34200000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -17332,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec34000000000000000000000000308a2a13f0cfe9d6f17d3b15da7278b70b85523c000000000000000000000000308a2a13f0cfe9d6f17d3b15da7278b70b85523c000000000000000000000000000000000000000000000000000d1e38e721ea8000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -17333,0xcd9d4988c0ae61887b075ba77f08cbfad2b65068,0x3f87ff1de58128ef8fcb4c807efd776e1ac72e51,0xf4f7b41a0000000000000000000000001a91c0df156a5f38aec0813d055aa0184fc478260000000000000000000000000000000000000000000000005d7aaebc1a055d58,,,1,true -17334,0xcd9d4988c0ae61887b075ba77f08cbfad2b65068,0x3f87ff1de58128ef8fcb4c807efd776e1ac72e51,0xf4f7b41a0000000000000000000000001a91c0df156a5f38aec0813d055aa0184fc478260000000000000000000000000000000000000000000000000001ae50b2a26b62,,,1,true -17337,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec340000000000000000000000009a72c4275919b54401c9665ae6e4ea070c50c9230000000000000000000000009a72c4275919b54401c9665ae6e4ea070c50c9230000000000000000000000000000000000000000000000000137e11559abad0000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -17338,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec34000000000000000000000000675d5f9f18afd31aed61b28cf69f55ab12030b05000000000000000000000000675d5f9f18afd31aed61b28cf69f55ab12030b0500000000000000000000000000000000000000000000000001d7cbf31616e64a00000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -17340,0xcd9d4988c0ae61887b075ba77f08cbfad2b65068,0x3f87ff1de58128ef8fcb4c807efd776e1ac72e51,0xf4f7b41a0000000000000000000000009c07990bc8e0ae119edb60ae751c5b1a21ab271600000000000000000000000000000000000000000000000eef75e630a873f30b,0x1c2eedc66fcc722cd6cc72ec097b21ebe0382115b164a502520cf1f020703967,2021-11-23 21:51:31.000 UTC,0,true -17341,0xcd9d4988c0ae61887b075ba77f08cbfad2b65068,0x3f87ff1de58128ef8fcb4c807efd776e1ac72e51,0xf4f7b41a000000000000000000000000baa882d68fc5325fc3899de264f24b5981523a5c00000000000000000000000000000000000000000000001236efcbcbb3400000,0x1f23044a56e431b0f1a8ebda55ebb2d09410ae6703df3fe051e7c63e2742ff2b,2021-12-15 04:08:25.000 UTC,0,true -17344,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec34000000000000000000000000471bd4de7f8f26558cfe3256c8cf8e239abaede6000000000000000000000000471bd4de7f8f26558cfe3256c8cf8e239abaede60000000000000000000000000000000000000000000000000000e35fa931a00000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -17345,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec340000000000000000000000002fb17d612f277ea6689f2500ff9534c4784cea020000000000000000000000002fb17d612f277ea6689f2500ff9534c4784cea020000000000000000000000000000000000000000000000000000e61a2720d00000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -17346,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec34000000000000000000000000dc7bf974d38e52a66d5259feaa9552432f7dc0ca000000000000000000000000dc7bf974d38e52a66d5259feaa9552432f7dc0ca00000000000000000000000000000000000000000000000000cbe4d1ac5b4ec800000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -17347,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec340000000000000000000000009aedae918f56d8df08f2a5ea473d2aaff7c4ddc90000000000000000000000009aedae918f56d8df08f2a5ea473d2aaff7c4ddc90000000000000000000000000000000000000000000000000000e61a2720d00000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -17348,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec3400000000000000000000000059d69238caad27f2353075065bbd4a3f91dc005100000000000000000000000059d69238caad27f2353075065bbd4a3f91dc00510000000000000000000000000000000000000000000000000000e531527bc00000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -17349,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec34000000000000000000000000e137d025bbf8284cdc906bfe8a59bc26e7a6cf5d000000000000000000000000e137d025bbf8284cdc906bfe8a59bc26e7a6cf5d0000000000000000000000000000000000000000000000000000e61a2720d00000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -17350,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec3400000000000000000000000065e2d45920eb747a4895f3040aaa6277372c0c1800000000000000000000000065e2d45920eb747a4895f3040aaa6277372c0c180000000000000000000000000000000000000000000000000000e531527bc00000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -17351,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec3400000000000000000000000067b6a6cd8f7815369abe49f8fb397a6349ba524400000000000000000000000067b6a6cd8f7815369abe49f8fb397a6349ba52440000000000000000000000000000000000000000000000000000e531527bc00000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -17352,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec34000000000000000000000000d42f9c063ca6d8d21b78a12ae3ffb62d3b64f949000000000000000000000000d42f9c063ca6d8d21b78a12ae3ffb62d3b64f9490000000000000000000000000000000000000000000000000000e531527bc00000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -17353,0xcd9d4988c0ae61887b075ba77f08cbfad2b65068,0x3f87ff1de58128ef8fcb4c807efd776e1ac72e51,0xf4f7b41a00000000000000000000000013a32aa268ca78d82a7c3ce5e59d78dbe72a5a17000000000000000000000000000000000000000000000066f8f181aef1472327,0xf2ca490457e211260dd21a54817fa99e1eabfe3dc11bfca153a5e7fdcd5a32b3,2021-12-05 03:37:46.000 UTC,0,true -17354,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec34000000000000000000000000ddabad84d46a65e58be5f29a16225d6d8e1fc97f000000000000000000000000ddabad84d46a65e58be5f29a16225d6d8e1fc97f0000000000000000000000000000000000000000000000000000e35fa931a00000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -17355,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec340000000000000000000000001fb90ec242c3da509cacb8a0b6415903f53f5dd60000000000000000000000001fb90ec242c3da509cacb8a0b6415903f53f5dd60000000000000000000000000000000000000000000000000000e18dffe7800000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -17359,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec340000000000000000000000005bce5cfdbcff2d53fa30d654813c09f0ac23b6dd0000000000000000000000005bce5cfdbcff2d53fa30d654813c09f0ac23b6dd0000000000000000000000000000000000000000000000000000e0a52b42700000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -17360,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec340000000000000000000000009ea9569ebfe156e1548c6bc6795fcfc6b63b18410000000000000000000000009ea9569ebfe156e1548c6bc6795fcfc6b63b18410000000000000000000000000000000000000000000000000000e0a52b42700000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -17361,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec34000000000000000000000000640d148193fbd62e0057cd39c7400ef1816371d2000000000000000000000000640d148193fbd62e0057cd39c7400ef1816371d20000000000000000000000000000000000000000000000000000dfbc569d600000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -17362,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec34000000000000000000000000367694c570581a87dc14fff5b1a032955678b7dc000000000000000000000000367694c570581a87dc14fff5b1a032955678b7dc0000000000000000000000000000000000000000000000000000e276d48c900000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -17363,0xcd9d4988c0ae61887b075ba77f08cbfad2b65068,0x3f87ff1de58128ef8fcb4c807efd776e1ac72e51,0xf4f7b41a000000000000000000000000e6980a436e36c3543872f3e496c2466a01f14c850000000000000000000000000000000000000000000000012e7de6058bcd726e,,,1,true -17364,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec3400000000000000000000000090eb33aedd32d1610e8d7defe1cc7230faa8b1e800000000000000000000000090eb33aedd32d1610e8d7defe1cc7230faa8b1e80000000000000000000000000000000000000000000000000000e35fa931a00000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -17365,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec340000000000000000000000008c74abd2cf12ed34f5b88eda5f35558d899465670000000000000000000000008c74abd2cf12ed34f5b88eda5f35558d899465670000000000000000000000000000000000000000000000000000e35fa931a00000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -17367,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec340000000000000000000000002b80058c3100c0d2a2ed35295f139ea75a58faf90000000000000000000000002b80058c3100c0d2a2ed35295f139ea75a58faf9000000000000000000000000000000000000000000000000003e55adb7164f9800000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,0x1b9257c5d4f5ec727461491ed4d391800c63c68004b8ef84c7d8ea2b0705df3a,2022-06-12 12:42:46.000 UTC,0,true -17368,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec34000000000000000000000000e27993c8571f321b94aed638c91be186178eb826000000000000000000000000e27993c8571f321b94aed638c91be186178eb8260000000000000000000000000000000000000000000000000000e276d48c900000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -17369,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec3400000000000000000000000001852fc454ee9c176e847c77ba63841ef122ff9300000000000000000000000001852fc454ee9c176e847c77ba63841ef122ff930000000000000000000000000000000000000000000000000000e18dffe7800000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -17370,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec34000000000000000000000000f3ac722d2302758bd5f331324e4b9d8cd4fb33d2000000000000000000000000f3ac722d2302758bd5f331324e4b9d8cd4fb33d20000000000000000000000000000000000000000000000000000e35fa931a00000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -17371,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec34000000000000000000000000656e9642ae9e3a9edbe4d53927aa58c68428094b000000000000000000000000656e9642ae9e3a9edbe4d53927aa58c68428094b0000000000000000000000000000000000000000000000000000e18dffe7800000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -17372,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec34000000000000000000000000f065362c176bac34aa0ff34aec08928c28175ee5000000000000000000000000f065362c176bac34aa0ff34aec08928c28175ee5000000000000000000000000000000000000000000000000008e1bc9bf04000000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -17374,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec34000000000000000000000000d657c543723c8563daba902ed078bc28ea9e5597000000000000000000000000d657c543723c8563daba902ed078bc28ea9e559700000000000000000000000000000000000000000000000001456dab70e7390000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -17377,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec3400000000000000000000000053f66041bfe3b65ce1dbd03694c2be84cba78b2100000000000000000000000053f66041bfe3b65ce1dbd03694c2be84cba78b2100000000000000000000000000000000000000000000000000abc238bdbedd6c00000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -17379,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec34000000000000000000000000d07c8b9eaf17b6d31abd4125e28c7c6a5e1e9870000000000000000000000000d07c8b9eaf17b6d31abd4125e28c7c6a5e1e98700000000000000000000000000000000000000000000000000b8a248c2b320e8000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -17380,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec34000000000000000000000000f15d4b322a88213674431814fe249d561abf465b000000000000000000000000f15d4b322a88213674431814fe249d561abf465b000000000000000000000000000000000000000000000000015181ff25a9800000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -17381,0xcd9d4988c0ae61887b075ba77f08cbfad2b65068,0x3f87ff1de58128ef8fcb4c807efd776e1ac72e51,0xf4f7b41a000000000000000000000000d7be06fed116c75c4b0e2d766f5b69ee741e15e200000000000000000000000000000000000000000000000029a2241af62c0000,,,1,true -17383,0xcd9d4988c0ae61887b075ba77f08cbfad2b65068,0x3f87ff1de58128ef8fcb4c807efd776e1ac72e51,0xf4f7b41a00000000000000000000000079a98a9f41051e119cad1b9ffefe523cd0be65f000000000000000000000000000000000000000000000004507116808705714f8,0x60eeb170ba2affe996b6933aa2d818c9ec291fad97d4fc92634be852f2ffc126,2022-02-03 06:22:16.000 UTC,0,true -17384,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec340000000000000000000000004b4781df451642f490de17b0f58354e426f632230000000000000000000000004b4781df451642f490de17b0f58354e426f632230000000000000000000000000000000000000000000000000138763e61a5560000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -17386,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec340000000000000000000000006664bbd4748c7678766caf2d591fdb6ee2cb15470000000000000000000000006664bbd4748c7678766caf2d591fdb6ee2cb1547000000000000000000000000000000000000000000000000014f24787b57766700000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -17388,0xcd9d4988c0ae61887b075ba77f08cbfad2b65068,0x3f87ff1de58128ef8fcb4c807efd776e1ac72e51,0xf4f7b41a0000000000000000000000009251d5835f4a68d1e3603735b43409941c24434300000000000000000000000000000000000000000000001f9127525004faafba,,,1,true -17389,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec34000000000000000000000000873676c1b5ef9b387b3cc99dabe73c804f90f972000000000000000000000000873676c1b5ef9b387b3cc99dabe73c804f90f972000000000000000000000000000000000000000000000000007f16a28481e9fb00000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -17390,0xcd9d4988c0ae61887b075ba77f08cbfad2b65068,0x3f87ff1de58128ef8fcb4c807efd776e1ac72e51,0xf4f7b41a0000000000000000000000009c07990bc8e0ae119edb60ae751c5b1a21ab271600000000000000000000000000000000000000000000002244482d97e8bf33f1,0xe7569ef3a4dfd363b6a57514f448eb092d5bcaa673b961ba8b8b83e2f52f7be1,2021-11-23 21:53:51.000 UTC,0,true -17391,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec340000000000000000000000006ff85c6208ee8a3bc484f73a9b8f2d55b9b01c000000000000000000000000006ff85c6208ee8a3bc484f73a9b8f2d55b9b01c0000000000000000000000000000000000000000000000000001b335624357578000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -17393,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec34000000000000000000000000eecf245ae681a55ba5dcbf2b4ba8b08cb4a92451000000000000000000000000eecf245ae681a55ba5dcbf2b4ba8b08cb4a924510000000000000000000000000000000000000000000000000000dc190409200000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -17394,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec3400000000000000000000000044e02bed8aa1c18fee0283ca262a05df7b1cbc4100000000000000000000000044e02bed8aa1c18fee0283ca262a05df7b1cbc410000000000000000000000000000000000000000000000000000da475abf000000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -17395,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec3400000000000000000000000036cdf46b4fd4381f5d79e009f01400b92b8ce6d400000000000000000000000036cdf46b4fd4381f5d79e009f01400b92b8ce6d40000000000000000000000000000000000000000000000000000da475abf000000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -17396,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec340000000000000000000000003c4066642fe89232369d0adb6b6e125ee29197cd0000000000000000000000003c4066642fe89232369d0adb6b6e125ee29197cd0000000000000000000000000000000000000000000000000000da475abf000000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -17398,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec3400000000000000000000000028180c4b1852333a258ce261b479fb99e1d5d72d00000000000000000000000028180c4b1852333a258ce261b479fb99e1d5d72d0000000000000000000000000000000000000000000000000000da475abf000000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -17399,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec340000000000000000000000003e3dea41bb540288ffd6ae03c4c849c24dc58a6e0000000000000000000000003e3dea41bb540288ffd6ae03c4c849c24dc58a6e0000000000000000000000000000000000000000000000000000da475abf000000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -17400,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec340000000000000000000000008b97baab653bd6424d7f9f1826476115c24da4220000000000000000000000008b97baab653bd6424d7f9f1826476115c24da4220000000000000000000000000000000000000000000000000000d875b174e00000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -17403,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec34000000000000000000000000290bd8f5e770d500763004cef3f09a245cc64733000000000000000000000000290bd8f5e770d500763004cef3f09a245cc647330000000000000000000000000000000000000000000000000000da475abf000000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -17404,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec34000000000000000000000000ec5d524582b8d3f921631ec233262edcbbed008f000000000000000000000000ec5d524582b8d3f921631ec233262edcbbed008f0000000000000000000000000000000000000000000000000000d875b174e00000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -17405,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec34000000000000000000000000b633ea40f49b4bf8e00b938bbe48d1438630e6ac000000000000000000000000b633ea40f49b4bf8e00b938bbe48d1438630e6ac0000000000000000000000000000000000000000000000000000d875b174e00000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -17406,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec34000000000000000000000000de3521ed8529fbcf3c3e3de1fde0dc60afb51239000000000000000000000000de3521ed8529fbcf3c3e3de1fde0dc60afb512390000000000000000000000000000000000000000000000000000d875b174e00000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -17407,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec340000000000000000000000005d6dd6b50585e107167285851efa5cfa0cac54f50000000000000000000000005d6dd6b50585e107167285851efa5cfa0cac54f50000000000000000000000000000000000000000000000000000d78cdccfd00000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -17408,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec34000000000000000000000000d438da20a82a9b131a2b53880a30214f353a32a5000000000000000000000000d438da20a82a9b131a2b53880a30214f353a32a50000000000000000000000000000000000000000000000000000db302f64100000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -17409,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec340000000000000000000000003328df0d9924308e257cdd19e40df4bcae8e81190000000000000000000000003328df0d9924308e257cdd19e40df4bcae8e81190000000000000000000000000000000000000000000000000000ded381f8500000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -17411,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec340000000000000000000000006e8a0f43b7eec5c77a9d4aac28570b0a0b5b19670000000000000000000000006e8a0f43b7eec5c77a9d4aac28570b0a0b5b19670000000000000000000000000000000000000000000000000000d875b174e00000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -17412,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec340000000000000000000000001a28d5b9e40762bde62b39ed3227a0dbb42417110000000000000000000000001a28d5b9e40762bde62b39ed3227a0dbb42417110000000000000000000000000000000000000000000000000000d5bb3385b00000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -17414,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec34000000000000000000000000c7b9b1a605bdec44664e61603eb7e061ab94864a000000000000000000000000c7b9b1a605bdec44664e61603eb7e061ab94864a000000000000000000000000000000000000000000000000057661692ea0016700000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,0x1613f3f53325f08439dc254dcdac99d9319633c13c10e3edb190b5c69ddc369c,2022-06-01 08:36:32.000 UTC,0,true -17415,0x10e6593cdda8c58a1d0f14c5164b376352a55f2f,0x467194771dae2967aef3ecbedd3bf9a310c76c65,0xa9f9e6750000000000000000000000006b175474e89094c44da98b954eedeac495271d0f000000000000000000000000da10009cbd5d07dd0cecc66161fc93d7c9000da1000000000000000000000000c625e0541656cbdde921cc6179cb920633f5408c000000000000000000000000c625e0541656cbdde921cc6179cb920633f5408c00000000000000000000000000000000000000000000001418216a02f7f181ef00000000000000000000000000000000000000000000000000000000000000c00000000000000000000000000000000000000000000000000000000000000000,0xe6e33def00c5a0630b300f51090912049f46fa08cb8430162d543c08d8518c9c,2021-12-09 16:26:31.000 UTC,0,true -17416,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec3400000000000000000000000014f0f90fa59e3bd60aa7e1097abda932f2f1640500000000000000000000000014f0f90fa59e3bd60aa7e1097abda932f2f16405000000000000000000000000000000000000000000000000013fbe85edc9000000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,0x59cfb83a88b1d49724ea96c9327d4bfe351b5e4463fdb1bc34918fb18ef652a9,2022-08-09 09:33:28.000 UTC,0,true -17417,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec340000000000000000000000003a05c33f8e7d9e600f5f61abdade4537320196030000000000000000000000003a05c33f8e7d9e600f5f61abdade4537320196030000000000000000000000000000000000000000000000000000d5bb3385b00000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -17419,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec34000000000000000000000000a199b0bfbd246994738ea545eac381aac73503ae000000000000000000000000a199b0bfbd246994738ea545eac381aac73503ae0000000000000000000000000000000000000000000000000000d5bb3385b00000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -17420,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec34000000000000000000000000a22d38ac19d95792dac606674201aa306e8498e2000000000000000000000000a22d38ac19d95792dac606674201aa306e8498e20000000000000000000000000000000000000000000000000000d4d25ee0a00000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -17421,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec34000000000000000000000000cedf43079f72894103b5817b467ab361496c2ac4000000000000000000000000cedf43079f72894103b5817b467ab361496c2ac40000000000000000000000000000000000000000000000000000da475abf000000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -17422,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec34000000000000000000000000885a3810e1fca74faac070af24c0de8378323e92000000000000000000000000885a3810e1fca74faac070af24c0de8378323e920000000000000000000000000000000000000000000000000000d78cdccfd00000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -17423,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec34000000000000000000000000fbcda728abb86d3fa38d0263cc5c831eb06bc1e0000000000000000000000000fbcda728abb86d3fa38d0263cc5c831eb06bc1e00000000000000000000000000000000000000000000000000000d5bb3385b00000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -17424,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec340000000000000000000000003519ef2ca968712388ce7d39f1523d5b2dfdd8d90000000000000000000000003519ef2ca968712388ce7d39f1523d5b2dfdd8d90000000000000000000000000000000000000000000000000000d217e0f1700000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -17425,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec34000000000000000000000000c67df5fbad50979f0ea2bb7111f84df1366c85a5000000000000000000000000c67df5fbad50979f0ea2bb7111f84df1366c85a50000000000000000000000000000000000000000000000000000d5bb3385b00000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -17426,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec34000000000000000000000000bc79e4fe5d61076bb91fe2aab0446c522b274aee000000000000000000000000bc79e4fe5d61076bb91fe2aab0446c522b274aee0000000000000000000000000000000000000000000000000000d5bb3385b00000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -17428,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec340000000000000000000000009bf90bcff11df8dbbd22e2efb082b2fcaddb86d30000000000000000000000009bf90bcff11df8dbbd22e2efb082b2fcaddb86d30000000000000000000000000000000000000000000000000000d6a4082ac00000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -17429,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec3400000000000000000000000064373326129e926f4425ddfd294ae22075eb2aba00000000000000000000000064373326129e926f4425ddfd294ae22075eb2aba000000000000000000000000000000000000000000000000006651d91b48dd0000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -17430,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec34000000000000000000000000bcb1c9373b1214ce96ce847160e33660aa293fc8000000000000000000000000bcb1c9373b1214ce96ce847160e33660aa293fc8000000000000000000000000000000000000000000000000004f157eec24340000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -17431,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec34000000000000000000000000822f9725ef111647863fc4035d13761efdb7e488000000000000000000000000822f9725ef111647863fc4035d13761efdb7e488000000000000000000000000000000000000000000000000016345785d8a000000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -17433,0xcd9d4988c0ae61887b075ba77f08cbfad2b65068,0x3f87ff1de58128ef8fcb4c807efd776e1ac72e51,0xf4f7b41a0000000000000000000000000258da40e011acb8e0f6308d6dda4de363c9b604000000000000000000000000000000000000000000000000053906430e9d7cd5,,,1,true -17436,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec34000000000000000000000000902c915d3a062aa72a4e3c9fbdf193e19025cdd4000000000000000000000000902c915d3a062aa72a4e3c9fbdf193e19025cdd4000000000000000000000000000000000000000000000000132fe40ca22df40900000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,0x6d44845d9179ef5580559db92926b78426e3e69ef23c20758f86593a962327e2,2021-11-27 22:39:52.000 UTC,0,true -17445,0xcd9d4988c0ae61887b075ba77f08cbfad2b65068,0x3f87ff1de58128ef8fcb4c807efd776e1ac72e51,0xf4f7b41a000000000000000000000000edcb53f0ea600b3c15eb2351f9aee65660d383de000000000000000000000000000000000000000000000000114631114ba8c6dd,,,1,true -17446,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec340000000000000000000000006ab8887950986fb6502c93af7611cf4c9d60b4070000000000000000000000006ab8887950986fb6502c93af7611cf4c9d60b4070000000000000000000000000000000000000000000000000051b660cdd5800000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -17447,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec340000000000000000000000006ab8887950986fb6502c93af7611cf4c9d60b4070000000000000000000000006ab8887950986fb6502c93af7611cf4c9d60b407000000000000000000000000000000000000000000000000001517ab8808100000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -17452,0xcd9d4988c0ae61887b075ba77f08cbfad2b65068,0x3f87ff1de58128ef8fcb4c807efd776e1ac72e51,0xf4f7b41a0000000000000000000000006c00fd260ce525f7945f6bd91bcad5e8d57ef6d10000000000000000000000000000000000000000000000694cc0c717efb7cec4,0xa6fcf19d464743cbcfa062069cf563735d49b4018d876fbf2416c78d3b640d24,2021-12-19 10:29:34.000 UTC,0,true -17455,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec34000000000000000000000000ab17ffe29ef29439e6e0236bf70afdec20dec594000000000000000000000000ab17ffe29ef29439e6e0236bf70afdec20dec594000000000000000000000000000000000000000000000000020eb9304f74215900000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,0xa3141397c090dc22de6008affaa9e6ea6462c35b1390a11a37f4782d5da68c20,2022-07-24 06:34:07.000 UTC,0,true -17456,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec3400000000000000000000000020b45ffb7bdd01a17c7477acf706ce6781d259f200000000000000000000000020b45ffb7bdd01a17c7477acf706ce6781d259f200000000000000000000000000000000000000000000000001a66d2afb0ec50000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -17457,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec3400000000000000000000000078613721f001003c83d17930a470140edb3df5d900000000000000000000000078613721f001003c83d17930a470140edb3df5d90000000000000000000000000000000000000000000000000233bd216610160000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,0xb4614ad7e3928afc2d5cac3d2ba465c47a9181fed7ba3081ed885b24167beafc,2022-11-01 08:39:23.000 UTC,0,true -17460,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0xa9f9e675000000000000000000000000514910771af9ca656af840dff83e8264ecf986ca000000000000000000000000350a791bfc2c21f9ed5d10980dad2e2638ffa7f6000000000000000000000000b3b49304c663cd70c0a3fa15cf29de426b6d109d000000000000000000000000b3b49304c663cd70c0a3fa15cf29de426b6d109d00000000000000000000000000000000000000000000000b14b5c9374c17f6b300000000000000000000000000000000000000000000000000000000000000c00000000000000000000000000000000000000000000000000000000000000000,,,1,true -17461,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec3400000000000000000000000038eef87a7123c61d37e140c1e6e15f917acddcfb00000000000000000000000038eef87a7123c61d37e140c1e6e15f917acddcfb00000000000000000000000000000000000000000000000000cff00540d0470000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -17462,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec3400000000000000000000000032753fc346c1479271490fbab8aa2faf88f3135500000000000000000000000032753fc346c1479271490fbab8aa2faf88f31355000000000000000000000000000000000000000000000000002a01021fd1e8c400000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -17463,0xcd9d4988c0ae61887b075ba77f08cbfad2b65068,0x3f87ff1de58128ef8fcb4c807efd776e1ac72e51,0xf4f7b41a000000000000000000000000cc3c15da0f598711cea394460653540ef97ff99e00000000000000000000000000000000000000000000000d8449a0f0a7e60000,,,1,true -17464,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec340000000000000000000000007599635c81550d076fae4b6971716e983ef86d3e0000000000000000000000007599635c81550d076fae4b6971716e983ef86d3e000000000000000000000000000000000000000000000000001cae2868c7633400000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -17465,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec34000000000000000000000000bfd457de4cbc3b930b34a893cc0463dc095c6d90000000000000000000000000bfd457de4cbc3b930b34a893cc0463dc095c6d90000000000000000000000000000000000000000000000000001bf8c7d4d0c30800000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -17466,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec34000000000000000000000000d9884ed4cd8e44cc7fe50f9dc23587b8a9c7904e000000000000000000000000d9884ed4cd8e44cc7fe50f9dc23587b8a9c7904e000000000000000000000000000000000000000000000000002ef590bac57e1f00000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -17467,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec340000000000000000000000006d1b02eba530e7248102a455200a41dae58058cd0000000000000000000000006d1b02eba530e7248102a455200a41dae58058cd0000000000000000000000000000000000000000000000000624a42eeb32504400000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,0x2c4985004b213ea2f601668cb8400b466d526e3b7bff293a19ab54fe29194da8,2021-11-23 23:11:21.000 UTC,0,true -17471,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec34000000000000000000000000d867583eebd7f82f79d12836d15c512b54e7c2c4000000000000000000000000d867583eebd7f82f79d12836d15c512b54e7c2c40000000000000000000000000000000000000000000000000000d4d25ee0a00000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -17472,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec340000000000000000000000007414e97e91645d0ebbd6b4ec354b3617741a6b4c0000000000000000000000007414e97e91645d0ebbd6b4ec354b3617741a6b4c0000000000000000000000000000000000000000000000000000d3e98a3b900000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -17473,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec3400000000000000000000000066f4594eed3ddbc6eae99b5116bb0e2f4d4a71b900000000000000000000000066f4594eed3ddbc6eae99b5116bb0e2f4d4a71b90000000000000000000000000000000000000000000000000000d12f0c4c600000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -17474,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec34000000000000000000000000a01be7266be4d0d63802691b576491af7055e018000000000000000000000000a01be7266be4d0d63802691b576491af7055e0180000000000000000000000000000000000000000000000000000d217e0f1700000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -17475,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec3400000000000000000000000071cc934d93ae3cdd597d3a7017a05293b3a862fe00000000000000000000000071cc934d93ae3cdd597d3a7017a05293b3a862fe0000000000000000000000000000000000000000000000000000d95e8619f00000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -17476,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec3400000000000000000000000050f56bd03c9fb317ec2c6bac998b1e773e12df8800000000000000000000000050f56bd03c9fb317ec2c6bac998b1e773e12df880000000000000000000000000000000000000000000000000000d217e0f1700000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -17477,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec340000000000000000000000005143e1e81c9ba050499fff2212a13a14a4be5fd80000000000000000000000005143e1e81c9ba050499fff2212a13a14a4be5fd80000000000000000000000000000000000000000000000000000d300b596800000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -17478,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec340000000000000000000000003f3382b354835151c7e2f8d61f7318d4f118efd20000000000000000000000003f3382b354835151c7e2f8d61f7318d4f118efd20000000000000000000000000000000000000000000000000000d300b596800000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -17479,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec340000000000000000000000000b01a5802f354e19a2f42b68ebe9cfe6d9d0bb430000000000000000000000000b01a5802f354e19a2f42b68ebe9cfe6d9d0bb430000000000000000000000000000000000000000000000000000d3e98a3b900000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -17480,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec34000000000000000000000000d845d5f143f1401a1650c2b70e2ea3350b1d50b3000000000000000000000000d845d5f143f1401a1650c2b70e2ea3350b1d50b30000000000000000000000000000000000000000000000000000d4d25ee0a00000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -17481,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec340000000000000000000000001728f815456c6d7f516584d354fb1b80346ffb9a0000000000000000000000001728f815456c6d7f516584d354fb1b80346ffb9a0000000000000000000000000000000000000000000000000000d3e98a3b900000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -17482,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec340000000000000000000000006ee16d8f098d61a5a8504f3775c508e25b7675640000000000000000000000006ee16d8f098d61a5a8504f3775c508e25b7675640000000000000000000000000000000000000000000000000000d3e98a3b900000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -17483,0x10e6593cdda8c58a1d0f14c5164b376352a55f2f,0x467194771dae2967aef3ecbedd3bf9a310c76c65,0xa9f9e6750000000000000000000000006b175474e89094c44da98b954eedeac495271d0f000000000000000000000000da10009cbd5d07dd0cecc66161fc93d7c9000da10000000000000000000000005b513ea36823a094a66a291d3ab88eda2298943c0000000000000000000000005b513ea36823a094a66a291d3ab88eda2298943c00000000000000000000000000000000000000000000000b0ae9a14e42ad355a00000000000000000000000000000000000000000000000000000000000000c00000000000000000000000000000000000000000000000000000000000000000,,,1,true -17484,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec340000000000000000000000005b513ea36823a094a66a291d3ab88eda2298943c0000000000000000000000005b513ea36823a094a66a291d3ab88eda2298943c00000000000000000000000000000000000000000000000000776cdf5c35dbd100000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -17485,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec34000000000000000000000000755192487edda64e5114f8a94ded82d7b5a03aa1000000000000000000000000755192487edda64e5114f8a94ded82d7b5a03aa10000000000000000000000000000000000000000000000000000d3e98a3b900000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -17486,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec34000000000000000000000000203f6b4778864ea089c1711f2574031f9e8b5f17000000000000000000000000203f6b4778864ea089c1711f2574031f9e8b5f170000000000000000000000000000000000000000000000000000d3e98a3b900000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -17487,0xcd9d4988c0ae61887b075ba77f08cbfad2b65068,0x3f87ff1de58128ef8fcb4c807efd776e1ac72e51,0xf4f7b41a0000000000000000000000002f6be2184972c7786ef1c5cc2d92f11c55c33d080000000000000000000000000000000000000000000000015e10b080ac027e3e,,,1,true -17488,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec340000000000000000000000004315d7cd76c83bac4e27cd1e4664ea610d1100770000000000000000000000004315d7cd76c83bac4e27cd1e4664ea610d1100770000000000000000000000000000000000000000000000000000d300b596800000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -17489,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec3400000000000000000000000091f9b7b15458972f78af36e602876122bee8995400000000000000000000000091f9b7b15458972f78af36e602876122bee899540000000000000000000000000000000000000000000000000000d4d25ee0a00000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -17490,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec34000000000000000000000000950453ac097411e04f2a2fa745ca37887909bec4000000000000000000000000950453ac097411e04f2a2fa745ca37887909bec40000000000000000000000000000000000000000000000000000d4d25ee0a00000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -17491,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec340000000000000000000000006ed521bd887f427cf79cbcf0fb3d3eaa68f7146f0000000000000000000000006ed521bd887f427cf79cbcf0fb3d3eaa68f7146f0000000000000000000000000000000000000000000000000000d6a4082ac00000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -17492,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec340000000000000000000000006ae1e2c000ce7463d641f995f42a6eee2e0b48b00000000000000000000000006ae1e2c000ce7463d641f995f42a6eee2e0b48b00000000000000000000000000000000000000000000000000000da475abf000000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -17493,0xcd9d4988c0ae61887b075ba77f08cbfad2b65068,0x3f87ff1de58128ef8fcb4c807efd776e1ac72e51,0xf4f7b41a000000000000000000000000c8e9b24afee116a08387414f6b6a8e8823f00fa300000000000000000000000000000000000000000000000df027c9ea9f82f5fc,,,1,true -17494,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec34000000000000000000000000f9eb56be6042802ce130d5149c25dbec0ca9be1e000000000000000000000000f9eb56be6042802ce130d5149c25dbec0ca9be1e0000000000000000000000000000000000000000000000000000da475abf000000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -17495,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec34000000000000000000000000efe6649c303e0032fe3afaccb4488391ef8943f6000000000000000000000000efe6649c303e0032fe3afaccb4488391ef8943f600000000000000000000000000000000000000000000000001548f3e29018f4e00000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,0xf559761853a0f2abdda5bd05a174aa2ae07fe195329e569cc60f0a479604a294,2021-12-20 11:59:49.000 UTC,0,true -17496,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec340000000000000000000000000dfd2df5b5a5305f69f499e06ef4b0442767aebf0000000000000000000000000dfd2df5b5a5305f69f499e06ef4b0442767aebf0000000000000000000000000000000000000000000000000000d875b174e00000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -17497,0xcd9d4988c0ae61887b075ba77f08cbfad2b65068,0x3f87ff1de58128ef8fcb4c807efd776e1ac72e51,0xf4f7b41a00000000000000000000000042a14ec383551dec3cacc62ad58ab7413e5518a0000000000000000000000000000000000000000000000007ca94f93b5c5c7fac,0x7e45531ecb144662a57857b41230113ba3cacd36878d9c8f8d26b7ee189bb76d,2022-02-01 21:37:21.000 UTC,0,true -17498,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec340000000000000000000000002178367ea01a093caf1cd6ab7608a82b9521ab410000000000000000000000002178367ea01a093caf1cd6ab7608a82b9521ab41000000000000000000000000000000000000000000000000008e1bc9bf04000000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -17499,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec340000000000000000000000002b21bbe1b1c7097a5402ad4ad9860f19e07badb00000000000000000000000002b21bbe1b1c7097a5402ad4ad9860f19e07badb00000000000000000000000000000000000000000000000000000dd01d8ae300000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -17501,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec34000000000000000000000000034e100ae67f93d9ccb9c0cf11a34e56dbdc09ad000000000000000000000000034e100ae67f93d9ccb9c0cf11a34e56dbdc09ad0000000000000000000000000000000000000000000000000000d875b174e00000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -17502,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec340000000000000000000000000f1b630493180996c769539ec5e402153eb7f5af0000000000000000000000000f1b630493180996c769539ec5e402153eb7f5af0000000000000000000000000000000000000000000000000000d95e8619f00000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -17503,0xcd9d4988c0ae61887b075ba77f08cbfad2b65068,0x3f87ff1de58128ef8fcb4c807efd776e1ac72e51,0xf4f7b41a0000000000000000000000001e69ef2d9be1ad7468d6a305ad01d347f12f6d40000000000000000000000000000000000000000000000001f823602dad852d29,,,1,true -17504,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec34000000000000000000000000189d1e4299dbf518e54e507e05e57c0e350daf68000000000000000000000000189d1e4299dbf518e54e507e05e57c0e350daf680000000000000000000000000000000000000000000000000000d78cdccfd00000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -17505,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec340000000000000000000000007a7742c55a5361de00e9b91be6faad46cabd12eb0000000000000000000000007a7742c55a5361de00e9b91be6faad46cabd12eb0000000000000000000000000000000000000000000000000000d92ff52c200000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -17506,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec34000000000000000000000000744d5875fc81af39adb0826a3b4c4b84e0448655000000000000000000000000744d5875fc81af39adb0826a3b4c4b84e04486550000000000000000000000000000000000000000000000000000d92ff52c200000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -17507,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec340000000000000000000000006d9c48c0d99140f3db0e8b12c6c7b2147da67ccd0000000000000000000000006d9c48c0d99140f3db0e8b12c6c7b2147da67ccd0000000000000000000000000000000000000000000000000000da301248180000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -17508,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec340000000000000000000000001303a8a5fb974c2d7df6157010b1b27f55924ce00000000000000000000000001303a8a5fb974c2d7df6157010b1b27f55924ce00000000000000000000000000000000000000000000000000000d82fd810280000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -17509,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec34000000000000000000000000a35425dc344212c23d6d3f3cce76a5d64f218ad5000000000000000000000000a35425dc344212c23d6d3f3cce76a5d64f218ad50000000000000000000000000000000000000000000000000000d875b174e00000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -17510,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec34000000000000000000000000752bfefb7857685849929b1f5c5de653e5443f68000000000000000000000000752bfefb7857685849929b1f5c5de653e5443f680000000000000000000000000000000000000000000000000000d95e8619f00000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -17511,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec3400000000000000000000000051fd2af043bb40f68cd9d69ec07262834649a57600000000000000000000000051fd2af043bb40f68cd9d69ec07262834649a5760000000000000000000000000000000000000000000000000000d918acb5380000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -17512,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec34000000000000000000000000086bccfa5549e4127b3f140dc203762ae29ed925000000000000000000000000086bccfa5549e4127b3f140dc203762ae29ed9250000000000000000000000000000000000000000000000000000d875b174e00000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -17513,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec3400000000000000000000000038664ea95a6464e5d70496e12b559a86e9fcc33400000000000000000000000038664ea95a6464e5d70496e12b559a86e9fcc3340000000000000000000000000000000000000000000000000000d78cdccfd00000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -17515,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec34000000000000000000000000b67eebe86182a234aae9001ee449b2bdaae1e3b6000000000000000000000000b67eebe86182a234aae9001ee449b2bdaae1e3b6000000000000000000000000000000000000000000000000002b15ec1c3092ef00000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -17516,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec340000000000000000000000001556927ca1dd8b2e80112105d83fa6c5d7ea39550000000000000000000000001556927ca1dd8b2e80112105d83fa6c5d7ea39550000000000000000000000000000000000000000000000000000d78cdccfd00000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -17518,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec3400000000000000000000000086cd2f687a86b3a7dca6c01a71a9b9e2f6e4a2eb00000000000000000000000086cd2f687a86b3a7dca6c01a71a9b9e2f6e4a2eb0000000000000000000000000000000000000000000000000000d7759458e80000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -17519,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec340000000000000000000000008941471a1520bdd3208aa1d85fe9e989e0bef59e0000000000000000000000008941471a1520bdd3208aa1d85fe9e989e0bef59e0000000000000000000000000000000000000000000000000000d95e8619f00000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -17520,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec34000000000000000000000000242743c00659e6a7f566de17ab7c47735bf9041f000000000000000000000000242743c00659e6a7f566de17ab7c47735bf9041f0000000000000000000000000000000000000000000000000000d875b174e00000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -17521,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec34000000000000000000000000fc55a58d67a5b8ff5a0be3a5029ff4ec93a7cb09000000000000000000000000fc55a58d67a5b8ff5a0be3a5029ff4ec93a7cb090000000000000000000000000000000000000000000000000000da475abf000000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -17522,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec34000000000000000000000000be5eb30e34716ae8b9ef8b712f6afeacd6b0e70d000000000000000000000000be5eb30e34716ae8b9ef8b712f6afeacd6b0e70d0000000000000000000000000000000000000000000000000000da301248180000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -17523,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec34000000000000000000000000d6f0f886028e694f6c6cc98a78d2576cdaac4269000000000000000000000000d6f0f886028e694f6c6cc98a78d2576cdaac4269000000000000000000000000000000000000000000000000000aa87bee53800000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -17526,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec340000000000000000000000003040ea8303133a1b063ac967c72c1604e1642bfb0000000000000000000000003040ea8303133a1b063ac967c72c1604e1642bfb0000000000000000000000000000000000000000000000000dd9f8050df59a0000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,0x79a8272fe2873b6658dcd01733f63d4f9c41da91c24db2b6d02dc0ae02f37c0e,2021-11-23 05:51:28.000 UTC,0,true -17531,0xcd9d4988c0ae61887b075ba77f08cbfad2b65068,0x3f87ff1de58128ef8fcb4c807efd776e1ac72e51,0xf4f7b41a000000000000000000000000d3b468d28e942bbc25570029a50aa102e0f2c18900000000000000000000000000000000000000000000000ae3192e2183dd3e32,0x5a31b61bec6e5c400fb6a7bc1914dd747b08263e825723648ba6b568bd6cea1c,2021-11-25 12:19:26.000 UTC,0,true -17534,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec340000000000000000000000006fa39574ab01aa1d8e21f6f9f12a4ba80a788b020000000000000000000000006fa39574ab01aa1d8e21f6f9f12a4ba80a788b020000000000000000000000000000000000000000000000000206618aecb98a6700000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,0x693bfd1669523560750b192d3d06e35016d7a5dd7e8629f65631b033ccdd226b,2021-12-26 00:44:17.000 UTC,0,true -17535,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec340000000000000000000000009263de705ba26acd1fc0820ad85235c400f9cadf0000000000000000000000009263de705ba26acd1fc0820ad85235c400f9cadf0000000000000000000000000000000000000000000000000203a3f2c472980f00000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,0xe09261901c3a21362cb05901c1069c7113d88e52ab1ad2f02f2d7098626d3e02,2021-12-26 01:00:29.000 UTC,0,true -17536,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec3400000000000000000000000067861906c5e9e8d6a8b2f523f5a2d5991524fe0000000000000000000000000067861906c5e9e8d6a8b2f523f5a2d5991524fe0000000000000000000000000000000000000000000000000002019f8f34c21fab00000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,0x15b3716a07a918d1123774977659f2660637fa5796a4ec424e1185303941a624,2021-12-26 01:16:26.000 UTC,0,true -17540,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec3400000000000000000000000062accbf874fe1b42d3c473819c9053b663dc3c4900000000000000000000000062accbf874fe1b42d3c473819c9053b663dc3c4900000000000000000000000000000000000000000000000000d529ae9e86000000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -17541,0xcd9d4988c0ae61887b075ba77f08cbfad2b65068,0x3f87ff1de58128ef8fcb4c807efd776e1ac72e51,0xf4f7b41a000000000000000000000000e8fe9295cdd4fd2a6edd0cd47eafb6d61d8e50e10000000000000000000000000000000000000000000000047a045b29c30d0d36,,,1,true -17544,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec34000000000000000000000000a0ac49961698a8c6ad87ecaf91f3b148a6c5571c000000000000000000000000a0ac49961698a8c6ad87ecaf91f3b148a6c5571c00000000000000000000000000000000000000000000000000422437cc48610000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -17546,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec34000000000000000000000000d67507850ec643e33e4ee494c3e226fb62bcea12000000000000000000000000d67507850ec643e33e4ee494c3e226fb62bcea120000000000000000000000000000000000000000000000000000ded381f8500000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -17547,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec34000000000000000000000000dc7d9fe33903376798d63bfc39e9db8a1db7c887000000000000000000000000dc7d9fe33903376798d63bfc39e9db8a1db7c8870000000000000000000000000000000000000000000000000000dd01d8ae300000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -17548,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec340000000000000000000000006c10654f7479f68284f3a0415b7240d13912d7d50000000000000000000000006c10654f7479f68284f3a0415b7240d13912d7d50000000000000000000000000000000000000000000000000000dd01d8ae300000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -17549,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec3400000000000000000000000032a818fb907f2ef5e40138638d1f200a4456340200000000000000000000000032a818fb907f2ef5e40138638d1f200a445634020000000000000000000000000000000000000000000000000000dd01d8ae300000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -17551,0xcd9d4988c0ae61887b075ba77f08cbfad2b65068,0x3f87ff1de58128ef8fcb4c807efd776e1ac72e51,0xf4f7b41a000000000000000000000000df4c99f93c3130e3287384ad5fad660891abe4660000000000000000000000000000000000000000000000056bc75e2d63100000,0x65b862ecf2f4e490265e53e34a0a0a8d563eadb17863b136810c02fc92b7ee30,2021-11-23 08:02:09.000 UTC,0,true -17552,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec34000000000000000000000000cdeaad6d0c8c8ceb60cd286bf76a60e26961bb52000000000000000000000000cdeaad6d0c8c8ceb60cd286bf76a60e26961bb520000000000000000000000000000000000000000000000000000ded381f8500000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -17553,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec34000000000000000000000000bc820741956b6315287004667aceddf3d15ea1bd000000000000000000000000bc820741956b6315287004667aceddf3d15ea1bd0000000000000000000000000000000000000000000000000000e702fbc5e00000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -17554,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec34000000000000000000000000e2f47cbd9594d2eea0c00af354d9c325cdb7392c000000000000000000000000e2f47cbd9594d2eea0c00af354d9c325cdb7392c0000000000000000000000000000000000000000000000000000e35fa931a00000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -17555,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec3400000000000000000000000001dc4b7cd57245e46c6c93d1bf89f6fa9355640600000000000000000000000001dc4b7cd57245e46c6c93d1bf89f6fa935564060000000000000000000000000000000000000000000000000000e35fa931a00000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -17556,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec34000000000000000000000000f66f75b42277a3a262b681b35329f45d725261bf000000000000000000000000f66f75b42277a3a262b681b35329f45d725261bf0000000000000000000000000000000000000000000000000000e61a2720d00000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -17557,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec34000000000000000000000000df642259ef722c58775ad4e2535d31fff4d75ad4000000000000000000000000df642259ef722c58775ad4e2535d31fff4d75ad40000000000000000000000000000000000000000000000000000ded381f8500000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -17558,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec34000000000000000000000000413d1b2573237f0dad55851a93b0b376ab1607af000000000000000000000000413d1b2573237f0dad55851a93b0b376ab1607af0000000000000000000000000000000000000000000000000000dd01d8ae300000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -17559,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec340000000000000000000000000c1dc563d39a785ed7f0c2301b4d00245e33c53b0000000000000000000000000c1dc563d39a785ed7f0c2301b4d00245e33c53b0000000000000000000000000000000000000000000000000000db302f64100000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -17560,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec340000000000000000000000002895b5b2616960f9d0cc324630ab0c6b1ab456880000000000000000000000002895b5b2616960f9d0cc324630ab0c6b1ab456880000000000000000000000000000000000000000000000000000da475abf000000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -17561,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec340000000000000000000000004ccefa8e656308fa7fdd7acf9509467266edf84d0000000000000000000000004ccefa8e656308fa7fdd7acf9509467266edf84d0000000000000000000000000000000000000000000000000000d95e8619f00000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -17562,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec34000000000000000000000000cef59e634b5536823037c15db7a9548ea996be4c000000000000000000000000cef59e634b5536823037c15db7a9548ea996be4c0000000000000000000000000000000000000000000000000000d92ff52c200000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -17563,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec340000000000000000000000008ac4ad1976120b8b15da77e52d74932bd3184b940000000000000000000000008ac4ad1976120b8b15da77e52d74932bd3184b940000000000000000000000000000000000000000000000000000d8472087100000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -17564,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec34000000000000000000000000747c475abc7f6cd5bc273f989021d5a1e558e074000000000000000000000000747c475abc7f6cd5bc273f989021d5a1e558e0740000000000000000000000000000000000000000000000000000d5bb3385b00000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -17565,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec340000000000000000000000001c24eab3ca4e1feb7f7b43b152e7b7531bab21c70000000000000000000000001c24eab3ca4e1feb7f7b43b152e7b7531bab21c70000000000000000000000000000000000000000000000000000d4d25ee0a00000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -17566,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec340000000000000000000000008c0753dcdc2437febe0825ecad86ff65b0ac08850000000000000000000000008c0753dcdc2437febe0825ecad86ff65b0ac08850000000000000000000000000000000000000000000000000000d4d25ee0a00000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -17567,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec34000000000000000000000000291587abf4830f230001520c36dda1db6623deb4000000000000000000000000291587abf4830f230001520c36dda1db6623deb40000000000000000000000000000000000000000000000000000d875b174e00000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -17568,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec340000000000000000000000007ce40f28da9869bcaed42fa651cc6f58db0163c80000000000000000000000007ce40f28da9869bcaed42fa651cc6f58db0163c80000000000000000000000000000000000000000000000000000d95e8619f00000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -17569,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec34000000000000000000000000f65859f45f7f8e992adc3ba2481ec0e70333c756000000000000000000000000f65859f45f7f8e992adc3ba2481ec0e70333c7560000000000000000000000000000000000000000000000000000d875b174e00000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -17570,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec34000000000000000000000000c366cadd0773c6ff55b5916f19f382284ca30bcb000000000000000000000000c366cadd0773c6ff55b5916f19f382284ca30bcb0000000000000000000000000000000000000000000000000000d78cdccfd00000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -17571,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec34000000000000000000000000caa0418a77461540be251b4ecf28cee88b5520a8000000000000000000000000caa0418a77461540be251b4ecf28cee88b5520a80000000000000000000000000000000000000000000000000000d72fbaf4300000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -17572,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec3400000000000000000000000099301e83a0bf5429769a87850b1863ecb60f4f7e00000000000000000000000099301e83a0bf5429769a87850b1863ecb60f4f7e0000000000000000000000000000000000000000000000000000d718727d480000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -17573,0xcd9d4988c0ae61887b075ba77f08cbfad2b65068,0x3f87ff1de58128ef8fcb4c807efd776e1ac72e51,0xf4f7b41a000000000000000000000000f894e177535e411334889f0676671a24b14e6a5f0000000000000000000000000000000000000000000000007572edb17e893720,,,1,true -17574,0xcd9d4988c0ae61887b075ba77f08cbfad2b65068,0x3f87ff1de58128ef8fcb4c807efd776e1ac72e51,0xf4f7b41a0000000000000000000000007f43909414ff1b9e8fcc531e87212378e4a3f9e4000000000000000000000000000000000000000000000025f59b68038128a1fc,0xa7f9d1f0188dd2cfce78e9596367bfbc9957ce2eee9d20f4602af4086ce4d711,2021-12-10 08:40:46.000 UTC,0,true -17575,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec34000000000000000000000000ebd39421e3ad3fbe2b1bf0f58366147536a07fc3000000000000000000000000ebd39421e3ad3fbe2b1bf0f58366147536a07fc30000000000000000000000000000000000000000000000000000d901643e500000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -17576,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec34000000000000000000000000f80bbbc1cbdc2db0f913d1b371e9d4eacba688d9000000000000000000000000f80bbbc1cbdc2db0f913d1b371e9d4eacba688d90000000000000000000000000000000000000000000000000000d546c933280000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -17577,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec340000000000000000000000007ff548c4858a9e9be5710f3cdeeeccdb6dc02fad0000000000000000000000007ff548c4858a9e9be5710f3cdeeeccdb6dc02fad00000000000000000000000000000000000000000000000000038d7ea4c6800000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -17578,0xcd9d4988c0ae61887b075ba77f08cbfad2b65068,0x3f87ff1de58128ef8fcb4c807efd776e1ac72e51,0xf4f7b41a000000000000000000000000d6129da37dad28b70ba29e542e3a0a074084c626000000000000000000000000000000000000000000000000210af52b11a048b2,,,1,true -17579,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec340000000000000000000000000ce2a930b5dc8357f25bed4970602ba49761b28c0000000000000000000000000ce2a930b5dc8357f25bed4970602ba49761b28c00000000000000000000000000000000000000000000000001589efb0c7d8c0000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -17580,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec34000000000000000000000000cdc285f782cbab70d667dc04e50e21bb7de96437000000000000000000000000cdc285f782cbab70d667dc04e50e21bb7de9643700000000000000000000000000000000000000000000000000426ee3c6a1620000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -17581,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec3400000000000000000000000063aa434f9695989de6318e4e6bda9c2acc2075a900000000000000000000000063aa434f9695989de6318e4e6bda9c2acc2075a900000000000000000000000000000000000000000000000000425fc99f81000000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -17582,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec34000000000000000000000000995a2db38b88571b9f9409a34ef0aed87a6fde56000000000000000000000000995a2db38b88571b9f9409a34ef0aed87a6fde56000000000000000000000000000000000000000000000000004307de78e4ab0000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -17583,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec34000000000000000000000000208847658adf83d0ca5bf0503d80d6cb2694a760000000000000000000000000208847658adf83d0ca5bf0503d80d6cb2694a760000000000000000000000000000000000000000000000000004307de78e4ab0000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -17584,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec3400000000000000000000000039b08619351aa6fd183b20841d86896c7f310ffb00000000000000000000000039b08619351aa6fd183b20841d86896c7f310ffb00000000000000000000000000000000000000000000000000430512849c4d0000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -17586,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec34000000000000000000000000ae9155be72fd213dbf5ad46308c7eafc63a71b16000000000000000000000000ae9155be72fd213dbf5ad46308c7eafc63a71b1600000000000000000000000000000000000000000000000002c68af0bb14000000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -17587,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec34000000000000000000000000cfa9d627e4fe03dd1dd1de7dbb9fc352c555a6a1000000000000000000000000cfa9d627e4fe03dd1dd1de7dbb9fc352c555a6a10000000000000000000000000000000000000000000000000043512479197d0000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -17588,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec34000000000000000000000000a0805d693ec6a4f0b12ad03482d41be896224a19000000000000000000000000a0805d693ec6a4f0b12ad03482d41be896224a19000000000000000000000000000000000000000000000000004281e843c0ae0000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -17589,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec34000000000000000000000000cddc9c5fa645bbb7d90e215c71e6902dea5c2e26000000000000000000000000cddc9c5fa645bbb7d90e215c71e6902dea5c2e260000000000000000000000000000000000000000000000000041e6b0ce104d0000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -17590,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec34000000000000000000000000adb5373a8bc60681ce12ca48c95d4ccf858bca8d000000000000000000000000adb5373a8bc60681ce12ca48c95d4ccf858bca8d0000000000000000000000000000000000000000000000000041d4cab2a78d0000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -17591,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec34000000000000000000000000e63baca99ea0e6eb8b1da27b61a9e30c91d029a7000000000000000000000000e63baca99ea0e6eb8b1da27b61a9e30c91d029a7000000000000000000000000000000000000000000000000004297711cbab50000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -17592,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec34000000000000000000000000438ef5a483a2cd7bd4fb75475c361f2bc328f0af000000000000000000000000438ef5a483a2cd7bd4fb75475c361f2bc328f0af00000000000000000000000000000000000000000000000000426f72f77ca80000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -17593,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec34000000000000000000000000d954c95680b7070ddb196658acfdbf80491a55c9000000000000000000000000d954c95680b7070ddb196658acfdbf80491a55c90000000000000000000000000000000000000000000000000042f20e077d010000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -17594,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec34000000000000000000000000da5d39dcbb8ff4652d1d8c05dc3e648487036cef000000000000000000000000da5d39dcbb8ff4652d1d8c05dc3e648487036cef0000000000000000000000000000000000000000000000000041a929cfd8390000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -17595,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec3400000000000000000000000038190a55151d3a55446c2d69dd35c006de3f76fa00000000000000000000000038190a55151d3a55446c2d69dd35c006de3f76fa00000000000000000000000000000000000000000000000000422005dddbd40000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -17596,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec3400000000000000000000000035979754a0e1d42fd5fbe396689555f87a76f38e00000000000000000000000035979754a0e1d42fd5fbe396689555f87a76f38e00000000000000000000000000000000000000000000000000430b399e084f0000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -17597,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec34000000000000000000000000a38f35b89cced1b3b94e6f46e58097f95a9d01fa000000000000000000000000a38f35b89cced1b3b94e6f46e58097f95a9d01fa0000000000000000000000000000000000000000000000000042ab93fb908d0000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -17598,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec3400000000000000000000000047ce2fb44be7188ff1d7ccc25b2c10934a1804af00000000000000000000000047ce2fb44be7188ff1d7ccc25b2c10934a1804af0000000000000000000000000000000000000000000000000042ab93fb908d0000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -17599,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec340000000000000000000000000c9b9ff0acb9d5a621a16363b05fd82d47daa94b0000000000000000000000000c9b9ff0acb9d5a621a16363b05fd82d47daa94b0000000000000000000000000000000000000000000000000042fa2a4be8780000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -17600,0xcd9d4988c0ae61887b075ba77f08cbfad2b65068,0x3f87ff1de58128ef8fcb4c807efd776e1ac72e51,0xf4f7b41a000000000000000000000000dae7939b5cf4f49eb8a041177c3ba95a2196d7c200000000000000000000000000000000000000000000000568f35e2631342b3e,,,1,true -17601,0xcd9d4988c0ae61887b075ba77f08cbfad2b65068,0x3f87ff1de58128ef8fcb4c807efd776e1ac72e51,0xf4f7b41a000000000000000000000000f60c9808a0205535c6a211f2732c730157f163fc00000000000000000000000000000000000000000000000533082720db044846,0x06e384e7f7fd7271ce6788a0bb320cdef2b92f8ff112ac7689bafa0d19be91a8,2021-12-12 17:03:36.000 UTC,0,true -17603,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec34000000000000000000000000d5ae8b3d65d676e11a132b84a3ecbd1c5d4db97f000000000000000000000000d5ae8b3d65d676e11a132b84a3ecbd1c5d4db97f0000000000000000000000000000000000000000000000011125ff51c76f588d00000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,0x230dcfe2af2ddc08040fa00b95c199c45352b4298bc7b7cbc78ab4cd1466f3f3,2021-11-21 09:06:49.000 UTC,0,true -17604,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec34000000000000000000000000cae6223e0c70633b4f4afdef76ae9fa72e2cb545000000000000000000000000cae6223e0c70633b4f4afdef76ae9fa72e2cb545000000000000000000000000000000000000000000000000001ec425200ee20000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -17608,0xcd9d4988c0ae61887b075ba77f08cbfad2b65068,0x3f87ff1de58128ef8fcb4c807efd776e1ac72e51,0xf4f7b41a000000000000000000000000647a8646a70c9e1f038fdc9fa2a190d5ead3ffe6000000000000000000000000000000000000000000000008b270d02c69b64356,0x743936c0cb629ce06f16e16e0d99b30c60ed1fde858cbc569d3350a50f109bf5,2021-11-23 20:06:39.000 UTC,0,true -17609,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec3400000000000000000000000082cea2d73bdd35fd7980ed975020fb5a565ea26e00000000000000000000000082cea2d73bdd35fd7980ed975020fb5a565ea26e000000000000000000000000000000000000000000000000004b1c6c6736f5c000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -17610,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec340000000000000000000000001e52e505b4dd582a17fb7697026a6296fd33f7b00000000000000000000000001e52e505b4dd582a17fb7697026a6296fd33f7b0000000000000000000000000000000000000000000000000003de9158c1633b200000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,0x9e2870c950e5e77e532719e7a488c35e76687747054a62b60eb2d41e21d60828,2022-04-23 11:03:39.000 UTC,0,true -17616,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec340000000000000000000000008252f2300d09319fe4100bdfd8ad624adff3d05f0000000000000000000000008252f2300d09319fe4100bdfd8ad624adff3d05f00000000000000000000000000000000000000000000000006ddfccf25d88c4500000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,0x35542b5be56e7eaecd328270942643d4c11d92afd19e09cf9dc62e6ff75b7b13,2021-12-15 01:08:27.000 UTC,0,true -17617,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec340000000000000000000000009cec4f45144c8a594f634c586545af0ca51f47890000000000000000000000009cec4f45144c8a594f634c586545af0ca51f478900000000000000000000000000000000000000000000000000127bf889ee664000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -17619,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec340000000000000000000000006177c71d568960d87e958c38000350ed3276796b0000000000000000000000006177c71d568960d87e958c38000350ed3276796b00000000000000000000000000000000000000000000000000ec0d07dabbbd4f00000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -17620,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec340000000000000000000000006bba96d2fcf9e4730014b0f7f3f0f89f96a5d9240000000000000000000000006bba96d2fcf9e4730014b0f7f3f0f89f96a5d92400000000000000000000000000000000000000000000000007f8ec9de9a21b5800000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -17623,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec34000000000000000000000000994317196b32c1d73a38e0fcfee08db0f624e325000000000000000000000000994317196b32c1d73a38e0fcfee08db0f624e3250000000000000000000000000000000000000000000000000000d6a4082ac00000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -17624,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec340000000000000000000000000b73db6bd2539258d380daa13d9937fefc543b700000000000000000000000000b73db6bd2539258d380daa13d9937fefc543b7000000000000000000000000000000000000000000000000002a8dd53dfe7dc8c00000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -17625,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec34000000000000000000000000c16dfe34d78246ae49f4098630cfbc90c78df161000000000000000000000000c16dfe34d78246ae49f4098630cfbc90c78df16100000000000000000000000000000000000000000000000000038d7ea4c6800000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -17626,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec34000000000000000000000000f57c86041a7c5eedf5478d324292fcb08e427a26000000000000000000000000f57c86041a7c5eedf5478d324292fcb08e427a260000000000000000000000000000000000000000000000000000d5bb3385b00000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -17627,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec340000000000000000000000008be625b3a8e6d6a4ad226a53790248fc3ca703a40000000000000000000000008be625b3a8e6d6a4ad226a53790248fc3ca703a400000000000000000000000000000000000000000000000000005af3107a400000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -17628,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec340000000000000000000000006acb872f1eb512c9df43306e6e80f4ea5398a8660000000000000000000000006acb872f1eb512c9df43306e6e80f4ea5398a86600000000000000000000000000000000000000000000000000005af3107a400000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -17629,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec34000000000000000000000000901d13f8b0ddfcc460a095ca75f998e5640e4471000000000000000000000000901d13f8b0ddfcc460a095ca75f998e5640e44710000000000000000000000000000000000000000000000000000d6a4082ac00000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -17630,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec3400000000000000000000000087d617dbb2d58119a5be94aedd7f858d27f5bba700000000000000000000000087d617dbb2d58119a5be94aedd7f858d27f5bba70000000000000000000000000000000000000000000000000e4e36646bcb664d00000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,0x9fd9883797c1fc70edc643f69b76a7b466db59d6a60c6db6912208fbef019fd2,2021-11-25 20:27:48.000 UTC,0,true -17631,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec34000000000000000000000000c84ed7674a9d57db75d4deb938c0396f97aa3cbd000000000000000000000000c84ed7674a9d57db75d4deb938c0396f97aa3cbd00000000000000000000000000000000000000000000000000005af3107a400000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -17632,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec34000000000000000000000000dfe70bbe4ddf055de55ca27ad1625c2d4cc11b48000000000000000000000000dfe70bbe4ddf055de55ca27ad1625c2d4cc11b4800000000000000000000000000000000000000000000000000005af3107a400000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -17633,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec34000000000000000000000000c5f2cd0780c0f6a45928870347a21993c1575d51000000000000000000000000c5f2cd0780c0f6a45928870347a21993c1575d5100000000000000000000000000000000000000000000000000005af3107a400000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -17634,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec34000000000000000000000000833838849c09b66fe1951b526e15b2d530d69b5e000000000000000000000000833838849c09b66fe1951b526e15b2d530d69b5e0000000000000000000000000000000000000000000000000000b5e620f4800000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -17635,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec3400000000000000000000000071b55d92acbe7afac302f639b090f9b99262418200000000000000000000000071b55d92acbe7afac302f639b090f9b9926241820000000000000000000000000000000000000000000000000000640b5eece00000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -17636,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec3400000000000000000000000010fe0a48058551d3db4fd064e085a106d2d4d83200000000000000000000000010fe0a48058551d3db4fd064e085a106d2d4d83200000000000000000000000000000000000000000000000000006d23ad5f800000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -17637,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec34000000000000000000000000d1059b4bc5c4816c0db0c86c9995d3b6b1d274f1000000000000000000000000d1059b4bc5c4816c0db0c86c9995d3b6b1d274f10000000000000000000000000000000000000000000000000000640b5eece00000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -17638,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec34000000000000000000000000d3bae088a07a1d2cf608c332b40eafaa42a7863b000000000000000000000000d3bae088a07a1d2cf608c332b40eafaa42a7863b0000000000000000000000000000000000000000000000000000763bfbd2200000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -17639,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec34000000000000000000000000e9176aaa4a4b13a4405213a652616a41e405179f000000000000000000000000e9176aaa4a4b13a4405213a652616a41e405179f00000000000000000000000000000000000000000000000000005f7f37b3900000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -17640,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec34000000000000000000000000e37232d5a120f8d7d32fc8281f4c95e6442ce4a0000000000000000000000000e37232d5a120f8d7d32fc8281f4c95e6442ce4a000000000000000000000000000000000000000000000000000005dad8e69700000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -17641,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec340000000000000000000000006589098a35aef96eaa06ecaed3a47410e7e4594f0000000000000000000000006589098a35aef96eaa06ecaed3a47410e7e4594f00000000000000000000000000000000000000000000000000005e96630e800000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -17642,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec34000000000000000000000000ef61e9ea2f9ebb5d102b00dca72391817539bb23000000000000000000000000ef61e9ea2f9ebb5d102b00dca72391817539bb2300000000000000000000000000000000000000000000000000005cc4b9c4600000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -17643,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec340000000000000000000000005ce903173d0096ac33f351b142606edbddfc03410000000000000000000000005ce903173d0096ac33f351b142606edbddfc03410000000000000000000000000000000000000000000000000000640b5eece00000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -17644,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec34000000000000000000000000591564d8a2f1f09f0dc25ba3af8ffc1fa9aa6686000000000000000000000000591564d8a2f1f09f0dc25ba3af8ffc1fa9aa668600000000000000000000000000000000000000000000000000005cc4b9c4600000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -17645,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec340000000000000000000000006ee02ab46e6d8df72ebe5d81fdc8780f932465430000000000000000000000006ee02ab46e6d8df72ebe5d81fdc8780f9324654300000000000000000000000000000000000000000000000000005bdbe51f500000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -17646,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec34000000000000000000000000ebfef2cc9ba3465b69a05e67a1ea51e3037be94f000000000000000000000000ebfef2cc9ba3465b69a05e67a1ea51e3037be94f00000000000000000000000000000000000000000000000000005f7f37b3900000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -17647,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec34000000000000000000000000508a0453ab8e74ef700ef9b36e3ebd108ce19214000000000000000000000000508a0453ab8e74ef700ef9b36e3ebd108ce1921400000000000000000000000000000000000000000000000000005bdbe51f500000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -17648,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec340000000000000000000000004eb23a048fca4b24bbbd646feb36abbb870d0a0a0000000000000000000000004eb23a048fca4b24bbbd646feb36abbb870d0a0a000000000000000000000000000000000000000000000000000060680c58a00000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,0x50eaafb1aa1334bbb7dc1edd29f9f927601944bef915cb7b9a5609fa4b4c5f31,2021-11-21 13:20:15.000 UTC,0,true -17649,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec34000000000000000000000000b039029da896c6e27dcd61350de3bacbca68049d000000000000000000000000b039029da896c6e27dcd61350de3bacbca68049d00000000000000000000000000000000000000000000000000005dad8e69700000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -17650,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec34000000000000000000000000f49a5879c87e37cb3f5b79aea04d85ee7c46ee53000000000000000000000000f49a5879c87e37cb3f5b79aea04d85ee7c46ee530000000000000000000000000000000000000000000000000000d78cdccfd00000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -17651,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec340000000000000000000000006802b763e09fc2a32132b41763d65573671a59c90000000000000000000000006802b763e09fc2a32132b41763d65573671a59c90000000000000000000000000000000000000000000000000000d5bb3385b00000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -17652,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec340000000000000000000000006c7298aa9ae1d86a00fe1af854173899839956de0000000000000000000000006c7298aa9ae1d86a00fe1af854173899839956de0000000000000000000000000000000000000000000000000000d5e9c473800000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -17653,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec34000000000000000000000000bf70ff80e909e9c1714f25acf87c0f2efc472a44000000000000000000000000bf70ff80e909e9c1714f25acf87c0f2efc472a440000000000000000000000000000000000000000000000000000d5e9c473800000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -17654,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec340000000000000000000000006ee00b658f24281a7c829ba8071bf8672cff148f0000000000000000000000006ee00b658f24281a7c829ba8071bf8672cff148f0000000000000000000000000000000000000000000000000000d6010cea680000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -17655,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec340000000000000000000000005287d3237af69a73c026128b71de866743d606cb0000000000000000000000005287d3237af69a73c026128b71de866743d606cb0000000000000000000000000000000000000000000000000000d5a3eb0ec80000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -17657,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec340000000000000000000000002fd77c4db86278bcc62a3e62184ebaa901de85170000000000000000000000002fd77c4db86278bcc62a3e62184ebaa901de85170000000000000000000000000000000000000000000000000000d5bd8791940000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -17658,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec340000000000000000000000006d903a8e1e6bb1b41bb09cd683c415b49c003a090000000000000000000000006d903a8e1e6bb1b41bb09cd683c415b49c003a0900000000000000000000000000000000000000000000000000005bdbe51f500000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -17659,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec340000000000000000000000007a7ffb798f9c883bc1f1867183422d096e1929d50000000000000000000000007a7ffb798f9c883bc1f1867183422d096e1929d500000000000000000000000000000000000000000000000000005f7f37b3900000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -17660,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec34000000000000000000000000b393d37d67c21e9a3e56baa82c297de0636c7f3e000000000000000000000000b393d37d67c21e9a3e56baa82c297de0636c7f3e00000000000000000000000000000000000000000000000000006d23ad5f800000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -17661,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec3400000000000000000000000010343e645d7bad425466d47a0eb138f7c734d2aa00000000000000000000000010343e645d7bad425466d47a0eb138f7c734d2aa0000000000000000000000000000000000000000000000000000640b5eece00000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -17662,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec34000000000000000000000000b70dd5dfbfdb5fbeb635f5ded1732d0a04f4c03b000000000000000000000000b70dd5dfbfdb5fbeb635f5ded1732d0a04f4c03b00000000000000000000000000000000000000000000000000005bdbe51f500000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -17663,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec340000000000000000000000006239bd9e155037c2df077146a02d563158d50bfa0000000000000000000000006239bd9e155037c2df077146a02d563158d50bfa00000000000000000000000000000000000000000000000000005cc4b9c4600000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -17664,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec340000000000000000000000002d5f17408bf60b9ead22abc40cefb6302c816ec40000000000000000000000002d5f17408bf60b9ead22abc40cefb6302c816ec40000000000000000000000000000000000000000000000000000d4e9a757880000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -17665,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec34000000000000000000000000af0586105adc69145f0b82e03a4ece3a26b76bd7000000000000000000000000af0586105adc69145f0b82e03a4ece3a26b76bd7000000000000000000000000000000000000000000000000000060680c58a00000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -17666,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec34000000000000000000000000d6b168747c39db417c54e187e415965ae0353a0c000000000000000000000000d6b168747c39db417c54e187e415965ae0353a0c00000000000000000000000000000000000000000000000000005bdbe51f500000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -17668,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec340000000000000000000000005956ad429bc34e333616924642d192a876ca15ce0000000000000000000000005956ad429bc34e333616924642d192a876ca15ce0000000000000000000000000000000000000000000000000000d4d25ee0a00000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -17669,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec34000000000000000000000000c16872483ce63168d61d5f192a6969ad1e3a9867000000000000000000000000c16872483ce63168d61d5f192a6969ad1e3a986700000000000000000000000000000000000000000000000000005e96630e800000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -17670,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec34000000000000000000000000e4c51ae64abb97b0d10329d04d873fd15992d00b000000000000000000000000e4c51ae64abb97b0d10329d04d873fd15992d00b00000000000000000000000000000000000000000000000000006239b5a2c00000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -17671,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec34000000000000000000000000593988afd7905c358aba6f59357e7f7c5b6a19b6000000000000000000000000593988afd7905c358aba6f59357e7f7c5b6a19b60000000000000000000000000000000000000000000000000000d646e64f200000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -17672,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec34000000000000000000000000288478fec717c0bab68140afaf1e9cc8b2be3f74000000000000000000000000288478fec717c0bab68140afaf1e9cc8b2be3f7400000000000000000000000000000000000000000000000000006150e0fdb00000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -17673,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec340000000000000000000000005fcf5a55f97bca62601f68c6f79e3515cb8b9f8f0000000000000000000000005fcf5a55f97bca62601f68c6f79e3515cb8b9f8f00000000000000000000000000000000000000000000000000005bdbe51f500000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -17674,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec34000000000000000000000000e920476bdd6c73a250ee0b8ed68ca8e24125bbda000000000000000000000000e920476bdd6c73a250ee0b8ed68ca8e24125bbda000000000000000000000000000000000000000000000000000063228a47d00000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -17675,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec3400000000000000000000000011cdb59e1f91948a261d2e8926621acf54d53f1300000000000000000000000011cdb59e1f91948a261d2e8926621acf54d53f1300000000000000000000000000000000000000000000000000005bdbe51f500000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -17676,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec34000000000000000000000000b5bf8de51dc8adb18622edef0a1ce6f443eda841000000000000000000000000b5bf8de51dc8adb18622edef0a1ce6f443eda8410000000000000000000000000000000000000000000000000000640b5eece00000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -17677,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec34000000000000000000000000cf595ac2e61987f2b22146be5f6ef702078703dc000000000000000000000000cf595ac2e61987f2b22146be5f6ef702078703dc00000000000000000000000000000000000000000000000000005dad8e69700000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -17678,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec340000000000000000000000005417828ee95a0f5a2d32ad97e88701a936de307d0000000000000000000000005417828ee95a0f5a2d32ad97e88701a936de307d0000000000000000000000000000000000000000000000000000da475abf000000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -17679,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec3400000000000000000000000055d0df9f252ec80062ffc326092b3f5892a5ae3300000000000000000000000055d0df9f252ec80062ffc326092b3f5892a5ae3300000000000000000000000000000000000000000000000000005cc4b9c4600000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -17680,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec34000000000000000000000000096bb7ead27b65e3f4d449d0430169d69304631f000000000000000000000000096bb7ead27b65e3f4d449d0430169d69304631f00000000000000000000000000000000000000000000000000006150e0fdb00000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -17681,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec34000000000000000000000000dc2919189be897058e49572a4c9a6d327cb9b9bf000000000000000000000000dc2919189be897058e49572a4c9a6d327cb9b9bf0000000000000000000000000000000000000000000000000000640b5eece00000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -17682,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec3400000000000000000000000010607c953c0e84ea4deea9c9716d39e6f1a801ee00000000000000000000000010607c953c0e84ea4deea9c9716d39e6f1a801ee00000000000000000000000000000000000000000000000000006239b5a2c00000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -17683,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec34000000000000000000000000a83b5cd66634f717e6e1737e703e273ee9296813000000000000000000000000a83b5cd66634f717e6e1737e703e273ee92968130000000000000000000000000000000000000000000000000000d4e9a757880000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -17684,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec34000000000000000000000000144457a28850f5802161308179bd22523a9f2e6b000000000000000000000000144457a28850f5802161308179bd22523a9f2e6b00000000000000000000000000000000000000000000000000005bdbe51f500000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -17685,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec340000000000000000000000006ea35561e6b432f182b8b9ce7ea8361def921b940000000000000000000000006ea35561e6b432f182b8b9ce7ea8361def921b9400000000000000000000000000000000000000000000000000005af3107a400000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -17686,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec34000000000000000000000000f4209c9460d8ce4c56ccb558d0c14d8d39dd63c6000000000000000000000000f4209c9460d8ce4c56ccb558d0c14d8d39dd63c600000000000000000000000000000000000000000000000000005bdbe51f500000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -17687,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec340000000000000000000000001682eb55f4a712c9145fc4c1cca6d59e41493b510000000000000000000000001682eb55f4a712c9145fc4c1cca6d59e41493b51000000000000000000000000000000000000000000000000000060680c58a00000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -17688,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec3400000000000000000000000011a9a257bd5294e4bae1633210e1636ab145547100000000000000000000000011a9a257bd5294e4bae1633210e1636ab145547100000000000000000000000000000000000000000000000000005dad8e69700000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -17689,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec34000000000000000000000000689fcd7f101d31237c489b6e423716b72b6ef64a000000000000000000000000689fcd7f101d31237c489b6e423716b72b6ef64a00000000000000000000000000000000000000000000000000005cc4b9c4600000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -17690,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec3400000000000000000000000084081666479f10be36c5f4c41fa6706e02f3fa0c00000000000000000000000084081666479f10be36c5f4c41fa6706e02f3fa0c00000000000000000000000000000000000000000000000000005af3107a400000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -17691,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec3400000000000000000000000057a4cde8e7672372eb02f9f51a2fe2325f5a052300000000000000000000000057a4cde8e7672372eb02f9f51a2fe2325f5a05230000000000000000000000000000000000000000000000000000d5d27bfc980000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -17692,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec34000000000000000000000000e3bccd993bf5debafb948a6259f61a67715b4657000000000000000000000000e3bccd993bf5debafb948a6259f61a67715b465700000000000000000000000000000000000000000000000000005bdbe51f500000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -17693,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec34000000000000000000000000747f475a83a68d32ba92c6337460f95cd5a74d60000000000000000000000000747f475a83a68d32ba92c6337460f95cd5a74d6000000000000000000000000000000000000000000000000000a3614784bc32c900000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -17694,0xcd9d4988c0ae61887b075ba77f08cbfad2b65068,0x3f87ff1de58128ef8fcb4c807efd776e1ac72e51,0xf4f7b41a0000000000000000000000000e910a91f98ca9b5848b16d5c294645a2c4ba64300000000000000000000000000000000000000000000000a650e6d0a8be6f50e,0x6afa7b3deeead4c9b2a8631daf687946a3824e91f8b20e3755109c7680c3fad9,2021-11-23 09:04:42.000 UTC,0,true -17695,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec340000000000000000000000005776cc5782c4ca0a659f7385c14d0f52492ea5490000000000000000000000005776cc5782c4ca0a659f7385c14d0f52492ea54900000000000000000000000000000000000000000000000000005bdbe51f500000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -17696,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec34000000000000000000000000b3f1a4128d164cc1500587aabdc32d7131f3703d000000000000000000000000b3f1a4128d164cc1500587aabdc32d7131f3703d00000000000000000000000000000000000000000000000000005bdbe51f500000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -17697,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec34000000000000000000000000c1361c64d69117b4058b71e344557e5e0d0cd276000000000000000000000000c1361c64d69117b4058b71e344557e5e0d0cd276000000000000000000000000000000000000000000000000000060680c58a00000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -17698,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec34000000000000000000000000979bdc6c454b2038fe33abe90b999124ee588258000000000000000000000000979bdc6c454b2038fe33abe90b999124ee58825800000000000000000000000000000000000000000000000000005cc4b9c4600000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -17699,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec340000000000000000000000005bbe723821532eabb68e76dc12a7ca4332f609a20000000000000000000000005bbe723821532eabb68e76dc12a7ca4332f609a20000000000000000000000000000000000000000000000000000640b5eece00000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -17700,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec3400000000000000000000000003bdde7e7eb133a322ef4a39ef663098bc4d9bb100000000000000000000000003bdde7e7eb133a322ef4a39ef663098bc4d9bb100000000000000000000000000000000000000000000000000005af3107a400000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -17701,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec3400000000000000000000000026233240d673eb9953fe38001464a1d273b786e800000000000000000000000026233240d673eb9953fe38001464a1d273b786e80000000000000000000000000000000000000000000000000000d5755a20f80000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -17702,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec3400000000000000000000000082558ce1f4e88934990f82aba844898644d3fdb800000000000000000000000082558ce1f4e88934990f82aba844898644d3fdb8000000000000000000000000000000000000000000000000015d7f228069020000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -17703,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec3400000000000000000000000051b7ee88658b7d0d2a41d6d73c920ec85f444aff00000000000000000000000051b7ee88658b7d0d2a41d6d73c920ec85f444aff0000000000000000000000000000000000000000000000000000d217e0f1700000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -17704,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec3400000000000000000000000004a6938047817a26df223fc4aac88fe14ce3488c00000000000000000000000004a6938047817a26df223fc4aac88fe14ce3488c0000000000000000000000000000000000000000000000000000d300b596800000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -17705,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec34000000000000000000000000fac62c8aeac063bed226a7cfc278c126056d7c82000000000000000000000000fac62c8aeac063bed226a7cfc278c126056d7c8200000000000000000000000000000000000000000000000000005bdbe51f500000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -17706,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec340000000000000000000000008d5a9bbdf1ee8e974000dec395c73d3ce8a205b20000000000000000000000008d5a9bbdf1ee8e974000dec395c73d3ce8a205b2000000000000000000000000000000000000000000000000016345785d8a000000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -17707,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec340000000000000000000000005ac368c62141a4acbd5a48302cae2a56052730530000000000000000000000005ac368c62141a4acbd5a48302cae2a56052730530000000000000000000000000000000000000000000000000000d3468efb380000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -17708,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec34000000000000000000000000ae1b882c3455be57d40067930b6a2d9233d9330c000000000000000000000000ae1b882c3455be57d40067930b6a2d9233d9330c00000000000000000000000000000000000000000000000004064976a8dd000000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -17709,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec34000000000000000000000000caf207c77249f768cbf59af0b26b7a39ccc0ec9c000000000000000000000000caf207c77249f768cbf59af0b26b7a39ccc0ec9c0000000000000000000000000000000000000000000000000000d42f63a0480000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -17710,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec340000000000000000000000006fb9878c67cade394e00c8a7e3195f05c4f3ba700000000000000000000000006fb9878c67cade394e00c8a7e3195f05c4f3ba700000000000000000000000000000000000000000000000000000d217e0f1700000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -17711,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec340000000000000000000000003c3248a43eef8f341e6a3549354ed05024f1e6ea0000000000000000000000003c3248a43eef8f341e6a3549354ed05024f1e6ea0000000000000000000000000000000000000000000000000000d15d9d3a300000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -17712,0xcd9d4988c0ae61887b075ba77f08cbfad2b65068,0x3f87ff1de58128ef8fcb4c807efd776e1ac72e51,0xf4f7b41a000000000000000000000000ec39e27bed0d40c5bfdd8203665c0e85f18e11fb000000000000000000000000000000000000000000000000967f37f7dc333359,0x98cea5dcd4fa997186086fadedebacd4d0537bf07932fc5110e76f2a598de405,2022-02-15 11:24:39.000 UTC,0,true -17713,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0xa9f9e675000000000000000000000000dac17f958d2ee523a2206206994597c13d831ec700000000000000000000000094b008aa00579c1307b0ef2c499ad98a8ce58e5800000000000000000000000017acd2acc73685ee4a4bc28682f64965cb865c3a00000000000000000000000017acd2acc73685ee4a4bc28682f64965cb865c3a00000000000000000000000000000000000000000000000000000000306a2ccd00000000000000000000000000000000000000000000000000000000000000c00000000000000000000000000000000000000000000000000000000000000000,0x279af99476cac91cf33770e39522b24727a324f03eb05bb6c659b6c653723ca8,2021-11-26 01:39:13.000 UTC,0,true -17715,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec34000000000000000000000000b3bc73d79d21a97ae50a35af976ce4b9eb87b6f7000000000000000000000000b3bc73d79d21a97ae50a35af976ce4b9eb87b6f700000000000000000000000000000000000000000000000000005af3107a400000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -17716,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec34000000000000000000000000b8551df8f9e8029d8a951fc549c90718b4ea8248000000000000000000000000b8551df8f9e8029d8a951fc549c90718b4ea824800000000000000000000000000000000000000000000000000005af3107a400000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -17722,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec34000000000000000000000000b0381dc10bb93f63b236a9f8e3dc409fcd39d810000000000000000000000000b0381dc10bb93f63b236a9f8e3dc409fcd39d810000000000000000000000000000000000000000000000000003e8e98e5eca34300000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -17724,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0xa9f9e6750000000000000000000000002260fac5e5542a773aa44fbcfedf7c193bc2c59900000000000000000000000068f180fcce6836688e9084f035309e29bf0a2095000000000000000000000000c1c0db07907fa2eca68e9f62fac22a4fff7b8782000000000000000000000000c1c0db07907fa2eca68e9f62fac22a4fff7b8782000000000000000000000000000000000000000000000000000000000012557700000000000000000000000000000000000000000000000000000000000000c00000000000000000000000000000000000000000000000000000000000000000,,,1,true -17728,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec3400000000000000000000000080017970f4e68348b560c9acc4a0f8322decf5b900000000000000000000000080017970f4e68348b560c9acc4a0f8322decf5b900000000000000000000000000000000000000000000000000005af3107a400000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -17729,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec34000000000000000000000000da917846074acdf397e213daa701f9556a4f5618000000000000000000000000da917846074acdf397e213daa701f9556a4f561800000000000000000000000000000000000000000000000000005bdbe51f500000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -17730,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec3400000000000000000000000044e9d9473fd2cefae44e06e7b4b0c4a42024341300000000000000000000000044e9d9473fd2cefae44e06e7b4b0c4a42024341300000000000000000000000000000000000000000000000000005cc4b9c4600000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -17731,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec3400000000000000000000000062addcc4091ea31b7d9b6f91e23a791aa1add17500000000000000000000000062addcc4091ea31b7d9b6f91e23a791aa1add17500000000000000000000000000000000000000000000000000005dad8e69700000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -17732,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec3400000000000000000000000032713864132d941be23f3f6fe41441a87a80d07600000000000000000000000032713864132d941be23f3f6fe41441a87a80d07600000000000000000000000000000000000000000000000000005e96630e800000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -17733,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec340000000000000000000000000ed7a5f34d0ed6a513bec66675bd789123ef4fa80000000000000000000000000ed7a5f34d0ed6a513bec66675bd789123ef4fa800000000000000000000000000000000000000000000000000005bdbe51f500000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -17734,0xcd9d4988c0ae61887b075ba77f08cbfad2b65068,0x3f87ff1de58128ef8fcb4c807efd776e1ac72e51,0xf4f7b41a0000000000000000000000001867aa355db059d649ab84cedd7f0403d11d6a37000000000000000000000000000000000000000000000030940660a8bc5a7589,,,1,true -17735,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec340000000000000000000000002e2de0ef24d9f2d067fb49dd180dd305889691e50000000000000000000000002e2de0ef24d9f2d067fb49dd180dd305889691e500000000000000000000000000000000000000000000000000005af3107a400000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -17736,0xcd9d4988c0ae61887b075ba77f08cbfad2b65068,0x3f87ff1de58128ef8fcb4c807efd776e1ac72e51,0xf4f7b41a0000000000000000000000000d20fc3c32b213a39b0314ce804ba33aa5c6ed6f00000000000000000000000000000000000000000000000010ad87b3960ea127,,,1,true -17737,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec34000000000000000000000000722154a260198d161abde4598b9bb9f711483ea1000000000000000000000000722154a260198d161abde4598b9bb9f711483ea100000000000000000000000000000000000000000000000000005cc4b9c4600000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -17738,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec34000000000000000000000000b51e532ca2399f1d0acbc83b78768fb33a9fa50d000000000000000000000000b51e532ca2399f1d0acbc83b78768fb33a9fa50d00000000000000000000000000000000000000000000000000006150e0fdb00000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -17739,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec3400000000000000000000000015d3b70b2021603716340038d096526000caad9000000000000000000000000015d3b70b2021603716340038d096526000caad9000000000000000000000000000000000000000000000000000005cc4b9c4600000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -17740,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec34000000000000000000000000a1649324e76f33a91a9d09dcc8f1c2764bebaf6a000000000000000000000000a1649324e76f33a91a9d09dcc8f1c2764bebaf6a00000000000000000000000000000000000000000000000000005bdbe51f500000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -17741,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec340000000000000000000000001b526248ba302e9a1ab4a29261aec7cc7317a9440000000000000000000000001b526248ba302e9a1ab4a29261aec7cc7317a94400000000000000000000000000000000000000000000000000005af3107a400000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -17742,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec340000000000000000000000008f4db9b455e10895108e941232ed7281419b4dad0000000000000000000000008f4db9b455e10895108e941232ed7281419b4dad000000000000000000000000000000000000000000000000000009184e72a00000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -17743,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec34000000000000000000000000820a2b3993308fd2590f7c3d0cb25a885a7be0f6000000000000000000000000820a2b3993308fd2590f7c3d0cb25a885a7be0f60000000000000000000000000000000000000000000000000000092f96e9880000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -17744,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec34000000000000000000000000cb060cfc1662d1ff1df9299c63baaf3e7fb5515f000000000000000000000000cb060cfc1662d1ff1df9299c63baaf3e7fb5515f00000000000000000000000000000000000000000000000000000946df60700000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -17747,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec34000000000000000000000000a000d1947e1fa6fa9f3442bb5c2a365216bb0f22000000000000000000000000a000d1947e1fa6fa9f3442bb5c2a365216bb0f22000000000000000000000000000000000000000000000000001e9b97c9f58f0000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,0x5fb9aefb66c1eb8117bfd0dd8db6091fc31ca359c68c4f38aec29c7c9288d846,2021-11-26 04:15:18.000 UTC,0,true -17748,0xcd9d4988c0ae61887b075ba77f08cbfad2b65068,0x3f87ff1de58128ef8fcb4c807efd776e1ac72e51,0xf4f7b41a0000000000000000000000007b3d4f79b24d19d992f36d019a0c0e9de22afa0200000000000000000000000000000000000000000000000678c82ea01d5f4436,,,1,true -17749,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec34000000000000000000000000a98d2867de6b1dff44fe4b355dea098e81d06aeb000000000000000000000000a98d2867de6b1dff44fe4b355dea098e81d06aeb00000000000000000000000000000000000000000000000003961cfdebfe570000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -17750,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec3400000000000000000000000043548d5f1c42ea85f4cbd9d03030a3eb56e6f9a600000000000000000000000043548d5f1c42ea85f4cbd9d03030a3eb56e6f9a6000000000000000000000000000000000000000000000000002386f26fc1000000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -17752,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec34000000000000000000000000388d73beb86e297e420a5bdc6aeb43e787d02338000000000000000000000000388d73beb86e297e420a5bdc6aeb43e787d02338000000000000000000000000000000000000000000000000002386f26fc1000000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -17753,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec34000000000000000000000000370e104682930977667999c7af343ed04b77c923000000000000000000000000370e104682930977667999c7af343ed04b77c92300000000000000000000000000000000000000000000000001b778519606153800000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,0x27128ff82784f78d3230891cc2d7a8e9ab00ec2c85b3cab4c24c09212f0acf01,2021-12-14 14:22:10.000 UTC,0,true -17756,0xcd9d4988c0ae61887b075ba77f08cbfad2b65068,0x3f87ff1de58128ef8fcb4c807efd776e1ac72e51,0xf4f7b41a0000000000000000000000007ff916da10365f3456174e8250021f27b66cf9300000000000000000000000000000000000000000000000006097753aa83830bf,,,1,true -17757,0xcd9d4988c0ae61887b075ba77f08cbfad2b65068,0x3f87ff1de58128ef8fcb4c807efd776e1ac72e51,0xf4f7b41a00000000000000000000000048c3ce879d2ba290aa9dc1dcab243edad3b143050000000000000000000000000000000000000000000000001967fe394e1292d3,,,1,true -17758,0xcd9d4988c0ae61887b075ba77f08cbfad2b65068,0x3f87ff1de58128ef8fcb4c807efd776e1ac72e51,0xf4f7b41a00000000000000000000000057fb6c359c8cf9caf0ec8beac0c8b944cb63d9b80000000000000000000000000000000000000000000002bfa18b4ac514af2400,0x4f7317c1422bb0976f14e8c5b572e8ea40add2c1a2a27a849c72a68fef518bb2,2021-11-22 01:43:33.000 UTC,0,true -17759,0xcd9d4988c0ae61887b075ba77f08cbfad2b65068,0x3f87ff1de58128ef8fcb4c807efd776e1ac72e51,0xf4f7b41a000000000000000000000000f1d80f08df95f254cb7e6e075ad7265a5b85b92a000000000000000000000000000000000000000000000004a594fefcda61d57c,0xaa67680d66db50865ed3facc5a38b428c2fd190c0178a64c00fe245e9843890c,2022-03-30 20:37:07.000 UTC,0,true -17760,0xcd9d4988c0ae61887b075ba77f08cbfad2b65068,0x3f87ff1de58128ef8fcb4c807efd776e1ac72e51,0xf4f7b41a00000000000000000000000035c610124f469593469a025d712adc13f819fa5400000000000000000000000000000000000000000000000be8060f61577b3236,,,1,true -17763,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec3400000000000000000000000051004a19e236fd098ba15888b8eb6a050a3fde4000000000000000000000000051004a19e236fd098ba15888b8eb6a050a3fde40000000000000000000000000000000000000000000000000020623adcc644c7d00000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,0x35630d101d2fc72a46a2d2d3ae58fa4b028b413a708ff6617f8fb19e46fda121,2021-12-30 09:38:18.000 UTC,0,true -17766,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec340000000000000000000000003a3cfb013e07ca672329ec3e96da5eba2f780d7c0000000000000000000000003a3cfb013e07ca672329ec3e96da5eba2f780d7c0000000000000000000000000000000000000000000000000000d12f0c4c600000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -17767,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec340000000000000000000000000d87d1de05588fb27c71c9d267c15c4afa51d92b0000000000000000000000000d87d1de05588fb27c71c9d267c15c4afa51d92b0000000000000000000000000000000000000000000000000000d12f0c4c600000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -17768,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec340000000000000000000000009b73de47db0e52bc9951cef9dc3bedb1696f7c570000000000000000000000009b73de47db0e52bc9951cef9dc3bedb1696f7c570000000000000000000000000000000000000000000000000000d04637a7500000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -17769,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec34000000000000000000000000364d9fb3c4bb5e3b8c4f91e37fc1bb290013dfd8000000000000000000000000364d9fb3c4bb5e3b8c4f91e37fc1bb290013dfd800000000000000000000000000000000000000000000000001332da4e18a600000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -17773,0xcd9d4988c0ae61887b075ba77f08cbfad2b65068,0x3f87ff1de58128ef8fcb4c807efd776e1ac72e51,0xf4f7b41a000000000000000000000000b8972e9db4c65a681312b85b12827d0426b655f4000000000000000000000000000000000000000000000000052afb1baf876dfb,,,1,true -17775,0xcd9d4988c0ae61887b075ba77f08cbfad2b65068,0x3f87ff1de58128ef8fcb4c807efd776e1ac72e51,0xf4f7b41a00000000000000000000000063ff748023fbdf4dcae4ea3d11668784f176bbfb00000000000000000000000000000000000000000000000f90739fd376670000,0x6353cc64508bfa0f60146e485a2f9850d957bb9e7d912da194cd2cd6673fb7f6,2021-12-03 06:20:17.000 UTC,0,true -17776,0xcd9d4988c0ae61887b075ba77f08cbfad2b65068,0x3f87ff1de58128ef8fcb4c807efd776e1ac72e51,0xf4f7b41a000000000000000000000000b462fb0098f104e88837a46e5f4fdfb5ebff7d96000000000000000000000000000000000000000000000014998f32ac78700000,0x56e4c807e24095a15f8744dc52ca8dfd7fb428da81a76c372cd6aa892483343a,2021-12-19 21:34:31.000 UTC,0,true -17780,0xcd9d4988c0ae61887b075ba77f08cbfad2b65068,0x3f87ff1de58128ef8fcb4c807efd776e1ac72e51,0xf4f7b41a0000000000000000000000007267168be3688b533b4e815fb8c38389b33e34b500000000000000000000000000000000000000000000000054ab228d2989a16a,,,1,true -17781,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec3400000000000000000000000031a41cd29d962f56be639f35a14a6c99faf1bcb800000000000000000000000031a41cd29d962f56be639f35a14a6c99faf1bcb800000000000000000000000000000000000000000000000000ac1ef607918c0000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -17782,0xcd9d4988c0ae61887b075ba77f08cbfad2b65068,0x3f87ff1de58128ef8fcb4c807efd776e1ac72e51,0xf4f7b41a00000000000000000000000048c3ce879d2ba290aa9dc1dcab243edad3b14305000000000000000000000000000000000000000000000000ce175f96a5f14b9b,,,1,true -17783,0xcd9d4988c0ae61887b075ba77f08cbfad2b65068,0x3f87ff1de58128ef8fcb4c807efd776e1ac72e51,0xf4f7b41a00000000000000000000000043d16ccd581e1d6a8d51768f75ddf09b79f4f8560000000000000000000000000000000000000000000000001ff2f8f1b68c6529,,,1,true -17785,0xcd9d4988c0ae61887b075ba77f08cbfad2b65068,0x3f87ff1de58128ef8fcb4c807efd776e1ac72e51,0xf4f7b41a00000000000000000000000098a3da6293e56674d250fa9ada4c684dc34e4e0b00000000000000000000000000000000000000000000006eaad5974a3b2bac1c,0x4ce0094158a2bf9eded0bf7b92ff70f8dc73c8c036cdfb876327f61992e02c21,2021-12-02 07:51:12.000 UTC,0,true -17786,0xcd9d4988c0ae61887b075ba77f08cbfad2b65068,0x3f87ff1de58128ef8fcb4c807efd776e1ac72e51,0xf4f7b41a000000000000000000000000dc899fb367312f3a3a0532b8b31a0744de11968200000000000000000000000000000000000000000000000053d7c06e75ba2572,,,1,true -17787,0xcd9d4988c0ae61887b075ba77f08cbfad2b65068,0x3f87ff1de58128ef8fcb4c807efd776e1ac72e51,0xf4f7b41a0000000000000000000000001e69ef2d9be1ad7468d6a305ad01d347f12f6d400000000000000000000000000000000000000000000000002a0dd9d1b77d683e,,,1,true -17788,0xcd9d4988c0ae61887b075ba77f08cbfad2b65068,0x3f87ff1de58128ef8fcb4c807efd776e1ac72e51,0xf4f7b41a000000000000000000000000864121c7335bcd61b545b81e19757e2d7ad4263f0000000000000000000000000000000000000000000000000a219e89d25c2fac,,,1,true -17790,0xcd9d4988c0ae61887b075ba77f08cbfad2b65068,0x3f87ff1de58128ef8fcb4c807efd776e1ac72e51,0xf4f7b41a000000000000000000000000f0692d3344987619906f9299c4e0f8f43312db160000000000000000000000000000000000000000000000457bd4d3bb19d2383f,0x604d89243b4e0a0becaa5f2e3a97e047c348356734895ab67205a8253fc6ebea,2022-04-01 00:03:33.000 UTC,0,true -17791,0xcd9d4988c0ae61887b075ba77f08cbfad2b65068,0x3f87ff1de58128ef8fcb4c807efd776e1ac72e51,0xf4f7b41a0000000000000000000000000056bcfe33f5c6dfa62b6d3d3cf5a957429828bb0000000000000000000000000000000000000000000000922d9e006f3c329c3c,,,1,true -17792,0xcd9d4988c0ae61887b075ba77f08cbfad2b65068,0x3f87ff1de58128ef8fcb4c807efd776e1ac72e51,0xf4f7b41a00000000000000000000000022510fe99f63ae03ba792c21a29ec10fd87cae0800000000000000000000000000000000000000000000003d8eb4f7fe10a1d963,0x7f66c55dcef9d6264a6c3f30d182d1605037897b3af10035bc52c3a35d41f20b,2021-11-21 08:15:33.000 UTC,0,true -17794,0xcd9d4988c0ae61887b075ba77f08cbfad2b65068,0x3f87ff1de58128ef8fcb4c807efd776e1ac72e51,0xf4f7b41a0000000000000000000000007c95d0cd038e06c4152a37325d48aed406006fe300000000000000000000000000000000000000000000001eca955e9b65e00000,0x537c10e6364176e4b6616eb8d63f2e9cec3d26e807e50bc0c0b2de5689848607,2021-12-06 13:38:54.000 UTC,0,true -17795,0xcd9d4988c0ae61887b075ba77f08cbfad2b65068,0x3f87ff1de58128ef8fcb4c807efd776e1ac72e51,0xf4f7b41a000000000000000000000000fc830cd343857a3befc4dc53828846ce97ca13a900000000000000000000000000000000000000000000001ae9841c04024c8182,0x18de24dcbea5428dc53fba4a843f0bec556b4935184198e2f2a3b5bd25416b55,2022-01-04 14:10:11.000 UTC,0,true -17796,0xb8901acb165ed027e32754e0ffe830802919727f,0x83f6244bd87662118d96d9a6d44f09dfff14b30e,0xef6ebe5e000000000000000000000000000000000000000000000000000000000000000a0ac9d14049246430921aa9c23f12a20a1b88edf77c3dc89f68795c5cdf32fc8b000000000000000000000000000000000000000000000000000000000000000100000000000000000000000000000000000000000000000373ea25ad2ca66b780000000000000000000000000000000000000000000000000000000061840df0,,,1,true -17797,0x3d4cc8a61c7528fd86c55cfe061a78dcba48edd1,0x7191061d5d4c60f598214cc6913502184baddf18,0xef6ebe5e000000000000000000000000000000000000000000000000000000000000000a1d198484f8ebf55f2ba49dcd64b24031069cddb5e09776f57be566394d69f817000000000000000000000000000000000000000000000000000000000000a4b10000000000000000000000000000000000000000000013a29300b6604b6951da0000000000000000000000000000000000000000000000000000000061841b96,,,1,true -17798,0xcd9d4988c0ae61887b075ba77f08cbfad2b65068,0x3f87ff1de58128ef8fcb4c807efd776e1ac72e51,0xf4f7b41a0000000000000000000000008705e42eb5cbf3581fc1716dffebb88f20dc6626000000000000000000000000000000000000000000000008751aac59e6aafcf1,0xf58ee4737252966e691115c589a87533daf6bd75207e4b56150b173d10fbbe09,2021-11-27 19:21:56.000 UTC,0,true -17799,0x3666f603cc164936c1b87e207f36beba4ac5f18a,0xa81d244a1814468c734e5b4101f7b9c0c577a8fc,0xef6ebe5e000000000000000000000000000000000000000000000000000000000000000ae002060bf60efcba93cc32236e45da2b1067d640c3a9f43eb2b0a982eadcd71e00000000000000000000000000000000000000000000000000000000000000890000000000000000000000000000000000000000000000000000003531e8b22d0000000000000000000000000000000000000000000000000000000061846454,,,1,true -17800,0xcd9d4988c0ae61887b075ba77f08cbfad2b65068,0x3f87ff1de58128ef8fcb4c807efd776e1ac72e51,0xf4f7b41a000000000000000000000000142a39c156f814aa0c5d54f4636c4e5fec708b8700000000000000000000000000000000000000000000002a54bf87c5ff470000,0x9d46d96587ea4323fc6417afa72c27efe145ce76b932620b181166aae5f082c1,2021-11-23 05:51:28.000 UTC,0,true -17801,0xb8901acb165ed027e32754e0ffe830802919727f,0x83f6244bd87662118d96d9a6d44f09dfff14b30e,0xef6ebe5e000000000000000000000000000000000000000000000000000000000000000a8df3be8957a6b70db6353c4e1ddf58f05d089a02d80b7009e7088718913ffbd9000000000000000000000000000000000000000000000000000000000000a4b10000000000000000000000000000000000000000000000023145bc97697a33700000000000000000000000000000000000000000000000000000000061848206,,,1,true -17802,0xcd9d4988c0ae61887b075ba77f08cbfad2b65068,0x3f87ff1de58128ef8fcb4c807efd776e1ac72e51,0xf4f7b41a00000000000000000000000000efa5c7ba17a797a867820ffd51b890125bda3600000000000000000000000000000000000000000000002870d46785c9680000,0x61f0a5c9956e24989160fc7df5156de1e3c98f278ac15ea043fb05b2d592cc19,2022-02-13 20:28:36.000 UTC,0,true -17803,0xcd9d4988c0ae61887b075ba77f08cbfad2b65068,0x3f87ff1de58128ef8fcb4c807efd776e1ac72e51,0xf4f7b41a00000000000000000000000028a2106e8005336adddf006d790608e2a8853d740000000000000000000000000000000000000000000000410f9c5fdf48a2ba37,0x6237f01973017cf8aadf2fb45d98f42f1cdb7e6d3ccee2dd62029be725c6802c,2021-11-21 11:59:42.000 UTC,0,true -17804,0x3d4cc8a61c7528fd86c55cfe061a78dcba48edd1,0x7191061d5d4c60f598214cc6913502184baddf18,0xef6ebe5e000000000000000000000000000000000000000000000000000000000000000ac4264f89b9a32664405896f8b1b8347b308b8db97e69ba770e86368f4ea15fe8000000000000000000000000000000000000000000000000000000000000000100000000000000000000000000000000000000000000211b73c4314ee2afff3e000000000000000000000000000000000000000000000000000000006184c052,,,1,true -17805,0x3e4a3a4796d16c0cd582c382691998f7c06420b6,0x46ae9bab8cea96610807a275ebd36f8e916b5c61,0xef6ebe5e000000000000000000000000000000000000000000000000000000000000000ad45d93738601e54d2bd02b758c72598ea20b84ed6da07f981dc26a4978a91c7a000000000000000000000000000000000000000000000000000000000000a4b100000000000000000000000000000000000000000000000000000018a2c377dd0000000000000000000000000000000000000000000000000000000061850694,,,1,true -17806,0x3e4a3a4796d16c0cd582c382691998f7c06420b6,0x46ae9bab8cea96610807a275ebd36f8e916b5c61,0xef6ebe5e000000000000000000000000000000000000000000000000000000000000000a1a793500fe911e8d9320f1c9c3885fa913d0534c54d018d08c0c626a3e3bfb28000000000000000000000000000000000000000000000000000000000000a4b10000000000000000000000000000000000000000000000000000002e77151a100000000000000000000000000000000000000000000000000000000061851dfb,,,1,true -17807,0xb8901acb165ed027e32754e0ffe830802919727f,0x83f6244bd87662118d96d9a6d44f09dfff14b30e,0xef6ebe5e000000000000000000000000000000000000000000000000000000000000000a4c26d3e35f39b7e73a2d05cf72b13546de5d2afb0ba62844d85b182d1c8065440000000000000000000000000000000000000000000000000000000000000001000000000000000000000000000000000000000000000002bf58d12bbbd03ae10000000000000000000000000000000000000000000000000000000061853d13,,,1,true -17808,0x3666f603cc164936c1b87e207f36beba4ac5f18a,0xa81d244a1814468c734e5b4101f7b9c0c577a8fc,0xef6ebe5e000000000000000000000000000000000000000000000000000000000000000ad0b0c39d7fd65a0b0d4abdd57e19513597c5444061f5656b700a3adf56bcf951000000000000000000000000000000000000000000000000000000000000a4b100000000000000000000000000000000000000000000000000000011b7065f8d0000000000000000000000000000000000000000000000000000000061854b35,,,1,true -17809,0xb8901acb165ed027e32754e0ffe830802919727f,0x83f6244bd87662118d96d9a6d44f09dfff14b30e,0xef6ebe5e000000000000000000000000000000000000000000000000000000000000000a84cc5c71c7112454b9d18daf1e2c5b6795e9fef5dc4df77a2dd9e29a0e503776000000000000000000000000000000000000000000000000000000000000a4b10000000000000000000000000000000000000000000000022e4f17db638f34020000000000000000000000000000000000000000000000000000000061856f10,,,1,true -17810,0x3e4a3a4796d16c0cd582c382691998f7c06420b6,0x46ae9bab8cea96610807a275ebd36f8e916b5c61,0xef6ebe5e000000000000000000000000000000000000000000000000000000000000000ae4a1d9ddfe3222aa7784a2018ef387dcb271cb5031fa285e212d8dc2e4232016000000000000000000000000000000000000000000000000000000000000a4b10000000000000000000000000000000000000000000000000000001721aba46500000000000000000000000000000000000000000000000000000000618577e1,,,1,true -17811,0xcd9d4988c0ae61887b075ba77f08cbfad2b65068,0x3f87ff1de58128ef8fcb4c807efd776e1ac72e51,0xf4f7b41a000000000000000000000000b35e598fc643037facde62dba4343e99f62949580000000000000000000000000000000000000000000000208b536eef913758d6,0x44ffc9898569234d8ee9f7062301e1da06d865cbe5782785be0f511198e48315,2021-11-23 18:52:46.000 UTC,0,true -17812,0x3666f603cc164936c1b87e207f36beba4ac5f18a,0xa81d244a1814468c734e5b4101f7b9c0c577a8fc,0xef6ebe5e000000000000000000000000000000000000000000000000000000000000000a1d35ba3ccc771fc403862804eec055082a21374e2b73af3f38a88906648e5ab1000000000000000000000000000000000000000000000000000000000000008900000000000000000000000000000000000000000000000000000013d3ee1214000000000000000000000000000000000000000000000000000000006185a677,,,1,true -17813,0x3e4a3a4796d16c0cd582c382691998f7c06420b6,0x46ae9bab8cea96610807a275ebd36f8e916b5c61,0xef6ebe5e000000000000000000000000000000000000000000000000000000000000000a563f1e3292bbbc3b115206e4dd509e06ca76af5e1b90cde69f5c85fd4aac3ead00000000000000000000000000000000000000000000000000000000000000010000000000000000000000000000000000000000000000000000004546a23e3f000000000000000000000000000000000000000000000000000000006185af5a,,,1,true -17814,0xb8901acb165ed027e32754e0ffe830802919727f,0x83f6244bd87662118d96d9a6d44f09dfff14b30e,0xef6ebe5e000000000000000000000000000000000000000000000000000000000000000af542914015967cff7bfbf3f44c18697e82487667b3e021c1601d72fff30ce5420000000000000000000000000000000000000000000000000000000000000001000000000000000000000000000000000000000000000002ba1762468901801c000000000000000000000000000000000000000000000000000000006185c7d5,,,1,true -17815,0x3666f603cc164936c1b87e207f36beba4ac5f18a,0xa81d244a1814468c734e5b4101f7b9c0c577a8fc,0xef6ebe5e000000000000000000000000000000000000000000000000000000000000000ab01bbcff132c8c3cf591da6f138837df4fed064337d94a9bcc1fa974138a4b8e000000000000000000000000000000000000000000000000000000000000a4b10000000000000000000000000000000000000000000000000000002c4e59dde90000000000000000000000000000000000000000000000000000000061861e6a,,,1,true -17816,0xcd9d4988c0ae61887b075ba77f08cbfad2b65068,0x3f87ff1de58128ef8fcb4c807efd776e1ac72e51,0xf4f7b41a000000000000000000000000d63154abc9c6655626f16f0aed41c2e9584107240000000000000000000000000000000000000000000000079ca3466dcc4e60ce,0x31c236a106a92cb9df085b4317bd485e09f0fe94893389869597bf667707c2d9,2021-11-23 07:53:08.000 UTC,0,true -17817,0xcd9d4988c0ae61887b075ba77f08cbfad2b65068,0x3f87ff1de58128ef8fcb4c807efd776e1ac72e51,0xf4f7b41a000000000000000000000000d63154abc9c6655626f16f0aed41c2e95841072400000000000000000000000000000000000000000000000a4ad21867b32d494d,0x9c8b2798285122b1b3d4795bbc410209806f5caf5372e47f6c35b866e6b055c0,2021-11-23 07:58:16.000 UTC,0,true -17818,0x3d4cc8a61c7528fd86c55cfe061a78dcba48edd1,0x7191061d5d4c60f598214cc6913502184baddf18,0xef6ebe5e000000000000000000000000000000000000000000000000000000000000000ad58f678b4b4baa90c95bb49e72c75b1bfba2b27a26f76df8e0d9445e080ec4fb00000000000000000000000000000000000000000000000000000000000000890000000000000000000000000000000000000000000014bb4b00945ec5e500850000000000000000000000000000000000000000000000000000000061864541,,,1,true -17819,0xcd9d4988c0ae61887b075ba77f08cbfad2b65068,0x3f87ff1de58128ef8fcb4c807efd776e1ac72e51,0xf4f7b41a000000000000000000000000f1d80f08df95f254cb7e6e075ad7265a5b85b92a000000000000000000000000000000000000000000000003ceb4ffbba54b5e64,0x5f8a75dcd0448f90ec776cfc61bb63a076f0559f0c075fa8ba77c15644712c36,2022-03-30 20:31:55.000 UTC,0,true -17820,0xcd9d4988c0ae61887b075ba77f08cbfad2b65068,0x3f87ff1de58128ef8fcb4c807efd776e1ac72e51,0xf4f7b41a000000000000000000000000f1d80f08df95f254cb7e6e075ad7265a5b85b92a0000000000000000000000000000000000000000000000001878e9d03ee7add6,0x74da62aab0a5b96997c52e12e008dab59344d6a9159e85161ef7d0e2ea0345d6,2022-03-20 18:50:51.000 UTC,0,true -17821,0xcd9d4988c0ae61887b075ba77f08cbfad2b65068,0x3f87ff1de58128ef8fcb4c807efd776e1ac72e51,0xf4f7b41a000000000000000000000000afb2e085915aed02d3299de33edc28e5a1b62e0f0000000000000000000000000000000000000000000000234448c0b680431ab4,0xbf5ea6c90c4be16b61eb1193378eb01fc8b648d4b5d00a3851b32b631b39c8a5,2021-11-23 12:22:27.000 UTC,0,true -17822,0xb8901acb165ed027e32754e0ffe830802919727f,0x83f6244bd87662118d96d9a6d44f09dfff14b30e,0xef6ebe5e000000000000000000000000000000000000000000000000000000000000000a9acffbe77f99d488b20e48d6ecfe9cfcd287a9cf55dcee377c3986d35bd8d63b0000000000000000000000000000000000000000000000000000000000000001000000000000000000000000000000000000000000000002ff327d126540c2620000000000000000000000000000000000000000000000000000000061868a50,,,1,true -17823,0xb8901acb165ed027e32754e0ffe830802919727f,0x83f6244bd87662118d96d9a6d44f09dfff14b30e,0xef6ebe5e000000000000000000000000000000000000000000000000000000000000000aab2915687e6d20c40470c2a3720887fd0150129950c471525a4cf291ce73787e000000000000000000000000000000000000000000000000000000000000a4b100000000000000000000000000000000000000000000000077c1ef3185dcb479000000000000000000000000000000000000000000000000000000006186a2b7,,,1,true -17824,0xb8901acb165ed027e32754e0ffe830802919727f,0x83f6244bd87662118d96d9a6d44f09dfff14b30e,0xef6ebe5e000000000000000000000000000000000000000000000000000000000000000a827f20e17d9a86460f19637daa2f01032e625ba1691c378f711866595c01e06f00000000000000000000000000000000000000000000000000000000000000890000000000000000000000000000000000000000000000026d199654bf01a78e000000000000000000000000000000000000000000000000000000006186b5ea,,,1,true -17825,0xcd9d4988c0ae61887b075ba77f08cbfad2b65068,0x3f87ff1de58128ef8fcb4c807efd776e1ac72e51,0xf4f7b41a0000000000000000000000007a0c7c84ec066b14f83d127bff2b7f46094b62260000000000000000000000000000000000000000000000001215d6c864e1cf35,,,1,true -17826,0xcd9d4988c0ae61887b075ba77f08cbfad2b65068,0x3f87ff1de58128ef8fcb4c807efd776e1ac72e51,0xf4f7b41a00000000000000000000000051bc9862ad17023fa88435f51fcaa6e677b2ca97000000000000000000000000000000000000000000000001566c010a90e7a32a,,,1,true -17827,0x3666f603cc164936c1b87e207f36beba4ac5f18a,0xa81d244a1814468c734e5b4101f7b9c0c577a8fc,0xef6ebe5e000000000000000000000000000000000000000000000000000000000000000afcf398abc919194b05082fcee0c697dda2072bb882e80eeaff6ca689b91d3442000000000000000000000000000000000000000000000000000000000000a4b100000000000000000000000000000000000000000000000000000018eaedf4c0000000000000000000000000000000000000000000000000000000006186d948,,,1,true -17828,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec340000000000000000000000004200000000000000000000000000000000000011000000000000000000000000391716d440c151c42cdf1c95c1d83a5427bca52c000000000000000000000000000000000000000000000006aea892f4972ac98000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,0xff844a28eb2b787a114128783b1fcb038f19305d8cd2d10c0b7240c7c24dc012,2021-11-23 18:38:24.000 UTC,0,true -17829,0xb8901acb165ed027e32754e0ffe830802919727f,0x83f6244bd87662118d96d9a6d44f09dfff14b30e,0xef6ebe5e000000000000000000000000000000000000000000000000000000000000000a83f064178cc8ba6c1c9e58de3614c0fa0d0dee3792f1c649b32d781f4af35ab60000000000000000000000000000000000000000000000000000000000000001000000000000000000000000000000000000000000000002ba70c91dd3dacfcd000000000000000000000000000000000000000000000000000000006186fb47,,,1,true -17830,0x3666f603cc164936c1b87e207f36beba4ac5f18a,0xa81d244a1814468c734e5b4101f7b9c0c577a8fc,0xef6ebe5e000000000000000000000000000000000000000000000000000000000000000a3da1da846925d85e1c17eca3d8ecdbda21bbdcba4e03d2bdfbbbff858e2098fa000000000000000000000000000000000000000000000000000000000000a4b1000000000000000000000000000000000000000000000000000000179bc8f65c00000000000000000000000000000000000000000000000000000000618719d8,,,1,true -17831,0xcd9d4988c0ae61887b075ba77f08cbfad2b65068,0x3f87ff1de58128ef8fcb4c807efd776e1ac72e51,0xf4f7b41a0000000000000000000000002d83fa3eff5c3a397b2ba6ae62d1563dda1db3e500000000000000000000000000000000000000000000016eabbe7d3411ed8286,0xa8b8b8c6f8c083332c371848b03e8c45ce1a2efb4b503e88a5b08b539fdd5095,2021-11-25 01:59:54.000 UTC,0,true -17832,0xcd9d4988c0ae61887b075ba77f08cbfad2b65068,0x3f87ff1de58128ef8fcb4c807efd776e1ac72e51,0xf4f7b41a0000000000000000000000003a15459851b5346677bf9f7d3f8b2a8233eadaad0000000000000000000000000000000000000000000000894b0cf091a4e30000,0xaed8b92a88a536dbc4aa89be6738cd2f9453f39a3573750eb62e55d389fb4b31,2022-01-21 02:53:56.000 UTC,0,true -17833,0xcd9d4988c0ae61887b075ba77f08cbfad2b65068,0x3f87ff1de58128ef8fcb4c807efd776e1ac72e51,0xf4f7b41a000000000000000000000000d519060280a35c8cc069f9656edf60ae9cfad2e500000000000000000000000000000000000000000000000df39ca58b84abc1f6,0xf47604aa713be97816d529b42dc897b9e5babe7f0419283c5b3fd4cb13fd6ab9,2021-12-07 04:40:48.000 UTC,0,true -17834,0x3d4cc8a61c7528fd86c55cfe061a78dcba48edd1,0x7191061d5d4c60f598214cc6913502184baddf18,0xef6ebe5e000000000000000000000000000000000000000000000000000000000000000a9d57315ac7326d8cc06a91979683505e101cf005d98a4ce663ad6fc390034af50000000000000000000000000000000000000000000000000000000000000001000000000000000000000000000000000000000000001d1ba6f6bae94b549c320000000000000000000000000000000000000000000000000000000061877949,,,1,true -17835,0xcd9d4988c0ae61887b075ba77f08cbfad2b65068,0x3f87ff1de58128ef8fcb4c807efd776e1ac72e51,0xf4f7b41a0000000000000000000000006cd28541d19ff437df6edd4555443d9e92d911960000000000000000000000000000000000000000000000000708672312b02628,,,1,true -17836,0xb8901acb165ed027e32754e0ffe830802919727f,0x83f6244bd87662118d96d9a6d44f09dfff14b30e,0xef6ebe5e000000000000000000000000000000000000000000000000000000000000000ac0e238c1b55c0e1e6e4fc08ca2a697e8f29a4532a2a85d050ecba3265794d1b80000000000000000000000000000000000000000000000000000000000000001000000000000000000000000000000000000000000000002b73a1947c9b4ab7f000000000000000000000000000000000000000000000000000000006187932e,,,1,true -17837,0x3666f603cc164936c1b87e207f36beba4ac5f18a,0xa81d244a1814468c734e5b4101f7b9c0c577a8fc,0xef6ebe5e000000000000000000000000000000000000000000000000000000000000000a4f8569080387e7fcd050a74eb2682693b16a2236cfbffdd94eeb504151f10bbe00000000000000000000000000000000000000000000000000000000000000890000000000000000000000000000000000000000000000000000002e62ccbb5900000000000000000000000000000000000000000000000000000000618797ae,,,1,true -17838,0x3666f603cc164936c1b87e207f36beba4ac5f18a,0xa81d244a1814468c734e5b4101f7b9c0c577a8fc,0xef6ebe5e000000000000000000000000000000000000000000000000000000000000000a012c5c5e44a7beadb8a2a42701707a61e507d324374bd12dfbef74862a659291000000000000000000000000000000000000000000000000000000000000000100000000000000000000000000000000000000000000000000000020ffc6a92a000000000000000000000000000000000000000000000000000000006187c933,,,1,true -17839,0xcd9d4988c0ae61887b075ba77f08cbfad2b65068,0x3f87ff1de58128ef8fcb4c807efd776e1ac72e51,0xf4f7b41a000000000000000000000000bf3e7b8049d880ed408589db5221419a4680afa6000000000000000000000000000000000000000000000000023afbb33ae9c72d,,,1,true -17840,0xcd9d4988c0ae61887b075ba77f08cbfad2b65068,0x3f87ff1de58128ef8fcb4c807efd776e1ac72e51,0xf4f7b41a00000000000000000000000081a93e9494925347241a8966278fceb4167d9b0c00000000000000000000000000000000000000000000000086df1e119ba4a8bd,,,1,true -17841,0xb8901acb165ed027e32754e0ffe830802919727f,0x83f6244bd87662118d96d9a6d44f09dfff14b30e,0xef6ebe5e000000000000000000000000000000000000000000000000000000000000000abecb0f669c30161318fc60d3d2fe9e857f305e38bd6d1ae486a1ab78452e28840000000000000000000000000000000000000000000000000000000000000001000000000000000000000000000000000000000000000002bbba967a8cbd4cf5000000000000000000000000000000000000000000000000000000006188190f,,,1,true -17842,0xcd9d4988c0ae61887b075ba77f08cbfad2b65068,0x3f87ff1de58128ef8fcb4c807efd776e1ac72e51,0xf4f7b41a0000000000000000000000003f01940c87f09a351d422022d61bca0b682755c800000000000000000000000000000000000000000000001d049745e72ce36dce,0x1a20d6e6b8c2bc701e4b557bbb191da955cd63487d5cc82a8dfd02c7fadc45c8,2021-11-23 15:55:49.000 UTC,0,true -17843,0xcd9d4988c0ae61887b075ba77f08cbfad2b65068,0x3f87ff1de58128ef8fcb4c807efd776e1ac72e51,0xf4f7b41a0000000000000000000000005163d2109ac93b447828789b8df537bc9fa3bf1900000000000000000000000000000000000000000000000c48400cb7b99010a4,0x21a27e066f54f21127e9c5ec46df304a3dd87e205d9aec941b96394ef260aefa,2021-11-28 16:24:04.000 UTC,0,true -17844,0xcd9d4988c0ae61887b075ba77f08cbfad2b65068,0x3f87ff1de58128ef8fcb4c807efd776e1ac72e51,0xf4f7b41a0000000000000000000000004d4902bd7e080159964f46b10feeb6482d148e5a00000000000000000000000000000000000000000000066a58bb42696e41be42,0xac82fbc035aa320792efab3ddea869819bcf3bb45c4172a62a7128ad3600cae2,2021-11-26 14:47:28.000 UTC,0,true -17845,0xcd9d4988c0ae61887b075ba77f08cbfad2b65068,0x3f87ff1de58128ef8fcb4c807efd776e1ac72e51,0xf4f7b41a000000000000000000000000df91e8eb4208ab196bdcf2dcf4c669951528e6d10000000000000000000000000000000000000000000000007863ca89b2838000,,,1,true -17846,0xcd9d4988c0ae61887b075ba77f08cbfad2b65068,0x3f87ff1de58128ef8fcb4c807efd776e1ac72e51,0xf4f7b41a000000000000000000000000ea16545cf2e4c30b38b156cda0972be63ce71d500000000000000000000000000000000000000000000000059690f85313498eb2,,,1,true -17847,0xb8901acb165ed027e32754e0ffe830802919727f,0x83f6244bd87662118d96d9a6d44f09dfff14b30e,0xef6ebe5e000000000000000000000000000000000000000000000000000000000000000a96914168f96bb7f9d19796c60b4a0bd2914a09ee31ee36be9e83dbfff75a8a920000000000000000000000000000000000000000000000000000000000000089000000000000000000000000000000000000000000000002314f6592167acab70000000000000000000000000000000000000000000000000000000061887932,,,1,true -17848,0xcd9d4988c0ae61887b075ba77f08cbfad2b65068,0x3f87ff1de58128ef8fcb4c807efd776e1ac72e51,0xf4f7b41a000000000000000000000000b0c7ad67ab0ce69a370973f6248713ab2e7878490000000000000000000000000000000000000000000000590f2f832549c71c36,,,1,true -17849,0xcd9d4988c0ae61887b075ba77f08cbfad2b65068,0x3f87ff1de58128ef8fcb4c807efd776e1ac72e51,0xf4f7b41a000000000000000000000000f43f2416f41b0b58086ff06040115b9522dfbe8c0000000000000000000000000000000000000000000000456bdcdeaf07022ce2,0xe906d20e0fa3b5cb64b836e89e55e3835a4841c2626734eb7f11937e215ebc05,2021-12-30 03:46:04.000 UTC,0,true -17850,0xcd9d4988c0ae61887b075ba77f08cbfad2b65068,0x3f87ff1de58128ef8fcb4c807efd776e1ac72e51,0xf4f7b41a000000000000000000000000928efa31db4d805dc355945a5ab3c8c7a8db2fe200000000000000000000000000000000000000000000000d8192d01d51a05905,0x067d050acc8813f7b3c42a34456d1d74d2e6c126120e27b7a345fa5594d5dcdb,2021-11-29 18:34:56.000 UTC,0,true -17851,0xb8901acb165ed027e32754e0ffe830802919727f,0x83f6244bd87662118d96d9a6d44f09dfff14b30e,0xef6ebe5e000000000000000000000000000000000000000000000000000000000000000a1bfb01220659328f9379ef2dab7356c98889c3f0db57920aa7ee491cd8d3ad60000000000000000000000000000000000000000000000000000000000000a4b100000000000000000000000000000000000000000000000242923cdb2cf6116c000000000000000000000000000000000000000000000000000000006188b515,,,1,true -17852,0xb8901acb165ed027e32754e0ffe830802919727f,0x83f6244bd87662118d96d9a6d44f09dfff14b30e,0xef6ebe5e000000000000000000000000000000000000000000000000000000000000000a2330e9c4571636eb0ef16681c993d7b64b97b44be71b8ffb89543fe23b27e3070000000000000000000000000000000000000000000000000000000000000001000000000000000000000000000000000000000000000002ecdfd973ea65a76a000000000000000000000000000000000000000000000000000000006188ebcb,,,1,true -17853,0xcd9d4988c0ae61887b075ba77f08cbfad2b65068,0x3f87ff1de58128ef8fcb4c807efd776e1ac72e51,0xf4f7b41a000000000000000000000000cb016db66774bd5dd798fc3ac9c3bfcc06d68c8400000000000000000000000000000000000000000000001dd0c885f9a0d80000,0x6ed08fd1e8ab3aeef3631e02c30f1e48a33278a4db584689f2608266d328e5d8,2021-11-24 10:30:22.000 UTC,0,true -17854,0xcd9d4988c0ae61887b075ba77f08cbfad2b65068,0x3f87ff1de58128ef8fcb4c807efd776e1ac72e51,0xf4f7b41a000000000000000000000000208b82b04449cd51803fae4b1561450ba13d951000000000000000000000000000000000000000000000002adc029a4462c50129,0x8fd14221691ba604ac3c39f6d861d26c1907de44350c4a6c1dfc6f3671e8d31f,2021-11-22 14:00:36.000 UTC,0,true -17855,0xcd9d4988c0ae61887b075ba77f08cbfad2b65068,0x3f87ff1de58128ef8fcb4c807efd776e1ac72e51,0xf4f7b41a000000000000000000000000461b4b406d7a366a965bfd455c013de70aa12a6b00000000000000000000000000000000000000000000003d9a6be04c94691f18,0x09e70d427f693e8c07516c18a314bd1d4f58d03403400fad4d8259087e936c7e,2021-11-22 14:05:51.000 UTC,0,true -17856,0xcd9d4988c0ae61887b075ba77f08cbfad2b65068,0x3f87ff1de58128ef8fcb4c807efd776e1ac72e51,0xf4f7b41a000000000000000000000000d5096b4d21abd25d0d3e0cf9e2ff7a840b20290600000000000000000000000000000000000000000000001d5aa492a3db56cb66,,,1,true -17857,0xcd9d4988c0ae61887b075ba77f08cbfad2b65068,0x3f87ff1de58128ef8fcb4c807efd776e1ac72e51,0xf4f7b41a0000000000000000000000001a9b6546a6c01c7cd4f7bcba968335382815a730000000000000000000000000000000000000000000000000471a0a73866cf2e4,,,1,true -17858,0xcd9d4988c0ae61887b075ba77f08cbfad2b65068,0x3f87ff1de58128ef8fcb4c807efd776e1ac72e51,0xf4f7b41a000000000000000000000000cc02538fdaee643a36a87adefa7286fef154a1c30000000000000000000000000000000000000000000000003012bc3cb7a62990,,,1,true -17859,0x3666f603cc164936c1b87e207f36beba4ac5f18a,0xa81d244a1814468c734e5b4101f7b9c0c577a8fc,0xef6ebe5e000000000000000000000000000000000000000000000000000000000000000af1f81936c6900d7c94c021d6aea7be8c85cf33b6afc81a8ef684549c372e7a8000000000000000000000000000000000000000000000000000000000000000010000000000000000000000000000000000000000000000000000001d82667b6f0000000000000000000000000000000000000000000000000000000061893532,,,1,true -17860,0xb8901acb165ed027e32754e0ffe830802919727f,0x83f6244bd87662118d96d9a6d44f09dfff14b30e,0xef6ebe5e000000000000000000000000000000000000000000000000000000000000000a729bc3f5620b63c15b2fad19828b5f87f6c28f221068939043405b2b04c29626000000000000000000000000000000000000000000000000000000000000a4b10000000000000000000000000000000000000000000000029cd62f02cb6f96bb0000000000000000000000000000000000000000000000000000000061893b54,,,1,true -17861,0xcd9d4988c0ae61887b075ba77f08cbfad2b65068,0x3f87ff1de58128ef8fcb4c807efd776e1ac72e51,0xf4f7b41a000000000000000000000000a423fe4cfb811e9cf6a61a02e80e372c0970d4b000000000000000000000000000000000000000000000005a4b9fb8fd64e3db19,,,1,true -17862,0xb8901acb165ed027e32754e0ffe830802919727f,0x83f6244bd87662118d96d9a6d44f09dfff14b30e,0xef6ebe5e000000000000000000000000000000000000000000000000000000000000000ae829c81a24c014d17d529ab69309481d3c57784a146d31994552022330ff34b7000000000000000000000000000000000000000000000000000000000000a4b1000000000000000000000000000000000000000000000000d46e7aced2e3e5f800000000000000000000000000000000000000000000000000000000618976e2,0xf474168ff02289064f265af1a1cb0b8804b644f50adaf9d860c6ab241fad77fc,2022-01-08 16:52:48.000 UTC,0,true -17863,0xb8901acb165ed027e32754e0ffe830802919727f,0x83f6244bd87662118d96d9a6d44f09dfff14b30e,0xef6ebe5e000000000000000000000000000000000000000000000000000000000000000a3af969e3fe25f4b37a38371091bfc69cf139299bf795714ee636c8ce4fa6f5b40000000000000000000000000000000000000000000000000000000000000001000000000000000000000000000000000000000000000002c2ec03fa86dc613300000000000000000000000000000000000000000000000000000000618995e2,,,1,true -17864,0xcd9d4988c0ae61887b075ba77f08cbfad2b65068,0x3f87ff1de58128ef8fcb4c807efd776e1ac72e51,0xf4f7b41a0000000000000000000000007f5a1afefe061395bdad9256251d16b70ea27733000000000000000000000000000000000000000000000004953262f17bed1f25,,,1,true -17865,0xb8901acb165ed027e32754e0ffe830802919727f,0x83f6244bd87662118d96d9a6d44f09dfff14b30e,0xef6ebe5e000000000000000000000000000000000000000000000000000000000000000a07cb3b4d0246d68af81e5ba78d3714726679116137b4c426be9695730daff61a000000000000000000000000000000000000000000000000000000000000a4b100000000000000000000000000000000000000000000000116e4d62043338d71000000000000000000000000000000000000000000000000000000006189a89e,,,1,true -17866,0xb8901acb165ed027e32754e0ffe830802919727f,0x83f6244bd87662118d96d9a6d44f09dfff14b30e,0xef6ebe5e000000000000000000000000000000000000000000000000000000000000000a4a9bfe4f60a922fce15d8883e655eaa618635eeae982eaa452cf4476ec7fae030000000000000000000000000000000000000000000000000000000000000089000000000000000000000000000000000000000000000000ca4355eb5a024687000000000000000000000000000000000000000000000000000000006189af88,,,1,true -17867,0x3666f603cc164936c1b87e207f36beba4ac5f18a,0xa81d244a1814468c734e5b4101f7b9c0c577a8fc,0xef6ebe5e000000000000000000000000000000000000000000000000000000000000000ae6d07c9338010f34bbf389ab4e62d1ba22f3fa829ecafad905ab9625510058bb0000000000000000000000000000000000000000000000000000000000000064000000000000000000000000000000000000000000000000000000072f8d6cb5000000000000000000000000000000000000000000000000000000006189bbde,,,1,true -17868,0x3666f603cc164936c1b87e207f36beba4ac5f18a,0xa81d244a1814468c734e5b4101f7b9c0c577a8fc,0xef6ebe5e000000000000000000000000000000000000000000000000000000000000000ac37401063bfbfe6eae98b8c81a4eb032e1e1d23494a4992d0da23dfe9611c9a300000000000000000000000000000000000000000000000000000000000000890000000000000000000000000000000000000000000000000000001203b771d100000000000000000000000000000000000000000000000000000000618a053e,,,1,true -17869,0xb8901acb165ed027e32754e0ffe830802919727f,0x83f6244bd87662118d96d9a6d44f09dfff14b30e,0xef6ebe5e000000000000000000000000000000000000000000000000000000000000000a088b33a098c33e7ee5f34505b75193bd404876d736c0c30914f2d408054ced23000000000000000000000000000000000000000000000000000000000000a4b10000000000000000000000000000000000000000000000022d239e62fda3978f00000000000000000000000000000000000000000000000000000000618a1c0f,,,1,true -17870,0xcd9d4988c0ae61887b075ba77f08cbfad2b65068,0x3f87ff1de58128ef8fcb4c807efd776e1ac72e51,0xf4f7b41a00000000000000000000000074d47619ce2245b65b0309e637e1144f2ae1053400000000000000000000000000000000000000000000000110bd8a4336cfe0c4,,,1,true -17871,0xcd9d4988c0ae61887b075ba77f08cbfad2b65068,0x3f87ff1de58128ef8fcb4c807efd776e1ac72e51,0xf4f7b41a0000000000000000000000005db06883736a244cb14dbd51eeb3c6ac3d207b8d00000000000000000000000000000000000000000000000779e3395d14db9dfe,,,1,true -17872,0xcd9d4988c0ae61887b075ba77f08cbfad2b65068,0x3f87ff1de58128ef8fcb4c807efd776e1ac72e51,0xf4f7b41a000000000000000000000000fbb33eddaa987f05ade310fac4d1289e17dbdc240000000000000000000000000000000000000000000000031ed5b59bb21dfd6a,,,1,true -17873,0xb8901acb165ed027e32754e0ffe830802919727f,0x83f6244bd87662118d96d9a6d44f09dfff14b30e,0xef6ebe5e000000000000000000000000000000000000000000000000000000000000000a70d65979ad41c41b2ccf277895e9d9aa52c3fb93de804547b31a2828fe4b4b09000000000000000000000000000000000000000000000000000000000000a4b10000000000000000000000000000000000000000000000009b4ca9af41ac873100000000000000000000000000000000000000000000000000000000618a6812,0x55c7e56bc6a991108b79b5abae884a976ed2268f34b75c75b1362facecc60424,2022-05-27 11:05:23.000 UTC,0,true -17874,0xcd9d4988c0ae61887b075ba77f08cbfad2b65068,0x3f87ff1de58128ef8fcb4c807efd776e1ac72e51,0xf4f7b41a00000000000000000000000031d9ff6340798f1479e511d35071b76f62f1cc43000000000000000000000000000000000000000000000001de313f0708365881,0xaad5d6c383337a4200768be95822992e85a9b1c5da27c0b637dc1ef9fd0d12f6,2022-03-12 12:01:26.000 UTC,0,true -17875,0xb8901acb165ed027e32754e0ffe830802919727f,0x83f6244bd87662118d96d9a6d44f09dfff14b30e,0xef6ebe5e000000000000000000000000000000000000000000000000000000000000000a2ae7edb530bf5fcdbc806e7ea59fe997e25239363001c50dd08eca3bb910d6970000000000000000000000000000000000000000000000000000000000000001000000000000000000000000000000000000000000000002bff64007c87572e700000000000000000000000000000000000000000000000000000000618a74cf,,,1,true -17876,0x3e4a3a4796d16c0cd582c382691998f7c06420b6,0x46ae9bab8cea96610807a275ebd36f8e916b5c61,0xef6ebe5e000000000000000000000000000000000000000000000000000000000000000a8456eb2a500dba23484f977e70f53e9034943847a0e01288099df9a3a93af731000000000000000000000000000000000000000000000000000000000000008900000000000000000000000000000000000000000000000000000011801319f700000000000000000000000000000000000000000000000000000000618a7cb4,,,1,true -17877,0x3d4cc8a61c7528fd86c55cfe061a78dcba48edd1,0x7191061d5d4c60f598214cc6913502184baddf18,0xef6ebe5e000000000000000000000000000000000000000000000000000000000000000a32b03dadfe5a73405fd38ac3842d33aa306a502471184d9a378c86747e5c2dfb000000000000000000000000000000000000000000000000000000000000a4b1000000000000000000000000000000000000000000001c080f6e2781566911f400000000000000000000000000000000000000000000000000000000618aa431,,,1,true -17878,0x3666f603cc164936c1b87e207f36beba4ac5f18a,0xa81d244a1814468c734e5b4101f7b9c0c577a8fc,0xef6ebe5e000000000000000000000000000000000000000000000000000000000000000a70550ec1e2f1a4301d38047ed3ddd9700948fb3d5b92eb9c63032f2cb5626a6b000000000000000000000000000000000000000000000000000000000000a4b1000000000000000000000000000000000000000000000000000000246069028100000000000000000000000000000000000000000000000000000000618aa6eb,,,1,true -17879,0xb8901acb165ed027e32754e0ffe830802919727f,0x83f6244bd87662118d96d9a6d44f09dfff14b30e,0xef6ebe5e000000000000000000000000000000000000000000000000000000000000000ab072bf7f4f839e71c11379960133b99d92cbd13c3da29ba6a81878a588437e9300000000000000000000000000000000000000000000000000000000000000890000000000000000000000000000000000000000000000013b3ca5ac63a4dbd400000000000000000000000000000000000000000000000000000000618aa8a0,,,1,true -17880,0xb8901acb165ed027e32754e0ffe830802919727f,0x83f6244bd87662118d96d9a6d44f09dfff14b30e,0xef6ebe5e000000000000000000000000000000000000000000000000000000000000000af64d0094f9fcc615afec9007fcd9b978e9cfcb69824a8134eac162d541104c84000000000000000000000000000000000000000000000000000000000000a4b100000000000000000000000000000000000000000000000152e6a8e98c66933400000000000000000000000000000000000000000000000000000000618ac403,,,1,true -17881,0x3d4cc8a61c7528fd86c55cfe061a78dcba48edd1,0x7191061d5d4c60f598214cc6913502184baddf18,0xef6ebe5e000000000000000000000000000000000000000000000000000000000000000a6df854bfb1030b22cc89fe36f7c4950124e463118eedd1af43d45c43fbe376b10000000000000000000000000000000000000000000000000000000000000089000000000000000000000000000000000000000000001103c727e6cebe07aed900000000000000000000000000000000000000000000000000000000618ac516,,,1,true -17882,0xb8901acb165ed027e32754e0ffe830802919727f,0x83f6244bd87662118d96d9a6d44f09dfff14b30e,0xef6ebe5e000000000000000000000000000000000000000000000000000000000000000ad6d8e36135e6669027f8547a8d3d9023cfab0f31c9720fb6a893bf9799d7df05000000000000000000000000000000000000000000000000000000000000a4b10000000000000000000000000000000000000000000000028dbeefcfda93a30e00000000000000000000000000000000000000000000000000000000618ae727,,,1,true -17883,0xb8901acb165ed027e32754e0ffe830802919727f,0x83f6244bd87662118d96d9a6d44f09dfff14b30e,0xef6ebe5e000000000000000000000000000000000000000000000000000000000000000a77e2d7331c148cce2cc1e60e5a999f3a11ac7ec970e334a81c37d338bb209b2f000000000000000000000000000000000000000000000000000000000000a4b1000000000000000000000000000000000000000000000002c150b7c16f56dda000000000000000000000000000000000000000000000000000000000618af6bd,,,1,true -17884,0x3666f603cc164936c1b87e207f36beba4ac5f18a,0xa81d244a1814468c734e5b4101f7b9c0c577a8fc,0xef6ebe5e000000000000000000000000000000000000000000000000000000000000000a65bbcaa6e0e2ff8104bb76a6ec13a57c4d6065c68816e4a1b908068a94c3f23800000000000000000000000000000000000000000000000000000000000000890000000000000000000000000000000000000000000000000000001f4f77800700000000000000000000000000000000000000000000000000000000618b3629,,,1,true -17885,0xcd9d4988c0ae61887b075ba77f08cbfad2b65068,0x3f87ff1de58128ef8fcb4c807efd776e1ac72e51,0xf4f7b41a000000000000000000000000e10b628bdd00896912677470b771a381640fc17600000000000000000000000000000000000000000000005b95d07c6bc11b5ba1,0x7799204f4ffc53616e165bb08b7b0ee391b58a23c1cbab9db4010f9d5b83470a,2021-11-27 21:29:55.000 UTC,0,true -17886,0x3e4a3a4796d16c0cd582c382691998f7c06420b6,0x46ae9bab8cea96610807a275ebd36f8e916b5c61,0xef6ebe5e000000000000000000000000000000000000000000000000000000000000000a4272c01a9343c39baa571248efe2ec835aed1bd871ca4f6f37892f338e29593400000000000000000000000000000000000000000000000000000000000000890000000000000000000000000000000000000000000000000000001287a756c800000000000000000000000000000000000000000000000000000000618b44f0,,,1,true -17887,0xb8901acb165ed027e32754e0ffe830802919727f,0x83f6244bd87662118d96d9a6d44f09dfff14b30e,0xef6ebe5e000000000000000000000000000000000000000000000000000000000000000aa67b01a7f1114c17ca6ac7c6079a8a8c934319f936e3ad108e146f9685147041000000000000000000000000000000000000000000000000000000000000a4b10000000000000000000000000000000000000000000000023e8e97e9f3d6b7ed00000000000000000000000000000000000000000000000000000000618b4e49,,,1,true -17888,0xb8901acb165ed027e32754e0ffe830802919727f,0x83f6244bd87662118d96d9a6d44f09dfff14b30e,0xef6ebe5e000000000000000000000000000000000000000000000000000000000000000a3c3d2d5646dcdd6c890f32991bdf75adadee42b6d9c3d8ad241c75e81c9868cc000000000000000000000000000000000000000000000000000000000000008900000000000000000000000000000000000000000000000133627e06e26f218700000000000000000000000000000000000000000000000000000000618b5660,,,1,true -17889,0xcd9d4988c0ae61887b075ba77f08cbfad2b65068,0x3f87ff1de58128ef8fcb4c807efd776e1ac72e51,0xf4f7b41a000000000000000000000000f3b06391631c69609d7ab0cd435b38e44312623800000000000000000000000000000000000000000000007a9a6bd65ee6b30000,0x1956e52cf6356dba403907d3d90a3f1b0aab93818d4046254464960e7b7ddf01,2021-12-08 02:20:56.000 UTC,0,true -17890,0x3666f603cc164936c1b87e207f36beba4ac5f18a,0xa81d244a1814468c734e5b4101f7b9c0c577a8fc,0xef6ebe5e000000000000000000000000000000000000000000000000000000000000000a681393cb757efd511d4ff69219b35b546585feb8e986d8f176e2b27979bb0501000000000000000000000000000000000000000000000000000000000000a4b100000000000000000000000000000000000000000000000000000018509e23fd00000000000000000000000000000000000000000000000000000000618b67ad,,,1,true -17891,0xcd9d4988c0ae61887b075ba77f08cbfad2b65068,0x3f87ff1de58128ef8fcb4c807efd776e1ac72e51,0xf4f7b41a0000000000000000000000009d414882fc618720fa8b850184f846422f422bd10000000000000000000000000000000000000000000000e3d5fafa9d203d4606,0x2c58fba734337a898ebd57218592440b8c6632d788c73114bbdc856663f30db4,2021-12-01 09:25:11.000 UTC,0,true -17892,0xcd9d4988c0ae61887b075ba77f08cbfad2b65068,0x3f87ff1de58128ef8fcb4c807efd776e1ac72e51,0xf4f7b41a0000000000000000000000009f917290249608f66cbf666596bf71d9d1632d9a000000000000000000000000000000000000000000000000a5254af37b260000,,,1,true -17893,0x3666f603cc164936c1b87e207f36beba4ac5f18a,0xa81d244a1814468c734e5b4101f7b9c0c577a8fc,0xef6ebe5e000000000000000000000000000000000000000000000000000000000000000a9dfbd28d936bb70b05a8f81fc676ccafe9f6acb702b8506f4fd9705c000f9fc8000000000000000000000000000000000000000000000000000000000000000100000000000000000000000000000000000000000000000000000023bbee2a9000000000000000000000000000000000000000000000000000000000618bb22f,,,1,true -17894,0xcd9d4988c0ae61887b075ba77f08cbfad2b65068,0x3f87ff1de58128ef8fcb4c807efd776e1ac72e51,0xf4f7b41a000000000000000000000000553de6c52ca165f63196b5dd80817f8636d029ac0000000000000000000000000000000000000000000003ac2dedffbcfce3c325,0x6594d1d7dc28a2d581a431a2b0967dec29052f3347e31158fe2830496ef3dfc8,2022-02-08 11:52:23.000 UTC,0,true -17895,0xb8901acb165ed027e32754e0ffe830802919727f,0x83f6244bd87662118d96d9a6d44f09dfff14b30e,0xef6ebe5e000000000000000000000000000000000000000000000000000000000000000ac512792df647c70f0f1ba2c015002b7e09ee9099a562cdfd1e5ecc8c634b310e000000000000000000000000000000000000000000000000000000000000a4b1000000000000000000000000000000000000000000000001f21b453db51832e900000000000000000000000000000000000000000000000000000000618bb696,,,1,true -17896,0xb8901acb165ed027e32754e0ffe830802919727f,0x83f6244bd87662118d96d9a6d44f09dfff14b30e,0xef6ebe5e000000000000000000000000000000000000000000000000000000000000000afb9240d6494a59093b3fb57f78cc1df1ee1295b1bdf951f119c40d651955e13f0000000000000000000000000000000000000000000000000000000000000001000000000000000000000000000000000000000000000002b8927e83bfb7aae700000000000000000000000000000000000000000000000000000000618bb73f,,,1,true -17897,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec34000000000000000000000000b0df4a06d6aa6b81dee3ee489b4d9693a2040d82000000000000000000000000b0df4a06d6aa6b81dee3ee489b4d9693a2040d8200000000000000000000000000000000000000000000000000191b6628a0b00000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,,,1,true -17898,0xcd9d4988c0ae61887b075ba77f08cbfad2b65068,0x3f87ff1de58128ef8fcb4c807efd776e1ac72e51,0xf4f7b41a000000000000000000000000ccec342967170b4f3cda502e6c12c059fb86f6f00000000000000000000000000000000000000000000000246ddf979766800000,0xb52b3e0444717488cc64a307ab98ba0b49529ebcac6ae194c6c1372afb12f60c,2021-12-03 23:28:46.000 UTC,0,true -17899,0xcd9d4988c0ae61887b075ba77f08cbfad2b65068,0x3f87ff1de58128ef8fcb4c807efd776e1ac72e51,0xf4f7b41a000000000000000000000000f1d80f08df95f254cb7e6e075ad7265a5b85b92a00000000000000000000000000000000000000000000000133dd238c6c975e4a,0x9ae664ee25b2429a62ecedb67e1dd535d5bab8d2315bbc0bc687e8a88c03097b,2021-12-21 09:19:20.000 UTC,0,true -17900,0xcd9d4988c0ae61887b075ba77f08cbfad2b65068,0x3f87ff1de58128ef8fcb4c807efd776e1ac72e51,0xf4f7b41a000000000000000000000000657becb53fbc3be121224d929040db06de383533000000000000000000000000000000000000000000000057f0dc60716d13c31b,0x40868226c27a5a50ad0c67ee29e28c7e06f962f59e1533e22e299e8f4b078622,2021-11-22 15:34:07.000 UTC,0,true -17901,0xcd9d4988c0ae61887b075ba77f08cbfad2b65068,0x3f87ff1de58128ef8fcb4c807efd776e1ac72e51,0xf4f7b41a000000000000000000000000903a6df07b4f4d6f6f6846c8b3b3f9dab5a2bdb5000000000000000000000000000000000000000000000012c48d433c07fd6911,0x84f96f171fb08022ed37e2350fe5b1faee7becfdbfae3678f8a582c517b9de5a,2021-12-14 14:43:26.000 UTC,0,true -17902,0xcd9d4988c0ae61887b075ba77f08cbfad2b65068,0x3f87ff1de58128ef8fcb4c807efd776e1ac72e51,0xf4f7b41a0000000000000000000000002fb1bc1c4d93df699ff96fd8ca7f999333f7480900000000000000000000000000000000000000000000000135096791ea012ae8,,,1,true -17903,0xcd9d4988c0ae61887b075ba77f08cbfad2b65068,0x3f87ff1de58128ef8fcb4c807efd776e1ac72e51,0xf4f7b41a0000000000000000000000000b43549a2e758d96eebe15af586a972135225ab3000000000000000000000000000000000000000000000002aaa5fc6155770000,0x19ab3ee2dda745bd8880aa150fcd95d49b83de5058b5d38a0c1b1d228ff2fc95,2021-12-19 10:55:55.000 UTC,0,true -17904,0xb8901acb165ed027e32754e0ffe830802919727f,0x83f6244bd87662118d96d9a6d44f09dfff14b30e,0xef6ebe5e000000000000000000000000000000000000000000000000000000000000000a4845904728a0676c0edd849c961f17c7775b91855d0a8e97fe9365da8bf06e1300000000000000000000000000000000000000000000000000000000000000890000000000000000000000000000000000000000000000007baff13e1b06fe3c00000000000000000000000000000000000000000000000000000000618c245b,,,1,true -17905,0xb8901acb165ed027e32754e0ffe830802919727f,0x83f6244bd87662118d96d9a6d44f09dfff14b30e,0xef6ebe5e000000000000000000000000000000000000000000000000000000000000000af1f87619ce2021939ff8ca2327b1812541bfbf8416e3510514990253dbcb2fb2000000000000000000000000000000000000000000000000000000000000a4b10000000000000000000000000000000000000000000000022f48f1058e23fa9700000000000000000000000000000000000000000000000000000000618c290b,,,1,true -17906,0x99c9fc46f92e8a1c0dec1b1747d010903e884be1,0x4200000000000000000000000000000000000010,0x1532ec340000000000000000000000004200000000000000000000000000000000000011000000000000000000000000391716d440c151c42cdf1c95c1d83a5427bca52c000000000000000000000000000000000000000000000007ba3c86846e187b4000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000,0x82f86b195a1c14575016b79702ba3f3cadc555b8b8ce7c6251f4455999866237,2021-11-23 18:41:00.000 UTC,0,true -17907,0x3e4a3a4796d16c0cd582c382691998f7c06420b6,0x46ae9bab8cea96610807a275ebd36f8e916b5c61,0xef6ebe5e000000000000000000000000000000000000000000000000000000000000000a0f8e6b2e001bfaf605388008a58cc04d58d0fedbdf0751d8568a41c1458c4954000000000000000000000000000000000000000000000000000000000000008900000000000000000000000000000000000000000000000000000012931c4e3b00000000000000000000000000000000000000000000000000000000618c5b01,,,1,true -17908,0xcd9d4988c0ae61887b075ba77f08cbfad2b65068,0x3f87ff1de58128ef8fcb4c807efd776e1ac72e51,0xf4f7b41a000000000000000000000000c5225364e93709c3a53f5938b92517c3fbe17d840000000000000000000000000000000000000000000000468d281b0f47ffdb59,,,1,true -17909,0xb8901acb165ed027e32754e0ffe830802919727f,0x83f6244bd87662118d96d9a6d44f09dfff14b30e,0xef6ebe5e000000000000000000000000000000000000000000000000000000000000000af5393cdd34e47ae881a76266297b5ab293baf7df7fe34d39606a5f09afe3c26a0000000000000000000000000000000000000000000000000000000000000001000000000000000000000000000000000000000000000002ca4dfd6b78c2ecde00000000000000000000000000000000000000000000000000000000618c6570,,,1,true -17910,0x3d4cc8a61c7528fd86c55cfe061a78dcba48edd1,0x7191061d5d4c60f598214cc6913502184baddf18,0xef6ebe5e000000000000000000000000000000000000000000000000000000000000000a2abd27ac4ab063916a1df5f91d76841c84918f8a70eecdd1408713b973a52375000000000000000000000000000000000000000000000000000000000000008900000000000000000000000000000000000000000000103cb804346a8d12a6bd00000000000000000000000000000000000000000000000000000000618ca44e,,,1,true -17911,0x3e4a3a4796d16c0cd582c382691998f7c06420b6,0x46ae9bab8cea96610807a275ebd36f8e916b5c61,0xef6ebe5e000000000000000000000000000000000000000000000000000000000000000ae10628a506a1af3c886c28c801d90258e09c90f7b9530c7ccebbd879aef0cd950000000000000000000000000000000000000000000000000000000000000089000000000000000000000000000000000000000000000000000000123b434ffc00000000000000000000000000000000000000000000000000000000618ca52c,,,1,true -17912,0xcd9d4988c0ae61887b075ba77f08cbfad2b65068,0x3f87ff1de58128ef8fcb4c807efd776e1ac72e51,0xf4f7b41a0000000000000000000000009f3a593a2984d5d9a7008df32d7e2d7da4db0ff4000000000000000000000000000000000000000000000003cfe4350f9a6ce293,,,1,true -17913,0xcd9d4988c0ae61887b075ba77f08cbfad2b65068,0x3f87ff1de58128ef8fcb4c807efd776e1ac72e51,0xf4f7b41a000000000000000000000000f6792da267b264a24da725c584337c84103fe2b10000000000000000000000000000000000000000000000010ec721391f0640e6,,,1,true -17914,0xcd9d4988c0ae61887b075ba77f08cbfad2b65068,0x3f87ff1de58128ef8fcb4c807efd776e1ac72e51,0xf4f7b41a000000000000000000000000f6792da267b264a24da725c584337c84103fe2b100000000000000000000000000000000000000000000000165019814569d8a95,,,1,true -17915,0xcd9d4988c0ae61887b075ba77f08cbfad2b65068,0x3f87ff1de58128ef8fcb4c807efd776e1ac72e51,0xf4f7b41a0000000000000000000000004dde2cb805fff76e2deb661725c1e41e0adf7f6500000000000000000000000000000000000000000000015c1b85291880d34174,0x85a9432bc4e5b541b32d8a33c1dec7c12162eec2cc9d496838f2a62de89b694f,2021-11-23 07:05:21.000 UTC,0,true -17916,0xcd9d4988c0ae61887b075ba77f08cbfad2b65068,0x3f87ff1de58128ef8fcb4c807efd776e1ac72e51,0xf4f7b41a0000000000000000000000008ce47ca78fc1d3066a19ae004cd1760fcbb5644e0000000000000000000000000000000000000000000000137683fc1fff4d5a16,,,1,true -17917,0xb8901acb165ed027e32754e0ffe830802919727f,0x83f6244bd87662118d96d9a6d44f09dfff14b30e,0xef6ebe5e000000000000000000000000000000000000000000000000000000000000000a962a1c8b2847ac00838330cac53d97b4247686c67c6b8db9083149686972056d000000000000000000000000000000000000000000000000000000000000a4b1000000000000000000000000000000000000000000000001df43df4a1d36ae6200000000000000000000000000000000000000000000000000000000618ce314,,,1,true -17918,0x3666f603cc164936c1b87e207f36beba4ac5f18a,0xa81d244a1814468c734e5b4101f7b9c0c577a8fc,0xef6ebe5e000000000000000000000000000000000000000000000000000000000000000a97dc8ddd4cdd54c0d4de3b44ee2bb4a1172c926f85cdfd39144b45afb19f1008000000000000000000000000000000000000000000000000000000000000008900000000000000000000000000000000000000000000000000000012a964e5db00000000000000000000000000000000000000000000000000000000618ce58e,,,1,true -17919,0x3666f603cc164936c1b87e207f36beba4ac5f18a,0xa81d244a1814468c734e5b4101f7b9c0c577a8fc,0xef6ebe5e000000000000000000000000000000000000000000000000000000000000000a7ecddf0913debebd1369304bb913ee9b8d092b30442b2507b5bc8167c4023cdf00000000000000000000000000000000000000000000000000000000000000890000000000000000000000000000000000000000000000000000001bd99958df00000000000000000000000000000000000000000000000000000000618cf492,,,1,true -17920,0xcd9d4988c0ae61887b075ba77f08cbfad2b65068,0x3f87ff1de58128ef8fcb4c807efd776e1ac72e51,0xf4f7b41a000000000000000000000000a969475b7fffdb97f29df047118dfdcaa11220090000000000000000000000000000000000000000000001b1ae4d6e2ef5000000,0x06671082257b083c7b35ae813c8b31aebd675f079c72f6eb55478ba547fcb825,2021-11-22 13:44:28.000 UTC,0,true -17921,0x3e4a3a4796d16c0cd582c382691998f7c06420b6,0x46ae9bab8cea96610807a275ebd36f8e916b5c61,0xef6ebe5e000000000000000000000000000000000000000000000000000000000000000a04772dcc5a12e6df2f000f2aaac0d205189975db617be22102b4329322e184450000000000000000000000000000000000000000000000000000000000000089000000000000000000000000000000000000000000000000000000128066fb4700000000000000000000000000000000000000000000000000000000618d153d,,,1,true -17922,0xb8901acb165ed027e32754e0ffe830802919727f,0x83f6244bd87662118d96d9a6d44f09dfff14b30e,0xef6ebe5e000000000000000000000000000000000000000000000000000000000000000ae321c402a022865093f366bd41c1ddeb5efd4d374327da4e57f58c8f198efa960000000000000000000000000000000000000000000000000000000000000001000000000000000000000000000000000000000000000002b8a99afb7236564900000000000000000000000000000000000000000000000000000000618d1bf5,,,1,true -17923,0xcd9d4988c0ae61887b075ba77f08cbfad2b65068,0x3f87ff1de58128ef8fcb4c807efd776e1ac72e51,0xf4f7b41a0000000000000000000000006643fbb25018ffc27f2df9335eb5aa94dc3db35400000000000000000000000000000000000000000000000617726fa362a50000,,,1,true diff --git a/indexer/processors/bridge/ovm1/skipped_hashes.go b/indexer/processors/bridge/ovm1/skipped_hashes.go deleted file mode 100644 index 35fffc5dd27a..000000000000 --- a/indexer/processors/bridge/ovm1/skipped_hashes.go +++ /dev/null @@ -1,21816 +0,0 @@ -package ovm1 - -import ( - "github.com/ethereum/go-ethereum/common" -) - -var PortalWithdrawalTransactions = map[common.Hash]bool{ - common.HexToHash("0xba6348e51701c2637723ea761561794442861e78c471282b3a982a59cadccfc5"): true, - common.HexToHash("0xc3f516a82467644d93722e108397c09f4ed78a66e87c0a82072df712543bae31"): true, - common.HexToHash("0x554cadef5a6220504524adbb4063d53a8d25817de6e0358130c496083268d758"): true, - common.HexToHash("0x36824f8662cc0dcd4cc561e0b78df4fdddaa0efc843060335af1b1b0a0d6198f"): true, - common.HexToHash("0x452330502d122dd783957a48070718a229c0bd886aaf147832546307c02f9560"): true, - common.HexToHash("0x865463c2132f70bcf31dd7c1603a5af98fe8843ee3f3f4c8258ddd7b566b0e43"): true, - common.HexToHash("0x736d788a73e92faa9cf9afc25aaf4572813e3aeaf9a552f371ecc9ebb1453d76"): true, - common.HexToHash("0xb545a6d66f2df216706a94948453fc434b0398a26698a479e8628b6e1c5a30ca"): true, - common.HexToHash("0xe3b088b19936636dd5f447148447aa206f204ddd5a6358e8dcb41eafc2cb86be"): true, - common.HexToHash("0xbe3f7e812eba97d74ed55eac2716535c2937eb090ee2d4877aa056049ff52c9f"): true, - common.HexToHash("0x85f648ed3452f6effe11a84c5cbfe5ea7c92c05774677746f6a06ff1a982266d"): true, - common.HexToHash("0x8a65bcf92027d5a658d8285fe5e912e2e2305f5b89c8d95735a1be722675d084"): true, - common.HexToHash("0x130b1fff5d8fb0688a4aef40c102e6718115af4bfe6ab1438d1cfd44c3e53903"): true, - common.HexToHash("0x05c6edc87da53dad0cdcdb620f6cb9778e775cef8f94c9b8ca33b736b2e0c366"): true, - common.HexToHash("0x50551172151a8001d1a358044d734176e432cd60a95735939e3287ffc5d031cf"): true, - common.HexToHash("0xbf0230e7d6fa0a2f097b331b0e21bc3b9377f724693911839e2a42f80255cd1b"): true, - common.HexToHash("0x2bf242473d6e0475736115a29e3a6891e97c1c204097d55548ad3cfa4cbc5ff9"): true, - common.HexToHash("0x2128aa0be113ac23b56596c707f2ef66e839e2aba18f4d568f1cf83234a03a49"): true, - common.HexToHash("0x16192e56741d45f8447f0991d488f8a35d5aaa0884e7b94e586fff960ef394c5"): true, - common.HexToHash("0x3c05005265f00262e89ff76a2eb7554c37e23a66ec54df83e74f21137c8f6119"): true, - common.HexToHash("0x976a00f6473a3950ef91fd58b139fb20d4cd638a4de8116986ab15eb8f30b008"): true, - common.HexToHash("0x187b30621c2c33f6399c3922b6e18377207b6dad861f30ccc7addf9c28b2f5b6"): true, - common.HexToHash("0x7dee1040883e4e8d923aa0b23e3fd990f6dc2eb48bb7092dbf6c7fc284ac8fa5"): true, - common.HexToHash("0x283fd2ad543dd42b96057f87164a85e099e2c1b7bba464fdbcb816e31fb8607b"): true, - common.HexToHash("0xf89297104ef3528415cdc3854757639e71cc2aec428d6c9a2ea47cafed2f411c"): true, - common.HexToHash("0x25e6c02603449519df98b8c38456dd1ef58ab34adfbf86325b4d8adf6194b574"): true, - common.HexToHash("0x2756f5d616ec1b075fde8edd3193b30eb241bed644e61e94f1a968faf6b435da"): true, - common.HexToHash("0x14d3e01f06802805aeeb578466fc4f82d433cd68b15bd1e13c05e09930fe47f7"): true, - common.HexToHash("0xeb973323eb1c8fcadfd48cccd7adf83bf64c42fade938e6c02f47ff2db295219"): true, - common.HexToHash("0x38b331dfc302a7957a02b22e49158284b2448670d496e33a28f159d368545f90"): true, - common.HexToHash("0x2b616fc62deb8076da6457ff0343bbfa99fcdb0b09c79d9724c80a36d17754a3"): true, - common.HexToHash("0xf7b7e2dfdf8e53232f426901df3a0215b027e07945b08b95d171219ea60e2d6d"): true, - common.HexToHash("0x4d5f743e45d24083b6800cd17b3db2e672890d209943d77e1312e0c0bce489d4"): true, - common.HexToHash("0xaf447ce0563022b4bff87240bee82267f224052b7de9bfa8edcdc5499e2bf18b"): true, - common.HexToHash("0x706dd401f78d74dd4ac9a93fccfbdbb25e89fb3d2aeaf7ec7a56a34b4498faf9"): true, - common.HexToHash("0xb6c5445ff133433f37b8a91ff5bcdb90c0555bb011ac1cf766e52b96220b76c7"): true, - common.HexToHash("0x2b2e28851eef0322f23e7d14cf5e1b0bb854b323fd085a8953be25dcebca3bbd"): true, - common.HexToHash("0x2f34921a0bfb64feaa4c81b2d054c528c3d54dda8e348f35ef0ffa36154cc1b7"): true, - common.HexToHash("0xbe78fa474f60e721344eba82d73ffeaab11ea0d4e0d0cf6c702b407f58a93d8b"): true, - common.HexToHash("0xef0c880d329bc06df4a522a2a33d0e1ee9bfd9b0394221a4687340e5a63ab2b2"): true, - common.HexToHash("0xfdc5dcc0c32eb685b799b3cb081c61e4f3f646172fbf2af0f33feb674bbfd7c2"): true, - common.HexToHash("0xe1a761da9cc12c2a31ce732e23e21a22267c1fb29ab13c657550fa8b1f03ed0c"): true, - common.HexToHash("0xc330c1b9b45e81417079323c278235513ad5d9ad13f8bae7d0bbc505c7430f3a"): true, - common.HexToHash("0xc921539ce5e82bee4e40d226880e922a3a4c33fc1afd6c8b11682fc91bbcc042"): true, - common.HexToHash("0xea43a25d8c1a4e6eea642b1e7e4ca1283dd6a346b7ffe93e2e78b4a083f4ab59"): true, - common.HexToHash("0x786330136729c99160a4dc1102934d6046f3c33bd7a8ec50c710f5ce9bcded3b"): true, - common.HexToHash("0x8ffc1a2e80f94d39b80b2382c97551eaab9d7b7560f5d9d8fc4c09d92e57fa0b"): true, - common.HexToHash("0xd9ad4da475518b4a85b8a2d55ed445dd7d93ee611f97e2ed326f2795d8a419ba"): true, - common.HexToHash("0x0cf3b305c2648924cdb26f38cb6d9a6fc954cad49090dd3670601591df6ca032"): true, - common.HexToHash("0x3a91a7c6ce28650075b80036c88060ae44c1d0554208fb82ef8132a1dcd5dc43"): true, - common.HexToHash("0x689e21e2dc035148263b3ac494fc755cfd31326126e66b127e87e41acd84a695"): true, - common.HexToHash("0x6c6d1cf7edbe6ec5f57a55abc6fb4ef483b4f1cc5373730d4d6cd8b751efc8ad"): true, - common.HexToHash("0x721768e7afd355b3b04a55ab90b2e86d47843155a17e9ec9d45580ad2cff4217"): true, - common.HexToHash("0xfb41af2f155042ee9ef821dc224bcae60d50efd6437d85b3e88a589d31ce2030"): true, - common.HexToHash("0x88c1757641598e1f4f3c48e56e45d34feeeb3fed59816c4f4d0d47b9c3905d0a"): true, - common.HexToHash("0x8e57408b7b12bfc65cfd26d5493ae6b10ce70e5d675f9312455601fdadf6a311"): true, - common.HexToHash("0xd0a46cec82b0a2c05b2e672ef3a7d5ed9ab00ea332ca492b0ec78dcfa4228042"): true, - common.HexToHash("0xff83f831a8f6a7f501f06f1ddc5d6ebbb1d4be7de6f7a587d218c4710bcb4a65"): true, - common.HexToHash("0x6b52fa9d1e6710b86d979d8c29dcaf58542c7676c5590af33013a572193e2957"): true, - common.HexToHash("0x0f30ece1ade99c46b288064a727b1e1f5706e553ffc94a9056e6ee0ae5d18fa2"): true, - common.HexToHash("0xb5b37c57bbc0997cfc966632e3108ff2f8075bc01861748e36934ff0077d65a3"): true, - common.HexToHash("0xdaea2d65d2b9f3a14b23fd0d18575624763a488936b5f1aef85a3339682c17ea"): true, - common.HexToHash("0xd5652f83fabc34c205669b894d47081c5e75492c702b5b9a4843481eee8234cd"): true, - common.HexToHash("0xf9d260601b95f211c3560cdc4e4ada531fa7ee15bab9103cdb11c77c7039f985"): true, - common.HexToHash("0xc0ca4fed68e1ef6e37d0c7f2c0156939f2dcb86662dc6d6cfb9d18a913ceaee0"): true, - common.HexToHash("0x3b20481d80b025a70b0a61b89d013ab24b9105bc4f423bc8ee225c68e2536665"): true, - common.HexToHash("0xf2036cd8773d25a91418db3d3b60ace385f8090026cd55cef4cc822b5ddedc07"): true, - common.HexToHash("0x96dcd1befb244b0465f69daea98441d1b66411600224af41df5cd49f7b441dd2"): true, - common.HexToHash("0xb0daa45e6cd5fe877ea0cafaf09b8dce83a4bd0790402cee0db8f4450af6e246"): true, - common.HexToHash("0x2762569b2624db0151c4724d030809227da242a4aaaba28d17c1d2f5ef5977f4"): true, - common.HexToHash("0xfec4a22983b256cd123014e5f166bdaf38f14ca8d87c5ea351ad352bbef54ef1"): true, - common.HexToHash("0xb337cf83aebb0b5e04033b729be0e3e85dbc12fde1b93f3448ac394f023b5539"): true, - common.HexToHash("0x86faf3ccacea5cc48d94775da9dd01140678783e3b11bf676c6d2313fd25dc5b"): true, - common.HexToHash("0xfc5a6e587bed9f3d8cb62e123d15fe6c3dc4e02796c6f0f8f4ae700d9bb57b10"): true, - common.HexToHash("0x243770004306f6c6cad7f610fb6d1939f0fc847138b1981848177dc448627f00"): true, - common.HexToHash("0x2cad7175f2cbed874b1a25e30a14644c1c4ca07a900ba17310af3aba2b2f0193"): true, - common.HexToHash("0xab84cd7588b3cb6c94a9cf67be71870141ab9065e4b49d3db8e431663f9c3ad5"): true, - common.HexToHash("0x4f08477a325053210d054e0dd55703e48f3630a308a1308134f54512f83dca84"): true, - common.HexToHash("0x527c82286f0e841577d79c9e98f7e3d52a52aa42959e12c53112e7765df3c611"): true, - common.HexToHash("0x51ff65b000a613ea4e78c34534c31f0a1b6c17d2320b1839a902f53833c1f0d3"): true, - common.HexToHash("0x5ab9415c538254b3a43550d34efcc47ac5f445f7373ac471b0e6f721416feb6c"): true, - common.HexToHash("0x3e15b576481ac7fdf6fcac9588556b8151974525da4c118f86cc3fce75b2c4b6"): true, - common.HexToHash("0x12906d94cbe5d33906b8b5bc6eaf6d096e67c85e0e71ef366099de192e8577ca"): true, - common.HexToHash("0xc2cc96faa76537182c76f38839804d0b6b22de550c38f5e60424af0e8a06eb30"): true, - common.HexToHash("0xe43f091346824bd17576fb7e8f158af5ad95f4d180df2f5466a069859a4169f5"): true, - common.HexToHash("0xe04e7354292260d3c7237c76c8f16359182ea1e43dff6ee17e189222ef7bbeb4"): true, - common.HexToHash("0x0462f0c5cf97e79356d07b1d66834feba148aeac50bfefec945d3e5c47076d43"): true, - common.HexToHash("0xd3dba6185eb88ee02c9ff466c18c3c2b17a0c77fd5086322baebaca0614049a9"): true, - common.HexToHash("0x7e0b6d35efa3b453cbe7fea9f843a51aeb91683a1e3e121eee26e1ecd875c125"): true, - common.HexToHash("0x4f79da7a590170e88cb218bb21e9f48e5b72fa06072978ad8df47fd766a0dccf"): true, - common.HexToHash("0x1be6972d5fa44a21764aca595c7a747bc0bc6385315c66a4bf9cde1a6e6eae40"): true, - common.HexToHash("0x08f77dbe9f1a5ffa6f6d5e9d796f22b55b67727c28f2bc663f56aa2618d5a8eb"): true, - common.HexToHash("0x388daf4dead6ea350de1ccc8387643792bef09b2af5f23b7a9575e68ee68884e"): true, - common.HexToHash("0xeebbaaa6f924bff879859e1fb1f70c3377c247bf1c5e2c93bc54cc4a02412066"): true, - common.HexToHash("0x9abf55ce56c96ec2560b09947aafccb3d0cf36daea83f6d910903ce3598cb047"): true, - common.HexToHash("0x42029765b8b241a4d7bf025d37986a24ecb8d9dcc8667f113b4ccfb15c6303da"): true, - common.HexToHash("0x96f81d0f9236f080f95b003953258355260f8c748619e0c85c75152385c08a28"): true, - common.HexToHash("0x2c9d5a453d7f34d2e1f6d80fb27aa7c4a22dcb98905759ed7fcb67036a34e8f2"): true, - common.HexToHash("0x7738252c9122d4a211287bbb1e5a70d194817a908e3230f1bc1cce4ad1b964c6"): true, - common.HexToHash("0x0de53fe987765bafe1aaffe0f8126df60b23f1c52d5a8c9d86949de922286da1"): true, - common.HexToHash("0x927826c238f450064d0050b49ccee2f67a9cdf8842f6e9ef6cbe2fcc6808a9ce"): true, - common.HexToHash("0xa152e12858d9071daa058023f6ea8ee03e8d397f95bbca609b74cc6ef363dfff"): true, - common.HexToHash("0x8b2d5f6d5e02fe3dc7c74c7b2bd1b09d4b66e3a8f216497bb80bfadb5ee55c82"): true, - common.HexToHash("0x34f0f7430722f2b0867422e03dc832d4c979b20f9fec78a2fbd93fb04c8bb9fe"): true, - common.HexToHash("0x08796d774f6c7cbf751b66bbf954e8783b842bfd936169738082b7c9c51064c9"): true, - common.HexToHash("0x966534c95334e1609b28306ea1f430060296d1d145ba31d37f3f19afb8964842"): true, - common.HexToHash("0xa73764741fed17d63b7a4c5648bbb7bd1d1bca0dfbfd6e9166729cc08a532d2b"): true, - common.HexToHash("0x34264669e9061930ee091addcb8df276f577a19929a58fe0cde4d7ce91eb90fe"): true, - common.HexToHash("0x8894f697b605c268422955f13baea93cd5082ea0e34b1826bc12bc98994847b8"): true, - common.HexToHash("0xf6a8806ae5470ac4f3bc87b8114b8eda8c46ae522656ea28e5a3ff4e9c364246"): true, - common.HexToHash("0xe8e7293083cd8827d82819b3284f93b5cfad4c0b5128b3da24404744e9c072d5"): true, - common.HexToHash("0x4a802a52acbb7a8b36f90cc16708c103b51772d53e74bf10368d482cd6043c70"): true, - common.HexToHash("0x4dd7a20c6fd05d601c66b22a0c56d9640e0bf43b78467f113719ddf7721213e1"): true, - common.HexToHash("0x788bb0b0cbec9946277483bb399fafcc322277e563559c32842e567207df277b"): true, - common.HexToHash("0x787d461e071dd134e55727d9f582ecf147a3ca2f36d924c0abaaab51cc6bb653"): true, - common.HexToHash("0x11e513bb8eaa14e35f8dfdc433a26d24d610bab5262cd506fdd1df222ad15c47"): true, - common.HexToHash("0x06eeece757a16cf87e73c4ed36c03619208cd7fbb34ca82b87032a2d505e0071"): true, - common.HexToHash("0x25931fd94ab65e6f371dc2ad082d2789c047c6cb67041066a8454e2b863fb358"): true, - common.HexToHash("0xafc6d1beaf5b954a115ba9a0d8c641a2a96fd38e388ae63bae1cfd779b96df74"): true, - common.HexToHash("0x405be1abea6da192eebeacc371f3dd8a4a617f71bbfede0647184eaedb5c57fc"): true, - common.HexToHash("0xf0208a3825d42c6e4cd3a4a06ff3827ee0871cf1f92894a8be5fb43f3a298897"): true, - common.HexToHash("0x912ccc4a9d1234263e8147b0888cd85f7d2fb5c4e1cf42c1317af4bad7accbee"): true, - common.HexToHash("0xc03156bcc0101b1c58d668f64f763cdd694c9274e5766b4ecddbed8af5574c5f"): true, - common.HexToHash("0x250f37693ba474cdf10814f850b89fd5347736145d40a3369d86f2b8f7069d5c"): true, - common.HexToHash("0x6b52b2ab258580ad20aeb0c981aeb4056446481766fc034896812bfd832efd64"): true, - common.HexToHash("0x1231544a8d752dcaac16f3c113ebe6be0f28712775e1a69b1720008a78b7d561"): true, - common.HexToHash("0x42fea02c7e4db4a4f8338cf8ff7cbe5fd39f6ea6cb372eed147e5bb5430e2aaf"): true, - common.HexToHash("0x79d3947dbdd1cb041a536976a698287917bca6b4b13357d9ac5f5915f2670bb9"): true, - common.HexToHash("0x97ba1275ce8fc9707db86887ccaf6c5a80d138c99aac9e65c9a89c2ac540c79f"): true, - common.HexToHash("0x5af3fec9c57d41e8fcaaf9e95cdb6a5bfcef66d021d8358e29b01044a2026aa6"): true, - common.HexToHash("0xe9b139a2411c6afc3868f7a4c69ab3d20ac91030f836252ade92657d1983e685"): true, - common.HexToHash("0xcc183935f076b4c7ef037b17d1c0c988243c52c25e51d65992cf59db123d68c5"): true, - common.HexToHash("0xb00ad5834e8e65351c95520dc8208dd089f1b26772ecb4ea82ed7923f42089a6"): true, - common.HexToHash("0x138ab9b60015f8854681385110c4decf90324475b817e6c8da7f108ec3a7cf3f"): true, - common.HexToHash("0x8e66944b2af0dbe6de24f6b6ea2b99e707b8747d633fd66376f9ce374f3e71f4"): true, - common.HexToHash("0xc3ef459dc9e7ade0b3eed368bc0ac1da62f5180af61aa9872c1f710358dc797c"): true, - common.HexToHash("0x88f1277fb9e0e165d5c91d885e4787d34b2f225f7fa2571dc87691c3e8a7fc32"): true, - common.HexToHash("0x1b61e0405105575997a229fa4aa3c9f9a7db6db73b6891609f48432bb68ec7e2"): true, - common.HexToHash("0xcaf2edccfa9ffeeb7dc04506635219034f8a949d336cd6d52d08af76d24e30bf"): true, - common.HexToHash("0xa2126448dc2aa307b5e8bdef52ba3baaaa45157718cc3220f24604fad49bde3d"): true, - common.HexToHash("0x2b64aabb4a1c5fce585622099f256fa283baf1632537f7d1f44761d97d5189f4"): true, - common.HexToHash("0x4a5b2ec6b6c37476678d9b538f968837eec505859b71cee302071294897dbfe4"): true, - common.HexToHash("0xdfcaeaeed3ddcd9e822fd18fd46e3428eb4ab546ef0b41bf6fe7a74c90517afc"): true, - common.HexToHash("0x7949d1e7c01868563306e15fe947667c2d6516ccfd139945283373f19c540c43"): true, - common.HexToHash("0xfeb9293ebdf86054e2ad486fe434aae1fac62e6b602776f23c9a6b2606b68995"): true, - common.HexToHash("0x8025b79c2ddf506347fb59a308cb35398ef23f0e67e8e8482783358d3264484f"): true, - common.HexToHash("0x2cfc9952ded3bcdd3eccc124595e55619ddb4ac8efc87028278159987dee519e"): true, - common.HexToHash("0x0fab2e09e17e6d7fdb6d97b4e08392274bb1b12e25b5cbcf262f90d68d3f3780"): true, - common.HexToHash("0x65f658059b5798375e1cccc9113c5e46ba44d9cfa41999ea9ba2ceeee8c911f8"): true, - common.HexToHash("0xb436d11eed16e66839442bb7813cef4ca2ab660ed046d019381f9643fcaf84ac"): true, - common.HexToHash("0xd9bc4ffa1e6b2e6161edf86bd47386c3fcbc4c71a1baf78ab1c632f2b84866a9"): true, - common.HexToHash("0xbc36a665c160df8bc2a55b67d4a2577f7e6c1a70f697ab1d093ce10921dbeff1"): true, - common.HexToHash("0x63953b5e0c649b841bdaa238b7f718b94d9cedf591c1a137dd192157fd7d1036"): true, - common.HexToHash("0x0a64e5abd6c3dd159f3f40a3c9e146c2f7362d8f492f4f0899eba97a5a510d8b"): true, - common.HexToHash("0x8dfbe330c2587421b8a7a2ba7b6161057d74558f626b5cf9d154e5dc27f25761"): true, - common.HexToHash("0x76c92c87a2f4f0194c8328bd24684908b246efed97c9ea37b3e0a27ff1ea7b20"): true, - common.HexToHash("0x6a18cdb325c3f89b3a68d31d18633c9fbb51208ee947a14de5cf58b8a427eb40"): true, - common.HexToHash("0x8736f947067803d366bef08ec2a2b218cd1d978c399a16f231ea9710eee26613"): true, - common.HexToHash("0x81fc172851c585f7dfa7cb19d2e39beff25211437604f82d71c29d82c29c7660"): true, - common.HexToHash("0xb7e079a096a480949f3031b8a9b7b9aa0503b1076e76bb78c444531cb93d53a9"): true, - common.HexToHash("0x57ed8176b865053e3e6a51acd1963da48e0123f0273db78d663ff9221e789253"): true, - common.HexToHash("0xcaa3ae0217cac9aaf769927f8ea2a2bb6fc750b683158227ca4c9b8043f04543"): true, - common.HexToHash("0x343779257a771080217b3a734130b34951bf52d32413fcd7fa77c69139abe2cf"): true, - common.HexToHash("0xd4f4eb054cb9fa08a3b75fe0ef8e09048d02af5633d317decdb73f15733d0be7"): true, - common.HexToHash("0x312a1c0b2b43cf702d570791e99f4aa15199da499f24a92fc0e2dd7e55553e89"): true, - common.HexToHash("0xaff1b857ba8590854c8ef7eb9653d96234384382d44f25320a7fbdc050d8d767"): true, - common.HexToHash("0xdfb9d95ab64faa780ae74d5b0371e5226ab136a45fc26a8f29149b524321f560"): true, - common.HexToHash("0x466551a20e3c6905ec3473d2afb49e540505aa15613492b53e4847f433beae78"): true, - common.HexToHash("0xf912744c182c384579b4abf96b815bc0ae755d136ab61d0e8d9e12ac544fc243"): true, - common.HexToHash("0x2866177d0ca4ce281eeae714d18a153ef8774e6cbfc6ec0451997be6106ee166"): true, - common.HexToHash("0x91657a03563ee1e4ae368f979a3868df376a67545786b7cdb4cc9a0e4c54ca2a"): true, - common.HexToHash("0x3db769277039c7658dd1e9f8715771ba0a2e03ff232035a49025a44ae1c0d9ba"): true, - common.HexToHash("0x48c5c8030211d6701328ebdab0f3fb95fececea917df39fb8d13f4843cc395ff"): true, - common.HexToHash("0x32a1fc4ae50247d2520b9f8f0ab93dee6178cebadb2b307d7c55806df96bac4b"): true, - common.HexToHash("0x0822d28aee2188fe36afdba9977cceecb56d761277bcc4a9a325acc549de81bb"): true, - common.HexToHash("0xb9e36b272c252866a14cfd21cb12fc53af5639fdb9e4708d1ba2f5f88917168c"): true, - common.HexToHash("0x038a7646dacf52d0c9d6a0571b33629d130aa50e6e8706fe3e280ff22fb6968b"): true, - common.HexToHash("0xd9389e7f2f387cd6c683d5dfe2f0137f094e7c957fddfd3f2895cb9817e3f4ad"): true, - common.HexToHash("0x7c286a747cb7122e6f0aa3e5aa88e32a1d6b068c2535c4d07aa85a2625bfa024"): true, - common.HexToHash("0xef9a71c64d5f618e533cd065a51f8581f9f259e9d5ebaa971b41f7c9763651cc"): true, - common.HexToHash("0x0aca5890d8905d572a67771e79927942ef3431ddffd4ada62982ef7311d800a1"): true, - common.HexToHash("0xe23744034352cd3044b316109e3d1617ffdfe6264122d3b287b73f4840b06ae3"): true, - common.HexToHash("0x4a3d8c631f643d3716b32f09b789fd1d7287ab66de0593008ad6871bc9dd5698"): true, - common.HexToHash("0x5dcf2935a5759627605c2502e2c54a94d1bd8e8f2c5d2a235778f13cd3afc520"): true, - common.HexToHash("0x421127802ea308388b2eb351cf37750ce9c2eef74f2ef764fb6208318a28bac9"): true, - common.HexToHash("0x4019ed34b3efc99e490e90dee5503a3ab7316a2a0b3db8adfad7339ab28692f7"): true, - common.HexToHash("0x68454c03b41c2c27b9d4965ee7178530ec6968b7677db23c79e6870708bdd7e2"): true, - common.HexToHash("0x55860ae969b5757255205452613abb026148899955867e2934e049ddc4087f72"): true, - common.HexToHash("0x21f240168d6fb972300931703cc2ce9899c647cf6370ef1ffe3890b841b3a8c6"): true, - common.HexToHash("0xcfe5eebf2ab33b02d36c211d46279034ed3cf932eebed67bf9c3d2a23d021a0a"): true, - common.HexToHash("0xd867da96e83083f299bd2c7ee141a4ecfd69cf23aca0b90fcf8e196ff662f5a5"): true, - common.HexToHash("0x50813588aa71c0ac827c2e05ad67d09369693f086a7b08fff4a5e32dec90d29f"): true, - common.HexToHash("0x652c8b03cc6bcae4cb4a6d3e1c9817e01655dbedf26927b224c28f4a4a2baa2d"): true, - common.HexToHash("0x00049a3bdea34141cca41721100232f46a21151c1b4458d36e515b488f215c31"): true, - common.HexToHash("0xb3f7d6e776242647130670f8cb454b6e5ded30cb47c84fa9550fdfb2e3ccb119"): true, - common.HexToHash("0x25bb65b6e5a4743b0cf4f02104a72a4995ff9ad1066f55363c9e8fa137f990f1"): true, - common.HexToHash("0xaba5487f97e1d566445d07166272436b73b7593420b9c747e879677ac62ab05a"): true, - common.HexToHash("0x728e5defafc2556f63598d3b9d4a2d16b01ff1933aaeb0bfb76c2dc1fdfa847b"): true, - common.HexToHash("0x6202bb3a3eaa37e39b04169c7f7956f936f1aeff5477c87cbb7213f510674766"): true, - common.HexToHash("0x169f33ea18b6b123cdda37fe0cd87b8b64b9c7fede9898c33964449f03749cbf"): true, - common.HexToHash("0x086b289d05a6afbbd5dd60261c7710d7c6508d2fad5dc0f8c7195fa88ef804fc"): true, - common.HexToHash("0x6e15a53cc43c01ee647e6015b6f64b06e6845fea913508aafec565614b09cb19"): true, - common.HexToHash("0xa4e8ee7fd7bf051c9c2db92ea240c493ccf1711c86c14f73efad6ed9778fdc45"): true, - common.HexToHash("0x92c1b71f6dbc5245ec8fc7a8390e2801786284e6a3276b83a70ad1da35440442"): true, - common.HexToHash("0xd08a7a221dbac23e849e184a47f5499495ca243a025b6f2fc766e0f7fa49fdff"): true, - common.HexToHash("0xf2bd1408b16b81c70bb2758e5b8b29798a06971317573eca9c77f9ef1be72ffb"): true, - common.HexToHash("0x9eaaf38ac737ad92a19252b749fbc049113a0400b69a218ca5ca4a4b8af01d64"): true, - common.HexToHash("0xcb6e09e834880244b6a8a41c132ec215607b387d1bbdbb509da30b6abee8c335"): true, - common.HexToHash("0xbf591d35d4d75a3f020ff970c66ac1d86e79ecfcb25cd49411052310e8e2c2b5"): true, - common.HexToHash("0x9619450dc88d831e2931546293f268e1c02be612f3c9b9ce8989702a4401565e"): true, - common.HexToHash("0x60eea1985c351421958aae683060f7b28405351406235cb9385dc2b71705b476"): true, - common.HexToHash("0xcf35a47f4d733e6515d048ed43fd200af17c8375b056774e2a90afdf247f27b8"): true, - common.HexToHash("0x85dc8d522eeef55018aaea9112b3f6236f55568e0132cab80b80eab192dda7c4"): true, - common.HexToHash("0xf375fcc8e2d6ccc4694c36ce85d610bb4a01b8776add658125ccb3b2047ee18a"): true, - common.HexToHash("0x583b7e0c8f83fcda3ed601bc15d2914519c5bde8022e892a961908f997a17402"): true, - common.HexToHash("0xd6a4001f65d9488a01d80fdc4f0564baaee7b6a5447bede7cb38758a2ba40a2b"): true, - common.HexToHash("0x947620b5f5292b958c345f59d402afd93fa47e52e554b429d0ed4e1def9c13c2"): true, - common.HexToHash("0x66359583c47264914658e6db19cd8481443a3f2a509130920e0d12bf83591d11"): true, - common.HexToHash("0x183e50218a9efffcbae23fcdea39d86338d5b20011634d2518fff4d0506a7dbb"): true, - common.HexToHash("0xb6c6a2c290f1536467b79d8dda604b7f56bdca04fecf3d35bab586b082243aeb"): true, - common.HexToHash("0xe58fc5a1871fa22456597ff4565cf140dc3f5b6a4d4206662ec2506d103bd3a7"): true, - common.HexToHash("0xfe5575087faa79668c2e55dea03b248e704bd1476a29d54a2be7af6d83653022"): true, - common.HexToHash("0x99087265bdcb465234684daef17cbef310a45b507009d365097a56500509f545"): true, - common.HexToHash("0xa93dab49e22e8c286f5f28426e40b51372c2b703e3307caa6b1e9045305b9ce8"): true, - common.HexToHash("0x7a7739e24e15bdea5d2425f11036548129afb1f31a84a00abc1575c2edc1420c"): true, - common.HexToHash("0x6db272fc1f757346a8bf10b94863917ae476f2b01dc0479009e4a6d31a474ab9"): true, - common.HexToHash("0x11eb78893c446f3a28333a31723665360936fbd06c99788c8ae206f4e8e945a5"): true, - common.HexToHash("0xc216c8e902c5d1d38aa4653e40ac7bdb86e4afd430727ccbb38c62da3bae0fce"): true, - common.HexToHash("0x96c2d023f9274c3766087d7bf202071877ddf611fb9ee1a2cc733f6f9e0b65dd"): true, - common.HexToHash("0x21c576952d16c085a2885e7c19875081653e145dcf6d74774369d9a6e1482179"): true, - common.HexToHash("0x573d0e0813179651a24fa9a16cb39951894ab80d97d2810c2b1e4fdc01a56390"): true, - common.HexToHash("0xcc259040864f82194283785cedaecb618956d3aeed1cb1d9af404cf07052a19f"): true, - common.HexToHash("0x1daa12c5080e5cb227bdd9b6671ba54b7e86ef15221d814964ca58d267fdc0a1"): true, - common.HexToHash("0xb1569d4e13452047b312f03df64929ed5fe5d86d2117f237de434c3846f854b2"): true, - common.HexToHash("0x857aa63465836d9e4f6f69188bdaee99b9f66b60497999f235461ba02c38fd5f"): true, - common.HexToHash("0x82cc288ac854755281e3e0d6b071c916f9b7f18728790fa87a431b261f13956a"): true, - common.HexToHash("0x5d9f5e4b2e18af20407dfebf868ca0bc3a8f6faf612a86039e08fa83103d30e3"): true, - common.HexToHash("0xadae3f0ad57bc669f2551f371e52668b43a4ffa228659b275d4c06c491f13600"): true, - common.HexToHash("0xbb2c8107831b57d4355866abe69252a8613f90c9f500338e05a96817364cbc37"): true, - common.HexToHash("0x393e3e99e647982451b3f0c4bb331529f419042861db12221a3bf7208d8650c9"): true, - common.HexToHash("0x508b71c2d85afd712993e35a882841833c1c65db2949a178992fa3e9d783db81"): true, - common.HexToHash("0xab6deb0008d2ebe53dada4323cf09dca298a2b3ebbb8bfdb67e86b9cb4fee31e"): true, - common.HexToHash("0x3fb11041ed4d98ebbbfbca91c32675d8e1d6dbcc59ce1f3cc9436940fa42af88"): true, - common.HexToHash("0xc05b65a3081e33e8fb0c5ce31a0671d211b1c792f13c8156abdf995e26e6401c"): true, - common.HexToHash("0x092acedadc417ce4ebcaa9ce1669f7a50002abcb64a85fddfd38039186911c13"): true, - common.HexToHash("0x7e6e958a10c96b370d24e971bb08c135cf548872a76927f11867257766f22844"): true, - common.HexToHash("0xdb7a37d79ad25883b97e49790284f3e2225723b9634f4ba12788ed25c5815a9e"): true, - common.HexToHash("0x8798e280df97388e344c56ad4a834abf2760b4bc8f863fe5dd6b6e66e89d78ee"): true, - common.HexToHash("0xf933c5e17f09163365b03297767096c7bbd358a8acbdc914cbed750dd26ee326"): true, - common.HexToHash("0x8be73ef1062ddf8fb41c8d71e81512533f4b6de6f9901752fce82caebab5daff"): true, - common.HexToHash("0x3ff9b593f14da762b8446be289a40eea329b0cdafb087b36675816c9bc7c4e8b"): true, - common.HexToHash("0xf3b459782419cb03dcca2b5e599dc655bdb921c5303049987fa1a668b50c7345"): true, - common.HexToHash("0xe1f1083fe10186c96f781ccacbaf612febce8e5d31b5f34172c9c443905e4e17"): true, - common.HexToHash("0xc6ea9af446e6e5347c4ce0db44f77b54aa662c91e000881aca6953c8638a08bc"): true, - common.HexToHash("0xa75adc863227cd6bb20d984148c2a78bd2055afbf2418f22d78949c792028862"): true, - common.HexToHash("0x46155b7fd62da11c13bbed3aaf60175105b2014bb9c4283183e95f459745bf94"): true, - common.HexToHash("0xf29f4ab1580de1a676f59289de66bd042b5a2cee29d9401b741bc4515cb35240"): true, - common.HexToHash("0x76084a42a2736d7f111b52a9c241bb7fc2c87276e84cae7093f0ea64e5004551"): true, - common.HexToHash("0x53de5451df2a82592c715d0d898c77457cf47fe8b9ffdaab233f2142193c5bf0"): true, - common.HexToHash("0xc3c46eecd1627d72acc9c40dda762c89bb59cbc4ff4cfa8cd450684c914c894c"): true, - common.HexToHash("0x12a53d7f5b9472eab3321a2acd3c20a54b4a8d9e158793bdbd446eae4f62cd51"): true, - common.HexToHash("0xf200b2ba370c41b3c833c956918b2269b4cbeba274c7b1e166ae9e053bef0a2f"): true, - common.HexToHash("0x0e26b017ac2e1c7dac2bf71b217ff0c2a2591b98c340102f2e4b963223f50174"): true, - common.HexToHash("0xe36d5e21791a9474f2e3ba54e014f648adf9c481cfd1dfe31f57181df2905b6c"): true, - common.HexToHash("0xd46adc38f98bd2006dd9837a04bc12818180fd7f542cc9a99f1f378a01f95ce4"): true, - common.HexToHash("0x06a302b5037a901fa4e09faf598c134a34c6a2ec164877b27491cc78ab54cf05"): true, - common.HexToHash("0xeba46e1e7731d5d8507c01c2f0311bc8b2d7bc04f7c55dac0487a9ee4b067569"): true, - common.HexToHash("0x1ba464d0d8b1381db36181308fb1c884f3b9e0db7dfd7d12d54cac2d90c62737"): true, - common.HexToHash("0xf8fb7558c18ade95e6b371ba262148c888a142890027ccf7c66516f18ffd42e7"): true, - common.HexToHash("0x30e198f5a604b6f5821746f0fca7264e10b6edcf8a33f223d0d45ced23ed5989"): true, - common.HexToHash("0x75e9263b742eba31499200fd38073180f3d4a6c1772f7142d465825fdba64f56"): true, - common.HexToHash("0x42427e6c8d3de1f85838b0e091af2c08bd2ff5461b19af8ed3da86758a3ce150"): true, - common.HexToHash("0xd79f0e6065e51dba0cda56929421523dab9988e96dcfee752d776d046c7e5119"): true, - common.HexToHash("0x9c722e2f3e7b9518632c2aa709077364536eb26c960226d1821387e2bc870d9d"): true, - common.HexToHash("0x17eea224e7ad407b20b657860d01c2fbeaa29d88c9d7d3d5ed65546d10e98ee1"): true, - common.HexToHash("0x75f8dafef26a8cf6648f158b4feb7f8f2700620adbb976b912cc1995425350d8"): true, - common.HexToHash("0x1f29cd352de505e2b932966f5ed08cb78264a275ada7b7541423fc068335c369"): true, - common.HexToHash("0x47f2050d8dd3d4a21db1854417489483ceab530b74f0f75d2c5a1a9568f6540c"): true, - common.HexToHash("0x888da0085c3c04dcaa8797ad308a5ae03c4122926833b430c6b1649302337aba"): true, - common.HexToHash("0xb662210543c8ff913f7e1265906cf615896272806678190b491697f5d94cb9b7"): true, - common.HexToHash("0x793f8b5efa653d2dfeebfa424f4cffe704c8f6eff6019de52915d0d4161ad959"): true, - common.HexToHash("0xd3117530a0e70796e3c561a914697408717a25956e6355e72fe608359be34d8c"): true, - common.HexToHash("0x94e7a46061578fa33e11d8bf186300ef1a67943084fac0973870c61cdbd945f4"): true, - common.HexToHash("0xd0801dab7412fcb772fe331125169a264c57dd7e61dd089c7bf483cdc9c43a53"): true, - common.HexToHash("0x28ecbd85a4e79e1c6c6012462db18ae50f9ee26d83ac901c33869f9cb8333a38"): true, - common.HexToHash("0x5d22115b8603c8045f887eb5c3319c2755f42845db87becf9ea724143881a598"): true, - common.HexToHash("0xffb27ac51783887ea96244d8d1f01aa26cd4ed029999f9b148420ce98f31154c"): true, - common.HexToHash("0x433faeb878ec3acef832013e68dc7f96e5dacd327c2022fbb6324468abe372e6"): true, - common.HexToHash("0xf429d9b0ed80e7aee71779bfac0b544f35f5809ed5bfb7b0536b82143dd236e2"): true, - common.HexToHash("0xc636b79317b11874fbd1487438fbf7119c409327fc9ab21335296d37d730d3ca"): true, - common.HexToHash("0xebb892f78c0ad8d6cd5030ef38294f8884625554bbad814c7a0821b92cef01bd"): true, - common.HexToHash("0x234f6dd123397e807fd9578813e0111b0b5a45e3634fe31b1c22b7e9e2b069ec"): true, - common.HexToHash("0x4b3996e2892a25c2919a45111ec455d57b790ec0a59ce261626e6b65093be68c"): true, - common.HexToHash("0x118a63c9edb4cd8e89c5ae5aa589b40820d946c88b5499d0a1cd5a4d3b38df14"): true, - common.HexToHash("0x71c2eeb1f5c95addc51684b3b7e623775dd7fdf93d54160841d5d1aadd402f07"): true, - common.HexToHash("0x9afacfc6b4a34f4093b119370c5203daad662491c77058795e905393ccd1518b"): true, - common.HexToHash("0x8a7f2819b8328e99cef4f7fc0788d1a3ceaecac8cd0fde8f696c15c3b5fda06f"): true, - common.HexToHash("0x37c192fd5bf2161362e4706be093f9382b4539beceb6984a789bc68b2df23434"): true, - common.HexToHash("0x888b786e52abaee9be6c8019b6d7a0ab71d3a83ef809f9f946dbcd2acaa55fd3"): true, - common.HexToHash("0x4634c3cb6d693d19545b6f40988c8789bc8e205cfa843d19bb01a5f7c4ab8337"): true, - common.HexToHash("0xe163420e42d0b3adb1e887220560001d8a981dd3aa9f5b7f732fb35c9afc4159"): true, - common.HexToHash("0xde16ca4253f0b42473e06894b5afbab345c4c5dd2eb07aaf255c17bdede0041c"): true, - common.HexToHash("0x7e0c257052b02f59c12644c0db512950aa8a3309c0a3b80109907f8ed11ac8f0"): true, - common.HexToHash("0xa21834b5993d748ade0a32e37bbceb05ea1f963bb2569e28507fc02139d7988d"): true, - common.HexToHash("0x106cb6f4bda0afb8428939b8acfa00f5c7180281a2689f2eb91edae15ca15962"): true, - common.HexToHash("0x045980c9cf6344e704f807fcdad5313ff2d4ce6c355d419c2acbef13f8630a75"): true, - common.HexToHash("0xd05f25aa6bd31b9f730b8f810dacf08d7fe27611b5881886a456d887b13bfe13"): true, - common.HexToHash("0x07ca837ee22fe16f5ef2fbbaced39e5554a3d80c276333f72ee653ff0e86096a"): true, - common.HexToHash("0x30f4498959133ae725aa628012bfc97b8ec357676b56b4749ea453d4c83e411c"): true, - common.HexToHash("0x358cc0e8095dc4fa8854346bf8237033db2dd85f57468fbc30f54cd58daa13aa"): true, - common.HexToHash("0x35a1846366b9c3cb7e6aedd708eb4b44e44c32cf96960c4972d1597d12ce0705"): true, - common.HexToHash("0x520b873792b3976f90038cc9369948e3ee4f124e9d5a947f0171cb590b269332"): true, - common.HexToHash("0x48f105401e4152ea5bf20c9e213e57cc731df73990fdba0489e1b5a7ec745433"): true, - common.HexToHash("0x567355ea2c63be39e14d71dd133ce2bfea8ea9ed21f06297bff474344445c72f"): true, - common.HexToHash("0xca8298b39ec1410d910b8e40ec8eb18b5f1f192b2d82f42d4086a18be10afcc1"): true, - common.HexToHash("0x1cdc3a5ea15fe9879a8e8ec05d56944e3efbaa4f460690da50b559e3dc41f90b"): true, - common.HexToHash("0xfa2f917eacc0d44fa14ac8ea0e92ed92b02f8c78ccedb0776e6ce9d5f9f95dcb"): true, - common.HexToHash("0x132cc44ad8ea8409231d878132fd30c1dd7d7f44e02653f1d1a35002f457313b"): true, - common.HexToHash("0x0952cbea84ac30eaac28bcbee3da375d50090f37d145368bf64e7eafeddcc901"): true, - common.HexToHash("0x0d3c2fc0f39ff0ea3a63ee47b9da932df968e5e82422e038e2462d4d7cc4163a"): true, - common.HexToHash("0xc700557f7f5576a9ef625e39320943d934d76fdbe84c657eb7695b4156255a99"): true, - common.HexToHash("0x0e1cda6ba1919c3373bcd7b7e11de34177fe448c513601f2b6aa7e7183e0b47f"): true, - common.HexToHash("0x55b9b41af3e1df842b352123dcd1c4762a2953ff91632c9b6fcf150fc1e66f59"): true, - common.HexToHash("0x0349d7f31a1b91e253bffb037489a536129727f0d779346d3cfba8baac6d537f"): true, - common.HexToHash("0x951b8ea0ba872a9319f0250d16101127aeb68b325d62c0e3724b5cbac655b5f3"): true, - common.HexToHash("0x4d510815935154783deb9dc60428e9b7e4712cb1ec7b6fdf77e1bdcd093dcc97"): true, - common.HexToHash("0x0e489cf0f77f4357d5cd5f8dce771dd787e92db397ef9585f6486099f7feb161"): true, - common.HexToHash("0x33db90873529cee7bb4017adb585bf5f7bc0d38b6bf9b3def5840132314346ca"): true, - common.HexToHash("0x4be837f2f3ae253f6bab7de2c243865b300ff61fe8505f3b4929b0da318fbfbe"): true, - common.HexToHash("0x802bd9892667958047be01256ab4b78f7354721abae7162c7f19bc1501fb9eaa"): true, - common.HexToHash("0x62cbacf895f3be1184528e431974572ed49dd0596df7e3de5b8e78723accad7a"): true, - common.HexToHash("0xc5ee8809dfec576ff81921b3911d5f54cb4ac690ec05678a4f1a3138359f94e4"): true, - common.HexToHash("0x20752eb4b6b47a023ebc0d83547a9e5ba4cba89b5e1b653a896a325d65950d07"): true, - common.HexToHash("0xf38edff71152678941d044815b72f00db0b58f999e4253cde2d71d6ba131a22a"): true, - common.HexToHash("0x1d135d2f71742747348c7988303767fc9bb7cb93c6e831955acb4ce8f71e4203"): true, - common.HexToHash("0x2068a6a228599002ac5378046363e54e70d0ca5c60f1c20fa13000bb2a23c95f"): true, - common.HexToHash("0x04622baffacc173192bf85c3ffd1f03594d62a57440d52de11c3ffc545efce48"): true, - common.HexToHash("0xc99ff576ff47047ed4fbc89d4d43fcc51a0eec12db23e4014a7fc78f5ae2b79c"): true, - common.HexToHash("0xd159a8b1974cc4f60a5dc0184f6357305f73bec4e85e1dfa065cff276b569162"): true, - common.HexToHash("0xc0ecda30be34ace5297d2988fb9f6c1db293f40265da60fa22cdd6832dd974a3"): true, - common.HexToHash("0x587dd3044233ad298f53ce72890b06a3d738945b8f01a84afcf02727b5a29643"): true, - common.HexToHash("0xc39af18d0f84a1c286583f1889649f66f7407f8dc05e35c920f510c0f60bb466"): true, - common.HexToHash("0xe449fb9146956d37d93d84728c12d93b471a54edae884fec655fb5b6da4d083b"): true, - common.HexToHash("0xc5711585c1b349aef8f803b4565697811856ae863cc050918bc5aeb3e66120f3"): true, - common.HexToHash("0x31bdf470e5023dcf50f3720cedde8a1fb7955be0e4751d8fe8eb2ce110f4e158"): true, - common.HexToHash("0xe9a9a15131364f6f9ba10abbe3963cfaf3a9909e63b772c431340ef2b856f6b7"): true, - common.HexToHash("0x5cc68b9979e0b2db34cb3e1538300fea5a7085e548922014d4726801aa68eee2"): true, - common.HexToHash("0x548084c30983bc0636d51ed58fa4a46507d84704996bf500ec2394e6848d5104"): true, - common.HexToHash("0x2686199b8185be4bdbf644ede6e9b3c7faaef4711702a6aeb3ec16632da3eee6"): true, - common.HexToHash("0x178cba6928ad52fc4116efa567b3dbed85127fabf13e7194350308db6fffa614"): true, - common.HexToHash("0xa820a076821b4bc53bb0e5f85474cb60a4519cdeb41b1d6aa6ab12ddf91a7011"): true, - common.HexToHash("0x8be85fb47a559de9c5f727b63cc7b535bcb3292e1a0cba0001693e87c387a390"): true, - common.HexToHash("0xb72d863d65484e2da8629f7a3673e8b645c08abb578502b3a914d5d9c8396985"): true, - common.HexToHash("0x6deb18e37297407ee613e03d9e9850032b00f83909dfb97530d4c1371dbfb8fc"): true, - common.HexToHash("0xb563458848049f23a5177b7ba2a36d2fa203a2bdd37749454eebb40eddada253"): true, - common.HexToHash("0x67f9a86270ba9da086fcda25c03697f53ac9c6d625fa1694af2f82d9b3290f0f"): true, - common.HexToHash("0x18c2779e4ece2a7bbb2c2c7f00dbacf2d749148bbc9d0834893aa1c147474077"): true, - common.HexToHash("0x03610164bdb16f6448556ffb81582089137e76ff1d5e51e97db676cc96ef6c46"): true, - common.HexToHash("0x090131119faeda2fc1bd83819d8ee2b90bf0c1655d1b4e59c65d290c4b96740e"): true, - common.HexToHash("0xbedfa77e89bc70f9101bcb2d276029bb7bd9c19119f617e7ebf67423fa4319c7"): true, - common.HexToHash("0x54091cc3786ada7ed88e06de76c47fe3361ed784bf26b6a5781f9a2d86a64ad9"): true, - common.HexToHash("0x5a52e6a8d5ec73ccbd70d5afef9f00c3de42ff2509f07acf566d615bd2220bc0"): true, - common.HexToHash("0xc67171fc28b058ee03632909daa98dc085e42c20244d2798a3eca02b56ca007a"): true, - common.HexToHash("0x6876384e3bd3eb29f7e98ad3d90c4ec6eb168110592972a6c01e58548eb211f2"): true, - common.HexToHash("0xbfd3255d7be5f9e89eec4ddc9bf1b5aafe1962414bd9092f0fded9f86988b5e5"): true, - common.HexToHash("0x6649daf825949a9a446436c0b8ce18f365b85e5b1cff6f507ecb641614442d43"): true, - common.HexToHash("0x1c1ac90ce52548b6b83f137cbf19fdc08b9e557bd93c33276c2e696a5f14954e"): true, - common.HexToHash("0xb7f9e461177bd7979cde786f58a04b7cee6aea6465d7019e52b231032c2c5a43"): true, - common.HexToHash("0x31ee5582d5b672d0364f06d84808b0006abae6507ea75a37020c7a8a9c1e9f1c"): true, - common.HexToHash("0x06f95223928adb5fab877c35422729d7b01b49a94df5282c4496423c578e7385"): true, - common.HexToHash("0x76796847deb19cad8a0f70f49c064f8e65e5dd386f979c9e35ced470fae07654"): true, - common.HexToHash("0x88a98ce8818eb10ac492c89512bad7b3f021be34467ae423ee0004ed31f20a87"): true, - common.HexToHash("0xdcf76b5b51d56b65a69bbe44ba50d323ae2c69cc75cf917886513b874298659a"): true, - common.HexToHash("0x48d656799f451fa599e2f33b199467d1de181a07436e95c1110da225ffda61df"): true, - common.HexToHash("0x2927686db59b04e30658140352d6a18c8d4fd7fe907bde1ddf85388488e5a0e5"): true, - common.HexToHash("0xbcd0958890b48e7fe80ba9ddd03b76358ccd3e5b96f562b0180fc07da3c21931"): true, - common.HexToHash("0x55aef1171188d3160cfaaed5b498717ac260197bfefd849dbb93c64a1d614a22"): true, - common.HexToHash("0x5fbe100e8bb85f49bf23ef4cacf3379fa6fe0e234734c6c2641f2e038670424f"): true, - common.HexToHash("0x7a144a3f15d10a8e1e74f6ef7a3208ddf647b5eaa20570e86eb116c630330dbc"): true, - common.HexToHash("0x3015aa83080617f2023c781b9f3bb18508d835730373831ac81991d6290193fc"): true, - common.HexToHash("0x7d6d23ab51b5031281270118ede575642c6d0693e736c462896cbecfcb407f97"): true, - common.HexToHash("0x69cdb6f5fae07810137d65b87be839ec6295e500c2880eee2f6278e6823c58ba"): true, - common.HexToHash("0x3bb550ffb475b60f48a09798f73f7d8528c793b4bac01d471d29c33f2d57fa07"): true, - common.HexToHash("0xc3b2260b0126e4cad0a53941eea65280a35c1d0fa8a88d29cef4ed11ef3a5d46"): true, - common.HexToHash("0x53f91c5eea3579e5d41de95349707df9b579122002ae6fb559f3c2f35e4b1d52"): true, - common.HexToHash("0x3c44701a0c903afd053cdcb93db4e3e4e7399fc9faf3ac299316b2f74e21902a"): true, - common.HexToHash("0xce85bf78e977e7fbc1bba9004715cf6991bac6988ae3e4f88a960963dda397c3"): true, - common.HexToHash("0xe074792566155c6a850e286bd95d2ef4a37421e99f15471792c8e451896123b4"): true, - common.HexToHash("0x4c80cc51a37332dd827413f62847bdee514776ce6971c926529b4b80ea723090"): true, - common.HexToHash("0x752a45bbcb5cb85563715155baa9f311e7fe0d44a6b6c1c254e3b90b7fc2b1fd"): true, - common.HexToHash("0xf9e58af07082a151d7c934b94a7ec97b79ee8cf1c6879525a9ca9f9637c564fb"): true, - common.HexToHash("0xe0e932be990b6c6875d48750636eeef59da6b18167b0039c8a3bed63a03c6f07"): true, - common.HexToHash("0x9828776edcaf16be6f0b63713093ac02c5039cff4dcb3e7f7867f75a7e2e99ed"): true, - common.HexToHash("0x77a11132c1b0c25c5265ccfc7c460d452a501a3ab2ea4d5485a46d2a6b63af56"): true, - common.HexToHash("0x75254f5b9c421f1271e2441316318c947249ec9fbda972c447382ac097662e95"): true, - common.HexToHash("0xa9add731db0bfe8b29423bc1785fccc96c7f774218c7c7c55eef7bad1ac04f4c"): true, - common.HexToHash("0x93f2a0eea938302513458c16cef6df14dd9e264e27ead8df46f809ee967e57a1"): true, - common.HexToHash("0x958c1b4be6492755f7d6e47220957ac4a5c492cae7687ff964d6093ebf018383"): true, - common.HexToHash("0x9e9fddf90064d7de8ece28a08781364f806042dbf6e19c3e330ef666d9fe53eb"): true, - common.HexToHash("0xb8160eeb5562455c8f42adf5e8cebf647873fa2f6f0b44b39e0e2c9eb57f9380"): true, - common.HexToHash("0xffe662d26b12e0246eeeaa0bf6444a4d701ad5b1ce2dc50c01ae0e8e8dd6dbe0"): true, - common.HexToHash("0x11af44deb7c8bc6200bbe22832aa9e7e0b92a393fa95e7297f678e10dc56b65a"): true, - common.HexToHash("0xc10c076029840f7d2f0c4422fe8dad06f1fc47f73a1a0a1ff3247089a7e5234e"): true, - common.HexToHash("0xaf6ad8e5b79dfae28eec76eed6b2ba3d85abb4eb3d9e5f7969b045a92ac724cc"): true, - common.HexToHash("0x57e5ae6d973d901a0901325ae567f114b4b1800bf69b767d4c8b42310701fc02"): true, - common.HexToHash("0xeddc92e3dc1b3b72ccd0331a8611dd34016073a08658a2909663346fd2df1724"): true, - common.HexToHash("0xdd2bedae8887a6f8c7f0a785d0a368c586940df573636d82a1f471dafa5bf138"): true, - common.HexToHash("0xa5e7697136ab0737ed02e9799df703c9a19ac95b979de6382b696d03da062621"): true, - common.HexToHash("0x282c4b7b06ba4a55f4fa32f1a8609d48b34b86ac7a81a5bdf559fb099935ab43"): true, - common.HexToHash("0x6573cf1609d66650061076c29ddc76210ccc74faf815c318f87360690da1bad4"): true, - common.HexToHash("0x4383d85fcb8d934b29f28ee9557f4676020255def426cf7667520d990d4641e6"): true, - common.HexToHash("0x1af0664f2b20ba08bd58050e1d47b534339ea9706524d5411c6283aca33a7c1b"): true, - common.HexToHash("0x35eaccf2ed51c2aa350b925b79b0adf851b7914db213db97acc8bbf8d59a97ad"): true, - common.HexToHash("0xfb833580b4c4445a7a2ab4ef0cb3095b3aada375b046da14139f42dc1b3d6025"): true, - common.HexToHash("0xf158d9b5bd36ab55c52ac3fa47a67ad89dae22aa63d615d8c9a7d5ef85e518e8"): true, - common.HexToHash("0xf76e2921bebcd60b5ff79ac65dadc37eebc6dcf7a5f7bc02652dbdc0f8edd928"): true, - common.HexToHash("0x76827180d2e483605f57fe6a91f37c16433cf0526e5d8108c77c799aff6c3944"): true, - common.HexToHash("0x5291ca2702d3cb2e6dbbdddd60242ba136ab7b250c39a74356ed0dfaa00e48ee"): true, - common.HexToHash("0x522957188c33654cf6ff7c187614ffc2fa00e05fe7caeb4010f9dabcf533963a"): true, - common.HexToHash("0x00842234e56a8aee269a65bedc99196e4013792ee750e1af6ba3cace6911f400"): true, - common.HexToHash("0x8770d277622e5661bcb102ff3a99543353c99ef04afe5a59fe53b27bdbe81313"): true, - common.HexToHash("0xafd8c79a5193d89c58f48cc99c219dd72267c06f83d2722ced5745d63a0d2357"): true, - common.HexToHash("0xb4ebc03e5657f64fb8674fb646775bd61814a998373b1da31ac3304571de3a3b"): true, - common.HexToHash("0xb4df772e90d95ad40ca23f55fa3726348dcddb21d74650ab2f5d2625b4e13be7"): true, - common.HexToHash("0x93c104110d47178628a40d864e80ee463551280788bf3b23d4562238b7b006b8"): true, - common.HexToHash("0xed33a39fa900589a3e3f0ef0784632b9be228081657d0a27c8f3a9af8cb34d49"): true, - common.HexToHash("0x0506ab60d4eeb6e0115fad5846c8aec0a9ab431a3dd864a710d0c78e0893eb41"): true, - common.HexToHash("0xae8b4fb2f700d05da0c1456088e16cc6048e1f99d71aa478d91be365a82533eb"): true, - common.HexToHash("0xd4e80d6a3b956d7eb34562a4fda6168fa88db784740b432c9a380812c297c8a5"): true, - common.HexToHash("0x0e183336b0e23087cb78a3b27859eb718cab8463c4a8ae748134ae1584f369b7"): true, - common.HexToHash("0x10120a6ed8b569c089163c6e9dcd79acbbf3ee5b17fefb4468884a6f06e9bb4d"): true, - common.HexToHash("0x73932cab08017ba036873b84aba412e876623531eae1ceda80057dbb26032003"): true, - common.HexToHash("0xce40d77bacb0ebc636bed398ae1051e88310c6c5eecedffbd013be52e16c8b1e"): true, - common.HexToHash("0xb57c97b9c545a844f43c9bea8ac3f586632bf04b88834be7e02e91d925b2c50d"): true, - common.HexToHash("0xf96069274fc87e50688d3b3f0a8326c0afdccd38acb8f447b8900146e49f4b22"): true, - common.HexToHash("0x27b1eb1cf140690f3e297cade6ac71e6a97390bbf6b8b15f86ba9a5ef20c4116"): true, - common.HexToHash("0x965333b136c755ba1fbb16aab643fe4875319dafd70d4163bd504799f95e9d99"): true, - common.HexToHash("0x73c45e904c308a42cdd04b4a2f3031696bcc75fb27f2e7d4d52947f8b5b471ae"): true, - common.HexToHash("0x62196856f6dcb3fb6c71e68c0d68b8ce23169e0e5d818869e837961a331538ff"): true, - common.HexToHash("0xaace57e883bce848bbac1ed7931aa4bb49756a51f350773caf0aab5bf0492611"): true, - common.HexToHash("0x315ac16d8cf785d69ac189d53e978c7053e0d41ed0c9d8f7d117760cffb767be"): true, - common.HexToHash("0xcacf8aea85f002e50f05b337c74cbee3af7e2615874692ccd682f65176fbee42"): true, - common.HexToHash("0xaa4d959c587cefa976efa44d57faf0b78ccbfc8c23718fcfd5589d040f2d65ec"): true, - common.HexToHash("0x59f496e0fb21563125e905749d3eb96043c8a9bb30a9f373e5eadc3b3a042116"): true, - common.HexToHash("0xbf52a5148fbbb9ee2a79004b1ee437363b7e680f23ede30b026a75695257e8b2"): true, - common.HexToHash("0x67fdcc17e6a90ed16325cd864d4e09bacf4bda6863b04585807763cb0466e877"): true, - common.HexToHash("0xaa1682f524504bf42dd7181686c31d45cc828e6aa7f37a61ec3d187582d35543"): true, - common.HexToHash("0xf0c12436e7a684d2edf1142d250412b1fe435b8b8788803a0c0a334fdb611cb7"): true, - common.HexToHash("0x4f3f57a6eab57d883e4fb3939f3e4df0a9b900dfc00ea9db648fc7090240c6fd"): true, - common.HexToHash("0xabf6c99728ee59a7c2e356fe735ba9aea2c48fc6e3d5cebf4c8618ccee2decb9"): true, - common.HexToHash("0xc767732013db412f9f34134b9e1a6b7fc00cf2f75be427b3fcf2f066263278ac"): true, - common.HexToHash("0x15482b72cb5aa349b2f638d3c5dacc94c82306c478fb7b5ada260640d9c4d3dd"): true, - common.HexToHash("0x66e5b023c5f9a9b66eadccda989e1687accbec33b24c043b18675f5765d3b3e8"): true, - common.HexToHash("0x3529301da91b66a0c341c80688043ecb872cf43f50a744e9f6f139284cc38dcd"): true, - common.HexToHash("0xbe6c9b67129b5b72d8ef40d4a2a58487846f271be29b961fb78f8e4d9b51bbfe"): true, - common.HexToHash("0xb7fb5d1cf6aa7ab6ccab01500ccf7508f2a51e091feaa0f579521f5d8626633b"): true, - common.HexToHash("0xd55938461abdaf3db12114cab476003c5e06b1d8daa38b96f42c40e551c22e34"): true, - common.HexToHash("0x9746cc1062aba92d4e6b19e53b260238986de6a4fb8e846cb02efdb98628cf8e"): true, - common.HexToHash("0xabbd7e00eb9bda4313aa822af33a60776015af173354299c420947f5610b824c"): true, - common.HexToHash("0xff5a84d64ddb7251d23ac001c45ec619bc817d80c971a003878005a8e51b759c"): true, - common.HexToHash("0xf85eb8cedd6582b8d5b8ea708f562660b673d7bfaf3d7cc78558234e367ed30e"): true, - common.HexToHash("0xf79339e813f815d5e477547c4605cec457e9b8c993d9949d31f27569056a93fa"): true, - common.HexToHash("0x7c074c526ff3725b90c23ea6117de25d79abd3638db0aeaec5935ef818767119"): true, - common.HexToHash("0xdf176302c9c793660b8a03c4060fc4d7b8b0148e38bc1cd80f9573ca6bc0a103"): true, - common.HexToHash("0x6155fa23c55f535f15f5f2dc75196df8f87a86a93aec13c8cf6d6c50a0761d3c"): true, - common.HexToHash("0x91818cbc86a2e6f90c49cf00cee85f3f2a11500b6cdd7cfdee70f83a663eea58"): true, - common.HexToHash("0xb734e55cb8c108f2c182ad356f097c0c9aa836c69071ba904be9c571d36175a4"): true, - common.HexToHash("0x859d245e441802eae94f605864a0e6296234a7ed4c3a1f99418f54427a94c243"): true, - common.HexToHash("0x3ad2789dabc347f52a513c03f485d4875a63b5350d0a400974a1566d024a3fa4"): true, - common.HexToHash("0x1ead49b66da006a1f373e0810e06a4b5ab3d404446fe162820e4ba026643e3d6"): true, - common.HexToHash("0x9654bb616e3ac20ac16bb24cc8b33b900a7096269dcf9a8a1036ced0cfa3b3c7"): true, - common.HexToHash("0xef2e539e9d70bd775f3ea666cf8a34ba34fb5eda56da5297be424ba8731ce778"): true, - common.HexToHash("0x6a7019119e4e38510fcbc8d348b0566e37106500aeb45bc8c3418e1cf6282b1a"): true, - common.HexToHash("0x4bdff5402a12294448ee2ccbef44d7712e74abb96b4ddc897ed823117f244346"): true, - common.HexToHash("0x25ab16642de05a71fe81cbd9574bd240c6e57b4376a8f61ce561759a234d5e02"): true, - common.HexToHash("0x4bfd3404ae4214c5f8a9c51185d5e3a250473e0c0bee7a20076f54066e5eed4d"): true, - common.HexToHash("0x0a58f3ae76267ae69db9a06916cdbc728eb0af28d51142ba63f04e25b983dc48"): true, - common.HexToHash("0x04e63cb5fbbca95eada7e79aa756c6de21878260d3d43c6a3e9cf84cf5477d38"): true, - common.HexToHash("0x07f7c0a6686c8897502eba98b6fb6356111a30475f78896f58c5e3dd77bf9d72"): true, - common.HexToHash("0xf40e024fec3ce4c701f6a435a8706d280a2718bd62a629c6db4c3518d540f433"): true, - common.HexToHash("0x6aba632d0fd841f911bbc9399bcb8f83c41b65dfb611b0357662459b4d9bd74a"): true, - common.HexToHash("0x1ac8a66f853f0ee3e840c5da3f42b7b9e3e806f201e2891cd09e6d97dd5deea9"): true, - common.HexToHash("0x2eafe5bfb7999ed034bcc483e0d319cbc12c3b22c4f38d90d4723e2e359b7192"): true, - common.HexToHash("0x5c9d1c9dff44fbe55317ce8294b9dff39adcd5cdabed1aad282d72ce1b874510"): true, - common.HexToHash("0x890b3f1a6970d8109c94fe3efbea8b84d578a275bc2bf94a2fed793524a51768"): true, - common.HexToHash("0x7f7133cef26d5b99d82efaf66aa59b51161bdc3ff3aca000ad208946f691a9fb"): true, - common.HexToHash("0x07b640483d47da243834e01e40f5ae4c0f81c2e97c91a8c470cf2ea31bf65379"): true, - common.HexToHash("0xeec384a8fd47b0276b39e44930351015fbe316b2f29a003f5c590552f32e469b"): true, - common.HexToHash("0x283f25831cd3a6d94d0d0a7301aed99c8643c7dd0fed572d41ed8788f0d00e4e"): true, - common.HexToHash("0x70c42fb30ad6c6cce3d6a126436e9a8b0b9599a2739b26ca83df562d75be9843"): true, - common.HexToHash("0x1d4a66125bc738a61fd30db833b7ac874f52a10ae25f7fe179319d4c159fd198"): true, - common.HexToHash("0x8dd0f4a1f2b994f5b4988374276dc3c94dc10aedf0f308c1a0a4f22dedb0f897"): true, - common.HexToHash("0xefb8fdb03bddb7cc4355fdc7d7e0ad5fac08ea0804d2fc60c9bede8cbe3be73c"): true, - common.HexToHash("0x25b2bf98719c1204f69d1dd8de562e8f43f582a647dacd56be2170d5bd20a106"): true, - common.HexToHash("0x4673d948e01500b15321961c8acb37157a5f59e6f6d951fda8de5f018af8d8eb"): true, - common.HexToHash("0x427580211d47bd1a6a77859c215f1b8d32bc5f8b6de97be5c416ddcb1b65dfb4"): true, - common.HexToHash("0x89cc0e8088e990acdc65d08e07c92437c3db9e68ed73118b31ec422fbd0ad1f0"): true, - common.HexToHash("0x09379124a1e42defa8144585b20e7a53de8750e83f11eb3c8a6a2dd2e02b32bc"): true, - common.HexToHash("0x365aa110ba3f4b21d4c2dda61189aed59626d844f3b118204c719708fc5f31ee"): true, - common.HexToHash("0x5707885e4bdce12cdc00c96e2e0de30289223f14380b8defa6d726c6fac9d539"): true, - common.HexToHash("0x683f3f9b0f525e330b6aa167acba456c340f123e3b36c259f011a30cb65a45b7"): true, - common.HexToHash("0x6cb9351173968049a7b3e85feeac53447cda210a6b505bf9bb87c3c4c497ed65"): true, - common.HexToHash("0xb749f1321602b19b0286857ed2c802f1b5427dc9e948793c874f524b7add9200"): true, - common.HexToHash("0x6d0a3176717b3c5a9e4faff3195f2af8284774c307002e160639e9163eb9e767"): true, - common.HexToHash("0x095df1fa4d67b9220b9dfe6a1a6ea832d8bf63ad47b6c2589571a7efb4859d63"): true, - common.HexToHash("0xb612808ba182314ad2c5eb3100bbc4fe27a875cc112a37d01cf1c002e2a01fd8"): true, - common.HexToHash("0x4253c1c9060f17d0d3a509912efe42763094b5c6da52273f56558dab963a4067"): true, - common.HexToHash("0x4b6ba4b10cd199492821f0768ab0e73ddba7cb87b5dd89c0f00c2868a6f91498"): true, - common.HexToHash("0x6195516ad7649f47a1ec0fb37790d9886c7ffcd5c801e5bba92a4f41fa6c8787"): true, - common.HexToHash("0x57cd97b0370a64630e6fa79bc0d490ddc982fa5a30b34477e00ed2d63d9c98bb"): true, - common.HexToHash("0xe2967f92c2a10c503cbb0374317d8c066ec05a0058c8613dffc36a73c8322c86"): true, - common.HexToHash("0xa61830add4738de6b3c43ddf409ea9dc189443b3a66738d178ad7812a7740c05"): true, - common.HexToHash("0x145ad0ff920bf60855c42f72e3c945a30783c5d4837fa737de8f0a4289adf5ba"): true, - common.HexToHash("0x2dd4be67d2d24641984886b6a03638bab882a9976b296dafce5f14dbf1bd30e4"): true, - common.HexToHash("0x3fbc8ca4d97419bb309f84de6e13f22be5d296c13c73b821bc77e6da25a6bed8"): true, - common.HexToHash("0xe99266c37c891982bf79d292523a9f9d15d110e223dae393dac9bed93fe8a4db"): true, - common.HexToHash("0x80414f43625303e2ed6b2366ac35217f3e4793d4d82c20d1156ed84c58039996"): true, - common.HexToHash("0xbed57eea995e70e8895fc74089f5b95be1c9a7052514abb436cbfc52733af258"): true, - common.HexToHash("0xe11fa435a23d415df5a5a9ffdf39ea8e0e061b5d3e6908fc4f6169a4bba6f102"): true, - common.HexToHash("0xcaa39ead55ac4f124782b97c3d643825f8b2fba67fd4866970adc0066f638f1d"): true, - common.HexToHash("0x6c2bac650e7b2f76087cd91dbc4c91e7db369e96b3f583065b6f5f1ecb95ecf2"): true, - common.HexToHash("0xf227cfa4dc5959297712986b6c09d7685d6ab7a77fca5525f4de0272241e66c3"): true, - common.HexToHash("0x9719b6f243cd5f25778ebeccd6b42673664a6452c1b6fbbef5da4a54705f6e11"): true, - common.HexToHash("0x05bc51041dcace928b916e66ba72589a5a26e8ce4605b9f29bb791f496d1041d"): true, - common.HexToHash("0x1a18f26549029d81d4a00fc155380dbca74692c64cdc3d057b46cc95ed74df40"): true, - common.HexToHash("0xcc67575d02a56e9508ce02bdaf9c5f5cea2342a9560f45fbf6d5f929f60f0b6f"): true, - common.HexToHash("0xde202a07bdc960bd5677b1386cab86a36f12489ab33f7a3c3c3935371ddf5f46"): true, - common.HexToHash("0x608409bb3a66ca98b29ab9c9b7d5deee1e163bba502e20c2ba8b0cb8d261b20e"): true, - common.HexToHash("0xe7684f5ab76eb6ceb457be6c681c98c77377bfee1c8f182926cb92f8a6e9270a"): true, - common.HexToHash("0x946f94492d7e2a786469c3d4948b3c6dcb5354ccc15f693de641c19e97fad453"): true, - common.HexToHash("0x67648a1215aaf58e011a19dfd015a41bf80b348cc88f0e232ca295dfc127026e"): true, - common.HexToHash("0x1f2e15521336552de702cf432422b2e8769cf53967b102b93fe38bf4d8075a93"): true, - common.HexToHash("0x12798dd933f7b483fd13a9b7f6c7f3a14c046eb2b56514d718e199905528cd11"): true, - common.HexToHash("0xb389436b932633dd9a184257cbabc6c9c61008df5c58f325e15f89bac5cc6e9f"): true, - common.HexToHash("0x60605354568d5e033b5813af20bdbc856ef1d1de78075e52597c938f75ba8935"): true, - common.HexToHash("0x9f6eb8b6a3e892e6f900ac26f5f0e2d21633a6370485b3d020576ab3739feff5"): true, - common.HexToHash("0x9921927d08ec7e61856afb718ba58854e11785943ccf2c7e8de253068cbf9b1a"): true, - common.HexToHash("0x357ed2732dd7f9cf5cc6d396b1e3656fe372326dfa50759bc31c0adb3b37c94b"): true, - common.HexToHash("0xb4f153ee6a4632a156f355e2a0ca809f65e7eba3984b5ccba2df375bcec17df8"): true, - common.HexToHash("0x609d5f8a7a662d73ec2e332b2b4b2d3a0e19e6a67c027ad7c96f8d37a561db60"): true, - common.HexToHash("0xd690d87eb56afe578deefa74ab643932844d1f583d532712a1632552b6cf5dd4"): true, - common.HexToHash("0x1059f9a93b6f81fc9ac3865cd425228bc179ac74648e2b78829cfd477b05928d"): true, - common.HexToHash("0xdc70d966ccd7983d872ced54b4d285a92876f8edbdb628629724103a4467cf25"): true, - common.HexToHash("0x714475b4f4ec4ccb355f9fa68dae6beb25d7267eda242460f8b30dec4aeea63d"): true, - common.HexToHash("0xb6ac437c8e6dad348afdcac06942665e7c7ec7a904adb26e2a93cffdeafbe134"): true, - common.HexToHash("0x7226c91fe6e3b05799738d04c18b714c69a170a5e94ade73e908acf5556b8acc"): true, - common.HexToHash("0xb7d937676cd249e29065eec2fc6c7a7ebc93a61afbdcf5e76ef9bf28d681f7e4"): true, - common.HexToHash("0x3f26f2954dbdc187352a516c2ca22bd64771594f233de5e91ac923635a1ac250"): true, - common.HexToHash("0xed137afe048cd79f98b555d931cbef01735d09c12c004032b861f3e24d58ca4e"): true, - common.HexToHash("0xe040c033373f26075c44346a35198455b5a6e89536eebc750625a24fb65b4db7"): true, - common.HexToHash("0x96ebc9ec15864435f9dc1c0bf01278ca607a87a56480cbdbd98da03f380867a9"): true, - common.HexToHash("0xf53fefab7b7286d7919ed043651e8aa1bdb6157b4d256729dbe387b5684d66b9"): true, - common.HexToHash("0x9057c76d08f16e11a1e1a9d03472a4713a2bf6a2f5099e78635a5febf42ddb92"): true, - common.HexToHash("0xb83270996ed5778f7ec83784d591b69f1306bf16ace51b1b90574dd39593dbaf"): true, - common.HexToHash("0x61233527e8868b4b95a6ea1535f63e64bf26f71d86cd42479c0e32930d44c942"): true, - common.HexToHash("0x7e6c2beb3fc3f6929d70eb0ee66416f596475d2ee28e65dfdeed7584574b0d35"): true, - common.HexToHash("0x60182162e6c4f5968e063e8e5d1d333b82a1c577a162856c8c6549e592822f24"): true, - common.HexToHash("0x9277b07f948a1510a155bc5604a48edec633a19121613a6f6cd917cb3b6b04a9"): true, - common.HexToHash("0x85f52c146229caef4328917a71f2b0be6d011036476c475bbb41dd366bb90bbf"): true, - common.HexToHash("0xa200902f1dd4259653fa65666bb6b9da78218372c023ecc389439fd93f8f9cc2"): true, - common.HexToHash("0x4eb35c71d588b97f6a460b30f9a6621af0037fe6de022f81c4769f72ca56c9ea"): true, - common.HexToHash("0x1d6809fd5a1f7af1664ac725690f3dabae8b9d66bc5163bda6aabc9086c8795f"): true, - common.HexToHash("0x3aa9b7e8ec3d5cd64c1cb3a29a57161000f5dc837ef28d34efdfc2b0264a6b8d"): true, - common.HexToHash("0x6de27a58ace98d7e4eef3724fc248aecd625c3dd8abccc1a07467a32dcf1394d"): true, - common.HexToHash("0x9d9b7760c8dd8c5420517544574ef98b92e48480748b34af222a1cedf9466dbf"): true, - common.HexToHash("0xe79e984a8040d5b877850edc97832568b9973564819f0ad1236815808889ba0b"): true, - common.HexToHash("0x396b68fc27ac80bc7aa0251b7c2f32f7d2ea2d545a5017b7ed12c86be707c392"): true, - common.HexToHash("0x9636126f6c2ffef77867eb92252dac40201f39ba3f7525a3139a088113d25274"): true, - common.HexToHash("0xdc934835b3d5d3fc7b7ba309e755f9352289b41c67febb3ab3ede1ed2eece9f6"): true, - common.HexToHash("0x45dda47d4904001aaf154242d6025dc0cf21b8d25f9088d0dcce05fa9c9c6c22"): true, - common.HexToHash("0x82302d918f9983a9619734fb3e4925accd50411f40bca576c6102dfa00c21870"): true, - common.HexToHash("0xb53eca1c12b04cb2fe697d21a57d08f66d399bd8cc8632ec0e3f29b0c90f47c5"): true, - common.HexToHash("0x7a889f565081677b083a5d5fa18f551d364f2f8b7b13db9df624c0846f1351de"): true, - common.HexToHash("0x9c40c05a2b8df54c31209cd938318292f0573243286f3148e1931d5631b87895"): true, - common.HexToHash("0x60358591bd6b8702cc6f7fb67f8369e85fc293285f37f6f3412f63fd884d6f1c"): true, - common.HexToHash("0x5aacfe39a582d1d1679c1dbfbc789453d9dc35504e2dddb344cc7396ef7c8d44"): true, - common.HexToHash("0x1a5d7c78cde41758809f0f88ceb3aa5326d811bc00b7dd8d39e512c0bc18efd5"): true, - common.HexToHash("0xd1f9a6e9c52e7e565499d873025c3c2d57d05b27233e2f7db560c3921625d22b"): true, - common.HexToHash("0xb71cfd9f2d3a2f8d5d5e05f7c066568b403c6070fe7d93e3d72d9616c057b434"): true, - common.HexToHash("0x60bb7c7a624419c06affe6d4964dc771d271852ddbbf40be2e126f2e9e452d21"): true, - common.HexToHash("0xc2257da34fd404e474b7f4a9c2840bd60c3c9f454270c655d5081d4a199c60af"): true, - common.HexToHash("0x74fad5d78fe091313d3e21d97d937c7485ea8ff8a8488db99c759165931960f0"): true, - common.HexToHash("0x5af353b7b51fd582f24f72e57bfe2854b48790c21923581e47549b137cec9383"): true, - common.HexToHash("0xf64e22514bba51ee2e04bd713db07f75e322a57eec594418df7068edf3df28d5"): true, - common.HexToHash("0xf7d3779697b65700f65f0b6611e976f41c32d3f380e11a73da3f37a8ab187689"): true, - common.HexToHash("0x2816ee21d9b0a1a81b4d910f56497f23b6909265cd68bbc5c3c1515b077770f4"): true, - common.HexToHash("0x7b4832885af2dced89f31505943c95432ee4ae786311752c543ace48ef16c785"): true, - common.HexToHash("0xc0de727c0760293118eb3b6ee232201538672fba929881992f5e8cf8f94983fa"): true, - common.HexToHash("0xe281421f2ed2b221d1695b5170e78c482f75c70a4e71d9357e41034837860a2a"): true, - common.HexToHash("0xc03a228c66884e7b716d95d13c2b53eb118260a1e11d2c048793f9a3da8b89ab"): true, - common.HexToHash("0x9166661035a4d6bc104d5ffa75cac9e4f8ba0bf357572d5ac77b827a14dc1213"): true, - common.HexToHash("0x3b32884150869ef741d57ed2c39665db943c846be0414b9b85bb49bbd682ac8f"): true, - common.HexToHash("0x3541fee6a3199a68261d0a56eb72301c5e4e26b8cb611f3ee14873f920622be2"): true, - common.HexToHash("0x17ccdb936412412df12dec612eb1da50270809d43a97f67d8f5428aa04124bbd"): true, - common.HexToHash("0x5d3a6d9c473e9ee3ceb21667076d0d1a1203810227f454b6b8360e0264550dbc"): true, - common.HexToHash("0xf0d026c00ed8f177b86d0cb0a0ffe161a1c22d3f5ac2d9ec66bc012dc526e063"): true, - common.HexToHash("0x8dcce2574dfa46fa6e38353d763a85008c0ba0d5f1a6c92108a7b00f33405019"): true, - common.HexToHash("0xe98bf5bd4f1f3b8d9559cff2e0064a6a4c432aeb7bd459bf266999456d08d29e"): true, - common.HexToHash("0x469ebd3722dce869c04f4363ef2be926b8ea81237288f18355a5a718e97d1c54"): true, - common.HexToHash("0x5e1bd7a496f702a63d250017143e5ae8bca035372debbab76d5c854a20008acb"): true, - common.HexToHash("0x962cdfe5e4741cd68f36163b2ada9329f80d82e2679a7bd06227a111f45b7b88"): true, - common.HexToHash("0xceaf962608f172590b0e5eb128ace208b86e4a2e42b582d0b115eef88e1995e7"): true, - common.HexToHash("0xa17c94a7c6b139383285d1c9b0fe8d1a6c144a1eb21327d6b488a85ea4492665"): true, - common.HexToHash("0xdb30042751b6c590ad2c7dbb745a611caba8108346be1d54fda2ccee10f6bbb7"): true, - common.HexToHash("0x86c74c469f5f2cbe50ba63decd71989375acc5aedb458de2ca99fedd91bc1e46"): true, - common.HexToHash("0x56d6b48e28a7a03a712660ad46abf6014c642fac1635a23c4373c190c7122cb9"): true, - common.HexToHash("0x916061d350aecf3e1c2e5c98f88bef983942f558cc5a51d80a683f2795d5dae7"): true, - common.HexToHash("0x43606dbe2b0c6583247c8b041c51f16481f663dce8384e7188a32a5fcf9c4da0"): true, - common.HexToHash("0x3e21ea6e174b33bf7171ed7070f935a46cc9b5e3cf4db17cb6cee8fcaaad0270"): true, - common.HexToHash("0x1d8228190aac64e0804e8d9903ca0f6bb9781411171a6ca2c090e17beb4b8688"): true, - common.HexToHash("0x4993ae4cc4692837b722d1992146d667f019a69febaa8b7c1b9f450e0376f9f5"): true, - common.HexToHash("0xa724640a7f7aa0dca0817ccc88f7d63a9d1c83761d26d0a958fd64235f6ea751"): true, - common.HexToHash("0xed5405efa7a93214626718f0cd94e693faafec31225bf2d11a6047971872f65d"): true, - common.HexToHash("0x547ce12c56ee25156cdcba1ed9676ee458d829e1e1893abb9ec0e068620732fe"): true, - common.HexToHash("0xd6470582d2957727c9939d284c1caa4bbb45bb0834d3948d2152e3b85473c8ba"): true, - common.HexToHash("0xe8664cb2608a4eb02b98bf5118153e4af81100686f6ed2885de2f74f30f8dc0d"): true, - common.HexToHash("0xebb005b227d293bf84dc3d86ea6ba376071d45c1db4b19b9389c826c390bed0c"): true, - common.HexToHash("0x923bfe8f3a2959a79f475a46890e03e4eb259a04e3b9344ff8e5654ebc8efb23"): true, - common.HexToHash("0x47330f743aadb77b589ce783bb9cecd5c437f5e2f3fbe41bbcec4716f8117528"): true, - common.HexToHash("0x736ef67947f642aa0bf7fdc3189ee188060eb8f9c02bbb51acd6a03812dd2394"): true, - common.HexToHash("0xb6d0f8a7dd76ff78ac8845094b0e583ee825a7a32e86fc34566ffd7204d05f21"): true, - common.HexToHash("0xe6f8c56fb5d257b5c15cfeb61e09c2a49cc9c4813fc67afb9da4a21ec5242f72"): true, - common.HexToHash("0x713ee6fa5046348a79e0b9725d40530118dcb6c1fc4ddb61eb794ea99bd92c33"): true, - common.HexToHash("0x324f878ec13c8926b40ec138c1118a909701c12ddb51f7df37d46ea8a7af3404"): true, - common.HexToHash("0xd519e64bac315564a05f1912b401e3bb4b28132a341abc7333acd7c4309b9642"): true, - common.HexToHash("0xa2e6c501352a82298d2fa6e3ce729297e94dfa0443bdb907c7de1c9f64f13c59"): true, - common.HexToHash("0xec2843d0bc8d558f2172d0fbc2269fbd49fa81c76066eb125b67b7265634d1ba"): true, - common.HexToHash("0xb8bb002ed2dda3de7df4198f86ebf335f833c70eb75eebc65718a4286e8d97bd"): true, - common.HexToHash("0x40389d7a731bfb9a8bae633b946fe9b22661af4b7ab77daddcb90fc318b26db9"): true, - common.HexToHash("0xc82afca76ec0f4f66247e91723448754960d672849e9c69f17b92922607dee22"): true, - common.HexToHash("0x61bfe85a5c1c97401bb4305afbf4850cd13e9d248219040c06483d6579350ea6"): true, - common.HexToHash("0x3b0932e7f0f110edeaa24fccf651b599847aba463cfc2040d8eccfec848256ca"): true, - common.HexToHash("0xf2271304ac342098f4b9e58512ad957150154995bfcb2bc387c218bf4ff135e2"): true, - common.HexToHash("0xa1d45d6a0f7f282db0f1309933b65e25700095ef4d88c803686f58ef7e8e17d3"): true, - common.HexToHash("0x32d236d9918db3169ac48b69749c3cf858d93fb062e9f179c5b92c19655f08ab"): true, - common.HexToHash("0xdc3fa2b9d6c12ba1abca1d6ee5e620767b4fb3b0161c6821243005fa2ba6b867"): true, - common.HexToHash("0xa5ad3e05f343d004a95061a26c88e6bb7d7b4d37f6b9c695c5e817038fd2b5df"): true, - common.HexToHash("0xd99a8b3e5499a3c22d0179ca2185f78e91b9d8873faa0a223ea94eee6313fe39"): true, - common.HexToHash("0xf1d5a47a875f66c204533bd7e331cd7bb0d0e98f9b9bd6755a2ef54c55176d20"): true, - common.HexToHash("0x9f1dae1f89c7fdc5dc3d6ae9484b15744841fc77a1546082eba88da52481979a"): true, - common.HexToHash("0x20a793ce9a60e83dd910233d42dd72a8dd601a04db8f7c6d02a8d1c25f0761cc"): true, - common.HexToHash("0xc477d387767dfc1912609d8deb8778253a58e5341aa7bff66b906856946d6bd0"): true, - common.HexToHash("0xa58b03ac78df9b57d33bb6afcabdbb8dde00a4e837ee773768f40f3f26301857"): true, - common.HexToHash("0x887b92fb3385cb53d48085b0aed29e44bbfc698fa707353c408c108761ab518d"): true, - common.HexToHash("0x950df5ed138ee0273ce9c2d9c18400eade1596dbf905d4e9eef24223b159c9af"): true, - common.HexToHash("0xdec4f689a0a319fbb74fb3a9cc8583fde0c5d08e3e321041477ffe4f4b2c0bb1"): true, - common.HexToHash("0x63884e2d8a3695f9df78ddd543df8ac778265c8da677a7ea6282dc786aa12c96"): true, - common.HexToHash("0x6e943217be35556204c5db71d140b3448dbc316f9210578b036956415ff04dd5"): true, - common.HexToHash("0x827ee87d745f322cf09a1423c3193bffd29f49839256d318555a2deab435b483"): true, - common.HexToHash("0xca7ae48b7cdf818ef781731105bdecfbac58005dcff74392eeb3527b7ee9d053"): true, - common.HexToHash("0x421565891f68f14d957564e941e043663a5a4260c7c395b31a538725716172cb"): true, - common.HexToHash("0x76a88977a3d1e823b3e0d841aba9761a7245a8b4900091ce1834c0a620a049e0"): true, - common.HexToHash("0x9d06030d9e80dbd90a98d400ec2126860372eeece19614294172c1ab2badeecc"): true, - common.HexToHash("0x2ca9595e7c84607a7294fe7acf82a429cb40c083f383d9b08210889d214f4e1b"): true, - common.HexToHash("0x0a02207d9140c9b5f4d24bc1ab148cc2a3cb65ed9c71ba868bd1975b4f23af7e"): true, - common.HexToHash("0xa2e42dbfed81e23058210fa329d107c7d65707add6ca2aa899ee8eaed56d061e"): true, - common.HexToHash("0xc12cfc4ee3d474f3d947283394c261659365983d96b59a72592dc00beef7cc76"): true, - common.HexToHash("0x537d29cefe7278b39d465cb2dfa049ce3ac54f955c408ed0eb33180bb4bba2a6"): true, - common.HexToHash("0x3cb3d533ceb60eeab3ebaad099348771357630faebd40abbd24a0a23ec0e09f5"): true, - common.HexToHash("0x9f314eb81e3a1fb5b04d247f8ad13ff07ea973396eb7a5a29e35d95337038f8a"): true, - common.HexToHash("0x181064c56951a2b7393c685d00618e8b5ce40bcadb2589044d9fe5eecd41ea06"): true, - common.HexToHash("0x4c1da5174bcfe05e141a99f6df76308919d385c748c9cb99eaf01d999951dba6"): true, - common.HexToHash("0xace50a1a5cfa9b2fa6838c613e323334a2709229e274c9417499b29a72d3bf09"): true, - common.HexToHash("0x4293e6bc863de497a154fc7152790b98be23efb4b560c4094956948c6543f10c"): true, - common.HexToHash("0x7276541a091a809b1c473fb476bb49346243dd3f8d42ea5a1d1237bedd0499a4"): true, - common.HexToHash("0x4b916afa09388165ddd5f28357624bb80c540470f67d10578230de4b0cc1820d"): true, - common.HexToHash("0x49f0b91a1a0a9e60f6f32bbd0aa14575d321567c421e20ec272049502347c8f9"): true, - common.HexToHash("0xb03833724d698a0f880e476c8afa10f4b61bc27f8e56dfae4e6eb80d1744323f"): true, - common.HexToHash("0x45ad70e5adc767b4ca07c3d609f971b12a4674eb69dd144842afe01689466ed5"): true, - common.HexToHash("0xc3a9fe6c635dd21025b72bf3a1fcffea7665c6e809ce52b007c90d4085730e46"): true, - common.HexToHash("0x3d16cd2c88e0301333ae2c6ade5f8b596819db8ccfb0d6b6c6885bc5092fe0bb"): true, - common.HexToHash("0xecfdd0b351cc806805b69f6ae8660ce46c0f14979efba293e7d2a5822abd49ab"): true, - common.HexToHash("0x5209ec9b34bb5727a1bf3693a98a640a59e92276db5c572f48b95ea8b6ba93cf"): true, - common.HexToHash("0x27cbbb4d8bfc7629e0aba5441ea2d4698985052ef432c0e3e3e2822914fb866a"): true, - common.HexToHash("0x44751ec3bba7972e936c0983f7f1d49330c6573ad30017f28de69967ba2c5bf6"): true, - common.HexToHash("0x996322ec3f558fd69fcac34af08a6ebac2ad040454025ce11f1c0f21bfdd2ac7"): true, - common.HexToHash("0x5d14ac257ee0eb5b97930e5db96ce890e363f7aecec0a6e03ca600793fbf05db"): true, - common.HexToHash("0x3e31f88225d7785d6548b5b346d695c7928fbf091d0cc709232736548873029d"): true, - common.HexToHash("0x603f09b2e5b2ba6978847e36cf7a58ce392df45a7775aecb09efea71774de8bb"): true, - common.HexToHash("0xdc92b3e218b3e140abea3f8fbd2c3d50e393a92b55e15fdc83de96440de62ca6"): true, - common.HexToHash("0x0978446fbe919cc287f9322ad12b10e8dd6488a80d6af89d46f1270103bf2732"): true, - common.HexToHash("0x4e00581686dc50eefa029e292ebbecbfb5ebbf2a27abe1fc445b8666fd690b95"): true, - common.HexToHash("0xd433136e3a32aed5767636c49e11c7c1ac109ea4a13f8a4e428bbbeb88c46dda"): true, - common.HexToHash("0x14b2ba713a5e948220889d5c9df988bf267c3a989a26268c8b8cd484268dc244"): true, - common.HexToHash("0x90897cba1cc2238e7e75634cf84be91e2708dcbf52787fc0fd4ad92a5328cd36"): true, - common.HexToHash("0x68dedfd4f8d0a2756c711524efc55ab53c5ff8db7772006fcb1fb80f73686646"): true, - common.HexToHash("0x6912c0861eb6fe627f8737d27d92f0d329179dc0a9b07dd0462f0a301353a5f9"): true, - common.HexToHash("0x61efd66b910c83914e9a20c2cdd052dde41ec6b0ac88e53eb105e30a679dbe2b"): true, - common.HexToHash("0xc7d73de5c2b59f04d587b8479ffcd1a0dbe8c67315eab44187d83f91f7f4cd20"): true, - common.HexToHash("0xdd74973daa6c97a87484b5b87749a449236f1156aa8821239dad145d2cba79a6"): true, - common.HexToHash("0xe53dd8cc1ce3fefdc6ee1eb5ce79de375346455ee4e0fe11f109efa577a41692"): true, - common.HexToHash("0xbaae346c3129d485913e0583841adba069c206428a97fcb34cb0aebcc0d1a25a"): true, - common.HexToHash("0xda7c87c524c3c18be297f26703bcf5d54470412d9897cd4d8e4c6a1504e6d3e0"): true, - common.HexToHash("0xb18dcbfa18db6f48ab2b81475ee804617e42699ab6f01978dc92f3de421ddf4a"): true, - common.HexToHash("0x1344d8c6b0cd927ffa21e20545a265def23c486fa823f0d3ce0fda62cffb3a39"): true, - common.HexToHash("0x4e9c799bc28bb9ad67eaf3659c7ac667490e372d3462f8cf21a620ff0bf29508"): true, - common.HexToHash("0xc962863e2f94b423e7d2979118c26452f3d67e96dcd1808940bcce35f5dd6575"): true, - common.HexToHash("0x43c12b3264532c5c588eeefa3e35a1b5c7b3356655a45b063eab48662fbeedc4"): true, - common.HexToHash("0x0844b4570ec8780c2e89981366effc36560529068143003e85f3cc6d2aafa40c"): true, - common.HexToHash("0x77aaadf03d7cda976fbde7500da9388bb9f3f17425030dee87781e19d64c1fdb"): true, - common.HexToHash("0xe7801f5132b37b54f4d2ca7a264500a7859ac6742770076c7a3ff618c0790105"): true, - common.HexToHash("0x512ecec711018c3a19ec0ff2da92f8142b03797251fa4c204f765b9b404e35d0"): true, - common.HexToHash("0xdf6a81803ad63618cdb48a317af3699f5dcd3ce8656dcfdbdcfe168c39642014"): true, - common.HexToHash("0x3f3e69c731a052fd12efbc124e65e3a053074a8c32f903d2066121bef37a3f07"): true, - common.HexToHash("0x5a8e4ba0f0cd4c4151d14fcd75c9025f13ebf91b2ded3fd358c5b007b7bec006"): true, - common.HexToHash("0xae2d88e4826060834832c750f3dd889ffd24e6312ff9a30ab01e3ad1368752ec"): true, - common.HexToHash("0x4f52a9694343703a3c33db08c1db71886e4482dd08164d533b4653c0ec8430d1"): true, - common.HexToHash("0x3c1b1bf73fef739ddcde0bb12b24d27b2705cc876bd0df2a354b512244e283db"): true, - common.HexToHash("0x99a76f45dac4664cf2e9cbbdfce921ab2dc315d6f69bf1eb13e414e4e093332e"): true, - common.HexToHash("0xc350d3be72d894fe7de7ceff01d5992dad0e26e87ce3a6dd0fd80affbae0d6ed"): true, - common.HexToHash("0xb015aefae93b86ef5345e9b41ad82cf0a53e31764d85c726b005f676fd5c0178"): true, - common.HexToHash("0xbf7e7aa5ff5ff3027c74f1af02152417aeb253f8974d2119f8b2dc8225364d51"): true, - common.HexToHash("0xec2b79e376d9a4f76f87a6dcf68a0f28af4806387bbd041432fe0b2e92b211fe"): true, - common.HexToHash("0x6ef801d918f91097278a27ee680b14483620ae7013980acea804c6091c995c1b"): true, - common.HexToHash("0x55985d6024f0e06a6eb749beea8d434ae258c47f96cd1d46cfca669144ca5717"): true, - common.HexToHash("0x7e4d3e7ca94be8fda51892e8f2f86b349b36fff0a0de09d39353801218cdc439"): true, - common.HexToHash("0x0aa92f3b1969d0708a3ba0e65aac8ca1c31d5e07f9ea37ed8f5df5ba64c15d98"): true, - common.HexToHash("0xa4d19e67a8906327146e71a4b0af44fdf30340ce248256cdb2e9c05a578c68a1"): true, - common.HexToHash("0xa900054fa8425ab34074198645158dee673ffcdc4fde4704c906113b9b9a3169"): true, - common.HexToHash("0x60b2f4e11b942c57751f0f229b88e1389df21717d5e7c410059dcee1433c01a2"): true, - common.HexToHash("0x2fb85412b234c3cbe0c350fd1d3abc519cbc618b6154d8d76934c8a2d1b16190"): true, - common.HexToHash("0x3a7b534e7f66c9256b8dc5aaea77e89e3f87f50eef7fb2bb90fb5a4a5cf420fc"): true, - common.HexToHash("0x940e75a4ef2a4fdfb9ef6a731951644b8a522c72453ba1755dd62b535f87e2c9"): true, - common.HexToHash("0xf207667b5523e4955f65b5df10d3c3a20c019030a0903f89e1f2540a08ea3833"): true, - common.HexToHash("0x43426eed13f47fcfe7338db83b334762c86c2bed52e11454da7fe61ea463e127"): true, - common.HexToHash("0x70a96a9bf9bb616fb279d9def5966c2cb92df2feb78f5eba80fa2b01b8ebc7f6"): true, - common.HexToHash("0x00066a56add0748584b142faae548cf49c0de8b1713aa7282559a1e08cc2271f"): true, - common.HexToHash("0x33febc4f0193ce915795b77b25aa4e58cd8c94f9f471a99b2c00668402afb9e9"): true, - common.HexToHash("0xad94b7f54a3dbf9588da6ae3067911e71ae336dc7d0bfd72846fa4bf74bafeb3"): true, - common.HexToHash("0x325d2d4435dc369aff299257e8d19091b6ffc6caee446b5e50711c4b8f0bca52"): true, - common.HexToHash("0x02f255a3072fef83d167730393452d711e9a4cd9f10d03723ea56428c071269e"): true, - common.HexToHash("0x8e5d30884ee16e1bcfdb98844c3904b410cbda10e5d141245c08b5eba577b817"): true, - common.HexToHash("0x8e375f0700ac14d972810333bd7492e45f2d464fd5a4124dce0a415e9b2057af"): true, - common.HexToHash("0x1eae3f1116e499a3e382fc682c8ffcd5c902b2796121c29bd47d70a4af5c7d60"): true, - common.HexToHash("0xb942cb2e1db128444eb99a1d00aece957d48c774320404e04701fe3316f118f0"): true, - common.HexToHash("0x87158b3f8d1a009a5d1d02b7db0e464db7de408e913b4ec0c6ff6611f1b66fe2"): true, - common.HexToHash("0xcb3a9a4ad5dad0b4962a0a3e3c95054bcb57d6c156f5e8419e86061e02c5105d"): true, - common.HexToHash("0x4854cdc8945cf9ba4895c5e6d19810524ccbeaa51983535d80d9c9a5c772300a"): true, - common.HexToHash("0xad3b28e745b8c8482768c1fb250091907b0fe4536ad14333d052d154043de0a3"): true, - common.HexToHash("0x4ae7bdfe8908c3712449a7ab406706a171ab0d380c54d6b00e03ffcd68128b37"): true, - common.HexToHash("0x2867d0587a45a4720a00f07795228c5e7d6bbf5097676a91685f5e7c7d0c99cf"): true, - common.HexToHash("0xe817e6f4702b9bcc554b0556763d6e8103713bab594c3b1a9546a70e4fdfd49c"): true, - common.HexToHash("0x6d5f8073549fd7a50997861c84c0b3a49ff425639484ab41178f18ecb665f1be"): true, - common.HexToHash("0x73e4acbc201eb9226175b6d78f40dc8f4abd29f1018733468c56cbc8549c4eb8"): true, - common.HexToHash("0x65c41f15fb5161d4f7badf2e6f6e56cd8824812abe17d59107da7e5c1bada25d"): true, - common.HexToHash("0x6812aff5fa4d2830d60cc104cad1e5657e988ea40587f161391d51dd316dd21d"): true, - common.HexToHash("0xe38f0cedaf4a0e13bbd7c9a0a8d13763ca2a4c0ce31beaf4722ca7f1f9721e91"): true, - common.HexToHash("0x99647b84b60f2abd81760bf27b67409dba97b4d7411caeb0c05e73ede83f6b0b"): true, - common.HexToHash("0xae4f6ca822dac045edb6a67826f4d23e301d8e9d6021ffe586caed7961edabf1"): true, - common.HexToHash("0x2986413ff9caefcc5f984a8953640e6d795ac9206dad1989539fc05cddf6e5b4"): true, - common.HexToHash("0xe289b7de95591f2bb919dcc696e6d5febd4e3a62675c2d1de49fcd0ca94cccee"): true, - common.HexToHash("0xae4af8979e4787cf17d942bab081fd3d48b7c5304eaf62d39abfa69751426993"): true, - common.HexToHash("0x06a908549560d82d8f37bf26bb6fdadf10c8012bfc74acbc080c8af130c7c617"): true, - common.HexToHash("0xa05c473afc24a64602f9a3883f05bf42037f3a14e3d91e960d66508a1b535306"): true, - common.HexToHash("0x17ae21b04b5ed377fdcddd05cc16b1f392e7cd43e0edc4f929ea06d1884f3689"): true, - common.HexToHash("0xf0e22247f67885e99cfc1d4c34b4608a8c272999fb07703bd6151a9646b2b950"): true, - common.HexToHash("0x8d87a8b4dde83b47e77b09602ebde4a29a2082195169e84845ca7c3894ba4518"): true, - common.HexToHash("0x23aaa1f4f2f5c73d5f0a8696f65a0f9aba95073dd38acd1414997b59fb3ae2f4"): true, - common.HexToHash("0x5035ef27db9c2751d0f25da879e760da33ae10610dcd0ddbe9b2ae97fc8afdb7"): true, - common.HexToHash("0x7285c470368d41b8764737fb383a7e0ebc5cf6477d8eaf159e0fb4984dd39b3b"): true, - common.HexToHash("0x76d7a771e4b1680ce00cecc910d0525f5d78f595c141cf0df55776afef20a406"): true, - common.HexToHash("0xdf8441acbcb3ac7d06981bf2afd0e5e5b62e10ec922d7a7729eaaeadb775e500"): true, - common.HexToHash("0x6bfdb660725de47b2e1a35ae1260850c5e2c3d814a65c730835c71f45ba1a058"): true, - common.HexToHash("0xeaaea8e6a9a0b630cfa67d55174584a3461d32266e6c318ad5e3d68c37f9ba7b"): true, - common.HexToHash("0xa2d33d91e8f1afc43be5dd6dc6ff8bd8cfd505d0f80d90cd7b92fd4b77ece09d"): true, - common.HexToHash("0xea79bc00a21f1d0dfd06abcdb5347dfe1f8c6356550d440e94cbbce6a3882e35"): true, - common.HexToHash("0xde8c610008507205f84c68e957e604d7afbdbc0c79382251f07cff43ffea5f6e"): true, - common.HexToHash("0x8a7134953d2273b5bb894ec962aaaa965a73429e671e88df2d6695cf9a040e62"): true, - common.HexToHash("0x79844a896438e88b02da6700d2be81081feee7a3fdee06ce99a3ea7d10c6860e"): true, - common.HexToHash("0xe3d2a128464cb4a079f2ae789279209bfdf5ee1b4e6747e7b88d51b5a7a25ef4"): true, - common.HexToHash("0xfd3b6251b912d20ef333a086ffda2cd4fecb985a79360ca5835d1c61be12f0c5"): true, - common.HexToHash("0x52d949d8fd583d6c768549f674457ced00e6044f772eb6e187272f8a016255dd"): true, - common.HexToHash("0x0fd4b9e0f8e1da7465b4714e3e09cfed7ce7a0d2e44496e8c2f4a12b5e0ecf5f"): true, - common.HexToHash("0xc9288251a045457a75643c2f42202ddc83e078ebb8047f37effcb6e9f438cf61"): true, - common.HexToHash("0xa8ac0dfdf2b690c37bd7d1282023071bf0d9e49e1dd0867a65bf6c3b792f9c3f"): true, - common.HexToHash("0x1b7986a2aa3f3b2e76b8b0c939645e6b35667330c292c851adeed86109766571"): true, - common.HexToHash("0xcfbbe0afcaefd29eef78900cd4aa8fbd0806971c20c6ced110250409f6e15463"): true, - common.HexToHash("0xdd604794ab00f88feed2a19a8c5198c12f49bed8764e94d456d88b8a9831184b"): true, - common.HexToHash("0xec3989d7f4e9eb54ede4f252b0b86306bcd3ca5fd91424f410921e2125a30640"): true, - common.HexToHash("0xb6643d7411537008faccf010451d01a6745a574a88d9cc76f0e4a34087baac94"): true, - common.HexToHash("0xd99231e3127a18728b82f2fc5d075801eee10cbe3a3b846e0f2597a8e5272e53"): true, - common.HexToHash("0xe22e30098603d77d087ad9216121725e9907c17430b14da84961335ca5d26907"): true, - common.HexToHash("0x3ca237f49db983d7d391e08a84db52c51d90d118f0db5f8fc4aa3bbe091e830d"): true, - common.HexToHash("0xb4a58454b29ca42b1e5b882e1bc476c435720266bbef88a4786396514efbee36"): true, - common.HexToHash("0x7cc40aee57d5ddc910c328d9186ac9fc5ac38c06a54247dee5b1aa7f2ea94a99"): true, - common.HexToHash("0xb6d5d581166040d86f2397c8db546148f2b72bba050b7d2b1dcc93588dd4afa2"): true, - common.HexToHash("0x7b4fad86882535986526d48cec2ffe1fffa06668b0d9c6fa08955b9d26c4547d"): true, - common.HexToHash("0x3048699a4b46d40633e9521e06896876b6befb388366e56a982ad9de0f365505"): true, - common.HexToHash("0xd34b22e226071e20cc5a74381b9a8919bed728be200149a71cda4781c08df2f2"): true, - common.HexToHash("0xc5f7cb591da8792a5275e9f6f75e4e031d1fdec422bf117b62771618ac947026"): true, - common.HexToHash("0x83bc03e9c17b33c175cbcffb74aedcc601cbc71bdf546fbe3033b051e6b57207"): true, - common.HexToHash("0x01ab06963d82f9b563560726017c584d6febb7d2583655deb52c9548b03e8e39"): true, - common.HexToHash("0x7309416b59dda0272e8e710ce276ae462555fcb207bbe4a0a87c1cde1296c9f6"): true, - common.HexToHash("0xb10da8a8ac94184fa9c44817347ed29f452f68287bc90b9493eb85e2266d317b"): true, - common.HexToHash("0xd21866b44d990ba06e121cc781b98e4524f8548b07d91ee41a10fcce274358c0"): true, - common.HexToHash("0xceb490a77232e3d99aa666e716d619748fcbffb534b5ae0f9bcedea6331b66bf"): true, - common.HexToHash("0x51214f2f161bdbd40828b8e9db9108ca949976497ed181acf690ae7f858fcfff"): true, - common.HexToHash("0xc6bfb5cbf49d9be05bd5b9d86b3ebcd8ce657466a5e5b36bf7f6ba13f15980d7"): true, - common.HexToHash("0x4b8d271eb1eb20761052d994edb5fb4f4b2daa6758b7d42fa4a7361f132d7a1f"): true, - common.HexToHash("0x5281db7cc752643813a61571dd1cc2d6adac48918c6f951732519d6b4913a64c"): true, - common.HexToHash("0xb46890a23b10962f166129ff7d4627615b4ced51300e66b014234fb7168aaa5e"): true, - common.HexToHash("0x0c0a5096a4472246ebec3af6be3377d001c1616d6653bf17d12680bdfb00ea46"): true, - common.HexToHash("0xe3e9625b10dc1ee69804270ca7967e17b4e396b657068a4480de542c44584b22"): true, - common.HexToHash("0xf39457330c806a6270c4dbe7f5d9c8c259c1ae89d456988c0731f5b9b40a2b93"): true, - common.HexToHash("0x197085b35bac28995f9fd804c1ea879dc7841513874ae40dd1630fb42ed9a1eb"): true, - common.HexToHash("0xc3b074f29cbea86eb1489f378b5381c6223ae17513e41ace391a5da9957c5593"): true, - common.HexToHash("0xa1cc8722837e99f48ac6eac37dba202d90421999e0b6eda93dd944b38c8b092e"): true, - common.HexToHash("0x5eb58f48090aae02d3b00fbe8e1c01bfdec912ac60c649df05ca23206f30bd31"): true, - common.HexToHash("0x39d1a2834da50b1cbac9ed6274f0c0cabaa195887ab8ce98353ee7df7014dcd4"): true, - common.HexToHash("0xfca7461be8e9f731fdbb1a4149a30bfef3bd7fa614295a763114274903c6968c"): true, - common.HexToHash("0xd71711a3fe8eb81bdd0f92593d97a2611f1f3be9624693631e1192cc82bb70bc"): true, - common.HexToHash("0x4a60a6874bab322ebcfce7ea563efe46916a4674ef0146d7004f5b5092d8f316"): true, - common.HexToHash("0xdb6cc45d3f1830e1e4373a332dce14fab5d9c72c7680b65558de5d9addbe3c91"): true, - common.HexToHash("0x4c27b6e0c26d832960fea4408ddc20cc4959f36188f3b2a64beae1cfe1b6e9e9"): true, - common.HexToHash("0x26370aae71d04280287950052f06cac81b510a2ddcacccf8d64d0c3885c79eee"): true, - common.HexToHash("0xd0dec9436141d1509f1ca259979dfd2d508bce992be34a954d2770167d8dac22"): true, - common.HexToHash("0xb148720560e11fcea6f5e39b0d0056be1ef97d14aa9310a028defaebf4b75a38"): true, - common.HexToHash("0x18a301265c7ea7a6a0070ddf34b9f4aa5dd96bd612c1869e3428a62980cba78f"): true, - common.HexToHash("0xe4d832b8761cca9e2120446c02592f9da702c959067c9a33a545016e504c4dc1"): true, - common.HexToHash("0xdc825be02cd90b5620013b4b4c40c060a4419ac11f12af65df0c49b7d42dc870"): true, - common.HexToHash("0x5b4caee7e0a0273a236d39bc4197d180027cc0b27456485c7bfb3b6253502653"): true, - common.HexToHash("0xf45e07761023d26685dfb44deb901aa17ec3f4f3284fdbda8fff08352f065641"): true, - common.HexToHash("0xd3465fea1a2a12bd205daede15acdde1511b4d46d4226f6180c315d5001b2d77"): true, - common.HexToHash("0xb03820b29201222db9d5b8384009ba5ad0aaf090c5305d221c9743d5cafa344b"): true, - common.HexToHash("0x1f6ac502c56beff19e67d101dc38f355e9729a758ba5921967b81191c62a8ccc"): true, - common.HexToHash("0xc949d159151940213e31d2547797e6db9bb10c4bda51668034702c7f68c2a749"): true, - common.HexToHash("0x2bd392f9c731f1c978fdb9c00f64c227d79493a846ddf504567d533d9b1f2417"): true, - common.HexToHash("0xe8a642a8449f87ddadada2214cbff05e0adc7a19056f69c937d14ef7ac11bab3"): true, - common.HexToHash("0x7ab6184c8e3524a00c62ba13eeeb4e5b20cc452aebf6c33800479948acf66802"): true, - common.HexToHash("0x984f842e2ec7ae6e7a7165d6079939f99f559716d5c4ab8c26fe1f134dd1e12e"): true, - common.HexToHash("0x740045d29237f388494536e1eb12f6bd79a6172a36430968eca2b0b5ba8d2752"): true, - common.HexToHash("0x85ae41d2329aa3574bbaee12363a263bdfe4b97d180406ab9ee5ad90ec0d2748"): true, - common.HexToHash("0x63fafd10371366a39d623af4eaf354a180e75fc9692e4c763c5b36a5b45263e6"): true, - common.HexToHash("0x3c46192b6833a2505e86c02bf78a86a7b8f14e82b9be93ebde5bc3c370ae7cf5"): true, - common.HexToHash("0xcca76d2713ccbac834f87907af32788c4125e5718b413ec6d20068322a4c62af"): true, - common.HexToHash("0x004278ac29f59c6655253bd54a901b47557759dcf3f7b3d45bf971cefc4dc1f0"): true, - common.HexToHash("0xb2f38524829d17be6f98ac720bab7398e83a76a7151a21e34e41883cd03488ab"): true, - common.HexToHash("0x8ee54ac209c50cd2f8981d5b7b5a475d0a936a45c625b2f6cbc18aab5892577f"): true, - common.HexToHash("0x183a227c6bb7c5a84591fbebb9627f37f7d4faa9124257b88e62b0066fa3b012"): true, - common.HexToHash("0xd8cde2d0302cf932a567b70788b2b961a054b164aa923795d0317121f2df0e8c"): true, - common.HexToHash("0xe8eed22b4d0d7ec4fee31a5a9098c5a43a2754eb9fc21c0184af09d3c29a67c9"): true, - common.HexToHash("0x635e4fef60717b0e684c5fcee9ec6c8686ed50c0dc92303bed8223162de6a52a"): true, - common.HexToHash("0x156f58dfec76619d33c0116ca158423987a05450dc7da93152a6f3fe298f9fa2"): true, - common.HexToHash("0x36f82ea67d06e795c86cd5acef8d727647f21db9b2e5691269f3bca9b51be5d9"): true, - common.HexToHash("0xd396f0c761d042761bd68e745400aa95e86eeca4f7337b5bd1395ab04b2a39b8"): true, - common.HexToHash("0x52382c87c99240089462360407d49f58a8efcddfb307d86e8dc63a2fa9b21160"): true, - common.HexToHash("0x420d40cfe72125dfb2195363bce76f075c0edac4b5e28fb2da3307f7783db366"): true, - common.HexToHash("0x534d654be26e158ce0a8c0ce7cb262978fc461573653f7d39894df5ed5dafb65"): true, - common.HexToHash("0x2816773cd55ed3695d98b6edcbabf476d9949caf41a05fbf5314b3555c1768ff"): true, - common.HexToHash("0x7c5b08999e80dd415f859e672e4fc9c5b6c67debfc19d2ba72f4dc19ccdd30e2"): true, - common.HexToHash("0x6ab037313ed193ed7cf648b12d76dcbec790116f8f6e7d64040b7721a398e731"): true, - common.HexToHash("0x7b96099ad25a095b55b245d4365ef6e34213f07b47298848f7a8563ff74cb6c3"): true, - common.HexToHash("0x38856dadec9afd427f8310b26faa8e895f2009b00f1847e82a06ea5fe5f532fc"): true, - common.HexToHash("0x67daa79caaee33562a4d3f26f505b4d03e7125247e8bd3ff9b3e00d6b806ed79"): true, - common.HexToHash("0xa78b852fae15f8d7c18e35127d2da25b037805a474685da39a2ce5d77e2eddff"): true, - common.HexToHash("0xf99a8728eb6ecfc554a07d17ab3679be292a51d2e3c4f0ef4677738f4c333030"): true, - common.HexToHash("0x2d89a0353fad8a4cd233c0a7abe669049a302457a37d1f833e23ed0ffff491ab"): true, - common.HexToHash("0xbe1f6103cec29bc8178bab0b001b67171c6786e9008c50d24e28ab6a86f8eb24"): true, - common.HexToHash("0x30cb11760fa90f7e6aa1a9c218eb90fb58d71de22d695fa65e609c24ab085922"): true, - common.HexToHash("0xd90977c569dbe8c770347d350bb884271d7226c6086785823ffa72fe4fb64016"): true, - common.HexToHash("0x95cf9e3155ecfec023e05cd695a31555ffc1dba0eb904141729fbbd1806d9e39"): true, - common.HexToHash("0x80fd681d3a9f74997b483fe267f13496ca7af9b97c976ed78b5155ce8345047e"): true, - common.HexToHash("0xd912ed604e843437b7aa2d8718e7e5ec24a05f29935448704acc8daffdc1e217"): true, - common.HexToHash("0x04211c4f674f0ea66e854b2c467b95123f3b9a42d0174fc3ae423fea619af482"): true, - common.HexToHash("0xd4d4620fbe200436afe7c6b8df339d24c06514ffca0d0c546e5c7a4ac60e4575"): true, - common.HexToHash("0x70ed9b2a0f0a98c1bd2b6544d1dba2728f09d8bcddd89234721147cd93e53a4b"): true, - common.HexToHash("0x60fbdf38a33b2730f2552d8c86802476315cd74ed514c256a29f7dae225be0f1"): true, - common.HexToHash("0xdedbe9df269c077217cde73299d137f8c9e15896431ba5a0e18e3b85e7d2dc52"): true, - common.HexToHash("0xf691f2789bd0f61b31399fe6bd700484f03b031de15af2f0b94d9f3edee867b5"): true, - common.HexToHash("0xe1ffbefd7fd80a119188ded18ea71fc99cee64827a875b88a618a4e485768d41"): true, - common.HexToHash("0x06a1e3862996e54bbe21d23a353531fa9e7af070abafde0b6f01340de07763e1"): true, - common.HexToHash("0xae368296d825c2d1c5b4d61547a85cdb7c8941c21d57c9d4d786bff5897db1bd"): true, - common.HexToHash("0x3fdedc2bfda5f7ae29dc491dfab433754c5ee1453682ab741cb780d0a3026889"): true, - common.HexToHash("0xe1a9bb3cbde8c8aec0cdb5be8da5ae75a61901215fcead8504fdade73fbf2de1"): true, - common.HexToHash("0xa778f231768e9af735caa9f9d80ad2d066f285f36f2cfae8fce78eb7f980f96a"): true, - common.HexToHash("0xf3f563cc34ffe5361be490a7872122f7265ad07219613dbb236af2bcf43ddeb8"): true, - common.HexToHash("0x91404790d9835d69632ad4cf610eb578e8d927488e569fb03865c17e3038819d"): true, - common.HexToHash("0xebc4deb30ebfa1e95212d741e894d218ed00a03052da89d432dc68a9f57ea7ba"): true, - common.HexToHash("0xa853c053aaebc4f41acce9bf05ceeff787b6876b11f5d50f23b517d2fc2b16a5"): true, - common.HexToHash("0x1314db21e128b3dcb30aff38c29217a8c42e3cae6032946f7d8878c8c1d991b9"): true, - common.HexToHash("0x616093ccda3eeb337556622ff565318ba19a5801cabada1d60c55c4bbbf51225"): true, - common.HexToHash("0x4b64fc44ea4ca2714b791ba8b9a709454fa089fe73baab7b40eee651dc7c0edb"): true, - common.HexToHash("0x1082efc3b5fb31240a379f106af634f130484ef7aa5cecdbf3eabdad11b576f4"): true, - common.HexToHash("0x9172a4d1536adbbd50f37286eb61d68ecf43287b50562c5ccc9f117d7bedf0c6"): true, - common.HexToHash("0xd03178888aae93dbe922f7c372b56598f70022fa3c9c1d87d6d2715c100e9fbb"): true, - common.HexToHash("0x8112390107a6bd427592b33101787c07989ea707de06d833e4fcf8b2ebaf89d3"): true, - common.HexToHash("0xd8fb6e5bd0071e32c2071c84a0da9129fa1e85a8e612ea3069dfba0c77376d5b"): true, - common.HexToHash("0x0ef6a0a00faa677ab66f5825dadef154061f06c21a1211afb910776b42b201e4"): true, - common.HexToHash("0xe2b87a76b680943ebbddcd1db90af7db05aaa7a840d59b820a56891f5c099c8e"): true, - common.HexToHash("0xafafef049ee646b902fba8c9d1a4dcb448c82a6e848be8919e956ba3cd2371eb"): true, - common.HexToHash("0xee1e0851741f06563930adbdbc5a0bfa5f746ad3423be7a117dc02b8f8cb29d6"): true, - common.HexToHash("0xc7f963fad1e8f37d08a7e6ca03516528907a2fa1c48b42216b8b146346baae73"): true, - common.HexToHash("0x0f3d14d83cf58b9a926558afc9cb6bee7ffc036616ce3b0383edcaee23c45b98"): true, - common.HexToHash("0x521752db9a1a540a727b9e05a6028cdda24b737c44ac8201d24613432b993d77"): true, - common.HexToHash("0x3d764f5ef0e5fdc7e838ab36578dc24d1684b31a38dea6e1403dee8cd0febb90"): true, - common.HexToHash("0xbf24f7e954938d69f33065758085d7f28eb2d13034cfdbcc3861b67204b471dc"): true, - common.HexToHash("0xe51ee3e22323daaa1c409674a65cd1702b15e694bae8bec1802252e4585da486"): true, - common.HexToHash("0x334eda947c487676287c1df5bdd35af97f85424e16c7182ff09b3764042f1e1c"): true, - common.HexToHash("0x7b4e90d3802b56cdaf91682a27454094667c0c902fab2f3c4e478cd5a103b25d"): true, - common.HexToHash("0xd43e59c5db0dd450722faf91824ab02cc13c87ce2dbc981bb33327a4b4aac3c8"): true, - common.HexToHash("0x6febdfb6a8414625174b52801003f56a3f3ebb1c55d0cae675e8a7a8d784dd30"): true, - common.HexToHash("0x0a5a1e12b5d4facc412b293cd8909098115ff5e6e191cc6d812bf45928b45ff7"): true, - common.HexToHash("0xb356da34c596c2bc9670c527a4e6662f6ab4a697bafafd4f76a5785fe57daf78"): true, - common.HexToHash("0x404afb25c6e30efbcd69b450f819cad7db30ca2c119778a7267be0c0e752b081"): true, - common.HexToHash("0xa635c1afbc6607cddb7f51592d9e42928224b6d439879239e6566fe3c010f97e"): true, - common.HexToHash("0x87d686e3e87510092e2438fde005e21c696a4c40596281c52da45c303cc8d39b"): true, - common.HexToHash("0xea949f0932d41ca8f56a86816471e95658abec6f9c45ab8949f93fd9079f43f6"): true, - common.HexToHash("0xe788f368aa0fd387cfac057804395cbed9f50a733460d721971b0fc95c9aa942"): true, - common.HexToHash("0x6ecef0303677d4766df7b8f5621e298f4c4d7d7f4a89f93349a98247fc41af0e"): true, - common.HexToHash("0xc4b99f4c6112a41ebb4ceedf9983a69d0299a5be2d83706ac21ae037109921d0"): true, - common.HexToHash("0x367e8682e540ae30c95360bc61e3fc0b82cbc9015ad7f4601ad7834421079238"): true, - common.HexToHash("0xb0bf43e00e982dee687a0d14c72fc842d3c21bd67d82d4bbf70a5045a4b25d46"): true, - common.HexToHash("0x06574ccaf1a9991b46db032be52191bc361c20c6047e9819b7139de22cd9df42"): true, - common.HexToHash("0x13b4d178cf59645bde1a8053dab37059d235ee25f67dcb4e6bff93c183f4d551"): true, - common.HexToHash("0xfa8e2134859247ee387bcfd0e11256992cf0fca901e9499d53ab9725fe169671"): true, - common.HexToHash("0xad133e9527d547f283619c844437bda3b4df35422b601c3291e82d12c871606a"): true, - common.HexToHash("0x434cd3ca552669d092246562e8e0bd13636e10ddee7f6a53370f6fa869896e18"): true, - common.HexToHash("0x356042daa4577072ce3af40fbb4e32a68c91a363cef60dafa7a5f829437c7240"): true, - common.HexToHash("0xad90cf4431179a7d1a5a90ee6717d572d294554df095c013e849c25661655e0d"): true, - common.HexToHash("0xade98a5e17c94cefeba7f3315404bf5cc51cd9c255c0ecfe2721c24d798b5a9f"): true, - common.HexToHash("0x7d6ee9a733e1e49d8a2a4c325eee3d41eaf4af519c67afe064f0fe8285a0f1bb"): true, - common.HexToHash("0xb4709065f9ecfd3d442b62ed4636f9459da92b9464e2246a7aa58dab0d1e880e"): true, - common.HexToHash("0x3844700a98151d0ef575a3b4b0a8112a5c7554ccbfa0c2eaa5c14eb6060154da"): true, - common.HexToHash("0xf15b5a3b84b3211cb98767fa3c2a1be663515319d0dc115b242e3084782bb4ca"): true, - common.HexToHash("0x6154b9a1aa5b9c28a1cffa65b262b011f8fef8e5072c66a021d68200505aa1f1"): true, - common.HexToHash("0x07abac3dcf64353f3d8a22a1d29c3c25e64994dcd0c94be2c3f616a91dca5d8a"): true, - common.HexToHash("0x91ff9bee4b823a214521a7db71e9ca2f50817ae5d8f9c54ce68f258e2b019b17"): true, - common.HexToHash("0x73b3605bd6d37cc3f17491264d8582bdc7d605e969beca42db90f7a733da0c30"): true, - common.HexToHash("0x36ca8d6e4a193997f720a09c489a2d4c6fc3769459c167c8d7c4c9755df3ccca"): true, - common.HexToHash("0x11b897e9555bd852ba614e2aaeaea015774b5412fc68c134cd0058703d64f3f6"): true, - common.HexToHash("0xa504dacf9824579c385f6f5a6107f4e8d04297efcd4cb961b233f49371d2397a"): true, - common.HexToHash("0xcd112de24009ecdf2c30f2c016779cc2742d65f1f807c20dd07f50322a6d5cad"): true, - common.HexToHash("0x1ad653fa2919bf0ab791c37aef18344e6874b92ba730c434c211c2ef769e1757"): true, - common.HexToHash("0x4aa825beac6e2a4a65e4d401cf4ed0b23069e13a4ef3717231d1faf35c24614e"): true, - common.HexToHash("0xc0a1af0fecf88d6a84c782a07f6d3676a99d81b57e2a04752a66cd5614e7b8a2"): true, - common.HexToHash("0x7438ef44314bc9b94abe782ec0ca0f200955e92ac202f20a965f60e3f9a0515b"): true, - common.HexToHash("0x738bbdbfe83d531b8e97a005304e5664fa0ed32f7e9b687b9ef4883df9378667"): true, - common.HexToHash("0x60e96e154a3a9f1daa6a396e00b06f5d1d612867685c63ebd7732416e25ee009"): true, - common.HexToHash("0x73b03dfcb5b37bf01bdacf3063b298b1c5853bdef350b6a010592a79bc0de7cb"): true, - common.HexToHash("0xe7dce39653880fd7a0be6defbe589559f4e72841a55075ff69d53f53aef725f0"): true, - common.HexToHash("0x6c51eca4b9b6e81e431d97743aeb87852deace5aa8761688d90dd92529a8ca14"): true, - common.HexToHash("0x1decf00406ef541daa2a1639ecc9d802926c2028eacdabe438c3f7a0e56c3a1d"): true, - common.HexToHash("0x338f60e995c087e3b460f43ff275ebbd9c494814f9026f579220e123103ea958"): true, - common.HexToHash("0xe742450816882fb72197c512b374b19e70ba788804318aa85fef54e9ba6a9822"): true, - common.HexToHash("0xd55a94f43a62677ea4a60b98566fd4e14284842f314c9ab50286920af979cd5e"): true, - common.HexToHash("0x69e568bb2585cbf3f00039f22caabe23fa5c75513a4fd9ef00666bfe0b47ed85"): true, - common.HexToHash("0x885ea74be363b8a95143dfa9ae67591e607cf61c4374e31f770f6236c1e3c193"): true, - common.HexToHash("0x2495c544fb3e1b0e0e9febb09e537a4905c15df79823d06cae767ac257f06368"): true, - common.HexToHash("0xa7b167608812f7771fc31cabd375354be006e2f3d3672700a517117681640944"): true, - common.HexToHash("0x2464116b9a261cbbd81e7125d5acc9ebd23577d0d19b1324c69ee2520471fe2f"): true, - common.HexToHash("0x01cf6a5529aae825706b1aa5d73d87d596bda4c48bef8f68fcfa9b1a0f1e7fdb"): true, - common.HexToHash("0xbf63d59ab4e4767bc8d7829f2607fb9f73d62587e33c2b915a11cfa3f1479d64"): true, - common.HexToHash("0xeb97ca74bca21c34efc6b77ee148b71d29ea79f7012998297f044c0942fe8243"): true, - common.HexToHash("0xe84115c380d74c5455e88cc731e7bc6f4239428f48b02c70a3cffa33135dd89a"): true, - common.HexToHash("0x3b0285d952adbfaabd81f5d855908d9bdf5ff57f2e7a67039f90190eb1bd492c"): true, - common.HexToHash("0xa90068ebdd5e2f1d2c19717037d2c5167317527d6c48ec7530763db2ab42b9ca"): true, - common.HexToHash("0xb8db51f1be1371d1e3bd32692f894e90d5a165ddebba3284c13bb43aa0c0b954"): true, - common.HexToHash("0xecb96e5e72b259af36f7275685148d64c5061fe1d5f0f09e6cb1f6468d428724"): true, - common.HexToHash("0x53a8eb84defcf844dc3211250f116f77fe2b233be913397085bbfa2ce8e62739"): true, - common.HexToHash("0x063d995d54b3a5720eccc142a58c5d0db0622d5b21e57dfb850964f023bd6a67"): true, - common.HexToHash("0x647886ff94172eea94eb70d26bfbf7b21aaf13c725ff8cc83fa8f40835d9c96a"): true, - common.HexToHash("0x57633da59be76a6cd16848cef7e2b244a3b1bc57922b092222eeab9c74ca27e5"): true, - common.HexToHash("0x57ed9e6fb0aef76c4b5bcbefa58c62b2452440ab2116d75c88a99bed5b59b381"): true, - common.HexToHash("0x64f55339b628f7b47ce6f8e5bc15af2bd9319e746a58eb85afcb387ef98efd65"): true, - common.HexToHash("0x693d7f471466645ab0710cb07facd983295a8706d206b4d943b1624b7babb9cf"): true, - common.HexToHash("0x7955263ee21c1bacb33b4d841fcb90946b2fb493cbbf0930d312ea3019f63b7b"): true, - common.HexToHash("0x6331903f91cf8c55b4c560cd7609bb8b7b44ffe478d6f2e1eab53b8ca336ac04"): true, - common.HexToHash("0xa9930b0a0dde8ba1fb460092993f7d5e51755687417dbe345586685c105c5134"): true, - common.HexToHash("0x3a22b7e7f8a39af68992ab20ecb2939ee010d5a49791ff0c58055d705f58b9a5"): true, - common.HexToHash("0x92c1f355bd31247c001668347309eae74ac0560eb962256d040dc6fa61471b2f"): true, - common.HexToHash("0xc84a3cf3746539020a2a242ea009e38d4b6fb1be8dda903be7b041ebdb7f00b2"): true, - common.HexToHash("0x500b9aeb17ef60cd7c7ac74df42cb30df8678f999590310588d09fa3105ccd44"): true, - common.HexToHash("0x26a4a5cc9037a737a58b71e4cb3c1d71709bf874d6066ae2ea9b070bef6a7855"): true, - common.HexToHash("0xf03203a34a8ac1c793b5b7871343ea0a96465d2c5c8b93e93d6c9a30b88e27ba"): true, - common.HexToHash("0xeaf74731373cef9e27bd07c6097ce497972fbf0d35f351a4f1cbd6bbece635c5"): true, - common.HexToHash("0x588fd40c607728c035e87a488dce588fb9b205632aaf5ddd1f9d8bf2fd30412d"): true, - common.HexToHash("0x6f6ba9628dedb88635b1f0b7f3780e513caab000d1c055d38d67f76f03620b85"): true, - common.HexToHash("0xff88241567ffd87b2076982bce0fa51880f50a75255519d805c235d8fd500230"): true, - common.HexToHash("0xa681d9ea1548f393dc3d29248d652972a761afdd398ba8d40d74eee4769b7ae4"): true, - common.HexToHash("0xd617f36ef6325c84411a3ef23c459eff1907396913e17c3122f5c855c3a79d0b"): true, - common.HexToHash("0x0229d501ad73a5f0f2a03cd10b85cd2fda99ed26c5628092d45340a2dd7e5146"): true, - common.HexToHash("0xc5a322ab703f8d04b6697cf7ab963063847991283a94b9b2beb7ba6361ea78bb"): true, - common.HexToHash("0xf135818b84274d54fa06187ee96c13a750377895522e6e687843244744904006"): true, - common.HexToHash("0xe473de334ce31a33106544e8d5f5d583efa17c384842fd4d977e4aaa13253013"): true, - common.HexToHash("0xa1c1dabc617f1ba707dba95bc3b9b2fe6d28519d1af3c925ce511c0841f178cd"): true, - common.HexToHash("0x22fea511133992df7a5cb0d8fbc4ab9943d3daf2b760be0bc77f50d0d1df47c8"): true, - common.HexToHash("0x9d4d5370df8763f96c20ba7c0e08bfe8d5059cd6760b1e67b2cb5590ea09a046"): true, - common.HexToHash("0x868bca039757fd5243b6bf6c427eb09bb9345cc50c60029c7c0e1b127eabf23c"): true, - common.HexToHash("0x515ce889256e8b5308af31ca91e582717d9c4f4ba4db77cf171267cf5e08225b"): true, - common.HexToHash("0xc36daad332a36d7defe7deab511619e816e2ef7eadcefae70814256968f51968"): true, - common.HexToHash("0x96a81ed54046616ad1971a292ea683ea3e8c18d499b1bdeef29dbefa4f6e669b"): true, - common.HexToHash("0x4d473c441802e0e5a504f61c72ac6a4d4491e61b752722da7b29b3458c0ef16b"): true, - common.HexToHash("0x2149f8dcd4719fd889e7be14750615079bc25277a4ccc83240b4f2f1b5d1d1f0"): true, - common.HexToHash("0xdff68df5fb5539deaf28524157ff81601d3eaed7043fed7a82cccf71fb644803"): true, - common.HexToHash("0x684fd5d4b6d0547cd896ed4db360956e02ec20b77880fa47034868726a98b437"): true, - common.HexToHash("0x851e7fdeb955f721299cb58b48976201ad62473aecbc2fd030443ab6fbe9fed5"): true, - common.HexToHash("0x201342a5a89937af411aac38f1f5e85bbc4b200cb2854b0775d771c4e8271f0d"): true, - common.HexToHash("0x2779a192bc1cfd084db77d1315b50eb07e925a854d472becaf2db5c7617c121f"): true, - common.HexToHash("0x8f04d25a1d9b33563d302562c1b1f46dfed36977d05cdf02015b89bebf11b8fe"): true, - common.HexToHash("0xca98e1bc78147d8b2f77b588cfe04fda5a729ab124656e921c4456954feacaa4"): true, - common.HexToHash("0xb80e16812c8fcdc7d5c27551158c9a07353c511b2d60c4d782631a82f1ed5e5b"): true, - common.HexToHash("0x8189f2a962438ac74d5628fa894fcd92ded03871f393c45113fdab12cf93a091"): true, - common.HexToHash("0xfc6a90e1f36a334fcdd73d53fb55d15a0e2871e2d281771db6ce1aaa7482d362"): true, - common.HexToHash("0xd4d78027cf8fa965b66655c044dec819a3f14e119d44b0aa0e13fea45b59384d"): true, - common.HexToHash("0x8aaae34a8dd33f7f1fbfff13d8e97be5e615b1fe73b1867a3e29e171e71df783"): true, - common.HexToHash("0xc78b84ba6e8054a2be5478397d699ceba5d89bc9917f759daea733dce6a36e25"): true, - common.HexToHash("0x4a97d2664dcb7808bb55e5627c539fb0448d95541054cd88e13c0f202ad08002"): true, - common.HexToHash("0x8537afb74a49b47b3f5f87d68a77400f5175c3f5362c8cdbff05b1f77128d40f"): true, - common.HexToHash("0x5b6f4defbdc180e62da2e55e4fdc42c91492d63c2bb37b63ccaab327ed24d8f6"): true, - common.HexToHash("0xdc71d24db2886fba9176f9616b685e1ddcf44e62844bd1b8408709920d17c10c"): true, - common.HexToHash("0xe5d47b01245210356a4814f7f7a4d323455a55ccc5eee6a9332d8722b33ef35c"): true, - common.HexToHash("0x1877338b2b58189616a13e83f8138ee27b5ef7a9fdb7bd7f9950407fb965e6ee"): true, - common.HexToHash("0x4bb69c6450b97d3cc850c5c988bf904a0de251cf0da77ed8ec7bcb0cb0c562a9"): true, - common.HexToHash("0xfd8a73dcde65b9e01aaaa44cd53ab18c74d8eeef00b7639f4f4b82753608c64f"): true, - common.HexToHash("0x23efb1ecc6af11440306073dfdeae65da78a626b8d5069618e639d96bd70a2d9"): true, - common.HexToHash("0xe8cf25670ba0aa7cd7399b45b0817941cbcb4fee0fab8d5f326879c42f06375b"): true, - common.HexToHash("0xca09de17a03aa1d532f19eea7eb8262cccfecec472bca9531c4f7fd7225c5769"): true, - common.HexToHash("0x95b4ff37f95f83036d15c21475e408cba3fd07e1f4c25028079ec176009cce02"): true, - common.HexToHash("0xf281788e49c9c2817457605262fdb7796a9093ca3347f6828ff56c3d3ac0c165"): true, - common.HexToHash("0x41613458aa21444df5828d066d520b56137b64736fd610339e283d3b7345c160"): true, - common.HexToHash("0xce4278838ce6853eb5c627d0a95595fbd63935e5643c12f7c773a16fc9e28ea4"): true, - common.HexToHash("0x3dd0c9433b6922cf287a0081197a642dd9c8116c9e1192335774db76ea0735e2"): true, - common.HexToHash("0xf96e77ace2c382ec9e555e7ff3c164816371ff4b9c680ec66f6c52f80a554729"): true, - common.HexToHash("0x9c5a5ac7049975efb2fff5978a695eefdeccdc7a5281ef86c223a7fc64ee486b"): true, - common.HexToHash("0x464ab6aec82cf3bcb1d13adf58f4464c9a45a7a561dcb8a41ee9c928ab3a9d9e"): true, - common.HexToHash("0xe1a65fc28a4b0d59ed470f74d9da120cacf353b8c90ac209baf5267d17be5b97"): true, - common.HexToHash("0x784110c25a63d467e98687394f49ba5a50912d09668e24fc3b360abc70063cd7"): true, - common.HexToHash("0x8cb574c36ea374d5bfd8337421b0774f4a137339db256fed80a43d32ac68fb4a"): true, - common.HexToHash("0xbceef1c9c1132cbf3441fa50128cced33ae354d0a9ae12ad3cdf4fca1941c543"): true, - common.HexToHash("0xc4470ea49aa36398c61a425d6b8cbb3bcbe0404c697d6cb3f52b0b23443826ba"): true, - common.HexToHash("0xa4b176637e995ead16acdd42171bba029b8761f568b35e6bd681f28b8f9108c7"): true, - common.HexToHash("0x8ecab0f0e59bda31921c09e68372bc0ebc119d1e4b0d62b9b458736a804a2c73"): true, - common.HexToHash("0x7bd0c815dc4019e17c29bd1371ab4709ec881bddbad6e3856dd67bcfa4bf94db"): true, - common.HexToHash("0x3fda25b4d1a44f3b459d0b9cf11daa88349bd63fda5a59234ddce2a8781ada07"): true, - common.HexToHash("0x33dd087ba62ea279ad9e90c3622b3c2a0bd1bc545115b3c2bbd43260a5306365"): true, - common.HexToHash("0x2d37b1f90d68b5078a541ec9e4f480aba289dae0a4d31d8f2787e4f140bb747c"): true, - common.HexToHash("0x7200912af494513122cdcdc9b1389c4d6ad49a8727ebd5562b577d0f6d111659"): true, - common.HexToHash("0x52ca4d7f12006c10bde06e8dd18e77d06c39047acb6052158a1f0db4baf16139"): true, - common.HexToHash("0x04d1b521c98119e3d8d5c40021d004afdb54c96e94f826beb82ad0d780ea3f97"): true, - common.HexToHash("0xe1a473ca0e57b39ce5ada9e2a9454cbacecaad2df6d8568b97a2adaacc63818e"): true, - common.HexToHash("0x21c031bac75de4089bd161d775d94ca6e496c49395c110ae7d4ba422e0d4acc0"): true, - common.HexToHash("0x38423d29f39d2a018182acb056a21c904718a050015b37bd2d436c100446e57f"): true, - common.HexToHash("0xa0b1b5ab419be58ecb68372affb9b7e61cec5c535ac1557226ef7ee52f8a1b55"): true, - common.HexToHash("0x2e469b719996f13e963a1ac655776eec8f1e4e302746f928688c9dd8abfde4b8"): true, - common.HexToHash("0xc1f2a501d51adf63e51de567bcdc3afcb29c137ac6b3254d3816f572bab80658"): true, - common.HexToHash("0x038f8ec356b4453fe3fdc27e270734c06694ad17f49fbef4db809227fd410875"): true, - common.HexToHash("0x5cfba3e4c7c866a8b3071847ba3a45e43e32b3b67a6a798955aebe933ca8528f"): true, - common.HexToHash("0x1f6ed551606113241aae6212f86bdc37364aae62c611bb75b1f4c88ff12e73bc"): true, - common.HexToHash("0x2ecce0f4c50ac42a2d4e4b98427802612099be5b8df92e9d0613ab706cb70469"): true, - common.HexToHash("0x590e49a6aee8a43317c724611f795afd5617afccb71e92c767e63425ec732047"): true, - common.HexToHash("0x8b2890c175cfe3b4e8abfb10975c96bb62cd554ce7b83d57d9130d6520db2764"): true, - common.HexToHash("0x0ff9d107645f252738ebbe62ee2e5f070e4519cdd22a4ca0ecf3933dd7756339"): true, - common.HexToHash("0x0898fe2ce7df3fe1203bcde4a21415aeac4459558d1c40313a377caa35d55960"): true, - common.HexToHash("0xf3e29089aeea08eb14d2406338f418f89c0742c234440b4168f04932e3660197"): true, - common.HexToHash("0xf31476a5861ab4b6c6e66f7d0fbb5de5428aed42b55445bfa3414a9707308d56"): true, - common.HexToHash("0x069a6138aa26d9056b311d53fdbed6630c706910e1b0c365a9a2ea6ef8972c6d"): true, - common.HexToHash("0x80d6cfdc7defe9d89f202dba6e72aec5daffb774d53c3d772bdabef3d2d2bbb6"): true, - common.HexToHash("0x73df17e823aa288fe202a0a2d15f1c6c4746dbb14440c3c2c221307abc41d449"): true, - common.HexToHash("0x62ecb6dcbf488fe7e5c0820cc486a70d966ccdd1ada29bdd6ebd416b0a029dd5"): true, - common.HexToHash("0x06a61f88f1b82b13607351e8192a0d550138c72169628da90e8217b88f949037"): true, - common.HexToHash("0x2fab2328933b82ad580534b3216d2237a96b3ca2d5bfd073f88d9eb4633cdc02"): true, - common.HexToHash("0x1d7a1f995f8fd2b02bf031842207ccd4d00d0769bce6e158ab86b9ace5cde19f"): true, - common.HexToHash("0x95efd4b5308d7893368255ecac3cda2e86fa86e7ce11d78b1d97ce5593f7fd96"): true, - common.HexToHash("0xb41c220e468c9995a0f2f4618627ac3151384d6a384c00d20cb8e8c11f39231f"): true, - common.HexToHash("0xa13366c0e8d52b586f1e6261c70fb7d1900158533684f6a06c704eb473f960bc"): true, - common.HexToHash("0x975883e08431253a64ae34802039f402a61bccf0fe9fbcdcd753484487be8b80"): true, - common.HexToHash("0xf73a04615c40a123f701f9a19a964e6eeee0406529dede32ae5ad65d3426cfa0"): true, - common.HexToHash("0x476dcfac0275c10dd08b8203df8a3792d0454cd1941441088f2f711c23156da2"): true, - common.HexToHash("0x150ff062fd8aced9b70a0f65fd84e979b38aa5b20f3c60f9b60b7fc18604fdf5"): true, - common.HexToHash("0xced8ed23825e99fe4f9f1c6402c679f0bbdc86c3e3087bb72ae1b739eeed110e"): true, - common.HexToHash("0x38d87938634df9015907096b5fb30d60b569624060ba7fd5c946ad9f30cab610"): true, - common.HexToHash("0x922a3a18f67ac773dc588a7183944fecac92f32af63025ac117fc9162c0cfb38"): true, - common.HexToHash("0x02af1a9668b34acfef0d24c782594c9fed0957863f9b5c40566ea73c4e509506"): true, - common.HexToHash("0xa6687356eb3f3ed096a88ffd5089eef6266b4cdf59af57e823e62abb0705091c"): true, - common.HexToHash("0x88a58a1a3d841c5d9586e88a52c5abef6d718cfd36fc4dee656aff02f42b943a"): true, - common.HexToHash("0xd4cfb8011758281841f71f8679f12282083a18f83502b1049cd9a711aeb5c2ec"): true, - common.HexToHash("0x096930415147e4018559a89a11870726b5cdb460b4be7a306eaefab25723746b"): true, - common.HexToHash("0x5a9a633edb95bf5e20991d87291ccfd7c619010dddba3f2258423f7d2451dacc"): true, - common.HexToHash("0xbb3f4b51d9309b3de2f274e18c3eb84e1cd100334c6292d7d8a1223906c3d036"): true, - common.HexToHash("0x257bbd879be4c17c3a4875741678588f1e81db839fbc5b98a59cca4fdd682b33"): true, - common.HexToHash("0xe3767a03c1c022d492a3bfe9d8563fe2d04cf4b3d8335130b3c1a997c45feaab"): true, - common.HexToHash("0x946ca4cb5c7aa54482c583e7c7b37e9e1bfe0d781e0a75d454cfa7c92e3f256b"): true, - common.HexToHash("0x7e56ae184227e44f41bfdd8789439d423dc3a03a52c8b43bc6d150cb3655d991"): true, - common.HexToHash("0x30484cca843d49b2b024b89f7e5bfd8fed81eab131775c5bc78860ebab8117ad"): true, - common.HexToHash("0xae872ef23c92d9fb2d4d8495c317b4cad1949f43657dbe7d2dda559e3f046160"): true, - common.HexToHash("0x64869dd5ac94a88cb922725ed10bcf52ce5a0947e5d14ae8995390048adf095f"): true, - common.HexToHash("0x8c18f768c6aff2aa9b37cf6d6c792d6b9fce17ba9566075409c9d6a7a6ba0684"): true, - common.HexToHash("0xb863a1ae9a1551cb53227164da08afc1f6dc09403cb4e334e8647fc7fb2c5368"): true, - common.HexToHash("0xc6c7a2df6959138435b8dd5085c54df23b26c5329d7f19012be997e205cbdb54"): true, - common.HexToHash("0xbf39bcff87ecacbc0c36764c54d7ca513970bb13e33d1e4b215f676ce31cd066"): true, - common.HexToHash("0xfdc1c32e6db6ec5167c0ea804e458207a59994be847be61c1d3982d234db83f0"): true, - common.HexToHash("0x24eb581624bccb395e202e4391195e0fcf9b67e42d96a274d4e294af55deea33"): true, - common.HexToHash("0x3b2788bd86e3cec86cd43dbd569aee75940d03a1bcd24d4ddf52509060a9a4fc"): true, - common.HexToHash("0x9b65abba531d195eabaf9709488e62e1090fcecf5282f648d0ff8a0dc90a4611"): true, - common.HexToHash("0x787a73fb8eb4dfe461f33f27aa6aa4530fe786f2af6b0459866fe02588d2a6b7"): true, - common.HexToHash("0x5423a8f54812fe1ce82bcd6a0d25a5a5c02a1af26b45479f3700c7d5cc75523f"): true, - common.HexToHash("0x54dfc7e0ee88b92b694e6e68c26d8c78ed3ff7134c25bbf65b973d7dbe928352"): true, - common.HexToHash("0x91d7e5266bc9db3037cd7d06d583655fba3888a3cca402e19fee82a2512a5ffa"): true, - common.HexToHash("0x3dcd1655bfe8f0c5257ae9ee978f08ce5e5a1ee80c0e044cd6b0c130766e58cc"): true, - common.HexToHash("0xcdf08f748c9298c94425e27bbec916b306e1297f8821c2203146232ecf022d9c"): true, - common.HexToHash("0x913f512a50dbecdcb64543205aede62e2a58ad405bc597dacf33bfa44b541491"): true, - common.HexToHash("0x7e8410927ed83930d092d81aced6e9dd2e0abf43ae3ca1721382239080677b01"): true, - common.HexToHash("0x2d876b1b09687a71140c4d3958ece24259cd1be14fe5a3ff5b9081effdefd61a"): true, - common.HexToHash("0xeb2ad33a1c7d24536c1e10e73d7c6a189bd4a627e4f4d80b1f89dc6b96576352"): true, - common.HexToHash("0x50a75839f9c9ae53ade8964c82dcc50de4b2539f8d8e0425fd022edbe7ef3c72"): true, - common.HexToHash("0xaf8791a4423230f10c2768a4f66058db4fe8748d2347b91b3131968b36bce57d"): true, - common.HexToHash("0x499df08f7f62f6eb3c828f6dba8e841aed54922ecd4746f5d304bbd32106c55a"): true, - common.HexToHash("0xe471fe44440cf81e4af8f2dfb7346920028917a0699d9dec93607f5f46d8d64e"): true, - common.HexToHash("0x098186f2dc9270df8144c4edfa9c219af02aea0107f5376c8f1bd83fec208b24"): true, - common.HexToHash("0xacac62a1cbcf470dba180a465b25ed4aff22cdf2f52275a0fad6cf9bea6fbc46"): true, - common.HexToHash("0xaee3c3d7d1f14044f993b57699b2edd2eb362c5920c76f5aa5eb83f3c71189e4"): true, - common.HexToHash("0x422d8e09471f1a8181366e0229e6a272a36350f0fe068d4731488a065a6ced7b"): true, - common.HexToHash("0xf28380cac9209e5f0033e4f358e72e95fd9db68bc80ac2620e7fd2d09f70ccba"): true, - common.HexToHash("0x1b382449f90c7fecf5b09483417636f382aef44da3ac1f19856d1c53ef559fa7"): true, - common.HexToHash("0x391dd8ec31fa376ec3eeeb63521a7879821a2163c04282058426e00940690af0"): true, - common.HexToHash("0x04a95eccf26093e7d329401548959e5db1d44f3e8ea15be1dd25b8791692a693"): true, - common.HexToHash("0x444b35d09f8bbcfec862e0df23886179d598915e7d5f2bd23f1809728e1e73ff"): true, - common.HexToHash("0xd4ca005451898b4db3ead9b608383d256d7a82bf3271c9ac9199efa2f21bb877"): true, - common.HexToHash("0x769cbdfdcf8b8f1ac5f745099030e641ba96092be72abbd344a27679aebdfbfd"): true, - common.HexToHash("0x2abb69a2f641bc09a2310177a6ad9eb1214a099e10e5c2d23f463e49b38c0142"): true, - common.HexToHash("0xf6725efd5e2da9e67bf68c03d2478617cea353348ffca32069580b3ea24cd221"): true, - common.HexToHash("0x98554a4712e9751b562ad8c739c41613674b2c57ba242c1864bd5c22cb27de5d"): true, - common.HexToHash("0xea28a22a7812f6bf6ddaf0d66296eef4c01cb3c5ea1c7011b9dd59d50cc06bc3"): true, - common.HexToHash("0x870f20d66e3694b0a0f0930799a968f7ed55cbd178ecc522bfc5dcc3f4508d3a"): true, - common.HexToHash("0x886413ae6f4ea53a2f05b5c17ec58a696b24effde43d94ec81f76f3f2b067c04"): true, - common.HexToHash("0x04b2a44edcf54cb952f4161fbb21f2908e7159e3c680836fbefe6ac98e4fa021"): true, - common.HexToHash("0xb2c7f3f0b51b5696a3f158c2363913e6d3042c31539ef1393fcbf2b516bc9c4f"): true, - common.HexToHash("0x9298c8b8cfda7028d182bb7d786d55463eb91bf0b001f5ef832a14857c371298"): true, - common.HexToHash("0x8ce337daa9db05a540ae6972d9f44d003c2cdaee905ef7fa6366a2253570d0d9"): true, - common.HexToHash("0x43a6c22f6376263a00783d573a555cee864d3ec6001e609a89740fad6ed33217"): true, - common.HexToHash("0xcee4665d6da082450c2bbdef745dbc36cbaac27bd3a30516c10ebc2b3d96c9cd"): true, - common.HexToHash("0x52d81c4cae9d79fe44e07e00de92ed03d11a1913bbfa3824c89011f4cc509693"): true, - common.HexToHash("0x94160317d896b3cca80d8b562614ca0198b00314dedc09746f28f8016f5021f7"): true, - common.HexToHash("0xef6760893a3867afdb71226cc2313876a65a28d09b9876ebba37521c911e8b3a"): true, - common.HexToHash("0x49050bb3ea0b6e8ea0a8146ffd597d6fa11afed5f9e0b62fa9ae438b702811e1"): true, - common.HexToHash("0x1dd129dc415ec260b01ff2e3293ca4b2064f24ed19c807e9dee6834e2d44a7fa"): true, - common.HexToHash("0x14ba6efd8c37595ea33666b8f66680e1598c2de9fe509c3c43f3a47ba2631291"): true, - common.HexToHash("0xedeaccd54145f70a1bf34355e24cc7985132f71044b8d44a0a7c5d5f7e340b31"): true, - common.HexToHash("0x19f02122c28401877d5d1b678600b28ebbdfea95be53f2f3d0263fa64ed6eab7"): true, - common.HexToHash("0x9c103e7b82ceff6109a02642bec08bb5cd33952076559b80e784d33675f0ebd5"): true, - common.HexToHash("0x13d1d3b6de8e11587c2c0774ce2143e49eb52cb5a326ee0518d35a020c5c62a1"): true, - common.HexToHash("0xee97a3a16bf84ad0df60e120b0cf7c65d902ea263141c301ec0168e71704a99c"): true, - common.HexToHash("0x820e51f62036e736ca1193efe024de1380df9f07c151f8780e4c6426e69faafc"): true, - common.HexToHash("0x46736bbe276deb34f040f691176c63bf547a0cfbebc754c5c8e075b888524f7b"): true, - common.HexToHash("0xc2df113d44eab1b1fa2ea5b9d95f929938bc4f01de5c69cfffb41f7e24856a07"): true, - common.HexToHash("0x3a1e86f9ce160fbdc9f3ebe1e2aa8ff811c1dd123cd2d9b237b103b7d00708a9"): true, - common.HexToHash("0x8502c45ef4d6c07aa05032bf7b07c2bf3d1a4978e9d43e2321305b72b1b52f25"): true, - common.HexToHash("0xad67c044a896378a4582c01f09dd604c636679ae3dabb9dfba44206478675556"): true, - common.HexToHash("0x787f6411c05bd715faf938089848d7a81f507c23290925bfe9461ab07cb0b0a7"): true, - common.HexToHash("0x3cc84fc40662173797fc86ca88c2a2b6a7ed17045ec7a09217c1d0a295af293c"): true, - common.HexToHash("0x379083d1db03660adfa1a306ca0e046aa294e7a4854a8c867c6157bfc0ed4424"): true, - common.HexToHash("0xbd6dc8210b56d0c2a9e84ba945fbfcd8dc5c50a16bb69596937d1d470ba832da"): true, - common.HexToHash("0x6ffa66e9f3b9a7115221f87ca5fa2c36ff008c7c66d00e0f8ecaa610cc2b3090"): true, - common.HexToHash("0xe1725a1af660adb6c4314efebd69a46eb0a05e8597468de88148fd8489985fb1"): true, - common.HexToHash("0xc022b903696e0ec2364eb2268eacb7b73b24bacea25c9304bb1161b4b4f78c0c"): true, - common.HexToHash("0x7dd51a32f44b54363b49adaaf949f989a13ddb319dfe80184c4ac59cbcfc16a1"): true, - common.HexToHash("0x0f7ce3d906705374d7fdb458007b80112b6ff2dde8eb30fd1ffdd140fb742666"): true, - common.HexToHash("0x2e6d36a0b852dd231b6f3f1a34190e14c63412d6073f2c7cdea4138bcc654545"): true, - common.HexToHash("0xcf009944fceb01d4e3b79d83a51a803b525a9befbea857f2a4f66f9d736f0cc7"): true, - common.HexToHash("0x3e7ca9f9c7d26eb84eb9e18ac67b0e4a37dab051436e7e6f7df31b290c43c741"): true, - common.HexToHash("0x9ea9c5333865153709100dfeb9e9a9e956d0d2453abd81104b9d78b9625eacf3"): true, - common.HexToHash("0xa7bb521ec8b7473e93c4ddaf0e27b0c73fb74b33f5c7817f2a0415d3c03253dd"): true, - common.HexToHash("0x8f0b2f9352f5c9c1feb69816e0cb07c0af76a02865d4a02e08cfc96d5a9dafdf"): true, - common.HexToHash("0x70fe3cd5bd090a9975d9985e5552bb7e79e60ab67e8ee23434759bad96bdf46f"): true, - common.HexToHash("0x85a767c494245165e6af30f9cd1f3fd7abef61234a2fec23c14c3602095053f8"): true, - common.HexToHash("0xa7bddeefddae54f9cb04b1242d009efa69bbdc646cff2f1e2879feb0e163e462"): true, - common.HexToHash("0x2202d2d21a73ae668d1493bfeb8cc7b7ac59d26b314ae9aa78c5df04c7b1a499"): true, - common.HexToHash("0xbb03ee8daec3ff855e2bae3536774c0949b17c220cd3f2ff43b9f1cdbea950ae"): true, - common.HexToHash("0x3379f0226648c7333f49b19875bff75fe5a5a1f22a0fff7bcfea3a3eea06a10f"): true, - common.HexToHash("0xbebfe5c81ae8e4195764f65a30fae2497fa8eb3e0d174dc6928e2b4207fddd42"): true, - common.HexToHash("0xbf4d2d89de605d187b0cdc3f8cdd544f841e654d4a55ac657dafcc38b6b74f81"): true, - common.HexToHash("0x00bf066c35e1f69c9074aaafcd4e19908b1ae67605943fa4d89e7167fd7a53cd"): true, - common.HexToHash("0x0303a9d2e44d2f59e6775bd823b72b9cefc4c994e99f0b560b9c0cb1d7cfb50b"): true, - common.HexToHash("0x0035111eb6b2da1499fe1e3edb1837e0125241ba31dd78ba3ce1e4f49855f5bd"): true, - common.HexToHash("0xe4381444e527c1886c20cabd058bd2e2928673344f0070a2fefc3f45b6abcc78"): true, - common.HexToHash("0x6fcc9c7430d5706ab6bda9211ecf87441889fb6be56fad09041910284d991d40"): true, - common.HexToHash("0x306873217213b20438c013c58b7af10f51a72e4216e93f454ff1fcc02efce0ea"): true, - common.HexToHash("0x334720bb0159460b1c6746231fcf50dff46380bee78460debe94c9d1b8234999"): true, - common.HexToHash("0x8ba42c90a6659c66338a74dcc8cdc6f64b7ce3987ad66b78ce85cb4227ce2c93"): true, - common.HexToHash("0xa8ed42f707cf58a5d60247f993a221dbff35a9fe75a47884cc1e39aca00eabd9"): true, - common.HexToHash("0xaac8685b4ec6d4246fb9d84810d1bb7207b43cb5dc76d39eaeca875e80a1a62f"): true, - common.HexToHash("0x474e0f55ecad234e3fa3d63ae2714eac9a1869ac3613090ca439aa4fffe997aa"): true, - common.HexToHash("0x80aff4ec107dba768d183cfa6e095d3f7c2b918d27571cd74aae437a3ab39e05"): true, - common.HexToHash("0x322f1f76d638a419da895b02f7dc570a94a27432c8f836b08af965c57ed3d805"): true, - common.HexToHash("0x8166878c70e1b91fdca4675fe7d87b0e30fce2b1017644462a7de711eab8fbbd"): true, - common.HexToHash("0x2f6642ed0af20682351570b5970313e2343a33fb126c0b8e52a2fd682a8d96ef"): true, - common.HexToHash("0x573ea3870ff740c93c9508bf7d27e16bf986c853fcca10fac386be46fb020763"): true, - common.HexToHash("0x6d614d92769d9c9cf4b030fdb9f0ee9dc98c728eab1c4454e39769295f132a86"): true, - common.HexToHash("0xdb00777932a5bfeb0287818da228fb5a92a67849e9dd39d072fe908e36ab25de"): true, - common.HexToHash("0x94004f726f210fb1cf21a7f5f45949912537ca3b382062635b65ee827f05c387"): true, - common.HexToHash("0xe56cd558b714b3da2e806022f33a0fefd86cdee2a974315a3c24a27be6d426a5"): true, - common.HexToHash("0xe6a20f8b0b8f9de073e2fc9acb6d8bacb2e368cd7d389880c02d6d50358a3d1b"): true, - common.HexToHash("0x9883cfd286fbd201314837575699a90786b7f1a76c6c76b95d4c66c9a2af07cb"): true, - common.HexToHash("0xf1bd50017c016103f2120ce278d79bc0728f0495cc9127898589d72921c9e0e1"): true, - common.HexToHash("0x81240bbe600aaa38532fa29f5c4ebe5d6948d2d5774a298a0da10c43240ce93b"): true, - common.HexToHash("0xf2f36d0677a7774e21d0605b7cc6c0dee973338533fe1564a5eb3c923783cf13"): true, - common.HexToHash("0x3eb741a8071b5b231331e940044f8249c3c819593a68fc849596684068dd9c82"): true, - common.HexToHash("0xb4b7cb9090f6c8c962b315deefc484d0e07c772e108fc22e39813b8441fea73c"): true, - common.HexToHash("0x5feb95b9f560b7fadb516f4d01602ccfa3d5edeaa433a22a70f712cbe20d0146"): true, - common.HexToHash("0xd88cd184e153bb9d7fe1fe615da09ac31e65eb1ebc0edc3aaa3c7d19f57431de"): true, - common.HexToHash("0xd7774c74eb514eda6e7d0e2ada8d90ce86dcd9aab2a2ed2f75febe18c69616a8"): true, - common.HexToHash("0xc78d4c3e8e397dbb3df426e88696ddd32b92677575a455f3af9b75b02d20ded0"): true, - common.HexToHash("0x1c450b1687e2d71e365e193b469e5a142d476fd891084ff9888d22111ed7540d"): true, - common.HexToHash("0x715d514f4e840f39ca9fd782ef0166afc4c02a8e9d74ede7a35cd7d6919fd52f"): true, - common.HexToHash("0x83b11a19953d68472017bdf9ce6e8a49a810c361d52067bb8dbf476633739fdd"): true, - common.HexToHash("0xfe9230d525830d3023673def7582c43157c351812afe49c84b92e63d1a0d05b9"): true, - common.HexToHash("0xd493c186e6b02239b5a95e9abac510c864bc3f5540fbe887ab76b8d3535c295c"): true, - common.HexToHash("0x1ea2c0143faa8fd387992f79136ca62a5edf82711dbcbb9cd917b275b84ef602"): true, - common.HexToHash("0x2cbdc73adea075af21f7afca590aaa09e5b50377fd3704c2e30e25ac8478813e"): true, - common.HexToHash("0x3c64f7cb2b8cd41abfa767b3a89b72e712483ab0d1a291ae816f74484724a023"): true, - common.HexToHash("0x1935c9762ce8c270611f9ab0a4f05790a3d0c0dc920e18f202d0ad1e74501815"): true, - common.HexToHash("0x1dc39d64142f27e09e4b36a2ae5248b570dd1a9106d850efba4d7284512bf9ad"): true, - common.HexToHash("0xb0635e3fa8a1c9810d1b8bd032c4fd249b9b45fd38985a8f599274d6a13f6627"): true, - common.HexToHash("0x71ca6396592f6dcad36d0835933ef9b0405c736bb54323dbbea2bf603192d691"): true, - common.HexToHash("0x122fe7db8d9ad7fc7964d343acb307e86d01c09ab28feba0735b57d17904163e"): true, - common.HexToHash("0x3f7950feb20c7f834f1b3df6da057de708527a7a24bfd78f60437f5303e8f34b"): true, - common.HexToHash("0x06320ba307c1bc5028d88b11f4e68ec4ed725502271680d4e85b859950e55c78"): true, - common.HexToHash("0xcc4a990a6d5e149100d2af98320c4bdd38e027e9e007d20ef030a7373ec1aa6a"): true, - common.HexToHash("0x95ad5ebb8103f38e149ed2fd8c6976297b3f938ee0e5ab46efdd1a1fbf74e1aa"): true, - common.HexToHash("0x360d5978362d368a43a2168b6033b0cb6018dea88838b3516972da32b730f47f"): true, - common.HexToHash("0x857d7b327703c4a30c8209b7ca07b85767dd38e79fe3327170608ccb0a85477f"): true, - common.HexToHash("0xea44900af7659c2103d4d07db02433389181c2828d370ed34db3a8b9dd9b599c"): true, - common.HexToHash("0x155a14206e76a174ac9828bbe17f54ed0de54202b6ffc7fe6ccc2aa0be449c0a"): true, - common.HexToHash("0x1e92b5124fb3f6f33d504c223e9f9996c486a83d22e8f66ff7210d4a60802c44"): true, - common.HexToHash("0x6df80b903489f93014c169d739a8dd6dbbeeee65fc4ee2014d7859a4ab6e43df"): true, - common.HexToHash("0x51579ab1a9b2e1377b5158c1a86bece833ed5971427f4d0a3af219f6cee16b07"): true, - common.HexToHash("0x561d7bf8111a4f4384cf0685969752c8dfd7c8cded53982a5c3365f1a981c2f3"): true, - common.HexToHash("0x2637e04975048c48bd56b15d3fea471881b47354489b1862ad329279d4f66f34"): true, - common.HexToHash("0x6797f82275850f4d8f175e6a9d04c80d48bf13f983155e7edb48d71c000d517b"): true, - common.HexToHash("0x033d9fb9b95b00de34e2f802608d0a52dfbbdc612a17ea8e20630a2902f820bc"): true, - common.HexToHash("0x80da80a5eb8d60fcbd85d58347a9a79bf36ce0fa59acca2c967debab7450b411"): true, - common.HexToHash("0x23078fcca60640027688ab62c05c0f5063aeb40c058e6a7d5d18d8a46c2aa1f2"): true, - common.HexToHash("0xdfcc138251d3639ccf7f1887ab8c220aca5fb4060284950e759b6f81207dbb4a"): true, - common.HexToHash("0x01c22f3159eb35efcd49edcb992c3c4efd9765523d5ead0006946c12787e243b"): true, - common.HexToHash("0x9526b28ede93a8fdcd31c6fdabc78aee952f42e339b33bccc148f1fe46cb5173"): true, - common.HexToHash("0xe72ff1940c28cab2089aaacb6dbe9644134ea8d4058b613c3950ee37de75382e"): true, - common.HexToHash("0xeb7683c347feaab15e2711fe375a93879d0d302a6ee0850ed6e7003a5414bd18"): true, - common.HexToHash("0xf0ec75b61d8ade7399da86b74ecf96ae8cda72f2a5768120908d7b357aba5c46"): true, - common.HexToHash("0xe6d3122ec043c801b99bf187e2302b5586b7648ec013eed412b713b18dce80b4"): true, - common.HexToHash("0x59ef5e5625255f2b1a874028178e093dcf26071917170b794b7ece52a8e02f68"): true, - common.HexToHash("0x5012532fc49813ce9b81acd3eeab69a8899225b982a2ec7d0bfe2cb64a992fb8"): true, - common.HexToHash("0x74e74ed996437304e28f6ca8597765247c8ca49c40ce61ec8b84775af026bd6d"): true, - common.HexToHash("0x1fdd69e387899479b893ae717c227d62f0f22ca4fc9bc8bc985e21c222c8173e"): true, - common.HexToHash("0x306afb51c1b907b723673a167259f3ca4343a9fd70d9f6ff65165d5f217a77a5"): true, - common.HexToHash("0x1ece253b969e1ad3d33ea59794a4d77f2c176d264a28deabba72eb7fe7df8435"): true, - common.HexToHash("0xa6bcc95c83dc9283972ff67fb316cfce049ce14935dc53d4936c39d86d226276"): true, - common.HexToHash("0xd410c332e1539124cfe7eb88a3ed27b58b0ddeeb6414a7f7b19bf488ec95a2cf"): true, - common.HexToHash("0x8cbfe5aa69096148622b37e2e70feda7bbde2674b5ddebd24394c7f9a8eb9d16"): true, - common.HexToHash("0x155417e42cce058c52a3335c39637990f779c819e000ca45c70c12afed4a09f3"): true, - common.HexToHash("0x05baa82c6698c9a767f1b0abea02b39f334f2992d34de80ae2026464007e7638"): true, - common.HexToHash("0x5b7c6ade1864ddf40c0c59cdd79dc99966ed7a9c84eba72d7820e22a22de3826"): true, - common.HexToHash("0xdb08afb70cb3a2711a3743815cc2dc377eef850f24e5fe3a6ef3fc7f606aee4f"): true, - common.HexToHash("0x168ff3fdb0401899ddfca7ac93629fa1cec61a06d5ac3d47fcc75362a30aafd7"): true, - common.HexToHash("0x3ae40b7db70eb8834f4f6086a8c4b977516509d50ae068c508fa052523a114c8"): true, - common.HexToHash("0x557696cfbeb3f885dcda85d2478b75f8cae206ba66d3fbd8e2af459155f74cad"): true, - common.HexToHash("0xeb6b0ea2f46ea41754fc1d05db36fe71eead48f2a09148604649541951857523"): true, - common.HexToHash("0x14124a7e79364df57829e00b8f7870b487302a30d2a982336f92eab359f7c5d0"): true, - common.HexToHash("0x10ba17398b449f7f2cc54d4201f5a2bb6734325a41a2cb7a3a38a61b4b98863a"): true, - common.HexToHash("0x3fffeb423871c94a159163d23e1ae8863928994951662efe62898cbd6e73a4d1"): true, - common.HexToHash("0x52a7b70a0dc72cfe89c90af3d1a2b9273c9e98fa0df3448542a9adf635392f73"): true, - common.HexToHash("0xebb9e3fe67ea8281ed28a59642d9399d329d6c40fb07ee3014fd1bfab4dd120e"): true, - common.HexToHash("0xb790549bf939087ce5cb82f0d7ee9deb970c033af1b58a572f3eb6dbefb278db"): true, - common.HexToHash("0x87fe5cda5af1d53ee72a9792ad1046c270948609df3c59b014ff335c0d4c6899"): true, - common.HexToHash("0xf59c19a7884f8a2dde690be9bc298d6bd94013f14e85705ac956af69822bb677"): true, - common.HexToHash("0x7ac429bd7cb745fb350177c974a83909794803aa754ff467ef300f1309775c1c"): true, - common.HexToHash("0x46fb8c7f8223800cf3281b69f84111d24093ac59ed531cf59c14b03f9fbe7337"): true, - common.HexToHash("0x6b6de4f2756afc28f17992bc179674ca90d5b380f476495376fb5f678a7fe96d"): true, - common.HexToHash("0x4445bba9cbe81f22df471640552fbdc84027544af82908bbce0a30bc2850295a"): true, - common.HexToHash("0xb2b457d6689c124b32e483192ecb002ff72572551743c029fe64461826dced1f"): true, - common.HexToHash("0x49ec0e85916eee7f907bd5524a82a1f851115466aa1bccbf138fb99f0d29d82d"): true, - common.HexToHash("0x4fe28e5c93efd22dd1d020cce92bcff36895d5732e8be04bd940812ff77cd8af"): true, - common.HexToHash("0x7e071ed2f4e04731dd11ed1486ace20918b3b3839eadbda0bffab76a0234768c"): true, - common.HexToHash("0x0af9fad4336460795a71f21f5588f50519cb04c825882c2b37845de0d24125b9"): true, - common.HexToHash("0xf8c68413a806bd17f9fbbe9def525c03bf2d0ca1ecd4cd64ca6787ee2e1b2fb9"): true, - common.HexToHash("0x4c25b2ded67d03a7c1b9b55b535a8cfaf670b83c1d835efa557d347a7f3ec6d6"): true, - common.HexToHash("0x5526dd2579d9f61a4a4be4613915a84cbf36ee2d004a59923746d9a9994d7623"): true, - common.HexToHash("0x7a04924323df974301fce64dd016d33149259b1226ed80e96399ccf834fb84ee"): true, - common.HexToHash("0xeb23ffe8b036fa63a645a972f2b6711b71db948136c998d2b638f73c59a8f9a5"): true, - common.HexToHash("0x306395e83d3da6be314dbcb902efc2d61a416601937982ab26ac084d8d9c662c"): true, - common.HexToHash("0x1194be4dcbcd71fbf65572ab58eb17161417034dfadb8fd333b9468926a10707"): true, - common.HexToHash("0x934ac2095f5457930d30dc4d594559b7b83f2cc74a9ffc2ce49c877ac15fdf33"): true, - common.HexToHash("0x43a7058a5ccd1388f5e8ff9c213bd0a3f250aa4a48ee7b496f7e789dd8c2ce00"): true, - common.HexToHash("0xed193a03d8557986e19fd15de46e8d65098689f58564c7141cfd0c50a251b510"): true, - common.HexToHash("0x9f3d881fe082228f217d85e6eeae658adf8f6e8d6567db3bc45cfe3ccbeb2de3"): true, - common.HexToHash("0xa83af841f0ad5782806e04aaf2563dd8a7a42473e5c00baadcfd6f7f6effb225"): true, - common.HexToHash("0x6f01f2c54c0c27a2fce9d77824ed5075d56cfd4b3d7b4ef1f0efa75fc3229ada"): true, - common.HexToHash("0xe8331f9bbcebb02e2ac6d21d10c1917a808ba66d06bf2130107c6f6ff82e7f85"): true, - common.HexToHash("0x073c290d9d4fcdc409af414985c8438f70a5b400a61b5667cc827f742dfe1fc7"): true, - common.HexToHash("0x58ad245b89ee1eb7c6184b39533e7cfb448355c35889f77341b99c242bf7b48d"): true, - common.HexToHash("0x8e45377eedbcf7a27c3d3837e32d35d16c5d026aafcb186d901773c0756750a5"): true, - common.HexToHash("0x6cc7e30986ca6ecefe680beda165ce8b00b858604feeb9763f422624f496e1cd"): true, - common.HexToHash("0xcc8aafb999fcfc6e66f20042b554ddf81be51fa0e19833b5d4b85cbb5d07ac9a"): true, - common.HexToHash("0x1bc375c927c1116df38276ed7b32df2f81e6023e5b00a1be7911632d8df1fd5d"): true, - common.HexToHash("0x5be040c9f716561f3e8b5b05ff06a52e2c768d7315b81634c2a68b3dd8bb1d4b"): true, - common.HexToHash("0x395d73cb7ba6c006d8ea7d4f302d33b48e62c1b89bad3949cb4d79ee85257dbd"): true, - common.HexToHash("0x7ec4747482b0cc9937eb75c7fc6dd0aa7d7cc0a61e934f18749f858e0a4bf6d7"): true, - common.HexToHash("0x2439957d1beb5e9b6278293c53046a328b0ec4de538dcb648c73cceb62fa4528"): true, - common.HexToHash("0xb932201ab148dbd14e9ef17ee8be2dc074057dc8193720449daed7aaf52510a0"): true, - common.HexToHash("0x79f4977f8289a084bbc001f1fc085cadff558d10b1ee928da66399bf59820778"): true, - common.HexToHash("0x99df13ab3c8d19c781c534d60dd69a85aad63f4f9359fcf134752cb86322e73b"): true, - common.HexToHash("0xc5882032220ed8c908f555fe99e80661cb934a7ef7f242118aacbd58f5461a4e"): true, - common.HexToHash("0xdc98faf4dadc02a575f7b8b6f3b8513817726ee1ded28e97d7fe6f143676e6ff"): true, - common.HexToHash("0x979194b07a39a145bee0ee5994f830cb988b3cb813917d264705a349434d00a9"): true, - common.HexToHash("0xd88a803b31da82252e4fd39c7a2961ae12166160a87da2aa1c735d60f982846c"): true, - common.HexToHash("0x82dec7a0f363e9b28e0eaf29562bb90b944fc572e7e8257731d52a7c518f6609"): true, - common.HexToHash("0xa374d138336db256866d124de4772e0195fe3d310f24f31457aa6a586fcf066e"): true, - common.HexToHash("0x79cc94d0a9fc9c3b2a5c9db0795f981ad0bf99ef43bcee2bc6f3f6c1b8ff69e5"): true, - common.HexToHash("0x499dabde7b0bad9e2040969c5dba2d488f6ba4b80e47800c490a30b7e2618178"): true, - common.HexToHash("0xb20237d2d46e1da37e345855625ebd21f99d3347a6af578f9340c4ff2f84045f"): true, - common.HexToHash("0xa77189172e9c8af65b74aa76952c83bea596504090477339c182d30640e7afd9"): true, - common.HexToHash("0x22f7966f454028e06af8fe5e8307d8f6baadc22275187521ed58d50720af25af"): true, - common.HexToHash("0xd2b41e6e616bc4efb5580d271219c3cff7bcb35bb5e77c85c9d1f6cf5d24cea7"): true, - common.HexToHash("0xd863513de9d6d9838fdc8dd540e495f2683ad6767f006a8106089cfc7c02059e"): true, - common.HexToHash("0x7876a0887f0c2071b6f48fbbf65515e8529557d8296fae09b7dceca09d1f3b25"): true, - common.HexToHash("0xa08efc8a4fb6ed99fe88fc4ae688c50667e5ee609dcdd62e48aa9d298e72f14f"): true, - common.HexToHash("0x4979c2672ecb880f61f62c465365dd9a95c4b33c5a65d83c9277f4d2e3711080"): true, - common.HexToHash("0xdd38507ea921a2d81577674cd6b8f30cfb04a8e6efe7df4783c22ff069c32701"): true, - common.HexToHash("0x380197596f265b6f114f6e4213bdf5bb29b64f373a35820f62b83fefdc2f48bb"): true, - common.HexToHash("0x2ee381a4614b8bd6bd555447375ff9043d231b460745667d40979d0cc80de036"): true, - common.HexToHash("0x44949e61a61ab3a3fb0fbea70a89bbc8ac26397358752d2f7ed8fe57be2411eb"): true, - common.HexToHash("0x1eda933f2b3042519e0c8aa58cf9bc2621342174e0c267d2728c83ef87f55dd9"): true, - common.HexToHash("0x4d4d11dd57986d953678e6275c04fa19c6305f355027f57e6441376061d76b57"): true, - common.HexToHash("0x2621c209d0672f63c34a7465973a7bc3ccdf5de33937d4e35502334dff263bb1"): true, - common.HexToHash("0x8350c49b720452dc4baf946d1b83a75aec3989c771fe71aaccdeac9ce7e41904"): true, - common.HexToHash("0x0270ca54001742698574727279f2ac544cd9cf87b977b459d7ba078261097f1d"): true, - common.HexToHash("0xde2d38ba9c77bb844fe1b6880643f7cb181ae7262bd0265c158d109d6069c9e5"): true, - common.HexToHash("0x66be9bf60f7cded87263ab26bd45549f2484446f18f69b42262bc7bd749726c0"): true, - common.HexToHash("0xe3582d2d7eef28b69d07d07bc8cb42d98adcca58c2a375a06cf510a3c94f2469"): true, - common.HexToHash("0x488259545b94b9382e2c4e834d02984443f7806e754cfff007a5a59cd6f35ad4"): true, - common.HexToHash("0x8798d5b41d3888ae5ee8e1ce72afe2e95d5ecfcfaa5767a941e18222c4cbe54a"): true, - common.HexToHash("0x8cc53dbb6bbb00dd4c0dad2854e8962b7b8286a40621be241faefd6481e62838"): true, - common.HexToHash("0x484ed41fcfd85084562fc666358aad4c6464b1c316f4af03b8a1467894043a84"): true, - common.HexToHash("0x05b4adefac187856204f9d34b2c4f633471b58b6e33a4beda6028cf8e7344d1c"): true, - common.HexToHash("0x6dd3c42de76709bf5e5b61b1e372f0a69a60c15fbf74fd614548d652d2504af5"): true, - common.HexToHash("0xfb25b436156266fbb72d66154dc69bfdcbb3e6097e7eff60cbaa66ed0a2b41b6"): true, - common.HexToHash("0x22f68a8bf1ec9b2c5ea2f9ae94a9de559655c462d9c846cfbb391779416a687a"): true, - common.HexToHash("0x553e8206cd4db003baf4237ef180d16e047cf6a77aeb8f3aa94644805fd34071"): true, - common.HexToHash("0x6bd6570c17e762006640c950885771b9de009dd093f2562c1cd51cccb5c49144"): true, - common.HexToHash("0xf7eeac9d0b642eb38e0f7d83f09183c8520db48e2f270c3e7e241d3300f84223"): true, - common.HexToHash("0x402dfad2a75066180ae0e2d93865dba6cfb18a23f4e20ef0c706169834e5b2e9"): true, - common.HexToHash("0xaa84ea0d482d4572dadb81fecfb261b1db61ca74ee32c420fdc690a9ff432419"): true, - common.HexToHash("0x7776627594ad6c52c836c2261d5c85bbb8d7cd664c1c7a37f7927e42e4b13699"): true, - common.HexToHash("0x2466efc00b88e484abb7ddd3a9cf3d4e215a88be978806de13d1c0396100c97f"): true, - common.HexToHash("0x530184ef89f6e95b631e633d821605e99a5fe9426e2706c6124d3af5de9a1271"): true, - common.HexToHash("0x015966b2cde3f30458e45c71bc8ac00fa50f24534f2ca0d859ec9c5c05583c3d"): true, - common.HexToHash("0xae2b821d169b63722bbb1dfdc9569fd415b83d6e7e1259882cb582b62ebeb08d"): true, - common.HexToHash("0x113967102c293ff478a28e66e35341d9374f842786ef640409a9b9a43e1da685"): true, - common.HexToHash("0x1aad19e9993b8ff9482d7b26acd11bd203bd67cffbb91212b2ec794c64c20fd0"): true, - common.HexToHash("0xd75d7284c32cff6af4ecbf127db143a1704f21d52f2bc51154377427adabd21c"): true, - common.HexToHash("0xe7d698bdc4094848de2bf530af63648f39326da7bc00047651248e94b105d136"): true, - common.HexToHash("0x396b231b517dde196060f7139efeac7908046c0587ff9b559175205de7d11252"): true, - common.HexToHash("0x5cca6d77c0625b7a5dcd12d17782237bc4662db74d90a21e139d055b52fd7d08"): true, - common.HexToHash("0x35c22c893788f76f3d3acf2e9fa3d8aa6fd3a3aee8c7fa68fc85b4876b6e0f8d"): true, - common.HexToHash("0xc5f1d174f3d0e7e439a6c803dc36a828c81ff9059d11d99fc2da4105f24a76bc"): true, - common.HexToHash("0x7748d9ecb5cb2a9692b26e16d0bc2c3eb1fd95fa8f21f50bb9aca9a475338b97"): true, - common.HexToHash("0xfbc2a4b7b44f64d854fa56df41be1ec1d5d7abd8042187e41ac89c94a5a326bc"): true, - common.HexToHash("0x7ae0cc9a13aa882a2300f0310c52c827bd694c0801ed18b587e68f76f129095e"): true, - common.HexToHash("0x19eae511503684ff048281058dd9c0e32f7c9761f318b11279370839f7558694"): true, - common.HexToHash("0x22834c983ba8dce2fb0c51288de2ae1859fba6d699710d746510553b90de2867"): true, - common.HexToHash("0x860d6192f665b072d6b7d0e8c6d18d430e7f3f44490dc8b0e6abcb530a7eb2a0"): true, - common.HexToHash("0x54b22f6646a3385e0112ba4d0c6617eaaab753bd29c6eb4d2623f07ad4d486d3"): true, - common.HexToHash("0x4411139d069bf441c7a4565916d6eb341cd0d7d655659ddcff5c6a9c9f24561b"): true, - common.HexToHash("0xff310c33347d6f3625ad61cd31c9a8e3dee5ceba28bfb638c49a500f11d87f0d"): true, - common.HexToHash("0x345a9b4de09b964af151cdef9ee1623fc391a0b455f9937fd619adf342b7d84e"): true, - common.HexToHash("0x7e26c3c7fdae650a87b816f3a7c1fea8313bc043be49f457318e64a70893f801"): true, - common.HexToHash("0xd59494ba9b61bf183e920fa59e7a8ee6a52c6fa443740f35801580e7f958c200"): true, - common.HexToHash("0x2fba70e8c504b2c0f5555beb79725c3b39f44f30cb42c63ccf489cdefcb9fd4c"): true, - common.HexToHash("0x97c632a1ab274340b18f41d382f0891ada606ea75fe98c645a46147eef4d5ce4"): true, - common.HexToHash("0xfc7d5f03a3dd32ef4d8997b1f8b48693637e7077ccc1f74e195698c9215230a9"): true, - common.HexToHash("0xe83a2bc1534934eca140cd271e614876d533a7ff624c8047cff7a2bd8de7c60b"): true, - common.HexToHash("0x953269a3e350822e62972b7a9ae7f3102d5586a47085f1e85239d99227ab8b94"): true, - common.HexToHash("0x5e799060e916306e5ad1111a15c1610eb49b84d9f26272b6eba5ada1c61e49eb"): true, - common.HexToHash("0x96b03f916e8d9e2d1764c2bcf8520ce668c3a7b53acd59a217a79b50df6158ee"): true, - common.HexToHash("0xb8b5b6fa97e5ab8aff5b9c4d4131eea49698c04f224cce7e7ae08e3dbcb89bf7"): true, - common.HexToHash("0x7c7f0e8683d33feea1c716f534a757527fb96e1c1d0d28d86d93e287d67eee9c"): true, - common.HexToHash("0xa8ee918baa54817b4a238209dfa5dd655b51cc6a2683ab3442c7e66f0bd9592f"): true, - common.HexToHash("0xb157ac60fb696f326c17aa2ca3d791897c2b2a4b27c64c793e92249b5d7b6a7b"): true, - common.HexToHash("0x17f9d2c4b9f88905eb7f52194d19dad8c8210aa47a3b943699c5abf0e499a57d"): true, - common.HexToHash("0x4c7d8e556bdcc360594f5697d3b5f936bb13954dac86e0a90e5796d024ac8b41"): true, - common.HexToHash("0x172558ffd4c9a390dea49a2d97e167fc58a70618c5774aa0949ac6c2a08412a9"): true, - common.HexToHash("0x4e00122a1e5c288178bb50e823042f0bbf2c87aa8cead583772def784fec4cae"): true, - common.HexToHash("0x89941b01cea97fb3dd0483e14a109c94729bd73f830a44b8807018dc93033c49"): true, - common.HexToHash("0xa30c88742159215f39fb9a3db3c9ecd721d0fdd8fd273294652334c014447e58"): true, - common.HexToHash("0xe40633b2568c19dd9c95d12885257a6e9486101a2fe54bb963ab2c4e16ad5da3"): true, - common.HexToHash("0xe82b99518f4d10ef5328b6baefc442dbc273337cc5329357fbd6516ad99208de"): true, - common.HexToHash("0x02122c289ffc6afa9e6468f984e1c14342b8cfe8a05b1c02a6ece01693f6df26"): true, - common.HexToHash("0xe5c03467c06ecc94ba32f8096ad6a351ad49481193f9153eb039fe1ad988c7ac"): true, - common.HexToHash("0x66b05f627b257c11a9347ca552b22b0cff78f9ab6de34ea09274c01467b4d5b3"): true, - common.HexToHash("0x7cb9daf904f65624552e2ff2b7227763e2f62574a84596ed00155e08fee0a357"): true, - common.HexToHash("0x94ed6e86c9984d0524e87a36addb666f009c37014c8557fe78ea05d4b2e032ad"): true, - common.HexToHash("0x8dcac351a8309f457a83b3e4c359d1f3ddaf2fe8a5d0f98db26b5bf5eb9866c2"): true, - common.HexToHash("0xa0b1e39718b37c36692dfc932a3d235783cd1a8c94f713273f7224d4df2aa826"): true, - common.HexToHash("0x7d1c84367630dbfb40876b139ae15bf295e66fff596f6b1022dabdbc8976287d"): true, - common.HexToHash("0xf2dd5bafa16b0be4b3a9c0c6d217132cdba5fd7bbce8cc37561cf6d512e3618d"): true, - common.HexToHash("0x4ee0e15e4ae7f65ac17f436d90c798d629e93e389089e0dfa64d464f020a893c"): true, - common.HexToHash("0x7f909ee9013ace141c2541662441d5d29ec6bb0505624b5a2ee1e6beac8a8543"): true, - common.HexToHash("0xabece3e0f91035c4946ff2cb56e2986e80518f0e829a6692f9c74802f282ffa8"): true, - common.HexToHash("0x9aba72d435cd5fbcdc4b03c9cb28b616345a1f763179d6d58a1c7c4351d6ec9c"): true, - common.HexToHash("0x0bc17f1ca1ea5abaa9ccb2b6441def9652e92ca6d62846073c1293a96a94a73b"): true, - common.HexToHash("0x66a8c08dd424ed5d30f72d5761c866addf352f7f424295695ece5beb5799ab16"): true, - common.HexToHash("0x2fb9ea8b6c89939f57ca70061504f7279c1012f36aad6df90b9eb3b1c58f5752"): true, - common.HexToHash("0xc1e31d1aac7e88c1566c4ac07e7c0005ab3d93870d12d93b9d1e42a900faeff2"): true, - common.HexToHash("0x2fa6f200cee9e2d0401c2c7cd2fe8e583ae1af18f6deb947d16d72685bfc76f8"): true, - common.HexToHash("0x83151d071e0157fd9d5329ae96031236a369dd9006578ae45f96aaca55c0f816"): true, - common.HexToHash("0x52f096d1d6307ed7741e7c276f2cc0ad62480026c1331fe4eea43709eefcb640"): true, - common.HexToHash("0xdd3b2d19d06bc34c0ab7610ace6c31b808e86e4881cf086c0c24df239a62d27d"): true, - common.HexToHash("0x00742455e794fce7b6f0b0357a10b0dc5fba3f0b0182a9478f8f703d6d8c482f"): true, - common.HexToHash("0x97477d413a40c27f9aadc771d517535fe9a3695174d0106e1e9a361ef2c4229a"): true, - common.HexToHash("0xf33a382a845a8d43be81b7434d5af248f4deb76c37441651e5cc99b1fdfe62b1"): true, - common.HexToHash("0xa7c86b9176a79919d8158d32370a2a21b1dcdd558a2f5d9810c0f2158d8df664"): true, - common.HexToHash("0x3580570ee8c57c17f63f3b246c4606f5d90e9f3ad0725318cb6f379ef11fdb14"): true, - common.HexToHash("0xde65f11f6bf4542b9293b08a9cc6a1b490b4cc58d630ca06f477a54067ef6b33"): true, - common.HexToHash("0x97a3e8d1e302dc021ac44584ae40b34540db52fb10e9a78c8302d767d2e06a18"): true, - common.HexToHash("0xa9fb1f48fe2f1c0e9a7322818d7f2c2ddcebc3d6b08c82b570b0495811825ab8"): true, - common.HexToHash("0x7581d118f434cb40ca66708c141ff4e07b30c1ce25ce6f0f63d2226964a85bd9"): true, - common.HexToHash("0x413e76f8713025a2e252c4f5253d6e552aece8fe677c89f265704ac40d95ec7c"): true, - common.HexToHash("0x84a8f5d8351613a1e28a7f5ced814bce08fa4719453b97e80b00964ed9a1e7b8"): true, - common.HexToHash("0x28053543d1b49d991f90fde4625f563bec59a90bccd24a6271109a34bf3ddef2"): true, - common.HexToHash("0xf889fb3588783fa07871afe57602a566694ef43edcfd2359c98d76e490d5fb82"): true, - common.HexToHash("0x63b8b62a9a1f4bb4c53dac54cf061c76a20a8170f41908c93789c81ea045740f"): true, - common.HexToHash("0xd0892fb6f8632fccc8deeb454c1ea05a4371f1196b385e5e94cc683b6ca82abc"): true, - common.HexToHash("0xfbff680c9efcfbbb8b1089a28e20c7c79412a8bb68a9257c76b6d91df6c8856e"): true, - common.HexToHash("0xca1dd02ed8a4217607c19b8c84de8d7d2655b87a0fc6e43053e45d412ddf0f64"): true, - common.HexToHash("0x0141908c09aca98d65b53c70b27f900416492927288d7bda94232f538c037cc0"): true, - common.HexToHash("0xfcc04366c543f3e8582deea09eb126bd6ba79df678831fd586bf9e4bc7fa4e90"): true, - common.HexToHash("0x162827dc7225995a9713fa4f1b23b35739227631dbd6fbb336e09106077a79e3"): true, - common.HexToHash("0xac8c651d957529f72ca5551861411d43051f9072f56a007fda614bd7fcc1dae1"): true, - common.HexToHash("0x2b492b718cc4e0cfb7420f9631ffdcb332e9f2c49c00efaf2137543eb691401a"): true, - common.HexToHash("0x9764972d2577770d201db489bf24adb6e408648976a49f66fe89258fe01b4e51"): true, - common.HexToHash("0x10c81d46d32feb60c2e3818a403ca638cd491fbd33f389581a04cec4108aeae0"): true, - common.HexToHash("0xecf25dbee8cb8ac3e935e6567337cc7380954dd5bb38c1b8e6b14678cc061781"): true, - common.HexToHash("0x3bc5463e82254c32c02e2d56e2ebc208109c7aaa2b6e949b385ff965d1bc9e68"): true, - common.HexToHash("0x8b065d5b7604878f7e43681260b49cdb7b1200faa16550c7963f3ce8e30a8a4d"): true, - common.HexToHash("0x78e93deda6c2a1cb1ac793bfd2af22e8c08b03c5866b90c2fe3c3ef62f4f834d"): true, - common.HexToHash("0xea7f953f229655ffd7fb62419536761650033965d3579ef73280adbbc1094af3"): true, - common.HexToHash("0xcac1bd8cbe4a662b365d047142fb0106bb9c99b9e740f7eed8982b1c6af61ac5"): true, - common.HexToHash("0x835bb7903d3924e00bb82b52dd164d2d22e03afaa3809c55bc352df745044691"): true, - common.HexToHash("0xc0ede4f803fff513d0c51381d5494913592e5688ad553df15a49795d6c5acc41"): true, - common.HexToHash("0x2927a3f6c9d81d8565c4764778395b30f8e05a7148fd086d09f0627a7727f0b4"): true, - common.HexToHash("0x33bc43b87b5e7c88832fc89a362ede1e3672ffd6d775c205ef5eb16e8ebce86a"): true, - common.HexToHash("0xb20658f66fe7d2f86c93c68bd16919301ebaa3837744ef0b4e9b9393417877a8"): true, - common.HexToHash("0x1e1330cbc87cb17e45b03df13e70241b143fea27d0f7cddf7f32dc41e05b65c1"): true, - common.HexToHash("0x1ccc0dd5f703bd01e17fab2fa7846a228f1e1af72cb95298aa8338ebd94bfe53"): true, - common.HexToHash("0x42d32da6bb34a311538c2d896e78bf0502892c5e948618656f37621fa4093bb6"): true, - common.HexToHash("0xa73602fb1322e4e831940696517940ef925a71defeb07ea24051cda9bc10e58b"): true, - common.HexToHash("0x048ebf50f4c5d69b76e76677a6b666ac4dd83739e0f8abe6ab9daf7bb0e519de"): true, - common.HexToHash("0x6497a252a4f309fb4211412cfefde9a849beb5984f532ba7310e825fd882bed9"): true, - common.HexToHash("0x30ce4d04fe0995851172b541fca340e5dde663a7e167f4b7463fd25e91b2ed53"): true, - common.HexToHash("0x384c32f10b202a8da6dffd8428246102f5ac45bc03eebf2ea9440966cd9daff6"): true, - common.HexToHash("0x567ae49a01aa6cb8f862af7e499ea4467e0806d3da24b2c67df58e1525e12372"): true, - common.HexToHash("0x5a4f9a406996cc36e68530137e400b89a870e7556c5d64af8d5916522f55823e"): true, - common.HexToHash("0xdef3f54147bcb18f8f0a9286754b29396b8eac54d94055088238ec1dc8050994"): true, - common.HexToHash("0x935df7753c02e43891c049896ab842262e8b9d1f18e309d9343fedceb641cdd6"): true, - common.HexToHash("0xd2b3eae478111dab4d5ca62b6265e895797c573a7c7c55f47e17a70882822efc"): true, - common.HexToHash("0xdfb40a7a40e78b89ae00232b31d7fc6cea32f35ca7b48f1d744e6b551fef9a88"): true, - common.HexToHash("0x8fd513da273144c3b09d31f36c2350b16633404e2f48433cdc80e12476e7746c"): true, - common.HexToHash("0x38dc0a12be6235a604cab0caaa9773133302fb5b9d399a13b18c50cce7b92d57"): true, - common.HexToHash("0x21dccdfe2881d6425106dedcbee99f5018d32d1cba344147e41a2d9c33677060"): true, - common.HexToHash("0x887f2478e78ec9fc8f3a97173153fada87bf1d4a8fe7395ccce7ddaddaf43a69"): true, - common.HexToHash("0x5091b34f42bf17aeda7d4a1893d9ab15bb06880a783d0e5d44e8bd77733bd4f7"): true, - common.HexToHash("0x172e3d5170f5d63a497a4d69c3310589432ddd832fb19d65654803ee4e900412"): true, - common.HexToHash("0x4ab677b29c0239f8197487ff64157e4911517613f10dce3b946a72fe8e3e7361"): true, - common.HexToHash("0xd4831ef3baff2eac83c52d769c8632263b678e60c84ad8a9e0e119e70b1a278d"): true, - common.HexToHash("0x3e7f5caa58554450559d32eacea8fb6212eac35240f440518d283cb7439d1732"): true, - common.HexToHash("0x4211713d7f233fea3f75990d4f6412610658779df59d0704d080a58447fe7de3"): true, - common.HexToHash("0xec85a57e6df0cad358e4685ed63a0c3c6de1c9d70ac6328b7167e05fb084a216"): true, - common.HexToHash("0x23787500cdb303ec77ff9a98120bd28d2d6dacb5444ae42b98e3ebc78033dd12"): true, - common.HexToHash("0x2ddf398edc963ab80d681317141b9fb9b96b48af178e72f83d6d2aa04b174986"): true, - common.HexToHash("0x85d533db41371bb1418ed71458b69029aa4e1b760133e1deeac472fc6cca0fed"): true, - common.HexToHash("0xee87c0ac4578bb67e9cea9dc74c1190cda74b1362fd19c79a2552bcb1cb81f0b"): true, - common.HexToHash("0x772d3c6b6f1d00d1a373edd3cc6c45d0783a4b41439c606279912eae42df05b1"): true, - common.HexToHash("0x8fbd910e841b3008a9acf1f16fe39572ac223b62f9b56a0b8113b57cf90d00e4"): true, - common.HexToHash("0xa2c3aa766866dfa4b748e3c154904023d2ad61fab128226707dd197445b9ff86"): true, - common.HexToHash("0xca057732d064899a2869b370248aeea6ef26ed5d2fb71338d85f875b3445535b"): true, - common.HexToHash("0xbfe5519ed57702c86962511e12e3ae5bfcd253101b4d538373c75100c897d429"): true, - common.HexToHash("0xeaa79aa5e5329d2b16177bfc8fcb1c932b15441e766c33db33277ecc6f016236"): true, - common.HexToHash("0x1b11d8a51f21adfbbdc79cb4cf3fbb718e92de4cab4b8bfe8819b0b2f86d3468"): true, - common.HexToHash("0x76de1f4e736c35fd70add1b3c6d069b81a7d31a847f767cfd39f58bc9f91bce7"): true, - common.HexToHash("0x20c7583851f3c130f2204bbf6238c6ed54e9648058b28971487e527c23f85a2b"): true, - common.HexToHash("0xd9207c691e998de901521f9e14d5f3257b1e728debb722c2e5ea0098de6f2e75"): true, - common.HexToHash("0xdcd4d8b4bd8687c5b9dfbf0c1beaed82dd551994680460c8ef08a35809b8d239"): true, - common.HexToHash("0xc7d4e50d21b8600bbcc6f58fdbea69db02b0d4133f3dc4e916c4023682a62d74"): true, - common.HexToHash("0xfb4748476f38ab66809d8ea170715fe4e747d42dc6ade7a804020904294acea9"): true, - common.HexToHash("0xb8c3f5457a547ab92ef23ac35052eca631a3f98d501b951ad1862749fb2568b7"): true, - common.HexToHash("0x83cb8f1287a7da98fabd646454673d6186deab8459a5cafb85787752881a475a"): true, - common.HexToHash("0x165a8210164d90c1a94cf8e55bde0ecb0c0528a5781ad3caf985f1f0a95d607d"): true, - common.HexToHash("0x2fa0520a724f8003be52152df100d942fcb280ba1a135eac3d6b57cfdf8c58e8"): true, - common.HexToHash("0xa55417daf7df63b87003d1edef747d5699700c3a246fc959196b906d4245f870"): true, - common.HexToHash("0x552fe3c20da36298c7554bab1a967340e358fb844a84f880d6b3db1b508af7a7"): true, - common.HexToHash("0x2a828ef0746cd7209bf2b71a396c83fb60bfc53bba2f1bf2abd9cf5ea8ba31ee"): true, - common.HexToHash("0x019f1438ec22b9cddd98ea379f1c03758fd84a1c300477f32337278cfe68d3a3"): true, - common.HexToHash("0xcb48439665591031a4e1bff571fb15775fa5072ab4dbf2351437beb5c387975b"): true, - common.HexToHash("0x4feaf1d16fa340b89dee620db76fc4c4e8ba17ed735625b96bcf02a607e153c4"): true, - common.HexToHash("0x52fb69fb0126c30a16dddb6d4acef1bc84ea5e75cf0ce42a5f6ddf3f5dafb987"): true, - common.HexToHash("0x3cbe67828ed46f5ca7576f3e59c4a8004f47227c98fbbb293f85f0565504eadc"): true, - common.HexToHash("0x33a0d8d4fec3c456525d401325febcb02f7d1ea669330800b0f56f4287cf9b24"): true, - common.HexToHash("0x95b34497be1a96b3a5be5f37f2ebf3353a98475af48a914cb0ccc10aedcfd94c"): true, - common.HexToHash("0x45b84a6c8806fe6aa76d292aaf64327add2619ec98bcf896996a797efdcb22ec"): true, - common.HexToHash("0x4dc6757ab3a8eacad6a4b0286a3c68f3d5d13c05f485f6b751339a5fdcee66ef"): true, - common.HexToHash("0x781a34e88dfeb1c4db683763dc5d979707bff5eeba0baf77d3ffca178a2f4403"): true, - common.HexToHash("0xb05b972a07344d994b39c04d99a521f94c39098be03e7be02829bc68a4c0fbfa"): true, - common.HexToHash("0x98b5cf0dde756da3bcfc8de10117e96d9f7048aa27f4e46472385b3c8d355c3e"): true, - common.HexToHash("0x6ec1ecec8d1e6ea8cdb2ae1e388f2a24db61e35ae29136b21a923bdc59bf9c5c"): true, - common.HexToHash("0x019f969356405a37efe764574073e137fe685ea269fdc1982dd925e25b7d2fd8"): true, - common.HexToHash("0x0eed219e98ad9221bbfee8fc87108afa2a266a1c75f65cfb34133e7f846f6b1a"): true, - common.HexToHash("0x42fd1addbf3d1c70d6777148e02a40378b63ac52d2a582d2df123b80b5324f04"): true, - common.HexToHash("0x3ce147d4a2f33d58dbf82eab930b256d6db8d61f93aba525d6be4d6e73e621ce"): true, - common.HexToHash("0x8197bd15fb196eb2455f16468e4a9a3270cf0569452d3bf066246c8ddfe9ebc6"): true, - common.HexToHash("0x616a891ccea35e0cc9792dce09f354da117b5063d320dc563930070220fdb55e"): true, - common.HexToHash("0x45eb69ff95c400d9883cbc32643d71aa4f23c201854e508e982019823ac37ce6"): true, - common.HexToHash("0xb594429ae2090c1a00a1d3672aa12c7310f4af5be90e9f55917205c13d421566"): true, - common.HexToHash("0x9c6b5ecf761e10e93fc4794619696aa8d9d51f79b5f6d0550aa8ec5e8655b9e5"): true, - common.HexToHash("0xdc9b61360c39988fd99bc9f165a5251b06f2c2cd7add866c5a7530d3799077d9"): true, - common.HexToHash("0x6307dc2971a9514cd2e3330ee300d3fc4b4ea0f3e4a7c3862ce740652ac4a558"): true, - common.HexToHash("0x737ac23da92d3eef0096589b266463e4a0140c99eb4ea7099d6092235bc7f012"): true, - common.HexToHash("0xed3f3f6bcb9b4ceded7c7e86f041d72bd30fcdb31d7f1b9041b1a89d366642e6"): true, - common.HexToHash("0x16d498c0253890f713288bddf7d874986ca5b6e4bc739939796fc5f80a6fb397"): true, - common.HexToHash("0x6560f8f79a73aa2b2a6f21b0b92208f99d81f19a2e2b3527de8b16feb4847268"): true, - common.HexToHash("0x514323baa1bac53a0f6cd012ee8a224daf1c6b7d47ed874ba6143ffbf7102f73"): true, - common.HexToHash("0xdf9cf814a3ed1dfb9fa905eaaface7a42fa15d5c26639394155bc9973f8e1309"): true, - common.HexToHash("0xd5b539e6b6f33ab845371410efcdccc374f1e20acafdbfee175638cf1ed7f4f9"): true, - common.HexToHash("0x6a5c1e69a344c07e834fb30fffdc385f693faf1acaaf1460d6ea822d0a89e6f4"): true, - common.HexToHash("0xf87137ae599074001abde034ffe13e2ba2bcb8ae5794a2f4ff16ab85a3b4d918"): true, - common.HexToHash("0x5f68453e26aefd0480acb7bf050877c28255a473cb187fcf75173c9d6b84db83"): true, - common.HexToHash("0x25996af27bfa134cf8929a72a8ec5e70d8e96e2c069716b97f64b49d6fbdf836"): true, - common.HexToHash("0x26891739342fd7d894c7e3698975a40ee532f4b13a56c01bdfaaf172ff47843e"): true, - common.HexToHash("0x9334739ed9fb3ca424d5a0ba5304248143d89403332c66e1fb043aa006cc17bb"): true, - common.HexToHash("0xf14fbd85e5f5481b03af805dafdafb973dfd26d68d6b306d6d43a8dcf41f230d"): true, - common.HexToHash("0xb50f002094b6af7559076f4b3fed58592c96da1e7ba16a69b81401a6af8254d7"): true, - common.HexToHash("0x43d1170565620cf8b94a3627823e6d3027100f7406f2ec111b18abf959bc3b01"): true, - common.HexToHash("0x104e78dfd9e2117325f7c1dbdf7a0029077b9ac6ca88ea4584c21da34a55402d"): true, - common.HexToHash("0xf5738a6aaa83afec3b2f06c653a9071e2af516fd1fbdbc060c38f3557d8f4333"): true, - common.HexToHash("0xe657d73f7453eb9abda324113daa30381f1b550b9387d708a032708618b20f1d"): true, - common.HexToHash("0x2c2f730da29f66187777b233d514bbb54b567eea2e7ced9a2cb49907cf6a25d9"): true, - common.HexToHash("0x2cf03f4c9300251a4fd62368d55e6144756abe4641cf65434b8304d268e0354c"): true, - common.HexToHash("0x1cbcc20af5e8e47cb8e15b9e7c31ee67847b39c0d885560a5c02f23fe82709b1"): true, - common.HexToHash("0xc1d85d56d29a70d7fcf6e4ee7ca677d9f676576bde2a998523b742cb9c9125d9"): true, - common.HexToHash("0xf2ed100144c3c4878fe3d5dcdb8c31d8f973af7681c1078ae8b009968b01f87e"): true, - common.HexToHash("0xc8b7c24ef4b25560e1d68a1e16d4e709455bcc67f6022e2a6254b6feaff0a7bb"): true, - common.HexToHash("0xff38678c761f2e54c536e2e18f88af29dcbcafb58bb7e853091cbbc07da2de62"): true, - common.HexToHash("0x1ad296ac8d8ef66588788a80a2f67da4fdcbda29f254748f4d54acd51f165e34"): true, - common.HexToHash("0x16a6db6395f4042dab6507c2d7e22eb7cc2ea0039f85bad1ca8415a20740084e"): true, - common.HexToHash("0xbed7f673490b4d6850ce64afae30388cbe1eae285a19f3997316828e6f2e2f90"): true, - common.HexToHash("0x7d9dc582e7c3ece9e32a179338073bb12b9e885496ca4661d2ad41af8474c8b8"): true, - common.HexToHash("0xe8dfbafa76f7d490bd1f52854e627cb65e0860c4431a22b93b8b1d6bb1efdb60"): true, - common.HexToHash("0xe710ac832ac530ddfa3214eb4ddd97d02bd8aa4bf756fb03d548c10773a93baf"): true, - common.HexToHash("0xc41538da5c78c67d64fea643db6c9351e70051fe278f04720ae2f60512af7f56"): true, - common.HexToHash("0x83b897bfe7ec10f45277e14b8e0c108c067f80127b7005b4d73e93f9be8462ca"): true, - common.HexToHash("0xa0b2f8ba38428b0e03049a7597c61a540057b6ef2fdcf0a8f280eace5a82e43a"): true, - common.HexToHash("0x77f50e001737b9a173526ccdfad6d9130ac89e2f8ea04c416c747c71e892653f"): true, - common.HexToHash("0x6a2725366a76563771027e0198b6f42531d25fa818d2368057a14a6289a67ba5"): true, - common.HexToHash("0x02fa63db341d5f5bb051d1b89b2aaee97fe200fc71725f6c80632dc41d77ce5f"): true, - common.HexToHash("0x4157317cc7fc873cd6c7056222524991aef9389b431c2820ecd67fea1989d08f"): true, - common.HexToHash("0x479068ca7862faecdf85a21a29320b888950418c06494b328197a0b10b0783ad"): true, - common.HexToHash("0x160b8b8d968098ef5dc41269bd0abebe64f12a738257be5fb032af9557628c28"): true, - common.HexToHash("0xbd34ab6c86492ced0e832ccd283488d5db2ccc0a29b4108c54ed1466eb7832e8"): true, - common.HexToHash("0x42b7bcaff345f87993d238085ac23b04d382b8452b38c46f4a0fa6fd4f3a87b6"): true, - common.HexToHash("0xbf49031db50ddb942ee7e1405922f6a8d3f4945d891865283e49480b9dc95a7a"): true, - common.HexToHash("0x90693283e47564d4cc74f5a7956874273fd1566510eb6fd4d28f6b26ec18d976"): true, - common.HexToHash("0xcf4eaaf19e016f5098d4684a1bb8ccee7ba11b71d77df0fe315c87ea9825c04a"): true, - common.HexToHash("0x56178663575d66388c8b21ccc80daf1a020c001cea8e3bed2da6fdffebe4b802"): true, - common.HexToHash("0x98c3ead9d23c22b1c9aef2290fd0b89d65f87cff318f558ce612428c44592971"): true, - common.HexToHash("0xa3611cb9f00fd474232b44ce5096e30d805daef512b8b6ed7005849c283aebb3"): true, - common.HexToHash("0xa1e08a7035719fa04407d6a3beb27f9a1852c5aad4662bd757e4eb5c57540e05"): true, - common.HexToHash("0x1a6b825111bdba03d99b312525177fead6e0b70a6c5652bb053007df972dd73c"): true, - common.HexToHash("0xe38dfacca850be2937b268f236eadaef59d2ab8774f347739506622f10ee7b05"): true, - common.HexToHash("0x6963e5b536399a46c3283ab674c595b741a3aa10769733c7647a56c155a371ad"): true, - common.HexToHash("0x28af56a8ca92646c87e793258a3393116f654aa3e03508f5ab901c22882851e2"): true, - common.HexToHash("0x6f60444c19ce97030494c9d4fe983486f170db436e640b42e0a92dd321e589da"): true, - common.HexToHash("0xcb224d3825a86a2d257a0d1464e285d158e0f3adff2e2d07339aa7f954d1f0c8"): true, - common.HexToHash("0x4644018c4df9b6507dcad47f1301e8e65a879616db95c1909991038bddc5bc39"): true, - common.HexToHash("0x533ddd3e3e1e2c9a50c4594d20e364ce874312a4d4ccc34c3b1eac50b1e890f7"): true, - common.HexToHash("0x7219e883f91605af2d661b513c993025b9de44cc97515e71e22e75684170d634"): true, - common.HexToHash("0x43cf170a06d7d8063a69e001976be57bbdbd58b9d604083a77448f01a2ee4a58"): true, - common.HexToHash("0x9a68521cf44bcb61879b4239bba301e00adc00cd3c846c696aa9804e2e227a8d"): true, - common.HexToHash("0xbd3b77223191a2f1b6acb6f92aecdae336ec3f689805259d4f3120115972e8e4"): true, - common.HexToHash("0x57efbf7925454885ed2907d0d9dc6a022732c3756212366442ad5d2193653810"): true, - common.HexToHash("0x89cb7afa9aafef0c3659f24d0eb5d2e7042248acf9d45633789977a78d0da0c7"): true, - common.HexToHash("0xbf3dda581c117ceb9474a3cda106a3e7460e976a8a94e83153b5f31b0ed34577"): true, - common.HexToHash("0xdb2ad1de397895c1a1bb6f4d738d95dcc194f2a5443aa8a8bcf73825d0317ad0"): true, - common.HexToHash("0x41c0e204ebb37ad75c4ac8f54220521e23588e93d3fbb19108cbcaca749dd19e"): true, - common.HexToHash("0xfe387a112a57b72d423cb295983b7f8a4e2b5fa6349dbc5f1fe7c54cf2eb8295"): true, - common.HexToHash("0x3eb1ea5be0bca4a17c4ab58d5eb7e1efb85d9c1adef710ef71a23cd63fef588f"): true, - common.HexToHash("0x0a4017b02df20d1ce4b9e37e664b7d586270990630430fe9d75c7b925aee61e4"): true, - common.HexToHash("0x2e010c92cc9b9011f508a9eafce7c2c6d34a0ccacd54bd498a7a0610deecd5a1"): true, - common.HexToHash("0x4e2464cd7b53e39d298e8456f635ad2e6d66e58f10fe7a049506dd23909f2f69"): true, - common.HexToHash("0xdada6e038baa2faf8787b83b62ebe4c05ef1a93fa54b4913d13d75b30ceac021"): true, - common.HexToHash("0x98377e5e067651ce26e5de2532e4bea7f527fbb6b1a641f71ccb29010dad383c"): true, - common.HexToHash("0x16fda65f98859f18ac81dca5c0f8d791dff79ddb65f3304bc5e391cc12cb8f3e"): true, - common.HexToHash("0x56d0cc51edd37ff5f1ca8f66925c8b17d4af31e0e39a2d727a62f420dc676c87"): true, - common.HexToHash("0xe26868d1f0935af5b8b3da8f053c75f20d2d5c4385e0dd84bc16bc8936548e3c"): true, - common.HexToHash("0x3a126acdf8f7afb16ad4febe2201be8d6dd1db3996ec2cdf59e1b9b38d654c45"): true, - common.HexToHash("0xc3f3f8853510f6470ddbd9ce2671585e12d3e1fe68024847391393ef62fe9d45"): true, - common.HexToHash("0x04f88d37cc9f7583bb1b9940c0479953d3441c2719f256ddd3798ba12c19163f"): true, - common.HexToHash("0x9ad7dfb099fecdb4580fd6d702acacda0dde082c5ee25ca9ea1b59964dee2fbc"): true, - common.HexToHash("0x0cfe1432f88e986907a3c4060b48eeafc7694caa13ff29a8087a9981b413f4f9"): true, - common.HexToHash("0xed1d546a0d480a2609e452f275f334a86d93ca15a0d595815bd76e3bb2b0af9e"): true, - common.HexToHash("0xf38e467c64df532f1ed93678c01ba996063e659c5d0d5b5c1b66de06ac2f4fe7"): true, - common.HexToHash("0x7020b3fd7bcc56b1ddd15af28bd7ef7f95432f8b3413bb69367ff03c8949d2a1"): true, - common.HexToHash("0x4bd812b41b95000d9925c4e20ee2eaaecd61721ddb75de84af3d60f1790b5dd3"): true, - common.HexToHash("0xebd62b2d6e746311ccbced3bb7051167ef7626a7cc284ec3750d0f1f549bfbb1"): true, - common.HexToHash("0x2073b7a3d6588ee22d82992b1e13a6553895f643d502d3e06e5a7f5f1cd413d1"): true, - common.HexToHash("0x4f6e6877dd4d473d7e2cbd34296aad99e4185dd6b89b6972b602658302b32a18"): true, - common.HexToHash("0xc6b1e3ca1114902b88686b860b94c1664db43bbe53da97c375935bc12f7d7566"): true, - common.HexToHash("0x13eb8f73c8414df274c90f67cc4ca5b97fa90dd52f32d7727eee7dacbe2c1f8b"): true, - common.HexToHash("0x222b0fef91052920a319344c126e5e9b1ef6babf5556d9e0b1209adce784c358"): true, - common.HexToHash("0x7f63bec9becd134e011a02fe320b4fe00507a34615f2ea1a833a519d2d21db69"): true, - common.HexToHash("0x3cd5f50ecd653d679813cf8dd8b7f30b49f12df4b8c21881b920f6860c3d6bed"): true, - common.HexToHash("0x3943f4576e1e90e79189069f9447b08680cfd0d3b4c2c3213f546866b21b1c70"): true, - common.HexToHash("0xf74cd349f5ea9b73838b7f8b408adf671523c174d8b563f38dde371be09c6ad1"): true, - common.HexToHash("0x9770bf96b2b6aac186f06ea4f76ef9f74403f06b21876a6073538f58571980da"): true, - common.HexToHash("0x657438e320dba9ad2e38879c1fb2480bae9b05b3adbbb711e54648f16cb17fcc"): true, - common.HexToHash("0x6d6f0354eca5a32ea4955e4fe48d4746aaaa44319263766323dcc1a5cae3fd56"): true, - common.HexToHash("0x36bb34125460058b4d7130125d8258edb62a5dc68290060d392dd44312b1b5b0"): true, - common.HexToHash("0x7f0eb7071af68cd2dbb780deae1964d7226e524f1e01ac22c864847339e03f9d"): true, - common.HexToHash("0x44db26b01303bc224351cd6204bdacc66b68b4ab8df64f5af7d9877c8f5ebf48"): true, - common.HexToHash("0xd286249fe89671a8bd9edf9b8cc1757cb2eff62b77b89b5e09df5434db69b965"): true, - common.HexToHash("0x505e9003143395a60b3106bcd612a27fc4f5d5155f9b55628ea572543094cf7d"): true, - common.HexToHash("0xe4257e88d3b468efd290b7b634a685575ef170dcb4d19bb9897184add6fe0303"): true, - common.HexToHash("0x3c19c59d2bdf06f6eb134d395041913b38dce58cdd26334c9cc484a2b2218fc1"): true, - common.HexToHash("0x6f21753f95cec8c981472d2b148f73293e758bc57d1c9119e8ca1d42419ea36f"): true, - common.HexToHash("0xa44a6d600284c8313a470e7d2c766f3aacbe6a07d8cab084083e28401d168196"): true, - common.HexToHash("0xe0ea506809586757b1558ef45d8b6df5edd56f27650e18709cf041bb6e190376"): true, - common.HexToHash("0xede5daf53aeacc9a17a9f24dee24c1998f43563c0ee523567bf45df63684a665"): true, - common.HexToHash("0xae02aa5cf11105855b7e3f6126ffe58961adc6ea535a208b074d8c4cca32a9cf"): true, - common.HexToHash("0xf12f41fd72dae3381409bb6f43b3cd47649a24a32966a0c4743511c4ac9c940e"): true, - common.HexToHash("0xcb5a56e95e95112c621077971ba21c09507bbaa8c34a5077722c583b747383b2"): true, - common.HexToHash("0x93b7a384c5f61efc9756f48eed188e1053a7d8f5e9a90acbdb3e821bd1f83cdc"): true, - common.HexToHash("0xfe0bb83f7c0f1e12b87ee787c0263d025a26a0d2657b594c49dd0afc6bfc1ee4"): true, - common.HexToHash("0xf91d1bfaff1e8ebd6340e17c726742c52f005f80777582b15b8e19e136b58103"): true, - common.HexToHash("0x57a4da122f2697652292fd2fd6247cd0e080590e8fa5d740f81d0b5a4f87bb47"): true, - common.HexToHash("0x0e43a901869fd76fe9a41fbdee7add69005ae89a782820a5edd6f868ecf4a27f"): true, - common.HexToHash("0xc33b3ac97c36ca154bea0761664bc1c6ff145097e5f49d445e701d212a3b0462"): true, - common.HexToHash("0x6d3c81ae9df096221b856579275c71b045263f0f81123cf1791fa76c0e236030"): true, - common.HexToHash("0xb52a5d0be8bf726dcfa474ffca9ae1c5da9f68074ae353bab5be15633f776279"): true, - common.HexToHash("0x7ceb48c320112ee615ffbe60a05401cf351b7a622b2a5b2a01cfa16b658d9e40"): true, - common.HexToHash("0x1f80c9e6caf850ca08a612ee14e4e7db3fe60a733e430f343571fe77310e6371"): true, - common.HexToHash("0xc66dfb925730aedcbc462c9df67b34abfcc2da293ffa6ef08d0e1607313fbb18"): true, - common.HexToHash("0x0e2aa7ea8e9a2e48579c21af383a2879599bb013ca09020bccf4267f00e8eedd"): true, - common.HexToHash("0x50de7bb5ca1d0b15cd687c444f0cba50a1e90aa5770288e3e41857da91111937"): true, - common.HexToHash("0x077743eac705809f595040cd62e9aa4249e1c0b438e65392d16786b6f1dcf383"): true, - common.HexToHash("0x540e7ca1b9d9c10872e20a69943943e5bd08b6cafa56ff595e0906a0e3a8a871"): true, - common.HexToHash("0x61e78a2664997be6da8995abdf984ddd4a7d7a28c751824301ea3b35e1e9d826"): true, - common.HexToHash("0x803105b517a364d4689bf4629fb0c51a58cd63c927e10a539bbbf27336f4f606"): true, - common.HexToHash("0xa174d75b45a7c7a136db3e42d42ac77f07a0ef81eb76678732e7ba6d35c9c596"): true, - common.HexToHash("0x434851dad862801da932d6297bbbf8216e536479555719803d548dfe2ae8becc"): true, - common.HexToHash("0x5e10160e98c755583727de9fda42ab7c9add66e24d2167bdf90cbf03ecdac9c7"): true, - common.HexToHash("0xab9e24c7815404523a7eb16bca76dfd5efdb4a3d8fd2110e82421ce6cf6ae2d8"): true, - common.HexToHash("0x2ab2c1733b2054dd89258a5924ef7a94936adf6a9c5b367666e7b6eb87a0ea3e"): true, - common.HexToHash("0x2625b636b133dddb85f932e7536b062543359717550160c7ec8579f5d3ad38e2"): true, - common.HexToHash("0xaacdf6d60d7d25669f8fca6986eeb39befe96eeda628a63ed7a8a858f4f2e00c"): true, - common.HexToHash("0xe7b34e2ff3d5148a274d2271d2b4d5c48de0174e26314c57fff9eca97b78f5aa"): true, - common.HexToHash("0xff0decf268fdd5b35dcfcb45f7af40a895d0b7416965adedf6de51222ef027e5"): true, - common.HexToHash("0x21296efb7e5bf7550cd75391947f131079b4ba8fc5a02e6a613c13f2b1b4ed78"): true, - common.HexToHash("0x4149fc0e8a6c8f8d03447545f0423d5d005b9384dacb1723aba93893f37a9273"): true, - common.HexToHash("0xec07a9624d1de578ba53f731e8891d1b125fa10b67ebd5b9b314577c6aa0d2ee"): true, - common.HexToHash("0xab0af09f8c7181728097a8b8f8aecefe5b04a65ae2ac05049d8d8d37088fd513"): true, - common.HexToHash("0x33d4e9c67fe43d5e3c98f005440a34c2107e536d006a82a3f3aa69faa60243ce"): true, - common.HexToHash("0x10ca839114ddddd16035f22c71b420634a54d09b372cbb495b835e0bdd571b92"): true, - common.HexToHash("0x9ecb6b5b9c47eb76e6e049b986d23ef7f48b6a4149926848f497a903b30077c7"): true, - common.HexToHash("0xf661b3b285afa0f540113efc7394821d52618565253524b3b90d64968bc8e47a"): true, - common.HexToHash("0x76254b0e22f92f70bd62825cc3d748257bad206d440f1fef5b6c3c361215bfcd"): true, - common.HexToHash("0x1495edf6746cf521f73762d131cfd814f1a718937dd84467293caba9d22120c5"): true, - common.HexToHash("0x64ebe584e91fd7839127afeca9820a53bb7f3956b322ddd67ee0b093a8c25673"): true, - common.HexToHash("0x2a65dc25faa4ee668f10e3fdf896b4da6c61aebd713a9e66b022b88829fa603d"): true, - common.HexToHash("0x6d0684c8bd2d3e59cfadbf6901bf138d5c9e43b99a070bce4554416e8c49cdb6"): true, - common.HexToHash("0x681225c7a0b25a169bbcca3e6f17f4ca7a752a68c7512757bf0cbffc2ccd7513"): true, - common.HexToHash("0x32fda2ffcf9c5aa68de2fa065a7066dfe30c3773a01da2e508b383819520e18f"): true, - common.HexToHash("0x2b196bd9b2b10f3fe43541cc5e341389f28919fadee0c6af6353ae2e17865bcc"): true, - common.HexToHash("0x243bf5304c7c92ea86b0eb1cda3ba5f26e758cc11f045c4bd7e2554507c6723d"): true, - common.HexToHash("0x6a5e7c00d9a97841352b0b86a1ce1dc93e6e7847ba69057b37d940ce5f4dceb6"): true, - common.HexToHash("0xb9fe1634ec8fb70b8b87d00fb1df63ad7a029ce3843121b3d03f902ccd0c755e"): true, - common.HexToHash("0x18699cca9fe93d7199ce2dec625bb7862a7cf49b1a8ee485753cbb0c0fa70fa7"): true, - common.HexToHash("0xd6a81479987917136f5920f9cd4b206ae7f5259ed9fb92ab1859a0da44978955"): true, - common.HexToHash("0xc889e710d33386fb54e5405dd48c9cc9566c5b07d4d9f22989086049645e89a0"): true, - common.HexToHash("0x2749cac0fec504d0e1df4e0a81cc0588d69bbeffc5b9b6a0bd514df3e5434e10"): true, - common.HexToHash("0x6bfe9ed2858749cb82f632982aead659d3fcd92278fd90780f6890f3db02f694"): true, - common.HexToHash("0x356bba35ea02b90aeabdf9f6e2b666cadf03e65c600484f9dd51ca98ac2a5dca"): true, - common.HexToHash("0x0b7e4f00f50526b44732044fd1d775c7f4b35955aef3a0ca4d88f35f52c058b4"): true, - common.HexToHash("0x8f957074511a20e90e6316699e35cf94d17110375dd038d47ae701750194fa8c"): true, - common.HexToHash("0x3ac13e4fb9927aa3c8b8a7f220407d610af00f989e68972567d171ee73633257"): true, - common.HexToHash("0x9f10826c7530525b70cb0f2006f708e9273db0ad9e4ec382ec68229f8494c98b"): true, - common.HexToHash("0xe5bf072288f466ba08eeb3a81b0862efbf1548109db20d54d0fc9a9a9e8397c4"): true, - common.HexToHash("0x1444300f3df49252155a5f0ceb2d5338dc0a8ace3160fca4b83b4f9aaa5d2467"): true, - common.HexToHash("0xf8dbb7761c705d9d4d543a2cb314fa25c1d55f33a951975156094e8e623a0a30"): true, - common.HexToHash("0xb6d94d2139504c77a81987c70879c4c0f230e444ee9b45c3d54ebb885f0baf50"): true, - common.HexToHash("0xb4d6c0be04f560d60cfd7e2d34636a7e4028343980fb40504b81e0650297d1ea"): true, - common.HexToHash("0x7e3817341fba172916c25d5a2e4568a7552cd34b85f9e34031e9373ea5763497"): true, - common.HexToHash("0x08dc5f4fd3eb445849ad6b3f4bd04372fe2a2a1d01a2f211a43b5e9f62bed9b5"): true, - common.HexToHash("0x276fa74cb03cafd0e3224abb2b5056369a10ef75b719a5c4f88fcdab2efea283"): true, - common.HexToHash("0x82d660958fce08ae28b8e63119e9bddb1f7b55d41d9c19ce719e2fd96483d442"): true, - common.HexToHash("0x55cf780da098f730260a5509b50473eb54da55ee4fb38a9bf644edecf25e76f1"): true, - common.HexToHash("0x62cb93706e0fb1501ee7bfdf4ffbb19b2e229f37afa23b85cee8a4fe5b9e59e9"): true, - common.HexToHash("0xc462996582b9ebca662da4c91f77f78cf725aacdb6dc6a0f5a8767f6fb475b33"): true, - common.HexToHash("0xc66946c9a3b65835be67a83369c464d88ffaaa0234cd43e3ef455b4bb7a0c305"): true, - common.HexToHash("0x164b5499ea8b936ae2eb16d93844bc17deff5566d064ddc624f68d161e34b972"): true, - common.HexToHash("0xede7ae1463117e450fd01c5fe695ee11ed37c21ab7df70474ad156f5d1cd130e"): true, - common.HexToHash("0xf3b7835b4ff10b5092947cee6c5af71f46b6df90c05901226d6bc140379f0e9f"): true, - common.HexToHash("0xccd41d46c507ac0d2583f651a48b2113d2116f71861afc03e2615732ae6cc74c"): true, - common.HexToHash("0x6a93c6a937fa8d0d4148fc0b06cf9f6c7bd0edae9d631363b88f7814ce9257cc"): true, - common.HexToHash("0xbfccc99ebd546b0b1aad51807f80a8c3908d861b3d9dd6b51e1387b5812e90b3"): true, - common.HexToHash("0x3ad36be4fb2319960a8e3be3ef43096f27edafe8b03494e8ae46510ffec8d84f"): true, - common.HexToHash("0x05e2b432d9160e71269863194b743aa94b1401b2cc5aa211268fe3517d111c75"): true, - common.HexToHash("0xef0aad43155194d9c10ad3ecb6a18faa731a8711d6450c9b01740fec32cb9e30"): true, - common.HexToHash("0x9647f207feab09858a264c4dee1a3cf151c9289d0ef7ae5963badac93a3faad5"): true, - common.HexToHash("0x6b09a5205a2aa95b95f9da0e58ec5d2a3c7704757edf4ea0692c330011bbc292"): true, - common.HexToHash("0xdb44a66e2aa2118925db5d34d625b0506c7974d094b9c6b2489f50c449eb22f0"): true, - common.HexToHash("0x1c5b46d77b2b2f06676a83cb31b8264c06c05f5a13e789d177dc98b6968634e1"): true, - common.HexToHash("0x5a00c01e6b95926f68dfb3daa4ff3cbb4ecad43440f7d60eb7bbaa9761e576f0"): true, - common.HexToHash("0x5f6ddbfaeb2f67163364c242d76f5c3c5b4aad98f811c8c853871b678c12abca"): true, - common.HexToHash("0x5009fa52f2586a6e030573f8b1b3bd9e64178438cabe9b5c7ab838496ed92859"): true, - common.HexToHash("0x682d901ebd0f967f83d39e8c7f34e197d900ab644f650aa9e55382f00a8b3964"): true, - common.HexToHash("0xd7d9cc1b8c1f4ed2c2024ae5918cf91e5c28120f29af1d51530bb5c39be07e83"): true, - common.HexToHash("0xb5d0b01b36be10167bb64441aeca792c6f46230e2f0b8437efcb56ab2461b46b"): true, - common.HexToHash("0x5bb873af95639846c1787278b66b9a5db19bf416bd52393e496ed9ea99a79501"): true, - common.HexToHash("0x4034de8dcad53ae0cfbaebde8c3fb845d207044148386e1d4adefa98b01efe1f"): true, - common.HexToHash("0x1e33c3d72aa874e7302526a2843ce43af0cf90d74f79b830d21063219d0883eb"): true, - common.HexToHash("0x522e3e6f26d96ef6364b16c1537b173f310ebd8ca4d6af61aaa46450e1b63230"): true, - common.HexToHash("0xd811eda05df28d9331ea2aa346a23a7feba07c64d3937b59cd3b2d41e793b5a0"): true, - common.HexToHash("0xbb01df465980ba3a4c0d2003a5a54a601c83491e9a0482b51e789c95ff2e20e9"): true, - common.HexToHash("0x9dbc226d884f14541188aa1ce7dc191ed2670b0b761b0d23453286e5ae78eca8"): true, - common.HexToHash("0xccaa3dd31494c5232c0e75abe13c8f496f3091a3caa8ba20f5be2889a1c10446"): true, - common.HexToHash("0x83d94b69a6e0c5977eee2e4ed78edce6d95db60eec5d7b017ebc30aff487ce6a"): true, - common.HexToHash("0xa27a92299da4980dacab1c5c107b16bd887dc0cc90287d31b8fa0192e193a84b"): true, - common.HexToHash("0x2086117e47131ac464339ec3b2da737d8405a977a722cddf53030410bc4f0d54"): true, - common.HexToHash("0x9c5b9b1fd7349f0819a3ca392f3de694a01f6a334495faba48368c1fd76e8e13"): true, - common.HexToHash("0x0dc8271e6ad57bf66d76de3086a61e72436cb65f9e143f6fa20b9157293fee22"): true, - common.HexToHash("0x9080e30cf52920a4686ed636adbe93db18b9ec4b12919309b41f91baf3d7cc87"): true, - common.HexToHash("0x39a0e8a224820aa40bb6c2c19c064e6d8fd04d9120a003e71164e3052523ec3a"): true, - common.HexToHash("0xab30fc63b026578d153dcef885f52da4a315305e4a6fecee7994e9d5abb27cac"): true, - common.HexToHash("0x6857a13d184c378056902e57ba99bd2a73de10fc3eec54429a3506ae4d10683b"): true, - common.HexToHash("0x14a6830bb9187a6cc2808afaa040781d18d76f83b030f844b7cf75a7e572868c"): true, - common.HexToHash("0x1952bc30f3084d19c37240e85761fd7b6e91c1225e16c21b65e67af2f942bc1d"): true, - common.HexToHash("0xa69adf754191edac000b6fc8bdf19f7091a2c9aa1ba56bafc296e3bc4b49079a"): true, - common.HexToHash("0x2951c7261f4c11fc70fe1af3f6d3d5504156365c356aeba5c8de419affaad46e"): true, - common.HexToHash("0xae5feab9fcb9b72b694553ce668c971138589e9435d58cebaac85a2cd25a0b85"): true, - common.HexToHash("0x6127425842272b48a67a8be78c2fda4e74fd71123d36ea68dfd14ca46c9c6561"): true, - common.HexToHash("0xa6d494b8b2519a9b4e79299e84f59109e10043ca187d62d5dc8db0f85e278c2f"): true, - common.HexToHash("0x37f8b1e5d731253ec4c403777d2195efbdfe6cdc1847ca2cf29a013b46b16907"): true, - common.HexToHash("0x3382930ab330692c1c9d6e8ac06c3deb46ed766cf520af2d579b609309c719d0"): true, - common.HexToHash("0x65de58f3a0d4265a3077b7a471fc866e4851d497903f009e070d826bf6a7996d"): true, - common.HexToHash("0x07d53054b9e9f587157a8dcafc4db866c6d9b61b18ba786c14376f892b5f5eb5"): true, - common.HexToHash("0xdd07ef40542d321b87ff59e62cbbd2607bdda53a7d7f477c3e226c42b9c6bcdb"): true, - common.HexToHash("0xcc2285f464e4e9a116c9af370286d55ba9a89699ca33637a442287512fdcfd66"): true, - common.HexToHash("0x9e8bb157664b9a6152a74b632296651bdf03d50048a97656c2b1f514dc54229f"): true, - common.HexToHash("0x8d215bfa85f6aaf56412421c39b87cc45819b7ac19bbccb15ba07aa7a0b79805"): true, - common.HexToHash("0x06b07d10a64094d3c81344d11bc9a2aff25a65d865c150022d632d0dea54ff5b"): true, - common.HexToHash("0x29fd9aeb7251b27f21eb40f84271a4cbb8579ba79434d19e3c41d37ca9f8d0fb"): true, - common.HexToHash("0x641a5de3fec03ae57f6013de9f874a7ca95457f057d95121eff82abda5916af7"): true, - common.HexToHash("0x5ca4a219577aad1d3e5c0f523ce4c459f66ac71568158bec8fa3c9bcf0d73e3e"): true, - common.HexToHash("0x6fb7f1bc99e40ee5df6c066635f5fbadc8c8942b7c9e8759d1cf1fedd99c0beb"): true, - common.HexToHash("0x25a95992b2a1162785292c3b2348e4fc040b5d7ae2c5b047af9a744a245f8607"): true, - common.HexToHash("0x8ea66b6aed3940ebef0b563adee4918e32850bfde879efbbdba50fc93d41f9c2"): true, - common.HexToHash("0x35f5ae62e3b5a2a0c89a221e3115bf916071b66b56624fa7d2a27f1740f703f9"): true, - common.HexToHash("0x2b63639d12999b0012ddb24aa8ed3f00884a2c9012f1f31fe00d44237e229a82"): true, - common.HexToHash("0xa552767fde50e15a240e0236cf887de7387f88e7712ea60efa2dad877517474c"): true, - common.HexToHash("0xc95eb005865f5f945084058c5546c0edf43e702b1103e45849686ac6a2d3398e"): true, - common.HexToHash("0xbf7eed0ee3f3eb57592ded3a43e244409def23c2b32bf71ce065c5d99c0506c3"): true, - common.HexToHash("0xe774c25d1c035cb208ec1ec7830b7347c4771d9236dd8cc57f7b5948e0f0d7ae"): true, - common.HexToHash("0x0f0689536f27ddab1aaff99dba0d898a4bedc8f51bb2d2958248ccc93b61f0df"): true, - common.HexToHash("0x89be1a669ba1a14d3c55eb0cc78f24a9af51ff5e689771696a314f997fcf620c"): true, - common.HexToHash("0x7ea9d805f2a8d7fac9eb944aa2e2239b4ead138c7d95812000f75f6357a82745"): true, - common.HexToHash("0x03d3302e1a4ea691942f1898b12624242159985082354f8e0c98e96d7dfe5ce6"): true, - common.HexToHash("0x5cf80ca90c62b08a90d972693633133110999706a9e4c7a94084ded33fbc6f22"): true, - common.HexToHash("0xa5ccbc97d7364965d2df89a66d6fbc8e1f960803c9473ef8c16d8a0e9e4a390f"): true, - common.HexToHash("0x1ae14a098195f1fc83016a6a60c418709e2a85a0b23a47a502bf77542ab808bf"): true, - common.HexToHash("0xd3b4ec989d68102f37f4c371688c70618f38abbe6e5685b9ecb8f63523f4bd9e"): true, - common.HexToHash("0xc8022129381f8c27e6da1bd0cda2f059dde503b90e18dbde5dbbe0053d99d801"): true, - common.HexToHash("0x566cd51da9fcf71c7bf035ed8b64aed58354a081aa3e8ce544e29e7dc97496c7"): true, - common.HexToHash("0x54c242b87a1fcb5579b0587932759c9037e3b765a6b914373fae6a7c1a7c37cc"): true, - common.HexToHash("0x5153fab51026be1cb7ef55bc7cbe8b9a937456d2b9885fb57e0e725626a6fa52"): true, - common.HexToHash("0x4e5a95eee082291ee824a6067893bc2bd7b90adbb758eb31674c1602c259d568"): true, - common.HexToHash("0xa1cab11fd38488b94b567abc5255b52c447317badd4bb9f752c726a7a65b73e9"): true, - common.HexToHash("0x71ec0844ac48c26d8f6255b0900bae97f3f2c810c70b4eec8ba46db39513a9c2"): true, - common.HexToHash("0x420ed4d807f395652e30473c965089817a84876a54d9eed2c85190862f1f60f0"): true, - common.HexToHash("0x8c099d9fecf63b980f252da271988ed8ac6a75efc244e694543e98173f08e6ce"): true, - common.HexToHash("0x7c6820afb1bf35d4c67572c1b83c9f14a205eedbabd483623a36fd86cd0d6100"): true, - common.HexToHash("0x04a7f14f8fecd66ee97f1b8a1311bc1c79a8a635a5b3d8a02a057d0fbea8728a"): true, - common.HexToHash("0xf820ea58d8cf5ecefe4dc371d6a559278f782d9b235f2e235954bb806272d9a0"): true, - common.HexToHash("0xd452f178c9c96923b0a5cdfc92108a0f14b7a3b079554ef8632177ff49115279"): true, - common.HexToHash("0x6e9a82b0901ce7566ec394579681166b1eee5d0f12fd85067106d3db288f303f"): true, - common.HexToHash("0x5eb4b56a7542d1e672b755be4099dc84eaf5bc8756c12057b08efd7706a5d7b3"): true, - common.HexToHash("0xd67a118955a1739285ba5c223ca295c5e13683a9b5551d5ee2a8637b2ee7a320"): true, - common.HexToHash("0x8d42643a107be64f7dddc3a893c643356926a1fa524ff7f1890412390ba5473f"): true, - common.HexToHash("0x6ba33dd115d1bb32283a505cb371e55a6bdde67d50eb19dfad7d3323b5750d84"): true, - common.HexToHash("0x2b89b2e3f9e71822f0de0e7b89e25fb838d352154a45e173cfd3b637664f3be1"): true, - common.HexToHash("0x59443b10af668949c0f156f081034b15cc3a0b83bb740f2830f1e8ca9df44a77"): true, - common.HexToHash("0x9a57e6a6fceab6e9eac85302536d1fd1cd79a0a2aae0e54337358090c1d08a20"): true, - common.HexToHash("0x9d9ee9aa0e8d2a9227cb531e564c626d2ad71315a2bd2d2ee420568490487bc3"): true, - common.HexToHash("0xd9995cffc9d1951a184e847322e47d11aebc141764232f6193d1d01702f3bf3b"): true, - common.HexToHash("0xcb409c327dc2b70ee7622e10c83177fd2fff2db8b8e6225d6b54f09cbb61264c"): true, - common.HexToHash("0xa247ffc39ec2e220a9d4a5a9074a91399ecc495e0f03e9f33e670e7623f153bf"): true, - common.HexToHash("0xc6dd3a017daa99e73126e75724c9bfdd1eda74a339115d20e0a9da94e9b6cd77"): true, - common.HexToHash("0xcb63c599adcfdc4554df78e497630906a41c50fd4d7cf3c444097ad51528db19"): true, - common.HexToHash("0x630b8191fec921d1a987b90c6739bab8359f8b1a337a30eb449dd696cfcd9c4e"): true, - common.HexToHash("0xd9fca3053d7e34a36b0da1c43bed371b0c6c33794d41f9414001a3cbe9165f63"): true, - common.HexToHash("0x19d0c5d1cc4fc18393db901873db99224789f13c5c6be4bcb1e3fe60102a6ef6"): true, - common.HexToHash("0xaaf9ae5a19b4752aecea568ae15e52e8672fd3232df469b0efe6ae3517dc1a9c"): true, - common.HexToHash("0x964ff1df43da6aa79e2a6499ee25d225e865f2123deb506eea43d57e373ec516"): true, - common.HexToHash("0x499600f6206d5e95f4518a59afe979d02f51fa0654f15648416d918066e6ea9e"): true, - common.HexToHash("0x3ef2659b39c593405c9d3f5046b218a05041b47fc3b6ca2090d0b57c178eb525"): true, - common.HexToHash("0xb038ce5e94c3f34542fb22d453b0243f15676f083e4b76d8ab7899c7cf9d3357"): true, - common.HexToHash("0xda13d26ad42d78330a43a9db5726e4720f61f6779948a186303630d73d543d7f"): true, - common.HexToHash("0x4b38d655ab423fe573b8337c53f875a438c1f14b236c3c33be1b2d88e1da024d"): true, - common.HexToHash("0x5b1ab9dfe2d25adda06d96e2ad6f9bee13a615a2b7007224cb6539ce889fc29e"): true, - common.HexToHash("0x007d3d07bfe5be13c863863400ab48f4eb318cbdc4242b718e9fc6962f729ad9"): true, - common.HexToHash("0x3f4254c4d14e41ba6921c020d48e50b40f1348767940851dfb5bdf40cb83b4a1"): true, - common.HexToHash("0xd02acf02d5e1c66d77022b10c9d594c12501ec213b1f58a03ceb14e1fe16d750"): true, - common.HexToHash("0x1ab63acc37ecd316a63435a4aaa7856b80c5b2769e09b6a8816b9d32aafd5f35"): true, - common.HexToHash("0xe4c2fdaf14dc0d1d433d93bb22698258c87d0c08d5861e79d438ddb59490af2d"): true, - common.HexToHash("0x06ce26923f69d8a6ee7a61683cc65ac14dc191f7dd90eb025739d0d9f4840c82"): true, - common.HexToHash("0x480d45d9d0cb6faff60d9cabd2e5ec71f81336321fd12513faa3347e5a72ae55"): true, - common.HexToHash("0xad4aa79f1b6e8349548bf6bbc93504ad2cb07cd885f95cf2a2fa5f423f9a30b5"): true, - common.HexToHash("0x5731f237f67ba994e10a4063fd5af92f0b1ed6cde096d2ffc3965f253a52ea13"): true, - common.HexToHash("0x55078a838ad72e44bf3d9af9ee6a85c5086322ec66042b443acec4e13ef94885"): true, - common.HexToHash("0x0a8cc29f9ac624e1e5196f66e47db3878d2e5dc96b06973d77ea11c55af0a830"): true, - common.HexToHash("0xd3cebb129a67e4d88c892b06bbb1b8150ae9e6333018242e17c52c6a6654596e"): true, - common.HexToHash("0x1d4232a2e3db0c3148bb8a64c2cfebe5c5c380ce9f83a80401a46afaae7c26bf"): true, - common.HexToHash("0x127f8fe1e8d9cb277bbe6026387d6246443811bf9342cbf2bbe07780b21a7442"): true, - common.HexToHash("0x093ea8fac664830c981604c38815456a053a5f38fbaa1eed399564e0b08ca91b"): true, - common.HexToHash("0xf51248daae118fe87ad035fce9ea75ad19559b4d83ff97940db1d88d5411b3fc"): true, - common.HexToHash("0xc014df97da60497073fb0835133af2413795d055423321072ae6ac190cc0a15e"): true, - common.HexToHash("0xf400f540ba901a71e427da324907b076167df7b8000afd5dd7ba94d948ac1947"): true, - common.HexToHash("0x9e3d9eb8b9b81faa7e638c791370af6b18e8fdfdb8e8ea57624f0c2297b7172d"): true, - common.HexToHash("0xc9d7bcd8094496aff4b1591ca2b0140f92e98ee48fd6b5d5fd0bf81865eb38a6"): true, - common.HexToHash("0xfd452ac3f82d595351a99e36ee5056b0e44b51c8819e0fc8d5dce7288c36b35c"): true, - common.HexToHash("0xd90851f0242ada81dc03f55421d828ba47fd0969e10b962857e19f0c8a9f4c37"): true, - common.HexToHash("0x0ad729832f336dde6d94e920850bf9342162d60e618cff800dc8ce2b81a42c0a"): true, - common.HexToHash("0xf4c5123585de956ef151775531d0b019f5deafc3c16f09db297e4c35ded17db0"): true, - common.HexToHash("0xfc736e84f02dfae27ee6b101cbb65cd2161e77d7fd33ca71f11f97a40aeb6863"): true, - common.HexToHash("0x13d05500d47b71d8f75de3e9542f9b3e5dcc50ea31c6c687d553611efcb8048a"): true, - common.HexToHash("0xd8c0df694cb077ee526e112411d39391cabf92917805e365d1c109d5627752b2"): true, - common.HexToHash("0x98dd149a3b1bb40b1b45c32b6cbdc078541bb92c2557c3485098c35668ac66c3"): true, - common.HexToHash("0x283ab9dff58e8b2b446bcb99ea6c2ea2de822cd2e1dee9d5b40ec9533a22981a"): true, - common.HexToHash("0x04fe8bed3f2b499188d89789b35627cc1a6c51f3692c94c604a19d6694f009c9"): true, - common.HexToHash("0x00971d452dbb8d14c4e931cbdfe9023778456ca936ddc948e62c17a434d58612"): true, - common.HexToHash("0xc890304b70fdfc8bad1581933952b56a98de0bd913447d2c84424d8546e63036"): true, - common.HexToHash("0xcc5d3d5b0798b62ba3f70d223baecf357ce4d0b848f8b95ccd24513abc705ba0"): true, - common.HexToHash("0xf8ad2fb11859a442933976b68c3f5969a3a0300dd63f0be17dad2f48044a95c8"): true, - common.HexToHash("0x6c679f2734e74bc6ca5d2f1916a7300b367e46b7bba5729400eace0dafbeb358"): true, - common.HexToHash("0xfbb3a7b282be832d401aa354a8e1a0be1764a234fa731d77eb1cdd6a24a36ee5"): true, - common.HexToHash("0x7c9bad7a860e783c4af9ade9ee9358aad62f7dfafa5a5cd64018a132821c6e6a"): true, - common.HexToHash("0xed53905e5b27402666a9346be4fb5998ee4a8005e64edba987a6934f1939041b"): true, - common.HexToHash("0x985706d1a2be4ec97b953024a1d2d2d62747d3421795a9f69fd7f356ebbf318b"): true, - common.HexToHash("0xf2d313bf1369e8b36e733fbc0d83f097fad19b1ea70ec672c2adc0a6382e005a"): true, - common.HexToHash("0x1b6b59ca80bd3ea2d7024dbfa1e90e0890090a32e55cbb23fca252c113f8055f"): true, - common.HexToHash("0x8e2d939195118bc5f91dd1492b3a02aacc0d5590dddd29a1b7359e358a87546e"): true, - common.HexToHash("0x85c714644ffe7d908081b09c514e60fb8492e866c2cc7438a95e9feb3738bbd5"): true, - common.HexToHash("0xa1fedd246fd07f827ab3f500e33e72086257a59e34ba4bb8b38800923c182cd8"): true, - common.HexToHash("0x17399da0505b6f5589fea888e8b0df6a69004a9e62c10faa110d01335a5e067a"): true, - common.HexToHash("0xeafcc783002ca4ecbeb3bbd57d9933038fd262fdbb0aa3f45c344bae6155919b"): true, - common.HexToHash("0xf3c3d8562cb790676cbc19e929713b44099d35acdb034aee7f16edbc2d96feaf"): true, - common.HexToHash("0x7a2821f2faec9b4c110f591e7d9e6c1910f5445e22a3c1300d5f48531ecaf97d"): true, - common.HexToHash("0xa08c27a81b33b2bba69930ab1af32de1909e66f1b632616821d0861cb2056a56"): true, - common.HexToHash("0x5f9c5c94a486e2e35e20ede3e3f80ddeb905fadf98f5e5cc937097d7db7c7c4d"): true, - common.HexToHash("0xb4b172bb9b45373edbd6ac63209d2ac0f44e517814955e65f2d48bbce6392081"): true, - common.HexToHash("0x9702e9161e586940ad83306d3c81614088c83dc84aa2514a2433dca37d309c2e"): true, - common.HexToHash("0xc9b4576f1abdf46293382838f6cb5f95fc8b7c2aa7f4bd17b5ba619a5783f776"): true, - common.HexToHash("0x2cc73585108283d07707948d5947679a7d4119679b994b69f2a01aa67893302f"): true, - common.HexToHash("0xc504edda2bd71df7d603443c69bba00722fb90ea868815102c151ceb295c3640"): true, - common.HexToHash("0x8bbd448ddb2a4640119aacf1035bec4f7f4007e3d5a130cafef3c307252988c7"): true, - common.HexToHash("0x275046f1270461177fd2d9735ff4faafca1b568c84ab86535eca099ae976931b"): true, - common.HexToHash("0x4d0ade7b4e2afc7edec1fead492b951b136efe51a81a54a63a1bd5958000fa90"): true, - common.HexToHash("0xa9b0b73562bcc8f7f947e1aac5083157d9a7dd7fc425ec8fbc2f0d9dfbf60862"): true, - common.HexToHash("0x6b5db95cc840e68213f4616fe8d69097cf4e107f5595c53f33f5719b6d8cc569"): true, - common.HexToHash("0x039450ffd5892dd1961e138845615ec8a7dc1d55afa6ac362280a8d611f0624f"): true, - common.HexToHash("0xdd33af4e6fe42d134e2608322131a78efa77e2dc5d7d4a62f73f1b70cc4412dd"): true, - common.HexToHash("0x27228f8d011e63cc1db3520c0f33a83f3b00a9a9d181841087a7beb53311c010"): true, - common.HexToHash("0x1578237eae41ff500e7ee8c0f668591f9360daddc81aa50dbea8df8f3cb11f0b"): true, - common.HexToHash("0xef7cd93c5386949910539154db1cce00d5ec07d82d40c6b59bd5c24a9b962c8a"): true, - common.HexToHash("0x04699d2a1c10b0911ed5da34e29c758c16a51dac7dd16ac8b1aa02f3b99b37f3"): true, - common.HexToHash("0x28a95e5aeaf34fa9214b9e03c9c4a90a8676cf280d84ece9b6be997753d172ed"): true, - common.HexToHash("0xe284e6ac71803cb79a3d37b612d74f36226a7c54d3a6e6f69306aa3eb963eb6a"): true, - common.HexToHash("0xc7af1ab831695b65a9adee1fa7507306f8a97618c3299e4a2529dd3e1e7bdce8"): true, - common.HexToHash("0xb102e34cbcad74a1856c7547d148c0af606d56cf7ed6eae9ea3c69ec723af465"): true, - common.HexToHash("0x04986745953dd3bc3cc5018e528d59152dc629e659ea7266665e47c56e2aa1ef"): true, - common.HexToHash("0x1ad47156c130cb457e09c05d695c11e916ef2596f9b82c510e52d55ee4479c58"): true, - common.HexToHash("0x45d89dfd4163a3eaafaae1300af66d9e812624a5bf77482cfd18e98744100719"): true, - common.HexToHash("0x1eb73ccb8829d460e4bf09924a7e6771477dc33d5cbb30a7cb3c5296f6e0e456"): true, - common.HexToHash("0x6727b8e162ece465ab5b83be9d29b6a281680dab5d2e4b6f63934a5c65e06a1f"): true, - common.HexToHash("0x235961b2929b344a14ffb89f4a3762cb7d4550fb53a82640f4fc4ff767c73b16"): true, - common.HexToHash("0xd6de63ef54c464f97838b00345890567b37bebc31cf913a222f3e4c449a5bd5b"): true, - common.HexToHash("0xd47c5180e489ab2bc6de6bc28504f0c55d469c25483c77396bb7f083401dd258"): true, - common.HexToHash("0x37b4eb32ef7a80ee88562e0277963a83832cd3cc04cdb99a0f86a175caa977a7"): true, - common.HexToHash("0xda442585290941fdb96aeb651ad1ceca9eeae5d0b0006e59d4aa800176f59e54"): true, - common.HexToHash("0x77c7caa71b1a209203667c06fd0280011deea0cb130bac750caac5fc09cfe040"): true, - common.HexToHash("0x8527776af3a16d6a9e428102dc396c32f6985863ea81c4b274fcb3743cd680aa"): true, - common.HexToHash("0xdd63054d87619d577b87f54f84080daa101a46e913e01124f4658aa0ad2ee54c"): true, - common.HexToHash("0xfd6c21718a968f0028e43bbd64b8a13b41bde762ad95174d859ad7a7fdfa5aef"): true, - common.HexToHash("0x09e9affa4d722225507b4034055d4aff881cb28875d9b8b9375ff00cd5c50201"): true, - common.HexToHash("0x0c9040f230e4d5e7bdfc0deeda0ddbae66a8c4ed5297bcb9c7689afabcdc419a"): true, - common.HexToHash("0xbf502cbe29ef5843d84bf47713eb07f0be21e39e9a3c75402666a7ccab5c7e43"): true, - common.HexToHash("0xc7a5c038229ec5b784b3974999069b67ade4eaa46e904a50021a9bcc5063f4db"): true, - common.HexToHash("0xf15180eb66c584a4821f1a92c1628123b04c31753ce49c2b1952a3b1672fdb75"): true, - common.HexToHash("0xecb191cb77a8850464962e50f9f1bd68f1d88df89164ee90887957049d718c06"): true, - common.HexToHash("0xa216d803077476f27226036164b4d166102920d07ec5d51a7f9b22627b311644"): true, - common.HexToHash("0xc38fbb8a520f6a3c13c78573c2694053909ca210783da5af86dc7923e09c9bd4"): true, - common.HexToHash("0x941a67410404b38fdcdc708f7d73265babdc633ef7d53cbfa3ed25531b471cf2"): true, - common.HexToHash("0xeb206c4548801ca806c6d52ac25774d6a8722bae9f04ec5ef8d6136f727c50a0"): true, - common.HexToHash("0xc371441eb283afc2032370d5ac97eaa082e845f6fc7ab1378381406ae6b01204"): true, - common.HexToHash("0xa056edf067dc450fe8ba1534eb96d441455a7d10a0235baf0d89b552b1b34995"): true, - common.HexToHash("0xa3ac20c93192058cdcc6925d0824f336e3e05f7431bbd5c4e1c738f853df6fff"): true, - common.HexToHash("0xf8ad1790d3b6f2ea145b423459a8b3e6c8fce85c2d97d22050eebb3f4222303f"): true, - common.HexToHash("0x273cee12d01f5a82bf7067c89693bce08ed21c8d6aeede240fcf5299d432f8fe"): true, - common.HexToHash("0x6287d02b6ddbed47d44bccfc61705cef3eccc3f3556908cc79e2df1cd2d86363"): true, - common.HexToHash("0x75428c44acc15fd58b251fdce4c122908069ac705662ee62d48865bd52922752"): true, - common.HexToHash("0x1d6b013091aebd7d8c00079033abc7c46f12ac2ecd7f9c41dd07c33d25b493e0"): true, - common.HexToHash("0x2e65ec627c3c68b68bf29ec88a91f487a473de991d1e467848ae428cf15a2939"): true, - common.HexToHash("0xa8990d542ed3685b24e2fcb03c20326ab3bcba670676d815b57dcbea52bfb89a"): true, - common.HexToHash("0x054d913c95c4d6ead035f051d5da7087cfadf5225e299e37c00145b802960b94"): true, - common.HexToHash("0x9849c36d310ecd2a052c5a93045efe66b904ec8495bddb80fbac525f2fcb84c0"): true, - common.HexToHash("0x6cdffcc64d5d155572934e35ec6b5790e168e42a40f0f8eb1df276a97c111126"): true, - common.HexToHash("0xfc64673d861d32a5b45ed98e1b15cf675e888294b0641567074a6fc63afaa27f"): true, - common.HexToHash("0x45e13e2b303ce7e5b77557c6250847921be3b1939d1b7310273940c8176045ac"): true, - common.HexToHash("0xa28a3219fba0404c367726018d5aaf9ace5ae86ee05a4fe2c2fa4b522690264b"): true, - common.HexToHash("0x7f4ec996eeffe6bbdd801dd58958f34e4336eb62a62ec78a10f43003c69a38e9"): true, - common.HexToHash("0x7d95b9dbd43ec60746a93906c9399c9e172f94af63722532070a69f80a234818"): true, - common.HexToHash("0xa91ec9a28d858b891c4c51340bc6eb1466bd816640b7879be1a24d0b77491b5b"): true, - common.HexToHash("0xefae1c774974a9715bde56ede4ad6a581f6b7eb14cab6720f855775fc853242d"): true, - common.HexToHash("0x8732c07b20adfa06864bb83f0e5971ceb4826d1d731fddcb884699f38bcc6278"): true, - common.HexToHash("0x2122254e2c6e7194b9aaea9567c9824db8cfb095d59941e7567979827c4289a2"): true, - common.HexToHash("0x84f3e7d56f664252326562fe39f9852ea1d39984c2ab9fbffeda54ee313a72b7"): true, - common.HexToHash("0x3dcac6c5305eca3ded6f84916e66f266ab253b7bfe7898fd6c79462bd3f18b5c"): true, - common.HexToHash("0x9fb65ea2696a18113e0cbaf5059da53e3b28743088e603f573db28815854474b"): true, - common.HexToHash("0x8a55ec641f945378d7660b53a09cc452c5ef9d0979060d3e1dc1a923074a803d"): true, - common.HexToHash("0xbbb7711c530d5b7b6d058a65f52b97968c7b8d2830a508526bb78fbdb3ef250f"): true, - common.HexToHash("0x7e6a24ea8f86041f75df58f00b3097a9c77abbdb6fda6ad794453ace3206075d"): true, - common.HexToHash("0xa261e637d4942fc340317f905a218f6fdaf71943e3008ea1adf41923d12f6c82"): true, - common.HexToHash("0x1789c888d9e7004133aeb0d7ea71213adfb78ebf34b6a01a9b147c99db81ab68"): true, - common.HexToHash("0x114f0d49b18104070e0f8e4b257198cde7fecb550074f33a0c222f3894b485d4"): true, - common.HexToHash("0xc7133df2199acf713d35babc815d55ac09b57f893af9163bace2289abde1a88f"): true, - common.HexToHash("0x627ea04fa1370310f3ba5abae9fdf2c8cada8d78443e153884fe67b8ae65cce5"): true, - common.HexToHash("0xb936804aeb03f1f856899a53ac2ed6ac8e2877b2a824ea38462114d6b89e311a"): true, - common.HexToHash("0xa7e08c0d3c3da17731ed4905eb5579648e3ba81f2ce36c5b2ef3b8ec3019c4f9"): true, - common.HexToHash("0xd665be9cb92d007d0ae7db0f218b138106899a5553193b4e07d64a0f3abb7655"): true, - common.HexToHash("0xa6bff052280bdc3ba6979bd071397852e58195ae6bf543eb6552cabea44b94db"): true, - common.HexToHash("0xfd2afa13d495351c1ce013827bfb96dd55498fef683477dc0be7c285f28fc509"): true, - common.HexToHash("0x5d0da4a21ec4d7519c33833b6f5ab0128b929bb767f82a3585bae0f27437ad65"): true, - common.HexToHash("0x65307729d30513f64ca69e1b7b0217bc584eee7186064a03b975ba4065944afb"): true, - common.HexToHash("0x4c64e6a9d2fa09b55af711d6834198463c701ecc4cb6deb993c5f76a34e1ce1f"): true, - common.HexToHash("0x5eb6ca251c79981d9f40779401a4f11105a02af589327e2dddecf4b044f426f5"): true, - common.HexToHash("0xbd317fb51afdaf351077c0aec39f2c5081bcb99f9addc38fa3ee048b625f57b8"): true, - common.HexToHash("0xbef2d8d0727560e96e2fb2dd32f829631c3d84cac2d11894d653f1d57a412d4f"): true, - common.HexToHash("0x5a9900e2cca6b5ccff1f590f94f6454ab44c694ccb29d05c5a2431c7e0bc1206"): true, - common.HexToHash("0x020571d505263926c3e6e5b1f558632be2e9c5d8ce1ec7d8e03e0fbbb01730dc"): true, - common.HexToHash("0x380f1869e240fcaf3a061f7c0e06bed2019cc26d4a73c0e1336c4ab96f96e66d"): true, - common.HexToHash("0x7e0d8bfa50defd380a21395cd61c75f2ca552ac32d6ab800b46dab3602fed271"): true, - common.HexToHash("0x680110a2169c94cdfe25850bae35242b98986d0a0c81af33c4bf69e6eb29081a"): true, - common.HexToHash("0x2d958d255d1a659afff16be15de4cd0b5a0fb10ad8cdc6d83ed8216644cd3482"): true, - common.HexToHash("0xea9d6425ecb68b568039c5479607a830a2e11e2ddd8811842360e40e3d20696d"): true, - common.HexToHash("0x3be402be1c48d9bcd4d1abcc1691750c8e01536723046cdfc397fcd176580945"): true, - common.HexToHash("0x4c5630caf449ca69bf7ee57b8274b2d448b4ee61a47df734feff8a96e55d044b"): true, - common.HexToHash("0x1ce7496a022421ba6e3883514d94d19788ca81b80b4241197154d21271cb14a8"): true, - common.HexToHash("0x279c96420319b26c614394b4859a2f7deb7131404d2d1f5c329becb2aa36a823"): true, - common.HexToHash("0xbc1a6236aa5185af5b73fd21cba892e2024e9290d2ef06a8613acb0d92074957"): true, - common.HexToHash("0x201a8dbc682379d983faaf076f0b2cf317b00ce17c7ba9b6378193794cee302c"): true, - common.HexToHash("0x110f83d8ac7a8d3875c8ba41bf96b3eb17e7c60a13c9dc51d5864fb291b6cb77"): true, - common.HexToHash("0x43813052094a5c4a52a3a6f41d1f43015902f69a0f11394ab957f13b6d3e08bc"): true, - common.HexToHash("0x652dbe1d6ab3c697e1f2edaeed712f876e3ce05f2cb3a86c00d8e3b16ceddb83"): true, - common.HexToHash("0x491800940b738759d3e795e904e3c4a59dc249f0995a32aba223b62a9c5c2afe"): true, - common.HexToHash("0x91e2a05f05eab3b0712e625d939bdba7d8ed30cbd5e4cb9694160a3d292ad3a4"): true, - common.HexToHash("0x0de77c7c461ec501e7b32afd0a20e712aa5768a36f2c99d4bfe506ae8533fe0f"): true, - common.HexToHash("0xdea652c7b012b8323bee57428219212dcfddae06ccd876ca2498a52bcf88d3af"): true, - common.HexToHash("0xe53472880f292a5abf29ccc4c533c24cb76de2345ed59a9b74f58d68f1305116"): true, - common.HexToHash("0xf8afe90e594ed89c27fe60f679965fe5d46a437815976242024b18f28691b9b6"): true, - common.HexToHash("0x818fb102ef7939a6180eccd8f30a13b92f9c3a9f83e160ad27b37c0265b2e1c4"): true, - common.HexToHash("0x42fcac662be53986c2c9de80470320647ef240728fea10f9d2d303329984ee31"): true, - common.HexToHash("0x0d202b48bfa6ad05fb34e9a7306e3b116cbcc1131c72b180970632105e6237d8"): true, - common.HexToHash("0x35083ad01dbcc26f0f56f77f86e32e765b64469920c7bb34a762bc0c6ca30378"): true, - common.HexToHash("0xa8063a15389739b46a0cbbbb4e6a24da958531f9bb5bce2a4ef7715a2299ec3f"): true, - common.HexToHash("0x6f6221efba74d8e4dd579047e511c8aa54850ce4a8be3c2042fc7651e7090a38"): true, - common.HexToHash("0xd5d8392ae3585ed892b795256fd4db58d5e767fa82f5532cb01bd8ebf9e61f8e"): true, - common.HexToHash("0x3a77aa5dff8c50fe75b3bb9b31224ccda807adb50545c7501c003b5c1c814f56"): true, - common.HexToHash("0x111934676135b980398aed222c6c775ff6f33e8f6999e6637449be8c191983f9"): true, - common.HexToHash("0x2d320b3fe8054f82ed1987093691c25644411b7be20e8ec4fc75f3a971787f9d"): true, - common.HexToHash("0x90cc2a247fb8a7b08533993a5e37f0f77505c14c5bf66e6b18b35e6d4b583cbd"): true, - common.HexToHash("0x9537a4db186846d63fb90555a02225becee5cdb0734c38ca6a84e4266d2f01b6"): true, - common.HexToHash("0x145eb91f9ac0e3449807e30f75dc43be16f833185b09876e36b734c7c3efd24d"): true, - common.HexToHash("0x2abedeefb0bc95d602343304e4fd30300fe3564222c8a889850791c6fe5ec2c2"): true, - common.HexToHash("0x297a6d7532aa17f0df5ce159185ab9a78309ee1f560fc556e042aaee7fcbe61c"): true, - common.HexToHash("0x210017a258793a6feddc0a487dfb526d7ec9fb6fa2d3f07d48f008a9ab29c0ae"): true, - common.HexToHash("0xd65f7753cc94712b7180322298150a30b7e7f671884e0c1f9ca5553987ece3d5"): true, - common.HexToHash("0xc02d5f8f48a8ae3103deff3c31f4e0d723decbc758ff0a07b354c175e39fa760"): true, - common.HexToHash("0x8a0d1d977ade35ff8dde2899f07b3e27d1cb0a450772feaf7ae1321caed94587"): true, - common.HexToHash("0x0e7b8ab2073b1fd3b0369b127297a38d4e544fb0913f4a423ef772551936aa87"): true, - common.HexToHash("0xd9e5bce3748d58b362e513c401d2f89710453999330a6a5fc42f2859a9923fb2"): true, - common.HexToHash("0x024c049023db527c5192477f99a47f9bdb2119fd937ca318a1169f07f3d52b8b"): true, - common.HexToHash("0x5b4a6b1a5bbc5cb5b8477bc714f1d66dbf038e5af2ef047115a54f748b2372fd"): true, - common.HexToHash("0x15527ed81cc6f9c18c81b5b2d0d9256a169d5abca7744bdd0d3a15aba69be881"): true, - common.HexToHash("0xdc11cce64a780a5e0f222b3adc7db71ae096d4ad71cb2f5ce5d383e7361b61a4"): true, - common.HexToHash("0x3de948a02fb3a65475b9824885ecac7f1a96e9f0de03991e3784798ed26bdc6d"): true, - common.HexToHash("0x7134cb5df3c033fd1b7b87a78dd6265b5aee9bfad39fc54b149581c1d4b7cfc1"): true, - common.HexToHash("0xd449a8671f5bc91cfc4cf3598a2a1560ce35ae783cc7add60221538dcb9a239f"): true, - common.HexToHash("0xaa0075e6bbc1cffa66ca4bb8f6361800cb753b11fa844d867acd0aee86e7de1e"): true, - common.HexToHash("0x0db802e86f19039266671730ada68a47736ca944ed97a60c60e82cf5ae8f2f77"): true, - common.HexToHash("0x119d9bd897c1edc6aedb3dd2d2244d482a9ffdb3f3e002e72e218ac752961a13"): true, - common.HexToHash("0x2239962d36a1cf135b6e23de2cae3fbd0af40b24c70a22c656ff17690fa5fd0b"): true, - common.HexToHash("0x7175f9f04f825f3c4ea028d4959cbdfb782e54b1f0bc73a74370d8c6b580cdfa"): true, - common.HexToHash("0xca8720f000c9fd1a7bbbd450828d5de8b7aff06b38c55ad6f89f664f88bba4b3"): true, - common.HexToHash("0xa80bb90425daaf0705d31fb98c46aa2d7ae58438f26cc1dfb6b58d4ceb2c1ac8"): true, - common.HexToHash("0xf007028e0ca438b655f949386363c589d583c9ad64e11c7677a3828ec02cbf33"): true, - common.HexToHash("0xf39e89f57250b31df0b9b8693e11ebbfb5fddaa20f657460f1686b073cebc221"): true, - common.HexToHash("0xbbe146cb980b3f6f180eede08a7a2046e890c4298ce1a6d1e9f4c4f04c29f640"): true, - common.HexToHash("0x678e39432a5a5c9fc39a2342f3c56ecabb7625d93916af781092448b1b37ba62"): true, - common.HexToHash("0xf8abffb9ac9e55f4802c90fc94313f691df6dc29974da3d13e36d448a0229c11"): true, - common.HexToHash("0xd6c6033de50bf4a40beb6d714c9f51bcb74ff505384f16a32f45153c8c013275"): true, - common.HexToHash("0x6c25397337922ca1982df39fb1edd8f568dcb081e3ebaef6e70e8d89b1c63c4e"): true, - common.HexToHash("0xaeaeafffb0eda48c9f14ff508f766ba73dbcb800bcabafef10058e4539b54d63"): true, - common.HexToHash("0xff05dff5ca845bb0fcab663cf1155f25eff04f590a5e0bca4d2a3a5e9facb10e"): true, - common.HexToHash("0xe064a44229a696c24beff253892a033d125bb0f7904b19f28bf840e29788659a"): true, - common.HexToHash("0x26ac8fd3efe6007d68db9e960551b82e1bb36ed518969376c3dc3698be64d3bf"): true, - common.HexToHash("0x02929ce7f6f48a96667edfb1a50f0772820635cfde4d0431d6b24bb64b731e90"): true, - common.HexToHash("0x037daea47ecaae67e367cdd48fb1b1e8d9e792a9a35c998e96892b3921255196"): true, - common.HexToHash("0xefcf35833d1f17ff3d237164da6633c18281b4025d937e4747f4af8d8bf4a09e"): true, - common.HexToHash("0xc1a52af429d59991261001c6f23371de60b8d16f9b97e259b331a0b10aef05bc"): true, - common.HexToHash("0xc49a7e23b19d30ad307ab89fb546c4b4fef8eb269bc7fdb613f3289c5f4508da"): true, - common.HexToHash("0x6160b31f95f06bc929b5aef2ca1fa5cd1dddecb97ae0053c992a5c7f86f995aa"): true, - common.HexToHash("0x0f370f3c76310b681addb811f656131f8c8c2b625543b623fae6154458f2ea83"): true, - common.HexToHash("0xc865999b16260e8382dee9070001a330b83f58aad7f26c6ef9bf01ebe49f3008"): true, - common.HexToHash("0x0705721f93b95248cac0a0706ee9265269037eb8908009addd1ed1036e1e7341"): true, - common.HexToHash("0x7af8af6e4fb2a7817c729b1f47e6fbd33302166376ff6884d04cf3ec2b2c7458"): true, - common.HexToHash("0x12246eb14e56bb3d6e997f06bbf825980a837184c9327bf7828a6e3d4a7e9901"): true, - common.HexToHash("0xed0d162cddef46009d338242b39f706598cf8d8d8fcb2b1a8ea5f350bfc41a41"): true, - common.HexToHash("0x119b6422b6cf18ad16ead390c91092cf4b55559391188154f9da48858412c90a"): true, - common.HexToHash("0xfd1a92fac399b9baab9c578710c77d7fb2d27559ebd916e157495ffb8d708cad"): true, - common.HexToHash("0xa5e5ab000c031aa62145a4267ea0c2e8072f1be724824bdf77196c8b8498bdc0"): true, - common.HexToHash("0x7c710bda1c8628e3a3e5d636a3b1761b6960cedb7a1d71885177d83489fd7177"): true, - common.HexToHash("0x9eb6e0bcdb8afbe50405ecdd712e0625c58018ed88389c61f33ed1c755844d92"): true, - common.HexToHash("0x35f0753adb3f754b52fc0bb6c3b33b2f1bdbe81ec550af72759efc10964cd05f"): true, - common.HexToHash("0x38215550f5d1a96a712e33dc93a414e8ef7d4fb2238b5c19f87effa1bd9767ab"): true, - common.HexToHash("0x2bac0f207ffd42c5609d003afcc7543a6a1f85b87b410a58e1e92732c7d0c980"): true, - common.HexToHash("0x01bd10ffc40353261fe9daca5bdfe60c9b4f28b39bf2cb4da6cd6e4a26aafc55"): true, - common.HexToHash("0x1176ffa098708417dbbd8c90d381633b1beb744e510a8562a5a77d658508242e"): true, - common.HexToHash("0x660fd660df132b6c0460633b57fa7e907076189b9fe3b4ef4fbe6cae828fbc9c"): true, - common.HexToHash("0x5b7fae7ee6053809e6742ec58e0d8d4d57da1911977ed4a2f5f85ad6a6f9972c"): true, - common.HexToHash("0x40acb92e1029d3c5338fdf94b296842f5a1f09133f131784c1f4511198b6eb0b"): true, - common.HexToHash("0x9dd97b4f2ea2a4ba72409410c4d06bc1fa87e73046a4ea435a84a070a4a98832"): true, - common.HexToHash("0xef6b2c1fda47ddd511fdc446c9b6881068c961c14139186f23ce3596f767bf74"): true, - common.HexToHash("0xa9b92316737853756e2fa57733e87fbfcedfde722b37efcb82dbfe2394833b97"): true, - common.HexToHash("0x44ec05cf790f92b9451d5d3bfd310e93b699d29baa8c4f66064cdd99a8a8b6bc"): true, - common.HexToHash("0x12a3e8109d9541ae2c574a4fed06a6e35bc31a8eff56711376e564bd5853525c"): true, - common.HexToHash("0xf4ce53619371ccc6f0ca3cae52d2d866eeec2dd4cafa6fa6cf34a6d81b1f8bf2"): true, - common.HexToHash("0x8fad2a5317d1896eebdeb181350a51c068c237954f31270ef58872ac11a35b8b"): true, - common.HexToHash("0x3cb230d9bb2f8ea2c4f18055bd659a4d95d31a15b5fbaf07fb8f83d9a8279a9e"): true, - common.HexToHash("0xa8b85b00620fbb0343c0ad809d7767f36ade281522961a9ffee32027ba2b7a93"): true, - common.HexToHash("0xfd30fdce3f74c4610cb1c7ce95d0c99fb11cab0e9bf2cdcb6904fb953ecf5c5b"): true, - common.HexToHash("0xbcd5a236c1cb950ae7f848269ed8567b2f314b7ed8ae71597da6076f8e24849c"): true, - common.HexToHash("0xee623dc7e66368b203de8aed9830991899d85e279e9c900b29f1f85985adf53a"): true, - common.HexToHash("0x0958df97c472fc8c5c74f3a1dddb4dc78ee89fac6541da582d98d28010a5dc00"): true, - common.HexToHash("0x43748b37489ab457df1e2a421a01b8725a5e0aa35a342fb8ba7d74fa84684565"): true, - common.HexToHash("0x4342e841111619091b8b309254194965019e29fbcd96e3cf4bd0090b6917c1ad"): true, - common.HexToHash("0x1022ad682397fb3e1c8de5b17099319a805636db105b7af1850b19af403b1ef8"): true, - common.HexToHash("0x030c4a5465b9075aaf6f870ba64630d90027f1a76581ab4a84851cbb91480466"): true, - common.HexToHash("0xac8c44ade338309fb2e6e35a410b2fc48001d92d114d644fb8c96b9da672dc0c"): true, - common.HexToHash("0x4920aa35a371fc0cfe50bbfe953e52a621d0880bb8ed20e654e8bed561beb9d5"): true, - common.HexToHash("0x78d69d3d8b97399dce9836961371d7f8b106f4b9447167f106987a46ed433fb6"): true, - common.HexToHash("0x9f5ee432fbb14437670a5005d1bd313dfbfc502762721690f8fb70e70aab7e0f"): true, - common.HexToHash("0x6dc8ead8f8ef59ce1a1ac039a5dd9607604305f885709b33f912b38b49b24c3f"): true, - common.HexToHash("0xb341010e092f66009eed1ecf6d7e3071ea1f39b1ce02c449255df0c25cf3a8cd"): true, - common.HexToHash("0x25b3f44a23692ff09cadeeeb76473f8eed8178be17039947224453d4a6e60910"): true, - common.HexToHash("0xce76180e2922fb9bbf208bb1006f1992f3afcd38fc75ad312d2719ddda807f85"): true, - common.HexToHash("0x53b6b5cf006502f0e36e15875d8cc2aca83444ff8b949f67a0fbf2d81a3d2090"): true, - common.HexToHash("0x9c91e42dc37ae42deee3d5222061b9d14dffed8fc1d2d97567b6506123c1cadb"): true, - common.HexToHash("0x105e31d70aa4b8c13fb4524ea8e682deac16c63690adeee2d13d9428c5393099"): true, - common.HexToHash("0xacf67963dfcf6ece67fa6c4f368c4d27620b14e61c1798814faa1340fcc13097"): true, - common.HexToHash("0x90f8445cc534dd986df6be2acd3f477f244b5ddc4077b4a60676f9ee765a86ec"): true, - common.HexToHash("0x49477b428067e9c8817285d943577225a3b038b34f680b0bd457c0b85df55171"): true, - common.HexToHash("0x4e7a164212f48a84d33937769dac6013a54bb6232b061defb777e148f8a21dfd"): true, - common.HexToHash("0x47c00374d4de35f31e2fa5cc06519c4514badd05b627c33b56b7c19b4e129111"): true, - common.HexToHash("0x38f98a77e81a7de5605daf2b51ea0fcb56c01644d3c368de20e3d85cbcf64d62"): true, - common.HexToHash("0xc2eda685917767a4cf50e1271953463a79b2dacde05c9ac27c5c0f03c106b713"): true, - common.HexToHash("0x2e83b84f93ec8470f734b5fc8b78f9046c29edd0a4f491952ce6218b8181bf4c"): true, - common.HexToHash("0x6959d0f109c7f68b2097e33b06da11a88440a56a5511a16256e8e323e32cdbab"): true, - common.HexToHash("0x608d21f5213a3d5d089567750a1e171f56d632f4c49f90d302fb0f508f8bf2c5"): true, - common.HexToHash("0x7a6a2013847fe5b247ce76596024015075d73d97fd731482ae4ddffe9c22f5ac"): true, - common.HexToHash("0x0d8ddcdac4887a0ecf8cc4925db350f98394f7357af43f541d19676d36183418"): true, - common.HexToHash("0x90bc2cdaa1b85ee4432860ab87c35ddb761b19d5b5063268cefef5b5d4879acc"): true, - common.HexToHash("0x81d9ad88cab11b7cca09efaef9e2db59d0520a6178d20f1c5ba9b7a297e89a01"): true, - common.HexToHash("0x89fddd5bb736c96a3e1040a8fd0503260ac5d69736044f0c08cb4714f261af8a"): true, - common.HexToHash("0x4ffbfe6d5d9cd38d28388411b7e63141c1a1ef202fe7307af739a42c9e3d1ddb"): true, - common.HexToHash("0xe2afcc7e8cee3390e0ca15109833a43b27fffc745f60de981d7043870d9b6ffc"): true, - common.HexToHash("0xf84dc609892e6f2e18ce83dc746ef5c4c4147baf82c2bbdf82635892a770e954"): true, - common.HexToHash("0x33ef91c13a2033f02fda720938cbbb09e860496ef9e914b26bd6e25a8ba8e931"): true, - common.HexToHash("0xf81fdf154559ba3e26c1731aba6f873ff95adf219c0006e49463cdfe1c2fab73"): true, - common.HexToHash("0x0bf00fa18ac27aa529af4cd749c0e0255ebe7c2516605c25cb5e99a817a2f0b3"): true, - common.HexToHash("0xf62af6a97219a9f9ccd111c76611ed5d7e4c8296de7e211420f420e3ae23aa7d"): true, - common.HexToHash("0x024b2897ac6632b9c71253267392992d703d8c6773a6a1b3e280f0f960d402a4"): true, - common.HexToHash("0x20152219adc41ccd9e11f1edeb06234e44b7a2520e2d0aa515344ed046c833ce"): true, - common.HexToHash("0x22b19139eabf24dcd7683413cacec59633aeb22e2f4df9771f25e7de7ec881b0"): true, - common.HexToHash("0xab457fcab6982f84f19a9518f5218dfce8cc8e667992f4f3062f5faf5418785a"): true, - common.HexToHash("0x97432bc0b53e6f580c3b9e6b4b3010a54f6c356b84cbe0a6bfd011ca26d677a7"): true, - common.HexToHash("0xc6d15c5405df21b97d0ea1830dc12d773a4fa17385c65da74fbfa7186d8d94ac"): true, - common.HexToHash("0xc3ce63ebe08a8d82c2999e6cc2eb39f819e30179db12a5ca61c8abff81a9e003"): true, - common.HexToHash("0x2ca21702341977f668568ae37ae44b62736447289e727c1acb1f6615a0b9e8ed"): true, - common.HexToHash("0xc02ccf1229bb8324902f32d2da16bd46c6833b4991044385682823479bcb6a96"): true, - common.HexToHash("0xb2be390203c7ba4cd19610d662b4d87778a4cd3a219917b6701c6a73796e2c65"): true, - common.HexToHash("0x4d8272192fc599ee8503f84074458202f55aa2dbc8768c591de2bd565cd5ae8c"): true, - common.HexToHash("0x0fc14371ef865461cb6b3c1d0aa3b13e301427bff5aad67a5c59bd7faf0b6a78"): true, - common.HexToHash("0xea2153f70c94461a3c1f6cca11a9a0c1678afca52fb406aa4cef98ecdbbe44f7"): true, - common.HexToHash("0x6e1a09547e3c2380f8bc8dee9b1167b75c8f421f2c5cbe8bf8bdb7e105dfd355"): true, - common.HexToHash("0xb1a419b0233b6567f2ff3afa37297a4e8a0dfe9a51d8cfe03a94eee658bc5c6c"): true, - common.HexToHash("0x24daeebbc0edbed424a4b1d64668123b32eb1c4209457efdd6ac26e654c354dc"): true, - common.HexToHash("0x03472f44a3ef95b8af64cef9305994dd8edc6029d235b9e91c5c3c92b5714af2"): true, - common.HexToHash("0x9afb023d7c9c33c2d71560b2c942d7e5e2fa7f730d90069e3dafc6654670f363"): true, - common.HexToHash("0xcc54567c058c2bc4da311eb4e233cf7f6c480b231751c4f6e2685fd6d56807a3"): true, - common.HexToHash("0xed9723d9d9de8d79ce1ddbacc6f8aad0c32b308bc1b532d855727a790c5bd0d1"): true, - common.HexToHash("0xb60109a2e3ad8d455e5a155088ae4ded0239389015d6c97d448fb62f2d889119"): true, - common.HexToHash("0xf9a7a5a045a7bff0ce9ddbed789d7a152837d92645c8db25ccaf11c10844f5e8"): true, - common.HexToHash("0xe43947e9722aa08682eba9dcf6cf7a3c06aa771cf517febe697b8e29386ed349"): true, - common.HexToHash("0x505877e3ef2e1dba45cc9b2bfd69737b7c61bc1968b1a9e99531a605de4d1f72"): true, - common.HexToHash("0xd882ea1bede4f013c2cf8a99b07b68c1f83aa25890dea4b43b99477a35a3f4ea"): true, - common.HexToHash("0xba4d5d966e90b9fed08211b5399dc6a3a2dbf0cc498481a520afc06ff4d94d40"): true, - common.HexToHash("0xa89ab75fc1ede5c38f3de90420d3c3f6e82fea219775322eef3ee6d29699dafb"): true, - common.HexToHash("0xcd765471441a6488b07cd8c71604fccd19d511180f63aa8010805d0122530ad7"): true, - common.HexToHash("0x37fb75fe670d0d101c9458da48e891dae3875b3d8c46de50c06312e96a23e742"): true, - common.HexToHash("0xd9d8b44e517f826728e424e2d68ea6be26e1f196662dead1d2e6ab306df1ba9f"): true, - common.HexToHash("0x91ef010163061be79b939bde9c9b7509baf079549797e5c082244d70a44d7829"): true, - common.HexToHash("0x14428ea71dfa0af39327b47d822b8ff7d8f76f9057510a224df1966616217c14"): true, - common.HexToHash("0x65460e53e8f12d08ee68eed9aa340a4702ca8d87b12513248e6a46dcaae3febf"): true, - common.HexToHash("0x70bf0d7554d4540e65ea7a659eeac60b731cc0a1003fd218fed03159fd2c3478"): true, - common.HexToHash("0x27ba8e5f497b17768bd8007d90a7cc4c5f13d82fc3149253de4baf9eb7996ab7"): true, - common.HexToHash("0x3867296a08840adfcb715d6aaba049d72130615e4e2bbb3a1a606c4588475fac"): true, - common.HexToHash("0x33935d311f9dd947b3f30898f2e2dcb00311b0b0de15a62f0beda1a0b14d79d2"): true, - common.HexToHash("0x3dfd7cf52cfc7eb821afb56ceb0edda7df3043bbe2ebcbd7bd0f011e08264822"): true, - common.HexToHash("0xc5552cb93d77c2df417286e1407b0006557e93077df1f93260b3bf888d2b55c7"): true, - common.HexToHash("0x621e7ba2a4b9451d2609cec4b55fa6fcaea7e6f3a4bf63db2a8cd09ca51b571c"): true, - common.HexToHash("0x997c7c4c2cc5287b86803f719a2890fd809486f16a9e3918b3d0b3a655f3575e"): true, - common.HexToHash("0xd76c2f0e92d0fbb7558779525316d171207227944a9a7ef1dbc625444b324a97"): true, - common.HexToHash("0x283125af6148d145bd7b800b12d1d8e06b7409982e54daa1adad04e12dc382e9"): true, - common.HexToHash("0xe36a8e071379af2436415c6232bacb53bf3698b43e5787f236b3b0b51c92ff14"): true, - common.HexToHash("0x8457b7f62eab14423d3dacb3fa4a16967370a81f7f7da59e1cdfe4c910f5c561"): true, - common.HexToHash("0xf17bb10124ca91ed5f1d2975805975b4dd1d2aac21d699c578be56edb4cc0a7f"): true, - common.HexToHash("0x07ea07ce7d0b37b38ea44bc5ee1dbe95b781d433be58005ef352418a10e76b62"): true, - common.HexToHash("0x3f5ded92357b0546d409427a78508cf2df81115a486897b1c48955ad9e134c67"): true, - common.HexToHash("0x7874b452826e84f3d44d47dc85ea59f3cd88ba3dd26a6f6a89dc6cd6edd0ef81"): true, - common.HexToHash("0xf457b52e1d2d35002427fdf56acd9dd8e4e64dde1e94564caa743248e58bab39"): true, - common.HexToHash("0x75b6394d96d93cbab55b28e08d648b18a76331f47c7974588dc25fb90e9428ec"): true, - common.HexToHash("0x739ad8ff8014e6b11a3752fb94f22f8fbba10616e9da2f3bd4f0d723113e1f35"): true, - common.HexToHash("0xe179e4a906623c5b0bd19047b0eb3594ac2bcc8fcec5cc394a3b387bd95ec8a5"): true, - common.HexToHash("0x3a133278ee92f7bbc1de303ec80844161fd84e6b698d8d478be423637c4aa32a"): true, - common.HexToHash("0x958e695b943dd23ea76b51433d66acb2286accd3c45df01ddd8478d0e074118a"): true, - common.HexToHash("0x7d05716bd5d4f4280940e3bc60fad902c7173c744867c74a37bcb20151179efe"): true, - common.HexToHash("0xbb2fd3b435d5d33a68c84118da01669ef16747a76c975538a78d564d5ea22d61"): true, - common.HexToHash("0x75f1530c56cb3ffc9df159fbbbcef48e784b187c2a89615f3fbd0eff050c4b37"): true, - common.HexToHash("0xc8d53954255538d08b6494c67b74e72c889bcb98e6b2c3367f49591d330217d8"): true, - common.HexToHash("0xfd25edd8ffe9cbd89c118ad76ecf18f5f6d9247d719b66fe71ef17dab3e99f53"): true, - common.HexToHash("0x23add7997f498fbd5997f0490406dbece8920e069c8dceb3c786be8e6a919dc0"): true, - common.HexToHash("0x78a424e73097195b3c5a421bd3070534157c1ded37047fef01aab29d8fcce28b"): true, - common.HexToHash("0xb722f214fd057aba3c8fba959c43b35ecdd59df99b1c82b44e038f693ed3386c"): true, - common.HexToHash("0xaba2e5de8574882b7e563633d856ce7fb733bd530455dae02a287620da8510d2"): true, - common.HexToHash("0x5f7bc802fd4e10bad5ce1b5ffe50e573f1ee266cc0d855570602e52a13c99f5d"): true, - common.HexToHash("0x891d0996e5e19ccb15a094939c5cbf77d6454a70dffe31c299a97820a0bd19f8"): true, - common.HexToHash("0x67b04d8e93e6af4db2bb1f4c4fa5ce51662ad32a4ab734b14ce800006c1b1e0a"): true, - common.HexToHash("0x1fce4231b80b8196b93094ddeb0e03d789dcc8ccb40502395905089808c0fcef"): true, - common.HexToHash("0x067720959f6d7f65bc0480bdbb005d6b57210b330b1577870f91cf83f8aa3fb6"): true, - common.HexToHash("0xf0e13d3b8ba9e7b7d8ca06471dacb14155b74006171ee569d12d5bf3cdbb413f"): true, - common.HexToHash("0x2344114bba3ca8feb7de710ed2d1a199029da7d7756921c1f40638382215b817"): true, - common.HexToHash("0x4e09ae721847744775ecfca9f9449320827abf087e62d9e12500de5344c322ca"): true, - common.HexToHash("0xd749349ba91576d5337a521c2400e2d92210531d3d011788ec33f7d539816885"): true, - common.HexToHash("0x47057440c79a7f39b90062f74311431e5e544cc2b26cc367748653c629335e72"): true, - common.HexToHash("0x4840b7a102b1c29e563ae944af35ef3262c329b895e3f997e5928c16c91e6264"): true, - common.HexToHash("0xedb679812903fa2a20acd282f6e72f637d062dcb04929a34de4a7a6b791091a4"): true, - common.HexToHash("0x9e7e8c582e263dc1bf5022d70088f78a7074b72ff2fc70802586870967549824"): true, - common.HexToHash("0x767cecd300411c98d8d610823b94a9dc4e1717b1f8712d62236adc9b2ba731d3"): true, - common.HexToHash("0x806a384b10ec948358f45f469bcc93b3d9ab05aee3759172377b930104a03028"): true, - common.HexToHash("0xb60c8a46dac7f2836a2f445dc67f95ab824effff3c62158ec9ce0130772aaf94"): true, - common.HexToHash("0xcd3b1dcbfe131a3fb27b7a64e6035ea2e0263f4c8a3a605a60a4589cb169872f"): true, - common.HexToHash("0x0baef754422233cda2536e9c55ccdce89ec62ff93a198142ca30200191540d61"): true, - common.HexToHash("0x3c16d733e42d30edb86de6018b952942e57738ed7c407dac1d0ee0511598cd02"): true, - common.HexToHash("0xbb445af6aa4fc5c5579e7ad672ff787a460978ecfe6f3cc190785fa516186efb"): true, - common.HexToHash("0x2b6d3696d4c951d2aadf2e5b5286eb0baed7e469c13b5ffc6552e313a9ef30f5"): true, - common.HexToHash("0x917799cde37f824348dbc4795198df87cc6068c8fd46f7aae137d1c29403234e"): true, - common.HexToHash("0xd59d5dd3790436c66ada9d5071e5a5bd3712f2432a3a5e677d072d0a51f4dc89"): true, - common.HexToHash("0xd0be1476be3ecd3a11c4421d897b801e32ae0ba24935946ff187848d30bdaba1"): true, - common.HexToHash("0x84c98e710f206019459e4ca0a6211f9a9fe432c3e9147aede3ba3abcd833dff8"): true, - common.HexToHash("0xfb72e363b811677abf1912fce1d458394c506c1e5a074a3ef4b5253007d7cc66"): true, - common.HexToHash("0x333819bf5c37f095c43dd28218e326f8a901f4e61f5e9357d213178e863587a1"): true, - common.HexToHash("0xc5f9bbea346673c457b5c97a55bed75797effc8e0b77bbadf429eb590a54356d"): true, - common.HexToHash("0x7cdea8f81270a5671c4c49b845d05731d1674d1fa6e92117a5053ab13fc37558"): true, - common.HexToHash("0x2f2b640b8cbb72f31c41e2fa828313810198d7c8239c0ca41228b141bf3946ce"): true, - common.HexToHash("0x37973d3be1592f9732424c08143261b5f516946b75793b70bdf90b0c468640cd"): true, - common.HexToHash("0x529f3b8e0efbadce22aa2e185c4825b5d911c25786a2e732e091f3aa5f08805b"): true, - common.HexToHash("0xbe8a077dcaa409ae129ac469d7263ffa4b062e9cfb89796eb4c9599015d06e55"): true, - common.HexToHash("0xbb9520773c1b621cb7bb68dd4ccfe469b64090be5a855b0f4a4ed276d65e8607"): true, - common.HexToHash("0xb3d15497e90e5643a42a462b01bb2e89d0adbfa83eecf2fbde0c4cea372f8023"): true, - common.HexToHash("0x1a454a5546fb07980b53d798098e4f6cd44eb354a48740490ec50d70c51260e8"): true, - common.HexToHash("0x40e923dd36aedd603d6348d513b100655bebd3ed263813533492941dc4abe47d"): true, - common.HexToHash("0x45aa7b27763be5967af32e997997694bb02bc913daba683e79c6b2f809c4a777"): true, - common.HexToHash("0x70c870fbdb9b8a879c0f6abf52e18d36bc8cea9ade3ad045bfff63a446d78e49"): true, - common.HexToHash("0x7022c81c2c3d434b84dc0cd133befbc4d07ecf0741b5ebe957a82c3675c3768e"): true, - common.HexToHash("0xeda60bfc1d9da1a6e468f82df6c36b01b484df77b10c3440bc458a40be6d2442"): true, - common.HexToHash("0x2bc12f7aee33e381da3989e35f9eeaba843ef3ae5ebd67e484d132950d0b5fe5"): true, - common.HexToHash("0x8ee6a907eaa6696b25dc4ec88c420b51092b6713be7e647a1c8fb0b714194a7e"): true, - common.HexToHash("0x43afdc77933ee5274ae10df2dff29a4ab6ced66254fc4d3d3a957b2affb991e3"): true, - common.HexToHash("0x980a3abaf14527a1cf2ade97123c9140f890fc0a009f673d2b44d6eb0be8942d"): true, - common.HexToHash("0x20b9dc6efbc6551c92d0aba2e0536fd338aca573f939fc198a35879b59fd3a09"): true, - common.HexToHash("0x4f55682fd58058df41c1818a2b912b09f7f7c3c1ebf75397559053408b388730"): true, - common.HexToHash("0x0ed34bdf1d01ea2dccab7a5c56208c2882d57a7159f06e1a0a967f8da97e4d7d"): true, - common.HexToHash("0x2461cbb150c2f51bc03971b18c1dcef8d1ea494a29386ecb7d25186bb245e04d"): true, - common.HexToHash("0x5b0d5a7d3f34bd97bfe83f83ca04ba40e471ea03d09e5ed8a499d74e9033f901"): true, - common.HexToHash("0x53748ceed2588a0deee487cf71591ffdc97df8c10f566d603c3dae275a217b6e"): true, - common.HexToHash("0x69ab757f1d2d85125d627e1f96b8e627ea0bca6d7975bb4d402dd3dd05b62eff"): true, - common.HexToHash("0x70ce9db50ae60589c042eccd94e155f4521c80503159debc84b95952589ac36c"): true, - common.HexToHash("0x43d750d577ce26598a972acec27bcc35d2398b429df9535449a6d1e2b8063afe"): true, - common.HexToHash("0xc56cb6a70d6c76a39a116c5af5f3b92707e04c65fdfe340e72e4dcb92d13cae7"): true, - common.HexToHash("0xe8dd567e690e3896bc39dea6151d1dc59233b7aaa30f4a283d7cd87c5bc9ae95"): true, - common.HexToHash("0xde977aa5b17e4a49837a6efb68588d2e74f4ce5a179c39499dbbc2f2d33308f7"): true, - common.HexToHash("0x1ac148aa6a080c39d85177c4aa9edf642bed834600dfa9ccab9a3791a5ebd4a7"): true, - common.HexToHash("0xb83cad377d828c86cc49ec5d91230009dce359a2e2c42d925c38093cb3abda18"): true, - common.HexToHash("0x6e86afdb0efa61d944893f74621368363d7792ad5763ed6391830828f535c11e"): true, - common.HexToHash("0x02daba2fc0f4982a7039fc3d186f06d86ef1b0fe5b37e05c1f8aac508c05518b"): true, - common.HexToHash("0x9347021aea441906b59aa3b735c96b583813b72aede5836ee5da4a502dbf68e4"): true, - common.HexToHash("0x25a3aa1810281254a870491408001ed1d227f808eb01d26ecd377fe3b15671af"): true, - common.HexToHash("0x241b1bd351230065034de439a9450293158f30359d64065b5081bab0953e548e"): true, - common.HexToHash("0xe1b035513aeec23287ac929a67d22cedb4fe026436597e7ed20d63906544b360"): true, - common.HexToHash("0x7771d7cfc1428db485b4541dae2f8c0424266c64a627f911e7f7403a2aaf867e"): true, - common.HexToHash("0x6a2639f4d4ade16c4363764797c9741cba7eedf1ff0dffe29c2a6973905161ee"): true, - common.HexToHash("0x377100e14b18b85aec8ee700b8add663bb1268eace23d6aa0b55801fdd0aa3db"): true, - common.HexToHash("0x9485aaf2f8c754f616f61c302518f2ba1fa9233ed685df9d9f228663a0b19a44"): true, - common.HexToHash("0xf1af576eb9b8c4b602a59773bb0e7fd55e52fc69315b837086fbb3973d9b39a4"): true, - common.HexToHash("0xa6438e53843ac1a9021c1b0c5b2fc67f3afd3342e621f1e6dcbc676d0b541b2d"): true, - common.HexToHash("0x2ba966131085cd1c92a43c9a803e35b2b229ebb447a7fa4d13058132f7420b0d"): true, - common.HexToHash("0xc30b34aed3079cbe6b2055dd04c44f3e5297e4fc797f8eac153c6833f67fe6ca"): true, - common.HexToHash("0x5dd37db7bde37fbcb68b18daa1ae6e2cedb1a455c24304c90beee27d59e99b11"): true, - common.HexToHash("0xc3c704c5097d2c16381d423b561ecf2e7334fb4912d1071dd94a4a861bf17c13"): true, - common.HexToHash("0xbc7e79f7a47ceb7a9c640d4c742a89d25becc4a92e7bffa02b69ddc68f6170ac"): true, - common.HexToHash("0x06d6c1f1769b989e1739bf80f9db2d612af2656d3958895664eec5d69daa063a"): true, - common.HexToHash("0x95793967f6554f1664f5545926391b8e2667f30544438d313425a746ab2b62c2"): true, - common.HexToHash("0xd3cab1c41e622edec3c8416e777dcecc92c6bcaadd6568c93191f005b842f297"): true, - common.HexToHash("0x767bdd1011ba8002465f5fee6c41abcc34a6125635e0851c55b6d71b437f2be9"): true, - common.HexToHash("0xac9983ce4e25ac708ee5a3de3442215cb3bbe71a17808122a057d1373e75acf5"): true, - common.HexToHash("0xd1f96bc0d85be0a6ba91201cefbff8408e300b0c89b7c03532d7f6b3675b0127"): true, - common.HexToHash("0xb06e22d298ebc1fdc7237a6725389c0bafac87b34d06922091900349d8d41568"): true, - common.HexToHash("0x9302641ec30af466418c8815ce8747ebaf1b3cb0a2a9c7ad5fd3e3cc750f4202"): true, - common.HexToHash("0x5b072d96c5d2d05c4c5984ab162a76972ea374210f0420ad0fcf336fd106527e"): true, - common.HexToHash("0x050f0a852b97663cd0912e30cc293ed21cf238261e5e2bf35a763e730dbf2494"): true, - common.HexToHash("0x9b3293719f4190132ed522ac46aea320c82625474091b3d9e3a96dbeb5e4a8ed"): true, - common.HexToHash("0x3e37515398e432350f585bf1d6163c21e26958b27d34136a745fd998bda91ad5"): true, - common.HexToHash("0x89cd6bcc7751155de2132e82e252f6cf83f14d05f64bfaff71858b55cbdd7e97"): true, - common.HexToHash("0xd8929971029d2bec0514ef85c8c3f9996a1e9a39ac39983bce2a2007bccc181a"): true, - common.HexToHash("0xeaea8f3a4fb1757aa3230097762d7263557aa6948818961bd486a437dbaedd3f"): true, - common.HexToHash("0xff7fdc1b72bc6edbff0a202df1e8818e4b1a65a45938b0ce019981b9b357f552"): true, - common.HexToHash("0x2bead9f3f27abb749aaa1ed0b984103220e21c9c8d0ada2e14f181dc8c771c95"): true, - common.HexToHash("0x24be211f50a74c8683f93bedd315bcd4736e893e088cc216ec30058a3f277230"): true, - common.HexToHash("0xec3dc1d4c92eb3d2b824429f3d191a918176ccd1457da7d14752242a0e752b15"): true, - common.HexToHash("0xbc10f9104a2dd62dfd88db8d74fa57e950d57c06df8cd5ef217494e0752a00b4"): true, - common.HexToHash("0x1fb73198e02ba1e06ed26e3297d05fa909cf115bbb52f6da598f10f255b8b2f0"): true, - common.HexToHash("0x1e5cdbc2af684dd0f6694ed74fbf18de65309d5361f128033b545411485363b9"): true, - common.HexToHash("0x5c53353e040683ab005ad15522d8fe7943e4efaf788596e995d7dffdb877825d"): true, - common.HexToHash("0x53221163f185e71f15848570ef5350ed50e4becbfff27e7110586e0a1a02e4ce"): true, - common.HexToHash("0x1008b8c75475404187cc162200a910d85049a43166ccedb860434cb10fc0b814"): true, - common.HexToHash("0x080ad06d1996cbdcfdc8e43fed036d46258bc0862471e8a1377c11a36d644792"): true, - common.HexToHash("0xd5ae52f7349ef9023e84324c9fb23b29043ec5447c8e24e5ec4a3f0dad57c5ef"): true, - common.HexToHash("0x86cc72de8d5c5c60af1901a8a7ceb339b9e0353e75f17434809c24d29fd30509"): true, - common.HexToHash("0xfb3ca6ff7be7c2068f3630d6bd0329783f7951db18107ad1fa2cda8ca49d0276"): true, - common.HexToHash("0x34863303066e6a6df19165a8076a9e9d3a3ea6163f86f13f7337ea13c43dcc9b"): true, - common.HexToHash("0x43d00552f0116be181e153835f3306e311d95680f8cdb8ffd1e9b41981f462dd"): true, - common.HexToHash("0xa473c074060bc7114c6a6f479547d779547145c4fe3b6d31ed65f71d53f47238"): true, - common.HexToHash("0x70c1a4065918704e30115fad7c43f4b6b7aee2e41febc8152e3799d24480d2e1"): true, - common.HexToHash("0x2edd80b314b61cd06814f534ebdd0f8633861b104502ee73946482ead3e80574"): true, - common.HexToHash("0xdcd8ffe8e533b38528bd6a0febc9a4a8878f4184382028d6507005ea9613ba64"): true, - common.HexToHash("0x9feafc92bcaa8d0a0f9ff9395726776ea912bc57e83810ed34c9b35994c2881d"): true, - common.HexToHash("0x1d16a1b18b6d68315f022c50fbb206abce1a06c1e6fd1a9f4f9fa49680609b6c"): true, - common.HexToHash("0x9afaa88c059b1cbc95c7e8b42417fdb0584866ac6290d3b201aeb7d1cc5966d0"): true, - common.HexToHash("0xb52a7b732dd35fa837f00278b9f1e3218e394d8bc14c62da88eae28bac84cf77"): true, - common.HexToHash("0xb339140c46c118700c8d46f4010d4c08f1882d0a2e3d6a4993722aa283416a97"): true, - common.HexToHash("0x0a98e56e15f2ce7437a0f32a12e62b34b10f84966e341f86cee40356faca3399"): true, - common.HexToHash("0xf40e383ecaf820293f8432cafd72892d667c1f016640cbfca8e7ffad350da246"): true, - common.HexToHash("0xc2d70fe9f4addee9f819a7b8dd49f5f9fc09ccf7c58921ed4ee75196e8770740"): true, - common.HexToHash("0x51ab40e122dda58ef38a0e8a1a449bf5551eee848c6318863ab24adfa2772235"): true, - common.HexToHash("0x2829cfb8cb17ebfa244c8731857f48e2242786e18ea5475dec9bb9bc6f19223f"): true, - common.HexToHash("0xc7e8d30d19cd83d45ad269011850d5e97ac73d33276a0d059b313579767e81c4"): true, - common.HexToHash("0x576b6293d1e3c40fbfb6e7a37785f787fdeeb61146ef1f5aaec096807813a92f"): true, - common.HexToHash("0x05eb568780347a0cc4daf71ecec6dc4b6706aa22dfc6fe17eb9076a8f08437b9"): true, - common.HexToHash("0x2dd1968cd64022b77d59115cd93fd4a9349f31a2435d5d165bf0e97abecc0ef6"): true, - common.HexToHash("0x7f21cd30c7ed44c82cae7ef0ba5872808b7d4dab9e6b46011680730fe62131a0"): true, - common.HexToHash("0x9629370dcc4f095b0b8398fa4bf68f42a2bcd74c10485eef93b6bf09c2c2d1f9"): true, - common.HexToHash("0x7f988bb1baad35e1b4a75bad72bea5e94a83c9afc2c09aa44ce3c34b1f624e3f"): true, - common.HexToHash("0xdd3f67be3a876e3c5b1526473b51d3585f1e941832c6e6c7dcab9340943899dd"): true, - common.HexToHash("0x81b51ad53e226cc14682effe2b97b2733f90c45c92b73a633667ef2e44ce3108"): true, - common.HexToHash("0x82ef29fcd79c9187bd0c352d682dbbb9e4b226a5a43ee59f15cca78e667ee18a"): true, - common.HexToHash("0x5ca59d302321e31afcf096de58503d465944e6c18445e9f527f78b25a66e1572"): true, - common.HexToHash("0xf95a7f55190342b79b476a2377829d3a9b50f69d0029546d5060051f678872fa"): true, - common.HexToHash("0xb276291ebf89d6b3048ce8b9f34f845fbacb16b703282ad392e8adf602fc0938"): true, - common.HexToHash("0x76305d968a17b81974259ecfe1448217cc2c98d922ace4e44120abadf2a11850"): true, - common.HexToHash("0x8072021e631401f9cbb8bc0f928ad78947d1100f5ef09298415c138c912bda9c"): true, - common.HexToHash("0xed560daae262b8912b3e0b5a5a38a0ec45a501c5398cc33fec1f6907dfb81c35"): true, - common.HexToHash("0x2719d79337df02e8459d2f6f6325708090bf35c1409fec9ed8d2facf2a782ac6"): true, - common.HexToHash("0x69faa464d1953b70b8dced245f15763ef197cfa22f9f1ec68778086b02460cbb"): true, - common.HexToHash("0x7cb714d5de884c2035ec7c97ebae58093f1af34f5f293961fa9f8115b39651d1"): true, - common.HexToHash("0xf876e4dd198ede37d00bc14ff5a8ac905f3e31db1f7a9ec1e2808b72b7fd6126"): true, - common.HexToHash("0x893c89dbe2bfbddcd4f024356bf31c69ff34cf18de1d5201bca5539fb539fe93"): true, - common.HexToHash("0x3c26adc38ec73279558ae1b4f07b4ac1c0d96e4ffbf9e53cda4bbdbf61623965"): true, - common.HexToHash("0xa9056081eabbff6336e71c93c99e708e98fd5329fd3cf04da06785ef2f5f8cb8"): true, - common.HexToHash("0x2389a94b41c86d4767768d54be95fe03a28cc4ef8f55508cfe905ba203653b7c"): true, - common.HexToHash("0x8b9f24aeae961abc8800976b0e98d81cd535c7b1896f6710bccf696f95cf2bfa"): true, - common.HexToHash("0x0efef021d4057cb3853cd269d2a03307398242f3278db8429d19cf5cf05de487"): true, - common.HexToHash("0xcce47bad5cafe9ba477c68377bce5aa8d3f5e505595a616f9eecec88816e7190"): true, - common.HexToHash("0x0791b91715b674ac779e5fc054a72f666ca486503f324c664230fd5d77506817"): true, - common.HexToHash("0xfef2d9fded1af31643d2d6ea5f67ea424d9eca1d4e34c32a47463466b8a4ded4"): true, - common.HexToHash("0x5fd3662dbf147e2f1399c47e6fd73657a522e2bf37c1cfcde8f319a9db8d639c"): true, - common.HexToHash("0xe444b15963dd51d10cfdd0f2295a68752d5f0a3642d1ab7782d556910cb484be"): true, - common.HexToHash("0xcc4044e6942615a6f4ecbb045755bae1d6552628f88d3c5dde9215f5a6835b0c"): true, - common.HexToHash("0xadfa1cdde12a58ca137698103014035f04f25e7d12ace773e21b640e31f63055"): true, - common.HexToHash("0x94b467e96c5f490454c62e6afead6e7334f927ba0601253c7ea5444c7d623668"): true, - common.HexToHash("0xf548e0fbe7f73d96c64e83bae44dd79806232b7ac33ab2863b96252ae10027fd"): true, - common.HexToHash("0x2387eec3784e151ee4561b6e760f88fa67ae86e53ae6892cba8781d63a83971d"): true, - common.HexToHash("0x8e17803f7402c87eb2ea7277c57256950784479202a6bcf9b6cee2b53794bc1f"): true, - common.HexToHash("0x1ea7182268a11015873ee378abcf3aa08dda9611013cbd55396bf85da9831156"): true, - common.HexToHash("0xca598137f4c1a0fe9f0ee4e7d6d1b72ee499343300cea1b64daae0935ffff765"): true, - common.HexToHash("0xf7a0aed8f2be52e88732404b83a86716a0ecc770f8a475ca666663467a61d41d"): true, - common.HexToHash("0xfa61180a07edda2f32f392ad8f7c10ada2af07688bbf596da522a9ca4637c1b3"): true, - common.HexToHash("0x9c318367bed85d2c1594d8ba37c4a9ffed2e763d5a4cee5f1f79a2bb775c7e36"): true, - common.HexToHash("0x9bf6f4ced6af5fed5d54ffa641e5807647689e4cc593629601e22b03dd1fcc76"): true, - common.HexToHash("0x8d5cacd117a4885b90cc73fe78613dae7d36f7534776369efe78be02b9ea7217"): true, - common.HexToHash("0x7b9a448a3a39aa75ffe10b3a568bdd222e3d585a98400b04a8e51cf870e2f138"): true, - common.HexToHash("0xe016f7dfd1dbca81e8cce2759fda21c8a08c6dcc8a0814f01a2935b9e6953bbd"): true, - common.HexToHash("0x252ee599231139ef8b329cc612aa8b09d4dab97b1b5fd028407b11d6d68efb2b"): true, - common.HexToHash("0x886c98e51e893be91f6757257b19a600c8fb827d9b31e41d5dc070a115af896e"): true, - common.HexToHash("0x5513d81852e7361e350c8b8508eafbcb5728bf8be89bbe2b82e8cdb68cf0f772"): true, - common.HexToHash("0xff5cd97eec57c87caeba403cf8594d6eaeb4ce974df5c741b63b67108bca6ef4"): true, - common.HexToHash("0x256e5e58e78f9dec17283ef22685674c8114c4102428331cf7f4d9ebede8a41e"): true, - common.HexToHash("0x70704a8b557dbffde8ae65f75f4e02f718fa07b7007d4c09fad3e7140fd0f3dd"): true, - common.HexToHash("0xb2de811709a1258effdd3a650d3b6138039e76a180da476228ca90ba8b78f489"): true, - common.HexToHash("0x8dc95c439ca82d6e8d4a807749bb18772a924a1164a35e4a1f8a4f936b0e73b1"): true, - common.HexToHash("0xc35b7660bed159d331506c05356065cd9a205f21eb1facb1e9556e702782b24c"): true, - common.HexToHash("0x98cf82fbadb59e2de558ca6c0b4f1b559924a0364ddd0f3d54e75d01b336eab3"): true, - common.HexToHash("0x1c3abc9d56b324e429624a3f009dfafb2f4de00baebd827ed85bef7d7467e33a"): true, - common.HexToHash("0x81a02d69cc9a54f6115b293440289e3a72feea177cc47fc1adaa3350b3dc59c4"): true, - common.HexToHash("0x7759ede496bd23e518d636c65ebea13a032ed9ff3a7c510bffccc9316cd35fc3"): true, - common.HexToHash("0x8fb2c682b349133761f1c680a6404263ffee97d32e67465c613ccaec9645b565"): true, - common.HexToHash("0x6f64287eafbe616991edf1a458f5c422119621b4da1cd2fa4ec2cfbe891053fa"): true, - common.HexToHash("0xbe8b0d6790fd461a68748e7e13a3380d611fd7d4c8b15594c7422eedf25b8ca2"): true, - common.HexToHash("0x7e379a9b2da42f1be6ef1ec437b0d54e114ba833cfbfb7818e065173880e0dcc"): true, - common.HexToHash("0x5a4f3eda846bc75f3776c918a5df7d84424a4335a9c5f147247b9a4902123fc5"): true, - common.HexToHash("0x9a8ab653a10122f1bc81b0b952e9a0900f63c8529e38278c744daa5362eb468f"): true, - common.HexToHash("0xd3dc7b311906b021cd09f5ba2845a3dacb01dddf63ab8a88e7db68b1dd1e562e"): true, - common.HexToHash("0xeac67c9553baf5afe70058c05954a6f14be3f31b4591a35269656c50ac9596ec"): true, - common.HexToHash("0x548fbc513552beece17ac291b0428ad3d164cc5200c44cd710e70efddb48795f"): true, - common.HexToHash("0x4ed65bc08f875bac0b1e631e7197413df9fa2d9ca1ff4ce486932c6892d9d8d5"): true, - common.HexToHash("0xdfa4304bda3c8f23e1f8180a814d1565624f818234ec7f7ab8aaa830ecd93af4"): true, - common.HexToHash("0xff4365765e86f45f4d18225c78a2ab661c2bf7cc7ff4b88f04b6e72d95c6a4cd"): true, - common.HexToHash("0x47bdc261bcaf10374e01c7df683121c1f685e5c87ac31ef4249ffe19820ca2ee"): true, - common.HexToHash("0x3ade8c4fff811d8a9e80f29632578df670709bf087c72e98fe626d24ec6575ef"): true, - common.HexToHash("0x389d84e85312e7151c405038365434914251f2a706b954cb16bd38842703d8b0"): true, - common.HexToHash("0x43ffa27a80ba3142b40a38eff636812aadf5bd7c599b3e23f4225c7e6ba02608"): true, - common.HexToHash("0xadedae2d950f9f25c0fe026907a33fe7d2f0c557bcfbc9ba5a146e3b8b9b131d"): true, - common.HexToHash("0xbf08affa34f2479ee15ae343f192ab57ff57f538b22166edfbd2c973943567cf"): true, - common.HexToHash("0xc06337409ac0b1a6caa149ba2ba470e8b2d773730584b809cfb1a33ef3810f1d"): true, - common.HexToHash("0xd23f5996bff4833c240a583e940c74b0db1e9cee7902f760e9de27b46d3dc8dd"): true, - common.HexToHash("0x829b13d65658b1e1ebc0bee404c4b1bf042c2d0b434b5c58b7986a1a16887bac"): true, - common.HexToHash("0x7f3dbb55b3f8409f99419d961bd53bb575184a7325705e4700507fc3f50f8767"): true, - common.HexToHash("0x6dff8d635ecf031b0666be861512926c8fae52ba4d1b044b2c9733d21e5f2bff"): true, - common.HexToHash("0x563b70fb3cb0c9d91358b9524b8eee47550a269659d3b874f403c288cae645d7"): true, - common.HexToHash("0x89bcf824a83b3b05f5e4a287e27f959a7e86a9439318ca9a87c1db106a65ef36"): true, - common.HexToHash("0x458f0bc30ce2855eb32e5e2a7bc2dca341be0c29dbc08c9b51ea546c53c0124f"): true, - common.HexToHash("0x53f62954d22b92c84531cccbd70f9ef8d6c2721c0ed81b05dab2e4f0f3bb2b91"): true, - common.HexToHash("0x3fed4885ce508f1bf6ff4cd7635e9151248bc667eaf5c3b9cfffdca5b3fdb767"): true, - common.HexToHash("0x6278b953708519e383f8a01eb37fc145fe29921e13121140cb3f838937236b55"): true, - common.HexToHash("0xd64e4c06f0fb72f749dc9fb3c6c3c5b926334841b6cf7e36164256c8191abe8d"): true, - common.HexToHash("0x371f1ef81eb9940bb1061f3515152a4ae14a69ab2d72f34b59071b66d96b991b"): true, - common.HexToHash("0xc06a61d61d6fbfb7109b64bbc82a3c1b8eeea515ba2718c5e8a3a5f1ab2bd5ba"): true, - common.HexToHash("0x80fc0207c1a9758afcc9b9df9cc5610a0d40e7c9ae1328becfa86ca21002baf2"): true, - common.HexToHash("0x04c35da3dcfdad401f40b2152b66e0bcfa26f566cebee663e788fb1074c914bd"): true, - common.HexToHash("0x5d67dfe5786b7fc87d59a4493d9b53d563a1420916d0b5e5a2bb4abc73270f4c"): true, - common.HexToHash("0x821d0e9cb0ab8ad3a649ac775c00214a61b210a568b76861b9bf478f5acd3dc0"): true, - common.HexToHash("0xe4c93ce741a4de0aedc64a3f08502653712d4ca6d6eb10f0731014e031c7cece"): true, - common.HexToHash("0x8da42ed11e8549ec9ce422cfdfa1e4c9d612640d8405e79ed034765fcbeaf3ae"): true, - common.HexToHash("0xea98925760b43d0452d87e6277e4b679351af44eec70950a02b3ebf99a7b2bee"): true, - common.HexToHash("0x9c68a0960b79492403eb4b3face3db0e1f13cb665d0b7df483c126ba837aa275"): true, - common.HexToHash("0xccba8479b51b3ae40f03f761c1479a6aadf244630cc6c3f35c5fba7380923281"): true, - common.HexToHash("0x883d3ec23f9b616e7b395124ed204735174fde6d0913507903f3b77f67207504"): true, - common.HexToHash("0x11d2223694074ceaf6874c22dee762b6cffdadbe5065b0eab6f0175a9fefb2c6"): true, - common.HexToHash("0x64f56f423a0e68a32c36d821b672ce7231641999d42267ae4ea5fc3e5db3a6ce"): true, - common.HexToHash("0xe7fdc045b2808e6854780d9c82f60b0e24a9d7464f9912ef10aa5ca5a27ba2c1"): true, - common.HexToHash("0xa3af8082cd877113c6a7ba46af4061273d47ebb54f23fec1de861107889e1777"): true, - common.HexToHash("0xc2eb0d41e1c4628a8c3b196022804ebfc3cc3948c9282ad7dec627e9a42e116f"): true, - common.HexToHash("0xfe4805b4d11aba6e1ba999882381e8b2991793faf815a0a15a45c174d89f7005"): true, - common.HexToHash("0x567d8800367ba43d3f275b794f7895a9e5b522d99e101cf1d3580ffbafdd7cd1"): true, - common.HexToHash("0x1c49bba7b481f7345f3fc3be2adef5c2343a8103cbe8b02b0081f70629fbe0f6"): true, - common.HexToHash("0xb41ce213d48cec526953fe0ec0900df16baa897a72da9c3c32a74cc9f75f9f51"): true, - common.HexToHash("0x5c0b24fa526122e54187e2a744f9d3a1c176f2d3cd41266787532fe5f34f1c74"): true, - common.HexToHash("0x0c6f4366b3f76109d9ce97e4e9e41320bcfcd85bc3af4b1688d9ffd405e2536a"): true, - common.HexToHash("0xfecdb44e454f85f1cac60a628df0fcd60f3fe84054f506d2cf88547c0b32ddb2"): true, - common.HexToHash("0x23aab9544b88027f3028b1313b0e3c03099a04b7305ada99ca5d44e88896a913"): true, - common.HexToHash("0xc23c2257defd7599030e9252ec2d9e16697620a72ffd65a2f68af7c9b13a9a39"): true, - common.HexToHash("0x902be7918bcbb525ad2af33977cadbbfc055fdd8ef9fb6749b86a6d261adc6e1"): true, - common.HexToHash("0x6c175882ad403fcbf197e738a4115ac0e388c485254d3da005dde344d7562acc"): true, - common.HexToHash("0x5f5806b0f6ac52aea6699ed70660d52410480b99767acadd85eb055d0294f8af"): true, - common.HexToHash("0x9139ca94f157ab6cd496d4051e11940b953a49d48262c61dd0610931f2ce60a1"): true, - common.HexToHash("0xcebe7c386fcdda66528e2c9ef7aae2e457285631bd31b5ca490d3f29306925fe"): true, - common.HexToHash("0xc7e6dae6b76b6a24e11e4545d1a3a23e848d253ac01987079a9b95522771b97e"): true, - common.HexToHash("0x44cedb44be6519b93fb62473563bc25a79941dee1e2257564b85160afe1342bf"): true, - common.HexToHash("0xff432a3bbdf926152d69b02dcb38b82925260b65d56a8cd4ee8e513686aeb92e"): true, - common.HexToHash("0xe6c09978e2ba453ff36571a43c6a6fab7ac7b31973767cf6b23348f00a1ae397"): true, - common.HexToHash("0xcd98b0007b8ef8fdea869ef8af172d52d4ab158f58c9404ca5658fa64fd31bbb"): true, - common.HexToHash("0x3a79fc173ef8759f5bc661cf0a5ce9ae574c83df7c19d83ba85acd95eee71e62"): true, - common.HexToHash("0xc64d6c8ff49277b0bc51f47e1956a2f84648eba3a17be9752247e5d53a5104ec"): true, - common.HexToHash("0x4fdb3dd87a4114bf25995b18be5587539579631413c8e04cc534d76abf840f9b"): true, - common.HexToHash("0x57ae8fc63525c4fcf2f2bfd3ba44aa66539ab9265c688717f23e0edddd29f1a4"): true, - common.HexToHash("0x4f5f9fb5fb49d4f6246eba74cc96cf715688922c9984882e57f139d9fde2b905"): true, - common.HexToHash("0xa3524c4e671860d068852375326b55c63436cf647fd5b07245ff3c4b74d41186"): true, - common.HexToHash("0x96b5c86a59765fcfebd47e34cdd9c6528bcc5c6865393b2f55b3c18a0b3e0bf2"): true, - common.HexToHash("0x6b8021f82f8eb0114beed25b5a79282e019c9bd59e01ef3dcdea0416fd92a493"): true, - common.HexToHash("0x9d9b79467b9b5c97b296d17f46cce788aeefced7be841258f360109694d54b23"): true, - common.HexToHash("0x399505f74e2794ede4971bc158f28717ea5562da01862aed983f60b15575e6ea"): true, - common.HexToHash("0x6affc03a216b904fedefda4531f9c5a64a91d41fe0d58cfd25b547cc6b6da40a"): true, - common.HexToHash("0x70d0e06db9ebc5685770d3a9648d60fa932a98fb8b22e1aa28349ef5c63b2962"): true, - common.HexToHash("0xced0976ee727e0ec6394af04a5a0a5fec476ab1c2898c378edd25a57b8c62c92"): true, - common.HexToHash("0x701e49f99b0862252b0c6c51e7c42db5a389a50fb6eb65f522ec5b726a065f3f"): true, - common.HexToHash("0xb592a5c3708c6204334c9db107f9c971c8b4e2a5e1bcebd48f6360f9cb876872"): true, - common.HexToHash("0xf00802b16f0acddf64c122d8f480a9b48ef0babf6a262a0df0bb3ee019db4398"): true, - common.HexToHash("0x9b622153c0e2b8d5a2384cebefe331d7d7fc98cb14e06cd2e3abcfdf7ae41a79"): true, - common.HexToHash("0x1fd891d0f9256e18810d08822bfddfb4e3db40a585869da156226562625c1bf4"): true, - common.HexToHash("0xa33880ddbeda9ab42b9ceb471c13eccce4bb295cf742a9360c466da93db94d99"): true, - common.HexToHash("0xfac59a22457717e47d951413070de16abb5bdb98bad7d17c4aa8e12a2b2077de"): true, - common.HexToHash("0xb25a34aec02232cf53be637126db80d83672a1c092fe62790b447b62ae6fc0ac"): true, - common.HexToHash("0x18a431b22e5565036f0c5e0153755419c96f217fc1e18102f0fb1d19779ea919"): true, - common.HexToHash("0x2edbd4237829c50763d680f68e63113e5e7e24f00d803aa14ecb1f80e6e4bd85"): true, - common.HexToHash("0x0cebaa7f2c6f17a42527e7b174ae5a5f1f34b09724b2a6b17c538317ff1ad716"): true, - common.HexToHash("0x0cbc716c14247eccaeb204c00ec20af375aab8747397eaabe92fcde952978c3d"): true, - common.HexToHash("0x30635fd80ee9db3c1096ec53e89dad304ed37f5f22cc31a37fa992a26e780a47"): true, - common.HexToHash("0xe5cbfce5d6b610270a81cc8bf0ab330b6f5dca0c727f6a5f58f661bb2889ca42"): true, - common.HexToHash("0xfd5404cdcf51e073b525c0904e4312572ab049508ca28bcedb77ca2b06981d1b"): true, - common.HexToHash("0xabcad4dd968d0258c8bdc1acc3dbb6af26f826b2f8c82e7dcd74a1aef09c50c5"): true, - common.HexToHash("0x64d7a7e0819b54074b4fb9b59b58c65aaf74f7ba31d590f605d4c5ace365883f"): true, - common.HexToHash("0xf3368178443de05881d550d5f4488bb568f615d982491d76494300682d670aca"): true, - common.HexToHash("0x00ed0e2abdc2da9163fe133a8307c954143ea7d164dd6ecc638935e6e506f4e8"): true, - common.HexToHash("0xe814515cc3b49533877c230a259fc9bfeb7e16a6fb5d38a6e66a22076c5fcf5c"): true, - common.HexToHash("0x29d9e9ac9e4e9893e496ac105ae6cc1ceb792cdf28b1802b952ecd907943269c"): true, - common.HexToHash("0x64eed66f74a9a483e81874f1ae1f818f3735553737934d09ad52c88b80bfd4ec"): true, - common.HexToHash("0x2367e6b628ec2012d459c6b84a7f3ea6e2dd4183f48c9c5a15226755f7e06532"): true, - common.HexToHash("0xe98df49e79bf3a70e564dddb7c0cdfd429357a45af062ec204d6c94f6ef631c8"): true, - common.HexToHash("0x9137906a705f3462a8b799bdaff8e649e8c0733e5c2ee5f46e90387bdd6d0554"): true, - common.HexToHash("0x53ee4bb385c0414455b99a766195503a76fa1d6af7522c65415a38d5a39c32e4"): true, - common.HexToHash("0x37ab9f581c762410b9868ec26fad1a7a84ccb74889394cb7d6a89daf318f15a4"): true, - common.HexToHash("0xb93d137d14523d626c4d61ba16fd7f0d21f9b580af83d158dcb07382f0503e53"): true, - common.HexToHash("0x8895c28cfd2dae8ca02fe14e0f376d7230fa948b8f859a67c5bfa1feaa8e7367"): true, - common.HexToHash("0xd919dfe6867d0ededf7fe3fe18afd2cdd48d8811d013e456a140caabc411fde8"): true, - common.HexToHash("0xf9b2520329cd1f8d6ce9cdff3b6acfbb43da7995a9641d61455a64c4f837b08f"): true, - common.HexToHash("0xe39a7585e76889a351539770861c4c7a695a9a392e6e1b4bfca3fa51f512b952"): true, - common.HexToHash("0xb9f5b67f63edc9b5ceaa4dc097d9a06100e9d397d918bcc8b52dc971bf2dcffc"): true, - common.HexToHash("0x6bb1bf89c554f3d51e66c1ae7bc9e0d481e43fe26f89fcf7d6353e109a3ce27a"): true, - common.HexToHash("0x4389a6eec9df1ea1effbd6d6de82c4b71281c2bee537933236210322b108e269"): true, - common.HexToHash("0x1283d5d06b50fe56ce587bdd4e13e5799b881f41aae2256e4e0ee8b1b7567843"): true, - common.HexToHash("0x5e5af92b04cbcc6e800b5c5e9062efd437e66245002b116f2ed8c09c8e95893a"): true, - common.HexToHash("0xa3e59af9ca7d84cd56e1bf7f05ad8be654782010bc747b3836400aef0dfeb157"): true, - common.HexToHash("0x472d5b66c638f1799f3b86e593d9fe8faec71249f68057c93b55635d2cbca8fc"): true, - common.HexToHash("0x72b01a481bd18a3ddd03f72ac2d50c03a53786815193b00999abd790c7f6236b"): true, - common.HexToHash("0xb4105e626b70365f8d16988e0a8ce00ab22f70112f3c3d1be2677bcab8974241"): true, - common.HexToHash("0x0641bbfc5704218b2a0f8a61405699d2d4cdb244dd49e8fef17febe7fd2275ba"): true, - common.HexToHash("0x5bf8f7657753eaac0cda1f44e9aacfd9a6d7b794977aed031b4c4be55720f706"): true, - common.HexToHash("0x26ddf60d6d84da4c064e173b64b9e7cbad1d27b5d096fe2563651a5eac2f2894"): true, - common.HexToHash("0xc111300d196947f3bf99ff4fd1c1fc367b8a887ea94112b2b70442128d432224"): true, - common.HexToHash("0xea9421903fd82665695f9c987a4e73caba1234ffe90aeabb5aeb954b6d8ba726"): true, - common.HexToHash("0xb034483479122d0d98eda0d672933c8c7d77553da90d6c444f74a1e03248f55a"): true, - common.HexToHash("0xdc421a044c2744aeddda04be82bd8eac6e8da1436359cb95b1d4f21e8c154059"): true, - common.HexToHash("0xbe7f40220164ae46139ac5ea197f1fc0f130ef937dc4d89fcf20469b8842a1b3"): true, - common.HexToHash("0x2ff0f750965ad53ea27f0da56c1480aa7ec6b523fb5ab6bb8d7c4117af362db2"): true, - common.HexToHash("0x14989823eda844bb39576b3ba23178c8e2ba7e74b839a1846c2e8b441423d71c"): true, - common.HexToHash("0x1afe13f3ed80998d3e1e82897bf8a7252f19cb826035a59c74ffd18dc6f95ac1"): true, - common.HexToHash("0xd832ecab185a28ab22b13e9056ae7fbed7973a666b24865aef008f21eb4cc7bb"): true, - common.HexToHash("0xc2a40aa2699acd4749e45b3cc203cc75168b848453ba47b311cfebf21c797bc2"): true, - common.HexToHash("0x1f4557b98bbd09026b730672364ff26af0f56bacd5fb5958ec4fef6d9b719521"): true, - common.HexToHash("0xa06d5238c06814b9ae9ef02b81e604c611947459c89205b48cdd94bb398655cc"): true, - common.HexToHash("0x1e3db54ca5f04c42219ecf774050f2f4d3386da45548e405bf2d8d766ac0e77b"): true, - common.HexToHash("0x7d3fa9da53c8cea885b646c0f5c98713643e29361821ce15bb07b27bd17f2bfd"): true, - common.HexToHash("0xc06b2f1ca0e728603cd84e7eaf5cd2e5474fbb1b571d1c93d5dd3f8c9347b500"): true, - common.HexToHash("0xe343bccd5d3412d24b9c415607bd3ce30f6176ef9ec129fac3953f0fcbb76a87"): true, - common.HexToHash("0x6c40421587e5564da7bd2aa9fc68087f3b15aeb274300a74f3245ded29752a4a"): true, - common.HexToHash("0xdd2e5abe2175ca5d8ca364eabeca31a9efa91a69e691becd58615344ca871dbf"): true, - common.HexToHash("0xe6518a37b5ebdf362327a79a1002e2dce62c50061e6ecda1d92fff1f2987cc41"): true, - common.HexToHash("0xbf559f2d918520bc955695e9cf29a16ee5e13ea8c6bd7c0b5678f5d9521418f1"): true, - common.HexToHash("0x0aa9e9239307dfcbe06196d8a3d47c062664b175754e86029c0e6b7522d7f755"): true, - common.HexToHash("0x2a17d489bded117b25e0d78a59ac3afe0808cb3eea7399cd687cdabb528a42eb"): true, - common.HexToHash("0x7c6e1518a0cab2caddef092bfa2dacb2ac0786bf171d2fa392c004e57e9ca8ff"): true, - common.HexToHash("0xeb889095b4c9e0bb34179839b974dfcddaea2ef7d5171022a2f47e4b3f97fd8a"): true, - common.HexToHash("0x62c60b279e47e062fe33f72870dfb3f909847b61261fb3376d1381432ccefbf5"): true, - common.HexToHash("0xfca3624a1138d1cae836ac7931cc884c37b844685e09aa259537a09c75b691b9"): true, - common.HexToHash("0xf6f270702595df748ee3c97233ac8635f69645f05112428b6622b68b1fe91f84"): true, - common.HexToHash("0xf8a63f592143d60056086d67b4774d34c25647aaf3e268f8a5f25ff0cbb6a000"): true, - common.HexToHash("0xd34e181d7a93238a031a46b2ab1e0f7060b75f39a2334a5d930fa7b63ab95ded"): true, - common.HexToHash("0xff35921073d9c8da37d85da1312179017dc61d314bf05fa7b02f0ad4a5f80b92"): true, - common.HexToHash("0x795790cfe150f5d2a4b4cc43657d604162b732432f9a1ce89b032ddc1fa3d118"): true, - common.HexToHash("0xd1d75317c8ee6a0d298c339db3fabf0444dc8b196ec8e3e4bae0e95dd2d16694"): true, - common.HexToHash("0x9f2955fb9a5003d2e580ade92ada4e28e424a612bc5053f97f233b1dd88fbc04"): true, - common.HexToHash("0xe46a98127430d22e3c34a8c0155bb18b264c58af8a345acb1b9b914a1eb3d4f5"): true, - common.HexToHash("0x202e0f17d0fd110f64f9414b600356ce575b8b75d76f0fa1c185c06c8c1f72aa"): true, - common.HexToHash("0x51d51fd17f84670edd1e0f82fda9559b98af0b9ba99b88f86e1436a8a668851d"): true, - common.HexToHash("0x8c48ce4e37a9746f3798210ecfcafd3aa4cebbaf887bcbef2aebabbd92b6d3e3"): true, - common.HexToHash("0xc66c391924648386e42ea114f8ff6f5acb526868d8c6e69adb220c271223027d"): true, - common.HexToHash("0xbf7e94ddc6dbeea5529f323c85fff8739ce42f70a83d8727955c46fad566f00d"): true, - common.HexToHash("0x70d6cdb3804273ea4161e14676546434566b14803a6eeb86cc7c3969618018b1"): true, - common.HexToHash("0x2dc9ff6ab1ed0670dfa9838dd0e628c3de485a2ea00edff8b69444a71e9d6e4e"): true, - common.HexToHash("0x2448e20f5bb6ebb2a04f848fb64dd53476f426b0d91de52139e061f6e2b84f67"): true, - common.HexToHash("0xc6cf325e485e98ddefedd11cd1a199b4df8a1680fcfe17d9ee0550ad9d600814"): true, - common.HexToHash("0x476926e25640f3a1add491f3d56b9f691eece0fe4219186b75c1afa47d2abd0d"): true, - common.HexToHash("0x0acc36f8de492c924f132b9edacf4479585ae0fb30c368d539e3c43d71a9db17"): true, - common.HexToHash("0x2e1c4b127f46e50a195f73a65b3d27dafbac744e99bd359ebb2c826050f387dc"): true, - common.HexToHash("0x84f9a887784a95c79d01e17f184e8c386d827302c7c15537c37f33d9eb9913c4"): true, - common.HexToHash("0x8b1af8312bc75c7f30d34ffd47e55d9d5f5f62c7a9e33246d8d379d85c2076ec"): true, - common.HexToHash("0x06baddd0e6656942ec7c5cf4a478b840709c262e45918548dd9ebca0c31ec6cd"): true, - common.HexToHash("0xa3beb67bad66e2110837d9ec913e02b086a502c7bc7f90e8a1932854ef4810a8"): true, - common.HexToHash("0x9197fa05cb87fb4faf333003a098f1371bf7606df672ee43f8a4b8b5752282ad"): true, - common.HexToHash("0x3d6abe856e1bc15ee3d69a51e2149e5e7a51fce8e2ec08b164e47983f7800aa4"): true, - common.HexToHash("0x9bd6b29149ebe0399e66bcf27d1978168a1cf401b9f4baba1ae4cacae9931a2b"): true, - common.HexToHash("0x218fd4a2b66a3c23b9935b32a084f9e5f596055a953cdd9521dd157842329b8e"): true, - common.HexToHash("0x2d51bd136ac52459bceaf1c045aef5532f81573435882d9065825838c375e347"): true, - common.HexToHash("0x6bca106e57ff178e3f62e15229455377ac912dd3ec034d0850aa6bd340c2ead9"): true, - common.HexToHash("0xb77edbfc5452d90fde01a354c1664eb216fdf933bcb1521ec9dec390d1fa2b28"): true, - common.HexToHash("0x57186e969e91071d6a2574d217f3b631b2409254db319f029a8f193d955797e1"): true, - common.HexToHash("0xbb5ba68eaef3df75b2d21d188109326442ab38453ec7b3bfd1367ae03b64cf8b"): true, - common.HexToHash("0x9648e061ec9493af091478e41ce90baae2da137b8fd259dc902154952e52c29c"): true, - common.HexToHash("0x3dde8ab78fdebb58eaf98be11c6c894fc7d5abd291fe454fbc6cd16bd7c541d1"): true, - common.HexToHash("0xab1faa3ecd1831cf672a166ac5d13d51293c3c9a0c804bc618b830da82a67ec3"): true, - common.HexToHash("0x38a569291c50077816e8d4fba7279d5e4e239041eb2113093f50a08606ae7831"): true, - common.HexToHash("0x3799483d03a64b5a3259cb788df516a90208fb5c39d79acc2484cece11f1c2ae"): true, - common.HexToHash("0x1039db07664cbbe274462cb9a432a107a18f870abcf6f2f1adf0e043e26d0eb8"): true, - common.HexToHash("0xbd28948f10d1dee320c899fb64d21d96bc418b226d7d6af82491deab6465e35b"): true, - common.HexToHash("0x6deebb671b8a3b0539dd4024e8268dfc4097789a177b7a83cb0b1e68f4fe0612"): true, - common.HexToHash("0xb21ee737fcd9f6d96615b05f576186e0d4f86725b7693050d56bbbe4c42ea394"): true, - common.HexToHash("0xfd540aba32eee627a85b6aa601551923cb4c7f1e02e6bf6f6f5bb36e3ce25c76"): true, - common.HexToHash("0x89a9794b23fcd79c8136f87be772d9647af8ccbb97f8673f2248b34419693114"): true, - common.HexToHash("0x5a9e39072f82b85d039110e998abd4ee331c794269eeeb9b888352e087163ced"): true, - common.HexToHash("0x64e084bb86977033020e59ece1139020862bf68145590baf50b6f2271a47ebf4"): true, - common.HexToHash("0x5665d08b9fbb6df2828fdeeddb7ae59fd42d5ef45da5c550cbe514c7944c084a"): true, - common.HexToHash("0xdd981791a096decb56c6ff5693bc7fb76f98939fba89d27ac26fa15dcffbbf9f"): true, - common.HexToHash("0x86e81cf32a87353e399e156e04f01decfcc30744c89f94a67b8e45178257ee83"): true, - common.HexToHash("0x833f976ecf967791c6a2dede0cdd4c1cc3dc5c46f9f8af69ad6c2a99997d121b"): true, - common.HexToHash("0xef27ff203e331b237b9b3b5d42f63fd84d6b94f382e1020cda0a4136978b527d"): true, - common.HexToHash("0x86a388555115b5fb186765f486e9d1b00089ae8ca472fedd6ad7aad036162494"): true, - common.HexToHash("0x0dc81436d0d3465fe33baf8b866da4a324cfa173cb9b4d61480ec21f19dc411f"): true, - common.HexToHash("0x4ce71d50d9f61e1e78a92555c1fc463e3dc1ae691c17dc31ada230a7c6ebd473"): true, - common.HexToHash("0xeb0ae932a704f3aca44053fc449cf7fade882f7d06605e2b3e8cb730eb1ec6e5"): true, - common.HexToHash("0x7e66c1b7ad8cafae3cfce545ed37e83b0264c842b7d1e24d04f58ab3cd4db22a"): true, - common.HexToHash("0x77e66f78aa11ea2373bc53ac6275706fdad8f751b3b1f043573975127df97bb3"): true, - common.HexToHash("0xc5831fffbe7a50936171242f643994a0c8544ad2977bdc03ac6aa9cc0a06a1bf"): true, - common.HexToHash("0x23aada2e925870931648b26111212b175f50a95646ca205897c10ac33fc02f17"): true, - common.HexToHash("0x032603dff2307df361786204d5999a49291e1780efcd34c7109b3481f32257d7"): true, - common.HexToHash("0xaab18e51e51abb24e24aeb5739a26329e1c161427646c4b9cc105fec5ab55b33"): true, - common.HexToHash("0x31e0e3b539aa3595bb757769805289262cf2bedc1a4aff662452642bf0076e84"): true, - common.HexToHash("0x0c57d0d16717e89ea366469d2c90ae5fcec0b256fead1a25850e37487e86a487"): true, - common.HexToHash("0x01c23d5d1e72e564451f5e88a8250dccc49f463d429a3a9781a98ab74928b229"): true, - common.HexToHash("0x3bb4eb008aef67e233ae0b6fd537fab01cd5bf88425fac6741ea8874d6e1112e"): true, - common.HexToHash("0x071895479e342bda9134d6019eeed71750cb03fa619d157021b72440d667e899"): true, - common.HexToHash("0xc118fd611f1f0b15c3cb1f3bec5099586dbb555ccafed44bbcb6b89be1239ffd"): true, - common.HexToHash("0x174cd8f843ad5d7ec20910ea0c7e97da1739661b7abbb9276fc45402626cd250"): true, - common.HexToHash("0x6522da2062ff56207da56b59e15e6161a428e6c0831d669062ce16481429fe23"): true, - common.HexToHash("0xa6510fe2abfc4835e17d96ed4bab929451307fe19059a6b4de0e5b6d0af76a36"): true, - common.HexToHash("0x087a7f99247a7ea90e5ef376c2d0d7b819c86c3a7f238bf6ea5e832b7edaa795"): true, - common.HexToHash("0xd445c3997a2813e2ce0487acdfdc5eaa05032165bb17a236c36cffd179001454"): true, - common.HexToHash("0xfc49dcf767ee1e8eadb950f19f15160b72e1f7fcaf0cd642bc64226c603e63cb"): true, - common.HexToHash("0xf462b603b0cf629058bbbc24891ae52e8cea0d44b8536835eeeb0ba51af15cc4"): true, - common.HexToHash("0xa334b309a20077068fc6f0cd38a076411cd88b7b9bc90cb9e5ca85127b9c9688"): true, - common.HexToHash("0x672045397e6b58c846847c665eb64aab94881da68bfdcfb5fa5e62a49360e3bd"): true, - common.HexToHash("0x3175190243ba7651b80ea47493bccf3696186fe9ee89cf9c1a54aa88ebcb74c6"): true, - common.HexToHash("0xb4b334913b83d553487f4b56eb8598734c3af051c8935566f02e2820c57acd1f"): true, - common.HexToHash("0xbf3b7bdfef91c9882351a28aa1c7eadcc0e60d6cfc5584cb734d47fa0b12c799"): true, - common.HexToHash("0xbeff4225991c5b40f9b0c098176c712830825cd97acbf10cb581414d9f4aaca2"): true, - common.HexToHash("0xfefb1858318d87c54cd68fbf41d27e84dd2116757a3a93825d54620968bc3a48"): true, - common.HexToHash("0x9bda8b8ce7a09ce8028fcb11e7a17681cb182577701622c0afc28da150cbc6c3"): true, - common.HexToHash("0x1ee39c462ef434dcc5a411808660b99d6506c2d9a4c545b622b88770fada6c41"): true, - common.HexToHash("0x0a51e75a2cf6a711be64f246d918c200c14e3643c1d8b1b75b532a121556d0e2"): true, - common.HexToHash("0xcdc83c565896b36c3c8f9746d2b9433ab0b54e87154261b7319dcec94fac6641"): true, - common.HexToHash("0x17ee8ade804bee3473516bfde6ecb275d0bc2dfa150f992a4a56c5515b469b4a"): true, - common.HexToHash("0xcc42c9d80a62c8e2e6f10489713b8a0e5f0d10ddb8643f62ba46b8b22b9e0e72"): true, - common.HexToHash("0xf9570b100f46ede5c49cf25dda500bd8879fe7e7daeea919c35fb25eab58e7f7"): true, - common.HexToHash("0x693a1e746655326213882b3a384d0f57026a35cc2b4b8357aaacf08de9e0e32b"): true, - common.HexToHash("0x68de82be3b275a59d6d68af2629cfa2648b46dbd9db7e3ffaa48437cba8ff72a"): true, - common.HexToHash("0x31f2151962150f8e42963d894f8618c62608aa981e472e7ad6fe7376bbdada89"): true, - common.HexToHash("0xa509ea710d2f24670ba557859d2e253e65412cdbe289a7533bac7f25880530ea"): true, - common.HexToHash("0x5ba4abebca7430ec18ecd44685942b5e657f82487105f055391d6c127405acf9"): true, - common.HexToHash("0x3068cc93a7ed11c974c785f9103b5c8dd8810b1f331054ddf5dc8e59fee31311"): true, - common.HexToHash("0xf087a8326e434548eb4e561fa2c7c204271664784f87912365150ebf13608da5"): true, - common.HexToHash("0x0be8e256351f68219591aa3a9239b6afb17e3bd12201ce27075cd4db899c36cc"): true, - common.HexToHash("0x248c7a65c28d3286b29accca4cc0d71dde5f6c486a2bd9cf9098596b710c4d1a"): true, - common.HexToHash("0x431fb6fc9da0277f5492ddad2d843b917321c2b9af51f56d8b0bacd633596379"): true, - common.HexToHash("0x5d8a8f475938d7ecc23d9e9c0257d0cde27b2dce7a66482e9167613a9cba4cee"): true, - common.HexToHash("0x5ca03c7ab890f9e12430638ff656ea5b9cb8fef11605ed7b09099520593a8d29"): true, - common.HexToHash("0xc659dc44d5351a6fb97184a5d6b3f4d9c8781dff85a151f1ed8f45ebba832d8f"): true, - common.HexToHash("0x8345eaa15008776bcc362149b9859d122febe0ac163844def97897a554e81d8d"): true, - common.HexToHash("0xfeb13546ae735cd01623c91cfad280b4ab9bd4e91de47d75538ea4a1071dd4f1"): true, - common.HexToHash("0x685b83e1bcb8d00c5d96fe7de9ceaabfb89b624c2acfa38c6bc8b321fed3e5c4"): true, - common.HexToHash("0x56cb45ddc59dee150e4bd0442e3a58c670b38560f7c0f319121c7b0fbd3a0db6"): true, - common.HexToHash("0xbd9f01c327cef2ac5393fa04025d7b480effaa465d351dc586195d4ca5ae544d"): true, - common.HexToHash("0x40f64597dd5f47a5e3e98a4adcb26c06073d3e7f78167ca4327b596024c0828d"): true, - common.HexToHash("0x9e575a597e3bd63c7f55402cb2336efef30c6a298d55e9a0605642326aca77d2"): true, - common.HexToHash("0x0b31a45ae4c5e73507571cd7f23fba78809f7eeb4744181f52f3e5347aa28138"): true, - common.HexToHash("0x9715dd731f00be808ff60fca103d020789410e5dc0864a0ede6cc5d3949da181"): true, - common.HexToHash("0xa60b26507e40982b245b68abbab9a201432ce01ad3bf7613d421c45cf2821f0c"): true, - common.HexToHash("0xae3d1d4e701580e01b17d4b6ba7256d322439f416d3f3f24cad7b28e737c8d06"): true, - common.HexToHash("0x85a49df99a44ce37a3a02560fc07b3574393e30e99103735ed5f5f014bbe1395"): true, - common.HexToHash("0x2c3df506a801816b8c8c8c239b7a63941bb6efa5d320ea79990c5725ed7bd77f"): true, - common.HexToHash("0x7cc29e5faedd1b57e9c8ea3795845e5665411761b43f13af548a5fa05aa9408c"): true, - common.HexToHash("0xedb4ceb21b6a03cb62ce340202f32632111ca68574910b162bc2ad4609e5d867"): true, - common.HexToHash("0xd02f37807abf2455760edd6b505b958e5cce820a4061421a3ff0626901a60d19"): true, - common.HexToHash("0x5d551cc04785ff340400337380d96ce0e6e43583c6220e5ac11a05c1c71f5b15"): true, - common.HexToHash("0xbb251ae6e48e8667e32261acccda6bd715d685bcb02b6e25ef1ba07301c4dd66"): true, - common.HexToHash("0x189b62a6530eee4aad46b1be692f45681ead406d24a9ae249decbf3ce38dfd16"): true, - common.HexToHash("0x3c98b32b744c447f1d627a81e7e6ae48d00bef4789928ad19e4536e259dff3c7"): true, - common.HexToHash("0x32f3f74f116e2f6d1f9c1f46c93b2242c5f18664ded7ef9f12e11bdf49d1c549"): true, - common.HexToHash("0x32cc0087026c764d9d8d1128a05d829c84048a2ede472da40ee697ac4b7dd0b1"): true, - common.HexToHash("0x5bbb0822fa521fb90559af63007c17ae7a525b2da4c7d2cce0beb362cada2ea3"): true, - common.HexToHash("0xd3ba08b2dd0c3b69b550e37c50bff4822e22144906b378246e3849f7a2817d99"): true, - common.HexToHash("0xc6dc2dd72d410d11dee11f324e11fb53b15b7fc7a6fc4248f1ca8a81b38c1a77"): true, - common.HexToHash("0x35226d84a81193b1d15c898e8bd50190424022f45daa76cdf57185583c6ff719"): true, - common.HexToHash("0xf0db13001783e8876f45c30c8a7b658503fffe157bdc06e0218ae92be8ec87d7"): true, - common.HexToHash("0xdf60fbf03da411587824bde37f4752ea6d3d3a074920fba8d346a13b5351ebbc"): true, - common.HexToHash("0x866c168f1fed936e4d28201736dd7b3746b7be40da7bb196469ddc307572e081"): true, - common.HexToHash("0x890314e66e5deb718bef0f86f90d5bef17f6e0d39c3d0297a35f2af81ce9e3ae"): true, - common.HexToHash("0xbb35c65abed7d8f65cbf9e2f3c8463fbc248948857fc16e1bd0223a8c80cacfb"): true, - common.HexToHash("0x713f31cd2c04d85f72ddbf09c700da3185bd681437aba64becfbb9673f962162"): true, - common.HexToHash("0xda4f577d3d8f68d8c1525893256bc06a691f2cf74731b7d184b8d306a133fc46"): true, - common.HexToHash("0x8cbb759a10455a65dc56a14d9bd0074ffaddfc56b9a605e8427a3f16c0022c3b"): true, - common.HexToHash("0xb25f0732a922db61e5adacedc0f26229927d98111f4998c5099eab12b8fb55a3"): true, - common.HexToHash("0xeacf910323ad0d8370e353846e339036f6652bb6392d9ae58c5341806e8c12c0"): true, - common.HexToHash("0x0cf9bc7cd94fae8f53e70df47db16ad98aadfd1f236401de187612733cb94513"): true, - common.HexToHash("0x4a08bcd09d7efdcc6e0c0ef9846c162e2434943f57ba9e4befa1f9cac0aac465"): true, - common.HexToHash("0xe36bc55cd9221178495cbf5d812e4d01a7b6a69dbe13a053a17006558b7706d3"): true, - common.HexToHash("0x88c5f9edb1c330a58ae6f296b8bd3338bdf64ed8e2cdbee07a1c85b38ff4d7dc"): true, - common.HexToHash("0xed2a2b6c1b3cc1ceae1db9793ff10d29df94042379cb80067fba745b8ad71841"): true, - common.HexToHash("0xfa8bb00f7071cdd95b9e28733bd7d9a0da618629f0d3ee245dc2408687283244"): true, - common.HexToHash("0xbdd0201bef0391a6e8622c1401c6b4d4ce243b289298996ff5a6530cb92e7c47"): true, - common.HexToHash("0xa0d74a06da8ff9bd605b0822fd5dce24cd78b518a6953b6a9a6292dcd936df41"): true, - common.HexToHash("0xa1615037d3e920081fcdd13906c2e547c84e22f2ff869a15f4daf89bd71b200e"): true, - common.HexToHash("0xbc0f95a8918f6d1e0bffe5e36df26ec290e3079b428d78b04197f0b896e4668f"): true, - common.HexToHash("0xc8252e625c4f7208c964fb0d9725f272b760a2e5ec2ecfe2a90de500562ae2ce"): true, - common.HexToHash("0x8760b3412060deb3bf030cfe5cfcb365d6538ac0233ce12cb01e4a9a4f287ddb"): true, - common.HexToHash("0x44ad8a93ba7208ce1eae5f8a484dce1f97bb6abc3fa025f578f238f1998b6c8a"): true, - common.HexToHash("0x973ccb6d6edbf2f453c7c9fe4a4ad88d46e724383452c48564dacdf60bd714b7"): true, - common.HexToHash("0xcc49dc3d4c554fc68103216fe29d3d8330a871d6f30f970475f3fc66666ed99e"): true, - common.HexToHash("0x63174bc2e8942831c0c7e7f5cb48469508391efdcadf5dc25f93e23566d6d329"): true, - common.HexToHash("0x065ababe1b996b35569a466b65466478a4b9b0d728b8a6ca89885194788bef12"): true, - common.HexToHash("0xfde870229b44248d858062d89ad13ac76b9798ccf6c99fd7e1f6613311d6da64"): true, - common.HexToHash("0xea85c0fa555d45d8056974d52aafc1ac179d0394b96fa94ade16e0c3b3910b63"): true, - common.HexToHash("0x714be357df05154b4c6a38db07de44edd6c6915ec038fef13ca040ee321d8901"): true, - common.HexToHash("0xe059b7ad1440c26e852a5343c101c159c69f99aad5d1f2e7daeb3c40023a0a62"): true, - common.HexToHash("0xb5c26d83bbb966388022b70e0c628f7d5b4c38ce48e42e524e887d6205d0bfc0"): true, - common.HexToHash("0x9930c3a4efd8deefcf34943cd5de66b20292de1f7b56c2aa8d53b85130b1c555"): true, - common.HexToHash("0xd1f4536becd7d9b3d580ffe209017c2c435f003f72d0673788bc90e85fad4ff8"): true, - common.HexToHash("0x44f72c8fb4dd56d546ce2b222eb9bc6722409c33bd970630f486ec0d691cd5a9"): true, - common.HexToHash("0x3d7400fda01524d20d64ed0d0324930d58d0bacf1cbb93c543fd51e4d23940e1"): true, - common.HexToHash("0x16d8fd2100805529eca1ecab09f438715988e67f6c1156c6583784605c7c4e84"): true, - common.HexToHash("0x77f1731e84bdffe76e3e763b208904f7b96fc90ba88af464bce1d57e7980c968"): true, - common.HexToHash("0x7926726d3a69e38390e51785c3142cdeb541cff1e375b35b74fe5f02760a661b"): true, - common.HexToHash("0xa9162b8332e98390a8da2346708d59a81e3cfced37e5dbeb54f1eb9b2cbefd60"): true, - common.HexToHash("0x24066bd8966be2f894361a0176f867a6d2f4438d3ce1e538ef5db77126ee04f7"): true, - common.HexToHash("0xa1b463839a1d0ef693d15c71dc229715a3745e8566a0e565ae78b2f157d2fed6"): true, - common.HexToHash("0x3fff35551c802770812550c711ff0173f805cc143b0f9d0015dc74953fcd85c1"): true, - common.HexToHash("0xb1d2d46ab58a8b044d9c940e8a472234b80d3c1e003581fc5e5d6107b552036e"): true, - common.HexToHash("0xf96869053835961058b5eb03928eca5cf3d3b6feb084c5e6e72dcc82b3e25010"): true, - common.HexToHash("0xdfe87ad82949c870edfefe95e1c32168a59ee4f7bd5cbb2131fd5d7bd57a0a84"): true, - common.HexToHash("0xf1413718a36a9849e6d9f823bdea3b0c457439a0107855bf50c8aad523a193a0"): true, - common.HexToHash("0x5890e361214cf1f19018b14659a5fb248851fa0503c6c119950401c848a96b75"): true, - common.HexToHash("0x01bd14bfd0568c4dd538116b791b5ba4fd86e4404cfff25d779baed866c5e869"): true, - common.HexToHash("0x33d68e497b1d7928f10788b0867890a4516cc484b82a129ee365aaa99df64b5e"): true, - common.HexToHash("0x6dc4257f252300c1361bcb1fc969b8084f2f4683fcce011eb7b4fc3dac2909eb"): true, - common.HexToHash("0x7845b8ce99d6baab4025d41918dfc81728fd6ef87bf5973d1c629d3b915c27ab"): true, - common.HexToHash("0x8f1537f87dc15777126eb394634a5fd9a13902eaff04de371b57be57b74eb473"): true, - common.HexToHash("0xff813fae980d7f2758376ad576d1aeeaee3c9a1304e4e10aa47f3dd45d594ab7"): true, - common.HexToHash("0xcba0b59bb99cab99e140e28882ccdf6b6ccfc0d65fe7f41790dc4eb09b89a72f"): true, - common.HexToHash("0x8cbd44967c89fec285cb49522610cc444f63785b9e22354b10f7eef59a2fed7d"): true, - common.HexToHash("0x68f6dc7b24d7a98faccc55a04e52e082b232576d63e152435d1cd1a93ff06308"): true, - common.HexToHash("0x3ee65cd39f66160546aa433958cb1a4420de8955f70127ce22eadb085c159785"): true, - common.HexToHash("0x5861fc546c0919e08897cb4c3e0d207414ccffb72f45a198ed661f41f3777678"): true, - common.HexToHash("0x70364b6890b506cb47623abb143f7afee161bf5aede583a923c0a53a2f9dd8a2"): true, - common.HexToHash("0xbfc8fa56842721994f3747eaa78e98e9d790b294ceff58bf65425700c6677518"): true, - common.HexToHash("0xa7e26a4cf860bc6a36e3489705d809ceb33dbe80903ab6ceabb87ecaf75d7b78"): true, - common.HexToHash("0x825148bf6465bb56e722084934d8032480d7e1e48d540e23f372e5f5acf99895"): true, - common.HexToHash("0x2cc0d05bac83b3dfac8ae7116db0e7ffb3d5881fbc74f8effaf8a828dd81ad30"): true, - common.HexToHash("0x8cb41be765aad88541902225ef43d4ae23551490fad8084563e24835e0fcac8d"): true, - common.HexToHash("0x60ae5455e9027d89d3f3975eafb39f2a7daf1587d0d15ad7b61410b8db5fa2e8"): true, - common.HexToHash("0x72882eb9ee1d6d32b8922bc84525a56cae19856e7dd4f1c5a5dc052016b92215"): true, - common.HexToHash("0x8864c9d1c518bb75d7c32b7c960ba01dfe373d05c64560e7ff48f621bafe7b7b"): true, - common.HexToHash("0xa678ff637927f1d076193b84f7b30c030a066ad67d7212be4e09da78062a1cbf"): true, - common.HexToHash("0xaf46e7f1c6e4f76568932407873bec9f89f693deeb781d7c062999510381322d"): true, - common.HexToHash("0x33dd44503ea313fc3127bf96678bec0dcf809f843c09fc71824d32dc49ca34ca"): true, - common.HexToHash("0xe1096a30a2c53bd98b4afb9f9aead22424d4cafcaef2ba8b0a3a8131d6ced464"): true, - common.HexToHash("0xcb399bf0ccac55bb6784b31b87cb2f3e864d15449c94eecb10ac4b1b5977edcb"): true, - common.HexToHash("0xc0628ba045994f1ff2d454b0b53af61c1b7051fbeda019dc9c8d1764a3f977ee"): true, - common.HexToHash("0x60f9cae6bac7dfa971db5246957557e33954f2047e6f505ef3dd3bdd97aa9ed8"): true, - common.HexToHash("0x9fb7e85b73c5c7e88b303e46f49186c714273764e42940b8fdde405d6d33d35f"): true, - common.HexToHash("0x5cd44c8ffb34f3dfd7febaa3d1afb7e53b2dbf66dd37b1093f612d6d50ff5e0c"): true, - common.HexToHash("0x3c65f4180c619eab1e5f0a745b72a16fade0748594c06d35bdfb0778714bb009"): true, - common.HexToHash("0x9435affff99367a67676619b9fbc68b5bf763ba700cf78e5bcf5d2115a9ac171"): true, - common.HexToHash("0x539a1eedcda3458d01b99c14a1e453ab2303068f8a36b46fbe9dfe853a57b772"): true, - common.HexToHash("0x701f1c17bbf4715fa11be2fa4d181b94aeba969b972b4f7bad9f0c10c992bb2a"): true, - common.HexToHash("0x9ed3048fa52bcb7ae2a6412921f47644c3af34179be36bc78e5dffe0c2fbf358"): true, - common.HexToHash("0x19c17d90050a5adb8078bfdd0b677af6aa9a10d3bb922ccc26e639b5cce7c362"): true, - common.HexToHash("0x4bc0c026f3c892c65d217f8d69ed588b1b02fb86603f4512e865c14aa59b758e"): true, - common.HexToHash("0xe4f63ee6dd6dbe94338d77ae6b2b2563d57a7ddbb3cbe055838b5f7479924069"): true, - common.HexToHash("0x0ec05cfa61ba97cc2998a055cbca1b6493fbea714b49db9e22dc1aaba961a2c0"): true, - common.HexToHash("0x1489483642f87405f0e7d59c23657979e6ae78da4f1164a92d132dc90e73842e"): true, - common.HexToHash("0x016f348790097d967bf7e53200703aa20c25bce8415dcf82de657a5e6a901991"): true, - common.HexToHash("0xff84f29d16a9712ded30f2838e3fc91e6c7dbcf7047bad61d61393fe2f5bf710"): true, - common.HexToHash("0xfd6c4d69450f711802ad41c48ba8e1bced5d6de7e78e1876d31c57242dff6318"): true, - common.HexToHash("0x069dd4d34ceb8fa9c8f9c129a3789bbb4dff4f0d5a1c09f31335bea573f94b60"): true, - common.HexToHash("0x9290d9cb6a09689edd8765d8f09d6807070e93b88f80b48fd62c1ae8c249e3d2"): true, - common.HexToHash("0x09cef4acadaa9c8ddc864d11342d76dc6b9e152611993f49cbf6e385f5e6bb24"): true, - common.HexToHash("0x0165d289147c5f992e75ae0fb18c96d057e57ffaed44faf20486def18a068ab6"): true, - common.HexToHash("0x8dd3201a455f94b9b6a63d2905bcd5cf2c3e9004a8fc96de1effb0c63dbcf015"): true, - common.HexToHash("0x5f30120cb81c906cc81c030b3a2d33d26cddea91e92406d6d007c59b1f5bdc2c"): true, - common.HexToHash("0xe286d533258758e20489cd8c0aeec3b93ef1f1cf5dc53dc1f584466f17681017"): true, - common.HexToHash("0xce819eed816372b4d2f66c7dd29ced7730a18482a46b11017149cbb61395009b"): true, - common.HexToHash("0xb34026526e3b026fdf0bd3aceebf8668b54d0e351a5c2924dab6e0182cca4cdd"): true, - common.HexToHash("0xfc7923dd831d1a44836ff01d58cc13fb64bf61a41c40a51707211597fb432fc5"): true, - common.HexToHash("0xa66274b85ad876e04de5eac91873f8c8fdfe3d8d7790badc9f184da30a970a19"): true, - common.HexToHash("0x17472e47bb616833bd7938af091211eaab15d0b3001d0dbdbe457bae8100d7d2"): true, - common.HexToHash("0xa4e0f283d5d870b34cea058b43545bc18ee7a9d8f30b83e5c7f985e2295421fb"): true, - common.HexToHash("0x0ef31005d5f217c181ded7af387a1defbbdfe1b4f7314ab01be3d05944b91fef"): true, - common.HexToHash("0x27615eb9e01354fae85e9f4e7d134c4c2df08f105547ac33a360ca82fdf3d511"): true, - common.HexToHash("0x9c64417e260accc6201968947c1d14b78e68a59d32a9115cf4571d69fadb3df0"): true, - common.HexToHash("0xccbd87f6c7194996a6f281c5909ac0f88976f7df75d935f6028f4b7601891d90"): true, - common.HexToHash("0x32a55fc069b2494e4ef19e49f4e7204523267d26cc2c15e81baf25cfaeaf44c8"): true, - common.HexToHash("0x485371c967b44ccedc9ca2cabae2bab3cdf6169ee8085503fc2881469425483a"): true, - common.HexToHash("0xe8203b1902d5fd6a46999abf8d51114f295961847342de655ed369c6386f9275"): true, - common.HexToHash("0xc5a8f6ea3458f7ab821dc0dfef076fe4597c427666b54981331300daccc7cd9c"): true, - common.HexToHash("0xcb5a35ce984f5af6e958490ea2edc9731998635b51893dd520de7692093f813b"): true, - common.HexToHash("0xa3741946fe2cb4eeb0589330858d759288410d149117f2e0c03b465fcc394861"): true, - common.HexToHash("0xfe6c7143230fa7fe0471e9af230f3308d2c7ca04fa128d69040d635d4b55c589"): true, - common.HexToHash("0x5048c7c404b08874e3eddab80bebd9ae1198f57ec4d81d8ac34e119b2ab4be4a"): true, - common.HexToHash("0x57ddbca8933b9dabd17ad761938ed7a5b69bfe8b98a19e82a373b27d468fb379"): true, - common.HexToHash("0x851a4ce969dee3db27923f66ec90bd3db051d5f7c308038c4587a2224d40f3fd"): true, - common.HexToHash("0xc337f523f82f12b75c3c0e4b02d47f635530b21b723060d6f4e0c9b6ba8770f3"): true, - common.HexToHash("0x8562e2faaa6c1a0f2a7056386ad48ba7155382fb97bbe04c713768e2ac4dd348"): true, - common.HexToHash("0x52cabd2073e80c87fdf9c121dd4d4aa3a8c63cb469f7b1e34f532fc253bd53ae"): true, - common.HexToHash("0xef9642d519ca561da12e9ac5084e32ca5c0ee18a00c2db22170948dee1eb55f3"): true, - common.HexToHash("0xef0b99959e2659d193fb5a8a7693a8e7eaf1882c39d9be79f9eeb4f763d78c60"): true, - common.HexToHash("0x0709ec9f6060c3e3c5128f8a11849056dfb5ba3d9efe25a38503bcb295cbcb89"): true, - common.HexToHash("0x882838bc1727012b8f56ec9bbd3297cefb879924e13cf7a51876a873acdebb31"): true, - common.HexToHash("0xc0ac776dd5e6e6b942f779121cb5edd98d9ce113837da6d36ad3ae97a8f706a0"): true, - common.HexToHash("0xdb42622847b5a83b0a34dcff316d00cd21f0a2eee9e4e2ed7aa7fb097db8fb37"): true, - common.HexToHash("0x44e948b3f4b246ef78bd5cebedd2d6241d811e11267886611303113b036d50d5"): true, - common.HexToHash("0x4124e3f954634d8039dfc13bbc6e3494d26b03a04ddd15a6f778ed1c08e250e6"): true, - common.HexToHash("0xf5aad0103f9ba8dd1a91229e46cc85b85fd1264fa1d39514cb93588042392b42"): true, - common.HexToHash("0x60b51fcfa36c7a55f59db2a6cc89bc56605012019bad40d8e4234d5474f26951"): true, - common.HexToHash("0x30aba54c4c8458301702b3e459297d4de3b659a00719ff6c699bbd647a8dbebc"): true, - common.HexToHash("0x2352ef23ba250ccbdd8cded88be9a153accb53baec4bb357a6fe6691a091cf4f"): true, - common.HexToHash("0xf7c07e98f7f2f58d09c4448799d4bce0c2fb62445145c3b55386c9e85aeb4716"): true, - common.HexToHash("0x8345e3ab546a01e10904133aa6ef516e9e574fc78f05363813668cb3bd27723e"): true, - common.HexToHash("0xa166d18c7fb171fdd857619548fecd11b41e08b8350cc89ab98c78aaf7c74089"): true, - common.HexToHash("0x7a65330dae942963934f7ae8d9849d2c780b838837b66e572f097065b18cee4c"): true, - common.HexToHash("0x1ea1fea4852e506df5e5085e67302f227980660ce3434795cb4d9190ebd980af"): true, - common.HexToHash("0x2c0b9bbacf6f19549b98e481bc9e860315c596889d20e61955829ff06bd55b73"): true, - common.HexToHash("0x1e822431c7e1810054f048f2d1d033aac77fef516b4974d122ea590f5538085e"): true, - common.HexToHash("0x11502bf955cb7da345570b97bcaa6c60ae4c0d5e3a0f24232fc23832200f7494"): true, - common.HexToHash("0xed9a91b386b5b2238f6d84bae83c3f95727316ab6f427cea6ff7fd2c68c0ea10"): true, - common.HexToHash("0x41a9e31e2388fdf44727e3fa60d3cbae4fe49529f245d5f8a4069e30db6fbdea"): true, - common.HexToHash("0xb9b8c146ae543e1ff13d34743a3d2050bb6ae226e5913fdf4ba7739012f433b9"): true, - common.HexToHash("0xae7421cc0400848c15d699daf946ec174e81dc0fa413302f4a8d6e2d92fe9948"): true, - common.HexToHash("0x7d35cab46ca5b7ea0c45583aacc1563c0acf05a2e5d849b2a06a03e5c5ed8c6c"): true, - common.HexToHash("0x56b387e217dd581385a72d62138372e241ce70093d73581ffb5de0d6a6793362"): true, - common.HexToHash("0x3cf7d79065e07fc80729498cf7f983d5c611eac04d5ff72fbbab50c75d33e313"): true, - common.HexToHash("0x321e8ff332751704863978569f670a892dfcaec8c62bb0827726707d13568035"): true, - common.HexToHash("0xbc54f11ae009da98eadcd573a06dcd506ab362e0227f94cd7a9406f0577a5cff"): true, - common.HexToHash("0x44cce24628fdb8469f01b57d5eadfef4866f1796f7fb28f9f972669f0f045696"): true, - common.HexToHash("0xc805b3629a4bc11ab59b1bb9a2b1e33052b8baae35b85d8897d52dea9d96303d"): true, - common.HexToHash("0xc716073fb838ed86fbce04a5ef583489670bf489574100ecb65a9983c44cca05"): true, - common.HexToHash("0x71b7507a561e32aacb7d707a4b7b08416577a1195e685925b2f9d8eeed3508d2"): true, - common.HexToHash("0x4f4c3c6326ed4f86a1252e9624141b65ab1ed4b6951fbb9a92ae9e8fdb88ade8"): true, - common.HexToHash("0xad43fa6cbab5b97aa800ae6819aa7d16b7baa3de35fabdbd12ebd9c1ccc9b0e7"): true, - common.HexToHash("0xf0edbf2fa2c182b7c4e625fddf76060d7e1a467b8812984bf6ea6f0e4ff5e0ab"): true, - common.HexToHash("0x0961d3999e64f70a63f00c079d9d6737fa3827d90cf08cebea514eaaae2d8c02"): true, - common.HexToHash("0xf41ac12563bf3cfbf6f1f326214dc22787fc86754ec5caa2072fe5654061d6fb"): true, - common.HexToHash("0x5bbaca16df5a4e2c304f093388f722af93267c9add52bb297a61bdeef01daae5"): true, - common.HexToHash("0x21fb7b1bea90908f7eb0fd6da53419d428f70e1451b28ed54fc16359649d9549"): true, - common.HexToHash("0x36d60dccd3255a6d7c1e3cc2af033581bad4c929c329784f106f2d4774b58cc6"): true, - common.HexToHash("0x0521c616bf6be6d14b7f07bbfdacc709711772b651e723db553ab10b86b42e8b"): true, - common.HexToHash("0xb610af4539350c98df1fdd1c25697072a6314d440f11f30ce9dd151bcb613341"): true, - common.HexToHash("0xd8bc56130ba0e9d29a4188bcc90b627af86e53e7ec79a3792bb13cfc58483d7b"): true, - common.HexToHash("0xd4e45e7847a2d8bbde6eabe01b052b48d85d75ab13a27fd6203e0e6e7bc52ee7"): true, - common.HexToHash("0x28d60bfedbfbb7d77527f164d81c70f76b95c9f8ad099088127e097ce9a7a163"): true, - common.HexToHash("0xaaabadfe05a2d86f137d4ac88ffb66a3bf45df4c348b49ba07ddfa4c98806f36"): true, - common.HexToHash("0x67f24b45346bd70cef60aa063e3a8f54a29f8c459c098599b0679ef89c85ecf5"): true, - common.HexToHash("0xe7cbc4edcc5a6ebef7e3352bf53cccc53f7a73185f91a6bf05b1a5441186f54e"): true, - common.HexToHash("0x86edb167220f7e9f6faadb2b97a249dba96f4e2d28c349bd65aa7b42d42d0b2f"): true, - common.HexToHash("0x807b7dc771f2429406d291645f0f1914039d7198e45c378ffdc4ead32da89cbb"): true, - common.HexToHash("0x09257b160d2c5dd2eca971d4a3220d67ecd8bfcc678762fbd8e8ce2ed893fb27"): true, - common.HexToHash("0x10ed277c36c49a87a86600b8d6f43f669b3baa117d0d3c517a29fd65c0041027"): true, - common.HexToHash("0x7e9e2639ac0a0a141b44fa8b9b60a210c18acde141d4153336c2fb30da8ff5f2"): true, - common.HexToHash("0x6444a2b941bd3cf23fbdc8a658d85f00069bc2e4bd30719b7409975b8bf0a55e"): true, - common.HexToHash("0x5eadf3f933c9ea6b71c05a1427eefc98c97eabd6af1cf4e5b02eeb48ba5ae653"): true, - common.HexToHash("0x4d5b282f4039ff6afd5b59a3c5658f6e088909d34cc5df8702af1c4dd4a96293"): true, - common.HexToHash("0x864e3c5c4bb04eaa3d0e8dec06542e65789f10a51bf88cbb0d1b7050471b82c1"): true, - common.HexToHash("0x8d8d52912940dec0aeb61802d49b7a89ab5d5176c831134be9135627d3ba6fd1"): true, - common.HexToHash("0x5aee4a713dde6322335ed9db17292a36afc5e2d55eb1d972d09dde9407f8da7c"): true, - common.HexToHash("0x00945ebcf70dd689cb98ca46e977f4fa4b52b1c1fcecf3793dba679d520a3047"): true, - common.HexToHash("0x6b7fcbfbaf6439ffac902f14d7964256e3ae46afb6d643d8d2b4164ef81297d2"): true, - common.HexToHash("0x516d3cca3b355fd54bceab34fb056c3313ae71cec91a63fc89ffc65ff63633a8"): true, - common.HexToHash("0x2dfc99969f81cd77f6f1a54db44c301e05de8b8dfd74880dec5379cf6f45bdb3"): true, - common.HexToHash("0xc0b134b97dea315fa08b869cb53b83a85ddbc8a09c632d6e3500c54efa6d0fc8"): true, - common.HexToHash("0xe6b5db359970abd3ec5069779a99775365ca5925448abb5377be10e07fbd972c"): true, - common.HexToHash("0x06d5ebbea1730618b595a67eb939dd3537b4e3a67dee2e2b198062b0c5af968d"): true, - common.HexToHash("0x35705874e8d173abb98ec19c28be2ed2c0e4d82e1e1993b2b3eab95e437daccf"): true, - common.HexToHash("0x46c181fbd3dbaf01c45c8ac69969a9d30c74305798dcd789f3efa5f42e6db6d7"): true, - common.HexToHash("0xc43bccdedad12e6776320b5d5bf2714828968916c55b5a918c676e1833da1c69"): true, - common.HexToHash("0x5db9f13f9339820419a661dbe815b0a96fde274d2706fca0c05f77644be34371"): true, - common.HexToHash("0xe68af631162afdd2112d791ba5ed7b60d1eb74bf57dca8fb7e151932ec904a59"): true, - common.HexToHash("0xed937a3d0949f624feb9a1d09dfcda5d94cb54cda51bf94d5bf7446bb73dfcca"): true, - common.HexToHash("0xaaf5be5c8943dfc677b766b9bae4729efd12253ff40e8f18999532ece4a94352"): true, - common.HexToHash("0xede7bfbc9073c32d8aec4a3a5fb335c6950828709c5c3a6e9ed0400fa427a9e2"): true, - common.HexToHash("0xf4ca5bfb29b5a799c6f5baca603dd21690c28fab0e4820056a7a8f3392c0df92"): true, - common.HexToHash("0x8cb59d18e0ae7fb65147589bb5bc55825cb9beafc3b1f121b940166bfb68e595"): true, - common.HexToHash("0xdbb347dee60ba27ce3e758338183111ea2bfcb1cbd5aac97731f70f331ce2b54"): true, - common.HexToHash("0xfa3f0f154b2175042a6a4665712bacbb8170d0ffe729674a203e3b1a637627e9"): true, - common.HexToHash("0x26f3040451fb7db6095ee0c1031ca1da65b4369f00f7c01344d0b6be55a82e16"): true, - common.HexToHash("0x8ec7cae4abde7effdbc1bcf98f8853b0d5f21642917add2639e9d042db277786"): true, - common.HexToHash("0x81777e7c92488432ad4a98ff6c8e2145cf21c96531ac5bd39ada695b6c383622"): true, - common.HexToHash("0x9cc8a40569bc2cd2dc5159c169ebae55eee570a59daff9f2e08597dc7ee66e35"): true, - common.HexToHash("0x2a22e6c4fcd2b1c59d3110e970acd5edfe4870fc3d0a3f540e01fbb71245bdf1"): true, - common.HexToHash("0x1ef2fc8d5cd60aa7b47aab30d54e09ce7d095eb7e741bb4ab7049317fba0a904"): true, - common.HexToHash("0x3c2ef64ae0f005c7a70bffcda0ec30f5925ebb6141076b503944145dc37ab230"): true, - common.HexToHash("0x7426a6a8295160e0cef528e4a52afc04c6772fd9217b0dbfa5a37e89a3b4b1d1"): true, - common.HexToHash("0x48bb9ee6e485981d55aebd4e07282830cbb9b2b99e12e864a563f602a3effde2"): true, - common.HexToHash("0xd7c2b50124a20029dd57e53df2b17214445b505508892b8c3c0ba012dc0618b0"): true, - common.HexToHash("0xd0bf7148c709c7e0d998121ae302ab61999746733efdf304018caa54d4493cd5"): true, - common.HexToHash("0xe038e8690cf1cf9c71e63bde04dfb79cbef33700a586296bcf10e01428aaf11a"): true, - common.HexToHash("0x241064a91d55825327bb67b49fbdeab8f5e955897910a1c8a0e25577a9b33be8"): true, - common.HexToHash("0xd2e5a347db37625692c002f0897b2c4ed6a3fc839ac9b5a407e52bc8c835af12"): true, - common.HexToHash("0x0ced97454a176f9e2faa98aba80b79bd320cc1e25d96ac4ecd14b9f8eab18552"): true, - common.HexToHash("0xa5e08e276619e8fe43a893c7b6373d57bc92be7938f4095ce21368ab1ee48167"): true, - common.HexToHash("0x9a5c8510603abec5b716bd4c03804f65c630e26e7022f7c238293e75baee826e"): true, - common.HexToHash("0x6ddcbdb3b5bf0545afb8353ed6e4758eb500d421b6e3d79e513ed55e630fa19b"): true, - common.HexToHash("0x33c43bbd4c2cb29d4b7540562b8d6c3fa820031b965844aa557be31a13026146"): true, - common.HexToHash("0x2d7f10d34b6cb9b5f14ff9c7fe886b5447755c0b3b50d53a4237907a545b798b"): true, - common.HexToHash("0x956240bc9612cdccf3ddd10b4fc2d37e1eb352c0f92a9e4e08dc73568dbcd185"): true, - common.HexToHash("0x8d42b7f675b8886b976e77e15f8e8dbef0547515e695ad2f3e7d8c95a25ac022"): true, - common.HexToHash("0x5d790d1c2974aa6d8803a5b7caa29c9fc5dd91804f6de66fef22c51b4ba35d0a"): true, - common.HexToHash("0xae9a23db3eb701d243b4d9b1a45d75e1bf7f501ea1727f13c6b4976bd5be4b72"): true, - common.HexToHash("0x74c243ebe178d42df9c1d9916209972f125f5a2ac25d3e5963bb389dfc78caf2"): true, - common.HexToHash("0xbfec8a4620d9f0ba322865f8826236f1faa428647093d69ec7b0b9308ae4ca55"): true, - common.HexToHash("0x28d2caf91d78c58aee3bbef40132c0b36d913b320e93326d75523b62c199203e"): true, - common.HexToHash("0x623a2da5cfc07e6a7345cd08692b6f4f2b15a59b7afd84a3dec3a7734fb8a8fa"): true, - common.HexToHash("0x05810fbcfdb86c94b14acb297e5ae2f7ba6b73134d28791dc53fa2542dddf326"): true, - common.HexToHash("0xbdfe182aad93124df06efd89dbb05d01b7c48a21a87964d9b71f583913117f0e"): true, - common.HexToHash("0xe2350d863fa935c182ad87fab340f8dbbe3e7540af0a643fe960d876948f6fbc"): true, - common.HexToHash("0x4a0cc768a8f62713390d5c319284cc0c32e7158669f0a63bf37107f77eccb477"): true, - common.HexToHash("0x1d678a25085792897b68aeee004f4695ae6621bbcd7d9c390cacc982f059073f"): true, - common.HexToHash("0x2f7d5d7a1a5aafa318fa442f119414f27c5f6bd93a33685c62c54a32931e0a5a"): true, - common.HexToHash("0x5b6c20fbd05760f8d1f3c0caa0cf45442c368b34ef0e309e309cf263ecb5f99a"): true, - common.HexToHash("0xa5377f8062d163930fb3daf92e2a3c4031e50bfc34230c0a0b4fe72c7466fd8c"): true, - common.HexToHash("0x46e8b3a06a6538614071ad6e2fb0f3b4619c5134dcfce1403ebca7c7fc80544d"): true, - common.HexToHash("0xf1e81d0c2b0fb154784d2ea561d691ecc9d278bc25b7dc99ae82172ff568e363"): true, - common.HexToHash("0x02e42966103f8ce8118200844accc687c6f0aa10b62d867cb24577bd8256c18b"): true, - common.HexToHash("0xbb68f53523500affe92f9b1ac8596e2cdbe7b2800335da09bd3e6c2179d48168"): true, - common.HexToHash("0x46e461c99a0ef8c94f48e0863f5e05af4a7264402b61a6ae97bcb2cefda2c9df"): true, - common.HexToHash("0xb2ffdfd03dba145029dc8af029de2e3b2240fb3238033502a2c58f396e68117a"): true, - common.HexToHash("0x5e23ab25b50828aaf5f231b5d0be840d4221f48baf017326ac43c580242953f9"): true, - common.HexToHash("0x62f71716b2711eeeb30351329fadf75fb314bd33ce7f8c03b17ff4568b416e5d"): true, - common.HexToHash("0xa71291163e5c215ec5219742871b7e429b8dcfce04e89d42844d8b968bd914e0"): true, - common.HexToHash("0xa35a0866d00bb71d689b9b42ff52a3e5f2e5ae2a67453fdf3eee3527e0944b13"): true, - common.HexToHash("0xd059193fd7aeb43f15762058e7d1452572a902d78557b4d5944c61eeaa899fa8"): true, - common.HexToHash("0xcdfcb863e78a4f8609ed428629da5c6a6ec794c77d8d9cf49d2bb2daf3b2365f"): true, - common.HexToHash("0x6b382bc4b16562ad156564211f5d7bce47c1c0e7f2f5fd73ccd60d94905327f7"): true, - common.HexToHash("0xcf15cc17a95062a7be3945a302e4623d1749c0f9b3fba2504798c2bf139b2203"): true, - common.HexToHash("0x878cd83729593ef2191c2cf13ccc12cc2b7bb5f31659959346cc7feb3be6792c"): true, - common.HexToHash("0xc5d8a1b680969e66ec85cd00ddfa6efa5e1d2be2ca0f8088f2dbb9123975c7e9"): true, - common.HexToHash("0x778aaf617b1196d160708b6b425cd91b1b4d5b8bc74f1be9ee80eb8d2c0538ad"): true, - common.HexToHash("0x1960065c878ee8c4a2b37a381ba09a2b82f6179d357ff22376235cc9439ea3db"): true, - common.HexToHash("0xd8c34c6c7c4dd211b737428d3e48a713609ed419781fb71f3fc41314be627bb7"): true, - common.HexToHash("0x660d001155ec3f0a442eb5b6d03b0b6bdca1de0f13e0636b3838639edbba159a"): true, - common.HexToHash("0x6f552e916ae896216ec08b408236a76d4cc6ae13a4baea375dc82ee2f213e183"): true, - common.HexToHash("0x0d57e0b7a88b0e768e5f97226e24450cc34b15e67ca922c1b10dc998307cb018"): true, - common.HexToHash("0xe31c3564bd51a07c7c65fe621ef50c0f3adc5f8a7ab6bf32e5ecf03e5164427d"): true, - common.HexToHash("0x27c9bb9c319e4190ede562cfb68d9e34dc7e9bd727e48b750bf6881b7b77c865"): true, - common.HexToHash("0x3307c30c51377c49fa3737387156e33d31a2c149720cbf12a8b14f8535e5c640"): true, - common.HexToHash("0xdb75896efb19d916bc753e22182f68c9a46461cf7d5ec934ec696035b51c4f90"): true, - common.HexToHash("0xaf357ed652cf38933e751ba268fe26778502e04b3d007010b7808098103c4032"): true, - common.HexToHash("0x7dcb1225e046be8d2fdfab9ec1cf068538316f0186f258fd5501e3b9298e3a7a"): true, - common.HexToHash("0xed05b512d82ab0fb15c37dd8d630cf6610fa6aca909e34a615729577cf9baf7b"): true, - common.HexToHash("0x5172a0423628096b34c5dc4bb87faa030dd79e6ac3c84b10cc46b1159d4d1fc3"): true, - common.HexToHash("0x3b1fd0afbf1787a716f5438c40d3ee85503dbb18874565307fe3090a0351dbf0"): true, - common.HexToHash("0x9e5ce75e46851253efdb0017809e8b3a03d94ce02e42c3335c018946acae6697"): true, - common.HexToHash("0x375cf2ff09ecb0894ee31b19f1ba30f57b736fa3defaeecf1e6370bd379bdc91"): true, - common.HexToHash("0x67aa81d40b23fb6f824be8785797f3e0e8402887002912f65d541e3c9e576fea"): true, - common.HexToHash("0x8597f66a9dce378153ccfd8c4f102d8a1c8e228a935b144c6c8e90a023ed9e26"): true, - common.HexToHash("0x4c54aa5213a3e496ace463d254932b1e0cbee264856c45ec02414a7baeed1207"): true, - common.HexToHash("0x35b350d32eb8c667af0adbe303707d5706a665b0b2197b46416600329248a49b"): true, - common.HexToHash("0xcd1ade2596858c32c1f06b56d4fbd5d54c38edad67fe3fbda5a5cd345d14fa8d"): true, - common.HexToHash("0x57ff68a87ca8c69989112b7c2883f34480ed699dbca433d6086255e3b881ee3b"): true, - common.HexToHash("0x4987b8506e5687007993490bc20cb4b775a6db7a2a65dc11d776a55498e9b888"): true, - common.HexToHash("0xa9e8d65bc6edbdaf8d825e42b536b0949c6a7429c7930f93ec20dd882d528768"): true, - common.HexToHash("0x9585ed83fa529962975407136b1fee6070cf3c0f74f7ef72607be8f4e8efcfde"): true, - common.HexToHash("0xc3694e1a5f924579a02549ad9c91adf13ad3cba70b3f323827bba2e28d40a855"): true, - common.HexToHash("0x2b4fcb8483ab17899c9c401ff5948afd70995045d2fb18d8d314f353aba6277a"): true, - common.HexToHash("0x59ac068eec79f8d3eb45625d2ae4103234e6ad9c26cb7453657c48cba0844bf3"): true, - common.HexToHash("0xb5234623f12a9bb059eb7394b4b346ae30f0e8d66c46eed74daaf1584a20e577"): true, - common.HexToHash("0x5877c201b683a943f5f7a25d3b0b69d85f120169c61e4167ca37ecfcabae0745"): true, - common.HexToHash("0x77282a90d6a51333820c80bfda358b3321653e63d1a229b493773b4d1b28954b"): true, - common.HexToHash("0x763b3666c25d58d785490e8f72bd4e4f79df1ba02154f0befb11ea52228fd5ec"): true, - common.HexToHash("0x02d14f7d04f85f6630f2a30bee7f5ec3b6fa232cabec0013d22f812bd661ebba"): true, - common.HexToHash("0x04bec3bc3295834130658885846ad986b972063aa40a0c346522a984bc428a0f"): true, - common.HexToHash("0xe6a736a399a24bf71a7436d73a77ba87b20efc91e2b3b6a0d9aa817159693fdf"): true, - common.HexToHash("0x62f0be412b1e45566593a974dd80e733df0257bc96cd23ecc161100b1d077ed8"): true, - common.HexToHash("0xa90bd881680550c053610da261ec5ecf6f480f8753e0f8223b7a8d5b8d53891a"): true, - common.HexToHash("0x06b1bc13a9053376b5b0b25b434f7c76c08577f9b36f707e8368c20603d82139"): true, - common.HexToHash("0x1646dc6b6a4549eeff5b55eef3052f40e3c593fd121f8927ae413cc8f1815640"): true, - common.HexToHash("0x778b8e65e659c590ee6f97eef32bfd3412c324c38c5309ae28d80823d405eab7"): true, - common.HexToHash("0x55b0d0d99f0d449e37149921d5f747ec5e5f27b729d0a45c3738cdd57b3a7a7a"): true, - common.HexToHash("0x653c77735d6ae757abcef472ab198b628c2c23789ee69a818a3383c783b4491b"): true, - common.HexToHash("0xa8132a96964c0f76a749f3afd91289afd48d39cfdcc85e598c80cf44e08ba728"): true, - common.HexToHash("0xaf0ba122ca822609b6a4c79d36403a567e3b2fc421a58e011c6a4074f275a947"): true, - common.HexToHash("0x7182bcdaf3ae22272912352c9d829f5be8fc75d2eaacdd3ab1459b55a9d3981e"): true, - common.HexToHash("0x1058152b66730c6c669d8f1dc6c66ff33e5ef9f9f19893a6215ea77704ff77b5"): true, - common.HexToHash("0xa43f05c957b5c236b5e8eaf556cb5910d408b8fc475532846ee77690034c9337"): true, - common.HexToHash("0x8c538b484bfa1d72bc846cd12a4d792aa06ef0393dc7114661d470be0bfe2563"): true, - common.HexToHash("0x11b203aa376a39bbf5c39230662491e762d6f3432adec12904bb87b019563f38"): true, - common.HexToHash("0x6a0dc907dfc39b10113c9e60920a68daf7b8f2bf53636edbeaa91de59db241a6"): true, - common.HexToHash("0x9124302cb0e0793873bbc00e4b0badf62aefe1fbb3b792a8c6290e8b4e8b9c8c"): true, - common.HexToHash("0x99301208b1548964ef1b92aa5b1fd459f101a15683a70cb6583309ea347a23d0"): true, - common.HexToHash("0xd5f3df5078e76f2e9d9526ba8a9ed05a7141d1eda11e98db0e0da7adafe8ea23"): true, - common.HexToHash("0x6005b202c5a607c611d16a0e29b2e2449dbaafd1a764f4f9df5f9de462fc235e"): true, - common.HexToHash("0xd78b5ce12869f41841ba061243a171451446b6d8808407aada52de7916834643"): true, - common.HexToHash("0xdcfb49fad0fc3b7eab3bf4d8125aa06a4d3a79615784d25aba335f9dd6e73903"): true, - common.HexToHash("0x8fa89355c9302922de9081b52f5547c43cff09f80055fd082515656a89bfa686"): true, - common.HexToHash("0x95cf358d9482f2da8e34eaf5789751142c547e2f2e76b2e0f53ba73820c71bdc"): true, - common.HexToHash("0xd66beed64b5cc96dff3cc4afb8215a071960be05de0719679823c928c2ce3d7b"): true, - common.HexToHash("0x7b20bb743eb89ea289ef14d6799d2623a5cad50c24b4a80fb8ef459b40b985b5"): true, - common.HexToHash("0xec73333cf7b326cc9b68bbeac3769ad5bafe5bfece9d12327403b4a65b6f4992"): true, - common.HexToHash("0xbca61fdba239980320dfeb74536e7d3d4e29cc4a8b1441d7d5df7b83fadc2847"): true, - common.HexToHash("0x0ae6023c9a21507c2042a686d5b9a7dce14161d7956fb1ce66cc89c57623257e"): true, - common.HexToHash("0x296441a609485b6c5dacd7e34fb44db404c259063035aad508557775da182eba"): true, - common.HexToHash("0xf01939b191106289aa9fcb8a5f169e4f9a80917e1bc3d2496e9ec645f4f80c39"): true, - common.HexToHash("0x57e2019a68b752ace95446d291f491379deec13b592fffb5d7b727b6d3f060ef"): true, - common.HexToHash("0xa16ed6c64af53327edd6e15f8496ae13c377e75cd6afc753394337db92bec350"): true, - common.HexToHash("0xd6ef2746f6537a90c4e249cb5507501aba9a789f1a263ceb52c790faf22897c9"): true, - common.HexToHash("0x82245a21bc1b638b7e875eaa193b678daa105f896f3a54500fe725375fd9a4e8"): true, - common.HexToHash("0xc8e653adddb389696f64b2a17ddfe9e589a5c4faf0a3a7a3cdb780372db0f2a8"): true, - common.HexToHash("0x0c34e3f8a181cc38187524635e2f47091f5668fe267d0ea030478dcf9ac259c0"): true, - common.HexToHash("0x4e9e5fb779e6cc41ddc9a4a5ec63ed1fe042a8249cb48ce19655842a3e8534a2"): true, - common.HexToHash("0x213046d3060cb446cf34e726531f23c6413eda8e45ab44aba1c9912305506419"): true, - common.HexToHash("0x285668b5d3c0232021dd755aef51ba79d97601f13b8ae2e470ba21e67222d996"): true, - common.HexToHash("0x412f7710621249426d3d92871818ff1835397bda2a3f10d6396b8ee7fa68b4aa"): true, - common.HexToHash("0xe21d58eb0450b41aa8b8869837d26078b09c57853fa09b8e847ff637666d9c07"): true, - common.HexToHash("0x8b957c9bcb782609f19a2dd9caaf90cdb5cdfdd0cd292515013adc97f73e6727"): true, - common.HexToHash("0xb89563f99793f6fd203cfe2ed4242f9ee30eefb6238bb804d2632f51da65e807"): true, - common.HexToHash("0x4c19a7103c55cab53b5dd828db032849b577ef92507bee18c8761160293a7e2b"): true, - common.HexToHash("0x8fd8b1c4982a5094adff253022081a54d8fb8d66929cdf73f4b5def9665cf916"): true, - common.HexToHash("0x7a99a7d94ec18f7fb10043836d515245382bfbe4699cde22739e4c1e76ef7470"): true, - common.HexToHash("0x5df159621e3b13a98da9e2749cc374abcecfc7639b89cde02563a234a6b65bb4"): true, - common.HexToHash("0x8687fb1a2a372cf04c64cf21d788c133f17f60a18c8b58546295c76d3bce916e"): true, - common.HexToHash("0x582d33e4531c0cfa8365b881b1ca4b0b5f6bb90b983e9691e50f6742bde28e45"): true, - common.HexToHash("0xae42675e8c1c2dffcd89708f658d1317efdc0df276c10396f5867b7214f7fd3c"): true, - common.HexToHash("0x30938a179ab90751b8d5a34fe09cfae09d6cb86d572519a6b78f6d2018cee29d"): true, - common.HexToHash("0xe553eddb8a5b510071d105d5510c4b1a690ee78a2f4f65150662918e818a5b1f"): true, - common.HexToHash("0xc3f67df7798dadac0d6056b6eb74fc6c69230ee858fd42aa8a3c0e5fd92458e1"): true, - common.HexToHash("0xb35a42d84b4f2d8cb4a61ad4223151c0e5d0758e08cd0d89fa94346eac5755a4"): true, - common.HexToHash("0x339f02c63f8e1356d324d9e5ce51eb22e05443a60f511f7f18c90ec0a88bbc88"): true, - common.HexToHash("0x803875bb7ba9c0a2d92c42b0c57b4626a4bd1e8369b7d5ad3e59bc6a6d6e4cf2"): true, - common.HexToHash("0xa2e4a09ac964303fb7772ec5d30c387e39a7775521e6a7725bfc46ca77dd741d"): true, - common.HexToHash("0x0a4bbfd082c046e181001fa4370dec50c064aa7baa9c1323915b55475b979d48"): true, - common.HexToHash("0x71388d8afad2ca772c5476a21c73487a6d216c7c8a01132b0c45b28a8a0a6aad"): true, - common.HexToHash("0x1b7e09165392c7ee80b507429c7f97c3ff987cae3b14462af7eebb17751ed17f"): true, - common.HexToHash("0x8c127958c4e670626ccbb879815e551538b8c189f3bf3da6895be4e8606724a4"): true, - common.HexToHash("0x598ba30b90b3f8996ef8cb4424bdc5faa704da85e9c517dd9ccf839867841a82"): true, - common.HexToHash("0x34a108ead7dc32e83e34b1cd51d53393f4cd50db9262c1150f3bc58bae9b647c"): true, - common.HexToHash("0xe94544987ed72d12ecb25a02cede401cbe0e32882fb2144245753c760ef8284d"): true, - common.HexToHash("0x8629944ab1e873e0170c87d91656c3b6f19af0c2556f683275240738c1244cea"): true, - common.HexToHash("0x6b34ed5bbea55ff7e9c06221f6dd5acc3653d5430007d256d1a287469dedd055"): true, - common.HexToHash("0x2f2ca4e594d0f834c9edf30f079bb6fd3f0bda0ce61d86163b7f2b1df8aeaad8"): true, - common.HexToHash("0xb93efbb657110e6ac64445790e9e683cd9b4e49473f4362402c5334464cdd29b"): true, - common.HexToHash("0xcb577c62fffc61057d1cc2d1d5d95f80c79bd80a3abb63ed922bb3855c67eb76"): true, - common.HexToHash("0x24b64cdb6771815089799a228303edee959c0819396b3f74c6cab5c5770f64ba"): true, - common.HexToHash("0x8b669974ac29864411302263665d5cddbd6f0ce145f63f23f876e600793b8ec0"): true, - common.HexToHash("0x3aad6beb413a74350e8502531bea7bf42e123e87ddc11eecffc8c20018b34bb7"): true, - common.HexToHash("0xd8091c9b2bc633a4b55cf10f84549d9685a701317c000a5912e4af08270988c5"): true, - common.HexToHash("0xf12853bb7c934a91e91897bf9cb1839cf8a2cf49b6ef04c09d62769af9602882"): true, - common.HexToHash("0x5c8f902e6711f5b4cda6d459540f00f3f6e0f32d5e63e7c2537068865fe52b3f"): true, - common.HexToHash("0x436d12b39cab4a71cf854a2f215f59ef103bc3f66e0867f764e7f9a6b55d693b"): true, - common.HexToHash("0x049f8c94f121ad1ac69d9cd03497ffec6ccc381a4957e4764bdfe4bed1b46794"): true, - common.HexToHash("0xd0dac6a148895c594279bf079dcb1a7f9b7909eaa77796a756466ef2c8e532fb"): true, - common.HexToHash("0xcf5fea24b84d855e8556a00c74a7e25802c07a24178a68f1c2f7613d00ecd756"): true, - common.HexToHash("0x2d4f220ef36d43c766d2259b89168a802c1c600d3965abbdbe720f0dd6a17d9a"): true, - common.HexToHash("0xdbc52c59a0472b459b39d72eeb8b8721ea8b44dc7087609a32bbc5104d171d15"): true, - common.HexToHash("0x268c9d1943a195da35c6146068f600372db80c3f15d11e4d208f51561881bc8d"): true, - common.HexToHash("0x35603980ac7cbd2eee882d8b0099f4fd24754cb129aee71f313dbae4af979f14"): true, - common.HexToHash("0x576aa81d6ab1d689697e7078b63e1acc509acd0d0cb7882c779cd2453054ae82"): true, - common.HexToHash("0x61aab7893b2fd16ae4810ed321eb1444ff706d1806769aa1ddef4e5511326e59"): true, - common.HexToHash("0xd7d643362e04b02e7cd33791b5c724692d7d7ef335378d8eb38d049aa3cf971e"): true, - common.HexToHash("0x097ea9c844e3920a16e8abf8061b185ca8067b7df86b501d9347e3d9f37b0dde"): true, - common.HexToHash("0x39b1a67f34896b0bdf6068607cbd838159fb7b1d7e78b3fc72735ca76ad86334"): true, - common.HexToHash("0x03c295d15bbb0408fc12444ab20a5e46124de66bfd7f9874bd10a8ada2ce2643"): true, - common.HexToHash("0x5c2aabd4ff210d95ec437240932f651b717898e35785fe5c16845372d7016bea"): true, - common.HexToHash("0xb152fdf265c9a0aab2cbab7b8342d021b275dea9400976e0a0f573bd06e0379c"): true, - common.HexToHash("0x7cc451cf56a0af964c826a0a0901c3253265f5f73170a832ce50783f451a4c2e"): true, - common.HexToHash("0x49043ed2a30380906a2e2d6e0a4cb19e4ecae16680ab98af520d200e47f9bbdf"): true, - common.HexToHash("0xb64a39dfc4e2b1a24a2d8f0534ed32d0d554af834770f7b45767bea135535c17"): true, - common.HexToHash("0xe398f3bc69ce6c4af7ab1d1de29f199e797402cd7cd94c79f591136f59d44c2e"): true, - common.HexToHash("0xf44b87ccc1765084e0ebee0bea518538d534786d38b996227b2590baf3a5e551"): true, - common.HexToHash("0x353912f02848f8e6a53c5f10ac1190f15c0beee66e4668d825316bd258e3a3fa"): true, - common.HexToHash("0x5a3ccf8c0715c953468cbdef0f27cea111910c1ec1c97dc4d7b647fbb16339ae"): true, - common.HexToHash("0x09cd0e1384857ff5a2cf4841b4ea736342b6c80928e812c8dfb0cd621bbbe306"): true, - common.HexToHash("0xee63b94202489aaa46262c3d7bb360221c86ae056f8743dcedd7465d4fcb3544"): true, - common.HexToHash("0x28fe2d1a88acf98d8887fba5b99b08047f0a3ac073973eeb98ae30d3d2345110"): true, - common.HexToHash("0x0d19b1de83cfe1c90d2d57037092970cb070040ff2f14a7f68f3e4705247a062"): true, - common.HexToHash("0x7e1873987f7c1a43cb3152ac39584b14ca8b0a3e0586fda4702314310db1672b"): true, - common.HexToHash("0x60add8041d699923647554ba02a29357b789f8d256914f1954d907fa3d49eb44"): true, - common.HexToHash("0x78f0aae47130458301a04a2556fd6d785ae047c9a523fcbf7a1d8d767b48ced4"): true, - common.HexToHash("0x6b7217a3786461348a64ceaeba78fb5f3ccdcfd49d6e91aad1b3ad4623fc913c"): true, - common.HexToHash("0x2d008817572a9e168f9b54ad78af38e320dd8c0db46e93d2a4b84471d03ec0ab"): true, - common.HexToHash("0xa85c011b3e988da1befa272636bd3757a3d8b4b90afae4a26397a6f891d5551b"): true, - common.HexToHash("0x9090006f0f790d86d4b6b7bd1dc61023a63e827d31409ce00f777c4596b03495"): true, - common.HexToHash("0x8924fff54d09a8f88346e7ab640cc559dd4f5455cb5fdc3a3eb24f68daca7e44"): true, - common.HexToHash("0x4987aac3e72e270c27e75885cfff6b8e325c16d2b65b76b6cfc5aadde5c9043d"): true, - common.HexToHash("0x976cedd2baa1cfd7d95e5ddb2b15465df8c2bf5a1fb794b0c9bf68cde9e83fe0"): true, - common.HexToHash("0xde65651b51ad91e75ab4b044d3fa9911b832c3c8528ef07f305e8b83ebb67671"): true, - common.HexToHash("0xa86129690e394219d26bcca756a0f20e63612672da875b81831d75cf899f12bd"): true, - common.HexToHash("0x1535172ac4ca14f972a6c1a2f86beb8888f4795f1499f7a03dc8e7fc944b4645"): true, - common.HexToHash("0x01b0ad9ecd7c10e5ce497db9d97e3019fe998af4bab8b0261718463c9ced4061"): true, - common.HexToHash("0xdb3675502ee9702a57b61fd34e24c12d988f3873ddc131762915cfb7832f0af1"): true, - common.HexToHash("0x92d01884c4b42260ad367c4edac27c60808fa70329c2a2d09902b3260eefa7fe"): true, - common.HexToHash("0xc5135d8886971edb7732f0f8f8a7c4c59c83599e54afa80b6754e1cf9abcccb7"): true, - common.HexToHash("0x559d352f789d958bf23ad23f623d794d12469404081a822031c77bc6e104828f"): true, - common.HexToHash("0x97446496ab010d137b64b7b8d3e887d6543925ffcda84987f96637b471baaca6"): true, - common.HexToHash("0x2df984affe2e30b4c06e7e1ed225d1244d92a063e3fe7c749a2903ed4e27c783"): true, - common.HexToHash("0x221be0f09cb6a76ff61abb0682bb7606e36830b64a2ba3936341359de74ce6dc"): true, - common.HexToHash("0xe3cb2bb98097f3e6f3864d8b15283b27ed3555591dc3074c81e5e9e160e8d37d"): true, - common.HexToHash("0x0129b5d141ab351b9c9e10f1d39ecf9dd7d7082b9ae5859188744b749ec982c4"): true, - common.HexToHash("0xbf2eae74c7522e0a56fa7ac29d336c3fff438b2b375d53275673b01f3c276212"): true, - common.HexToHash("0x0ad2e496c0c302cb3f613e05d70a519c37d2b3b7245c25d737c3e237eec5e8bb"): true, - common.HexToHash("0x65bae1f933ee5646dc1da953bee2358dc98c06f5995661d56cb3e982f591d6a1"): true, - common.HexToHash("0xde6ab43dd2d0dc9fef181e100fd49cbda79654561f6bf09540c1781af41e2bab"): true, - common.HexToHash("0x678f2ecd51220803e479232360c7f5875cb7a1ad5b8e698e36deb642e5a80458"): true, - common.HexToHash("0xdeb8316b76c8bfb717442195510a51212a787e293634bf74d9020d5632671226"): true, - common.HexToHash("0x140e19af7042bacf2f130cd95e9bbfd899098b04359aee345ad989a801d84a6a"): true, - common.HexToHash("0x9152789bac9624ccecfac0b4df2328e74a6e205c710095121640a65fa2c85b4a"): true, - common.HexToHash("0xaa4dbc5c774b8fd43b4d47432c5dc3938ee06f96a3fa8e9c30a4b95314144332"): true, - common.HexToHash("0x10130326d3475419d2d5e9a9d6b24bd596de32b84874c357d4eec8cb4767a110"): true, - common.HexToHash("0xdd70d41aaf8ff8b10c9c7e5580da5ec4d4adc7a6bf1ccabcecbffbb3777c79c3"): true, - common.HexToHash("0x1898ece6bd58da4237abd319202941fe4300fb0224764609cc5b5eb95149d20c"): true, - common.HexToHash("0xae3fe2311ffca22dc42244b58279e402316e99dd02c1cae1a0b92cf4b1d93c2d"): true, - common.HexToHash("0x0b562978f3b4ce9f78cbfe651f0533c254123da01fef351a5729de9095262cb2"): true, - common.HexToHash("0xe3518ff78efb1afa66c1b052abcbbcb48ea1e1386ce0b33be03e2f87f323917d"): true, - common.HexToHash("0x044e97bf74caf83013cf14190474005d28d9d9eccf902bfa6b85cf9cb1e96ac4"): true, - common.HexToHash("0xa7558b78b75ed49b33d88de0558c15eeb1c3fa2197e5bfbc7343048d3bf49cbb"): true, - common.HexToHash("0xebef9cdddffc8f359a533865f88ce7fca2c08552ced75eca5f1875607c49feb7"): true, - common.HexToHash("0x66db70dfcbffef66c11b67d11ac3536cec642f666a6d5e939e2d317d065a6ecb"): true, - common.HexToHash("0xef4825d5e5207b4478cc120054cc92334b43582860bc55307691d37121d78e55"): true, - common.HexToHash("0x3355bea255db60c49565bb4626d5009e31db63aa750d3d8d4f162e80ab8ed718"): true, - common.HexToHash("0x13fd5087439b1dfdfd6b64dac81069f17ccdcbf1e8b18684aa01ad58f5555c97"): true, - common.HexToHash("0x6309fdba087349e0c9c59b776de060172c406fa5fb7b85a4187b0ab8e0b2e423"): true, - common.HexToHash("0x3084eba593d1307a77e01510128d8755520b8688293eaba94b98d41cd3291a1f"): true, - common.HexToHash("0x909756afc03c274942d2dfc245abc6c87dd3cbe446c36c72682205e01ba0683b"): true, - common.HexToHash("0x195596e7a7c9e23bd8b915c6d5180c4756e0ba27feb0c2ee5cee9f7b1a44502f"): true, - common.HexToHash("0x7a403ac31d225419fb675ba0e0300ee6e17c79148ce3bd9abdae4dd632f2ea6d"): true, - common.HexToHash("0xfaa79ce79e2be4dbb19b89921db465cff198472a9010326f1015b5041495a60b"): true, - common.HexToHash("0x4a9799da391f77281c5742cd14f13133311aec72dffb6457096fea2db25b3636"): true, - common.HexToHash("0x985038146108f48d929ae2cd212ee9824faa388969161f9a681c923e65ce6886"): true, - common.HexToHash("0x1d07031f587f20f258b70a68507bc75ffc00ddb06298a6461d0256ea3629e40a"): true, - common.HexToHash("0x967743871dd3f736210a1b8070a9233212714a90206c2b907336196888178f82"): true, - common.HexToHash("0x1a9ce8ff1a69d551baf35afff1adc7a96aee4c0e5e114b995db8802ae5e19b95"): true, - common.HexToHash("0x3740e3914391a3e199209b770456dac73e3a584fba4048702acdf0f04af240ca"): true, - common.HexToHash("0xccdb2fa5cb051e060c0be8df1b2ea7fda46d7a6ad67e4841bfe574068e2ea4f8"): true, - common.HexToHash("0x4199fb44eac1addc3b57fe9ed82b8e9d9c92522ed5b07bd2e7022fce05d1b802"): true, - common.HexToHash("0xeb2dbc7d7264f3372f8e10bb3300efa2a9e652014788e5700ee118c505bdc7d9"): true, - common.HexToHash("0x2bf3839f2803b811f7517b545c39d4c87f1c895b3f6207ba5f8b827ca42864d3"): true, - common.HexToHash("0x1a4021532bbb6cb4076fd78e55dadef3c4dd71cd79b16032eb85f7805f0dbe47"): true, - common.HexToHash("0xe38ce98192649d5be6b8df228973c9e5f827cbcf9f440c4f2efd917f895ebfaf"): true, - common.HexToHash("0x36bf0b42f387adb00c0992c69f7a49a1ed8f1908ac0b7f9b8d8bac3c5296f8ec"): true, - common.HexToHash("0xc2239e20dc40d31e3fcc3da15edac74178e81b54684b573df132294da76d215f"): true, - common.HexToHash("0xab6f8610d1dc5dcef6bd609ba00073569739d6b5448aa446c6eb51c2226dc101"): true, - common.HexToHash("0xcd6e25bcc1899ee213f5bad24de75952ec73aad008b7be64322a1b3521a5a483"): true, - common.HexToHash("0x5907e5903d96d21d5c582627ea63b56dbbe308bc5681937f16a9798834f8f373"): true, - common.HexToHash("0x943bb34ad916c353f9ca2f94d4585ed8aa078f4a90c8529ececf293307ace026"): true, - common.HexToHash("0x3356ca2610645f232214a5d285d81fb3afa6bbc925004dadc4061271982029ee"): true, - common.HexToHash("0xe032c831a3194af81ff7faa7e4da86be501f009c2cbaf45c2ff7ebf1b3cf6322"): true, - common.HexToHash("0xd0b30cf0114140a908ce4247c7be3afa49e53c4004c65b455ffb141c1dd3fe74"): true, - common.HexToHash("0x391547307fdd13568c49c185e3e55aa42b132140ae2bcd3823eb5c58de1fe9f6"): true, - common.HexToHash("0x6ad38f5fdad23b9b4acddaf5464504520494691b7410fbd8f9a633359e2f9c21"): true, - common.HexToHash("0x2e823c83fe8a3fcc23b1fde2439c0f07f029b2562a82a141c2950c963b2507e5"): true, - common.HexToHash("0x7ef085aaee129accd9f9d3111c9cdd39290473e67bf30653a19bf86877fbe177"): true, - common.HexToHash("0x99c6e501278cf434fbc72a51f91f91779c7395529618cf3d31d837ccced9c105"): true, - common.HexToHash("0x69009040100143f292b70a6620c14468139db36d6fba6051eeae2842aafeb659"): true, - common.HexToHash("0xe8d3aede1c0f4a18d15d8ea5b1773a3aa2c1efc36d49814774776c88e2626b7a"): true, - common.HexToHash("0x92c02a71545246e69277d5dbdb1f0c6f49eec1396ca6b9aacc5c942a11cdabed"): true, - common.HexToHash("0x6df51dce97e365ea026af46a59e169d3bc199a3884129228f41a7a85a5f7f3e8"): true, - common.HexToHash("0xacf4c857e95a89722bd0325404afe848c6ac9a708bf9319575583b8e8aa50cab"): true, - common.HexToHash("0x42cea7c58c6768f6f933a2d192e16b5a6af3e05cf6397adf6c55de261ec4574e"): true, - common.HexToHash("0x369f6a226b303b6d8ed6fd99f6bc3562c5d783b8d287608dbaceb00ba9187c34"): true, - common.HexToHash("0xc1f93fbe164bfb005a504a9e36f21d0e4383e8a5f7dd47f7afa530ddd43f6c7c"): true, - common.HexToHash("0xb9992ae7c52b3a48209f98a08d507f840d04e13413c3449c36d51de931e8b516"): true, - common.HexToHash("0x3fc56f6b63db5fb98b3270a892ead813cb590da3533c0c85d64d60f3c9033269"): true, - common.HexToHash("0x19ed33375d2e7619a40ddf08f662e9a40c0ca52a7ff391fcc227d17625d4cbed"): true, - common.HexToHash("0x640a6eab5512832d23ff6c365afd2752798a8e4c91ee5ea0d8240ab8b7765169"): true, - common.HexToHash("0xec4e6e70b3b03a07c2b9c9f11e90fb073c4b0902607ed8240ccc99853e99da8d"): true, - common.HexToHash("0x0147f3ec7720976ab484e3e7a0f6d1cefb1884b9a83b719992e0525fa3d0fffe"): true, - common.HexToHash("0xbb8856e796c417d8ddd4edff8e39e1cec9987b421ff36063260030742c279e1c"): true, - common.HexToHash("0x27d644d487490278f6b9efbb6e56b26b9ebb475e022a4c7459db1085d02bce6e"): true, - common.HexToHash("0xfc853ac06616d6d39a297844e3c15a5f9de4e1ad9fcc71ff35924791afa27437"): true, - common.HexToHash("0xd5b36262593ef679125bd1a4fe20290bd8dc25194da1c70aee9fd2cc69048c67"): true, - common.HexToHash("0xfb889e9a873e0c010c69111fd34d4ecfc888ab0f458984259ec11dad04e936fc"): true, - common.HexToHash("0x11db4c4adb9fa2f81dd4b87e74266029f24e313cb5090df3112544c0643b9617"): true, - common.HexToHash("0xaa6c9b21307b33439db4dca2f61a7c8ceee1685a746c4b60adba54d9b71a5ebb"): true, - common.HexToHash("0xfa6f46d512212b875495e16654513b83a14f0f689a1e04eb968e449ec4ece4b3"): true, - common.HexToHash("0x158c672c2918c73b2ee88e2b6f76fda0aa093d9098c5cc410c3982bcd3d9b882"): true, - common.HexToHash("0x5971a63de3bebcac284542dae482ed48cdeff95b493d5d4efb26bda84fd9281c"): true, - common.HexToHash("0x28a032ac6e58bcbe8a86470af96537a2e129c397a116a2a0bc095f497e6f6c35"): true, - common.HexToHash("0x9026c4d9f8d24fd415759b25562d0b72f18fa754e759eee716adece19e3d7364"): true, - common.HexToHash("0x16cbd43a5aa9c8be6f29f68f93eb6dd22d3dac9fe5d63703d03f35f6be054f7a"): true, - common.HexToHash("0x432dea776b83e0cb4bf2509e75526f835ec36516f1ec8cecf95e882b2d8a2f3b"): true, - common.HexToHash("0xff2ab2728ed4bf2428bef39817f982048bb4d9e578dcc83b63047b6bff1818ef"): true, - common.HexToHash("0xdfc8c04d7509f3c82386b1a357ee859b2e6cae595dc6d8ace8817c3a3fa0f02b"): true, - common.HexToHash("0x14efc2eff7740c3674c5ebe62804e5a4b29cf830c686345b6a31ee755a3179ca"): true, - common.HexToHash("0x7473432d924ec22e430f04c576cf5fa34be67bd464f4841c5dac642fa2a33792"): true, - common.HexToHash("0x4470d56749e75939f8ac6b3c39511aa5ff595759a044b1430f4f9413f54268b5"): true, - common.HexToHash("0xf78c19f30752fee732a2de16afa62b14129894e0a638dbd2660add4a1fb2958f"): true, - common.HexToHash("0x3ed5ce33043fb521c13b1eb9bc08a9b110a569f085c29e000207ab138a3679ff"): true, - common.HexToHash("0x52c91a0a9b2da7624e003bf7640f3d331a50a2eaf0d23c277850cb3c59e2fd7e"): true, - common.HexToHash("0xfbe592bfa6c39df1ccca47382e170f3cf7e0fbbc1ffc9423563f9da9926a1d79"): true, - common.HexToHash("0x7a084384e2aa1f94aee617dc0345c86604e659c7cb1ae0e06f8867ca83cc0c46"): true, - common.HexToHash("0x66e0bddf0e2697ce8586878f2ee050f231b5fa704c4b8dfe0bfb42ad8aaa4de3"): true, - common.HexToHash("0x59da4d3c3bb9e537f92e2af8c65aaf57f8b7e7bb849998593e2a109b3f508910"): true, - common.HexToHash("0x7b6769893aceed9ef3c0552ac1b20a91eb3daa63246f044507999f7f0a18c96f"): true, - common.HexToHash("0x44ce324d1af807fb8d69216863429fd13eaf329080bb998c75e492a85f998f41"): true, - common.HexToHash("0x07b3d37b5df525a932564e44f3dca094beb9cdfe8d6944a058b722ef1fadc718"): true, - common.HexToHash("0x0b714890050aef413a7cd52002cacaecb7d91636ba65407a305458c231729b5f"): true, - common.HexToHash("0x5de819c5329d5348eb6bccc6aacc560173c837dd265151795e9ef5b0b5b6c8f9"): true, - common.HexToHash("0xf23ede6368d599d586368d2c1623065f0733709fdeea9cfd04b450055b6747ef"): true, - common.HexToHash("0x70134e7363aa2b546b88faee95d04ab13a2bfc5f5be5d4b66a27e1b769099dbc"): true, - common.HexToHash("0x6c0d8d66e1d530b30ac765a2c72c8b226b82302ed32182d0a2dbfc760c2f0b42"): true, - common.HexToHash("0x451bacb21d1c02d76c077c28a0f0856994a04bd77c286625eeef5ed3b6aa04bb"): true, - common.HexToHash("0x73bac124f21183b44cd324864e94e34d26f9b5d93f6efafe4b4e288b410cf090"): true, - common.HexToHash("0x4d4ba124cdd757a39807b75e3e2c2b7325234ff16d4746e2b350891e865713be"): true, - common.HexToHash("0x8c56c13bd6a02eefb7d289454d0695f40c6bb6bbfe18c585701dc161d4898cfd"): true, - common.HexToHash("0x6890b2c2f5f39c7bf1105337c167739b3d73b7e1f55ed380f2dd44e0470df043"): true, - common.HexToHash("0x8625a39451fa5c24e0d90d4494293aa204e10f8af6cf309e4945e876ff94d17e"): true, - common.HexToHash("0x00393a2eb89a12f8c530f93312c9a58ad6698cad4282b2721493629d99cc523d"): true, - common.HexToHash("0xb2940140d46954522a4556d15ae172160ce38892059540477d7973a86e7d68bb"): true, - common.HexToHash("0x28ddffee219de23bb2f663e75a27877cee2037745e5820d314aa8446c34abc1d"): true, - common.HexToHash("0x0aed7a236fcebad0cc5b419234be9ec95cdf9970dd32fdacf057be8f55f279e2"): true, - common.HexToHash("0x7156e545e549b35c0b7d12bc9d60deac990672ddacd2a3b5b64bb3e5a9f0702f"): true, - common.HexToHash("0xe4a5b1b9d1c854ca36ca7d3d6be73e81254aced490c958e598d4818a50183df5"): true, - common.HexToHash("0x3b12cfbb9c84e12d9974beb5cd7dfb441d168a0812241aa2340af0d195381601"): true, - common.HexToHash("0xfda4a1c1e5091540db7de6f34085e4079bb57b4e30d9d3e473b2585b7c95d8d0"): true, - common.HexToHash("0x9a0cd4efaeffd86a69abf4735449f05806edfce6416bea8dc219f4d68436a7a8"): true, - common.HexToHash("0x84f4b80ab5ed5a359aef1ada905d68aaeb33ddd4eb187d6bf29d7ee66c1f6102"): true, - common.HexToHash("0x03f9b4fac006f4fe2a08a546f5d44c3a53c0c2645200a1ef44f1843dc59bee3b"): true, - common.HexToHash("0x49f8649901517694aa56a92cdf98655e9aec5b0d751fa03bdcd34b924b2dfcae"): true, - common.HexToHash("0xf936bacb6c68aea4d781b9d4b2ad1c2b3851fef35fc8b1184040b248e97369d5"): true, - common.HexToHash("0x3b7479238d9e304864475fc0b6f8da8c3f00b954618bdd69318f3ad885d56f75"): true, - common.HexToHash("0x338ba2f434b26a118872974660cf9ef008f084f28e4b637072a597d89cc18b42"): true, - common.HexToHash("0x6ecca98ec5ae235c0d6de2700d1ce7d4294c43eb91129a6f0371e29509a16a62"): true, - common.HexToHash("0x6934b821dfa4653a71145e4e37a70cf1287cb06e63591d0403ed086047d76692"): true, - common.HexToHash("0x7fbf9d08109722902bffe2a4b52b877e96b6e3cbb1b688f977996be4344254ef"): true, - common.HexToHash("0x0f70508e6637aa4aee80033311dc64b53af7a911ebbc9b0f7932f4e991182077"): true, - common.HexToHash("0xc2255904cc728b9bd7e33f384ec4a8328a0a670b8eaa84d140072645cc65c801"): true, - common.HexToHash("0xad4c89a25c656d2e993f9a1debc3470add074bd067d72a2703f61f02fd3e2330"): true, - common.HexToHash("0xae57bf7abf122f3b1f59393cdba184ea90b211dc0bf2fef82cf5461f8a84eae5"): true, - common.HexToHash("0x5caf61379c38d311db1d4844cb8a69cde1426ce11d95ca4e7056eee6dc2fe21c"): true, - common.HexToHash("0x7439b6c2d0f38668856db619e0275f9df056a34507a9f4135fffd2e5d1d5cc6b"): true, - common.HexToHash("0x62b9c3222745d1872bd10e1bc0eb8876a81bdba04cdb642a181a28458b05fff2"): true, - common.HexToHash("0xfff6b0156de4ff51cc9436e262d0ee890ec6138ab8fdfc35dcbeae2244dcca4e"): true, - common.HexToHash("0x80347df03ca499e4aea89e7df6d79fdc2f564a2ffae325880cb94edbc0d4cdcd"): true, - common.HexToHash("0x5fb66a5c9e59936f0ffd4f89b4cef9679d38ae0c2fd07e48249431a2df8e331b"): true, - common.HexToHash("0xc3ee58aa8e9fe04f9b62243886bf38f7b95a5f164b6d5c96380f7a8bc19d0900"): true, - common.HexToHash("0xdd57acb500cb28a1c78981165d2e2c9b3690e43b687e8fe2f0a5f5646ab09788"): true, - common.HexToHash("0x96ade93155baac7dc88c415819ef324183b0756ecbbeecda91f2a20417939de4"): true, - common.HexToHash("0xbe7066246bc649e29a58b48300cd991a389ad91321ccc9aa970e32d896717999"): true, - common.HexToHash("0xa8c233fd8d855acad2d5cb44fc45eb77bda28e7f56a22e55ef5bba7842703d3c"): true, - common.HexToHash("0xa58bfd752f060dbbb26f8301247e1fc4586950c75ecd24e61b71de483729b106"): true, - common.HexToHash("0x9c1d135f107a7161d8448425c66f755d10d073b5efd02175fcd806ab545d7dd2"): true, - common.HexToHash("0x553ec768b2f41cbf513225e643c614fc52a482ee65f67120494fdf516b692882"): true, - common.HexToHash("0x6fe5e85dd39ebcdc1634f4f4c06fa55a80595fdab408199ef1a44f337e673d92"): true, - common.HexToHash("0xb6badd4bd47f24c7aa182c5dadbc2e058c9967fa598c52477075686f67619627"): true, - common.HexToHash("0x71a7223918acb7c96856ea93a2cef5ebc8a51b833f86a925ee62ea1bb0153711"): true, - common.HexToHash("0x04df70816e19137e306e21f807106343755a28efcfe156ed0d185015fea86989"): true, - common.HexToHash("0xaf7515eaa6b766b6dbfbb2790734888835531e8605a5d762497d7ef203bd01b0"): true, - common.HexToHash("0x37f410f46e8179224225431e8bdd42b83dfa5ea559afad6e797d0931dd8ba375"): true, - common.HexToHash("0xaa799a081ee503cbdc1a92d801b65f0a1753162ce3d69764e84b4ce5446bc4d0"): true, - common.HexToHash("0x26210621acbb309c64c89fa872771b125deba57f77e458d44b67ab8ae154a27a"): true, - common.HexToHash("0x8e3bd1f219ecf7c216ca9b614acabff251b6989ef5aa1f6cea8f7086dfe5886b"): true, - common.HexToHash("0x3c10e5e75cd95e2c08728f039d024d88f05d5e03123240dcb4cd1dcafdf9a00f"): true, - common.HexToHash("0xc6f9969cfca3fea6ce1452f4d3bdf07cbf9e5136f68cf835a4d3f50bc5c00ce6"): true, - common.HexToHash("0xa00b83b6d211298db28490623085eb3cbaa21e8d5e2916c34c0cc7e6ade36257"): true, - common.HexToHash("0xac847a7a1732b434f4d665e11f763908e2ba323328772f1d31fa4ef8fc1d7571"): true, - common.HexToHash("0x17249025c33b6e8feb9be4f0b8e48ca678eb052c1a5c96f550016788320b2784"): true, - common.HexToHash("0x1085bf9180610d9e386527e00ad3ace0db67962df4eb79b39e856c5d8dae59be"): true, - common.HexToHash("0xeb093274d3bc321cbc55f9869e30ebe2b006f9ca53e9fb8b900bc5db6815cbf8"): true, - common.HexToHash("0x299ba9044c17e79b604b82e9be6625ac5066ea42f7162bad8c1796d3011e9923"): true, - common.HexToHash("0x38804d1448d903338d5d1e74c5cfd0b21bfc73c7a876a6e9829f822c1e26355f"): true, - common.HexToHash("0xe7ab5c174e2fc3e314f0dd2dba6717eb60f2295669420d60c8533c741b8e6662"): true, - common.HexToHash("0x512ced3109a24fd0b0a005d6ae25d7f69cff987149b07c342ec253e1ef35b67a"): true, - common.HexToHash("0xec5eb4d0fd2f79ebc1d6c38385921243d7db5196d2d70a18c6c02f1a2e665ade"): true, - common.HexToHash("0xb4b71a9dac766b368c2d2414af49ec256dca244f13f62e2edb6c7ae6364a1acd"): true, - common.HexToHash("0xdbf5a5e5cf82a943ef0152518fa7d12140bf15f61899cb50a08f17e2ae5206dc"): true, - common.HexToHash("0xeeb4b8dd6074684ae8250cb3fb33a654df24eb407a5d989605989e49075456f5"): true, - common.HexToHash("0xafb70182ba4be8a48e89a17c5fd3c19706045d57dd51f3986a171bc125a2078f"): true, - common.HexToHash("0xfa02542961ddd1fd545bf06d56df1bcbc2b657af9acb2db8cef7cbd342f23a17"): true, - common.HexToHash("0x6a585be83401b018569997e8e905e2dad22b206d6058ea116ee1d3ab8b12ab1b"): true, - common.HexToHash("0x27a4edfc3a3590df5419023662f17a2f200a18c0095d8c052ab1137dde034187"): true, - common.HexToHash("0xb84cad2a56c10d9ceca328b9bdf8f5ed89aaa2f893589593915aef06b25f3688"): true, - common.HexToHash("0x7bcf06974a43b97ba187d355d97118f5b049c57516c6dfba04afe650cab98a76"): true, - common.HexToHash("0xd120f26d51714431d91b99ca59251bd89709fbcb0cfb64301918ceae5d9e3baa"): true, - common.HexToHash("0xf886d0cb9926b8461edb6cc41e62aee045744bfc46ec0b02cc17ffbbf2fe7a55"): true, - common.HexToHash("0x575a89cbdcc21058e8896ba09f7b4a965f6021f7d4f2470d379363d1f7c2f1e2"): true, - common.HexToHash("0xdccbf0c857db26ded59cf02103caeea56904c1c8d4ab97fa5dd2480904648ad4"): true, - common.HexToHash("0xee164812d6ac5619cc9dbdefca658240ee4bd3c3cd08d757f58be694706db2a9"): true, - common.HexToHash("0xb815fb3050889779bfe822b67dcaaf2ca309796272bfdda5aac460570e3d2681"): true, - common.HexToHash("0x6cc8f0e79629743593c347ac490ea38aff56515c57ab3e40742cf0fe1aadb199"): true, - common.HexToHash("0xdc860422feeea0b48df3b788063304abd9a211b760fee74d836745ace8d2f894"): true, - common.HexToHash("0x2dd209e8265dc08b91723d18939c14b00c0e9e604ca950c89127b32fbbd99e87"): true, - common.HexToHash("0x333fb6dd91ddc2dc2a67c0e5cc30dc7e4d585061f409cc7e07ff1a7afa5d0729"): true, - common.HexToHash("0xda41016164924ff7015d8017a06300eae8e1b0a026e3ccb77e0119169f77326e"): true, - common.HexToHash("0x7b9e72814f5f3a2c776acdd665c06ddb3f6f584e4afab36371266bcf4fc456c9"): true, - common.HexToHash("0xdd9bcb657347a4f7cd230393ccfb1d617a9419f3fd7f2a052280cfabf0514499"): true, - common.HexToHash("0x83831e77d1cd6f4c16464b7f001956fc312317d6af96eb952047701f7b36b503"): true, - common.HexToHash("0xa51d7f8d041f0e93f62a8799da41c82afa5d9c171f3c9a7ace36836422a05703"): true, - common.HexToHash("0x61b7c403441bfe3bc819c272a58c8aa4a699a794ac21415be9095b2fd48affdb"): true, - common.HexToHash("0xdc7792b49390d154d3e7681c8e705275d57203d6fc6668fdd48d4acfd9cfebf2"): true, - common.HexToHash("0x487bd04070d56e6a2092f56da8f254f7298233e27fb38ca215132d5f2059d161"): true, - common.HexToHash("0x1b19612a272000f3989256060c49f033fa5aded7ff5e368932f168dabda189a4"): true, - common.HexToHash("0x6572fdeb50f08d2cd51e616938cec1145be9e92c6b92e8272948f7a2022cad56"): true, - common.HexToHash("0xcc126834491dc2f656fe9a76bfdfb0692b8b27ad090ba6456fbab411cad873a6"): true, - common.HexToHash("0x922fa5c17a2b2509d616b836aa3f64b35fde6cb8702570b9c56ee42526be8e5d"): true, - common.HexToHash("0xc76723c8a156fbfaa94d7b6937be8be01071f31485fde2cac8cd454b3f8ce141"): true, - common.HexToHash("0xfeb12c23d4cbbd8e289f2e97ca79db018ac6f8ce96120759b9707fabadd70d74"): true, - common.HexToHash("0xdfeab294d007873f208d001a2618873cd8d78de6597ad4392367caeb1a988f9a"): true, - common.HexToHash("0xbeffa0ed8586fb50125f8dec2db16f5de98bed553cd348220424a0cc10ed94fd"): true, - common.HexToHash("0xa5995a7845207f5583875c0b6b65f5bdaf671490bc3bc180c46eff6cf94576f3"): true, - common.HexToHash("0x89b9dcfb31df7f62df2ca7ac9c0b50a8ddce28edfc347820efc7543299c81787"): true, - common.HexToHash("0xfd60eb99161da73dfc2f65044d5512f05b4fa33fb222f2e7d279602e1e0c5244"): true, - common.HexToHash("0x3816d8b833dc827efe1f72f927eade82d85a38637789313aad8bc7cd6046a2b5"): true, - common.HexToHash("0x0024f0f6aba2c884448f0fdac1de09f0b4ad24c1f5392663187d07fb2ead8ef1"): true, - common.HexToHash("0x4f79e5b3c82648b70b1c85dfee924ea925fdb5e91780f06564df0c2cea250881"): true, - common.HexToHash("0x7bdcde11b367c5720e309bf63e711764fcf34b04575f6999ab9abb56dcbb545d"): true, - common.HexToHash("0xb494f71b174dd79e21601d6f6d3b0a1441c38857ef016b0871e8204870761c66"): true, - common.HexToHash("0xd6b8715490d6d83e742c0e64a1f42897a1e9e4fb14e0d68ff310a9487d5f4bc4"): true, - common.HexToHash("0x23c10123790db1700cb2caf4a4959de59da38fcbb5b9939d18c6547320d08b60"): true, - common.HexToHash("0xc9ed0b5e6d952cba3b78252cf8828d502347fac7c004bb1cb05a283e8a56ea7f"): true, - common.HexToHash("0x391d431aa143fda86bbec8157a419769b6bbf472384dae6aa633d5e12f89467c"): true, - common.HexToHash("0x0d2767ae082200211524402f9fe0591b6f77dec9fd5cfe4288f83be3762de262"): true, - common.HexToHash("0x059bc8c09b1690a35ff51630c3aa0e328d22279c0e2fd7e42e2fe3d45af684d0"): true, - common.HexToHash("0xf8d64e7271a8088a7b31b54717cedcb7ccaae43f5fbf61448805bb352972b678"): true, - common.HexToHash("0x972cb7d0367d48863a9514af449fde6cd2ecd3ecfdbc4ac6d1dd56689409432b"): true, - common.HexToHash("0x1222b65603a1d8910ff41b0b38db03b01713f9042d3a51dbd73650acd568a74a"): true, - common.HexToHash("0xb8e540350eb05190aa53c1fa52aca3ebcc8b157f078fc0af5dea2e0967682a9a"): true, - common.HexToHash("0xd838ec67878d2651d87b0cb8cf04829ef28b1d6c55310b92a21103cd489c507f"): true, - common.HexToHash("0x696a1cd8fce1124c64310cdf045224a15ce7810649d1809d9edcb267ec827218"): true, - common.HexToHash("0x221c12aed660df471ab1dbb1f9ce4b072fc3896ad5cdc919e724169987fe32d5"): true, - common.HexToHash("0xb3c6281dbdbdbc86d38e8a438b257da652088199f490a06744fe0aa66d53a9bd"): true, - common.HexToHash("0xbb1b6528ceb997c01ad469d6c8c61b656bd70b9ecd10dc6d91fc630ad02782c9"): true, - common.HexToHash("0x5d2e9cbbc948a1a33f3516783054b5db6f0717d75c605a13bf399553eb391d5e"): true, - common.HexToHash("0x6afdfeac81e9a3998833a387cf7e1f29d996d1d4d421127ec1fbdf4a91c00976"): true, - common.HexToHash("0x73e3afca48e98524fe6926fb0f42b8ee7b8186b235c9a49a0726a5d52a2538c0"): true, - common.HexToHash("0xe865323118477dbf00549ecee8e0b6aca6faa5d74d4d000fcd05e715cb77697a"): true, - common.HexToHash("0x3ea9ca02389fe619d6237ab47a80742b70a845306c84d76d3fc54dc87f6af4e4"): true, - common.HexToHash("0x4f39282d7884b8da92892a0c9aa93b7cccc27231a69b6488582769ea09166e12"): true, - common.HexToHash("0x09d02e4d117aac77dae5872c9b66549229fa899989c4da63458aa7d600087a33"): true, - common.HexToHash("0x246aa3f7fca806d265330ecae35a56e9cf7d8ff9539485306169dd38f0f42bc9"): true, - common.HexToHash("0xeb79bd979e384974df2b046c0ea816bf1ad1937aaf1f3fb5a31d2322d189785e"): true, - common.HexToHash("0xba9950c0eb88bb4243cc925517250e44c74d39a746749a3f8780acdc000000ea"): true, - common.HexToHash("0x6eef2864c9bb8a92b50f711cda610d41941950e1987891a1877f60343a651986"): true, - common.HexToHash("0x5727edfb3f071878c7f3a95af56e060f9a49a04f80a30be4adf26b1b86abdad0"): true, - common.HexToHash("0x6d455594292eeb367303feeac4229d8cc0ba8c1927dc75a154f6ce44c70e2487"): true, - common.HexToHash("0x47e542e7e63783451a7a6fe7393b8ee9699b2bfbc1af1d9693c368f45c8e643c"): true, - common.HexToHash("0xaad3a6af1f6a4773e580fe59b977442eea25c35b7b87a3ffb2e1246ba0bd2135"): true, - common.HexToHash("0xf2bcd1e1e1ab69d51fdc6090ccb3526767a17a0dcc25bca997d9b6866bb46b9f"): true, - common.HexToHash("0x11142c69c85eb7851f4886d82bc87faa0f656419bf86810ec251e1f41a4cf753"): true, - common.HexToHash("0x7db8a33fd4f1da761d4c0d5bd440f4d40701b16833b0ffe1fb2b979316f46874"): true, - common.HexToHash("0x724b9db4ae30458d49d1bc00734828e9442e5e7361016e76c0acdab0a0c743d2"): true, - common.HexToHash("0xda5403b320988d57fbf961205c49769e378b1ac5e8d6d051d6b5d43babef640d"): true, - common.HexToHash("0x041c30b4f4afda8e5a17bd55b4a4d2f657121444f9dc764b7455977707ab6743"): true, - common.HexToHash("0x30fa5999c31174d937f5e347a1c3431b069880e744330a8eaf7067f9df3aee7a"): true, - common.HexToHash("0xc78a78d1fcf39d204bc5dceec3b6d580ec047c02d5ceb05b20396d8dde968f10"): true, - common.HexToHash("0x1b0641df30a7749bf83977571f4ee65543e608d89d80b86419b98e545d21c915"): true, - common.HexToHash("0xb5bbe66f4fdce980aee76418b0f7ba671532117fc70e9db1a29ac5bbef6bb606"): true, - common.HexToHash("0xa63e4190d2e3c48c064e81ed9fd0b151644ca6f50166918910df47c2fe5dcd9b"): true, - common.HexToHash("0xd891d36a0e0681c970fe0d3279e5ab6669fc933e13165f5b576a8cb8651585b1"): true, - common.HexToHash("0x9b5eea49817bf63ad0d01387514a5e8b21bbb7702e1e3965552663608bdcb1c7"): true, - common.HexToHash("0xeffab31303c1171d54428ec69c6473a23825c31ed0daddb1c24801bf02d8ae50"): true, - common.HexToHash("0xa17089a774cfa183841c63980a57f1bec3ac465d247d991cc47235410e07fd48"): true, - common.HexToHash("0x7cf14f34e53eda59f704bb8ab9f660d04b424b10e638bfac0c27642517ef5127"): true, - common.HexToHash("0x974af38809280d57adb8cdde5a8c8c5518f33b97c9dfdc028c509de28d0b972e"): true, - common.HexToHash("0x868db0499812a0427b5175f86c01f9a231d8e20051b61915d2af0cee6d021b7c"): true, - common.HexToHash("0x297c4a46a3afc23682f71dbeb227a393af111d261b5c5f576f93416e20ada070"): true, - common.HexToHash("0xa58c417048dff3ef1e00ecdb04c4c77bd74381cbceb9298af4a6d47791feb35c"): true, - common.HexToHash("0xb4d159776aaaf9c23eaaba18dac44a94575bf87516d4f90406d57ea75e62be2d"): true, - common.HexToHash("0x7d2c67a959db136f8a8d733f3bf9dd89e5acc0e40664722e565ad7d52dcedbb7"): true, - common.HexToHash("0xe2d203d9368ede8f7ffe4b5228a83cac3233662978aee2101a553583a7fac565"): true, - common.HexToHash("0xc1d196b59ef735eca769c57c8f4b9da64f309c88deb496b3b75ceb06f9db0c83"): true, - common.HexToHash("0x982974a6214d38de9f316b0be0defd9b64bb6aad6cf73aea9867dc4a2405a27e"): true, - common.HexToHash("0xeb49edf63da6d240502723048c19072a86bd62617414aeb69128a981d7ede481"): true, - common.HexToHash("0xd7007ca16431db426f59b135e0b702571f3ea5985ce2d7909ac018f839bb69f0"): true, - common.HexToHash("0x024b9c135c925c20db2a90a1ba0a63e042ba07dacec760f74930371a62ac38ee"): true, - common.HexToHash("0x8d1edc0b9370e7626912446bcfaf82c95617e996b69043199495f253f7f0d9d5"): true, - common.HexToHash("0xb84252c00be2f06a0362d756b47c1a22121592f8352d209fc9f447ba84a0ef1a"): true, - common.HexToHash("0x759a8b68724c2eedb8274991520f882cf242fc924ac873c206f88fa5c4f7b17c"): true, - common.HexToHash("0xf427aeea87a4870415fe888f76759723be2c837bbab152b55b20308aa87f5736"): true, - common.HexToHash("0x192a9249ac0a576d2765c758e5bbfcfb2e11f2b2005c3323839f399150209802"): true, - common.HexToHash("0xbee73f4a85a4e4d83ea1bd24861fec2748178aa068cbb6ecb0218d16fb0110c5"): true, - common.HexToHash("0x2dcb63cf965723bcffca31416e1d23f0e09e3d445e7f24f7d5d7bf526cd5e0e5"): true, - common.HexToHash("0x1dea15f0cdc02a12a8a5565d436ddf6d091cb635adeaafdca6ceb6a67608cb75"): true, - common.HexToHash("0x77ac5419eb5b8b7be01dfa6e801a3aa8f740a83f1c582e1a425115d0c515153e"): true, - common.HexToHash("0x6c4754396fe2f5046fab17504273f5c59e77f50237bd117eb69a7a25ecc2461e"): true, - common.HexToHash("0x711331718c057c6dcea0c831bb0b2560425dbf24a44ac758cb6043f796105aef"): true, - common.HexToHash("0x5785b16c79d32b52df6c351585c3ee1d7112af28ff016347344ae96a5a58dfdb"): true, - common.HexToHash("0xa5f48ea7aa731e4f51357806fa581529fb569293cd2dd7e7b75189551c24149a"): true, - common.HexToHash("0x6f8c4dfa0af34435210db6028dc839a723415809ece103288fef677d181f8657"): true, - common.HexToHash("0xca30cd460c6454f8870cd4a3df1de4ca5236edff21168ebc8fedec385317bade"): true, - common.HexToHash("0x45f72ab8e5fef11cc3210e39e715e6271ed453107290db978767f5615078c01a"): true, - common.HexToHash("0xe616c113557634c0114729abec7b8be66e3c298d8bfca06f74da5182efe658bd"): true, - common.HexToHash("0x1c691a6d391769a481f93546ca90ad4a166cf45fc5683c7c6786877a9b9f33a3"): true, - common.HexToHash("0xcc8f526e6fe12b4d3346766682851f2f9a88d280393df1e4c174fb339e746b27"): true, - common.HexToHash("0x1a15eb5b410420130b842618e5905ebf8c9d09ca1271b6b0be7fc93cdb073794"): true, - common.HexToHash("0x8a013d0e912edd4c605e21bd1c87e1b7bcded39355153a1300973d341351578a"): true, - common.HexToHash("0xc0bacdbe1748970442f8e34a5990d268991d51a20f6b1b73c16c209f360a74bf"): true, - common.HexToHash("0x33f1a13622a26c73a41b90d777b06f1657bcd61534962cc511bc99df7d4939b8"): true, - common.HexToHash("0x22a55900eadc7e48c1da8f8f83853897d3fad73771fdeb9e7434578551858b24"): true, - common.HexToHash("0xe723f489d3a1e6a140657ab51fcc28f5b23aff63e8ef685a05071037286bec6c"): true, - common.HexToHash("0x790aa08be9dd50203b3083affcdb0d5a354988c2f6cb4b775c62ed23d6d0072e"): true, - common.HexToHash("0x5e581cb8cd192f3b5a7b505886f7558d4e3b912171cd0835162cdd8e814493ac"): true, - common.HexToHash("0xb163fcb6d420e5933f5e4bb3ee1f35a20c6539853e848c72ed1207e1ac58d6a8"): true, - common.HexToHash("0x67c0ca7527d85d40d0c3d7c1eb32eef968db9741877d15d7a85cbf4a04105ca5"): true, - common.HexToHash("0x617d5b1c1b015c9b22bd82a5f1e8b50cfd94f7e9e4468211a5d8639d56dd0145"): true, - common.HexToHash("0xf176026487d9917949bee9d058cf759a92c56d9e398f02b37d04511d0d63d071"): true, - common.HexToHash("0x1952c52139dcb8df909791ba887953a24730dae08ab2d4148c1610ae2df02fd8"): true, - common.HexToHash("0x9c55db68a2c0da19da9288cf0a1a6c9ac38ddffa05a5ecd9494ff444d9fa339c"): true, - common.HexToHash("0xb3e49f9c4beee0d8c624a808086a70bd629b4b8340edb871938e991fbbed0eb3"): true, - common.HexToHash("0x029cde931f441324b6d4b37df3249517ab0e2e9430e49986e88146768204a509"): true, - common.HexToHash("0x9f7b0cd0f63b41d24d6e2dd6018b4e588b7364dcccd14e76cfd160c248f6fb80"): true, - common.HexToHash("0x64381ebffc3da66088552ef76de0abcaf3a224356279f4bae96313a7697be26a"): true, - common.HexToHash("0x32d91ce3108b14d6becb0d2ef396dac2623e79c3d4220d953d4bd2a7c1ac71f5"): true, - common.HexToHash("0x6198dce9ad611d847f95f09b0c01cde678104e836c7be4d0d44ca49797c787eb"): true, - common.HexToHash("0x235bb372c5b34557e719ec47bc9d56f3754b37f2c9785f19003d4168441a5520"): true, - common.HexToHash("0x2def11aeba97566f1bc097214ed8e82d82d3b673d8938e7c0e8e777f5bf2f93c"): true, - common.HexToHash("0xed71d4bdcdda392ec9bb1a5de51bf88fc5644b97179e9cad025378c8d5ee61b8"): true, - common.HexToHash("0x6f7526eb5664d360a702774e14837ab75a7020673f38242e8529dde57251edb6"): true, - common.HexToHash("0xf0d4a19e13995c5685a9559a22610c600a11c796c2673dcc536547024300b670"): true, - common.HexToHash("0x031555b26ed1142e385ee8b233e5460b943febfc30276d9b1e72a0aca7e89786"): true, - common.HexToHash("0xbf196f4cd900fe941b8283e37772cdb8c63695421ff67bb1191541cca171ed6b"): true, - common.HexToHash("0x940f4c07154e3fc9bd60a171540b16dafaf0a7271f5aaf5d3e464af66e5bee15"): true, - common.HexToHash("0xbb201bb0cfe307fc23a348f5ffab86dec9964753d066d2ff9d84ff1ce0e5bbc6"): true, - common.HexToHash("0x8d25e7ac66d9247ae3bbf8594532a7e8b476aec1ccb206fe82edb3fc77fba604"): true, - common.HexToHash("0x695e7257fe93a65f58bc4275e24d9a54d75b23ee4417dc2293697a9af052e15c"): true, - common.HexToHash("0x81d11276260040c7af1d29bde5256aef323bd027c99b23fe943439f0ef8602e8"): true, - common.HexToHash("0x09528e7c5ba2bfb3ef2a8f42681adb3fe3974d49d980b75175047a8d51bd79c7"): true, - common.HexToHash("0xbc19a5842d5142735dba44e1e604a2cc6cde6dae48ccf45041e24768e8c10d37"): true, - common.HexToHash("0x1d033fa93708122fae0d6801ed3d0676f4ac220f5de8cc5258c943da88672c7f"): true, - common.HexToHash("0x958dfbd4c5846ba919d8414a669f676dbba6f428237656b5e12d8a0d4c2a8873"): true, - common.HexToHash("0x7848886724f915dc7d0dbadb8947046b432eaee50959fea29690762dbb1af5c1"): true, - common.HexToHash("0xc5490104d53c1e87368713aafa26325609d4eaad70b4029c5d5badb8e5b90162"): true, - common.HexToHash("0x57ee37fb595da7aab7b4fd3f9974079311ef7e02b03da66965c4301afeb700c4"): true, - common.HexToHash("0xc7e05ea4bccbc7f879d0301425852e4561f5b8432246b1d97776cbe63c788a09"): true, - common.HexToHash("0x77ec19ac23a5865d437f60045ab5e0145868bf8d69f4c992d0abaae469e49ae7"): true, - common.HexToHash("0x34ae5cf65866061e7bfde5d5a1882b53ba0a8b3598988a631c8fd332894b53ec"): true, - common.HexToHash("0x9e27fbc2f14de9dd681d4f54af0d796d6b8e06657532e56f424605d30611f36b"): true, - common.HexToHash("0x56c3de609a93040970ea0f05f84b2049b8d78be289fd436cd870f639d6251ec8"): true, - common.HexToHash("0x0a6ac01ce1454c05b02a370a494e82ce6a366418a177b67610402ccd78533ba8"): true, - common.HexToHash("0x325702a48257e617a5e5ba3e2a6e3e13a0ce297a2905edf7c750bc7069e0fa66"): true, - common.HexToHash("0xfd58a15263ddf7783b81c7640ac86e720139e581f542748ee734fa55f4767331"): true, - common.HexToHash("0xc0ce7376efd893301a8717d3abcce4c17bfe50c829a308d3182bca97a3cf6b7d"): true, - common.HexToHash("0x3dae6c58d7f039ab2f41be9a06cd81516064314d5717c70bfa44026dd77daa98"): true, - common.HexToHash("0xf90cc66c2bbaa3a9581c75920b044a9a534057e57130415c144034c472128f97"): true, - common.HexToHash("0x0d37c04f572e5ffc5355e764b808494782c6860ba1195293758d352d12f01d38"): true, - common.HexToHash("0xc785313ae8023204c1c0c9ef6fcb8f45f40f6d231f299056a2e75ed025fc0688"): true, - common.HexToHash("0x6ebadc5a396522dd7bfd5b56ea64a3e42cb7fb24ee6bd53f02e7ab92b71bcc74"): true, - common.HexToHash("0xdd8e78f0eb743eb57f703578118c90c6e3195f08fa9d1915c38c5dbef5f1a781"): true, - common.HexToHash("0xa71f71b357003a8212fa518d04353cf4db4ec14e532ed7bec9ac0f7423895bc6"): true, - common.HexToHash("0x542901f14163de24de5cfb00c6ed4a1bf2d9874c79520dcdba181422e3623b24"): true, - common.HexToHash("0xcfad0e9108edc69814107992253039c7bd6506c6c5e71cb2f3504c7e8aeb5ea5"): true, - common.HexToHash("0x7873b6d252a6d0383b1d72ce7ececf9c6b202a00d75e58626b29de81559b9742"): true, - common.HexToHash("0xaa761df4b9d10a8889c97a2ea0cc2882e0537bb23e00ca86a012e4658662a211"): true, - common.HexToHash("0x2aa19582d25ffebdba7176c8bc69ffc02d37ab2c76a911623b890d6760adac2e"): true, - common.HexToHash("0xc42c8a523dc3afffecebff79f523777e58bb9945964cba1eace29c7cfa3b2ef5"): true, - common.HexToHash("0x5b3fd629e4f92ea12c949e9a14ea5dee55679094b448a6ea4b89e0e578660f3b"): true, - common.HexToHash("0x5b11020e7c4d91c8e9acb184f03f612bc8d95e5f49e9a77ad50fd3bbd6bae719"): true, - common.HexToHash("0x6c9b5f06b0c3eaf9411c9251834eced981a345dfecf6507e16aeaaa900dddf74"): true, - common.HexToHash("0x665503d454e26506f69e49c08fd09dde8515baeaa0c6bba98b41ac6dd3c0982f"): true, - common.HexToHash("0x7d56ea1d5613f5fed12adbb97723650f231ef63299c46e893b3492b707385c53"): true, - common.HexToHash("0x81bf2996d377278228f179ee9e147475a4d5655c4c7a0a48ada71b9ec0058087"): true, - common.HexToHash("0x1983bbab9761e65f3c7c1290b18085e46f1d7cf822078481fe776df26632bdd6"): true, - common.HexToHash("0x2d3d3fa7527f53a2f890ac46fd816cca70aa53f6a86617c489d45880d1e0e9f8"): true, - common.HexToHash("0x5a3ab0e3adb875e8646f8f87c924326f73921dba6f2435c7d7ed9ad0fd0e97dc"): true, - common.HexToHash("0x21c642b1b2275b2f750161e8f8b19e35e897c5d187481316bcbc6d26ce1173d8"): true, - common.HexToHash("0xad7788bdb8e477716a28de1a8b2b6197a6c1f165db7e519a27525f90b8c5a2f0"): true, - common.HexToHash("0xe33e65bdc3d05ea9aaa8d79e20766ad113c419acba57267f123bcd5c8ee91478"): true, - common.HexToHash("0xd671fc75b70a367c5c5904c9e13a5537dcd90e193fe710c44476fca2f396e534"): true, - common.HexToHash("0x75a8a5e56ba5147c0eae9736b549af50051f4340aae80e8a717a6b6821c83dbb"): true, - common.HexToHash("0x4799b1b30e7f43b99b7e5abf49a565c8610230448da5f75c3cefc917da362b35"): true, - common.HexToHash("0x5053b8087b27d598285aeedb2936fe661c593bd20223ab5adb52811ef8a87b9a"): true, - common.HexToHash("0xe94818fa05f25502cd91cf766a782e5af83ac22d550d3a00d0e2d9a2de409627"): true, - common.HexToHash("0x6acd4f5726b3bf7b38614212926e1bf7ed2b573525e2bd8187396a85b24614a8"): true, - common.HexToHash("0x449c7a555d7117f496e4c4e661b403f559ad3a1650cde0cecfb9619ed1eb5aaf"): true, - common.HexToHash("0x6f164f06cc80ff2876a99f5746d39d0bd6a76b00597e7d613cee87aa67c1e61c"): true, - common.HexToHash("0x11d6a6bd3ecf48ddd68ff9ff8167f413487c8b52e87152ed28998f228953cc38"): true, - common.HexToHash("0xb8cf907915844cc9022e58f779580e8373fc12174f257576e470b9089ac4e9da"): true, - common.HexToHash("0xe1b576d1126e5c38daf675949c7422f9b625bb5d134c66cdf3bd29049264154f"): true, - common.HexToHash("0x38c0af22a3cac54045002ac61c85324e8d5132637b0c1cc757562223a67c185d"): true, - common.HexToHash("0x3e938264194f5bf4c8a43d5d9f41f3add2508a5c7e8b22944b26f1257e78a516"): true, - common.HexToHash("0x55ab90fff0d5f869360e4d283d5fd058b7d02e4751ac8ddd45660e67cb21f3e4"): true, - common.HexToHash("0xb2d5f2d762dc240351cd63e46d91a5d3d5f180931e140d338313439e615ad77c"): true, - common.HexToHash("0xe02df8861c0a107f18fad833c66eaaa1f340d31efb1555a4351cc781889ddabc"): true, - common.HexToHash("0xa468e6d0102e92d16a653918a8e2334c8248c46eea6ee9bc32e7078a6a3e431f"): true, - common.HexToHash("0x49e3c69b16fae060d9db400df177975f0fd7bdc9b87252e79614d976ac5e74a3"): true, - common.HexToHash("0xfc6dce2e6b150d9cb63772784892f69a189813f8c3c93473dff048197614f645"): true, - common.HexToHash("0x2eedf22cc3aebcc625c97e5023069fcc8b9800f8146157f826e9df5ee83acb9d"): true, - common.HexToHash("0x1b6c74506644f5c3acb2d976370ba61032d85d6d142ebe9e931b0c8c0a0562b9"): true, - common.HexToHash("0xcac6d3a18486a3a15f25170dd04b1402ccfe3df5e3910826ee9d4f963ec68bc9"): true, - common.HexToHash("0xf65c035eefb0c63ad60e66cb6ba78110cf956a898b10ca587dc42ae8cbf2bf0c"): true, - common.HexToHash("0xa31a5bff8c86a868c46d5973069e2d270a38b630ac4193e7713f31c22c4b84f1"): true, - common.HexToHash("0xc35ea896ace8f0ef1c6dba752b24ff8ff67320b49baa86322b87d44170b92b5e"): true, - common.HexToHash("0xa1bb67b7960c5f2bf2b588b17954ba1b1b99a15209dcfd8fd3cf4e2ce00c9188"): true, - common.HexToHash("0x706d7e37fd764ba72caffabf07ddec81dcfc701064f08d5ad3f6e51a75afbe8e"): true, - common.HexToHash("0xb6a877fe8fc7fd24ddcc5fd3c327fbae7fb004731338a4f01ddc3afb6c9f9eea"): true, - common.HexToHash("0x98d079ff9332dbb1717dd6827411083af2c588b5c2a87278c2889dd7b5652c17"): true, - common.HexToHash("0x87cd8c7c89af491d93665a65d0f3183f06a7fa9cab1ff903dbee8fad776ad83f"): true, - common.HexToHash("0xd985e0ea7d79752349e125f08d26cd698da1f758027209bae80565be579a0342"): true, - common.HexToHash("0xd7c4c92a7745ffae3a2e37434f1a375f0a38e28fb01ed4bf47425aa657e1f347"): true, - common.HexToHash("0x6137b0912f4d2b670940baf01999c470aa73a3195007fb55b17d081e4e077028"): true, - common.HexToHash("0x689d1167f8ab05216e4ff02dd1f7c1ef960fd4ebe9401ca608a638d3a187718c"): true, - common.HexToHash("0x306cdd1b9bfb97dbce1a8fa1d0ab7168d711c96db01e43a3ded99a7ab663b429"): true, - common.HexToHash("0x23f09d46c79df443107e56b7a09ad6c3efded23b958617a5c1f956acb705a61e"): true, - common.HexToHash("0xcc67a6a36c2c84f8362facb887ed33f970373752b0c32a0ff04576c65746f952"): true, - common.HexToHash("0x7b52139110e90f0e324723afc669edc2f60e39126def18a98d862b674a29c2d1"): true, - common.HexToHash("0x051d81c0c2f4d7ea94966de2730b0b108001e738b657162788737df8878fe366"): true, - common.HexToHash("0x8c716ab2c6f16c2c5f7792e57e75ca0dae0213febc2440473daa9e38edf327d0"): true, - common.HexToHash("0x06b4dd5d7f3c33bac9fa3c08323cab4d87bddb1144c930834849fc45dd8703eb"): true, - common.HexToHash("0x85557978ac8981d6f548048a43f3dfc8b2fac2ccdd8bc815269614efa31372d6"): true, - common.HexToHash("0xa288a2848aa27c805a3e62421529de2566ac330a1ca476d3e2c0bdd3b0a6bd3e"): true, - common.HexToHash("0x03c5cd77bec7478b61241510e40dd88726886633d2d91ff7b251bec81c5f81f6"): true, - common.HexToHash("0x22cd03bcab832486a5c24286f64c2eba4e86b9f6437c3805742fa8cc790e5db8"): true, - common.HexToHash("0x0714bae85f73e5394781ec08b517ce632fc4e1d939b3ff2d20219e7b7354c643"): true, - common.HexToHash("0x0aaa2b3899701a97a87ecff9a77161d2f89c4f58418ea8af5f66f3f5a7e17722"): true, - common.HexToHash("0xc5fd5d43c288404ca2a6d05c50375241f0ab05feae00e8097b339f1d80c02f28"): true, - common.HexToHash("0x58e72dccfb77671b45c55f24503de3ab6604c8c388ab30a8d1e4f62a784dd5ed"): true, - common.HexToHash("0xc74eef3fcf6191dfabe1734ca59d1099de48aaf72de26efba6ef614dfaf199d5"): true, - common.HexToHash("0xb5e07f2e88078331e36f97a3d18dec2b07a8a4b1c9cb0abc3ddc64e2ffdf0111"): true, - common.HexToHash("0xf00820e3955f519adebcf60528cb5441d99967b9dad22dd73289701c97824886"): true, - common.HexToHash("0x252575a110298a9bfb678b3c3d44e2211c5fcb76ec43587ad66f7eb9efe7bb62"): true, - common.HexToHash("0x62f1e456c9f5afe36de4a607b5bfcff9e91f586d0392ced74d9566a2eef86b01"): true, - common.HexToHash("0xc43c7b83946429d55309372588fa1cf976ff2310025904b5e3085e40da411a39"): true, - common.HexToHash("0x5eee563bde59d59f33a6a91ed5d1e9d3342a68bdd940e262cd06566841321b65"): true, - common.HexToHash("0xa337d3045a83d32623de3b44c6339cbfc02a336ecae2e41ced5dfd59ee6a1462"): true, - common.HexToHash("0xfe99f23580fc5a47b48fda27b1b52438c4844581dcbc993c0b432de1cef9e321"): true, - common.HexToHash("0x053a12df7dcfbbd9489f84c61abb488ef784ab1adaeb092899631c4708b8e2ce"): true, - common.HexToHash("0xa5bb5e705cc5e15ba7f089e0ef7233c394856712eb1378280f7036b818a074a5"): true, - common.HexToHash("0xb6f6da1922267781f6acd5ad04379c36c22936117eaeb87be394f355a52c6daa"): true, - common.HexToHash("0xe1491f221f3ac191d2f26bc00f0775ff6aaa069b98d2771dffb9003c3f92f535"): true, - common.HexToHash("0xc7604ad68963b1803421ec035df479e419d8e971e85690ce01357079b9c4ee3c"): true, - common.HexToHash("0xceae7909ee5a36e09044138b12aff29a81c68eb3971e182157b0b54540c0f201"): true, - common.HexToHash("0x275ded20074f31b90d91c98962f9bc2210c13f5f89b8139868706cc1cf32e8f1"): true, - common.HexToHash("0xa89f8bee47e5be7c4e8dc7e31e4e5ff1c628056188f7c941ec1a20f0bcc3dfc0"): true, - common.HexToHash("0x4d9d07e2beccf99046857986922390782fe06cd3ff95aa3238536040a7f61cff"): true, - common.HexToHash("0xc9b6ef5b4b553183228120ed5ae6955480e45c8da857333e640275e4766d0145"): true, - common.HexToHash("0xdbb2309b78313326ada38e657229e989f4156f63eff2917dc00aad5b292be299"): true, - common.HexToHash("0xa3fed212dafa0cddde65c28cfa61cd1e6b39d5dac3dd9da58e18aa4e3aabd86c"): true, - common.HexToHash("0x5f570d16851b67a059f80bffb6af79ee44953116ac1a76e76eef5c0c1fd0a174"): true, - common.HexToHash("0x739c7c003fd87277440d26373a84ef9bc17cc6ab36385548f50646d0938cfa21"): true, - common.HexToHash("0xa87f990f7d678b4461c0ae2b18a6aee5d03c625340217f30b42d551bc296d43f"): true, - common.HexToHash("0xf71f1c4161dd401cf6532024c7ee539667154b3eb3459439d7fc5b2743fc5e8e"): true, - common.HexToHash("0xf1168a2b077be11ab55880c4b4a05b130703dbd42e9b7bd4911ba3acaa2acaf3"): true, - common.HexToHash("0x87111459cdb28c18f67ccfa0da53aa73a8e3104f1a3d391a0f17988e5182eba9"): true, - common.HexToHash("0x41e16dd05b245152585fe0c073c2cc388b3c35c638d34f62840ec115ec7fc3f9"): true, - common.HexToHash("0xd58d6c84e06472c958e487a50df5447a5e0d2101948b3498ef6f96dba3d7e488"): true, - common.HexToHash("0xef5abd63e6328e75d12c00a1ade1226af9a7839322d5d3452ae6c4e606fae3e2"): true, - common.HexToHash("0x412b84dcb5806886f93d175dd5492dc18a40cf71ce447da617200f5550308723"): true, - common.HexToHash("0x01df9aa21d17b8535b28282ccb9eaa3736616664f6f79ade568cc59741b89e8a"): true, - common.HexToHash("0x66d37773c4156a88fa0517474aa2af595b8892aa1a0c55520f19d3cc0fc4f4c2"): true, - common.HexToHash("0x16f8968934cd220704ba8bc39f60fb3df1ca0aabfaa975455734d9c21a908369"): true, - common.HexToHash("0xa92f587ba16a803d14c73e1817d8f402a4b51aff76bdb5fda256f79bf47f2535"): true, - common.HexToHash("0xfea81d9e24b4ffc4c964fa90d8bda2a85da0b4e8c32c2771be9860471dc2735e"): true, - common.HexToHash("0xd7f8d02ecd0e02bdfcb9e6d04aca51994b395740c89c8030e243ec4024f40d30"): true, - common.HexToHash("0x921d91051d8c2d2d2b5c002d18990b1cbf99150dac5f102563e444f9778739bc"): true, - common.HexToHash("0x3267e5587c0bcc93e9795abba64280a6480a6bdb25e67dd7c56ea5578f5c96fc"): true, - common.HexToHash("0x18bddd6b447748652f64836b9f91a1b1131341a534d886c8938bf34782abac0d"): true, - common.HexToHash("0x7875686a1c10647ee804115d334b0536c1f30fcf0d6699bf8aa6e5c8d8ab9491"): true, - common.HexToHash("0xcc69d806910b5199f58bcd98a2fa9464563e0093581e14148fed7602088c0629"): true, - common.HexToHash("0xf21b8e40dc006c8d1727dd07744f3d2610f235e4022e705aa1d70cf28c6c460d"): true, - common.HexToHash("0x4b357259fec36d3499d1c06ab21b7861283efa03032da34cf7c41c2d4d650fab"): true, - common.HexToHash("0x17e34ae787e3821e096b665d3a23b6d2e6e5e1a5dcc5db3b0629a056422a288d"): true, - common.HexToHash("0x40de6c98db6319443e710a234f6268e992f38aa71dc63a6901e2da12a5a6ddd5"): true, - common.HexToHash("0x57cfbc9a0ac9bb2e5e88ffe018eb3d3e04a9982244ff8ec2f9ea236e639b0e8f"): true, - common.HexToHash("0x9cc0590a5998f4ac833bbdc38fbf2d307851fd2d18c41778a64577692164a6c6"): true, - common.HexToHash("0x7d4e82b32edc95256b7ad30f6681ea9fd9e255909e71c254b124ea359de403bd"): true, - common.HexToHash("0x21b20e2797e04ac4ab93090370e0f870ef3b87eaec854d2ec6f2a99500b15a3f"): true, - common.HexToHash("0x746333ee7c7c587868c4d1027608c1bce349aa44b79519ab9636a7be235ed64e"): true, - common.HexToHash("0x9fbecc1168aff48079fbca130e1dc5fd9eeac887df6c9d9eff9fcd77f666651c"): true, - common.HexToHash("0x83ab5bb99b2b7408578bb1e73dd3208ecb8b2ff3ed7f87ad0759490efebf046b"): true, - common.HexToHash("0x145be1c5b8a436bef5e2e2e9873dd6ef9a994e8273250a87b62dfd69d14fde64"): true, - common.HexToHash("0xff8e7550e1542b15ffa02c33a288c753e16dfda2cc3ca0c34e8423b416953b89"): true, - common.HexToHash("0xfdf75cb3b2b984c31e8e515eae3e5104005903234de61d064f5f5c647a519a03"): true, - common.HexToHash("0xa31df5592bd6a431ccdba57ea5c4f1e7442babd73aa56b828461511c517d2364"): true, - common.HexToHash("0x4e3258bf453817d9af54fbaacec7e8e8ed37889974e76f2ca71b5985299ce0d1"): true, - common.HexToHash("0x6e8cbcfe2e0542497c4c59cb15f6d83772898638b55cac820d09cb670bd42863"): true, - common.HexToHash("0x8a5e2306c706526537b99ca0211b3e97e401a39d0d0567ccc4e4d10c04880861"): true, - common.HexToHash("0x78ee533767a465ec75ab46651df1c3cf214c38077e8cc651ffe64eb324de2b0d"): true, - common.HexToHash("0xb0b140896f3871f09576e60b9e089fe38783f89284c3cf1339fb1952ee809b42"): true, - common.HexToHash("0x79764d36fc999ff2873de2b5aa5f0e816bb38e59c60c2c882757cf792250f7f6"): true, - common.HexToHash("0x41fcc3d1e75ef4c1a57585006b0e02c6b61f7e52aff2972a7fdf12547b6a4d0b"): true, - common.HexToHash("0xde861724546a652822d0bb97921cb4989ac671a52c2e78bb6bc89da9bb983616"): true, - common.HexToHash("0x9a4ec344c0ffd0b0f77674447390116bc38ea1211beb647f2a13f6e4c8a05c32"): true, - common.HexToHash("0x67306ad0661487ac0ed6eb2f091f421153e118ee1fe9a05858f83cc7834eef99"): true, - common.HexToHash("0x33ee603e0dbc828061464bbca06f302e35704403d5bb506571b212f9196fc669"): true, - common.HexToHash("0x2d260447ab3fc14335594de1b6a7bde26d9c8f5cefeb5f27fd14dc29737e9d10"): true, - common.HexToHash("0xab06118d62929dc5543e3c3a1a00d87d195e7ce02ebc63731aa08a7701fe6f5f"): true, - common.HexToHash("0x8b854ac6b9a1d4f3929ff60bf615fb0cd732628496c1ab631281ecaa3634fa3d"): true, - common.HexToHash("0x1c99ac67a22072df78c360f8c991149ebb3465a483942b927d2bc1a5f1b0e5c0"): true, - common.HexToHash("0xb7a358062d6c757af6d9f8689543457026636806941da4a8566fabc0ae1df294"): true, - common.HexToHash("0x6d7fdef26e902014fdec38dad993bb48af076ebc6c75ad7cf119d04c0d805a4b"): true, - common.HexToHash("0x89fcb438e685e30d939595e2a1efa5e222b2349baf8202bcb2e3071cf75ac735"): true, - common.HexToHash("0xccf5416bea0d1b23074c093d937d49c1d54d792927f9e13d5800282b3b064e6f"): true, - common.HexToHash("0x1c47d18e70ea5be89eed7cb9fd843321e7d851a4959c1abf11304c61baf2dff6"): true, - common.HexToHash("0xc08423e5f572756a498c5b212be09e00958060e760a2c0d4ae5dffb9c1ecba8a"): true, - common.HexToHash("0x8f5ec292f1f4cf7cc157840b3309ab74366f9357dc47cb3d4bc1324d2d7e7d90"): true, - common.HexToHash("0xa8b01b4e8d04bb4efa716b208eac2d2fab624827af229b0f3ee421d2ea96f058"): true, - common.HexToHash("0x200ffcc3702f8723874ec860578850e6da09ab0d08264bb4023d85d64de06807"): true, - common.HexToHash("0x8468e88846ac8f5a2bf8450597d8df21df4ee10affa71141dc63efbbd382dd96"): true, - common.HexToHash("0x9296452e9776150ad026a08fe7e37bbe25e25f1eaa77be397cea387dd94e660e"): true, - common.HexToHash("0x6d56e13cedc695f565d1a9e2269deeccd3ea16658c90dc137cee6e583b0c77af"): true, - common.HexToHash("0x3d46b695d975fd90bc3a82e628c3d1f9591878e6dcc8ae40dcca001102875611"): true, - common.HexToHash("0x1adda0fc30386d227e354b3b271751ca9c046fb445c79f89aa7b56a090e238cb"): true, - common.HexToHash("0x16dcab5b0b5dd68793a7cc17827ecf35edace9d5bd87cd21c3defa3946ad85c3"): true, - common.HexToHash("0x0a936c14d152381f88a94ca2724d85a53b6e7a9157132b33295755d0c5b15a34"): true, - common.HexToHash("0xa1d142c32b4c507570001839cefd4296a2e1851edbb01d48e4592d38af6f7de0"): true, - common.HexToHash("0x7b50f24a816864c307d1ee6456c7b646eed9a4506ccd4e5f67a1250ee9ffb17c"): true, - common.HexToHash("0x657d458ef4f2dd59e08fd01adefc2ce8bc8f09f7b739f126418e655cc0949f85"): true, - common.HexToHash("0x67e98b1c7b8aac4b9cd0f70d21da2ce3f1da453c8d19f65f88b46ab960bbd6d5"): true, - common.HexToHash("0x08acc704be9f55b42b206a46b3a9773b7a74d482b8b044149c6ffb61f25c8391"): true, - common.HexToHash("0x2c8a86d54b3511e45956a45e099c5e041a1e5ba00b7886b97c8839eacf64b159"): true, - common.HexToHash("0x11886d691a6596236f295eb7c1b98c81a21a85fff83dd015a9234881393fd9fb"): true, - common.HexToHash("0x0489fec9dacb4bccc72011e29aecdfb646b821f4d0cd8b77dbf5d8c4e6a9e479"): true, - common.HexToHash("0x7d855fe51a3bdf3826fabf41f1bf04a659367136a4ba4b01d9074aa316ed1197"): true, - common.HexToHash("0x436ed0a3c84bdb34e705920edd2dc3b0df87800124e8ce41060085b0564d60eb"): true, - common.HexToHash("0x9718fc1d5ab133fe52084e1e408358b5ee5db213d5b9cd66eb83d88efc468e6f"): true, - common.HexToHash("0x53ef24b81aeacc80a91b1ad21491707faa0fa1e4f3089a229fb852e73dc0885b"): true, - common.HexToHash("0x05b4a07de0ae1e8e07e7a3475a0631b21e4300d9e9f87b9b24fc070bca37c6b5"): true, - common.HexToHash("0x39a8f1621a9b04b3b89d3b93ffb0c4cfec2a4da666084c63d4aa477f3fd0bdee"): true, - common.HexToHash("0x3f2beac75ab594cbabf54d557e850c77d87174229ac0f1761f25369bb230d1dc"): true, - common.HexToHash("0x5c7ea3e4cb43f5dc268eae887ada87c9c57c33b541e551b3ba5260975bee6f96"): true, - common.HexToHash("0x39b64fec9e22301f191b697327b80a0448e163f74bb0856991aede0b0626380d"): true, - common.HexToHash("0x9167fa1f49eb89f5ca127906e39226676294165daf617bee17c83f980ef2ca31"): true, - common.HexToHash("0x1ac666b1d52b5647af5c66174dd0f6a82d0ca8754c1923cd4d3606fe5f404903"): true, - common.HexToHash("0x84caaba488d149fd28002ac7c3d39cee1d3c04b71e7087bafa827a0c36e8ac77"): true, - common.HexToHash("0x4bce43a749496661e994f74569e43fc07d8ac3624f75e61b09ddef421313ccb9"): true, - common.HexToHash("0x081367daaeeae3569108b719c0389e69b30d0554a6639138211fe63079e2cd8e"): true, - common.HexToHash("0x29517dce1bd08f6e5211b44c3feb414bb12965ce9d4090c0ee91432092df947f"): true, - common.HexToHash("0x7f6db4a5420c1f5cd81589b6e56edce219aa38f09fa107afa8f0536a74616613"): true, - common.HexToHash("0x06fd8050a348c26c999c926df854e5fcb7beec9805922a4017a877d6eff8bea9"): true, - common.HexToHash("0xf92ddc32cd331816a3d5f220d588cc054c42d54d629b77b2f9749ddde4f804a7"): true, - common.HexToHash("0xfc465581d070ffdc43cd57339fb8070d9a7146d1a4668060d2964eb796acd05a"): true, - common.HexToHash("0x46df199d5662ea80062f624fb7d25bef50ddb2e4b50b0cf8fa820694a2194c55"): true, - common.HexToHash("0x5268a1d10bbfeb68e1e1aeb97a50360e369b4bc4d66b958d44d26cbecc3ad36e"): true, - common.HexToHash("0xcc49f390ec2f9d36efb6f70682c43634d9fbb56a1990e32bd315b1433cef7718"): true, - common.HexToHash("0xfb13c0f955335642d34ca444030dfa0090641ce5a7885248daf9759a6276e94f"): true, - common.HexToHash("0x92251c6d3fe070b41f83ef1e661db36d2514d93c7d16b0490d6e87acdd0a5ae6"): true, - common.HexToHash("0x43b9f1284428d63b35f091e7e080c15e8b1602946bad19b055391680baf7819f"): true, - common.HexToHash("0x8839fe30058d15094ac76a47842d0d632eb317e7e3f35df3dd7a8fb658d20452"): true, - common.HexToHash("0xb2b456c22c57b49eb9e477610e383c291f50a0cf7022e4e001bf59a01271f247"): true, - common.HexToHash("0x11c908a8d6c36f87670f8b015bde9d6a05df606811d219ded05504e9f4720736"): true, - common.HexToHash("0x3d16e8e4d9a1aa7c2dff880ab74aeff19cf3579f36b0ed7da7b91e4fd61a916f"): true, - common.HexToHash("0x7132e1225291af6c043f7d68a6051314697f43f67b560fc82e3e6169318d0147"): true, - common.HexToHash("0x58b087e54171f6e480aa7b38e288bee92d418fd4016262308570d4f2a23a7672"): true, - common.HexToHash("0xe6f1e55eac4c137536e1d09111808de22825459eb6ac84843109e652e667c246"): true, - common.HexToHash("0x072f55f6c4dbbd80b30891015d5f6595b431b52cb515e84cd441dcba2562b49e"): true, - common.HexToHash("0x6ed0919ad319f4dac574b36d06077ca7c2a1b510ea5117e2d1398d7ff18da18c"): true, - common.HexToHash("0x4846cc4bac2131ed1de074022068341d35fd5e44740054d67b296eed823eeba9"): true, - common.HexToHash("0x7e7e83b85f09c367eca758806b14ea2a67342aa50a77aa557f41d9302a6f09b4"): true, - common.HexToHash("0xaf5a4792f8d8d6b9e345cf0c19f2861058c2b04c97eb5ec0392a9639262005a1"): true, - common.HexToHash("0x279a695a60753e711acd1233cabee22e2abdfb4102baf23bf69eb05f2f990d5e"): true, - common.HexToHash("0x95d15572dde6eea9ca73d69a50a996f249463a841c197b54d20d20fcc108c30c"): true, - common.HexToHash("0x23e0074851599d1c93b69ffa5c9db6eded1c2f6f7a3ff1cc5568c0866a32711e"): true, - common.HexToHash("0x30b370a6bf917d43c27f482a10a00235b35aa1c8a3aab63732f36375deadd7b6"): true, - common.HexToHash("0x378f2152981ae1034ce20bd0a4fce631f2e634295a7c5047fdb4be6d35fc4789"): true, - common.HexToHash("0x641324f355b8638776805711b6ed09eaaa4e04de9292eba640fa922e10e3e3d8"): true, - common.HexToHash("0x782766aa34463a09eb9b562aa60c3032a0be9b902739729378f104a5a79744da"): true, - common.HexToHash("0x1c408373e6f7b2f59444216755bd4c6ca1e1c0d3dbf6c41e98a49f5bf88a7487"): true, - common.HexToHash("0x4ca03455827ee95b6f4ed869d155a7e6ac18845c4e542bad2a1c69034ad08a18"): true, - common.HexToHash("0x82438b3006ae9dfabcf060efbf29ac23a3373e8ac6ce9bcf501a26eecf13bcb1"): true, - common.HexToHash("0xb235be032999c05cbc32cc29a7b7044ef7d4e4764673a132e746e754ec18473a"): true, - common.HexToHash("0x03d26435a8fcbddc1163fc27ba1fe281b32018ac3e431b754c2cabffb5fb98dc"): true, - common.HexToHash("0xc8d2c42f1f03610cb58f07e987e197d95d90916d04df716324e7296a4def6e9d"): true, - common.HexToHash("0xfe7b09068cc6f2457f1b24a18d17cd3dea22a2b8dd0630ff87e2eb43bfe87f0c"): true, - common.HexToHash("0x908c88758bb6ef1252dda2de671d8d70fcc6e25681d7f08040e0c682e52451a6"): true, - common.HexToHash("0x0fe1cface8dd279b1dfe6f33eed5b34256863ec645b76928553310cf1f72bd63"): true, - common.HexToHash("0x0f80675ca5ce0377bf4dc87a1781dc3f7be3d676b1c7cca53ec16cd67cafbc0b"): true, - common.HexToHash("0x883546f66e1f4ca7995258593d95d151f1b74026b7fb5c67900be4639ca9e00a"): true, - common.HexToHash("0xfdd62d2434cb1af7f017f7ed9ace2bec2dcb333138a06058d45ec37dc9f6e71d"): true, - common.HexToHash("0x688181cddb90ad6321df398e86666c2eec291bff6e1445ec254d4eaabf277b3e"): true, - common.HexToHash("0x7de4b098b3c87c2a385a75a215ef5c903fc0d299381817402b067ca435322705"): true, - common.HexToHash("0xb066cb3ff898aba8f2e201352c113facfc64199dc705d0110a5e00a8cd9d27d5"): true, - common.HexToHash("0x1810c879269a518f6710b6db0152c5e3646993ffbaa0e61e3377bb81a87c09b0"): true, - common.HexToHash("0x5024b43c16d8a6281cf04273e35571e0d153023d3aa733fd190c1b235900fb41"): true, - common.HexToHash("0x6eb98e8353395abb720e89bb0ca3c08e8de4b72996b912a81c94831a74329620"): true, - common.HexToHash("0xfe784060ba63e86cd8dba1a627e145692cdd5c80bc809fd7021089c9cf3fae0b"): true, - common.HexToHash("0x5981b40a1d41e90938a5ea5040e5f33a105d3178d0234bba37d4cba938cd7257"): true, - common.HexToHash("0x2f2507ff534269e3fdaecfc692f72c54ac34ddd539572a16d59fd8e880b36e55"): true, - common.HexToHash("0xd17cef42bd7f203645fb73fa119be5c2be4a77e340721cf32eea11f5276e5a6f"): true, - common.HexToHash("0x5705fc652e742226079f7d9c91a5bf4d4753b165550f5aa0d71b1a489a039670"): true, - common.HexToHash("0xb25d8312e9f629cc2b3eafc87b414edd4868d6d14bcc8c6cde0130885d616a69"): true, - common.HexToHash("0xbb2ac2e2bb0536134e346dfaf8ee607c4834f86bb87456b278d79a61249c8e23"): true, - common.HexToHash("0xe053d1faba0c5d2ce665108644437220a81579798a31d566e5b0c1b9a0580f6b"): true, - common.HexToHash("0x28d24fe34e1a2799ac1d54f41b61781156901e1a97c4cf651e39b4b4a3a6cca8"): true, - common.HexToHash("0xb45bcd9e3eed3aac3727672544688f414530da36a4a32e802991aeaffd58ac02"): true, - common.HexToHash("0x0cd3f239eb872945e1b5c9a4159d3884f9428d3ad08c9db9a15895193b0f506c"): true, - common.HexToHash("0x3e0d1234ac58bcc58cb2add2f4ba5fdb6e870b7611946bff3fb5e7a30b97ee1e"): true, - common.HexToHash("0x10166a95e4fafbca1a37477cd99b72461f27580389bffe3bdff922b88ef07e4b"): true, - common.HexToHash("0x78b330f0e1796534fba2949fce6a6d1cd390fc50d0c5f8be77b4a1c076d33398"): true, - common.HexToHash("0x3de3dd5ee3cc378dc638cc2745e12f3983bdae79c6974bfcfbb4246b3305470c"): true, - common.HexToHash("0x865b2a6eabb7ee88d86e7528fa82a66052ea9610e9948dd4382ca4ee9f71ecc8"): true, - common.HexToHash("0xea71e14a190785041bdb312c5014c50f856acd87c3d1c32fccc840bdc67dd132"): true, - common.HexToHash("0xc3c1536be6c4be5ae2379a28f516b735fecc97e937bf4a5b607203a3007144e2"): true, - common.HexToHash("0x0e37cd1db46f8ce7a125f4c58626789cba471e2aa01381023661926e5741e102"): true, - common.HexToHash("0xa4b91236b1347a1ca126c5ff5f3bb2aa7065780262026730b884ee509f20fcfd"): true, - common.HexToHash("0xc4b91306f2f12e4543b3221e3ca288d0c89d5ff73dd24f9405cb807577c87360"): true, - common.HexToHash("0x0a8bc79e84709b45a87b9810c18632391068c0263c50b10aa8f065ae8f2c1024"): true, - common.HexToHash("0xb36fea45b0ddc3c29a4d62e1c7175786551fb4ebc0a18fc7ecec4775d13cdff3"): true, - common.HexToHash("0xdfeb048630441262ede291b379ba63a5031590ccd928441cf6b0e589606dce23"): true, - common.HexToHash("0x266a456ddf61dba26f38dd761f526c049fa9acf2370ce4833180075ff1c32989"): true, - common.HexToHash("0x37772e5f1c7d01967dad81599e6df274759ab4c0ffe059604ffde37775cf4dd7"): true, - common.HexToHash("0x0db615883fd025e5be6c46339713e4d1bbda3a807faa01755f671617752aaaad"): true, - common.HexToHash("0x81944b54e02a1534300a3681d6fe5e031112e9dcfac15735b32eb974e08d4ae2"): true, - common.HexToHash("0x9396a5e8c45dd25ce8597ad13ea5f56e42242bdf92bbef12bf9540c9a36610cc"): true, - common.HexToHash("0xe1f4eb29274dc8fbc41c1582af7eb16fa1331e8ca396d7b44db49d8fee36c4b2"): true, - common.HexToHash("0x4ccc5fc0affeba2b557f25491fcc0d4ccec3bc2dd238119754351b0f6ba577eb"): true, - common.HexToHash("0x11120099eee4ae7a19ecad75a4726fa0983f477303602204ee9d384061904593"): true, - common.HexToHash("0x6aec215247c55325f5c6ce5d242d369ef44bb557f6a9f1169a9058f64c596e13"): true, - common.HexToHash("0xbaf1e4cfc5a0d7ac235e9da8ce6c06c8ffd7dfb8033808998c0987b6506d9a4b"): true, - common.HexToHash("0x875d4cebf5362358c8b2f9547b536eb26916b475fb32cdb5e9998dda53bb735f"): true, - common.HexToHash("0xba53721b7d13275506328d4c5d63656f2d00b4142c777035b4d50431034d20c5"): true, - common.HexToHash("0x8d6a705a0e42ad5b387ddb0ad3ce4c14fca4bd1083f3f5edac92f8e8c47661dd"): true, - common.HexToHash("0xd5422a4cd4266219654af6ce313ce6b360455425c171a378186ec81999b4436a"): true, - common.HexToHash("0x49021d91727d9dead8a3d8e5e4bc15fcf4cd9f3595a3309158604079f09a16ac"): true, - common.HexToHash("0xea3ba91e1f31082d0c1244f214140662cb352a46afcee5f9b875b8013f5e9b0a"): true, - common.HexToHash("0xbe06480e62b723eac783ac6037a3e964ab25a2333d9c5570bffeda867b66abab"): true, - common.HexToHash("0x85232bcb246b3289c3c3917be44e9e9705bb3713c256ebcc0814b6cc379e749f"): true, - common.HexToHash("0x1ea53df362aa6053a4ff147deb266952d9b5853834634e0cb858573fd916aa02"): true, - common.HexToHash("0xc4d303fd3b725ee57a727380fe65fd28b5167d1d79aae50ad3a08d0ed91b2222"): true, - common.HexToHash("0xac7d64751b64502ed4e1287f04a61849bb4fafa5e3f14f6f2998be2c1fc6ccc4"): true, - common.HexToHash("0xa13930f693d96439a48ce11b2651d98e40d86995e439042b704333618d3e0d39"): true, - common.HexToHash("0xc00ae2645e4582b1698839fbb44a7203e4b60dd1161a99b1af9b7e4af9eb18d3"): true, - common.HexToHash("0x112ba43ea2935c33af85d5c756d440b83cba8e020427515d0df81846b6efe0ff"): true, - common.HexToHash("0x292ecce6cc786af4c2b1e1f4f4c45f078bc60a7e6e68506f907565b5187f2c28"): true, - common.HexToHash("0x454d6a322ae92250afa9d20784d5cc88dfe6085c93c9519b4120c76793984200"): true, - common.HexToHash("0x2c27caa33b953b8e6e972cc995b64560e124d9b8098fc4ccb65be7942b280e5b"): true, - common.HexToHash("0xc600c2f10ec1e1a24ff6fa0005f46fe355dc7cf835398a84409f1e65b9119725"): true, - common.HexToHash("0x6e06dd9f0d771c90b61b10fb8f2660ee5489a48ee646ce1f8a2829c9461472f5"): true, - common.HexToHash("0x731bf2cd46d02b9134ae05ff99c3dc441168a236cb0fc9027b84148289db5704"): true, - common.HexToHash("0x1cfa7207da62c3730a6353b7b85425dff23fbb66caa61c1aafb7c6ae62ccd34a"): true, - common.HexToHash("0x00c49c96663effafa1bd9687cf3ab04f06c7ca8490b359224ac038a7b92803fa"): true, - common.HexToHash("0x34dcb0db6f7de77f0fb7368244e3c4b99ac9d377a73116722d2da8162ffb9f3e"): true, - common.HexToHash("0xcdfa2dac9e92465732392e816ff0e8c87b9c956793b242e2753c32d239dc6277"): true, - common.HexToHash("0x3d2fd118d770f26aa4c3d4f2ddbf2b0f4e14f8f21b4bf902b07e87977e7060df"): true, - common.HexToHash("0xe0df99558d20aea3cb66f69c82018e7b643ce049eebd24eb8dbcb95e9b707b06"): true, - common.HexToHash("0x4659c1a197b1f585ce3c869fba679ce4228ec78656433816eb71cb998820885f"): true, - common.HexToHash("0xe3b6ce57f9797edb043cfa27cd6a9d661ddcd85a5e9fb589f9d9d739f0eec5e8"): true, - common.HexToHash("0xe296665fa96241069bcc65ea6fac461c802340016a4bed51888876c38e9638ae"): true, - common.HexToHash("0xb317a28530ef927c22e6df50b433371d817e76317a87ede37ee239aafbc1e793"): true, - common.HexToHash("0xfe5a300cc59de2d757296cd986e8184c1dd7ea77f286d54cb6b20ba86d6ae8ec"): true, - common.HexToHash("0xc3ae20f5307fadff0d47e19a9ea90e6ac231d2df48335a8d3f690bf3f76113a2"): true, - common.HexToHash("0xbf9833339579bb330d6a9307c10ef99c58603cc8ff18da4ef24a03e0310587e1"): true, - common.HexToHash("0x900d4b4821d04315602a77768cc7f2c2828de8e9c9c569bd5086c087b33a5441"): true, - common.HexToHash("0xddcdbb5fa10a0119c16e70ab81a5891cb390377ed1bfdcc17f8f0d32207d5e11"): true, - common.HexToHash("0x5abebe4fbd08e4d85894b07496c0a9b8ca715eabf9555358cb16ded5049ed4d9"): true, - common.HexToHash("0xcc225bcdd9e3e10cc8ec9f1be026a39227cfd4d4b4aa8333c2bc40e6b39b8c34"): true, - common.HexToHash("0x5d440b3a9a868356f1e42b4b0812e288ed6661263fe1703f09e33e49fab76362"): true, - common.HexToHash("0x8ad423feb7fdaaaf785c9ab948f2f404313fd38e5dc1a0a4e11dbc1cf71cdb6a"): true, - common.HexToHash("0x0661ecc6c7bf840a8c46373137540d6abc94fae46127e38c4dc8817861ec388b"): true, - common.HexToHash("0x82186e1ccdde041d49d2bc757a9de0ee296f6e2ef5e34e3b2c6dcfd952a9efe0"): true, - common.HexToHash("0x344f9a9f393cd2707968f6ae5e7f1d1efe32ad0d15abf03e2e5e1a11707139c5"): true, - common.HexToHash("0x14a3bb61661353524acb534fed098fdada2007947277e0763420731a7e449a44"): true, - common.HexToHash("0x07552bf5a8db2a12fa31bf4f94ab2df85d3cad921fe27af033245e3b004f24ac"): true, - common.HexToHash("0x9806a77d6c9a7c424bb5e0d3492d062c6c82b26ad4b88f3b7e09bdba3e561c58"): true, - common.HexToHash("0x9539eb54101a556ff7c946d1205d6ccd554f235e119a5b7d3801e3071cbc0edf"): true, - common.HexToHash("0x5ea6c75105779829dc3b86ad489fb01b3984f7f414b6eaa9625f6886635f3a8c"): true, - common.HexToHash("0xd902b0a0b9dfe8978a1932b08419b161a6d59f41bbbe5b0c6ce3992182ec4cd1"): true, - common.HexToHash("0x28dc7aa9c519ddf5614fe1bfab1365a14f5678c77a3bb69685e8250bda40b78d"): true, - common.HexToHash("0x2d7f3b2e59136949efe93a1447c79c2317213ebd9ae92c48f03d558dfd8eb796"): true, - common.HexToHash("0x53e8bda2209a96ac8723d561e48a4d77c432d5675a8077f7915708f7d3302624"): true, - common.HexToHash("0xb45e6e0ffb093ea1a95c4be33a39aa8489e93ed448c6dc3fd7df8f4f96d39694"): true, - common.HexToHash("0x2d8ee988f718158d10d8774f8377614dcede80756e30637210b2263a7c1a4d54"): true, - common.HexToHash("0x13c625c0ac3df59650950ed0ebbfdff8c215120d18672f53601625773b371ca4"): true, - common.HexToHash("0xf776d0f0845d3349f5b262cee4d782176043fce45a146ac9b09a0b505134247a"): true, - common.HexToHash("0x3491ed0193a9dbfd4816dc85638354b9f437667b482e5dc1fabb9eabb0c18a30"): true, - common.HexToHash("0x69eacf076dc376a855fb8dd220259478de5109632d32147632d413e6ab133751"): true, - common.HexToHash("0xe086be26b36f2652d9899c2cbf266821d2ba0129e7964e053f4783a45dd33d1b"): true, - common.HexToHash("0xb089031d132c65c17e73ca86a30a1b6d888b7f5ff26fd57cbc0fec93f62c4d9d"): true, - common.HexToHash("0x8d053313ab6467908061ab4e12e1ee25902ab8bd9da9c9c59d508af70743ba08"): true, - common.HexToHash("0xb3ce2e62d9c624513a144a7bcd44c283eeaac80d29fc2817b55f89183c6cf419"): true, - common.HexToHash("0x48e4ac9b369ca874517d34a55c70c354f1615c1d135ef6d01cb52f4b7f1c1cc6"): true, - common.HexToHash("0xa4091b2ff7632a057f9318e5aa86c261453f2ef787ae4a3f8017be3087c1c04d"): true, - common.HexToHash("0xfe5f5445370f7d0af75206d53bc8e83a7b082746a28ea1dee8119672d586c7e5"): true, - common.HexToHash("0x12e117c5403866be5e741dfaf5c3b1dacdaf1534df76f5c22fcbf2b2f5329753"): true, - common.HexToHash("0xd920f4c977011d9fe855d55bb9f5de1d3e876ea594ab388fe084f11f33c6d12e"): true, - common.HexToHash("0x88dd23a07f8a2b38f79a79f613032d2ee2592753d6d793c08bfd2d281ed45547"): true, - common.HexToHash("0x45c6d915954b865dd9d22b136f2eb182eafe283c430ada47a640d9d871654557"): true, - common.HexToHash("0xf62739835eb7dfdb4c10b66174cf80c420a4a249ea9f9aea319c2b836683fd0c"): true, - common.HexToHash("0x7de5e1b752622d68c55b2ef95fc077f049c02342e7c412ceb622c33199045264"): true, - common.HexToHash("0x04f91caebdba84167c11f6b7eb9c9d32036b56a691e9cee700e4278f40a25ed0"): true, - common.HexToHash("0x81f9c415f3a0312da98b477e1e487cd3169021d0d440360a2d1cf5a1333b3935"): true, - common.HexToHash("0x2371c7228fe40530ac68702c5cef08b7b9933d6c360b9c9a8f11f270d8771eb7"): true, - common.HexToHash("0x0619ff6d6c01a809c1e664e9dda5ab7f13e58e2dc6d8c54e1efd801680fbf202"): true, - common.HexToHash("0xff741346cbfee2194fd6429281188a5b599822213a6c1e5b8b7a169ef270c292"): true, - common.HexToHash("0xf8bcb24c57e550f81cb09f6bcf8773868dabf5b5681e04c010a76ac8d47a542f"): true, - common.HexToHash("0x17269b60261b33c27c5aca75f8efca05e118e59f012921127db5330c78b22f36"): true, - common.HexToHash("0x60f21b424d4162a1056efea4de1bbd0a4dae0dd41204eab4fb81cfb053753321"): true, - common.HexToHash("0x5eeaee4e57dd92e63f4c6bc205af95af604804f64ef9343b5b7c3e889e1acffd"): true, - common.HexToHash("0x3778b4b4af386673f6ba4362bdfb7860e82642f9c26cb86b7c114887136ce6de"): true, - common.HexToHash("0x8141aabc4f1a05fc521c8e6f308440fcb29882117e5785c651fa3f1f19d2d69e"): true, - common.HexToHash("0xbcd6f8244a61ce360f8883be5c2e85b97087ae3ac728ef5318fd0d97cc7d2245"): true, - common.HexToHash("0xf98eb81521a594b10b536108f6bcadcd39263a3237b3cb9375f6b7381ad52dfd"): true, - common.HexToHash("0x5b603e3831eccd65b75fbe41d06e9b4d4129d80437cb0d8d54d5184dc0532c51"): true, - common.HexToHash("0xabe407a4f41ec1e8f4a141517652f408d6f581cd23fbd2d712a97404f5e80a47"): true, - common.HexToHash("0xba62cbdac69be57584e6033b72036306f2149b225fb7bd2654d11ed96a0ecfad"): true, - common.HexToHash("0xffae049f3e037b06db415e37d98f835b4a50f9c94a09b0632f3aeef3db1da888"): true, - common.HexToHash("0x86f7010f6d7614201c89b3b8fb9f5f1e749ee77c6082868025652c091b841ad3"): true, - common.HexToHash("0xfdc9024d5136309b7d60cf7518f3e2adfe99f9f6207058f1145975f8f096b3c2"): true, - common.HexToHash("0xebb81ba7d0d27943d4aabcdf975fb282f27870377174d807d3f78b7e0ea97443"): true, - common.HexToHash("0x21bfc6cbd3f1dd34ac08a733da302ad7abaaa94b559d19cd2e4480852f04874f"): true, - common.HexToHash("0x859cddf5e54b1e2a846982c373af934ef0af69e9e0d4f3028384916f32b55b6d"): true, - common.HexToHash("0xaee811213ea539981330dac62d01fd50df79630be2379da0e19d5387c0b0007b"): true, - common.HexToHash("0xfc94b19b57629a7419d7bd23d620fd70947b702bf06709f18b0d7cb865b9554a"): true, - common.HexToHash("0xd11ba987c221f2fd1ffc870cfedf7c1cb1bedcc1f1ecc96e3e52a3f7f475a4dd"): true, - common.HexToHash("0x13e052dae3e53c53b0ea014114cdd5080b2eda1e2eba956da7ca4001878b5b42"): true, - common.HexToHash("0xea3db6061a0a26d974ba281658b4e8d4ad58feae8d648d8c51deccd2f6f90f5f"): true, - common.HexToHash("0xf25f0ec3e1e179ed33942f30ddf678801276cf08498d1b7b651d45688ac018ee"): true, - common.HexToHash("0x14763be2f0d9e2ee10799c7588d8b09718f253d0de182a209776998f15e8dc9d"): true, - common.HexToHash("0x0e5d0312dd1ab59470c658d76f406f17b7f88d61441c1cc9ec8c3562723fb5bb"): true, - common.HexToHash("0xf48f327d0d77cd5d77608881321f7a8d6d40b787cfbb4aa31849ba6aa3444453"): true, - common.HexToHash("0x37944fccb8af9087b21ae42f5267404f934593b0f2621e037c5aa2e5d805adff"): true, - common.HexToHash("0x305a8917cf33dac1c32888bce3a5385de40d444b0e1decab03afe88e694dc70a"): true, - common.HexToHash("0xc37a59f32c9ef2e790e96200c54306224dd907e28d3dffb342d3dee647debe31"): true, - common.HexToHash("0x89c17fae71c6530fbdcb19fa567a9507bffe4edd10e8cb9d5631e773fb26879c"): true, - common.HexToHash("0x897635bf625f736f59a1a649520100436185bd19e9acf41ee91e446f8515c224"): true, - common.HexToHash("0x1d9e69577d62fbc34fc2297107062c805bcad1e254e4c9cf060538e8f8cccfc4"): true, - common.HexToHash("0x864548ceb51d3ce3f167d2eb8acc8907df8aea4b1c35795e302e28e57e3195db"): true, - common.HexToHash("0xb0b88443c593ec17dcee14b462b5a13470f3a7d32ed577fc744330942bc7b161"): true, - common.HexToHash("0xce59f10fe2d9943f8bf5c4754009396af45b7c4e0ca4ee5ff14aed1ea304d28a"): true, - common.HexToHash("0x1106e8781a47eaf9f009b8834f89373df132f369b9976a0b89203dbcbf8da1c6"): true, - common.HexToHash("0x4c2e2c87aeef0fbaa1cae4584f3a478412f7cd6ee4c4e21fa10205f8760e3353"): true, - common.HexToHash("0x95ec187ceb23e914b8e0e1659b555a09730363a5f38bae71ce49bd3ef2614856"): true, - common.HexToHash("0xcb8da03bc8db703ddba9e7ca1099c25cee1c3bfb6c595ef8b7f5f650fd60f2d8"): true, - common.HexToHash("0xfbca65a11172ebc11c5f5c3930a389cd1b9fcd674309c2d8f066efbab32e0f3d"): true, - common.HexToHash("0x8b61b7ce32928dd9838afa792b03f40118b09182e87b7d4a1a2d65624ae3504f"): true, - common.HexToHash("0xe424b7da725152497124a19728ad855ada14cc094a5a937187c45d39d00f8b78"): true, - common.HexToHash("0x8b737e2aafb4160c7535b5bea11b770240c31740e48e4f830079293e216658af"): true, - common.HexToHash("0xb8cae2610616e3ba76767ca235ddd0bfe179c36504eda81cda6f37ca9e7cbfb5"): true, - common.HexToHash("0x05111f455be73041dd1473943188d1997821dec929110232be3cd51f6d362f70"): true, - common.HexToHash("0xe8f19bf8ac46ea64e90dbac7878a20891e752e3f8911cd24aa94d7a41716b5f3"): true, - common.HexToHash("0xf369e545f6172cfe1c813d96c8997af33574f660a0052886c3268cb86cd8eb68"): true, - common.HexToHash("0x5cf6340867ef08b4f316d4fc072b99fa143806629a14c58f7765fd75c2623a93"): true, - common.HexToHash("0x9d78c1622ac8ddb03082a7403db1aac6f23f34a2369bc431bff6e09dd41ff7f4"): true, - common.HexToHash("0x4efb46bb9db78c5e6361a7eb80c18165c4150329259ef593000ad1086b57e362"): true, - common.HexToHash("0xfad0a6bae4deb0e8f15e18125fca391dfc6c2785b5b6fd8ed34370188c4416ce"): true, - common.HexToHash("0x659391328c91c5dccd66cb3a19cc7136fae268d3972117de0d4c485a20fd99cb"): true, - common.HexToHash("0xa9894ad66e8c2a8fd7f4e82d6428150d41a673ca45da9a75fe65e5542ef96d11"): true, - common.HexToHash("0x4a4123505c9a4914eb6491cf0db9adac0d12ee6d0d2ea8d85111d8e72d0e887f"): true, - common.HexToHash("0x3a200e16055da3b84e23ac62610f6a77773b295dbfa11bd666a393ed5fabe24e"): true, - common.HexToHash("0x51435891a93a0a087f59831fca9fd2b378e30e568d27a1e346fdb255a5bb3be6"): true, - common.HexToHash("0x7b5b67313abb38f9fec5308f6d58f73d646715aceac405a6613c458e581f3c2f"): true, - common.HexToHash("0x40b17096ab41f28e85ff2f701c6c9e59da10685a74aa06e99866ffedd0d87ffc"): true, - common.HexToHash("0xaba8e5717dd35f085926d1d67f33457bfdc306ce5805d7ea934702287e42ef27"): true, - common.HexToHash("0xcfcf35f40991fa9fc9f39d9d667a5b96ae6ab1644aee0f13d4e4400db93658fc"): true, - common.HexToHash("0xd44388e1fdd4c5954fbffbc7398af75243f307ded4468d981ef1c746d58afaea"): true, - common.HexToHash("0xde455f9134b1d61d30f845bd54840b2e425066298e0b8e8ac44928394e4b7dc5"): true, - common.HexToHash("0x65cee43019287da50aed74002a848c552d2cfd8ddd71e4f91ee7ad10d8c4bf3c"): true, - common.HexToHash("0xffa3222b7139339865fceea19941c89b43f98e1dc20dbfe14e95abf61ec61bbf"): true, - common.HexToHash("0xf79d1c3ba332f91055e9b4e41abad01cbbab02140b6e623ec227a1e643b5079c"): true, - common.HexToHash("0xf0b185f36a482195ab0817c05d345f3b33014e19add263257a22007a616183f8"): true, - common.HexToHash("0x2d56f4ce8063a369e7cdf3edea1dcda56b00599073b53270ad662d35cd05a92d"): true, - common.HexToHash("0xd3e4ac7f624d0490a0a3b05567f4c7cbabff592f61f560c5d220386362fae7b4"): true, - common.HexToHash("0xc0acbf62cc561f533d11680f522afd2af59908a781ab9ef40cfc37074b9510f5"): true, - common.HexToHash("0x5d111d44c2c9eb980a742385bd1cb8c34b313109e9c7502eaa69bc75d4cc512e"): true, - common.HexToHash("0x1e789670f92121f2de8d3e5028417873a9c0185339f355a6812d0ecc24d69d30"): true, - common.HexToHash("0x93ba45c7a018ec926b2cee3540e77cf67a8c4cc042218618c0bd298a2ff4ddd9"): true, - common.HexToHash("0x23067fded6ef04bdec469d3cb5d2445077b5a9bf12e45df61345f87f3b305d89"): true, - common.HexToHash("0x6152b5155184d0dde4ba76fb17d724c31de8a5e6a04bb8033340a1aef5a12910"): true, - common.HexToHash("0x62ba90991047c316cbaacc5fa0b286c735f24e774a470f30f321940fdfa89a65"): true, - common.HexToHash("0xe31483f25c67a20ba6cbf460713ba2bb2fe2bb798e0d014408b3805ed6a1ac4f"): true, - common.HexToHash("0xd1bb3c7f53fee198a8d0979d50a56b86d7588be2ccbd01189be556ded0d570d2"): true, - common.HexToHash("0x154377096b368ecb6135e9b7330c2331add92f0720b6eb09bd1df2546a416f43"): true, - common.HexToHash("0x883d7e392e71dd42fbc504d1135d95f8508c139b75e6c79e4eb9d9d067b9aa71"): true, - common.HexToHash("0x894d9a0c73c6432c66788e20b15cb77842eda03304afab3f0b77cc51cb3e899e"): true, - common.HexToHash("0x824888e3e62f65ebbd911c9cf0a770cc6562f280eeafa9580fc6942537bf26d8"): true, - common.HexToHash("0x944594672a9f0421866cecfbb330069961f404e1a78e99115eb94d192fe252a1"): true, - common.HexToHash("0xda3fb6fa131a0145f0402ed18fce0376928ff9d73a8406655bda8b433ee938fd"): true, - common.HexToHash("0xffedbe8120f9f601f65af06d112a108eb8732cb544f0a6e9460abb8e4e0bbdea"): true, - common.HexToHash("0xc5420cadf3d1b7943cb6d6c79ffcc185a3dd16081a16adf30b0f7af866f9175a"): true, - common.HexToHash("0xe54944f949744e5f2bae13c901bdcf0fcc1c2ba69e70e44fb78e6c918df50c1a"): true, - common.HexToHash("0x6c5691b3f0604ee548c094f97e4aa00e4cbd0016e150b292bf27aadf664ef593"): true, - common.HexToHash("0x37dcd42785c8cff90dee88b4ce657ef40ac320701665e9568396e7a7b51649b2"): true, - common.HexToHash("0x35ba6508babb2b8672ab153b8c8747680cf27b912a7bdec6ec7d4974afefa80e"): true, - common.HexToHash("0xdcdefd08077d5c7105d634b496a74bff1f307622a3a66236ea8eb815e4c62ea2"): true, - common.HexToHash("0xc0126e0e0b5f7bce643cfd1621ff1833aba6419e4b9d759dc3bcd2318f7aab2e"): true, - common.HexToHash("0x0413aa5c117868671aab97ed9a5f6a94a8a5f5ca9f0815975090a5cfc2af8ce8"): true, - common.HexToHash("0x567d6ea6b06a822162ce22eeb16a1a0e59d4669316e2e78cb65bc6ca4de06c7a"): true, - common.HexToHash("0x53707c0e7814c7af4b140dce7fd3032725a78c467a890c32bc2f5c9c4795e8d6"): true, - common.HexToHash("0x9b4d46491341b6f0b0b00124139c3c96cf7623e01cc526e9919525caa77e0bee"): true, - common.HexToHash("0x728e8a28a5aaa40cc2952b34697275c55e764663c742170ab6f0a368892ff00b"): true, - common.HexToHash("0xbedc940e29dc9cd1c8a08d57cc358d116df8e735ae3da0b6ad92023f109f4bfe"): true, - common.HexToHash("0x09b2fe68b4774a773af753937fc83c434287d0c6d14e5af8816b75180cea0df5"): true, - common.HexToHash("0x00c64dcfa28ac5e249b784eb4cba4c30c1bf07974bdd72ada0e0c0687a8d66ee"): true, - common.HexToHash("0x051048d6a9376352c1496bc4b3a7b67aaa3eb33fa67c4e3273df96618cdcdd45"): true, - common.HexToHash("0x1df1568a9ed65ea1677104b1264911a1fb13b9ff94010e6bc711e50e12c9c982"): true, - common.HexToHash("0x12ed644540ea8e781b384ffda2db76fb8804ab345a7a21cbb57cf69d3ab8d291"): true, - common.HexToHash("0x9d2f1527247c40a89ed99c3b895249d1cca7837eb9863b033ff9ed1649fd9da9"): true, - common.HexToHash("0x62582b6e777b006bbfb8e47d71bea94474a4a3b3cfb6761fc10914a501663a8e"): true, - common.HexToHash("0x41763c12963585c72ef4dec631ae17d449a0f115e47aa97f3243c248242558c5"): true, - common.HexToHash("0xc9e85b21f5eaab5f0963fe4b386add9ceed117a8d21cdc27e80d4c839f77dd79"): true, - common.HexToHash("0x1666ba428cd8956f56ea1acdb5867936c919089415d14d160b7441c0bfbe151a"): true, - common.HexToHash("0x2c3aaad54147f6b795092d276d2c0fd0d6a2c87c4c3c287b8d34f05f79d81f15"): true, - common.HexToHash("0xb88c5b5140c7d39e22b0c443c197762cfbc184f6d18cc48ddd9429d9f1859ac5"): true, - common.HexToHash("0x137c51833ef2e732b8f456b2e5bf148c930f36d87cf409020dd2bbc7f4c0ace9"): true, - common.HexToHash("0xeb4b179d67679c02a1fb761765bc94f0d63df8525042f07478661de3d63c05c0"): true, - common.HexToHash("0x0c4e8d28500b20770bcfac9752bc07a3c602e2d3470e74f54f071605a481f61e"): true, - common.HexToHash("0x40e590719cccf96f59d13ae1a195f92caf58ef4ebe7a28b0f2b555e030d0df54"): true, - common.HexToHash("0xa53a2f9dba6e073d252d78fdfd96fcf53753e0f4c4761d0b37fd532f0ed2246d"): true, - common.HexToHash("0x79a080c0455f8ef1b3f6d774c96b06998743f9160d83a4eea422e90c40f3f277"): true, - common.HexToHash("0xe40194401ad5b4c2f38a445143fcf5ad53cb5e1b37fd093909d11db1be2e1a01"): true, - common.HexToHash("0xdd534b47a362adc57ad47558f7057f0f8ca601ee3f6c33aa01a28d46e7870a8b"): true, - common.HexToHash("0xfd77af253100902c7bae7edc7823dc62a237671ce785a8cd7e4ae259ca34d0ac"): true, - common.HexToHash("0x26848e3be6abb1cbb8b8a731e19efd5b549f98dcb414bcafa25225c38b23ccb0"): true, - common.HexToHash("0x7464f6e601299b95d4fd72de5e41d32de2c394244fe8669c6eee48c80e295f07"): true, - common.HexToHash("0xff9818230005e22020de87fdd98cc1196b80844694f61161146f9cbdf60e9bc2"): true, - common.HexToHash("0xab85cf516d371e512596826087b32ea2fdb05a589375664576ca2cc93122dac1"): true, - common.HexToHash("0x3df8ea01c0ff9ff68793dbcd4fd5a5165c4321537240d261a3293b1287df5763"): true, - common.HexToHash("0x8568c88d288dc325b84a122abdd29a00b544731f2cd2f000c4124cfff6ece37f"): true, - common.HexToHash("0x46a64aaa1fb1bd77d0e78e507742045705f24ca2702445f11addcf220140db24"): true, - common.HexToHash("0x076e5753c28a163d6fa343aecc71105b5b0c712e74565b70bc6fbc283d518c1b"): true, - common.HexToHash("0xf5e358d5204639a96b9fa37d237c29b0ed58156ad9b22af911bb67f77b57290b"): true, - common.HexToHash("0x2651a9c3138bc55efd21eaf9c29a434429b8b53451994eab4ba7225441831db1"): true, - common.HexToHash("0x2eff4e095e5906a836898ac409476e05428d8593cbfa5baebd970b96dd440bb0"): true, - common.HexToHash("0x4dcd58d120aa39332e47e5cce2f48793fc57ca70b0a4f1907d576fbf137c0a22"): true, - common.HexToHash("0xb0b2936cd9f9fcdb9e44f27e98a436cf1a71d8a680e2102b5babf798d215548a"): true, - common.HexToHash("0x2d628c65493c4b33c54969e84a2560c2c6b0f6bc07c0a79b1cb30eac93c0ab26"): true, - common.HexToHash("0xc4ae06439c3c7dd434cad7746ee75feca652ec6150d060d16a758610964165e7"): true, - common.HexToHash("0x15340253b133989494602f0e7094a1a84a9e2e4957fb350177300ca2921cb31f"): true, - common.HexToHash("0x9220e4a1ce9da13b2c093b380e3dc914ad3b022224146e5d24e754f5d1f1b098"): true, - common.HexToHash("0xe872699669c1817193cb7e4e31bc99dc4c270661ebe0cca7b29f11588cf58c78"): true, - common.HexToHash("0x0a0718763ec02acc7d8e5adaca5e39d6d460edd5f025c6ab7b4ef61b3c53e466"): true, - common.HexToHash("0x7aff2347ef39f35a7784c33898cb75621338e1ad3c663074bdc9fb2412fef6ca"): true, - common.HexToHash("0x23956bd0e82fa0a8e08ddc41d66ca11b44f56350b1136d1b59e727f1cb1b78a6"): true, - common.HexToHash("0xa6782fe068efe45a45db3f932db66877dec7660ee8f3f784a092a87ea89da7ef"): true, - common.HexToHash("0x3fdfae51b524c2cac5a5c2497c2552867f546dc3161b8964e756ea4442b2dafe"): true, - common.HexToHash("0x0e102e3f2060680210be9aa04ca630d53e9c70d779a5dc20e7f86dd18f955256"): true, - common.HexToHash("0xd1d584163a8566838af02b8ce0e18f6ee0a146d5f778bd303590c4053e262e78"): true, - common.HexToHash("0x615e88f532483b565df3c2991ec94de2a3ac908f8ae64b849b3ca633af0c58a3"): true, - common.HexToHash("0xab2e20efe23c28553b635f0a62a0cef83085538710dccaef2a40a4d6033d0779"): true, - common.HexToHash("0x3604c12f955428f7a7c868f371ddec64ef1b96dc65c4d73c5e0e967c5c4c23b1"): true, - common.HexToHash("0x72e56b514b240725d12766045a0c85430d76aa72186bc9300d26246cfdfcb760"): true, - common.HexToHash("0x2a307a63af6b0d9960012d8316eac525a4ac83636d9d23a87166807c3658b2d0"): true, - common.HexToHash("0xa0364caadef201c4f015d5153f5cfd8155cb3a02e49c325c55537edc361c57f9"): true, - common.HexToHash("0x29ce9b46fe87a96baac16dfe1bb19bb69fd642f8758fb7a1b089a4756883e054"): true, - common.HexToHash("0x5ef8c7c97f29509112aa63aa860ddda0361effd7842c2c61427b7039428a90a6"): true, - common.HexToHash("0x39a8460315360d29f9eac7b4b8010af05db1fd8e793369a9daad56384c879133"): true, - common.HexToHash("0x488356dbd2cae899ef356df1d36962d664d5d94e2330706a341ceaccda674eeb"): true, - common.HexToHash("0xea479312e713c09d6453905dde01ccf94e6868c90dafcdb7da4ba734ebb62321"): true, - common.HexToHash("0x5beacdd6bbc4659345853593e3487e4bbd2bb73db790ea83b0e5a7103eb04d9c"): true, - common.HexToHash("0x860c675171a49a6ee2e13797b10d3981a3b2770f61e12a20d644dd089235c913"): true, - common.HexToHash("0xaf07ff7d2ce60e79df52f3c1250a04e32f295ab0e712766ba62fb95f5370dddb"): true, - common.HexToHash("0x2731676c82e952d0d520a6d3f6e0c9ac10f2ffc146378fd97c2822708dc1d480"): true, - common.HexToHash("0x4717acc97b05b55d447022415246835ad14c926d1f38291f40956a7a2ba43738"): true, - common.HexToHash("0x503aa5e310a690d1b7049aaca7b5a65361b7d4649d08d9f38cc2edf5aa89473b"): true, - common.HexToHash("0x5db8fc54b494f4da76d1b67e469fa4067938790042d8274f978d9af4363e7a2d"): true, - common.HexToHash("0x2535f66f77265a78a41c492c26f7cee94e1f9e1137bbc1ae6594689d7966effc"): true, - common.HexToHash("0x6252b7b64492fd15eba64add48b2f4607ce3c161610caa491fea0386a9194999"): true, - common.HexToHash("0x73455387a23401bb42790356e003a2664bf2d85636f43039e2f3c7b9d4145edc"): true, - common.HexToHash("0xb2f2f4e76b40dbf01276dbb479ed9b63a625fd8946e25f7e4135fce8571be08d"): true, - common.HexToHash("0x4e2589a4d2fe10e1b5157cd91cf6d04e3df41501f827f3c6eb3e9cdfded49073"): true, - common.HexToHash("0x3ddaaf72c57b286dadd0eaa333c280722cc7542bf8234149bc85bdfff59ee2e1"): true, - common.HexToHash("0x55b55e93315334943a755097cbb1bbc854dabfef4b75dd8f534d23be5c9e8ca8"): true, - common.HexToHash("0x44d304e10d76dd49104bd695cf44bc35bdacf15cc08c3efc3001f9929257b460"): true, - common.HexToHash("0x07fa83f2845be2a91f24551d8439b484bfed9733cb0a98a5c741abacc69a0c88"): true, - common.HexToHash("0x2216a7b0f645f9968097f1c7d77d8904b6f38710d2dc32caf406898188bd497b"): true, - common.HexToHash("0x5b7c4d73cc663ad4373f146419bab0ce8f783bbb2cdeb8d68ec1be4da8f357bb"): true, - common.HexToHash("0x875d8d5c5dda3e805d5171ec5f7ccc5b4fe96b9dae945cdc1b02eccd81308b68"): true, - common.HexToHash("0xc7ffda58318d9628ee0f2d4add8894d788088de2f5d463e56c709ed41abf1cc2"): true, - common.HexToHash("0xeadc9a7eea6cc1f84dbe19cf11ee4d34f59e9e4aa5211efc8a813d76ffbc86d4"): true, - common.HexToHash("0x5c7f91c34182f67d03479babf017ab1ab72dada3234c77e5fade8b4796ad0517"): true, - common.HexToHash("0xe75e889bdee4b2e35ea1d65a96d2dfc03758a09a13f6b93c5b6bcb4f5e467e42"): true, - common.HexToHash("0x25b89ecd8f1eb28ec0da1112a66b560c32fe86911c8d146642ab009c8ce0d5b7"): true, - common.HexToHash("0x19a9dbc66afc75d571c9be894fbf557387fa59365166e9f26a4001e05182315b"): true, - common.HexToHash("0xd4ea40169ded166e6a6fecaa36515461aed0d1b90f5d1070baa67946d6ad9daf"): true, - common.HexToHash("0x49d83ce5192daa70421b25373e17235ca80ca3626055d062c2cd2c8f5d530877"): true, - common.HexToHash("0x82c1c2569749008f20bb313f3e869a74333f03526fb81792bd1b36e4416e45aa"): true, - common.HexToHash("0x6dd1b851d2118337453273871ef64cabd2ccc376efad88502ea6f518cb3f91a2"): true, - common.HexToHash("0x79535c74b19caac00521fd5884c24dca0df1864e3f38b49acdfab5756bbdda8e"): true, - common.HexToHash("0xd657dc38f4d3e2d3308f114bf0b91004f6656a716bc3e1d21d7a1d72d680b4b2"): true, - common.HexToHash("0xb16d87a03abcc7c445515221881c40d5762b419ffc7e0681220557878628c167"): true, - common.HexToHash("0x624ae3d4da008f4d5d65c5a946fb2dc134ece88cf8f0bbf957bf293e402c5125"): true, - common.HexToHash("0xf1db67e1b6f5c596b21a559946c8f7e13d6a24b5ed63594756fc4e18bfdaf323"): true, - common.HexToHash("0x4b5604e06b6f66649cd9c9e9f3a43b2608107f5aab48488b5bfe37bc5b611886"): true, - common.HexToHash("0xa3b96863da08d000398d8abab11cbc35f923d10ac47d258024b1ab02883711b6"): true, - common.HexToHash("0x48511da849590834f457e83d1b02485546544a430164cba8b1c61be8e9ac4cdd"): true, - common.HexToHash("0x45a429cc0bb6fefedd4667222450291408a8650579e95977f2f90acd48df8727"): true, - common.HexToHash("0xcd1a725146e594c61ff7aef36c857f68e51c13589a4ddde894adbef52c20b37f"): true, - common.HexToHash("0x0d97d8cb66f9fb5362ffebdfd44219a63853ad026022634369bc3e78761382cd"): true, - common.HexToHash("0x33e5a2ca7f2666e60f66fd51decd919bbe614f53ca51487f125d060bddd0120f"): true, - common.HexToHash("0x53c020baeb6b3803fad756fa83e8e6d7d15fc68fd6f8b1c96f4be8c8bb141b90"): true, - common.HexToHash("0xdedcfa116c82c55429ea428f2e4e4da6d15627b6eaf90a96a750c83bee15b073"): true, - common.HexToHash("0x89ae98ec4c520388e12611adf7a62f538b8bd2d9f0eddc5a7afe0d138ad10a75"): true, - common.HexToHash("0xc98b32d9559094c5472267a109d2124a29bbe73f498df3af4636f55fd9a965ab"): true, - common.HexToHash("0x9c5b66cacbfefd6d8b15368e2f535d7e1f126255b43d6aed619a9b271b203a70"): true, - common.HexToHash("0x1c3331f8d00c5f0234724558e672c02f8b6e37d692099fc6b3bfaf4a30c0e014"): true, - common.HexToHash("0x9ac49d45eba860b00454c5368307fe5e1888f9c78fd7d3c1f2d99e7e09ddb909"): true, - common.HexToHash("0x82aa0b8651f18331e745283707e43a72eeb93a602179219ffb39c12c93e88acc"): true, - common.HexToHash("0x29da36e6d5af3b439d34118f962ad8ba9ac11732dc1a9565d151d2621f397efe"): true, - common.HexToHash("0x729528a68fba7be4002c3cfcc6721b6cda732c9c6f0b66044a1ea4c3fed88c70"): true, - common.HexToHash("0xca8ecd4b7dcaea56ae4c84ae656e4ac292297f74f08fa41109a34df9397fa751"): true, - common.HexToHash("0x3790f64d4b57b998eb413a1b8a28eecd37a869e964a236b86866b4d35839ef38"): true, - common.HexToHash("0x59a1528ebb76765c225088004111e35bf9c741fe7c14ee27f8fb8b59db0ddaba"): true, - common.HexToHash("0x60403c3fde3c145a6f7c15ffafe12c9627ce00540cbaa27d2e3aea022af724b8"): true, - common.HexToHash("0x07e40e811d8710e65534b24332c22a0aeeda487e2484efd37cf5339734039dca"): true, - common.HexToHash("0xabd732e8f340596bb3155b577f8f9a961d30ad4a6deb368bcbc96672c1779f34"): true, - common.HexToHash("0x65e56a4c70c062000d46661dbb4e593f577deec43a9a0029a81f9ab87803d350"): true, - common.HexToHash("0x0d1d85521e469d49b37563bf47fd2ccac9a4aa02179fda136034701fd9ea887c"): true, - common.HexToHash("0xe92c7e4c40af23ffceffc04d4facdf4e6c610e16843e42a68719cbde96dbb0fb"): true, - common.HexToHash("0x4cdf85eefcebb4587ad1463774e183a2c83eebe9a98318da0339932cdf85dce4"): true, - common.HexToHash("0x0b51db903635bd88ce73e1532fa2d463a095c72a249a0d52529951b0b0a96697"): true, - common.HexToHash("0x06bfa550ee11e87782efe97831e15e7dbe6973442670b0650e196da1943d3f43"): true, - common.HexToHash("0xa65d0fae836b96d58f3a13f4895f754d71794b89b29bba219b69ecf083b44e5f"): true, - common.HexToHash("0xbd795d214ef6246698219e8e972ef1cf52002eebbb1ea38907b47bcf640b0518"): true, - common.HexToHash("0xa1961dbb210334bd99e3d6f01c4d76162883ceae9bd01b28d9c5e79dabfb835f"): true, - common.HexToHash("0x860e3bf7d993f0d1413f966297797b77fa74a01df25ef972d072b5faaacb3627"): true, - common.HexToHash("0x363f989b1ed763a74255718f192ad8fd47cc7bed2b7355730b96eab4b247b329"): true, - common.HexToHash("0xb3a4f1c3a3d97355633a380665cb9305e3a144a63b193001ef6ddcd7392b8c6e"): true, - common.HexToHash("0x9fdee3700c90d5e2763505ebbc557090f208ad92d3d513d7ece0d8ac526ead02"): true, - common.HexToHash("0x4b352601e630b211fa6db9beac955497bf3899ac39989c753f8ccbe02eff059a"): true, - common.HexToHash("0x4472e73916bc6f9de4991015f032be061f1718bf96e79d88d6ee8a1225bb3fae"): true, - common.HexToHash("0x53be955835b2e36d8a33c31985779d9fce5da711eb4dd541d0cc6a03c6c83e10"): true, - common.HexToHash("0x21dbe86ecad560dff204b4d4ac49e97a3f6b8e511f5d089d4ede7278a020e939"): true, - common.HexToHash("0xa46b38431988522aa10889bdf47b8104e67d731216d4c4edbb394aebc8cc0445"): true, - common.HexToHash("0x5e27e440efab57f6d5b0dd617186280395b1ac4b006d2f470b43af83ffc25abb"): true, - common.HexToHash("0x029af43197758c599cbedbed50b7144f574379253aaea3fbe1afc4f6aaf02c0e"): true, - common.HexToHash("0x74700ae5467765d5ce96daaa3680b9a74862fd1629fc154ace9626ba9532500a"): true, - common.HexToHash("0x46ab003a298a25d9a4e994e1b0d879d9e4f020abae408998b0eee9063315b20c"): true, - common.HexToHash("0xd67d7188ddc422000ae01644a5d3b1dfbfc884ddafff71751bc3fe225873ce2f"): true, - common.HexToHash("0xb407b136e33212a01fbeb448899948e349c9880b6626e158938243cc1f011df0"): true, - common.HexToHash("0x833c9f60276d9a1a4e28c10079dec24c6a61473d1ff27da3145b40ebef30025c"): true, - common.HexToHash("0x1f167ff3f5d4448fb63a69a04e273615438de57a561137839c0edc3e5613ed64"): true, - common.HexToHash("0x3ddf20e93bfaf7f22c209e5b4a05d4d0a470b5f5628db4ee76a8a6bc80c05dec"): true, - common.HexToHash("0x11afdc33e4b485ddb6af22af61be22ebf41493826679bf5114c92163a4332af3"): true, - common.HexToHash("0x87a58361e459e317484be38f4e8c88474ebacc7da7cc92b25a0932e4b3d8584e"): true, - common.HexToHash("0x7c9eba87867725a3988f18acd36fdd9702c07d8d41132a9b3fef55bd1605c114"): true, - common.HexToHash("0x091a9659cb1826c9bb9a8ea02599ec0934e111c74da8a0181b938ca03ea0b01b"): true, - common.HexToHash("0xbb773e602cb41fd09a47856589e930bb3ed74a11d54272b8e56b95b69e85d247"): true, - common.HexToHash("0x5d5314a8cc8ec9a691ab454184573bfdd62029b45059228111fbcbd1e30da16d"): true, - common.HexToHash("0xf75ec8fa8d6eec8997f0a4d032f9d2a57c69d65a453317d3b1177bec525df027"): true, - common.HexToHash("0x1ffee440727bb523011f17cae7fe9ca28d14976717101650568f20b4f1b2d074"): true, - common.HexToHash("0xc0a8d3ef7245d4bb4a241abe996f0ada3bd3f31501e94501b7bf9e9363becaf7"): true, - common.HexToHash("0x352353de72fc57c5740ab1b90603c92d3fc1a3f6eb932239a87a55121c1de518"): true, - common.HexToHash("0xaacd06cc8ec9d05aed899e62611decaf67d55017789410aa49698fff3cf2b0a2"): true, - common.HexToHash("0x1844af4b7d138b9b36d8c5e8136d219e8e244a67bba9928a4090b6affc1737e5"): true, - common.HexToHash("0x52a4b86193e325df6025c889135731d2673932030cb847e93b88f41eb0745341"): true, - common.HexToHash("0xcd25ef035674859db27f06b491a65b73b0c65357e0a46b0469515e86fb85c5b8"): true, - common.HexToHash("0x7b835ed274f0f9ec5637d7fdb946a099570ec81f27697846791aaa5fc94c1d39"): true, - common.HexToHash("0xf92a8407f9348573ec4ec0509030d1b15c985b5ccf6b5997bece92f252773e1e"): true, - common.HexToHash("0x425c00891a7b06fafea3c2c86f46c7064ca386215d0be6fdd89324bb62de7746"): true, - common.HexToHash("0x8dc9c32d0d6aa695ff33007e3047e48a840d015fe58b64513ab4aa2d254c3741"): true, - common.HexToHash("0x5aa92b43dcace612da5d1e9c3d3151bdeed3aa64d94bc4592d4819ddfb156c89"): true, - common.HexToHash("0x7e189010e8437eaccac5377e67fca173db423ff026bed9de2320ee74d4719151"): true, - common.HexToHash("0x2cf981be3f18d5e09c653de3f9599afbe8ed5f28cf0fd8acb55075d15e01e92d"): true, - common.HexToHash("0xbb8e8ceb703627f507471c784749b09f5d39d416e2abdcab4b07f8b142e21bea"): true, - common.HexToHash("0x92ee7c9818d6b1e8c02d93539b0593a989a2ddc1d145f86e2a72690a3f16b9e3"): true, - common.HexToHash("0x85d8d1e1d516d630504da4a448aff4eb6fe1f58d2c6695887754f95202df57a2"): true, - common.HexToHash("0x4c8709639eba670c0e3372102dd1c05f2e3a5f1d2533e265360728e21c351978"): true, - common.HexToHash("0xdaf185d386d717171ec019c60dab7e99aed4f1fdac1c77fa5dae502d6ec14dcd"): true, - common.HexToHash("0x68ce2ce2f20b401a1c782ace4d4edf1518b1765da5362a6a5727565534361ccc"): true, - common.HexToHash("0xc47ae2f87ada2af975a2e523dd275c18ab70a315e87a150deae9292f7bc741b2"): true, - common.HexToHash("0x2d5cd019bac839bbed3aee067a9bc5650c698376aacda67f91a3067088292ad6"): true, - common.HexToHash("0x814da135223e86d1da38fcdbad80b9a474629f7bdfa189a75c094ed8ab116e98"): true, - common.HexToHash("0xe0d0aa4814612dbd1211d34014d270f2e12e629c7c6ee4f4ee28e9c64586ea1f"): true, - common.HexToHash("0x49c18731ddadd15dac5e6015879828d0ed28edc1abceaba1eddd20661c2b4b20"): true, - common.HexToHash("0x1847c1322266a2b77c077f43d96bb2d055809b7f497b6812eb3b18701e97f0d7"): true, - common.HexToHash("0x7d6fe3a8322b9a0a1beac702a8492480d4230450a3c78a37c21650bdac78be2e"): true, - common.HexToHash("0x6103ff146de2723949f15d186b83e3fbab0e04e3965254a3b6d92807251b20fd"): true, - common.HexToHash("0xcb824e1656373791e72df5f6683f84fbf195b89fe3835e2d7c3d7df30a248fe4"): true, - common.HexToHash("0x61a77402a00414dccbd2422d8d91851183aa12d4d6d87a2a5be374acfb47f10f"): true, - common.HexToHash("0x230b17eec3ca6be69210cac8492615ab3d6a9ad8be8210e0877d6e68a461f66b"): true, - common.HexToHash("0x5687dd2c3089f9f9f8f797a54a82ae08f51617af44234a9676badf55d20272b4"): true, - common.HexToHash("0xa40b74c35d4d4067439d41a24a41ad738be7e5b8c2914273c1e879a7e4f3fd03"): true, - common.HexToHash("0x2ab2d76c24b1accc1d27ad1a2389a4805fb22fa13e7d27a4ff24c456bc620094"): true, - common.HexToHash("0x8c61f762e320a63906e33fd08c904134e36395954b3a604c044117fd6fca75e4"): true, - common.HexToHash("0x55b69a7d3bd49dd2b82203f5c0b12861768f689531565680ba0f33c9cf1a5d48"): true, - common.HexToHash("0xb925816cea4c0183753aeaf84c4c4ece096b61d6f05d670764a46e6fb7a4e772"): true, - common.HexToHash("0x04125e7800dfacb6beeba82a5601bf928fcdaa71dec3aba25077a1a8789af7f2"): true, - common.HexToHash("0x5cb86c5b9ad134bf87b26d6668e477c5cd9031b870afbb406c94d44875a63b41"): true, - common.HexToHash("0x947c62eaec96635c6412efb4d0ed4958329a5b5cf3d197b378253e4ebddbccd3"): true, - common.HexToHash("0xec6cc34813c651a27e82cb6ef20c698484d4d29cf8a2503db5fa620cec52b367"): true, - common.HexToHash("0x5826b1d4bcf7d2dc3875e36d5cfa7a818a353b383282c3f64b3e94614bd15303"): true, - common.HexToHash("0xf6dd665b2d7ab4a29f2e87929e3553e8a83e5fd33d7d2ff59fb3d530d2bcbf53"): true, - common.HexToHash("0xf5f55e2e043ae3885c61f35da23bedeaba11cd5de1d7fa13995c3c1b37e15a3d"): true, - common.HexToHash("0x60c5ef9969d50cd549a91d27a61f90d4d98beb6972abc0f87429dc7d74d46ba8"): true, - common.HexToHash("0x6a049758040e3f75f58470103f551e89a8a49c51917bd52487add8cbe1602dba"): true, - common.HexToHash("0x44575bbcbe2290bc1a3d8874f9895a4bcb8a0277ed9b0447fd553ba438f0b6e2"): true, - common.HexToHash("0xa78b0a382f9740cecb620924555bdc72643991d3a6214a66e694c2a91b80e75b"): true, - common.HexToHash("0x9e68afb61a2ce1f88767c12af638336d553fc37aa3dc122fa6db1f0d90f1f698"): true, - common.HexToHash("0x06a1a7675e4eb8129cdc2a5330d32dab50b04b61310817ed916e8a4d2a929a1e"): true, - common.HexToHash("0xd4cc35e491a7a15477fdddf05bd81a1485129bb0fba74085f6149cbaad97f840"): true, - common.HexToHash("0x1a49d2b25b231a90dc99be7b193b85ea26d04963bd00bdfcb9e5ceaa05873b85"): true, - common.HexToHash("0x6b2143973922204d9654dbc73d47a27cb77c029185e6d5b6a929fded8360e9a1"): true, - common.HexToHash("0x6e546149df48c5da31d640834c0c66f9ace688605ff04395ba99fcae0d944703"): true, - common.HexToHash("0x88fc59fb856187c6bb8fb67b8ece018845826ef313716eabe91890658d141436"): true, - common.HexToHash("0xcdd561c6657e279ab7e71c9851b8d7019b2aea9320c41d74bc8572db4bee934f"): true, - common.HexToHash("0x49cb4df1368b441496c578e9dc370a36aeac0dabfcb7a6fb00d2bf3655eafc03"): true, - common.HexToHash("0xe298780df0f7b099657d37e38aecc02bcd2509c98bc9682adee775dd5ebca4be"): true, - common.HexToHash("0x2c7e17357377c6a188ad688d9034c50db4593cef1e38d9ccd3e2c9348d04b6c0"): true, - common.HexToHash("0x113670b2cf17d8e7821aaf72452dd38a226f6778e876215d8c18165fe131ca6b"): true, - common.HexToHash("0xdac7201223c6ebb9399a265b1c65deea2258a63db5cdc80279c93b3d404e13c9"): true, - common.HexToHash("0x456c64215a7063a800029a019a954cd4c297ea0df99503393be238b6a1efab2b"): true, - common.HexToHash("0xe924eff0c3b3659773c4ab8b14bbf730a4031900220f22d387229311c3b231cf"): true, - common.HexToHash("0x6e8140c7253a45d38fc4e4400ddde0ea6e7a944501be5d340f7a5d431dc6e638"): true, - common.HexToHash("0xd99b03d736ab213eed1f2ce10aa4ac873fb15a1a27e9ed56b6eb0ab71f643c86"): true, - common.HexToHash("0xc6a9a8feaa2014440e4646b9f001732e67b15ad8d2ce79c57ec36e4d7fb87482"): true, - common.HexToHash("0x67a2737dbce0ab55e62bd61874901f9bcdb67d8d425e0cb540f31b6362e8074b"): true, - common.HexToHash("0x34c78febe14fdcf3f4cba00186cd0cccada3250b47ebe6a67da0641fd044e5be"): true, - common.HexToHash("0x6a064959b550df9f34bde76e7c2b74d773afe70b8bad1f5af2f19e2363e797c0"): true, - common.HexToHash("0x08402e0cf77812cb0bb40a3577d12feec5b7ceaed3455011be133633f03616f8"): true, - common.HexToHash("0x0ec057651e8978c710f9bd74ac890cac881aecae9ff3fb70cede241cd6a3db13"): true, - common.HexToHash("0x0e8ce95f5b7cc5325e14c2587d8c7c496c61979365d3feeacd483c3b7d96ed86"): true, - common.HexToHash("0xcab05566c776ebf02491ce8fb1d0f3e14ba8da123b7db5d18fb8d4e92fb45fe9"): true, - common.HexToHash("0x2d8262194b1fecdc7bdbf7cdb59da261864136503f750840520c05929d4bf260"): true, - common.HexToHash("0x68ccfffd87974ceb7d55f4146a272349e4afa3d139d44b92cd46ebe2d477010d"): true, - common.HexToHash("0x8e9e3d3f05870c84c91656f3a985f7a451cfc7a02d69d81cee317f9b2b57934d"): true, - common.HexToHash("0xfd3a6a2d43bf8c9d7bc948bbeb75be696bd3ab13b3e5e62a7935edd1643a18b2"): true, - common.HexToHash("0x0bfc3223f899686bb9b91050446c8a2a966cb074e464d92e92979e0288f0408f"): true, - common.HexToHash("0x7cb95f1e4c190602c5fd966e65c8e1ce6386fc4e85ac45095ec8ddee994ca21a"): true, - common.HexToHash("0x13670aea7703404488960e1842f59df74304ea26a6ed5c051aee966b334ff2fe"): true, - common.HexToHash("0xe28d3374d1f193c68cb3da9e9b78c508dd09126d6be50132b617cabb042ffb7b"): true, - common.HexToHash("0x327e5e75d6d612d27a4ce3a32fcf409d6d1ecd39dfabae723663d86affef7670"): true, - common.HexToHash("0x5fe9be410b4b128a8bd0f6e95dbda7c725cb846e1cb25e1d1caf100ad1a90450"): true, - common.HexToHash("0x47d466c46bfc8e7cbf70160a3cef7dcd2a577e308d2b16f3fa5d4c88aa16e40e"): true, - common.HexToHash("0x97e38332bc933716d02aacb9d924f7f9678b8f75c140814cddc22ec87570f226"): true, - common.HexToHash("0xbfd1a1e42a02d248608f3852b01a7cbdbb87a4c86db6100770c13df525ad1d05"): true, - common.HexToHash("0x2b13d3afb5a4e2a5fb400313ea77cf2e94495e0d543b3e3404f827f027be891b"): true, - common.HexToHash("0x84ec3a2420e07a7d7db771a88fc4e5013a6bfbe9fdab3a9d846bf413621da0ba"): true, - common.HexToHash("0xc5b0f2ab91a2f2dcd5fe60074fa5246a46c580eb7c05a20647619aac48355a06"): true, - common.HexToHash("0xd35148c4e6ea2ea0e057c75a92f71d5725f27623a1b163ce766a903c562360db"): true, - common.HexToHash("0xd5bd9f1ef80ac4f0e5cab4c5076860045b5a523ac33a8a6416036d04f83ee55b"): true, - common.HexToHash("0xa8a6f62eeb2b82771047339bb0b89a8cfdb160bfe645a7ec5ef2e818b35bc9d6"): true, - common.HexToHash("0xf9587feb9235d1f1c52092e6c8a67d038212ad235a7411fb0e76919ffd44a903"): true, - common.HexToHash("0x91b1fdb9191925719335648b575fbad1d303e6acd18b52b15a9dc539388afd09"): true, - common.HexToHash("0xd01d43d23983f609951159932dd926a62f183524a8f5e0947262caca4313912c"): true, - common.HexToHash("0x667c854ab53260633f761a7ccbc2f97d53dba0223db8a7667d0e11f3764dca96"): true, - common.HexToHash("0xd5541e8c7cae08791f8ff571c09eed75618a84c61c63883c8c0380fadddf2e06"): true, - common.HexToHash("0x3f9e742fec9262c5039a615991f4da42d913aec1c31763e6671a969c11fe2296"): true, - common.HexToHash("0x5506e963f41b41e2bae3b45922e98f2a139f776a1610d81f837d8230186f1853"): true, - common.HexToHash("0xb417f87e13a6b3252c6589b4f02be32fe5ce26fe1c33192402bd8e934e352639"): true, - common.HexToHash("0x659b4d596b16a85bcdc40812c191b2e652c7bf289c33d63638da88437b3cd8fd"): true, - common.HexToHash("0xe1ae464974b481593f50dba2e2a35afad47b8cd5c07da6fdea55dd5003556e7a"): true, - common.HexToHash("0x5b7302e8f92ba707f856af4520d68438fb9437460b5a15a9523272acf3f24acf"): true, - common.HexToHash("0x872b5fc3ea580baab3cec8957fd2e07295c5a34d79a77fe4ce2a262401b29947"): true, - common.HexToHash("0x99f5acb18a60a1e23f099e1fab00053e850146c34680dd57319f8581ef9a2db4"): true, - common.HexToHash("0xe9e75f9832c9d5530f2c5f8022a868b3a9b386ec2e917939c77ffb56ab1d14b4"): true, - common.HexToHash("0x36ac706f045963fc93a898c646cb6e67372533ab108f06861acee1e4e606074f"): true, - common.HexToHash("0x08877a9e930848241857958653517d71f1ae121a1fd2b59ff055d715bcceb1c9"): true, - common.HexToHash("0xa13635d1cf7a26c15198c884aedd125491ce7fa6794940b93cc85ce7c8d5e20b"): true, - common.HexToHash("0xf34410395575d0ec748c6e934d674e500721a93ec9e967bc72008a746a155f64"): true, - common.HexToHash("0x89717a8f111d50c9387a7f8ee552096fac737d650801cd8cfbf25ea13c3fc273"): true, - common.HexToHash("0x0c45bccde9a1d9c101055c597f98610f621522995b2ca986307aeb03866472c4"): true, - common.HexToHash("0x6181e521e11e5d369bd00af51d0fc9ee4ca21208555c4684d22ecfd78c27c32f"): true, - common.HexToHash("0x6914df76134c5df58f7809ee1c2afaaa4a436eafc0734991d56c87027bc33b38"): true, - common.HexToHash("0xaeafb7fe8dc1d3392d3459b508be1638b84ea5ba24957f2238337631c6709b73"): true, - common.HexToHash("0x15a11bffb51552682d3efbbd05793d40da1c3f8236d05f1fdd3ad1aa73bc4982"): true, - common.HexToHash("0xec2aa8546a598ed9607c666f7c1e3eaef1c6cff26e3fff38e0cea4014f283eac"): true, - common.HexToHash("0x30a48897f539c4a1fbf16a3240643683c1427755c7e7e5689590e8831c5c8246"): true, - common.HexToHash("0xd23a8e2bce83d3a070ba2be1e9ad2afc030f8447bbb9ee68a15b7c58e485a45d"): true, - common.HexToHash("0xa0b60ba459cbf2a49a6079514b46218ce550591daffab8924daf91865ffdc44f"): true, - common.HexToHash("0x70cd633806e01a6793c60cb163b1a4d1f8334319e9da5f89a289802ee1acefe6"): true, - common.HexToHash("0x592f267326e766d44f903a37d2711a96e0c86bd6f921405667be827e2f07daf1"): true, - common.HexToHash("0x65c22b1b7c7955c03e8a291f27d6d1bca8d9d7f61a3923cf52e6d5887670557e"): true, - common.HexToHash("0xbad2c93f6b0ea84c2e707ae1cd135e3c34ca29ffd39e4b31752f3b4883ed11ee"): true, - common.HexToHash("0x5611184e7317a4f7542d366333fe5a41a70653e8ab40997430d52416c881417e"): true, - common.HexToHash("0xa82353e065f1b1296338d7adac9c99305cf0defe7007b9fc15b4efa79d32efc8"): true, - common.HexToHash("0x15332169a9c9ed64c85ba7cbe59f0c4f67cd982eec3b987d806399eb5f084ce2"): true, - common.HexToHash("0x366d7cd9edc1b8d79aa69f22b52adffbb9e6f20f971bf7be788aeaeda88744b3"): true, - common.HexToHash("0xcd08770254d22a26d23860d7bac9505b4bd867018e87764148e12ddf1bc10bdc"): true, - common.HexToHash("0x67d60283f9410d74476b7e6e51c22e6706d14c69c0119fbcd17024ecec01d3f5"): true, - common.HexToHash("0x3ebd72275968d6f283f12ade1c83122ae546ed5ab419b86b05fbb27646f08c44"): true, - common.HexToHash("0x833b5d9b96e0191b37cf20445d7bf93b33de0f224ee2d9691afaec934a769980"): true, - common.HexToHash("0x86dd4ec15fdf4621c7b1b4b06fa3f7dd80a8aaf16babb9f20cdccff7c4d627c3"): true, - common.HexToHash("0x053ea2a73caf9a9b1f951fe164b10bc4d0f4cc37560a58467e6cf257b4beffc6"): true, - common.HexToHash("0xb3bd5a494fa445515fd28dc96d4c9a16ace99dc53243f4f282c74a1414242689"): true, - common.HexToHash("0xb4253af6ac9a630dbda8fd53594710c4028d1d4ab50961b151607130d2966dab"): true, - common.HexToHash("0x833d79b3ce1a5e22ab61b3000473c4b348cc86c4ad47701fd00aa93998c88206"): true, - common.HexToHash("0xf15c2197f6fab1157bde8491959f53bd90f5437afff4c9509d2567ffb5f95590"): true, - common.HexToHash("0x8f6efd73767dc84451c8dfa43aa54a7fea3ed30b342ff65d0eef1441fe6948e7"): true, - common.HexToHash("0x7ee89282535e13e62486f6f8449877a9411c847cd467134f3b0990c4bf462070"): true, - common.HexToHash("0x15aea7865fd290dec991e0e3aceb80cc023233dc376ebcc654c5cdbdea26bbeb"): true, - common.HexToHash("0x6c4981f2b1c317e44c6861bf7ad93312359911ee0a1a90f1055c7d719b52099c"): true, - common.HexToHash("0xc4675053ad7137cae7137605ab0ab66129ca1699fc2be6577f6d607cec343dd8"): true, - common.HexToHash("0x4dfa439943f66f9e4ad9c94bb180e606975497f813128a99780dfd4da0daf9ab"): true, - common.HexToHash("0x653332fa082b574419db1abffb25f3e516b8bfb8a4548648dfb9c053982cfa17"): true, - common.HexToHash("0xcd185482f496e949021476f9f09826393feca24ce90f3954d103078c2fdc4607"): true, - common.HexToHash("0xf126fe94d66b892a83ba8304c9111f3b0f267d7599db881db91892d185e5cce7"): true, - common.HexToHash("0xba96691d71f154cd1564b2eea3fa374cc239b6e7c587159dcc8290b774bd789f"): true, - common.HexToHash("0x2fe8f3b2c824747bc0b0ac6e7148202a877b911e210ac9caefbdd8844697f078"): true, - common.HexToHash("0xa48c8852e1eb4c57ce1bf0ccb0af04deef2fe3671e1bf8a877adc3bc3b646979"): true, - common.HexToHash("0x5ef3253244d58b496a071e94d2bec87d20dc9ae535d66636bf89fb9e6e4e3a5d"): true, - common.HexToHash("0xb20aed4b7f17222f69bbe241643ea97b399f5dceea52e144ca7bf7e2a3cb6a8a"): true, - common.HexToHash("0x3d2e314b334a3ac614838fbdc6a9dc0d3f6e14b4657c8f958b576879e3be08fe"): true, - common.HexToHash("0xef99d845a0b260c900eae51d2d23062b5d323468887b8bfeb2f810d24014860c"): true, - common.HexToHash("0xfb3e572cc96bed008b64dbe1c30756834efbabed6ec1f2e3c32cf2ba66bbf0fb"): true, - common.HexToHash("0xb0c9be3a3e2a5f1805506d7fd40619f48dd1ca82606f9514d21439c9cc6fc3e1"): true, - common.HexToHash("0x9995e2095d5e6801b6502d871f416e6dc301f2b814415d85f7e24c5d25fa09c8"): true, - common.HexToHash("0xab8b4059b65b5cfcaf4df57cf04bebee0f73965ea4e9a56a6bcaee4cec06e303"): true, - common.HexToHash("0x398320d8ecc57f11451c8f589d25dfc97e74b03b2fcdedd1c2ed953913bab3af"): true, - common.HexToHash("0x44344e656763eebff2c854168c102fb897c36e95dff727174539e834b407ee1e"): true, - common.HexToHash("0x483bdcbf02d29feb5925172a6b552828746e293a19d23493d15415daa5bb5f50"): true, - common.HexToHash("0x005f8d31141d63ba75e3ced268fc96bdc4ebe6261ad29c513c2e2a17adcd3099"): true, - common.HexToHash("0xc25c14679ae8fca4b191bc308a1364d7d5745c408fec657b773d04b8dc6bcf69"): true, - common.HexToHash("0x718f06415f030bc6b4d9c5482586448a22fc84fe52867823b24678822dff09ed"): true, - common.HexToHash("0xf02495ca72d54d8ced0e1e4c2573bb00d443e2ffa1149350e870542796f13bbe"): true, - common.HexToHash("0xec8f4f0b8540deeea913a1047a51c9585757a02d99bfb005d5b164048e0b1130"): true, - common.HexToHash("0xa0af7e22828c902892504dab7720f6fcf2cae3ecfa7c316dd63789e4950ad4b8"): true, - common.HexToHash("0x15acfe68f268205265c36feae60eb3023ab6a9f1806939cf1cca9096f5ec8b00"): true, - common.HexToHash("0x20b9c5096258fc86ae61f811a106899f6f75792cd13111ca54e31da98b3e05d8"): true, - common.HexToHash("0x1f58ab1a26052c72fdf69ca93c1fcead4e1f34869ef15e76ae3b94ba55eec643"): true, - common.HexToHash("0xbc983657435f118e164b5e59a3920fe980c1364918451066a39c7005f6189065"): true, - common.HexToHash("0x203e34a745852e630cda993556098f2aec1bcdbe3a9b18cfc7aec05d7c8adb47"): true, - common.HexToHash("0xa7af52329fb12f238c75907031f1be872b36c74b86edefbb4a140442f376a61d"): true, - common.HexToHash("0xea3a1f7c4dfaa92a9ff70546f46d198f8dc1dd44fbe962e8d6ac3f1648a0a8d1"): true, - common.HexToHash("0xb77cbc6bc1f637dc810a90965712c5ac29e305d64faa342a317ee73db627a7f2"): true, - common.HexToHash("0xad760d229686c58c97cb35c9f66027cedea954f2c80e2876aa61526c4dcbf87c"): true, - common.HexToHash("0x59e78963f11179572ff134797ab420a8538c68db8b01a147e8b0cede249ddcd7"): true, - common.HexToHash("0x31f9fe3d1419eb059c0e35690c866dc154de85547c701bf44d2d7c2c84573b23"): true, - common.HexToHash("0xd6b606dcd4e29a60416ae417dbd0fd3c9161f8adee815f707f7868f6734e9081"): true, - common.HexToHash("0x45064c301f7250330d237572fd3962b71b6ef3bf4e469b957a249df15a99a32a"): true, - common.HexToHash("0xfcff439e01c2cf2c93d5c0cb549234029a65d3c6bba27ae250a76bab60429920"): true, - common.HexToHash("0x933274456ed2be6602ca13947a99765eed2f091ff8cb238f787afd4b7e23f251"): true, - common.HexToHash("0x20a84c670dbeb11dab962c6fd48540ec149465fed6e762dc408f3eed3635b3cd"): true, - common.HexToHash("0xf00cefb5cad07d9b7f257ba89ab06c9d2001f32003b2556aec9a3ad4d95a57f6"): true, - common.HexToHash("0x2e97bbcdae73382a2c6112f5c8806f251fae25ae3ef168e350b7533cc2c35349"): true, - common.HexToHash("0x8d3b0378d2737ebb7f35001b8cad52fff7119f02d14c30657c7a6c0b0bea9e18"): true, - common.HexToHash("0xf5a799ea020e41f83e6fd247ca3f1c9eed569198eb4bdf4e55a41f8abd0828bf"): true, - common.HexToHash("0x62acb240816ff011576887ac817a4b426c14411df803660dd857fad092729493"): true, - common.HexToHash("0x305caa07f251babae55f070d8bd4e05cf2d4b562c22bcd8fd87392e198d013c5"): true, - common.HexToHash("0x00bafee82daa443033c8dacfc341f2ea22ebfc81373cab2506a5c72603db8c89"): true, - common.HexToHash("0x893964e67f862e82aa8ae4a6f9a2d1a384cbb1c6e0eeb8583d39feafd8feeda2"): true, - common.HexToHash("0xd57fe1d0288d33c6094703e466865262668cc4a77eb97002fca9d4af852bd826"): true, - common.HexToHash("0xb52431ace4be9d3e2a5a8d5647671888b61689e46ccda71fadde15558795618d"): true, - common.HexToHash("0x542e56ae6d0615e86aa3bf52ab8787b66a40e21826b391ab2e0c671d4d01da70"): true, - common.HexToHash("0x647de671eef2af259e0c7d43f5304f8b3baf6daf20e2a33db140f11bae9afbd8"): true, - common.HexToHash("0xbacf730a7d763ed63a5cd95617cc005b986b6cd1bec3f1a27247027545f74003"): true, - common.HexToHash("0x2a9a74590b968f1c55b0456eff4bc3fd4fc195eea9d461912dc48ed69424a390"): true, - common.HexToHash("0x609a9bf275d1a6783d74a7bd37888b157e81641740ccd77cdad826ac2724b8cc"): true, - common.HexToHash("0x4443ec56d1616bc4c8b74605cf2b677d3bb2ddf2a0b4e3d9c70136befa92db04"): true, - common.HexToHash("0x9224ccf0843ef458a6fe960486cf04cbce1492eb3f17c3b5ffdbb8d090353782"): true, - common.HexToHash("0xda9cd19a9e9473391abf8ca4f049a42b3d7f6813a4be863057b0480d42d99c01"): true, - common.HexToHash("0x47c6e7d67543f1dfb7eb3ac9fde6ab4af446756c841c702bb3673d96bc39a354"): true, - common.HexToHash("0xdc04f6f9efdf37860ae647b1d5096c29ab67a62e8010dd2c2603411ddc9e1821"): true, - common.HexToHash("0xae1cca9682e73ad416b5cd5bcb45fcd682ede7fb2b2c81236097b0d6f79d1802"): true, - common.HexToHash("0x8b4dfd20f85948e67c4cde5aae519dd4ce0689ee4e6be494b8c5482f77e63fa7"): true, - common.HexToHash("0x44b516e2bcffc6a0c899bd686143faaded252e80ee6b6ddeb8af804c12299e54"): true, - common.HexToHash("0x4c90eb9c887b404c6bc354386fe0feceb05edd7a249d23aac4d1953bcf0c31d8"): true, - common.HexToHash("0x4deaca93db9032737f16bdad4f3c4992f1a441d4ac78bfccdc028a875ffcae27"): true, - common.HexToHash("0x9eba1a07086362fd2776f3dd069ae8c695a806590fd175e3da01d9cb3932e59e"): true, - common.HexToHash("0x06a95f88584ad268135bd9996ccbe81dd986f42d3e97e02ad94953945db0e71c"): true, - common.HexToHash("0xe61a94b40072c9cf73fec6c93684de558e8a98a7c34deec1938f1fb6ef16170d"): true, - common.HexToHash("0x9277d1c291afdf5723c8a971eee10c008f15213e5a5153f33bb61ffc7db954f4"): true, - common.HexToHash("0x24fcee5fb59601dbb25fed1364edeeda3e43ea5fdccb6ab6c2b6d426b3da9952"): true, - common.HexToHash("0x2b608198905e3fae25444572d4f7854963bd9d5e80b825b5468947d81b484211"): true, - common.HexToHash("0x552cda670c0434531ba02efe0d54bd17ea68bd0635a5713d7c91c271567a3a42"): true, - common.HexToHash("0xcf8eb7673e40cec55b45be736532a347bce4f9869bda2706874fd8d1935b38f8"): true, - common.HexToHash("0xeabb141155fc720c526e835bc344333643291a9bbaaacca9fc6796015ddf10c5"): true, - common.HexToHash("0x02ab97ce9d6f019c9686b76a0042a6dd657eb78cf6c8a1a12293836c3d2e3178"): true, - common.HexToHash("0x106d5de1d546bcb47b7f9f59960abf466cdfec065a9c76655fc740c05c5ee2bb"): true, - common.HexToHash("0xfa597d0cdf99e20069a205b31c2eb950e8461f91973f970e32ff95d5486f9ec0"): true, - common.HexToHash("0x40d7af367be88d00edb4bb69b20599fc09f8ed4911210d0925bcb032eba772dd"): true, - common.HexToHash("0x2163315e44e5f4da87bcc287ca6180441acee57b1b31edd5350a398d429cb56b"): true, - common.HexToHash("0x44287f64d422a25139cb13eb8ffd993582dd056db84849ee9e4fd58ae0146902"): true, - common.HexToHash("0xb5595965ac81eb4a8092f41c6ca10b98cafae652f13cd0486cdaa2915ddbc662"): true, - common.HexToHash("0x1f57bcecb96ed2b413d4c7b7e8720d4d8be6add619998cba758b210b09445024"): true, - common.HexToHash("0xb24d3f388df75af286cd4d39ff8b75e44fbe1e201ccef66eabfcfef71efc0219"): true, - common.HexToHash("0x991fe55ca9e38e0f6ac01036dec8d793225edc844071874223941c3599105062"): true, - common.HexToHash("0xfd2034fed00911af6da7638de915b7268645466f3c380f7a354b3621ad5eba29"): true, - common.HexToHash("0xb9bbe714af522a6e86667db48421a1635c60b24a00ad96b9865f8bb0d40981f6"): true, - common.HexToHash("0x14223cf3471a2bb535543e048c94a80c6972fd37ff4ee71a2ec6755dd6c9c5a1"): true, - common.HexToHash("0xc7765f46f82a44f31815027b71ffe5a80fa65da31e527a0b46974c46d0992c7b"): true, - common.HexToHash("0x0fe984174f72d210fde048bbf86d3534a372b31ee3cd66cf8b73bb2780c7c6ff"): true, - common.HexToHash("0x020a73e331ecc0764d831c68a1db1180fe0d1153b67e7fae39b606685e33ce7e"): true, - common.HexToHash("0xa3329e6173016dca67125d66f022aeaf3df6a3ebd0c01da540271aad18fa1882"): true, - common.HexToHash("0xba888fa7826f0088a735ed6d37bdec774daa11dad84f7d0b8f2688d022fb5644"): true, - common.HexToHash("0xf059bd4aec4d6d53eeec75f03e2a0b16d7d931276a986d7635a8e74614b9063a"): true, - common.HexToHash("0x9fdd42803716b9e68de6ffc7c600aaebe9b21f2c211e6be816097d213d6eab98"): true, - common.HexToHash("0x52fecef881cdada9dac4223d413d78f529d641bdb19adc36f6921ad6327ee84b"): true, - common.HexToHash("0xe3175c8637c28b5d316475944d8308b0fba814e6821d18d09c80daf38b223e4a"): true, - common.HexToHash("0x0b93b4e6723396693eb92622e21ad690248519c4b2d4ab47225b7c540b0694f5"): true, - common.HexToHash("0x5b6b1a85da83bf93d2f859014d9221628993fc5494da4e426cfd45d78af0bc4b"): true, - common.HexToHash("0x84353042baf4a3ce32529a962d0e8074655f817a8fce421b50f4bc2223f65778"): true, - common.HexToHash("0xf20ecc7b3dd779a88e015ce510c16043cdc44f769bd67a93ba32b4aeea6102af"): true, - common.HexToHash("0x126730d4a785a904d49f10fd71c46d89eb36bd04bf1a439c489747a8e0537e05"): true, - common.HexToHash("0x0f0526191a812c64e5822fbe3b6896ffedaff46dab7f206928e32d42d5b991de"): true, - common.HexToHash("0x95050b7f8fb2e052347aaecbf03949b918444c35ea3c8251234516b2703d1538"): true, - common.HexToHash("0xdd267585804903cb4831b02c32b0614a2ac08716641f3c51ef6236687126047d"): true, - common.HexToHash("0x1d7bd97ab4aecc5ca9511d66e998d76a8a795ada880ca068a8c50b42176636b2"): true, - common.HexToHash("0x6517ebda072a08ff5df34d8ed393d81bce50e6e781265f0fe8226aac2cd91ce4"): true, - common.HexToHash("0x19788b85e9d35f43637a2ddb448288587e47e3ad4debc024e56e0024ec4c71cc"): true, - common.HexToHash("0xfbbddb3cb336371749f46c6a1138b8273424c04aada3c0b79fadf47f836c8113"): true, - common.HexToHash("0xde22333584cc922fbc36029e981263b54b4abadbc46bb0802f57cdd5ef5da20a"): true, - common.HexToHash("0x64275603289ff3e491fcb07450ea5f48b01e63de9f96c35063afa60a8b50666c"): true, - common.HexToHash("0xa791276c25186f63db188176b02fb0774567a2fd0fd4e75a83193eeada5e3238"): true, - common.HexToHash("0xb9d6e6d7f452a2cf3b86c3d969f5a0a8879e41b6ce9367b50be24836a70e08a6"): true, - common.HexToHash("0x31a120da41d2fc32907ad7cc975787bec1f7899e2aab713b8404113b986b507a"): true, - common.HexToHash("0x767b6015c8ef490983b2ff0f2b29f154423e856402c9697e6c83e3db4a3d2318"): true, - common.HexToHash("0x8507d4bb57569dc735f5f10205726ef7676422a3eb90eaf5db458e48f9a8b320"): true, - common.HexToHash("0xbccc17f618f3b6d5edfaf64faa64207b66fa8245e64e866080d66f95a5694273"): true, - common.HexToHash("0xbb472e461a5d58ffae5fb1405701247360eadfdf0e6844624a36db0b24309988"): true, - common.HexToHash("0x153207c1feba56c9bd492c3e14ff857962eeb1237ccbbb591910819399c8fdab"): true, - common.HexToHash("0x34a810033374dd866e2901f9c5dcfccfce96773fe0ad00bc2e7d13299aa30cf4"): true, - common.HexToHash("0xc652b62719fb3e75cff31fbfdbf3588e6eea2bbd0a755fa3f9657c68acf5aaf0"): true, - common.HexToHash("0xe0dd399c69781e0089b2da5c93328e5674b066600cece1b346818d6b2321efe3"): true, - common.HexToHash("0x67b56be70651c4ff62cdaa7660719e25eb629e8419ecedbda6eed0dcc614f6ca"): true, - common.HexToHash("0x9ba2e2d7221d0ca7b5115dda66aa7e99cec9d7bba0518702af8c2ac622cc5da0"): true, - common.HexToHash("0x05c14cd85ab2d546e3e3d29b86977fb03814c4f58dca43a12de1f7719b61bcfe"): true, - common.HexToHash("0x6f1f136ef01bc28fbb2f7ef59951590c5fe0e55bb9dcbb6ea8e70a1e53fe29a2"): true, - common.HexToHash("0x9dfdca7189b5602f0bd7d243bc386645e19ae2085f81b9a39aa5442c386c6009"): true, - common.HexToHash("0xea2a887bd9ee4437801ee6f51b8cea50fb077f3db8f7da71c234683a2e7c87dc"): true, - common.HexToHash("0x7e756f6aab3d55a49cdfffbe3e7c0f8554ffc1d4fdf8f41c2274afaa78fec5d2"): true, - common.HexToHash("0x69af633da8a01af402c8343728c50ac970a22afd67fc4070a81378d8d0fbdbed"): true, - common.HexToHash("0xb2052490ca896d1bf0467d5c739d3b2b9e5824c0804e2c081a4bf59a1fca0628"): true, - common.HexToHash("0x978df8a24af47939e5d601ea38bfd33eaf747b697754f27de0975988413fe11d"): true, - common.HexToHash("0x40fa6f2df11110f719f36cf2a8dddc25dbd58f390bfaba75d630a05484e5cc64"): true, - common.HexToHash("0x36cc84c1d4751bb2f2f528e0c751f4b8597e7fb738377594dcab05c78ea80327"): true, - common.HexToHash("0xcef8f28f0db60e7057b15150d11140f25cd37fe04da5de4037a7154ab59e4fc4"): true, - common.HexToHash("0x68593b1ebfde0cd84f8260e78b3b33fa88dfa8c1a31a0ce87ce1248f00052f62"): true, - common.HexToHash("0x0f8262404732aaa98a7bc4d3ce61de39723a740f55be51c599a35eddb6438f1e"): true, - common.HexToHash("0x31eff5c499c93f69825902bd669134c470219742a7158ba6739f8665cb3852b2"): true, - common.HexToHash("0x9dfda524338513e2a4dbcaf4ac7ca817310e50ad56ddf3867c4bdd1677ddf122"): true, - common.HexToHash("0x84f1801272c6813f15e4b8acb2eb251e8e9b39c7d7a89bc2e5d2870d261cf9f5"): true, - common.HexToHash("0xbfa790ddf8928388fa4a8847626b3c0f5305c65e00f4c8cdf1bbc58d6730cf96"): true, - common.HexToHash("0xc93dea000fc544df01280a29301cc2d9ffd0e3731b84ff76f847e5369fb827f8"): true, - common.HexToHash("0xfe57d1a2a48747608b0c240421658b93b745a6de8e4e5dedaeedff9c22ff637f"): true, - common.HexToHash("0x041497608c065bc398846409af30dd8ae6ba2f7eb3ad0514ad2e1f9378ea891a"): true, - common.HexToHash("0x417b553f4ecf1fef72f2ebc8ada29a9fb0a7ba4ee153cb5edf2b32d2e2e10144"): true, - common.HexToHash("0x1e8e6db20a677ab2f17bda1a3d44f49840e38ff3deb8dc9c270aa78702f37d3b"): true, - common.HexToHash("0xdd1786debcaa99cb635edeb49b4705f43426b8b36cd507685e661d4c647f2b27"): true, - common.HexToHash("0xfca3516029eb376bb91ba3b7c0f13f34eb6d200b75fae9b79c92d4f0df3a8aa1"): true, - common.HexToHash("0x209860d4a0ee5d1ec8b5e79d87a7f20fa9aea2214e25b5c357417d6c9d57b2e7"): true, - common.HexToHash("0x5323553968cbc636174772594c0000fa1d2e25829d500946bc2d3fdeb631a04a"): true, - common.HexToHash("0xbf68ce0efc789a3cc538afa14795c5023086bb1373dbfc4562728273a78856f6"): true, - common.HexToHash("0x7e5d720a82c67204650bc8a2702d88b30503eb2617c9fa552f3eed753d56c8ea"): true, - common.HexToHash("0x946eb84d85d167bc7fc8d48a3e8748b2e1df2cbf090b825e25817e87cd831cfb"): true, - common.HexToHash("0xf94a4f08ddfd4b86b84a9edbecd1c2c8ce7aa36605ac285c40b7620adc8212e3"): true, - common.HexToHash("0xb4932ce759c167d016ad0a65b88b75156b6a0f0d18c6e544843095af080ee222"): true, - common.HexToHash("0x40618e4540f37347b96fb7314bf446c2c9fff01384506ca1b1659ad0d8719dfc"): true, - common.HexToHash("0xc42e676a696f9138d7d42ebeb632dfe5c71413f0d83efd3d5ea11e45b5dc9242"): true, - common.HexToHash("0xcaa1a977850553c5cab444558f073787dbb6476a1165955e3c92e2929ac83001"): true, - common.HexToHash("0xa8f9e22007e415d009402836b5192a7bb928c55ae721db99b741714b7e929c49"): true, - common.HexToHash("0x50601024d81049af1036bd5544664a6ad57eb7925fbf78b71065b4b8e483360a"): true, - common.HexToHash("0x278beefe7123f25e030dc25aed1b2e982b235e03d8921babc16ad76f5260f4b5"): true, - common.HexToHash("0xb22cf5217f38ba611fab8779338792e8cc37db386b9e38fa709c2adb40533558"): true, - common.HexToHash("0x76a4c553a50d4c81fa8af40a68702b58a3861f24d05a761c38302c45f90f0446"): true, - common.HexToHash("0x5d63f2fd27a744406f66761cf526d19610fbb8480649b9f8a40f390de01a8efe"): true, - common.HexToHash("0x848c2a93d74ad3cd63d9780ec332d975927a004b9073422956cbebd8b1fb8403"): true, - common.HexToHash("0x90f3e6cc99f6d73eff93165642f2028cc8d6111b0319f36bf78f76c5662f9a30"): true, - common.HexToHash("0xa12c2304fd9fae5a49198c1677aa63961a83c84f2ce7fb57549a43804ba27e92"): true, - common.HexToHash("0x6fad07dabdc86870a32fae9d5e3f43de44631ffdd057f1b7c1732f146df16fe8"): true, - common.HexToHash("0x76789825be37a359860e5d9f08b494cb004f05ea6f01fc07b3364cd5dc4e487e"): true, - common.HexToHash("0x5c04c3a168ef070903c4629ca9d0a7527a500c76e7eca02073f11b03f90da6d8"): true, - common.HexToHash("0x52cee676470d5487ae9eeaf645a8bf2763dd5feb799608f5f478a773d3b821d1"): true, - common.HexToHash("0xd7d9370026a43c591d8f5fd7756d396339dbbca226cd5e70ac4de8df4d806103"): true, - common.HexToHash("0x00607028d4b98bda59d2b55968494f389d25a34da490d6149e0afca0ad68f098"): true, - common.HexToHash("0x2bd8442e590f3c2441a6692b748662fb190b666d119521fc5990b8f4f350b0e2"): true, - common.HexToHash("0x931439206666515bee057b9f9a57bea3da45167c0945abacb402e7cae3f19c2d"): true, - common.HexToHash("0xcdcaa44fd37956ff9746e5b784fd0c897c37dcd62b5006f78837cb41d8eeca4f"): true, - common.HexToHash("0xa9dbefc76fe2ae82e08370ff02b1b672d8e5f695d2d05a1f1552321493859891"): true, - common.HexToHash("0x74b62c970ded25c9ed8aa06bbc53dcf9dc8f9df304b8bdfa8cf5e2d88f3b798b"): true, - common.HexToHash("0x8216d5280feaf68c248280cf88f241d37ad606a74ade724f84f4998628faab8c"): true, - common.HexToHash("0xbb9b27a99aaed29231878766bfd4b58428c3de2d3a67d9088e210b1742881351"): true, - common.HexToHash("0x986355e6142b12addf3636e45123afb73ba869b08dda5343ef7223faded94d9b"): true, - common.HexToHash("0x946a23803b0fc0a47b3e303f08ce4b1fc6bcb422dd49442680d62bd14001f37d"): true, - common.HexToHash("0x159aedfe4328eb76572811451f16fa4c6586991222f1c3d51c8121c719251d86"): true, - common.HexToHash("0xc9fedf83928f69769a9c8c841e8bb8c2881b04d3b0d6443f80e1b8e75df38c97"): true, - common.HexToHash("0x2ccd3c8e6a89083a66c6e08593728e27f74a917c9876ce1fa5f3cdc92cdfdb6d"): true, - common.HexToHash("0xfce9edb97176d672dc11fa4c92e7a7ad865d5808d81287be8e63d977cd9a1ecd"): true, - common.HexToHash("0x1f5b526814ecccfc90c332453294e17670cc1f0770bb1f4150f44bb13931dc01"): true, - common.HexToHash("0x8c98a073fd69db6373aab143cf101b75502c1d335986c7e82034fcdac29884dd"): true, - common.HexToHash("0xf65bd612bfdf65ab92f70a0e195e7f497221e675482ee2d7e08295b17ed2ce79"): true, - common.HexToHash("0xf89377eb834d79207a14f6f86c7b62f5a408fbb8fba8f50454593a91a726d701"): true, - common.HexToHash("0x74a9a26d63c8bb71d4792d8ba78ac72686a6316a0429de36ceb414938332f21b"): true, - common.HexToHash("0xa8b00ab9cc2d19390fd7b078f4f941667e0215fa5351079179b29b0932bf22ec"): true, - common.HexToHash("0xb67164a526a77762a4f67e4995ac692e2a2165d7cf7ac62817997e6e9bd3c70c"): true, - common.HexToHash("0x76aea6945fa02183936fba8ede7866f4d7d3672e266aef38689550df84117527"): true, - common.HexToHash("0xa1d550fb3380d00d689a9867c8cbac81c3ee8035b015051742367989020f6ec1"): true, - common.HexToHash("0xc8a172abb3a1e43d62c98d5092e5eecf24f72126d30985593ca206f74f8dfce1"): true, - common.HexToHash("0xf2c2c2fbcd116105df3c17d5d74dd6dfa9937a932282a3d5f352e286bc609f6c"): true, - common.HexToHash("0xb695ccac12a76ca26669a67b2c7bf29eef94ca8e60130220b046e8d1569b056d"): true, - common.HexToHash("0xb158bba6da57acd1cff1dfbf3d2c109df513bd89aa9512e54e911bcafaef42bc"): true, - common.HexToHash("0xf4dd88260cdc8ca1384b988964b63b0875d79b7fd5003da30f2e8b0b5a246777"): true, - common.HexToHash("0xab9b02729cc34f1bb7af87a093c125828c68d6822062cbe4e6ac18199399fc0d"): true, - common.HexToHash("0x1f016d7f2eb35acb07ffe3cbf9c4ddb101a519e238712b040ebf2428971fde4e"): true, - common.HexToHash("0x133a94071ac096b96188bdd9dea2c9bb078a5938418a4722a7edaae990051791"): true, - common.HexToHash("0x34ec60c632e32a009ba619477b64566de7b72d9f477b35d646ec15985c4f8acd"): true, - common.HexToHash("0x37064964c7e40808f5d86de6c6480369058b9785c4db3f0cd55dbf17f0085e40"): true, - common.HexToHash("0x329cffa313ce54c3dcb00e95ac95ff812f5475a8ed213f6858c3162c89f54f97"): true, - common.HexToHash("0x62b43031825cb8ddd35ac4f1b370c8d2a9d5e24a0eb9446d7f86328405c251c2"): true, - common.HexToHash("0xa9bf880832b613f8a7240411c84745aee1b8703de7851cf6154d2bec5f7d186c"): true, - common.HexToHash("0x4fbf727b538e70c371261541e951ce9ab8ce703150078d97cfcf8bc3d75ac182"): true, - common.HexToHash("0xa0eede2a011d62c0ec6e11dbdd12167db759e5287a0876b6d264ac85eab5b485"): true, - common.HexToHash("0x0ad011ba74754d3b6d190661fc26a065ad8fc74fcd663aa98929ffab06bc2835"): true, - common.HexToHash("0x4bcc0fa913da8ee7e51499c5ef7c76969f6d52ea02660ba9762b8beb3199858b"): true, - common.HexToHash("0xf21a8ce19689eb48a2a491833a1ed246c9f1cd35495e28411a249fe739e21e14"): true, - common.HexToHash("0x1bc71a07f4e1f5d52fbb4b92bfdda2778bbf10c6833322501965142f121823b0"): true, - common.HexToHash("0x708b03cd5272cb361d6b3f6292adb91f78c0d5641a2ed3d38004d5958f761f00"): true, - common.HexToHash("0x0d82d04f1528af6510be76c74f62e594d898196a4cacfe008050fd8f238f65ec"): true, - common.HexToHash("0xae70d5b12983c8b1cd249604bcac78a0e402edc953268601df4151cef137459b"): true, - common.HexToHash("0xebd7bf1bbec513381311b133fd2dec0ad5aaba2b085b7748a8cb718beb541a1d"): true, - common.HexToHash("0xf8ee0765f726ac66678fdf584d8559e5d3e9fbe9a5b9bd8d9ab72d6bafdda969"): true, - common.HexToHash("0x70ad814e8bbd1ffc301c4eb87123fda10e93de5f61d0e3e9931bc9e4b4366ba0"): true, - common.HexToHash("0xe9ab57f84676db012f9321b0e0c6b4d1bdf6e4d7f6c2e0f096ee9ad2e5066063"): true, - common.HexToHash("0xf8754b39a02eea273d615fc392ba186bb9701be55d4acdeb0af4d8b4e2cad2ef"): true, - common.HexToHash("0x335abe5c3129e1cf46cc3277b6babbf3fbed2519a00fb42c130e3d9b1e55de76"): true, - common.HexToHash("0x7fe4909cd90e2f40614d322105ea3b4784b3ec88bf9b76bb57631eecf0346d84"): true, - common.HexToHash("0x5b4352a2b4bdb187b14a71b825f29eb1209b9571ce35fc40f762936239cbb02e"): true, - common.HexToHash("0x693f83acf6d0a1ebf9386cac94540264c477c8777d88fd54e26c865fc7d54755"): true, - common.HexToHash("0x91bdb9482d37f81f274cbc31d93ad6c16c795d796be0bf4ad259216d87133b3b"): true, - common.HexToHash("0x660d3f0028013889d55e7510e1616d96feea17631cddc69bfd22b1ac55411120"): true, - common.HexToHash("0xbc1d7b374c2a4da9faa95c24174ae8fced907938dc49d1beeebe033caa780ab7"): true, - common.HexToHash("0xa3b36a1436e69a8e2b8a8cd7078b6d1401c9b84d088796f1c1c0717bd88516ef"): true, - common.HexToHash("0x117452ad6b42354353c00047c1c78404a3b0daf99797d00f8deede51c568d9c6"): true, - common.HexToHash("0xd477e6c0731e957ceccd2527ce60c568c847cbecc57980bdb4bdd9d86e218672"): true, - common.HexToHash("0x4c3c7ca50890dd31eec04c34cfd18277f49c908a1a00284d99e7cc0d6d935478"): true, - common.HexToHash("0xbd83e467b813928927f22bbc9a35512127de4be6358bfe244c3c1db2c2582f50"): true, - common.HexToHash("0xfe531b19466b15156685695fdfc9eb2efacc73199779e6d3a892c9e4ba28df0f"): true, - common.HexToHash("0x971ddee8d10dd751a9d1a374793ea87cb1789a0d19d9b22925df23b347fb260a"): true, - common.HexToHash("0x85130f570c5791b0a2bd561de6c57c1a8fed09abc302651035b89011ac2d2cd3"): true, - common.HexToHash("0x1054c2ee7a42f53d2b335cd7f5589707aa6196aada15725f8a955b77dcdd4217"): true, - common.HexToHash("0x2504fb6f9dc774119145b2b2e3ee1000b7ab91d8f34d5bf2e4eab28760276ccd"): true, - common.HexToHash("0xd7242fe9b87683396fed370ce1660072a8a1899dd8782419c95cdfdcb064332f"): true, - common.HexToHash("0xa5479b716a9509ad81bc23b7fe6a8486abf3db53d9b879ae364696ac27afbd75"): true, - common.HexToHash("0x6266d0426c931c3e3a2fa6c75ad67b866b071ca76f1b5fbeb63e279b130251fb"): true, - common.HexToHash("0xbaf2e7d250e1a316a8bdd40e85b2f959bfeab21fddd12240528f6826704ba657"): true, - common.HexToHash("0x720cd543f8e368ec533cef879f0e3748e5a260c6ece9c7fcf48a22700937cf6c"): true, - common.HexToHash("0x522aa5365bf0af9d35ddcc2e77ac1528b8e022901c56db71d61b5297ecf81ac2"): true, - common.HexToHash("0x8e7e38017d6c8427754f4372e521972e836c748a345cf8e9c5620aaaa33a8bf0"): true, - common.HexToHash("0xd6d515da53781d123ad06ba94c34b7c97c948418a58b88800e00b15c0befafce"): true, - common.HexToHash("0x22baa42d78239b793b928eb70a40b23a1c958ee4d01cc2b5d6cd931c3c0840d3"): true, - common.HexToHash("0xf09ec35eeb39f2624b63ce0ff48da11a0c03c8f038df381addbadd2aae9c6ed6"): true, - common.HexToHash("0x19e819df073f7f19b826539cf9f9ff3d72e88707bfb3c0303567f5c99e6927a5"): true, - common.HexToHash("0x6e6ae3f7ed0fb8e793d58128076fa22940e7851c8017c3ed80f969fe89e1fd21"): true, - common.HexToHash("0xc113467d677e409af1accf9c120a7b90561915132ea17b9b4c8c59cd2122beeb"): true, - common.HexToHash("0x5730c36d99b986268947773524a8b4a9e83fdf36ef8fdfd69172faca335a6d79"): true, - common.HexToHash("0x44278e7b5efd48f99ec18adab5763907eac6da5cb020b1c870922255858e12a1"): true, - common.HexToHash("0x6b3d10302a6c27b3117399e97abe790288ecd9963c0162c61385032217f3f237"): true, - common.HexToHash("0x4ea302e5a9b9d465965a0c376caf9482e4b57d8148b1350b595e8bc7ae3c6c10"): true, - common.HexToHash("0x0f6c3c5ca2bb7da5b387508df2bce0cb65d94f504f73c17e33f9c12ee12ac1fd"): true, - common.HexToHash("0x5d74b618dc9219c03a4ec2efad0bcb26556b4b7791cb434101e6dc5fd8405a6f"): true, - common.HexToHash("0x6caf6c99fa66a87dd0824509e65a4982c2842170d52bea0f8f438be86aaa419c"): true, - common.HexToHash("0x549c8f1221cbee1db6935af397e4248ecc5e2a3627a8f2527089b0cfb7ce34e1"): true, - common.HexToHash("0x8427911e7762c68f4073c2be007b8ab3cc2c64a987b54bb88c7f4b3dc621d5d0"): true, - common.HexToHash("0xabfdd7b80fbdf11295fabaff12126aab78758034156f32095de95146630c65fc"): true, - common.HexToHash("0xc2e98e8cb81c2760d17089dedb844147ba491b542424c7a5e23a73d22966911e"): true, - common.HexToHash("0x9abc5c5da15d8e522d00ddbb595fa6ded4a750301f5f85b598fa0ae303cd5fbd"): true, - common.HexToHash("0x11541458bd653f06d9c64750b5329e8d66b7276943c6cb1816b3f1901d9e01cd"): true, - common.HexToHash("0x32de903f02ba098749baf2ccad6dba66f8de0a6777adaec2faa57d8b6c15067f"): true, - common.HexToHash("0xe4bb75e174fd1c67e45daed8bec742f89f71ffea48a213545bcd7344a411e097"): true, - common.HexToHash("0x23e08c442cc6f2f3a94b83ce1790f6973b7adeeaaef63ae72394c5798d3dc6b5"): true, - common.HexToHash("0xaf5ac5ed374f253a1550af5684e0ac4358c73c2801419b30665ec285800d8ce6"): true, - common.HexToHash("0xb4162442f056f97241a8a98d264736903d424d7f030453ceed770ba05912330f"): true, - common.HexToHash("0x87bd815a8a03cf52b3855c3dff2138ae2a2502bea115963cd7cfbfeb93be70a6"): true, - common.HexToHash("0x36ff18a69695c7e43377d3d2bd9c4191424d5cd4fffd4dd84261f0d331de55b0"): true, - common.HexToHash("0x74852b523fba58ee1a939c8af5f519c9c2bfa05045db71928eccf9a9b3678efb"): true, - common.HexToHash("0xbcbbbe691346e5a6bfbfbc0755aba877ef01cb1902d1cdb45c39c75668597233"): true, - common.HexToHash("0x54e52f12c6b52433bc786101728c57b56dc53ce31a89b76d8d3386145724b9f7"): true, - common.HexToHash("0xd5fa8aaf75bc44164859ce7ac37d3331091b9da91a53d8bcd8097ec321f66fed"): true, - common.HexToHash("0x98a91363ce7c1d8627f2a8c95b3f6a542c21a82738640a0114a2d095a6143fd0"): true, - common.HexToHash("0xec299cdd1d81f290316ebd3da217d21f8b498457938d9561df56014b5e966f73"): true, - common.HexToHash("0x2608e5f3e87e98c3a357621a4760cc02949532d3751e33722e6ac52bea2310e9"): true, - common.HexToHash("0x9028e859cf6687b99ad0c4ecda5be0a566cdff8b62d20bb25af1c4206e6901e6"): true, - common.HexToHash("0x8cce4b3011c848745e0eac3eea42b107d8d51ed191280d8e46ddde957c81a029"): true, - common.HexToHash("0xd40e65ef365ab7ad65c3c88f014196dcf2cc22b337ffba45b5450a011e463573"): true, - common.HexToHash("0x3d9171c367d80003e5b32058b8af38db5a7699b4a2a3159265973815ccffe912"): true, - common.HexToHash("0x99c49c74d96c151954b85494862c4f64626175f37a25686180c33861306110b3"): true, - common.HexToHash("0xd8c2b3fd4743c15ac5e6d3f578844d7e8e6ac615e35fca5a5963b02c8198d323"): true, - common.HexToHash("0x81c5beafa56cfa1cf9fef99a8ede814584853aa26767b31271bf304df5146d08"): true, - common.HexToHash("0x87f05a695d06c3991cdc524dac95888bf4cf218f890ca8e70dad9df7a3f811bb"): true, - common.HexToHash("0x388030e54eaea6e6d890b7a7bf289afd60ecdf834f359499ccacd24f8edd73af"): true, - common.HexToHash("0x6c03ca7d27dd6a85c0772560aad3c35db6b5374e8388931db7e6c2e8f1a739cf"): true, - common.HexToHash("0xbf14f8ad649fc22819902427f4b4c768b81756fd333c64f739f62ff1bced7deb"): true, - common.HexToHash("0xda534b43fb1d26923072f7dec225464c4fb7bc48214f42b015e66d66da86e5a4"): true, - common.HexToHash("0x718043c25a5d853f75298674bf088de495d74fef0f91734792040f6ad6463cfc"): true, - common.HexToHash("0xc25cee72ef14a238e4c3adc3451f603fb3a9368793628afee86b5ab218cbd766"): true, - common.HexToHash("0xb0cd3bc6a271d960de33ee04890280d867ae44ab09791acac26acc3441d77bee"): true, - common.HexToHash("0x6ff37521756dc2b13505af38cc1cf9063c047db10ad7abc841bc9a4833e17bbe"): true, - common.HexToHash("0xeb838cec6f8d5e1a2e2626d9650e320f1308a284c09c6652e2bcc9325a5dca15"): true, - common.HexToHash("0x698e8abb560fcc08f1c00ed1b6f7ff64396464ae40de401daeb42f7692b153b1"): true, - common.HexToHash("0xe2bb67045048a59011c4a2928107d4d034b875f973c6157e2ffa0881b2a3ee6c"): true, - common.HexToHash("0x2dd43fac8490b212a8760001548b7b54ad47861b8d30b4f0c23e260ab0f5bc1c"): true, - common.HexToHash("0xdb52d6dc839526b900339fa1209d2a11a56051e8d41549cc7008b98193ca5245"): true, - common.HexToHash("0x3cd6564dc89bc0d25e1625a637bcdab54c452f837167ce0c6bbf8901f6b9fdac"): true, - common.HexToHash("0xc925a6e3884fb917d99b5a5242abea242bf3bee2ca4e9965d8e11a1edcddcf28"): true, - common.HexToHash("0xc824c487f87a54d2a2923f41ecaf5217e971cb28a2c96c29eae43d387f5e9789"): true, - common.HexToHash("0xd6d282910be0b1ee30f33d62f3736cc7f6f55345437e007a29538a0016de1a2b"): true, - common.HexToHash("0xfdfc3f8c0c9008ec4e309c57e9090a4a0df0546c866fc83ca34d6f09965db3e2"): true, - common.HexToHash("0x4a7e17f09e048105f7c99e6da2b89d45cdeb89ef0ea7df793faa641d535c75c0"): true, - common.HexToHash("0x73dfc15b57a6d5f0bc999b612308c5700bd7ebc9c4fbf58a07145bba67e4a63d"): true, - common.HexToHash("0xdb344e109ed6ce3706b94f59c0ba9c4faa5a872494aa833338e205e6381cea7e"): true, - common.HexToHash("0xc0130183343c147d160b1d3a979394d5e7c07a8f2e16b20b4eb69ab9d0d707c1"): true, - common.HexToHash("0xea55195d8f86d790c036379c930dd872fa7bbe503b409e6f4bbd36f6e1d1a435"): true, - common.HexToHash("0x5a533615fc29dc4f5e25fa7deb4da0aa43f3560b4da423ea7d6ccbb958dcdf89"): true, - common.HexToHash("0xed4a53524ac6bc63e133ddcbf866ffb4ee4921cb7666093f830316a3e020c10e"): true, - common.HexToHash("0x852d150913cce3ed1b6045e9f798efd3ac244589ae12ff4dde28eeb7af516f1b"): true, - common.HexToHash("0x44792662c84ea0afcec400512adbe55424b9c8cfa30e3df2613e06a7a7558320"): true, - common.HexToHash("0x3fc84b62aa9a95c15ecec25447be4afb36eeca8949fb7dfa07302340b7d5d4b5"): true, - common.HexToHash("0x858f6af733d883b260ab0903223593e0a56c9239f41f77ab163f9df8935e19ed"): true, - common.HexToHash("0xffc939cd57fbd3c36b1ea0dc79e1cff9a2dcfd188be1632957b9e18f9e4d3ca2"): true, - common.HexToHash("0x53387a15344e273449d77d4173f70467e7906d9e1d30854403c605fc7db1fecd"): true, - common.HexToHash("0xc9a6cb5434fa4797682779b3fd186c139a4c3a5a6055a100c5b0d9987eaf76fe"): true, - common.HexToHash("0xd58e5b4fea3d03b6379a5dd0d990b9a77818c182e138946243790b9121519986"): true, - common.HexToHash("0x2ea2399dbda19916e87cbd55c652bdb560dd67b5c3ae60bf91a86d4cb59c3253"): true, - common.HexToHash("0x1c516ba96fcb8d766ccaa70cb17ee020e6acece246d8d0df5418bda2a0cb26ca"): true, - common.HexToHash("0x6c59fdceb385dd2c0b5d1373c81907842c53ea888a3487c35d1bc68e518c97b8"): true, - common.HexToHash("0x18a293c6c90a60371aeabfce82bdc2da852bce0fb3051d74557b67427db726d3"): true, - common.HexToHash("0xdb0265f2fe2e33593e5ed867f722b62c40d9ce040a12c7bd1c130841159a5e2a"): true, - common.HexToHash("0x106084d12c77ac42d6bb98d400cd0e9744007883379d3e6905bfb2e60f5abcf5"): true, - common.HexToHash("0x42c32c17a7c0a7f100e0223a7e6d77a93a77c3183a16f001abc0528a2219f9c0"): true, - common.HexToHash("0xf5d440526c60c5fa8b1f88dd4e4f2e47e345cb2aa80b463c35ff7ade56673c04"): true, - common.HexToHash("0x35ab05e6b89be7619bb9002171670b899c3dee28f9f9bafccf98fcc0e416aa3a"): true, - common.HexToHash("0x2e24f6138d530aff6aa62b778d018cc39987662cf7a722dafab3a6f74b249793"): true, - common.HexToHash("0x7e822c287ee750a94d7512c0affeab11d3b3c66b6fbbd543ff41fe4c07c956cd"): true, - common.HexToHash("0x83858a50a8cc36af5af5edf574082d40645aa55adeff9e4a1a411cea49ae8107"): true, - common.HexToHash("0xe4607470b9fb21893b214545e000626aab5f4debbc5605d5f3e80dedd73aeacc"): true, - common.HexToHash("0x939ee52e64e7be9b8a33c120e6fe40df66f99c43f83027b2d87027ede04ed3b7"): true, - common.HexToHash("0x040df84d91fc938a4b16e3992d0c9a1060c26933c1cf69a5b8e363b883ff1856"): true, - common.HexToHash("0x17ea0d762134074931e04de045b85812104e57b64f08e0ffe968099cd4e3e493"): true, - common.HexToHash("0x6dd3fe680cdc94ac2a14811f8554bcf78e41d3ad443a893f2bb886d41861d775"): true, - common.HexToHash("0xd8e6f8a019aa5c35cb665bc9a731e88e4f24442600de0fe7474f29b2d5f9a8f9"): true, - common.HexToHash("0x32b582853820e837568d20fbdfad7c250f9210313aa10666d4f5a66624264866"): true, - common.HexToHash("0xc59138fbb0cebdf231f833228be153ff027eac5a97e161b1c2045c4d8a7d9fcb"): true, - common.HexToHash("0xec37d891b6603f74fde316a030f374f27bb1e8e893dc47fa1811f83cc37bc0e4"): true, - common.HexToHash("0xb8b240f4d57f6f08363f147b47213a8b8ebe1167b11122eefd917ddd396eed99"): true, - common.HexToHash("0xfacd80802863f229bef30df09359f21f99183138a74aaeb10393713b0cc1317b"): true, - common.HexToHash("0x66b330f51b8b04dffba1d341b5bd1c70d976ae5ad07a0b2bf828aa923711ebaa"): true, - common.HexToHash("0xefeb0fa40ecdab1a1e086401317da10d6c906a2853a51dff9dc124c37148088c"): true, - common.HexToHash("0x04a7e127334e0b1b6a8bc519495eeff0d56fec0e9b1a4a6eadd142445a622e04"): true, - common.HexToHash("0x1ac2364bcc74b06c7e6eecdd43801133e61fa577d7c7f994a801a44cb736745d"): true, - common.HexToHash("0x8897462824c22418f950593308617e755cc95deae61767e429a1c6b02a28bcbf"): true, - common.HexToHash("0xc52e1ffcbe1cc9a83534936d7aeaadef7af7fb596bd62419ad9357794976c4d4"): true, - common.HexToHash("0xcaf175c14e29d917bde1afa1deba0b4fb5af0e495f40a5545e950017f48af7a5"): true, - common.HexToHash("0xc7e02b3ed50de95ce4d85aa913ef6e4455241a619fd92bfc42497b72da7ec706"): true, - common.HexToHash("0x2cf4a1c6c554f3d03c5b32389ec2e4e3b3e5e1202768be522cf3b4c4c50f15aa"): true, - common.HexToHash("0x3a0252cde4fdd0969dae2bead43f7f39abb57bf1557d647043e8cc4fa6908827"): true, - common.HexToHash("0x90fb8bebfdfaa590a196b20e4516b289de959628cabd143c16bbe33cc3a1b627"): true, - common.HexToHash("0x515f433d2e2ab580da2435d7d514b113a3f71a89b6dd5606ef31d9652c0bca07"): true, - common.HexToHash("0x383f089be63c10326e95d9db58bd80de501c28ce2d68b8fc4730e423c306fc24"): true, - common.HexToHash("0x05d302a7206fd6652612ec97be8fa8956db20145aa5dc53004feb693932ef29b"): true, - common.HexToHash("0x942122dd48a06671c60819b7727f27b2fa76b86600811c22787de5a9446e7104"): true, - common.HexToHash("0x3d1941a3a568118fe01b61f4b74db733cdab1574845d7dec128d6c063da82452"): true, - common.HexToHash("0xd7e83c79b2fb395b743dfe394c0ac874f38389d727afdd008b3920e7a93ceb50"): true, - common.HexToHash("0xdc1de97a91409069763e45cce23c3f0683177c08b6f5580ed7aa92f6f051b665"): true, - common.HexToHash("0xbe2ee8fc133b27b6c672c72f67842e227f3aa4b54e3104bce3bf5075a34b04cb"): true, - common.HexToHash("0x50e634725470d84c146ee6c5ae4db369fde8a1f7e3accfbe9f99d970f92b4753"): true, - common.HexToHash("0x11fb5af7f8fc59a54dbf72eb079e16d4b5de8857bcebfe50647769bdca4c48a9"): true, - common.HexToHash("0x0db5a5bf1e322cba43240f160ede0096798377c74cedc2977f7d40b859382953"): true, - common.HexToHash("0xc29b05b4f63ae3c8702475208d0e28a5bca2e8bd9f5cb786d9f9cfea6bdd5199"): true, - common.HexToHash("0x7850aafa9072979bbd56a6e95100babb78da2488debeca69f061889ee1e887e3"): true, - common.HexToHash("0x03708967d8c7829e2a849c584832476266e6fc1ef9312447b9627aafa9eed709"): true, - common.HexToHash("0x0f8a4b288e3a2c3bba5fb3cc0bce95d7ed45c55e47266aaf1f699e1e5ddb74ce"): true, - common.HexToHash("0xe73adfbb23c344bb9e8d1612539a1509a3ef8f006ba840999218206bb3db7558"): true, - common.HexToHash("0xf77b3ead43cf6232f7f7f118bcd2b24d8e2721ee4600f258e6aa3c9b674a8a13"): true, - common.HexToHash("0xe37634c710455af08604f774c58e1eab91aa38ccafd16fd6eabb1b6440928f32"): true, - common.HexToHash("0xef17bbc018715dfda8218dcae0cd77f096679675ea0b44ebc091413af431d43a"): true, - common.HexToHash("0x6268e7c6e630e295825e6e7e4fe044e4f744f8ed0f4dcb8e10df691183228e12"): true, - common.HexToHash("0x5b1f1833a0ea3f2619ddf6dfca735c027886bdee8cad507314e5ca3eb39b620d"): true, - common.HexToHash("0xa60515e3cad34c914dda67dd504742c61264b2a2e03bffd1010dfaa89c96c863"): true, - common.HexToHash("0x6c088214caea42dd79705c21db0433894a161f250022b984ae6b5d47c01d11e5"): true, - common.HexToHash("0x20439e5bf8c2644aee0f1aab35533c69fd588bd61441549a2784644b658071e8"): true, - common.HexToHash("0xddb41e0446b2f9969b08eaaed595ca73bb1ff3b761a7ef77a0dc3bc0f3f2cbc7"): true, - common.HexToHash("0xa5966cf3eabdf51dfcb27fb5752a37381f4d3d16393ff245e99b0a32a542ce04"): true, - common.HexToHash("0x4d02695882e806750f93784ae3e4e720023ae22e97e9613980876a4f73c3fcf0"): true, - common.HexToHash("0xc5d52fa4860ffcd22d26873a869c48841a579589af0cab5e85472840dbc54bdc"): true, - common.HexToHash("0x36b03f646f1c00f2cc0f66d9a01a70f9bc326fb6bd527805fb0d8a174db88605"): true, - common.HexToHash("0x8ef96146dfac00e8b77a4193196f3b07aad5f8acfc62a8b3219f56d72cd919b0"): true, - common.HexToHash("0x832f54d6c3ae9b21fc017ebc00dc390b648c9e7524354a8c6103d51e9676dbdf"): true, - common.HexToHash("0x51166f73f5bf23d89025da418b6d78f7b2e7787ccc67a38c6b2022909b419567"): true, - common.HexToHash("0x7476fef2311a62058ff16c98c6069afe95d60ce42b39a25882e8ec04d220518c"): true, - common.HexToHash("0x36ca69de325d3729c40397123527e2bede8b36deb46b3c0a3040d0c045cc5be3"): true, - common.HexToHash("0x543d82b092a3d5dcba94316e2f59003e641bb4b44f37068f93890cdb22cde7ec"): true, - common.HexToHash("0x900bbb850c96372d2170bc496bb6f1fc108e4a8d8766f9823ba99ddd775586d1"): true, - common.HexToHash("0x3e5bfeb6b1122b8741c5bbff8e7d1962a8fe58bbe1eb42ecf9c870e367d7dad9"): true, - common.HexToHash("0x8dfb28ef82e135c5f860689ea4abad0a5c2854a45e4baf4766976516ef51aada"): true, - common.HexToHash("0xc6db2435c9c34074ede1aa87a9abb5f0cf49b86f573baf29a0d5837111b29947"): true, - common.HexToHash("0xb193a2cd878aaa79ee63ad5420b8a143c61e1bf3d43237fd7b571dee1b54d1ef"): true, - common.HexToHash("0xddf68f8137718bd3da1a6de4b0c56f5eaf7d3f9bb005dc4622730bb999d554ed"): true, - common.HexToHash("0x5715cd14ddda607e6f432ce36e7dd5df87b5b8b1fba419a9052eecc12b5a3f8f"): true, - common.HexToHash("0x50ba47387e3e2f6f2e61970abd336ed7efe1cc34412d7528974dc27a605c1188"): true, - common.HexToHash("0xa50d53308858682553ef6478897fa093a303c2a3ef8e1ec1952ebf29abd80f7e"): true, - common.HexToHash("0xff1b3ba928a367a36c88775ef45e665faf20249578decfae633a5e805d115df5"): true, - common.HexToHash("0xddf6a2d6c257b33c9c8bc00e63ea691ce997cad2e33e424fbd3f8c477bfb914e"): true, - common.HexToHash("0x4ef308a4d64161cafadd61fd6719355e35c0eae8b6e4835f230cb9f6dd83a456"): true, - common.HexToHash("0x8920e2322952df8a854ac283c7d41a2c15caf47f4421800f3f5d3e624edbc78d"): true, - common.HexToHash("0x2cec36d6267740f70b69e69eafd850b104b63fbad4fbf43b649f98a069a05182"): true, - common.HexToHash("0xdcbf9c573e30da8ba1d7ebf0972b559d6cff8fd024e875ade1dbd30905642e77"): true, - common.HexToHash("0x9bb35f5d3277059fc2981534fcf848ba56006351add753496a0169c49b6cc1af"): true, - common.HexToHash("0xd7ff74182c52c5032eef115730d1156adbf4cc5acfd1f405b6d35c22085b4741"): true, - common.HexToHash("0x955c0ea62892d3d038ec3815a33ad5f8597bb95cef02ef7d32a85bc906f3d3b3"): true, - common.HexToHash("0x9ad245b19ef959659bfa0d22f60cf2d729fb4fef729bdbacbe0e2f9eb47542bc"): true, - common.HexToHash("0xb7193e0276aff1bded644ef40e34750096352aea05defb5b5c6da325e6611689"): true, - common.HexToHash("0x8f5903247be931b9ee2d2d698f009ef23c73d7ea1cd25c46538f6bc08086c257"): true, - common.HexToHash("0xc7db5b29c7d0f3cbec770ac880d40e5a96a7879ea8931282b5125916652eb087"): true, - common.HexToHash("0xc77b73b5fb14885b91160de719a9a2369c3d5ae69a1185c0d01df7a2b9e523fd"): true, - common.HexToHash("0x5c8a311334d559f85578e2adb743e4223dd76aff379fdd81b4b2eacb55c39e8b"): true, - common.HexToHash("0x14467bb89bfcb81a1cbdd0930307f6b50641d9d8fa8ca5f3efe6e2a0638c20cd"): true, - common.HexToHash("0xc8dd487accc5e52be15ec09534c938a6d577b8b5d0bce79ba06cfad756d35de0"): true, - common.HexToHash("0xf8f8b74298720994a72b4e0268e23238937942be1cbb1444053ad098a590ae5b"): true, - common.HexToHash("0xb4469959268fd1532aaefc043a394a91fee79726fa798237e9ca2b481dc2ec5e"): true, - common.HexToHash("0x6d3562430f9dbcce20de39b41b4905578d6f9496b2fcd26ca72a0dfe2354a053"): true, - common.HexToHash("0x86338be9bcbba5b5f08f46e75faadaa89c3055254882e4e5059a4fb16391a0dc"): true, - common.HexToHash("0xf49de2850cecb0bf7c9275f9c99b9afdfdc2eacdb3770f504a9d027cf5cf6752"): true, - common.HexToHash("0x58e6c78dd3565309abdd4924a4c77f64324726c75e91a9e36b9750456d93288d"): true, - common.HexToHash("0x78007631e440ca1dcff94dbb48558e4f4de19f303ae7b0aaf147269081083164"): true, - common.HexToHash("0x311bd2776d911b11b75535ac8ac50961731c8ea8f1428c329d7291654f9c88dc"): true, - common.HexToHash("0x45608b2f127a3bce98cba5d91b8e6744de7c25303a96359427a4ff73cd9485b7"): true, - common.HexToHash("0xcedb46261f976c0593daa8f29c286e42786f3c151f29df5a6f38cbbcf836e76a"): true, - common.HexToHash("0x5f196019430c98191e63129600dd702b33c94adb0e4d5f82d161d126277e32cc"): true, - common.HexToHash("0x464cbf70c90171c8756011a9269f5df7900d283f9b2995ce5d8be25454e45ddc"): true, - common.HexToHash("0xca46a3c79720efa30e32c0f80243c0afbf8d69ce7755487c6a68c95e30995704"): true, - common.HexToHash("0x6c27f9c27b03f66b1df3860ab82c1c6ed716e68a0c40e8e9147d6664e36c9b22"): true, - common.HexToHash("0x87e51906d1e0a8c2f18406cf0ba141e6b36e0c72ed39a5812b07a0a6a56f06d7"): true, - common.HexToHash("0x6506e3b4c591ec02e90fc82aa3ff370ff578537728e4d59c105f41a344a0e6f2"): true, - common.HexToHash("0xf408a13dcb149ccdbf3168f87aabf557e92d776cdfa1482a3051e33e7590e6f0"): true, - common.HexToHash("0xf51b1fe2048b639b3aa215b5c4d1ac007de54bc700ce9e432f938b1354967091"): true, - common.HexToHash("0xa6f3aa93fac989b79a2e870f40217d5f4f0d162ad6982b7f3d0a445b621825a5"): true, - common.HexToHash("0x138e89e3541908410c9a2d26266f065e8c09814c9aff1447bf159fb26a16ed09"): true, - common.HexToHash("0x695f1800aa70d4cf08f9d44dafec1f356386a83e726c4aca7637fd91fc50ee7c"): true, - common.HexToHash("0x33efe63b18316f2e7f3d6838c4c7fcb388266837f44b1688ed913a89f9d31548"): true, - common.HexToHash("0x03e3098fb3592c61cf2250b0729d02dd259ed85ce0893010a4d186f5c89cc764"): true, - common.HexToHash("0x92bfa510e7283988455f573a451b3422f0f0c7136976dc9be249f2af887c6217"): true, - common.HexToHash("0xd8cd4cc4a330f1a8874a1fcb3a3ece6c4d46d1ecf7028e997bf64efc9ef32bf2"): true, - common.HexToHash("0xf7507f8f3ccd1ac674f04c1676728a7a08876a7f97089e5564a7c2c76407cdb9"): true, - common.HexToHash("0xd5f57edf7a1c934d8f71a076acad0832ab17d72cfd95c98fccff34a9aaf052c4"): true, - common.HexToHash("0x6edd2999197b0531dce508c78840651c48e61f5610e5b92b97f7ad379493e68a"): true, - common.HexToHash("0x175696484ebbc9290f09bbf02c647eb94ce7681a48335d78724b32181fd7eb18"): true, - common.HexToHash("0xf0307603ce94a2b0adeb3b97383d0d89484281bf0ead50d878cda71c48466d16"): true, - common.HexToHash("0x9803f5696595d3c260f1f617dbe7569158103a52169ce3255db7b41db950c4b7"): true, - common.HexToHash("0x780a886d5e11fffb99c55ab3bee31d93f209e59d794178a06b39d04f7135eaa9"): true, - common.HexToHash("0x44e505c42810f1c4eba808867ced0d4703d8151ed95464154c8b15e6e56355df"): true, - common.HexToHash("0xde23dbf26347e81a73ca6a157e7cbd86a4a48048b1bc498b19c46d8824922b27"): true, - common.HexToHash("0x287643a92852cbc780eacf78a209a28b0c1976b55b887f2ddbbbdb71216414e4"): true, - common.HexToHash("0x86354ba567e784b097531901c13c6ac23671f7f4ec01fe9fff006c6e614fa7a9"): true, - common.HexToHash("0x62b763c96ca7987f5d117194dc3a2264ae8bf5f87cef15cb31c22dfc47924d57"): true, - common.HexToHash("0x9b586cbaf90b7dd792d0772542a55bca9aa217ce9ebb24abc509b38345209d36"): true, - common.HexToHash("0xf876039035641144176dda5d19ab7a131ac15b28e23e1c0e4b54f4385c832916"): true, - common.HexToHash("0xfd70793e8fdc107cbde7d77e396f5c93b4968062447dbc6d5e2c9fda3b442b00"): true, - common.HexToHash("0x6e080d41a2c2bcfab5570a6e34430817dcd384822e0f93c80b729bf63b6d5e0f"): true, - common.HexToHash("0x173ad2285015f699855e7c2280fb1f1c8039df9189f3ac8cce3aab255f28502e"): true, - common.HexToHash("0x297fa1e08fa02496b01eb836eea1b9da64b248f99d8d7708b9cb352e5b395d06"): true, - common.HexToHash("0xfb8e9a7f8c330029f9f5446b99582941ac9a575db314040e71053e23aac099b4"): true, - common.HexToHash("0x3b4025ce6815decb16709979435492f37adb41235d9e1085e6183d4629438647"): true, - common.HexToHash("0x3356b208bc1f5449de18fea9a04379e880311ccdda3a769b372c0ab326a3cfef"): true, - common.HexToHash("0x24a0f03b00cf0ead7c6a399384402ed48ae65ae51de3205ebe01e4c34fa62435"): true, - common.HexToHash("0x59af60f63f6caf5b16c2a64c5351181ff9e82c6d8bd4df9ecf6e01b1ad7bef27"): true, - common.HexToHash("0xa8a40939946e5a90fe2567653db7ed7d773776add97e53323eda7f1a62d2a3ec"): true, - common.HexToHash("0x2078580945866331a8dfe396b7496ffb34c6ed52278a3ec8c430e455c4ad604e"): true, - common.HexToHash("0x6471c866ada5e769e41c9571d9d3a22b8c1f424253a8856d84216d7cf242de3a"): true, - common.HexToHash("0xeab422092beb9c1a25748e20e70378dbe88dc891c7df29ff64385f8c48a71654"): true, - common.HexToHash("0xdb6c6ec93e544f7d61a0dd7e9b213513a045cbd7544bbcc0067e01503458d6ac"): true, - common.HexToHash("0x8ee5baedf15ede1dfabe560bc72ce0ac475aa9d7e70b3af43a071c5debfa392b"): true, - common.HexToHash("0x00f37255de599ed7750f6b810a2c662be7babb05589b0e7718de878c8cbe5638"): true, - common.HexToHash("0xef0f3796d717caeb64a5356cad60ab186582682e5535a1ec4a71ab575d31519e"): true, - common.HexToHash("0x8f0a8ce57d92ac96a7da0a5cd8e506882513156e45b07fa3d810ac80b7537a2f"): true, - common.HexToHash("0xdef0a8117f00c40a7739fe5333839c42467397d2a5a5c93d87789e934165e47d"): true, - common.HexToHash("0x70635d96090791abb0cfd0a53c09dfaa4a294cf765c9315bbf272f3b46e21527"): true, - common.HexToHash("0xadfbd856ae0c1fbbf4b9ab8d9da6438da0d0c91866dd6db62f4960f8123af50d"): true, - common.HexToHash("0x22650ad3035a263654bcd580096186f13e2cc1a80390aa69e46ec36231ed9a23"): true, - common.HexToHash("0x9e5b5f43ef59332c194a42b6988d5cc3ca3b0ef5b638a139fb4338dbbb000556"): true, - common.HexToHash("0xd845e0a9431dbe7362fd61c66338dbbf496f6a0c3f664f5462d34de9a8b0c55b"): true, - common.HexToHash("0x9bc647792b6040c5f422f93eda4d11b4a45935a2b84ea639dfb71d885471dcf0"): true, - common.HexToHash("0xb197a69d3a4b484e7e4f28a6f2d0dc47c18525b504018a639878922166886908"): true, - common.HexToHash("0x63c4aaa54af693e38260f07ff197053f41f9e46a2569c4772d72728f80feff1a"): true, - common.HexToHash("0x9d8e8769c5b14c1862b06d5189d5e0aa73968fcb420427a216f8d88bd20b2cc1"): true, - common.HexToHash("0x61c59420538a5ccf3865ea2450fa68ef34a705311d67078f855fcc232e95f140"): true, - common.HexToHash("0x9d365e1e4b0f12b30f99ad5ace8e7bb807b5d0e3d2c67c14db7df8566275d9ee"): true, - common.HexToHash("0x70b48f7fd264ff8ec72d7a5fe13db90d0989d6b5a6b39f5420f29d209dab13f4"): true, - common.HexToHash("0x3bfdd0509f5031370226bb8efb8e5646a8f104976b6127c4e98a5bf9f2643a7f"): true, - common.HexToHash("0xa8e1dd484ca787a30f7c3f5c71ad4cd7a6ba181c86a21e96ad0d12715fdb86f6"): true, - common.HexToHash("0x6c3b34504a340feb9e506f4103433d5e60bcac949cda9ea980f1c4b365c8a3f9"): true, - common.HexToHash("0x1b449bacfcb5281a58310d39788397d6b1853c63a8a1cb381a62f9ad1b3785ec"): true, - common.HexToHash("0x42ba31f761b1baa3c89bca8070e462615c496b7976fd01694b5f753bcf083e46"): true, - common.HexToHash("0x53a002eda5f5563b0412a399f7d4369f6fa968859f0deb89f2b2651609cb73c8"): true, - common.HexToHash("0x3390fdaf7cc6474d65966859fbda316364f0a13fe692b055c0821e353af05637"): true, - common.HexToHash("0xf61b8322f48193f8ac89caf9dc88c1a863a3bdbd0f6393bcb50b5a47fb6a4b49"): true, - common.HexToHash("0x4960d2e3728ade9b9a75f336e2f6296f979bf336c211e36a64b4cf83285307d7"): true, - common.HexToHash("0xe3ecab0079644e238423ba12f989071c5252e23fa8c2fbcf99eb0cbebfdf1d8b"): true, - common.HexToHash("0x4c12513cbf1aef21d946ec33b0e8614037d9cae3d5f4e6bd8ec99560548f3d2a"): true, - common.HexToHash("0x376bdcf7a16011c3b571e8f2b8d3a520404cb7541b8ee59862db877edb583ed0"): true, - common.HexToHash("0x1f8ef7d3c0cd9beca8b06b33aee27f1c6bde380fc9fe4689f70a14fd8d68248a"): true, - common.HexToHash("0x0bac50f7532752ebbf38af4faeb8b5aa75e8ab14f8818af128f6af8fb1141dc4"): true, - common.HexToHash("0x267394acd89a3ede39fff0ff70fad6174cf0c05f693b7ffa0ff41a8fb8e3247b"): true, - common.HexToHash("0xbc3ef8553fe1131bcd90d7e130884619dad416b2db6968d237c623387c13e8bf"): true, - common.HexToHash("0x4a27abfd1fc48d42dab7bd93889642928e67fe186eb1e4ec3e59f07d6c962612"): true, - common.HexToHash("0xbe40e1262112964750244360f1d6f65b8358ea7654a43eec07741733b3eae3ba"): true, - common.HexToHash("0x711d03b558aa647d448f3bba5ee0c6910aad72c472be6864da5aebfcbde68eea"): true, - common.HexToHash("0xb0d041c3fc51458c4f4b1c608d9b9e24db1430edccb9318492504e059892eb3c"): true, - common.HexToHash("0xf88ec691e78957ccfd72bb30b5d0c85b8ce4a3bb7f59e96b1a81e030ebe7ff40"): true, - common.HexToHash("0x7aff19e793da085b1ca91a84070241782954ffdff6eac923a4ccc906fbf86c07"): true, - common.HexToHash("0x5227d8c91058acf238858c2920c0049ec09fb9594af66c51f8572422adc5b269"): true, - common.HexToHash("0x4ec0875a937ab20767ec604dbb52e1b138b699cadee5f921b596bea3f42f418e"): true, - common.HexToHash("0x45aacea6ffaa150919a49b1b9c4c3aa1dfdda574c76d38b9d01bd2838ead2c11"): true, - common.HexToHash("0x0edcd30cbc57ccd87bd2a042b343abf9b68683a25244a7952a4662c131552108"): true, - common.HexToHash("0xd1c9c263331c37dfb0160d5c6fe82d66007e7d99a2f48d6e843e346b1baa2445"): true, - common.HexToHash("0x32f9e81eacfcd0f773cbb2978725dc6e8f0ca14e9dd7e11deaf686472e2252ab"): true, - common.HexToHash("0xdf014b13eb84594408579cfc084b492b4bd7dc41d586d574f71b548e2c19ea67"): true, - common.HexToHash("0x6802508030d6f50eec0e83ee81f1e7d6a151752cc99b3d9e9a8b48a0a79fed40"): true, - common.HexToHash("0x3ccdff26e2ac3e1079da519ab79f3a0a05521fc858126bf526bf94d4fb6cc179"): true, - common.HexToHash("0x1e14f192be005203cd0e3c2846c2bb35356393228f6f026fd88e0509e6534e64"): true, - common.HexToHash("0x4bbbfe287af1a656469fb8224274d49708bcf6124b25f74a8aebc237f17b9164"): true, - common.HexToHash("0xda82bd3ea3b1cb4d450bf0703c35c8126f6602407b7fed69dba79f60bfc590d7"): true, - common.HexToHash("0x51987949cb7efd99efb72680a69616d6dec73dcad1ac13469de83ac9cec77048"): true, - common.HexToHash("0x5fdb8a60c0739bd4e54161c2786d770c826c5c0a7679b3371f05d2f5cf17dc4b"): true, - common.HexToHash("0x6b506f2a4da407b271f6b974077cfb3b29b3e3b5a5d854da145eec230823cbe7"): true, - common.HexToHash("0xa8805a2644f5748ff38857a60f95efb6b424c7b13a23131648f3c101ff26a3c0"): true, - common.HexToHash("0x0ccf15139b3fe6d20dbc94171f68553428d845e1b18cf93bb157a181274b7c95"): true, - common.HexToHash("0x542733f8b192d9567582242946d1be986bf2e927fe32c494e225cc0b8a68de72"): true, - common.HexToHash("0x8d888f670fbefef0502ef2e8ea14520647a35c6ba6b22360dd87586a2c4d1ef3"): true, - common.HexToHash("0xb3c4d34faa909e2b67e462908b98f5ee2134dd2367d8dc64bb4bb8af63dbcc16"): true, - common.HexToHash("0x47551f500c632e2254cae990586055feb7ef7521bb914adfcfd827b983e7342a"): true, - common.HexToHash("0x30c0c18069e5a1bc58fb8d1a4875ca9f43984148d70a444eb50916afde5544ce"): true, - common.HexToHash("0xd74d4f167d7676e415ca7ad3dc68512ba7da1539110cca35238a73b8dcf4da2f"): true, - common.HexToHash("0x4860794979fc8aac5dd122fc2d37c14f38372a8967b73e01579e2a4185ea252d"): true, - common.HexToHash("0xf2c26d26cdd337dae1eb61590b8e99d7a4bd6f4c5aa2eb4a27349181786afad0"): true, - common.HexToHash("0xdd315a59ef40277a37edde1ded648af7093ae8cacd4ab3092dfb77c46d4ae1ae"): true, - common.HexToHash("0xc1fe1858a377b3014b1595b8a12d58cbf17b780f2daeb9188d9961c48e732d25"): true, - common.HexToHash("0x0d9ced154b5359c04173aa2164da4351b4e2cfd3e30c100c818a1f014d74b485"): true, - common.HexToHash("0xf76e30251fdbd15af8544a73a93d300fce1e06fa798f34084e0e41922652dad0"): true, - common.HexToHash("0x63bda8bce2b3cb49fe3548f420c56aa5a56e5e68ed99261a0a8077982f0a45f3"): true, - common.HexToHash("0x5494449cfef2bef91e41af13207504436ad92a693a3bdca4f46ec70bac27b044"): true, - common.HexToHash("0x29a79c5889668814c907110c5a45bb09a0c5ed46f50d919c4ebee9ce12235e7a"): true, - common.HexToHash("0xb951c4aa6e4277c8a7f4a43090e1139e3f8bb22e22dd805dd1bcd6161a587635"): true, - common.HexToHash("0xe781a1166f53c7e9e824fa35be904c91bf8d161aecc7bd1ee874ca0a6edd3d90"): true, - common.HexToHash("0x76ca09f8452477f63bf950e4b36b1dcb38a185e18228ff4bab321541d6584afd"): true, - common.HexToHash("0x5c15f32d8218d20c34a178f6eb400d2bb35a9bafae63a2e981ed30eed0b1767c"): true, - common.HexToHash("0xbe422bd388f1083e0e9b07cc2bd13aa2937e3bc534d9c099ce2bd8ac7ecd8d28"): true, - common.HexToHash("0xdff20638a2bab9b5fb46e6eb3242bd02be6b3f6694dd76b1ba835d7cfa5488f7"): true, - common.HexToHash("0x5809ca22aebaf11b31a04c4665390d56b4e1f46839244ef7d60bdd5380cc92be"): true, - common.HexToHash("0x87a93f867a0cd947bb370499bde881c4f98115de92469f07e9eb156a8b73314c"): true, - common.HexToHash("0x55cf56672c307a856d7aac612646d07c5d2877b461ec68c6161f185e188b0fc1"): true, - common.HexToHash("0xb74bcd144cc57496b646ddbfbde2be5becbd58587fe7ac6e74ab8e5dc77eb912"): true, - common.HexToHash("0x85d3502299760149719338b36c1434d925b3c4e29ef24da93e35284a81c95f5b"): true, - common.HexToHash("0xb964671da20dde2e4a033aaaab4469c7f6b66dddfdc96ed78c9ef8223edafb90"): true, - common.HexToHash("0x884585c65457b5ea0c169eca5357c9d3da4f8425e82614c6b3de8264860af089"): true, - common.HexToHash("0x3cd7d16b9740654aa2497f726ac6e52191da9693f4f9c074dea990bd4dcf05b3"): true, - common.HexToHash("0x8e4fe586cce4ceb3070fccd33dac3f344369bfdd660170e2c61965581ea4c2f9"): true, - common.HexToHash("0xff873dd7e783dfa9c9a52cfdd33cbc92f60d1a90f47f4f235046872e3a1349bd"): true, - common.HexToHash("0xb32211d924e2d8546961cbb7c336f87b6c2adefdcb1762eb61d2362f976b72fa"): true, - common.HexToHash("0xc5c5bb6f5afba43ad11dc0a5548e68f8d430e9e1b9509f88b59e827b6148838d"): true, - common.HexToHash("0x5854427d53cbaebc1d17ca0724d37cf34d7c0b6fff0e2cecd1f93a69b87c1c23"): true, - common.HexToHash("0x48a8836fbd398e9f4640305fb2b3ca01ae1df26e036ed82512b7267b6f250645"): true, - common.HexToHash("0xb8babca7ed419594d3dfaece1b68afb3dd8bbb455da10fb0997519641a38a292"): true, - common.HexToHash("0x1ea40adb0157768e74c8818671db46c2b7e85d69f313152e42c4f7bc850bc78c"): true, - common.HexToHash("0x36935245c50a422d93c009248b0ffbaee12e2418d97e86ba71ad01b5d4c6df3f"): true, - common.HexToHash("0x7831e178c3641ef16e2171028b38f9bbe9902ae105d73ee2daf34c94f2cafc74"): true, - common.HexToHash("0xa16e5a37abd180169675ba1e82aa2b38b799d31d30ceb826392ae5849bf9fd97"): true, - common.HexToHash("0x52f192b870505d0dac39ae611ccd38bc054a891bf933fcc65da113e603038dac"): true, - common.HexToHash("0xdb0dfaf2548fc317bbaaae4681100a6538746cab52c5e7e71bb459ff3cb6ea46"): true, - common.HexToHash("0x6010dea4ad42b77b27fe04057af62be8a954676601c6b05c425f979cd4dd5a3b"): true, - common.HexToHash("0xc6647820d45b9a423d7b0277f4f0045b1273bd009e8f8b6810af713d6a2b30ca"): true, - common.HexToHash("0x9c9521ae90b5522245986df891ec5ef70e66a4f1b440085bbc66b70ddf31e8d1"): true, - common.HexToHash("0xc35fa6d7f5198ed3c1c6549c854592280790a2e6333726d26e27c59a002d6e6d"): true, - common.HexToHash("0xb08a1c4a4b6e04042b4f6c0af1ad43c6a0b900812a3be2a0a62223d6e36bf0bc"): true, - common.HexToHash("0x7ad2f8140992825efb1dc8a901f8341214a50b622329748dd2d0eed6482b875f"): true, - common.HexToHash("0xe1c46864979ccc97c4711dc5c7cfc7ec189804eb0dc46d43e3d526a864f6c44b"): true, - common.HexToHash("0x58784aeb23d5a1956c593051a8ebcd45446ec3e980379bef8ebd9f428be56ae3"): true, - common.HexToHash("0x9cd7c50ad7e86abd0bbbe869980a668cce814c6ee951cd81ec5b1f36d8842ec7"): true, - common.HexToHash("0x38cdde781792f698785fcd68ca3bccb91b03521e64323f331b5bc01d4642afe0"): true, - common.HexToHash("0x7277913049c16dbca8fbd92fff721da26bcd73aadc89ebcfa760b5713e071a1c"): true, - common.HexToHash("0x1fdcc01ab096df85e7acfc7c820bb365c6fa536f5e50f9a349e374da9f3e8d9c"): true, - common.HexToHash("0xd45ba98a5bba6b12362726acd430cf11d0cc2776645c125864a99876c9b5858e"): true, - common.HexToHash("0xf24c68e6210325aa79bc1cb46b348a121e8e3afb98b4b36a06a72ce836168a1a"): true, - common.HexToHash("0xd55bbbfff6a22565073116ca6e3c7af61a700419163a66aae0d8878eded10ff0"): true, - common.HexToHash("0xd8d3d05d3e265fcb1e474c07ae41c2f8cd54976d2a9ece390c6ace8751a31754"): true, - common.HexToHash("0x5f486d5ead4562bb6942a68514b3f0a86a0c0f496722657f276991bad7edef16"): true, - common.HexToHash("0xddcb0a9da4cc228330602a1ce850cb4941cd1d8f41f206a7df8baa9a543cbdf2"): true, - common.HexToHash("0x6ef94d3c76fed69b32c13862c09d9809de279627366c8de834efd3c7987d5b6d"): true, - common.HexToHash("0x77ebda28011d3989d0433819f125541a8f84d67dd291e813c1f9f257b72a7a6d"): true, - common.HexToHash("0x9a9bd5c070535a7b9802878413e2e009df19e85a4d45aea3aec6091ae84454ed"): true, - common.HexToHash("0x35592d22de5fccc92d7a38d5c7553496c9ef1e64dccb642983ae4668670916cd"): true, - common.HexToHash("0x1ba86fcae0fa3b5f428424e131e23c5b8d1306f13af15da934a756908eaa2415"): true, - common.HexToHash("0xf72143f46ef4deac3c46ffe807dd89d4d57cc51f7ff9eb459872613f228e28aa"): true, - common.HexToHash("0xeea42ba1e8084278bc5e9b57f2ece83965b84effa24cc4eaad30e521a5c323f6"): true, - common.HexToHash("0x9b70cfa122157d8aa864e23f40d07200f8d3dc9f34270fc545f5e619befbaf43"): true, - common.HexToHash("0xbb6d0078adf7e48c9ec7c8001e6a0b4e9d2732b1c33f37f71f9bbc361677a18c"): true, - common.HexToHash("0x989faadf4d1fcd822b1200861e5d3447b04cafecc34c9a5e629808b193ab0a73"): true, - common.HexToHash("0xc7862854ff0540abdabb549c6046b5ca555eacc9a00ec3f130030c139272cb6e"): true, - common.HexToHash("0x702095f6e8ba88ca7e57cba01070ee6fbe826a1c324968383899b90de51efb65"): true, - common.HexToHash("0x2becd542156b12c9f1f961d7806e449b14db61ffea72bdd54d047c596d233602"): true, - common.HexToHash("0x9cf05a9ca086575243147621272bf7d1412ba03d2dd19ef3d35f62ded2aea08e"): true, - common.HexToHash("0xdce7b9b8d316fc600c79bad68f9030f92662eb6f023a348d5b398f6e32eb2555"): true, - common.HexToHash("0xa56c01c2161bdbe99d0be3c9beb73dbbb5392f254d01d29f1b0205271d64a3b7"): true, - common.HexToHash("0xb29c9c788effaf4cfd35ad6723c673977c305a653e7bbf8b52a0d7151077733f"): true, - common.HexToHash("0x352c03889c2e511357bc4cd565ef36b028085053ddf8fd8656712042ee442eab"): true, - common.HexToHash("0x394210f8c675ee74b6dadc365ed24bdbcc462d990f7e6950f8d14459f65d812d"): true, - common.HexToHash("0x137449c2e654f9128d5dacaed090245269e3b5fef3d64af4e2650aa25d46bc9b"): true, - common.HexToHash("0x51e5631ba39f41b934c2733194c311f09c8e89d3d05165feba708b7420b289af"): true, - common.HexToHash("0xd5301ffd62ac34aed8bd1aa2f67d72aec3870bf787eff8e20c1ea023e89f366c"): true, - common.HexToHash("0x2cf3b8cf34697e12af30efc79dc11a4c1adb830ad5b742ffaf5110bee6ad62bb"): true, - common.HexToHash("0x408ee6785df4020f3445d1731e6dbf78fceb9444cf5ee7500159f99dabcaa9ec"): true, - common.HexToHash("0xb7d3b1ab54057f2e42d204be055dbd3704ba78326cdb81bb58a42ea2b8f15cb4"): true, - common.HexToHash("0xb1a464d493c6d3a1955a365030fe9e261af1436abccfc3d9dbb4f12222cb2f08"): true, - common.HexToHash("0xb57663a63e100b80cb024f518453410b3528c14d5d8f8a59a40f4873d2c02ac7"): true, - common.HexToHash("0xadeed7aff9a0c151514e42c4930ef36d5c25d455d4ca55b7fe14b0f5cf271e3b"): true, - common.HexToHash("0xc0e2d94409d2e1094063a3671696f4a46eccb1566f3be78b0688539f2e7e739b"): true, - common.HexToHash("0x4124e4c290d805240180f107f4d41b419e00e805d3df1a05cbe3df403265b510"): true, - common.HexToHash("0xb3ebe3d8dc069c998c2ffb4b281c8f387c7ce165a327a66e4b46b785c0628dc1"): true, - common.HexToHash("0x0a0a0d32d371bdfae9621b172465ffe2bb1ab9e5bb59469fd9fc2b98d213924a"): true, - common.HexToHash("0xe93c4dc4c4e7b7db6b998285d4fd5763733f81d968ac58471545e05612a540d5"): true, - common.HexToHash("0x8ea1475fe25571d29e3f921c45caaa8e0cb47faa25b22db62594adf2d4e0e972"): true, - common.HexToHash("0xd59cf0c25219d12488f30ca3f25c4de64b56a42a386e370dd08d05d13831163a"): true, - common.HexToHash("0x01eafa2f977c1019eca314c1ca627ef0c84f6c51a8e9c340c54351a02211c3b8"): true, - common.HexToHash("0xa3d3f28c260ab3cd16499dcc15b3c019b64e17e2bf335b679dcd2bc0d4b106b8"): true, - common.HexToHash("0xc947c41fe678fd31c92cc5102f3e7918b269f34c353c6cad11585691afcfe83d"): true, - common.HexToHash("0x98a91d6431e826068f61334b1d76836f46ae9d761e13391a384963d0f71371dd"): true, - common.HexToHash("0xcf4acc18df33df0b96897b7bb0e38f4722363c9ac8d35df8605a95e5add28776"): true, - common.HexToHash("0xaeca211678859c5c06f60ed85cae13c76f20b4a86e93f2f90abc43a79e948eb6"): true, - common.HexToHash("0x688e160d2abfceab6e1e66dec629e2f187f1ba198fbed77691f7a7da9cc9c7b0"): true, - common.HexToHash("0xa0e11ad9c0e5ac3e23fc342bcad362a88d1b02adf799ac88ca5af4525a11d2bf"): true, - common.HexToHash("0xc0e4cbaa139b1599af43b0907bf8eaeb9cad035348c09bcedca13c1365689bdd"): true, - common.HexToHash("0x14328eb26b1b1164813159d11b86c57db95eb894e9777b640d0c7c960c1b6e8f"): true, - common.HexToHash("0xd249e38f22f5e7203ac0566bdc52ffb79092798736202fb54594c81a609fdf61"): true, - common.HexToHash("0x5cb18bbc69a83777cb23bc426962546892022aa2d06d962692b4f0c65e2cab45"): true, - common.HexToHash("0xd59982b15837a0bfd090f1092c65d512621f647751ce97f67401d30742d53814"): true, - common.HexToHash("0x43901c8637daceadb6fe04eae39ae8323128d1afced8ab7632498bbcf5da74bd"): true, - common.HexToHash("0xfaf918c2ba867f5cc93dee2197ee9b52aadeab43c796dedce67e125dacb36000"): true, - common.HexToHash("0xfba470d3ec99823bfc733172f155911e5d3a5b630299cf03b886e69725685943"): true, - common.HexToHash("0x032a371564f3df89242f958b97a96fbc1af6d9438800c6ef0a77bde806ec5953"): true, - common.HexToHash("0x94dfb8513fcc98ae0ac2d4bdf53b34b96026ca126b5eb25cd369787896e6b7c5"): true, - common.HexToHash("0x691f82ef4793d1a8ad2f1992942e4436161de5f80a2e865048e39b9ec9bbaccb"): true, - common.HexToHash("0x8686e468df99f8ffcd89b7a7e784dc81a8787bea7b7744272e1d746989fc656a"): true, - common.HexToHash("0x2e10093c1ea6ad1a4e67d3d1ad804c5a0655bd39697e3bde4eb27b3f241ad7e3"): true, - common.HexToHash("0x2778cf8c3293ad774672674140759914dd1e662b845f4ede47619c214a6448d1"): true, - common.HexToHash("0x52b239ce3914d78e22345245e2741cade99ea458e7e75ae5b415952673d82cf8"): true, - common.HexToHash("0xe2a08453cc124ec469cb72e80bb49b42baf5df51a2a1dc994c5d0f5554748082"): true, - common.HexToHash("0x96927837c4efd81f84a02817e1a056952608acf0f75b388d5187a091f8d46eb9"): true, - common.HexToHash("0x3904ff794622ed5792ac7d5b6d9658049bc7dadecd248469e814743cc59d7b6c"): true, - common.HexToHash("0x21a0d582c180c8b2d86bc3bbd75e67737539d67ac9aefb7f397d57a8bbb790bd"): true, - common.HexToHash("0x5837d617f4a6664b34ba9fff7def1f4b9a5de20956918bfb365b3fe447e6eb53"): true, - common.HexToHash("0x8318e4fe568e23eb40cf1c905b95c5497f9b1933029a23a1ab08a210400f81aa"): true, - common.HexToHash("0xf78fb6f8c3f350a4f69c6ac3c356454cb4a6b730c89551800a73fba6451d3571"): true, - common.HexToHash("0xbefb233f30587465e59785dbe903feae07151e5793963a4f6409376b7beeafdd"): true, - common.HexToHash("0xebab6d085551f844094bf67b940a1516eff2e92379fa0f78701f7af5e23a08d9"): true, - common.HexToHash("0x44f05a99c776f1e0a72ec90697fc4071cf193e4b6a2f22919db332834ef71267"): true, - common.HexToHash("0xc70a0a2f0dfb73ebfeba768e0d78d5e59484edb87abbc8a88a321da0ba66e8ad"): true, - common.HexToHash("0xf836bccd91591c14dcad494616c6a5d863695dd3da6a44f2f4803f1ae1f615c8"): true, - common.HexToHash("0x1f6e2aa8f6c142a787c5e7bc3644b38cd2c118dd5aee131e919a4cf24c715089"): true, - common.HexToHash("0x310568878ed12670398d9d779fc3e81f49b78f8d6be3b94b404e0da9e55b0d5d"): true, - common.HexToHash("0x4c4c2088b37f9b91107981a578a69d05512b5f387bdd31f4fd428f6a594706ed"): true, - common.HexToHash("0xb7ea65b6685afb31ae09084c090b581c0fd03521751dd7ecf7f57714a0df6eaa"): true, - common.HexToHash("0x584ca12eb6de7d28cb3d3fff371f913bff36dd7ff182599ea6021788bba618da"): true, - common.HexToHash("0xb8b221732f24dbbf9e00653c34cc57a08202471b6db498b0fe9b494276d274ef"): true, - common.HexToHash("0xe6669e2e62da0c794ac48cd69577e6406ac32ecd63dfe65b8b385e24965f18e9"): true, - common.HexToHash("0xa784dc693a059cf106b79f1e0f5f97601723adf05ae46a747b36c05cfe463ae7"): true, - common.HexToHash("0x245f3550728643b24d797b61b859e48c390885d931f97c42f12839d9606d0382"): true, - common.HexToHash("0x17de6238cef02dff4de280cd9ba07900901e378e16ae1154060a1ea42804e3b7"): true, - common.HexToHash("0xb32ea4b70b166054edbd571bbac0025b78ba5fe773c9b6d07aeac451cc9eda1d"): true, - common.HexToHash("0xf29e389f9ad9c9fb2e13b73b0b6e1b4994d6e4bb44e03120d1fb914c171ff399"): true, - common.HexToHash("0x6d7b28852a18fe1101280bab80f10fc225df3b8f0a025779a33dba2da8144230"): true, - common.HexToHash("0x7d08a6774922d88143decefca8064d2796414333cac11eecb29c86aa97616b55"): true, - common.HexToHash("0xfc00b22f37c4a33254afb7d49f3c467dcd966d654028b2b912f181c16f79d878"): true, - common.HexToHash("0x8b2017f4a1205b555428759667ce5d90fd9d9b6d4608a533a261b7fd38fc3bdc"): true, - common.HexToHash("0xd109ba2e5ace530ae92c01fa847a81814edb5a8d3685a84717a53e1a6e79c789"): true, - common.HexToHash("0x8922e1989abca06232f34f58eba64e428b64e3fad2dd849f06bcef4dd5ee86da"): true, - common.HexToHash("0x248118d7e4d316c7b5a6dd93c4a2376cef671aee2f9ae220160e14b6c04f61c4"): true, - common.HexToHash("0xdb2d166d1aaaad666ffccee0f647d7c746716967c9b47691574128864502a785"): true, - common.HexToHash("0x4f57263f15d381601f5ae7a2b3ed3488321b98c370abe212a73d7998deb5e6e9"): true, - common.HexToHash("0x687ce1c637d9ac4bd514657d8689780249660a2e793f00088a4fecf93737c233"): true, - common.HexToHash("0x09b33b71f28e87c867fee90ad2aa10d6f77e3808f8ee174e6e342f3dd8d58341"): true, - common.HexToHash("0x9e01516897daf0b0628e265daeee0ef15ec10f1b7d04eea928fbb3dbf33a3397"): true, - common.HexToHash("0x4b369194cb11b4230d76bd8b3464ff3982590f68a5b06aff312aca070c6d40ee"): true, - common.HexToHash("0x794a1b70c22e36a392e3ea34d24eae43b1ecb8b9d5f5f72961a44811fe45993b"): true, - common.HexToHash("0x585e213b3fb74d279b1dbc7a5be37d8257861fae8a39da3f3b3c956e2402f88c"): true, - common.HexToHash("0xbb478faed13dbb030447fe6f342e53fb86eb362e4d34cb7c8456e277c531d373"): true, - common.HexToHash("0xfa97733886c19ac61020e9a7aa2e71949e05ed8ac768b96c6eefc02b1a23772b"): true, - common.HexToHash("0x891a378c67b91346488210aa221fef6244a8ed56721b2919dfd29a47fd864966"): true, - common.HexToHash("0x1d7ab3ec3a8510d2b63bb1d8a2ccb0669836664220d4432ae0053fe36972e5cd"): true, - common.HexToHash("0x3cf519f67c4f2f22a1a4b92beaf5e5b8465a17a97f4252ee29dc42a20b4c688e"): true, - common.HexToHash("0x1c2e04592984f82d543805bbed53eb23bc131fd0d4b3f2b352b68b515b57e5b5"): true, - common.HexToHash("0x36ab30cde8b3ea5895bb88b913dccbb142c33fb9fab1fc8a60bc56cc9605b240"): true, - common.HexToHash("0x323471e9390d37dc320fe9fcaf5d7d4f996af8b160b83ca491eb5b1d0bbbe972"): true, - common.HexToHash("0x587899368303871d6d0109c7bc1bfa7c1a2d1bd3a22453da8621c2293a4fa53f"): true, - common.HexToHash("0xe7d7cf6ce567b4f04be6724c02f81e8f1f4c012242c84c7c32d355f15b4efb78"): true, - common.HexToHash("0x4e6cc33746ccd88de0f2496260380bfc8b2f3a0ac9ba5cb8684ed87141d68de0"): true, - common.HexToHash("0x2b5add88318977b0973c02528e39d4295b813d3371a4f80e66f6f80138203635"): true, - common.HexToHash("0x81a214053f2ef10d0cc72dc264036b09ce28c5482c1a1b80ce146f9bb7afb6b7"): true, - common.HexToHash("0x14d3240bd2faf52a45ce4ca6add00ac5e92a68e410f8dce1446489da122c8fe1"): true, - common.HexToHash("0x3f2ec6d17cf415976369fdfbca60c15e9b3f2859894ddbc354fb186fbc051366"): true, - common.HexToHash("0x2b04759a79b8bb6055b39f3ef84558c73b078b1a1983efa1337fbc00bc25dc70"): true, - common.HexToHash("0x3001347805817796373df5ea4604a31f5d232f86100cef63715cfd9e1091ce4e"): true, - common.HexToHash("0x9a6ebef3c3dc4b7c6fdbfe275f756df3dcfcfa392f018ff74f652b9755111210"): true, - common.HexToHash("0xee3574c53e26465affe9bfe7a019ad84a5b302de7a89ba14a1d7e7a61db24854"): true, - common.HexToHash("0x7557581935b007f465c1df66a0e5a4344c63072c97c0449090e27b06fc6c4621"): true, - common.HexToHash("0xa8ea9897f5964e38bb5f18982dbf1a22936cf944f7837b0273818088a1d6336c"): true, - common.HexToHash("0x68b536fa5a1d2218cdb099f3a301f7e659bc42728695645fe8b844def67810d2"): true, - common.HexToHash("0x5584ebc6dacee6d8f4a9fa563f86bde32ab6730c2aa6d4dad76bc0c14bb77915"): true, - common.HexToHash("0x7913c0429cbaf33a885906ee9e1fee650abafd4fb317482082c5f03ca852955e"): true, - common.HexToHash("0xb2cf1b1f2b83237607d7fed5c43f3b27a1df6d1ee3e45eb678689bec5f21298d"): true, - common.HexToHash("0xd261aaf0a4d066bc0aa2aefc947f2ecb9b232840b9266fba0a113023da442915"): true, - common.HexToHash("0xb360522ed91ee016dfffc6cd7a5b4a72dfc67bcab0bfbb5fa61d7338b6e1aecb"): true, - common.HexToHash("0x949823604c2ea2d9881c5627c1177d4473e6feae855f6b30a877abc1472d65ae"): true, - common.HexToHash("0x60dbbb19d432fc2c201b3c31141b657bb8ef13fc43caee24286a03f30a27c839"): true, - common.HexToHash("0x1efb2f5835afd2e85b9333a1da14226247db9e2d8c6c3a51fca4e7af0cc563bc"): true, - common.HexToHash("0x00ee479ee037648fb49741a56e52c0fe3d8e414fde83d073ce5e177cd20a8fe8"): true, - common.HexToHash("0xf73be5ca95940e4eb998a2d25214bd7c257a1f3279be708a9fe3032b4af6bf5c"): true, - common.HexToHash("0x9dd0699cd488bc8a93dbf063066ac8df23b435333d32227081a9bfa115d8ba61"): true, - common.HexToHash("0xa7c61eb620c31ef17686edb161908e9597f9d938ef9bd4644340dc3b2b17b495"): true, - common.HexToHash("0xc2beff0cf4c2b2aafd11e44bb3d187ea1ea9d0e5d2ecd486a7b1650cb71cb670"): true, - common.HexToHash("0x7bb443a127785a5b8d0d0d9d844b9fed80f185b2c3cf725beae9c79b9140f409"): true, - common.HexToHash("0x6a137f2114b3352ab7917a4e4b3305e2d0f1a339057811fdc04f36ab1f173d37"): true, - common.HexToHash("0x7b61ca455bd78448c2bc847ce7b2afaa2d56de2b83e2cf6ed4b2a218c21f91a2"): true, - common.HexToHash("0x83b69484ecd064b4c0c70754049e66394acfb953837c764fc050b9cdd69ebbf2"): true, - common.HexToHash("0x9f8f9ab2bd61157c3d3367016a5f3633d9291c4b122aa203f557cd659bb81c86"): true, - common.HexToHash("0xfdb78df24d20cc309fca77415902bcb752d5dba754c4767a8103dfba439635b6"): true, - common.HexToHash("0xb13ea1d1d49679e1ee95c405eb4a7a902ba5e17b65b65f3f129ded072f2c6c75"): true, - common.HexToHash("0x1e5abb7e5707a1e3648c7f81d928e67d5445c6fc3021e8368a6b7b65b8d2873b"): true, - common.HexToHash("0xf4bc77bbb0ded49f8003900f34d0f648485a5514aa1fc3cceae0dacb9ef3e816"): true, - common.HexToHash("0xd0bbf1fcc2ca723fb722a5dc32e9f88686e51464c1c26b37882c02fa7746dd2f"): true, - common.HexToHash("0x58c4de5ff88b42c640576a4ed0b008dd04d27a9901735613c93468236671a117"): true, - common.HexToHash("0xcab7417a34accbf54422e39241d210123094f4923fcaa363d40242c6c9530531"): true, - common.HexToHash("0x64a63c9037de06ff378be151df093fce11b6e2da7356ec08e3c921a7a79e1028"): true, - common.HexToHash("0xa0e315fe64b662c362a69d28a7f7f5472bf701e4bed8ce40f884b2c84cbe58d5"): true, - common.HexToHash("0xbfa7232411630812828135635d20d373ae254e2f000908a81cc16c83ea813144"): true, - common.HexToHash("0xa0db0c2beb52d6a3a48b5b37c9f0a55e0f4d2f20bd9af07731be75587989ed37"): true, - common.HexToHash("0x269c6737917dda5013a59cf05445d91b600f08fdbb571e9a1295a9915e369f8d"): true, - common.HexToHash("0xbc7564220fa992f3d214f781933111d242ed4bebc51f21f0030c94a7b902f7d3"): true, - common.HexToHash("0xa84dc213f2872cf988b2ed25f9e3e397c3f100ef04914f51be1efb6397490de3"): true, - common.HexToHash("0xa7045e78e21e35265f7ffe9ed40709ca8a82836a141f5ac471baf018d11a0c5b"): true, - common.HexToHash("0x20ba5c350f44e130e55911836c2303fa8d871fe44a8605be4fbe70094f56aa13"): true, - common.HexToHash("0xd560f02f2d9012490124c7cf728344def93126963007b21010f3933660973c28"): true, - common.HexToHash("0xeba4f8c51b40a86c79311bf16ad0d92fe8bf23284ec78735804a121970090cd1"): true, - common.HexToHash("0xec3f7ed9cf451d4553cb2485348589d3ab7b0684d7a1af37ac73dc88bced7b9c"): true, - common.HexToHash("0xfaafb471305d191cebd787efafe467eaea5be64c23299e83d02b0188358e6251"): true, - common.HexToHash("0x1ff7c297e6f9d4cf6a5550059bb3c342c5f46257e93fc75880359cb72dde2ab2"): true, - common.HexToHash("0xe19067f47a70311e70abac8ed394977ebed6773cf146db8895423f442cb3ae1f"): true, - common.HexToHash("0x6b88d70809490e39c250d67dbe8f55335b765a37fc0a888659b06fa8d8e7cf9c"): true, - common.HexToHash("0x03e7588895d36cd74be69b4e3521af8222ee910e8d22cf15d90da9b4e2fd87d0"): true, - common.HexToHash("0x9dc5f534c5ad1e379803809898e6b6119bc4be47c3fd2a89af0c26f43c038b0d"): true, - common.HexToHash("0x1e8f19ad4c712e75ca0d3c40b11dea1cfa88a4abb2e63a08e97637c5ba7c1b6e"): true, - common.HexToHash("0x5d5b3cc75fb153a162606f0315bb062198161d225bebe290f70133133403b9ab"): true, - common.HexToHash("0xd05fcbbd381e1c948adddd45b21e0771b7cd3a2e3a547de6f5e2cefef5dca722"): true, - common.HexToHash("0x7c821f3aff6f30077d83ab6725d1beb2a8fe7751c5af419bb93768b8012c8b7b"): true, - common.HexToHash("0xb653a43d92246ec4e8e79f09ee78a1ad9a85bd5786625e3662272086113c8f43"): true, - common.HexToHash("0x5940ff76c6b168bf036fc7ad04048cebfcba2c408c3fe4e23da7852bd13d6b92"): true, - common.HexToHash("0x65cfeb4cc4f156f2b51192f7d5c7a0b59746550ec05e530785e1bb9239c0b93a"): true, - common.HexToHash("0x1b0d75dfa0f4d7174d2a7d9bc4819c6f13b4c50d2001163d831d0e8dcc29b34a"): true, - common.HexToHash("0x560d1379d5658ebbb69f5ef38c3cc6760460fa4ab9d1ed2cc6337c8a3162f90f"): true, - common.HexToHash("0xb58a1e9cd13290e5fe38f47abc20953b0ddf1ba08cda7280e5e4d5518c73f177"): true, - common.HexToHash("0x73d7b0e12cc6c3a204f7e79dd3fd38f7128cd130e1b0976e63d3b6ee47f587a7"): true, - common.HexToHash("0xd656160c2e7b9e9a08623fcb90ca05488fb41e97ff81d55ccbc6b7eb8c55e1df"): true, - common.HexToHash("0xc1e0c1aaea56c261929e1c9cbcb6b9c6c9b314f7f17e79d392dec759a70ccd4f"): true, - common.HexToHash("0x9a589ec63e01c3d66317e09ce9b2aef3970b3773b89e3b19db6fbe367d127d04"): true, - common.HexToHash("0x0af4da2f71c9e376659627530c9910418e423252dbba1ed3a1b205754bf9ca4d"): true, - common.HexToHash("0xcbdcfbdbf567664039fd49252ee7f7cc7dae8ddf84b08bb4c44843308168fbb9"): true, - common.HexToHash("0x1796da961d09c71825eaa1a86025486232cfa13c7ac4eeae7c977529b456a6f2"): true, - common.HexToHash("0x9979a5ad14dea37ed37325246a1345cbce9eff0860b5fcafec5a9c5c6f6651ce"): true, - common.HexToHash("0x35b059fa074a9fafd796ad2593a74de06cf53ef204680b64489fcbd9766a5ec2"): true, - common.HexToHash("0xf4c5a15fa7924e3f565ffe5da3f5106d709b376754d41d6b0b40a9cf9ac9ab3c"): true, - common.HexToHash("0xe0ad563b8befda71c153ef206ba49ab6e6d8d863f1fffb2e87ca1852d51314d4"): true, - common.HexToHash("0x2a415f2b25c37492096ba9267a675aa75ff0d082e6ee0d8e469da22005b69051"): true, - common.HexToHash("0xb96e615e29981750d2366c95275068524c49be289ea3147dd138d8d14783efe9"): true, - common.HexToHash("0xaf4effca5548f44a0cdb7c39d2883ca4005c2040f74526a82abf23aa59804514"): true, - common.HexToHash("0xc12fa15564b8dee4e979e08ce021cf387a8423c3bc7cc52d5c12316ad704fd62"): true, - common.HexToHash("0x802a5bfb2af254add4d36ca5dc975071a8e2a8df3c1bff81f9e6b03667b567d2"): true, - common.HexToHash("0xb7f1c1e8686392dfb74402b6ac3c0054f8bb42643f58b1efcb7c8dbe6f2034e1"): true, - common.HexToHash("0xfebf924cf06fba5f28ac3e51badef2696cb7c87b5592c7766410fb24cf10f6ae"): true, - common.HexToHash("0xc37073c4b7ed4610ccba321a72705ebde0d4376984e5035114f7bb8e30d85134"): true, - common.HexToHash("0x858e28a76bff36c89004926a89417619f67393ecd78111df8eb4897619e334bf"): true, - common.HexToHash("0x16a18b7f98a8a5ef288650ddd36bcb858b3972d28a700759fa46ee1ab96e5e4a"): true, - common.HexToHash("0x5ce6bff3ca5c11b39843f4945308ac4466cd710b2a9539b27edc811e44534377"): true, - common.HexToHash("0xe3d2ef44500c7355d8c728759ac6a3f233f42531ecfcb3060f911d643b363caa"): true, - common.HexToHash("0xeacd87e82d9befdd295f97cb324fac7957305e8583f00d8c94cc2ecb7602fdac"): true, - common.HexToHash("0x97d518180744404d6b811e664bf7035504181838275053d416aa64296078112e"): true, - common.HexToHash("0xfc953ff61f519f4ae9490dcc026dcab53f12976d3be8b78be801b059a19a6147"): true, - common.HexToHash("0x3137b603c4abc1f78fd792b118b7c4e8df2cf020a4e3b69cc585053edc77f15a"): true, - common.HexToHash("0x5ca1912a5c20ecb7f1bfe1587de518ac354d852a7e9aaf76c7a93d9614b69018"): true, - common.HexToHash("0xb9408583968b060f87b70ff980d40afffcd40d4f471a9464fcf2501ee74f59ee"): true, - common.HexToHash("0xb650740b6530d05a01f42a97063cf427b02dd994b6372cd73bc1c3aae032be5b"): true, - common.HexToHash("0xfcb0b8c897705b797bff68dc34afc9acf95f18b11f9c94f4cd785dfce168f1bb"): true, - common.HexToHash("0x216847040a1e3b768eeea13012d707fe7cb66ec9fbe15a2d2f18d36db5c86d1c"): true, - common.HexToHash("0x8afe4833e5eb53ccd5a16257a95d02b169a742e4c465742659a54ee53c4d9602"): true, - common.HexToHash("0x9eaeb93a95cb534a3cb20928894c10edb88ed3f84fc5fdc8ade224a926d6766f"): true, - common.HexToHash("0x927064b6af6988da3486b9b44d355f9d61859d9f555d5067b3a4c7cf7f3063ea"): true, - common.HexToHash("0xa76ab03935c45132e5281782e96f60df4e44302d55976605722ef76b76cbfc55"): true, - common.HexToHash("0x2a8e73fdf3fb6da37802cbb1438fdadbf10f7d9c8a5654f1ab344360b8dfb482"): true, - common.HexToHash("0x74ee4a9bc4092f818fb1e3cd3fdcedb86fc6e285e618afb1264f3ea5a0f07d0d"): true, - common.HexToHash("0xf3cb16cec501ac6240a62047b245d63d61fd75b9d5a1bf89b455309c181cf7ee"): true, - common.HexToHash("0xde8a04fc722af93237d082544575ad0ad6bfd87207b1d64f1ac8aa0748cc6515"): true, - common.HexToHash("0xb7fd635ce2fc12951fdbf9ef7145e7f0c2f9ad120bc14f5ef80b504d94c2153c"): true, - common.HexToHash("0x25ed12fca7b4857a448b518cc7412acb4947e94e95ba9fb7364aa5821d1a5cda"): true, - common.HexToHash("0x33e7ef3011c069b6ba4e76a58c7a0d2990394e58905e4d0d9d0f672c1934e8f2"): true, - common.HexToHash("0xc390796961f1c74ce2085a6be8c52535153a160f7bed270f984ec36b1cb4f97c"): true, - common.HexToHash("0x363c5d37e9a91c8665e71efdc71848fc75a12b9b375e2c4072b3114c5d69750e"): true, - common.HexToHash("0x8c799d64022065367034d8b83827b0d5af5d1ddfb4185932a82dd3997ae85f6d"): true, - common.HexToHash("0xfee75f0608dffbd9402d0620ef4e5ee0ffbbfe95197bba038e337a583f872761"): true, - common.HexToHash("0xc8a97e35ff70ed417865ea44434a6a2469c9ece81e077c73886485b202312a23"): true, - common.HexToHash("0xe432b36bbc57c0238f825351a523926235f7187406bfe69308fa4f8e10483b03"): true, - common.HexToHash("0x81e3cac6c4877df6163a1f7049151e51b3823abd26901837131b2f8d5a864948"): true, - common.HexToHash("0x1a4eae6997dcb6dfbe127300603f83bbe7c2fc71b892df9b6f8f8b988d144d70"): true, - common.HexToHash("0x6b68973e0200bafc5712c7bfea08ab22c304b1c9c0aa480ad2524b8298e53850"): true, - common.HexToHash("0x8ae57292e09826d93ca23501efbf1028c06cd3c88521e56b7dbfe36c9c6320ff"): true, - common.HexToHash("0xc99c38bfee2cdf818f110ecbe28c75801c688b5c68cb732f45400a2fa8c90abe"): true, - common.HexToHash("0xcc148843086560dac25661b10af3b7dd85f5db228d1fed7b6eee38e76bddafef"): true, - common.HexToHash("0x488b4a431b70242964c3ac0487d9c8b31306fd91501574a87c2bbb0838bee081"): true, - common.HexToHash("0xa2cb8a3750a690b35f98dfc81ad35c6439c39aa3a2745da04718eb9236ae75b4"): true, - common.HexToHash("0x5a73053d64b668596d0e77679b1e91d68a9ff2d8ec57a241b7943d2ab6667762"): true, - common.HexToHash("0xf644be1ce0fc375ffd1c06b11c4576bbe1b6edd195dea09de861a46d8933f78f"): true, - common.HexToHash("0x59bc46476dfaad03e45522cfd26c17f8dadae9d690ab0d42e99e8e2e22dd17a9"): true, - common.HexToHash("0x7b39ff95100765fb861f5411a95f33b06e6c157d86fbb6723f9d5c2e9d77837f"): true, - common.HexToHash("0x3bb978c8b8d8d1a742494536bedf35d8078753c7a9e06962faaac444ad82a72f"): true, - common.HexToHash("0x14f53a84f1201f07ae1cf1bb5709e1835e2956df692302b759d5b26b81326884"): true, - common.HexToHash("0x2d682fbe2a766689ad67d1b5bd86ca986f7cd82471a623d85bd4dc5fbcebeb4c"): true, - common.HexToHash("0xa50e6d8bbc4dcf3f1101d7f8ea0491805251656e787c5005d53232497fed26df"): true, - common.HexToHash("0xadc8c14381fb6764cc36d72e05733326cdc300400839382c903dfbd014f848ed"): true, - common.HexToHash("0x3c4df3c5208228609a35211ce357f7b1add77c730037ed9de15a4ea9c3b662cd"): true, - common.HexToHash("0xbbbab8954050839a95ed26430fa27c957a14bc7928508beb72d461af8a7f2a77"): true, - common.HexToHash("0xa5dc5d7b5da1592c04d09b34862ecd71c907784e26c9c1ac6fd3f6b6e64e604d"): true, - common.HexToHash("0x659377f3fe9185609d61527b4d8fca0a5187fe8ae9cc8fc76efadf28bb27c810"): true, - common.HexToHash("0x634467cdc08cdd0ba8e9c39600306f7537f207b1cdb0f187b18f66b22dbe7dbb"): true, - common.HexToHash("0x46de12cfcbc9566b4ed07dacfc7d63ebe46b88e60321d9f1afd2e532597c213b"): true, - common.HexToHash("0x6ee6c0cf2f4a9189bae0f995740ec2dffe0b78f8510906de81d0d78d0cf65dc3"): true, - common.HexToHash("0xa7ce77f8ea2d1e87412a8a6c77c1351ea3ea985a7a409a398425c6a4af765b14"): true, - common.HexToHash("0x2bc8f75e417d6bdd15776c543471dfef747ea64d7880d626dfaf97614e51f5c6"): true, - common.HexToHash("0xc9124af474d12ebd45e3765120a1bdaee23ef72ac3c1cf4aa533808c90d6a4a4"): true, - common.HexToHash("0xfcd2576ada71a722b646bfbd36ec2a3089b2989b978f95f22742daea60e0051f"): true, - common.HexToHash("0x43e42639b01dafc83feb3afcc275d37213875cf9ea6a1cb08c0a6811d5318c02"): true, - common.HexToHash("0xf71f2a2f0fb56cf53930663335295fdeee16fff3b0f814cce0bf4f55cbe731ab"): true, - common.HexToHash("0x4fbf841bfcc7c432c5dd92720423e9ad45f9bc8d53edcbde218c35969f9c6a3e"): true, - common.HexToHash("0xa280e7438852c1ef21ab971f65f04e7b6de6df11de6d57156a7828ef13449801"): true, - common.HexToHash("0x325d389a56306518091607cab0568ee86b4f6bc8e5b4bfda5cf96ae14397d2f3"): true, - common.HexToHash("0x8a13610ff577758a681b825404505981b229893606122d038befd0fdb89c320a"): true, - common.HexToHash("0x129ff72923e54f0b7fecef084fdc0445e19df89aaefd8c373080f9fc897d63cb"): true, - common.HexToHash("0xb0b6ac09d5349af38e4994434c9b5d90f2a8196c0ac2ccdd4638fc9d4cd8d89d"): true, - common.HexToHash("0xf6c48b89c54a213c9547d497d5d62a70efbafdd2f23c3c2f9c9712b167a68a21"): true, - common.HexToHash("0x0ce71c5cad6d5b6b61250a3e5b4fa15564339b19169431bcac6894e17c0163ec"): true, - common.HexToHash("0x06a9ce8d8fb01491d5f21d47aa16a5266379dfe1bf32801ab4dbed3652f76c7b"): true, - common.HexToHash("0x1d32b52a44e281f20936ed128a51f57222f3d0a4f0b586ccc6efd2f090142754"): true, - common.HexToHash("0x5b45916cd82a9d3069e200afdd413d137d50b7e60f0f81d4874a12fd9b073713"): true, - common.HexToHash("0xeb518a82e24999a3ed9a02ee6a44867e8f0425a835e50945506578bc35fc32f6"): true, - common.HexToHash("0xb7cb0a1bce6e60d3910ac5571b08ac7a2fd274030a12cf5365e6b389394fd4e1"): true, - common.HexToHash("0x138dd534ac5572ed5ad90ad788d797c89db647e5b42fcf19cc07086c7223bbd2"): true, - common.HexToHash("0x35578f729ef7cea3bce68d484fb4543b43f1039cfc6a10675e1f0919fe8c7566"): true, - common.HexToHash("0x516a6abdd29d8a8b3e89875b95510d2e74b9da206ed2a05a3ad199dd1858f3db"): true, - common.HexToHash("0xd20a19e5bd8f3b3eecc576c70b9ad60558997e34131c0639c84c16f42c403800"): true, - common.HexToHash("0xc6abd2fb13752e24b7656a6936ee325be82b0c89eed00a61888ebf1456679575"): true, - common.HexToHash("0xdaddbd52f9a9353af52fb720294328e45e679d63fe99f4b4583fba417108f18d"): true, - common.HexToHash("0x4a118aa331d24254b8a64effc427571928ae43b01f689c08ce43d7dcebbe91f0"): true, - common.HexToHash("0x5ea45a3ad7968871e09bea2955888e1f72f81d7754f380dc0d43054614ab82b2"): true, - common.HexToHash("0x29efa27ee0e25f7c4c3f208dac5126e6429d232d5dec56bf06514ee349ec482f"): true, - common.HexToHash("0xe27f08ce85e7e05f391fc8321a36020f109604c8a0bdefb911bd100c35fa31cc"): true, - common.HexToHash("0xe9e27755f41f831e79e98df0fba3bd0e8e1ae0fd8d92facd3ebea47925b281d2"): true, - common.HexToHash("0x753ab1058d6697536dc1fc80c8c1aea9a2e8b34122f5e823aefb40c71aa14f7f"): true, - common.HexToHash("0x928e89c7359130d8897a9450a04941f76e5f44efcfabbc5a92144516cbae9635"): true, - common.HexToHash("0x19886220df06b8395a53a177fc01bb718f6e8970debfcd694b5f009e2e864db7"): true, - common.HexToHash("0x07f4883dfcdbce9304b2a7cd2ec95fb3cc535013792673ed7c0afcdb1545b01f"): true, - common.HexToHash("0x87e1610a489a8b52da6fb2afa18f98932fe62be67b254a139d22115c080fcf52"): true, - common.HexToHash("0xfe8b27a254fb0dfb019095ef2ce5782b5e55c18023b5c9231a0182da64b4733c"): true, - common.HexToHash("0xa0419aa1375c38bd48dbe67f1871ab96fc057a71f837fab16f7d9844f8f729ba"): true, - common.HexToHash("0xfd0ac4cc2a2889a5516273daf4289d63cadd4081ad975fe45807eade625f6ea1"): true, - common.HexToHash("0x969ac6a28035029b861efac40ef43e934097542d4aa6459cb329c1aa8c268a41"): true, - common.HexToHash("0xd6caf3058a0e6d22ea3fae1ef8816bf3f482f84531f0cc4cb055cca9a996b079"): true, - common.HexToHash("0x4bb925d4eb20d8aa4d0a8b624cb15a4c248de7d5612630456adb12f07ad7fc3c"): true, - common.HexToHash("0xdc5e27165d58e6cea61d1d663384a0a046c6d9692ce7ae6a6a79abfad55c8fed"): true, - common.HexToHash("0xb754c417782863a02135021e1492e71a47fd930990daf0dd53acaed53ab957dc"): true, - common.HexToHash("0xda35c71aaa2749d60305bf3815175d18c05c560692a093d5b2f863a0c8059318"): true, - common.HexToHash("0xbdfd60da5ef5dd74aeae4d14d352c7a1b7d5c637c2204c8d286c2e52a5909566"): true, - common.HexToHash("0x634116eb21010cc3ede96f61cb430617120484e02d0d9d0207c07193cfa4cfe4"): true, - common.HexToHash("0xa51a0797bad821113b315693e4092be2aa8533a08e9a1bd8c6c1ea4c459639ed"): true, - common.HexToHash("0x9301dfc7c43ba66c302e9b02902a367732a04c8004a81684b41498417c542986"): true, - common.HexToHash("0xc73151c3149df1bf7ab7b2ed98a26853cc4ce6c6210577ed87e7561a10e6225d"): true, - common.HexToHash("0x1be6138a5234cc0d45806f3c64c1d8d65fb786ce7d5ac9d7cdd636b8e0bbf611"): true, - common.HexToHash("0xbdb450a6fc19819fcaeee5e41f21b75a872c81c224f48ea342effec27f4bed2d"): true, - common.HexToHash("0x0fbbf9d2222365d3aab74e898155ab57967de8fe21a09a300218903539512d59"): true, - common.HexToHash("0xb95660b55be62877d6ed498b7b1e3a86d1a26df51e00999f100312f39e527bae"): true, - common.HexToHash("0x8f61bfa3224ba75b10b64341be25db09d8f7adf447c1e64f25e51bd72244eac8"): true, - common.HexToHash("0x52c07aeea0aea5fa49c934ae092d6a117b26e34753367c9eed3f7d5213de3bfb"): true, - common.HexToHash("0x6f0a8ec333da34fe57cbb23f375b4e375779e603f7d48a6c9477f5d101532a09"): true, - common.HexToHash("0xc5f2f29a5c9cba2ce1c7785d0c2a48ddaa1624dbc4d2fa2d903657218e24f32a"): true, - common.HexToHash("0x44a6d077d6ddfeb1c884b68de4d5080a7e5826fdbc7d0963075d39d65e0db73d"): true, - common.HexToHash("0xced5fefcf30e6f9b6a64d52684b6163a82d5e44b76af6580b81cdfe703bcf020"): true, - common.HexToHash("0xcc77c8ef3989e3c1afb1c519e68361988fd2bf40621dd732e23a95e4e87dfd87"): true, - common.HexToHash("0x142ed43e9eb9af4eff8a2d099bb0fc4f071fb5dac35861190e423431de00d57e"): true, - common.HexToHash("0x3186dde55b2280cf339e509fae5782dfb15a094053132e54af0db865c8b6312d"): true, - common.HexToHash("0x38df54e167b3a14fff6da7b1a944b4545c609741cc54122d7eafa0cc797b2a08"): true, - common.HexToHash("0xc729adf566932b7383a5aefee109681e03367ef0a854a4a7c7687c57e7b42c41"): true, - common.HexToHash("0xd957da451e13d85b2fcc4a31eeda9d8acdb2e667c6a28514d69744395d9c5ebc"): true, - common.HexToHash("0x6a3b58a3280a321677ce4da349c6691d8129f6932207667edcbfad911345cc60"): true, - common.HexToHash("0x9f2dda7911401a66ab4119495c931a471ceec4b7d5013efd9eb51f62cdc04bea"): true, - common.HexToHash("0x0d6837aa1e7ca02c395dcc9386bf1c66d7a2a6439d8135bf9e5f89006096271f"): true, - common.HexToHash("0x3a84fec98f27ec80175dff3c73ea33b5ec9bfa4d9a20f15cb72c0a79a2218a77"): true, - common.HexToHash("0x6080dc4c3ac9d227150fc0cf094b40b7a5393ab7c258880b93f6103acea51df5"): true, - common.HexToHash("0x160ac263637a6a346dc84245368b5ac5b5d3bc5621b8839b4d004b153f429d72"): true, - common.HexToHash("0x9a2d6c37c095eaf96e1b96b6020d7dd192c1365d8139ce1b8570636a8c1b43ba"): true, - common.HexToHash("0xa7717780dd0d3dcf51b5ac99b083d71058ddf6ea63e7f10a1886d8f20b1a9111"): true, - common.HexToHash("0x56aace619e32ac0fab4c02584ce18f36931056c0d912bedf4559150114c04d17"): true, - common.HexToHash("0x6766617e6f147aa2e12ad87e6c0d1bcb3e190e3e42ebdbc2b7e870a923ce7b9d"): true, - common.HexToHash("0x772457dce5d64c3ada972a8c564abb451f9b35889a5dfcee358fc6210209ea5b"): true, - common.HexToHash("0xdb55501d70565fc2ae665c69c061bae07d3578467f760b69bb5bd26af6b58701"): true, - common.HexToHash("0x098ffac8f01d98b1f17bdfb56c1c00e07d0d208ea58978025f39f810df3f1849"): true, - common.HexToHash("0x8ed3c47b378926bff871531baefc1c29fbbcde505e113505333aa36a509d24e1"): true, - common.HexToHash("0x4dbaa0b3b11ce7cb87d5155ca87d47103a79b0e90f12cdf08facc1e2f5118584"): true, - common.HexToHash("0x0e8c8bb18982c04ef518f57a1c2d56fce7ca7b72c1af2971e07b6717a844c105"): true, - common.HexToHash("0x251b1092146a96e3192901b3f8079e306b089c70802eb7d8f65b97335a6f8d54"): true, - common.HexToHash("0x9a9c41c8032a6b2e77e25894782f219bffec67d2d6db850dfa413489b3560cb2"): true, - common.HexToHash("0x8013550509d610d2130fb269de7563e334588ca87285ff1d4780620dd848a919"): true, - common.HexToHash("0x204dab3c63325e5e2f7f25a457faaf6de5227be6714cc984a11507612f5e233e"): true, - common.HexToHash("0x75c9fc829c23f30c28086c28aa751c364905e6647ff5ec4fdbba95669781ef7c"): true, - common.HexToHash("0x792ea8f37b715e2f2090ed32bd8c940e0976bbeca65ea6641345b3b7ff380c0d"): true, - common.HexToHash("0x855d097289f1736d9fc337778c567d7109cee40e4c24043d9f828c69cd2267ec"): true, - common.HexToHash("0xa454cff96b5e4ca57b0f9da6842505083146014a431c617e711ee83704ffc99c"): true, - common.HexToHash("0x4b29339ae4164ab744021952b329426810fd2c38b0d0d0b708065f58aa46f92e"): true, - common.HexToHash("0x967af9acec4879676be3142154c161d6088278139ddf046f3003963cbc718f87"): true, - common.HexToHash("0x24649d158f6146e1514f4ec9273858f271261f14d620f38c6b14701d4328aa11"): true, - common.HexToHash("0xf77b4c3a9a10046fc23b8bfda3a1e50f67c0e73ea4be7997f49e847249dfe41c"): true, - common.HexToHash("0xd12095ebdd673b4fce9e64f43291dd193c4794557ed0b254c438c5878af0f779"): true, - common.HexToHash("0x8d184f6c6e4d64052a61de20281a56bed3a9ab999f2fe3a105193a96a9e111b2"): true, - common.HexToHash("0xec29a74a3c1d448e99b6c21e0eebe4a4f89b0b924fe948c09975588174f56e9f"): true, - common.HexToHash("0xb8a9f4f9ec5e178f1a8ccc6fd064846502ee1293db19393158da88f326e542de"): true, - common.HexToHash("0x88a3e14b5443b8da825bed6c041f6dc1077c317308dbd380817c77b61f6d0a72"): true, - common.HexToHash("0x8774d7166058105c25e74e09fd3a4dc29fed33c3ad22d2c00b64791c5a46b827"): true, - common.HexToHash("0x6fcc8a85e1ef5fbd03258fd05125a35ff815e11089e2f7ac8a4a206c01885d7c"): true, - common.HexToHash("0x0092778fe421eeedfe95af8301f2d6f17e3724f4c196376de1d662978d02dae9"): true, - common.HexToHash("0xaebc0e0251edf2826308876cbf84a66fce4e25744d0d8ceb212551ff1e3d4885"): true, - common.HexToHash("0x04536aa81f688774be52a295ffda0267d7cbbe1d717a330bd61670f0b2d7e0e5"): true, - common.HexToHash("0xf2727c1ac965a86566ae4b71c4a5b16fab7e13a2a9720e89a7ca6437b246d17e"): true, - common.HexToHash("0x086dc5643163b3043ba64ad71fffe093231b861b4029221a6c4944eb7d4b18aa"): true, - common.HexToHash("0x6c23c40e492d82f87b18dcbe5104e4be02c9274e527e2cad59a3fcaaa05be775"): true, - common.HexToHash("0x5d6281e13b92e67c31ff0d35fca5eba8d7eee8c3d813f857dcfda7031f9656a6"): true, - common.HexToHash("0xb7bea42b49ac6401a8837c21e86d941345dd2fbb79aca881d6f38e681aa5dab4"): true, - common.HexToHash("0x267c2ab4dd2dc8c82bd248a41c08545c44d0e3f0234e25beb5e895d06dc576c5"): true, - common.HexToHash("0x0c554c3d6a3e5e7bf349db0132790ec9b131b8788ac00cd506bb1908a1e614e1"): true, - common.HexToHash("0x75b0dd11f6dbed9385b4c1d8386a22c753c4912c6badbca7ec5c4c50014fe0a4"): true, - common.HexToHash("0xc4d8e480678d97a43cb70efbdf658a9e88ae2366be048aa2c5c749239e0c2ce0"): true, - common.HexToHash("0xac692b514b7f101855e3b37be141789b031ae21fab80412c71a9a13e95cccbb8"): true, - common.HexToHash("0xed2f57ae2455c48502afbd4244f41c7f8c84f490be28250f2861d536234fa786"): true, - common.HexToHash("0xb4ea26c13ce080d7bcb888c8fce350cbefaf4ccc0a3c7577dc126519f445e394"): true, - common.HexToHash("0x894bd041da9375b2f68b51d06fdf5a1b04dcd7b82c98aa125338e80f6e6bf46e"): true, - common.HexToHash("0x20d3e6c0710ec15425255ffb22aaa9487af3632ee07a8979616ce641d62026c2"): true, - common.HexToHash("0xdfb03d66953eeed5e223e49054018420904109b74f7e1391729687483838d3ba"): true, - common.HexToHash("0x089d7bddb059b7642878f8d2e5286830214fe9329fe0c20d4863a697cf7ae67b"): true, - common.HexToHash("0x0b499287a7d1ea88d91d4a6df3e71109ae601cfa06816fb927770a7df5c945af"): true, - common.HexToHash("0xea1e828a4cc42d05f2ef63cbd7e80bca9f2ae4ccdb890046582e283313009f2d"): true, - common.HexToHash("0x822b9a46a43a7b3ec56135ce4ff5c726b461b101a3b7742f5c041527bc501216"): true, - common.HexToHash("0x89f44c188f71cdab314e247138e5c6dce00cc9c1febe41f94342e84d29a33989"): true, - common.HexToHash("0x75e058cf33d4e1b946c9376b0389d9dac79ba19e5857707b8af92dfe02e94d61"): true, - common.HexToHash("0x6eec1b675b0dec8f34f903e597e8bedf73723aaf51ab9cc19971f6ad4971a276"): true, - common.HexToHash("0xec9999dfe3829e28e94646ac679d9be878d5f6a17f19c5f9ac3c5126c9836436"): true, - common.HexToHash("0x1208b85bc0ce19c4a16a0e12f876a9e254e242340a7b7d61de53608c2e403bec"): true, - common.HexToHash("0xae26b38de5f5f180f6a5284f8ee10edde1cd180a479c916acf12d7184b25060e"): true, - common.HexToHash("0x4ba8c91d86e1e9b9b411b25f6618935dcfcc42312455c5e84cdbec99f30d89b9"): true, - common.HexToHash("0x50a34be5a1e0798645d016801510704edd6ad925999ce64faeaacbf02446fa00"): true, - common.HexToHash("0x923763d088e21348c5c024dfeef8afef8a9940a274fa0626671af913bd740903"): true, - common.HexToHash("0x77baba5d6097f24d78529704d2657ab064b587364a7a0c6934f67adfbc02a050"): true, - common.HexToHash("0x3225fc440f4dd276aff94adff01073418491ec92b5b70265cac8b66c16239ca8"): true, - common.HexToHash("0xc62c42fac3ad711ac046b44ad2659d4de7492b940992b8ef9540c74dd6c03269"): true, - common.HexToHash("0x144932d1716e62c1450298713102d7c3b882a390072de9c715e381f9e8d0ea15"): true, - common.HexToHash("0x8047330554ad89e58053cec83ab639076b69d01af9056e21bc8cd431a3bf3b56"): true, - common.HexToHash("0xfa88bcade9749c84b95c0b6a6665039d79417cecbf7c6f29503c0f26ddb10336"): true, - common.HexToHash("0x3c19c9f8f332bdb251e145fc21602a70b9a8aad993206b26abcfe76bdd9f9ff4"): true, - common.HexToHash("0x297e9384f657b4cceb7b011b241d4d895ca3547373eda962613808bce1253c6b"): true, - common.HexToHash("0xb712be3cab11d3609fbeb9a8ff5956d2a6425385674e1aa770ce55f855cd8907"): true, - common.HexToHash("0xe97fb84fcd7db4bfbfe84f1b84242fbbd0123b0058277fbd446e856d12458dda"): true, - common.HexToHash("0x88232de24380fa4fa96375a5150b37c332b89e515a4831d200574eabd00fa295"): true, - common.HexToHash("0x2f618c2c7ab31a8a450598d317da1f927813b4065de15802de7ce135d61aad6c"): true, - common.HexToHash("0x4012ef719db4bb881e0f9f522a390096e50205ca9e7fe6e22e58d41c10b97dc5"): true, - common.HexToHash("0x470f4c13e3f31b73b3761f95aefb1db2c30c721276065036e91556ba1c27d84d"): true, - common.HexToHash("0xb75ef4f549193e55055421870f1361bf48e87833543f83fc1a9042f4555ee6c9"): true, - common.HexToHash("0x1b3e7b6870de47e7fca76ad3d145bfe6cbc10d5e4a37200654a7c303c19f950e"): true, - common.HexToHash("0x1516d4b8b7d02ff4201a169dd05e37fc13793479b82ef03a461f16e3b3dd78f5"): true, - common.HexToHash("0xf432b74e961541e204c19a6c1cc837ef37d38509a49eb7aee7fff1388e7aaf35"): true, - common.HexToHash("0x49e62d32d358d684651a957874b8df85dc1f25be5b3a3a7418e772ef2a65e4ce"): true, - common.HexToHash("0xe6357a557ca864bbd07142f970b58d21d1c023b55504f94a51435f456f373f90"): true, - common.HexToHash("0x94e4bf676b03a1c8421dc35f866e2aa09882529d72e08f35c0d505616701ed5b"): true, - common.HexToHash("0x83735216e48a797a05b9fe73c075cf861cec3bb8e347a571f8f77a91ded13e8c"): true, - common.HexToHash("0x79675e8d5b3c906f9a4c93826104de138212621eeedd6c0792bf154009d05b20"): true, - common.HexToHash("0xf5d08c624572f59fef9a1f9b9e5fdcf6a8840a1ab112c383df4458a3dde2132e"): true, - common.HexToHash("0xe9b7087cb8df4a8394e365b9eba3866c6f7d9b50bf2bc065af8fc2566fd096e8"): true, - common.HexToHash("0x9a2e097a12c2f48344d28c6012f8137ac7a8c23e885a092abe918b9299447b43"): true, - common.HexToHash("0xad957cf904cd1affda9d2b4cbb03efbe5fbb87c35a01e98c9c78a676efc7473e"): true, - common.HexToHash("0x16044adc447999f6602c93c1f969b7ad88cddac232a015355f7c66ae364fd18b"): true, - common.HexToHash("0xcc0d026574cc1e0d00b53afe60d521753ab9ada10d4b2aca11a7035079d0b68e"): true, - common.HexToHash("0xe523ee477b815e6ee4e68d5e0b7c2058749934ee48d7e769e959850fffe82b38"): true, - common.HexToHash("0x6a154f1d92fe1c85ef95c4e75ce2161ad32bb3bb091fb1a96a1e4220a0fc5387"): true, - common.HexToHash("0x0ecc5d35c9ed216cebf12afa5b344556504ac4a0b5a225d752f871bda7d1f8db"): true, - common.HexToHash("0xb0b73ad0123b79c18888baa91a180e2bcb20ca3af378be1a59715705464ea5ad"): true, - common.HexToHash("0xd6afee1b47897459fff119943bf0992c57d62ab0404295722ec7e46fc01fff75"): true, - common.HexToHash("0xaabcbf1db68018ef7e4516fb7db895b461e5028e86e1e9bd24f33c62861576d6"): true, - common.HexToHash("0x8b695331bc1fa30639323016b72a51b03f81061dad1bbeb7d30827f9087eb16c"): true, - common.HexToHash("0x17a65cfe44c35561fc463a8d14fb5a584cdaad8078cd9f9083d5cfc394feb49c"): true, - common.HexToHash("0xca8c4c00996bf053f67fc8fec0f6efd023511f93503423473bddf11604983e3c"): true, - common.HexToHash("0x2babcee2073c5bef8e8d72b39aea407823ac702d047572306be02ac9d992add4"): true, - common.HexToHash("0x95c00410786b5097a94761e8c9634577283bbec3e39ef399ba4634fd805caa65"): true, - common.HexToHash("0xd46446024b61be03d595da2fc99cafd99d0eabbb380240a5d4fbec0d9b07bad0"): true, - common.HexToHash("0x14db9ea4ab585d0d3d6b8fbf5e6d3d7b7409e43a5f3546a7a6aacf61785d7e02"): true, - common.HexToHash("0x9d9bd36b98757200ab6f7c911c66ffb306e690e155a20aa911c22c67055afe0a"): true, - common.HexToHash("0x533b7dbe9a405181d5231ae39a494e50c3050dbab27a52db6572ba78b6913e9b"): true, - common.HexToHash("0x5da2dec14436dd2f252dce90a49c97bada98bbdf24f7871700434945cb73bb47"): true, - common.HexToHash("0x3672d5a879fa40a174c01390296e48af5335ff56b3cecfba05ea95a3874f6a9c"): true, - common.HexToHash("0xac7058c047028d875fdd1f2be114c8cf20c0cf5000f699b5fc254ee16c820953"): true, - common.HexToHash("0x5339881d3663c916f2bf2e7ce3603044d16ef917fd4e9c449ce9634947619042"): true, - common.HexToHash("0x83012d45246de55d6a9efa07621fd966758f4db306a6ca7a48aa4d6c332df321"): true, - common.HexToHash("0x5f10874d3ab4e81e0b9bfc1332294277a99364091384f24e8a40fc0374e9557c"): true, - common.HexToHash("0x19b246e8a4ae72ae7a8e5c8e8b33dcdae49364b421acfe6d7b332b53f6ae6f87"): true, - common.HexToHash("0x3f1bfa70334fa2eebe50ba6e44d245aa3038e3c4c07dffba06d3b956524ccc99"): true, - common.HexToHash("0x32e976cd5591755930246d322acf0a78ce6f5cee2fc25c13851c0cc2a75cf7ac"): true, - common.HexToHash("0x3cbd0dbc4e773b6eb47732967836da0de35a9ffb25486430f44be6825b5d5d97"): true, - common.HexToHash("0xdcea96ce0ea59bf9be13c67cfb6cbacaad548360b0efd29d69291df44ba0870e"): true, - common.HexToHash("0x235fc84e74b3e6471a6eaf163c79bdccc4698cc9f30f1eab23e83b70dbf435f4"): true, - common.HexToHash("0x721c91969c935b101b72e2e4d0c29135239fd4211acd51e5fb928b84f943b22f"): true, - common.HexToHash("0x9ff8700fb4479147ec6103d7b3934783089eecf5ba51b47590649af2c1668b9c"): true, - common.HexToHash("0x2eaf090b4529d7c810a0cc1bee34332a56b3448155c995f0ef4add25d0f7e54d"): true, - common.HexToHash("0x45a4b48c2e9841c8de7eb2e41b434d73552e33b5fe55ccc657eed1200c9ecc69"): true, - common.HexToHash("0x1810749c44869c326636892446a2d14b3289e37baa425696c3b4e4843fc84400"): true, - common.HexToHash("0x4bb54fc92b95ff9cf63998e6c59c824ca6aaec1db72e3ac4ed40ce905dd298a1"): true, - common.HexToHash("0x737e3be8aea49d7bb01b8fb53bf3b6bf04985936891fb9d8abb16b62d3fb1ed3"): true, - common.HexToHash("0xe224d29929657fe92ce8c2e577d1aecd7e29a2c18c64a3763d9106186183e78b"): true, - common.HexToHash("0x148e3755706a77fcc6eb6f7621ca1b2814ad3078ad77af2a3791bf0c539d34b3"): true, - common.HexToHash("0x42f1f5c5658757dd22dc2112ad602b148a9c1d42a0b21fd3ae315989919e1d4d"): true, - common.HexToHash("0xa861896376a658493716e4e532441c529e68ac425feede0da22c154af7facae7"): true, - common.HexToHash("0xb461321da2136b49a1a79034ac2eab30f1089709e4356b9502f12b697617ab88"): true, - common.HexToHash("0x245b9d1bfd49afb65f22f8cca10ea1f180d46f51f7600562c6639d7bc064b214"): true, - common.HexToHash("0x4d4631fa72f5a12943769f4b1c91654a931ebbce6c4b3dd8f259b92d0b420ad6"): true, - common.HexToHash("0x9b021967a8f640bcdf673c131aa69375f239a11f5b453fb21bd0336baccc9abb"): true, - common.HexToHash("0x94bb9371c38ea4fb0d9c90281e0ceea74b916e3f391879d41c7fb1c313a11f9b"): true, - common.HexToHash("0xe71a1b3501a2d1a1659722893beb07a0a2e8286ce2505b3292d1dea6f74d567c"): true, - common.HexToHash("0xefc27700b89e419d3806879990f25ad4cffbbdffa6b116622e2245b31a90913d"): true, - common.HexToHash("0x9aed389ae4385eb1367f3e8db9491ca8efb826f7bf7846ac6520b6579b0d5658"): true, - common.HexToHash("0xb18c44e04a6bb7988562b28ae813c841d7fd3f836a7db589af0fa5b273f554d1"): true, - common.HexToHash("0xdebf52d2ccf9efbc507986c6d94c07336de38680e3e751fe1df13b628ed10470"): true, - common.HexToHash("0x972e2a5118068a4aedb23869bd40c18aae70b9119f81fcbfcd932cdc3c5288bb"): true, - common.HexToHash("0xf27c3e3fdf116088fc9ea113216ee35dc732fa95ca3b47cb67abd2e578f94f0e"): true, - common.HexToHash("0xaa72a21ec295f04a2f5872a96caf39583503649a35e52e1865a4279facd9f5a6"): true, - common.HexToHash("0x09c70010a500a30a51ecb470382d953a17432728e05e0ae65e57cbe85f260cd7"): true, - common.HexToHash("0xd11a46f74ccf7e5d81663afa16a67ef910cba648fb53385a5491e760b7200e81"): true, - common.HexToHash("0xae57abd17efa824e4ef0b54eae586e1f3ac7ae2dbecd76b0d3a81fe39906e8c0"): true, - common.HexToHash("0x6e58e3b2dd0e657f570474794cbe0c587ee4bcee166fb4d9f97ceffd21a2767a"): true, - common.HexToHash("0x64b361231642c7e488ca287f93c4588c10aaae14990dc055a055314600ebfa8d"): true, - common.HexToHash("0xbb9d0f577e95a788549506dd691151213014b2600a1ce3d0a14da1ff88ca0e61"): true, - common.HexToHash("0x7cc538b0f6e977a095e18874a6e03a7e574f684626103d1cf0ea86cb1fd57354"): true, - common.HexToHash("0x4406653cca985b2a535c58e1e28298bf4d6ca279d64916752c1863689c9072eb"): true, - common.HexToHash("0xdda6bf02d38e91c49434de434447ba0b0ecf12eb4528d7290c033ef3346cc67f"): true, - common.HexToHash("0xc8f5973f5e643dafbfab857337ba052e121d1fecc67c6bec3fce409d22ed1901"): true, - common.HexToHash("0x4baf62623dd54fe2221294f5d990aea45d10d6c54f06b154c2adeeea3285326d"): true, - common.HexToHash("0x4555fd3fb3292fe3e08969765d5670fecaa3de0b4e4ad5bb47bff1dcba192755"): true, - common.HexToHash("0x7f7e559b9f0a1a971886940b3587826da4dc9afa76b993d32585437e84d198c7"): true, - common.HexToHash("0x115740075b0aeeccb3b7539436c85a758267e55a48ea53bd7dbb71bda730b414"): true, - common.HexToHash("0xea37c68d79fd717259b2963706b2d8e69107119a247cfb4c509200fb0f302758"): true, - common.HexToHash("0xd3dbee2d8100ef87b73b51eab37f5adb895f4370571946f6a4b20203832aced9"): true, - common.HexToHash("0x4d776029780bee92eb27d8ade285fa420e8133e9bf4c8fc525cea64161f24b0f"): true, - common.HexToHash("0x0e7354593e57c1776295aca0130166d93fca3a3e1cb23ba05c4b6daf01ea2f21"): true, - common.HexToHash("0xcac0ce65936f5d3544bd2bac5a5dea293824f540d280c71acf319d122b25d0d0"): true, - common.HexToHash("0xf820f348c9ddb20fb1d9515ac5fdfa4132f963dfaa36deb82da6f6b48f67cc2c"): true, - common.HexToHash("0x1981a3f4108a60e3a0ceb8e2ff06512203a96498538dabae79306f9411426331"): true, - common.HexToHash("0x4ca30870f2754c7ffca2ba8395f67afed59bb0577f05d5b81f36132d82cdb8c0"): true, - common.HexToHash("0x075e00e23c8de423e9dd6f72d045d447f7a48b236e34cb5cfc237c4690616d01"): true, - common.HexToHash("0xa1a6fad70559a721161ee4ea71373f73559fd4c77e27d8a8a9bf43d6ee1c74d3"): true, - common.HexToHash("0x265c50d96ab68cbcbe3c53f27ec26567102f404808d6ad8bd4c9307f75842060"): true, - common.HexToHash("0x6416eec9979bbfc447e2b05ef8a4b89e330d5e7132e6de90cd85b63ed37a560b"): true, - common.HexToHash("0x8d2d65dc9819e085c5c3825250311e0d509538364b71d08de31e564b2ac4cf23"): true, - common.HexToHash("0xbe83e5d234a32228eb4d002da2e7d63f4c4cb1a9d1b132301ee5f6ba581c18da"): true, - common.HexToHash("0xa443e5ae1bc3d100c53b21315b04a6dbc0575759cfbb6598541fdcfb105f4bf1"): true, - common.HexToHash("0x3a1f0147840e998c3c377560ba590e6c7f97d35473de4e0f3991a182baa23756"): true, - common.HexToHash("0x1735f067a02c16d3da09adc64a50bdabce3fcd245b9cbc930fb5d44a8637e5ca"): true, - common.HexToHash("0x8f23f004bd21e59d7b61b96ab7c38ef08907a1550536030a91e2e66d007ecaf6"): true, - common.HexToHash("0xecfaf3816c8c9d4df53705aba5ab604b63ff58329a0c8045020a8891e5c31f61"): true, - common.HexToHash("0x7f2fb650782272ee8f3bf14686fbf1628d996a8c2ccad693f637055a60dc4cc5"): true, - common.HexToHash("0x4fe03eb0ea5bb14aed06f7b3e84b3dc8bc928322c68cc5368df69bae07c28915"): true, - common.HexToHash("0x1d21a249cd3dc6fc7daad7c6a76701d74b288ba39127201b98dea889411e81c6"): true, - common.HexToHash("0xcff2b696296993c42f20259ad4e5f3cb34f5f0d4c8e9da6eb4faef553387879f"): true, - common.HexToHash("0x523f02ca286f1a09bfa3dd1080b3545ec726e2e5d1142f5ec0409a996cff47ee"): true, - common.HexToHash("0xc3c6c8f5b2c5588986f1603110bb9664a7fcf3f0765d842dd0f811385f584206"): true, - common.HexToHash("0x918afd8654bee4d971ef8462bebdb88038d20884769b9eb579ac22a83a7bb182"): true, - common.HexToHash("0x81f260ac25a3f8833975f94948aa0e236e8e45a690ef732146f611bba302b72b"): true, - common.HexToHash("0xb8b95255188054819c1285729546eb42aab549c4d87f6936bc9f20ff2b804bee"): true, - common.HexToHash("0x1cc2e5f06a03d879d11a3f1a1eea4c3641ca4613a66c174b7af499adb58383f6"): true, - common.HexToHash("0x69bd97961af6169e8e661fa565274b40a31a3fe22a33d03da75df76146d02285"): true, - common.HexToHash("0xe7605356c21effbf89a3ec4b57bb8a604729981f4be690ec82ed0c81ef9568fa"): true, - common.HexToHash("0xcbe1312e18ea87bdef7f64578bcb2ff0780729298167de10202d7842f479ff55"): true, - common.HexToHash("0x9f4c05a5efde94a745f4e0dd8df3707b985ac691cef716831828571c3193718e"): true, - common.HexToHash("0xc45e7d1c98fb410754e135dba05cbf0c88721349ba6ec52293a33293de0cad05"): true, - common.HexToHash("0x4cdfb6da0710d42a923b38ae8bd2e12a798f91345af8e98f6233ae953c44edce"): true, - common.HexToHash("0x06ed6af0cc8b99e926c52146d38ec6b085f641250c6dd477f0f7d4b9047c9dda"): true, - common.HexToHash("0x453eb64a827888152483d53f39af27147483412af3653814b07079149ba7877c"): true, - common.HexToHash("0x362ffbb689541a8dbc0952537f41582e2bcad89d31149f69a40823f34c101fec"): true, - common.HexToHash("0x53c8da3f8918cb10e98cf5977eb723a48044fe171269a80eed892e3856da376a"): true, - common.HexToHash("0xbde8576af087361819e0b0c1ce934791c77ec89390596e683e7f971280fa26e1"): true, - common.HexToHash("0x510f40c82c93b18e96935fb2c55798506579d6f587d1b10ed3b2e0f16baf6789"): true, - common.HexToHash("0x82c655a68878d94c49daddcbead50e5fcb729ee400e3859f232120e6dde2269d"): true, - common.HexToHash("0x09f74ce68e8039fa66d48a87faf18bcbf8b78b5b26caf550b1f3b5b50e14f9b6"): true, - common.HexToHash("0x37ffcfc27f6d753d2481e17f41fd182147505c9a58576971123786f65cef04d8"): true, - common.HexToHash("0xc2e66b0b243db41e88c58d7559b0174fe9c77f741621b7e8f34b6318f9af61b2"): true, - common.HexToHash("0xabfa5428d6d5d585b965362005bbd75594146f82b0a8df08b8db8436089695eb"): true, - common.HexToHash("0x092a8e5e03f15e949f721b043607ab2cf97a9bc8cbf2631360414a3d091594d2"): true, - common.HexToHash("0x4a27e79d5bfbaecb7014f5a13ed087f7fb2e3b30513d32a83cd27c5002e9c684"): true, - common.HexToHash("0xb7feac35b09ad8347386617c51f539e105358b8da1e56170f5ef311125eddfde"): true, - common.HexToHash("0xd81cf85a34147ee89ace37a76d6ff457f15c6ac1b4f0ea3895818a26c62b13ba"): true, - common.HexToHash("0xc877757e8fc392c0b72b7a649431c5388bad61e510e885ed81c11ab86c8c67d7"): true, - common.HexToHash("0xb27f4cdead4a4e4ca8791aa9499968e35d1da78b3000d3e062aedeb79fc6e42b"): true, - common.HexToHash("0x4ad42a9d57e7344b6686c804854b8400a40d3cfe42736d60c86d62ed10812614"): true, - common.HexToHash("0x65565970637642499fe9cf12b263db0585e78b56e18541760b5b9c058325d4c7"): true, - common.HexToHash("0xe5c3b61cc4097e2ba827d96ef99a94fa7c2d07af3fe22a77d21e82e1e1bb82de"): true, - common.HexToHash("0xb1d3887eaf6fb75a5fab527c278e8d8320b142cebb456186a1addcfa738748ae"): true, - common.HexToHash("0xf6cb6062f99d0e0153971c0f1e47bdf23cfcac007cbb1458db7d11e12b1ebafd"): true, - common.HexToHash("0xb3d75b794db28ca255f3d0fa3bce0c3cd2987746e4d49672f8455bb09d76290b"): true, - common.HexToHash("0x84ad83cce220c084ebc26b7dea8a824647b307ebd79276b145fadfb6c8ceb81f"): true, - common.HexToHash("0xa9f52cd9368aefc06160a26e5a761d653343c2b0434f236d316f682a705fb379"): true, - common.HexToHash("0xfca2843ffe811c626154ee8a9cd494c66589957371ce3eb6387ae9831e9aecaa"): true, - common.HexToHash("0x992ece33ab4e26db4782cddd53a5d48ee654f9cd39b057c64a516735a8165a56"): true, - common.HexToHash("0x2850bd587dd0267f0f590baece7bb89425b612537d724470339a8a5484eb4c28"): true, - common.HexToHash("0xf884b0fdce549490e50b531aa31c58bd0a2e1b3322fe3c13e8d38bedb7825733"): true, - common.HexToHash("0x270573077dcf1f7bc1e155823818c21d86697a0360d493b52e84dd67a1ef7cd9"): true, - common.HexToHash("0x7bcf47b0cb058512b40b69302b4d3b9f615cd28e6792172e0c09d918604b8a81"): true, - common.HexToHash("0x9361eaeef2b0bfe1764a7399cefaa1ee82c39da52cb9235162a6f5251afc59a2"): true, - common.HexToHash("0xf2c0ab72559bc38fdd21503784ed29bc851f124d2d7d1c225b757faefb037e76"): true, - common.HexToHash("0x41f76522173d9986a4c686cd795e9ed6a82723f154340373ba8679421c3754bd"): true, - common.HexToHash("0x4c3fe471e005366923c51c5d1063aebfe56beee5a0475fee84808a18fb61e88e"): true, - common.HexToHash("0xbc9bd2c7dcea7c0ae9584681664b8f9a0420aaffc6ad9817022acb8ed0179c9b"): true, - common.HexToHash("0x7944729f1f20e41855f23eb7b63ba878ac1ce8c3ee24d589a6a3edbb106aed79"): true, - common.HexToHash("0xae198f2277192dd24543ff26570d55a41d664066a40d000e96af8da2e3bc4fc7"): true, - common.HexToHash("0x6b0af8cc89c3068384f5bba5b7c60c234b9df8992ef973c61adadd2e24d1b4dd"): true, - common.HexToHash("0x85a112167a77c1908e82d94f9792c15bbfac625cffd088ecaf36bc17b3f7f5a5"): true, - common.HexToHash("0xcfe3ff0bce996d3a28cb310fc6eb2f2c568af54d1174dedc95996b663625254b"): true, - common.HexToHash("0xb3d06844c6daa8e63b86bd6bd30a36cc55ba5f579c2f28c22b5884a644eea858"): true, - common.HexToHash("0xc39b86ffe66888b8cc388fc7e197d75e18cd276bbcc613d15c1b8346bbbfe875"): true, - common.HexToHash("0x7489a750c9f208a1237a2308b453f16a21f3d1b54181e4bbff1fba6a87fc682d"): true, - common.HexToHash("0x0d98a6ff5da19c7ba25dc7cc014b329f97599376f9196b79134e73bc7b5e0a63"): true, - common.HexToHash("0x43e29ad0a418107cb9cd9cc7b914897f20bb0a5ca19eae10d1e4d0d279359ab5"): true, - common.HexToHash("0x8f70373a17ff4326c1d2b3d03a40f73288f006371369dd7edbd123dd4ccbd166"): true, - common.HexToHash("0x85e0d5cea38bef2b5495f617e890800cfee2ca1b14df1eeba1bb741079dcafd1"): true, - common.HexToHash("0x389bf45d5b694a9035f16b17ff34761126a5256fb8a29968612ee897cf9e4495"): true, - common.HexToHash("0x91b2514c0e48c6942b45ae8a8f986afefef3f23a5b04ba9a183a037be524cb7a"): true, - common.HexToHash("0x1c17fb3ff564e81dfa76928236415395c5ca377eee3bdae1f4e0af00d5b9b45e"): true, - common.HexToHash("0xb1097ec490bc20d6425b524f7a45f882df8fc757e2ec06a8bf3d73b0ee70e9d1"): true, - common.HexToHash("0x1ec08b8dbb120a5c950af39565c0dceec6bcf36cd1d4ab509356bb48ac6ef24c"): true, - common.HexToHash("0x7a74a58b5f37e917ae71ceb06a9d60d0ebd8e268de04f4e6e4dc9c733dc0bbb6"): true, - common.HexToHash("0xa8047bed8ec55762a40ba56343868f4ad760208c11e51125ff157c8389ba10f9"): true, - common.HexToHash("0x85f65cc6920b48f3e7a6fc5e44c2cfc2d557ac101658b9b8615eede6778d45aa"): true, - common.HexToHash("0xa61769977d0cc097f25f538665f55309eedb833849e22dc07c763afa34f9cb84"): true, - common.HexToHash("0x469317ec5497f27d488bb96be799da6c7a3bb30b35ae32657c568633ab1ec8a0"): true, - common.HexToHash("0xdb2618634dc8e5d22b795f39cd1ac8fddad8d964720013f357ea05e08cea2357"): true, - common.HexToHash("0xf5289a69286343cbe0b2852e2d34694b8d69918fe6d4648315ff2010056b2097"): true, - common.HexToHash("0xb7b2c66e2a2d9b51c610ed04ed69e21e55fdf0fb32cb9f0d336fd8a56112cf8d"): true, - common.HexToHash("0x85b33b43afe2661d9a47ae8bd0f4896c2d5ea0ddd90c65b50f735fd19febec55"): true, - common.HexToHash("0xe71df636265854ecf77227f9a80079072be09871807af592ce2ba54f1f109301"): true, - common.HexToHash("0xe0e087356f2bffd8c96aa34f08eb135cc86ac5bd73db553cc8ab9452c2d57bad"): true, - common.HexToHash("0x73656319d992f674b9e4305c7b245d3458077ac6c4e1c15ba8557cea6d23eb2e"): true, - common.HexToHash("0xd75352aaf43e07fecdb6530838619b7ec5aca05aea4f223153c8e05b8761aa3b"): true, - common.HexToHash("0x6e1b6627e869f42146a342a346108f4fc7cce886e866f05f8c2df8aa6683248f"): true, - common.HexToHash("0x9a65b2c13601e46af120e20ba2e6bfa9b2baf5451253530922fb52f3714ed197"): true, - common.HexToHash("0x135e7851a8444c1e2b0b69b8556ac21c4a942232eae24163972ffde51fb672e9"): true, - common.HexToHash("0xa2c26ea2d6776c5a88e5d1556dda9e0b028f24d24b19cf5a03d60a79ed626f68"): true, - common.HexToHash("0x26117195484e61d1d3c09458b0b14bbd42b29212cc4c85247410a010803c987f"): true, - common.HexToHash("0x7720822f670f3753f73b70c50e392e8a7a97535de81bd8df77748edf95018e0c"): true, - common.HexToHash("0xc3cfd880cfb906eae739766c075bd7fce2144bf2650629ab77c7c9b9cde03486"): true, - common.HexToHash("0x5decfe096e25cdc840fca23f3a88ba2055c2e9b74330f435bd311650b5c428ca"): true, - common.HexToHash("0xfdb5305238e862d3b023d67172d72e17498aca43f5f05b802765a460a02bfc05"): true, - common.HexToHash("0xc17229d0ec4e4cfadd7126c4475eb278a78d0302722c14d27ddf49ef56750b1e"): true, - common.HexToHash("0xe81bbd08d4309806fca357f95c7abebeba566e073b75a4ccb72bc55218892719"): true, - common.HexToHash("0xecaf0ba188648247549dada640d9d216f22ce86583fe5e3f585867c0a3f1da68"): true, - common.HexToHash("0xd6d42d37faad240d2e631b208459e9780bdc00501c795551c2aea7b774804baa"): true, - common.HexToHash("0x45272b469b932330b439c43060fb68c5ee54007520cf0360c450bc9d8db54bd1"): true, - common.HexToHash("0x61403542e28827a4667fe210769129735ccb6b27a35c6bd7a28e65f7ae09e7e2"): true, - common.HexToHash("0x47a2595e730df81d7b52f46284ef429138bf688214970ddcbe6ef5e1bbf3b389"): true, - common.HexToHash("0x37b7c9d67477919ed0e1284970ff4be8a517ac71a543e04da8d2d4740959550e"): true, - common.HexToHash("0x9568c1b3d324a766f7445077b82019bc5ed0d794cba7b3a072da9def77e6b51d"): true, - common.HexToHash("0x56976c59ea237922f05e0eaf3cf92bd6f79aa77927438bac597c9a51a6361252"): true, - common.HexToHash("0x4de283e10e26aa0d33287857c634691360c8d48e2dfa25677f53c6da64a5fa42"): true, - common.HexToHash("0x74b1325862bcdfa56e37c422366fcd4c493fb6095a1d2208c54e82441a64d59e"): true, - common.HexToHash("0xba30c20ef966c6fbc99cf818c6b9462edefb96079adc896e82f5dbdd81676f02"): true, - common.HexToHash("0x3af898333edf38f9c4205e98da8015ddbbb89698fcbd34b461521b70427196aa"): true, - common.HexToHash("0x8230a01f3a52a206dd3e40663e2d2be7d10d7041e246b9431dec2c99c5080431"): true, - common.HexToHash("0x6bff8faf2490e6c7c966a2c1dc2854a2f91a3bfab4d27bd59c080c7673ea4710"): true, - common.HexToHash("0xa8f0149dec0113207a9d4cfc4a226e0f6428721f655e69d25de34933510ae500"): true, - common.HexToHash("0x754e150aa240f1427cf17d2494d8f84543ea3ad896dd09c3f812f3607f33aa49"): true, - common.HexToHash("0x5dd041d9ee016d6c3745b98807a4e3ca4a41aa0ad46c68cb43d46f8c8411ca70"): true, - common.HexToHash("0x4a80ba90ba1314214bd307a4a66e7c41b92592372dec92bb607eb504fe8eccbd"): true, - common.HexToHash("0x1d2c374cae0a5f442f7b5705642227a656ab4eb7af968c7cb7c7a3bba8291404"): true, - common.HexToHash("0xb39841d402bda0dc730c2e873b93a74d0869ba008c92843a22222b6a5483ebc0"): true, - common.HexToHash("0x86a5eb4ee4570d307f452baf4509cf441ddbb139520b65b11912faea94b613bf"): true, - common.HexToHash("0x1c0e638988a2f79a6f76b0a161e3e3f68092882703ba7e214ad6c64b6f585501"): true, - common.HexToHash("0x4d0ba215964dbbdced79bb13e74c57b6a6af32d3315501a8177221f1889fad4e"): true, - common.HexToHash("0x3311ea8029617399a367a2c23320308a1e88c3f0e56ed53cd3286070f30e2a51"): true, - common.HexToHash("0x6f130f13e7b892741b610d713ff58b6868348770bdf981f9028654e4e1984d14"): true, - common.HexToHash("0xc8b3b9a5026c796ddd919059cff45d430efdaf2252463dcd55ab3368ab333ea7"): true, - common.HexToHash("0xfd4a93281fe0e2a7988991a07d5b0bfb468ce06a78ef54eb90db7b5a829783df"): true, - common.HexToHash("0x004e2e34b2146304d97f79d4338ca010df73d89f7d032fa865d7e52d1981ce0a"): true, - common.HexToHash("0x747ebd39008a6bb9b07f7b63aaf127353641e8b1ae00f80090d7c5c4e928dd57"): true, - common.HexToHash("0x33e1f84d64fc5cb1e7205abd2ef74320f28a49225cead3d105650352bb4bb5f0"): true, - common.HexToHash("0xb6c415dfb794a4fc18abb1f30749fc5516658dac953098c0d5d268e9f6df30cc"): true, - common.HexToHash("0x57d9c333fd9cc066998610bdfa7dfc35d01f5df8be717e7efa1502a455781be9"): true, - common.HexToHash("0x0dd7302159861b43eb69f83a4081c05ddf4ee35fc1522184d35e43a65bf17dbe"): true, - common.HexToHash("0x2d1c5c9b14caa535eb86d91a55f2af2e1a8263f32db628d0614e86156254480e"): true, - common.HexToHash("0xa69bac8f73cfba3fa252f3353dbded8e8d86ea7eece6f9e00613fe366aec76ae"): true, - common.HexToHash("0xc03ca9ded3477d51db07535e3e1123bcfd54d41e2568aed445e4763f6651fa55"): true, - common.HexToHash("0x09a2871eca35a6c5997c457e2b170ee1bd40c0aadd8c1d4e7c5de99b7b0dd853"): true, - common.HexToHash("0xceb988d910266e49debfca652fd858cde9680dfc6e11a82b793b4b9cbf4c6945"): true, - common.HexToHash("0x0c584b1d7003cd9a24bf2144caf2145665402b6b9586468afb2a5219fac4c2a8"): true, - common.HexToHash("0xf6bc85e077c5ac57438b1542a37d98a13bfcb583a66ff22febb6d5dc3da18cdf"): true, - common.HexToHash("0x0175443e4a62738eefec8520bb6be672f8980769759e8fc310e72c8f48ae46dc"): true, - common.HexToHash("0x9ec68b659a85d0442856165310725d69cdc956dac5b0c2e7b5bb79bec239a037"): true, - common.HexToHash("0x57b5cf5d52d9c9f6d777f65646f13f08a106fbe6bf66648f08b170d2e1f720d9"): true, - common.HexToHash("0x8cd995440509bc6a0a7791b671164741c9450aca814e71c380574eb954bd7f2e"): true, - common.HexToHash("0x1c130e95df1e026db15175b85ebf01755a72a5ed7f35edee9c5916d8e27ae1bc"): true, - common.HexToHash("0xd9fba5ed218445493f5f6b9ac3503ee7313a764e10e832326b5c5681456b5765"): true, - common.HexToHash("0x1500fb0752f4bed7a6be1fc2149d4ca219eb1ac52832e998cc0efc28272ab5d0"): true, - common.HexToHash("0xa6f4f625ed0305be28f40181abaae9540cc2c4b3102e0767ed946af1b69fc0ca"): true, - common.HexToHash("0xb6630815302cacbb91f12aefdc017f503144b3f56d0dd9b0d9d51a6b891745d3"): true, - common.HexToHash("0x90b42cf08d01c6191057ba45910830837e55f1f59a1687d288a14603b5aef238"): true, - common.HexToHash("0xe37d6ecdf60bf00ed7c30d9b97a3ba43a38876147b7d47f6c753eaaa4dc11413"): true, - common.HexToHash("0x2b345534d2d2ba71d2525f11eff148e9293a4807e3d3427fa078ca09e209cd63"): true, - common.HexToHash("0xfbdcec9d1c4d7851809317da57e7ff1456d7baff4fc6a99001b7560d061e1574"): true, - common.HexToHash("0x9708a361806e3e1cb38d4165c5293d525c98bafaffcd0b76bee04b5f48cf1c14"): true, - common.HexToHash("0x43d96e69f39fa8af4309a5bca582fc2409fcb8140104b02439eab23e3a08875d"): true, - common.HexToHash("0x32f200bf95455ed29dc4b9ff27d04957d3c5faa3a75601740bf75e11388ffb03"): true, - common.HexToHash("0xcce03a5c703fec6a4719e9eccdeb4a6ba66a5e71f928c5f6842f0b099fa906b0"): true, - common.HexToHash("0xf7295f5c3a27b6c5e1e40a0ff6e7264e073c929b4fdf5fd9f135247a77de2031"): true, - common.HexToHash("0x569e2d35712c05709b32e043279e9f0ff76bcfbfaaef16ae45944a90d0383ed9"): true, - common.HexToHash("0x17b622b863b13c9c07a646ba9e7389505c9d68d597118a295681ae73fc8c894f"): true, - common.HexToHash("0x12a8ae11126a68afc056cbabadc80273057e4190dc41e915febc88e7f488f451"): true, - common.HexToHash("0x5df3f7f6f04e7d1253e54c84b9b04cb31786d9715e350361c032b85d0f140fd3"): true, - common.HexToHash("0x513005de98835d60fdd55aa60d66752dcfe4b2607ce70e2564e97829f3ebc06a"): true, - common.HexToHash("0xb49d82cf8573f155868893464f415797712f927c602748f5f52ff179c218cbee"): true, - common.HexToHash("0xc43a4ba8ea4bb122f028b3a1be6ce0881d1302e701723bcb5876b3650144a32d"): true, - common.HexToHash("0x9c0aee77443f2a662cc9adcc740e22e582ff4e835e494877f86b9e6d4066f980"): true, - common.HexToHash("0x981e250209bcef5383103a7422954a9bf4053363c1f066457113ab45783ca667"): true, - common.HexToHash("0x8a55b28cff2654fdb99b263f75a591db566f0e5e7ede818f3e83b0df64a6b776"): true, - common.HexToHash("0xc8146bad90561b4fa743382aa3479ac1b743bc4c62153eba8a939efcc8ca4af8"): true, - common.HexToHash("0xcdceeba27d90d3a9c731bed783c39eb7e99fd38da223d274e2778465ed14864b"): true, - common.HexToHash("0xaf113d357b9247a78f5a3ee5715dc21c7cbca5f386076458f123a19c0c2839a8"): true, - common.HexToHash("0x9776cf3718d8c972e5509b8d5524ec67706b5fc01759edc529f7fbe1455bec45"): true, - common.HexToHash("0x9b1e3c8dce03af8b1cb1037b5ceea4c498f3ec43b9029a047057305f58970690"): true, - common.HexToHash("0xb6a82a23d43c909d4fee24fbf948b1930382f13f4e7e851809e1f5549f8947f0"): true, - common.HexToHash("0xaa8443e012cadfab190150e7ce059dee7a1ad6c2a1b0a44c89f762856147692d"): true, - common.HexToHash("0x93f956fea4305a2e69c02406111d7f5d1f5bb82332f1e7608f9dfc379d6d7892"): true, - common.HexToHash("0xad359645e86301053cfe7ff9472b82b517530cd4900847f10cd8c5c312a74742"): true, - common.HexToHash("0x0990314503384473aa568cf2ac90d79006d6b417534e6dc9b5e0dcfca82fffa8"): true, - common.HexToHash("0x5ee9be518a130193322b92cdc39096f7006892df5afc619d2258c9f4ad83df3c"): true, - common.HexToHash("0x73ab73fb14078b4c7aae9d81e609c837956c3bdfd5e3649c47df32d7903b4647"): true, - common.HexToHash("0xe64602bd6979d50a9ed9bddc54cb44141df3bb69aec0c2398882e0f8a7677b86"): true, - common.HexToHash("0x92d5c0b8e47b10cd9d8420fa6cbcb2c4e064f64d15074aaec678c04661864396"): true, - common.HexToHash("0x16e206432aaa90f67ef81d0edfd63022fe602b2e63a20032d9a21c4d5b1a1531"): true, - common.HexToHash("0xcc081cb6ef4333c37f90a286e51be342b40fabf52668c5bb4933c53ece10136e"): true, - common.HexToHash("0x18dfa978eff65ddd4e2eb7da6075bc4d53d6cab395e5bb0ed69be9f1a8cdf885"): true, - common.HexToHash("0x8fce1866dd5cf92ad2647d03843c7591490e765d8f2355a2faa229f113c99887"): true, - common.HexToHash("0x94b819859035de6192715c24443baa1ec33566d245c5ad4aea554e36cf391307"): true, - common.HexToHash("0x6edef1666d728b2156062d7c2a35cb1002683b6d53c29b60a111983273835d05"): true, - common.HexToHash("0xc9dfb5798cfd0232a90266985e44703cab6a2936274d018a8c932cc804ccf7bd"): true, - common.HexToHash("0x4dbcd86f67a84b3307a6f16e350a58ef53a92c3054ab225ae630e00bd0ed57cf"): true, - common.HexToHash("0xe563e1b39aad9b3ac05566fbe43f66220fccf09fb88f1cf9e4c790195b7e7fbd"): true, - common.HexToHash("0x76ee1692c5050a0ee8eb27217b001eb50f6b9b412fbf2d4777e8e4a2f3b9cdc0"): true, - common.HexToHash("0x376c335dabf11481455e715c571f6b344cd15df2297ca2e479a92dff8e83e680"): true, - common.HexToHash("0xfbae8f8804053f9e18bb8d5328dd7b06916817f8d22a910b22bfb05432a66be1"): true, - common.HexToHash("0x908597683ed2e55ac2dcfa3f3a68dc9d0b1717cf4bfb98dc9c450b2ea91a02d9"): true, - common.HexToHash("0x18649986fdc59d495b703f88c3fd38dbf819169a1d3f87959039edc290dd4050"): true, - common.HexToHash("0x44d7b1d1fe17abe55c6bb906367186418127e77a05c310407e2293e9968571d1"): true, - common.HexToHash("0x0d257df3aa3efc9f5015abb6015ee042b67d5449c008bad79aed0a4031a97b0e"): true, - common.HexToHash("0x583beb32a6ed231f23edf3ab17530cddb1da7c05976f60dd8ea34a1f73c49da6"): true, - common.HexToHash("0xd77fa795a3cd09b8131f192636639921df6a629d03a0432107a46c6e2d47e2af"): true, - common.HexToHash("0xcb1301bf38a6a956710aa2a8c1a6482a96701a7432a36c07a8a59c21d6783594"): true, - common.HexToHash("0xc1bbf20b6c1b544abb33b41f5972f06760359b55f73438cfc9999513d6b2d618"): true, - common.HexToHash("0x34a7bdadc7e83fc7c47c7448779c0191df9b5c65bc8b4f8021859643091cf6e7"): true, - common.HexToHash("0x7911995f3f635d43356eb6842fc00f51bc703ff2278f607d13d405db404d09c7"): true, - common.HexToHash("0x199efe80f908c0b2deb6542c8ad351e6384802349d4e257564627f261aa1467c"): true, - common.HexToHash("0x77670d09186aa0ffb92dd118d0cf5b33e0f695b4fea02fcd035e7ba982436eca"): true, - common.HexToHash("0xa38151c711ee7d97e90b5b8ab811e309133627e4fb740faec9e79aa4cc59cd8d"): true, - common.HexToHash("0xcd52a8353e6e292b267209036f87f23b22d42ca8daf030427b1b9aa8ba7bbeb5"): true, - common.HexToHash("0x9cc114aac3e4082fb7cd1fa12d8bd2e247cf9fb5853537c1a52eebabcc496caa"): true, - common.HexToHash("0xef5dbf6d22773d84b2d71a255b34200d25fa8d49c98bd7270d637e07a25bae68"): true, - common.HexToHash("0xa13c1a654f73f7c29db60b192447d6caa31961846b2fcdeeaab6b403fe705dfb"): true, - common.HexToHash("0x1d062315a997b0bbe2647545ef7611cc567ca3390e08a9a600110fcb2a01ae25"): true, - common.HexToHash("0xdf9fe3c2476cf05cea57d1e8990315f83aa36e079bb4bebb8180c685346eb4da"): true, - common.HexToHash("0x3d95b54b820a13f684497754b8d95be1684bc2d3f7e8acec9c2a60a3fb9b970e"): true, - common.HexToHash("0xe26fcee2f1a6369f2486168a05c7f9dde2d262c697bf840fd40439f63f8b140f"): true, - common.HexToHash("0x934cc38493964a170ff3a28313e87fb670d139e49fe9d5242326b9e5e7d7966e"): true, - common.HexToHash("0xa7254da83314f06ccc3a9d5adf0170e96672da3af5e1a1b38a8b67ced0a4f398"): true, - common.HexToHash("0xebcf68797b1a1631d837636f827da5ed3edaa8b76e531fb467a0c50ec4832a96"): true, - common.HexToHash("0xfcbb94c253fe83a98b7e34c505e398fe3fde4e155946190240a6fb4903f7b48f"): true, - common.HexToHash("0x23ed18dfadd9b6afa7480ed409fe882554d3e04f02e1ec0838d663865f164ae3"): true, - common.HexToHash("0xe12864e28eaacd8f20afabe81ad436aa38e4f32a07d35c445e793f590b8f4266"): true, - common.HexToHash("0x11ebbc30241a79a7cc2ec5c203af6b1b9d100b2e739e00d3ab96505b13b823cf"): true, - common.HexToHash("0x58c0ddf9710b8bd26dbd532edf41e56c9cd787b32ffe33c430c35501efec012b"): true, - common.HexToHash("0x9199b63053532475d94c71b5c1a9d0a49ac797f4ef5825a28dd576accd2686fe"): true, - common.HexToHash("0x9bf52106588fdcaa69e325e4445716a6de5cc3476bb964d56979003a75b883dc"): true, - common.HexToHash("0xe1a1687ccb00a977309aa04befc0253db09feefec07ab9be4b63f80ac787b144"): true, - common.HexToHash("0xcf10e29cf4b4d0a3d76128a500889fe4096fc5cf29c38ef6c552e87b6cf74669"): true, - common.HexToHash("0x0f3be221b3355f48f5eec0e6a120861495416af47e61f6e82aeb918e24af95b8"): true, - common.HexToHash("0x7b6f94c4aefc31ade63eb2dcd020a51936adf99296efcbac745292454dbfa017"): true, - common.HexToHash("0xd732e775a3b7c78d200946138c5036c1f644dfd72de54a4d5f44c53bf2eba9fd"): true, - common.HexToHash("0x5f12226951a72135d7d86cdde37f2d0802bdf1148c31ab56000e300e96d02cd6"): true, - common.HexToHash("0x663e51fd3159c21919388ef7695f316034cbf2a1e6aaff3e6078d240c512b9fa"): true, - common.HexToHash("0x7180592f04e2e07bf22c18ccafab34ed4138c898052c8d1552103d9ff35ad8e0"): true, - common.HexToHash("0x78d3d53ef19cadcb78004e1daf48abb027cf717dcb952f8cef31e53eaea09e73"): true, - common.HexToHash("0x8ad61f6ce70accb8cc2d8890a8fe1388806790d73e35e937374b619e6effeb1a"): true, - common.HexToHash("0xcaf1e20f730b069cc1d4607ce6cfc73bf2adf6b79e85574dd247e674caceeecd"): true, - common.HexToHash("0x5a84501460d3de3331cdf80df9eadca9063e8b95eacadfcdbd4005d37bfa7bbe"): true, - common.HexToHash("0xdfc47d0d1ed761a3b069033fcc58bf76d852bdfcda39cb867d31406083f3c78d"): true, - common.HexToHash("0x5c433537f9743cb1f186c8d6c493888b3c2a58b9a1d0a2d121642a4590d7459e"): true, - common.HexToHash("0x62316a3d883bfcf73ed11d2dfa41bec15cdfc14011505d83d115402eeac8c583"): true, - common.HexToHash("0xd948fca863cede02bfc3a3648e1fed6afd08068d0375132ec6db3809b3b6d170"): true, - common.HexToHash("0x0768c4bf7a59b92d85235fef0b4d293795c1f0c5656ec07354d06e03fec4df86"): true, - common.HexToHash("0xe6da8518befb1d33f1f6d8b72e30228f8d1f321c117ab28b84c23a2b847e52c1"): true, - common.HexToHash("0x9084e236c45736fd2f4eb1e8aa2fc3c8a5903fc7f6460b993c475ec73a429879"): true, - common.HexToHash("0xd6128e0b6914382c045752c818e89ad33234d82a5c2be16730fd241d1563583a"): true, - common.HexToHash("0x371edf49a8a7b7be33da8b9aefaee59cc53b6a2484f1380edc825904de0f0d8a"): true, - common.HexToHash("0x244af6124aabc6cfca03edb37e22097b87cdcf1fea9c8d0de3c326230ef7f3aa"): true, - common.HexToHash("0x353046dd2ea54934dc4bdcdb332bfc4bffd89350cebf2eee53a2836c253be8e6"): true, - common.HexToHash("0x4dff198008dda8d08553794ebe14fe5888aa9d4bc937897cd271bfbd7950fe80"): true, - common.HexToHash("0xfe2987df0e3c20ae34dc509e0f390e7ee74a6dd9258c41d8c68957e03a84702d"): true, - common.HexToHash("0x46c05861fa3d2c0d57aa885cd1d397203c58cedb85719c34e4c61a8fd5ebe4e4"): true, - common.HexToHash("0x744d8819f4a8f252eaa820ecf45c8fd1ed6f72c30cfdf3aa673129e178f3787b"): true, - common.HexToHash("0x85a3c99f566c676721307f4cfaad782c91a67ee6680ae9b39e2ea4c56101a262"): true, - common.HexToHash("0xd396068f4a6fc868f9c20440bc28cb01a063a4458acdcd7e6d16612405829ba9"): true, - common.HexToHash("0x5271a7bfbe74b96b44941244c34bb8c691469644da621270462bdc97a6a7cac4"): true, - common.HexToHash("0xaf737f488844732905d3c57b668c21c67482db55b7b1eb4b8e7642b678369519"): true, - common.HexToHash("0x56731cf609d77b6e046730dac2bac51eeaf0c4ee8f459713f64db692046b8a4a"): true, - common.HexToHash("0x7821532169b19681982360948adab7e2d7eaed226d0fcd2e007ebfe2e4ddb1c0"): true, - common.HexToHash("0x7b945445c7470215ac6a365c8ca586bce4525d670914ad61f26c98073db9481c"): true, - common.HexToHash("0x054e8e397e9e6019220ae69d505cb0f3103adc0605ae8050d08fd0b46961c6d7"): true, - common.HexToHash("0xa6db64197841f343b4415d92e80de37340145cc86d808fc797d54e360ea3db90"): true, - common.HexToHash("0x894b39c351ef27e9cc5d2ff12fa68d07814d00ca8b7a41bf37053423d054955b"): true, - common.HexToHash("0x9e1e4678623f3b612df5c7fb67e078b10fccba9c62729ca8a8ac931397d4e337"): true, - common.HexToHash("0xf59d37775ec35b6cdbdc35dd063b34df820015798e2da38267625402754316f3"): true, - common.HexToHash("0x1f40fc40204fa105860686550be8a78cf590dfe7898b489a81a0589e02b65180"): true, - common.HexToHash("0x0790a14f5a8df320f3e28bc204ab53d6ffe1149caeeaf377494c07a6c9e677ef"): true, - common.HexToHash("0xcfc3941b1bf438a7e5d559e442771239dce5b16b163f27a10afe95ffdeca3cf0"): true, - common.HexToHash("0x2fc8bb00d795fe7140ced7b518ef17a10198edf453b515e51d76186d762bd520"): true, - common.HexToHash("0xc3a51bc3642e7ecfb905c383e828b8abb7a8c469addeb514573c9b4e4c32d871"): true, - common.HexToHash("0xcfb3d3ddc6660f36c6929433c2cdaf208dc1dc696195a01ddb00ec9c94b172d3"): true, - common.HexToHash("0xa1f2bcaf780f1e3a4d507b088690e673cb6a9eb091166c81d5780322a1136f99"): true, - common.HexToHash("0x327d52b9acde7528efc245d676896515499c67dae772b37647aae93e85fdae94"): true, - common.HexToHash("0xde32b02bf72d7525e7467685db48be1db38252678f4551bdf20f5ce136737945"): true, - common.HexToHash("0x136e188f4e4888657da2100d5b82c2241a2435e67a0fef89d9cb92b3b45970e0"): true, - common.HexToHash("0xed4e1c4ddb134b0c543fea241b1ed15f23d75073d79d3a4d432bd2a790bf06a8"): true, - common.HexToHash("0x0ad954729743f2167fecdb45e2c6f145054303379eb00614d4242ad884f7a8b6"): true, - common.HexToHash("0xc78d6b2f736f9848942f2bc7d88aa9f3113f7ba978708dca7d35ba5e1bdc91b7"): true, - common.HexToHash("0xcf3c14bed1cac9a116dffb5ec23e2bff1a9fb53289bf0bc3c0157efca284273d"): true, - common.HexToHash("0x0c9701737a76e13240b9c78e72366b9a52e55dd58bd9512951c80f8b944b2371"): true, - common.HexToHash("0xed1b8ec1863d46465786099004e46f3e8fddf37eb5c6607fabf07dec5804f968"): true, - common.HexToHash("0x6dc72c349abc0ae869e937065fa91fac09c5909d8b46a58f00a6bc23b3e7afda"): true, - common.HexToHash("0x7cf8d06df6a69b8778677c45eb4557733290f6c67ad1d63d3668db6fb90cc71e"): true, - common.HexToHash("0x577fafd6ce00206640772c8f92002bf1ae4ab9639b8a30b10ff4a2ee5c08cd15"): true, - common.HexToHash("0xe9c571fedf0c6f0a16f6e26e8e96e1beebe9410d4d0934834fab7686674a38a9"): true, - common.HexToHash("0x51abd5265d19fc9967cccdb788844dbd4aa99d354b53668ee9476bf2846920e3"): true, - common.HexToHash("0xafe6e0dc9ccebf8451a5eaf862447f13a0ff1db7c3d13d4d3a07161db4a5f5f8"): true, - common.HexToHash("0x23a9b219bfd06590eeffbc4c88ae3725442d71141f3bc592d18a6d2a21c1a948"): true, - common.HexToHash("0xae7677da1acf6fbae42a50bee8378873b7b31faeb521444487fe3ce8803edf2f"): true, - common.HexToHash("0x9e355e44da19a84cfccdabfb6bc4305295ae1ebef7647ab637f6ed826f4d49d5"): true, - common.HexToHash("0xa1362638039493983a6181baff57399813d25f6522d28e54565fe5be47d11a16"): true, - common.HexToHash("0xa3549b3bea8ade7ce1c3551de197303dc1d468a6603b6c227610d71545a95582"): true, - common.HexToHash("0x2575d08357d079089ecd8c29ea8814e5d3b0e47ae8d0deb69f377ce6f9873886"): true, - common.HexToHash("0x248f434be52b3117917d0d3273e10ca08d05cd7da72153c4ba760fa96b5d89e8"): true, - common.HexToHash("0x6d997612221933494189959c8b4fd450d733ee2ba4003451aec082f0110b44bb"): true, - common.HexToHash("0xa8410d2b9728c26cc6107cf485b90d9cac9c18982f4a224fb519b3406882d8e4"): true, - common.HexToHash("0xf34975e8080b48cc7a834395ae11703862743fe5255e5b62dbd3885f2c792a9a"): true, - common.HexToHash("0x4977bcbc9bea5495975e9553b8d3a2d28e229911fa898c57301e00942a76fad5"): true, - common.HexToHash("0x1e45150a651aa031c080f87389a7f2d1786051cad623773cce32185280359da5"): true, - common.HexToHash("0xbfe52b9393ce1d1fdefbe6567ec8a9223f13a8e4e3196d5cfba1262e24f63e1e"): true, - common.HexToHash("0x7f4651b120f8f46aa9c63c2cb2028c49403039f207228e21a654e9c79c2ecbf3"): true, - common.HexToHash("0x586719bc23d40a7ec43eeb81266ec784d2dc4df9151a154f88836ff285c8ebce"): true, - common.HexToHash("0xe60469631203b2e17662e5709fccaf08b927b6a3515b109de362fd97ffdb3637"): true, - common.HexToHash("0x4135dc76c2612d150b72a20d24a3e0b0982ec955fef1f68116f021cfbb027b2c"): true, - common.HexToHash("0xac040ec018a93858145792d7bc03bf0b9f78403409fe633ec337f096d92b94c4"): true, - common.HexToHash("0x40f152c95318efe4549ff51588976f9b8c6030b23a67172899a19b16e1fac972"): true, - common.HexToHash("0x979b1c2e39d5afecee20e0e0c49a9d2e2e993359ad07ef28cc9529972968af69"): true, - common.HexToHash("0x0f721ae468fb24bd13fd11f980ebe0b9c24a0d019eb210277fef0dd6e98a3e05"): true, - common.HexToHash("0x7d88dfc784185dbfeb11da4e8693aa0a6090f1d129bf472c48abda960de3c2c0"): true, - common.HexToHash("0x914eea684492b9c5692f47ade58836f7fa5bcca541afdb02f113b2a3ceb55b12"): true, - common.HexToHash("0xcaac9c9b58fcc0e0baffe7c4104228c1f74e086d630df7a25e236399c470634f"): true, - common.HexToHash("0x8a62033985ceb18b6f4c33d0e76444187df0c9bf96756854fd96883a5aa31370"): true, - common.HexToHash("0x79b0584f3fa349171714f5a34c8a886e15fee44f537e4075c6fc116a29c2e97c"): true, - common.HexToHash("0x5321a8948ae26ea99b559fe4f29a381e4962e50916db16de235e310333838275"): true, - common.HexToHash("0xac37676bfa3d0165bee708ed76efa5b20aa5f4546ae22a5f6a5a3bc940e1adb7"): true, - common.HexToHash("0x6dfbcfd913a4460e64395a492ec86ec5407009ed7b1a71371c3fc6c7e9effb9f"): true, - common.HexToHash("0x17c2b879f8b69c0f2bb34a59ed3fcfc0ea8d1a7e853bc142b3cb9b84166969e9"): true, - common.HexToHash("0x02f5602119f6e436c49dd40c42915692cd2a319774281cbe80e9ccb03e39ec95"): true, - common.HexToHash("0xd1749ce893a51a5cb654c67c58a0bd247e9dcf4b2bbe745291e1e3c941c6468d"): true, - common.HexToHash("0xfbc582fe11451001ae4ed85269cf2072179babfd348d030cf81b9000c8b67c22"): true, - common.HexToHash("0xcf05a4cad7c29eb082655f5b1209a74bbabfcc66fe1878c94824a36689beab6a"): true, - common.HexToHash("0x228e12c331f648c95db6c80c96080a7c399009da8670f286601d1a5f7f284bb6"): true, - common.HexToHash("0xfd097d1048606b836968d2f8b84c253411422efa69958314b33bc504601f6609"): true, - common.HexToHash("0xb0b7829d9eff00ba90533703eadd6114815a13b91029a562451475fd29d701c5"): true, - common.HexToHash("0x686a1bc62b2b6ba7cd17f6a304fe5816493f5b6bf1693c84c3aad166ce33199d"): true, - common.HexToHash("0x36734754be4f622033749997a51695ffacb47c65c5b35273f573ab296b5427f3"): true, - common.HexToHash("0xa04a55e3df329620abc504e151760dfc6a5f70f121d034023ad9af234d68a24d"): true, - common.HexToHash("0xf35984a8b7332bfc3b3c2ce0437f30453ad5167d90233c5390c0d43a97e28ae6"): true, - common.HexToHash("0x0c4a5b0302da018df6dbf50c59c2d7ce4e403da01caa73618a49cb587e3d7528"): true, - common.HexToHash("0x22389f32eda1c327e87ac7bd24630b2d686393094711b7b928eaece209e28e1b"): true, - common.HexToHash("0x6111db646a09809ac151762fd78b3e94d5e5ccbc5a14231c119d98154ca68fad"): true, - common.HexToHash("0x1e842bc8a20e02dde7183ecc95a378668da306d0d459bb3c0c8d02fac6b9baaa"): true, - common.HexToHash("0x0668c3b9e6a4eefe4988e213caad1e4bd9539f11e07b0cc24a62ded0b67c4f54"): true, - common.HexToHash("0x4fc985437b7e6cfc7bffa54d2c2d91f0250474ed2ceb4c8a64a44c79e5c52a55"): true, - common.HexToHash("0x7535427a6f33d7aa12492dec9a3e1ab0adad55521c83572f976bb4d506f97b7e"): true, - common.HexToHash("0xbc5d03de047d159605de5ca712de6fdad4179ef3a0bdb48a648b822bcef66cd8"): true, - common.HexToHash("0x634f9f9812b4b8bf6cc9a607af969c30853cdf243df8315f2a5be498a27b683d"): true, - common.HexToHash("0x2f0cc566fd5d28387890815863c0eeb8b1da3a18bb73b520dd390beda2466730"): true, - common.HexToHash("0x43464104216619be9cef32550ca15f495615202209bb29f595439446f479c441"): true, - common.HexToHash("0xd1068dff171dc9be6dff401e22d106f6feaad050892ee4b0975dd804d792757e"): true, - common.HexToHash("0xcb93eb09e9e092426d9e217884326c441ebe2c9407c636f62fc2cb26c1437fa9"): true, - common.HexToHash("0x41b33f12958dcab5f2267e29f3b50e605fe9f6d5e7ee1d6496cbcd60394f0508"): true, - common.HexToHash("0xc5e34c722673a25b3da252de4924a78744f2afc70f158a4fc31673d2b534b272"): true, - common.HexToHash("0x1b9b4e46a00bbd5b29d3b5d5c659e27c701e693e6f9f028225f2e87792d83369"): true, - common.HexToHash("0xfdd5eefd074ec3d9744a403ccc61343eeff515a8c5d72f9599b78d3f191f7f5a"): true, - common.HexToHash("0x608f3394aa8f821273baaa680276a2ff7c05dfdd5ed60cb2d3ac876c6b60c920"): true, - common.HexToHash("0xd9d836296fc6245850fdb3f798db7868fc2adc07b99c6f0692854cb164d64629"): true, - common.HexToHash("0x572ba0aed1a3cc167fc6bfe4cfcc16a2e50017d58295592e06ea25fc345ec448"): true, - common.HexToHash("0x093024cabe583aeda32fc83eefef8972bb87a36d4f17e0297c4e6ada510115e7"): true, - common.HexToHash("0x35c5fc4e61f3fdf78abe173d668b7a108c075fb313b43ff5b461d4438fe1b2b1"): true, - common.HexToHash("0xf67bcb6f464fb9d7d735deb1e32b002aa13d22784c944327929cf90c48a7166f"): true, - common.HexToHash("0x93aa1f89d74e87241a6b171cf062faed91014a59763d4e878359abf3b540b0d0"): true, - common.HexToHash("0xf9a1e384a7608fcbae2f1db796b8783f388f23492e1bc4d0665317afb8253c6b"): true, - common.HexToHash("0x9c1a9768148644bb21d0ecbd077106aef984fb24684cdf171479b9bdda8f64e5"): true, - common.HexToHash("0x074e9bfee542d27488377ecea662a02f339c480255e58c8c2033dce77ef36afe"): true, - common.HexToHash("0x0d2611f5601113232a2788f3ab78eeb400f8a18d2c52ef6ab449f15b9a06fa3b"): true, - common.HexToHash("0xed45cac776eda1fccad548df5f6b1675d01a8083d5add3b2f44039831eb2c9c7"): true, - common.HexToHash("0x3f5af6389cf76dbaf31c79742724f339f86e8481cf57b2d00e29c558189e59f1"): true, - common.HexToHash("0x2987d12dc028898fbff0f5a67c014cc8800961d49a67cce6fe71c27a43d3c0a1"): true, - common.HexToHash("0x68e7ebda8b297808cdefaa9cb2a358736175198259610c1bed8cddb741902a73"): true, - common.HexToHash("0xad5c8d02b8fe1bebdcc3a726e656db71e99e236fe140cc623350b847f0ac6d19"): true, - common.HexToHash("0x3d5b98e1e1fc3a0ca50b0b5bdee561edcf084e2dca7f236170ad890baccade65"): true, - common.HexToHash("0xa768871b5e283902805a358e780288e8bf0ef7c84bdef395ed26838820b25bb7"): true, - common.HexToHash("0x624751ade74d051fb8c07d1b9dffe64daa46c26efa80d739c46892da6c123ed9"): true, - common.HexToHash("0xb305f5af137703c12d3d4e0a60a54199423729bc5be61f8a62605dbb355de9f9"): true, - common.HexToHash("0x2e1620d81120e6c0d18c1b28738cbee7636eacd70a2d24fe584bede7a69dab01"): true, - common.HexToHash("0xbe609767009edae5ec1ff86625d45920d43740376fad925ab3a50af483c15239"): true, - common.HexToHash("0x8a1965d9ec2831d77adffbc0484ba86021b340dcae25bf37a689c3039f9b3482"): true, - common.HexToHash("0x356fb3b98a30f069a20cf5b5ad3f11f1b4652a81cc98db867d9ddf6aeecdd574"): true, - common.HexToHash("0xfa2ac9507eb0ad2ae5acad6ec7bebc77967b1724d99a25a54e7506e440217ffe"): true, - common.HexToHash("0x1093716d1791a3e8c7f874b7e1d089108f47e180f01d83d595cd89adfc04a17d"): true, - common.HexToHash("0x448cd82427662f3e0dc06677858dc37b4e46a658227fb017309e666244bbdf0f"): true, - common.HexToHash("0x03ed97a056b7c0556bb41885a0490b2e9310b93e18eff28c1d9be33082a6fa05"): true, - common.HexToHash("0xcdc1a45a8e2ee414dd5e72b3236fa46dbd04eda98a055cc01cc0c88a2ae05c06"): true, - common.HexToHash("0x101f977c056ae1396516d4af396860f51c1a14ec3a6658efe8dc02aafa572d09"): true, - common.HexToHash("0xfe7e355d31a8eb30782c25c52cd1829751a2aeeb024691f4807f1d87c2606c1b"): true, - common.HexToHash("0x7fc111b12643b4d87ccb8ce256c51ede4a7dd0ff0c244d2e35c97d17dca44f32"): true, - common.HexToHash("0x9d4b14233e2c001d018c948ab0b12df376d21a32a35cb9b5b8b5d000acd2d12d"): true, - common.HexToHash("0x430ef8fa062746f41e7f6804f0fb908c9451f9bcd53aaa414ed73a39e1be2a3f"): true, - common.HexToHash("0x021d5f2ee1bcccb8d93e3b2ffb1361d7187ab554561393467241d3bae7c86e5d"): true, - common.HexToHash("0xc9606522bb4f4beddf0fc9fbcdb274dfeae9c688fc804ada1fa75e777e79609a"): true, - common.HexToHash("0x5102acdf28f2d843bf93c8f10e1bcb75bf98094b8bf9ce305bc5dd28a185304c"): true, - common.HexToHash("0xbac1f6cd5c6cb605a7e5a8cf7cf76d38d24536b637ae11a9c4b40d830563c76c"): true, - common.HexToHash("0x4185b8602e57e6f6cc146e88b67a303753867b0c3b2953e72575b24db5e112f9"): true, - common.HexToHash("0x09ac6c716125d3081acf71cf36dd97852a237740a91ece5b3c769a579cac43a6"): true, - common.HexToHash("0x0ca37c89eca46ef1ab5661404e674a7b83025de68b6c57e7fd725ad73da1fede"): true, - common.HexToHash("0x13044680396cefeec88853cf74cd4dd05579aff33c2d091d502cc7fbf0404d12"): true, - common.HexToHash("0xeeb19d4df0b859b0dcf5873ce0133ebf0c91574ff802833acdf11723747861b3"): true, - common.HexToHash("0x39cd810d5c793c97f6d726224ddf4bfcd7868431aff51b09051b09678c0a382d"): true, - common.HexToHash("0x0df5d74c6ef919b2c7341f08b0c80182695ffcd64b59435f514e0fca0c4a4621"): true, - common.HexToHash("0xcb7534e98699f885c791da533704b9e8360cbe3b182dde2f57f25dad0e531e61"): true, - common.HexToHash("0xc739a0e4d03d334f4d03228bd03afe4948aaa4b5c41999e7eec70f645de451b3"): true, - common.HexToHash("0x6cc0d1566fca669c27186c923fd07657f47e2715889028db6ef9ed2f920b790c"): true, - common.HexToHash("0xdef610f83a1876061a529694b0081e412141c0d1af4013d2ee699f636bf20a06"): true, - common.HexToHash("0x33f0964e0642ae09debf680f21811fa4ad7bfcab30ab80ad8ce32c5fb1c6906c"): true, - common.HexToHash("0xd8df45e6c01c40dbcf2c14e222ec233d633ada541a2ffac1c186be5acdf29cff"): true, - common.HexToHash("0xd73d95118954bee55d68fecf99cc089089f1d39e8158be3b5170f8184e885bcc"): true, - common.HexToHash("0x89fa4985606a37888eb2bcf56679e5722912d62ea895e2b2dbc930ad25680372"): true, - common.HexToHash("0x0f848d62eee251737ca688299c37c32c60c029db26bf53b81e29b4f8e9d0142e"): true, - common.HexToHash("0x820b95c71af1f6166ee335c59936118850b16e80618f70737999f6bb9d276282"): true, - common.HexToHash("0xa1a4a75c8e11116369b9a92bf9fecf38dbd8772287ce85e1a6d4d172898696b3"): true, - common.HexToHash("0x6f7a7ff45713c5956b8f7075026f0f1bc1c8726125b54ca6ae4c6bc33652ba23"): true, - common.HexToHash("0x4309ad4c115f0ec8073ef52a36ec1195b26ab082b8a53a0cfbee6540be3c02e3"): true, - common.HexToHash("0x26e1c4a48271ce8321f051e0d5eb9122d956e8be378765017da96922b3ae1410"): true, - common.HexToHash("0x24f647b1d03edeaac86a50939190bc0224eeac36f7f74f6f4d8b2501b6ea222c"): true, - common.HexToHash("0x2d33096225884c72536dfd5056b1945b29079f9462ca0ac15e5770fd7ffbe55e"): true, - common.HexToHash("0x79bfb23542490baa41d069876b11ba93ec1edc2187891057a8b0799dfd874441"): true, - common.HexToHash("0xc83624773e1071288072ad590abfaf219ee173a3b4110ee2230f95948cd24442"): true, - common.HexToHash("0xfc2bd0d940736165c49b6e7c2eeac14b1b5599a86683beb4a17dfb1c7b104789"): true, - common.HexToHash("0xad9e2217e6fdf3c0fb9003556f6e02ad9105ff6a6a94bba3e22c85dd4863a051"): true, - common.HexToHash("0x314715400f358b3d50405a1bcda348a057809613d3ef3d5a2ba9831a135f8065"): true, - common.HexToHash("0xf8add3ca2e953b7ff39dd96602119fbacfe1f095c2e4d05f39c233ca883bd0a4"): true, - common.HexToHash("0x86bcccb4b8863e3be0e60a862600a81468181974254a0071d733f5ea38c3c3a2"): true, - common.HexToHash("0xb6c9748c1b779d4dda75b2600d06e4bab8bbe8322f0cecb0e2e881b4beb4468b"): true, - common.HexToHash("0xe209b7b37eb0ef6624ef8b96d0637e08f33edf3a2bd5811ee490af5222468e6f"): true, - common.HexToHash("0x2388ad71715ce97052606e6a1a43bab78737dd2b7a1f9fa4bd8340b406db278c"): true, - common.HexToHash("0xc99348201e7100587406e8d439a5f929cf5e8895128ba0646d8c821502f6b5f6"): true, - common.HexToHash("0x6bb4b3fbd785017c657375c055b446ef6de6f60fa881ec387fe00f691663a0c0"): true, - common.HexToHash("0xd10e49e21f7ab66e4d3bbeabfa4c2abb8b4bd8137b084cc1f84c3f9896c0223e"): true, - common.HexToHash("0xd7a8a534150191c7d031028f31d6da512bc7c30822c0696632a2bfa195f7fb92"): true, - common.HexToHash("0xaec4c035b225d96df41339815580681773e0942d6a88a9ec889605035b52fec2"): true, - common.HexToHash("0xd89f0e8b40f9a2a0f047e548b10c40f5815696e3124e59dce1c82bdc3fcea4c0"): true, - common.HexToHash("0x6f1f0089202563824ef0e6e359348a6e121267b386170e8b93b484a4b7cd14d7"): true, - common.HexToHash("0x27bee997e5f31f9c66c90545127318bb0f98f4fa24b619b251e6d70d05d01755"): true, - common.HexToHash("0x7591570ef3203f7227df10594cc537b9a0ad9ad71529e90caad18244d0368937"): true, - common.HexToHash("0xe4366bd925f4952a926d49bc3a80c7e7fa67d481c36215272f480b13dfacd3d1"): true, - common.HexToHash("0x5765f6f3b8470daa14b868d99fd1c83c6c4a2d8a35165ac847a1c942b181f970"): true, - common.HexToHash("0x59d3d2ab3644a99e8d29ad01b2992f11b8df02efa8077bd4779148942dfbf659"): true, - common.HexToHash("0x1ddca1d1f0eb8bebbdf51adf97b84c8ecc6d70ee86422637a091bd3ba926b92e"): true, - common.HexToHash("0xcdbe49c7c1d31bfd96675022352052280b9e1299c2b74a8594955903381aa43a"): true, - common.HexToHash("0xeb2c0c443f4de44e7d386aa5ceaece19d329506411e260b2f8e03ee37e3e40e5"): true, - common.HexToHash("0x19d9fbdaa4c49186e571f19aaa27a97890a26861d030500110d7f36dd45b8c87"): true, - common.HexToHash("0xbf654ed28a84173c48a8124e8c4b9d4fe0b47079e8dc53306edee14e085327ef"): true, - common.HexToHash("0x508c37561cadc78db6076f8d7cf1973143e12d156855771b48798ee869724a97"): true, - common.HexToHash("0x27d9aa18cb476d4b53294e730037fdfd7580d43b762d9488ad65042e360f4a81"): true, - common.HexToHash("0xba6be72c04000f935a86ef5815817da1e9d79b6e1de0facb187291d52fdc5edf"): true, - common.HexToHash("0xcd4a557823dc15e419d154301e6fddb5e24481cddd3b429c54404e65a5ca5e7a"): true, - common.HexToHash("0xb71646a31ec385d0373c0117633a3a5f8920eab4f664684188f04460cc0c9d4d"): true, - common.HexToHash("0xc61f0acd67369f44dc7133e0746bcba992048c153b5a6318d79e56142fd4efe9"): true, - common.HexToHash("0x2881039d20a40ede7cbbe61dc74416da3e9889713339adc031f4d435cf85bdde"): true, - common.HexToHash("0x6842347fc5898d9f716d53ce9b063beb33b394f731fbebc946a395d795f7c28f"): true, - common.HexToHash("0xc2fd1474813d5931c915c61d5051111fc4832effb7ac8fff03206e64cdaad9d3"): true, - common.HexToHash("0x1f8614a9a4e780f748201e5ea70b0ff0c11eeee46e0eff58ca10e1e09cce83ec"): true, - common.HexToHash("0x98f8e59077e01517dedc6d9ed8627517748e3f1079fee68a18f7907214f8414c"): true, - common.HexToHash("0x2663c4009905a4c163a1e8d4bdada2fd6b2a45b0cb0369b9fb46b7c4f1a5412c"): true, - common.HexToHash("0x075401dd2da20369f89f8c91d2050447e78a50dca211ec269fe3b8be973ca1f9"): true, - common.HexToHash("0xb7ff0ff04f42b0f43c1210b6465c0fdbe0bbb354c776be589c063a55d6ca88c3"): true, - common.HexToHash("0xd4db8166f12c69959cf0f745c7ff528c60ef6c5a754b1cf511f289568aed1d24"): true, - common.HexToHash("0x07884556f2c4d9a17f4f36cfec21877904f0f3b7b745777165f772dec1def4fd"): true, - common.HexToHash("0xf1c40c38d2a32a4ace26ef01f7c3683dccd08b1c1ea10be8970a339b49aab544"): true, - common.HexToHash("0x108801190d3af71d68480bce4ec11f383678f84c6fed8b81ab61d7f94e5f4057"): true, - common.HexToHash("0x20665f0a9e4f11585ca3d8afc16c185589e6c1b8ec77068ad738600136e13d8e"): true, - common.HexToHash("0xbd3df993b6dcd0bc00a382c72278beb76ff95832bdd40c7dbe021c17aabadf25"): true, - common.HexToHash("0xe8468d7119d03195546c09e79c0088c3a95fdca64e8353bc095d283724d47ab2"): true, - common.HexToHash("0x09a3fe952eafae34421d25c1e73e662a4866d7af8aed3c7e2cec31574d49ac63"): true, - common.HexToHash("0xaf450baa632a455c1f70d785b89aa017fa92b7d1decb40103be54e6cc3d60884"): true, - common.HexToHash("0xd53edc787caf31742211a2c593b2f1e78668b807dd63c2a56094aa8ea81f5160"): true, - common.HexToHash("0xcc1c9642360acbd56b03e29ebe3a26fac7a1560ea2bc5a9380358bc015ccb3c2"): true, - common.HexToHash("0x8c3d7facdb4217208041ffcb234563de68cf549af8bde366d4e07c4e46bb10ab"): true, - common.HexToHash("0x5f585b114aa50264e1a9d1b581978e4960bf2b0726bfba052b38c71800f31b53"): true, - common.HexToHash("0xa50c281b2cd0b3f81954731d91fc10e47e84b5bf7e48650cf9a47ede91e8f1de"): true, - common.HexToHash("0x45b6960f3e3c2106f46538e357c2a6ef73067bf5f4d84244722af352f21035f2"): true, - common.HexToHash("0x0e9782c0c5ab02cd7c4f6d2b86451908928ba861fedd62964ed0a46eaf301d43"): true, - common.HexToHash("0xb5db62e2d67e85135a84b3d774e473ceeac3fd87e51a11275e43ce977b038335"): true, - common.HexToHash("0x11134151fa754db722a4434f2fa46aea591c28abc6a2c2dad68e79b40cae5df3"): true, - common.HexToHash("0x0f42b189eb1503fdf31ab601d52ddd8fea0089fb899d7da61b9ae51b0dbbd84b"): true, - common.HexToHash("0x745b5a241a91e83542769d80373604d407506259c68666852fcf8d6577298058"): true, - common.HexToHash("0xc602c49b42408976b7055ca119b95539c36497fe02d4197094ac8c0edb1f27a3"): true, - common.HexToHash("0x99ff3773df68f6fb3b033ab2760877d0aba3c9e45f145faa2e908d5e6632c1f0"): true, - common.HexToHash("0x7e0ad5e916a0da7f2882fcf3528d5adece9f827cb619323012abc0eb4622ed26"): true, - common.HexToHash("0x023f2922a3f0585bfa97d25a105607d64b6b8224d1c200075a3411268b514656"): true, - common.HexToHash("0xa04658d8d7ee063c4d146ec10f7d8a9c9431c32e402c5872d163e24d53b72362"): true, - common.HexToHash("0x30846addd34de9151c84cfb53753f5d782a136e0d6f1ce4dac04bf01b690e56f"): true, - common.HexToHash("0x83965f5daf07fc4d833324069afbef9db3f450ef1f7b02d46846be7deaa758af"): true, - common.HexToHash("0x0567b7a753ba1c6e8c232c0a62d269457d12c11835d75847d66dd2af68871bdb"): true, - common.HexToHash("0xf0c5d5ba117727760c50b55b2b33294813e1bd029098b61ca72366626e34c208"): true, - common.HexToHash("0xad6973bd996d8bbfffe95ae879b13e191392be5428b49204eb89dde4d7c505d9"): true, - common.HexToHash("0x58e18d23758862f79c27035fa4e7dcf6b7cfc32f555072966073f4aed562b952"): true, - common.HexToHash("0x6682a0bcb1bea9973271a97153979d3174781024239f579c1ccd74cb40d40510"): true, - common.HexToHash("0xb939bac596bc16e4986ab80e931ee941e097ac018352fd938f39d322bff8d26d"): true, - common.HexToHash("0x650fef356dfea9ad88253b77195144194a26de364cfd0f1e76522b492ce53ce5"): true, - common.HexToHash("0xd6d327bbebe5f2aee3bc83b12f1502c34a764a1172095a417907baf26e6bcc59"): true, - common.HexToHash("0x49f39162d6a6c2df78aef54c433f035703e2876b7af782a819ec8662db240abc"): true, - common.HexToHash("0xdab616851a9c5e6132bfff7d4db6cdd77104156b70b2b261583b71837d9a5128"): true, - common.HexToHash("0x35fc40165b72bcd491420ad148e3c38a38ea7d9f43ff1aa071ed35a33496c6f1"): true, - common.HexToHash("0x0ae5bd5c88cd78487936793b100fdcef081948fc969db64ac7303b4cecf60a71"): true, - common.HexToHash("0xe59fa6f8477abeaa87a9903f4acca270fb9395ae01689033039ed5a2a56f8d4a"): true, - common.HexToHash("0x8b346cbb6c4436f5137c68a39bf39e0b19478e75eeb3ab6b0ca5a9ecdf255660"): true, - common.HexToHash("0x4950cd31cd585768de2e795a10e8c7b2fd58da95ead15a0ddf8e29cc5f68c10f"): true, - common.HexToHash("0x2e62c47e71fb62254e98fb64da4408000137f966463ab2e0cfc9448c26388dcb"): true, - common.HexToHash("0x9a808b7e03542cd70992e10da287ab20d64c59212782bfefe0567e4733f3ac1a"): true, - common.HexToHash("0xaadc8a67bc20931a449e9a7e6207c71724898ad7862ce8026630f216a1172107"): true, - common.HexToHash("0x93100eccbf684c2fbfec824dfea57cd75b1aed284c90bfc944f7827243385eb1"): true, - common.HexToHash("0xef5c34fd35c9e28fbc5827eaaa24a267c815c633620f32dcc61195ce4cb5f4c2"): true, - common.HexToHash("0xdc29cbc3774acddad351431b7f3d5ea07af9f109b3295a331d9482c45e2703e2"): true, - common.HexToHash("0x7a1c6eb0699812fe7cf6c404b395b6a4f4e65328c981eccde40ab61744829e87"): true, - common.HexToHash("0xc048550af52149ccf73cbe71c8144af1aac6604fde9e197f8e83a9c4ffcf967b"): true, - common.HexToHash("0x65153a828e4ea6d5d3378c8fb75f4c03c4acd10d48b98d144a343aafa51e018e"): true, - common.HexToHash("0xb8aefe13e6ae54958b5891cf665a2f29a098ebdec25efdee38026d39c351be1f"): true, - common.HexToHash("0x821f9000aac3d9301549ba08eebdf8132be434fa322130b3856260b7e7306bba"): true, - common.HexToHash("0x9b6f56821e7b33a247766cfc9b7a61acc38f04969c3e986fe30b26f1f5e1f8c2"): true, - common.HexToHash("0x851cf63d313e38c5f7bc9c8745ded272e588beed9591b0fca1bbfe63258c1918"): true, - common.HexToHash("0x4a5bd4719ba5d39a42ca70f9f8c53dec3e5009b3157117cd9b4c52c3c45eed8d"): true, - common.HexToHash("0x935bc78c24aa4ad915e00dc670a2ae3bcdabb38425f0fd7c9725c03b70db25e9"): true, - common.HexToHash("0xdc8cafe2bf52378a18036c6f8e80d3c3dad9f92192781d8cd385d6661040126b"): true, - common.HexToHash("0x913525c0ae1002b69341c8bb20f9857cd63fce9210ddfca8616f8e6c2edc2172"): true, - common.HexToHash("0xd5914c7d07303e84f17a07196a86b81370927b13d3324ab8db66bbe9afa01a47"): true, - common.HexToHash("0x548630c8ab6219121faa2ecf24f00e33984ed02c1a9223f09744487b4b898383"): true, - common.HexToHash("0x9973dc40d52b0e432a58fa4e415eeea69a8a1dc90fd28d17aee80e9acd04f4e4"): true, - common.HexToHash("0x270ef2399d09cbb2f6282220990a46b08c3faa9e2f3bb7d0f4d06ff3cec9ac2a"): true, - common.HexToHash("0x22c0998e202a68e6d896e2a9a1f5ffef9c1c4783db22153135d49852b4a8043f"): true, - common.HexToHash("0x46a0018af0b989b41ca09e2827140d614be61d699f75757856f58029431e3e57"): true, - common.HexToHash("0x2d36ce6ee8a52347f26778c6e6c71c764b8d2ba7aa7baa9c00bd9b2aa824ccfc"): true, - common.HexToHash("0xf1b95fece8f8cd569ca6c2b18fdaa46d62d24bdbefedbc0e09e7f15d6b2f4e25"): true, - common.HexToHash("0x78291332ff996e0e063f515dfff2a3002d8f9be102ac43500535bce8df4f89c5"): true, - common.HexToHash("0x8b1f336d89750fe052250e160f635dae7046bc17d75739c19f9a5651a838f384"): true, - common.HexToHash("0x831d61c3c5a8cc5764ce8ba1063b6b294582cafb74c5e67b95efa096e0e2515b"): true, - common.HexToHash("0x15360a44db0faa2f447eef7d9df3fc0e12c0d5d1fd65b0289445f6bad424194f"): true, - common.HexToHash("0x8ae3524a3fe69d23ea1307286d70f1e0de8641f1eb448f1ac3dedd9b188ef596"): true, - common.HexToHash("0x01255107ddb8be7699d4b9fba38d89cb580d085e71328c954995252889b8971c"): true, - common.HexToHash("0x1522ea1a1052e3a96ed8640975008d8253f1f2f6ffb818cc8532359d3435c386"): true, - common.HexToHash("0x6d57a9104707eb7017e720835ac5363a45a063cb334f70b21ca2463e4952838e"): true, - common.HexToHash("0x21a08eb53e03b21f2294a9c08ff3c5d03a68fd8439306f70cb37c5a6becb8d2f"): true, - common.HexToHash("0xfa632e9c0d13e1e5b4c784781a96153188983173f2e5278a6138e3d0c6df2ba9"): true, - common.HexToHash("0x66d6adb2525546eab3c9d6f19cae8899a7dc35d7e47d0946ff52bf0877ebb5f1"): true, - common.HexToHash("0x1589ea3d7c54183c8c2c6fee4242ac26f226e931e27544fc2d06b24d9b7d18a8"): true, - common.HexToHash("0x5901172ed4f4fe41cc76be64e509313f3dc05c53fd3407cf0ed5f61530506091"): true, - common.HexToHash("0x7a69407f985802a657327e91a19b30cd1f187558f985e7e445912270fb8e7c14"): true, - common.HexToHash("0xc8346e19e871506750c09a9bf9be881c0cb4591207c3bbddfdeddedf71b0b03e"): true, - common.HexToHash("0x0a7ff5f70c3c00af521768a499a69cf28e3995bc611ee82c7a41777fe40208e7"): true, - common.HexToHash("0xef9d2f53998abcdce539ddfea41e69f9e7ad795556c214637bed72a81b079346"): true, - common.HexToHash("0x95b2df40d57332e4f95a02644be181ad716b9864e97b35ef6a3ea29154f6e0e4"): true, - common.HexToHash("0xc467e68e4baed1e56cb34a3499b784e2895c8afc6862d9b6f142fceffb230c55"): true, - common.HexToHash("0x77807c58d9e27ff22d00a181900bf98020164b07ef1d27b3c355071fb21fa91d"): true, - common.HexToHash("0x3adc43f921c1f4e56f04bce2a19a6c9b5c29e1c95d6eb0e830b4859ca59eeb2d"): true, - common.HexToHash("0xdd3936fa5d37ef459921d4275550c76a9418ff96efff231788ddd891073b7762"): true, - common.HexToHash("0x221e2db7b0fdb16c4ba79640fc37350dbb2f83eda56922bc6dcb1af3f3e15b22"): true, - common.HexToHash("0x7a4ddefc73c07d337311f83ee8c60d98d9a65d94c7432e49cd98008fa96b531c"): true, - common.HexToHash("0xa79bc599e389757764b16a262a9ad9d4b2e4fb476996a5d9d272c42ceba53593"): true, - common.HexToHash("0x0ece6f6491f5c97e515d32391a9a4fc195baed1d4fcc938e4653451bc783c607"): true, - common.HexToHash("0x6378a0bb25e9da659305e4ef036513c8294dcbc81176dacbf4b0aaa28697321f"): true, - common.HexToHash("0x9d0ba5f5afe50c7210b357df866ca8ff6bb223024fa0b042520f0d9bd0f49774"): true, - common.HexToHash("0xff4f7174f66b07fb832509744b31a6b61d0f8ad22d527607f0ff63dd5f111fe3"): true, - common.HexToHash("0x72f0b0e572e41ee6913748b90c67ea8321d68202d87c561b38044f57ca972c85"): true, - common.HexToHash("0xc0a26160dc88f6f8398d455f7a5512526f3dc7f1ee6663e35b063172a2c10f16"): true, - common.HexToHash("0x479dcf950b9999c6e885b43aed02497091145f7a5819d658d456b75342455f13"): true, - common.HexToHash("0xec432223f7d8622bd249d3497c29e16149f6865633b0cfc68c7ab22101bf5bb3"): true, - common.HexToHash("0x96e76993de2d2600df273278159290648c6aa3ee79d1e31ebe9abb91ae9f0e08"): true, - common.HexToHash("0xb54c5ed2a06c0e18a182f1d1c16ce6bbcf01c05c2be56737fbee76827aa2996c"): true, - common.HexToHash("0xbdbf6301f9d59c2632287a93fc46cf5de38a43f54bb27d35eca064df2a508a96"): true, - common.HexToHash("0x17135a2f3eba9b2d3ee48971dcf2cb6e9a406779a46273e1b29a016d6f66a3e9"): true, - common.HexToHash("0xdf60968d885934d77647e93d1a4a6048b1ce58fd63921a05161e41184f9aa17f"): true, - common.HexToHash("0x621ae0d85256944b7e6bc320c7ab5fc08c942d56f7a4328a41eab2ad56ed7b95"): true, - common.HexToHash("0xb2bc841d554acdf57445471fbb9b5793b75d71421978f6b9a1fbe8f4b6f4e179"): true, - common.HexToHash("0x1e0ad5c6bbc5d406fdd98eff05e96a64a3869ee9b4729b36a7a1f2b8b842ddf9"): true, - common.HexToHash("0xd9169b41e9a614eb1b6dea163ad113b67096a3bcb695b1e869137c2bd36bcf4a"): true, - common.HexToHash("0x420812eeaf9bcd78c0d3d00938c2dfc61ff6f5523b159ed7e9202951d2d1d8fc"): true, - common.HexToHash("0xbbc99a4e3ea8ed416c9774fc196724afd233879d6c4db18f6f17394bc5a2587f"): true, - common.HexToHash("0xd6d20599784a8271e93dfd7b3ffcbb32f3ea156355177a8b9faf26579138ff3c"): true, - common.HexToHash("0xaf21832b1f3580f337a0f69249f91fd7cacd32b95ea0187da9566c0c0101c60a"): true, - common.HexToHash("0x3b1da42f13e301dd0d997109166e4fbb7cd37a7429031d5f2be6e13047c9e7ba"): true, - common.HexToHash("0x9017c5f83e503901a9c65967551d4cf7eb36b95a9c46c76c396fb2807e9576ac"): true, - common.HexToHash("0x46b9347b13ee900c3b24f2f5b9b74d5a77256ecf8575cb6fb9a8e6317740720d"): true, - common.HexToHash("0x681037bfc23a9aa4eaac483e4629ddf95bcffe84d77e15c3ca2a11540bf4d222"): true, - common.HexToHash("0x1888ec569bcce62a8fa6d7438403ac1135a8feec9697e54abe2fd353d912d849"): true, - common.HexToHash("0xee5c4301093f259e5136850eafd29737db04845d4f653f3bc156beb9de3bfd44"): true, - common.HexToHash("0x2805e956f220700002b3b199325ba7c45eab59594a18132b2c9e91bfac2e1cbf"): true, - common.HexToHash("0x5947c333cb3ca1d60ffc30b944af362476b86e354bf24d6b1277771eea48e4b0"): true, - common.HexToHash("0x71bc44d87ad718803a142e6b950b8fc693b22df05ddff5891c1c89f4d54ca8db"): true, - common.HexToHash("0x0fdf7494b7dd146f5332781599540f5310db51fc0bc9e9f36720cd276afd55b1"): true, - common.HexToHash("0xa7289c110537c80073f36c4146837dfd3dd9160862cd54aba2261f8c004be106"): true, - common.HexToHash("0xfe9535d908f2f31dd0081aab1f80c2538e1a03e00b1c9775c28287d8cee7a24f"): true, - common.HexToHash("0x059dfa84ecd9cbbc1f5fa8212233b5da25865448e13053e3f029068db45d6711"): true, - common.HexToHash("0x644752c043c277c03538f90b46b1b5438724f93a490b4b337607891ffb707b2d"): true, - common.HexToHash("0x7da06b41b433f568fce22adf8a2f597491bc7b7a6676ecd7ae36e43faae5aefb"): true, - common.HexToHash("0x25e917a1a7945e9c12434a393dddccb0add238af16296d21956c537553bbe36e"): true, - common.HexToHash("0xcd04b26d4f0b67a05b27e2dd5e6487ec2bbc3a434032709c60023c461fd0f47a"): true, - common.HexToHash("0x1655f4b9cec8626aff578b324756e416e96e48a9d4c5061851f669ab2d377ad8"): true, - common.HexToHash("0xa3680f7a814c1f5f7ed5fd07e1ed5e19fb1f536d91548a81519a0e5ca177cfa6"): true, - common.HexToHash("0xecd1c3194063e0a62be8ec3185f4a98c3bc3c98ef441e855bb4406a278fb811f"): true, - common.HexToHash("0x03f6dc8f027fc524303a326b1c7b159ceab871edb02ea31a888660feb54ffaf3"): true, - common.HexToHash("0x8132e4900b7afbc860cb93f855e36e830bf2d8040a7bcdac148ee7d35b8ed891"): true, - common.HexToHash("0x5421d1a854aab4fc39a9971a0ffc4aba202c37cfd5ff757a0c7a2d5ab38e83ed"): true, - common.HexToHash("0xaf630b3f7e81c7805eec40d6085447a16332553092cee030f424fa4c88fab99f"): true, - common.HexToHash("0x7ae31e842566f35242996f15295731411197981f58abe770b507e968b1fa290a"): true, - common.HexToHash("0xf821503a2bdc98101904d3cdfef67e5138f65958473523d701ab2aabe6860b48"): true, - common.HexToHash("0x6c7a05ec81750c8c5ab1f4db22812c5c8613bf7c5849ed57c0ed224d5e9493a0"): true, - common.HexToHash("0x91f47fc96edab1abd974181321570eed97331bab3711f5769c176c3aa7d58ffa"): true, - common.HexToHash("0x534cd5a2bbb817d87aa8b1d601f914503ae4bf24dc01459612d87a7d06e2024a"): true, - common.HexToHash("0x94955f1219aa05b1f9855dd1f265542ae738755e14770d864dff61219df9c072"): true, - common.HexToHash("0x7fbc2fc373551f900466dec6925021cdf81789d3911da2b3f0e847416f4f930a"): true, - common.HexToHash("0x7c71addc826d59cd4c919806b05d97f793d5ae34d69112cd9ec7a92df24d8b1f"): true, - common.HexToHash("0x300e5d9064fbd2843e65d24bf8051dacdbeb59845d019bae69b13502e060452e"): true, - common.HexToHash("0xe145b8538945cab3af830e3bb080923882f4f69f97fbcdad65a089331cb9e87c"): true, - common.HexToHash("0x682b1340553d31e418d9b80fb9eb2225a5332b2a358e3e34bb69c1b525297f25"): true, - common.HexToHash("0x8d6909cb7f59251c157581de99a9faffc974ee6f8b5eb1d3c108005456181625"): true, - common.HexToHash("0xabc5424d02013583ec06c3b83fce1d1df82a6d49f9de17448bcfebdead83119a"): true, - common.HexToHash("0x83a112dc792fa95eb2854d2a4094fdf77da8ea50491708764e243eea1ae1c042"): true, - common.HexToHash("0x4a20b8a341783604f20f8505ba7bb923ff7f382c43fc4b72846fbe045a6ad7bc"): true, - common.HexToHash("0x727893c136f0d3cecb52194f00c0cc663802ce3de05fb491414328e0627b4508"): true, - common.HexToHash("0x54a50e828854c87dd80f20ef492446ecb669e6ed497bb8c076dbac616bfbab85"): true, - common.HexToHash("0x9f3361201f5bb49f17d9aefbe81f9099c8f9ff84d9614032a15dcf6490ee6285"): true, - common.HexToHash("0xa33c36d542a33ceacf5d2ca11fbd3d9f6e6fb570d1ee020a519dac495d2e8b6f"): true, - common.HexToHash("0x47c487b19de3047605927dee21512cc02e254d1bdd1b0bf80b75ef8d1eb54012"): true, - common.HexToHash("0xf221f5e6a0a518fcaf1249c44e5a42aa4758c1cfc1ab626bf8e985ba396941e3"): true, - common.HexToHash("0x26b032e0d667dba076e7c948870b246f1177c7cd161946bae4846e5ed227e1fe"): true, - common.HexToHash("0x95937bdc81b6c87ee6073f56288be5bb5f2ded21948ea4f825a0eceb95bdfd3b"): true, - common.HexToHash("0xed77ea455f4e70f38b042e69717bab8c40642dd2902290b61d138deb9fee09bf"): true, - common.HexToHash("0x8a4b4e46c9672688a81c241c574268a0e6aa91f33c874c06451dc7075758e722"): true, - common.HexToHash("0x8efa4d46408d20b3f6184cc97231e1d670c72687609a06a7862bff58ba0bd8b3"): true, - common.HexToHash("0x381848f6e4264c989112b19ac7eb306cb3e0ed5df144c7118f7bc4f8caf13ec5"): true, - common.HexToHash("0xc052a62ec7508682a8aacc5e217b0f85d508fbbc4644c23f1a82a7dadb98b830"): true, - common.HexToHash("0xaf4e34a0bb5bc38345a571ef9ea61aee784bd38825fc11af80b3a41dd2d6da2a"): true, - common.HexToHash("0xa28d88193f478781de4b942ccb2800fd511a445b6aa3d4aab9caa7005fcf9d0a"): true, - common.HexToHash("0x84c7ee70b5e1c0239f953543bbf98e39074b3e7999d110d040edbb7d9e83dcb3"): true, - common.HexToHash("0x0ee3a772f5e8bb36dcbfb3fe3193dc7e03aab37434262f95b9bbc4b875830929"): true, - common.HexToHash("0x0b0f7426a0ebb92ccffd6c77ba010af61f41f63e0803c287d02f43ce1d3491d7"): true, - common.HexToHash("0xb1d72a2f4663778cdf3198904ffd816c731e6e7ebe338f085c479548d1ec0e54"): true, - common.HexToHash("0xb9d78c93342263de4914b3d1ac4eadfbcac28565f8723da24c0e0c4726a4107b"): true, - common.HexToHash("0x4484ad1bff1f235d90724e118cb7e8913ce6bbcb37ac0666a077a3025fdea624"): true, - common.HexToHash("0x5bdd6e925d47cd7e1cceae04928aedec6a42ba7e9e6dea1262d27be4119af71f"): true, - common.HexToHash("0x0ea568c1314265537c7465625fd6ad1c966d6cc93e88cfca8c94028af3a4cabe"): true, - common.HexToHash("0x7242c630f61cc83212061428aa709a10703efcd6f1eb99773cdb9bb74a6a365b"): true, - common.HexToHash("0xce8cf34fa4946aa37b881f16caf1573cc8918981c7cab4c77685639bf6ffb44e"): true, - common.HexToHash("0x01a91b017c4fe4834108813fa769b45f1522fbf441b78caa9128392b54141187"): true, - common.HexToHash("0xb7e145278a65be3e19e4995660dba9bfbd23c14f2e8402ef27a38b3cd2a35cd4"): true, - common.HexToHash("0xcda11023e47e2e97224e521f24447321b75260c433503e4cb75ecc81da94305e"): true, - common.HexToHash("0x838416619698a84bf9c4490b1451c57405d87127e5a27c7cd4d516fd1033eb7e"): true, - common.HexToHash("0x64eb2d2e8257e49875998dec389bd59bd1e92a4fc0be11098528efd9278a7e8a"): true, - common.HexToHash("0xf7f49e751ca290f046d4cdd7b02896dbc9f6f67d3fed5da0c6644330f58585fb"): true, - common.HexToHash("0x35c60642d4ba3f4f7c1ecc998aa5c0c6b4506e03c3ed48f06c4ba1ea0afaf8d5"): true, - common.HexToHash("0x4643c7aaed226794e36aed85eef8f5a7ff361257a2e5d8a45ec5362d203e2dd2"): true, - common.HexToHash("0xbcfd6c933a1f89ed2c5f168ae0769db0bc06f79ffe313ef1909438b4ca6c603f"): true, - common.HexToHash("0x94f8906b4f154260bd8a670d54b3fbea239023ad91492b18e18e1c8c0ae43232"): true, - common.HexToHash("0x93aef02179a165ea24b7eb10a90179af0df4eecb6cb2b80ec5a503830368be99"): true, - common.HexToHash("0xc4334af3762945bd8a57b278dbea32e351ec28ead0332f223e5799c4c67f1a3a"): true, - common.HexToHash("0x545ff008ad65f7a0669ede6cf4cc06ece3bff104edec6893a4c97355892addde"): true, - common.HexToHash("0x2df0300c96197f79bd9fe16d06021fb10865d445b97c90099d495816f58b357a"): true, - common.HexToHash("0x086d8e44d5567cb88e1c8b45aad19dbfab5843b9818c5ccc897a91049e1cf060"): true, - common.HexToHash("0xffa43b4940b0bde4462825a49ce247a45630c6562396ed129c801f63b9e87194"): true, - common.HexToHash("0x5a54a643e022df123afcf3b4564ac9c8b107d468a7b9e3a84d101305410e9026"): true, - common.HexToHash("0x02c9dcd9ccbae0df134f1693553ff74eb790cf245f1fe0286e8f77171be6449f"): true, - common.HexToHash("0x5b02bd195dfee95907c948b3158e6a9e414123a6343a98d2071d94a8d01f8329"): true, - common.HexToHash("0xdce706227ba225da9e5bbeff49b4ad39afa85ad03872dccedb53b5ddcb10231d"): true, - common.HexToHash("0x04d4ce9aaa4b0fb9f1844922e50d5071e1bcbd44b0a4d98e12804c7e53acc026"): true, - common.HexToHash("0xe5c170a65528a9e931795b5a4575669197c55e400d8450d0cd1eae096d0761c6"): true, - common.HexToHash("0xefac924040b53d538eea49db1b8402989c7d3bff4ccb1ddf02254c580ec9e3eb"): true, - common.HexToHash("0x12becb5bb66b899526f6d3c42d4af4ae87e6124c1e9c4b531bccb10deb2c3d36"): true, - common.HexToHash("0xc7551e1ea50f6ff22a9d162e8cd48a5cef8b672ca9b79faaaaa05cdff1a8b092"): true, - common.HexToHash("0xb5e80858bb5f9cbee4c3d58b50d05d0afd07429111f169e0bf431bb402743016"): true, - common.HexToHash("0xd6a2ec942c20bbdf6cba822060596f4d6728f8c186cfcaca90eb30c4b9ab6e4a"): true, - common.HexToHash("0x0826c8b3829ad9dc58de25502b3bbb7324366449baefc75980801fa344b7ea39"): true, - common.HexToHash("0x1a1a360b124632c2d6b16bef9efcae7aeef7c37fd8b4abbd28f0a305cd4f7d5c"): true, - common.HexToHash("0x6824a02de199092be7d9c229c92d167dd455172c2f6c712d56d0fbe84c5cc697"): true, - common.HexToHash("0x7b34a09adcae28c15052b72fdbcac674374911e07399735d3789f4178b15a68c"): true, - common.HexToHash("0xd9a13a3934a77ada5c4c3ff44fc495994782ad90b2524eda75d48213e1e659f1"): true, - common.HexToHash("0x10d0c06f5e59633082f7ddb8b33c245ab06d54baac23f430b9758e5f95bfa9c8"): true, - common.HexToHash("0x23c269150b5b603d1228398e68e26460385c8b7cf2fdd7c1937a3851bbef9dac"): true, - common.HexToHash("0x11c3609581d349e1f2368b24333db7550eeb2855f8a35d74de87b6117da2e370"): true, - common.HexToHash("0xf2fd6479ce8361cbd410961dc60d1f9cec2ea923a128b3b45e02df65c1174a46"): true, - common.HexToHash("0x6d791b73dce6d3429f3a8f2007b4bff02daa18315a593313b6cc55506b06c39c"): true, - common.HexToHash("0xbb3b409635339d9d532bd25aa62658a439ffdfdeab1b5f3f3c93c472be584f78"): true, - common.HexToHash("0x84ac71810db4a3eb68275450885769572216b7f2945957b08774656420aed982"): true, - common.HexToHash("0xed24077d878987bd8fa6c9c3ccbbf0d96880a8014f41a99ad92e227eadccd02d"): true, - common.HexToHash("0xe5f0244535435de21403c8d284c42a792dd340d0c2def77f9820c1aa5979a2b8"): true, - common.HexToHash("0x189bdfbc3d77573df93949bc3ff1b0edd2331b8bc0f193a1f3ff565efd1b1721"): true, - common.HexToHash("0xed4bc1c0b2a64de194821ae8d3d2a8e936d8b5fc22578b584ab76003958fc495"): true, - common.HexToHash("0x7670e54b48fec2cd5256c46610e98ecba8b385c64612ce6309c37e3fa2e788d0"): true, - common.HexToHash("0xd305513a8d04c968308b9d831e9f3d03e92979751af4420cd2450142d3ffeddd"): true, - common.HexToHash("0x2ccd1d4cd6a69e6b2b6d1752d1ae1454dedd7fed9679038782f0b8c1c2dd2a16"): true, - common.HexToHash("0x77a0eb2d147b1fc3631d9e0f11229512606a101bbf61b6e22da4f06850b7ff6c"): true, - common.HexToHash("0x6c595a5d21469220da1de3176297c05390f017c4455ea18c49123573f8f9a3a4"): true, - common.HexToHash("0x571d19614a3a7817461febf984aab1785c0cabacbcf6dc25b83568fa1af98990"): true, - common.HexToHash("0x1781bb9f2bc5213bbcd5b53d1ae9d131fb1eba11d92d5f7f55f0e30ecd52eeb8"): true, - common.HexToHash("0xa121d533de6cf5e7b44b1d50f1fc1ea60fbfb4d01eb36da76e3802c857389466"): true, - common.HexToHash("0xa47397e25f24548326ed1ba02ff4b4e759b94295a1c6242c52ddd9ea5190143e"): true, - common.HexToHash("0xf3cd6acc474f6a1b3d436243b4b6f63f2ee9b002aa23af3024a5b08bfcb3acd0"): true, - common.HexToHash("0x70c342873c1aa60b067b13f8019a14841be8eea5d27f98cc5a0dcca609fce3c6"): true, - common.HexToHash("0xc14cc34a9e0b0a1444362e30593eb099bef14becc4f5fe25b4e0f42b60d0f611"): true, - common.HexToHash("0xaac044e7d11fb1e8518d0fa80fc7024620848e43fe48986ee53edb99bd0763ef"): true, - common.HexToHash("0x146a442d2f637fce7e9da3071900bc345349091fb7c3e5cfee5139caeda784ce"): true, - common.HexToHash("0xe59e1dff5046bb98fcd3f500feddbfc14e4e4fa5325db340caae6ae31322e324"): true, - common.HexToHash("0x760431dddf4ee8333a9729d57a9ec3575539b697138466e3225a61811aa7a109"): true, - common.HexToHash("0xdab8a06aa581750cf3bb82bc7553e881253408b88a68fa722d3f6ec32e3e268b"): true, - common.HexToHash("0xdbc9abc2658bc57bf2c192d11e28010d24b72acb9c8976a8117a0cef01cc9c57"): true, - common.HexToHash("0xb9df3f5e3fa74749b1cf9e851bb482afc256bc74c9bfaf72a3edee94b72b144c"): true, - common.HexToHash("0x00dcf44449a821db89d33342d9715d811beb9cb16b014139a3df82333f0b5eae"): true, - common.HexToHash("0xa7d76d8d6b33d96f232034736567bdbbf11f91635a99f45e239fb19adf1d5a39"): true, - common.HexToHash("0xd69064ad7cdecb9708e5ae3bd5d89b5c90e7de31d9f7f71b5a7b248149e76ab9"): true, - common.HexToHash("0x95090d7a4b00c79a3b13f4bb4f22117a152e73e7048217f7cbaafeacd3516d00"): true, - common.HexToHash("0x95d5848cc6874b89a0de3b60cb20be49833d066eb5451a77d4453f6fb0beee6b"): true, - common.HexToHash("0x7dfaed7fa4b36b813819440cade70a7122cabd6eb0dcfba6bcf4304ee7ea1d19"): true, - common.HexToHash("0x1e494c35c9195463ba4448e17b197099070fd36c9215a25ab556f06e4445d8a2"): true, - common.HexToHash("0x7d90e2745ee1599b9420f0fc8a81246370e4949889d934169d21977ba637a1c9"): true, - common.HexToHash("0xefee0c16ce0c1c6defe0f4a573deb4f149e9a63eb757a5ece17dd05e0daba060"): true, - common.HexToHash("0xd3b02a54d724ee3d2f6c9e232e619ddeee7a8b55d735d69e3cc06f9122842ff9"): true, - common.HexToHash("0x06deb91fef1975972de40b9731bf837d2c1e6e922536c3688b085a5ccd0d5b01"): true, - common.HexToHash("0xae3256e54c3aead997b955b24abc89ebbbabe21083614a27270d4ccc8651bfa0"): true, - common.HexToHash("0xbd85b250a3bf23033d96f864ae2192f57dcfb6563d3e21c80bf6fe626104945d"): true, - common.HexToHash("0x57221148757b0c0f929877f0d294887439d55289fad3f16755f6b8f49af9280d"): true, - common.HexToHash("0xd283c745ab2190d2f515a031ca9f29a0cc99cfcd19d63956cf901c6f2d07afeb"): true, - common.HexToHash("0xd777cb06aa1d2542e9a7e3800d0c6d19487bff23c2ddd03088425e38355f8a0e"): true, - common.HexToHash("0xc7b20704def6480c1461d6577a5f751c5e42755cc7a52f3fc56c5d70bf545a6e"): true, - common.HexToHash("0x2643f8d748ffda1cfec373cbf9b2f0dc4c8d52dce0b5945c35e00d85cf779051"): true, - common.HexToHash("0x5ddd23347903fb46b95e2d38a060fe5bc5a2f4645ee47830b93979bbbe3e4db2"): true, - common.HexToHash("0x68bcd6122e002860e82ad5514408cd2d051e2df3e5d8545e3cfec3c3c1daeca4"): true, - common.HexToHash("0x98b20c47955cc4a153c06a779429511049b19773a5c01e0626ebc592805657b9"): true, - common.HexToHash("0xa2ad0b1c55b4e62389076c4ac340bff7c28291743fa67901d456e0afb14bc4dc"): true, - common.HexToHash("0x0fb9ad81a08c9a6b80b83d46b87df6d6823646ce67d41a64c9bad00d32d5b427"): true, - common.HexToHash("0xbb043eee257368f84b79d1d7b4c028e31e53b5b0ec607c8902e115185ac04758"): true, - common.HexToHash("0x044dfd560773e25442bd1bef27084a9dbd9abf3df8a490a62988fb98f89721ed"): true, - common.HexToHash("0x23fe01a90771591cb848d2506635d62e2a67fbb423ab96ab01a431544a513278"): true, - common.HexToHash("0xa08d19a7e46be60aaf7433cbaafd04e8e6ed18ff14abc058f70dc1d6e9ec7cc9"): true, - common.HexToHash("0xc15ad4573eeaa7220527f790d195f5726131e09798d574dd5dd1ab59e8771d3d"): true, - common.HexToHash("0x941bdb34d0de2985e3b2bbe2ba9e170a8421a42067a1725c89f17b5b7a3cd69a"): true, - common.HexToHash("0xec3d356902227c3813e7de1cdfbee09e7f75172dfa1449aa903671c96be433d3"): true, - common.HexToHash("0x850b3dec21d3d897927012b36821330035674b06ca733fddb1f0cc9d95af8610"): true, - common.HexToHash("0xe4defbf48ed98a310d0a5d8c03d9f9544944beeef04fc75ad497253facde61c2"): true, - common.HexToHash("0x9c20d498d8e0d548a5f16239cd301b7bda9ede6be3f08f635d0e07e283319ccf"): true, - common.HexToHash("0x6577e52f074745a21a41d5839c14258bd752b791b4bc37b459bc84deee2c51bf"): true, - common.HexToHash("0x56768f0cfee23515c068abf4dd9a6654fac6829c53d4f116d5df51bf018d5c5b"): true, - common.HexToHash("0x92bfd2d732b6fd275875e7c115770a9d82fdc0fe13f183325a24596ca861baf5"): true, - common.HexToHash("0xf63368c579f29d381b06420900d6f88a2d6f1ca0b95533e6f65812031bc593d3"): true, - common.HexToHash("0x116ce56823f70b7dbfbc6c7b12f7d318e8a22e05712233d6c4b2525ca8603f45"): true, - common.HexToHash("0x276dbcd8cdce2ea433a9d0e37c037cb1e10b2eba1e2a600db8d6f7b43710f9cb"): true, - common.HexToHash("0xb2c7134e1fdb6b6f21f96c18ff41cbe3d799591393145ed3fdedbd643bae4294"): true, - common.HexToHash("0x0e6128eb1d3d133c1c8ca40903a84d04aca94480916c07763e0eafb7c13301f4"): true, - common.HexToHash("0x15dec2878e96611417d2259c2091f45320038d957f0eb5bf4837f70e68ebec07"): true, - common.HexToHash("0x582173a9a1fde2b1e49394cfcf6d77b52120a4218b00fea7e92524b25489b643"): true, - common.HexToHash("0x388411923cde1a61cfc93c38591cdc05179ad40b95833a4c49dfd8a1c55eb933"): true, - common.HexToHash("0xe8398532b1dbe545a3d66f14f0dcbc7d20d1084541cf0fd0eb4dfae61068cbfc"): true, - common.HexToHash("0xa6d4170db06e38396ab30b4ef99e64a4ea315c9723db482405abf61a916aef9d"): true, - common.HexToHash("0x141b68a5263e6760aa9bf6ccf48cb8d290305f74ec6c97affbf9375559b49070"): true, - common.HexToHash("0xa7b3075a62f5e6537762583bf2af6e1e63d4b6cb7acbd50d3ec63b68da48ebf2"): true, - common.HexToHash("0xf770f3bdb7fa450c24a5307206df029a4e1cfe234f3f1f45e9b14818d02209f8"): true, - common.HexToHash("0xa5791bba7077589b92c5f2cd6dff7ef08d4fe770f23a2cfd224389fea167dc30"): true, - common.HexToHash("0x469c579916899b436fba0dba36ef054725d29420e209695d62f21f91eb073fe8"): true, - common.HexToHash("0xc9f235b5f6f89fb27ba1eb72f9bb245bb13168442e41c4607ccefe2289cf0e35"): true, - common.HexToHash("0x56b43606bb58881e93952a3f8a7488be526a0009b45ccf7875fde8b61f37a3c0"): true, - common.HexToHash("0x9760c4b4b3a693b7505aa91b1c42499cbb5092a838f32492a3c017afa5cb24fc"): true, - common.HexToHash("0xd7f5d225a88eb213e6d26c29c6b8cd4b8bec04d782fe5ca69d770eaa59d7503e"): true, - common.HexToHash("0xb7afd5c1bf912061b126bc0f3f7e610fa7bc451588a669fc388d8710d74365a2"): true, - common.HexToHash("0x9fb54e973303d9b1bd79f7e4526c8935ba86c4536804eec6c6fe64d8dd4dfe0a"): true, - common.HexToHash("0x7b3199fd65e4c1862914ee5205471216d96bd6428ec675cc84f8d0cdf481d791"): true, - common.HexToHash("0x84aee519a05aafcceee2040ca9da6f3f5600af3bb13e4af203451775e0622fb3"): true, - common.HexToHash("0x3c74e6063f556c2e14c03fd3b931a33580dc85028089052f8f902b388e349af6"): true, - common.HexToHash("0x620b8dc5623d1ab41a74c3adb974a3a7e67135e2a53143d75d7779a8d77efb24"): true, - common.HexToHash("0x5d3fb0b963da0a33c0dafcd12d2f87f60ba1c363e14550f42541e52a66b75fc2"): true, - common.HexToHash("0x9809e649ddcc7cdb12f11ef5d962cf0e5f4c198af0a358c735873193d726996e"): true, - common.HexToHash("0x6770309b4826952ff326fa2f7447d9a787a094d231cb538e851c13ab13e536b7"): true, - common.HexToHash("0x477f6e659dec91fbe5359932b79840df5638d48d627bb6dacf0cb7374e4926ba"): true, - common.HexToHash("0x32e884d0aaceeaaa40c8c764e176e5f8b38b836f1e1a78f02906d50ea60116da"): true, - common.HexToHash("0xd1357f46ec15034ada3e42cc2fb495960e2ffa97cb2491cdbaf80b206adcec04"): true, - common.HexToHash("0xf209d73fddb9b6d7b1d63eb6997e099bf88df72c8a7ea2265561bad65acd5f40"): true, - common.HexToHash("0x3b31db777c2ac41fffe618f18fd7678a779dfe25e9bd575d776b8467164d07a5"): true, - common.HexToHash("0x8f719f28ce94709d317c3c3b8e2006c05c84154a9bff5c1acd80ea7bac5e6add"): true, - common.HexToHash("0x2c3d72a36beaade24c99cdeb09086f25cc785d7fc87e34f23183f6cdcf538381"): true, - common.HexToHash("0x49c8c7535b5550138754c345c8347dbd9124b7a216e16241afeab71c2d5d3d8b"): true, - common.HexToHash("0x7eb7abd3e20680c2ca31ce0c76faeff30ef733ac7d992e88751b7ae886ccd5bf"): true, - common.HexToHash("0xfdd84cdc22c154ecb8337d20d6b3cad96585743c8c425a0dbebcdecd4a0f6855"): true, - common.HexToHash("0x5f8c3c84f665cdc1facdc4770c492c36b1f50ebdc8ba1fb1c02e70e854013c64"): true, - common.HexToHash("0xce954d7f6efc89daf8128b6bc1591dca837694e3abe841bbbb870a36797b8c34"): true, - common.HexToHash("0xce344d40000714b001a38d884d6d2694a55dbf4c945d50b456238f6d178587e6"): true, - common.HexToHash("0xccd212b4fd8e4f85cd687854925ff835e966c2689609ae00293be306f9e8c149"): true, - common.HexToHash("0x33c83baa5a98566a8ee9ab83133fab35d8a8f8dd0373903f6dbbe95deddf3642"): true, - common.HexToHash("0x02f19e4db983e83471e6c77a7b2c1c54b7b20199b4746d35756559957dd90117"): true, - common.HexToHash("0xa643f407b530cfef0c59ece2d5cf07189c5f6aeb754afc2e3f0ef4708f02aaac"): true, - common.HexToHash("0x0bd4f656ab2f3ad6c0435fe12cd3aba9346212c9f32ced37cb66b6f030b02d3f"): true, - common.HexToHash("0x7dc8fc45fed9ad35c551c6ec3258e378c83c20f2dacd46494ec3150a9cff03d1"): true, - common.HexToHash("0x6825e1c5cee45e3a33f76139edef0861dba890c2988c6350918eda37e3838db9"): true, - common.HexToHash("0xa0ec2daa0f8edf7f5cce24156370c320e0db03ac6084d5a814d31788bf9c0a68"): true, - common.HexToHash("0x53ea9df663012029c2f3f99e7b341d3e276e1f8d1de6c5b006571f88bac28bdd"): true, - common.HexToHash("0xbc76043c7ad270a2a582d287594f4c96a11f18a9fffe7e9cad44c84bad96fa99"): true, - common.HexToHash("0x8dbd33862741b6aaf467ef55a8fad1ab98b58576eeae779cc75173ded1a1494c"): true, - common.HexToHash("0xc968cff4da4b2630b3f1bbf4db3157abdc84b9ae83bd94c0f0d1c1593490bb7a"): true, - common.HexToHash("0xc01919073e08da6abe3a46f7b39c5289cab98a139b9f19dcde9d8626e9b537c0"): true, - common.HexToHash("0x4ff546ca65aae0afe4af744c516338189b2075048127905526ca69837f5dafc2"): true, - common.HexToHash("0xf72c2edee2e0938f18274264e5460b520f9517adc33ce0d8e26a7a3f1a0dec47"): true, - common.HexToHash("0x050c9fd3a11c5d4094c32f2268a7fd2e67e551bbd122a4da863c06d50e0da86e"): true, - common.HexToHash("0x9e49abe74c43c12925f7ce14dc353a283f64bc971a9d353f7eb64e4e3be47b7f"): true, - common.HexToHash("0xe7dad56b8bb42805c5457ff4d880fdc9a10abf3cb5d6acfa99ab62b6df22e3f8"): true, - common.HexToHash("0x232bc1dc06d254f99fce746cc3ddf85a574073dec78652213027e52a7b34f706"): true, - common.HexToHash("0x6162499270fd6d1e95a0e30ac2e0bca690d7606671c697e24446783e37c0f214"): true, - common.HexToHash("0x0328d9a86f6bb13609aea9bc5cb873c3394546b05a83e6ffb24c594a77980f34"): true, - common.HexToHash("0xa8d568bd0b4bdd8aec8ff09e9d5a3c4e58381b02bb97f50badd7487e249c6c51"): true, - common.HexToHash("0x52a152cc871a08dc140ee281be300c4b7af06ef34a03b104a7c49cb878aff017"): true, - common.HexToHash("0x3deb85998b04b14d9de20fc8dbad7cc167dc4a16b148818f9b0de37f01bcca57"): true, - common.HexToHash("0x2939c0195d624ddca272455c59052916c0c40b43e337452bb20d706fb8dba8d8"): true, - common.HexToHash("0x25a5592b567c5515f01fcb4bf47a0428cbbbc679713e4b0b24c40ba7cf462dca"): true, - common.HexToHash("0xdf44a903dbc591a83e9d35ffb4f8160a03e17c00b948c1574bcfc00c872313f9"): true, - common.HexToHash("0x1a4906116e4e88f87534ab97c4d6d07ce572cce6cd57116a68dc17508a39b066"): true, - common.HexToHash("0x20203a119f1bd46e0ecc30e3b4f042823b0f7db6b367b9a6cd6f05cdb26f073c"): true, - common.HexToHash("0x96b7954f6638adc85b1a306eb1f6c346fc44d015685ad674b8f9b803d2a4e87a"): true, - common.HexToHash("0x9a8b07da5ce685dc9d71ed37c808ff43b21a560f4b056e7602c81f5a12aa7794"): true, - common.HexToHash("0x3226a878e6c71bb5f0c008a038cbedb46b5dd705b06070b016d7c5ab20e0a299"): true, - common.HexToHash("0x58e1b36b1007076e6d7f3d0dc7c8c6dc333b2d2441a628d73e4beab0a0f60a75"): true, - common.HexToHash("0x95c333665dcb3e7f8c9beda22b9e96f6b12786ca7cb841d27f840bf1829803f7"): true, - common.HexToHash("0x219e25391c5742d062300f7872b28f237e54f45ac9ebdeb550334924d39723ab"): true, - common.HexToHash("0x7eac5f5e2c4ccdb5a0cdec178f70871860458297f08d94a812c8131fa3100000"): true, - common.HexToHash("0xf785731d0c27ce181516cff244bb08c4f8595b92d13b2d8304fa4e0f64150fb2"): true, - common.HexToHash("0x92666ab58d4587876da3b58567b6724bce797fa8814acea921b51ce13a3c9f4a"): true, - common.HexToHash("0x331587f900f24f8dd8a98a86f18e8ec6694b6aae01b13093c0e80de75f0af7be"): true, - common.HexToHash("0xda8f7798910a4093ee85ba8b8cfa7801b20ee5d75e26729abe3900ba4c0a6cdf"): true, - common.HexToHash("0xed9b4d15a71ce1ec0d27b4753610f8e97ce70ef0e7525e23c89c5b7b2b666ae5"): true, - common.HexToHash("0x1fbbc5254ce4b89be1b920eadc1811d6fbeb2b7cafd21bb316cb0aadc96a2113"): true, - common.HexToHash("0xb4c9553b2ed671eddd4ccb9fb616f3741bfe18370c7b024c6ca9b888dbbc7e6c"): true, - common.HexToHash("0x9f99fac4fb3f010aa3ea8427fa639d5ea2445e21b7780abd1626d1d59bad1b32"): true, - common.HexToHash("0xbe24d6e3160959b0641d77cab6b64d60ff6b207b35c4c58c1cab4b5376fd051f"): true, - common.HexToHash("0x3e73bdd2a71fdbc72d71e67f1255ea69720acaa4c4e69ba5c87ee641dad72532"): true, - common.HexToHash("0x9237ba16d134c1debaa0f20afe5d8d9a77a32d276af2531a509c679b2671ea35"): true, - common.HexToHash("0xa965c6999f4689e0022ad48494545ac3aaca0ccc8553ef8f90ca6d291e572791"): true, - common.HexToHash("0xe018759f58ab3916703bde7311a1fc7699a6691b7ffcde594a6d6e1ad8c15527"): true, - common.HexToHash("0x3e4c47896ca3df14075b69a806c1a6793b308d7e6d3dd91a228377a4b494bde0"): true, - common.HexToHash("0xbfd742c3952c3b13789eb13016d9c1a9f9cda6e4dc917a7fc903ac9e744afe6b"): true, - common.HexToHash("0xaa4200a9ec183684b5007f0aff0b5cff88d68dc5bfbb75dab04a9621f9553252"): true, - common.HexToHash("0xa31ce348adef03420f9be75fd67c66ddaad8a75aa17f25e3ad0f543bc2ac6a0d"): true, - common.HexToHash("0x200c172921b5093fe45852ebee026c16a7e6dbb51ecb32c39530d4c99bc4c959"): true, - common.HexToHash("0x8e6b3d0f7db9f55f779eee7070bfc36e287916ccf53809c60bd6cd0c10c19bb7"): true, - common.HexToHash("0x726107ecdd7cb39bb36cf92381473fffeab6c58a283892651b945103e736c271"): true, - common.HexToHash("0x9028b9dca10be4efdc6471e428e70ded8784ef18b4429659165ad630ec53e689"): true, - common.HexToHash("0x2ec64e33f129bcbff1231da4ccb059e6f9864d2d8461cb15a306e5f018620fa5"): true, - common.HexToHash("0xabb2f35c2cdb700c083f6524ee2aca84b9218dbf9e18c5563cbbed3523d37bc6"): true, - common.HexToHash("0xb7dbf27e033c62df67201bc65f167d055bce2e31a33e974ee4f57b49b0c1eb7b"): true, - common.HexToHash("0x6352252c3e02f7d370bf7a4e2aef92376991cf125e5fe13dccc0d4a62f782121"): true, - common.HexToHash("0xcd9506352f2e7b5026172c54321e231a829b48ced1aba7daff02580b31b6ec89"): true, - common.HexToHash("0x806fe5b45837427f86a0c1859cd3b86cf70d4696e97eeafd068de91b7a9493b7"): true, - common.HexToHash("0x76566bf1e7a72f3ac872ba0262c6e842c1d8288ac5e9f9e4f2ff0bf0323544e4"): true, - common.HexToHash("0x37aa1b69b36ce3159f284e92de597c7a09f4c5b2e7f876c9e18d395447c8c9d3"): true, - common.HexToHash("0x244849a69a2cd9427fa170b3b4f26dce998bca0c4075497a7b5b8aebf29b7d77"): true, - common.HexToHash("0x863beafacaac7e87bbae35d65ba4048562088f8a2f2ed5fa07aef9aa622dc05c"): true, - common.HexToHash("0xf357b02dd69d013ca9c9fc6d5eec8e3bdb3c324c094e0d3e73946c32153a1472"): true, - common.HexToHash("0xa6bd708d407d560c61761f3e7a9c67e58ddb251616d92cf51277282ddf453b28"): true, - common.HexToHash("0xc9e9e1549d5b358f8b8ffb30047fa79a2572ed5953f3c0416dde60c167814749"): true, - common.HexToHash("0xe06bed9258383b7fbf7712dad9dfea86803e776bcf2e73b6609a3f5f977bd1c7"): true, - common.HexToHash("0xdb294d3394bfbc0ea5715b06b36e706464bfaf3b072d4dc0b8602bef6c4f7ab3"): true, - common.HexToHash("0x47b34fe04d7fcfd648151b30478f7598a3cb0d0f9a19b429f6b7606aa21c7848"): true, - common.HexToHash("0x32dfe2f981b26073dfb90ef2b2722d64be253895055d2828631dfcd761ceb885"): true, - common.HexToHash("0x0986f10e912df70b1660b12d04ea3c96468ebdc159e2cb659a959d7bc4b6a8ba"): true, - common.HexToHash("0xda47642caf763ed5d96a80fd447b702c380bb0e9eaba5a1d7edb53bd748971f7"): true, - common.HexToHash("0x73f1071af70152d89ade311fdd9e3c0d11972d828196bcf975590ae29f7fd65b"): true, - common.HexToHash("0x9e09c1e886251a2d1898cf4f8ae8facd55e7b9b0304d7849381b81abf2649f77"): true, - common.HexToHash("0x5802935924d8ccba1ef1459b6015e702d2de31a47457fb4915893fa3b575db76"): true, - common.HexToHash("0xa2b6fb0fcd7fa47f37e30129151fe5af643bafd0986209db5fc4c74c5348adde"): true, - common.HexToHash("0x2cf4ec7576359c6d3f506ab5d8d738a7d334481642f6cc0d722d6dafc7576f27"): true, - common.HexToHash("0x70fcaec40a1c954e88f7bba1d4f76feee032c5891f3f5ed439a29c7931e414f2"): true, - common.HexToHash("0x1f9a7c5093e497e4d121d96e5abfb750fdf6a45955e1f729998ca9d90f72d109"): true, - common.HexToHash("0x0347225c6e7b933fce84274b29175ab007b5a0bbf29852bbb86bcd0d39fdeb3d"): true, - common.HexToHash("0x96373dc439c434b4f8ddb8edaacf0ce22c3ec2e06cbb111ec699dc80d56b1af8"): true, - common.HexToHash("0x8b99dd2d78bc1bda6d858e39bee52dd90fbf1e219bcd076d9983332bbc577957"): true, - common.HexToHash("0x5597bf971ed420763e74c1baaafeec60616b94d36796cb0fd82769181e69b0be"): true, - common.HexToHash("0xddae7858200892bfcdc1814dd26061d4278ffdd3ee39110d68de5b9241d22c4d"): true, - common.HexToHash("0xe189e0884feaf93ef8b7d66977aaa006e127c13d87d05066019d15dc503784a9"): true, - common.HexToHash("0x66cdc9984dee4d0f57b9a2d41bd30eefbea6bab4758b4832a146757e8422f7fe"): true, - common.HexToHash("0x0bb3996a1e734ae3fe3f56657a8887583c22ce37b15a5339894a296367186cb0"): true, - common.HexToHash("0x87ec088a2b63e61d632c00bdb4e3a474cde96a93545a589205ac661033acb18c"): true, - common.HexToHash("0x7f49af48ccb1e379ab9f1c236fb3de416c34b7b6b4a8d2492d79286027e0779d"): true, - common.HexToHash("0x9d81822c8796bd08ac3b4188668fe34efec031f25a4edc6b9e0cf7b2c7b2048e"): true, - common.HexToHash("0x5446c5b10a33d95a30131956b97cd009da74e50f38c379d2a1e2784e8fa93fcd"): true, - common.HexToHash("0x12aafe76d9a3e9495f8504c9c6c3efedac1a51b59513c52779fb60fe62d888e5"): true, - common.HexToHash("0xe9f59aeb429940d4d8209f19f93d643d6906ed7e49189c376fdc2ae5576f257e"): true, - common.HexToHash("0xb9f8c1461078b48a805b446d3e9ed46e1d8ea7f2a0ad21c03d529bfbb6fe2d52"): true, - common.HexToHash("0xea6d98faf7d84138c421f9dddb2142c10c05dd636edb567e5c7dd6cb46947e2a"): true, - common.HexToHash("0x62a9af03898dcaf8cbadfcb38b46d9698147f32917b4f4e8afe03e6dc908c5c8"): true, - common.HexToHash("0xffe59d4ada1a4f8f2bc8b2795e85bcc65dd2c07f9aab2e26fea35b49e8888ea3"): true, - common.HexToHash("0x89946c502bffd1e4191614a85f00bf8c61c3bf2e36d6db651ca3d07a85c8e931"): true, - common.HexToHash("0x7fb63e8acf62699bdc7784b5ddd6f6fb19e99e21de350b9583342276315dd746"): true, - common.HexToHash("0xa816997c83a8d11075f2e4642e620724d44516346aabc7d6495b2c47fc020f17"): true, - common.HexToHash("0xe372c4d3dc170e2d29f27ab150bece46560958910fd4db24498211414dde4a29"): true, - common.HexToHash("0x559499a6da9285026309fe73430783f0543ca97eb5e6a4c7790edca36c419886"): true, - common.HexToHash("0xf4801a941a6b32d64c19aa5c3c7e4e83dda0dda533b93e341a9ab50eacea0c6e"): true, - common.HexToHash("0x241c493662a8f74cbbc35c68b02e1902ec5446038aca9acf09873ccf02c86543"): true, - common.HexToHash("0xb8cc30d618b5e7c4de0d5c0e14b28c2c92efe98ff7cee37dd44d7b3397a88117"): true, - common.HexToHash("0x1b728b8fa0252d2fc581c9b11aab615420c1a956fcddeb0ceeaeaa44d4578ff1"): true, - common.HexToHash("0xf1f173677e465ab8b8d508b4b6feb02144ab9ddabc16c121359dafa77f35e640"): true, - common.HexToHash("0x6b74209c1009af5fba6f6b26b9c8ca7794aba3b9f103c3f0120dcc7637fe878c"): true, - common.HexToHash("0x44539d472128d052ecdfb1b9a9c595343be3325147dff18ba9c3b8ae13672b8a"): true, - common.HexToHash("0x886778dac8b76d8b59fcf4ce122266bda427f3ed8627aeb441360d25b17b5c58"): true, - common.HexToHash("0x8d7be1c2f7ce80d689c90202786acf267eb6f7e2c8b54ad47277026aa2c01c80"): true, - common.HexToHash("0x7b08bae17fd59f3c462e72f06e4d76de5e33b114b84659656d1667189bbf74bf"): true, - common.HexToHash("0x85f750fce2be408ffc5ca762e47f29367a2210b45f10ab21e5589a3cef0c05f4"): true, - common.HexToHash("0xf96796b862f0d70b719a1f64659c7e476eda4369ea3eaeeb448c8600d0664ece"): true, - common.HexToHash("0x5cb7aaf532b563789a61f34bf11f3fcbb843d2f8183907e38f4afb1d8f3f2951"): true, - common.HexToHash("0xd38ae6031c5a2c53ab7e9fc210205cda07ca9222fb82b2c5aba7db191abf9945"): true, - common.HexToHash("0x8da36a256d7123ada1356ca077b0cb94ebf7c9a59830e4266e8a2309167cb892"): true, - common.HexToHash("0x4db79cb147961dd03a5258f5e174c3345b6a4fc11740c6dd591f2064c0dd4da9"): true, - common.HexToHash("0xfb018c863588236ba96ecb6b65252378e60f7aeb4002a40b3528d448773deb02"): true, - common.HexToHash("0x2560ca2a8c44c951797ddbeb64080b67dca75a14f299262917497482f416cc44"): true, - common.HexToHash("0x042366ddff7d1614444564b1f327dcb07efdfd95fd9904099947e916a9a23300"): true, - common.HexToHash("0x886f61f95893402bfeeff08c253c8ccc31170933db94ae27812473c16e566e8a"): true, - common.HexToHash("0x357847f01be226b7e2d07283f0a4a167f20fb23c01709b6a32ae3813b603154b"): true, - common.HexToHash("0xaea9de6fe0bcb9894aef4957b2389e1fe6b030619c66f1dcf344fd4de3598eb4"): true, - common.HexToHash("0x49299492642bf40731738ceb26ab98cc8108fbda671c2777edb4211f847946aa"): true, - common.HexToHash("0x5b878ec43c3a67109d5d6a87a0c97bc65d451ee7e86a791044031135c02e6918"): true, - common.HexToHash("0x28dee1b9ed41a721ff35c338648a1f640f3d70451e879c50d5654e2da8a17c77"): true, - common.HexToHash("0x1b7e7084646bd8f6018005ed5390c8b5751406b1a8fe85dc6b100e60cc6de19b"): true, - common.HexToHash("0xe53b35125f87aa5241b481a484c201cc225d29b11eb095e5023f8ffba95b7393"): true, - common.HexToHash("0x21764ba4176a6616f502f2060e1d7b3ad48e534a073cc0607f97f5b1e05c94fe"): true, - common.HexToHash("0x1d792e2be48c4f7bbb96f9d9fe3d6b85f02141eb684f1afd6d87284c7a8d8e96"): true, - common.HexToHash("0xc9780f514770caf59acef153d8f61bd6725645395ed85d5feab26f74394ec04b"): true, - common.HexToHash("0x5ff3fce2e046f522623e1332ecae2c670401d59392acab74798e63f59cf0fafd"): true, - common.HexToHash("0x78c80a3c747cf413e9369cdeface857d1c5936654231cfbf3d36b6a7215a9598"): true, - common.HexToHash("0xc49f68aaf42dcab0d1cd8150ce92eb37ba77914f225628045cc532525cb9a91f"): true, - common.HexToHash("0x3a6abbb2c57102197fd6af4de605f45e6f46e2db1b8652ad0f230b2067ccb687"): true, - common.HexToHash("0xe0794ab2ae7d694dfce8950c85e429459a1be428c8583d6743946eb8247877e1"): true, - common.HexToHash("0xa2e96ce8209458d4e028e002ef494b8772282673806ce38616ba92c4096e0eb7"): true, - common.HexToHash("0x1c235ef0ed61c0f2d15913746ea08b4a76b4b4aae8fed859a296cb6d075e30da"): true, - common.HexToHash("0x51a24434fc6d2e5a052964d47e30cf738290ecc7e526ef5c301b62d54a6b67d6"): true, - common.HexToHash("0xaccc9b11ead907e19fb168f0d1d4adf7b59f375b1b7519d207e7eda3bfd164fc"): true, - common.HexToHash("0x15353b48cd895a63258e54a0ae74e5752bbf73a820b887c6dc0d729c87c4a9bf"): true, - common.HexToHash("0x7465d3c26cfe986534f7118a89542cc21bf606ea8f9efc0e7a84d1f0546c6e28"): true, - common.HexToHash("0x4697f98acf123951c31296d32c0639774d4bf1fcef24709b13bffa60344807f2"): true, - common.HexToHash("0x4f98583985c7803128bfd3241e696fd8a2b047701c56bf8776efe2ae3e1635e0"): true, - common.HexToHash("0x88bca7bfcf9d1fbf080b81cea9ca46c1def0a7702e418e2323e7e83e0d768b48"): true, - common.HexToHash("0x9de2c7a157c31965586030a85bcb8735c80a8daa256f450ac5fe190c3aa1bdb2"): true, - common.HexToHash("0x3ece6b59b7e9c5154204e77d3a464e3a1c8f5476867af52655798ba9ee36631c"): true, - common.HexToHash("0xc42655d7d24fe01c8930b27fdc5dd323f4ca7ad6e06a5f33f1de0f5c2fccfa26"): true, - common.HexToHash("0xf313543dafdb0a7694441fa3fe74edff6adfb8f224899964b445192b2dac86e9"): true, - common.HexToHash("0xaa226442f24140c4e09c1d180955f6685dfcae5dfbada255965e761805cecab8"): true, - common.HexToHash("0x875e8db848af7b6a05d22c13176f29d6c8862a64da9df8eb1e48225a65f43d3d"): true, - common.HexToHash("0x2d4eb50499394dceb3fb3f8b08897f6604bed65414fb59102ae67cab9b275a94"): true, - common.HexToHash("0xc7dfafecf93a254a9d49439f91e5c8d53e5fc6052b319175eac4e6f8d6e94115"): true, - common.HexToHash("0x26e1377a32efcbd538719174843a1c22fd88f3454e25bc72b4666ee449974262"): true, - common.HexToHash("0xc58b4ffd53dd86c908adb58210a5420c33af0aa6c28f37c045ee2c70919e450c"): true, - common.HexToHash("0x2ea4ead79f638e717e8e2f2f06925e735f7a9f09db95f441ebd567f9b2579c4e"): true, - common.HexToHash("0x0f066384cb016a2a548ff934df2f2aff45e4ff23afe32fd1291162be917547cf"): true, - common.HexToHash("0x18bd2ae0561a3411660fef4087f3324118578df11c5f0dbe4546abce37f10865"): true, - common.HexToHash("0x0baac09b1c7193e7c90c6ef6553f92aa755b49302879c183f7edce21d4039d0c"): true, - common.HexToHash("0x04a632f211d73bfa013fb5eef912a6ac70cf6438374caeadc8f61fb7b8bfb1a3"): true, - common.HexToHash("0x10a0b69248bfe8daa59ab3fba5bd74f46a29552989199557b98793b81199415c"): true, - common.HexToHash("0x1139732d13c75babbb0d9b178d54a5da7fb64879de0ec504386c456aa36c3617"): true, - common.HexToHash("0xf60104b0dd2f3505ab8d502d2848013e83edf403dc617dac09e7c9c367b72d17"): true, - common.HexToHash("0xbd1fe8d6da71b8d5d8368c29470db4b747a92c5dbd9524ffa6395d9d7d807dc6"): true, - common.HexToHash("0xf1f51849e656453c36395806d945ff8eef2786a6e09aff6d8b00c71bb733d732"): true, - common.HexToHash("0x1f3bc9b06e1d6b7573ec76dec4b3b351264a7b674a7b832d10e9ec3e797e4c07"): true, - common.HexToHash("0x8963ecca93a06ddf4f58518b1ad1e984d07c9bed08227dacfa2ceb2664d2335d"): true, - common.HexToHash("0x96ec872759934ae2162d41290a76f1d81a0035bd9e27d8b0ef2e76884ad0c253"): true, - common.HexToHash("0x0d9437b22c4efb03362f1e3815acbe33e4bf941406bf0e2ef79759b08309d934"): true, - common.HexToHash("0x1eb4acf9deebded26de94b17ede285cbd5a0a0e5dba4f2f13ca94a3ef2608598"): true, - common.HexToHash("0x93aa683cdf0da08387227f0eda5e0a0f87e0bbe912e2afc218c89854e3be108c"): true, - common.HexToHash("0xa283f2dbf8dc7c70ca436da1b9764795996d7853d1a87f23df05564e16ef6e2d"): true, - common.HexToHash("0xb915c938779a8baf37b7ad90c295a68eb1d1706eece45798e75a2d9985e6d0bc"): true, - common.HexToHash("0x02dab0b2364da882312f0b9458cd8cfba9d74f54b14b8b3d43f901bfdd72d81c"): true, - common.HexToHash("0x2bde4edb26d6ab52c51c144fa7726ab469ef820505a0ef6c466499e759aa75d9"): true, - common.HexToHash("0x0dc4163788646b39bf8204c3acb2198305e151836fc96519ab435e0e82f3e172"): true, - common.HexToHash("0x1b3d5332bacca5380a1cac1fb8b3eb81e8a09065dbaa1df2e14c484e75946c6f"): true, - common.HexToHash("0x81c979ad3fe7557fdc7968f5fb2b578ed901f7663bf003b75d45ed0098de3c3a"): true, - common.HexToHash("0x7dada2b150610e1c51f54b5a28846d02569ae058c320c032c009cef32f8904ea"): true, - common.HexToHash("0x23cc9650b3b588a106deb611913d472b36e87460f846f516d7f55f3c62e41695"): true, - common.HexToHash("0x541aaa5f0741d14e10e65643676e293c7c014f14a008a03207f20b929c71e81d"): true, - common.HexToHash("0x820447db9ba661dd230ddac2b532919759ad17f99e41d89e40efaa4dc0cdd6a2"): true, - common.HexToHash("0x7c6872be09481e707cc57ccedd9ce3abd0cf63bd2224214ef9f0c3a4bf2c0a8d"): true, - common.HexToHash("0x7e464cac45f6412d6b470e77fc1995fc1cc79451918c7fd920de7431c34bd221"): true, - common.HexToHash("0x6bff8e2d3962f263f64fc218de5cd414649671df1b0fff074caf2d8ba3066b88"): true, - common.HexToHash("0xdac07bb308f2739967082c436b5d879910b6f1951f48553e69b5e8af3f0797ad"): true, - common.HexToHash("0xbeed61f3dc426c7d0e480b91adb27e81d62e9667ab390a22cf1215d60864ab45"): true, - common.HexToHash("0xb7f61be8b8876d55fe74d224436a1d4e04133540543711ef3cc1e795d997c394"): true, - common.HexToHash("0xfaecfc53405465984b8865ec7674a7f57b1b582575b3e31fdaaa7e344235f5bc"): true, - common.HexToHash("0x56a6e59283e9bea6d794a4fe24caaa0bdd0a099cf43852cb14ce005e3a632f6d"): true, - common.HexToHash("0xbaaa8d02bc81bd62fb83c8dfc493418284e8a5b45029d2764ae709e336cae5db"): true, - common.HexToHash("0x3b7b206a366d5d3ba8d6838ede001b0bdb2d5e7d1365c3afd35939cf472a3486"): true, - common.HexToHash("0x9e6198bff45a4943bbfcc16e2902f3a0f7e2cd005b1cd99321ba9220630e275e"): true, - common.HexToHash("0xb788eb70c99238adea02ec8c4cf0b9d984f4e6c6df4038983ad3716ea64ce793"): true, - common.HexToHash("0xb51b0b5c747ba34b9ab9552e57475b6afb9db3ef002419b27873f1c6218d0af5"): true, - common.HexToHash("0xb8ca3d57971f0b95091a09ac00650c4807dfade1e189786d389d0a2bf2fc2990"): true, - common.HexToHash("0xf491034ce86325a5a1fccd2d92833ff08bdfa97cd184ae42c496bc11c058fa2b"): true, - common.HexToHash("0x1c19d95682bd740d8bbd3fa1dace3289e1839d0cad977686a32dcea397fe772d"): true, - common.HexToHash("0xf896ddce3242cc1a30e9ace9a0ea91fa04e0497fb4b6b54735fe50ef780bab08"): true, - common.HexToHash("0xe46e78940220a56819b9dee1822ae91c1299ef07c801d0b8af2d912e7de112d9"): true, - common.HexToHash("0x0cb0e214e225d32606f44acd6e2d9ccc34e0eed8b19fb56188bcfe32bc0a9191"): true, - common.HexToHash("0x4aa27ea70f692736369afa4a4837e29a7ec87512dd554388b8e7e86272fb6f80"): true, - common.HexToHash("0x0ca211ccfa8caa23ad17b107b6120cea78092e2388e759e11abbf4c1f3be507f"): true, - common.HexToHash("0xf00ca444c751fbce2fe552486de11170cc0c908ba2db3fa30e5508fd67411cdb"): true, - common.HexToHash("0xa239c0b23cf219b700843a77f26e4db2ef78679dda03e42b20d3e507f7cb8fed"): true, - common.HexToHash("0x709df30085afb2c5ed6ee396dc12e6fc01100a5d478dfda9b13f69d58793c702"): true, - common.HexToHash("0x324d4dc45a69741796745dac2c1fcd73ab7562147c15d2fb41ed192acd890729"): true, - common.HexToHash("0x7695c61224dedce27e51f6d2af0aa4b775758a0674dd64512805ea09bbc10b5c"): true, - common.HexToHash("0x5a4580abb2a47717a2198871fcd0ae639f0af16b5157cdf235440181626b077a"): true, - common.HexToHash("0x23e1377979cf91be36db935ff85ee206c268dd287eceb8aaab9afe125731be54"): true, - common.HexToHash("0x2eb8c86a155a000e29488ebccc5cfafd3e6289fff0806d1fad581eb8e477c3dc"): true, - common.HexToHash("0xcd8dfec9a10411b495fecbbd15748a4b55351b72671a7ce61a7b67759eafdd46"): true, - common.HexToHash("0xff4eab1458bbc774183082237e668d1c0406fe147caf9a54698e92220bf4de34"): true, - common.HexToHash("0xe2d1c6747f2e98bfe09d213f2032ee61f57ec6d1208aaeddb1570689a771047b"): true, - common.HexToHash("0xcf4474d465538d73840d94a2a70df7204e942e4ddf7d0c0ef4c836321b0e6d39"): true, - common.HexToHash("0xaf670c8aba387f4a15c8333bea04dc337bb9fb2a70415752197cb1051af69a4a"): true, - common.HexToHash("0x0055877e3a3b63fb2f5981991305714c740253dd6735df91f66fb54ed88bc7b7"): true, - common.HexToHash("0x0bd863e94918a3681b0d6c22da865241bc2f004876ecd545bc46db84eac52e4c"): true, - common.HexToHash("0x1d86ab895be70f7b804a7ce6e63cc2453984887f703e914152590a2c99cd3dd7"): true, - common.HexToHash("0x0e3ea0cc262ca864ee9bca0634c6ce0394ac0d0fef78185a4214bc4a50845289"): true, - common.HexToHash("0x0c0a1dc0658ab905eec1e92a3e8495d3b551f32761a5cfdfce3e5b64b05885c0"): true, - common.HexToHash("0x2130e29f2b16ee0803f38f2e97f278ae63d4f2b071ef3614cf2b137b1e68e2b3"): true, - common.HexToHash("0xa35792c1bd02098729999279503984046acf8e75d6d8b64bfef66696368cc9b4"): true, - common.HexToHash("0xfcae3d8a9760eaf1a78d47333a68812a1303ccc6728949c99f7c5d1b01009782"): true, - common.HexToHash("0xc979abae2fb24d14db5bdaeca333dbe5884a20fb6bdeab85f8eefe99ae1f6f5f"): true, - common.HexToHash("0xff72c74e6e2ebb695cf0b815183136180f0088171e4a6d57482f380bde29fb34"): true, - common.HexToHash("0x549d2f7705424a62c755112c08ea070a98591d84d819f143827a764171ddb57f"): true, - common.HexToHash("0x08ef9a942b80a2fdf8bca060df2686b3706ad78be1da7bd60304f32df1aac1ff"): true, - common.HexToHash("0xac219324ca29c767317cfea9de2b55195ad4a720fbbf2befcf9aa674a40fb3f6"): true, - common.HexToHash("0x04495b9c4c145e7aa4aab9908be2b7931a0d8beb91265ff2e7df8393c3acfdbf"): true, - common.HexToHash("0xe21d2adf90e2bfcc6a32ba60b582fa5bd1b46cb0567360a03cf25be3c9ca9e32"): true, - common.HexToHash("0x019999dc1491b0bea7afa454065c773159fcd8045d57f095cbeb18d87bfecf33"): true, - common.HexToHash("0x552e368418c18e3bb173fa7b9d8d27adc9ffa8d02f98d525d0b96c8f6ffcb3f2"): true, - common.HexToHash("0x96bba0118dc7587ca0be5109801210a37b74f89a27243828661a7f0b129cbca9"): true, - common.HexToHash("0x02728b9cca6ff0fd28d60464c5334d93b5b604713bcc25713de41b48cd606b96"): true, - common.HexToHash("0x047b1406fdd79197b28ca1d0764b7acf3938515efe52a5b860a4573067474360"): true, - common.HexToHash("0x6f2dfd7d82e67ea743fb57a07175bff7c307e2d548be91282a3e89d42e0ff16a"): true, - common.HexToHash("0x3ce9eb66c50cec7170ebc5e2a260f6bbf59d98fc5c3107d9c650dd2cc843e66d"): true, - common.HexToHash("0x865d38d3a0ae2b2678e41ce19d5ce4378fcc8d57c1c5be3ef5c6d1b883635b9b"): true, - common.HexToHash("0x435754d523158fbdf4cf025f0d36315f4e2041718cf0aabc916135a96a40b79b"): true, - common.HexToHash("0x483d9bc3d1311cca8975ec09a6b8a9738b0e70977322f4a6342ffbdcea076fdb"): true, - common.HexToHash("0x0faea770bbacf84d9513d57cb9166a9bf1a1ffe7f9ed8640ba38eb20bc243856"): true, - common.HexToHash("0xe2424a4c02769d961e332a89557151c6709f4aa2692349adc06cf192a1fe7eed"): true, - common.HexToHash("0xef9c6f7842c7db05dcf4e318a479cc2200f37d1ed505bda935dd692118e9d980"): true, - common.HexToHash("0xc77e463bc09f718c79fec3aa8edf0af6bc33cb7d617d82aa95647402fc87fec6"): true, - common.HexToHash("0x5fe979a29cb561a8fbb07d0bf726d8ce436b55958b536b372ba266b1f7831114"): true, - common.HexToHash("0x0d404f68ff280153cc696a38bc4ddc9e821b4277927b4f18c644cc7f7bbd7446"): true, - common.HexToHash("0xc6095e5b6bf2532a197ba494179eb53016178a4bcee2f650f68604799376f03b"): true, - common.HexToHash("0xfe847789286755183ffa352ad5bf9fe62639ef4e15f99163658500a88f99e609"): true, - common.HexToHash("0x9f513e2bb6552494dd85c8ce855b86192efbff101c0b88e5789b79b606f6ea74"): true, - common.HexToHash("0x30eec58bdff4c746f67358c11a59c8590fd840220329a5e2dea03551e121d037"): true, - common.HexToHash("0x6c5215d896f2ea47985de79a8dbb29820112ea1c8f7cb27ed8c4883929aef1b2"): true, - common.HexToHash("0xb370a580f3c79bcfe18722896ceccedc091c446478ae7c4930096bec0e4a1048"): true, - common.HexToHash("0x92aff6ea0f687de696a75c4b77e2029860e5c5f1ea4633af8fea9f9d6eee046f"): true, - common.HexToHash("0x464424378775721089f0eb6a21f52ffb90fa1c1d933b5f78ab662dc52b2d9415"): true, - common.HexToHash("0x84ece4840113dc399a60220e5e74e27188d85401cb470d166774e5acb7857c8e"): true, - common.HexToHash("0x611c744c429c3cd8f3ac63e5345c1ed40bab341a179ad470e5c52732fc7f969f"): true, - common.HexToHash("0x645e16b7988308a790aaceb2eeb71f9081a98e9038b8981740f61312cef28b78"): true, - common.HexToHash("0x60659ffd3013bec44d6d18ccf3b3740288b1de098df656a1cacc8a35bc526eea"): true, - common.HexToHash("0x739fb3c773af366bb5dde8a6cf46b1b32025d4f5fa18f185d6342788a53c303f"): true, - common.HexToHash("0xf4e82ce05482f870fe51bf6d8aa2b69c0d02a5e58f136baf49dfb834ea21b3e0"): true, - common.HexToHash("0x56b91c2a101ca8cca720a37121b319a65608a54d8680445e547bc84bcb932d74"): true, - common.HexToHash("0xe0cd9ed2e7be59508e6752c7089bbf6ad300943db647517f3e7b387171b6c464"): true, - common.HexToHash("0x96aa2619918cc639feadd9d1e3d39260ea94171c3322115ec0d490392867df58"): true, - common.HexToHash("0x15081b80c4f7b0165051d1aeb8fce38acb65060cb40cb18c5bbeedda3b9f4a69"): true, - common.HexToHash("0x1784d16964f05f0617b11d50c20c187410fddc22b6fe608ddc097a42bf4c6433"): true, - common.HexToHash("0x91b06a8fb35aa8817bb20fdfd43cc135486ec3e3a42124b0ccc14f1c2b338af1"): true, - common.HexToHash("0x0e26d9c045a3e8b16a70ccffdab6b5815217b5a1d301877cf01bdccc42da9691"): true, - common.HexToHash("0x58179ca5d70caf29d9d6c473e4d0265547e926850cbdfe6be51a7748d7551098"): true, - common.HexToHash("0x56c1ecd5fdb9ce622afc962e182915d73fced88eca5b58f3293bdcd29a8c736b"): true, - common.HexToHash("0x99da6b54dd12143d0f6998e140b7c276ddc287909a4edc60c8f7f7b9606751d6"): true, - common.HexToHash("0x3fd3271921961d5d75d70232cbcdf058e21ac0554c6eaa86e5898cf395fc4ff7"): true, - common.HexToHash("0xe62ed5d7bc79b84122f928535bbd2e56e92e952db13aaf7d4bade7291e56201a"): true, - common.HexToHash("0x918896296820cd42d0e3a03187df159da4d9a5e0e05c5232f3eb7b34ca1b286a"): true, - common.HexToHash("0xb00deab537e7f14fc9cbcf1f35ac446c7b29d9e89072201c8fd38b34585e5f64"): true, - common.HexToHash("0x96c971e06ce04ddb60a5a075ae9162301e38cc1371c05942217c6cdde7e828a0"): true, - common.HexToHash("0x25ac963f0fc24cc0a07965a9383908ac180db5dc085ec12cf3943538afc7e178"): true, - common.HexToHash("0x5e235705a1528f2f88f0a3e972b920e934fd9a015b1419ee89e8958ab0f979f3"): true, - common.HexToHash("0xbc076a2c39d8c382e7560ea56af79f339a0d51ef4df42a45cf71ced0755fb82c"): true, - common.HexToHash("0x7eb83924468e2777b597efe71559cd9877d29992851b96ecc19712596c421f96"): true, - common.HexToHash("0x505ca2d0c56f04cc6382faff58e014f7d551cbea16080c8026121487eaa1eaa9"): true, - common.HexToHash("0x9923f82f546073d94185f564eb261f654ea38c8b04f58274d19e86c19306a43b"): true, - common.HexToHash("0xd8b7e039af70f053dc30480ad4e36409700311fe784ec6721ab4dca8d9741688"): true, - common.HexToHash("0x80c7051783b616dd2c24c9655c861258bd6bef4808d70dc3dff3f29c04cd47ae"): true, - common.HexToHash("0xc4a39cb28b1f23f72be99ae105b3c185241b43d1fcbdd0f3e597fa4f3387fdae"): true, - common.HexToHash("0xea49902ea93178f95d4a4cdd704f7af3005e5faad15aa5e60c3733e20f714004"): true, - common.HexToHash("0x0573a2aa8fdfbde2e33d4c95d938c6ae56c578e15c02ab82083532c1c235ee83"): true, - common.HexToHash("0x2c9f4b28da0830632510a6a19681425ee64f54061f5869dee7d3b946662dc5c4"): true, - common.HexToHash("0x33cbe2a048e4b3cf3c95b625c17aa41e3a0703820b6ee50b14abb7a2dc9d3ea1"): true, - common.HexToHash("0xa615ba38e3b3b60d2629d8990f769dee43fe6cccbdda4e0ab1afe140d67e3f47"): true, - common.HexToHash("0xdc2f70d54e609d0725e68c63355e01a0c099725d2bcb2a093fe296aced7a9278"): true, - common.HexToHash("0x4d682d94e5796705baac56041352bf38ecfe854469d36650e7c488ae8dfaf0fa"): true, - common.HexToHash("0x1fa79fd5a0e1112788fe77512463abbb7c1a9388a3a598467009b7bb1f9c0b62"): true, - common.HexToHash("0x3cb430a22aadf29832fc550df277fc6b471092430903d3a3e01e5cc636ee939e"): true, - common.HexToHash("0x3ee86d00e85953303ac85fc52be39587ba04066184b199c44d21636568dece90"): true, - common.HexToHash("0x938453947092f76a622b862d5261203208dfad12000d6973bf3e3a89e419b38a"): true, - common.HexToHash("0x2a5e5f9fc61d1b2c2a8ac8b247c7b7feb29dd17897034706d9dc05266927bbbc"): true, - common.HexToHash("0x742702625e384274d7c0c6c11ae30a5e6d6e29a21eca61bd9e7f4642f486f3bf"): true, - common.HexToHash("0x0da02c5f969acf80aa66faab8ca7539ecf3ce43bc58d9fe068576b4fd2cede98"): true, - common.HexToHash("0xb5a1b68ba061092ca4cac938e0dc3deae9d753798d09744957707fc384fb26e5"): true, - common.HexToHash("0x97cfbb0af7bb7b7898d56056ccfcd0b5202facc3430e6b767d58ddd913f0722b"): true, - common.HexToHash("0xc42e1930c274c7f7035021076acff9625fcafbbd2962e3af38a72eac1dcec23d"): true, - common.HexToHash("0xb19efd0bcb67da214e0935980312a3aeb0c0c54590feb82613790785c3593103"): true, - common.HexToHash("0xd5c9d8e233e2c4d11ea4e365f83ba8addd0700543aea412e4ab0d729c8ff304c"): true, - common.HexToHash("0x026007954e9bd54e467dfe770d608a5a44874cfc4728d09cf2ca45504b49cdcd"): true, - common.HexToHash("0x81f3fe3ff1a2bc99dce62bbe97e45b44e69d90b15592e3669aefd309eaa8fece"): true, - common.HexToHash("0x75f7ddbd3dd02fe8bb4d7a9faa40231128b5edf4063fd710b63c39c83583fe8a"): true, - common.HexToHash("0x26ae5348ee9b425d3417aa8808aec1f8f51213b5f52c7ac0b43e98125cca565d"): true, - common.HexToHash("0x38e4d1b920ccdcb61b6305856848d576b6d42e92fe1d839e38153317105abed1"): true, - common.HexToHash("0xe4593ca7e82276fdef9885bd0484acd4080e16d9ee67091a34b8b4cc1bb9dafb"): true, - common.HexToHash("0x6ea5be2bce41c0bab9c0c0bade8607a3d95a8c86421a9695f699017aa7f32655"): true, - common.HexToHash("0x22579b858bc32edb5fe18314a58a692f613d1411596dc672ef9879e1d005c16b"): true, - common.HexToHash("0x97ec30529c86260847d0196abeea42be01fa3993e5932f72aa036869c335b37c"): true, - common.HexToHash("0x3c8739bae40b0c775e738b99ec67a23339905ad1dfdc8ef81fc619c1c4c7380f"): true, - common.HexToHash("0x755de4c804c2c989bee01464f45fbb99610f4705d33fe7c59aae4d975d1eeb8a"): true, - common.HexToHash("0x580a1d1d2d90503a9f2bf7bcee44d9fe375182fa84797e568a172c082e502531"): true, - common.HexToHash("0xdc621294913359d6a170315172635f2169cf175fc47dd6940db69c36380a61b6"): true, - common.HexToHash("0x0674b7ace1fdc6fd865065b371d7d10874cc3e6f8b0345e2d6daa767d4766165"): true, - common.HexToHash("0x5c98934acae651f6fa2826ff1cb61404323c697e5b7e6912e2644f8ef000a082"): true, - common.HexToHash("0x20eec612ba9a8cdbcffa49a33769219449172cd022f09f1eade7f73757a84799"): true, - common.HexToHash("0x413bd060330c87a098a5ec52fbe6f2213abcd24905cc5e0bf348179eb42807d5"): true, - common.HexToHash("0x52222dbddb0ffaee6139915a673c44ac613726202a697b2eb80d4913b2389bbe"): true, - common.HexToHash("0x44983ae29fdf62297e60b2bf04caa3d88893e352cafd656a6f590f4a9866b5e1"): true, - common.HexToHash("0x35e1b14d95b9085302ca37b9a5e47e4fd5f0e859518728019099175929dabef0"): true, - common.HexToHash("0xd022f603fed9efadd94a30f9126107c6605a3484c9aab884ca33cc4e756ad1f0"): true, - common.HexToHash("0x33a379cb4096a6aeb3dc0362f23bdcd07340eb49c32089497501c156a4e74057"): true, - common.HexToHash("0xdeaf711b86ee8b0575e929f015598f3dc2ba6b29827058cd2eccc5fb6e633fe9"): true, - common.HexToHash("0x5cc25630afe87d2b4483381f77ea455881edbd5b648254f323ba70e8c0516413"): true, - common.HexToHash("0x40ad59c5b41c3efcb803489d10215f4c498325a299f5646957e6ad5a360f5f85"): true, - common.HexToHash("0x6f323cdc09c48b535709fa04a1f7ea17e56ea4872e916b90d951a8cceb109cba"): true, - common.HexToHash("0x327037ee96740496d4df247ef36890020ee54ecaced201525d535dbbadf8567a"): true, - common.HexToHash("0x6fbb496d4965430cab5b7495f761930ac41fb54237bc9e486f1fd01caa784a6d"): true, - common.HexToHash("0xd9e79493d139e478c0b52f2afccf5fd9a35da3540cc7a29581d8740346a75914"): true, - common.HexToHash("0xa5d615a980918931947276dee43c514da179006326072c457eb75e3aed2bb2ca"): true, - common.HexToHash("0xe97621f8d88fa54a7350463e780a0006007828b78a37b7921c5a4db99729ef67"): true, - common.HexToHash("0x9cb02b0fde3ffb78d7ebf75b0a5296f96ca602f52f1f5faa17ac29bb201f02b3"): true, - common.HexToHash("0xb07663b057613d088472a722a7ba63ead754a93d1882f1b185594df08e4fd361"): true, - common.HexToHash("0xf93a7f6a91afcfab97cd8750866903dc1302c15fbebacb01e5c844545c42f782"): true, - common.HexToHash("0x0f3b76a6cb475c2401fc84b1102d84f3728bc8ba5d9b009276f78e2c98896e7b"): true, - common.HexToHash("0x3d353715f4fdaa660403ddad1ef66ec6b1d493ba66d1ad18490e94c90f322a80"): true, - common.HexToHash("0x5a11b307bd7c335c54a23175f7af54e09d1be376074be235b771701a14fedb72"): true, - common.HexToHash("0x3e99746b16c7353cbc980f183a5a3402be5f2224c5f9d9bdfc84947a75445e34"): true, - common.HexToHash("0xca67b80aee1a8b6dfcbc3579316b740f62ca0d802ada39e998b26216a6e1a3ee"): true, - common.HexToHash("0x7949c6e44f721c550d67628e0ef8eacaf93d2b705f8717af8003aa4005d58d3a"): true, - common.HexToHash("0x3f6647969e093de150d80b6cf664ff46b6ee0032dedc1d19d276f1ff62819af8"): true, - common.HexToHash("0xf95ce940e94f1270f7ed6906e94bb0f261af7244abe4b72182187de4f8f1e7a2"): true, - common.HexToHash("0x698d0d9229e60e6e4029be22b5ec0f5a9d5753c2dd0deb48e3ee66e4471a5b65"): true, - common.HexToHash("0x5e1c6ec0cdcc0ee877086ddf809d5196d719ddf7e4e2a43dc67870577cf72de3"): true, - common.HexToHash("0x3f13378daa32c03ebbc469916f0c65b0e6b8552bb0f19c3a4bccc4c9cc5d3661"): true, - common.HexToHash("0xb24e82ac95db6544d6c14c7d17d80d456b7f9b899644e8a2427fd418fb3452ff"): true, - common.HexToHash("0x6dca6cb03572cc4f983c63a1efdfc64458c8dd9fe0e18b9b7d4182c8e047fff4"): true, - common.HexToHash("0x12275055c71387720c06c61c6deda779d37b0866a43a134716314f5ad7307d7d"): true, - common.HexToHash("0xa1107c869d8371caaf64bb2eb6624167a9b5cbc2ec396ddafb820d82d065a373"): true, - common.HexToHash("0x5f55c961040280ea98c1a927b17d1d77de611c0931f11dbea3bc1ee96bb1d2e9"): true, - common.HexToHash("0xfe904a988f5c26e6553b99319c70dbda4020da34e917a17de6ce3697a522c2c4"): true, - common.HexToHash("0xb76334065cf84ecc6cd987be87e40307826e8a612fa09f3e4072055e920cb3ac"): true, - common.HexToHash("0x18e583b11d5ca29b61430e64406eea10f2686035e0e7242124dcda374761859e"): true, - common.HexToHash("0xf14a156b63ca3ae3383a94996d546efcedd4b756126c4d90590584de087ec859"): true, - common.HexToHash("0x70b4e5a232ed41fe7265e005c4e98910f4520fd0a629b3940a79a2750bbd782b"): true, - common.HexToHash("0xf3d7ad54746f697ffcec6c4bc66e23b2c5865f83757267a88b895d3b7705f944"): true, - common.HexToHash("0x195d0f173e9d5929ab377825725868e815c335bd9fa26e31d0e4045e971b5b61"): true, - common.HexToHash("0x20f85f112af0b0ea07e287f97659a1ad053f874a0103b69b2b2159a29e401fb8"): true, - common.HexToHash("0xf2c544ee602f25a850b854d3f3a1e5129ceba41c173ddf34a1441f33d4c762fd"): true, - common.HexToHash("0x1033243b02018a702e724a434eed260d94688d702ea6ca817cb87b02d6174355"): true, - common.HexToHash("0x5a972f51e35cc09667a266ce72ed24d5e80a0c01097d67b0a1a3d89745a19a48"): true, - common.HexToHash("0x5ba5a86ba7370c6e394f1b7261f7819812ee3ece774c48a915161724bf5ca2ea"): true, - common.HexToHash("0x9afa9baa5fa7ae7c94243321534a5603dbc173bf0cb4f416313054eca84eb5e9"): true, - common.HexToHash("0x2493c36934be32892f694f65544b1665e646655aec00bd37649904c454c8542d"): true, - common.HexToHash("0xcc59021919c53ef1ca9d6065737122dbd5af77c39f045ed49a936f08165c7b64"): true, - common.HexToHash("0x9d0a0aebce6b80c83773aa6beef7fc53ae0c1056fbb1777add238ec051ddde14"): true, - common.HexToHash("0xeea86fe869c13721298eb91eca92e689bc0151af9a6d44bef77f1cf1157267ac"): true, - common.HexToHash("0xecef6f4f8787c0c64717695347c28ea54b268a12bf1a0f0dd832469f2d59e12c"): true, - common.HexToHash("0x89fe90772890dfda41273fc8ea04155367832e721af90ad42e0cd5ac9f34ced7"): true, - common.HexToHash("0xe180fee49a7b2a83b5a2ea936da09a96f42d76aa31bd7b119d8721da79ec175a"): true, - common.HexToHash("0x7fd28592032657a4e834a6946158d22516feae0fee6df69fc91ab314120c1707"): true, - common.HexToHash("0x3900d5a0c573a52ed9fc717f2e711380a3af926a4c156b3a10403085811c8c21"): true, - common.HexToHash("0xa69dde5a590fdb618a56a919da9d9fa34d9a82473a783af83f1ac2d95fbf111a"): true, - common.HexToHash("0xa0c6cbec0876e6e98430543e47b2512a5ecb680cc329dd37ea6fac4bf700b24f"): true, - common.HexToHash("0xb091c1d89d54360fdf6b9a68f8414df89965e20819d58c0f743ce8e5e7d94741"): true, - common.HexToHash("0x0a6a108143c586dfdd2f5deaf986e641c2a0a51ac7b59d6aa4e0765d23a83660"): true, - common.HexToHash("0x3765adf6d8ce9710c512e555b03e5a42a61ac8250e3727742223505a1828ebf5"): true, - common.HexToHash("0x123973699df17b0acccf5bae545ca5714527069f94d2ad40c65fccbec58b8752"): true, - common.HexToHash("0xcab3f976dca019e29813d8734a8eac06f1da778eb0b8e47c087bf4567d23e81a"): true, - common.HexToHash("0xeb06ba6c1831ba98ca4a8a756879f8fa643fe12f5922a1917f1f899348c7fd86"): true, - common.HexToHash("0xb7e9de366bf6ef470b282c67660b70b04b945f0608ce90f22480209e74ad844e"): true, - common.HexToHash("0x05237000b1003cb3144048345dbe48a7b8d533150e34b02cdf70858eb88fb526"): true, - common.HexToHash("0xf6ee3a6a3a5158e2273a5e0ce2cd0b687c045b8e49fe97b9c0b420cff4a9124e"): true, - common.HexToHash("0x744516296a42f8dd02b970844d467e21ef483fffa19d13c4909a83232f94f633"): true, - common.HexToHash("0xd13d9cae4a241b49716cfeb432dcd926e1e63cd582e8a8a376d1d582af4a1b1a"): true, - common.HexToHash("0x1e3da0715a16365b867819080dc3ecc7bec6386268e56054019766dcd50c9934"): true, - common.HexToHash("0xe69eab2dd7e27f5fbc288a1c44e4a4116a56e5f827a48d39e860bb8d3482494c"): true, - common.HexToHash("0x87302915f05b15c5d658a05021fd328e34389431e55095250ccc3b5fc87b7d95"): true, - common.HexToHash("0x532d31f2a6ebab47a37280ffc60aa05f4dfdaa389fce65834e325b8d574a7637"): true, - common.HexToHash("0xc511d02bcb3fbef977142fbf617bc0ee7de27a7f409ad3a0919e340feb21c6ec"): true, - common.HexToHash("0xe6c3c8925a496a0fac0f55519eab02069d313c71767cc9dfbacc5fe87bae0d28"): true, - common.HexToHash("0xa2abc364c0436bb71fa78be4dc3f2e38a985eb0b6513fa6712acbdd59e2b9c62"): true, - common.HexToHash("0x680494494cb13797f2067a8a2c8214c14c8ce251f0780707be93cf25740505ce"): true, - common.HexToHash("0xb7233bb929bee3e73aed59a3e9f88c55f99764cb11408510566b8a29e2307746"): true, - common.HexToHash("0x6fdd1fb069f0c587a75254f23c7485cdf2a3a90d7f9b8b4cc9e8c705e2f8affe"): true, - common.HexToHash("0x6bfb734ded373378e7adbeb0166330d541041a2a2120b40d0eda1ceda188a649"): true, - common.HexToHash("0xb8ef7670acbac972ab7f1c95252afdb97fa9b8a64af83f056c8c430a2bf56aa5"): true, - common.HexToHash("0x947418e6e91cbda802b119b2e0b6f1c4b1de8ae2f9eee0947112a7a4ce976291"): true, - common.HexToHash("0xc8a27d88873c95ebc3036979cc495cd1159beb0df1c4caf5bb0318cf91c25c06"): true, - common.HexToHash("0x304c7c47cafa49966f0895c04e36fc8cd0cd37df28d1320e58b568d5c2004dc2"): true, - common.HexToHash("0x79f97ad9bc910509bf6d034a892c428ffa00387accdcf0f42974768312c0d499"): true, - common.HexToHash("0xbdb7d40e45542927d1f2b312b82d553df9f6f4d82f12a824cba9644c9c605e5d"): true, - common.HexToHash("0x00a6b31e73e873a18f67e8a0ca262b9fa43f40a98aaefc91a8c84e89f74f2cac"): true, - common.HexToHash("0x3ca7f055b4b46f76910bea0dab680b44ea5e0a40887b06d5cf38d80e6a364076"): true, - common.HexToHash("0x3870595a885e6ca8976fe19742c3668421b9e0ce86369046074b1c19fd37d6f8"): true, - common.HexToHash("0x6706baa70839a3c566653ebfd1513798f191a77a350f25589c550b0e1cdaac4b"): true, - common.HexToHash("0x2684d70a1fa0a2f184c1f407f93ad9eb7dbe19f251267885129ec7776f46775f"): true, - common.HexToHash("0x7fec6b3d21d0adc9585a0c4ddd04a27bf3c63b96ed23a36dd25ce05c5534269d"): true, - common.HexToHash("0x240bb43e37f99529f300444e1c28578bd91c767d2f41c4f86bccf1ebd4b66f49"): true, - common.HexToHash("0x700acd62172122e896ea4bde8de7662195a79bf006391ec206cb948b3f64f761"): true, - common.HexToHash("0x4e9ec1726b70d5f7a292b0d109109ac9e535f1c9ce44334011eb804803dccc5e"): true, - common.HexToHash("0x02acf4711162881e6e3839e6bf8e51df25f8bb6537816352efb5b19529218b9b"): true, - common.HexToHash("0xfe6728d971c56f74fa022ec7e94bde324df7d2c6a979e714089a35c67e850c3a"): true, - common.HexToHash("0x804345cf9498a692ed2a16dc1483a1a29a5e04c9965de8a88ca6e653de54603b"): true, - common.HexToHash("0x65b6cdb8b99b217d80f43db41b134b0877337ffd9b709a60c36938c67088ca20"): true, - common.HexToHash("0x1f3f6434718cc86a763a13143c36d3cdb13e22ce49124ad58c11fc01e343f55f"): true, - common.HexToHash("0x5b978ba28abba37b91589bd0e076748c650182658eca98b26a8b1e00e9a3ab41"): true, - common.HexToHash("0x8fe57dee2f60474c1ff82943ed6c524c11a49c007c99cb04b46f00d7d9bf1242"): true, - common.HexToHash("0x786e16ea4d146e39979169012a7c3bf1a128d53f0851e5bf6062786cea5675ca"): true, - common.HexToHash("0xc67654a5cd316bb8d3418771b7cb1f828002c2029c4e187a2dd995d80dadeb94"): true, - common.HexToHash("0xb716310022d10daf032a950dc5145caf3aa7153aa38cc8332daff381f0bb016d"): true, - common.HexToHash("0xa3dd51a9a055ca14ae30d887fdc6ba9515d9493ce81a97cb39292d3e7c2bec90"): true, - common.HexToHash("0xbfb8799fae7f407cc23a68525ddcc6bbe2ace7a4dea49479ef97b25ae1bc8c43"): true, - common.HexToHash("0xcd403bf4f023eb603b377c04153ef45e03d4cb88e42905bd4690993dd9710fe0"): true, - common.HexToHash("0x9f43d8c093f22030c42cdd173d54e14900b42244892d1a318be94f11438a4287"): true, - common.HexToHash("0xf85426c76c4197ca01d499c5e86cea05d94a5acae464f5823fd6dfec4c2c84c6"): true, - common.HexToHash("0x995b86f039979b1eef94fe4359003b8706fcd6eaaf97afc8269ab920c0329769"): true, - common.HexToHash("0x9e1cbbeeabc1f9e70b48dd6481b9cfa666ca0c439ed6e6769ab844ddae721f69"): true, - common.HexToHash("0x110649b37d7ee690c114a3ff1fc146ca02bac03e145abe27681a215313477af1"): true, - common.HexToHash("0xaf644b507381d4f570e10df98beb499f59b3d39ce9ab415d5c4001e436d77347"): true, - common.HexToHash("0xdd6a264ea2e81dcd6019e344e535de6deb44130b25f4d985313b7d5f1719d07a"): true, - common.HexToHash("0x38fb82c58927029f22eb59869b7bcc3630a684695c2ab97e4a5c3d9bf12fe0c2"): true, - common.HexToHash("0x04f976beef19c734eda2a4006bbcf2075afb58a59afd12f1b4181c3f9c240016"): true, - common.HexToHash("0xd8363a13cd24f71476c9a30fab8be316a111397473d91af54b47bc48f0743cf0"): true, - common.HexToHash("0xabe510d1aa958b3a45f7fbcce3f35876c7fb87cf8c2e5465dc44d1c9bd869f7e"): true, - common.HexToHash("0xb67ea86a983c2e9f416b79ceeb998324ae9f72fc673e59ceb85e81bd39add1e9"): true, - common.HexToHash("0x69504f7783db7ba392948d738131d3b9b6c8f9f873baea318399d7ecda83db6d"): true, - common.HexToHash("0x7d93f634115ff1815dab6b5f595b2533bbd1d0aa0ae7fb63c5778b6c8b3e7174"): true, - common.HexToHash("0x6482951b0fafc7bbb21f9516e46f53b3a80ffe5a3003bab548cc5c982a9b3dd5"): true, - common.HexToHash("0x9cb5ad0daabf4d6a7c77021cb6c35a227a9f89ee34753eb8ff801e56f98de30b"): true, - common.HexToHash("0x6cfdf5bf322fc8ab472225321ccc35c3dd692f2b15603b0516254f7397639fa8"): true, - common.HexToHash("0xd18fe97e69b6f21b15246d674dd3acf5e2f47e6a2d657b35ec4de5a51607fc8b"): true, - common.HexToHash("0xbcb8f368db258915630d4f04d333f2c4288637a7680327f303defe4e146c3861"): true, - common.HexToHash("0x6ebec2459e3673ce588a35e8e927df5eb21efa0a9225e2f912f72a24f24fc844"): true, - common.HexToHash("0x11d137a1ab5f6e7ec2eeb07d1ba97f825077b45d7701a256e1738a9b9c7c9b24"): true, - common.HexToHash("0xefbfa6e5c18b3ef041d034e75bf09bcef3b5b78a0a9c121a382f230267b8a869"): true, - common.HexToHash("0xc2b1b5a136ea9906c57f2caf492895c03739bc4c0a4e951cc45b0b1409714ecb"): true, - common.HexToHash("0xb3475b434e4e2fc8bbdc0efde714bd50e7382a576783fd965eabe8014c2071ca"): true, - common.HexToHash("0x0a8e7303f7463307e63927fe4f737dfd3ab9e463b4e838a58bbd1dce3594d56c"): true, - common.HexToHash("0x115bc0c71b4283b18dbb2d17fb53cefd1da33f060d05666239583443e2465dba"): true, - common.HexToHash("0xf73edfa43649d949cec59ce1269ef877f6beff671bbbac6823691444d6b7f347"): true, - common.HexToHash("0x6414c18610bd048752527bc1a7ece22b1715f2dcd479c6d0535840abc839707d"): true, - common.HexToHash("0x140a8fdc62d70f8f520716b9f791380e6b45ed8b38bf6578d277da596f753e8a"): true, - common.HexToHash("0x36a0006fddc88609e83c4680b312f740c03fa3ed118095f0454f39e658deaac5"): true, - common.HexToHash("0x8ed426d39d258ba45dd373f4dc3cda31bb7ed62d829535a2855567d2b6314375"): true, - common.HexToHash("0x1558648237f96d968fb540756149435022bdcbe0c34c1faaac184b8e3abd6a0a"): true, - common.HexToHash("0xca2ad7f6eea909d6d5dd6dc92959fad0288ba4b1941c23adc82f2debb2811a80"): true, - common.HexToHash("0xe87cb7720c9d016b91bd75572933a32b5e57bdbefaa01cb26716b10592bbab67"): true, - common.HexToHash("0xcb42fa52924b9ec38916a0acc7a56d58c41a0fa8e2aa38a5b370615482a63fb4"): true, - common.HexToHash("0xda9e61ea7b0288b8a0e6f0bf7857aad463c9a1402b5df23572afd5781b919ef6"): true, - common.HexToHash("0xb4e828837fbee42966e4961fb6a7c42aeedd2f628d4a53be78c773265fe9dff5"): true, - common.HexToHash("0x211e53083e5b16d9c7899173bda69048f5f198dfc621d89a50cfd298a7fb40b7"): true, - common.HexToHash("0x6b91fbfc6f7bc2e3256a0cdd865620243dccff4754f5854fd3f32bcd2ace56f3"): true, - common.HexToHash("0xd5ae60e3072363ef7a10580ddc68a5556bc775f3b8acd11b9f29c42304f94ff7"): true, - common.HexToHash("0xc8fb9c160f72a369bdc9c20f545a5934518d935e9306ff083a9ebc69f712a585"): true, - common.HexToHash("0xd96d4d54f12275dcd3ee9db5f24c184a2826f1f2b0272ba2f5efcbc46d4ad94b"): true, - common.HexToHash("0xeba0ceb7089e1ca394f85951fb91f72f372d0e3a6a60bbefb514cabb84da4ac2"): true, - common.HexToHash("0xdeac4deaf24a4bc03e3734c94fe3ede2d19210f6d402d93189270ab93c57772e"): true, - common.HexToHash("0x880e18c4f53f767a2c5944a08b482a424e410c9a2a1aa5a9903d89f9ec34c926"): true, - common.HexToHash("0xb478982d977862239db82a80fb16bcc17e4ac631ab669859c9e8f97f116334b0"): true, - common.HexToHash("0x1ff5ed208280a58ccf67e84a055b820f669098787c6d2877dc788111e1d43b06"): true, - common.HexToHash("0xed33df41753b61128e27789734e2756e237c4215760f0b05d5b4d87a6bee3682"): true, - common.HexToHash("0xf1ad1757ca62e1ede5262502958db3fd647c1550237c9f3de1fa4ade2d0915ea"): true, - common.HexToHash("0xcb4509977305c6299f964bb41c97e5fb5ee347b06d2b0e4eccfa33a6147f1db6"): true, - common.HexToHash("0x1b7d121eee8c52da258c4fa143e3054ea60c10d59b40996aa668787305a061e4"): true, - common.HexToHash("0x92890fde9a4729535608997a2922a7d32e3240ad237ad5ea3671bc6580413c6d"): true, - common.HexToHash("0xe1baffe39a371ac39b561583491335a3fce588b5ebd1560b8103a7138ec26bbf"): true, - common.HexToHash("0x0d709b536ade47061a83fd006808f55261241ee1ec16ca3e4d4b25bb126bb322"): true, - common.HexToHash("0x76ee4eeffc386d653120d2c1e89f22bbaef4873351cf1433cdaaa8a174b7d05e"): true, - common.HexToHash("0xceec2dee498c5b25bab094fb0a5835f4a4cdfcda20b8b1e709643034d36ddca9"): true, - common.HexToHash("0xe3cb7ff9c6b463d666b155229d6a54af6f5b6523ba552a9f1b4b77e4283d92ba"): true, - common.HexToHash("0x646415e02481519c358e7b9c55159348e4b4b940347337e34e844fb4c0fb2ae6"): true, - common.HexToHash("0xd79f13d8b48390b7da8597321bc3112bed34e53a3641572e760d99dbe8a8bb09"): true, - common.HexToHash("0x420305daeb40ed3a052356fd33f4b9467485f324defbe9e05446ccc9d0047578"): true, - common.HexToHash("0x3dd47f07a3361e937ce64f49325910dc7991559391329ea31cc5400da5c05543"): true, - common.HexToHash("0x016b8f8eaa99d83a8c81e28f10495376ccf89c02cc64efe9498eeced8d3db833"): true, - common.HexToHash("0xeb59967516cf84c8a8a94ecdb7233f8d414cfc4229d368012508afd03460f87e"): true, - common.HexToHash("0x121a66e62d9f996e372f7ca91cb074878c13cd4373f4ddfd592b25b162f24515"): true, - common.HexToHash("0x59384b63f44ba35f180353a30b366d47f0bf93200873f937eb6ada47379880fa"): true, - common.HexToHash("0xe53bca31edf4093e3b69a34daa0a327b09f3fcc1b033f908c6b3904885a8e0af"): true, - common.HexToHash("0x0d4b2316d0026e95bb3a98702bff08258f898b1c5591905a485774e86ad8fe36"): true, - common.HexToHash("0xfeacc6fdd721a80bbd977274bc098d76a948f1d3213321bc7b54945d9f2e61dd"): true, - common.HexToHash("0xcae1a585068e9a28f70cb7cec634521e21f2fb0a22d933a2cd4ad3f9c5e379ce"): true, - common.HexToHash("0x378b9939d8770b8423628baa76e521b3127d8cbed4a5b52b7e404dbdc747b5c0"): true, - common.HexToHash("0x4702e81c0354973e6ba2c6a50ec2935aa95b9e098f84699a173aecea47326a78"): true, - common.HexToHash("0x7089d9eaf58b52019e4cd9194802bee1aee583db5afc2f151847faaa9c2283c4"): true, - common.HexToHash("0xb6103b9b95bd7ce045bc42a8f82d9a8a92ed2ff77af4a80eb178c4c01da4adb4"): true, - common.HexToHash("0x648bb51997ac4515172205b2bdd95c20823d2cb1ce9ebe11d266414875fe3909"): true, - common.HexToHash("0xd37c5f21a78fedf447bf6efdfa69029f491599e454815101f78eabf4b86efecd"): true, - common.HexToHash("0xa9c2b3c84b7e389250e2f41d003c8adc36175e166726333ee3dd580356fc9d8c"): true, - common.HexToHash("0x47e3b6b2c001b52732369df324b911daa384add3fd2e9b1f4efdd07a042da01c"): true, - common.HexToHash("0x59317f4ccb4c5a36b6bfb5006b2c73667428fddd6c05f832b325f602893f43a6"): true, - common.HexToHash("0x22b1cede5e3430ac6b570a018e6658a362e7e59c258e0203941a0330cbc81827"): true, - common.HexToHash("0xef4d232bf06f7e1b3f94d3d73191fffd0900881cae29e4af9b72c6d371d18c03"): true, - common.HexToHash("0x680531c9790c0b24fa9d424d7aeaabcf6a08ccdbb3bdd48300b7c8ff7a4f8139"): true, - common.HexToHash("0xee30cec176ca42fb5d615cfcc0cf360a5e05ec57002ec348bd06ea5b718bf63d"): true, - common.HexToHash("0xea6c1d41b399cb40ff9f0087ef4b32a905ac12520b539847cc25eabd4854680e"): true, - common.HexToHash("0x96f3b2c2a54fac99e7f235060d9876c0290e2fdbf3413c14df97312916046243"): true, - common.HexToHash("0x02866444aff9b00face6a74ac8b24d3f59f6a54aa844f9ad43a3323a3a729625"): true, - common.HexToHash("0x195187a6825fd84ce7bd49f1c97faee217c39ba75aff3514e995ded9d465fcd4"): true, - common.HexToHash("0xcbb36ce0ebe861740bd1f5c5ff8801a3d464778d652873f3f6aafa9867b7fa4b"): true, - common.HexToHash("0xd35f5b960e95ff95d78f7240d5df2d834996782d68c935edc501f0aae894ac5f"): true, - common.HexToHash("0xe86b4801b2c86c39746b76c6f618434926b7b134e6895561f2c1822605a2e8fd"): true, - common.HexToHash("0x6baf349632ca3110c90ee368aad786cbf97445a820f168ec9b9f863ba3b67d11"): true, - common.HexToHash("0x594a833917b6618f59de78ec48bdf7a155c9f87949fb772e16a966e83e924994"): true, - common.HexToHash("0x555176e5b9f2738788b34838b529c18cf59a1bc6f84ac00f68a06defdae12e21"): true, - common.HexToHash("0x11506011c5eb6a271671d2483858837d652e39beae8caf2d9901afa9e6fcdf17"): true, - common.HexToHash("0xfda6a0accbbd14992507f636c7c5c2e49ec38c9a3c532c456b9130e1ebd26853"): true, - common.HexToHash("0x7118bbb04c31b92d701a1bfb00ff1695aadabea5117af102bb502440cb9f136f"): true, - common.HexToHash("0xf4f356c47940c72dff2b06836989720ceeb0e9ee22d4f36871b3c675f11a1cea"): true, - common.HexToHash("0x25844fe586cb590f72b7ec22a088775197112c9bfc3691f16bbc58e775c4f112"): true, - common.HexToHash("0xc1369437d583399947993809753ffa6ef6d146787917841327dda326e16eb110"): true, - common.HexToHash("0x83a6a6fbdd019fd62758ad73b369433cfd99f9f4adf54be5261bfc3b09d3c9a4"): true, - common.HexToHash("0x588a222a875795b5a3e53e406412fc59ee461ad569db89791fb8e96c26f750c9"): true, - common.HexToHash("0x5459af1e45d8e37d7b50a2785733080a67b150a57b7cf8ab5f9ddf321030f9ec"): true, - common.HexToHash("0xc126fcff8fbb858c88d6514b5663e9938e23d7ba320d22be88cb365d87430dc5"): true, - common.HexToHash("0x367350b53fa60266e9b1694c6a21aad61aaedab5e6caa664797d71ab21b301cd"): true, - common.HexToHash("0x0c9a8658001a6641e5bf14786a10e4eb1d3f0a3d32a73f2ddc1096af1666b361"): true, - common.HexToHash("0xb4f464aff4f17bf520117e002f782b2491f4ee901031dfa51e45020274f80056"): true, - common.HexToHash("0xde02f9022b52bb692df3c33a76772c2371f2dd8b1aa16b5f37d98863e8629078"): true, - common.HexToHash("0xd19627200bba23c0938a4c560f0b2d3884fa0dd4ac35f665d0e162a43588fc66"): true, - common.HexToHash("0xdc959f3ea579b847abbd0a76fce0b180f2af8b3b6c42e6ba22a8c5e76395f5ee"): true, - common.HexToHash("0x5d3c2643b28898fae9725da31ebd7453c6e9c22fea5de4334fc57246193a984e"): true, - common.HexToHash("0x0426949179539b8c0b2a69c28aed51f77d91735630f992ed9a328114570be963"): true, - common.HexToHash("0x1471fe520d3218c1c2126fa46d981c1567ee3b23c001b2170549007bdf67483e"): true, - common.HexToHash("0x1caefad0ed6fc0400276e26a0bbb76524ecd6dda0bf73672bed3216fbb448875"): true, - common.HexToHash("0xacc7e305239e58337b6aaed007c26e911660e73c5d35cef65afdeb5e8686e9cd"): true, - common.HexToHash("0x336de8e132b9369e06e79f8c6383c51580bfbb78fa702023b292046bc3465d07"): true, - common.HexToHash("0x2806b7bc2efd4e93b97ec34e7771a3fe8831c22680cd4a3adb72d11758ca1a1d"): true, - common.HexToHash("0xd72c69f04fdb7e67a0622b66ef01e53f137ad20462e49ef8a1f13e1d247ce764"): true, - common.HexToHash("0x9144c0f3ccdea396215d5634c756707bde90b3eb04ae313f324de169cc8793ae"): true, - common.HexToHash("0xe7f7ffd63725628d5d07a726996023e7fe0a407bc204f456d5a1d207e1492654"): true, - common.HexToHash("0x2b6bf222d81b31f21506f551b34d080a4e73dcc640608991050feb05b4554d05"): true, - common.HexToHash("0xcf26a5ccecf9d1cba9377f7a010766042752b7a17cc6744f5095234e911a5fc8"): true, - common.HexToHash("0xfc86e666e25ad91f1b3db9bfafc473f335058a5117f275caf7045e00e48d882e"): true, - common.HexToHash("0x84d8fb0ea395e5e13b79c213536f00b6b89e406b7569b6240e39ae0ef2f555a6"): true, - common.HexToHash("0xd0c2f7a7bca65bb08d75b03c8918ea6678e39516ded52a1a5cbf7976679b6266"): true, - common.HexToHash("0x557b67b0aab4270657d4b06e6fc4573c21b60097629c3e84f40a4b73f16b1ea3"): true, - common.HexToHash("0xc3a4bf988cca22d096aa073b513e5c1b2c13d544f96908613ee0b446f5271b05"): true, - common.HexToHash("0x0c79995b22b200aa5be4f3a38197b99b376a5f5cc3c6403df540bc49c9e8c131"): true, - common.HexToHash("0x2d1f9b56bc3f4aa5ba35fd4239687040364e8664390d6824a433e897a7dae3d0"): true, - common.HexToHash("0xe08a63ea0245a17ccd3b86fab72a71a7696a7fc1ec7081f5a90326e700e7af79"): true, - common.HexToHash("0xb9773324a9c2b430fa691af6aa17867e753791a245adf326d4b2dbab42ae3209"): true, - common.HexToHash("0xaba1dca51d2501487860b4c297091ba22aace0aa557d9e74d9f3d5d73fd63fc7"): true, - common.HexToHash("0x8d08148f1cc761d6be4bafdc92a3e24b31762b7996f8b99439b77c099b020406"): true, - common.HexToHash("0x49c51936b1047d5fd0362c8918b95e30f870cf77d647c961d2f89c7a75a2f081"): true, - common.HexToHash("0x5a2acb86924ab2b6903dc87904c8b7bd7a1bebf07478c3b7b7f6aa9d058c6be0"): true, - common.HexToHash("0x8ef2c4c19b7643e425293dc4fc3a5cf69f24ba342a0f121885195b9e7dc34b83"): true, - common.HexToHash("0x2a3cdcd5435162fc7174b7225caae03bae19a65d77bbf56832b7b7cf3cae4de3"): true, - common.HexToHash("0x2dc4463abbbc2b6a6a861264bca2d1899585c252e30be4a73a82a21fdd6cd2f1"): true, - common.HexToHash("0x243e8b593d9a1214d8c1dbef2afde70c80337b593b187e672b3c35d7204af7af"): true, - common.HexToHash("0x54ca37ac35ced21e60fbfe161083da1c5a988e5fed0d282ea850b4fa93fb9947"): true, - common.HexToHash("0xc07021a5bd5135945abe3e758c1a3985863b1da7d65043faa8f36151288202e2"): true, - common.HexToHash("0x92efa2bdf737e35fb33a9006b1ef8cf97d77ef6ab2beffb10cbf81dbbedd7678"): true, - common.HexToHash("0xb23455cc24b681205b09cf6a9252716943088f656508781632bdfc4afb4ed2ea"): true, - common.HexToHash("0x51637072758cc4c05ecbf729c30202db1695b5fbdbf6362ef0d0dde0e30c77a4"): true, - common.HexToHash("0x6ea3f914350d25f50d6b940125f748d894222c1d3351483957bec8e7b6c87e87"): true, - common.HexToHash("0x21c93bf337aab449ad5b58a8b010c0c174794dce1aaa4c6ae4628c915fae9d36"): true, - common.HexToHash("0xd708e032eb136fc675b8097da414adced4eea40d1568c7668aa8543df20c7398"): true, - common.HexToHash("0x8edd88b61e46cc92c709517a33c9fc16f202b0beec0c880b0a209391184333b6"): true, - common.HexToHash("0xa6c547a5dac9666251c14c77fb4d9ab4591506cbc4404ae17daa9d8b2f880fb8"): true, - common.HexToHash("0x748e079135807648c3225b5091c91a21896364e46b5124f7f83d905005addac2"): true, - common.HexToHash("0xd35d746e79e77e602d595a4aaebcca464f53e7661e4744706031e35be24bda5e"): true, - common.HexToHash("0x2da8b2413314d2a12fced3ff31f2ee59426c493130db5145d1c8427f1c0dd7fc"): true, - common.HexToHash("0x243c0e996db012869eb6e7c1abc99114b5742bae5fe76ad3ccea212de4cf1d1a"): true, - common.HexToHash("0x4a311946c6c3d5765538155e39169a1f04ff717c84e18d8f83582d4fcf0ab10c"): true, - common.HexToHash("0xb7cf9a8203c3c1d2f21c905b545937b0093f1c9b6005af7a39b8d70ff0e16727"): true, - common.HexToHash("0x4b03c6ededa56cbdf87ee852a23ead23957c889c6144b160d2099d3d0b4353f2"): true, - common.HexToHash("0x4c8ef26e8f1fc2ea72d37d3facebb5af9b5017f1bb176f14787d88ec411b0adc"): true, - common.HexToHash("0xc11f070380de3f5d038dfbb1e3dde1ff585ebb065ed7fc9d6fa712a7e28df7b6"): true, - common.HexToHash("0x6a841149c078721bcfdcc8a0edc1fa593145605543c4bcee7aaa80caf3ff305f"): true, - common.HexToHash("0x5c378d72225879b489f78c6bb4edf33d41ccc176eb5a61d4873214519593f854"): true, - common.HexToHash("0xf323bdbc6e2a86a0dc6f4e6d4011839d3b52f110ee34310aeae8a9949e2a562d"): true, - common.HexToHash("0x20efd7b6845ef3793accd400a42595dd3f0ac178e30508a435daf2656872542b"): true, - common.HexToHash("0xfe4e5795b316eb8046f23af65f28a05ca8a4759ac8306376ff02a23da86c32a9"): true, - common.HexToHash("0x0ffaba3ffe6d4daac6361b55605114b76e2c3e19de76f95be36e125cbc342c03"): true, - common.HexToHash("0xf914aad46ce1630468ea7bfba4f46282833ff514830a0bec3c9f7e8a5e56b7c7"): true, - common.HexToHash("0xf070b884f19e50573fa388e399b5045abd5dadf00d0b68714505e2365e16a158"): true, - common.HexToHash("0x307b4d6888506e5c20149d9f54dbea47094d6c1a49a933e06d8a988c7a705240"): true, - common.HexToHash("0xcd58cd2d9da4693414cf084990f683a687728c26bf522a2a238d8a0b2afefbe5"): true, - common.HexToHash("0x66bc6bcbc07dd47de57a68b97837967e356f5dc4cc0a3866700f0cb8981894ce"): true, - common.HexToHash("0x0d5297344f29c3cb804865710d20de8d406c5eac8537332992427163b2fed750"): true, - common.HexToHash("0xa7d487519df690889995578a65fb80ddf02731a587ec619a81638fd44dc1cc88"): true, - common.HexToHash("0x46ca5c2fca51b914198844e29761eae00698079c4fd223d17c8008d725dc5d24"): true, - common.HexToHash("0x3f4d25b4e2114acac92d4bd1ca6dad03a1384ea977b3d5e76106e2d269cc2a07"): true, - common.HexToHash("0x9259d7457b2683414f253ef0a4990a454f250829362c60258e39c7860476e57b"): true, - common.HexToHash("0x56624b550c6ed0826e98c5615bb71a990827d625fe3e82bbc1b2f71b59c50644"): true, - common.HexToHash("0x67b5faf425b034169dcab0ceed16cb54d17b32691fd235d3035ee785d54e0b25"): true, - common.HexToHash("0x4abc3e0be240ee7d0e23698ea1f054b8e716f9d91351889ea7abd4721faa1ac6"): true, - common.HexToHash("0xbc8e0ede13ffc68402b21b148df5433c8ab095a2675fb5e3c04a8aa8640b65f9"): true, - common.HexToHash("0x5cc4e39679fc238adca4846f284e3258f93690d530615932ae6f9b7471e27de3"): true, - common.HexToHash("0xd4c46b1e03f58a035ce4ff29554dad0512ae0e60e9c98b2ed4044f2b94dd2935"): true, - common.HexToHash("0xb0a34cd71e24c34aaff16d0d544b34ca508284cc0611c3506234945ce39f950b"): true, - common.HexToHash("0x7e9e774950440f2ac048823444272739d54cae4a8588c1979b12cf457bc31c76"): true, - common.HexToHash("0x12fc061a240074bcca555b154bf71db6a1c4f54e2a89ee2b672e096dc45397bb"): true, - common.HexToHash("0x12973c447532130e58201d08a8fb1c393d1835828f6ec06dd1febf37cf56bfa4"): true, - common.HexToHash("0x87b12294d72b569716d887f4981551bc93069d0ec2c62939d0a03cbfbff15c98"): true, - common.HexToHash("0x67ce8ad593cce09b96bf656ca4fe29ce8dc3a2bcea36b05c8dff46fe7add1d74"): true, - common.HexToHash("0xf04edb7eae158ca9c580cfffb0b282f4882334e044e8aea096c06d4eb6a2337f"): true, - common.HexToHash("0x34b5bc0c92defff28190208cf3ac6f5c4496a5e996e40c0d26341c8a562abaa9"): true, - common.HexToHash("0x6f585f28b363daa9250499c64d2fb56b524f39e0657c1e8a6999b1d1894b7996"): true, - common.HexToHash("0xa321c80c483c9982ab3345708437af819792394a7f8201b6e22f079b1e7f7c77"): true, - common.HexToHash("0x57520957f76ababf6b1ef7606ee8f4315c3c7baf0bd82350a606ebe8c55bacc0"): true, - common.HexToHash("0x4c7e90175a180ade39765cc078c0bc813a8cff4f1060a1d0b520edaea3657065"): true, - common.HexToHash("0x96c0761536c65ce72bc986c703c1f0c28de9f19ffa4239c90f9543d465cf47c2"): true, - common.HexToHash("0x8d53e482c008687f5748eb6b8fb37285f56aa9555076d3e416ea071b4f3f5219"): true, - common.HexToHash("0x016522eef40ca3c86e7db1b166452e10e915bac9d9abd79f7dd39f5e364292ec"): true, - common.HexToHash("0x75406513d2d451bb24c5face5836f72b60666ec855f85e9cabd360c5884d4adf"): true, - common.HexToHash("0x20b70cf75871198be2a90e9bdbbe326da91dcf6a6ed207496f4143a659d52934"): true, - common.HexToHash("0x5c91ef7c9dfdb020dd390f54d181dab1f01a4a7466635714a20371abf3768a68"): true, - common.HexToHash("0x1e547f4e4826a841d713dd739794b774c2afe7abf1be20f87510c2fd65c0f40d"): true, - common.HexToHash("0x747bdd9c257c84f9efe3584da885819cdd8a2d626802f28ceac81bb10513749b"): true, - common.HexToHash("0x9601f93d12185679233aeb641ffe40099653f23229f7094a62634481639763ce"): true, - common.HexToHash("0xa93f8f6bed2e520f4002e5ef162d3f665f32b547ac569aa4b7681570e9ecbd0c"): true, - common.HexToHash("0x17231d5babb5cc23e70120100a4b4f3dceba4e3804d5b3f98dec98a151a2e027"): true, - common.HexToHash("0x8b607a07f4b41c4a4aa0fc99e8cd15f758bfa608dd23a40f16eccf30f17808ee"): true, - common.HexToHash("0x60fc78dff2b2eaa39ccd01055c7ddad2a916e54c8789580c72ee09cfa4fdc8d2"): true, - common.HexToHash("0x26769b7bb3c7eb37f523fc73b4ed512eedc522ece34c5711f080363b5568f683"): true, - common.HexToHash("0x91bd4b2d62fc4503cf00c4e0e5e5fa7fbf0d6e1a3ea20ec8e150a043fcb6f8d2"): true, - common.HexToHash("0x6ed7cec2cf9c422c66efe7129d6a11f89b22cfb2d6c53bfba2c8afb2d2496cab"): true, - common.HexToHash("0xebd03a5b79dda05301af3a5e2450f9a61fd02fadd9b0dae8449c04657da777cd"): true, - common.HexToHash("0xd330ecdf437d7a57cb2eb8c184978b5214c7d89c317649e02fee518ef7693685"): true, - common.HexToHash("0xbc4167d7c8a7dda5aa1b370ca778e8f0397c6ff6e361d0eed91d0e25fcf78dd5"): true, - common.HexToHash("0x1c6305578646bf35f74dca17e34537b67941f30dcf4259dc9792d1baee7cd4e4"): true, - common.HexToHash("0x6aaf514d38245416f8c75b380e24778e2b0f0a8f6152515ac43ed56a82f527aa"): true, - common.HexToHash("0x6d66c3ae44781d3b9f9013da76965cae98889b1dd6a408bcfabe17296fd5e152"): true, - common.HexToHash("0xee9f80348916164653384a38dc6a2787495fca54ba90851b28b4d6a835a8b0a7"): true, - common.HexToHash("0x41796f6d045be27c84dc3dbf2dd509fda4bf08c0203cd3cae5dc3d3460cde44c"): true, - common.HexToHash("0xa12b917468d28a806b42018cb8eccd133e1e1c4ae573b1d1aa190e599fe607e9"): true, - common.HexToHash("0xe5ea977ce3b7b0c7a5258606b43748a8f00fca91ca741afb00215b66a5265dc5"): true, - common.HexToHash("0x0410ffe2436d9e833d026e9f1f0418044236fea987253b857465c03860630ece"): true, - common.HexToHash("0x0da8e7f667d9d5a96de0ad5a05cf8d7dabf6687ae5843dfdd5eeb1f8aeaa98ae"): true, - common.HexToHash("0x9d3be9be38ad499ec2212cfd4d6cb2c9728c5abd1c0621dead0aee3ad98125d6"): true, - common.HexToHash("0xd22f618cee012264bc82535d537ca877a3491e1ab8a7e894648bd0e4198da746"): true, - common.HexToHash("0x27010febabd463ca7f97ab3483a43bfae80934a156732052c8bf669c5aa6ad94"): true, - common.HexToHash("0xdea555f173f55b02dc4a73a7c363cd75066374090db58a5c26d2015b06e49393"): true, - common.HexToHash("0x4198cfd9e16ee2b147b9b3a71f58a9af4c3691f6ccda8421cb5baf49fe17b309"): true, - common.HexToHash("0xbe732f3807b0ec6f35375c4f4bf8f8b15c1f85a2d1c54c7948293d4935d49c43"): true, - common.HexToHash("0x93b1e8d2d484475bc36b835983456b4357e08c608449249deb114329b0a392d7"): true, - common.HexToHash("0xf074c5e55dbce28355e94087fc375b45fb8870d8b7086bd281dffa4ef68262f0"): true, - common.HexToHash("0x9db172fa6bd5a85315f0cbd10fd2671e9269818790246dfef01df396e6d85d83"): true, - common.HexToHash("0x5b5a0639c01d9b514b957a02ad69b0edf0c204a543133d796d83e8bc2e2ec16f"): true, - common.HexToHash("0x129193c8b1df5757f54e4bb4aa3bf3b929de9df1763c878385a1d5c636d1d839"): true, - common.HexToHash("0xd48985e5ea0444b9376fb42871204accf41705917848d4fbabadb16c7ebfc040"): true, - common.HexToHash("0x5f75a1fbc5eda6e5f9dfadfb181ce3510a281212ab4b448dcfb40be5d9afe9d4"): true, - common.HexToHash("0x00ca59ecdaa7493dd9528aeced1585373fb6eb2c401cdb281ec16fe8392a1e88"): true, - common.HexToHash("0x8039e0e17df229f9c3f4516f7e62ce2961966d4f06ff5047b4a9e1d85b0a1522"): true, - common.HexToHash("0x7e7e44ff628dd66f611a16fdac599ed5201f52cef6423c0333b077bd2e66d5df"): true, - common.HexToHash("0xa92caa7d8f6fdcb525e7aaf3a83bd2ff5496565c4cf3f8f6a0e4475f1e16f5ef"): true, - common.HexToHash("0x212fd2ad9a26ba82160367462c5c77f615073f8284909f228e4a7fb96de8b3b1"): true, - common.HexToHash("0x94692e6034ba474da82841eac83152d9e11d310a9ada42b9d7d2505e8c332a43"): true, - common.HexToHash("0x1d9b0bdb4a8b5392553a98190d2a790e739fc31b32b58851623d272e8da73834"): true, - common.HexToHash("0x5ec7bfb04a599ee50f2ce7e7a8db75aa84468744b74ed3875edcf7fcc44208c8"): true, - common.HexToHash("0xc47430c563fd0c9926ae1ae44519c153d8e3b5117d8c0c93cb5631795a9e3986"): true, - common.HexToHash("0x53f64288cd9de8a3eaa810d1e7fba70f37fb30bb46e832a7e2ea60df83034aa2"): true, - common.HexToHash("0xd4e080535fc0165742030a56cd92e5f3ae8f305da7c4b10c784930738410eb96"): true, - common.HexToHash("0x2228fcedd831eda47cfc5edaf0bbc9c70308451130671da902247339001c8233"): true, - common.HexToHash("0x396f1d1404b0ba4cbc99b402666bbcfa3b3eeb25f62e556b7d5102cb99559a75"): true, - common.HexToHash("0xce7de092415a0381bc912e8a30d2b2e9a5ce52c8176efdace974c68505e9cabe"): true, - common.HexToHash("0x5f890663b042eae0c46b660547d241450b5f5d2be59865382ff669785942945b"): true, - common.HexToHash("0x2e713fd2b40ecef0394ab25a135c20596da5c9c073642ddc04b88d01953a3d14"): true, - common.HexToHash("0x8eef13505da3dadae48b55a3dc2d81f05995599e845d14651539c88a1649d01e"): true, - common.HexToHash("0x32a9903ed1bf30a6a98b7fc5a5401a868cfc365447394c41382db290000af725"): true, - common.HexToHash("0xaa6b24739c1497cf5f640d4d3f4d73a52db77f02addaf82f79c288619acbe43a"): true, - common.HexToHash("0x4b8db1c558b97303f1bf0c25030ddffd95464d4bf2e339b3d386ce89852e07f8"): true, - common.HexToHash("0xf3f562d270868f148ad279de53b32e7a21203e837f13d59dede56afb428bf1f9"): true, - common.HexToHash("0x5e725d81bfa8ac79ca6e16ea8dc29f59587b52730ab877b174a1beecca8549f2"): true, - common.HexToHash("0x8768077e4591bcfc11459fdb073855ecf774c45268ee77c891a02095c830a88b"): true, - common.HexToHash("0xcb31ebe467d934659d5929e96a1d876ebeb52fca44294d7a2395e7f56c52da4c"): true, - common.HexToHash("0x53acd2feffcc39bb76d7c70d792b848d4fd14abf9cb283a4524187a87aaaf242"): true, - common.HexToHash("0x46bce98cd88bbb4970104dc8653d1fec9bb5a775d5b3797be38cf93b5e9243fc"): true, - common.HexToHash("0xc397106b72fb76f3549026b960a0caa88279850af040715ba1fd5a2b32a8d7bb"): true, - common.HexToHash("0x0c580374a57b163d2d700f782fc2fe64cbe33200fba40ad9dd396daf91839f47"): true, - common.HexToHash("0xb0be2cf2164401b931aa8601713487d9bf44b68a98397c423709a22c7d1760e3"): true, - common.HexToHash("0xf1a6abe82fdff47cd8c61c6a7491319e82c23d02513e45615340ee0277da3f42"): true, - common.HexToHash("0x6a35e94cf5b1cd360261f3ae91a075c4c002662e4e0ab3d3e5732d5a52fed635"): true, - common.HexToHash("0xcea4b937097b8091b5b71bdf03fba18fe63f6bb8345381ff5d4c6ff851cda8a0"): true, - common.HexToHash("0xc0f83793c5bd6c2d17862fcd5846985c4226e90b349d17f7f5eae1f86de93bd9"): true, - common.HexToHash("0xcfdeef7a85f4945aea40dc46c8e6b1fbc6c922de96b9bbf8ade6c769e469d262"): true, - common.HexToHash("0x36e36a8e73a1d791106e91f95cfb33984c526da49ed272569ec7879a57fc77e8"): true, - common.HexToHash("0xc84df0870c849bbfa85b4f53de10eedf675c3130ea0c86143a2a683f192e7985"): true, - common.HexToHash("0xb9c2f620e22e87d8b8192219ce428caa1ef28fb95cc2e375aa0187c2ab060b69"): true, - common.HexToHash("0xfee796a40c4b26dd951bc8df75f1e6b963e9e9e4d950ad1a60ed98d8a6ceaa16"): true, - common.HexToHash("0x88e616cff6b5fa4652e48d52124afc9549b7a0fc797371ec8517abcdebeb0025"): true, - common.HexToHash("0x3ddbb9cb392cd8ebbd2d7d37542f164385c28cbcab8d982389cf64bd9309ee4d"): true, - common.HexToHash("0xd30ea5de62c464ddd8ac3d56230b327f0f731339f33e1ef9cd6b1170de614b17"): true, - common.HexToHash("0xbb610421d8b34019916622198436e5899b0eb8bbea23fda178db73009b16fb04"): true, - common.HexToHash("0x478cbcd3d5654be497df8da2100c0eafc3de48813746a8cac3b62ef8deb77141"): true, - common.HexToHash("0xe1db54d224e6411403362cb8a85e54a46593bb99f993928f362105604a2af082"): true, - common.HexToHash("0x95db2df5e3ffa2fb9629b55bf80f52287af64badc324175d10c07fea277b2f3d"): true, - common.HexToHash("0x806b8455d8bd138792380df81f0c7bf5c1a82ab0e339bb088dce04784c92dc77"): true, - common.HexToHash("0x88ac8091ad80f49d9292647e0bda61df9303e1bef1366b4a03649f691ebeb582"): true, - common.HexToHash("0x92d5a5bed1669468964cf952837c538cb4e7ed3c36b486443ceafcbe63262a37"): true, - common.HexToHash("0x83b9c83c51bbb67e16682402efa60ce45245720559df607c870d5c3202411d15"): true, - common.HexToHash("0x7b09a1ae4f27a796b4a65c683b9167159e46c05670ed7f88c76b9edf570a5628"): true, - common.HexToHash("0x0edafd58c5192554de2e4d83a42e8310a14e5fc805ae0c7a7a81c624e7187d74"): true, - common.HexToHash("0xa6f7a564df04b50acc59ded1e816ab015041fb476ea47baf90fcaf8915076661"): true, - common.HexToHash("0xfe96bbbb8c1afa7fd2f5c0cb8d8ba8508fcb80a761e8e1eba8396c688361eb80"): true, - common.HexToHash("0x70cc6936d9ec581dc68ba8f8a59467ccc1e52842c4f987e084272ad2d382e41f"): true, - common.HexToHash("0x223ef36fdd77c9c5a9bca36124fe7439b8249af148632c65dfda13f85b19d627"): true, - common.HexToHash("0x14ddda1aeddba78d7d87999532100f2e3e8bc309b5a33dfda415ce595186b7e4"): true, - common.HexToHash("0x72e1d276cddc99fb349dd99eef2de4bec6a61a546c37a037004478d65e3c4fb3"): true, - common.HexToHash("0x187003ae55e9bf94a2e9cd007e0a309140249e1c1a715d32dcc05f016ce68eb7"): true, - common.HexToHash("0x9c6c8b81b1705db5176ed9c1962e0a92efb34511f9df20a973c33766bc5b16b6"): true, - common.HexToHash("0x286a42970b3468b35cdfc4c038b1c14f1b63de90907fb1f6d5d2a1e1d4c3b584"): true, - common.HexToHash("0x769267fd5ca281f60b5109aabc4069418fc9a7d9af04ff6bb01b6efec717e820"): true, - common.HexToHash("0x126b8467e6a42cd642d2a5e12ebcad28577429e223cfe02edcb3d9ef94bc88a6"): true, - common.HexToHash("0x79ab6091c6058653f38b21bfce010cabbac2e7055db559f4202f28029b466468"): true, - common.HexToHash("0x6d088d876d4e79c7b7739851a5b94a86ef2a6b1b8563c8bcfd4db086f79cc3e9"): true, - common.HexToHash("0x76a93228ac954ae3ee7d3d0eec32d6a6ad086c156bee7d76fd6a36dfebe27935"): true, - common.HexToHash("0xd99e4a169acc5d47e19e99a097378ba3c9285641a89e09ed05a86fe371c2034e"): true, - common.HexToHash("0xbc89541bbeb89f7b4fea08a8b0f8a8217610a47b94329155223d3fa4ec618f5f"): true, - common.HexToHash("0x50220fcec94e19430e7dd9c924a774acd53f8f6886737402253e3bad7bee920f"): true, - common.HexToHash("0x74195329610ecb37da90a4b2a8bb3cb1568043a9fd5e0a00cadf44b8a4f013b4"): true, - common.HexToHash("0xa047558c287d7cf8cf149fdc302bf8874f93670e8f5674311e813933d0958940"): true, - common.HexToHash("0x90fc3326289a18e7a63731753ce0ef4d430e2283cc4913512dff9659d9564b51"): true, - common.HexToHash("0x97425100b3782547fa3cb8b0215f6dd307cde2167720a05ef41e52e68aacd5a0"): true, - common.HexToHash("0x54616d0b2fd393b97a7f85191eeeab5c0f0e1a78bca971cbb00cdf471de3614d"): true, - common.HexToHash("0x0e034fdb3e7934688930e57d2f152fab193da939e1a68bfc1cde3c6be5667dcb"): true, - common.HexToHash("0x8fcf65dd6af01de393fccc6caa677487b3092718393c6e401cbdcff3300d64e2"): true, - common.HexToHash("0xb7d4ab26013f562a5b2c961defc684e3a8ac13fb837d55dd60d314bf29a60c41"): true, - common.HexToHash("0x28e8602f614a5de429fcd518bf1fe3d824d840ecde061075582f692b4d000422"): true, - common.HexToHash("0x7355c8e089d7d19bd3b61d863a32c1a671e016f17e270d36ebd20ae04322f10e"): true, - common.HexToHash("0xe976b0204d66ee6cf8b4d347b8f03c32082fce91a5728448f8af07a79501ef8e"): true, - common.HexToHash("0x821e597878c328a8a5adf80606541712d0f43d4edc2b78b50dc9190b57cea2f2"): true, - common.HexToHash("0x1bb716a48e5b0ba15620f2aed14755d5f6cad6b93a42e4414698291de0eec3a2"): true, - common.HexToHash("0x6ee1bc7c667d14d3f6fb25c6f30bfc631659ef80b1d730afddc5695662654773"): true, - common.HexToHash("0xf3f73dee4699d80eda4032a303ff5effd3cae248ff2946a42ebd586519ab0db1"): true, - common.HexToHash("0x20981b7709fad3fe431b3aa21331676c8ab8766ebae4d441a7b0d7a5b2eea185"): true, - common.HexToHash("0x3a9a41d1da507ecd4a59a96607c1b653117f39d7e2a70ea201a2b0e625909dc6"): true, - common.HexToHash("0xcfee56c19bd1bc12f8e3e9a68784137c93d01f7c1e33632446eb4058765a45c0"): true, - common.HexToHash("0x4a4611c60ec6d7bbf20bd34a5472d5b1b1d86e1ff314f45dad9bcf10a70b4615"): true, - common.HexToHash("0x31439520f7a7d3a632b4533b6eb7d31859654f2dfa2ca6016208064592b7c0ef"): true, - common.HexToHash("0xed28fc559d0638cab96f9e8d8b2047ad5c313d203e864aebe7adcf0f7c992a7d"): true, - common.HexToHash("0xba3159cb361dbdccfc78a660f97a5334c9b80b6c191c46c359925ef9e0c6f85c"): true, - common.HexToHash("0x51014ae4a33554b8caf4989ed035a55953a4e6e37da5dd2f894e6439def2ec88"): true, - common.HexToHash("0x8f302611e57058b79d5c990c1ec058b5cdebbedc11053611e045b12d30bca2a0"): true, - common.HexToHash("0x4c6998bb3fdc729dd357d7491ced0598208492e829514eaef56810d0dec8f16e"): true, - common.HexToHash("0xa51a3f6448f22dd80f78b2d1c12873142c6a6fcfebf7b2776b505772772711ed"): true, - common.HexToHash("0x891c71f682c482da924ea9d155b2e7eef8bccad21a95c4da5b24e3f99d36a438"): true, - common.HexToHash("0x9ed3e507dd5ce614186ec3f472450957a85195120cbd8a52506e9ca9d2560530"): true, - common.HexToHash("0xb8e900430f824e82bd5c5bc2a91b73dd348264301dd7d496bd13a8336c9e43a9"): true, - common.HexToHash("0x6adc155ecc3b68173f44ad108e95d57a6008c5a0689603888caf159990d434e9"): true, - common.HexToHash("0xd488d8add01fe898b4855ed20113a2dac7025d975feb2b7c5b1cab1deed35daa"): true, - common.HexToHash("0x0fe9e2841fdd33a6dd8b1758877cdda131b69e0b391ce11adab359ddef8e9349"): true, - common.HexToHash("0x9c7b32c82efd2bd88590bce7e42c8d0ac2de6b00db91bc7a3f612bf0df71b403"): true, - common.HexToHash("0x3402b47781c5570b766c661fe8e8235695b70dd577216a6408eb464ac72899ec"): true, - common.HexToHash("0xc11cf782f696409ade056a44c1ab7da0347891c222facd3d8d5a414babc0b913"): true, - common.HexToHash("0x9009a8310232c6f8fe7fedf3c1a1aab080c3e2429be16078aaaaacc4cb87fe46"): true, - common.HexToHash("0xab737808bb5eb9e5278e2ed038dea7f738a5b7add4006f2d3883a9a66b70ced3"): true, - common.HexToHash("0xc7b3f6bc90ea1bda310523ab4bdba7705cdd34bcf6b141df8ceb014bc65a9e3f"): true, - common.HexToHash("0x90a64441d71c7dcd34422d65faf1c0c910ce17a945270e950eab1c3429e035b7"): true, - common.HexToHash("0xc5d63034a7f83484c24f7a6768ed2a242007525bdb640ddf89f6e0868e11ebc0"): true, - common.HexToHash("0xf8ab75575f27af50ffc102be34c3df0ff8bb0c08ddb2e0505cef96f38279fe4e"): true, - common.HexToHash("0x9adc899245f8d08f83a278083fe635ed120b94f8a078f319c93df9435cc981b3"): true, - common.HexToHash("0x9fe304c55bd5376dddac312bd5ef5b9bff6e7f40cd36c271239308e1f541e3b8"): true, - common.HexToHash("0xb23d35c1f09a2aadfb3f02dca87f07d57028038e8e336c71d259e48aceaae091"): true, - common.HexToHash("0x460eab7ced85b08928f12d79164f47b38d40255a7095a81ef966dbaf6298a9b1"): true, - common.HexToHash("0xcd20f1a159f46fffb76057e7e5e42bb2aabe9b6cdaadf304ff29bea7bd1f24cd"): true, - common.HexToHash("0x4e60f2c8e29121fc12cffe1a3867eeab2b0cb1a70388fd42e4b157ff5192dad1"): true, - common.HexToHash("0xa542068a3e4f3bd58c814dc9309dfe98e52c730e030c4fddf2b9104b1c713777"): true, - common.HexToHash("0x2896b3b4cd9922480550b02af7727ef17c444f904d35ddf4e504a061788684af"): true, - common.HexToHash("0x2a8bb1164daaaa6de1ef6b66e0196327704b4389f7138fc2e74e0bc680b1a6f8"): true, - common.HexToHash("0x57a339463e23f82a3d89ffbb544c6275d68d3b48e5ab8b5e89d1e63547900875"): true, - common.HexToHash("0x7b3a3635acbdbb3ad3f10ec7d2dc5c25e613616aa7a7e3fe4acc214557c6c6ae"): true, - common.HexToHash("0xca9097a84c429ba2f8c5ac58ef58d884a7aae06c115509d9f0449fdb74dbbbbd"): true, - common.HexToHash("0x0850802a1255789d6c11b87a2303d2f57674a16fb2af3d0a293f2e18669eb664"): true, - common.HexToHash("0x3e39e0c943d6e6588d4c604d0b902df65c62ab6fa2b8d4982808080a739cbc77"): true, - common.HexToHash("0xf40cd696e41b78d11780d77caeb5a8f4483c3fc330d042c453e74d339ad0f57d"): true, - common.HexToHash("0xa2348ab942fc67075dbb807ba2d1fd1d870dc948f5407c275970dbf30fd62121"): true, - common.HexToHash("0xbfa557097edf85763290872f8af2418683badcad6cee9ab62de6597d4a450b99"): true, - common.HexToHash("0x8c15d422e5ae7763d6cd7207d665dd75a4d87b73bbc6726f628211594d362716"): true, - common.HexToHash("0xad2c118af257cd22e15a5501c40fc61a278ee27ff1db01acbf2b56c81a8bc727"): true, - common.HexToHash("0x73b011c142f2969dfb26cd397b425df6b9c86d988bd5c6cb2111965e311d42d0"): true, - common.HexToHash("0x96313ddc6ff237bfd4f144a8801b0543839d03736b631f33d1ffd50a75a50f2c"): true, - common.HexToHash("0xa629e77500df9af71280f054f2169a60368c206ad9685e781dbfc0e3fe18b64f"): true, - common.HexToHash("0x872431e2d163a93abd4513e9acbb2a921c70fe6a9e5cca1921fafa185c50dfad"): true, - common.HexToHash("0x8aac358e4f24fc6ec04bae55d2bd2b297f4d1d755d698d25342c10ba5d87f4ae"): true, - common.HexToHash("0xf66edd792da92d43b13b6be991bae2f65d96bfa3f849eae9708ca50754acd840"): true, - common.HexToHash("0x31896e9a57a6234a63b6132c36199789dfc7138a4f49378192e6e466929b6e44"): true, - common.HexToHash("0x7f75a12ae77a20de456b9ee0a163d20fd87b92a2696141e834ebcbe2ffe4d7e6"): true, - common.HexToHash("0x23cc8be2b6a0cfb3ced6b2937371be727b3230860137ed097ee6218773193180"): true, - common.HexToHash("0x041a955d56650f945c52e3a9b166182d3b420a39784e2ad1c30d3f15de3e8ace"): true, - common.HexToHash("0x6d6d29d534481bb927fbcf9abb9206685a56a28abf10eef410976cfca0b50ea3"): true, - common.HexToHash("0xc546c7a60558058e763910d009cd7d9368c67eb58214b6172c01657e182e4ad9"): true, - common.HexToHash("0x128c30bf6be94389d217145cdac77d717b58931d79e670fe6447957d6e8d1237"): true, - common.HexToHash("0xebca697f7254fa57a0c77bc1a0f2e76857e099327a8798c6371e9a5ffc2eb9cc"): true, - common.HexToHash("0x19654b89756b499f2f9691e0739fa03e6569b6597b068237e2fc1b6855821a99"): true, - common.HexToHash("0x524d32db70a62a6f5e93af4cd6297236ec0bdc5d707128be0c368d7036d4e218"): true, - common.HexToHash("0xe94ac9e371c98e7c7ee9796e0be1da7df46130c5eed0dec19945b68abd23cc6b"): true, - common.HexToHash("0xa86a29954624d608d9423a38e1c645b320da7b122da6bf814579cba254257c46"): true, - common.HexToHash("0xca441e41e32238c21b01c1f1dbe54cadf6b062342b0abb36a2d98e96123c2e33"): true, - common.HexToHash("0x675484b54f02296c13ea8af7e2d7553532f9172e8e5e09823f65b757e4af885d"): true, - common.HexToHash("0x1e73240459a3c4e80e36f867a9f76ae5f770863c495ce6e6b0e79f76131c0c13"): true, - common.HexToHash("0x2e533fa59482cb21ae87b56e25bb002fefe54f1936cc001d8a9b7b29f8214949"): true, - common.HexToHash("0xcde665a44de4723a6f9bb40150dc7ca20d21733fdda9c57d780b94e177806bde"): true, - common.HexToHash("0x822f14526c7c9710376787bb5e5cab0a1cb477280606065729f3c273cd6e1d5b"): true, - common.HexToHash("0x889f071de5c91f031902e64123b74ea6e90f94ee833e3712d709309749d21f18"): true, - common.HexToHash("0x156a33c5b36292751bc34819a12120bf8e5a2d1d34118eeed0e0fce0b374d04e"): true, - common.HexToHash("0x963077489ec72eddf747827e0bb70c8eb9c2a2bd10a310b16ed995b6ea72274d"): true, - common.HexToHash("0x71ecbc48052b2389f7cd686e46fc713362c03a1344f9da2a380980e87a4e1383"): true, - common.HexToHash("0xae3706ebfd839e7d3bc9a4dec1d12342e9921c129a88032eeb6b0084b7664145"): true, - common.HexToHash("0x0b86a364ac9cac32c676146ec12f195cedce8c7c11a804e18b25ff4e5b97cdb9"): true, - common.HexToHash("0xcf14af1c61a53798783ef549dc9d80b59986f49db0e57718bad5aaffe4b0097f"): true, - common.HexToHash("0x09f0dd02af6e6f526884fdfb7c8ecedd87b31e008b638d6e8812b2596e26da53"): true, - common.HexToHash("0xfaf099e86ea0f37b37f857d506c2b779eb3437d8ddde22ab609631ffe4b6b13a"): true, - common.HexToHash("0x4e8a2cc719c47fd6a07bdca3e698b109fa4c9a5b10808a743e715af159c9f321"): true, - common.HexToHash("0xc67aacd0e9aa10545b58affa5b33b304d96d1a21c27a4c45d1867380e051bded"): true, - common.HexToHash("0x722121823bbf56e14104724c40aac6baeb0478d6ba153409eccb4445fafbb532"): true, - common.HexToHash("0x2fdf7a87991b5c47e9f16ef78ee8dab529bf9efef230357e7e346b96e5aa4db4"): true, - common.HexToHash("0x4eb22621835e985655a403f4a0ccc976ff03905505efda707fcdbe0c9892a00e"): true, - common.HexToHash("0x06091c8ab8a6d1030dbd55103334116c927997d6ac4c5fe2d869d5eab5ffb8e7"): true, - common.HexToHash("0x0ae63c594506c847ca2bc4da1633aafc38471bc72f0783e95791a16811ddfb81"): true, - common.HexToHash("0xdab84d00ad691ca10d35c0e1e4b288737c8be2c95e2eeb40c4103534d584d198"): true, - common.HexToHash("0xc8cbd2aeff706fe77fbb9441f9e01e6d5b87b881e04bc85ebf46710c95912dfe"): true, - common.HexToHash("0x98caa7bb29c69df62d94d3d80760948d1d9b44fb64e4e0bcb0d14a0d23d3a2b1"): true, - common.HexToHash("0x1b479d0b195fec9ba2401ae3e22fe9de8fe1cc07f1481c18c9b83de9f18bd237"): true, - common.HexToHash("0xb8648a220fe447c4e0b1c2ac7388cae70cb7c08e0d38b39595931feee86fa738"): true, - common.HexToHash("0xa46ae0986c2e232c32403a9a684ec94133b7c7a29198d2391d6e31754303edf0"): true, - common.HexToHash("0x3192e9b277f707797cb98c1e89e2ef06f3e63429b48218ec969ff64891b89f33"): true, - common.HexToHash("0x6d248399503ff0228ef1dd553dd7e111fafa79f4fd233715b72fa48df1bfd777"): true, - common.HexToHash("0x5b620933c0c83a6276967c7f2bddf4772a7f67d31d97e2925f2c009e6b474894"): true, - common.HexToHash("0xa4465319e24db26d6e35cd8948f85e1953b7a1e7d667ca3509f2976b1c9acff6"): true, - common.HexToHash("0x703caccd574fa5d82f023cef71174a45ca6d8aa1b35f7583787c59adaba8a157"): true, - common.HexToHash("0x042b03d5b64a66204f7190721bf4a23f08614b6e772e0c8f786a6d27f545841b"): true, - common.HexToHash("0xdeea17b41f0cf3d6f8215117a196b54ac8dcd3501081fb3508c0c3e098844ee9"): true, - common.HexToHash("0xbabdcca24e8abb0537a88edf0af7b2157ab733dc79d194e6ad8c7ac2f5050a76"): true, - common.HexToHash("0x29393b0eaa35f01754f7b1b75c299bda23651b08776d97a5deba2cd656ef3525"): true, - common.HexToHash("0x280cfddeefc8bfc3f4de6350017cb2abb467e835115a9c02ca2e0dfed78f1d8a"): true, - common.HexToHash("0x02ac71a9dce50e8639b75e4bf2d9dc701c60edc18e6079f1e09092fdc72bf758"): true, - common.HexToHash("0x87d7eed68c03a9fd5b37625d894cdafec31e5d0429c62ba389a1114b1213b33f"): true, - common.HexToHash("0xd845218a62b331538966289213f15fdf4e6f44812c422c0bf523163b7835c4d4"): true, - common.HexToHash("0xeff26c0d60098ae9dc2b6dd14332219fdd11816560cacd4bb6d5c823048ee7b1"): true, - common.HexToHash("0xd8b8e0e238b5e456b3a5b4f046d5306cba4aa149c858d70cf6877e777e67fe50"): true, - common.HexToHash("0x73ff7849f4cae30759ec926425159d7d66df32356b79e3955ae20cfd27166f20"): true, - common.HexToHash("0x713a5f84a1bab733a7e8eeb9368822776f4ef583fe4a0e292720bf50580f1bf8"): true, - common.HexToHash("0x6db38d61733124bfa6b2003bc81ff16f00548da0a1ffdd46ef95557337ef4364"): true, - common.HexToHash("0x82a7960a463415f0a11e91593620904d901233064c89eb32d05c9997bfd2c3c2"): true, - common.HexToHash("0xbb0708967897c9e6d6cfef187c8a845f5fab0290c0b70eff9b4bedb29f506a78"): true, - common.HexToHash("0x516f4ab1b0ac1adcd30acc83a5589f808af1ea8510f29704ca183b7b3531f583"): true, - common.HexToHash("0xfaabfe52672f6adb3d706bb9cebb0c6000e55e2f43ae90ca1d19955eefdac98d"): true, - common.HexToHash("0x3d73faee86c20571f3c30f35fad59d25bf6e84e4a87cc085f5330466d640422a"): true, - common.HexToHash("0x0c75729f7dc5df557a17c1fbb7cc8a8396f46eb67d995c77d5eadef49d461414"): true, - common.HexToHash("0xdcee7debeb2a5a88bc5cf94aa306b619789314731033b07271f1584929be1f86"): true, - common.HexToHash("0x50519af0b6436d125d525fb5408eb1c0a22965e406e623251963a6d0a89406ff"): true, - common.HexToHash("0xcf989a9042f77c9052510c19cc39d947b662127c07ed4056c403b6de1148b998"): true, - common.HexToHash("0x97b18f532f28aac94d56c023dc790bf1469e32375e661e22e4427045a11688d8"): true, - common.HexToHash("0xd4392a357317a9fe2a2b1e1351317aa0a3585dc5d8e1eac3afd24c653766e006"): true, - common.HexToHash("0x61d2f981fa935a869c9082ad3ec5cad09a757e39226c28fc112045e2f8f8d7e4"): true, - common.HexToHash("0xf8d405be855fec405dca9d527bf41baf3b12a7ae5c0c940f34246dd2d76a1ab7"): true, - common.HexToHash("0xf1cc73911afcdf4c0c4a4b2e8cd0144d8e480a9762192e29417f66ce4ff991f7"): true, - common.HexToHash("0x921069a27cb16fa2ec6ca236fee0614ab8ab2d8e85a14e7525f73d1204275424"): true, - common.HexToHash("0xbd1dade6793523292656aa31afd71afdf205b6b81ede6d512cb5ae62fe089082"): true, - common.HexToHash("0x4f946066b72e4a93c4499683c2e94791d1463bf61d63a51142cb29fb2065daab"): true, - common.HexToHash("0x786e5e4b494499d4b8992de77002509a39f683b28cb589fc055d21400e6d4b13"): true, - common.HexToHash("0x6e292233f50c56dd904bff5c6f8bc3396dfe32510a5b969068710a7cab658649"): true, - common.HexToHash("0x406e13262d9b8d5cd3d5efbd02e01c1957e99abd4fb960cf696ef187af2183ae"): true, - common.HexToHash("0xbbc9d7032a1a19811f94f925ce67635411a112f680a0fbebe9a2b06abdb582d3"): true, - common.HexToHash("0x6524cf96e5dc557b5d354442724ebc23ea61c7ac2720c2f9b25aad245dfe4c94"): true, - common.HexToHash("0x18ec710c1fdb0a54851dbda7dc817e36db59b5b92aa5a571ef89952dd6c6b5da"): true, - common.HexToHash("0x02f1503085137dd387b9cbbbb50ba7a78ff4c53c1a4ebfe78a4d7855012e4ca1"): true, - common.HexToHash("0x3a5d1885cad7052f66e69aa7f41e92f63077b759af72428c00200f477828f3d4"): true, - common.HexToHash("0xad18b1ccc31c17632b977c759e369369601edd4c4111241de481a2a423b1416f"): true, - common.HexToHash("0xe28d829f72da22eff401d536361ef1df2d385c6a7f1bfdccb9402e045d4fabe0"): true, - common.HexToHash("0x768852d1a0a0b0cd9582c879c5cf137a5ba49a21d8ce709409d0be9ba33c6602"): true, - common.HexToHash("0x5a34768f9f1642b60e4884261bf85d4fae0dd139441fbb371f686f87c73d0d55"): true, - common.HexToHash("0x1de6d4a1cb36523be48214ac588498a937cf6f1d7bac125fec4fe6b79b273ba9"): true, - common.HexToHash("0xd19aabfaf14cb0c92d01e80698ac3bab3ca832b7bcfc2ea44130da422a9a6522"): true, - common.HexToHash("0xc2c305bce1a88b47d233cfa3f67a4704ed2aa0cb3eccb6c7c3765d1762cb4baa"): true, - common.HexToHash("0x907b680a61a4d46ebf0b20597b8415de0135fd9ee3bc5780b9fc6ca4bce6839f"): true, - common.HexToHash("0x634ae21fa92f322f3833fc2a656377b144937f572948faa0ea94ec59ddb555c6"): true, - common.HexToHash("0x6b319aec254c6314c93612410fbd8b3e5ea1a6b193ef372435631faf6486e4ad"): true, - common.HexToHash("0xe32e25521b56707a62e388a18fb04021c5bec34dff4f3db40169954e76dbdef1"): true, - common.HexToHash("0x7021a73a1389a2e4b3a7875bb8d49a95312a1cb22d7c1615c615ee8db4266ea1"): true, - common.HexToHash("0xe665294d812c0b8ef77e5e465606b79b25f5206b21796e35a4c4c6fa9b81a766"): true, - common.HexToHash("0xbdba5da145d6e1d927f925089b9c646a2798023fd75af14f0ad6580dfa3b2b6c"): true, - common.HexToHash("0xb515afcd2752b99bc667f647384cdb43f8a2db63fbaae0c62d021466a3f2fbec"): true, - common.HexToHash("0xc700fd153de986dd56ad0bc5c382c1935249f3a22bb7f96a43cdd31af361cfe0"): true, - common.HexToHash("0x4168a0e12b8a8ff19c95a30f3a2c6630c352bc11860588f7a476d92136bf3ecb"): true, - common.HexToHash("0xc97619fb04ee2fc53530e72df24c8ea2664eb36c8fe8bbcbf8b96771d596d29c"): true, - common.HexToHash("0x156a39769d281c42f0d803e536f32bdd482da6cd251a5f829feb8d65a3a20ecd"): true, - common.HexToHash("0x811b37fa1c2ecb3a6964e4ad88d149a662d1f18ffcddca704989356c8b413a02"): true, - common.HexToHash("0x784a83ea88d3c1177b9f1657a2fdbf4c30f4ae0167cd22f524c7faae6d394ffa"): true, - common.HexToHash("0xcd2a03224f4c4670fdcd4274a6f59657a84fd0472c454ba82df920c68dae9265"): true, - common.HexToHash("0x893feeff55fbf9ef8da9f415c1cfe7891f7e882877ad98fd8e32b1ccf9939e5e"): true, - common.HexToHash("0x79f9c80d4859bfa0a9d52a4aade77f695576163026d2ef5bdb150e7cd0ccb888"): true, - common.HexToHash("0xf1eb1f711d8ad99801dd463906f42739cb4728bfea73c13e65b0dc36d4c149e3"): true, - common.HexToHash("0xd5099a26aa58f6a4703c36b9ba487c249851119fb820be0d778f1da6e42dca84"): true, - common.HexToHash("0x2c2cf4f3671531f5ada25d3945b694d2ca369b0be8b9f7c52f8a589e35d5d81e"): true, - common.HexToHash("0x725ba293a1c23725838c1340e1eba2acbdcdae0a03b432234612899958c2fcc6"): true, - common.HexToHash("0x9dfc13f52bbd6a1f0ae6fea0b859f2fcee4727eeedb9fc5df1d5c9e821154aef"): true, - common.HexToHash("0x1a1d2b25641a43b710024aea761c635dcfad6e961edc54b4b71de9d7d8759b1f"): true, - common.HexToHash("0x0bd4369dac27c2dadbded2b03793d1e6f1201139cd355509c40a76b13212a321"): true, - common.HexToHash("0x7e8d09f03f2c67f6c6a57e9790cebb3f0dbf0e0ba33c61f7d120d068ba202c83"): true, - common.HexToHash("0x7dfd4fc6f6c8626090c6d35eb3edb741897a2814c085493a634ccf47c6b6ca60"): true, - common.HexToHash("0xb9f0a5afab78741d4db7c165a5d469bc1ce287917e8ab1f7e83a71b595074f1e"): true, - common.HexToHash("0x0304f81e14337421061384fa2634489099b745b443e947fedcae80ce0e877a9c"): true, - common.HexToHash("0x98b48e25db87d1e906e56505c60d6290ea37bcca41c4241ff342eb415d755814"): true, - common.HexToHash("0x8997798347ffa5c750a067133e9e4b76ffe6dd227f5ca33f4018527bc833c158"): true, - common.HexToHash("0x45f2698e37f93d287fadc2e3c5c13272a4f41276cd7b6ae3028c902e69c8dffb"): true, - common.HexToHash("0x44ec8a510162c727775bea1a54b2dbc5da4be9aa5ab448cc9b8531b6c5cd0b24"): true, - common.HexToHash("0x22a943e157c07a5084f13ef5a0db3709be0275e652947f8329f517fb21ab58f7"): true, - common.HexToHash("0x4cb4d847519f80ff5e2a567cabb5add300f95c2bcb6c614ff96cd038a6e7a6ad"): true, - common.HexToHash("0x312e0cf86bed4e032b3076e7d17633792015647c6116197a2ddba0381f0f3173"): true, - common.HexToHash("0xa7256f63b482a7c24bf7dc11040c88d9031e5ab4205c533d0587455dfecd3e0d"): true, - common.HexToHash("0x5adc6f351c9515ef5bf998dbbaf6d47598d5846eb322f1b2787904ae52f3f04a"): true, - common.HexToHash("0x1570af73341dd8d608d05e1fca3536844a0d4fa49fe3f9c1840e4d28c1ceee70"): true, - common.HexToHash("0xf1ca88e3a74e4aa6aec358b06c86cc8d36f1cabd8d3714da3b90183d8b7d62a8"): true, - common.HexToHash("0x84db4c62082867014a58920b42e48836ccfff9674d0315e935c12a13d9a19241"): true, - common.HexToHash("0x3b6c900e696f09afd0e85fbe4316782a8bf23ed4e2e6a1169b256c27a333b126"): true, - common.HexToHash("0x62795933d1005c63c96fbcf3c2f33838dee4261f9504fbc2ca47efbc1aec23f8"): true, - common.HexToHash("0x49dc7e614c39e6805b49195760ec08dc83a4f3907db289bf936d76284b57c4f8"): true, - common.HexToHash("0xdab8127bc7bde0af7214a57e63bde8ef388ac143f63f4e7116614833b75d7a35"): true, - common.HexToHash("0x338c586f1734fa269bb41911767abf70d160b00864248a08b32ee975570dcc33"): true, - common.HexToHash("0xd4ddf71f8ba5558fb7946eebb7520b4ed0f22fa2db540003d2260e183242c969"): true, - common.HexToHash("0x4d2db5eea9839a2b5d4ae752cb7432b97cbda3457d4bc3fcd96d3965f118e7d8"): true, - common.HexToHash("0xbe1fe5722a34cf32086fd62a45e466634bf5ce677d892b9b0e10e85e6b1230d7"): true, - common.HexToHash("0xee1101a789096a2f35092606ec9a73538512217ad5ac22055899b1a7be1c07d7"): true, - common.HexToHash("0xe27b44efb96d2e0bd640d8116e7be3cbf2b9256ca571546d5f68d50b8bbad8aa"): true, - common.HexToHash("0xfc8ea507980851a078ec1fd69789582f21804efa71623029fd8f548a8eaebc6c"): true, - common.HexToHash("0x9d383384a15816af40665d5b4ad8d750d9606aaee9b706d79aa9b998d564372a"): true, - common.HexToHash("0xb5f35871d85312834ce5008af176e53b0ba692a6c1d459005fe929f78ca95ddc"): true, - common.HexToHash("0xda6b6e187f96386cd04cc15bb2bf0c140a220775d92408f755c0f8a9b8de38ae"): true, - common.HexToHash("0xc05a68fbb9db8f9d4d56849bf159b694fe145ee3f52ffbc05aa119b7b90270a9"): true, - common.HexToHash("0xe5b2572916cf241adafe8965d380528417bb401fdf2387b2ea1682498e715329"): true, - common.HexToHash("0x2a487ca7563800e1c74f7a379d868ec8c48dcf3a949e7cab553f73efc650a94d"): true, - common.HexToHash("0x319234735d50a10511c55ea8cfbacd38b4d49108b3683126a48e1cd67b384c27"): true, - common.HexToHash("0x41bf535fdbf088ef4375917be8d1f4a43768c259114d3ef0e62a07ce7cb67124"): true, - common.HexToHash("0x158d6bf11a53c797d0fc3badaa316faa406acfc86f272cae20a2a549270e5e25"): true, - common.HexToHash("0x0f3b938cc6f186c34fcf9e289638d533766e5a6f141841dfebdeff1fb7010537"): true, - common.HexToHash("0xf6da0a8e47703617122044a016d3c67d1e3aed4ffab00352040cf885dfd37703"): true, - common.HexToHash("0xecb54e404a5df6f0de5fd4b5b3d61a83f316dbd89f83fa38128a5aba61524289"): true, - common.HexToHash("0x5831cccd4729b6779f51e494e840b733d277aa0f387ebc3d84fa94856a7b88c1"): true, - common.HexToHash("0x5e72786a28bf3c4cbb2b54be879d106c6dd6ebb082305b32f754a4d2d847c07b"): true, - common.HexToHash("0x3ce0b803c5e928e93bab2bd926e1be8b3b402d0999e793fa53308e999befb66a"): true, - common.HexToHash("0xc27bed6e8836a54906aa4128beb477bc646611632677f86555215c8fb2c2ff0a"): true, - common.HexToHash("0xd6138363a22edd7a2da5f2844c856dbb93698f47345657e4beb66a3710884644"): true, - common.HexToHash("0x77c9e4ca5566ba474d8e2b7d1cb4d1949a63824f9fa5da839e5cafdaa1cc126a"): true, - common.HexToHash("0x10dbfb4c94e333cd82e60b0b7e8837f19054dc40dfb5d77eae0427782f50d0fe"): true, - common.HexToHash("0xa4380d5c3f552f3ee1edf88fd768c7f53e97c82f172d124cadd8d37f2eff227d"): true, - common.HexToHash("0x66a9d2a68d4765db2b36c7ed9b93e106918d822840998233261ba5c28c053c9c"): true, - common.HexToHash("0x09d2577034486ba0baa3f0c80d28760ee743b015cb93f380b9269ac28a5070fa"): true, - common.HexToHash("0xf73e10d75a9aa9d91e741346180644e12600a0752d14502c8764b7e5e3f2662c"): true, - common.HexToHash("0xfc7fb2661f7af334989e999ba872b3ea17b0807e24fc9a6492a3e03854be997e"): true, - common.HexToHash("0x5e9a8919b3bb45421503942f306cda7f3a43e94a9c4565dab1c239172e5edfd9"): true, - common.HexToHash("0x27f8e08a1ec99e3b2de414b0d3c165c01402c4359e59b21c3f2d7d8f0c07941e"): true, - common.HexToHash("0x89ffb5fa5daba4d11cf53c0f65a9f0d95d87250913a2cb159c2cb0e09688bd3a"): true, - common.HexToHash("0x8eb8689423748853442a494a4544f0f1300c54e41669e037814f0b151c921035"): true, - common.HexToHash("0xc783f50936a1f8299b75ab3a21faeac2552298b7d707d9ee1045402ffd28702b"): true, - common.HexToHash("0x555f6c72dcffa24be8c2be35c0c10a01227fbc50cf89cd768a1b8d09b98e2a0c"): true, - common.HexToHash("0x41e91328043b4f0ce7bcbfb85299f605c95973c60aba4881f51560d584a9edc5"): true, - common.HexToHash("0x919c38aa69e35ed214f3cddb800891e37d23e827609fc50be3724e75ad7e8d7e"): true, - common.HexToHash("0x06635b03949f669aea0abdf9d47a21e9824130017de76c4209a63fd8a07c43d3"): true, - common.HexToHash("0x8e7e671cf034b1e611d6295f25c042ae0c132c483be5eee449153e5653830179"): true, - common.HexToHash("0x4de231cf6a9d4165049e86244c40423fe5cbdd38e3c3e729804f7a03f868b3f0"): true, - common.HexToHash("0x05763b197d9659d406575ca96b1ec87c07d641eddff17647fc5ab55a8fef3a4c"): true, - common.HexToHash("0xa70b65066c97ed87f409c81df2ffd01b16a698a15490218dd9bd954fdab7286d"): true, - common.HexToHash("0xfc975300d4f2a52c5397f9f16b2bb3b072654801a0d33450c70690a002fda04f"): true, - common.HexToHash("0x489abcc25bcd85b3581bce078970b67ba68359a9f8b619d190c8f5827f778486"): true, - common.HexToHash("0x05d791e89991634e64eaeb676208ea35f9a73e65823d25e6ec8d2f7ab8709806"): true, - common.HexToHash("0xfdae37e4661f1e3ddca369fd5e38805e986abea591e304dd67e8f9af620aeb52"): true, - common.HexToHash("0x57ef4dd8f4b6cbaeb89824b56a4ddb4bd5ab56ad8bf2ee4d8ae09389c68c762e"): true, - common.HexToHash("0xeb71dbbcdbf257d75e3155069a18d72873c0bf0dc0c2bf10574f20341e6a3717"): true, - common.HexToHash("0x51f61c9ad3358aef07ad726ef90accd997044232dbfe246d8adec33b3be0d6d6"): true, - common.HexToHash("0x4cc562819110912e18b559edc6d28b9ef2e002203d5cf47cd45dd8a53de45d00"): true, - common.HexToHash("0x6680a219a93e20f0998782eba7b531b9111abd6c00eaed3d3da27d464f9d4279"): true, - common.HexToHash("0xb568e8db1e2d72c12729d6ce3a55ea9bcb42118e1eaddcd634eaa47d53e24f95"): true, - common.HexToHash("0xdb02d39d5a6eab5a5fbc076070738311ffd0f31590ac2565aaa269a6d052119c"): true, - common.HexToHash("0x74939f564978bbe4d175ef0bb4e075e0b6c463c0ca046ccaa68b901a237a6948"): true, - common.HexToHash("0x82d4f69e57d78f619fa9ed6f03d164ecba88ab4071a0d900f04a757d1b4541cd"): true, - common.HexToHash("0xa30ba1c1f3096a6f118e8ce4ae494b4c9a2013da85818a6d38f313e77a1d9fc8"): true, - common.HexToHash("0x965329c9c9ff2c28fbf8db97a56acc0fb3f3a44978d1f746dce7c127ffe1331b"): true, - common.HexToHash("0x2f182594e12e078ff44df98483f43122894d82918628f29ac1209d351353a7ee"): true, - common.HexToHash("0x37b2062e016aa0878bd502550dfad93dfc57b00f1e8550783d03dbeaafe3aecd"): true, - common.HexToHash("0x4ed865211711dc0b4d7884059046be1fb3d87c703694067edb71d029314b043d"): true, - common.HexToHash("0x41d320f76ed724c9fac0d1810f478d88fd845d4b02f0d22a97dfad6b64fc4f69"): true, - common.HexToHash("0x3af24e057da6d4b3c8df04aec2957d7d8868871b0c88d8c36b76852d00c2f02c"): true, - common.HexToHash("0x8acbaef3ef7204f2c707d3133bb3c5fd5e1d188e8b0fa665d63256fdd6119b2b"): true, - common.HexToHash("0xc998faa19fd049985f3ea8f837563f9ec20b07f25af42a026809a2c778d96599"): true, - common.HexToHash("0xaca52811b29d00683bd2d06faae3e984456ef452e18b964e2e1168c2647f5e9f"): true, - common.HexToHash("0x357f39f083f40828d315359165e88f674f82cab0ae7b821f5a52e1f63987168e"): true, - common.HexToHash("0x3677b73fbd038a61efba68aed01a9fdb2eaf17aba697e0d9aaab26440b8565fc"): true, - common.HexToHash("0x07a012a6ef48db600305bb14b0480c462dcf91530c55835e050ca01fe7c4e194"): true, - common.HexToHash("0x00a787cba3a25d06f3b0f562895e5ca8c6fc3dec15a613f450a54800ef3995cf"): true, - common.HexToHash("0x86eed7bd085b9163a97c017a6e1b1e9398a9dc7a421b1fa3682a406ed7d3d007"): true, - common.HexToHash("0x85327357ecf0bddcc3dfb81e1b20fecb8f989441a1b35facb0419dc00179f817"): true, - common.HexToHash("0xba4266ae1bc464d19a59559507400ae09ccdc9bd425d80f89e55e6e62a15e696"): true, - common.HexToHash("0xb6bfbab3a03775823c778e02f2516e004059bca485fedae580b15315855238ee"): true, - common.HexToHash("0x4385f31f2f423b3c28de244042fcc973450e956d291cda225cfb49fd42b6a01d"): true, - common.HexToHash("0x383d2b718b5d5a8ce9f02982180d0ce33d73d71662747afadd3d87719e0a97ff"): true, - common.HexToHash("0xd86834f5631db0df6eacee15e6084be55e5c3cd328f5e29fdc66c72c8700b70f"): true, - common.HexToHash("0x619f6735cbe0727a34b7de2ca178441a0a671db7ab922faf3e654c52aed399d5"): true, - common.HexToHash("0xa8187048afbaec376a9a4c50237349d9e80066db35293dbbd1bf6c5221ec0995"): true, - common.HexToHash("0x38c5586e2ca1bae44c185a709f335ccb93db7717dcc9a2cb73520a00ec16a7d0"): true, - common.HexToHash("0x38aeff39def9101f42230b283f890b129b2cd24c24bf59f7626d55e34e3b0416"): true, - common.HexToHash("0x90601f42d76804c5826ed4d3d55793695c727151fa774bd0746b8e975ad3be65"): true, - common.HexToHash("0x101174a9a6c6a8fc36f5c42415a15f85a762f1a737ed41fad7b22c0dc8d5ad40"): true, - common.HexToHash("0xf5db6be27d1e92ba0cec3a9f1a7eeea0dd35b0624623ef6fc803cfad48c24924"): true, - common.HexToHash("0x1eea70dc801eb62780d82da84ff3d8900a218c936c347f88f784359133fe8c42"): true, - common.HexToHash("0x25ecb0285b5a64772a5fcfe8bd9a082fad6d220820a938802074d44b766bea64"): true, - common.HexToHash("0x49d9c1f5775c0f8f64e9dd9ce3c5e16f014ee653d8477de91b1f4f7962e45888"): true, - common.HexToHash("0xee0b0176edd39b9f3d7d831bfb457d4bdcf207b5fd4e9b72d02d5a1409221f2a"): true, - common.HexToHash("0x6ae4e9e03252033e12ea1acdf456b1881ec5985807c391c9dcee74ea57e10aaf"): true, - common.HexToHash("0xb08a0be4db6cce4199ec36a5d02a5895ef0936eb155b718aaef3e3570dee6cb8"): true, - common.HexToHash("0x73fd661e7a8ca075259d5fb0105d051aef015f419178d0f31ba50d396892d815"): true, - common.HexToHash("0x6f0474cf5c074717e08d70c5e0386688ef2fcc697c5002923cfb6d6c5f391601"): true, - common.HexToHash("0xd7d68bc37c5f4bab9f8efdff81d39e8a16d83d91efaace66e6bfec6aab5bd95c"): true, - common.HexToHash("0xc61b5bf555528b5aced413bdf17ff9b122bd681e619c49052efdc81106131f91"): true, - common.HexToHash("0xf5ef310f117c215225c93081388f5b7b8382949f36437effc7d6a2cb251f8005"): true, - common.HexToHash("0xcb988e61b26edc7b9582c8277a2004f39eaca7dfee5e132f96ea1436b95c15b8"): true, - common.HexToHash("0xbe3203f8d167588ac4851dba4e54780a06b26127d4b46107be0073f38cf2906a"): true, - common.HexToHash("0x06145d9f5d30dfca0e02ed20fb5206c161c4e57550c0c026d509c9786c4f57bf"): true, - common.HexToHash("0x7ba6c475a5a3018889649fe2b6fd387d91885c3ffca5e11e62a1308952b08ebe"): true, - common.HexToHash("0x3ca7fc61238fa6d6439781f77276e2ab7ab7102d3fbcbe408734075e93f27f80"): true, - common.HexToHash("0xdbca617b23c91c4598c26034a06f72c2b73c30c22d2f1aca0ab488e72f6d9d54"): true, - common.HexToHash("0x0d9d5669b6bb06ae49e44166ce4b69498eacf1137dab6adc7a7dd3a650e11bb9"): true, - common.HexToHash("0xf5ce5202532b63ebd17b997b1bcd357376922463a002d09b236d3a18ea48e259"): true, - common.HexToHash("0x3cfacdd0a788f03713bd58a3ce876c5e6db3c84bf1b5205fe17223239923832f"): true, - common.HexToHash("0x8a5e7659d10fc2a59c06a5010bf41947bc3c8e34c65a40ab1a82bc0d5abf09f9"): true, - common.HexToHash("0x081fe4697b8cc3f616c5b70e82f2c67a3ac4f70cea5e1ec1c2baf22a4103a215"): true, - common.HexToHash("0x6385eb5f3d3a84e89d57150a42f47d26d0b3e6bde0bbdf79e373f0ed9d06b564"): true, - common.HexToHash("0xed348dbd99d42e57ed9b051172fd07eb6d7f9bc13432d9f34aa2c190b460c23a"): true, - common.HexToHash("0x27056d17be2230f114c54cff9b6c0e0ffbaa5f3b60887732c8201cace145d4a1"): true, - common.HexToHash("0x14d7ad63d53f62a1356f77b8ff2ff3b60122d8bed46f0726f7e2d3956bb9748e"): true, - common.HexToHash("0x3de1bdae2ec41ca4beb5cc6403d08e23197228fe155538a0ff49a0ee67c60d5d"): true, - common.HexToHash("0x1b75f133ccb808d0ac6ca9f8c13fc36c4797f4516f7661b9cabd16455b6f4b2f"): true, - common.HexToHash("0x6f68e93539aa52d761cc17d38f254a70668f3dd592d33b22cb0a453bd58129ab"): true, - common.HexToHash("0x94133db621e446636b88d8cfe4b3d5b32e674eb73bdb367f508ec1fa3d9a0641"): true, - common.HexToHash("0x975b18da0085073a966f1eaa5871d9717a85d4317c545bf547092277441a44f3"): true, - common.HexToHash("0x2f753478d5efa8f9adbacaa12aa8095fe9bf05945eac358922e2f874c170cb13"): true, - common.HexToHash("0x6f2867ded768b51b8f571fbe8efc11a9a5f24014e7e78a3f33fcaa590676e623"): true, - common.HexToHash("0x7a769e31d64a05d38ddeea364dbed70fb1e78d7e46c0b8695b63e1a9c8433cf6"): true, - common.HexToHash("0x9f959d5925c363d07ecc8e25ee396447624d3a0d5e1d8c08efffff72021962ff"): true, - common.HexToHash("0xbf61566b2258772d2536b6f6b9aed6036a59ade97eb52a3e44314566086fb824"): true, - common.HexToHash("0x9f62513d3889d95aba00085bd8f22db6a38106307c2b232ffe7e0272ca25dc7e"): true, - common.HexToHash("0x85f7adca9e0372399cf67cfff088012999790133d1d3f66081fd4bca85fd2d13"): true, - common.HexToHash("0xedc8a14bbdcb5d412856bd3c5c1ac76691e57c3190674d04451d6e12a1eabd69"): true, - common.HexToHash("0x68d207b7021aa8e1d3b488c4caaa33b7b1a29603216b29b158b3d58c0941de3c"): true, - common.HexToHash("0x87b1549365f56299ae5321b7ce469d788c65cbd51599720b0576d7fa5cb716b0"): true, - common.HexToHash("0x2b1cde010d1336c2a6884a823f5c1e33f326e2c499a75ac50b6f3d1f9929d7b3"): true, - common.HexToHash("0x9757531e576a8a784ab9e820ea7e928b0b11a7adb97b161f2e993874029e9663"): true, - common.HexToHash("0x8eedefa05b954da090c02fb515e5b07a429e3d3e97cd3472be582e66bb4a1acd"): true, - common.HexToHash("0x30a6033e53557c093886b521e5e4508f2835752ba1f694123f3855eeb2531bbc"): true, - common.HexToHash("0x95e4b7ef42ad25c5f23362e657afcec135f89ab93c993df054e62fff41e48d55"): true, - common.HexToHash("0xe303c0173512252dc2004e9a6a5f9cb5f59bb5855e89ca64769df18ec4f63089"): true, - common.HexToHash("0xac42b19bf8913600f5df5c95363ae2487049d390c95ea91aa1d09609de45b384"): true, - common.HexToHash("0xb3571027c253d182e45353ca6c7519e9b9a72225d3f64c81f77d5530fc966735"): true, - common.HexToHash("0x0a6a0e2536fe33510cc1446907fb7b9d425735ad1f99a044e5d3aa6c60bede38"): true, - common.HexToHash("0xa662812bfbe4d7ca89e235f58e1f145b7eaecff75f21092530c62a4a81832272"): true, - common.HexToHash("0xf613a5babfef7a176b4d355993e8a787aa0666182dd823241429a70fd9fa272b"): true, - common.HexToHash("0xdbbaf3a995fbccc7586a471a9e540669d737603fd67670295183368e88832c4b"): true, - common.HexToHash("0x9a5ddc3f60739b36b6c13a5714fa3f68539b839bdef4512f70320b99c4309f44"): true, - common.HexToHash("0x9d78342d8dee0b16a5628005bbed9554a04f5f9447b6e04a013ef99d8aaf0dc2"): true, - common.HexToHash("0x66c2b08527c2bf88db8beb14f45a6ab5ed9060dd169bce41ca715bcbf0869d75"): true, - common.HexToHash("0x846344d861497907c2458384f9c8f130290e858582f144557991428dfec44331"): true, - common.HexToHash("0x2a0f2960eede6ffc5b334ebe463035c18cf017488390fae0c657c3f858fd786e"): true, - common.HexToHash("0x9e486ea81f54b8a46ddb00c2a79b147d453c95ed1265047ce32dd0975087a7e3"): true, - common.HexToHash("0x46271634821b7f512d12268c7b472487bee0d7f655bafacd2f438e4994ee0ad3"): true, - common.HexToHash("0xda8e2e5d4e8eafe9d5ebbedf5176fd1ba99ce3d110a83f38dd995196d43d1f86"): true, - common.HexToHash("0x9172aa92b0381ffc1737e5eda6785bd123951f1680c474b9a78080ca745a7137"): true, - common.HexToHash("0x65e8e0f69a6b381e6885141f06f755edaaf773ad5947b9b93035217b68f02ace"): true, - common.HexToHash("0xa7b4389cf5787ef08b724bce2e46d85b2ffef3c87516563b322636543edf05c6"): true, - common.HexToHash("0x42dc633900c73c2c499e1b6b78271ab372a3da1363a22c3ebc9e05b38f548c3e"): true, - common.HexToHash("0xbaa12dd76660652a5669a0d5466cb94c398af26321887e227d89fa54b7ca6ed2"): true, - common.HexToHash("0x60157b57e0feff662220c1ce21e4c3d9505d152cff36f07a9a64b34ae23db7f7"): true, - common.HexToHash("0x6572ddf085e774bf538f2f96802956d4201abbe4b5ed1bfee1dbc02d8f248361"): true, - common.HexToHash("0x2a65c0b40bcc92f34dd632be6e84175836792c0eae9c515971ce6cddf53447f8"): true, - common.HexToHash("0x158d09a0682da518fd88ff2e7d0a04f43062dfadeb2cacb68a0c66c86f541688"): true, - common.HexToHash("0x858cfb5ecc87aa8f7bd6622bfb8deeb1d97743f1bb9f4fd7728e756a10d473f2"): true, - common.HexToHash("0x7db87cf8ef1e6219be17fce895ec033150cc140371cec47fb47c2f6b23aec20f"): true, - common.HexToHash("0xa0a700e84fc596adc5ed4315391ce943170c6c12d2a1a4c822067a067e3828ae"): true, - common.HexToHash("0xb73da0413468e394e1f0bcc36f81031faf5a8b664fa6a7d3bbb77e55b0e94c23"): true, - common.HexToHash("0x8a3fdb8c0ba0a4a3f3307fb379aa55a57aaa45ae0ec6201f8e0058a13eb819ce"): true, - common.HexToHash("0x500e44ce79e78452c4509bc481e5e64968f6fdfc9b2c389cb1f76c13dd38b921"): true, - common.HexToHash("0xf2a3796c09a2b82cc370fa5b3f866725ef9e72b02fd278c44ba82a961fb1b5f3"): true, - common.HexToHash("0x315a2873d67f8166382e8abaa83c3329c89db0e7d8ae27af570ebb73a53b92a0"): true, - common.HexToHash("0x12ef64a2f5c2a6afec910eaee75c0d4c5a482fe9d1d28043c4d921ab9b2de390"): true, - common.HexToHash("0x87c8693501364c646e492d910dc9c7e6a4fe8310bfd9ab8b54a0fe0a7010bacf"): true, - common.HexToHash("0x0dd2ed8391466ef61db84dcd8a466181461a4db1806cbb667207b252eaae8b9d"): true, - common.HexToHash("0x4640f454b0cc84bc79559e409da0ab927db26c704c708a5095b692b5f8caa1cd"): true, - common.HexToHash("0x459a6afd5867cb72a704a5aa31784685cd06f41dbfed0ed154e9c57aab3291da"): true, - common.HexToHash("0xf5b4b03d684b502529973839b912cd890d36ad405d7ee1ea20a9539d9a1c2679"): true, - common.HexToHash("0x2d00fde3120e8c273d25ad2c770a8f51c4f61776aa2c06329b3ccf67f2c82db8"): true, - common.HexToHash("0x885d9a51170b4a51e2e3495cd285fb66f3ac5e5fb8fe12c26e64a4b38a4b0d70"): true, - common.HexToHash("0x17c0be05c5b1159fd2f54366e71de6be4b740a10441ed94eb2ae7ecc873bf087"): true, - common.HexToHash("0x3fd969c9ac44d7ea32d16a54359563eaa42dabf5faba9961fa00ecca16626ec6"): true, - common.HexToHash("0xc0043a987388e69e8b7cf617c98cae77be448e51b4998332a83dd86ab1af282d"): true, - common.HexToHash("0x16b03f2e073fc12f16ddb7aa3bb0c2a3258aa04807875381edd19ba0733f5027"): true, - common.HexToHash("0x4912fd6c6d0ba5b81b266b27cb819281d3c6eea2c8f0cac09dde67befa3e1379"): true, - common.HexToHash("0xbd83d691729b086b185bd75760477789f2eb9806a9b8b6ccc50c8b20d97ce269"): true, - common.HexToHash("0x81f74d0915f2d186ae51ad307829fe79dc3199d4131f6ce5c59c3c4b12bb81d8"): true, - common.HexToHash("0x93adbef57c024b1341d23eda5e8eb2535114fec7a2bedf4fbd231250258695f3"): true, - common.HexToHash("0x23053a33aa3385bf59a99d3558cc3e671b2041b723091719a22163acb0599a25"): true, - common.HexToHash("0xf68e88aab3bb67e24d0d17388bac49c9d6cbb6867a8054cb881e5050ed707b2d"): true, - common.HexToHash("0xbf1840bec044af22e64cb61a50b4042690574357f7258e55e850a6c555e24755"): true, - common.HexToHash("0x449a22fa516a322f0df4d0ce1db8b16d25d8285fb763b9aaa82755715901ac4a"): true, - common.HexToHash("0xc6c2091b79f1b60b30ecd89799c98c9dbc0ed1fd686275729a1259ff82a836ac"): true, - common.HexToHash("0xe0f3ca4697ed441b8c2e05b0587711b5d929684df5ab1ae8147ff97e31c15b3f"): true, - common.HexToHash("0xdfac656be12fd56678bc01168e4e49a1694839f7f1490f28971a89d7cbbac56e"): true, - common.HexToHash("0x55d58f4adeba864fe19482260b8ff20bc31c9874b7c90f28652d88a65bca7db9"): true, - common.HexToHash("0xa35bdfcaf34d24563fd81ebdd7ab199433f45a8abd5a3fc824a29c9c7cffc49b"): true, - common.HexToHash("0x9d713c84940ec201711ac0f2d77edef6009547da82ecd95154e0cb6549b7c34e"): true, - common.HexToHash("0xbc01906d4962195a5587977edf1313acd7891967c37ee3e75d2ebb2fcbffe332"): true, - common.HexToHash("0x9c1dea6cd0cf2fccdb58bd6abb57b4e39194091ddf7ca51423bc7a73a6015a6e"): true, - common.HexToHash("0xda0d680bbdb36e097072cc301f6ed4da88e5a98d822e09d0394e4df3d1ed02d9"): true, - common.HexToHash("0xa504ecffa2f2c84a57b69ba839282e73e8a40165cec54aca9e498fb21a3e9acf"): true, - common.HexToHash("0xd594b77de7290f66385905957982857ceba29e615501ab59b28c35690b869976"): true, - common.HexToHash("0xca3de49cf1a50b562b700091fbb26baaf8051e7c39ddfa38a9783483e835c065"): true, - common.HexToHash("0x2fface469782c21e4513a55928ac600bf1cc33537f250ed1618f58911193aa6f"): true, - common.HexToHash("0x763769fd2842895dcf9ad496602e855140c827f0e96afc7e25113e365b777950"): true, - common.HexToHash("0x184f2040b02293ded69b9667cef4d0a50574d9983510d7cf9e5837a803e934ec"): true, - common.HexToHash("0x435e5bc828727f42884cdc1b55fa9e3c7e0a502414a1003ce3bbcf46e1eb9e52"): true, - common.HexToHash("0x0259f48e2a21d4acabed543421e283ba0d06c62beac2f3bb13da892e338e8585"): true, - common.HexToHash("0x7dd46812b9500e3e841f642b90f677dd0f1e7595474356a7c48dcfe91650cd89"): true, - common.HexToHash("0x691a8c7d5dc80e889a33ccba5a3eb0ce3a3bd4548fd7367f3acb5c4de7646097"): true, - common.HexToHash("0x9b0703ab75ed8d165219a56349902d4938661c2ac714588fae6ee651681223fc"): true, - common.HexToHash("0x802b59179b7f16bbb7a90bb22987f4a15c26487c21f9dc26b65d43c8e84d14e1"): true, - common.HexToHash("0x074e7feee8bc521646c196db2634ce5d0c1597cb9daeb99309bf2cc6151635f3"): true, - common.HexToHash("0x240c95bb4f62619b0fd09dc652090284b104054040ce8028e0b83273bcce1af0"): true, - common.HexToHash("0x70461996116b36bd0bf6e75859d6ff47a4a4a42a618636264e119b08de41484d"): true, - common.HexToHash("0xaf245b6b5eb6c0ab921e3681c9817b0d10de009552b4ddf31bfe72ca51bc8eb2"): true, - common.HexToHash("0x8af3b4b6fcc805d9146cb9b9b6cdd042514d434f84625ef4af8f50948fcdd157"): true, - common.HexToHash("0x219c28a212788f0b406162636ca7f75f5744f7e58272673182cd6fa432f30b32"): true, - common.HexToHash("0x4e8098eadd5bd003e80484d9b643a2f995eee0a8388df56ffa8be74bedf750d7"): true, - common.HexToHash("0x9763796cf20c82fcab58672709d9b62ed07baaedd0dcd68e0f5154955d9458fb"): true, - common.HexToHash("0x59affb49eeb1658e0f3149a15efcdc2e76764c5bb4b253bac0a40aabb63c220e"): true, - common.HexToHash("0xf2c658cb8fb90de56644e29a118fb4386174b2262bd7aa2d75f1d52413fce8ac"): true, - common.HexToHash("0x29cd7d58ea07d7f189d5a57b71c7253893490cc3eefb72afb50c1dcf66819fcc"): true, - common.HexToHash("0x206d179939ecd2dc57b290d848dad5d1ca92daebac0f949637398fd9c9ddbb86"): true, - common.HexToHash("0xa8f599324bae28a344ad9d5ac5f7b80ca155c0576700346f93678884a9f9b0b3"): true, - common.HexToHash("0xdfb43004a2cb02d6ab3494e1e18f8355acd48a54e2cf00a47837d34f24b3956e"): true, - common.HexToHash("0xa75e9fdabf6b98823e0baefbf8d5cba83830461b547cf5cfae8e8860d1f49db2"): true, - common.HexToHash("0x992d775a6be1b17cb6a199edbc782deab931797d84482a5ea4b15c8d7e386545"): true, - common.HexToHash("0xaf6ea5ff7b49ec03a8cd9c48eab500e21bf97887b2253ea4abc8c169d653c4aa"): true, - common.HexToHash("0x022a973e1f524f90e75adb3717ef0f0e250332501dd3262379f2b883c1ebec54"): true, - common.HexToHash("0x725400986d50e7eb1847f36bdebc33d703c7e2fa229452bbaf7936991b0c27ec"): true, - common.HexToHash("0xe342737429b1af731e4e9b11a12b5ed9867ae7a8c577cc75c60a4cd1ff40dbf7"): true, - common.HexToHash("0x9fabe27619036a87d7087bee03034d4464f50bc0ba588d70c20359c6910e39a7"): true, - common.HexToHash("0x4424beca014937a6c14a269446ccaf142c90ebd046d840e0d1878811ce5752bf"): true, - common.HexToHash("0x334db4d2d7231828c4b2b0c8902d219b5fe8d98ee4976fcb27453dacc66a8884"): true, - common.HexToHash("0x2f556fa67f639d2421f0d27f24fc8189637e86bfe5e1ecc814a871caf0f2c7e1"): true, - common.HexToHash("0xabb582072f0a908be4fefec0ed3b2984eeb3ad8e55a1b4e9c051b252ffc26229"): true, - common.HexToHash("0xec0ef68d99cd03e3cba044a8785b3f586fb2dfbf280e1b62309ea53292e17dea"): true, - common.HexToHash("0xb1cb9c1de6a6594ec9e949f10705385ee42aec871650ff2d09f3aa590ee70b6e"): true, - common.HexToHash("0x6271431576a1e4b821ccce20755631b0ff63d3917357340d7a36771cc17c7078"): true, - common.HexToHash("0x2fcf99325ff7cc2f7d62b722922e62ba93b1db8a8f1a238c2e130b1e2e509d09"): true, - common.HexToHash("0x999fcbe2ec56e2a62420669b9697450eecedde50b4433c43a3e4155c8b1c9852"): true, - common.HexToHash("0xa2f8122c1015b1b19dd8013c40731831ecd5923e7b1914a35e7803fcb4886cb4"): true, - common.HexToHash("0x5dd193af17fdab6999932ce6163ddd2bc217479948ebdd516710610b1e61b6c8"): true, - common.HexToHash("0x56ecedf095775a21608cc8ea392bf564c67f97849f9646e98f17f3f368bc82ad"): true, - common.HexToHash("0x3a4e136edd66a2f29245fe201a65990b478925dc82dc6f6bab98e26fc1d04cea"): true, - common.HexToHash("0x1a6ae54a6595ee087f5a3c970077a51c4fa48b967f592485b80e2a077ff18fee"): true, - common.HexToHash("0x30edbf8f4ec6168d00f934223ccb8a9ea12ad0e810d4bee0ecbd7c2511ebffad"): true, - common.HexToHash("0xd46c164ee03a5c37774030c1f380a8348547b4de741dca55d0821d2889b7d692"): true, - common.HexToHash("0xa3ab6ffaa73c20b53508da94a7ab6ff8a323bd8c165e198a38256e90a6251c1e"): true, - common.HexToHash("0x0cb2af05d3b45d1aa4340cf32bf787cf57525d10a3bd2741b3468711d149456e"): true, - common.HexToHash("0x6ac1f1024b81dd605b21e0687e8b97d0e01013042d491a4b14b69ce9a86c8289"): true, - common.HexToHash("0x23d2bbfd6727b76f5e9b36870c21fcfcc3567fb60936f5bf07af788dc275ce94"): true, - common.HexToHash("0xb15c6973dce233cba0da383ca49b1e1e60b4c3d065a4cee89a0b4ff6a141fb69"): true, - common.HexToHash("0x66ce4acdde669ad4af29440d07feb7cce97d9261f90564bd66adbabc68948749"): true, - common.HexToHash("0x5e192e6374908be16cef4b69b0583694b319aeb90d79d68de1065c07271f1af3"): true, - common.HexToHash("0x1b5388943300dcdf7cbbc2d4cd40e411e238cea461a4fbc9fb0c8f1775d09a7e"): true, - common.HexToHash("0x8fb39fb7bc92304ca3b75d061f61fd2002a91d2527e9791f72cd680a864087be"): true, - common.HexToHash("0x09d4cb6cd53c3e5a9f85cf6e4e78cfc43adcdc4e7af7817e5bbcc049f442f8df"): true, - common.HexToHash("0x32fb9225f06cbed8a7477664c3279cd22de688e71bf2575cdfdc0daf900a1017"): true, - common.HexToHash("0x83fac89163e1e9319b8f015f2c8c17b69969df5d8dabb7a668d09bbd101b760a"): true, - common.HexToHash("0x557fda6d458441ec13c3def4f0091f514303c7f6f020320f7c6f53a24543207b"): true, - common.HexToHash("0xe814c5a97251fc8e5bc68b350bf293b6012f331e785404f7763ea6bdac82e9b0"): true, - common.HexToHash("0xd08f05df9b4ff889976a7beb5cc19f6311b16ab4fbe3d875d5ccb4bd5c0bd054"): true, - common.HexToHash("0xa900025aec1986ae30b58b321b5f3cbc0ee10cb6fc3eb18ce941da6711d9b018"): true, - common.HexToHash("0x7d927c12dabfddf51cc6c83f6290ba5ed03a3baab14e55471f932a963f7f1bff"): true, - common.HexToHash("0x1f6c203cbc64f7ba1f729f19c2c03d54f109ae7ce9ead6da0a8fbbf8482fc27c"): true, - common.HexToHash("0xedc78593924e3c6173b7f3851d0fa339a2d51db6bc4a99f40e5a58827bd970fc"): true, - common.HexToHash("0x9f3ddf09e73da8d4b5a4b4388a9f04a2449b8c09cbfe845a4bc4c6a663486f05"): true, - common.HexToHash("0xc12d96064255482567ec04cd8326972d9fe017d2055c480694f121f61079c889"): true, - common.HexToHash("0x8848f34351b61e017679d291983cfbb3dab4d937bcb34c3f60da3f9779ae63fc"): true, - common.HexToHash("0x36f97cc279f85d298ee85c80b64b6c697f90a9b971ad0b8706406ed8b9aab767"): true, - common.HexToHash("0xe2e70f7cbeff425c2fc298395e3921913d11a762d4fa8be4431755540a8f6aa5"): true, - common.HexToHash("0x285023c546c0f675f9396da2f2a2d1a540d31a9c9433790fd8872a342828785f"): true, - common.HexToHash("0xa0aa27cab3f6da948d466ac5f87153a372c574e1c400c8d992782b2270be4787"): true, - common.HexToHash("0x83ec835c21209553d79250a7715298110c1666007211290d699669acc4490ab4"): true, - common.HexToHash("0xe19a058196f3a3cc0905b5a1325324db3af6658de7ac7700d644027cf57d2900"): true, - common.HexToHash("0x536a53df103c5ad8ae071f7275c88219e303714a994465cc73403c7e852c1329"): true, - common.HexToHash("0xbb1acbfa93de3b7f07437caf5a66777644c26aefff88c1750e907874ac69be6e"): true, - common.HexToHash("0x785d3ba659b67f866a86b7b8c9036e2868a84f055084f84d190b5117adbbf53b"): true, - common.HexToHash("0xc06254e58037223a565574104d0840c5ed1981b33e339d1aa13e3b380076482b"): true, - common.HexToHash("0x3317dfc10ab01d3f8dbc424ef8b5fb5c52a7642c1dd390687214b4656ba5d3bd"): true, - common.HexToHash("0x7a478450e751e7ef4897af48b40ab53ed3626a9f0a145df6576d68fadebcb702"): true, - common.HexToHash("0xd974b50cfb2acefe5be729a46dd87dfe438f9ea3d39e30f5d81630c90e7c11f2"): true, - common.HexToHash("0xa55bc5e6ec71ff5af549226ab75560ab74d83114546f5ba227277162f58f3e02"): true, - common.HexToHash("0x223d80a0cfcd466c751963357224280505ad7d672bf3697ed365d095439851b3"): true, - common.HexToHash("0x6c8d7e6920bf506108c4842f2c44852bb7cafc822b6f9a0e06da5668a2aec363"): true, - common.HexToHash("0x60a2136d6ecd44a4856fbac3cd2996815df227fc752ee716be33f7ac557377c3"): true, - common.HexToHash("0xcdd961dc7423487ce436260381b21c06f7941594da720404e95686256671ccec"): true, - common.HexToHash("0x53c38ece8d55882840ea0a64048bf0e21b27c7e4c9596a61bb936792de9bfd16"): true, - common.HexToHash("0x37bf0d668c9cfb51554717bad73f93de883dd6963cc30fb283b137a23544607e"): true, - common.HexToHash("0xb2a9492b89ffbfeaf5dee31080d80281cc15a7287a418b049385a6bb2a8a419f"): true, - common.HexToHash("0x3cdc56ceb503a1749bb87a4ecb8a361958f549b987cf7d399b916f171d6cb69b"): true, - common.HexToHash("0x3801b6f70b7592b50590a503acea100bcf0f2ddb3f97795e3fab1dc911bf9e1c"): true, - common.HexToHash("0x7480e990e89f974baf1c89cedc471f9c257098546480093431f3eca825f856ce"): true, - common.HexToHash("0x950615d9bef4301a6ecc98467c2ceee8f2601db698b48d27749f6bd4e46ab238"): true, - common.HexToHash("0x27d34ce49c64ecb25624e571b0f5db99ea45006e50dd412f13519ad9d61a7e41"): true, - common.HexToHash("0x37116b48ec2cefc5f0448e0d73547f158fcb3d289cac2d68d730fc86419ed0eb"): true, - common.HexToHash("0x2cda5662b94960ef37b340ca1b92d4d604529a7403fc57434cf9957cfb0d319e"): true, - common.HexToHash("0xecc9a0286c972f1d86682182728f70c46438b5a3297de5d9152bd7ab4c5fdb43"): true, - common.HexToHash("0x903ba6d8d93a95fc60a5064573aa06296796edb24c620caa7c4f1a3db41be5ed"): true, - common.HexToHash("0x8df79b28400f9c6eff755b015199cf5eda266e210116ed90c33728b65c5b6a8a"): true, - common.HexToHash("0xa41c571362bcbe8bb1f50b3259ed1b4ae1ea09265e36f73fbf30a340ce4d582e"): true, - common.HexToHash("0xdd14170370e63931be1859e627d95244984609fbf684016986ec039b26b1e63b"): true, - common.HexToHash("0x0cac2c0409bfed659248daa21a9d5c1008691a818b16f16e6c89821f06f8968c"): true, - common.HexToHash("0xf5b29d27921a4e07cfe7d5511d1b386cd663aa64a53f3033aceddae3725399f3"): true, - common.HexToHash("0x00ba58333478cef883b48dd9737279a041fc02863b56e048ed0e50cb12769729"): true, - common.HexToHash("0xe9e3474632344997ea0b8698b85dd6f7131ebc28c243e03837e04a42796cc99f"): true, - common.HexToHash("0xd9b21c13386fa0ad7f921c091c845da4ded270a63dc80c0051fa285923042c55"): true, - common.HexToHash("0x84b334a0118ae35aefcb35138452fee5e842c34b7d253a8e39acceb5ba408752"): true, - common.HexToHash("0xe977c5b5c1eeb92c3cf350e11ed40a3788f26e642264e84447df94fc03c60ac8"): true, - common.HexToHash("0x24f9fd0c552297e5c042f22209f68b20992f93ca2efd61d8385ee7e80b69fba8"): true, - common.HexToHash("0x556fcd90d8b661fe67ee3ac65cdef4a76bd979b69b5d13a2fd24393c93494079"): true, - common.HexToHash("0x10c4c9b8392f44f7823155a18aab51cf23b5b4b0ec099350e96743879edf0998"): true, - common.HexToHash("0xd03e35fb490f29d9f31b5c70bee823827473e0b2b36f7c807bd631b35e0eecdc"): true, - common.HexToHash("0xc66909d0578af6ef16855136a0ad9b6d1b162e254e6bb8db34fc6db0facd8387"): true, - common.HexToHash("0x2970f34995bb500e1dcfeb0586013a073fab33bcad9b6d564a643e55fca1d425"): true, - common.HexToHash("0x8e76b080bfbe8ce8a508ef0a77342e6b721b89a2eebe687e793a068495e9e8e1"): true, - common.HexToHash("0x72c8de56056136f0ac11050c2027b442c197968fb478d4811dadfb4f0696fa50"): true, - common.HexToHash("0x334a7bc05d99cd14280780fc668fa54e14201d359dc5e916fa91f153d4f49c03"): true, - common.HexToHash("0xa42e1201bd1cd7895d6fc363d334287f0d7e033d671b8efbce4617de5bc795e7"): true, - common.HexToHash("0x3f09ea0415b5db3836673e4e24284506a03e6fbe901360836736febcd269a7cd"): true, - common.HexToHash("0xf3cc28d956be68dc298747f44a9b0e52b884817fe37078d379011c211e1b3ee8"): true, - common.HexToHash("0xaa866baf1d7956b3bdba9f0345cf862ee73cb27d31b734512db53b72e2e36236"): true, - common.HexToHash("0x9589986b22c2b5694c76b29b7863a018378afb40ea951c41f966a195212d1579"): true, - common.HexToHash("0xb51d96401286e92590ad5b181db9890bcf0d9720213d89553e075b14d464513e"): true, - common.HexToHash("0x373b7acc999eeae784d50911550e5107e5d1dbaf1cfa8d195ee5ffc214a28fb6"): true, - common.HexToHash("0xd725aa21e5d29adf65cf8a60bdcb493f2588080f0cfad654b268a85da8c1782d"): true, - common.HexToHash("0x5eca8fec5d75616571afea638b6ca031a6108753a6541c7a5cbd63d16aa8f81a"): true, - common.HexToHash("0x4ae0b3c0870cf2dbe34c33ff9155d3f231d509cd00e4f0c92bcce8e05ca9e4f1"): true, - common.HexToHash("0x5f269e85734774160b9ef17142e2ea22dfc516a9dd9fa730faf750767e8ea896"): true, - common.HexToHash("0x39e6a17db6050c5fbb39f8f70e4ae059bda9196dc88d33d9c15662a66eede507"): true, - common.HexToHash("0x5f599c2336bd9f157ab66f13e472ed28dbd32edc105e6226fea8d8ebe96864a6"): true, - common.HexToHash("0x0f3ff2e5cb17719d2e2241a33c2f53548735ef4c229df52100089f87c65a01f8"): true, - common.HexToHash("0xc67bf502d5a0292c63ddd01ccb77dfa2254ea4e82cf8cd474a7c451c0df0b5cb"): true, - common.HexToHash("0xf7e655bf9fd50899539e225a318df833403f6bfa23f685c8037475b2de330517"): true, - common.HexToHash("0x12842fa71c116a4739eda95ce7d9af689e08b97f0327e7b37c20e319772aed02"): true, - common.HexToHash("0x7da551e8d63d788b5df95675cefbaee1295bfb5dbd5b673e162e26dbfbd371fd"): true, - common.HexToHash("0x417c60633ddcc09603124aee9f99391a4ff620e5e47ec78bbf0b73993a7096e1"): true, - common.HexToHash("0x537e93415e0b141685f9459dc437b67719aaf4baffccd19bd60fdea18b1207b6"): true, - common.HexToHash("0x8d306eee409cff3e3f17b13f0df0570f0044a9beb804fe88d0efe653592dbbe8"): true, - common.HexToHash("0x2c77540c18581c46a86941a63caaadeeb1a774ac18bed407fa506a04320ec1b3"): true, - common.HexToHash("0x61f674b711a7d784143958586754ae21f31850750137cbfc5506cbc1df69d54e"): true, - common.HexToHash("0x1161a2dc246f7f4294184837385effbffed5a2969ef578fe3a9c0a2e38ad1e91"): true, - common.HexToHash("0x18a2ea69c47ff8d12b206d7694f8c8b7ebf5b269cf0a089bc593a5b8d8f8d2df"): true, - common.HexToHash("0x06456732ff3692a68b2ef0fd3efea785c866f8954e92dbbe4e25f7106b75972f"): true, - common.HexToHash("0x80e6213be930acf257cc7464fcdc931b7c4e87523c2b312b7e4b4b9a81088432"): true, - common.HexToHash("0xe9e7bc1e318b195f201872b6ce1cd92e2fa2706dee3931fd62a628f6aedd9671"): true, - common.HexToHash("0x7b4144a32ac88ada47a5e521745c41f7420c4422d721262051e6facc43a5f5d6"): true, - common.HexToHash("0xfa9db496759bef95ba5df7195dc6b75bfc082324e83ebbd3a69d7f07f91710cb"): true, - common.HexToHash("0x77fd2d37bd4befe9b7270457e01464dd6ade4afb25b55489193577729d60905c"): true, - common.HexToHash("0x84fb14ecfb502236c39bc8b325e5095595d9a5d6c3b6256ba40c98386adfc6ea"): true, - common.HexToHash("0xaf112c0eca792508dbb66b138c69e7c7d6139c33f21a5d862a027144d3ed6158"): true, - common.HexToHash("0x0caff1c32dcc67c4181d68a1c3ab49f22cd8ffb894f32036065ecd608fc4cc49"): true, - common.HexToHash("0x649036e860783cd35ca40adfe833b88e177bacb8e73c1d2154f653d52aa11eed"): true, - common.HexToHash("0x31683a1663d713be976732c78761744b5da850e99089d7f9d51d90894ca65e0a"): true, - common.HexToHash("0x43388ba66b143470e3ebc42443d72cf53b50509b704286d3b80e0146fd324eca"): true, - common.HexToHash("0x9f42ffada9d7f5d253a27e2cf45cd21dcc4c74efff10a9b3e86edee7fe0be7f1"): true, - common.HexToHash("0x4675f9af627930449492a2530ef6dc11a6135d48137dbc3b477f02a22d85a943"): true, - common.HexToHash("0x0fdeae1c6d3deb7b40b9cdedac3202436093e36257ad861ec2d31cfa1f90bed3"): true, - common.HexToHash("0x3a4bc06f31a43206d24b9441d5b6bdbb0e8bab5fd4894124b6e1ad98f536d7ad"): true, - common.HexToHash("0x11ac2c62c154c10649ece939ae08968d8dc3f6b82d9130a36252711fa2f22294"): true, - common.HexToHash("0x0a88d346cea3a30ea1103db0492e74b759eeb416f2dd3cdee131d8b50275399d"): true, - common.HexToHash("0xc8b11fb3aa99bec0fcb38e9592159d6cb8213b0ad42b3d24960d739619e24bf6"): true, - common.HexToHash("0xa2620d68ad838ebb48c155ccc52e53f0af03e5384658377fcd1a3fc558e517f0"): true, - common.HexToHash("0x1bd9821087969cf3d47ebb080b4036acbb696b090dc3c0aee5504c8c5690d06f"): true, - common.HexToHash("0x5113c7aa57da34e5ee151f87d03788ec225a12a82d21a297650ed3b6d568b9a8"): true, - common.HexToHash("0xd0723e48ebe4c61133816e40b40d8c8635aa16a4a59ca37599e175d3e9db8669"): true, - common.HexToHash("0xc416cb6f3257d88a08eaa4d386c256a04e2f0166cc2564961675efdfc2af47a2"): true, - common.HexToHash("0x94cfb995ad8d3ebaa75b068c2715c4ca3a72f9b449767856e012c78696f440b0"): true, - common.HexToHash("0x9632c04f0ca1d3d598c6eacfa7d7066668928b83c71579c0e161151076bd84d5"): true, - common.HexToHash("0x91d6d740b99cd444e76aecbb30bfbca136c51f48e767a68aa9e769e47eac986e"): true, - common.HexToHash("0x9efac6606d8bc153816a442e9d79067bf3310d17be6a42a8b933d027aea2c13c"): true, - common.HexToHash("0x8434394eb0a11ac63bc434c8d5ae1018a0db875c47af2ea469912dc244300bb4"): true, - common.HexToHash("0xa71ad5f76ae3bd88371af9876bced44efcbc14fa944e01f519c1a6eac005e335"): true, - common.HexToHash("0x19991e160b8340902e37ab05be457d7f54baf5e18d73c0fb682ad5a0aab39705"): true, - common.HexToHash("0xfbd8b7cb90798660b705ce62c7d825ca34cbc59d5ac5f55b90d47620a6fd2119"): true, - common.HexToHash("0x9ba6b6a520c702f767433a94fa68bd200503cff0344280e574e7bdfa6207be64"): true, - common.HexToHash("0x1e65f2000c405050fc80d00e0a4f835c3baa0405dc68087ce8e13506a6e139fc"): true, - common.HexToHash("0xf4d4f5d3c582c634448a08a868baa6e48dffcfae1245611166ede12359b4b831"): true, - common.HexToHash("0xc6e74d4fa00cbe0a1c259eab6522b9aed6008b465ab6b66e98aaeb2e50e6cf24"): true, - common.HexToHash("0xb5a9b42f355e13c1ed36dca1c806c331e50a53ec896045dc94460c655fec870e"): true, - common.HexToHash("0xf01ac805232bf99f699187b5189dab5ae066242bf2f3568122ca579781be9340"): true, - common.HexToHash("0xb5bcaad884100e55d9d0165060fe8b59249c92e03c354300df25bfeea46c735b"): true, - common.HexToHash("0xfe2b7a9db1d234d0b97eca6f1800d42aa5ec8db03274c7d999bbfabb4ce18ce3"): true, - common.HexToHash("0xca83d0d609f24c7dd5e4dde364f9bd7e3b30c909531344aa7bab20e3723c5f88"): true, - common.HexToHash("0xd581131d99997b635b11fcf6b86b2afa35273550f6e870d70dc00d79be3b5c77"): true, - common.HexToHash("0xb417da01483c7dab0018ea84935fb831332f76f6bdaa3cf660a4c418c6b7de7b"): true, - common.HexToHash("0x8f9da3b545877c8d849197b8b884af857f51f27313669dbcfbb84da78a7f6fba"): true, - common.HexToHash("0xa285c8670abccfc390c78618b9c65aa061c303d038d1f9a26cc2d48ad2d1d23e"): true, - common.HexToHash("0x9823ffe090922b15e2c3b6221edcd4cb7cf7cf000d8b059127929d93b92a6dbb"): true, - common.HexToHash("0x4abf96f139f75cdaffa749b696b87ecd1f458304f64cfe194641429144976c5c"): true, - common.HexToHash("0xd285a32ff1fc8abce72ff4a7071e21048e218e0c5570d60e7134b8f25175e2de"): true, - common.HexToHash("0xa188d0423d3e5ac59690219ba50e5497dd172eed55f2bcfd5ae24e51cf632c83"): true, - common.HexToHash("0x018765884f07be666791749b6569dfd08440d5883bde2d8ada6a62ca072062e6"): true, - common.HexToHash("0xb5539925e129f9ff22d34f979da98827aaf6e5af015c7b227058fc22b3c8e251"): true, - common.HexToHash("0x5f7795216a094c3c09104f2efd839bbeb426454807b28515a7afb959898d7784"): true, - common.HexToHash("0xf7eaffb3873c9574359fae089c963ca5d60b7d527e5ed427b977fd00afc68be2"): true, - common.HexToHash("0xc91118a888d0b20c4472be0171251537d3460d8994a00b83dc4fb0e4ce81e8cb"): true, - common.HexToHash("0xd5ea85a036f75e844c036c7393280c22d229af75e003907d88aecec53221df2a"): true, - common.HexToHash("0x7607a2120ee050fe1b7a8f54243319c7ae1ddda58c71dc1a4b14a4d43395ec42"): true, - common.HexToHash("0xd92624bb04a30f8be5c49d48f5154d7876173037e9cbc373311422680426adf9"): true, - common.HexToHash("0xb7d8eecf46112b7be45efd760036033531f72df59126b96db7cd6796c6c8fa8f"): true, - common.HexToHash("0x4272a0a1b462d44fc5cd955f7b5d65cc86aa47aceed9e90ed14eac58abbe3ea9"): true, - common.HexToHash("0x87e6f24e52c4e03f5a0eea9cfe6e45476b56131ae815f742b8422db5880d0f7c"): true, - common.HexToHash("0x9994e3be2fecdfc3b3ddb099c9e60e6416e15eaae7f1cfc540cb5c7d02f79655"): true, - common.HexToHash("0x4b7a9384c6630e9feca04ce78791fce3240ff2789c0cfa2b727b0d53edeb9a0a"): true, - common.HexToHash("0xe98faea4294811b16b6006dfe1bc8452fc503a9333dbf96bfdd26938c1314e81"): true, - common.HexToHash("0x131df18bf101a6a66fbe6ee9bf02032a7b73ed871d3e0b5b4e5337d0c7247728"): true, - common.HexToHash("0x4b3dbc8b3ada37f947047e5c7d0aac3b53e0da5c864c73b34a2de5b486234489"): true, - common.HexToHash("0x4eb1abbc0aa213eabe7a2df5e200d383e78fe4cf6b8453bc59f71559bf57bc1a"): true, - common.HexToHash("0x083b61259cfc92f7d111b75ec9dcfdfd1437a5844cc8fe689187ad070736a73c"): true, - common.HexToHash("0xa1be9c0a0556a97c5e926e2ec53f2527c9f9b1a7079355f0c867693ec8edb4f0"): true, - common.HexToHash("0xe3d68b0ff2b9890982e7aafd8462987cd17804d30f23c2bff5b81ccdbfb9c333"): true, - common.HexToHash("0xfd430818e02cbee8f5e5aefb9b9e6b4376e589ca36708898c669267c26eda6b9"): true, - common.HexToHash("0xc5db1eabfab6fa471fa161b99cf9319ee9ff8e2b3cfec1842ac1d3880d203b8b"): true, - common.HexToHash("0x3c60ef0ee53bcc53aa2fd69ed32fb21376aa753342bf981330bb16d8b1b0df5f"): true, - common.HexToHash("0x620b5e0787d813601a878ff49199e61aa801a9b8d5e7cdc9d031c45ed091080c"): true, - common.HexToHash("0x103111f4048ed8df4191795b3c7d3716e14408eb0a9fcbd994473d678914cdcf"): true, - common.HexToHash("0x7f3f0999dd631adbc605f50a5ffe61b9c41c0a117f3cdfdfa79082675d3989a1"): true, - common.HexToHash("0x33c0f93cff75d3014cb98c201430674b36e56337f135298c6ef51cc14ef6177e"): true, - common.HexToHash("0x45bd5fd97c9a99340205aa83b33e72e45e97872fd6c91bddf7bb8f9efef6e6b6"): true, - common.HexToHash("0xb81d5325f14d156ba987521752ce1c812f80a6992a746d9ca9757822bddc166c"): true, - common.HexToHash("0x599f5a4c2223c8efcb3dfd929cb30d840857db8a9dba63e0f18e207f5b1cf6e1"): true, - common.HexToHash("0xb83b2cb6dd053fb353665e63fd3607850e9f61ad01ac9a9ae631e2218ae2aeb5"): true, - common.HexToHash("0x564f1ea738f1c6fca0cdae1daa934af54eecb9812ebd0532481c74c8d9829903"): true, - common.HexToHash("0xfad622a9cc5eb451c15e64ade9ea57f9b55f7121a138b97055ed238ea1f7639a"): true, - common.HexToHash("0xce8a019b177a3b390cac9f2dd3dbb2aef7b54a4890d3f95af280285f469cda38"): true, - common.HexToHash("0x8855407ae3a9c50e1de94f1ad688cea483cf3f6a58fa1b85386e83fd87a366d9"): true, - common.HexToHash("0xc2011c516a026922389017ac341bac29ac555a15863b763b002160af0e5f2712"): true, - common.HexToHash("0xe65c6963e78e0273bea39237c9d30f6c0348ca30a5e78a10e131b40defef3879"): true, - common.HexToHash("0x4eeb4ed0abe32024462b804a68b11b282fee19c438ed32e43c2399de6f24dfb0"): true, - common.HexToHash("0x85db36a0e7fae5d4b18e0c851c3792c1f70ec310b4bd92f9ff13b633318dda46"): true, - common.HexToHash("0x4b34c88df7908540befaa48d424bb3de0bdd634bfb8099aae376247a42aaf63e"): true, - common.HexToHash("0xafa65f0565e3225ebff3e2edf563ddfc55b64f736cf86d66de42df543d88b66e"): true, - common.HexToHash("0x5a97a7e513deb6c8bb24786ab1576c8fe13492234c8ab23e134baa364c90371e"): true, - common.HexToHash("0xe9d67ef48b30f7a2c9806b8f73a8ebeeccc15698c454b531f9eff62755b91bcb"): true, - common.HexToHash("0xa791c5deeb418f05b3ad870dda7a20719d279c19e81842f4ca083af9861a1bdb"): true, - common.HexToHash("0x01a10c888c486f7f953c95db5b37cc3c150a16dac15e1d75d3ab9c61c7c4d24d"): true, - common.HexToHash("0x1c5f4f02985a858b872eee41b84788e54a71815daa62abdc378967e55679f257"): true, - common.HexToHash("0x53bea36a8b85e6923dfc99186a14a921829fa010930198a049d82a33c2794d30"): true, - common.HexToHash("0x16a8a95b0c38402df1f9a0fb720e599914d0aeab323da35f4741f0d36d7ba45a"): true, - common.HexToHash("0x624b2f325a6d00b28ab547321ea88d472f910f1304e1f8a5b52af9e6299978a1"): true, - common.HexToHash("0x2d81394ef682cbd7c01a5f81e731a54ac1722277d1a51eddd46328d3553b6fae"): true, - common.HexToHash("0x8a9777b5d618524d047eae527f10def9d393586a008775561b4f8658eafe03aa"): true, - common.HexToHash("0x84d1cab45e22f205d9c52a7afff8cc80c8aeb76a62899ffde667dd11fb92053a"): true, - common.HexToHash("0x730f3a11dc1b4b7d219a08a5f212a1a04e64e7a3e90b4f3ef24da185b876021f"): true, - common.HexToHash("0x1d865f3915293aeb2bf2b402c4fe9c69cbe970e054578da489d0ae20d8e6b39b"): true, - common.HexToHash("0x4e1da06486f164ef3fbd7b4fda7f621fba2132ed330450739f87cfbe43b61065"): true, - common.HexToHash("0x18e5bcd04292bbbbc638e7959fb15c439514a6c47657ddcd9860865f96c4e0df"): true, - common.HexToHash("0x5cb888c820b939c51a2d5cf0ce57b3891557a78b39d720ca425769e4b02ee6c2"): true, - common.HexToHash("0xbcbb07e464490e57a98ce6653c6bc9e36837ec957f227a739666e7c6bd6e032b"): true, - common.HexToHash("0xee076af06df5c681b5b8ca31d356290975130d76b02066255f3b1e65572b1e2b"): true, - common.HexToHash("0x35dc89add630115da3d18b1f40ef3287bf10aaac68d346bef168093307f24e6c"): true, - common.HexToHash("0xaa7be7fde2b4108609a7b6e91195a7cb6f8e6f4c548dfe8169b7400f5c61c960"): true, - common.HexToHash("0x165659163296702ff66726d35b917d9906724e09413185b0b8e3efc4ea864a19"): true, - common.HexToHash("0x6b181013a9813cd9459f57033230d52430a9a81e999617f0c67ec2dc6a51ea29"): true, - common.HexToHash("0x4c25f8bb98fab21a37742a9da20d377d506c36123e6f78bd1c91b724687a4d85"): true, - common.HexToHash("0xd6827d997da01675ab810a8d442bff3b551ad09c7413ecfb01daaceb8d5e4655"): true, - common.HexToHash("0x2ded121f38fb4c6da173dfb2a60f99d27e282806b2cbfac47ca3cef6077d1ca9"): true, - common.HexToHash("0x96029aaa47163be1f7b3b607c81edb2dd767fb338b25d82efdfdf5e08110ff2a"): true, - common.HexToHash("0xd21729ff790d5b4722116ed3e89a684a2a57ddbe70b1646c397304bb8c3c70d7"): true, - common.HexToHash("0xfcc9eb190cadeb977284fd6426bf4fd9c09ce3d4f44c7271b2443ba76ee3fa5b"): true, - common.HexToHash("0xfa1535ef48d3d9b72b3ad3059a4042e20f9d8515f93dd68f43f2ee110a537c2d"): true, - common.HexToHash("0xacf2369512bfa76093473a41520ba5368228e6823df7813d59ff53431aa26fbc"): true, - common.HexToHash("0x3e03413bb2e2708a411d130712b9b94c622f6c7e2a72b62c87966cda29c6a00e"): true, - common.HexToHash("0x1a415d4de4715742885c3fe84d49e703add1638ac860fd64d24ccb18577964bc"): true, - common.HexToHash("0x4aae0013ff2198d4f1011b0f200661358db6fea5f9a9cb0268b196448bcccea6"): true, - common.HexToHash("0x976175d8f8900ee7f9d2305e081ad268065172addbd12ca716c790cea15c01e9"): true, - common.HexToHash("0x93480d3b11e4cdf9c05dc4f32ed44acffda3cc9a21b5c6fd3168fd5731c8462f"): true, - common.HexToHash("0x1ced0e5c336e08e669e3feeae10e81e0fa7e909ae9ce222bc46216a057ed7e5c"): true, - common.HexToHash("0x73b3d5f9c4bc10ab8e1d4d629689f8c03c88bc319bd9a66d35dc3a53c6f48f6f"): true, - common.HexToHash("0xaee434f076a637adc4fd5cc83a8de2e6fb3cfcc4ab00d1b5fab5f1a1efd797ec"): true, - common.HexToHash("0xee7cfe5d3e98225c9321147ac86d2d7c100bad8413ec6e67f179d4eb11234696"): true, - common.HexToHash("0x7a0e485e6754a69ec6434b7dcb0d54273ad9c1481b3c7835de4c435a418eda33"): true, - common.HexToHash("0x8b1e4c95c04ddf30f34647052176fabe3b68112f3b7020e2d279040321599724"): true, - common.HexToHash("0x5224b303ba2e506974bb2f95adbc8164635c6012126bd99d6d4f41f172b38db7"): true, - common.HexToHash("0xf7ab6f24efb68f4b41a76e658c623385426185e24244612c259346231e359bfe"): true, - common.HexToHash("0xaffdc9f3732992492cd7340b7b02251265747539185d1fa9aed069b81ce0b212"): true, - common.HexToHash("0x340236f0bcd69ad68b671c234ccc7745014a23e8838fbf44df1a81580de19443"): true, - common.HexToHash("0xa67f4a3c9236a1c03a0618b0b0797daab67dc5d5391805792da01b3547bea193"): true, - common.HexToHash("0x05500beacb71e1c16a8485c5bcb68945bfaef845cbb1452a6274a35aab901151"): true, - common.HexToHash("0xb2d5aabd51e0a62ba9ad2fe8d9fce5973b02ddba58984e59aeb6cd1c9072d95f"): true, - common.HexToHash("0x50d8a8ec3c715947defe052866ece9acb7d74252d55d25cc0f2c1eef2727e9cc"): true, - common.HexToHash("0xacbef6a08b933e54c5a3f835f1bae0290817c819f71b92c8d43b2bfaf3b3ad3c"): true, - common.HexToHash("0x892a7b11ab73792906e62e7d6b7bdadf9be9fa45e9445e15b7c7220e18b8ab4e"): true, - common.HexToHash("0x777f33e124da040e6cb47154f2769dc966980d93747c15899c32367c6bf4eede"): true, - common.HexToHash("0x4b2ff0fb1981fad2a07dcce83e8df9c3492d37da7d493e81f9b0cb6b3d30dd5c"): true, - common.HexToHash("0xa4795ef7efa7e1e9441b19d2cc52dfbffef6eba467d53bf5e9aaa860d4a30633"): true, - common.HexToHash("0x38ec2227cec02c24871e285fb8ead6ed38751ab9e34e92daa9318e95edb3691e"): true, - common.HexToHash("0x05d5d07e8fdfcd1320867c8a170509f017a0e70537a4017f88028755eec49484"): true, - common.HexToHash("0x633ee5b7d0611f27d1992ba881e20cdb62ec0a633651a97a37c26a2cc67f1711"): true, - common.HexToHash("0xd7d5065dfaf1a2594930e62d58cb8194f13cadaefebf25a2fa1a0860a374f550"): true, - common.HexToHash("0x9e2ed445d13d275c66e523f83939c0b76bcb94242d1b42360e3b8f2961bd7616"): true, - common.HexToHash("0x73df154d7f189559a98d2b30102d1f005d3bc2ad56fe44a0514bca54213f307b"): true, - common.HexToHash("0x5f08e944c0c76813ffbdc7974a735c5c300869e401c5f9aee2fa2134befe011f"): true, - common.HexToHash("0x99c4357e355c5de1be71d0650f50147f570d2f98641905226cfa9bd501c04c79"): true, - common.HexToHash("0x17a7f106435359e4142da2cd2dbfb554f62e68d3c77f790ed16774e7c5dc8aee"): true, - common.HexToHash("0x928a606a50f190be1a3910b22d0f1b4bf15ef4726719455dd084461c6687fcfc"): true, - common.HexToHash("0xdaf4d06b04e890efde2740d10003536f4a977e53693ee19e6d3d4bd3a9642743"): true, - common.HexToHash("0xdf5f37ac0d597bf550bbf9babdd6c22e9bf57b25e2d3ebc8e5572b155ef1673d"): true, - common.HexToHash("0xe9e95fb42953d63811757c33972ef7195a6afcbb54d8e7b06e97263beab87d4e"): true, - common.HexToHash("0xd1ecb7b37f9bf145e8565ace3ba4b2494f1e8fedf5ddac992e54706fda7bc289"): true, - common.HexToHash("0xdf0fcfbe97747579e888063c8da12c3097be0c11b9f085ca119186651d5f029c"): true, - common.HexToHash("0xca7330b0c85f9b80048aca5fb37fe1d99de39b610ea529117175428de66b32fa"): true, - common.HexToHash("0xb56d56ebbdd258b0b06c83fb7679df5bf48c82ae6978359c109b405ae61ee7b9"): true, - common.HexToHash("0x8440bd77eb9ccabeaa2026020f5a16b3eb4ea342a99854f572a4f878d774b3e8"): true, - common.HexToHash("0x7606b756409f965c520150a100f8e0926997d2acae5df7c7f57f5a8f354674e7"): true, - common.HexToHash("0x72ca2a33d342c0615307b4e0450738c1f01f36bf9912ca6da9b01b8ca3b5c566"): true, - common.HexToHash("0x8de311e22ee665bbe13bd2be62654b55d34b43ebbdfa368965b4fed7316ee099"): true, - common.HexToHash("0x99a2ef8800ccb1ab970c38baee7c5bd3465b26e9baeac1d6cd47318d3799da16"): true, - common.HexToHash("0xe5e742d9bbfbb60a34c5f4c0c67b3d397ac99b0557b390b44398af7c54610813"): true, - common.HexToHash("0xf74c335bcd280647921c0d3e293f85b8c6fac771915fc6f9393e732cb1d7a208"): true, - common.HexToHash("0xd8014ff1db70186f50c75cadafcb3f03ccbcf9adf480b1c891a3f06cfd5c22ba"): true, - common.HexToHash("0xfc66c529938fbf9c6fa54b2a6c15abd6b7c6e16726982edd29700a771cc6a64d"): true, - common.HexToHash("0x88fc38fcbcad0d9e149ac9b9728aae8ffb0cd30c0d3f102bc67b255c96899204"): true, - common.HexToHash("0x14e4badf5e7c0640a2733381ef6f857406655ae765e8475113cbd0314002dc00"): true, - common.HexToHash("0x7845e2a9715ed0b7978006a00067d55788fcb89e511893b6cd6974297ec30e65"): true, - common.HexToHash("0x3450e934c198f1be9053e39079f8128f31e06a47f595d52788a62e9434afd8ef"): true, - common.HexToHash("0xdd02476a59d0a7ba6bc40e637c0768ce155dc90b2c7a7ed8a94b1015e06b2184"): true, - common.HexToHash("0x68f9a369810341323ce033d742342275b9446a3a80d2afbd1e595d77ad203304"): true, - common.HexToHash("0xf7348289f8faff050ce9f8b197218b18c96cee4222d60d66edb3a5e39cceedb0"): true, - common.HexToHash("0xf1678dd2775c3c32c9b1a1e5d8f99a05c51eb9a9d484b265665d073cc607995c"): true, - common.HexToHash("0x26ad8891804efe9f073945fd34f96f669579a18368b355015873deb2dc21e578"): true, - common.HexToHash("0x8c8408bf618aa68b1cc6166d45f8166d1db3d282f33c82994f22c50e8bebcc56"): true, - common.HexToHash("0x5970364e8ed733849994791caf2cbddc84205969b1895f5d17add81822bd3bf0"): true, - common.HexToHash("0x50fc1710f6d413f2bb527abb39f3c4d434c4f80537d581fd21858f0968573492"): true, - common.HexToHash("0x66e7dc6fac0b54109fdf696c633741931a8f310181aedc534135a0fbd32dc4c8"): true, - common.HexToHash("0x945a26ed98d603368d4528594dc71ca26ff2eb0823d7b523865b1ecc10182298"): true, - common.HexToHash("0x9c9965328d65a9310d5fa84ddd8a9db4eaa65562a8b6c2d18c6225c3db53230c"): true, - common.HexToHash("0x66f18d4d5f8d80fb458093fd7967160a4c80241bac8f4177246b3466ace50826"): true, - common.HexToHash("0xc051f0925d956dcf992e43520523c67abc1919d4a67db29d8a566d9bd3a0d8cf"): true, - common.HexToHash("0x1aed5799cd5655f8b3bd09ef4cef4d8820cfbe2e2c2fbbb37a27929cef8637d0"): true, - common.HexToHash("0xd40f14c13c113d241b727f3cc2ad7f4b2ebcf46ea3f9bee0721dc29ce488d167"): true, - common.HexToHash("0x9e180b58c67a189d4bef850184df8a19311ceb29937803f90fb0452e983d7cf5"): true, - common.HexToHash("0xb4633d697c4c51cab4446a47383102205b2b31ca4993108ed7658ed34710034b"): true, - common.HexToHash("0x919b1f4e0ca0b38f8f4450b955f29c0e60908965ab3df7fb3399300917ac8be1"): true, - common.HexToHash("0xc15f66c091a2ee0318e89e25a2323676a9f8504d31c65e6df8c64ce1a7d51197"): true, - common.HexToHash("0xfbd97a0b3e949630d6e885e7bf7f0c21a1f45753c3ed9bd594d6c782ce39c7db"): true, - common.HexToHash("0x8a14da08f2b2ce0b8cdc2604f395a6295cab0495d938cf033ebd5969a1fde7a7"): true, - common.HexToHash("0x4ad85e32cf7acd812611c8e00ed4565637190f7edfd3753b0c6123c7b41d613c"): true, - common.HexToHash("0xb30bc1662a24e740c87d0573ab3e1d4ce82246274116f6555a0da71a34e15c1c"): true, - common.HexToHash("0xd8875d19ee3543143d1b54b395d64c721d881ae5b37c3395fa3fe43c888ef042"): true, - common.HexToHash("0x7a0123066a901538f11dbef795abc559225f499e9acf25fa7600016c32af1233"): true, - common.HexToHash("0xe26bfb18d27274a020fe484d888dcc5868527fd67f1e251fc08e9fd5a9598f34"): true, - common.HexToHash("0x5c9f9f0daa4d71fff2b23d8fc630818bd5c00f5a17dc1fead7076b0167295505"): true, - common.HexToHash("0x11f4aa63c457f0f71537193c9ef4f7bbaf29315717b6bbf808d4c5d5c7f1ddbe"): true, - common.HexToHash("0x1461d5474919e00382457badb02ab6860b1f2c97346e413479c326506bf68c44"): true, - common.HexToHash("0x33277a2da07ad4530388e7279b449e2bc7adec9b3ac19c058795af289430fa05"): true, - common.HexToHash("0xdb9f14197112ec93b371f5765424e0f67dde09d259211fca759b2f4a5a06d09b"): true, - common.HexToHash("0x8f8e7513ceb682785597d94133dd149e726387089b97609746350eee71633943"): true, - common.HexToHash("0xca4e1dd63d929bcfe1e3894ec23432f0aff9f1aaa7be4af84bf1a26ff629283a"): true, - common.HexToHash("0xbc9383f2fb013f11e25158ee1bcc95cf670173fb7036afee0c0e4edd5bcfbb83"): true, - common.HexToHash("0xc011cb9f4d36e9787dceccfea80b514f68e9f59731e68dedd681395194527b87"): true, - common.HexToHash("0x0fbcb76091d0b1567860444aa00a4b1c650228dea86f6985ad47ad0cdfe401ad"): true, - common.HexToHash("0xa20ac10d7338c14bdcede685dab04c37129601146a2da6e60051cd2b1ccac819"): true, - common.HexToHash("0xa7772921c9c6c1ed9647ec5be4a49b07cd332a5070e3b815a5e913384fb7baae"): true, - common.HexToHash("0x3321c5bb52007146f2ebd9d1af7b8ecf09d4566f629908b15017ed3d526f2e98"): true, - common.HexToHash("0xb3f27bab79de5eb5ac9d2d73005b530fdaa15321c0851532bfc2779dfe2aac8b"): true, - common.HexToHash("0x45fa9cd52896e0e710c50c6bf609471341f932b01d97686d57ca6464a70395b2"): true, - common.HexToHash("0x5aa42f46f4b1358673be4328ce37587b59d18f7a66c0f55da6046ba7282a56c4"): true, - common.HexToHash("0xf22c46d8186ab6fab3d03a986419f287807ad10110abb9214db9d14c2167808c"): true, - common.HexToHash("0x7aedd09880e94ee287bfc9399dac048af289423d89137e4c68b427ea110bf0db"): true, - common.HexToHash("0x4b71f238a01a7961c9ccb9613377d15461a15faeb158745620518e9295bfd5e0"): true, - common.HexToHash("0x256894c21988e9c425a8998df76ea0393007ca0580e2c5d266682f74a43c5439"): true, - common.HexToHash("0x6ed10363a8ec5b03376f14b86249e7087d07fc1297371f3f63f4a2813d3e130f"): true, - common.HexToHash("0xbc84d86ca8815c05699998437ae3346b4eab36fd798db209d125a838f36e87b8"): true, - common.HexToHash("0x35ec10906d5de47aef9ed2345a497ab66b43f6cde66143b096d8a4742d0b0a82"): true, - common.HexToHash("0xf59a075118cd2bd3656fca2e09fc9a3bfdeb77c2a163bc38e19e6d4899ea1645"): true, - common.HexToHash("0x7956924e700f2b222dd7ac37a62072f28f63fcaa1e1013eb52858269c1d79430"): true, - common.HexToHash("0xc78da3f3078737aaba7e9334dc2467a37ba0451018f79b70f92679a19b1e7b1c"): true, - common.HexToHash("0x10e40c9a35f3bdd96490eade4fda07629811be44437cb06c01b0c50cd22d3a8e"): true, - common.HexToHash("0x76c9081590bddec4317a89bba9278af1a07da00e8cd10c3e09868beb670d5f57"): true, - common.HexToHash("0x5d3981dd24efe1b0374635f169fa104962070762d12b9833a6138fb6437cd22b"): true, - common.HexToHash("0x7eef7e1b5e70e6fba8a030292bc5df805637697d9c5165fe06460c56df71a175"): true, - common.HexToHash("0x9fc30fed7868b1420fb5a919e5146cd758dc403c0fb462f1f538e47e783fd71b"): true, - common.HexToHash("0xe7849ca65cd9b7155bc105c22ab9ca94485ecb844f84e21ef152556233cea0a1"): true, - common.HexToHash("0xc8df6b759d22523488191aedb3c07b1dda510db76c7b872e597b40670921f056"): true, - common.HexToHash("0x72eada5715a98a38482c8ccff83bde1cfd6e2422162b14484185b6a4e09a9648"): true, - common.HexToHash("0xd6f87ffae7cc4fe201a7b25e8811ab8e7d9bc6ca9a48a7d6a041f7070b28f7ca"): true, - common.HexToHash("0x11a39686952d49c12a667516585f3fb353b62ad89801b11f75d777107083185b"): true, - common.HexToHash("0xe3175811dbf3d6af124d8a4b9a68bfe4f7fffdaddc69938f2d034aa94db01490"): true, - common.HexToHash("0xd84c8f3dd0f0d313cee68bb498fd918cea569089995f4b3dd3b2a727bbaf6ca6"): true, - common.HexToHash("0x44e34e7eccda2cf06adb6d2681e2ef35510cd8f0e47341513cc3e2037ada4137"): true, - common.HexToHash("0xc18167aebef5e6e266e202a37ce11cc5c09597f1ebba71a38d84c6ed1ef311af"): true, - common.HexToHash("0x36ff3b2c45180ad547131d20112c72817354706d8536bd02767c30b1e10a7ca5"): true, - common.HexToHash("0x287ae693225c0a8a3162a1e96ad50ffcc149617448c13e65774cbaef1338edaf"): true, - common.HexToHash("0x3749e0f141b2a9bd8fcfe76ea5a115f160e20aaf008f01ea33cc0fbc1bdfa616"): true, - common.HexToHash("0xf46f8a184ea64733e4d475bbe245e64bc9cf91394e3fa433d6339b2804df82c2"): true, - common.HexToHash("0xe167f11f769c3aaac525c5410d308f79aa0e36d9f56e153dc352d4aed7709037"): true, - common.HexToHash("0x730240a108529b4b6895d3af36e2fc17aa11bdfca60374d20be1f0968508c852"): true, - common.HexToHash("0xa503f833a06554f030d25b3511554446f57fef0f8c92e0dcb5d95cd979e2b63f"): true, - common.HexToHash("0xd7979d4ec9cf37783cdb2ae264615fff1c241cc845a36fc4e4a82521beec1473"): true, - common.HexToHash("0x44b5c06b5301ddb2a93d2625a000faa2b306be7e399dbcb29aee39320c45e8a4"): true, - common.HexToHash("0xfd49e333d82c3a3a085a7204a18339695f50ad9fee16505eb5eb1904c1778e8e"): true, - common.HexToHash("0xeb2f493685127a7000418c06b6ab447f974c6ef93e62f63a0cea12814355fe66"): true, - common.HexToHash("0x905ea371a151c6d2ea12cbb5f27b5caf5f753d4aa968d67465d9b51aa027f8f1"): true, - common.HexToHash("0x9cb51927d3c99146786c6c97671bd9f663bf0262d8507aa721fa1ff275fdb924"): true, - common.HexToHash("0xad63ec31210aa1259a0ab6b38741aa8dcff4b6a2295f2c2fd9777b25fdc73c50"): true, - common.HexToHash("0x197854b1fef93c37859b07a4671a10456d8c9837fea9ffef618c2a251d686335"): true, - common.HexToHash("0xe2996484ac284909050dab5eaa7371fb62213641c86a3768af347f7e38d09106"): true, - common.HexToHash("0xbc2507532688e378320f04a54048d77d0eb929b2e07113964c5a7d63b69d9cab"): true, - common.HexToHash("0x31d6a76aa9afe3addbc11313d1343ab31ba652690c2cf30cf9067c08eaf01b4c"): true, - common.HexToHash("0x7985c6d1d368b7b667ddbf7b265c66c72b5ab2c3d209900e58c8516f007c4860"): true, - common.HexToHash("0x14d623ab73f1bceed5447f15a210bdfd012b75fde0bf0d8ccbf648af86309f43"): true, - common.HexToHash("0x80fb5304577c641094bdafbb8574a4a2a1a36c343d9e504515289a81b349aa85"): true, - common.HexToHash("0x7e67f14c7cfc7cfc6436ce6c22e89f6ea3284a2e3df1c07a221450cb0d880977"): true, - common.HexToHash("0x120cad8bfd9469cd150392571e51989b3c7a6f33d0c5e45ae0f4d6ffee664473"): true, - common.HexToHash("0x5755c47bf15ab83f05889dedc9a0df69af47d3dcb9415fc20c4add2e38712153"): true, - common.HexToHash("0xf491f7ed1ac2786694a93cac2b3c6f5f9d472a6f0ff9a5724281f3107f21a74d"): true, - common.HexToHash("0x34640a5042d37c08f86164475ce21dbf8c25b3de6132f2e43ebe422346919867"): true, - common.HexToHash("0x2d11dd936e081cdff73aca8a34b921f342384189379066b515b3e92837f3f3fa"): true, - common.HexToHash("0xe4e014963a8c4c331a907c226d9f8cd0f342457a457c824bf301d7c2ea0b36fb"): true, - common.HexToHash("0x0cac4c1ae829f3da7f3765bc52ca61d560df9df6dafe2d524cdb073ff63b1422"): true, - common.HexToHash("0xd21d8333a05e2f2f762afe66576cdff323a6fd5e96637f0df9d731e82533d7e1"): true, - common.HexToHash("0x00188eed7a5cae18ef4015d514d69aa8c29aad714d3f067ac72abe1deafd29b9"): true, - common.HexToHash("0x2861269d57210a74e5041e3f241dbf212ec1f503ead44f4ce2f32e0c00e2def8"): true, - common.HexToHash("0xd0e599f21b227f654c5108dbc5d930a388aa92f952e31bfaee8dc6c1ef8a038e"): true, - common.HexToHash("0x9f1bbee5ae1647cce935707343a4103b5d6d8b137913bad6820490309fbf88fe"): true, - common.HexToHash("0xfe91e9a13ae436d83a6b2e135b22711b7be880174c8bd10d465bdcc0b71e6e79"): true, - common.HexToHash("0x6f012006a8e1ffe2dafff62a053212163e6bc37765d75e6656c99e2ead8886aa"): true, - common.HexToHash("0x13ffbeb8de67e279e131b6a790dbc7060cb5555b59807e12f0ccfc211ea8f2af"): true, - common.HexToHash("0xa9adde41ca86ad269a2ef68cd84a674e77ec6e1a1bf463273005d405da13bd9b"): true, - common.HexToHash("0x3e4bdf5dcbae51468c606ca7195a644973383ceb33504fa202d448eb19abd684"): true, - common.HexToHash("0x0e5ebf7e6cc4a9eed1b8e7ed1db19f362824ffad59be472c99c58d6f33c4c581"): true, - common.HexToHash("0x3eac61058f737daacd496e7b88305737742e2ff25f8bfe44f0a6325332c77de0"): true, - common.HexToHash("0xb73cbbf659a9d9ef41cc8753012f9783aa14a952011456dcf8883b5a3e1bb14a"): true, - common.HexToHash("0x959b435245aa1be945e0cdf6a1ade8e5b839fefbdaf101d2d1318f5728ad6914"): true, - common.HexToHash("0x5daed8f71863c883ece03fc67628917ee3bfdcd22c9c42b93191214c0ad24549"): true, - common.HexToHash("0x8f24daf66c7ee64842e866c43b5844a491d8365856dd1f36b3dee4a08111a4a6"): true, - common.HexToHash("0x4faf4c1a513a93017d60814f25959dfdd0a09b38045c259449eadfdc9e21845d"): true, - common.HexToHash("0x5c7f177faed3f7c33f3307242eeb5669c966100ce007256ac21dc8d6f08ac7f7"): true, - common.HexToHash("0xb3df66512aff63ac7d2f510c2da6d24f3b9ea0e3d827156710f792e74705a82e"): true, - common.HexToHash("0x8c3dc3de6bf7285b17e380b804dffbaff9aa96f787640a256959c4be70c59f29"): true, - common.HexToHash("0xa46ad9aef315319019856474e1acffadf5086c52eb2687d57f0d40e1796eeed1"): true, - common.HexToHash("0x9ebbc5138703550e959980257a8878bb89557108cd78b458425b3ce12c36aaf1"): true, - common.HexToHash("0xa36d2ce67333b376b3a16eb03e093159004ecf71408a5e974fc132c010465ce1"): true, - common.HexToHash("0x94559ec0b58885c1c44630e3e93e26da8109345468311125c2342a3441451d56"): true, - common.HexToHash("0xed57a2a8cd51af66fabd75c217e44411c5abd6d1903de7e7846399d13c911661"): true, - common.HexToHash("0x86c2446c6dbd7ed0abd285aa0b877d87400518b05ab3f452033d9d435fa99614"): true, - common.HexToHash("0x5418c794493e8b859cb0d536b829ab960de7d67a383f9013ced7f6f85569f451"): true, - common.HexToHash("0x9a3f8a48d159f883d04555a1ce1b79c106c59d3e4bf15c21753c3d3325f49c17"): true, - common.HexToHash("0xe82e0a86aff33b4a646b158e0df3aadfa8a103cda835d74c481a2317aa0f8ff3"): true, - common.HexToHash("0xd325839b6c822341bc373c5c5ec31d90fb35e1cbaf4dad9a53885a4c0669818a"): true, - common.HexToHash("0x4ea8498f51a12f6fa3e19498e80d90c0dadbe9bbfa7d9c9decafdfca56be4bf4"): true, - common.HexToHash("0x55cb3efc402b849757679c771b673fd5c1c425e01e411ca9c69e3357d7c7adc2"): true, - common.HexToHash("0x04098aa6f9034290e49d017c2a4649a38fcee8c1cf143fead3f4764472a0d7f4"): true, - common.HexToHash("0xbb25c507aef3946d4d95f94e5c60c7ce20276e9747c2ed27ebb4ca9aed4b583c"): true, - common.HexToHash("0x1577624f78d55e24cccce5bf444ee0fe08c67c0d3277321b3c827d3ecb23c32f"): true, - common.HexToHash("0x73fa499491119300d239c6675d93729bcd750a7963bd98e006082f6ba1c4312a"): true, - common.HexToHash("0x3fec66ee3b795a7c760d721617b5934f0c5909a497c3489a95ace6c8c5790334"): true, - common.HexToHash("0x47e4a67bb9abce6e440afb5a472cfa343adab5700f0bfeb20ec0f99e19e86c42"): true, - common.HexToHash("0x5148e8081cb25a8f449724ba0efea33addf5abb62498552d72874bf4e3c30af0"): true, - common.HexToHash("0xe2b9b0502795a5326ef6dff545e4aab2df4ac22fbf3628540891fd5aba77de08"): true, - common.HexToHash("0xb531ab6d8798c36e668ca5e207bb4d972f7b3e14616b60d9836950e7354c9389"): true, - common.HexToHash("0x4af8ad8cc3b7693cc825b51441a8d11cc397c389eac3c6afe66e826a237f3d29"): true, - common.HexToHash("0xb49b1e9274aaf750b4857a398f805776d660a0203a739156e5754670f188438d"): true, - common.HexToHash("0xa4ce4ad062c95df815d15a89a22970252fbef142107535fa1f957a371f1dac5e"): true, - common.HexToHash("0x5a237ddac3ad5b2523f5488b994385b186f49696e5450c9cbd10509ced53e46a"): true, - common.HexToHash("0xbb74bdfa8cdd1431dff2116c236a58e262ca5755a1ee8e809a26072bf1c30051"): true, - common.HexToHash("0x8779ce21fe3ba998d647c0d167d669ad83e4105ec0066ac96f8ae68cef3ad60c"): true, - common.HexToHash("0xcaa1c67cc4fdddf73f71d0562ed43a1a74a57f60df4db37e10e8a493e3d38c42"): true, - common.HexToHash("0xf7b64ae9c49fef79c1bd9b3987c68b976add47e0f6f0a9f0626cf6f9f7fe2425"): true, - common.HexToHash("0xb9e805c7615e0b843ce925e87733113e73da1e78f6c28253c0dde3873e998345"): true, - common.HexToHash("0x5c7dd3b1fbaea9a8d697b47d8760b87bc174b9195afc326e46ba0032ee14c709"): true, - common.HexToHash("0xc7bbd4cb6f49e3deb51a05431af052ad337cafd7610cbd53e116aaad44757eb7"): true, - common.HexToHash("0x364e44011a029246491ac830fed04b4d37b5b4edb11f0289be27bf32d4d1cce3"): true, - common.HexToHash("0xa6f492972a2bd45232165534aa9536a80f5c530b9413182ad617c156060b1df6"): true, - common.HexToHash("0xdc7b30b23f6eed9d4c13aa1a38b260ab5c883948c89ab2dbce23b01bc810f9f9"): true, - common.HexToHash("0xc5dd7306738ce96009aadf520932a4586145002e99c0e48bcf30d245cb880df4"): true, - common.HexToHash("0x8de2d6d868da6a10daca368159c3cebb2e552d125086be069bd63cb2ad5ed143"): true, - common.HexToHash("0xa679e84f365ee8152b14ec6f3f07f25e4f3795dc5d2159d70a4b9a78c871520e"): true, - common.HexToHash("0x135016eaa6878fc208ba301717a954620fa2c1f320ec0ea345dd0a4c96359c1e"): true, - common.HexToHash("0x8f789d4d9778c2b25c58d0514fd5c9f7b220cd801bf961f01716b24959bd5319"): true, - common.HexToHash("0xf79dbac601ad6f0e726ac18412e096196dc9e354781d8a48de61353b6b33d2e2"): true, - common.HexToHash("0x116d7f29421078dcd94868612eb75a42210b2a290667b2c8c778378e0c28a597"): true, - common.HexToHash("0x6c88500a58cb3aa9b83a17734b9aa24f845fda1a2c019004057ec579e9bc0bba"): true, - common.HexToHash("0xf434a986eeff3fa95f5907edb10351dc48a1d1d4d3768dcf12a85daad861675e"): true, - common.HexToHash("0x96d564f77ff085c60b5e9c0c7764792cb3a3a4bb4cf6504b61f3a019402aebaf"): true, - common.HexToHash("0xc74b10f6419efc8d58821358b81f580a77a4bda6ede13e356156aea6acde2b93"): true, - common.HexToHash("0x558d31ca9bf9c8877f1eed5e11b9a992cfb24b99c238b4425a94e3835de4193a"): true, - common.HexToHash("0x0921b7083179c9ae436004370a2365a029c19346ad5c5024cff3c944543010d9"): true, - common.HexToHash("0xc2c166a2c018c39f7f7d1409e082f866f601128af1fdb7b87139a9e5cb1c5e81"): true, - common.HexToHash("0xf60c10f80618f77a81b21dc7a327f03c1ba7f91ed36191c3079de23d5363c79e"): true, - common.HexToHash("0x22fe04999a0d6d9715015f7e18c67bbac970bcf35900d39e615d5adf55266c3a"): true, - common.HexToHash("0x8323f82f008b432b8118fcdc21c8754ec73417862153f83a7c1777d528f331cb"): true, - common.HexToHash("0x403628e60ed693977f97e8d5d1c14a60be3a246485a9b170f5f9a2cca432a29e"): true, - common.HexToHash("0xe13b1796d2f396aec33eac5a854b2f694eb9e8687b1be4ce5ad5c652aa334681"): true, - common.HexToHash("0x29390095decdb37960596df6747e08339ee8c809656702d153152f5858feed71"): true, - common.HexToHash("0xf48feebadf94da5ad08d45b92a13fd986295738378f2dbb27c9fb9df930a5162"): true, - common.HexToHash("0xa7e6892f75013028ef80bf1b91900249cd4fc46afefbee7159618136b1dd900e"): true, - common.HexToHash("0x32a5a1b9634d5d8d2a16f9b5613769280a49b3aea46a669df5b265db8af53fa7"): true, - common.HexToHash("0x87caee3e8283494d3db50aac1e2d6429b1e7c1428baa7174ddc9af44deb1e578"): true, - common.HexToHash("0x9c2cc59aefef78dc8e6a62ae74d324a3e25eba42fe020c383fd7fdf48455995c"): true, - common.HexToHash("0xa3e5a36c48d7b2a1377d66c934d27aeb618c0d853273fcb9c08971c081ebf766"): true, - common.HexToHash("0x9f226089aef74432623450a265e230b0d4beca6b55b9870227e66e34ec235283"): true, - common.HexToHash("0x0b158d9d13bc26b19aef473c935a37b72105d19aa878a43194f6cfd0f40194f9"): true, - common.HexToHash("0x27b585d30df4b9d67eddfa9424a7a1969a02b94cb7f234b97537dcaaf407dba5"): true, - common.HexToHash("0xcc3bd14905665fe3a048e92feb210077f57d431ee044e8b4e24a5bd3a2db6ca2"): true, - common.HexToHash("0x1ca9c73ea0d816b048d7d0364c5b5ba02fa6ebeb3e9e5e4fdf9debbe2457cb4e"): true, - common.HexToHash("0xa3098ceeb25e42bc828e7813a75655f6502334edf1c1396430d7cce90467765e"): true, - common.HexToHash("0xdb1c1c8415da6a53715dbeca302e52d326775753e2d48950dd44d3c176bb2053"): true, - common.HexToHash("0xab22a9f0e4a13fff66d4be4a78fcf02833bbc75decca7534402b12a1bedc6588"): true, - common.HexToHash("0xddb0859995dd1d51d7bd41fcad6cc15dc2f0fcad4a7c9ab3c5356d307ed4d1d6"): true, - common.HexToHash("0xcb597e1b3d8cee8745c984d75e2d20af5aa7324700426b4aa46f53ef8f455725"): true, - common.HexToHash("0x2cc249c41395f2b91c451e87871fab94cf33f4077d235b0f56f3bb9aefb346d0"): true, - common.HexToHash("0x4b9afabb30bb650e3e165f785d1cabc38f3f68dc442b62b5934143f711ea7155"): true, - common.HexToHash("0x5ae04878ce079d976216604547f8a8e6c96d5c321a5516dd703bc93d6aa6ddf7"): true, - common.HexToHash("0x54a97ff2ea37a1632a0b04e70c77c50f20c3a0fe18d8ec32a9f22747f635cfa5"): true, - common.HexToHash("0x664658c0a3adceb545183d44e89bfcc904f4f2308be596eff2b07c0ee99c1137"): true, - common.HexToHash("0x7be325731b76197abe22d8f4738f2763f334744158e9037f67887dab9bfb070e"): true, - common.HexToHash("0x644809888157d878754794d9fa7b8a27578ac9b68077a9380c90646465b45946"): true, - common.HexToHash("0x24f766e44d3c0f0a323595836c3a6268a262d9918da7d0588a33c517c0afbf5e"): true, - common.HexToHash("0xbb8096a0a5e858decb45c3f512a5232b0360d5a1170fdc3c4801c29ad86cdcbf"): true, - common.HexToHash("0x0307d2c94d42dfa74d95c3039cb49d1bd85b93cf26476d1201ad344dffcbfe01"): true, - common.HexToHash("0x58fee32c81d5ec37d200b0a43ade28f8cf0c94a69765195f7a2bdacff9eb43d4"): true, - common.HexToHash("0x7c13e6b17e186f737681cb008f3c171c2e4fcde00475ecdb11138666fa80946e"): true, - common.HexToHash("0x019d30292b864eb0dae9b828424bc1ce5f2a869886e5b85d6d293d16de52ed3b"): true, - common.HexToHash("0x74d8f953841d55829b9bcc80a4adab4c86d0f50b26e756ed6f41a8a46f7584ff"): true, - common.HexToHash("0x9322af3a7e40a11015c05178bf550a09844770cf497ed6d184f5b1be65c4f563"): true, - common.HexToHash("0xf225a84da6f7dcb125e3444d2f804f75b1e19ef438636a55c4b99a87334524ab"): true, - common.HexToHash("0x3b32b55627b2a707b72483f3cda2c99d67f2f87e5cb792c3617e5c731965c68f"): true, - common.HexToHash("0x3d984d678e350372987b45794302c35660b2608ff4e92a614bca627143f4063a"): true, - common.HexToHash("0x1ea48685bd838b6d59a63a7471daa5639edb69a5f46a221f9fdb1c5e8c4ed577"): true, - common.HexToHash("0x68e829bd08f7add5503157a8b4038887ab9dd7484c4ba50e2d93b1eb80a621db"): true, - common.HexToHash("0x0c9add4cf3c10b45025de160a9d086367325142ac9e5c753ece8f0f600db372c"): true, - common.HexToHash("0xf3558027453c4cb20bce11b0b8a4de9c768ede0c9173dbbe77662384b31c2aac"): true, - common.HexToHash("0x43817ef2a6a094a56bd7adcc4b375993792b5ae351eacaa015a2ff10a6f97911"): true, - common.HexToHash("0xaa4e621b5068a7c2f44f0bd8dd0dabed71bfa032e27a2115319bda977d90ae66"): true, - common.HexToHash("0x4591abce59c6d798c0c732c7724c50ddaae403e98128c253a571bc9e4fa010ac"): true, - common.HexToHash("0x4045a6aee00730b321ff296d4716300b1382c7274ea9046b757157c42fc22b62"): true, - common.HexToHash("0x98aa924414121ba1cda33e694c6a03ebf8ca0d2fd9563dcf15fe0a631d392f75"): true, - common.HexToHash("0xaecb23bcef41da6c0b2fccdb01a4dae992bbe34847997258dc21ccdf0604325b"): true, - common.HexToHash("0xf10ec1850bb750ab09b8a650c0b72105329f778a08db6d9b8a957290ea3dbcf2"): true, - common.HexToHash("0xb89c2ce69cc6ff0be43bbcf48c70f57521311936f64d7f343eb0b09e940e5941"): true, - common.HexToHash("0x679b6c1aaeb1d38ffa9c83f36e80c9ef3297c84ccdfe9267dacefc0636389e11"): true, - common.HexToHash("0xa4b400a8ad13334b109db6efebb8342cdb321e85c7388a708cd361e996b9ee30"): true, - common.HexToHash("0x2da1d9125b1001f0ce4dc2b070552f99c7cf8a2a686cf2ae1a67aa4dff746a61"): true, - common.HexToHash("0x2651fdeb80c9591d4877cb5c0c5d3e0259e3c5c32475cb7d8b5f6235bc9f02da"): true, - common.HexToHash("0x580ca2b4f2e848052f3c85a28ba265621a92066e08557aaa1c78be58cb6e182e"): true, - common.HexToHash("0xb96f3c286f755780d6104c8e8bd98d976c7d1aeacf46b16b90c9ff691d092504"): true, - common.HexToHash("0x2dc6856c8bd27abb560529d7bcef98c98012dffbb1f55a06fc634d07b5b180de"): true, - common.HexToHash("0xd6928904a59a055a657f7acdcbde4673764e0cfbaad4a30e4d517c7ebbd951d2"): true, - common.HexToHash("0xa088533f71cc59d05fb9cce09880518a0ea2a7f330784cf5bbdafaa8f9afaab5"): true, - common.HexToHash("0x7fdffb81898938133e6a305ffd71aeef90c4885f180f04d1ae5d4c6161c9aaf7"): true, - common.HexToHash("0xec8b7e75a569072d8f8c6a805595a8f5370e724159bf57f0863cf252d83a4a14"): true, - common.HexToHash("0x7774168918bb42147ef08981a7df827784293c616e95967d31db685c6900dcfe"): true, - common.HexToHash("0xb8f775bbfe881bc96102d61a95453aea29fec7d1214996b14496d11a5225ada3"): true, - common.HexToHash("0xe1b8b988bdb5507634c362d95831b8d0270a98062668bab2e96d5af4e303763e"): true, - common.HexToHash("0x64447ab904426d6e390bbe2fd164a380df5136216c128248d16e06be02aaf450"): true, - common.HexToHash("0x4e4578299b654e80242bdf759e023b5ac2ae0977059ea8473d453ed09858d74f"): true, - common.HexToHash("0x992dd4d430f62382a90f4984ec6511bf6df67fe8004c5e22356eeb47aa55e16c"): true, - common.HexToHash("0xf961e5bc9d6ba88718b8635d0df92ed3671fb178de30cacad475be59ca003f53"): true, - common.HexToHash("0x2ba2dec5ce91965da2a6caafc8a5684a1ce0df2e65e87e935041c7c7f19222db"): true, - common.HexToHash("0x2e015ab0d44a1c190c54cc7bf34a29b5d539dbee9bfda4d199c4cfad57808b66"): true, - common.HexToHash("0x17b2336d75b78dd71837bf5ba5d676104895cbd5f40bd504842d7fee80016522"): true, - common.HexToHash("0x33acdc429a67222fcc4894093b49e5365f63fc37801c9a64c634048b0df4a90a"): true, - common.HexToHash("0xae833798ee78830b7d3f84fa16fa3abdaf7a41a90dd409e5ddc109fa1f0ea860"): true, - common.HexToHash("0x35904fbc4a16b127d89945aedd593a0bf9adf93c4a045624b7ec5f55c67f1da0"): true, - common.HexToHash("0x4b19166a54e22db46b71227a4ab279f4542c4f70b22e69352f10fd0081b94b2a"): true, - common.HexToHash("0xa32eb02e282160f2bc1a5a2f33139557d752192bfd190a2c174c62c0982910a1"): true, - common.HexToHash("0x9261755bf0a8dd7dc7e6556aaa80f261608797e8a6b627db1c5b5114a4448744"): true, - common.HexToHash("0xabcac8ccd3068316d81bb10f77c5be28bbec5a1fdbe436ad54d4318079ebb32f"): true, - common.HexToHash("0xdefa69ffdf9f0d3489d00f6fe4306027a5bc170c7ef847317a8d2a31966f685e"): true, - common.HexToHash("0x0174c0efa366c77d5792804bf7b8dc5d638d7e0dcc4a7967be6f4f0ae8d35d2c"): true, - common.HexToHash("0x79e1c4e99578ee69bbe4aa85ac0644712c56fc94c9fc14c49a98cf9982b8505c"): true, - common.HexToHash("0x13d24118a21908a2306bbae26a9f4f4aa144c45faa297b9c3344855e38b0f70b"): true, - common.HexToHash("0x466c7cb102eecaaada5a9819f42ec3c9dc06680dc8e8d1a1da0c199592ae91e9"): true, - common.HexToHash("0x9b3fc7b674e243d6e54efc524692be1835319410e3fdcde232bf0bec4d8f6dc6"): true, - common.HexToHash("0xfa45aed7b12c102058c8377c2c0a9255054d1919e798b0130249bc36fe58bf1a"): true, - common.HexToHash("0xc73b06f4b84e1b0a8dca5a115e811a44656124dbd7336871c1447887ee726c08"): true, - common.HexToHash("0xec38073ee5801225505a3827e3e2f7bf006384b1a92ebb2376e37d92e800d74c"): true, - common.HexToHash("0x3736d7044abbf290365e01ffafe11cdf2fcc41d45e419a47e212c706c5e477d4"): true, - common.HexToHash("0xacda8d7a57f98dfab41783a6a34eea5c6afbb6d99700c1969fe75ea731698cb4"): true, - common.HexToHash("0x7f7aa348e82b01acfb6ba40466b076cf916b3809769c5efde65fc7092fb3739c"): true, - common.HexToHash("0x6a77df91f75c3eceb339e79673da046212bd877d2bae6474ecae0f9e5c45eee2"): true, - common.HexToHash("0xd108777b4670f99f7016a7608868d7d21fbe4cab148f172a0430f51bf685fe07"): true, - common.HexToHash("0xe3bf74b6214f59aee5131682206c7926f689accaa5b77547da667d4e13d9d1ad"): true, - common.HexToHash("0x41436d990f69217de9e98b33bd04d0e743ed8772e4b59cfefa46e3e763e029e1"): true, - common.HexToHash("0x9d73179fc13e229dcaaa44d859a26d82ea29108d1f586bdbc46a99f1276cf27c"): true, - common.HexToHash("0x40494b9b8c1af4adda88cebef5649c366ae9cd143280dbcfe86a9000acabd50d"): true, - common.HexToHash("0xca101006d02f6b0c9c2a80249f8550ca3e2b26ae779275c78ddafa0112f58c00"): true, - common.HexToHash("0x492dd41d8cb7d0fbc4190c984fe4c82f6ab4c1354fa7044bb4cf84aefe52cc8b"): true, - common.HexToHash("0xbf3e4777e0db66ce35df005983f8292fc44b7c99f13649641b6defa77152cced"): true, - common.HexToHash("0x7610e9de9a2cbcc908b9309c8d1a01704af10951f25e5aff62b2048799f730dd"): true, - common.HexToHash("0xd15c50dbfbdbb75310eb975237dd55874e1f300474f1f4ea71632d248280547c"): true, - common.HexToHash("0xd1dbd8ba5c88a80b8c89bcc9a1da619d17fdb79b85031739bea09da198ec3ca3"): true, - common.HexToHash("0x59ea85a9f876daee9b51b78a790fa0ff8f34edf321e0325db8b4be2415f5c5c8"): true, - common.HexToHash("0x682ff0313b13e8ad25d3dd0c1a5be010c0471ccd0b62ce4d14b6dcf7a4a5fd56"): true, - common.HexToHash("0x1c2eb8a331f714e1aa6efe49113062a29bcb7fb559d262a893b614c07ac4d61b"): true, - common.HexToHash("0x137a8e6d3c071a8e288fbf4130c9bd86d1730efb6a9eb728c2addafe9b56985e"): true, - common.HexToHash("0x1a513c4936c6fcb84f70c16f5e602163af9743c7d4d40da579b8ebfe5852806d"): true, - common.HexToHash("0x0c2a25df72dab56915a0ad9c06de60a367990f740eb05b657d8a354a11a77e1d"): true, - common.HexToHash("0x40c480e83db0786f8cebeeeaca21fee8ea49117f5d443d89b38171db51846b93"): true, - common.HexToHash("0x9d931cf2c993e0fd8b44c30dd9cc769a83e2fb927d15412da05756b457bcfc98"): true, - common.HexToHash("0xebad9d2137b55bd665b368cb4a23e81a1f9dc6bcd3e0b84a52a33e9b6b6e356e"): true, - common.HexToHash("0x6fc219c0ad2f1d08851140aed96b09de38fda461b51190726876b821887b29c9"): true, - common.HexToHash("0xbceb384ac4449cbc8cb33bd2b9c507550dfb570ae6fbbb82a73e152ef0221aef"): true, - common.HexToHash("0x30a55fede68984355bed18ff06850ac61e849b8e24f30fc95af25a3d9958b421"): true, - common.HexToHash("0x18366000b11f9fd3abb83d1e830de34478894dda619b3f8bd9f6796d49ded005"): true, - common.HexToHash("0x673f07c909811f596d87e7a747a3dac46abb04ad1d878e37e615e603d0b0befd"): true, - common.HexToHash("0x12374667ebf3ae9d57175dd8dac2224367b3fc0bf66431ed25bd9065eb12a79f"): true, - common.HexToHash("0x274c6dac3e86a5780ce280a7b634877fdfa98c165a289796c428947708776273"): true, - common.HexToHash("0x18838f979670d8277226e7329125c2d1d183b89280f89715150389aceb627904"): true, - common.HexToHash("0x75d308a8a1eee71154b59f91fe7a101a57c87e7d3c449a409660f3f1742d3832"): true, - common.HexToHash("0x1ad457dad409fe2c58ad0d46169e406a9105961a2fed2e44076e36a5b5566424"): true, - common.HexToHash("0x93637510b94f57bf57f7012d9adb5faaf263bdf2e62275d8bd0409ab2681ade4"): true, - common.HexToHash("0x51748a64a2d370847630a453f70f681c884c6fe8f031d44e44b0054742955797"): true, - common.HexToHash("0x88ddfee90d3fedb92238b650cfb2d4104ed0ac7fb29ba9617cfd1d696054206f"): true, - common.HexToHash("0xe085e4386d6957a54fbb3f3d91375376b91e380e716750b83d008690187fe277"): true, - common.HexToHash("0xe184e77ad4fa633fd0c956f9155a49ffd142613dee1edd063007d5b16cd857da"): true, - common.HexToHash("0xc8b1c649704b6386456250d488389bf9585134336a86d300b5005115a0bc1af0"): true, - common.HexToHash("0xb9554ac0896e61b11056471e38638b2311d302e621b27866bb4925186562a8bd"): true, - common.HexToHash("0x0caf059eba43e9d66475ca20e48ff0ee626df61916355883be8dba1eb1424cd9"): true, - common.HexToHash("0x9aa4cc9a40454a900172cc04ef64a0ee4ceb63a5aa3130e66a61a19ea0bb632f"): true, - common.HexToHash("0x88ca029580fefad40a2d66ff9e7212d6f4dfece41725e6ce584a7fccbf3a6373"): true, - common.HexToHash("0xb1eb5ec13bcf3ef29c07bdf3d3c8bb2ba2c486e5f6b140093d919693ed09d1c0"): true, - common.HexToHash("0xb85334016c3d7ae006d6b1f9a2eb1f2736294aee09d074154c5f77e6da27312b"): true, - common.HexToHash("0x7f261e2c185c41b31836ff5a0643713b2fd9573a19110d70cdc4fbf1b2b68ff4"): true, - common.HexToHash("0x24e9a9a79ca8469f1b044ee5ff37df9972d9ecea0974527ff3aab9ceb3ed8250"): true, - common.HexToHash("0xc85d5617c1f22a732a403a426fceb3d24d025c057d72cc78a68a7cf85e9708ff"): true, - common.HexToHash("0xbbc3a64e3d077e784e95cafcefbc4c291bc05f3dbc49d546e42f767555dd29c4"): true, - common.HexToHash("0x24b38ce7a2216bcb417f4b8488f6c9d560b469a25b7f704f86142eed098ee2a5"): true, - common.HexToHash("0x669dbbb16979137d68e4c73407c7394f122de75726de3531b014a1ff5a0ccd6f"): true, - common.HexToHash("0x8865855bff7d9a45ac2426d79f1ac2410a5b6151e6576c8628d2d1e4b6aacb49"): true, - common.HexToHash("0x6e011a01761084e1d4a33a6bd620d5c6f91f301bd013eabbce6e97cb2a10a8d7"): true, - common.HexToHash("0x935f3549df487235fb47f011caf2b3cfe99a6b8b077fcb58f5d786c962e9bc57"): true, - common.HexToHash("0xa11501ea0e5dc389db2c35f774b23eeebf9af50de2122d6e47273c292ecfabeb"): true, - common.HexToHash("0xf346a17955aaa507413ee621d48d9b21048354961e6941db9f8e6f537e33c99c"): true, - common.HexToHash("0xaa08ad8679a428fdca5883158394d9f7796d1689b94e3185e50f62cde1e7b34f"): true, - common.HexToHash("0x37dc8d2451d0722a85e129e647a4d0217df529d566f04c2dd15997f2dbbbbf2e"): true, - common.HexToHash("0xf019b8bef96efe249e072c1cbb47b42a6a0659462af617fdedd66b365cf0f959"): true, - common.HexToHash("0x1644d860df7a14fb2c1d2656c6dd5c562333127cbcbbaee8dca77f0ea485a34b"): true, - common.HexToHash("0xfd437cd9b3edfbe49c5dde39f6bd05cf78bb5756a208f43211d39414f5c837b3"): true, - common.HexToHash("0x80b162b84231d409cc6f3b88f3a211b1f1cbc9fef35b7139bcb2769b753c354e"): true, - common.HexToHash("0xee12387f4bdaeb4cc816a4012b315e501ea8f4797f2a6f2c8227c6e6d79d039c"): true, - common.HexToHash("0x02f99036ce286e90d720def1a6680ab89abb6abb6f6d94bb73d427643ad6a353"): true, - common.HexToHash("0x9d652628d11d620196515e1c2e857c3124b6ca7a570331998ccd747d9d9a131e"): true, - common.HexToHash("0x662f9dcdd312ddac36a8217ed6cd742de2e525f7c99c269f17b12cc5d53bc446"): true, - common.HexToHash("0x49459a81f33f5947f1b52b958fc04a132eec7af5391a98ba15aa3d86711fdfa2"): true, - common.HexToHash("0x450d162d15418279ed2dedc6909ea55446e7e9a10d20c94a9961436f4cf09592"): true, - common.HexToHash("0x89a38dc0f68914a242a044f95f8d421f1b20e2e2299d3ae171fb1e2aecaf9006"): true, - common.HexToHash("0xf75c78540bdd2541fb8f028d3e04cde6d84201f48c8ada0ed783c15ff7ab1157"): true, - common.HexToHash("0x6196db3a74c50a86db8913f433e246bdcc2423e6d378a2a8e85a3a9ce6af54bd"): true, - common.HexToHash("0xfecc689ea45a5e4a693cdc431e510fefab9ece8c97d8806c81a316d0a64ed10d"): true, - common.HexToHash("0xebfc53937476d7ce62768bb9307f01730896858bddd48510a21510d951b2a472"): true, - common.HexToHash("0xe5e07e0d87adba8c5991a869d0653232c347509ac129cd943d51d89d915e3a9f"): true, - common.HexToHash("0xee25646265b580fa83b07722733cb70ef103a1e4d34fca97d03454dbdbbe3d55"): true, - common.HexToHash("0xfa8e587f146d3f4e16467022d34125b9616466ac920dc4389ad5c8a1d84ea2f2"): true, - common.HexToHash("0xca475ba4ddd3a6a8dd6dcea96d59a1f2981f4d281362d18f93ad4c5928dc7d16"): true, - common.HexToHash("0x272de2f53d4911dbcdbcc3d978464cc6bd4e151966dc678efd9a52ac98096218"): true, - common.HexToHash("0x6ebf770d61ea66b9e81c4edc7624fed096625ffdf2577fdafe133666c5d85672"): true, - common.HexToHash("0x3a2d8be92b85706332713b9278c8741c5707abc853a5c88136dd090365ac5ec4"): true, - common.HexToHash("0x0362027bf0328b91d644fc6da020f405ff8eb8008efeb7f06a390704d00504df"): true, - common.HexToHash("0x2ed4b1ad97f73e921e39e56ed4fdc4ad6c6b1851b535b12eec03d6b7002f34bf"): true, - common.HexToHash("0x62e492d9891491c42b3ad48b2f42d3b40708b0229b59d853e59bd2e80348878d"): true, - common.HexToHash("0x35983bcb1b5583bac9f9afc6ef729f595a21b0c7b619627f44b6b2436759794a"): true, - common.HexToHash("0xccacad508a79ac31c8899486d47fad96bd62dbfd26f0a1ae500cb0daed077b47"): true, - common.HexToHash("0x02ad02d5090dbc6717cab5510f9cd2935211d9ba1f203ad893d05f3198f7d850"): true, - common.HexToHash("0x5727a710605e72602b457c8ccff360396c3d6c0e7d965cbb114f88b394f45dc0"): true, - common.HexToHash("0xa5db2da0709cbb044213c13beda8872d39489afb1eda4f658cfa1de8f1e51026"): true, - common.HexToHash("0x53a65fc73e4e71e1795eacaefc1627f37565642dba2302f4bde47fb376e8a15c"): true, - common.HexToHash("0x80bbcad0a1eb0574cebcb91ed1bcb6da462775c76b9ed3eaca536d0f20c5ad0d"): true, - common.HexToHash("0xd73953ff37a916eba5a4e91953a3121fd9fd0c537e9fb32a8c9ae5a03aa08868"): true, - common.HexToHash("0xe0029bc05e2bf4b568c80ba3d3ba035dee458f510506e0e61265ee2b9616cdb8"): true, - common.HexToHash("0x776fcc370d1d81feff43a1328f55ea12c7f710af4e63256b0747fde0c1bec0a8"): true, - common.HexToHash("0xe010fdc6f78c87aa9e1042e0923b6bd5ce29b9295b945c360e54b0a654c3e85e"): true, - common.HexToHash("0x8cf7aa3e00a8e4f3d5e8282129d35ef1c63c02cbbed5d96140e110768fa768e3"): true, - common.HexToHash("0x47a055774e93a2cec3e721d312fa6204c9708e678b177c18e7063e388e48b573"): true, - common.HexToHash("0x257f5cec2b78d3252f19ead7839463ff23cf7e00ba522b0ab6b6656dd240185b"): true, - common.HexToHash("0xa8bb24ce4ddde075904c012c235e19abdaf3edb44809b3df0a396b984ed0e1a5"): true, - common.HexToHash("0x50d758cdf4fd6052f09fc45e9ac255344af0887f82c169eec37a48647860fcd0"): true, - common.HexToHash("0xeb2ac1fc4a4eae109bead0f834f5afa6f305252a94704ec596d158b152c50515"): true, - common.HexToHash("0xa68eed2ea1ac7b5e8d34502e6fb2f17d4343cf12ceeb76264997d61b76fb183c"): true, - common.HexToHash("0x4c7e998c8242a3a9d262ad3f64b15f471c9e5811d817b383c5f158bd8e17d879"): true, - common.HexToHash("0x053648f06374927b8a7376977682dcee47139597a697bf143eb024b551a4e53b"): true, - common.HexToHash("0x461bf3cd22b1b8699071461dd1558275560e14e6cfac383c27d56e019524bbbf"): true, - common.HexToHash("0x2ec5de9d644144e406226b941c8426b7f2e6621006d2e356dabaa1dd09f10b69"): true, - common.HexToHash("0x49484c7351991de35289526648e1b06e0cd1b51d0eb98a09006d5353ed6901bf"): true, - common.HexToHash("0x1bbe480eabd19758acf28797c144264ef76755ecdf259d35fee025009b525104"): true, - common.HexToHash("0xb812c6823746b86196fa3bd0636542ec2f94c36a010a5dbb001fb6a05e9b44dc"): true, - common.HexToHash("0x5e121242b106f51e15ba3cd2e980c57f459b3a5f45ad10d72033e9a224faaf44"): true, - common.HexToHash("0x92d357f86738b4533b225274b4b6fffce621337c6536802c2c079efcaffae5e8"): true, - common.HexToHash("0x35f1ad7ed12629a217b3ca68e4ba806dbcd502a1cf7373915f36b61e9a984085"): true, - common.HexToHash("0x4431e670d8bcb3bb65d3df436f1bd0ad54cfde220bcfb912eb04f4366e107324"): true, - common.HexToHash("0x4bd99c628b3fcbbc55ca1fd5be5af4e7c4b52e42c974b0a1a7b2e65408cb570f"): true, - common.HexToHash("0xb1d749d3b815fb24dff14c45832df10789a89d1f13cfff8056b0331be92aea91"): true, - common.HexToHash("0xc4674021d84d854748115a7b54fad4367c41b6210ecbec1421a7646fdcaff133"): true, - common.HexToHash("0x411dbc03c30b63c656654e178c90e61355cda13928f11d26775ca276d643065e"): true, - common.HexToHash("0x79e8bfec6b18ce9fea97fe6eb4e8496857b97314c86248b731bc0b6b62335674"): true, - common.HexToHash("0x60442c129708a0f8ea4e28f18847e5cd018b0ebd749cadc0d14601894910fff6"): true, - common.HexToHash("0xe12b9c16fe509b7900d429e01cb43548fbfbc85e9534fabcd8947812e8fcb990"): true, - common.HexToHash("0x2c04147530633f87b997e4225c9165daf991473400aaf1b4e3d53e533fc9563c"): true, - common.HexToHash("0x11f5d3b6daf9b2a09963d72e0943be9cdeb8f69a5aec70cad2d7a5825950e688"): true, - common.HexToHash("0xac0711c68acb066b2638a921891f1fea0e31202def15e69a6f1d1c05a0be3141"): true, - common.HexToHash("0xce1a0772f43c2ca83e4a5fe8f03960dc7a7be60cf558cd5e8970f050b1879df2"): true, - common.HexToHash("0x5155083378cd5d9aa5ba0440589d74a9c37260d86706a0a02d93b209690562da"): true, - common.HexToHash("0xf0a79d8ee5e566edf0ec81e3970cf09f481491b35d0ea0810ff94f81a26b1f91"): true, - common.HexToHash("0xe0b34d695b791f31a6479ef3841284fc9d6e4acb03e86ef4efa821258a760da0"): true, - common.HexToHash("0x5c81962e46fb903d2f2ac3f61b7fad6ca2659e96251932c27b328ed74527817f"): true, - common.HexToHash("0xa5f036e86b6c5d8e5808919f1c0a5b7d1e27b042732c1116a0da9d72282ba6bf"): true, - common.HexToHash("0xedd1d538664b2cf5fb2379f2dd2a51c11ae39b6c0929284ec3a8c12f37c660e2"): true, - common.HexToHash("0xa8faa348ae43c8f9e393b91e6ed666301bbb56bb176f4ce4df178325545dd779"): true, - common.HexToHash("0x30dd97d4946827a22c8dd35cfeb1234a46e2deb0531acfd0cf8a9dfc6c7ba52f"): true, - common.HexToHash("0xf73f9eb3ddb31df5eda6a8cd921ba13346bf10aec720a51f6e67978c89a84e27"): true, - common.HexToHash("0xe467c2766b7e63fca4f231848d9d809815db6c008cc2183a6317e32fc79b3546"): true, - common.HexToHash("0x923638c4b60ec8c22479464e98c87edcc9ea90f2665812e7dd247f154105cc03"): true, - common.HexToHash("0xeebfd036dc2698411bca6daaa6f5f924bb8de48cc6622238dcbf1c14e2c36f30"): true, - common.HexToHash("0x96436842303bf488a17aafc0dd7d4ef730a36973b4316d88f3b3b41788597fe6"): true, - common.HexToHash("0x0e7f6a80c2e34e2eb2af987e10cc8283fc4e4c0ef0e46a65ef73fd6b622db405"): true, - common.HexToHash("0xca7cd4cc52fd7b2eec27e925ad974197686c691f0b354fe686e03aa75f70755b"): true, - common.HexToHash("0xe4b6880c9afef3a795d77d8bc8a1f00baddcc207a2e0314e34b98b71fdcbcdf1"): true, - common.HexToHash("0xe086e1ff190e8b861d174409d30cce1575a5a67ddd6caf795e65188d2ca7e284"): true, - common.HexToHash("0xc7a438a6b00b0f503c1c193dc30b32095159302991ddad2e0d7b4f485f70a560"): true, - common.HexToHash("0x67c4d3573afa51d5922200cd9bb1611fb861db6cf0afc961dc31ebbf0ba11508"): true, - common.HexToHash("0x7d4ac5a49b6c0a6d35ee93f61458ee907c7a00c5d76140af92d7501d0ccabe1b"): true, - common.HexToHash("0x3ab4704c4f2fa7e613e054407c8efb359457a747e771501fc041f961ea21740b"): true, - common.HexToHash("0xdd2c9934a338812cbdd9c30015acd45c7b04d836a6d64bf443ab81f0432526de"): true, - common.HexToHash("0xbc8bd5d5e4e6b78b204ea99fdbf08dc4130abb2de0e9e4a014d14491a919b2aa"): true, - common.HexToHash("0x946ee7202078c7fbff5e7fba245aff144bcf06050191970b905758ea63e27509"): true, - common.HexToHash("0xd829e38fb890ac7ae5cf11f2fe2d09a244ff95c120bb3ee206f7d33ec7ba991f"): true, - common.HexToHash("0xd3946c50d2ae1980aaec0ffa9d63a1657671b0c7cec65d064be296ffbf40cf89"): true, - common.HexToHash("0xefa9dd053a39f8b29ebe1167e14751858c739c8c0158745b0000ed4a34de6296"): true, - common.HexToHash("0xaa224e93922384301555ac9dad3dcfc523e5dedc3eb697e3c49a3e21f539d17b"): true, - common.HexToHash("0xa5c45aba259e25b3d7bf9eed67970edf986999e9705529338bc2c7e0426b7418"): true, - common.HexToHash("0x98d6111e90fa0ac8da016f1804f15cb8a2f7309341811f676e76eaa8fc0a6a00"): true, - common.HexToHash("0x6a9cb5fd84ad327d2f0fefb3703eacce1e4ab1309333af1aeeaf9186b2d37479"): true, - common.HexToHash("0x9f74db9f73e1c3f14bf0baac76a884c8f091671fcaf4512a13d7f8517c09f16c"): true, - common.HexToHash("0x94402db84da5ad0730fe0844ebe62ea39fa00d057847725e8998781272daec53"): true, - common.HexToHash("0x621f0819af062d02d2d6a83507d7833e9e61d88b9b133fda9f8217af79563d1e"): true, - common.HexToHash("0x1a391a2e027d111b9e7126736d53485b26ea4e20150e2885616df4f789fbdf82"): true, - common.HexToHash("0x3ebd785fcbd60629f6b693b3a3e64cefda87fe2881362a0bafc5e505bcd54d6b"): true, - common.HexToHash("0xd9179d9a0dfc466884cd598da97c40186739b4e3f367156c137dcffaab68d09f"): true, - common.HexToHash("0xf4abebb5dd36943b5cdbff98b86dbfd86a65bf8bfeabd9f33adc689f2e4e3aa2"): true, - common.HexToHash("0x977e95ebfc408f17b2da60b4eba07314a7907b668b9be85997f43f3737f629e7"): true, - common.HexToHash("0xc01a05c016abe2f99c9dd44493123b857ee32993a57c91e71b67b0238d576abb"): true, - common.HexToHash("0x5ca81a7688da349ef1da7e0d571d9c068f7d372f1155ada5fc5f10c0e2d656fc"): true, - common.HexToHash("0x9c3fe5d72f6d7f9559aca0bb7d6b3bcf4b1544bf19cda59810bda91ea05f0b56"): true, - common.HexToHash("0x18d4c98bbacf0e0b0a3c159e67ff94ff95a545a4893668f46facac2cd41b315c"): true, - common.HexToHash("0x8b56a0687a2aaeaec5490af49721aa8fd33c45081da6238481eecf9cbcfbaff5"): true, - common.HexToHash("0x8645676a58d3ebc856acaf1c520aab1d5425f407d1a06f16920cc3ace1c80122"): true, - common.HexToHash("0xb36cea1d1efdb720e71feb75c33fb0c561d769e9c65db94e2d097ecff990dcf4"): true, - common.HexToHash("0x31f075e6f0123b86af5e7a9710e1aeb8faa696e37a634240729ffd79a80d51a6"): true, - common.HexToHash("0xc85b764083ec8998c2acf7e66ab1bae9b3c3d2b9fa9275540445bc9eb50592cc"): true, - common.HexToHash("0xbc650c1e2b7469f2f97c12a3ee30271a0fc1dadb37a630ff183b523559020abc"): true, - common.HexToHash("0xb3d8f9e494c7b3c7967a2e92dbd860768cba33dab2b7fc2fccae89fb305ecb5a"): true, - common.HexToHash("0x31665ae02eb30698139f75362bb73ed8435615d082befa18b156970f87ab2715"): true, - common.HexToHash("0xf3586b1ea5867f8b9581f967c550ce647f6dc8ad66692454718acf7d2882011b"): true, - common.HexToHash("0x1915ca90fb8e9048c709c6a17dba7d7ffc36a0d6a1d8652a54209c2a7cd0f2ed"): true, - common.HexToHash("0xbe2ff59c003b9048e6d34b8cf0ee57c097fb06c293396bd9e0fec672d48c6271"): true, - common.HexToHash("0xda8b36fdf128268c3fc458c81e7ba1384be4e942550553b40e0c715a5f51d85d"): true, - common.HexToHash("0x67af6f46b11d4e6db9e128885390e944770f278744963e909080a4d596253cd6"): true, - common.HexToHash("0x289e1943d1bbd18eec37cf219492dd0a657815778f19e76b4640506df78b3cfe"): true, - common.HexToHash("0xc3134ae92c67bc4e0b113a6331f46a3a86e7de79d7503d904c02689146efb142"): true, - common.HexToHash("0x3170991f8eda9e6b7364278f41e3cec2dc731a5a370da8c3e89f016abff95b19"): true, - common.HexToHash("0xc1daadd6d0aa0268440335822b6a040fc64d6e39cfde6f301af77af72d2e8aea"): true, - common.HexToHash("0x60c0c94d9ef45305cbd9d9151b86d28675a7b190a408ceda98f741cb1c7157a3"): true, - common.HexToHash("0x556f194b9ab824f9641110d530ce1efb4adb8d3fca7b13b482fd3a2685127839"): true, - common.HexToHash("0xb018c482f8d724054744363fbca4a93cc29e7200577a93431819375b23f81dfa"): true, - common.HexToHash("0xd37c4cd0fd80095dc7029a1e3c85d57a872599ab83843350a03b6f578097dd40"): true, - common.HexToHash("0x9ed579fdc603fc5e5cbee24682d4a3821d9beb0738a564be9198b65418712d88"): true, - common.HexToHash("0x443102f53e2e40b827edce24838bfec3a337537f59d81bd1da12f094daf549d7"): true, - common.HexToHash("0xc5e17f376e627d682d49eb1eff7f69f94e6d545317e4b743600bc9705da957ca"): true, - common.HexToHash("0x31b73cf7500a979aa85ce67427495e8361c99b95e74dd985cff116fb124c3e22"): true, - common.HexToHash("0x5237e7a7a28c212f63eb25f2fc96fb4b3473f9014c767520c53849d975ff8408"): true, - common.HexToHash("0x29b91d06fde7fe55975b19b61c493f5b6812915f895ec1ccef913fd5f4328754"): true, - common.HexToHash("0xb8c8f9d54069b5dd73864449965305b353c34e214f15a27899a5d9b8503c114b"): true, - common.HexToHash("0xbda1a815ed5b9fa90d17e8748a9ee8046828bd3ba7d16427e20fe609d28adf23"): true, - common.HexToHash("0x1dbb2c3ce68825c89cff2ffe7e4d1fee5a129555ac3a66292632149519591475"): true, - common.HexToHash("0x6338adfa710a587fc342fe9d8f5650de4f272a857cd853c0876d89c0a088a590"): true, - common.HexToHash("0x8bad6c53e7ad42ad4560d421a2016019c12e0e2167d69b6edf054d022b1950fd"): true, - common.HexToHash("0x296cfd3101fbd71bd29a67a79e3264d63aaab9aac2d0ac9bfb58e8f4aa64e264"): true, - common.HexToHash("0x592c5d48c6b070d098354337d145dc1483e68b65602af77bb7f7735140e6c7a7"): true, - common.HexToHash("0x0e867e456f3c18480576eb7518f998388c6238579f33d653c690c1ad497aeaaa"): true, - common.HexToHash("0x6b128dbdd3c6c7f6cf710b2c6d1c0a73c12f8a4679a6507089bb999a9e21c1ed"): true, - common.HexToHash("0xbd900329ac45ad001b4f6e8da5954d8265bebb63f5fb1b194b4c8bb0e659a374"): true, - common.HexToHash("0x57ea89ace950cca35b1ba47b0522b1fe392045035e579c283d3ceac7bb2a4289"): true, - common.HexToHash("0x8e69da1056362bf82f573b7e5965b2a48999896ddc2c6eb8ac9b49e513b94567"): true, - common.HexToHash("0x8c56e885eaa9f637026af71dddadef8f91400201e25610de286482df647497d7"): true, - common.HexToHash("0x0bd35a2b0042e37202cb010d496f6faa0fd1d05a823cfb95adb121cd94f67837"): true, - common.HexToHash("0x1a97783a0fb1dc49eea2bf9855cee7b6b0094e761e1ef404369d66a9f2a0e2ef"): true, - common.HexToHash("0x87d9ed5dbc4d233d5049b914ddba0661065515c6edac10322c6992679b42f304"): true, - common.HexToHash("0x34897ac8c1ccf7146339bdd9feafb5b53067d87da2d5bc11561c8dae5f6bdbac"): true, - common.HexToHash("0xa1ae0b4af5ed3221fdce3f70f1cee03e3cf07ae27ceabc6c8b2866f25bb954cb"): true, - common.HexToHash("0x925c5baa94ac1fdf112860e2aa7a98cb51d5b6b003b640308fdbd3a750373577"): true, - common.HexToHash("0xc3c1890477de680aee79c782f93786fb0c04a6b27bafbd3a3754509398af2930"): true, - common.HexToHash("0xf0db018238930edd63e97509454113a1a982d87cfc5ecbb4ae5892cb32d68058"): true, - common.HexToHash("0x8982ef24ceb833589ac6a2029053f750e6ce644efc82e0beb6c9a0cf47de7582"): true, - common.HexToHash("0x4ddba336c77a822471bde0e1fd5d4a4ee8eebcb45ad102d34c57ff9447d695d4"): true, - common.HexToHash("0x9b98621ebca966f7687a7c7eb7db5ef611fc58a6eedb48b540c76b7f15c5c45e"): true, - common.HexToHash("0xdf280f239f4e129ef5600c9c9f126dc0f47f396a5b6920d33c2f302e8b7b502a"): true, - common.HexToHash("0x4e31be0c67fe3bdb3ccaba6d765ae9bc2770ba56e911e69999df38724461d3c0"): true, - common.HexToHash("0xb53ca42fa4732a18ed988778d158dc8ec40779b9d21f7dbab7e4a68ade794364"): true, - common.HexToHash("0xed968eca1a42d9db71a0876815ddee49850713b683c94f9bba759c7982063359"): true, - common.HexToHash("0xb24c093f60abcb45b59252457a2b5913d31f95fe0a6910ac9b0bbb174f0c9a58"): true, - common.HexToHash("0xa038a5179114d1a84b8ef8e00692eef33b3d580ec8cf525fc934ea0416aa776b"): true, - common.HexToHash("0x699365680458a7d0edaf9ec16f9c5bcc69c6351cac2dacbda6df59ca6f631ceb"): true, - common.HexToHash("0xa954967d3be54cf3560c2937c71f876c89f2a5bb1824c8c613ce13ee769703e6"): true, - common.HexToHash("0x2fd15f229404d3bd8b3d08b923a1dca52f27ae793c7a5eb51d8f597682bc9564"): true, - common.HexToHash("0xf8515f8357f7de9075b215645dca16dc4aad5be808a59bf92e6c131d0787e5ee"): true, - common.HexToHash("0x9422579aca9c62c82b7c65d2e38088fa3f6a4c926ccbfdddb7f5681cdb1b31a9"): true, - common.HexToHash("0xad308e3bff7f2e7750a8f406ffd1d94154af8f1d8237f41c5a0949280a478f67"): true, - common.HexToHash("0x1edbb3438a5dc7bda7a264df44338422044ec05eebbc7d84fb064115f324af53"): true, - common.HexToHash("0xc6102722b91e31652bacfa12b68f07067956f076f52d4df6d8bea6ea4c862b5a"): true, - common.HexToHash("0xf1394fe1adeb68759f5aeaa0cc08a34e1e28a56e247d3088687afc80d87e65e6"): true, - common.HexToHash("0xa72049795d18f14a18887f70af47a8d8478ff17d94dc82a70bb3be0c8be524aa"): true, - common.HexToHash("0x50082c07637ec5fcde968e6c7e3ee86f1ef9dcbd5e2584a1f275c50082cf9f85"): true, - common.HexToHash("0xbff3f757ac2e8b8f767671c7ff54af2a8ea3e8695d8148b0a2ee9fefb339ba9b"): true, - common.HexToHash("0xdb89a0fc00a66130c901ff6f2a04d70687e11ed5221e1f94201467ea171d3451"): true, - common.HexToHash("0x45bc02c28e19b87499ca812e0ed7e28039ff1cffd1a27f77ee229b33cdbba1ac"): true, - common.HexToHash("0x9cb9672d8c10ccb11a99bd63383ef7065a6b8d3c04b088e38912756cd398541b"): true, - common.HexToHash("0x87a236c452e00257e127df2dca7504d96f02583fd196bc79b8f0ccfed69dc1c6"): true, - common.HexToHash("0x1ffa4cf512d7670c576040e3438bf32002d178e1c1ea34695701c2016a8fa1c1"): true, - common.HexToHash("0xab1ee2daa8a93c5e427bad65bc56c73f21831bf5a3ae681449e71355f63899be"): true, - common.HexToHash("0x2628a734efb54186306e587a299e5b9cc14466eb388bd08bfb786ba1a272e549"): true, - common.HexToHash("0xa6d236b74031bcba00ec46ed24c772206f608d4d36573d925d7c1df4cc0306a3"): true, - common.HexToHash("0xdd5f64746e3460cfafc044f38ec6dcbad95e7468911884f9baec4b26544b17d1"): true, - common.HexToHash("0xbcb9db0fbbb9f6cb404f7ec387e43b7a7bc224e31019f8704c08e992edc94260"): true, - common.HexToHash("0xd5b252c5dfc587d66f3c5f258a7e7742c71edf5037c0344f590812e9749c2283"): true, - common.HexToHash("0x3494be77d67e8789909d76bd241a88973f31842bc59dc7c2282d34a228849135"): true, - common.HexToHash("0x12094b0d3a3a13eaeabac622972229ebaedda2a7fa0db11e95a26f1e2f9d395a"): true, - common.HexToHash("0x1c8fedfd390a46bbfc61cbe866726cf4c08265473dd9f1642bcd493f2e1b0d9c"): true, - common.HexToHash("0x42f19c0559e76a0ab8c361a64367230244be63991345c01d8db4971ac52d4921"): true, - common.HexToHash("0x3da92c830b12c8ed955aab0e6dd81175e8c48150d85e44ce0acb287c387adfc6"): true, - common.HexToHash("0x2c91f2310235ced0ea84cf224fafa3515d7ee309313808dcb399a4b546c0135b"): true, - common.HexToHash("0x13ff58a797e34ab4db1431a43962fde2323f74ffb05cf0cd0f300519e48b3511"): true, - common.HexToHash("0x1b256719af5491e13dd2ca55b1bc30cc33415865d222bfe79d714c4a080bf17b"): true, - common.HexToHash("0x6c4e1cc91400de874786c6aeeeb5d9f88a923b970c45db4a244d4ef35d51c435"): true, - common.HexToHash("0x9d5a4e00b4da31937967c14c9c2cc20a347289f970275a85a6aca7df7c46689d"): true, - common.HexToHash("0xd92648e8fe7d0a64288fd71f2b10954cf52106569a8ab913dd2fda56970ecaed"): true, - common.HexToHash("0x2da577bb2cb5c7f0a418934eb9d4bdff2bd321bcc17a671e4099a5ec3007fa1a"): true, - common.HexToHash("0x91c47668c1df5376c59e753f61c2cc06124a95c4dbd5939d2c94d5b173e83203"): true, - common.HexToHash("0x63984af27259107edf2120a86b1e1f8fab40d1d0471337277b60af3449239f83"): true, - common.HexToHash("0x45e6d5841ec5c0de80afc9afcc7f7cbb150acc31b41f59eb51481833d92f9181"): true, - common.HexToHash("0x32d54a615a082a3d2478059a84ef48f1dbddc03038fba59f8e219babe8b4afe4"): true, - common.HexToHash("0xacdc893bbf7c977dbb3d2216e3e91d0bb647effe368e944c179c760340564d39"): true, - common.HexToHash("0x990040fbb516bcd2c542c9d1b626fbaab4e5270bd3804e8da1fc0d97949aab50"): true, - common.HexToHash("0xcc2d5145fb0425339af19450dacd55d507435a86625675fbbd15bc5594949979"): true, - common.HexToHash("0x7e3ebeb4acb6ef5591faa6bcb123ff91bc4cb7ab8f155bc9a8aa77f2d9c335af"): true, - common.HexToHash("0xf03a4f323324db413fadd7e5139828fca4fcb614ddfa4821f2848cdf958c92a7"): true, - common.HexToHash("0x4d7d3ccf9696e81436f1851d6e12f1bd8f999c5e44a182a6170a7a0227d35140"): true, - common.HexToHash("0x165af69b38d18725b27960ee7888e93024d4b8ec47c06fc6cb1316a5c0f87b70"): true, - common.HexToHash("0xa7fbc9a8b39d7a0dfab42497e76cc0ba5a1b445e77ba9ae433b40d456bbc0d01"): true, - common.HexToHash("0x6559e8156bdac3b1ae74e2d608d8e0ff301462eabfb0203b68f2710523b623c0"): true, - common.HexToHash("0xd60e2a9447395e5e3278f3e518380f97cfe47a991f41df3ff99eabdc6b11bb67"): true, - common.HexToHash("0x69731933bd261b262808265075e2a363261aac12d25466c812427ba5f5ccf26a"): true, - common.HexToHash("0xe51a662c25fcfe20ae697dbee1e765f856ec73ab274667cee9ededf3baa34f34"): true, - common.HexToHash("0xa4b439930e19caa30a66dc38bf74a9b8811962b0748a85ccece57f893aa65dbd"): true, - common.HexToHash("0x65a2f1f331c4c61ee4c71cc186a0464eaf0587ccee4ffa72b462a68ba8e4d26b"): true, - common.HexToHash("0x79d4e51822f01ebbb0699b7912b34ad2ec24e09e5eea20da0f5250b14adc6517"): true, - common.HexToHash("0x4e273f47a1896c0d6200fae748a66a87f08cd0416192d6d18096520f643409b0"): true, - common.HexToHash("0x48855881ed4146d3c8d3b95aa11085ec1149f74b003f3303dd36abb007baa60a"): true, - common.HexToHash("0x8e73fe5004bd48d4e9d8c033f0c7a508113db6e489d9562975ac1b298f419799"): true, - common.HexToHash("0x5894c873065c4e33a6d697ebc04886e40a0e7cd78e564163c29871223e32bb5a"): true, - common.HexToHash("0xfee7591e03cf813c381fb860897eb335eb442b9ac381eab79b4c7cdd71e4dffa"): true, - common.HexToHash("0x3f613e6ef0c014a3f44bbe135d9829be1115bcc5a7ffd8cf1caf095cd06da088"): true, - common.HexToHash("0xcb89e77cfc5a5ef8ac994851a1a682f195416c95f1defcb2788e19f6511fb719"): true, - common.HexToHash("0xd16e0dfa5125e4e140d177660a1e66a984bfcc66f9e242be22cf88cf0c1f1d00"): true, - common.HexToHash("0x9659e680f284aae1ccf1e75cf8d32b08b290b9c2d846e3bea9cdd292a534e4bb"): true, - common.HexToHash("0x973bdbc384b4847657116a681a75585e60246ceea6e6bc1c753c8a7ad01c824f"): true, - common.HexToHash("0x02999e5c0bc8d4f00273fc973e535c5968b9d1c07820251f68042f071eebb8e2"): true, - common.HexToHash("0x59586b2c8cf2596d89bf87af860c84c27129a76ded5b3f2ef5c47a10ab06a8df"): true, - common.HexToHash("0x2daf34e8552aedf9140fd66d74f1833a9922d0f908f453eb2822119ff4625125"): true, - common.HexToHash("0x912e971fd051f117bcc14f9318b652ac8126c28b803a2ea6f05d33605b8030d7"): true, - common.HexToHash("0x4ee367ec208b64b0c5e19bcb321d337c776c253f26887ad471f2b99beb086643"): true, - common.HexToHash("0xee18f1e7d17e2a45591d6ba17d265680a0c074ec7b478ae784287ca91640fb82"): true, - common.HexToHash("0x5b03c6134b43eedfa283475a7e6cc49941c667edfab8acf9a283863f3b71d950"): true, - common.HexToHash("0x0163ddeb2b26dc3828b3e27ffe31f233980c97b63c4d057e965581b717a7af76"): true, - common.HexToHash("0x102588f8b7010e2bdf7a29f7fa7d1f65a6e0af3717c53376bb4f773c19c45b11"): true, - common.HexToHash("0x441c3999b4db1bc293d18708e86304360d2e7a68dfab427c426aa07e0fc6eaf6"): true, - common.HexToHash("0x9df26a44d5c1d569ceba6bbeeb5692cf66a2d558ebcad53c3b21c7db90fdf6df"): true, - common.HexToHash("0x67814878199def00c11900460e93da16e40ac7c71004c20a99dc4259764b9911"): true, - common.HexToHash("0x697bdcb89292b1c063d5b5ef394bb936c2a0100115c08c4be5a6c0131421d330"): true, - common.HexToHash("0xf1a25dd830f72059aa8320c1b690fcf55b6b6819769d475e15dae9b9da89670a"): true, - common.HexToHash("0x60c9e8992cb135f7970575202e0ae61cb632ea4e0db132f82c1b1ebcf2077894"): true, - common.HexToHash("0x7e47b3deffa1a96276ec5f8c1f552af6849dc63491d31682febfd5199990f7af"): true, - common.HexToHash("0x9147d68a34c46884b00cea8d978ee07b038ad9acbbe32c5751ccf56a6a23b2ba"): true, - common.HexToHash("0x3822c005a009f0a0e77ed30fd2b755e36bb9172db140c634d80b5a90585feb3b"): true, - common.HexToHash("0x6c49c530afd706501b50b0d143a801097567ba8d78487c24e038f12ed3ba8f60"): true, - common.HexToHash("0xb7b0068b93a9f6abf6e7addaa6d250a9afb127bd56284d6da12601494a987a61"): true, - common.HexToHash("0xd998743eb256193c3bee94c0ad1fa484ebfdbb5b92804083c0318a3dd007f8af"): true, - common.HexToHash("0xcd62f99b191011edd6bb6d6cb24501e6ae1b59916fee266a080ca46eb19684ac"): true, - common.HexToHash("0x0494b44c5aceeccc0bf2ac422575d9c5e0f080cef9a49bab10574039f14d9202"): true, - common.HexToHash("0x4c6d30325b47e26817723348c87fa0a53866ef44bdd2921619b739e5c93bf691"): true, - common.HexToHash("0xee8fb70483373faccbe058f85bf597a456ce19eeb2a533bb65390ad4fd8c82c1"): true, - common.HexToHash("0x4eb6bce5ad34cc4abc948c158ff3d7147a4ca607fd2c630613a8ee4f2ebdebd3"): true, - common.HexToHash("0x0a13186f3ab5193cdf3bdf9f667a38257bd55fd0df516c1de6b09fbd5340db97"): true, - common.HexToHash("0x25f7edf2758bb2d4111b3d38801b5ed7ebe78d4599795cc68f0ebd9ce1b359f4"): true, - common.HexToHash("0x77e2e50251ed30d568ee469a7a0e5c88c84ef3fcb8d94ed65ead4e0a9e903436"): true, - common.HexToHash("0xfaf3e42ce322d423c47d8c08da57fecb7b08cfa91ca3950da607618d85a4a121"): true, - common.HexToHash("0xb37e9a493c757cb4fdcd3e987c0e36554c8250930782b483c15293ee963e330d"): true, - common.HexToHash("0xaeb7908299061e8540354ed5d471ae00daef058b80ce95fcc50927c63161d6de"): true, - common.HexToHash("0xf3b6783ae8b57e66bb5943f6f5693f7dd91075a77113284b058d0560d2dbead2"): true, - common.HexToHash("0x730727702509745c8a35311cdaee49e2054690ee2aa0bdb95dfd4f488e63dbd3"): true, - common.HexToHash("0x14577f126252598ae4a318921f60b7eaceacec72c5ce8566eb020ce45a524231"): true, - common.HexToHash("0xd0293e2eaf88fad355edbd876fe70b80e43b3a1683b12a191a8108fd809546be"): true, - common.HexToHash("0x6c7363dee1b5a25171f98e95e79b692b6895c60ea8fb15e17843ef61e2bc5430"): true, - common.HexToHash("0x56fafea4526d08ac68077c2571cd95390b9ff5c8b77ae6d1ebb3c2e7b3a6b569"): true, - common.HexToHash("0x87bc824d4c9c9ce45379f87bb30a67796109ad0a6b6976d284bd3ec23bb0ae01"): true, - common.HexToHash("0x7e12d1bfa74c62cb5543d065ef668f175b5cfb98e1cfb4b37bfc77c5c4eb193d"): true, - common.HexToHash("0x909b5945857b555407c94d71aadf9c7ce69f29992f59a7ce0846acb1fc4cbe79"): true, - common.HexToHash("0x8386132f3110e6af6ed75303841cb60077e3e2693fb61c776eb2e9664cc3d289"): true, - common.HexToHash("0xad9d8620714ed0e6858bc67f2280dc6b42fee9901aad4b643617928f89f9fdc2"): true, - common.HexToHash("0x5d548f2dac52fd343e3e6cd17b7d7e29edae37a1cf3351773e4beee152e6e908"): true, - common.HexToHash("0xced3fdb36ad0ecc4dc58edc07ded38ceb74e19b60c8fafb802c9a69f1ec9bc53"): true, - common.HexToHash("0x5626b945a2fb2e82cb72517e0990b3ea7b1ec9ed7938f561d551c7eb2d46302b"): true, - common.HexToHash("0xeacca450416a1f7b2fb81f10175c9046aded8739eb907934b96c0106cd5adc74"): true, - common.HexToHash("0x00884e8b372de993d55b66b3e5d8a33b00918504141679fd6ce67abb839ee168"): true, - common.HexToHash("0x70d396a4903642783adb4c704bd9aeb9a02ee33e631b1c7a5bc0821c475423db"): true, - common.HexToHash("0xa5a9533deb012c048d5c42803062af3f162d6c318b510f6b40f903334a05245f"): true, - common.HexToHash("0xf090f118a02773f5cca93cbecbdca5272fd4b9e5e889134e05fd80f292d27879"): true, - common.HexToHash("0xbb5de1a59a16f25a0b6a8393c250d2b1a4020307d6f9b5e08d988b76501d9d23"): true, - common.HexToHash("0x0986d4c98d40ce61093fd3516b61e48072ace53b89e622b45bf1b6db7c7639f7"): true, - common.HexToHash("0x0aceb9182961fca510f5a724a5f92faa56c3c0999d210c6c0a04d8ab9b5a96be"): true, - common.HexToHash("0xa618950ae496c47ed202fa3014f35964a99e4a7d6e881b169b4db8aa41023f0f"): true, - common.HexToHash("0x7b5086c02b1ca3fbfedd48a503ba269027c49de8cf11ba4edf3882629d02e787"): true, - common.HexToHash("0xdf8b1c9c7ebd860a5109e99e16e925499fb8f51a21c3ae391988be7f473a2e98"): true, - common.HexToHash("0x91c2d819812e09fdf2db8d8e157fbbb9bdc2a292819bbc66bbec151b3d08e8fe"): true, - common.HexToHash("0x4c499d87e38921f58016e32e0bf4b5dc87e3df74cdde71e0eb288eb2db053256"): true, - common.HexToHash("0x044d5a348899896fffa73bfb31539c1a9c33462bddfa7de9a513639b17dc056d"): true, - common.HexToHash("0xdd678bb47030f6fc484f204dd91746d27cb87fe30dc6bd6d3bb436d4ee4ee2a8"): true, - common.HexToHash("0xc67097f67dc21bc2fbb4c8218f4e57a5aa5c194b8ba4e833e4b968bc7560362e"): true, - common.HexToHash("0x830f42e7afe71ac1949b234495b56afa8784505eee8e646eebf336f974bf0b2d"): true, - common.HexToHash("0x17186b91aa7f8b8f5935f9d15599598f677cac876230e772e04de1ec3bc693b5"): true, - common.HexToHash("0xeccae326242bec7fe985a2a80818caeab3484da043e892a7ad82a87879c7f223"): true, - common.HexToHash("0x137948f3481f0b9eb311dc209bd4ace1cd3f35a35f5e0c29ccc024c72c1b5e6e"): true, - common.HexToHash("0xcc7b8431e25b110bae56f8d9966a761d1dcfc13b24b551fc15ce981aae365817"): true, - common.HexToHash("0x5313f3125eb9a4a12dad20af63453ddf70bfbacb638f8264ffe021e39b9df1a1"): true, - common.HexToHash("0x07925e3bd7003ea6201b1a0cd5fba85d8de0d3a5824ad3c75e2f7fa9c8ac8598"): true, - common.HexToHash("0x1972d9ae72a9b1b2f4be9c2f7f3c030e02dcc76ab539bb6f290a3178f9a76c01"): true, - common.HexToHash("0xeaa3a44b98be1d7c69761a8b14908455944daa2d85e909a03d2cad9afa299d3b"): true, - common.HexToHash("0xce7615b987cd213f3c0799bff066f5368f7b0702cb80e06e85f7ee1b7d8b0f21"): true, - common.HexToHash("0x4132142b23134c2a128ea2745eb6094af74d0a1509c51ce823039cafdb5e079c"): true, - common.HexToHash("0x1189233d0700f175035afc2ab9c0f93a5e0bf911a83707fff5c86732c0196154"): true, - common.HexToHash("0xa1926e4a2a16601cdbb0d3918ca24ecef1e42e706d88964d66c67e829ea9ed5e"): true, - common.HexToHash("0x201e534370e49c53f7135bc230ed095d7ae0a097f6614c77f5609da6aa45fe5d"): true, - common.HexToHash("0x581a6d3b5fd089e764830d83b4385f9955aa5ded8ce1a26399f71f8fcb78b4da"): true, - common.HexToHash("0x0d012d65365dfecb1ed59d8f1c8d3aee80a1ce7020e4b68c005db2ee90b09f89"): true, - common.HexToHash("0x2520228e5e1f32566b497dd3fbefa644e8469582a20b6e5f30f03c19b152c78e"): true, - common.HexToHash("0x1cf972dce74b5c72bcb8ddbff80147f191c4708290e35fec8c6bbbfed4225649"): true, - common.HexToHash("0x36eb359bf4fbb0a4eae7a28e929ce951148ec5197fb0275a3fe2accb42e4a52c"): true, - common.HexToHash("0xfd0c0e7efafe6cc87682199a6c12979b66ac33bc22530051379d68178d82685e"): true, - common.HexToHash("0xf1c00572123429fbb0a583dacd5f64c7ddab57f522c5bb91b69067401a938c57"): true, - common.HexToHash("0x103f63cc776817513d4a4ba61b74529b14a7033bb11545d831b90db49db651b1"): true, - common.HexToHash("0x963322acdac9b8a9023f24a246d252bc0e6fb0274c55dd680d400b93701f9ff7"): true, - common.HexToHash("0x551906ffe9d94efb316d7ac52800e62948ecb84a7c2331ebbec1f7410b4b2e82"): true, - common.HexToHash("0x8fba2d1d3bec1bfd7997182d98e61aeea878890600f0ee832291bb42a238ca5d"): true, - common.HexToHash("0xe435db532d7843984b6bc9d7a55bb89864df6500fe3a5596e4e6549d948bbca3"): true, - common.HexToHash("0x06a135d129abc710e7819bf8903e116563d897d06485ba73d3f2587e7c70083c"): true, - common.HexToHash("0x87b19c3687ede6213b7ffe46754919da1682d7b05646e527287363c8df88f3bf"): true, - common.HexToHash("0x2942a2a66d691996d7c85ce8cdf2a1d44e7e7ec61fcf476420e6784e7f2af29e"): true, - common.HexToHash("0x35dd9ceba3e27bee2cfb43c255b872db85cbae8dab0c4bd4b7e03ed525424d77"): true, - common.HexToHash("0x28aa7b1d1ea0ffa2a8d9c46f86514e6480593e9556b55d806bab952905254cff"): true, - common.HexToHash("0xdf40d3e99944f1ab25097ac1a990aa2647075d663bfaa480355926e784af1fb9"): true, - common.HexToHash("0x4fa324bf00b67fdf1cd3c92b7be346fbf303b6fb361facd3d5bad3ec89ea708f"): true, - common.HexToHash("0xf3f8c5033a3409447e6c1e258cf8cfdaf1d0db761aa82a49c21a8b8c697f7666"): true, - common.HexToHash("0x2a91fb8777e85d0cac1e7d1367acbc495cb802e6ff631a0b418ee415f81c5df5"): true, - common.HexToHash("0x18b64e0f7a14da313c26924c208b12aa5a9cc4bca07f3aaf3d62f53703c5440a"): true, - common.HexToHash("0x18deb854f9cbbd0b92e32d4ecd139e9c640b453601afe52716c1b1dc7227ad54"): true, - common.HexToHash("0xcbc36a8a0f28d097eded5702540f8c7801561c8693ca133abe7b8937217538de"): true, - common.HexToHash("0xd285785ebcf8cf1340d2c1d1c9f960afdb438dc3cda53a7c657140369cfeba33"): true, - common.HexToHash("0x0b404935874ad1fc10223034f91c20031a5016a155369f7167fff185cb10b98b"): true, - common.HexToHash("0xc5627a9c8a6c98ce834e3e0b37a147af17fdf6b3e46f20a0894ee4381e449c61"): true, - common.HexToHash("0x55dfa8422a3e63456255128ef5cf634ecc49390b5ef2d21092756f5c94756d23"): true, - common.HexToHash("0x178829a719a6903e633b0030de6cdbaa9bd18ed56ee9f8b56f79984ae1419ff4"): true, - common.HexToHash("0x8b16b3671c515bb0df48fcd2487a6bed90aa140048138ac5d934b246eee0ac8f"): true, - common.HexToHash("0x8d34010a12b0675c1ac91f0978b83095fe103f84df6ebcf75acf6ab6c18cd8d9"): true, - common.HexToHash("0x78cd3301e130f79c514aa76ea0005666e3021ddea5ee7432d3643d9fb373757d"): true, - common.HexToHash("0x2b2d9bd1da9f2f9dd05b05c8bff8041622a8ebd13c74a34c289a8b7f7278d073"): true, - common.HexToHash("0x8547e2e4f7388345a881b85068af6cb56fca728d1077f3d20598765b4fbfb7ce"): true, - common.HexToHash("0xc57b279ad0048d7f7225b8196f37e43c3a6059917ed45e758c9ffa4f48691520"): true, - common.HexToHash("0x2e5ba213073cf4b2c16426a777089c55adf81a4add39e0213081da8818af40a8"): true, - common.HexToHash("0x5714c5516ec05bc62dde7ccdb8cd33ce60b4a44eb19aaacea62dcaf60c262852"): true, - common.HexToHash("0x136956bd47aadfc10340208a06aecca10a38fd9d9b0f3faa2fd738bc1e67440a"): true, - common.HexToHash("0x58d06cfc4df135c9914f2bc1e69e0fa4163d74b5a618f21c63fa116bc23bd61a"): true, - common.HexToHash("0x0ccc2b47358951fa097fc65c9ac27d97148c005bc633ae6c564b980ffcadba0d"): true, - common.HexToHash("0x7bdf515a116c172dae7a8d62eccd8de9f090d1b77bd5f39419640d4c8d3b7f7d"): true, - common.HexToHash("0x957bc6f841734a1cd52b8aa6d8cd6440364a03d3ca2e7cfe7f8dc479bd9ed5cf"): true, - common.HexToHash("0xa25ffb78610ee5a744c0605e6bfb5180def794d863307601fd5e93362cbcf883"): true, - common.HexToHash("0x73e2358a6bcaa15bb65a0f96d47ccc1a15711d1b8a95e4cdf5ce102dab613ebe"): true, - common.HexToHash("0x52330a9af41355ba443f5bab5415e2460923978ff70e7d505807d41a774339c5"): true, - common.HexToHash("0x6cf799cc5fcb79f0ad291538360d219a2db057fb18ca2e37051f790ebf1548e7"): true, - common.HexToHash("0xca3f4dc1b40ed862cf701fe6fab13688a85926bf3018213c3992acc58d613635"): true, - common.HexToHash("0x0b471f1ec1ce05a9cedd0178a77f72147839fe585758b3def30482298e5ef3d8"): true, - common.HexToHash("0x58a4f0031754c701a759ed33ba8a7349cfdd5a5e9be31fbd192841b41a80f2ed"): true, - common.HexToHash("0x82dd7ab5937db3b4ffd9eee71905fbf678cc20191c2d8adba694da0d1df60e8c"): true, - common.HexToHash("0xf7ea1eaabdd0a999f9bd24d16eb362be644a3b40e4d946b8596e0108e7f90872"): true, - common.HexToHash("0x8c3e9833dfc5898aeeca3d3499ee8a511c9850e1366e9b67a082a7489bbd8058"): true, - common.HexToHash("0x53c34d0a317143ae8994ab4b91ba632a2ed75564dba842340aeda1cab66d88b5"): true, - common.HexToHash("0x3e23f3612d051601b2096c54057305a96fbf2cb339d71eb28aaccca5189e8ef6"): true, - common.HexToHash("0x3f0c508b59d58d83dbeb931567cd68cadc9f73cf92292c1e5e1ee10e3d23161a"): true, - common.HexToHash("0xb08ace1201292bc97a40c26a1905a7dd098beea8b35462838177898f07d0d8ea"): true, - common.HexToHash("0xc1ef02f5015f02ea3f9afc82c6dbb86b9b2337014f12beb948ef10d2346fc4d3"): true, - common.HexToHash("0x885f2cca46b03aee2cab36600f4c08cf327e2d7b9922d0aeef2567ca6b158a98"): true, - common.HexToHash("0x7c96413b2bcf551346b30e67b499fd9205a57a3ed0a6a6ee10bc3a2898ceb301"): true, - common.HexToHash("0x211585c94ebb350755b3fce8ed206aad66fc85333434a44ebc7ada8e8e04087a"): true, - common.HexToHash("0xee6c6ce2524631a4a4ee0d79c5ef68a8604056b50ae2eea875fa6dafa1bb26ab"): true, - common.HexToHash("0xb075d4ed22ceabdbeed5596337b2d3895256bf6516a0cb762fdf304f72d1299c"): true, - common.HexToHash("0x06e923072a3bf4087a7bda876b534d561f6b264b04148ea269d81d987ceddf6e"): true, - common.HexToHash("0x97cdd1e1c5f8744f0593403d284e6795a79b8f34a625aedeca01bc3ef154a19a"): true, - common.HexToHash("0xcb328c8460305ce81640fb71a643a535b112ac3ecd39f0fc45bafe239627962a"): true, - common.HexToHash("0x23c02fb00e078d8d3def6eb2c0a9d04841ebb144771db5a6a81060771e0b658d"): true, - common.HexToHash("0xcee4e3540160574f2c9df0ef2245f3bcdd9b04d11f561639152c99f8e5920149"): true, - common.HexToHash("0xaeb5513828084a7f289958ca185b9410fe394037a6b4583e2447a80f5ca6a692"): true, - common.HexToHash("0xc6df2c1dc07e365e1abb4ade0f9cc3ace02edf226822437e59768ab7e6fa6be5"): true, - common.HexToHash("0x64e45aac901fe8b6bd59c7d28d7e7253d6a0d5d082b825c7bfc7cccdcda00bdc"): true, - common.HexToHash("0x1509e2dca30eea4ff81deba5d29ce0c6cf0f5eafdf72e2795a3c13122611a038"): true, - common.HexToHash("0x8bbbf30111f47047ce467853cc03d2f4987571a919b27a6a79dd03242931f11f"): true, - common.HexToHash("0x9698da8da6008ccff5f3464b5b97002c95eccd8d87b57070d19eac6d16e7b910"): true, - common.HexToHash("0xfb4812df8ce38d5aa87d27b4d7f77af4f10b65cbaf3576ad8798a4ff29378db6"): true, - common.HexToHash("0x0758c5c2e9fb2efb1ba675ffdf60ff64a545a6cfccbc58e60221f5fec502786f"): true, - common.HexToHash("0x192860fd129add7e340fb162e52eeea93755c9a857fc8319545739be680a2196"): true, - common.HexToHash("0xdf714daf49ca51eb2f6b235fbd09d0895b683dee9ac778f3b0a1c1865b1c7151"): true, - common.HexToHash("0x928d41600fd408a5a6939c3d05d92006d02888f8fc5d0c3c84a780db6b5dd6c6"): true, - common.HexToHash("0xb6e2de6f6d3c19101aea5459983bc3006647550ad6f58e26e534ef3a628a3604"): true, - common.HexToHash("0xe26dfe1694bd5d5d840a6f051049d016fe506e648b89f72fef460025b534010b"): true, - common.HexToHash("0xdea1ff563a938c03bef3a4603cf3be5879b0722f8744aff99c6d0db4f8942d2e"): true, - common.HexToHash("0x931ee50e5b71fecb0b432b4344195b5fc5fa8f4b398c848111a132da0e806396"): true, - common.HexToHash("0x50a67340d32b6f9c014f230230ead0c6d190812aa2cfe296e0a6bbb215836ecc"): true, - common.HexToHash("0xcc9b5bbb63d71f338557864eb465bb857a363b4eec7bec44a01e4418ec6748f8"): true, - common.HexToHash("0xfa55a0799daba5fbfe3832da22a824182e510326f87cc1775d222c06733c81a9"): true, - common.HexToHash("0x2341d858d261b0ada3d89520d83201760ee23aa32075d5e44afbe6bae20dee11"): true, - common.HexToHash("0xc4a182171b8b0509cfb02fe3f605608da67c58e904b1d0eb9c56078b1f12678d"): true, - common.HexToHash("0xd523e56f58ca4dcd9791eadaf4a0c9b4a3f4c32adf2ed225b8e36176a2348923"): true, - common.HexToHash("0x8ba45e0e7dcf91e02e8ad407612a5ca8994304579302495afd089dc84222e640"): true, - common.HexToHash("0x9668a202a78152b4c3bc5da3f4d738961065e49163359f2274f1c76d8045f342"): true, - common.HexToHash("0x6c19740dcca335ce19c214a4e975b7d432856a0a0320d95b7d39ed905a61f07f"): true, - common.HexToHash("0x58a40df256429e74315cf61cffeb21ccc3d49597b9e34fe9d1bd751d00d7a6b6"): true, - common.HexToHash("0x1bdacc1cec185fe2ae4819dac631c96679c80981b904f7993a2eb495520496cd"): true, - common.HexToHash("0x46e61515139dca760bf24aec530d1b5f13ed9034cfd123d07fd4f86cad4419ad"): true, - common.HexToHash("0x424eeb08028bdb9588584227c76816c0d74b0f7d783257f36492ccca256f3e7c"): true, - common.HexToHash("0x9d461f85952f95be1758c916700d19ce1ac9153db96e3d0a65c583ac19869a86"): true, - common.HexToHash("0xdacc54bb226f3e0424e89f401b43d24c6e08ea7d788456c9b40d619cf22b9e7b"): true, - common.HexToHash("0xbeda077ebadfaaaa32e3110ffed33f82f36b8238df4c9111be9900867b842146"): true, - common.HexToHash("0x6a42a1fdc64e46ec9e748cafb41cc407744d9c3ae6131d5d81baa3738c402eb4"): true, - common.HexToHash("0xfa931f9278d8607a4d118aad692db8b47b13380ca5a19151f111cd0d401533b3"): true, - common.HexToHash("0xdcc8752c4a55d2a39d020b978313527bc8504d5e77aa8f6d4cdcc3d2c9fdd525"): true, - common.HexToHash("0xe59da24ae377a07ad72e89cdb3d31a963f0a4deab470fe45feb29069fe35900c"): true, - common.HexToHash("0x41677486c66c99d8b7284b41ef880c29df7ced872eda1c969f658e8ef0ea1255"): true, - common.HexToHash("0x8dac33e2585f24cd22002119f7c62f3d8db0935330636b8cb6e6ff9bbeb3d2b8"): true, - common.HexToHash("0x1293dd08aaf3e54f9e92b806b745e4fe1d4695ccc99d4de18f1d5c814f1fecdc"): true, - common.HexToHash("0x103f6f591d46238afeb331ec4640da72a4a076055d0fb4758f0892f192e0458b"): true, - common.HexToHash("0x7d1487f68c98d7673e0be75149c0bde0d868fbcf446d9758e8fb2f2d1be4f652"): true, - common.HexToHash("0x5decfb9b3ec380a8f85663074e1794e6994b7bf800ea8d5333c24c099a357f07"): true, - common.HexToHash("0xe34b1175033aab1348a5aae186632f103e12d467f1f692ef867328790ae1cba8"): true, - common.HexToHash("0x243143301ab81dcc4325a11b7ecd4f7b9104a6fca0fda6e8a6259a196ad8cb7d"): true, - common.HexToHash("0x73fbb90e33f739bc95a1f323edb0a3d58b5db05c4bb0df6ae73303bd4b732052"): true, - common.HexToHash("0x755234e3c1a8a1ba9d34316a84877a3055eea14c62c7f72a3871108596cdbdce"): true, - common.HexToHash("0x601e85c1b67b46ca7bbc914a7b0208749912b217df983c346a6c439869c07021"): true, - common.HexToHash("0x3ae8df448d3e36c24877cc6e8a6b8f7c4a94a938d26e744a17293ea72a5af0e8"): true, - common.HexToHash("0xc2a28ddd8a32982bc13c837683fd1e1ec6301801d6f419143db4827c714bb9eb"): true, - common.HexToHash("0x9b98d36ff83b4825caf6a8a380d2c1613fe423f9695c1f509dfbed7238284353"): true, - common.HexToHash("0x4d5086de73d1ec2e4b2ec62e5dbfc89cc400c8697d4bd6cbfe26fbe61bbe125e"): true, - common.HexToHash("0x5178d40079d51b03d66eb0f6cd75e1bf8cadcb791cc82ac75b10d88428b2fac0"): true, - common.HexToHash("0xea4a82bbdab4661f4036ada42a73eae31efe2db8f6d2e2f4c2f8da832f4cebb2"): true, - common.HexToHash("0x6252830321c788d2ee4bc5ec331c3070471d13d0b3ebe3c4c27024081e7c1806"): true, - common.HexToHash("0x0a2c68e056d4c4177e3f9bf3bb6657d4e9ea8acf3275160a82a852d53d1cfafb"): true, - common.HexToHash("0xed11fbd17ccb9f906265b14ae28b2eea00ebfe2103e4e0d26fb64e2ea594da6d"): true, - common.HexToHash("0x3fe73501dd1e5dca40cf3c2a7a078db652deb1c669d39b19db3a72fa56258c34"): true, - common.HexToHash("0xa4c7b8d461a4b62404b3bb3cf0ca197de1fc0d71cbde1dc75622cdc6342185cb"): true, - common.HexToHash("0x86f7991e69c0799b5642f3593994b7bfe2b303a123d66978187e65204d6d6fb4"): true, - common.HexToHash("0x2eb84df8785d9e4bbbcbcaa6d00b27c26db62deedab810266cd11e42335434ab"): true, - common.HexToHash("0xb567458650717fa8be85e0b575286eeabd7ccbdaf69dd69f209a20f86ac0f8b5"): true, - common.HexToHash("0xd899caf22de6d91be5c90a4db4b5ff44f3453f7be8cef756be16163f0dfbdfc1"): true, - common.HexToHash("0xae306bb2ccba36193fe045a532268e755603bf2d85644fc1293dfdbc305dd4e8"): true, - common.HexToHash("0xab56efc67822c1daa6f964e4e1bdb99b047e7e5e3e1b92402a55e67b296d84a0"): true, - common.HexToHash("0xd4bb4a663c1c6a570c699f6ce6facd213cc9a36a5fb90bcdca9dff01ea1e20a8"): true, - common.HexToHash("0x3529a8e39addc2e2551b571e097db794194adb12a151f60015bdcf612724b7c2"): true, - common.HexToHash("0x18606ef06f0c738f42fd8ab6f3e4193f32dc3d829ab242256041ebead94a8dfc"): true, - common.HexToHash("0x236352a66c6d5018dc7ee851399fdaf3e5648f09969baf87821d854818035972"): true, - common.HexToHash("0x2d4e0bc45fa94ce542b481e055c90242f5a99db14b97e054fcbb9f05181ea913"): true, - common.HexToHash("0xc9991da4789834a56bd0683c5bb983ab4b5912614934c2e5fc8f68cc1feeddea"): true, - common.HexToHash("0xbbe1b54c3636c277ddbe0caa4db5f4ff94e63e78af77503208d586d8b1471b7d"): true, - common.HexToHash("0xde2770e7eeb0e555b5ac17c96a721c317d6dd3c1bb7366bc142dfc11d6df3179"): true, - common.HexToHash("0x468afd1d322e29e46a2b81674e1fee37d32fea34821d9589de650a80942c7a4f"): true, - common.HexToHash("0xb22e48ede2d5bc78282694609799aa9c83676af9f4c74ce3579a24b935d5e278"): true, - common.HexToHash("0x83633fb4ca93551608aa516869c58deb06cd4f7c1e675d4bf85ae1d86aeae4da"): true, - common.HexToHash("0xf0bf1c796b89e05e645261e88b46708671a0950b3402a07f7db6f0333cc631a6"): true, - common.HexToHash("0x3a9984c0d7165702dcb71643b17496cdd087bd723066908060dc2005bca56536"): true, - common.HexToHash("0x5d8778b31afb8167d2b18e87fff327e521cf4e2e8681880a9f361c6aab2538b6"): true, - common.HexToHash("0x5153f26a5c252c01ab4a5b60ba8e674269178e0f98d2fcef3250ef5786e93fc8"): true, - common.HexToHash("0x2dc50729cc67f9ce83e77ddd5cfb5255191b2d217c293ce9ab13b9242f22be59"): true, - common.HexToHash("0xe1002c59e400bdd92c1958a1742a15a9ec7fe1790089f397294cfe5c54804a06"): true, - common.HexToHash("0xabf54dd1dc55c3441ec06045fed070f69722f5efb8dc5d9eae2dd54c7fe01a05"): true, - common.HexToHash("0xa69a91c6b6010a21660cd18ccfa047ea68d770ec976bc7ceffd27496869d3bcd"): true, - common.HexToHash("0x5531cf349270aed0c7dbc002176ee62b24176f0f6020226430012c7d2106f535"): true, - common.HexToHash("0xc80cb6e3adc96e330a82197da622bac609f089e3226e290ac39fbde5527645e7"): true, - common.HexToHash("0xcb8ded37b5030d9a20f3c345da2b70a49db8dbf5093b4c1b13a0d01f4c5cbcbb"): true, - common.HexToHash("0xcfd5dae484cf9a1fe1165acb5ac0e5b1ee9c3ca77d27f53782e704ac2b24987d"): true, - common.HexToHash("0x52a19fe047e32d55bc09eea25546d23fe65a6ac628d07e6afff3ce38fe0b4980"): true, - common.HexToHash("0x1fbd7f610d8a99f66a096a25a2ebf009d6073959839e35a7c8da895e5376a083"): true, - common.HexToHash("0x61ffc433769ef9d38cf870f94d2eaf26591818085581be8e2f1b95566c540e9d"): true, - common.HexToHash("0x10a97511f33dd140424957348852fa5c4e7738e1b2c971ef7394e246794ce3a3"): true, - common.HexToHash("0xd3e38dba8e931cc5e0ed8373fd651fc6302c9d394545aa20e33dca4bfa7d3034"): true, - common.HexToHash("0x7c51f687a1096541719625f245866bb604b72ac3b0a764bc4a7562e6f107a57a"): true, - common.HexToHash("0x09305eac19e3b8faa32be8c517aa7cc53ee2cc61e0965c928ed75c6bfe3c4c57"): true, - common.HexToHash("0x0b6579a4e240e27fba2eba812bca06eda9cae054916b7a7032ba7ac5eaaa1a46"): true, - common.HexToHash("0xa1c1f378205377d38a2b7822e1315be1b90a12be1e783c36f7333e056a687777"): true, - common.HexToHash("0x805d858207bd53ac553f298f6ce43ad644bbdd7832bb6048f2a0562edacf6286"): true, - common.HexToHash("0x56317264c17d89371ed3539025988581f04dc30526c71a82898f817761dd7740"): true, - common.HexToHash("0x17f16300d278b2b3538b4ef236c80994e260f9544db13d8dc2799ffea380e2d9"): true, - common.HexToHash("0xb70d07cd849b2cefebd1a2272fd6c7f4d469ac16ee5d2d85d2fc08e5fab35592"): true, - common.HexToHash("0x1954f504d39f1ac9bd55678c3f7561d53f98c9d49d68d0f29a2ef4922e182c26"): true, - common.HexToHash("0xbe7f06f81ef18ce65df86fc054e6e2af90ea587865b403ac0fc95bef5a034540"): true, - common.HexToHash("0x3ea604416f7f73280501e7600417883912037e576828f2b7b05a8e323d7470e6"): true, - common.HexToHash("0x512bd4e807631a60474189f11d955b63566dd82f89df00baaecad9fedae759f3"): true, - common.HexToHash("0x99570b4e073e5afd513220a84ca75fe8b01b572c482eecef7971828acd632906"): true, - common.HexToHash("0x86dc242e7470036eac6934b6c95e89cd64cb168b7e85497a84999b6b976648f2"): true, - common.HexToHash("0x42f5fd3317ae1345a91b8b83df395a81e93ec1a1c7d409562eedbd3e73b0de7b"): true, - common.HexToHash("0xc053fd15391805afcd7a512de781f2a435e94c939ac2ef4fb71ca71b874663b9"): true, - common.HexToHash("0x8c5fe540323ebfc71c094d50116d6d56cbfdce135369871acf22f5c5d9b8f17c"): true, - common.HexToHash("0x7603f5291f9257a77322338dc06cc350c24d2d8f8633116e8442385981c20d16"): true, - common.HexToHash("0x07b7b1b51fb7b2435f9787a7525c3daf7187ce8dc8ffe6b047e2d09669e7a5c1"): true, - common.HexToHash("0x103a0f5da2bd39e6de9854f1798d79c7a98b6622144faa0d3de6615fd168610a"): true, - common.HexToHash("0xdeaadcab6c46822942454d4b1d4b3835dcb5cd01ef68d864b9d67f8e8c5d3d46"): true, - common.HexToHash("0x714b30678c0e3187504d7f473f76ad17741c4c94f4ef001d096b89655eb335c1"): true, - common.HexToHash("0xd7eb07eb1fa022c5461f2288a416276ab977dd532e0fbfb0d816daa7e4cb5344"): true, - common.HexToHash("0xe6f860774eda6b5d855f6f889ed0d6dd8be83ae80e10fcc986d19d4897f4ec86"): true, - common.HexToHash("0xbda93d998bfe6c68d2d29d1c9529ee6e82bcd446ec47661e5ccb74b16a507be0"): true, - common.HexToHash("0xde272a22e3f06c118a188d868d1613e56d5447b7c2505c709069d1c9ae4cd149"): true, - common.HexToHash("0x9e70ff2bf867d19330b06b73e094a76ab0be43f16bc3c7d3f67f8bf747aa80b2"): true, - common.HexToHash("0x9291fb545b6833ca2e5014e267ffcbec61b67503449300ed5705e8aeb16f9cfd"): true, - common.HexToHash("0x6e2b66f46ae200fdfa84e9794e0231386834d91ad3cba7a5e53143aa62dca9b4"): true, - common.HexToHash("0x05d0871f6c9642ed3be45a44521c9a1337d37260ef5f55eba060d55ce0445077"): true, - common.HexToHash("0x567821dafc9e69d9c4e86292d027c1c3f7bc5d2cd5c53b50858053f2a37bc468"): true, - common.HexToHash("0xdf58ece6edb2e15fd89f3f8b1781ecd3ce89e24d9cb8bc0b014d0155a8455bb8"): true, - common.HexToHash("0xe70372d5b9fbda59f948b65b8bbd27191edd3d11b9b39086d141ac143dedd0d8"): true, - common.HexToHash("0xf8420abe629f2b49590fb1f6e47da2948fd5eae94bfd64ca9ae37c703772230f"): true, - common.HexToHash("0xd62bece2bad21359ff7f3401f23effa85887941d04f746e2b08d920c75e2fe4b"): true, - common.HexToHash("0xea35bea6266f04b9d81dae60c4d7aae44f058469d2ce35670e107799c1e86fca"): true, - common.HexToHash("0x167314f5aae1116dd178256a7717d2fa07b118fbef5319dc57489785f54f609f"): true, - common.HexToHash("0xc96d1f43bcc61ecf1a7b42c58839d82247c470f04c4cbebd86d0fdbcec38daca"): true, - common.HexToHash("0xb1ade113724c958c2916d5961d34eb7586a1b8aa67cbb7394b116ccde1486427"): true, - common.HexToHash("0x54d365d861417d22dfcab20dcd641d510eeb3f58da2ab7b1088eeb98f1001b0f"): true, - common.HexToHash("0x90aa2a807657308c7641d5b5eecb21530e86c63e5d12ba33fdc3ab469148a91c"): true, - common.HexToHash("0xae21f428305d93c3e9f6e78d713f7e89cfd37685c73959ee7261fc4284718cc0"): true, - common.HexToHash("0xcca0f480c26cd18b0ba97364dae78fc76c2a0a5e4879836e3a112df89f626c4b"): true, - common.HexToHash("0x46eaa11dc8531e7a5a0e56035207ec7e35029f1f2ebc567c1bdba404be117501"): true, - common.HexToHash("0xc95f9e6376afc88021a6a657d70af066e1ea3ed58f869aeb33265ae333655e84"): true, - common.HexToHash("0x87880eb35fd2b711fcd9338e1c189efbbaafbc1998bd004771add452b0c42269"): true, - common.HexToHash("0x5195f0687cc638aef74f555da1fed9b2da6e6d3d3e5ab6e765dfd93470994886"): true, - common.HexToHash("0x80811e3efb6b32739d1400180539fbfaf8c2437267472a460644b10c08c39bfe"): true, - common.HexToHash("0x94a7d08b7fd180efa21a70445dc5313ce83c185c3359260313046696e683d0b0"): true, - common.HexToHash("0x832d0274aa6d5a922a9c37b35aea6d64df330a9d0fd46fb80c21e003c8a81c1f"): true, - common.HexToHash("0x9f5310806f65b032bdd6695bf98f46f04b19fd5715f52037b112ac0967f57dca"): true, - common.HexToHash("0xf45c8e4b2716605b3806f7da6356057c13ce02f87491cde85cc2c43a45925527"): true, - common.HexToHash("0x80e68ca5abd3c1d40d3a0d5b3a711ac4266cc45aee85131efacff8535a1efcd1"): true, - common.HexToHash("0xe07d5165267093c0962004fca4717d7115c3c2ce55598286a1f4e7b95fd4f10c"): true, - common.HexToHash("0x63116b0096c21a780cad2d015838bf1fafdf95b87de51ff032694343abc7f17f"): true, - common.HexToHash("0xf01b207c3b3bf5e858a1fba79f5f630671a647846368640c374caf962921195a"): true, - common.HexToHash("0xfbdf87ef499ca933fe80ba507f18668410d3c72617bded8bab30243c2b5c9fda"): true, - common.HexToHash("0x01c4cc8f116b6fd891f021d45c358c8b2486627b4c473e71d1a5eba12eaa0d21"): true, - common.HexToHash("0xd1888dcfb6abf68f1299a62b6fcd6bda86b3281a49de41ff95ac0230913bfe69"): true, - common.HexToHash("0x1da3aa97fa3569d4772039ca5a3e440451fb7812f26eb17e258029d25f80faf7"): true, - common.HexToHash("0xcec416324fc085227dc8f42f69442a9821cfd1ea8f7846846ae4af282c5d1859"): true, - common.HexToHash("0xf2c554bd5b67accf815c540c37ba77af879f8e35965460b9491b6a456ee73b3c"): true, - common.HexToHash("0x970d7e94de908476f440d9412ea2a7c63ae3511e198f571ad909c32b90dcfab4"): true, - common.HexToHash("0x2ed09cffe2ac10504638b93a4562df28cff7bb3bb1b6b2ebe3220d917b661450"): true, - common.HexToHash("0x20672c8419ac6d6e6dd8cda33a20cf5354a3e617327f0ac73955fa8c191fc4bc"): true, - common.HexToHash("0xb9ffa0040150ef04a0e8222d3efcf0e35a2582a490ec5d68cdb3ed13db02da35"): true, - common.HexToHash("0x134b070897703f34489322c2e68b2c0e850eb002d80eecf7688c1f502b819751"): true, - common.HexToHash("0x95abd0240a404e85a5f0b26dd666762f319c5acf01591eef9adfe279b789b82d"): true, - common.HexToHash("0x1de24f6e21d71baa230d055613791ba9f755abe2b30fc95a93f58b2c2037118a"): true, - common.HexToHash("0x2b02e97c61bd87ac0341152cbe44d5e89214184c9d89eb3c895406afe7ec8c9d"): true, - common.HexToHash("0x7cb8db721ac7845d1cfa84fa86266cb817ffe52c0d45877c02271448dc33c817"): true, - common.HexToHash("0x2ce60436d4c2ad4cbd88a1253fcdd3284028198eac2e9587323d044486d536aa"): true, - common.HexToHash("0x883d1149357d3c1c992bf544ff8f6f8240e2470593eea486c3eb5297356f7195"): true, - common.HexToHash("0x29991826ccc1d78af5dacc2e515d15a7ab59a1c6e5bed9147197d2578271a3e6"): true, - common.HexToHash("0xb24f4709a82496e0a0bd478c01fbae7e585e66bbbb01969984b3af24fc07d2fe"): true, - common.HexToHash("0x7ada67b8494305f2be7200840db9f8539cf26668b7cb0375f81ab102864429d3"): true, - common.HexToHash("0xa018aaf2c1e7ec59bed8a12c9a7a8ff496be8abce1194ff8ee798945439d87e6"): true, - common.HexToHash("0xc7975a137c230c442209561623521764deef68e25ed745c0b785935b1342ed4b"): true, - common.HexToHash("0xd308303aa6f0930d3f67bb1097f5fd140af99ae76d19b01716b24c82ae7feac6"): true, - common.HexToHash("0x4a00b5a7083869853ee7285d6548fefd8f5f67d7630b223b847e2f626fc36d69"): true, - common.HexToHash("0x79ab7d16e5fd01cd6ed8cf9d6cf483f915bca95c9957e695cee33fa3b45f95b1"): true, - common.HexToHash("0x6eac2acc64916951432efd14ec9899af27d84ae4a120cb0e22524389f6e42693"): true, - common.HexToHash("0x672ddf6ce0528b0391b9a2331f105efb3b2982b300485c42a4d4cebb6114578c"): true, - common.HexToHash("0x4089e72d9259834c9e599de96f06a25baa43cbb462c1d46df94129b15989d28a"): true, - common.HexToHash("0x116cc32c2e0ad7ad0814f4ad8045593ce75a6a078e12002cdb9242db6b1ee753"): true, - common.HexToHash("0xed4a3261f7c5424c767e8e943961fb8642406c1798af0a13e09e58ca99457f1c"): true, - common.HexToHash("0xcc775e19455999c2d4019aaafb0ddb740e2c1dfcd62338854f7afab579cdac15"): true, - common.HexToHash("0xe51d09addb63e2a0e88aba12924fc2ee0ceee2b63ed21f2d47821ca2b6ee4d48"): true, - common.HexToHash("0x923d0870252f5921c1c8477c1d62bdf5cc1d27c14df2d2b36c5a621f10f8b8b9"): true, - common.HexToHash("0xdab8ca96b4decbb735d1eb07100cda7051c72ad1e2203be3a3d00451ba58de32"): true, - common.HexToHash("0x54e441bc16e7a82c92a64e2e11f914107bbfb8e22ecbe2e29c80ede3eb599936"): true, - common.HexToHash("0x684071776c0b47f6b81e3ec1eebcdef8fb6fe03d25acf8b035b3411e6e68bbbc"): true, - common.HexToHash("0x427e906eea6e111640ea110cef6a07155c3fb851a390dea4199bc0a068f0c989"): true, - common.HexToHash("0x4851c5fd76748a84af602043b14485922f229f423e41e4829f4455f3f90d8b2a"): true, - common.HexToHash("0xa0ce3f07335fdb070318d16aef492356c290c717306a5787e9f086079ce131b8"): true, - common.HexToHash("0x5dd3a30c547a4036add1085da7e284894214e2f5d3e5ad33dfe7c87a5fb8a9e2"): true, - common.HexToHash("0xfee8b92bbf30bd93299fe208cefd4f635a945a56f0e24c26088d2898138feb36"): true, - common.HexToHash("0x44a23b5e2b0847d7031db2b6f5427a2c40efc91d33132256dee2db11786efa27"): true, - common.HexToHash("0xce23d630dc554e4b9f02eae3db6674ab895b0cdf36cee3e8e46191cf2bcad080"): true, - common.HexToHash("0xe6f59e3f4a3b264c905e4812127770432a8f6f1b1b442b678404363527266aa6"): true, - common.HexToHash("0xd74a7d7c702eb97b1e10a15f97a19e6e5d0eebf223ecb383aceb504055349237"): true, - common.HexToHash("0xb6ec5d91c7836b88d0652d9da13690f80fe343148a22ff3ec118e2c6d9e7d474"): true, - common.HexToHash("0xd1f51e4b144e82579d2e1c96fe2601c21a311faf81db2aae4c878ff7eb3fbbe4"): true, - common.HexToHash("0x5c37d24e991a97c16496103ce0266b2012b9d56767a3246364ffbffa90300435"): true, - common.HexToHash("0xc31df009f313e0fe879c163fcc4d9e7f26428e83399da10ab87b7b28aaff1124"): true, - common.HexToHash("0x56ae1a7135661ca41ac83c37b9222541c197f27d06feda56614d4473bbaf79b3"): true, - common.HexToHash("0x6c20d39c5c3297b9b68fb1c25f467c87711f944d5728c64d7231cdbd3d5b0de0"): true, - common.HexToHash("0xc96c0bff2155a010d2767685cb1647963f2913124d173408b54cfe0fe0f4e31e"): true, - common.HexToHash("0x1e54013a80476ff06e0871e04149d7daa31b41cb80a6436dba99d3e13b84f773"): true, - common.HexToHash("0x8b0d5baff90cc8f4c641c5548ba25ab32e6648e21f5875ac9c732ea5d22f9a18"): true, - common.HexToHash("0x0f31ec0347d6f0e569906330d14f00db2abfd66b9417e0d09658f9578d674bfc"): true, - common.HexToHash("0x1639cc3bb9b996cc922ab8ac3ddd1413ed386d3fafe03e2a0e6077a171d319cf"): true, - common.HexToHash("0x846fe0f25325655fbefbc6c4ae645ae61bad013b7e323be6102ad3bcd81f6f69"): true, - common.HexToHash("0x44dcfbf20e872a0290e2ae7f7801850d81506c41578b40af3129de604ec81017"): true, - common.HexToHash("0xb6a9dc3cf2f4ee991bcc2a424adea81b43e32e72621ce1481975b1a9d515e89f"): true, - common.HexToHash("0xb94aac07289ac8db40593f9949d0b3c1621cade7c3da815177c4c926bbe89b3b"): true, - common.HexToHash("0x69556e2cc7eb22b1acd33c65bfcbfaecd45312f481b848da46d21a14f8e5963c"): true, - common.HexToHash("0x3f1cb83b34006442a7c004e8e8c882c77baa84073130bdc0ca3a1361d614778f"): true, - common.HexToHash("0xd37e4f5409d0d6ac7c399b8bccee7f84fd650aa5a7c29c8244fd7adea7d9d8e5"): true, - common.HexToHash("0xdea32bc8241f06a8373e400351dbdb6ef88ccde4ca0ddaef3e5e40bcb6af27c5"): true, - common.HexToHash("0xf006bc2e2537e2c37085e3a73b4074db3bb2db4a09a95fc50941978f1dc877b3"): true, - common.HexToHash("0x2088242effe64601105fac96b16b90dfca55b4228d8574a1dfd39d5e130c0f60"): true, - common.HexToHash("0xdf5685ca88a0fafc127e25d74c7a94e9e7146b00a0de0679af75f1f44305dcbc"): true, - common.HexToHash("0x66acefe8fff7fc804848be484d99d5b153285ccbaae09642b07a4bd8d693f14d"): true, - common.HexToHash("0x7947fab11099057407f91d60d393b220d49512ffda05c522b0687c053db7ac25"): true, - common.HexToHash("0x3bbb4591268f04b8c95271a6e59ee63e4aca9530f4e80d5c94108d31a91d2251"): true, - common.HexToHash("0x6bc426d9f3c6c3c6b76f2cc1c55957be9eb982a8afc31a2456d8b0e2164b33ff"): true, - common.HexToHash("0x32dfb9329bfd0723498368433a10550359bf6f5c7b0497d9a8641154d245d28d"): true, - common.HexToHash("0xc2cc6dfa5bedfa02d389c32105da0d8d41863884dbc431196954a64bc5e0ab78"): true, - common.HexToHash("0x525b49bae9ff79597199b91afd255f4cd1347c74b44815e9a919c2b8525e52b2"): true, - common.HexToHash("0x13f363ee5c0e504b429e006fc8ee7abbb5cbf57cfe1c5230c7a5f4506ce30dbe"): true, - common.HexToHash("0xc62b913b130c1d0aa94b75c022ae253f381d47e2ea228fd86cb32c92c24f9f50"): true, - common.HexToHash("0xc12becac6845fcf048d0824a3ca37c78029809d5b6cd047689cb61ede95137e2"): true, - common.HexToHash("0xbc3a81b1045705471c1007df4291a4b34d58668477ca2e082d1304c40a46601f"): true, - common.HexToHash("0xa09c7cc36fb418821674eaface2a82b66d73c180faf8799f39f6f394dc4b8e7c"): true, - common.HexToHash("0xf438fa473d9ec4f62aa9234182f2803ed5b8d8c1564cac2730d7ba921033237b"): true, - common.HexToHash("0x1244a1926c98600a9a36912422f0e6e4e14fbabd549255ac7e3e9fab7394a9fe"): true, - common.HexToHash("0x42db51a28981610206b3fd2b4281abacf10f6990ce16e4d3555ffe5285a9d8b8"): true, - common.HexToHash("0xb30d0ce4cfcd704533d0098d2c6a446418469792c506f35e50aedf62d2adc3ab"): true, - common.HexToHash("0x03a72c320cebb392c6d3f979bd8b0f5ac6cbc9d051ddeb0f69f0b993f4bd7bad"): true, - common.HexToHash("0xbc22d350abf25349741c944f5bce3bafe251385e67087863e447ff56abdd3c3f"): true, - common.HexToHash("0x17d7ae643e912930e2de09dc45280e0035cb9c89b369da56891da3f4a1c94883"): true, - common.HexToHash("0x0def6b029629b785bfd7c3be4cc472ad95e23fddb71191023915ae83ae488351"): true, - common.HexToHash("0x4f46e97e7e1ca210643808280d776883557bff5fffdd7e60707e9160165d5e0f"): true, - common.HexToHash("0xf210b314e441c6d8f5a7c24bbea9a8cb8016af32b4f47812256ff9213fd80e06"): true, - common.HexToHash("0x53b9534b87138b3bd54341d3c31dc359271db482cc1418b35e1132b70dcb2cdd"): true, - common.HexToHash("0x3f39fc6197ac3f30d4540b6d9dfb85dd28fb1de54a3e00e5b965589297dddfa0"): true, - common.HexToHash("0x95dfcba7e67824a413520200da3dbcbb948ac0ad09907699a146877f6326faf5"): true, - common.HexToHash("0x8b29bc3136e138f91246e79bf3d049153849fdd021d374aa7778751f2f215406"): true, - common.HexToHash("0xcbffef93fb9bd13e7b682cb5be03d6f269155c8c44a1a1a5e3520986ce5868f5"): true, - common.HexToHash("0x32ad07e373cb97844d5d825e38636e7c29e0264a367d2eed65b530a1efc2f415"): true, - common.HexToHash("0x973a10b52913f3c62109a39340b4db4a141a582d6714a08d674f066238ee967a"): true, - common.HexToHash("0x9882790b03f49279d31e847e108f20477c807e4ed4f0e376f646aa2510d2999e"): true, - common.HexToHash("0x3b64b24d26d0a92e3b1f3a7bbd259984438a383aa9e77ae1dae635bf30705938"): true, - common.HexToHash("0xa2b73b02e713eefd44d9e2079b5c6584bd5d7414be40c5bcef454fb691c04939"): true, - common.HexToHash("0x3c9568691188721fd07ca4c6c37f2b67a1cfd753edf26bd8374154409957ed03"): true, - common.HexToHash("0x2e6d5f944b310f49e35580689d6df4703334ede0052f4f2b493dda2dd8220654"): true, - common.HexToHash("0x209cad37f8f54df01311daec5d3d86231c2568f8e4f2c666f00e033e6e8845e2"): true, - common.HexToHash("0x014a72e73c05a6ee0e22b6b52d1e0de9004c7c642faa4d596af14cb4b23884d6"): true, - common.HexToHash("0xb431bb9ea28ea143b5493da72baad1e6da7e2f6b713b7bede856e1737b352384"): true, - common.HexToHash("0x666a5b2963a21ff1cc73e0903c097f8cb895fd6a912eef89597ef147320607cf"): true, - common.HexToHash("0x1e6d2137b2c816993343e5e5a7ce0423cc11d6452fd85933a2662376a66790b4"): true, - common.HexToHash("0xa93a7713e0efd98544ae2a8fbd3322277f9ba282e1be2a3680deb18f6329a742"): true, - common.HexToHash("0x4309a4b949343dab725d71c201130cc16f52c825cf9181407d64e9c5612b9048"): true, - common.HexToHash("0xc69d6b0e9d5509b4f3dfa4921caf7456a1a9e9e35ce47f82cd4aa41f47d19531"): true, - common.HexToHash("0x265984c1ec353b013c9d9b73e3bd1f6cf725a3e0d63e258947143d408fb3c7f0"): true, - common.HexToHash("0x07dd24042c9d522fcef47ba5ea99d93360d02eb91a3fb516eb20fe3d003bfa56"): true, - common.HexToHash("0xe4eac1fc3874b4b45429e2ea2be35102a18c6327c6feae83ca6868630e021022"): true, - common.HexToHash("0x4a326cefae1df7e9a79ee2827b59388324113bbbb86b77f30c91cc8b2359e745"): true, - common.HexToHash("0xb0f05ceb482eaf5a67431bdd1e6b3cb8a04dffd773229309ba2dbd73ad5c6746"): true, - common.HexToHash("0x1199a00d58131e940968bb1aba4a11475d045f6403d101b6d6f5baff471c3a5f"): true, - common.HexToHash("0xbb46c5ab59858971dbe0e7e06f79756336bae90afbe076d18615a91e9826a742"): true, - common.HexToHash("0x0320efb787e3680fc8f007e32d0b582ecc1c0bfd73bfc8aef47b8c75d8b8276f"): true, - common.HexToHash("0x298eda0cc6580e85c61b15736925607c96a621cc772c91f742d86552f1dde776"): true, - common.HexToHash("0x39bce8eb56ec09c7859e5176b436de537ff8736c632ab0836586aa9da4e39d94"): true, - common.HexToHash("0x92fec70924fe504c82693790769737c1a73c40c873a078050c040f8bf6217ad2"): true, - common.HexToHash("0xe2416a9ac7db59459e73dff20b3ce313475070812d4a9d50451a20436a66073d"): true, - common.HexToHash("0xde8c215b6cf4aa474937d4456bfb1bdf1db18d7976a4cdf994759425ad519cba"): true, - common.HexToHash("0x847b5e4719a36aa1a859dd9946f320106d772d5b955cd9ad536d65280413d80f"): true, - common.HexToHash("0x35752f8e4a2e2c6ca0cec9f33e36b5025f259b0fc0fd43fc92ea877e56dd4205"): true, - common.HexToHash("0x680db918cc1a3612646846d0745fe6bc9fe145e07a574660cfc6fd1df3974ac8"): true, - common.HexToHash("0x6057faf4320bb7a8685a492dc0f7e4344c55cecc1284d6a7e7bc92a3f1c96f53"): true, - common.HexToHash("0x88aa956518df43ccd69a90533a3bb631d014bc69ec6c9a47c9d295f5fa1549ee"): true, - common.HexToHash("0x9f262ae6c2e8996c960c8c4f781873b268a2a57cb4f2d81434f884039274dc99"): true, - common.HexToHash("0xdd6cf02c52bc25caaf57d3d31a83b4dbe5656078474eec949bcd8e1a51def041"): true, - common.HexToHash("0x37066e8f2ea0637e473d39907410e8f7ae25a844202ab4ef4da1debc3647f002"): true, - common.HexToHash("0xe07901c8ada6adb503a77a33e327a70e994ffaa91fa3ebb75b35586d0504acd0"): true, - common.HexToHash("0x0dcef4b8e64d7cf47e3606d5fe0bf473d603891f82f256db6e283e51e53677d9"): true, - common.HexToHash("0x6f61caad9ecd2cba2a75aa5e56f9bd36c5e282ef6e34f6fea366c1692f6ee07a"): true, - common.HexToHash("0xdda67656bec695dfa558339daa1a1841541abe6b256857c24ba5875e242082b9"): true, - common.HexToHash("0x755275b78a2b43f1f8f721a7091e761b88047946e8f77f70066fc85a0cab9e85"): true, - common.HexToHash("0xe7da87d3a387e6053b2c08b2cbef29ff4eee2abda7af23c898336bf362f6a471"): true, - common.HexToHash("0xc07ae78c0f8c232a0eb3525186f6302c960725a3a79f10c126f6965e82ad866c"): true, - common.HexToHash("0x45164e9423a735eaeeb317a87e0a440bda2d6e03e8ee34860ebabceedb904d55"): true, - common.HexToHash("0x24c84aaa66a5681f996d8225a1b7832dd9fd02544bb4541cf023d1d5b4abdddb"): true, - common.HexToHash("0xa92f1fcb9503b745484b46f8fa29aa23407cbdee138e14dd60886b166a2a9e96"): true, - common.HexToHash("0x0ee6e934654f0fe8a39d66dd0c0dd36b6927f58d58d31e84d446b9c90e94a5d9"): true, - common.HexToHash("0xe4654835ff9055e842d235d96a1b56de31ed901afe6928e84748cca4c0f2d274"): true, - common.HexToHash("0xd111d3d2e68b96a1e34f767bff47c81d54b3a559bb650f58d82150d40c1e6f99"): true, - common.HexToHash("0x9a499492b7dd4f556f2677415f2c0b737437bcaaa09219be91d97fb961895cd7"): true, - common.HexToHash("0x8f86457d64313ba74ec9e7bcf63739d93359f8ba4eb395d83086d38a1787ed46"): true, - common.HexToHash("0x699745a107bc6a9432d8ae3f4442219008344c611d9e06062d4201e043094e5c"): true, - common.HexToHash("0xff4a1bb18a9717b3cc6014e4d0071793d2c0a84d634da17036cec08780c559f9"): true, - common.HexToHash("0xb6dd08d7c7e1ef34fffd705c637a9fbbb0774b2d18435a4c32915893a484f4b3"): true, - common.HexToHash("0xd5d0a27a757df57e91c97213e21101c43f1d7c1e95960c6fcd25241454720664"): true, - common.HexToHash("0xc44f6e248be89d3380f820c9f3dfddd02c76a145e69cd20d127e9d2367669163"): true, - common.HexToHash("0xb2b811fd7579f7d4f89e7ef622efac3234bea23d4ca69526c7db21fddff0e867"): true, - common.HexToHash("0x051cb3d15fbda4d2e4c724a66cf48788b192f97ae90cc5291a1d34f90d5591dc"): true, - common.HexToHash("0x28afee82cfc260c5ab4ef2b450c61fb2d57eacd01451f61dfde6582a8ccc5e5e"): true, - common.HexToHash("0xdd60883edbf6e0e73ef84dbf273cd9a88403f0a44362977a72e8cce88b0840f8"): true, - common.HexToHash("0xe10047463d3bdb9da4585338cc7ce06a970f8d4cd84884f0a8545fd84c2ae598"): true, - common.HexToHash("0x5cc8fbd5600deedb2f08f9d5ad6ae40b1a1751f3ab1c58d2e18faaf7c82139dc"): true, - common.HexToHash("0x9e71f0fd097afaa4210a82ee7980c993f906050a0b85eba93f8a4d6530894b97"): true, - common.HexToHash("0x9434604b45cd588153949b3df50832b1092a4f5e4b7a5d57af8b1b616cc6550d"): true, - common.HexToHash("0xcfd5c37f6b05227d11afb620439564f3c4c8b01db7387006c49a1289e8509953"): true, - common.HexToHash("0x149a887d9646bea218af8e17dc5c09086207b9b4208b189ae74b669f8d05df5d"): true, - common.HexToHash("0x484c55f303cd4f3fa06ca8897d81fae41bfb992412533414c7a107b16bd7e51e"): true, - common.HexToHash("0xf74e38505bc93b43c81be1766d8ac183ca6ecff7b6a7d68119e70817811c0d76"): true, - common.HexToHash("0x4c013c6fccea1b9894bd7d3160a704411d1c18006b6625d7d9cd093de68f3fe7"): true, - common.HexToHash("0x581203f055797a41161435c28edf5acf42615e95f6c2cce8ccaa2f2eda108488"): true, - common.HexToHash("0xc94ca904267ed84d0975ee5409f724ccf2e927976dfd82902760594dc1e0ce26"): true, - common.HexToHash("0x10866420f7b62ab8a5ff083b559ee5427838c64fd4d320c0ec5f8621fe1ddc58"): true, - common.HexToHash("0x263abf8b830964349467b9ada8ec9650c4170d6ad12dd75a33206738226bc9eb"): true, - common.HexToHash("0xa3a5a003fa0b7d73b0ca4beb27315714b9a15edcdeeca6eb99ca63746686a6a4"): true, - common.HexToHash("0x030bf5622001f53dd1f826eaee8c43a9a952c00d8d5bcaeab2d09df5c129d94a"): true, - common.HexToHash("0x7c8448100c2c8fde15a0eea0fb11a04d997a696b03b916dba92663e17ce7aa27"): true, - common.HexToHash("0x79a89c7417298879c18ba78b5fcbf424455f29d99153e9e996c37b09e7233ed9"): true, - common.HexToHash("0x437383fc89c04f96f1de85f838f0a34c3495a4bbbcfd95c3a2e10ceaca3f752a"): true, - common.HexToHash("0xee19470012b7890abc519d7b9b9351557388abbcd0a132d50d8f7774b30076ce"): true, - common.HexToHash("0xaf8dcec896e9c7d32f7892e9f26fb7c8f26dcb95c4c0007fcc7837f8f39660c3"): true, - common.HexToHash("0x7c53977b78f33d78e7d0317fbe42219b1d43d58237547bc55701a8d508a536e9"): true, - common.HexToHash("0xbe44f66ceea068c96f30bca5b17ac0dbd3811aed294c164568d582884ae187cf"): true, - common.HexToHash("0x736edd758b635e77b5d8a358a30695565dd80e547b6bef270f4717fb5d67c8af"): true, - common.HexToHash("0x0bff7c182c3df7921a64eeb032c9b90be80fb0c1ccfe4a8850741ce1e6e532de"): true, - common.HexToHash("0xcd8f74f70db25ee865f6d0714713de3e16be0300ad3208b01d5ae872ef3202aa"): true, - common.HexToHash("0x793fbaa19822ee0b21b0aa73f4f1fb3a1077928da401745b627f4b6ed1df646c"): true, - common.HexToHash("0xddd5325c2b5050d239eb660048b6937b19951019703246f3c84b4655ec34a21c"): true, - common.HexToHash("0xf7faad54740015d74b8dca5a357d411f75c5e3061fe90e547239f2de13037edf"): true, - common.HexToHash("0x038f2375cd971018422131f74061a776820bb00f1472ddd76301d345c407c19c"): true, - common.HexToHash("0x1a438e3fa593cb105a98d831a968ad072ab7a68f3117dbbadc6f0f2fd230a097"): true, - common.HexToHash("0xab847d0de5d866c3946b4b0340c64bcebbc1cb96528fd89a9b713b4a9e07eefb"): true, - common.HexToHash("0xe980aff25ef53a9447e7e9cded1932d74996b1c194f3756266d83ec11fa4b8df"): true, - common.HexToHash("0x0836ab2da7f2fdd79cacb744922023ec7b3d2c7c6d1b1be0562d8a2d651be53d"): true, - common.HexToHash("0xf3591d1e6cf16a8121a86b3f30f81f452fb5d0790c3f3b197abf6d8bb754bb89"): true, - common.HexToHash("0xa52a3f7d4a8107616f93e1eca2fd2fae069e54866fa3d78eb9c5db21deef1faa"): true, - common.HexToHash("0xf8ea402d8625894db2fd3980b1989ba3be01794f713e0a95eedf005c6c25a69a"): true, - common.HexToHash("0xeb132a150172ef420fb043f0b2ea296e276efc897bf83cd36ddac8be6937ece4"): true, - common.HexToHash("0xca6c49093fec53463ef62487733060b5ed68fb7dcf54e5bf1c5737da9ad09ccd"): true, - common.HexToHash("0x566daffd55401002a7d85cb176f28273df661e0b7fe61328ba44cd3fb30e01d8"): true, - common.HexToHash("0xe9bd3553375e4604a8fe3511e09a824ebfed7ecad2d42d59c6134e45f5b83130"): true, - common.HexToHash("0x117fccfdcb98160bd8f5edfef51a155b9d43b6bfda070461dc8b4dec17fe928b"): true, - common.HexToHash("0xfd559ee683496a0e15a26d2f6ad69de902c04c5b88b32448397321a463145f92"): true, - common.HexToHash("0x32b6a76917d0cd13e64a2b74f45df87bec5f0fbba9a83371d3e04093a310931a"): true, - common.HexToHash("0x563ce028233fc8837227ede889e0f0764fc76a7881a9c350e77222c16e741991"): true, - common.HexToHash("0x02cea56b990d5e321484ccf587472725ff8996a149a81bab8c447ceb7cf21d9f"): true, - common.HexToHash("0x3f31f4924744ad77852eee0219d55f0fa7adf4bdd7683a82817c32da4c6e095b"): true, - common.HexToHash("0x9ed6a0f1d88f1b4dfb912befa43ea9d6b7b1713e813b049c238f8821c76f2370"): true, - common.HexToHash("0x3008a40de3b2a323f993414f7226c0e85d1050e9abb78442cf2aaba205b92ab6"): true, - common.HexToHash("0x433092414f0c6cc989e5e2723e6ba039e0bc9b71046adf408e0e6d8f26377853"): true, - common.HexToHash("0x6d9a7c36d41fe290bd4474f1f4d73d36a71f96cf6bae049c7f91c498ff5ea3b7"): true, - common.HexToHash("0xb731b2e80ef95d33a22d28f7a182dbf7f7a470a627b235c2d47938a15f1d7b78"): true, - common.HexToHash("0x02ca3349b81aa63da0dac9f190cb405d67593600c661ae1e8ea6371ae90b6327"): true, - common.HexToHash("0x777afc6688d3ed8e80de00dd1bd03bddb68a29e511aa645ab8728fcba3fbf322"): true, - common.HexToHash("0x45ee04ce585d7ac622adf39e148c997864358a11ea58e027957aa43ed27a3688"): true, - common.HexToHash("0x92404f68c56ec9ffa69a4d4375102d073fe775eb481f686349d6bb96c4c7e390"): true, - common.HexToHash("0xa0b797e50b7250f66b962de1f7f21a21625fb8ba5f8e61b997e28c22ab53ce37"): true, - common.HexToHash("0x13550dcf297a3b29b828738c38cfb1c925924d03f887dff09b1777e860d834a7"): true, - common.HexToHash("0x492d2feefd537abc29c47e8b3bfb3b8184dd6044320e21353e8a57260ad016b7"): true, - common.HexToHash("0x639bca5e52bbd649376eff22b76f50058f1c543fb041637d764d175dbdaa4bae"): true, - common.HexToHash("0x9fe217565287bbb56c7fc223605fa65f6763b32cf861d4e76cf4a2d5545d1649"): true, - common.HexToHash("0x8f27a766b67dd0f12ccb12c15d1c5ee643068b6bd33387bc67a518de7c856f3a"): true, - common.HexToHash("0xe378d15870a4fcd5e8c3c37838c753c1d753888d1c8b87362df83e2bcaa273d0"): true, - common.HexToHash("0x461308079c91e6ab0a567e215dc4c62e3d9b4f97a06a41ac7b410a807f7b4a08"): true, - common.HexToHash("0x96f54eb76117ba7ead3e33cb5ff0751aebc7aeaa251af0e9dcdc38b8e5068a75"): true, - common.HexToHash("0x327aeb2e4024a5831b2fc0e021033e1ee36b6aa80a948272b2b205afbf47982c"): true, - common.HexToHash("0x8b3ad9bdef576b916516c7f7e9477fc72d67b659694118ceff2fc22d5345d427"): true, - common.HexToHash("0xd7b17dc25af0b65a2f638d4ab1e070005b59ed2ee863b70ea29252271486025b"): true, - common.HexToHash("0x56195e570c3aedebe2c88fd99e73ccdee3c1bf2201f5e91de7c8604d7c148691"): true, - common.HexToHash("0x629834705bddfcae699defcfd23e09eac6a90123caf7025a766552771bf6321b"): true, - common.HexToHash("0x566fcf355fbdcd908c25ed630fff68efa686861093c618a22ff125d41f068b22"): true, - common.HexToHash("0x2b1f6097c14aa302a31eee47977bf25d503d5429a4cfc71702ee66041f439a94"): true, - common.HexToHash("0x5a8058423e57b4a1170f0f208ed7ea52c5e396452baaccd564f13581c831389f"): true, - common.HexToHash("0x0083618aa0382e445cd4aac55ff37c42de9c8e08e5c9d1ac18084ee08e869916"): true, - common.HexToHash("0x5389311a4cc61899165eefeee4f16c9b1dbef5bff97e964accf40b34a7fb934f"): true, - common.HexToHash("0xfd87b8fe79b79fd27eb03ada4de3eac0ddf1e645e8e4230d20c31db048cb3604"): true, - common.HexToHash("0x853d26e63ca2d762b38ce33f76558b6d7f425b74f840b33163042bcb7d70db49"): true, - common.HexToHash("0xbe7245b323ed213c9f19c686549fea683afb971011984b2679b49512c5001ece"): true, - common.HexToHash("0x133b9844dd3cba9811d5630f088e92797c9fb800bc978f7d9258f887fcdf1b1c"): true, - common.HexToHash("0x9d6a069f2180238c7c39257b2e50a90805bf6255a7157a90191a6364e2a40e18"): true, - common.HexToHash("0x82af2b9c4c085f3e1984748618669e0d7c43888a4ab9be7150142ce3900d8ed3"): true, - common.HexToHash("0x85da051da407fb417d6b83e67ba45afad408016644e585e89825997975f9b49f"): true, - common.HexToHash("0x01049a6490dcbda4726f7460d46e6b42ac6e54ff73ecd5021310c6167dbb5b67"): true, - common.HexToHash("0x1975803a06a6ec19a81f65f1299ae2ca7f200a92c7539ddef548cbf0b0eb6684"): true, - common.HexToHash("0x335a753bfbff39a61f1ffd114fe546de44b999cb4db96ae44d870a53ff9e32e6"): true, - common.HexToHash("0x5571c656810ba4107987fe16004c13b479816287e1fdfd9cff0e1f2a4cd6f357"): true, - common.HexToHash("0x05f12bffbd02619d106edb36815590207777523050f4905c4ada0198bbf5f636"): true, - common.HexToHash("0x68e88f15d5cf1c1b045b6d2c1dbcbe834262e26ff0472476e53b1f8cf0ad7ea2"): true, - common.HexToHash("0x879c726c1a0f8283895a25099c3eb353e11b1f2771e50dcb9652c95004644a4e"): true, - common.HexToHash("0xfaa7b04ae07fc743fd56f4dacd2d1b0610576b138bbcd291d5523eb3dd87f5e6"): true, - common.HexToHash("0xd1a5fb0ac113c0487d1d293c790df66358a3b028c8d615003ffcc79ce734067a"): true, - common.HexToHash("0xec142b6b076669e971c46dc6c507379b9dcdba022d2d64a72e1c7c43c7439c83"): true, - common.HexToHash("0x0969915f17bcb6db53e9ee21c5c88d85037a0838490c767e8ba219d9be41e6da"): true, - common.HexToHash("0x40d21c37c0813ae2d15d4ccde7cab6603befc8e80ba4b8ad2f44a3bb8e6e2368"): true, - common.HexToHash("0xf1640ae1ff1262e475ad22e5779b76a44306dc3fe753e48059bccb502dbed157"): true, - common.HexToHash("0xa15b9e5ce74578d6cf19174763c01463d34f489245f4408db128c5c6bd1a5d30"): true, - common.HexToHash("0xa1b2ea48f13e837247292cf188fb1547112bd35b4dbd8b5bc5ce4ffd9a0e55d1"): true, - common.HexToHash("0x8307af65eb86517d5f0cfdd824e9b013e863ed380e709d7ac78c2fd055b6ccf9"): true, - common.HexToHash("0x4f13bc51ca32e65778a2a8fd13b47e18cc5de792f66604ec8f36fb674fd08f2a"): true, - common.HexToHash("0x6ff8ccdfcfad0593edaa01fa4af937e854e384648632602e6504dc6b0a5817ae"): true, - common.HexToHash("0x599cd48ee0f9490b87848b53253699e2a22b59105d28c6e15b8a88452fad3db9"): true, - common.HexToHash("0xd79406371a3af3490a74bf91f39305066ca54b1f0af72fc2e4c0d9f42ab80032"): true, - common.HexToHash("0x81c35c89eb263945d946cd800f160be7ca87509eb08ea7fa101a298ee9250ffb"): true, - common.HexToHash("0x9f4bfe8cce2cd1ff058bec27a9fe1d6d3d524b71a3e9855d1aeb4b76c2dc761e"): true, - common.HexToHash("0x2de7098750d5e68dddf456b28c77fe81f4ce352751499618c242d13507c6d81c"): true, - common.HexToHash("0xe9141bc238028e01070cede1c289914853c4efe807aafdda582e1f05182f58cc"): true, - common.HexToHash("0xd93c0a7708c682610cbd31c6adce911f1f1fee542a1b1c45f6e54bb9546468fd"): true, - common.HexToHash("0xac976aef7a31e39a3f6b3225e181e79ea19a98a81464804f1a2d79672e25c9ee"): true, - common.HexToHash("0xb8fb017c8640c3efd329786de14334e5603a5e243ef7eaa452f7fb8aa62e2df5"): true, - common.HexToHash("0xbc8450fec1e069166cc2c07ec3f9facb55576b30b680887d9a4b2f12ad6b2c7d"): true, - common.HexToHash("0xdd14ff5344a0a5cb0d94942359a9531dc2dc3e976f86aa490ae3a0ff9b788b62"): true, - common.HexToHash("0xd5988fac07c59e23dfc8ae083aa82415125f244cae6e73ea0895ba07564d7b77"): true, - common.HexToHash("0xa2819419a04322f645a839b759d8da62aa37e0f31727031b44b5436ca899e330"): true, - common.HexToHash("0x5549c6d90a684d3684ac287c95b0126e865f54d20707ddaba951f72133a785b1"): true, - common.HexToHash("0x29fa2c4752ff57eef7cce72324159fef963f21c016486cccaa4c8ec952569f51"): true, - common.HexToHash("0xe4d5d7467172bd3d94112dbde20f8ebd0636da490fbb1c5bcca851a59cf1fc4d"): true, - common.HexToHash("0x449665d8c7355f491b9585e45728bf1a9e6e3af9b38d2b6665be41a1d51c320b"): true, - common.HexToHash("0xa6d6408e27e0df31ba618706417384352b4df4bfa8d16ea3d491306cd877ecd6"): true, - common.HexToHash("0xaaa02609e08623639b395f47845d7841267347cd811f160a8135a97218b1e423"): true, - common.HexToHash("0xf1c9872eb167722c5595adbf2243290fd050300e17b01d4dece2670f56a05603"): true, - common.HexToHash("0x35beab3fedd5afbc73d3b206caf47c5808b3f5dc1db8f33df51eceffd0fe1a2d"): true, - common.HexToHash("0xe185791a8c58ff88ef7c1c490b3d6f2561cd3b6b2516236797fedd7084041a16"): true, - common.HexToHash("0xb1caabc6fa200ac0c7efe397b743f191e5914688acb8e6c133ea75dda9f28d97"): true, - common.HexToHash("0xaf53562f96c07a2765783511c75bb4966fded812c0c1c962087f2b60c3ae9489"): true, - common.HexToHash("0xc14421f0ce0d2b16f37fba43dc08454833fbe5d090ba6cf8bb33cea7eef84445"): true, - common.HexToHash("0xa83693cd2467d76aa861f02055a680b36a585bf25f673b95710f0f7202faf76a"): true, - common.HexToHash("0xa41260e2f28d8562a3ded3a60f3d404440c94e666d2745fb8d6ac7df00ca5773"): true, - common.HexToHash("0x20e3764b9b1efa39663657dd436bc4989ac723374b926e55342881b28cb770ab"): true, - common.HexToHash("0x17cacf4b3091a125eb6a26b4131c1db7ba96f1bc66418b3eb9eb123aad8b62f8"): true, - common.HexToHash("0x65125d5fbdb278187dd507668a62c749f331fa2e208d539b8db0d09af23f1caa"): true, - common.HexToHash("0x18869916adf8a0440732ca1a2a1ae7f037c922633328918c21557574c9b4bc3f"): true, - common.HexToHash("0x0161b484ac21988219da40e0468bf5b8cfcd6890a5eea2b15163d3c752a68d73"): true, - common.HexToHash("0x01ea23585f6a99d04740c9c4d18a0d64209b59f5b47e52382f7b7b8981a6f5f1"): true, - common.HexToHash("0xae26b49adebe48a95f2ff29993eba4b3bd3c4cf1886d8fa6efdc07c375ec5ac2"): true, - common.HexToHash("0x288f29fd63266e3d9309a645b0ddbbb04933cee5e1b645177d534dc628e3bc34"): true, - common.HexToHash("0x8f0f136b8eec7e6a661e16fbfc1a21b88a65c36f833354eeca079781497f0ac5"): true, - common.HexToHash("0x3177f4a53abe5ddffea60c4b296772368776fd3fa08c520b02b5c9b3a2a88366"): true, - common.HexToHash("0xd01a0341b5206762a5bc732eed5ac462849cb98da682b08ee43e976cf927fe80"): true, - common.HexToHash("0xefc4aa743f4c9d4faa38e7d3eb499107497b9635ec5427d1165bc8b8e40dcd55"): true, - common.HexToHash("0x5975cd087358978876a80b70cc45b70c0c1df033fe180725fb830116b13c88c0"): true, - common.HexToHash("0xfb6fb708c7ad7d3a3438a6385bb86e0712abf9da7e2fa0aab9519a2705bd843c"): true, - common.HexToHash("0x00ff9273f8e4785138d83b1ca0b6b7e20f35965c8754b42cfc98dea57396d9a5"): true, - common.HexToHash("0x6438a7e521c640e4c4cd600e4934f7069678bc38a9eaaa2cda605c4281207265"): true, - common.HexToHash("0x7c1c0d23c9113380c7e440e5c8a12854b1006903f7ff47c09e7636a784877fc5"): true, - common.HexToHash("0xc6811b751f7e3237399f07b72e6d762539ac3c25e6067ddb0bab177ab712fd6b"): true, - common.HexToHash("0x32eb35ce313662bba0688b322acdaaa5551f59a068ffc0f4dcfc8a6f5afe63ec"): true, - common.HexToHash("0x241d966577ff9b8ed85f4d1a897ed8ea7df31cb601405684e05757b78b0cca48"): true, - common.HexToHash("0xfb868f0f15b4f7c26f9b0c6d29ed42adeb1da9778f5d37f59fbbac7414aabae5"): true, - common.HexToHash("0x4d257c9f76dd7d72091bd0ded9e16039dbbf8f33f95de960332e1defd7579b53"): true, - common.HexToHash("0xb2eb882795ff4d5118a8a4bb7e151dddd912bea6687b15e35952545744b916d5"): true, - common.HexToHash("0xa1bd761580d2a629136789d1ccefb33a77d2b53bb36a147a7b613c4a6d3ec6e4"): true, - common.HexToHash("0xd508e231521c4b7dc3d066d88708f0c8e82dce2da2c6cd8c488916bacd69b42c"): true, - common.HexToHash("0x7c2b24c26bb8da984a8c9ed509c461fb3da0579be5701cee9315f78e8dd1cf1e"): true, - common.HexToHash("0xe978ad5718d88a4d7ec858b7f7a411697bccd99e8c73d505864f15d2132516ff"): true, - common.HexToHash("0x048a2d29a350a1d6ebc1be07d4e940b6a737eaa2574aa5260c21ffec54df0b23"): true, - common.HexToHash("0x0bcae4772e9cab25b257376f434ee694c0582b9dfc59e52e5f77a23aef47dfd1"): true, - common.HexToHash("0xd15b096e2479237fcb124f370163f0222393d1af072f0cb9d7bdf22e2db5e137"): true, - common.HexToHash("0x0c7da14157da6eadeadc53203a11ae668ddf4667483f3a458faa5ddd561cffc4"): true, - common.HexToHash("0x25a22b8d552da9a46221b0a62695491ce9c5e67c98f4a6acefbba7e931c46402"): true, - common.HexToHash("0x76b73a5b8b40e3021e82fd1dfe008d8742d18be296b42e8cd8068888231842cf"): true, - common.HexToHash("0xc9496e1248b2c709b0f13c67c17e4c7c2f3ed2e6c922a80ef3478637f7fcf8ff"): true, - common.HexToHash("0xaa7d3f023a831db1230bbeeed43d695e817a80e6775464ac6be17b40eb0008f9"): true, - common.HexToHash("0xf357d0bc3bd16260e4739a45a18580be247bdaaa78deff4eebeac3b08e323781"): true, - common.HexToHash("0x01a51ae4012bb7a306c0b4eec3cf7047209919d9fb048f59bc0810d1a6f5bba7"): true, - common.HexToHash("0x497c186f7356097d644435d30d941ce9f5ac8df06b27c8a866c3e8a9b66a0438"): true, - common.HexToHash("0xee83cb37efa7507d45a5ea916c34a9df7551755751980701974fd73b5174c59c"): true, - common.HexToHash("0xf91eec7f682d437a1196d7e54e4a76485c0dfd94a16af49cd7633ee7432278bc"): true, - common.HexToHash("0x5cbe04177616f91ac85dd9f8b9d219f594e21d1f180486d29d6c0b7691a388f7"): true, - common.HexToHash("0x74d84bd79f7b82e4d1d84a00d0d9b2c2e2ec0ad94e833613587a1eafbc6c87ec"): true, - common.HexToHash("0x8e6965d50c964e6cef5cac053b3a933e1209bbd43b47b9c1b5387c7032e0f89f"): true, - common.HexToHash("0xf8da5e4f73f88e06f3dcbee768f217217a28938f67e0aff2395820ff867fd523"): true, - common.HexToHash("0x00b799c2e15047173afab10c57b30fe5b4997ae6381dfbb49b4c14b84cdf97e5"): true, - common.HexToHash("0x20e4bab6b32760cff4216d551879ef827cd4bb9f87a53d382cbac8b3cb8df1b7"): true, - common.HexToHash("0x84f148ffb11f0e8e06ff6368272cf01ee6fc5d42a1f3720f6f2421840fa97353"): true, - common.HexToHash("0xda084343d3e4279be7e455e3902331a12133b8eea08b94a9daf332fbfd5ec66e"): true, - common.HexToHash("0xa8a67697e5bdd12010c16d14c047026d61c4bc41b3ad2785f7d0212d05f10756"): true, - common.HexToHash("0xf8ca0e50647e5ae63b491dce8cca5be9ecf308d43074ca020f733d6667009a20"): true, - common.HexToHash("0xe9ceb8abafbbc42ed1e9cb83a193d41429c34d5d9f238911aaab61ca01c5e122"): true, - common.HexToHash("0x6449f8cfb52dfc4747989d147fab745fc97d0616913379e8f84f63e93cf4a314"): true, - common.HexToHash("0x4e51217aa1b5f76c59303a68c2fd2f3db8bc6e7bf3373096cbbd6f3345ad4b07"): true, - common.HexToHash("0xe42d74aabe14afea3221672a4ff9c7216c15ad7c35cc96ad409990460120e518"): true, - common.HexToHash("0xde11728284c5b589a49f77ff2a13e54ec51113955ba8a8a9a94fcac06091705f"): true, - common.HexToHash("0x46bd4e8f6e3cf471853152e27118cb6dc874a064b7623561528d067aaa565199"): true, - common.HexToHash("0x2223e9883685bbf69790170ed94014bccd456d081db04ce2f5583e93f6e78139"): true, - common.HexToHash("0x94ed7e1afef10ac0cb5ac8fd548fe5dbe014590c5f073e4b169f57584495e026"): true, - common.HexToHash("0xbeb3cb05f771f0112e8167f9db996465c5b99817dad8f4df1de4326178a24f96"): true, - common.HexToHash("0x225ed703d723e1c1903bca8787417125594991f801114e8dab699ec862b0d1fb"): true, - common.HexToHash("0xf8e268fddc5c55c1e436e5a4fc4e295757c84b74b953d217a05baadf12011c46"): true, - common.HexToHash("0xe53ae12954425bc8fd1364279e2d17fed2d5a674ce466baf44ae33931bf0a67c"): true, - common.HexToHash("0x6d72da9f5a07ed5b0768b0eb86052919735746a7a0f7445848f470435d2c6bf5"): true, - common.HexToHash("0x7e5cacfad0fd08125a75ae002d86289ea65895a7f5f863656ef70c3b5dd6329b"): true, - common.HexToHash("0xd0bd24f1f45f702fca509bdeb4b0867c9051f75e0cd594ae36de4dca071e9489"): true, - common.HexToHash("0xfd8efbb69d27b29876cf5cbaffed3e2eccf2ad94f9b897cc5d7ed3f86700f20e"): true, - common.HexToHash("0x1374008b7f979ffdeef9697f11339b75d27dc16a4e2622b2dc51fece2065e869"): true, - common.HexToHash("0x1815a298fca8e83484a5875e9b162f413f264834d9b26c7396e13d25ef82c453"): true, - common.HexToHash("0x040cb987adce206e98d70ff503996497ad019c7a74408b8708bdc02c768dd906"): true, - common.HexToHash("0x3027ab0259109b6bcd4a598beca35fb9000588a7991c12b0e4066cf2c9401c27"): true, - common.HexToHash("0x98bff82cbbde07a61689c86c98e72e755785caf8a1df457ec7717555a9c32c77"): true, - common.HexToHash("0x655a5940a2d48495d83b30a4ef0a21ca772b7aaad27762487a3cd0dea5b6044e"): true, - common.HexToHash("0xa83c157ddb59b86c9dbfaae6dd2d8c7bafddb132250e61fb70406615f3736ac3"): true, - common.HexToHash("0x60fad3882cab845d5e8d22f0d718a98c79aeba7933d12d3583044330d6120f38"): true, - common.HexToHash("0x2db2970b82a1c20aaecd44c9f6d116c66b91730eaab4841732e0a4b610d655cd"): true, - common.HexToHash("0x7b7ee6ee2c05547c9b5c9b041c9b1bd2df1ffb4aa1079a87faca71ccabae291f"): true, - common.HexToHash("0x07408d5e6300435f37f6810e785a641b7752ac84460fed08fb524d6955687bf1"): true, - common.HexToHash("0xa25a9f1a4c86322bff972f9cd3f1f4b6e5fd1394f11263ea59da5d4c1ddffc7c"): true, - common.HexToHash("0x8380979281976e598d97ed38cb5aaf37728424feb3fe50b652498eb4358e98fc"): true, - common.HexToHash("0x13f123c65a5ca9d20e08a123b94da728b4bab3bb159b4b019e3f88e5a73f990d"): true, - common.HexToHash("0x970cba4f07a5562d82cb0cfeaedd5ba9afa66442814267fbc569a3f954e0ebaa"): true, - common.HexToHash("0x8feb863c06ed0f340811b006e457f508cc91ce3ea9106704de7dd36619871cad"): true, - common.HexToHash("0x6ed9d02a9192f9574172b6c6ca37f3cf0e09e9d0d300e3a0af4d02988de5fbc7"): true, - common.HexToHash("0x05e2ad96d844bb1c88d470005b8ad28ce974d42fc5d2247c19b46fd7ad269c4b"): true, - common.HexToHash("0x2f14143ac539e66cf60b68e5b76051e9f7a59a9fd7049712774a7b86467540f9"): true, - common.HexToHash("0x4e4163c94cefc2dae5d408c42e36a0fbafcf8df69028cedf6c465063eeae8f84"): true, - common.HexToHash("0x37964973e3f1527b1d5b51ea7218ae0d0bc9512094bbf12a9ac48fac400f2cab"): true, - common.HexToHash("0x2b9ed5a49c2e127504c2bc96d35f241d0cfd04cb7afbaca44d144a7bcb7d1155"): true, - common.HexToHash("0x8518ccc77171df03cd2e2772d41e555adbaa7379296b59321ddb6affce976a3c"): true, - common.HexToHash("0x2fcb42536425cb940a4d19b3556ae6310a5f56a9658ed54b27f61d4df5648384"): true, - common.HexToHash("0x2696acd672b6a589323963a10952304bd2e7b53819ddbb073f158b03004f5384"): true, - common.HexToHash("0xfb5ef3b4a417115a5af2827dd401eef848898bd93abc4b2a7ebd7835aa9af922"): true, - common.HexToHash("0x1f4cb23ca499fb1dac0b56f657688953a8ffc77c59f6c6ba4387e1030cce2d13"): true, - common.HexToHash("0x6d45ed4ab2506d01d847f4874e5e6886c4510022e46764159b5613e146667bab"): true, - common.HexToHash("0x9c9dfd50acf375048d36b6fa7f56d3639012feb7eba910ab0ce98844932db5da"): true, - common.HexToHash("0x81f64ba040fd453ac8f45fe8d880e834a2a4aea7a1f51e19a8a4dd72fc559fe4"): true, - common.HexToHash("0x5e2ac859b62dace72fe31ec64134b9aea68567ef2cbfaab5fef844c8ab24b665"): true, - common.HexToHash("0xa63fc0be485a9327e7038cd67698d122373f4d8d586f8cd041df2f7e0b120e92"): true, - common.HexToHash("0x602a300d7fb3965355f1a7afcaf7e9d811a350005ec4657b3403b9df3a5e9ed8"): true, - common.HexToHash("0x48feea529eb2c5b5b5f1270811bca550fd54eb462798a2eeee44a45c29025cd8"): true, - common.HexToHash("0x5f69e530c56e515c6cb65176411b9d760fa8d775a573cb9cbdb3843a5ea92bd2"): true, - common.HexToHash("0xe178dc6361b031d07d7a33e350a4a3b38519d52a554a5c69a8182e7595d11f72"): true, - common.HexToHash("0xb705c0ebc661fc1bcaa7a06df0c978263fe5c76632ad1a3e790402ff21290791"): true, - common.HexToHash("0xbdef188ecf024e2831f4130f4613f63041e736ae3042489234a44a460b8f4ae5"): true, - common.HexToHash("0xcbc9a9704ed8283ebee997952e7f021460ed1106c98a7aae97f0bb7c7fbaddfd"): true, - common.HexToHash("0xc588e801ebe2e2f6074f221750208eb6871ecc91b6beaa7b6deeeefb135e579e"): true, - common.HexToHash("0x4218ec35eebdacc6476c4cbadecd7f4af9dd72d9164c4830903af9078864f8f3"): true, - common.HexToHash("0x12f298ba0023b83665d85c1471cac60203d84489407bd45723bd9c30ac549954"): true, - common.HexToHash("0xaec20bb9d8f39328e005c75c97f2e5ecaec67e32aa50e1b3efbb83e4df195685"): true, - common.HexToHash("0x4b1c486137b4c31cca2258fc96ad02250419ab73d67e4de6fb36be0e63dde409"): true, - common.HexToHash("0xd18e2f7173f1a05a5e2c1476dfa5449f26d0280f024009bfc93b37585164fe6f"): true, - common.HexToHash("0x9c6eb58fbc99d2376f831da37cb48b59b631c609cbd014615854c842cee29aa5"): true, - common.HexToHash("0x7a35754e42c243f64d30a1848ab868e9db227c4a17caee6540cbc58cec4bfb20"): true, - common.HexToHash("0xd9fe639ddf7c86e4e382c6eab27b5ddf47001a4496413a010f40c4121034f849"): true, - common.HexToHash("0x860f90745f0061e78bf1d2673376e4541b3f27e240ef966a159517987abcf664"): true, - common.HexToHash("0xa09343270df781aaca6174588dbacf08f20d9d1bb85864edc5dc31e347f185c3"): true, - common.HexToHash("0xa30cc9acc6f2866d140566d99c7c492589e4978a258642947a17bea47a756160"): true, - common.HexToHash("0x8990600c7a3bb35ba47ad14c6b54d1f48a366de9f9d2d80b7e8777307410bde0"): true, - common.HexToHash("0xbeb21028cc60a5e68185c5d81de37325560fac2c4e0d714b575d704515dd5da8"): true, - common.HexToHash("0x759d165c88b28f0301cac42e06ddfaf3c56819e7821d62db1583d5463d9949e0"): true, - common.HexToHash("0x779c95f954af8779a42065054e2e17a0239507489016b388ded8da1f92db0907"): true, - common.HexToHash("0x1e172fb3c6689fec2ee07a927933ea04966c0805e83a85d533156855e4a5ac17"): true, - common.HexToHash("0x35ed683a33a70ceb2a7da36d3df0f595b122e6ab2169ce734dbd77dfc228dc8e"): true, - common.HexToHash("0x75ea80ba6d2a7cb3fbd7f6ceea1d278630b392cf4c86c7f53661c81d534bf0c0"): true, - common.HexToHash("0x508b46a36654a953d31bba2d9f7c9d81b428f29d1ba1c546422e6622a65077b4"): true, - common.HexToHash("0xc39c3ce79b45c5f4daccfd3e58b10dd4a4707d7ad53b4e1a0ff55eab711b5b8e"): true, - common.HexToHash("0x63d692c4173ccd7b8cc9913d7cb3e811f430e297bfb4502ea32cdf49d880dbd0"): true, - common.HexToHash("0x1218decb6f57f38f1efcf656e246ef6f06c9635786f9b50352e785623217b891"): true, - common.HexToHash("0x2302566879a4ee87288a593bd26e23fac7a3b97f2206a6013f6e1203ecbd3052"): true, - common.HexToHash("0x3d733153102ed003dec1a5681b10312e16dc6008518ce0fb6c0f92c2cebd2d5d"): true, - common.HexToHash("0x748049f840a5edfd765e91af7e16a45025c0a662f87533183ed021775d1688f9"): true, - common.HexToHash("0xe4832d381cac2b3a8c72641cfc5cb71dfd57cac01c15aebd7f17d0101a086aec"): true, - common.HexToHash("0x67be40207d01e43b6af0ddb3fdb7a4949a343309673700e3ffb6fb822608ca2a"): true, - common.HexToHash("0x9c08806a85a67d19c0b3b108d5d247b5477bf40c492d457ff00aee544c55bb0c"): true, - common.HexToHash("0xf81a1444379006a28bcb142f089e57ab431e4f956f1fa625f5bc367d1388d204"): true, - common.HexToHash("0xa915e05a5207c73f767f7bb4dd03c3121ce476519806703c272381c97fcfe1d9"): true, - common.HexToHash("0x8ef64f8a325c1e355c2c464efb221d991b81bbfdf1a8a72d1c14ef3e24a6cdfa"): true, - common.HexToHash("0x59efe1baeaf43c157a580a5b9c0290f637a669db1ec21174da4e15933500ef6e"): true, - common.HexToHash("0x9531a1f5513d3f681d0b0aa0e6cc02ed94a83cbba7e029dfbae0bfd62bdcaa98"): true, - common.HexToHash("0x821fd118000649cd80e5dcf7cd2922c4ef9a3f32021fa1854d4fe83c60c026e0"): true, - common.HexToHash("0x82f631abfe5912d00af96dffa8e26f18b224fdd92437e1a62fe1a5d174822813"): true, - common.HexToHash("0x215c28cfac2b43d0781b8ec3f74219b8f8b1dd52258e1ee092a15c7cf217ec26"): true, - common.HexToHash("0xaeb6b9321ad8d1f6f3f8fe816623e168be6f68a02759137666728bc71d9c5366"): true, - common.HexToHash("0xbd3540f6d53cc26b1d10478ab933c91f1df734d336b099e1f817bb64d54994e5"): true, - common.HexToHash("0x0c5fa4e7bdecf589847b6fba1e9936639f3e42a5a978279a31b7edda9e11531a"): true, - common.HexToHash("0x081c535e59f399dd0b0097de4673870878a569d079c16e19ceb4841394568a30"): true, - common.HexToHash("0xb09f15a20763bc171d8d501f2674f9dd3b9fc69699ded5ccbae99cde6c234017"): true, - common.HexToHash("0x0abbf8412e013eccaa9c4e42b270bff980845c56d96b210f22003225adc16617"): true, - common.HexToHash("0xfa6d7cd9d95d1a44a1b83035726d28a96e7d3579c8fc4f2c01eb633bea9bdb88"): true, - common.HexToHash("0x3a289003ed833bca3e38451ac1bcde5821d4107d800ceea499bfe356fd61efcb"): true, - common.HexToHash("0x8b367e6d5704675982ebce8b83bb122171ab789a0bb00bd80b6d1c566357bf0c"): true, - common.HexToHash("0x4ea61e6848d058e23e8411445167e7268180a82999ba97e7280bfdcebb909534"): true, - common.HexToHash("0x26a24aedb55db524106e711d9d48b1b1fa8cf002d066baf6ca8b2801b6e45e52"): true, - common.HexToHash("0xd5174689eb78ed27325dc71dddfb4d08c4e4be2aa1426d7dd8fcf1b3cceb4ba3"): true, - common.HexToHash("0xa1e1baa3c1cc918949bb8f5e18882b6b2f376b0ae8acaca025365038f0e81c9c"): true, - common.HexToHash("0xcc45106d7cdb530b1908817e1275c56ec584131bf83486973ffd4ada7f71fe6b"): true, - common.HexToHash("0x2014975d5e4b1a365ab49ffb24f644c64181c4ceeec656e1e43b7c1e1a9a44fd"): true, - common.HexToHash("0x07ee87a443c9204e269ed981ea681e84963195f1085a2d9f00c8caf151af5c64"): true, - common.HexToHash("0x51723207e59ea9bf2649c912e837b84d1ed7fc89c1c0b0e403348005d34dbb63"): true, - common.HexToHash("0xf998a7c7fcd99b972ad7856a300970e6bd62bfc640cb7ee00bf8314c3bf359dc"): true, - common.HexToHash("0x29b94bdf85e90028921b86dd243a0905c69d36a84fe0a2dae1c186679a9fae9e"): true, - common.HexToHash("0x7cf3e76cf5c3dd6c77ea36d5a3a780c1bd28ceee03c6313c5f4913aa1cf8689a"): true, - common.HexToHash("0x31fd6839cf457a363ac17d7a887c0b556a4dcc825246f058c3b83e98a7d9b2cb"): true, - common.HexToHash("0x60bf22126c5c02d20a8c3c2e73b4985f6e2083ee88b0a8d96980803b39f099c3"): true, - common.HexToHash("0xc04e800a84618ad53ba78e8f6c0473be1cce4e47f69e55dbaa4f031478aa6eef"): true, - common.HexToHash("0x875113fefa5504fe15a89132078c5bf8885b450c0bf99d2552f515ccbe43751f"): true, - common.HexToHash("0xa226f86b12ef8dcf133e911bdf5e54bcf2c932f991f1ddc64bb212c784db861f"): true, - common.HexToHash("0x15fb16b939b90ed7c3684449a23c0d9c2728ade55b278b65aa539cd570b93215"): true, - common.HexToHash("0xb5d5a987ac09d9cf95056be9aed89e7034c3047803f3976c90f74200ea206d60"): true, - common.HexToHash("0x38a1cee11557d419ade029f4ef9d0866e1b123494561453ea5464d8646f966da"): true, - common.HexToHash("0x17162da179ee4c1e7a9219be74bfcc5049b39d2dc0ee0a3e9cb757fa5f0e4cd4"): true, - common.HexToHash("0xb258a931bf096fe72c57ede08b8635503d631f3fafdd1c95e69aecfe8d144378"): true, - common.HexToHash("0x06facaf5228dcf9b314433efb3b4b5649f3e5b4d1287336d6bb1a449b49e7f02"): true, - common.HexToHash("0xd4adbc59b602951c62d339348dbeea78dd796a926218c7b33754d3565b8e0e0f"): true, - common.HexToHash("0x78e24228a7c5582413190431f4004fa05cc1648fe767b5c6f24969388525b6ee"): true, - common.HexToHash("0x6af7dbfd59ead51000a98adee99a87203569748b39d3bfcdae797651d836b006"): true, - common.HexToHash("0x3e84f2bbe9faf4fe1177cf8ff6e80a50b107971e6f73a547fb04f519249bbf28"): true, - common.HexToHash("0x8d98d2899e8a99c7ade6553cd92dd7ccf26b7d38a1d3223e5fcf642de801ba7f"): true, - common.HexToHash("0xd237dc693a309304b3d04f3cfd4323689b4a2c90cc01f2eb69145f1b4c8d2bd4"): true, - common.HexToHash("0xf7345049a258728e007108061289de30fdaa497e2059c9b665a6bc687cdcaecd"): true, - common.HexToHash("0x6db7165117ebab2aa5753fbb3d98bde3bbe56cbc419c699cb3316c1b758dff09"): true, - common.HexToHash("0x384801c1d96a7d1d8cc2d7566d0d4b464bd29638c1fd3080c6942b6fb678110f"): true, - common.HexToHash("0x74573e27aa0a13de993fb3f7f6d861129b41a9bbc107650c7f749e7ee68b8c1a"): true, - common.HexToHash("0x25b82245283981be3d60ca6d4e78c27bd95a43ccde3683af640ae639069b4387"): true, - common.HexToHash("0x4ce02dd0bafb3a6ac486d0ea1a8b556768e69e06d262c18d732388fd30fd1fda"): true, - common.HexToHash("0xe84785a49475e39692a600b0435d4a4b4e7cce27a98fab12f912233e0561d54d"): true, - common.HexToHash("0xa79b14ca11ffe1795e451c6f2c8bd1c9e1e59b16052c12d40bee964ba0622ca9"): true, - common.HexToHash("0x1b73aa8c05f3af5e8b0b2f4c1106580d68bdef6dbfe9b2a19c69a0e69bf6f8e7"): true, - common.HexToHash("0x6242a315b4316ccebd3c77cdd3984f4d0ec0269e43fd7737081dc8e769469c59"): true, - common.HexToHash("0x1b4f77e142c9ae76757ae51d13c728879aa8f9ea2d1b7ec646f9c881fc0351fb"): true, - common.HexToHash("0x65f15b775fe38e175fe0ed713f8c378924da857a62e26df5316cbb7c78ebc153"): true, - common.HexToHash("0x28f87e6c0c4acb195b28886b39d0bc35df6bee0c1f7289140bd9ea77c99ac529"): true, - common.HexToHash("0x221a4371b566005fde62fb98366a54e2fe2de7be1f4a2523c3f2a82048811ee0"): true, - common.HexToHash("0xe3e15da7e8ff0f788d0ea65777aabc855dadbc287db2e097baeb8c27b355a0f2"): true, - common.HexToHash("0x9f990e2a0448760c91397d5739c0522e505fd03541fb97c633bc38d04d0a9ba9"): true, - common.HexToHash("0xe72ddd493f3538ecbae9c848c3a451a2c37b09fe46875e87d418a21ca0bea9d6"): true, - common.HexToHash("0x049ef49227adbde5e52ee923395d257bb37e66d2e201689005fdce5329ded400"): true, - common.HexToHash("0x05d2dd6a451a4112a89f0d150a931f3005d90843c9d65ced46fba6047c959220"): true, - common.HexToHash("0xadef27a478b2ae7756a7013aed88d6fb4b0915fd2d41e54c6cc81f5113935758"): true, - common.HexToHash("0x4f404e6ed0c986f7dd75bcb85dedfe2e0fa7cab9032bcb0f3ae99967b8cd4417"): true, - common.HexToHash("0x332f99ac27acf376ac37d8e8bd606d49126ce77cfa360cedbb5e468c84b36535"): true, - common.HexToHash("0x45e0866af41108217163ac39c93a8b60b16cf714546d240ca63a8cf6abe422e7"): true, - common.HexToHash("0x1e155e6cde25e82be13f763400f421837bb7b5d867710779d94a115ce29ef4d4"): true, - common.HexToHash("0x6823d049faa7db07f7f65aae5af78d9dcc5e1d66a8871af976c8e254f8a1f327"): true, - common.HexToHash("0xfc9c344a9ed49b0ff30e6e3eeebe58859f8fba76666baab234642138335ad56e"): true, - common.HexToHash("0x5b3d506b5eb2029854e50887ca062c0900f723217d9c0002d5a594aeea58be83"): true, - common.HexToHash("0xe072128e417d2077b6566c526da393ac5bec638750b3b8c6bbb183fba76a6c1f"): true, - common.HexToHash("0x07ae27135de30b6b4788b5c2c52148023bcca1ec80efad8f7f6b3144fef26724"): true, - common.HexToHash("0xa6dfe664f62cfae5a61587dac111d43641d829c4a89119b9ba9cd4cdbf792578"): true, - common.HexToHash("0x03924ef9bb13e1340f6a66079ac23b79247479eb7920a0988d362fc1413b7a97"): true, - common.HexToHash("0xd57937c72069ea8452e71105a0fa6e3abfe2182d8e20f722a1cd695db11f9a6e"): true, - common.HexToHash("0xb2e911ca5cfa2806f4600f31bd7e599a75ef54c5ae062d960a76b006636a3c89"): true, - common.HexToHash("0xdf869ccd963e5badb9f08632fb53a19fcc1f0db8dae56b03966d3e730881d6f5"): true, - common.HexToHash("0xf2304a2eeda93f986351b9b948beecc55d8f8315be955f9ac35e8098a47d2576"): true, - common.HexToHash("0x8473152afb905cddcf5837c3ed9e22a7dd9cab9942e22c916419e05df8316974"): true, - common.HexToHash("0xbb2138fa75e7a15df031dc3dac40774403a8e9e4162d4d45612433e13b81b82a"): true, - common.HexToHash("0x3c7fc02fdbed1767d8ae26f46c511cd8ddecd43a9ccb7f91d11b5e2c30b3445f"): true, - common.HexToHash("0x9700e9fb02ddee907b188ff85a6b1e948a315085502875c98926710f10f40446"): true, - common.HexToHash("0xe7b7cb1fd2ee66d0f837d994bb2fc8ad9fda5e9902455bbbb78d70c633c9e1b3"): true, - common.HexToHash("0x3f8c795ce4300c1d4c87d258a9389f094db79d003cc22ddf7e73f9310bc720b5"): true, - common.HexToHash("0xc0a20fa77d1bff325a3766e3e209478d2ff424a80e20fc48b1d45c5615c2c390"): true, - common.HexToHash("0x72f4baae35f6eaab071b4332701aed9f6d68c065ca35377deb1ccf552ae300f9"): true, - common.HexToHash("0x6b38b5c333594d02eac97404b4ed650772b639e827e5ffe090b9002cd6ec8531"): true, - common.HexToHash("0xad7525e471a0b086a61bb3608fb7a07252671eb300ae9714702056421f0115e2"): true, - common.HexToHash("0xc617186a00a5d07d64a3f30e6faa939c07a71088001dbc4cf3f97ea5a3dc7d23"): true, - common.HexToHash("0xa28db6e22ddc5a1288fa07fc9ad60eb3864d782b70d19754cbe48d96d1b9777a"): true, - common.HexToHash("0x83a40beed40922bfe4ffafb68864294e891a7fa953f6822d4d35c7812c4df8b5"): true, - common.HexToHash("0x22363d075b32aa287d48a82c590ac81e239a08f472aec177939252f812f015ce"): true, - common.HexToHash("0xf31a2cf7a0f4d29e73963101a3b9ef21f7f8d6ee3b7fac7313a56bf2b473151b"): true, - common.HexToHash("0xacf678b287810756b44a59b94f66f39d2510bf74124fa5415bf14d75452bb3df"): true, - common.HexToHash("0xd811640f30cd48e4f897ae3db6708411ed1ed0728ff38368017cca80755f557a"): true, - common.HexToHash("0x6eaf9ef23c276af56c7482a844957fb16f6f66e3dd8d108c41959ca556c4bf4b"): true, - common.HexToHash("0xc0ab1767f0bfb6c452ee4de46690cab75fd593ad7f22aeefe1b5177d6a6f5d84"): true, - common.HexToHash("0x80ca7d8f2484eb8839cb58978606e3c9cf29a9ae7cbdded930954cd2cbd498b9"): true, - common.HexToHash("0x7a6d2f874316fc32868e2b4c45d4ffa31a71f8fb397ea980635cc4cc579f6460"): true, - common.HexToHash("0x2f2f723948ee6880cec7e5c6d891aa422ddda926f0c4be121eaf77092a08cb5d"): true, - common.HexToHash("0xf92fd1251409604410550bb3977da550052b7788e51d54efd8812c9dcd2e720b"): true, - common.HexToHash("0x3e5960ccd908981ce35209a7493a91c0820627c0b21cd0cf5e75ed1049f9f880"): true, - common.HexToHash("0x01f6f6cfcb857123c461d0cbad02030abe779432a49b269f48672f1198bb324b"): true, - common.HexToHash("0x665a76716351b8fae493f8c366d4b0dfeedd0e1bea724db290fd7ba34ab1b06f"): true, - common.HexToHash("0x1be1119cf0d85c2d0a32cbbaae5d62736866609586be60709fe6db6da9750fd1"): true, - common.HexToHash("0x4b1a13e7b5f6226bf8c41fbe370f2511b20ba865297f385461d6deb2dc4f0023"): true, - common.HexToHash("0x18fcc84aa9ddef07986554108412dfd85dc3059625bcb05679d6b6901218198a"): true, - common.HexToHash("0x0f40f650d2a2a514eecea81cc897ebdf36220d57d1062ef84f71ed4c179545c4"): true, - common.HexToHash("0x2fc766abe2e4e833646437e27d375edac6c5213d10b8f865f6d798e9c2528f10"): true, - common.HexToHash("0x98ee520a1b52c490ac1afb81ea52d88770126ef26de7d58337fa017c3b1d5c9a"): true, - common.HexToHash("0x5a7845f46100f57987a7fc297e6e5b89a9a8dfe062fbf276d2d8f1201ea9f996"): true, - common.HexToHash("0x6a6799f1ce21830888178b7e1d9b291aa7086305a08aba3211a197eab5258f80"): true, - common.HexToHash("0x7ce2f060afc922c7257f6f97151882be5ba1464fb33dc7266cb1d9353075aaec"): true, - common.HexToHash("0xb10786a3e9232877486fca108624b073539b1159d990d0a73eb61dcd9d40d652"): true, - common.HexToHash("0x2f2d6d5d4f965d053bca5c815fa556af0b17586d1a7f375c633d618887a8b6d8"): true, - common.HexToHash("0x13c668a6dbcad77f53569e225f3f253f86100d5d4e325cf38c977b1f03df6d13"): true, - common.HexToHash("0x7546f544d4b9ec103e68aed527ea5ce79033ea38efd5b17e2be8b92db76e5bf9"): true, - common.HexToHash("0xdc68ec18a1176f9321fbc973281d3b5082a204656205a5a80ace9d5f30ce86ab"): true, - common.HexToHash("0x48f131bb1087821735fb718da58ae76da47815da2b164dc100e2f96d7b7503fb"): true, - common.HexToHash("0x1fa10df83be6b4163b810a7523a97aab85cbb23e35bf2cfdeba5eca0ec35af27"): true, - common.HexToHash("0x6403af1afde143b27f7b5101383dfe39474f1d999936bc08093e2adb35bb4b32"): true, - common.HexToHash("0xc5bb3274e96d6f460cbc704944594ca4c6fa3c7c3883f74588db6d8c1487c836"): true, - common.HexToHash("0x1f3437b2d81190d0223cde403512282a9c59feebee68717edf46881a74313032"): true, - common.HexToHash("0x4bb3e185277ab65b399ae837946575b22efed510d98afa1a5954b6d2d8c677f3"): true, - common.HexToHash("0xb685c25d29a36d5a2f1d77b68bd3611b76e2a78a0dde7ffea9d9dee1861c4cf0"): true, - common.HexToHash("0x03c7573047f5abe69a6e5aff608a6e287e68f0f126265546bfdebf68b7b72e1e"): true, - common.HexToHash("0xd49a7736d53cce667e229e7ecdfbf4c187a665202c4e6caff0cc1e006b48b8d5"): true, - common.HexToHash("0xb7b31f2598db58077ed9f97fe63bd0f4cc901f7c849eb5cc3767fbfbd7d77fb5"): true, - common.HexToHash("0xf4d37e1db9b1f3090ccc16479612c9295564c771c7d16d89f3eced9772227666"): true, - common.HexToHash("0x8b18384dc532902f4fb771792a87f2d2f9fd89db9783d8df5a0f9b2d7206a1fa"): true, - common.HexToHash("0xac752561cad40e3fa7c40c76a8150fa66fd40748d04c13ea034a992939e227be"): true, - common.HexToHash("0xa81e7ac4c7b2dbfce547be1638ad475e4cc4cc8be462a7c701c77ba6abaf2fe3"): true, - common.HexToHash("0xfb4acbb803251fb9457e077e2d81b9d450890e3d38d5399946b6c36ed86da82c"): true, - common.HexToHash("0x0a2d1bb46210d19992bd48e05950211672cd5286b060f4a9a7bdb482497f354f"): true, - common.HexToHash("0x95704fbb2cb7b202882b3aad04f242ed32c2dfb10bcc5b1d6fd9ee124f6487e0"): true, - common.HexToHash("0x7bdda4cc2fcd78dc2de80c0337e3a37733613f5bf5237d9002d047a73cc1730f"): true, - common.HexToHash("0x60a1f3906549c51011e232dc161072a6a39699b612190b9d5aed22154868904f"): true, - common.HexToHash("0x11e2f25233ed7344ddd6fd0db1aca060ceb669b08cee6214d4e6a94864499ca7"): true, - common.HexToHash("0x3846902e156fb5be913676707beae4492040f6fb2ed278ba23790b74a118c5a8"): true, - common.HexToHash("0xc061aabc2517f08c0453f0797895b8d57c0cce93345506e800cd94e782593e74"): true, - common.HexToHash("0x6347a019be4adc25683f7d4a4e9e92b1f0cd3116a4e56f2e12caf91645318335"): true, - common.HexToHash("0x17d199ad419a43273f08af395b818d43a93441d1e96e79c01b57746fc4739c12"): true, - common.HexToHash("0x84ed7b047ed036d964d0137f41623421d35ebd9ef50dbfecb079a44234ed865a"): true, - common.HexToHash("0xa2cf1213aee457084788270a5c398d235944eb501e6848f61d422708cc2c5262"): true, - common.HexToHash("0x049844b18802ebd7b57aac385e00c27e8d8ef86b4eb16b89f74b8ec8ef7c64da"): true, - common.HexToHash("0x3b6cfde05f85cb53da565bc719cb921f33f0053a548c4cd6c0e73ec396d96c46"): true, - common.HexToHash("0x36aa8cd1822c2a1b879dbbec0946bda0f5205c204bf6625f1dd10633482cde62"): true, - common.HexToHash("0x9e0df3d519143c54062f0049c245f8f1ade433a35930e80e76106984004e91a4"): true, - common.HexToHash("0x66368bd0e09b0a7b595e47733a44ade32e2f8cbd6203548c143d116eed39261e"): true, - common.HexToHash("0xa674dc515dbd427ee00ecef4093d698af590178b356e1ebe0b6d0d696d64ae19"): true, - common.HexToHash("0xa9c162bac4dc80763e880a13cb61bb5c2bfcb727a6807ba92d5c84a0536c1c21"): true, - common.HexToHash("0xead9d611a91cbc56b770dc84325445024d32bd4bc89931e5671e09b1db0fd71f"): true, - common.HexToHash("0x8b45ee663c704c08eef8b52c430a91666eaa9924ef27db324e6cc67bfaa9b7ab"): true, - common.HexToHash("0xf86c3f8889df59b4510cd7634cfcf23f1dda3170a83c1b2ac25fe1a664d6a638"): true, - common.HexToHash("0xc38c19697375438adf98348c761eb547460084ddcc2d0314d1686c05e828a2f9"): true, - common.HexToHash("0x983550da9435836812f6d842e789e2e0687df8153342c62c9c4b77b8fe51d4ce"): true, - common.HexToHash("0x6245b40a442bc00647363e8bdd829074336a52ac1f6170aa776c3763b984f493"): true, - common.HexToHash("0x035ede25a335e373a85cd4731bb4efe7a30dba7fb374379cf06e2bfe46478aa1"): true, - common.HexToHash("0x583041edb5576a40ed3002b93143571804deb5b4c28b58d4843820a07ce6c80b"): true, - common.HexToHash("0x2c752611efb74edd230fa78b548fc9203ddccd50a1afbfcf2460ef610844bbd2"): true, - common.HexToHash("0x062d8245474d6fcd1d4670a4d7fe3951de40cb67dc2a0b59c4ddf94e035f11b0"): true, - common.HexToHash("0x611d10fa4fcfeac29d817bcc5330149907490c55fde782da36438f7ac571404d"): true, - common.HexToHash("0x368a86e9e91bd433a325da75e9079b0c595feb4a5365b8046f623ab430d66c26"): true, - common.HexToHash("0xadd7078f48ab0cde3b4a50f69576c508e153747937ad827e2881f28da633c737"): true, - common.HexToHash("0x947e3e1aa61ff1b30c4992e680ad639beee9a6058834c95e2fd4743373563ed5"): true, - common.HexToHash("0x2d23d3daef697276fe00fa8b48dc4a57767346442b86452fb4cbd6123b9b518d"): true, - common.HexToHash("0x1b870bcb68ae250bfdd5acca09f1657e15ffcd5ef7e6c40f09d8352c0e1f44d7"): true, - common.HexToHash("0x8805179ded760532deb7da8326b58550ef0489247d7b611bf1d51996cdad59ae"): true, - common.HexToHash("0x106111392450abdd25c661df90d04c20374ca362bf1be172db202a1fe19b2fcb"): true, - common.HexToHash("0xbfae6474103255c121422760fed5f5a228c68e1d91250b9b0cffb6af87b4f10b"): true, - common.HexToHash("0xd6b3188fe69efb59066ad0158ce74bc09573b201b9fb1ce0d9f59f4865e29dc5"): true, - common.HexToHash("0x56cff9b5f70f53b401a8d8c1eb3541b1e4db54ecb3dc2fe901279a676b4f3497"): true, - common.HexToHash("0x6c450523b8df3ebb176b26eb634fdb25098963a13e8e58c65d820b664174ce2d"): true, - common.HexToHash("0x51e66edee5d9243746e25f28ea8e23bcbda6364323d0eeea1e8035c030a19475"): true, - common.HexToHash("0x355817f2bd5c219b0c1086838476f530943a2e24c6e3dd86ccd687d9ceaa5acc"): true, - common.HexToHash("0x47a0b1dfde5d71e53785b917080f1e5bff7c29693e2ddfedf9bea5e475be7469"): true, - common.HexToHash("0xa89077e9238451cdb03a0491ca483db5b4cb2c2ee7a419c262c87a0d2db54e07"): true, - common.HexToHash("0x97f3d7998219aee4bf4469dc620b366845c4312c928a505141e57563c6570415"): true, - common.HexToHash("0x15748a9d6ba0ca76c2f1a05ec6d19cfe927351737e06cf8e7f32e7fee762a451"): true, - common.HexToHash("0x8e184532a124336a036926ace6e9efa92ab0b23066790f6eeca80cde17916497"): true, - common.HexToHash("0xf666c9284b7189033ce02c48b6f16b34f185330246a8376b52101e31c3bd725e"): true, - common.HexToHash("0xba83ebc542bb9d69da50f0205ad568d9ca3dbd22f7f07c0928c9d1b82abd2be3"): true, - common.HexToHash("0x5d39cecb85ad797ce0dac7a80d76488e2a1e6223b732060613d65541b9f75a0d"): true, - common.HexToHash("0xb2c60357f7323cf76517334b3db90306e3d00a3cd85a5b4f86cc76d0181b92d7"): true, - common.HexToHash("0x8493c5f60ce2e0b442015cfcb99838d6a32d71d683752ae5eb195fea5f87a394"): true, - common.HexToHash("0x67c7a8addb080577803882dca413e27ddd8cda31162124efb228905ed5c4e892"): true, - common.HexToHash("0xa5c0471e8da5b54a2589425c9111bb4891ef27b2784172d4bac95f93c1eebdde"): true, - common.HexToHash("0xda2f5bc33d7d81741cdfa92d2b05d0052549474b92d2ea5c85ed23fcd9181cbd"): true, - common.HexToHash("0x3e84d1eaa7c76b29d913f06cc96a1a5ec7fa1f9d4610f58ba4749421f4d93a25"): true, - common.HexToHash("0x0b7f9f486d8b528bd260067654647731e86ddd21f4a56b96d5a6845ccc04db48"): true, - common.HexToHash("0x1e93481d09c85cdb7f7cfcf56cf12785e3fff42237fc7053fa7f678773409e1d"): true, - common.HexToHash("0x744fba82f983ed6eb5ce3a3e15767523988a60baf04a64ed00325728cd20f553"): true, - common.HexToHash("0x9cc1f0a8c18bec9711817cccf77fe5889600c70dcea93196286d3951b3669a02"): true, - common.HexToHash("0xd1a066ed89dffb7b85ae0d5cc1e744b1cd132a366bac107f0265804419a847b8"): true, - common.HexToHash("0x052241c3752f7c80d09d2701c90608e97807ceb8dfa2248cb27de054aabf11ad"): true, - common.HexToHash("0xf979310be5327f162991fc41b9fb945b73a248337cfe5ff67e20df4077e41297"): true, - common.HexToHash("0xc0793f0827a0df9f0b2b3cc3d3b9dc8ee39d50e1923a5a9664ede998e202b839"): true, - common.HexToHash("0xf513f8514a54941779d4da6d211d2c19462d07649c2cf2fee35532d407b1265b"): true, - common.HexToHash("0x319b1f4659792465e593a823a24a9b23a838c8b0aba06dfc951051851462610f"): true, - common.HexToHash("0x917d7da423f596e49478359902e9e5151ba36c678915d9b232c6d18ec39ba3e6"): true, - common.HexToHash("0x2011fa8c6b574e43a930018f25eb6a3da69a61c5ad8a70bc8aebb715e13dc007"): true, - common.HexToHash("0xc608ead620b10883df6fe6794d77dd9698b70b9f6d54d7cf9d1b43d9afc98395"): true, - common.HexToHash("0xd1059fcafb157d4ef74d8e5639d0afa72a6e65235e3a2de05a4a989ae2b5eca6"): true, - common.HexToHash("0xd1e3e37533b2f81f7699db37a11707abdcfca8524164e21c20a15799baa14ad0"): true, - common.HexToHash("0xe47ad283bf19a22a760de282e9424266d09a3b12e8ee16502e3f347ce25e35f4"): true, - common.HexToHash("0xd47ec94f82a764adc59235ab2d0c5ecd7de00d742908679277e2a0c566d52bc1"): true, - common.HexToHash("0x7e4e702cf5b3c79f068e3c2e112578d153a4b5c4e447eefe809dec125ca79a85"): true, - common.HexToHash("0x24a18b3018aee97d89d0dab10d9685430917ab866cdf31bfec1453dd4e4d2afc"): true, - common.HexToHash("0xb66d684026828a6de760a508058afd54ad4e1f35f2d38745454548990069aef7"): true, - common.HexToHash("0x6081f6401864dd1d4559309eb1f376c784950dc16c758f0b17c2285fa3d50ae0"): true, - common.HexToHash("0x8d6a68396ea4c772ea0988d8c00980f87fc5088942d006083c50cb21f7ad3b54"): true, - common.HexToHash("0x3e547be9472d8ff9a42e40a9f08f39f64029c25509d5f40ba11e1c3de1d831d6"): true, - common.HexToHash("0x9499e99fa09dbc618035f7a8ed7cc854fd692b193b62cb7e516bbc12fe97ff3b"): true, - common.HexToHash("0xb4df5eb0d2750d1894b672b69bc8a4bbca4e54c6340bd1e0fcf4dbbe9bb6e99b"): true, - common.HexToHash("0x5e0fc0b6fa7bfab06134aa40c92dd4347c62e8809a452089fa77831c8350fd05"): true, - common.HexToHash("0xe98894e7e6be657ef39bfc3d1e933d80417f84dc876df2304ec32b92ed910dfb"): true, - common.HexToHash("0x4463d8582699f1c51950a4bef7dee9bb55c417a150fdfc6b16507393d3fd5537"): true, - common.HexToHash("0xbdaaa06dc690062843e21ee28070d32b20a4126a0c4cff4e9574d670c17ecd69"): true, - common.HexToHash("0x825206500e06a77e9f87597fda29f6f1ac0229bc7f4bc4913d7fd9848f760daa"): true, - common.HexToHash("0x484b6c49a11f01325065ca57256487e608addce93da5f92b141846ce58f7df3d"): true, - common.HexToHash("0xcb62887ad6f43b55e127736cc3b88924bbedf584592221a54e5bf3a89f319a24"): true, - common.HexToHash("0x1dd5f5b3a9c65a02ffd4dc3b4743427e8f1535a38541f5d8146c762d50c69891"): true, - common.HexToHash("0xade2da269b5c1f1ddb21c1aa4899801bf79daf19b33f94fb1706206b8726a032"): true, - common.HexToHash("0x43ae1959b1f3b0752357a3041eb0b80753d7576ba6f270e8b26260464051df71"): true, - common.HexToHash("0x2f839b36247a5c44907b186ac5dcc2eb47ad45aea13aa061e5271d89f2fdcc85"): true, - common.HexToHash("0x46957e83c62de6fb38f1201de369f1d08d1dfb92ce3c0d42ba4cd5e15f0cb62b"): true, - common.HexToHash("0x18f54e691514f72be5edc34f24ec8aa5bd0a5b5a674c47c0dd5d291c3939d424"): true, - common.HexToHash("0x6e3bec1c43cf44f49dc0ed6dbf0f48f1d16dffda5d33aceacb2096eec1c3105a"): true, - common.HexToHash("0x6322e191d1198ef87c0c1657c84323a11024bf34f1dfc221a7fde00ac0c0766d"): true, - common.HexToHash("0x1a941e5fc8b5743bfef022197bfe3eb35cf402042300be9f9f8ac35068776333"): true, - common.HexToHash("0xe4bf6e167af9dfdceeb80be62c13e884003dea5092f1daf2104883242acd2773"): true, - common.HexToHash("0x55e3b6be87d9ec75f46d40cbb2d6a842820fd91f3241782a2dd6c17b3df756c4"): true, - common.HexToHash("0x1d50d83b04a8dfde87c5b73e6c9b6e59d3d9af9e3b22a8c887af4d0bfe5e3f32"): true, - common.HexToHash("0xc970f72fdad7f3927b0d4fe843c7e20600d6b31581d96c1fc68ff989ad9e2825"): true, - common.HexToHash("0x1abbbe2f766e2db67b9e0701e4d21f260509f9129461ceb0568bdf4795855f61"): true, - common.HexToHash("0xc0fed8edd27649e4710e0023ab16206885fbec24f09e9a012e95637de9e76d54"): true, - common.HexToHash("0x80d527585ec0bd1128d29f56ba3d580b109be47b2567da01d7d3f090c1adcb8d"): true, - common.HexToHash("0xbaf4cf337f52de0dfffb4cf74949d4d3fc6c4b64ce61fbd2651df7295d12056e"): true, - common.HexToHash("0x52dfbc968306cda2951493fc9cd1cd3ec9f0a454fc8ede0aa81b70b221d1f506"): true, - common.HexToHash("0x99f7257af590ad6c6e5cde58e1fae41ca66a66aa8eebffce9660cf5d2a5ff85b"): true, - common.HexToHash("0x7a657b9af7bc1478681a185f2cc5940011f1fbbad386961ee6aee1e558f35ce1"): true, - common.HexToHash("0x32a2ee7c8309459ce71a72aa2f2e306bfe67bb44fb7526572531298af739fec0"): true, - common.HexToHash("0x2fb395d61c481ad655aaa66b49ed482bdc700e09124e87dc3d34dfcb4baf3c3a"): true, - common.HexToHash("0xdf587ead143e20701d8b580fbf53e33d4a332c7671b41375fce9194cb3f5a868"): true, - common.HexToHash("0x10c79490f30a3c76542fdfd338f1958d9d95be3ae54a58f024865213dacf3a81"): true, - common.HexToHash("0xc88907c7edc804047de5ca06b359ce0456c53b2f4c353a71207504b22b83b6a5"): true, - common.HexToHash("0x8062c557af9cab2a87f41370a61794206c953cd119970f07805a8d8cabe4caf7"): true, - common.HexToHash("0xe6be804fa765971be0ee09b64d22eed8a2a28d0a91bfb3edd1228ce0337d35de"): true, - common.HexToHash("0xf80593373186a8ae14ea8bc573cd342d5322f6f2eb0c65a39daa6697cc70c9b2"): true, - common.HexToHash("0xcf32045628380d8087096506f8a038b16f8e63bf6b01bd64c0f27a5690164e42"): true, - common.HexToHash("0x07bd7b1ca6e04cab3857bc824200c666ec442d336348bebbe3409a26438dc514"): true, - common.HexToHash("0x3b585094633a947c80b113ecd92bea03b37d47bd938feacf62fe5f6982216561"): true, - common.HexToHash("0xddcb4841c5ac0f38056b732e6ece73b6a925090d098b69b3807835659c90f2d7"): true, - common.HexToHash("0x2e99d34e6869a3be8149dfee3e77f29df5755f514961864068f89e2219147a59"): true, - common.HexToHash("0x42ae450f29b90d42ba64972c11e4e7978575ee4f2ccd681cc9803e56fab0c56e"): true, - common.HexToHash("0x28244a333bd5aca16512b4858cf73a13ba82e27f5f04f41993f5cc822374789e"): true, - common.HexToHash("0x58185bb3c3a21237aa03da9f67195ddfaa7440b63564831cf89d5c3ff614bd50"): true, - common.HexToHash("0x8bfaaa5bef006d06c7f6462d0c223ea189fdd1beab8001a20620846386a6494e"): true, - common.HexToHash("0xffe907fb192c60a367c2d3044dbabfedc343a2bb1477ecac7642795e0a31c02f"): true, - common.HexToHash("0xb10ff27be26f8af4ab64b9b6a5bfb8de71e21a0294d2984075175c5c1de71415"): true, - common.HexToHash("0xa63d7bfb8076d00cbc2fa38c9ef8a6d1991abfb383baf7fe638714af34b3687a"): true, - common.HexToHash("0xc19c0714b6ec0b2883b0b0c7b26ccb07ffc5f6a22fb3bd974f5f204fdf469436"): true, - common.HexToHash("0x853dcc36b39675e798737db50696c4c4bc6c3954504aef2f725f187e00d3d04b"): true, - common.HexToHash("0xeaf066cc6d843ab4a62800cea3c74c9c6577dcc9e64a75525d1ae0acaa5ec5e4"): true, - common.HexToHash("0x037a14acf87c3d3f5160e28966fb223f018b4fa311b035a219ef4b32bc9ca2be"): true, - common.HexToHash("0x46b082d0e8977b30b37fbaef572eb652e399e7024f3fed9f616497f3c5d2a755"): true, - common.HexToHash("0xc071299fc6c42425a93c0f0fe90b837df3a9b396faad5a317ff91c7e802c3a1e"): true, - common.HexToHash("0x90ba923ca85a441200c08833b9f86aef31b17f7fa6442e5b9b778c177314e68b"): true, - common.HexToHash("0xc42f7e9b8bc5ff795ba71a305c82ddbf92b56ea4da837896a1fd4818e965037a"): true, - common.HexToHash("0x60f918dade1bd7c5bd214ca9a3d46313d8122c034c61e65bd7e767a7d0a7e72d"): true, - common.HexToHash("0x02fad160494a118ac99c82cc88da4810373c3cdc88402f3776f370224ccf4591"): true, - common.HexToHash("0xb152cc9113ce4f76ac10a1d35ca696c4cfc3aa634e47df481067ce26b4c0aa99"): true, - common.HexToHash("0x6250f721e634df31236d4825217582dc33105afa04167463d8423ad052248968"): true, - common.HexToHash("0x5bf97d8779483e8a940e4571f614ac95e951010053df02869881bc0a39115c9c"): true, - common.HexToHash("0xabccb023b1b48f7fe94e5931b55a7b3f980ab1fee4916aba97dc81468ad99299"): true, - common.HexToHash("0x05ed5be3f8322ffdd920d3b3eca67335200627223cdf65d595884f1605f449c2"): true, - common.HexToHash("0x85c0f21864f8b1b68abf4f22db3ad46496e52174c9a8123b654336591094d70c"): true, - common.HexToHash("0x9a4ffd2832346bc9e65bc26ff349575e4824dcb1dabb98df539a6fcb406c4f99"): true, - common.HexToHash("0xd06c4d9c0592e6a3b3a35c8eb13f1ea1222330f5893fc40e6316421448974c69"): true, - common.HexToHash("0xe2960eb44d83946ccd20358564d4bdeb8dc6fc29ae9f555e5f5c94580de0ce43"): true, - common.HexToHash("0xf3b98329dd8e5b4090b7cbda80d9b78e6af07991d78bdf90afacfe5a46dd8f70"): true, - common.HexToHash("0xad3f459532840caa8aacf82195daf9164c6b12dd22d817277e197738753ebff1"): true, - common.HexToHash("0x732beb7cbf5d7661ce19375977bdbffb112b45c2114b612117f32fc0d0d0679c"): true, - common.HexToHash("0x3deb87bbff42acaaa4357b3bce9e5987d5410088bbf9b673198c6c98c9a81e5b"): true, - common.HexToHash("0x1e1df82d2634c015f57bc928872f6aef64c74b74261050c1efcba1999fb1911d"): true, - common.HexToHash("0xc975c66f763efbab1bf5b8c5f2e5c07bfbea02a18315459c15633198d3ea7ddc"): true, - common.HexToHash("0x0a97db4f86f1672e829f543e63c5a097097e7395abe3b438f0fd59405ca7d040"): true, - common.HexToHash("0x0b405345f11599e8bc8276ac064be82ff2156c025d96850b20be7bbcd6663aa3"): true, - common.HexToHash("0x06e62b5509c44df9fc89370ee01fde4c71c48695c49ff48a41da943a1e3d0408"): true, - common.HexToHash("0xb486eff69914c7a087989764e36360a588ac265d9bf0bd47e576587bf12bec51"): true, - common.HexToHash("0xceca0b1ee2161f9b1541c92bf312285d0a2d4d6112b29bb23f36d18c8b205fe4"): true, - common.HexToHash("0xd27dc186c064651d235cdf6a36b695fad578ccc71801a972e10d9cd5868c7e69"): true, - common.HexToHash("0x0079d3ffd5aa39265c13ab27d0b53af15a91fdad45ee037897383daff477a0e0"): true, - common.HexToHash("0x0bffbdf8566ba5616bc44dbce766d2e0482147a86c0622c25b4bbb6d53b1cfc9"): true, - common.HexToHash("0x9a84525f9153d333dbcb1ea47bce5d88e8f9d463463000b64a72c333534c3825"): true, - common.HexToHash("0x26a72f1298b39181b9fb708e4ca284c08a4a2e434cd14a570ab159b568c23d82"): true, - common.HexToHash("0xfe4bb3b83e2089c3224b79bf4ea2135a4f498b13744e620cb8f1692bf77699a7"): true, - common.HexToHash("0x0aa71d5e56f880ea397e460f9138b943c2f42dafa8b132aaf348e0db8b7721c4"): true, - common.HexToHash("0xc23c96481ce478544bf29fb1a240f6d1507476fb20a552253c5ab67d1b07aaa4"): true, - common.HexToHash("0xfec9e227b98d0b25ffa0d2515a706eef8db160454c9353a57fc74d71d532ea1c"): true, - common.HexToHash("0xb30767c64b880c19a4c190f277c6cbc553da31508ea2278b13808dcdc14f09a5"): true, - common.HexToHash("0xbf8309b20c2279ebeb3ba208ea6657a9dcf1f78ea15c4a8bc956df2e7fb8a42b"): true, - common.HexToHash("0x6bd6eabd9b5757d6ddba2f41d1ab00ff234362e5df077acda45a17bab38a3c28"): true, - common.HexToHash("0x3693ab56c233f571a7e83374286d02d7295db7ad6a733cfbb799194311e49fd2"): true, - common.HexToHash("0x012bb68fd7f0db8c07beb62848d25b9c04ed139d31b07c7edf2941039810b777"): true, - common.HexToHash("0x8d14fae6967a845d4a53a19bd3c78b5de21044f63c675e903584a1619dcf2c2d"): true, - common.HexToHash("0xb00610a045fb82b92f1242fff82d9abc53828b3c1897fe80289d4fe1bf6c15e9"): true, - common.HexToHash("0x12b93218df06fc9b8c4d10f5ebafa64a64a1a5078725b523ee222989370b6ad5"): true, - common.HexToHash("0xf19bedab39dea878941f35b7a0765e22a36f6632e81c92fff448b750d94cd548"): true, - common.HexToHash("0xa7849498bbba8f5f7a3cbafcc77c738a0c1bb7009a92a19d6a8ea73882dad121"): true, - common.HexToHash("0x18f4648aec6152eb33a910c65c707243bf4bce0963e2a34d57c8986b8244747f"): true, - common.HexToHash("0xc1decc89cbe1cc20d5e62b5a15b57476b296b9122631fd28dcf24b4d43b6cf21"): true, - common.HexToHash("0x5f40bfadcae43580c3ed23d245e0d39b3098f37125689d24aff72559726740a8"): true, - common.HexToHash("0x102e3382115a0709f6f7b0acea5e82af65289e5c488aa1fe1ba90fdc55c408bf"): true, - common.HexToHash("0xd957e7c702a053a08067310688f939cec5980c675912e29c9d582ff2e3aad747"): true, - common.HexToHash("0x90838d3fd9a9a49977881f332434e17ac1a43e2ec697439a4afc19c13a71737e"): true, - common.HexToHash("0x2b37729e7ffff97a74be89dce709e3bb6c589d8ff88c7055f222fca87fc81759"): true, - common.HexToHash("0xc7055ff6946630b969dc3246e0f4aee0623aa00fb168da893c38ad0ccc0ef0bb"): true, - common.HexToHash("0xbd0a31dc7e173aca6b11129926d9e47e62a66d7d0e9a43fe64309f88620d51bb"): true, - common.HexToHash("0x5ac856eb52d72ae9c7ec187305cac12b28c7a462bf61737d19615eedb59e76cf"): true, - common.HexToHash("0x66c763cd51121c21e51d21a1d5add0f40a7c05826ce97f0f1366d32c46380c3e"): true, - common.HexToHash("0xa3b2f68ac49f236fcac4d38b5071cff272ea160a7d48de931c5ae71ab0911dc5"): true, - common.HexToHash("0x943dd2d0a70bc063b196c078133b35329fa528877cef2d4d20ad40331d7c5637"): true, - common.HexToHash("0x602850db0cc3370333a594ee5d061cd54988dd5372c04a527613055f2f88001f"): true, - common.HexToHash("0xf43709079331d02d5370680c23970b6f60e04a3799e71920117026c2a14fdabc"): true, - common.HexToHash("0xb71ff0859deed7a1dc9f3debd7a9d081ea2f7070f1a180488acda5ec0b5ea9a8"): true, - common.HexToHash("0xc91e301117bf50a9f5ebe8fdd14101fc1f58972702bafc2f4ba10f996db3c6c3"): true, - common.HexToHash("0xf9414adf03b9df0678ba2f9434ee5e771baa8eafad66ec7b879e168fb51027c8"): true, - common.HexToHash("0xed86a6264facfbd7fb9bb8598fd9d3a58a3608f3eae4377de91f3512de489ae1"): true, - common.HexToHash("0xdf80e3343b91700c754478bee91fd2921e4a749606b69ef567d6dd98afb20984"): true, - common.HexToHash("0xcade8b1ecf38024e948e4c364de9080043b9ec38a0c5cb8da36dd45512692201"): true, - common.HexToHash("0x773cc9ac32ae6145840fe37442db87d62e608b12ab28bea92ac83a2f00bc14ab"): true, - common.HexToHash("0x442f94d932e1e4734a71b387f3ffc90764c823c9e9774269cc67869dc21916e3"): true, - common.HexToHash("0x91128443b8dfe5868f5a6c4b8042d5a2193576bf101a301d50558eba56fb5fc3"): true, - common.HexToHash("0x4e14185b34b45eaa44b993a12265a20036ca2bcdbb39bdf9e8cb4ac984f97eea"): true, - common.HexToHash("0xa016c270044b6fb5a840a8dc353d52b452ef761ec91fc76421e3cb0a13f30d3c"): true, - common.HexToHash("0xb414c5843c0dd1bb922cb4a0abda74d69cfa77efac3a3bae6af2f0ba90b57e1f"): true, - common.HexToHash("0x7046a14db80485b3d77074bcb0ecede7696ca8cc6f56eb69bab6948450583679"): true, - common.HexToHash("0x2c0a8cf3ae10fc25540dbef4391d3e9250eb7eb69a352f6668b81f82896caa51"): true, - common.HexToHash("0xb4b93a867dfbd1bd979120a87a368b55335e88712d808b369d73a791e699a0d8"): true, - common.HexToHash("0x81fdaa0afbfc907d941316bc5bc47797c80559df9d890348f68634bc9cda3091"): true, - common.HexToHash("0xd861ab0afa4305af383e0f7773e445fdbd6179c98accf4dfc4424e7a438a02b1"): true, - common.HexToHash("0x098230976413d41cec87be1d2529c84ff53fa0a83e9f04d8baf034ec77bef02b"): true, - common.HexToHash("0xcc3f6eed7c457d9d727860896337dff4011190851797ed5b9ee4ac0036bae707"): true, - common.HexToHash("0x85c0e8d3b1d3555135183e77356dca7d3acf64840734470fe1fad8cfceec8189"): true, - common.HexToHash("0xe9f34adb69a9b432722b197bf31b398638815f021ff82537c68f3aa9eb449594"): true, - common.HexToHash("0xc806d720b3c795d0382da8365fc636b7d25067fc8948c8a08cc7aa9e46cff5da"): true, - common.HexToHash("0xbed1ae64248570034df31414cc48df345d8a2c1d5b57f22314fdfee2f81541b6"): true, - common.HexToHash("0x7d7ce8b8597f177f709fd3852c3a02830dbcbfde3a4cc41f5781859bd20fc360"): true, - common.HexToHash("0x1f98fe0e07fb255f403b6e20b33d957ede77e4417f8ff455d1dac1002ebd2e29"): true, - common.HexToHash("0x9fe313c11e7d30569fc1955272a9c4016b4fe391b020cc8ed79ffa203af84319"): true, - common.HexToHash("0x6a4b1e0a1b178be02253acf03085f18f1810a675c2d1db17e5c7ffcb0304e0b1"): true, - common.HexToHash("0xed4f1ffc7afbe66d4912b8f600536c29fd9d2801aa48029e327f33023b51a83a"): true, - common.HexToHash("0xbb31866d5b7afee3ccedf50aab3e4fa893cba77df52ac7080654b2090875b937"): true, - common.HexToHash("0xe3075ff688195e4e4f855b986643730fd95e2e6f36442a3f7447a81ef72b580f"): true, - common.HexToHash("0x6b700fb02ea5f619902e3c104c750869345126f6b00a36d37789d3bd92a68f86"): true, - common.HexToHash("0x4a311f9b2b4c82b818635f33c74da05ede58eeab07403a067d8e58fb472df0f3"): true, - common.HexToHash("0xcd971e803787f364f773157a765e7d6ff0cdf91f85c0212b3ba19a5b079314b8"): true, - common.HexToHash("0x3e7be9ac94607e9e91250fd161a00f25fbcdede81d72793716cd801075c885dc"): true, - common.HexToHash("0xfe4b2d6aa6c095bde300c20add4f6e39427c88b163a76885b20639722c5256e1"): true, - common.HexToHash("0x6512b1932d9eea9dd62c0b86b195941b0cb1acf0271853ca16387dc48c478868"): true, - common.HexToHash("0xfce2190cbd1fa28b4051aba426c2cdfe49a16ba38b69eee22aa5fcb1f8098a84"): true, - common.HexToHash("0x5ad6e6c6b230e62c588e42f969834f28558236037e2331d88a2e5f316d2aa848"): true, - common.HexToHash("0x260f6f660dd02012bbd1d599a8ffab4203de44fb8147ba0a5c0f122cb501b095"): true, - common.HexToHash("0x0dabcfbffd69bcb9020a258e26f3a81cc85fe768e3566205d7f2965f857ab89d"): true, - common.HexToHash("0x49045511a8cd7ce81b9f9485e21ef2112fc29d0d6b2085f195f045f72bf9536f"): true, - common.HexToHash("0xbe76a67b75c04368cf4761646e32789ce73c5ef323bfd7b220b8c7c659e2aea9"): true, - common.HexToHash("0x90703a23ba454b3d3a698452f5e3b9f5a7dfa3790ab34f119e1515a867c734ec"): true, - common.HexToHash("0x8e3b5e0169dd6fd1a30e5023bcfbb43a5dd2cedaf04732e68732018c0c41b874"): true, - common.HexToHash("0xdcf2c0e31a09de54e35cde68e3865c8dfa1fc5d1381a608bfa3661180836e77d"): true, - common.HexToHash("0x1b0a55a201e36e40bbdf3b2eedf538a55d7e95587d3e1796dfa447a400dca4da"): true, - common.HexToHash("0x3e8e4056167dcd78668042e1d8dd792872d94aabc08501d3c9cb29ae75b727e7"): true, - common.HexToHash("0xf7797481a92e462604556d3468f9e8413a6094b838d76e7b966fb5f5f898ebd1"): true, - common.HexToHash("0xf606acd282eb15d70da3daf791a793f5ab254cad9ba070946d2d373ee60e512c"): true, - common.HexToHash("0x4089f2c2e21ab0824af40ce15461aa065b05569140832d13a3e3698af6d6d86b"): true, - common.HexToHash("0x91dbd6d84905463a2e75caa9d665d5ce6c4bd0489820f636240d50afeabdadb0"): true, - common.HexToHash("0x6882b7e93e5b0b898768ed0a5115b9e7ac1f8b74ae8688fb0b3c115a8062f2c2"): true, - common.HexToHash("0x18a4a724f87945c817020d3672acd0fd518e4758cb1c5c6c6924d6fb47bcd1c2"): true, - common.HexToHash("0x67f1cba2ed9dffb2c4967a2ce581af6c98f296637e110de8d26b361f9fa44791"): true, - common.HexToHash("0x3b66730b5d3de9422e53b521d67b1c479a40bf169b2435c288aa5c1af63f34fb"): true, - common.HexToHash("0xa3358eeedd11201d2f05fbed47b81059f66e447141bd6f5de6d85b5f2e48c0ef"): true, - common.HexToHash("0x7f2dafecc7103eaf711ffc8cc48deb3c486e503709af7f0e9136b9fd4fd1c3bb"): true, - common.HexToHash("0x3ada4ef9b7dd2569e926b4bf35e7ffa637de7ff5a1558e3f1dbe15640d7c09ab"): true, - common.HexToHash("0xe7f79fabdd3b60b859e10789533352d196843008ebb6dba03f50c2a3904a3f12"): true, - common.HexToHash("0x493d2584eccab12eaf430322fa5ba5f42f4c1f720ba39df098469a50a6c9b35e"): true, - common.HexToHash("0x1ca7b67ac4f26b3e70d6898fa5b2941a2f5736ec84a1dc58cf3ac3782179febf"): true, - common.HexToHash("0x1d8b87f45e7815a24ec862a1e16bd92d46bb5b84a8a4e27dc9eeb63dfbd98cb7"): true, - common.HexToHash("0xf610297d5ca5cc6ade53a5cbaa43350893120c492958fd7755c9649acb97d672"): true, - common.HexToHash("0xd6b334692ce9c1571a06a7e1f90b958796d0779934491be48b35f11cd50d779f"): true, - common.HexToHash("0x0feba223d57e3566f0803ab91a50f925f1ac06064a51a9a1e5ed5e29ae9ca839"): true, - common.HexToHash("0x4625985b62dd6fec2d8faa0a4cb7bb37ad28e41ce668c95a84149ca246d8541d"): true, - common.HexToHash("0xb9f7666076d7b21dc9638bda8682ce9684a610a2a6c49773bc87cdb3e7fb315a"): true, - common.HexToHash("0xe87fe77d6f505462be8b4191e1a334a8e5294f4331c7783bf43e98fd95fa3cee"): true, - common.HexToHash("0x9a6f5bb25c50567d168956303faaaeeed776965acafca5599ed306d873199673"): true, - common.HexToHash("0x1e9c0776de4c0c72dc17d038ca9750d571ca9fa6d99335afcd56c52d8fbe87f8"): true, - common.HexToHash("0xe5e54adbfeef5e9ff1a2849f130376a51efa8aca63e5c54f0e972d15a00fa700"): true, - common.HexToHash("0x92acc51767e925a9cc5d6fed43fe5c5c18e6813fbe5950743ac8d3a81a40b774"): true, - common.HexToHash("0xf47195565bab31e559261ef2ceeb9078acaddb7457709b426b92424908148700"): true, - common.HexToHash("0x0fad2de84d4aeb9ebb30027fa5e924ba84d6b3ee6401518f42978bd3d07a4df8"): true, - common.HexToHash("0x1672b02ed756d67898ca3043efcad1e8cbcb52dced0707bc4adde4cb32d2daad"): true, - common.HexToHash("0x01c722837e51a53636c594d25030e94fd3c533f2abd267c8dd1cda587e598d31"): true, - common.HexToHash("0x68e9b32274b30e1d2cd8480d9ee1b75c57d81b9982674d2088328de283fbeb26"): true, - common.HexToHash("0xbfc039ab17c9b0e3264c8e067c3b85098a7090942ff3c14b97eee3b04fbfeca6"): true, - common.HexToHash("0x11a855760a243ba597d45ed7d8e807f84cd48eca495fade505875170781b62f4"): true, - common.HexToHash("0xc870be7bcfb8d6692acbe5546e852fb7856f0c2dabfb32c6b000f2f7f3b96006"): true, - common.HexToHash("0x5bdf8df356fdd9e4029618b7ceea39b000a01e1d4008a73ebfdccb3f3a8bde32"): true, - common.HexToHash("0x2249a9475148a2bc5fc4f439350a9039321b13e13e03fa632dc36194721e4d56"): true, - common.HexToHash("0xfc0937881d096aa30610bdf9c3063360d727494da9221dad81f6c0677f99c322"): true, - common.HexToHash("0x7123aa1b3db83aaf6ac029ed37fe4649d2ec08bf96c14d217a821224e9d1d4df"): true, - common.HexToHash("0x7dbc7090be652dcdf93c9aac553700c03c3602e690d7b4c4ed726fe6a45dc1e0"): true, - common.HexToHash("0x870ef6a08814d6588fd2fee17fea5303ea43f54d611207de72b8d875debb5a79"): true, - common.HexToHash("0x67def45ac716e72843ff3d3ca1e6a505774ce97f264b9b27932f6bce4288a2cb"): true, - common.HexToHash("0xb2130b025033a08039b24111a28913f1b784ce18702ee161b96d06946bfaa870"): true, - common.HexToHash("0xd110783ab58e1154d561fc9bcfa01633f2f5b3b85090f0a7313d9280768c5f36"): true, - common.HexToHash("0x86721af56b15dc5a2d90816c60df810d84453684c19c9dd45d65c4be8dc71c6c"): true, - common.HexToHash("0xf9bdd860be9eaa63c0f11c26daa5cedbd91a937501527c7ee00b11308c71ed88"): true, - common.HexToHash("0x9a1ebebb24f8188def63fed7a480afb0014da0687ce799de3fa3c7143d22bd9c"): true, - common.HexToHash("0x65153b420840f521088919b9bded8f8f169f30da2df48edc1074f74153733298"): true, - common.HexToHash("0x410511e66a15a395cf2729aad5f7dd3fceefe015b77b33f5d803a923f7fe532b"): true, - common.HexToHash("0xeb688aba2a4fddc005554b727231f94c3e31d233120fe097f3d720730b351109"): true, - common.HexToHash("0xf30d482c334950e90eb758494ac2a71c3848589cf38a2c1489c9a5d8b9ec3c37"): true, - common.HexToHash("0x989b9f0ce4f5c81842440cdd426139cd7570fd2ebcc67097da6d4e31e2534b7e"): true, - common.HexToHash("0xcffc550c42d26a194979864b947785732dee48b21fc4de06e2bf04efe3c68a84"): true, - common.HexToHash("0x4fa11719371a5cbb799f0688524204e054d35685632cfccca15dbe57d62b933a"): true, - common.HexToHash("0xd8d904ae0efb0987c5a048c9914257e61cb3f3675c7d31eac6bd62b2e4c288d5"): true, - common.HexToHash("0x6876b46aff202c71efd9306edf480732790f28e4e3099f7511f32492792e46ce"): true, - common.HexToHash("0xa5ab837c1fda725eaf5518c6bb814ba6a03eeb39cc72c67450365194a732be8a"): true, - common.HexToHash("0x992d4f7dab7e37f9de12256bd8cacf3f84d635eb29883fdd95bd346d18adaaf2"): true, - common.HexToHash("0xb0eb083700863d8925003ca7b650c5733e0333a2c7e6594beddbacdc0ba5f948"): true, - common.HexToHash("0x40df9b56bc4081c25eb1a49fcc23de20baae2db1d82d312b238d2fdda8f6e766"): true, - common.HexToHash("0x0e125d233ac6c12c772f1029d66032be0a45b34f7771f3e3b2a2333c660adca0"): true, - common.HexToHash("0x53c002d80e4f168cf7a7d9af00f60b4b464880e286545c1a5cb81be391845543"): true, - common.HexToHash("0xb3609bc2fd3aac2ad3d70780c64e6b59e310185942a56a2c38c4e446e58434f2"): true, - common.HexToHash("0x2ca92d3ce8573f80a9418286dfcb53e7890483a5bfa6530af84875a9ba502485"): true, - common.HexToHash("0xcf9248d718d5acb27ed2c8fe77ff4ff74438492a3587e8f2791e5c6bd656991c"): true, - common.HexToHash("0x60b2907071214f19bb3c5f9ca9e46eb5e127ded7df16b083cde780c5d45786b3"): true, - common.HexToHash("0xddf99011112d40922d6bed12f716e8fe83fe1349116127ca39f28f425b39bcb6"): true, - common.HexToHash("0x90fd2de39e37c9e86ef0695fd211e7eeeb4554ea65b49b913ae6a552278fa731"): true, - common.HexToHash("0xa3d477b3f98b211a04ff7c53779c23a784d34922362367126da406a66bee888f"): true, - common.HexToHash("0x9b1ed0feda68b634bd5c28b179324ca4d5357b9397da60fe6d5aa5853e976627"): true, - common.HexToHash("0x1fe72f06f356de5b7aabb9fef8bee3915a4895e97ad394a8546c40ffe4735896"): true, - common.HexToHash("0x399707275e97ba2153ddfdfd7662bf5572badef91f4d3ab9fd1df3f671ec4f00"): true, - common.HexToHash("0xa448b9ed6ec25b8dbcbc57de086c9efdfe10ea88681cc3492e39590bc0c8a208"): true, - common.HexToHash("0x1acb69effa3ceb117f13c74ca893a96e7d4265f5a5b0b5925f3f34bf21864b54"): true, - common.HexToHash("0xe92685af3e80d3b73384763b033e8cbc08c3ba6bf89bd9f3a94d4cf2843af4ad"): true, - common.HexToHash("0x8928183886c0d9508f3af21f4e0089dd63aee554f637e050a8894d7a1d322e38"): true, - common.HexToHash("0x28728d4070bcefda5f8e861b85b5a084e2ece3b5ada831b65ebfff63031d67c8"): true, - common.HexToHash("0x468cc3595a72e9678e71ecdd2bc94e4b0c20c35818f32fc38843f9d03311a93d"): true, - common.HexToHash("0xea926ee320df23c8720e068916fe9680ca75864fbf377ca5dea40b68583d62c8"): true, - common.HexToHash("0x453c77a4365104fbffd269da557d9296f6a8a5ce50006ff3e529836bf98502c9"): true, - common.HexToHash("0x0f52714258b1496e067efe3622912c54634a60339816a018b1739c31669ed8f8"): true, - common.HexToHash("0xc16982e01e890cb1dfc0eeb0084b9b87b77479a2d46fa07f5d320af2500d5d6a"): true, - common.HexToHash("0x2537742c658387288f34c60617bea39c6d4ecb740bf9d7436fa47c52d1fb713b"): true, - common.HexToHash("0x677f7901f2113b26a7e0db9237c6e46b533f8a8327988a2c6e77d66dec1d4bd1"): true, - common.HexToHash("0x41abe19921b473cda20b4a915acddfedfb756da2ff8e7d6e8c1ad8095bac6d41"): true, - common.HexToHash("0xbba491a1b89cc1701d0e254f2e611efed77039f481716ef90fbb9726ee57811d"): true, - common.HexToHash("0x56124c4615d4ad7791504aaa3f9fb6d1f4696d7d9b74c948675dc286551dd8f3"): true, - common.HexToHash("0xf452dfcf1fd910cf7aa6ac423492e7ab1ef218567500b1d68a540cb01057e1b2"): true, - common.HexToHash("0x3ead5e08e994346a1b82b4d10f463970bb704fe93d371ad890b96d82dcfa0882"): true, - common.HexToHash("0x6b24eeadd90d18704e0f83f7db5b4a9a5bf2f619505bda91a8e18ae4d0fa2700"): true, - common.HexToHash("0x4dab77d3d02818ca74b54266eeb6af721928e384d2395c80a676942cfbc4cb25"): true, - common.HexToHash("0x4cd3b4d9aba39b7b4efea9c5e0f3e07e723c2388447d5d2ab1c8afc1fd9ac14a"): true, - common.HexToHash("0xc0010b158b4fd0af66008a5f84c267ce027104fc64f928973511344ca71dd595"): true, - common.HexToHash("0x07ef969c5280b17a1d00f98368519c0f9d4b75b6ca139258a5ad453cd617b884"): true, - common.HexToHash("0x5034fc7000d6a684bdcabdd1995c87b36e3bfa68b51c61c80426a957dcff585c"): true, - common.HexToHash("0xe370cc294ce48451dbb4262d98875e43830a479e4b91038921ba062c5d42ac89"): true, - common.HexToHash("0x4181e024f339b9dae0909042a0ee209123ebc37b01551937cafe5b9866d341fb"): true, - common.HexToHash("0x73f2ecb554a4bf64ce1a8009eab16f03b14a13cc71d0908ad8b1632f5ad2b21e"): true, - common.HexToHash("0x69047c62ec3850af4d4515a8660e5e64d65e3d451088ed6b096ada42527d3024"): true, - common.HexToHash("0xa446e3a81ddeaf3b33fa816a5d939aed079ddf1d8f01cda87ff4f207514da5cf"): true, - common.HexToHash("0x4cdc6c2025f739919e4ad7820defc7a141806cf430031527569c6edf3005692e"): true, - common.HexToHash("0xe45341ac776355397d5c9fd438d795c007c6f10d4dceff4cfcb3651221fdced1"): true, - common.HexToHash("0x8754ed0c8442afbeb2bb2127d0f2b30a938bec60dde74cdb2ac51cf11f4cbd30"): true, - common.HexToHash("0x64234f8298dcacc9641f5d985cd017130ba154a8f6a035ac7ac8d361cdaef980"): true, - common.HexToHash("0x33dfa8984b962bac5e4a17f065389f2eba65f0b1434273d2edc20287d5860241"): true, - common.HexToHash("0x01d1954c120d611d7edd1088e65ff8f43050cead04d4976b50bdc983565389a5"): true, - common.HexToHash("0xddea45ca90b955fba9a46aff66689b7b853fbd8fcf648798c1f4054612ea9964"): true, - common.HexToHash("0xc04db740c1738198ce30fe57d375bc7a5b6ddca6db2e9875837e14483aabf6b5"): true, - common.HexToHash("0x1fef17080bcea396c9d3d366b2151c5d3571950107c7b931cbf99affa809fc34"): true, - common.HexToHash("0x3938e8cb0f0ae9cc81e93c05682e11d169e75682f34dea7dca27c1a4b07d519e"): true, - common.HexToHash("0xcd90c9e6eb6940d31f15732dd4ab9c038ed631813ee0cc470cfb5f6989e1bfbe"): true, - common.HexToHash("0x9381dd8ccdb25b59a1d5ca18471c9abbd624feeaa654eb5f65494dbdb1cc73d1"): true, - common.HexToHash("0x0da761c369598f1b2771fb41e8862332ad641592949d779386e63f0bdb6985fc"): true, - common.HexToHash("0xd8d63f59afef3fba94732e0914c50e5ba7c51e11c49be9c8770b2780b57e42a4"): true, - common.HexToHash("0xc19dae29d17d2ed42cc4545517264c46567df2e9e02c9b027630939b6be13c28"): true, - common.HexToHash("0x369fb18be9cf44d6ba929634ab1e23a950fe9fe09955711ded0a12c943d5c75e"): true, - common.HexToHash("0x7179f84ac71dee934f3f7765e1a6a6640c08869fb3efc4ba29cf28fb4fc1b1a0"): true, - common.HexToHash("0x941e7fd5ddedebf5933358f6a7d15861c3f24ca45bc13decc6599b38d46082fa"): true, - common.HexToHash("0x0649026cea10128770d236c9ca4d6f353a4b99d7ff37995b14d51d8199e82785"): true, - common.HexToHash("0x3b75e4d6efb05fd9ec4c92adc96dde4a9483419c0418a83d42ef865b1c4d9014"): true, - common.HexToHash("0x597dec1af7c6b1d4b40858ee1cdc90f56e7fa1cf0dd21058ecc5220f33d852da"): true, - common.HexToHash("0x7d4c3b1b140172a51c4c5ccc7d27debc7e57bc98e29196600e62d5e6b71e111a"): true, - common.HexToHash("0x818d754b5b30ff442f2be2c554080f39ecd696c8c6e269310854ccc56ebda843"): true, - common.HexToHash("0x5749852cd6b578cb6af85c357aa95a642ff5fa29ef71fdece0a3718062476091"): true, - common.HexToHash("0xe0d4d9708385621ff3a252b74e0615025cd66267f2d4c00737ba359faf4e27a3"): true, - common.HexToHash("0xb1b68bc91a9cbf19e3c1f9e01c3f8df362e682f92d96bce80b022c3b84830827"): true, - common.HexToHash("0x2d8183591b99da420801ab7f1c202422bd8a924ebb853eb0d40ea2900909accd"): true, - common.HexToHash("0xd1338b21e76500b5d49dbd2a59c9273cfc9b835a4426ffefe7d80b3c2ed06b64"): true, - common.HexToHash("0x77db20acf557890ae53ca3ba5cecf274b5cc1cb2ab2711a7460bdf181c18c437"): true, - common.HexToHash("0x1595ad2467ec4fde165c83fdbdcee1a3b8b9491ff389a98b91a32caa4d08d5f0"): true, - common.HexToHash("0x507205925a4e2c7f72dee7a082ba0f0e47b9d67b97025c4acffd574500056c3d"): true, - common.HexToHash("0x13a11d812f92fdfe8c0c7c93ef5c3da544d0179c66fc21039086f6c96802531e"): true, - common.HexToHash("0x1c9a07eb22240ff863d36b28220c23560742c0d228b3fac0e991167ad3ae7070"): true, - common.HexToHash("0x7f8dd1412f30a119b7d60de190c59ff5b4d65e9e785d93039ee2ddbeb2870062"): true, - common.HexToHash("0x538170924790403657d8feafd148c4bd2546b1f8d08bef378e3b98ab61337bb2"): true, - common.HexToHash("0x882c0003cd9133ae405ff21a5dc479d753f89a0acdf6412b9ba1fa992f28d075"): true, - common.HexToHash("0xa8a13314d9ee7403ff4ccff8ff98480f166c48ec5807cd6cc1c1bfdfdd91b4ac"): true, - common.HexToHash("0xe9ead699fc4723c5718804bb8ed87a9dea221663cc27a52535c83c7e1d505342"): true, - common.HexToHash("0x41bc72e934bac32aa9f28cf865a9ae5f1dfbe591ac281e430b1003eb05d207fb"): true, - common.HexToHash("0xe3de77f8e105dda325d59e21964e4a32edfbc163e495e2ce1096a89d514e79d2"): true, - common.HexToHash("0xd03265cda3034668d4bcb5a0c0eed824002d515b5d414806489189fb8f99a879"): true, - common.HexToHash("0xeeb9c89803acefddb806f74167b0e3c57cd1d3bc4a58153a4bb296888f412369"): true, - common.HexToHash("0x44d7d8b68d83ad478029da24b4eb69b3edb213e4994538227e94ad18cf11398a"): true, - common.HexToHash("0x48adac52a80c447730d71274002d522c4aeaf4ee50ee608e330a867eebb3f189"): true, - common.HexToHash("0x5f1b221016ec8227ffdd64e84a00c7b281fca13c2ba6a6eb072ce483de2073df"): true, - common.HexToHash("0x911d12b86c06625ee631599f4e8558844b36a0a6d4c46e977f41d6d62a5a5e80"): true, - common.HexToHash("0x79ce41b9359c82c24d0f3e79c15309c8f0c8ca6d48c6ff82a5bb137b1bb82354"): true, - common.HexToHash("0xd6c51c3403a05860506d390b6cb59eab5e6000da5211e87acbe4062b259aead3"): true, - common.HexToHash("0xb4c1b637bacad4e6f3ff186b57ee262d1d508f1570e7262c6e2d508eaa369e54"): true, - common.HexToHash("0x73555567f764992d258ab1cfa3c74279adea842927d6f45383ac48960ae266d6"): true, - common.HexToHash("0x795918c208f9a27d08a71d9a4d3a29a3445e92394725a5344fff0b74158aaa13"): true, - common.HexToHash("0x37c8d6250bc625a38a96da764f56ed5533b4c5cfbae7e99937471bacaed0d8ab"): true, - common.HexToHash("0xa21066beecdf6623e58e2f8d71dc66bfd050b5847354a28e20ffdab2314f1c93"): true, - common.HexToHash("0x5bb113e87b0f66f6db3a62cb3d74ff8ed2797176760c3c2c5b491a81a1152062"): true, - common.HexToHash("0x30e726208f3a8266f768ed86109b04a22ff8b390e508315822cc4e1e939e5e02"): true, - common.HexToHash("0x5037c92c5b6ff295be2d83a8a7f05ef1e7d40b3d0fbcafad749529d2dd2e5fa8"): true, - common.HexToHash("0x6675c5b8c160dedfb6439a20bf74a532a7cdd6c2befe766f7d11dfe8bd84a0f2"): true, - common.HexToHash("0xf6d02c8daebd183b11fd58e9df28c9c04b2419f1e88f81b877a132668361c6a8"): true, - common.HexToHash("0x24c4587fb9a5a8ec66cb112e1162ebe483ff7d44f84c7461252f8eda7165ca74"): true, - common.HexToHash("0x8fcee3dbf3076880c49d916fab2b9aba43a0401d59b1c274384d29277fe33e04"): true, - common.HexToHash("0x2d13e8ee71d88bd0fb237e67c4754648fd3c01e49cba5cac83f530b7c54333a0"): true, - common.HexToHash("0xfb772291809fd35690d42dc813ef73b934bac6825da05f63e74f28211ddc34d9"): true, - common.HexToHash("0x741313b3f5aa05930fef726a5902ccd79af59a65bfcb8e47e424960e39cc6fb3"): true, - common.HexToHash("0xb7e384b2ecf372b2870d23859eef5b808528d8460f2b83c24b64f85d6a413162"): true, - common.HexToHash("0x38a6f57844b716ed5fae2571014d1b35c08a04a7b175524b53b348e60f3739b8"): true, - common.HexToHash("0x220aaae8bf020a3ac963e944f3c5d4684aedab74f782a8bb2181fd060de4ef5b"): true, - common.HexToHash("0xb3b9817a7352cb3d6fbcee8453c99c3aae3c4cd9721a13810514efa570fde9fa"): true, - common.HexToHash("0x41d95f539c505ae2769bc05593023d7d9c44760b6a5185fc56768791041e430f"): true, - common.HexToHash("0xbaa817fb822569dc8cd5851cf87f85a45f82119509053b9c0558d08f29306647"): true, - common.HexToHash("0xb8a57691cdf5c6cb7b27ac033d88e1368bfe9dad784e1335838266b14294d1d5"): true, - common.HexToHash("0x524329d11ddc6fa43a66fc55ec2602d6d123de0c9a99b4c9c756db86be3a5a6b"): true, - common.HexToHash("0xc6b704efc499a92e32aad191957bc35d66295b43b33c6af26500c554f42e0b06"): true, - common.HexToHash("0x2441b3a0b4a38ff20566bc6a980fc1ba4e5335e268f21637361649cce5ece21b"): true, - common.HexToHash("0xcafeaa73edd48b53c3b5c632e3763f305c8a584eddd0b38fd26e18c87b148290"): true, - common.HexToHash("0x21b635d79a078dd3c9d0b66746370f221666f44dcf3a49a96e31147d96fcb294"): true, - common.HexToHash("0xc48c5ed1ef272617f74be838e1f779b93bca6be1883ca5ab9c87acef31995df6"): true, - common.HexToHash("0xb443a87801ec8dc3e8c1ae9202cb2ed96ddd36d15ba178a245a42667ad4cf67d"): true, - common.HexToHash("0xd0fd62b9bc3776e3584c3c8978e5d3541951aa2410842a018741882ed0f91530"): true, - common.HexToHash("0x39c8fd919fe95b4979165719dac34ef9a591db248b711b6d27c1b50f4aa52679"): true, - common.HexToHash("0x95c861b60e29061e46134b9ec5718fcd79470f59b5e0981100e174450dab6b4d"): true, - common.HexToHash("0xfbb8957fb8e9b9b796ae1c7660eddb262b6f971cea8d272c9e4c4ada9dc59de0"): true, - common.HexToHash("0x963d43a706ecff40ab4322430b45bfb36efe160ceb12a453146e0c5e582c133c"): true, - common.HexToHash("0x057e6022d0aa28e838a4a9bb3941b5ec7373c73f4718ab1fb25fdf30bffeb2c5"): true, - common.HexToHash("0xe124a22b94e826a7c72e551b2550507730dd07b772def8bb42524391d3ec63c7"): true, - common.HexToHash("0xff1d5f0a4a323153d3a7230cf63811e8f89102824078c9cc61e2b05d482c1a4b"): true, - common.HexToHash("0x088921e91238b6d721ac4d7afc15ae21511add87b69f7e98e29f1f142c8248e1"): true, - common.HexToHash("0xe14500a282f58d6f62f2f6086b765240389d4c58b7d350c46f7e21ed9d516866"): true, - common.HexToHash("0x73619e3c4c5ab113a52cb8bc12c1059b3611dbd5d407ae68418bfb6581ed1908"): true, - common.HexToHash("0x0b497ffe6f863941bea54002206b9a10185455738ec71eb12857294dca3b5e4c"): true, - common.HexToHash("0xebacef6cf07663400a0a597ebc2ad2b404affb2799e55df8e1f88711dc5cd9ff"): true, - common.HexToHash("0x010696d4dead58e2870fa5b09ed517ea99d3753fe8afe4594467a6a9c206b172"): true, - common.HexToHash("0xa10914122865d7a64c723fd611f9547687fcbd8234269f4e51e2ae65fd0d27a8"): true, - common.HexToHash("0xdab6f3d8f2a3f3cdc5d7ccd12b6a7d6c9523b1bff108c86c197f28513fe9cd49"): true, - common.HexToHash("0x3bcab219cff77796d0a4016c08a285d045092bbc6f6ac7ec9792a9c86696fdbc"): true, - common.HexToHash("0x2c91d4f367764c54b76fbef3a0408f033b3ebb18cbdd15d200fd6ce3448cf021"): true, - common.HexToHash("0xf236b867a5d12a9548c9d869198cab832b84a2e5102e4110889ceea1ccce51e0"): true, - common.HexToHash("0x96b0298d0e3daaad4a0c0ab878d7908cff71033b56b9dd22d9cb931f5715a190"): true, - common.HexToHash("0x68e4c667b0efbd36857ddab98c8401f76f595ffcc2b5198dae8eedde26db400e"): true, - common.HexToHash("0xd72658fde6c0f01a375440510ef704ab1854b61b162ce0f39fa1342e23deb48d"): true, - common.HexToHash("0xa91f1374d94424b1af7c67b36ffe509c88d0b3cc3cec3ace8e3d5d2e5f069802"): true, - common.HexToHash("0x9a1874ea29fd6f109aa80b2c77a744727948b05b02402de7da5de860fed4b4a3"): true, - common.HexToHash("0xe87a1b809532fdb74306952d4509d17ffc6acb75219c9acb38097f1e3a2b0da7"): true, - common.HexToHash("0x5ff1c76a28f53a5bb34d8decec4219e39c4631e7aea6ebde55d4331cf0cd6741"): true, - common.HexToHash("0xf341c38a0e9eb1e9a98bc45269af0aea0e9202eb221cf1885fc6dfc812a0666b"): true, - common.HexToHash("0xa1a9bea545e348554505eabbb31deee1c78316fd0e1be5164309b54f291ffcfd"): true, - common.HexToHash("0xcc14ff2a268bbeda96b3ec5cf4f24efe57368128ba440ddf390bc22d85ce31ff"): true, - common.HexToHash("0x14d9c15c024fcf06ceec23d3c7af22706e3e9bf211324934a922e8ed5eeea7ac"): true, - common.HexToHash("0xd66a018b80aed70ff7fe9db064f71c9bbed7b564442685f4e603f84b52c0b64f"): true, - common.HexToHash("0xe791793191914a7e684a74c7f16f14b82e4a85382e4c46d8989b2aa4cedf4b36"): true, - common.HexToHash("0xeadb6a65bfd14c106fa8fc6887a7013e1a4f7f7aa2bcbeae356c02ec5039a43e"): true, - common.HexToHash("0x3cf056c536c054d8031392e7472dcc545ec98c700fa453364ba77589403d9a30"): true, - common.HexToHash("0xf2d92285b3eae95506c05f6fcfffdd9adda0cb4b8336651e76b4c3d87f8cac48"): true, - common.HexToHash("0xa9f648d9e193a37e56d8f6a72c2634d9ae11baa1b8c910c2e19bb1acac5fb1d9"): true, - common.HexToHash("0x91ecb2aade2c602839f8a845279b0394695eb203c7f0945560e1c6a81c685473"): true, - common.HexToHash("0x49db3b9354af7a1aa20e3a238c63310f05e032cf4684eb000a926d909e4d5653"): true, - common.HexToHash("0x409f61ca9c890ba3c7f5210d4c874111d9fabde218dcb03be5480a16ff66e4d4"): true, - common.HexToHash("0x0bbb90ee763eeb46dacb0bb06b8a9bcb3ed12827f8345ccd19b83098d43c996c"): true, - common.HexToHash("0xd118d27fbea0abab81c0f929c6f228c789a3be0972fe1cf2124c3fbcefaeec24"): true, - common.HexToHash("0x5bd81b8bbfe0d9d47ee036947db017cb16b3f765eb8acfb287ee298263aa1754"): true, - common.HexToHash("0x88bd2b561e277e367f19b9a1f26cd1e23b6bfb84a4c6cad817173ecc206236c3"): true, - common.HexToHash("0xfb906d0bb5f4a39700eb95f88c0ee4b5425e5e5df5fd110594e7a8bb3d448cd4"): true, - common.HexToHash("0x6260f695b3cfa2405c5b38b56bc90824fb32582ef64dadb5b01d847815fdc2c7"): true, - common.HexToHash("0x127cb6532e67c4a81cdb41fb53d525b5308617863db69c70cbcd3ec4a1363043"): true, - common.HexToHash("0xfa6993b37dd7c4704914e36ce8d972181dbca16b3ea17cca359c43010be3f51f"): true, - common.HexToHash("0x9f240fb321f8ab9ca2d927e5dc441f73ec96976f5b5096390b969a52825c2bc2"): true, - common.HexToHash("0x3561a1cd66629fe2afb06a4980dfd9c89956880a32af88e4d5881ba0c3725b00"): true, - common.HexToHash("0xa66fd92cf33b850920a99c4eece5fe9a6da3854c839b60eac828e82e96a2acc4"): true, - common.HexToHash("0x96dd9268322fca6132c6ba4cc3055835f08f8be27982a96aab754fa1b0065f3f"): true, - common.HexToHash("0x9fdc48513292379234bc9c24a59efeb0dabc729d73242b8bb282b6789b3c14e9"): true, - common.HexToHash("0x245427c21ff288a8d315e6d89ed6dca4a68f0cd33b885afacc890be67f902e05"): true, - common.HexToHash("0x625a9278bba0d2888d09da9541a42d9651ae77abfd15f5bfba3e5f42e158948c"): true, - common.HexToHash("0x23440f913c8db17ddabff4cf9135da6e17d611de6bfdabc84ba93265fca36927"): true, - common.HexToHash("0x5ef40dcb910b3f0e1de989edbefcbe3da56efb350e3beca0a2ec54ff1e2797ef"): true, - common.HexToHash("0x515c71578c50a4690a3bd7e89cda0fafb6b94ca10becdfc0f34e65140d888d8e"): true, - common.HexToHash("0xe0809c58013c425565e9183d030e982124e90b7fab2783e0ce6b1e9da271791d"): true, - common.HexToHash("0xa93ed73776be6f4598947634e490e3aa6e79d16ac35050bf21d6c56a36bc8aa1"): true, - common.HexToHash("0x3557a1de959d5d4629929632ef83c5d7099d7c776220a0928e73d3b6c57d5c61"): true, - common.HexToHash("0x3ea7a83719eb1db686f5afad381b1e6dd4cc79e51315f1561171e0330158f4d9"): true, - common.HexToHash("0xd055ebc5231fed90b8e037acf846805bafb723bf124882c4406553a41c7968b9"): true, - common.HexToHash("0x21167756e5e0c6c3c5edb0d1552058f0124dab4223ea0937264213a500fbd4cb"): true, - common.HexToHash("0xf9db56e513204f147414c67484a1e7bd2e00813d5f8b7290b9dad4f31f779156"): true, - common.HexToHash("0xd10d52060f83992776c5dadad1ccd081903d155d6530a064b7f93a1ffae49771"): true, - common.HexToHash("0x4787cd4ae73072558b6110253619adaa6dadd5b6ec99b2674a85f2a2ae8db7e3"): true, - common.HexToHash("0xb75c8283ee92455017c26be8ed174b937ca0ac638e4d2a370f12c50fe31275ac"): true, - common.HexToHash("0x85c5254e6887e7391800894dd5f24c9e9fecd2c66bba7bb58320d75f1555dfe3"): true, - common.HexToHash("0xa874cee9b60ca4d1ed2da909a48e8513803be780c8e97b733e1a007c83a33d11"): true, - common.HexToHash("0xd003ceac886500db13428356fe005f267fb1b6891d2b48f4b90938d043fdc9e3"): true, - common.HexToHash("0x4cf1e0511a80eb3dd6f68a59aab9ac8629e55a38a3cff57df96305a665520f6d"): true, - common.HexToHash("0x12963e19647be0d316fc1e3730e4c29d12c8d3a4aeaf9d7db17d39255e6b8eb9"): true, - common.HexToHash("0x6613dc65fd673e05eeb7e82afeaf1e30927156a34d56a996921745e01073d0bd"): true, - common.HexToHash("0x3d2e752aea441594a5b2b32b54ab88cb45ffb15a2b7c36d9c0e762ca4adca7ef"): true, - common.HexToHash("0xef61dda40bbe42230b7cf4e69ae6dd9778d6174fe60795d109bed1339f9a2276"): true, - common.HexToHash("0xc9901161190a0f72b074a92d7f07f3072deed809507b885d795b8a6978f8fec6"): true, - common.HexToHash("0x8c352be6ccf2e784c7727fe8d954bcb136d405bf9ab5ed64c3359b723b4c45f5"): true, - common.HexToHash("0x3561f6463cae6eabf0b0ce68b35a25646c4b83a067959854718f7a2ea5ae9497"): true, - common.HexToHash("0x47c7a3f1b99c7885127f43c0b20f342688c03f632b21d8c86cb3f1103e12d854"): true, - common.HexToHash("0x62cf0a480175428ad8eb436ffbcd053b088dbb4f1e3af97232bc71185586b485"): true, - common.HexToHash("0x8145b15e5c91c3d34a193cbcae0dedc528b4524d7bd63b27582295f94c5f84be"): true, - common.HexToHash("0x4c6d8b52a16e12404966f6c6275c87fa5a65097c362977bfa1022d0dc0105c0f"): true, - common.HexToHash("0x67944ff309d29734f09ad39afb09556dbdc6d05385ae615b85b16ad2978f0723"): true, - common.HexToHash("0x4fa47abd37f5259e385b7745b80c64427bec162df0983c8fce19a24a6baa317b"): true, - common.HexToHash("0x22f023a8168e9f6384d7b1bbacab1d68c6eeed927e417a731999d1f63347281a"): true, - common.HexToHash("0x11b73ce67295edc8f1f3464177cd8f64b867d552075933ec47ed11000311aaab"): true, - common.HexToHash("0x928f26bc66eb4122a660ff63b2403ce962cf3a7c24750594cf4f6df99b69fae2"): true, - common.HexToHash("0x1c44cc20665f7d6d09db16a505bbbfd22401802465e006b68bd480b3444af3f7"): true, - common.HexToHash("0x0b8421ef049ffcda73ba8dafc818a5f72fecc93bb5843d33bd65b3bd3e3bce93"): true, - common.HexToHash("0x9c1cda9ddde09548449b2c256ab407e48d64485d4537cbbf74a3fdc09846cb8f"): true, - common.HexToHash("0x7124b49cd3100a81ca69a50f2f9c7c306a7c30b75d7bbbda3f87f9c14bc185ed"): true, - common.HexToHash("0x86b051393f94201c13bd91810587d38357965b35e408d0812dd3fbbf8a348649"): true, - common.HexToHash("0xee2dc6bd362c873567faa413ecbf1d6548c7a807dd20a438ab680af079803934"): true, - common.HexToHash("0xbcb35c8d40d51eff7d5d4b085a3948b1e60075891b2bede437b54524a6b48b68"): true, - common.HexToHash("0x97bc541c6d3f0f752ff5cfb16486bb2f1c86567629926806708a4605b361ff66"): true, - common.HexToHash("0x2e0ed54dfbc23ba9239fae57bcb9caea1323c8c91df63f8437ba3cdcdf00ef96"): true, - common.HexToHash("0xd89e4f8b10165082ece792eb6894535b841922ac1aba445e5e8a409ada6e73eb"): true, - common.HexToHash("0xc5ae5e31e3c46a61c0ed9a01b8c28810631f390c587f7afb7558d02360a95bed"): true, - common.HexToHash("0x5859a6698fbaf85e9eebbcc3ae6d4a9ea37df4e8bf14ab0fa4ad89d4eb82b701"): true, - common.HexToHash("0x404160bdeba678b90f232497ad7f1307b610e008a80485a4dabdde6f6ea678b0"): true, - common.HexToHash("0x2528b0e144e2ee2ef84d0b6492066396dc3d52b949a5412b23b5a885f5e7cc4b"): true, - common.HexToHash("0x7a10a296e31522feea6618ef28adfc972d53a5955746216a19b6b53d64868b52"): true, - common.HexToHash("0xe998dc49239622672ef4163912ffef8bf6849d7b7ddc5410557f4155879d5cdc"): true, - common.HexToHash("0x2b5a5747f4e8de7b1391bca3d8c36f880db7f3f10ef45617ac34badf1c54aa9f"): true, - common.HexToHash("0xcf3949d2d6aed5da6a232233691c43287835dd95caa62aba1d242b7d49c3e00e"): true, - common.HexToHash("0x74f6bece4f1afe4ca7e9a02755f00a1c0b58ad97ad1f824fc6f90c34fb72caa8"): true, - common.HexToHash("0x5fcde60c93ddd4139f76c6b38e87f6039bbd2816d4ede17f61742016c9f3d062"): true, - common.HexToHash("0x0f0aba3344e8c4742efa5e5b94afdcccc62fcc6c909a977605f4d9e523ad86de"): true, - common.HexToHash("0xf10bee5a921b0e46813d8cc68deaebcb3b6972fbc8ab35561c680f53c2ea5992"): true, - common.HexToHash("0xdc3131c5df2d1af6519b2ec4878bb8acd245620e124afaabcabe793293721c36"): true, - common.HexToHash("0xc7afa045db50eee45d0f7eda19842e9170e4befba9ac703e4f02d46c89932500"): true, - common.HexToHash("0x787a9bb0565f294aee26b4fa6814d4affc72060583d4f72baaf70ef997ea014e"): true, - common.HexToHash("0x92b7cc72c231f33ba57877c31533dba7445feae807dd41735417eb95bda5fd19"): true, - common.HexToHash("0xd2f8f5f4f0cb9e51040a56f60fb65b8520e26e47ade3f7c2509f00f92257bae5"): true, - common.HexToHash("0x8aec3ecc2ca4fb80a21ef9fe9392c104fcedcee0159a714ba238948e14cc6f1c"): true, - common.HexToHash("0x1e5d34388d7f7d285bdda913e92e7606188175179d85bde0be98faf46706f216"): true, - common.HexToHash("0xcdb39b8aeb903df8b7b183bb7036dbc44b4fbf6f5512b332e067974ba135f918"): true, - common.HexToHash("0x930ab7a48a8d98f4f7f9c04b1eeae43cf9b5f118c939eb6720e8cdf5f89c2bd5"): true, - common.HexToHash("0x38c36c9050e977569d3e3d79e78d285a094043eb5560b5c36e6cd6c70d4708e6"): true, - common.HexToHash("0x696516d218cc36e875886ccd2e3af5686ac0725349955f1b0c8b06ea5d5ea5c9"): true, - common.HexToHash("0x11f1e7b96b93f3723b41eb978db0e277fc94c95caf255b35a09bd1f8d3b481cc"): true, - common.HexToHash("0x8092d17967356f1213062cfcfe041203782f2787006571e872727f1fc3f387c1"): true, - common.HexToHash("0xa06f0819d0312dbb1c7159d603bf79cdce5d7780bcbd75f1cf596407c0f1b588"): true, - common.HexToHash("0xf80b75ea527d6e0781434a0d7b7c297160a04faa8d3f1f9754cda415fffa2022"): true, - common.HexToHash("0x45ba6f9e100ae94d7270472f23f2361838fe01900c6a09119c72313bd060a642"): true, - common.HexToHash("0x99728456a328639a902a70934fc07cd214ccfbadd7c392ef7f271ee0747195a7"): true, - common.HexToHash("0xd8876763cf14bf5e7ed86f892f841f452ef1a7ed809e333e837340930488e97a"): true, - common.HexToHash("0xdbc6674afb1531e7f8eebc24e3c1990e71a55d8bcf49465e1d431b58670584cb"): true, - common.HexToHash("0x530a29ea6bfba4a3547dbc152dfa2a6b6db6e51d0bf577a4babd169eafc5b44b"): true, - common.HexToHash("0xebb339131d70a6ee8e202e90028a4bf638182f7bb2368e21ee714fb7d9956ba4"): true, - common.HexToHash("0xe42240f4e898bdc5b6dd518eddb864293c00510bd4ae06cabebd413ee72f0d9a"): true, - common.HexToHash("0xee98d1d0e126a07e13e7ed2a527c7e757c0a99d1a283e0c9f9e3805906a226d4"): true, - common.HexToHash("0xea0de62990609bf35c8dc52a6dd71c4598f8987148ae9d56e41cf59d84b27210"): true, - common.HexToHash("0xc593e952975c3ceae0724f2c47aab7f62147a50bfe9599334b0b90e0bbd9f6c6"): true, - common.HexToHash("0x7b74fb48397a01bc29094b8da41c6e6bf5dc2d1be47a257972f2b1e177f9270b"): true, - common.HexToHash("0x7d354c781d61dda9f5ab1afbecc6b31c4d27378696f0aefe50312c281ad8f031"): true, - common.HexToHash("0x339385c0852056d5b3d04455ec1497fd1a3140532dbed8d7c13b777dd092e933"): true, - common.HexToHash("0x745b305723162aeec5e41038abd51286a069dfe41951ce303fe8a5697e6965b1"): true, - common.HexToHash("0x5b53bbbe7b69703c0a70c148bb6fa3b0dda74fce5efe1e64106deab1d8749055"): true, - common.HexToHash("0x3320066c63059a2f9d9a9a81ccb36fb84e7a687c7bbd66042b348f078a8ec8ab"): true, - common.HexToHash("0xbf7e57b188af6c0cca4debaccb85bff3fa1dc6152e51be142b74d2feeff3c5f9"): true, - common.HexToHash("0x2188c644c3f090a2a724dd20fa7d904aab59cf616953f05a0fda9b7f3099d9d6"): true, - common.HexToHash("0xc2a9d7abe9d884f5e982a91d65e5bc1c36ccfba52f936a30fbcce03ef44f052a"): true, - common.HexToHash("0x89542b52928e849c29ab6998facc50df634e1b9e81ce21a4352c28df48631a5e"): true, - common.HexToHash("0x9525736bd0c8c9ecd00f6819c4a3fe73f957ed64975c9e46e924525d8bfac66b"): true, - common.HexToHash("0xf0b13f4d4afb4a58badaf2b29c9c2e503eee99e1f6b9872004d3fa66e7e9ff0a"): true, - common.HexToHash("0xc4ba7391e12f2526305c35a7bd9fd1a4997193a522c7f0f06dbb983b77e50e8c"): true, - common.HexToHash("0xeb63e43dbb4f4a6f9399486ef0b407d8ffbf1626e5d47b05fb0cd069af59c36a"): true, - common.HexToHash("0x3705f6eb80c7445905addd15b875268ebe15278b53e58c9e3410732e85e96711"): true, - common.HexToHash("0x92a27df6d4d678fbedd03e75e73da0dd1a2493ae3c35948e3eccb77541fe8495"): true, - common.HexToHash("0xdac9096da9950b774ee6ab08ceaa549121f0106ecad5eaeae3a73db4ac136cdf"): true, - common.HexToHash("0x288ff0bc05b3be7f9128a5cf1de6e6b775723e568b7ee73b500936bf3f12388f"): true, - common.HexToHash("0x7593ae0f90b32f0b41507ea18635dc35c0c40f059a97016aede91ef78f253bb4"): true, - common.HexToHash("0x6ac60dec2f2a73935c9c52992fd8b24c2ba079a5db41009b71bbd03e9449e9c7"): true, - common.HexToHash("0xf93d5dc591435ed081d53bf9ad323569404c863f12736b8fe359dd2c1ede46bb"): true, - common.HexToHash("0xabc695898277d359316b239e8a7e0b59371de49b10ff41c8ea5158e653292352"): true, - common.HexToHash("0x2ebc89e0bde9b0b25eddaf489f3c805ca1d06ff2446e8d3e2c407157f7d46a52"): true, - common.HexToHash("0xd332277330c35ed0fee1577c2550abc06e2d72c7da6afe765cdd8941f2512f92"): true, - common.HexToHash("0x1b089a21765cc705f12b5d35957556906de663f5e710fd185a4fdbad432b3d45"): true, - common.HexToHash("0x69a28638667b471ec621964ef31a3dd1c5e5f4a80ad170c28d152b9151a52548"): true, - common.HexToHash("0x7c2a466d6ba30a24491236a982ee2122474eb241858a3a12f37452aa1589cbbd"): true, - common.HexToHash("0x90b5b461d324a49dc6e5b776fdcfa0d141d2056f3c44f241f6706e4e3208ecbd"): true, - common.HexToHash("0x67ede0249fae95544aa3d3bf7b77569b714e559b6701ea39db3b88925eec492b"): true, - common.HexToHash("0x2370f6782f60d7a9f3abf869b57b2a7efa4f42e2065cb7bfb0cd09d99bfd3ff3"): true, - common.HexToHash("0xf67e02d4fca435e35765574f120e30f8d3efdcdaf755e6127d97fc1e84f04f91"): true, - common.HexToHash("0x8878df70f23bf8fb61a1bb6753745ad6fbb407ab1320c2224017d531792a9715"): true, - common.HexToHash("0xfad5a37f1f6742044791e02d1b6edac984005903f665a68b7e95fdfe0ddf2226"): true, - common.HexToHash("0x701f5b2f0afc7150e4709ae809a7c5231639a8bc4c76d696db22c146d9113c68"): true, - common.HexToHash("0x07f33700615180ca178e07de11a3d61e60f6b3db6a7d9cf536047589aa97d649"): true, - common.HexToHash("0xb6ad246dd7d66eb45b8a003f6be218520c15105b6ae060a629c830c29cccd218"): true, - common.HexToHash("0xc9dfc9a196cea717bf96680f0a15f670d844a5d5a0759110c6cb7bda2f9eb8fc"): true, - common.HexToHash("0x1d913925323b053ea5b21720a398254c09fdadf28ce8b8ba691ef962943f5408"): true, - common.HexToHash("0xbe7e87a1e0bd0e1eefa1f5b17200f6e59e05e506d1df43fe96ac6d550d96893a"): true, - common.HexToHash("0x6af7a5eebb34facc25a974f558e485c2b887dde8f8b9ec5aaf91e2efdd9252dd"): true, - common.HexToHash("0x1fe7a137f675b1c3b88b990aa4532575a84553e2689a60be83cd2d369f007f23"): true, - common.HexToHash("0x67f65c81e7031d97e9c3ff4b296c0ca4fc8c1c63f10d16cffe5d8940f43c544f"): true, - common.HexToHash("0x5912b4c838c94292d93a756a6e9ea706a89995c3859bc324a64d5514bffd59cd"): true, - common.HexToHash("0x7ee96e3e206c317ea898667262bd95a24df349208d67c064ada94286e6683e18"): true, - common.HexToHash("0x134420480ba4aa3d87652d89f0863f618e86870c2bca36dccdab128edcd4793d"): true, - common.HexToHash("0x21129cc924a2cd34ced1cdbf76296b5310e46609ccba03e108fe0e3b2c99aab3"): true, - common.HexToHash("0x86dff65647a2b2fc0632a3e0eb0e6bf30dde093e09130c3eb4dc4c58db1f8d35"): true, - common.HexToHash("0x1b586dcbab9f6216a5d3bba39e1a517859b020f4d0fc34d0d1fd4ae5c09929b3"): true, - common.HexToHash("0x31dc1533cba4c5f7409a09877438aefc77f3fdfe7d2d26286393f66ed144a6e2"): true, - common.HexToHash("0xf9de8d9231dfb2d9945eede8df16df6f87e4c014733c5a73a2f5fa5317d98739"): true, - common.HexToHash("0xe7dc4ed031fedfdf97f4d42d7c7ffbaeff9b934ce74cee177ff30e7b7c7a3364"): true, - common.HexToHash("0xf7f1b416341ecc46aba65311a2f03b4fb7e5714c06d94cec89556a9994cd040a"): true, - common.HexToHash("0x60d50b6a302b9a98bd599927762d066ad3d3cc683faa717179899f1db49e70ab"): true, - common.HexToHash("0xce4f2673418c8330955d46e15f23aeb210fc24e7cd80133830759f9944bfc830"): true, - common.HexToHash("0xfb947422ff1bd8c96dc600aed1d6f16e6ea553c76baa2f6ff378ba7b732787c5"): true, - common.HexToHash("0x3787aa301ddbf1dc0368ad8aa25149214edb9cbaeac84c04bbc4d1170e78bbeb"): true, - common.HexToHash("0x345145e2882277ae07cde6799e89d36a773c75cbcdcaa90114f7b31d503d11a6"): true, - common.HexToHash("0x276d9c9da18c12dc1a45c819c849ad8d082b08c1ee3b43d8beb5eccabebd26bf"): true, - common.HexToHash("0x303417dd8a6453f5d4c259e287a34beeb274c16ec1339867a224a0dedce8d747"): true, - common.HexToHash("0x72da04f4f83ee5a37b5c6dc7c50f7b185dce6027a275261c6d6b09a273685cd1"): true, - common.HexToHash("0x1d3aaf896669908bb1e9419c44a0d050fd09e5e158752f8a84db04ccd42a6eb6"): true, - common.HexToHash("0xf2f7948f85a9ae278b32eedbe6230de7bd92b2a3faffbfd3c8a9806a6a208681"): true, - common.HexToHash("0x4de59890e8be5563c9678dbcb8068b51bfda3463915f6028c35403f6528928e1"): true, - common.HexToHash("0xf22be3eae78a9e0ed9508e316c6cd0883aacc9b8df24155e5b0f2097ab38e148"): true, - common.HexToHash("0xe2a948d685367eeef6979269bddb82adb271d82e625bf08d27ecbfb85e9b731a"): true, - common.HexToHash("0xdf5cb6756ded57313c21b65dd35008c3ab73fb15e942facee32b53593868d3e0"): true, - common.HexToHash("0x35c2e023b326a1dd3fba076c96d6ffc01ffcc98b3c7a03f1005da39560ee049a"): true, - common.HexToHash("0x6935706cafcf9ee4d2489404b81a6f8425f789743046d16c8706f0884827ba23"): true, - common.HexToHash("0xc0876cff2cdb69cad3ae4327df4f16ae41e14cd9627aa4188c9dc22d393b514d"): true, - common.HexToHash("0xaa26238ae309e3eecf45873ff335c07ea1ffddd127869f6b6e9cd6e4d3cd1407"): true, - common.HexToHash("0xa0bc8eea70938ad4d4ef9fdea2582d09e1172c9e4ad876cd855e6ffce8547e96"): true, - common.HexToHash("0x37508b3fd586e2a6727efd86abe28c94c31bac692fab84525f2ebf82470396f5"): true, - common.HexToHash("0x07ef4a3bd63999064b15720fe1a8d1a5b46059923425d4f9ed199d15ce263640"): true, - common.HexToHash("0xd9cac77c638529a7c78e2b1c252c180736698cb65a4f4caeabf6be49b1d18601"): true, - common.HexToHash("0x8277113e753f6d3703eb707053286b4c2b8818e39c8eb6b8472c0051c19b95dd"): true, - common.HexToHash("0xc99c0b57484a767142fcc37d488d24ba54e0fc9bd6bf6e6a806e4010d8567fe8"): true, - common.HexToHash("0x69a691ba67592e1852c7db684f957649ed3f2e96670ac527f9003d1cef0b96c8"): true, - common.HexToHash("0x30cbb4a9f2af2e5972d7ea21199dfc77f704f968cc01561ba579a9d6fe346bf9"): true, - common.HexToHash("0xac4ff68a21ddd4772a29003266142e78c9124ca143ad2e47ebbe36ecba923c5e"): true, - common.HexToHash("0x48f498095b81b3b072b583950d28e4bd08be1dc1f525704e28f900e8222f6dc5"): true, - common.HexToHash("0xd8f2bf9905f7c6151d29f7502a2580c4e439279a2d5ae418c2cbc0eb09415910"): true, - common.HexToHash("0x37e3d185c4045d67a6c8acda62698cb0ae82e7a46f366cfbdcc8131c80a436aa"): true, - common.HexToHash("0x56ef679286d9a296f6a54266175576e482af2999d0d812cccdc3df55da26ec29"): true, - common.HexToHash("0x515b96701e4281445e81f4fdd84748d9e5a498ffcb8ef04a4a539df062169efb"): true, - common.HexToHash("0x0ad7d79e8c98f1ec6f23e1f3ffd5f48ab4f364c69adcf127d27931345db8fe54"): true, - common.HexToHash("0x55d0d3903b0a8586026adc8241bfabd73dfe683c0a7ad2a31abb5b289b37ceed"): true, - common.HexToHash("0x64f981c54be9484148627328cd4997f816c56a8ee4d5ac4bf9bd4ebb9f41d6ca"): true, - common.HexToHash("0x8bba746ba8d52a42ef54458d5353e98cafcd0bb1a893b0cc5b95a2840b14f0fe"): true, - common.HexToHash("0xe573536eb9218919d7bd783ffcd6b4dce42e1cb3023ea024a01eaff1c8991a0a"): true, - common.HexToHash("0x70099d9b658891b682de2c2c6030c531ec5b12b29798069b143023a432c2cf1d"): true, - common.HexToHash("0x87883e05ddafb66765717e4b943f4920e1d0c1c7733061075ab8af63085452c1"): true, - common.HexToHash("0x5822f838ad49b57779320dec459ccda6e5bde872a99e88f892160727f340459a"): true, - common.HexToHash("0xde0a14f71468eeb567e0f782c8001683bfdbb7c84451f53fcb0bd59b00d8fc28"): true, - common.HexToHash("0x916d39fc66427a29aaa89847f192f0360fe7dbcaa94265dad6f2a6f7f95b4df7"): true, - common.HexToHash("0x22befe65287e888b76cbd5c4bb3cb24ac124cb47da7f9929c88162d17125ffeb"): true, - common.HexToHash("0xac5deb642ba8446c83d748e09712137a60a5f075f91350bb9b4010182373d4e6"): true, - common.HexToHash("0x3270cde72d445a5c31aae96bb8e431dc6a1bc15214522e1ba286e25f3d287c5e"): true, - common.HexToHash("0xc12995fe287383d43db11fb276e47733028f8913fb6b6fec1ea10491ac8737f5"): true, - common.HexToHash("0x12ed23cb7aa8fbe4ff46929a999a74b33eb095c7218a0cf53e601c1bce11d701"): true, - common.HexToHash("0x1ed6eb53a46ffcf40f12f9bcc672075c498fbf61bb90c5a17cb9a023b3baa6a4"): true, - common.HexToHash("0xcc63963ecc4981c08e8c25ce6d61394ea15fed27564ec71a6cf134119078537e"): true, - common.HexToHash("0x9f52d165c942fc0415b2f0afc6e32065c15920588b5b5faab69ae3aabb348426"): true, - common.HexToHash("0x6a5da50b1f9054bf31cd77de1c345f6392e9b687413551c03f8ee2584ad48d44"): true, - common.HexToHash("0xecd7e819696044c641814036d70fb7b86dec26d92d1bd2e13f65268c30473338"): true, - common.HexToHash("0xbfa3f765fa247ea7860ee2595c07743d1501700fc3372a58d7c087062c2dc691"): true, - common.HexToHash("0x567ed9e8540ebcc088b133daeec3891d837ed2567b18f2db7020d715c4765e4e"): true, - common.HexToHash("0x4ef27be2a9d0ed3979b40ecf93851eeb2dd18c504746e5a91c048dd982218338"): true, - common.HexToHash("0xa41ba180d85869330eed6497f010bb83b143d6daf19960de6c824e9392dc6179"): true, - common.HexToHash("0x6ae329e94b2f5b101ce92705a195171f5f0409121d1463e57127f9e3a43cb152"): true, - common.HexToHash("0xa041b7b1848409d7c9644b038986cf21873b19293552ba0e8b62555e1d48775c"): true, - common.HexToHash("0xd78c59f43b54aadc6a18ce59c9c96b0211e24a49d394b28866a4ecffc715cce4"): true, - common.HexToHash("0x685a84eebae8ca9ee4e018138a5f66430e97c131c0af68caa8505a77971d22c9"): true, - common.HexToHash("0x1d2d212422f41426dd28a913606793b647627bbb75d7581e4c6ea4ded8db37df"): true, - common.HexToHash("0x21a846d3e22e729a3849bfcd2dff73a9449c5fbb766bcad4d60409dce5569144"): true, - common.HexToHash("0x267d8e02a1b8c25907eacfdd40a3bb246aa58b175085f08eb1a9dfb256643a50"): true, - common.HexToHash("0xe5cc2ffa8887fc7da1c0a0c80a09a770a5076d4f68557eccb0221673c0f836e2"): true, - common.HexToHash("0x7ec31300f3bfe60b5ea5c2c6b9f23ecfe7dc9971ffd6ca3b612a918b5f4c7162"): true, - common.HexToHash("0x97bb6eba5c300a995fcbce3aa1553f7bcbe80eea30ba5ae1885db2728068741e"): true, - common.HexToHash("0x0ad55de2e3beb31d563c366fd2f35da4d11c221df0c9ef965668254fc96db4aa"): true, - common.HexToHash("0x0d124530448e20d87c777234eba9a10df9b74e765ffc66fd1c8c663e0f975947"): true, - common.HexToHash("0xf7078c6c9546573e6158f38f0ae37704bfa55f650f3a98c59fbd929d6ac88092"): true, - common.HexToHash("0x0fd74777c3288c8537bf777143bd66287c2eea79af2faa1fe8767f239cf5b178"): true, - common.HexToHash("0x0ca5e07adb511f7560495ac7f58f31be8ddf8eeb38c82e2484d6e33059166369"): true, - common.HexToHash("0xdb5ed6ae78c046b2b0530cfb066b85b2241ef4c63e5815f0974bf3fc29fe84af"): true, - common.HexToHash("0x2ee7a20875e41e05f8b5f223f99047b2023d0b9d2002fe6fb0afab99f2202203"): true, - common.HexToHash("0xb8dab575ae67894953f5611093940f5b245e4ba674b5625c3170cc48f125954e"): true, - common.HexToHash("0x488a03c9088013299019938f9bc7aea58d35b74adb6c096d864f818a287a6280"): true, - common.HexToHash("0x817548805c24fbab7ca709bd0417394dd9449920716a794257f5ac433341d179"): true, - common.HexToHash("0x30ad42a9a68cdc97c07cba18db1182ae0de16d425fe21599d01ffb0f132c1136"): true, - common.HexToHash("0x8fdc4b44b25555e7e274556283c77d7c3d5f16ac73b0caf75bd503dc501c14d4"): true, - common.HexToHash("0x9ca028380742f817605341d3acb6c20e899ee83506568a4e5e7581e3b1d08506"): true, - common.HexToHash("0xb39fcf85789417d9e30e7a3b5345ee540d276061f445be17bc82c8d7fd6c5985"): true, - common.HexToHash("0x84b122dbba941438959e5aab9b4a5d561cc3ef8f8e52c347ee2b5972eac918c7"): true, - common.HexToHash("0xb2ca5c339f471ab3cb1efc16b3ced941ba8dd79896901f7c59225a1c311764bf"): true, - common.HexToHash("0x9dcbfe0011cd04b74d37f5ff5154067de194c90dfc86b364d1f6a52d3f503127"): true, - common.HexToHash("0x7326c5ef1dfdbd10654b5379b74431854dab0a42cf95df603f5ddab8ed8532df"): true, - common.HexToHash("0x75c75ec13cdfb932d27d8fe0a54298030e79ec7932cf12ead0cc55efcb6586fa"): true, - common.HexToHash("0x81a75653a2af2dd8bd99cfc05b4417a53fa201cb5a6cdbed38e34b44db7a851b"): true, - common.HexToHash("0x39759248d84a30389122fc51ae2835b53fdcc3c732a586a1c8cab43c3768f459"): true, - common.HexToHash("0x6148218e4c4c08764dc8c284ce75e54685ae3faaabbbd94487fb85a29bef4b0a"): true, - common.HexToHash("0x3fdc5fa52378a5857ac117052f01e617623802bab84d7339a2f2df937f033be4"): true, - common.HexToHash("0x2e310441a6b4b2da40403284fbde7bc2d32368d32f2ea658ba1ad7936cc8751c"): true, - common.HexToHash("0x756a70046f56a00d485a6cdf48cfd16949579d6e6e55c6e1ce5adcc0b81487e7"): true, - common.HexToHash("0x541fde4506addf3226813ae99fa4eb34b3bf4a9f4642156cbb7bc8bbed0bf9d9"): true, - common.HexToHash("0xc16102d611a7d65de39642fe3f771ba19ac6559d21b478676c355d5eb9c62863"): true, - common.HexToHash("0xc99da59ca55a38e4edb06125dbd465f47612e9a112cefee30f8309853e17e4d4"): true, - common.HexToHash("0x8edd8066abe55ad68efc07f35c2ef2ed86b9506f504704d7dee6fcd368b57cdc"): true, - common.HexToHash("0x9c8772d0210f363a3c1b5ccbdd0fb0d1beee93259306a382c7a556c62cc0592a"): true, - common.HexToHash("0x0bd9c4a3b0b8ca4f8f903904bc33c53aaedd90a5778ac97036210588e3cf4cfc"): true, - common.HexToHash("0x9bfd8d5de567291c0b5ac0ca7539ad45b16085234a10df09212638d7994d88a0"): true, - common.HexToHash("0x5705d1e0459cd5cedfc64cd8e780ef9db507f584a9ac1bd07b3960c49793aa12"): true, - common.HexToHash("0x76a32babc5988b1f5ce69e1edde1e379cc7cf589402aaa138f34960fa77c5f2c"): true, - common.HexToHash("0xc43078604517d24d9aff964c2b9a49b84de063f84128b544955d6b5584065f90"): true, - common.HexToHash("0x5753f01805528c11e67ef68e542ab34c30746346fc955472d8312588a1ed3fe8"): true, - common.HexToHash("0x96ea78d3cefd2e1aee1b7912e89ec02ad67c30588fa64e261e8390c9fd657977"): true, - common.HexToHash("0x0ac99eeab1ece3bc4ed2d3335eeea63c4a88b4af1e7e29d4761ff9c5bfee192c"): true, - common.HexToHash("0xa681ea9bf92504150f37aa99e50af73ed4927f228cb361c4123465c25b73835f"): true, - common.HexToHash("0xbf1064e6f0e95973b70693833b00a1a7d9111c36fedec10aeb529ed453ae08a7"): true, - common.HexToHash("0xed029590ea2092e524c90f1fbc1f3c28ba8c5b171ca4b8349935e62a652defb8"): true, - common.HexToHash("0x8aad4cf3550056f33b5ca6559020304a20e12c2c05bbaccccdba22084a2cebc5"): true, - common.HexToHash("0x307ae23560cf59d4ccc6f87d4f1d7a72af19f95a438b90aaac26e0dbeb6f8004"): true, - common.HexToHash("0xda1101ff0da010145c565ebb57f1da82af6d3627dbe0ac1d2240d276b0a26e6f"): true, - common.HexToHash("0x4a2533924896e9974a18b87be5a0a49f58bfd7aa5a5088bdbaecd65431f83822"): true, - common.HexToHash("0x870e77a7868cd7c5e2167d28c751a5e1c1f7cdbf0b08e4f4138fd4bb7efc104a"): true, - common.HexToHash("0x0c62ee8b17be9487d1956c517520f0733176869513b23d67cea31642fc68e5da"): true, - common.HexToHash("0x24c53525fae27a79d069ac53f3fb062b2ff41eb0570ffa5a7e4109d5f58c8051"): true, - common.HexToHash("0x2495422ee2930307f15bbae63bbb6d93298ea85980d1a1fc7e5e29b9c7e78d4c"): true, - common.HexToHash("0xadd9cdf43cd6874338f2b88488f97e8de60c67735793a7f0e201417f928b43d6"): true, - common.HexToHash("0x6c5857b6f92a3b9750503f9534be5ee913000f93d78b8056a62903fe861b1161"): true, - common.HexToHash("0xa1abb872f83de8e4dee0b70f1bc910d0b7581630ee4e2b8b50585ce2a8938a67"): true, - common.HexToHash("0xf0e643cebbeb91b694dad12f7ebcb95c5bd2ce4aa17e0cd3059c5679a5c6ef60"): true, - common.HexToHash("0xd211ad87a799028996dfef0023c8fc32aecb443fdc57bbe8cd8dcfc76bc3a742"): true, - common.HexToHash("0xe932b77cdfdf22387369076e8c65255447b5526608cf1e07329780f083eabc61"): true, - common.HexToHash("0xb68924b7b5bdf7ac8090bc2d05b27d4034ee0501021140f355f11214e78af9f7"): true, - common.HexToHash("0x5ebf68e99690cf102e3f68275719b9287887a8a9d2b70f9b04ec96b1ee657bff"): true, - common.HexToHash("0x0ad566076d522198011ed8652963dd583ff59d60072e5d8b8d64a979c1c6c5b4"): true, - common.HexToHash("0xcfbb23d1d4e0caab215897bffe40908a49fa1fbb1df13d647ea3abe09bdb3133"): true, - common.HexToHash("0x179b027bbc2e75494b8fe6edcdcdf58a2721b0adb69e0b6557cb5e559d5eadac"): true, - common.HexToHash("0xbaeb3e8416e0141a1f6465af292a742ffe2baaa046491e7a35795b5b7d034dd0"): true, - common.HexToHash("0xdf22f2c23499315f5f116b013e7c48a0b2eb10d6c6ec291ddb2a3145ca2517b9"): true, - common.HexToHash("0xf01edf3e05ee488517a62381e095dc87b2d47ac3f84915bfa3575c978837206b"): true, - common.HexToHash("0xc5a692f7b4f8dcc1ee5f617973365ec2ec2c8bcdc7c307a52d00862c85d9add1"): true, - common.HexToHash("0x69640e8c47946a2456d7a367437a0d320bbd2c004d2e69cd1445e02b11fa3a5f"): true, - common.HexToHash("0x55bb8300052d1dc0790499ae983fa22d2a44e4d6376527344e953fa659354d8f"): true, - common.HexToHash("0x3c7c43db452c3c32014ceb1f583f1aea6ee71ad54cf001585d049df93f5f93e7"): true, - common.HexToHash("0x9730970917905e5c7392b98b75e1a66f1d7f4dff31aef66ec63530450241e959"): true, - common.HexToHash("0xf94220315e286241e7ea59112ffe087d79e33642c9890c8297fdfd7a34532887"): true, - common.HexToHash("0x5bef60a72c53d8d264d00e2145dd7321ab5b1d8608261ce7aa91ba44ee854399"): true, - common.HexToHash("0x925e73ed7a3b6c2291fa266c71913ea8d98660a465261cd9092caaa3a44ae841"): true, - common.HexToHash("0x0408eb4cd85d7b2d1ea19cbdb7dddc740d1f96619cb6cdb453c627288e513738"): true, - common.HexToHash("0x59efea46bd367fca38f6cb2cb590dc66481c1e4e37b4e33aa18faf2cbb7a1f7e"): true, - common.HexToHash("0x0ea5bd6ad380a1ab4dfd607a7e84c656b2b62bfed3fed28d262b7380342a3144"): true, - common.HexToHash("0x3a96f9b2b1c59ce0802ef7f49140a78fbc1f222d6541996c9b15ebe60ea2b854"): true, - common.HexToHash("0xe1b1c259ce0d68399c7917ccad436a15dc7f77e77bd57bd44edc37841ff67c2e"): true, - common.HexToHash("0xa160a0f5433fd145339bd2dc5fdfb118ad0a054ab24b5bf12350b5459a90e626"): true, - common.HexToHash("0x9c14245b621f7b163f23c358b9b350b09f6a874b0add5e224dcc526a5cbfe02c"): true, - common.HexToHash("0xa4265e3f24fdfac6d9fdea71c46dcde5ce2d1cf042d824f84e6570cee6e44364"): true, - common.HexToHash("0xaf6cd9ef0733ba26cb5522479e3bc2bf688485f76a078eae864bdcbe5a38c9cc"): true, - common.HexToHash("0x1dd98418416d26cc95f0eb25d0370f79f44a56b5381d98bbf9d75a0dfc81df9c"): true, - common.HexToHash("0x89ff370686fec1c7ce7e02b11d780e22928c3aaaec87acd44e0555613d954b3a"): true, - common.HexToHash("0x67c8a096a3abd9a4775703c566685f166b032352ef556d9a150f97b00a3c15a5"): true, - common.HexToHash("0x914e83dfa8a140414c4331350d192e458edea9e2c8cc63b9a1edc745b2c621ad"): true, - common.HexToHash("0x4334583b6a30f034fc7b9bb777f739c2b76821de06eeb1664f6d5e20c06a0075"): true, - common.HexToHash("0xa989045cdff00045523e22244f955b474a4a61f715dafb7fa8cfc60a98bf6a02"): true, - common.HexToHash("0x66b3e288e23642fc168612a44400ac79219850bc286ae5483204c091fd470036"): true, - common.HexToHash("0x6d82e1406cb48b94adb2be943d26e9f72b93314a1e97c1d81a89d01a9a4aac26"): true, - common.HexToHash("0x7b473973e7a2c2e90511bbb3c008178beeca569b8e677c6946075c018612a345"): true, - common.HexToHash("0xcecb731e917930fa85615dd639896213c30b8630b4735e5eeef545b5af0abea3"): true, - common.HexToHash("0x6aad6cab4f8bced4e597c3e3f0c3b2085447ee91b68f5662be455cb3670f9720"): true, - common.HexToHash("0x9656c242e32bf89ab91d411d41c2f3ca05a4b2205a2063d4dcf6c565c3a61904"): true, - common.HexToHash("0x9e2303b15df61d54cc5229e88bbf482a30d351b5f8baeb39115d65fe85b147e2"): true, - common.HexToHash("0xb42a446d0a6567f7314e638c2767dab4fe6c7b86445f4474c2479ea96c83b432"): true, - common.HexToHash("0x22077c926c6e785f8bcacc5d9fd42ee688662c0bfe640e564a641149e99190b6"): true, - common.HexToHash("0xa7c177164c62aa7fd328309799bb60d6ff3720e27fed1897ff12912b596bb731"): true, - common.HexToHash("0xbff0c643aec3a656cda6c2777473928573a67e4705155192f40b7b6687820266"): true, - common.HexToHash("0xb9ddf988be4e8f51a9c92334abccd06a8593b98fd56565b695541fdb70f277de"): true, - common.HexToHash("0x3d4dba73de57f45d6dc256f2e617bc8ae4d4219eb1e50a7ae0bde54dee1ae842"): true, - common.HexToHash("0x689f85b29e738044362cceb5d5b57687f4ce7015a87343b9b77b54c4b9452bab"): true, - common.HexToHash("0xb4fd1123ca0de71ef47945b5ce30b3a6d7a68579ae4002858c9f2d616e812a47"): true, - common.HexToHash("0x31486396c1088dc52507a17b33c08fe1fbef5e99df0d3672a4d19a183dcbe8e0"): true, - common.HexToHash("0x0416a59668673fd0d58c514992549644b77d5922ec4d629577756370751291a5"): true, - common.HexToHash("0xd0e665b6af39865b543dae614725a01c2a0b6be19897e98f154ce6eb7b86cc7b"): true, - common.HexToHash("0x75aa91fe427bd5c6559510b9246c299663f6dd7841972e00da873ce13629ce21"): true, - common.HexToHash("0x78f13bcf45cf158fa2b6c47339b369046fb61461b74a1d7cd4f6f713fb09542f"): true, - common.HexToHash("0x719b947d1ef3b97d407c0c9a43e14565ad248939e956562e2873b280258d0dae"): true, - common.HexToHash("0x578bc2a7b4b238488047e72de7c9b4ba4a4d2eff383066d470a9dbfdf2ea53d6"): true, - common.HexToHash("0xb0637be533d502f6f455db1cb8016fb5fa45d511d3fd85b69c486131361a87c9"): true, - common.HexToHash("0x0c8db999a8a2858a3c7d5bbab2cf2a942114fd1fdd738d5c1dc69bf4465e3e7e"): true, - common.HexToHash("0xbf399d8768c5186dfc181836b9600bccb9719fb69a9891f3a560f0d37d833a6c"): true, - common.HexToHash("0x47c9a9696cb8618c5e61963c34729334e0783269218735761ec2089e5bf46052"): true, - common.HexToHash("0x7cfd5e05b8def3960f8df5517b977a3f6dd41a8546bc0b3148881b16f21ca927"): true, - common.HexToHash("0x52e2abef0658f2f95c3f86c06aca1d1d0175666ec142da6a610c9c22a1b7820e"): true, - common.HexToHash("0xa46d5f53f5aae5b562309879c1af56aaafa2c3216a0f6ee41c7e85071d6beb03"): true, - common.HexToHash("0x65b51c0bbe52c8b04f9cd3151b0e24c09fd03f7b47345bf622ab7ee707ed7755"): true, - common.HexToHash("0x6e683d36ce9c085a60ac3f44369907de625510d854940cec6793b7bfc87e7c41"): true, - common.HexToHash("0x11b18b8416687c9f8d18395e0270ef7bfaa1b8d538f9b1029aa90a4f351df442"): true, - common.HexToHash("0x81fd4edc941f4975136faf6ae5530c521af334a36b99b4d2998b35fd3f411401"): true, - common.HexToHash("0xf8743628c64366b2bb35fd60caa548757cfe3c52cfe507aeec7dc28845a32f83"): true, - common.HexToHash("0xe879abc25ee0e3a1e6cc814322d8c1115f8b18e88275130158940f902d71339d"): true, - common.HexToHash("0xf821694a0fa29231e4872b5ecddb74eadd50751e54f7c774f9771c7761a3a314"): true, - common.HexToHash("0x50892b0b091f4d086eefc2416b91f3ae82114cb5584e94b944ce60d9e75662b7"): true, - common.HexToHash("0x2693895267af657359b7b4dc09f577d45fd9e6c1db3d5d62fdda9b71686065ea"): true, - common.HexToHash("0xd87728f8497aa80037f5ac0b1a4c06ffc526177fd851c658ab332884f48b35d5"): true, - common.HexToHash("0x2b9c79eb9b75ca282769247a255c9aa57c93cb5b35f796f0d4a9a3f9e9c571c9"): true, - common.HexToHash("0x323d2378e29fe4a2a6443d763aa53877894bbc5b39fc462fa417f38b7bbfb696"): true, - common.HexToHash("0x57a1e0d5ed83132e27462560fa8b113411604a46c2bda7aa3a5dc1fd30305e89"): true, - common.HexToHash("0x4cbe7fd06b117acce460972d025e16d6e7f551324db6d180af0e9a2e69532467"): true, - common.HexToHash("0xabd3193af98f31f0378c40212956aa27271a674586137b5b4fe750900d65c31f"): true, - common.HexToHash("0x0820d0d01270bb1fbddae5a46e8a31cc719b2e9be14c11dfcef9e7536058cda5"): true, - common.HexToHash("0xeaf2a9738ddcd2b22a3a59e2b2ea891ce32de8bcb7ca2b5980ef9beef05494a9"): true, - common.HexToHash("0x929baaec53f60c4d97c809d09ba720b439118ba59ea44156ec19c5fb2596710e"): true, - common.HexToHash("0x14b4133b123efe08a458f78be6afbbb30802711fb541b3370618f7723ecc55c9"): true, - common.HexToHash("0x92297da9135f73e2269b9fb7cf15f4bfb732de30f4c6a552fcfc4206acca8987"): true, - common.HexToHash("0xb09b0e03f759bca8ef0b03d369e7522a3bd051e404d1ebfb3d8798f27b41e8f9"): true, - common.HexToHash("0x5fb1a8670be3483a7c0ab76aabb10b72d181df8a3e52d84a42903c99aada3849"): true, - common.HexToHash("0xfe08e4b1688e0024841aa49f865a3003a7c7854a41844c9f1ebcff3ab6e3cf8a"): true, - common.HexToHash("0x8dc1928936ed197156c5a254e6e44f0fa407febb23eb919ee3d608a301da036b"): true, - common.HexToHash("0x1ea5646a403f485a0535fdf61e27443a86e6547abf13a4f230fa64a4e652da10"): true, - common.HexToHash("0xf53dbc21288ba29edfe9994fad9578392f8725ca636b7f7a2384d95e82caaccf"): true, - common.HexToHash("0xd40e5888a5bf41ffa421ddde06fd1dc637a44960e44e8168b5688b1e1031a8f1"): true, - common.HexToHash("0x772b8c11a76f41de9652b514484bff754656ded099ad5be57ff5251d6a50a3da"): true, - common.HexToHash("0xafc034a027dfdb9b400a4f90cbbb087e54ceb6a4d9015ce0e971db8c66fc2800"): true, - common.HexToHash("0x50274de83816652920ed038e02c3a7fd9af7eac0086fbb1a034057de8a55f87c"): true, - common.HexToHash("0xb7fe14973371ef1ccc39422260d2b13ce984aebcf05d0a3d91b07b0de9b1231f"): true, - common.HexToHash("0x2c30e258f06058cc88960bf0bc55e2733c2817a5cd0804fd686fc975e9ffc90a"): true, - common.HexToHash("0x716020fbb56fed4479207f517825a6d79fdae481c881e4bcba11dafa6dea8756"): true, - common.HexToHash("0xe455ecef267c68a53ddb2ba51bbc947e3735afae2fa0a46c22b038bbd77bcc0a"): true, - common.HexToHash("0x4a53aed7ed0ae8c774fc68d405ab995e54e9fb63a609b124215e21b245bd951a"): true, - common.HexToHash("0x2de8e7170aa292a205e2c15d8781a4075788b09932c00aa557be12897481f756"): true, - common.HexToHash("0x323da0c7e61e48a660ef4305c1c8f180ff9b6489f2492254d368643e581d1d09"): true, - common.HexToHash("0xc8249583dccb539cf4d5552586f62fa439e347c77ff01848397ea5e325ed7213"): true, - common.HexToHash("0x56f578f7662243098b0420aee1b677af9abafa23f1a529e838104e7a2528ca47"): true, - common.HexToHash("0x797fd01a4ec624c7e9aa4f9a1c11e6f5ef4269e426dd7b6a70a191e04cabe609"): true, - common.HexToHash("0xe0c9d0bba63668c58f6acb30d5b19719ca816b6cb4991a5ff411cfc45e50df42"): true, - common.HexToHash("0x66328f613ff1aa58a8d9c32d80ceeed63425103311507ec52a4964a4e7fa121c"): true, - common.HexToHash("0x59a6f2c2f05bfee04e61ac598b4ca27e14ff979cc6d1187248155fdf68d97706"): true, - common.HexToHash("0xb1069dffdb5782fdc5d550ebd36e0a59773bbaf2057c7a51d5c5b5eed6d8c790"): true, - common.HexToHash("0x804dfc47731847327726468b25391d1875b0c684287a8e1b9314e9f0b7de8f51"): true, - common.HexToHash("0x5a64e4c787de3bf1e16883d15b019f84e15f498c1416dcae24cf39188cf93348"): true, - common.HexToHash("0x126f12e36ff6431b99a44a6efe7c85640975b6f7dee00f6ba3067c5c665f3578"): true, - common.HexToHash("0xeb318236b1bc2a9dbbaf5047fb2f024ee8712342f20d7ac113480e23911e4667"): true, - common.HexToHash("0x9cb4bbbca341a0971e159c491f9909623076472051cde30844d70c9f24f6f4b0"): true, - common.HexToHash("0xa7796a5af689e5a8e3fbfd416065918330cf6a2035fff5f2c502bd27e9480789"): true, - common.HexToHash("0x2b3cb763c797736d4e822d0a57e455d730d32b1d7ba2d281df02587067052568"): true, - common.HexToHash("0x675e022d2591e6436e4012b7675462d570812e282055e91bdbea7668f9f32165"): true, - common.HexToHash("0xc7b6a9d0041d06ead7165d42306531579fca5f8dccde5a868fae12e48a32954e"): true, - common.HexToHash("0x5995f2fbebe2d5931650de13ef428d6edd38aafe5e6c34e8ab79b82471d0b950"): true, - common.HexToHash("0x3d654d9eb7e54084b026064b461796c47b4a20327c81a066d4639f81acd2aa84"): true, - common.HexToHash("0xce321537a3a9d1a26cbc4a367c040807b536fb64610aa31e6581e34bff32d81e"): true, - common.HexToHash("0x01ce383cb28613dc65464caf5c0f698d9589de86573ed7fe39abc6268c2b9590"): true, - common.HexToHash("0x6112b438d8f950cf2176586491abc4808823fd98438e27f753edc917570093c0"): true, - common.HexToHash("0x073779fd44a3a85c8f2aa9894709a9f1174bd73e6e546821056899b9435f2d1a"): true, - common.HexToHash("0x39bd8f183ee4b80369d4bcd56e3b2c2bac7e8ebd878a91316c34e41ffdee4bd8"): true, - common.HexToHash("0xc8ecc21f69b6e4c749040d3511d3b252e93f9fd01aa88915324965ead7132860"): true, - common.HexToHash("0xdf56dc52e9508e78435073033dc3657e5f5e3981d9edd48ac736adbf3c222998"): true, - common.HexToHash("0xfa3312148c80c1fe408f8b7d37459dd222b4c726aa173b8f80f2792de73b0a58"): true, - common.HexToHash("0xa8e6bee8f9db2ae22faeadb899ea43d1dd0e5fda66ef71c375122586512e9d0c"): true, - common.HexToHash("0x942c0645bfb110392c2d55c5241eca6dc96736d238255cd20fa6b874eed8b01f"): true, - common.HexToHash("0xcdef84a3643e06a4ad858f1ce6ef69f21fc5d6e08f2d98c091ba759c3db60968"): true, - common.HexToHash("0x60cff7bb549044b962a8e38dbb66765b96adf2549a857cc06069e58a6f027655"): true, - common.HexToHash("0xf8b80f44a3a1db62f4f0997ada4af04e4c7980ea2d1186facc9b502ce4a723a2"): true, - common.HexToHash("0x74a5b562172f889cfdf4521ba8f855ae7695ebb3424452b55f6979457ec1544e"): true, - common.HexToHash("0x9ee538b07312dd60fb13b47cb5d8e677ef5d3f0b54960f76445662b32961d2a2"): true, - common.HexToHash("0x57efd2ebf1b6b37636472d107c4eb0aa2821f4f215cfb2a224e5ff4619fe69ec"): true, - common.HexToHash("0x53c6d4fb43ef633826f10999f9da31a7ccd6d08c18c47e6a898ca9313ac0a1a0"): true, - common.HexToHash("0x99db3b2555f3cbbcd1862e41e6c828ff58a08c42c47d5e15f3846c9703930a0d"): true, - common.HexToHash("0x98e6125f3a2a5204a6a11a3651cf760e5a6c67fd7b24341476cc690327ffd2b1"): true, - common.HexToHash("0x5a5d2cb01bf371452c51283376980e91d64ea1ba98fc63fd63298acc48c5bbd0"): true, - common.HexToHash("0x0d355b3873ca7695e3405a615201de9cb7b5d40d5793f78399df26bf6506d229"): true, - common.HexToHash("0x58e67728773daaf4948b944fcf8757efd11b13efd86bda6d8568aace75e02230"): true, - common.HexToHash("0xf71478f0bb112d126b09f4977e4cfb2d00710aacd297263b0abffefad9420920"): true, - common.HexToHash("0xe769640f2e77095fa3abcd42031caa9094c29cd0530d7eb406f3ecdbc7c15ef5"): true, - common.HexToHash("0xa2ba4ef76c986b90529e61f47ecc409d596b0c35a29813042a612608337901a3"): true, - common.HexToHash("0x07b73802b3699f8a51ee5401bdf07bfb75f25b375b889f309bf7cd41c8d2d502"): true, - common.HexToHash("0x16e6d23d1b27320678240e8fb08820e9b86812e88afa8a71b4ff7a412817e81a"): true, - common.HexToHash("0xcc1d4a4c356123938c11cb0dd8752ff7f5856ca8016f7770e170b80aadb45487"): true, - common.HexToHash("0x30c3d9a05c7e67ea13a03e85ff42d8b17522a9154d06bd3ac293c4dffa97422e"): true, - common.HexToHash("0x6c2b2fbc2150dbde4ec55166f41c5861ad3b0c933d4f111113ddc0544f4e5af7"): true, - common.HexToHash("0x753890460d731427a93a69c0eb3df56730ecd073ab38e8e5e400fa08e096c2e3"): true, - common.HexToHash("0x50f50c8848cf867dd741ade8e011ede9589b35661c37e2f157bf9971d4d02de2"): true, - common.HexToHash("0xe6dfc38207cf94eaad68959982859c864d7b520ef8e4da70d83223d63b77cf53"): true, - common.HexToHash("0xad8e47924f2a7ce9700d66276c6ea10fdae233b62c7ccafc53007e9aa7d595ad"): true, - common.HexToHash("0x651dc397846cfe28dede9ef48323800be720c740acaf61c3f2667977fc016722"): true, - common.HexToHash("0xcb969d37556722231479c113a0c1e45433a5b8eb4aa17e7760810c97df74a17b"): true, - common.HexToHash("0x881a20293fe08ef7aabfec7464cfe20fe7f230d02bb046002d148e5d9efe6362"): true, - common.HexToHash("0x28d072f8d32b61cc4425c867a1dc7bb5b4f6212dda4e9890ff4d06c59e02be75"): true, - common.HexToHash("0x41b7286da46fb1d44368986f862822c3af986e4e0093d61946c9e428662fafe5"): true, - common.HexToHash("0xc13068a73b9c7896b8daf4829fd2a6acb25423f26e7de5e62813445dd267f7d5"): true, - common.HexToHash("0x21596588edec0186cb2ac7b28e5abf5d902551d11e98081162f7c45b1ef9dbc2"): true, - common.HexToHash("0xfff99ae49492974a371c9f1ec705e28515e1c2d7ca65072bac06e9fc8d416a0e"): true, - common.HexToHash("0x98d74d13e4fa6b77134aa232d812aac3ff6c1583035c7b2117b7b063b6c7ea17"): true, - common.HexToHash("0x09ab1ecc97a5743040bc5157e34a2076a64d4d9e6c4b0130de130ce20251b4b1"): true, - common.HexToHash("0xc0648df912a02056d694e6892c8f53bfaf92b966edaf00cb499c61fb0aa24b48"): true, - common.HexToHash("0xea092a3c0070cc93d82706be3b908d6c02f5c8677b110b8d1b249e1678cc8461"): true, - common.HexToHash("0xd4e70333fe2c26c4017486bb8cacb874be2040a656282715a492cf17758865c1"): true, - common.HexToHash("0xaa3f1fb15e34e574fa907eb6b69d92a22c9af17154a9484dc5141138bdb1858a"): true, - common.HexToHash("0x61939a311385456e0005ca90c72ae64cefffea9934cd753a5e5b7bb243e14518"): true, - common.HexToHash("0xb380774e6fc10f516359448ccd2c29ec517ad2c39abc8c044533baa6e12db4a6"): true, - common.HexToHash("0x87c7c6a19f79c8f498faa0448d92a641830b3775f57761a9eed4c3c073a421a3"): true, - common.HexToHash("0x7110d06cdbece8dd6bf431248eb28e1f8c553c81c0cf1efa31999de33e167e93"): true, - common.HexToHash("0x6591ea7bf330fb87e81291c0d33c4680caf9f501e1fc0406d1b832c00420bd7f"): true, - common.HexToHash("0x6ce5a523cfa8092f96a80a63c3bc43a20bc1cf4b3f83b63baf97e47517c8587a"): true, - common.HexToHash("0x94a04dc1007bf88f9a314d05beffb0f0ba6444a2491ff6812c8ff4dce0ea2a1e"): true, - common.HexToHash("0x743081fd0f5c4c66bb87d625d516a70ef3f5c875a632345d1c5b397fa6d9127b"): true, - common.HexToHash("0x0d1e38513c89f374052ea61f0138efc403b236728e8c139de4ef89ccb43acbe8"): true, - common.HexToHash("0xc7283c6a922c8a5f03d858655062d4e47276de63e639ea9bd110bbee04c19ee7"): true, - common.HexToHash("0x2cdce99c3bc50b913bda33670b4c11ca3563d52e3334e5c5ae20db25be1871af"): true, - common.HexToHash("0x5b48dfcd483197a7eab8d9939a22f80438aa46312aab3cf95de1f5565f9f88f3"): true, - common.HexToHash("0x9a6935174469e1d86f74cea938735c5182ca04fa41f2f52b0e7ca99e5b02bdc5"): true, - common.HexToHash("0x2ce0f06d139e14e7b878792c74f2371caefd3fd23a81d050ea81e75944d9bdd4"): true, - common.HexToHash("0x82404c724865bda698a2f0d6e4e7f3e64ae7e5b48ab4b3607d9518349cf7b9c4"): true, - common.HexToHash("0x4024d499eff72d27ff72359e0303c66333e247a3ed0c129518457b7924e7e91b"): true, - common.HexToHash("0x41ac27f98ed76aa9798228364401bf5719bdba6c85d611c614fb4b5fbc1e9018"): true, - common.HexToHash("0x0bc59be559ae3c56fd742b6229602dc71d01dad8a781260f3e6cdaa1857f54bf"): true, - common.HexToHash("0x037a2d94a6fc103bfa2f06d122980d8e2dcb55124ae7c34224c98f8146040db6"): true, - common.HexToHash("0xabc18158e261e195365a18dce450ffe91ca0696c942d942f92407b02dfae164b"): true, - common.HexToHash("0xcfc0e953f037d65795372a4527cb1d8fd9530bdae05274bcc9093fb53bb85058"): true, - common.HexToHash("0xe100c4c9537e334361c5d5b04e03b37d74bbccf98836308c83bf4af572787a6f"): true, - common.HexToHash("0x0de7914076cd70f212778bf4204630263e6e052c0f7fbbae38efc64b6a9450bb"): true, - common.HexToHash("0x91af26fc72cd6ca3facbfcac79589c9ae9a90de3d46017bdd5ebfef11def0e72"): true, - common.HexToHash("0x5a198d726deaf0a6bcc447cd2c8910aa95545177b254c23d4c3b63686f6ef3ee"): true, - common.HexToHash("0xec2fa25ca33cd4e5d363cabcc64a14d14786cfa08c932d979eed3a3ca1eb0afe"): true, - common.HexToHash("0xb34f9a93b21aa5922469b5322dda19898bb713e986e5435dfd4147dcedf61cb6"): true, - common.HexToHash("0x8cf54e92eebc99d2dc90efc8de137d5e3d28991fe8e481e6a10cd90956fd04bb"): true, - common.HexToHash("0xf425441254206e1ba337f63f1d966c159d8d9fda77284cf88e1d040de7b8cb8c"): true, - common.HexToHash("0xe3e5fa41610ba3bfdfd8e4a465081060bcb312d4b75245b23e8c07322935db69"): true, - common.HexToHash("0x8ad7173b874e268837d3a38a3c172313497275d1260c6bebe9b825266dabc6b7"): true, - common.HexToHash("0x06d6488a1e7e0d5e4b136c62b9c4b54c1eabbcd5fa9db2dbbe6fb9ef3e2158c5"): true, - common.HexToHash("0xa1d798f5e38ee380a5f426830c264abd19e2b0e62e2b807dc36f8cb1274c6d0d"): true, - common.HexToHash("0x74e4c82e25f059b859837f29748d8bb5788e27a02df4ea660acab13cfc670b3f"): true, - common.HexToHash("0xd277513f2f2c60e92c847550ee746b1a91fe6b364d9d5a9dbbb010219388efe0"): true, - common.HexToHash("0x1d778b09d153ccec450b9cc07abd891eb4af8197799ceb47c536fee4ab7a53cf"): true, - common.HexToHash("0xf99ade2081fbc037831ddf02eeb50cbe0a71017703a1d006c0d2babc2651684f"): true, - common.HexToHash("0xb270cd1d9fc0af4def5140d6f04786ad2d4351d28b671ff8ecae25c3b6df6cfc"): true, - common.HexToHash("0xa87be1bf9f88c593402912491c44f48e40eb4a47ab463eb057d0aeb993ac1abd"): true, - common.HexToHash("0x2630554f2c3671e73022e8bdeffb0db2d77d529bbb69e676484992ee37cc672d"): true, - common.HexToHash("0x4b223032ff5dbcbd90c30c553421a2313092dc55956eb36a6e622da2dc1f2796"): true, - common.HexToHash("0x22228c3ea897fcb6a56942a79450868e5dc769e3f00ad159c10d78ca04952eca"): true, - common.HexToHash("0x656398f85e7bda79434f221f49022812d51db51897046377c203c03f9a1beee1"): true, - common.HexToHash("0x37d8b6365e32536fcde04e281b668074904b02e50f6cdcab874c4c896cdeb684"): true, - common.HexToHash("0xf4aec0c30d2adb81fb191320531b5f8fe28f84bcb36c52ed2c8bf69f65cda016"): true, - common.HexToHash("0xbcf1dbc862208cb39040aaac2ea07ecfdb9df9464946af0cb7884b082cf7cfd1"): true, - common.HexToHash("0x1e2d41cc46de96de6aefc99ea6fba89e860239c59fc4bf6c7530af3e2404736f"): true, - common.HexToHash("0xd78f8d05934de8a8b9e28573f0f5776a795321bbf09732143aa3dd9fd5083d6c"): true, - common.HexToHash("0x431be637c326993f8455c6ca91698d7ff84ee7554cc5b303578a66f957be0360"): true, - common.HexToHash("0x368384050e0384c754720542c039ba553cb5076529d6d8b4f260c9aca6edc6e9"): true, - common.HexToHash("0x4d2a6d3b5e1ad7dc2482b050e828a1bc5344856abbab95428ca2a2957b6b273e"): true, - common.HexToHash("0xefac7ea19864d172fea320f270bdd99ef198ac5aea68687d2054f61d4a6641e7"): true, - common.HexToHash("0xfb5decd915a57ae32c43d50df8d839bd854bca44b1cf587ff543006d1473328c"): true, - common.HexToHash("0x838e7d464a6339897e35f6d2464f6249a729c3629d85cc630ef561d09cde3fd4"): true, - common.HexToHash("0x98025b35ce2b2faa5b8c733cac46f61715ea9af5f3b1858707c13e4842dbd908"): true, - common.HexToHash("0xd7ececef3f02deb59bc2ad012cd58c4083a5026deeada4726c6fede079b191b6"): true, - common.HexToHash("0xc909195126262fda0e7988c37bc1263dc29815e373af768dce14c21784f9daf1"): true, - common.HexToHash("0x2d15ee7131e282374270814d8f751efe341078b66e6a75a1270329979e024687"): true, - common.HexToHash("0x54b4d5221db5e8e87bbf04270a2ab2da7a0d6ee75534b9f5da64b88d7ed2b59a"): true, - common.HexToHash("0x0abb09008a95216e7c5c15058e629a8f15568fd8dfc0460a3298da6c0fdd8c3e"): true, - common.HexToHash("0x499d04587f8522d167d2d30e94bfc8fca84d58981825db2c893025969b74cefa"): true, - common.HexToHash("0x1ee1f9b10e2f6920ff2439fd9eb1353299bab11583e9e0528267c665b0550683"): true, - common.HexToHash("0x129da334518c0391e95e0ce0368045798a8031f3b31c7a8a2df114ba0fe9b54a"): true, - common.HexToHash("0x4eb731ac36614c53e08da44df12357e3ed89facf15cc2a434e3a2d341250f593"): true, - common.HexToHash("0x3a347eff17ae269a2c4443eb8e1e82aec0921c3569407d2efcb6c28db5daed5e"): true, - common.HexToHash("0x5a2554b200e4a20d3d3789c82e7908d37b27fb6bbafdf2b50ebd63ee69d7e116"): true, - common.HexToHash("0x2adfa3b0d88e966f30b4c4725e2b280f40df79fe639e7a4cd48d59556d73d1e1"): true, - common.HexToHash("0xb346ccd5d50e1097f1ff7fbc88a6ac86ff753e2ea241b6f1c9030036d649a42e"): true, - common.HexToHash("0x8c23f6bea506b8082b80f6773088b95e0d7f7e461a630f2798a949b475b5b9db"): true, - common.HexToHash("0x47e516b1fe7a552444fdb85457a5d91bfc528af2dc4ad02175638ec72a2960bb"): true, - common.HexToHash("0x18d3700ccef129ad7e0f2c145949537a4c7003b90b94c215c1ca82e7529c2b7b"): true, - common.HexToHash("0xa87fb30b0656299578080224127708ec2a555c7dda1bcc9210804ccb69daaa1e"): true, - common.HexToHash("0x7ea2f48ae3c968268f47d444c0cdbeb1eb8013d942effc6341ff5d4f8a4816f2"): true, - common.HexToHash("0x3c47ee42a1457321d73e116a781fd8ab50453cbd2760788cb18d13d1748805d5"): true, - common.HexToHash("0xdd91898d48fa01b59a04a4ff4085a56a8a26145dd1153c6abed35a628b971744"): true, - common.HexToHash("0x87efde8ee487ffc46ecd7fd2100dc4b0021fb68cd63b27f2e25810dd62a58628"): true, - common.HexToHash("0xfa3e05bba28ee292e6784636fb4256c36dfbcc1e32f5a0316e34fd8de2470c9a"): true, - common.HexToHash("0x14f8e10a4ac1ecc45f32ae89b4c4f502f362c4da80d70b16c3ee1d06dbe944a5"): true, - common.HexToHash("0x636eb165726e64480bf58773bd7a7d48aeeb96c70b4bd8bfdc0aeaaf4a5b36eb"): true, - common.HexToHash("0x1489c4b0d5b52eb7df998b6a14e64213f5ebfd91ac96b52c6833a75937113e6b"): true, - common.HexToHash("0x8e6bee03e54170e30615f752a71e7a4f229e333cd6ed8c998753e4398d7a3b52"): true, - common.HexToHash("0xcf03c3bfd866c47ed6e28748706a2f9203ffe89a2bd8b80a08c477b464e9b365"): true, - common.HexToHash("0xa790a978f75527c7abcaa4cb039d137bdb1793f3e5e02eb9993a51815c89bbd2"): true, - common.HexToHash("0xef9cc2cd9d3f89f0ab727d178a15e79c0eeb8b12a3ace762c93fdf796e2ca5e2"): true, - common.HexToHash("0xafdbc5dc6fb86641210181b761121884053fcf6d06744627a2ff82b42637f8b2"): true, - common.HexToHash("0x2771f67e2c61592c833056e578b17cb9f7c37132f2b234ef5a660ff9ebb34d57"): true, - common.HexToHash("0x5db35097e2318e906706f2aa25dff6228deaff3ba92c7aa1c34cd81d386a2ad3"): true, - common.HexToHash("0x5574b2410ac467a9600b936eedcd8b243428102ad0927b53b631acd4250df0ac"): true, - common.HexToHash("0x49126f9d1f2d0ae56dea2b679f38fc4ddc3775966a46a4b1d50a0cbc63c21c90"): true, - common.HexToHash("0x24332bd7d1dbc4276003fd339ba4ea2684d63853fde4e70f20388372d579596e"): true, - common.HexToHash("0x5eeb9e6d1a99fa9f55a61726a3a5481fddd835a256ee3891b3d755cdc826c09e"): true, - common.HexToHash("0x55a5bd94cd9e2009816adc5dd582e502eee3d78e992b18df8804dda4b9d9bf5a"): true, - common.HexToHash("0x7e4031ab4f33bdb0b175306959e8eb589af7918fb050addca1976b78c36ad1ee"): true, - common.HexToHash("0x9d67baa3ee3a0a57000723575683513930254668f84163f261e852bf1be48e58"): true, - common.HexToHash("0xbc2ff246d6eb39bcc6006d1b780a508060723253d165e008c7d43ad5fce6aad9"): true, - common.HexToHash("0x23004ca7eafa66e911fa17dafdb919c7dc77cab7e15d79748eee327da3591310"): true, - common.HexToHash("0x8c9854b1b032512ce030364c3dd69d390281cd5b0b3c334b1828875e671ec1ce"): true, - common.HexToHash("0x21b11ed6840f02b6d0473a84f2f658eb7141d256bec157e2559a3ca0159f6bb5"): true, - common.HexToHash("0x4544b07a2458649d4b539a210cc83b848d8a0d99e9913819041f57c6ee99cef9"): true, - common.HexToHash("0x67fe0a1e6e8d95643e90e15450912530d584478c7a316144a5396361d51a6338"): true, - common.HexToHash("0x86528743fb0b0c8613c31a9b491b5e6a44c7bfd8ea3ebed3457b5ab0167a5d41"): true, - common.HexToHash("0x9af7b41d49c90c1e299db9d2eb04ca5dfa643e0f8e9a85dcd81f366175fed7d3"): true, - common.HexToHash("0x0f0c2154ee7e115c14efedd93650f3e729214d780e5b5f9a9b77627bbde681d3"): true, - common.HexToHash("0x872cd21a2e102fd4837228b8b196bb5048eb07cf948504a52f35cc2267d0d311"): true, - common.HexToHash("0x9d3307f2b549eb5972072c391774411356b1799c4ea4a9b729f567f77c5731cc"): true, - common.HexToHash("0xde67ddd8f5b6565a015e2ed889f62be8b543a6f772a8046ab18473ea66f7022d"): true, - common.HexToHash("0xe3a997639743400d856374c0e38976c39545d890a332443bfaf3fb025c6aac75"): true, - common.HexToHash("0x77cbe3a63299dd9eafd45b6085d7f7b655058e40e651fe7c72fa35d0d04676ac"): true, - common.HexToHash("0x53102633d07968a1c87d925bf40d9458d9b3f5a39479e870a09577f2aa792608"): true, - common.HexToHash("0x9d73c0ca6e8106dcee3c91e228db1aaafab5d8ebdd61ecb50dac8628fb50cf97"): true, - common.HexToHash("0x9c2cb716a98748fb9bdcbe9c3816760ef02fb83408b54e278ae29b0e0f117465"): true, - common.HexToHash("0x730779cb988335cbae0b43972d4df2bab92f125c83449ba401db669fbce9520d"): true, - common.HexToHash("0xacfb0290831cac7329d6a5a357b076431f9b0b6093ba270441bc25c4122a77d9"): true, - common.HexToHash("0x3bf1f6eed08dad95fd9a176852148816ae93372b41235d21715fb4a003227b33"): true, - common.HexToHash("0xdb062bdf1b8a3b87864e861ec75af1d149eecb8a710e7b64dc86db675700ec89"): true, - common.HexToHash("0xb8c0b33a874348f3c1635d1666f2f5ca09b1c94e3a7fa4f6f4255765457bfbdc"): true, - common.HexToHash("0x6c5b0f4ed35f9874bab89d00141f43187eed606a847f1c5ce1b9d39789e7e213"): true, - common.HexToHash("0xca5aa6cc3cb25f26c062676c9d23a76e0ab1eeb80a511b32873d8162a7139aab"): true, - common.HexToHash("0x1d390c3d4ed75d13fb61659d376b84249f5162b5cae821092c2156f19f204777"): true, - common.HexToHash("0xf45d6a9a39d9668ea7cd83f12fc4b46b40d6b3a60f91239bf7d65a96b0da2b85"): true, - common.HexToHash("0x2d0a017f35ac1593fb86505b27d662c111f0cb1e5dd0a9de881fa7f80f6fc230"): true, - common.HexToHash("0xb1620be1a63742a1affe7a2ff6dc1705a16c4865db45382a35c8ec5eac71e4ee"): true, - common.HexToHash("0xfda14fc35b3538eb46469fd305ca3c006f7a61f5d7d96db78d405ac0d1408d16"): true, - common.HexToHash("0x30a611cdecc60757c7514489fac707dc7e3065939c84ece30e1f29ddcc5f3d08"): true, - common.HexToHash("0xea36c3ce3b8eff5ac5dbf1bdaaff25d5a7f89bf4f73968c1b9751799279e9d34"): true, - common.HexToHash("0x77d83571a4e27e7a6160e5f49dab52c0949f4e5b1490e1fc192d4de195dae0c9"): true, - common.HexToHash("0xa792e49e43ee23fce2faf6b375c482ecce6d3fc63ed90b136b78c813d6bd74fd"): true, - common.HexToHash("0x9905004f8285ad3e352270cb272b63b3739d8d6daf8f46c7a7a5a1166f4db7e0"): true, - common.HexToHash("0xea5e5a74ac931f58de0f424a26cf6b530041729e06f375cee6347c34e50dced0"): true, - common.HexToHash("0xb9f67393d22606b35678f09e9ad9a718e9e20151bfa0b8b0a7b0b059865f4b5c"): true, - common.HexToHash("0x11da9bad7a13de3778b6c20ecf6e2ca62fde90e29f249efde7a9300d33020f61"): true, - common.HexToHash("0x97fb2ff84add02d5973d0c84bf3fc31c55fe5a6cf073fbe13d6ed596909f4f04"): true, - common.HexToHash("0x8f129e8a9b72b58fbdbc8e4a1695e42b26aa733f0a6f23cedbac9b5e2a24f096"): true, - common.HexToHash("0xea7c580a0d6295e906456475574acd031f14a2c77fcaa3edfc7374fa6e8cea91"): true, - common.HexToHash("0x47c469deae283fedcfbb6827d7cbf874ef24c01e4e7e31a7422ec65b9f1a21ee"): true, - common.HexToHash("0x1ab702839c3646eb71ffa6b5fbcb8972d6c73e6fadd5faa656289e74d15b9ddf"): true, - common.HexToHash("0x21fb27550cbead03d807438728ff5dae2e3dbd2256bce8f9fd324dc50dbc15ff"): true, - common.HexToHash("0x0026d04ff1b5b1d5b050bfb7e027ad83bdddbec08a31d7e2319102d85ef2657c"): true, - common.HexToHash("0xa528514d0daa22c469a7717f911020ffd609ccad5b3c45b7ac3ef362e468f84b"): true, - common.HexToHash("0x6f97b4f68d6ffdd9008a7d979f7a36536e42960ba4cfacb90c30eb45c9429ae5"): true, - common.HexToHash("0x889d28c5b7bffd1aa9b83eeb7ce84a8098923f176f4e15089253f81a2dbbb4b8"): true, - common.HexToHash("0xc22c0f78c0667e84589aa28170c262c340ac00fe708806054ac8c08baf9be3b5"): true, - common.HexToHash("0x9837dc4abb2d5bdf467e35d2e59ce0d4a53312900addf4384f5c122b8c85e314"): true, - common.HexToHash("0x1b7351163dbcfd2a0dd6844eb1c21606164f7c5cca74dde7f57236d23bec1704"): true, - common.HexToHash("0xda07e620a44ffa32dec4b1a7ad8b9c2dff8c2bb64a125de7c4637b3480d36810"): true, - common.HexToHash("0xe92209298f451d0902ae7b3841aaea14b3b559735a8ccd4bf706af61a714333a"): true, - common.HexToHash("0x3f5b935a1e536b2be5027494b04145bc0d7645f42e4884234b5823c95450368d"): true, - common.HexToHash("0xa50ff8879ce29ea6979688626956d77aff8cf2a811478c2c693fc69e0f164a55"): true, - common.HexToHash("0xe44c0197ad878a0dadb88aa673b929d37666518edec85b3b19a15acdfb669c70"): true, - common.HexToHash("0x7bf9c5ec30168079940c7220721535493ef7abeac6f8426be150412db244cdbb"): true, - common.HexToHash("0xbeaede97f340df1928799d999b0e9f757ec2762ba1a4c27cebf4176c9d9677ec"): true, - common.HexToHash("0x576b785d3cf581d534a0507ef70b62d39446d1ed5f99bec1f10117cb4cfffe2a"): true, - common.HexToHash("0x91c1e81f750057578f8468fc53a436cc3c69a81db50d504f9e9f4aad9d7afe4d"): true, - common.HexToHash("0xb667501f328cc15d940f1572dd164301e300baa66c6c4adcca38238fb19201d5"): true, - common.HexToHash("0x5cc9525fff6416b0d3f4ba5fdf2edd8288db631b95faeda808281a4f23ad2f2b"): true, - common.HexToHash("0xd2a1ff6e351a7a65a921aa98ef62519930c458f81a9f9206d9f49377e23a0d84"): true, - common.HexToHash("0x16e3eeac6cc46a4b706426019762ddfdb2ffc9181cec40f8c93ed300f31ab70c"): true, - common.HexToHash("0xe1c93e8b2b808a81d613e2aaf4b2a081687e88884e22f867466f021e0500b0c3"): true, - common.HexToHash("0xfa55f9e9ca131e82c5829ab467093e0b742797d52539eddc4372d203d524737d"): true, - common.HexToHash("0xfe50cd1c1f220dbab4fa84105a75b71dd7e88ccdac4b79d324e4a5470919ca19"): true, - common.HexToHash("0x8fc33db8c4866de31b62fba8962399a9690fb743fe246e23b93175950be23157"): true, - common.HexToHash("0x202a5e62fd0343d68c752f80b21922234f13727d5d461be7f7dcda27edd8fc9c"): true, - common.HexToHash("0x72964c9737bb39a8fa2d677cf2d2368b70858224b48530c14440f874909ab23c"): true, - common.HexToHash("0x925c4fa54932818da9564fc28a06529e94560b9ac15c34931b95d5fee4352271"): true, - common.HexToHash("0x8762865681f20c68b9fb0d1ef23d89491f357d77f77fbffd7eaef186e9e1a4bd"): true, - common.HexToHash("0x78e8508626a40773ec58bfb55e2ac5fb2e66bf2a4cf15d537fa6ad30a6dae32d"): true, - common.HexToHash("0x6eeb7f3607c60433c5c99d98c574cf8f77b1fd93f647f0c08a7a6a47f110961c"): true, - common.HexToHash("0xff07ca95b7a48f3879f3155ba2b8956661f5001117630110a6921c08f8212f19"): true, - common.HexToHash("0x529d84c8a1dc1df589e5a15f0ab0e55dd100ca1f88498ada25ae171701a81ab9"): true, - common.HexToHash("0x0cc52154825329e2b1e325f94d19dcd1b4947c8d67b31d0dbebf3fcd2c1c3996"): true, - common.HexToHash("0xb1c5194f5f71285571f604eea45ad09dcf5ecf9c34761500f99500a2c63c4f6d"): true, - common.HexToHash("0x91c6d99a3e214a97cfada5e26b55c1dc1f9fc49ed8d5eb4e1cc875ecfc23a621"): true, - common.HexToHash("0x1f6409ee0a2341cdfe8c8b69546d2f2710b677879f1f23168c0532c2805f33a4"): true, - common.HexToHash("0xea4562e358d832783f7d1151950fc7abdbfa9da891d5bb1c686a4cc27d7a386a"): true, - common.HexToHash("0x50e7b90d03c30917111b891729346957759c8a204ca2bee367498da80439eb46"): true, - common.HexToHash("0xb61aa4e2f82e2889c0a2867a69aaae4199462d160e12a5ccc5b571d08128e2e3"): true, - common.HexToHash("0xbf65d54877721b8829830fd3eb7c6d09895421a8f3b9e7567782a30949691924"): true, - common.HexToHash("0x4456d6169fcdd29a829fa0ff23650a968ae18d619c8a73bc6d2fd29b0eb0ea4c"): true, - common.HexToHash("0xd64e7ad91c48c9ca0f53b22cce4bbca604ce612399d0e7f3b3c115d3808a1707"): true, - common.HexToHash("0x67bd6ff3abdbde4aad2a427ca0f17a8660b36a7a1c0cd078815c59c12b1bda9c"): true, - common.HexToHash("0x0d2ddde17873de37fd1da5de447f654151b84c451c610a15cf5d076f504031c9"): true, - common.HexToHash("0xca20c9d934f205bafd37347eb387cfd5266c3a4757ca6d2384b8f37d43016eb9"): true, - common.HexToHash("0x53ec2ca7697271e230ff0e6adec0948d567b7053f349dc2359b48f935689c2ed"): true, - common.HexToHash("0x125c2448221d4ef1159d4a5539d6f5f6ef218174521bc0bfdd8b5f82d9eb0b00"): true, - common.HexToHash("0x544f9575f26b0e830a43c99456bf892a0e33d5f00e26835d515e2edc3b88aa7d"): true, - common.HexToHash("0x974d6d563c5a0cd732e8743998cba92ccfbe03374828a453489d4076f46bab03"): true, - common.HexToHash("0xb5aa3bccd13998ff0dd14b7f6504fc1b6753816688995af466f2e0256e0db331"): true, - common.HexToHash("0x66d8671a4c5aa8ca6d2a005555abb1479b2aef0720fbc64a2040bcb501ac7fbf"): true, - common.HexToHash("0x21a1baa77fa7d017441826047f6bf02adac35f0f9678b55f701b9d075453e1e5"): true, - common.HexToHash("0x32f09b96b94ff707e21c9e7452e02f7f3d33a740601c822da64b8f249a0f1382"): true, - common.HexToHash("0x1fe789d8f0e05fc84af1207321558c91b7be6d31556a178b4a9eb7d94bca97cb"): true, - common.HexToHash("0x59f5284d2ddaf5d7078baabfce0f06c0c9ac1518d3231e3b9fa9dbae1b4f56ec"): true, - common.HexToHash("0xa84ed52f97d392086315475ea289b9224bb414c6f51971e89ea988a5f756e7e5"): true, - common.HexToHash("0xa9412a334a0e5ef54da9459cbe5e374f90205f4cc48656fd256b96170106dc42"): true, - common.HexToHash("0xea0621dfc90853f030ab29e4358470605f426d33b03c187ae6326a8a217f27ab"): true, - common.HexToHash("0x9328bcb1b5ddb26fb0fd1bb6e668db8642968298097b787a28c6ec311522b187"): true, - common.HexToHash("0x62f7ac4d29400b9ca5e46027ac9c963836274c3c62ba057f1bc0ce4bda8b9142"): true, - common.HexToHash("0xc4cc3b5d2e2249457b5677f6105b791431d075e426d9df5666334ed648864107"): true, - common.HexToHash("0x4952b206e3da6d12622517c3a121a523996941e43a1d7803d35841b8661d304b"): true, - common.HexToHash("0xcaf6f1bc0e8e0291241906a088dff3a1e6bd6bb0b96b1db2d71d7e5234f6d933"): true, - common.HexToHash("0xcc7122b9e533c6abc8501826ee71dee7f7501c5780a8163d1d7e13fb20879956"): true, - common.HexToHash("0xeea25f84ef5d10b2740d7698af4c72447617f7a4504e907fdd8ae0baa2c0a2fa"): true, - common.HexToHash("0xcbc3a1b31b6c6ce1b7eb08e322aafb32c78adb602fc711476816b730f1eb59b8"): true, - common.HexToHash("0x99727ed23435a7e3ee977132a79c235d6ffdcf79868b70951b1fc321dd1f1797"): true, - common.HexToHash("0x70759a5150a5ce3d63d1102f4b43629bf062cbd5ac30c60d2729ab1cb52d2cb1"): true, - common.HexToHash("0x2426b4229248acba13455bf2c940af0112a1091ee4ae4c87599037d2bb5b62af"): true, - common.HexToHash("0x687ad3ef03286ec8f9f86cb4ecf11abf185ce69e67d8be4e12648d83b5b0f1c3"): true, - common.HexToHash("0xa25c93fe2ee59c757cef0a7192bee208042569e588196ff023d9dd854e926e09"): true, - common.HexToHash("0xbab90dc28378b1dc5cc1ed0678a5e1799cd9b721e7d409ef1fd4ce88a81794b7"): true, - common.HexToHash("0xadafb1512fb386151edc281f98285388763a70318437fcab2a8dab274f325dc4"): true, - common.HexToHash("0x02e9160fab0d73a7d7df024e640c3785d0dcf72621f9d3560165a365ee01b2f6"): true, - common.HexToHash("0xf5b4a48a4af99fc887d559c0c0cc090c8c43a5417cd975d25de95e04b5f0d696"): true, - common.HexToHash("0x3d51c814a5be2afbb7675c3d6955db1b0a6645d5fabe0355b15d601b4db0cbfc"): true, - common.HexToHash("0xab73cffe4d4f226de31f2b761eb8f47d66513f84a72a811b51601d8501b052cf"): true, - common.HexToHash("0x5f8e271e6d340a6c08c851e2e9bc106613792aea4ec8c1f3788542c4f3d1144e"): true, - common.HexToHash("0x2fc2ccd4fc2f1cf88658397a869f501224ed93945864677334aae39dcd09b26e"): true, - common.HexToHash("0x43d3fa83dfb3e0b95a3378f88ba6910b65bfa8d20db852aba8d4cd167f35a18d"): true, - common.HexToHash("0x8cb8e0accd6371684c41d05a1f40991e8bb4682e9e1ce044c4d7b6993b7baf95"): true, - common.HexToHash("0x44a22ed50c6ce8e535e1e0e5dc3aa2b2f1820c685a124885d6b80b70607e8ea9"): true, - common.HexToHash("0x49ee17f8bf2bf9a70c79ac12574b8a0f14738fa57aa58b86b08df490af7a8c4d"): true, - common.HexToHash("0x741740b656ea5bf385fad93cac9d6ba02b6eb2292ac829c23f7438c4f8c6cc11"): true, - common.HexToHash("0xb1065d8016aca632fd7265ddbbfd82b95293808552a26ae703b2bcf236663665"): true, - common.HexToHash("0x46a1f68f8da872f1b9167866ff93e70461e3edee792a9b52362ec83335811aa6"): true, - common.HexToHash("0x32705ab6b251cd0ec32adc5d1a8c4a85759389ddb7ea78f5e96125d631b943a1"): true, - common.HexToHash("0xebc488762f0998dab2b686c9ac35bc32aa1f69951e5689946c19c3414b594987"): true, - common.HexToHash("0x6b53ef923a483ffdfd188eaaba4b2c79d7d6a2f35b5c999b992b8afa76c86cd6"): true, - common.HexToHash("0x399f8d2ba94c5fdc3ca800b87c11c96002fc4a9dd569c5c5eaa5daacb8a30499"): true, - common.HexToHash("0x94316fe1639d5b123d9759fa633ad6a01514a25371deb903f0d681c1bc657444"): true, - common.HexToHash("0x421e7def7302b60bc3f4a8c53ea422dcd5aca1a7ed013069fe9e787570318723"): true, - common.HexToHash("0xdabd3917c6b67bb28e434726a2c70df9f117b478f8a7cc3038ad8c3cda4568c3"): true, - common.HexToHash("0xa3aed060b325f5045eb23d0c5989c572e06bf042df163f8f0b10e77fb547c99a"): true, - common.HexToHash("0xd6ab484bfd0e61181561f452a4b3bad2f016a1d65d05c385a6b8ce4bd221467b"): true, - common.HexToHash("0x18b4662bda5540bc1fec7bb6097127af7e32b260d55f29ece3f12680517a9199"): true, - common.HexToHash("0xce09b0579b99af8b1ef7443c062c07ff7c4f6fb8114fc5eaa6b3bbb2d1cf6391"): true, - common.HexToHash("0x4b747027f9b63bfd0add785264d9372bc9760e407ccce97c51c81a894af1cd8e"): true, - common.HexToHash("0xd5a0f9534ae92f1ab0cec700b071b95661e4702e852828b2817d76bef18bee9b"): true, - common.HexToHash("0x09e54d0ec064ace14c7d62ccb9199104265494c59616a95ba17f165490ea2a60"): true, - common.HexToHash("0xf8533e3c0e90d797ebaed0bdb2071f51c507b386c3f504c1c2e8f166dfc6680f"): true, - common.HexToHash("0xf6744ab6657c5aeac277406da0142f72d3a8b1aff293dac81a423960fb66e6e9"): true, - common.HexToHash("0xbe5978fdc94c165f9717c2ba0bf5c898a6dfd25d7819fe11bfb596b72c83e9ec"): true, - common.HexToHash("0xb98d4562f11f5b62fffb1178b6e9a00ac9477c2b994673c1ae8a7e2a2bf686fb"): true, - common.HexToHash("0x86e275bef5d7c0079399d9f62594ad30401355d4c6d220a8e3e5c62bfabd5f9f"): true, - common.HexToHash("0x3c47b6517dcd7975c3382942fbd7e39c9506f8223c0111b115916a6b071e50fe"): true, - common.HexToHash("0x2ab7a9c6fe09dd5a4ea9c5d279f98933568a8cbc7ba0962f5556f5f0a0b5feac"): true, - common.HexToHash("0x3460a8df03dee771f5ac0f7b3e0ad05cf78a6fa43263e72998d139f1909367cd"): true, - common.HexToHash("0x8757f7f1715d6842f396b9382db02f5ef853b483373f2e81e4021463169b088a"): true, - common.HexToHash("0x1358c96c08bd798603dba608b9fbd461182062d58cc4457194a61cdd61b1b672"): true, - common.HexToHash("0x70d888679c56c1f418354f3a12c656032026443355d642b21e4a2510b1ca9a4b"): true, - common.HexToHash("0x957499ecb00bb90013f0f0e48b0a090135d191f2eb2c7359eeefb0c826b54137"): true, - common.HexToHash("0x2212993aa3be217c2063fdd847d48c9de22e8d6be1f1b103d8d1e0dcf547c598"): true, - common.HexToHash("0x0ef767b5857a6d0aabdcefe925a07de4b6732f402c12d220837562a998d93506"): true, - common.HexToHash("0xb9f0a1a75e41dd193e84c0538645e97b00ec32948945606881786d31337f8266"): true, - common.HexToHash("0x929f616f2a7e725cc18a401ba3ad0df7586c1035773bc3da92b86d8b93ed7041"): true, - common.HexToHash("0x2218b2df6bbb10198388539d55e00f611be1454676a34a754598246cfc3156e2"): true, - common.HexToHash("0x149af9d53fd907e1533249b1100e3df6362ee801c0ea3a98a744ab885516a290"): true, - common.HexToHash("0x92ec0d079f7fde09423f4243d122cef4c41107c4dea97cf73b8ab2a7be061690"): true, - common.HexToHash("0xd8ca8e0d539ed2547ebe7b562333032d3fd765c4d0b5ca52a49c0232a0a4e999"): true, - common.HexToHash("0x20e40f174faef1babc276acd60096e02646f6600bdd1ef16fdd65f20a2970bf5"): true, - common.HexToHash("0xde5cf87e999e9dfb8c163d516148ff4c121871b2c775f4082d47e2d07d0190df"): true, - common.HexToHash("0xaf518d3aae4a55f7015255a61cf52f07d0965c04b549f2065619fade0f2f0ac0"): true, - common.HexToHash("0x6cf3d83b3315e390f2c57d61153148f8b733ea7c4cb30390f40b5e1baf106e90"): true, - common.HexToHash("0x167a7f3c8959daabc97de4ae1e8e10fd51acdeb46726d3c4ca495cd5ea1de68c"): true, - common.HexToHash("0x384310b8c23047724a62c871789fc409c41b2375d3f954b6a5d7479ce197a367"): true, - common.HexToHash("0xb7847b77664be800fda52a04a58126ab70efe8c6e5f0d6da3848e987840cd1b0"): true, - common.HexToHash("0xa7c5f1c7451949db60973c4b665a4f8f2d614c572bd2f7700169c675b36f284a"): true, - common.HexToHash("0xc417b1adbbf3bf8bbe5a9e07e4a402ae413ca02fe13c8209bbf2703fafd49206"): true, - common.HexToHash("0x1cd5700f7b8d7eeb5885e39afb9a558c4a90b6315e9ec0d1cb3e0d49b7c22816"): true, - common.HexToHash("0xe101457bfcab8da2b6659da560d6c064719019943e8b33f523ef2b48c02dce3a"): true, - common.HexToHash("0x06652e0f1cae19148e997034d0a1efb58c6e2f3cbde1be5259af51a2a0d8bdfb"): true, - common.HexToHash("0xaa8cf49251a503af0b15553f1f220aef8bfd007b064d7c20fe3bec1e210955a0"): true, - common.HexToHash("0x33b479ae8834495bf08dedf3749fb0fd6608f6bbdce139c69094a277b652b0ab"): true, - common.HexToHash("0x2bfac542e9b9fbdce1806adec945e37339564287bc49fe2e4771991fff8f11bf"): true, - common.HexToHash("0x693591e674543f2ff6a4edb03705383c7f111fda75c223154e6e1b757c67851b"): true, - common.HexToHash("0x294722e16d94f3abb746ef776699c656f0dedf34452dbf9dfe5d838d33df5600"): true, - common.HexToHash("0x17fd910aa322f00838b163f8cecc1808d3df406b11569cca7d83f720fd6635bc"): true, - common.HexToHash("0x680695999be4472de06e2c4d53e4f242bdb508a112d3008d6798cea68e6fee3d"): true, - common.HexToHash("0xdfefaf210609290cfc30cb7d9f2d1540443384f5ef8ee561e017bb7dfb147b94"): true, - common.HexToHash("0x78909329b599366d4b1d4a8c4f63508491e4430eade131a770363f78d79277ab"): true, - common.HexToHash("0xcc394c3279d25e0b6ddda5f733e84f5617337b69d59903e5ca819712da944225"): true, - common.HexToHash("0xbabb0453426647e7f0a557958559079471732f1cd0c34f01e5b1a1d5eb5b826f"): true, - common.HexToHash("0x9c02a599fa73b0c6554cb902f644c2e809f03bb2442d4102d718627e13fe58d6"): true, - common.HexToHash("0xd3c283e130df65d386a865cce695473f25e2fff42805e00f0f9f6f7f332bf800"): true, - common.HexToHash("0xffb7f2ebbc85415b3e53b3291375932bffd9a4893223bc9cb5027a10e6da0ed9"): true, - common.HexToHash("0x3ccbc96583cae682761d31ee4046e887f17b07c9dca37a2f8cd72f450d76b1a3"): true, - common.HexToHash("0x3422f7f4ad8c20d555005f0d76fd45dc6b882e493eff988622a04ad931dbfbda"): true, - common.HexToHash("0xbe1126bbc12f8257154f953f5ce77c8a59d2b07f736bcf9bcea5c1abc495b1c8"): true, - common.HexToHash("0x9917c646915e4f18d6c09dc3a825ff98d0826a165f8a2ebb9edd5eceec9dc7da"): true, - common.HexToHash("0x45bd79d212beaf95b390bc9a8cef5c078a126b0195e59d56749cf88165b508da"): true, - common.HexToHash("0xeb043420e88b9f0f25cc6eea4c7ca56d241c7fe763bd4521548f62350f750f2e"): true, - common.HexToHash("0xee75861010f7d78b06fcd765171be76a34d96433b67e81b615c9c454dccd77b2"): true, - common.HexToHash("0xc1400e9f20fc2084504de96603b7b03053f704e702c2e92202bacfd1eba098da"): true, - common.HexToHash("0xd20f88dbdaf20bc629da08a1edbb96caea7f8044b8fb4f4f1051049938617642"): true, - common.HexToHash("0xe1557874f1669c9e607c2fcb062615dbd5046e075d4069e1645d75f5fdd353b3"): true, - common.HexToHash("0xda0b9a2135e71a9851f22dc3bba9b9a1e28f46b46c7d70a0c6c75ea8a0f440ad"): true, - common.HexToHash("0xed82cad522780888ee3b227f7467209397330427741f1d1e01fb2fda5e4f84ea"): true, - common.HexToHash("0x15ce699ce456125914c257ee2191fefa82c22af0cbf6ad4ab87b6f1274ce15e1"): true, - common.HexToHash("0x4fa69efd1fe8cfbec6f73d6445204e8994576593b174a0283fd6c03e114157d4"): true, - common.HexToHash("0x5da748e143c3189504aa89e6c8d9e1c8ce0c85e39ce871d7c6b553a1af48dedb"): true, - common.HexToHash("0x96ce1d6c743e29f9cb73624cf7a0561f27ecb1ef6399ce12044ebc9a09e2db21"): true, - common.HexToHash("0x2cab3e6bc51fea5daa4732e63add548f22dd97979d28f6067a924a24bc5029de"): true, - common.HexToHash("0x7386c58587c9fc09edd81f5c90024b2dd7babfb52a848ad01ec489695044dace"): true, - common.HexToHash("0xc3a1cfe80af7da5441e5126e8d18e709c28aae825b6e291b7eb68d8cff473693"): true, - common.HexToHash("0x1af14025a2fb7547821b88169a7609d953579bcfa378d9264832e6d3e2b78219"): true, - common.HexToHash("0x26fd559aca183c70f76cd59c5fd2d137e846347b63bf12abcf66cedcc5c4f051"): true, - common.HexToHash("0x2407e0b257aa481a8c5744143d3ab74e69d767a809fd5d28efe31e0d5234d9b8"): true, - common.HexToHash("0xd2a80c8ce099337bf390abf3a925c4c76bdce8c6e5efcbcb8874070f64b42d75"): true, - common.HexToHash("0x5cb53fc763df72668f838fd01d38770348da5461b4093ebbfc70fc39538626bc"): true, - common.HexToHash("0x7a6e0cc8ca5ee9f482f97b89d96b6dedfe040c017b9a1aeda8576f004c186d99"): true, - common.HexToHash("0x0baca4b4e53cb45381e1db46995226e63268616180a460e9cf09c31261509d92"): true, - common.HexToHash("0xfb7a652bc83f1fa98e2e3c323d45ef1c510f4a890806dbd2d3582c28e06f6863"): true, - common.HexToHash("0xb1a874b01dbcff905a679d657bf080cd8af78a25cb55d961836a97febcee0278"): true, - common.HexToHash("0xebecbf7142c766cbc7433e42fbe08a58f30bc3d6ca1ccc34d4f1733dee1f2c4a"): true, - common.HexToHash("0x24f187eecd01d248683cbefe1503432b03622b47944bc8d24a7209be19462a57"): true, - common.HexToHash("0x408f93e793d666e74edd3a20f846d64a7324954ea9d10197da0c7532be8961ef"): true, - common.HexToHash("0xf6798fd85ad2b91d97683727ab1375fc57accc157bc49736ea7812ad7b30acf4"): true, - common.HexToHash("0x0290d7ad1f07de29ad3e0986bd33bc8a15b06150145419e3838343de2cf35956"): true, - common.HexToHash("0x9928a33ca4ddbafbff4e582221b41fac8ba3c684ad19ef2c587904d016519fbc"): true, - common.HexToHash("0x92dc8ea4afdb731adde2f389af2b1f0218c68256f4e64fc7375ddb2b474ddc98"): true, - common.HexToHash("0xd1a57fedf082149c5de55f8d0b1a3e2870a0db2f078af55a05d00a945df320eb"): true, - common.HexToHash("0xff7ae6c1cf3a51adfaa954dd7d47375307bc27f55816907cea002c9bf741cba7"): true, - common.HexToHash("0x70d8b0fa33b152f337475ae09ec98701f569dc05e9143865f329c9079f09b9f1"): true, - common.HexToHash("0x800df45db86cdf6a3da55f6e4edfe9b8de208d6c318ac1851fcdb2dd79163103"): true, - common.HexToHash("0xf267db8e38e8439c5a3e330e0e81e3652831a5c3989c451ab3bf07529b590677"): true, - common.HexToHash("0x9208c7a8b9522097d93f4bed6e1f19c660ec4525ad49a792efe0e12361303aee"): true, - common.HexToHash("0xbc8b7aba78ff8b0b97c0f7d79d690995c2334b99a79b6f1963603f132637f008"): true, - common.HexToHash("0x924c6b922dc0dc0df3ce43db552ab1fa618f24b49569f82e6e0856e98c2acf1a"): true, - common.HexToHash("0x323251e5bf0d566d706cb393f831dd66792740636b9f71f432a846ffaf54337c"): true, - common.HexToHash("0x45e7e0c0bc83d0e558e6b0fe46259c62d52e024ecb680ab006f848353fa14260"): true, - common.HexToHash("0xae0364d2eb4eadb8fdcba1c322dec6515965c47ce97836febdad6a565bc89d1d"): true, - common.HexToHash("0x5700851ca0a7e82ed1a68054edd8379f46a7b87f2e11515a1f51284954067864"): true, - common.HexToHash("0xe9a7e15845348b0cc892728a8c937f1e40e62473617f6191a7a7a08ad2e3f878"): true, - common.HexToHash("0xbe9a71e8fb5e1376637a29792623c35bdee05aa5f765174b4f310962b33adcdd"): true, - common.HexToHash("0xc6279ac2c7b60bddca184b2d02584021c064bbdceb7acd83d0485e0cb66964b8"): true, - common.HexToHash("0x2f9e5dc81749e79f7c1d3cd5f2401f62bf08f008a112f28056f228425ee891c0"): true, - common.HexToHash("0x7305b20f68049cefa74a07b880e4014afe8478c9a2aeda3c860cb4a0ae08edf2"): true, - common.HexToHash("0x9fb6beecb0c04126df1b4f33dfd668a9e196a9b5f6187f3229fed04d80421cd3"): true, - common.HexToHash("0xa17faee2ae5bdb733ba4930af53439bc2d05cbc9efa370ade01a15074df45377"): true, - common.HexToHash("0x8f3e0b9bd45a1cefb197dd782a692b5b76755e0d50d3f2928028daf9525b4730"): true, - common.HexToHash("0x1badff38b17570f88008414e946f5d17528999d48c3abd3977afa9c9ddc312d0"): true, - common.HexToHash("0x1a4698d4ecf65e3f0ed8c587135ab0ff22162dd481952aed3770272e2e8780f7"): true, - common.HexToHash("0x7a75ed3781b886b1af10aa94c1702320560c5e95f673b483272632664265689e"): true, - common.HexToHash("0xe2fd9af6ed063a38a8f93ecca36bb96698b132801d00f4183fa2271e03d9088d"): true, - common.HexToHash("0x5fe5aebc465b8db27c946701bce91d6eda0a273e9031b19d8fe2394a1c894271"): true, - common.HexToHash("0xc91a44b776461ba656a7c6e618adadd29592f5a2e46ad13406fb1888c799a8ef"): true, - common.HexToHash("0xc3bcaa37edb0c5a64f4dd5fe1a0585c0c45acd46728bf1f7f8c54edb1a9a2e50"): true, - common.HexToHash("0xfa82adbcb2d680c0790939d2132af44f2f28fab795ff69146b54dabaeb378d30"): true, - common.HexToHash("0xada4aa168dd02ec050c8a2e5cca0198db918f46f6a2e8e3d4d57f43386830a27"): true, - common.HexToHash("0x0907a7816fd1d11dab193fa3dd5d7c0888790a7b3a0e8f0a5d6a7ac8ab249e6a"): true, - common.HexToHash("0xf422204816e4202120ddac4a09786d7047fd05ffddf96078f70056476d414f4d"): true, - common.HexToHash("0x120f0244cce8400611b10d5a2cb59f113734e91c9bfa01a0d418611474f15ac6"): true, - common.HexToHash("0x98d3d7ceb55651671404c435e0d2aa428d659a39e8a87ec8d8972bea706e1fb8"): true, - common.HexToHash("0x9be9cdf7b6e21ecdb1f5c85087435a88a3b618a8625bf1ca53499ee23de8cc93"): true, - common.HexToHash("0xa24a3dda929992de5a20b5d29cb275b8f1be5e2f1e0a85634a79d2bb352222af"): true, - common.HexToHash("0x835b10698925d0a5473b7c18600c79d245c4a1e3f28136decb2ab88ed892108c"): true, - common.HexToHash("0xe5182278231081c6ac7c95c1b154e667a41f5af7453d735a11cb37cb01d286f6"): true, - common.HexToHash("0x79a364542f9d9713ef6475dc10105d30d35d488ee2d71677802b60f45970c134"): true, - common.HexToHash("0x5331b9316b0b3f22da68e6f0c4343a62febd74143b2401a1182b91252b1c818c"): true, - common.HexToHash("0xf4ce13d5aa186cfb736a485f430e99f5954d5246ec81231654a8760485054055"): true, - common.HexToHash("0x9a798c8125dc5494f1a73f8957396934edb883ead19d1eae3a55b2e7b0df6660"): true, - common.HexToHash("0xdb45414e2f0f2ee1d7b8089c74e9aadbf10401dd91ff50574ba2dd6f52ffd507"): true, - common.HexToHash("0x57f57efef0e12f84de34d3f33ea9115e0993075beee367234a649b73bf9d115d"): true, - common.HexToHash("0x6b856af5068e15d54b0a65c6610e760ea872f20c9dc64b97e9d7ed2306b0dced"): true, - common.HexToHash("0x1c3e6571e5e2e85cf3ba50c971f5540ebe4cba18d4be1bd5393be4a57cc43d31"): true, - common.HexToHash("0x2383445031a652fb9de7f656256674d1650f0d76ea937883af6131614e1fa2ec"): true, - common.HexToHash("0x3e228255fc888b7c1b5f5d2c882a66de92d1bd77e12617fc5a7256f973f851ce"): true, - common.HexToHash("0xc13780ce7041295c856a1a01ec8a9b86c362ae1d929e537df5cd19ed859c0961"): true, - common.HexToHash("0x5bd1e49fa7755597b6aab43a86f3a6a2fa4c7597f7ed1c405b93f4436797976c"): true, - common.HexToHash("0x8e8530329df9da3c19b613be1883e5c6db7444db3d38f3b5a174507492c2a74f"): true, - common.HexToHash("0x5a61af54d84eaae46babc23b1d5cc4b4489635923652ca60da5b99d41ef8a515"): true, - common.HexToHash("0x1de72e6955e60567d48b200258f4c52e522bbc6abfe801af5cb68e6c8ecd0c4c"): true, - common.HexToHash("0xd76f499d3aaca60109415b7d0614942136ed1eb4a34ebe315c97f774e352b162"): true, - common.HexToHash("0xf6d7c06c6b93251375aacc7cb6522776ac3f13719e34fdf1e6a52de89eb498d7"): true, - common.HexToHash("0x77931cd6eca3e7cae94683cd8560fcc3f8046fe0a81cbea79ad62019836c80d6"): true, - common.HexToHash("0x571e8946823f2b7de0746f0e9de46a9745c00a8099946d800318f9ca5a97ec36"): true, - common.HexToHash("0x6a60eae2cce628c568c963f1df54520755b2c02765eb4d305ed88918b1554858"): true, - common.HexToHash("0xbf221a16be6d3aabedfa9cd970ac86f62be2f33827400c272a54ceb49fe21dc0"): true, - common.HexToHash("0x509105fcbebd89603c1d70bcb35df157f7843d8f83ebaccc6ae4015f0c6728d6"): true, - common.HexToHash("0x9473dfe95c29a5e8150e4c7bad32a9b6520f0345eb2c0858bf2bc6c578554a86"): true, - common.HexToHash("0x7a2c700c9b0fb019d8c5b086b950ee22d656f75e9544624c102b53ae9f536b29"): true, - common.HexToHash("0xce158ada44c2fafe3badc5c433e2ff837627217e9eb8c5fe48c2559398c618a7"): true, - common.HexToHash("0x67877b9d0625d30aa515307e76e42f9f26014cf3ccc08dd5520eecc7d3f7a428"): true, - common.HexToHash("0x3f0a40bae5ac14d8c1fb9e37a223557fae9bf8d94908daa829cfd7077a676fd5"): true, - common.HexToHash("0x410ec8d74f35371e826db5d0477ea9cd24487604462c7dc59bc87529806ef5b8"): true, - common.HexToHash("0x3c580003a457cd3bfdb1fc42b23fa85ae2ecc4cfd4b91644f742faa267e349b6"): true, - common.HexToHash("0xb95da8cb652216d7520c325a20d5ee2b9a805a91b4b7a7ee634d5588efe9cd4d"): true, - common.HexToHash("0xe8cf50ca87d93d534fa485d93355c98fb2afa99c4578813005f0e611d8619ee2"): true, - common.HexToHash("0x28ec01f3c938e20f1707f01228fc2fe143bac2886bb9e395bae92c3d240fef40"): true, - common.HexToHash("0xa93b2c554d011da6b1045dfc38e2778ebed45994e705cc0d407499e04e1303f3"): true, - common.HexToHash("0x8a94d3f11710595a9d316d1dad616ee192dd243a79e5390811b4199a6e53e565"): true, - common.HexToHash("0xf2ea318c9e7361358f8688d6a3109029aa9a05729fb5c44a6196623506182fc0"): true, - common.HexToHash("0x1d1cae40814a931f1220d337851d43667f3b9a9368a89e5fa7618f84241c48b8"): true, - common.HexToHash("0x2c8162448f880d76ff7a877bb1357c4cd3309db7bd5e371c4115a9775de382ab"): true, - common.HexToHash("0x2f6bf59dbde590fa0d2a59ab38aa84e073a6570cf8818fbfac93567e56b1a7e8"): true, - common.HexToHash("0x32f9aaa240cccb4de64d9d00dc5d2460381504747fd5e578e7e4486b71376701"): true, - common.HexToHash("0xf8ad6bbc81c79ee3124264f27d01287ee6988d17ba12cc6ca3b5cf7c43ae72df"): true, - common.HexToHash("0xe65bc05fea1203f586e4932ebf762d7b56fa36b8a4441fd822e82d9941218e19"): true, - common.HexToHash("0xdc87e1e24aad5c7807e3ef4a11e5e55454d92e14e60681bb58a011d0552e97b8"): true, - common.HexToHash("0xe76354a54e5110cf0bab1d2e05f3fff04b550680c0fd1ccc89308b8c871d7b1f"): true, - common.HexToHash("0xa133a9a66c11879887684789d52fa835ab43d195ff5db198d902ec4b88d207cc"): true, - common.HexToHash("0x4a21863bc4f1b1b5d5098e9d11aca412c124bf79d33a06b9593175685869efd7"): true, - common.HexToHash("0x3f547181c1c328cebd4387c2c95e4717116875eb1bce4d54804af8587def59d2"): true, - common.HexToHash("0x09408a524ab6bdfa7de033a8325ddd799bef48be3f37731440457256c8ce3985"): true, - common.HexToHash("0x038dca969c5d76947bea40ee7b32abff8ad87737662e8f36cc73947aad989e12"): true, - common.HexToHash("0x77d726ffd6531463eeaec52681e8fe84fbeab6a115e610412ba93f528cf43f62"): true, - common.HexToHash("0x8343508aca497a8eb2d7a236ea24d8e2a6ca80f536413d0c1745abd17c465954"): true, - common.HexToHash("0xa1258e9696247cec2849ebe5c6c18396000cc4720aef2970966ec947e3736528"): true, - common.HexToHash("0x4fa9bd4ba3a39c0b560b9fff692e7ef4b03c8d388e0f1096b65a611b4e267566"): true, - common.HexToHash("0xb5c691c8f676a7ccef8dc3e3eaa9fe65299b6b227b1b1e7815c4988888e3b939"): true, - common.HexToHash("0xf1179e8c04b8402f99acb2b0d63678f759e90155881a55364ddca4cd6ac72fc4"): true, - common.HexToHash("0xb7e765449247d764633db1286c7bfc1af9a2f49f8ddf63a52c9aa3196a28225d"): true, - common.HexToHash("0x7fa2140a5002d9cd1687a605c41d8d85ccd6942c509271bdae96ef0b33d3d571"): true, - common.HexToHash("0xfef1796abc0a1cfe7b5868b5dfc78e3a023df277e1978f0b7678f8e4870d0be3"): true, - common.HexToHash("0x6b0160a7825c884d60bbc048d4d479ad229086c862678250d28653dcad4507a2"): true, - common.HexToHash("0x520f43bcf1715a0a40f118d3fc493795abc4c8146eb26ca7bc36ff439dbd029a"): true, - common.HexToHash("0x7b652b1b76a953e9ca30f1ae617905bd8eb2363973981bd24800243ec6c9cf2a"): true, - common.HexToHash("0x147b493834798c086d5922ade15f9df9b8cb86aa3ab8c92edd59e9b9c49b765c"): true, - common.HexToHash("0x3ddb03868963564b6433cec490c853ea95efdcea6da2d938373e7199b682ef4a"): true, - common.HexToHash("0x270f76c69681083335e61d800f3ce0e193b155b8a7749bbb45337221c8333a01"): true, - common.HexToHash("0xbc5b3e8891994629c53494e0a0d7c4f6286afee9ac5e1748c7424cc9a89feba7"): true, - common.HexToHash("0x9f569d6b3e721391a14cb30a5632f5eca6cb51e444791839a025d42ba486722f"): true, - common.HexToHash("0x2344764b48fd63a0caa9807e4db5c65f9d84855ff817c3c5488bee3914a11b39"): true, - common.HexToHash("0x34b4bba29823eeea24a4a162a44bdde86ff10fce492d4d6a8b9239e2564b10c0"): true, - common.HexToHash("0xb9816e268a1114088ecfe01bc4e5ead47d7a2c5432cb03b9ff1eaf80e92d6e69"): true, - common.HexToHash("0xfb29c5ca5df49a6d537c2918e156edc730b98dc08386442a074933811ccfcc0a"): true, - common.HexToHash("0x541932a76f607227a6692f039133207a24b6aa8e2cae4559977fe13768340e1e"): true, - common.HexToHash("0xc8b7665d748ee4fd873b1c89f435592497670485d000a1f407244c458379c1b0"): true, - common.HexToHash("0x4c00349836ea9c1e6387367761bc333f94919a9a8ed27caeb481d18a01068a39"): true, - common.HexToHash("0x3f86bb9372674ccc5cf13669f9ad1165bdb8c77fb34085a4dc276b7cbf527c46"): true, - common.HexToHash("0x26b9f2f747af656e729e170816848a9eab803a30cdbba0fd1f18b62628120912"): true, - common.HexToHash("0x4a7782213641ac422002ac8924e249dd03b54ab022af7b49a1c1031f421bfe8b"): true, - common.HexToHash("0x6404a9f92e51a41c41c3aa6084298e08e1b448f099af26fab558dc9ee0de5af0"): true, - common.HexToHash("0xedea1189d696997e61a9795f06feb507c8b8c798e3926fc64bd6ff212540dfc0"): true, - common.HexToHash("0x70febddc6e956e2faabff09f08f23405c9efbe958e31bb7864533bbb918c4eb4"): true, - common.HexToHash("0x5d28aacb1d65757ffab86bbfb1ef91b43d16f2314126d9bbabdfd7f3a63ee2e5"): true, - common.HexToHash("0x1606fcdc09079630162ee909dc479f8ebd7e4719b82fcab24f53f36c25cd1de0"): true, - common.HexToHash("0x1d9e656bd52325aa474190baeaecdd920d59f9aafdb8b676e0cfd304ba7b878a"): true, - common.HexToHash("0x53bc5eda5953275d869bf298aa32aaa9a778fd84672bfcedf30ced2544ad2ddc"): true, - common.HexToHash("0x6c7fd6ea3b3233f883ba012150ab0bef693b61317e07f2375006c568021d25da"): true, - common.HexToHash("0xd733471db32590968f79dfa49970b314a327b872b1ded9a1a8c8726e676d58ab"): true, - common.HexToHash("0xf9edcf7a0448e9dd510b99ac7a56a503898661273eb76b549dc63d378fe0ee00"): true, - common.HexToHash("0xf63798bc22dbb0788116f1db3b7e31c0ef3fe8995bfd2c3b139eb7be367a8f07"): true, - common.HexToHash("0x9204125cf631349668954526753e2056a536991a9d4a99358e77e55ff515b447"): true, - common.HexToHash("0xbf3daf382a5585b9596bcd0d7663fe76e3f5a843fbe7cecf1c6dcb50823c954b"): true, - common.HexToHash("0x0628adfbbc85c1212b77b4af07223b8af297f5f2ae54601c3e51c7df6bac32ed"): true, - common.HexToHash("0x4ac27a375754f7ed283cf2628190e5dec5efebf6f9f85d9aaa3e9ac529b469e2"): true, - common.HexToHash("0x9b9a1d220b37b1521d8a3942b4a52c44dc5a4758ec4a605ecd7c0679d4bee516"): true, - common.HexToHash("0x846cf4fa72f3e3a71faf7e5a514088641da766426318a53f24abd8609f5383d5"): true, - common.HexToHash("0x66ce5839548a816abe06823830a23b44ab30765462356f6ee34e1d47d56e15ac"): true, - common.HexToHash("0xf46838cda004155001da6fb87eb85eb6710c326617983139dd379a809c496c8e"): true, - common.HexToHash("0x3e0b72131cf81a9d076b8dff68e89061dd653ba360a372120833b7da9b5f87c7"): true, - common.HexToHash("0x081b03158f0f52a22b28c4f7dad9fb6d9e7aa211a6ff91b710f3cc23666ca98c"): true, - common.HexToHash("0x6a0521ca3765cf112bada89960e108b87c40ddb3fff413f97d946fe97239b3f3"): true, - common.HexToHash("0x53692668c56afcca4e8794261854225adb3a00f1c994518bf92a8db0e80b83e6"): true, - common.HexToHash("0x63ff400f70e2a61d9ebd719ca8b184cfad923135dfd2b0a61bcd01e037c59a53"): true, - common.HexToHash("0x3da55fc2c13789563bf95f9b599cdea2cad4ea5ce46ab5071c0bfeae51e19044"): true, - common.HexToHash("0xe016f35ee5f8ac5e7215da68d59ff1abe959a7f23ebddef3a00485067c065585"): true, - common.HexToHash("0x5515dbdd43589a73cd326a1c80856512e0a23d6bac7aef06af6c259c18bd0fb7"): true, - common.HexToHash("0x283d937d8cb8623b5513691cef02776695963d97278310f8c22bd36341b490fe"): true, - common.HexToHash("0x16e2a69dec6c2a5ff2197611169f76c09162b48d297767b0b8683aaaa8af4d19"): true, - common.HexToHash("0x8de4b68f1506b2131a09dac4e2846ef0b31a58b8e02c9ace613431483814bb80"): true, - common.HexToHash("0x10d5d897520477af195c36dbed120771ffa557eb260bf2b0f2a81c2151f15d87"): true, - common.HexToHash("0xdddc1ecda1dd5aca9d0ed825811474e214e3893710cb40212500d5c797fde191"): true, - common.HexToHash("0x08bbea0c7781be6df59026ab3b97734f3bb9b39e63e2bd4ebc09ac122c1bc3fc"): true, - common.HexToHash("0xc7aa8fdb42c3e5fa9dff0bcad2cbe946e669b9ca8379ff6262fc8bccdd18cf70"): true, - common.HexToHash("0xef9ddcdd97d1d82893e2aaa7736722bcf8cd63232f1cef8a223594da21a888f9"): true, - common.HexToHash("0x824ec7ff5d45a1a0e3d407807a0dd458387075f7a5184896d704cbd83cf1846c"): true, - common.HexToHash("0x32e1ec8604cac27a8ebc15ac8d1c4b7cc572ca5032521de4e13d044372967937"): true, - common.HexToHash("0xbbf2fc5a667524327268835226a79d3ce85ee53d9341023ac1a5a0929fd60a53"): true, - common.HexToHash("0x7a8b935d77ee0988143be9e150ad64e5666dfafaa602818b4956d2327924e86e"): true, - common.HexToHash("0xd5c2cd6e4f7f9763da7c3e2aec3c2ae71369298e7fb6a83dfa98f32056c389f9"): true, - common.HexToHash("0x86a7ccef11cd34b880e6e92c9ebac7ca1e98a56a46372f1621308846a6ea4476"): true, - common.HexToHash("0xa5705d5db032bc5e8d995b65afe8a610e39c8f8a3900fc256e087b58c3bbc18d"): true, - common.HexToHash("0xcb8f1669c7b23371aef3a479197bdf73255d73b8258645b0c117fe9875bc25e3"): true, - common.HexToHash("0x8d36a45740d745e2bfd8655aa46685771a2e0eca03c2547b28ad01356fa22a75"): true, - common.HexToHash("0x2fb3a7d32c323c267bf1150aa1d0292efc67c272441953e6187d394dca891887"): true, - common.HexToHash("0x967e3ad8cb692e04a1e02a692c371478a53e4598af89af3dead3fcd3a6b0092d"): true, - common.HexToHash("0xdae6da10345a3db5c558e9c47661ef25b922fd7e5dde73873e78fd583b8a1698"): true, - common.HexToHash("0x50ce24a8200d0df1869b842a2ad140b526ad59d983188c7a9d01b3db6120b164"): true, - common.HexToHash("0x75f834d289eb1588e8d88c46374ab757a825efcacbb98cdb7b035383ce90039e"): true, - common.HexToHash("0xbc0a4445118fd3c908b711e66f95b63b355b7aa52995ce9565d2f58de1fa7d32"): true, - common.HexToHash("0x334a666ebc2774f3a66b3b958a99805472039cd298624aeb3d67a7d0cbe3520b"): true, - common.HexToHash("0x2fba637f662df9387552d65b052d607f8be8ef323dea1d0f9ac0f776f3471c72"): true, - common.HexToHash("0x10cd86bf177c917e00d6b5105a2befd52518ef7992978b87397626e45c1a0a21"): true, - common.HexToHash("0x11fdc3582f094512953e9f25a27fbd5efa00b2ce4d8bbbecaa5a40f79d032e61"): true, - common.HexToHash("0xd03f615468ca10e1fadc05cc91b04a4f6c9ae462d24b8188bb9b2dbcfbea51d3"): true, - common.HexToHash("0x546d72a11937bdbe1d7ed5c0331e671d92c5572b38d605935f26f42a6276ac9c"): true, - common.HexToHash("0x9de14a965eb7d3e33dbef82f8982e38544a30f30deb88c30da29761b62f422a3"): true, - common.HexToHash("0x33ec984c05fccbfb8f70aa225d8a333c35a8c89d242f3a3143669ec9489b73f8"): true, - common.HexToHash("0xfdcbc1a26b008ef366beecaa32d62d3e147500c9f77e5f132917dc39d2d82d17"): true, - common.HexToHash("0x7284a683b9ff457053aa902ed1a79e618e570662acade8c162409b3879ce692c"): true, - common.HexToHash("0x1599a8a0f847690f9fb58d742c19fcffb381321d4d1333ae295cfd200200150a"): true, - common.HexToHash("0x69be8ac8d9436c77514e76b3b93c3ba5334ba76a16d3210b4abf96420d5c3b41"): true, - common.HexToHash("0x67a8218ad67e2f0df72620100c6ce86f48ddb055cb8f253d927dfab0a290a611"): true, - common.HexToHash("0x774dd0f5dbaf4c2aeb35b899a715ab599dc87150aa65392b3e9d4d690be6637a"): true, - common.HexToHash("0x732a46c1b4d3ee01aa49cedd83a154e1a022d73a410f0704525df19ce0a65430"): true, - common.HexToHash("0x0ca1f82f0ec041081f73d96c5e026242cbf117f14f12bec97661d87c5c791100"): true, - common.HexToHash("0x6c4b2f2878be32653fae84fd8953419ec46106231b384688e9afd97a8dbda69e"): true, - common.HexToHash("0x817305544aeb51babbf9a484908d097f13e9163559e83fa75d5d78c2c8f20265"): true, - common.HexToHash("0x683fdcaa4e37fc7fe2bd16c487f71e88bf7e2849014ee1f9bd7729cb081a732b"): true, - common.HexToHash("0xea31afec73e00c8f781e4ce0cf840b634879debca9e2adaa67950e6d219ca9bc"): true, - common.HexToHash("0x7b2623a83bb8d328fbe345eb0232cc21c68fcaa561873b1dc3cf20de59483f8e"): true, - common.HexToHash("0x58d0bc5daccfea0715132d8459041cf9ee01aca4d718b567315645043d8d0422"): true, - common.HexToHash("0x8d76db673e48fa27ad714b342b6e6d30628819affac4bfa632ae42b6e175ce82"): true, - common.HexToHash("0x579811ff7adde3136f571a75f70eaa0d1d8d7b425cd6b0826ce70a31610b76b0"): true, - common.HexToHash("0xaae3e650ef23b3c0ba5bad973e3c39a60add4fd73841d417e1d80dac44bc239e"): true, - common.HexToHash("0x834d034a2f584e3006e739db0c632c9bbe77433b2b45c5e41ec40874ce9db3b7"): true, - common.HexToHash("0x66ca74e0b0b5f8cbae712fa3ed4e52105ce88688f3100c3c539906d328919e1f"): true, - common.HexToHash("0xd7fbf46fb23970dd3b04386b93fc1d0c1645fdc8b30c67344a86816a49438079"): true, - common.HexToHash("0xffd083aa95f907bab28594fb850edd81c41a9ba7cd27d2fab16e69bb33d8312d"): true, - common.HexToHash("0xaed049046200c2f715dcf884a6022f3d1904990bbb689481846426f1b2611239"): true, - common.HexToHash("0xfb858ac8ebbebbcb39631d3af0b863d9f7f2a26b6cd211c2301e7e20ce817dbe"): true, - common.HexToHash("0x258960ede3e17d69becf186db938467836f3e756ab07b5e03231ed07f9002432"): true, - common.HexToHash("0x5d9abe83ba8479308533271219784e2f98af9ec88fab9845be8a8f37e8b640c0"): true, - common.HexToHash("0xc6121576a64aa93009d3426b6584d6b6a0a5e235ed4702e9b974756f110ac227"): true, - common.HexToHash("0xf746a8074ec7938b033d98df3438ea4ef817d288ab1b8997704f252e64bedecd"): true, - common.HexToHash("0xeae2522bfc0dedb30942e2ce02dd8a7aaf730f4f9c83257a538deb5b60905db1"): true, - common.HexToHash("0xf7a1b48e6b81622062c394e4eec0404c84449e6ea7099947e9949e80173f44d4"): true, - common.HexToHash("0xd404d82906356fdfc1ba261a428b7036eb9dd4a0e87b11dbe579645743c5fb4b"): true, - common.HexToHash("0xa2287f1acc61c742d27c7fbe2da77a28127391c202bb4a298b9a32c0e3ec08f2"): true, - common.HexToHash("0xbc529d2f57ae41cc61cb538c6726b74492c6262610f41f788bf0e56369efe875"): true, - common.HexToHash("0x1417f0840df6c9c8bb7d8981a56ea349613a0bf1b475c55b4dece69e9bf99a77"): true, - common.HexToHash("0x2582fe1610ddca5856ccf6f11eca11342beafafb3fea6d5c051d38a577413bc3"): true, - common.HexToHash("0x90e66a0b0538084d69cf9e3a2142a92f155449672f3b27a2ffd1bf98c17292fa"): true, - common.HexToHash("0x2cc11f2dc1fb7a7940f2d7af237c81b34a689c3655a483ac8a796009cfb7ee88"): true, - common.HexToHash("0xd68d406b26ca5f649b9f6157bdb5d6004c76ec7929f9372a83e08091a8fa6f98"): true, - common.HexToHash("0x524ddbb6c0c21723bb38afe37aedc5ef57227b85becbcc88ebd7017a747883fe"): true, - common.HexToHash("0x736ac59abad6b81a453e28a46f9b3741983895fbea09fc88ab59920d71ee295a"): true, - common.HexToHash("0x318a7474da5879823bda79d75d6e1b985ffdd438b6de47b387b3643268dcd58a"): true, - common.HexToHash("0x566c58449e6c2943206fc649d62d917d2c3ebdacae2861e31f0aaabc0e0cd99b"): true, - common.HexToHash("0x893dbbe60364705e9d510acbf2e6742f53e4e6c45661b9bb1a7c6a2f35a01d30"): true, - common.HexToHash("0xf39255913f3008eb769115ea35ee2df28fd2110491943e0e1810cb9c8634f221"): true, - common.HexToHash("0xf565a1fe10ffbc5afac51c2c17c201b0a70dd777653a042c70336e3fe9577f89"): true, - common.HexToHash("0x56b92c8b788266505f07b4dd927afaa2c6ebd5f36584c10e809fcfd6e354b31b"): true, - common.HexToHash("0x00617b3f9417c8c26ac011a8d27599d5af16293457540f390d418e8cb3ed5f40"): true, - common.HexToHash("0xa70eb3b104d813a2a53abaaa386ab2d9e977dc49d939f4cb00c14cc87e5a983c"): true, - common.HexToHash("0x66932f3b7092ef958f4f1a50f87d456444cec1c8f6c060f4b4cb033146e8dba9"): true, - common.HexToHash("0x5e85ae3a4f3d4700c163f4abe2e1294ba350915d2a3379039ea5842e370279c1"): true, - common.HexToHash("0x494203b63ec21f4d5df9a111ff158baf4ca91d57bbea12eebdb7e898b125da82"): true, - common.HexToHash("0x3f77ce15feacbdd3d00ce2bcc1929fb4d3302ee0f14392a78d6a6d72babf8831"): true, - common.HexToHash("0x745709379ef80a7ccba5850b48196e3f9b94b415b890a3854812653629eb413c"): true, - common.HexToHash("0x350835896d625732d6ba3c8ff83582527bbe5c6997ba1a4e9d87793f086908f4"): true, - common.HexToHash("0x6c499af6abd643bd4b56d2f18c82b44344b58d22b91861d20db750676a5c54eb"): true, - common.HexToHash("0x8a1ee019bc4db355190acdcd1269cd8b27748f181b6f1b891ca8e3a6b51bb7a0"): true, - common.HexToHash("0x79cb42a45d4ed174fdbb0b9cf105be1cf322619e751c1b01d393a8627abaf519"): true, - common.HexToHash("0x378a486e415627c8d05d8e2ac2dc32b654c73aa6f331040118e47e3d418c66a8"): true, - common.HexToHash("0xebc0365c4a85aac5e794a9f5ae32a5fe96dfe9a6dfe3fe581859accaaa865c3d"): true, - common.HexToHash("0x90eb1377e0a0e6cbec092df9d3e5c8cf4fe1b55cf0106d0890b65e4e484de147"): true, - common.HexToHash("0x6361b9c313d0e3ce87efe8b6763dc84453278bf091741e88f3ada2637c9cb754"): true, - common.HexToHash("0x190014c0e0381a49c011da7535cd2bd4845e333a3c41ae34a4ab8d7e1a9e9be8"): true, - common.HexToHash("0x8016af4bbde2693e5b30d27ff32dce59dc3bcf1b977b8249310eba83c3cfeb44"): true, - common.HexToHash("0x9a6e42878f9e805194fd2f4c997e9a360e1bc389182ba4f75aa8422c24fcf8a2"): true, - common.HexToHash("0x87c2b839ee8e5263dc8cf1bc074fcc4d822d170f1aa36d6e1bbab2a521e0466a"): true, - common.HexToHash("0x1e2a88affb213e1cd58356c87d2a8f09d4834f3b8f9b9aeca8288f94aebb8517"): true, - common.HexToHash("0x60c651d228a646086602f51c8e538b41e46841114e10f3e23d1f985f8c671542"): true, - common.HexToHash("0x038298187e6c22231901b54393cbcae7fab840ef1e896b0b2196dbedb259a9bc"): true, - common.HexToHash("0x6a5247c4d12065a9a3631b952d2d028f8991122e9453ed098142ce44e0254029"): true, - common.HexToHash("0x2dbea1bb0f52d64ce71624762bd7c1481057394d2ccda800f0df84bc7f359cd4"): true, - common.HexToHash("0x68db2d9294a3e1827888c646786ff046ba8b17fe2c6ff968c6a3188ddfcd1772"): true, - common.HexToHash("0xa1009195f5dd3541d89bdf399bc8dcea16fb267ea0cef3c1e20ba58c5209a636"): true, - common.HexToHash("0xbded9e89de51ac7885ac0c0075f0898d9c0925a6ff3a26477d050ebcd89117bc"): true, - common.HexToHash("0xad8e3f3d027c3b77d8382380e349e73a110a08cf1b8935f1044f55b86e80a1fd"): true, - common.HexToHash("0x812feff4c30238d662ed13410cc7ed85acddeecdefac168809234c52fcd8beb9"): true, - common.HexToHash("0xceee99ee42f533e1e11fbbb9d8dc0662deeb8de35288f9c92893f86d59456b2c"): true, - common.HexToHash("0xb439f142f6e9eccd15a083e68589248e58b97d844d24241f5226cef0d73539a4"): true, - common.HexToHash("0xfa9150a99ce1e81e2862209fe3e1e3ec017840d02a493f6291473f13b486e5b5"): true, - common.HexToHash("0x4662f37eb06885be7e5539ca25e7f10e51fd4b895f80536d69330557aa54d6e6"): true, - common.HexToHash("0x302e4a2ad2595f3894b7f0b7ae84723d7a3b46c36592ee8111e334562ff45243"): true, - common.HexToHash("0xda49ffa166be0215813310ab5419943e6ac59f672073ae6e3fd4651e580e6a0f"): true, - common.HexToHash("0x5c7ed8d04255e29d790fbc0c789198b6638467012e85794630ffec7ed0b1ce06"): true, - common.HexToHash("0xbc2a57ba2074c13b6b3e1c96cf555d7bfac21bb6c1edc3d18c3d9da71ca56a15"): true, - common.HexToHash("0x51e67c970d82f4e308b0134308a548024417a99e2f57dc35613981c3b76b0966"): true, - common.HexToHash("0xe11c0ac75a6c404fa77eb9cf8169e3d3f66d314c5127ae4b8f76c3f819fd3907"): true, - common.HexToHash("0xa1d8df10fdcc46ae7e698ac8c88083fb0aa682a92162b001ede9664eef4622ed"): true, - common.HexToHash("0xb97091f2ff9eada509bd40fd8fa09bb5fadf1ce3501ed052ba3d260426f347e6"): true, - common.HexToHash("0xa55e8a6209d8ac518c4d4c141a504e0c7e7f9ee54b30786d8a6fb706d17aea64"): true, - common.HexToHash("0x6fe6cff22678c593bf8d802732335768dd6a8cca2ce2c7e7c5e7fda5cd6f9772"): true, - common.HexToHash("0x6e91593a240b81861d3ef92e92db651cd79a84e63bbfef8c4dfd6411eaafd5ec"): true, - common.HexToHash("0x9606cfd6956b7c02e7572e5a6618e9c84772a956d51b2e7b16a8e3360f8a514d"): true, - common.HexToHash("0x5f0c1029490a71cf280e621228456650963fcba55e5e51458366bc8bb3ce38b1"): true, - common.HexToHash("0x1677973dd7eb890cec3af018e7f6e029bb8c437ef83166a56217cae048ce4901"): true, - common.HexToHash("0xfd180db3add7355e5861fd103e0c7cfb2af45833ac6d307633b886136eb7f3de"): true, - common.HexToHash("0xa7c920c73249df89e9931dc5160339259cea5032dfbbb12d87b39a544c97a151"): true, - common.HexToHash("0x3926986ff4efd6ab9aef8ee8e0157d2b271561b57c95e16f0926bd5a117c9e73"): true, - common.HexToHash("0x71dda1a573ea743a8bef8456b27b25132bf74e09e67442f57d12a5bc759e5fa4"): true, - common.HexToHash("0x1b34a4c3b08a141ab40eb9841c6223dd8a3feb8405fd33fbb146018b02b0f5fa"): true, - common.HexToHash("0x33f1b59d9edddbd24dd9fe39ebea7df68d7d6f722d32827bef5fcac4fe84acca"): true, - common.HexToHash("0x0583b939fe81e5ea3041ebe0bc78d628b020ddc3ca06be24d59e3ce1fb06aeb8"): true, - common.HexToHash("0x918b916415cb257914bc8aca7b8aaa27625bb6035467f051825b83ad6e3ea049"): true, - common.HexToHash("0x45c339376fc2a02d95fd755bdb112fc07fd4817bdeeafc95520501809c092996"): true, - common.HexToHash("0x1382338adeee56a7be98479c3b5d8d81af8b23f2462f564c56c5dbc9df4acaf0"): true, - common.HexToHash("0xab0f3cb375fe0a337aba6ae925a2e4dd8d1ba71451979cda9fb97ffeba92fe44"): true, - common.HexToHash("0xed00bcf13c78912c1c32ba18b22aff526f24af8da0aad44e9a44ce4d28b6f53d"): true, - common.HexToHash("0xfe6e606765b6d22f54c7200fa458a7d20943e3b6b7c426a5bc210463a2ecf5cb"): true, - common.HexToHash("0xb6c99afb3cc25756877e27ee4b4b79d1d798a36ec25b5e642151050e26581611"): true, - common.HexToHash("0xe559776a2ef71acc2e9fe2c0ea12273f3a89527e702d5f57351df61c5de194b1"): true, - common.HexToHash("0xe48d80e2c28733b35b65cf16054dfbbb78c34174f02742f1447bea823dc6f31c"): true, - common.HexToHash("0xdc73bac538c8a2b2bc4f06768abb683ea19c74df1a39e8dd750d53d490c5b440"): true, - common.HexToHash("0xf81eaee541a19dd5aba88d9a0d8d76a8f0e9ee0afe09a350f28bc53c2f7163b3"): true, - common.HexToHash("0x6c902ad6e0603e67ba83f459011852ec5e45bb37d048729a43ce72c2e70f1d49"): true, - common.HexToHash("0xfb95885bcffc3798abcdbb235d34b157058f50c792a4ae6dfbfc396ca2458320"): true, - common.HexToHash("0x3645eedb686fa13d73dbdd3e953dc4126e8d4ee151d7f8ca30c5c89a3f9a9187"): true, - common.HexToHash("0x5a3e6e62c21dfa39e6ee7b472390bad505d6bce46833e4ad698e41cadcc83c74"): true, - common.HexToHash("0x3c55ed19c731833199db3b5eeda55429fb632af8713bd74230d5a6b0ee4f3596"): true, - common.HexToHash("0x9d24c8ec367481ed11009d1d58131229203d33941699595a551e681e0d1bc2eb"): true, - common.HexToHash("0xcd4a79a151c3daa9f4ae5fd68824bd6f8dad130b6f23bc1afe71e92d133de9f7"): true, - common.HexToHash("0x34287870b16da1bc8b27bd451499b7a682c8ea359ea93dc666007e3baae7c2d2"): true, - common.HexToHash("0x0c27800f5b86b04061b6e7946b2540d90df2f97b03af7ab631341b73c5d286b0"): true, - common.HexToHash("0x7ce2c550735a8919749d22973da38ef776b490bc4783ea7ecc3230632ff72f64"): true, - common.HexToHash("0x86f7088c58074c0bb9aab9637c01f67c231b34df474a461eb66039bfe86872e3"): true, - common.HexToHash("0x5cb664433f2d843414a1c4d8fda976a8fcffc534ab40ce7f9bbff1810944391d"): true, - common.HexToHash("0xefc7dbf44ce9799c88f49b1c8b3c35796a15c995db0e8b6ca05dda0975d446a1"): true, - common.HexToHash("0xa6abc43c4e785a5a4e8a5dbb49a8365303b218ad5be3b72ec0075c1d20d33960"): true, - common.HexToHash("0x8a1667b939ae713a72ef0c730b3781c8b22480e0334cd8563cff23e05c55274f"): true, - common.HexToHash("0xef6da354a8ff6a524344be928bb31d58d464b8755d4815ff457f1c3465bd7c8b"): true, - common.HexToHash("0x8c21128965aac98d3db5a84cafbccf2c1f714063e4f69e91bca5ffcc09f33250"): true, - common.HexToHash("0x96a189b7ef67112f05b9e513f088f09985ef149c86b81848ebfa665f59813854"): true, - common.HexToHash("0x20713b348f5bbf5c770424ae6717c9a774b3441954c22e3ec45b05ad57feb412"): true, - common.HexToHash("0x689a6172c3571800742a4953406fac4c5fe62dfb6ac656b3ab739f55cc18508d"): true, - common.HexToHash("0x59bb349dfc131f44559ed41a0b0f876395efb2d9755e4c85f6bc6d6d1cda2751"): true, - common.HexToHash("0xc04aa9cc33f86c8fa035014b61eeb4f33e7b67098dafed06aebad08aa917dde0"): true, - common.HexToHash("0xe609ce08944fe5c238e438a488f2dfb3a63915e9cd4af84825119f95c71915f8"): true, - common.HexToHash("0x916fe55035005fa2d1629ff26bd4ecbec16257585ff5c4dc1510716bfcc03200"): true, - common.HexToHash("0x4bc1e0b4dfae80dbe797616b3ab3404c1e7906c7bf5fbe821c7f6302b5736e39"): true, - common.HexToHash("0x01a4dcc5bf28f5c666a126393ae150d1b67f76965d1e42402f8b387699d01745"): true, - common.HexToHash("0x340a6312989da5e3ec2c9057c285efd762b6ff76dcbbda237f57f023244af03a"): true, - common.HexToHash("0xdc09935d5208383f5b3ba311fec31670cf21d582e8c69866156f64189492a10f"): true, - common.HexToHash("0xad4294d6e5aae992a8cf543bb0b600190bd4d30d50cb2b7618c53be82a997bed"): true, - common.HexToHash("0x2bb21893becacd4d1f9fa092d450946dbb6d0c37ea58331c79596378fbcf1585"): true, - common.HexToHash("0xf469ec963d8adfe41b7443dade93ca937e8f84e08074bff71d7dfcfcf7e69660"): true, - common.HexToHash("0x81b3485998f72c8239244006a654648d6b67e7b083c3e4d55599eea015e94c1e"): true, - common.HexToHash("0x178b3f87bb5bf19e59ca445c2a456b440cc51adb5cbae3724fc91c34da9c8412"): true, - common.HexToHash("0x6c45eca2443a660ff6855446703e6cae45308cc6696d5c0ee519a8865e1a60d5"): true, - common.HexToHash("0x3a3034cca0aef062199ac7ab4e429a43b73b45e5c02d9cc5dc9241279a10958a"): true, - common.HexToHash("0xeff293812a6e60700016f31222780b9ae08f6ef16c339c3d8c302e19cba7eb61"): true, - common.HexToHash("0x37edd720ef5fce879116e83ee4ca84118381bd6d5a15102ea6aab251b4090b98"): true, - common.HexToHash("0x4e19aec2a14264dd95e06cca7d584226141758b271c8518c66e953b59b2aa289"): true, - common.HexToHash("0x976c8dd4a22b862104e07ce91520a1a00c8beed368997f7920bf698ede1a0ec1"): true, - common.HexToHash("0xd114bc37c66fe6b52edb1e81171d9a709f23489051d287fcf808c8ca87a7d670"): true, - common.HexToHash("0x1898dde719bc349a22e6d0f2aa5d7872bc0156b1e221280ca00c96efbc6ce1c0"): true, - common.HexToHash("0xb60127d6e17bb3ee87fae88f88c213204281de4e00e88fc5d54d5e83d7756f99"): true, - common.HexToHash("0x34e7f9dcf9d97ba73f9b4d384e7bb3bcacf6255c7b7c1185e1ece0e109f29ed0"): true, - common.HexToHash("0xba4c4dd76af3a1db6d691eeb345c8eaf5a005e9263fda52a87fe16c6df0056cd"): true, - common.HexToHash("0x3d2a8dc3f0627b3f8eadc476cb483a0111042443bb18aff9278cc3b9f641f933"): true, - common.HexToHash("0xe4eda5bdc852ec734b0eda8b851438beb51af85d70be776db616caaf5c5a661d"): true, - common.HexToHash("0xe1c6b9286328e7ad464e07a87579f6638e3722184e8ca9d79632b59e629ed33b"): true, - common.HexToHash("0xfacef02fb6a1d10c6ca6bb65e32d16f527efaa010f61d29cd1b4bfc26d59ebc1"): true, - common.HexToHash("0xe52f3b0212c03354833df77ee962c37d19b17eb96414cec3c131bec84a8fcfb2"): true, - common.HexToHash("0x6648952c89bdd4914f08006afaf78f155da87a19b0d01794b68c08749cbcc950"): true, - common.HexToHash("0x69976887e5c9046e2b49955c5a9722397df33b8934ea76ab055122342460263e"): true, - common.HexToHash("0x63926c19300dd4049d2262f56ba4b73d7835caeeb4e20b19c4abbb439d3d4945"): true, - common.HexToHash("0xf45682b60a04942f31ca493159ba5e0f69717d3b4ef3538d3a8688fbfbbc044a"): true, - common.HexToHash("0x60a0677eae19c24d5c621836c3ff85f18f342dde1ba4e790d2e4648c1706183f"): true, - common.HexToHash("0xda21119599611d86f13552371c6914faa992c4c26e9c05a2593a59d6d4db3d93"): true, - common.HexToHash("0x78cc2893cb2b7951e38fe3fe24b9a76394bec58c9b74442962111d16bcbfa4c8"): true, - common.HexToHash("0xbc00bb87dc5258312513be35202050cdfcd33b911b40b4596679b216f6452bcb"): true, - common.HexToHash("0x56dfc929488171d58f7d57fa85e972e5e0e89dcb824d090fe12634529bbe963d"): true, - common.HexToHash("0xdb0a522d7f2a4a727a5a141303cd2c5ec25a3fc1287da2e8800e16f887404dc3"): true, - common.HexToHash("0xe1108838a6c8c50bfa3c227e2b11a24d40b32b2374beb01394b2cd8e27292500"): true, - common.HexToHash("0xa18380207dcf4123f4bd17d073a3cf154fc492d78d9f7ce3a46f41f02c436e06"): true, - common.HexToHash("0x0a103daa199c3b0f29647e015c8cb6f74d51319454f0243d94c1f1eb67755e56"): true, - common.HexToHash("0xf0434397323833fc0122a33e2e0902977ba7099ab271aca412614f25da850ebc"): true, - common.HexToHash("0x0c1e78273d175bac325badefff94c6b1f4f42c575490657ac1bb2ae13e609561"): true, - common.HexToHash("0x62e21296cc98c5645fe54b4341b7de183a63bd127115099ab0cc0a2486e2cb05"): true, - common.HexToHash("0xaf4f190f525f1d7098cfa3c77b12794f75d4493eae4a53dc446c235be6801cb8"): true, - common.HexToHash("0x416713c23712a833bea96a1e318a1d6290d067139ef27f89b661a3916aeafe7b"): true, - common.HexToHash("0xc0f88f31ad105448b8e81796ca5391d351f4819f7b08eee6e7557f08ec68d51c"): true, - common.HexToHash("0xc0f95b5787894814b9fce0eec952ae92eb12ea1aecc1652b8cbaa65358a19820"): true, - common.HexToHash("0x5a01eef4acf087cd9e950ddaffe42e4c402dce2f33207646a11e4e49233d7d27"): true, - common.HexToHash("0x75c8874af3d218ce162ff7dedbfc5444e5f8f19e4b1dd8096f19c28817294d12"): true, - common.HexToHash("0xfaf4a06b1e9c36b9e1fb87f3e03d09a28a32da74666b165c672081f6ca106407"): true, - common.HexToHash("0x7a0fcbaa2b11df7d0cbe042e5c63dce6fa081315e110cdfe465879075bc762fa"): true, - common.HexToHash("0x78f99e389d3214cfce262355ae43c0a969af62c91632cc80b516293e81ff68dc"): true, - common.HexToHash("0x2417b10fe5bccbecd7c9e238fe3d26c558058adbb74c0c465e754173cccbcc10"): true, - common.HexToHash("0xccc40181e9e47bf6ba11da910f32903646ab28f89e060e89b6c2eefb891a23e8"): true, - common.HexToHash("0xc8d6756442cac1d5d9627904e495ffc7f60e67cbe0a081d2625077d35f8b6e10"): true, - common.HexToHash("0xd13fa533df8015562f5b426cd8b2712bb262cde0318c1b10f38f1d2478db5963"): true, - common.HexToHash("0x9a5be9e16cba849df5922e6ba385ed15fdf6870e628eb281786a6a46193dc5a2"): true, - common.HexToHash("0xa526322cfb263847cd76569cdc4eac7927f6224fa0bccee485e3fad12507f898"): true, - common.HexToHash("0x92d946f6bbaf0e144d4080221e9165e04ac11247a679de2c0299f132538b6d9a"): true, - common.HexToHash("0x3245321ef3544b68e8a633038561b03bedd5afb0fa1667f7815875bbad3d5a2e"): true, - common.HexToHash("0xdb7e83010d41b7d2bbba2592d9af355a2ca1d04b7173249c27e0f52b6f924bca"): true, - common.HexToHash("0x53b790b16bf652d8118c1b2a0b22ba462151729502a12093c821655d67bc28bb"): true, - common.HexToHash("0x29833dfde11a5361b4a07795842a5a92262302c3d30b3f336ac92d755e3b9e7c"): true, - common.HexToHash("0x231780d450f5237b5af96e6ac430c32895b7207a6df7ad8ca49a9fd2e88fa5e0"): true, - common.HexToHash("0x53c1259e791082c2a1af57489adeaeb9b16c0ae1b642d14aae5a6bf68cbaf56b"): true, - common.HexToHash("0xac783400241b0f815bd01769b973504c6ba34bc123ada2ed9e84ebb1f8a0014d"): true, - common.HexToHash("0x08d7f54430e734a7033f3e96d4e2ba93420275f3f0cc0bf953b8a8e9c07eaaa8"): true, - common.HexToHash("0xb43506668e7fd5282ed1a4436ff606504efa7d52939bfca6ff8188fe61fc88d9"): true, - common.HexToHash("0xa691e9c3f9a9d9a55b2052c37b35c4209d9b3a48b6150e59a67763c5fdeeabf7"): true, - common.HexToHash("0xf3cdf9e6ed32d3302098d6049fa5d2648ad30dc734b237ed977c17afbda281ef"): true, - common.HexToHash("0xa837757cebf358fbbaee000a7bf90debe2db9e567d14bd5b208a35ec81b514be"): true, - common.HexToHash("0x34cd6d92af76eac28a11c785e01dc6e587838c2780e8b54aa6920f9654d6aa09"): true, - common.HexToHash("0x47ea684aad1e98d6f82efd2897cdbc0870652acd57ab8b6d6a53443d73aa511a"): true, - common.HexToHash("0xb4361099182a57633294c67879dc14140fc12291027de721f17ee49f1ac41061"): true, - common.HexToHash("0x140467e092d85e0c77e9079dc80f2590f7969ad7fb59faa88dad32a26d659b02"): true, - common.HexToHash("0x5a944b5164d0b5f5b25a410a83674c0ad0ebf6ea3051eec43afa5594a4967711"): true, - common.HexToHash("0x7c7497651d1e6ee2aa350dbd090a377a726ff9632e98cadf1f9ca0e284a647a5"): true, - common.HexToHash("0xb345f3716dc2edc14dadaba74604694da44d0c42cb2a701191147185a9a982f4"): true, - common.HexToHash("0x2a93234b8c0bfad049b95d52dc121a1b32e659056c1d2b2f2f53c30533312661"): true, - common.HexToHash("0x8345f4ff8b9a77182b2ec8b440ee38175670ee51fdbadae40fba0d091afe33f9"): true, - common.HexToHash("0xb6f9c42c87228ef31880c3968aa3b4b899db3eaa76f16777f7d6e6eca9cf2fdf"): true, - common.HexToHash("0xf35619a1f0172f7c6e9f7e055becd2e63647ae9521d4fb751bfd8528d86b0641"): true, - common.HexToHash("0xaa2f890657229f590888f5a1b9a866e02ebb194ae6155c4a907e6ac1a1c4f93a"): true, - common.HexToHash("0x75445fe130488cbc929efbdc8b52c5301adf493e57af716331eb216a97f17742"): true, - common.HexToHash("0xe71088a96a1eb665481d95a0a5a697432dba07358022641324d8da623cd30547"): true, - common.HexToHash("0x15741357107ebca7e3ee157d53addbd2d08765eff3b1c2fc7dccd324bf8e1b1a"): true, - common.HexToHash("0xab08c68f6b490bb328940a797aa6fa3aabdcee6889b5e17942f0481202249858"): true, - common.HexToHash("0x5f37901f00bfa25fde4d1ab02df6f816f642bfa4ef258aea80643c2694de6108"): true, - common.HexToHash("0x566cea3c9255586c57c937da90438f970aebc9a17652ed710e7b3bc3835f1d67"): true, - common.HexToHash("0x5f6029e97fb95fe48f866948b719048c15bd6992cb6f0a8a2a3f0026312b3e2c"): true, - common.HexToHash("0x27ea8853242707ee1f815ec90b3990c0a87ca0fdc041b994deaeec702ab6503b"): true, - common.HexToHash("0x4bc212280c7bc1e18c1cf4bb6a26b36f3541a91f8977217fc4be72d96ce836e2"): true, - common.HexToHash("0x000f83a3c9e2e679274b6b91f2bcec62c5dc208d8cec7260bc75d790e8b64905"): true, - common.HexToHash("0xadfb984e8494638c4abb541be4938640b42c95e6090ed328f18111e0d09c69ba"): true, - common.HexToHash("0xa1805053f25a451e930ded984091e6eca9231483c50654655efa45774159d1a2"): true, - common.HexToHash("0x30e23857f2e73f13f82de901266fe81bb5ee9738cb19828ffd41e6fa38f87d95"): true, - common.HexToHash("0x9c97b45d1fc62a00defa99c877e2bc2ebd10b4e57bff27f1331082d6b98de664"): true, - common.HexToHash("0xeb0b1687cb19388e0d3e79fd26c575b64734c519e166cf5c6811ee1599d79146"): true, - common.HexToHash("0xdfb8bd06a1950f132a992737c57c3e3c9b8419a084a275110962923253d404cb"): true, - common.HexToHash("0x04cdc3d66a76dc334acdcc128cee163ce003d4d5336b7f74b63f24d70fe8adfe"): true, - common.HexToHash("0xd57404dca873209bbf38097b0178f3d69f2b2c18268533cce88d472ed2a3beb0"): true, - common.HexToHash("0x2438ffab8c5b527af3bd8cca0da6e0bcb3b3add30680d03b35b98c9b61b062de"): true, - common.HexToHash("0xf3cd1678c116955ccc0ec4667193bf56fec226938a7bbe71d9a52ba779b5e62c"): true, - common.HexToHash("0xa98af8b4df1423c790659a0500ab548c7d494de5cc8116b8e6ee0a45fb8bcf0f"): true, - common.HexToHash("0x434e89f8e77cc59e6f192630c1f0a2aa8f201de46cc60d1ae2bbd1f0fab639d6"): true, - common.HexToHash("0xa1bfeb4326737d7fca5e2f218a9c4facf957479652fcb0bb22d7983acaf666c8"): true, - common.HexToHash("0x13a2ea93c901dbe598bcbeb33db42eedbdce65b9f5313555fe271416aa7e501e"): true, - common.HexToHash("0x2932405aa0fd2fe0a657de2fbe889f836c7996507d43192d34757adcdb7d0920"): true, - common.HexToHash("0x25f8a5f9bcaddc09c10025cba719243c3ddfc732577c1e682695c77c865b9bf1"): true, - common.HexToHash("0xbbec8222e0f8b17c5569bd192329b987f21c04ce0b2d755ecedc8dba5158c620"): true, - common.HexToHash("0x6d822cf3af3e7f918fc5713285cd114db0106164444a8f920436a8779dd88750"): true, - common.HexToHash("0xc030cb32ea01fe3eb6e8f516854e356035789cdcf804b9e18192728f76a81210"): true, - common.HexToHash("0x5cfeb78e073a7b3a8b01daeb86e7fea264a28891738cc4ed3c33c8058e2e60a4"): true, - common.HexToHash("0x91f9d7d24708c98d6406bb7abe2e47495df6d56db366561c302b730a3507be7e"): true, - common.HexToHash("0x0db7eed85f9595e59dd6cf0752a1563e7297d745b19f1d8265cb0cf4f416e4f0"): true, - common.HexToHash("0x93d1cb3db82d9ff974848b016305de5101270204c98bf4b976c4f0acabd18502"): true, - common.HexToHash("0x01c13fce47792024149585f8007585eb91a0a94f44c730177309fc73a698e427"): true, - common.HexToHash("0x4a3cefb63bceb91af291f84e94e92f28e2e61a7c55269a7774361ff9fcf837bf"): true, - common.HexToHash("0xe71ab3e8dbd02079dccb8e5adc65e5336974b487691c4a6e58fd03ce554ee0f1"): true, - common.HexToHash("0x296a66c27b950da0f8024fb910be6d20ce5d8fd1ad9e3f3af870708e05783522"): true, - common.HexToHash("0x9916b8664fe5d3b38f80a49434ec8c65fedc4eb42c33b6a230fc8e298e651c65"): true, - common.HexToHash("0x7a340ab714da798f66d66cd53d4e85627cbcf3065f4d014d1e224d969e3c2f63"): true, - common.HexToHash("0x613f1832348e09e4155dc5ee3e84e77643877e02275915883f14ba129bbb2b91"): true, - common.HexToHash("0x721477870e4e6ad9eadc0ef90928bad480370eb756caf83e151f504b29f772ee"): true, - common.HexToHash("0xc7a9a037f89779f705921960de15db30553782651fff558b6a2872a8ecc5f6a1"): true, - common.HexToHash("0xd7345c1818be156126e8570e5634b1019c66b9a86f4264ff2050d3cb1f664b53"): true, - common.HexToHash("0x6d224087457c7887379d43e680bd7befd7ccab57c44085de010a58286d9e8cc9"): true, - common.HexToHash("0x3d777e085411ebea84c716277ad3f1fdcb0afb63f84ca7023a5845ada4598336"): true, - common.HexToHash("0x10161a9e7f966fb966dc001f3680c2786c4b281fc3596485081436b4830db7ad"): true, - common.HexToHash("0x584d9a672ec4a0709979ff6dd932179b458943dc81a4419251c5fd4a2bdcf051"): true, - common.HexToHash("0x52beb58338ce5131645f713c30c157f29196e91b039d373fbcce9dbd54120395"): true, - common.HexToHash("0x1e8909f2a2f5d9b6dc3bd9e97a836b7d705353cf49732d4998a472a1fa65fd8b"): true, - common.HexToHash("0x3e7a9fe50978b89a8dfdd075e83bfecee82d95cb8df625a9880441a12616a9ef"): true, - common.HexToHash("0xbc8ab6fcb1657a96ece83722fad4e5bf20ebc2648d3938a7492d94c4f47eb257"): true, - common.HexToHash("0xa5a7a87153b1d7af3cb6ea6063d4c2d8d9c3992d02927bf2749e6db02a81e6fe"): true, - common.HexToHash("0x76017c75abcf0543a3e905a0cb7d6c2e6c91d108edbf9446115eea98a40b03e8"): true, - common.HexToHash("0x5978b634c8d7d4f232689d55547b2a0aa7a91f2de61082ad6d0fa1755a84a330"): true, - common.HexToHash("0xf1683f936bed7fa16cb54aa54d1daa34fced9092a06c9bddc596b7ca51b979f8"): true, - common.HexToHash("0x89b23575b6689abee67033ab59a50a2796b9bfe2d07061e0a9f7e25b319c2655"): true, - common.HexToHash("0x791d096c3523307629b2495cfffed0798bd0c395747f311c0141c0534751e443"): true, - common.HexToHash("0x0f174f906ec9834bef32a9816a4ee4e44f5b7a92c30b9e33a4564770a9dede45"): true, - common.HexToHash("0xe5c54b870ef05ebba7079e62e6a287c6a073dc813b2ceb452b6b6eb31e9262bc"): true, - common.HexToHash("0x6873e5fc934149a813778c0fdcb5767e27e696e2f309c080079329fafed555b3"): true, - common.HexToHash("0x8d8f32533ce85b1e9afe10e19ae23abd5dddcf7c17ae1f4ed0bccf0d678539d3"): true, - common.HexToHash("0xd27c4e5a62402100728ccaa09c1f9f8904687993d0b4763de0969c4b8881be72"): true, - common.HexToHash("0xf36db3edba06715b2bb7eee7991cf3589ff352150df46531429f37cf460e1686"): true, - common.HexToHash("0x21f15f5a572d196bbee6b159403089ff1a4bfbd3a3c57b0f81105d939460ee0c"): true, - common.HexToHash("0xdfaa5a038deac2a08fa38deb1fb9b9b5b3b8a162521efae0a5bd31243263b9ac"): true, - common.HexToHash("0x94a5f13a97e78fb7a713d019bfab4b9c69f21326ccd2aa45f46563f242b896a8"): true, - common.HexToHash("0x7df91b39332d9c241b3af4a995edfae6d90f0b077b9f07749b80250f2a499079"): true, - common.HexToHash("0xfe63a0002755ea4c699d704c09898f0a01fc3e357c808844a5b353363783dd66"): true, - common.HexToHash("0xb7be53e0cdeea33c196df9e4689700da9581eff0bfdece4c41fe1830893abeb0"): true, - common.HexToHash("0x2bd50c07a0be9cdb75402822cd3ed9308189ff402d0e1c032cacf1df829fe9f6"): true, - common.HexToHash("0xe8e6d410ac8840485ecdba1d41133cfb4af47542abc0b31906ca0c4ccbdb11f3"): true, - common.HexToHash("0x63318b0823c6e1290bdd18fe9773a4d8b28556f86a2db92101e1bb87374a70de"): true, - common.HexToHash("0xba488f79efde94e0f6d0533d8a29b9c0addf99c0d394f2ba329fc517eed2a64b"): true, - common.HexToHash("0x2d575c93f3c548136441bbee805b4f1dddc4b5aa534465c83fa55528f71bae82"): true, - common.HexToHash("0x4ff20ffde6b1a91bb8ef3bac4e0a2fddb26c9d5ff9fa30bf6f022baff15fc27b"): true, - common.HexToHash("0xc5fdc7af8395b4c5831c46add9cccb88a4906f5c4816a9dcff09b7a81c432502"): true, - common.HexToHash("0xa46b66836ba7daaae8006fc06484b6d8eafe39a739f42886e37e7a54f3f40898"): true, - common.HexToHash("0x114259116f79cabcab932a722688ab33f64f0baf826aa09e1211effc71c4e297"): true, - common.HexToHash("0x5519cde20c47366ae62a5feb381f2467437f8c5f8e24f672dfdec5ff53448c4f"): true, - common.HexToHash("0xb0b0718da00b801413e4bc168cec45d42874e34cc89e3e10c23b6e8008c49628"): true, - common.HexToHash("0x52e14fd4fd75deb0fbabf4e74a9b9a423ab6d24ddadd495c9edb14f8f7406e9e"): true, - common.HexToHash("0xd11ad9d7bc1249f65a5acea6d299381f44a29ad302a096ca6db42a984f611490"): true, - common.HexToHash("0x4702ca0c8bd180ae75216e016d67022c540a52d291dd99e22fcae1be9a74ee10"): true, - common.HexToHash("0xb91ab30cdd49ddf1a62c83458fe20ae66e9e6f2f6adb0149866da966ae09bd4d"): true, - common.HexToHash("0x90e27c148ae3cf3538e4a4550050ae6a3c63e7ed0123d8096e2922bb78b60011"): true, - common.HexToHash("0x35c8b0a3cc00ccdccc5d4693d443432f14b3dfb1a732a6a0ba0c0f0b8c65929b"): true, - common.HexToHash("0x1674d263f8932215e0959bc2fd034d3d1c8002004e88356b1401416608e71577"): true, - common.HexToHash("0xaaf473f7f05f090239a344afae211fc7b0e62930b83aa8a61036f3dca488315e"): true, - common.HexToHash("0xd6c9b115a9f888632d551e566b435f5164ee87ed3cc969de3dc98fc6ddc3d6bf"): true, - common.HexToHash("0x5d1a31220159e8ef91711612037825ffe5489f544d46ec1e05fec11712a14525"): true, - common.HexToHash("0x56c0ad208047ecedf5edec7477acd9ae255014aeda4d7f08b263b90e5b5ee5eb"): true, - common.HexToHash("0x2514c7dd44ca649d8fe41831364fa5d591bb2946f8fbc7186de2ff07a24abc3b"): true, - common.HexToHash("0x34c8b0f6e9fcd3b63a980e4b4601a6f4a59a9f93111f8d19b500ccd1f0ce93ed"): true, - common.HexToHash("0xc3bb6183eecd02b4b6e369f9961b2fb7820bbb62bcd4b6ed4de71036d4b38257"): true, - common.HexToHash("0x837ddc48b0e78462fc527eae891c8b503f21c274ed89236ff13382f03aa241ee"): true, -} - -var L1RelayedMessages = map[common.Hash]bool{ - common.HexToHash("0xde6a3c949709d252d23d940fefc976373acb2de4ed2de64bf1f8430ec2cc222a"): true, - common.HexToHash("0xe6c4417da24449cbd3b65bb145834307a3293271843546e5e8d457b0ad13f025"): true, - common.HexToHash("0x9aef302327aade2fc4442c927d54f424453c072fd327cc0ba95968d42c94f7f6"): true, - common.HexToHash("0x1e48b76301e322f342476be21fe84ac3b339ad16a061299c8ad193dd06cf64d0"): true, - common.HexToHash("0x50fb4703ba2a7f8f788dd057f4508b98659f1cc17ffb397b73c03d783cae80f6"): true, - common.HexToHash("0x01d5f14626d5f1b986f5ce7efc99d402e476ef7227b47af55a44021a455022ce"): true, - common.HexToHash("0xc349c7ed9e1a0283e04315c44713fb6864d3f4db20ea21760e6ff1173623c785"): true, - common.HexToHash("0xfffb272f44276e9dca31d0a34cfdeecde1fd3daa497348e049fc43a6cdc6297b"): true, - common.HexToHash("0x526bb4dd97a7f64bdb34d6cdd1f7bcd5323d245f9fa7695f27864725f970bca8"): true, - common.HexToHash("0xcd0b7755757727fdd9a3bb00ed2f8d37d6cf4878e2b893c2da90a56d2837b038"): true, - common.HexToHash("0x122e4df2144762086814619c63d9b1ca3bbdc958148d11de8d1eb7b9bc158121"): true, - common.HexToHash("0xf00a9bd715b15cf854b593aa280b462cb12441bc587bc507dd9b5572f7eee819"): true, - common.HexToHash("0xfec902255769b1f37cd3650cc5bd79a2db47f9e57a87271294f14cc269d97979"): true, - common.HexToHash("0x7cbb6a4230c73511d7255ece623dce57fed2057f711ed4e669bcf10611854d96"): true, - common.HexToHash("0x8459345e61e3e17cd09984d6be6dc4d552d32fd4d2d0beeb5eee676053f99152"): true, - common.HexToHash("0xfea17bd65cd499f6a5415c57002bf5221ba0f8ecc1fb67c0adafacd5c639a0b7"): true, - common.HexToHash("0xcb3561a469edb8b95d938ee7e7bbe87992f014e97e83c7a9bfd2893a67bfe728"): true, - common.HexToHash("0x35d720218271c347ca9e63d104a72f5ea6ca1402cd2564bff06741e26f22678e"): true, - common.HexToHash("0x845c15bf1159a4ed95ace57bdf324c30a848fee83fcbeb8e685b0d905f4a0cd1"): true, - common.HexToHash("0xed459a6d21e45f3f01b4bf65dc8e459b9af8420e00acd65490e7ab508af83b58"): true, - common.HexToHash("0xcdf51eeea22373176380782891fc9ed707be6e63d6efa828a57d607934327c32"): true, - common.HexToHash("0x001f84fe533076e10e5df74ec76bb851e2e5e66ad96b06dc9d575a94c61dee7e"): true, - common.HexToHash("0x4b8b05278215519958f9eb2bd85fc97c8ec72781b0bc4fcd9867e55dd2414f5e"): true, - common.HexToHash("0x7123049b7c8ca2546ea900e20842d9b558b917004a2c29374c8b6214663357ab"): true, - common.HexToHash("0x96ad9876f213911f462c2de004e22bba1be6938b0ac43ba24e2a520efbd6ff9e"): true, - common.HexToHash("0x4b83a3528961906af57e6551976c155cc622724fafac13a61accee750d37a1ac"): true, - common.HexToHash("0x6b0dfcea0f4cf28f6df10aafc8a4db3b1e86c8ffe586ea878b6fe375d4a0b666"): true, - common.HexToHash("0xd16f181eee50f57cbe474de76cf8388a21b91e53d9ec8bf127f568b267804d18"): true, - common.HexToHash("0x10fced87b3973c4555a9f5de852e20e8a96d0bda66985ca8ead563b90b07e6d9"): true, - common.HexToHash("0x2b326792e5100b1f9083406b57eaafdc547100450a814a44a84882abab763e9c"): true, - common.HexToHash("0x9ee83e5b781c25e0baa7a1c1df9cf48acd876126740b57a99b5c6004369d4d07"): true, - common.HexToHash("0xde61b0a624303b1b2c1c804bbafee66072cf01e5c84c38b53c617be1d3a6c12b"): true, - common.HexToHash("0x36aaa8618e834e385e35417f0fcae97d8b25dfa95f6ed0d251f31b5e016f4aa7"): true, - common.HexToHash("0xa05d338a6115ccacaa95490a83231c3dc94186b188d8a119c4fb4ae27b928e34"): true, - common.HexToHash("0xb3a60115002be2b079d2fd99bb6f297811b2f88d4543ccd5d937ce408005f051"): true, - common.HexToHash("0xd8d4c2d5329fbbe0c9ff6f872431a6d7266ea189c7124614df3f8506ff6cdfbc"): true, - common.HexToHash("0xa5c8b136cbfda9f3bfdc7cc39c56d7ca61e8f9fff13d3828d67e9b32cf8473a9"): true, - common.HexToHash("0xb7c5e112a7a3667bcce43c2d14b3d74a52fb1166374359e868c0dfdf86e79a20"): true, - common.HexToHash("0x1e6048736e3ce4b95dd30087aaf39f54d6a4e5a6da9f27637de977a2c0cb20dd"): true, - common.HexToHash("0xe8d5b597cd766a7793bddeb98e41df262c1e0c318f1a974c355371974b2c37cd"): true, - common.HexToHash("0x9baea56db3c7d0d8634ccc44966db1362c1b06da11b2de3d12cd315d2141aeb8"): true, - common.HexToHash("0xa541fc47fd6a331347173245001c078658b94cb1bc440c0f6cfe5e2a34564683"): true, - common.HexToHash("0xfc7515dc0b5950ded466f786869b7902ed68212ec03359ecea22dd9a65eb7434"): true, - common.HexToHash("0xc55be4198a543b5b4e3912a25acbb34f180d52b34cac9881a38b4487ced8b332"): true, - common.HexToHash("0x914e8b5f88989a1c1017757d390143a5daf075f74388f60d9d511ed8a33e43b2"): true, - common.HexToHash("0xe418d2969aff06f45edea0c676a1d396413e33ff12cd215f0bede10d2749e1d3"): true, - common.HexToHash("0x9b9672091f9ab8e229031f9005095f62a27bad680f3db919f480903d3b884f33"): true, - common.HexToHash("0xa22b78a59da8c43050209c2a8118d43fb3394cd41688af20a03eb76a7ca00f4b"): true, - common.HexToHash("0xb0c1e114cb6b3185ed7da1b552313327436c9849a32140aa1482ba396eb24992"): true, - common.HexToHash("0xe1916294a2c3efa61aecdbbe580e4cc3ea7aafedae6dc13d2604304b7ae89fcd"): true, - common.HexToHash("0x86ddb1e5edc35769a301fa526341a126085a45b2777a57b0800c445c604ad15f"): true, - common.HexToHash("0xeed386aa4e8dc784c3e08e55b68f60f729515cf257b46fd00eba8aed3598da8c"): true, - common.HexToHash("0xa667dc1656bd4aad1de271a7b2c203a8e92f786c215fa6911adc007185e66a7c"): true, - common.HexToHash("0x81a26c96d4f5957d6a2618dc5fb578196f4424dc9171865d2bb6f90fdc4d2398"): true, - common.HexToHash("0x8c2af0c2094a4b2f69579161b932005c1c296aff4037a3d7a7fd4f3438739b09"): true, - common.HexToHash("0xddfa67731c8379ace27fd38f85209ba2bb727a351217e3c260c4ae2194f1e598"): true, - common.HexToHash("0x874bbca7608847563eb8ec8c6367ebf466a25392645009793697bd9314e5767b"): true, - common.HexToHash("0x686c65a8e352b0e0b62a46746ee037f12d6fccd457bb9691aaacb8745945981f"): true, - common.HexToHash("0x29d78f8a230f5b5c5762667256af5408556340ca5d86d0d710a64f5e6ae4a953"): true, - common.HexToHash("0x968b39c3115a0b54778180978d63d2189e6a2bb3a9ff3a065d3bcd7997e327bc"): true, - common.HexToHash("0x1fd7f9e95ace5db7b30b6153b7e9e4ef808f4ad5e70858ef4be4e79903b7feb2"): true, - common.HexToHash("0x497dff70f7eb3eb5d6b93e1b77eb5b02fb8478d0c109b65707551a451c811d14"): true, - common.HexToHash("0xaf2a0e4e20b2d520e91a10921e689f4b15eae8f6a8d74cb0d0c2b633b35d00e3"): true, - common.HexToHash("0x313d6b6b0f133344e43aca2ebedd71d9e6a7e7cd04b47b560d84b98a6fcde78f"): true, - common.HexToHash("0x2daa3175e45770eebcc685db392739bebc7452aef2fb2dce6db9a8e10434f3fd"): true, - common.HexToHash("0x2ecd1fb5a4dcc649b9e72b1ca216248b69538761b7635b5e612c5a2ea20ea7db"): true, - common.HexToHash("0xa0f22fe0d39df6b6a2ac87a362946be7588b4830a8854bd22933f14e1d814aeb"): true, - common.HexToHash("0x420098ad5e00eab75f9f14e858c2e9c65f0035c39e85746242681a295b53c503"): true, - common.HexToHash("0x2039fdf7f8929216a8ff4546e0103585b47d1aefad7f0bb271201d1b5b740b27"): true, - common.HexToHash("0xc93fe286eb06b292138f9bb1278634bd53a0d1b76142286b99fb8b3386d70957"): true, - common.HexToHash("0x8a9c22252bbbf413e84c60d0794c3bfb716715375899b81b5fe4b78081feb64e"): true, - common.HexToHash("0x1695385ad347c6fba93830e4aa0c4e17362a47784739e7acedcdba564ea17ef3"): true, - common.HexToHash("0x524f8c81e6be67cde77a89292cbac8fff4213e4999865e45828fc12f108495d0"): true, - common.HexToHash("0xd460ebe14560e59fa7ab4cee98dc88230a412287cba258c0533339bfc1206f97"): true, - common.HexToHash("0xc995efe9a2057f36ebc74063d41fae40720f28e7e98ad8656dab3599e3cb01ee"): true, - common.HexToHash("0x57b080fbdabbc8096e5732f59ac9ca17c89c4892459580ce92d45f1760939edd"): true, - common.HexToHash("0xe32c9d630dd7cc53d691e88843d6dcf704362f70c9dfdd2e2c2ef77860584ec1"): true, - common.HexToHash("0xbf9116f244d79d286d1b0e4ef9b2e8d098f6e9fe885fc1825d6134d58c738234"): true, - common.HexToHash("0x671afb2667a2ba43c71ef2582e404c8ceff682731231e59ed3f136b53c1b432d"): true, - common.HexToHash("0x2915ff008f20c9a7d4ac2be8a114da23c402812e0f1ff0f8ae0dcd6c71ee7ab6"): true, - common.HexToHash("0x1b48e081f4622f106e26bdfd0bc345b6d459e3da253c7738846ed2e0800ebd11"): true, - common.HexToHash("0x523b9a712f352171de6580bc9070cd56b0bfe3f0e904614b0805ca4e89e259ba"): true, - common.HexToHash("0x0cdb5b80d2ec130ebe42644b4d578d5b42e71ba3598f858aa21efd879f19f852"): true, - common.HexToHash("0xbe005e0fc46a0fc9bb7d1b6f6c6b94937699f873bfc9ce945fa4daa63d328b89"): true, - common.HexToHash("0x640b2a5e74fde3357b13f9e3bb078b71e2193967a9458b0a08af81e663687b56"): true, - common.HexToHash("0x97dcee77c5c7192dd8306ba0a0c9b1720b4ce30b018163ca7f4ccb751629cab5"): true, - common.HexToHash("0x6ede6eb5318ef834ce44047894f86a78dccc989533db3f175f2567cbdacfe6f3"): true, - common.HexToHash("0xa74579ed5a8fd3046c5b73b3f07fe31e30b1bbe354337cec42aaf8e1ee53dd0f"): true, - common.HexToHash("0xd9c230fa0a26c195cc814984bf3d0ebb9e510e7c9564f8b62aa1fd785ae6b43a"): true, - common.HexToHash("0xd03d36bcc141e45c9dd9bf1debd19ff932c4f5e521cf582eb5d72f8e33df1dd7"): true, - common.HexToHash("0xef3a0645f4dc3daef2ac53dad7006871909f8862c4c41f4ac990fa76e5a4ead8"): true, - common.HexToHash("0xb98a8a3d2a6928fc6a2111d3dec18f97e016d159b417b2dcee454cdf7f4e4628"): true, - common.HexToHash("0xe9ef195f7b9c120fbe95c61da007c6a95e9938cf30c5d6f8a5afc3867af830c1"): true, - common.HexToHash("0xe4a77711f4bd179b301f07c1b04700a8e0b9018600c36e379de2e233a44c169b"): true, - common.HexToHash("0xceed50a03fb5da4ecbf29215ca410244f042c324dbe1ce266682a26a56c3242a"): true, - common.HexToHash("0x07676fd50bd8a2476dcba8f81f02031cc241f5288648726ceed9e58b1ceffd39"): true, - common.HexToHash("0x395a224a9dc3b924845fb2d35c30a7e390eb5aabd01918bf25cfffbf533952f8"): true, - common.HexToHash("0x6d867e206d876c9bc396324bdf7debf74089472deffb8275663cd06afe3ae7d3"): true, - common.HexToHash("0x6da4a6a200ffc64b0665a3865e93caeb35aac47258e24e3ddc9c438f62d8201d"): true, - common.HexToHash("0x740f301f84be28dc359d7c767aa8e5a2d8883a684f3056b440fb1fd05ed074f8"): true, - common.HexToHash("0xfbfa95a70e1f2d00cbe86172b1e58b004d47838f23fba7b8c534c333b4130889"): true, - common.HexToHash("0xc0f5fea30f7f78386197bd820146782544312bbd6200f7728ad30efa430f43d0"): true, - common.HexToHash("0x924790d71561e2427dbe625e494ff1735fe1277f8154fb3ad530c5edb8bcd712"): true, - common.HexToHash("0x96de893a6a262cdcc65fce1b3d5e7c598eecde29f1aa60ccde03e3058f48880e"): true, - common.HexToHash("0x561626d79be9bb0f72be2b7e5dab488b23ec7c0b14f414c72bf59b250d3d1888"): true, - common.HexToHash("0xb4731594c5a1ee5aaedf7ec0e5f7402a45ea2b99d1c462fa202175720a00e97f"): true, - common.HexToHash("0xe86dd3de01e3968c2434c9f324c93b3129e2a188675f814b27a110455f426109"): true, - common.HexToHash("0x7fcc20cfcd9bfcb7d4600cf860423fa45d05450e9c0ece4efc70c929aa9884ab"): true, - common.HexToHash("0x5057226052d5c39b663c0e0ea1c4650aa8e66cce4357a760e661ac2a21f594a0"): true, - common.HexToHash("0xcf0e7b581e7bf62f6ab6d07d2bf39641df1ef835d74d739920b3346110211367"): true, - common.HexToHash("0xb25d26dedcb8c5c23c26ecf2ee4db6e3560313af0cd754665d5c3c831352caf6"): true, - common.HexToHash("0x28f106418285bf6809a606cf7d67b804b731e10140fa831916b4cd1f4cf58c10"): true, - common.HexToHash("0x359b64fddf2ef31a1a5cee9cfaff4b2510ef96631b4de91a225f9328d3633825"): true, - common.HexToHash("0xd42c191b80094c420dd74468f173ab1d90910ff881ab95f92a7abcb98aef5674"): true, - common.HexToHash("0xfb400d36f487849baa2588d5c45106ddc5cb51f92de4c607473afe11d3e18806"): true, - common.HexToHash("0x786b3c5ea538062fa3300efcb7730c092b38c216db6906f616c3974d1fa5a2ae"): true, - common.HexToHash("0x0ae1ca8258f2b393e09a13e12bc4bdb81c86dd65dce49f538d0c95e9588b9b81"): true, - common.HexToHash("0x666d52eba38936351c238955d6a3f69b6e960b05f9d227ae67859a1cd27f5e73"): true, - common.HexToHash("0x63c27b5f48dd69bb96dd18d39f7fecbf0a4ef7ad468c8155b377f4b669d565f9"): true, - common.HexToHash("0xc42862488730870826160250ce85b3ad5115e21fb186e5d7a65994ad7cd0e1c4"): true, - common.HexToHash("0x9b7e2782db71e2546eb12437c67345b7c0e3113fb216dbbd3b94925a20538fb2"): true, - common.HexToHash("0x0c0f8f97a318a2e12e723a17f650226a69e1c802e7c0bc809a4e1495d1496165"): true, - common.HexToHash("0xed1d5744a84cbe3dc168d013b8baa4014a5f2ecddbad3f9eccb01e62b7f67c09"): true, - common.HexToHash("0x9ba6c56bb343bb793c5c004e6fe879a858c4285f0335d3bf0ff7c17f6b1c1234"): true, - common.HexToHash("0x0d179bb0a0bd11afc5f373a3c755521f0cf3aea3c1799397be722d9ce7f1e2cf"): true, - common.HexToHash("0x2bdae770f82539cb5e190a46f3f4485be7349251e6ac97d655c21c8dcca9be7c"): true, - common.HexToHash("0xbc72d6d465ead85fefff2efcf981bfca3442e05d06762c647af9d9fc5732aaf5"): true, - common.HexToHash("0xaf1edf943c05f5558c1ddf0196b998b028824077e7332289d8508196958cd591"): true, - common.HexToHash("0x4c17761eb32c76595c2c9f213fda12428208e0cc4004de65f42e519e634a7c63"): true, - common.HexToHash("0xc76db4b60924bae2b5fce7b3df25df65089862cab41766e7243a810267c82c9d"): true, - common.HexToHash("0xd9fd389f04b68d6f2382854ab7204ddc918ba63fb4d451166c81065faef47df0"): true, - common.HexToHash("0x4095914d2aaf365f103a807aaeaa34947fa7b6cd645cd8819b5cd00e77166005"): true, - common.HexToHash("0x24a47de0a2557784236f76abb9fecacc932be8e065f9333b75922380dae3bda1"): true, - common.HexToHash("0xa66ae0264d6b6e26003cdfba1b45000004c8c6c907bcc29b8c37d33eaa3dc414"): true, - common.HexToHash("0x23bba356d17e608ed45b156ce413bf7af3a5bc35db3ea8fcef82b3afd90a256c"): true, - common.HexToHash("0xdeaff6fa06bf91ce956631470d903b42e6ed61ac36dfcd11810216fe4617a63d"): true, - common.HexToHash("0xa3298e9b280749daf92560f5e7a4505bec50dceff676de36adbff33b0d78f8b6"): true, - common.HexToHash("0x40ecdd36a847d6800f6377954ffa4638c0d105da5b1aea735682e29c97839ea8"): true, - common.HexToHash("0xcdbd7738c6108472f6c8aad7ebe81636d73471bb58646835ff006342803faeee"): true, - common.HexToHash("0xa9ca415b7b9e50b1c294872a2332e24ce8062611475244e7780f0dcff5a2afc6"): true, - common.HexToHash("0x6291733abfedfbd2833fc729d416a991e990e725f3ba9438f7ed3ce9ada6b3ac"): true, - common.HexToHash("0x5a2f448152460d02ad0fbbcfbe3e729619e81d14b0e7e0458184e6168b6ff318"): true, - common.HexToHash("0x2070db4e1785ae9365a2ff0beccb5b8c78e4ec407e759562585518499da6627e"): true, - common.HexToHash("0x8b30c95deceaa8b74d4b590c26deaf58d895c62ae706e6877bbcbb8b958f72bf"): true, - common.HexToHash("0x65a93546001b08c5c892b9c32830abf7485c6c079656810b273eee2cc5ac17fa"): true, - common.HexToHash("0x1a2b9309ff5215267b384857033d9031cc693179de256235512fe94baa671a61"): true, - common.HexToHash("0x5aea27ccf417f897751e827917551cdce70a375cd77b37e5fb603ccf2b84e049"): true, - common.HexToHash("0xbcd684ac888655a9f5dadfd10b76ff968c7488414ac9e5055b6f92bf8806cd35"): true, - common.HexToHash("0x2b2876fa3f297861edf23342af7c1adc772e7eba2695225e79bbf928b848b6a8"): true, - common.HexToHash("0xee55e19a2760a9ff19910b90f2b25e694b8465144ffbeddd101cff98611addb3"): true, - common.HexToHash("0x4852fab21475e01a623f347224004c3eeb30e2a65bf16df30a9f48f86afd4ee2"): true, - common.HexToHash("0x8ff4206f776cb8068d1f0c32db43e820e4d8ffcda0bc9e2bafe2420f88caa5de"): true, - common.HexToHash("0xbde62da29bf1651d5c15192ed3d213e2ff061d390852c2976fc213b4c8452276"): true, - common.HexToHash("0xdd33665372f58f74499a88a3bb81b673f79a45b40e82ea1c7602263cc86d9e40"): true, - common.HexToHash("0xaf1da6436b550baa9f2e439b6835173806f304c61140e1ec41ab4c9d6bf5552e"): true, - common.HexToHash("0x06d1674a2b6767cc8fd4654cfdaf6e4844a0df6f1453fd379d71b74c5f85d197"): true, - common.HexToHash("0x6f313c71b7254c31a75c18147dfbf322eff47aabbb557410f4397312b877db16"): true, - common.HexToHash("0x619e6bc966bf5285b169b25e6c7b884b4d2837b1dd90ede7f0752204a03eaf73"): true, - common.HexToHash("0xd3cdaea61df1283028b8fd5109030497c9bd40a4b99a637c44af1aa5d8baa94b"): true, - common.HexToHash("0xbcde687ecc01c6afe1ccbfe20d9a976fdaf1e2c6ea1c9384a3f3915abd266811"): true, - common.HexToHash("0x01309a0a29fdea7fb3307bd621a6e7a64e2d9570881fe9ee7b2a275298f56fc2"): true, - common.HexToHash("0xa4eee232f8102f07f743a85bfedbaeda80e56fbe512b9deaa3b137387a0c7438"): true, - common.HexToHash("0x58a760928460b8a744c8d1830b900d5e5f82ee8aee079005c064c6f4d2652e60"): true, - common.HexToHash("0x83ecd72088f11fd7572958e1d84935075f89c720ebccbbdea6c321cd4feaf6cf"): true, - common.HexToHash("0x1ae98d358ffff19dc8a901b3583c237470a6025aabe74d4e5b25f798e44c2f38"): true, - common.HexToHash("0xd1266bfd364a20c553dc0a1f2340246cc214a1a87cd45651ab1962512a89dfc3"): true, - common.HexToHash("0x263682cf1115cd062b8b8422d1fd79d1b24f28d9c843778e6896c2f82a388f9c"): true, - common.HexToHash("0x076600b0ac3e737e0c3f565be0522af42a40291a47fe5612592ede3c9b56bf17"): true, - common.HexToHash("0x4ec13b8bcc64f89413b4bbc3e0ba66e187bc218b7682ca3109f8f37cbf368b2d"): true, - common.HexToHash("0xf23b73197e0d9065ed5c551a7aa2ec1dc7be73cf0839642c0e1380afac9f7d7a"): true, - common.HexToHash("0x32e0e37fd58dc228b08a0fad6e3e1714b4bbea995928ea00a002956c501b6ebc"): true, - common.HexToHash("0x7d43f5b6fac58627ee0413e8110bee39bc42177cbd00130c4172d9d14f79a6a5"): true, - common.HexToHash("0x52207bc555b41186c868d993e94f17697a961d5915a43938ffd34162f23b17e4"): true, - common.HexToHash("0x5e0bc199799d4192d7fcef52538d0bad31b4514387a57877f40b6521d06826d1"): true, - common.HexToHash("0xd9f8a0640f83b84ec6ead5bda1bdf0cf4b32c200145e1cb380525e4e28f7f17c"): true, - common.HexToHash("0x78467ef812e267e961a50bac86276ccf990bb5ba58c20f5a8d83b5039961891a"): true, - common.HexToHash("0xccf17c198fe920897de03f992be8253ac9aa9b13aec7c669c4c3f0cb9348dfb5"): true, - common.HexToHash("0x1107ed7cc62234b6c8b17354001f2cc7e358e945e38fcb2c1127280a7e286fb4"): true, - common.HexToHash("0xeca1354cb40cedd003d4857073c5e8f590787c7a390ba05abd1ecd9bfc75520d"): true, - common.HexToHash("0x813545cc928ccd2c212cc5773624317a69aa495dde06ee99a35df2edda1e60e1"): true, - common.HexToHash("0x6a944004b6a5da74bd2582dac3a7d9eeef995debf09e23afc17c2126874aa7b7"): true, - common.HexToHash("0x373e721d2ed21e58d730f86270eb222c83d5f8eee713835293a0ab84ad016781"): true, - common.HexToHash("0xa0f3a9b6c89066223cfc3240d081c8d61ca2ec94c5c1b9ecf5a222a0e2defe6c"): true, - common.HexToHash("0xf4c43fa306f38041a99511a5e8e39767f42d0366031a407a5c03e69bd66af030"): true, - common.HexToHash("0x484feb1b2505b2c0fb9bfe72f0c446258bc26ac1f17adfad0cd7edd9524a3da4"): true, - common.HexToHash("0x7392bb704172b2cb3f75db214186ffcda4c674f5cc632701ae272812e19be05a"): true, - common.HexToHash("0xe0d6d3c76b5a0574c2f120c5d420831a7840c97cd6719dc708dcc0cfb4fd3338"): true, - common.HexToHash("0x78e746f8734d9bef0817a8f519ffd1307bcca0916eb89f99321e2ba09c1a5036"): true, - common.HexToHash("0x06783226eb4208a069134aa9a7d7f850d9689653f74263c925d77317dc15968f"): true, - common.HexToHash("0xd9769f073b07ecd4fdef2694e28a8731221e278a3bef1298af3951e9e3ad1e8e"): true, - common.HexToHash("0xd23c0720563c6fb9b847f97ba1ecad4a9a7ac53f714c5d3787c9449f905f4951"): true, - common.HexToHash("0x9b2fcbe63eb319304e3ff10bacacf41266810a977edceee2b81359dac407dcbc"): true, - common.HexToHash("0x9e4dcde9d47479e401ee50f326ced649278bb5209a507b2f4076c977f9a32440"): true, - common.HexToHash("0x67b13b5ae715b8e720f52dccd75995a3fad7bea21ff9e47c91a0829adcf4915a"): true, - common.HexToHash("0x079983f148701a0135cdf74171cddc322fd528fa88d3f09c0b591c719ab0c7ec"): true, - common.HexToHash("0xce5a53b9d6b23ae2e57525a2e8e737d3f5e949b1c1e471a03129288a70d51a88"): true, - common.HexToHash("0x4cb29498c722c6fead6e290dfdade1c6d7d6b2c1e7a6bace03957be07b9bd208"): true, - common.HexToHash("0x825634deaab3ea71350722cb9eff0ad53a167b60bd6f0c2f89be7f32f1167753"): true, - common.HexToHash("0xce73d2e07d635eb52c2fd34a19f4d671ced8d753a3b6f0272c2984e68a3b32e1"): true, - common.HexToHash("0x66867baa80799662ba4c7659a0f52f0ed77278060239b588a3a2baeaece0635c"): true, - common.HexToHash("0xa3dc1e2a05605a4e70dae014217e0d7e2964d9bc1a0b7e8233b510c3ab07e260"): true, - common.HexToHash("0x7720f39527a6b69895938fde2a726194a7f6499e7e4bf1d6a3df244557c09243"): true, - common.HexToHash("0x1d5bc016bfd305b7e167395b0b1b50c78e7ae9e22bf7966d680a75344a01687f"): true, - common.HexToHash("0xb260e505d1fc72c621a1e3d5c26b1f765260c97c02e46bb78a8799dc895e6346"): true, - common.HexToHash("0xe6a1dd0edda0ee5e22f287a13e7c3db785a3f0c7db4a5f3a73dfd57ef6784010"): true, - common.HexToHash("0x7da448a546802d1805417de1f7eb2fb473266cc199143f645568962902c448c2"): true, - common.HexToHash("0xb75c3ed5064206ba522b6a46523fba6d3a83d0820a0be860d63117e1321f1dbb"): true, - common.HexToHash("0xf06736529e16031387f1a5e865eb2ef65cc606ce6c9c265d305e642533d9f3c1"): true, - common.HexToHash("0xb80646754566de0fd159935e7ac6db708297db2fa8772fef6cd42e8c776cf21b"): true, - common.HexToHash("0x9160c1db814f1fd7a02f0bd76505b359f21b95d70629bf8a335ffe08b02928f0"): true, - common.HexToHash("0xeccefb106f8d1882e44b2552dd919e2939e3a505216027ec97d548f99fc3051f"): true, - common.HexToHash("0x09e7aaee3d238ebb194a11319a34359cb3f5e598706f5a162fdfc615dc2c02fb"): true, - common.HexToHash("0x8636089e29e80b110f8288ea79da0f2768b7e8bef2c169c207b256be10b49d6c"): true, - common.HexToHash("0x51a417998d8c86432c413c300dc7085842c2b5ad834198f711b3f66c8e972876"): true, - common.HexToHash("0x2710044b0197586142b1c77dff571b03840fe0e7998d96847b129c141df9f85f"): true, - common.HexToHash("0xc1992e9cfe1cc61ef605a88b96d81f13f9719c7f0e9b689e257148b597b3cf11"): true, - common.HexToHash("0xf784e1fb7fbc0c5d86a75971a56c0abeb64b981b84607792c87b5730ca485669"): true, - common.HexToHash("0x44399cf438b68d0391997c63017899dac423a246ebdf5568da728a053006224c"): true, - common.HexToHash("0xe604409880c62def003fb80ca397ac27216831e75bc3186e5880c10feb480182"): true, - common.HexToHash("0x7f600c507168215c79be86861238376e75f2a0b72ab7b68ac0abfe720615c460"): true, - common.HexToHash("0x7aa227cba5b19f10bde233a48dfa1b17099a3139d6befe488775ac12e0927354"): true, - common.HexToHash("0x3d538c878bcfdf9b998780f8004a678bd6698c6003cb56e24286d7259bd1fb2c"): true, - common.HexToHash("0x3a512ce604ad7e2770c95d9e4355afc65bf0985f2718a03cb4a0bb4aa69ade48"): true, - common.HexToHash("0x2afaf827908e5e965f1fb410bf1a023edf436cd053714e5591f62df938490c36"): true, - common.HexToHash("0x0798987ee8d62077c6059ffc27137ae3b8487b1f784472121d28f6274cc41c72"): true, - common.HexToHash("0x2980d5acbfa6e155a533c56b97815e6b50272a26dbc25682f5080a0c72cd82c9"): true, - common.HexToHash("0xdbe09e19c1d40f4799fa94dfe8202bd3043ea559564a951a9ad555fc3083850d"): true, - common.HexToHash("0xbf38e9c7dfdf0b778ff5026673a006855f62b1e3a3b074a1c390319d62be36e0"): true, - common.HexToHash("0xc7056f68483b3677c524b5c8d1ffadc6ea349d1dc61200c5fbb49631311dcf55"): true, - common.HexToHash("0x226cde166e800d0a089b13af1267251cc01832fb8520beef476ad0982d68f8af"): true, - common.HexToHash("0x2791a49275974c8d97cebd5386eabf7f1c9872ffcc620ede02a641fafea353ea"): true, - common.HexToHash("0xcd0b1321cdebe319755d4fd940ee781000daece465b480baf0305cae01817f25"): true, - common.HexToHash("0xc260ccb1b03e53070de5317bd5234cbafae9a8d33c678da6cf2eec0a963422b6"): true, - common.HexToHash("0x755218249731d9e26ab454d9e0d4dc39a925e0b8bf5c8eda9c1e18c8429a2c90"): true, - common.HexToHash("0xc4bde28be40e90aa25a45c36b3e2add416718573aad6a065a7e26879a21bd162"): true, - common.HexToHash("0x90d029d4e2d67123bea7f578a1649d1a4e3b6716b1e7d4491f180b01027217f6"): true, - common.HexToHash("0xf9c0d2380e840d51a3657f2e651800e60906d8fee2ba07d4d47d9b65725b511d"): true, - common.HexToHash("0xe5336923b08acce1d29f8f8e47360cd61b0eabf52f4e69fea9fab4ccc0117d56"): true, - common.HexToHash("0x0fe596ae3c94f3baa27b409ccfb11c444f0e3074188009d2633d1f24d42e0fb6"): true, - common.HexToHash("0x74b5e1a5d48acd5283648256584d7e882ca399e1b211bf641aa81f6abe1b44bd"): true, - common.HexToHash("0xfc0b846c7d2acd2a8247aa45e3203be358be68c821d011d8608e952d74cd73c1"): true, - common.HexToHash("0x5b889befaaf6723d5cb8cb2569aba14e4080406096ed632a0402a037630b5494"): true, - common.HexToHash("0x22e7f61827e812c37bba1701f99bbf0158044a8d8954e14c811dd9528b5d8d66"): true, - common.HexToHash("0x6d4ec62ec69fe9db6a5a80b895016ca76194ae748cbe17d3aed1c00082f17397"): true, - common.HexToHash("0x8bd3b8f0ac50df51d40ad65567fca61703802a4836b991e81a5d48b375158c69"): true, - common.HexToHash("0x23a6b9cc7d47ca8e09a0811c9154c97ead1954b83f370e98b7842e9fdc078b72"): true, - common.HexToHash("0xaa77912c3c8d9560673b16cddccbf46828df191f223a70d99d07817920a689b7"): true, - common.HexToHash("0x7024b9e813abbb786914fd6849811cd52289aaab9da1090115594669a4492c69"): true, - common.HexToHash("0x0ea8f0780d3482a378f2b4fce1461dfe2124b1f595dea253ccd5d823d15529ff"): true, - common.HexToHash("0x5076e9e9f5dab50e00ddfbd636a23cfeee15cdef145930bc5c573666df1333c0"): true, - common.HexToHash("0x43ef79c5d0b9c8718986a3e3bd003654ce31f22d1761d318465db4d3b0a5a645"): true, - common.HexToHash("0xa44774beca66c5ec71966db2bcae4d4039f9b8eac22ac18e74c936780a4b1c6a"): true, - common.HexToHash("0x85447f629bb17a6fa8fb26ac41605ee87b64a502ed433036fd3ca9f51cd09d49"): true, - common.HexToHash("0x1bd5f9f5144d2535d67a69a21337cc2db81d9f1a41d66142b3a39c501089873c"): true, - common.HexToHash("0xd80c5f20f70eb90640eebf03717efc38c672ccc1f9d8378d277d4a7cf5d18edb"): true, - common.HexToHash("0xaddab81d6309fe6824566cfbbbb32c52a0ddf8f5d7989e914d1f5f26bd783aef"): true, - common.HexToHash("0x41ce06addc1e15735e66603540a1634716628dd93a1598280f1a2e9c34804db0"): true, - common.HexToHash("0x8fe08c77043743f5fafd37dff53242f984ca4b2bdf1f2c89826bf16b8e8a3fe6"): true, - common.HexToHash("0xfee4064c890c2a71e91a45e7f90bba23a6997a27ce0406608169a480fdcc1f1d"): true, - common.HexToHash("0xb6f8629951ad3dc8aaa67e94ecfb16fc9b03058ecea56aff79eefbf25cf0c727"): true, - common.HexToHash("0x986a1f0152118ea5adc15016ad5ddff49bbe9a91b8f95529b9870e645ee28ab4"): true, - common.HexToHash("0x33d3d7c272b30c65a46ab8df9db600cece064784eaf7f0d1212ea9bcf1c67a79"): true, - common.HexToHash("0x7ec31957775088456be5293f2317b5227e4b25315ef212be9b7ce24d6f52bdcf"): true, - common.HexToHash("0x4313bd670adaef74f13209be344cd136bfb2d115d1d1b6d6ec229994918f8299"): true, - common.HexToHash("0x26204511e490175dca26a2659a6994ae92ca8d123c9bf49e654478dfba0a962e"): true, - common.HexToHash("0xb36a5da4ce1ec816a89a2f92d7f320ad06fdbd3038226b8de61c4e5f092e5b54"): true, - common.HexToHash("0xdf1ee6e3abfe16f43b47b86659cd0d1d61c85234cf50feb912a501cdb61b362c"): true, - common.HexToHash("0xb4aeece9d190a37079206de87a57481e62449b281f3dcc998dd280b293489638"): true, - common.HexToHash("0xbb2f522334aa40f6fe2d9e45e4f382978bb4613f794979b83ad56b7faae39419"): true, - common.HexToHash("0xc9e751b636e04568f1521adbe63141bc2069b5b9177179365607017443139841"): true, - common.HexToHash("0xc213a234e72fa0d6d5b482e0c349838cf267989c42a8656c5c03a2b420d19247"): true, - common.HexToHash("0x4ee568f5eabeef62a9134079ba823a17f9d08c7fc0501f0c2f1c11d789ef0f41"): true, - common.HexToHash("0x46a607d9f8fa3ba80f6cae193058a285617e112caa1766f65b22817e60c6572c"): true, - common.HexToHash("0x2c5403e92663ff298a4f033cb0e505f53a879744c7f2dd637d1de26b7fb7d9a5"): true, - common.HexToHash("0xd0cf6a64fba03412980be39273493069ef6838373b5eb0da68cb7f64bcf42403"): true, - common.HexToHash("0xa012d0b70742a3a4660813bacbaea38de46ead66bf9427d1734a3f81a02d61f9"): true, - common.HexToHash("0x354b6ad9456f53999c95d7f6b451c09047b432d7094cdc3ecb117565e9d0ecc7"): true, - common.HexToHash("0x2e9a0493e858b8222a5a50de5ced229ebc5c93b6e760204a1edab580aa2f9800"): true, - common.HexToHash("0x72e2f17d9ecb527d2c38f55dc98fcadb428b10c6a0518affa116f702a39ad9b4"): true, - common.HexToHash("0x30aa88b593aeec56da6efa5fdeec9320f0fd4ede6938fcdc37360bd8cdafb445"): true, - common.HexToHash("0x94dd8427b0cbc5088314f07c47bbfc9ffda9e8507f51d1d38cb9872369280e09"): true, - common.HexToHash("0xba716aeff5f36a49e626b22aa7a57488f753e27da8f7caa9fbee3e70ca1c79d6"): true, - common.HexToHash("0xecc76e6ef9f013735e1fa9e1a5ca408076bdfae9401fbfe3339846eec4e0dc62"): true, - common.HexToHash("0x867aeb6188e86fcfca0b3dda71e1e953cbc4298b12cf2300e5d771805894d9db"): true, - common.HexToHash("0x03d0d0ea8ffcabce110256578f3c07e1dfbe106e2160e805312189459af3e828"): true, - common.HexToHash("0xa8d7ae672b36124166826b36e7f5ef36be3ee08647047021788c26956915ba9c"): true, - common.HexToHash("0x70e2d0c8b5e4805ec2bc4b2a97a587a7f715836b4b2cf759cdb7d001e6b7f801"): true, - common.HexToHash("0x13882704805ea1aeffdedccfa2fb8ef01d3f6120f9fcc9f211baa0657a496c6b"): true, - common.HexToHash("0xaa564582c50105a16aaff3c3496280968fe1d6486680dc062ae49abd855e2416"): true, - common.HexToHash("0x3d329fa4eda63febe38e3910c146d3cfaae5ff440c7d6d7ee529473095e6a180"): true, - common.HexToHash("0x5413a5f8467eaa3be78f490209c9fe82a17771050aee7da7b63a01dfbcacb069"): true, - common.HexToHash("0xe643cdc9e6c087efe244f37abb783b83474057b23b5a1a2a57b56facded43c6a"): true, - common.HexToHash("0x1a6c97f09c2f3c57ab2f2aba3c0aa209a719ef8f840a07aab98444dfb3d8f18b"): true, - common.HexToHash("0x82737bc7d72e09fbdb8ec3818c598e92371f76e7fb8adf7382df206613949f16"): true, - common.HexToHash("0x29e875a3bd9ff43f7996d08f961d5e53683c685b542187b6c20d032bd5f36af1"): true, - common.HexToHash("0xc378e57f9b0e8fe97e7e67f2a289bc4372ffc5de145643236a6097bcb4b623d7"): true, - common.HexToHash("0xfd68ae6e81be7e72765c92c3734e5121de64508c2f6add5dce3167e5d79f1a68"): true, - common.HexToHash("0xa42b5ee3441c4fce0d3838b6b9f989f2f345bff82a33a62f3b01b6c9f1aba0be"): true, - common.HexToHash("0x7a4685fdd92f8844174e4b571095faedded9f810f5d6765833bfa07201b28c5c"): true, - common.HexToHash("0x722da74e52afe6acce5ea5f2d30e2621e873cf6801044f9c0eaa41bb25e17314"): true, - common.HexToHash("0xb83063b07b1f62fcf548e8e2dea76f7f3d934214cc7876ccb0538635b587f558"): true, - common.HexToHash("0x15e1a47a0ca58929d4b29e28f270b88ba8446733a51f4f6a9f61717ced63a20d"): true, - common.HexToHash("0x54e4ebac6a8d648117a0996de46732325827bad42f8d076a597aa41cf275a259"): true, - common.HexToHash("0x3637fcd14570e2baad010d0a0f535a90a5492f6f525ccd9ed492e0b5bfc26a2d"): true, - common.HexToHash("0x56f819dd3b2b5b716f474dd140819714fa6fbb8daa34ba5ef20cc7be887d9d00"): true, - common.HexToHash("0x01aebedabc732bd82991e75ef6b20fce103dfd09f64477e637fa8c22dcf4bd22"): true, - common.HexToHash("0xe91f9037815cb95ebf04e0a0ed07ab8adaaff1ab97236e280ea397770136a21d"): true, - common.HexToHash("0xbf9788392966afd059f4a19ff5fdea34e421b33e8f4acf5697f5ff63e71d2e43"): true, - common.HexToHash("0x2232aa9afa619507179a9e540b15564a3069808fa7677bae5a40243497ac018c"): true, - common.HexToHash("0xf936da7baa800d2befc6ae7d71168e8a7f640af4d20bd600ff0c3bd624eb4b6a"): true, - common.HexToHash("0x75a5a3aa1c29aa4ff15ad2afa37aa9b20b8a1a1d798cfaf5c16e12957df40563"): true, - common.HexToHash("0x0e3b22ed9ff18ea850bf7d1c6e771393362e70bc75c34c61397c68ba264b1e53"): true, - common.HexToHash("0x276867bbdf7651ee11e56660d11cb2fa24f95d62bc933e80fc7ec42303c24f98"): true, - common.HexToHash("0x53613a564cccf7d3cbe99f255028efb60e38d09bfe7f3a4ec50df2d8e414bb82"): true, - common.HexToHash("0xd51d0891af1170c97a0fb53ca81ece91814b53572661bc32a185c5892ff363c3"): true, - common.HexToHash("0x3e90f22776f8970b2e48fe3085559d721dc4b2080994f806e1f313988f3d4ce1"): true, - common.HexToHash("0x86a41c1f1ade006f1e5a74bd319bdf9bbdbb6dea42cee79a91dcb127cc988344"): true, - common.HexToHash("0x355be97f54ac8b65e54a0ef6bde8aa3668523ec5bad72cf5b1e90896a70315ac"): true, - common.HexToHash("0x69eb209876811b6a0730bcf753c218f91fa2080bc8bc8b771aaf8e72b7b87254"): true, - common.HexToHash("0x0a090c74812e2e1d60eda38f9cb911f686dbd32d80b0e056a063305dc38965ce"): true, - common.HexToHash("0x482f9b896a59e9dbb115f3b300c81608f8eac641af06676fc0a866b016dc3b24"): true, - common.HexToHash("0x442615744e3545c086bf7331ca39830b013dc167b83f2d896dbd05d995ef6d46"): true, - common.HexToHash("0x97cfefc507b3708f4c777a29484ad23644834e3936ccf9f5d2b67a0dd3ec3e9b"): true, - common.HexToHash("0xa344d5c48674c02f8faeb91386987d623fc41db0470c3dd54b6334cd13bec3ab"): true, - common.HexToHash("0x61c5e33b01f5498a8d95efbb7871fb0acfbf2aed144dc36c0a1d952d12bca243"): true, - common.HexToHash("0xf0f0182891029dc3e8a5e5dde31d0492e9233e596d53af293a3c6aae8472c0f3"): true, - common.HexToHash("0x366b6891cf6aa7170611398ad2ff9113055c486bc556bf6c8591d2b8224f902b"): true, - common.HexToHash("0x5d47d35e0dfcf4540d8c67ff956912a7334eb5cf0a5283ab783cc93875778818"): true, - common.HexToHash("0xb117b5021288f5e798f992119ad19ce2c7474383513d4e0346141c5227c58d34"): true, - common.HexToHash("0xfd2679926a161118713db56c145616d041bbf542b231fcd196061e6e15a73d66"): true, - common.HexToHash("0x018883e069c9e0765c04afd5dbdc8e4252515ba1488b0602b421017259262185"): true, - common.HexToHash("0x242d676c672af6ef316c1aa53f0456f1a339d13394113de3eb289724d14fe7f1"): true, - common.HexToHash("0xa385a438611b0f122ac7eec49206e7ca06393cfb70c1eda43a2958814ba4e887"): true, - common.HexToHash("0xd931c618d9f5eb6ee63e26f9465c56751ba7223dc4b1783a91ff7cf82ef3622f"): true, - common.HexToHash("0xb881cf89721b9f7a9d52d3a25a552a20f83a92c310c6a3bd91424eac180b3514"): true, - common.HexToHash("0xd66e74dbc08d946c2e64ba916fa0d26d85c0749f1932b90f06b41e658c054564"): true, - common.HexToHash("0x930200ba3e0079e11628fed46e10f615c35ef5d0ac1ac58b4eaeae894797f497"): true, - common.HexToHash("0x757631f405f2c8679cbf6b1ca7966cf9385421538605cf8d95240680755c21a3"): true, - common.HexToHash("0x24e653163cb078b8ce09c67d4849b400b30128cda264371a6494c8ccdb7c8868"): true, - common.HexToHash("0xfbf71bc2ecf8b82beb51297a94465bf3eecb1bee5df685049cb5fc2ecdc76935"): true, - common.HexToHash("0x5925c7f8b4c3c2866e43258bf2e6ecdcd3fe8c1e7979c36985e7c8f7baeee1d6"): true, - common.HexToHash("0xdfad26f8cc75a87213c467f4bde23902761bdc1a7f620a2066b04e9b92735671"): true, - common.HexToHash("0x8f076de441ca6ce3a3c58fd6f2afa562251301f2b0bbe774bb59a99827d3907c"): true, - common.HexToHash("0x349928aa86ddac0c0c774963f869f4952af571a8210914e39d17d0430a2427d7"): true, - common.HexToHash("0xfa31bca9762b8f38788683ffc2445ea579f28ca630d1da8222b84ae82c258738"): true, - common.HexToHash("0xf1c8f530f3fc8a09b14ca2b82c2a0ae4dbdb7ca87258f5af4c3612cfdcedb7a4"): true, - common.HexToHash("0xdc8bb3329747a7ae63f114d8487460318cf06e6db21d29301db63ed4c53335ec"): true, - common.HexToHash("0xc6cbacf78e302a64d647032d799326f2595a8a48a1e3729eb045662b3e8bd7d8"): true, - common.HexToHash("0x4726cbc792f8dad662aa59e5f826ecb72741b560ab2b420bd3aca907f079ae9a"): true, - common.HexToHash("0x41f405fc6b92930de002e9fb3a8813a1457560015e93aae58fbe2bc32fba4cb4"): true, - common.HexToHash("0x57676595f7fb6cccb7dfec47112c67944ff0eef28eb58d1ce26a4c8f16835704"): true, - common.HexToHash("0x95ead7e0a47bc01ba91966a15c7dc0c71c553f1bce69d5501aaa4ce546db5782"): true, - common.HexToHash("0x15fbd9afdaa2e3c8bd5f27b2f5810c20069cf7dd6da9398b2582060216a74f83"): true, - common.HexToHash("0x378535abaa8bf2d6012a4bba59453833ef84d216f8bd4f8a921f1b38412e517e"): true, - common.HexToHash("0xaa7e90441fccfaf091e4324254b2826e98240051ec1e430ad5da397a435c174f"): true, - common.HexToHash("0x17b2bd88241cd8fa7ab092ff97d6b06f297613c4cc32c0c8472588f3d25a2c5e"): true, - common.HexToHash("0x68a8bc4056e030388c1b31239a2540692448ea161f84c7f6f3d935fed82ada01"): true, - common.HexToHash("0x679c8b35e84f0fe2f9c94b8d1cc019b8f457e738ceddf6fdddca37d92758e40a"): true, - common.HexToHash("0x2643421d96744d4419eb24d9a3f81cb63867c0d3547fecba2aea48d4baa5ce16"): true, - common.HexToHash("0xaf3469e2f6b1b713aa6b79bca2f968d336e2d961afefaeaa750198b82649fab3"): true, - common.HexToHash("0x59da2fee0c0189cf6533e1fd84c247ddfa59f7c3e170bc4263c2bd06528e6029"): true, - common.HexToHash("0xd52fd09062cb9b1b4d6672aa1b61478f988273ca65e728a54f6beb171341e425"): true, - common.HexToHash("0x9d40f2e24d8b68cd5194ddb6d730fdf3c2e05ff9849b2c4a6e4e1d11ee60aa06"): true, - common.HexToHash("0xd83e0de482bf601e4404aa888137e9a64e0880d5a582131fba96265df347c7bf"): true, - common.HexToHash("0x57acf431344aa65a46e49ac6ce08002cc34a4348cccf7240df6c8bc42f324446"): true, - common.HexToHash("0xf212e273a1f474c78384826c73b9eb04950c4a6c1a7d398a2ed738c2d105dcdd"): true, - common.HexToHash("0xaf6f80275564bf0d987e4215b43745a52e1bcd152ff4e6c348b5e3a1df656e56"): true, - common.HexToHash("0x122061d0b25eb571108271c40f4d060514bfad66f57c3106cf3e932a2b143e71"): true, - common.HexToHash("0x560eb7789abf38a0e72b44d0c89fd0f07b0f65390b4118886be350226a0433bc"): true, - common.HexToHash("0xf9ba9bf0a93f13611101cb701842e2f803c07b0f1f17a04e2e14fd5606958d12"): true, - common.HexToHash("0x2fa12b4bea2d6fa64c0a1336dcf810c126d1234e539329afd88eb37ffc1563eb"): true, - common.HexToHash("0x4bb25d0f6675fbe00436248cb130c25044ef7995b57f0067fccf38b8167abbb1"): true, - common.HexToHash("0xd9c0a4317a8167df23fb6dae39383e60f85a9dc693875bbb510dda6a3a8c55fe"): true, - common.HexToHash("0xe87cb132aae852d2d2fff549d49731aa709f8d82a7960c6c833e91c9cea53fe5"): true, - common.HexToHash("0xecc55d677815d5ba009c33bd8f83caa95f2aded33c29602840fd828fa12121b9"): true, - common.HexToHash("0x665faebc6d33c47c4e2c7e87dcd848401c0ee71ec9e3161aec5e9662d0632170"): true, - common.HexToHash("0xe32e4990d3fc66c4fdd86d8a0ae49577be2edc50cd3f45961d07af8382efe49e"): true, - common.HexToHash("0xcb23021c51d430098ad76689c0b7d58198deaad85fbea1891a05e9903e5630fd"): true, - common.HexToHash("0x751de7830fa31381165054e97a5e3bc6cc8959c3cd83c3ff8a3014d468e2270a"): true, - common.HexToHash("0xbe5de8a895a9a5d43efb61d1955000d44e05db0ddf8b0f1fdfc2e05b94a7e59e"): true, - common.HexToHash("0x60d082f4d3a5516e54c078afabdf32fad588c87a8d7d684704c4bd622a5a153d"): true, - common.HexToHash("0xb79e410c8ea9cfc33eba43b7177e87f0beba1fef6b9c362d2ca56b9a75cfce98"): true, - common.HexToHash("0x7a4f3fae7610940f7ac2830f7404ca5849d2242bc7c5984ea42b0d9cd8316188"): true, - common.HexToHash("0x0a1e4a112ac6ed58da58378dba156a22c55cd23eb2ec8587d8bbd91d2c542c40"): true, - common.HexToHash("0x3c05d0b3ee8d16b2e7c1ebb55281bb17a662598666d3f06a760d8b27f77d16de"): true, - common.HexToHash("0x188f08ea1214041af1c63e64cf563a19d9d6b03d9e1b1f9176fa8e55b387cee1"): true, - common.HexToHash("0x5a2ed3a1703817e3d37fd94e8bea0c0b3c116a83d281b1b87e114812b169a56a"): true, - common.HexToHash("0x841db7ffcd00acf0f5e075b95eda6907e0594456a741305939dccab6652f7502"): true, - common.HexToHash("0x330396a842568c2b827d63996a276c80224c4f6092f132272f1c86eb021ebe16"): true, - common.HexToHash("0xb239255914aabf3ea2befe180597df96366ecf499d596089d82da274be576b6a"): true, - common.HexToHash("0x841a9a6d6a446cf2ace15c0d5a780f374093ea6a5292d1d8f83f5a77afaf817f"): true, - common.HexToHash("0xe3850c58e198f3a50192410ccdaf66b939b1602d670e761584dbcec6779db7ed"): true, - common.HexToHash("0x22a9bfabc4dd469c33d4b41bc4ae852bb0738a769ef4a52fc52f1ee90077fc62"): true, - common.HexToHash("0x1a849ca0ae1235e89256bfed3947db7c6630a69ae7f94b06bac564ba5486a088"): true, - common.HexToHash("0xb29b8848a33bd90a0881885a8f51d07c3f8a28f396f19b58e04acd38c6f1d0a5"): true, - common.HexToHash("0x362a18e6313c38a132f50ff6961fc1cadad0fe8f39aa50a8c20ab27087c30a57"): true, - common.HexToHash("0xa3cf75cf7de7238f13717718034fccd3ede32c84866ee465e0c304323ec02d70"): true, - common.HexToHash("0x9571134be51a014b73664de407f62ceb6677ca7172e13e77ce5e64e585c5e5cb"): true, - common.HexToHash("0xcc1107b26bf17615de9e1c49207654765f5b2a37a39cd9d7763b97356cbefab9"): true, - common.HexToHash("0x527471468488cdf4114ec465c36ffa094cd611c06e4a9e7bf149fc13aa1f05b2"): true, - common.HexToHash("0x1f06ee257f715d3d137fa3d8b16f788126a1210dd46d4aa9b406f28ea91b65dd"): true, - common.HexToHash("0xe3a1e498355d310df24ba714ab2a3fa1ffeefee48e2accbf450bf2f2d718f6c5"): true, - common.HexToHash("0x996f1b915ca4e51673e48a93c44d2fb9407fa7ab9c034da76aedf50fe406761a"): true, - common.HexToHash("0x6df7d4f5037136c610a093552c44b4bc9de8a96894dcd67ad94694fec3f08d7f"): true, - common.HexToHash("0x55f575f86b750218002084622b3bcba39cf1ae4987958db8c5318c42d3778ecf"): true, - common.HexToHash("0x2172b602ecb1550cd2d5816c5da8f5e1cec962f9c3f7fa7582bc0e9f348ce465"): true, - common.HexToHash("0xdc745a1f5fb5461bb1120c52e93c76cb7321fe92f5addf2d0d84dd2b21e32e4b"): true, - common.HexToHash("0x915477b0c2141975ef5b7550d82247f0989d25c1c0d02c061a13ed2ff95d8b4d"): true, - common.HexToHash("0x7d412331501be99be0fd2039e83052c97304f007a7fc7280b963e98a90e50c34"): true, - common.HexToHash("0x984b6148891b14636087a248383334edc3ee8c0ed9da7d6ee17bb6c869a0784a"): true, - common.HexToHash("0x315c82cf7aedf0fe2b1ac2841fce91b2f21558ad6456d1d8d2836a57a5cfd230"): true, - common.HexToHash("0x26f0d739ca477e077e4522d5adde9901734a2dffcb86893bdec112081fed56a1"): true, - common.HexToHash("0xd26cfa6c063dfa5c7a6f4f0228d113829594afc01ecfcc97ed7f6d97e6c0f899"): true, - common.HexToHash("0x709760dfa2639939472484953b28c098cfb6691c5df425c8b26eebf3c43f26fb"): true, - common.HexToHash("0x84de4150d3a2a26920f45af8d9fb41f94633dbbec9a6c26c8824537c8761730c"): true, - common.HexToHash("0x01c2278637f606a74b138af70f4585b6ca4590fda36ad1103addf8d68246185a"): true, - common.HexToHash("0x951276cb2d2532c14fec89a8ea030da13a8ee9ed77039080f6f4f193d857d472"): true, - common.HexToHash("0xd13fe0e344eaa4f1193a99200e2d18a6ef92aa8b3c975e2b5279b9c2a7ff9579"): true, - common.HexToHash("0x04ec0e0b916a05f8f444a43d4710ed63b4a714c76653ad976998a50dc48dfcac"): true, - common.HexToHash("0x9bb3ea37108308cb7c5eeb797ab1abc2c5c1f1ca09c878176d7789edfe9b95e4"): true, - common.HexToHash("0xdb26e9c3618064752c1bdd2ffc6a2fc76ebabbb047dc02df1f10e9ac983a3337"): true, - common.HexToHash("0x3bdec2ae0758dcb0d7429c7fb635e8fd7087b4ea91d8617f23f955485684ee0d"): true, - common.HexToHash("0x7359facde0f245a8c2003acde673fb1069dd2296870da13b2454ccd1abb8f68e"): true, - common.HexToHash("0xf807184c7b0a4297ce09360d12acb7e637e1d3dcb74fd023ca7fbd4ae9c9f48d"): true, - common.HexToHash("0x0941e5557c3f2608c689de9f034e89089b70a8b0dd51b2d1a67944a6deef81bb"): true, - common.HexToHash("0x476f363d9e92c13b223c04c17dd753280330159d951581cf9ae1bfc2f70c1bb1"): true, - common.HexToHash("0xf4959cce54965d1f6a8dc77aa4d47a1c3d2c4e0dab43688e262145bfb264179c"): true, - common.HexToHash("0x12cf06495111e300c2b6903b0cfb970e531d84c6b37aad1ecdc4f57b21d539fe"): true, - common.HexToHash("0xa9c345a62c65c3e79d49380900d8d4c82af5ab8e587daef911a72639f6412e95"): true, - common.HexToHash("0x985196c1c6712d31bcf5555cf86f8243cf4158f29b8b8f7d1efdffb9a41322f2"): true, - common.HexToHash("0xd0f7a95737f583d7f15a19c85b51adeb1a7ab162db87d612fe7af76c44469924"): true, - common.HexToHash("0x78883e5b2acb91cf03d1c154c3119479d6ca3412de5945fa3cf26f67cb02d334"): true, - common.HexToHash("0xb0aa884cfd153ce6bdf27c4ad767cff287772dd7ee48cbe254f3430888396c91"): true, - common.HexToHash("0xd91deacff2f8e6be50c0498f970701e507f2bbd9e0facbb63543a323b872e88e"): true, - common.HexToHash("0x1413bc931b885ea9efa4f2c47eb2d76a41c9593f0774a355a4b949aacb01a66f"): true, - common.HexToHash("0xd2618945071a9a091c730841bb269ce1bf3a8cbe5a49e0bcf1d4cdfb4f0367f6"): true, - common.HexToHash("0x53d4891dfa874794eb7bfdd02b389a9f02cdaacea014ef5c67c41f1fc49ecb96"): true, - common.HexToHash("0x9891205972fcbe9425d3289a38bde370759c58ad9c2c4625f72d5ec25729c0d5"): true, - common.HexToHash("0x8fb3f1c32ddd0e7489686cef2cd91c616b57420b47b45761a5671e9a612838b8"): true, - common.HexToHash("0x1759edfb22df37d62186a835915f88173584fc8d7f7cfbd156919489ca4e0ab8"): true, - common.HexToHash("0x73fee87b6717fc30450a2994359ed4b5609ab0fe8b96b6483d539d100c6873ba"): true, - common.HexToHash("0xa01b1d19e9acb9e369d41c22eefd7a382acae5fe960c411305935caadf08065b"): true, - common.HexToHash("0x4730004d034fd329f61ace9ffad9abd7cfc86d028934c2038f6305105fbb0091"): true, - common.HexToHash("0xfd899af3dfb4d0c86ef1a3a8f05cb5441b12976b9fc53f1e3584ef57df6d8828"): true, - common.HexToHash("0x543bc322279299e15ca4f17aeb600c628d90c41ff913a0b92eae5af82f32ede7"): true, - common.HexToHash("0x387cb323c2e6058bf76555e350a24728ce07d2f96364f374d0d670a9619081f7"): true, - common.HexToHash("0xa6cdd1ad7374ade4c7bd8e7d1d12d8e26e0fccef95bb18577b462e552a05680a"): true, - common.HexToHash("0x4ff7b1e89f28610aef635abaff3a4a7ed0e37990f1c39d8a31ea0046308f1e5b"): true, - common.HexToHash("0x095f9f3595e81a7bb66e99b338560696a9301da2986f3ed48e0ad0ca6dd09609"): true, - common.HexToHash("0x9ed0781853f1159e8bd93d948b326fefd8de2a89baa545b96b50ab6521e38b18"): true, - common.HexToHash("0xedee5d7b53cf8816ce689f52447e8d5387b3f244fd4802178cd3de8918f052bc"): true, - common.HexToHash("0xdaf6d02a78c15bfb72274afe0f4077e4ad91cf1e619805364577286ca40433d7"): true, - common.HexToHash("0x86b68d0d4d3216442ffc831665e6426be37400b6b73198f475831c7cb4413517"): true, - common.HexToHash("0x5397f0b85bc19dacab3c24367e96f6f5cabc6034b2c53eced6ea88ba3048cff7"): true, - common.HexToHash("0x941fbc50e57edc0b032876a70f88e9c00e35e82115b5457db5f9f68924cbadef"): true, - common.HexToHash("0x81f5b4a487465e097bde1ffe03b48dc3df3a6506c8019e4e9ca98d3355615267"): true, - common.HexToHash("0xa80dbb5f1eccb0c3111b1ced4ec28795c81f41bb23e70499100fb4fc6ac36332"): true, - common.HexToHash("0x47fb6da4e4d5625002ae6c477cb4ee363446eba63e56aa35396cb7c235ff373c"): true, - common.HexToHash("0xd983ff95cc96df1ab26bcb2242dd8db63fa8de20e4dbbf6d83872eddff67cb57"): true, - common.HexToHash("0xadc45830be98ad6cb8f1ff26e7ee69b556f914919b8ba30c7f767da4d9b517c5"): true, - common.HexToHash("0xe9807ca2a03014f678ce561462d8c41e8411e8ae205d9851ba00d07a3d459c7a"): true, - common.HexToHash("0xf3569691bdee3e7db53ce1702fcd80c78e4f15421fbcba1aa0308c78f156f4d8"): true, - common.HexToHash("0xfdaa657ec58814ded71afccab5ea923432315bd84cfc20e22b6301949eb54a69"): true, - common.HexToHash("0xae58b3e6eb9589449cd145568c807645f217a0bbc3d49f087c08603e2898d185"): true, - common.HexToHash("0xf8291d09d4d423b52fe8d7ab09df5af8d59255f3575e4f6ee6744337d63d84bf"): true, - common.HexToHash("0x4301e6acce4433f10da768e3b6233f75816c501141713fe0bb33390a212bd047"): true, - common.HexToHash("0x7781aaa02dc9e9a636ff4a3ad345f401b9a3cdcb109b68fe6929f82fb980abb9"): true, - common.HexToHash("0xe5bb4d91d918a38cfd74e2145265475c71e9d0a166031bb9cbccf5720a7680ea"): true, - common.HexToHash("0xc5d0a0ca0e158999cab8ccd939c88df1848e836453759dc1cf52fa3f500bd3e5"): true, - common.HexToHash("0x0695cbc8ad05206a17712db0116dc46ff28514f5c5c35b90a2c64e728854ba3a"): true, - common.HexToHash("0x9b8d7a6b1df67590d3283d10f36f6036a9b9b0c246b0f927681b22d44917e1a0"): true, - common.HexToHash("0xcf2731cf5b927260d6d882f040eef64f4ac5b18da266b0a5efe4563fba76764f"): true, - common.HexToHash("0x67e5756641d8f313c07e81205b430b20e4c5abb81e71745871928cbd77874a63"): true, - common.HexToHash("0x79776477e34cf851752bd50dffd3e29611561072703e2f3e08c8d1c233356e54"): true, - common.HexToHash("0x9f809e1a0c5a3f0cc77b8d0ff3d3a205c088a4ee119d093b25a3388542a8ee66"): true, - common.HexToHash("0x8709d34a36022edea5d5477fbdd057e8714d76d2994ecbf7f9646eda14fe8773"): true, - common.HexToHash("0x7a1b253fa850d4d95f204430152ae96f716a92378e1a5bbb2219b13d6a11ae56"): true, - common.HexToHash("0xdbfc76fc3bc8f81d20127c8afde6e14a8e8aee14a953181948cf22736de5675b"): true, - common.HexToHash("0xa397e7eb0136a535510021d1fe5892b0b34a63cf470de390b5c18cc47feeff44"): true, - common.HexToHash("0xb4b593069fc772a3dce810513a04418682d1a3a66af159afac851a3efd490c12"): true, - common.HexToHash("0xc84e90842e4bfbd7d56cc4b8c73413911601648f04c74acbd34ad1b7f9053286"): true, - common.HexToHash("0x86f2fb1d790a909d3514b2d9e0a2dc55777944eaf998dd15aa2c12c755881bb0"): true, - common.HexToHash("0x462317c59094975253fe953847cb2cc8a5c936007ea1d04697cd6904e0023baa"): true, - common.HexToHash("0x953fe9ea654ae982f021fe205a6cbe4abee88d5d1c557d032506d08a1167766c"): true, - common.HexToHash("0xa388540f3aabf598ce76bc02d9764b327dac78ccd0f5b6d6119a8d4348c48f59"): true, - common.HexToHash("0x0caed4489628cfef0bb348acb92bbde5ec150b0bf7118b7d59c35d7c7762587e"): true, - common.HexToHash("0x97c7d77ae16fcb3c47b3510393596ecab6d5858b78e8b9a0b17aedcda9ad3629"): true, - common.HexToHash("0xfcca55489a4ebedb7de9ea15ab202687a5980bce5e13c58d8521aa237dd8548d"): true, - common.HexToHash("0x3a12a9ce41df360d4ed7ed0054330ba52fd9bd2724a0ec8674f4e53ea08d0da3"): true, - common.HexToHash("0x806e3c12c56d5291516633d1304e988e97c143b6b52555f989dfbdf060d9cb8b"): true, - common.HexToHash("0xa87e70a182ff09611c1815d350cd757257cf926d26aefb00975cce91e208d3e9"): true, - common.HexToHash("0x2df0dc1578f7014d0935ac0c9fc14120af3c7ab6974b0bad440eb5fa42047769"): true, - common.HexToHash("0xcbd9d9bd34e01e3108e7c7c40f11b813d335a9f00a2be9b8cc8f476718ca61a4"): true, - common.HexToHash("0xd95e034bc09528e731eca6b53401eda03a93ca6be76c1d886f7cb3eb74b7dc2f"): true, - common.HexToHash("0x8f3102b6bd3f3503de6bf213e3c2ac7dddda13064aaa4ca2ddd33c895912b411"): true, - common.HexToHash("0x809c248b7e06b20750291ec6848eb2b0bd6813ac44c9fbf129fbfd7ba676eb50"): true, - common.HexToHash("0xeb561531530017cd6ef26ce9d36e78c6483b6f0f5bf386ef04beaa6b45cb54e1"): true, - common.HexToHash("0x65475202c15391bddff3a8415f6cd272d76b793765839db95cbbef641efff756"): true, - common.HexToHash("0x2e29addd2f94cf5b72f773b939742146818f5049c09151b962f58277b0425b07"): true, - common.HexToHash("0x507f797a5a0241aae79efa3c75f66b027f8259c44bb40054f461fe8b35d2aff9"): true, - common.HexToHash("0x88b618eb78cd297dea3d1841a7c54422b6e985a3a3906d5ada83229bc3db1c28"): true, - common.HexToHash("0x07c21ac0ba4dfb48aad9e245d18d2fb8196e8114e5ba820d891048c7d7f5a04d"): true, - common.HexToHash("0xc164edbc9dce3f96ec511d0a0cc3625533941140067d805d1f4dbe9b590ad90e"): true, - common.HexToHash("0x0b01480b483b1f84e72b1aa0e278abc6fa6dfc8515bcf2b82dbbed3432d3b887"): true, - common.HexToHash("0xf04f934fb60aa619f28af790b67edf0c957a17d95a6bd85c2c3cbdecc887af74"): true, - common.HexToHash("0x023477b55f2221e54549676797a52450d28981bdd821e0e9988a90832ffb148f"): true, - common.HexToHash("0x680a8bfee228865c25976c033424cba1ff658159e7e2c3d4ba95d044e40c07d6"): true, - common.HexToHash("0xf8580e0cbf970313c6f878b015a7f68bb3a191ed4679f31c96707a778764b29a"): true, - common.HexToHash("0xc63131ecdb6d20e497c89ad2a8dacd73845718436d5c3e1482432a3601e686db"): true, - common.HexToHash("0xfdfa11a1e35c6d6d851f922a3d471db45bd6b0d300de11d0467843905ce8e6ea"): true, - common.HexToHash("0xe63376237e76e93332a60e913359f87b4980505a8dd8f7eb6e17a7080a22ce51"): true, - common.HexToHash("0xb424ae2ea1752d8dd01bd67d0ab592bc4b357100accd9cc5ea776d778a014801"): true, - common.HexToHash("0x9e01e32ef6d65e18cb67c4e0cdbf006dacf9d8a09bb6f29ee7b0ac42379b6541"): true, - common.HexToHash("0x85a81be0261c8649c8c8c95a93f9750af10de59688f2e92746881449a4476458"): true, - common.HexToHash("0x1b2e51ba61f6963daa8f6676310dc02aadf3bb61a7dfe17dd5a834b184097349"): true, - common.HexToHash("0xc32f81e09adfb6466e67d412f8bc6efde6c3e2934ed219027a4aea6a58d6d3b2"): true, - common.HexToHash("0xbd998f21616aa2292e0755d0e39d460b00353b54e875a35025fd82db2151a2e3"): true, - common.HexToHash("0xd7827725ce17738a9dfa88a70d5b36273a0625cb497e8b9270225d2c0456284c"): true, - common.HexToHash("0x0e956dc9a74b595256220bbca0449887dc9065f097ed365f60e5cf4893ab9374"): true, - common.HexToHash("0x3471b0bf1c6b14741766b8a6b0fc60ade6d8b2d3003284525749f9cda250abce"): true, - common.HexToHash("0x004282d6f25f00033f2574a7a6c9d010ffeeb9b4d2f31468fcf40969bd328501"): true, - common.HexToHash("0x5632b1e8adf1a9425db6d9e2eda0b56b4e882920f1c26a0d2557d6ac911bf3c4"): true, - common.HexToHash("0xadfc3645ed8f97bf72907f3a534be5668e0a71ea22c5b1539230d3817856c878"): true, - common.HexToHash("0x7d1838da0326c08e1c158febcc781634658790ff2f32939b84653eb09c24977b"): true, - common.HexToHash("0x755b17b1a6108106ff84a47055d7932d5aa8646e208b32fd1c9995d2e478a4a4"): true, - common.HexToHash("0x2b1b4b323d88c370f7ef0269851f564d2b5efc8265e0b4ee6719a5f60f6fa549"): true, - common.HexToHash("0xcd26ff3943c0adf6f2c47cb1bb5065bcead643af201275459d49ae47dac9b161"): true, - common.HexToHash("0xc7305d529707cca4870f13e6aa51c2a352ff1625f77825e2a034532776d1aa02"): true, - common.HexToHash("0xd2cdc58715d2e088f14265682dc5db3ba42c34f6f6ed1d75bceeed81f7c735cd"): true, - common.HexToHash("0xdfce24730ce78960c693222e4f4e7a400a901a3cd5533c279a24a33e7feb704e"): true, - common.HexToHash("0xa67020205de4d5c31d0bd5caf6f316572479050f5936804d566d2c345f849d58"): true, - common.HexToHash("0x84f073e589c6a68cd7fd9bc49c1c609a54ecf034eec06fedb74ef192653b50b5"): true, - common.HexToHash("0x35805954189d6dab6a7926f69d2c8a4238f9e34d25a5b7014ede771b088146d0"): true, - common.HexToHash("0x859375ae7d2c64e624e895e8950ed6074a1989b73c0d49ad25276fd26eeeafb6"): true, - common.HexToHash("0x29db63b3cd6881f9c2cf30582d7d7e06be48e071b10a13607abd25316f96b6a3"): true, - common.HexToHash("0x406afcb86da414d56a216344a1809af19b64fe712ea9300b99ba317e5701bf0c"): true, - common.HexToHash("0x77866f561647be2e06dd5a10dabe4871d7e173f880d7e8267a7264c398e99dca"): true, - common.HexToHash("0xc1b79da5e3fbd33cca2dd10e087c2b15989aaa9a0657d143b12141e4e30f0f00"): true, - common.HexToHash("0x3217d05e53712662ef9fcd4adab9d2f7556d63a1b2c303585eebf94187ce27d3"): true, - common.HexToHash("0xb6d69cfae2c524defffa23b2a732f095195a366e3a74b039830582b1ae44a63b"): true, - common.HexToHash("0x1b4a37ceb090099e1830d172eefa55d3b92da5d3a761f3e7b32a814560e59fea"): true, - common.HexToHash("0xda4be59fe85feace1d880b1b8cfaa67416e13eaa6c12d07653bbb9a6cf34b4c0"): true, - common.HexToHash("0x2f648046d56969e02d1af40aec0be0785f4ffd6ad28a3f234e59436dcccc7b36"): true, - common.HexToHash("0x4f5fd5310197c296a4d2394ba852cc3eae288e5e5f382a65db01e5e7aadc6d46"): true, - common.HexToHash("0x6539e25a6a6270437dd5764f42c122575c3c35c2ea89ead2b749933f8fba47f2"): true, - common.HexToHash("0xc8bdf93808fc0abba56e2188b57e80fbce71e5f18b1e051ac70fe43d7769ac6e"): true, - common.HexToHash("0xa02fb0efaf89990aef17671f5afe5e742144789da041321eb7dec16d07b88f57"): true, - common.HexToHash("0x72e6dc054cd1d1a5f5e6dcb5a13a93cdcfc5c536ae8278733d5d515215ae826d"): true, - common.HexToHash("0xd37fcbc456a9806f349562267fc7b42fc1118e4b349b679a77890dfdaa620a8a"): true, - common.HexToHash("0xc7237b98a0e986f0dd90ee4761f6b14d80323015fadc725c3478faa4d4ce2acc"): true, - common.HexToHash("0xb60d605bab398d7f0299d425cd8883a0d0f6ace6881959eca1d08c15b1176cf2"): true, - common.HexToHash("0x05d7a1b8f7e3d48a53a810d9bc1bd1803149bf0bbec3c0dd1f1a7cf54f89b712"): true, - common.HexToHash("0x2f2c3e7dd45a8d78b3cded15dbc369e2ce99244ba2887476524c4b1495b271a1"): true, - common.HexToHash("0xd91510427b33f2e0ddd4b72b9278cd8dabfd8ed29398f745d70d6b2c8abe16b7"): true, - common.HexToHash("0xe573a4f968a2ba23e5dd9b5a40a6fee5f74831f4874a35fb0a0e519f40c64cc7"): true, - common.HexToHash("0xace7fb403b3769a497cc26bf8856b7dcbb7fc757382681458acc386a463047c3"): true, - common.HexToHash("0x9980084decfc8fe450b84fd43c31fbd5a367cb208bb215f66cb15462a877af44"): true, - common.HexToHash("0x473e57e8babbf3bc4ab7f543f16ea34fe69ca75ae267602516ce07cda4d65bea"): true, - common.HexToHash("0xbc013c91e89024e52fe9e9104bb1a31ddf186b8397745745f5ab250d0986a4e7"): true, - common.HexToHash("0x577180d28127d6c8e123cc5829525a70d18afda977ab6181fb1f9178dc57f21b"): true, - common.HexToHash("0x000cf7d6585ad32a8db02ef2869dc67914f745a3061a3c40cac6e604f6eee9dc"): true, - common.HexToHash("0x9c5ac60da61b31bebb5307223006214297fe6ad5a8eb7744e3ee31b5f974aa3b"): true, - common.HexToHash("0xd511db9b964583dec6cc46f8f6166a2764113f008f0d70e67a50427928398c90"): true, - common.HexToHash("0xc06b9f2f7f2298dc878f914a22861346053802979d4f37b20e0f7f8a369ff87a"): true, - common.HexToHash("0xff26dc697b6bf976960cedfe1d013512532a73254a498ada7eda5bb483d874d4"): true, - common.HexToHash("0x96ca1773d3d7ad6a1843a0ff73711b3d78167ead405a3395f20f600e6c1d4533"): true, - common.HexToHash("0x8e9ab710f4e5a22db424fcf59b1a3fcd3a678b739834ee2c9408df638cdedd06"): true, - common.HexToHash("0x29bd4d9fc48a142bb1832cbf0a0fcdf445d0f602e442235fb925159dee92b446"): true, - common.HexToHash("0xd2e687bd670a9c78fc7541bc901c71f8ff9d54c0f79e8adb8adea42d812ea69c"): true, - common.HexToHash("0x7dbf7a8d5352e2ff9230833df214d3e61257b19c9e7402f8e5ae44afbc026daf"): true, - common.HexToHash("0x100d1827eb16346dff4479f04038e04d2ddbeae7c75835e92a522f3b238789be"): true, - common.HexToHash("0x1c99b305447fc4a8e85a10566ad0071b88c6086b1eb45322c2124d2fb690a50b"): true, - common.HexToHash("0xfd4ddd4544af3801ea2739601aadbea08018fecc678c7a704c0316b5b3d60672"): true, - common.HexToHash("0x1e9c72a81952933892b4b3e3ac8f43c4d645e7caf7c31f14815187600d39c9a2"): true, - common.HexToHash("0x35bd95d8a39416bf1e8fb42b9c10e38d38c46c8fadc5075f8d2c6d9c17551078"): true, - common.HexToHash("0xfecc0b072dd4ceb2afb35dec752e4f72445cb0b848038230b4020514b3124259"): true, - common.HexToHash("0x6db747ee8905c9493b983a744f60b5fcaaca16223cf0cfbc07642262fd43a509"): true, - common.HexToHash("0x0eb790b6eb8cc2cf7a25bd04b6d05a0f22c780f5981efb5f077d096ba1d41894"): true, - common.HexToHash("0x03c5284021433b36444a95f4118e0a8d49a898004dd1b41409ec14ea4cb7f89b"): true, - common.HexToHash("0x523b13ef04e2f7889e42b2d3b22bd102404d6dee2f52928158d7990b9d92dda6"): true, - common.HexToHash("0x24b32b14998f2446bcaff305da38f667266a7f30e2ebb4b562bb57f954c20ff0"): true, - common.HexToHash("0xa9bdd3e1d6dc54a3132f35b9ed69d3cbf84895086ef6d6f44867da3bbfd35ff0"): true, - common.HexToHash("0x5010229ec3bd2e4eef8562a75ae0d5673e80e0e80d192f8e7d5d54faa9d6915f"): true, - common.HexToHash("0xa741bfa9b2743242847c53a96a6baa65bc9161ec9da9c4afa3070a07db020941"): true, - common.HexToHash("0xc3b282d6a18d8e9d7ff72abafda4c8d2ba8664e17c322a7efd293d12e2b39b06"): true, - common.HexToHash("0x5234ac098c08c641629ca3edf91d42a8c4ebd60952c25844004599f48476f041"): true, - common.HexToHash("0x5690d6ce3a3e198048638c65719ea3012cb8caa85d3532030228e6ff78abc5ec"): true, - common.HexToHash("0x2f043cac0a6924dc142ef2d9fd7d3cbf6e71f28cf861af67d08aada0335700d4"): true, - common.HexToHash("0x8eb2ed6d0e9991da91d2e3d844602efeeb0c11faabd0a7d20af97a44bc6c6d3a"): true, - common.HexToHash("0xaf6042fc391064bc34e59b352f526ac0db86592893367a823e51f319e2c6d090"): true, - common.HexToHash("0x802ab4c771ee677cdf23fc6544d4239d97eee9fcf8b939c10b20b33b8a78883c"): true, - common.HexToHash("0xa26b67c68c5727f2747995cc4b16055d442a9375d58a4094df9b9b48f8485e80"): true, - common.HexToHash("0x09f6d6280372bdd8796c135dd5d74fd3002cdfb56da8ed4bbc70e911b8130186"): true, - common.HexToHash("0x4a288470b30ba9e851d9d9ae347eaff996eee7209f3e6db6b042be501c3af5bf"): true, - common.HexToHash("0x8ef8e709b18a84b550da15423a78dc43eb4f5a12c2722b61f5f38ed1c7b0a3e2"): true, - common.HexToHash("0xea399e9981698d1c76738ed4fb74e16f022908719a55d89bd50a4bc0cb4c08b8"): true, - common.HexToHash("0xb05e6e0f900bebfc4c292ca13b12b4840cd2a54008a2e569650a667571623d81"): true, - common.HexToHash("0x26dc7cb035cf36a5a5f6edfe91a26706b15d794f646a5e5abe9c2b7761b6b620"): true, - common.HexToHash("0x652cac6900f2a4855131c4ad6d93355bed8f08745c7401ce9536c7a616a17d2d"): true, - common.HexToHash("0x2edf511075bd8152ecec09612927d90e5e8f88b9794f279dcc0ec5e492d73abd"): true, - common.HexToHash("0x05217168554130bfafd3ca86e8d22450bf7b769d59c2f17effaaf29b00826d0a"): true, - common.HexToHash("0x627097a07f5cfdaa9062d211d9a095648eb583c79cf8f707575a9c7315559d8f"): true, - common.HexToHash("0xe153c3851a435f405fe43ae255a7e9ebd4c25503c0c9f65b45019c2be24bc624"): true, - common.HexToHash("0x7e9dec971726b5c00d6a1b7bd122dd61c473fcc0f9b132e84833afb97655f7ea"): true, - common.HexToHash("0xbb1425b1b1697b248cb32cee757108a43261e4d06d5ac81b0e1e4f445947f314"): true, - common.HexToHash("0xf93323c2db911337465226088ae52e74bd1c2b90bccb27466f29f96fe99f445a"): true, - common.HexToHash("0xdc6c51e3923b385176e255a88e2eb3c0b95b2ecc59224a99e67cd055d6861122"): true, - common.HexToHash("0x056e84811a377be51fbea98faf3938ab74f3deb6e4ddaa01344dbb90fe632fde"): true, - common.HexToHash("0xa90587720a9f44923e4aa24bd0b29086e9ba0ba58aea1bb060feb0322bb87b08"): true, - common.HexToHash("0xd6ff15c842bde6e21505276edd9b9c2e66b63a6d26ae267ced1a07a6148a7c33"): true, - common.HexToHash("0xaaeb275147e64f8a4963f41f6223bad488ef89e8895fd82471ad54a9ed5088d8"): true, - common.HexToHash("0xac0ada9250bec445cfe082cc6bc0159f4572f5b4d388a508e1dda9d175151d5c"): true, - common.HexToHash("0x8d4767bb154199a6dfc610a558f86a3a5d82fa11caeac9903b445d87e9a94558"): true, - common.HexToHash("0x2e40322fd5d17ab15b53e7ca9f7ca3fb2640213a99bde680ae9fd5e7c8490e22"): true, - common.HexToHash("0xda4b0eb3e9571970477fc98620549cafde1fd9e3c8b01420702b279ec2c4f3d7"): true, - common.HexToHash("0x09b425a912d5f1273ce6aef4c0161b11eb17c524a290e9196fc6dc00723b3a6b"): true, - common.HexToHash("0x603c96761d16c1b2dd8dc5d7c3caa103c8ff07cd692e2df95f5be9cabc7e3b61"): true, - common.HexToHash("0x989633f533f764f772f6f49c29487a542ee7a84240b6099c1768d30c5565946c"): true, - common.HexToHash("0x1dd62903786360a68b5868f187fa2f48780c94ed00d9e80989bdacbc8a55291f"): true, - common.HexToHash("0xcef8ec18539b3d9c5b9db925f54d06e01d99e3d139c0615bade3db7eada86976"): true, - common.HexToHash("0xb385beb2c5882094efad817bfdb291af378a16366a249b2ffb17ee2c82f8224c"): true, - common.HexToHash("0x000cc1623e8a91f5925c5f0cd1525e75dd803a749760574e843db11d97d566d1"): true, - common.HexToHash("0x9ea89f98029e5913c7a947d29509ff20c915636b0e6f260df4ba32f213604f81"): true, - common.HexToHash("0xaf9bcb77c196cd477b7587868cce1b880e9ec2500df39ed583a992dc28bab29d"): true, - common.HexToHash("0xd2cf6b8d7dd91a12a34a7e604e1e0ce189ae144e7324750e6c4f12c23944dfe8"): true, - common.HexToHash("0x1916a21ec56640121c665acac138b0e44c4fdb60f022e005fe74ae1ec23d2639"): true, - common.HexToHash("0x087e85bb9d85f05e5c657f71f99e75c4c1f544ab8f3f6d40015dea8c8f3bffb8"): true, - common.HexToHash("0x45115a131ded66db3b665315d11f5f092df958676a903a263113be189ac5693c"): true, - common.HexToHash("0x83605785e2bef6ff716d09ac77b6fa02aefa336ec1e025ef6845684cd6f36091"): true, - common.HexToHash("0x175ee005165152af2e7e4cc4c8e1f41ed74d960416c4467e8646d11c0a914d8e"): true, - common.HexToHash("0xdaea97bc42fb2d8f6b232eed49cf75ed903f0ff34f9a09327cb3e76d84eca212"): true, - common.HexToHash("0x3bfe9bb22272752470f6a5b05c993a608c0f38bc335e7ee89a638d11ef976c2a"): true, - common.HexToHash("0xd254ab28f38431cec740105678310ad75f31193d18e79b699f8c68ab187254b3"): true, - common.HexToHash("0x1e477894f56bcc6a7ae12b097f0e0d470d237af87bcbb742a8ce40d0e7c510a9"): true, - common.HexToHash("0x3006d54eec05354125d06c4c102386ec330ef88cbd38183010e75f30a02659c5"): true, - common.HexToHash("0x531cb33b4592c8f4a752943b527070139f4b3c753f32a523fba12ee11b11bcde"): true, - common.HexToHash("0x08fd42c3160e5fabf1ec6c6162cbcdcbda193527f3e91a0fd01bf93e188cde9d"): true, - common.HexToHash("0xd235f09c355b979beb85b392d8a37fb745f7f8d68270c9ed40dfe516410a9131"): true, - common.HexToHash("0xaf102a4204a6f556c0bf2b940f245c26b27a71ebd00eec7bf2ddbba2dc730442"): true, - common.HexToHash("0x015d1eedc6bbaee82bd9715ae96d00ec1f71efaa45ba74c4c55f1d99715539d2"): true, - common.HexToHash("0xec5df676f2054d8532dca88cd3a4af7b553c23c6704cc2f93bc289cdf54ebbc5"): true, - common.HexToHash("0x2645e43ff48f3efea2fb7d3aef159798d56b243639ee99ff53fad0da44865def"): true, - common.HexToHash("0x354a493b8a4c9fed18f2c99ee836ba881eb327d16d07b28dc24adca4d364e366"): true, - common.HexToHash("0xc4464d30a3705110435b3fad73c9abb4233cf34f240d5022719e0d5b818cdd24"): true, - common.HexToHash("0xca9f1235614e37a14fe168cbf6dfc4fc24740a4b45f164c342600b51c126f1e3"): true, - common.HexToHash("0xf3f6038882906fa48af23b28b8b150f51d2443ff338fabe99304d5e6b9aa0b5b"): true, - common.HexToHash("0xd35b9a534b221e7f066448b2712cd8bc448b55f33528c150ea1eec9ed89c8fcc"): true, - common.HexToHash("0x16f4b59f995541ad3d21cabd9f2a8bbcf95a2963df5838e0b58c3b7b013645ed"): true, - common.HexToHash("0xa80114500a7718b29a4bdc7281a90f5a5189442daaba0bb657e773293c47ee63"): true, - common.HexToHash("0x3fbaadabccf2c86537b57dc7b0247b8790778d9342147ac9c1537360d4c6244f"): true, - common.HexToHash("0x059496d56846ff6e84d1277431992d97f9a2aaf8088064005275a198fc90b12d"): true, - common.HexToHash("0xc8f63b292108bf195eeec139c9bb88f7237db73e8b16a5d0618b0a18657bbdab"): true, - common.HexToHash("0xb995a615cfa39d423f0fc218a90da045dbbceebe8ac0deb0ebe59f409d9870f5"): true, - common.HexToHash("0x3de63ce158811de64850d2b92f02637fa17962a9d0d43d3b210a645d15736b2f"): true, - common.HexToHash("0x156fa1784d955d2e1e2214f3d4deef8ff17e6ab4792cc9593813fd1abcffbcb3"): true, - common.HexToHash("0xa6838b9f4115fd6d64024f6ecde2ae20bbbe6ce18b6bde54d7598dfd7b10b4d7"): true, - common.HexToHash("0x045c2a96c3dce12447f17562d0a5fe38b336a19109d83d6dc2af2d63c8c29803"): true, - common.HexToHash("0x5f9c50ca28a4c1d9bc1236c4b94675ad11b1469415c575b4b17527e7ff8a7684"): true, - common.HexToHash("0xd088ba1921b16a45224552973f9fb455e7f66e838b50261c8aa051db5f40359d"): true, - common.HexToHash("0x68cdeee78557d68a5567625e92939d6adfe43d3cb70245fb680561a18b5d0b08"): true, - common.HexToHash("0x4d1d6162a08a50b61bfc826d6ddeb530382c56435a237e4a2025acf43869e286"): true, - common.HexToHash("0x8647f190987b2ff97980dd90452dc8174d666d635756fd41abf1d1aec639bb2d"): true, - common.HexToHash("0x92ee69c01906454b00c40309a6b094197e7e759aec3628c51eca810901ea7256"): true, - common.HexToHash("0x20506e7e8ede9ac89d847ad3935abf1f5bf2a21f792e34a14f96ee24bc0cf731"): true, - common.HexToHash("0x3df8fe2a4300872cb811b798012c4a2ca61e7f77c5f13bd8333244e8cd0f6eff"): true, - common.HexToHash("0x2d84d2550cdcb8042cfe69ce27167543269ce65f1d56f0cb71d36d23341eb3d2"): true, - common.HexToHash("0x44f17dd10c610a7cda82110ce3cb255514c87de8c29f13396c50cdeeea99f431"): true, - common.HexToHash("0x15613cfbbbe4efdf9f0ce61a67f81142461dc63055e4fd4ebe587497c2cced00"): true, - common.HexToHash("0x35734a33443d44c3203ab39d5ced86c6ce513e71e8a7c493a6b928e1d122b184"): true, - common.HexToHash("0x37005438ef2f3d088521dce78636468c3970e31ec07cb738efbde0e91305c048"): true, - common.HexToHash("0x4ac6e6752fc9fe5b22146eb3396bb2aa288a509e709f2cdfa5bd7c9968ae9aee"): true, - common.HexToHash("0x0f6c95e26c77a876c52cc5260807623d8bbc1f686c74fce73f1154e1a14a959a"): true, - common.HexToHash("0xd3bf6a3d5848180caaa9ee4ed9a93f8b00bf40e2401be80137f3c7e916218243"): true, - common.HexToHash("0x9c3ae06776a232e3fabf6069a66c0907b1c7627a4bbc5ee6a23074c3a842c6b7"): true, - common.HexToHash("0x96015b113da43173066bd5e742d1a27dd1e24aef33eacac165b0c96d6086f4f2"): true, - common.HexToHash("0x5f3dac93a1aba8d961b3d01a7ac5b13fee1b8044b05a9a61dc5631d648aa02b8"): true, - common.HexToHash("0x9c483129e965b084593b48436c89d2318abe7b718e9e6842c831b3426521f9c4"): true, - common.HexToHash("0xaaf725ef83335d7a72d9337c92119fca83cf3654c01f58c85a07dff30d66f7fc"): true, - common.HexToHash("0xe00c5758f221de0c9beadafe7abb74ae8e8f55a166506ef468bbc668449fbdcf"): true, - common.HexToHash("0x32088e03218ff68c99ba9f731f889aadc044a17b930136b4110c3f1a49d78ade"): true, - common.HexToHash("0xc427f2a980029b951a967ad0a5b3d1372b7f01bf18e34e659469dab58e4ce069"): true, - common.HexToHash("0x8963d73988720fc60aea6b1b296076643016ff20f61df4cf0324a14bd48b1cbc"): true, - common.HexToHash("0xb18ab77d59e7c5bc2d46f4331b9e95a5b940b0a4a0fe32b50846e7d502d0986b"): true, - common.HexToHash("0x2ac0a7c76bfd4c900180ae116930879ce2ba3f9817a72371aa01618e389f7a1e"): true, - common.HexToHash("0x4e2ca069439cd565b37e8fb58fd6af516eb50d7ae540e047c6588422d98cef1f"): true, - common.HexToHash("0xf5d77a4fc418ab249a4cd61183e14c08e2425fa9adabe6a87439b53972a2908d"): true, - common.HexToHash("0x5e63044dd430018524ce2ca0208815294bc3cff0d12088b6acd9ece4725e2ee9"): true, - common.HexToHash("0x1135415e815d3dec34022883d6f8e7f836d9e77945121432fd4e67cca82e7ca8"): true, - common.HexToHash("0x382901b061cd662e240faddcfb4abbff19b6f54819adfc9344d9aca758cfa7b9"): true, - common.HexToHash("0x3404b3d2c98b4ed69f2b98b3d73c8e9765b323068ce355c0aa73adb975c1c49b"): true, - common.HexToHash("0x678be222c165e2b672e91000c4cc50cac1c555a14aaada630b9134e64a7a768d"): true, - common.HexToHash("0x198a6c7e09aa03f498f68b5750e1e8dcf6565f640b2bfeed91424857a70ab805"): true, - common.HexToHash("0x1b18c2abd53dfbdea6696513363ce26adda3c06cf7f0a27870933ea8b0e7fb78"): true, - common.HexToHash("0xab182cbd7db8d3496a75ad91d7b025253f48941b54e31097ab0af5b8e65915fa"): true, - common.HexToHash("0x96a2a20ac2eef3b135d9ab90086ce017956cc00413c567dd46a68ad363470132"): true, - common.HexToHash("0xa899686dd158f4950ece28ac7ac405d6399c1e8cda3d5572d52767ef133853ed"): true, - common.HexToHash("0x994e8c716a041bfc88bb71c92b16acd1ddf3ec5683f0db614313f5a93068e6da"): true, - common.HexToHash("0x3a0a93e9ed3b128911d28f20fecd372c733d9e0ee1547b3c5d3b3ca1a797bafe"): true, - common.HexToHash("0xf709f0d297d1cff10c47b3a3c9a298ac14c12b8ca47de736845e524a93c9e318"): true, - common.HexToHash("0x2b168c2e7a7eaf03fab8c4d689c0d18ccd617b3cca8689e4533826cc1e1d5ba4"): true, - common.HexToHash("0xe8b43d98733b7faac6e52651ca0d9eb0e663705640d513c59cbdd77cd5abd417"): true, - common.HexToHash("0x0889553a67016ba2463783e13577e440f3e33be65f6dd4ed5379a46e517be7c6"): true, - common.HexToHash("0x78e370c4e49f28c4da626ef03ed561f3fa677ad9392b24226a1795b73dfd45c9"): true, - common.HexToHash("0xca8740225db897dd06d4e2c95b5c2fc7c332052df44d5371035d548764b02aac"): true, - common.HexToHash("0x9a0cf515316dc9b6f41afc971e49b5aa45054c9f23abb7f7a4f0e6e8b57c28d1"): true, - common.HexToHash("0x66582f180039151029030e85088d31c5efa2bde1688834083daca97b38bb3665"): true, - common.HexToHash("0x18482d5486e56a0079699e38eeba2c2919bf6ed0e4b22776b26f621b403ebace"): true, - common.HexToHash("0x090cc58ba9e86353fa378383d4658dbb9dc661100acd5ad7579bc24fb4626c33"): true, - common.HexToHash("0x182136ec59f8a6a325fc87cb53e1f9abfc2de407e69d7054cf0bc4ba6747a67b"): true, - common.HexToHash("0x5faf4ddc240f3413c05abb361647d9ffc1f53bdd777f550b7caf6dc3a9e17852"): true, - common.HexToHash("0x5d9fe438d967ff6794d31d3ace55a22aec548cdc4fe1d1840e30412b0012d970"): true, - common.HexToHash("0xdec1888f593af9799c2848f9e8e0b32fb5adfc9e65b4e8f0a76c027864d512b1"): true, - common.HexToHash("0xc3578b2adba479fa38d3dbbb547f84081816a95a96882061e4c882906ab6b228"): true, - common.HexToHash("0x9e3b65710f178dbdb1a12c65a40e8df3a4579917526cefe6910e67f946a18417"): true, - common.HexToHash("0xefdc6f4192273e3d784965fc4a3881bdac2885049252451868376b27ea503b9a"): true, - common.HexToHash("0x99888f37d21feee8dec61a5954873fece1f59824eb2e07cc01f1b55ffcf0cad6"): true, - common.HexToHash("0x227f7d7208c3a3f48ff24a2da46ae321c68b67879aa23ea14ac5fe1df767e5a3"): true, - common.HexToHash("0x57d7d568e2b47e9fcfa1a16c02dd644168d5ca01e04e935d0037c873071ba08f"): true, - common.HexToHash("0x03fc9c7923ecba72877828b8d65da5a4758725f3c17cb819c9b009ce11a6884e"): true, - common.HexToHash("0x2e7fdd85c41d99e7702f675c769c0656864ae2003a3dc561ec1dfaa9f3448cb8"): true, - common.HexToHash("0x8432034e8dcbb8fee446eb865253b97d2e201191a2283a0bb29cae85ad127ee3"): true, - common.HexToHash("0xbd12802983d465293a28b2484f8fd17f516e3258ad7acd4c2e58109870419781"): true, - common.HexToHash("0xe71818c1737d53c0ff762461a0d4a11fbbdbbd681e11ec36473e05cb8e22faa3"): true, - common.HexToHash("0x0fddb9c73c21b1ed0f3f54b4fc2a0c6cd4c2704285824556cc4615fa75ad18a5"): true, - common.HexToHash("0xf501117b6e660da6b7813903dd2c3e64b73e80bcbeb6561df9cff1a96562fcba"): true, - common.HexToHash("0xde32477eebff0aa143140ad3078bba4bf0475aec3f1338b6b048a0c9690239c2"): true, - common.HexToHash("0x697943fb3b0d485450f2f005e5cce1df3fe95522bacc9de41fb5a1474411861c"): true, - common.HexToHash("0x622d03bbb11559fc1cb4ff96ba8e044832949b4641c2062df72c1d6354f869e1"): true, - common.HexToHash("0xdc302ebaeed46aee16674b717c6d8316df47840d6e5c9eadeb0427b83ca053cc"): true, - common.HexToHash("0x8c51db96b29fc68ba6d203a01bcb3f3c6285797fb08dd10262919437116ea5c9"): true, - common.HexToHash("0xda219d8139b7c4faf4ce29dbd398abc1b5015d86f3f8194c4f635ce232c2625a"): true, - common.HexToHash("0x6108d2f822cab1f0a39425322b646dd05c46d0d1b9f2ffb4b766945209b0d15b"): true, - common.HexToHash("0x53cc637748834d2dfabac8f6fca982b612a9a7d4501110d02527b7aceadd1446"): true, - common.HexToHash("0xf2384bbc9e2043432cc9756453f4b4f2d53b7bcb458228391d1fcb28f4867566"): true, - common.HexToHash("0x92c5b28e878ac275b35ce41d77412e117ec38004939296ff5b0e285a91fe2d5a"): true, - common.HexToHash("0x26f94640f7cda7ee88fb1925652452f54b54e3ed430c4894f288f8663cb399c1"): true, - common.HexToHash("0x9bca36b48973e747cd4fabf60020bfc032be9f3eae68d19cdb112febff7c78b9"): true, - common.HexToHash("0xa442f6b24dda5e7b0583e9ad8d9efd4826171a4522bfd471a68e2e72081b3092"): true, - common.HexToHash("0x2533c6fa107a41596452f64094b6d795181856d2b68928c712cf3b4390477fef"): true, - common.HexToHash("0xd0a3f18c1d9940fc0b728521b3d22dd33ead99845471723120171a95c3b325a5"): true, - common.HexToHash("0xac83bf70881a062c7a83ad500a37e28f73739c043d55d31b0668e452a8bd5f62"): true, - common.HexToHash("0x34825ad0e03070a6f7023c5ef71a86b1fd53d9f2febb9fb5ce31deae58da5765"): true, - common.HexToHash("0x05763eb0f902226e9c9155b8c9a09d14a71b270e068b942241d2272c6272a429"): true, - common.HexToHash("0x0fe2060a70a05e6e22d6bdd02fbc7ce5a8cfb37f4e43a4e54bd8f0a93ea979d9"): true, - common.HexToHash("0x90be79f1d4184559173e002b348bdcb0ed2bd9a3034ce675fb683d8941a898ac"): true, - common.HexToHash("0xfdb74ef62d717b4cab72be4202bffbb4bcfd90c53f30b317626d6a61dd104530"): true, - common.HexToHash("0x3677657b4effb5f4908269d6dced31a08817bb48725e3212f04d3223e480b39e"): true, - common.HexToHash("0x0e9600816bd16599ae9dfcf75329057f0d9a06f72f152bdf3185d82d49a4647d"): true, - common.HexToHash("0x3878f9399561e39dc27decbd50fcfbff9ea08f4eb512025604b8c006b9afbade"): true, - common.HexToHash("0x3bbb3562c32954e5ff952e0749c202aaa581b8d1f21c532e654ff73f91b49088"): true, - common.HexToHash("0xd09b28727f40a6421ecc0a798cf3d54379220768e5d242961288b220619e2e60"): true, - common.HexToHash("0xcc6387c279f055c331cf3aaa0483a6090669e3270d0985d2ff9dcf2035f25d41"): true, - common.HexToHash("0x0ef272d6cd98e2bbf4e6a5a3270568ca880f4c33b8055bfc828441dfe71b16b5"): true, - common.HexToHash("0x653c2ad2ba7b3c58770e8a5a37847d7794698de031541218b2c9151bcda35e98"): true, - common.HexToHash("0x9903d9d3f91c2adaf703264fe7caeaffc2394660a5eaf597599a41ad76bca37a"): true, - common.HexToHash("0x92a9b61b773c71f0d634cc141eaf0a757be7fb4e749ec91a7b1b062cb2e695b1"): true, - common.HexToHash("0x2f211613a523a7282a04195ebb3a3b57b29fda8d8562e48bb7e912bc309226b3"): true, - common.HexToHash("0x9f1d669fe741240a58bbe6229d0aef46c62e8a57acbefd009ed70067681829c5"): true, - common.HexToHash("0x1fce2b7b376d61ca2e7b20472d07048211ace43b82b232e58d34f1e530d4911c"): true, - common.HexToHash("0xb37b2b1c5b0f5257813e0c1ca9783284ca186689e6ae27b7d5b9e111d05c8bfe"): true, - common.HexToHash("0xa12ba898662ded14f5693897f485ab03c96443a1b0d2da9f5de061e1c2e5124f"): true, - common.HexToHash("0x104bf97f79f6ecef64deb9b81db4456ba73f2f828656df95a6eba09b90ae0a45"): true, - common.HexToHash("0x43c8e876b9b1919ae8bb8e897d60fc202d127cb953a3a055e80e9ef396472a40"): true, - common.HexToHash("0x9892ccf455f7ac167d3eee8aa34de3b91641899992a0157e369217f90d691861"): true, - common.HexToHash("0x76ecb5c98ca2d03335e3fca7ba4671fd0b8a15093356cdb4e45ca16f2bff95c0"): true, - common.HexToHash("0xfc4c3f4e5ecb9be463c01dbc1752ffedc3a356159a624590e8156472fd9615aa"): true, - common.HexToHash("0x273ada0a6045a2c3eb33cf7c6a27532f2dbaea1dbc146c359d58dba7c5029f07"): true, - common.HexToHash("0x36387e01aed171853f6cd93b7849083e89c0cbfc016872432aff05f0dcbd3483"): true, - common.HexToHash("0x650443706212d93cb0e5d33b4dcc1c98fe10ec530a0dce13bf215e5bb9c0c506"): true, - common.HexToHash("0x544b184b4b4ea1dd2a31dec5a786ea3afe0dafde07cb2b06ccb7e182b18bbe99"): true, - common.HexToHash("0x0651a42a30ecbd52aed6813e5a7dd5825f5e23ca7c2b4be705c7ed17229343ac"): true, - common.HexToHash("0x5768b4b5c6e27ec04836ae7914f3827ad788dc0276eb2c33875335e8dd51cf7d"): true, - common.HexToHash("0x995ffb16ea75519f88da1fb0bc5d83d369c14c82f5187bf4800f8373b5770c30"): true, - common.HexToHash("0xef42ccffb402b4b6bd3bacbcc8a5fe9488aa2181c9cef3e29e0cb0476d50068e"): true, - common.HexToHash("0xbf9eac593140f0d9f2d99380ea3f03e62d61a5791f0d826e2c43c7249d7ebab2"): true, - common.HexToHash("0xdd5eef457c02d8365024c4ec48d90b36d729abc591229d0538cda7946f7da181"): true, - common.HexToHash("0xded053c002f3a12f01397b389177aa318f3e489fea3f138fce58e18c22646bdd"): true, - common.HexToHash("0xa7aac1fffb6a123cf46d95306efd430e539e4e8653e7f9b625a4ded50a1ceee8"): true, - common.HexToHash("0xe12760aa460ead6a42dd622a7996900249bd893785648e536a332a33a48f1703"): true, - common.HexToHash("0x52e32cabc5cee2660871c73e767c549781908ccbf52fa20a0a4bbe2efc97eead"): true, - common.HexToHash("0x6992145b5337b00e28974974bbe3687690eca5a4d17c66b334938b5ddc47f1c2"): true, - common.HexToHash("0xc6a15c04f6d01c00e14a8f3e6ec62853c19b57900de23c332105afb6a227fbc9"): true, - common.HexToHash("0x1df3b9581fb521aa84a1007b4a0c29821af0d82ccd6eee633b027241680bbc8e"): true, - common.HexToHash("0x2f37d13c81a49e9cfa751f149eac6f82e8651ade86ef4b1d8e87e2a62fb5291b"): true, - common.HexToHash("0x43ad4aaaf5e176d488ded0915c03460788b558010f0fd6e83219c1860b5c9e60"): true, - common.HexToHash("0x1340f2480f4038c63b10d1543980d4d950a5ffb499ec603d9c020ce02a812d6f"): true, - common.HexToHash("0xa6108530395e61c8a4d30a172292fc516f5251eedca91e9f4bc3c89e0e5b8c64"): true, - common.HexToHash("0xc0f402f2d0ab531b4160cf28722e45ecfa4a8ceb627701d6ed540234f00e42b6"): true, - common.HexToHash("0x879bfa30c0a40df0d7cc77952a920f3512d0ca51d0f17fe2e06eb622a78b6c8d"): true, - common.HexToHash("0x644cb542c4cb5800142007e8711a5ae89a6defd0f849b4ef261329065e485007"): true, - common.HexToHash("0xd06fa776b618d7b15f410b307122797dc44abd3b9a65f5997cb2825e09945547"): true, - common.HexToHash("0x245031efacda95254f74dfec15d150218e5e7b38148d0660e26dc6ca87bf6bd5"): true, - common.HexToHash("0xd72e0404ff965e63e1fecd3d974759c520aff4e3f27d64426167afa74d11b1c9"): true, - common.HexToHash("0x77ca60130ec9418a3881d16bf2b2b89de7216c4ea60787206f848b66a08a89ff"): true, - common.HexToHash("0xcfdc57320cfd8addef7d9124d59197be31a993c09ace8214067d2ec7d376d0fb"): true, - common.HexToHash("0xba072a8056346e2d7f8b5a3910267c0bcd4b39497f9b44c7db025285dbdeb510"): true, - common.HexToHash("0x889a74160f49e2720e96c4283a201483e54c0ab368c6da4238c027ae375e4421"): true, - common.HexToHash("0x1bc9c65af348a42f60c42a39b9251c0d75b3aae0efe3af3541da92e74a5f0713"): true, - common.HexToHash("0x72e49b3e9933f1e57454cb4cff75c37949145d9bfd14449b4a44fd5d215a7710"): true, - common.HexToHash("0xc012da74aef8d97e40a763f3a678412cced4527e6c8e9c992f88abce3e91eff0"): true, - common.HexToHash("0x198f002813f33ce8f9a236ea0eee6ce53be799ef44d4218e95d617ab4e676b0d"): true, - common.HexToHash("0xdcc6f24c756ae0e4473b01017d4dd38d5f99367921877f45d33fe0c17252bf42"): true, - common.HexToHash("0xdfddc60337796a867c15a3a9518915c5259305fa477a2499b3884eedab413450"): true, - common.HexToHash("0x3cbad129ab09dabca715f4d5802896e17adbfa46681d34b6f90913cf814254ee"): true, - common.HexToHash("0x44e3e3ee9386305f5669177df7d49f276aecea939253026fb803cb144da47582"): true, - common.HexToHash("0x1e414c2a1087f936a22c68cbce38fefdbfbd74e39cfb72624f0913ac0c5b37ef"): true, - common.HexToHash("0xafcce68f5cccc97e9fac886fba10a165411f02a0f16ce2909951c9394f46c1a9"): true, - common.HexToHash("0x0f2b42e92af0ae4b5a6a6f7d2f09ea7210ba334b11fcafcc1ea52c32766e9d22"): true, - common.HexToHash("0xc5f1249b4148961b7c5c8268ef30e2eb96ee0ef586857783bb779d635cbefee2"): true, - common.HexToHash("0x8804afa76ca66972d80cf1a7e87a81df61250e21a62e9d7b9bf37f258020cd39"): true, - common.HexToHash("0x4798b35521947383e56d01503e309771a199bc5b052d0a5d9ce691d46d292ab4"): true, - common.HexToHash("0xf2d6ccaf5de3170375a2203fd4b23bca066e80137e292019a9f44b7cb8fe23fc"): true, - common.HexToHash("0x09006ed5321e245f2e9135b334abe7270831bc98047e2ce2b82745f315545762"): true, - common.HexToHash("0x16f9518b1adbc885fdfcf20d5754961eac39c66044fdc7f0623fce16bbb08366"): true, - common.HexToHash("0x5f453ab8750c76648ce56b7d7d2ab3ead821bca846b0a6b94fa07876a6f40b01"): true, - common.HexToHash("0xaaf8a9321a510bd0fe0ea78c016337ed70db5866f346dcd8dd0da9d87a32aa26"): true, - common.HexToHash("0x23e4de8f375b67ec3d1a028770f375c9c5ab7ec7c196a907e20ca6adae5b23dd"): true, - common.HexToHash("0xaf6af5b95ec795c30da5c004ffe4cd29944e043054ae314323e52dc147639749"): true, - common.HexToHash("0x6602fb639b34b4badd2b45263cabb1350a936a339e4fd3ddbff5e526154bfa95"): true, - common.HexToHash("0xbf2ba9e42e69e46881f02b5c337901b568f1c46d98e21cdc040dd4e948927ef0"): true, - common.HexToHash("0xcb49f97f4cc53bb86819f2b535a17f63d1d539bb7b33e9a2d13dadfc74b186c2"): true, - common.HexToHash("0xc0da6d6f96e70e01f5c4d4ce4773a3dcbdae6489be5e2ed09ca5a0b7de5c8273"): true, - common.HexToHash("0x4cbd9cb60df8e8eff71a6302587f47f613fe7f71999c2ab156cf6b0e1e74466a"): true, - common.HexToHash("0x7cfb24456747dc3f1652894f1564093fe03ad3f8f58174ff0f86c08645ee8985"): true, - common.HexToHash("0xfc2be95cd9bef61b212b526388e750fdf1d020bd50cc60391520f26c8f21e841"): true, - common.HexToHash("0xa6d8260d3899af937c7c0ec479353cbae0b32bdabe7b62391610982e56a423f9"): true, - common.HexToHash("0x4d0492e552938615b0bf77fe6c6c8e3f23e0e40218234909213d2d1add62d251"): true, - common.HexToHash("0xbc1a053aded0b8c44f38f06a6fec6f80ebf6e459a62c4b39058c6015782591dd"): true, - common.HexToHash("0xabf54dd40202dc750f1eb1145e0de92be8e528333554b299f9423960b6dbc9c6"): true, - common.HexToHash("0x2d44e824c0bd85827a60c5b8b6c08a412e58d97305540bec135662d9b86c8e63"): true, - common.HexToHash("0xc00b882bd29518d2baadf07869c100db7e57aaf54f3053130154278d8c2bd202"): true, - common.HexToHash("0xa62d8a4e9386e2097a4467b351d07936017dbc8679c58acaead886e552a23ea8"): true, - common.HexToHash("0xdedd0445bddce4acc944c16522eca13af4c800a9bb70cbb7722a8c0d0d9b0172"): true, - common.HexToHash("0x5a62a727605f49e3cc685dccbfa99751d87bd164e36c29738881e52c3fea2e01"): true, - common.HexToHash("0xa7a9dbaa4efbc94acd34386451c8862af0a4b1c18e768372710ec2b95017f2a3"): true, - common.HexToHash("0x8c39a2d3314251edc71b18a731637b888d94b051d18a28b427efdc57e3ab2041"): true, - common.HexToHash("0xf28567ea001aa8a9da1410d2f71bca19d178b91f1cbe68363ef2c17c8ba753d7"): true, - common.HexToHash("0x5629ad57a56683b17018f5fe823d32f821ea96a055e0aaec867835cd54c1069f"): true, - common.HexToHash("0x92eca5346699397a3bb5cd4dafb6652f6d3bb1e1d8069b508394771df2b64bb7"): true, - common.HexToHash("0xd1e4c72facbf18dc7cd209133cbb56b4d35e8e1b202058ef8d48005b502137da"): true, - common.HexToHash("0x539f8a72947296d69c394c677284fd283646401c343eda3772b2813f4baf6083"): true, - common.HexToHash("0x2841509985f03d3d1a60d66aeaa26f3139b3cc7e0ce4dfe6a4ed5f1f1882d9ad"): true, - common.HexToHash("0x4b1ba07f38f926b3ce86e557e825d95bbcaa0725a9eb5be5fee0759e057d72b7"): true, - common.HexToHash("0xd872bd7b1d6e0741009b35680325762368c843f4c19699eaca9393b2a45f7b89"): true, - common.HexToHash("0x75ae0fb4be4b4149b531b2ac50ce3b6d381f06a6f53f1a27dc1dbe42cce79ed5"): true, - common.HexToHash("0x750303e591f76029006c3a658ba8690e0da80327bcd593f87b3c5690669bcd91"): true, - common.HexToHash("0x9dae87cb452e95d22d128e1af9d9bdae608c31201b7fcdecd9a2a47ac86b85ec"): true, - common.HexToHash("0xca3f7429508c123c4a105c148b64f51890debe671ba4c082c5b47a6883695d5f"): true, - common.HexToHash("0x26920a7ded8c05b3cef00501a4bd98f29a3109c295013caec11da04f8018ecdf"): true, - common.HexToHash("0xbdf56b4147bc6555a1c28199405c03e7d7a61a877efb9d72748c488063dfacba"): true, - common.HexToHash("0x9652eeb06d1a45d6805b8b37b58a80f82b3a760d7efa064f7747dcb024d20a38"): true, - common.HexToHash("0xafe42edcfad11a80d3fccdb1e839ec68a2d2c50c8ce6c5d76b1aa48605fdc000"): true, - common.HexToHash("0x76b69878b4dc0c6e115fc93527a457516c88d9a0e2949d7daa014686a68211ce"): true, - common.HexToHash("0xc21cb6aff45ef4fb7a731f77dcae72c466113669a8ce09863a6709376566c916"): true, - common.HexToHash("0x0fde3383c61f1c0345a48f70ed35dab9426b66fdd440635130ac82eec07fbf67"): true, - common.HexToHash("0x3fec6708d980636ff573f3e2320ba7f3006ce086a4c1d2ef9678caa91f7add3a"): true, - common.HexToHash("0x4fa06a131ef28331a3907e1212eb0cd64f0f5f75870b694b6ccfc783ad5951b0"): true, - common.HexToHash("0x972d075e0c3e9507b97395bd60b1da569655f454941d8ab5864ac98f3bbcbe9a"): true, - common.HexToHash("0x68827877a2dfc9b43d7c41c9d9c0b8c336e00ecd8056d61cf115f71539c687f2"): true, - common.HexToHash("0xb8d47bfd48b22f39cd05b2f8393039d3f533dc74a4a5eae63206535d3c4a12bb"): true, - common.HexToHash("0x67efb964c0127ad896f3348b4991dd21fafd07ee82026b7adf1c8be432ed94e2"): true, - common.HexToHash("0xbd2ec1981c13ec90632f6aab8e9c7b72d02b3ba5e14c11e8df4506cbab83eba7"): true, - common.HexToHash("0xa034695917a0d51a8aa275ec34e22aa57fb98f4c3a1e9169d96304e7167fc11b"): true, - common.HexToHash("0xc8da01841612357eae941afe2daee2b1da9b3cd134317047b8317aab253a1ee5"): true, - common.HexToHash("0x659dea8aa18dcc1517c645af6ec89a9a97cc5445636bfe649802675ca46c8938"): true, - common.HexToHash("0x5ad7c585fc70f31c303dc1a2054462e9c21cdb349034c371f6b55399175269a5"): true, - common.HexToHash("0x41e000fb5ca648e89c31ebb8adae604c769029c6b1f078eead5162d4dc89c49d"): true, - common.HexToHash("0x9d52facb666951a734e1bc2034b071608d3f1b25900e74a3241e39dff13b2632"): true, - common.HexToHash("0xaa1f570af9c3cc4f7696b126c85119386b60c6656e07ebbef1a18e7e1a658c46"): true, - common.HexToHash("0x3b9829ffc4bdf9af252c1a539456c22d7763dbf1ead7ff316281c5d67857b7bf"): true, - common.HexToHash("0xc048ef4eb48295ed1b0c79e58c02bf72de59b3d75c5ea876465d2943a00eb25d"): true, - common.HexToHash("0xfc55665cc0f0f841ad3598ce88e832e4c5672d8355fe3efab3297393cc34b59d"): true, - common.HexToHash("0xfdd9eb9d765c6f7228bda97894f93d6b8fdd3163372fdce3d387cc23c01cb594"): true, - common.HexToHash("0xba8bd7e716f7565bc517d06456a1cabcd8da9714524bb8691aed276efedc3884"): true, - common.HexToHash("0x7458413f8c63fc62e0258d52d3710aa9cc972b6ad812ca88ecc1211221389d59"): true, - common.HexToHash("0x08b65275503fad5a52eda2b5a0d9a326f060cef507461a92fb757f23b059f913"): true, - common.HexToHash("0x5d22646dbe793305077ba0339675acf7b135294e02f3b28d95940492aea0de8e"): true, - common.HexToHash("0x231d43dea11485a24fa8e3a1e28eb44906774432abe62703669ff67aa54340e5"): true, - common.HexToHash("0xc5c046101d1fa160d0cab1e1ac40576d9273434dd429f2d5ae5be2d552fb405c"): true, - common.HexToHash("0xa9886a15f5970b6873adecbf20a85d8fd9e55c7ca97b0dbb554f0ca33f34036d"): true, - common.HexToHash("0x7d3e03233dc371202de9613ed94d36067e758abd1ddc48af53356826bbc2d069"): true, - common.HexToHash("0x9ca7c095c96c7af7f1293caeaf099027f136df00b4b8e30709121a861b3cecd4"): true, - common.HexToHash("0xb313eb7267da402b2847fccab58c16460686e8d13f4918ca3639c1bb32eed079"): true, - common.HexToHash("0x50ac923a9ec0ffe2bd3595b6c384b2687b8a426d99033d18180663f290548b21"): true, - common.HexToHash("0x846c78cc08abc35c5069ae05e3e939b73e3e610fe17042c4938a31be4a6083fd"): true, - common.HexToHash("0xca64623d4ccb753b198fa78a7cffa00937d23c65c7d82c91da3a3ac6a9eb143b"): true, - common.HexToHash("0x41deed3b657c5b92e6da7b1557c10f0e2bdce23af98a2049bce176d6bbd3ff41"): true, - common.HexToHash("0xbbcf1c8fe350e2bc5cf91fe3b1fa4138c3855ef865ab06a5a49194fd766c8932"): true, - common.HexToHash("0x2f0fd42c664fc9c5ac6e5d8ba8a5912e5eab5621a7728c37fa46f90e90e25c88"): true, - common.HexToHash("0x993537044ddefdfd7b6460fbc6fb4f12a8501398f3696708c1e68def24ce7bff"): true, - common.HexToHash("0x29e5dea2d5adebfe8657f69d66c45d08f1b3023c978397ae48ffb9f11356e793"): true, - common.HexToHash("0x8fd729150f669bf1847456bfa94798929f7c3c487d7ff875242a0df9233db154"): true, - common.HexToHash("0x346a35e7ddbe28a276621ab7c9ab7c530d7035c6f2e62da6c46b2f45a99e7073"): true, - common.HexToHash("0x90a8ac4e78da5daed5696f7efa40cd66a3d601e8bbc641d84c743adba74781de"): true, - common.HexToHash("0x84d80b6b070be4d20763e65bd61c2f45a07d1953781d2a06ce7f34dcc9955337"): true, - common.HexToHash("0x39b7a72275a4396d7296253df5f677eb6b5a5efd55a089f2a5cd74e03b599719"): true, - common.HexToHash("0x76bfd80c4c7999b178ff2fef9879e6b884f1d75f8c20397d73a830b7bfb7fb59"): true, - common.HexToHash("0xa88aebc9f9dbd4ef94f37201341d9a0c8de5706b910569c64292bd5ba876dca6"): true, - common.HexToHash("0xf68833bd2a00ae84998f1d0769ecf7edb607304783c1175e36d65b88395d1749"): true, - common.HexToHash("0xc8505a57aac98b31fc0b0734e52a8e0b4200e9e7bb5c6ec52adbae9793ce3348"): true, - common.HexToHash("0x9f636c540f4ebf8b6a6e55ce6787b400c30a1b21c63ac5f6065def6fb7d22836"): true, - common.HexToHash("0x83c02e96807e12c202d109707c44b023d32db0ef2a271946ac683dc182ee391d"): true, - common.HexToHash("0xec7801e93eec232cb0153e6754c0c454fb269212c69948254691d9e2c0fd2b6b"): true, - common.HexToHash("0xb58829e012abdd5eb1b981a19bc81221e80e9f7793fd1d3877b766801ef83ffe"): true, - common.HexToHash("0x0eaacf3ee63ef4b2cdbcbb2b913a20678ca6402a6aaa9dda5fbe617ec37e630c"): true, - common.HexToHash("0xa20cf9a747b8a10aeef34c06ac5fb218dcb052dc93f9820804a22e8150511ecb"): true, - common.HexToHash("0x6d10a7dacce9625464e5b7d78aa0695738bfa8df2e5c261f8f1e9a53557b6a1c"): true, - common.HexToHash("0x7ec744c82f53b475fbf4f68db0079221f39136eeaf8d44023034abf59bc48362"): true, - common.HexToHash("0x7241332a2b1c02879ddf42e50072e337e1e40e76d40e1db5202f397406d7c4a8"): true, - common.HexToHash("0x04401ccdfa041fa7e078210e62aa09cd2d56c0aa0f7916f59774dee931999b0b"): true, - common.HexToHash("0x3a7ab42be0fa3c2c52f3fece5f7173c1ba94b30eb75a59c115be6c11740c45a7"): true, - common.HexToHash("0xe255a450b02c945f58fa1d653dbbccffb4851a982970ec4844277808f294873c"): true, - common.HexToHash("0x568ce45965dc600c6ac5be29e7f31b826c83a9fb51258c14ca7e150b7c17f8a3"): true, - common.HexToHash("0x29994a335eed01a160cd838787cdd403b889ae5ab92fdbe91132819a5cb5e56a"): true, - common.HexToHash("0xd131f3e125f52e80917d24c536084f33425c1cdaacad9c0e5179dec934aa6d2a"): true, - common.HexToHash("0x0e0dd620c0f8351eac09bea8701b68c7523f53c3412ddd0b8cc3d419034a29c1"): true, - common.HexToHash("0x68d919c78709ac5420a6181964c089859d4802f17d18004d9b8709ed84b9bd2c"): true, - common.HexToHash("0x51812a7d0f437a8889f9488cf929612d5861c9cce178db1901dac6f3df04d7e3"): true, - common.HexToHash("0x4bd6fe15bfda88e4afe6369b3734468e98eab95713197bd1d4c23d6153c04bb3"): true, - common.HexToHash("0xbd9ae9ae4f506f764469362b07048d58af2b7092a0c37fa02eccb97bfbdd17e1"): true, - common.HexToHash("0x352be401f4024d99741556783ed9052faa21bb0382df7f0773588f37f316abc7"): true, - common.HexToHash("0xd29d9b3158f4629c56ee06bb9796af93716c4b1256c706b0c6025cb3721447c3"): true, - common.HexToHash("0x60b8b572a5a555b3db6fbe9c67a65788a4a35bb8e1fc5b8ad9802dd22f5cc2d0"): true, - common.HexToHash("0x1ed3e006bc1c05c8ebce4624063e524ca0d23bd41a520169f80778dbb9261f4c"): true, - common.HexToHash("0x8a38c9891d7f54260e4dd6eceac8ac1b9c8cf9eab00b8c86cb6488c232468df2"): true, - common.HexToHash("0x9ec06ff630bf418eab96fb3160e4a42dc442e9a10c0c1763ecd63cf970420af9"): true, - common.HexToHash("0x69703a4e0723876973de938ee97b5de24c4d5d4193e5d77b1cfe31755a40f7c6"): true, - common.HexToHash("0x49a16f87a719de349851a256c02c700cfd5616a5600c5e8cb80f17b9dcf3a4c0"): true, - common.HexToHash("0x8f3703237cf77ac50fac5b5e3bdfe468bf21703cefa7e2719b2416fc0a0a9997"): true, - common.HexToHash("0xad04879888a4fe632de2a4fc22284a055e138ec4e0b6e735a75ac72ec2f0ddc7"): true, - common.HexToHash("0xf82379e72bf05585e8e0153fcfa796bfd08d513a6f9d7464894c713aa226f798"): true, - common.HexToHash("0x03adee21ac8e809959f3424e985b9e6b656590a66374ec90025c65adf5146acc"): true, - common.HexToHash("0x6fee1428ee743fb0300c66c105b16db6ec0b81b612b55850c45f8ec9c88d36bf"): true, - common.HexToHash("0x3225f1bf2eb97dd5c0825024340ef7cf09b560f0b4dc249bb298f3f14a594d2d"): true, - common.HexToHash("0xf42a71202a3fd81b2c9d3239042e7298f9a969d0247c423513c6d915333f8d19"): true, - common.HexToHash("0x2c92fc290e7b81a1efb807a86ce5939fc04ff228fb54e2d5cf19759536464e10"): true, - common.HexToHash("0x3425d3e248b895a526e0b12f422c1c2818967649d985d1558674e65e0ee73b64"): true, - common.HexToHash("0xbdcad3ea07bf0e1479a6c793ea4304fa0dad613687159f809cc9382ef7ca4814"): true, - common.HexToHash("0xec9b3c1477b60a6931e02e746aab86d0fa12ccecb2c1843a12d5b1956d89fe72"): true, - common.HexToHash("0xc9aad5c3b3f50589fb930b6c6641d014fb5d1cf534da0031bdfc6bc9e439eec5"): true, - common.HexToHash("0x003d5251aaeebdae8d19d037a400dcbba0b5d5d4a1f35c09b7718d91557f9e58"): true, - common.HexToHash("0xda6da700fbe09afb82f93370cb137ade6a0919bf585081c0cac871e4a1c0dbe6"): true, - common.HexToHash("0xb2b198d1a9102f77f00b93223a192cc951ef783f023d24805381022cc5943bd7"): true, - common.HexToHash("0xe9fb8bf7aec5e5e9dd23078e8c09eeeaa9cd2980c66f11285d7fd9ef0d36e547"): true, - common.HexToHash("0x4db04983324baa0472bfe9522383f4e3ae4a327cbf2dc040ba14101fe739d0fb"): true, - common.HexToHash("0xe245ae4be9423305b96f938fb72a87555f86c6aa427e68ab12db1c8735de00f2"): true, - common.HexToHash("0x38eb0015ab5d877fdeca0bb4e3989649d6a6d4a1c4da089c9cd93d65e8fdcddb"): true, - common.HexToHash("0x77cd070b5c38b53de767ab16a2f6859087d762f5f93b0e3627290e278dbe0962"): true, - common.HexToHash("0x398351f46266e1741cd9909b47499f6984d64873d59153edd506447aaa720b38"): true, - common.HexToHash("0x4e3c573125494657c75c7fb2dd9237026807f5a9c9e71bb676cd78379cc068da"): true, - common.HexToHash("0x413e08641650f5c79848c25cc4e2fd99ab49ea88b32fdfcd9176dfb9152d5335"): true, - common.HexToHash("0x8e1d0efb7e6e093ac07dbcea3c4256d553f5ac4086fb416346454b9be40c0d64"): true, - common.HexToHash("0x22ef4e2e5baa6700ca33718d0bf2004e2d58a5839cefc7dcfa77ee512a70d140"): true, - common.HexToHash("0xa85bcf6cf49520f9550913b6f70530f63b0866cb11dd34684ed2141cf757eebb"): true, - common.HexToHash("0xfe6b6b9512a3fb1b8fe602908b5e4a3bb3b1928ffdc622b4d9405cb495540224"): true, - common.HexToHash("0xcec9496d46216b91f2e5c25721f0d40b4b2a19ef16aec3d46a4d25b6f9fc1fb1"): true, - common.HexToHash("0x20b007f6298c6ee935f4a9fd70626e580fbb7124e05677f3217782d2ad061a03"): true, - common.HexToHash("0x02af7cdb7498c4e1f36e0d5d75bd19dde0b647eff33afafa89c50dea6fe0c8a2"): true, - common.HexToHash("0x9ce9cbd617a436c60ed6f175cf5be63a39d81a376b736d26203d889196ae55d5"): true, - common.HexToHash("0x7d703637209ff1deb3ef1a2edace9d10551219cb848f6ade23710f285be6babc"): true, - common.HexToHash("0xe68740d385b24e3212127e9b24dd22867adfcaaa14798f07b0bcfe5ed84fa9de"): true, - common.HexToHash("0x949c019db4493efcde59ecec4c870c8aa95dcc7162a2a41a3dbebd538702dc68"): true, - common.HexToHash("0xcf1e4ef75651f2d6d672802842acf1e48c61e0c17fe4821a84e150c1737af736"): true, - common.HexToHash("0x22a96dda7edbf51099dcf8c91bec18b46feab40fa52e0f02ba37667f8be613ba"): true, - common.HexToHash("0xdf105dfc50280023f7ecdc0bb5e59a385095048989acba41d86ea7fff7fe3877"): true, - common.HexToHash("0x9c065d167328776ab79b8a063f063c7e7c942a52de099b2ec6a618029d489795"): true, - common.HexToHash("0xffd8cfe7f0ec77094a7eba0964ba720feb0b3910b670bc65bb07f7d44138f3af"): true, - common.HexToHash("0x65b563e5eb08add1c2c8c0e582910d3a417ab1e587994152b0c7edb493f2ed0b"): true, - common.HexToHash("0x747123348d373223e613424ec532058d05d5caad01a78e53f68641092e88e1b7"): true, - common.HexToHash("0x62f15e8c1cba16fce5ea8b88fb610ff0e8185eaeb40938c049851489f9cb845d"): true, - common.HexToHash("0xab9b1e05552d1312fc8a63475d2a3b0445a717d3d8f33ca118d1be87f7f377ca"): true, - common.HexToHash("0x1539ee51383ce0b0ca827636943eedfb648d0d466d5e92bf7739571fc3afc433"): true, - common.HexToHash("0x117f714128693c93aef29e3608f84606707f75c28ec7c07368391dd0f06b526b"): true, - common.HexToHash("0xed7a795eb480a66f4f7dc3236c817c7b067f9f8ebb48989dc54c38d7b622911d"): true, - common.HexToHash("0x0a6dda76dfc4043883480f66db438ff2428d5a609a117e45f1a38f2eb67dca1e"): true, - common.HexToHash("0x3bd8c9f6d9ea18159b40a2eebf7b0debc05cecf24c2d1a879ee162d8ab389c4f"): true, - common.HexToHash("0x4dccb29aab172899dc8f4102e0ca3e8f92b4fa8ac365b106cd7ce57e39195499"): true, - common.HexToHash("0xfd0deace6d6a21f57e72fdefb4be79d00a71fdd3845879fb4b8db285bd3d9823"): true, - common.HexToHash("0xe4cd1ac65fb2667277a33dd954d7d390bb50d9310aa0e8c2a099ad60d74936da"): true, - common.HexToHash("0xc387cf727dd718bebb7cde6451c28fab44b3acaa97450fabe1430bb5ed144558"): true, - common.HexToHash("0x482f3e72d2db576851c8ada2e784ad8d1d3dfbec373bd064b5bc9266922acb49"): true, - common.HexToHash("0xcd597525e020d67831e10144d3270133d4a1decab3d6b7cbaf06d5de3d5a45f7"): true, - common.HexToHash("0x041de2fbb5062a92981cd3608b699795a1563982e3aebef3f77aeac699314797"): true, - common.HexToHash("0x9b1d8f88a0611df24ae1fd3712547c6dc663cf190e74fb3a91a72900a022b506"): true, - common.HexToHash("0x2d81bd1173c15931a582eb371fb458464492b19d3c1b85e6f5eaa9df04507b64"): true, - common.HexToHash("0x4d8214ef95b7680ca54382539b9e67d2de3fd1d7b6ebc6d998a3c146d914a528"): true, - common.HexToHash("0x6dd159ab05198d30d699db224502ecfcf0ef2d2761183cea16b302bbdc7f815e"): true, - common.HexToHash("0xa9f32d5d8c3a592f3d54a649de53907b7dc5ba071d4701a06580cfcf18bcc5f5"): true, - common.HexToHash("0x9081bb382ebd3be0969eef99d98a603242125b6feb25ccc4643fb0beff3890e6"): true, - common.HexToHash("0xe8dd24c51238726d995b88ec4fa7137eec90fcaaa4d56f762858c16f10cf1525"): true, - common.HexToHash("0xc526fb6b16566f0b7d1302592144245cebed7ca2bfcdbb6961b5831cf47d762d"): true, - common.HexToHash("0xaf11b656e0f3d4d1131c28a18f26c0fd9c9326734b6410c5afd2d900937a8fb1"): true, - common.HexToHash("0x8da17bf5806047c488ea1f91a6f0b93a628a375764b3210d56a7ffb40b712826"): true, - common.HexToHash("0x1e7e15fa8b813c3b8e3bccc3aea817cee3c1be25fe2d7a0a66ccccaa93ad4345"): true, - common.HexToHash("0x7a4142bdbdf51dcdb2652d7ee7b41b2094ed8919437ff871d1ef31a5c2170978"): true, - common.HexToHash("0x520edb442b440995a9baa0b599566c5ef9040ecad1f5327930a71d6f8d2c543e"): true, - common.HexToHash("0x924da5a0ec69898a6f171ebf522968c8a0ec5625725aff1661e9da13e3214968"): true, - common.HexToHash("0xd444662a1cebc0f8647b4087ca1b33ea3b6ea5303f745a0280afd960faea8d80"): true, - common.HexToHash("0x2f8d81f2cb64a1f1bdf4f6086ef5a6b4f403d12b8b691868c9fc0c7747ea9835"): true, - common.HexToHash("0xba8bcf9b692d197654f5a84b3e30680b22b41b315b69c9e88e92e041e6ba7096"): true, - common.HexToHash("0xcf7a3dce5d2c5a25c1c593b23825fa6bedd3c2ca99b0ba3fc19eb2b3baa2d7e2"): true, - common.HexToHash("0x6d89073629f6572b45e4c110ff88551184f586cb7631e56602fe7495effca378"): true, - common.HexToHash("0x4cd997fc53dc87834c1c450caa713fd68560fb5e1220983391a188d2449b5371"): true, - common.HexToHash("0x1db0eccf49d56033f91e956774187ff19762f41e57493a24b8d721fb0ccc0b76"): true, - common.HexToHash("0xaa9903327700ed432b6bb40a91e086cf6edf531d8572844ae074febf7de77b86"): true, - common.HexToHash("0xd22d320e627e112186bd7d8a1ad65d8aebe4fb9abd969d38e2341ab5ee4e9155"): true, - common.HexToHash("0x39fffcb4041b659342c67f8dbbfe78fbff77a9025fa1d6cd2b87db16dfb8a94f"): true, - common.HexToHash("0x03c91a04d21914177bbde519158f199f4425709885e75d296a4415de092f08d2"): true, - common.HexToHash("0xf3f057edf7b2754b0baf172418fd7775fdc6727aa9a4385c6514057844de496c"): true, - common.HexToHash("0x3d72077911a5d8007bbe9570cbac017fba661f4e73eb1fbbb9ce41a32251883e"): true, - common.HexToHash("0x55e56977208fd69396c3f19bfbd5bb0a97d183b0ca6068cb63b505863977888e"): true, - common.HexToHash("0xab7c823dad43818a52648a5e99c07425014644756cd446fbec17604033e9abc5"): true, - common.HexToHash("0x26a9d39b94e84fd97feb8a3c153160d30e85cf92547017e6fc00401781821009"): true, - common.HexToHash("0x1882b0fd1ab3c7a361e505b76a5efff1caa9f483a129329ee2981cdb8990ba74"): true, - common.HexToHash("0x05ae735284b649fbcd9fe39b29b765e3b1495bb631404a1ff40ab39abfa68bfa"): true, - common.HexToHash("0x03544129445cf90b65aa21b28a16bf0b798db88b3241fc8f074341c13df1c4d0"): true, - common.HexToHash("0x74a4f570e2cb0c5173d3a0c2cc22e7f1af58eef8188038114055356c4ef1fb48"): true, - common.HexToHash("0xa6b43aa7bf724fc1179f37e9988cb386e89a90e213fe8c0423fc4c3c8becc914"): true, - common.HexToHash("0x20af7b215a240ed4bdf57af27145a9d85e4c379449ccddbdf16c6472e160ebc9"): true, - common.HexToHash("0x2b18c2a4e9f52e2b7ee6a3e79308a7ff3183fa5efd7a85d1ee8e51bfffea7396"): true, - common.HexToHash("0xb000f8ee1489997757c6cb4469fc094b021bcf3c201ae1c265de8b6f44b20c1d"): true, - common.HexToHash("0xb8788f0d6726a6b7ab192084bc999b396babe4ae4b07dff355b431cf788c8520"): true, - common.HexToHash("0xd195093f1ce7962896cfc9e4fa69a5aa0a83b5ee278e72b85c9b476a1b494d16"): true, - common.HexToHash("0x59c78b5049a612042fc83ffc87a9193dfc4a99de7cdb39c241b95cd1a39e209e"): true, - common.HexToHash("0xb116a405518718de1bbba7f66db865e8a23057e7fd0e66feae52cc390fe054a2"): true, - common.HexToHash("0x102c38eb12c3647b46f83a668c3131e395ee56ccba8689e67e15283b1b4094fd"): true, - common.HexToHash("0x345b3ee946fde9e7b56ef4db7364f4c5c596569a70e5da2c0fd0dca0c5014452"): true, - common.HexToHash("0xd8cced29310aa1fca902b002b7e9fede959b37f5c7ec32dd9077c13e1e0823a4"): true, - common.HexToHash("0x75cad00b6c53a3fa2abbff5da6adcaab64a0188a4cb22cf9916ca8a9f062c31a"): true, - common.HexToHash("0xab713f69a1a81a8adef4167200298eb497ed73be7e3fa031047668ff9675b53e"): true, - common.HexToHash("0x3cf687f729c3dadf58d56e5e140b493fef342b47de78be3e7b835fc07e42eaf3"): true, - common.HexToHash("0x01e249f2d967185fd095d135ec26141a50f0738a8291873b7c4d7846389ea14e"): true, - common.HexToHash("0x938f9c01046764b4f76d6bcfafb3f25f8d210370902ca6a6159776efaeb48f77"): true, - common.HexToHash("0x60b21064d4dfaff04dd8140a863ea1f8b71483086e75eb9c35bef0e8abb637e3"): true, - common.HexToHash("0xa631a57cf2e4317e29b1077c9678f901cbad5db0920b62059d5fc3bc46a88a7b"): true, - common.HexToHash("0x05dc5945bbf5c4ae491d89478266c111d9465acbf1e3e5044e1da3bed2d63005"): true, - common.HexToHash("0x9a995873dc7126c2503088cd5ab8c47542611d099065bea407373670dbb63cf4"): true, - common.HexToHash("0x15910f426062dec3b92979b527861640ef2e4d62813984de7b7cc10e9f8da99c"): true, - common.HexToHash("0xf77e6b0c5830a8c425e725c615ecf507c8227dc8224f0e0da41254242af0140a"): true, - common.HexToHash("0x3afc8346ea4ca50b82745af9613e0c340baebe1844f073d89f7f89f84359428c"): true, - common.HexToHash("0xa81ae3952cd72b96eee2d6da447079f79a29be1ba0e23f32d104c2c76342466b"): true, - common.HexToHash("0x7ee256dd547119abebacbede5f6f2e7b47788fc4a34ebd03b604acd7de198c60"): true, - common.HexToHash("0x58f8a187d0d0cef75a2a5f1a3c4a394e138715229a5b43ee62af7e721c3ebeeb"): true, - common.HexToHash("0xeae91c8c48a41f208d29374787566550b81c8e281fcb54fdbcdd74cab5706169"): true, - common.HexToHash("0x11def55109a39db91acb4a01a99098b8de198a682f40bd585cdcbb704a2483a3"): true, - common.HexToHash("0x4de05c093dc710da1104aac40fd7fc15d020281b5f064db70112296cee58d734"): true, - common.HexToHash("0x8de28d3f0681985e656f7d9b524e3bf0028b19f357bc461cd774b202ab0a32cc"): true, - common.HexToHash("0x2fe9f165e1e9b27202d4dc485a5ee2b04db5caa3bd7dd5194b136aec45e17466"): true, - common.HexToHash("0x5d0bbb06277b7e9483b27598453f437afbee49e2fb80542ce8263d755aa9e0e3"): true, - common.HexToHash("0xb114ccce15d039fea41f5292f6a87b8812a7ffdf23d2ffc320001e9316a33b2c"): true, - common.HexToHash("0xbeab07f3d33d9cde4f976c44e2382e769e00c47d112484c2cfba63da0d565936"): true, - common.HexToHash("0xfc894a93443ee5c4d71673f4abab84ea670e8a6366d6e5c6bbe8c39176dc0b63"): true, - common.HexToHash("0xe883488a4874a4c28ce5cb3bce2f95147d2b28486529c7d837da4f9cbf918450"): true, - common.HexToHash("0x4a78f72352f53440d8e4df5c753119e78eb3d53713c4ae28e2ff7d4f1b1bfd95"): true, - common.HexToHash("0x507420f07e120ec2d5d0479d220d72fd8af39766d35d20ecb0373f37b110daaa"): true, - common.HexToHash("0x8dae9bb8e1e1b2880fbad6d82fd874b69ba9c2d5e99e0fbd66f833623fe17d09"): true, - common.HexToHash("0xa97315c6b35ab9dfb9d4338471eb311cdf0e24bc61e4994a14835682f43731d1"): true, - common.HexToHash("0xf7f6ebc6d98aef4ea0f9ca360c47ce51053c89e1ecc9bb6e3242fe9216429fd8"): true, - common.HexToHash("0xc7339699cd73b9777138b42d948ce2dbc3eb6dfd9ed15158c3fd75027fbd1dd7"): true, - common.HexToHash("0xf59bca46398b8c5b220737cb12e802ca496c81d047fa1d51b883e9601b45abdc"): true, - common.HexToHash("0x094d3e756e26e3488b36b92a0b5c19e9515afe3dc3613c88ad43a28995d22b81"): true, - common.HexToHash("0xe273050b58560bd8e4fbd8931ce7f80f80ca0f5574095d7397a872f37c059d94"): true, - common.HexToHash("0x8e4b66376d0690b0a1c030e4b97dbb71bb91d6538d92d891a666760e78414b8a"): true, - common.HexToHash("0x86b2785519ea5882dcf8caac6ac445c0bedd976afb8a53a5681a3fede51d22ae"): true, - common.HexToHash("0xb01d0c89de23199ea488411e3a4047acae6cf6ccd64bd02069af926ce2b3f419"): true, - common.HexToHash("0x365d5449a6b635a6ded3965eaa9baa53b51d9cf64d1c5feb5549597b84acd663"): true, - common.HexToHash("0x47b1f0d07f0ab64588fee58a82265795ef023f9c3d1e774089f9351dc401129e"): true, - common.HexToHash("0x60cbe69b0e4b646ba7da071302586e0f33c579b78b0a4ee82f97170a0a370c30"): true, - common.HexToHash("0x548a9e5516bd5e3a5e90ff0e6c2e214f9754c5e64e287b89261df95860ed6a09"): true, - common.HexToHash("0xd734cbc802d60739a8e580071928f928c50d20af6ed763cd4e5b82a55777f358"): true, - common.HexToHash("0x2258e5026c45f69127de73e2112e519f93aadff91ab93338b01f4262b09326d4"): true, - common.HexToHash("0x616281a1e9aea18448e23b89439e2d19c4c266fe152b9df1f75731df0caa8829"): true, - common.HexToHash("0xcd10bfe572f054e4782fd2cb70602a26e5e55fd17cf625db6d30753b8b4300dd"): true, - common.HexToHash("0xd25518667d708b3f2e3049c97af43803279614e0305e510747b367dbc0ed46bb"): true, - common.HexToHash("0x5fa7d36fe30f1ba6fa523091eede410e6c04307788ab279c083417a86b0f2652"): true, - common.HexToHash("0xf1949b995c4ff5e7af11b077e5cfdfcfbe09ad2b1a5e953324d07e983f2becb7"): true, - common.HexToHash("0xb744724e312e0f078e3b2f414091507278ce17c0d62243b721db56970de7a827"): true, - common.HexToHash("0x823965dcfd656826216588ec7a4ea7e4cc82a21e1e9acf214e27dd1b383102fb"): true, - common.HexToHash("0x729a30c730211ef12741dbdbbd1f40a36a9cd88470f2a53289d410088fe1ea66"): true, - common.HexToHash("0x64c925279cf78da92d279d072818dc7b2a72eec32782902d7c7dc620cd494379"): true, - common.HexToHash("0xd0d90447c35c79f77fbc07368f38ccc9bbf481e503e13afe8698896443075a20"): true, - common.HexToHash("0x3fa2e7416f2ec4d9f18e27dc51e012c2ddd504070e771f5c814a8cf481376441"): true, - common.HexToHash("0xbbc32bb541efee54b4954933a723c495ac455734232c7de3e57d8d1e701b908d"): true, - common.HexToHash("0xf5de61c11d4e5662d5101124f522e548770f8ae3311edb0c54ec4124f0bc4188"): true, - common.HexToHash("0xa05e38592206710c4e89966a699631fff65761454240c5a450849b29187ace93"): true, - common.HexToHash("0x5dbdc72de20cc785a829dde9b834e99f8b0d9fa12faeaa4ae6b2a404f29e68da"): true, - common.HexToHash("0x43e72b8b135646b7db69450b4e35af4b60a8369a55805f70035e1a406887ad98"): true, - common.HexToHash("0xbd26a1f6bc007ce091a936587d6d64663a03733232b30a5ce4672ad2635fd4fe"): true, - common.HexToHash("0xd0db32276c6e2184342dd4024d6df568f3fd9b1caa74cc0d5ed9cd2803d912a1"): true, - common.HexToHash("0x898284bfbae08739a42a66431a40192eb74f7412db1db76102a237f199a51706"): true, - common.HexToHash("0x6bc28b8a795a8dcbfde21297cd5a83f186a67b0096e7106f79385030efb0fa97"): true, - common.HexToHash("0x1577f3116efcffe265970f3ce73cc4099b8c1820039f8da43c1d80d3ab769312"): true, - common.HexToHash("0x2c17fb323669a122384ad60bd0ec227dc8ca512e0ceb5a32e7183f88f8a95c13"): true, - common.HexToHash("0x1b45e544cc227a2861f6bed89049cdf38c6ab987ed86a35d0e63e34cfab10bb5"): true, - common.HexToHash("0x018725906c72d4f81d91de77786572edce59c770063494f049cd608bc6527921"): true, - common.HexToHash("0x70a9e00423ed6bfe09b0534c8dd69cb9f642daff16f3b823ba66a8f55d44be30"): true, - common.HexToHash("0xd7e4e7aa96857c20328ce8711188ef28c219690ce52c76a28b61210d9ef3769b"): true, - common.HexToHash("0xb9e8db05ff18e2bc9b36021191216cbb5cbef52335246c843312302f0ef3e17b"): true, - common.HexToHash("0xf8e1f38e87792c734e9541e1d99fdf065ca4ceae93e3f83bf425020ea54a6c8f"): true, - common.HexToHash("0xa7d1e48a6d0cfd2af21f69a2eaea3611caeefa04cebee65b9847784123d56318"): true, - common.HexToHash("0xfa973a015304316c8321789e5c0bc252a9092cd8094b9ff1a129b2e1e4cf43ba"): true, - common.HexToHash("0x35fc339e6dd0793338f06fc11637b499f99672d9b96fbd3f75046a94b531f9c0"): true, - common.HexToHash("0x2ae776c28cb645a5575b3f645264ac23f52d7b77a055e927859a9e3479ff7299"): true, - common.HexToHash("0x797aae626d425c145804eb3a9ed974b2584fe70ea7086b92c927589265b9288b"): true, - common.HexToHash("0xa7eecaa0e2edcebd2cd2f5df716c7311c521ce10a8dd2a79f07266df56bf8b29"): true, - common.HexToHash("0x3f462ae5ddd8746798c2e959ae4e52dde7880d23a73f7fc888c476719277a615"): true, - common.HexToHash("0x29da7e567b7e5728d7f49283ecd0a1523901df6a6d3a462a1b82fad3797d16cd"): true, - common.HexToHash("0x286a1145e207283c8dffafd290d7366e59ed9a790acbfd57a41e850341b9f54c"): true, - common.HexToHash("0x84b1d4816aedc3e1976504c9078af5248394a34bd9ada63a51375ed308cb9355"): true, - common.HexToHash("0xf809bddd0488cffe57f1a2cc2233c8eb5b16a1ac019f66dc317c59ef724d161c"): true, - common.HexToHash("0x9605eb6141cc01357800dc45e1c094653de88db888fe0c8197d3b7a1364bd0f5"): true, - common.HexToHash("0x89038f49211be5eb67408173d6970ad33104a0740cae0bbfeaf03b637c5c3ced"): true, - common.HexToHash("0x76586b51569ea0c0d9cdb27689d1e3bc37676c23c19a605b734a70b2a953be3a"): true, - common.HexToHash("0x28779863cf8998c6bea8d147d24ec517636cc28f8123adb832daf1f481f44544"): true, - common.HexToHash("0xc2dfa547dfb5c9f267477098835ffa73b061f9035ddd1a0e9b9df720791670ca"): true, - common.HexToHash("0x130088097ef96d76ba92c99d8ccb23e014ed2ae0b4ae5d11575707d62d0664ad"): true, - common.HexToHash("0xce98cf3109e95aed6ed9af84cc3c755d4cc3b1f75f1080b5a9ba682959abf5b6"): true, - common.HexToHash("0xdda6e31df673f5aed609a51d879b63568b4211a5d5b54dad4013499ad119aacb"): true, - common.HexToHash("0x04109cc3e57670ec2f7a97a71c3b4c927745103077c66d34b614073d657df5b5"): true, - common.HexToHash("0x6c6332501a832c7e168da87d2f20baae0827dc722e11db95c9c766e486e8215c"): true, - common.HexToHash("0x88e8dc14dde85f6b1325dd75bec6149678ba44c35b58504d550ca3e2a0bc4d6c"): true, - common.HexToHash("0x5e805ee1d5296e14b292a1e8cca635125920891beba4a3990117e2a8b91dfc9b"): true, - common.HexToHash("0xacf14919cecbd3d7e9dfc7636ffe38164e0d5440d074b9dadfa3c2aa69772164"): true, - common.HexToHash("0x81022add7cf5bca21f9f40d70722f8981e2e858dd706d47bde4081129abf06b0"): true, - common.HexToHash("0xb4cd68d262fe1b32817ea2f73c56e1c780f898893d229fea5f2b3877cb89a62d"): true, - common.HexToHash("0x7513b43210d2b663048216b43a762f285d58bd00dc918c3ad335c0a90d3055f3"): true, - common.HexToHash("0xa076a659c34951b1b6d7e23c44703cd4fe2aa669211a8e79851087822b8f438c"): true, - common.HexToHash("0x1d14ac9d5806f21aef29269d5156cabf2a76faf457d8d48c7d9ed002fcd80cab"): true, - common.HexToHash("0xd029b6898d21257cf83df74913d7eecc3cd7d5932515663be6e1f1f6d02d4e84"): true, - common.HexToHash("0xf25f9741b8b016a990f4c87e96c3a0c6af505e17d3c0b7472b984b59cee61953"): true, - common.HexToHash("0x4f56acf99a6af583b88b4cabe83f933a6da57bdb2a5f96b0e8617e80b6f22fd7"): true, - common.HexToHash("0x6b36543b62115e62ad5b137140f5f8ad276532a3eb5011762e2e7984a8d4bde4"): true, - common.HexToHash("0x14afcc08a88bae8156a8b98316450eb8cfe2756fcc6909ff80d9d79a3f3c6d79"): true, - common.HexToHash("0x5f1f138c6dc027044a5c34a3d8a2b557d2ec8c340e4b26802fce8921759ba10f"): true, - common.HexToHash("0x9b067dd0292b0df88d556db393c667c63dddb8ca560267cf3f67763aa8653bca"): true, - common.HexToHash("0xfb8f0cb3ae6ee199ab374d361ddb34f2e64408ba9619e5617bca1ba71919b111"): true, - common.HexToHash("0x9a41aabb2b9e44d7007d0a28e94144b0cbda63cbb334db71e876544d5361df17"): true, - common.HexToHash("0x1efd35760c4c2955607ff842f1a486c09f29c709bfb2a2b232e591712b8fa5a8"): true, - common.HexToHash("0xcb08174c40c548e49279ff73aebb6253ee5a21ecfd94463def88d814a43a975a"): true, - common.HexToHash("0xe8a39a4963348d59420f9b6a338b7a03dfaf7d082f8fc5481a0010bf6a146557"): true, - common.HexToHash("0xd6214f92eb48ee78b3f2cc3ad73467d7f0bd0c70a582d174f00e85d03142ff17"): true, - common.HexToHash("0xd6a43ecd553bca6a358e5221a962382fb90de026650cd9fba4db721f9ed22a62"): true, - common.HexToHash("0x77a3de256a126218a72128d8aa897b79b7db11975534df81f175d2d5b8136535"): true, - common.HexToHash("0xdaf8d27246e1ef793016d458475317ec87ca93eb738a40657f5052b9c88a5b13"): true, - common.HexToHash("0x1c239ead45e66a83ac93c2dfb9d0e7e0ad54690c1a494bbaa08066cc8c01f4d7"): true, - common.HexToHash("0xc505b55865c4d20f4aeb200a6878ef1686fe7a4fc84e35d894ca0e7655acb4c1"): true, - common.HexToHash("0xba7965873f8423a9328e92b02ac2b54435e69456d3969a6d8d254a91fdcfe1bb"): true, - common.HexToHash("0xc1435c609a9bb555ce68b5559bea91ef823ad1f3211bc79a369e99f87045a436"): true, - common.HexToHash("0x4121719d160d4b90c96a03043a616cb615b0b095f02c0a7f02be650057cfd905"): true, - common.HexToHash("0xc93a45e25f002bc58aca03b97412134d516c249a9c445b206ffaf5e6060573e2"): true, - common.HexToHash("0x2303eec208c3147165d5454486ed05067a7c4a697dcab4da5bb1f4ddbb9c68d7"): true, - common.HexToHash("0xc000780f3a1e63e11b84e13a7deef1e07c3322edd661d1a27ff28ed2ffc137a3"): true, - common.HexToHash("0xfd7adbc7b87579d9dc4bc568023dcd6e6562849c0bcf81fb2671f1a2347962bd"): true, - common.HexToHash("0xd10a690cacbc106dcff103b664c8878af501d5c0eaf62a9bc0b21e4c4b5b5cfc"): true, - common.HexToHash("0x9f870078576de5c17175ac363fb82809082c0c607078b45f792cb33a8c727cdd"): true, - common.HexToHash("0xcfb5798469ca47625c6da60af0864dd5ea298a09ea773c1fecfe0d7a3ee0e63a"): true, - common.HexToHash("0x2e21cb009ddbcc97f74b2f76371e9a42f7d3f6bad14da550399c376ac944d7de"): true, - common.HexToHash("0x7a0f8c201be46b8b1ad1c4333940d11024ff1275c7831c13d7eceb34040b26d8"): true, - common.HexToHash("0xdf97b270057de2f7a10e23026d4f50cfe465ee3b42553269d30b0e26ccaea9ab"): true, - common.HexToHash("0xa35964e12b5c5f4516c33d42136ad7d2e2facc075535b696256b94fefae1cc7d"): true, - common.HexToHash("0x6b0a9fb9dcd0e4164ee0f1008046430e5d1d825319e6897aac2d13ac4c76c1d0"): true, - common.HexToHash("0xe26a9147717e3f73d3883621921a285f44bad735d67626de2f7d8909e65a84af"): true, - common.HexToHash("0x85f082165778f4ea3bb146b62d0ecaae1c4971b8b4c7d4ef853f77a5d6ec7939"): true, - common.HexToHash("0x8cb175b09147a705a69a1dbd75b6ac4cf93c9b638a54dedee9b43b11a6c88934"): true, - common.HexToHash("0x644c0e7e55945ea7771530ac697cf5ce6c9115b5d1dda3560b4fc46a5b3eb9fb"): true, - common.HexToHash("0xee1793314e4e3438f2772b528a75ca34fc5ff0a162e39d2182710b3e6ed44261"): true, - common.HexToHash("0x5fe5217811f6f0296435583a1dd5ef74991e84eedffe92964a7caac5afd239f4"): true, - common.HexToHash("0x3c1c6c27c26ec06de6b937b6e8ad7bc031243e4ba4e3ec3bc77b774b5edb8d0d"): true, - common.HexToHash("0x822de514307e981fbd1fbb50070fdac5c34d640a7cc94297f6cc2f43b832f2e1"): true, - common.HexToHash("0xa5510c3a0773fd2409e5e090a036146702b0cb2fb731c1aaba42b2465799d7a9"): true, - common.HexToHash("0xf2c1ddf85ca6f164686e9d38578533c6d9c674d8c2772011db07934dd6ed8407"): true, - common.HexToHash("0xe594b3da17bec71b2ed657a958a2c116c56f4a78896702a47ae00f85362a231e"): true, - common.HexToHash("0xf55c8bbc416dd443ae45317db022c42f0884b9b2358b454f0405819484bc1a67"): true, - common.HexToHash("0xdf8502791ed031a169470a5ac0a7a937eaec8ba0b68f2685d188639e26f6898a"): true, - common.HexToHash("0xc011cf30f3eaf5ab8d6e1d8ee08d3b6f839a3956d5ac0296ff4d2da0bd0464c6"): true, - common.HexToHash("0x67d352c083a572c67e44127a68eaef621c7f59cba5f49eac73ba09f42b6d12a1"): true, - common.HexToHash("0xc18571243ef70f49ef3bb8f18ddaa37e0902ce534e530536b3b6e28a3930611d"): true, - common.HexToHash("0x4162e1bfdf805109ab94a9da36d2197ec827c92f4e3c23b363ba40d604eaa2b8"): true, - common.HexToHash("0x87c28cde99c4a54d25d30bb7e6e74726e477009d06de324571b0c9b10d883f3b"): true, - common.HexToHash("0x17d1312ec71905a2306e2e21c9a664bda325ac997c27b08af8cef57fefbbdefe"): true, - common.HexToHash("0x3d4e2e788e2e3f2bcf7fdaac55d634ec1a0f036713f531107ddcb8ac400e77e4"): true, - common.HexToHash("0x0b85a0ea4649ecb7c7e00da6269c6d2113184fd96c3d3da42dd373fe2eb5adcc"): true, - common.HexToHash("0x1bb8a5466fe2ce980823d83a3c42c09d4908bb93864e1e88f96b7f052e33dc11"): true, - common.HexToHash("0x1e553c3c949230351bbca3bf8c9509b718d312075657cd57e390b3071f36c1aa"): true, - common.HexToHash("0x3e39dd1bd4f5eadcd44c7d4058e03303830efdd5243d94f7f3cbfff5cc387b47"): true, - common.HexToHash("0xe29d0d868948ca1c5f421c8ffb6c378e61d01c355645a4af421e0f82653c449a"): true, - common.HexToHash("0x071f3be13650fcf4a3c3b63cc94d3da4dd43caf121e90ce48788e79ff11c3ca0"): true, - common.HexToHash("0x8ef4e5138cc32afc54f886e7a6c4da2950e3ee9e17d7135229f8a1e6c154f331"): true, - common.HexToHash("0x3dfec7150fea3e851b6f980359f58430f8d299bde083cddeb36b155562ae81ae"): true, - common.HexToHash("0xb3bafd3397764c23c35ad4964b7d1e1c01355de99a73684fbf83838d7e33b15e"): true, - common.HexToHash("0xabc52ef48b3e24f453b8eada3c98dfe99c95eeed2c9ba18c7ce432c6295a11e7"): true, - common.HexToHash("0xc1cdcea201d98346cdbd6eb49e3b1ce169d25e1cf92e7cc7c4f283a4055e0da3"): true, - common.HexToHash("0xc9f6463c116ca8898d3c460f36d9e3461d40900d51ed58c3961613dedb64ccfe"): true, - common.HexToHash("0xa003d2da1bbd4f1540a08faca3a31c14e276ec40d5f813f1375ca58581befce5"): true, - common.HexToHash("0x4be5493eaaa43314dd8da723f817f89165a8bdd363b7bd7d0707ec37cbceaa81"): true, - common.HexToHash("0x171999ab3770e03c8a61de01274b734f686ee5211bea873ac1508885d9e2d419"): true, - common.HexToHash("0x1e88a4a25e8f5ac671d1115a2e798532dc79820556a69ed8c85704ecad2858fb"): true, - common.HexToHash("0xc1a148601038f7f53d329380bd44a793b6b907dbfe53b41729cacdf36a8d3dcf"): true, - common.HexToHash("0xb324fddcbf8c79e72f10c3cc68a3eec84eeb1878d2d54fc42b8ab7b5a0e42d57"): true, - common.HexToHash("0x41abd419b82d33448cc47cead86c4aa0a82bf564fc1bca181f5692cbe6e35926"): true, - common.HexToHash("0x7c5bbe0dfab63632edc8fa1f4bd5efd46e8c4fabd0355fd38729342b030ad85b"): true, - common.HexToHash("0xdc3d7bcebfc6bdaeb772e5d8464c430662cb849983758c324ac40b5cf63cb66f"): true, - common.HexToHash("0xa2eb2393bed04af00dab83ed389b5e383880fbd2d996fc04fd945bd12970abcf"): true, - common.HexToHash("0xa58b40cdeb46001b663b390ea7c839f818e3706b7fb462e9c91cb20a0d38aa7e"): true, - common.HexToHash("0x99a3162c963dd45f59f437b5094b3c6f3a5df2ca8683e4057caa7089ad6bdab6"): true, - common.HexToHash("0xbb657509e49c8926940eebc1847d83460d4f684c212ef96ef84705964c6d5bec"): true, - common.HexToHash("0xef9846ab6a27cc3f5f13719456f47cb322fb128b1ca8166d8a1b2358edf378b7"): true, - common.HexToHash("0xfe310d77703ebcef1d3f4d430216d4d415c063e4f543ca30797c1398b54e533f"): true, - common.HexToHash("0x66d0082557b3949f7858d6ae806efef27736011d9d64880123613c9ddc29bc28"): true, - common.HexToHash("0x5ee85aaf026c2c9235ce3c39c473ff1719f23a5d2862bfeb482e08596dec306c"): true, - common.HexToHash("0xbc4693267683acd34ef9d3fb2c0ecb37c11734ef4749177bc44f121cfd83ee86"): true, - common.HexToHash("0x0d7d5ade0e5fa82defd927050055afd7b10c46e615ef1b03818d710040058939"): true, - common.HexToHash("0xc5937645dc669ef1eaf287f429116a87056804ba395ca9df13f64e58067a3299"): true, - common.HexToHash("0xc4e4a56905f3cd9c3654f8726158dfa885f86e1d0c523653d94f0975d2f6153b"): true, - common.HexToHash("0xdb4557eadc006ea247140769e3a1a277c9d2acb79f2b5590f10c0bdbe768b739"): true, - common.HexToHash("0x9831f726a7d40b62fea80fcab2a2c8a86235fbad5f6ccfe67f26e9e310c015d7"): true, - common.HexToHash("0xb73dd213246f01d75e209d9ab3d7e3720de6dc99a017a3221976df4b46c448d3"): true, - common.HexToHash("0x7cb07a8ceae857f2abec633f0c3ac2b5384b4551d91b54104ad286b05efc89ad"): true, - common.HexToHash("0x4871b2c464f8815a8594e183f3a4041daa77cff9177740d1b2aca3a93afdada9"): true, - common.HexToHash("0xbd469f9a8935167d1b05bd911a5e0bb01adfbce1f97ba327049cdf3730cfb32f"): true, - common.HexToHash("0x68ea9c18d0376de17e02826079aee993dbef4fd981c379f47c83884e464abb57"): true, - common.HexToHash("0x5261e75d0d8f6a49fa53eb94c4573951ee248ffe49456fab287210d9ad81dca8"): true, - common.HexToHash("0x5e25e94942128443eb20bca3080eddb888a94a5a1721d8c115a79ce8b9f3b408"): true, - common.HexToHash("0x839973d8312338bc9dd624dc16f219f542e915a414f8a86b3776046fcbf9d3bc"): true, - common.HexToHash("0x9e4ea739d1f50aa7b6b84534d33752990a062e19bea4202a630d82da646f88ad"): true, - common.HexToHash("0x2074bfd66e7ecdeb944a9ab91a3aab9224e8e6e3fbc34cc3714613f7d3a25939"): true, - common.HexToHash("0xa13fb4ff5678a73f44bb97124f6b0129f33b35277f5e9f8f20f3419232a897da"): true, - common.HexToHash("0x4dbd5dc68899a0767b11a02f87fdcb1fb8620160a7074894f76abc987de337e3"): true, - common.HexToHash("0xaebec93ac9b74af95ba24cf3091d2769b4b892acd6a7eac4863d7f94b197ea75"): true, - common.HexToHash("0x419eb6ff4c6df089b64d6e0bdac16a20584424c1c7aeb675850cfe9ec117e72a"): true, - common.HexToHash("0xdf75a1944f681a26d2f20d7c88f33572f5b66fbba51d814b4bd2b72ed17af740"): true, - common.HexToHash("0x33b3b8b979e2e19c1ec8b83d908c32809a93e86bcbf5272ada2607160c1653a7"): true, - common.HexToHash("0xa9b0846ae017bb607329590a3d658e7eef879b02dde69c6b39235f62d15b91dd"): true, - common.HexToHash("0xa78760525ec56562f401dc06d8a67a7c5ebea99023f87f670e290c70a7ddcb48"): true, - common.HexToHash("0x8fe5d51752863a71fbbfe12fdf6f5167f5274a0f18e8681ad976186c34ce3e00"): true, - common.HexToHash("0xe0efc41d2c07070544c5291fca128fc4be47947ba91b6bf81027641f20b7ba96"): true, - common.HexToHash("0x054d1ab59f0078c04aa91ae6ebf86c350e37da8eddafa0f03addb8e5d3e33ebb"): true, - common.HexToHash("0xb10828fc1f42672d1f4dcc3c1b58554a6fb888d69f3a97a679bcd27441609c20"): true, - common.HexToHash("0x4c48b79e386085deb50982bc93ffbd83b4a4bcbdb6b2cb87bf005e74337d569f"): true, - common.HexToHash("0xe1e3caeb6e2f6c535d59731095fed0d065dab5d05493e46c79af3ff776f38554"): true, - common.HexToHash("0xc1ed913d3ba008f6773c9ee11b4e4dd366a647305a8a55acba1bff97b6614a03"): true, - common.HexToHash("0xee815a60ac6df7c48f96beaee205e9e9f8891bde24255425f5967cefb90dc913"): true, - common.HexToHash("0xdd25b7971dcd5f1e25fce8997e62f5793ba6fdc2abea680f3099a53792c6f1dd"): true, - common.HexToHash("0x8b633590b92ee06e64eb2a094638fc1eb41030fadf57f1045e3c4b8e7c5cd861"): true, - common.HexToHash("0x510694ef55ee0844082fbc1dac802256d44cac7c4c78877d10d5be33d1196df6"): true, - common.HexToHash("0xf66d36a56b085721265afe24b71708bde2163936008fd2dbbe5471b1da222f3d"): true, - common.HexToHash("0x69a04070722cb3313f031a6228c8dabf13410d0d38d7ce54e06d57504d4730d6"): true, - common.HexToHash("0x396975532e4e9881038da54bcfa964d3539ad8c6b2c54ada6c181d9675018f26"): true, - common.HexToHash("0x11e703ee4750430eb8b608f6a83405c8e44434c104a53a5d37c8867f17395bc2"): true, - common.HexToHash("0x3e4741a396b3d797f533fd584a7b510bcb9473fd895df089979801327ae89eea"): true, - common.HexToHash("0xfc5e74571b33ff73eb55e0d50d7fdaa523de49ad8f1ade7736b39d15b063afbb"): true, - common.HexToHash("0x70997b3ec9f1c9d8346880f3062e8beb3e0b96f40e24fbe33a09a54fd5f7cc9d"): true, - common.HexToHash("0x6322b008465efada47545344f7e578b5b5cfef331f1ddb432bd56869cc599fbd"): true, - common.HexToHash("0xbc52e0d9f8187854526da66fdc19595af5f552ac309a39c3da5cd7d182e5e681"): true, - common.HexToHash("0x734e0360ffc3229c07050c1423390cf0ebbce3b1311f00f80a1743ef86170077"): true, - common.HexToHash("0xbb61de71ede3c7b1faf7d45118b6d47549fa4a6032694f352abcfdd8deed8af5"): true, - common.HexToHash("0xdba31a0e1ff63ba4d194a13d11e17005856e1bf9ad9f60df56c5b1a13665dd81"): true, - common.HexToHash("0x45a4a7ac39f3e9f70f6d606a8ec5599d76c198c95c563349c8ef951bafbc4a52"): true, - common.HexToHash("0x783a4cb7e7cebd95651e797fd5a960f8a49e1cc53d39d2b49d9cfd47f2330bb7"): true, - common.HexToHash("0x2c2af0ee212c011b342718bd6658ab2216c4d6acb1928ad6abc46672103ffdab"): true, - common.HexToHash("0x277bc3ad45b521ff7704b882a2e36d30f7084319031e6336b61ce9a773546d83"): true, - common.HexToHash("0xcbd9e94246fb4adb9cd4ec5f706e7a1b36844b45902e3a1dbb5c27c70f48fc86"): true, - common.HexToHash("0x7fdb911cca7139bf1a3195eccc83850d26379a5d90b7ef629b0357c7adb40602"): true, - common.HexToHash("0xeaf7ba4015c4ead595627fd8d9f2893dbcbac9c3dc28f69553d6e06adc6e84c7"): true, - common.HexToHash("0xd1af9b69c903636f8b92e7e620f7340e27d9a63c8869198bf71da9a83d9d5d83"): true, - common.HexToHash("0x2ddbe84b50e8eba49c55c19810ee07ab3dcd385dd6bbd9fd3cc610cec768b115"): true, - common.HexToHash("0x8a0fcc603a22d3c1483d7ef435d314d18247b9bcba4b151597ebab25ad5c4596"): true, - common.HexToHash("0xc9674427c5f3ccdc0fc80845940cd46f62bb98e0812a186ea6d213160bcdf87a"): true, - common.HexToHash("0xf39a09db47122e46ccde07cf6e0cda124e3f099640640de515d51c4cbae6532e"): true, - common.HexToHash("0xee44ff6078a92c51ef8e6fc62861071cbd19937c986af1de35c645774ab9ea6e"): true, - common.HexToHash("0x7a6b110a5fed00dbcbf9204e16186604eb1cea7627388fea484304b69d208760"): true, - common.HexToHash("0x6d80b0868ed39790a1e8ce533f920bf4431c5efb463283fb1e6e3db483aa3a5b"): true, - common.HexToHash("0x898728adfeb635b1b2c228829fad94f9d08e14ded11fa52e6c5f0279155e80ae"): true, - common.HexToHash("0xa720e1edad89cf97c4b96f92cb9385ee89ccac600f541e608c34eca7ef21ffe6"): true, - common.HexToHash("0x1c3549cfb4d6e261511cd33c5897b782d3e7b9d4fe8246bb5cb3bfe20bf7ad87"): true, - common.HexToHash("0x7d30066f67cd062e479eb6dc0daef05f3bc2b4ff39cc141ec6360c29a129b249"): true, - common.HexToHash("0x4f0a75936032da1e560bc6502f0d908e9e97a093396c8d8fe06a21fffe1169ad"): true, - common.HexToHash("0x1371b38e04ed3b73d736cd42540f4a6544d48ab1166e8a23bf2ebbb35176f3fb"): true, - common.HexToHash("0x6796e6d6235b1d01994379f07045f3f67c3a768ef3082e8c719a5027b4ccb546"): true, - common.HexToHash("0x660c61f3313daae83cc46d7f781faee2ff02ca230f4b8900583517e9675eed05"): true, - common.HexToHash("0x2e04a4d6dc7e78d5914d474065274b43b0a3ed9c540edf157b8310713c08999f"): true, - common.HexToHash("0xb8cc6aa7b230df1f910b2fbb0f2699223a81d536f9c6de8dc43297ed26e7c7ae"): true, - common.HexToHash("0x262727f692405ca9d440ed747a8da4e5923b7bc13df36da87d785f8b0e4d89c5"): true, - common.HexToHash("0x7da2b3c27b527882f2ee65d300268178c61611f2c20dcdf5b504b6d8a577a6a7"): true, - common.HexToHash("0x1a4848207f0805ba3b040aa94352881bfdcf783f42d5230b11c8ee616191cf62"): true, - common.HexToHash("0x8815956417c912c0a9e8ab90a8df58f79aeb3de23c3534c43864b75ae2c109fe"): true, - common.HexToHash("0xff2804fa04a6032eebc5b3800d7a08a743d9bf2b2a6716e255c3efaea1248a65"): true, - common.HexToHash("0xa75e47050eedab570f7c9538a8b581a8056ed393f5b1ee29e038fa9749a835f9"): true, - common.HexToHash("0x15dff80109db19f12a92afc6c1e9b85156c910e35c20f49f1e181aecc8cc8dd6"): true, - common.HexToHash("0x8ffc6c3d8bfecc14bdab28639d005f2895f6720a400d992611f85ab88bfb3508"): true, - common.HexToHash("0x0928a96bb167d3f54af596dec6b9f67231749d20fdbbf322c8afda46b3ed36de"): true, - common.HexToHash("0x68180b1c90cade6b28554f3acd60b05b10c84c62f5faab6098343d8e85ef4949"): true, - common.HexToHash("0xd3461143aa7ec0152c78788bbdd06ea845e9aaa520ab07343c7478db7b6baab2"): true, - common.HexToHash("0x49b8e8e2e4110fc38070997f774703792a03010a7ce07ef211b1b1ac0c38e0ab"): true, - common.HexToHash("0x8cc23eb198ee1cb8d2ae27be4ffeed3ff60158ba33b7ca93a0fbcdf9fdd0c415"): true, - common.HexToHash("0xbbbbc06bb3f608434cc11538deebd78754aba8068ad37edf4d0cd7325380693a"): true, - common.HexToHash("0x22fccab8457bb65b214e4ba6054309eace3bbd01981275f5dcbd6409bdffc8ec"): true, - common.HexToHash("0x7d2c7d1363beee70babdb92f4b6c1779bdaf34bff0297bc54af198e4f2f09f01"): true, - common.HexToHash("0x50195d3318b2aef28fb432df450c990d33fa15918a9918260df9a1c5de3d6f19"): true, - common.HexToHash("0xbed833c958482d9ab4a2afd4100c2b33b407b110ec0e123e2c14f08146365d78"): true, - common.HexToHash("0x3a73c03322fa02cf33095157246b5cda427b8cb54f3eb221b886f2980e3d7917"): true, - common.HexToHash("0xf974be5b2e2c493a0e8a57a156a19b99e652f8d15c981d4a2b9e2a9a6b5f4b27"): true, - common.HexToHash("0x88f6c0a720b6ee4f9489ab30bb28a94624485372bf8798fb3eb5798320699e05"): true, - common.HexToHash("0xeeaf84da422b7456666cc60b63c21e3a592dcc14bfd28d8136aa26f23a4749f3"): true, - common.HexToHash("0x2b9d3d965e8f3bd0db272a420ff9a70a19ab883576bf6a406869a9dae8d4b18d"): true, - common.HexToHash("0x2bdde15702114648c9f7fbbe3a316bdda46eb652f94e0c9bf34bb93c22480044"): true, - common.HexToHash("0xdb3df111aa232067562faab8c8c5b88b08a6391419442a3f6056dcf129955f93"): true, - common.HexToHash("0x82f1100488a731f251efc7d281ff1a7ff44a8971a85ed930d9ecb863ce4520eb"): true, - common.HexToHash("0x48abc4a53cd740bf79fefc62f9eb0e54fcefeba17fd61f80f1f443cdbb2263f8"): true, - common.HexToHash("0x4327780c516940ee1e2b03db13a534e6fbeabc4c14de977adbda4e61364e7a14"): true, - common.HexToHash("0xc6931a86254b1226a1af0368959c59d1346b81b243c14687370374253dfb8dd7"): true, - common.HexToHash("0xf05d2579c3fe8fd2b6bc563cd6ec6c882d373c6edf48f03f857e15c8a2b5f4ff"): true, - common.HexToHash("0x3d2f1079227ee57217d9ff2459866a9b7ebbd585fe68eccb5e0d35427bcb6d22"): true, - common.HexToHash("0x2ef025900adfbe5e571875fb8d9c68e7282a697afa317002579e63429cf7b4bb"): true, - common.HexToHash("0xab73a5bdab85fcd1c5a0ef55e1bfb8a0a1f7e9462ddc960f5bb42a4abe564e6f"): true, - common.HexToHash("0x55c1552f8c6c3a7219b61975d9d3f3cdd1f62f8f9e96058edd22816e7c87d555"): true, - common.HexToHash("0x8bf30177801ea6e41120ccbe9735872067738bc492866430c9a65d85f389a16f"): true, - common.HexToHash("0x78a8ab819a392083e9680c33fabf3ccef2dee174c534455ff59050192861d487"): true, - common.HexToHash("0x2ba904799d897512afaaadcd85c2e11b3675b8dcf6e6414733e3a3378167f2ce"): true, - common.HexToHash("0x6fabe802d290ef68e711caa00018a228b9587191966489a1f3ab9b1e6d67d7f0"): true, - common.HexToHash("0x79436fed2fe0373eee9b2795893e7f1e68144dcb381413ca561b2cc7efda15e0"): true, - common.HexToHash("0xd29f95616da2586ba3e9e4988fc7e341dad67b4a0398a8750b25ea32cbb93234"): true, - common.HexToHash("0x61508f6efe648f4faf57b05bb82b041cbb6389b06f480cb203571288b690c002"): true, - common.HexToHash("0xfbc5d879d69b83bec8e287c0f78048c5e7c015cda6f4011f4f5e024a1aef7c8a"): true, - common.HexToHash("0x4e1d026d7475ec79bc2933c73027bfaac0eb082fa43586247b6feb180a2a4f23"): true, - common.HexToHash("0x23bea8b608b66268b1140a6fce1bee3e54abee55128365b4988e73feaf9ba71a"): true, - common.HexToHash("0xee6a2e30441f26b6c5e9c7cf2fb9b7b56da9794acc2fd8caef346f36b7552052"): true, - common.HexToHash("0x1b0e4c7d5cfbc876828e4bf007966f32e69cc6369ede75dbeebc914cbf96d164"): true, - common.HexToHash("0xed31a6bd1fe765e4f6324c29b2e310a237537eb7d7bbdc6d2e10fa3119e44732"): true, - common.HexToHash("0x77f51e859611835ff2ca4adfe4b945924ff4d3b20884135e2c4ddb282fcb7029"): true, - common.HexToHash("0x7e7d78fa3c75cd4b1a9e267c01a3c04bd3b99c09f237ff85fee28e4c6c1a7f42"): true, - common.HexToHash("0xaf4e302af74f190c81f188e184d1347ceaff52b01a91b634c81ab596e733bb17"): true, - common.HexToHash("0x3a14c10d07bd3480685e4d0c186571ce8553a317ff1978d406122aa6992c19e1"): true, - common.HexToHash("0xc02cfaa823e41b2e0f0186c0eae9f15726b0aa8c66dcb862cc6ca597895c64fd"): true, - common.HexToHash("0xa2904a3b8b1f45f5a99315fcd47bef304beeec4af439010b702beaac0cfcab64"): true, - common.HexToHash("0xffc034e56c3f0eab661a113df6c8ffd61101c9c9b165998cd6992191d3df88e1"): true, - common.HexToHash("0x1714d60762bcf2f29fe1cfc2acc7979aa704cfd3aab910ff14444f1d7203ef82"): true, - common.HexToHash("0x2b3316589a474f2e1421c0206a7bb262aaa20db56dc4c23ff78ae7755569257b"): true, - common.HexToHash("0xac78aa3a765d1e066917eb2690abcff01a89c5e0f726b59c6fa382f57907b26b"): true, - common.HexToHash("0x415b3e3e83f082d0107c29c9651d71bf8df9447121eac5447f2e516a043c80ab"): true, - common.HexToHash("0x067bda44d850ac6fbcc8d1edd0605010ef44046cce00bf019d830e19a82b31a0"): true, - common.HexToHash("0xdc30cc93286884b92f493b253b85e2342f5e335483eb9e8b59d1b6924d0bea01"): true, - common.HexToHash("0xaa4e995922f19cad662eae466ba8b3ef0d817c5058b018c9b349b66156a9070c"): true, - common.HexToHash("0x84376ce4bb38b7f37816b0c6e4574b581c685872d163e3d2bd298b14282113b3"): true, - common.HexToHash("0xd65320145fc56afef8e4066bf9d20ad1586b359666ef690f06594912e4be4ffd"): true, - common.HexToHash("0x61a085cc482fc9bbf11eff935f25b8b190eb82fbeae46d04a1d61430e1ce4aaa"): true, - common.HexToHash("0xdf33497e25ee86b0da5bcfd324a22c6fca70d94b7f99ae569c21509dfc5e9874"): true, - common.HexToHash("0x837b4633fae98e8efd308c579a7a35d9926a66e51eb9e58daa12edb8998bd434"): true, - common.HexToHash("0x2448742e41ddb9b0cd9e3ea2472f08c64074f47696ed94e749d6029c3b450d12"): true, - common.HexToHash("0x2540f12c2b0b73d920c5a1b0df5f0b26791e06eb6e2687fb095b03ad320fc25a"): true, - common.HexToHash("0xb6b5be6873607e1eb05d377d3e03d5074a9f93a375be729c09f414c08be65f63"): true, - common.HexToHash("0x30852cd085b355d18d4bdf61a4aa20a6c9d2af5018d9c095a694cd9382155ee7"): true, - common.HexToHash("0x764ce52459c57d95160ffbc802c0346f4a7fc6a206f4ffd6709669bf99e34c1f"): true, - common.HexToHash("0xb08666a203a127e10019bf3a58ca6442274543b4f81be1c790fd47c870ec10a4"): true, - common.HexToHash("0xa625a1f5386504315a3833f1d4a45e3b968aa62122190144911152bb25a16af1"): true, - common.HexToHash("0x82c4a4cb71eac2b6fa4251a63ec4daff1e31ce0763fe34e22a67bbf66bececcd"): true, - common.HexToHash("0xa5e19ccfc7232ff8ef331ba9e5711e04395657764e861d71868656c2f47dba4b"): true, - common.HexToHash("0x713e4a420202037bbb11b5fbb7178a996618b7898032db58e935399fe7c8c858"): true, - common.HexToHash("0x95f8a370c2bb219c8196fc4567df62e64e3045f9b40aedbab7e3861b30f4b9df"): true, - common.HexToHash("0x28c0b39e3665b2108ab7cdaa0dde73642ff353e7384e99204853ec3ead54153c"): true, - common.HexToHash("0x66b158dd3a3337009231cf23ad3c41d119b0cb5092ab2f5ae21f81b82bc74501"): true, - common.HexToHash("0xc7f518911474b247f970a7625b427d625f989e0ab80ea3fe1a1d4f89ea1aa5e7"): true, - common.HexToHash("0x397e1250137333554c8a6974883b214b2c4531caf5d8163255aaf5f819281d4c"): true, - common.HexToHash("0x3784163652b1c2f11549956cab648365c9242dc7f72d20c20bef76de13ebfdc3"): true, - common.HexToHash("0x91d9817013a0950ad2c5f35932753d4eeb109f3bc578dde6959a0d1f6f07d07d"): true, - common.HexToHash("0x306e25f3fae8174d9ca1a46c87d38bd15a71a42f701ca1bd154372dfa48a23fc"): true, - common.HexToHash("0x637338f23673f35b4c1b365a8bb182c36dfe1fde1007ded58d3b26bf160c5e28"): true, - common.HexToHash("0x04aa70d07a397b0c7b316caf994c9759bfc47666752337a89bbfcc5c7b83e9ab"): true, - common.HexToHash("0x6c5b198c62d6a9374305321dedff55de448f5891cb9611ccd643ca40f87a1323"): true, - common.HexToHash("0x0abf92a4ef432f51701b92855bdc12932714be1360bbbac59d7eb9dbb8db3a45"): true, - common.HexToHash("0x5cf2beac534164333a73af7ea538d55a2a16e48a6bef139bbb55ef20b07aa4c4"): true, - common.HexToHash("0xb74cbc037987a006c25cd8eeb8a5eccd2a75e7dd25644d733b6d673bdee747e3"): true, - common.HexToHash("0xb75b5db95833619c04c3251ac3b0574b5fff89b1d98b96cda41e54100d477d35"): true, - common.HexToHash("0x4f936c8325f2a2cc5be6ecb1b3fa230911a5e4b334ea0175beb20bc93ab2f862"): true, - common.HexToHash("0xe52a456afad03383b171a490a33cfd254ab8442bccd83baaa775c1972b54269e"): true, - common.HexToHash("0xda214b18bb413953aaa47081ccc4f5e1ce34fe6f82aba18e2101d4ac5d64d09b"): true, - common.HexToHash("0x965782117b08c697fd0ba299a0385212656f34ba4759de1100291b5781f8b80d"): true, - common.HexToHash("0x4b97856306798f94d0a999177f65e9146d10009449981b28b071e038e6ff32a7"): true, - common.HexToHash("0x3700d8f3404b041df56c84d7257477b422c3ab497df8e34a0c3bfda2ec047ac8"): true, - common.HexToHash("0x9fd64313366b3cecfdaa2b45bd2072ca0698d68ed9c471f20e87b57db19f3824"): true, - common.HexToHash("0x411f7810b14f95aa05d40da1de28d1c5d71a56a35c8b0324368a04c20da50b87"): true, - common.HexToHash("0xba6942a4a735d57826326885571d72f47d18544051cc8c1c4a0ddee6add94266"): true, - common.HexToHash("0x0c814de4549761fc5b479583287a6179ef7199c3b5ece045caae21623b22e7d7"): true, - common.HexToHash("0xc7003b287606dd2f57ebc652a3654a16fa26783b1d99b7a7642c87f28b1b22a8"): true, - common.HexToHash("0x85bc9b56151983ef16d3409c09b8ca61fdfd6c26f1e3f0bb6d285cb0120cbc23"): true, - common.HexToHash("0xffa7d3e16c3a3983bd221384e8a772f4ceb9b5cb284164e5d1c0b418e1b58d3b"): true, - common.HexToHash("0xe78a9e1f8e368e35616fe9ffdc8517a9120b7c5c8582ea6b8bda2c7fa79307f5"): true, - common.HexToHash("0xfe4cb25bf3a58f7bd8dc1a8817baad3923f12c7fd1075c6b4eaea2fd922981d6"): true, - common.HexToHash("0x3d0b76d3972c530bbf9d71d72ed33197bf5154531c7d94bef779b5d3b9ca84fc"): true, - common.HexToHash("0x011d3b49fe83eeae1bca3247679bf3ca9e811ca03296c9ecd1696497172bf578"): true, - common.HexToHash("0x10af6c7f89e5bfc24deb697e090751aaf489a1b37d7c7d9a0fabd01f59baacde"): true, - common.HexToHash("0xa87b9d4be651cb16f2703640cae8e8ae979c0f0afd6898c7ef5a2223960ce794"): true, - common.HexToHash("0x8d25c2031e8f3ff51548bd0fdb88f81a0d3436d11751f4dcfce776574d4ffe3e"): true, - common.HexToHash("0x096f7c5ef28fa8f2606b9460a067f8af43fbe2a2b59634355a950b4f894ee967"): true, - common.HexToHash("0x91d6adb439ea2fbf863939ca2c5547c1e0e5cab7e2743648ee57082d3b6a4930"): true, - common.HexToHash("0x17c17dcce06abec883930ec81e13c342291dea37f881a6e2ee653945e3443d83"): true, - common.HexToHash("0x57cd0e29e42cba892c5131c360468d057a7b1ed14a961b7a1a929783e1478d49"): true, - common.HexToHash("0xfc6ebf8eacd35e91acc4e75fd80d386d05a6cd54226c547b1d69047ef8b114e7"): true, - common.HexToHash("0xb87d48762101425130e72a16e749eba52d90746fa6d6690cf69c672d41de627f"): true, - common.HexToHash("0xa5a98884d55abbe99bcfd4f6d6b0610dc871f50cd9d235854979c026973ea7b9"): true, - common.HexToHash("0xfe7203d54a214ad9eb67b869e3f3f011f391b53f8e423d5312f29c32bf7fc3a6"): true, - common.HexToHash("0xd57e7d69314344bb74337db1fee6bf4ce517fe1b3aa4dc58e5a925bfcf2e9bc1"): true, - common.HexToHash("0x5fd6ed365dcbdba9539afaa0279262850486ddae72fa5d4e35788a4a823f9cad"): true, - common.HexToHash("0x97e3bc578802ea8991010551af8ef084d3d25fbecf51741469c399758ed0d6b4"): true, - common.HexToHash("0x23638a8e07213f8cd85f31ffc591623fb223a03a4958d8d3f97814d632cb6f64"): true, - common.HexToHash("0x560c0646ccd436b6544ba30dddb2437296e9021740ebb51501c27caf3f765628"): true, - common.HexToHash("0x8016cccf7c1445398b70cff74ffde1865433927f5e576b0a971a5b8518f4bf48"): true, - common.HexToHash("0x9375e7f5bd53513362eea3e2d3be54f79df31213a8bdd05be9bb545b7df34fec"): true, - common.HexToHash("0x2437406686fda2e0f43c08dbe3ac139aebbce281da17023fe6dde759763c6243"): true, - common.HexToHash("0x55ee0cf82fba56d686c9d6934474ef5d667d236467e9202ce5d3b71271a47e79"): true, - common.HexToHash("0x8b08df4cf4b74000bc2c86c5178fa37b7def874a41e2c3de973c53501bafce61"): true, - common.HexToHash("0x479110e811004c158fae8b35e856cb3745191fa065d262eb3958ef8c2684c1f5"): true, - common.HexToHash("0x13fa44072c313465670ca7e188229e844f1fb64b1cb80b2b1072d8d3508dfcce"): true, - common.HexToHash("0x98136db79faeac93bc9c13d7b4b0ebb0cb95e2854ec3096911d921ed4f0d6c62"): true, - common.HexToHash("0x6f2d062c324b7919b46bfdf9e1b48e73ef50ba91e0283acd1a74cf895b228d99"): true, - common.HexToHash("0x6c9ba57b8ec04b773babbb5f212823efbacd6a987e9a8c8fd99a08abc8e5c47b"): true, - common.HexToHash("0x79f45bb907b325497d2ef07e08751594c036416d5cd546972c012aeae1148c0d"): true, - common.HexToHash("0x47b9200af3b3e1b2d985cf70be81d64fd473e215ff4f919ca6c1a5f8a9a565c5"): true, - common.HexToHash("0x5ead621c4f6052d7e05f66df8faef9db9baaa1140873f78d3574c58875d151b2"): true, - common.HexToHash("0x374a9f7b4dfe5f7cafecee73cfdbdd8b494adbd35e266bccdaaf8032cf4ad7d7"): true, - common.HexToHash("0xa973fa2fc0172aae14d498902b330e596886cfcade5abeac99c41318e2e0dd3c"): true, - common.HexToHash("0x5e6c5ac1396d7da45ab9257f872c6b5be8cbb1a3b4288b6350ce21efc6a83e0a"): true, - common.HexToHash("0x65ac37b153126e62f20d48f13f66c2e43436d7df1e692cdcf1625b61557e5af2"): true, - common.HexToHash("0xadfc8460d61591b2794c0034099fea0d1951eac43d31e504ccdc0d56faef38bc"): true, - common.HexToHash("0xa2edefde6ffc578f647787b2765612965ebc7f2e7f5ffbe32fe0829d535af902"): true, - common.HexToHash("0x6959bedc577eee28a84436cd86853c122d16dd7ed02e7e3e87967e4f6533425f"): true, - common.HexToHash("0xc49ff9685864c39b73448b18ce020a5a0df499a8e0243687f6b841feab25c776"): true, - common.HexToHash("0x53397119b4d98cc7d877dd6e5575ecf725fc15de21cd68e52bc524b88ea60b56"): true, - common.HexToHash("0xb6c80d673d36825d6553ac92118d10a720b7125f9782d485357d00faae86e121"): true, - common.HexToHash("0xf93e3ad7f66f822e15379aa025791cd30e79e78ffb5eeb30e89f9398971eb886"): true, - common.HexToHash("0xafee3f37cb5c7a5cf8493538ad4dd4484c6d66eac3a2caa035c4b01421055302"): true, - common.HexToHash("0xe70e21d3b89bbac62ab7a35c128bfd953019f2c797c696ef7788401137cab07e"): true, - common.HexToHash("0x7757d19b39ab8e0c9c1c04089d9a189151e52885d88bb477f1d1ca705de2aced"): true, - common.HexToHash("0x222f675fca2605791a3ee5c0bb4d51336d38fca1abd3ee0fa451e9522ad087f5"): true, - common.HexToHash("0x3e487a7a0cfe19f471a30101a3ca25dc116a057466f400aa54418db8ebabd062"): true, - common.HexToHash("0xaaa046b7755351ee3ce4a8174b888ceb66e18e5603275c76df550a016c631c6f"): true, - common.HexToHash("0x94565b298c39009b9581798332b170d5f453d837386aef53c0a6e257e9f6397e"): true, - common.HexToHash("0x89e6e938eed64568f01649929b3a23bee5e420d3c6f188c2e886815f77cbe8c3"): true, - common.HexToHash("0xfbcc734f47c87527ceb2fe823f25f25fd5c475881ff1dc145f1cd058295b026e"): true, - common.HexToHash("0xfe23733578302ec746d59d7c414228706804346b80ff472fbb38495178544645"): true, - common.HexToHash("0xde067cf611d8052abe7a3576d3717cf4acd60e07d82bb40ca2da4f611466d1ee"): true, - common.HexToHash("0xc16f9e6ff6ade909b6bc7fa53275d27d57068ebac8caade9ab09fa98bf4f033a"): true, - common.HexToHash("0x5bb73b8a6a829bf678ecbca6efb9eda3bf20a3290e5574877231528ae1e4fc6b"): true, - common.HexToHash("0x4acb8174dfcbc25082b288bb77fb9d1c27ae472df67115aa9823959eeda0aee2"): true, - common.HexToHash("0xbd22699f33b083919658b0257a71d8624137410e6c572abf7b1d8b4f92ae573f"): true, - common.HexToHash("0xf673e3a1999d5c7b4dedb743117ef5f2e3f08b2651e09c3ae1a1dcee4a0cd388"): true, - common.HexToHash("0x73dc0f1728cded570940b8adb2c223b6dd6b409a36b83a24c5bc799dffd67eab"): true, - common.HexToHash("0x196396ca948d2c2ebc8ee185de26dcb9bcffff840bd321efa7bf9f7de23a634a"): true, - common.HexToHash("0x72b31b1ef325d903b6ad77e1a4065843fa180f6b1bcac5b987dd835afa54e27e"): true, - common.HexToHash("0xbdc9affe19441b6477482768877a33a283a1315e4e2a44f9f68bad1a181d0f3d"): true, - common.HexToHash("0x9a09518fd1fb88178f09778670abc99b657d97f1d58185e19bc2f6f61c37c041"): true, - common.HexToHash("0xebfd94b7a8962ff1f782f5aa0a479a7d90301a7e9d775763af8e803458fefde3"): true, - common.HexToHash("0x63f8c7d8cb3ff85512012d79b82c7dd02bfe8631c901d29a400302bf74d64a1d"): true, - common.HexToHash("0x015711d6237032fc6d57a85f080da630077eb50c779399ca1795aef7df50d954"): true, - common.HexToHash("0x6b27dfdc0dc8879f9d020dd2aaf436d5d33b7517fe7400c0451c4d2eea953e0f"): true, - common.HexToHash("0xbb2f6ef6e7ef9120ff93d6cd7ed00ac3de5ad4ea982f44b131ec0b043b9ec38c"): true, - common.HexToHash("0x9dbaa0f60c5641acfebe91d3308fd17d9519fce78e50663837937e2a058de347"): true, - common.HexToHash("0xf18c0712b9b0deed0c482111961d0e22953a513e47ab2c2336e6004e071dc430"): true, - common.HexToHash("0x7b4913fe846f00f551480ec579eaa7889e9940a9e86b2b54a05bfa1ade35239b"): true, - common.HexToHash("0x3e81bd7e60800d987330a2901634c032ad74a32607ab1c7c86a9131934e7c5de"): true, - common.HexToHash("0x4d19b1cc282a1989b0f7754f1919c5de6b646937958b820159d09e04b2ec3715"): true, - common.HexToHash("0x2b4c453cf4006390f0e627498b2ec2136f82940da5fee624efb3b328d06f3b92"): true, - common.HexToHash("0x3684212c333f58d6cc227a4d844b8fc105328de2dc52e7f74dc99b341cce64ab"): true, - common.HexToHash("0x4dea4d61bd325cb9460bafa791b3902816719b4dd1d8c34ee16c0a6a280258ab"): true, - common.HexToHash("0x24e2af3cf8e97165e34c8be12280dfbed00b939627dc6f921c54c0a61154eff9"): true, - common.HexToHash("0xda60df90faca51101462d3f2c1762b9cf3bdd859cb175725871bf9c37c34e0b3"): true, - common.HexToHash("0xc9cbc5eb2bd8fb61bc63c6b437ab28ac20b3d45c566b2219f6c241eb98283c06"): true, - common.HexToHash("0xe073508d2f6f89dc49208d2200d0a5c0cc8990e95e34d43fb234829cacdc789b"): true, - common.HexToHash("0xe992d3826ad40828dc92345aea6bfdeeb19dd7f63106884c4e7a15b764ffef80"): true, - common.HexToHash("0xd3e3789b5fec0263577772ecd5c7d85138cb06dd049328ec3df9dd59815ae545"): true, - common.HexToHash("0x3dbe2ad0468603096f2448a4fadfe792c03ad04321fd66b7a95e7be631f36815"): true, - common.HexToHash("0x79cf3a8cfeb37dfc69cb6c04243cc2ba75008bc621b3438555bb1d035202bf0b"): true, - common.HexToHash("0x2cefef9f44feef5cf289751bf8f95a573b1ce88b652da6f00dd996e8212dde0b"): true, - common.HexToHash("0xf7d307a1e6876bf26aedb03d1e289cf4a1d463fb4ffc102c5e268be345e30e21"): true, - common.HexToHash("0xf6f23588c4abf07d896d24c15c7e438faed126c9304fe3ded48ed8dac573ca2a"): true, - common.HexToHash("0xcc56f7e9341c80c00da272d4ad7ed0f25349f273b635bdee9e93acd57a3ed1bd"): true, - common.HexToHash("0xbb6bab2008851a7b465b2d293c6810c4a6f345863d5f15fee7baca78b91299b2"): true, - common.HexToHash("0xc4e33496cbab3adcaa7f6fb997cd60d0d5d4e362c6c8f59b460f57aa56d358dc"): true, - common.HexToHash("0xe15295a53d6653f1f39aaa2640851f513512f5f8c8be26cdcbc126d1e54c78dc"): true, - common.HexToHash("0xf34f434afe1dfe623af8aef3f02f572121d46d902934f2f1be26ddb2425584e5"): true, - common.HexToHash("0x53c51474d9346ac8235771d2c76840e9dff9f4bbea9ecd1b16808d5436e31fe6"): true, - common.HexToHash("0xdab8c8a3299623825ecde97dcbce841c7a545e5d109dccfd56bbb0d540dffa44"): true, - common.HexToHash("0xf46c94255db2eec3e7155511600b646d967b5f959feec9fcfcdc7ddc6e0c8fc9"): true, - common.HexToHash("0xd5ce592422584e205215ac29d3db9dffef3e39e3e54ecb83b7496484f8743085"): true, - common.HexToHash("0x4af26d830ed7745669cfb1dd785b45cfd49ac363f0c8d829798b5cd713e8c33b"): true, - common.HexToHash("0xc6104c706c66697ffe82801ca9ddc3c4e9aedf3da1a20e6952f864a97d84b599"): true, - common.HexToHash("0x5422378c3268bdd46894dd04419715391689d62e4c6ae6052cfd4de4e0b4d83e"): true, - common.HexToHash("0xe7428f6b680d999e0b4d65282a4103519a067dca8651d575898a1b975d5ba45e"): true, - common.HexToHash("0x80f36a4c4b1a9addb2a3b20c9a10de77579ae1d09ef13eb8fa37ee9db34ffb43"): true, - common.HexToHash("0x9740ec382b3775c259c3e35e7f6f31383baddf36b5dae94c9f74a714308a0473"): true, - common.HexToHash("0xc0f11dc8b6afbd5129cb01a31f6dd06050bf0aae5660644be2c7e7ed24f88918"): true, - common.HexToHash("0x9839aa47aac33f1478052ad9acac4f4be8f3a75860fdade78a59114e281e0a32"): true, - common.HexToHash("0x70d74500fa202644511e572d8b040b23988e16c846333d88d3796f39754c6511"): true, - common.HexToHash("0x0d9138afd7df810b002b55e2609a34334759e89fdea55af42b2ac4c6a258574b"): true, - common.HexToHash("0xc287c48ae2bdc21995febd84e9bb90d641e36528091eb1d46fa92d35138e220b"): true, - common.HexToHash("0x0c8c813038449f50c5000f1a7e2426c66e689a8cec03b1e723ed992f542b7cb9"): true, - common.HexToHash("0x6817020df8b49708edb8299501b4e21efeec88dc50d59ba43df40d041bb8c2f0"): true, - common.HexToHash("0x34c58961b0ec0b537713736b83af3de06f92239997b868cbce0a44a6b0bb22a6"): true, - common.HexToHash("0xbd6171572d7e2ca338e2dd67e48f7932cdb1482dda2920c5c7b011e7f3592e9f"): true, - common.HexToHash("0x56368e2df1d1e875bc6cddb15b1fbb1e534bdfdb1ab0738dbf2837dfaaa3cd62"): true, - common.HexToHash("0x9040df7c0dc98f6d4f92891ff66812b24ad2788e80801f4ad85457eaa54ac280"): true, - common.HexToHash("0xb41eecbf5f15aab217e04c268473e5448c72f59a997714195638dc7982c45bc2"): true, - common.HexToHash("0x6293ce4275d1956481f451dfe9a91529a343ad8cc5c436bede1b8d8179fed22e"): true, - common.HexToHash("0x6b7f695184961341eb61f758e5b8b0fbba960f4ae3b9d301e731c435d6e8e597"): true, - common.HexToHash("0x99bbb53d74e970d8da6c8deb74ebb1f6922eedd81eec293ce857ee699c06d201"): true, - common.HexToHash("0xae94468bc57ef3fb18e31943687d6240a66cba016b2f42698202fb90cb4fabc9"): true, - common.HexToHash("0x037ea1ab177555d0a17ca152b8d633d621e73a1da3b1a01f1e8ddef813cfa52e"): true, - common.HexToHash("0x70fc68f1d4fcf6091458f7cf821b496012cd6f135236db2fc2985687430cc4d3"): true, - common.HexToHash("0xa1a87b2f2152f7a063e49c9ca3a54f40f6dcc59ad03e651d59ac97d72692ea4e"): true, - common.HexToHash("0xf7ca7cbbf00baa8ed6bab4f6969fc9b598588555120fbeb658d1a48e7213604c"): true, - common.HexToHash("0xb5c65a68da4ddaf9ecf7cf8da2a8876cd5476baa3fc5dfbc8947c656da4f9eac"): true, - common.HexToHash("0xed3975555575afc2bd90f19f276c033d3e12e8d9a54239ba1fb4fc7afefcc2ac"): true, - common.HexToHash("0x75051c3278d67bcf1a6104432200fa926e3027ba0487a4cde6562becc7cd248e"): true, - common.HexToHash("0xccb28dc6fa01fb970277279aa3e4ec7f77ba56552183245353a6ac3d85972ea9"): true, - common.HexToHash("0xf1ec13bd54f7964ef24000647efceee3add2622b7a711bf48c31bd66df0dc0d3"): true, - common.HexToHash("0xacf70b1bfdbe45410bd9ed9a08d4e00c07bca299163ce6ae697748e50774296f"): true, - common.HexToHash("0x72e02662fdeec517e4683c103cefd84090c92928b58405106069ac486178c2ad"): true, - common.HexToHash("0xe58ee418cb0cd4aab862f429bac34985ec3f3374d686cbe5476b4426fd081cbd"): true, - common.HexToHash("0x30555e8641263fab2e0cf9416c9b1a3e01b7fb90a33ff3d79a55673402c58804"): true, - common.HexToHash("0xaba4e0578d3f7c4affe811f7e39d7cd556ba0d2dabbfa7ba2a61e813cb0f1afa"): true, - common.HexToHash("0x01cb3b289623a7de7a57a7db2c39278f8610ed3c5c74469f84081c78b2844677"): true, - common.HexToHash("0xe80a2285a925751203d4151871e300850509162e09a6815d7feb2597e6ddbd3e"): true, - common.HexToHash("0xde043c6b7a505d572b1ae990a095d58aa41e34e07c8d885eba2d37568dd116a4"): true, - common.HexToHash("0xbc814d7b79a41f18d6fdf0447154fc19262fa7c1d8af12b6c228abe26f37adbf"): true, - common.HexToHash("0x23001c3091e8cf410fb6151bd6bae7fb4945698a34fb3dfb672e903221d1e9af"): true, - common.HexToHash("0xad1db7cbfb8d9421eec3358ac4e1be1d5c0663cb1f41581b19cbf391cdaebc8a"): true, - common.HexToHash("0x7142e2643a496eac6b326049d9671702e3989050ecd6620c99259d9c8199d776"): true, - common.HexToHash("0xb2ee78716ee08a7a79ad1ccdcfe41f1bdc9c5d986e4c35aeddf87ca12405104d"): true, - common.HexToHash("0x3ac7259b284d0a705420112dea4512827585404e612c91800388f148286914ed"): true, - common.HexToHash("0x7de9e50266c9c701f36a758cc2178d6882a2018654862a78e3b01e04fdb83604"): true, - common.HexToHash("0x45ede993d127c5ff7fb1574b7821914c2fa210ad27511478eeca78a664b44477"): true, - common.HexToHash("0x9291dfc9fb1b0f53b256a2e16af586c1257a0e22de8587c8f9854289b99f5923"): true, - common.HexToHash("0xd70080134b65850e8c7b940c91b32370d8e4c6614f8f9a3847fea767fe53190d"): true, - common.HexToHash("0x2c22a096d4349ed7c42feba2625915767d9a2f4f2454631011d767c00492c24e"): true, - common.HexToHash("0xae14db947c57864dca03b5d809b3b3ee83f66836775aa74f10e33b148d5868d7"): true, - common.HexToHash("0x61d276032e30679c0fc68b47240aabc915de4f482644ead6b70b5e24ff1bea0e"): true, - common.HexToHash("0x47e968ad7c55eccd344a227f84e2c99b1419c9b731797f3e4e5d86df5da1e64c"): true, - common.HexToHash("0x18b7ad286b49210b0b233554fdfbc0858f402967ff73fd1cd5e0b6fe72ea9e27"): true, - common.HexToHash("0x3ae27678a02dd0369d7aad6de6f0d0d517bf935faf73f1a3d99dbada2c8fbd77"): true, - common.HexToHash("0xc818b302cb8f447f7c996759fe5422845e24915f8313bf187326fe15d32b228b"): true, - common.HexToHash("0xe169b03d637734de82d9ffc2612bcfbc39ce91b281ce68739f52ce8632688cc4"): true, - common.HexToHash("0x61eeb67c978367386141810b649ca7ae3af5c3cfebe3d6237aa31d68b68be1f4"): true, - common.HexToHash("0x4fd79f807b56dbc73c3c3bd011942d585f345efebb0cac4764801ae9040001cc"): true, - common.HexToHash("0x86f7b7e2d1cef7cb964622af5fc198316328ef7cad4b59e17cbccb074b47537b"): true, - common.HexToHash("0x3c52079d804a2eb68452f4d9817d119ff83b52efd1021a6dc96da1346ae5f995"): true, - common.HexToHash("0xd3cd8a3412a7bb0ec759aa3725ff3da32d20bc121a7fab765762776a3b6f7b93"): true, - common.HexToHash("0x52c63c8f8d33d9e413119d4eb5ea45f43cb09e8a17aec8106663668b07064ff7"): true, - common.HexToHash("0x1a8bbe7724978b1fbaa5479bb1908875a07c8491081f6dff0efae9a4d6a51e6f"): true, - common.HexToHash("0xddeadc024aa385432cf06717cc5dcf08d6bfeebfefec06d3309736ec1cbbc31b"): true, - common.HexToHash("0xb37b608b57a27721566267fadbf2fa00e3f1b0f487c8cc7ba27a354d8a356aaf"): true, - common.HexToHash("0x0d2db844f65cf6b258d8fa871361985320da553898e535a0d329d554aa1a67b1"): true, - common.HexToHash("0x256311fa181dabee50512b68d61dea6d76fe2e989955f315ebde9e33d985cbba"): true, - common.HexToHash("0x8cd4844739205f2f0f9662f2cb2e95b19f214bedcf496ec9bf5d4ee29d7a6425"): true, - common.HexToHash("0xe645e8ed1443496a02a58dc967aec2b87437cf20c18b8a1799a456c64ec0912d"): true, - common.HexToHash("0xb7d5ccae7939901d3ce7852794e7eb1564b8ae5c3455383540fc81746321ef86"): true, - common.HexToHash("0x3b18845b9349a6a5629fb7f64dd4ccdf01b8f239c65cde103b932c5167b4c6df"): true, - common.HexToHash("0xaeddc995a64427df2b5aa2848d1809dacfc8af9be510512a6d86964df7b54e4b"): true, - common.HexToHash("0x2626fe494a78ed5fcc52954b8a4714f76b30d28874fa96426c3b0ad4165bfdc6"): true, - common.HexToHash("0x2e11c6eb58adf56518af390ae20fc240a48f9a2ece2deb5ac521d2ee4f2f6146"): true, - common.HexToHash("0x09ca36d5a4658c3b7fdab8d0bb5486b575c0809861671fa6b0e297b7e3cac607"): true, - common.HexToHash("0x3ae694a1011e835284ac580de7b95fd8d4724f87fd6ae92d8255d45b9d3d8872"): true, - common.HexToHash("0x5c66e2cd2b3632e56ddd201c692b1c2ea40322e9f66183bcd0f3c820236ad410"): true, - common.HexToHash("0xed9867a95f52d15c95cb9554a5aff858f5ee8f52793525a5fc3c424d15418105"): true, - common.HexToHash("0xd620b5cc48aa241f4ea9948b1d504a6b128525fecc9718ad09354ffbd57a9785"): true, - common.HexToHash("0xd8c463135f7b4fd7ebc21093f4629e714b85fec07a117dce66b0adb9145fff4a"): true, - common.HexToHash("0x21675e1aa4cd50b8300bcbef964ff6511d2de1adcf666f6225f7f8fbfff65e16"): true, - common.HexToHash("0x9d7bfaed292f95cfb03f6dc034de5e75d5ce5f068f7f6c70b9d0663821efe9af"): true, - common.HexToHash("0x8a4d876a17011263c77d838c0c55caea9dcb7fece14a1f3c26b720a536721226"): true, - common.HexToHash("0xce510cdf32bb7ca3f2f93244fbbce260d2ec8ad14a957902b195430197932e8c"): true, - common.HexToHash("0xfc9ca226cb0dbdb121431e15ebe23a887e70811014fca5811eaab4669efe9dc1"): true, - common.HexToHash("0xfd752e016b1cca39da990ba5345da3153de0fc88870aa8fab340363065b90d85"): true, - common.HexToHash("0xac61f87114d15a34dfdd339b1fd3c42209a94191fa0c8b6fe8015ab99e750743"): true, - common.HexToHash("0xd0c5ce0edea16500c18c096d4ec1801e2ef77818d4e1952be54e8036f3a1b0c0"): true, - common.HexToHash("0x87793261ecfa3d797ee8163147ed36a38dd481c33ca1a5485266f34405c7d376"): true, - common.HexToHash("0x135d7dfb1fa281463f1a00717e85013a174c4b2d391219da1778c2dee22dc62c"): true, - common.HexToHash("0x21f0d166df908a7fe0ec1b31f7f0aadcaa16db1b18ed040c59843eded799033e"): true, - common.HexToHash("0xdf0977e92d851089e1d50e4db05e227a3dd923974fb2c1b07a1e74e3a9e0cee5"): true, - common.HexToHash("0xf963d805f71dd671424b53b497daebae583ba149d6ce33b9937a449551f34ce9"): true, - common.HexToHash("0x1f65d40f55da432b877dd1a781ae0165143b8efd2570bb7afb48850cd11ba4ef"): true, - common.HexToHash("0xce116ba3b476928836cbfd72f6a42b4ddc492451d01695bea055b6d3e501d377"): true, - common.HexToHash("0xf73f5a9140f76259acba5a9055edd29bf3aa5f28c842f81ef344db53ed5b11a6"): true, - common.HexToHash("0x0184d70380170ebb54e79d324a8f60e52ba2fa55a07a3fa040c077ffb5d2804d"): true, - common.HexToHash("0x295a3071a7408d53a0079ca9607c5f081b595787b6ccc408cb46480bcc509af6"): true, - common.HexToHash("0xdd10c02246e49d13bfcdcfdf62d9c0928693f4d233d7883c58869ee0d9811900"): true, - common.HexToHash("0x6118db0d7ddcb165ea8c16cb389f07ef27e26a90cfe68c8e0c84cf08518b7ca8"): true, - common.HexToHash("0x4e553e04de7c93f09c0e338518f880b45561cd2e948e305f0e244d2fa8d27736"): true, - common.HexToHash("0x962667e25199317f6600d09b1614361fd789cdffb415bfd14a9f248ea80404f6"): true, - common.HexToHash("0x3a25db8e1341a3b2edccdd1be5cb69d709c8149c3621d65fee3172b71274dd9b"): true, - common.HexToHash("0x5f4f88ebf082c55b66696d870968e1a85cd8cc7def8d62564ae4a38fcd8c2a66"): true, - common.HexToHash("0xea79592ad35e8b6a269ee7dfd1e2e50e2a08a2f784ca606237cd50809583d2d3"): true, - common.HexToHash("0x0e79756cd41a150c0bfe614289c3231f9496c22ec07181a5fb5426e05d81a068"): true, - common.HexToHash("0x736c00eb2697b7aad560124479a9e0efa50b8fec6e93690cbcd209f0369d18d9"): true, - common.HexToHash("0x9402549c35021dfe2ec686312331e290c3dbed1d63e5c43ff71ad9168119686b"): true, - common.HexToHash("0x1a7b81f8f962704955d6b7fb9fe0fb7b0b50eea42db84ff69e92ee7d60688d7b"): true, - common.HexToHash("0x25f12dc3caebfe7b75847a27729ec1cc6d6a389d2d52dbc396733492e1cd43b6"): true, - common.HexToHash("0x36b1b69a2c1a92738cdd712548263ea5e08fc5e5c26a6502988ea8823b54df41"): true, - common.HexToHash("0xd215eedeb8f74a0d30736ccf573824e35cd6a20654b359784649b52b30edfe51"): true, - common.HexToHash("0x2afe5c8606f805eb2316180ac701343fe03821925ff98530d9d199e0d03a6c08"): true, - common.HexToHash("0x7b6c4383738bf874c7c4f24aca2ab40b40f125eef432b5a83ce144d4dbf1ffac"): true, - common.HexToHash("0x29a9febed6006507b24042c31a88c3be16f779d661f2d8d9d75c655b55525d70"): true, - common.HexToHash("0xba7af688c88cdc41e499a56a5439d1a3d8c11704aeb5e17753c550f7370a3eb6"): true, - common.HexToHash("0xbbc3965413f8b2be346a11b8dac5fff4221a47c09f703bec61187b5ea03903ab"): true, - common.HexToHash("0x0a2669a6b7ca1876b987bcc8d2e6e8e997d1afe288ae891643ce86d0c3e86928"): true, - common.HexToHash("0x35f67fd3ee14c9823d2be6453d9c18d721830d3601c9d54a0a9f75e2fc4cdd64"): true, - common.HexToHash("0xe340da82c20f6936182efdb9fc208d3b3afc74faa4bd4214ea5dd7cfb6fbb879"): true, - common.HexToHash("0x92c5b4545a4437155a50936fa9c589d3563690183980038ab0b1361a591e5113"): true, - common.HexToHash("0x17d350f9f185bdf55151209da9b0f85912d101951814afe094b40b9aecc0b51b"): true, - common.HexToHash("0x05985c61186733e9fda2924a7a59a0350e6fbccdc7126d87b4219aa7f72200b5"): true, - common.HexToHash("0x75397c90092912ae11400d4cc23e1551a3529bf2eb4f1463d335f8922bce319d"): true, - common.HexToHash("0x20f6fd298b09a422daebb6df5f1660093d40e431d08f5bbc1357ee9733925182"): true, - common.HexToHash("0xbc9ab8da59436c3b0fa17244c144120e89558d213ff02fb6e7df840b7b11b350"): true, - common.HexToHash("0x09807bbb54eda123a774a0b4b120743d6b1332e2ad3ad21bb00fa84fdb4b4eae"): true, - common.HexToHash("0xb08da634d0b32853d3aab70a03a19f8168656205916af2a6b370b2e043ae4941"): true, - common.HexToHash("0x8f6039c1ea778bb092c21ed7230b06e5d3b3692336e2a44e19e7ab2d7f93fd0c"): true, - common.HexToHash("0x2af4aadb4171644d68652ceb9b22685efc4e7c72537b5d8fc1cd7b89994056c2"): true, - common.HexToHash("0x6953b8149a6a221d9da50909ca80080a58c8b04535d11eaef13fc3874cbd5654"): true, - common.HexToHash("0xac7ca7db89c9466aea21f26f142663d883589652b21147cd0caac5ea8fc69eb2"): true, - common.HexToHash("0x4d2f71a4c521bfbe90d45037dd6e34228a0b5358c7eef112f30ccef60099b8a0"): true, - common.HexToHash("0xbd53ec9d828e221cf9f617cc5aca4b6e33d8d1c87807acc9a596854964429342"): true, - common.HexToHash("0x51b2a238e7283ae52cca469fe6a24320a87e90b2587ca882372992e45279e9e7"): true, - common.HexToHash("0x3813e0ee55dc7c1a9d5b63762f623e79cb86f2327c118344f14cb13ee8bd8b2e"): true, - common.HexToHash("0xefbe528a68a49817da00840f996fc3ec4c98d5aa450701f9e8466435a1ce488a"): true, - common.HexToHash("0xd5be1d1fdc75ac9e714a6f2f1dfcaf0707004d1d538a7def51ab7e6e21285ab2"): true, - common.HexToHash("0xbeee1c79bfea811aaa344c8a8e48e7c316073db049c03bb0bd03139d52dc1323"): true, - common.HexToHash("0xc87bd845d11461f4cbb5e8946927f06bcbbad0d04592770cf17feb6a230bf965"): true, - common.HexToHash("0x21ce248ca06bed29b5d9c23e6bf3e621e436e6c0f51a130696d7410450495700"): true, - common.HexToHash("0xd3018869cf553e7143ebaa05b0b6e595ec3fce09309a3c6aa7ef569bab926b0b"): true, - common.HexToHash("0x3c3be31f83a2c9d4a364c6a13ca899c72afe2ae1289ab412031aa6d9f376b696"): true, - common.HexToHash("0x78be7ce90a5681fa038ba064a298aaad6a88b084596d3ebb3eccec36cf72a0e5"): true, - common.HexToHash("0xff848eba8c6180a3fe207b41c878faec6ac539e9298c19749eed737867564af6"): true, - common.HexToHash("0x35170018b47693a1e91f3ee146c09aca974306e94cfd77a353256d8ad5a1854d"): true, - common.HexToHash("0xf1339bc6f89f71d5c1d5711c7c5b2c53081122bb1dc16eefdaa33071bb519bfa"): true, - common.HexToHash("0x90c00570cf2c7fbb31595420dc524ed57f94c2a8d2cf7b4b6a440fcb1752bf1a"): true, - common.HexToHash("0xc70c9d394239c92a72f5862b745f48c53e56d762dab7c8113d46cd68406c6fbf"): true, - common.HexToHash("0x3ecf119fbc05857b4f84990730d88d84146f717d31377e8e18e0255987c96e56"): true, - common.HexToHash("0xa20c2f30622025e947a902a9afd53b18aaba37297c63b519d6073bddf1feba85"): true, - common.HexToHash("0x135e8e6e421f6c28b4bd2cb1c030bac3b6723b91bb1d770f3cea9f33e73eb688"): true, - common.HexToHash("0xc221f192490d244cea426a2ad7d34f84618b883aa3d2c59554a48eefb205b77b"): true, - common.HexToHash("0xa4999bcb694641afa349fed40ac5df0af2544e8d2b3d8f86f24dbbfea696ef4b"): true, - common.HexToHash("0x6af8eae3fb993dfa84db39aee5436f950e75f2c06f72e8c17ddfeab7f9025629"): true, - common.HexToHash("0x4f91145738ad08332c292f8f7c4465237e5bb2eb567758f961d8ef9597992eef"): true, - common.HexToHash("0x9ec2deb4263d80ad83704ffa0f8ffb3c23a54fd9c4a42063a84f27260cca858d"): true, - common.HexToHash("0xf5bd3529350f576ec1b8f19a5bf6df2207e2cde3e34d3bc5b071096a66486f72"): true, - common.HexToHash("0x04563b93ebdb50e6630ee108e5726faa36b4e674c819e689dfe020fce8dc3dcd"): true, - common.HexToHash("0xe884442d2496616df395b0b41c7f3623e073b134d5c6c6e7972270f2b124845f"): true, - common.HexToHash("0xb888e8ff7394649bea8e4fe1c1756db172ef748ee21cbb662a9b00addad78aa1"): true, - common.HexToHash("0x67a5ad8afd3bca9c1458b491e610ffa9782b5f143e1eec2f09d2e893913c4aa9"): true, - common.HexToHash("0xda85ab0f298845430891365e241e553c4a53790eedeadad12aee7045a4027df9"): true, - common.HexToHash("0x845294f18c12eeac733d9d53115b2c84c6d425ffabd2c26cd87d8b6635feb31f"): true, - common.HexToHash("0x1066806a076d84f8b20a8852f50b8e2b14c02e43fd5e9ce7247a0971e6f58959"): true, - common.HexToHash("0xa34416e8640f0d54169ba3684bf2d6a5844152bccd2230cb45a44bb2803dda58"): true, - common.HexToHash("0x5d5441de837c4a8be41ffe46fb204181cb9a4a8bee9cb491329f0044d708720c"): true, - common.HexToHash("0xce587efe529df2c40fbefad0e9683034ccf7473ca8f5a660a22140baf9fd0a78"): true, - common.HexToHash("0xb55bacabd4233616819d94220113e0136ab9374e2069e9e729d3844d2c04c154"): true, - common.HexToHash("0x45a5abea58cab6ae39e9989d1e36f1c2f3480c76c52f2ea890887193d512ba69"): true, - common.HexToHash("0xdcab222e3db757bd59995f76aa1641eed224408335878909afdab606b4f3bb6d"): true, - common.HexToHash("0xc36d5d92add7998b3e5af5299b7933c0aa7c69f743ae985a315fd142487e27d4"): true, - common.HexToHash("0x07ce4b8dee995c5013599b85eff27acc37ad6cbe74d5f280d8b84e25c11b9113"): true, - common.HexToHash("0xbbfe93c7cdb0d0edf8e7be7d17005090a969d418b1792b4e7710815d104f8b20"): true, - common.HexToHash("0xc8a1fdbc3fe79b6257eaa5d3471e7ad23ddd755b66cea0b281157196c92795b9"): true, - common.HexToHash("0xb6bb6869a7394b3e67cabe5034f98f4895a1d0b1f0deabb791cb8c82a2a12513"): true, - common.HexToHash("0xf64b1a7b2cb14aa5094e9f97ddd5f4c83b7e045d4c68b048470ad0423180eb54"): true, - common.HexToHash("0xbf3330119140120d98531f16677c751fc9d900793f0e89b813c23c73ad65ccc2"): true, - common.HexToHash("0x13a73c7e88ddcd4279796912f3837555e859ee2ab2dad9f0d57bdeb9162662c4"): true, - common.HexToHash("0x409247afdbcf2ab587bbcba5ed42efddf7ba906328f9be58ee4052d555680349"): true, - common.HexToHash("0x7c53b81d7fb5c4e787f1902b9702d0881d992a1f3a369e9fe05fc2c95d73e153"): true, - common.HexToHash("0x96b22cfb503c818e9bc648c1f891b97ff46548d20f382bea7d962b05de13de10"): true, - common.HexToHash("0x99b1c472d4d2cdeb008e6ba804f15690d24de94dbe8c16f62e0c894946693cac"): true, - common.HexToHash("0x29478405a54ebf3d1e30bad7f3c913b19f3cfe42ee0b18dd6bc741ff44e53fdd"): true, - common.HexToHash("0x783d4b81ae4d515c5e77af7b544e2958e6f4c2f88c344984e13bd74c5c990cd0"): true, - common.HexToHash("0x5c3701eeef06d45325961da639677da63c8a2b2f36033e7a14e0fbadfa02d3a4"): true, - common.HexToHash("0x6f3d3499013c65dd2411dc8aabc1f913efd30cc12b40ff4005cf039d14671037"): true, - common.HexToHash("0x9772a1f29dc7d6f20c1d31565995ad5370c3ca072a8eec1b6facd44539bdcbb6"): true, - common.HexToHash("0xdae68fc2726d7969720ded8f994d60093d4b7ac77456a9ba4c8dce47c861cb49"): true, - common.HexToHash("0xc9815f2da210419cd0d857cbca57733aaa29760e3033f5bf257abfbca27c142a"): true, - common.HexToHash("0x4aee6495a8f4076b95270f2895fffb521e3580cd48d402340604c9d0934e5898"): true, - common.HexToHash("0x5dff0f445af100b700220057606d25a6cf7e5211ae5a65878fda64600539114e"): true, - common.HexToHash("0xd568d0274f515c5da6a3e68549c149269f29745b81f7bcb41cd9984390fe7da8"): true, - common.HexToHash("0x7604db968d2f83686e0636d5f41e3e8faffd6ac1d90c81a80c9dd33202f2af51"): true, - common.HexToHash("0xe7c7c51f47a3401c33fb7e7d901ab469a362e4b6a87efaa4d1f2be934e9d2c45"): true, - common.HexToHash("0x5c80bf560bd61c6eb9858857d9a60eb0b5f90bbe9cf1822e3a37aa7b2f1fbe23"): true, - common.HexToHash("0xec43e0481eced99a6fda151eb111cec09d0e802f7850d90b182e511629b4e183"): true, - common.HexToHash("0xdd6fc7bc39b261f47583ad95a6658771373407f8d357928c4a73fe5546a19fa3"): true, - common.HexToHash("0x0b62ede11064c1b48b6695fd854ba6e2890bf6dbfc7b63e874ddb181360f886e"): true, - common.HexToHash("0x53a5bb9fccdfe7f8597cde291e49616112fbf92b09d9d4c441ea51231f28b0da"): true, - common.HexToHash("0x8f8048d3057c78809d65e7082a83a2c11f0ab1e0779000a039477a3e43041d37"): true, - common.HexToHash("0xd470f837171296e9b3c94a78286881d9566a59f793829207afc084e0564041e4"): true, - common.HexToHash("0xd52eef957eabae07e798c356cf920eb6114cabeb76a4d214a209593212d9d9bc"): true, - common.HexToHash("0x92668830e74e14c2479be505325a31dc906d3ca252eeee1b0a2a89c9d7facf74"): true, - common.HexToHash("0xc361f0001bda4068339f1f2fca9c5dc83ba06f8d83efe3f8e562722b966f66b7"): true, - common.HexToHash("0xf9987c22f323b120e9d2b3605c530e9f10ffa67d1aaaced5d7defaa59eaac991"): true, - common.HexToHash("0x2dfaa8ce915f31720df3b26fb31e35367ae718f693415f1c74b510c996079bfa"): true, - common.HexToHash("0x262b9929089f5982a484f9ae7209153febfb1675637f883af12ba93f6d52afc0"): true, - common.HexToHash("0x6b5d92222e2a3fb80a7ff0e2db3ee8d30545f395c98621d4101ffa7115185305"): true, - common.HexToHash("0x8f9e7541cc7de70c21bd9d60cc566683a03ab33ac76c36769ab750fa12fbe143"): true, - common.HexToHash("0xc7fb033248734e9954d3931dd30ae3e41aba4d847fd83ed27d922ead60c4623c"): true, - common.HexToHash("0xc0853d66b7b7584c5e7042c65b4f8f5174ad0d79b05b83cb2c32609e7fb28945"): true, - common.HexToHash("0x6e28548233f1ce3c9de662a9ba5fe675c6174393599f791d13bf3d94774187d9"): true, - common.HexToHash("0xf6b136e56398694545cadd59ebae7542acc9795d3f8de6e4ebb3d1cfb59713e1"): true, - common.HexToHash("0x0fed83f076a522888df9221351117a4d6e0639ef2268edc295fd80b7580fc1bd"): true, - common.HexToHash("0xf1e94513cfcf13851f6c56f82a3fa93150ace1a13e4e00eb6803cc7c51d64b5d"): true, - common.HexToHash("0xe3049dfb449f32f480054540bf1a3162ac76c3d87b39129b3be76341da44ad6c"): true, - common.HexToHash("0x727623eb2064f63ac7a24284674dc2d584edf48405b04b1486e4cc0fe4a3475c"): true, - common.HexToHash("0xf1937d8e3ddff00e3b98b36a0b5f6ad392c1ab25b78b21b62d29e9b9ba60b62f"): true, - common.HexToHash("0x05f5fbce54030d3f4215bcae304b9ed578c7168deed9ecb7e858b49ebc94cadd"): true, - common.HexToHash("0xf8e946bad5936cc5dafbd13fe322f253518362e747e730540b079359f5b0fe73"): true, - common.HexToHash("0x5eb166e4e304603cbddcc4301906600ef952284b6ef382c47ce73756a2b0014b"): true, - common.HexToHash("0x8e36c10d6ab09b1eb43cc0053c8df4118e8311ad1cf9f3a79576ce710fdc4022"): true, - common.HexToHash("0x4e0f9691962234ff7326acadecc2b99464e3b9387ea988058a0630b1f076a026"): true, - common.HexToHash("0xace777d21c2dc91385d2b1f3a0d30908fc1c16e13287669638d2983182433912"): true, - common.HexToHash("0xc28bc19379d8e8a878fd95ee95cbac26c2f5c69a6ac549ea8f23ac4786551b7f"): true, - common.HexToHash("0x0cc7abc58e237dddd861e887a06adf4e7aa4d4ff6c0d0ff212d6c088267f2250"): true, - common.HexToHash("0x248c8b372d84a3dfb4ff04b1748fd87541267b3ebcd71b2f5ecc9d3fd9c480eb"): true, - common.HexToHash("0xda5c82ce06244a552a67a3b10e849156f78837b3cc0083dacca866766767a3e5"): true, - common.HexToHash("0x16a86e1f68930da9860d993d5e5ee43f5e9466710afcffcbc35e1aa5879dc63a"): true, - common.HexToHash("0x171372a24aecda70c7c2b29bcca8f368f051b7cf65a8cc37d16e0d1797086e63"): true, - common.HexToHash("0xc7e603da861d4c702b9d18df00403e274410bcb027e7d72e4a954c0c2679b373"): true, - common.HexToHash("0x235ee83c0699d935b9b686cfd1c820b93251cc2a2f0f61f3395f6ecd1dc7abcb"): true, - common.HexToHash("0xf3a7415571f265222fe2a727f010f4d806ba429328db7cbab966b34271bd2c6d"): true, - common.HexToHash("0x2295a9f9260c719c9ba20e9f0883644b6561951bc0486e1eb7252dc3e58e6da4"): true, - common.HexToHash("0x171948f68971870dce4c06a143bef9efb9260b69102e556c6a92463ae04c4a39"): true, - common.HexToHash("0xe157e9f8129ffd17ce172eda31e6ab669f122cc82ed10ef6f9b268b7f2601c17"): true, - common.HexToHash("0xe25f1207ff100b82e27001a0e7a45e5b083c95bb6b376c3549308a9a0eed4666"): true, - common.HexToHash("0x9327a97baa5ee63858cb16eac6b88159f4840698bed5a0c84ef8fbe64a167ffb"): true, - common.HexToHash("0x989fc137af8176ed043af82005d9c2c422eba150447fe7d8f771482ec87b9d29"): true, - common.HexToHash("0xa1377a81aa01d02f81ad5f6721f5b845e8f5545b306a599963060dbac0d73734"): true, - common.HexToHash("0x7cb2dba8711745da4d986a896278359fee2a971e14ab1f7dcabb8a76e69a4250"): true, - common.HexToHash("0x68dd5c01b769c3c21f385bd89f8be0f7fc181f548c82ba7b0bfcb35b7de5d92d"): true, - common.HexToHash("0x88a8381a38053ed9923ab270bacae17191e2cbde14ec6d8174a421136f767415"): true, - common.HexToHash("0x040635b42f3c94338b143a5909287bb43212a3a7049d6208850755918bf3db8d"): true, - common.HexToHash("0x8cd2c6c14a075baad89512bafabeb63d9cd1bd5ba997e94e980378e158ad0efc"): true, - common.HexToHash("0x308b6a2a5a5ee415de99f451578e5e563e6e10c33db20ead2a4c6ca97eff6439"): true, - common.HexToHash("0xa9cd0021ddb5405df31f9bc7465880e106bc4e051812a5673b1ab99f45972b6a"): true, - common.HexToHash("0xb389f5e6aef69e25ba91e36cfa287b199cda8f1b698befadceb0c598ef1ccf4c"): true, - common.HexToHash("0xe8d8b4c973967185fb9c139327b4c9dbc04e84b11be07c37e7c6290b1519f652"): true, - common.HexToHash("0x73043a71b61657d281e02c7146d8e65493e9c28d8b7ce271412acb4bce59c358"): true, - common.HexToHash("0x3a9f6ea09fdbcbd762f4451b2b398bd2445404996f215ff4cb57a62f5f15d25c"): true, - common.HexToHash("0x28c3a0964968393f7cabef8f15a44c18ed8c87f15b07334bffde530397e4c418"): true, - common.HexToHash("0x7efa0e3ddae6631046a8e64aadcc627bc02fd09e03f8862450b475fa98d084be"): true, - common.HexToHash("0xd834eb4504558639d3933f78f4aeafab357046313fd1bf265d6998b2c7ded922"): true, - common.HexToHash("0xe26c39561d317deaf67f1d87ed143e33f3719dda6643752d0768b411fefe2c01"): true, - common.HexToHash("0xa3cd29546066bb4d9c5ffef47c99cfdb4af481a6a46f7686ef5621b0a88b5dec"): true, - common.HexToHash("0xb0d6a84284fb3dfb68105be0f1b929793d547fc40257af6d78f1deaf0b570c01"): true, - common.HexToHash("0x13fd6da405bac4ac98af83cd3580320083ea1b0175303380904d4c4b0d460de3"): true, - common.HexToHash("0x2e92c77f61fe2c245dd25aa6e0ebd87cb63d9c8486d7c8f8904a43b9efe237eb"): true, - common.HexToHash("0x08c5aeb3d0f6b85940e7af30a5c6d2fbb812a7a9db0499a50b8708a72775881d"): true, - common.HexToHash("0x426e0730d4e80ef4293adc332c78bcaa2d45308356969193629d087455bfb587"): true, - common.HexToHash("0x464f6de43d116fde05d8c8b36946060182a12ae0bbaa0b67f4bd6ebe8e5593d8"): true, - common.HexToHash("0x9e47d5ace28137a6ea77a8e8ef9e5ba0eba4fc13ae70168cd6f3b3a240ee929d"): true, - common.HexToHash("0x764ed053dc71f217294c26b65337b0c43134a86d86a571e843088ffca94ba697"): true, - common.HexToHash("0x89d3ae872f4b7b40695f4d626d5ae86f81dfbda6b7cbc7c26b04eef9900c2a25"): true, - common.HexToHash("0xa1f056858469f1857013f572cd9544634553267051940a0498221f6afe4a235e"): true, - common.HexToHash("0x360d4c78c1c53b845d43d4be3b0533e7ec08aba5c3a88fe20542be312bb4281f"): true, - common.HexToHash("0x50ad919e7b5937b558f8f8628279fb0fd5740ab2762eb415869643e0c8b79727"): true, - common.HexToHash("0xc4915714af08ec50e9024a0e64039043fbb6a5f80b86e9e6fff1b8d1f8a67531"): true, - common.HexToHash("0x2630976d60a181493b8018dc6e462fcc276f0de02c03e58b66208ec4c4e8135b"): true, - common.HexToHash("0xf9b707d3d5915f08a953a9c5f22b1922fd06989db481167ddeb9f42d987bfb67"): true, - common.HexToHash("0x2b50f787d683591edbe5cd723f64cc446f4d449077b0989fef4b8e5ca890d09d"): true, - common.HexToHash("0x9af741d3deddfaab75f8838512de9e3d94727341ba6bd72b10fb41424d56de05"): true, - common.HexToHash("0x76918d3e36bc220c2c3adb9efc726fa8eb743ec68e0bf17e2c7e72cd672670c0"): true, - common.HexToHash("0x2c5a15430c33e65290f2a4830e57ce52858671630bfd8a75f8b22f1cd654fb01"): true, - common.HexToHash("0x9a8d581aba6794abb6fc7cf53121293f296d37ce70f9f974bce35d0c3c6c07e1"): true, - common.HexToHash("0xf7c14e0496ff07a72efc6732eb32a002bdcfffbbd2ce731426b33dfb55bbee0c"): true, - common.HexToHash("0xf78ab2e079d2a50dcdceb4a9d52c9b32de0bf480b9c1c1f03c2f3c732ce517a7"): true, - common.HexToHash("0x8798f17a0dd9f40d8bf5a67181f8d6ee023c0c6172bde3b8f9ece60203da800b"): true, - common.HexToHash("0xdae99797c4f34f5008a58ccfa3dcf2bb1ebaa77996a941e0614466f724d35560"): true, - common.HexToHash("0x942894b744d4e48dd57e572fee8529b57f353faced96e701f8ca7a191b620d53"): true, - common.HexToHash("0xff8696721dcd185a24708f96b9510912f2c97d6626c26fe41583860b8fae6fa7"): true, - common.HexToHash("0xcbf0a59a06017eb769a1a9de2eb3418a226b37b5a1750e8225a961cf1b3848cc"): true, - common.HexToHash("0x0a4e73741e5897fbbcedea134faa36ac9365e4f2779b9acde7ca410890c8d5df"): true, - common.HexToHash("0xdb40bbf3643030391865d1dbc530337e81a106d7a2d5a6a5757dfef37a810d03"): true, - common.HexToHash("0x45f7ef7dcae3bc664af96c1caf40a2998cddcb090019b083917bf9f18102d222"): true, - common.HexToHash("0x4f59d7d421250626b0cf813ef519f3a939d6c27ea4751cf5810d7f3e60b84c74"): true, - common.HexToHash("0x7ee0f58524c848050ddeaf98c1063271a7939aa3c68f51463580358406daca91"): true, - common.HexToHash("0x3e23df18a755d43ea30ebe114c94e00c8b33fa1d8e367aa8bf42d50ba022c565"): true, - common.HexToHash("0x500685b112dffe2944a0ed1e9363a36bbb3877f45085b51f5a096130781ff407"): true, - common.HexToHash("0x4a92612a83100c9cfdf5b9545d15e65a31fb6fc891033991f0cccb984d926538"): true, - common.HexToHash("0x497dddd609605109106c7d930bd53f8ff0325fcf3fcd339afab9ce09f962dfd8"): true, - common.HexToHash("0x43ff230817659c9d1161a3cc08c9d5b2f2987076272b95c60a4119e97a026efb"): true, - common.HexToHash("0xd10453dcaabdcf6d13660fd2a04c7cf281dad7837596e31e9390c2543ea8bf9c"): true, - common.HexToHash("0xcfa8279c213b2eff3a29341422fd7d39fb4183d0990cb434b65784660809223f"): true, - common.HexToHash("0xdea0c3247c17caccca3cce5560733c6dc92f4092a78fc148a1e87998f2582984"): true, - common.HexToHash("0x4b5deee3ff3de99f9ced825878e672e7fe9203ceb45530f3ee32157d5fca4d36"): true, - common.HexToHash("0x68f924d383e60fc25968772594b14512f1e01caba1fad02f45a60b818ba51b51"): true, - common.HexToHash("0x0dfaf9756b5c1b7e90b1c93d27a9e6e6ca207a53ee47adedcbd8f230f38b5aa0"): true, - common.HexToHash("0x5abc2667bfcdb782ceddd26fe2c19e2b9339842eb5f79af9b7dd1cedb2249def"): true, - common.HexToHash("0x22ca1c9131a7af6a7563edb5aa4ebf033a78c8f966e492e29d64d28633061162"): true, - common.HexToHash("0x2a118109ecac7e9f662896218e748283c9b85c7a780213f5db603f838a8f89bb"): true, - common.HexToHash("0x8ad3c2faa0a3d03db49c49f11b8de174f6dcbb470b2385b8be143ac20020dce2"): true, - common.HexToHash("0xde5993b75a54c8380f3d687aa0ded9c47544694fa179b6fd877afd81665b8bb7"): true, - common.HexToHash("0x2e7364addcc5e0228af281ed8fc8393f6e7f11fa9aeb6a82bd998d38d5501eec"): true, - common.HexToHash("0x03a4a384efca64924e087404e1a3a1bcda0959161c7672bf61be5adbda14c8ee"): true, - common.HexToHash("0x703b7030922356cbd8d2c2fb4259bf8424c000ecfff7c26bfa6944eabb8c5995"): true, - common.HexToHash("0x1d280501233344dfcce587a24f0b882a39d5b58deb0e73052438c94301356859"): true, - common.HexToHash("0xd20fc728bc083fa551d6d6bdc82c892e82042593900931c3208888f637e93409"): true, - common.HexToHash("0x9c07030144e33be7e4c3c846940d41b9726cc86d79dcd4c89d06c5cc13770adf"): true, - common.HexToHash("0xaa92bedb246372831befda8de8ff662cf5b426302b1d4c42d9e71074721ee28c"): true, - common.HexToHash("0x377cfea9201b3340a297e7d41a2b3119a2ce9911871384822d4dad0700ec1955"): true, - common.HexToHash("0x852cee3697a918bfb62f1c4219e38514110aa91211ded95fd007bf449bf9b6d9"): true, - common.HexToHash("0x525d581cf6ca994ea2a540662adb2e2284a3ffda46669564f7888ad095e9a08d"): true, - common.HexToHash("0x02a7a83cbfea5fc012ce3549d213eb30336d98c59e5ac4ccd9fdc01ab21f9e36"): true, - common.HexToHash("0x516d2e039322905b4a13aec8f034d4ae2c504c4b47739cce31cb402caf6e1025"): true, - common.HexToHash("0x73b4d85b9ff0a35fbb97337ab8800e4fd825f4bc59bd12bc6ea6aef5a2a4e94d"): true, - common.HexToHash("0x96a1464885d45c21953eb8f1a3cad3533b713ce9c8cdf1f599240f8ad3f17f55"): true, - common.HexToHash("0x2e02bb8b634d98944318c6fa82cf2598dc44c2258754dd0008fc3a785b004334"): true, - common.HexToHash("0x331a59df548e42300a664eb1c6251ff7aaa432e37be5d3dd4bb24d601ade8a7f"): true, - common.HexToHash("0x0f3a24ce8f05c1631eefa83a0b9622cbd40e404c736e01a21c2e97a844c724f0"): true, - common.HexToHash("0x50546b714692b0625eaa51535e8e3bd88d48e1fcac4fd23dbfcbfe6fbce8cd05"): true, - common.HexToHash("0x8bbb3df23ff79ff707ace0fc34fa45e84e4c55755cadb0e17e4a6a38252e2c95"): true, - common.HexToHash("0x5efd0e8f73ca343a07cd9ffe53d762ebceb83130563e3d5b7c09c01e79104f64"): true, - common.HexToHash("0xee93f5c42fd08b5baf8f09eb07c637654ca1dd4e17f76598b2e3c8ee8bbc0f2d"): true, - common.HexToHash("0x6795f8ef899abcaffdf19e60386baf5fde124fb5ebc2c98b822adb4221651236"): true, - common.HexToHash("0xd145fb0cdf2ea5a62fe8e709813e4bf7a62fd20d027e1abbc138a1eae1ab53e5"): true, - common.HexToHash("0x0528c30a132396aa7985a9961d769d4a46a7b5be1c0dbede9cf046fdd0e95863"): true, - common.HexToHash("0x1e9fac1cb1e07a17ed8255b85da87204f1d73816925a43ddf00155632029204e"): true, - common.HexToHash("0xd64698b61a3cad67d5fc0ba3545767388d5c4f4a450a5574981edb63f5fd8ff8"): true, - common.HexToHash("0xbca17bc99696c2a24e50deed64a35040136f2973d6cd3849ef87844ebdee559d"): true, - common.HexToHash("0xe044e73ee452f21860903ba0d0d7d0ed2b1707a2da766f136f5d8c7508374dc0"): true, - common.HexToHash("0xbadfd9421da84ac41865079fcb54ecb6583d984a9a7640ed20132110a0b1827e"): true, - common.HexToHash("0xd92af254f202cd9bebc91ba411e5da33d0a4e0598dc22383b4bb546f5050c330"): true, - common.HexToHash("0x42e401ba211eb1fb4d6c90a2ae0e4e4c04bdc537e3caf380619a4f8639f37b5c"): true, - common.HexToHash("0x4884e42e23ed507c6dda8355db280e00b873c744101b882092d98f2e838e85c4"): true, - common.HexToHash("0xe489c252e634421ed2a2c3a1f392da562587f3a1d2aaf7446ea0adc8634ef248"): true, - common.HexToHash("0x7639df24ec6ccfd1112edd79e9a2b29a43bbb9ac71dded1d979561350ea70cbc"): true, - common.HexToHash("0x175f62df83df5a8d13f89dce62f3b342a96b2a77ef4c25c99adf37e4ca28585d"): true, - common.HexToHash("0x187b484966d7b6a689037e22deedd859d6fa0943aff3e6a21c9aeaae87d3aadc"): true, - common.HexToHash("0x0091014e32207fe4ba7d2858440cbb63e065d1dc254c7c1cd839043e3c6ec9f5"): true, - common.HexToHash("0xa572483904b82f32554be8fb681f216ea01a12d3c8481eb95e0dd95b37ff28a7"): true, - common.HexToHash("0xe8c330477bca48f64e389b85fefde5a621ae6a51233160aa33f2920aa5315352"): true, - common.HexToHash("0x2c8aa23f440b2cf140b6f54891558e1a23cf2d29c3ba524a675b1285a0f8fb54"): true, - common.HexToHash("0x93bbc144049e140df20853ea0182e6942c357935e2975af76610c2121b4c4c82"): true, - common.HexToHash("0x4d996e4dd5d1a7d4fb4c6e1507e7ea1a40444acd968e08a5e97186c1b028ee62"): true, - common.HexToHash("0x5f28b0c17bff6daa3bdf6c185929f5140c24548978ed537a792fc2b70437addd"): true, - common.HexToHash("0xd66672cea86c3b63d10585549df03c0e3676b06bd628d25c2d31f66a2926c327"): true, - common.HexToHash("0xa5a06327cd9544a11c8195ea55216184223be6adf57bedc59b9c0d0f48262ad1"): true, - common.HexToHash("0xec7f3d084a94a3be04ed1da599eb66cad98161c995dca06abc71249c7619d4f4"): true, - common.HexToHash("0x4b2b79d4c001e538e9cf1a474c537259c25140c73eba3291c0b21830559a1cb7"): true, - common.HexToHash("0xb434d7f63322aa616c75bbbe5e37e3be0354fe5a1b1d2d25db9caa8e1724da27"): true, - common.HexToHash("0x66655ee1f47f1a7d1dce1184f103f355d2062f8ea37a451583b21d9ec69328eb"): true, - common.HexToHash("0x9543a1a4a0ae0abd65e47629c1b37eafe31d7a93a174fee192c7106d71ed8d9d"): true, - common.HexToHash("0x933da4fb495637d83646bca18a8edba5514b26888d0c825ff98238875abaa377"): true, - common.HexToHash("0x2ed962422328930662ead3f4db9f4d39e78cf17791bbf53bfe78091d6319adcb"): true, - common.HexToHash("0xf8b6dc6db84691dbccd9c6d67a880e40096c937cb465088aa5c69e60208d040d"): true, - common.HexToHash("0x33bb90acc55fa1f25078a443b4533b1be8a8c5662f9a079d31eb9cdb2bee03db"): true, - common.HexToHash("0x4846c40809fa5ff73ce742d1963f9a6f5294e537bdb1dacade511952e1b3b93b"): true, - common.HexToHash("0xfab15eac4bc4cfbb90c357b472dd75dc93d2d0eae73f46c41468e6b68118c7f3"): true, - common.HexToHash("0x3241342cce171eaefd2155bcd0b29382951a7b121e7f0956a5d713dfa05ff401"): true, - common.HexToHash("0x34719e074c069b4dff169a1a72e69dbb3eb9ebbec7758dec8f63de2608c781ae"): true, - common.HexToHash("0xe11fdd2491e70e012531fbda2dfe0d2f50d138262d38f4cc57addf78566d6ed9"): true, - common.HexToHash("0x16ef666e54260d33edb1a1f7ef6b0d9920555f66649374dbcc7d820b6641c81f"): true, - common.HexToHash("0x27416d4930a66651235759acfd8b22b9ef375fdf2e34fdb618f55b903a39202e"): true, - common.HexToHash("0x01c2280683a6fcd17bee4e9649d5392a1b80906bd9c51b8bfb5bc2c680ae3ace"): true, - common.HexToHash("0x83e9b5e70456cf54d966cde62dfda49f4de2fa24ae12a397ddc62405345ca3da"): true, - common.HexToHash("0x25a7af8ec69a5e1b5330a87600815eaa76210a13a156ccb8b22ca67e92da2634"): true, - common.HexToHash("0x1e4b94909fd75a75d5e656b4eb11c251554a234a66edde87a95075b74fa5a7de"): true, - common.HexToHash("0x0564fb3191ea7a9b6e68b6846d2c29d68d5ce111af8591a5a687dd16fd51c40e"): true, - common.HexToHash("0x2c74333d7b801b6239d191768eb4717ddb9b5504018eb1cdfb8dd86d951a2c99"): true, - common.HexToHash("0xe9ca25f682a8c1cd66862b8123e4ed2b210bc3dd465f2691ca1f25530a89b7fb"): true, - common.HexToHash("0x77deef114ef85fea2421f20395d636069885bac4c929b398ff4cd4f3b2e32144"): true, - common.HexToHash("0xec36280f8d14d3b71682f75a068f5d24876616cd97e647d7678d426822f0a650"): true, - common.HexToHash("0xd9464cba242b8b40381d3e7c2309b897c42a9142d0e9ce1e81aa8a182f698454"): true, - common.HexToHash("0xdd57d7c600ac38f513012a745098cc20968caf8beb476bc9e0f42918577f08ac"): true, - common.HexToHash("0x161ddd19da01f175a5341c5d2db01aa1c4be6742df43455a32e7bcc0e7d070f0"): true, - common.HexToHash("0xac72cea3de6836285a5719378756c32ce299aed9196414fe8cd2cf0081b9a831"): true, - common.HexToHash("0xe09466c72e6a58fbe252d7827baa43c4c1fcb4518b702c81e81b05f909706942"): true, - common.HexToHash("0x3460403078638875dbefb0bf5695d96bf9939530b7fcce3f06e5ce1276af22f3"): true, - common.HexToHash("0xfb5d6cdd8c3d6733295196676dbf1e91c84f05a5c6dff596077671027fa97d2d"): true, - common.HexToHash("0xc70392db51a2c93e9fdf133f6fcbfc68df2ed5a6fccb748c8d1ccc400cddba47"): true, - common.HexToHash("0x3f8b45430e2f724b01e0dd2a46df72e68411bd6114508622e84b077aa7e51f72"): true, - common.HexToHash("0x1f11d5f4a99529efbc2959239b326c6bd0a6f6b63c373c076c1d9f51a37df4a9"): true, - common.HexToHash("0x6e94c656e5d640b88fd7e1220bccf77231a02fc33093e3db51965a71a6ead329"): true, - common.HexToHash("0xac4801219a92fb006f1af52816ceeb70424d2f56147640817688a360712a6b19"): true, - common.HexToHash("0x6a455c71bee69c95764d0b039fb92d92c2266c4d16cbd522c22d9ece2d7c9072"): true, - common.HexToHash("0x105328654067d51bb25e0c8cd6e53baea0b0ec413b35c6288b3eccbfbff56148"): true, - common.HexToHash("0x5d1f3e8c0c4f3abbc5a4a3673c2b8d611c2478a4132591aea8a1f9f665eba234"): true, - common.HexToHash("0xb2f9d310dfb414005fe455911e9aedf2f1ee40c0f381e03ecd71ccdc92edafd5"): true, - common.HexToHash("0xf10c3a1c5cee6e1e37df059129cc5fbde35923221b73eee34862d4c2a5833c39"): true, - common.HexToHash("0xa06f24e4a41a9d1876ef1744bfcf9945ed1528f7532f39e0d683a86984a5f140"): true, - common.HexToHash("0x78765441eee391ce5417832c104b4733c25f59457be51a6c2552127ace8e5d96"): true, - common.HexToHash("0x23e96f25c1a94d11184a7655003960f6bd1ccc05bbc43c6c4084386007146c4b"): true, - common.HexToHash("0xc41c05a99d7e25778c16e2dce8ae1a415709ba63e46e01697288a37fc49b4c10"): true, - common.HexToHash("0xe92e9fcfed252eaafb51b98c7ff156478c2376a0d3eeeb7307868f6bfb3c40d3"): true, - common.HexToHash("0x5ab61601e91717f6b21a00a75e9af5b0c4a5d0d7412a1aa63c0aa94a2e9edbd8"): true, - common.HexToHash("0x290eeb347264ba1162463de0bd54cac13cf93a0ef613218947565c93a5359c34"): true, - common.HexToHash("0x6e35146bd8c318d59c3d6ea2ae817012f620a7b44b3104a760956b65ad8ae664"): true, - common.HexToHash("0x9c3795c3ef9b31ce0289eda49f858f8a47c4815b85ce13cc6952bf3a3ddf66d0"): true, - common.HexToHash("0x40b203257641f9367b85c765947721f16b1e226daaf0fc0108fa5f7273b5b482"): true, - common.HexToHash("0x598489a0ec69e48db312862103a98335099772dbcf7c1b23a2f7a00807f2c3e6"): true, - common.HexToHash("0x640e66cb7d6040093d72d5d391d5d58cea9d5009903129db9b45363434e94d94"): true, - common.HexToHash("0x19b2084ef8c93ca75b4cdb7854096c324e2a0bfd644fdf73211a76f2a95d4b7a"): true, - common.HexToHash("0xaa2e90152684ae4bec09b0f910b8a3509a4774bfcf0990ae977cfebfdc61cdad"): true, - common.HexToHash("0x77dfc6e4846cb6f3ffef67d54396cb811d840b2ef13814fe0caed4ae39a9d93c"): true, - common.HexToHash("0x6ba58626851c081e0967c34a309e070e18274cc9f2005736e1984afed8381fd5"): true, - common.HexToHash("0x8637d472d77d6de93a651a03b48e580ac0374cf53371367341ee4935a1879ee3"): true, - common.HexToHash("0xc05496392920a48a8168ff9792e65cb09bc913af95e73b26af4384cbc3550173"): true, - common.HexToHash("0xec71c4e55e3908555f7d1510693d149d4a0b25f51bdf1b5602c9ac00ab3f04e8"): true, - common.HexToHash("0x4106487ae7188df15535e3fbe9f6a354d079ab42c90fe0b841d18ab2cbd9ff01"): true, - common.HexToHash("0x89f7de47a43afb7b19d664d25070acba15ec887c3c1c4f45e3f555b57d03ec2f"): true, - common.HexToHash("0x743639e355cd7f337486075cf782eeb7add07bd5974d06cda945ae34e84a4b5e"): true, - common.HexToHash("0x7feadc416a72b30ae9e432a1970f7aa39b8b90d384155bc8d38966f215e4d0e3"): true, - common.HexToHash("0x05c40b44d619f776d5c759263b57c01ac1a817df9c4d0cdd214afe95c9e4484a"): true, - common.HexToHash("0x2be715c140d1a7d3c7a25494ff22f12b80e049162e592dad51b6b808c1194f80"): true, - common.HexToHash("0x472cfa1b45c21619dfa22fe2d3ff70f694aca5cced32ccd869d6d5c64a666254"): true, - common.HexToHash("0x41bf8a6f2edee0de996db540283ec84677efa5f6aaa90db3622d62debaee6e3b"): true, - common.HexToHash("0x87c91c16cc148bde4e31b6c4f434c7ed1f91fbe9f21437be0569479366ea9b9a"): true, - common.HexToHash("0x18490c7748f13b22348fe1de699a84a9e34f494ad88ccfdb0e1ac0f2547348ae"): true, - common.HexToHash("0x726c62c84bfdefa21c65f91a043eebc2746dee5642fe8ab1884ce3a8fe396445"): true, - common.HexToHash("0x1e77d821421f2ba3b68756fec7d058a9eccd56cee8a4a52b8f3c06c9213d95aa"): true, - common.HexToHash("0xe1dbac772b1e05210f484a8bfa72da74e03995f8be087f80ca30f23bdd2ab0d8"): true, - common.HexToHash("0x49fe5d91644a536220d72e28e206e8e974935a3ca3667e22c32ee460d22b0933"): true, - common.HexToHash("0x6b1dbe1fe555496de9ee14601df93426485fc8675050b2e6f4c6ba57e74fd692"): true, - common.HexToHash("0x4dde07dc8ad2dc83205c07c6b0648353f19fd6b4578c9bf5df52c6480a76df98"): true, - common.HexToHash("0xf0ccdf2adbe27b8db303d3ab52652fdcce7b6ce9fc89f789036c3043e990d3e0"): true, - common.HexToHash("0xba731e314ae80bf92361802954c17441112c4356cdab2019f19e8048ede1d695"): true, - common.HexToHash("0x0440011c3512e5f2cae5f188bf5d43ffc1768c6b5263f7ced5ed38722e73bbbd"): true, - common.HexToHash("0x8ab7c38df77859b10f63538d0964cc4d6d2bc1b64a0bbeec28760405d48af883"): true, - common.HexToHash("0xe93654361e3bda0d9346e8b7d91ea148e24dd0fa4bd59fedee20a2e2f4e3074a"): true, - common.HexToHash("0x527bb714dda246324bbc494c6a26167d717114bda75be7b458e7b1aec18566f8"): true, - common.HexToHash("0xb548bb4189bcae7cbf4b342c9d7614d6670793243b049fc5af8004e39b23c6b5"): true, - common.HexToHash("0x5a3cf7e6e4a9dc8fd1870b6d37e490774947708571f8a112394e36f9999cd35a"): true, - common.HexToHash("0x03c4215cca4f116dc012ae2043938592768bc44c273ac76d4efb5273a62de72f"): true, - common.HexToHash("0xb3eb517213e9b4cd75935a3d5cc4b1c07fc7d2bc5c54ea421416f8eedea77cfd"): true, - common.HexToHash("0xa3e7b70fb550f23514fdcc817d8e3af1839102f5386b89de65469dae15e9f558"): true, - common.HexToHash("0x1fdf4a477c3aaf8b46241493876cf4f9583d381b30b8e98cf799bf52ef3e8b9c"): true, - common.HexToHash("0x9d9e15e02c2bb0d6b3f505e6ba457464fd8a2a41c1d16c89d38e8e0998d5e489"): true, - common.HexToHash("0x70e326b061e45c9593203342950d1f4e5421674ca0cf16f798035351da67cba1"): true, - common.HexToHash("0x804291fd3a893c74da323d9a5aac7e35458d3907b50597aa100f4c3387767f27"): true, - common.HexToHash("0x36c79527e465281ea3978a1ab679a5c5f718d7b56e0399bc20f47f5d2b4a88a7"): true, - common.HexToHash("0xe16399d2906cdc0ef53f8d62a8bbb376cba9cb3e8f724c56f230eef3871f82ca"): true, - common.HexToHash("0xd5d41f660b5f063fef01285da43020f67235534fb73847464820328ce5adb744"): true, - common.HexToHash("0xdff42a332bf5c049900bd81c5e9cdfa7b435781d2f1d657fcaad27d5f8e4a40f"): true, - common.HexToHash("0x5d0c79e961b40d2cc0a70b00a15fb2d85409f02d241a3fea3e86ef3c852ddcc4"): true, - common.HexToHash("0x41022a25f0613b714b258244cb041f3476e62cb4aa94f9aaee2dd0cef44d3134"): true, - common.HexToHash("0x9bc1b0bf8cd1aed4b85f4ba3b506036c997bc139469052f0c1017cb188b1a253"): true, - common.HexToHash("0xb74d5442cb4ede890165c4a66198afdbc6d8e7b3fb80c2ad68091cc4fd93f45f"): true, - common.HexToHash("0x1c5e10ac124167c7dc3bc8ab11799d297ea88c28cfc0bc972c8d9dc0ded2727f"): true, - common.HexToHash("0xd3edda3a17d8ed962af80a3bc5c7a1af78fddea83f2e55bb49a4c6d772d5c512"): true, - common.HexToHash("0x95020f5e57119ddd2f83c396746f1a627adebe5cf959eab4bc1288c9930ce758"): true, - common.HexToHash("0xeba64a0ac9a4e5c0cd01ce2c67b4038f2272dbb9d9a959d2401c2e4eb087f43a"): true, - common.HexToHash("0x3ad623f3454f788d3f24dbc30bd63d01ef9d73af190a8194a8dc39ee29ddb636"): true, - common.HexToHash("0x65362543443760dc9e9aa1234fbbc9fbe14e6526100f4557502d255e74345ffd"): true, - common.HexToHash("0xabfd0bc2c7c1dfbe0bddc8c17d628cb26832fccdde6fa02a9d14b00eca24d9ac"): true, - common.HexToHash("0xb45a81499a585cf8857d213cd4e9e55a91a990c126d2b97a88e84ca669e6dffe"): true, - common.HexToHash("0x2d3746c2721cd7ebe0e2fd0ce8107e288f1accd0b907ca27a101a78f8f325ea4"): true, - common.HexToHash("0x6acb1259adcf522a6a2d53f3f8bc5e73eefbd9d6824ed26622cf3062e0d03def"): true, - common.HexToHash("0x6ea2f483a6580c301c52976e2cea19acaea258d54af20482e26fd3bd92f7dffe"): true, - common.HexToHash("0x99c7885b5bb63c6aa8cbe5c3b6058f2d572081a4c4d94734acee7fc745f9c079"): true, - common.HexToHash("0xd2b836b92579c90b0e52f641336422646717a53b47e202b47830e5aa4929eb00"): true, - common.HexToHash("0x4c8508103d16fb0f37eade503819c6f9146130c60091edeb9c87e4defbe5eaf7"): true, - common.HexToHash("0x59e531e8ab01fb338fb95e39b2cb552411aadc395986b2c6139d772951314f56"): true, - common.HexToHash("0x1408f9137420b7ec8cff71f2ba285b629403d32399e2d7dc1aff9547bdbd194f"): true, - common.HexToHash("0xf3ea55d581e0dd3f5710e0d42a61724569a0567335cf253327f1cd899e70c090"): true, - common.HexToHash("0x7d67addca069079b1b53400199494442a9ad8caf5cd0c8f264fdbaf3e66e4c6f"): true, - common.HexToHash("0x64146c74ed97bf245771688ab62fa4bc64588d38c988cb0897d1676b20ca9086"): true, - common.HexToHash("0x54c7ef64faae72fa685d22dcf973facb69f3a0998a7608c83bfb61446ce96be8"): true, - common.HexToHash("0x38f962aeb4dc8358b9dfbf1e93541f549bb4a9c8765df107e1876173d9850395"): true, - common.HexToHash("0xcd7990635d3a7f8398e268c2b7fb8fb82ae97563242dcd640c7ced1d1bb023dd"): true, - common.HexToHash("0x8f1862bdaddd88f4f4bcdca0aa1614177a654d465a8b59c538b70af36e182122"): true, - common.HexToHash("0x47598d36df15d6a5f2338aab3c594271b07bd1c0b67ffce4689b0ac2cdee997c"): true, - common.HexToHash("0x10894720efcd37944c10474aa1d2a608be4afa96b580fdf363c5f4d4fa7c869d"): true, - common.HexToHash("0xfbb1dc514a27e520a2429ab0e5bb7ff9012841b817d547853fb2d0ad1cd8312f"): true, - common.HexToHash("0x513dda216d2cfcb0e443556cd11972ee61801f81aa056948f706f6235810b88c"): true, - common.HexToHash("0x42fb52b11ffed1f4eaf8d0c07384492f776f0db43e0bfa8a6e41f918b1b9f4e3"): true, - common.HexToHash("0x54a62c9babf098a8e546ea3e9693114b397730198cf745b4c59e63815db23dd2"): true, - common.HexToHash("0xc5c3502a7dd44c9496005349c9b94274df91ccaa02a3263592dff00a9c28137d"): true, - common.HexToHash("0x2f610d4137066e6763f156cddad0cdf86b5b453f34ed327ca57f2c138451b679"): true, - common.HexToHash("0xa7ecbf297f834994dcebcc4eb483b5361cef5e25eb0473d6c883c5667f28483b"): true, - common.HexToHash("0x8414efdd5f1569ce5c6d2ce2a659c4f107fad4a31d65880ea45b0ebba398448f"): true, - common.HexToHash("0x534618a354e7e6d7454260bf507491c227051f44e5f473d8ec98788875dcce8d"): true, - common.HexToHash("0xb8aa6d4fb0a1a501f4a6202150d54af6e403df52bc1bf9a26dceb305af8123b7"): true, - common.HexToHash("0x3fa351f134926d3fa869cce3c56ec0c14720267b2a47d1a47cfed162500e321a"): true, - common.HexToHash("0x91abdc64372c9d7f63d83a438b7d4c9a7277b95903b09eaae11ecc41c063121f"): true, - common.HexToHash("0x553d1961e32cf24b85020c5f2ba0280dc5967433ef6d5b94ace238a87b93cb75"): true, - common.HexToHash("0x4c6216f436ae7fc75536cd75ed6e5dbb45f9f25ae937dfec343cd579037510d5"): true, - common.HexToHash("0xc9ade3951446a27bf8dbd8aa786ea34ff0d5f78902bd6850e0dc813b1b87f6f5"): true, - common.HexToHash("0xf7e2a30603751962cdba2252a2d7298e8ad14f9cbeab35e7b68d3b253b75de6d"): true, - common.HexToHash("0x645c2c948994086966bd45ebc4da76bb47a3aa30685cceb6046ebe5245be9318"): true, - common.HexToHash("0xceadbb06db4c2726ec1405403fb5506482d1b6f1c4c9fef646000a325be74841"): true, - common.HexToHash("0xd66d37ce6531d097f2304c63ffe7141abdd90117e69ab67c9d83d3af293010cd"): true, - common.HexToHash("0x0d633a9572269a43bc65dd5496d549fc0819316bf11f84492e51d5aa7604ab7d"): true, - common.HexToHash("0x97f54af2689b30184d2cfef7017adacafd0a3f0c9536c9e5ff7a8f1031dbf705"): true, - common.HexToHash("0x9b12d8eaf6d2c722551c53b3fc0730dff747ab17835a25de859d4c0259632aae"): true, - common.HexToHash("0x2b1e70bd773ba6aa5d98bcb1e504094310985080d422114b2a14da6e1fdd7931"): true, - common.HexToHash("0x9180eb9da2a1c389b1bb244aa4c5683c53672a39608aac067899cca7f0ac6ea8"): true, - common.HexToHash("0x7a4e3f6ae6ecea88ae450bdbb2aeb9415acfca24849137f0ceabd2d7ad414b5c"): true, - common.HexToHash("0x84f7dd5fada1c4667944c5cc3148ad977cf5d4a450c9064ba8309133f211f515"): true, - common.HexToHash("0x18d09d2f390552fa74536d152eba61666b582f4270637457c4b1a4704690fbf5"): true, - common.HexToHash("0xf02e090ca8a38f868bdae03ba16705dfe13f59f9a093c26247d8eef845f4d668"): true, - common.HexToHash("0x71adea9626887a061390028ba9d8e743d1daebf5275049cb98cb7e442788a2f6"): true, - common.HexToHash("0xf9d02c50c8afbeefc32133109f24acc28269ec4e5959fe874d47190f472ba3bb"): true, - common.HexToHash("0x9896b9b3170abd86c5ef2d253d5513dc874bf05fa04427eee79ef2812a54c60f"): true, - common.HexToHash("0xd67d517bf8251162c83da6d8754a23c13f888bf94d86178aba204619199f6fe2"): true, - common.HexToHash("0x772ff5b45ff9d6ba8126e8990e4e0ce20e755ca596bda7aa42e56e4d2adfaf5d"): true, - common.HexToHash("0x4dff4e6a045a035a55656980195c34521ebaa25902cae32ab8bbe04beb5bf7bb"): true, - common.HexToHash("0xf63a5e2fd7ae40868ef6dfa5fa60d3c85cad282e2c59496afe6d5319c5537921"): true, - common.HexToHash("0xc941f8bc55f123b511b6cbc96b26ad064eea877b2c1cd2485f9fc8e068f68892"): true, - common.HexToHash("0x83d5661d492e2bc8e0efc6e85a608afda466203504b0c709e7872965c9a2d647"): true, - common.HexToHash("0x6469325538a81c8db9d6e8b758fad074602e0d40790260f1b51b2aa167e61f3c"): true, - common.HexToHash("0x9853c05a1e7db92565b773dbbbd9dec15c985cb4a68c6cbbb33b316ea8a49abf"): true, - common.HexToHash("0x3d133c48636032101aef5c27cd77acf7b4449f044e4640452d95347bc8611481"): true, - common.HexToHash("0xd45924b501e65ebc74bceddc0382effd76055885aec62d704e1b81a34efa66fe"): true, - common.HexToHash("0x0d89bc67cc4d416378acccf19531e7da9424c820d2c1667b196508a903264e0b"): true, - common.HexToHash("0x7da98a0fff863c0dac633435e29683ed2e61d8dd5f4be0e5e8acb65b506b7071"): true, - common.HexToHash("0xe251416e837d556865b6cece05dac515948600774e052176704effdbc3f7b1dc"): true, - common.HexToHash("0xc2b543e8b9cbf619af05f659ba0ba7c65cf20ccd40fac3d76722931ab7d98168"): true, - common.HexToHash("0x5465d66f1738653cd7b4406f7a078b9998f69fe912fac81079703dcb1ddaa546"): true, - common.HexToHash("0xb41daabe0667f3ba303b93d319a2437e088398e36f60346ac7bcba0b1b0ce6b3"): true, - common.HexToHash("0x3e3ae000f4dc205cd9ad3fd9f9d38565d271ba20e4bb3ed1c3f94bd9a982b665"): true, - common.HexToHash("0x1b65c3d2a383f90d494131b338243ec698d4bbd7c664e59247e4ed03bc35ab94"): true, - common.HexToHash("0xf80f028261b3ef4293b45d4dda3cadfde0f7444d235e897208601fe86239d6b7"): true, - common.HexToHash("0xb1ecde30c6e3b3cd698bb1b446dd5421009ded49be36ce0e9bf402407dbec4ee"): true, - common.HexToHash("0xc47712e40750b4f86e1490a0c8497739f7703fd390b78614d12bf12f3de262fc"): true, - common.HexToHash("0x87da30f5e594f08abf6a37a4ce3b719f500f4e9ebe4d1e0114152c16df2a3c17"): true, - common.HexToHash("0x0a01a4c755fe6d1c2f85d7b824273d63e7a21087f26bc88cf7e2958fb11a6d1f"): true, - common.HexToHash("0x2be7979f7290b4a344d56dac559013bd2ac9f38d1ba86b33dbeb54f1bb1b3665"): true, - common.HexToHash("0xbddea4c156b2b7316ea00dc5e34de4f700b3b2cfb033299b046c24862a81af5f"): true, - common.HexToHash("0xfd8e34e01dd070a1cee3530c4f3313aa33671ad34b188ab13614d8f51c2fb340"): true, - common.HexToHash("0xb23e74a18e9c997c87a6ac53fe2e9cfb97c57260e4ef915d2f86aa830163eed4"): true, - common.HexToHash("0x03a5c062df64ba29b7f7168990ce7418dd24aed5edcbf05712d643d545c95090"): true, - common.HexToHash("0x9624df3261f13e4960630fb36c96e80d5b9dd4e1c5d38835a81dba259b913eb5"): true, - common.HexToHash("0x71e8c513c05da38ffc21f4fa27b443734dfd7aae100ef0d94122d87487c6e363"): true, - common.HexToHash("0x3d790e4cd1782e5df73eb1212bc9c989fba6cb013c18cdfc9c4fb50661d0edf1"): true, - common.HexToHash("0x509a04fe66c8821a153331d79a1715b614e120a819bde99e3f092eb73d81e3df"): true, - common.HexToHash("0x7740aa08ca2f83ec68b151218e2848fd75db08df819bce87af8017be63025467"): true, - common.HexToHash("0x9b26f3f51f676178e845cf2c501701d8e9ce46dd728697ef75719b330c846b7b"): true, - common.HexToHash("0x9d47c20ad664c70559cae1ee1286bd7905b2a1fcc6d26cfa145856c17fb75789"): true, - common.HexToHash("0xc9c86164b1dbc9b198d812819f51c063714977cc657db14b83abbbbf2aa6b0d8"): true, - common.HexToHash("0x215334dffc3bbf7ff4e1a8d6946622b68a636a6f3666c6c28faf7b55be61c9e2"): true, - common.HexToHash("0xe948529e1df07c31273a0d7d52a0610e400f24b2e7725270dc5b2e9418d8242d"): true, - common.HexToHash("0x7e5fbbfa5e2b9f9d89fe5b7964b0d66fdc69e71871dc49b4cb7adf853e4d8673"): true, - common.HexToHash("0x1be5f9149ffda4bdffb20dffb3587142a16481205586cd0cd8c1cffe41106410"): true, - common.HexToHash("0x2deaf93597cc6ca71e0b8f0cfe1dcb7d9725bbf4d54fd47a17ade18abf33cd4e"): true, - common.HexToHash("0x6389e281b2b2f0a1d998bbea6e2a5cb3930b64c2b2153aaa8a00404f20e44f53"): true, - common.HexToHash("0x5f223a29575aaa2d348275479f108d47e86a1dc813a9a0cb96feb545d3144e5a"): true, - common.HexToHash("0x0428d75cb1e769ff2c975aac72ae604df5bcae351f57d77dcc905b68b161f858"): true, - common.HexToHash("0x82e07ff98b711371c3e065ae63db73244cb8fcc68e2a1162db3a770b913258fa"): true, - common.HexToHash("0xe2d7e2d8db64467fd7fa54361ae056d81d185c1118f758e1aeeda595d3177009"): true, - common.HexToHash("0x8fdf3f57efb1eef51255bc2bddc6accaf246c0482a0104c0307b10fabd20bd5d"): true, - common.HexToHash("0x4a236741b76306798c68ec43ea2d7c01615a183a91797f466cdd55a8f2895bc2"): true, - common.HexToHash("0x3e5319b185954d73ce1df7f3ffd9fb640fa70fe75f7e9032a95e2b1f3e402af5"): true, - common.HexToHash("0x1465e5093bccd8c51838b0fcf3bc7e6c4b2e8c7f7be911ba5f57980b385046f9"): true, - common.HexToHash("0x30a6bce401a2390b2e71431ba7fff18f0c0553ec74cf40d9e35e84763927527d"): true, - common.HexToHash("0xe9e6507412e80d99cd3302e627cb11c200806c242c7861b959914874c4fd806b"): true, - common.HexToHash("0x87b51c479a007c9601510918efee47c376741e6436a00512249c82de712ddc86"): true, - common.HexToHash("0x0036964b0ecacc7af96a4a27e9acfb49d0b31969dd7d602996e5d2f5f5880b89"): true, - common.HexToHash("0x7c3ea8b1b54063dc17812dc1a56398c1157da325ab3b12c0a1af32ae24d877f5"): true, - common.HexToHash("0x3eba7740c17bdc6cd941a4b3ec2a2a3abe230ca6069c37907d76e4ff07d6cdf3"): true, - common.HexToHash("0x54ea3d14e44eee30dc42b990fdff1ed05559f726e94559c57fe66a53c5d6e095"): true, - common.HexToHash("0x8b4654130e23849970999a0620c1a973570688ed3bc6ce37e0dcc633a08a3292"): true, - common.HexToHash("0xa977bc9beacb464c83d813ec8022a5e5ce7750c36c1a37d7a59cf3146e3f8268"): true, - common.HexToHash("0x5f9e28e8335595c82051caa1fd15642466b4caf4326d3db2335f4c25b75ba19f"): true, - common.HexToHash("0x50f4d190e77f1754cc711969a92b363957bf5d350d255133317df3068e06e218"): true, - common.HexToHash("0x3054ef690212d320a4a5fa49eea1d7a8abfe2f7930535ea148f6b96004ce2b80"): true, - common.HexToHash("0xe62401a44330cb611885f29c6e522bd131a8e0b6b4797d8372d23136a33bbf19"): true, - common.HexToHash("0xc85e6c93756c3cd01e0aa6a12172763fa7229c4f005f1d67f22808ac0f267fd1"): true, - common.HexToHash("0x44b37809d6c1a0eb13754b87346539f6034030c38bfe75b96f44d9f4094af720"): true, - common.HexToHash("0x7d8c3295cd631272148d448a3be674437a6a042fed1b22609d7538697d837757"): true, - common.HexToHash("0x765c160b84ac34c85a612443803f9160168babcda4b1f0042b4b2395b869013f"): true, - common.HexToHash("0x9eddb21ba87ca7822750e4f30efc3a94e6fd687c0dd25cdd164d24bfb73c61b2"): true, - common.HexToHash("0x5e319b7ddadbb898bc15ebab4928e8815106d0208a44cba3a59897d3eb14a4e6"): true, - common.HexToHash("0x09e595e9ff3e263587513509df7f9de4ca635bc3b9eb85ba02d2af2ee28b0e31"): true, - common.HexToHash("0x52c4ab5725415c438a6b5279cea89a58c2bd3e692d59cebfe547c6b7330d85da"): true, - common.HexToHash("0x4218c0663d8a33fdcd94f407e9ac0ffcfb597a42f5a3d27e2f85f908e150367e"): true, - common.HexToHash("0x4a92ddb8ea23094d1819b08287e5f469b9b5d83ae23e1a0545d955e18364b622"): true, - common.HexToHash("0xa85490ffe08b1249b762b2e78d1381b98cf78f6b54d207d153e22949b228c12d"): true, - common.HexToHash("0x0cd4aaeb3c51b0d48f5bdf0b93d5d7a5afbea3defaf0d56ba061d0bc7a9f893c"): true, - common.HexToHash("0x0a37b9367cf042f80a13b9ab035aeb338738b29810da81c9da11a48cdb1e0e14"): true, - common.HexToHash("0xa2a467c6bdc72c377ddb3dbbb11dfc7e1fa386df011bf44299adddff308d8154"): true, - common.HexToHash("0x3e78630e7b84e3084a6c035b47db05848960cba1357c2c6e114410f23842f437"): true, - common.HexToHash("0x2480d1d25a34d67bc5efe8ded4ef939a58e19d515cc264239c54880151a98697"): true, - common.HexToHash("0x5e44336fefb010fbe49940864484fb203c1c1ffb473bed492776d9c5ec1f5016"): true, - common.HexToHash("0xca764660595d8f2f6c391aa7cf37d192b8cc1bd4d523ed7880aab07956f0af26"): true, - common.HexToHash("0x195ee74a054df30b628b124c4ba28e415200ccc53d247315ffc0b8da009c54db"): true, - common.HexToHash("0xba8d7a7c27071da17723f44f64d6806617b2ec60a666a1caee6478ea6621e1ad"): true, - common.HexToHash("0x404859eb461c6b8f29e21009b62263e60a285196d267708b0c7bc82bdda04147"): true, - common.HexToHash("0xc2636bf9a2ff4cf89f16bdb4418e9521b53695f8ae6cb080a2ff38d6279810b9"): true, - common.HexToHash("0x5d17b147508ce27a00abe687f348db0fd18a97c7737f225e0d7d4446b584623e"): true, - common.HexToHash("0x162b55096dc0b22e89112ad6433bc7879df14078eba0a680e9f3b6a56ecc8720"): true, - common.HexToHash("0x708f44d4b51b4c2498ee83b73b4ea29ae27df1850c8e7a2a7a9acc569b2e0939"): true, - common.HexToHash("0x93125a778679666b2bd96961c2ddaafc62aaa8342b0d6e83d1195ca07d047e65"): true, - common.HexToHash("0xc7501e542d7edbb54af0f69a2e9268f6870a579570bc6ea18a1645a1be8d8a22"): true, - common.HexToHash("0x79c3264f253e787f3d4a69aa6d8074faef3f334635d02f117316e7c3aaf5594a"): true, - common.HexToHash("0x46f2e92a0c95082b4f24d006d919c23663f44b90033a28b0272dfcd201655b36"): true, - common.HexToHash("0x206b82506fccab9bea77d19d357593d01300e51b0862f5ed95a50e9c6a864b9e"): true, - common.HexToHash("0xb42901c082242e06664f60594b06f68c39ba1711d66ddc725f45a6090a954f3f"): true, - common.HexToHash("0xc943f029e87d465355d2c256e6788291034eb05f929eeacd500fce8e775724f9"): true, - common.HexToHash("0x579a2736735173bd1c4e380be8cb2c8197d0c1e43515e3e20d434febe7abd98f"): true, - common.HexToHash("0x210c78c6894c90e1eb10675a74702f71e1250af109a17b42e68231d401e1c6a3"): true, - common.HexToHash("0x05d92904f5520aa6e9aec9c257c724fa037a4bc2aa37cd4ecde16f0eee79195e"): true, - common.HexToHash("0xb535953ef4715f4822df09339e58fa1dbb7a45cc7dc44664e23fb75e6ed5a71b"): true, - common.HexToHash("0x976ebfbed1d3f68cd4bc4840ae2d6f7f1b6420eb8bfff6f2eb7af0b484dcbf32"): true, - common.HexToHash("0x44d325f6dc308c5af708eaf2700061945a158d0c9d055ef7940ace8a758158ea"): true, - common.HexToHash("0x31583ace39e01555e9f64e34914d1e0a720483a81927be08763b03143a31d9ca"): true, - common.HexToHash("0xd7c96d64c66672b2b19529ca88b3e1ffcb30ada6ab0355eea7366fe572a01431"): true, - common.HexToHash("0x9b938f1c5c14515e719dd65f28014914bb3131e6fc505b6e893778f46a642b92"): true, - common.HexToHash("0x89963406892afbbdb6d705ca86c24e86632ea421ad260f68192c6c312400a55b"): true, - common.HexToHash("0xe4bcc07db4fc614b8f40d1bb8c1a1c63ed85cf1f6f39995c856fce4e1364182f"): true, - common.HexToHash("0x3b924e7ce7ff2f6879a9b2814bc3b42fa3ebdb851c885bb2de3fc590badd56d7"): true, - common.HexToHash("0xcb24b90d5b3b40453bd9bb435efd1b6e849128e7b81ce86e7887689348fd80de"): true, - common.HexToHash("0xf041ff9479f9bbce8d9962e72cd526aa5179c1c8b66207167adf2aa51b8c5798"): true, - common.HexToHash("0x1e640d3bee955ac0a8c3768368795da1de202c0487312da1df465e6e3816f5d7"): true, - common.HexToHash("0xd779c2a3e944a9d3122622dfc7e1e21dcd1082c6296d33290d7de86fd87b380b"): true, - common.HexToHash("0x3c045420499c664fab5d863a4a3e29fd8821a46599271727a80b926f5e958c46"): true, - common.HexToHash("0xb7db538afeb768c87cdf70c18e83fed71470cc1860b38ec6304919fbf3d5f403"): true, - common.HexToHash("0xc7bb0b93b54b533b35a9c59c2fb15fc83b9e9cf2abbd825923ceeb80f84c0f9c"): true, - common.HexToHash("0x8dec80dea20e6fe8feffc63059506400cd221d1498ad698ec6ff0932a68d7211"): true, - common.HexToHash("0x3dcc5664204b88e8fcc615a3fe9ceb13f6efc546584e939cd7499e073ce1d380"): true, - common.HexToHash("0x93b600c85f1e55f258df1ccd6547636d05300f832bd6dd4ba7d7e8e395e69ea0"): true, - common.HexToHash("0x3b9d574f4c33b9cc49a783fc81ca38ea2459af51da7c6bbbd8a5ba5cce770174"): true, - common.HexToHash("0x694e3d9ee557d17831b9a34cbcf684791e5f569359b75b900429c99721bbd1ba"): true, - common.HexToHash("0xad500b84e3accbb4a4643ff68fb8cae8f4a89ae6c15017b3a4b6a5bd30024a30"): true, - common.HexToHash("0x063bd6ab6f0cda757b96779d3e0db48a555543a3777d98ab9c9d4c86c9b236a0"): true, - common.HexToHash("0xcd29e93560dd8b367f699ab9de1f514b435c8e40cd6cdf4213c790d56eeb43b1"): true, - common.HexToHash("0x4be5470bdb2a74f7482ff2ab3cc343ee58d0636d1a2ccd65945f7f14234ab661"): true, - common.HexToHash("0x3fd9f036b3c2aa9a75900fbd00702b4fcade86bdf5b7c518fdbf3ca7b300f216"): true, - common.HexToHash("0xf01853f0419b47884a4fb292247425247f90e6b6da7aee18bccc8d183cfa051c"): true, - common.HexToHash("0x9967f9aa627aa49be1dd1a55121a2e180292191216fd46887ab3c7358c61dad4"): true, - common.HexToHash("0x30eddb22f21061a25326900c48ae15bc8c4843451959c25041e1c18531e11915"): true, - common.HexToHash("0x14265511daa1056858414db9090c5242dfa952db7d0a90045661cdf5e9dbba07"): true, - common.HexToHash("0xd6e396d4e9527141a0719bd306ef43a9dc5a7b9560c5569787bf58af8818b3a0"): true, - common.HexToHash("0xdaf25a3409a36c641a5e50f25c39a889f95a95fed4ec447c1c930f050a7c528b"): true, - common.HexToHash("0x6ba35c8f3305199cf952a70b90c35891e7d7e3946dcbb772d22b46cc451834c8"): true, - common.HexToHash("0x108637f3c73b90f25c7105d96eacbe3d1a11eefe1f26e5854d207b40d644d8e5"): true, - common.HexToHash("0xdc8e77601ab7763582cbcf90beaa96a583e68efacef071f2da2fe0fcdfe945d5"): true, - common.HexToHash("0x77555f6437b640ecd5ee3e4aca5cf4acebf998cea0fb44b2134dcb8a719d220f"): true, - common.HexToHash("0xfc0a21bcbde0f4fab13df58c1877ed84d623e218b40ccc97e739578d747594f5"): true, - common.HexToHash("0x4e482d98ce3177b479f87697cd581d63cfd4bb7959bf9dd969b6ee1cbba805f7"): true, - common.HexToHash("0xe657a147e776528a86c9db8c72169e836c8c699a0048dbe012cb133a815ed399"): true, - common.HexToHash("0x32f5ba0cd2a82d7e5c44b1017d178fbe96795cc641e7797ac3d32010d457d293"): true, - common.HexToHash("0xba4a7d9f0f3b344fda156ce70fca543f61f6bcfa0cb56a5f27c9386b983f9edd"): true, - common.HexToHash("0x3cea68118690441853e87f43657a7dc78d2ab9ee6dbc014b9b8cd38cd238baed"): true, - common.HexToHash("0x5b46906f54509ae17757209c39223cdd667f0081420c7949b5d62c7f0ff1512e"): true, - common.HexToHash("0x0c40393fdcbb9afbdad4cc633608093e4c072c5531beb79c60a7a97f2b0e9987"): true, - common.HexToHash("0x5c11c96196bb12a26606b61c68cb5e6851dd5a65dfe635fa56412f07c58a2465"): true, - common.HexToHash("0xe298960d32d1f32f1d0b97411be8861cc50a2c3ccdc52b5a4ff1eaaa8ce98481"): true, - common.HexToHash("0x799b938dc5017c7519f09960de03605d3ad703cd3016acbf0ad4da44767fe16b"): true, - common.HexToHash("0xa4c5254d074f2bea83e7f8838c2d1086b1901b1ef3c5e098c501d374d93e6a80"): true, - common.HexToHash("0xdbf54c300b2b63f1fb84574f6b284df4e10ab0375e7290a206e81fdc57e5a2f8"): true, - common.HexToHash("0xec3af94389362f345325e4cf35d8fe14177c47ff99f62103cc3c1b1136891b9d"): true, - common.HexToHash("0x4e2f404664554b82e0f9ff71bc1dfb6da22f8a04d0680eeee18c4e25a9a6fa08"): true, - common.HexToHash("0x222e41a740fc401ea9e6e3741e694d82a9a09419a3a2bd8139eea3984b564123"): true, - common.HexToHash("0x768d52a7b36606af07ce06246c91063d09c2c0a7719c7c000bdb9abaa9883e5c"): true, - common.HexToHash("0x91d688522822d9d4817c3ed783e50e91e3e2d671d050fcaef432077a6db5db8c"): true, - common.HexToHash("0xac086dcebacfdc84f0d4fbcc20b3a341f6ec07061a62766381f479269a432d9f"): true, - common.HexToHash("0x7cad79ac86728b4d8a683d1703d8695598a80ef4b2a7f3b2832f7336b1037fbe"): true, - common.HexToHash("0x72fcbd896b05772dd4bdf56de84e7459c38f2141a2409e6195814323e87141b6"): true, - common.HexToHash("0x6488c942c043fb9e6fe4731f6e157582e2bbd19da1de8d7a8363db8a3802ad22"): true, - common.HexToHash("0xc4de4ea66225e4a78443cac21f6f8b4ed3bedb958cd3a1237ba940afa6d740fb"): true, - common.HexToHash("0x392f86074c21da509975bc09f900042431b323dd111b494ba2ea1ef73d753827"): true, - common.HexToHash("0x1f95b7313ec61af9142ec4798e9bd73b6135fb9d0a013574d5e126cfdb52241d"): true, - common.HexToHash("0x4645f93fd0da90b8e7c01145fe40e0cef749711388495dc6748e0a4f7709e45d"): true, - common.HexToHash("0xd83c1bd00019095cc553aa84b782645340c219412e06e7b5f769fa325950b5d5"): true, - common.HexToHash("0x08db6a1e451421d9b08e1e8ef5750327a30ff5ce583a404201f230232e13704c"): true, - common.HexToHash("0xc03570606acc857cca7a5cbf6746c538e0e11740b3dc9c82e47a3690db6856cd"): true, - common.HexToHash("0x0ea69988610d34d6a18e8fc1eb73d234247d77606cb89042a387c3923d5fd701"): true, - common.HexToHash("0xf54109270def4e22b9df5bf06a8da8c7fc2efc2faa409973a3d57d64204e7d20"): true, - common.HexToHash("0x8877930a5b174cab5257753c550b1e4854ce1ae2d593e1eacf0509ad2b6ae425"): true, - common.HexToHash("0xe381144cb3f60e49b64fa8f98564dcd0296fc445321ce747a7860ca655c82653"): true, - common.HexToHash("0x523327fd54b649976c3514f13ff0d141652a86aba4e37a4f08834aa9901b0b9d"): true, - common.HexToHash("0x9453f3b07d06b4708d6795a915f911a184fcad508c651c6ef786d44629748b37"): true, - common.HexToHash("0x99efaf839a2529de4da7ab3c8df4e8bc22c4bcfb169877d22068de6ef86b28e5"): true, - common.HexToHash("0x6af0d7bbc55e60835ffefac77eef5f0eddf1a942bc373ca1cecbd22cd2d276b4"): true, - common.HexToHash("0xa596e85fbdd4562af313fd4f4f15f3ee4af34f581f1a78e171818182dbe0dabe"): true, - common.HexToHash("0x893998e10bf40e6706e2a6b4aac595ce202bdde3092b547a928d2054eb58c56f"): true, - common.HexToHash("0x74177b3b261f230f5310a6dfb8cef2c1ab44308e6ab381f18b86850f48062115"): true, - common.HexToHash("0x5544c5c01a1c119f6d8dc449bad459af040ed2c11ae279b162e9b46df4140837"): true, - common.HexToHash("0x244524fdc2f12bf19e9554bb7682b61705b69bf08d294ab1a04389da1ef86933"): true, - common.HexToHash("0x4b9def16c06ba4c2e02f234c0fffeaf1289282b326c5a5fe86d75473cd45a9e9"): true, - common.HexToHash("0x6cb68da11c5178889b18f4c373812698698ee78154a27a09c2d33da24e6e1df5"): true, - common.HexToHash("0xdd166542c3b56449c4578d2cf85c9e04f91a935b3890edb50cf8141f66ed0c01"): true, - common.HexToHash("0x1d37217901e5745a0337293f42c43e6029d98752d01a946e8393d3cfb54cd9ec"): true, - common.HexToHash("0x7adc5f2b9e9952805d6246556c863765e865080f1fb48107e692bbb369305f93"): true, - common.HexToHash("0x170d595ceb3cc89f68bfcb4816230261f98b60a8f16cea8937a56e96b20a8ac1"): true, - common.HexToHash("0xff203e0ceb03bbd9b502f2c3a974bdca71a550e9ab9e65712c918d0c482e8d94"): true, - common.HexToHash("0xc09cde40ce196bdd861b42ecbc76ae85db41c6fd1ba3847f1829c9a98cffa29d"): true, - common.HexToHash("0xa1f4cf9a05bdd878c0d447cd36ce531bd6b423e94c85ed34aea3a9846f553e87"): true, - common.HexToHash("0x609a80215a39f2cdccbb53c44281f6e43b609c9ae99194ef47438e482cf81312"): true, - common.HexToHash("0x80126465f4a8c9885df9492549a10ba5e064d2b19f9555474b9b555a9722b128"): true, - common.HexToHash("0xdc996fa59b74b5ccf9164d94f851c2c5adf76a771923b3cabadcf9c706a6eec6"): true, - common.HexToHash("0xe8fb9615b9a16169db5d115235dfd9cad94b660e042949b9c60a920668243b74"): true, - common.HexToHash("0x61c93ec0e7deefbc60e6b48955e6887310503034f052643a7cc56240b5788c18"): true, - common.HexToHash("0x9f5307996929cc8e3e676a0c58e971771a5c9c2535ca6e002e5ea009544e5f51"): true, - common.HexToHash("0x7f3257c8343fb58bb3857284a25a264bdf30653d1c8003131bb4d04da7b12e00"): true, - common.HexToHash("0x9b1c52b82d94614bdadc06c3b0f3e779bd4f90d14a33d52b0cfef4e91226a8e9"): true, - common.HexToHash("0xf341f6ff192c99b2dc9cb015f6c83c1d82838831219a13936b71484f77ff45ff"): true, - common.HexToHash("0xfca7377979fb93b48ebc57e9c2d2d177b563fa51c44cc2ee307b2dc4618304ef"): true, - common.HexToHash("0x15711686f29e512fbe857bddf9cdcd1a200be5bd5ed07415be0e49ed589c28c1"): true, - common.HexToHash("0x3e53cb26d841f678aa4242d8d1aa5ffd63bd9be379a81059af9b13447bca3616"): true, - common.HexToHash("0xf0cca9363c1d5e5f11a40e8f627331db085eadfb1d5e3f360fdda04f7719bbcc"): true, - common.HexToHash("0x1a41bbd9c5b8bda907ce24aea530136111deaaf60966129f57d51a8c06b2d82c"): true, - common.HexToHash("0x61f8e0d0e55c6855c88f158f4f70e579d40be90742e8bf6665ad5e57e1ca7fa9"): true, - common.HexToHash("0x4b68894bf716e317379ed402df681b31b638a065ba4bc1f47ae1f0ef2fcc74d7"): true, - common.HexToHash("0x009968032fc0c152aece3c214a3652d5301366e376e5b33b64e3f737f5b2964c"): true, - common.HexToHash("0xf63e308da6f4afc3a22f48edfd5383f91e0cf81abed2d2776da1c46b08a2aa4a"): true, - common.HexToHash("0x803d2cc2a039ac2cd8e8defffc74dfb79f4777fef3c00886032ff6529bc41797"): true, - common.HexToHash("0x806eed59e3a213d653bccc793f19c561219dfc467eab597ea82a81e5ae833540"): true, - common.HexToHash("0xab5c9a72d778b855f66a0772d260ced2a651834a07ffd780309c2fd51afef79d"): true, - common.HexToHash("0x3fb9dc6c0f48b670c182e4b580bc7964939830ff828503905204e5ae832cca0d"): true, - common.HexToHash("0x035b63ddab0b046863949a0c8b11a371975218bf4fa6a4498f9f0986e898ca53"): true, - common.HexToHash("0x97763d6fe550a378f97898c446e5cbc4712d95cb6ce858a8419a51851340f5ff"): true, - common.HexToHash("0x99acc0407d11524636df976c23c2905a6f579b25e8dc0eb17eaa5bc363e6b523"): true, - common.HexToHash("0xe63b2fd8b355c35f16ccac14a52d5b18b8b6852801ee6e3b2050f918e4a75b45"): true, - common.HexToHash("0x8acbe4819ffa3933bd5ecb1c91e1042cf407d5f6d585a73f3e25da9cd7dc54bd"): true, - common.HexToHash("0x04cce7956f1a057583ecb6b11c88dcf03a8b0d535000a668a90962d8e0ec8d10"): true, - common.HexToHash("0x6553b131271ee80c3301d14a38f982b807ab5eb3f8918ff19c5e836d7fd33c4d"): true, - common.HexToHash("0x5b4940da2f174fa57ede7d7080125bac6ea00d6f1d96b4e45765e6d4c0f01b0b"): true, - common.HexToHash("0x12d108a0781530fb8d86c77e52e0316fbcaf03840e33e08c8c664bd5e96c5592"): true, - common.HexToHash("0x0905c4eb4b2582e2708e6156e0d6b4ae7d3f131e0fca409d29e47610400937be"): true, - common.HexToHash("0x154f6368a3d8aee09446be601cc666c04807b4ce3413018345e36d3fbcbf6e98"): true, - common.HexToHash("0xa74691b2675e0b2dec919bc6b6ff127255adc39ddc802a07e8aba781d930099f"): true, - common.HexToHash("0xf05ae914e802734311299e584f8ae3b7dd2116cd1d1b2e969ba9a03ccba220b4"): true, - common.HexToHash("0x7e88c1253d4a22d1574424c2caec302852e1b4b1bc5386b07ab23edacc27cc15"): true, - common.HexToHash("0xae67f0e20869f74285bd77ef56eb0f0a01e7f11abac0b31597e7f95341902a21"): true, - common.HexToHash("0x756f474238ad33fd95008d2a0d0b0da40e8a604bd3cdba52c5d1ac26a45bf6ac"): true, - common.HexToHash("0xd2c64fd034ef8dbc4794436cd4769208ce190fe63b60c885f25b45b3d87ac326"): true, - common.HexToHash("0x5693527aa98925ca4d75dc212a582c79aedcc847ddba3607ffdeb85f61bcf6fc"): true, - common.HexToHash("0x7ef3725e6a96d8c1499033b8a9a49f32bb133942c432ee5fa438b52c5f491b91"): true, - common.HexToHash("0xc28a5788cac1b94dafdc9460881ea73b9df0b8de3ddf0b60b7f330dcb5ac7612"): true, - common.HexToHash("0x6306399b9fa10923e2788aed42ced59298bc0bb6dc04a7406cbc96917519e689"): true, - common.HexToHash("0xb26a104665a10c3d7b81aa0012069c2b4b99f5b72ad9d1502ab72a8846a974aa"): true, - common.HexToHash("0x6cd73ce215d8e7887007e3cc0795ce3135f8abcbd4a5419f85c144953d1ef7a7"): true, - common.HexToHash("0xd39cb9bae0d7460ef86ba2d88bd650d91fabee13f4cd4ae79d6d9e6c00af513d"): true, - common.HexToHash("0xb624e5a289b62925f2dc733623ee8d02b44b15b439135a4699344f8c3a98b1c1"): true, - common.HexToHash("0xe12f214552ab434415678a794bd8dd5c28b4861f064a4e712b2037465ce9e845"): true, - common.HexToHash("0x33f41b53842d6065e08a78caefb0a60eea7e8dac97107422b11bc778f1f6b606"): true, - common.HexToHash("0xa4b74bb55bead760dc6eebf8ded5916aa4ac52199c3b59753f0e9aa8d9a2ecec"): true, - common.HexToHash("0xe529bda216bf52aeb3ad3473c310214b44fde42cd0e7bc1837c63b3e74cbbf02"): true, - common.HexToHash("0x28ff7cc19ecd3f925ff53dc6264944b8763198388cfa4ab0f34f3874524577a3"): true, - common.HexToHash("0xa87688762399870bc273ac2325b0fd65ca61a5ee0363eab24c64f93452ed75bf"): true, - common.HexToHash("0xa4c7c37dd97459eaa1a97dde5660e8a0649f82f48866ed5ec06341e4ec3021bb"): true, - common.HexToHash("0xaafdfe6cae8a0e21ac8895334a36327a3257d7616359f76cb92a705036456f6f"): true, - common.HexToHash("0xec32908cedb80b5815986a42b9c849ed136f8fd7da89409ba7428659e905b7cb"): true, - common.HexToHash("0x6d2d7d6967983799330c094bf0157c5f8f2098ceec312dde14a66bb23003e347"): true, - common.HexToHash("0xeb3b6877cc8a6466aa230dc05c820468c3fbc4b21ac69febeeaf1e654109ca37"): true, - common.HexToHash("0x9332d9ecc1861ba2ec36b6f28729260a2c5979a969c21e4067a6dd0376a416b1"): true, - common.HexToHash("0x038bc61d2bb3607f582ec827e28966727a13bd5d479c34cdcf0394fab3fbb038"): true, - common.HexToHash("0xc6c0b5702efd95949bea4c2ad328fba159f4e147e66fee3a9715dc808b1227db"): true, - common.HexToHash("0x8e4be683efd4bb386e069d2573bca3a70a451e768dd2ca398ff1495f0fa9cd1e"): true, - common.HexToHash("0x2bfd7b8032f940daa4e3154c9f8dc52c21fe06dbd4fe04cd0c00fb5faa00d44c"): true, - common.HexToHash("0x5a3360a2a1ac7a85558032585f7d4a914f46c30617a7dc0f5257e9c0d1e034a1"): true, - common.HexToHash("0x82affd0a09ce20078e5c56d3faae5f67e23351439c25cddcd6af6caf6f45dfdb"): true, - common.HexToHash("0x1e879e7438fce2e7fda120f05deb6abcfc38c8f70591b7f5282b3e3100a8f187"): true, - common.HexToHash("0x78105d1b7685e2475888cc256e3895ecf6ec8f29930a3d17376066495677eff8"): true, - common.HexToHash("0xcd6275b5a31520dd0fb36f215d0aa5e6c29256276500e3464634f69c600ba401"): true, - common.HexToHash("0x3b1c697b116da48f2f3e633a3f2a1779a55a1b468f8dff38f50f62b58a0871a7"): true, - common.HexToHash("0x8171a7982be0fe80d5c133e28f23e11ae5ee66a2bb34261b34670642f8920867"): true, - common.HexToHash("0x9cfeae741a80b83a058f679398660c43eb4134ccbfdd3fb42dd3fc5414faf51b"): true, - common.HexToHash("0xca3b60b2a771e7dd2dd345ffd91a1d69ede9c7eda214e057d04c64fc633544f5"): true, - common.HexToHash("0x29eacb03f471569328a5f4435f81a4c8fb08b1e28020dad6ec82367a2ce995d7"): true, - common.HexToHash("0x22f682992e9a59c689af2dfc69784ae972fb0f0b3eb5d3ee651889509433c68e"): true, - common.HexToHash("0x9ca33eb50f2fc6ef4182ce5fd179bc94c24e9cc02a24a7914635d7ecafbbb8af"): true, - common.HexToHash("0x3e7cdcf250c20a9c9fdcca2e9fc09829bd1bcc01054802042eeb200c31d43d5e"): true, - common.HexToHash("0xeed266d701db6a5c40aa6c2e993de8d5ab6aaf0ff028cded8117dca758b8ac27"): true, - common.HexToHash("0xcea855b1d37ed6b370b70426961f0516dadb63c01d7d1bf546b93765f30d7019"): true, - common.HexToHash("0x913a1c1b3d88d13b0dda377ec0c965f4c9adcc9476d38dec7bef476def74df2d"): true, - common.HexToHash("0xf6481924f53933f128e2d058f40a064cbc3d2f08b54fd9564b21e94132ea59ba"): true, - common.HexToHash("0xf1c10be67c165a47f89f19a25bd4bd64741b5887151c8bab332c930eec3f3478"): true, - common.HexToHash("0xd1cc831381d86c8acd6b510c70ac68d8fd9d082aad053f8c352f68a8a56e402e"): true, - common.HexToHash("0xe55ba7df258d2905b9517b0af46adce462819beb99edc8ff93398e7c1482b7a8"): true, - common.HexToHash("0x1e56e6a56b6b636f15cdd32eb41d97dfa43812f51d341c9eabdb67ab3bfb4e1d"): true, - common.HexToHash("0x7514db6a019a3b559ddcc34663f81b17886d016e76028c68e2c4952c277f2e7e"): true, - common.HexToHash("0xbc0e94093a65059486082672d0db6b00b2cc4b72f9a676ee42d7344524cd6786"): true, - common.HexToHash("0xdacccd98649ed5cec03709830802934222ad3136b4cee16e45a1e1e18596150c"): true, - common.HexToHash("0x4c61649c3c87ed1c6b82f8c6c1664a0cc820cce995d5ba5722621c9b80068806"): true, - common.HexToHash("0x912fce5633f694938985e601fac5a9d27a6749ee87b5e5d0b3618ffe2e1cdeb1"): true, - common.HexToHash("0x4da658a049ffcfbd427d828f5d4613fbf6dfa2eaae1bbacc4b8b03568f5d182c"): true, - common.HexToHash("0x32574a222410b42c4bb175726772203d716a6a2b7ea5d6c737a089688a3ae488"): true, - common.HexToHash("0x3f3ce176432401a7f5a679d4cb9379947e891827d35fc2e991136d3ffbce8b61"): true, - common.HexToHash("0x4120743bf3cc44c118b3af7b70f6f4b2562e9a61222dacb30abe04cd26476e78"): true, - common.HexToHash("0xdaf1a85e8add1637a2b656e33532eeac5a32376a050fd9f6e03ae9d8b21fdaab"): true, - common.HexToHash("0x0d164524c2a2166f4c4a96157e7550d6eb8f721d8ba48f35ea1328af211e85db"): true, - common.HexToHash("0xbc94744f6f38aaf6474c9817ca286db8faf82da2496aea5add812dc6907aa7c6"): true, - common.HexToHash("0xd26b7857623bba8d2d682b56b6740f4407276629a746f2f4577cc24f9e3367d8"): true, - common.HexToHash("0x259b1169e74797eb8dfb67df446075e8560404a3e2028e1b7e0866431b9a2217"): true, - common.HexToHash("0xae8cc4aafdfad7328b0d184f13d39ac61c179c3c9a6bcd1a056b4072b8327049"): true, - common.HexToHash("0x265b08d98d9a6c1d70c0bcf3d8a96924b2484ba309dff10276d48261acf654d2"): true, - common.HexToHash("0xe3e41948094dbd1e114355a3f12793b2ccb3dd50e250c4aa0f48f6de54cda22d"): true, - common.HexToHash("0x21a56df86a1d7a290584046948abe3547c33041e1911ef01fb16c50cf02cf507"): true, - common.HexToHash("0x82dcad6a8f6967376c5da96417b6b890eaab18b4dfa3a207803f0037e2b207e6"): true, - common.HexToHash("0x933407f590d968f14be33bae1c0baad7d6a038f567fff3e11b33ecc78e44dfa0"): true, - common.HexToHash("0xc220d49c7b6369ca1aafb4e463f483ebdb0e92440106a5d4d1240b56e4b15fd5"): true, - common.HexToHash("0x58eb4af1a521635eba8562b679d4aa5016a6c7cf425d2c1802530724347f2a6f"): true, - common.HexToHash("0x09d20b6a469182c808e76a10ce0ab0b143af3ecb2356612ca461466f988dc2b1"): true, - common.HexToHash("0xaba89e3fb9bfd143176e0b6b44b272070067b04779ee8407ec5c5145bb63c055"): true, - common.HexToHash("0x9b69399f37bcb0b45388fec74c7f3288f6e9e88bb55da13f9e876873d3e5ebbb"): true, - common.HexToHash("0xd50bc38c55ebeae94d02beff43ff0d5d499878c0f2fe25d4f27d50bebc715ddd"): true, - common.HexToHash("0x933a20689e1bab2b578d3292c6e483121657088c98ccec33649455d9540ae1fd"): true, - common.HexToHash("0x35ae988df0da5b5614a92bdfc8b18db3933a3d39857be04322f51cf5cba999c1"): true, - common.HexToHash("0xe3404f861ebcf43335ffb57fef1a8b1d19691f850ebdcd75aae26ef8e7192ed2"): true, - common.HexToHash("0x0dbd55192a971e611da5fd6ef6460944487761401bdd37d3340e14947477d385"): true, - common.HexToHash("0x641354d398c4709d5ec3f1ba503700cd31bd6f8f36ad41ac4770229073b8aa8e"): true, - common.HexToHash("0xc5b7dc0bc488ab7e5fd7963f5767a6e5857cf3960320e9f37126b3f6de2d444a"): true, - common.HexToHash("0xd6e8eb026eb85743eac886cf2963d6a006668cf9e7223a24c44631e0c9163c9b"): true, - common.HexToHash("0xa0e5910c42fa45b3cd9b7d985ce9db9befe87ed9fecf080edab6fe78f0c0defc"): true, - common.HexToHash("0x617afda45d31c2a59b3765cc4b2a580b965951aaa909eb4201a5aec35c5b2e61"): true, - common.HexToHash("0x19218b9cb9a4c32087d0d8f2e8ed6962e19369c271638107c136d1d3889b5c27"): true, - common.HexToHash("0x6a36850e60582d7eabc6c8eabdae0f4270d81e964e61dde40c0f029cc09a1d05"): true, - common.HexToHash("0xcd734e5d0bfff216a3772ccf42fc7a9fe3004c8c567235b67464deba4b28e74f"): true, - common.HexToHash("0x36f1214b705e9879929848da7ffe49e90959576aad6a0d354bcab96bc49f1077"): true, - common.HexToHash("0xc49ecc83a31e3c050f1a443f89a7f81ef4c9979b813604ee5f1306dd2b97f383"): true, - common.HexToHash("0xb921dfaac4cb35f065bd874e707104c80a7070113b4d6b22a7bfd0bf87edec9d"): true, - common.HexToHash("0x0713a6ec9bbc0268123d19ce1196ac669c819e17452503caa3b00b51b6fd116c"): true, - common.HexToHash("0xce37aa60579b4b790940f88dcf05d5eb58e4b84b956e6c5e176a3ca5a35fffe4"): true, - common.HexToHash("0x2dca233781324744deb7eea3099b2417d4c1330210af553867d7846e01a230c9"): true, - common.HexToHash("0x2ed0f0fe557e2b4445dc12ecccfb8c81acbb2b691cb767f51b056c42e6078537"): true, - common.HexToHash("0x658c9ff26e4179a57621fda683ceea033468fa1d4c8639c6511791688663240d"): true, - common.HexToHash("0x5305870febbc22974bccb2d754de393831ffce2e37ea209d1c2e90716a5a85ec"): true, - common.HexToHash("0x24cb6531a896c33ef58fc04ac53e4b192fb20b34e7837db01a7b0ea7c970321c"): true, - common.HexToHash("0x3b88fdfa1d0c7d41d150137f2cf2ad8161554f584a8cec2feaa282d79566f9d6"): true, - common.HexToHash("0xf0fab855b5904781d7382550bc9ad394d3c6dcb0be5070b7906d49a7a562a957"): true, - common.HexToHash("0x9d5a03fd19938ee20d523d7e7454a7d54224bcd682a3c3f64a8e60b88ea3bca6"): true, - common.HexToHash("0x59fcd72d40c208fc3e59e5b8722244f1936ff7523516fa918c537ec5d7dd79ac"): true, - common.HexToHash("0xd2b4bca689835dd8438b2fafac6db5a247511ea8b45cecf1bc83128798f1d0e5"): true, - common.HexToHash("0x134780860c9bc0696babdadad73b42997ef6e6d7e8ef61b9f71177474fc39c7c"): true, - common.HexToHash("0x82b11d0c545c2fbaa847ab7bbcd33d93439cfd055cad19c618337b42a7530fb2"): true, - common.HexToHash("0x1fa69b5cd0983806f684c75a30c0aaba132b583d969290074dcd49e9d05f8229"): true, - common.HexToHash("0xf0c81dedceef612808c0d41a9ad57c677090c7e3794d3e2c85cc1fd6e467e90a"): true, - common.HexToHash("0x9934c3602672ca262160dd2ae0e964df4a3e034a468a3a4001b7d02d20c3cfff"): true, - common.HexToHash("0xaafa97369c386d9e52a6a98e3669c5bbd2bd4c7db0e3297ddc967d657bd4b4ea"): true, - common.HexToHash("0xdb122fc58ddfc30dc04422d2ee7f8b041a628f5f4ef572e7518eb4951b8230a8"): true, - common.HexToHash("0x05c0438172ad17053810fdbf94bb20c247d0653a43f8c0127310eb8f35e1e720"): true, - common.HexToHash("0xec24265590d7a01fea6dd178b1ef06bd6065d2de38725dae98330f85572f8450"): true, - common.HexToHash("0xc72bf449ff3fedf9d54ee675a3d5736ce887463b43bcbbca5cad55fa33a7dd44"): true, - common.HexToHash("0x90eec7dbfee98a0130cea04baa9715d8ed722698a3a2b5f4e818713a42e39784"): true, - common.HexToHash("0x1cd88e053a08d10d81889da4a7d780d7d0a8baa1020852547e66ef45dae7f975"): true, - common.HexToHash("0x437745bf7258c9c2dbfd342b96756daaf36e795366ce283c912eb0b7850ef913"): true, - common.HexToHash("0xd3c4b832e06b864e9165a1ea995a64a14f56849edbcb156eeb9be92a574912d3"): true, - common.HexToHash("0x38f7ee1baaef3654f539bbaebbf447d913a87c26f7a211d92c315a9e6350f48e"): true, - common.HexToHash("0x5e025ad261ec5cbce8180e9651929918f800c5b37173972a2234c5dd227d22e1"): true, - common.HexToHash("0x2123ca872704278b4b08ead560876e294d82ee0332947f02ddfeb61f76f14dca"): true, - common.HexToHash("0x689675b2faee9ab4e116b1115f1f241adf21a05e13049dfaa6c5e066c8f36914"): true, - common.HexToHash("0xec409a8f2ed4c1c1779fdb434185b937b022e2c981c64f60b63cd41e4f9e7186"): true, - common.HexToHash("0x29db9b4f5ed2d467efbe6c244df44b6e9ab3a1e0d343f5a02c11253ac0ba2cde"): true, - common.HexToHash("0x2bcc3ecf798efdf86c9451adf16700807a9bb1066ffad77845e9e7623ae4f9ff"): true, - common.HexToHash("0x99d5a72229d5eeb3183f50685fdd438e855ce9b43d3abedd06efce85ee7332f2"): true, - common.HexToHash("0x275883cc76c6a875071bf603b128af454fa9b85ab461ae6168908268bb506c1e"): true, - common.HexToHash("0x8f83beac78647def8bc71c83daf201a800b24b0c0dc4c85c151d5fe1532982f1"): true, - common.HexToHash("0xca454cdb66dddf1a88f330716ead654aee0e423e7f467ff9975c5ceb81463605"): true, - common.HexToHash("0x1425a51e6c32f4ac04765998e737e441a2be260b1d208afa538c459e3229c708"): true, - common.HexToHash("0x953f74d53d928aca9ae24f4ef1aa537b87c22c94db3f62e40796c5d22c5243cf"): true, - common.HexToHash("0x1cbc8508fc076aad7743c811b5e04903389eda161da9e0a83940147dfd6a425d"): true, - common.HexToHash("0x16022191259999e56a25af78c2b51ebb7d5744c4333a6cb5187fedb16928fd04"): true, - common.HexToHash("0x7162d13c13c2fdbe2c4caeee80737a9a139139397e224278b8aa4af916faa214"): true, - common.HexToHash("0xd195d89e9ffa989e7b708cc386dff9d8d25b5173b281de6c7fd9dba93895c970"): true, - common.HexToHash("0xcd0e50f7bdccac1a7dba9a84b24932c6d3a1ce0015f9bd69f13bf769d69df627"): true, - common.HexToHash("0x8895a12c9b4c96199d1e13d6a486bb8e84b163afdb7cffb85112c70ed54784a0"): true, - common.HexToHash("0x371fedf903ede123bb9d7bf9c159c561cbf2db35f68c8fa1f98ebb311148ae8a"): true, - common.HexToHash("0x5a91f3c4aec03657e0866f1ada7fdfba1aba5cf0bfcaf52b49f3957f27a818c1"): true, - common.HexToHash("0xf437eef0c694e18bd07600d8f7fb65ff6a350d908644c2f084143356728846a8"): true, - common.HexToHash("0xb8e0bc736e907c06aef9c00253a32f4529049db581a9dafe0dde2821fbb51e45"): true, - common.HexToHash("0x8754f223eae202ac9816dbc24a9c77016e26623e5cdf101a5a8b8b6cc687976f"): true, - common.HexToHash("0x7478ef31e2ab2b94841aa432bd3043c3855ee667c06e7a30d62182a323539127"): true, - common.HexToHash("0x2c732e4bcef4283ac021b91f3d0726f5bbb472f189d09235b8cc7ef737c075c3"): true, - common.HexToHash("0xd70761cd55090b6fd8d80bfc0e9543f0f3ce21da4e91d91d75dbfae1ce77fb34"): true, - common.HexToHash("0xbcc27b0af0de9c58fdd238be64740c07622c167f4a1aadb6ebc8f7b25b04023d"): true, - common.HexToHash("0x8987b81c3b67397f903a14211ef2cc32f512fe43e9b2e5d3145e6008586b9759"): true, - common.HexToHash("0xe01e5b381e5b73e73a4aeffb56af2f6fddaad4855992e38c564976b44a97ed4d"): true, - common.HexToHash("0xcfb13c569db66ccfa7a7308b5e6f333d23f0313853e5200b997fa4222dd1f76c"): true, - common.HexToHash("0xacc1a20b1d26b2bd5de3dead295b1da5d6350523b7a73fef50a50d168734b2d5"): true, - common.HexToHash("0x8f8f40daa5564962059e3debeab61469f8d966bab49eba05174610f3f72e9b6c"): true, - common.HexToHash("0x785a6c77881ac804e9386fbff1c85ac081fae6b7324454c43160c051926d0d9c"): true, - common.HexToHash("0xdb7422b9b92ba0e39c0f09d6c154ae488597586f6f2c6bbd7b50144bc1359966"): true, - common.HexToHash("0xdbf65aa5106d6aebe81af57f47bf46f582c2421425cfc066103a20131005e18d"): true, - common.HexToHash("0x1c39522893670be78139bb1cca6f27a2eca25f8dcd187b437c7476e0cd8a39cb"): true, - common.HexToHash("0x84ce809baddde21b63f676e76a36b2f9fe9164c9f31cb25c7421ac6825462512"): true, - common.HexToHash("0xd172787c645d00d101bc5103f43ce327159ee744579acaeb816e9f26374cde7c"): true, - common.HexToHash("0x9ae190ba48e7dca56d04e4ca038150f92946834345312c45dbc174622ee8b1aa"): true, - common.HexToHash("0x5a3da3cb27b3709766e3201d0b5c1271a6c9ad9180ae56763e7912dd6814efcd"): true, - common.HexToHash("0x56bac7dcbb55c5e5ae8aa0df5966b1ed797019f33e7f95bcf0d087b658197ace"): true, - common.HexToHash("0xc8654fa1ba2728170afbc9d9b0d3a10114885b7a70e132fcdf76c207408de60f"): true, - common.HexToHash("0x735314b36d38674320c5e9eeac95211b142f4eb052f15de62489b16fd3f58b7b"): true, - common.HexToHash("0x606d05aa218a3a4eade06ecb3e2b23d6d0a35d51aa8781c9cdb09febbc8fa938"): true, - common.HexToHash("0xc31cb63218bf059cee47fac6f30ab6ed8a547d4c686f4297266da8972c2379e2"): true, - common.HexToHash("0x7d8cc03c0d9c65d179a80300cf8b7e9ff8b9dd2a1fc34137ee4353189de24372"): true, - common.HexToHash("0x8b84bdcf0e4956b2a458a31c3547a0b4b42f30077e1ce16f3b9b32fd5959bf52"): true, - common.HexToHash("0xdb22530ddd87fb453011dc1aad3e9a929fcce156d2d0be696e09b216a0cb58c8"): true, - common.HexToHash("0x0e128d97369b36d16058ee36f7a0a6045f8d4a05181098b777716c2731ba6edf"): true, - common.HexToHash("0xce465461721e91a263d250d0bbcdd57138b31866f6a00784bba93df8846ecdc0"): true, - common.HexToHash("0x5dead4612e24cb1d48e2787c92ea859e2948d40d185758d66ceb0f17a175f037"): true, - common.HexToHash("0x5d41bfc9aeb16a993d882142a1b4b0a9ce9090a9c843ded08c59df9ad88d5fd6"): true, - common.HexToHash("0x82449705a363a5d57f5c9ad36e31f4d8f7a0dc7a81e5bd911af375d7a4b5eefa"): true, - common.HexToHash("0x252bd9c01d3dad645a5533fb8f272a39d0bcc05b5255962924497ca0f0b038d2"): true, - common.HexToHash("0x91ed9b098f26ac74018e506dc722f6783cee62745c9a4d8bb810c68b7fff6f20"): true, - common.HexToHash("0x64b6290747858793fe6fdf52caf58a4535cdf885d340ab404efef4bb752e9c67"): true, - common.HexToHash("0x1cff9fdd15f99c1224d50633d1a7c6d5329803e19c05788de655b2ec9413289c"): true, - common.HexToHash("0x9e76f6562992812a301d4126860f04d2c7c8d0e3b1d4808880ceff00544072db"): true, - common.HexToHash("0x212c318716b45b2f4604b7646c5bc9078d6455d0f2df4a32ff4ba8b78a5bac4a"): true, - common.HexToHash("0x54ea6d99373c2b899dbc8a38fc09b3b90218ce056350000c4aa691254b5dc8f4"): true, - common.HexToHash("0xe6a89c4b67c147534ed6899645aed97e5d2dee1babdcb0af6a84391998314df4"): true, - common.HexToHash("0x9180c4be04d64740ccbd9b471446226c3ffa3ef6e7f35032af927e0579874c1e"): true, - common.HexToHash("0xf96e64c46ae849fb0a065399425073d8309d83b8a3a9626581ec1da647c03c12"): true, - common.HexToHash("0x3b21e334a93c707136b9957bedbc71191131b86cf516ee9e1944844d2370f0dc"): true, - common.HexToHash("0xfbe464df55b1304eb5e97fba463d85363c2b413544566cde7fded5a2b1f47ab7"): true, - common.HexToHash("0x9a4782c99eb1635e6286c757958e2bc2c8896dbbc8e637d8d46e9017a7e1f3d2"): true, - common.HexToHash("0x452b19abb1f3c004860637cd0706de5200decab97902893a7ea6043a02cac365"): true, - common.HexToHash("0x07bb85b6c830c4e8f8a1f0ffc5253a5e42e91e6ca2f1bbcf8ee61c1268eab72f"): true, - common.HexToHash("0xea4d6648ba45a1062862f4956a9c34f3bab5f4c09af701708e4afdc9de5dec38"): true, - common.HexToHash("0x2472e9a14a165a140df820e44ce4aa79d7de72b0a191646efce313569eb6e281"): true, - common.HexToHash("0xe8468330dcd661b24841869c072f01d4b82ea224fe6ce27e81a67b814b7212ab"): true, - common.HexToHash("0x89876ed74645ce5c762a64e8ca2ef77560f769f58d25decc968aabd58edbbdc0"): true, - common.HexToHash("0xec958a8e4fa973b2b3efb5187436538ad6becc14d6b472331a63e5524c29706a"): true, - common.HexToHash("0x572a2c37e74af273c161243383c4ef85179939b7e0d1afca4108826217611bf9"): true, - common.HexToHash("0xdd53491be2b5e120b26a2d63fa3487c5ab8f4057d547ca72f7e69fb59044ccb5"): true, - common.HexToHash("0xb7e2608746f213b84efd551844df81439dea385fa10174d9fe547d9414e7e206"): true, - common.HexToHash("0xab26fb81c6d11ca84aee9bb264df389a3e537f37ad427a06144288c82e6e1080"): true, - common.HexToHash("0x7e908af301e44d76383a2f6ec8ae77c3e7a18b1c6117391c3679624a516677d0"): true, - common.HexToHash("0x7cd6043eb8377ba76e5d1f0174d854d5a9d06361bc2fcee449d1f1acdf01b9a8"): true, - common.HexToHash("0x0c83b0d5b7b2f7ec95f11119bf9d54ce7a08cc7bed8e52e46549d639f01f5748"): true, - common.HexToHash("0x2cc024656802593ad7721ca4f381581906d358602a64ce7f1d0c42cec2aec873"): true, - common.HexToHash("0x3b2f43ba0afa9b961ce0fff21bd142d214f0d4f1bc24645ea18d2a4c57b7ac3c"): true, - common.HexToHash("0x06d05b674d02a9935240b2b15883be74a8f58453f0f363f50aaac478034114b0"): true, - common.HexToHash("0x76430b0e4dc5e57683556b1ad1af11a37d6307632359a4351993e9e4f75ca572"): true, - common.HexToHash("0x99468052aadb7e9d0a4105635dc86313ea9db412156ff9cf62057367da58b65c"): true, - common.HexToHash("0xfd1f5e076f7dff42458344ec17db1a2c2484bcff16e16d54f1ae3b43f449a4f6"): true, - common.HexToHash("0xd7a64577923d48dbeaa4011b425ca157cbd4fff6ae20fe91de9dea56245382c1"): true, - common.HexToHash("0x9f7dc94ec23e3655d0ac2a5915f7a0e9a071f1d3d65923bc938cd8cce055639b"): true, - common.HexToHash("0xf8e5c507c693c9c5eed719964f25cff818d30ecc51c0f6e46ab40226be402173"): true, - common.HexToHash("0x7334bce119448f20ab5b158f393f88759557bedf14f56f0e73381cdabe86ce00"): true, - common.HexToHash("0x10980dd50e11e2afc18d8a5d590216f696becfbabf35e2f4315463eadf5566cf"): true, - common.HexToHash("0x7f7814618d46968d598e44a1db07e1ba9afb6f60b78c1c5735338e1c1752064f"): true, - common.HexToHash("0x2405f0390e768b3baffeb305df4cc4b588245b2b30e02a39d122f8ae7054988d"): true, - common.HexToHash("0xa4385bb8cde172f588ff8707c1cfeeb6d09a824c1a6919fe1d6b41ee3edfc5bf"): true, - common.HexToHash("0xe4eda79abac61c9dc300bb37d5ed61d127dff02626bfdea5b96b42ed57adf0f3"): true, - common.HexToHash("0xccd2614f95a607e0fe2cd7ebd5ae0933559dac463d723f46f34635444d4e0c95"): true, - common.HexToHash("0x479eed95c89a80c914b02b65bb73926e1d501b5bed829559a2890fa2eae7f745"): true, - common.HexToHash("0x674729b10e97a371b3e2000a673405a063d49b3d3848de0b7c3622f0ae28d1e4"): true, - common.HexToHash("0x8ea0aa200da9e90adb96d904160ff9737d4d186593553a84a1013959a03c43c8"): true, - common.HexToHash("0x41b9289565070028a7ce3e118910160685a98a9f034c6e55122d9fe177a96c76"): true, - common.HexToHash("0xcb09cb2e60ec19dce2270d4a2a1df16323850e2813dad9da1d75d7f72d5a4dfd"): true, - common.HexToHash("0x3a5cb598b78aedb4268bc5c19e45733253d2166bd0f499e6ba7e4c973b1b90fd"): true, - common.HexToHash("0x55ee6e584326cac4f7749edaf2a76e6ce4d205aa6e048a7e6efc446a382f2396"): true, - common.HexToHash("0xdf76eff6323f1142a9a261e8bd35f2f357f67850363762ec69181398337eb2e2"): true, - common.HexToHash("0x27994c4c284fcaba892b49c31bc6540ff40dcd27b36431003c9f1d4fc1d3e22c"): true, - common.HexToHash("0xd0070300ace36dec7cff86d40eac5658c4c895d7ab3e8c03f3a54be4e5f635b2"): true, - common.HexToHash("0xf5684444fcd9c803cf0898a71cba740a1728f966fa561e913d6e7e6b32ebdbf9"): true, - common.HexToHash("0xf8879ef0d3c962054df4023c3155a89d46d448fdaafbac032c8d26cce7a15ff2"): true, - common.HexToHash("0xed319db44f23bb2d2b76b03127308f81b51cc0c2f4174e84edbddc8b3211df55"): true, - common.HexToHash("0x0e97223869be768e5568af002021b5ca6ec1507d48c28e17e9e6c84437432fe7"): true, - common.HexToHash("0xdec37ea426348704145a655a4edc713bee47e85d1ea4545d5e85b1983b7ca3b8"): true, - common.HexToHash("0xc61b41e5fb6e6bf2e6014fdea1ee6159b7e5aa5dad4b1d377975b536b34de9a0"): true, - common.HexToHash("0xa35a79da6a9376eb452dcccff91fabd4d833cc4a76d4f44e2b480dc3cb6fe299"): true, - common.HexToHash("0x7f91c8eb4bd99971825cf7862e0ba95b6e8989bf0dfd59c9c3bd08d97d5a3619"): true, - common.HexToHash("0x8da369c416decf5f85be8b50d157ba2ca77c8094921cab8629cac07f97e32e81"): true, - common.HexToHash("0x631c9df5da582062ef97cd800adfb4b359747579c8edff5894359bbd3c00dcf2"): true, - common.HexToHash("0x9571e49ba3306ef56ba7f9feac9c12c10add62e81356b7f6dd08fd8446b18e79"): true, - common.HexToHash("0xbdd12f3c636c981f9f547bbf5db1dc5686a9fef06bfe42986406fce758f89377"): true, - common.HexToHash("0x12782fe69787a906170f7923a8e3d7aaf8fe6f17290590eee00425528f5017ec"): true, - common.HexToHash("0xfd74c30e0a4f8f369dce6e2597f188fecf2cd6ac4087427ac0dcfb2fd3cf9707"): true, - common.HexToHash("0xecf0acebf4beafaa4b12901e739e81542a253b16b8baac9cda69c4de22009fa9"): true, - common.HexToHash("0x7f1699ace106cf3fcf2121628c1b0636846fd992c80b139438130a54312a577f"): true, - common.HexToHash("0xd944fd63365bd8be6e02b75c0602b10168d727374cd9655f0cc5726181f7bac5"): true, - common.HexToHash("0x813e427b94b28deaa6343d50a31182faad1649a1fb41e406daf23bc5e05cae2e"): true, - common.HexToHash("0xded93ba0cf958abd2305a9af9f24e21b3e665e562d604bfd7626fcfc068d8343"): true, - common.HexToHash("0x42e678754696cc92b4c966f981096cc3e6270ccf547a381433a684c5c8a8a70a"): true, - common.HexToHash("0x4fc1c3301e38f837f5a51150015b08c2318ab4778538d49474cffb4ab57b1142"): true, - common.HexToHash("0x37a733e3bd56bbd45fe6535c275499223d03b089294f0b7584bf6e0113aa7577"): true, - common.HexToHash("0xdd5a23b79d6ae71e2cf86a46e13afb5c4ef4d2e02f2fbf8325a95a43bd8ac957"): true, - common.HexToHash("0xf0f616697866a2d32a46eee44112ef74b5bd8bfc581588cb0e37aa4a6aa783d6"): true, - common.HexToHash("0xd040362426575a8580bf4205887a053c7b44865bc6cecdb8c7dbeefe8251cad1"): true, - common.HexToHash("0x8881b2cbcdf2c0a943476ed687afb8f0c37a00be2f78ca12dc55d5493ffbd354"): true, - common.HexToHash("0xc2ca96c7006f12fb09aeac35834f3290fce3c2eda8dcba5ccf20c9990a818e8d"): true, - common.HexToHash("0x3d60b1fd092f3d80f3d5295cc9b61d2a5e2a3d565a0d819f8d6222cae8c49981"): true, - common.HexToHash("0x1bf7147bdfc9aedf24237df0eee93d8bdacd1ea1304cac8c12e1f12a7d4a796e"): true, - common.HexToHash("0xd676861652f7551c5c97ec333109ea0cfc57498024ee4aa83dfe909801620607"): true, - common.HexToHash("0xfb708cf6304906cf2e8786b274d60687e1816c1425d66ac3e701201e21bc9927"): true, - common.HexToHash("0x2364e058cf069f55d99e4035cdc34065f4bcc5379b2bdda02caa322738b05873"): true, - common.HexToHash("0x3353e4581030f66d506477a988735854abca3badd49d4a363dc87b78362df0c0"): true, - common.HexToHash("0xbfe0bc2703e652d5ea857f6679c77572f09c9ef6a1c4caf4bf9e8e04d4738433"): true, - common.HexToHash("0xfac3ec3c9d0b399471b52c1dd4695d753201f5c1d8f00be55d00e2c16acb7940"): true, - common.HexToHash("0x49e9269da6ac7e3ba546c3e679cca77e5afa311751397dfc4e6d8b68ebce563c"): true, - common.HexToHash("0xf8e0178135d185e923d62bc619d83068ef160f1d18dce1dc48134045e2695353"): true, - common.HexToHash("0xf33b47ba85c60ce0a13cb3952192cfdcdcda4a4c8d11b74fc65b908efe9233f5"): true, - common.HexToHash("0x9fc6055c6cc0869dc64c56987b2d59eca10217c8b378fda4b55d6aa3619dcce2"): true, - common.HexToHash("0x60d84613bbdc484d0306326cbccd8492951b27fd5e761c4b29f76640fb730154"): true, - common.HexToHash("0xa5b04d6e1e7f7c37c75d4987c04602188d1c93b58e578fec366b102a6491aa12"): true, - common.HexToHash("0x7e9c965e830c615a21dd183cbafd555af842c97d10c5c75b2901aaaed2ea21a7"): true, - common.HexToHash("0x25a4a4dfac6326d93b63911c44a9b17dc5bd85dfa34e8af8a807733ae54e6765"): true, - common.HexToHash("0xe3a6b4bb70a7a6aed6260e46dee8ea557932ac55cd8fd13c2a27391176a7c50b"): true, - common.HexToHash("0x15b0688e079f7645d167b958da3c033c8b13b7a0609adbd6d368ed6545598168"): true, - common.HexToHash("0x50ea56acc5f84b9770dbda66a0d1e858ff7ba3cc0bb148f36c460afec97fc6c6"): true, - common.HexToHash("0xfb414c67e8f7872c08150653602fb54d39fb52a677040625a8cd941bf6da5135"): true, - common.HexToHash("0xb44b48d8e4d2c30abb39613039fe1eb706c46f746d01abdfbfe20b8c55ee5aef"): true, - common.HexToHash("0xd6b6b6a23e9b8dd83119d49a0e2553de82a63b292fa544360eea2310b8bf0c2a"): true, - common.HexToHash("0xc63aba8fe690c69bf2bb1590c003cb7d7c90507478a8a2c2d09663b6c6b15f4d"): true, - common.HexToHash("0xb7cd4ce2bd5e84db595c08930e40057eac03fa8efd82d75117b2b2c982cbe1f3"): true, - common.HexToHash("0xa855cea9791161af16f2c70ffc7751a12ddb87fad3355e5d9aeacbcbade31e30"): true, - common.HexToHash("0x714f9af8763b4ffe55de83615841630b35543d7c89aad46131fd503f877aa226"): true, - common.HexToHash("0x050cba9c161fa40c1bc24e81cbcd7f7e3a7274802aa7958ff8834180f2dbec5c"): true, - common.HexToHash("0x2cf0a91c3fbea37180c2a0d29c947b0a2aea86a60890b40ccb8b4f82ec317443"): true, - common.HexToHash("0x6f3662af04c5cdbbff62e71ec82a6ed174d3a7b84fb9d4ed76ee28456d0d3ef0"): true, - common.HexToHash("0xdd791284e88676a54a42488560c5de35cb1bfc7b83778d469df374a20113483b"): true, - common.HexToHash("0x6bf0d257f212b513e0a153ae5a8e2162522b616a7a82a934fc82ac37d14515d0"): true, - common.HexToHash("0xd36d21c4826f08dd0f9205e3c64f7088522e55a662f5a5cb19ed40d1043253d7"): true, - common.HexToHash("0x1c865bf0dcf426e7d4d44e9a77abae545e720d94b3aa498e2e0bab9ecce4617c"): true, - common.HexToHash("0xa7101550eeca33c17a9b692f3e20b9e0daf6ebfc9c7c545e3c746752be1f99b1"): true, - common.HexToHash("0x7c401687de64c560a60659c96955734b86697fb97e5be2557123cbb43b9344e7"): true, - common.HexToHash("0x0b44796bee891a66044eee8064e3e801129c039e8213e65276f4374ac81c3fc8"): true, - common.HexToHash("0x4560dc3bf6406a0e836477a81f94b5f59a4319619c6a28c018e8cd0827ccf4b6"): true, - common.HexToHash("0x9c9599a3170385ebf98d9bdc2329fc1b7cf8f794a14b1c2ff709d4fb1c0b09c9"): true, - common.HexToHash("0x561f8f9e331c3654e17907aa3b898cb2c626418b2c59c934c7164e5da5001ee1"): true, - common.HexToHash("0xfcb1bd83620a3a97c19ef126a2c5a28baa071b7f159f8e33a23b5f737726a082"): true, - common.HexToHash("0xdafee1b804b8a943ae014802d3cfda3b514119776024d3ad44ec169660679cc7"): true, - common.HexToHash("0x7f8e5a3db5e69e6d1966e24401ac56382427a4cadbcd6be4201db72971c59270"): true, - common.HexToHash("0xeddd5c36a328e487d49c1c87656155a35252e48e94da0f4a81d0e2f76a79fcd8"): true, - common.HexToHash("0xdd365ce6de86fdcf2f2d0c934ff806e4b6813c05d1317920b7c690ae4c2eb883"): true, - common.HexToHash("0x7014f0a7518dc9aaf1c5eb464401877e41d4095e87aed41561e20c3531b3fe70"): true, - common.HexToHash("0x251f5b3c5ba68f44064de88361c13c3eae8ba633604d6fc31245adaa856df8ce"): true, - common.HexToHash("0x21a18e94d402eadac39ed717f5cccfbe5df3a25324c4edd880917f8ca6c35fa8"): true, - common.HexToHash("0x1944953fa60bef7874e1a94414f6b6b39425f20df285f65b999bf1aab5ae3d23"): true, - common.HexToHash("0x551590420c6240f66458e502e49666bb63c40cf9127ce28662d730fd9d176447"): true, - common.HexToHash("0x0d5c64f2e0fd6216f54c5aa7282e0f08b2236977a4d06dbf8992848a815768ec"): true, - common.HexToHash("0xd569d9472a84eb39809c4daf9ca43cddfdc08077b8775ffc727dd110108c503b"): true, - common.HexToHash("0x228c93b2f1de9a45f109e323cdf2a5864d4967e21700fa02feb34c6a9b6adb96"): true, - common.HexToHash("0x1713e6ad0eb91b2ed8690e6784968f9e9938b5f80ca6ffd0225fb54c4c53a0e9"): true, - common.HexToHash("0xcf3881da579dfd0156484d6c11b72b2ecfe698601b1f1cdba37b442ca9e4010e"): true, - common.HexToHash("0x0a4a4ee81a26278a8b5d114766aba2ec8c9cd935a3b1d1665bfd6e8e187f9383"): true, - common.HexToHash("0x28a4611c78dcd0e0670b15a4ba7a2607addf06d69ee0baedb2b0362bf30af42d"): true, - common.HexToHash("0x1076eabf88204be8d6e751225326ce8cf3aa57fb3d73da3eb39e25f59891f90f"): true, - common.HexToHash("0x5d3ca4d17157e379f5893d0f81c99a9268cef833b911a9ed83dad80e74be2fff"): true, - common.HexToHash("0xda04af8433f21e728134277e43a1d915a2c002091396d4d802bf3b75c1f63ef0"): true, - common.HexToHash("0xb4ce451d3448c237f37ecf19c0e56a9cf9be65a5226022ea504aca38c7dc5c57"): true, - common.HexToHash("0xdf393aeb955872e8f7546a73e60a8a82aa1524ff0164cccf39c9c485550456e0"): true, - common.HexToHash("0xdbe8273bcc62a4f15a4ca2f606ad50b32f03318b892103b31bba18f227c91c97"): true, - common.HexToHash("0xde7c4500bddeddbd936dbce3cceb4ae425aa582c755af53c466438ce1873697d"): true, - common.HexToHash("0x2e7d43b3b0a6e0a07888614396f35d0a9749ab15649d282d87f78598eed9c70c"): true, - common.HexToHash("0x1a2fd7720e92678b63f92bb8ab400540f4dc85b127226868edf359c60f9cca4a"): true, - common.HexToHash("0xb653d83b6df8551efe41077d8092a8a3b7c6aa496a7026a27cd60c644fc54222"): true, - common.HexToHash("0x6f24ae55644d137cf757aa7c887e6f64237e8d9e9c32df35087d42b3d0d82ff6"): true, - common.HexToHash("0x364008b90dcd6d1ac3786a616e2bcff321c174d7a9a95c93d9b3e940dd2eeb16"): true, - common.HexToHash("0xcec9e2ecba446dd42d626495eabadbcbe2bb4fe611db0ade3f5bb677b951b3c4"): true, - common.HexToHash("0xfc665cd13dcffa213db168dd7fc60e5af057c9ed4b52440b091d547d7fc40031"): true, - common.HexToHash("0xd08852f2a8477b5ef7fa2d81badfd7df9661b53fe2fcf17db16d31e1b27cc587"): true, - common.HexToHash("0xa3390fbf7b2acb0af641c9809388a30b2bac5a04939b8876109418ed8c3562de"): true, - common.HexToHash("0xe40ec778c27f44802ab100cc1e17698f4dfe1cd421a7bd55dc691e5270193fb2"): true, - common.HexToHash("0x71f2a449254dd233db3242f093303e8e69e5322e1e4917e38a79cffc7259400b"): true, - common.HexToHash("0x1196acaf86d0e358899d842b524c9b5b50f9d4ddd3f8a3fc84c7442ea36f8134"): true, - common.HexToHash("0xf2111628c9307b33d1942a1360dac769091ad1ffc9ad9ffc1abcac3c369d4d41"): true, - common.HexToHash("0xfc486f163d375a8d3791424b41398f1a50a221fddad4711ad6278807ef728df6"): true, - common.HexToHash("0xfae525d74b79e0cf4e5dc539b338ce19d6608119f3691dc0bbeef23d90e2c2f5"): true, - common.HexToHash("0x0b52da5a1be4fc2b721e492e45052d7a5ef590225b8dbae57e1ecba6890a33dc"): true, - common.HexToHash("0x54ab76d182eb39b8a0020afba8c50e48f97b6a564875d608f1604a87e36cb29a"): true, - common.HexToHash("0xa8dd1e56e4c3d801ae06ecb1fa8b57a41c6cf6ff6406464bd2e3b89fd43e8e20"): true, - common.HexToHash("0x8ab6f73790d0434623e7a084edb566b04d3da2e0d669ef475ff4ad04ac9fae68"): true, - common.HexToHash("0xad67be369c2398c73e7a8be436e20d95076033d548e1c0b19a07695f60776d4f"): true, - common.HexToHash("0x1b0a0debfb24ad8687e461b79a47cb37cbf1ecc1748ec5d48957e847e73c142c"): true, - common.HexToHash("0xf34c9be605c4113794c863445ca44ec350c29b87d90c54b80af66a84d390d442"): true, - common.HexToHash("0xf27b961f3b3ca46a1f8ee6df28c09def8b95bc44a7e99bc5402d6b8123a791b4"): true, - common.HexToHash("0x441f53b38fd74060573540de5bb036d3041a843c75af3c6eb94522aadd92e177"): true, - common.HexToHash("0xdfa790b856e906c85c010ea52c98946feb199dd78b5459db733f766a59d66fa3"): true, - common.HexToHash("0x680d53c6e61e48f7224ac26ef220a25cc530ce03acd02f1aeee9c60c89a7eeb4"): true, - common.HexToHash("0xb4f458aab610ebcba07243a3f32303579e12b422ad53f2a7e30e02f28a3e7c3c"): true, - common.HexToHash("0xc4770dcf409ecfff2ad2e2f19cd5e44f71b479c161b732d0206b3a27fc555536"): true, - common.HexToHash("0x6ff8bfca9739d6e6226d71e2e7410d91f074331ae127fd7491467b03a9e40967"): true, - common.HexToHash("0xcaf812ea4aa963d02ef04159dd5953b44aa506637cfdfe4f18703028a862e037"): true, - common.HexToHash("0xedf8ca74dc4c2a6d68d918b5e78be0b2b01b407441207ea32a39bd4ab8aa9bb4"): true, - common.HexToHash("0x48f53329415c02a57c9a7299ba16864d028bc57890b22e3166404abb6dee36af"): true, - common.HexToHash("0xb2497f985370f44ea97e4e716d69d2fb16282ee38497b6874742c73eeaed91a6"): true, - common.HexToHash("0x4a932880f82112b0fc13d8b7961b3839a5037b9154635ec810d6eb8953498af2"): true, - common.HexToHash("0x1424db46bd2cd1b56c3f5a7d394ab9ed507b8237982ecf9cf2adc190a49032bf"): true, - common.HexToHash("0x6e0896c81548ed522908037e90a17d3292ebb2beedbe629a106d7b6c4b5b98e7"): true, - common.HexToHash("0xf772fc373708591d7a9f3387ae381b42dfbf319c436d98aea1273e693a17e3f5"): true, - common.HexToHash("0x6ba17eed249c7e90577b5648373c0ea455f43a674f7d3c861a30c503df1d8c2d"): true, - common.HexToHash("0x35e9a51e3d2c78884b214ad31f2cc32678a3c83ef5bd540e86d0c6618bb5b448"): true, - common.HexToHash("0x0b732bcf8279d14c12c98eb7e575222ca9310dbeca221016636b5255d2065096"): true, - common.HexToHash("0x79d6779edabcd21442e02110994a8f0e1cd0567e0d8b76f4614688c956acc3e2"): true, - common.HexToHash("0x7af48bfff7f18590c5806726fda8e9471929bd36ff39885e94250b888b1fcac0"): true, - common.HexToHash("0xe63518bc0417c7ad991c6748ee26fca0b0d854f3712779985b9f7fdd34a7c74c"): true, - common.HexToHash("0x9410e69c392decb526d8bdcbf9780a493621e107a058a384995285c2feceea9a"): true, - common.HexToHash("0x04e4dea03f3a9f7d04b606c5169968deef955c609176a7910a8ce4a6a9db60b7"): true, - common.HexToHash("0x0ab188651e3a97bc112f62d2f753a3fc9bdf5514376000882efc780f5a22b709"): true, - common.HexToHash("0xe263eddb6c5d33a7c3c1f227d03fdde6b24d66fc37b4db9221a07a2bc2c3670e"): true, - common.HexToHash("0x85348548cdcbf130479755658669f9624fa51098137b7764174cc8db9b531934"): true, - common.HexToHash("0x5521c4eaf1d234302e9005fc8143553a50b0fdc10e4c8362770fa666ab1fdf25"): true, - common.HexToHash("0x0b14a5035fed90e08312ac897dfd6ddaeaa5136cd55ef000c30fedd95d48f8f2"): true, - common.HexToHash("0x1ce2ecf9bebec8551e01c86dc8693f6fa8f1f9abceb4f6d4f711f955e09a4b27"): true, - common.HexToHash("0x5f139b30b33e4810ff43850c3b7d3102a32011d1b6f01dea6dce2063a869b3e0"): true, - common.HexToHash("0x995f489ee8a3407846ea43c6526e958e61431bbae818c4477530e61f2b2479dd"): true, - common.HexToHash("0x000bb252c64b0eb425282ae98869b2b7b16c5b3946af831ee4e59f0a2eb510f3"): true, - common.HexToHash("0xe2d1279ab58c140c0d8a9a255e60f5338940699a512a3bc43faf0a2fdfc328e7"): true, - common.HexToHash("0x6a28961c7ff8c30b8e936b26dfbf87c31a6701d95bd60162e068674f12be2d68"): true, - common.HexToHash("0x165a07af3e083c1c4eb664667420eba1eb854739e9fc04252123952bdee39d09"): true, - common.HexToHash("0x4169ba16a517de90940276ace656eb6d5139d11e09c0254c308a1c1c85de04fa"): true, - common.HexToHash("0x562f00dbe96e159a7596b395deb4aaf14128f8fba91322ead77271374b9602b2"): true, - common.HexToHash("0xabdbd293ffed707e552cf877b147d96f94a416811483cbff4e00adc0dbcb4fa3"): true, - common.HexToHash("0xe744e1eba80627ff3a74c95bed74bf9515d55eab2ba3de5e0d8d89c2b6ad2907"): true, - common.HexToHash("0x9ed315b6659a86f0954cd7a970bac1ec92129919744ef3b7584e673ed3cf8232"): true, - common.HexToHash("0xc0e696ccd02de24fc9ccf8ecee3e48ce16143c27d4d504bbcf0a6f53dd316551"): true, - common.HexToHash("0xada7b81b63c0ba6ff73b2ca37bdb9de723cb9633ad107deaf45f2a6d2ce9d8be"): true, - common.HexToHash("0xce3f2975fea79987ee951fad156628c4c6d7b20b2792f79dbfecd7959a8c6198"): true, - common.HexToHash("0x6eb5ec1a604b2b2faace03dd889b2b7cc6bc580611a1afb8b72a2cec4ab04751"): true, - common.HexToHash("0xd020212e5b2685af635e1bc827c0f9e45e7a900011b1d7f84dc2506baf11811f"): true, - common.HexToHash("0xe0686312b2efeed70f6d33facce4fb41c1240b75b1d983ca74d12e1fd072a870"): true, - common.HexToHash("0xe6c26e3827635233ff876e3fd777fa77aeb0895a3360f83d7ed2b51060bc7874"): true, - common.HexToHash("0xec6b95c6ca0b33e3376b334722bd4d8f7afa3899d01fd2821d9eee79557380d5"): true, - common.HexToHash("0x8be0b63e85a745c1cb341b1dd451d4e24bcfb68849d27d6a39d9a7feb7979523"): true, - common.HexToHash("0x06b73c05cab076fd2cacfff5cba726227abb5eb607a3235c27aabbcd9fa536a7"): true, - common.HexToHash("0x051c5e849c797a835fbe4c81e24367be116fd4c9e41a30e5883a429e965afea0"): true, - common.HexToHash("0xeb8d876797dead5f48afc4a897cc2a9dede5b859d26881d933edf08e89b552b8"): true, - common.HexToHash("0xbe50371ed809ad0156095619a1c03391cd19f804a36b27becd23ffdb1ffc1255"): true, - common.HexToHash("0x7ab9cfca237c6cf8d39294d96dc7d46edf8f5990a73dbb8ca3c6323fa3f9d5d1"): true, - common.HexToHash("0x4246e22a2d2062a92a48893e9532bb1eeed20c206b3fc15af16a3aa68dd9b447"): true, - common.HexToHash("0xbce43e3bcfe79082d9202f363a0cc35257dbfcae1ba0dd674263dcb9a70fdd40"): true, - common.HexToHash("0x5f8a10f62f96ad999f495d0f3a97346f7b5f6643531bbcf906acde8e045ae469"): true, - common.HexToHash("0xb79c7c8d09ddf5c438271e2e8dd44e21575ac3e59da55bb54c28ca595c2247a6"): true, - common.HexToHash("0x3c8ec95f4877ca7326863ca4f6102510838b1ca460de197f3c60d06ce5521698"): true, - common.HexToHash("0x35acb3b869ba7bfa2dcb3f3e94840f3062cb87f86b7e607dfb6e141162625d17"): true, - common.HexToHash("0xb8c02393785e6a60a1bdf170e66bab44d067a875c2273bb23425187afb0f62b8"): true, - common.HexToHash("0x08a85c3300bbf0c7a3d077946e8c1967190567a90e4eae57af594e638945c460"): true, - common.HexToHash("0x3fc80e38e40b952a4f0830a1eea25338919a007089bb89c129ae1074ef832b8b"): true, - common.HexToHash("0x895ddfb73aa9d567dfbbe22daae08e9ba9eaa3968370a901cea1bb5e4342e595"): true, - common.HexToHash("0x91257cf9932f7b9d653ec5ef03b7a61e1745b219cd647149f75aff7938364103"): true, - common.HexToHash("0xe07182cbe32779f1948557d827b58b38de5f35c1854cff066549287f4c11acb0"): true, - common.HexToHash("0x75f29c2429d89dce37be5e1b090557cbea25e8c6678a2701080a36adb41f1bd2"): true, - common.HexToHash("0x215989b4164155a08ebfb33bfe6d8646dc6886cea4aa8ee6c69ca8eeca5c58f7"): true, - common.HexToHash("0x5b43d3913395d8bec6558bdd90f1eb78b4ce7a1b4233c6f327589068312bba64"): true, - common.HexToHash("0x61a2c5faf0e3a88f02be44f2bc40b5f4d5fc522c754ce7619de041ba6095579e"): true, - common.HexToHash("0x07ed8f78c3df10d4f5f96c6c4e01e556355401ec0660b2c86a805e5ac453a25c"): true, - common.HexToHash("0x1d42ada0068e7d20cfabecdb3b2fa7da2ff0ae780f9c26899845022dc07ec728"): true, - common.HexToHash("0xc71d692560dcb16e652c2d949c6bce903b44490f815d5202d4192578c0a7518b"): true, - common.HexToHash("0xf1532a1944db7351c94b6d57d98e5d53ddc89c66e08a9370f1b16e90c147639b"): true, - common.HexToHash("0x14f5dd50aa30ebc6b453fc5a8d23090bd242b8a2f2a173758e4e0d1e0358bd1c"): true, - common.HexToHash("0xa40e4e9ffa1e1c0d51cc6a716654e6c18a1c606629d14bf2e254ed16f464e317"): true, - common.HexToHash("0x0a708cae0d19d8fae60e17f6757e9bb7900247f4824ec76ad096dc30d3360def"): true, - common.HexToHash("0xa6f0679b1c4b38f114ba55ac0a5ad0fb99db60a9effd4931b420f264ad20534e"): true, - common.HexToHash("0x3540449cb9bddab9f3e6b4d1d511f9c24ea952ed8ee6ab8450459d938fa50510"): true, - common.HexToHash("0x343418128e04b53be7bfb50614189310cb52d4b14d57720d99e1ea2148cfac6c"): true, - common.HexToHash("0x1991ec88a270b22a0f231eb2cf9a423a5a8f91cb0bfb909cfffe553dfc37254d"): true, - common.HexToHash("0xa032558872632aa884c6b9d1a0b5a3714190a969716b38ca8da2fdfdd66620d9"): true, - common.HexToHash("0x535f2eb56470c2553b7c2fd5fe996ef4c62d99b48706b55c8c60f22e9f6ba81c"): true, - common.HexToHash("0x4cf70b817d8f9784fa654aa4e8b9d6aff62c2d9a6ce2486b493669bda8563861"): true, - common.HexToHash("0x1d970925befe85d3625a35fd7ede2ad88123c0fecaff576cf9d6101355aaa299"): true, - common.HexToHash("0xea3ea3b23a8dc3bb6bb8837d2501858f2d4aa455b0a1b6835a28e646f0c7d272"): true, - common.HexToHash("0x0b4402f52eed0ee9f5a36839be0bccb9dc4c69a7338c8957ddcd4704bcfcc63a"): true, - common.HexToHash("0xa773492772ed2d76717e6d21e9cc91cdc966bc264f694adb0a678d67957f9d56"): true, - common.HexToHash("0x4d885b69a7e25a1817c6479a2fb4882d12ab9af0e3c0b610609aaafcab22c27d"): true, - common.HexToHash("0xcffc86905f42a08a13dacee8445b0e2fd01fdd1b9bc027e7275d8b675722fba8"): true, - common.HexToHash("0x2f6b5538eafb95b557ebd9c84ca5f83cba364aacc960525cc02052572cb51bc1"): true, - common.HexToHash("0x4049f0e9123e804601941f5042301a9c4e8307da8a2b08c8fd5e002fdea48937"): true, - common.HexToHash("0xe0c856771d01b38d590d445c3b6b900d87bdc6e1bc74a0c028fe53ccce0e70e4"): true, - common.HexToHash("0x61d3333fb30816d6d66bc7b7efc1bb46be6b192a6ceffa5555827f411a3a8be7"): true, - common.HexToHash("0x6b39d9b9488a6239bf5b521aba33eeff8eba00f505381659722ca1bf23314894"): true, - common.HexToHash("0x0f501a470a1f37a15ec4b39b2883aaa182e7dfa840c7505620a5326a82425b7c"): true, - common.HexToHash("0x033942433632ab1c7c5c3b03526fed4107743855bcfb6ee0a0f265ab6d5d94ce"): true, - common.HexToHash("0x26c2d33349bac1f2ee74505d5801bca997ef0e3f5e2093b33c7f226924dfa540"): true, - common.HexToHash("0x81c868a0270f702908a83d424322f905c5559501fb126572fb21d01051762371"): true, - common.HexToHash("0xf0a910ae2724f82d6850aee9057655d6bcb0efa7c2822467941172d8ddbeac68"): true, - common.HexToHash("0x6227ec2b4ee7f6582e2d8b5731cc47436b7faeefb424245b50f29114ba6a2893"): true, - common.HexToHash("0x84cfe05ef58f5ecc3665072ca077883e724661bf0c8c483719b31dee175e6c7d"): true, - common.HexToHash("0xf645d83262d7d5251bb4e5034759942de8769e0b09d28da22fd60b5da2097a06"): true, - common.HexToHash("0x32d6742ce648b38a0f901747ef84a3cffa5997164c4450368c51de47d6991f3a"): true, - common.HexToHash("0x891f1d9b3cfc7e20aba9c54a5e4bc102c6961b56b8b052ac52943c2c104ecadf"): true, - common.HexToHash("0xc64e20a7253cc737e11f5676c006e5d573e160e3e147db4ef7b8aaefb5c850db"): true, - common.HexToHash("0x21172019c46fb9c0d544223f67f2315feb9d2c248fc417eea8e74bf85609c2b1"): true, - common.HexToHash("0xc2797106883c488b4dcd5e7799a7498833cf6a09c4a836e3e40c63b80cb5d485"): true, - common.HexToHash("0x04acf79bd61e9b6e65931164a7c01d260603f5724a1b5a032e91878e22ed7ac3"): true, - common.HexToHash("0x35d27fe6d1e5b5c6a4020423872484fec30fec0e9362ceb507f6fc7c47a9f2ce"): true, - common.HexToHash("0x0eab957cb6bf2f07012984b4316754773e7dd87c8679f4d3f48a7d702d43f40b"): true, - common.HexToHash("0x96b7c64d03330e5bbec09384ecb8e8d6e7f14c9c6dc5d836e561c26b1526f08f"): true, - common.HexToHash("0x2a4a1d5ec7d0d38184747f857a3c7cf7defa9ee45b1546c19dd7e48432479c7a"): true, - common.HexToHash("0xf64f673dd68292975b66ab2d408f011dc2695f358d79a090dfe3f044170ecf07"): true, - common.HexToHash("0xd83525639a348b553bd80ee1c898d2f84c704700524c7f9a05ab9d9c3cb85d7a"): true, - common.HexToHash("0xdb716cac61247861d6c1583c01bba852d765598a6b176312544cfaf2d9739f0c"): true, - common.HexToHash("0x1561cf8e61d7538abe23f6462fe0a69435c749123a40d24c92ce60b877835009"): true, - common.HexToHash("0x4ada6426773f818304486e34a4bb6a1c8f65cdfd70277aa136c7188ea6442148"): true, - common.HexToHash("0xfaa74d8897c72fc6746dcf93e274eaa05b46039c84fa512c0bba15e1f410c77f"): true, - common.HexToHash("0xb0baf56dc4b3b92e69fb173c5329c0f337a5be1958cd22c69c07cd3b663a2efa"): true, - common.HexToHash("0x746644b505ba1372911c713f82bb2d8b3e71c28d1253ae6194b56b051d2389f8"): true, - common.HexToHash("0x3364bb420892cbcbebece0d04523f18fe1b7e83e3432529232bec1af64bc0df8"): true, - common.HexToHash("0x855868a75cf4961d6a2f4e0afaad7cd7b12c80bc2b6d26c5ad09b3bad13a80e8"): true, - common.HexToHash("0x1ccf8fcdfc4d91525b4160b5172c37c264e43d711f264685e27d6b589f2b96ba"): true, - common.HexToHash("0x0701654b82365f72301a88cc98104a58ed9d883c2c04a97dcfe6b0cab16e33be"): true, - common.HexToHash("0x80b8510916a78545e0f1b317d61fc6986e7dce3660eb0f9ebd9deb0628c07880"): true, - common.HexToHash("0x280f61907a8152a0f6a73143e1670fb4af0fbcbd6c3d8361bc95c15217a8ee69"): true, - common.HexToHash("0xc4ad0f271399a659e40edad4c81c4ed3e4a93011179348481451f1b1c7ffde8f"): true, - common.HexToHash("0xefce5bc16d08cb48bc56061b6495215d0871bf25579bccdce3ca4a1f2cffb33f"): true, - common.HexToHash("0xac207e4b285724dade94995a295dd0e1746dfde3551daefe75c449466ec7c1d6"): true, - common.HexToHash("0x522a8c1d9f67e8b28bdf7722f655b2fb1f1ae9e9975084c524d49be1a4501894"): true, - common.HexToHash("0x0555231939f8bf453415fb01d1c69f6193e9f6040166c4e10974694d732c979f"): true, - common.HexToHash("0x6e91078176f47046b726094067f3ab70a342079a02d84d67bb90ae285568403c"): true, - common.HexToHash("0x538181e3807f694ce92f1a98f70cf04846db16c705abc5336de01d878e803d51"): true, - common.HexToHash("0xbf8f7ecf25381d3654e915277c042d13dbe0e6e44a9004bee93e47a09094ccbc"): true, - common.HexToHash("0xe9c5d0ed04bc74b3b0c1e99b58dde881424dc37948e2dd42840265e5c78d49fd"): true, - common.HexToHash("0xaf70881d8b30462f5c428d2be6a63b98b2a21ce4cbfcdf87b9e8680cd31d8103"): true, - common.HexToHash("0x9a6fda0851da57bde01aa0a03dc849329a1c2f9e5c596f5795f00a3b54b5aa28"): true, - common.HexToHash("0x1d74f3c71c0001dbbee8d7bbc2019eec31b936c97383520066103720e6ce302a"): true, - common.HexToHash("0xc5138b41ae0f45855b0c236ccb8ba014ab7fb26f1f75d66d886a4f988c1c7fb4"): true, - common.HexToHash("0xaf297900a58f8e862cfb3109f4cc8d32cb775ff62ddfd7ad84964f3cd94cdb7c"): true, - common.HexToHash("0x1b2cf02c63eba801029b656f55f06e10f76a2c1ba6b60420582758f83b22357c"): true, - common.HexToHash("0x6ec37383c332276bf3dc52f7a963e48bd044aca3a49ae06b3e6c0493d3904154"): true, - common.HexToHash("0x4fa7fddcefc63e48388f6b5ecfb1b04b7b0760bf8381ab73e44fca9d9294e813"): true, - common.HexToHash("0x8c5eeb7bbfbc07614a8d0982b5eefd9a100735b1c9c7120e17583a2a0340f192"): true, - common.HexToHash("0xf0d4716f6458a6f7f481285d9850b20a70d1461ed413ee59fc65f6e58aa3b70b"): true, - common.HexToHash("0x544fd4a585fde110ce8171ba07ebfdb009d7c75d4578775ee343a29e260e0715"): true, - common.HexToHash("0x005c6d80930703c73ae5ba9b28a748ae6c7f795cf2a17c8031966481ad017b49"): true, - common.HexToHash("0x99f29f77c3a125b4f93f3ab4caa0fb40924ed06e73935b5dde6edc7eb1934f47"): true, - common.HexToHash("0x45929f133e8dc56c978f336691d2c36351b3d557f99a9a75e4487b165effc583"): true, - common.HexToHash("0x3367938263fdd904fe6de3eee12feefe36a568590330dffc5e940e14a84e4fba"): true, - common.HexToHash("0x3969e1ff21307c158b2b6193db47fa4501a7cb690459b77fdefbe246a80672c5"): true, - common.HexToHash("0x5f4835036ce12695f022d6406e90d6f3d7f53a7ca74dca41131296312835c597"): true, - common.HexToHash("0xb542a7bf8a6eaafedb775625b61f94a6514a16851d69fc5ba6da1d03c25f65d6"): true, - common.HexToHash("0x4be62c0ee40be10a9d84d4dc6ca94b405fcbfb34291663feb242944700c74ba7"): true, - common.HexToHash("0x8fbf522360e283379fc9c9b51c5bdcc0f33b8ae1fb1a74664b6831260fa03d9b"): true, - common.HexToHash("0x4be4fad44933f1175d018ce4a14a9f974b5748e3fc615e545d7517dcfd587b8c"): true, - common.HexToHash("0x3e0abefaf3116875136a650b6681084c4316885e6f4f77709155b4cf42714544"): true, - common.HexToHash("0xfc328853785f58b6149725527647179f148bbe4789226c33ce105deef17f4d59"): true, - common.HexToHash("0x8f879896b3ef71f19af9a69e84c81fffe6ff3c0ab7b04caa698df0e1f3c9695c"): true, - common.HexToHash("0xdd2509c19c350afa35e112829c1319ab08b18387fa9188c75b10bdb94023347c"): true, - common.HexToHash("0x4577ef160a8a504a66c6c05d45a7f47301e35a32e858ddab8e27e649db8b44b4"): true, - common.HexToHash("0xc7795ba60ad8c67ff8fbe08612e8b22db13fa10e531872d1b8bc0b566d119b04"): true, - common.HexToHash("0x9fe36608bf2a2d88665bd72c5948a3243f7ba8f488daa341717a320fafc664de"): true, - common.HexToHash("0xa691e15fd92b911993b9e1712e91d41b43e323f2ab3cc9a0d2776f60a9eaf75b"): true, - common.HexToHash("0x5bcc88d3d984416a589894b78be0b357b0e8d6aa2c4603b4adee09f6e1cf2886"): true, - common.HexToHash("0x9c2aa2a5bdc76be72136ad86019e688e23db6cc28fec83752a982a99cee02e64"): true, - common.HexToHash("0x5347e13b73fba8c1e1298ce60cb47c5b0de178a446cbc001a6ca47d073dd75a8"): true, - common.HexToHash("0xffd0e74260feb95f0e9cfe618a7b27b5087958ecc527c61635e72de19d51b197"): true, - common.HexToHash("0xc58d592b44b7d0bb3a777073a040573700814a8130ef0028cacebbb90338aaf0"): true, - common.HexToHash("0x532354b37e274bef7ca1b456d9866593a755d1afcc667c917d0509f1e71cb21b"): true, - common.HexToHash("0xd7606e6e6605d21c2e8a427c396a095673e0b5631745b72d6e0290a0ad4eaec1"): true, - common.HexToHash("0x00f0a8742fde7f04af91255440c34b259d54d4e81012bd880c1b8d777c5a7436"): true, - common.HexToHash("0x90a53cd75315d1a9aa409fba0d3b2228374655d2618f093dd16d0b259f00e56a"): true, - common.HexToHash("0xa9d1e7b0d6b46ccf57dfba12cc82fb5a87cda77f0a07e1210aaf42fa48a8312a"): true, - common.HexToHash("0xbf4ef280cc8b10326b57a91d362daf04e970ea21cd1c93850e661a969f71f66b"): true, - common.HexToHash("0xfac876a85a9d83ab77e4dc8364d9864c2f8283a90baf24af1ca485d41bffaebf"): true, - common.HexToHash("0xef2757f758a9545c9853e71f30ca15ac51e738a01507a1a43a03410e620f423d"): true, - common.HexToHash("0x8ab988c7da937142bbf31103692ee564c98b5f0cc4828213ac54b5d8ca10b062"): true, - common.HexToHash("0x9496ef5340340b1fcf7a192e8619d4eb119b5631f3d72eceae764fefc6535383"): true, - common.HexToHash("0x34e1ae3d7bb6defb29569af4c2a59cfd0a770fb21de814aedb0b0f4baaa3e929"): true, - common.HexToHash("0x2990a1ec314b9d79d5f339244747d57571c68e429407b940d664e35c9de850ff"): true, - common.HexToHash("0x2bbfabb2732d8fac7e1b4a69a8542a287159434a1d0f51417978db3af77af7b4"): true, - common.HexToHash("0x9ff7de488619a54ea30b510f2d5e77171d0d5d23a26a37690d05a064c6c072f6"): true, - common.HexToHash("0x57bd59ebeb32a9294b7124a8c8b89d225391925da6a0928b638a75cd508b007b"): true, - common.HexToHash("0xa05efc4c455254e0ed6a8e6e0ae57d67ddba8c5d5aa34bdcefb3cbc3ec770d27"): true, - common.HexToHash("0x97f1928d5330533f2024d65b2a482f0472199edf1cdb8b4aa2f401bbda6aa84e"): true, - common.HexToHash("0x58b19939c2a17ce8e62c6aceda03827156db94eae39ae321c2ee6a5de7896f8d"): true, - common.HexToHash("0xa0f7f3825d07922ad3a17eb9781dae84ace401d6f32d8976906ee6d7d33587d1"): true, - common.HexToHash("0x5ef4b2119e790e397bbcea4ef612c37e75178d5544441c1de98781bf08a44397"): true, - common.HexToHash("0xbe867cd167158c5ec3d2de17fea61ad62b53d4dfde77c2e820ff54342ced5252"): true, - common.HexToHash("0x1fef4cfacaefe4a5813473e2cf2786b76601833c0b44dc8bc729ab150e920ea8"): true, - common.HexToHash("0x8661490dee1fe3752c2725416ce1b6852a36fd5e4a75413042a4a8ed910aa9de"): true, - common.HexToHash("0x38679fe1d5fe8f881289035cc073da09e41bb370b0d1ee2a1515fce2a30bd76e"): true, - common.HexToHash("0x78dc8a72a0dc591813c4ca85d58e1b0e18b4b5eebb994eb29ab311e4f79f1cc9"): true, - common.HexToHash("0x83380958423c3075f95a0d81db0f727233059242fded6aec3772ef62d32fecdb"): true, - common.HexToHash("0x7d654e8978960ec3b08f70f0e837f1882f622d8a696adadf7e51e24fd2379d0a"): true, - common.HexToHash("0xb58caa16f8eeb4b822943268c4adff50e3fde1a609cc9cf473807ba3c36215ca"): true, - common.HexToHash("0xadfb90c3154dc7e7a5adc5d92220368c3724d0f310b98d7f3e7d16fcd9a3609c"): true, - common.HexToHash("0xb406e7e0d748499bec05e68c0b2b17cd421cafcbffe2d3609a9a1f2414a3f317"): true, - common.HexToHash("0x5a11c486cbd6176087a128b1dc1d0659ecae2915d2bb701a7b63d82739159386"): true, - common.HexToHash("0xfe4149e1aadfe6517d131bcc38ddc7ba459ae56e1d88e1beac6388594241fab6"): true, - common.HexToHash("0xa71759459621e870a6fcc2f96926987a03f1e07855d2afc72ab1f90737071ebc"): true, - common.HexToHash("0x110d6d78cbd0558909f43ff9753b4321e626e1620357dc998b818b11ba0dcff8"): true, - common.HexToHash("0x906a36f3dbb098acab9c550453a4f14be2407fda0a156dc6362282453d545b82"): true, - common.HexToHash("0x59a5896d5f0e4077288b8b11987f5b30fcae09004bf1afe35ed099064cfc9d81"): true, - common.HexToHash("0x5da4d5f8b2d6bccfc591c3bf1a7217c96efcfdd71958068ba134aa9cf5aa1fea"): true, - common.HexToHash("0x6ec29bc9a84f09a38fb055efd7b7ca151b57b2f470b3f7640b478d847164134f"): true, - common.HexToHash("0x98027c2f7fc3b4798ce76d9c886ab3078201d11038316ed1d14b4c07ecd84ed9"): true, - common.HexToHash("0xe253ae30bc264053ad5a32548e635c3f7137f65448ff16359972558455138b42"): true, - common.HexToHash("0x83febf7a4c153c4d694c8b88927c2b818d401ecd2a6c4dd77e9906186be3aa28"): true, - common.HexToHash("0xc64c2466186f1fbd5b798f3d099f9f5627eae2a226fd669d92577c850e70bda1"): true, - common.HexToHash("0x7bdc75e72fba6f5a2093d4fc99ca6d3854ec9a704fb28f372b5b628eec83f662"): true, - common.HexToHash("0x3cf78833cf3be59ae13ab49ffe0be4e8ff70c40675929f714350232c4c41d6f4"): true, - common.HexToHash("0x7978ebc8bb66123bfeca03ee3af0d680adea76a115ea425f38c8b05ee6fbfed8"): true, - common.HexToHash("0x54093864ed0caccf6bcb8be82943cff40b781593de4fad9df56f47747edb04f7"): true, - common.HexToHash("0xd8e0abedc64a47c62bc4c52e083ecba437a58e8084c25d78dd45feb23fb2315c"): true, - common.HexToHash("0x89a70078dbbc4ecc86b975e36c5ef6fec1c380958460746727da01422f880543"): true, - common.HexToHash("0xce2c295b95294b987736023ceb9db4d6b3b7207b998d614594a3b16e1aa183ba"): true, - common.HexToHash("0x8499c9a2412d596b19f0f53c7de8b704f3c2316ff22fabaab5ed0c42256a135d"): true, - common.HexToHash("0x0a980953fdffa98ae732ecb022af4767a5a8c54132e3557b7c784f871e186150"): true, - common.HexToHash("0x7397305ec93fe6608d9395d88f13a38045274ec848c432d7f07a5ac0388cc65f"): true, - common.HexToHash("0x46f498661dfaa36aaa941c82392c4fcbbf6787736dd27b9a281879a305640945"): true, - common.HexToHash("0x56c124892b368cff87d5c4028d356c79290f5ce10c819503ff9b89efc4ea836d"): true, - common.HexToHash("0x5c93cb6d937fcdd53a96f0e822f37cb2d20de70950f1d6ffcd7706ffd20c196a"): true, - common.HexToHash("0x6edc6b2054e0ab6fde60219b291cd725619edf9666a75af3511d17c8652ffe37"): true, - common.HexToHash("0xb2f09ee93fc820c1462c1d838c6ab9346e23ab6b6379e33128a851d605643a0a"): true, - common.HexToHash("0x03c016425401ca4c5dcf6687c397dc156a8e6e87ed2702c6c0624533ae173a96"): true, - common.HexToHash("0x6dc4e9cf4c4592eb9d9fe9a24c474777c41bf0bd21b057e052386453ad06f771"): true, - common.HexToHash("0x73560f7f15ea6c63f0b7afc2517b23cc0a49c56e9b836d46b44b6185bf9d76d3"): true, - common.HexToHash("0x80b9750a1c7898e1adb54c1355f956b8a5c2fc959ee69fd8a2b930b184089a15"): true, - common.HexToHash("0x1cdc2ed8823c26eebd4e8eb4fa973829ae4b1706c0cd97f725bfede476c4bad8"): true, - common.HexToHash("0x6cefaaca5c1a6659ddafe27201951e8214f33dba4e0ae1dfbf212b996547957f"): true, - common.HexToHash("0x6312d6baae979561ee948565203fa627c07599c6aa27f7793e7d9a889389d629"): true, - common.HexToHash("0x930e55156bac74415ae9327bb13718072690fb0780431bc2b8955d02ead58046"): true, - common.HexToHash("0x889b0f75587b32e9eb06df79da420592ccf32de8a53d44eeaf144b4dfec9cff4"): true, - common.HexToHash("0x56f94396d423a815abf7d93de6018103fb3969d2ba218326e105011fc83cf04e"): true, - common.HexToHash("0x589911b7d2a604c368aea7542a37d5cf6f071f505071c82da6ef734a2c549472"): true, - common.HexToHash("0x07ced94d914e73d85a921a87a0716cab2da23c40007f9471b1e9305c50a7fd31"): true, - common.HexToHash("0xa595bd73ea9a93b67d8cdbeb947858b38eea3f6a646febc1d6ff04b042997da6"): true, - common.HexToHash("0xb9ad10ac666dd5e7f3d37c0c607e1539ce4b839ac50683429aef08b95b2e35ff"): true, - common.HexToHash("0x0a6aa021b61cb7f670f746cc748cc9aa1cea4c25892ae2c003c05a7a7d4b1494"): true, - common.HexToHash("0x548c088d8e182335e0c510c7a9d4bd304a00baca5e333bbd35d2d449bd0e282a"): true, - common.HexToHash("0x0a9a9a1472c45adb38738d771a687cdfa8382d1d1ef6228ee5014bb8d333e058"): true, - common.HexToHash("0x733a3186e45e8c5d129a663597ceaf0b4c2e1497138a2dcaaf354abe0ea66a41"): true, - common.HexToHash("0x06850af8aca3b799e6cc0f883da99afb9302797ef69215811a25f909c5d52f17"): true, - common.HexToHash("0x0bc23271ff14358318a3b260b43544a396304f40ae7cc79f633e6585e2bb8c40"): true, - common.HexToHash("0x1b2820e60afe923c5f5e35b440948dd4c4bc306a1e20c7053498aeb7452d2ada"): true, - common.HexToHash("0x8dcb6a3c2c092e52664542f8f76c9dba28a91c864f07ca87ed2d39fd5818c66d"): true, - common.HexToHash("0xe2027ccf2e19521d7eb9ba95f1ba4371513980dda1259a4f91c8f72070db9169"): true, - common.HexToHash("0xbbea698bb4b1c18f92482b3ff7f17518b581ce4efe76e45a5ec294336268af5e"): true, - common.HexToHash("0x9c552df4aa00e6fd3c1a425bb29f7d9f7b08d02f391835f389343f999e4f0f4f"): true, - common.HexToHash("0x7e5628d1d90ab36ff98c7002fb093b182b6c93d52f7c1fcd3ad464a8ec0b4dbf"): true, - common.HexToHash("0x55d7ae7d1d9a693133b40eaf65288d183508709c20e9236af1a4f1ddd40546b9"): true, - common.HexToHash("0x12ac2564917ffce75f6b107656e7db01b58d00758868a4d3db5c6f14a2643850"): true, - common.HexToHash("0x4989bc849d3bd394a0d70d45f8b7268f06831970299d84fddeada651d626b25d"): true, - common.HexToHash("0x5c0d5835d7b803b21c11c1ae5f2a0d7cedfd42e4be38b15515924d24ab929e58"): true, - common.HexToHash("0x6eef29b16590450527e9b205c2b7b0ccb826d796d8a043b53a24cabce597fa30"): true, - common.HexToHash("0xba0f8e6c932edf7655f5880e0d10075675648d9c1758a9f096a41b06df0d812c"): true, - common.HexToHash("0xd54bcc1dd73a56e5cdfb295c6666a098c50d8d77619569bc8ac0ce83b1330025"): true, - common.HexToHash("0x46d68a4537e9d5689011a0c8c89abd823c48cb96b4afff95b6aa18fc83e985bc"): true, - common.HexToHash("0xd07fdf6e48ca60dd6dec8a76132b5e07be4be01b6e520cdaa90be554e03aecd9"): true, - common.HexToHash("0x0ca5665eb8537783b69fd545c01785c7e0f8381268cd68ca8953f6fe31e4fd0d"): true, - common.HexToHash("0x0f7b6dffae2fe74031a9b4130116f8aadf9a0660ca2bd8092068f706a8ffe64d"): true, - common.HexToHash("0xaa4370279428724b18d6bfec945742b5db3f2880f303f461c0c298beb58bc69a"): true, - common.HexToHash("0x4bc29ff88660d4ef453e6876fa4e32698112d76652186aec42336b03d9fe122c"): true, - common.HexToHash("0xd587ff893cfa938b7880e3042a122784b94e5c5ed7188afbabdc8a3823c3d66b"): true, - common.HexToHash("0x42e89b519bdee8e87f92c213d9eb2d3ea6cf8aec80ddacf8b7ddab0e0521d027"): true, - common.HexToHash("0xa2e5c3ccdeaf83d0c64655554353bb7b413b805733989cba9e62758fb58541d3"): true, - common.HexToHash("0xb8f3e7c7f84508b05160bd60c7128a219a81fb3b9e55d944bf565401ed720a20"): true, - common.HexToHash("0xf9e4122d153cebd613cb4d2aa868b0c3c4b64db4b30bfacf530838af98e96d62"): true, - common.HexToHash("0x8a3938f2da09da3f592f36ae815f2f15b6d6e55201e21817584619c452f920b7"): true, - common.HexToHash("0x38ce484c338e2af7d0e35e52618724b3e29cc25e48896fc59edc4f3a8a88ddb2"): true, - common.HexToHash("0xedb0dbe117dbb2b6257ad580b3c2ae145f4406dba2289f0491f71c6742d4add6"): true, - common.HexToHash("0xba9182700c2ffeda1f8b9bcaa1a0e8e2285c457950d980fe7a55b48596261db2"): true, - common.HexToHash("0xafad40ae55d4488cf04611db93bb131f13638aeaad58ea7f3a343b5572032082"): true, - common.HexToHash("0xb5ae2df4645fe2c7ddcddc8a87ceff8aa488baf32a51dace30dd02d2544a0795"): true, - common.HexToHash("0xade1265fa6facc582f0701b7c56a231aa414cf9fd215eeefc8a946e9c041bda5"): true, - common.HexToHash("0xc21a86eb151aa4a01423397c413f2929bd4998b6805e79e14f6623ff13c8e702"): true, - common.HexToHash("0xb61e59496d7cbadc7e29c735084c9634099dbef9006745af52aae863ba5afe24"): true, - common.HexToHash("0xcfdeea460cb19ac27118cc742f549134924a08fe72c06b17cde3c448d790a9b2"): true, - common.HexToHash("0x1a91411af1a30012f78b2e84b63cdff6046da917a4250dc602988b1f431e2c48"): true, - common.HexToHash("0x5a4896dbab4e71a8f785bbfdeb6a5acbf2560d9db373e74942377aa2397eccec"): true, - common.HexToHash("0xd4819d0bb567897e76bc0a30ef35ccedcd0a4a6ce622a43b92e5e67479e902a6"): true, - common.HexToHash("0x910a7f507760c614515c0c0df7c5954069c03ae921b374c0caedfd906df6d360"): true, - common.HexToHash("0x76943990f5279e92ba6aac772d684b1510100d3aa8e5dd1a3a598edc8af0b762"): true, - common.HexToHash("0x6da4c536e90f9bf2a1d8aa7585ef233ecf30fe675d04feac6d81fdd4eb4a35e4"): true, - common.HexToHash("0xc3d6c51a80e8f8769768e79aae80d3eba136bdb08834e6f8249a0129dff775d9"): true, - common.HexToHash("0x480d72464fdcc0b725bcec8e1c80766f43e648301918241fa095c2b46e730819"): true, - common.HexToHash("0x7f78081004afa151e4e5268ad70fc35b94e84af3744c2333be1455648ddb3a00"): true, - common.HexToHash("0x401aae70e70c561f89c6c2877fa86c733c80031a42ca8ac512b9c929330ef60e"): true, - common.HexToHash("0xbc2f8c0c2305e6ecd82655838d7d0dc120619febee09a552de9f6de549e9ca39"): true, - common.HexToHash("0xc3edfc2105624d46cfb5d8fea4e6d70d09477a11f8ca993e796a4cf9e220b1ce"): true, - common.HexToHash("0xc4517151627a75687cc06bb76e5c85b8f713671f6b30db44b1dd83393c10ec84"): true, - common.HexToHash("0x57bea4bb1c168002225e95b3c2399ebd3d66d29e36ff584de7578c6849ec76ec"): true, - common.HexToHash("0xaf034c3f432e4ba17bb1e57070fbe8c9788511b5e97b2c7d5637d6e3edbb75d6"): true, - common.HexToHash("0xd2f487c01579512fefc5d66fb98e49a4c09d2a41680536133865c9085a01144f"): true, - common.HexToHash("0x8353b016db9e34e0372d3b0cd34542a04c934a7f13ac398f935b9d19cfe49593"): true, - common.HexToHash("0x53fe6b3e69b4c97fa5841bc6e512a4ba4525b9b3df090ce12daf506c7ef63b26"): true, - common.HexToHash("0xddc074f901903ce5fb660c152df7872440f2f8f9ffb9f29ae7f1bdabb822a116"): true, - common.HexToHash("0x1debea07693b29b1fb231f4c9bc7032ed08011ca3e46da9657482c0c30ff8a71"): true, - common.HexToHash("0xf7f88f01d85911d75ed1521b00c219763e00714882eb105c924bd805eb3569e9"): true, - common.HexToHash("0x4cfdfbd2504c307704bc1222b7175e15539bffc3adc0627d483b8cbf21a28bfa"): true, - common.HexToHash("0x632bab8b24992f90001855efbd04dc66b02d069d2ff87f310d91a65fcb53e6b2"): true, - common.HexToHash("0x012c5eaff2de4842ca4cb455a6c157fb0f15aa07e42d2d3c66c496fb9be9dcc4"): true, - common.HexToHash("0x8a9e2bf9fa48450567875c21723b077bccc080f83d4d40eac93fc1558c5d0277"): true, - common.HexToHash("0xe8cc41dba8d2aad7d9aa4ca0f0e62ae182f533f0c76da56333490a4c0e98dccb"): true, - common.HexToHash("0x7ae4cfbd4d8b067880464adb6bf4a086bd6b290ef19e28c5781f9d314970f2b1"): true, - common.HexToHash("0x8e35fb4113a9cd468acb0fba2e70c58e82417bb2865e2e6a243fb75c36120729"): true, - common.HexToHash("0xe9314f1f95d4d163ace94078c48b9e1c231691212bdbc5376865d981252f663a"): true, - common.HexToHash("0x1295229c1b8008f4d12e928b283b8266238ef5742a99997d2a26cfed33677b2d"): true, - common.HexToHash("0x46e5f111eb336269a694cb2d1dbef2ff9778c768d4c3806ae99a5f556a01efac"): true, - common.HexToHash("0xa88d9a4fae60a53f8b2d04c301779a70b25aafedff877ff1eaade526102dd43c"): true, - common.HexToHash("0x3bbeab74cfd8ada953c96dc53552a131252e31585cb039310c73d01f39fc54a4"): true, - common.HexToHash("0x4ac98114882d2460cb1030a764c5d152379e8f647cf0cadb9f563e77c55a4d37"): true, - common.HexToHash("0xdc327d5d7e37896cf18230e0eadb4b5572e20b9a75ef3b33df7c25cb8a159c93"): true, - common.HexToHash("0xc5e961bb6ed4649270d9f2e0139651d0d836270738e89198f5281af631be11f0"): true, - common.HexToHash("0x5397c06ce0eabd78d25d36df1634799e9232f8891f0528894bf2dec537f81371"): true, - common.HexToHash("0x505ca78b79e189705faddda61372c535857a57c1f12625810d310b974a483ecc"): true, - common.HexToHash("0xd7babeb9a97f575194eec77d8316b68bd006ff1298ebc3df1535e1f5340281ba"): true, - common.HexToHash("0x3a80fe07d2f910be763fe80e58cd22121cba80f748cc4814ef486e9a2351c28b"): true, - common.HexToHash("0x2c7143c5a6dd987e4b7dab860471e29d595194467e0a7caa128bc301eae3f8b9"): true, - common.HexToHash("0x884010ff19a72bee2f3b3027bb883b721dbe71589f063080bf96457fc6ce815e"): true, - common.HexToHash("0xefdb0cab544662dc39e2c94c17c4f51ef994b83f33320d744b92cdc476c2af40"): true, - common.HexToHash("0xd64aa1e9640ce2fcfeaa22046ab2846eec6662a876514873a252cf41e1b7aa26"): true, - common.HexToHash("0x5840822700cea4925d568d7941b6549b91775c1fd586025e80f57ae8cf69d1e8"): true, - common.HexToHash("0xcd94a2fe5c5aff6f41cef8d256e47270bc1a1ebfd3439a2608bacb9289ab133b"): true, - common.HexToHash("0x261484d88761c43157696e3e9df12bec7035ecdf395243943f5e7ea94cc814b5"): true, - common.HexToHash("0x0f00b564942e85dcc0259a04a493329dcd175d1734e04d5bcc335eb4d7b19f76"): true, - common.HexToHash("0xde7d24de3b2adb41b5a0ab1771f26ab39639dec1ab5117e4102baa170da71ea0"): true, - common.HexToHash("0xcb50b76f5b4f5ad43c6938831f108f213ebb0f9b5a547515b119f5e17cb5dc99"): true, - common.HexToHash("0x703e431262594622cea535dd297d3c4e3afdab505c8f5f323aeb4572d7a4f308"): true, - common.HexToHash("0x98537265df01cfd92a89a4aa90751fbd2e6e66a43f79aed791c0817bce8061fb"): true, - common.HexToHash("0xa1e2e25c0afe1de3fce94e768e37a1a68285be08f6cdd9eda001ca60b418569a"): true, - common.HexToHash("0x2d98c93b7724db44cc4f32194872bf25179a2be1cbf4e2f29e132f5b9819a8d0"): true, - common.HexToHash("0x57b3fc591953300da6692f1c36d9424fc8f640308cd3f66a0b93abc4913cf1ca"): true, - common.HexToHash("0xb0454535afdd6ce15d085b553d0223a1e5b7eb927dd074dfd7a37df43558a814"): true, - common.HexToHash("0xe31b7478da298ce59f15e3e271f5056332ed3ef6f8595d2b30a1bdfabb784ab2"): true, - common.HexToHash("0xe72583cebdcf0e13830496c5523291784c185766137d47abc10747893cd98d3e"): true, - common.HexToHash("0xcda0e689e44fd18f16a98f3a572f9ef9ed11a0b20e231e68b5c31c9e07ae4b3c"): true, - common.HexToHash("0xe873185c7625df2082ab18bee344190fef96748b0b518a8a6319312daac7240d"): true, - common.HexToHash("0x1a842bc35cc6633894dfdce37fe9372c10a298d60b2a43828ce302673d404c27"): true, - common.HexToHash("0xe6b24c4ebb5592a7bc65f28b3bb05bb72114c44149716f07712ab504ea6a1a8e"): true, - common.HexToHash("0x10552218b64a437e9d725356dea28cc863cdf9443c7ab378f65e9ba521e492ec"): true, - common.HexToHash("0x15655c01d3f0d12b39ecdbc5ed0803eb4f145a4c3dd9e855f7c45bc1c546cd54"): true, - common.HexToHash("0x74fb887f08f3152ede7a28a06e496bd0a0fdcb7087a02c78a80a1112627e79ed"): true, - common.HexToHash("0x4e65402b7270bf30596f2b8c52a3bcc52c0f96268bb6e04f9c0fc9bc0a5bd302"): true, - common.HexToHash("0xfee44dd5c10d75f5bdf60f31742c5bb0aa8c095f5bdea6208c08871763bb705c"): true, - common.HexToHash("0xc4bf6b2ce66d5da5e619edc97aa90b8b71c6ca49808032cdb4b1ad8cfe203b05"): true, - common.HexToHash("0x9f60ba7881aaf4d28e414a7d30c6bb6c702bd161901902e4a53657c92bcdca6d"): true, - common.HexToHash("0x30cd3e7db050394689dd58c2842ae14b27daf15e68a54f84f9f97d1314a88d8f"): true, - common.HexToHash("0x13b94d4451ad9a76a4b9b0866bd4d88017891f99c746c802fc78c42bf57a6a2b"): true, - common.HexToHash("0x55b63b46fcaebd72fd0e3c4d37607183f15508f4213edd22d19a740131735c3e"): true, - common.HexToHash("0x36fb418cb467b364f705963373063770533b3928de4d05ac79969e58ed168458"): true, - common.HexToHash("0xb571ca9271ecd7f0db96c07b7a3c4ffde257338551baa9f375f5a54769470ac0"): true, - common.HexToHash("0x50d31f0551a517b3d20be208b661a70c9f182956c806657759d46c5c41134dc8"): true, - common.HexToHash("0x42fcea4cfb8c89e03e009e974c97587e0748f5b81377c3f0adf9b2047b27ef46"): true, - common.HexToHash("0xe0e63de5d4ad0c24159d5ff126b55a1287dc65b906db33af4dad5b5ec56c6692"): true, - common.HexToHash("0x2a23af1211fe2d366c446ab3e15e6ff864849905be32363589cf6263b128a2a1"): true, - common.HexToHash("0xd0fa0ba5f63c6147f17c5ca5118b21978ff6e7816de9d0631a0479ffc5135785"): true, - common.HexToHash("0x739279c35a763c15b65e48ec43a92e1e0e8a9fa665684023ab47ac56377cd980"): true, - common.HexToHash("0x66f7ca3d9f08c48c2707ebc688f90d39e72763882dcccd33719f76680c86fd48"): true, - common.HexToHash("0x9791c32332e18da3707950a79fe6dadb86a3ac0cb29dde2dd41b25212cdefac5"): true, - common.HexToHash("0x80c8077fe31cfb067e5897e2d3054cb51e495d8ea9d81890438a62db7d639258"): true, - common.HexToHash("0xc144caacce59496907a8829cbca89b949e27c44bae80405751a84ba162eb4271"): true, - common.HexToHash("0xadf48776fc21cabe15183b2d9d491dd67fddad9c5c2a33d5b9e6bc5e67abb9da"): true, - common.HexToHash("0xebcec098465d5e3e1ea1719c49c598b371ea7f7ef604a0bdb2d28008ecfb5a0c"): true, - common.HexToHash("0x8fa7994434ddc5e64b13ead39d8b13807d8b7224209e838e4b156e76fe8b38b7"): true, - common.HexToHash("0xb95b10221978ced25af2ac44ab81e3831eb7a3a9ad5bee9732fabd5080ffeeef"): true, - common.HexToHash("0x4c89b91f224a656f141e4106f6609a565c98a29d0daac275d543c312afbce198"): true, - common.HexToHash("0x2d17141734c4aeb910743d70522348517d2cf2c8aabd2e59c39843c503d6c2f3"): true, - common.HexToHash("0x39bbf97108d9b2d68388f8c844d7ecad60816aac85ca02b23958487aa025df02"): true, - common.HexToHash("0xc252a81c23f15df5734d494b35cc8614231a6e3acefd02be0c65a4159de551a2"): true, - common.HexToHash("0xfc556a04a85308199bd51dd83f0bba9bdc7e9634c72efb3bc77d613df405463a"): true, - common.HexToHash("0xdf78714ccd39c0dfd289c05af585ed25043e704d8eead939551df83dc964641b"): true, - common.HexToHash("0x3cdf691f80495562dee8d9b5cf13e1117b0013777cb722755364078077c4f249"): true, - common.HexToHash("0xf5d4889498470e685d06174e42711a2086467bab82ecd3f20ddf58c180c30496"): true, - common.HexToHash("0x356bc81164c2f3063640604ed2e4057820bccbd9d8e97eca73416404d7adc480"): true, - common.HexToHash("0xcfbe98637dc5a8e0f893fb01d9459fd42fc854b692cf10e56803780540753d0e"): true, - common.HexToHash("0x6ccda450d8d21ac18364966649b5fc7196a95bb4a6924dea6843a2b7e530cf23"): true, - common.HexToHash("0x54aacc363be26146b8ab5f8411e8dca7f77c921682bc256f5203f016d69b9389"): true, - common.HexToHash("0x7de39e52b599a0ff3bebc081af807f9f83b06d0e2f88c44afe6c08de3857418c"): true, - common.HexToHash("0x017c8f62e98e082cdeaadd96fda7431d7cf2c8b392e23276a4b412e9ceac456a"): true, - common.HexToHash("0x7c204b78c81936e2d2687ecc5d2c1da14f006c3caed80f8eec2a485c746f317c"): true, - common.HexToHash("0x12b42f0e99010e1f87e9e65f8809c77b0de17193aa11ef1d2850e51f1ef01aef"): true, - common.HexToHash("0x0b112122a84ae51b189dbe1c2cc75417db22dccfc2592a00cb68f0c7e11edb2a"): true, - common.HexToHash("0x410bb0c4c65f4a267b8313b0f2e4b83fbb68c098558c7edda1f8a1355ba9623c"): true, - common.HexToHash("0xd7dddaa497db616a1747caad15504b5c6000b8b4d03bb53304435563f0dc6b9d"): true, - common.HexToHash("0x2b9ec784f510d47fb3072823ee26359b2e79612160f97d62881d797228ba72cf"): true, - common.HexToHash("0x0142eae747721fe4e2f3a552d039e678f477fb0b23026a01c2e8cf1e0d177f81"): true, - common.HexToHash("0x3583177b88c0afe77219f8febe4a544a3a1ba0fc08ae9a15ae5140fc3b11faf5"): true, - common.HexToHash("0x54ac5d773b2dc19d7521657234f60f28747322c73a0f1f8bf73531d84e53b400"): true, - common.HexToHash("0xb45a9d2d418089b63b8db1bb05c7dcf786102fe7d6e0728501c94ff09351fbf0"): true, - common.HexToHash("0x703e1879b5d619ce3f8e8069bd2c2dd801cb7e621aab51b4a18ba8361e50f8d0"): true, - common.HexToHash("0xbbe57b25855dbc6c9f9f8fec018d4ead7b1134fb713eb29d642f72d8dd241a5f"): true, - common.HexToHash("0x202cd684eda5b274b8c10ed112bf7cad81cf457fae735f9490b077acd442ce6b"): true, - common.HexToHash("0x06e7e17467cb95fb6fc8652a12ad6e6bdafffb4432b087e2d20dd15fc9473ffd"): true, - common.HexToHash("0xe9effe93de0675d52d53bf559a9a443f015aa0a4e1ec5c793892af203bd829b8"): true, - common.HexToHash("0xafc7e072b4fcd7f3fdc1777b9ad5266e198cfafb82a2c4929b31698551c51d4d"): true, - common.HexToHash("0xf34fb184be0049afd1ed39725e069c89d47460c2895dc61990e0f173c99b1403"): true, - common.HexToHash("0xf39f7dcc790092fe20262381997be51d60831641cb30caac5e3809f85422c1ef"): true, - common.HexToHash("0xb31e8ac5dc0b1aba8dd110e80cfccf2712490baeb68bac49edc4f68af762e390"): true, - common.HexToHash("0xb9045b40df0979fe5b0a261f6cee637b6fb224d3ea2be15b36193eb82f3d3736"): true, - common.HexToHash("0x8f019885842acda7f89923be88a86791e920eb8fa71d865da928f3dafd6b2197"): true, - common.HexToHash("0xdeb2df415511a3cd6db5d3adf578d4adcbd6345c23768206cfdb286e4cc9137c"): true, - common.HexToHash("0xbaa51b85b2ad51d935d6e1ac4a82ac6cc4210f821d188e6d8cfdbafd2d28cb8f"): true, - common.HexToHash("0x7a1e60d6bb4fa0d34c8511d9efae1e57447ee8cb2ae288a3cb26405e8f955fc8"): true, - common.HexToHash("0x9d2047251e3c0f73d0719cfb34c57cea2fa75f957f181d530e6fd4c9223f022c"): true, - common.HexToHash("0xe552a4fbc701dc990addca81b7e232f329a700105ad9c8e27b591d98a697ab78"): true, - common.HexToHash("0xcad66848287076517c2138c1fe477022fb121248b12a11523f8c0ad812fb2ac7"): true, - common.HexToHash("0x88498d50ebf3a9ded99cf6db8d5f32f3dd7ffb9bca9bebab6cce95ff63ed7c0b"): true, - common.HexToHash("0x8770a040b6f3105ffcb4bf99ea6b9d207810447f3580a0a8d4bf2ec1316ae4bf"): true, - common.HexToHash("0x2911df05e30c2cee4a42e29841c65022f02631b88ac22b63539527d2d2d64829"): true, - common.HexToHash("0xccf9823db6e35a2d412b6495765d9c32af97748e5102f570031bb7981bef6115"): true, - common.HexToHash("0xf86524757de7fe576c1288f4525dcff381fe29b46c383050922adec66d2ac337"): true, - common.HexToHash("0x65fdbbf69167dd07074daed34898f4d3d1c79a59b075b2fff7ae1c54551e21af"): true, - common.HexToHash("0x77ebd1af0d8258842122225f13b0c222d8f47ada6e1e6cba0f92f8c15d0eb17b"): true, - common.HexToHash("0x0196b1cffddee536d8b91898e0788abf85800a860262fc154a4e4b2efb809dab"): true, - common.HexToHash("0x3cdb47e2462260fbd4f701e06d8b1f5b52b5f553424ad7047ba4357442190424"): true, - common.HexToHash("0x4ccd4a91559f8b0441210458a833e1bcb790e81afa0f153b2924a0b4b5a79d9a"): true, - common.HexToHash("0xfed452dc6c038ff4b1e633dbf994fa44fe16a6eb2eeaa2d0fe82fe5ff51e04a1"): true, - common.HexToHash("0xad34d33b61092f5f8239b942c1d4bd8e5a6d2e4fdf6f00e1540ac4185bc94315"): true, - common.HexToHash("0x62627124254ee2cca0fc073a6ce0de503cc293fcb5df841c0ef15f415ec9b7f6"): true, - common.HexToHash("0x128646617c50c883d0287de72cee06511a9a78f23c292112017c47b758743ca0"): true, - common.HexToHash("0xa31d5ab3f6251176b08d75daacd0dcd6b6aa1d7a311de5b744f4b1d0cda5531a"): true, - common.HexToHash("0x01be612969afcd9836eccb4c15e1c40b50d5d22c7d091281098abb84991d2f00"): true, - common.HexToHash("0xa54ee9054140ebcea0a8af4c88247b4b6cdecac5c4e1229b694c96530a5da52b"): true, - common.HexToHash("0xf9dab2c90fc97811e9939876bce66ac1b5fce467d1683c32f41e2ec79463ad3c"): true, - common.HexToHash("0x8c40cc9e2df037ab9bcac206c9b698bb8c5504307bba89ec2ff3c982d3aaf5d7"): true, - common.HexToHash("0xa42444bac7656a8efae6efdf9ff357adef021d79403a9b7324dd324771da24af"): true, - common.HexToHash("0x94e741c793df310086ffd92eaf319a4218b67e31f781eaccf28a025548b8ba02"): true, - common.HexToHash("0xf61f94dead97e1fca1bb5cdcb074571a08ab55557379334ea8726a4e77ed7c0a"): true, - common.HexToHash("0x510496ad2fd81e60bbcfc246f92c345d25a0b32e255d7b36424235ec5e9c4139"): true, - common.HexToHash("0x84e3b6161942edeb416fcb77a84b316b065ead44b891393e2c535f2e34df49be"): true, - common.HexToHash("0x781060b5c5bf56b3cbf06e19754c5997a497f5a41d599b4ff0ab75af3ff52de4"): true, - common.HexToHash("0x6a4023d31d2b7f3cb6ff34b906973a280a187e768977b951b4b327a7c07f60ef"): true, - common.HexToHash("0x4c0f1f8b1587109acce3833541321eadfc98524d91259ee2b60b20b0967cf3cd"): true, - common.HexToHash("0xfd884da8c5d83e263f0029d56b379f93a8f7c44bff094dab2dc14e7b2fa24c8b"): true, - common.HexToHash("0x1439583a1325e1dd4adadedc6b9f15dadb35b9d07d07d3752262193b8234b3be"): true, - common.HexToHash("0x976a8ac358fc0c4c780978c3197ecba24df22a1a75bf69b23e024fd29c6ceffd"): true, - common.HexToHash("0xd1c4f6e2a6fac598ce12a3889f02c3daae49a06cec9ae306ffe79d00b1e18913"): true, - common.HexToHash("0x04ac2b916b12ad1087b167079486945d94c0cf4610f1d179aa22649c83dc559a"): true, - common.HexToHash("0x89e2489c7537c9abab008c035fac5ccd5201dc879d902099f42866fd0986f947"): true, - common.HexToHash("0x54fe91fdd2dd27bb59a93da120e06f8e4af0b1350fda75aa4fd24acfa9a09654"): true, - common.HexToHash("0x5653f2d443f33e2c4147a62331d94a767f648dbbe299fbacad203fce53eaf35a"): true, - common.HexToHash("0x7cc36a32bf98602be3eecf53c5c7e2925672034467821f5deb62b28f7505db14"): true, - common.HexToHash("0x568135a1ab86d08402fe83924bb4ca3d57f53e4e18b9681ce1816e9d1774b328"): true, - common.HexToHash("0x7f2dffe4fec604da4b46650a43a24272ccc264a2daf996d5272f20594246575f"): true, - common.HexToHash("0x428c6a74d85ff518614c8ffcf2bac830c2c037bfe819b6330ee9c2f272960400"): true, - common.HexToHash("0x90937d4d91e5074d90b772d2ed0a7834f127f201151de29f56a9b34764732c10"): true, - common.HexToHash("0xe805fe4282156401bf743d5263ac0d2caab042b0f654f3c86592cf40648b828d"): true, - common.HexToHash("0xd952ff87fb48379b89f9c2946a39eadfa04b7a7d538be765b4d139e9a62c6d0f"): true, - common.HexToHash("0x2ff8d809b206bc6133bac6861eb32ec509c635a57161a6e44ebca92e41b8e105"): true, - common.HexToHash("0x3653056173e56d53aa3fb61228e1e701ef7fd77f640aeae08b6c27300301c7f1"): true, - common.HexToHash("0xeca0d0bcca1f775a3d70cbda66c4dd911206a5c4ab12b28098d9db2d654ea486"): true, - common.HexToHash("0xda963eeb1b5a269ca99ad751d71c03061391b33d5719e3d8dc73a3ab2bf8898c"): true, - common.HexToHash("0x49950861f1f184307fa19d2a0f5864da2792e33f2c15b3a3174f8107ca10d4f0"): true, - common.HexToHash("0xb9a4c65edb2525b637e3b3a26811db3870d1816bb8eafd9dc3afc58527ba2b07"): true, - common.HexToHash("0x75507fcefa8f22bc09752007527fc11ee014a9898f911ae7201131f09069b8d7"): true, - common.HexToHash("0xf7fa40f25996218dd7d1344d92856c155e57765d6c720d337a32ecab94b10fd4"): true, - common.HexToHash("0x940bc44828f60e84b28c0e2f85fa85a8c0081d5aae25e13eb2ada89eea829838"): true, - common.HexToHash("0xcaf17a7d9af6cf339097f7dc41d09d4c93ec8d22458aeb5c012ea512e1840f26"): true, - common.HexToHash("0x166dbf8e5711a0778b623240bc9cb2261fdd4e96adaf23b4c3ad262a0cca2cb5"): true, - common.HexToHash("0xcf270ebeb2cde2f52292f1c6c7bce9c34b0f2aa5b7776dc87bb022d125bded9e"): true, - common.HexToHash("0x18740041b7e42c030538d47a668481e7cd6739c11a451aba6684872a279fcb3c"): true, - common.HexToHash("0x044729b0255119af8c60ab269482061954de54ed2aaf008d5a4068849df8e0ce"): true, - common.HexToHash("0x00cd3b6d0ea37acc805987d56ba2a83827fe7f88ee03b07382045b45776c78b4"): true, - common.HexToHash("0xd31aaabdd4bfa01d982721e0d6efda0cd8c7ac6230bc79effbb07de1ec90ad00"): true, - common.HexToHash("0x73e40ed7a042bdc1914caaa5dcd6ba6e1863c02857b023a33a1b3c1d6692bf43"): true, - common.HexToHash("0xe827d5e720299335b97bccf41d5c77282bfa7ad864f5268c12ae742de9c0add6"): true, - common.HexToHash("0x669b4a2e8e60aa54255749494c1d9909223192ff2654f0a0bd4b6e665f587714"): true, - common.HexToHash("0xc4452fccfa970e6c92627eac1ee31b0442cd61bdf9a7b71e3ebe0826234b25d2"): true, - common.HexToHash("0xf63c63473fdcddf5868305dfe0cc091f880daeb99f4bf457f9766ca62fa9029f"): true, - common.HexToHash("0x99f062c575cbf90b891d8e06f24d59515c9fb3de6777f6dafe136016162fc68f"): true, - common.HexToHash("0x49b433a5ab2b8895053fb87714fb00758c9f9c713087347a30d02e6a7f602d93"): true, - common.HexToHash("0xe35f6da644982afde336224626011d711399b30c27973bc43151ec4f2647a884"): true, - common.HexToHash("0x2f20e78a8821d2132e9a28a7051fcb160dfd33193d8dd35a170871577f02a1c2"): true, - common.HexToHash("0xc2959bc997b594bc8622c37d359264676a022f3aed049580f262fb3f1635649e"): true, - common.HexToHash("0x304434a4165a47143dd1e12c8971409e101a1bc48d18af8ee916e2d9020c3ad6"): true, - common.HexToHash("0x5387535f9b0aa8722c1b63a9e911a29485a49bb995f70b4a0814ebef366a86d6"): true, - common.HexToHash("0xa0d738e4d394cf1bc3b9654fd2984f0547191070d2cd1ca3b841e875eb56bcff"): true, - common.HexToHash("0xc1118613fcc684513ceb0f8245255f8a71a439da2b2cbea1fc6b7367bbc693ca"): true, - common.HexToHash("0x2a6ebc47d02a72695866ea34ca3f741d596b324b4b2269fa435c6e3b79e11200"): true, - common.HexToHash("0x3042dc3332ef97493abe91305aab6127f7217f7eeb07e6bfed946f7da3cbffcf"): true, - common.HexToHash("0x4effd83c32880536bef1b7b6853bf8cdcc1124b43593932b85c9a123f545dd5b"): true, - common.HexToHash("0xd1fa49d5856c7472e6e740ef16f77385a4df293306edf3e80945be1bf609d5ee"): true, - common.HexToHash("0xbbd6a9a8b7a1cf9271b7612af6a739027a391d7e507696b4ea1d207f3f8ddfdd"): true, - common.HexToHash("0x17ca1970755411759faf051d3f4be3a5a51fdd6a4ff2d9a98a34d4dba3d2b79b"): true, - common.HexToHash("0x23978794b3204faa990fa93fea56e319f0ff9152c9236dfa5b6638022d7884a7"): true, - common.HexToHash("0x99364747d4ff2f9b6fce61998c1423676765c81b99e2a9d8fdd2246a444e5c65"): true, - common.HexToHash("0xfaa793f4b0c8c065e61d4cc19aaced9c6917cbd50bbbdb3d1cfeabed22c026c5"): true, - common.HexToHash("0x404b2d922d0006cbacfafa11aca5e0236f2d338a120028204ab7ad8ec0701b28"): true, - common.HexToHash("0xc96b2d3cd3294afa2eaaf3f82e372fd1b2a170cc8f04760e0ac3d57eff2ef462"): true, - common.HexToHash("0x662777969a1412b11a6400e930d28a0c01b87ef83e1b2c3b588f0b190bbee257"): true, - common.HexToHash("0x449fbd969188b332076b350a3d89e686b0cd3588b3a7e14ca9767275f5d76ede"): true, - common.HexToHash("0x73368bdf6149ed47512fd6acbfc6c4b0b9af32d3ac6ffbfbec45974a9adabf7b"): true, - common.HexToHash("0x0a71171448f8960702a768d5f95295ce7fc632eb169196345643c1eb5a787d47"): true, - common.HexToHash("0x4e64c6e3a52e1b57a325a14835ec534d0c1f29822740d30c335524a38c7fa982"): true, - common.HexToHash("0x67c96ef9d09c56c5ce7f1e6402952f81a87ba4546c0716da8e83108e5038f7ca"): true, - common.HexToHash("0x9f339abe564e034079b53d4cc2bfe5314ba5b7b809e15308fd7217eb987cfb8d"): true, - common.HexToHash("0xf1e33eecd402ecc68d30e0fb3b52a6bb5f3d7fee6f3f54d4b97fa2e16eb3c356"): true, - common.HexToHash("0x00c4105dffb47d04760a4332da77f72fbcbfb9587858aecbfdc147c83c59d94e"): true, - common.HexToHash("0x98731dc3c7dc06fb26c6d98b96b73001dc9607cbf86fa166b33e7221ed9276db"): true, - common.HexToHash("0xfa993b6615e5ef3f8b783d55a05efa1814e405d410956929a3f84b0f333b35e4"): true, - common.HexToHash("0xdbf2ab6e168d27ab8f3842ded623b638db754416e510d7cdcd6b66d216d9117c"): true, - common.HexToHash("0xac3bc087c0d17b4371bc094f24b6bda6334886c6b218b3d45982265aaf6193c5"): true, - common.HexToHash("0xeeeca9d15c62eab302bf2ffc814f8f27d22fd0221c43e5af3ee84eb5c3576dfd"): true, - common.HexToHash("0x61aa32ff47b0b5743f9545e723ee518a4c7426c06d4ead61f42f5d19398e3188"): true, - common.HexToHash("0x7ebeaead204b36989d8999d61c3fbcd723db0898c9a24694e28a9dfe1cbacb77"): true, - common.HexToHash("0x8c9ac0295aabf8301ed4c61333027814d5ff4e0d71b6174fcf7c7166d19c471e"): true, - common.HexToHash("0x9d4c4645d34cd65804066642f811251afec4f5fc333d3037d108fcbfa682537c"): true, - common.HexToHash("0x97f522537320441f593ad31580dac65b5e62b651f82ded694a94a4ad74ee59ba"): true, - common.HexToHash("0xc3e8675fa36cbf668f7ab326299aafe877458144e3b41e9a3f60b319c510d901"): true, - common.HexToHash("0xcab08b1ea5d8cbf103ebbb1208755dc6d96356e7a42ab2d3ffe19e4efd26455e"): true, - common.HexToHash("0xd14fdfc4c528820a47adafd902f51b46f94dfa8587d1cc5d1089b064f25ca852"): true, - common.HexToHash("0x5862b08ffd50d4156ffc852088a5d82bff61a4136e46f4504becd7141da9b940"): true, - common.HexToHash("0x6cec2859c09304d72fb2aecc578c05985203b83c2d05e544311b96cf5e769762"): true, - common.HexToHash("0x88425bf0b96399a8fc505ef6fe95406da215c822f180a363d4ee8c463caf5414"): true, - common.HexToHash("0x8b7b8834a2d1507d04fdf4f9d95a14a766f218b6a4fa7bdf6c0124163ccee22d"): true, - common.HexToHash("0x52950014ef4c0dd46c6927b743be029a02714bd3d3fa7062357a4e9024fefab2"): true, - common.HexToHash("0xf2408e658f4b9d397a1935cbdf380a2c2dfdf4971e243fd1de48530b9e005a1c"): true, - common.HexToHash("0x650506e32fd3d7ac1c7c7ffc1e331f69f570db12965e100536f713beafa5bd8e"): true, - common.HexToHash("0xb8caee470be5bb335ca80aae8aedc8a9d0232def68f205f111b5becb6276883c"): true, - common.HexToHash("0x32a8085c1376a56f2430e2fff3b6b4a92211ee29f70b3e5d76f9d9db17426872"): true, - common.HexToHash("0xdbdc1b2aac7191f4c47a8cef061210ceb23ad599451d6bfe4fcf5013171b138c"): true, - common.HexToHash("0xad10427bd27fb32026a638b715f0fb95b321c1594255ca9660c168813484d67a"): true, - common.HexToHash("0x2cb8cc387cf3fd10c87689f4a71fb5e15e3b9a8e6c210de8eb236fce51c1d5ae"): true, - common.HexToHash("0xd661d0f8b8535e449d5037b9869c25eac266815863373be4e970fd4f1fec17eb"): true, - common.HexToHash("0xc4591946db61050f61655d7ac87912e7369bcebdff28f857f72140a3a9c5a4f8"): true, - common.HexToHash("0x3968b69833adcab43e486824f709db93ecf01c9e561bf911afe867857b617975"): true, - common.HexToHash("0xa84f0ad10d0e8da91a3f9230114b60f643119bbdd99b5265c694839c9f7c64f5"): true, - common.HexToHash("0xd4738e3efc0592f87c855d2359158ae9366ff4afb8915e4c62f40a229e6a6a1f"): true, - common.HexToHash("0x26735e9897abeef6378a5e685ef4226fff58fe2bacdbbd5cddd99f19357c1f7c"): true, - common.HexToHash("0xa64291c62ded0ecd8c87fe0b831854dd9629442e89a93f1f13f42f6c8850daef"): true, - common.HexToHash("0x147c5e14fda41051a2c3114fe72789305c13631528a57524a61958a67482826b"): true, - common.HexToHash("0x63eeb4b690d928906ffa538adba5d10d09a0495a374654a9dbf30fb93e8481c0"): true, - common.HexToHash("0xe7c50a6454337a7cffd5ebbd2cc8f1d84c54855b292ccf9418316fd0e44d1e47"): true, - common.HexToHash("0xed9dcfe663f0a69128ba5572dc4a6dc72ae4f52cc2ec46be2be4951186941251"): true, - common.HexToHash("0xfc9f1414fc5c69ed421057dbf381dcda712f05aa48c65dce6d7042af73bdeef0"): true, - common.HexToHash("0x52c049c24ba5397b910ea0dd9e657bc1f4ba1e6a0d87881eb7dc55dc54cfed0c"): true, - common.HexToHash("0xce3c5690885972ceadc690495514c106d9c3d7bba8b6582b6b3e6660de8eccd6"): true, - common.HexToHash("0x58c065cd3e5f05da7e4fe3704b9d8a41a92aecdefce478334cb7f186e7be8988"): true, - common.HexToHash("0x695d794cb1d1aee553d92e0a0de011bf371a523d0270337d8d1e7dd2577178be"): true, - common.HexToHash("0xae8f03b380c666954358d5d1618089f97c4e96b934ea2af52cc06dcb835b030d"): true, - common.HexToHash("0xb4487cbe4ecdff79b15d80c8f5780460664ea7fa06e4178c47c7f15cfe7cd698"): true, - common.HexToHash("0xd5c2eb022ecc6b51740938001f3b1ca24aa3bda4c41e63e303b5150d9fcd675b"): true, - common.HexToHash("0x02a5128039eb2750327ddbe8e345c1b293ac92ba4190de22bdd7591a8dd42cec"): true, - common.HexToHash("0x911e2bb5709c60cab453004063154847ae02a293963b41e1195a1e558c1acdef"): true, - common.HexToHash("0x7bf1231180657d3a60c583aaa9d13c8989d5200ad425fb25b4b86ed417d4d280"): true, - common.HexToHash("0x637c2ec97a05dae3131b5b7a7400f30f00a01affd136178f28f8a3dd956270e4"): true, - common.HexToHash("0x0d373ddd1558ac3ffa07cd6d11001e425ea302c2e23c5dca3356852e11fca62b"): true, - common.HexToHash("0xb20ed36ca1d9293bbaafd961f286eb134c8a23c288ec1fccbc5ac83d32c9ac48"): true, - common.HexToHash("0x6463386b3ef6c1b65058b08217d01dea179d528023d93953535658582192701d"): true, - common.HexToHash("0x8c45a3ce5ad04b1f97302007983742777e9352d64281a4c1d2b6bcfa2fb8d032"): true, - common.HexToHash("0x880a5f73e8fa3ea1c74b59e502e0352f280020e66d599a3da674261fad031f9d"): true, - common.HexToHash("0x5014d5584e254b7a52cc12db022e12661fa1deb7e283b5d8d47490ee26e1eddf"): true, - common.HexToHash("0xc3503c153fc1875e94df0184b59799310a1d699cf304a838cbfae877b2000e21"): true, - common.HexToHash("0x604dfc1da930232f46d35c851d098272f8af75af69a9d9c0fb08d07b2fc41181"): true, - common.HexToHash("0x32ba8f3f27a8c6a051e20162a183bdd6a49c7f4a5f5cc98d4e40cd3e83652313"): true, - common.HexToHash("0x5cba7ed9bcd80a12016463e41e2504984b4fceee0c6fdf034902967dc4b46152"): true, - common.HexToHash("0x19a3a716e792d5e93f89c8d5212d13904c41cfd28feb534d5364141d76483412"): true, - common.HexToHash("0xb43d5d3067eb14632771f2ce9ba1ac03f37191599f7df0f28e24d5588dbc977c"): true, - common.HexToHash("0xeba7a0fb18f72da6503681f32e361b842249c002c437ae93c82e5672e4835503"): true, - common.HexToHash("0x259c2dcb221c6f21fa7b43c731ffe9a6e8e89cfd876076b5832ea0dba0e1e3f8"): true, - common.HexToHash("0x31e5b2b428e90efc1c29eab69825ff75a7556055f2c0346e0005313bd1627bf7"): true, - common.HexToHash("0xb06a15fee5387917c50cbfe22d6d267d82d3d6670ca72738a7e11c965098f831"): true, - common.HexToHash("0xeda3edeea780cb081eb2edad3c3219d3fc4d2aec03a7445d1e384b7b4f19224b"): true, - common.HexToHash("0xa0aa371e4cc71440cde096c79c94189e81d05d8fb1ab0244dafbcd8559273945"): true, - common.HexToHash("0x9cae880658b74882d8fa99f554fc8e8a177c5fa2c5280a3d2fa1c1bd26bff56f"): true, - common.HexToHash("0xd01a45a7603504e7bdf2e1729efc556a4b5a7d7d4bebbb683276b9e8ff0d9000"): true, - common.HexToHash("0x64faf9a8645213ce284aecd3b7fbbf433586b03e4f5856f885a9bfa8d0cf9773"): true, - common.HexToHash("0xc39d702f9ac0afe2ba461ffd6415c58caa7c2121658cd1d7a8fcd161dbe29d99"): true, - common.HexToHash("0x8fdea1d602cad6ca3c2fb76d8e398365ba4a1e680b53904951295bd20afe38a7"): true, - common.HexToHash("0x29265ad6b92d15b86eb28962a2d40225232abc474b252a8f2b39105e79683c03"): true, - common.HexToHash("0xc2c81d6649969601c12a44bddeaad78ef2961cb1283ec56a94bb06afdeef37da"): true, - common.HexToHash("0xc8cd0d9f8666e0d96bc4b3d2675d8d92749a6fb8050475d475c68ca1d822181d"): true, - common.HexToHash("0x3e2c03ff17dccca6ec606123cc4bc941fd559f121460f8eed81370e8fcafeba6"): true, - common.HexToHash("0xfb4796344ea013d2a279af72a6a5db255d10eca3221fb46ebe6bf7b453286b3f"): true, - common.HexToHash("0x32becc7e3b0d9b2a6ea374f72d7b60f8f85758d014ce5ff417e8b20880b9815d"): true, - common.HexToHash("0xc7eadd98b3bddbf680693449fbb1a139fb591bfb34b801aafd7ed479098ff1ea"): true, - common.HexToHash("0x82651d67960e6021c317256d52dccf96346ec244b8e45cfa5608c2448f71eaa5"): true, - common.HexToHash("0xa96abf37e28ddf5dfe3fea2c132b250bfa174534d61414c66e9ff106686f99fb"): true, - common.HexToHash("0x4285d3fff5b8f24c2b2bb157b964ac73fe149b20b61f86aea84a7fb9d49efd38"): true, - common.HexToHash("0x3d0c2a6ed92e6b877b110ae87383abd8c5b916447ac96457282bab20f7128852"): true, - common.HexToHash("0x5bfc7d057413a41b631d9cac5b807e8031ff94129f66294f08bc4119c60c40a4"): true, - common.HexToHash("0x90eef15a0cef33ea6caeb6fe567f3f6ea300f9cdd321925afce20a802b97f647"): true, - common.HexToHash("0x47ecc548cf215d81b732df4d3f0fd2c629019288c4dd9c5e24806c043c50d6f2"): true, - common.HexToHash("0x61db92e51fbc87f3570b6724c34f2f0535008dd413842a7f45d426ec6fa3ca77"): true, - common.HexToHash("0x4911800c4bf0deda0e368ff601cde187784127edbc18f8a5768e3e6e56468668"): true, - common.HexToHash("0xd8d3802d6f2ee12aad8c42230d946bfecbc889aec69abf1982010a2545b32f74"): true, - common.HexToHash("0x3ffb667e750010297a8903fa21deffad167eb9dc804a2c6c39ab0fe978170207"): true, - common.HexToHash("0xe0a3cfa15f53e3d922aef213c85a2a4f46cd6f900ab938bd1cab22d00caa3a6d"): true, - common.HexToHash("0x9b530317663f81332bc9841861a8e788afe9b31fd1d664332ebadbd0023139e3"): true, - common.HexToHash("0x601c84ad42763c87b0ddcbfdf8f1b3b46de36f715a18a5790a652a96a7839abd"): true, - common.HexToHash("0xd1ec1a9ed4961a5c8a1caf0950cab4804f569078e7b75fe52633d30e2819d94d"): true, - common.HexToHash("0xee8dab435cf64d8daada1d5284fc599556e6083d07719988bb69c6642991a803"): true, - common.HexToHash("0x39ec8ab0d1c01abf5641f85902107da16c982a84e132812891efe7335afe984e"): true, - common.HexToHash("0x292b857b6f49e1134c80777c996ce343d053377beafc61bfc99b74de66370977"): true, - common.HexToHash("0x9a0939d35c093b375ef54d9422cbd6ae609cbba9e7216cc635db38814dff0c30"): true, - common.HexToHash("0x3d885f559f085359703b8236d29b83ca199a072e240107affa52cfbbd137456c"): true, - common.HexToHash("0x6161dabf4b3b507455200fd6ef78efac50a167873c90564e097faa2aca87c260"): true, - common.HexToHash("0x5ce33ca45fca1a676b2076fce0cafcfd50a4c4854ae9e54c0ddef321d89f4441"): true, - common.HexToHash("0x99f88eaf1a16178f58b500607b583802120447fde09ce5cd2e944caa6cf511af"): true, - common.HexToHash("0xcd4faf2a3feb5e99b45bbb60e5fe6663ea005a525b0a4b2599e545d4b864291e"): true, - common.HexToHash("0x70763f797b482bf6744e5a3a3d72cdfdf7a2ca8823be0ade40f836c9c2dca012"): true, - common.HexToHash("0x8f5a6223696cfb48a375caabff0ffb4cd622eaae7ce9c62e43b074ec478b4239"): true, - common.HexToHash("0xa0ff94c71a1e5cd8411e6d0c460c99667ed84bff51f2d7f51677a2d6a661bae3"): true, - common.HexToHash("0x10d8b7263987d58f2d87faff1e0d84360abaccc3f12a715e5432cbd84970f35c"): true, - common.HexToHash("0x1eea797c779b7f5307ea7e1c32c64d8c2d1b807fa2ccbcd4be95aeb9daf1605f"): true, - common.HexToHash("0x4c967ef2c45d7c29a5183eb8467afce0af763b3291e987239be99d31f0cfaebd"): true, - common.HexToHash("0xc22cbf9257c6c4584c6fd546bbdfb7fd3d1819e17e65dafcdb3ddd118a14a322"): true, - common.HexToHash("0xd7154c4d5b587818e1c87e1fc850676b2b9c233deb70a6f59a845d94e7caf04e"): true, - common.HexToHash("0x0241ec8ea24dac82bfa64b85637fc812c127f035d61662a30f65ae10e85c6f58"): true, - common.HexToHash("0x81554c43d4ddc153965cb721a8a98fa77b45733b820bf6778abf6b599d36ee46"): true, - common.HexToHash("0x7f58436fd367db95900ebc0de62888cb99d8e43730cae25a191083d80c22a124"): true, - common.HexToHash("0x06b036b84ccefd78f540a803c18b6872e6cc2ad8e2ea17f67d0ad16529170da8"): true, - common.HexToHash("0x4541b9dbe97ded20ca5ad17dfe562681d327478488da6e841d7fa27ee5484510"): true, - common.HexToHash("0x58f7be37155d91eb95dabf4117cff1c4d53d4b1caaf0205dc0b270132c16b657"): true, - common.HexToHash("0xf1179927611535cab311b16feeed6ee294a82ead715ff1586e29538de708a28e"): true, - common.HexToHash("0xfb0e59bfa1bd05e08b2578c7f8eeab026151f00b891b710912bb85edc93318eb"): true, - common.HexToHash("0x48a9e0d0449626e8e0b9274f56cae12f42cf445c60978fa5f554865275d977e1"): true, - common.HexToHash("0xc1ff0ce10380bd12631abab9c25e91bbb0fad728a39384874077411d2260ca0d"): true, - common.HexToHash("0x6b2d4b5562323444e141b7bfc689a547587e0c708d58372ad81a0ccadf61adf4"): true, - common.HexToHash("0x7093ddd3ba4d39126d0ac845e1167314e1f6ec4b8fd973ca86698ce401fb529f"): true, - common.HexToHash("0x52662afceb2a8e39d4363421ba8d63671a9988da81bf2b0aa6ecc8e8f7d82e87"): true, - common.HexToHash("0xcf762678bdc947361d3f0d847149c0409b8d91136caf60eb6a15bab2a59c716a"): true, - common.HexToHash("0x11c0d39fb8222ff85c4f106f2f37c59d5b08c5bd88d6b6c1d0d44052d29b6b96"): true, - common.HexToHash("0x2d8058a084aadaa6027d12e260380769e89fdab8afa5e25ceaa79f73720e8f4b"): true, - common.HexToHash("0x0a87b4412df29c26e0f244b398f8831183753271b73a604e9d843a297f73d878"): true, - common.HexToHash("0x02bf8f387beb248054d3582ac7fc37cc23f5b2d340553d92405babb95b5bf55f"): true, - common.HexToHash("0x2a8b3a5066e1003737d4c59c832d7f6c0c424c1beed02be79c96b69c50dd9563"): true, - common.HexToHash("0x6d442b1f27ccce8cf069c3d68df22991d5b683eb75e430d7e73647079f66e204"): true, - common.HexToHash("0x8e837124c15ae846fd00a8e4242a60293b68f6da7f177a31f98dba8746c3a547"): true, - common.HexToHash("0xbfead2308ac1c3c994ab6dc20dc98ed084f775a34bc3da846c5afcab1c69ba75"): true, - common.HexToHash("0xcad83c26fe971b650208c4fe1af1776771583a878767dcfb58905a8bedbbc6f2"): true, - common.HexToHash("0x8aa564b5cdb5f132b11bac2a3132218e77bc916f335a8b2ef5f48dfe84c3af74"): true, - common.HexToHash("0x35f7dba6254373c48fe34aa43bcac1ab0bb55830b888e01f945cdd268d4af370"): true, - common.HexToHash("0x05d7f1054628541e18524d0fd17d3ee38a29bc9f9db6449532c82d1bc70829e2"): true, - common.HexToHash("0x27fb289bff8db89289bc1122b3fd0a841ed07f4133189cd18bf81a05a7a29b7b"): true, - common.HexToHash("0x1ff58d0bb407ddef7c2ca7d463e5bd208de2b84b7d28d780b846ffe865d42b1e"): true, - common.HexToHash("0xb38f5c904e90864fd06af7e0b7e8c2d54362ba4f445d1e125a9f7f14e27ec72f"): true, - common.HexToHash("0xead28d4f22b5c26793bc4c6dc3a98f3307fca4ddf9d8705e49b4cf1a816f468e"): true, - common.HexToHash("0xeb45d934d1c64b7af5afdad4d5823d7a2d3d41ef8f1a69357faeadaa3b26269d"): true, - common.HexToHash("0x56243e6e7358b3f13cdb43dbd39425ee3f2c454c77127ada67ff9047e379fa09"): true, - common.HexToHash("0x8f555638279bcf186e9944d4e44cfe642dcc3c69e3985398f2c9d5b9a12749ff"): true, - common.HexToHash("0xec609411d5ddaca195ce3d34c249c12490fc8f682c57290642b0cdaf4989dc31"): true, - common.HexToHash("0xaa0808d62714902c14042c9624cb058dd783edc2bf0b4fe64289cd9520da29ec"): true, - common.HexToHash("0x40c1ff02fc06e486d58ba8270c7ffaaaf7549a4201920327eb6f01c04f1d41c1"): true, - common.HexToHash("0x5db10e60445eb92ca767ff3b415b7f414ad2c95625c7ac64e6d79c7d38605658"): true, - common.HexToHash("0x857fadcc0244a6dea5e46dfc193d2877103b57f1d5569df9b9ee2421b9939d4a"): true, - common.HexToHash("0x383670f02056871943d5922149075156fd85cb262729dcc86e75ae359274a515"): true, - common.HexToHash("0x8518e7308ab04546282e55138ce54fe89592fe771cf572438a3582f70493549a"): true, - common.HexToHash("0x7e5c860a3df0fc8c5909a025fe2a2672c57e66cb046acf717d434f7f42a81ca9"): true, - common.HexToHash("0x991b22f53d8fc576dfb2e042658dd765ba282cd716b95af6717a210340561e17"): true, - common.HexToHash("0x5a799fa4f9aa9e8be5f0fd4b66f9fadd77f8548f4affaf1921091c75a414a238"): true, - common.HexToHash("0x26a5eebc5d98b250df4116c7239a204956b2df03f7a537806c3a2cdc56e86df2"): true, - common.HexToHash("0xb96c9d124c956de8e1ac2b70061332fb33da72eca0edc42a5f71625c3e0e527b"): true, - common.HexToHash("0x0a82040287124bef0c06019d483bc230f0a0b01dd24aa0539bfa3021e251e3dd"): true, - common.HexToHash("0x3b318fb40720df6fea874422c0e997d26acac0c03b57f800111d529dfb82c680"): true, - common.HexToHash("0xb3242441654493ee1b9e12e6db2f732f8821b2baeebb8686d4b63716b1d022de"): true, - common.HexToHash("0xaf32f3be52bb739b857fb5ff2153bbd7a486de92ed20a9457374b68aa574221d"): true, - common.HexToHash("0x475474fc9b23ed5a97e8fddfc99c48487efcc340f0810ab3201fbbdb7b15b528"): true, - common.HexToHash("0x26148a1b154132abae3db812f505e41a60fd46fc068750f756976e31d760a533"): true, - common.HexToHash("0x06bf41398e90ecc971f2bcb9bc41a3f8440195c1ee4afb91a0a16f0d5ac27ebf"): true, - common.HexToHash("0x03e1ba11bf3e8efef3830789a7ed9ff1ee2c58775bfbf116eb6b1dd55fdf3f05"): true, - common.HexToHash("0x7a245acd437c973290cbe4baffa3cc81dcc505d00f96240bae2b4ff8f0861c9e"): true, - common.HexToHash("0x7c432e075f28c4601ef0ede1e925886fe008063bdf23bcf2b9180eada225291b"): true, - common.HexToHash("0xb08d8bf252cd0164030326a0bd6b9775120e4dc9b340640e2ce2fd5b03815965"): true, - common.HexToHash("0x96166cb3c710c5e412b0fbea0496ee24549d770bce2f62d05bec03610d594363"): true, - common.HexToHash("0xe42da0b3d857797c161166b39ffb3cb88985ad48c9b6b01e0aca0510b396798a"): true, - common.HexToHash("0x1e44c5aa80db3a96789a5e3ff735d8c3e9371eadfb4175e15c98f55b3d2897ed"): true, - common.HexToHash("0xd275cdce43f9a88712ed38b1f7cd39f4e383a42b93b19ef7fd8309ffe5cc1230"): true, - common.HexToHash("0x4195b76dac98988ecee5b57dc3edcbe15759f567944b97b7b3c04d31f78f6618"): true, - common.HexToHash("0x14de970de4a7e25584917c2747bc9018bed9cb4f1c331c3bb8af3bb745739aa5"): true, - common.HexToHash("0x4a29304d36e266ff242c5185448eb8f2c7e46ebcae06ab4355168620440c0969"): true, - common.HexToHash("0x540d0bdcbee11756c4ddc9af87733516b6bcfa68aeaa2be3af1a7710e3db621a"): true, - common.HexToHash("0x318b434364f6c9915d1f23b271704adb61c86f55735ea3b9c09d6dd08d52ec13"): true, - common.HexToHash("0x857529a33b8bf1a2e5ec2a49425ac852403837c3a0a1cdca6b8c84768126f40b"): true, - common.HexToHash("0xba17c0fc6239717c68751e6888a55fd15788d4ebae4a854b8809a1cfcadd69b2"): true, - common.HexToHash("0x78e43225b4639e9540339ca90eac2a16807b2a0eecbd39a8847fb6e688ff4641"): true, - common.HexToHash("0x6a3fcf59aaf9c7e80167685790a1a7989a1a3ee8d99ac0c69d5af434619cb8c2"): true, - common.HexToHash("0xb47ffa8fca10c1d1b16fcdb96a2ffff5abc08f1e292e8cce9555b8ec2ecc3c8c"): true, - common.HexToHash("0x90703831d2cd100534266882fae8726923f4d60feaf16f7e9c835b8e7f699798"): true, - common.HexToHash("0x8275b7190d15c9c27dd7da8a0f07c4aa9c1028204a00750505586ab1556a4fd0"): true, - common.HexToHash("0xa4f8cf32b4c0b6528db55cf41dddbc6b129cb77cd357cd0e446fc98d5b22fcbb"): true, - common.HexToHash("0xbd3dd0ae7fee8984b70b543de9f76f79edc0e9faf3f0c8e88332ffe1a0e8df1c"): true, - common.HexToHash("0x508ade0e6adcde460b617e7ccb2415dedd34b98f9df07147fdceb59878a2635b"): true, - common.HexToHash("0x25cb35991f791f3189f5f1ae7ea77ce9bf92d7c69d141262ad049c4fd1916131"): true, - common.HexToHash("0x867e19627ff74610d98aa467956d562ca5c224ceea3d47c7a2b29906bbfc384f"): true, - common.HexToHash("0x0939fe1ae8cb16202fbf93153d560b6b32bafe7e7d7777287efdcc6bc7f1d67f"): true, - common.HexToHash("0x9369ef326a101de308986ed50867bc63f8b75c3fa6480ea5bce231d125418043"): true, - common.HexToHash("0x686a045208d3eb84cb7ca46a50dc4fed31e15b4d4ccf502fedb1a8be4f8c4634"): true, - common.HexToHash("0xa1826899dc5757648785da5df34fc9bff1b1390784f5d779988a0782fd494df5"): true, - common.HexToHash("0x8b4249df5619839361fe1891ad43c1f22148b4e0fcefdeefb6e5f89b13b8d8af"): true, - common.HexToHash("0x4bfa1c744a8f94085920bebc2feec2f7353bf0b5ef7d19ee72cf6284629165ec"): true, - common.HexToHash("0x344f5b77d76c9b45348006453f8acb23dc43d0771d4fb45bd198c35d4d6fce96"): true, - common.HexToHash("0x55989f581fc2944ae317d07c7945f83c1a0dde33e2d176145c54aa0cb3707ff1"): true, - common.HexToHash("0xe3002c0fe766465574e50dc6834e4d5c0eb3474e51cb7e7ab58946038ad44324"): true, - common.HexToHash("0x4a70f2a76d728f921ad33cb261f595d3006aa66c57eeca101676f51bf743767e"): true, - common.HexToHash("0x8b6730cbfe63d5e4a3de6a7c7b0b2705b9787c5c3b8d68bc7a98b92e486b4336"): true, - common.HexToHash("0x1014fb46ee9d9d33a369ec4238874fa2bf08f53c440647a2db8c17336cfa20a0"): true, - common.HexToHash("0x32fb06e23c360ebfce0d9faedcfcac10d3cfede97f64c9d5817dc54246ff7e68"): true, - common.HexToHash("0xa9f8612f4fdf09433fbe149d5afbea26285f819a131c67f3189d1b64103d7010"): true, - common.HexToHash("0xa637bc81fbcde2811f0e69fa1cefba207e42b388d8a7cd29f19744da17d36f75"): true, - common.HexToHash("0x50a86ba8c02bad00ed983650fa00b73d898d14faffbc00341051c792d4edcf73"): true, - common.HexToHash("0x133dbcdd1d4872c1f1604a8af757054110bcf589a1acc5376a37d54fa1338911"): true, - common.HexToHash("0x5b11427a76b8a2de0e8de83c81f267aca53b3e16d875c4ae0875559d906eb9b9"): true, - common.HexToHash("0xfc127a1044c4a6c169bb718586e91f9874d067727c38c6d3155a510c044af919"): true, - common.HexToHash("0x3485d17190166a38e777932bcfa30514aab05314eddcd05b32071a5260c4e7e7"): true, - common.HexToHash("0x3990e5087a9dc434d603f76fa8b4061e17da217892886afd55c94eef73b1b5f7"): true, - common.HexToHash("0xc5a1f298fec8cff41668127df38360cddb6c84acb4374fc9feb7ef085130b708"): true, - common.HexToHash("0x080012b9d2a620749fca3c4b3567c2373ba0f3c23113f85d36c968481ffce467"): true, - common.HexToHash("0x5d87434e05003d20d518b2f6815c018224595df1f6a60d2120a6cc524bfeca85"): true, - common.HexToHash("0x23702ec5f3c525143a5b81ab0509bf79e8a18a1d9f42a6fe17cc2b3fcaa38be8"): true, - common.HexToHash("0x6dbd40e57d3e4ecc77ac0f9323c703e3f5d083a59e8ddf83a66a0243dd369883"): true, - common.HexToHash("0xad0a6e7d61944d4ffb74455f1bd7a042c4ddf01ceba482563bbf9fb7240dcc99"): true, - common.HexToHash("0x157e97cd04ca19d1a1624bccc9c0cddda48c63ee61cc981f601617c81e3b660b"): true, - common.HexToHash("0x33d1acab51a3dddb4b704e9b24bc4d744327c0b12417e7d764649a7320c1e92f"): true, - common.HexToHash("0x4f8f768e3c8eb6ef7cdd4784b8ea6e2a54bba664316b34a829fca5afa5726ac0"): true, - common.HexToHash("0x803b0b60c68fb9eb003ddf6893f9d475b0480c542be3aa61040e4c50b4051212"): true, - common.HexToHash("0x7f21039846847bd8fb89d5655ed40c63f80854fbb7c64369974d00dfe2fdcbfa"): true, - common.HexToHash("0x8bd0f1dc12c67fb2b6144b392223da4b2290489d2f57b0c684af708093dfba81"): true, - common.HexToHash("0xf9ac3b69651a87311d19c5528f638c4fd9ab762b0428f64c1db3b214da1b2c62"): true, - common.HexToHash("0x383ebf351305f5603b227e03920bfb072c2685149dd927bc58768d8b39dfdea4"): true, - common.HexToHash("0x9cc380d997b9f990d4c7d4f8cd203cf77dbc3d3d480a42b7dbeedf0dc7fce97b"): true, - common.HexToHash("0x53989ae4f77be6d2c8c5881950b6e0357521b7e329f0a3562e88a1db480206ad"): true, - common.HexToHash("0xed9ff761f11a6321d97855f82748da10ceff9cff22068fe2ce5ee6897937e5f8"): true, - common.HexToHash("0xb0b413b93f8adf9fe2c7e5e8915f55f87b6bc6087c61107f2b8573eaaa12cd33"): true, - common.HexToHash("0xa86c8c9ac34bc9c819c7fd574128e1ca0c64fcb38b530161e77c7729177e94a7"): true, - common.HexToHash("0xa7d0c12ca96bb3050bcecb579814b01c1486bbdc282cd456da0303513fd0ff15"): true, - common.HexToHash("0xc41756b7b8f20b399e8cb711eb96d1f6511283a48e6bbfec09a64b08c894b2da"): true, - common.HexToHash("0x1283e846593931cd17ee60f6c16c7bf6bf64931a2dc3a865711f19c6f8a3c238"): true, - common.HexToHash("0x65f35a8f8cee28aa3d98828bf7f8e79fbe872335bc40bfd4ef54e7d1ab441d64"): true, - common.HexToHash("0x6fff5cb5fb81dd5e3494ee77f9206c6666d6542a0342c32cbb67a40907162569"): true, - common.HexToHash("0x95a4216b8112ef5fbc3d3bdb156f73b6507e7c865550d67c8e525e07695f0369"): true, - common.HexToHash("0x1b373e68e3abcedf35d131a49e52355a293f05d6f0723fbea8338a8a1ffa47e3"): true, - common.HexToHash("0x0f772a9abb09cada77cb41d1c30396aca7041b652b4280a87cdf8b7d4bd1065b"): true, - common.HexToHash("0xdc33bbd6136df8f6b89588159ee5f19a5b5f8498c3808ab767cfa0f3675767c7"): true, - common.HexToHash("0xae0f429679d9c981bf49b1b05177bbd08ae3c76f7f397abc949ee5a0b1acd665"): true, - common.HexToHash("0xc60edd06fc67d9218d43b97f0c9ab1f376a45b16d7387d937bbfbe5f4c7ddfac"): true, - common.HexToHash("0x978fe4b49b01ec86be752da869d6c7dff617409f3f330e23af2e77760005d81a"): true, - common.HexToHash("0x4d5ce7dbc1ff48906d07375f4ff08c32ebb9ce46784aff38a74d9d18d4903955"): true, - common.HexToHash("0xed1b6a5446c5f5933ca1a74a9e7c1265946c7e038836074ec877cf5e248a7f81"): true, - common.HexToHash("0xe5c995c5a6bd34c7e352e1684a447be97dc9a02b1cf05b2373ee1326a824486d"): true, - common.HexToHash("0xc2d3526953ca4ba8bfdaca5567aaffe82ad2a9a9a89c14dc8e5e62dec8b158b6"): true, - common.HexToHash("0x75d74f36db0eada34fe553043745bbe949baf2a6719b84190d9f1ff9c2788af7"): true, - common.HexToHash("0x3fdbaa4d9f096dd009137e224791f49525b52f4f0913ac5f184240b3d5ad7359"): true, - common.HexToHash("0xa1f397b51692f82f2e983b430c89bb0e19b9547b066132eb4dbd54dc3a4edb0b"): true, - common.HexToHash("0x422b8bc448d5abb4a91eef423a3a784ba5798f7a3f047ffb554b8bd7ddea6543"): true, - common.HexToHash("0x88423380af869d8937c7f074ec962866eddcf5c5fa410905a38630a172824a8f"): true, - common.HexToHash("0xf99e45cff3ac14cdf1c07ba485b842895ac69cae9e92d3b900bfba0e28ecd7cb"): true, - common.HexToHash("0xc3d6942582871583f9deeb106d7f33c5d11ca105143f67ef9a5bbafeed7573a3"): true, - common.HexToHash("0x1ea9ab3dfd35acada1340f532b1a14b0aad161e650a1c421379e9e7178b36208"): true, - common.HexToHash("0x486a82358ff15549c95571e2a1acd5bc3992c6be8bf3928c97e363d4148ec9e3"): true, - common.HexToHash("0x71a336bc6627fe7668a4b4df58019e816899751b578f19ef17cfd33b57143018"): true, - common.HexToHash("0xbb6f6b780c6f672d285001feacc53d7860bc3065c9d07b13088caafc9498b993"): true, - common.HexToHash("0x9eae3fbd9ff1c65d80896271e9f1a6f15449e25934171e7e04b48473ef35ab53"): true, - common.HexToHash("0x617d506b8e371bda582c14b9473709d1c61048521c779123f155e221dbb36d4e"): true, - common.HexToHash("0x7b1934f1eefc99b08ca0de98a31eb6fa0d759061969855b8593794c5106c4fd0"): true, - common.HexToHash("0x5b305748c028a1fdb33e92d35da68e70b1982f9b3658013e29e2b22c1bd5f6c9"): true, - common.HexToHash("0xe5962f468988ebeb62d2edeabc19e82dfa32010ef7226c1ca0e55f5b9e1aeb91"): true, - common.HexToHash("0xa3bc74bb0a8922551c1f05fae08b97882ec024c1d38c108d29b38678058f8506"): true, - common.HexToHash("0x6dd50e7a1486e6e03336350fa79dda92440f0a55275a340ae5d8bce632505206"): true, - common.HexToHash("0x526b8fd610133b1c2968d59c8103641b635cf03d31dbe41b51381432a12703e2"): true, - common.HexToHash("0xd769ed3fbeb167878f4921e4b3a36afd5e52b5a4897954d1ae18733950463d70"): true, - common.HexToHash("0xd60150eeaa53ba4c8413027dcd7a0be379020fbe5b191cb8fab2b0a8c1b98db6"): true, - common.HexToHash("0xcf50067c6d7ef237b95f200f7ec1d24c623ba90b93e86e7aa9b8d5726a80ba81"): true, - common.HexToHash("0x57d59a041ae76c7252f5e88456ffe68d3ecca1435c98d6222b0554adaa115fbe"): true, - common.HexToHash("0xdb11b34bc0cce98bedfec926b2a71ab24677eb885e1bb33cf030d8524727efa0"): true, - common.HexToHash("0x388476b62e02e1543327bd660ad2f6085796b46e158a7269694c44852037701c"): true, - common.HexToHash("0xd0de015c1175bb11166974a53f3de5e0cc63fc73485691f9e972cd4a0840a11e"): true, - common.HexToHash("0x64e40463454b63cbb9636100b0b2f36fdca42ea1621ffe0c89a818f92667dffb"): true, - common.HexToHash("0x76d9c285092a8440a6f29a9de7f58463a71f7d414e03858010657c6bd02f22c2"): true, - common.HexToHash("0xfef541c35a9daeff7fe910fcf5ca3f1de39d583380aeb4032b72d032b283fd91"): true, - common.HexToHash("0xc1567131bf5369a991acc112a7a608a506dce55081989877b32fe0b0770b62be"): true, - common.HexToHash("0xbc4343a911a8c28e9237471ff899924ea7c6d50d5df5d5fc97feb911ebb0e851"): true, - common.HexToHash("0x42f558727fd5d45c2c08d8d56fa8e0cc8aa965b310ab8040438b6fc5f985483d"): true, - common.HexToHash("0x5e59b96476f704c20a02fa1bcb71d8c5a9128c971e18cdcfe68359f1f8aacac1"): true, - common.HexToHash("0x1c6012da45fdf19c1a0365d24dcf0e14151f45dfb1b78356ade9cebc37f9017f"): true, - common.HexToHash("0x7a48784e332e0517b96241cbd6bf6a55711e6289b96371bc8e16d7624252d608"): true, - common.HexToHash("0x1785d74357552698f53d324856ea54e7bf0845e2fb1bae55b728bce7431e362c"): true, - common.HexToHash("0x3a572198120be8e09508a1265862e5426e4c16659fb56abfcbe5933855f189f1"): true, - common.HexToHash("0x54f5cda9c38e271abd3e83ddb78daa19a965ee560bd397a2720a302c1fd52d18"): true, - common.HexToHash("0xdbdb4b86cdaac7ddf74569c6c6fba86435eb61b432873f95448bf9c0f8f13bc5"): true, - common.HexToHash("0xe88fc014d0f6035b5549799e052e6a9b556d6a11668c977811d27d874d71d700"): true, - common.HexToHash("0xca319e0a25d9090533bc71f993748cd9e0503fa3c2680a68987147cffe37d0f5"): true, - common.HexToHash("0xf4cb4d83dd0fc71da7e00da1e1fda234c53c0c40bd44d228ee5164e6ba750895"): true, - common.HexToHash("0x5bb540a216f9fa04f2c96a1706d741ea0d23d12f316f230aded361a46443d2eb"): true, - common.HexToHash("0xf0d6e981dbf9bae5eec10e742dd8c52c60cccbffd61e7d71cdd89989a031f387"): true, - common.HexToHash("0xbe3b973249cd25987eedc3720d71744fcf2025b921215a72c3e4ac8f571640db"): true, - common.HexToHash("0x1ec8f29ad8b30120d8a40098f8ef0ccf12137b5c329ccf5b2eac4e3e9aa5a5d1"): true, - common.HexToHash("0xdced0f570e99fbe6699d14ab6ade5440f4b401b960181a970f39e2490e97b8fc"): true, - common.HexToHash("0xb475f6d34feabe3a6ebebf2a4dcdb835f636391baf053d70b084a8658139113d"): true, - common.HexToHash("0x207ca1b2c97631cac07d0d365534013ce34f3f1df4b4f7868e56410940872246"): true, - common.HexToHash("0x0e2605f21404a084f518914fbb10da58da0d2b026a0d4694cdbb9e90f2af0613"): true, - common.HexToHash("0xa22b959a24e2bf0f1c853e92ff6e3433d0faf7b909e81844ba3a6a3f97a20d3a"): true, - common.HexToHash("0x9b526c39ed9ef256e78e9484dd6f3b288b6944c6210862dd8121833887a0a551"): true, - common.HexToHash("0xab0333c08b000177f9d029bd637008bcfee281e56a07608bc3af78de60177ab2"): true, - common.HexToHash("0x10f2e8f1dbaf2c85debafe326b391c8e0b726e7fbc27cb3075deac8f5f3d0e09"): true, - common.HexToHash("0xbaa63927f3b87909f3135d3d2c6b6e406018dcf7bb77495a7441d5ff770a98b6"): true, - common.HexToHash("0x636817126754ee89d4a6c333139a6d10d79cfd3b8145931aa3f53e0ea42590a5"): true, - common.HexToHash("0x32a27323073b8e9ae80378551a79f0301be0c04ae4e85827adca2b73478bd5d8"): true, - common.HexToHash("0xbf55e807a83d6a9f34711d8983318cc8ac8ffd91507c14be364ccc02fad01f47"): true, - common.HexToHash("0x25fd4d654248a1a539ec0c6db82299e0cd235e55add8332573782f89bd0c0938"): true, - common.HexToHash("0xeb42961108201f7477e19dcea6bcbfe1ebed49035298272e9a6a2a7b2c69d25e"): true, - common.HexToHash("0x17c7ed7a327f8bf29f6c3949ac8883a9d07bfe6477d1c19f69c944f080856c97"): true, - common.HexToHash("0xb2bfc6eb084d8d2c716b538bb1d80c190577c73e73da7f03d79226fa01d26f16"): true, - common.HexToHash("0xa01ee7e12d9fcddfc486f5a04b7dbf39c06e0c13163e2bc923493f4f90982009"): true, - common.HexToHash("0x8921683b18eac51f8bb5278b847eb5005c02b3ae0000736c211f0402f841b05d"): true, - common.HexToHash("0xc38b345ce2c746e657fd6d4747651cc214d5d02c8a2cf836acbaf1b130c36a15"): true, - common.HexToHash("0x7cf294188d99f7781b49880bced5e48b27669b9c5e19cfface598414b2ab0951"): true, - common.HexToHash("0x754b1fce8cf2f382b37ff626f7aac376814fa23f13750084d84a0ec014113dd1"): true, - common.HexToHash("0x86318c6ab971136011301a53a2a5c96eba824608c5eb06f553f07fc9b9cb7c11"): true, - common.HexToHash("0x7b05badd8dfba4402d1eafd19ff5e26bdd33b74c174a1dbf0b4d453bc4d3be5f"): true, - common.HexToHash("0xbf1c002f86d8f59623c1f896c2f5f9ff7d32c3f852c841c3fa4ff7d63b07b7ca"): true, - common.HexToHash("0xf7d197dd99b16858d832ce7c56387be7efd0176fb067cd94636b78d96b4096c9"): true, - common.HexToHash("0xd06893bda1289e976e690797259902dce7c23952a099680500b0413025e36911"): true, - common.HexToHash("0xf066da998b3d70825fde3bb497a1415f20ce1cd78a725410d633fa142d68439d"): true, - common.HexToHash("0x2326a823ec3b307613a51ccf6702770b4fe6b00b0df0a394328805aa62c8c7b6"): true, - common.HexToHash("0x205fcaeeff4fa72809561c6413061c6dc5b4ef4e1a13e4742b75f37221477b76"): true, - common.HexToHash("0xc956ca7c00ba6020811e7a1f37469ae36e1a5366d6c8405f9bfec9b95ed6b8dc"): true, - common.HexToHash("0xb6c9871b30ecac9b0eb75ab1626bf166990a24066c39f4493694dd1b3bc51329"): true, - common.HexToHash("0x8139185b832e602689db92980d0ddf9e625a08cc232a76739f2a6b73bfd268bd"): true, - common.HexToHash("0x4e49ca4486276c1bc16f97cda5dd3b020bf3f3c2f9e6c1502f9511792f67e9ec"): true, - common.HexToHash("0x2396894dcd2bc2004c8e15d79e81fe70a6d6bf7e49110eab71b7a05bd5933621"): true, - common.HexToHash("0xd567181f6020123ba0adc0d4b184fe09b19efac94029cf44ba62628cd5867cc2"): true, - common.HexToHash("0x70c85ba7c05412c7f3652356aacee4da0e7d0952ee99843dca6ef3db7ad35fa2"): true, - common.HexToHash("0x7a590eff66e77e4deb4625286c18d8f3c2381da4ecee9d84d928c93c4454eb53"): true, - common.HexToHash("0xe72fa03338bf4227a58e6a461e3e70e21416faad032c277dd54a53c82d473508"): true, - common.HexToHash("0xf31e7df5021347532db9fec9829ce43d244c2127ef748de2834ac36fb6ef096f"): true, - common.HexToHash("0xc34ac0111cb88bec0ac878645cdbc650191e8deaae1ba1b2e1fb9137342e7b95"): true, - common.HexToHash("0xbdbf0cc9e1461d4638e6ed3b376ce900c0856aab3f5bf5734510c237ae8aed04"): true, - common.HexToHash("0x799863b50ae2c3f2145dc079317fc193b547b6f18a2b7a9a2c9de4955ec6a61e"): true, - common.HexToHash("0x02057f0fa5dc5bed1d8bf07edbf6bd8ea26ba57d1efcd1182a5e1826cec99e29"): true, - common.HexToHash("0x4b231534a48ba6a39ad9838b6779099db98dfec40ec266c20b9eaad97ebbcab7"): true, - common.HexToHash("0x767ae3f9a1a31718b6967fcd5fa3b4bbd94292ff53535719961347b37f0a372a"): true, - common.HexToHash("0x75fd053c54b00d03ccd0b2ad8624eb59d8088da0b3c91921f63e403834ab7575"): true, - common.HexToHash("0x619f0d2d5ec214b47f5fa4ed261bfb6dd00f7b003b08795b3280b9b329dfd939"): true, - common.HexToHash("0x5c8895a333107c63c674b1ec9f5af9fc4f0d012c1e510a0fd91a004f5e594b42"): true, - common.HexToHash("0x911af6d3493c46d3b4029ac5141bcae927927604653fa7ace2f7366c19d4e38f"): true, - common.HexToHash("0x8d8e6e0d64770611078b7f09f2f7957fec416da3992defff196ba88021a05bcd"): true, - common.HexToHash("0x7250651532e42ac0e49e761f4669342a3f63d31a52e7b55afead9385a09256f8"): true, - common.HexToHash("0xf2b5713243cd8fcfa71b14683a4f73e4a3fd3b21b4d7f7bad5da5373411b1140"): true, - common.HexToHash("0x01f055a206bc876ab1c4389f25cc5e6c3ed41307b1433ffa7784fdbd1c550b22"): true, - common.HexToHash("0x403b98a94989ea1f9e1f23e7537490d2f18db826bd420689727ec3f121265986"): true, - common.HexToHash("0x2e0700002301aa64667dd0296043253ab68ae83a4260487258cabb71400b21da"): true, - common.HexToHash("0x967414f7612415b80a5ab57d54daf738d5e97c70ccceb7fe8b4120130fb0a61d"): true, - common.HexToHash("0x4adca33d4f5f6525e91830b1ae38f5870c980e1e286e2899694eee0d0527804f"): true, - common.HexToHash("0x968b9df6791c4440a5cf5986849f2c5c479673ba9c1449e3a849a38ef23d7686"): true, - common.HexToHash("0xb1ccb09e13db0e1ba93706671c1c9a7eea5f05616009618873aa1b8ce21604c0"): true, - common.HexToHash("0x01130903f03eaa85e0778dc46a49be5d910ac4cf934e7acda5c19f52ea32df64"): true, - common.HexToHash("0x30739c0138dd1cf862c83c80127927cf4ef61a0eff58ce629126645c0738efb8"): true, - common.HexToHash("0x073b2078288b76fff861969f0e1d77ecd4f146dab5f30865220f313ef0a6871c"): true, - common.HexToHash("0xd6dc6dec1b0800bc919d715eb39bb2ed51afdd2d5ecb4db9d61482f0c855d330"): true, - common.HexToHash("0xe3bf451ff9aaf7121d782f458c6d7216c013dd0ad42347a75a3dc491bded9bcd"): true, - common.HexToHash("0xa656d80756cf073402b7fd31a80e5b056bca740e05931e4ec057310f53955e3f"): true, - common.HexToHash("0xfd7be745cf651e4f8ce0d3dc9b12f0f215a5a71ef489da36cd310f318c2aba63"): true, - common.HexToHash("0x175bed8657a8e97123ebfcccfb6f314f70d947fc9cc0c61622d9a3b8245f591f"): true, - common.HexToHash("0xec1c77a0d793b81c01e25ff7545fe63c751afd4d78e705d0f749913c188c1f8b"): true, - common.HexToHash("0xc4bd8927d6cd5529863215333af6a93388ac3e5c18b919a12b072c294e913b12"): true, - common.HexToHash("0xf98f89c85c4ab9acb513239e7feced1f9f7abc03f0ce072808b86a1c261e5695"): true, - common.HexToHash("0x8a01dba3512834b4678d67d30ed1f60bd345289f184b847cc4b9d4a9dbbd858b"): true, - common.HexToHash("0xe7bdef843136438bfc035644702873d073985c0e905237a44859372e70be6c96"): true, - common.HexToHash("0x60ab06a8b0162fd6deb0b70cd8915e77f7c1a5e09e2a443464b6d0c8e7cf119c"): true, - common.HexToHash("0xe436ae26f4f6c5feadf3a96d31948c799589705dcf6958a02ee82241fb11367f"): true, - common.HexToHash("0xcdd18b49d00fac017e80f9d78fc7259e71e47196c35e1e7b65051a7a65224496"): true, - common.HexToHash("0x462bc6f4922a586b4cd6097b89ea34ef48253564a8ca2eaede353304aaab04a6"): true, - common.HexToHash("0x21b2e145e575ae1e13ec02b2809324c2ee78df01cecb5109447be2649e6a23d3"): true, - common.HexToHash("0x489b8c96b8de0c53b07cacb77022481b0e66efaf17d3fe8b367f9798dbf4c978"): true, - common.HexToHash("0xe19f112c4c45f53870afe9b04f5931a9fd59873b02c1a6c12ead4ab8010390d5"): true, - common.HexToHash("0x020835716a220aee6987147373946b02592508732c28252d881039087af9c17c"): true, - common.HexToHash("0x133d6af3f1156819f0ba6eb84ee0ec3d0c6371e03708f8606ea7071c6993ca45"): true, - common.HexToHash("0xe3ea2c81052cf37d7be70c4c6f383433eee2a081ef4d4647dd8a2af189c0731f"): true, - common.HexToHash("0x434a26f103e1cd7e5e8b13316fb4e08508f8cb9f0d1df5e5b78408cbbe60a406"): true, - common.HexToHash("0x30928254951e10f2841e54dbe15132377596438228bbd519364e5cc0cbf487c1"): true, - common.HexToHash("0x2e80c0597d81a50f54201d6a0de7464d5ff16a63d1b548c296923ae2a883ccbf"): true, - common.HexToHash("0x468c69aac390c23e0d602cd8e700aeeeb9e8bc76767c6c576af4186f21bab53a"): true, - common.HexToHash("0xc340d25e3e88a00747f71c717aa217e40b5bd415f524c5aa477646996f338d8a"): true, - common.HexToHash("0x2bdada3c10dac704ef7686aba5de4c4fb7386541e102da7eee06a750c10dcf1e"): true, - common.HexToHash("0xf44d15e922bdf71648a7f9ecbee3ec027c74b20d046ced2d6675ee56ed027ad6"): true, - common.HexToHash("0x091fd7584d9c16c786dbf3fd29cdbbc1bc0cddf87864c66977685acaab6f3eb3"): true, - common.HexToHash("0x18f3f65527ed99164ec0b02f24603060d00690c0ecdf2219657402d62ad418ad"): true, - common.HexToHash("0x46423f3c1d63147d8b294fdf0f1a6ecba90d33d84979044581d92eab55be4196"): true, - common.HexToHash("0xa1fd93aafbdabe0f4024b126de0be684e14c4aa517cea40fa36f59b00d073ff8"): true, - common.HexToHash("0x8e5d5f2978787cc0cff7e6e0fb303613ef7398c660e1bba10fdf7bde7a8fb03f"): true, - common.HexToHash("0x193c7c4481a754f885b9772cde8a8d1a7b7ca5ba5656c563a54d4fc1e79686ed"): true, - common.HexToHash("0x5dd4f45acb203fe7faa0cb95c08d78ef9fd41bf4a7516aa98c54fa5459a9911b"): true, - common.HexToHash("0x5aed609db6913a1d92fedcc2216acb11c69ca14bc84437d801a3e6b2e21edca7"): true, - common.HexToHash("0xf058636cfae00be33ee37919b1c0f331ef31d18952adada1d50eda6d2302c2f0"): true, - common.HexToHash("0x16c1c074a1a1063e4fab24f2c4c643a95b1d950219cca9a7c831a9c060a973d6"): true, - common.HexToHash("0xd73754f0a0b243a046c4a0fa068693333e8dbea4f7569361cc54429d205adebe"): true, - common.HexToHash("0x78e5422eaaa27cd7723b8703efa89690b9122f021ae054a44c6d78a0431438a4"): true, - common.HexToHash("0x3976f37364124d985576aeda566ae3d1fe267ec7fa28fda17fdc45ef75164b5a"): true, - common.HexToHash("0x50b4e0de3648dccd31735d2ac7bbcbe0f8608bed6db60f54c7bb28a34a71f6f1"): true, - common.HexToHash("0x46bff5244d06d3bbcfda5f2f593672d1f4949eefd2c5d06ea2192ec31dbee738"): true, - common.HexToHash("0xa971a50c26f75eb8a3ef52f7d34438379b0118764dc4ff259c5da4d68a625f8f"): true, - common.HexToHash("0xb039ee1cc8e2504028cc417b40584a88d6f41ed3a0fa24b4553d95633a8cece5"): true, - common.HexToHash("0xda604ba77bdec92aba8bf5b5f75203e749a7e81c2af7f34a5ae8a90699f58e2d"): true, - common.HexToHash("0xff3753645b1b01395d32bb336b5ec56ff278e9a5dfb0eb99777508cb1384b3c2"): true, - common.HexToHash("0xd07d8d6e6294611ce40104107bdd1997337dfec7b78ee79bd45ece84f7bec8b1"): true, - common.HexToHash("0xddf380972a10ba74a7dac3f1e44656100a0bd0d8aad0e3bf25842008068e83c6"): true, - common.HexToHash("0xa5b5bffdf774de28bf64902aa204ca5e42cf669e5dc2426f0a90fdab8b8a0f87"): true, - common.HexToHash("0xa3a8cca2cabfc381a703ac63eb683f94aabf9bb0329da537766fee3907dfae63"): true, - common.HexToHash("0x876485e4229d6328b3f5cfb11f9750c48fcb661ded3d0189d6470f0aedf37ad7"): true, - common.HexToHash("0x55c1080e0665e52ef4919af2133d50b568e267b38f3df991be89c7db4aa0fdcf"): true, - common.HexToHash("0xa064efb032d9a30001f9cf1aa04863a537624b0b61b41d17c0cc270eda58eb8f"): true, - common.HexToHash("0x817d37fe9c5b05d5e645c4f5d42dbfa0606df310e3fc8d175707d4058f68938d"): true, - common.HexToHash("0x49c73c37ebbdb0b8046049faefbf55c88c469d6c7a840dd7ac898170eff19f27"): true, - common.HexToHash("0xfb2aee1cc6ab2932aabcdafe3f138192e20452b96df2cceee722fca1e1b26350"): true, - common.HexToHash("0x67041bd5603f301fa5e5f1cb0a173858ba1ab3ff302afecb9e4e59b95d465805"): true, - common.HexToHash("0x8eb7021a7e6461ceb86d68ca33f71044c1e981b3a3dcce4e825f09ed07e8ce4c"): true, - common.HexToHash("0x2e3e10bf4b501bbf7bff59136113c237e8222988ea5493394f3c4fe9929f12bc"): true, - common.HexToHash("0xed83669a3e9ab362ddb0f555c34345dd1ede01003a51b588b62547119ac00bc5"): true, - common.HexToHash("0x5fd806c26b94bc3fe4d2ac20dbaeebed9d64a1f6811973f35bb43812fd6a5903"): true, - common.HexToHash("0xfae81102f6da4cd87b48043a3ede9e2aded9d26c0fcd121d2f217472c11d25b9"): true, - common.HexToHash("0x162e2b3164c546356f5b7a004a59af57e69ccef3325c12e21ec6a124afa888ea"): true, - common.HexToHash("0x64eecbc5a8404a59468140f0315480ed5734f454f5b31d2a7bccb9a2ba461acd"): true, - common.HexToHash("0x1aae6a021f7c2f5a6b771c1f9f0f8d1eeb893490784ce0c19110d48208a18052"): true, - common.HexToHash("0xa6e47128c81946d1759651aceb2226954ec1f7961e20d73ae2d71aa54b96f44a"): true, - common.HexToHash("0x767e5a0fe4d6223d5eb70912474027228320bf022271f9dc5656b97c24daf558"): true, - common.HexToHash("0x8004b23033cddf7254e1fa9a8d153a2378e4d5b46bade9ab8795e8b84b804fef"): true, - common.HexToHash("0x37f3fec6083f6d3bfce2dc27c38df57386580552bb5e53f6ddd2dc115be56f48"): true, - common.HexToHash("0x0a658d63b39f0d12b86a7cf3faf211143eab8812bc9489431ef7f093904da0c7"): true, - common.HexToHash("0xa2bd889872426c3f3fe0c639dbf12354b46aecabbafc3cb39574da7b0c02f61b"): true, - common.HexToHash("0x5d3f4ddc66acb9d6bf428c967933de7e3daebb36059b45a1070ad87ade5f6731"): true, - common.HexToHash("0x176af05900fedfde1efda4cf9595ba8898cc2a0dc361a3a97d01256dc4e97a75"): true, - common.HexToHash("0xe824f2cfc208a19f875a59e14f335513e466649ef70318e83f0466b2d39541f5"): true, - common.HexToHash("0x577745c5b6f000f9abaa59f415bca3f27f01f99186e3316721319c5c8c7693fd"): true, - common.HexToHash("0x1774b72b524a45265c05e1f3c33fee692eabc2e6b3dc11049dbfc2eabd1ead3e"): true, - common.HexToHash("0x035bee9e3d323fb74503ec8b136e071dc06cd1cbb2e11513b195de629a3a882d"): true, - common.HexToHash("0x993a3a5a457bbe548e0b3bc33c0b492ca2f7dd354c3a6180fff8fd599b6aa3e9"): true, - common.HexToHash("0x87e5a0664a7d486b55af7776b6f4ff06d160101a0085b47055f5c80cd4f09980"): true, - common.HexToHash("0xb954e45071acb2a82fa11dd49c206d23d78dc035b2dc222a59d308e55a9da497"): true, - common.HexToHash("0x5a2c46b6ed1c2281b2f85d8915c1696045990008c5b6415107365958803a87ca"): true, - common.HexToHash("0xb2cc23ed6a8c911c0bb18648988fbe0e8fe1a38f48ff5a99579582b537e85b2e"): true, - common.HexToHash("0xe00caa3ed9d9b5e979a10b0cd6268dc7b1bc8c7c75a9a4abe614b1e6b704df39"): true, - common.HexToHash("0xfa5037bdfbd3de91c1dbd141b4a70a15b8927e11e73e10b42be8b1f1283ede27"): true, - common.HexToHash("0x086341677f8cdc5afe261243d6edf9368b1d8f48ded7fc19a84772ca30bc5e3f"): true, - common.HexToHash("0x98be7dcce811f89f6a26cac68eb522416b1f6e5c7358c3f625a02205f8d23d5a"): true, - common.HexToHash("0xbfd5ddd70c20580588df19c4dcca3ad26264d600c4be555b22463d8e89927477"): true, - common.HexToHash("0x7d5087f53b947efd5409f8c9acbf15625ebd027d363281ac8ffbab5e2259c81c"): true, - common.HexToHash("0x6ef189789a2049ae7a1972c3bdafc16c938a523d221c8c970d0ec7143ea4ce45"): true, - common.HexToHash("0xd48542a90399198e6295c7697672bbc535f763e718de6ce43ba940f61d2cae86"): true, - common.HexToHash("0xfdb7666e7d063587d035598a5fd86978bb1067751c956c402866901c5cee1333"): true, - common.HexToHash("0x0178a8241c0e2e9a99f2cfef0c57d332fbacbd7149ea6579ea4c1b883cacd403"): true, - common.HexToHash("0xc417325f5d7d675832eb9b52bbef995e3484434fefa738c6cddac0a9c75efc80"): true, - common.HexToHash("0x3663e1497179e035d3446a04c5f12ae321c0be9c4583cebc2f9b3d306495eb0e"): true, - common.HexToHash("0x43dd079e941f30dfef41adac5d0eabcbb40c1088c2cc74a7e6f18a22085775d5"): true, - common.HexToHash("0x79873d6bd1cd3f6062f414aa4e3dd0c6b76763f0736ee7f77f84a643ab399d25"): true, - common.HexToHash("0x24047ddcb6b885623d7ce92ffe93566101620086650bcbac4e025967ee1ea8f2"): true, - common.HexToHash("0x9129026100318fa78d1a03c5f2c2abe598e4baef3f4c6959124962914f263fd0"): true, - common.HexToHash("0x7e64e8e4c85c0fdc8f765b28ad527b4daeb23348e3a38c7669acf5871276e03b"): true, - common.HexToHash("0x11f71f6213ff1a51157441e9bf2d259df7ad7032850c890cb4503bd845889032"): true, - common.HexToHash("0x458316af381e4e3e76419ae6d1664138103de7c98c02b266345452c204d3e2b5"): true, - common.HexToHash("0xa4379521d31427a343706e76b6da4322852e3a208d6285931eb72ebb5e82e1d2"): true, - common.HexToHash("0x7975a997728ac0f1727852bf71f060b3f8f4113694c48bbbf4dbfd7b741a3a01"): true, - common.HexToHash("0x065c62f885bae226f7a01338c553b90f87244cc84447718e676cb65e6ba9d868"): true, - common.HexToHash("0xc0825c9b7f509e7888da866afe95cf79752fb05878ef5e5c9ca0f6c2790c4e7c"): true, - common.HexToHash("0x9d48f36534123022f9c04b6a793b400b11077b943f51651528f2381df7359ca0"): true, - common.HexToHash("0x4bf013e0d999a6635c1d1af9ed253c3b5e66205d59df275018a9052e35f559d8"): true, - common.HexToHash("0xa11c9fa2b45b3b794bdc523582cc36408e80a9e993dbf05a1b5383dfd54d0dd4"): true, - common.HexToHash("0x3f035f74bf11415438c3bfd8b8fb8b9341522e345d7d21f3c9ff0a87ad6ee63b"): true, - common.HexToHash("0x0663414d548a8df3985c456e865ed9a72c1c1e88c9e494416a4ef8aabfc71084"): true, - common.HexToHash("0x615be065ac9f566f7706ce7917b6bb8f7b103e0f008598ed4f2a0c15002c5357"): true, - common.HexToHash("0x5248b5cfdc186d742892385b0c65941822de6f8cbe546c41b9e981e5b83970f2"): true, - common.HexToHash("0x536a9ddf7fab760d4b3233ecf8adb729667196e5681d938c104e863abbcc7027"): true, - common.HexToHash("0x7bf4d980bcc988eab4bc6d201108cc9f21568f8308064e5bcb1a6cd9f289a1d0"): true, - common.HexToHash("0x7aa84dfcee70eb1caeec4782088dc672bf4dcc60383b0f799e05a28189621130"): true, - common.HexToHash("0x6ad5dee078f4796ac4bf90e100fcd964fe81059b1a6d7e326dab96604558e381"): true, - common.HexToHash("0xe00fbeeb765fe94af62e11c11a527210d180217624ebb50de7da75ac1873018d"): true, - common.HexToHash("0x039a00e2e5f16001ddfa283c14c263870431dadea8cccc8e0d31aa4593fe8f7e"): true, - common.HexToHash("0x569a838302a56ca194e55b6d60b349f4a932f7884c979dfdeefae86aac124721"): true, - common.HexToHash("0x65debd3124fed8b9f026a97ddbf89e4364f076cbfe3b3fd4ba1af7275a5f33fc"): true, - common.HexToHash("0x4d7fb691ec8dcf7e57ac8b759a6ff725526ea9ecefdd35841d7a972be637dbd4"): true, - common.HexToHash("0x5eedbee549781aa97447a52ac6143e69f5ae90047d8c801a0ecee8f95360856a"): true, - common.HexToHash("0x5a40bc47b0384762690c36b59a131a41f3a1cdbd1763462b6bb1c677689504aa"): true, - common.HexToHash("0x544ecd0fb4b05d39310c085f33e203c29f9daf34c719e60d6b2b79fbb6e79f7d"): true, - common.HexToHash("0x2cfa018170316b9221b352115452ea219fe34f209ed417012aca1525159015b3"): true, - common.HexToHash("0x386e7c8b8e6d493f7bd57cca5a80e6ff6f45f1c97144299ec29c8887715cd556"): true, - common.HexToHash("0x8379aeafa686cc29f0b47a52af1387b973334facc393689d84d630ad54edcc14"): true, - common.HexToHash("0x898bfd93e0ce54d237c0b0d20e162fabd95e6d42135b653fa2d9b4ee5b08b630"): true, - common.HexToHash("0x12d0ef99efa0c91ad63d4950c4830d380871f0a35b947dfd7ea47ea28b3ef305"): true, - common.HexToHash("0x80d2b717ebcb2dd0ea48466bfbf0bae447f12b854ffb142b37e7ee6541dbb988"): true, - common.HexToHash("0xa7fe01ca65d781f58b32384bb350a47e0a96f9f53d0012ccea13a5b420ef20b3"): true, - common.HexToHash("0x7463da264f777d02e6b99a39873fe235aa730eda14f65cac0345db3e412a910e"): true, - common.HexToHash("0xb70161efe0e7ae4c14a119a9b5180e6c43c001e9c80e8d6836dc44d5d899364d"): true, - common.HexToHash("0xfb0511c975e24c7ab982157fc9795ca69c738b0900c7350123c05c358fcf8102"): true, - common.HexToHash("0xdaaaa1dde4afcacbd234cf4db90425ec1473f505a5c8d229fb75eb1ac4769038"): true, - common.HexToHash("0xbaca0351de443b0c7d034ddecdbe245bf86d1dc1973cbab7d5146eaa4361e07d"): true, - common.HexToHash("0x177b6bd64419bf70a4c5bc4f553d27b203c50d2d47ddf9b4cd25f12f066e18e9"): true, - common.HexToHash("0xd0469479894677d8470f9fc404449118742d242d26004597609dddd8f3103a8b"): true, - common.HexToHash("0xf465b95a1298b1c6c1f1554b8abdca33af0ba688cb16c45cdce79aaef61d0f3f"): true, - common.HexToHash("0xbf5d01a4c955d74b0fcdf200510441d468afce4b63e61ee029e9a741c959c126"): true, - common.HexToHash("0x00d2e7705dbb5a833995ddd291428a01197569d7caabbee047f83ce0dfd2c2cc"): true, - common.HexToHash("0x007103241838eb0ba1d6a12f86e015ae3897f10ddc63493f701a9fa8b27c096f"): true, - common.HexToHash("0xb275908bdc5655c501b598573cde852aba0810cc19f9d81cca02f30a82eb9dfc"): true, - common.HexToHash("0xe54ec9641d3f9e24ca8f9d0341da504a28dd87c63e5cde38f80a96e1c76fce84"): true, - common.HexToHash("0x957b623f8675db99a56e6c9c812e1a78fc1ffc63c99c2c345effd8175ac8ee70"): true, - common.HexToHash("0xb3e2bc50d128f71e200f1f28df414ebc6a0857c5eb3b09d910ff2a07cff57b47"): true, - common.HexToHash("0x512250cde8e57acaf8ed1279e4dc8062ccb4ad426f4f8a7ebcf553cd98c082ea"): true, - common.HexToHash("0x0d5033d901caae32af386a07e8ed5f5e947f182329f9d4f668fa999e9bb3ff28"): true, - common.HexToHash("0x1b52b5eab7b8708e85f8a5200970b09a8faf54622d32aa424341895572815a51"): true, - common.HexToHash("0x270f1f560082ae1a7eb2cdadcb0765be268b7ccebdeefe80e65bf2b0233a0d63"): true, - common.HexToHash("0x26be10513dda84e4f97a9a1097fa5c739a527d6e822880310da48480b9a4b2d3"): true, - common.HexToHash("0xcc668d5a8fc7adaa99d60deee01c342d5130c709202c8a2e1df55a6fb3015c2e"): true, - common.HexToHash("0xb19ff73c8c4f2e6ab05dfcad0253c6a36b6a61533c013dfa5665d8ad00c6ce70"): true, - common.HexToHash("0x7189d3bb49ffb0cbdcd3c7d06c8d1b772e024b3a1ccdcfc5a3bb851c3155fbb5"): true, - common.HexToHash("0x908556120b21a878854e390b6495133c2f13b3de60896ca7d6a48dc9038f053b"): true, - common.HexToHash("0x85f67b270cb60cef812359e7280bbc5c41588d26bcdb70d1ab25da89bd454cb3"): true, - common.HexToHash("0x585a840e21cf894880debee8d35d274d325e123e2f9ee7036e111a0085bafca2"): true, - common.HexToHash("0x3d13fcee31bd266ca21a23366b0407cc59f0726790beafbea677f4398f3daf05"): true, - common.HexToHash("0xf4d27837fbec9b455a4ad4e9e5bb0a467b80c4eedee0483e10e001dc7c759e46"): true, - common.HexToHash("0xe2855192bd0656f92e5052b87960eebc0e5592437a2a80e837de1071873bc8dd"): true, - common.HexToHash("0x6c102e6d8a636267569fd4460bd9e7d106610b6de56b22a5c498564afe6b0514"): true, - common.HexToHash("0x3691ab0b9ff0412bd63d93229ff86f03cef9c7aca560d473d6899baa58be3d75"): true, - common.HexToHash("0x15d5e49abb53e07b4b040b9f4665908d32036fe8b2e19ebef9d768f5cbb14f54"): true, - common.HexToHash("0x95f2d896615504a27364bc026e2c0a59ae2081f389c651d35c9c61bf6d459170"): true, - common.HexToHash("0x4f42ad24e48c4e0d5a4ad2c25347530331114a253e342f938fb2c11ca3c242d9"): true, - common.HexToHash("0x37a11a800649fa61a751167c4f783019c46e388d99402e6c1626672b959771ce"): true, - common.HexToHash("0x8f5a704c7f0d5ec3d98e63c506ea6ce9375a48aac0493aeaeadec7a1c1fc2527"): true, - common.HexToHash("0x6b560a6cd6abdd9c46904d51aa82ddf58e3c39b55ac7da817220082ee3943488"): true, - common.HexToHash("0x69c4734878d416fa3d5b36570425ee05bdbab545fcfefcf164c0e5f74a146911"): true, - common.HexToHash("0xe43d384e0121645cfc8609cf31d9ce12dcb0647a33aa81c0c6f828a2dcab4317"): true, - common.HexToHash("0x0de7b76ec069d2e3285e734b5c9b9b3658ae00d131f1e6b069201ef073bfc101"): true, - common.HexToHash("0xccbf226248e733d258c1d9f9ce930365bee04feb60e71923595881fef0806c1f"): true, - common.HexToHash("0xa1333d67c8930cc2bd53663e865e74dcf913b6196e8df6d4415c1fe934cfb6b5"): true, - common.HexToHash("0x3e9938c49aa4dafb3d118e6e42c561b1d532640464136ee20da148c332e794d9"): true, - common.HexToHash("0xa6bc45161b69dbff9818d8297754071dcc60be19ba2b88de64a122956ea865cf"): true, - common.HexToHash("0x1cb117f8c91c92a53b46dad26250ffe23335fc02e2fbccba8f22e912d556030a"): true, - common.HexToHash("0xf170888fde9368adc39903eb25b61f912b3742dfcb5476d97d479901bcd1332b"): true, - common.HexToHash("0x18856cfbc7dfae939341c576d835aae66475a94e42134aeca37d4639216b8fb1"): true, - common.HexToHash("0xa03f3cdcc35ae06b58bdb48d7d4b67dd53770d4bb6f121a77a5bc381330813c0"): true, - common.HexToHash("0x8f37eef323ebfb7d655c29266ef8549a4872946b5cef97dec4366ac615bad71a"): true, - common.HexToHash("0x99cff7890cc9a0cef60b9c7d3fb4b4c1008a596b1b647dbf918c05dd6050ee13"): true, - common.HexToHash("0x93ce840b2c6e8ad34da7767dec8ea4b34842f682b4e6de79e250402ff8ee140e"): true, - common.HexToHash("0x78dcc206683dd14bcf83dfab96afe3815c03a8cc55534b74c0a5f9b7c8aa7523"): true, - common.HexToHash("0x45f5c5f5786807f806d6e5b80a3d7b7b23d0030025f829d1172ed8ee5be0de46"): true, - common.HexToHash("0xe571623cdc2fce74718f9badb5a80e86e21c26bbca4f659944589f4bf0ef1036"): true, - common.HexToHash("0xf8107903ff65d5cdc61e86aa700afa565c1cb8bf0b0f3d5800fbed4624223c81"): true, - common.HexToHash("0x37cab687b8e59c3e4917e526c49d1f07e79bfca00816718e3759074987825f6f"): true, - common.HexToHash("0x82a6be8ab16c411c43519d5ab1d657c976af0fc278d8a2f271247fb46b5807c6"): true, - common.HexToHash("0x1514acbf43b2bd3530b67984c1cbccc5944899c5c6e22be01dd7127e2c89b8aa"): true, - common.HexToHash("0xee7f416b5c4fae5fdb01cbfe34770bd4c6f1cf140d5566d3be993922fd27eb6c"): true, - common.HexToHash("0xcf8efcabdc5ef95f9bba28bdf20cfa1d4e72085256ffaa9e24330706299211ae"): true, - common.HexToHash("0x349a47ae2ef1cb356dbe73dff0895ceac9f1f4ec54c29c3424f4d7725ff5299a"): true, - common.HexToHash("0x2b119f52ed033290c995323ed76427c43c7dcddadf55e7f8772bb91c24ecb0f6"): true, - common.HexToHash("0x64a1eaa56099de17a99ef3b35f5971ed07a0363c669040d4f7515ccdc9137a10"): true, - common.HexToHash("0x45ca20b2e87f34b27e75011d3fe4ce8c10c419b08f7b8d4b0566fb68256a6e2a"): true, - common.HexToHash("0x4321c7a98fa3476221497445581f4c00491fe124d0fe416cf668f7c1d827a8f2"): true, - common.HexToHash("0x664b218ad6eb1c39bd5608bfd0a3a0a6adfde682adda21a18fe730ea89d35c07"): true, - common.HexToHash("0x65e229cab15f449e73df52e09fad5789499f97fffbb26583e9b0bb0d64166c8c"): true, - common.HexToHash("0xcc63d2429d7f7c1aeb703f82447f786c8d8f4f4636e749cb07e39fc53ff19743"): true, - common.HexToHash("0x1a0c098a792793baf8add45e4abb84f6284306f21fa38a8fc3e07ec73c1d7481"): true, - common.HexToHash("0x21778f6f8fb86e4a2720113f1da618a3174c397b8fec05f1f0c12dae6b14b81d"): true, - common.HexToHash("0x6a368d67eb95f457776b66e2018e29ebb99ca938b4a9db288fa9af02c9b610f6"): true, - common.HexToHash("0x98ee0cc7a19cf3e9f83ad4d595fc1279e79ad0a65e153f682e9360aaae663a51"): true, - common.HexToHash("0xa060a2c1d72598074a6afaaea37f8bbf096485f7d8da47cca1bffee8e75b0112"): true, - common.HexToHash("0xab9a1c6bc3223aec9defcfe9c23fc20d7a2a2be55944903b87ebb934ef524e66"): true, - common.HexToHash("0x4064d1943675b36cb40b6665a3895ff94e9b3c1afd7a2ece29a2ddd9cb3bb97e"): true, - common.HexToHash("0x7681fbe61f9e9c600ad92c128325fb925d0dcb815c2d5b188de1d83fb6539193"): true, - common.HexToHash("0x7c3f9a5e196bfa72edc154b817ded6822fa0b77e1aacfdece8c09ef2dbed9c9f"): true, - common.HexToHash("0x69eb811daf044ac2175d9b90d6ef2a5fc4f39d4396ab814fff450a3928ad336c"): true, - common.HexToHash("0x73cad4f945d9c4ff9a409e23ebfc6617b2697ecc5cafb0fe5451659a6fd7f1c2"): true, - common.HexToHash("0x7c365244ae8aa5f4e63a4cd7935e833b88de7c93336b296511c4e99cb9a0403b"): true, - common.HexToHash("0xca584a54d88900add7093edba8aa5ab9b4308e0f5d0c39e5c524912b500f73d8"): true, - common.HexToHash("0xd023908e904102c3de7e8614ef20f64d601b83b185f25da80ba0106d9904a42b"): true, - common.HexToHash("0xdc0243048b0e81d25d04d4b360f6350d7faff48563af8b2e7f051bdcda3ff0c2"): true, - common.HexToHash("0x106df18ccdcf8fcda56de6525ef2c3d0255eb55500079931cc9dfb270b002f95"): true, - common.HexToHash("0x3422fe1995c181a83847cd4ee35f433fbf714a245d6f78f8f6576a62011e6cdf"): true, - common.HexToHash("0xd4d9d810f31b58df3da2dd599d355a79fb1a2204ac218aab9ee4ae5ed5017bf6"): true, - common.HexToHash("0xb53355987e6b01651e656fcdfdf32aede6e7fb1245d243abe1430ea247115e2d"): true, - common.HexToHash("0xf785b637b32be35a279980b9ba569e87809746367759c63c69bcc900a64f1e85"): true, - common.HexToHash("0x5bd1bf44e93ee2051fe2e751c5cd165d1176584308f5906ca28c7cf010b8c05d"): true, - common.HexToHash("0x1a2ddcd8e732f46980ff1907ec637f393059d27b5ccddd6b0c07b8341e297c5e"): true, - common.HexToHash("0x180ca038df73360a8c0c92ee051d2e65e45957b59abdd0f31abf51ef94487dc6"): true, - common.HexToHash("0xb995596826a3ea61cdfeeb2d856f3834eabc1783afd7f1ae8081cf46916b1868"): true, - common.HexToHash("0xa7d927d8b68ccd30686be605fc310f42f5329ca2d2471f68ca86033eb8cbc0d7"): true, - common.HexToHash("0x75a16e06a9fa0e781011d295bab3c2055d1975141be323ddf7adeea0b051c1e6"): true, - common.HexToHash("0xa6e2c97aec738106f16a712f51078fd88f6705bfa1495e49b659fc6f88a74eef"): true, - common.HexToHash("0x3728dcb752bc9b12ef2d71141a5e71084c3d831499e5c2594b08f7b0d1b93053"): true, - common.HexToHash("0x2041408b3f98106f8261aad5b44a3eb874ab3885af732f5ec40a9cc51eb19161"): true, - common.HexToHash("0x396d9c55eae5686665c8f6291f62f37188187caaeed6b5f6882894af8f16822f"): true, - common.HexToHash("0xdfc663a2f1d605da8e592663fa71ed9e43b4a6bf823f6d2ae80473474533103d"): true, - common.HexToHash("0xccf5bec8212f9414488a8bad3a0600da21b47faf372ff7af6ba3dcdb399be84c"): true, - common.HexToHash("0x6316b28d7f586c05d517a6634d6df508d55ae44d2691a5dbeb7805e74548f4a8"): true, - common.HexToHash("0x65128f0981e030d35dcc998eacaa9e05b369074d953d5f30b3512c2f4ce74d3a"): true, - common.HexToHash("0x3d5618749a9cc28484ffd594000b583e74f6908caf8e0f6494880e34d9e19d07"): true, - common.HexToHash("0x20d30d8ea7558f5c890fb1ddc9522c066a474158f82d968e1449d779fb0e4dd1"): true, - common.HexToHash("0xbc301cd260bd468c6ca1498a682a9121357ece9cc353a6527af376774a7f33d6"): true, - common.HexToHash("0xc2fe8e1417882cd7b5935e1ee0c3c15192a0fcf4cfa9556a7734f4f2634821a7"): true, - common.HexToHash("0x6bca6f5f2acf5c00fde7ac7237d5a481e026eb94dd3b0d3e0c4ed808d55a0c6c"): true, - common.HexToHash("0xa7bc40082d98142626565dd077f2d63e6da5e9cf1dba0c66213b5dda87a7a28d"): true, - common.HexToHash("0x820745f2f93c8ea18b97ab0a1cf318de35f636672066b1644dc4a92fe4bf5d30"): true, - common.HexToHash("0xd96ea4e8eb988c7fcbc7b19aa889ebb83ce363b227fda6aa4ae934a038512a30"): true, - common.HexToHash("0x98670769c37b91d16815bc9f10ed73e167921ccd05180bc64955fa856c6f1578"): true, - common.HexToHash("0x9f261063ad865d2b23a31f9837ac8ae85122546638d13ed1e5ba4e820b5b9a8d"): true, - common.HexToHash("0x731b771e3fcbcdceea31ddbf5a993131ad8b5ea32496e8e5ae23570ee42f2917"): true, - common.HexToHash("0x4522d6e360d138bdc2bb2cdfa96977a16b2d893393c8b92bda8ea72b8d24d8a6"): true, - common.HexToHash("0xe0fad8903b534b88f3374de327d057340fe2eb0e3b7c63f77660e8f99f099357"): true, - common.HexToHash("0x5b4766c68dc94eec83e16a39c577bea364d6fe9ddb5baeecbbe6eb30f76ef697"): true, - common.HexToHash("0x5856c8936b016ff20b68ee37ca5ae29c282a73bb783c63c308847e4248291e54"): true, - common.HexToHash("0x63e64979d9bafde246701fc47d0ecb53288f6b80f1e8fd8036a3cbfd5cbaca1f"): true, - common.HexToHash("0x7c697ec896b960d0c54b2fbf8abad8fcaa94070e4b6898703622d3f7543b0bc7"): true, - common.HexToHash("0xca29b2fe1915e9826dde675fc87705133c3141f6b733fd78f93e7678f1d7326c"): true, - common.HexToHash("0xf1ef683ebdde47ed71af89f380447f66890551574a0177344c12b6b0b1998336"): true, - common.HexToHash("0x64df756d95da9281dd3fb28f015e5d1b09fee73d242872b7a0cb2b95c53e5e8d"): true, - common.HexToHash("0xf50537fac2d04baf21b794e530f73a9efc7babaa80af8e583177344427532a92"): true, - common.HexToHash("0xcbca2dcbbb0ce425a7130d25c830d72f8e21a0042a2828b2f4ec191dd8d97bac"): true, - common.HexToHash("0x39b86dae8045adf30168d21be8df3a9d4b2f6bafb9475a7c3451f511d501a63d"): true, - common.HexToHash("0x2d1ea45234e1e858cfafd6670f83da6649b868f9f9fc457c5ad9358324e79998"): true, - common.HexToHash("0xe1667067aed2cd18642037f77d9de506dc9bb5d0b446e5cf915aca77576c72a6"): true, - common.HexToHash("0xd4d7ad0f542de3bef080477385f0271e89b544b4ff9207c0a50bae4a9684f88b"): true, - common.HexToHash("0x70d7006340c6b61aed735dffb81d7ff68cfc4a6b926ceb6127c06a5faf14c9f5"): true, - common.HexToHash("0xa518bdeea9762d50b1bc6cc82b0ebbbcb2cf3480bac26348e153a6e5f904416e"): true, - common.HexToHash("0xc0145eeb581fc1f1369c33f9b9dde1c17209a4c7a0e10b4161d00e995ba4bd91"): true, - common.HexToHash("0x2c51bdb25d8f0ec3312df90d230c34749edf89c9f534acb6c7a0015edd0efc21"): true, - common.HexToHash("0x7264181e3787705f1614d1049849c00bbbac8582227d680b29d439e41b46abda"): true, - common.HexToHash("0x7108249b9143bb9509ee11c301f443af099ce98b243fcbf5dd6ee3880b0392c0"): true, - common.HexToHash("0x9f7de3757166a418f8e8929faa5919075f2d32432707c7681122427d627f1910"): true, - common.HexToHash("0xd8fb24a8a9b12bbfa8bf19149f50c3a304855fac4f3bfc3881617c58a8660f6e"): true, - common.HexToHash("0x625e55d69a846322720e7afcd37161af02156c89cba3b45ad6ea4f97bc391c19"): true, - common.HexToHash("0x7f3353cfe81e41de45fa452b35d9f0007d2dc1d3fe5516df5befb43c1d266bdd"): true, - common.HexToHash("0xfdbecbe1ac89c671ea671aff764320cdf068b669a15b5c0b954bc44ddc2e750b"): true, - common.HexToHash("0xa76c396a7478cda6475a55a2fc95deedb6e35046259724599bfae7c1febfc882"): true, - common.HexToHash("0x0a7eb1ba0b37ac8af144e91a48cc65a3b6c5a73b49bb3face9a9fde2bc890600"): true, - common.HexToHash("0x395d1e65a25211816cdd6b34e25d6ad8b15ee490462e3b55afd42f507b2eed16"): true, - common.HexToHash("0x72628e17a79ffdb169012332d5105def79406ddb9e0ee8e46617099498efe183"): true, - common.HexToHash("0x21ffd071b304756d2b367232a7c946cee246e0c2d432be061def6bc23138eb98"): true, - common.HexToHash("0xa7ac84fb9165e8a1a3b9f7f8b0725af1e1ddbb3faf614daaf1996135d3a8495c"): true, - common.HexToHash("0xce9e9ac98fb851ae582caf49e23752cf04bae77c96b47a5eb76db7cda23c81b8"): true, - common.HexToHash("0x8a2aa5d413b6915440f0654a7dcc14a5b433340d67ec2dce8fe41a510e34a6ca"): true, - common.HexToHash("0xd35eb9125b689737b769ee5b2d00e54bc1ded7385a563631a3e4f29f5162b362"): true, - common.HexToHash("0x259b58aafcbd179605fb12de63401e13eb5c8605b6cde66098f09871f337f223"): true, - common.HexToHash("0xf3e32f669c0e5114bb8c4f2235fe6ac7469702b44ccc7654d480c1aceb499421"): true, - common.HexToHash("0x380e3461bcc89d072ebe672e406d2acf937332482896b5fbd4ce12a803d1e1c4"): true, - common.HexToHash("0x40488588c148075b60d1628848bb03da96eeafdb2e156bc06a6caa7619905c83"): true, - common.HexToHash("0xf050e125a30f3c89e5563e522bd592bc97265105fead4617abefa232db576f8a"): true, - common.HexToHash("0xac126441ece73216e0a62a0c9457e524886eace7bfc26043ec3989ecee59435d"): true, - common.HexToHash("0x0088d819e27d6d77475a1f8744ea34b01605ee40df09ce1a81088e706ebbdbcb"): true, - common.HexToHash("0x2c1722521e2dbf8cd13d5efb1979efb87be0a8ecda59abef64dd27e5e3a281ed"): true, - common.HexToHash("0x724b4178945c48163b466de276bdf72871864fac10b85b20eca98001d9f308f0"): true, - common.HexToHash("0xd42ec32e0c9a45d0eb39ad44eafd9ec6f703d5ea3c3aafcc681aa8fc79c74f13"): true, - common.HexToHash("0x82c74d5b47b2c96263b9861539583f9f1073c86b97ac18da4745b3c90d588a27"): true, - common.HexToHash("0xf6b30e78506e7a7730968c2c845d0c72f188ba9b956ea5e9ad8875d0c6dbbdd5"): true, - common.HexToHash("0xddcdb24d23eb2e1f8624ad0c03c11c91b2a9f61d420b95375b3a85a6b046d414"): true, - common.HexToHash("0xc890e736eac516853d3a17bb153f5fce7df6405d8863ee7b8ea7809a20d422b3"): true, - common.HexToHash("0x65a61b4de9a3b755530c57028670fd9fb3aa4404215745add7080b13feafcc1a"): true, - common.HexToHash("0x86b4a3df89561f530f6db9f8f8b3e76476b4216981dde0906162418c0abc9008"): true, - common.HexToHash("0x131d8be33dee3dc8c9029b9025ca3235342d24542b4a3b9b0ccf0653cca8545d"): true, - common.HexToHash("0x76b00be6d8366e5f288ecef35872751f3aa59756aaabb6869bd223efd9b05897"): true, - common.HexToHash("0x247ff8b5a4adab7c7a9b728f0c15fcee5c2d3b722edcf46efc3c649c679c1e9f"): true, - common.HexToHash("0xfc6213395bab6afd2208a276daf633db0406616717cfd65c9ceae790c00b7f52"): true, - common.HexToHash("0x638c826ef6c19f4a66ee76e3da297459b6a0dfaceab64432d030c02c4fd806fc"): true, - common.HexToHash("0x33cd9affa1fc36ad69ad631a36b7c77bd2251367c04c4d24335bbbbd368ceea1"): true, - common.HexToHash("0xb0c80bbf48cc4242949beaf22b6d71200c9f7dede847f33e1deab8be700be412"): true, - common.HexToHash("0xa2476cc89ce036af0c24a2a847d1d3b203ec47b7d3fe9891f684d4dde1d227fa"): true, - common.HexToHash("0x872ada01d7fe0c183dcd4dadc35480e6bff6f3c3da072f41f95846bc852a4e9a"): true, - common.HexToHash("0x11fa257cc3d9cad312ec33efaf81e87b34d9e95c2197255284290c4a90e632cf"): true, - common.HexToHash("0xeceb21b9e0d8c9832afdb1fbda16f2d6e4c800aca354ece73ddb951715b42753"): true, - common.HexToHash("0x2ba9736b3433865bf056af1f5a93c069366cc0f68fbedd9fa5813acce1dddfb0"): true, - common.HexToHash("0x6aedc5d60eaa4d309d555a2d05293e8f3cb21ceadb9a1dbd98c20629e12369ed"): true, - common.HexToHash("0xb8558c822dc87091e046629ff3ac08438547ebbeb57c38df2cafc54cc9892aa2"): true, - common.HexToHash("0x95df447709b62f0d95e8816e8ae189234480608f43dd3e7f6de47994a9f8d92b"): true, - common.HexToHash("0xc3444a751f3df2c4542bb5b81031ceadf7ade1629839ef9d158942710a51670d"): true, - common.HexToHash("0x8f49ddebfb1b621d4ed8d00b9f3b4f859080e2b5e7c5e6ee5b1d9cb986a01215"): true, - common.HexToHash("0x27be7fe4dd018f12b247bd8c8074f84ebd7c1b0217e1fd63d76fc84b25ebe4a9"): true, - common.HexToHash("0x3e309cabaaa116c3dabadb5e0a866fc101fa471ccb0eba6cf6b32697a1d6a3dd"): true, - common.HexToHash("0x6ebfc26912ae1e19a8b0aa6fcf1e3324096a98bd1321ae52549d908f1d644e9d"): true, - common.HexToHash("0x81dd7a93f053c1a78fbbb8062370aa20c1ac9be319e4992c9a64809ee91cb68d"): true, - common.HexToHash("0xcd80e4dd4ae974ed3e0a010a53c62702d54613ea9493c22233682c8d2222e043"): true, - common.HexToHash("0x36dae9a361823e6a30723cc969fb216e8ae23d48326e2989b864acf2bc3e376f"): true, - common.HexToHash("0x1890dd7091534191ffc8a65fde62d820022041522aec35ec566f77ece2b4f2b1"): true, - common.HexToHash("0x352df026f1643784ff12be8782f47fe54a1512e234dff3e8eafcc70279aec521"): true, - common.HexToHash("0x376bbc5fffabf36ac71e31e309c265f77873a62d704d5ddfb1de1f872fc98aee"): true, - common.HexToHash("0xc30e0ba0b6f7542fbab44ca59bc6c59a8329a5c3a3091f0bda065e53abfbb2fc"): true, - common.HexToHash("0xb6cfd610a9e4fb5eed50c8af27d53d2ef4f7c266111c5d9e8dc96445235d4d3c"): true, - common.HexToHash("0x4df230e0df961ad9f910af982966bd1ce22bee8db3ba4b5b59a255411459903a"): true, - common.HexToHash("0xb588098105fb3c08982a9df100f8783b3f9c966c3258fc34346186ace6c76382"): true, - common.HexToHash("0x0321a10494b710264c36659ba20ccae33b789e2853ccbd9d702998fc07f415a2"): true, - common.HexToHash("0xddae4187523e11858e96afa94f57cc9d799dde3dc98a4d29a29b40bf813829f4"): true, - common.HexToHash("0x3b928f33f4ec64914a0293a38bca81db501d7aae2f7968f12e084bbbcf941c4d"): true, - common.HexToHash("0x9b05b29740cd8b5febc24f39b7863f33ae18a4bd3a494b41cefa9bef9fc47fb5"): true, - common.HexToHash("0x0bfa773920ae3d57d9a751c3700e185b936d5055c9ed55d1027261eb93656f51"): true, - common.HexToHash("0xcbe9a8e37915f94002db5e039ce3c9604bb9e087bf05d94e8299d8ec07647ba8"): true, - common.HexToHash("0xbfcc37bbf3102c316b5b2dbff5be4cc3856245560bf0f43ce31f9097e7eb58b8"): true, - common.HexToHash("0xbfc126a136eadfd49c0c09c2fd2905953826fdb23141e786feae1753ae0aa910"): true, - common.HexToHash("0x507ae13073e00f5a7ff6ec4663c1838b2c47f14a31f3654b6eaae86ddd474479"): true, - common.HexToHash("0x72415ccc3a1ee0850443b216e045bbaac56a4d6f12130e2f2d3559bbd4d1079f"): true, - common.HexToHash("0x6f28c86b6175343e6a12da1b250d14000ca619f151a5658895c3e6ce1de5aa00"): true, - common.HexToHash("0x465999e6d7a8e26c383fe62b490e583ea8d361f7761452024222cf9429c72239"): true, - common.HexToHash("0xd061f9f1a43fc24875452b8706d7df6acd2533dc43612bc3e0b1c9be79f44bbe"): true, - common.HexToHash("0xb08275cc47d313ee192d1dc00c2f3feb22a66b8fb7141b49d640bf4550387c4e"): true, - common.HexToHash("0x9d0a9099deb69a5f26a348a00081864a53c5616daffa378488e930fe225732d8"): true, - common.HexToHash("0x0b821beb96f2d499e3632a2d3a43152e615a2eb38eacd6fdfd5701c35c3fbd3e"): true, - common.HexToHash("0x7880a81a457a3c491d167677dbaa4465f318c8a1cafee6aa36522769e8f1ca25"): true, - common.HexToHash("0xd6b15289c04d7b6ae7b3a8276b0b304fb0c2e9324ee13c555710a723cef24b6e"): true, - common.HexToHash("0xb10e78fe74c946281c4929b50fa13fd26558a53d287c091b2878a35ea0d8d256"): true, - common.HexToHash("0xcf384edeca86769bbcd68152f47e6fcdde7a569030dc6812267434b6b99a716f"): true, - common.HexToHash("0x953d6701c8b282d21ac9c2a38be11933ca1f8edd83bb5e7438397229d83540d8"): true, - common.HexToHash("0x5bf900f6979f6b9bfa5277fba4892655755c5f5e44866f08000d97c7f310c8f9"): true, - common.HexToHash("0x93769944a9e30949e2250f9f54a4ba8fc53a177b77b93a4200f7788d3182f0dd"): true, - common.HexToHash("0x9d2789b9bbe7784040352343776a8d028ec350d45cd9da5a8b0aac93aecc5cf0"): true, - common.HexToHash("0x78f7d9a01736426414aab795cf14211c31b588de97dc2e502a67d853c4904d97"): true, - common.HexToHash("0x9c5f32a5993a61468989bb785d2897f142003aa3c959c4b6517433e0fc6a008a"): true, - common.HexToHash("0xba2ef60d2f94c8cd1302ede940040b9bef3e7af358f86490390d0fdda78ac92d"): true, - common.HexToHash("0x2c8cceadd2d748485adf0f6d9bead93829274cd8e26c6b4d1dc3b73edb9f7bc3"): true, - common.HexToHash("0xd65b2c66e53ad6830b7e883f1fc5476c3ebb2f7b976b0ab973a92b97f0de6217"): true, - common.HexToHash("0x09dc895ad6d4dbe5b2d4aaf8d0189cd86d18bc0129c6132a9a9d669ae69a38d9"): true, - common.HexToHash("0x3786696cf0ceec516f4d58dd6bebf90bdf0e19c82391b70a4b36b7428390ac7f"): true, - common.HexToHash("0x5f5ae41a6e6af60bd5fff45aa57b01fe5feb1ab29204e5c760740f3e1788c607"): true, - common.HexToHash("0xc5d96589ae7d8746020fd504db0bc8dc7df62594e42343d5daf77e3eaf68d3cd"): true, - common.HexToHash("0x5f2e7a602cddb30593dd3e447db70e5589212b6136c3b1cb99ebed8710923dbb"): true, - common.HexToHash("0x75b5fcaa2ee9c45748057963d9aac67a0b27c6c336aee4193b9175d006e491c3"): true, - common.HexToHash("0x46d5304f6cfbe60f184a4dc39ebfb01782fefa84f243480fc52107d88a2a04c3"): true, - common.HexToHash("0xc23dee2f413187e4fb5612064139a5ef4332c03a3303ce4e0596ed0334590bda"): true, - common.HexToHash("0x46bd228275015aa4bef7cf0ef902675a0607184819e18ac2403a243c1403a086"): true, - common.HexToHash("0x5f2db78a35b49cbe9b1bad23d3e47903a1aec48dd21fb2853d979023335735ae"): true, - common.HexToHash("0x90a8aed16cdf06598ee419f58601c2dc1bf3fdde0cb36108543c3222e34cd33c"): true, - common.HexToHash("0xc54498d2cd1e4a0044f8bb699f795e931e07b3ad1cde5b861634bf7e3c8df15a"): true, - common.HexToHash("0xd4e3dcf80c9955cca7bd426003dd974d38de1d19b5a981c997ed0877d415d05c"): true, - common.HexToHash("0xc617e2bd7e43d5c4b7c77b8e4f2274f99a3de6607ab9ad9446931d440dd2c485"): true, - common.HexToHash("0x9bcafc5fc99c180113683d6ad0ab361c6c748d21d29a712a8fb03150b9bb5d34"): true, - common.HexToHash("0xe225af597dcf790d364732679b69309e21f0828ba0f745a312b8fda2fc611610"): true, - common.HexToHash("0x3f6b64f71cf34fd32f5476fc1fad12ed9ee6568c268cd0c41211eacd6bf453b8"): true, - common.HexToHash("0xa26c35e4c0006fe9b65021b6b40bcb514f1f7cf4d5da5899f97a2fe9f336eba4"): true, - common.HexToHash("0xb699f2206cd7a872501053fde1a4ce67bd6fabd6ea610b2c66cf745882c5b687"): true, - common.HexToHash("0xa40743a37e6f6540525d663ee72f17b234391ce7149bef3ef4de5e1bdbf06006"): true, - common.HexToHash("0xc222e0e826e8b6606288a7caf13c2e4b87d6807baf443e3dcf6d5ef2aad468e5"): true, - common.HexToHash("0xe96e894a817a3c5287dfeaf886364d295c14f7ec948c08a701a46f319a01516a"): true, - common.HexToHash("0x753c3842c53abb4d109024e8c5438f6ca5f1d99a3c0c2f0fff0c5c3b15d7743d"): true, - common.HexToHash("0xf07ef4071f9c1a370c512d42157c54662a917eee0de702fdd21a39a64689bf68"): true, - common.HexToHash("0xba15b40def398d28c8756b489ed46f0ba521d0d5d78bffb7e575f8fc7ae0120c"): true, - common.HexToHash("0x76d6287b736ae155d1b87a59b94def820435014773eae526018aec9b95eeca2d"): true, - common.HexToHash("0x0e4dca7e666f31e45b37d8cd09af3bb9e197925cfe4049c794f129381def3490"): true, - common.HexToHash("0x5085a90f031cf3f37b553c8332192e018f1be5c1a9d7f82c803ff237aec49d30"): true, - common.HexToHash("0xe4edfb025a22a437ff8ad82cfa7d5256a0f4d8ecef37315fb08e7e0f7b48b392"): true, - common.HexToHash("0x6109bfbd4b9b23b91bebeec7a55568b288442ae4afe3b2a30b3d0e5941355b1c"): true, - common.HexToHash("0x734bc4a6d86234dddb7530f16f5a1aaaab46bb172b8ca045852f7b9974463568"): true, - common.HexToHash("0x307ba7b07ba145922195d4464e484248e09fd7243c9f673886b027c603ab598c"): true, - common.HexToHash("0x4fd23bd8b83ccd109703c719a05d41f53365ed4402115d7a25df9783cd68ffcc"): true, - common.HexToHash("0x5edc83438bed44670189e287e9cfd680508e33084437f14ee2ea56667fa68602"): true, - common.HexToHash("0x26ac5297c47b6279f7006e2cb7b5b4563ae26410b6a38cf0133c4c4e2141ec0d"): true, - common.HexToHash("0x2de4927fca57fffc648264809dafe8d9e1ced62a1d25c2012d0001650c9d14aa"): true, - common.HexToHash("0x62324b4aba471c3a1d821ac85fe844159c02a45dda983572928836d502ba4449"): true, - common.HexToHash("0x63acaff2c2fa47e59e6c614f6842028ae2657aafd484ec661fbe528df9f78971"): true, - common.HexToHash("0x78d797a86f0eeacd474ffda0039003088649e7cc60a54e12243dbbe59c52d942"): true, - common.HexToHash("0x75237feaf54cd961a85e33972e021e51e8919eb0d5742479757f02b2aef3772a"): true, - common.HexToHash("0xb09ce7c1e56365f22d6e65825c0b1a58ebba5db9a6d941a00e1e8dc9f4b41264"): true, - common.HexToHash("0x14f74f482a44dd2407f5500e84a69e75a786eab31a5bb3b769fe3189bfdc56cd"): true, - common.HexToHash("0x1d303fb95717d2a7a575222611f8aa5130d89759181f87c492dbaf4c43d9d521"): true, - common.HexToHash("0x0cd596d1e3a9d2f897a0cdab2f9e8743bbcbbf3493391d1d9bc01f05e89912cb"): true, - common.HexToHash("0x2f515189cb9b923a0d1c073a25a558ebdd4197f18c723e2fc1104a1ba425c71f"): true, - common.HexToHash("0x6ea75b779b9a82fe9d6747b602f5424c6a9c7a899294d762599229ebdb2a9675"): true, - common.HexToHash("0x8991f6ee826d6e1289794631ec8a8f07814828500263c916dc82e5178dc179ab"): true, - common.HexToHash("0x303a70d87846e955a954d19d0e4cd0daa860256a92ceb5bb8051d0594a14469d"): true, - common.HexToHash("0x8e182ce59c48521cdb39c1ede0d721d9a471edbe86c2a2962800ee6170322a61"): true, - common.HexToHash("0xd8afa8d4a53f46d7dcbe40d3f88c61e4ddc37793d7a23391f157d4b62fad453b"): true, - common.HexToHash("0xc3e115a5eb81d12067aa91d25ec6e1d29f801d49273c9bf97518d5b492a4b134"): true, - common.HexToHash("0xe7eaf296643c01a8be5761faa3e9fdc93cc0661ef1c960001a0b3ba893e6539d"): true, - common.HexToHash("0xf38b555f16c260e9656c3d165549b37040b9aef1db07312c67c4a9b81a88b15a"): true, - common.HexToHash("0x79d47715510cee9a6ef7b94ea3af2e5599e195f858945840093dd5df717ff71e"): true, - common.HexToHash("0xfb540f852f6e0bbd42ac39df2a4308de1c5267dfc9b0c1aab04cb09e5a023051"): true, - common.HexToHash("0xe63227aa8482fd5fe02282718581726b3bdfa6b453adce6c0ae39a2c7e141377"): true, - common.HexToHash("0x0ccc402b3c16d4b4be0ee9e4af78a5aa8410d1a0f97a5375699f73f930a6e41a"): true, - common.HexToHash("0xcfca4fdffbb027d99bdbdc6671bcf5694cc667d397a59d54d03736f0668eb252"): true, - common.HexToHash("0x389d2c786dbcd2c3f6d95e2715ac6f155828055935f2393c03208613e3f5f1e2"): true, - common.HexToHash("0xe64b763a5c0bc00949e6b6f898a466128b70208ca3a44c2d672ad23da8c1c7e1"): true, - common.HexToHash("0x544375af7018d3dc5db9046804a7cbabaf97212ab68ce1536dbae763e2d900f9"): true, - common.HexToHash("0xd3a8897b9b920141be0355f130c5df7fb52f34aaedc6ff5c6dce995a4d49d6c4"): true, - common.HexToHash("0xb5154d4cfb20183277d062be0c4cd34a1ac8096968aafb3e7f42a7e3c23a0dad"): true, - common.HexToHash("0x0ae5219a105e250c755b5dde6bffa28d18fc6ae01265224791b9b9e56a9383f0"): true, - common.HexToHash("0x5f33fa836cb29737c74effbcb706f18c1f87501222af852b9df23620994238b0"): true, - common.HexToHash("0xd885b792d274ce9f8fbc8af57735811403ff7fae79e2355063f57e60da023477"): true, - common.HexToHash("0xebd38ff03d3c81ea7a27f7b90c951f80ab359ce5ad36faaf0c3c76a750d242f4"): true, - common.HexToHash("0x09730d33fc9e024249344be642b3b1c3177b4266499dab0f9a2beb0344049a98"): true, - common.HexToHash("0xf2e7cb6e554b21e9197a591f0f8c7d2fc1fab1f30439d3f225cb43c9b6282aed"): true, - common.HexToHash("0x12bdd652dd001a2ff76ce15efe5f4415ec0a998e163b0e62c3b72729c8ed3ef1"): true, - common.HexToHash("0x21cd04f391d61dad2164dbd96d7e1b181dcc2fbe006f263b181c0156cc1ca8c2"): true, - common.HexToHash("0x3ba373bb3814da1c850eaccf0a09f9494374c3d84b7c3ad7fb33a162a8358b7b"): true, - common.HexToHash("0x5ead5569220facd3fd76803077c955516e8fec37c672e44cb587ca672d9f5cc8"): true, - common.HexToHash("0xb849ee70f1495f8f0658f39be3058b5218f24c5310410813fadb722a2d48b1d5"): true, - common.HexToHash("0xdbfc03b2b4f9d9d33773534c2362ea14f6a3c89910f06c3bf77284017b072c70"): true, - common.HexToHash("0xddc3cb335cea941697cb4e083e5aa809dd15ae073bad5a6ac6de3d0311b189b4"): true, - common.HexToHash("0xc28a9e1d1cde9f2772d27b354154cde16d5161762bea811714b012a68fd60618"): true, - common.HexToHash("0xc6671ddb3722076215a544f7be5eb83ba355966b9b6f45741555d0071dfffe43"): true, - common.HexToHash("0xe96d660add5a750fa9ac18bb27a7a00d95671e971e0faad4603c77d0686e1ce6"): true, - common.HexToHash("0x863309ef607e741c221997cf50c2aab3bba4092d5aedd8a63a7e8a653678c672"): true, - common.HexToHash("0xc24c04241dc6c69476a2ef77354c5bf148807001cae0b952a2c0753e90fcc099"): true, - common.HexToHash("0x2c54fdf6ec6f4d350807409554bba646b929ca5d625fbc32118c2e01df297638"): true, - common.HexToHash("0xb5fb1d02d6f26fe70e6d31955a4a50d26b470a7a8ca74bc52fff4161d3ef41b9"): true, - common.HexToHash("0xb4e5c4c5d021f7066e3d4227c456576e0cd94017d19c07eed699a118272030a9"): true, - common.HexToHash("0xaf269768a49e75770b6bddb51c3aa07a7a34aa6c0cbbaaf62047453f0879c68a"): true, - common.HexToHash("0x21561fa640890dbb6a7e70c46aec9c16bac738d4adac6bd99116298d5c666307"): true, - common.HexToHash("0xc7e486b4eac673d026753a0729123678db909ee67a76aa742522d96f72ce9377"): true, - common.HexToHash("0x779b3efa7cdf6720690726515a776c7780651808a4ae227aecd2d0fdf8f58fe6"): true, - common.HexToHash("0x8e1af8bc1438d23bfbaa2e552aaa3ec97051803d32a7593ca98e6945a5539bda"): true, - common.HexToHash("0xfb2d83d9c752c2de4e0c11c56d04802d79a4be58e97346332a53b8454663618e"): true, - common.HexToHash("0x33425a749fecd6709265c90f5ef6073767cabf316ef12f09981ff8ac3e0fef4c"): true, - common.HexToHash("0xae75dcbdd4f87499afa92069965be9d8699f699ce41784bff2f60773a91178ac"): true, - common.HexToHash("0x12eac9543d605bc1b6a917bef99cb6eb52c998a49399a5381e7f0c3dabd02909"): true, - common.HexToHash("0x794299a0768bf5b083758b9ea2e51755dca60854cd64e9aa30dcf85caf07ce90"): true, - common.HexToHash("0xb96df833218c1a98898c631b8f0349a8fb25f35c868d9781f648d3e7ae812ff5"): true, - common.HexToHash("0xb96718b4e0bc770cc2e4b63c5d27f7984d37f28965a35abcb68c3e14f55a0a70"): true, - common.HexToHash("0x11d9c74f8498ec4975a2553faec13b02594b99c1bef06914c3530428e7cb2af7"): true, - common.HexToHash("0xa5cb9e5a8ad18e94f19b61a29ed58040bdc7c5cecaae9c7bf2f6971d38f64afb"): true, - common.HexToHash("0x6918bf755770377156186d224add7b56b84253d4228d98be8e4793b79f1387cb"): true, - common.HexToHash("0x5ab42a71647862efb0ac3ebdf191fe16e563c23a316c1d2bd32b8beddfaf8904"): true, - common.HexToHash("0x613f01e7c9424fe1e01217e80bbe67fc0f5284049faa29e4b24797b1a5a58c50"): true, - common.HexToHash("0x71831b458b40c501581fb2f9565c89d64652ff80111fd27588b621ad454484a9"): true, - common.HexToHash("0x1f497726939f5e6485cd28719f820581b1b75b7016b3098b4b1e6627cd30a4a1"): true, - common.HexToHash("0x0d7c775164d284fb02a3e9314a9bbfc3c752bed348e37b386a74982096a7c4c0"): true, - common.HexToHash("0x266c0535c02422012f436f818baac6c3fcd1e7891df3bf2b58c37fa32bbdc94e"): true, - common.HexToHash("0xf2d3e140ead9c2140356fd604fc52da2bede85fbf39f93c4403307ff679ae70d"): true, - common.HexToHash("0xb37a8efcfddbc8afa0788bca7c4b1b2178fcd8645bc8527dd3cbf77e69c313f9"): true, - common.HexToHash("0xf4246f6e9688cbe1ded1f4fa184618b5eff09466c6e430f8d78b6e91f73493d3"): true, - common.HexToHash("0xdce83b65d6796454ea4f2f2b1fb7cf9b3a893b115b332607a7b476f193d3f5c7"): true, - common.HexToHash("0xe509e8ed3e6b3bda821f863b3a7d4c8088aa588abdd63b9bcc678ce57e6a50f7"): true, - common.HexToHash("0x417551cbefb7cbcfa3a93498986741ceea245d3b754174d368cf9d993fb6b4ca"): true, - common.HexToHash("0x2c6046f312a2380162ee15681e4c2a2a0857b3c5f1e27b0cee54a0acee605dad"): true, - common.HexToHash("0x938cf4f47bfded97bd5c531b04d69f3544dbdcacd0f0baa0f16be75a5e18a608"): true, - common.HexToHash("0x483957fb461e765b0fc0aeb6e0aa4ecf851a721575300230e6fabe5628ab0d93"): true, - common.HexToHash("0xb8c99d0d3dde85f1dbbcc498face81c1c8880bdd573301b74125e06ff11ca88f"): true, - common.HexToHash("0xe56e3a21bc3f01e6fec1c1aedc0f557e18035aa2c2a419d630ed2e52c192f0de"): true, - common.HexToHash("0xd087a80dd2ae0c57edc8998d0a8265dae14b1f3e0bf2ab3466dc46ceb5940d83"): true, - common.HexToHash("0xde0a69969328cfa54b98722cacc3482271078c2336e48551e34dd9c8c9f851a4"): true, - common.HexToHash("0xc48871c772c655d365f2f84fb74a9c20eade3840c9c37294f242def237521d35"): true, - common.HexToHash("0x0f5fd66aaf04b1287309ac81b7e3862c3b4e135a6e9f9915450c937c63bdfe15"): true, - common.HexToHash("0x65288e81e75d7fdff9b4ce79a6eb73f5e3158bab8ad9eae489538bceb140b4fa"): true, - common.HexToHash("0x8b1538c4b488e776c12af7236b61dc1a6e4d8146536320c4b1e3993aecc52350"): true, - common.HexToHash("0x91b973e913f4099448749be8008250b5aab8ed1f8a56c6faad8eb81522a88b72"): true, - common.HexToHash("0x7075c8587304ffe1d2896d635f1f608e7c8c16e77dba328c879adabaf8840fbf"): true, - common.HexToHash("0x70421de38ae597e83777e7a5ab5341d5981f40baab5de3d4bc3f24e5f62aa9f1"): true, - common.HexToHash("0x1058d31ab3b6d4d383407f33efbb33456ee516ef9708896070e5703711b793b4"): true, - common.HexToHash("0xf55888c3dba59fd63ba7ea0070b7a2f187281972f9e5188334d9fc4bcaf538ab"): true, - common.HexToHash("0xfdecbd8ec52bb60a71d56d0e6cc64d1aeaa8209ed67fcd138521a84179e08d6f"): true, - common.HexToHash("0xb69fa2211d4f7ec905a880bedb2b2d73920a235f9f248fa8c9ec739a128b2476"): true, - common.HexToHash("0xe15d1279956d3b1e8095125b9708ee000bf3dd520f2626b99db600a9c04c9c13"): true, - common.HexToHash("0x8037e431ff9da374658a6279a4e09bbc07bc20ecb5ae9861cb109f385c40d864"): true, - common.HexToHash("0x2bab03e2fb5aa9744f49948803eb6e3d74faf46cbb655eab82a6943636ddde22"): true, - common.HexToHash("0xe953825484aed0bf0e3e493d1e71ff70f3ee08e293fca6b6589c567d9fe7c6b6"): true, - common.HexToHash("0x294581934b60729c1150e27ada73c1096d97feae86236c8e3e1a0e1f75794d26"): true, - common.HexToHash("0xaf447283a38a929decdd1b9f18b6aff8151f5fd943398d45f3dd496902af56e0"): true, - common.HexToHash("0x55104fdc6e3303c8403b3fd2e3f5959323642a724c9a37e7205359ebe74d381b"): true, - common.HexToHash("0xa855ab73d57c7db817571c8d376d2c044cf4acb1de30df1c54db5e29ffc76e85"): true, - common.HexToHash("0x8774fe7d765a715cf9cae69868adc8bf8ce2a951a555af39a8b2272096507019"): true, - common.HexToHash("0x08ff5458045a3a78bfd4357f4922f8b3b1025b856d53de60ae931e43fab0f7a4"): true, - common.HexToHash("0xce76afa486d7e117dfb2b9dfe76081963b94027475ecce9d974283f4c12734d4"): true, - common.HexToHash("0xc97aeca590188f1f0fedf068e3316bb5ca09561a5c2bee0688056c094d8bfdfb"): true, - common.HexToHash("0x11e2a3c3fb17a0c620c5f7785ce465147061aaa3589c4a1d39b9781cea1217c2"): true, - common.HexToHash("0xce59c9cefcf16fd7f60e40179f5f4ef5f2ce9012ab3b7323525d42fc312c86a7"): true, - common.HexToHash("0xbf04b5fa559a5633be30bd702cb7220c99bdcf67c7112adb2582795e3645f2e6"): true, - common.HexToHash("0xc7ee849a24ed719abc9db698c9d9aa91eb7404032c8b11756cad67b26fd0a886"): true, - common.HexToHash("0xbe0571ace1ee23d679bf6f5d0740b60daac278d07caa22d21c992e368131f9b5"): true, - common.HexToHash("0xa0b555e534dfd6c874ddb7431b5886b64f5916bceebe9acab2fafd1ed7fc362d"): true, - common.HexToHash("0x2c82dd88342aa61416bd589a7422ca8457bb642a68f2eabb886db4030c92314d"): true, - common.HexToHash("0xba72cf3aff9940608c3a3ee2363b0756082128066806263f9acc6d13c83c6549"): true, - common.HexToHash("0xedb1ab7e97cd6510b9eee7339da503a01fe95da44fe4ed50cfe01d39b131e3d7"): true, - common.HexToHash("0xea512a6f9bdc588b0c6478f6f431dd5a47207b53736c24f23a9993177dd78d08"): true, - common.HexToHash("0x85f977a700dfeef5c38ecfc79881859ce466c596f868de28be96d083cc74f734"): true, - common.HexToHash("0x20a21b31435a4b80ed2ef3e921755f93f1f2754978c2436b68fa8314b8a17dc9"): true, - common.HexToHash("0xf245ea6fa2c7792c1491c5546cc9021a88ee9896d26a87d2acdbb19c64d52513"): true, - common.HexToHash("0x5827b7cd8e8fd99fb45814d7374dbaff2484a9427d931b17a5d24f0004d74d7d"): true, - common.HexToHash("0x579813d77ad4b123d7942306aa262016c7b040177be631d0a9ed00e140e40536"): true, - common.HexToHash("0xfe432dd8b5e91cc40d69684fdaa10f2cb77930de6602d4ff023c26c538888414"): true, - common.HexToHash("0xf4bca9703f09c6c7f3197106f6526f75d5051e281bc511a9b7039e0bad4fcdb0"): true, - common.HexToHash("0x618d873a93aa835b1cd7337e28b8f2df4b34c5b74228fbae9ab733ddcfe55557"): true, - common.HexToHash("0x86f5bdcdaf99fd82e265ba2e6354ad46a27d959c9273eef005bf76b5de0638e4"): true, - common.HexToHash("0x526bbcece49f10e52fb329d7150dd4827a33f04c90da92765fcdc11bc0375ba3"): true, - common.HexToHash("0x8b812b641b23f463e8144c0aa4bae25ed636292cb7ffeeaa7cb6d12edceaea2e"): true, - common.HexToHash("0x6937997631cf3c812ff38e40e6d9a5be8b99cd0e1efd690b5e2d38c7849b1928"): true, - common.HexToHash("0x228e9a8b2d4c827c78a7a82b3d440261d4953ecaf0f639e0c693f85a57b53fb4"): true, - common.HexToHash("0x2ac495ec5c698daf23b263bf2c8d7dc203d859b2d0dee76c02a2c34088b31be9"): true, - common.HexToHash("0x7be62196fcdb04e94735bed6e1fb9453f1e79dcfc9d5393db381af8ae817f318"): true, - common.HexToHash("0x33e83563685a7497923c2df92758c2c8a6cc6dfb69c3479048b4f03b09d56819"): true, - common.HexToHash("0x2148255deac06e28cab360c4db2beb9b3fd326d8167c44abf7d9e1deb49b34b9"): true, - common.HexToHash("0x1b2e09d778a4c2646816149cb523eae838b969f7ab5d53913fb05269e5a1d67f"): true, - common.HexToHash("0x2f45cd21a9e7bc96b98e7f53bff80ebec3bf80c53566b71a4eec499c6d9d70b6"): true, - common.HexToHash("0x613bbab3eda38be385b7665d2d029ea7b0ffab76e8ef44bf865c7aadbb011345"): true, - common.HexToHash("0x2b199353b6001201a2d207f498a11ec6212d746498d826abc7c8e0fc20448570"): true, - common.HexToHash("0xf958bdfea9f6aed03925acd791e298d563606069f0b5988f28a7525fb0d7a898"): true, - common.HexToHash("0x24999e9b3dc48555c09fe7ba42f4cc8291ec8e779a3a98213c13ff48d6aebee0"): true, - common.HexToHash("0xa42abe82ef313f6e6655f8f04a5a617417043db118a1b04b50fe77f3808ef193"): true, - common.HexToHash("0xa3081c5e08f8975179a72f81f7e8ad65cf79ee287fa7b30f8367b6b037c295cf"): true, - common.HexToHash("0xb3811e99bf5c3e54d80bd7323cb8b5cebc42188cd967ff9c51bfa2359dd7a0b9"): true, - common.HexToHash("0x56980a071d64f461c42dc95d20ac264d6a578355654a732dd5098fda0b2697ff"): true, - common.HexToHash("0x7ec7963c7a1b8b004d08f63671a6278872cd2a68efcf9fee79f3df5046e7fc31"): true, - common.HexToHash("0x16b390ad75ee25cd3ced13f6ef6de14cad999e4d13b29e3819afec29b0afce09"): true, - common.HexToHash("0xf9934e39687bc48c6048735bb9801fb185ea9e6480f3b1f2f7a15cb1293ff253"): true, - common.HexToHash("0x5ca0f8d47eea7fa7aad5b2b36ebf8b4d349c038d128b46c7f5194f1007db5c86"): true, - common.HexToHash("0xb7baaeaf9b0d23589e00d37792b87df9d1e22f5a5fc4da79ad556e76803466b9"): true, - common.HexToHash("0x69e78faa9acb0fef47a05423438f015ad8c306ac871ab040d78723bf219f0526"): true, - common.HexToHash("0xcbc66f752e08eb66cddab9301f6b34aa7281df3045960f44e8ccaf9e8373808f"): true, - common.HexToHash("0xb6812f8209ce8c25aa1edb0582aad3b84ecb88dade651a1bf0c3716810c0e9f8"): true, - common.HexToHash("0xc97d17afa0281e8eeec9a1307fecb245f2356f5d92e9b74daf67690fc73c32bb"): true, - common.HexToHash("0x2412cf18e2f426a4e7fa1a3a370f4b981870e90447296518fdcdee144862ead3"): true, - common.HexToHash("0x65b66e2db362b2607e9b79afd2b4b58ea18de91768226d8f9ef3fd3a8bcd437a"): true, - common.HexToHash("0xb411432b15ef5ade38eb9f5e49070c3f436e34265e8de159e2ad20cb198ad26a"): true, - common.HexToHash("0x8dfdb6e8f8411eca383b5575211c17e3fbefefed9ff83bc5f5b39cb540241938"): true, - common.HexToHash("0xaea98cbc67103f6aba019cab7c1e597cee4b581517f35da4b23c802cbe001a10"): true, - common.HexToHash("0x79f179964ad55b5efe1b98c0c0a97c05eb82b9cfef1d7ede7d08377ee8d4771b"): true, - common.HexToHash("0xc3261d67c7dc3ea621a2f1ed73011d1329818aa9eb99e962894e584421438516"): true, - common.HexToHash("0x2bad1aa7540abf9e5c81a0e3d2912272741e6f56002c01552a2f23905d9ec887"): true, - common.HexToHash("0x048951eadbc2b6c631ecd93fe82f6ef5bb4cf380731d2faa32dfbbc332ea7cd3"): true, - common.HexToHash("0xbbf7463696eec03d6bfda16cbadf7447c6a0d8e0310c0b50dd26491a990dc6a6"): true, - common.HexToHash("0x73518808e388dcb3a645b561e9d344a53d31d38838a141f359c24cbdca542e37"): true, - common.HexToHash("0x18b9ecc1616222f17d7fd1055998723aeb268fe06240029e8cc2a5de5d3811ee"): true, - common.HexToHash("0xfed4c3eb63ee6160514a5ea05131207bae677d7b287f401d9ac6e0ce78a85862"): true, - common.HexToHash("0x81c6313c7cd794210830533254314d19943623fbd5083cf51f1d35f49cc3e008"): true, - common.HexToHash("0x3408feafc49ac63fad0b217326f6ac81ab4bf08ef24c079acb909468b736417f"): true, - common.HexToHash("0x9a579b4ad69da19f98b9fee4517935b16e524ec3b1b7d06d962ce461da7e3139"): true, - common.HexToHash("0x35a5b097ddf76fa306d069ea79f6112f3d192e0ceb0eab13805f718a25d79407"): true, - common.HexToHash("0xe9e11175a31dd72ce31053d54b7c78957f44c25df6c9117d1311b402c2a5ad34"): true, - common.HexToHash("0x23fabb5e877ba2b211cffe378082b730fd21ee54d397f32716c2f8c3a54741df"): true, - common.HexToHash("0xa2502fc3620dbe7203d71e0b5ea6dd39342af61ac536811c011d8ad832cfd2df"): true, - common.HexToHash("0xaa8960c0e598b73f216daed750370f2e1760050207bd8d2f45197099e2195ff0"): true, - common.HexToHash("0x9f8a2f50b0fad0c5976e6f06d7ea6631db1c30ed9fa336e84cd20227225d955d"): true, - common.HexToHash("0x9654e7cbd7d12536618fe359b6602a011bde9d603cd3c5615874887ff60650c7"): true, - common.HexToHash("0x27cfa000610ae3a8ec1659d07add7aa041615569369b6a6b923c2741f3afc2b5"): true, - common.HexToHash("0xf57aa62d65dcdc1888806432a50f774e77f9cc53921e77d5056adee6919634b7"): true, - common.HexToHash("0xb67027bf962417ffd33ad04ca3da8188920d4fe6a8d57fe73de9df0ce3ebee5f"): true, - common.HexToHash("0x7191725256e826a07f5c3395cbb192adfcd0a799b5777582edd8c1eee83d904b"): true, - common.HexToHash("0xd7f6a47f397dfbe6f973e2056a2deba7004b6f54c4a7e6acf08c8b7d23d3fcb8"): true, - common.HexToHash("0xd2ce6c56757d79e84a0fd2d56deeb02567695aa54bfa316fccb4e50141124f10"): true, - common.HexToHash("0xa884f7228f65affe02abc0d38f99d00904bf84aea49459c3106741c54def27fd"): true, - common.HexToHash("0x7d66b8d7b945b9fcf2a3e77fedbfb6306001e1abebc608a95636e1e83b60ddba"): true, - common.HexToHash("0x21883c4a9f4398db4763c864d110b02d7e121977f60e628e9421eb9c43f673ec"): true, - common.HexToHash("0x82b618eb3770ccb8b6e5dad2b92262714b3c15b62d31041df2dffdf1246b613a"): true, - common.HexToHash("0x70354f3c8a7e87ae0a099e5a671f546b94fa26a7249f6ca92e1dc4a552cf8658"): true, - common.HexToHash("0x8c569df83f3f05cd0a5a89435c2fd0280b838002daa0a8f0a714d21bd41b406e"): true, - common.HexToHash("0x1fc7572b6bad2c63068e42a719f26e1a869efcf4e73d8bb91f1b30052d0e9314"): true, - common.HexToHash("0x5836e08b859468458086b5a9c0aa17798c90342b421afef1a012362168925a4e"): true, - common.HexToHash("0xe8265ac727741c83b5f4acf6fedb26e319e7a94a50bc05f2538b1ea45efb7411"): true, - common.HexToHash("0xfd50d18d526226991415cbd6d96548f0f649b720f9cd9abed73c5a05c12cda98"): true, - common.HexToHash("0xb140eb4953e3b4c64b72a9cf8e2b8e100b55d8aaf334823e15112d1653cc211a"): true, - common.HexToHash("0xf99ba1b22d2aa0e3c4ab362c4de4cc308cefba788bc70d9656347f4ba5bad128"): true, - common.HexToHash("0x2cea0e07a3ee12d914c92d1d744ada01bbd9952ce04914854152a244ae14c242"): true, - common.HexToHash("0xaa7d67c7df79387bbd2b9bf36ef25edbf6809782f46e9ad0e4157074edf39e1c"): true, - common.HexToHash("0x911346747c36bbb349a0aed841f08b2c3c353b0f3db4d11d7066a1792038e84d"): true, - common.HexToHash("0xe46771c2c164636a969518f766487846068db042d7d53d4db4c4496e89168ab4"): true, - common.HexToHash("0x935c15b0c60363a730eee098e3a22e49b77868ecdd1c8dd8ce565317005c8fa9"): true, - common.HexToHash("0x858ca920088516b9c8a5203c90bded1634511495df19c09672c2a33360d109a7"): true, - common.HexToHash("0xc913c4fa512b4fd18b4e5f79108e941114630dfcdfa33f93cb08fc0158f07e7f"): true, - common.HexToHash("0xe7111e3affe91b5ab50b87d72dfa83e79f5ef0a0db3d25c877e7cdc14fbf2da0"): true, - common.HexToHash("0x62933ac4554cb3f2e68b3d8aaf602fc1c750e02cbfc8b205c7e39e3d0a13b3a6"): true, - common.HexToHash("0x52a295cccfa665bfba52ee349fccd3cce59c4462cc1aa8ef5f11c4b7bdab2d72"): true, - common.HexToHash("0x2c08cb47e65704abb8b29ca108bfb169c7f84d8880b0f62c3a2a678bfb5ac7ed"): true, - common.HexToHash("0x6ae545c033a7901a7dad5acbd0c6481c6bb34bfed65dae83a8d698256edeb62f"): true, - common.HexToHash("0x29f16eb1d9d5ea2a2e70c1d0b18db593aa4e5260aa5a95144a97003e5e16f8f4"): true, - common.HexToHash("0x7a6ace53ce4e14331ebeeccbce15e4ec0331e19b62356e3d482a1c293981e05e"): true, - common.HexToHash("0xd381692b52cc75a236ae7d9f2e2154860ad7e7e70fff4c402a28644680befa22"): true, - common.HexToHash("0x8f7b1be9aa67d498e51f504dc9a430093ef8ec201900ba7ef3aefdf024bb6f24"): true, - common.HexToHash("0x35b9d3a1e14ac59ce9fd358d72b34da5dfefba9bc471a15ba25b1c2c895c8491"): true, - common.HexToHash("0xfef843e0edc410144d517c16c88424fbb4aa7c7ec7be666e93785b8fc76700eb"): true, - common.HexToHash("0x23034171e5ef4d0ad05c784ba34c252c5508e480223f1d019a1b6b5a3a2cabfd"): true, - common.HexToHash("0x36ae50563f7e7615366871c22ceee8d8c654376a977d9a723a3a7becf1a7f22e"): true, - common.HexToHash("0x336a2512fe72ad12de5bd65cab0903d4b4035e002f08abf45ae3a8100e6debbf"): true, - common.HexToHash("0x920bf4b44f90594a652a606fca87bea73dbd47bc5c0e48b05b26d68163495200"): true, - common.HexToHash("0x87cf346c5232a00f976138ed14f69a1a25580e7e5dbb8314648e27fcd6bbecfe"): true, - common.HexToHash("0x03bee1a2e1804d230bab03f07e2c2551cbdd878fafd215e54137cf28995ba303"): true, - common.HexToHash("0x17763143c7cff81d31eb77559b0db4aa72446afa012b8edd14fabee3339dd39e"): true, - common.HexToHash("0xc44a8d69f802e42d39601c4192c0ff2ebafbdc940f820623751df610cf1d0c72"): true, - common.HexToHash("0xa66413b978c5a115b07a54efc774e3f979e343d05d063011bbbf154b370033da"): true, - common.HexToHash("0xcc99cd522b9404167580ca33502b8a2a871a935f7e9cfc0dbfc449d8921a7935"): true, - common.HexToHash("0xd52d79fc590f0c1189ba7937ee63b217ef117b5e7d198a2ab0a5867606f10dad"): true, - common.HexToHash("0x8eb34be17e341aac6cb173d86aa9c0402082a97ae32787f7cf477e9e8631b328"): true, - common.HexToHash("0x446b6c58854f3fed9eb79369e749bd31631a4a0c863d75d62ea8b6fdd9d58da6"): true, - common.HexToHash("0x143fa17127e238f82e1f889aafecff8ea99317f4e89d05df3b5f82a399b24e60"): true, - common.HexToHash("0xc598274034da6198a51904c89ee5608f840dc33ec030fcdf43439346686ad0bb"): true, - common.HexToHash("0xd3d0c89a37bba08633cb26f447c4ca9b4787bb486c708af9af3b927a232b0d16"): true, - common.HexToHash("0x3ae950f02b9dced6e735153383f224d7d09d08f9137d110b766b44b899a290be"): true, - common.HexToHash("0x987bef480c56abeefd6f4b15b0d8fa0d255c6151aa3414b8f9e385f0bf400b26"): true, - common.HexToHash("0xb2b77f8c80dd47ba9a989a6b455a59812458e15fa10d1ed59748f8ed8acf5732"): true, - common.HexToHash("0xd1ec119463c1619ef855c046360e225e6a1f7d7ebb2ae30919d4ec471dd5b9a2"): true, - common.HexToHash("0x85ec43f70960ca169ee3b0946ac757d3059e99025907af58378d24521f655247"): true, - common.HexToHash("0x3faf4a8c6cf77b95f397907d6948d3e0efb41e76281620be1522739da04beae4"): true, - common.HexToHash("0xa6e0fadfc5e97a094aaeac6d3377220175ca092f8bcfa559315dd4a48eb1b8d2"): true, - common.HexToHash("0xb20fdb7f91333616063878908a8decadc188bc314489d15fca699b0386f7d69d"): true, - common.HexToHash("0xf6860b8a8cf05ef0c6a7a85b46120be1ad1cc0dba92778a3af3b184446eec827"): true, - common.HexToHash("0x045800d3ddb9a62dfc26842eab962dc3b3e91df088432608518bfda9557e9414"): true, - common.HexToHash("0x5a4017ec3f4cff3fa6cbf10a8d24152b941a855b96ba178d0e237dc90ca3ca81"): true, - common.HexToHash("0x77016e7b073ea74d066ad632876e43086ffe4e7485f99e8ad94b6688a631a83d"): true, - common.HexToHash("0xb8a8da358f521ea3ecdb1c4266cb180b4328582c68ccdae818520d91e73d609d"): true, - common.HexToHash("0xaf39760ba17a42694197a47b61a20833bcbaf95cd0fafe4e700599296599b2b6"): true, - common.HexToHash("0x458c20903fe33a92db2876e091021b226bb41aecfbb3db132d29cae28da293d3"): true, - common.HexToHash("0xc633038c2a22f521fc1caa91725270c8547c035a1d71c7237a8b9053a3b13075"): true, - common.HexToHash("0x3603969cc144ec192cba6a37299e76e2e62e2958b269ad612e425ad49df576f5"): true, - common.HexToHash("0xc93fc4d13ba41fa00f01c74581ae5d901949edb4f381e872d6258973408e7bab"): true, - common.HexToHash("0x925d0c607281d2e40c05492241388e1e808243e7849b53e9ab10256be6acdc19"): true, - common.HexToHash("0x752c7fd1f257e8df08ab96cd8a30b9ef9069582afb5db8536ab0c96ebbde1422"): true, - common.HexToHash("0x464fe95171434c7ad5e483f22f934117a1d1fe9a2c720aebf6ba0968c19e7490"): true, - common.HexToHash("0xdee860a922362f546f5fbeef45584349a1168242767fa198b24f370fae4cdd05"): true, - common.HexToHash("0xd8e28dca4315b50a499f8c0689aabffe49d86fb894da14d69bbf99943d7ca6f0"): true, - common.HexToHash("0x3fb648788b403edf2df0fbde93a142d522ecca05178399a1a5d175d69b7c3b01"): true, - common.HexToHash("0x3a15b6059cb833e1deda500ec69cdeecd218eb5d440265866758b39d69d8dfb3"): true, - common.HexToHash("0xf796c23b30745d960b69193b27028f04d5e60d2a1dc3672187f49270ca4fba55"): true, - common.HexToHash("0x5385fbe30703cdcea895a8b5a9676d6b5f54933d746dd9928f4399c488180914"): true, - common.HexToHash("0x87a10a1cb0c248fc4ade30b2b6a6c4c0cb533cc9638d5d43997224c48adee9a4"): true, - common.HexToHash("0xce83b02aba5fca96d0403a157dd2b48b43295e1bec0b5302c6c79f923fac43c8"): true, - common.HexToHash("0x7a207cf44540fb2de13c1c8469a65666deff1be9b9d991a68a5f4e34bed8ffa8"): true, - common.HexToHash("0x3a44f21533dfd4d61330abb7cea9ddc721a7eb781cf1fb6e6f0aa8444e6184c4"): true, - common.HexToHash("0x314fbc4afb13c898ff823de9e47968cb0312b5dfe39750d082911a4e7450a72a"): true, - common.HexToHash("0xd616cbeb7cf7fc39865ecd3af41d20d56ea21352b128797e4a05f064ce2d5c27"): true, - common.HexToHash("0xa1219709aa4e203f63d87954d6b150340228bde5e23d8072af4a909236e01bbf"): true, - common.HexToHash("0x3a5d8e308b89171cb58fc179dd981fa8961b9ff5fc0e3ef91a6b98f0263f6760"): true, - common.HexToHash("0xc36b29abcd83274d8a9f00d579156e96c7b7efe15231430ed86815eac00b1cae"): true, - common.HexToHash("0xd571f92d53083c8463d14cf6ae3467e7ffdb53d652570e48dc2808b4682cbcfe"): true, - common.HexToHash("0xa09bfed5b20ccde6de88a60b83fae67923ecf4149f0451ffb5b84ea74ed3695d"): true, - common.HexToHash("0x6c3e79d820f57d3bed96f2f547da00887533828db7ef400300cc57f9d7a7f072"): true, - common.HexToHash("0xf3d2701b1d7a28bb840072952c2fffb625b8c0fe225e9bf6995c44f2b0b253f7"): true, - common.HexToHash("0x600cb67560a922e3f83ba6060bc097a16194eb2f6696c1f7ba8ec6d729500d67"): true, - common.HexToHash("0xc1881e0188e9a093b2fe25638558dc43a3e997dfac7ea39993d10b755bac1c30"): true, - common.HexToHash("0x3c835c9403b9662c24d641feb0324c941422e4a20d645b9070e817ed1fcf9cf8"): true, - common.HexToHash("0xcc98278a3b686dea00bad677ae30be24979ae4616ea1bd3a22b30772d94b4122"): true, - common.HexToHash("0xca655ac16d45ea429eda731fa478d6466d104028dfe4d06c007525f59e526f9d"): true, - common.HexToHash("0x43c570745739cb1b457129c0596ed242460e80da3efac0c26ca14829af5f085f"): true, - common.HexToHash("0xcdda6000481559cb7bf55acfa8fa5889318cbec6cda8639a96ff9f21b1688976"): true, - common.HexToHash("0x321342d15a3231a67494471b6c2605ade5b91c0c9d8ac6a1263d854ea5498537"): true, - common.HexToHash("0xa287bc37051e75463af15d640bebd38234beafb8fc6fc37e4a66e2f4b9152aa8"): true, - common.HexToHash("0x821ef7183d650b3bede12830106250f4bab5043c58f0112a11032429678edee3"): true, - common.HexToHash("0x28904e951856f67d6921240781344af30946fdb15baf8da2baee1930eeb48fcf"): true, - common.HexToHash("0x8201f49444517d99baa2c9201f4f2ef6ba4c5aa0b5de38372c4667474ca27fc5"): true, - common.HexToHash("0xc6c979c1a6d83bae038d19a3a05201833ad1c5ec54d0b6708a32d6397319fcd2"): true, - common.HexToHash("0x1523b56c5353846b51a414725111f1b88c0b795dbfdb2e94b2d46ee0cb852a00"): true, - common.HexToHash("0x55a087f00ef9dd0312ab3ce416e63d777c2b88a9e43e74250b05c59448631f71"): true, - common.HexToHash("0x5000bb6f5e5af38ee85c1688d2ee060a17f3f28617c48dc2cde4378d42b59e1a"): true, - common.HexToHash("0x45be2702d70aa7239a61f0e47130fca87ba0bb5d4605165c38a6a51a6c7d21c4"): true, - common.HexToHash("0x7c6f03d67b241a1636bc66774ce34d01cde1395928236cc504592918c6b28ec9"): true, - common.HexToHash("0x1ed08ec31757f49169d5f64c6815d9f4f917293013a74f229c302c30d9121210"): true, - common.HexToHash("0x353dcb1e4ced4416b648f55012ac58684b20c9186f22afbf9adc18b027aaffb2"): true, - common.HexToHash("0x6ccbbca280719b04a8817dbb4820b1d7900b085e3cab802305c5f5da6afdda3e"): true, - common.HexToHash("0x45fba40d49656871065da7161c04595b2329db9a446bf3c1a90dcb6801f393be"): true, - common.HexToHash("0xe36c19d2f7fd76c5fce106569cd828405958abca75f54642c788b1e9726fecee"): true, - common.HexToHash("0x6c2c82c0223074e405bea53669c1e6000c590edb3af88ba22c9626f553c1cc05"): true, - common.HexToHash("0xc91911a3911e8ccc74781f14f01f4062e769c5c96587057d5d097110f4fc5a1a"): true, - common.HexToHash("0x35b0bfbc0b39fa00b653168f1b99a90dfc45df1bb370196b769496ee6fe18f87"): true, - common.HexToHash("0x83f000821962d5c263ded9b4bbd1c8649de364565ae9121c3888718b554dfefc"): true, - common.HexToHash("0x6027b94f77d0ec6ddf01a58982c106b7536eb5808646cbbcc8e4dd77677cd97b"): true, - common.HexToHash("0x851151d536115acea21d2f89dff04cc94a9ba4208d389d96679d2cd3fe78d631"): true, - common.HexToHash("0xcbef618a2b6ca76229f74352a9489a85518e8fb906d40f1e3daf086db9f00f94"): true, - common.HexToHash("0x35614b2f8d6e1aac7dcf2a85295b72dbb289d82ca87953c626d73401fda3b127"): true, - common.HexToHash("0xf75ab2a007a4021715dea90090f74935031975a8f9ea3b8fb36f3e51b976ffcf"): true, - common.HexToHash("0x398ae46ecdb42d4b2dcf26376d3497f373be702648aec949f6f3b92c1910d680"): true, - common.HexToHash("0x0a9be97d6a1a32b3e017687bab3964a7bcd515344e3aae4a6ddf6c2756afe169"): true, - common.HexToHash("0x39a0261089a8e0832b352a6b9272bf8d2ae1f32fdcef974e9134b82dc7d46687"): true, - common.HexToHash("0x1c535ae154669080b6d51e646acb23f823531319f6e51ffe0aa334046eed7b00"): true, - common.HexToHash("0xe85189227589b931b89fa7268ddfc1eb6f69332bafd75494e7a4217603786a0a"): true, - common.HexToHash("0x1979af58b0ce6b2516df5066667065d5b2bacc1bd18e17c48a817f519fd53164"): true, - common.HexToHash("0x76a680ed0a1ad6292a01b4a6a41a0d51b060769ae58e55af14a128765c32a141"): true, - common.HexToHash("0x8f18bf5c6af8be9953da0fea34d4bf684615108198466edd65afe8fd69601a8b"): true, - common.HexToHash("0x42fd7ec209b15d8f94ac877d4ef0301bef565cced8193e539b67f56e68eedfc4"): true, - common.HexToHash("0x4551581dfa38adf94e40df7aa02e5b97306dd52c75724ea9ec47a56d1bd3df3d"): true, - common.HexToHash("0x6b2536b5beb617b9e94dce681fe6b718af1a41a6d2cb84934437d300ac4990e4"): true, - common.HexToHash("0x57a6a3a14ee77bbce9074ddd937d701f3d55d9b01a469f9674d4804fb2000a3b"): true, - common.HexToHash("0xe1d8c22819beeeec93ac2b7d1d6fcf43a743590268bbf3fb4180d3ae70fa6495"): true, - common.HexToHash("0xa8fdb1f6ee027d3e97db1dfb08539d18a6ded652d6e3344e107ce21043744c7f"): true, - common.HexToHash("0x21c19bc2d94b5de798186b7550e33ddbe9404ca9e9905ea3b0002fe2d3e3afdb"): true, - common.HexToHash("0x748ed1834fc28196502e29293e7f99adbf6bbfba2426c5fed91d84cfcf42ce42"): true, - common.HexToHash("0xd237751b28fa90217addf54ccb1c896fa4d47f4d344b7ef7c5eae5c4f36c5c40"): true, - common.HexToHash("0xc829f67caa27f4892d0e1f80d65198f1b54c105fbfc04b8485850894e8cef400"): true, - common.HexToHash("0x683cbc84fb4f81deeb59e10c5d3b9d473b66423ca8f0b874a0ea74ac5faaaef0"): true, - common.HexToHash("0x25e722194f0bced3ec53a757d20d8cc1896991a26d0c7864bd313467dc3754a1"): true, - common.HexToHash("0x944654c991cb7d75d29b6e28ae4f90ecdeec660f8e33dced052fdea567d26ebd"): true, - common.HexToHash("0x52c4ab46c172f98f31ff1b31929f8a6ffd4d87c58b936d9f76984e8776e0c810"): true, - common.HexToHash("0x9ce5073401eeaa92174384c5288c1509b540409c27b26f07a4e6def8be5b7ab2"): true, - common.HexToHash("0xceea69e4aa47ef15cd005d8a44399f2a14a48a1c9a27bbafb27c1454978b7c6d"): true, - common.HexToHash("0x75975c9e5697b2a3011a1d004aabe8735a51bd368b9daeba080a3b743ca57d75"): true, - common.HexToHash("0x27ee9e4df2189915f32345d2e1ef180d82a149a3a0990aafc85c776fe0fcb64e"): true, - common.HexToHash("0xffe4fa932393b7044fc2ca875b5dbaee9bf902b86a32774b0031c17c8bc67ae9"): true, - common.HexToHash("0x23c6fb9822e70c73e3aa8e986263ffcef20a3abcbbb5d52173a7a37aae1d40b9"): true, - common.HexToHash("0xc8bf79941a4df25026b2606a3150c36200972f3e9d078dffaa698d690a6d94d4"): true, - common.HexToHash("0x2539db0eb01feca2737d5ea519f663b5600b95be50d2587bf503c2771af54c4f"): true, - common.HexToHash("0x42c6a18acfa538ab0a43823db2533fbf2e31c18e6d0027ba8467646a832516a1"): true, - common.HexToHash("0x461f46fa4294ed220c48abec60222fae4fadb4e0c285cb74808d5813906708bf"): true, - common.HexToHash("0xe8c81b72b9db6b1972bd482c223ffbce0fef009b8f1f716dfb5225a8f0fe09d8"): true, - common.HexToHash("0x65914f5a298dc668e9355974f9555c9b3f1b345889157b51dc8a515490eb07e5"): true, - common.HexToHash("0x378cad6abf2dcbe6ffe7a24b2434d05ce6dfdd68d8d60ed785d3431a005d5e16"): true, - common.HexToHash("0xbe12cc3af031bd3dc9a370b5ec756f56d8edb81d8d5233a334cd9cc88bce253a"): true, - common.HexToHash("0x6c905cedeaf9fc68ed3818f049318d0c6ae1daa2d26acf7937c6d03ba00048b4"): true, - common.HexToHash("0x93fb1889fe2db67f76af85185e4739f9e5845e32b2840ce3a439e0e1dd701a38"): true, - common.HexToHash("0xfba30daa4769086d2c0e92a2c34dabca2fc2551eeda8f32fa66497abd194a913"): true, - common.HexToHash("0xbb4cf22b89acb1c2968c9f1f88e11c078d1ffb178b2795caec0f50fc7f5424f0"): true, - common.HexToHash("0xf71650d9160af958a9f46e50148872fe5f6c88717276e5e8912f6ead5ffb71e3"): true, - common.HexToHash("0xeb12acc09750f6367366979efdae14d685774da5906bf56f23d99c053877c024"): true, - common.HexToHash("0x34d679cc3f5637708b451794c95adbb30e8da61a17c2a25f88829ac5e9530780"): true, - common.HexToHash("0x1222e96c850a2151c23d9c62046406556a2fb00f28893135a69dedd9fbf5217d"): true, - common.HexToHash("0x7f25e318fffba67b8f2ef7e79bd49bdab36b966b9478568e8e9bfdbb62cf22ec"): true, - common.HexToHash("0x5169393268a486e4827df583786321f2888276a0039a01d47bc1bb92735453cd"): true, - common.HexToHash("0x12606bb02012dc9138ae76067c019c2c11c029d02844a2dad2de3cd6cd813097"): true, - common.HexToHash("0xc3ce2436dff2f65a96e4eaa0eb5cffd45f1a4b6caf204176b3bc6a6635f67537"): true, - common.HexToHash("0xd46929e640a1794422b42008f89bbf3ca1c87d589c5a01f6e470119f1d25d3a3"): true, - common.HexToHash("0x4e48eba5597f00e30609727064b32018f14ba404e99cf8faa81613226be357f1"): true, - common.HexToHash("0x69945b1b8eea94fa08488018234409ae030ea0faf04205caa6dc3536b06e2de1"): true, - common.HexToHash("0xf6d5b02e0f3d86528d1f7dad59dbef0dc873d3b4db8fbb86da61b29fd22e947c"): true, - common.HexToHash("0x54c3fb99999ec649584546d065a4e7647521eaa05eba0279d607bbcd150c9e8c"): true, - common.HexToHash("0x0796d53379f8fbdf454af2ae698048163fec162d7e9e6e67934ad23bd8d7a92b"): true, - common.HexToHash("0x0ba627ee17e7b051772b8d1e7d8a2f3ce2309fb3c470accf416da4be5fd97959"): true, - common.HexToHash("0xf65dfc22c791f0ba3cd06f1814c2cfa6612dde169736cd6b166d729170d55814"): true, - common.HexToHash("0xda7975b67204ea511a594764eb23de53e3fd5ba82ebdafaf09b96d293d71ea42"): true, - common.HexToHash("0x376f47022769ed538322ced4fdaf215acd2905a46006f549985404f92800e305"): true, - common.HexToHash("0xae478e62bf63a165be3907694324717f372a61003be829ee0ba81d5be07f4ccf"): true, - common.HexToHash("0xf268d0172febca4aadbe533bc44d810e85068068edb7322afc7d56d5ae66f332"): true, - common.HexToHash("0x87b86840e04c9b147f943c67c034f34131294d982682defb5d9b0d2bd6dbb43e"): true, - common.HexToHash("0xed4ac62ee2d3347f839bec9c8f357bfa79d65f028a74888f4895a8cacbfd1300"): true, - common.HexToHash("0xcb7ed25a2d5553f4f9f96b7201dec739ea325618be1b1ff73cfb8b259301ffc5"): true, - common.HexToHash("0x018496c1115235a8a7f9f4ed4abe8322a550de8ffe872bbcaf3b0392d39b341e"): true, - common.HexToHash("0x67bbc04307a755f554726f785d634fa6f128d05d579a3c445005b585864ff11d"): true, - common.HexToHash("0x1a5bd38f81b44723f34198d3a111e6ca09bde2a51ab6facd6708d74e26086abe"): true, - common.HexToHash("0xec3e08fa24f8c3025376f54a12f219d8d8ad2c0c6a53137bfc6ebd560488a9cf"): true, - common.HexToHash("0xbd7edf30a3dcbb380a72c28ac5049fbe0df437cd12016524835d712369480847"): true, - common.HexToHash("0x53c820910ea2d043e9564a9e545e26cd02231b3a34dad7948fadbd6847c1c9f1"): true, - common.HexToHash("0x6bea1f4c0bf607af53b1cc25bcb9c590f52c7eadd44c49490ff8c53e75c28ed1"): true, - common.HexToHash("0x9af420c608fcb0688a97b9f20fd0776970f9eaab35965a2cbd695f994109550f"): true, - common.HexToHash("0xf0adf5c824579f1429f21276bdcdb1ee267a3c9d6ae43260c243f65634c0adaf"): true, - common.HexToHash("0xb0d55248e103c96fc55e9bb8a96843ae7f8fde7a7a955e5adccb39a35580dc6e"): true, - common.HexToHash("0xc17504d967f91e4a99e72bcb5c008a120a11c81aa56652624d2d137c395ef0e3"): true, - common.HexToHash("0xe038f855df4b54f3d27c51028c023a41719b37f1aeb11ffe2b0be508ab272abe"): true, - common.HexToHash("0x90edc372ae83ca28e7b1ef01b8d730c415a0829c5787881984cb35b3f0d7005d"): true, - common.HexToHash("0xf94ae2753032c2b2afb023c6472fc1f333ae87b1a5677e22812a69bfb0472b83"): true, - common.HexToHash("0x53f24971327c9e5618ee603b15140f1d9d4608db343cbd1072953fbdcbb91b65"): true, - common.HexToHash("0x7ea8d7be9b14473f46a6eeca4f30a3f7a3648306be625c57510d09704cfc518c"): true, - common.HexToHash("0x50334ae2eae53a6a7879c056e197a9b617eccbd4fc03bf6c6c306ef40241cbc9"): true, - common.HexToHash("0x1d7d1e0ec5c1d56f4be8be0298a4354b0eceaf79419bc2cfc60d72a49af52194"): true, - common.HexToHash("0x965cebe0fe75c5d4343465586c80b15d4c7558c3d3fcda09c4471318a4f8dba3"): true, - common.HexToHash("0x68e320a2ee406dd1c71f5371924681d2d99fc12717b3c70170e194eff789be0e"): true, - common.HexToHash("0x2777afe08732371a74d9144d3e7efdbc374f7a8202a6653ce6927e38a0e9b4f8"): true, - common.HexToHash("0x2e17ce45672ced98c931cd0ec6bda9cae3390d4e6ba804818e6338009b7b9f6b"): true, - common.HexToHash("0x7113ddb0a8dcfd0158c51ddd9228fa82ce40aed6190070a99f0de7a2a8c1fd81"): true, - common.HexToHash("0x30fa309985d9e5929f8a509c4a81ae7b213f0ae75bcb17b8933778d42d95e670"): true, - common.HexToHash("0x98996e962639ba7ffbc9a77c959c3ce00e824253326ce84ea6fc45cd7c1017db"): true, - common.HexToHash("0xd676b2a8db52ff40288909795fc0635a776ab0777a48f80b4f844adfc461277c"): true, - common.HexToHash("0x44f4abf2ca516308de59ec451cbe04c1ef34c1afb9f741265606d7f288e16256"): true, - common.HexToHash("0x0314901dd99e2dd061b97d607d04a13a9703166ed42fe26ad23523187b74fbca"): true, - common.HexToHash("0x12aab91ce257159b451a95c084690d978d2133c97ee3797626cb532cdb1f21e1"): true, - common.HexToHash("0xc6c9bd5fd157cca2c74a3265561e3d295856913634f0dfef87176ca3aab0c753"): true, - common.HexToHash("0x1b0a20f1e0a7c805268c56b24eda6745082a7950b987285632c8de491940b69e"): true, - common.HexToHash("0xadee7f580f476a4fcf1f04a1288975423ee126ced0ad62c5ab5efc16b0e900dc"): true, - common.HexToHash("0x4cc759eb635e61bf8f1c2d7712a10b124228ff18a7d4370a4b3aa797adb15513"): true, - common.HexToHash("0x2f51b8d730245d88a860dd286e9118b93edcaaa4b4be4373c66268d9a509469a"): true, - common.HexToHash("0x8aa9ea4229eaddc3ebec9ff302a400014cbfec4cfce036f7c3e03ac4767b9c65"): true, - common.HexToHash("0x32a1dede9b67ca23631e6816217167c456f5b8bff368fb7488a5ff0f5022e4a2"): true, - common.HexToHash("0x6259401204e3ea1144ef69a8a4271b588fc35af96a32b8d394927d36c663fb85"): true, - common.HexToHash("0x436bdefe76419da0a69b32ea9428bd103d3e10efdf6686b68e0d62009b81ccd2"): true, - common.HexToHash("0xd9557e339a4db8b86573434f0636758c4b7ea441d2bdba617d0be730555fd397"): true, - common.HexToHash("0x36e833d8374874325d1b28298bd0bceea6faaacac1ee28cedf345edaff84cd21"): true, - common.HexToHash("0x69072034d65e783232cd0ca2d629a386c0fd767e261212aa1369967c938585b4"): true, - common.HexToHash("0x01925a3667df38a604c77db5c9e0f601c2c0258370199a2adc13598721d5fdd5"): true, - common.HexToHash("0xc10a0db8dcf55fe1068fad5629587306900438af3828507192e749303c216938"): true, - common.HexToHash("0x29a6201751c28923acc8e0a68bf8027314c6c7b1f4a4c3ce24400e9afa5e55bf"): true, - common.HexToHash("0x877f74c45065e9aa6300d3ffa4cb1164b48857b329904e53463f4d6536b4e135"): true, - common.HexToHash("0x0d183e4a6a29d5067b1fc5e6a855c536f3ed52ad15f4362cf0b198a428b4cee5"): true, - common.HexToHash("0xb2e718ec2e32c75a0170c62d22fe6d6909409ac46a7d582779538d3bec5ceea6"): true, - common.HexToHash("0x3791259cb91415a505de9091a18d46530e44fabc205683a4d9272ac49ea904a1"): true, - common.HexToHash("0x895d71ac59d7cda1806a839193f38b4e4849b27978643e25ce879251d8790231"): true, - common.HexToHash("0xfec1dd9ffad7d1c97782996e46ab3d3ae589828257b252437b259450e25355db"): true, - common.HexToHash("0x5044a125bb365ae01714d5d735848dc292e958b080da30f947d00dae384e8ccb"): true, - common.HexToHash("0xc67faf391fda3c26b6474ea39141adde047376d564fb1402295b692f2fa7750b"): true, - common.HexToHash("0x2457ddbfe8cf62ba7826729bb9aad110191945de150bd6e9f6fbffb753cee986"): true, - common.HexToHash("0x837237b1e3e72f47b4f456dae63c069e57577a3a5ab65806409f7f0677f3bbdd"): true, - common.HexToHash("0x1315f83bbfc753b1165bc71defa28cefbcf750476d7c23b627a0193ce8651bc7"): true, - common.HexToHash("0xdbf2379a8524bf74834c858895feae3e2ec2acd0f971010d285e30365083eb9a"): true, - common.HexToHash("0xe15f266dfc14d34267c1773133262c9232695b64e8b0986c97dca2fb738762ef"): true, - common.HexToHash("0x153dedfc435ee846b84662cef98ebccb2e4a0721a4bc373b2cc953ec6b9c8d3c"): true, - common.HexToHash("0xd1b54f71d828300b3417db44e6d47661abc201636da0e537bc04e84236ebe65d"): true, - common.HexToHash("0xc7e291f3627da656b190cfd2c5a8d70146632d7e9100f87aaac804cc82b5df94"): true, - common.HexToHash("0x48070fc159f9885554229b8585951d7dc8f586bc3a6c3a24d43508310bc7f082"): true, - common.HexToHash("0x04cc3cb4763b223c0cb18dfd6316de61134f2654db83883dd9fb100dd140d3aa"): true, - common.HexToHash("0x8a3e841fb3d42b60aaa528f27143920389bdd3e52a010c4869dc13660cf89b02"): true, - common.HexToHash("0x6cf4be000c8b71bb66c923544a298ae9b698db4f1531781244447e77ebadec86"): true, - common.HexToHash("0xc11ff2f7dfe8f54f93a26e08f42c23f7ecc1471c8d2827cd3a3499dd4bf58fa3"): true, - common.HexToHash("0x6872e150412eb28600b15086d51659c21b230b4abbc61b7718eba6c2100dace0"): true, - common.HexToHash("0x15282b64b11c32233bebd1e290e9904b3eb376726b5350529620f4d88f26d4e9"): true, - common.HexToHash("0xf6bbf6518cbe88fdfb6bb0ed8ffa369f012cdd5abc3ee0ca2d68579c8a9520cf"): true, - common.HexToHash("0x74ff73dbe85da36f5836ab832e0697c6e8d5eda3074ee5da1e940d9e402c5288"): true, - common.HexToHash("0x81cde83485aa7f70832c063e13deddee13a8f7ecb622160a69efab69bb7317f1"): true, - common.HexToHash("0xdf4d515b622ff4a293cbd8f135ea522beb5a9d27767c8a038905ab5c4648d837"): true, - common.HexToHash("0x5b973dabc9ff65ef5315fabd783dbd38a9666af14c9e6301b85873f4bde2c02a"): true, - common.HexToHash("0x14a533c199dc356fc156fab532bc1fb972fdd9cb2d58b638aa8f1f9f9d4d8e3e"): true, - common.HexToHash("0x1082436f4e1741652d3d05729243a5b3d9f5d0eeaddd8006edbf1ed44826dbc2"): true, - common.HexToHash("0xa91df6ebb704ab8aa0040ef64cabcf47322e639f55cb32896bd86bf34a15bb30"): true, - common.HexToHash("0xc4aea7afa89ca5ef95c6bf57a139eb4ea370a77e56383036451a0e1b1646731b"): true, - common.HexToHash("0x4184f6d73444a828403510958b5dfeb0e8a72c5ed5994e38bad1bae9827fe5b6"): true, - common.HexToHash("0xd50d8b6edd6e0b7fd5fe89f40b5b77e55112dc8619cd82fc16ec53f36dfbc10a"): true, - common.HexToHash("0xa170cbcc54ef6195f41ce50c3de77517ce8bcbccf1e8b9a2a66118cecfacd26a"): true, - common.HexToHash("0x71f30e68469a80750051cefe5fcf31de830ad9e0c47a8707342ae11874253604"): true, - common.HexToHash("0xe5751e9e6a26f1c8473321825730803e7105819a64630fc89bb03d4af7e4e173"): true, - common.HexToHash("0x889d8db4d234531f54bd560921c72328a402c010408b8f033de413e0b619fe5a"): true, - common.HexToHash("0x5f4b4d17d680cbc8a793375b67ad7a21b0bf3a181a1337a7df41cfb1c697571d"): true, - common.HexToHash("0x9e01dac810bdfb9a6537206ce7718fec6b605df1c25f0b329a75d3ed532fd096"): true, - common.HexToHash("0x9ec0ab4eb8ee23ac047efffe22c8093f1bf44938f4c860609278aa55be3d91cc"): true, - common.HexToHash("0xbf3b054d6434dd4fe41d06b84cfd9e2542ba06ef61e8485e5a3cef9190136de3"): true, - common.HexToHash("0x13918300cb9dbfff15ce9776aee6046b07af3aceee621b26f92a6a7d595beadf"): true, - common.HexToHash("0x445535c7823a7736ad8bd56bd86df2bba342f74b16dc3936a28cc411243a2d4c"): true, - common.HexToHash("0x086cc9aceae87b465118f6af2130799027977b577ca46cade0a448a1e146b6c7"): true, - common.HexToHash("0x28609484aebfaf9250733ea4ce4873eaa7537600772addc753f7d9884dc0172a"): true, - common.HexToHash("0x0e56e1c0b8ac04366257686f4078f68e556d39d1f26f06747cde31e9faf066fd"): true, - common.HexToHash("0x06911c951fdeb5ff9c955cb74badc557020922e4b1dec0ecd27a1a91c0c03cf6"): true, - common.HexToHash("0x3f4761aa44e240e91bb4439575b458a4662336ae0e5c3610d1b163652dc62829"): true, - common.HexToHash("0x191bc75c34f57eb4549ba57dbaa044828a29c852cd6a876d6a3761fe161cd8d4"): true, - common.HexToHash("0xc22646184869ec7c512388b56ebd314d688bf5f5d62fd45a2320807444191c15"): true, - common.HexToHash("0x9310b653ab90e404ad4aef6f1a5a0711135a551cf49255868719377b347add1d"): true, - common.HexToHash("0x7a604e63b8b7df4876f46bd48539e17fdca5edc38b50a0af8094efe3fab2b982"): true, - common.HexToHash("0x56c9f618cd84746387acf0f87780702d0a35be25ac1a1405cc5e8eff912434a5"): true, - common.HexToHash("0x29fb5d5a4193097fddcb16b0ebe2dfcc16c654ccafcc194a06eef33a9d39613a"): true, - common.HexToHash("0xd488a9cedc46d787b28efc99163335507f0765decfeda3cbd6ce4dd8deee4162"): true, - common.HexToHash("0x4aebe555f6f610c4e465bc8e814a774d66e59b55d4df127eacf241c2ba0f4cf2"): true, - common.HexToHash("0x274e1dc84979d7a43a5903fa9db6f004d390bc587b2e861a43e4d487b904c4ae"): true, - common.HexToHash("0x0417959a73e9d102d4d1a80a0fec402713bd7ab803645923b3493757a6583ebc"): true, - common.HexToHash("0x2c7c1686dc260503faf110cc82b3756a3b49f3ba9a14a1bdef1b9784364353cf"): true, - common.HexToHash("0xd0d50f55b794afba859919f102ef28e2b05bb8cd9a6729647a918abd421abadb"): true, - common.HexToHash("0x91fdca58d5a9466029fe0f396e7711dc2c0b497d13b99e7eb7eb52ba51f278c0"): true, - common.HexToHash("0xbc0c0eac4d2917f02c3b1a48d9889796646a79d5a9febb433825e1549d60b993"): true, - common.HexToHash("0x2e5d5daa740b245ef51b997805dcf54285db8a9c5c947db5c231d8f81361e745"): true, - common.HexToHash("0xcc2f476181e1f66c81fc29057c74adc30b3f45b43a3a46efbf2057e092543322"): true, - common.HexToHash("0x9e1291b5045b08736e192ec449c971dbd2a164a748f0dfb1c6035bca7992afe3"): true, - common.HexToHash("0x114903f833232c363643f53d9852c879bf482a452229d41b5ff96b340fa25ee9"): true, - common.HexToHash("0x24265540ec4dfd78b0ff3a6c6453b31dc193efe790c075c71c39818dfc4d5ee2"): true, - common.HexToHash("0x76990a2a51e4cca8b177af313a4d8910f0a86c99127ed2fe90c927bae9402659"): true, - common.HexToHash("0x950f23032ca8a5f6a3e86e6f87c5c225e517f11aab6a5db856f7b933e119ea9d"): true, - common.HexToHash("0xa8ea8c132d519a98ab881df20bc3e72b47cfbe230f0f6d329f10e5bef8adeb91"): true, - common.HexToHash("0x1c56d4786df900855b08d14970a4f0bbf2ad16fcb00f18538cdd865ccc9fd096"): true, - common.HexToHash("0x83e8e55ec2f4caf201e8e2f1cc3faa98795568c9fe1c54024fdcbbfb10a9afbd"): true, - common.HexToHash("0xc6dd4738c99dbe8522d1284336f42147bdf70e4678bed6fefe0c6d02d62d856e"): true, - common.HexToHash("0xf285b51264dc4abc72cf119c239a937a7c033cb7b2d12adb9e943626f689d756"): true, - common.HexToHash("0xe9686966fee2e374870ad6d4f570d647da1308e56e23959c03bab73b6e8616a8"): true, - common.HexToHash("0x2a1e91bb0c127c1f3a5e12da4c2d71a30a252b373a5d596e6fbab6df5345990c"): true, - common.HexToHash("0x5bc2f707d98d5e94ef187d0fb9643806ec58a22d447db162b3a114b177dc8ceb"): true, - common.HexToHash("0x000a7e2eb1bcf30a112223a7ecb148c4603728c65de6ab0fbd39aa6f77a689bd"): true, - common.HexToHash("0x454f3ca147c7b404984a417ed2b74d0d64bcba48e3dd64e149a3eb149ee54b1f"): true, - common.HexToHash("0xcb35879b72a5901ae834e785cd1f5312f168f29a9b607056936f4c4c319395ce"): true, - common.HexToHash("0x91c946a8654551fda098cee82c316cac583d325cd7c5f6d6d4d0d4ca4df45a51"): true, - common.HexToHash("0x4c75f3529e9b8cd31f65b7e233c1755e71429bdb17dc01f4ae64978f51296496"): true, - common.HexToHash("0xc9aace4e902f288a890c57075946ff8a531e68b404b0114542dfe31398268452"): true, - common.HexToHash("0x98a98975dae653c959469170550249e4d85d23bcb92ea0554d278e54b328d800"): true, - common.HexToHash("0xe1dafb997121cfca17bba7a6d51d57bf3b55f1b3ce0c735714bea645c51a51b7"): true, - common.HexToHash("0x5601284d84d9249ee2bbbaf447185d31b7233fced2581e755e97a70e7222b959"): true, - common.HexToHash("0x500d618d56beea9782e8cfdb0e00704ee565cb4587c0b05d42e71660adaa7d6e"): true, - common.HexToHash("0x122d5777031a1306c2c7870fc1ddf6d1f4ec797c1d4ef1abbb809964b2b8c503"): true, - common.HexToHash("0x7666ae534faad39d61b5b1e0478da3a8859ee49d1ec161856a096ff51083abd7"): true, - common.HexToHash("0x6a50d6e4555de7537a8fd438b76eba7b994841d989609eee1810857b5a74634e"): true, - common.HexToHash("0x53b6c77397d3dac9d6bca3f5c45f3dc89a2d749021af0d83b88675e7c60b661d"): true, - common.HexToHash("0xabf112e6b450455150337c729a60838e65d473628caef5cc817a80ba29b09ccb"): true, - common.HexToHash("0x5756f1ec9761a86b39bfa0fdc429ae257e701fc6feced54d156ef549bbfc3b23"): true, - common.HexToHash("0x387d05694dcc915ec998aa4671b6201658d51520a11c2432b77a4706069d380d"): true, - common.HexToHash("0x78adc6c7877b253e917ca761a61c1dc87f8715343806a29d1ccbd5c851042cee"): true, - common.HexToHash("0x71989ce1bb1ee1534825a7753c372b016fca9194c542f8f32ed65bafca46510a"): true, - common.HexToHash("0xb07567ed9b03d3bdf61ea5a6b6dd000f87b8b952f85f0fbe19cb3914be04c7f5"): true, - common.HexToHash("0x7ec9b71912a064a0ccc4ecb158d8ee04c1eb905ec5a192f03fa2401dcd983eb3"): true, - common.HexToHash("0x68974403a77b78be9246526fbcec27c6577451cb2b22fbe5517924ebfd84e5d4"): true, - common.HexToHash("0xc8d0717d3131c2c72c3a2bc3665d6c026e9dbd43f7cfd9566571114da4a54d78"): true, - common.HexToHash("0xf89c70c980c5b2544718bd3d035b103489c654b879c098bb0bdf1283cd97f7ec"): true, - common.HexToHash("0x9c2ff3378e543ea2ef796ce81dfad563bcfd2e37c45aad6a38f0ee4696e04bfc"): true, - common.HexToHash("0x942ef0d9ca7dea0ea1cf14c4a8ddd627a90586fdd804e70e9085dcc356849384"): true, - common.HexToHash("0xcdbabfdea7b9458ab201085cd37f1f25d66e267dd7d9fadfd34ab3460d5a5205"): true, - common.HexToHash("0x2a50b2dfdcf8046a815cb16091722e0cf7d7c14e7786d5762ab8a63065e1f880"): true, - common.HexToHash("0x3a41c8554ab2a227134beecc420b164cd3e2170e3222e5e9b541c6a5832f1655"): true, - common.HexToHash("0x408b1971730dc55ae35990877aa12fa21ff59f89c29d266f94dea1a14d6a87f5"): true, - common.HexToHash("0x631914138438a866b8bca13d6cbd3ea2a5d9eb2abea540d73d5e92e78fa768d8"): true, - common.HexToHash("0xf334460a15a29ad604d654ac1b31649d46162be4f806be079393e8d730481f4c"): true, - common.HexToHash("0xf4b8c04cee2cc3a2e91b4c033e1269af64895ff282dc1303d4a1e0fd09cb24e7"): true, - common.HexToHash("0x2f028a53eb335d768af5c119d60a2bf6d39c200c8562ebe671ed3355adc746ac"): true, - common.HexToHash("0xdc1ae1002376ebd2807264c26b8e17f5c4afbd578ce990e67ce2ea465eae89a6"): true, - common.HexToHash("0xdf7f9d44be68622ebe4d65b3ce3ada01603e2c237b342c8893d5fb04dc490f8e"): true, - common.HexToHash("0x49e44b33eac39864b12b6b1fd8d3dd52dafa4a4fef2dd473cec112935d40166b"): true, - common.HexToHash("0x4ca75923f0bb772c5a30a6ba763767d4fb96e88daf3b19090f557df2ce275883"): true, - common.HexToHash("0x295d79106b9e3d92cde4f144680b5747171bfda78af5a65e41206b0468f30558"): true, - common.HexToHash("0x7fc3657976e866b6ba8508ad8faa3586ba3ad1dd1d5d06c15cbde7ec90442906"): true, - common.HexToHash("0xbf97e559c8766f8d9d38baa0de6af87594b0610313fea46373459aa664c41a1c"): true, - common.HexToHash("0x0dc4e25b29580c609f4dbe10869012be24a17d34e09b3a673e16f4df34bbd4ed"): true, - common.HexToHash("0x04859bb1ff836cce952de1d01a4d2363e3c6d0b3997a8dfe269fbf87a8cbf0ee"): true, - common.HexToHash("0x8694c1d2898e07e34c15c5ad6652866ae4ca4d88f4337bbbe855857502908009"): true, - common.HexToHash("0x4f09472a8c93d9de6d450df0fac45a68860c79bb76b91d56e94464f32df0b0a0"): true, - common.HexToHash("0x2caf3ff90dd89b5cf138d78f21b04f8f76b98cd10859c03c3bde11364ffb2882"): true, - common.HexToHash("0x2f24cc23ceb9bd22517bb02e761099c157c8f3b7a5f9a84d501a67e7f747a1da"): true, - common.HexToHash("0x710a78672353a69499709859a289e06b3a1be462e1155b8e7d0e75847d53db47"): true, - common.HexToHash("0xc7f572274c1798b0911f7927cb45c160e1b60ae9cd79fb3ab2646e1b6af23ef2"): true, - common.HexToHash("0xc60e7e0415d37e5a2dae135592f8efef9410a0cd674832dd4a4d31ab5ba1a0ac"): true, - common.HexToHash("0xbe42ff382a1e718ab350e96ac10588b347da0bff8d806a0c14b72a4fea497a36"): true, - common.HexToHash("0x6a13f42fd55bbb5f53d92c145d2a501cc8e2361ffabeabf68161ca4c4cb90f01"): true, - common.HexToHash("0x82dfa97685b5725003cbbf12a4f1f35503fd39460eab2ddcc2ef47868fbf0722"): true, - common.HexToHash("0x236e95fbb21f353e51d97438fb92d71067148595bfc56911a3784d22754fbd0f"): true, - common.HexToHash("0x9a7539b43d1dc2f86fb6917a915f29cd99589be406ceaed2e74be8a3780c13b6"): true, - common.HexToHash("0xaacad0380c878227b8466e2918440451f5b5aacf2fe77113493dc161faf276b2"): true, - common.HexToHash("0xb8fe5928ec9bfe507b74678bf9ccb31189095a527d09512dca1baa341eadec91"): true, - common.HexToHash("0xc47f539a2e3903d2ede6e060f926b9d3c881b0db753f8548e932963595c8ac28"): true, - common.HexToHash("0x44a29cc25194c30b94ca01e9fedbc6fe6cd96c56d9fe880c21ea59542fa72135"): true, - common.HexToHash("0xe5873bcdfebdd32544c46e753a6074df7c80822355d9e78aafee0b50c86e5f67"): true, - common.HexToHash("0x6125ce32efbe1222eb088a0594e2282e34a579c0aa8ec90d3da2e3e102d0565d"): true, - common.HexToHash("0xf73913b2102404613730971c9dbe94b13677e507d940d9ec3fc177bd4c4da27a"): true, - common.HexToHash("0x492e43da738dca5acdd32ae545ea10b72c523068d812cc7fdf99ed4e253be15e"): true, - common.HexToHash("0x517cfa00d20e7a21fb140adb36344110731fe20d6eed786b43df0926a3580062"): true, - common.HexToHash("0x2d0f1cfdcb0b516be618029f26be83db788b23dacdb6a2dcf7d862c64845116a"): true, - common.HexToHash("0x1ce8b77dc0b064c1b5a3c64a50f5067cf5cac6c6338b0ce81d13958bbe105907"): true, - common.HexToHash("0xb8fe0a90db1ad6cea9528dbfb7d52220c6207391f853a51e6c9826d8639e7987"): true, - common.HexToHash("0x33c34a1068c5d132e3e2c6767243b7cffaeabd256cfdccf86f8bfa03d280775f"): true, - common.HexToHash("0xca04ab416fb048eca1d019b3330d13faf363706cf7839d751dab0df91d09698b"): true, - common.HexToHash("0xaec9c3b6a72f600681e31559c9c825d3015893a920c216b5e834316f35e2ee98"): true, - common.HexToHash("0x582b3d0efea3544b77047f58d3f39c1d98848362b591a8c1b9ec7e70c6e117a6"): true, - common.HexToHash("0x1b2f4eb4b015af2ff17869c7cb4318ab1f5530e575c288e7ce46b16e984beeef"): true, - common.HexToHash("0xbf8c9485d18017960650809da0e1aeb1d0cbc16b6f9175b511fb588b2b062e38"): true, - common.HexToHash("0xce4115cbc712ceb7ded69dc89b4cebc229bac3e151b342f6a130467b7c167f1c"): true, - common.HexToHash("0xf0b2f7689d840e20b1f5f9102593f1dca44972ba77cabae6a74c2ddc455ad982"): true, - common.HexToHash("0xfca9b5d63bbe9d2a2c2ffed62afd56bff020263cadc946b7f577bcca4ed7d210"): true, - common.HexToHash("0x8b42539500207b1d5c5a68afa4df961a232280b81a386bc95ee824fe4fdfce71"): true, - common.HexToHash("0x0191cd056468a90e9b4d108e5108490ac260b3a3228c2721ad32d1200c2004cf"): true, - common.HexToHash("0x09aaf899f93a2df6e3c0c95d68d0206445718057a3ad35fb80cafc24a4f284ac"): true, - common.HexToHash("0x5c022679e284e5ad1fc856b9be52bab9990e7c26c7f33073824497fc3a3f845e"): true, - common.HexToHash("0x3c930265fd1dc92d2a3a207cddee529bfd560cf1187f747c452e3a9e33d41022"): true, - common.HexToHash("0x49831e7d90573379adcadf04b922daa677df4736ce0d53a313c8ed920470f619"): true, - common.HexToHash("0xe04840fe03030b79ea653447f76508cd33214f6afba9b3f9079c66e399acf7c4"): true, - common.HexToHash("0x537adf77905a762b14dd12dc264e0bc6ebdec615354d2611a9352071926bce00"): true, - common.HexToHash("0xd97da920a62c11a7ab1ed861d394e336507c94d48fa85ab45081af4dbac772b2"): true, - common.HexToHash("0xd7e5bac87f80b8e038123dfe9cb53f0473813e9c78c2194084f2f0fcc5e4a3d8"): true, - common.HexToHash("0x3cda1b5bf8dc9d2fac140486d0d57a1b031f7ea9f3096b64573cb89b2997977f"): true, - common.HexToHash("0x2c4d959ada0bdbc71c5c34db11f6247138ddd8ec4669188338f7b3919f1d95a8"): true, - common.HexToHash("0xeb424c1a0bf2f67a8b430b1758964bfb5f0eda73a03c3cfa05e4a1450f8a3839"): true, - common.HexToHash("0xf620beec1d4bc2c67f32676a4dc87144e59e424bb540457d7fb0a256aa2b06a2"): true, - common.HexToHash("0x7f019b5c465a9bca10b086972a4b2494dabd97c5c87b4acf52c2c21d6be87312"): true, - common.HexToHash("0x623ee9f2f444c9bd6e2492cc85187b4ba6aeef56d9b7e32d4945fac6a31a56c2"): true, - common.HexToHash("0xf9e8fa237518f0ff6ea66ea64bc3467c6822f20309e5efd9814ba209f8624d1b"): true, - common.HexToHash("0x80d1e9587768163a3ce90e6a1fce4c8fe67cdf2c12875734f31c28b6b0afa053"): true, - common.HexToHash("0x4eb244259648408cd7c3a85b425296e0401ea5bedc2d2e42593577e781e497a4"): true, - common.HexToHash("0x2577fd45d7982effd08a0f8f89c8e0e059650ee3c3c895d2f61d8be7fc1c121c"): true, - common.HexToHash("0x03c3ec1b249e16d921a99a032019a5acb13c82a7e5a675e3c573883f6f210867"): true, - common.HexToHash("0x6ac867bff5ae269465e7c0c7231e32c25301b178b2b92b5f2c946dd8e7378c3d"): true, - common.HexToHash("0x004bc3f219e62da1ef8bae0746e530aa31374ff131cdf053026a8dde56053b9c"): true, - common.HexToHash("0x9a3d2677d16ffbea382bf6a181d9f607a3a23424da4f39a089d89356b17cdd95"): true, - common.HexToHash("0x00624a6e95901def3278fcbbd3370e5e9d8fb2a4ea8c5f8c3ac795ee3ccee2f5"): true, - common.HexToHash("0x65c386f6dcf69fbd3ee7a95abf5b420a2f9d3f35fb78d24bc1a7e6a36bf92e30"): true, - common.HexToHash("0xf4850a15394dc1be40d869850931403057580fdeaf83ecd92bf01c1b510e73a6"): true, - common.HexToHash("0x3630ea17f8e892a2aa5d13e2961638eaefb8bad1782b16e5fda4aa0c79b8894a"): true, - common.HexToHash("0x2c7e59e1b20a622c8b481b88a8ecfbd9ded67d6c26f128ea087260065183d75c"): true, - common.HexToHash("0xdc0c0c6191f9a07625d788441e28f0ca0ac400ed92e816c1e1ed09cc7aee095b"): true, - common.HexToHash("0x1ebbaead84b4a5c147d8084d6ad8ae52fb4d2aa9c61cf7c3f6e2af4b6b028963"): true, - common.HexToHash("0x196738387fa8e92c33987a4a249c9a029e7697295f56b9a77da0e60595f476cb"): true, - common.HexToHash("0x486dab92ab08433602bd0ae9037d90b084dff768d953dc667818d9f16f2f4c08"): true, - common.HexToHash("0xb3efbbcdfb28f88a242931de34af12846c5494fc1772e943250375bb2dd699b5"): true, - common.HexToHash("0x5ee6d58da239991b184b61ef65daa9ca26e84d5a716bd60bd0bfd5c3c71d73dd"): true, - common.HexToHash("0x087de2b8a2fb08ade122942322487ca16dfcc620f2ffd4edfbd4798f261d941c"): true, - common.HexToHash("0x9abbd70da48188ef00c8846f3c4cf0d9ee638868c23a61fbf24f47f552ad45d9"): true, - common.HexToHash("0x4c2d9eb2c8c1db2f55dbf5e55d3f165f04448e548b83020cf4fd2689ab071fef"): true, - common.HexToHash("0x5c5c4749cce1654025d23abda8f21a8207455e456c734b211caf6294d289e88d"): true, - common.HexToHash("0x89d6a1803088f51edc3ef88d0712b0d766178c0c743a716865a5fef798fcfabc"): true, - common.HexToHash("0x4461ce18d461008cb7a0166f595529099c61e47add28d96282852dcf677b6e4d"): true, - common.HexToHash("0xe8f02c5535ead2c6cfa3130d0df7424d1c348c4f4d84ffa9b72e51d91c17f076"): true, - common.HexToHash("0xd196ff097ba7acef8276ed66d2f5fc1e04892edd1850a69a2700779e09a9625a"): true, - common.HexToHash("0x190b4c0b573587bd24a0bf5645284b0f797739b4c1ebf5d292e09eed07164d54"): true, - common.HexToHash("0x9074216fe2b7969b1bea9605136ab2bd0eeb7e8a1996af7813245b8a8b24317a"): true, - common.HexToHash("0x1fdcaa08ba2315c516d2ed2ed8e44612862b31f7ec5fbdf51c9e1f24873654a2"): true, - common.HexToHash("0xf7e39f05d5a2801fb8e7612f3042dde6e4223cc2f16a474b0bb3edb97facb5d2"): true, - common.HexToHash("0x39ce22498f3ebcb242b881b491e6834fa91b90b1a9ec266678386bdef8a2b22a"): true, - common.HexToHash("0xb297f291e11c6bc44209584e30de80140b5446efc9bfc88c2e7d78b0530b11eb"): true, - common.HexToHash("0x9ba1570940349ebabad3106d56ba84edd760588c507ebbf4d7c8fa17ba8e853f"): true, - common.HexToHash("0x60f9948b41f8fe6e942014209fb50ac85d73786d52e16761c20be9f730f04bcc"): true, - common.HexToHash("0x0535b1198131a17501710ba027e113bf106eb1f2036a48a5c551f1efdb9a9e97"): true, - common.HexToHash("0xe7f3826aadb8cf7ff7b9c26f2dcfc8eacd72f429c6b27c1bbeec2b007e2fd19f"): true, - common.HexToHash("0x1a40f2757a4d86450d9602c121baedc2ad5f77d91155e7bf8bc15fe1525d0a1b"): true, - common.HexToHash("0x5a12685bbed25aee317948a3f37b9e68e1a42aedfb1bf39bdbf1bbb81544a771"): true, - common.HexToHash("0xf98713b4a8e74858b28e9aaad48a423717a81be02884fc8bf8025e75d9803509"): true, - common.HexToHash("0x4536938604c1d864190b9d81b38b47c27f8672c6f8a4ef7307dbda762f37ba8f"): true, - common.HexToHash("0xc573bcaa21236fd094ee51846e5c088a59c7421f915ad7f3716690570dcf2065"): true, - common.HexToHash("0x46cec227197d92df065f291ffb9eadb05639902910128341ea0c1c5586b146a2"): true, - common.HexToHash("0x0605c9513c755394f4d0a4a6300a9df6628211fc5243284bd143a825712328da"): true, - common.HexToHash("0xb098d2c3ab9799c7688d457f62fede45b25b3a00981883ba0efca06b7d014dc2"): true, - common.HexToHash("0x3aaba64f3329bcf760bc9230c23c3f84b3da0d7bd2a85e84e1628fb425ef17c8"): true, - common.HexToHash("0xebdfbfe234bffb9a34a3e1623c8ffcde42793fdb5a009b47e80ba3e5d3efd6d3"): true, - common.HexToHash("0x0f51cf4e9d8125bc8e9d09d0d73c8a8f4fad540d86d387cec0a821539be876f2"): true, - common.HexToHash("0x6967df6a49fba32138744c7f4de3ff8141208ab6ab821c35f7d091f4898dcdaf"): true, - common.HexToHash("0x875a289706da4d647a60ef357e0e208a29b34b95ff12720dd5af22818d7560db"): true, - common.HexToHash("0x8f555392bfe149808234f60813e0c376817c6d96652a63431353557a66a25105"): true, - common.HexToHash("0xf09d6539f41015e5dab6aac4c3554364e014838132931869c97b0f31e2c44cca"): true, - common.HexToHash("0xc9df225d2c54e677e25d7d55c1cbbc72166c46e29fd96c44e63a6fb5f7a0e916"): true, - common.HexToHash("0x0083829b53470f4e3fb8d11f15c211f43637b81ef9cc13bbf8fdeedb1110a7e2"): true, - common.HexToHash("0x1639841e07b993ec284a4a2d866243512cc050e001f8f3765349b328df783fc1"): true, - common.HexToHash("0x584fd053c85f56837c893f080b07776f2e667d26c5e067af5d7404c8046adec6"): true, - common.HexToHash("0xbd618b836a45ae043dded69fccc0046aebbe64da9d7d574064317e978a989252"): true, - common.HexToHash("0x457497388a66322c6a06f255e7c2f86dcc3d4f80eec18dd1b5c95772b487374f"): true, - common.HexToHash("0x945c7b2a490d0ff7bcbc17977a9665a8ecf537a19099456c857757cc1f86fac2"): true, - common.HexToHash("0xe61077744555b2ee6e9e723a63a57e124881affc09ca23ba598033f42a697c80"): true, - common.HexToHash("0xc4512d93810c343d2ca68c739d94b259b5deb22be9d52edee01671ba9a68f9d0"): true, - common.HexToHash("0x00fdd302663d2556cfed7437f43b6fcb3cf850972e2e49c7fe3183fa4a5d4097"): true, - common.HexToHash("0xeda60fdf79d32e2ef1c1cb9feaf363a32e5242fa589d9e2a97935077536b213d"): true, - common.HexToHash("0x3b244509219cbe5eddafe8b5ef5b51530477010e0a5647c29ec02e0c91cbcf8b"): true, - common.HexToHash("0xbb14c4a3f46d2639f9240d496ba5941750fc5e6f3eb9295eda4d7b1a0c9f4437"): true, - common.HexToHash("0x028a5a074bf932bfef95890b37b440fdc10c14429930cc321b8408fcf665e5be"): true, - common.HexToHash("0xab079f060e7e08e34904b1218b4dbbb38045eba4688fe16a2e2cc17cb2292e6c"): true, - common.HexToHash("0xbba2d58b933215985fa34cc97ac2e60bb0a4d95429c664e728a2a65d3f6e68db"): true, - common.HexToHash("0x3cd96737675329994b381588eec6cf42d92d2b1d1a1d394f1bd6dc8138256ca4"): true, - common.HexToHash("0x4354e30096c938342a5c577de98c3dd2db86af60d5c314d7af9f331239ee96ff"): true, - common.HexToHash("0x9dff119192690c8578e35de233f566a1c3cd7b97272e8225e9f7b12d11a05cf3"): true, - common.HexToHash("0x3347f673ec1261a818213ab438bc0f53e64d74d8f33833e2e6c4b87f86657c26"): true, - common.HexToHash("0x1846514b2eac9a87e79163b107dc36cb69c4e8b8969d6f8c8ff5456893406b14"): true, - common.HexToHash("0x7d486caa096677934df109ec5b2874a127e6c55b5b2e56cfc4990487e45ca712"): true, - common.HexToHash("0xf523fd1974f7a02c3d775f9bcdeb4169416e63025337f8633c5aac448e7020f3"): true, - common.HexToHash("0x89053e940952b53451834fc15a2bd1c876ab536c01a0fd3f49408ee5dcd486ac"): true, - common.HexToHash("0xeadafba6d98d43fc77033d454e0c4e5f97d54780d6fa93592d0f51ee33224762"): true, - common.HexToHash("0x2ffe83fdf178bbf3dfdac99eca9b8b8f140ec8ffa04255a04df924dff723b820"): true, - common.HexToHash("0x25e110ded5dd9141559f893532670cb7c8ddca1c0880919adcceb45566fc5299"): true, - common.HexToHash("0x704ec94e0c94942a2826546fdc0d2e1c292ed3db272b2bde842003d87084db79"): true, - common.HexToHash("0x0505c452105b1b9fd6f1c95543a3e99332f36bc0f42a46b86e000aab42ada02d"): true, - common.HexToHash("0xe5fa19e36600d53e7d7e432a40a18fbcf841722aa5dc24beecfb1232b12785a2"): true, - common.HexToHash("0xdca6aa515d1a1ca869862b07db9361a38656ef4a01f58d076f4294cd1717ae54"): true, - common.HexToHash("0x5c09eb2436068d88bbc5242887e162ee666513a8af2075ba8dacbf9b4471b995"): true, - common.HexToHash("0xead0f614a00915c0948bc627d96b532e12a6a0a6adabf5cab5074e654b14d886"): true, - common.HexToHash("0x2a806eb47ebd6c99b95d2c56b8e77d8789979548c3b0bc95e6b623f28c9a669e"): true, - common.HexToHash("0x51635af9edf7feb9c1885ee5ff3d1219af1ceec438f4e23fa3b5a6f943c7a7b4"): true, - common.HexToHash("0x7dc744e3e11dcba3906471a8ba1fcc3947342b543d338143098fde500a0fdd01"): true, - common.HexToHash("0xda119a3d06feb50212898ea9791c68bd865b3a783c175456f1b5487257470882"): true, - common.HexToHash("0x8c146e3002f454ab8a10425d9a8fffdb4453cd21a940909cacc5ad75c72e007e"): true, - common.HexToHash("0x567886de7b1cf9d013669ae65ff5a9d67484fe44265a2292dcd83b851a237fc4"): true, - common.HexToHash("0xeebe3eac53fdd8fc9e588d89530ebb90514ee42d6059ed770494e67bc9f8226f"): true, - common.HexToHash("0x0e26c2d6a15b948cd6b5a258892570f68dcb546407cd82f0fd4c3ec6d79c190e"): true, - common.HexToHash("0x286f834fbe3edb6dd94ab2e3161df790a610ed765daa4286109c49f7efe72852"): true, - common.HexToHash("0x7613c909e676fc3ce99b18f98f214652a9c6191aa49d327be0eb8fc644026f6c"): true, - common.HexToHash("0x1ea7c2e1d4aace3432ac703e94ed47d04b6f97d44d6b0dbd91ce07726e7b276e"): true, - common.HexToHash("0x3b9cac2436b2d2b632b549b4e8dad8cc2e697d4c8da8e6bb91f3f3603a380d0c"): true, - common.HexToHash("0x9556d24cae361e90545d56039a510e31dd21e63ed3b000a82b6d9c7d11b9a643"): true, - common.HexToHash("0x6638c6a2f389e7a6cb608ff1a6ce8107222c5c7310c7537f2f46a5618ce6d47f"): true, - common.HexToHash("0x5ab2c72a3685b4811b581a064cc9f048fe8dc9bfee9655f988b1a56471632c3d"): true, - common.HexToHash("0x85b44bc494926ab08ed0a5615cc3c22ac726396e453bdeee8f86003fd35110e0"): true, - common.HexToHash("0x7f43c7a99f9ea7535ee6b33b923e7ec0f5a31bd899045820e5f2d06ddce2e022"): true, - common.HexToHash("0x61057ef078f703f852aec4e2f030bd856b45086594892c1c66430059cf675cb5"): true, - common.HexToHash("0xa5b43550f51246341afb329b6b828b2b719f7b9e4af11b6fa20fccc0b4b946a9"): true, - common.HexToHash("0x7797449e679fb435b46c73b6ba74cb12c06eeaf1be2fadb32cdc817261770d92"): true, - common.HexToHash("0x4465909c2c294ba3380bdfa1e997660585bce175b019dd0dc273a420af164006"): true, - common.HexToHash("0x1dc53f747c5425e01cfa3f6a201c1c2f1b9c3254cb559e690b0b2670ccbd1934"): true, - common.HexToHash("0xd4c5db77d6ac2e9baa322a5994e4d361c33cc7a7644b3c8c92196a4e8fb261e8"): true, - common.HexToHash("0xa8914dbf6a5ea3dc0ac0dd728f6e7ce06f7ba837f84ea7b10b2bfe9fb9fc6ba4"): true, - common.HexToHash("0x839b8d7e5aa0c7078dd4469b5e7d6f74ab4710017a0f2f287db87d7a1f7dea0f"): true, - common.HexToHash("0x1923879e9fccb2727d724d61f872ce7298b99e3dea0cd8d3552408abdf693520"): true, - common.HexToHash("0xae459932f37a0ed66023e50720eb3ff6022e29b5f14de50285604a2402d417c0"): true, - common.HexToHash("0x86b8244933ccde87ac7091c43e3af5f2f7db6a581e7fd87a84ad74430e7595c5"): true, - common.HexToHash("0x991bfe95b82e5af89c554c1974e034e965c48ea142039e337d147bbcbcebf7e2"): true, - common.HexToHash("0xb3a418d98e409af53b89a24b00260efa6e56900e37f3767760d37ec39597589f"): true, - common.HexToHash("0x7feadd7ec9f4df78627d5a0b085a1f6606e5a0fb0f504e87bb65a34eaf841226"): true, - common.HexToHash("0x8f37bf7728aef2408a8180a3d5bdd57c690df0db98df039b3225a894ea63efa1"): true, - common.HexToHash("0x39f0477116fd7f003c8c7818e9ec372f8908b7029233112cca5a21a340be56fd"): true, - common.HexToHash("0x42d170983509af58567afa3b0fe7ef7ae1162b911afa530ae130c0da3062b37f"): true, - common.HexToHash("0xbdd9d4f3f7ed8e354fd9f61c075eafecf08e1a345d069c9d735213aeda3a14f4"): true, - common.HexToHash("0x56a8653afb07f8fc9d112770d2a5faf51380d23a3be07a1ff253183480d39361"): true, - common.HexToHash("0x7a66c8cbe6433ec869a14f77773e2ae3068d4481d65b412e0bffd71fcbd25fd0"): true, - common.HexToHash("0x042d750f0cc7d51c40cd408e5107530af0aa0a3c270e46b12a235b8d72b7b249"): true, - common.HexToHash("0xb3cdee4736a10ab8fa938e3eab006e39b717b8e83020eabe0821867cf0893d7d"): true, - common.HexToHash("0xdc28df60c5fb4d75b04bd9c2d2e73967f25be88e771f80d3d6906f9ea8accd87"): true, - common.HexToHash("0x7ea064a75fddf3a07f973c46ffb74ef319d44736a9543f6419597df4b51fb097"): true, - common.HexToHash("0x935117a40aef6d8f6917c7611c8930da07e19998d6e9c357bdc3981fbf9b5bc8"): true, - common.HexToHash("0x74c8889c894f9ff382e977dd6b4044dd159af12ecc51c28b61aa0fbda2d62709"): true, - common.HexToHash("0xc6fe2e22aac8eebf6b7876d6acb07b2ffdc274000c05c9829fa4b2f8ad0d1451"): true, - common.HexToHash("0xe0a58b5e19fd0d2d7664b38d63f36f72bf9cd7a69ccbf776c91e1c6af847d101"): true, - common.HexToHash("0x7063fe302745018f4d028eeef5876dd956d0eaf1f1406b964b1a79f908c2b400"): true, - common.HexToHash("0xb405e70b1bf46a51e85f8407153e79ef47c269bf2e6e251b6ec5a32071f4f551"): true, - common.HexToHash("0xb54923a22ebccc0f9348e7dd23581f19bba6b4873f9f1a19e2174f14500e1efe"): true, - common.HexToHash("0xb52a083055aee0b7f453403629285589e7d226e8d0edbe14762505be376c2e64"): true, - common.HexToHash("0x40428a598667b036adbaf81e7066c182b1fa3792ee3943fc0401d0ca172c1663"): true, - common.HexToHash("0xd065f9a08c1899af3f4a29df1ffd0d2e8fbe1416fe9c9f4ce7df506c63aa7a5f"): true, - common.HexToHash("0xeef0d88f92c5105a7e5cf0de62ee095ae50ba73aef0530bb587f12ee66010778"): true, - common.HexToHash("0xb8fb49dd052ae920638425982813f1def34f7c53c9a0d43f1ecd10607dad62a5"): true, - common.HexToHash("0xeec3dcc3bb64c9ea982bb71bfb1c90cbaf5fbef602c0e99f4cf107401109f6c9"): true, - common.HexToHash("0x044f83ce132073cc9cbe4ce5a889441c38948a44e20fd818ce7492947ebfaf8c"): true, - common.HexToHash("0xff9c56cf9b9b6f332e627eae4f318a1e90c1533343725620c139e892a686e70a"): true, - common.HexToHash("0x6c4e26bd5c13206c2eadf93bef3e47a643ab93849ee7f356f1b5cfae624f3e49"): true, - common.HexToHash("0x272d55000f5f24fef890a421eb5f91862205e5f1b5bc289b22a7290aaf96458b"): true, - common.HexToHash("0x95da70df08067e382a9b85c8c65e4675ed2e8ccb26316ab6bf983a5d93c350d9"): true, - common.HexToHash("0xf80e56de1ebe75d3988937337bdfd0f6582d59d7c1ca00cb3b15ef8a187b1a31"): true, - common.HexToHash("0x9908652a5164daf377baee69d1301a2baf08cedabb4e058daa8397d30e021d76"): true, - common.HexToHash("0x6296361faa7a6c01226f3b2f172a3b3f0d7a3db84ebf8e5d9524cf8ede3652d8"): true, - common.HexToHash("0xc3d345d3f8e5e76f6507661c8130f5011e72f6d0739dbf6a83fa118d6d2c3b0b"): true, - common.HexToHash("0x52b0eda2b6598aa86085c3999c2facb6c8258c8f58476b0827e205d399fd5073"): true, - common.HexToHash("0x7049cfc167eaecf5cfecdbf9c2ed2a0daa6825a694a692c138819628e702c65a"): true, - common.HexToHash("0xab2ee5a4bc9ca1c4abe482035624a9f02158d7626ffbcf4bc1d35e745fb1d84f"): true, - common.HexToHash("0x73a3c59eba1841e087e1860080653ffa7cbc9e4b911a685851a2bbacd8e715a3"): true, - common.HexToHash("0x057bca477099015c26d464d87ee7f48d82b1414d726b7ce8a189fee5af870d20"): true, - common.HexToHash("0x914dad27714b594d564f72569efdfc30bc4e8982242f19f4d1c5011cfdebceef"): true, - common.HexToHash("0xc58cc229b7131d07fbc05c879bba8f19a57484b58be5a09aa7a18b61ff6dfccc"): true, - common.HexToHash("0x309116d2ed2f9eb441fdf32929f6f9030e106ec51d9f3c6807b42a47198a5e79"): true, - common.HexToHash("0x3a054c00c5a8012cd0d111d19a1c49cad8e9095c471c5617c8e30ed5bf28a6ee"): true, - common.HexToHash("0xee8d1fec2781e4950331b75418ce5cdfb054277a2d7e603c4062eee3966ffe62"): true, - common.HexToHash("0xf08a8b3e2f88436a43162561e5d5d9b9d702680380d196d4eb867816c2d60d97"): true, - common.HexToHash("0xabefdb29d256942b188b1eecbd5353f0e8e876ed7a9df26f41c027e376736875"): true, - common.HexToHash("0x6ccaa739ba870181b0a6438c9bb7c7ae4c336e48e4771765f46d5b31ce6340d2"): true, - common.HexToHash("0xede4133355bc6092726467e98db423874d8096b0636456f834ba835f0c031790"): true, - common.HexToHash("0x6ed42723d3366faa1e97a52ea8e40ce64bc94fe8a3bd6a0baf3244c90a929552"): true, - common.HexToHash("0x963187b29a4ba19613cb203287a065079afc03fd90f4fec71c9cd89159453e2d"): true, - common.HexToHash("0xef0053b4e594fbf81909cfacf582fd86f95a15a626663e75236130c09caa4c28"): true, - common.HexToHash("0x7f7c85a71113f9177c59bf8ac650232bed2a41dd0ef3990ab2fe03779c51338e"): true, - common.HexToHash("0xa018d1f408436b66fa8136263777523db276058b8736cbbaebdc8242f3111021"): true, - common.HexToHash("0x30dc0f1f172de1e81f6d333b43db506db9eaddbc4ca8453408fb77ed223a6678"): true, - common.HexToHash("0xc83adb406304d72d56d690e7e91c2cf4d959909e71c5b08652b901fe1acacb2a"): true, - common.HexToHash("0x85f9ebf0840f0689ae549a18c66fd041566419e78cf0ebbed3183f1e6a86de27"): true, - common.HexToHash("0xbb4ac8aec243801bc9fda76e32e4d09d2d93c719b3dc7b30060a26ba97b05d26"): true, - common.HexToHash("0xddff9ebbcb059b871f93eeb2bff28ce7bd5382cdfda3db7c6aefb6d2a5127fde"): true, - common.HexToHash("0xd22826c10d57ef84dbecb6898c4a94db6738348e9ac75d817de1bc1391499c83"): true, - common.HexToHash("0x29d3cf0354b1a0e6eb352523b0a1ce9a9e86e1e8cfba1b49f2c816c8c8b35a96"): true, - common.HexToHash("0x3ce80b5542e8370cd341957a1b73b7dc10b246922a59edeb99ba266d3da4b531"): true, - common.HexToHash("0x6360de86a1eb8e5e8d9edd1e6e69a4bdd067ae7c8eba426c24bf28242b459a75"): true, - common.HexToHash("0x2429abc6bdb4d39c015a0edde4666a2bb1d50fdcc761b843d9d6f89fbde7e97b"): true, - common.HexToHash("0xd425eb5d072eb71024ce2f890564fa09f1af2a6402dd09c05fb9e32023fb1d10"): true, - common.HexToHash("0x39607bc82d45d08505a5b12ad796f6b404ea4b169f21fd3c73a240a3f2cdcd0c"): true, - common.HexToHash("0xf6d020dde38e3c87166ba7f6eb05347f0c401a67c6bd6d4eadd4f4749e86b5a0"): true, - common.HexToHash("0x92f20e76fddfaeccfd21672b2f811f87a748f62bd5f3fde912ca939cd7f27adc"): true, - common.HexToHash("0x5b50e3fb7248f7975a77fa0f0b0cf62b89286053cd749dfda0b4d403dff31a82"): true, - common.HexToHash("0x221006b5bcd01e9eb79242fba179b006ab101f6494f164a0e3d48e39871c17c6"): true, - common.HexToHash("0xd2a76d3ff65894a44d87704c1f82735f3572223ab9341549837c33649a8d6d00"): true, - common.HexToHash("0x5376d56934db101b6f9df02d47ecac5098d84b4a25dac1ef03234b1c752bb82c"): true, - common.HexToHash("0xc14a9723b5f35088f0925820be59f7bf1ae8e393a0a6b8228ed14b0188f1afd1"): true, - common.HexToHash("0x6737139b6e882d14490ff4c81d08b1adafca0e3c6405d834db2c48c384a25391"): true, - common.HexToHash("0xb970867db13217450b6fa790c62c4f2259f61eb91ac74fcff2db97b4d875a679"): true, - common.HexToHash("0x814abae8149da6c1186661d0f061c94167a8ba3c390f5b67d8e2085181d6a7c7"): true, - common.HexToHash("0x7c6bf888146327edfd775ec578420cff9d57db07272590fd6267047da986b69a"): true, - common.HexToHash("0x3ca1cf6d5df1b60c07e78934044272055c11f3068ec2c157ef659d42de7f144b"): true, - common.HexToHash("0xaab8fda84c2e2fcd86fb3f7d5e7d8be9da0a5e6b5bd50eeadba3322bde0db052"): true, - common.HexToHash("0xacb326174b08f26956b8e4c8354fa96f70a80a00aa4439689c45703a8b560a68"): true, - common.HexToHash("0xdf7f87458a8686ed2a6634fca85eb43bbd18194b3edb64f9dfc5ee9015404169"): true, - common.HexToHash("0xe2327324dbcad26f611ec40d531d19251101baefbdbfc3e74d5d9c55855c93a9"): true, - common.HexToHash("0x81b31b61a3ae4323544241fdf98d8062f616e2ca72d6d5fd4b29d97765d144de"): true, - common.HexToHash("0xc5bd34c715067582e8d0c9794c37aa1e21403424ab795fb41d735a25ce1fc657"): true, - common.HexToHash("0x3207e1d7896b91dcc6e10b5afbb11134fc22ba49db627e1c72dae83201f30d10"): true, - common.HexToHash("0xc36e740a10bb5c373e544ebc91b0a7a258c846f858247d6d9551eb4613a0f341"): true, - common.HexToHash("0x923d819ebf615b9a870654c0aad7c44c46ec21806986751a9e62b490297b8138"): true, - common.HexToHash("0x048e942ca74e802e496a7e14550b0cbb2a6cdb64b9a9c30d7b02e31270569d00"): true, - common.HexToHash("0x0d71144bab1c0d36940cb31931b350aa39156994e78e505af07a7c8f59f3ec9b"): true, - common.HexToHash("0x5ccaca52749467bc70c743cf56f5b9b327fca7694d53f3141cb32f75ebbadbb2"): true, - common.HexToHash("0xee851881b496b05ffca87f07f5b0c8b90a4c33fc660ec04d3fc001626e9be2f8"): true, - common.HexToHash("0xcadcd0981ee9eb1598d0d37576ebb67985d4f5d25b8852db7751d3ed73687ab1"): true, - common.HexToHash("0x861f3557f6cbb2e48ee51c3cf8ecd16615185369eb2bbb313d52d1a6b52e804c"): true, - common.HexToHash("0xadfc16c8c7b4d76baa8f96498a0e7769a69565bbb596a173179230aee593c149"): true, - common.HexToHash("0x05cbef6f94db167530b672e2782e74d88e478847f4aa15958206a0a8ad82018f"): true, - common.HexToHash("0x7185c78332bc60faf3d861472011c948c81ff38e91ef3f541ec9bdae2ab914cc"): true, - common.HexToHash("0xcf5031bfe16e8e9dea2c0c9abd91459af981c2dd9a4290523e80ad0a1f7ea514"): true, - common.HexToHash("0xbf38eeac111658019938d99f8fef1590b022a46df3d6f1b86b2046452cc92829"): true, - common.HexToHash("0xdfffec2bdf3ad51a77535a7413e2107b9844741d5916181fbd3076a1f61f460b"): true, - common.HexToHash("0xd58aec8d07d5c1076936ce97aeb63417549f88584b73e9d16bad4cc9042c004e"): true, - common.HexToHash("0xa6c45f9ceef533411098a28fd2dfa5692d5349213913980287cbcf7e0bff2af1"): true, - common.HexToHash("0x94acd4d8a110f172a3af189f41f5112fff49a638c64f95708590493856f38075"): true, - common.HexToHash("0x0604d4872a2f1ef7d3bbf707cf6ccbb6490ff23aab5aa92741491d7268046265"): true, - common.HexToHash("0x6bdde4c713c5aeadf3ea4bd1337859b29d39061417bbf1ce4e25a59e32bff4aa"): true, - common.HexToHash("0x85a21052bcb9c90bdb181d5e39ee24a4e131dd3eeacef3a60efda28b4dc6e072"): true, - common.HexToHash("0xab9c63c2e88bab58ca1fb7c15f293574baec10a9ff937b1cb4bc2d25140714fc"): true, - common.HexToHash("0x8f035c2d14c172d0a341efabde0b2b36c1f079d933f664c2c4b69543c83bf37c"): true, - common.HexToHash("0x51be56ac61e044002a4340ccfc0036dbd3ba6bcba705070750e880f2710b787e"): true, - common.HexToHash("0xe20bf4ea15e50e5fbec6369484d5d253a9b882e461f639d8760d9158a7d8cb13"): true, - common.HexToHash("0xcdf2eba193d719893f6929cfcd3a8259f14fb3d7e38d9532b0246a4c5299c43a"): true, - common.HexToHash("0x748c0d68f8c81ea4261fe8717fdf30d51c6e54d73985132b4374c5ebba5c41c7"): true, - common.HexToHash("0x6d6f5206f7d8e3c29d4a6f43c9dc049f40bfd1d171abc1e6d8a3d6522b357f95"): true, - common.HexToHash("0xcecfa8fc1159f5d4e503f1c948cf32d6cd196561c9fb962273a05b331350e54c"): true, - common.HexToHash("0x009231bc52a49104005a9ff4da595f60c145eb6065f7c429e08f0e0ed2a94c31"): true, - common.HexToHash("0xada60bd4eb147bd54ef0a01eb6828cfdf9d26cf18ec12b516fd3988752eaf28b"): true, - common.HexToHash("0x5495db03e766f2671f78222687bcd4088597bac27b83f685aee00013ea5f06d8"): true, - common.HexToHash("0x73021a88c14ebcb4e94fac2c18a81a51c707ca85dbd9ba6e05c028e5e4cadf94"): true, - common.HexToHash("0x0abd5e1bd58f8706ecf41957821b596dfd13e5d6d8f25eb0b16a4e19e6e833c1"): true, - common.HexToHash("0x01ff9728c0b82b8f241e64f2654079fb50f021810b09647b4c94f3b5765c4de8"): true, - common.HexToHash("0xcd7bb90d0c4e24d76ab45cda061d18932e980956572e40b8fa8ccd5a36177022"): true, - common.HexToHash("0x20f99f403c9bcb3361ecfb0092d46fbf1b2f27189c662a52e73b8ad7affe6a8c"): true, - common.HexToHash("0x6ff45a70c27224598fb246a4d58951d2d837d12baea8583dda685d7e3927edd2"): true, - common.HexToHash("0xc429e6ed03ff6063aea94122b4867677ea8c2fa8ea6c1df73091b94ee90e49e4"): true, - common.HexToHash("0x4f831c5ba2e34f5097eeb8fafb5b470a125c64cae5d8f43c399a5b336a989b86"): true, - common.HexToHash("0x9c306c5d4adca08c84ab295956d613c2cd3fc2adb151897c64d6f5eaf64941ec"): true, - common.HexToHash("0x4cff9399f79d91e3f3e7672099d43fc37848dbd3f66403abfb2ece27e360c843"): true, - common.HexToHash("0x6b6e1150f6a75eb18c5e21a15c33614464b596cbdb061d9392f5db971dda4b03"): true, - common.HexToHash("0x278cf1103647011471906f7f40264c5d31000e42da510877c8d79bcee1dfd6d6"): true, - common.HexToHash("0xc250dd45366e30e73859ec5f720cffc3b7a54991e2d8124ae4f978b14f708143"): true, - common.HexToHash("0xa1d203f3e1157b7292ecf5b01b7350fbc550f11074c8a89b2e0ed749333e3dea"): true, - common.HexToHash("0xf392769b3fc1fea354ed10b35b6a764e834b4bc2bec782725e24039daa32dca2"): true, - common.HexToHash("0x36e8399787003e3301ecca2e0f46ea9869e06bf91ec8fd333074d16eadbc8435"): true, - common.HexToHash("0xd96039fd398f31f5d5617bf5ba28e036120a8efb114073a3f2bb9e323c9c3635"): true, - common.HexToHash("0x9adcd963b2b030e91177c7256b23ba2488f38aecb871005323388c4499600fca"): true, - common.HexToHash("0x18bcd20b10a9fa9f0dd590fe40f64c6ef354f3d045a8db733bc4132738563050"): true, - common.HexToHash("0x4c32b36a6d0dbf011c3eff9098e9222647aacc3b1015508de8989d66858907f5"): true, - common.HexToHash("0x06f7256e0fce940a4a060f22f7290df6395df2414d8ab072dfa5be9bdafcd122"): true, - common.HexToHash("0x9a152c8bdc7526e2f20f877a291bc3f2cb76e8c1d7cd476c365bdd635f980208"): true, - common.HexToHash("0x91d4a10eb24691ff3e6ce2bacd964baf2106cbe6c21a9336ee2ea3b377467f6a"): true, - common.HexToHash("0xab21c1cbc0dcf76b8b35573ca5432f2ce71bc62cfcc5c7279c46d7c50a240eb7"): true, - common.HexToHash("0xde812551c32d35f56f21369175d2f8f23fe2d5648fb64fb76b87c0156de96f0e"): true, - common.HexToHash("0x07b6e25c4d8e32c0d8d9ff2149ace8c2e00ff78017a113a12fb583de56665ca0"): true, - common.HexToHash("0x6a226b9cd43ad82b4586ebaac6e08b55077049a5ed81da0c4836a9d54cf124dd"): true, - common.HexToHash("0x38461785b930dfc128bb9d4a57ba4f376da68014fb6debec9f062245470fe99d"): true, - common.HexToHash("0x70fdd7f21eec520eb0d8ea34c168b5cf1d294e0d72ba3b8e596c617baa93f43c"): true, - common.HexToHash("0x6868c69206f36dc448f871ed663a2190ee0808c701a0d2408fac05fc28929fff"): true, - common.HexToHash("0x42b4dee2d8480e41a7b7971e929675a853b6485e76d38b7f82937495f769e949"): true, - common.HexToHash("0x348a07319773bb266cc875da1802aa12200ffa3ab78b37b25f8f14768e14cb78"): true, - common.HexToHash("0xaaf616b5b808a12a351d998c5e74264355dedc9ffdedc3e9729fa9e241356353"): true, - common.HexToHash("0xa547dd93f2895a17567b32cc01df21c00fc1f911f1aae523462d9ac5a1c562bd"): true, - common.HexToHash("0x41ba8d7d0cfe54f785d13e808140250057d6429250eb34bee4c0f77b5839944f"): true, - common.HexToHash("0x5a6f6c8424fa4fc3f329f9b6f0343a470acf51233bec8c2e79c1fef200f449b4"): true, - common.HexToHash("0x0517691c2c8796ce4c20e4ac50a4cfc4cce8f4a9ccb95f4a27740c24abb460e8"): true, - common.HexToHash("0x452f267df576c018923962ea85858cd3ab0f4e281c034f31ba6432ecde141de6"): true, - common.HexToHash("0x553e6c7f93b604013b9db825235af1af73e791ee60bf312093f8fa2959e1ef69"): true, - common.HexToHash("0x670754543af905583ccf1851aea6c25e1f0f2240dadbe6a97dfcaa432d3e946c"): true, - common.HexToHash("0x6f74f818bbc870cdfdf6f166fa4107ea456d3515c1f5c0cf214de4ab8d8b1906"): true, - common.HexToHash("0x27fc9f03ae370109226a4411e7f2336b26ccac6ea0dd867a6319232640b8c5b9"): true, - common.HexToHash("0x4e0cf7bb3564a0b1761948d9850284521cc7fad89c596e8e5e53168d0eca2214"): true, - common.HexToHash("0x001f75d2baae4c8a4f689e97e9e4d7a287c407424e147bdcf09edc0dd8b542cf"): true, - common.HexToHash("0x1ffabca521d99637141452b9bb1c90edf7d231af89bf0b4229e66a99b42ce832"): true, - common.HexToHash("0x568b548b9f44b4824f2717a9b17acdfc15fac3ad64529f8ff0c6dfc029400093"): true, - common.HexToHash("0x660cddcd8c7ce62c2a6d2a4e02bb570899fb54f2762ff0ac025b8cef7cd89c4d"): true, - common.HexToHash("0x2d2909ed7da8b76f360769dd9b88e78168d493e127e0a90704203481ade8c816"): true, - common.HexToHash("0x1322da3e1463f6e258c5f4c0285f2c587d5e428686349bd5243b77e468ea97fc"): true, - common.HexToHash("0x5e1ea63a4d3de6605de53172af0b5a82ce172a83f4d8357e06c1f22e8b9baaf0"): true, - common.HexToHash("0xd357dea2db3e60f57991161f165f8fa972cb6c7f98b53ea92bb778b1189ba75c"): true, - common.HexToHash("0x35cb8d64a35d770d52956720c728b239a69653baf8867a60eb4bfc7de9734b34"): true, - common.HexToHash("0x18c902aa05d29bb34939724253709817a5078e03689404a19ba7d33fc9934779"): true, - common.HexToHash("0x9283a69279863dcce9a391578640736820aee15efbfb8bfc8f09cb5a103f53f1"): true, - common.HexToHash("0x35e9413efa71916bfb8cd5ee67afb192d2c01e7e2152a04d4e7d1436cf9cb366"): true, - common.HexToHash("0xdd21fe9697331f388fe63a46e2fc76a22fb7dfc30a2bac7e9b838be655804a22"): true, - common.HexToHash("0x81268c9831630655e9bd718d0fa60ef8da9f605e2ed3b7aa1eb511dfe3acfd96"): true, - common.HexToHash("0x657a6feadbf46bc8d7d957e7744ef149f29690facf46e6e1f5be2a6c82e70b39"): true, - common.HexToHash("0x854b6e3dbc0caa8ef5b71ab45e410b735b292db7413fe6bbbf847d68cf93036c"): true, - common.HexToHash("0x2299a499bf9e83451c6b277adc135f93fbb634e97120f9e80c4ea9a0c192da02"): true, - common.HexToHash("0xf1e91ec20d7e1c026a6164329bbd243b760952d2066dc42f8123790c2435ad95"): true, - common.HexToHash("0x1749365486208bd527d3d3455bf539d067e674ca269c30ed14dd5ba89ce2937d"): true, - common.HexToHash("0xd4ce26e49a5d8da3e825161e2e4fa8599b6b4e142f3af3f720464f2188838d3d"): true, - common.HexToHash("0xd93dcac8388d3ecde809dec8984eaf547f631a573853f5b23ae13051ba4b59e5"): true, - common.HexToHash("0x580e764f19b1bbb656f7a21125e050cae4524118c2059fe7407d2357136d644f"): true, - common.HexToHash("0x662e9d3335da8fba22b1eddbf638ed1f9d02a7a71452668c83e6724990124676"): true, - common.HexToHash("0x55037dbde6b37c733fe3f00af0fcc8922417b09ecfeef2a536a409008c4081c6"): true, - common.HexToHash("0x1c8f46639f25aefdbd291b156c24a32f06ae21c5bdabd4159c6f5838b52534da"): true, - common.HexToHash("0x452a56397f7a9001be651ae731fd827977e1e61c49f04eec5b9eb84bc27118b9"): true, - common.HexToHash("0x18222640f4e0c943fbd3dee1a550b132280f9f05c3d8c58c067ea5df80ef9194"): true, - common.HexToHash("0xf290ad1c0ea3d1f0b0d2def1765f3ca0671b06bcfe12d82185514230507afed2"): true, - common.HexToHash("0xe008429dc32d7213fa5af8c18162d9fd060cc705d391da0c137c2d0d6b45481a"): true, - common.HexToHash("0x12938040e27acf40759b68a5292c5cf15251654132d3f41408381b6d2d5c25ba"): true, - common.HexToHash("0xd76131c02bd1bc5aa944e339bbe913131448ce0b5f19273d535405ac6dae8c99"): true, - common.HexToHash("0x781c31e262a99a55fb7970256347fd1f112a6c1dd0207f50b85973c83c469958"): true, - common.HexToHash("0x7e1a1c72470e17b953ebd03824b30d1701ffc384ce06bc7c8ef97840ba19d956"): true, - common.HexToHash("0x4896466c97e5ab1242d671dd3bfada9b4bde77a8a0502c81953ee66771c6efbd"): true, - common.HexToHash("0xc9d5ab1d200da542e57a8392c8accabd7c7ec902fc734ec314dab23f93aab30c"): true, - common.HexToHash("0x21ef1db10b1b4b4ceed10049347ef9b577d05944be58f489b90a313efc230d5b"): true, - common.HexToHash("0xb97ca415ee8d96e2e4ac17d3e73bce7cb04a7e9fa173f4718a78b5e01093846c"): true, - common.HexToHash("0x924bee3cff6d517fcc2c869c02f92e0a0544408d1dd5850fa271583f528ef37e"): true, - common.HexToHash("0xaf5d67064b6b81f970da45e9322f783472fb7b2d672492440c3692b4acfd80b1"): true, - common.HexToHash("0x9e647a0b9c0e59418eec9e5bdb0a0a9cfa567d5353fe00b2476c305dd4343209"): true, - common.HexToHash("0xa010df5328399664988c4cf5124b0202d893afce21808a7ee4e0734902cf9dcd"): true, - common.HexToHash("0x66a66ed6ca594b6dc8618080fd8fc90cefd0aa89f2f56a5a6078e9ad90a300fd"): true, - common.HexToHash("0xffdb97c92d3273c0fd0be23b9142b49ed830c5453935b230e736aaed973a2c0b"): true, - common.HexToHash("0xc8a95e9f34a3c5bc3cb47f3b3c5ce9d3591827024db28b0cdaff71fabc6706fa"): true, - common.HexToHash("0xffe61486462f1a84894eb55014debf71a965aa24303d45cbb0cd63136a54f384"): true, - common.HexToHash("0x68339d1244ba9fd79a351772d0a07587777f55286f21abe7b5ddbb7d5098301b"): true, - common.HexToHash("0xc74d7e1f14b1e238e533e8864c9e108aac1d44307ced953bd562a36dd7bbdc73"): true, - common.HexToHash("0x549a8d12ba4e7a7e782f1ac76684ba23c30cfb793cb2a90dbb2a38d9904bda92"): true, - common.HexToHash("0x22143d01e057f39e27725bd3c912866a8b462d7ecd806913660ea5e582a6083b"): true, - common.HexToHash("0xc28707a45f3fc6c322a2882b1870f01a6a07fce60ad257d8ab27f3d3056d0c70"): true, - common.HexToHash("0x6bc1b7f327f8909f14d777e2ea2f80fc10eaf4090684f478486e535105d39345"): true, - common.HexToHash("0xeb089d06e5710d39379bdd6bd11313df4d94342286d9243534dd22fcb12f21c9"): true, - common.HexToHash("0x02329f9443c033566882959cd1ff8f6ae82c0b6f6c5c3f72300989117726bd8b"): true, - common.HexToHash("0x8749e0a29793e36e41542716250c6553f31f2bd453f6aab8154a260e19c7a5f6"): true, - common.HexToHash("0xdecadc4427887206adc363657fe1022b0c59f7809271867f5d0a3afa6f754109"): true, - common.HexToHash("0xcbb7d1efff2400ab04e6f64954fd312a2f19df162b0d1a1decc2c9bc8966880e"): true, - common.HexToHash("0xb65f4a1b452ef31a1d610ff2cf5dda4d92f12237cdc195a092b4c14bbcc7a3ca"): true, - common.HexToHash("0x7a335dd6f37050df220287a9dc20cb47bc660b11a14e50dba22ca4e5a464c568"): true, - common.HexToHash("0xef938910f752fdf1883fd879adbe1050355d593fd2ef424efd9cc58c5b49ac89"): true, - common.HexToHash("0x8f7cd7c2405de596a967449f3cadfcf672f57d7f2b2e24e8537ab92000e75631"): true, - common.HexToHash("0x9bec4731dab1cb2b3571d959ed8fc07fa3fbd87ac111684b00878f1537b0ddad"): true, - common.HexToHash("0x730a2f6ef9b6b8a4f703c57a2c04069abc5875ef5a2a36262a7ffba5d70ce2cd"): true, - common.HexToHash("0xe0420afb6fd94b3a008c8561d2853d4b542a6ebfcbaadacf629655d6c7d93479"): true, - common.HexToHash("0x8f4a14bb0484b71e9ea16347d995aea337e865ed3d799224eefd20608ef62a4d"): true, - common.HexToHash("0xac30f0d156ff7eb6ff40a268d7799cc2490ea8003cc5590bf6e5dcc2ce5d0526"): true, - common.HexToHash("0xc9e639d695e60ea8e7365ae8b47062f358e2f3796a12410b7b7ab968e27a27d7"): true, - common.HexToHash("0x55f519f93539f4da2143683749954f853561036723efabc43bef33ee3c115083"): true, - common.HexToHash("0xb90fcb41bbbf2e814aea54052bc1e4aa7d918cf208287aac145b5821c1c59bad"): true, - common.HexToHash("0x48af4489c5b21103ac398036b1492d3fd36967a1958bcb1c658f9d2fc26f88e1"): true, - common.HexToHash("0x0e51093ba10a891a0e3f40dffabd001ba2afd8e15cea21598c667a7a1a84bab5"): true, - common.HexToHash("0x33ab14ee21728a7d4919ec924f086f84ca3e2eac0894e289990bdad0cb5a1d18"): true, - common.HexToHash("0x75a6ddc64eeacb083a8c894e4f28b9cc7a0eab6c215e603c61b70ae7497b07e6"): true, - common.HexToHash("0x853eda193f5d67541efbc436daf396b389d6cb466f9d449fcd39bdffd990008b"): true, - common.HexToHash("0xa42bc676731d7484948a82370f0e92c937949a0b7c5d1a68f3a76a415e539e85"): true, - common.HexToHash("0x8b088a1f3f61c3e878df877ed8691823bcc4d7a12fe6ca0ad3d499622ad0090b"): true, - common.HexToHash("0x944529e7669eec534a09b83e238ab7840ef9b8bd142c7274a66fa9fc0a19240f"): true, - common.HexToHash("0x66fe5a827f7b36673baa976ff490632c9cb84159684137cb8aa9b6d222ce97ab"): true, - common.HexToHash("0x1b4689f550a41415f2e69f105494b85e4a8283cebe2adc7f3267c833c0559481"): true, - common.HexToHash("0x90ab2a2f994a7039a97d970d15619e7a9a4d06fe2af36b31dd7d439b5b0cd225"): true, - common.HexToHash("0x691ab2507b0095a0457f69b37bd7108c96c7a6385cc666ac9f16d5c151904ed7"): true, - common.HexToHash("0x6f104772e9919080759a563416419af372f48a7d02d5aa1a3af47b989f5cd230"): true, - common.HexToHash("0x84c7d246a99cf1e380a27df6a1ddd6352e2177a1d55a3a260c962c6ec741363c"): true, - common.HexToHash("0xd3f8c22bfcec9e4aee84cdd4aa6155587e907413a0a314faa9950efcec2640eb"): true, - common.HexToHash("0xe4d61f5993f752c401d068413a5bbdadcb05035757b561cd2027a453b3f1d1db"): true, - common.HexToHash("0x325911b7dc2a995f9303c9e120d8b5452e656b802be452a4a1a35c44ea4dc05e"): true, - common.HexToHash("0x999da7eba9bc5f25293d29b070264bc680d6cbbd26202c08248a13a617914b82"): true, - common.HexToHash("0xc3361405881971cb25dafdc10582e659f184f2f5a0434dae3b92b950cb7bda08"): true, - common.HexToHash("0x6adcc81d8d0d55513a1b2b2bde5dc557f3a1b40782ec0228981bc9a2755550c2"): true, - common.HexToHash("0x1e8e1560f32199b4748eaf9ca5949014c1faf229b66f71b366eec0c3a7cbf6db"): true, - common.HexToHash("0xe558cd8bccf35a212d0c7d3a2f8a2e35bf6881488ba723f4da40bd87aba58924"): true, - common.HexToHash("0x5b1761fd464fa676799d3cfe9f2a204faa08f60a6bfef5b5df09897cd8b72c6b"): true, - common.HexToHash("0xcfb87b50a7730bab265880ec48af75dd77628c91f2b33ef30d2fbdccbba9ec70"): true, - common.HexToHash("0x005efedd50703ed3252b5b742896f20e27255d1b35cd60bc9c132dc36ad5a37d"): true, - common.HexToHash("0x4e8333b74ab9d0a1750918cb6f8c250482c6a8614afc4ee760b3cc72bd680f65"): true, - common.HexToHash("0x334a5572ce87263d45587b9367a8533b8a64eae8814b4566074dcfb237940dbe"): true, - common.HexToHash("0xf0345044aa81e4e1a23c7061a3b0baf690e16673fb1d0d123555f4309b4c506f"): true, - common.HexToHash("0xb2d58e67a871cc2fbf9cb81c55b3ae8a5854ecd86230ae219f0613bcc1954ddf"): true, - common.HexToHash("0xa850b275f9b1e94043cb3321f27afe26ae446c9df2db46ab37d2e5e594476453"): true, - common.HexToHash("0xe578b2d54eff0ea272b992b62d1b78236cfb52067d1859bf9641e9e4673db708"): true, - common.HexToHash("0xd63cee2eca6e0536b4d87ee0d32f0ee42920f31adde850e92b2dbe69760efc4c"): true, - common.HexToHash("0x0af8dd4bf4710b0970b883ffbc1aa9dca2e4f09b9ad827c6e5befb4434efd6d4"): true, - common.HexToHash("0xde986fed7238065ffbe04ab5737723b4ae67d1e050f82ffa4376894301e9f085"): true, - common.HexToHash("0x81ba884fff5db3e1e2c2547d0d489679a7afe24b5d5cc407f4b24e2f100753fe"): true, - common.HexToHash("0xd0c9786bb057afc057c42a63036c7a6425933df3f38b843a11709d9e37cb0a9a"): true, - common.HexToHash("0x0388fc130e843d1413750160933764855347e7712ecebad6b17b657624541950"): true, - common.HexToHash("0x6c6b83c73789ab071d2d4c35735568d1eec094ccf9c54d3455b40c4b3084f3bf"): true, - common.HexToHash("0x2606a1a80ca9a4876d13c8caad651f19730110d673865001f03f3e24274da738"): true, - common.HexToHash("0x687792d2cab7adf400fa2d6ebcef7de067931d52dae717aa2b0c01d1e89c50f1"): true, - common.HexToHash("0x75125d8835c08e41eec32e0b6420bcbd107ed9cd52eec4b302aef936843c82b2"): true, - common.HexToHash("0xfc93a4613fef894febf09a8f2b8262a659744e0df0a626c0a6bfb2e01bbe8e1e"): true, - common.HexToHash("0x8dbca4929a1625fe2161a9060a2d7e77f8991c86f50e39e77007b7009ff80fd2"): true, - common.HexToHash("0x3b24b80bb03776a138de2febf62e7f2dce723d4e3003997f7b245138e044076c"): true, - common.HexToHash("0xdca3a33a4517aa80eba5bf9c37f8ae7a478cb44a6df9bd2ef0ea70d7340e05aa"): true, - common.HexToHash("0x05140c5c7a5a048c549e2c03a43974fa508175190f70a40b34c5e318fcd50502"): true, - common.HexToHash("0x30828afaecee7cc0af583a0307f005c2eb6d27b1364c038880070e02e74b4d1a"): true, - common.HexToHash("0x3de1778f37679b42edb0e67ee65364d7fca9bdfa7b59a905b1eac66c03cdf851"): true, - common.HexToHash("0x7e63a75fc88c07e10fd2390168786d78709fb163d6bf8ece79be0b0be3b8e49d"): true, - common.HexToHash("0xb0621a14b69e8c9cbf55b1a65bd5fee653692a9d4df69a975aae1de77378b533"): true, - common.HexToHash("0xc68bd3981d4e43a2f7a83dd55ebb5a54595f3ca51899cab24a2097a7e5aeb0fa"): true, - common.HexToHash("0x92ebf9f8007b3df5374572ba49c7445f41f94bd14830f86886c7df1e34b6ddb6"): true, - common.HexToHash("0x544370a0934da5536bebdb5ac0ce89a688489777ad12e79514179a8c6f209e6b"): true, - common.HexToHash("0x2d615edbc619167cc87938069748f02f0174cbc0a9462812d25e9e1643316448"): true, - common.HexToHash("0xcb5e6c087ed4105cd77221e48e199307691bdb7aa51275bd3db7be8d120e4dc2"): true, - common.HexToHash("0x2f18f629f58bac44c2e3997dbddfd683295c3380b127e09a67a967b17ba0e445"): true, - common.HexToHash("0x1f940a37feba62cbd0fa2bfcc3f6b0426d274c069ae85d743bda955f0681f434"): true, - common.HexToHash("0x3103e73ac2bd65aa68795779602126b520e0d36df9c4748032dcc58330ec1b47"): true, - common.HexToHash("0xae16dc55f4c7d605bb2facdb16e9c2c80bec51f1513cf6bdc0234ac4cd972e88"): true, - common.HexToHash("0x1f4ccd1086641d3d0a40ee198717bfc12bf6322e323c2173ca7ec2c21e46dc06"): true, - common.HexToHash("0x2f623530fe41907305fb5738abd6f6d6462f2bc520fac169988266262a48ce9f"): true, - common.HexToHash("0xbe3c7a4227b390d8479d07716fc69f12f0f9ac40adc108f4ef6d715d5b71bb40"): true, - common.HexToHash("0xe91145baed4c108ebda0959263b994efd856e7b805fc981beb29bf828ec8b061"): true, - common.HexToHash("0x0f4bf07d35d887813352e32c29b8fd0f8a36947303f74a1291a688f24318e57c"): true, - common.HexToHash("0xebb3ac94f8c691f3bb6db49a0a7b38da2cbf16592aacfd6f4cabd5db20d7c7ca"): true, - common.HexToHash("0xcb7966cc4fbc768d88d51f411e0aba353773daebff5900e84773a04ebb204e34"): true, - common.HexToHash("0x1eb7f95c821072e6ba31cdfbbc7a2007902df87c809f3e169ae5bc7cf65d8407"): true, - common.HexToHash("0x09446d49fa203875c14e681d33bd9f39e020efcac054f1b980fcbe556f581f76"): true, - common.HexToHash("0x72795ee9577ed0875befde47ccba74e4dec4ae85ddd988c35402be675b42bc3f"): true, - common.HexToHash("0xb9dcbbbdf9c5ac58afe14cc7a71bb70afbf37a0b216a7e69c579b4b535b9a45c"): true, - common.HexToHash("0x38b947e883b2cc5139d1f9375ea8a065aca59ee086ba54fc2eca58c7c2538a82"): true, - common.HexToHash("0xac6bd289ba038a4165200fb498e8750e5b679e1be9464b475a1bd67e8b59924a"): true, - common.HexToHash("0xfeb54023f47074ff3803485226df87a5c0e50f3f2c0eb2817f68c3739401bdc2"): true, - common.HexToHash("0x37d7d4822388a0d69e509dd2276c51f2a0e26e5fd0a3d357597917e4e98d9f57"): true, - common.HexToHash("0x126abba68607aae9ad56a10eae9a107004266dcc5092acca193d8d5e3d97e4a9"): true, - common.HexToHash("0x80ddb3601f9a9f71673ca72119e216bde7324b0239aefeec3e84f9967e94453c"): true, - common.HexToHash("0xa01f543207b5e79ee5deb0628e26e545fabdbc7e83bc5f83d407bb3a9430cda7"): true, - common.HexToHash("0xc5078b0f4b40c4d2a74bd97aba25559c49456a653c99782dec8cccd38f9e635b"): true, - common.HexToHash("0xc7d1c668631bbddda8d64d4dd04068fe2bbcd99d9ac2ea94860bbd5dee21fa46"): true, - common.HexToHash("0x9e5e5e82c0b72816dbf2fb3da9921354a66a89cc272d20fb7729faacc337043c"): true, - common.HexToHash("0x6b9a2bc7b273e934e40fd85c0de41e0237e5ec9afda1caf91867b606cbde4615"): true, - common.HexToHash("0x109b2453018485e563f689fc6e68af55d27a5886b68b9deaf819339975547114"): true, - common.HexToHash("0x4d2bff29493c5074d0f5b3cf276525b9ea629647164a250afeb4fbe6b020a88d"): true, - common.HexToHash("0x114556a39b8a33df8c1bcd257b36bc9eed72d14d50d588586bdef16e8867780a"): true, - common.HexToHash("0xd62c1307e3856bdcd0c10db8f67b5b8352fa3931bdc95a7d7d400d2dc46d2d30"): true, - common.HexToHash("0x0119c7688fcc3a631bfe81932b4171e9e226cc611c85a012a8218aa569398704"): true, - common.HexToHash("0xc869495e92b9b3a4d5df8bf27730d0f6a03c677013d28e32467cb76a19e61577"): true, - common.HexToHash("0x997969b2c70143b2418757b86a6fcf002a83a52c4ab58c0758a4f1f5b6744d83"): true, - common.HexToHash("0x7fc58255a4d823d10c3097b970b001b455fa25e29ae47bd6df561b6d160f013b"): true, - common.HexToHash("0x9a1cc157f165f7a353afa95ab726a515004e26ef907d736d695838c0ef6669aa"): true, - common.HexToHash("0x6e27dc907a5e41fb6016267d59b6302885c7062bed5fd0e78d4c93afb99726b9"): true, - common.HexToHash("0xc0f001e83ba290ddd10f26402d4372d5ed6411a242f4cc6db45d3be2d44f0338"): true, - common.HexToHash("0x307ef23e56f3caf70399826722f99cc10c5cde411c4d068c6699bbfb4b022e7f"): true, - common.HexToHash("0x179fd1a7b71860d8b5c90b81641cd6554ded4ba8fe6bd2da3543cc78501266b6"): true, - common.HexToHash("0xa929e563ae689fe6cb44d1b8fcf4599fa02927f39789b3ede2ca0614005a684c"): true, - common.HexToHash("0x6e1bf20751923b45538e051406f4205a1e3d672ff89e500e6814a4c6ac9fd855"): true, - common.HexToHash("0x7f304ab18812aa98ed10a1c9255f7d699abd5cb9431f2cf860ec74e5b36b7718"): true, - common.HexToHash("0x005328f84870dc1ab7c0e59ca65248d5ed8cb0fc9b82711c5cc5a124543fbf59"): true, - common.HexToHash("0x1d8daad76af3ac1ca1300d1138e74661e0d3a8e7313632174e6362e377e2ffa7"): true, - common.HexToHash("0xf380e8259bd30d4dd4a6cb01c824b4b980d8d8d1f57304cb9843981570a316e9"): true, - common.HexToHash("0x22f6f8e1cfad60b13cf399ca29679a287ec240f9a710da4e124d3e42727c844e"): true, - common.HexToHash("0x1bbad858ebd511e74a30ca37707547d43f72fe987ff167f8004fbed2118a8a81"): true, - common.HexToHash("0x2e4e671ae15a11a33826107255431401f82b25e30152dd7abd2c30df8a01746a"): true, - common.HexToHash("0x07ddc1f6b581ed537b072d842dba1c0f0ab6c34e3cab32b596938856a540fa1b"): true, - common.HexToHash("0x3dbcdf16ad75aa7166227cb5bbafa68a1a8b657ad83c8f447a92d568aa873981"): true, - common.HexToHash("0x45f55bac1ea33c3dd287f69c1d7d25464891b593cbafd569544d293d93ff09ae"): true, - common.HexToHash("0xd5e33a7f615bde64e4bf23800149adf8cc3c08be50815c69df2d26f4b4ac7dd3"): true, - common.HexToHash("0x6db8b65bd0cd04a9bbcb09851d207bfb880cf447e3541ea2cb94f55bf550086f"): true, - common.HexToHash("0xb1e77ccf11840bb626cd5bba5bf3671da24c33ff304da3a7bfcaf247538df20e"): true, - common.HexToHash("0xc25fa2d07afe60fb2e6eadd9e6d473fd5a0b8790852e14c421cbf675aec35a93"): true, - common.HexToHash("0x3ba975c6ae44c0eca522cc79e20b38590bdca3c988a62ef0010d2090674f261d"): true, - common.HexToHash("0x99e0e0dee65835036ce7eede5f405e52fb220649f751883079dd78404c5256a1"): true, - common.HexToHash("0xc35b247352c7eaeaaee9148640ca7719baf735f427e690a92577d57eb5762811"): true, - common.HexToHash("0xf6151d9c0bbf57e519f8a9188b060d800d9f9454d8c9d170be125ba090c5876d"): true, - common.HexToHash("0xe250021dffa2991f7d86195fecb877da92d9f5ee9100a18baffa047f703ff6ad"): true, - common.HexToHash("0x203c77ae7b82e07c44e60335003ec4fcf7d972c514a85158dde0bd7d02882223"): true, - common.HexToHash("0x35f8477dc39b15359417f02e1076a924135fc41c64247b05d1cd8a2120a29012"): true, - common.HexToHash("0xc399e3c53408b1d079677b361b19c8b5426eda7b4a74aeeaafe40e580a1a6ea8"): true, - common.HexToHash("0x39c854c8a2e376c12e55ec1bd723a6429cabf5d61695d3b062253672e8326687"): true, - common.HexToHash("0xc2f0e2254e48154560342cdcd2a11ae487e4d5d565b27ddd55d164f381f92933"): true, - common.HexToHash("0xf0a20c0bb3da44c9fbb18f85730da0c31e7077c4ddc0d6e2a417d108d9ef228b"): true, - common.HexToHash("0x5ddde5b59fffc17b692f772d074c619b25a4455f6bee8fcafc2a4137493a8284"): true, - common.HexToHash("0xfa31f070ba5ee6e90c94f59fd2b53a7663e91b9c4d6cfdde8c52747a10229797"): true, - common.HexToHash("0x35826109e33193608ef9c0e94878e398202ce3d7e651269992f82ad8273fd77b"): true, - common.HexToHash("0xd340c04a53c88a59be1d90d4b1208c68d12ad84b99584905c8457fa694900c2c"): true, - common.HexToHash("0x3bb95f2f565caf364da81e5b78ccc96b5704a8e804523d348e42f1335647cec7"): true, - common.HexToHash("0xf767f15d66f683ad2c51305da77b0080f0bbaff9c4e3940c925261080df543ca"): true, - common.HexToHash("0x71ce829bc4adb8b94b06acdca9f760ee701bf17080df0f1e40fbcd6c34373c77"): true, - common.HexToHash("0x1d871205aedc16b3202d4d2378b45a069b28a861cb7b1fdeddcd0613646fedb1"): true, - common.HexToHash("0x2dfbee282487cf15ab60760c185cadc9a0ce0875b8c9563096b4eb34293e7d1a"): true, - common.HexToHash("0x16e0615ee92232f799aac90674bd8898f56420aea16b86f6c6796c5636a35bd2"): true, - common.HexToHash("0x76a2c250c253c6379c3d7db4bc8b4cf8116eab0823277cc6801445afbe311723"): true, - common.HexToHash("0xf01a3c2ce7158fa09eba86e60b4453d85402a6d95fad4fc72ed7c4e091d36bee"): true, - common.HexToHash("0x64fe5526bd473ae730d589cc39e303d9d33c96fa240844240205a09cf7ecd7e2"): true, - common.HexToHash("0x83e9cd8e83a7d9d598804c95bd0ff836224a48a972e42d8ba1e8dd9f8917d90c"): true, - common.HexToHash("0x57d30981668192e73aa4b0f1be18b8a93d31f5b10e4a9aefa2b74dbe4e03e826"): true, - common.HexToHash("0x77217b58d712492da1a4cb4ca805e6b7e8900f29953cd397585f18868b495cb9"): true, - common.HexToHash("0x4b3931dcf52b828e3a0e92f36e678b006a9ab74f5e970b1069866a688b45076b"): true, - common.HexToHash("0xee5783814443e5070ddd0fd3d2cd2b1e60a7e05ce764d8d199100d79fb6c669f"): true, - common.HexToHash("0x7f0aa6ecdd3ee4d42cc895cf25397c02fe9eeb28db62c5d52fe8328f874f2ed5"): true, - common.HexToHash("0x8eef149eddfe80d3f8a63ee5c2fcd33db9f45b10ad03e2daed7991e30f3a24aa"): true, - common.HexToHash("0xbd3d264fff52cc23be949e0118abbfb73ead81cb8c99b1b2dc1b92f551132984"): true, - common.HexToHash("0x52054ec0263e344a07c5c4ad4ffebcd1f76885792bee361012adcccc93e4c789"): true, - common.HexToHash("0x03d596fa7fefa826a1eb8924d425c37fd8393b54f35d91d3b9618d37be0ec3b6"): true, - common.HexToHash("0xfdbd705b99e86cdc6c5dd09ec3b1696e50ae329a3600b19668d7fc56e986dc6b"): true, - common.HexToHash("0xfe9c968f456a0d3089d8264abe46f5ea271cc2e9f964d52725fa809bf36a708f"): true, - common.HexToHash("0x69732af1e33cb737ad0c4dfb6f75aceca32199441c21c30641c39d6b29056cc6"): true, - common.HexToHash("0x6436082f5c2789facae67662ced451e51f4100eb7fe4e17165b3a15dffa4da0d"): true, - common.HexToHash("0x6397981a1bdf06d85a897bcd10fc463e4b9db2ce1d41dcdf8a8aadc11c937ad4"): true, - common.HexToHash("0x33962ce4a6d8617a9513bae389d4b9e38cf0f574105db5df6c507c341bf19858"): true, - common.HexToHash("0x6d1faffc720fee5a58a2baa7036368a034344f26ce27fe022c7a273592f99384"): true, - common.HexToHash("0x234db445382fc98fc99f6360ac642e5ab70787d1b0f44abeb92698ea8cf518dc"): true, - common.HexToHash("0x6b359d09cd92e01f7e158f46795594f4febda4509326c3dbd4a42010947a74b6"): true, - common.HexToHash("0x718148c6330d03adbbb9051b3b0e450ea2f76c56b0487be5a510598e2403234a"): true, - common.HexToHash("0xf2e6103fce0141269eeb71c1c77fc46253ea7f904818e0335afe6bf993f4a6fa"): true, - common.HexToHash("0xc3a02acef0d89e56eee4cb30846640c6b8b3f5f63ded43923bec056589c0fb63"): true, - common.HexToHash("0x6c42071bf4e0f827147a42fc76efb26b5ecc68920db13137cade5cfbc025c3eb"): true, - common.HexToHash("0x3910bd554ca0fd4966cc6e87dbbd0c27b1fc4243a2966ea4703b753bc1edc626"): true, - common.HexToHash("0x64a7e9b5848280318e30bbfcc35a93dc7c7d2b52307de6d162b2106b0b6823d6"): true, - common.HexToHash("0x012a20676dc98d29b0c77fb6b26b76b9249412611790d399ceb4ceb5d764b713"): true, - common.HexToHash("0x28b51433cec864ddd7a41e380205ba83e608451596cc1c9ed0c304fe1c491593"): true, - common.HexToHash("0xd49836d2f8a04e8ebe9a78ab4cdb460292cc71e0cbc93e26d8f107a865bd3202"): true, - common.HexToHash("0x2698839b17e503de50cd89617e48ae17223d7846ff37431e719787a5a56d9691"): true, - common.HexToHash("0x33b7bd22fd32d343a1a4c06dcf07d62139de6e4c16ceb597fc5140c24bc5d40b"): true, - common.HexToHash("0x73fff7db87ed5215af2efa4ab4e84cbcb1a3c44fdf78fd57d4fda20b81a3be46"): true, - common.HexToHash("0x6af873743fbe4cbea7ba7ac2c800e84aa1593ae574bba717245bcf8f3682eb33"): true, - common.HexToHash("0x32af5aa24a6be9770be78f7239e0f2197ecb7be3251eccae4d25d110d6f889f3"): true, - common.HexToHash("0xa7aa7003c3a8896aeee97cd93c24d6254c1344e377a71d822a2a7252df255d8f"): true, - common.HexToHash("0xfae9537ef56dbb4d38f997aaaf8bcb0741597496ea5d85ae58492b670936691f"): true, - common.HexToHash("0x2b1165a438623c9a25f129b6f8d978ff26729cc90223a19038c7f6746939202b"): true, - common.HexToHash("0xc641aa88a0fe8a2d36d29ce23fcd87bf5a0473c338f6d0f75b2646efb722727e"): true, - common.HexToHash("0x65729195e212730b8aa77ae92f588a746d9a1486798e04bf1ce7cca1147c3941"): true, - common.HexToHash("0xb9b669233fb2c8741f65e90fd50e313d214be4939f09dfef275c57228bcaab99"): true, - common.HexToHash("0xe8a2b3372452c58b5aeb7ce9cc5adaea97f5067cbe8d0406ce45b1384d0bb1cd"): true, - common.HexToHash("0xcdef088cb30908954d3c910a46fbc173d522efc4f0075518ce8c9b66265340f7"): true, - common.HexToHash("0xa33489e091cfe44b55af6a5d4f18996c664bdd4876a6464a699a560f8afb85ef"): true, - common.HexToHash("0x732d730e061931d8eb18f5158a28692b6d062a7cd59fc33ae00c639b6a7b6f48"): true, - common.HexToHash("0x99efdfc3d9c9f0773a15fe70a8ab52dca5981d82a393e411a29709d832be87b9"): true, - common.HexToHash("0x20450820c0ebff9edce7584a5bd38602ea41171ba7e5446d406fea0cae30d95e"): true, - common.HexToHash("0x02a1ab8efe76fbb67bc56610503c359be801062f87757934002e1e0a5a76fe08"): true, - common.HexToHash("0x565a385ced3c863b127ba4a5152acea4a37a1951cf0e99795addea7310920d32"): true, - common.HexToHash("0x578eada9dae6d74155ba865561772c888b3a207e39d126759886f2563591cc32"): true, - common.HexToHash("0x12cafeda0c138c491d4a120c3607cc52e5a74149faafeec384cdc1774aa9f4cc"): true, - common.HexToHash("0x5a4dfada60a0924278d436159ff70b20847c5fa9dc0c91c217c514e57e276323"): true, - common.HexToHash("0x021c2c990f21482ab4b313fcfa1b894905bc64ff3cf00a3daf928fde83877c0a"): true, - common.HexToHash("0x0318637ff57300c1f6bde2b719799f0071d40017c039be407e65366952b33344"): true, - common.HexToHash("0xf90c365ec8f843445065128e87d28994fbec47cc51311424bb3604991a2838b3"): true, - common.HexToHash("0x12e30bfc2457c43fdeaa91e0e7e39253c29aef04c1eecaa83091a38bb680931f"): true, - common.HexToHash("0x41e2fa3e49f174bff3c82a309130f365c23ff0f89a6f7ea4d42a4f7c5fcedf4c"): true, - common.HexToHash("0x7ed1b91fb0cc3b2f3b850e820d205d15e5a8205ddca8cde4e4f3a627032b3b7b"): true, - common.HexToHash("0x18d332be57ca270532976906a239d2dc2f8c4c0f01ed9de8df4ddee3a7ebf86d"): true, - common.HexToHash("0xaeb71cf69312a0f8aa1abda616b8c9824c2a1843cdde5ddaac1264a020ad128d"): true, - common.HexToHash("0xcf813fc30771c0849e8cec0c1197fd901e79becbcd85d7ccc2fdbcc3916f7070"): true, - common.HexToHash("0x664ef0a175e267f48a6e45311640f3227f38bb80c18da15778d993b975c3e40c"): true, - common.HexToHash("0xf3b9194c6ec8d666e20ebcc525355a9bdbb212dbc0fac7c3edc09d464a0eb3a7"): true, - common.HexToHash("0xcfdf32abc166ba0769eb4de84d76de79f537394e646fd480ce9c6209431bf3e3"): true, - common.HexToHash("0xed3f93b80c2bfbed36d8ba188299abbe19e1ca5cffd067f4c0d9ec6aaff1d470"): true, - common.HexToHash("0xff9e44bb49f94f87b46b12e048555ca4ef3e99b42ad2a873a1d0238cf2f28d5e"): true, - common.HexToHash("0x8e098b0c68302cda657ac0c54af0b827cc8ea74b942da18a4614b3d94284036a"): true, - common.HexToHash("0xafe83c3e423a4c33413a663c1c30949cd5d3dbd3d5b053e8b83a2457f08d9b6b"): true, - common.HexToHash("0xb7968dd0fd57cf3a444f7cb2ee5d8e3d2eb60ba6396ad342bbd126b7fb020305"): true, - common.HexToHash("0x3a8452993661adc45ca9b02be417d756b7c1ea12a29f2ce1c5be9789f94bf43f"): true, - common.HexToHash("0xa949d17fba5c36ddb724c8028afd19e488c69f1ebccab1f11b4a662dacd61dc0"): true, - common.HexToHash("0xbf8a9cca50acb2f7eb68fb0bcedf855438bed62a243f61cccdee5825eab8fdf6"): true, - common.HexToHash("0x1225d7132e48e7cb4b0b587956d446e9dea7c57c7cd14d506ed7bd30f4f0ddf3"): true, - common.HexToHash("0xf3e3e80f339d493962730fdec1f46e2b7f150c0a8eb88f0dd1ebc127c2cf538c"): true, - common.HexToHash("0x779410602c6c394802f6e65d3238c749d39aecdb0480cf34f8260b1a622c06e9"): true, - common.HexToHash("0x7687f18df2b4b669336d6bc09361b4b429f63bad1011d815cb3b4ceca493ba41"): true, - common.HexToHash("0x108531c31a6f1cd3ff4aa17c69f1096f3d81c3bc233bd5195c63c0f6d698c6ab"): true, - common.HexToHash("0xc7a97f5d66921c22c5fef7a5b8cf6c0117987ee34c39fc82cdfa043c0fac0495"): true, - common.HexToHash("0x9932cfb74e71ee161c5ebc9508945653445e8a35e9dab15f4e5e511249cd4ed2"): true, - common.HexToHash("0x243be295c6f70c37203bf7e9908565599798e873f6f80f6a9dedb59dade27b94"): true, - common.HexToHash("0x85218959b79b29f3ef21469690cdf365511899b0b07064563eb514c0af3e498a"): true, - common.HexToHash("0xed16d70708d3135438a964015087f1421d71ff5b5c6e261e71424896a8d20e65"): true, - common.HexToHash("0x1a92c3074b87df0e2c72e9aff300bbdc8a6bfed885805df028d08c27e2e93710"): true, - common.HexToHash("0xabdda767d77ec28d030def04912f0330b63bc6306f40207d63ef709d83d19346"): true, - common.HexToHash("0xa94f815665cc2648ac2f0562cb0c8597921f32b2b2adc0328e29e36703ee1d6e"): true, - common.HexToHash("0x227eec59b6923c335431ccbdb78ad1adc08062da32299947a400dc88cd22c923"): true, - common.HexToHash("0x48331a6bc8fe5a0fac1213f809e1e9c3b0ef909632dd8fabb74e35aa7f4b36ef"): true, - common.HexToHash("0x44b980f57960e7a014cd956482ddddac3e50cff3bb8a00cb0cea4996546b3a6a"): true, - common.HexToHash("0x5b515c41fc1d2d5015ed096fc62edc497126acc7e58da7e3611fb8ab4d9039bd"): true, - common.HexToHash("0xc2f3f9c53a7431656fd2fd6c428762566221fc31752e024939a5b1559bc20632"): true, - common.HexToHash("0x1d18b4951686540e5bed764aaf44e0066eb608bd8c9180cb181cb437abcc7002"): true, - common.HexToHash("0x97fb8d8df304cfb9e14183e0220f073236df3ca55e532e338acb237b5a73162e"): true, - common.HexToHash("0x0d06048e477e2d750fb0fd0077ce27d4191107c787ad08dd8607e854ca55c0d3"): true, - common.HexToHash("0x24d05f3e90a7b3ea33352033291834332bff42fda3134e294c15fefc226776b3"): true, - common.HexToHash("0x8949b7a232be1557726c28daa8275d95958f1cf68886d1e3ebd192d99f470f59"): true, - common.HexToHash("0x2bc8228bbb020657a991b6b7cb7546e93c164e711048dc7208d36721c512612f"): true, - common.HexToHash("0x6c13f500504cbd9466b4b7e75aa3c611c7ae1dc2718f1ab6be13c35ae10d854b"): true, - common.HexToHash("0xde40684ab2fc18727f7a749721bf4c83f494fe356fdbaf44d91639c83c000c6a"): true, - common.HexToHash("0x4d0e054bbd4fc4439395b8d79c2bf3dd499b39d99d9033a5bbee57daefb2e7fc"): true, - common.HexToHash("0xc7d11248851152bc83f1216a3393bab10996a123831ace5da482c880a63e64d9"): true, - common.HexToHash("0x1877b77a5073f1260efebc199c60210660350d05f6119067a1079fb49ba349f6"): true, - common.HexToHash("0x79caf0a9d7c3d10cc6d2f3736ef69d875ab6e8eca8a9223f136ff7078c9ea701"): true, - common.HexToHash("0xbc41518dbb90484a6595c9cb58d0c7b0dfa3d5b88bed52f5184b37f5c9c6f851"): true, - common.HexToHash("0x89eb33b2e667728015c698f54d8a107b2f720e10c7074e477e177dbc45ad1661"): true, - common.HexToHash("0xcb95725be3dae543e1bddc4029332714ca904656c8548b72d21b0eb950423b52"): true, - common.HexToHash("0x3ac374ea4379bc276324c98b6d0ee5aa064edcc30c5156a6a944a16ad9b4b1a0"): true, - common.HexToHash("0x0a404fc3c975e1241efdf23c81721364622496747331eae3eba6040e0cf98c9c"): true, - common.HexToHash("0xb2da7e7a7b17ddda1f98ece95da6a5c2208449fe547cb30edd82ffebcd5fc248"): true, - common.HexToHash("0x9426b4eb4631c6845107b7a4816f740d9a05c1501f463ba6baf264118cff03a0"): true, - common.HexToHash("0x3b3e23b8db6264ea8d752b6ebca90053b08f94c5d8e1b84627bdc1f4c170f374"): true, - common.HexToHash("0xcd4bafe6043837999c5708ccb88cb329f51d6eefe4516e8f39bb92bb1383850a"): true, - common.HexToHash("0x15c962cc73837566a1e411e6f42e4506956171e89d03cee17666bc7ceb8b9ec7"): true, - common.HexToHash("0xd4e4a0b0dc18873758e2fd758d8736d44834378f66b0257a38bc8fb9a7a0fad5"): true, - common.HexToHash("0xf5a7aba0c25064e030571b15ad9b782322f06cfd21cebcb9e5786dfdfa6618de"): true, - common.HexToHash("0xd66034fa5433acc4164139b4c4d4a1f2fe33ac9cb84d30465cb98f4ab7f803e2"): true, - common.HexToHash("0x18aba8ea883d1534ae69f2a46e45933d793fd84c6168ab7655fafa9dd9fbb117"): true, - common.HexToHash("0x619470ec53acd9d28950dddf7e2b6196a6fa4b8661eb31ffa16d49a9ef987f65"): true, - common.HexToHash("0x74cfa12ef674d147c975231099b32dd9074812e6ec9981ee010dccd618c54a36"): true, - common.HexToHash("0xf0ef4b83a23d987d22dd47ee9e24f9a22e92f19839da7fbf5c1b3059b318b20c"): true, - common.HexToHash("0x2c052919ddc23c5d1ea6a10ea122961f18e2bced05636c8e9eaf7ad07838949c"): true, - common.HexToHash("0xaff0894c1b2c675849d75ab682f4f03add5a4e4cc36a5fe5bb802faf29f275d1"): true, - common.HexToHash("0x911cde1fdf3ab2ddff7f49972bd2ffd6fd0b188469a4c6dcab6fe3f90f95046a"): true, - common.HexToHash("0x6cc3a29c96b59265a35d4909ef936bbf62cb227b6a537e33bb2fc236665738c3"): true, - common.HexToHash("0x614950f1b55df7dba5ab69bc6252e7ffdc7ca7dc66cabb5b3d8b75c1c42c212e"): true, - common.HexToHash("0xe983e2378e4af8e4af219e299d3b1e2f6f78b51e79cfba3b06f2ae3a27d1800c"): true, - common.HexToHash("0xed3ee18213773477f594770d6369a4124c675ddf7b1e1a1c3559b58420840ba4"): true, - common.HexToHash("0x0993c1852eec64b60ca2313216b35c739af793a40e767feb772f5924d0ca819f"): true, - common.HexToHash("0x1e55dee63fe4a6efe186eaf7e3f81e94eb0e396063265a9c4409fd92b39e0a3e"): true, - common.HexToHash("0x0920aa87afaac2566f3ab8d970b75e439780802450342329bc66e820b23e7bab"): true, - common.HexToHash("0xc4b5ccb985bca9c68eb1bc535c714286ae40b95c6ca0af06ca6b56fbbff74cef"): true, - common.HexToHash("0x7f25a79d2a871df49b1e7f1262e397cfd8292f9adb5639d218209c3e0c792510"): true, - common.HexToHash("0x6a5a7aee02a18a0763e4688838b41c118489aace4461909ef453e9dedb8bf6d1"): true, - common.HexToHash("0x666914bc4a74942cb3008db667cb5248cb3c0bea88f7196b8c0bbe928118ff18"): true, - common.HexToHash("0x9d3ae1dd4066357f0c66e8803a9bd88a2b40aff7c6268df8ea9717499a930d43"): true, - common.HexToHash("0x0d37db727e031fe15d0bd50b1a36e7708c5d07ca76c5747688c754022fed26a3"): true, - common.HexToHash("0x493af02747d08bb132b577612e86456dc8dac888998d59f6e1f1a9ed7ddaf507"): true, - common.HexToHash("0xbafb619733ce295f3debc6ceea9e0b7121307392e955b5423cbcf640f027bc14"): true, - common.HexToHash("0xdef8ed988db37fe1665f23c394abe53254611e91474d3f91279715eeafa6acbc"): true, - common.HexToHash("0xdd6fa1e4bf71d10286bda1306c7571ba918ef2c15c2d31f09cf6292cebbf6d46"): true, - common.HexToHash("0xb6d9e3a39b9a6dfeafcdc3ed374b1dfd640ee3f0aea7527801c971e560d32bd8"): true, - common.HexToHash("0x38bda22aa04392be9b1233e9372be3a2b4be4488cd18bb6f575943e30bb2bb0f"): true, - common.HexToHash("0xea0da17e89e808e1d0e0488f8971c1eb7f284fa2adf62902ea834fae7a5ef7de"): true, - common.HexToHash("0x4523fa34371511388fecf7c37ad96d19bc67e79728e99b4ad9f575699398844c"): true, - common.HexToHash("0xfc44947c422abb57811e9f1a385576fdc5ed891ebf65d3567d6f8440b3410abf"): true, - common.HexToHash("0xc2aa27ca77e17a82db65abbd3c30d1d641879841c8e92dcdef529dbef2073880"): true, - common.HexToHash("0xe68e14175a4c9a820ca76d0b3723ad796c4f39f2b985a19ba36167a11c41b4d7"): true, - common.HexToHash("0xaba4086963a5b0250a291cab2f0ad52ad346e691c9ec4107de4f88c62f7acebf"): true, - common.HexToHash("0xb90f36ac404625becfaa348cbc312b143aaeca4b8d2c073f9081f751a653e368"): true, - common.HexToHash("0xeca79a74c84f99bcf8345d11c50a333a5d306580f8e2d6ae6853a5a7df2c394d"): true, - common.HexToHash("0x45ecda6542124ffad68b393346871a6eafbb241d665ae69d539a37e4c92c654b"): true, - common.HexToHash("0x764c333e212c8d8e2984a3523355c11b6d0e0ad7d627e26dfafb6c76b9ab18d4"): true, - common.HexToHash("0x5d9e11e5fe4c3399145ef5defbf779ae749228568fc06a9ce187176b0870dd1c"): true, - common.HexToHash("0x60a6cbb18cf982a15ca8891e85391d26872288c752f9b32b5922f7c1b953c873"): true, - common.HexToHash("0xefc78199710b8ece59e59d5c9b494e6e460a7a30803a2c1d63b06783e75e64ba"): true, - common.HexToHash("0xc21479a6dedea4d09cf6f7324301cc7d7e1c586ab1a8a395a5da110155b28477"): true, - common.HexToHash("0x5eaa9969f29befef4872264d1e6e7270d0451f35078f15b7ff5e6de7427a1a66"): true, - common.HexToHash("0x57eeabc9ee0225b8691594e627545f1abebc9acef02fef7a56bcae7c44d8cc0a"): true, - common.HexToHash("0x14b50fb1b69a53754f529ac20daac3b360b9daec4ad36934327e4fd073919b02"): true, - common.HexToHash("0x9655c0462f2ce9c1949afcd6c65828e64dbcbe7396280771c5b3a2bdf76dc01d"): true, - common.HexToHash("0xe2da17665e5e7b4e4575e7201271d16b2010d6730b18ec4e8845a6cb74805c55"): true, - common.HexToHash("0x34fd7fed9991a55258b68d746014a98cca3b7f9e53dc8ee434776529d9235972"): true, - common.HexToHash("0xe84c18dbac22b2dc650a08f21a03cc05ee2cfc25996e208270840b65024c515e"): true, - common.HexToHash("0x78e68a0d1fa43b3c6a935270cbf526b4b9809acbf7ffd3e7f223832a3e715985"): true, - common.HexToHash("0xc9b94a44eed0da78a8a8d97f8fc53da9db6ddcbf6fc479f1631450ac961b7513"): true, - common.HexToHash("0x0afa536eea54a2772cdce9ac15746e1b34721ce63d084fcf79e88215dfc2ab7f"): true, - common.HexToHash("0x709297f84fd0451db48df9fc40653749c45bc2bb499eb983a875f2a17b9fce08"): true, - common.HexToHash("0x9f818991134709b75232b9b1cd583c7933f53a3626f53a8e1915ffa25bc0a25f"): true, - common.HexToHash("0x16586b1615e1f7fde6bba04f6c293eb17d59f23f49ab2419730b6d154728aafe"): true, - common.HexToHash("0xb1b75ca3a1bf2e5334690dca8d5eebecdc32c563e5d166bf02daee1ee0d6c4dd"): true, - common.HexToHash("0xf004c8b6518f488ec98bf28436854f6749376002368fc1e5763f7c088abd859f"): true, - common.HexToHash("0xe7861649d9b814d8a726fcde18ad7223947f02e3421ad73d082532486648ebe8"): true, - common.HexToHash("0x81241d726bc8c3b6dfc7b750e71699690bb3479eb3db1eb5806401bbd11df271"): true, - common.HexToHash("0x4b2b56b58067d1288f99aa2a0c688f2c7ae59bf5fd564badaa6dacc80441bd96"): true, - common.HexToHash("0xc2f54f3a3449011648a484cc218d738f623ff181ee2c15c48c39cc063830e293"): true, - common.HexToHash("0x47156e079bec23a76c712e87ae102bb127e6f4ef466e90f7e3d4b007c961696b"): true, - common.HexToHash("0xa5098e98d6fb703829cd516825cbfbea157578d2f41018a0100cd506a1770028"): true, - common.HexToHash("0xd54c9b30c766a3012bbf8b0fc9ad839a2a240470dee59485ea11fe27bb7a0e70"): true, - common.HexToHash("0xc1382b97374b39f3504797de3f54c79272da0a474d9f3d996505b04a1315145f"): true, - common.HexToHash("0x032503a962e9dea6190b2157f14c9d49482cdc94d5bdb5dde32bc2d5cebfe097"): true, - common.HexToHash("0x8eabec651677ca856aa5e320ecd3eaaf1691e58769656f343664e9336bb6eda1"): true, - common.HexToHash("0xe46f257fb378bf3c36afd656cca4a95e0237a6df0e5226d886617670fba2b372"): true, - common.HexToHash("0x59cd6277301b72f2b9b18056207c6b4d9d752228eb79b08d1856fcd36e22c45a"): true, - common.HexToHash("0x1ede0cfe342353f755b32112eddb17e72452d9f50702b09d5f88bbe754fa2ab0"): true, - common.HexToHash("0x18014fb548f53781015b20f5ee7eca62e6f25a9c735da729454aeea1f67a001b"): true, - common.HexToHash("0x1cfc4b514909a2ccbd4ab72ab3e0b8cea80ee5c5c019d447c65bb79568ca3f01"): true, - common.HexToHash("0x48a6d0f5c57c0ea067cd6896fa31638bfbfa25c2c47daeaab3cb821a6db32781"): true, - common.HexToHash("0x6213cefdf183a31736e80196fc6901d4474f451403f86e95d2a23c5f02e52a75"): true, - common.HexToHash("0x86e179587b1b486324f205b9f5af2cac70e6ce3cab20e08199ed77a045201323"): true, - common.HexToHash("0xcf2cba4343f36c0e1c78eb742bcdc6413f66143a311f0788b4e2c3d1e20f5532"): true, - common.HexToHash("0x372578485bbdd5b205ec44f56186b29f3dd40c8c80c8879ed36b5fd34d23a16f"): true, - common.HexToHash("0x0b7d882d82c14bed89142cb153d1b3892d2ac7c05a303c6dd3caef39a9bd53a9"): true, - common.HexToHash("0xbaebf559c6a8be210138f31fc592fe93d3931595979682f12666287244ee3cd7"): true, - common.HexToHash("0xebbab81c78201615e746f577efa08ecc4f52bc0f77a367cd522ed37867612a59"): true, - common.HexToHash("0x0fe3f47a3921bb4f39a95ef3ad15a5f61f50402fb26b6e6cb86e944eff2252b5"): true, - common.HexToHash("0xad935ab6ed92141256add48a73261f9a59267db8f7c6ecdf8a668575f0e7a5fa"): true, - common.HexToHash("0xb0cf173924caac78eacaab8cde4a39dd5dcdefbdd3ceb184f7c831b309337635"): true, - common.HexToHash("0x782cdbb06fb9db35cd09db20253a9e26f930ca8a311449b7f7fa6c7b83c2deb3"): true, - common.HexToHash("0x67540e630c0df14fec4f558d77a90f95155f46f8222fe9f6e6866ead75ec6d89"): true, - common.HexToHash("0xd59f8ba75bbca5fb351bb3f99ff1d7ad40432b8de544d0dc6464ef14b0bff9ec"): true, - common.HexToHash("0x59febde7eefcf06aa6d0d430bc4c803581f0422ef27220ef3be615bb04f7f1d3"): true, - common.HexToHash("0x90babf5ebf2724e49fa40d047d50b25a6c2803e266d71288bc69c4e9fa2992cb"): true, - common.HexToHash("0xbe0a69fa3246da420fa9c4bfd06af8832e69034879eae6fce516626899b1078a"): true, - common.HexToHash("0x36629f8455d93d54d0941d92c5d5023c4582dc32c110cf5d6cfe1744022897a6"): true, - common.HexToHash("0x79806f357ad3d825ff71ab9b4f66cc27b725d0c74aeb62e071faaa5564bd3f88"): true, - common.HexToHash("0x050d55e9a3cea124bc30fa816c285bf4baedec9c0dcea6aefcd8cb6489afea8a"): true, - common.HexToHash("0x66080f124ed80000357fdbfc58d1b470a914af15bd2b6a2b9dc8b2fafd7efaf5"): true, - common.HexToHash("0x645118c201cef30959537eed8918a4ee138ca640939f6545c8a77b76729665cc"): true, - common.HexToHash("0xbbb4ae746aeafa01901de4e19c7779471e655d68a4ca2d50cb95f7dec0a64277"): true, - common.HexToHash("0x5a9bf88cf30c0a694ccca0e5fef92793cdc10e82a2250fc2fdb3687c37c380b2"): true, - common.HexToHash("0x0175c205d8b4820da07a2c58186ac1479593ac8c76b56828e82cc66aeaeedf94"): true, - common.HexToHash("0x5fed84a9c1ff8c1647fa4e30e424422459bf80d088abefcf221db61dfcfc757c"): true, - common.HexToHash("0xd07da4e5c30581e5848f08be986fdbffb7cea1b23d9b94277f682223cc3e9dd5"): true, - common.HexToHash("0x056e61745c741c78093bd0096e121a6db7df65a7e2ecbc18f2550015d347f41a"): true, - common.HexToHash("0x5ad074ef3f03da48789c9d9cf89500e0ace9e74f3812be86598b8d9ac677104a"): true, - common.HexToHash("0xc296b6e4daa170747d4960f57120a90106625610e7cdfaa167ca7aa97996a1a6"): true, - common.HexToHash("0x807669c5f6cb90dc7a3e55c7e8e9e763cb29ba853f60119579018c417735073c"): true, - common.HexToHash("0x2f88da7c6250e0dfbb4ea59361a9d5d6c4728f3855d5b52477db82f96fe33823"): true, - common.HexToHash("0xb266a82d4d48276c344f713f20efe6f289ea06bea90db45ac1c676e461290a7d"): true, - common.HexToHash("0xcaa9bbb9aa4d68f6ac0bcbe84dd02017c21e790b194d5869f0484173b0a4956f"): true, - common.HexToHash("0xb52c1bba3e1f9b4b270d3f98d43ae5f0bb340f4cd4edf950426c13cdde5ae57a"): true, - common.HexToHash("0x1a2ef8d0c5f79fe07e2fb54ff6b005a92ff07c88cd5f65b4ea3b4b68b877e4ee"): true, - common.HexToHash("0xcfb97b067721b91b5bf6e8f95157ba1257da22c81bfc5c1ba0260dbdb1a11d41"): true, - common.HexToHash("0xb588eb437f51f684d91739d7861f01e71b24a58025b19567ea69654dab040c15"): true, - common.HexToHash("0xacff2f8c69a6c29a05cc522bc43884c99e35a88384913ed0c0497915dac715fb"): true, - common.HexToHash("0x3d1864984f50b91bc2b7c4e1855a7f51a598231b525a0c7551b3af57e2b4c288"): true, - common.HexToHash("0x585f4bf3503ef6c94f12552e8e4e443e3ed7f795e759687e3526693a56949879"): true, - common.HexToHash("0x8cb4e95aafa29e62b2fce0682125352709aaff4aac735ac8f2b22bf8ac2b80d6"): true, - common.HexToHash("0xeae8c46ce17450ed1253aa4ea33d36b95ece81f06d85e6e0919ea94a216ab524"): true, - common.HexToHash("0x7973132698c9ff25f2b7f54309dfe9451a0f59ffb6bf5c4481f017ac0629eca5"): true, - common.HexToHash("0xffd776d4ce1b830f0ed0b9e3add4b71aef2c08a86690fc760017d72b0f97a38c"): true, - common.HexToHash("0xc97c6beb84a6145ea34e52f370a750df29d55280949d4ddd620000aeffa75153"): true, - common.HexToHash("0x9b8e65b62358445cac203b866c528013194b2cadcc41e79f461df2e3557c669e"): true, - common.HexToHash("0x1e22e3d8a415ab0461981946e0b8bf7d69b4f7684091d3dd07cc5f837f191238"): true, - common.HexToHash("0x1adb914e555d90e3e7c70ca0a43b0f44ccda628f4bfd1e54a7e7db291048775f"): true, - common.HexToHash("0xc01d378cae8f92dae71cc80043e891562172465002177e3b13ca2d205206357f"): true, - common.HexToHash("0x4ec5c2cd300da62b9246cb4ab6747e799d0e8829e87a602244ca74f372116cd4"): true, - common.HexToHash("0x6bc7949c40e5ef1e9cc51e20f710e582e5174fb19a739c24602722a0a6c1396d"): true, - common.HexToHash("0x407c7c04756dea4190de855de5e14fc9dfe0c6de9643077202cb3771dee4dae2"): true, - common.HexToHash("0x9070bf57afd58027c91f5f02206440f7363594dc0d00082e0032ec416dfa210c"): true, - common.HexToHash("0x6c4bc4a6f6e291d6148eabf473d0dbb8435f64cd5b2739fde119072e49e7ba45"): true, - common.HexToHash("0x4ee5ec8fd25aa00bb11e1346c71986c8ee9b71cf0a46ba6266a4a93a2e767047"): true, - common.HexToHash("0x1b4023781d3e1f571b29ddb9bb84ba080ed17b5d921fce7fda066e78808305f5"): true, - common.HexToHash("0x7e64dfef3233adf95406468d48508bad1eefa2c85cf989f353c1c187b42ea19a"): true, - common.HexToHash("0x5bf830ea0d6f8af169db304a252db03ad6e573d922cc063d03d2a8a6b646ec04"): true, - common.HexToHash("0xb67bfea845392e0fc2b1e9cb908536edd007cf98f83ddb1f5b5e6b416ab7f6c4"): true, - common.HexToHash("0x1f0339b3a239c9d52cebb75785d57dabfc375138005e3fe339e968c6e16f5cf3"): true, - common.HexToHash("0xafd215ba4e33ce63130d429c9281885f81f2794cc6d8509cc3f9053db3ff9932"): true, - common.HexToHash("0xd901e6130bdb2991f6d5fb0a6bde0ca3aea40edf45b29979d81254594b694de4"): true, - common.HexToHash("0xf7f31f41f70119836347a226d3e3996463ca9f48379bb8456aca7013ff94987c"): true, - common.HexToHash("0x880f4743cb8ab4894f795ed6a796495bdd52ba21eab374c8728d10d598da359c"): true, - common.HexToHash("0xf3a926996547f278d5d86c414c00e0ed2d536f01c5f124eee5bc32e40831e124"): true, - common.HexToHash("0x3873c12aebf53284db4f70731cc9f7b7e852f793b27f3f7b301ffacc93364493"): true, - common.HexToHash("0x8cc48dd1480ba3a2380738064fef4490fead2c2fa50ef42d0cd5ed64cb7515ee"): true, - common.HexToHash("0xedf32bd84d00153b0c8073b6bebd25e08ca6b1d3b71fa7d03236261a81f32d58"): true, - common.HexToHash("0x3280671688e39363957ba70bfcd180047d2e48834275b22d72f9c661e3e90550"): true, - common.HexToHash("0xac6923b20ba37e5e99178654f2fadfe15d896a09fc028e0c500ea5b2561c4992"): true, - common.HexToHash("0xd6fcb37d33afe4a355672763b0fd0b45a94f805c94bcb3fb22ec8a38ef1c415b"): true, - common.HexToHash("0xc3aceb0f918725a5185ce17df75c9295bf4eef8b4d25d9d52d1806f87c9ce1de"): true, - common.HexToHash("0xadbca754d72535bf0b9c8874898136170e3a68fb3fc78286bac4124438f6ccb2"): true, - common.HexToHash("0x4aa35333503b8777bae7f93f3e28893a284f3c70e8d5a1fecb2e615db3b50ebe"): true, - common.HexToHash("0x6aa8f2e145ada0eed958ad2a2a13aff017d3374964385465f5052cbe4ba4887d"): true, - common.HexToHash("0xa0f69f7722d88cf8cd4e3b945b66e4ec7af292e2aa42f1a938250e17724a225f"): true, - common.HexToHash("0x5702553c7d31e3b4e3bf4640b22b51020eccc2602f852cfd77c3d51682fc3777"): true, - common.HexToHash("0x5ac146e0b238f948ddc24683646c3e33fe15f1686c257e5043133db46b304b92"): true, - common.HexToHash("0xe23dcff36e4cc8c7846273a8e6f168fee4d0a96cc0c9de42d1a389d402fdb1ec"): true, - common.HexToHash("0xd6e663ef35e0354a8d5a7e0fd58660accb42e2af8f34d3082871c0a017b0cffa"): true, - common.HexToHash("0x319a1b37c4726a2667dc39482b8121f1f54166bd9d38b825ebefeffffadcde6c"): true, - common.HexToHash("0xbe4fe6a861ccf46871cf9e67ca62f7b75a84710631504d8a3fd53af31774acba"): true, - common.HexToHash("0x4ce3136788c655f298be91459efa852e3af110f2f9c6624d354128c6ab42d440"): true, - common.HexToHash("0x6aca4e17ff711d4427e50fb6142a63d1a863cf7676ef2a5551aa7a2c85b63605"): true, - common.HexToHash("0x4d732fc63838cec2bb6bb4fc9dbfda11bca68d17cbb9ac7d3f90acecc4470b4b"): true, - common.HexToHash("0xd83c1744f50ee4c63f6065997703d92bf6e4552ecd862437ff8f843a8f593a83"): true, - common.HexToHash("0x0ecb31398518bba6e07011d1e814cd71f6fbd8dbeaf7b38955e5c861d987b226"): true, - common.HexToHash("0x2176110bc4667c8a132e4fb44732e3795fb89f3806f64eda6a2a593af95bf564"): true, - common.HexToHash("0x7070a7d1eda8f17b6cab865fec08af8a14167d17bc2497c0d12e4ac4350ddaf3"): true, - common.HexToHash("0x4faf4253645de9a199e42a8324e3159494f264b44f5f7583ea09a8ff4aa33599"): true, - common.HexToHash("0x5992404c91010a57c65553a6a58a83e1f966b5c73fa5900a004c3556b8b6911f"): true, - common.HexToHash("0xd7c3093cc406470a4c45e6c8161f2455b15a5f247e68b4c3add4f42b7ac4403e"): true, - common.HexToHash("0xfcc37cd7e6533aa8e62e6ca113a6a72d229708e18fab189f066396d5df1ffa2d"): true, - common.HexToHash("0x98d9192326d8dfb0b7f3ef0c13a603b1301c5d228220a7ee7ba4eceed68287b3"): true, - common.HexToHash("0x96a581090517d649d7598ae62b868c1e61d2a29e370f987214a77728d58ea739"): true, - common.HexToHash("0x066f04a9526d0a4af71b87dfa51d65959964ca44a40b051f0847ae88516a630e"): true, - common.HexToHash("0x4922144729ffe48657d2e716430ee41f6d3e8095705a60996c469007b560e0b3"): true, - common.HexToHash("0x7ebc7f2d018dbd0a1f4e32aaa7c8451cd82a7ef07ede3a2637bf37bfc6e0e244"): true, - common.HexToHash("0x434fe668c59804920e01e40445efbc60c200167da75c947b8042950eeda64422"): true, - common.HexToHash("0x41cd4dc0703e6e386f7cc378242aed44036a4d831ff960a8c47766ad92b289c5"): true, - common.HexToHash("0x174493871ffc28f361293ea83b372058e3938ce5250dee35ab9d852967e255b4"): true, - common.HexToHash("0x4bd68c57a79ef23562d8979c4467c525dcba3eaee1cd8044eb664027ba72f997"): true, - common.HexToHash("0xee8c84ad9fd34399c0850281ed50e6ad3fadeee69ff956e3cfc4d64287c35435"): true, - common.HexToHash("0x228aed0d85343d7347b9c34a14c6e77431a17404209b73a2473e1df86a8990a5"): true, - common.HexToHash("0x79cf509d7e31e920b70dbdd46734eb9a16b4be5aeabb186a00f3d0b1133d22fc"): true, - common.HexToHash("0xbed0993d51e70d54c286d361ba02e0f5c58eefed144aea783dc27c428fa74e2d"): true, - common.HexToHash("0x347165cbd39356a779522c79c961d90e1ba8edbaca050f5f8b22d7d2e35b9d0d"): true, - common.HexToHash("0xfac3ac33750b8dcb42a87a2af0de123a0101aec1aae57e333516328bc4083f98"): true, - common.HexToHash("0x88a0de0ba0cb38bf54368a92c0f46abd7140d43ef0c180a38fdcc5e59703f8f9"): true, - common.HexToHash("0x70616bf86559556e5041cba65b81e2b5f19b28a91da6883a8a1d21d3e91a4b80"): true, - common.HexToHash("0xc6d8bb9dbd3e808fd5755762d18dda11118b002d1357a0dec26e375202ca1841"): true, - common.HexToHash("0x05f74adbfd5fcf515b42e2d14481ad724fa28bd67621e2755ad33043cf4891e7"): true, - common.HexToHash("0x5dd5f86d143cdd6e6ddd63502abfa7c1348d255edcf47ff72b294075d2bd4ae2"): true, - common.HexToHash("0xdca9518a95fdb45d69fa3752b53a0945ec9cedb46eb332ca449cb3b264661d34"): true, - common.HexToHash("0x65c3ae0f0d60639b6810e5ea0612e2015e73e6d08318c29c8e02a6b2a43d5d2a"): true, - common.HexToHash("0xb1f603dec0393a64058dbe282b0489798f593a8c0f309050dc8589b085889849"): true, - common.HexToHash("0x01deb1e4b8c8440a17667006ed18e44475dba3c83c9a8a98a78a6d759196ebf0"): true, - common.HexToHash("0xe08870362cd8bbf28a2af534a43db186090b6eac86f77054f5c2cbb74aba3e46"): true, - common.HexToHash("0xc25f1bf94906e7ea95a5b807a928dc65608496d453eb738e6471422191557835"): true, - common.HexToHash("0x69dfa85c46f7e92f5427eb416229b8c36548d2e52753b03ed275593f654e561f"): true, - common.HexToHash("0x7119cffcedcc2b672938d7d7d57c06d582345edcd0877a1fafe46463a1323dd4"): true, - common.HexToHash("0x5748cdb427edef0d6babc87efb19585ec15e4af7f490195606af1b0182b7ae3e"): true, - common.HexToHash("0x31a9f47438649e3bbb5d6cd0183613032149b149c5e4e56c4c9785d04494e6a9"): true, - common.HexToHash("0xc982b849f39c7cc92560b74b099e4763bfb2493cf926bcecc6c50de641edb90e"): true, - common.HexToHash("0xb6cde7fc0f6ffce24c5548fbede40bcc15cbc9b7585fbedb17e3055aec9d7d7d"): true, - common.HexToHash("0x8c3d1bfb182d5e284e6699e87683cfa73b1b22a6f71fc53d9ea16b91e710e4de"): true, - common.HexToHash("0x6e836afaaa2305e41cb9ec638b625bf1786e1215d09f3bf89fffd2b0ff3a0645"): true, - common.HexToHash("0xef832f0a7ded94aa482e71a8337960db9d74f9448d2bfc6d088a6004fb01d925"): true, - common.HexToHash("0xc5ee55932b54cdc147f454e877188158d1e33cac113eac1c814d8d562b1186a5"): true, - common.HexToHash("0x9d51086543a5af15c32dcea52f10f26a11e1554db6985e04cc6ec751fae9c5bb"): true, - common.HexToHash("0xdeea30c19f1c77c66ebb9a9601057c349f218e50871d2d18afa4c307738eddcf"): true, - common.HexToHash("0x96fc8de45f17cc6d29848a4ed708f29d1f604adf3944865970f94c47d806d282"): true, - common.HexToHash("0x62f39c06d266e796586a4bfc76bdf5b7abe18f64012e9992684b86062ce46056"): true, - common.HexToHash("0x35d76024a98f54bf06cd3f21175c30bba0b6228a50a8345a087b92eea120d68d"): true, - common.HexToHash("0x181562a5d4bb8708cb52987b75a1e3d3d73d5dd1430e7af3e152c0fbeb1cfdeb"): true, - common.HexToHash("0xa0775b302819b9e001c3a7b7ffc2f1b5b42b31e86a1dfdc1d03cd267f7cfd5f5"): true, - common.HexToHash("0xf6ab35b07be91a61dbf56bcda1e01e3699d02259bae1b53b36cf5e44239211f8"): true, - common.HexToHash("0x935dd6286be18e46bd8b103ca9be0f533c8784d5824a554db6fc4a670268d310"): true, - common.HexToHash("0x52454be892bef545b1f80d5c34e06cfe9c6df7256ba41ad75b7beaccb72038d9"): true, - common.HexToHash("0xe6c327ed5d319064dad887747bc521f042b6aad6b126520dc2853036746f8580"): true, - common.HexToHash("0xa6e8570ddd779620a85822fc09a25a14e7b6151ad5fba4c7561493febcb449a8"): true, - common.HexToHash("0x701826a84a575687b8ea3c6f63e4af226e43ec3780c2d6320eb5bd70a9636809"): true, - common.HexToHash("0x04389f61da7d44280b5972b02985d3447cf1ad53978cd2b27446c1251df63890"): true, - common.HexToHash("0xf083c315a584e410a0aa9e0229e1e5d94b2481b155e5d68f1f0f4fdae41b11ea"): true, - common.HexToHash("0xb7e60fd9da5b3cab100031c6d82ea481a26d451d0a56279e2bb3020951733d1c"): true, - common.HexToHash("0x52ac1fcdc45ec40416309e463a5741ab3b4871e8339d3f7a024ddcafbe74a61e"): true, - common.HexToHash("0xc9d75e0fcf165be94cce98bc6da92c4840e5c9c90821fb749e9b80c3a92d5d63"): true, - common.HexToHash("0xa4b8829c455a1d46b94e2d0941b66fd59a4801622e46615212acc2e94e28c836"): true, - common.HexToHash("0xa865d425ab3346885c0418cb5d5d6f6621a36e997c204e2f78ed589faca08d73"): true, - common.HexToHash("0x0a738948f0d6610491762ac5a8b9c784707a1e6e3ead6e288e90f655ca51ea98"): true, - common.HexToHash("0x696fc0855dda5f6e30d77cc8b2d48c98858753d4d03383c76ff3336700b91132"): true, - common.HexToHash("0x2dcc3d3a49cd1db565ebce10d907141f3b5d400100598ea64436991198852a23"): true, - common.HexToHash("0x973066ae4e72ffd24afcd30c6703c0cc8f9f86cc8337668982432b60936c963d"): true, - common.HexToHash("0xfffd923399740411703071683dfdd9ffa13b22373671398bb0c08e96d0ee7a47"): true, - common.HexToHash("0xe008faf422486ae1b59f5dab261f20cb05e9c86fdc232647446d6239697533ae"): true, - common.HexToHash("0x37b0d0767c894f739a54fcf550d8fad7b98c6cdc365b0d3b364628ce9a0184da"): true, - common.HexToHash("0xd0e6d03804188ee1a8ba7bf895fd61f0d5ef2e17cdc64f2ecd16fa2a0e00b6c9"): true, - common.HexToHash("0xc45cf9c40e5130aab8294f8796edad868a4137246227dfc21dcaa5bc02c21ba2"): true, - common.HexToHash("0x6c8e9893474218aed23617b167f711f18006727bc6769aacbb727d28f6bfa135"): true, - common.HexToHash("0x6c826f858a42314e7d9fee4679a58a952d8e92ca3d5b57c2f4b1cc93616daa74"): true, - common.HexToHash("0x187d98cfddfd6c28575c68c1ffdd4f8f7f0ddd65c22d10145600fa6796896f11"): true, - common.HexToHash("0x54f8c72435e0dea6e0a553913ca40a1c0909621bf126e132355a78eca51402bc"): true, - common.HexToHash("0x18a5b0af4f18524c73485eca778a62291d80bacba0714efc5ba38f9eed3f0c70"): true, - common.HexToHash("0x2dd66e4126ea3d25941fbffe1d43d53d9fae0723928349c4c3e8208a3ae5a546"): true, - common.HexToHash("0x3395d73c03f9677ce1258484f515a3959b6c19885099a61a714ba25ed904ea5e"): true, - common.HexToHash("0x4bb187c2cc4352e80f38177d4b2693dce62a4cbd5fcbe314df58dafdc51884b1"): true, - common.HexToHash("0xc4a9408a2d6f696b99d11cd9cccf109f18d894456dc8b63515be56a722ec6c7f"): true, - common.HexToHash("0xf348b1cad639fab819196b6636984d9af2cc3fe5fc705e17ae4aa1a730820570"): true, - common.HexToHash("0x29a85fd9352fa6b342e2dbf6791ac2312d186ff3acd1707bbbaabe0a4b629bb4"): true, - common.HexToHash("0x466571258cce54acf87092dd1da1e0038f3d9c97ff72c4b079c8c783d4596c39"): true, - common.HexToHash("0x55febfb076e61653adff45b6a2cbc8492af26926e91709c6017772c59e41458a"): true, - common.HexToHash("0x712022c3f04dd61c8055d931e7100f1d92439af96707d7640304c1d8d424c5c5"): true, - common.HexToHash("0x86e2279632d26f44ae547278935afd7faba2f2b52891454e0d42483763197ab3"): true, - common.HexToHash("0x370ec4df8442c5d9985c9e424a56e8d5dbbc89cd06f6e8721cb88cba90bc878c"): true, - common.HexToHash("0x18f7a7e35b14e5cfc29a4ba1b3ed8d16367e23dfaedef93f62274bf9e6b0a724"): true, - common.HexToHash("0x0aaad8188cf03bcdce4f3eb9bd6ed21f4dd22c193e949244cdd3efa7e8cea5d7"): true, - common.HexToHash("0x5fddd391dd41409e86e7ab6cbdd909a93ae9e6c3a8726fd1bfb4634087b6aac5"): true, - common.HexToHash("0xd3b71840eb2dee83b32581c43a59196f21e5c02ad0ea17e61ae7a9ce932f3401"): true, - common.HexToHash("0xde68e7137d86ca27717791d71ec13a5c3ec1be39eb5f3e814f753e35854d61e0"): true, - common.HexToHash("0xcccb3c3c7227702aca6326013955ebf2a50ae9eef6b9f3db40418840de87364f"): true, - common.HexToHash("0x5c9c225b59f2a9a6d0404a073a27528b1d1d2d7fb0da2762cdd65aeb848205e9"): true, - common.HexToHash("0x31699dd37f278ed3437a11fcc829da5ca033ddd67f5c6a486ad9c4cbbb235c90"): true, - common.HexToHash("0xba93298007625f1ec55eccbbef6f859912c2d8c015856b9b6a967a88a12032c0"): true, - common.HexToHash("0x1a43b5d76384794a8782530cdade3aa9bb731addc2e838c4cd308910a2f783ee"): true, - common.HexToHash("0x85db8aab7ba342c712c404c9a3458fc9d453373261cd28a84e0bfb9d6f94643b"): true, - common.HexToHash("0xb6a747a677b75bb6bcec5be408896c27abadcf20f262727b53c54b5d797a42d8"): true, - common.HexToHash("0xdb8ad802802dec72240d95a65fb8c93a2b2f059af7757e2bf3cb8035afe5bf5a"): true, - common.HexToHash("0x6be8402452d56c9f832812ba2c196c1e9d9960f49250ed98221ee45723e6b3f6"): true, - common.HexToHash("0xb03495081976ca4556a7fa13b9beb6a691fbf4f91586225c4e5a3a73e855260d"): true, - common.HexToHash("0xad153acb0ae76a8b1d28fe3874e1cc4bb02e664d0cc4069cfe820e142030d7ed"): true, - common.HexToHash("0x3e8e4f30fc1368aa0eece4e86b1b987184d55375768143b1a9f82156dbbd4095"): true, - common.HexToHash("0x9f98795bd7f0247ed35f18dda0506fe9fa450858f706cb9d9d3233418ff63570"): true, - common.HexToHash("0x93c86cb599f5c5f132c5e252d7dea6f08a9ce4a99b75a962873782013a965d62"): true, - common.HexToHash("0x99db8d643ce02a4091dcaf6113e8c5e2c880a0ebb0fee61c3ea2ac80fbfe0b12"): true, - common.HexToHash("0x5b025f4624369c17632e024eddcd7dd8b024166673d21f3d874574d15aa72b21"): true, - common.HexToHash("0xa513b14174aa6f383abe06380f70c182be36a3e31d9d2d98261a5b7f7cba2fba"): true, - common.HexToHash("0x80a1a666436eb846538cc6fd3745f0ff9c16abccaf55d2faec613de871a333ca"): true, - common.HexToHash("0xa6f0c26933a7caef75fa21239ecd90be70fe87b4f8da235b87c409e66b662e27"): true, - common.HexToHash("0xceb86e1833503e9df8e8f4ceeaf679b3cd289d59e8fb60cdb70b3032a7b10acc"): true, - common.HexToHash("0x0aea0b7614ee3ff5f38258f2baf5f37c0a0c94e00f4837dd93d8444830a922cc"): true, - common.HexToHash("0xc7c3ca2da780a14a596a21d02ee9cb11e7071fb94fc6487009cae4b151035349"): true, - common.HexToHash("0xce84b9b598cbf0e2d6150c4c202e5ed45c5ee59560eba840de5bd0e0cfeeb80e"): true, - common.HexToHash("0x06ca08e690c6ea6bd25e9e830f8bc7fa539f292d746602365687249096f8e7ea"): true, - common.HexToHash("0x473ec878482ac3de685d9adfcc99d2b38252c93311a9c50fc73f0f7fdb71eba4"): true, - common.HexToHash("0xe90d68c171ed7c72b0aaa9750698d9441183e24e42d7f38cf44ff6c886644db0"): true, - common.HexToHash("0x0553040b6a66b48955c42f9dae7012b59cc0c632f4a0defe0ae3f4339989c3e3"): true, - common.HexToHash("0x179e5f0ea0fcc4846a1be2fa64dfe105ef12f91d4e047bc20f4de2491e802902"): true, - common.HexToHash("0xbbe7891d46972f4e17b86cf24ab112856ca34c5882edc61b4ba446fcbf8d4256"): true, - common.HexToHash("0xf91eae5a3568b1fa9c3db325a3bff5572e16c2a94143266c982367203530443d"): true, - common.HexToHash("0x8c15b4351e6717a437ae94d68b016cd5560060a82a5c5753111d0359f11e43dc"): true, - common.HexToHash("0x40ef850a27d16eb700e22b7218b55043c0f32114f66efe8b8e141b0831d38e96"): true, - common.HexToHash("0x6f88679cd91cc1bebd0281930725dcb54787d106cc193e38653a49dd0137e055"): true, - common.HexToHash("0xce366494f2fb4625b043cdc473d86cc62094e78e36ed41de9b197b9014326d45"): true, - common.HexToHash("0x81325040dc80b349543557ac9f3cce2234b58f50e7f62c5fae0c689d2cebe471"): true, - common.HexToHash("0xeb951f0c31c529f0ad5e4ae831af7534fc53fd7d71fb453b374fb1d695635a7a"): true, - common.HexToHash("0x63832143bb7795e29603bc93d76dfa2e488777ce68dbf7312e8ad776f7c08c93"): true, - common.HexToHash("0xf2f465179834b54b5b17550ff89e0f4253eea84538f22444bd63f94591cb8783"): true, - common.HexToHash("0x7e6eee161081d996d0b012f27770b247e432d62f307230392ceb61509cd3c730"): true, - common.HexToHash("0x25714e526156f0ca14a162bbadd93f28e2eb8bf5d0b8033d5555fe5bf234f930"): true, - common.HexToHash("0xa780fffcd439617aa5a8ad3b0da49e919a88434ab80a8133849b3e549cfef988"): true, - common.HexToHash("0xc17c4cf4844c337d0a3c0f50a049e4193cc1c592b09841d0fd7bb8286029b684"): true, - common.HexToHash("0x9bd7a97c61dc241c83559919e509a5a80882aa32a63e9b58ed4ab674288d05de"): true, - common.HexToHash("0x6936a5b2d52a4a1e2ccab0da8b52f2da788028702e648b70bf9e35ff0e5dc57b"): true, - common.HexToHash("0x817b60369d1bd8bb7fd29c1ef2de6a0865334eb0244d703841f66a88ff46503f"): true, - common.HexToHash("0x204fb7cc75e86ea55f095a6744a72a2bf531de1f0450da472cd0e0444c30fa14"): true, - common.HexToHash("0x9a70ba998be3c601dd3cfc9e57cbed12526d3cc015857e3c6242c31df904ca9b"): true, - common.HexToHash("0xd95a35edf970820f25a8568e591b7c4b588b3bb428858c621f56bfa77853e97d"): true, - common.HexToHash("0xf492d19eec561e1536db0a080e93366c63447eb7002ae0d69534e04c15634c57"): true, - common.HexToHash("0xdb844e4036537048255bb9bf12413981f6b568c6190b245b4172836efba6a3ec"): true, - common.HexToHash("0xf97ffc5d5de214dc25fcde7fe931f487246e72b5af12622da012b57dc7850bee"): true, - common.HexToHash("0xb7ad3f03e2c91bf6ad420c92aeb1e4485991021560d5e876a0ba24565935b43d"): true, - common.HexToHash("0xcbfa72e11d1377526db7d0b6dbb154ce7d163f5e4069da9bbcf03fe2022bb2a9"): true, - common.HexToHash("0x7f9f9db550513553ed372c5d2ccbd5dc09e72bb3519a7c1ac3667c5bde9edfb7"): true, - common.HexToHash("0x817d20fb94bce9fe77eea2ce7756de60f64d62f84191e7d347e93825b2418e60"): true, - common.HexToHash("0x8ed1abbbfb209330955998b2b4b7bfbba7bbe5a693beb9497d6ee1a662f4227a"): true, - common.HexToHash("0xca5c490cedb74806fa9dd7a8bee730a27e4b14d63c34806c3c3a4c85ea2b6bf7"): true, - common.HexToHash("0xfc13201d34858bea64008116119ebe4b98c7b7f0bb59252dceeee52739990b9e"): true, - common.HexToHash("0x17cdee24c81274ca9fe68c5b43a55d7969108aba7dc8dd51795d09df4485ae10"): true, - common.HexToHash("0x30808173209ca319485ef84216e1fb93fbe29a4d8effe353d5c273e2ec39b3ba"): true, - common.HexToHash("0x0ced1ef89c1e7e9b57c4d9554e16c5dd6e1942e572be02fff63da927540ae342"): true, - common.HexToHash("0xfa402d1f544876c15cf61e08fc76ea4b7514219f362a0552d0ec1975b916dfcf"): true, - common.HexToHash("0x242cd1b97eda5ca585457ff62d9dc133b20884fcce7f1ba944f186506205e595"): true, - common.HexToHash("0xc43d3b03eafacc7748cbc979f21b0f70a142d3119dad347f4f2b53679a2aa128"): true, - common.HexToHash("0x63a97f129993ec8f496bc5c48d898c2e4100f3d317ad2bb7817a28cbb255a8a9"): true, - common.HexToHash("0x2a49a175646d7ec7630a2c96305fc8f0874a5920f66e171a991e53a737593c79"): true, - common.HexToHash("0xad82e63c8dc7386d424a4d9b07ea8134e722ff38275ba8203a83093d3b95733d"): true, - common.HexToHash("0xc48efc7d7c12745da6dab0d1029626123de14b66a5e618bcfdfc3955d267f33b"): true, - common.HexToHash("0x938032fbbb2149cdd7d06ea2c897dc9831a43d7b4f77fb91aadf1f6dfd2d7827"): true, - common.HexToHash("0x3fdd0b463f38c316eef88586865d706ff8445a57245122767a15c7d981801232"): true, - common.HexToHash("0xc992b9f68e3b8d2d71302c5f01b821892d085edf91ce6016eedaf81521a71c52"): true, - common.HexToHash("0x5ffc492792784d16d1706951a3dd6d035993de0835dcee593ce8c3c6f8c1d768"): true, - common.HexToHash("0x796200c9d6b9b2ba1623bc9cd7a2041a793889d861289486b04e9b0daf574b23"): true, - common.HexToHash("0xa96d4c41ff71c85bd06a0edaa0e5a2e5e9fc2adee854b7ea38407be4cede444a"): true, - common.HexToHash("0x1ad7dc04111437f2cdae140f8b8b0a07f09b9f9cb02514f5f1c0168a306268e2"): true, - common.HexToHash("0xa5fa3e565dcfcdf0e1399798001e369f8425097fa88dd8259990fd310d74bba8"): true, - common.HexToHash("0x293f1d25e6a51a4cc2ff388bb609cb63d031f7bac1a2b269fcea73600e5b9b9a"): true, - common.HexToHash("0xe63cddbfae94c9a715095938b5ee290fc4d7dfd2cc3ae2cbb4165e2d017aa8ba"): true, - common.HexToHash("0x0f28285324448b62533a4ca23133b8f3337426e248fc40dd699e636ad8903ccf"): true, - common.HexToHash("0x3efd444431cd57c918fda0743beb7024fa72583ea23ceb843c959d1449c5b88a"): true, - common.HexToHash("0x4d0af07f9aae79a01816e1b2410c76918b82e947094e549b57014be5b18fe17b"): true, - common.HexToHash("0xbbe5d13d1c433cbb06d64559f71c5799989635168da55d2e42e53bad479a5cab"): true, - common.HexToHash("0xfaed507417b05173fc400c91b0ef4c860942c41be8c5f1449c4c802f1d7b849a"): true, - common.HexToHash("0x706400cfca1507e96797e25a514cb319c55f31482c19a437baede326b5d0b22e"): true, - common.HexToHash("0x424ec0992d2dda6e215e9564d9b0a40b643537e615d3833f15f7807fc637d127"): true, - common.HexToHash("0x49ee2231789037efed94dff9213d19e077c9def4c51e4fce4e0a7b1ef0194d51"): true, - common.HexToHash("0x98b5c8b25aac21ee6bbd4ade2ac393dd5b1178f74a89bdf51c1ffd9f2e6d579c"): true, - common.HexToHash("0x808dda52a9755fbdb12e4b97227300482c69eb506dbd5ccbfeb7e203f78965da"): true, - common.HexToHash("0x95922cbf09a5c121204aa34107735e8da7b2c62dfb58d21c29716708ab42c7ff"): true, - common.HexToHash("0x1808429b3458bf7ac2572ad3f8c45c003c5d13126f3c5e179efd37b02e3e324d"): true, - common.HexToHash("0x8391f5714db5a41b6e779e39ef79d28f956572120ee5f61ff5533c6ba0763db4"): true, - common.HexToHash("0xcc7de28f6251a4c7d24a58300cd11527cb4b77db5514671895434d1b9fb720eb"): true, - common.HexToHash("0x0197e1866c3e80f5eb6cbe5328f8451524f732793e3572742194355eaf3ae744"): true, - common.HexToHash("0x3a3b1c67c9820156e5e7728ce0aaffb8f3281e5201fac25c6828926ceaa27ea0"): true, - common.HexToHash("0xaa76414d7d42d2a63d8ed47c01e642e19fc2341cbb704098f0828403e6e94467"): true, - common.HexToHash("0x48dbec1814fd35a4911a446cce0f43ad6c3a96f26f26e75bb4cb8fe36a66eba0"): true, - common.HexToHash("0xdc464e1791d4c8a16d5775827555a5ca451b617ea91a2d1644475057d4dd574c"): true, - common.HexToHash("0xdf939a3b77f2347def8b5415f4f14204639f739e21aad24f8f7ebaecc0a84dbf"): true, - common.HexToHash("0x333f4c1ffce18ec4c6d06850f96304f59d27e06916b60babfd8bd88def041045"): true, - common.HexToHash("0xf3ea7b3f4ea48b2ad97b839b6eb23872b94a344140a3a277b2901c97820dd2ea"): true, - common.HexToHash("0xd5a6d0bf0cbe1844f19d95e622b1871cb5522087b4b07304fa9a4f1b965ee612"): true, - common.HexToHash("0xbcf84abb4c833f6685556aa81d5aaba48a443dacb469e1c968df15f2b651510f"): true, - common.HexToHash("0xa6d93dca1718e315edc4a13305a5ea828a7c9670dc12d424d7b549e60c910724"): true, - common.HexToHash("0xe8cc837580455d85444ab955f190f7523067a1823df15f3fd45f69f97880af3c"): true, - common.HexToHash("0x808f04f859305c735983fde702620bb7ebf7ca3d76446390ba9769a6b7273b13"): true, - common.HexToHash("0x840791c6365e0fb255147331291e3288f0c6b835c1a2644537397132d54909b3"): true, - common.HexToHash("0x44f9893ed97a2bac9249883577ad524a48007add65db9512f51474d55c4dcdd5"): true, - common.HexToHash("0x741e82bedee617e10749c01dd3581ed5f3163c6e75a9a5c31609a5799b7a15df"): true, - common.HexToHash("0xf44b3fe0001e687a067382826386c32843bf382ddc76fd32401d42798265072a"): true, - common.HexToHash("0x4994776da0ee55cb6ed68f0245595136d819528085173f9818b7a1d3e2279380"): true, - common.HexToHash("0x620da8073e31dcaef266107e8b6291e84a5417716ad8b697ab80a8e122376d98"): true, - common.HexToHash("0x8f82e3c17adafaf716fc46c056047c903002a83d00d02f6ab5c9adb36c9c6ddc"): true, - common.HexToHash("0x6492f26e10a340b33ae58a728a1812049ebf76ba9ee96d667986437be86de554"): true, - common.HexToHash("0x58d050ffb429340db6e1d73823c284f56519cb9766be5d4d158de886a506ed09"): true, - common.HexToHash("0xa9ff3613811cfcf8cb8825561dfbae050822f5a255b39ddccc426d773b6c5df7"): true, - common.HexToHash("0x784cc31812ac9bd95de9af0fc59611147cdec5d7fb5d88a46e20c73cb05adbe2"): true, - common.HexToHash("0x154ad13503315d50fefe95d4e37fdc8abb3a922f6f8b1d571a2aa8be594c8502"): true, - common.HexToHash("0x6cd8631c2b2b4474b8bca7200b5766a60d5c2be6fac1480988d62146c17e35c1"): true, - common.HexToHash("0xbe09026e810a07d4837b2eecdef575df02c685b2a7a15a18416c80cc7f5d77ce"): true, - common.HexToHash("0xe40e3562742fbb05e2a26ee50e02c15454d1f9ffb6f9af7e08b1bd1c6d3bcb3a"): true, - common.HexToHash("0xf3ed260a580b74e5e5ec5719d14edbf55325cbea0f35efdded72b78fbef20041"): true, - common.HexToHash("0xae14ae11f6d613aa0f898454401a989773db292413ec8de5ee2e49f3f22b6d4b"): true, - common.HexToHash("0x163ef18259651d9e61062f3ec12bb5515f09b25d00ab77114c850b46a15b7372"): true, - common.HexToHash("0x50aecb321d91e5c9f3ec5ca1a0a3ccf23423b38209d208504133005b6a165176"): true, - common.HexToHash("0x5e4f1b330a069e70cf61418a28d2efc069db11f4d0f3be396a9ecf2827855b70"): true, - common.HexToHash("0x1c039679828f193bb9a6f97bd35a8d4c3cf45a006c027edf01cb871bee252ece"): true, - common.HexToHash("0x31034e4713d516b98f5619e7de9f35b5d4e1e27a2e3284166cff10d2499fb811"): true, - common.HexToHash("0x417f4dd2cbaa962cc37a5479a34df6f6240fb22138154fba52555ba28b388e43"): true, - common.HexToHash("0x8aa1ecc821b58d94e6a99b7366092d6fa74f84e600dac68b9e7e591c809aa3d1"): true, - common.HexToHash("0x845cedd2806330b49da857033e2ad7de47058e0da8aebcfdf1578c74ad57f5a5"): true, - common.HexToHash("0x31c03fd7783333c79dfea353836ccc0154d09b81a5098764fa0547fd44060a64"): true, - common.HexToHash("0x20c028e67b2b87084750e9eea4263a682de232c85eca595e7f6238225fb1ff20"): true, - common.HexToHash("0xe7926b7b91cfd109bdbcf8b397363548b4ac044749bca738d69950a945a0bff4"): true, - common.HexToHash("0xf0897e234d74cedab03c8bef978b962462e995457e69a7d0d1746689723afcb2"): true, - common.HexToHash("0x874d82f47fb329e00eb4faed70f386f3ba8ddd037d0588c2476efa9faf2a2f76"): true, - common.HexToHash("0x676f7fe49ea1216ca771af159d7325f6c0545911909669c9d3857e4f7aef74f1"): true, - common.HexToHash("0x7b06e0a4bb84e6c09792eb5d0a35507d5ed3f059623a82fa164b8cc977b87b71"): true, - common.HexToHash("0x2dabf55ea833208b85ec48077ffcb4840797fbb00940fd16842a1f631abe6125"): true, - common.HexToHash("0x1f3cdc6878c9c5ff5ab6bbd552c03559cedd1fceaa59e192539abef996d70251"): true, - common.HexToHash("0x49e0818eb0ce0b05d4f7dfc6b78d584f1fc0be63ec350a3d807ed7972e9ac681"): true, - common.HexToHash("0x033126bdef31eac5c53d4826912659cfcabb165d66f675a6bfeb30989e68e19f"): true, - common.HexToHash("0x32719b9d294871585f3a06022c137060644f295918ff22670b0eb64b8818c150"): true, - common.HexToHash("0xcd411becc55f7b44fb3c671fdc1de1b50e75257ae202f267e125562836e7c07b"): true, - common.HexToHash("0x4520425ffdc06ffd236344fdf0f4910bc525d469318578dc43719bb674e321e2"): true, - common.HexToHash("0xc0d70a00a2034d4a1be7d99c3847616da252fcffbf1bf50e8d7127d3b7d37183"): true, - common.HexToHash("0xa761002daefb84a394df5f20b984b0427584e7c5663e0388d4e622545dc853c4"): true, - common.HexToHash("0x14ad61c8fde34f94c6d66334361edf07adc6bfef59b848966b4c63a1b1126659"): true, - common.HexToHash("0x91f02e5acd8768ddee6cf3d8e673de103cce8319c12549bd35f0936bfe24e286"): true, - common.HexToHash("0x8ff1a3bb0dda7bcc11cda5c2d171c70978d2052dc385532c7dffac05a1499991"): true, - common.HexToHash("0xb78fccd05bcc77ff582af360a32dc4ffbcf23bb1afd7f47e4afc2656d4a761d7"): true, - common.HexToHash("0x18f1ffc80b66f6b9ef04710c93718691053ccd355ca1f62ed039a43667d40302"): true, - common.HexToHash("0x14bac0223a199fe4f2f47937047b3117fb8963693c25572d94c617bb56d6e9b2"): true, - common.HexToHash("0x675f0e1e9a0405468e1c09d8485337dd619fbdf2fc86983e8cbc8fffc25678a4"): true, - common.HexToHash("0xd3bc486909abadf2f858812c19f48f01c1cd1f8168309b25773659d95d5e4810"): true, - common.HexToHash("0x7ec54dacface28f0c6082db44bcff76aade541a1b84f663720bb9349d67d8734"): true, - common.HexToHash("0xaabbef04d7b7bfbf813c55b8c8be4bea0ad5a53df67bba939a395d6b121f13e5"): true, - common.HexToHash("0xcc5b5fb39e3523ddd30e02d187b022352660000d6b0e9d3f6f539db870710fa6"): true, - common.HexToHash("0x500a04f856edfebfc4c8462633d31f1b3cd167ddb9a25f29254cb74f3fe35e83"): true, - common.HexToHash("0x02585c194b85d9e61d9f0ddba54c3c63825a8ab244f70dd709551a4c7d487c92"): true, - common.HexToHash("0xbd0cb598b63e07a3a8c51003de165eef2f962d53b43e4950bcdecbfbd1aeb144"): true, - common.HexToHash("0x54efd363d4f3513236a69ee518419ccadd730a6dd206ee97c784f0579139128d"): true, - common.HexToHash("0x38920726de40e794f092d331f32253867009227f4cdad66fc51fe921cbe6c18e"): true, - common.HexToHash("0xced0e2e1c8bbe6144ea63b55147a8d87814e2089edcb7dde77c05a9926bc7df6"): true, - common.HexToHash("0x29a4d4cd5d7458e06b8f8518c8d093c6fdf5487de347c8c5f14707e1f308e18b"): true, - common.HexToHash("0xf7df6393fffe00a4b15c65d35625323ea7ec9d3e93eda3aca3e11e98005d58da"): true, - common.HexToHash("0x14489eda4f319bf552589caf26bafea1445a8dc4a9401e6df7430a4cc08c05e4"): true, - common.HexToHash("0xf905e769fcdd6d48c9b7a84be0d40d7472cd7c9f4d13543d4110b703e53495b8"): true, - common.HexToHash("0x5dcd9e01b8b5d5432afc99957d3fb7ef8dc591f964ec85045df24351dca53a67"): true, - common.HexToHash("0xa899bad67726f4b0596f36755c50d2ddaad6ca80c530135e53558a02384212bf"): true, - common.HexToHash("0xf04ace508ed62a49e81300bdfcb4d9e75d4ac5adc736d864291ed9baefb9f2ce"): true, - common.HexToHash("0xcf06ad1d8b409ea92f4dcc3bf70f39b752775018b790473e9be086e42b43d9eb"): true, - common.HexToHash("0xac48c29b53866e764809716f58836d9e6cd2ad06f6473efb5850f583e6d3bf61"): true, - common.HexToHash("0xee0b769d61721a470a8c7eace0fb28f606c9429192640d9ca776895a0bb67b74"): true, - common.HexToHash("0x2b13a184bc30ec5a6751bf7162cbc00bce0cbc4f4a71d68dc40822b919af73fd"): true, - common.HexToHash("0xc2c4168242eb7fe0696eda5966acb8c8975679a8deefec927b2acdccf6b912ec"): true, - common.HexToHash("0x6dc2463edbf56200c17283eac1b5ee4bc2c634dc2698e00c855d8fe5f702d4e6"): true, - common.HexToHash("0x78b711b2241e23f0e170fa50c3743f04faa32333ceaa439f6767e3d50aae77a1"): true, - common.HexToHash("0x2f59c17687201abbe7a4f9015c2cc1c5d78ec96ac5524e801243346b395a2bc0"): true, - common.HexToHash("0x4c7db5229eff438e0ae2b72fe60942a7fdfa0c6ef8fc67b6562c90b486781aae"): true, - common.HexToHash("0x788d200ec8b6f89f4a24cf22a7b93c3cd8b52568c79aa6dae7993b0344e191dd"): true, - common.HexToHash("0x6864046345b7a9249938ff99e6cf758b06e7dcaf72e506223587abf9c136d27e"): true, - common.HexToHash("0xd6a98c1e9c559eb50e01f979b5bc69d31a56527f3ebae6f61f6b5d60f4e8b54b"): true, - common.HexToHash("0x048b3f792465024216d185ea408e2e743839132e45486837333d2d2a3eed2b5a"): true, - common.HexToHash("0x7d5867d01d655c5a9cdc4e2137a9a23c0f759786ad613e39f0c034a5ca3a8f37"): true, - common.HexToHash("0xb575314f3a46509486d1758e37852bca5a3fc5c3793b7db34928481ce51fa574"): true, - common.HexToHash("0xa2bef8c9091dd4d0940a6e6262db4860bde5014cb1087b1eb3992a092314ebfd"): true, - common.HexToHash("0x9be56611c6e58d68f957f124fcc232169448fe6f36aa65e66ed7414233802f72"): true, - common.HexToHash("0x65554dfbf801073eba3c450c8bc9a4c6ffcb13953876bac9428a970912f47767"): true, - common.HexToHash("0xb6521c2f63ae2b17753992a535328eed3c9de1b861595cbafee46d6b74fa2194"): true, - common.HexToHash("0x1d5b3fc7bf953260f5ebafee86c43083b68a0761941267cdad6a01acd2da7466"): true, - common.HexToHash("0xbcc371984bfd19781a42025c5a7689a3af7f210448ddf4e1f45cfd689d39139c"): true, - common.HexToHash("0xcabca6b8d2a63440e8411a28134c44bca755605890bdd12c26919f2fe0751a83"): true, - common.HexToHash("0xb1b10879fa868ee35104b2c3b5df360c38b201466680180420314ce5684473fa"): true, - common.HexToHash("0xb89f62cbfb050808c4f3df6aecd8bddfe16a1009a0a0bd0c1e52e85f0f393112"): true, - common.HexToHash("0x28efb5c98eeb0ba3e692218d5f87e8703daf459e7342d51a13a689c08aec68ef"): true, - common.HexToHash("0x927c987b5b715e3e703a4aecc436d011938359ba6d5be22348e120212923e3af"): true, - common.HexToHash("0xf8187edd4c0db6af79f00bb9ca34f78077c94234dd590fe2b13c44e1d0e76d5d"): true, - common.HexToHash("0xbb69909e3b6db1d1b2b90c3b320fb65cf435a020a6d488b6135714f37c33169d"): true, - common.HexToHash("0x13e2ac43f22da72cebc94f78223714308fce9b9ce6c4d42ee7cbedb1d1901c08"): true, - common.HexToHash("0xd9d438fc8721a77626ade7c0b28f4f9c8d4bcdc57a8cfc16225409c158a2ecd7"): true, - common.HexToHash("0xd5d1497485ea7d86c30f2a01b173c8a17acbd1b3f15318125b7e965af8ac0458"): true, - common.HexToHash("0x9d251ab462ea30705977fe8922ed6b03fd062c7a848241a22c3e4aebd6c8dd14"): true, - common.HexToHash("0x8fbdf2efa509177ebd876d4ff80d4d64c78c593812329717c1b10ee3b95280df"): true, - common.HexToHash("0x4d75f1af7b20db58afd9f4b2acd1329c54446e13c60260ba221e2666d341e148"): true, - common.HexToHash("0x9511ee65d4554abbf5b30319efc985d07e2dc057c2d30198b33089a8b7244790"): true, - common.HexToHash("0xe69a1a6d1e2c8c9c6d87df6159d599702298ccb27e6c22595a46bc02fe4a54bf"): true, - common.HexToHash("0x0315f611fe9691e11465724dc0b3df3dd726d4de576f667205a8de7287c6e453"): true, - common.HexToHash("0xc4a3478757a9d9f4d277f412851213cf58a41b55e45e1e94a0dad45bd372e032"): true, - common.HexToHash("0xf444bc7b8cd97c00ed301db35753efde426bd618de14be5b6cde4bdf43174ea1"): true, - common.HexToHash("0x7891004e673589de8eeeb6b4a3cd9f0960a5781b013a76a95db121dbda1c21a5"): true, - common.HexToHash("0x50d41a0cc65587c17b6c79b42ca41d11fa5302dc0a962c96e85538bcb1935e54"): true, - common.HexToHash("0xe4b7226a210298a6cbe5ae67f7e529d4a3cc2a0d6455d6c8e11e8f88b895061e"): true, - common.HexToHash("0x1ea1a4744bf73a15a2028f7b6a5edb8d5e7a1b6260b92e3ff233cfac2ecbb46a"): true, - common.HexToHash("0x45f4ab83e29986952eed0eca8f9cd0f83d75857ad26dbbdca3b4da26782fba93"): true, - common.HexToHash("0x11f4ed9a6d09dbfb65c12af9c44eea31289d8986ca194e4660770b6ba412e5ef"): true, - common.HexToHash("0xdd8267a2f88168030f0aaa913a1e0e0aadc1f690f2211a4051e18239dc92674a"): true, - common.HexToHash("0xe45894a244dab320965a20b562c1eb536712d8779e1496c1d42afbd4ca4f5bd3"): true, - common.HexToHash("0xde0eaaed1b6c5649a279d0ea257fc443f997042ad7497d929337e99468338459"): true, - common.HexToHash("0xaf589885426ea60cae8cdfbfb585d02c5275e0d52c0a6ba31d0febd65cac0a0a"): true, - common.HexToHash("0xfc02dbbcb446c5e7792e77c6d5e366d3fbc87305ef6c5cd6c090ab9e631fc0b8"): true, - common.HexToHash("0x56a51fc3aaa67cf3e0bab2d19d8da9f2a8f1699ace5f08592c6c7ccc6acc465b"): true, - common.HexToHash("0xd5cd9d7f7830cb09c1d5b07078828ac0a4379add727ce036b9d1310d1193bb8a"): true, - common.HexToHash("0xf8814b6924928a1d071d843128918344b94096f59f13cc6a5796ba0ea85ff591"): true, - common.HexToHash("0xee278d3fa7bd12a65ac1ad4910ac05a22b2408001bf9944318a4d834926c3400"): true, - common.HexToHash("0x7f7915d0bcd4fac0cadb4c07104e6d821af89715f2833f8ce45df0d08f235731"): true, - common.HexToHash("0x2dab014d4db0b3ea63cf7e54eaa329466a14211a4cd2c98b24a6a6b012665bbd"): true, - common.HexToHash("0x65c6339dcb6fa21a2e925ab6d28a41d2cf485e2125b9ea561032ca8d7b5cd65b"): true, - common.HexToHash("0x8d75bd530059d0fca87e1af0ea721ccccc0c4cf65741da2eaac99b574ccc3a80"): true, - common.HexToHash("0x3f4b468f910924d263d1ffd48bc873d57f169370838b4b84f0fb09fdf6a6ff3c"): true, - common.HexToHash("0x26b1ce1e9391ba78f6ccf2fd0d024b2625bdc90273b22def1ecd8d390a214bc2"): true, - common.HexToHash("0xaa5cef13d3e6b9e3fb98e949b19b0c8e8cb7689f52bf132f15137f8a5ba80e33"): true, - common.HexToHash("0x731990a97d19e816f386196b979a60105fef3f11a3e6787ed4285146598a6822"): true, - common.HexToHash("0x14f910db139f06d9a6557de80bb114fbc292345485168f2ce2d5edde3b0e438d"): true, - common.HexToHash("0x46ee5127c2cd219d388e4c9c35b9b8da4e748ae7185dfd9aeeaaa9c815f2bc77"): true, - common.HexToHash("0x99b3a531c090369bd038f218f30d00f9ba2eb4efe330b3836be2457163951955"): true, - common.HexToHash("0x8d93be9f4f52ab67f2e108f0bbf0a086e717525ce647d0a8a8299dd5ac55518a"): true, - common.HexToHash("0xb85d26f33cce59c6e8493482e128545451aff0e5b3d486f613290b14cf67a668"): true, - common.HexToHash("0x4aec8e76dabfe1cc67d7740eb227bee6ffece898fd3fc2b5aaddfcea8a6d00ea"): true, - common.HexToHash("0x0bd3074bfe69336d03beb9aecf639c28d37f2ac5a598ad460437e8e439d9de41"): true, - common.HexToHash("0xb09d928c13f38326d9a156bc0dec458c89aa9ae4bbb7adf10b5828ed8c6f5dac"): true, - common.HexToHash("0x927c3e6596239263bf6e22bbecd458b476321a6c9013047436c26507b9167d83"): true, - common.HexToHash("0x979c7c1da3d628d528567512ae7607bf3e7c5a29eafecb4461c073a12104312d"): true, - common.HexToHash("0xda522ebbde44b98e385a06146683550df92a7fc7c337b014dd6f2f46f1850efe"): true, - common.HexToHash("0xccf494c197da1d83c3ba350a4bdd0e296d83ebbcb5fc5ae25f0fed33c9c5805f"): true, - common.HexToHash("0x177746c7e815a1956b431b84a6b21cf6a6cd4b4140f6708a79fffab53b07425f"): true, - common.HexToHash("0x3a7482bf04e4e29efcfdb217c638ffa7dc604421677f7264c237941d5d73da51"): true, - common.HexToHash("0xdbae32943cc4f0c3c2df162301eb018d2af194a010eb10d5dfa6ef82ab4e4b82"): true, - common.HexToHash("0x270ec04254fd2f3a683ec67c2f81146b3e4c56ac70553c49edaff0ea81a66361"): true, - common.HexToHash("0xaf190cb37fa4fcde131010b2640f7f57bb98d714f6793130aba9d81761326408"): true, - common.HexToHash("0x116ad0a00f97848d81c722806aa40e5317d4f83db9dd7b70cb5a82577bb502f5"): true, - common.HexToHash("0xf340b4ed116497d3d9e168ea3cc16920f94f8a1d2a63695bc9f022c8bfe6b5b4"): true, - common.HexToHash("0x5e1b14ba95b5f8b6a86b4c4ed8f43585cba2db857719014995099558d5a09507"): true, - common.HexToHash("0xbf44922423457dee7e11cc7ced6a8f978b2d7ba72fd3b258818b2cb19225c8ea"): true, - common.HexToHash("0x9c2dbf905d7efb9b6702ca5ae6c73b1a4e1c83f32f4ef23d320354b06e03413c"): true, - common.HexToHash("0x1003b01e178de66878cca4ecde9fda70ac7f1c3b89022605bc2ccb216ce1f158"): true, - common.HexToHash("0x2ad2f616ab21b598a6682dd6ef112c7e36073450ac3cf196d3c4ff5ac61a9302"): true, - common.HexToHash("0x407bc05f1a9afb3e4246c249aa93f3a0ae996d571dead28e6531513e63b37345"): true, - common.HexToHash("0x1924ca79e0a82517596ce11974bf38b497adf811b1e139d77d25f8bd29877647"): true, - common.HexToHash("0x2f9e0e206bcb1d4db3cae0d74f5dc51163aba36a851dc4bbd5f90ac41550dcff"): true, - common.HexToHash("0x783f251374ea4af4e3495ebd1532ffafd2d82f4f0e371b030b235850ea5201f2"): true, - common.HexToHash("0x9f8e9b8f68c058cfa1edb5b3b36e37e6313ca801194b5be2b2efd2d0b5919330"): true, - common.HexToHash("0x0bad023395e60797334a1c7927687fa7b65f8a94fb013ef11133006174d9655e"): true, - common.HexToHash("0xf4369bbb6e72470cffe7d0e3a56d5999a104e70d0f9174e367b31c157ecbfc46"): true, - common.HexToHash("0x70f50ceea1ca909a740d4d018dff27564bb23700443a3597d5857865775fb9f5"): true, - common.HexToHash("0x2a11357ef2db9847a02d6cedf49bc69b39d5997a490c19b978b72a100d8862b8"): true, - common.HexToHash("0xd347a0e40f9e9db5da49d23883f4b152c5d1181e729173a77afce22469555129"): true, - common.HexToHash("0x309174e9e133a50a9451748d25de7694fae86160f3e297ea41eb640481ae9dcd"): true, - common.HexToHash("0x8e3eb3a16c78ce069001470227edc15258c4e88dce6b6bf10f0d76ecd8dc06b2"): true, - common.HexToHash("0x6a52c8e4bd012315361d35ef9e5048e5297f32c98207830b2d5734b3ac618a8f"): true, - common.HexToHash("0x04591074c0a1332348b705e3e2e888d8c8f05a197d334754b2048671ed05e811"): true, - common.HexToHash("0x107d2c3f49ec64aa1417b718c523ba2b7f26c0b50937c23db1cba1bcf5591b98"): true, - common.HexToHash("0xc79663a1fce1e22b590895ba3ad65fb285d88ab53456bb8b635b7795ad7efb2c"): true, - common.HexToHash("0xcd0d53fa43cb67cd7d7186ab6d1fd663d59ab9e76897946cef8f3fee47a3c605"): true, - common.HexToHash("0x0c3a4a89043a2c3d81b9f493fcf86f32a44891342f44b88436d935c882adf4f1"): true, - common.HexToHash("0x42657c16c0ec77b82d83fdbe5d552a023d0a65abcc32c9a4ec72c3cd9b183c71"): true, - common.HexToHash("0x9a444a2679fbfa6ad61676d24b5f842236d2110815c5b8b4669874860218998e"): true, - common.HexToHash("0x6510bc34ec5e85208050e0f7b0d39aa271ac8f083c71eb7225943fa3957dc8e5"): true, - common.HexToHash("0x885ccca67770c8b403c51827cccf3022c4dd2dc2af7889a4e2f5296184dbb414"): true, - common.HexToHash("0xd1233f32f1bcfc49e7f3e17e9c50e79fab9e52412e2fcd7b8f8756af96ca1bfa"): true, - common.HexToHash("0x65e05abc033cdc4de39d9cace0e5687338d543e38c3990277463652559121ba4"): true, - common.HexToHash("0x8ee69572e7eee823321862cef61d33b140730a39d09c25be102417232b9ff845"): true, - common.HexToHash("0x528911ba5bc0ad380ce80737c30d7417902d9618bb2fee9cecdc18e9b17e12ed"): true, - common.HexToHash("0x4043d678e0146ec7b7f072b69b1567512b0b01f9e06c4fac38a78545f55ac198"): true, - common.HexToHash("0x68f1decf8ddb996c619069d9cef3815963f3668705ef487eae1b5902d6f34b49"): true, - common.HexToHash("0xb2bcdfaeca1c41cc043e579b18eb1160deec1cc7bb02a1f239e0bedc5c6405e0"): true, - common.HexToHash("0x257b4dc98aaf0710a89b0d7466363eac820c85204325504ea47ef5d17b17fdd9"): true, - common.HexToHash("0xb363d6b71e903a65cfb03a1a68368333d4448326f5d585cd9b95d17ec21fb575"): true, - common.HexToHash("0x05615f0f4b250d6d870132f065b5eb920740536c0196ca553c54125c58e885ba"): true, - common.HexToHash("0xf2695ad75dbee2d772c536e3ccdc4e2e8991e5d51e10cade4e67f250b337c765"): true, - common.HexToHash("0x8af414f6b15c47f306b353d86dd7cb7f1d17e62bd3b9dc89033f9c7dcce302b8"): true, - common.HexToHash("0x86e89ede27e3fd127c5a7df42241673c822fdcf1e23c804ee92fdd33de8104a5"): true, - common.HexToHash("0x0c5948ab50ce32376d1b7deaf39c4630ecbf511856aa4aaca751309f486bf66f"): true, - common.HexToHash("0x6de6c3cee854cf085c1c898f425692c6da791bf67632f2a4792250b62337c597"): true, - common.HexToHash("0x39375a88ef48fa5b9c8cffa96f7ceb95c51857cbfbcf9930d3f9810c198e25ee"): true, - common.HexToHash("0xa53ba5a6329799c579f42db4e55f5e3fb45a2c7166114a25d06fa116a6c16f99"): true, - common.HexToHash("0xb0066663447fe2da3c7afa1e04420fcb74c1104c1b4052a5ba3771feb3c4b1df"): true, - common.HexToHash("0xd52c14acb9dac0c54df1105709ac278dec98908babd92e0f5097fc1f5ffec332"): true, - common.HexToHash("0x89845e3a835190e77eb58ee3254e890ecda5950721a4ab4ad1e143685ba477e0"): true, - common.HexToHash("0xe582cd3eb64eff5edd0efe276e0081fd7ba372c04a08f24cd814292be7576a88"): true, - common.HexToHash("0x8b14cd7eeec1594e4dfec06e2f18207e4c7cfeaf66e1c180d498b769accafe31"): true, - common.HexToHash("0xb1b2ed5b129f926930e27b35c1170be9077a010ceca827502d8619b79d038d23"): true, - common.HexToHash("0xaf68bacb8fc42e0e2f553d90d0ae60537d18069eced235393634d86fa0333e8c"): true, - common.HexToHash("0xae941845eb561d9605f16b6c7f49924dbbb10d8116fb721c7de475428b0c308e"): true, - common.HexToHash("0xf9d88a28770f0dd86cdd2145db9a4ddb5faddd3e63909dd518078b50cafe4e0c"): true, - common.HexToHash("0x70e50e85c834755dc79f86fc390e7e735bf02b95f4444f27b668a1f26f1c42a0"): true, - common.HexToHash("0xe91be3aec073b45335bf30411c6c5dac614c6502ba333b5f949249b4717f1290"): true, - common.HexToHash("0xf9e0e417e8da4f2f4cca27ca57f53d8045bac3f54f6a364930fe4d2e52108c95"): true, - common.HexToHash("0xd7429b24ec8a66e35f0e176216007a702689778f8d8957a77fbaaf7789c7efdd"): true, - common.HexToHash("0xa30608563ef071882b44578df6c718ae2a93961abef93bfb1ded44cf688df54a"): true, - common.HexToHash("0x95704ef8e11248b409b15cbfd040d98ff06c714a1e676763a703b65cd00442c2"): true, - common.HexToHash("0x1def542f025dbd0cef93efe77e9967af24eac884dce5be3fb9c617c270b31c04"): true, - common.HexToHash("0x830891a8ef7781eab69b7b1bcef96003fd99762c7f64711dbb7b659d9495c289"): true, - common.HexToHash("0x086484d75ff8c0857024df6c44ff7eb299b1960867e12cd86c53ae9795bb213b"): true, - common.HexToHash("0x3fa3fc5c7dcbcf86f01b1a3d79e6a6d6d205f42ebbf8c3cfde2fd73fdbc78ca8"): true, - common.HexToHash("0x2f2cc2c91d40f97c09a0ea29b077140fe9571ad57c54e3f830fec67f2f4d11ab"): true, - common.HexToHash("0x275108b7c082443826c0c43e73327505051ca052b8927b86323a1bebc67d5f0f"): true, - common.HexToHash("0xbf704530ecab8a64a55754ccb9d88e68cbc162039fa7dca3ff2000a60e679411"): true, - common.HexToHash("0x1c65076f4fb7006136272a213787a8c751085402098575ad35aa96a66bf0754e"): true, - common.HexToHash("0xfd1ac45f1485d5de08f833eae38ed2dbdc576d09f38093ca88da9335cc985ea1"): true, - common.HexToHash("0x9fbdd036abb6015d89efd1dd26c1ff6228d37ccaa08cc43d645b0016dd4b5d28"): true, - common.HexToHash("0x925997fbbee307c40037427e1b99d9ea5396c28e0c5913eca7cdb118bfbad4ed"): true, - common.HexToHash("0x422157b20e0e83f5a9cd7a1d3760ff3635a24c5b67e3251408ed0247929f6346"): true, - common.HexToHash("0xa8c0d272323eb91b66df7a282aa64175d829d9a21e5904067ac14b1a70438889"): true, - common.HexToHash("0x3f32d1049f12844e5573a761b6762c5bab99f15de73a9f3dc77080d1fb210263"): true, - common.HexToHash("0xd64677cc9ac92d66304ffbae16a38a917dbd5a6a49945898edd7b73c392a29ec"): true, - common.HexToHash("0x30a3a12272b1e0a710e7e07e2df4db5108d69b1fc1cb9c71ca0ad4ccc419f59a"): true, - common.HexToHash("0x7702d5204b0ea2ea0cbd5561121dad81644557a0b858fb609719e0deece2a64d"): true, - common.HexToHash("0x98b56e15c0755f796f9e4239b6992e2576ca84f18dfca0af6de958226d6b931b"): true, - common.HexToHash("0x0284ee83a0d54929369c4d394525ba605d481c2a53e7e474a09c593d30f77880"): true, - common.HexToHash("0xd79ad8e601664b1b3947d965c49f356262d1094c9d2ea419afbde56153f72144"): true, - common.HexToHash("0xf1408c25260803f56d1a87165e9674170878beb68d3223c49cc60814878c53f0"): true, - common.HexToHash("0xb757f74b165b9a310298396c0c3b8137a41c59d6db306109d0a8eb3ce5dde1c7"): true, - common.HexToHash("0x5ae0904a9b7ba3ecc50a7142dfdd511112bc09746a361a132258dd714c3b6df3"): true, - common.HexToHash("0x0a33aad288923ca2ea47c3873108989173427ac9424ed0bf0a3b8be7b847e862"): true, - common.HexToHash("0x7a40059d3179b0c6bd9f82e55c016243b0e16cd76d272e374c872f634f17ddf4"): true, - common.HexToHash("0x6e7084f8f50d96365f9a678cc5e022811bc8b92238deddf0fdaa855b04ce15a2"): true, - common.HexToHash("0x8cdc25ce8ad5839bc7289a5a967ff52d5055f8ee3403743583e28e24f87ce7fb"): true, - common.HexToHash("0xda657ab51f9287f817c21c843b60ed26ebeae2a94e848d1e582a51903aa8ed95"): true, - common.HexToHash("0x3bb07cd66579989e3a4cb692ca4d1f00c53b728ed35550f7dd587e159e32e696"): true, - common.HexToHash("0xa42017b6553119a60901c0b03425f0157d1e83715ccfe2d230db48bd838d8670"): true, - common.HexToHash("0xb037c934a79f96574d2e15d552154d3431b4838e99c670794b1e37d71f385736"): true, - common.HexToHash("0x93bed2778fc7885291dd52de659a5e8a0c9c6b8f6d0daac9f0baa71d91a86af5"): true, - common.HexToHash("0x4846daa95be2fb1025b382903afdf67bef9734b47b8f8d083eb4e2611a7452c4"): true, - common.HexToHash("0xa8f660857df07be9f346c9a69fe1d27268e79ce56847620ae3bd24198d7e8222"): true, - common.HexToHash("0x5a11d62ecc71e9cc764e75ef31415ba1cafb9c5ebfbb14a5bc5bc3c5f188b288"): true, - common.HexToHash("0xd931dd4af02b533b23f6e9f712241e61cc7eab964ce4954777be84c802b3724f"): true, - common.HexToHash("0x0242a79393941c69210df482da365eeabb8343bb53935d908371a0a6452d25ed"): true, - common.HexToHash("0xc77dfcd110b622a973ad0ad3954bdfab37371abc816addf434c83bac26032406"): true, - common.HexToHash("0x4287b46a99e3bec14684e18efefd45fbbd28bf3e90e715fe9d389f08e18e3c7e"): true, - common.HexToHash("0x5123edf8b7f76f60fb541c97d3de25373a9dcf0e8f64b1d949e20e1247e3b052"): true, - common.HexToHash("0xd221abd482f6c63dc2f90357c22da28767a204d6e5b814d39170d2fef5006ac1"): true, - common.HexToHash("0x952fbdbff52a265dc28c2b35e449d7a559c5969bee16c471090c9cc134e6dffd"): true, - common.HexToHash("0xcde27c09b22ea859a20baea41461746dd09c9150ec078a51827f17c64dc3edf8"): true, - common.HexToHash("0x2c34d63e3d498deed65e0a474abd2c73796ba0b0fb8b51b0b31bc633272dc756"): true, - common.HexToHash("0xff1dbb4ecf6d7dc9f049daa25f43abfb114e2998bae3f1a81f1108c0009791cf"): true, - common.HexToHash("0xfac3efd74ed3f250b1e546f274ac6a41dbb31ce9bf0a253ba752b7131f99e816"): true, - common.HexToHash("0x022983ed7350621a3009fb0cf531224e85dc581ffb02a778c61b951101cc3b56"): true, - common.HexToHash("0x1b5832d8da96176484e811c26a32ff910067deb9e9313cfd448f3330ca662350"): true, - common.HexToHash("0x8871a3161c56adda03e0be1a44f245f962628bdc7cdafa959e493b5ba1b8c3ab"): true, - common.HexToHash("0xa92c6e7b8f550d0d82f1c20434ae8e137aebe0360defb5602ff4d47ceba7d8b7"): true, - common.HexToHash("0x7b20b960eae02f707cfa32581880459381061af600aa6e38e6aa35fcdae6b068"): true, - common.HexToHash("0xc6b5c36d04089dd870aa73509fc6edbe0b4af72893d9d36cfb9f29bc5a34080a"): true, - common.HexToHash("0xea853b01d8bd9d63987291a68dec0627b9d164cd4446e5b1fba1394a816a323b"): true, - common.HexToHash("0x964f8d80f4d4090b702d55805e6a9b5bf036d5cf3deaa42b80f13ba6f9d7cf8f"): true, - common.HexToHash("0xa542282f391418155303e724b486257763f8843b44227a6129c858aa08f1bfe1"): true, - common.HexToHash("0x1ed9947501572bf45d38b1332124413116298f17b2ec360befb955b6daeba73c"): true, - common.HexToHash("0x30f6c14efa856cdba459b3f8252450b1cd5025b314800d75a629ac9d824b5c48"): true, - common.HexToHash("0xd2189037a8ab31b7e3106fd733d523f8fcbfc6246fae407ad65b22550b8f62a0"): true, - common.HexToHash("0x35c776c73a53c212b3a06325779d7fd77cf95e454d927bce9b2d004381fec858"): true, - common.HexToHash("0x4122cf010141fc35e7db3b4af46c1724903a8397fe3ea8811d5a88bbedb9072d"): true, - common.HexToHash("0x7c3f7c22bf9bfa250d456470278051c84c8a6a1996ec8ee7d7cb331596cdda53"): true, - common.HexToHash("0x3f1c62b30619535724567c74f4f83161676aedced76dbec566930abd4348573d"): true, - common.HexToHash("0x1e957251ec7e61407c0abeb5d7f290179640b0ee2bf9c69551a08be907715f66"): true, - common.HexToHash("0xd0df9d084bd019ab0a98f18b245a172c5b803e380b886f6ef821e15a1d4102fd"): true, - common.HexToHash("0xbd4238d256d1c3dc760e34a720a105330fad06b8c051a117ae7b16a0adac8c58"): true, - common.HexToHash("0x4530ecf03e101da3c2a536da20d18ee820f220ce5ed1c3eb54ac0257c4f098cd"): true, - common.HexToHash("0x96509c35ebd51ebb32a387ec04549f6297b6c1d15d40689c9d7c10d593418992"): true, - common.HexToHash("0x304246e20a33d32fa6ca68962e98d160196a7ec9419f6060ca34da9c9087da1b"): true, - common.HexToHash("0x1ec304aa2b98dccf46bb2624d8288499dd4284cc9c17513896ba33b60b8ca206"): true, - common.HexToHash("0x99e32e536089f9c5def5a22d8b0d0411417a277526929b8a363e2532988c146e"): true, - common.HexToHash("0x35ced9db086dd3a05c2747724abdaf3e70e9fd288a07042635cb2433432c93c7"): true, - common.HexToHash("0xad9b361053bccafb604820e9b1f2707c4c77dcb77071116456edcfff5efa10c2"): true, - common.HexToHash("0x694b60af4be575b7969b10eed523b954fb2fd49dc0581a5db74b1b428bf49a35"): true, - common.HexToHash("0x47b1432f11e155669265ecc9d2b16e1121604632f15d062e790e9141900eb926"): true, - common.HexToHash("0x6c6f1ef21e422427d737c261adbb162c4d4b3d1467c55302c2751a14e38f391d"): true, - common.HexToHash("0x8ceecb00bba12f4f4bb4e4913e069652c9dab4fa693e81f42ed921860500305c"): true, - common.HexToHash("0x63f0421f9a30a54ea223e7cacd60053e54479d1eac54767cc70cba8deee8c77b"): true, - common.HexToHash("0xd6998651602f21500e4000722245547f911e7b8167e572edf2fb2297de25bb2f"): true, - common.HexToHash("0x7a91de10d8dce24ba7439e88dfa4928af2a770800eee1d200b4a436d4c85edbe"): true, - common.HexToHash("0x8c154059cba0c5a2de12d32f868783e67d3cf0b794e95b8ad624a510b1222335"): true, - common.HexToHash("0x336d9f4f5b21c5ae02a978f3cf992b41450ce815255b984e80a868186529da02"): true, - common.HexToHash("0x9a037446fe9f3273284ac7eab9d2551db776d19d857941ebe2532659ddf019e6"): true, - common.HexToHash("0x4260151dcc9120b113d2e38f9b0b30804237c744920b6146ec9e06cd5d46fc4f"): true, - common.HexToHash("0x90d4538246dca53f1594e4b76a8a676a68f69b77c445723eb51b8aa98cc3ba10"): true, - common.HexToHash("0x412fa8362cc7c6e8ab33b66be8f891adf7469f6d71bee152257b5a0e348c101a"): true, - common.HexToHash("0x1275438572918f872d1fcf8dd0113bb0a8c6de46ddafe17cf096aaa8bc3f6477"): true, - common.HexToHash("0x5f3f07c7d1884409369e466568310eeef04bb8c4c10b1aaa4cedf7f4aa35a83c"): true, - common.HexToHash("0xbb261f66e6333d27b891a7683bf26befc625b2855032f19de3a2de761e0d9ba8"): true, - common.HexToHash("0x6bf377a5f31a54b1251190ae9a498b7e3e325b106d76c935a8aa026d8702aa77"): true, - common.HexToHash("0xc457d03349a94f93b6b0bcf24dd74d056904b19d53a209a4aaeaad5185b53c32"): true, - common.HexToHash("0xefb27539840775b41a011d892e358c9e84e42012965f27e3c8d1d5ee6982365d"): true, - common.HexToHash("0xccb4e3a2095294c0df0ceea3f3a9c7618952935b2003ce82f1997c4dcd15b0ea"): true, - common.HexToHash("0x01557b0ae2c37579068263a2cf2b70b15be3aa814c93308cb510743d903123e7"): true, - common.HexToHash("0x9627a8cc1fcbabcc746779a75cd8a09cee78353038f0ed890d4688505b2e239f"): true, - common.HexToHash("0xe3f861e11138cf92ebbd418b6731767c64e757d474f99233fd6e0c77125263d9"): true, - common.HexToHash("0xb3e7623a31cb7ee8e7847134e92e853d2ecf0673608fa62018464bfdb2d2df67"): true, - common.HexToHash("0x457dded3f3800240473873aa646e20903e6fc2ac8da74f18d426aea5ebc654d0"): true, - common.HexToHash("0x8e0e3b345576950449545ef345b661afe02d7f8066f4792368b826a5501de2ed"): true, - common.HexToHash("0xe848844eca7acf4922e01b3ab9313ce70befc753cb9439cb6d19009f350d7245"): true, - common.HexToHash("0x048b6fddc3b36bde07408c0804ea7e2592c58563b59b59a711dda51a462ceab7"): true, - common.HexToHash("0x21baafb7bc2a72bed1e982251f1a937f4f3ae1fdc2160f2571b4c8dda60280b8"): true, - common.HexToHash("0x00d39ae4403c002bef4e31841910ded360623d5b6f76ec838215e7095d3aa001"): true, - common.HexToHash("0x4a7602f51712057cec6f097f41b19add01b1e1350639d8f763d90b749006c63e"): true, - common.HexToHash("0x855f495f32e6d37346f767e1f8bbc4e9112fa3a508a9e31319eb91cac0cdb899"): true, - common.HexToHash("0xde5f661d9d73d7055e18b9f98026b341d3e412db6af0f425b118bea62e8a4a28"): true, - common.HexToHash("0x255a0f8f7bc707d3efbf9dc3e5e67105e24d7b5de6fb0711777e77afc8c6e13c"): true, - common.HexToHash("0x675aed220dd66b85411afe1c2af62c2f2057b73ddfa96209dafef0319734da0b"): true, - common.HexToHash("0x4cf707dd5f9c365718d1823cbc1a893343ff216748cbac25a2cce1d4e6fdc766"): true, - common.HexToHash("0x7104af8e9431a62f570af29c4c2f5c64a42379cad408b6fe06a065e48848fc90"): true, - common.HexToHash("0xd2b56bc453c3ef187b76dc12c30f06fb93188008faa755f8512d2c32fcd186b4"): true, - common.HexToHash("0x2f17f208ab3ad3e0d8d18287869f9f60140cca9751bdf06e5ab30662511bcf0b"): true, - common.HexToHash("0x32ccbe12883eba01cde8c371602a78e4dff7b33d4fb4b4299bbc2e0ee94a8414"): true, - common.HexToHash("0x350ebf7977a80b6ddbbff343818c8fd34a94651e5dcb367e4dcdecdf1ef7cc32"): true, - common.HexToHash("0xaa84faa88f103930f11ca9f257a60b4ea3eb6ee4f2bda76819fd838643910b0d"): true, - common.HexToHash("0xe8ac1469cc4d77dd1824a805b07c4d995ad29f03d9f1a74ff4a929d0193ffddf"): true, - common.HexToHash("0x12e0b76058b08ad20538c3ec1e97c4f1c5155241bef20e8cd8f34a5c40f038f9"): true, - common.HexToHash("0xea607eadb3d3b7f30e6fcb62b67d6a99f040c5b0f95310a57363b16daad62262"): true, - common.HexToHash("0xffac8d9d87159c62a8ef26640aef7b89afb2c9d2f110479f60fbf6e71e4d65df"): true, - common.HexToHash("0x050570d14354f56cf7bde0e449fce34311d3b093565ea48929e928678395bab9"): true, - common.HexToHash("0x5af8264eaa7a41de1d9d1df8d81b5d1c85f5ce7bc9b5429bb76efa3f73e8ee67"): true, - common.HexToHash("0x399f90f8027ce6dcb8da9f9726e2def702f95f062be9a6671024718029976444"): true, - common.HexToHash("0x2f756af78ac3997b2bec8a7d22bdb458e3af4a169ac88524b1eb050880e05b0e"): true, - common.HexToHash("0x222c3cc7cd49d2bded88ef53f9752d021f3766687d0b9869974a91339a1fdb23"): true, - common.HexToHash("0x6a035ac00eb0ecfa0e35b3ecb3348f6b5bdb624764ae037f4208c3b7c37187b3"): true, - common.HexToHash("0x177ab4f09e06727de2bf27d1943c7d031355324836b9344748c7d97160206f15"): true, - common.HexToHash("0x42c340d2accdb95dabe153917ccfd9294f2bb99ae2ed24c377780cca27d4822a"): true, - common.HexToHash("0x4d5baf352e5a9f35a92b295371754373073f2f8d2cfa6a10c842ee00e787c0f2"): true, - common.HexToHash("0x5881d4874144f1df0cccb35a4203e7ab19eeba98604706618efdd6aad073b201"): true, - common.HexToHash("0xcabe29abc1a7fcec68f4338aa71ee4d07c24ed12bcbff949ac25c75e2c3ea7c3"): true, - common.HexToHash("0x4dc09800bad13cbc115a264863aa8a72aaddbb89b366e05aa0800c63d946578d"): true, - common.HexToHash("0xbc1df678a9ad0255691249bc499ac01b628d1a39953ca109540f1d174e3ccdba"): true, - common.HexToHash("0xf870c9419833b1a2916e96baf79384eb29d0f82c09e3bd2e27aa96ce7b0da601"): true, - common.HexToHash("0x0ac088bd182132e2494ee65e3f5753bb4c57aec44ddcd89068178bc6d3ef4d00"): true, - common.HexToHash("0x6a0987cc63d26f3004116b52dbc264e84e0f58080f4ff560d963bfb78ad592cc"): true, - common.HexToHash("0x550d3ee274cf0fbffba1b8ae4abf9e164c63bba42ec74985d6f577b00a91daee"): true, - common.HexToHash("0xc33f99b63094dde8ad5d33659daf0cad122be69487e83bffcfe587445b1c9472"): true, - common.HexToHash("0x58be4c8f3c37341309f0d408178e45e64129896dceedfc2dc3fe34948c398f10"): true, - common.HexToHash("0x7a799f6e5318e38248df754c4cf362bec4a411c7113f3115daf4993a67c5edbd"): true, - common.HexToHash("0x79c287e4af23fed58c53aa8b2180758fa74837b66fc8a3c03e4bcd1ff135b529"): true, - common.HexToHash("0xba2a2d7095cd3d6e80f7cd33a7e38177fc9a3adff3b0c1c01f88f22746ef204b"): true, - common.HexToHash("0x8f08405cd120f56571d8ab0740de369fc566318f756cd5670c7a8396c6464db3"): true, - common.HexToHash("0x3c28f247109036eb3f9fcff2f8c9959cc0ed881bfe3554e57a2d0d987dc07800"): true, - common.HexToHash("0x1306cbf4423d6bdf89ed8a7817c03ffc6cf5e13919c5fbf803f288da3d3e7925"): true, - common.HexToHash("0x3a910c9ae2321a3a9103cac7d9d19e04d234d4e758bca3c0ef928f47e6d15896"): true, - common.HexToHash("0xc1426406007cfd281eb5eca1e4875d0c4e28255763ae4a35ac04dcc021ed65ed"): true, - common.HexToHash("0xea1f030435b5aa37e746b232c020e9f9a603557d3ebf95fe1c99515d8d308033"): true, - common.HexToHash("0x2a6a9a3381a09599c232ff969774cd2b9b39a050e42ed68c419dc70f5941fb04"): true, - common.HexToHash("0xd1834a0fe16a195946e834319f76d4382100149166f225252b491a892d0ff59d"): true, - common.HexToHash("0x1e3760632869669c408b39c89c549e3f9e63a24d750cf3e2fcc720a8d220c219"): true, - common.HexToHash("0x288eb45f334a360ada3811dd776e7a46dbaf545c93f52d35a4caec81fbb0eb0f"): true, - common.HexToHash("0xd40d05b714fd8f6e16cb27e18745d2acb26700f8d75c852d219b4b987af5f45c"): true, - common.HexToHash("0x5560aa37e4678123eecd56d1f2098835fb3891a2cd6aab2ffe881cbb316db59e"): true, - common.HexToHash("0xb548151d7303a4f8a66e45a5c6f5a6be8d273a9a8a10e85c29dd892bda17ef76"): true, - common.HexToHash("0x973e09929330386e0a1bf5eabe903bc3e2f165b538eb1d61196787902de98ca1"): true, - common.HexToHash("0x7881dff9ab062fb9341e94291c3f66c141d8404922d41ab5dfa606402115e384"): true, - common.HexToHash("0xb855a070ed273a8c44e7b0118892ed4e2f8dc9b020150f3fb331f779bec2e741"): true, - common.HexToHash("0xa16af3e2f0e77f869bac8f3e5eaa17686612e150495d1571220479a5ea32cde5"): true, - common.HexToHash("0xb019045e448d13754563c20a2105a41991b1bf4c6f8778825c24736f436a8ff0"): true, - common.HexToHash("0xeb37bffa9c54578fdcf70740b039249bab9813bb808f9b979f25106ef34d7043"): true, - common.HexToHash("0xe4643e118e59f67171e0b8689616043e670a9acbf4b3e3e93d757ada7a1383b9"): true, - common.HexToHash("0x0b6e6abbfc60e5eb9f734d5b0a4f914434913af09b650974f3ecd3ba406fdddd"): true, - common.HexToHash("0x1557a22ad02b642fc7e942c63ec60130010b85783e9c936d8861b1cd35ad9261"): true, - common.HexToHash("0xc7a2542a5efa06f7d5475f94c9a251876e5e65acb8f13854644e8f03266b6c62"): true, - common.HexToHash("0x1a6cd45d326992ab9147335a24b822d913aee7f458a1154cb16a1a480f986390"): true, - common.HexToHash("0x0892bcb51dbfdff1bcae2243753a16edb219314d426086fa22267e7d3bcecb39"): true, - common.HexToHash("0x9928ffbab398139fceba6b43b25cec86b07a025bb177a9d770e92a22a4530f8d"): true, - common.HexToHash("0xa1728737fed245d991369b1a3f28d8db841b5d6600bf9476e7a2c8d774ce73e6"): true, - common.HexToHash("0xf117c577155a57ee6a909180c6c44f63b80e80504b0b6999a10af928c360ce82"): true, - common.HexToHash("0x8ae61ab75341dbbd4c63357d83cdb83e67aed3d9c35dc48a684aafd645b7373a"): true, - common.HexToHash("0x1fbfc44c633181852af2bfeddd16a020a452ef64df478cd56f18a12b51c55f73"): true, - common.HexToHash("0x9c139d3a16622ba994abd5958c9b6ea9352e03b8c00a881c61e75eb9f6e29451"): true, - common.HexToHash("0xfd2d35b9796f49d5aa490ad5210aa7a2cccabeb6d9a96eab0c5cf72144201d59"): true, - common.HexToHash("0x4ebc7b7c598b6fd37dbd14a1da92bb8506c8d88a315293c46f72cd2023df91a7"): true, - common.HexToHash("0x34e028fd72d269ea29131c6cd8ce0ff6d0af2c98f4af5595f0c2cf3a38da4fab"): true, - common.HexToHash("0x0c3bd31dc3d81a51b095b0cf29ecd96cdf97bf454007ab6c2e8c5a2ac62fb6cf"): true, - common.HexToHash("0x4aecb34a4ba83d842300983ed5f27439c7f27c4d17b1be109a1c14726e66e4f9"): true, - common.HexToHash("0xad66401c77e543577682fb96f749b1fd8f474c629312c4ca086a50249a937bef"): true, - common.HexToHash("0x9d192f69197611fe7b56f0f87911e38b72aeacd6b9af07bd29b59e61b351fcc0"): true, - common.HexToHash("0xe8113b46a94599da40391ee85f37adaddf8c301dfab20d5df0101bda95ee0e9c"): true, - common.HexToHash("0x15edb2e9ec759c6325c1c38e9587938f2731d7b58b81e0740a95a566271323b8"): true, - common.HexToHash("0xdd93f1c24e3000d123a846f6657ddc21ffaf13630344deecb7668382bd268465"): true, - common.HexToHash("0xab2e5df3cd65249401bf4686c5c43f80a4fb381ac09b5b0be2664a00dd979ad9"): true, - common.HexToHash("0x8cce7656412df17b59e02d6caf3eafcd619cb593c9ed5a1c240af99ce37fa4ce"): true, - common.HexToHash("0xb98806fb7cd6e8a5adb3365029973f8462db9419d7d64ebfe1fc74485b236c19"): true, - common.HexToHash("0xed6e2b0795b909370688241905765bff748407485d885a3f43fe02a22143e63c"): true, - common.HexToHash("0xa365c24cbe62fada35f807513ff5ce9315e7587182fed82c7835544aea23ca14"): true, - common.HexToHash("0xfe4777c9d392f93f03e3eda3b297a478254fed7a88e25193ac05f0e16163b6cf"): true, - common.HexToHash("0x5e666339b2d5c5928438df8ad1f12d85e3cbe6dc5da4b9cd5d7de85aab8d5d88"): true, - common.HexToHash("0xb20d6a343c823603216ecb8df0033d6f42be6e055ae15d2abb315585ba4790fc"): true, - common.HexToHash("0x22d4a813714d193bcd6ece99e2f3d8b1f5db8fa3a54b52b7a463c050e622cac3"): true, - common.HexToHash("0xd5b9c652167c2349b10740d5ba9f7e5095a427630473af6f42e68128fa142034"): true, - common.HexToHash("0x1b8037fcea856cbed93b6916da35b3d3589f4e1792399e9fc40091295dae5073"): true, - common.HexToHash("0x9eaeaf2448789f254a1392145097553a6236b75989de5ddc6262cd50bb91f2c0"): true, - common.HexToHash("0x60bbdc07af2e5c5f51f55bfde0594ec55d5bef74282155524813e22ef519f002"): true, - common.HexToHash("0x3b9adad1fcf45dc71f9f357539796dfa8715459ad247c5feeb6559f1ef717095"): true, - common.HexToHash("0x976a8b2995c947041f6be7bb08e50f864340fada4be02eff701b6f2cbe0c8037"): true, - common.HexToHash("0xd1a40a047915bbcced79e3c3e7af7de78246cce369241f70a2f17d6dcfd99b0b"): true, - common.HexToHash("0x2078c29b1d8183cf3799136c23b997a0e44a9e09f1dc5051ac695426ec810d8a"): true, - common.HexToHash("0x8bd1c98df81a2af507a23ae073b0ec0fadce072e1951273051dd03afd872758e"): true, - common.HexToHash("0xe329020a18057a8cf68aa3a4a8f2533f2f4a7e2c4bd2400044b933cc60280dd5"): true, - common.HexToHash("0xaee8abdd8871c481edfe4b77f604c2157d9488f29b128d31b7807cb678b04303"): true, - common.HexToHash("0x7d1fa7c5fe5c90f0e85756cb4f61af198cebb597d87870d75de17b9e357709b7"): true, - common.HexToHash("0x88622c0428ad3d9efbe28df3d21f4eb5bb893b475a827e056b6735b9f3937c17"): true, - common.HexToHash("0x7d56620a1c743c146d385ae7ea29b6dabc7b42ece6502357a0f3701c0a37c068"): true, - common.HexToHash("0xa5586d169f1cae588ebab0b41d5a655ce3ab265aeb15f8726d97b42751a0506a"): true, - common.HexToHash("0x9ad02381381d886ee7e0ee4c6945e45365b04e59cb42c77f89875e1359d81e40"): true, - common.HexToHash("0x30468631f00f39e9363286c77d284197074f30e7ec7d3dedf5c6c750004ae8cd"): true, - common.HexToHash("0x63dd76525456ef4fd1a15cfd61f9a0f038aeff24765006a3be3c44775381afbf"): true, - common.HexToHash("0x99a0f2af744228016c531ef2ea36fd813ec07c57c512c08c59776bb8e9e07a81"): true, - common.HexToHash("0x494ada7d831331c71a7eefd59ae7cff9fa8e2487ad6d679cff231368339a3c55"): true, - common.HexToHash("0x19fdff97ca257471afcf1180ece7793dd053b6d11db50407edd8f2da6cac39e6"): true, - common.HexToHash("0x633023e7c17b4404bd0e8585f7a1ea899ab70eba8c0acd4ff32e30ebf7b8a115"): true, - common.HexToHash("0xc9e31484f1a1170df05eb2b71dcf110c46cdf2f91a104fc9021c5bf5d0e85dfd"): true, - common.HexToHash("0xe25dc38fa7a7a365a19db47bbf97ae7e71b91f58df397d09fa3a5a138381d91a"): true, - common.HexToHash("0x802605f4da19ee8dc2b812273b4f3b41ba3799c578527f89f8a314fbbc4ec724"): true, - common.HexToHash("0x2c60b16d4c036b7aee3d17d851493c1682569a99942aa8a252d48a4e3dab539a"): true, - common.HexToHash("0x914c7b180c996df3b7b96f495f5decc9bd2793ec492a385121a7dcbde7678ce2"): true, - common.HexToHash("0x8367a3b9243b75c4100cd7d66dc19014729a80a338429b97d4ad2efdf60f2e09"): true, - common.HexToHash("0x9b388e88deaed0b1b30c1c387b3861f95febd629193569516b56d9a40b0df6e9"): true, - common.HexToHash("0xc9f886e8ced76f7b3d89c676e346e7fd0cc6ddd2b66b74e0d0bdce47a175cc17"): true, - common.HexToHash("0x636cdb15139be6fabacb881c77a55c146d477d74971a97cbf9c88f7808969a18"): true, - common.HexToHash("0x323e1c538f1df202c2928f9e9279b7733e2b5e18ecd5c49d5aca53fb0241dbdd"): true, - common.HexToHash("0x67ea149edaed68d38176a496f84d8fcb014eaebaa2a9af300d3c02d74352ea20"): true, - common.HexToHash("0xd6bce857bb24d4efb51c2d78b7249a0dd5801d08db275a1a14ae44a76eaf0c37"): true, - common.HexToHash("0x72bb5a6693eba95a57fbec528cadfd5570d07772ee5c3abc3f5f9a21339722b9"): true, - common.HexToHash("0x6fbee03468f144e98ffd07d9af4eccfe517a16f07e384a54f0b5e8fe97c6c3d3"): true, - common.HexToHash("0x0cb66a89736996888280d5860b1f62fbc133b1cf7501e14675109e733111e2ca"): true, - common.HexToHash("0xd97025b4efe6e0607b038d7176e02929bff2db9e66bb58390e607911638c5a54"): true, - common.HexToHash("0x227fd9f5f2c814e033e7380205761d2470a384ca36faf4c4da8a11d75b22c070"): true, - common.HexToHash("0x8e017065ad8b4ae2a25a7a88943113aaea8b2dff9257f89c8ed2035ebb149858"): true, - common.HexToHash("0x8fb2770c9470a529a263cb1055dd174c208245976de48e0431a8748732239e2e"): true, - common.HexToHash("0x2cd3a002d1c33df5b6eb8833f6c2c294805b961f44aa6a9868e1300b9caef0ab"): true, - common.HexToHash("0xaf13fb49eeaa06a9154df6992ec7c0c7114838858801fe9f8b4edc1cf406e422"): true, - common.HexToHash("0xfdbf5c8f17a258d44cea13ad6cd4d9239057d7eda3af9b3d4e95fd22a7562aab"): true, - common.HexToHash("0xe0b6df5e22e6d263c64287ec5e4b64d3d61fae0c860800d0f72ce055d9773921"): true, - common.HexToHash("0x98dd8ce9df13dd763b493a748359cef821b6e50daded2181ba14abab998b80da"): true, - common.HexToHash("0x5ef79687d0565fd72f32a7bf0f311cfe026bf5a6ef0e3aad500c7e80f6da8b87"): true, - common.HexToHash("0x28ed9df1a4decdf0475fe2343a558d4e015f9c4efe9839c440fd03f6b9c7ee9b"): true, - common.HexToHash("0x019e43152b04ea999e0f85c7618d431cdf6cc9d1ecf8dc71c89c20fa3c78d3c9"): true, - common.HexToHash("0xbb66e2a2554188bdbed5ffe5fcff58e0678ff73164bd71e2f75ff865ff64262e"): true, - common.HexToHash("0x01d690583e3de2f59e1c75dc6136d3cbe7d6677b4d274ff31aa20f0fd6fa62b6"): true, - common.HexToHash("0xd76fcd1cf4fc95325eb1b6b86bd4f2c74ef2c2f384923b1ee2f1c507542e37b4"): true, - common.HexToHash("0x0b376c294c6992d104af00dd93309eca05e058c341197f7ff3c256e1923e59c4"): true, - common.HexToHash("0xe58e2cdd68e2881a23f1c84b19b300f61e38091dd99c034c9dd2d400526fc25a"): true, - common.HexToHash("0xe74c14994fa2581c9bbb17c586481e17690a4259fbb2425a7b8409ef717b369e"): true, - common.HexToHash("0x1f2b97b1f27e7e3aa809e86f996b6b6227da5bb50ceee0315e393eb913f6a9d9"): true, - common.HexToHash("0x09554dbc65d50a120d95384cd04665cf85ecf2909d7d4ce9abdb3dfea3d6409c"): true, - common.HexToHash("0x6e3f357ccb062373de43a266d0cddf290414ee7edaf90e6bfcc1613dcaf28272"): true, - common.HexToHash("0x845e11c597d474e8ed77e105bcc4c250662ac53adc47389cf8b5912d6e72e695"): true, - common.HexToHash("0x2898f62845aa2abe6af16df17e2e065d77f09b23854361b7628b9a2a02b67bdc"): true, - common.HexToHash("0x76d63eba9de8ef572a42849408168fe7dac41241503e511c5cbd258abf6343ed"): true, - common.HexToHash("0x18443599f26a066bed3f10d8b779385c2d38cb47e6071d578189f7bb41464cdb"): true, - common.HexToHash("0x19edefa786ed9f1bd4cb6c2c02dc3a23939bbe79c0d891bdd5249dae43626273"): true, - common.HexToHash("0xb1cc159bdab2e5df2d2e8e9851327cb4e134866de20ab6acdb5af9586996ea95"): true, - common.HexToHash("0xd9353122f91e8a85aae3d946316385bc2b352838e4ecfc1fc8ecdb4cbc7e06a2"): true, - common.HexToHash("0xa0de135251ff4de5d1feaf1bc88fde0d69dc992bfc5e926b4a3010ade3774add"): true, - common.HexToHash("0x535bb236a12768612403bb0ccc0f5633aba18ee00c698906e1480bf90b1c101c"): true, - common.HexToHash("0xbbb6a75f6d96e2155f6037b49441511b2e6cd2be905c297ac9694dc949ea56d5"): true, - common.HexToHash("0x06a75cb47c7de6a464424582e55163727a6985c5d7129170630e984362a096c7"): true, - common.HexToHash("0x5962dd40b1b038b208745dc9fc8d77859cb12b7249f5500c90bace2c81eeed18"): true, - common.HexToHash("0xd4b090bf741a3ddb8b9947b1297d33132498fac93431b25d0ae48b75fe47159b"): true, - common.HexToHash("0x29732e7b55aff9564a5e027da8ef64e4cbae975d6c74964416570a8bf03a2e69"): true, - common.HexToHash("0x6c1b67338f8a6c29629a3042b0292abb51ffa5f507484271ac8b9bc2b4973e1c"): true, - common.HexToHash("0xa46a5609faa9c857aefd1daad3efedd44dbe9a3d75abe3daaec286db1cd904f1"): true, - common.HexToHash("0xe18fd9f4a11afdddc4dd943d238e39c4a65e0981192be8e516d7770885038605"): true, - common.HexToHash("0xfe7417b36e55b6106944ab60e9cb2f6874854600f4a3f14de771ae499e33123f"): true, - common.HexToHash("0xcb9ddd1a47c778aec18a4e55cd6b2445c839eda3a65b9a7599ed692a891a10eb"): true, - common.HexToHash("0x1cc001e25622b992d5b44b872f8fe72d8040dd3db520909a2a52c9ed1a75f784"): true, - common.HexToHash("0x83d331ab3a3e59ade0ed07a99c6c38b0ef57aecb775097289c0e1ab1466c40dd"): true, - common.HexToHash("0x1288be02d3be0235b2e43135e5c572c8ed25c2188244851e994501274acc56ed"): true, - common.HexToHash("0x18a6141426bc89d482669fe6d8fcec1882a208ecb735ea0da221e7bfbfef7193"): true, - common.HexToHash("0x90c1306a4f31999bf63e031551ff5dca6a5de19301e1ced1ea828930e411b35c"): true, - common.HexToHash("0x2f9a53db7787372edd8625643ede618de71e9cb7ed2629339ebdd4f2d7f4e95d"): true, - common.HexToHash("0xe756dbb5e3c59762930013f46d57ded35e7ad85745ec11cb8f1e726789d471cc"): true, - common.HexToHash("0xd1f29676cbe907ebe1f4645a6d9cfa429465797b7a42f5eed393e5b2af3154ab"): true, - common.HexToHash("0xa75872271fb9018bfd4dd42a6caf682e5cb9777e62a244bef39f0665d5ab49f8"): true, - common.HexToHash("0x069c328a84cea9ccedea5893c782097c6dbab4ab24efd3951c2337ec6a12a3a5"): true, - common.HexToHash("0xfcc1c1c8f3b2ac8ce1608a3821e95e082279d176c48f436fb3a687ed250bd979"): true, - common.HexToHash("0x450d6dac79bf89cbd9ac2b18c18d1759409e19cd0a2b6d4a5cc6e7068b2a0a4f"): true, - common.HexToHash("0xa561493b737141e90a45c01b9d78256a5740e9f5d0645b615ab265af137e5dee"): true, - common.HexToHash("0x92663b79b6e533d755ea0d80c0c25e8c1af44be79f0e6ea3dd71ab6fa1c0cc15"): true, - common.HexToHash("0x30419c470f07cea782ef2a94c14e8dcf220d799c23d17c84bd001ad1c7bc36f7"): true, - common.HexToHash("0xdb41b50dc770097f3e7fd14a627477a4ecd31ea27298f2cd6a15ea5ce7299fa2"): true, - common.HexToHash("0x4fcf896baa2dd9f4ecf62e66e6552342cac354d6000581301b96e9d65986f90e"): true, - common.HexToHash("0xbe4695308b8859b14a55ec534f3e9f57cf998b37df8b66a5baebba4c396379a7"): true, - common.HexToHash("0x91c554b5460faddb1da01340142dea1ea777e180340d87c528a685a447ad2377"): true, - common.HexToHash("0xe133808315686de252cf3cbf1581a8f879d5061a4b6442d9162b3131f662f0e7"): true, - common.HexToHash("0x4c343fe1cf3f17d73bf80c52a20f71039dd9182a80c5acb148863a9d12965eff"): true, - common.HexToHash("0x79491621f33374e656220dda9fd18f02a5de1d160f65918e973e7f5cf9c09458"): true, - common.HexToHash("0xafa8a1401a7d49202101e51cafd0373b07522ca4f3ec4f4b56ced1f395bf7beb"): true, - common.HexToHash("0x27c764a0c8acf69c9ea8432821963f73a4c693fc4fcfb93b9699a5b227cc33dd"): true, - common.HexToHash("0xbbf59d28731f20e87b61608ad3b7198bc38fdfea2624afd411db1946aec5d4a6"): true, - common.HexToHash("0x608d2061e0938b06b57c1ff98dea0f00a581efded407aa715792795a49a438e5"): true, - common.HexToHash("0x60d8f3b8215c8948d84d3d38027aca506fa93ededa61b8683253b3bb8735e6e7"): true, - common.HexToHash("0x4696ce1663a72c75fd1bb7dfc4b0becd5fd847914d743e3669c4ab0b51835ff1"): true, - common.HexToHash("0x892e740076824515c87255319806f80887d0220109f52ae4741862dabe6cd0d8"): true, - common.HexToHash("0x136b9a5be2bcc12ddc0c8c8ddb7cec9374149d09b8a0d90078f572f8089bcddf"): true, - common.HexToHash("0xd7445b982559e92f9aef8b685d1c72eb1dd2a0cc292d68910a4807f9d518ff4e"): true, - common.HexToHash("0x7c8f0e685040671678018b5071b266852a320f2e6cab82cf7757cb1e1ec387ac"): true, - common.HexToHash("0x7f7a798a922dc9d066ac7082cb7d315aa9bda8b908684a1a0387c2368e7703d7"): true, - common.HexToHash("0x28be9908cc38e201b0006b69d0fc41bd0fdac3d7d0af943629bdbcb5e75d1a7d"): true, - common.HexToHash("0x9901697e7fdd24129a512d68bc5dd02e4e1dfe7607626ee2c3599bc89e3fdb85"): true, - common.HexToHash("0xc38327a68d06c66af2a67b45c73e410fc13c681fbdd3534f192c70c6560c6595"): true, - common.HexToHash("0xb2c3c05f96a03d29902da201c1f074184d1ae31b51963c4e38850a5ad9119f4b"): true, - common.HexToHash("0x597a2c19cff082aaa79f3e199afdcb25a0a879a86d43189f05f42fb1cd999992"): true, - common.HexToHash("0x0ffe5bcdd20730b448a546020870529b309cdda7cf7632fb421c9f21384ca471"): true, - common.HexToHash("0x290d8d9784f9c93200d72279e24b48eb6095167d25ce231bf7f457e21cd02724"): true, - common.HexToHash("0x6fce4223af87998a9144c3f7786c6b9172848af4295e81845676cb7f20446ee7"): true, - common.HexToHash("0xb334ad3c659cdd18d3bcf4cd9f800645b05e574f7bd3dea9efb18ed5526e8141"): true, - common.HexToHash("0x5bc33256358a447daa226c032077aa0b4c691f4a3c1b66cc0d5900406e79ad2e"): true, - common.HexToHash("0xe6256b9f6e06fd89057850a95804fafc407f8607d67f25be7062a3009091a335"): true, - common.HexToHash("0xf92950e5b00d6a9c9d73d6a86d62612a62a5a1c3575785eec960e3ad1f2db968"): true, - common.HexToHash("0x3bb168efcd48038f527009c027e6cdd451290c0a7fa3a6a3b1a8ebd4d3b97c4b"): true, - common.HexToHash("0xa57aa63522a26978552e654b2b75aad510d729ddf51145fd48d4556db3b7faf8"): true, - common.HexToHash("0xede38e42dd0305f0df1abede704d3c6b3c46de2924f94fd0f4b5da5b85331105"): true, - common.HexToHash("0x97fc883fd0bc519f11911e861c7789c30923cc703bb6f4e0d4faec71d58d3b65"): true, - common.HexToHash("0x93a45c51f19f3cebac8f2ed892602ffa80956ab932ca422d09a76f6f9f9e178e"): true, - common.HexToHash("0xda7f4fd106a848593f60c1fe4e149dee59c9f972071cead3773cfc338ae8155c"): true, - common.HexToHash("0x4d5d119aeef305221e2cfc5f8c27c787fcea4c9b4c17987cf258aabd03356adc"): true, - common.HexToHash("0x1e41bd12c4cf5b91fcb3ebbe9ab374c985ea9e7e8b022bcdf12614e7a0d619bd"): true, - common.HexToHash("0xaa5920dcc4ddce4fc4c2284d70352a42e707eda624cd83c61f2896e8c6ee73b1"): true, - common.HexToHash("0xf7b6386f31169fe846808732217f66077d8c497d333791bbb3a80c2a6ee0fcb5"): true, - common.HexToHash("0x02ca198de2843119a1832a7befd2109e94ff794bef94c5c2ec1841426e02e89f"): true, - common.HexToHash("0xa9d0ed56b49da83dbd3734f9fbd55666c46e2d1ab7478b4fa7fdc87370b3825d"): true, - common.HexToHash("0x768d69667fd4c683ff25b805aa6da22f9f1d3cbf52df15655d44eaa0ce04b7f8"): true, - common.HexToHash("0xcc7a6fe20739950f1efbd77295d08e0d009dc08503f498e44729c556d009ca66"): true, - common.HexToHash("0x06aef0a77ed72ec956546ae67741c21bed08fc78295bca1388a5b6f9eb6ec209"): true, - common.HexToHash("0x0526b56a9fd566a6a38aea4df8ab247e537e88675237ea5859c3f42d4f991122"): true, - common.HexToHash("0xfa316ca1cdcc82088f6d7d5a2532b8c12336a8d89373d34f95bacec4acf28597"): true, - common.HexToHash("0x6de109e61eeab09153a2c4792f4148790d18da0c74446f56d4719b224620b90b"): true, - common.HexToHash("0x71076413384858e4c25e8eaf79e68d5b9e4ed1ce8e3ff5f90e69ddb9425613ed"): true, - common.HexToHash("0x3762545899c470ada2668c9b159ee92a544955b0532f6c8f8e0b82844735e191"): true, - common.HexToHash("0x93f3dfdb12733bbb11ea5264aeeb2d4c8339a0d777eca217c260c97c8c601ce8"): true, - common.HexToHash("0x2a2f1766c0dcf976a1ba5c6d0f8b5bc2e56b1f65e4e9da621b3cc1d3adb12b3d"): true, - common.HexToHash("0x85fd5fcdcdcfd51f2801cf782809942d90a344bc801e378b3b37dd601f097c7b"): true, - common.HexToHash("0x23d0c4b3d9e581507c1cd5d34c7e51ab05b458f0a9fffffa31d57da0a3d305db"): true, - common.HexToHash("0xd5741ce19a99675d156d60ae914f64789fbe4694b39b67a3ffeadb3d34435a70"): true, - common.HexToHash("0x39e9096c984eaa91a2f592c238c9072f5d1907d970689b5ec3e2559b4f44728a"): true, - common.HexToHash("0x42fe934bed9217b21b99e9e251437fd5dcb7d6f76fa070edd6bd47f1d324d842"): true, - common.HexToHash("0xc8e05bc0553ebe45346ab8f3619284dc80cdc4814b655638ba53b6051f237439"): true, - common.HexToHash("0x8417e5aa5ff12f366e9397dadeb029c5df2da33eeb8e925143127396ca41cf6b"): true, - common.HexToHash("0xe3570cf54410e4a0f10efb07cbdc170c1ad3f72e861bdafae5041d9b06661df0"): true, - common.HexToHash("0xf6e3edd89abbce995fccdce4d985817bd4c11f3a1c3a978604339cde5219d29c"): true, - common.HexToHash("0x6ab664ed3be6ac229ddd5dd59ca9ffb530a6bc49e8f43d49bc1ad0521f6495e8"): true, - common.HexToHash("0x1ecf718533328db45123719dd29acfbcd38d91746f7fae2e5a50f5d073482653"): true, - common.HexToHash("0xe40cf2eaa819d618629e51e77c794e932e4f65403711ff65a00029f3801b5eb7"): true, - common.HexToHash("0x35e25cb589caeb18cb7f0bb706145d273672b8b2cb6776e265292ba1974310f9"): true, - common.HexToHash("0xeabd282284dba45c4765a6d80e5dcb81d05a8221b819f4561b6e86cd6d08a624"): true, - common.HexToHash("0xfb28619b924789550afac132c872934c47fbb5a65a038aaadc0e16fb9df9b94e"): true, - common.HexToHash("0xb682055f4040534137729631de137634fa33dafef8aed7fd3872f89ca9aa815c"): true, - common.HexToHash("0xaa7d944e9e4144cfe0cc9a8ecd25f12a38544ca80074e6bbacacb52a16440ae1"): true, - common.HexToHash("0x7495476f8e83ab3759ce2e644dfe87769de3ac147e340338053a10480c691131"): true, - common.HexToHash("0xa3bb4a3e08bd56030d3faf5aaf91fbcb0a01ad6ed8e22fb08ce901da444f1b1a"): true, - common.HexToHash("0xb11397b2983bbefb1aec59b21bf31d312d774c0739b727d45d72eff5789b8818"): true, - common.HexToHash("0x3147779a3a7af04f666281630f63506bf5120ca91bcdfae5dc1ff4eb43653ab7"): true, - common.HexToHash("0x2aeb3c39013b2e81a07414d06b7a99bf1d7430a5865f09ac7b7ee3a6692685f2"): true, - common.HexToHash("0x8e96fbfb8984f4e8099c88b1be9635625eb87f54d2bbea2649cd3f566988cbc3"): true, - common.HexToHash("0xc336634f8a7ce9049c27b2f96cc064202413dcb06d4602b444ea5ce41042b40d"): true, - common.HexToHash("0xdd2e54e00d1c1acb9e80040a050bb98e41a264343a8220565af80c273f038257"): true, - common.HexToHash("0xa30554611c9a285072f5dc83bcee47afd303538e26940d719cfcbad7962ec939"): true, - common.HexToHash("0x4c98464b498fa91b69e86d03a6f787d62e21e77a54be8a0ba06d1b30e92edaf0"): true, - common.HexToHash("0xf698e7de5c705aa9081259c0a46d269675344bd29385539bb77e7822207c184d"): true, - common.HexToHash("0x95e3c7d5b84b757cd6e591a0f2026a8d0365dcc3f9bbd0d0ba38c8f1bac833b4"): true, - common.HexToHash("0x9ea4f7590afa6c3fb239ff0346451a674c43428cf72826ec2b94c3e3419915c5"): true, - common.HexToHash("0xa71c6c5daf24bbfad5f772f39b601cca23ca8ae909df311457a1231256817193"): true, - common.HexToHash("0xbf5d8d5d09115b63760db24a7e201e93b94981a4ab9deba1018f27ca87819d4e"): true, - common.HexToHash("0x785be52c79100a918f881298adb335a02a2f494ad9e2dd0c28da2701a22bc058"): true, - common.HexToHash("0xaf8d5e5b8b16d790c79d1b1bc3e1b1934c3c38439f20a516846ad75946df6b20"): true, - common.HexToHash("0xccd2e83fdabba5f4812c68516ea1c767635d604102fe978b31241fd2f6123df8"): true, - common.HexToHash("0x61f7652b169402c8399b6ec62e54caef2dafe88427325d4d2f4a8bc1d4be50f6"): true, - common.HexToHash("0xba62d4ee4fd5e1ed0c630040db8f1a4979e98de156dbff49a1d9e9a285f37422"): true, - common.HexToHash("0xf9c36174b33856b1da2a50a43a2624c55672c999d78e8a00268bdcd34eacb9a7"): true, - common.HexToHash("0xd307cddafbbcfd8d140b95e1cdef0d4735609e723d1b8aa7cc792dfd77b01f55"): true, - common.HexToHash("0xa9238d1d12a0eb059445ecefe73d33b32b1b6749664c5bd748ac08fafbc3695f"): true, - common.HexToHash("0x850204c9336707fb6e21f7bbcdf1c76fdb8d88ca0a90243650707c81659dd889"): true, - common.HexToHash("0xbf6e2361afade5790528f74a22b2a61238b8b4efe44593877e785423d161be09"): true, - common.HexToHash("0x72f96c828db323e88651ff3d48ec30d3f88c0721555cf9c92a9ce0da364e2b31"): true, - common.HexToHash("0x39877e371be1adef25acebfc2155af9a8f41fa50bf0e468bb98068d7cc22d622"): true, - common.HexToHash("0x852dc0f5380f9b5ac012336a309ca8aedbd443f72e5716bfb75cf002dbd64b80"): true, - common.HexToHash("0xdd4bf50083d311bab8cd37aa1993fe546f2a5077349d3157b4f2e401bf55aec9"): true, - common.HexToHash("0x21b4edcb4ce3c144de5497c6325f72b5b3efc71ed131ed477d40f6ae7c91aa1e"): true, - common.HexToHash("0x412fc86f4d67567788c7fdc8a84f31f07854566a39e9df66a24d04047ccb08a3"): true, - common.HexToHash("0xcd37f3c1518caa7f23abd4a1ea2a2e9988471dc4183a62535c2596af7a5f562e"): true, - common.HexToHash("0x24ceea4254063c40281c876367e3d34233428b30a2414c39e89d018441b7e617"): true, - common.HexToHash("0x0a062af44e845d230def9c9ae8b3ca9568e99a34f52440b1a3433c92a1ba1ed6"): true, - common.HexToHash("0x4a5e9819bfa910e6ac79a76392f75fc49dd72f362c616a4fa430c78ad7dd2210"): true, - common.HexToHash("0x21159527533e7c9c530d529ba12b14ca685f8a91bdbff3ee24bb61adde0c7c9a"): true, - common.HexToHash("0x799b9f0dbf0d9aaa7b8a0f93ce3b4ff756fd4bd934171397685d0e8b16a5f1d5"): true, - common.HexToHash("0xdfdccb2c56cea754cd893388909258c517483480b71c23aaad3537f4664973eb"): true, - common.HexToHash("0x53e5f6dc2e5fd5a2b66d19a7f883ef2cea90c731a13ccafc10960dd7ff2e02ec"): true, - common.HexToHash("0x4ea607fbeaeb35a6a606b5b5ec55e84c7d1e7c43d7837e149596a9644db45f4d"): true, - common.HexToHash("0x0de4196aaad81aae400fbdf1005fc3173a65904890f9e31659e51b896f9c8581"): true, - common.HexToHash("0xe826ce0e37fb4aaa72adb54782cc22fde9af5ab757d5a5d6a73f6e40a3a3c8df"): true, - common.HexToHash("0x768d69b49110cd14c06912c2d4d2101d4278b3c901978631519f704810be40cd"): true, - common.HexToHash("0xb4f3613ce792473fab44ad51b6ce9768e6ec6f5ab6970d3a0695f8130a11b5f1"): true, - common.HexToHash("0xa9407aa0059957f0e6f4368c83bdb59522abfb3d54a8554b6d3266c728ccb8e7"): true, - common.HexToHash("0x7253c380282a01a3dbcd96076b82bd7a7716c7b62f1ed04caca2da316cf407b3"): true, - common.HexToHash("0x1c8fe520359f185ec3c96a533d8319abd1f17ea495725da87b27aa612a6c0d78"): true, - common.HexToHash("0x75de2f8ee3f79da53f3f548033f2110870ba543922997d3059b5a313a20b1a8c"): true, - common.HexToHash("0x5c0779ecd7b4eba7a4eb7778d7baea47348e691dec8ef812abc53585677fac64"): true, - common.HexToHash("0x33d1aca9fa9920d18bdbf4dcd46d87754828760ce02c2e551aa474ac6de8683d"): true, - common.HexToHash("0xe2d4c92dbe7399fddd9a38b040c72f654a3111757fb19a7e17c4e45678bd25fb"): true, - common.HexToHash("0xdcda175d430f409ed7a36afe36a301ce1c1dda92e90f17e012cda47741abb755"): true, - common.HexToHash("0xdddbfe4fcb9deb48cc6f6b3f708e09b5baf871427754b57894cdd3301ea3a526"): true, - common.HexToHash("0x142ab313f6769eacce2d8ab7818f7e7e515316dd9321da506377ba41d38687a8"): true, - common.HexToHash("0xd20d4d5def362883e8da90769ebed8c827d75e637e937f75eff3deb42fa31827"): true, - common.HexToHash("0x1db084c93818b3c3fa550ae35f7f3615a52a04cea1a0c5825150b889f3a65d59"): true, - common.HexToHash("0xef5022d37b3452b8dce1e3e47abd9917eb422d3fad9b86270bb9477460b88ff1"): true, - common.HexToHash("0xd65afdc0ef590a94d1484ac0526b2a9406bfa72a7a4b25207fd09efbbc072249"): true, - common.HexToHash("0x5b7950f5138dc09e4e684035ac61716d67475b9d0fbfe3c40e8d14f4675183c3"): true, - common.HexToHash("0xf4175059557e3ee97c9aebcde047b7d36f1cfa7629fc59694db54b98d76c635d"): true, - common.HexToHash("0x882711d3430b11dfeb4d3452d6c4298ac7a93105737ae16953714df3d2e76cf5"): true, - common.HexToHash("0x7767045c16eb4a8995ec494a7a2928133c73ef329dbcdda45fa4c6c639c03885"): true, - common.HexToHash("0x08d775f66d12345f90ea0a6f7747799c9beb3faf9ee376ccf59e6ebfc6dec7cf"): true, - common.HexToHash("0x52e2378cd772346b5b6c1a31ebaac17ebe36a4023ab31fb8f31b83a275f5460b"): true, - common.HexToHash("0xbbc4aa56f6838b865ffd813f450adfcc15626dfe4b7317be1b984db77ef9d806"): true, - common.HexToHash("0xb2f19755de4d2ba1d420d30475d683311a42ab0dcde94f111f33f3360075d13b"): true, - common.HexToHash("0x49a23477b597f6986934b1a08fc00e3702893220a2f6f4de136804f71f26356a"): true, - common.HexToHash("0xc7cdd6b59cde8472351ddb218688d2e49010e0a92a58943ff4eb5a976e159287"): true, - common.HexToHash("0x0088848af3c3d2ef987ac1c2bbea51479637290b592e48bc7b2957834f4b2f40"): true, - common.HexToHash("0xf0e5deb476b9ec5b7c5237fda7719fabf905716f85ddb2fdaf91ad2ded020b41"): true, - common.HexToHash("0xc1b0882ef612834fb240c9183bb6ec706fc12388126c50f73765501c7f223076"): true, - common.HexToHash("0x688d3073fe62fba51dae7706c9d100d2968f05a4f503f643f0b833905e683364"): true, - common.HexToHash("0x08345d0c4fae7b3f15509cf21bf30d8ab76051b4c843f5d7007b211929677aa1"): true, - common.HexToHash("0x0aac3e0e4261e3afa9b215337ba47e65f2f801a824027fbac0f5299ac4a21a1a"): true, - common.HexToHash("0xcf1ff92bace91a6171432263b432e2b69af9bea4fb8355c9612d52311cd3b86b"): true, - common.HexToHash("0xea9ec03b2f11ecef251c6ce5a6bb4e534cff436f466e0f29ea9cb410285b845b"): true, - common.HexToHash("0xad3290cf1485e511c7c6e39d9bdc5f52a6de01d3a5ebac3e159ab973778892c2"): true, - common.HexToHash("0x6aec64fd7bba4f4693ef572d960edce0adef0fb82b5949fdbb2ca5f9ffd372cd"): true, - common.HexToHash("0x1cd8fb4c0cf2fdf17efbdc515c3c3c138032908566eb892c8404a4a8f18b56c3"): true, - common.HexToHash("0x55bbf2c507f45883869c44591d1bff8053711d604700e7621d4c18989fd11a4e"): true, - common.HexToHash("0x4eba59d7079fa117e0ea9a9af5533680f05b0c90257a6c98ef83e18b730d49dd"): true, - common.HexToHash("0x5efbd5f39a26e7c8b6f3965b1865c72ec5fda918f9e2b8c2bf760d3dd3dd023d"): true, - common.HexToHash("0xff9e339aef06dde546aeb49f5adc335b677a6c860ebb492df853aa95aefcf70d"): true, - common.HexToHash("0xa33691dabcffc719794581aacb7897e3f5a4b034c60ac1a67870f5e144a1b482"): true, - common.HexToHash("0xa15f00d968ebf5aff6f054b55dcbe43f671002abef7734a7d57a1bb3ddae8ba8"): true, - common.HexToHash("0x8c2422c44a65e95196a0d28a2b4e057a53fc36d5ede9e1947821b4a92fa4a1e5"): true, - common.HexToHash("0x8c52a15bce2da506727267b759f5f8d6a3323ccbc7dfd37f05ed774595c84c9d"): true, - common.HexToHash("0xc5739c8943bba977e21fdbbfdee1012c682839d9fc05812916d4be9f098a0df8"): true, - common.HexToHash("0xf92531220c23ffaf1669bfcba6ff2899f928d9e2697c175b45b578dd91425da8"): true, - common.HexToHash("0xab8b0f44644ec1e2ffeb31c2cfd640db752fb5b6efe1c281e4a46458ecafc3c6"): true, - common.HexToHash("0xce69efd2a1db8295d387ea45979411ca2da3e4822c1df558e1d9410c045f884f"): true, - common.HexToHash("0x3d5f0a8e897e28e879056cc684935cb1dbb773460ddfe547b921d56fc7e503b8"): true, - common.HexToHash("0x95a21cee98240ac5139866a0a4e481069fc6555d914a4ca9d9eca7b43e5d81d1"): true, - common.HexToHash("0x6a25619a8b11b13367864ee0545f1d42439e4abbc80baa8dfe81276ca78490ab"): true, - common.HexToHash("0xedd42414d5da5ec4b2b40ba5b3d3b44af79de6414d2c64deb0d26d9f2b021d6e"): true, - common.HexToHash("0xff8733984166c70c8e6bc78b3e3eb52e6f484b359fd1dc884a80093ef900a59f"): true, - common.HexToHash("0xf3bd2b83a75319f74f25ddb111854877eec606199081ec17a28db541775353c8"): true, - common.HexToHash("0x81a17623f9b2ef39d1d8ed036d8ea65d71470870fc18d58500c8d627074af704"): true, - common.HexToHash("0x85f315254bdf973cbf827776549e6aef5e6a87dc1a911892a9ecb7c070ee40aa"): true, - common.HexToHash("0x4f8d1eb2dbf277f1a8c9b1fc780ab5d98e88b2b1b5ee3b5f68fdf25a2d3a8190"): true, - common.HexToHash("0x022dd0a37c497404f001011c7d734df189b3b684bbae3b902f168d9fd7915765"): true, - common.HexToHash("0x167494f9b5b44a0c48f47e75bdfec22f9e2fa20d9e3933bce994bdfa5f191275"): true, - common.HexToHash("0xdadda15192c3b63eacd5015349f18fdc003f3e9b5b6f51d721207f8c33806c10"): true, - common.HexToHash("0x36beeb5f737d60ea8b871e707294eabe263a40b56ff0cc657456e1e38784b438"): true, - common.HexToHash("0x1c72acc53d966826e174e653b604d5241d8f9cba525db3c3b5669e3cbb7310d9"): true, - common.HexToHash("0x5a57b4b51130cf28100643761a0227b9ea63272739d8994dcaf4c78ba35b0ac2"): true, - common.HexToHash("0xc7fce87242e5e0cfb305be8de1bc3a68d1c33ee677027c1c8189d0cebbc8e97d"): true, - common.HexToHash("0x4febea90cc856b391e7b4e98d5e9782ea8f016c4f5e539e70d0a0ecd4cb266a2"): true, - common.HexToHash("0xfd2ef33cf79070aec97e3fbfbca96fce5e3b1ad3f1d4fae9e01e80cbfeace01a"): true, - common.HexToHash("0x406a59f724b1a4a41a234b4ae142d21c574b9050f2818e23f0a0e215ad4d8925"): true, - common.HexToHash("0xe996cf028797c384a9aca6feda292e997e5bee4f6013a724e39fd11810ce36b2"): true, - common.HexToHash("0xa781b49d25066beb0bc308dba18237598db084ed4762cc0097c3c2d64e5e8bf6"): true, - common.HexToHash("0xf94580b105837393d4912c202eaf8caa9e9f7279251622ee594717c21c9671c6"): true, - common.HexToHash("0x701ce0bc44587307776434742601ffb395c5484c7725e443e0df02665b8da35c"): true, - common.HexToHash("0x55c6e2e7971d0ad9d5f37a644b182d0b624731f0ffde352201b523810b0afcc0"): true, - common.HexToHash("0xa1547b2dbcb81bec01677d7fa1ff23fb66b8d5c761eca58f0747b95960e18f55"): true, - common.HexToHash("0x80cb7a4f743ad9d79230fa324e771ff29a9a2b1b9eca1c93e1036e057350a1ce"): true, - common.HexToHash("0x9a3fad8920283d41fe52e640be1a844d0e2d2493a276a1bb5fb84f5f33c613a6"): true, - common.HexToHash("0x5578c3d64c1769e6593ee9d76a3564e6733be978489181d520ed99fc67ef3cdc"): true, - common.HexToHash("0xd37d88c9e60cac21ad66c31080b483d647bf0fb263dabff7854b04eec95f54a0"): true, - common.HexToHash("0x625bf2c4aa23c207024c9a2f8281067efbebe2c624925427760894ca9581b7b5"): true, - common.HexToHash("0xbc7f1bf592ebe13efc2f593fe7ac8eb35bc98478fede5e536bcb946411ac0d63"): true, - common.HexToHash("0xd8c48533574cd3e79bcc0995c553692e2451c8a218f60739cdce3f8304683a4c"): true, - common.HexToHash("0x9b8fb47bb991a55e703ec67235d01ceab86b66f0d83e4a7626d0c1c4712bb9cd"): true, - common.HexToHash("0x21efd596c7435b02fead509e79685fc1dfc71a60f2109d2ade694739061fe738"): true, - common.HexToHash("0x5486e39fb8499289bf5526f1a318adda7a845e51415c641c0edfef54d8b55639"): true, - common.HexToHash("0x15bbef131cfd4299d6e77d3cd4cbc180319ffed6b322166239c6285e742f681c"): true, - common.HexToHash("0x5d3c4c085dcde3e115ffb8118e13d4b3a9f88f1de57d210c390a2abef5a45f29"): true, - common.HexToHash("0x40480369ac928f5a8c3e7a95adcbd57e84c6d45fca865fa920ded463e41c6212"): true, - common.HexToHash("0x69593ce164b98c51c21ea2a22d9787be5596b6267c5dff31275ea246cfa0c17a"): true, - common.HexToHash("0x5beaa0f589cc4ef909cbbcbd657ff92ec30fa8f7693196850f9866fe55076c9a"): true, - common.HexToHash("0xc0596761765657f806def9fbea2533dbca9c75cdb0e7ae7cbf62ad232413fc8e"): true, - common.HexToHash("0x546b16609fdc70ac3948f8c40bc572026c1071a86549f54104436267cafa6c83"): true, - common.HexToHash("0xeb6acba573bb5199e60b79a313c7c54d6592da45e8414815da2483919d9841d0"): true, - common.HexToHash("0xde5ae06b60da5800a349f47e17a40ed73a662e6dc0375b0590a9b4f7d606c29e"): true, - common.HexToHash("0x56ce8f4a88cb455adb5ed661208b29a85e7284119046bed251de2f210531c104"): true, - common.HexToHash("0xc4b2dcd4f7b3fefe2573f337e3077590a1fa9b6de57c9df24cf25d2415e34d98"): true, - common.HexToHash("0x4e34495d7cbbcd166a4bda79f65a964ec5c1a6647af97f35df4265b13e43ef92"): true, - common.HexToHash("0x50430441db328e1c425c47c917249ca30cbe8de9ed0a4af3d4fd47165fed25c0"): true, - common.HexToHash("0x72271caa00440def6b84a76d006d663e299b98f763d7e04e6b59615a73c82a35"): true, - common.HexToHash("0x0eeb4e16a4893cf51786fbe8fe8075208ca0c2a91d42606241a5d5f1e2645fe3"): true, - common.HexToHash("0xacc25d09422c3d6d5659a756f1b9ae5a1897b5d928c5da53ec5575e67be813c1"): true, - common.HexToHash("0x0217175c27491589e19382723f7b0bfa4db5b662a673611b550ee071c0c3725c"): true, - common.HexToHash("0xf37209b4065e67651cc48f6d085999657b2264d001764c37b3650e4a6665c4b8"): true, - common.HexToHash("0x5fab478fe20f2cd28f958e6335c70d905d22dea462a04eeddb2eb28647f70e48"): true, - common.HexToHash("0xafb1a68843c5fd858967a3e7169a1472ebca9e8fd51d251b6ecb456203e1c0a6"): true, - common.HexToHash("0x9f46880a689de83d93b41dfb53ce235737124c17ba74beb6b6aeb5c4c8f45d56"): true, - common.HexToHash("0x19f1981c0b3ebd02f5c57b084846aa379c7965cc9e17726943d036c6c06d83f9"): true, - common.HexToHash("0xf178d6530e9a15083fc2c0fae62c483be6658b130f3928c6d35218389557b68e"): true, - common.HexToHash("0x55f9480083de41b31f48ff1ffc5f055b2eda214b509793eb0688f2491883517a"): true, - common.HexToHash("0x62830b4ef2f92d0ef14c464965e10dafd8999419ed1c3cf1bfa8f75bc08922a1"): true, - common.HexToHash("0x385a2f80940e68e0208a5deabce3152211e7bfbed3a6acbd3c5b037fca1b04bd"): true, - common.HexToHash("0xdb6d48f21d77e1a1c122b5dc45c1aaaa60020f4e8c0dfd90d69f126f85f4bec3"): true, - common.HexToHash("0x1c9c8d6b48cc7e10be82547101586625ba888f5e20c540ba67f59685c433a9ed"): true, - common.HexToHash("0x7c22e267267f70cb951a2b23b136a2dde0e3372e7f606dc363263734238a75d3"): true, - common.HexToHash("0x924753de21ef1f47e36fe85ac2aacdcf669b3381759d1579bd85ba71ced0f6a8"): true, - common.HexToHash("0x0fc8c9aeea8f05e5c5967903a0b045025838bea10aa2a69825af76ecda43568e"): true, - common.HexToHash("0x45e44ad69e067adcef6100ca8f4b2fc9bd65197360eb74dd4c276dd4036878f7"): true, - common.HexToHash("0x2f83a0a4d970bc4748669d3891f9913ba4b70c53466672cb4093a8013e40f998"): true, - common.HexToHash("0x613447bcf7f04cbad5596b48621dfd6d5d41f5c5b859b3e82403dce45b714368"): true, - common.HexToHash("0xf11d05b06b19faeec115b5fad430479dedd90eb4e43ebce7a5191aba4239973d"): true, - common.HexToHash("0x03776c305d01457a60ad30f967d20db247559f53b3ea84d2cd4228c66af413fc"): true, - common.HexToHash("0xbc7fc72eb894e7720d0ca4c1367f6fee9a581649960f8d0c5199928b5da4d48c"): true, - common.HexToHash("0xf289968de7cd33cccf5b3f8c9d0373ce5bebfa2c4766530b6d6bf9c0ef8ba73e"): true, - common.HexToHash("0x0c376c0b5d98bed7863f2e49a7919704a608d59d0d9afb9f8a67e8c79378d517"): true, - common.HexToHash("0xd2b332c38e52ab07f3444f55a265a6f13ed33fa5427446bf4ba93ceea26e5035"): true, - common.HexToHash("0x63329e2c5aa965a972001a0ace18f8ec10918690ef278adb36cbeb4675e2ebf0"): true, - common.HexToHash("0xa5e404035c508eb6f5439294f202ae17dc9023a52e7cc878b135ad8a4cf4b8b3"): true, - common.HexToHash("0x68f74003fafefdd07dcaf338d282ab4604b9be6a61cee548df575d14c3b43e2f"): true, - common.HexToHash("0x9e340e44c2980140d726da53f376a606ed8076cc77111e376587f802d3c7d644"): true, - common.HexToHash("0x07bc9e463bb5bf4943e5f53d0875a7c25308c89beb8faa35deb7b9cd04d7a964"): true, - common.HexToHash("0x8281e106f38d6835c12c6fb8ef472b2e54f2dcc3acb56cbabffd62b2ebf3c9b8"): true, - common.HexToHash("0x3dcbb836909f38fe0a1f4d7a3c9a3180fd40bce87629353c82ec1a96c2fc1544"): true, - common.HexToHash("0x6d34b078b645b61b527ce39d5cbd82912563788d7be108b3072b0f8f060fecaf"): true, - common.HexToHash("0x952074a4328948a18e8e3e33881d95d06f14fa77578ec853255cf8506ed8a709"): true, - common.HexToHash("0xa1d658a2b9f39c259a6dadf19c4d8f5c2510c6e2e8507b62a223c6e3af510348"): true, - common.HexToHash("0xf2fec98f1bf19fe654ffa8946d66eec381c819f270c98e77357dfa3b01a541d0"): true, - common.HexToHash("0x0dff56ac9d0ad17dbeb7a5c14de9cfceb246d1b7d050d33c4164d672fb67597d"): true, - common.HexToHash("0x11020773b77a1beb5cee39fa63df88ae6c30dcafb00a378d3b903876b9d53fd3"): true, - common.HexToHash("0xba02f2706c4f17b73b190c808aab857c8afad23d58f104cae9d6ab4777cd85d1"): true, - common.HexToHash("0xfc1f7c0d7771dbb944d676f8b36ffbe03448a83850a290c7483e1beeae4411c0"): true, - common.HexToHash("0x3944f6ee9291775b37c0b07be5b77a428c89f59db23d9d38b25cad63136f7874"): true, - common.HexToHash("0x2530c8d881b249fb051f6623d750524979d7a59f057a071fcad6a529f7cb0d47"): true, - common.HexToHash("0x2b57d98a8368ef6e154a219eb51deda37a9fced34859d9f81f2ce7fbc4d9fedd"): true, - common.HexToHash("0x039eab63557d7cc49e9e415eb4efc45a905243cf69e9782d5913c81ef48e2a28"): true, - common.HexToHash("0xef152ee6f987e36ab9578eb5e6fa6f79c7c6098d5ddf76e36af826aeff50edd6"): true, - common.HexToHash("0xcf1d5c68999350567c9f1f742c7f6b04776a414ccea14d70cfb8b09fa68e4e6c"): true, - common.HexToHash("0x1f21123fc4aef2a2cc7b1a7606d721076e065b9d4ebb13b92cfbdefa123b2414"): true, - common.HexToHash("0x3bb803fbee4763d3aa618b49e087dde49ab44e52aa0e6369a7feb9e730d5cfd6"): true, - common.HexToHash("0xea38440405f98b17d68d5ad00b2095df2733303dab24ee799c6997cc5ffc918e"): true, - common.HexToHash("0x27a75cabf6430ef067afb5124354b4913496d4335244608a9f63b4f52c2c95f5"): true, - common.HexToHash("0xd85355bbfe4ee36133f5c8d5f59c75f8b9a425f21b3d21dc7db3bfb3c4b5a38e"): true, - common.HexToHash("0x2c793a0e8c6fa00ff6bccb377d3434c483e0b86981615afde671b3d54433edbf"): true, - common.HexToHash("0x6fa70b26bc112610f431f02d9a445c37f6b80451a786ced31c4e2ba399fa2dd8"): true, - common.HexToHash("0x98354fd84d1b457c6190250c5d6d26d046185da9bf7f7664255ad56d97a19016"): true, - common.HexToHash("0xe1c037ab5c920bc226f86cefb44a4ebcbc222849bade966f291b0309e8faba0a"): true, - common.HexToHash("0xaeb710c6b5c1a5ab882f96def3aad42646bc96e0d07379ee1d2bea6ee06a7094"): true, - common.HexToHash("0x2fa40c933575f880ce854a5e04c8223717f52de9bc22e15ee4e0ff52b3cc28cd"): true, - common.HexToHash("0x63759037a9d70fc601548269d0cff4531024e8a95dbebb91f5aa002e2dd197f0"): true, - common.HexToHash("0xb1fc8a25e61b8cd1af09418d2285e50228993210a0a8610c04bf0d89cb018f33"): true, - common.HexToHash("0xce1c3ce658024a9b47e00a52c4293e2a838c3b685c5726daa567466a5165923a"): true, - common.HexToHash("0xfaf38081f10b896713c0ed2809f1a8f967431eb2744df2c743cf09f667a623b9"): true, - common.HexToHash("0xc49cc352d3720b9748a4d817b60f29b41de14ff5abbeb7f349474a81d0f6ad71"): true, - common.HexToHash("0x76edd86b9ec78c9f31b588def6a8709d76f99bf9ae45eebe4f3d7d39c73a58f1"): true, - common.HexToHash("0x56c7765498cfac12060665a348075c2d4e0577934be57ce60c4a74592378a710"): true, - common.HexToHash("0x044b78376809ece878b277e3a5405cc82f37e0e4e9ce773af3d48e2f61fd1256"): true, - common.HexToHash("0x9ff35921de87ea3fd25ff3c2bdae0c65b1d747ed71fca7f7f2a64c3eb95d0519"): true, - common.HexToHash("0x4f133c1ec46c34244f3cb6e1c6978a9029c2fe9075f2192fab0acd80132c7ac3"): true, - common.HexToHash("0xa881597bac3e534325ae862fe6d32131498e9abbfd53aa1de11e802ffc350337"): true, - common.HexToHash("0xe8705ab7f8b12350cd53c5587d327ad67b6b8cf3bf37455721278795cac3b7ec"): true, - common.HexToHash("0xa4c7a297a36b834665090c889762ac33b58c2c70667b4f0440d0401116e83f57"): true, - common.HexToHash("0x14f2a466a61aab8ee9c00f3158726a9b6f7676416a2b0bf6ed0eacbe450b566f"): true, - common.HexToHash("0x253ce3fb8c99a3ea770d5bc2d6498a3f90f6d3f78adef1a74d3da1b3f236571a"): true, - common.HexToHash("0xfad74857333b0a4c4e53bc4f3788fbace1b53232753e1b60ab3a2aad90388bb8"): true, - common.HexToHash("0x408da69028c741e695ba0328bc4ac338e531bd2ceab659f6fd39f914f41aed48"): true, - common.HexToHash("0xb8b593d38d2c8cbdc256facbf38ff842e7522c29121fffc9d0f2683e85f271fd"): true, - common.HexToHash("0xe101a8a6427e8930381ae5d5aad5d25c4210987175f49354cd95ff7fbc74c06d"): true, - common.HexToHash("0x4977aa1cdc2b946d3e2c20f33678b949218ec18287cd22ac23606deeec016e86"): true, - common.HexToHash("0x68043095c822560ebaba6b529f45c1614957a70b3eceb705a5f7759cedc8bd33"): true, - common.HexToHash("0xc9fbce31bb1c62f43b8f4210e12d16b351961ccb30c693dd7ef2bfd7eaf817b2"): true, - common.HexToHash("0x08337e8453b28ee696403d3674aa5d6a0e8949fc36a3ae382578e9ac70d21901"): true, - common.HexToHash("0xa399da95cb39c509f535465e863033f860332c77dd6f8c1933e5d4e355147f77"): true, - common.HexToHash("0x8f92758561b1e51ae430e82241cb143cf9c83cbca7d1ffb968dad544d9c51fb8"): true, - common.HexToHash("0x848ddd8df276aaf430b6b0e03f7d1bd0bdadd062d823889adf1c257afcb93eb3"): true, - common.HexToHash("0x709f8de205e120df97e755de68c4ca98fe09ca80c1ef8748f543460ecd4027d1"): true, - common.HexToHash("0x678e031586cb9442eff48a3d1cb53050e2956b7a4887f83f66357b8003bef653"): true, - common.HexToHash("0x6c68b37ab47c7fe2a4083bd08670a0413fafb35805814bb3294324848f4f3f0e"): true, - common.HexToHash("0x1ecc4a5d9f139646b0da7b8a3df477b787c69997442567871e2fdaecd1fb66ee"): true, - common.HexToHash("0x66816ae5fa5554e65e7380411c776011d6189e08f860ba51958ed04fa852f4c5"): true, - common.HexToHash("0x9bc5f215c2dc826c5f858224925ba2a84f224ea0fda249e8cb5bc9750e996e57"): true, - common.HexToHash("0x9b3e742d1aad7860dfce0b5c0cf499520452539e57e2a577f2503ad8f1f26063"): true, - common.HexToHash("0x02d3026bc2c5cd8bf3f30703ccc7bd64e3a43191a418e85e45ab8715bc200dd0"): true, - common.HexToHash("0x9170ee79b2a6f05a80e41f2978a262fe90e6b3b779608b1b8500a7834df940f6"): true, - common.HexToHash("0x883f5ca70537cc211803136f4488e984b8a4f6c1b19240a3d074292b92092733"): true, - common.HexToHash("0x6e94440300207e69ed823dd77cd63c9b076e22fb81ca2b7947f98ad55f2cf372"): true, - common.HexToHash("0xec549888c176234c577b3795d39f4c9c40ad819ba0a774d2a76b851df842fee4"): true, - common.HexToHash("0x1e8d70cb41bb8032e473556abf60bdb5705a10268faa239a01249cb774f304ea"): true, - common.HexToHash("0xb05a5b80b754802e381ee0b0476831b08dd8d0f10ea52045404e64e0d9ba9ab9"): true, - common.HexToHash("0x7875442a10d9e74060f4189d9f581a9157eb1140f061bd2c436f332ea78a501a"): true, - common.HexToHash("0x7b4afb4c1151fe72c15be62496ee4c6ec2ed41eff03796298669dccf534777d7"): true, - common.HexToHash("0xd11d4e55b0f0aa6e4e86f3db9a165e16bf54e552c412355615127434563ecdb6"): true, - common.HexToHash("0xa9519e68034d51346f84cb6e6a48839d864e34b35a31c2d83ae5334d41bc4365"): true, - common.HexToHash("0xd49d42c6872c721d717acfe772080cedf9b2a7bfda2175fdaa7a32dc1ca042e0"): true, - common.HexToHash("0x53bfabb8abbf6a9636b899c91ef5098c46c351651b6a03104d531ec83c291c5d"): true, - common.HexToHash("0x9600c2010d1a6d53d0f9e113d180f648259e2c0a4d843d3721ddc0ddebfbee00"): true, - common.HexToHash("0x9f88ccdb92dc7fd5c83c0cfdf958b36301b4ed824fce4a7d34fd51235d03a44d"): true, - common.HexToHash("0x1795b86d8d3aaf3c021e3aca79fe67a7742e70f8664e8f22a16196039a701180"): true, - common.HexToHash("0x46227ac9591203c2a26e697770c048cdb871d4957fea49e90b554f2263c051b0"): true, - common.HexToHash("0x69566095187998f41232f968acdb71993d2619fe5bfb0e447c79358e55fbb003"): true, - common.HexToHash("0x9e410e65689e88c74dda6a905ff1d80c1de75456e658c437f14c4ac39ddc387a"): true, - common.HexToHash("0xcd5ceda90e1931419f2a93817bba7cab80e610b297cc1f5af16e0ca28316b441"): true, - common.HexToHash("0x721e01afcc7516c729706634a3df34a49ac8e5b20077f9ae7ea229575774a4c5"): true, - common.HexToHash("0xed36f17e95133547d9aa1b4240fc6bf4735e021bebe42ab098894ccf1e20bd4c"): true, - common.HexToHash("0xe4ac212abe20b0325f18f9a5a078fe4a2b65c8ce9d8082ca25493b45b6ef947e"): true, - common.HexToHash("0x844b5241cbb1c569634de871f1af6cb43a56c5cb18f8ea406b931128624da69e"): true, - common.HexToHash("0x4d0682fe173a921968db87ed06a6f55121230672137600dd6b03be5c0b19ccf3"): true, - common.HexToHash("0x08abad329b65844923bf900c4dff7ab5f2325dc9ffe423c0ed136ad71a81c7fb"): true, - common.HexToHash("0x2a02af514097b384b5184160ccc1e602b4e179b5b89fb8daf746546ca8a6594f"): true, - common.HexToHash("0xb55627ccc0d01a21f56addc9ff440eb52d391560f608e19aca6b75e4fc7b2e44"): true, - common.HexToHash("0xe3f8dd14f9f6f5f39711abee4f3f8f70eba2fe28022b823ec1065c7c01cd3679"): true, - common.HexToHash("0xc12f19426a3473551e797e31b155268986c63dc47a66aa49405b7b80136c0a9f"): true, - common.HexToHash("0xb2568d585d26233e17a493e65ef098a6fac95eacb0648dbc2e43fbdde49a7e77"): true, - common.HexToHash("0xe1d1beade130c748750a244c4b227fd97720918afe6c389bfbe8f15767894d7a"): true, - common.HexToHash("0x99a1606232edf2d297dad9fb2e7b670a03ad28a8d3016eb2a8105441941ba575"): true, - common.HexToHash("0x814224bbbe5c701fe7cb0b6073b422fb57d66db0fd3f8908e1c49e4b6e564e89"): true, - common.HexToHash("0x2facbad55b007a216bc3190a627b1c3cf729d22a2f3e836055a59a4704448242"): true, - common.HexToHash("0x88595dfca685a5a328864b4b693d33a0ddd86bb57d8dca843d9748aea787d2da"): true, - common.HexToHash("0xf74c3a97828c381fa3f1cfac98f321476cde42c3f1c63231db7d67c177c466a5"): true, - common.HexToHash("0xd4118f9f4eb0f288c42db99b471a35d64f987d0a29a08f2b909732b84d1cc35e"): true, - common.HexToHash("0x9bd30e47b915ef80f01bd2b1fad595c5339c7d7b8ea0ebe1d6b0bc2678710fe8"): true, - common.HexToHash("0x861d856ad0a1ce01a19fc5d482b29990d86ef42042d799421b5540c6228c9339"): true, - common.HexToHash("0x0c0a74325567c5fefa049e93e9ebdbfd2b8e63169a9be55e9ee626bcc0e44a9a"): true, - common.HexToHash("0x5ece1054026654912f0deadd93f19b7bbf07c37dc0d5c2746ec0aad92a8bf3d6"): true, - common.HexToHash("0x92a062461008aca17cad0b3bfdeeb32c53dfa3ef914b4fe5f220142da12102ab"): true, - common.HexToHash("0x8f8e3b9c491612cc1d222055bf55778acc63d38193260e5d81e512c6998cf184"): true, - common.HexToHash("0x49265f491d6606c858108eb3911bdbfa2ff0c5a3b357ec98e876668f7e8652e8"): true, - common.HexToHash("0x1ba4076544da73b2c7e75416adf2f2c098a29a8df51a8c8cea7fd3195df4ee2d"): true, - common.HexToHash("0x55181b5848050e38e6615cab0e40afe9353447aceacc13466b8b77f22204d3e4"): true, - common.HexToHash("0xe1697cec4c1b86778de6f8572546a0fbb27da9eb7de58f1c480190b9636bef47"): true, - common.HexToHash("0x18c952f154662ed397e4ac66629d23c2e03409bfd7cb41f880d25107681f78f2"): true, - common.HexToHash("0x747c353f6da2c2b7880662791c89296ba93c8aa6b3289badccfd9e73478f481b"): true, - common.HexToHash("0x38b8e2c1f8b7af8c0588452a17787f93162edd58ca5a058650f53edf2c41684d"): true, - common.HexToHash("0xd3aae507847c720c1a90948f3f20dc4599af9e19f6b365c15e9e5f5a5328d917"): true, - common.HexToHash("0x70d99383fc6b8f317f28f0b8d5013bd8c37fc81a4cf9d2a1e8ebdbe40b8b55fb"): true, - common.HexToHash("0xaedec4441ad22602b802e619fe93e6bfa54a9147425b474396bc09d76c96d36c"): true, - common.HexToHash("0x6946093df94636a0dd0df1d7a25210e88d38a96cd266c63223c5903bded501d9"): true, - common.HexToHash("0x70d982fc9d5e28540f9fd455a3b40903a7594edb1a5963e19d8d1693c3f9418f"): true, - common.HexToHash("0xe802e1b8bd0d5715f810e83afc12dd418b41966a3df5dc6cb720f9f8beebc4dc"): true, - common.HexToHash("0x23f77b0d5c28c3f131118567bb4aa64c3769aa61f39e2f3b84acacda9e0c3348"): true, - common.HexToHash("0xa90f75c28a3fdb737168a1d13e08539ecf280f9fc793b82b133914ad335cb37b"): true, - common.HexToHash("0xfef2ea777ec11bebec7b72ccd14acea0521edac1360d718dad1e4f62104f895e"): true, - common.HexToHash("0x0c6f3f44b5ab00e23b5a29d150cd58a58523d25cd92aec036b04f631ad413076"): true, - common.HexToHash("0xd546dd27a09741d2c0f6ea85fb3a3c6397ad8ded8c497a3a9db37a3d6dbd9a7f"): true, - common.HexToHash("0xb7bfff183e7c9cf123e910e63ac4aac24cbbe18182b4dd78bb62845317600761"): true, - common.HexToHash("0x3c3e11139d8be72e31c028393cf48c8e5f1ada08dfd2d5bca093bcfcbb53fd18"): true, - common.HexToHash("0x8a2c2ace61635a74abeade80ca6ee69500b8c10077d10f99db3163f06bca69b5"): true, - common.HexToHash("0x9d924d88237e17915acc2fd9abf11d373b4d8a245e5dffa294f18d71a99e51cf"): true, - common.HexToHash("0x945b3d0b4a9f5bd3e053a0cbc4f344b0669860109c6c80a2045781f87ba82584"): true, - common.HexToHash("0xbd86643cbac68c2fbe5f1e34747b611d3b7bd84602ce6ae15e0483c5fb9d168a"): true, - common.HexToHash("0xec272e9112bda510bb6f7d769300e1346797ac6cf67eba5d1fd1e7483879b01b"): true, - common.HexToHash("0x039c221a3f552295192e225098e0a997c505cdb0078ce669523ff2e572e61ab5"): true, - common.HexToHash("0x9c1c4c80f4204fbe95bfbfc80b5e02cef6c08552d86bd67d624e29d5e46b60ec"): true, - common.HexToHash("0xfe30a89ea63b0a18a989dd0ff11b46ae202c9a1ea8eb9b7cb45b7496989658dc"): true, - common.HexToHash("0x8985d2680ae2234bf64accbd12260f11f6abc9047a720f8e5ccc251f730e9ab3"): true, - common.HexToHash("0xdc55013f668b09e833ef62f3439f961ac9680e87993766a2b43a42b176aa506f"): true, - common.HexToHash("0x01b1df4192e22870e93afd2aeb895afa65cf92b025a7d63c19c4e233a5c2296d"): true, - common.HexToHash("0xc332533219f6a6ca619c0ece640d46ff1b47cb96179bd1efb0ed6477efe03747"): true, - common.HexToHash("0xe3050885c9ab888cd24ac8acf47f99d79d9cecc5689f3771efc64fedd5e5f325"): true, - common.HexToHash("0x80aed73b3ba58c9dedd56730475c17b58bc2e1edebdbd2ab20c4cc5240def073"): true, - common.HexToHash("0xfbd9b8d3d9876de73a8f2de7f663debc237985264f863daed1d6211827beb134"): true, - common.HexToHash("0xad7aa9e2821623048d2a1fcc66d31d7fb6d956199b7e7c3ebf32299a8746528c"): true, - common.HexToHash("0x53e89c59d813c81da778c75a8b6079315e018640cde5aeaa5e5b1e4e7b63ae09"): true, - common.HexToHash("0x1437372d0f70f05f96aba349a7976ac2b840b3ee7511c2292aa8366e83f788aa"): true, - common.HexToHash("0x9fe8d8049fd0e874809a9c97b3b8a427470bec27825be9f23338a8bf6bf7034f"): true, - common.HexToHash("0x728a5a52b26aa4133728c190a51d926eac6d68e2a59de697b3f8f538d2cfbd9d"): true, - common.HexToHash("0x04028413d38a278b785f410cc4e4269351b44221399d3a0bbb76b9e643c556cc"): true, - common.HexToHash("0x4e657dc9d35750124cf71fb77d881fdc652fc5fbcc9cfebbaba942a1c73693a8"): true, - common.HexToHash("0xb23a72efb6cb15d3776020540393b9abaa2d077cfac4b1dffc63101eb816433c"): true, - common.HexToHash("0xee908f10bb33fe87bd5b594bee78bccd249ace73631921a13f2834cddccda3ed"): true, - common.HexToHash("0x9a4a3b03ab3ed0b547593b9e92db952e8f07b84837d5fd32a8d5f9a02283542c"): true, - common.HexToHash("0xad64a77ad1fad20b1e17aee964c92c02b76fe608cddb17580b04f114c9753cf1"): true, - common.HexToHash("0x620f951079ac5a845226c8000782e09687fcbf19699ae4e823631b54d222a9f2"): true, - common.HexToHash("0x495456796ce91b79c5e2e6e2c59ab241b8203e227b48b8412fb354a89049d892"): true, - common.HexToHash("0x4ad61ede7058bfe90f40ed8fee47aebbb1d9710b55318689622e7beba6f43c33"): true, - common.HexToHash("0x2d3a6c710e36302b6117c4b555182fd0391b3436ef863b89c0121c7f016f490c"): true, - common.HexToHash("0x10444df63586341e11d6e722e89b48e8c7afd83656a00876af25145736ffa906"): true, - common.HexToHash("0x512e8bf8d7e5688418481b64bad6ad692bfd5276456898b31195ec3918fc2cfd"): true, - common.HexToHash("0x5fa71ebe1751a0cc5fd1860a8b3d2a3598156f895d9f55cd8622614ee0fea16e"): true, - common.HexToHash("0x0f394ef0b9da09f37c265b8d9ade1858ee3cf662953964e9026c6cfc94af49e0"): true, - common.HexToHash("0x36c093adc463d9c8b7723c64ec10c98f4a5b6ba35aa611d42400b02009194e8f"): true, - common.HexToHash("0x1a31231d1902306b9b8bbace0918c17a62a6efb1f71fbdc3385ce46a878a7811"): true, - common.HexToHash("0x31c8b3303aa4b22bdf46b6d967b31dfd70f62b2199c12ef776ffffd84b7fe579"): true, - common.HexToHash("0x5ae463aa69131c33b5c9bb341a4614ae9a19bdfb7b76cc789d12556b84d91610"): true, - common.HexToHash("0x1dfb4c7f891289a257325fd24cb054b39a6ae60e39f10885c220e4ecc1339338"): true, - common.HexToHash("0xd57f0e0ae22ec818a8f0ae24caf742f3b710944185888b1894c63274091d09fa"): true, - common.HexToHash("0xd721293581784198b4a215467147636ba830b02317f9e72ee0cc251e6b2fc1a0"): true, - common.HexToHash("0x5223b24bc619edba25671f40e32b3c0ea1ab0643b949414941453ac9f8951b63"): true, - common.HexToHash("0xdf411c0bd970450fa3f67e598717699f057fed3b56a6cc168a2d026097dc9b14"): true, - common.HexToHash("0xb4969e8f80fc3a82d440444c09ea8bfbdd585ea8ee5aaa52b09fb274674fa0bb"): true, - common.HexToHash("0x97fd8ddae8a0652b86cfabe5b2bb9edda37235f03357ba8e09a20b0b28035a87"): true, - common.HexToHash("0x5c3fa6618bcb8ede27db6e1a26fd1f9faa93679a941169f0f21778c79ac2a3e4"): true, - common.HexToHash("0x336c4dd37118fe3cd90a7187efefdb90260355dffb8b5a22fed41fa39a94addf"): true, - common.HexToHash("0x2ee4ff53b9f0330f57470fe887d676d0c6f12e1b071a0e5e80e7f5cc79f4cc7e"): true, - common.HexToHash("0xa7adbf54b54b49338b11f52912ff15569963460d6b5c23635219bb9dc77c0964"): true, - common.HexToHash("0xfdfc81a133fc0a985f6b5e5e1c08c6d2719f337b7ae9849a183c5fec27e767f2"): true, - common.HexToHash("0x7ee2de87b80e60b26cfa8534ec59b868d81eb622e7132fd67af95a55c4d283f6"): true, - common.HexToHash("0xf728b6a4e69edd3c9fdcd41066dc49f44ba5e17c6a1488b33c4926c990ad7db9"): true, - common.HexToHash("0x2544ff908ebe85c5daef62b1a03436cc05b43db475b0db48839ccfb03fc829d0"): true, - common.HexToHash("0x9c9cce45c45293018735d7ecae30d800c522609b0eada12d2686bab9b311a3b3"): true, - common.HexToHash("0x79edb9ae4e19abdc67557bb9baa0ef5d036ec20a57d2ccaf54d6873d3baace87"): true, - common.HexToHash("0xc295615b39b3756d941ad1d24ecac2d24ce3235d350ad10ad1bb5bfb0c0a63b2"): true, - common.HexToHash("0x330169a56d79e7d4ac65da7a351baa0a3d0f7a935bb1d79fb6a4998d6526ebea"): true, - common.HexToHash("0x446b0ef22ec7902a0f9776c44846a9f0ab4e19db239da146ae817c70b47f80c7"): true, - common.HexToHash("0x7466da9bd56f68b86ec23fb3043146701884888c42d75365d8357fcfcace8b4b"): true, - common.HexToHash("0xf44bcee65473fae1f51fc08fd8ba67efde2aea7c19ef79fa7c0de916e581a084"): true, - common.HexToHash("0x30623ef33258726b4aae0fa1f9890f3e0c23309a0f7d2b3270548fee643b0844"): true, - common.HexToHash("0x13e26b3b3a0eca98eb75b3cd010f400bfb8105b3d4ed9236332e4c57642ff793"): true, - common.HexToHash("0x9e263628872415ff8e8834f13e5ce620140a8c3d1fcfcd80b60ea719e0b3b9cd"): true, - common.HexToHash("0x0ea4e0967efa1addba96d3cbc722fdf2175b78c39ffd7176e03f41427be18b5f"): true, - common.HexToHash("0xa4ad206df2b00d74bc9bf88c5726309e2e825807e8e89894eb9c54e232010c9b"): true, - common.HexToHash("0x858ae75a6ff48229c0ac257cc241bfaf091cee3e93192bfe6827b59a24a71524"): true, - common.HexToHash("0x87fb385b5eb67556ee7721f74f435e559d940fb9cf8558d57af0e1d43df96d39"): true, - common.HexToHash("0xee422ead09c48f48d3c673c90f0c1ac7b711056ff25447973b14372828a1f5fa"): true, - common.HexToHash("0x964d804e2c10f44734c5d6ba5fb39ae6f3e3ca90db3e8ac09feadd2ddaed61f7"): true, - common.HexToHash("0x65f90b4a963f6f41681917ad2bf8c67977053059bfb6d4dd3184129ab4b5acee"): true, - common.HexToHash("0x12574b72142da793f7cd5ab9c76f995393a097d9e940ae81a589f770702a9634"): true, - common.HexToHash("0x581182e4c2a929ba4c8ee16b2c05a3bc4e46c3568bef3ef6db937778769c4659"): true, - common.HexToHash("0x012bdb6f5056b286d49650e5f97428d632c498cdc511d0b8d465b41bac8b2f58"): true, - common.HexToHash("0x298c5f3d3a9766a4a56a905c04e808a92fd56baea3e996deaa89af64c1e5816c"): true, - common.HexToHash("0xbe419f0c73963e32da6da3b7e0e85458a0b30b18ea9ad6a07af6ac775ee5cb9d"): true, - common.HexToHash("0x878e6c015f30f4a764e60cf43b70d5edf3e01f1f0e30b5d6836d6389dd4e2f87"): true, - common.HexToHash("0xe07a3779aec268854e28b30864be293d4d5dc277366447b226be6d9ec7f74e90"): true, - common.HexToHash("0x8ff6a9c61ffc156f14fa386c545139ad185619e2f8667ad2e729d37d21ffc85e"): true, - common.HexToHash("0xc8282956ffd9761e4fef18ffc4a3dadda3de28d6b294d73cc3798fc7fabc5414"): true, - common.HexToHash("0xb4cb14c17045223b8fd24572a8f0ee247c77c5aade44f007d14fa2fd3186accc"): true, - common.HexToHash("0x18746f718add650eb742d8e5bceb2533ae259df641a92aed3e10a12c7f91533d"): true, - common.HexToHash("0xbb22183d68d88a1248f63cc7fe99dc894452a23f9539aa40b0a1a74259bf25e4"): true, - common.HexToHash("0xb547621f3713049e7583706afb8c11aab5df96254ca6daa6a583eeacb3159a0f"): true, - common.HexToHash("0xd394982f228c816b2a7b19d9c3137f92825cc5ef5f2876b920e47db5bb95ebdf"): true, - common.HexToHash("0x9711bdb16a0b7a63d27becad24d2e4828af9b22757ea706f025b1d15d8fcffc5"): true, - common.HexToHash("0xfccaaa3f9ae5f4f7fc3834733f37c8763ec877f62a1f912d357491c2aa9e5ae0"): true, - common.HexToHash("0xdca8f304df435d048bab0793e5ba494032286616541e00199fd226fa2b2ed9ab"): true, - common.HexToHash("0x8506414c55572e36bf3781e8aa00eaa496cbda73ea0f048324607a48fb96edb7"): true, - common.HexToHash("0xf4d78456136a7f309fba620a3775e70d6ee6aaf08ac30cd19b4d6c834616307c"): true, - common.HexToHash("0xe5687fdac128abbe8c8d8ae19477b63c49e577f29b79e3bcb077717d6415e3a6"): true, - common.HexToHash("0xe0931575b92f03673309d892bcfbf50050b613af30a38dc196b31c18d7646249"): true, - common.HexToHash("0xc8277445df6e7e6bbe0afc5de9acf49ebbaf80dc323d8445739fc08299de6734"): true, - common.HexToHash("0x500adabbc88107fed8738a8e4f68e20d548bd384680cc9b7d0b0d883b4ed9ba2"): true, - common.HexToHash("0x7d0561c3bbdd8620e13ca38eb02f07b1f8def4a61ca347a244b0c2c5c4fc6d0d"): true, - common.HexToHash("0x704e2856509e409020c307537cf78d6cc65e694832d1c8158c351a1920c4d992"): true, - common.HexToHash("0x65d8eed87e3bf09f4571e4c0d62212a338159545e577e1339f4c12db4b8b575d"): true, - common.HexToHash("0xa2ab9df936ce3e2f1dff638197581e18cf25174143ef5617ac83544eb4273cce"): true, - common.HexToHash("0x479565b62a4f3dd4a9dd607929f622552155f17202ddab17796f85808245778b"): true, - common.HexToHash("0xa0d912e3570d4e2b2bd5c77f6a7bae86a78731e405115daccc4fb499b75af564"): true, - common.HexToHash("0xb9805c71d747e3c86583fbee17d83273ef393d59fbe6045765f1cd77c25362ed"): true, - common.HexToHash("0x451010c0609204720f55a1aae54f230ac8a19edaf6866bb61ee2fdc3b5c09147"): true, - common.HexToHash("0x8864e29ca16151ebf37abf55b31fa45122963fa8fd0c56183f8f7667b2574f51"): true, - common.HexToHash("0xc860056f5044b04698998abd7eddf398df0ddcea361e6ce7e32f0e7d0afa142b"): true, - common.HexToHash("0xe0426a2e4f50ed36c7ae0bf9ab28d5fdf8dae5248c77bc09a332af1d99a81f0a"): true, - common.HexToHash("0x767d73190f0f4243f686752d457ff963f9fdbf562b6a61f60d7c5a16c1125f2e"): true, - common.HexToHash("0x67b448a29052a4383a5b1a7829e1f560519b6bfdcd367b60425a9c70106b9abd"): true, - common.HexToHash("0x6c38f3e0be46a350561b6647cf2ed607f152e2a133dab59c02460a76f66fc7c0"): true, - common.HexToHash("0x40ca985a64d56f66822ad9357d52e2cfc233d6a6447dea45367659c116054b6b"): true, - common.HexToHash("0xf85d3277b02bf9827e6616723814795998cff6cf4abf8bb8bf5fdc1cfbae1a1b"): true, - common.HexToHash("0x421ca394388af0875916f40fa938c2b0bc460d52a37282458cf232ed67d3ccc2"): true, - common.HexToHash("0xe0a5b7b5cc345cb34482b70d6651d640e03b3a3195cb8e38cd6bcfd0562832ef"): true, - common.HexToHash("0x462c3da39d67ef5154d7b2f81c77eeb9339e956804db6556c60b0e29f89b09d6"): true, - common.HexToHash("0x5d0d7a99d14a982d6194605ff83ea702fa3d8155ea507561d5bee3bdc69bdef2"): true, - common.HexToHash("0x52570a9db2393197f4e7496dbb514870c910e25a5125bdf8848fe6d62945c02d"): true, - common.HexToHash("0x32e7563675498e3039e1546c685c2e3df2c455383b1f4cdd4ada37cacf5ad6e3"): true, - common.HexToHash("0xc648d35706d2ab17ecd9a4da38540af0f57bcb12985569f25f93ff79ef0bb308"): true, - common.HexToHash("0x467d0f3b239a71095eac9301ef371ca0a7e7dd811c4e73b7f2f6aba66252489d"): true, - common.HexToHash("0x7e18d65e59ffb5b2774aa97739c182c554ad0d1dfc5ced7a9f816caf1358cb02"): true, - common.HexToHash("0x698ac219ea73ead1e1c702195a2b3041ad79cb7a7f05948362d8cc672b627eaf"): true, - common.HexToHash("0x931eb1749c302383de6acec2dd83642da74cf70aac0175b9aa6e00cf8d2aac10"): true, - common.HexToHash("0x015759962fc2857010a43f837ebe9bc9d305ba6786bf257d9c6ab3c535343202"): true, - common.HexToHash("0x7e9a72f76e05cbcdf7acccd46aaac49eee4b8cc6fe2be38ac54d1548e47a6573"): true, - common.HexToHash("0x5d7206b89593ae143ae61b0f23d21ab26e40356a0072d9f465795918b90a8290"): true, - common.HexToHash("0x539f8775626a860ac3be9f7b0be1a9e1ba070b4507b693324204d4cefe131574"): true, - common.HexToHash("0xd69829b73707d6ddcded1080d6c7a97b0ca5883e58bc68ee98a3ef5aa809637c"): true, - common.HexToHash("0xb25852e7dee9e4040600d21359930ce57f7094c0a8c18e92b9fabc7553585c7f"): true, - common.HexToHash("0x557cf17146abb40b50ff9721b7045cc22009cca580926fdbe7e9ada6d5292b1a"): true, - common.HexToHash("0xebc39a64a8354d6fe31c86828470f91442f93340163648ac19948079bc71dceb"): true, - common.HexToHash("0xb63d5e17316d8ff12f32a00896ba3bda23016c29f5128453eda564ad481070ba"): true, - common.HexToHash("0x084c2a941d8185679191413de10407690f3131de906c05cbe86fd2792b99eded"): true, - common.HexToHash("0x081f0d81c0941700aa408bf291700ddd8a925af0eab7ca01257364fa5955eb5b"): true, - common.HexToHash("0xa9bd82a9c8e6af68e03ae29d2c9f31de80ba5cab88c5edda5c9404e96443c9c2"): true, - common.HexToHash("0x59357c9a466cea8d8f07e90591a4dd2e7ee1cdd5e28c26544306e060a87faf1c"): true, - common.HexToHash("0x4bd47fa6b3708cea7aaea2848549a2aaaa38c0a37990979ab9cc843f2a87c2ff"): true, - common.HexToHash("0x0329f21972f27517d09e134aecd27393c8444df399e9cb0034d5f68ec39158ba"): true, - common.HexToHash("0xfdc230836e1bf5bdb5c89910cd43e8269a824bb1db7ff3dcb183a929a1172cda"): true, - common.HexToHash("0x11d38c2a6baa52f8b0f9cc3d13d0424dd6300e30985e738acb33cab4da8c0cdd"): true, - common.HexToHash("0x7bdf0e09d592d0934c5efdaaaecf21dd0cd36a7d1cb58c095403244143ae9aa6"): true, - common.HexToHash("0xfd253a70681b0aea9f76b83dd9c1850b925e0170dab1570c287d0e9b08ca8225"): true, - common.HexToHash("0x629a702c33da2b97275321cb6de58c991f8e3f3a947aa84230e4bf71f0f7385a"): true, - common.HexToHash("0x5fb06afef814af52abefff37e39958bca1e6df885d75b9d80cb32916b8ed7139"): true, - common.HexToHash("0xabbcbaee7fec5d556446ef73c1d0454d14316b461412c14fb96a9056179552a0"): true, - common.HexToHash("0xf8fb185714a190e5e064755a66f001830c6404f204f1df1e6ffad473c0c47f6c"): true, - common.HexToHash("0x28ce87d927a9472aa91100814e7da720a190b8fe605abb6d91f5cdaaf67a1550"): true, - common.HexToHash("0xf81be499651bbe97e7e2f9c0c3230d5f1eee8f2f05bb19f347b893db7aa77c13"): true, - common.HexToHash("0xb75b9bcc7cffae0a27360b56755c460d6f56fe04ccea96c2b23c8d525283dd84"): true, - common.HexToHash("0xd747f9f9d6903a3878e2d40674edf04352b6a45b922260880186d7992c552f5a"): true, - common.HexToHash("0x5e6366cdddacb7d1e2d4c90e63d636f02aaefd88dc626a7346a5460a4c9360f3"): true, - common.HexToHash("0x0f4b1d9ccc26c259bf7875593d4392102b4ce4fa63fc7fa8487a18c20b37ed73"): true, - common.HexToHash("0x41f879bd699d4bd43a02cba1550b896028711670376055a18b4b515b84076cdc"): true, - common.HexToHash("0x9be0a854a7363534aea6f7b5c21197d4f5f2ad051270e1fdd62e39d6139d359a"): true, - common.HexToHash("0x65bc03b26f6190d31eb32857ba2d26b1e761a89b9d44dc5fdef35da7a4cd42ee"): true, - common.HexToHash("0x99c04c4dc93ef2e51bb9512391868ba8f7b117bf09cef7ac6aef9e1b92da9178"): true, - common.HexToHash("0x4ff497afb8c9f20d502e3805bceeb091d5b88a8c7409b264691b897fe95b85f5"): true, - common.HexToHash("0xa71fdb27652fb71ed9b6f5a69ff3ae68a497c3cb21a80fc2a240a056f97bd49e"): true, - common.HexToHash("0xb9eb32d11526cfeafe53fd48d14baca00bcdceb774f9bc6534af34a0f4812cad"): true, - common.HexToHash("0x85e3e969f870420b7f253429b4ce551d16ffe59b03c719910082251b7c46be12"): true, - common.HexToHash("0xcfea0ff83a05fa2932d864b88c48cbd3b97f527932cc1a108258bcf487c76720"): true, - common.HexToHash("0xf6e78ec0a1a62c4746f1d20ea45b288b9c07ccde0ce58e5a0f156989d1fdc4ed"): true, - common.HexToHash("0x07c874ba7951aee815d0fb04354fdf4543736ba56b0807da9e8b1be7d684ff51"): true, - common.HexToHash("0x8895a416aae75ff8318ebeb75d8a5cfcad37b0c718078ec9e86114080364b207"): true, - common.HexToHash("0x447d725a3cb2e93ae12f1c9ec6098a4493e714c13302a7a5f3f577a7ff0d4990"): true, - common.HexToHash("0xbdfb709b64271dce662da0bc361791f388625e60d4967e292e4d28bb82e72e6d"): true, - common.HexToHash("0x01e274521973b033ae67693c9e03fcc028f5fee4491ff9d9ab448c7205e48fe4"): true, - common.HexToHash("0x603e8a3394a29df567fc749cf0c523cd0de9683bbcbefe580a15fd6e6263d86c"): true, - common.HexToHash("0xc057bcfe688d5dfc5e3d97b6ef6523d251e4bc68c82d75e33abe54c8caf47630"): true, - common.HexToHash("0x04c6d4a544bb404f364c247993280fb5712c50400409e2a85e903eb421778b70"): true, - common.HexToHash("0x10bd1e2bc71f900b9858f5c7b3645576463d671eacfac6d48968a040085f6a4a"): true, - common.HexToHash("0x20966b254b47fe4cbf577f5cad2036606ec7f6ed5cdff66bd859ca8e6a9ce0a8"): true, - common.HexToHash("0xc1533e1be01255d4a07547e25bd904d3a28596b077d5cdd52aa153581cf5515c"): true, - common.HexToHash("0xae2bce197c08d828d7c6c183f64be32dd9f3b406f93ab3b4d88aeb3037d979d4"): true, - common.HexToHash("0xba718cb1b25439a4469644bb6fee58c2721d3747f8fd766928e36d52ad829428"): true, - common.HexToHash("0x248fb97d37fb21f5f595ffc7ad19fab084c18f080ae5ddabdd231110bcdd1602"): true, - common.HexToHash("0x0e308c0d87e273949298c6bd775e5cf7ac7676205cedbff7f3f345d34f861dcf"): true, - common.HexToHash("0x069247cf0145b020cc738238b9857160aafa9fd8eaaa4c23e0db4dc939c9a6fd"): true, - common.HexToHash("0x365b9f6cb7584815c0b982f13622c4375a8b808f51de323d10fddf63fe7d24f1"): true, - common.HexToHash("0x91ae70713c7e64ec45a9e92ecf461f3dd378b9ee6ea9a1d4f1d0f516bc1b7f2c"): true, - common.HexToHash("0x3e513180109883f83f035540b9b77de67a19c09e7f6b75c572175c6e5695077b"): true, - common.HexToHash("0x598acb238ddc60fae578be94e40e2811fdf4df45304e32aee5d1cbdba964144c"): true, - common.HexToHash("0x0981dd6b23418edb4c9b531eeaf24137d2251212f55670753c60ea1426818969"): true, - common.HexToHash("0xdc5ff36ad662e778b4758e4f9c81dc8ceff68f11e44389a0ed8f9f9dfd4fdd1c"): true, - common.HexToHash("0xed720e25149ecf75c80c27a51a9fc5c28aa286c762b4271c35f10a59d1440ab1"): true, - common.HexToHash("0x2ff3abf5e1522ea32a041615232aaa6c32aca234afaf3c99324ed329384fa89c"): true, - common.HexToHash("0x608feee4187d3d188403e7c380d17e8c3622ed37bf8ec77e5f536d4c0e7bb649"): true, - common.HexToHash("0x1f11a41726d9ed0612fc3103b4f510a9d8ad3ad8b48e0d6e36731720d1958ca2"): true, - common.HexToHash("0xf022139743223f23f15bfedaa4532d441c905ec0eee06c1888f54e102c065422"): true, - common.HexToHash("0x3fc31af1b3882613ddb4c3cca7b00f2c1b934f76315b0b3f6c2e7e0e37029ff2"): true, - common.HexToHash("0xb746596360b0e3536c249aabc66d0ff9f7d1d23c7ff42dfadfcf9b491c9227a8"): true, - common.HexToHash("0xec6325a87aff068ad57d8a3d13f1b7af1eb2fec0d71e9e5501f4e47cf779bd39"): true, - common.HexToHash("0x1e1f66ec3b55b93ae9957c5889ff9d7006f9f22633f40c05d4b6da0b9c8cf6d3"): true, - common.HexToHash("0x2d27d6f07086b03cba93fd0a25353e36f5a5c65a2f91739415d8e44b1d15d7de"): true, - common.HexToHash("0x76e991bdf63f1d54c3dc2da60ad9e5042af88d4f94f2727868b046c26b4f2e5f"): true, - common.HexToHash("0x79f91cbca139d8e7e41d05202e34f0721f78d89e0b37581f2ae0ca9c4a6a7fca"): true, - common.HexToHash("0x4533dea0392022040daace542b8be22879a9701415a80c28d8baa307494ab239"): true, - common.HexToHash("0x925e6f6fb6fc2bada2b7638333fa6c067356f9e2436d1a026c3fd7000d60861a"): true, - common.HexToHash("0x27e5fe0ea1e05bd93a1bdf445ff341699bb1b468388585e6722c4327b22e9c0e"): true, - common.HexToHash("0xe07446818e5f193b564df2c3722e0c2484de25d2f365e0f1262e9dccfd34f73b"): true, - common.HexToHash("0xd1df2ad6c3c4fed7cf74bc974cd327cca6f12d26cfc2a2f5666c93c33c2dadbd"): true, - common.HexToHash("0xe7a599134dfa7e13fb720f0c45beeb78404dd1e491e14abb03b2c84d0b2f961a"): true, - common.HexToHash("0x08fc1b1d4b9823cb4cfd705ec770d3d5931de5c867dd3adfe0f409f732ae4d33"): true, - common.HexToHash("0xb7e6903437d0ccdd2b66d6d7c63f6f71d44d7f9aab00079c1ae6dc0d50e1d768"): true, - common.HexToHash("0x333ffa25239544cf212362e3d0bf5c3cf91be7aeef183961958306d341c9ba59"): true, - common.HexToHash("0x80659f03afe647402213815ef91ac69e03f30c1a84fdb366a11d821b51a984b6"): true, - common.HexToHash("0xe9f5755ae070c3d81d0b2f254e8985e3522cca573b992a6de75454b7d66afc98"): true, - common.HexToHash("0xeb079a12dab50368f52725df02e4cdef7754d57f46a59c0a3c1d2270b3c8991e"): true, - common.HexToHash("0x59402fa0bff338ca8b80e715696d82384da282b974609b815b5db27a29651986"): true, - common.HexToHash("0x27f39497af16865fbcee69f4ce178facc0b8ce8bb5033bcb2de786816807789b"): true, - common.HexToHash("0x15bed83553662fb45dd0a8c25a8e0f001450574a74e1f38a55eaaa85ec26a763"): true, - common.HexToHash("0xa8460a74a167c739b23c28f0475784dd5250d835a2e4f281627a0ce4cda2e242"): true, - common.HexToHash("0x7e0562b2401e94bf8cd7eb4c5159f84737002cf8db622bfe2853ef0aae22cb1f"): true, - common.HexToHash("0x4e017ddd34e9b78494932efdf08b890f746cf07c3883c7607fe69fc4aa633182"): true, - common.HexToHash("0x85b50d6258f54809b6427c35ebaf6fdd5023546c886e5f9bf5a6e7ae40fd4444"): true, - common.HexToHash("0x22660fc763650566ce872dd1c7f88ba575bce78f2192b3d6b1c4de3d438d38bc"): true, - common.HexToHash("0xf9822cce10466503d17466770250be7c9bd73522a878fe34a039ef865acbb53c"): true, - common.HexToHash("0xebc9fb62f89f8053aaa13665a39d8b68096a62c1293c3bdcff7ad6f6fd4f4beb"): true, - common.HexToHash("0x3bc25bb7d217059078914613160f620522b910d58cc6f61401ab21eef1fdb791"): true, - common.HexToHash("0xe724f60441d7d836d13a2c061a26bc0dbede12157ab9896bceadedc83809f5a7"): true, - common.HexToHash("0x014aaf1328d86a8c7119469bffc0efc71cb9d22c808bb0ad20cc02da7df36725"): true, - common.HexToHash("0xa5487716af7fbb10634fbf2fb65b375f67299ef089804c11f79e757f046f0c99"): true, - common.HexToHash("0x50f0a533fe935a8a2611907500fa412f39f1f4b2aba552acc25bab5f91b48969"): true, - common.HexToHash("0x25b66e78e0430c60c73d8ec7d8902eb4fbcb106d990e1183f1930c7516f38d86"): true, - common.HexToHash("0xf11009913f5d9320363f4dbb5b072327ffd656daab2d67ff8b42770b098b8dbf"): true, - common.HexToHash("0xcee86dff14f745baa1d7a714887ebedad3858ff652d495950612be504ed28590"): true, - common.HexToHash("0xa07d69903392964d6ad9f95456aa2798a1ae8206cb1232d2a1fc7c6f35692738"): true, - common.HexToHash("0xbed1478484d1e0d3e92bc0effa0c94b4a4ffca2cc0a63edac477ba63b0afc585"): true, - common.HexToHash("0x4d59828dc1b57f59b577a0c4cdf7c641b8ef1ad76d90b14fc140814123b3a58b"): true, - common.HexToHash("0x03c586f69e6c31e26a81e9d2a5a578b2138cd3deca20216e797d80cf0197029c"): true, - common.HexToHash("0xf1d2fa46202a592bab811ac851080c773283794e31ad488f9c0bd9c69a1af0b2"): true, - common.HexToHash("0xc874abccc945f0d1aa293fec33d5299a24b2dace5f158cf1b2a3a2edd4dc9b9a"): true, - common.HexToHash("0xfe47a8da89e85886d581169c1923448b2fdcb0db448fb430924a944648e753c1"): true, - common.HexToHash("0xe15b3636d35e08c68d4ea1607e6f23dd683e3bfac2a7aac7317c9737b00541ca"): true, - common.HexToHash("0xfa74f14d6b6498118bcb160740c16a22c51ac31efa00dd42576ea70d6ff2e52e"): true, - common.HexToHash("0x431e134119cd05fb2818168a21a44e4145228cbc72dee6301e1351eb00698b3b"): true, - common.HexToHash("0x83c43ed604f10dacbd9d27848136b4e9b371f4ebd156cb268fcc0a764b7f0b68"): true, - common.HexToHash("0xab3efc58042b11b3649011e51c3ce381ea4f283a32ee8c2b64925e0c892d184b"): true, - common.HexToHash("0x1f287956db57ed2b87f36bc35b37d4ff780eef821c8d40bbecdd5d844648843a"): true, - common.HexToHash("0x618e0de1fb0068da99a689c9d23d5898b2cb714b29b11908fb7db80f290a4f62"): true, - common.HexToHash("0x5bfaf8d3ffdde36ed6648e9598596edca8f9d5449400ea68786f07c454c72460"): true, - common.HexToHash("0xc42ed2a92f2ab1a68262e2c06f1223037a1ac0af242ec77a0459eca056b18ab2"): true, - common.HexToHash("0x47653c834dc5a932eb608d0780dd49007cd589668dc70b4c3f1f2ebdf0f0a464"): true, - common.HexToHash("0xd258378970a4a87ec19d492f8835be66e90ab168751e32fc3f13f8b6bd61165b"): true, - common.HexToHash("0x96b4ba9fe4a529542af5fab044aef504ffacc538444f97f43bbcc24167a1ddd9"): true, - common.HexToHash("0x1b84f58ffc8e43ab5ee382405b27697e985695d62fdce026b22445c88e36d8ca"): true, - common.HexToHash("0x6a0e812d82f3207e6932a8e65f6c2059e44c24421cd5f2fc518a2e428458d582"): true, - common.HexToHash("0xecb6174bcbefb25a7b6dc4575bffad362ab289fcefa4a05fe4a1d8e15c6281bc"): true, - common.HexToHash("0xdfc0884af131d1ee583c513a0dc26d2b72f2a5e3e0fc955dfdbd1b22c364fb66"): true, - common.HexToHash("0xd13535e40d801f789926ba2f27097feeb637939846d1b1aa67b349f2e7180b73"): true, - common.HexToHash("0x901eff599ac1680192438e5e73941078ecbe5560fe60dda22556719167dce0ad"): true, - common.HexToHash("0xbfc653f7670ad09310a34a9b9e4e4ac4e03d471042ea44174a49f96a538dafd1"): true, - common.HexToHash("0xd1da98503e402c4588596a02b6ef36fa9346cadfbee37280cd5f8a695f34d593"): true, - common.HexToHash("0x4b37539b8689249cb28f22795bd0687dce9fe85ec8d3d80617de2316fbe3fcc7"): true, - common.HexToHash("0x8a3da87b263cd0289d5db812b05b0fdb11b0c89f049df89c25c02abd0d971589"): true, - common.HexToHash("0x29c0d3610fc7acc6de56354a4e0d75bf8c7e4ab1e4ef08d21949470aa2e26d81"): true, - common.HexToHash("0xe870ba8e15418bac50eab15f9f30251927a017d0dc3980d769e97d20f0d802ac"): true, - common.HexToHash("0xf7e9f62ef921ae17ca550ea2805637fce2365ed8e6f6580bb9769dd7deb57d36"): true, - common.HexToHash("0x3543c77979cedc26a504b0dfe9cd5f72ca27f97be4c2ca8246bcd79cca71993f"): true, - common.HexToHash("0x5459a7153f4ca28d70547f181d87a70a97f72e468598e3bfb06db57c05392688"): true, - common.HexToHash("0x68a83e16083b034b44825b8b971a6f6ea9c47f3ef85500eb70d2043ba85181ad"): true, - common.HexToHash("0xf26e1262bf8f313a317d88bb1811fbda5a60fd892dc25916e355d20092248f50"): true, - common.HexToHash("0x5b817624ab3f2702fb5c0f604f11f9c42e0b96137e51afec57030d7726ea2b94"): true, - common.HexToHash("0x5d970a98fdd00a77019f044eba6f2f446fc31d124bc41d1083b28271d3e9be06"): true, - common.HexToHash("0x77bf9ae1a62ec7abe61c184c03b8803fa2a74362bba81d15e5839d984ebdb47f"): true, - common.HexToHash("0xa611640bbc70ea368c59df6adb71a7362bdfdcb76a935f9bd2fa921c43db1704"): true, - common.HexToHash("0x7db91eae5ca0ff705faa7fb766120cc9d3b935fb79b25876cb395125578878ae"): true, - common.HexToHash("0x6b9eeb00bf2a467951eb28d3bae0622b86eac97b2fc715fa1c9d2b7016cd6d0d"): true, - common.HexToHash("0x629d3e42e22fbb3eb21351cc8b9f8002da7d47da459d4902e0454f26f7a2c917"): true, - common.HexToHash("0xc7140a7face9a607264c0bd42b19eb10b6bc106d4d61578ad796e4b3f821c623"): true, - common.HexToHash("0x78321500d532b2aa0fa425a0f2ea7971d34bc556f2ed1691fba150eda606baae"): true, - common.HexToHash("0xae5956a3a0c070f568c6afcf047ef4a90cd922280cb60c1ca756b836ce0acf3d"): true, - common.HexToHash("0x80a9203be7bd7ba5eba2df8cd4dc30fe5e98e594e59225be4e23ce0631522d5f"): true, - common.HexToHash("0x2620db377ab3f507bbee25a913b9d1128db92ce75ec91c0ae5800545a9742bd2"): true, - common.HexToHash("0xae654b882e027db118af5d50f8abd917c12aeefe5a41e230b766a4785c452170"): true, - common.HexToHash("0x9e0d6a396a5dcc04afb5981d186d8a8938863678ae8978daddd521d351fef1f7"): true, - common.HexToHash("0xb144d21a766ef37b1b12acec7813255b17cc1c120438a205e51c3fff59d795fa"): true, - common.HexToHash("0xb38fc2cf102be3bc9ed6d89271a68b6790492fbff40d15213666fbdc51f26afb"): true, - common.HexToHash("0x110d4c47d6cc9013e0fbfb99265bcc444fd0fa6d6799680b093c5b8373afb2f1"): true, - common.HexToHash("0xd827b7f89455ea50915c8f71074cc45117e2c003c428f668178223e568d43195"): true, - common.HexToHash("0x6bc832d5e43cdea5cb3c41dd9485d119f29c2ae0cc871bc7399f8f9f3a512be9"): true, - common.HexToHash("0x9efd6981fc28fdd02104ed8ec7fbae6bbdbab3fd4140124117e3b3580555da21"): true, - common.HexToHash("0x67fb47fbcc10623705a7a0fcb7735276c232270f43cb1af142f75b2b0f63ff6d"): true, - common.HexToHash("0x306b7f21e0e971beeccf3a1ba2569eb5a495d9956677330a0c4921234fa1d6c1"): true, - common.HexToHash("0xb52e37dc4ca95be90d405b59395a78ea0c72b4cfd5e24ca6dfe90bdad7a0916d"): true, - common.HexToHash("0xdb2b48708ea218c4f469be2846b0e15bfda5f565c8d6dda13c8296daa9d5de2f"): true, - common.HexToHash("0x13b748313e1859d624a318ac9ce1fe999b43936e0097b3911315d5b6c1eb1a61"): true, - common.HexToHash("0x81614cdf300302d51eedf84c3a7475ef20a6d0ab5c8796c149cd98acff0b2edf"): true, - common.HexToHash("0x6186756aea973006bdd5793cb0154e1330d0550557d4a52cd9f590738b90719a"): true, - common.HexToHash("0x4f7326192aa666af2a83d8c9bd1187df65ff625515f3ee9946d023e4a4415601"): true, - common.HexToHash("0xecde14ed5967993e22b1b1907401d983a1bc95fc5873740c8d3838b6dcbf8914"): true, - common.HexToHash("0x5f7876bdbd7871ac21d668315d433784336686bc75e58d46b2cae0abc89466b8"): true, - common.HexToHash("0xd43df2fb91ae7927897079da9318a0dc4946ef4d0f9d92f49701e76451d8bb63"): true, - common.HexToHash("0xa7800a146242a3be9615a328aa63f5ed9b45c937a3b346f9b6d9d7b453efff09"): true, - common.HexToHash("0x9811d377087eb9cfebaebc3b05f1a0201c6d664ca2a716d5acf8b4135dd020dc"): true, - common.HexToHash("0x449aeb7a83b353d24fce840bfb4097bc4f89ae54bccacee41f26d734398e5ec3"): true, - common.HexToHash("0x9fc0f69f2f49b5cf5763cae8c7194aaa55dc14bb44359cb61006f925b67165cf"): true, - common.HexToHash("0xb2ccc3cd0cac0054eadcbac0a968ad238f0e47f4aad231c12d1347a786170e93"): true, - common.HexToHash("0xdb54a89c106022b8c43f58a037395ca8953fb4eaec8544d42096e0eb74b54875"): true, - common.HexToHash("0x10c3ab290bbe75c68a15f7181d7287700f8633b318442f00fed5659cb75d50a2"): true, - common.HexToHash("0x8bd4f4549a1f81caf22c60d52724a1bcdc9132297531c796680c40bd491cf20b"): true, - common.HexToHash("0xc9076d7fb1ad1104664f30bd8f8fd2d2a97b5b3a8934cbb36be385dbc3399a08"): true, - common.HexToHash("0xbe558f2e3de013e95b056b2f02a59ff194fef45c5cca40221b35bb0a74c74b5d"): true, - common.HexToHash("0xb3617a3260ec10058cc25b50f628ccabf95c2706c522e9249f6cc678c5c880cb"): true, - common.HexToHash("0xa6ff56e3fb8daecd7557a72821095151de621def135d8ca2aeb2a6e377b049e4"): true, - common.HexToHash("0x5c9a745569809c14e40118c80f36c6858431225d1f4250d6b1e500138b7d39b4"): true, - common.HexToHash("0x170cc057ae144698513f4940d92154416e551ad2b15bf301e76aee6c2bd88fb8"): true, - common.HexToHash("0x5fdfb3f90db2e212e81077b620b861d702891a9afbfb272f7ab425f6430afd24"): true, - common.HexToHash("0x89b41b19f37ac3923f93f434a30a9240bdbcbbc997edf49c214a25d5d1c7800f"): true, - common.HexToHash("0x1a53074eb5f0e2bac118b92c791d89b7dc649861deb9b033f717e52bb8936c87"): true, - common.HexToHash("0xd63ef31cd78eae104fa56c830157ea3c2408fa7357e96fcf764ecd5aa26c4dd0"): true, - common.HexToHash("0xf717d26b3a510f5de4258b3c95655adbe49cdf0219c1977a37b8bcaeb60b3672"): true, - common.HexToHash("0x1e478ca5c55c40a6caf75f5b062f14e1ca7cdfb6b6213aba764e84b431ba0028"): true, - common.HexToHash("0xb8facaef281f0ed2ff4c72cb2916d5c783fd694dc9689d132e76596b2129b7b1"): true, - common.HexToHash("0xccd00d403a562323e864b432ddef3545c9095c59a45ba62cac0bcfad4d0ec937"): true, - common.HexToHash("0x306dc65872e72bb8134419ef49bc9a0afda37a90adfc81d86b89cddd95af57bf"): true, - common.HexToHash("0xe08689e057f615b8fc8e74c94f8e1945f136a0bba2eb7e0c8e090eac05083d6b"): true, - common.HexToHash("0xef639001b1d34ab26600443c81c81eb7c394404cb40524e40488346746ffc854"): true, - common.HexToHash("0x842e86a6b516e9bc59a71a7512327c1139aabcab3f729db8bf7db3d8d1d41719"): true, - common.HexToHash("0x30202a04472ace4a37aa67118cf602d9907f3680d8f9ecd012566d3bf8052023"): true, - common.HexToHash("0x93e7608f0a71a3b09b30d5299103060db625ec824c1e0df6003148a4a42d3c5e"): true, - common.HexToHash("0x9a0da147dd9b48f7f59133e54fd42dde3d62f8c098a0938ce74a1eb65bf99ab6"): true, - common.HexToHash("0x3fffdb4d3faa289ccedad1a0037741107cf23cbccfc18cf9dc9fa27b265a6c4a"): true, - common.HexToHash("0x150ffeafd5dbc92c36098fca2259dae6751abcd7dd658fc1090a2d291568c818"): true, - common.HexToHash("0x92ac87084cbce9c20c1d09f929f5d71adcc53fe027ab0bdeb962a904d17a7074"): true, - common.HexToHash("0xe61339a8f06da279138607065d77031a11975b32688866726e9617e847421638"): true, - common.HexToHash("0x151f85464099f9d14f205554b61ef98090fd194e25272d47231c83d11df14a9d"): true, - common.HexToHash("0xc7de416e9d5b9f1c8e9cf22c5771653f9e18b281b1af71787ae9986a26f33540"): true, - common.HexToHash("0x2648da0bb76db713ad7086520b1eb61cbc9e79405c12b8819c04c51c3a796f6e"): true, - common.HexToHash("0xb6c8100ede0c4cbdcbe52ebfa312931c8da3c92e81e91bbe86f70c62edc84133"): true, - common.HexToHash("0x44b6272573515401d4f076b9524fedaa89835e518e7742492fca988112456745"): true, - common.HexToHash("0xf69a7983fe9915f4874566e313c454c61594882af7a9173ea78949bd24d72622"): true, - common.HexToHash("0xc4e6c74989cf430a0f4e076fa785b9ecbe833fbd4b422dfc838f86b759bf08d4"): true, - common.HexToHash("0x7077003691ef65d436f6feb3dd6c934890b3b1b73e16a6d4faadfe22ddb22820"): true, - common.HexToHash("0xc946ee015438b1895afa507fc50557f71d762cd6326d639fc08cf3fc53d46f47"): true, - common.HexToHash("0x9f66854d5a743b416ee4760d8301ee778702f983964c541a0a724cdfcd87732e"): true, - common.HexToHash("0xd3d3f00f5e1f7f961d47b20d5f068835f8da04be1cbac281a41b166247c10034"): true, - common.HexToHash("0xc65d6daeece779db49aa82c99ca6e60042b10c187a2ca1fb5fd194c7a5d29149"): true, - common.HexToHash("0xd91be64ac2eb69ba9e4c90658e02a200b4f03197a4e66436a3a3e08973f779b2"): true, - common.HexToHash("0x92bb0b370302aa25f886e99829e6fc33e5ede1b62b71a3ae41c341063adec83d"): true, - common.HexToHash("0x073bb8e6102048135e2754be927f2a8401e9f3ffbdec53aad9e3677c52e46cfc"): true, - common.HexToHash("0x5764e8883e9f52fc956cc54dc4146debbdf7d63099c53ca7d977a8bb5370ddd6"): true, - common.HexToHash("0xef2e939983f498047c97c8d0bff870903f7713004a8a6d6a40cd8ff50056feaf"): true, - common.HexToHash("0x58794efc861ec80afb294abb9193891be032d9b7496f22ea4c8b5b3e039ad599"): true, - common.HexToHash("0x0b3334da0ecdec3fd1a77e31ebe5bac21f3fbe21442f99de16f74ea3c7ba5cf7"): true, - common.HexToHash("0x3dd44a678d4e046c150a8a731ea0d304cd6684f7e8c4addc337811c3a0a8cfe8"): true, - common.HexToHash("0x03db02ec6fd4d484005230d68e30aea803aedb403c34e2470b4092bcea4e5313"): true, - common.HexToHash("0x4e578a12abe34e3e3661175c4e2e514109bfd8034ee86ace361b48257c41e5c3"): true, - common.HexToHash("0xf1ac04338c935de3355b24ff0b1dbf93e477e03faa7072d76318357c06f37941"): true, - common.HexToHash("0xe04a7e38206b2b6ff18dd06a42ba741e1e3634fa68db1becb9e48fcc6c9b9b33"): true, - common.HexToHash("0x6eb0c11629c5bcd158af318b5f35acd2eaca52b66dbbc99b138b86befa8c8c0c"): true, - common.HexToHash("0xe4f0fd808ea9139ed06bfcc24332c53e64a9425c16c8b73e5dc7b3a11fd12a65"): true, - common.HexToHash("0x1b48d3ce97a9d0b780d8d7a7648020906e7e10424f43a2072d83504bdb744b90"): true, - common.HexToHash("0x17fab8ef549e7b060bb504e00748a9ced28c22dea71ee0db67b6f304b0b2c689"): true, - common.HexToHash("0xf6bc04dc4dbf1440a6751e33cd52cdb1ca210991f731cabd826970ee48a264f8"): true, - common.HexToHash("0xb88e48627fc28c701fcfbee5f6fcda1ef89d9a80080d88a4d59959f18887a7c7"): true, - common.HexToHash("0x7b80e52b92508b5cf1d13a2637c0a5d982622183f985b2a8fdfa8e0f010a07b6"): true, - common.HexToHash("0x2969c9046da80af58cc8965a952dcf04ab5e4ddab997381215c9f7a9594fc047"): true, - common.HexToHash("0x2a056f66f98eef5884dc2a470764eed8d86d2b0582149b2eb2f1a6541d1e8780"): true, - common.HexToHash("0x1d272b62b65364c3a3fbad0ba49c1caec0f31fe1f3630d1b80193e6532ed5661"): true, - common.HexToHash("0x796c68c8aba3e78137917ac64438f0cc54fc3c0b89a3c81327857cb5a5f4c7ba"): true, - common.HexToHash("0xd6b23667a2856527edfe518f63a16cd8bd8709604f3ed0523dfed3853158c828"): true, - common.HexToHash("0xf17b49b984b537c109392d43ba7faef73baa6b0bcedf45c8d1795fa9d3fe07d5"): true, - common.HexToHash("0x39444ec8daf4af5b4c7f0b18c83396acff8fb8711cac1d49e5006c07de39fd51"): true, - common.HexToHash("0x02c65cc36f6e323baf4528b00448bec32956f8d9c3ce51465962067b81040d33"): true, - common.HexToHash("0x92951d1db7bcfee4668cc08a6ae61c9b516c1b8f782e547df6d61b04fc0c6d83"): true, - common.HexToHash("0x34e600b73b906bc8b6087394fe268e35633c0e08f3f095f399d06eeae84c28ec"): true, - common.HexToHash("0xd2beaa67e368e0f3f1727e664cf74274ef9fa30bedf2cc3c38f965628f632ef0"): true, - common.HexToHash("0x28a7d439c37a7873d7385536344fc8cd839f3f14dad59c1bf32a1387dd32e35b"): true, - common.HexToHash("0x957c9f8e0e6feb2cf6dbee17cc6b95cde167f721d057f74574c2522163c21fa7"): true, - common.HexToHash("0xca162174d03b35bb8898bea38fba99eaf63658cb92fa4c045ae78c8d2f7d33db"): true, - common.HexToHash("0x8a59d3c41c7a85aa8641e9e014989fbe240800269055ed096dfa1098bf7ac1f2"): true, - common.HexToHash("0x21d6b19c3bf77065197d609fdf34ae7800deeabc4293d69052f074ee9a8bd6a9"): true, - common.HexToHash("0x04548da69e70b60df023e0644f0ca13021718de14359e9a8d4ca451c6d39fd98"): true, - common.HexToHash("0x0878fa0c5f7823183bc0ea30baeab1a096291dde2820870cabbe6a1fef1e379c"): true, - common.HexToHash("0x0ca99e8645a6e51eaf9aab9ef2bb4291de94e66c15023d7ba039318b1e2213d9"): true, - common.HexToHash("0xa291efe01977313a4a70ce50cb831f5b57f370681dd575b15213d0e93fae9738"): true, - common.HexToHash("0x5c24694c35c553aea6f7d7ebe071c789f22f634058ba5ea3db205a0c0f1932bd"): true, - common.HexToHash("0x8683b2ac286e3e962b63864fc807cf2e6f8eb6c0ed5d7b97bf15cf5d70d2afae"): true, - common.HexToHash("0xf89b66d4c8410ec907c9f558e821333780747f7f03581329c6c5ee2214a42c03"): true, - common.HexToHash("0xd1bf38b63028544e2444b837936a61605ced02ac6f147cb265724aa8560bab19"): true, - common.HexToHash("0xe99ef416b3afc4093bbbc5d12f56cce2f7a2af823c17784a0e550520dff2e0c5"): true, - common.HexToHash("0xe703a92dd44f70140dbabb19e623f75ce62ccbb6ba0a7846d3d40046727b3c1e"): true, - common.HexToHash("0x44905f9f856212bf6dad4060a6d9d081ebdd4911c207a0cc74626ea66bdfe186"): true, - common.HexToHash("0x1a11213fffbcec1701f867f2ab52833628ba2601216e7bca755d4296e9b7ccec"): true, - common.HexToHash("0x4c6c1cb38559b82c4a898fd3524ae7baa53d0f5eb9fb5f59ea94f8fb044a886b"): true, - common.HexToHash("0xb1d209bb9b739a9748744c10f3532735365864c139d74cbf10ddcaee6c15b8fe"): true, - common.HexToHash("0x798e72a48653cb6907577bc9b812f8a88655fbb640106d7217e0372a22afa5a2"): true, - common.HexToHash("0xdc421fda5b73239b44d59091244e47876d448110e43bc152b53a80460e63861c"): true, - common.HexToHash("0x788e96a90fd0f3d2b83345903bf896b2fe4536516965da43a350254107189c30"): true, - common.HexToHash("0xff9193e448f8fc6ddd4029ce13d100237ea337d01a223beb2fabff65596ae83b"): true, - common.HexToHash("0x4cec7dcc6137fccd01fa5426e3ed14aa72b822ce6d9244b6226174d2c33b9810"): true, - common.HexToHash("0x54b9a2cd49e6adc6e6a93e7010d320778e5e5297b2f244054b45f326bb8bd780"): true, - common.HexToHash("0x085faaaf102818381b5bfe357d6e606326a112045fda627935df16dadaacdc6d"): true, - common.HexToHash("0x7431d9681e585733287bf0c1a86d75381a7112221fb37b365d46b6068619fbe2"): true, - common.HexToHash("0x22b186e450ec1b67b43d5a45b310327ce7cb24921617b36755426ffd26afc9a7"): true, - common.HexToHash("0xe50a18fbdcc7a143a8410162132b0a3ad9b5b9c2648e013c5f9f003f0b8e5023"): true, - common.HexToHash("0x436709e9a90f43ec0cff7e400177614b0eb59c52bcd9a2deb38e7bd958b0e0a6"): true, - common.HexToHash("0xdbfa65aaf9166af249adf7d6d55017483e24167f27cc2182006aff45f91701c3"): true, - common.HexToHash("0x0ca34c59ef2476943a37ec2d20df5bbafa7160787eef063462acfe4a04e513fb"): true, - common.HexToHash("0xe16f5ef6313b02e6fe25d9b3dbadc46470193442f2cf4e6a195ed6035d8b7623"): true, - common.HexToHash("0x5c96014758c3cda6a615ae8221cd83653f75695da22e0d2ed455b8f2e6eb9228"): true, - common.HexToHash("0xc45974d35421281b21cd36cbe1e451da7a5a224a05448c1c6dc28c84ab37e73b"): true, - common.HexToHash("0x2adc4390061c8dd4712d54d00923ba7ccad8b39fb384ade8847b732a4081357b"): true, - common.HexToHash("0xc3cbe095cdb43d46255920f68699080f5feb3fcdcb4d1311ea7c33439f713968"): true, - common.HexToHash("0x91d812199790398cd05c23d38bb7e2e766346e40f3ad159845c3b7591e3e2089"): true, - common.HexToHash("0xd1bc6d731966ee26d98482340fd0b2ea86e1b9816a2599c788e13fdf2d041b05"): true, - common.HexToHash("0x454dea0c7bad58d390b06583e5db000bc384ec7c27254c865375db4907d1aa47"): true, - common.HexToHash("0xe90065d0cfdb7901de728aa1bee51e7dd7ec69f8d06a1f5f1633b376b2c1cfdf"): true, - common.HexToHash("0xb176ea1c0b2d4c810686a82f30428730c4952350ed2f73bb7cb9c5aa61779f06"): true, - common.HexToHash("0x1db88b6e45f734955345c6a9cd8f19af27ec1ffd9ebeeadd18664ee429c0e56e"): true, - common.HexToHash("0xa15334234c741d908ea17e628a196acf06eb08a5491d81572c01fb8432e5c74c"): true, - common.HexToHash("0x6d781cc4eada367c089ebeed7a1b7a05d4684eb17c333724bfe63732cf02270e"): true, - common.HexToHash("0xba076f04a9f499d73abb3674d61b51261d541751c296269a2f25c7c7b3193f83"): true, - common.HexToHash("0x00a623160da81992cffca530defcb27887f78022aae9aca70552197c2698499b"): true, - common.HexToHash("0xc36d506cb3b8089506ae181f73b884ff3f65c0fdd53948f6bebd1f39ee10c476"): true, - common.HexToHash("0x98454db71ebc723d10cbfbe78d14edea5e797833e3c0613b6a8f02721cd519f0"): true, - common.HexToHash("0xe5dc1ff71c54630b680719e8b8b328049b8820bb99758e23a9a91b70ad27cb95"): true, - common.HexToHash("0xa8d0fe8bbbae33d830fec7ecbbb4841e36d4a2ce992549b58decc38f4f22abb3"): true, - common.HexToHash("0xb8a0d8275296cf8c3c79fd093d6bef813e6fa7ba6333308a2c19582ae9121f9b"): true, - common.HexToHash("0x0ccb478ad69766e54ed2c704b58dc7a204db269288ae8fabf21a3f65581375c4"): true, - common.HexToHash("0x3b9f54fbe660b232671fce7412b7cb89e6bedb50ec0c81c54338e43503c4c445"): true, - common.HexToHash("0x3a5d91cfaddc722e33a64cacb95d958b942aa88fb7c8ef4631c07c20efaf461a"): true, - common.HexToHash("0xfb31246c205ba747ca804992a9cab3587c2bb406ca34b3c0279f46f9a9487d4a"): true, - common.HexToHash("0x0c7cd1aab4bdc1e5bc770bbf3ac5208cc19e40bf83fa84d3b392baf06a7fd4a8"): true, - common.HexToHash("0x7e330ef9599521f0faa6d7363aea6515bebc25a473031d414ce4f17c4e1a4c53"): true, - common.HexToHash("0x2d719d50d914c379dcc1881897ea8097114cfb83588968307635b6234edb7b89"): true, - common.HexToHash("0x076ec78d03babac8270d1527f757ac7531504f726e435de48616598a38932473"): true, - common.HexToHash("0xf0bb8d4032102b02f79fcf90f0746093396d21584a38901f6ed3bf638f256fc0"): true, - common.HexToHash("0x967d8dbde99f15e1c34146688de3b982624d7a8729b3dd34c5e38bcf79cf94ce"): true, - common.HexToHash("0x96802bca9127c3a8385dc8925390933611cb541654e8a2234c0ac92a4c21cba6"): true, - common.HexToHash("0xc88e4078ef3833c13eef2703da3559182d4ae37496678b1dd4ad6f1d142ae900"): true, - common.HexToHash("0xbbc215bca5aaf024c6d103e34ad6046e0dcb95773fe3ccc95a030cc36615d997"): true, - common.HexToHash("0x095d7bd5caa38b56188c54ab33765e7240b974251610ccdefe583152a230652b"): true, - common.HexToHash("0x11e874a454e44beed3f9a8786658ec18358087a517978f4ef51879a0d413c5bd"): true, - common.HexToHash("0xd1c68d4e5728edaed9fac474b327f161685712c820132ce165fa5caea8682cd6"): true, - common.HexToHash("0xbd0bd7a2bfebece679b250e293ff7f4131b22c6385534ba1220dcb0f270369c8"): true, - common.HexToHash("0xabb88c573864c27e812859dd7b63bcfd5891d33a526f330fb60727bc744430e9"): true, - common.HexToHash("0xedc315d2461644de97188e9b9ecd56a7d20aa087faaf43322f02fb1059c7de64"): true, - common.HexToHash("0xf45c4c1b768fe1b85c926e255402dd3335a2c617e1bd8d86f138422826231715"): true, - common.HexToHash("0xd1a07b4be618951d139d1a0d96d6a44e1b51653470a5b6ed20a263af7632a31f"): true, - common.HexToHash("0xe682b93e5c4bb548fdcd0eddf9c06dab9a96f9f3db473b382f5448bd4fa3e775"): true, - common.HexToHash("0x0dfb1b2e157940ac241376877134762ab5eb686d9a1456ac8dee119be88530a1"): true, - common.HexToHash("0x0833a53974081905ee29e0f7095a14552f0092f9e054eaf5b06c7545d8894e28"): true, - common.HexToHash("0x43831a6537186c07cbd7ec47ed9b95d0207ad179fc7dcaf9997b952f8dd0fd8d"): true, - common.HexToHash("0x79b77e526136d46388a0d4b8cd91ee09d4ef4f0907c6ea9abdd7d5c5c46d3d74"): true, - common.HexToHash("0xd212801e265dc8e262fbd6aed30bcdb4b59a82fffc655e6243395419272df02f"): true, - common.HexToHash("0x25f95f03b420176e32699d6f6a7d872b3b8f470eaead9649e630fae173cb8a03"): true, - common.HexToHash("0x8cffded8bcca5cf9950f37049b5cb4b072be0cc25d7ad947f11fc38cbd014919"): true, - common.HexToHash("0x72ca87b0499fcb24b51052fc473c3c76521a0d3148c6f306000a6cf51758f6f2"): true, - common.HexToHash("0xc2434b698e1e4f5ac10dcded2a6834388aeb0eba13bb61ac2b19ce6c51e83a75"): true, - common.HexToHash("0xdc6bc29d28eb263d1fb156dcc2080a8462c53bf522a06aa8032e02458b45b118"): true, - common.HexToHash("0x62cc4324483a5434014649c4d1f4559231e0a718eca71e04ee0db9073d5ffa53"): true, - common.HexToHash("0xb10cc3bcbd5310442d58622c68c27845e1992df05538a612e11e07f73edc4c9b"): true, - common.HexToHash("0xd5fbbcf8c7c9d039bcdde194afe9d59caa4e7283d641f65e266c2432f7b5cdf7"): true, - common.HexToHash("0x47e9cb92bf636f53faa003a3cb0764f51600fd97d84119ceff608b6fac8aa5be"): true, - common.HexToHash("0xbf89c4871af333dc19aba880258c0a64786d41e0466c4aef31f92214760d3ee2"): true, - common.HexToHash("0x6e3a701632a58b04d21119f4be6d50d1548b903ef2d63f84efb66dcb8b140f4b"): true, - common.HexToHash("0x21fd0a8d2c5a2959840a9ae4b73158943fe30579d2e5ad3290b86b623a7ffff1"): true, - common.HexToHash("0xdc4dc26deddee03116dff2e9ef4fb07f6371a27df7163a731be75b91a4c84806"): true, - common.HexToHash("0x1c5aefa23d22aa128157f3fbbbe8b7b73c59dcd8636e5f7c2bfc59e02b357bf9"): true, - common.HexToHash("0xae68bfc66fbad1bbeaaf08f179ab889a95fdafc40a230fa5489fb9ef2ccd3cdb"): true, - common.HexToHash("0x25fa3bb603c792d3cc48ce2c70560d1e90e1a527253f170672140ae7909f358f"): true, - common.HexToHash("0xcb4f8d58ae74e684568cdddadfdccac68a854274210bc212349514755abefb74"): true, - common.HexToHash("0xa0695bf540872bb0c8c007ef5da7acd6032637964435005518565a0c9dd07bab"): true, - common.HexToHash("0xeb1f24c10d3d6cd324472c1e56b6b28bc17e781cd419a0f3162a6f84d4be77d3"): true, - common.HexToHash("0x060945291571bc074e6f4efc1b1fddd16e0d8d812fd3cded59bc91073f51a3f8"): true, - common.HexToHash("0x5ef4920e76e25a67784e9e2600164c5ff44edb91a0eacae13455c795b8f74d71"): true, - common.HexToHash("0x00122f6f5341104d896bd660aef65d6337b325483bd706c15e4207126cb82485"): true, - common.HexToHash("0x3915b3d8e790bd088d67125d4cb23024b806a7867b9f55b7ccaa67886cfd803b"): true, - common.HexToHash("0x73721e18fbab5860f00020c5f680663bbf9f778885e13c19acb21e5bd3952473"): true, - common.HexToHash("0x39558c83b3f5c66279d849836c666d5d089dd0b37100ca6aeef17f4d5542abe9"): true, - common.HexToHash("0x2af18ef6c44b158d14b560b63cc310da3a674289bd6debd05398d41644e6eb86"): true, - common.HexToHash("0xafd797a5b0e3a5b5608240a29506eb3ea6b3146441fc8539ac81c5b8753a3505"): true, - common.HexToHash("0xf65c44d2f6f09a5f5841be6b8e64dc6e1492224474868058031931929d41636d"): true, - common.HexToHash("0x70b5f8c4f101ee617beecd945911ac87379636a9b2427a2ac3723d67370297a9"): true, - common.HexToHash("0x200254a13c497ddb3b89e86ad4827711d8ccd7c71d548794aab927ae49197ab4"): true, - common.HexToHash("0xdfd39e681fc87d6458ff05336c4be5a0e10b90be9a971a2629b118fc20d5bacf"): true, - common.HexToHash("0xcc3c6441154c414ecbde42c252e4d9afc09a14b463640feb9adbd2bc6815f445"): true, - common.HexToHash("0x46b6f7451de09b82bf04a21c3f0996c4142612ae27817e44af775edd6a253f06"): true, - common.HexToHash("0x9a93641192e10971f8d3fabf3ac73e0d95630f92b84b1b31b7fc57585133d15c"): true, - common.HexToHash("0x33d411707316d2a619531b1e45ce63a337ed320c69d5807158066cd69ff9dc32"): true, - common.HexToHash("0xf65b22453e86b525d2612c61396690a65e43ee5dbd253307cb819c6f4fdb71ad"): true, - common.HexToHash("0x40119de6b12f8227ca26127859710370959812188f1207ea37faf42fa508cdd7"): true, - common.HexToHash("0xc0ed6353138adccf1b81cb81d43f4a0fb523d6b17a755f295b7837a6be479aaf"): true, - common.HexToHash("0x70e60ceb5e5825461e7eaa5440c35c78a9e53d8d4ad15fe0c2cd002577a7376e"): true, - common.HexToHash("0xe57677e83f725bab2f03410e6bc0583e0c0c7a4fae0d7b813e38d625f1f1e0be"): true, - common.HexToHash("0x3e4d7598f9f95df38747062b58bd4c81f9726d5c1294cfffcc684c51091b8e47"): true, - common.HexToHash("0xad9f8c3025cbb3399c359ce102b4607539932488369273a816c26fe68f9955ca"): true, - common.HexToHash("0x8e530cb1eedd7b88b74c649692e5c7a6fcd0e0ad378a3234b4552479f08ab7b0"): true, - common.HexToHash("0x30191b654f7f29389d913e212ff90da6d10a93ab4da105827c1fc868ff3f5f7a"): true, - common.HexToHash("0xd5b6c141477bd10999d9888c046f3ee9589bccb06e4411af794ea65a21685f58"): true, - common.HexToHash("0x393705edd64b2ccfa7b7f2265325a944a8030a25f7a6fa4418daf13a529862f3"): true, - common.HexToHash("0x093e7feb79b54f883ef4dc89d935c621dd2a79335492bf2bc48eb12addbd66e1"): true, - common.HexToHash("0x21fe15393dde06204d1c3f3f32073c8a6321237e9f9d8b80fc094bddd7a2f94b"): true, - common.HexToHash("0x9fd7f7c6518763722eef5e7dd0c0af51a3fbab9484a86a526f6345cfe75de3f6"): true, - common.HexToHash("0xd163cc145cfc4d38582b48a13951b67ff1a1b7752f4bd3a5bb21862ce5b10b7f"): true, - common.HexToHash("0xb95136ff709f07afb2b11bfb1ff1f427b82188970b94dad8d8f2dbcb3c8f3eb2"): true, - common.HexToHash("0xdb3ffdabeab40bc3c7b41669a834e0cb04ea0d052795d57a28628f5ead96cd24"): true, - common.HexToHash("0x4580f596ec525362103e1d62869740cf971dfcb38f0a3954d4aae87fc3a6d28e"): true, - common.HexToHash("0x1e4e0478e1faa2d28a98775eb8bd1b20a3d38fb19d3bf5519ed39ce6228ebb7c"): true, - common.HexToHash("0xa24336196467c0f45583b107f4a0fe7719d8b433d593fa428671bc2199318401"): true, - common.HexToHash("0xe713e8138728ed45de3cd54c0498067123ae48a84da7efe4001cd486f843e3d6"): true, - common.HexToHash("0xce6d8e487cafcc53e49bbf2f60e0c24c5ac2f408a9df17ddd08fb8483fecce55"): true, - common.HexToHash("0x6f2870851eeb6fff3ef486b803bec6241894ba594b22296655780f41dedd2a58"): true, - common.HexToHash("0x97a1f1030abec15b4761c7bd7db282426d7ca0d150558a16ee310f168d75c3fd"): true, - common.HexToHash("0x9fc8e65a769e94ae43d3aeb56775ce99a2923c8be273582c5429a26754e6825e"): true, - common.HexToHash("0xcb9f6b35dbc3be113c348842a9ecf4269a04b949a54a5db3512197ce7c831b1e"): true, - common.HexToHash("0x49393f4c29660e6a49093851c08fb1b6394279687108642b56a186feb5629360"): true, - common.HexToHash("0x14833f87df25c9c13c1e817dd4c895b3746518a0f4aba0e12b108c2990084591"): true, - common.HexToHash("0xbc7e93c4d4e988b7f88ace69046f9b0666009c40fc5fcfea023b25e0dd79daab"): true, - common.HexToHash("0x483f5e206ca3db0a5e7eb39ec03687c05c6ab4b18d2e8a5fe63c6c680903c824"): true, - common.HexToHash("0x04c18ac3f2594ebedbc8869b6e5c824555055f15685274921e364f73ed9c8b23"): true, - common.HexToHash("0xe3ec9ba7dddc48a992cd1736f3005ab407406dcb265bfcd72f1d5c6e5e4972b7"): true, - common.HexToHash("0xd8d9009becf45caad0ed5a790f8e04f6a0469f0323d703a3e3af342975d904b7"): true, - common.HexToHash("0x51ff3bc6c5d19ed3906d57a8f61f25b438fff10188f2212610b90e5cbb544f3e"): true, - common.HexToHash("0x1d8b84f9df785f912ec77430a89c998b570a7388450f3889afeb8d7760daa746"): true, - common.HexToHash("0x6bc7b1d740fb294f76aa31381462236736863d4dddfb96407f02aceb8b843b55"): true, - common.HexToHash("0xe01a4db92dff886c73aae6cca2334a7f9cc96ab26347733c358d5cd70ea3305d"): true, - common.HexToHash("0xb331bfb66be35da9f602a3dc89e9c81529f4b246173fc45bb86864b2ef7bc268"): true, - common.HexToHash("0x40cfeb1f30119fe93dfce03a4c0476745a54858c0f9a527a3baec8cd5cb27593"): true, - common.HexToHash("0xd81a740d65e36f2cc93f9e1afd9c7a6021cf99eb6fbf63305e7c62abcf75b768"): true, - common.HexToHash("0xb02dfbcaa95bd4b6957c6b9910e33b93a92c868d7318e113513fc29714c3c5ba"): true, - common.HexToHash("0x6c6a7add24b3d64f4f04b74ac23aebe618652ee8227110aad3aaa2bf5945588a"): true, - common.HexToHash("0xc1c2e8a0d7ed6b1eca3eda0a8d373aff825a5e1497e46f1cc750b1bee41a49b5"): true, - common.HexToHash("0x5b4a69369aeba7f36aa59bac6f03824f1c162184f8e94668314892592d861d0d"): true, - common.HexToHash("0x8c0b8b1b2d3444ef76a0a1d333148b2af7a42adec2b8a306b4be73efdc33d0ba"): true, - common.HexToHash("0x1fd5368890b9856a80a6e657aa4b09cbc58fe2a354d97dfb086fb5fb943765e7"): true, - common.HexToHash("0x8563e6afc8441ba7bdd1af0ad28318cba214612398de77d9e71afa6799fabe99"): true, - common.HexToHash("0x44f578e495905447ec97caf00f3d930eb85ea2336e29dda0d8a50b84bbcaf6e9"): true, - common.HexToHash("0x199684f636b961519d8397861553fdc9afc94495f932a84b6066006346b854f0"): true, - common.HexToHash("0x518b06991c42872d29c7e32732577ee868b041d4e1b0f5897781f95ef51c3662"): true, - common.HexToHash("0x62024a16ab85f5f34a6e2fc700175c29bd653983e466d2a4bdb59a22c4fc6d14"): true, - common.HexToHash("0xb1eb04bea9ed0a461572e129cf58affe3787109279053f2b996cfd4f3a8a3f1d"): true, - common.HexToHash("0xccbdb5949a8f007582cf1e90f5b6597215dc3180b13b7e9848c8bf7993c29a73"): true, - common.HexToHash("0x8c7c6e7732abc68763d4e6f8bc7c5643679f775e66d05b9b0174af2930dc9e30"): true, - common.HexToHash("0x6f58979ddcb923773314b9b00c90927e096901847e87c935a567ff7af205bb7f"): true, - common.HexToHash("0xa613192d74b5ef38cd9ab813ecdb1cbedd777d94caeb5c4400a7d3544db9ce60"): true, - common.HexToHash("0xd300c5d8d2c958f765ce622147ca1ad4382874606369687b34fed9f09a515511"): true, - common.HexToHash("0xce7dbdc9c33025112e733b710d10600090f9803bfd97f291bd77bec9754f399c"): true, - common.HexToHash("0xad1193fab31774fa55720edd6430cb16dd2c4daacdf3d32ff7e24edc86620217"): true, - common.HexToHash("0x5f5b702eb7e85ff2cfa1ca5e02c11b265870f666e7454d701b3b945e6d929830"): true, - common.HexToHash("0xf629e85d25ebb98b51a23b43c19d96c14953bc2454d8fdaceb25d3061a452080"): true, - common.HexToHash("0x2795447e4d3b085272ea6111075129ba3b87d45bb07620ffbdda22d46ffa6024"): true, - common.HexToHash("0x1b3bd186bebaa04fb9b0cc262697f8fd442f57f843b7af8390e3403ca10b9aa6"): true, - common.HexToHash("0x0006b9598bfa0c251323729ed2bbf61402441ab7762424a5f2be56d426ee613d"): true, - common.HexToHash("0x526e3f53bf140d56f38aad9c1187627525b470573a4535b7972ecc7487c7a60b"): true, - common.HexToHash("0xed58734462e45745bceb11c71ca1db8782f7cb8ce137a0a076e7a68bcf5f2c19"): true, - common.HexToHash("0x7f24dc67f5a9ab97d5758e54c98df1e62d6871ee72370755fd226314998c0f22"): true, - common.HexToHash("0xa7b23400be5de26ad8662ab50b6f51b77558d7c90e3fbbfaf94f611ac33a71dc"): true, - common.HexToHash("0x63e7323e2458c5058133502ea8a152272326f8aff0efcfa8316020147896c966"): true, - common.HexToHash("0x3eef9bae260c040574cf31c396130b22ae00582273daedd4c8989c0287d493ed"): true, - common.HexToHash("0x6b4d42dab550e28a4741260a39b6ae1e9f751d82d53f4ce4deba9ae2230a8bd1"): true, - common.HexToHash("0x71fa668821b2ac5f95181612620e71cb9f78b4402b24abbb1fe758e740fb6e5a"): true, - common.HexToHash("0x4af60a5d5e6f457c3cbbb4001c4f37fc91978e1f7c3f1a579740cb9f6d6f7f43"): true, - common.HexToHash("0x09dff8f373483c66564910dca210ae36e2ef04ff381a433a8dfd2e6655696626"): true, - common.HexToHash("0xc4f0f2cd977e3bfe441854e2c927f1db6d2b918bb3002e49d8e5908272da9a2f"): true, - common.HexToHash("0x011df9fd961f0aa8c81e840eb9f1c2b96bc3fb3fca93b31e4e13dd39f8ecc340"): true, - common.HexToHash("0xe01ab0e286f1afc5527b62e7e37b0f9fe88a6fbb16b5282e9424bbdc3373ece8"): true, - common.HexToHash("0xed6863e185b46f18793321718c0df2538110b8663bb39edb02d07daca61ee94d"): true, - common.HexToHash("0x2a076a1721d45c07f9487f6d59bf0dd2beff941673cefd9ecf1fd6a54e058751"): true, - common.HexToHash("0xafa443f37d3bc8624c60d241d5b447070ad3a161597a5cb6309c41408722b719"): true, - common.HexToHash("0xebc11e229be5734d0426ef487ff466a540af38ef077436f4149354d6068048ae"): true, - common.HexToHash("0xb19043b2fefe9d9a4d1cda83d3e3945a2dd57d2bc757a969acddb2449120755c"): true, - common.HexToHash("0x6fe910139fe9737ded2bed64a8d8ad1427e3a6d53351bd2c68ce40cc0110a531"): true, - common.HexToHash("0xf32d73a5a07f6c40373b3dd0fdf1d7625c514fe5f54f43f40970d6b71228d233"): true, - common.HexToHash("0x6a906dda6d1a2b59d89f128f200015bb2fa4ca9f49686bb98fb31f3ce21121f5"): true, - common.HexToHash("0xacb9e33e6dbf67848ac674125321552616c6b542b3d7d15b3f3f62aacd0c24de"): true, - common.HexToHash("0x25f17bd45d5ba1c6c36aec502590fe2dbdbf16325ab22581ed62c8f62a6d1ffd"): true, - common.HexToHash("0x1024ea7e77f59e6b0687ad8ac3fac3763a5e7c53df74dbe278b9f84f5c30fc03"): true, - common.HexToHash("0xaab29f86565bcb4a5d9f770990d05d26363af6fe3497cfe6fe426745dd34926d"): true, - common.HexToHash("0xefbe805a36e86e632321161e63f7150ac4e32b08a667ecda089579607f33b4fc"): true, - common.HexToHash("0x734a8edfe7470b4b62fcab3cc95496b0ce0d5c0d7565ece45a565a214681a052"): true, - common.HexToHash("0x4d05ac3560d01953a16d790f71d33091b55f0330f449a3e8f2dd00abbd6c441b"): true, - common.HexToHash("0x2c5f3206049500fae6f0022217255ee956051ad3cfe627cf4fae643278fb4306"): true, - common.HexToHash("0xcb638a4be5ecf4179aa1cc3544b65b7b93af684b825ec0099d86631790df1930"): true, - common.HexToHash("0xfac77d74419eaed639ab283f3e700c6392582c50d8c66a87632b5c4542f31eee"): true, - common.HexToHash("0xad7178bfe5d0020af9c5fa0d8cb714d53dde74c3fd60a69193b684940ddf25f0"): true, - common.HexToHash("0x0b3c93fbb4b81e749f057ae648734e38a779f5c576055960b5c9844b86ec60eb"): true, - common.HexToHash("0x63afcb1400561125bcd7fff3904c451b0c33f555a9fef47332768b1adb23ac0a"): true, - common.HexToHash("0x7322a70056904102cbaf83cc2094eb900de14ec2db0e9a3988c6b2e22f82cc78"): true, - common.HexToHash("0x7bd27a5debdea0a622a967cf5388a927ab6eac6258829d0469da8625a119aa97"): true, - common.HexToHash("0xf44bfe2d869f6f47cfc3369333688124787131cc7e7e8c8fde1ca784914583b8"): true, - common.HexToHash("0x680b0cfde5b67686507d4d6d4dc7a1a3bcafa5cbecc5ac8ee15d4ab14dc2b247"): true, - common.HexToHash("0x6caf37fddc5d7d7479bbb9d12762fa6b18d45aed3c0ba569778f4549c2165cdf"): true, - common.HexToHash("0x688155b8af79cd592a8fab9d8db79eea1b93c673920c3c6b31b6930b7dd63ce3"): true, - common.HexToHash("0x0212bec5087fb4ed5c861631eb528f5cd9f452bc9e14e946d8534a8d2e727cc6"): true, - common.HexToHash("0x4d3ef9bb6faee4b805434161419e7e410f5f1d0de10775093ebc681cb7085082"): true, - common.HexToHash("0xc3466a9c3e181c0e213ffd04fe8fb3a14615e4777890b9e38ebbc6a2bb16d4c2"): true, - common.HexToHash("0xa48f96d1c962e0f5edda672812293521bbcc0ffdb5d2d36dd351080ad616a9d6"): true, - common.HexToHash("0x96380782c0f47854d67fa10278d32c3c4d9f6855cadd7106553e60ba5b6ff6bb"): true, - common.HexToHash("0xf86cc099c4e7a1d61b36372eeb4ac04e74a80773ae15e55833716e27e35383fd"): true, - common.HexToHash("0xb4c4ae557ac06f42f7ce8ae1f7998bc3c7db4b08d1e7661b624a7e3b0fff0533"): true, - common.HexToHash("0x5dfb8b5dc466ffc8f0aaca74647c8166914a5459d872c3db6a80a77627820b2c"): true, - common.HexToHash("0xcc142c10670be24096b13a699de0d914e1a3c0c515ccc49f9f37816e455a4033"): true, - common.HexToHash("0x14cb9d3f699ad39a937f46a5c7b1fcbddb4e09fd1452e6701389fc3dd91f3828"): true, - common.HexToHash("0x5e664599d4f1859205c5cd7486e15455dfabf774445e2b47b87ea7f6fa38827f"): true, - common.HexToHash("0x5538fb4a4690b01064063f69b532b3a59913a891b5a6643ad373b7b8e34faca6"): true, - common.HexToHash("0x5d33427f81166cdebb8c2ed4bd4f934b05a069454167e0b5623c9676810dd2f9"): true, - common.HexToHash("0x1ca3ade542b05360ee6659a0992fc2903ac1ccdee28c8c262c636d1f81816787"): true, - common.HexToHash("0xd0fe1f276a23d8878b2bc2ab76235f53f7c2c1b1c0e2c0a09a756615b65074b1"): true, - common.HexToHash("0x24abea18b8b6ab32a3463772952c34f908d5289af54190084c415b58d74e1697"): true, - common.HexToHash("0x07e533c5cb847e3cea11f0a3b7a0da8431b4e2768d822cf2d4d6dee79e05f79d"): true, - common.HexToHash("0x6809e0fdc42c79c56939247a5b8b2905de28d33b7a99e83e177c9ee471b528f2"): true, - common.HexToHash("0x9dda1948fb6c210ad6d61b4e6bd79cd87592fb11d035ab55f144742cc15c6173"): true, - common.HexToHash("0x988192b6d9f43261a55bad1a1d49b419817fa08d757601a0c8e2d42995eddaf1"): true, - common.HexToHash("0x56968b20ed7711bff34222b755c8c125ade7c4f6437d01928a426e364e57cc8f"): true, - common.HexToHash("0xd0b4a2a51194a40dbe41c7aeeb730eb19bc4d0183862a8c2197a7f277bb4f69f"): true, - common.HexToHash("0x457701312e7c92143f4699f98641a3756dcb599415ddd14f2a86054be4865c11"): true, - common.HexToHash("0x2a1ff68720a6909f54f3457750777b2446cbd4bce7e1e8545e89a2e11296a90f"): true, - common.HexToHash("0x6eabde49032b9adf24b862c14076521618a4cc89a928d113bb910b88cf20a11d"): true, - common.HexToHash("0x2c0b8db406a504271097f26681a3930355104a071e4b603b59607242548811dc"): true, - common.HexToHash("0x52cf5b5cb0113d94ef47670a92fb079051dd573311bae7af7147d52bceb3b0c5"): true, - common.HexToHash("0x65cbef246124076951e64cc5e4052c65fc7c77576da3074e34ff0ebd7acb37b1"): true, - common.HexToHash("0xaf5f8b307fc7127cf0cbbcbff49b63ae59a324b58a89f67a910c75b2d3435ee8"): true, - common.HexToHash("0xd2a9dc42856a5672147626dd27dd19fcd8e0ba5fe72b564b8bbc5326d5fc2a2c"): true, - common.HexToHash("0x9460720efc37120c8de2ea80933d0fc71872a61861bd85bff050d586cf54a9ed"): true, - common.HexToHash("0xcfecc6b7b97f6b4bd460cdfccb59e4b7b6b58b193772dff9e85625554ab201be"): true, - common.HexToHash("0xad455ed8558af13f7a499648f01a387211429899eae15dd104a905145f9d1a1f"): true, - common.HexToHash("0x3535d6b32aef9169dbe51742b5d9017f47db85ae432f9e6e4e41f4517634d736"): true, - common.HexToHash("0x63a02025a6a6fcef72b66d3318ef2d7079a8b5635d5a2fe14dfe8b903cf65b5e"): true, - common.HexToHash("0x2fa3746c1147125b42e1a25a0496065eac097efc4bdb27edcbc3e1bccdac8462"): true, - common.HexToHash("0x7172400c519ac808cc689651d5b1fe77d30243987694fba9843ba08f85d6ad11"): true, - common.HexToHash("0xea64ff90d2b1e5dbb57787c6fab1c0b594e5e32ea27339da006585c75c2b4357"): true, - common.HexToHash("0xec723c77adc6ad8f13a77ee48646ac311550ded28b2c4ce6cba15b839d798ee6"): true, - common.HexToHash("0x4a71e7bdd45f6de7686f707f4e7e296e63c46e62cd660ee77c6684b69dbf803e"): true, - common.HexToHash("0x031c424bb1fabfeefd346d4968d340385fe91dff07dd77e595f5f762a195ab71"): true, - common.HexToHash("0x0977d11dc34626eaedd0424a0a0c186a04b3453e4bbc3e5aac81e9d3ea363d9c"): true, - common.HexToHash("0xa173b9e9bdd010d280da197f2aaa71604e8c9fe0ed02481f9c11b3cee6a22e9b"): true, - common.HexToHash("0x3b65a8df3d7f0ff287ebc531180975eea5cbc90b46229eb1e266d21fd207b27b"): true, - common.HexToHash("0x526e9fbd11ca1605d58164ecba1aff69b1419e6dc31297b12aaa00555c725772"): true, - common.HexToHash("0x4123eb9d0c826ac9e9d6de01a665be1f39d0885904d2554adf8cea8149394d42"): true, - common.HexToHash("0x02d4c7298afb1633cf3f30523374711385fc08541e9d1c7f6e8d049f25659d99"): true, - common.HexToHash("0xe9ea49ebc994be9ef11aad1d72e9899793818d963fdfc96363f9598db2a3a9e5"): true, - common.HexToHash("0xba8e276dede014519b6f4addcb0f9a6dcf5bfc8781ce59bd1b4c7facaab291e8"): true, - common.HexToHash("0xb50debf849b9932c304cecc0eed1d13dba6a55497ba5c7c81e1669d5995dc33b"): true, - common.HexToHash("0x52e7ec30ad36f9b59a1508eb38b1c5525b3ad1f93f9b1746b9b81354e9285a46"): true, - common.HexToHash("0x7c5aa1028fbf3dde52dea1b719777e6fff911fb65e1375e5dfbe2372b61297d9"): true, - common.HexToHash("0xa4e10c97e62419ae83d212cfd907261e077471835a305d5a026e2efd729197fb"): true, - common.HexToHash("0x77758e7f3587f884a988a9e845c224bd2b95f7f076e54c081505dc1874baf255"): true, - common.HexToHash("0x4d215bd36418dd5327789aa214f7accecd9b37f7f753c138649590e72fceb528"): true, - common.HexToHash("0x25ef61ccbf45f3e6da6d39518fc7a4869f688cafa37c310feab8a1babfd00a27"): true, - common.HexToHash("0x3919ccd0be7d68f05bcc48db6246d5acce85510e241554ed87ed046df93c55f7"): true, - common.HexToHash("0x337ab096bcd012cf5d8e0804e49c5a11cc0863a052ac341d7914c8f1821c4d31"): true, - common.HexToHash("0xc6c9e77fb4af50772a061f6095bcaf77ee9a362e35147e322b532b2d246c2a33"): true, - common.HexToHash("0xd1233a98aab494b019b703b4a040115784980999fa39d8663fa55673a5ab0f32"): true, - common.HexToHash("0xa6470da5da6f5e1bd43c778893e1d0844460766c93c0329a6baa24e736f62d24"): true, - common.HexToHash("0xbd7a7fa7876dff99b1fc8b0235201ca81f7b48ff7c0a85acd3dc8e54ebbc4f9d"): true, - common.HexToHash("0xf0654ff47a50f34d37d5c51c75dd217e2164b8ac403727692b65acf4b584688e"): true, - common.HexToHash("0xc57c33768d364696df06cc8d35913fac428c5c4ad44937fe210bb06f083e92ed"): true, - common.HexToHash("0x427e7593a7ec8b328fe5140ede3fcd8ff00219d2a26f93fc741674345b5043bd"): true, - common.HexToHash("0x06b9ba1ddf6b6170971b8d31da81831aecf3c9de4451c0d643096fb4a07d2c91"): true, - common.HexToHash("0x6280f6ad07ccb000464daa55acd02f77fbc53aa1e1600d816c15f9263b9689da"): true, - common.HexToHash("0x7c2f2bdd71ca78db0bd17d4629f05dc20ac6a40b42cda6e2d348b0310f61e3df"): true, - common.HexToHash("0x59ef1b508e71bcb5548c90d0c70492cc7504a919081141974f02a9177511dc23"): true, - common.HexToHash("0x97c1c20dc98241e7e191e556702ebc93e325348c58db3d96d28186697fe9de87"): true, - common.HexToHash("0x6906d2d29ceedabb60aaabd91579184935977cf0b8f88e71f99a15a98510a8b2"): true, - common.HexToHash("0x6a79132d69e4f0ade488db33007ef26031b8cb3c0570502b794d4617b0633ce8"): true, - common.HexToHash("0x12b19bb589153df21da0c9978e2ef03765ee22844a9cb7af32d9cb888df5c560"): true, - common.HexToHash("0x7386169cbb0b949e0d3eb1266f3b40ab418d6f6957ccd6f1ff5abcf4d1b13ec3"): true, - common.HexToHash("0x0f9fda80ff4519fd288d590351e3b9baf1f799ca48f3117751958853f42d0a0b"): true, - common.HexToHash("0x794661104bff9bad8961044db0d9b18da641c51851898ce53944213fb69df607"): true, - common.HexToHash("0x8067ee87fd0a26cb8db9c38a214022f9fe6c043a4308138e690886d3baad96d0"): true, - common.HexToHash("0x1d2e8f4e7f802403fb15f1431e168d5b64bd93e9597b8e3863e8c4f134e66c9f"): true, - common.HexToHash("0x05e3bcd5f5ea3212b112c5b10f873004268cc9ee2bab63c5b253d590782829c4"): true, - common.HexToHash("0x0344bb630d31bb89b57c90ee079f930333f63cc984f69e2f1136b39325ae54ea"): true, - common.HexToHash("0xc0bb2e89bf5c98b96129402ae06f9b529670c221d93264c57f3eec7571f17387"): true, - common.HexToHash("0x84b6a03fdb02b2064a1f611417575a19bfc656d826a41498d6cfce0ca47613d9"): true, - common.HexToHash("0x03d46f46b78d889e6d29b8ade4fa4d062af22d81d35010b653aa2e040625aa1b"): true, - common.HexToHash("0x0df7d75d00ac951d4e3da5de42934c8db39134bab4c692cde438a60b3d79164a"): true, - common.HexToHash("0x7a4552e0563749a380aebc32be369f1b15c0f0d9991c6e4eda21d941675d727c"): true, - common.HexToHash("0x799da67cf9dd599c500eb6c42cffa96046c9605663daf9060a92c4570ca009aa"): true, - common.HexToHash("0xa2095db62bd1fde792484c23f39e0d3b26b6a39b42eee1d7d40f2e33b2b28e61"): true, - common.HexToHash("0xd20c025e069faf0a1f2a3a4103e64dd2f5ae7d2734003482eb1aca9b6f6d9a59"): true, - common.HexToHash("0xc2261c3ae84e3e35b391fcb1c6d8ff6632e950c6b14e6f011e600b6b48050093"): true, - common.HexToHash("0x1c21bce5054a7b43b4183ff183053594dba48969306ef4956ed952de29758d99"): true, - common.HexToHash("0x1b647c2f40ea4656ba55f34b029ab805753dc874d953a1bd5aafb9fa1fd058f5"): true, - common.HexToHash("0xc7234ec4ec8eea000364e61c99492e33905bb4f3f71004347eb25196dc7d01ba"): true, - common.HexToHash("0xc487637bdf7a6dbc56ae9f8a4cc3fe90c3b32ad04f7a66454656d5e7c16812fa"): true, - common.HexToHash("0x70cf0c46fa305d67d0a1cfa3b69143b02f32e9124658555b4f741b1aaaf424e9"): true, - common.HexToHash("0xab7750051b107d3de6447fd92a213c30ff2f219a2412a46b54becd514d61a012"): true, - common.HexToHash("0x70c731c9ebe8f61d41836ba05c7c9bb98fe7092cdf5e79e455d5ed27f3d70b02"): true, - common.HexToHash("0x8808519f2d406bb5c80ff02786f37cecdbade514cd65b6f311f9e38b6799e555"): true, - common.HexToHash("0x5edf8170a87dc3c328fc8ee87c1a214748e2947d1d507197467bb4c6913577df"): true, - common.HexToHash("0x8a8700de460daa8e11429c520232e884bc1f662fbae23b9bd051e35682349b16"): true, - common.HexToHash("0x3ebc93e6bd77e92a2ac4240f9d0bae39538103661e1db0b6c2d69af543132820"): true, - common.HexToHash("0x33cedd76a375007ec49bc9ee2d63227f6375a5c13259b79206dc92b0565a8b49"): true, - common.HexToHash("0xbd76868e84f8ae1f6de005045d315247f8d99c523cdc6d8bfe8b74b6e090f3fe"): true, - common.HexToHash("0x4139a5575f02b4b998492b6fee50a9d5f8e7167d8656d524a403b8083d1a5766"): true, - common.HexToHash("0x4dd313fcd7b07fe0ae1b5b6ad3a2758f2aa8efeb580fcae1fe5ce325cf9abee7"): true, - common.HexToHash("0x8171e6197bb259f7c3fa812b5e3d85fd3bc9e1622d3bd634df8278cd93594be8"): true, - common.HexToHash("0xea72fc3b9179c80ac06b587f8a1f01a7692e66a05accc9df4d64c1dbcd921b09"): true, - common.HexToHash("0x4792a772c283d6d6212568ab72a05fc0e9bd362a3d3e83f536afc084d31759ae"): true, - common.HexToHash("0xce097d7774828ddce71811ced710817eecac0d110a4909691e179536f8344dfe"): true, - common.HexToHash("0x7503b9b08fb129038f331960fae03544ab83618a1fc6d8177b0e3867745d73d2"): true, - common.HexToHash("0xdc1cd465a3c64ef08f94bc0bda9b79f7c16370ecee7268210a09cf86bf50affa"): true, - common.HexToHash("0x4222ba54623302c11f3bcf1cc05295c2bc27920575078888eb70c73e741b48ac"): true, - common.HexToHash("0xd1f6d8a6a1b6501e6abccef945e2244bc8f63860ff55cbf61ef6188ea1057b4b"): true, - common.HexToHash("0x175330c05839e40eb2f4632c9a335164cb17d9ed7ab44048e671003e09446afc"): true, - common.HexToHash("0x10b60e7c7b4e5e82dec87168ed4b6546b168ea22aac8d7ce7c7f4dc65b7393b2"): true, - common.HexToHash("0x417aadf05e4d2dabdcc2a80fda119f864bfdb1a6d4facc8cd73b6246f0d380df"): true, - common.HexToHash("0x1462e7d51cd7403bceb0d9c8766699e01e528aa88b33045435f9a0f0e7f2c922"): true, - common.HexToHash("0x59665a7c0e82972dc195115f735dca7d5ddb4beceea857050fd8b0c909fad71f"): true, - common.HexToHash("0x53566815bd16a541946d04297d4c6e573dde3e4dd273eb1fe48825f1dbe5a3f0"): true, - common.HexToHash("0x444025b8a162ef3934e19587e8c9d707c8c4f2983714fbc12ba408f4459d14b7"): true, - common.HexToHash("0xdf963a6ccbb0be77f756c7b731fcd54568e5f77f297f9a17d8a0cacd60df922d"): true, - common.HexToHash("0x4453fdc82841cd9f8a287d98ab6d1a746eefae0ebb2fce04cbdda81effd55f68"): true, - common.HexToHash("0x106fb26e0a018d4522c565358ddc79395c82c4d65b50965283227782d2391c15"): true, - common.HexToHash("0x59564cf9eba5c4a667228008aecd00c2d55b7e3c12afdcc32313aa5c2ffd635a"): true, - common.HexToHash("0x6f7834e53aae2990682a68f8cf7b0b4d536c526ece376ad20e2433dd8e1c0b01"): true, - common.HexToHash("0x8f08750b26d51102c2857a150ff05bf419df59d7712b0ddfb56ba74fc8b23bb8"): true, - common.HexToHash("0x08e510cd464d354febcffacc3ab1c103962ec10104a6c4e802fb49b93eeeeb77"): true, - common.HexToHash("0x25921e4df9936259ca9064360821d6977f647e412b67c7a37910b6cde1690912"): true, - common.HexToHash("0x6debfef74adb54fa47dd5bfbba1b20af27fb85dc8803b0eb30d5aee0fe417805"): true, - common.HexToHash("0x6f81d789f5a9f462e0a84bf43b16063d0407df06a9ff624062ebe73cda59445b"): true, - common.HexToHash("0xcc0e2d2484b51f178cade23b8ce5d32085ff02fd6678c64cbdcc44a2f76a5442"): true, - common.HexToHash("0x173a3e32ca4a2b9c9c9950cb7f48040253a14c62711175d65191fca0c244590e"): true, - common.HexToHash("0x399581c245603ebdb262c0e5ae67114b6b0240d1f6511bc79975427b7745e3b4"): true, - common.HexToHash("0x4d77c52c1aabba8e57489c935f85ff771bc79c50daf1916d1c5348f4e89ed978"): true, - common.HexToHash("0xca82290bda03509b12a5a6a92ef28ad8c0d0219bb5c8db78834036c99143c7b8"): true, - common.HexToHash("0x222016b2ccba4838a43b348653c6d0f808003491b8644c99f0f5bd35b5e565df"): true, - common.HexToHash("0x86245c02a2415d337dbbb40dd77102bbe0f1d560c31a578aba54712a90e5dae5"): true, - common.HexToHash("0xee8424475b58f4688b8d761219683b69e3d0e06a2b13de529d135218cb97daea"): true, - common.HexToHash("0xb00b353c92c9e460b7b1163a6147b0cca9d8f42baf38952322d433e1e531a4d6"): true, - common.HexToHash("0xaa78e5d5aae244e826206bacb7cf2935d56d57684336f54069c2980e3e1c095a"): true, - common.HexToHash("0x69447c8291d61e0327f9765535d27d2eb43d33a538afca80490e7e3895261139"): true, - common.HexToHash("0x2534dbcc4ced9a9763145797eef60057c6e4ea196b99a3c652ccdf2d3c548512"): true, - common.HexToHash("0x9b67e206e2cc875e6a169e20e234cdbbd661412e7c4937defa64905343ef4ea4"): true, - common.HexToHash("0x931471d4f717e62a40e8552fe78552f4cb1414b1c615ec0bdbdb8d4292d864c2"): true, - common.HexToHash("0x2d728e0b09fa61a7553c5173aa3a6a1ecd05d02d57d188adfd160a8a48beb5d3"): true, - common.HexToHash("0x43acb3f0e487f24973c8d3edeec8b9aa3db8b42f07613c906dae3cb3e4fd73ce"): true, - common.HexToHash("0x7d3a7517f61af4249a2b2cbccaf5b55dad361a7065dbadafeb11e0a557211dd7"): true, - common.HexToHash("0xbf6a104d09fcb47a885c5f32a3dd9bb577d4d8a1fa4ee2d96048fd99f95cded9"): true, - common.HexToHash("0xddfdb49c09f7bd842d4dc35c94ba9d55a57f2cdce626ac51230894797bb59b53"): true, - common.HexToHash("0x4d3320b600b50132106c4a7ed988e1762f8f88dca4e5204f246ff775a14f18c1"): true, - common.HexToHash("0x92cbfa5c76666a3ff1eae937220c860abd062f0d498f1b56d0fa7cfb06ea452e"): true, - common.HexToHash("0x12e527a583c92131dc4e535e3675369abe90fe6a33011a022b0713bcbf55941f"): true, - common.HexToHash("0xd7e873500b68a20701d4dec17dd345b587331c31d85a0839518db65f3cfb540b"): true, - common.HexToHash("0x4bd6c34c5ca7c1a50012cbe999d6a05557da48020feebe49050c484750453c83"): true, - common.HexToHash("0x291ae91dc8ff77e857747905199672c60ea9785a67fc3ecc80d60996cf7302a2"): true, - common.HexToHash("0x32491885ffcc4a0a4416251dfbe56571844324b98bc4249280f50c0388721982"): true, - common.HexToHash("0x97a2f88940a0095fd902d17d6e2adc88193ad9333df7115a0926c7172d818e8c"): true, - common.HexToHash("0xb05957eafa3b426de80b9ea312b478209a7ab12f52a844c257b46442f9253c4a"): true, - common.HexToHash("0xd752f7d5acdee1ec56f17b95458e6459d4218c67a25807a7d62175a1c018f622"): true, - common.HexToHash("0x81ced39a1f6b0ae37d28dee7101bd94a0d9dcadbc7fb3fc3027d288769ed4806"): true, - common.HexToHash("0x944e59e19f7c39881e9a72c5ec97f4f352468f02ba6e08803a3870663eb6f551"): true, - common.HexToHash("0x3322819dac967947cf5f3e8cca02a5e065a15d74dddc13441b5875ee260f69ee"): true, - common.HexToHash("0x3a4e5dff0d5256287f1370123b29bb051729387d06d79383ad3adcb90497ce2e"): true, - common.HexToHash("0x83d18c06340b26843306f7c812894fa325a8e01fa4ba20404a789ac3399fc4c2"): true, - common.HexToHash("0xcd1740603cc47467c97b51afe10ba5b22c9aab9d5d68b287b19b7a560d6e4b5e"): true, - common.HexToHash("0x3ee6e39525c49775f02a3ddb1bddb2c3c6b742ccd17a8310305deb13b87b77b4"): true, - common.HexToHash("0x095ff47dcce55712b86318a059babd2a0c4d3d3ead07f485d9873673581d5ac3"): true, - common.HexToHash("0x75800090733521ae6dbfcae7ed2694eef59f3ef8c29a9f7fb2bc66730384a8f0"): true, - common.HexToHash("0x493fd2c3093494e195163ec6d7bea1bcaea8ddb4e934747d4ba6a629be658bd4"): true, - common.HexToHash("0xd8560d4dd08b17e65b8d5468394710172b758db3ee511fe99011bb03686eaa17"): true, - common.HexToHash("0xc2aea2451b6872f8948c8fa1250fb314e3e4d39abf0b52e50fc1c7faaae47065"): true, - common.HexToHash("0x4f01d5a0fb7d2651d82ad919e997c9340169db358043f4009b3a08047881e6ca"): true, - common.HexToHash("0x695985b49899132b2b4797615f02b80dcbbfd4533925ffe0d1f45de02cb1100a"): true, - common.HexToHash("0x51dd70b9d109a9bd5f3a8845d83b3b4e2a8236a4fb291dc072b098590962c02f"): true, - common.HexToHash("0x167b3e0ef2ec606db6a7f450399d75cfcb7a7866c3072e359a220c91f8437c9b"): true, - common.HexToHash("0x6b6736b2aecc22856ab8941df8207c116150e6694e346ce612b1c4981e893d87"): true, - common.HexToHash("0xd43cf99a8d62ed60f2c97def54ce76f39d34019a0349e65244f39e451209ada2"): true, - common.HexToHash("0x79942fd7a4627922ac02a9a86b9a236121a318389195db256efaae83f3a36a9a"): true, - common.HexToHash("0x008f5c32bbf1446bf991fdf1979043d753c8a24a6eb66c4549b0cc9557e90e17"): true, - common.HexToHash("0xe848a0a19f6c8013e4b55d733d46f282d471f759176b23a34431c579bd27dd46"): true, - common.HexToHash("0x3873d380c9e6f923cc1a48c916ead578b67af6897fa9e15be51274a58142b0b0"): true, - common.HexToHash("0xabdbd63f438d662a1e66135897ea4cd7030d3dfada97f269ce869f561dada395"): true, - common.HexToHash("0x0a3c005ff33a28d129fc30c4dec4540de2c75ab70d1c0abc3e6f84483d83271d"): true, - common.HexToHash("0xa68ed153ee773a457153a25d113614910135ba83db062ff5b6949f854e98e05f"): true, - common.HexToHash("0xf70c3ad7912e68ef0c3ab184ba0264ad2c886259c189cc9ca7af62d5100af99c"): true, - common.HexToHash("0xd8419188496388b62142a7c82564b99869933e021d8f299e726ca737650e26f7"): true, - common.HexToHash("0x95fb4455420320b3749900e82727cc92adf9b50583114ac2bec1673357473148"): true, - common.HexToHash("0x8e59f33f957fdfaeaf4e5a94cc50f8bdd1d6d52ee6ac72a882e49b95a9a01263"): true, - common.HexToHash("0x44af3ff5029bfa9e52b6002d1dd01ce6a3e81ca897973afeb1b5753f612f1b0b"): true, - common.HexToHash("0xfe691557d105e3445a46971f53c2b3577a440be92bf6c2bb4ab978e5ff1cf33e"): true, - common.HexToHash("0x1834dc1b4c2784e03ea392af4e299607afd8753a54816402ecd45701e173c83f"): true, - common.HexToHash("0x373c7ff83e30c9ca5d735198e84a2cf3afd74d784f17e24396993f7ca668c1be"): true, - common.HexToHash("0x5dd1c3a74e9902b2d951e045533fb472649851842bfbe49f4c10d32e831a77b9"): true, - common.HexToHash("0x85e521ebe708818eebdef5677b0ec78d3cac0c894d43f49cfd5ef97509b8d128"): true, - common.HexToHash("0x5db8faefacc7f1dc00736d4961712ae147cacab2ec64bbd659f6f18bb7787383"): true, - common.HexToHash("0x7ef9ed94cda9afee8c8a13aa7be6ce122fa40d93f5d65b53490d8e6d95f0bdb2"): true, - common.HexToHash("0xafb716b9cae46d88e2cadf298287fd33316366a55d41edddcdceb594ec492e0e"): true, - common.HexToHash("0xb21fd774bc941d95b47af2e6fdefea6d21486e4e1dae6845539ed9c46284c9c5"): true, - common.HexToHash("0x8c8aa612281263b3b6c7a1763939961d55120d6a8cbca7f8d0cfd7a0e046cfe9"): true, - common.HexToHash("0xd2169818b3ebb849da1af529667bbc5ed1627ba5fd0990e8ae2dd6f423578a38"): true, - common.HexToHash("0x95ce0bbfbe582565ef13ea0b9bf662ead4685df021cfa15104548abeb001d7bd"): true, - common.HexToHash("0x4dce0fc8ba19c6b407e34ae9d8830cf24be10ccfdac2c91224f2729a9a82987d"): true, - common.HexToHash("0xa703763d0f82a3b641f41d75f07305e15265589bf23649352ba7409cdec0042c"): true, - common.HexToHash("0x805c65653f2a1287e0135968d5ffe13b7b93942a2d8263e0a638e23c7d4a2ac2"): true, - common.HexToHash("0xd534cbc4ee1d59719d3b017088c95c2474ba80a8ecaf1f945ae3102940f1f74d"): true, - common.HexToHash("0xd9f1a6f8033e8b55aac55e79c1bd6c3e6bafb577eebd4fa529481182d56ab3f1"): true, - common.HexToHash("0xfee7ee4e9a6c0bd9c1fa341f5a53e0e75b7b29121c1fe5ebfe27a52bdcd2f6d2"): true, - common.HexToHash("0x8cf429cdfff40346519e6c716c4bf6419313dd581f712e41d7a707de1df72525"): true, - common.HexToHash("0x54f620f04bb98c0268b5bc4bfab90dc1b8bc06411a58ffbf5dd7fceb2355f7eb"): true, - common.HexToHash("0x9f95c9508653f9f51239b866f30fc7af9f61042353c4f0032f0cadeee522a62e"): true, - common.HexToHash("0xbe7cc8e252e9a60b44140c95526d7e4335f8df13236a6399e61366a0f264aa23"): true, - common.HexToHash("0xd98b5aac80c3fe352a59172ae152e3595934a50ef2e47c700f5a777fced07a8b"): true, - common.HexToHash("0x1a2803cbf4f9b8c773a572c12e36dc06250f19da07bd39288bc53893c7343a19"): true, - common.HexToHash("0xc38cb403ad5f564adba09633e773651703c2c3a9f677aa4aaaf2dd71cfe9394d"): true, - common.HexToHash("0x9f9ea07021dc29388b02a109085f33c38c6d6c7769f991f4747dd14081cdea1f"): true, - common.HexToHash("0xa60a748ff8d995d67152fb5c0c2be768beb8b94308aa718c3d6172720cae8952"): true, - common.HexToHash("0x4e9d7f3ded5fd053cae29a673c8f8f4c38b370ed10ffd6da5405fb7731f17cd5"): true, - common.HexToHash("0x127e696a9071937e675a29a04777d6a8aaab8d48ef59fe5e9aa94fd3a99dfe18"): true, - common.HexToHash("0xd9f3c72b5878ec0bfcfff14790349f00c4deb99924b6714f48d51115a7554499"): true, - common.HexToHash("0xed1207f40f127ca0c867ae2499c081201c3b0ffe13755687d18f572906a90df2"): true, - common.HexToHash("0x1b85d5cdf641252f2d66ed1181cdcf01b9c98713bb245ac0b722d4a7bfca8dcf"): true, - common.HexToHash("0xa3a728eb4e0f732c832f978beebe0b676a82c51c2d8896bd75e1a0b75c14db25"): true, - common.HexToHash("0x7c67db40bbc611a361f32f6b2d4d3f11881098003b3d815ef9766c2d3648c960"): true, - common.HexToHash("0x101423659a8b493f715a924bd6e502d7014bc4bc2e84f14f0ff62c9494f7d4ff"): true, - common.HexToHash("0x26e1e791abc618494ee094f91249afc4afcae83afa8e362e850ac06ac6b3516d"): true, - common.HexToHash("0x3df1814c6928721fb18d73cbc16b1864e0af90d109b1b3776550e83f72c54e89"): true, - common.HexToHash("0xe61eb1d25fc184081b9e05ecc23f94397d8254f1dbd6f4c893d6c5881f8bcb26"): true, - common.HexToHash("0xfc9e8268041fa3ef1e190bf2c5470bed88797d5d240e20a8103d9543ac78c05d"): true, - common.HexToHash("0x3ec7a63148bfcfdb8b54dde91cacfd1e0adacad108a059c82fa6924bf1486bea"): true, - common.HexToHash("0x931a885a3f6f9aeb759b7ddfca43f23c52b64ea1c6929d98e8af9c65f8c6f9c1"): true, - common.HexToHash("0xf431567bf3b0afedcde5c8fbc8369497209046cb572076a10cd2e5151c23d198"): true, - common.HexToHash("0xe96544618cc405d08c35994b735c616f438663e2430a898b925eb7a32ce260b1"): true, - common.HexToHash("0xd3fea1d9ad2a9283cc25a6c3b6c8a9ed4792b6db88ba12998bb7f42f326751fe"): true, - common.HexToHash("0xaf37f33cab79707c0cf55f68b51712c609e38c9baaf3e37c0c780b05f4dd9f61"): true, - common.HexToHash("0xa6983e6096457c6c30975b8267e7073fb8e28b7162cfa4f57b35647657c12594"): true, - common.HexToHash("0x108a88f18c6863f0992b6e2b39c7d0818056bb7597d0138cb8a47578feb505b2"): true, - common.HexToHash("0x6e1e2cb269372b6506c76cc932c8f83fea7a9c4d84823dceb8c56e38f18bd258"): true, - common.HexToHash("0x54521fc6e165e28e81cfd9f83c62b845354511675805dde659f0299028ca7eb4"): true, - common.HexToHash("0x295a9e624003ab1626fb4c4f6f756c6f27b7c5ee0ff1257f16ad1d50289fd97b"): true, - common.HexToHash("0x10259e5ca4286ba1ea59fc26ebe2118cbf80f4c3ae28024650298a0352488736"): true, - common.HexToHash("0xd01893b317ff6a591dbee156fa944d9137b607ef12023810fc2ac6373ddfb715"): true, - common.HexToHash("0x0bc9ee26b045cc2804d396839d3ab8821d58572c1b51c07f5cbda04f5b62a6a4"): true, - common.HexToHash("0x2a8af2421d347e9f61fee5cdf43fd039dd4464ff2e4ba03595ee4b92a55081f4"): true, - common.HexToHash("0x5b29f7e0124076623b9979718c9b912807115c1a9e23e06b8e1ce40da34e1ee2"): true, - common.HexToHash("0x16717abd9e21858e9220faa6f0d9e7ea5e71c5174bae2e7a2b738e55a2cc04c8"): true, - common.HexToHash("0x74c3f2b2bcc8b6f2fc0a7bb8d148544db585d3bb760d5a6d8d3abda6d019c421"): true, - common.HexToHash("0x748a8f094d848e23670287b33363e0663f5fe7f3be32821077292b965c46173a"): true, - common.HexToHash("0x6cb958d87211109655f606bc95b8cf6be143979cc6225c85a6d4572551007bd4"): true, - common.HexToHash("0xba21b1325c0528b9ae6ba274ba171202a157818e22e9ecdab2ad4169766b0349"): true, - common.HexToHash("0x22f384b57f6ead9371c66d6a8535fb3534ca1bdcefa841404dbc7279f5ea5af8"): true, - common.HexToHash("0x6ead917f378e2986f5055db0161cbbe4a61a8dff58e61256db097199dc8b9550"): true, - common.HexToHash("0x6093256ba19d3eb2cedb40040a19236efe47a400ef9de31e9fabbb7eb303e7cc"): true, - common.HexToHash("0x7ced5d2ceeadefba821d9a530a12776d7a90eb7ebf2116f404ef59b2102201e0"): true, - common.HexToHash("0x3ccc021ad8c7b88c734da31f0d7511784c5e73701aaa5573e69e0239be8c1d55"): true, - common.HexToHash("0x0426627792ccc9c925d1ce5f8b5712bf01e5614f193914fa4f5e12d330f58e54"): true, - common.HexToHash("0x765d7bbc4b5e10d42803a6047f660eb3f072e1be906ae46f5b9c26db4ed59aa6"): true, - common.HexToHash("0xa99203a7d1b6f6b55dedfe4eb4a73e7903597477359901795ecae04cdf40fbc2"): true, - common.HexToHash("0x6e8b484a9915f7b22f5698674d262089a479fc7a7b2d5b6128f55229331c2196"): true, - common.HexToHash("0x811764b49bfcb3060d16437215ec4b1415a91ffdf706f8ad83c414ce2c3a00b8"): true, - common.HexToHash("0xde3eb8482240dfb4633df56f15b2acbabf179e05d36d8dcc22693a84d6b5d00a"): true, - common.HexToHash("0x96dcf6a479f06194a06afb247ad493bf3c9d07a48145aa5e97d2d9d8a24b3954"): true, - common.HexToHash("0x23e468ceef78375b03d12d74f470e82254c06291f95b606e9a919aa504d97252"): true, - common.HexToHash("0x64120a05f20faee68840158b817fc2225fb2a437dd185569dd9844f48b0f312b"): true, - common.HexToHash("0x621afbc0442ca2a6d59d43d217a1aaf62336314455a9b2837135d63cbb43e883"): true, - common.HexToHash("0x89ddaa416d2469b344e2491c2eae68563b30337e3224e95ccfd3ade2065efeda"): true, - common.HexToHash("0xf39ae63be38e74a6d5873d181dfa452e0ce0ed758bfcb96898e8e53bba4a3c49"): true, - common.HexToHash("0x7aa904fc6ca5a46425fc413039fa52b739f7c6788dcb198620217d5d6949ace6"): true, - common.HexToHash("0xc01f15299871d58794ab18585a4b51482338be3468fd87bad02ceb72e00082fc"): true, - common.HexToHash("0x39b8138a5de70de640b840aa41c7bf850f9bf9bc39e5d76c8fbadfc1bd7edc99"): true, - common.HexToHash("0x1b45484fa668f7858bbf3e222982ab4f58c9c8ee54198d14b533d7272177047c"): true, - common.HexToHash("0x2430fff4c9bb262272bdf32fd7fb307cbf21f496861e017881ff9aac1310f09e"): true, - common.HexToHash("0x92eea9958fb099bda7f4fa3df9071e60cf52f79e143854134ae7c2f28662a339"): true, - common.HexToHash("0xfeb274b2dc0336a623b0fe51b7851c0cf08a57ef284093bcef0a9dbdb04d6d74"): true, - common.HexToHash("0xdaaac7a601f2556c56fb798aa4f7ddb3c37ddb6a5fbe797a69781091c2d4cbc7"): true, - common.HexToHash("0xf18e80389b883f564fef064c2a320f8fa1073adaa40c3604797bcc83dc6fe5a7"): true, - common.HexToHash("0x5fd5adad9448a9b91877c813b737815b7866133a9673a6e66cf31a61f095625f"): true, - common.HexToHash("0xe9c0508882ed7515d5cd1ca518290cd3ba1d254405c9b5378e24b1208fe0ae58"): true, - common.HexToHash("0x8901a36356c812114acbd476bcd80d7b22db11bd80f40f2ce35ea76178bbe418"): true, - common.HexToHash("0xac35453c171ffe92a61c94ade510360ba0cd6b2516ffa54cc26643d81dde19fc"): true, - common.HexToHash("0xd8e8c1ec07c5a029a46c3cb660a842748773f2c315c6bab63edbd50aafc3c7d1"): true, - common.HexToHash("0x56ed3bb534ecb0e17ccca740a98d91ee53ec3f6fd5ab8364d66052f1b4a3c10a"): true, - common.HexToHash("0x877ca58c200e5a61587135f020210c355531a56db9a344948fd27c312b7497bc"): true, - common.HexToHash("0x1618b497d53f56e56a01c58a3ac25313c5a7f654e7446dedd2dfdcd58cb24748"): true, - common.HexToHash("0x7fbb2af81df9e7311bf75bbee400c26c601f0d59a5241b65fcbcc6307db05834"): true, - common.HexToHash("0x285217e5b58d73ac003757293622a7a07380c0f1101ecdb9925633354c8da98f"): true, - common.HexToHash("0x8a63458e8d2510aa4e3445234c33f322190d9c1edf4f82047dc739e177798260"): true, - common.HexToHash("0x84416ab5eb3f88086ec6af9d786127c0053fe177a2a697732f5b3e6059a5c8c6"): true, - common.HexToHash("0xfd9fa3abdae7bcd4db35be08c6c0aff9128d47b199a8ed13c4fff147e3840e53"): true, - common.HexToHash("0xf97b2e85d8902179704f7e778fb30663916e2808b7f0e4634e4ce3d569e10c88"): true, - common.HexToHash("0x979da308c1ca4780008bc2af30ff48e2912085e6f8e8eb878cbb1721a3d95290"): true, - common.HexToHash("0xd30a7bc713072445a26114fa21a740b76fdecf11d8fa9c13b63badd099521844"): true, - common.HexToHash("0xc8e9e58370a6df128e9a631f1a9de337372cebc7a9597ee45a9d18523555e3df"): true, - common.HexToHash("0xaae0e97abaf5a8909603599e7e27601a55ae80f0a77e29bbd48b2fcb53943927"): true, - common.HexToHash("0x9b657eeb1bfe91aaf8abf55b5f9d919f07001f65da464d066e6747f957cc4f7e"): true, - common.HexToHash("0xcde6999f13db23dbb309b4b8f57ffe4cddbed382843a758bdd55181c988e586c"): true, - common.HexToHash("0x874a830dc43bed80fc4b63bb90fc3fc9aba99b5e5acc2121d73ed1549400e30e"): true, - common.HexToHash("0xacbcad122ffe9cf22ac7cd63792158719d8808317dd66b7d5dd57be3ddbd6954"): true, - common.HexToHash("0x18c2e4c62ca1740ae8d8a5c7416de0c9f9aee4236c272af8b66173aeff3de732"): true, - common.HexToHash("0xf319dc893ac5e5f75f3200a179dac66f8ab5470f60a39b25dfab56d24e11785d"): true, - common.HexToHash("0xf128e3ab4c7b0cbda9612eb5dc393bf484c7f69b1257aae1cca5e79418dbd103"): true, - common.HexToHash("0x7322338d370b5ec203ab7a594bb7eb644b35beeb07f2b315bba0daabefe4491a"): true, - common.HexToHash("0x31dc2d62c898dfd947f4f8e087189b7a1e1af2f101f5c4d8436278375c3ec22e"): true, - common.HexToHash("0x286d4917919d8c8b74dab8b93b40b582e67e49c37de16bceb17d2248ed80cf30"): true, - common.HexToHash("0x4382044db628a173d56fb582b5246ba197ae6b88f41def5ae343407dbac06df1"): true, - common.HexToHash("0xed91058a882d1f65cd5fb073e332a2a4fd96f64b874e1afe27903be1a828b195"): true, - common.HexToHash("0xe440ddb6122584048cec6650339cf57e0efffe39deb7f3f4eeb55e771a21be3b"): true, - common.HexToHash("0x9025b8140c5055ccb7d83fd6d38c58cc636257c5763b3d7f3941275ef9c5d4a6"): true, - common.HexToHash("0xa7a690deea9a8e234f7b5ab23d41362d4a4979da5fc635a95bc7ac3897fa1d15"): true, - common.HexToHash("0x2790b14b0c052767b68a5abb8df9811a5041415b6eecfb533e1cfa9569fd73ad"): true, - common.HexToHash("0x20b9650c9b3fb805e38f9c9e76fee1b6398f1d94f8b8b91d7f8928e1ed937142"): true, - common.HexToHash("0x5f5919c556b8a50fdb5bb577f190c91848826d78f2cdb265898e7f5a67fa33a1"): true, - common.HexToHash("0x23fccf7c455fa69c027637189343b2f24e7911ab8c7cb1e5eed59af8fb52e51e"): true, - common.HexToHash("0xd766df0c974db530df16cf375d08e93d4314bf72b20ba5fa97698e726ccc1450"): true, - common.HexToHash("0xd4d91340452e45f73ac7729733cbf0461bdd93851ca056ed6ca1e852e029a66f"): true, - common.HexToHash("0x1736b50958aa36410214302870d2e57888814aa1bcf50a691c2f566f96f7b1bc"): true, - common.HexToHash("0x4d555c1cf2c69882853ed94d213d0d5ea25ba65dd1278bb84d50374a94c34ec8"): true, - common.HexToHash("0xa9b8ee65c24a1aaa939356066a13446d9a1cd8d6b0a43e3891efa18d360ead81"): true, - common.HexToHash("0xb5a02acb4ae8e8df402d6fda7bb4d661ac0072d1c4d76e84bb21a01824b36d63"): true, - common.HexToHash("0x27387ff83328a37bcab0f7227c297aa56246061ff3eebd356894823c6e3a2f69"): true, - common.HexToHash("0x196c29ca53e78d1ea213885040e9acb5f0b7eff0bb6ebe58934c313ced548496"): true, - common.HexToHash("0x0873fc5b10acb469946007bdd5e36f45efc18bd00188c8cf803fff2c0fa24cd1"): true, - common.HexToHash("0x705a7f6898c6da47f2193f7af296625c1122b8271eafe8e64cedc626665e4227"): true, - common.HexToHash("0x2005d7a31293e9573d648a0f393280b1e26b27be4aa84573395ba030464791b7"): true, - common.HexToHash("0xd999d10596d8611a8cc0003ab511d688960d4766d40671e53b43a4e901beeca6"): true, - common.HexToHash("0x4c304c9f6a5cd8420590fd645d95f0967d88ef4d2ed82b63e2692c0127607bf4"): true, - common.HexToHash("0xcdee659d3f349847532d5f52c4b537d3c537b52b25cbed1e3a69ef60ce6d90e4"): true, - common.HexToHash("0x7681062cee1d5f13dc0b99ccfd2a5119adcc3e3874168d3a82d385b245ed3914"): true, - common.HexToHash("0x9f4d08d0fd7af634d1b5c589323a527a4b5eecf2a23433e45b1382b3fadb9a10"): true, - common.HexToHash("0xb2cad1af9beada006ed45adc31bd2ea092d04e56d7c25ea88ff0d5ab89316dc8"): true, - common.HexToHash("0x650419f0779141f6ea1b773d28dbfb19ba3ffa736ba2e7b1303dc9e25fc74c75"): true, - common.HexToHash("0xb574a4d466128ee62cf28ff1b5f7f8a145fa0ff1d08ca87eaadef231a24f6565"): true, - common.HexToHash("0x7a5dbe34a949c694e239674e6608570d23efa206fa45f8aba34cb84291b748c8"): true, - common.HexToHash("0x1a10da30f0b7098a8eb895630e07f797c104e363a373a9875b557bf2838740fa"): true, - common.HexToHash("0xe705c9833b00bb8f7ad98e9105aa86afb9f8ef7d93d970c9dfe8afb0c2a45a11"): true, - common.HexToHash("0x2724c994bd01090396716f8649f5d95c7f9b658749b96fb565bc0aba86245900"): true, - common.HexToHash("0x13ce9626298bb7d9314422ed9abeb57982d64ed852a455e7636e046905e362eb"): true, - common.HexToHash("0x10414976b576fc707ae03ed4fe553b3bb50caa7c56bb494245ce764faa9bacc6"): true, - common.HexToHash("0x9d41d97e99ef0ca97a1ec78087695c3b2ea0c53ee69ab625c71ab9c5fd22229f"): true, - common.HexToHash("0x0ec4e8570166bd4bfe64ab297b1eb7a682fd1c376334ea38da59b33e3eb5f17d"): true, - common.HexToHash("0x64e97d4b45d5d578062a38de86309256371639286c54266d972f851cf14264b2"): true, - common.HexToHash("0x0aae96090af64ada99ebad0fef347f610cfeb0b3f6fb76f3d7cf2e214ffda5b7"): true, - common.HexToHash("0xe0dc8c8750c164b6d5e842e588e61653ad2c1b1f98fb413fca0485a731084698"): true, - common.HexToHash("0xa36f8e8f830a3529eecff2bbda68e8165aa4c3e4de05b8e2347fa17c83e29b3c"): true, - common.HexToHash("0x40bd5d9d6c1f47a2ca5f1c864507a214d545b9ea9cfdbcfa3654a1248f309414"): true, - common.HexToHash("0xbd7aeef9a6b24e8f37d888a22c3402c628a8d3a7dd2906f0511f7a4d57d66f9e"): true, - common.HexToHash("0x6b5a57c0faa65802c22ce209e7f30fc00054a4d97b5c3dd2f5c5c4b6021601f6"): true, - common.HexToHash("0x586a4197792311a4532df4ebaaa4bb26a3c4c71f9159b970d99e89bf8c8db9d9"): true, - common.HexToHash("0x75aa6980476d95a6558f1431789adf897a41bbe7aee5fdac5496d1a9fdf67a53"): true, - common.HexToHash("0x494284034e01c7e5602b9be797c23f01cfb4f1f7ac24c720362d9fec850cc94b"): true, - common.HexToHash("0x4adc2857bb8b0d58d677d4c063ba21d99d2997ea4a8e36b4057fc35b9b5bac0f"): true, - common.HexToHash("0x596a8832b1296f0cc5f7d8bb81afeaea9063c6e7a9aa10cb56ec17e50ad92c19"): true, - common.HexToHash("0x531b8f9f47a3de75c4564f30a58124af3fae62a0c88dd2b44c15e008484670de"): true, - common.HexToHash("0x851295ec3117734c0b3bb216906ed418c49b062333f1e8660e0b27ac21179cb9"): true, - common.HexToHash("0x9e018b94569a9790f930d98b2fd4a3ae254147d355864a56095719ad68721756"): true, - common.HexToHash("0x29d716947503259154cde46dcf1c5702c77283ec7ce918426d66e75c2df59f91"): true, - common.HexToHash("0x1bb6233b9971b5855a6c33b2f27830245a189e24265637bd5d4214f2086b907a"): true, - common.HexToHash("0x7a70f443a467dc3c3d5a4b33c2ef1a12e6983ea7e87cf0fee9e4d4159ac95e29"): true, - common.HexToHash("0x9b19a112ff6144ae6d6048f4add177a0442edb8aee58067f7c3a1feada9ba681"): true, - common.HexToHash("0xe48ae24f38f95cf36f09dcf3c81a3a9c8caa65767d28828a1e4804242099abf0"): true, - common.HexToHash("0xe60fa89734bcab3e72cf2a2a5d00d20a5e4b44655b698aff3b60079ee7e86ae9"): true, - common.HexToHash("0x563b83e1ef215f552f04d8f263ac26a2edc9dcc337c9cbfb89e0320dc0ddbd4c"): true, - common.HexToHash("0x3007e78b29d9f5c0450c7b65827590089a13bd0549b48f4e21200a4f74519913"): true, - common.HexToHash("0xd6b7bd95527ef36ac6b13fb3bd7eff3dd205a0dcb87d03e6bc36c432aec28184"): true, - common.HexToHash("0x9423b5aacdf830f369535eaea7522feaaf7296340c050a253b612d05a3960523"): true, - common.HexToHash("0x54ab13ecd373fdfbbc734768862eefc392b5aaa18f4310b5f5605db1ad9853df"): true, - common.HexToHash("0x344ff3b2e8c4c4e37b2e82286b572aea8dcab198d98a0bf024a90ca5fcc15d64"): true, - common.HexToHash("0xb685bc6743bf552252acc0f65720027da10f03a04b6ad3053efb0c03c3dd30aa"): true, - common.HexToHash("0xb675ab49f756ba22dc9cc82db66028886d70bf405b6494e0cba42f6d92f80ec5"): true, - common.HexToHash("0xa8965876b21fcaf2365a1f7cd00c97442ccc2ad7bda950742a6b92cc43f923ae"): true, - common.HexToHash("0xb0c0c6494fb7e22abd69ad1cc20f4e71a8eeef6861a683a8a1733419be606637"): true, - common.HexToHash("0x6126dc3bbebb653d1c4af23d83d218e98c862d7309c62521febf3e77ad5442f2"): true, - common.HexToHash("0x3eebd1ce58de79ed71c3eda42734082acf50c19c283234b0277610e5f744cd33"): true, - common.HexToHash("0x441d9c6726104b965ffa87f61cf5a474e9d037082c117fbf19ca3b494a8eb571"): true, - common.HexToHash("0xbd8d30ca7456fcb09adebc47a931ba3b73c7de931bbc810e1e881d5ece561422"): true, - common.HexToHash("0x0ddc57989e4268ea15e5572d92f68ff10c0450bd54ea77e069ca6d31bd4b79ce"): true, - common.HexToHash("0x28540d34a72a8d901e2e531c845ade4f9030b088bfdc7bad07f41c6bfa56f982"): true, - common.HexToHash("0xa0047fada1933dcd382d0f2b1687b836aa80ec533f4e10f96a11a174b8882956"): true, - common.HexToHash("0xe60eabe81b61f860d97cfd536b8dbbc66aa98e7e5c4c04f47f84e14821ef3299"): true, - common.HexToHash("0x7d0a7f1079f6b2dfa5a9cc5a3345704d183a7b755ddb670bd1d5bd881c500d89"): true, - common.HexToHash("0x6a35903be36a1fa83ca588ba4a5e60abf85f7456ba9c940b648ebdbd33bfbe64"): true, - common.HexToHash("0x0d57f4c4b2869e162a80f21e8aa8c38d13b7f96eb1bdff599f7954e452ee71fe"): true, - common.HexToHash("0x009d56111d3a68e3a6be1023908fdee997da78214a603dbfd158286ca333a141"): true, - common.HexToHash("0xe8cfeea6641ffba377561c53b8e6ba80339e4bd116fc7a75caed8fb0029c7f5b"): true, - common.HexToHash("0x0956955929ed5b849fd33ed354d481cd1c9432bfe810434a0f8d38f673540818"): true, - common.HexToHash("0x8fd592e3a5ba7a63eccaf914e778018c4fbcfe8e51351ba2acdf179a5007ba47"): true, - common.HexToHash("0x664e053d92c5ee7d44f6a0e51d89b9a340d8775535f68fe6f5e59a9eedfc48a3"): true, - common.HexToHash("0xbf0a564171852ebf698f257de75c34b20f84ad624115b2b08002ac24846286f7"): true, - common.HexToHash("0xa8d6b02439eaf736b038b29074987ef3dc62e7145793cf0d231e0901064b63f7"): true, - common.HexToHash("0xab67f4b806d7cbdc44f41faa0df778316387e512dee13da60028b128afe59885"): true, - common.HexToHash("0x7aeeec4e2455651a08d575586517d83a0dd6e992ccdb59de6876e1d508308792"): true, - common.HexToHash("0x287d5bb67dc6efca02de427e27b6ac581833d4f77362fc6abaf11172a9d7332a"): true, - common.HexToHash("0x7953828d7d4acd7fe2eaf183172a1b8bc30cc57a1a8291e275a8a59729f5188f"): true, - common.HexToHash("0x08e75e4304524b7c4136830090bf804673d55c7374e23f0560aa7d9bb97b3666"): true, - common.HexToHash("0x18588a0197fc8b4fb4dc62d7e5e4066bfd6cfdf8e8fa6ed9af8902f071994b86"): true, - common.HexToHash("0xf0cdded7c91ad6480637a526076356387359d43527b1f7579df80e36b206e271"): true, - common.HexToHash("0x83b5af7f5acb2528039b23dd24526c941f4a09fdfcd4cdd82288d86527d13b87"): true, - common.HexToHash("0x3ad800fe651afc0b4b9c14ff6ab86845194d0e3555ec9c345117fb940dd595c8"): true, - common.HexToHash("0xad5af55efbe776cf5efd6150dbb517f3e50025e8ea0106642190e1157bc57d2f"): true, - common.HexToHash("0x2a1c093db878eda506115b2cdade17c9931962a39d936d22ee0d367ce8d2ecee"): true, - common.HexToHash("0x4b01187657df5f7b94e928036705123dd7d070b40002e8fe068960b6026f3089"): true, - common.HexToHash("0xbe25a0c2a9b7e8404d0d8b3a972b10fc6840213ac71cfb5a42d87d03cad42478"): true, - common.HexToHash("0x6cd3ad1105e9d1cd6daee2d577a5a8774bfdd24a64e82d8072b2e6348a3f3127"): true, - common.HexToHash("0x06f6a9c1c11a169dedbfc8691348ceb6cefde9bdc557e704da9348e0be80fc1f"): true, - common.HexToHash("0x9399e1e98b77638ef352683f930ddbbb019b10c6f0c49766e43a27ee21c84f0b"): true, - common.HexToHash("0x579fc71005ff8f98dec74042a3ffaa6a466e91bd342cbd036cf8a64532d7268d"): true, - common.HexToHash("0xb81d560ad7cc4ba649452022542ea6c5f8c34a11210ef1849a3c609e3550ec19"): true, - common.HexToHash("0x21e1f6ca5d83cc7be69dd1289e3c7f6da6abccd97db9eb721c0b15f63e3840d4"): true, - common.HexToHash("0xb59ff7df0b55ffc27225c8b48b47cf4ee015d32e1b181dbd915d9a7c9d9374e0"): true, - common.HexToHash("0x6860dae97db5fa6d17aa3948fdfdd0f86ea792fbd8ed95927bebd0893a6f37be"): true, - common.HexToHash("0x8bf6ebccbf128f7899591f1fa57228c5e19f6a0776badf9fb0ca2977335e4852"): true, - common.HexToHash("0x22ecb853b66375952e57967b8e3381fb50b7b63f7e3354c7fc12039c84d0c263"): true, - common.HexToHash("0x2de07d7efcab9b7858a1574d9a2776b29a023dcd85d12e362e4ba8ba7cd5efaf"): true, - common.HexToHash("0xecefe8aa54635fda4b939bd28c78378417d64f8f8ef35912aef40bdbcfa74480"): true, - common.HexToHash("0xe623b49453a79604d26dee786e3635a0885cf538c1ff89b61fdcfd04bbe7be0c"): true, - common.HexToHash("0xb32cfbbc344535d70186145c7d8ff0f7d4e8f8b0ea71d47235a13d6488742692"): true, - common.HexToHash("0xf06c61d8e0c8189fa912b7a6809e92b89a09fdf788f120855c6bb9fda11d1af0"): true, - common.HexToHash("0xb1c42eba4d1649efc9446fcc5fcc3639265e67097afd42c8713442a8c6591150"): true, - common.HexToHash("0xe3da81e55487bbe61e1e7065b8644d95e1c83ad9e8f15fe3fa8a02747f46136c"): true, - common.HexToHash("0xa3c4608b4453a7ad28437cc2afd6380267808922024f93865f89c994ad473290"): true, - common.HexToHash("0x5e91e2c31f36ef4cc8188262c438cc840a3d148e138580888e9ec0683b237134"): true, - common.HexToHash("0x5d62baf89b7f831e8da4b03ffd0d3d57d8efe8b74a437b380c4785f1251d88e2"): true, - common.HexToHash("0x427c794a201a0e303e930d5d85e791982aefb070d8d4a08d181bd99fd6a8cead"): true, - common.HexToHash("0xb68f83e4c87c622f8f62cff5c13d8ca25344c5ad64f3cad80287e06f2738f2cb"): true, - common.HexToHash("0x1f38bc8bb8a3552214420f1078078f5a03088b19a0ce65f356a61abf38d5bb96"): true, - common.HexToHash("0xe36120f6e8e228e79ef5d5e55d807260022fc0ed7e9f390060d5cb0d22bbc5cd"): true, - common.HexToHash("0xed79ad5636ed7769718086f76504644b44a6a51afd4d0e9cac09e6ea10046558"): true, - common.HexToHash("0xc78acb6a408b10c1de8ebf25f8cfa5440a364dbcdb263794543f69f464155070"): true, - common.HexToHash("0x49cd5ecb74eec4dfc2c202c8eb7e7336e98d95e39a148f4e860babb731ae087d"): true, - common.HexToHash("0xdcc06dbb484c70afa647fb212d6e483ebc8ffb6d268ad6210fd106df50fca248"): true, - common.HexToHash("0x83e8b851d6b6cd7ad32b26ac6398669a3e8d3b8e4454eb9dfc8843d2df94649c"): true, - common.HexToHash("0x025c3c5fd7fe3e5e95b7a4c0b595b402f168f14fd95a74a9948ec04f5bd83594"): true, - common.HexToHash("0x7457f833be5648138f90611c2b8ba72b36d0a8430c278a16dacc59ffebb16fbe"): true, - common.HexToHash("0x4e44b22a6a9598b2daee04780bdcdb89f92e073c97b479c1978537cf6e89c7c4"): true, - common.HexToHash("0x631e8e7c8fd40f22ae46c2ac459c292ffd3241ae7b54f4188a086427bca3cdb0"): true, - common.HexToHash("0x77985e946c9747f06aae402156499ad6328e202e279ca6ccec5110c2c106208d"): true, - common.HexToHash("0xe7078cd046553da43f395cf4479b26f759e0dcda1108f5a9e6d321eb1f9b8ee8"): true, - common.HexToHash("0x6ba88e951dcb8d941d6c6f4a6fe026249841413dcb147ec9aebd661bcac0bc91"): true, - common.HexToHash("0x06f66df9026423dc4823e6f34b586ef42837ad3f7b3cb3fec0a0717717840765"): true, - common.HexToHash("0x99e42cce01e0b0cfc6452c1a82d58e2f0ad56f677e0d964fd7ed2467f3e4c162"): true, - common.HexToHash("0xac0dba631716e9f2b3d623711ea99cfbc2535c006f5020ef4892f16d00ca0a0d"): true, - common.HexToHash("0xd3b426f0e88508e6e40ffb7bf1143546bec37e1b3f2d35e4ba923a25e43dc393"): true, - common.HexToHash("0x0e1fb03723850628e012a963fe1e46d984f0f814ff5eb53e5390cc89696fe742"): true, - common.HexToHash("0xa328a1a258944b46685bf8e4d1709bdd15b57628502530ecf635317f042b7a26"): true, - common.HexToHash("0x74fa128c7e28db13c9ad5e3c674e1c9d88e8d2a18c99ed12b1989eea79d3a499"): true, - common.HexToHash("0x2b7cc6511861aec00ceb75c5f565e795b0ebbccfe8c276494f35f3d4b19ee291"): true, - common.HexToHash("0xf77dde529f6d0ac7ceaeed3d585407808d0ad0e9bbf72bbf83bc62edc57716d5"): true, - common.HexToHash("0x922e9bbba10140708a3385c0f8280e96ecb274decef59a914ff7a1766eae6f39"): true, - common.HexToHash("0x12a1824350ba6407666b67b2dbb7151c1f27c02532049b7a3c80230b03bec523"): true, - common.HexToHash("0x0e5a35a7489dcf10bc366e4727d36f8496488bd352cb0987714f870bc66d34c3"): true, - common.HexToHash("0x965a0c8fec1371747a2e0e8303fcb55fb99217c406427b84b94b701e614a0624"): true, - common.HexToHash("0x69d77ec50804d19cc178e266297c14cbc108b0b81256bd4d4abf199d806823fa"): true, - common.HexToHash("0x3af5722ce30fb7eb0635a84fab7abf21c7af565eefdf0da4982f95ee34fe5abc"): true, - common.HexToHash("0xbf774819faf227ecc68edd4c5568bb47826d2bcb465924ade51b451405030dd3"): true, - common.HexToHash("0xc034025db9b7c6f6188432d5d63f9afa018c65eceac42ce1da5cc6a198f65d96"): true, - common.HexToHash("0x874bbfe6e3ca25a55c143b5db447285132164288978e32b71883e02e755c60da"): true, - common.HexToHash("0xf655d3ed87af5ad64abe5078bd85cee55df78b5244aaadeb2fff13116479f9a9"): true, - common.HexToHash("0x14e6b15f782c74f08bb3b3e00d6e295472ef3d4e38a8612439f8dfccd8a9ac07"): true, - common.HexToHash("0xe622606cf4138476848d9eca0fbf00ca6c930babacf4954a10d5b15da684ff16"): true, - common.HexToHash("0xc511c4424d70839d7ad6d4a0c50f26b8c207e1ac4a23ed519ac77facd6a5b401"): true, - common.HexToHash("0xd27bcb50128957e8145b79279433a7f76d8fc531ff8f0101c816261d7b215ec4"): true, - common.HexToHash("0x16d3e87decb322af21670a654b0700e94e15c39bd2e3b55c2b8163e074acc75e"): true, - common.HexToHash("0x2237931bed5572262bf6dbd027d2e84cd63d19610c941d8571be4c3b86d7744e"): true, - common.HexToHash("0x35ccabc3068d40676d7464c1938ee9f2f2c2183ebc76547139aa9c515fe5ac96"): true, - common.HexToHash("0xcc821708f9830d61a4d2baac94c4ed030ee95e52ccbc774805c0133dc3addcf8"): true, - common.HexToHash("0xaf65398db3c9737b76099d4ad2281b0a145af7c445bab0ac4fbdf9bdbb874f40"): true, - common.HexToHash("0x544ad9e5b7b1687944a01ea843dc9b90d6c79926f468e19478f6f2ef65096a7f"): true, - common.HexToHash("0x62e2ef9e281edf9412811968bc4d8171f1e47f7e62a221b395d63385cc0b1ab0"): true, - common.HexToHash("0x4f672fdd65d5d96c3bc9c7e21b9f30437fd8413c64fa9875d648a53a9ba36755"): true, - common.HexToHash("0x26340d81e838be0f417e774cbcd24ba3bcbc538015e2ed31fed87eb20ba8ae08"): true, - common.HexToHash("0x07f85ded7edef6529123ea2f22ab27e555f0b86aa11d0ef941963a1d8866b5aa"): true, - common.HexToHash("0x8c46bef9be18e4f86ead92623deaa4597c98c7680ee83aec3b1e6dd0a2c313ab"): true, - common.HexToHash("0x58ab8cdef113745ef721a9263352475a6b0e641b1daac814bcfea992bdce7351"): true, - common.HexToHash("0x40d7eb534f02d3b4d0084d8c6e409114a2043a584a376a502f2c6b46e03f6b0d"): true, - common.HexToHash("0x7e4980bbdf20d696311d5066e1592ffa065dbad113cf8f27d664b92a5e0bdd0f"): true, - common.HexToHash("0x3b79ab359ccd98ae8ed05d924e312a59f6d15bf0e0a2c8eac0cf67d0e4ba2403"): true, - common.HexToHash("0xbffc16ccd35ccc29370b6c3bf5caccf28767d45df16d8b5f65d14fad7919a2da"): true, - common.HexToHash("0x81b76831ffce400598185715a5d76a55201f57c4ae2d43c766bd20ae579cfd7e"): true, - common.HexToHash("0x4e80264221ae63ff349851dbf274375df49261d1272589f339ff353142400a47"): true, - common.HexToHash("0x2f6a42e35d67531713c6a2ce336c5670985020003747aa60a090c54db642b751"): true, - common.HexToHash("0x113d34f88edc795cbd3d99b096848154ba468a3a6d1dd730b897cd74205522c5"): true, - common.HexToHash("0x5097412e1764f9520148ea90ccab01967d14a64ea387a3b378e60a1d25f5f00e"): true, - common.HexToHash("0xa51f65f03fef7990ce2bf068ea5135ae0b3699a654d4bf0e05a0e55280454237"): true, - common.HexToHash("0xba3f8f15f17aa1ae0d293d217e82aabab63cef64aa135545a534dc969ee2c3bc"): true, - common.HexToHash("0xca9ce34ca50a4bb8263889f514c09e33eff046bcfd1fb261585892b861f6c2c4"): true, - common.HexToHash("0xd303f778b4ad5d4af75f4dd7e7100647ed43ad7e85934c8b8253a0f82ea0f51b"): true, - common.HexToHash("0x63bc4980be36326b0549fb26eacafeb0bca462a0843169cf78605e3cea94c7df"): true, - common.HexToHash("0xc1f8112975cbee9a8684c6d142f8da35e475d2a027b2c5a1864b3eda664f1be7"): true, - common.HexToHash("0xcd92a1d8505fc28de325a9128ac61941d67a744bfe23233e24b0a911f5f6a2ec"): true, - common.HexToHash("0xcf4a6128b2ff03c732e5cdb60b98c07de7b13581eb3de63ce8f60ab8dddad1f8"): true, - common.HexToHash("0xa17c7f14000864003939452420d90e3b3d4eb5e2a1819b7eb6e010776ee61a96"): true, - common.HexToHash("0x15792f0a7cf9dbf96b4dab362a8477693485cc6e866cbef76e08150978d01d2c"): true, - common.HexToHash("0xe5bd58e68b0edc19d924addb8d0c940816560eaa512a2b43a2df7fbf838cea66"): true, - common.HexToHash("0x3bd236c5ed092b18905420619d74564f91f6323aa7a343cfdd98ec476194038e"): true, - common.HexToHash("0x63dbe5394631bb54648e363dcefc542e945bd5e508778c30aa5f79cfa9498f5d"): true, - common.HexToHash("0x907ed45a93b4c50ba268cc8d19237b35caece7558b46831b0e85e901c92cecd0"): true, - common.HexToHash("0x4248314f8d58c3ea088ad6d5693a888a87637a66e43cd57eeb03ac4140182cf6"): true, - common.HexToHash("0xde19bed8f0bcfc40500dbc722cfb9dad231e5a7f80d1546534f452f1e9837541"): true, - common.HexToHash("0x8dd397c2a5b9ff45151438cdaca2d56418a9ebadd82f9e639fa6e48c6e104cee"): true, - common.HexToHash("0x7b5dda7dd375a1eb1618e828e199e2043ee80c7ca5a753f2ef092f03b755a5c1"): true, - common.HexToHash("0xcde8317794a16d5b4844c8c3c4383075f000f58cf328ef83c125d3336a450d69"): true, - common.HexToHash("0xd4fe0f28e50b2b4c5cdcfb84dc653edc9568408c37172614afd07619fe6deb4e"): true, - common.HexToHash("0x3a75890c9fe4da303a8defbfe541809ac86d2e79b35d6aec4e25d3359713b41c"): true, - common.HexToHash("0xdbc3e803be08a643e262acebbc9b24e6f9e566b4666cbd87b43c9cb6743488ef"): true, - common.HexToHash("0xe1f9ba117d1d843e0333e74210922d928ad0d4c89fb5ab83688b9acd5f51159e"): true, - common.HexToHash("0xeb975e544be097bb475b461587150fdaf99c2542b29b0bae01115541b13a2646"): true, - common.HexToHash("0x062066a2781566fb5c762ccf36f60e7c27fb4f39e5828783422b7dc92ec7e62c"): true, - common.HexToHash("0xaf6a2eec6bc3bf97cc08274ba4f30f6b4a014fe1ec073cda0e139cafd396b126"): true, - common.HexToHash("0xa23d8a94f394b1ce5f5ac6b136094d02def56086bd29ccf4951541e2642dd2e1"): true, - common.HexToHash("0xc721af984b77579516f1daef48957000cb90fff68b9cfb2ae45d4f674078ce97"): true, - common.HexToHash("0x5c6b5204d215d4f910a0b30b5d38c5a89b5f2a7b185ef4967a0cd21d14e4b11a"): true, - common.HexToHash("0xa32fafb1091b94bf4870fdbde762062cf55fbfc9ed449066548f8a2599f6e492"): true, - common.HexToHash("0x8870b7789afe95a771208da89a43d0d2566722fc6547b8aaa7ae8ef867994620"): true, - common.HexToHash("0x91b80a62c60944145fa233fa4612748a35ad3628a5d39746b51ae6ba507cb54a"): true, - common.HexToHash("0x30fa0b8e9c6c996942ec3f38c7f1c31e47240bb1f6fb83e80d8ddd49ecbc6ce9"): true, - common.HexToHash("0x1a349e8c1b06f5f48150da9e21de5a82cc60e7cb6a1737625ce2a7326813ca87"): true, - common.HexToHash("0x36099e4838c387be7a4bb53d47019b38eb5598638091b650cfb1e1d2e8d0ae63"): true, - common.HexToHash("0xa148f4cb0fad79b82651d7f56909d4c3625ee955a22ce3c2c3047c568b7bd678"): true, - common.HexToHash("0xfca063233059aae74d1f5d7970e588f2d56bd211fe21a4e3b6abe1f97819abcf"): true, - common.HexToHash("0x1081b2d7a76cf033129f50d45abc94d0f5bf235984ec9351f733f3424262892a"): true, - common.HexToHash("0x9f1b7ac30b4a4468c6c7a248d44f84cd64da012218d64d7e51c3c3b317893765"): true, - common.HexToHash("0xe1e086556c866f93e0b073c589a7b1d39e46c7c4d5163e5e39dbece5d868f4da"): true, - common.HexToHash("0x0e8c2222df3d60aa20140a6a04ea4111c408af994e2a6132de6f8f57f77e99f4"): true, - common.HexToHash("0x366fb4a6a02dd642a7f55900fd477e7a0c75818c5f599133d544abbd8bac301c"): true, - common.HexToHash("0x9fdf436aa283ff970cdf8ef1755acbda3cc5104700457b2a426d02dc44a76534"): true, - common.HexToHash("0xccd3d879e7767b2b5c35d134747beb0655f16e97e460e5c853838d70f1493f1b"): true, - common.HexToHash("0xd32dcabff30e9b847fe1503b491ef6997198233efc488e4889300c87c5e70e35"): true, - common.HexToHash("0x113f88fcd616ef04c6d442bf4cd8afe6c4aa48abcad963d8b8c8c64252343904"): true, - common.HexToHash("0x17c01617a5420d3924f9e3a336a643dc8ac274cd749e2301fe1ca204b80f2ab8"): true, - common.HexToHash("0xc99ffb737f74c1784f7f701ee4b289eeecf5b65a0742db4a9d969b181771e446"): true, - common.HexToHash("0x0336714632727f8bfe908b4095b8cd120b224efaa644712a4249baf1d384c97c"): true, - common.HexToHash("0x4d60a0fc28fbb3ebc77be56a338f7e205065a3aa46021e7a2c8e3086a8a550a9"): true, - common.HexToHash("0x808ca8473c2de785a207848ad747f4c03d750157a4a7755871903f7fbdd453fb"): true, - common.HexToHash("0x37cd9eb12fe1060520f270ff02231a017b2cd7fe81eec718c21ae08677c8906b"): true, - common.HexToHash("0x7fd872fec255d247137024ab026a2fd652611fc3677258fd7f292b6f228846db"): true, - common.HexToHash("0x7ee7a7b39aa50dc8e1fa5ad8e0a57c0a856e81fb86f11d621b1ec80ff9b6c954"): true, - common.HexToHash("0xef20403328518bfafa317398a0de02bb75b92a491afb44a1aaacf4617e4ac371"): true, - common.HexToHash("0x9d7d71b1c220beba23fd4db589aedea133fa3f2c363a90aeeae689a5150b9720"): true, - common.HexToHash("0x38e14ad2a755e8aebccec14dbfb53a9c79bd1c1aa42db1c08ac4670b558d993e"): true, - common.HexToHash("0x338a5bfb8d0ca33373ad90a13b081330c4b9fb5117c160bc14977dac612610ca"): true, - common.HexToHash("0x80468b46c0f2d3af4f416009f0413284f60a477a0a4889da72d599a1ab42c378"): true, - common.HexToHash("0x6779d1b99ebd3a5d1a7adce9fe1efc7424dfaabb5a0c9ce5f55c29c1cc0d1d91"): true, - common.HexToHash("0xa795e49408d01a6dc54a09e7607e3a4618a0a96a9692dd4cb47225ee9b98451b"): true, - common.HexToHash("0xdb2fbbf03d0d3c1d7072c86d80efa3ef75e0b29f540a08e3facf2027ef0aa6e5"): true, - common.HexToHash("0x20c615a565d47992e4b57d2ce379f5ff11bee7b0d92c4890d7bccfe35e4018e4"): true, - common.HexToHash("0xada4e01f6dc252205484bd1050f16ecef45c54d046185315df8b3af1b3bc953b"): true, - common.HexToHash("0x6cea27ebdd9fb82140cdca5cdb9f0c4da1cfe51452986a0334a940b19a773fa0"): true, - common.HexToHash("0xcd822075bd52fbf2de236db94b1ea06d31046119b4b74ce5e8f0444c4f586b0a"): true, - common.HexToHash("0xa23e34ef4cce0633ba890f2c5ebed609fbc6c029f88890869670528e79fd69a2"): true, - common.HexToHash("0x71b04ac8db2410c337c1f04b33f6dc55c0db3aa2600134a047ab8ab4c1da05a4"): true, - common.HexToHash("0x374f5447d76e2dd9ed4063d84da9aa5311dfd97fa3e970483f0b98f04ef1494d"): true, - common.HexToHash("0xbad260dd15f17afc29809891057601b375bba605cb2a115449101179f31df0a8"): true, - common.HexToHash("0x5245ca655de784893ed3974e53654a55834d2363393092ad57aee3412d787ab6"): true, - common.HexToHash("0x1de474944901fdd110931747e43f2c0d33967ea1f5cb7e4f53707db1cedf50a9"): true, - common.HexToHash("0x7c531563695c1dc7592310819def633ebfdd393429ba1aa3e27b91e519d27c42"): true, - common.HexToHash("0xeb0b14233661bbb3ae8d2c06b322b7635234f83d947cff486d3d298beca3e955"): true, - common.HexToHash("0x673aec2fa3ba29d46fba44386ff80dc292b8a561a6c5f10d61f82ebbf261a17f"): true, - common.HexToHash("0x8b4edeb853425a01e9228bdd78c7e558a5ab4594258cee3a8b39142071f1eeb5"): true, - common.HexToHash("0x2a35f254f32a44a563dd29910210466b2c76d458a713c0046dcec702b327b887"): true, - common.HexToHash("0x94fa61f2b03181234b01f2bc69ed1e07d5013f3dd2964c742329aac9b8060c59"): true, - common.HexToHash("0x3c579472fa31477c54a5904072fa44bc003f0c8cdb289805494b340bcbee3f29"): true, - common.HexToHash("0xd35c346beb155765f09e56cff919e57c574fe918307dd81903ee844cc6b6aa3f"): true, - common.HexToHash("0x9bfa128850d21fc162008c2c1df31e1900caf9017350e6acba973a76c2452a26"): true, - common.HexToHash("0xcef611fb31a52965f821cc7778781461016bf1c4602c18421f964bf65120f3fd"): true, - common.HexToHash("0x2b8ff5160a7758d76d1ea1bd2abc8399266820e61a843750e45dd54639b4736f"): true, - common.HexToHash("0x075978ba2a8f41709ac803d2715799550ed7340212afb480846d4d239610e895"): true, - common.HexToHash("0x989186eec6ce15454a4d38623edcecd90680b8ee55992cf3cd1e1ee92d404de5"): true, - common.HexToHash("0x01b7b93d279c2e90871717f604bce032ed6371f70a25319fa5597e8900a6a15a"): true, - common.HexToHash("0x6c59e2494644b39ff2977116349d8eeba672076b0de0315991d5bca27fb2f762"): true, - common.HexToHash("0xed43f213c46b825693733b36cc924cd9c21d048e26855a7114803ede3c8f7f11"): true, - common.HexToHash("0x568618ba480d37cf8cfcd6a0290a67cef4c6b4b1d605178de22fda36ce67406f"): true, - common.HexToHash("0x3c10918e160f95ac2ca442a3809dc2ed82f5205517db3a08240bc520932504cf"): true, - common.HexToHash("0xa83965251569b7d6083be5d20198f7ca8dbae857f277a774dc65d666fd5c66c1"): true, - common.HexToHash("0xd272e8d1ee400cf020dd8e5271c72ba10f0fa40d62687315df4114bfa7682d75"): true, - common.HexToHash("0xc36b2afe391f962a9d0b7085e7695480d95cf797f0cd441c1e39b5c508b88604"): true, - common.HexToHash("0xe7e1889f19c23bbe253b424a437004e8d7c4651100154fc8f3d50121dcd82ce0"): true, - common.HexToHash("0x8d982edb99dbe3605073e69a492941ff44fa5d3c763eba61c20817e6dce1072f"): true, - common.HexToHash("0xe2af84411c6bef607d2a60c49795f7ed1509bd96709b9fb208c52575702044fb"): true, - common.HexToHash("0x00e70a319ac973ffb443da94e9285f0d7d0fd970f383938c270fe0b97779bb75"): true, - common.HexToHash("0x138c0f228a1893a3a57faf5d9900b6b0a8d40d17e3598833b34502499fc8086d"): true, - common.HexToHash("0x90de5aa1e07b1cb238a381d82f4bdfd6f82d662177f63ae03177a017a217c12c"): true, - common.HexToHash("0x03092d446e1923b004855c529dbd64767f185733ecafdb814ff06d39fef7f3ea"): true, - common.HexToHash("0xb75407203ce65d19b5815e0fc0f1f003f6b1f09b1968a718d96b1945b8187f46"): true, - common.HexToHash("0x69c132c4c94c97ed0cef5b19403ca495315903cb61b529bd8309212634bb60f2"): true, - common.HexToHash("0xee3f598a88b4d1558c75998b9a235e06d0a9149a144d66c92bee3ddcecad6e37"): true, - common.HexToHash("0x98530ce36f269e0677b05bf1793eaf04d0a555cf639a325a8b946c387fcaf6aa"): true, - common.HexToHash("0xab9c179f66b42d3630a42b6526a34dfac03266d2f5962b2a4518a81ee7b6d5be"): true, - common.HexToHash("0x8f123395ed5a796052b05dfd5eb0758e9f62c2673bfedaf1de680bad06ad3f01"): true, - common.HexToHash("0x062c1173c09ee485e8449520ed87b68f13de35c4b1261f724b8eb754c6bad4fa"): true, - common.HexToHash("0x6882c8c7115e7db0dc89e6b725dc932f06660f4cd2480adc8c8e414ea135005e"): true, - common.HexToHash("0xd4180d2de0075cfe55a51e7cc7938b80eb469c4d897ebdee32e06b9a37f38213"): true, - common.HexToHash("0xdce79d0de94e50fd598f75a62e34c72c36b46ee2fc7d23fe2fc814f5537e4c61"): true, - common.HexToHash("0x90175bc8b40a7dfb62fd7ec84cdb899efce3c7df7ab68c5db1414b2a7e514272"): true, - common.HexToHash("0x88dc12ab489a070f0cd20bad5f627fc07e3e1096b32a287d5439ed4460f7d6ed"): true, - common.HexToHash("0x6af9d44bf5b84ac80b13fd54d4c2ecbbb31a900cac25696cb7c185cda5100b86"): true, - common.HexToHash("0xcb16c0b0f3b01a7f75e35a76ea6a981fe94d08f3ac4686ccbdc9de5916bfd085"): true, - common.HexToHash("0x08dff0deaa594dec518cfca8540d8000473429493c405aaaa790bc772f29fd43"): true, - common.HexToHash("0x106f949742d0f1b6bb7b8763853f2931f704cbae3df35faaba42c8ef4eb770a9"): true, - common.HexToHash("0x85e7d209d844158eb3464b177cd1a362f650165eaa6afb826d0467fbb436b7c1"): true, - common.HexToHash("0x99323177e778eb65f0620f6e62b9d560d6ccd7ebf6536baf03783f47c1fc063f"): true, - common.HexToHash("0x72c6648baf9ac7aa8f8d2523bd16f8dab2df5fd6080be9c91ba2f83ff1401959"): true, - common.HexToHash("0x923388232cf032ebf91cc9880a892164f2497c971a1448490c39dd686dc7faec"): true, - common.HexToHash("0xdfd7461ed9b0f88c496807b5ab9b01991426f5d76aefa0c3a055d59541b2afa1"): true, - common.HexToHash("0xc3e4562e0d423b93f24cc364ee00bcbc69e08e447a32da710d29958418817a34"): true, - common.HexToHash("0x375602010b61a449e9032e3768b35d45fb157399fed2d7b18115445bd553c9c1"): true, - common.HexToHash("0xb21696ef24a7fda4352a1c7a0e4d7990a1aac36d37486b1a9947f42ca056180a"): true, - common.HexToHash("0x98129d765bd335b640056884f35264578ce2c17389c8b5597ccd2a6ca33cb4bc"): true, - common.HexToHash("0x67b9cb1feb33319a08799b3e53d6a2a61548687bc310841763283046131b69d3"): true, - common.HexToHash("0x25352339598ac1a71ad7bda76267d508af9021d954add582320b69baace9fd38"): true, - common.HexToHash("0x57784f7d8dfac1330ab1875cbf33f9fe3a873088f18dfcda5168e7cd95d0509d"): true, - common.HexToHash("0xb8dc608b3736c0e7113ea472137bc866f5d29f773d04f0b14234b97ab4d5b046"): true, - common.HexToHash("0xb1dc75fb7c797b3a99b8cb1be61e4f5226dbe91172402868fe22017f1dac4011"): true, - common.HexToHash("0xc61e35eb8dae1e505c0a9d921445729a62c2ad748e3fd0a1cd437df06a1b9c33"): true, - common.HexToHash("0x2badb1cf58a6e65874de5a87aec0338255a806a3a31b665ef985fb5429f5b55d"): true, - common.HexToHash("0x8d2163197beff8e7b6169f625ebd28faa6dd7758ad90c1950fd1e942c68ebf36"): true, - common.HexToHash("0xc34e771a9482249afefdec3b8d45eaf15c3beb7803593be31bec7311ee0c7821"): true, - common.HexToHash("0xd0e35fe3caa16864ad7d77579278ad847783d4bffde39844ad2fa16535b71fbe"): true, - common.HexToHash("0x3f2202b5305f38d8d3b6acb4e95e2b1a70115299b1c569890630dd28a553d424"): true, - common.HexToHash("0x4f670cdef83c023a76600aa591b4c9ac8c830c4671a307670f20666df17243f6"): true, - common.HexToHash("0x989b42b4c4da98724a09c8189002f4628c7da49d3a485bebae0e100f5de46d66"): true, - common.HexToHash("0xd4e9bd0ad6b23b39797680fe0cd67357c409b7da29d799c211110c7a79a15909"): true, - common.HexToHash("0xa6a3ddcc10b09b09b789ad07125f9ec52272d9baa51535d41add241d08f78c8e"): true, - common.HexToHash("0xbf7db62ca729ac56bfbc931a1627b924b741dd91e583700a050346c4dd3048fe"): true, - common.HexToHash("0x4267a8c16956a61e368bdbf3cd5b624882227b537dd767a66501c733e5842c77"): true, - common.HexToHash("0x78e5469866e21c441349c2975be4b02650e8afa84439592367b4af0f11a7a1fa"): true, - common.HexToHash("0xcdadb528829ec1966ca9878932092cd267dc9c1f5285520758cfa4008b4d9608"): true, - common.HexToHash("0x459df1f31d6e2881e3221ca545533f022fbfbab31345e97f1e9ff0a09a299fc5"): true, - common.HexToHash("0xf5fbac5588507e8514fd6bc5cc4f8e6e95cac11779ebb35a2955e553e393e55f"): true, - common.HexToHash("0xbb257332389e9585d498feaa55dba222e8f97e9b6569708cc4487c25e29f6bcd"): true, - common.HexToHash("0xf75e0c1b6b535fdd903b4ee50220ad54ed090827ab3ec4476831ba3daa487dba"): true, - common.HexToHash("0xb95ec2452d8c4422f9486a6426e6580676bfc1d027d78fe6eed029ffcb5c26b3"): true, - common.HexToHash("0x6f3f1f80e982a2a229d2463b0d5ea5d3949874f1a9b2add6db6cb0116448da97"): true, - common.HexToHash("0x94678def27619c6ce4362558df6c9a41283db1361620135003476adf6c6fdd77"): true, - common.HexToHash("0x221ede47b76a059fcb6e288e7237940b423941b4e984b5cfd58c36e119f3bc4e"): true, - common.HexToHash("0xb63530b9605747d789cc81b8dd866d4cd23873e6b4694f4782c0e74301a83f71"): true, - common.HexToHash("0x1ba283130ee401226e8a2cdedf9f2a5552465a784c76bfc8faaf22856fe051f8"): true, - common.HexToHash("0xdbe9f030cf69715c7292e3fde99019c32ad9007f9638d56f87c545fb32864e74"): true, - common.HexToHash("0xbfb743040870f487ce68211cfca91f5c4c8ffd11d41d3827f5d00797bdf6e15c"): true, - common.HexToHash("0x0aabfce7a4b116da43e79b2bc4e683bce855f4030924a9aa3fb8d09bd53b3944"): true, - common.HexToHash("0x7bbb5eaeb623174b52204c386441ddc86ff87c622d8bb66190df8e791754ff36"): true, - common.HexToHash("0x7d7fcad66938329d961892351482bcba29202a49f75093c61b33b21262cffc86"): true, - common.HexToHash("0x85c0580fc585c02e7c4399801dabe1ee7d5a52d1e629cb4c0b2bbdecb3e50d5b"): true, - common.HexToHash("0xe610aa8d62fe0b116673dfc165e3f6f693b14126661e2b6315e5ff009c26fb92"): true, - common.HexToHash("0x5c35b3508cd1dc50ebcb213e0e259713d945358449200a227673600b18e919cf"): true, - common.HexToHash("0x1f6f2f632de416b346a2b3ec16f583f35ec67805a85b9f2f4db6f0d1a42b2995"): true, - common.HexToHash("0xa58503775de01626934b51eaf74765088a7884471a3a1aab93d26298efed6dcd"): true, - common.HexToHash("0xf877eabdf74c63f21d1f5b1f0dcc17ae2d8493b1ba996e7b3cbbdaac6f7ec65b"): true, - common.HexToHash("0xca169bf75843f4f482e5440cd0be2f6fcfff7be440f9f379d2aeac951edc4fd0"): true, - common.HexToHash("0x05d0f6902b307d8f0c79fbf98f4591685ba7939f32960cebaadfe8a2499a4581"): true, - common.HexToHash("0xf09fe18d5b5c9a9854e55d536c99eef55e93db9df180424c49fc50c7842c78a2"): true, - common.HexToHash("0x2a3c1f8f836cd3944654b20b2c30ca8934f3e0ff224f57200128660e03d8dfb0"): true, - common.HexToHash("0xeceeb78cbf777312e2f832b065602cd813ed984553271c87f6d8fc98bba23f8b"): true, - common.HexToHash("0x1ccb766b477729bf59235bf000a95aa8cc99fec6a53473dea8cfb0a717b31b7b"): true, - common.HexToHash("0xebed20880411ad070e920556a232fa374145e389aab3ac4cd768821e1611dd4a"): true, - common.HexToHash("0x868e5f76d7652319444531749f83db75c3afe6a525ccf854a110afbe9438208a"): true, - common.HexToHash("0x365f30d5cfeab548cf167fdc3c74f46f184c1697bdb6d41689a0a1c75a9d966d"): true, - common.HexToHash("0xbdaedf02decbeef77a9e9d81820bcf3d46c8add635002f752f668c0be45b03c8"): true, - common.HexToHash("0x27bd9f7e76717a5505c3f45befd3746d595fa20e0d797874497435fd2b41f2fb"): true, - common.HexToHash("0xdda07d673b5727e46affbf23e3bf7c4418c66c6d8a63e3e6cb0c30763c8bac5b"): true, - common.HexToHash("0x1ea4ed72896c75185aee0c767ef917233c6e297a60955abd7e1744e179b0486f"): true, - common.HexToHash("0x10c0c1f877514072092b5cb8f90770113e5b0e74750bfc79024a4ba244cd20da"): true, - common.HexToHash("0xed80cf2f24615042c295b05768f7e5f2532fb14be54dad0ea5ee0499bbfa798b"): true, - common.HexToHash("0x193f4cbba182055a262bdcfd607db1539ffdbbd69ed907e5db13a4f5883cfbcb"): true, - common.HexToHash("0xea9dc01f5d8e0fdba5344e85bdc9913b0099751b7ba2f3b8c9eaa25175345ccf"): true, - common.HexToHash("0x6a8db659921dad617066e67d668523e29e1a8308b65744e7ff70d4b7555adb6c"): true, - common.HexToHash("0xd0becc49b7cab73775996c328294e95024b9c587783b53fa42e91a5f6fd87984"): true, - common.HexToHash("0x9bf10206f289f02d81bd3fdc228e3548dedb0e656e45f32ff273b7dc5a5c6270"): true, - common.HexToHash("0xb6b5254dc96f610769b305f1a1ba8180c189d787ef0de2d90241c35904136858"): true, - common.HexToHash("0xc6a544f1bf1d81af35c3d4f3fefb7470984dcaef2e8c857257066b3cc6598b9b"): true, - common.HexToHash("0xfa86f71df3235724973fbc9129d415a83749d6b32f8721afc531407e1eea84fb"): true, - common.HexToHash("0xe98da4bf8c45672e1050733e5074ff0256cdfd5ae883af309ebbc221ac85eb96"): true, - common.HexToHash("0x4e8d1b4bcf3134ee7f088b51a679582da9e18afa4a6bc8c4d59a6a45709a2c6d"): true, - common.HexToHash("0xbc8c80d8a845a5a7c119783359737274989cfe1aab90c5dbd06de8cda50fe021"): true, - common.HexToHash("0x42174add1493577c1bedcea7b941129d45eac3d7bdda758ffcfea5db349c0e2e"): true, - common.HexToHash("0xf5de3650453f068ea57cafd4558866ee06ac5f7fbd19eff4aacff89782b17bd7"): true, - common.HexToHash("0xb5d7784e6749615d915cea8cbf370a5fef6648aa67af4381eddb65e42276675e"): true, - common.HexToHash("0x62750ee057dcfa440f1db7efe24ccf2b2072581a8bda9dec0eab9fc65486b1bc"): true, - common.HexToHash("0xe2ae590e6a18d63cd6e7cb265bcd66338881c1d7f8102a5467b352dbe09d8c48"): true, - common.HexToHash("0x4a54a905088d5260641937414195f5534fe5ba3ade2a272949521cf38b514b23"): true, - common.HexToHash("0x5e569053ebaae83a94d3ebb16b5167fc559ec1963cbb23ff446c72657cb3032a"): true, - common.HexToHash("0x9a1322c2b105d3843fbf287c02fb7dabb8f8975f058737f5a6edb7673eea5b6c"): true, - common.HexToHash("0xfc53d1c5ef66f938def4a97505177b4c8f0b4a1cbbdc39bc1d430420ec305707"): true, - common.HexToHash("0x891c103c399f3573054b84527c0917913b8562a00deeabde702b9f3f1359474e"): true, - common.HexToHash("0x83a4eb98d61a4937a60cf809b9471f83beacf20c7ea6b5a5e70dce4b28697bed"): true, - common.HexToHash("0xb0502dbe268f81c3bec066276b1a034cfc693a448ad172520f989b0d277e7d37"): true, - common.HexToHash("0x6f4363f81d18c3d4e5c75e3495a04ef318ee24edbf16d80597f79ea287082d06"): true, - common.HexToHash("0x43eed3370ff7358f43a5de0dc8e6060b97a514513978e2f4a82cee6a40283f78"): true, - common.HexToHash("0x21ed0cd2b0417942d1a7752c0e15e78da406f7956038105862d986d175f3f948"): true, - common.HexToHash("0x2a90b0029468dd978babc8eb27854903367af7a64dcef9a95bad49296a20040d"): true, - common.HexToHash("0x4faee88d9e37cdfba6f61e1f46b838519db2a13c2afd8653d5a98b6f43dd351b"): true, - common.HexToHash("0x8424c200b0fd25bc3b3406e764ce3cf0e298cc4f0e44fb949c1536a728991fb3"): true, - common.HexToHash("0x1a136c93bbba6da920d0590c5ae725fbbf298481eac647ebfd9a81edcab7d7a6"): true, - common.HexToHash("0xb4f2a23a3e0fea1b2a3f29f1328caaf4991c342f615e18800412f2b665659bde"): true, - common.HexToHash("0x30cdd7e73d3e6f145f4eada50fe05b41c0d9afb1da096b8d9f710d408a7929d6"): true, - common.HexToHash("0x9f4cb25aacdbedd3de2a236ccb05765d7ff99ba65338ac9017232783576a83a6"): true, - common.HexToHash("0x4ed004e342452bebe08d2c84406fa85402bfb9f4e98aa3f8c8f932ea74777708"): true, - common.HexToHash("0xe1e122c952e50478dc1dbd431801e7e2b2399bd6a2f8a4051b77cffe91960561"): true, - common.HexToHash("0x234b4c3fd67bf99dcea338f388386cedf8748759c19a7995c9942f6b70072514"): true, - common.HexToHash("0x504fd9f9ab0812930033a3294c07155b126d082e2ed23adcb2aee90cf3e6aeba"): true, - common.HexToHash("0xe4bf6bedf099ceee1f8197321a5358feffdc7a57c90d758cf57acb1e7774b53f"): true, - common.HexToHash("0x1d34e1b003e8795859829269abd4851e476662e89d1e100199c183cde7f6ad73"): true, - common.HexToHash("0x5cb63d1b9a23e7aaee181132827be7772f1f55512f9f01f51c515b517cca29ea"): true, - common.HexToHash("0x4704e71794d7b96c379f5b1de24643c4459bac0262b177c08afa1c9270dffe07"): true, - common.HexToHash("0x7cbbc01f0605380815eae5f57b27abbcfd8968bf666e9ca23bd0550db6905340"): true, - common.HexToHash("0x6d3bb91aa227cd2aba7987588443a182dcefc7eac643fa95f7f4ea0f6d2bac5b"): true, - common.HexToHash("0x20b5eb48125a45fe70f247294eec465a7d912f5c0d1e87a546bbe16236abca59"): true, - common.HexToHash("0xd275a784dd79dbf6dacf71a48f1ee1794d9f6d9abec9abc6744bef33fb74ce9f"): true, - common.HexToHash("0x6ec519dfa34a500badc54b86e2015d60e89f7df0533d1e53c191ac6853584661"): true, - common.HexToHash("0x2a162d28a6f8d3cee44bee6d900280b5d679f08c9bc342f2dc775eef2f7e1bae"): true, - common.HexToHash("0x587ae57f57c13578a478050fba77f45de0ce4551814f0eff9539aacaf7c96e29"): true, - common.HexToHash("0x9a285aab859364d7dd7d708c34259fce8e5ccf35081d891a33895d822b95e02c"): true, - common.HexToHash("0x3cf10d5eef6cf5bb649aa0385f033d2dd95061e826f328abf1992a36923413da"): true, - common.HexToHash("0x8c6e3a80c5039f5d92597fd180ed3735493fdbf3fddca94472c87133d91be60d"): true, - common.HexToHash("0x9ccc01363bdbaf1f7c5d5ac1e70927e83dfca7d2736ebd420a7a8309bf563ee6"): true, - common.HexToHash("0x97886879de60d208c3e6f7a7eeef44ee3710f1cfa453c92fa8487a7f7c0d5b95"): true, - common.HexToHash("0x51a846ee978b222662d7846026f9671433ac84a30e3ce8035e16e002c9429ebb"): true, - common.HexToHash("0x9aec9ba0e14775b3d569aeb5283fc38f6fb181e5f5eb1537333dd258b373b854"): true, - common.HexToHash("0x5ac4021b077fbcb7998fdd445e23d7d81e7693b328dad89ed050d166fa931f76"): true, - common.HexToHash("0xba14a7db6a0bcc9eb9a5a0c917a406110f16a0c8ddfbe2c3958f14d6d77f9edd"): true, - common.HexToHash("0xbf760305b523897733d0dd74cfaf785d54c43a1b4496b1ff76de60283c764c30"): true, - common.HexToHash("0x74b430af08e8ffe6bbf14080ce399c038b0ba6c2a5473597f6ebc5c545d68723"): true, - common.HexToHash("0x5f8f07b207996f8156e89b4f620d0faf42df909354a210d9b39f4eb4de970ff3"): true, - common.HexToHash("0x0c7aee9ee16e91a9c120d3492f7a2735de2c2d06c684a8a2b0f1d4415e48ed9d"): true, - common.HexToHash("0x8f944192b743dfdb1b0d40735ae0debf26fb05383558668bf3fad9a83fba52dd"): true, - common.HexToHash("0x95ae5e104de2c0e499c87ccd328fc441d4848e0cbb8729bf1a6eff2049aca968"): true, - common.HexToHash("0x0570950987d9ed8a8a8c092e72488774fd8e21fa2aa7a7912c4a39e825c73e8e"): true, - common.HexToHash("0x914cbd98f25f73f62e83bcdfe97fe4f22a024d49c00525a0662819c7a8f7a0b4"): true, - common.HexToHash("0x3050fa5b66fe18379e98b4f6a4d0c668b267e325ac7784125859140a8d1c73d8"): true, - common.HexToHash("0x8bf269edd06a13c03c25cdd16d02ea9b8494c38241b13e33e540ff6bbd96225d"): true, - common.HexToHash("0x8ceb85a3173bddb46b6807cc99a1c3ec9b9c0e08962b2be20aa5a04d53f703dc"): true, - common.HexToHash("0xde9305338feba8a8a041874d7422fe87677ce350e629351a5b37499cbcec5962"): true, - common.HexToHash("0x70f2a4dae864ffa7b8c5090b5c49f964e31e36a2900b89a982a484d42722c34a"): true, - common.HexToHash("0x81a4b3aaaf44879cf9e930db8e75c43be668051b6d66a0e684928941cfe88a26"): true, - common.HexToHash("0x73141835b94b2360edfa739a171f79e54fd6721b92d6d223194d8042a7457b09"): true, - common.HexToHash("0x5558148744956dd602a6eba1cc466eb759cfc6318e7503c4c64f1f62e8796889"): true, - common.HexToHash("0xaf9a3cf966393d6e91ec411ac6ca78b3335c6f6c505bcc5302d2688c93b8fd04"): true, - common.HexToHash("0x10dbac9c82e8b8ec5761c4c3569961bb351f8b8ab44425a251590323a8966269"): true, - common.HexToHash("0xd25d7400fee1570c0677ea329c582d02aa23eded1b1670804313a4dc252c7c60"): true, - common.HexToHash("0xb625d5a0b483d754370baa11a7f26b1a3c9bb319d52acfa7f13525bd30d1bb4f"): true, - common.HexToHash("0x7047c423e87bbd0ca3e13727e77e67e7a00605db00d8ffb10d113e78530733a1"): true, - common.HexToHash("0xdf93d82a9522d22d7815eac8d7696728c37ecf156db05595e36b62c5fa5679cb"): true, - common.HexToHash("0x7fbfc1bdaa3a1418c6ab41436fdae2cb905ac382de9fb83cd83e0f1584d51f37"): true, - common.HexToHash("0xeabbe8be7590f300174848ea66bd6918776536b6befdd83110010f394a62ce54"): true, - common.HexToHash("0x44bf29c4183057038d9513eaff51c6d533af3bb7239451cb0ec0be16c5b9de66"): true, - common.HexToHash("0xa2fedd66e398ad2238ef89b82e67a691de496592a86d4e9f7d35b9bf4c68ac4e"): true, - common.HexToHash("0xe197f4988d8953e3ea59be311f02f83d1eeb8a6d91c3eb59dc3aeeaf3a1f76ca"): true, - common.HexToHash("0xf134442431b38d2cd904804ed4ec8186488d775b47ebf28153ade23d8e96df06"): true, - common.HexToHash("0x8bf61b407e0ec573e3c2b0b321c40e10493b2a39333727edf7b7492942fcd104"): true, - common.HexToHash("0xc65c986a2397facd06e014cad2691c1e6c050f7645436b4cec180ccb932f8661"): true, - common.HexToHash("0x25cabe7254a7a23db244dbb31c053df88cf609379923bb9de23dbbd9337216e7"): true, - common.HexToHash("0x3ea42e5d8ebaaf9a315f36c691aae5a7b1d989d5b1e5155add3642aaf8e19859"): true, - common.HexToHash("0xc97090de6c788eaaf174ec9f54433e609090bfed030eb7da808e70a3afaf3e03"): true, - common.HexToHash("0x92334dd6aa4d5c409354391e3a5be5cb858ad10e02922733eb20f4bd19a46f12"): true, - common.HexToHash("0xda3b3fc1205eaa544bcd0df5d9b3cb48e92fc86b75b673b16ebf0afb1a508da0"): true, - common.HexToHash("0xde43adb13a337d7b12d15029594762b55bf9180f9c4d0573a352d9689f0e67a2"): true, - common.HexToHash("0x443f30616f0edfbc5d5192bc523a89ea81e10eff4ae00629a3c4b7489785aba0"): true, - common.HexToHash("0x23d61781abe9ff955fc7c8b353eb7688c84aea9cff0ed703ac2caea44995d488"): true, - common.HexToHash("0xa42611351c2126092bd68b45b6b8ea035df9842bba4d63caa9bab6a446248fad"): true, - common.HexToHash("0x38d2d095ce84fb83b30bfbb805a201f5073bccca9b195a8b16cb022f63db79a7"): true, - common.HexToHash("0xb011e5d3f7cd648a115d8eba61cf19bed48e0f1f2ed53f1221656e985009053f"): true, - common.HexToHash("0x3f991f335e92eec83124636ca0bcdf3ed34358a4a49dae3c31698b51c58fa11d"): true, - common.HexToHash("0x8ca74ab8cf2d7d0eac268bd6b9aca8ab5552caaefe7f981bd3427461f0d7aa97"): true, - common.HexToHash("0x72c7c382e1c02375f19ac80d20d46769edbf54a2230c64b8a822fdcae07fc745"): true, - common.HexToHash("0xc5e11e3a231b387402640bd8210108ed835f234bf72e2bd079efd45ae5762fcf"): true, - common.HexToHash("0x52854d212d8e7b1f948aa7082d38409519249a1cd389954bb9efc64f85402c14"): true, - common.HexToHash("0x5b9a0a76c77121fef2cd4ddca998da120951db30d4edb64d559556aaaecc978a"): true, - common.HexToHash("0x56b39810346606d59585ece5edfa5af64c51d689a1d665944d18eb8180582112"): true, - common.HexToHash("0x33fdd2476b5d79ab1e50bc184aec5e29cf55245161cf0c2d54be2b02381b85dd"): true, - common.HexToHash("0x1c7b6019dd4268cb2f6655a4c366f409e10726fc86d31a40aa08b5e6e5e63320"): true, - common.HexToHash("0x3013c3be640d9323728ac07224efe55b141d6eff7aa0676a0119047f498bfa8a"): true, - common.HexToHash("0x0fb40463164229148901d112cf31ef4f3d61284b7308740d0a8641e2aa3f4345"): true, - common.HexToHash("0x7dbe13662d807bc5fd10e0124521736a009d1089dbab3723b66da48eff02aa76"): true, - common.HexToHash("0x4be49eeeeef9013789762324741b35301815077f88eddcf4c032076b2ef6df4f"): true, - common.HexToHash("0xd9143b195f1c23f8a461818ac38c2b4c36c20f8d1efd5fc3b8d815a8e40338dd"): true, - common.HexToHash("0x62d3cd9648d6760320b411c0b2b61192c7c8b2c63386ee69b3f8347de4514caa"): true, - common.HexToHash("0x2c68ffe4c76e9d7aae9c31652224aefcbf387757319ccafaeb4a86123a527143"): true, - common.HexToHash("0xdd2706eb8bf54151b7fd51d823b0c4602c096506c9861e04e7f7d54f376d78a5"): true, - common.HexToHash("0x6e82cf13be3758d6b4283cbb5a2e8fdd306c5936982ed35520ada8704edab3a5"): true, - common.HexToHash("0x567e0ef200abdf9a9ca85ccf147621ead1acb320ed6fc32155f39b0f792e1c68"): true, - common.HexToHash("0x44de004819e3570418a335357352d7439c81563df22c4e3e3e47d2875fade931"): true, - common.HexToHash("0xc95850df938e21a7bf64e808d517fd6df3c908d77d36d14278d1208bcfdf1b10"): true, - common.HexToHash("0x959642f518dbdbc51ca2e3aaa7d56b055959289b9099e60f59922369447514b3"): true, - common.HexToHash("0x3b5d2ae8abcf4dc3a8123476746e154cf056a9720ee7a76582a5a3e9fc96d864"): true, - common.HexToHash("0x61d2310f7fb3d2a173ab15262e036c726db6cf9f08d271e54e75564836e1be74"): true, - common.HexToHash("0xf2af8573eb7000559395e5e2ee242233cfb5dd151a300aab848a76e1357c949f"): true, - common.HexToHash("0x8e5ab6706539a1387ed90c7c8dc8eb8d899945bec2e28a51c7ec2a2d5aee3f5f"): true, - common.HexToHash("0x9a5f23d522e28c630a56efba199f63c400d394fb7af4d2d55428c4bc8776fc8c"): true, - common.HexToHash("0x6fd73941d72819594b9787e58d59a2ddfb67bb31fddbb9c0af76f083fd3cb7b0"): true, - common.HexToHash("0xf236ccecdc5e401581ea1e6ad45e8e6a7adac59de0a9ad1e7085f7fe3d49ff5c"): true, - common.HexToHash("0xba59d55f5c290604fb847c2cd591cbdfa9e156faeffd53946143308a1c45d7b2"): true, - common.HexToHash("0x4bf1528c062e1a9e3311dd6f975606a2f55f8eb4b76d4d9b5de1145fb9e1fb58"): true, - common.HexToHash("0x57566a381ee8a3df4799980b4d8131371bcada38831dc116078d5cc59fbcc298"): true, - common.HexToHash("0x224e44bb2cc8a6889f3dfbc42eb71147521f9675502ef3a6883a5219b7a81457"): true, - common.HexToHash("0x620e24e173755d1c5e03e632af7c99faa75e18283336a03a92ed3ac89301b1be"): true, - common.HexToHash("0x039ef8f09eab3dcb8eea9604c629441e7c524f319e300956695ff92b37393df8"): true, - common.HexToHash("0x32dd7fdca1bf738ad16304ddb191365d2677b528a50890bf5d85c5d0312d7a4c"): true, - common.HexToHash("0xdc34f848eeb41149f522cdee91f63e4ca2fd300d9af1eec0cbd5f7d14d034f34"): true, - common.HexToHash("0xb54321023270ed309ff94812c5b4ca5ce10c0d77d58d1399ed22373a96644a0f"): true, - common.HexToHash("0x3334efccec1729964458aa1f275b46b6a95d683e180d31d8e4067174173c2efa"): true, - common.HexToHash("0xabe302cd86beb188071130242be7745a60d6ea1bc6cf031db8ba51d3da0945a0"): true, - common.HexToHash("0xefbaca27266dd829dee84b1ffb9925768907071f525ff445c07eb53a4c72ec7a"): true, - common.HexToHash("0x6f753ff134cb96a4f5758ca90476c240677139ca0c78d84bf19a2901137763ab"): true, - common.HexToHash("0xd0e1aed32ec8debb9219eb47c4972f44154ead12ab2fa7488873f8e4ef5b0cb6"): true, - common.HexToHash("0x111051da78d01a3906ac26b46736602faeba6ed2edf211316e2c85f9723cf07b"): true, - common.HexToHash("0xc749738d1e28007305e461770a159804fd931ab5da035942d0c18e5bd2466ec2"): true, - common.HexToHash("0xc3b8fb78c1d03ad21eab4f04b6be0f9a28e7771685dcdf41d6df0ee8d6c2a71f"): true, - common.HexToHash("0xa0e6339c8dee5bfd68be368fa2be06425bcd3a34f98d720044601711d208989e"): true, - common.HexToHash("0x60e3ee14237cc265e4354c5a6df42d6b8617d81560e502b5ed41898cfeeddf43"): true, - common.HexToHash("0xff9b554983085272cf71fce8fb58fb71eaa1856df704a4903911e11d3aca6ab7"): true, - common.HexToHash("0xfda5db544abceb602ba3e7e4e607cc9f95feb5d03f357adcfb59e4c208c64119"): true, - common.HexToHash("0x9d80aebdd0fd19d6c8292b8141f16c2714bd65aa16decb7acd1d87d530b341ae"): true, - common.HexToHash("0xfcbad15b52cd62007e702cf658f37d8375e6f4fdcfefd4c07fe3af5c617ad142"): true, - common.HexToHash("0xb9562b6a5e23c5ac147cbbf3fc623eeb863b780f4eace900a836871c3d8e5da7"): true, - common.HexToHash("0x80917f38c978c95f9b3b6b9029e86a9e788fc6615312969b7eb4bb0a7255b355"): true, - common.HexToHash("0x3d14606ac505b07534d9292e9239c3b3ddfe8f4236b95d8221a2c8ce7a483fe4"): true, - common.HexToHash("0x7e92b22f320edde005451e1ba8afb8fb34ad50487f6acd3eb851d11a8afaf811"): true, - common.HexToHash("0x187352e8d550c7a827155326923d3cfebc1085db704756415fa1a712cffc25eb"): true, - common.HexToHash("0xc9e553449cb9bea0fa62e3df9b68b37fb9e606ebe1e083e8afb3e0e2232d1b23"): true, - common.HexToHash("0x469ffc266ef6ef9ccaa971700a552abe0d82e6a2c12334da1bd6d932b8dea357"): true, - common.HexToHash("0x67ed0f4f5829b4a19fa7c3ff43eac5e2fc5bfc28306c3df852c2ef0cf47c3dcc"): true, - common.HexToHash("0x404efae210d0db82caeaeeffcaaa0a1572790045335acc944b07b6acf256b04f"): true, - common.HexToHash("0xb1a19665bc852a5b0f4b447e9dde0938b0358162b44a5362a49d80f4a57e82c2"): true, - common.HexToHash("0xd19a289c5a9375f7ade975ae4ae5f3c1dfe8d641f7750c180e4c83f388565297"): true, - common.HexToHash("0x96288e3fc3b649aa026d2dc1f8f16c9ac315123cb72b0f6244bb3291730db98f"): true, - common.HexToHash("0xa003f686bb37610443bb7d7c11bbc092e76b23b01c4d2f95b546d2a15d242db6"): true, - common.HexToHash("0x788518ac4c44902f88694526607aff4a35345d027f1bd11acbb90350b7b327b5"): true, - common.HexToHash("0xd80823e0c4a7708476611d9910abd1d8cc8e8282f4834affb05fc1ccb174cde1"): true, - common.HexToHash("0x4657eb7e113baf05f82dd80c0638f0ee3fe06ddc19971cc771ed5ea7dada4120"): true, - common.HexToHash("0x33692e574dcaea8f965d80e940a1373c8381249659981ee8420d6558e98523e5"): true, - common.HexToHash("0x884521c943b7c6c09fd5b32741dc6dc9ea09d377a0a8f3553569d75608aabd1a"): true, - common.HexToHash("0xfe277e5ce5a5559b4da872176a2cd16f960645bb01a224e2cd6defc66fa3a2bd"): true, - common.HexToHash("0xb7d306d209417b32cdc10a83bc7df980c2df2b2069e6688fce2c2f0ba26ab302"): true, - common.HexToHash("0xfd33e24397dc5b7b9b17df0e640ed79891f2206af777028c6c3b446834747f56"): true, - common.HexToHash("0x259b3a9626b7970f80354f9af71530a7bea946162d6b4a007d9c930016f5a030"): true, - common.HexToHash("0x6c8b4fc41c2c1c51d8f17fc366418cd1d802a9b8380a5f1dde8289bac177217e"): true, - common.HexToHash("0x2d6970dc6c95f4eb896a49cb9c51cb99d8bcc8c56823b49edf3d0ba22dc2951e"): true, - common.HexToHash("0x662f34508cb98a906176f99d5b055723f605599d66f64676f8c353cb76d13fca"): true, - common.HexToHash("0x9e73ed4625077150b03bf3aa56f4eef3afc6bd91224115c49767f31b4cd847a8"): true, - common.HexToHash("0x94ffbd207d325facb236f2228fed6842099cd50465f90b36dee641fd1338edfe"): true, - common.HexToHash("0xf7159c576a902462c6c473c7d90c6dfca25317fe50263f36c83590b2881d6613"): true, - common.HexToHash("0xc07f82b364d381b7e6617c71eddbf1d79a4a1c1637efd84ee793a2313db44277"): true, - common.HexToHash("0x932917fedf5995b9bc5744937ac5b2f78a1e8c18b23d8ac9e91a8d58939e3183"): true, - common.HexToHash("0x8501040ebb19829991bd1d4f48561e898f176b687e1abc5eaafac91359fb1b58"): true, - common.HexToHash("0x1cf9124208af5ac73d96305795b0033cf6ff3a7960a0228670842c6d77e2d86f"): true, - common.HexToHash("0xbcbbad0fc029299251c955808c174e403e7f2a3d01a93e2368c69b3ff38b9c64"): true, - common.HexToHash("0x9704a099832c26933cfcf7899663fdc4c08fec87446a5154a19838f57b0891cd"): true, - common.HexToHash("0x51a872560878d3dc999010b951863fff0bd1847705fade8145e4f6601981fd94"): true, - common.HexToHash("0xda12f7e1710e1c52e70ce8c4f2fe1c2a4bfba395cb907a7b5cbcfe3a9d485654"): true, - common.HexToHash("0x0d7860b357018697322b17c10d7a3ccd3fbb9357422706cd7bd1a917ead94ae0"): true, - common.HexToHash("0xf76763b7d250301cdffa3459e407098b57c20904213df96f59e38291231437d1"): true, - common.HexToHash("0x7f58393c6ee9cb9051c600289a81946e3d8674ba24612f583fde53ae33cb0f91"): true, - common.HexToHash("0x720494cac0754545e62a93d03be1a4aeb49e50e6f71ad4f329d452efe15563ed"): true, - common.HexToHash("0x52c51c70dd974ca6130ddf849b90507b826834598696f6691a65ef407e3b42e0"): true, - common.HexToHash("0xe71e3ed25abc1c8908a0d4dab877396c41f833a2f216fb9a2320eb7986bcb763"): true, - common.HexToHash("0xf42119ad092f05805ff955885d8918018c421d11ec17fc9c004edf9254eba6a1"): true, - common.HexToHash("0x49e2341ea0510a0101999725522202a784d2178cfc8fc41cce5a33641d8b3872"): true, - common.HexToHash("0xd183adb7218213d7dab5b59676ff28e899b621b1002a6a0cd0ab9907635c114f"): true, - common.HexToHash("0x67c08bf8fe8bb6121b361cba0690375913361bed6eff27e7f2680f7efb76ad87"): true, - common.HexToHash("0xbfd8af5a40251824b10e69955090bae54a547ff4808085f653ebc92d3d370366"): true, - common.HexToHash("0xc41c5d8627f1d449e9d4982c388d572666ac729862145721794b777365897f91"): true, - common.HexToHash("0x555a0f7065702ba8b34b7eac2b3a33e9a51565bd7d95da7be51e0a9a6a1577be"): true, - common.HexToHash("0x16c94f6cec128820a3f88db5fef68e74fa4d50bb2d67f23afbe9f8b9a2bb21e3"): true, - common.HexToHash("0x14eb62a5175f930ca5b9fb9b62d5dcb16475784453395a12c302a836e865a3e0"): true, - common.HexToHash("0x164943f5c33f991b84d94a7450943917143dd9b53c2ef624d02b13813ddd2a0a"): true, - common.HexToHash("0x83249539aad2c317cfc48b96d7c1159b2dd3b9cad75c25e6cc2e23adb8e3156d"): true, - common.HexToHash("0xf1f6d54e5a255da7bcf2f1f6f024838aaea89a8c6987d41d19ef33e80cf4357b"): true, - common.HexToHash("0x35335e7acd9af7290ec00d930cb3fe9a569a831d91ac471d1f6b5c8d88ee8406"): true, - common.HexToHash("0x5a0a22185d767950a881fe28e46ee414d0c8c482dbc459210a74af4b3037b5ee"): true, - common.HexToHash("0xa31000057ea9d1fa917312c2f68fb6803f662e93717ccac45c4442e3a87b3508"): true, - common.HexToHash("0xcd7958406501e488475728f6168da5d19c24378e7e5f65a0a59f1411a70b9fcd"): true, - common.HexToHash("0x9ddca6651ca94912c73b45de2cbc40ee5d1f3e2cece964eb4f26a8e39fc86b18"): true, - common.HexToHash("0x91309aaa6e7ec5692d4968686f15a3d286416cce2f444cbb8ef6c43556c7b7e3"): true, - common.HexToHash("0x2515f1b694184dbdea3ad14f10617cabb5345b4e48fc0c1ae9e5bf7a9fdaa519"): true, - common.HexToHash("0xbcb9000399c3250b88c7c2e50158274a85915b3f8adb4f98043a8083e22e4ec4"): true, - common.HexToHash("0xd7cae49867ea80f04687b6a38fe6f0698e65f24cc5307041769a1c678c2eb28d"): true, - common.HexToHash("0x106df31ae4e175bb41bf0615efbcde4cdffbca008c97c40378b1bd944e2c8e14"): true, - common.HexToHash("0xa995cc76bfa9d651b1c269de91cc98f51f6f3d48b49c94181c1f37f69b62ea11"): true, - common.HexToHash("0x4b5bdf24f1de69dfe1ab79dc78f7406ec19d79e94bdca0cabf7f2d2453034904"): true, - common.HexToHash("0x3f15c2fcaf2242a7dcb54a0cb4609afc6b1aa29db5512ae388c04ef342515786"): true, - common.HexToHash("0x09a7a0e00c1ee23529b0cb7739ae454426756e3151bc471d8179b8123eac52f6"): true, - common.HexToHash("0x321c04eb8aec5e3de6a0d1ccf41cb490badc21931d951c0366c0e11820eea81f"): true, - common.HexToHash("0xb34ced8d310e51f9601fdcdb98259777e9b340f817d6a3484069f83cc712f3a2"): true, - common.HexToHash("0xedddec1602b9ab7d15fde2329c6712a9fdc364211acb9b221d35955f34e805a7"): true, - common.HexToHash("0x7293b2c408f4cf089530d908ef3f0dd4ad590630e99502b5aab0e2abce72e3d3"): true, - common.HexToHash("0x83874636e82088616e39eb7164b2324dfc6a6e03b150221a57a65ca988440433"): true, - common.HexToHash("0x83100cfbbb828ae9cd7ee820e0b1be744524482de545f0d9e93c1f61a90153c7"): true, - common.HexToHash("0x88afa3b39afb7bb275deb4e860860feaf639e9498afb70632d5277c7da7782fb"): true, - common.HexToHash("0x37f5bb627216de64400b3c9a1a72c718da6bbe7b5da56b082ab7fc0139dc7635"): true, - common.HexToHash("0xec2fe14edbeab6a8f8ade1d2802d0997ea8b75756cbcab1cd2fce490f53b9378"): true, - common.HexToHash("0x9a6a4c664df08f141091a0bfbd75eb714147aec524fa57f5e604ee9ee205e1c0"): true, - common.HexToHash("0x9b84364ac92924740e4298d69e6c3f6d58a7de9c57eb7ba700da706cc0cde3dd"): true, - common.HexToHash("0xfbe0dee28712fb8fcc7f9d50d7436dfe0037ce953459e2ccafe83cf289e3e201"): true, - common.HexToHash("0xbe4cb7a0ccbf0b1fbfd566a512e1d70c702cb616a10cc65f5b383d9c3a800d55"): true, - common.HexToHash("0xce3bfe58b2fcb85fd150ebc36b0be81778a4f08b13014a650f43b165aa9a61f8"): true, - common.HexToHash("0xa832662ccd538a5eb00f45cef93d5d57d036b93822076ce91863ce357353a3a3"): true, - common.HexToHash("0x286a0db0f171c2187586435b1e07be6d34911078362d78a50a184abfd5b6b0a0"): true, - common.HexToHash("0x3cd5db0e2f7218832a1c8bac060e383d34314716fe6a681d0e7d6c74d583bdef"): true, - common.HexToHash("0xbc9b15652aa324cd45d6de4ee4304c3e2b14d5938b026891f070f18f98d7d298"): true, - common.HexToHash("0xb921a57c6635903a0c4281b0ffeba49ac5ecb85e3a7c6b4556ef4741081fd0d1"): true, - common.HexToHash("0x8a1cc500707d005d0454201db6f5194b2c458534946a5aff9f63f7e0edafe71f"): true, - common.HexToHash("0x80af323924f8c581aa92453bc5d83884d3147e685214f2cbb881102f627fa2c8"): true, - common.HexToHash("0xe3c8f702183bf419756135593390b0c2d4225787054b7d6862c390de69f6cfed"): true, - common.HexToHash("0xc11cef72ef2da5b1584f0d7f4ee093d42c7139684c88870ffff6dd6ac30bdcde"): true, - common.HexToHash("0x711e92e794466cbef275167b96f0e505458756485f1e53daba4fa7bf897019ac"): true, - common.HexToHash("0xee514070dc328eac7e5db3d73221ebde4f6924cf9ca89e8838cfe651c2bdd984"): true, - common.HexToHash("0x9b67a82aa6e4bcafc03ba4511898a652a0ee56101a7f300f639231d6f66550d1"): true, - common.HexToHash("0xdcfab19ae5b3243e5534b4195d0b83db01179f8b3521c37b0c91e9ffc09697eb"): true, - common.HexToHash("0x4c222752dec9638d57d6a44c9da0dfe9581783111d01a105d1ae09dfd1f3211e"): true, - common.HexToHash("0x2dafc9caaf5675352b117b344d972a37b4496d4b7d6cbdf247e04a83f6c803ec"): true, - common.HexToHash("0x89034847e4a8ca9160e8386abf5d1d0773be76527bb8cc057b5f7460df2c3dbe"): true, - common.HexToHash("0xb700a81c67e8e3b4ab0cb1d2b783b3008edc5a1cf0206b0b4ba5de5dca97eb32"): true, - common.HexToHash("0xa2ba96b88ec5d6d17d2bf0c4b12f5444ecb29ad43ad28e6417879a123f4e7bd4"): true, - common.HexToHash("0x1339593eb97d6d4724b25ae996131b4dcd8b8ec4111c277e3ffb06cad871aa73"): true, - common.HexToHash("0xa2f14dc72ddcea6099328f5c4f8c446509f6b5b6dc112edd4bef80955252a1ce"): true, - common.HexToHash("0x341eca98bef7b6488eaff86e610530e8270fa4e95b819d28686d0d5e4227da46"): true, - common.HexToHash("0x7034a0cce3599d88c507962bb11e6aa002f25c7b1c4ca1a0939d073ecc68ed90"): true, - common.HexToHash("0xda7c8270fb15be173819099f933156fef05d289d3a70103663071bb3ad6ff4fc"): true, - common.HexToHash("0x55c7d5ea33ef19ed0b2c8040cc57ecdde6670489d3d714c099744053278cbc67"): true, - common.HexToHash("0x6ddaa8dd46b588d49392c99f87bc8b94f4ad23121ae1fd3c3ad4c8873908e65a"): true, - common.HexToHash("0x20cc7790f3c6ade7f4ac7269cfa33cc379a6d334733f331d4d309234e8800356"): true, - common.HexToHash("0x8b014ab865bf62c95413647e723850c0973ed0e0f82d36475483a4b11aa2e5af"): true, - common.HexToHash("0xb1021832b9bb783dd857f04145a69988c98c091cdf1f68cf109c206371b74edd"): true, - common.HexToHash("0x791be6e51266acde14e912ec396537d8316b65ffd504b0bdd44f125d6d9db693"): true, - common.HexToHash("0xc116169fcab472bad3ba7259689677503208506343ec638f289c02bb5e905b41"): true, - common.HexToHash("0x43822e13f317623e35d534f12da8a954002a068a951d4bef5e9ad0dd0368c49e"): true, - common.HexToHash("0xe0bccdd9777781b07ada55216095fd60075d799612dedbba6ca0b222d7047b10"): true, - common.HexToHash("0x8bf3fb675998860126f4714dfcac337d138afd3d9ea64f8ae554d66a3bd4ba05"): true, - common.HexToHash("0xacb4e259206ce705da48258b2cb2f749dcf254bc2d103a9818af305526bc21a4"): true, - common.HexToHash("0x99adfcab66fc28787775e3a8b4947aa7e6b687ca328fb92c1705851a5eb51f22"): true, - common.HexToHash("0xf36b2bdc5badac1ee2705ef3d7ab779c0bc1eac77e0bb9bca61789cab5b07887"): true, - common.HexToHash("0xfc7cdaa59f77b0757aaf07f4fc13511255d9c432ec18a3461876da1ea462c49b"): true, - common.HexToHash("0x22405646094523b95f39172ff15acc00eb42bfab1fbeeb3f8a220503e461f25e"): true, - common.HexToHash("0xc513d1b3812633b36e0805de82d24d72dfe7072ec4784247433072030a94ce96"): true, - common.HexToHash("0xabb9cb5ccf0e8e8e686f98458ac7496394cb224365af6dafd94782f069a6686a"): true, - common.HexToHash("0x71b2aeb78eee0ec9ed2481295213a8e925b59a1dea64ed46616305c738e76f4e"): true, - common.HexToHash("0x2f7136e8b4f4eb693f99ab8656b2208891eb25fd16b7e67fe03b1cb9d1e012dc"): true, - common.HexToHash("0xa67606a294df641121c07513753e91c118653cb11bd1086f7d6e917e350c52f6"): true, - common.HexToHash("0x839c2dc31ea97422acaacd85ef5534da0a68f9715087c0484a8fb594ee54d33e"): true, - common.HexToHash("0xed2bc8e61bdab0fe68b23ab8ee39e8e5ed9a22a0b63b662a7fd1cb0f0110a514"): true, - common.HexToHash("0x3c25eceb25bcfc6f74f4e277459ab6f82572ddc162359c87df12b084864aa573"): true, - common.HexToHash("0x500396ef6ea9bff27588458fda9bd7751307c67194d803f78a8ae46b13703250"): true, - common.HexToHash("0xa10bce3a240c689e213bb72d84d70b885b089b71bf0160e727d982f55bbe037f"): true, - common.HexToHash("0x75c72adda82b9efe40ce307f9fe56a075b91a79eb269dc92d839e0fc32ef7f8f"): true, - common.HexToHash("0x671f20f80a9f680a2e33a6648c5c6e607d90e6b59548341fb8d11601b158928a"): true, - common.HexToHash("0x8dcbb11652a9ff3cd918876e500e438f7a415ce9b3e76f575378ef621e48920b"): true, - common.HexToHash("0x33350c9dee80576f1822b6f404637bafb5514fa41a0cb30e2f038cbd0253cdd5"): true, - common.HexToHash("0x65cee10584ff80c79c86938f91e5801b0273bf0f403e5160d9a7046f96fb6669"): true, - common.HexToHash("0xfc58a0e71716ef88b69fe9fc215518cf44dd325544fe8b78926f70290abf4d60"): true, - common.HexToHash("0x5fc99f5b33fea99185f4ee137cc9ab019aa90a33f9bae61c6c1b1bd694dcdea2"): true, - common.HexToHash("0x7388d2a182d061b8f75df700e3840c653f6930a506242b6f31d80d8a7366eca1"): true, - common.HexToHash("0x905a595ed6e3a921d8eef5468dc82469ca8731e63834615fe25718a62e51b6da"): true, - common.HexToHash("0x4b748ce099d23888fb1d2761ec1c69a5154e537cb62df7b297de674bc289be52"): true, - common.HexToHash("0xc0c12c86bfad27d386cbd6c69ef2364bad66e3fcc66c2e97e720f322eb6d42c4"): true, - common.HexToHash("0xd5fabb4965ab7e88a4f51f021fd9c94f766e9a92991d6788d9486623defa286e"): true, - common.HexToHash("0xaea0dcf4b115aedc767a2a1a01eaadbfa861a97b6f673351a07c51ee0cb0d9f4"): true, - common.HexToHash("0x2dc0dc5fd66341011038f9d050d0c7235dd92b2e8694745cb1d126fa403cc7dc"): true, - common.HexToHash("0x5bc85354025d0d7427c5912bec348053c774ab0dd6c0c995dcbc9f51455e9659"): true, - common.HexToHash("0x76e327ba09c42f3c5d6c0e2904eecbc06f651bbe6860fe3ca81226bdf41ec380"): true, - common.HexToHash("0xba9955178a576f4b19c4bda347c4be50eeb1128d211e20840b501652e1f235e6"): true, - common.HexToHash("0x0ab1f9425099cd4db700b400cf20979e8d8d0114e5d6162591e50a5029dc9330"): true, - common.HexToHash("0x8401da56ab5626f401e0be187e69ce3bfbe51b7bc7a5a97579d0dcb4a8a685dd"): true, - common.HexToHash("0xf23e63884e3f4e8877c56987dcd98e586bc02d5eafa61fe69db3c22b43b52715"): true, - common.HexToHash("0x98f3eeb99cfb6aad270720d7eb66f99804c8e672eeb587a971affb17d9bb5f58"): true, - common.HexToHash("0x452567dcb7fb29dfc5fdbaa13cd82a3ee31243faa8947a261176acbb7c51fe17"): true, - common.HexToHash("0x1a588d0284b7f08d4339b05dd75ec48547465d895aa609ded1078da979b2ccd8"): true, - common.HexToHash("0xfaa2e31efca2b6de8589da9fdce676d0438b4237bf28ca8e98c27ff37a3cdc00"): true, - common.HexToHash("0xe8d4b0a7b65b6f5665a2f9a6e4670b36abfa82def06b4b81107e346d0c86ebd2"): true, - common.HexToHash("0x138d7846f653bd5df6e13ad48ec543d7e18dc50b457b4f8259b71b8966375c41"): true, - common.HexToHash("0x5439a65a5c0083311934b60cfd2e3abb7f229e87a6b17a7b24a601545b421972"): true, - common.HexToHash("0x4da33a31e621995f9fd4e24abe1d4323f2902df9364800985f5832f2fd1f2630"): true, - common.HexToHash("0x0d0640a61264ca142a13723ba302075a62c1543ab5a76b21d1af3229098d9e33"): true, - common.HexToHash("0xf87831470044731e001adb4c7552050bd49ed44eecec7e782410d99ba2fb5152"): true, - common.HexToHash("0x7c0c3319c51999397b978f3c36d376060252e1562ae20cea7c4a7e2ab91e1b42"): true, - common.HexToHash("0x6df6f3edf3308ca558a4f09a184fc47eaff26bdd10de42de4e6e67877c0e7453"): true, - common.HexToHash("0xdfe58fd1ab8d02a76dd39dfeddb00b935c08137d2b70c160d1ad535c7a0d8897"): true, - common.HexToHash("0x90d5d6a446e17139ae64202ad4cda65f5ae4fc8a011c01342a5e7bdd37cf7ba2"): true, - common.HexToHash("0x49c247808605d2b1bc3ac77f6ef21c008e318d230da47565a20c324547f7312a"): true, - common.HexToHash("0x09e84a97322edcb893957dbd4e0dbd95108cd0c8cabf6cf29148fb7756d57a05"): true, - common.HexToHash("0xe2c10ed3c46b46e41ddae76169e4445dfaddd9f2f636103256c3d6647e040ece"): true, - common.HexToHash("0x96dfe19ce78290efb8425746ed67d7b3780c8e71a3251935932478c60214ed28"): true, - common.HexToHash("0xe6c82c374999215a8abf1f9daf67278c0b0cd4d3ffee2a99453ff4f638c26c82"): true, - common.HexToHash("0x276605e9cbb8ede894b016f678a47c2371fcb7b3b795042456f30ff19a71e84a"): true, - common.HexToHash("0xa053d73b1f47c0c89b85639ec96ee196131c404a38cd49cc4446026eea47b14b"): true, - common.HexToHash("0x4e4f83e99fbc2befb35f01b55b6d66ab0a5a0dbb8d528e3deeb9e9f19e68e6e5"): true, - common.HexToHash("0xd560e4283453290f44cc5172abc9e1f2aa9dfc23472531dc0374553148fec401"): true, - common.HexToHash("0xfc42aebdf0c74170416e095df9310f72b7a1d852fb5e8ee08aefd110b59de7ea"): true, - common.HexToHash("0xe5a604705853452a458e2d4b734ceb07913e36361c9efa60e16ad18e1d2dcda6"): true, - common.HexToHash("0xd51eaa775b34a7e4e2bc0afee1c0e6220faccc7d8b3e3acf530694f2fa4b862d"): true, - common.HexToHash("0xdf421805d03128eca627fe5d7f56648f14a944783c1af73f45cb775a7d27ba48"): true, - common.HexToHash("0xbc031efa05e33abc0d5b25c0ba867a00bf05346385418d764fdeb64322717e9d"): true, - common.HexToHash("0xa68e76612ec793923448374bcf8043c8d10b0dafa0738629a7906bd07ae32139"): true, - common.HexToHash("0x777c8453d3c59364fb78e57f4cfe9471a682d6089533d6104d44209f6f492002"): true, - common.HexToHash("0x8e12eb1c7d368078e03876ae76a52f6cf92bf3f6d58c174496c80d6939004567"): true, - common.HexToHash("0xc6f049ec455afa8c3ace23594885f6c0f4fdfba2db603ac01901978770768847"): true, - common.HexToHash("0x60b8d392b5800c7ef839141673383eb15e99b872c40d11efaca84240a25a0045"): true, - common.HexToHash("0x0a34196ff701a58467362fb3e462d89ee0e1a5805dd171b6b70dd7a3e08873e7"): true, - common.HexToHash("0x8d482f2b2d079e267ff0d102530d7a9cbd23763cfec5d31d4cbb5aab91face59"): true, - common.HexToHash("0x3ff17d6832a022f3dfd741fe03fb474911f0c33b6375979c3e05e03e769782e0"): true, - common.HexToHash("0x1af13e8f3bfaea8468c8e824e0cad14d72a7558583a766b0c055437fe7f6f858"): true, - common.HexToHash("0x17d5188dd7defcbcb1b187f84145b29a85b8b8f7253b3c8f6d102175497c9785"): true, - common.HexToHash("0x183e50a974f010394f020a49b90f94619bb3edd9e72b0b1d5d24015e1777471b"): true, - common.HexToHash("0xe782f7813fd956f5ced7fdb6174257e14c9a1d62d984afd7bb07c31166153a23"): true, - common.HexToHash("0x4a94db52dc7920fbce166b60f3377bc7842ecaac8aba5e72852ad4ba93b0ab95"): true, - common.HexToHash("0xc04fb55d2109640b4f4c8a45c9b9a651f6860129debf77d416c675f4b7f20080"): true, - common.HexToHash("0xa433807245543c9996d4490285ac91048dd0b0e7c10dcf1459212ca02b9cf209"): true, - common.HexToHash("0x511b23dbdd537f7d89cccc76d663f75ca44873fe4116ffc245f2e09ec0cd7dae"): true, - common.HexToHash("0x09fa20bfd1d637dfed699847fb491d07d31cd87550412ba17d2e24835eeb9ebe"): true, - common.HexToHash("0x2920993cdbd7d84ef7773ef526cc38bc4f083652c342c652b7832d4f35a411aa"): true, - common.HexToHash("0x03e4b30be2b722e818bc5291a1e53d84fe62e6d1b64429ed52ebd172b845a24c"): true, - common.HexToHash("0x6dcf1d1e075592a5f7870d26a576791b5330fba3f0b49c8d11f91b32770f64f8"): true, - common.HexToHash("0x0ea90f62dfbdbed0e7d639143eb0d1bd7cd2a25922a7717fa6f42e9f8d9c56f7"): true, - common.HexToHash("0x65e76a3376c77b2685c22fa9091f763480a7cd4d60a3438a9435c5a5a15d60e3"): true, - common.HexToHash("0x6f5c06acbcbeebf6f54dc24aafdea454fb0704eb2d3445ec4fb411fed5db6643"): true, - common.HexToHash("0x5a01a6d5537d8839f3dfba38fb75f540dba4a44d16c15bb06abab9b8cfa5bc5f"): true, - common.HexToHash("0xfe2c8415090b4e151ac5e261cefd8bc95f438b18a564bc33155216835ba1fac0"): true, - common.HexToHash("0xc583f10dfa99ddf80aea54105e021b581a6380dc0e28b2ec1dd3ca9232d5003a"): true, - common.HexToHash("0x212945ebde4b2d8e0875208ca943a84fc499381fa536aea565d7df192a437aca"): true, - common.HexToHash("0x51452407a098f216cc9b2cf49e8a87e9b1d11edac5c388a30d892679a5ba07aa"): true, - common.HexToHash("0xf2bd9e55ed8a35ba8391c571feaa70e6c195b5c27d373f7093f29719be31b1ee"): true, - common.HexToHash("0xabb162effd1ce63a814e62383112ab3b47feb9b124c117974cdc6472af2d4400"): true, - common.HexToHash("0x85de01b7ab44f54fe036ed22b9018762f06f1148028cbd91b6092e2950c9cef0"): true, - common.HexToHash("0xa46a8d1beefe543c4c9a11274f7ec099359eddb6ca32d553645c650581e1f51a"): true, - common.HexToHash("0xae3d2d0eea6fbb2fb6587f68e89252729db9b26eaa558abfa0343727f3460637"): true, - common.HexToHash("0x8ea4c34b3eec148438653be298321525619f2f1902b38c2b4e27cefdeb923510"): true, - common.HexToHash("0xa24d3e85f936e89e3065ed0ff938aa78acf66711046d0be28d2401ef52479ed6"): true, - common.HexToHash("0xd1a15f0a6a7ad7373104433db49157291d995005a54caee445af56ebaf67adfd"): true, - common.HexToHash("0x42144c05194f739423f93f559f83540c9013ba64d500a63edaaaa881a79f5073"): true, - common.HexToHash("0x67c6725c08ff647e24f4a9d09fa05ea5c88c17ccf9959160ed256383735b37e4"): true, - common.HexToHash("0x5fcf9c6c166c895b63f69e48a6883e554257b9ccd8e32284f28aaee344c58647"): true, - common.HexToHash("0xf8d7d550d2905cc942b1caa61e161cd99ae37c94857e2a1d29211f77792a11d2"): true, - common.HexToHash("0xea354f716d3fddd7fa014985b3366b91157e6e52950f913ff793476b75016d8b"): true, - common.HexToHash("0x0ebd94ab0327e2ff327ed87e9d624489da9c3d2dadd430429934dd4385caf0a1"): true, - common.HexToHash("0x65dd0579ae88a5fed5c8642898d8f86d99200d08b0aabb43b7c6d41d72cc5c67"): true, - common.HexToHash("0xfc59aeb215d49a7d7e157eadf00b470f4861e9e3936ae457645e27757fd145a4"): true, - common.HexToHash("0xcb19004ef8a72811b87530ecc354a58390bda2c1f3217d04c0478d76d2ea722a"): true, - common.HexToHash("0xd7f009a3060438d06620c13f5007a167c8020c113efcf59ef42dc511d3eb096c"): true, - common.HexToHash("0x3ed07f5d65c9fbf8ff2d142fafa3033bb26f65b6a2eceb9ac93d589ba46360d5"): true, - common.HexToHash("0x05cae351fe8038c7c76b8900c4ba24278c6fdf7654cf5871c53cf97707355f50"): true, - common.HexToHash("0x28ac8fbf41ffdf9504e384cf452d17bec3c62d7b4b21e0aa0cd175205ce155c2"): true, - common.HexToHash("0x3164ac0c70c0d7436e816cbe9aeb83456f1c17825479718a598fca3096df25e9"): true, - common.HexToHash("0x80ce5cc70b32d842f486d2c787f6cb9eecfe2c72f2e5297d0918050005c82e05"): true, - common.HexToHash("0xf1ffd5ba14a8e5deb2531872480855d5d4527a291503035e540ae18c3631f452"): true, - common.HexToHash("0xfd7de7be49a1f566a97ea0e033ff38a119228a4fcf061a6d37e91e794dfd57b0"): true, - common.HexToHash("0xf31a2a65c385dcb93b4d83fdad399372fdd2cff5352df97386cb91e41c98d352"): true, - common.HexToHash("0x4f7bdbe294d2a36f3c23bbf762f031ea65a999d30881dbb73e8b682b51c93a18"): true, - common.HexToHash("0x2d55895368cbd8c9c276e82c29aa50c85c002141cbd02bd879a2735a70213553"): true, - common.HexToHash("0x01493599bed67798ea27be5aa24f1116589361bf1a51bfa71f3f16a7191681d6"): true, - common.HexToHash("0x44ab0cf5c265c78d7f67a2d24a649e4a9a3a56793b328bd2b90bdd9e83596b9a"): true, - common.HexToHash("0x1742592c743c2fba6a7b1973e5c87d5c1dc1852dab89c72f18e1246673b62fd2"): true, - common.HexToHash("0x0e49ef939ccfc571c40d2c4f795997955053e63e4c11e44459e2aa23d810ec4e"): true, - common.HexToHash("0xf40c8ed8483030f77b72cf9592e792ba1f7db07e40f4da34fad7a51ec64c21a2"): true, - common.HexToHash("0xce5dead7ce1f123f866bb5cf040807ce3dc273a7eb0c0c71bbcb6ee0ee334348"): true, - common.HexToHash("0xd17740b7945eb70559226fd03db5c464b281f7772359b631cf0fa9f11b96e44f"): true, - common.HexToHash("0xcd35c93932ff0975fb129bb3d7832555afccb27d9f58576adb772c9e72a16dc0"): true, - common.HexToHash("0x6da9f21412aac27fb08e57089072471db3cb0324d2cdb6047a6c30388a5b6f3a"): true, - common.HexToHash("0xd4506c202bea6ff7694c40aa86f5a2c401ca2cafee554ec3cf9a0d906b65a71c"): true, - common.HexToHash("0xed61af2af94d11023d95c602cb90da63d256cf6f5c15bc06cd620e48fa80703f"): true, - common.HexToHash("0x1ba975c0d2c8abff2eb5cd80f36fa7c8db331c7dfe2a39e1023ff37b5dc8c6a4"): true, - common.HexToHash("0xe0eef72d1ef27cdc6671e126f24d3c26bfc5dfe50306f46cd3cc7fc9a2179169"): true, - common.HexToHash("0xb614b2848389c429a334a3a19e38c18b7d55fba24978d949c7fe8cfdf2e7d932"): true, - common.HexToHash("0x99e97d4abf299e7fd3ed470d8c66d61df134a8799a6a8cf422d47dc564e95c97"): true, - common.HexToHash("0x79cda9c803ca63d49040477da69ccc094c82c4a79ddc1dd66e45549ba007120b"): true, - common.HexToHash("0x51a877374c4ad5f1c92a9c437691439859d08e002970b3147dd875ac274f1048"): true, - common.HexToHash("0xdbcb96c4dd428f6ec5fa9d8af2095104f249b5d2f5378246701c9a0011b4a988"): true, - common.HexToHash("0xc8a705055a74a7c015d7ba31801ac5bca519481585b6215f143c000d7856af2f"): true, - common.HexToHash("0xb05bec2401b88ee8b7b0a100c5f256cb0d039d51633697374abf96f7ac76db30"): true, - common.HexToHash("0x570b93d2b665bbf02893c1b777ed73edcf76b436be0e387aa7ec9be1a431d83d"): true, - common.HexToHash("0x44cc01411cf825e3d26ddec50738120976c08247a2f46be384e8653707132b32"): true, - common.HexToHash("0xdeb1c36e832b2fa9a41b1434117e5f680e2efd9b99d24d8dd125804152ea844f"): true, - common.HexToHash("0x8fee033e24560cfe5aa492e5edfc3b7a7d2348ad92e3cda19f2ff9606625433d"): true, - common.HexToHash("0x895b5dcffdea36bde1f8e10da059e543579f21fd5f03cd5c75b63a38892db162"): true, - common.HexToHash("0x1c85e5b81d3459b21cace757fa0b1e5da125f2123e10951118fea00fe47be4a2"): true, - common.HexToHash("0xc3cb9529858ff8e6f8957e11389164a43ac3949f260c81633f0c81b103498cca"): true, - common.HexToHash("0x402663946ef87682c80895be6da64f4288524c696a52311f1893a19ed85a9a9d"): true, - common.HexToHash("0x917f00f262fbc480c1f097d812993194ff79cc63d55fc0c64476a9dccf13f5e5"): true, - common.HexToHash("0xc440e9fda75e9ea4985d9e72cb066469ce9ee706f561a32abc94e4b987a0dfa4"): true, - common.HexToHash("0x09d2ad70d894e3d6c364242900e901ff0d19d48bccda9983679fa9f8a9b3cea5"): true, - common.HexToHash("0x1ec6f3fb06f30117b2b714f8b9577dd369f20a5dcf17bd3ae73e59381b2b0fd9"): true, - common.HexToHash("0xa628eed1675345ce4ebbf4831cd8aefa03864fd4f3581590c68cfd1f0d62c83e"): true, - common.HexToHash("0x42d219f0f5882a6064d9d0d6d6db5e1ae5c9c38554b9cb061806386659daeb24"): true, - common.HexToHash("0xed9edfd2b2284d122f2dba2a5030795ddbbe3a424350fd3da89285372606bc7f"): true, - common.HexToHash("0xd1595cde50678679bc49d0ea3a43def6ea6465d3dfb57b30e431fd3faeac7de8"): true, - common.HexToHash("0xae7ce046d7c9402f42ed25d06e9df9958a015a6f5a0a614c11fdaf2dad390b57"): true, - common.HexToHash("0x09f251ff59a1650e2b59e3a6474c10371e0cc3bc32fefb6b9b24732c54b280ef"): true, - common.HexToHash("0x80b5d979ced91b103a3f87a6cd21550c413265803e4530932e51a3c3a67f50e1"): true, - common.HexToHash("0x83e3fba42de7e5e697ade59a35d0d55ff029eb4c71ad28b2a4f55030e34a421c"): true, - common.HexToHash("0x9b81c2c2602b926e5371042b6b7246f649c6ba66b85b90f1ac91443926433f6e"): true, - common.HexToHash("0x6e958d295346ceaf796ed08d25e5d86805ffab5183037f94faa806d413f1fb58"): true, - common.HexToHash("0x61bb5ddca8c9a692db81b26fb2e67263442cb1b7c2f90179a7f14f46f3d16dfe"): true, - common.HexToHash("0x071880af1e15df951c9d117140f60aa9f16651f7264cfaf6b0935ae7a7ea2199"): true, - common.HexToHash("0x637148d53722e4fb27160253b6365f910784c28cb523598ff0b5c2c9c5a4201f"): true, - common.HexToHash("0x42813ffb0b9bd9ad1deaddd774a8227c628f21a78259864fe37dea53fb8fcebb"): true, - common.HexToHash("0x34fa040647cc4f816b6a0d6b2d6ae49df915df2331fad4ae517cc4af31e9ab8a"): true, - common.HexToHash("0x88b65099aa6ca9d73cbdc73cdf4f851ad47f4ae6bcfb13811b35e1fa043012f3"): true, - common.HexToHash("0x04a69eb11566565601ae3a17eebcfd8d19970e593110bc48b2a421cd20b41c6b"): true, - common.HexToHash("0x29ff64901625e85eee8a827cb8ec31be89ab9c39e0bdcd14d24f09b5cf6fa1b1"): true, - common.HexToHash("0x01e6f0ed5b4aed11cfeb71b555f9ae3356766af1ffa170aaf4ba1c44eb154dbc"): true, - common.HexToHash("0x5413a37fe1a0a7dc488aaf517d0288c7e64fb79e660f3c4819ee42b6dc0942c0"): true, - common.HexToHash("0xac0dada257cab949b08bccb1bbde0e7cb1dae5989827c548b4e78bac44b8bac1"): true, - common.HexToHash("0x6ffb5cf321ca8383d72bc94e31190e15c2a7f7268019754c466cea0fb38c165d"): true, - common.HexToHash("0x6d31bf0bc368916a898d6080c51e00460647de9fdb3251dca03a68096f17d2cc"): true, - common.HexToHash("0x8ce56a53c10248687e26780c69f39447249327341071f7c2a31173d4cab9a527"): true, - common.HexToHash("0x165c53c50b38ec828bb6ff768eea943f7c277d1f9a4b7578ce99bd57a080f0f8"): true, - common.HexToHash("0x328ce7c90e1baa74821e6d03e44cd26e635e77d1601170f0b02a8690d29f13e3"): true, - common.HexToHash("0x18a4cd8723d430d3e105f61afe9ede60452cd10a38550516728e17f0a61bdecd"): true, - common.HexToHash("0x9431d50c1504cdc344a64b3903124ddeac1ae806f00784a70399b193f065f881"): true, - common.HexToHash("0xad94f0dc295ffd161d1c20aa8b883e7c2f753a366823f2676c3121b0ce9812ca"): true, - common.HexToHash("0x478b1c67d6cb7c2e9fb7c0386e9f704871d30384e3d0f15cbf0bedeebaa04ff2"): true, - common.HexToHash("0x6eaab60ab4970f3957e0e8fd7439eff77de007926c9930561e9a132783590f88"): true, - common.HexToHash("0x76ecda923163b338e8164f597d8e567c369f5901f17711a16f236932523f6b85"): true, - common.HexToHash("0xca81c6cbae5d5e569b9f86c6d9213feb02606a73af23db51494ea7a2752b6fb1"): true, - common.HexToHash("0x09be10d16c736723f8fb81a71a261d6940037e68ea66c0b094acf807e4d1842b"): true, - common.HexToHash("0x5c52e3aa3af17e1578571aa952b4904f0270de41f9e6066c9f81ea8deff1a8e7"): true, - common.HexToHash("0x9199354fa54e7bfd0051bb40bb8deddc7f62bd0707f33a74075a14af6563c276"): true, - common.HexToHash("0x026c45fe0f7a1160d699e9c78128e1b914623ef3263f58cc45c5420afcba53dc"): true, - common.HexToHash("0x03d958e285269020429f1c783bac7558adcb9f99a4b8de0ec40ca18bda410c7a"): true, - common.HexToHash("0xcc9f284d03523dd26ab799f50c4336c090e7bad30abf801914a7fdaf90c2acee"): true, - common.HexToHash("0xf4ef2544ec2baf824d17aeda5c4f7c7faba82f7a4c5d8187e6dd0cb9447b9969"): true, - common.HexToHash("0x39564dfd9e83ef9ad999ca08560fb4260c72ec3c0bcabdd2f7ba43f79a0c7d38"): true, - common.HexToHash("0x64cab010cb93353b70ae548aa85dc33f062ddc51c52b43a97d497f3fe3379ccd"): true, - common.HexToHash("0x7592d13b03fb2ff0f0953a97aa718844cfb226edab1c56191ce10e67a3b63e44"): true, - common.HexToHash("0xebfb913f929cc2375f34edfa7737eaafda03fd505ca5c3b1c2bd443600650904"): true, - common.HexToHash("0xcaf7567249c257bf7695e452ce57ffde981f1e6fa8838f8475b7f7628767e1f5"): true, - common.HexToHash("0x624318b94a10db23c9b71badf022c142614fd646a6383637f29cb731e170edf9"): true, - common.HexToHash("0x51ba020f17e75792ac12c560759987be6fd786a1df7fdc3830a56719ae9e4edf"): true, - common.HexToHash("0x694a4b3c151bd8c3bb99bf9f2444240b6f771459bfa3ab80b11461fa857ac685"): true, - common.HexToHash("0x722d36c99246bf503a97a57fafd799c5f826c8d8623ae1de3f6c9f3504a53d4e"): true, - common.HexToHash("0xd79cbb80ea776e1705f0fe30840daa6288ec91f28b711059983ce6399a2b46c5"): true, - common.HexToHash("0x7978bc1dfddd89183f8f5ec323e41e76f03afdb88ee61616093752c04caa2037"): true, - common.HexToHash("0xb67f8b033b3cdbb334c607812923dc8b2650ac8cf41ed8cfc4e157f4ae704494"): true, - common.HexToHash("0xcfa83ade5f13237de7cf2ae5a541b13854c93ac86e02d78ab292ff9a2e00c7d3"): true, - common.HexToHash("0xc22df45b666387f9a19a1a5ae4c6a00f25c09e4a1c730a210370146858ef2394"): true, - common.HexToHash("0x6be2664168f9f3c9a9a72d332dd10f175384300826d000e206d93978e34190bf"): true, - common.HexToHash("0xb087fc8989356254b717467e1335f07ca952a7ddb933ca20194c31f7cc7ba340"): true, - common.HexToHash("0xb31e868ded7658e34572c5ebf6749c78c39bfa8dc0df70f5fdbfd11a542f3040"): true, - common.HexToHash("0xeb0bbbf58ec184ad6d2e115f37b4ba6432744d32ad1c9e0d4a7fac2530dca6d4"): true, - common.HexToHash("0xd9c7850c674f4698a32c23d5d31efa7e84c7f5aff3f34d365590b344ea08084a"): true, - common.HexToHash("0xcfe1c130359ad83a93194f17b60e9778b3d867717239228cc5b3aeab680c99d6"): true, - common.HexToHash("0xad04e6187acedc6d9f896c5e9b1213eaf741efce305ab02d867d9b0ca31bdd44"): true, - common.HexToHash("0x6df227c7254e3bed1a814a958f50c20f14b008095fa2f72a3f0fbd53f2fc0363"): true, - common.HexToHash("0xe997e76cfc068a5bfddbc62952d33b0c75135e96ac9fce547b29c4c8bc73aff1"): true, - common.HexToHash("0x989ca363f8e69854c459562811cecf21afad350fb2a89aecc3281f545af127f3"): true, - common.HexToHash("0x0426e0c691d2502850410fff231d714d35831b53cef0d64c3f73a7fcbc722b65"): true, - common.HexToHash("0xb24a439698d44ab44b3749ce38df0d690f0ea8507d2104d32c40db99ff67f24e"): true, - common.HexToHash("0x27abd6e71a186f1b284b0751d67b4802d576e61ad0d20a85fc49f30eeba7652d"): true, - common.HexToHash("0x52a0b7ad9ba787b9e18c642f36b3d4594d858a3ceb3c86a465c9858a7618440f"): true, - common.HexToHash("0x7b6b79414078c35a4af9941516b691e712195d1783e4c3df2c6f8b47dc4cad2d"): true, - common.HexToHash("0x7212721123fc5b9557eb7f6cc7c920bfeceb80aef068d49ac558cc1d093a5fd1"): true, - common.HexToHash("0x65722ad0aa8eed03d848a30da86865a1cf69c748d9f2e7db715b4aac095d00b8"): true, - common.HexToHash("0xea266a572a059db96c5ef654783ad85d77d16300762c7f772556e6496877c2d9"): true, - common.HexToHash("0x883b19749e376960d12fbf57603092acb22b8f2248fdffd22ef8ac2b007a5245"): true, - common.HexToHash("0x85685481109cd03bfbf38d17485565ea6b05630b82fb8d686d5570b6d3663b4a"): true, - common.HexToHash("0xd9d355c884315b86946a0576239749c48a60097b956ff65b451fd54b5a68da9c"): true, - common.HexToHash("0x24299e57a359607fcb8674ae4f7f9d1469cbe9fc0f1e7b661a7214f6d0ba3a4a"): true, - common.HexToHash("0xe8de9ae390ac20a00aa87cbcbbb1a17f7d9a9121093772964e3e22e10793bd37"): true, - common.HexToHash("0xe24e4e86b633ce49cd7c7b490cd66f266022d4accfde77e366fa5db7cb4ac482"): true, - common.HexToHash("0x1240e8c091cff33f13c5c37812a73c59c7349974ccf8658035c389b180aba834"): true, - common.HexToHash("0x2579bf99d1d952f60e0b02bcaba6a06b10c1df5eccd331c0d53fddcf1cd3d5f2"): true, - common.HexToHash("0x6864398ac94558b129c0b302d39183c009e27c7d89cbaeb817e8db716861f2c8"): true, - common.HexToHash("0x48102dc3d83ff7c157693620f73517699af956d7d50c37a9c2d31125fb92d49b"): true, - common.HexToHash("0x3fb9e9ab7f6e50420109a69d6e6db724233564d9c6318fd1a8a4b0ed5e6cf36b"): true, - common.HexToHash("0x098b7ba1d530bd3440bde6ee2a137ceb86b349aaa44c18809b2f71e622372d5e"): true, - common.HexToHash("0xf5930c61c153a24d905c8a3b800463795fc8a93f57fc7ea95d1afb87f1a38d1d"): true, - common.HexToHash("0xfa53e2501eae245127ddae41c5408bc2260f3a4fedde082527012e60f41e7dc3"): true, - common.HexToHash("0xc0877120d0b7795fff6778daec4423574abf4fc55237423921be12c7383b53d0"): true, - common.HexToHash("0x0a846392a2c4b0051e51a32f653fcde6604da7a535332f43c15f8cd3a4f88962"): true, - common.HexToHash("0x22050eebb2c4084a75e651d0523880ecd56fd7d7b08ec94e4db9c7cc25eb22f1"): true, - common.HexToHash("0xb727b89eaf8073a9b48ca663138902a28d6b6d79307709a64d4c615d3fdc21b8"): true, - common.HexToHash("0xc7f3f2a81be146c8325fc4067c1fea0de704a58e2a946c314406b287d26737b5"): true, - common.HexToHash("0x4f8717d6c24e023ca6b8362d0a6177acb94d671fc541c0c632cd5d6f11e27f36"): true, - common.HexToHash("0x13fbef774dfdd0c1f9bdc0cc1e5e64c0ececb9c6c87658fa10e09a378ffa3c7e"): true, - common.HexToHash("0xb420b98f31b1e0aa0262165a6876144227fdbb608e0b3eb925afb14fac0197c7"): true, - common.HexToHash("0xfe0e5677f8ded28cbe19eb533b14d702db0bcd203025ce522b0b8aada524112b"): true, - common.HexToHash("0x4a70b9fb780af13692ca1c21fbca50f359aa0927ef0edc143d988bfca3e1891f"): true, - common.HexToHash("0x1a19de8c18b478d6fedef03ee55f67cbc20aff7abc7637989fda98101f00bb43"): true, - common.HexToHash("0x95e9a2cdd580930e303cb0ca3ca2861359f25b0424fcd7f9556aa1df977bfc0d"): true, - common.HexToHash("0xc38bc7794b56507d34756d95385a0eda72d679089c26d239b98dcae15b25d69b"): true, - common.HexToHash("0x43eabe03e1ddd0f5a42aeedbea6d003222fc9cfcca5ce4c7ec2c325e773a8d9c"): true, - common.HexToHash("0xb152acbfe6e6874448e4ce17944befa130c1999c5a6f99918c2da558453827c5"): true, - common.HexToHash("0x7eb183e47f617f5d8c356a8e1591733f6d2ae1e59a799beb6a1ec51a6ebccd8a"): true, - common.HexToHash("0xcad0d51414ba6ea5697e2330a98f5abb00e78151dbcba0b6d3f16bdd8bd209aa"): true, - common.HexToHash("0xab3f2d8fd920c158098174eb7955626f4b78f1260ed78de82139715d7b97ccc2"): true, - common.HexToHash("0x4a5266c2c776a58b8e02d59e1731d5e8f6c308f58f5fa25c4e2130a416443c3d"): true, - common.HexToHash("0xd47bcd3628175c3c55aeea6312c5c53ddaff083313249ada8dc27a91f9bbf5b0"): true, - common.HexToHash("0xaa4de85574a8122e2393de3becb0af4286f1d935066924248421ad8644733bfc"): true, - common.HexToHash("0x1a7bc1b07fd3a30f5112946f51a35524b5075f4b9b76ee316ffe5f792b8c89bc"): true, - common.HexToHash("0xc3cbe44c8ff0ae045024953d623c95d7c528dc4be4cb7db9fd83f727d05add5d"): true, - common.HexToHash("0x220af3a05900d4f6c61cc0b35496a5800d21977f3c5a3bfb475145e9ac12b00d"): true, - common.HexToHash("0x527f96dfcda17bcbc06b4199cff3d69792461ec1782a1af98fcfb2fbf2b15bae"): true, - common.HexToHash("0xfbb1ddf8f96c1ca51301c3bf5529faa7f0966acf88717b026c4e5b1720c58aad"): true, - common.HexToHash("0xf6dde4d259914c44f9e2effe153b67b9b59645cc12411e092a4cc40a550c6646"): true, - common.HexToHash("0x07445cfb7415ad177f0c736036521893102478ea4c3216f85d0fc4f75ecd11b3"): true, - common.HexToHash("0x2812d35332eeef6a164f432ff0bc039597aff676872f98ff7bdbf081addd4394"): true, - common.HexToHash("0x246b0504b560463a516f142b9e8b58d6766372c173168a55d10551f08a480531"): true, - common.HexToHash("0xa11a3ca01d1265d03a79f6765b3ecd977a41898767e996475d7a2e8c44828933"): true, - common.HexToHash("0x51dbec6c25bef037cfb6bd4fd837ce4f7fe137cf10b472a99ddbb0f56eebdcf7"): true, - common.HexToHash("0x24ca9b42cb154176a39b6f4402f3d4e7e4f7f0cdb4f9818f958ad683c6848541"): true, - common.HexToHash("0x471d59836f3835f71f92382b6c77da874467b134b4d8ec37afb41e3e14430684"): true, - common.HexToHash("0x5ea2335112d87f0bf73d998345027f020383a5647caa6690886129cc6b000be2"): true, - common.HexToHash("0x2e5557822a0f1cb6cb81ddfd0b3badfeeb1b89746a72df945a84c32b83caa463"): true, - common.HexToHash("0xe86c6db4727dcdae801205b75a82e59591a85ece6ddaedef31f3d13953d98ffa"): true, - common.HexToHash("0x1affd2a2de017d49f80cc94337c88dc63f69aec25232ffd5f3f8574285fa7364"): true, - common.HexToHash("0x2e7eaec9c50bf00f0d71a8221f4a7ad676b55a748e6c5ec059eefff0e4e8a1da"): true, - common.HexToHash("0xd884f208bc91a535e1878d7ba0937a2edbe69a7c7b0f6f2332aec443a942b157"): true, - common.HexToHash("0x9ff6470f64bfa107f08b5770d7772da486f6c09509c36989222c76a72d326996"): true, - common.HexToHash("0x44e39e48361ec58e277b45e99992e6fcfca84599617e62dec43110a6ca165d00"): true, - common.HexToHash("0x181e428ecac3f150b9bf40868e5628a5ffaa693a6e9a0a5ed947923c319bda3f"): true, - common.HexToHash("0x91eb10b4ab7ac09404c5fdad746d170d5d4325403bc05982b4b1934b9c17f2c4"): true, - common.HexToHash("0x761208912ffda5649efd4bf14afdd4f5bec83efbb54efc7e2d318f845b9c598f"): true, - common.HexToHash("0xdcd6857f8725c054cfdce166fa4030c943dfec89621b57ea95e25f4dd77844f3"): true, - common.HexToHash("0xf51edfea9276a1cb398e3bfa2e681b195f61f69594fd3cc361ce00fe514100de"): true, - common.HexToHash("0x0686573c3887087c7cb02e2113f6d9f3f10d9a2fc737dbd055f2a1b4d435b517"): true, - common.HexToHash("0xc8ab231b89f77cdc041cf276d1fc4df73777db10c540a8617556c60a54507268"): true, - common.HexToHash("0x18b155a2f25af9f00404927e04ef7b30f3d3b8c247ccb59d02a1108d751869bd"): true, - common.HexToHash("0xb040095c27641842acda67e6f93338bbfbdeafb3ead3b324f2964c057846b3ec"): true, - common.HexToHash("0x98ef10fcf45d09858329c5967e1648789df581e301b2a32cf2acaf8d8a49b630"): true, - common.HexToHash("0x088fbe98e436195ecfc030bdc3ada2422f27ea50e5f6fc2a7caae7f82438952e"): true, - common.HexToHash("0xa62c089fe081c67d322132059ca7aecb014449465357cf01d00d602643f5dcad"): true, - common.HexToHash("0x7dd7fde99b2eb25373b45d882c12dfa40249632530d608935e27ec4667142cb2"): true, - common.HexToHash("0xb0698a3414dec49a65e01ae1f7b71be46eac0eb0c342375e82f5396f1d1a3124"): true, - common.HexToHash("0xcbd5d911ae6606c57f7d104fff097460e4d173656c3ffd2d4ce3c5d153742215"): true, - common.HexToHash("0xf8634290272f78d253f706eaa311eaa6d11f32518d69be589f2f530d6a94f66a"): true, - common.HexToHash("0x4faecc2402b864f3366dad4bac14b46b75e3f42c7d83779f7f55195f67ffe57a"): true, - common.HexToHash("0xe74b0cf70356575c073be43fb0bac5a6c40700724e7411ce6abd3578fe7faeae"): true, - common.HexToHash("0x5dba605709150e0eb912e45e0bee61b83a04b6696d159f46ad2f66276d31c26c"): true, - common.HexToHash("0xe430ad1a5914efc902a20b95bb70a638143a4527c89fd26cf84bc23dd3149f37"): true, - common.HexToHash("0xc1bd5e101f0e20db681145d7698c73bc248c7cf36af4842da79d978d4b7fbeed"): true, - common.HexToHash("0xce56e03f39f31eeff36b8e71f44a7cbe4e2a076890bf61f19679172f878a0ae4"): true, - common.HexToHash("0xfa91be61fc980610f12007ae570f03c581057658ed04e9a4361299017a95bfff"): true, - common.HexToHash("0x3c63ea125192852c9c9d14d2ea576d9b552833490d7c5368641ff4d191375cc6"): true, - common.HexToHash("0x833cf8a41307be28997b8d669253e32af4714175ce0ff49089ea5e9120094470"): true, - common.HexToHash("0x9c1f9c08a6501281283606ef9e0b0987141e3edf30d387f3beff0c975693e4ad"): true, - common.HexToHash("0xe6dfd784a2e46ab83b312c884fb100fec3193409f63e1297cd050d186c0e154e"): true, - common.HexToHash("0xd1c83f0b72b6f9a280860aad4c61c2a91bed6a94bb7a43921d3e32d47c67f690"): true, - common.HexToHash("0xd52207b250298466a4ea936a28df340a579d859f541fee5121ec147e61ff7bc7"): true, - common.HexToHash("0x3bd9647ad0f14b438daa8e77ef9e172d383f38feaec61ffb24ca50ee6aaa8b03"): true, - common.HexToHash("0x35ea8c2a21cd9cbd5cdc8bf5a25278e6279b75e3e1863d0ebc33ed3b8a36b695"): true, - common.HexToHash("0x2e33df1fff58ad99151473a74d7f2d188acb3624e411d9f701e87519bac4de7d"): true, - common.HexToHash("0x359a05bbc3f50bc51a76519abdb4f68424f4e577670b9e43655f8b1533c468c6"): true, - common.HexToHash("0xcb398fd38a3813763a48ab6d4f3730137e6114a9fad6f2a44b2c9cda11657385"): true, - common.HexToHash("0x47c51b13ae740739b1916af5231b86961aaf284b1842a1c735798c450eedae54"): true, - common.HexToHash("0xecc0d7ebb306f3e54fc25351c64a8ec114dfeaf86ba85ccb890ce7b599c850a0"): true, - common.HexToHash("0xa8e27d5d417c2541af57442b65491678432e852a55c30c8ee1d92cf5b268aca1"): true, - common.HexToHash("0xcdb9e94332c20b6f1e9db91ed42d7f21cb2725588d51606759260f1bd89966f3"): true, - common.HexToHash("0x70b1e29288b0a3f3c2d0fe1d589814d1480ee29663a65f154ae68ea77826d7e6"): true, - common.HexToHash("0x3ec41e912bad0a9ff54b0909a3b833974c1574c073209e36f22d439d7a7c5653"): true, - common.HexToHash("0x42283e1ed2a9154b79430e7b89ee77697fc665e456f7fd6e1e85cab87777b94f"): true, - common.HexToHash("0xbfeeaa9ca1ccbb4331ff8675651b652faa50969f11ad0d153d9265bdae75f9bc"): true, - common.HexToHash("0xdd54f995126b12532d9f8d9d56f6e8761d6f4367b9bdc5816eff8aa88dd4f626"): true, - common.HexToHash("0x1856ed832a1f7f2cec808ecfb0e3bb18ba888625f378571ee6625ceb48f451c6"): true, - common.HexToHash("0xc2621bb6b1930e5f3d4cf36a88f6a22aad7bb193bda60f5642bf7186bc2a2da7"): true, - common.HexToHash("0x69c9eb44983e59e9f189907da4223e3f99afac47a6166bad492ced5ace61636e"): true, - common.HexToHash("0x615cffa18d521d8aed25ea994dd2b8ccb1a967dfceaf6b3741fa7aaf951b18c8"): true, - common.HexToHash("0x9bc9051360148286a8469c4121ff4b9c49d5092cba1fde56e88bafd21275114a"): true, - common.HexToHash("0x0d431bf3254e009974cc70bf62e30df5f3fdb99723ccd769b8c99e3bfba9932d"): true, - common.HexToHash("0xfe4bf8c2dba9cc1c9566133da03479e85bf4bcd28d5503cf2caf6ca0c23cc880"): true, - common.HexToHash("0xaba2728a901f26112d60981511d6d957f6ddc53844965cfa4df45dbf0b97eac7"): true, - common.HexToHash("0x09c38edd90923dbdc21eae7db1267f19b8f8e7a2c71059c4218a597493eca44e"): true, - common.HexToHash("0xd3bb90e4bf039519dc18a59cc5351b8cf76f250d017af0935aea204e38282f0f"): true, - common.HexToHash("0x88b702a005a0f388e3e9012e3d0d8496d9e3398f81a36ccc4c880ab3fdef86a4"): true, - common.HexToHash("0x08c41a4862e873b83b8252bca8e3e3027315873743dec6a9a0de68c39dad867c"): true, - common.HexToHash("0xdb2e310bfc3179df228f2df5e50d8744d0a8d6c93df4bdbbc4b6d4147b310e8e"): true, - common.HexToHash("0x1db00a1abea755d0ba483b27fc254b7886ff737d02047020e6a4edb5dcf59edd"): true, - common.HexToHash("0xba32e8716377451c711127c7d92ef8154399431e8eba19707415ca47da148a82"): true, - common.HexToHash("0xb5907ec5fba8222397ef80d174499303a2b55e4e43947d06b9ed1a6a1e0a7aa3"): true, - common.HexToHash("0x7d7a05bd482da8fa8dd0e6ef4704696153809257a76efb3ac6a54e36d77e5526"): true, - common.HexToHash("0x3c42612710e322cdf7b5ea7e5e3daf2d605128cfe30ed08833ccc594dde4c761"): true, - common.HexToHash("0xb69534aa36e118409f7920729b7b6ea52b276c48f1d09e01b4f079c56ddd5de7"): true, - common.HexToHash("0xc485e57b42aa0314d1053fc78cbf2faf5fe38d696d12582af4f21c355cb91597"): true, - common.HexToHash("0x8b2fe73a9e3e02bdfe257061106834c1d1522ba9b9e11071f415895b1b4dab67"): true, - common.HexToHash("0x2b2a815152d93fd408da7dad7b2cd480551483dda333c232c11c035909244c00"): true, - common.HexToHash("0xaf62bb6ae9425f39900f18c505b8b7a811ca20aff24ea3a3584fa89ca3917fcf"): true, - common.HexToHash("0x033ade0db0f7e3dc07bef496b3acc08630185c1e302c04a141e753ebfa27764e"): true, - common.HexToHash("0xa282672af291c84094223469aada0888ab8ea0023222472f2754eda7026401ad"): true, - common.HexToHash("0x817c23a40a0ee0141660bc6cf513e38576d9b7126ae7de2b5e8c2149d83846e8"): true, - common.HexToHash("0x733b4bfea2f8dc00984e1dd9519046fb6d2fa3879dfb17d8a7a412ea34b0bb40"): true, - common.HexToHash("0x2d2cf6c97836c46f41f4e7a44629c431e6b68a402d809c663d78ab3e8b76de9b"): true, - common.HexToHash("0xae02babfafceafc23f78ca7afd2fc2958adb0be474016290ef3b5b051647fbff"): true, - common.HexToHash("0x7683fe21c5354ffd6b7de4ed4ff802cb3920869e23657d7f9bff7473b930b460"): true, - common.HexToHash("0xd3f7d0e5349f9c54275a5440dbe29cc8473b6a838840b6338c16c4673e681b76"): true, - common.HexToHash("0x9a84ac34bf5b2447d2099c53d7c84b5fcd7f288863965bbb4a544c01ece1e1ab"): true, - common.HexToHash("0xdf2a4b32de374f561ab5286df8bc2492d42911175c5fb155b7c4c382d97845a7"): true, - common.HexToHash("0xd0d737e8b7b28162cfcce86c0058e3f8f0562f63260b0299a003424e32f25e98"): true, - common.HexToHash("0x19e2624bfe370fb8453f446e7c091ac1fd5b5526c8ceecf2cd9c79c076ae3315"): true, - common.HexToHash("0x2b6fcc1206129db2f582d1b90c0ca0128a952557cd1bdde8f6551f7d3d2330ac"): true, - common.HexToHash("0xa4ac6c9d0ddf3314a7c8a6062bd1c222a252fe8df8a17fe9938a0bdcaf6c523c"): true, - common.HexToHash("0x85ecbba7a79beac66b61d9bcab98b92b0260ad425c77af813e110b9ca1797a74"): true, - common.HexToHash("0x0b9ca26a08653b42bdb9a0a8ab99b100848b03acb046db40e19d7cf4c8a90133"): true, - common.HexToHash("0x24d326dc9f0c02c156d52da1ed4c7df7f10d8b3a07d288b43ff4268c3bc4f358"): true, - common.HexToHash("0xd5fcb1e7aad92477af1c924fb4bede0dc45e2d40db2c9867ed7168c0cc28c5cf"): true, - common.HexToHash("0x2361b3e4c792e85e2265c8465392de3ccd3e673fbde8699e3cc47bad90a14c39"): true, - common.HexToHash("0xa73877b599dacc8b9c1b1a9425044525b93b953c0b788c8e195b3fab788ab5a0"): true, - common.HexToHash("0x6afc9bf5e0a6c746f7ddda0e8e74330c08a6aff06c5d2fd97741ecd933225f26"): true, - common.HexToHash("0x47e628cfbafbbd53d6b1d7a5325ace4371045f0123fa381bfb48b7e616353618"): true, - common.HexToHash("0x5092cf5a493e4d98303e7ad4d6d0c91cae636926f4e5c9adcb6aa289ce19ad51"): true, - common.HexToHash("0x1a3826aaf4448e77c8b6556245c2ae3e209c6fc9e11c6e9c21e5e65d843ebe09"): true, - common.HexToHash("0xd42c619552c8da5afa2bb53b38302c22c4fe8969252145c838a2b7d735462da9"): true, - common.HexToHash("0x6eaf3d1cd31d186f25ada7e66f58735b96bdb50800483bfb23a954aa78a9c4a9"): true, - common.HexToHash("0x047cadc8dac5bed09c80667201c2382241aa6294dc281675a952c34320163f21"): true, - common.HexToHash("0x54e9264dd0a4a184bd5c4c2d9885ce9def87febbee5c6ae47335da6c98571e5f"): true, - common.HexToHash("0x6ba020d3899ca2028d737fa132421790203b2a3ca1378e9daf6d11fb49c8e900"): true, - common.HexToHash("0x427ccb60613f4b7e358089b16e56d21fbfbd711bff35521c7f4a18d33cc77e31"): true, - common.HexToHash("0x493301b352a8b32b67dd19f017fec0e6a243034f57803774a7f60a2a673d28dc"): true, - common.HexToHash("0xa78e96cb54abd34bf2187a45597fa857f40a025c99e58773f36a447235293a01"): true, - common.HexToHash("0xac8c356dbb2ac4e8d0ad99e6b7fee04ab0aa7f1db3c63d84804652f9d8d614c6"): true, - common.HexToHash("0xcc52b12fccfaafdb13b9944c9d644b91aa01dc003784987a82730e54f33d0cb6"): true, - common.HexToHash("0x20e3744cce20bce7eb8f7f731b4967ee4b44a97336d43b9e2227ce3014004e61"): true, - common.HexToHash("0x9aa7c6bf671abbd3024f78886f73d6cecfba4e91ddfbeb311e796ed5020ce5ac"): true, - common.HexToHash("0xa3d9d0106a646704d63168e913ac77ce8af7a290db7879997f03cc2b7a96867d"): true, - common.HexToHash("0xc65a750022be43fdf387b450cf7b36dbd3410028f063faa863a5bb81404834a1"): true, - common.HexToHash("0xd7b0dd31a1e48de9d5a47c229a8aaa467fd8001c9e3ffbfeb9d0e5711fd568b2"): true, - common.HexToHash("0x695df89ab9f27f53d778f88dc2166c1a948e7ab93c3c1bf510871e102b90c973"): true, - common.HexToHash("0xd9185fb278a181278b6e19c3ef9dad649f78cd3a36d1d404ff0de7e76cc4b40b"): true, - common.HexToHash("0xda551441cdf6f0e34b6e68732889e58d83bba7a3248bc36fe9fc2d7301510cb3"): true, - common.HexToHash("0xa7f8aeb866edc77dfbe727cb1dfab870e27907bb81efa970024c7127bd7d6a0c"): true, - common.HexToHash("0x3a1545d4fc744b909e2db1aac501efd5733a16d922d6757938748ec8a47d544d"): true, - common.HexToHash("0x0a85cce37de4ebc0b0e91989c311c7929d1e617a241395da231068045ae928d3"): true, - common.HexToHash("0x43f4d22a676b74d0c39882e7b6c8b7a4b34dedaf195be9752bc379629868929f"): true, - common.HexToHash("0xb8ddc7700a1997b8ca480633fd5063beacad5467c0753035e97904d3df61e068"): true, - common.HexToHash("0x7069b8dc328d9760bfe1ce6a7c16b8a8256be7dc81efb0a81f91035502d5ec38"): true, - common.HexToHash("0x03d17e528db3d32debb424cfaddd478873968d69cc1594f2a970aefd6274d472"): true, - common.HexToHash("0x9ad5a6a0f722fbf841164da2e46ec07d56eaaea251819fb789233c7098fe0445"): true, - common.HexToHash("0x211a6680c9ad1b20df75d9888fa7203831ff0674a3f1f25d81ce5c4ef003ea6b"): true, - common.HexToHash("0x0f1af5ab0e99be3637b9a8b23e653c888cd58ec0c921e9d6ca4db6c6c3d126ad"): true, - common.HexToHash("0x642f98be5e7ca2386e2635437ebf81b37a35a54af644eb374222c772a5658917"): true, - common.HexToHash("0x3eda6a4a43524494919cdb2ef7ea8954947c5b7d86924d1cbe015e9682f175e6"): true, - common.HexToHash("0x0248d42fa85b357d63ef847c61cb8d0b31618216d17b56e236234793de123ff4"): true, - common.HexToHash("0x326379b25c04674532f77ba91f59b42faf0112814bcdfbd8145c4c1046e08908"): true, - common.HexToHash("0x13be693491434b21b9df4fb58fdcc503c0e8067b0a1d448ad88d38876a9b1951"): true, - common.HexToHash("0x03f430b086740848c8123ae44ee3b4b5c734ce0791eeca43b69e24f703b10a81"): true, - common.HexToHash("0x2c54bd240bfa661a684d08a77d968ae53c917384bd8d86029cc871b6db757121"): true, - common.HexToHash("0x6914cf340c12ae743e15b8df9fd77c4681559e5c5b19e405608ad23fed113da7"): true, - common.HexToHash("0xb8f47bf4e0662b6f98d5faf5507e93e18c5d3566751c7d131ff7d59cb9cd63f7"): true, - common.HexToHash("0xfab1d73516c2b8831faab46e60005f0b41cccfcfad85b222fcd980a4965f13b0"): true, - common.HexToHash("0x8f2fbfaa02a4acf38c0dc7f3681d7fa3888bfc24ccf52bc1d838835269bc12a6"): true, - common.HexToHash("0xe404f1175b92f51237a2011b7661fa6c72120f4ef3ffd3fb399b14bed8fa5c79"): true, - common.HexToHash("0x4766be621fa730fa0518eddcd72a953d6f879d920af759847f6cc71045adf0d8"): true, - common.HexToHash("0xe47be20419fc0dd79556972eeff3588362bac2a9220d55cfc9f0575ac72987f6"): true, - common.HexToHash("0xbfb656e9865103738c4256150e4e4d62919921355a8f73b81aacfe0bf906cb47"): true, - common.HexToHash("0xb31052469abcce844dff4432dcdab30991ecac67474aabab52ed8cdd57481854"): true, - common.HexToHash("0xf8bb27dc1df4f524ddc5d209bc523398af6ff0517b8f5a746779eefb47dfabdd"): true, - common.HexToHash("0x76db08fef6072a01367df7ec9aa7775388b370e704b97b83c6a4881d15432a6c"): true, - common.HexToHash("0xd9de9164d86fcd28871a7fb78e85b2deb193af1cb1313b45988bfd6eee31fc6b"): true, - common.HexToHash("0xc47e55a178623a347c2545118b34449129768898989c3a58a4ff15286cf2bfa4"): true, - common.HexToHash("0xe681343145daca9e8359b18db9fa6f47bc78c78eac26ce6ebad9d3ad197b4615"): true, - common.HexToHash("0xf25b63c038f23ec1d748231cdd2b4be8f37b4a03c8e00eef3714bc795fe3a246"): true, - common.HexToHash("0xf5266ee7cac2a0f7714cd34a2dbae43ff4b62829959993b7c2ab97aad7ceec19"): true, - common.HexToHash("0xe0cebd56193fa9b7465a413f246953a9ec84cb75b4270357882c7c026dae2ceb"): true, - common.HexToHash("0xa4ff58e80b1e3e38b5c74597d650d90406ab24d5fb6504e7c5b7a4ce172fb9ca"): true, - common.HexToHash("0x07e70e6aacdf1591266f83a645bd3897b64997da2a75d518b37827d3aa7785a6"): true, - common.HexToHash("0x227cb2d99096301af905f3074ec308d39bb71f07edd5a4875d0c6ed178d26f79"): true, - common.HexToHash("0xa4194a5ad34e8d54350a14b4cacf5380be000140897f4981b9fa975efb4dc96c"): true, - common.HexToHash("0xf96aec960603731116bb02018a1679c2411571c171f367ffec28fcbb0d20f294"): true, - common.HexToHash("0xf250fd4d2887b25b2a7383b29c5f457e4d5f9cf3f06693db111aa2c38325a8fd"): true, - common.HexToHash("0x49047d501458da560a3efa8166dd29d18639c2ee03d7f218e7ff4d6dadf2ca13"): true, - common.HexToHash("0xcbf46f1dae6160e5ee0e7fa013b328dbbfdaaab102fc0fba61573855edade355"): true, - common.HexToHash("0xe555d5f8bd56106a32f428213f2439f2327eda0ee39f2bcf7d90a094fd9cdcaa"): true, - common.HexToHash("0x585a1bdfa84866e8004e8861e1127e7326ee195141bc406cdc690a77d5267080"): true, - common.HexToHash("0xcbc56bf0c5150231930aad486582feb499c49220d8669d3c32259cfb9226849b"): true, - common.HexToHash("0x5fc45fd72628b5c76a5f7449147d570d2e6ccdff801cc70ee54bca050587acf5"): true, - common.HexToHash("0xa7c0cb72fa86eb8daa533db2930c789e43b7933c3baa86020e77260c56ee3e63"): true, - common.HexToHash("0xae19c4d40d1a1d5e9f3f6bfa3f0a38c1bb42f577190ce811dcff843ffae9160c"): true, - common.HexToHash("0xe22399326bd95ef28d3693fa15eaafb2f082118c8fe7c2dfa788c86eb079a16c"): true, - common.HexToHash("0x8f16d6ae36d5cd720824ec90e06b98b6c2a0f460721f3b31e6a5e4596eb73b2c"): true, - common.HexToHash("0x1d8262dbe0acf3056a262c14e757d44d42c713456e8d2f3b0c5b79a8483d522f"): true, - common.HexToHash("0xae94c0239050ffdc02da3d3c303b8693e3fae988e7d6eaec0708963b0ed70a49"): true, - common.HexToHash("0x67704365fe0a34047d1dc33eeb4671d831da650f6183b4cd5eff5139aca20f55"): true, - common.HexToHash("0x65476688bd20a532ab70894920fa55892268b2d65b2cf8191d06643f878404c4"): true, - common.HexToHash("0x527b5006a86062cc67e3f6c9e4b39dd33f924b374098c24e9afe7f6cc5c44a2e"): true, - common.HexToHash("0x516dce66801d42baa3d463fd9eec1e32fb31148216b7827c4900c81e7753f06e"): true, - common.HexToHash("0x3e66a16cdadec53c6a0884a67d993a941d73c55a91b06615e0b0951646e02a62"): true, - common.HexToHash("0x80a7ef330219fe55c4e184f93034912b298e9bc1f93209015f8372bd0815dfb9"): true, - common.HexToHash("0xe250fe2a97c6fa693b1686118c8124aa321e5bc52312cd4fa24c8dd463dd7081"): true, - common.HexToHash("0x170a68fc1545d0ee8ff713167fcb6703949619f5f0f018e03e41ccf4bb1c36b3"): true, - common.HexToHash("0xcfd7ff18d00ab0f0dae434c70e5ec7f39fa8f32003627b1924f6034a21adb458"): true, - common.HexToHash("0x17907d507ba34793525cec8f80b7278d11618b014bb7951005349b2abbc8014e"): true, - common.HexToHash("0x83e6f439c752068697b4013ea1e74aaa5a9c0a42548bf7f2b11bc07b65815478"): true, - common.HexToHash("0x5d856cc73d2c8e66130e688fb0334b5bac232ba165986f1289880f595229c674"): true, - common.HexToHash("0xb7f8d163cb125d7ccecd7714be9faf6c09abd8ae2985c5bc53cbfc771e5440d0"): true, - common.HexToHash("0x23569b3349d622b8a913f0b8731edba0c2abc6665026c17e807a3c861b9ef983"): true, - common.HexToHash("0x2193d2d6ad463328bd3132e31f95f1d5c9418bd00e6e85c1372b56f0e3192a8a"): true, - common.HexToHash("0xbdcea5dc7f845be6876e8a75e303e86136acf7c039125d48f31d5dff2579367d"): true, - common.HexToHash("0xa7f2512d28898f265ccf129aa16acbf85af86457bfe272d208260e443b50e84a"): true, - common.HexToHash("0xcd40eb21b39a6847917bbf520b7f0c12d8b1dd15c29dd90adf32a3676e6f3a45"): true, - common.HexToHash("0x9b783d1c47565a71cdff3d76790b4591585ce90581bfdd532fb3016536a3beba"): true, - common.HexToHash("0xa8e907966fc908fe4a96ac252c472bbfbe0777275ad3b58a2230774b0d738a09"): true, - common.HexToHash("0x0504da16c3586ed37aa17aed8ec566b76d3b3a5e9423d765e1c1ea54c9318f67"): true, - common.HexToHash("0x1f2577c320a3c017f6b3dcab4f4c60e3c36a8fa99717ec0797cd3a39b206f5f4"): true, - common.HexToHash("0xb36371d53d9e64ee041a49f80c26d54671b9f8d49061ed1dd5aa7dc69d1f0986"): true, - common.HexToHash("0x871d1c1118fe1cd9b772a2c09d692ba79606ce40cedd19611c888fcd093da880"): true, - common.HexToHash("0xf58d492a4639eb79ab7d99d51976a9150ed59e7bdf597db7e070d11e52184ed1"): true, - common.HexToHash("0x52222146980e501bbcd02cd40d08af70973cedfdcfc12d407411277116c4fcc7"): true, - common.HexToHash("0x26bae03ba33b31ca39d23021ef7fa5cbb9a02e39e8bd8130ff147f368ea0016c"): true, - common.HexToHash("0xaa9c1dccdb4e0faebfe35b0c0f12274a0309d0d8bfa55e5a214afedf1259a59f"): true, - common.HexToHash("0xba29ac70482f32e4d8b228d7b88556424a19f64ec651ed67196880efb759fea2"): true, - common.HexToHash("0xfc0db100ed614ba903ddb745a274cfda1118dbf27b65ebc0e1891066030b2caf"): true, - common.HexToHash("0x1ecbc43eb07fd11c2e28e32e520852182eb1412675097a9a536ca32c967f135b"): true, - common.HexToHash("0x3cc64d93714357249cdc83d5f4d8d3747efc0fc1a4c8df62fe6078b3b67b3745"): true, - common.HexToHash("0x4b03f230a327c7cc2bf17e096b630eadaf06be28498f8d44e288e43eb3ad1781"): true, - common.HexToHash("0x032a0709d31d5767ef6aa9bb9eaab2313ef75e50ca299fc587464fbf49f21556"): true, - common.HexToHash("0x918d7a6cbc860adc11dded68bab435f3fabac6e3e2369e251b8f42f89086e04f"): true, - common.HexToHash("0xca9b06e61da4a30823d4d6ef9ec0c28329c5d4fe5d093a07729167945eb667ee"): true, - common.HexToHash("0x6021955f1300835454822aa603ed9f5346af4fd59e812c555c772f9ed4f98d89"): true, - common.HexToHash("0xabf13c511ad1b74b5d0f979f9fdc25fa300f93ee8904c166e327ec8271580a62"): true, - common.HexToHash("0xb66eb229183df9b7c73747f5e4f8408dd40fc4b8d4340f450c8d12e8e00ea96a"): true, - common.HexToHash("0xce312dcaecb83062b06fea4d022cc6050d992ff7c44296df36f6aa0e66d0f068"): true, - common.HexToHash("0x4b232971970d87549a26a98e417d62229f0ef1eda48c76d2db5e83e7e1c22e03"): true, - common.HexToHash("0x9e7a3e489989885b9d44987e57745a6ac940ea9af87aaef57cfe554fef035c59"): true, - common.HexToHash("0x70a91628bb64254fcd9f8c616be55ed54f33a42fc81439b4ebe88e647a4fa31b"): true, - common.HexToHash("0xb3b3997a697ca76612e5bc2c603d0b9f8ec48135856c31e7342d80073ef8dc89"): true, - common.HexToHash("0x9d16be18cf3ee549ee2218af536d964a60a6b595f1660f3c2d71d8486f7be85e"): true, - common.HexToHash("0xc40b92fd03aa4d2ad330332606e615b26618600762d544b49ae97d1d5933ed92"): true, - common.HexToHash("0x270ec91267cae02b75c1b738ceabcf4b6c7b53075872fe97665b1cb816f3b621"): true, - common.HexToHash("0x0d0ea3ece3ada99e9264e1aeb4f96c6843aabf3e190e3cc9485a4bc57b78a14b"): true, - common.HexToHash("0x7ab06a229f6dcb989643c507ccc787416ca1f88d5d6bf750551097f752c857b2"): true, - common.HexToHash("0x2553be735af16ba947d0ed837cb2d39e761011eea1426a2c17add209b84d5833"): true, - common.HexToHash("0x2da944254b4f3409bdfcec0696e814655c95ea84b90a2a6ef0d47e7365556816"): true, - common.HexToHash("0x320ac862829f418456769a5a68864b32ecfeff49dd12c05e7ba08f6a40444f58"): true, - common.HexToHash("0xd7af3a7b2e973834327eebc11cdfd8a091d2f513b9fccead64b8082ed897c7e1"): true, - common.HexToHash("0x52f8761a54b1f1b66fbed6b93e6d0df1d84611af41e092a1e74638f360da6730"): true, - common.HexToHash("0xd340cd653eb571b3364fb43ffa2cf32a9ca29f04e5c37bc21c2d4d66c9b7561d"): true, - common.HexToHash("0x54cea93f4a27ca23f255c8343269a7906bacfe534fd5c6f68990064b68ec084c"): true, - common.HexToHash("0x6e3a29011993451f7ddde854affde0e108d98e004c0de831b7c615ec1eabc4e7"): true, - common.HexToHash("0xb656c698b673e3090c6117c943fd3d39eee7f5003f9b3a68c53b673e1f98edc2"): true, - common.HexToHash("0xee490048e481fa6741b3c7b5fad48fa64ff3c1a7af251930244ae6b3ffa5d282"): true, - common.HexToHash("0x3027da6b1284b4ae5df0845ec1b0e9af7945341ca879ae7e04f4dd04f01fe65c"): true, - common.HexToHash("0xa1da8f46f58c66d1a7b164472b72e4a933c475741ac4651dad369518bcb52c97"): true, - common.HexToHash("0xbb760b39ecbb0ccc19164bcec5483da239b644215bcf0eace29fdb9893a0a204"): true, - common.HexToHash("0xea620cceac827e785cdb97b493ed974e235bbdbabc145482f9c00a72103c19e1"): true, - common.HexToHash("0x7d44791b5f573881a717dc6421bed9d7e4fdcce63a3a92d17a199160d50e6bd3"): true, - common.HexToHash("0xa44bb6c90cf744a950e5c8643ebb011d9e00a2be2f3bfd330199a6470eeafac5"): true, - common.HexToHash("0x6a2115f22ab21d200e98c89921ec532abcd829af20664de738c74971fa7bb1df"): true, - common.HexToHash("0xb0237875b31f26c2e0f772e3ea5adce3f4d6f643a1b13b14269f46837f94af46"): true, - common.HexToHash("0x68a75429873f782821ad2e007ceedf1a51fe0e7da9a99e0a4451cc29b720d756"): true, - common.HexToHash("0xc98d8cff57e5986dcbc6751bc27f3df33af8aa2fb93c48ef2e95ac5463bbbf4a"): true, - common.HexToHash("0x1c9f7260e0194399532ece830b5cc756005ab87b68dc94cfc68029c4c9a24461"): true, - common.HexToHash("0x0c63c75e201636f729598c43b81e02c0a131c9af48ee1306f10d582fb31dc913"): true, - common.HexToHash("0x07c3ac7a3e6e39d62e9e91a5868a4d6dc9a7d44702cba79cc9e1dfe1b99ef5a5"): true, - common.HexToHash("0x1f674dfcd526fe141bd16bbf446d55681330665747345f6abb509e51bcc88a9c"): true, - common.HexToHash("0xf06548adc1139e903421c7b85e2e4b74364683baffdf68414ac3ab8dfb04eaef"): true, - common.HexToHash("0x5b55b2b96f81477d2ecb178dbeba20cc7b898ba5ad94df9dae4b5124cb5fd2d4"): true, - common.HexToHash("0xcede8afe508525988e3b1fcb9347df0dd1a16bf2ff3295b53bef7f48e515ed93"): true, - common.HexToHash("0xc812f99647be7b11e18f249989667b4930814502ae7bf3548d6948616b23d67b"): true, - common.HexToHash("0x2d6e7ab7f1688292630d47ca5ac80b2be46d6790db0480f036b4855ce3b51b3d"): true, - common.HexToHash("0x44b4dd5838eb3e9d3ff7d3296be1d0f79464dea026a9a81b10ce5dd77988c624"): true, - common.HexToHash("0xec88e3528ae0a3fe2753d78c7cab4f0350ce42c353550bdbec5f3e16454598dd"): true, - common.HexToHash("0xeb986bd982c217be54a6f043a2581f3b7368348e19450ab0711e428f3b47be54"): true, - common.HexToHash("0x6a0a15d1f291f6e939eb54567c324fc2d79c5c820a3e684761bf1dd40f2c97d0"): true, - common.HexToHash("0xb028b01604f5df99a6fe66c0c9b023e8cda718c54475ba0db179d67b6df5be78"): true, - common.HexToHash("0x5311f67e507524de561f29952fdae7478ebf2af9ff79084aae1f7e51f77eba42"): true, - common.HexToHash("0xa0eb8390abfe2f074f1044585a4516c8536451dc08bf852651079aa2c1902524"): true, - common.HexToHash("0x5c2904c90259403ab27a05b5f2d722d91133959ae373e2de77fe4e688e88dcee"): true, - common.HexToHash("0xdf98a9dc3cf8a247806a66748533b55a844596da1c2adeae2c725a49d25e7d42"): true, - common.HexToHash("0x13d5529edf34133ad4799567a67deb71ffed3b1dff14a8c77e9ec7fe727de166"): true, - common.HexToHash("0x387dd69b3549d93b42058897101484c90ce7d7a3511baada86d032c8fa75d905"): true, - common.HexToHash("0xc53c4b364ad00e130313538b61075e355337466b6c1a7c713371add4e79ff76c"): true, - common.HexToHash("0x79a7d7127cd5eb426c6ab230618de3ac648591412680fd7e11052382c3632f34"): true, - common.HexToHash("0x565f323e0f7e2004b7f0d8e9c25b33623b007205d1354f7d746e107b76d9277f"): true, - common.HexToHash("0xddce93f59535544b51581db22bcaf22b274c009cb45e2b245a53822b4bb229e0"): true, - common.HexToHash("0xa601445a2321a8e1e54887bdd08cf0a0d648990225c36f1fdd9679fb84ebaf7b"): true, - common.HexToHash("0xac6d9b2548ec2971cb84c4ca7ede2978e7b33d77d999cddc90b8364399c4f766"): true, - common.HexToHash("0x8164670f5383dd651fc85106ffcdce1e6556bd04ce078f7e4667f7e9e8c6eff8"): true, - common.HexToHash("0xb1689853d15099c15521255c276259e299eb53e4254f5231837cb33b5b36ee5f"): true, - common.HexToHash("0x4f1e8ecd1b9d8a5ff23b00a1d7ef1b3a842c64101df0db0bec9b9547421ea370"): true, - common.HexToHash("0x9f3b4bc3c23bc07e16cca80a416c988615e21f4be1ee22052fc9e425db3d99c3"): true, - common.HexToHash("0x512a10c93c678be2bd2efeddb6d7b7dad24498489612b5dd5030d518cb843e5f"): true, - common.HexToHash("0x9304fafcb43c572005627a8f76a89fc28aaeb36768a8249641a722d9f3d61057"): true, - common.HexToHash("0xe669fd3cb5cdda1a7e9a4ff06372e302c4246f77a8a13cd456eaec026a36a360"): true, - common.HexToHash("0x73191da0ba0585ed58cbf77eb4c8d3c4be167642a1fc6497f6c47167b13cd600"): true, - common.HexToHash("0xa98e65d270acce38c6a61aeeeeb421927792dab87cc7c48336919665c6fe23fd"): true, - common.HexToHash("0x7e2a097a72e10dbf067c15369e599b5fc29dce88475b79304658c27026c0311e"): true, - common.HexToHash("0x0e7806d5a32ec8df4a36685f0a16d44adcd990eaf4c340e8c17f4dbfa0b327e7"): true, - common.HexToHash("0xf811cf94c64e6b1b9b3712488ffb6ed8aec53afee437d5bee2257a73e58957e2"): true, - common.HexToHash("0xbdcd5ae438d37895705c878265f42791e4c592c97cbacad3b4917d408ca4f4b5"): true, - common.HexToHash("0xd39e393f468aff64dbaf88960ce7ce19fe7788d2de24c86241744436a6638feb"): true, - common.HexToHash("0x678e2e9ea3ffc2a1a56e406dced3cfeee97bf260f610daff80f111959ff895ce"): true, - common.HexToHash("0x41f4afc92cd640b1e8e3df7ec53cb03de917a216314526ed989caea6e269c6a9"): true, - common.HexToHash("0xe44a2f86ee92e6249d6dd34be238692d80826d10b795a5fd1e11ac3c33598e18"): true, - common.HexToHash("0xb235f3c0ad4b1d477b43a4728472bc6d9bc1cca72aad3b0f8698256a56a6c463"): true, - common.HexToHash("0x015e61a3cc1f85566e9c038ddbdeb0aa3fc13b558436b80a48482bece3759128"): true, - common.HexToHash("0x0262085a6c16d412c4609b0a3e77d18ff709d961070831219dddf983a1c75b81"): true, - common.HexToHash("0x1b5e00cb094be562e493abf434a934330219f46cf6ec498728c581cf04dc7111"): true, - common.HexToHash("0xb0eb2ce6c2bed2067b1e7d621d9d07675cbe53e5a9b93ec6d3042e1f23447412"): true, - common.HexToHash("0x8a8c45dc9acea82f2834e5a11647bac52c841460a4f3c316c709d95c5bba5758"): true, - common.HexToHash("0xf438a9f9efff80528bada491ce6cfa1adb48bdc9b29c9fda96741c41593eee79"): true, - common.HexToHash("0xefe711f28bb1413925d6625fb1826507983e3b15437c22e6743ea2224653eaaf"): true, - common.HexToHash("0x05ce7602a9b29064779f37cd8ed70a25910a2b3475ccd00f1ccc8237e78e2808"): true, - common.HexToHash("0x20587520b27f3f2b4a3b95ff302d7ff97a9d84aaad3a475dbf0ec55a8698b1ad"): true, - common.HexToHash("0x5f77ddb672d58bd94db3954001fc77316c58665fe45151b044e43625be6ee656"): true, - common.HexToHash("0x51093802b659a2ca0d7ce100bfee7e95a610ee201ffd81b4122cf1d3e5772037"): true, - common.HexToHash("0x0d8f9e36cabac26a4853e54506c1a255676ccddcf29d8be9cab00f70c45a1516"): true, - common.HexToHash("0x7a2f4babe47e0cad2eab4b061b9e295e8a177a7987d527c0233a7f272f15f405"): true, - common.HexToHash("0x88d553623f58b9371e79b0e0aee845c229670e3b73d1e8984fae6a7b076ee64e"): true, - common.HexToHash("0x99317dbcfb57f5cc71b881ad0236f953ad8d003d1f1e4cbdc3ea41b707ff9bd8"): true, - common.HexToHash("0xd4444b07f3b3f0482e000cfb139b7e83178d84e0a32907c17d8ba7543ac780ab"): true, - common.HexToHash("0x21ec18f667ca5a1375e23499da9c6b2bda07134316762b765bc291122b8c0cfb"): true, - common.HexToHash("0xd31b45a1e1cf3571e2821b80e7fb913ce04c98051dd60c1a2c69bfbe0bb6ab90"): true, - common.HexToHash("0x35a124d0f522ac1b0564c5afe2138d4c9b5d4aed6f7209d56db8ae01b644cbff"): true, - common.HexToHash("0x35526bd44c1f6fff0ab7a6f8cb6f417c96e6da410d254b878865b92d1520dff8"): true, - common.HexToHash("0x4ddda98fa604769e5aa8f409de426b958881c8ccbf57e63b747dc0ba80697fec"): true, - common.HexToHash("0xfc982021499539c765a8bff688f3a6c24ce91fa24c033eeb8da52cd1369ebc20"): true, - common.HexToHash("0x09ef437aa9bf54cd9b74fa4779626a698696868656d8a920f5977280adf76f85"): true, - common.HexToHash("0x9f0b47d7840104f7f7cabaebb7e5fdd8edf696ef198083ea3bba34d25fcf4d51"): true, - common.HexToHash("0xe6806e36b9d81b4711c2b352dd71f4140c4df004044463e866cf9ba7fb051e2d"): true, - common.HexToHash("0x10f7118f2cb7c13afa9af2aa92c4ff9e876bd679e9f0559d628fa4ca22b3b8ab"): true, - common.HexToHash("0x5098422f3c870ee234be286f33d83b8cc1d791cff6db6d432f84af3d1b463088"): true, - common.HexToHash("0x99b9fc36a47c3a07a1fd5c211378f014be48b3bb53e2b4a50b5e51085b9dd8ae"): true, - common.HexToHash("0x3483f22e57682b9e077f04fe5317986afbf72c6ed12864bb7da3018e6d6632f8"): true, - common.HexToHash("0xa82d34795bc98ac911323e88e3dd2fe8ca206229aa689992f3f11379388c1cf3"): true, - common.HexToHash("0x870b54a21e270b2e3fe79360df0fbe21d456098c35adf11794ae4f5fea5953eb"): true, - common.HexToHash("0xe5b2f42fb70c2ffb4a4ecd4f51feaa5895001b92e580b0076b878f0d5c19c4e1"): true, - common.HexToHash("0x610d8975021149adbf5a46748303fe8a9ce08e17e607267a66798693fe08a85d"): true, - common.HexToHash("0x5f86fcd013d1630b27b31ecd8eb024946585fea8d8fa6710c8ec0c75014f6527"): true, - common.HexToHash("0x848b6f76053f90941b9d947313ea652497be2fabf4c93ec2b1d330d14b9daf4c"): true, - common.HexToHash("0x25a40e894140f49afc08d03c9676cfb54e5300671d19f538c8c3e62ac6d91c43"): true, - common.HexToHash("0x39198fb12e07bbaa2569d134beab8bac0d951cd8a3788acbd6bba21e08c7f3b1"): true, - common.HexToHash("0xb915b477b929059a331edbd5aec4a84df74c305e74ead400aac85fbaf34c84ce"): true, - common.HexToHash("0x4aae474dca928ae799442df48dc6c93e4457dd098fa02a8185c9c8bed3559ade"): true, - common.HexToHash("0xecda4ef5d1f12a0e31a7ab8d5bb319b0efecef3db16698672b9a6191311edfca"): true, - common.HexToHash("0x8ede416ba67a081bd7cc6240a7a8b6844f8b0a60e1c5ecad293e5988cc491b4b"): true, - common.HexToHash("0xbabeb5c2998effac23de5bfe89469a22e615bef3e0f3713794e20b98bb1e52b0"): true, - common.HexToHash("0x4149b26db2d1e2bef9014b3a34dfad707f8ab91e46da30a61095b6993b19cd9c"): true, - common.HexToHash("0xdacf1acaeb999326153f75adecd41fdead947d6696f4f9ab4d75bf119ed727b7"): true, - common.HexToHash("0xcc954e021677e8387e57454f833b58c70d76be583c2c99e8cddee9902e4d90ce"): true, - common.HexToHash("0x60c517141066a1653fddfb55b75245f3c10b185519edce6bd4fd88e1bfc62a17"): true, - common.HexToHash("0xfc19d15087a124ac1bfdb446ef46942840b7139ad3667e714d6967e162d379fc"): true, - common.HexToHash("0x0234589fb7aa22edf0578d5c01e3e8237b5a1dee9d55b6001a41280a68770de5"): true, - common.HexToHash("0x385909592a6f53a479f70e2160c89aaeff337558f7c77d24c95bd660c488bd14"): true, - common.HexToHash("0xf41644b522550e3566df8df668a15b0077744019bcb36a9b278157284fedd8d7"): true, - common.HexToHash("0x12e8b071f50adb52c5cb698d1f9f8e4dc79b9f0633554d46eeafc4caf69fcb38"): true, - common.HexToHash("0xd77c17e6e62eb6a86b24296f0bee507ffcdc53018cd13cf071e61908fc525daa"): true, - common.HexToHash("0x5788220d6110d83d4ab6d85c418b52fc288338155736a31aa7d5e7e0c3564e00"): true, - common.HexToHash("0x5130637aa64ffe49ec19efc5f0e8bdbaeec83d390f7cd4989300ae360a07fab6"): true, - common.HexToHash("0x060cd620e9058225d5cf81fe90bc1926972dde6aaecb31c95bf90b26dbb87e34"): true, - common.HexToHash("0xaf73d119ccc70b0c6203b39893df72d046f516f02e66d9159f616a2eee9d3e44"): true, - common.HexToHash("0xdf916906f393e95cdbe24a15ea694344940514adde5718764a3de13a5edf412b"): true, - common.HexToHash("0x65d00569ffdb6cd3f3f0e7740add66757515d3037f6aac6a5d9afcae76cd348b"): true, - common.HexToHash("0x34b47193cccbdae0372ee2fce70997d76b204506d53ec6a67d78935927c2fb59"): true, - common.HexToHash("0x98ae5632c7401212c5020b0b05ce83c61b03033425c3b759b43d36a958ed284f"): true, - common.HexToHash("0x108bace2b7b5efbdf89908e608681653e488fe3d31578640bfa460af6ae18e9c"): true, - common.HexToHash("0xd39039a57239ca606ed17e97529fb913ce3ae2adaead091e5440f90ff4ea1426"): true, - common.HexToHash("0xdaaf1874e1e138047760ce62f957c2c1e49eafcba45d509de6356c790177ed27"): true, - common.HexToHash("0x403fb0cdda7faa92ebc2a13b9e565d2650a179a21e6987a28353429393bc3f0c"): true, - common.HexToHash("0xc97125eac471a6377b2c03a82bd1b740b88019c254546a24c50fcdfcdf7c00e0"): true, - common.HexToHash("0xd3478e920c57ca3cf7b81023f9d23910088c25a53fead7eb6b083676b4bb468f"): true, - common.HexToHash("0xa79aee9d62ff4cbcdd7a4a9cd860f3f0ea5d957c8c7fdabd3cc822b38577ddb8"): true, - common.HexToHash("0x9f5cc7ec280cc96d46fe35fcfc345ba087cf2251866b5b00a2ca5456af29ef12"): true, - common.HexToHash("0x5e3535bea51973084eb43eeac3007fdb3224fb29a06520ccf6a37d3cabfc5dc9"): true, - common.HexToHash("0xd139023cbab698b29f453510e75f4d6d2cc58a9b0803697c7efd78666bcecbd8"): true, - common.HexToHash("0xc2283754e5a1e75e9afc2f8656aa731a5ad781d4a5b7ea00600b5b7175e8a8f8"): true, - common.HexToHash("0xbac258feea96d55e7a1bd48e020141e443aabe65de31f79276b9dac5b61814c0"): true, - common.HexToHash("0xcfd5fdf4324ad3feb36f9784b7489438898e28e6ed12a61976c5e8d89589797e"): true, - common.HexToHash("0x3a2c08a708fa410cfe84f0e0f0fbd06743cff9999ba5da537522a9e1cd14122a"): true, - common.HexToHash("0xb87c3c87742597202794025014200f5dd6e03a2f23caf435d6f2ee6b64df6c83"): true, - common.HexToHash("0x647682dc5c548411c5f394df4fa353064567129953b137ac2115126a1c29df9c"): true, - common.HexToHash("0x6a1fbf5a2a1c441d00f0ab1c2e3cae2cf611ea996215b49ad817dd60e4ad6c1f"): true, - common.HexToHash("0x9a6a8526b7a8c9bcdd2d2fccb678ca144daefac4f9208ff3bd18670e0518bdd5"): true, - common.HexToHash("0x9338c5bf96be42b163165132a41d13a11deced3e695e2aad89949ef3c264f1cf"): true, - common.HexToHash("0xd343b55f3e4df4e69e72019ab704cbed84d18faf3c335c992262634c990085be"): true, - common.HexToHash("0x1e373f22b539506e47ec345ede62ce7f5e2a555965f42a6b9fb0bffc064f0c5b"): true, - common.HexToHash("0x5da1b0ef017da1f06a6693e00aa85096010f74df85c01aebf31ee2d3d3d8018f"): true, - common.HexToHash("0x4a7d7bc98cd65bdc21ffdbeee5e1526bcc10d425da41ae174e1f795c148ea5b5"): true, - common.HexToHash("0x6b2fff7dc34f37c8f991653e981867ef31fc885a5aeaf31e5dc93b7a5969c1f3"): true, - common.HexToHash("0x35172c908646b16e9e7f065266a4b03b91a5043b3cdea3c0447c82b748106b2a"): true, - common.HexToHash("0x087eb07043f1dd67e16e57a76b769f5cb2f7160a271e1809bbf907499c7042bf"): true, - common.HexToHash("0xc5ff9f439336ad7b3ec477df8bf43cae81a2cc475dc62b30b00456a6bf433f61"): true, - common.HexToHash("0xc970c094bd7085a951c0ffdad58a42252b06eb22a43311be7909daa872b0d2f5"): true, - common.HexToHash("0x1e3e8d0fa2fecedc23eb96e3312dac42ef237f5a4fd397d44d76f9fda9a92049"): true, - common.HexToHash("0x6271ae7b81cda2a079886d77e76e48d1acb4fa0af770a081efc5b3ddef387556"): true, - common.HexToHash("0x387910b737b3984b8c81acac2dfe56a1274e4ccd45898ede5663944295231c9a"): true, - common.HexToHash("0x370c713dc8cb251021427e528fd2f68e51f3301fb02c59e0f1ba210fba5ae411"): true, - common.HexToHash("0xb5e3742594fe6e18ccfcaec45129f153216a3c011282e50273f8dc6cb6efe79d"): true, - common.HexToHash("0x2f79d1577db6d22b419ef302db36f40ed78e5657b50f3eb801827eadbc65c81f"): true, - common.HexToHash("0xa671375fb20f850125e452480440b58a7e10bd63a894c1bd528af0e91cffce6c"): true, - common.HexToHash("0x00c2d1b541645580b0b36c5e71003934ebe75f00a2ad3ed25b8411c92e77c2dd"): true, - common.HexToHash("0x68ce34ffa24210afb9692f5b656ad287177faf31411be2ed4e5f4335792c3334"): true, - common.HexToHash("0xe9f83631579850c8dbe9e80041a7c9b4e16de2a6c6046c24562c542d0cad5487"): true, - common.HexToHash("0x9a66ffc9be00ad76c30cf9f6b4b27b5a4d7c3e49bb1730b270e17491e337f4e8"): true, - common.HexToHash("0xda8cc5d4384829c3bf1c9ede255c3fd3356af7aab5ebf6cd8e6b1be7cd6450d3"): true, - common.HexToHash("0x1797edac4f2b4218fab4976040f83f69fd106a98434e19db0efc765f4f5312c6"): true, - common.HexToHash("0xa79cd1351dfcdbbabbb2b3aa78204b0acf993b7e077e1ed75123c98cb25881d9"): true, - common.HexToHash("0x30b13618a92e756093c2a8c0826046340e1d12c0b8865b398cd59edba502355f"): true, - common.HexToHash("0x7846f31f5d9a888583dd82c2e7fd784d1d7be57c7cfacfb3d7828f5f4a093b7a"): true, - common.HexToHash("0x79bc9f1b31b1dccc2b4a586969cd04c04f59808e3582f8c6b908fa4ffba8f090"): true, - common.HexToHash("0x6854ff8f20b3b7402bbd3178f2cf5320bc4f1c7f81d82c6aff5a0264fa91be5c"): true, - common.HexToHash("0x01661d9cff0b7e2175e5a3cc5f5ecfb4f621f846ed327260cca935dc42257068"): true, - common.HexToHash("0x79754942fd7ae619e70c83bab438276c145946bde1d552068e9ddd2f08ef9b9d"): true, - common.HexToHash("0x8023acdf497f81943d63778b786e14bd97afe3ae14f20c3ae1778f050235feb3"): true, - common.HexToHash("0xbb63f143c0747ba3f3a22c5198d77866829401e08856f7b65a8fa7b81bad8ba1"): true, - common.HexToHash("0xd3a2b8dc90b200c9b116f6caaf77d7275cd551e500346a16d422935deaab6aa3"): true, - common.HexToHash("0xee73b6e175e7a1a8462fad6230c4cad8063b577739ecfa12c514a0009e5f0519"): true, - common.HexToHash("0x5b77edac694cfc7225bef2c24727d44a0e801d9d196bcbc7633a2a8139c2e928"): true, - common.HexToHash("0x581837d7a13aec7f2f85ce77e550ac3cbc425735e831d7b9ef2bcb2f6b5571f3"): true, - common.HexToHash("0x0de62dcf166ba4f690b716396ea8e88c6a7c4b300efc944bf9a510eb2740eeae"): true, - common.HexToHash("0x845f5a0a593b23ce5dc97a17236c5d230d0d687fa039b7da997ded12086b3fa4"): true, - common.HexToHash("0xa5edd7c303d2e28e4746d4e0c67bcb1ab18e119b1b75d679fe908e4e341b6438"): true, - common.HexToHash("0xbb03a6246491750cdb844cc88121f9472c29aba6717fa4535851df4711b55b72"): true, - common.HexToHash("0xb51280fb3384ce404dcdf894da5b7d25c089895e6dbbd60ea268317ca3ea72fc"): true, - common.HexToHash("0x062e80dc34810548a0ecc6201a2da026248740100acb4d070af978549192edc5"): true, - common.HexToHash("0xf29dbc7fd08bef5c60c869c5cae2d4016021e1528d1ad1ed5851f6155c87d925"): true, - common.HexToHash("0x702d9f1b4caeb7070ecf3284cc14291acd972ef7717fc8d02dfeeb073bbd415a"): true, - common.HexToHash("0x3de11e5ad0857d134d53e23e90b1cf25fe999e11f95dcdcd86c3a309099aa270"): true, - common.HexToHash("0x12f03e74e2c64ad0018c64001911dae03f894de7d71da1c18a2c3935035597bd"): true, - common.HexToHash("0xdb10750e7d6b7361c7d223496df0278ed30d2a51ef9a84647c19f73dcbe77dfc"): true, - common.HexToHash("0x1502518dd184248e805f665b3a8418576f91e7e06da88b98e27165e2117a2917"): true, - common.HexToHash("0x1d50671d1c0218fdc0a5991df946fedfe285e0c89bf5a70aa2307077c3b0688e"): true, - common.HexToHash("0x687baecded2c6706f60cfa5e4e22ff53234fd3119f10383a42245bc0be2017cd"): true, - common.HexToHash("0x7f0092be06358a2331564b8a2759e38a6fba1f677b8de72243ab5fd846021c63"): true, - common.HexToHash("0x28795876258f6581f71fe212b833b680a770965db5a2a2aaa8f66446c642c828"): true, - common.HexToHash("0x54ebbf0e5ed689277b01bafb2b24c2b2ee5e70ab2f5198fd7603923f5d5888ab"): true, - common.HexToHash("0xbbb783b21700b48a082497329b0493ba8dcbe0b5f4bcb4ff6847a3ab098679d3"): true, - common.HexToHash("0x1d19b03636508ff3fbba1c277661607d874d75a1114cdb0427db80198f924d7e"): true, - common.HexToHash("0x89b080d9654076834f103e211e474986d645bf08c5c614d3c93cd73a15625460"): true, - common.HexToHash("0x9c977f8d0f2d2b5ade8c98b00b50f5d53d02f0a007e4d998d99abe204a8ef3f1"): true, - common.HexToHash("0x826fac1ccbaacf9ae423e1255b5b5bf5e20f37ccbd6bea3cb19da3d5345601e3"): true, - common.HexToHash("0x424028b9a8a25745013b3fbb1b3b5c72a49bb8aa6c2db44632e4a9d0de755bc9"): true, - common.HexToHash("0xae5618b0fdc63bc3e79cc8819e82d4d84bb62edaee8de3f5ce0e73be2bb079b0"): true, - common.HexToHash("0x73e9e6b76e9bcb1e2c25cb925a256c1525543814443e5584645fcd0b2fd5dc69"): true, - common.HexToHash("0x65cfa5845a8b76a8beb6a5868acba645111a450d9bfca1fb04fc8b89e6b74d24"): true, - common.HexToHash("0xe7149c0934d1fe64c50a977cbc4e116e6e05be820a1bdd4e2985df16e32bf333"): true, - common.HexToHash("0x57c999c02496531914b6417deb7139bf71efa044296abc2934caa87f4d7d0b0c"): true, - common.HexToHash("0x3a349f3026f8aea1ead8cefb9564b81a0ce12c8232299cc33f2d1ae292dce081"): true, - common.HexToHash("0x5afaf4048f58ed285bb793984e92987954f76c14a88f6e046a0ce98952c5f46b"): true, - common.HexToHash("0x93790c1c48dfd540b8393a9d36ac9f5474283bfea5171f2dd1dd5f9137b49524"): true, - common.HexToHash("0x15d39f1274846d450cbc83605c1f9f96ba2629d04a063e2f0ef5ae41ee665591"): true, - common.HexToHash("0xa7e3abdfa5853d81f4943f73e36b3798f32a2fc7f9d3cd507f4909d68036b59a"): true, - common.HexToHash("0xb9cbcbeca220aa04d115a80150e3c598949119a33434710a63e9a5c03dad3b4a"): true, - common.HexToHash("0xa4f6074724110f19e69b9a07c34432568ab420645c4c9e9f6526df083f0652b1"): true, - common.HexToHash("0x504561ebb22a8c171ef65827be51dbdae0f800165575f552b2c1f32b59e2f323"): true, - common.HexToHash("0x541c59dd8a16896a338677122646cf088e49d86143f55ebf358e6ae227fafb29"): true, - common.HexToHash("0x8b60400bdd673a66b352ecc3e4ebf1489000571fade40db50f32d146343297b0"): true, - common.HexToHash("0x2d331606d2823c35e689b6f74af4b2c1270eddf336787487054bf75317184d2c"): true, - common.HexToHash("0x2bb4bdc84a9f81799c33983451003afb5c33221dbad2605138fb3f8de270cb60"): true, - common.HexToHash("0x1200b33d1b7221c520771536d70f762692dc0316a17bdda15afe66ba6cc6e8a0"): true, - common.HexToHash("0xa01ae15affd3212e84002dda8f22e16bc6f03e11f40a780f4c2c0d118479a351"): true, - common.HexToHash("0xf7b4e26376a647b7703ca2d97cd04e4b3c8f7865ae4f17f3b5bd30ebaa96713a"): true, - common.HexToHash("0x82cf7b89909f9ad0008c99be1ae46663963905f9367edac4f15266ccc4f94977"): true, - common.HexToHash("0xe2d882cbb27d50792b02a139c064ffaaa1eec21ff24fc9cc6d020e015c3e5ca8"): true, - common.HexToHash("0x10a378591b8945998fb905db571831db5cf31dcbce948307481e08e5fcac17ea"): true, - common.HexToHash("0x2e6cd61838ccc112fd18b35f70c92236eb0012b586fbc493cb583944efac7495"): true, - common.HexToHash("0x15867a5ece065c62e195a9b766976384d1a2135c4cef3cef325567f9798e2a3c"): true, - common.HexToHash("0xc01208235c82b74b92ebbeabf1cea7b2306d0b7bb4c68df1ca0c9f42fb95f1a5"): true, - common.HexToHash("0x12747f481c0cf6762a6e906e91b71aa1727bc79bf26776422e95e1c9e7652d51"): true, - common.HexToHash("0x0d7570fd47ac53d21acbf663b3a6fa254807fba5e5e934d4d1d4cffa37154a74"): true, - common.HexToHash("0xd0192e54df3b9b8c8eefbd101b942beff1b15367353c2cbfc282569699d8c4bb"): true, - common.HexToHash("0x017b32c39fe3ead135641ba964bd53b08410616c13047ac404ac70217b5a366d"): true, - common.HexToHash("0x311b6091389e406ecdaa2059f45c1fbfcdb47ed826fe99b88eb4f78525d8968e"): true, - common.HexToHash("0x7cd1385b70b6dfa86dfb0b7340d74389ade7201fccf2c642c553166d3d2332f2"): true, - common.HexToHash("0x11e6b49fa9a293068e5eb9b676a1ca8bb742d23502c03d8900de960a28ea84c2"): true, - common.HexToHash("0xce5cee33d863594ee4e7b316cd3d259f51e68c1e29e3088d6a46e89e67b05587"): true, - common.HexToHash("0xc7c67e83f947c642ea9fac274c5c500e83f6b71dec2f1a9e853febc090819d19"): true, - common.HexToHash("0x12916fab25390e345a2fcd8b904d6c4a3ac53092b59b6a5cba89930c4c55c425"): true, - common.HexToHash("0xaa6debcf5e72665ac287aa061b7f9b1710e4c4d8b24d80789c172ef7e5af0c87"): true, - common.HexToHash("0xf1b3b648925beab4b6fdb63f8abe3f43005c95bd09c43d9fd12801eca7ac0292"): true, - common.HexToHash("0x08ff7ad57553cf6e299b796d496be6d51d4dcf2fc40bd61014cdd001ee558aa4"): true, - common.HexToHash("0x5cfdc9d98fc82c61403268a91688955d5e13239c4ca23463265b4b6dbbfca4bb"): true, - common.HexToHash("0x8c13012b1fae2ff950024b1bf707bc59b068846156cdbf0805813056b5f12dff"): true, - common.HexToHash("0xd19442f7752fa57e72c56f6b6b940ddfd2620d0ad45eed476eb9c2472e28808f"): true, - common.HexToHash("0x2f4bc0fa58f3a78eee8a88da21cb3dfc38202c5b9b98097206f875ca31756c40"): true, - common.HexToHash("0x7e44608f656ecff896f901eafb900bfd5f653ccb48244d6a8c40c86f709f5489"): true, - common.HexToHash("0xe36910835f9434f8ca7be9cf65289142380bfa888938d330df431890ca9e5f5b"): true, - common.HexToHash("0x909a5f2a9c015ea36d193339d89b9e621a7d70330d1cb40e4293649d5257bacd"): true, - common.HexToHash("0x26d664ef654281398f8551dd47217237312648b52a82037bcd2461b916ade997"): true, - common.HexToHash("0x911069e3098665879e2963c40836ebbe353d31065b9cc4331e83feaf4cc79dad"): true, - common.HexToHash("0xf5d088259c1619b719ee742c668055a2b29579cef73104390226c8e17ac9da35"): true, - common.HexToHash("0x5622518619c1df375127f511d70a96d7731baf1f1180c2728ab8883f2ee19f1f"): true, - common.HexToHash("0x0b83468252ce9a857fc5fef9f29c948aecafd85f2e5d763bec1bed4098c37e86"): true, - common.HexToHash("0xf6298b56e392582c5f8e1a16e684d6b0b7636d414ecb8b7cac3bc7b113dec058"): true, - common.HexToHash("0x60ee38b4024a787c8995aed21a29d730f95b9615ddeca7b176400182b6239269"): true, - common.HexToHash("0xced3ced3d2150c51477d5246812601390b002029180b6895892e9f0a76a4943a"): true, - common.HexToHash("0x2a0850a4a3d0edd01338798cd183e320f31e781bd64abb9725cc54311525b41d"): true, - common.HexToHash("0x78cfabc43a01b3128489367e5a3547092d191665cce34ae0c703ab4d7e83b912"): true, - common.HexToHash("0x2d0274bc0a397ecaf1b994efff429d864ac8c8c383f9b8340e751484f0ffd5a6"): true, - common.HexToHash("0x06599ca4ba42c83a86810a710cced2813427e0d84f779b71f5cea0c34a35ccde"): true, - common.HexToHash("0x61b6bbdc196f2625d959107ceca3d414a2f18f50750fd5b4e304325b5a6b13b0"): true, - common.HexToHash("0x0c3fe9c32505659ae9ddc658ef91027e454f8ea4dc74c15b30cc49de6e9ca909"): true, - common.HexToHash("0xdf2d9fb92d910597680947aafa4e4a1800852f570c0cf1dfbec6397556116160"): true, - common.HexToHash("0x30af6aac8c634e3f911951f1ae9628379968acd8775b3e49ecfefc33d3c04c58"): true, - common.HexToHash("0xfcfb9deabaf9cac005db35132735de4991608856372e302ae991c37a71f03ca1"): true, - common.HexToHash("0x21076ad4926f49a95e1cf2a5d1ee3a7c609003fb8525f997126a2f93b6d28a49"): true, - common.HexToHash("0xb98e2a6e97c26a7862e27eda367246ef8bee1ae42caa151b7ff8893690b68cb8"): true, - common.HexToHash("0x98ca46cba9616fc099477847817ba191514806e8110ed8a8b1e1fe2b3afa5d7e"): true, - common.HexToHash("0xfc1a2f4f3b401af817cf660c32fd0534e2707e14f050f58ae417104c7b620013"): true, - common.HexToHash("0x2d71a2e48acf8f28c576069c1009f68a8a27664dec4896d309d65587b293498c"): true, - common.HexToHash("0x7958d08cb29af4140160d339d063302a503155b67020ce3f347283525cb76ccf"): true, - common.HexToHash("0xaf9fd6aa18e47c9a719cdaa43825276712ce40cd3cc34085497cd0bcd47362a0"): true, - common.HexToHash("0xf95abdac52d1306ed43256aaca781eef6f4856c1b0635a168cf0f468a2d902fa"): true, - common.HexToHash("0xa4fe8fe7fcf1128d6b962179d043b84d678e1ebf324c02bebcd122f47d87e42a"): true, - common.HexToHash("0x80e1e8e165f9a45200563c9a9d1b727a266dca12a59dab0a511cfccc6bd6a86d"): true, - common.HexToHash("0x1e38476a67cf0d76fd2d63cc159ada1a6d63c45e7385e6a60da15d3115e5242f"): true, - common.HexToHash("0xde1203ba7d7d028836be56b2c3292417a0ddb99cc953dc1c6651f3831136a35b"): true, - common.HexToHash("0x4b4bde1e6829699bdbc2f9612c486247ec2b9c797235ffee64938a5b756baf1d"): true, - common.HexToHash("0xffe44e15ccb9bc37f697d17ba1dd88dc3821651b8e6caf528bc675ccc9f7c782"): true, - common.HexToHash("0x617929e002610ed20b043eb353f48f009784eddbcb924edb27df02c0e6ab6803"): true, - common.HexToHash("0xd626cb657039e849f083eb4a767bbfa11f5e6418f58fbead5845d9df0153bd88"): true, - common.HexToHash("0xde409266696e6c54c4c22c4e81bbe97a113c859855c4511a2bdf36142003e717"): true, - common.HexToHash("0x5bfab0bb5d473484e6b2f029fc929f8a930453fd11c4fb0a9eda76dd245817a1"): true, - common.HexToHash("0x81c80f9351f8a5597cc4dd90bfc79d6ff8501680d7d2f4e7c6d69010ca14255d"): true, - common.HexToHash("0x2131be5aa8bd9b05f67c570e01c8aadc857ee5ff36b0d23ac03ed75a0bd64537"): true, - common.HexToHash("0x6eaab3ace8556079d591e50c9abd4c95f520dd177d86bbc9eebee3473695fda0"): true, - common.HexToHash("0x305031ad001b7f383fee352c86b93a840a441b40a8ef9df54582705be7f8961c"): true, - common.HexToHash("0x1fbc593476878a5af057150147c8652901c4889b745ce46f608ab501b790073f"): true, - common.HexToHash("0xa2f5d1e230febaa37d4fcc8f17a0c1af95c002672ff93c4dbb645f04eadc8359"): true, - common.HexToHash("0x610d8f88a4992279b967d9543a8fec996b4ee42830ac0120c5ee35edb71f8aef"): true, - common.HexToHash("0x3f630b87bf0259f0ded37241723475a0fc722afc2a860ab52cfa5393ccaefba0"): true, - common.HexToHash("0x6ab3e0b85862aeab2c5238f41ec717ff639e900441fcd51a713e37924ec34fcb"): true, - common.HexToHash("0x5c809d859806fb7392e96c863d670180fd93b68b33db5c2fa4128705356aa1f5"): true, - common.HexToHash("0x1b6ae59b9487788b9385ed741aa17e32afda53a376254fb3030f0b5b403f9e36"): true, - common.HexToHash("0xecf9e8f1c383c114610686a7b971eca74d459fc310c6036dbf92ec194fae00d3"): true, - common.HexToHash("0x13cc36215aeedde62af0df94c744c33705eab000d940c447ff6db60dbe4c352f"): true, - common.HexToHash("0x2f288654f1f4747c0b26c5121d15ec2b9d7f8cffdc1b6fbe69f46033abfd1b4d"): true, - common.HexToHash("0xb2f2ef3a43f6353410600a8f77e0113cafe83f42a9d10a29ccdc665c2f17ac8b"): true, - common.HexToHash("0x3d05b08e5db4f3a25b7b106899d2ae095caf6520e634a932f3381092e064219e"): true, - common.HexToHash("0x0f1225b943348a76bdc29a88e5e1811227dc28005c67edf07c6f1838b6295161"): true, - common.HexToHash("0xc8dd80bd0313643ba55013f14100aded9b9d1778fda286dd3d4dd5bc82445fee"): true, - common.HexToHash("0x5b2cbc3bcd2016ec70672e971e8acbceeae2a42190f28f0bc7039e32e9a1ea34"): true, - common.HexToHash("0xf21e4d05bbe599f4a76c7f0148a47981307051b3070334a3a99b523f3a5368ed"): true, - common.HexToHash("0x815b1eb5c6b94a88a4c9144018bd476da19f5f6b60921c880faba8c520a78ac6"): true, - common.HexToHash("0x5d1fd58e3beabe22615f6d6fa0b1f3e9dba1bd44bcaaf2fedbfc2b6fbd89da60"): true, - common.HexToHash("0xd59e31f0707184af329ff057c65eaf2223454495bfc3f00c31653a1753abcd93"): true, - common.HexToHash("0x644b87d7a3ee8b5f4696d6d5a9861232eef6ef07504a7745199892df90a789d5"): true, - common.HexToHash("0x0123164ef51729af8afc7078fcd6786d23da11bd985a6311dffa922453f337cb"): true, - common.HexToHash("0x1edb8c3edc37b1839bd78a915a3c40d766e3d25a46aec49c01972596e66c4651"): true, - common.HexToHash("0xe751cd1b1f4fa676bbbbccd50f0742173ba124808574c4272ee35d751a2d2858"): true, - common.HexToHash("0x0135bf71b4058992e548cca4b3a4a121579271573eda52c789411ceb9a72c8b8"): true, - common.HexToHash("0xe126f71d5b4e5db1d7b31d1ed2707558bc86bdd1c4feb16bd04afd74b4f261e0"): true, - common.HexToHash("0x69314ae8ee1045d64b6168072550e6515053e55a8d4da1c3d9ad8c7ebd7f2470"): true, - common.HexToHash("0xf07e7b0c8eda59d27b2ea8353218e6027c351e16bcbf524fbcb1a10ba04d66d7"): true, - common.HexToHash("0x6084b75e38e36cb674aea245eb1df61281f748241b0dde3dd8118b557f583446"): true, - common.HexToHash("0x679d1ed615b06a31ed7fd87f016e42b51a057c2a40cd28c1df713688b05418a9"): true, - common.HexToHash("0xe067727b3928446e56492f74b3e11f82e0724500936036668947ad8032ae3609"): true, - common.HexToHash("0x8ec4e81ce98b875c622a39f2ec26e4c7b09f874799fe52cdaf32610e4171ea7e"): true, - common.HexToHash("0xd541d18f5079c5a798439eba658707f2701f03226bc2394b594c412ffacd6585"): true, - common.HexToHash("0xbfcb39608550ed1b35a36ecddd23d94e7dbcdc2a62e71387dca6fb1ab6aeb757"): true, - common.HexToHash("0x60f5806beb424075c745d67eda1627da2a121ff5d6ed5eceee7126b6847f17c7"): true, - common.HexToHash("0xda3d9a1a065c40c1ff17bfa4bde51a978a84fc54e1efa1e4165d4b40b5cea487"): true, - common.HexToHash("0x89eab70051953f0f6b98a3927c6af748ec257859876c328c4d7c4187dfcc4d7e"): true, - common.HexToHash("0x931f863d3f9b41e192687edba3901ee6bb5eee7d532d53981d9776a1351253b5"): true, - common.HexToHash("0xde218ddd32b95801cca9b1cea4a068a568c9a197b548e82a861600bf59ed80af"): true, - common.HexToHash("0xa1ce7e6881db1eb8330de3595484650a965e5087d15ce85d135813a184584714"): true, - common.HexToHash("0xfaf8242b0d424dad4efe49728a759bbc985d89fb51cde257609d74f548ad6c2e"): true, - common.HexToHash("0x226eeae142b332ad9772662e469b9a8569b3cebb56cd45edb996db56e6996e26"): true, - common.HexToHash("0x5f171c5d98dfba7bbd0dcf33b2bd5e5262879614ffb0653cdbd87fc789f4220f"): true, - common.HexToHash("0x7b1317bc827bb2327fc7a7d8113af9d7d83099d933c82cfe112b6e9bd8806be2"): true, - common.HexToHash("0x30836bf1d25539ed5610722e52101c3fbae3125de23733a387ff3854d572ec05"): true, - common.HexToHash("0x6955e49ead21f7c1e254b6a6164d0cd8486f5474d6140dac6beb7208f030d557"): true, - common.HexToHash("0x9cde067fc48f77157f43cd7adf0885a99f54286739e9e005b78e1655aa178a97"): true, - common.HexToHash("0xf8fd960002ae56754bb4bb1189bbf6dff9aebe9ca87c1cac5eecf07dabd57a23"): true, - common.HexToHash("0xde4c87089e58549456621b84c10e58324fe260e1ffdf6cbc0d47e4d0c8b96559"): true, - common.HexToHash("0x6e31a7db3528da27d5418d93f66c5da8ab0bd5817e9d3444311a87091784049e"): true, - common.HexToHash("0x7c5b6a46cdf23acce611d4619cfbea3c25ba3343caab156a9d84314409205a0a"): true, - common.HexToHash("0xa9924698c01122d5b66a679a445c7524af831b2246b3294048ae7d18d570e011"): true, - common.HexToHash("0xd7d062c34e0dcb93712d50ae5804c46bd759e0602727c4525c06325d0818db72"): true, - common.HexToHash("0x36656bb0f85b9a51b36339efdbd2d7874b4052441e8f13ef65fff8c98f95f323"): true, - common.HexToHash("0xc741c7f434053ca4a99c0b8d5285d34fb78d8ab42d3ea8dd07432b0a0a11bd43"): true, - common.HexToHash("0xe043b025efc9d4c6bf81cfc8da0487672bea494f404a63ee4d403c49974fca43"): true, - common.HexToHash("0x1345f69c226c3c0441579ffb0f32b2bb34cd86dbd74648d9d3a7c5a7651e678d"): true, - common.HexToHash("0x2ea51c2016d8f71956ebb3294d75c3534208648eeaa97a8944e10b3a340bef54"): true, - common.HexToHash("0x410f1441b895b142f7b89c9d367c131259aa733de19a2f3ca70699c2ae279581"): true, - common.HexToHash("0x0ad25a0e6a98cafb37ea5962c76264e12626af4658f800f268a9437f99cf3580"): true, - common.HexToHash("0x6e652e6ab4de147562675697153d26e5298f179459ec551b9385c4e705216267"): true, - common.HexToHash("0x90875bc109fc1cd904046e1f22c4502d27521a34f8f6405161e0067a4c31cabc"): true, - common.HexToHash("0x9d9f11766205680a6dc069ded6586bf9ba47eacf3f81206378c444da26d83121"): true, - common.HexToHash("0xa5b697a8015e901b13977d7be37f67a64a2deb88a0741197a29600ec44ee733a"): true, - common.HexToHash("0x7a4694c44a85b792ba989ccc61cbaeef1e3a49d00e65544f4b921011b509aea0"): true, - common.HexToHash("0x7bf2fff19cfcfa6f52ae8546b22f3221afd95efe20defe2d488dad085eb9488a"): true, - common.HexToHash("0xc37cc9d0982f9406483261e1b9a53b072f2f3d63ab91ffcafe956b4a2725768f"): true, - common.HexToHash("0x1bec53f7298bc272cb7d937f2c663221c44e424cd4bb5e12fb02785db31ed106"): true, - common.HexToHash("0x1c18727eae4c519b813b0ef9e1a4e45470c24abe931707ed162ea79eae658a49"): true, - common.HexToHash("0x1e5f68d3f80e7ef84ce647bd582e0d44378a832d168f8315c2268ff04fec81c7"): true, - common.HexToHash("0xce58afa19df98bfbd2531883cce8fbc64880fd50ac0057d91777cfd2a050a6de"): true, - common.HexToHash("0x959b6330355c8ad50c685b5eca727ac951b575ec745594ff3044ec934385783e"): true, - common.HexToHash("0xdc4b628e6c3cdeeebc136e069e6da6533e8c9b8db82d2a1b70fcad34a9cf0ad0"): true, - common.HexToHash("0x5209ce7ed07f9b032658d3385f3ce11590f1fe12b0eff8e7f58c10a1d6b1dbf9"): true, - common.HexToHash("0x190a38190243dd713cc00f4936772296657f18174174a66399e55231c726353b"): true, - common.HexToHash("0xaac7adfbd193e4e2043a0921d8f81b8ec0185755e9c29676c9395f8cc09656c2"): true, - common.HexToHash("0xe7b23ac268e0be11ac5296f71e018a5cbbf9eed907ee4ee3d9f5d5bbef09e056"): true, - common.HexToHash("0x51d2110a66c630b97d7b2345e81b504304938af0b44124e93cd4e4962c40e9a0"): true, - common.HexToHash("0x3b5da26902961a01c8989999256eddd0b7c275ff323b830de16114091d763e2d"): true, - common.HexToHash("0x349ac9ca17accc5132733e32e8c130ac4b09c3038540565ff2006bd6dfc17dc0"): true, - common.HexToHash("0xe5541796d20749f6f746408e8de91c68e770e4277beb0b2153b84eedc269c3b9"): true, - common.HexToHash("0xe4961105037ef886b15468c95726d3d09b0902976583dc2589918dcb6f31587f"): true, - common.HexToHash("0xbadf5b4e8b3e68c00f24749bbaf2ac57cea84c2ee00c5b8b7402900707ab6193"): true, - common.HexToHash("0x10b913a1366d3ffe29f3bc5e537da1f30dcf293cfbf68f942405cac3abb0577a"): true, - common.HexToHash("0x86b18373779b94e1c95d18e789a716eea6882e7e69e0a82975a0eea88bf68fd6"): true, - common.HexToHash("0x5465d04e76e1c7077a93f1978fdcffc6f41ecad26c151590166c60e94f05aba2"): true, - common.HexToHash("0x0af09fe9d5c6fd707c034a4aebd83168554381d20b23f5f82003c4f24552136b"): true, - common.HexToHash("0xe3db55a96a34f7a246ee4854e191172896a002112296558d859d1efe272f9ef6"): true, - common.HexToHash("0xd42720b8be6023a0248d0715db6b6dd36ecd1de61d09fec955e0eae65c42a617"): true, - common.HexToHash("0xba8b5d4b80df1e2268548e292921a344519a2bda0f1ff7e29cc616c58a89a1f9"): true, - common.HexToHash("0xe9fb10ece9933488c07077867dc8fce933991440ed5237ed4b60a3687ff9841d"): true, - common.HexToHash("0x378b90f402fd09cf8d8df4f2d951c4c6a5f872374af934d2803ce481f1bdd431"): true, - common.HexToHash("0x6ea211dbd57872dbced0fab5fc233e95c7302df00520bc5717fe981aa19bce25"): true, - common.HexToHash("0x20a59230339568a4e446ce91baef18893132d819f578d3ee93c5816f179fbe7b"): true, - common.HexToHash("0xf3d0223480f013347f1bca8c113455fd6afdbfdf8e4921fbda0b746f9996f66f"): true, - common.HexToHash("0xc3601489920b8294b084030aa43af6f06164341a5646695d696d0366c26a9424"): true, - common.HexToHash("0x270b33e0901807bc8584c7dc000605b3054aa7034d24d406e2327077f7ff3a83"): true, - common.HexToHash("0x9bacb6bf779bb852f88b4930f7047b83a73def47399a6b4e1039253a791f746c"): true, - common.HexToHash("0xb3eb82e80283a5150d355caada2950b232ef8f9e04231603d32ff69b71ee9098"): true, - common.HexToHash("0x8bf2b5c4e3a9b68d98f0b6e8b60eed53e0ae303b44d9be60e9817fd7f335e280"): true, - common.HexToHash("0xeca5bbfb03c4c16a2ec448198f7c233d87ada5e1dcc510cc5d197cc588f96301"): true, - common.HexToHash("0x98881578972295ce46161dadb256472c3b550dfe5c9e801d94943a4ad39e10b7"): true, - common.HexToHash("0x94fde01f4f61e2e6310428f25f6dbeaa0c8e4a0e4870df23dec12408847e60f6"): true, - common.HexToHash("0x569a9bf7a2dbd59b15974254052e104c79120ef7e964f853765c26c8a11e8a17"): true, - common.HexToHash("0x95384031160cc74842a6923e28e0589b792f56d3cfbe1608b2c53637c254e772"): true, - common.HexToHash("0x27b388ebd7fb919fe94113d90d4e63f2875aae67ba39c2ca65adbfac55f40cb9"): true, - common.HexToHash("0xcbc437db63acddd20f8fe79c942f4fece51cfa05a184d81fa6be4a463082c92a"): true, - common.HexToHash("0x9fd9d0f7593d132c6ed023ebe00f11e98036c8a0b5ec60c40defebef64d02b37"): true, - common.HexToHash("0xb9d5b4427829c81001d89f81e47ed9091b230a16fe5217c98b0d20c5ceffb24f"): true, - common.HexToHash("0xc23b7e3c8475f6448705ce3b27d63ed51392918aae0a2f12b48c843a933e6e0f"): true, - common.HexToHash("0x4e372d98a49ae5a95c92bab1b75bff1dd96c6ad6af6e9c4dc97f819a36ae1062"): true, - common.HexToHash("0xc3757a4b1b478168403db69d391c49809c8408cb6cc60e33687c856c6111f65c"): true, - common.HexToHash("0x755c9f4205f6119b5001d45140a90464f998d3efbde3882d951c2dbd0f5a781e"): true, - common.HexToHash("0x408dff60312f99e2e7dc89f667666ff94a4b73179a6f449b570911507530a4d9"): true, - common.HexToHash("0x5de2d73b3e5a6a5f057d7f6c27c3b62e2ad90082166f393378404ad7741ba13d"): true, - common.HexToHash("0x3a3443bafbc93f2f818ac54728229a6c9a8a3e5ba0a4617a97b194d673014299"): true, - common.HexToHash("0xd495618e7a89ef70984bb8f4e272cbc37ae49c8cfa9d5b9c9416c518272b9f59"): true, - common.HexToHash("0x4fe900f819d68b8f2471b2be7feb4f0c61af89dff59c078d0dde6a4f0cee4686"): true, - common.HexToHash("0xf276288e8846829975cfe5030ee7ff2020997021278527ec59475a0e55bf2aaf"): true, - common.HexToHash("0x5fa9137ddce705f8dd9de3e8857d30393f820e812cf4602c03315e6422514fdc"): true, - common.HexToHash("0x455389d683765ac6ba36834ed943c8b76691c18485ab27e75dc454846029fc55"): true, - common.HexToHash("0x7ab1d165cd77939cb0a69866f6482de47783a15a1e5c3ca2d95bbf85014b2d58"): true, - common.HexToHash("0xba0264668fd8800ee6796cd703a8480d91f03a3a3b8e6dfadc2454fee81cc82f"): true, - common.HexToHash("0xe959b48cce40022338bd5ddc1d7cda2fa616d346042f0819af1043ae2525882e"): true, - common.HexToHash("0x71fa4bd990581904844a539dba484d8db3ba7bf9e6db6d6f961960c66a72ef9f"): true, - common.HexToHash("0x54ce434380b684a34dfdc5e87e86d18adce6d95ea2b40795469e5be661a102c1"): true, - common.HexToHash("0xcea9f55f7d3582e17bf8e67954a714257db0282b4245b051a99ebbb2dd5f0fa3"): true, - common.HexToHash("0x69202baa30f63e29cfb80d37569d45d4848a041e58f3bae283f53a2a585568d1"): true, - common.HexToHash("0x11e5b6e5af57629926374ac8a6a9bf8aeb197367f14e17e1426becb3d1388278"): true, - common.HexToHash("0xd46d4b6d04fcf37008834c278a54c0569619089561eaf515891d4216740d1ae9"): true, - common.HexToHash("0x129889b60d3f4426fb51b504c6d7aab3600056fa72adc05e3b425a317e029db0"): true, - common.HexToHash("0x963c62ef60e593e2c1e24f622e38d2a568e70b7e2a24f8a01bfc801e1db806df"): true, - common.HexToHash("0x8a9c7219fb2170ed67b734fe7a975a0de5a80c08e745c5d75b98b0b80c7ab23b"): true, - common.HexToHash("0x7b9ac1d32d3c8b68ec8045b12d3186f803b910a611c0e696da0c1fd45075a5f3"): true, - common.HexToHash("0x4264919d38480979157d174e05b8642709611c702341349d5e34b9e13358c682"): true, - common.HexToHash("0x1bba0c52e55367cbe90f46dc9612fd26841965d2689c4eed31246dc433d6a5c7"): true, - common.HexToHash("0x0ab7e9fd786fe02ce082a208f3b397addf9c55c13094075291092b64a66daf82"): true, - common.HexToHash("0x160aaec2d2acf260b39fc042973275b406227fd7bfb9516f11a5c017011d70d8"): true, - common.HexToHash("0x08d1461e0fb1b4996fc0ea0390a5aaff3606780a222fbc56b82d07b55d842e79"): true, - common.HexToHash("0xcab042d23149bbe0fef497c6626d9ad4de61366aa294c75f7863b3b8d5f541bd"): true, - common.HexToHash("0x382db47dc3db8ea6a2f63b98df1f1e806ac627b3ad27774ec196b2496d30a8b3"): true, - common.HexToHash("0xe1d146a3012b4916875c8ddd92c573368cb631bc195ca1e505b44155f51e486a"): true, - common.HexToHash("0x12a60aa43eaf55f37cb6ab35ce79ccbf3c5298cfbed02f491ef547ebd6061536"): true, - common.HexToHash("0x588fb1584f259e22bace01a8cd9088665f5def5f5131766993d585fff2e2d8f8"): true, - common.HexToHash("0x62711722cd1c128301474d66ae84b0b213d095de02d4fff08858570b120e7f69"): true, - common.HexToHash("0x0352b07cfcf4dcf1f6d41a2a2903155f3d7806b8914ed6c866591216ab44c69c"): true, - common.HexToHash("0xfe4d54ab826c8ab2cbba0cd1e5342d4461ad159064278b91f672166789839bcd"): true, - common.HexToHash("0x9de1bd3bde1eb51a32b4b7303224f9284e5c5eff3dee00cc0e9bad585cae5c2c"): true, - common.HexToHash("0x779262e30423037d6a895acfd4623c65672e21c8dc3cb3239117623e7d72e85c"): true, - common.HexToHash("0xd2b0e126304d295484c0a206a0f02b5c2844d7ac760cd44a7ddfc9308069984e"): true, - common.HexToHash("0x05088af008186e466a2fa1fa11d705e3891c7ba7541be57ff1c198f3ee3c15f0"): true, - common.HexToHash("0xa7495bdb77a1c4ab6b020886d5fc50e76777a79057717511f85f44529f6859fb"): true, - common.HexToHash("0x1602d0ea7b7856a9c7aefe97ca24113655447a8d840b9789eda09e574e93dde0"): true, - common.HexToHash("0x64c9d4e8294b6d905cd3f828f679877b3545289dcadfed57bca4f7e3652df3eb"): true, - common.HexToHash("0xbfd953aca5930bfcd3e15fec1bc740e1cafa6579e7385a3844f9e460a9eadc50"): true, - common.HexToHash("0x836cbcbb93c8454614491018633f2cebfa4a8650e6db940865b17683cb7d1b1b"): true, - common.HexToHash("0x7a33cc67ad32b0026abb0735792ac2c7c1ef72c7ecf61d95b551222dbba58e1a"): true, - common.HexToHash("0x62ea18557b95ca75d7116e69ac33179a76384ab3738fe514913832df6b3dbbfa"): true, - common.HexToHash("0xa2bfd157d3709602b2205b8eb10be14db925a5b2162789fc9f6c0f21ae9cef8e"): true, - common.HexToHash("0x2cd39294a1b0221f0097d038d18d7a6ba4314599cba4134bb369fe62a552b944"): true, - common.HexToHash("0xcbccad833a691db627bbf8b26fa171d08335dbd2dd011ca53fbee19864c28512"): true, - common.HexToHash("0x5c1362646f681987f0ef3e540633663ceeb8d581dd0a9df89cddd17cd018d0aa"): true, - common.HexToHash("0x364d2d5a01933170b793aefde0d845efbdb72141987cb91aae3fdcbfecf722ef"): true, - common.HexToHash("0x0278cf54217de01e6ae8c6bb44706d62cd563e778c65dd4c10c1964dad6fa0d1"): true, - common.HexToHash("0xcc8012cc940ecee791ec76b755358c11e89b423c247fed6a27356c8401aacde6"): true, - common.HexToHash("0xad1a36fb6e3c2518b20fd377f10743a94d6506a366dd6a755206ef9cd6313422"): true, - common.HexToHash("0x35027ad60d9d405246cadb086d2247fbdad526c5a277a2db05da6c1036c64844"): true, - common.HexToHash("0x22d5b542167334a4b8a3096198861ebee80edf1e8de46d7b690fc59b73f0462a"): true, - common.HexToHash("0x0d108a5ec643ef954ef1dc09ed8b21061294f5192e952d487e3724ce5c87e74a"): true, - common.HexToHash("0x74c1fdc28941363e38d8edb7ac15edfe5cc667dde1692310b46954bec951dc10"): true, - common.HexToHash("0x46185995631732dd6cdddab4a0410e6724684568eed89a861d6afa3cb38252df"): true, - common.HexToHash("0xe9f6bde7411beb74e5034fd6ba9c6a6d1844307f324f1e7bfd3eb8be56ad23d9"): true, - common.HexToHash("0xe97e0b961099bb1cf7987aa4e707253753b02ebb006cf8d1963de19ce688c160"): true, - common.HexToHash("0xb5d7b6013db671ba5f044572b88e143fa0ad6ad7dfe3da1428713cd6503c7855"): true, - common.HexToHash("0x3ea031bc7caaebb05f4c0006c150344cd5887d6131e5acbbfbf740bb8b4d82ce"): true, - common.HexToHash("0xc78a5340d9ad8a83a753f2176f0b8c215f0468ef5632f11d7172128a5fec800a"): true, - common.HexToHash("0xf01cd6249fff3d4f2eb4d8e74530cfcc257a6983322f453dd74c16d85f9e8a91"): true, - common.HexToHash("0x6a1644b259a165d671ed0439dcad06d478896fba80fa3cffe30062fbb285ca45"): true, - common.HexToHash("0xbc82945316c41a062da8f21f39d6870dab7de980f93c1703e1994c05ed2fb763"): true, - common.HexToHash("0x328cf7372c0409f0446c3d94c70e25af9a7baaa6d796ba51c78607ebeb13c99d"): true, - common.HexToHash("0x4d7fdbb7f7783db03a122bc9f5ec2c532630420b33d426b08362c3715bd2f335"): true, - common.HexToHash("0x33433e6bfa84f11c471321a4da6b0bbff9475ad745473776711feed8b7d7ed8c"): true, - common.HexToHash("0x1ae626681c7327064e66fe23642c6e62acf4021e106fed6dc7a0b903cd022c10"): true, - common.HexToHash("0xda8c53d3c912a6a36d61ee0cda948c1dde55d5eddb92643c5481fd574e641cf9"): true, - common.HexToHash("0x6cfe48008f1e4cf298d94733e6e0c4386d4174f7b3d4f86f669b562c1be641e8"): true, - common.HexToHash("0x81e21754565cfa8bad43f37eb1f709b4da7ef8c36ac15ef09eeb650a46d826f3"): true, - common.HexToHash("0xa5f98c7b2f3843aa27d206b03869bfdc3cbceae25d60a917422544348d93be50"): true, - common.HexToHash("0xbc41de6c179d25e8a1eca4418e683cc73d003b612d089aac78c195ef38b618a1"): true, - common.HexToHash("0xb7d1c9ebafa4ab10e6faec0227fff1d74f846ae16cf85641ecb1197339ed506d"): true, - common.HexToHash("0x3f4e731de1d248c290281b26bbaf4cf9ba34112a5406ebbf7c97f21dccf35dc6"): true, - common.HexToHash("0x71e97fd2e71fef7956e509b2b9774d363464a5ec91622dcf6a0b5afb7f4b0496"): true, - common.HexToHash("0x54c126c248e23b8ddf7b7637024d7e41c4ae6a33c6149a0ed36f979730ea19ca"): true, - common.HexToHash("0x53c1186910cd5ee846d3f8fad74e6275b2dad2242287bef354b1e703e2abbf25"): true, - common.HexToHash("0x815ce4202e212440a5c78cf9db0c6733e366c289f5ad2ccecf86d44a86c9b0c8"): true, - common.HexToHash("0x75e63338557ab18b09816218c3d93d6a90bffc886936e824089e5c8863395410"): true, - common.HexToHash("0x3326e20750d8347d1e4b0876dc655817fd75e5df67045ff4010a763d56ecbef6"): true, - common.HexToHash("0xf653a96ebf7ef71ecfe512f0a59bcea1143a96c140cc93cfa1aaad82b3d6adcb"): true, - common.HexToHash("0xc1d24b02bf3bb5ed7c979e3c8b700b465b0e2f4ce68dd8103ba48db81d0ba744"): true, - common.HexToHash("0x3213cae1f90e2e901d9054da5192fba8052e444d86a60c31fab64ec8619b8c5c"): true, - common.HexToHash("0xafe006138aaf6484b8266be2d27e000f6614d03943ae8de263ee99363ffb1abe"): true, - common.HexToHash("0x2318e1e3ee335c707df7c1dcb9ee3c31f0b5c128c99a2055fd1cfb77bc63fa60"): true, - common.HexToHash("0x84ef61b9c2d6a951c8afb10755dade3b920ee2f17dba1adc83a1991ab0cb4a40"): true, - common.HexToHash("0x0e1d207577127ab13c089e26e31f79fa9b997e7e33413c05627564fa9e82f6e0"): true, - common.HexToHash("0x2feb68d3ba64929a067f9320e7543662aac2c915ec19dfa66d1b04cf0a27a6c4"): true, - common.HexToHash("0xab61317f53daf330756cb376ab8045d66fedabeea3583da2e5134a4e2e2c3eae"): true, - common.HexToHash("0x4dc12af8e286a73cd9fd4b1674118940ea992db7c1ba3011b9553940571940f7"): true, - common.HexToHash("0xed3909f1a1f78567a9f1f55d0d4db39bcf18940820ad2bf133bdbd2083b81a1d"): true, - common.HexToHash("0x5587385b63eb7ae2956fd8c4031bc1fc1e9e40f4d6affea631ce74e93c4e55a5"): true, - common.HexToHash("0x3be3a9fcfbe8b7da40a90f7ad0703c4aa0729cfd988a8ea786dcb83e3416385e"): true, - common.HexToHash("0x36eb132c8535b9546b9f956a47b40a8726c81c389464394622e9288acb88bbd2"): true, - common.HexToHash("0xe35516ae9520f20632bbfa6542c09b3c7bd26aaae3880ad9b55cfbc50da652c3"): true, - common.HexToHash("0x2e06082c40e9788980ff905241322a9b641e6d47bb231d8ee658afa2e04d905e"): true, - common.HexToHash("0x98a903a9f643875ae08aa5e8fd4bc3e11776d65a721b80af1638a5a1688e006a"): true, - common.HexToHash("0x3eadeef7bd2b75854fa907a7c2c7287fb62bd175ff63df4bd4c1d0126cacbbdd"): true, - common.HexToHash("0x4cd6ac7915132973a2234419f50d10f9fe970a79139f149f20ef2e302700561a"): true, - common.HexToHash("0x52d03fbe5b635e37b6d614bd18601966224d2d2b60dbcfa83700f195d215b1ed"): true, - common.HexToHash("0xb9ab7c35c8c12699077eca3a1e14f2588af34b8ca00306764b5063f5ea9b4863"): true, - common.HexToHash("0x7a6dd0661a2f423720b4ab58832386247427f278f1fef303e3f48af702140856"): true, - common.HexToHash("0x6db628ff22204bac4640cc17e3352856711521b30b1e0d2e078a05775680e98c"): true, - common.HexToHash("0x064ae254a253d04032fc6a548ec368a82020fbdd11b1cc96ea50cd0e9396d795"): true, - common.HexToHash("0x49015c4e61ca11136f587a82acabc297f4c14179dfa88b693a7e30242f80d155"): true, - common.HexToHash("0x486e4be8fc0f38bab98b9a77018fad4ed90a0aff92a99c6fa80c2f35e2449d11"): true, - common.HexToHash("0x64312e375c2a630d35f0f26100c411e667bc0f05083e7deb47bf29d4ce9a9fad"): true, - common.HexToHash("0x5348ad8bc5ba82351855974cff0d22afe25b2a0e8c0fc34b54d388c5cd84a71e"): true, - common.HexToHash("0xa069da0cee723b112f83c89523be942ff6fecaac89c054d0b416d5c98e6057c4"): true, - common.HexToHash("0x312b779f4872f0ac19c105130008a61cc29b66fc1b1a664d200d0ba5e2609afa"): true, - common.HexToHash("0x579ab93434b29518e55f41a5aabff9536be05628b9057b843c2ff95e3b17d759"): true, - common.HexToHash("0x21348fcd05e666d04ff962c68efbda0f13df0a9ef1737a917bd1d26130d2ab08"): true, - common.HexToHash("0x31e6e7fa0cbe4a12cb8741a273edea2d2b56660c103f47a8af229116c3f64823"): true, - common.HexToHash("0x18ef76aa1cfc538fa69c14569f9478c88d27ab232c44471c82edbcb95862e8ff"): true, - common.HexToHash("0xa50c945cf9c380ea8a3a12b6b8fc5706b8c5eab2f8580015e0e0ae179762f157"): true, - common.HexToHash("0xc6f0266fc89412f6eae2d7f5e9cc0564e4b1e02e23fd8cde68d9da0bd6295776"): true, - common.HexToHash("0xba516873d01a7a30e9b6e82b0de5f352648df225f413db875764d1487c0bd697"): true, - common.HexToHash("0xe2ba08036643c3b60a8ff7b19887af3e1abf7c3884a50f195f5a1bd189fe99ae"): true, - common.HexToHash("0x076736791b02df70b3d77ea11e466719e32501654a5982ce480c083c950e4873"): true, - common.HexToHash("0x8016e1a1aadac51b1babb8fbfb53ff73f6e75db9d017ce521629ad43881f542a"): true, - common.HexToHash("0x3cb777a151ed7f91baee954391bfeee48b410570b7a2f495157397015b77eddd"): true, - common.HexToHash("0x512a95def70da5144312d683d1e12e20a9c34098e9a4851a45cce5efd2d3f1b8"): true, - common.HexToHash("0xdd462107a25a2437ed25246fb271417e329b9a4009514c33512915931cabb3c4"): true, - common.HexToHash("0x05f35a02fa5a3d7ff25f39212ddeeee767bc09d111149c980869c0e7fbaf52a5"): true, - common.HexToHash("0x58ef7f92b7ab762830a1b90e1f4fce3b24d94a9f9162d789641f02635dbb14a8"): true, - common.HexToHash("0xf0c4945d842bc2c6bdfab8cbcd9d338faf2c8046a230c57e8a27df763ae81ef3"): true, - common.HexToHash("0x0afd33fe4f81e41efb5f4aa7860e90b381a272be652933715682dbf17f7c67f4"): true, - common.HexToHash("0x2c12e7f9e63fa634e062608048be01e44694cb118146f97f4d03e71a10b9ac34"): true, - common.HexToHash("0xb94417c6fcfb9df5e6640bd8e90a5433b86671829d0d4235a861c413125946f2"): true, - common.HexToHash("0x641b70176b7ea15f30459b9bb3e8e48c33a2bba478c0dc3232a538f84e30355f"): true, - common.HexToHash("0x98016653b95ccea286e5b4ec2d984487ca68e28697d166dd4b4da60d2208dac8"): true, - common.HexToHash("0x2016911c560b3a0d74a5675a5707b0af31c763c5eefcce6598a455db496bbb2f"): true, - common.HexToHash("0x73f65f21648c0aa53bf6214d7c0251eab1f50b495e476407b93b34edaa0b62fe"): true, - common.HexToHash("0xcbd697f389352f931307ef19077adc14f319b456e8fd20626c66ede338da0493"): true, - common.HexToHash("0xe82774292cbc49962faecd937950e84d8a38da39eecd080d0463b9386c794ec8"): true, - common.HexToHash("0x3b9a25f2b464b962dc1d1237102d51c71b9a5c3e941ec2a73c5d78321d69ff98"): true, - common.HexToHash("0xca8af4e704ffcf960a16f9a1e0f12cf1429a14d128c3cb2477d73a02c7e6c62c"): true, - common.HexToHash("0x51b6a910391c0a1982324c45205d5581cff69da29c5a53a6b4195462118daa15"): true, - common.HexToHash("0x1f4fdc5ca15434fa8fc90e663f473c23deb0861023b2565c1784835fce1cb3a8"): true, - common.HexToHash("0x28ae9795ac8f58eee2194628c1aa85bda5af073ea8f9674453d47bf27c721b04"): true, - common.HexToHash("0xa547d56f808829ea08ddd2551d24ee7f3d7e2d433e4bfd2448341c073d780039"): true, - common.HexToHash("0x30df0b99c7fb03ab7751c60b3327d1c41c0fb169d1c79e92a006a7e925839fd0"): true, - common.HexToHash("0xa474544c7ab52ab90b3840add10c74c9a8b42e8d66067c8e2bf3dc3325f5f9d3"): true, - common.HexToHash("0xca033307b518935673587c80485d10dc80fc515350ff97e71cf4f16ce507ad38"): true, - common.HexToHash("0x002698ce1da241705b8a32151a15d7ba23ff0c1df52c1d10630854783dd83e13"): true, - common.HexToHash("0x63850a38b2a0f0dc40be46a0494fa44c30652c52d4bb2cf1f0179c1e07dfe28e"): true, - common.HexToHash("0x785fe6a000180a799a6371be12fe419ca2d0680eb9f477bae133870378e4579a"): true, - common.HexToHash("0xbab0971e496543a6b7afa698b96600d0aec9c9cb6a3f6cde0c892d89440da91b"): true, - common.HexToHash("0x51c1e63baf80166175fd04bedc059393b95c6bc414888790a805a8977b88da97"): true, - common.HexToHash("0x2e67ed5bebba4e723f1d5589d559004d8fef023ace48820c691357e5d70322c4"): true, - common.HexToHash("0xa942bc892315c7ca941f3e24a30955901a80506aa964221000976ceaf555e33d"): true, - common.HexToHash("0x340f1bce99b585df86f5f96ac2cce0ceb59159fe4d57065d4e5ca5b9576d47f5"): true, - common.HexToHash("0xec8a68909854dae4e3c1b3ace70ff5ffdaa962e6a24e29f36968d0500b48c086"): true, - common.HexToHash("0x79174109747b1152b559123b1e6f7a7493e8dca36106058a241d021cab8ad93f"): true, - common.HexToHash("0x1e270fdb91bdf433213612159fd78c152b9b34991f83f384da9e53dd4e08c783"): true, - common.HexToHash("0x0af5899981ae5abfce65f2bfbfe1c4ee83bce17960c30e8b345a5d6baa843078"): true, - common.HexToHash("0x56649338c64761c4ef07f2849d1f266164d2d9f6219bbfed9fba9835c62b584a"): true, - common.HexToHash("0x8d5855b2f2308158f1e0bb6f4d07f23dc69df514f448f1ab34d9b180fcba33c7"): true, - common.HexToHash("0x4033f29068e62477a2aa5be5773b476f999f78a725fddffe3a623fe9faeec025"): true, - common.HexToHash("0xfe294ae34b4ba232149c6296287bc4f51764a7eb890e692ebfa5cffe0c9758ac"): true, - common.HexToHash("0xb55c32519f46c7ade998c9531a0568e19aa32e110f8f6f16be2fa2be2a628ea0"): true, - common.HexToHash("0x1a5ebfc746620a9430d4925723400e2fc4d47c431582dcc897d49552d4389cdd"): true, - common.HexToHash("0xa5fb2eb590729179858c56e28ff4828b0fb31f0561277dc645bd121e029227c3"): true, - common.HexToHash("0x7c31d6d1f34387fef9c7e84939c0d47f96be2e991b7526d3d795897ecee97303"): true, - common.HexToHash("0xa39c407312d25a4c2194fd32b3c89ddd0e51e4a658df8663d5a4c7969fb28c59"): true, - common.HexToHash("0xbd87acb207c0014192af40cd43ab91f7d2537f59d91a22382b15849d4ff65004"): true, - common.HexToHash("0x8a0fc43264a409b6865a9f308c78a943813e8b52462356f38ec057aa2309ca10"): true, - common.HexToHash("0xfe2bbdbb02e6d7d07c8740934442414cbcd3c0fbcab00222d88e8ba5ee0d7d79"): true, - common.HexToHash("0x1b0d61c889dec69916c8cb488fbca40289a9fadad89a0bb272e4ae483321dad7"): true, - common.HexToHash("0xf95e97b15976e40fe5fa0f6a035a804656e19fb9adb8e58cd809039cb37cf7e3"): true, - common.HexToHash("0xf1d9d86b996bfa9a837ec8c550f779db59218a952e2eec8d84e08e7fce5ddaf3"): true, - common.HexToHash("0x67673e1900c68ba2e5d4b86b4eec6d01eae619c91e79ac258259df71ec308399"): true, - common.HexToHash("0xc5ed94f5c28c35afb0d44c3f3a0e931a68fa782e3eab951d8d4b286b81040770"): true, - common.HexToHash("0x257e7bac09ef8a7698c1ecded2383db6b8ebdeb3526fc1977510db0cc79958c7"): true, - common.HexToHash("0x70cfb2c12476675b24ef206d9a32a3f9d5f97d3844d54120cfb823bcb6e7c74f"): true, - common.HexToHash("0xfd53f4396f0f1c8314471674bb2faaa5859b8bacffb65684d22f146c1ffe9363"): true, - common.HexToHash("0xf0d400a26d49ecdf08afba29b49509a390b86f9804f772816af8eccbbd19c991"): true, - common.HexToHash("0x964acdfd4e5f5e3129cc50ed462396cecb2431531fbe0a82a9302fac5948e1cc"): true, - common.HexToHash("0xa0f5a7b613429b5390b134f78774ca88dd3287247aef2f8dc3f3f0424806645a"): true, - common.HexToHash("0x2a7840b39929a79867582e0088f7d4dbce209c798eedeecb7e3ccd9d4a5f486e"): true, - common.HexToHash("0xb6ee61ca998ecb1e49400790589cbd4716dd822d9516b4f2383c2034a4e0cc38"): true, - common.HexToHash("0x9d77f114fb86b36f2de5707109ef67c0c996fde88c4f5473f629b8a0875d7ff7"): true, - common.HexToHash("0x4d632f77a5fae5dd8e0149dff8ec724d1592b099b75c530f42a5c6883d4556dd"): true, - common.HexToHash("0xadf64c70d651494d2776f9dfc354e0523218e73350c121e84057b2d3c33f2825"): true, - common.HexToHash("0x345dc8c17ade6210c082695170dfcb721e8ee675754fadc073814e7954cc62d0"): true, - common.HexToHash("0xb005a3f98034145f8f32fc21988be58ccb54825a03ac756c2fab03f106db863e"): true, - common.HexToHash("0x231d66c9c2cae49a101e4e81515cbb75b2285e6ca0059105648389d79557c56e"): true, - common.HexToHash("0x773e919d83e852e864699c912009e057479b200413a5b7aca0822164c075d1b3"): true, - common.HexToHash("0x7aa445f46cfc9ebe6f3753f22034b585b425eb38ec4adec69adff98410d6b9de"): true, - common.HexToHash("0xcf5b26b780a0041f865691da5b33d3bcd8761a9f7be7b497b6ed907ea5e84169"): true, - common.HexToHash("0x66f7de4b28bad2802652700d7657dfca962d9c3dcb3857349540f686e2f01b59"): true, - common.HexToHash("0x0c12d3a267e3c49feb3f395e18be11bf8bcda997b45e0d0e26522b40a2c61b2b"): true, - common.HexToHash("0x6112ef8c1ad1d8174a2f4e670711de5b7056673749a9f0eb11c627ffc45e2c8d"): true, - common.HexToHash("0x09cc9249fc907b7f3ee96550c6298e5280aaa09c72195c935a2a42fb025281b8"): true, - common.HexToHash("0x28cfd4b985514fdfb8e8ef6d9ed2740e60b818b49155d2b5c14c857434cbb438"): true, - common.HexToHash("0x5f8c6c1a67f48b843ca3ec78d4f68b29a26ef676d7ce6557547c57f02414601d"): true, - common.HexToHash("0x72c63367653d9d00fc3a3229f64b19afb025de0c1bf5ea2d3dab0d3cf7c2f426"): true, - common.HexToHash("0x4684e7d2c2943079953091031eb4c7921819fc5f9085d3473f4f858d93826fe8"): true, - common.HexToHash("0xae6dbf0f83d75e9abbcbfb132fc3230198f919be05250c13d8802865dfcca08c"): true, - common.HexToHash("0x609ebf00e5c90c3d7215ca5b8589437348c6be9a35bb1960ad337573e0d3d3cc"): true, - common.HexToHash("0xf93024ae0a42b3e292c388ac619e6afb264caae287149c7a6ed57b5ed2d3e96f"): true, - common.HexToHash("0x12d1c6e2d1e869379fc225eeadff7e6a5e5e26adac63369e38712273d9c40bfa"): true, - common.HexToHash("0xd6fdd5e1e952e3425b4b90b92db058b2eb16fb5ad586cc19cce8f7bb2589a171"): true, - common.HexToHash("0x28d401d7ee139a966f29cbc79001de11f33cef83bcac330d3d07614095dc832d"): true, - common.HexToHash("0x844e3f0646856c8f9a15186ffb12f9e99194ac36fa72fffbf63a9b92a835608b"): true, - common.HexToHash("0x699cff1474e80c5b6c93a4082d3ab886aed6c1cd5d0a537e83478a29e7a39326"): true, - common.HexToHash("0x4142cfc567d5059ce1352f2574fde47c73caa729d82fdd715a8e50887f042dbd"): true, - common.HexToHash("0xed25b65d21e8d3bda44c94bb42a24cd4fb5bbb1cdd6fca634dd83a4a78c2dacc"): true, - common.HexToHash("0xde66756fa74270860e2db45eeeee44b25ece07204a8a367371767961fd4ebd58"): true, - common.HexToHash("0x887d2aa34aee1c620c326729d86b36e57ffb120ce302fdd821134b386f081b7f"): true, - common.HexToHash("0x0e5d76cf88d12d62a35a5308a30593e7df68b8a163834bb4b5a38ab568292ae9"): true, - common.HexToHash("0xc325083927cd2058dd53c0929ba0ce0cfd66f2a30f87d2e776524d7c470bbcb8"): true, - common.HexToHash("0x55b94314a5aed593a0f11470871a2ce6610c1ffd8a33c4543ae80561e2a00a7a"): true, - common.HexToHash("0xb0ee0e7834762a0595a07d7258f2c001ef867a0d908920a3876df48a25fe3b4e"): true, - common.HexToHash("0xff480f8c4722db2e154ee0f366cf3341b3c1faf60235245cae2a02307a2023a7"): true, - common.HexToHash("0x44d9d7b5a70d74bc3e49c0e9771e8d3b809507b2ecd9b23253ea287b58ca7eda"): true, - common.HexToHash("0xe9125896969396b124b8d7531cda42f7f8dc2439ceb3f317b78b1290ef38c2ba"): true, - common.HexToHash("0x4904616ec8dcfc2456ca4f5516cb1d0d7ed19a82e76bcd6d2883d302e542835e"): true, - common.HexToHash("0x873422bd785e56500af20027b95e5821aafaed8efa1016464ab086a13ce54422"): true, - common.HexToHash("0xda0f5e913e8d56599b958f1833e573193222308212ac96f4e3531a353567d1ba"): true, - common.HexToHash("0x039eb704999935c5720c01578cfd07fec91cbf9b9d18aea8fc64e0e1b977724e"): true, - common.HexToHash("0x0611b617c74eafd96760a9e72601e3acf22f30fc239786226dcad0cb1da85af2"): true, - common.HexToHash("0x4f7052d2320603d9e761f65ad31fa0d3f88bf57e1d18a5a8c732e66849ae6238"): true, - common.HexToHash("0x1e25b9686df142f724b7d2adcd9aa1f01d42ddbebe231df0989abed1a1fd6f65"): true, - common.HexToHash("0x3f299deefed3972fd862c8eb57ec3fdf308fba9d210b9dcf3611c2709ac2194f"): true, - common.HexToHash("0xd350aaf328e3e243ec7623af9bdfb4235c0c7c7d7dad2fed31293f99e7d8093f"): true, - common.HexToHash("0xc677954dd47b4470b5d74d8765272a8bc8fdee7a6c3fe28bb6b946c063d7a376"): true, - common.HexToHash("0x70288b40d0d8c81ead1f239aaba0395fbb967a14225440f747b536250f87c100"): true, - common.HexToHash("0xfa0ab4fdb55f751d83218f9d41059fb30fd972b81a7cc0b376567581718f0cc8"): true, - common.HexToHash("0xa801d1d7a4e1f4c5f107c9734579fc494eedc661340bc2577b6bc0ca79e8db4d"): true, - common.HexToHash("0x20303986ae8b02c1258dc5599ab2962d774741d4dc5fb49536b43d8ce7c68d33"): true, - common.HexToHash("0xc152181c053b23092bf2a5e313a040d0e24d0026f21d20694b4eb1193323c210"): true, - common.HexToHash("0x0217bc80d9e942f469d3b83e8fedbaeeaafb1a91b160be14b1c2adc3353198da"): true, - common.HexToHash("0x3725796fdd6b10898ecd5237f170491bfb063aeab310056ae953897e7b355a4e"): true, - common.HexToHash("0xabdfcd21b23f6457a6f0da0f992223bacb19fc605d0a7e4cca4c61a1a1d75ef5"): true, - common.HexToHash("0x414aabd9a203355d2f1b2d693d56a59b40119f9214d32fba746f297bd280cb4b"): true, - common.HexToHash("0x8416dd62f7def884812f737967b76251282af4df638294fca14334292b0b3820"): true, - common.HexToHash("0x743bd0166766b276489300b8cdc635d7595e213e42df4117b6650b444c276524"): true, - common.HexToHash("0x656fa2686ce0de2525d2a9996d7467f78e3f0051947cbb27e10b1b968a748ced"): true, - common.HexToHash("0x39c3a88a51306e9f2e6ebb7c2978f06d55a4d73743f48144b7851c7bd534c9b0"): true, - common.HexToHash("0xa7eb3db7c3a2f9fbacf544226c3511f9af3baa2b6c4d77276b12e873e86a0e56"): true, - common.HexToHash("0x9c279e17954b00780a8a3722a748b37066b3e50b3616dacc557e85c99d45e670"): true, - common.HexToHash("0x9226acc6017575d61413a5b16326e5e801d7672ddee7b90bb8b9ff3af8b63471"): true, - common.HexToHash("0xfdd53c94463091b78d385684f5e4f41b2a5a5fe47df33d20df601e0ff12aed48"): true, - common.HexToHash("0xb09b9a2dd007cd568e78f23812ca36b68c552054491b875445b6e0d812952434"): true, - common.HexToHash("0x4f8f4a49967ddd846cec6468b871d98f3c6ae6a42f9a21d115a2f130756fca71"): true, - common.HexToHash("0x11495d91185a600b0964e0e8657d9b0da0519f63f7fe6928579ed64dbab02411"): true, - common.HexToHash("0xf57e632dd306c7ffa7a6c01900122d4153e48e5a2f66bf5f1aae21a4ab49e74b"): true, - common.HexToHash("0xc57a23daf7a31009899c00924af7723abd5e5ec505a483c2e899b1b4e1370e49"): true, - common.HexToHash("0xf9b147c13e85e10b31efe7ad403af4c2d7bda452fcd768ba313a6565bdcb0564"): true, - common.HexToHash("0x290e9420c7df5b58c88584e20bd92f6db7236e5d41fe25bae0e690984288b2b3"): true, - common.HexToHash("0x60aae339abb0eae92504970dcc2308bb3e3756e4608e6ec386624e0e9e1707e8"): true, - common.HexToHash("0x2a09868bfbd6e991ba4c41b9f9d62e87439d826692207601ed75e1c8b28a81f4"): true, - common.HexToHash("0x732e254eb3fb5aa295a6037527e386dd0f8e3565d00324833a78dd2d325f70e0"): true, - common.HexToHash("0xb9962f14ecb898f9eb512cb80381dad06cd9765e18b0afd9b1bf6518bb626282"): true, - common.HexToHash("0x635c45eca2fdbf89fed4e1a88466af5b534e104e10aeea3139213bbbaaa39e82"): true, - common.HexToHash("0x8c081d752df7b6801d51a6db981aef312df0e18e8c95024306ef0e775a24c592"): true, - common.HexToHash("0x648e36d7b83ea535ba036549ad224662df9a1a57f0abaa6c1ccf9c4f41fe35fb"): true, - common.HexToHash("0xd8f77d4b9de339a24749f6d31ae5ea449c4c52d45e00251f2394f1424f416b5e"): true, - common.HexToHash("0x8815bec4f9e6d7d703a948ea1b0c9a10ed0d83b6df234eb9ff6f177ace815f39"): true, - common.HexToHash("0xd23f3735e538c6cd80930f74c6cd9d4c77c479d67cd099d8a043c4cb9b964ddf"): true, - common.HexToHash("0xb4df1c973c1d227e35cd0ce625aed1ef349727c47738e432087ff106a6ebb34b"): true, - common.HexToHash("0x608241a344fd5d9198053929f6dc3b0d53d674c19bbfbb656c75e62c44bae814"): true, - common.HexToHash("0xfb4729569055ea64160bdc8cb33d01805734b97505b7c74ec99af7dfa05edb3a"): true, - common.HexToHash("0xee68ee9a57b9d90a706011b85821c666171cc31b87a497ba30b933f45b357324"): true, - common.HexToHash("0x61ea86c6bc4f20e27a6679956768f4f2ee0c7c62772dff4fce442c4b849102f2"): true, - common.HexToHash("0x0f07ef7f7ae2bd04328366d05986c82f3cf91dd19f6d2ed812c94ccb38b35e96"): true, - common.HexToHash("0x5405915ffe0630eefcd88914b095f95073d07fe687e7cc700a8381415b550924"): true, - common.HexToHash("0x613d9a89e66c87e7eca88ad3152ed58038c3d81345bb7a3309189c63dee8012d"): true, - common.HexToHash("0x99c5305cdc46fa74c57f244f9fc035a43a880cc5ca1c987b037f70923d8f5f81"): true, - common.HexToHash("0xdd33d6172041d2ab567872103b090ac46982e306302f96f7aab2c727dcac80f9"): true, - common.HexToHash("0x0823f0474aa02e9f3921659cedc14ee3f6b78f35938a00b10f63eb61f87a6380"): true, - common.HexToHash("0x3da48ff1a431b471bf8751b3e40116e80cbcb730ef7e86d7756d7990fcfa661a"): true, - common.HexToHash("0xe1da71eef4a1c010116e3f36d5e58a1c44c08db321880bd558793bba67dd7ea0"): true, - common.HexToHash("0x01e4d648af6774536779839839d95828a75da3835351b2929000bfbcf6546267"): true, - common.HexToHash("0xa9f5a76329fb993cd098d3d3d31b73fc26ff13ca92540abcbf04fe0d1188dc8f"): true, - common.HexToHash("0x303530c0b26a64895ee37e989f425eb3f27d464e0fa64de0e1612b4939c8f7f4"): true, - common.HexToHash("0xfeaf901740b91fedfa2843e1d8a6d3111247ad3225e7b0b695c8acc40a967aa5"): true, - common.HexToHash("0x5987d3e2a8ceeddd3b9aca7dac9fba3b56591204fb5d4b0b16dc205a3d5f2ee8"): true, - common.HexToHash("0x9b820e9435abd45b4221f04a0a51d2402c3f361c6a1dfa54e9af27c8bec82b2f"): true, - common.HexToHash("0x24a89f9e9eb0524f33be5e65d1b201348231f9b1ec12d90416dad2d5c65805d8"): true, - common.HexToHash("0xe69122559fd9543f38f4a4b725d694e18cab08e48f0be227404030278d2f3f61"): true, - common.HexToHash("0xc3782fe15e109da03d12c55d19ea1076be53182d082620ff8d5d5ff76da0f807"): true, - common.HexToHash("0xf6988dc3c4f779cd492f50dbcd26e2e9042cc48b4821d80bc1a0bd1937223fe3"): true, - common.HexToHash("0xa68e94691fe01dc927c405b87a9167d80817127a654c24dddceaa9e7d8020afb"): true, - common.HexToHash("0xd82a22d729d58f1aed5951c2b7f4fbf46d6c35f72c7459e5574593af95a44bc4"): true, - common.HexToHash("0xb2e0e36413087c8f8d3a8c8ac9f39787d8f94102c2516093dd6c02e46c844706"): true, - common.HexToHash("0xad34804af9038ad2b9b4707bea7418b3b8973bcf83d5cfdd749e91c32103c8a0"): true, - common.HexToHash("0x0b37209cdbe20f2f60ffbece1c1e2bb194553faf1b0ec9b46aa558c617d4f0cd"): true, - common.HexToHash("0xd07987dc39615734a9687d8dbb33186641edfbdd8e158a1ba5430c01c362c448"): true, - common.HexToHash("0xecbee6959b14d0c7746ec71243c01e774573ffe362ee6cbb03dd71252d5cb67d"): true, - common.HexToHash("0x48f6b6cb2f492d38fe82989f23c4d86d2a5fee415a6d1321cc64e29db5481d6c"): true, - common.HexToHash("0x2c63cebb56b2b8dd0f60a3462a1c479ae2c420252e95ee0b3371b383abc51c65"): true, - common.HexToHash("0x248b000a9329af44de8563d96895edd012800d76121c769aac500d09ea65d385"): true, - common.HexToHash("0x1d75c9d1774305d62f8f51e65c06547623a7c2afdfcfab5cabe032186dfba75a"): true, - common.HexToHash("0x361c0866dff92a705cbdec7c1babeae586470662f82b3ad0bdb666f8986fc408"): true, - common.HexToHash("0xa12ee8d9baa8985ee7c69fcbcb1e942dbea7b7ad1e2c0f2a5dc0846021ee1b1b"): true, - common.HexToHash("0x6b340ae790fbdcd4d9df9f0be27f20c560145b54bf305f702f92822e50e1ad1f"): true, - common.HexToHash("0xc48e8598b958bd485a5efc8a19be23f3006d912cc11b882c65e5d61d8023438f"): true, - common.HexToHash("0x5f0cc81d95cccae6b690188c1b58f583fa6754bba0cf93d9452c0b4e3b997c31"): true, - common.HexToHash("0x4650000304429b031a2c56debd844f20fb9b393749eeaa3c5cda1c277b3b66ef"): true, - common.HexToHash("0xf4f91947ce3b4c683681d80e9eef4a25bbbeb22050b3562da2a9c39436c4228d"): true, - common.HexToHash("0x036d4995cd62007ec69a8a22aa4849a504241951c24a0d5fef8c848ef1fbaf15"): true, - common.HexToHash("0x0e225cef3316c8bdde687997cf7f02ed41b35dc105f82e917b8d1a08186352ad"): true, - common.HexToHash("0xbdb623d24d4298b20d3078d1801642a6c47ba3d014904e2daa306f9dc15ceac5"): true, - common.HexToHash("0xd132ac96c452cb462bd28074825b488c7d52410d4f9c1bbb512e22b06a56b8ef"): true, - common.HexToHash("0x30770a68ece8d64f0ed94dcfe6097d3187dfb1459d1f99d0fa915c5c0d774fc9"): true, - common.HexToHash("0x043d6a2c88a366acc849fc05e5629fc257371fc5578aac3c810a90ff117bfc54"): true, - common.HexToHash("0x87b9f7a447ad9b1a772f0d48404bbe0b4aa751de50d157833132db528c42ca40"): true, - common.HexToHash("0x312a6b487c2288f1ef954c11e6d5ae7a3ce0086c96b6d1e1904ce2e630f371b4"): true, - common.HexToHash("0xa3c948b8b929e0b7c73df42aa5b6e6e1a31e2095115e1d66ff8b9dc4a567fb23"): true, - common.HexToHash("0xab0c5fa9ef7a455f4db07af92584d67abda785e9e41b95a7b77f151fd264ce58"): true, - common.HexToHash("0xe03229a89c7d75844c31ba18f3f2183da728a26744f959f742025ea557bba9c5"): true, - common.HexToHash("0x82f5a847ed268c51ae6890e185cde448772a4a371c5b96fee05a23e134fcf445"): true, - common.HexToHash("0x47d5f7a04e7d18e24ff60755c9f84e534d2753f6f7f7d31bea6e9d6e9d9807a7"): true, - common.HexToHash("0xc89ddaabf2b8eafc75355963615540aafb05e532438e27b9f7e46817c1dd60b9"): true, - common.HexToHash("0xb24e73394f8e5ded6132c421bf02e147666ccbe490a1b064fe0370a7c855259f"): true, - common.HexToHash("0x72e573f06ee53d1656b769bb84186d7c3732543f1df21392b23f0aec236f23d8"): true, - common.HexToHash("0xb488f5d874d5db96cfdb830153146a19e00164545a5a151b5b22f0fa6c2fa764"): true, - common.HexToHash("0xf62679cf3226ce71e9e47efe720c455004978fcc3d8185437c292c66c9f605c7"): true, - common.HexToHash("0xc1489f804a0da8ca7ee7da2ed94cc5524755b09ef1d5c01055adf7d8e70e11a7"): true, - common.HexToHash("0x41a00c5b859dffc16d63f5ce474ec7d88689bc3c615b1d8c826829e65122d2d1"): true, - common.HexToHash("0x498d238f1e09a6f7c8aff1ed2987f99ed0272e0ad8cb4117caaa98af1d3bb943"): true, - common.HexToHash("0xf12da2b7a0201106b2ef7af5b9cc4601711640ef8fb3ddfd793e874f4fa7193a"): true, - common.HexToHash("0xc18d99d0140b0c64415af780397e7c5ca3d72337ceccfe27623bba3e4760a7f6"): true, - common.HexToHash("0xebe3ac2276d8cb04f54b4802611a395b0246fa972fd556aeb88f5665d9f02ea0"): true, - common.HexToHash("0xb45253aa48237d7d436bf123a9953b196b2a97dc6489d4592fbeba7552881c62"): true, - common.HexToHash("0x3ff7e504053d0b817023664ad84737ac5cc201f3b9c82592f518d9d59f6d1c78"): true, - common.HexToHash("0x834ee42f208ea8657bc0369c088c3af32ad11b655c09be12d9978f74004c6d15"): true, - common.HexToHash("0x831c203027a19edf673c42046d8120806f08b136303337e4a189bd0de2e57c17"): true, - common.HexToHash("0x0d866c341056617482675085e12266156b212f70af9420a1f77c163e51b92742"): true, - common.HexToHash("0xc17892b38e4691d44028a47fa9c139a6cac73ac4287cdfad206384af647d809f"): true, - common.HexToHash("0x8cd3cab7bd6d6697bb8654f988fe480fdc86b7c4177c3e7ce3477183e9ee1296"): true, - common.HexToHash("0xaca57133f25d666a11974d1396feae3e87b69f9c407c6c51bcc707c0a4dd8da0"): true, - common.HexToHash("0xdc55dffaff55651f40371d35acef612c4d73309044ed4243a50ba4a0bbb34eae"): true, - common.HexToHash("0xeb090111bc96ca89a485219b9c19252e5b70c24814dd104974c3234f52200f67"): true, - common.HexToHash("0x6c90ada60e305e43e6e5b3fb74fac321a5eb777034c99e30856efd94d979187e"): true, - common.HexToHash("0x3f79f7a8f9e2362550b26fc14fe3a6867809f76c65390a20bd5af68ccd8c03a3"): true, - common.HexToHash("0x9108782f3de8dd09f961cc61546092778a4ea5346d93cf610ff493279b393fe3"): true, - common.HexToHash("0xa05feb348d658af7c26ea24e7bee0fbf84a4c03424c3737182cc2f301ed7006a"): true, - common.HexToHash("0x8bc823c5f9cf9d0a47546c67a20ed94ee746c788b84337a63f98ca1647d299f8"): true, - common.HexToHash("0x6bb8889158f67f92fb8bba33de7ed9eb190348bcc0072e6e8ece14db8f9788f7"): true, - common.HexToHash("0xca19d4f78bf7d199de4173dec82a32e6aec0ac01720378ab04e5e501317a7cb8"): true, - common.HexToHash("0x00873d0d9a6aef5750a5d7427f911e600d54e7fe1ff60ec2af1c0a1ca79fac53"): true, - common.HexToHash("0x9f06cc4ead09869f00aac6e2dc1af53eeb9773c14ced2072e66b2c813b928e1e"): true, - common.HexToHash("0x2a350b43ceee7f046659fc8d7d4fc724726e4a4bfb7fe4445b47113e887dca95"): true, - common.HexToHash("0xf05cbb8c96c12470542a34e6d19d58ca5c7de7c001016ff6e299fdac3819a865"): true, - common.HexToHash("0xc36ffc39e4e280389f219211ceae8f17d00edc782f7078968d52ffe9a46c09ec"): true, - common.HexToHash("0xdfa1a959a688d2d207cada47b571a6d391678f07775ed96e8fdbc59cbae647a4"): true, - common.HexToHash("0x32e330fcbe601e2d0572c6ed502271b837e9e0daf9989d22e3e617da1b4a00d1"): true, - common.HexToHash("0xf66d9c4ff47cb85dc99febbf93f1e8ce34c9c8d097ad9d15175ca9b16444f9ea"): true, - common.HexToHash("0x7d7ea3f1cdb5add6224eec1486d0d95a0c78e02542e7a12c9404da8a2733ceed"): true, - common.HexToHash("0x219808602b84e5626b3c633c9aedfde52a9e2f9608e41a7093f468db8ba47578"): true, - common.HexToHash("0x1467fa9027f6643d60f24fb6446efa6a59782c49998580dee5422b64b14194c8"): true, - common.HexToHash("0x88376e890733504a269a4a7c7872811ebad3f7586db98254a9ba128049ab89d6"): true, - common.HexToHash("0x21495e0741dcf4c5a59f8027c121cd347ced13988fa2d5baf053e4081cc7bb62"): true, - common.HexToHash("0x6032782d97ae588165a7653fcd5a46bdf436d92f90ec6231e20651f3d0e84c1e"): true, - common.HexToHash("0x82629e0055e03e1b62c9a4cd9e8e9b7247bde661a2e03575ca856a36079f9e9c"): true, - common.HexToHash("0x8c4f90215106e97d48090bb4864f5bd084a3e05a90834c92d4a2a7cbf37611a6"): true, - common.HexToHash("0x0f44370832a0f5d4c52c05dbcd427a81703b6582cee822c256c746cf0386e3ce"): true, - common.HexToHash("0xef0619dd61d69ee49ac5eef98f367378b256a78340fa6d679389688430e2b230"): true, - common.HexToHash("0xd9e7c581b0fd708a51cdfe9375bfc9a566dcfdfbba65585e353d050fdd1f77b2"): true, - common.HexToHash("0x22a9bc9d1e73506d756a3e1306ed51e0009d2cbf8c0a19f5ebdbc16216548f10"): true, - common.HexToHash("0x69eb9a80b7bd62da0a70b1f9a58c286ef9534f0f215e9781184701805c53ace1"): true, - common.HexToHash("0x96edad056b26f06737a4e22b2921bf8fd65d8bb2ab9c0c98a6d4f8f731d00ecc"): true, - common.HexToHash("0x49f7b8b506373de81a9a99333180204bbc58665a7dc1f13cfff3c17bebc7ca2c"): true, - common.HexToHash("0x2c20d1e5e5e836478774b4b7f4a30d285a97c21aac0ca70d4b6c908a03fbcb06"): true, - common.HexToHash("0xd7eda3c4237efa830f1d69d6fb84ae7a38592cb2d7653e82b1e2d29f06a821c2"): true, - common.HexToHash("0x20416d3dccd725e42018974674e23d420cbb23a54a174a590f8c2668d2e52e67"): true, - common.HexToHash("0x2ad0879206b0bde1ce2eaf8dc7b146a302484e9c566bb524210dad5a3f06f1aa"): true, - common.HexToHash("0x80d19bcd1b8c70aed40916f4f27f0017b8c60987f71401bc69fe9fc6da2c6812"): true, - common.HexToHash("0x9eb9a3919cbb7ab03de5c4e7771e1fae4b5d5307fa89498a4706a24108422687"): true, - common.HexToHash("0xaa62b5a385e24b4341bfb2ffccd4fd300147610c0ead0fa8e9c6cc1c61bede1f"): true, - common.HexToHash("0xba34d380bbd7f688d4f0c13b6f3cb16be1ec9e6b3b9f4f853487715e78369694"): true, - common.HexToHash("0x1548346ca1475eea1be210946a7ab70b29c3ed67bd93b39823d0087f389d9967"): true, - common.HexToHash("0xf39f6d8551e53504ef56e273a15633e08510f51ac73231fa29b101c5b7b8a26a"): true, - common.HexToHash("0x6bab8ffc1ae1f340726e0dea950ad40593deda31988b7c1f6a9b5c34f2999cf1"): true, - common.HexToHash("0x31c24184bf2a79be4985587db3394c379be37fd5040070730ae4178b5f6fc7b5"): true, - common.HexToHash("0x98425d2c19e85fb96ea3c6fa8eb88acc5a87595f7b6d209851995ff320ae923a"): true, - common.HexToHash("0x96b4b5236680f12f927710146595b9799615b1786d27e53d6df2b6dfeac2ba38"): true, - common.HexToHash("0xbfecfe0a7b7870299806c9aea7f638816fec766397a047cc08eef2206c40dbb7"): true, - common.HexToHash("0xf36e329132c3d24802a6635fa77e0efe9b70269c196ac88fb336ea255079b9df"): true, - common.HexToHash("0x6d640cb11e6e5e1d07c13ad4c5a49f23bf1935911d1a7909b6086324860ecb13"): true, - common.HexToHash("0x21446d98a9de73fc6c1dc525e9a2e584f527c9e6dd83ec5a9a0b6f6586446c33"): true, - common.HexToHash("0xe59cb637415618fc3c5a65dc0ded4dfc6a5447772818014eb560e2236e03d2c6"): true, - common.HexToHash("0xf104b56e4d6be07948c684f9fe2ab01c103a46f5903af7132cd9ede58b2ba6f0"): true, - common.HexToHash("0x69416a6eeb5e8006fcf747fffa18483a32404521826b3ca2991714b40df5e7b5"): true, - common.HexToHash("0x123cce5c152bfaafdde852d0b49b451df19ddd3201bd92fa5f806bfdf424bf65"): true, - common.HexToHash("0x78eefb4b5f2e33e173342cc450ba27fa3a0b0fd8e19c2326712ea235aaac8e5a"): true, - common.HexToHash("0x0c459100118f87f80ce34bdab8ec58a9815bed37c14d5f073d9f12265dada249"): true, - common.HexToHash("0xaa3ca5ae3b00b14b4b14a6d35200a532cb3c036b6d3a405ea822a3ee9dee1ddd"): true, - common.HexToHash("0xfac95cdf471d590c995d71f2fe431a6c55eb2afb14515f5e9108ae18d900cac0"): true, - common.HexToHash("0x72bc01b2a6682f9ccd5c87f4b0bfb7c1cae0ace1dbda315ea69272c75991ff9f"): true, - common.HexToHash("0x09e28e5506e373879400ccc81d3834ef84e7ec9e6df9575676b42d0061ade919"): true, - common.HexToHash("0x280edf28a7dca28ea98eeb361308568d1df67816c72ae9ac8c3811a3f77218ef"): true, - common.HexToHash("0x103a81c490c15dc6d4b946279683a42f14675e71bf188f9e69c6e828146c319c"): true, - common.HexToHash("0xe055c1a84d6a7e62a34d84853b962b18269fc6e7a2f10dea8182f9598adab63a"): true, - common.HexToHash("0xc7d51af2a8ed99843c94f12679608c2ef86118901f4c1355fd1b8b66e28609cb"): true, - common.HexToHash("0xceec554607bd4b9e3701b590b7d9db6f5441d3c65e76bfd3352d4d5965300544"): true, - common.HexToHash("0xc27b87b2261f3b6d1580ef43723702c50dab7fe856444d4f913f077bcf6fa50b"): true, - common.HexToHash("0xf3c592e1d97ef8f78a7efbf619f39e1d21a20b6e326abbbd5ec85ae5798711d4"): true, - common.HexToHash("0x2446fdd4357a5f1165977c2a5ea5d9849b0446598e78114846d70645a5c78975"): true, - common.HexToHash("0xb2866d51ab30dfb998dbd3a7055a6527fdbac9a147fb17fcf7e6d9bbc3be0168"): true, - common.HexToHash("0x4c7ee274bbefa644eba60710c1eb4168543cda75b3e8605883e7d3acce045291"): true, - common.HexToHash("0x1475f231e0e93f8cbfd87a69497677af26d5123315a447d0106020abbb4b0dd6"): true, - common.HexToHash("0x5c0ea43b64415169c5cea328c92e3c24824d16154a5c0ef9c276e375cfebebf6"): true, - common.HexToHash("0xc0bd5f6752084a3a86510542864b7cf7c0101c1d2cb11193246aca81e4e47302"): true, - common.HexToHash("0xbf9f56871a55fab83dc769403bd9b5e5e059b7d7f83718992953dbfcee570603"): true, - common.HexToHash("0x5c7a62f8a515eaa55c39053c19ec426155f51c1a5e4c2d2795df0d9cc9722e3e"): true, - common.HexToHash("0x63ae9b657a49ba4ee382f0ff477e030c19247d79949028e5858f4f2c2794df58"): true, - common.HexToHash("0xbcd520449d04e99c296f4cde04470127436f22f46574087aba463872b4bbf4d9"): true, - common.HexToHash("0x5f687c7f3f46ebb7dbb4d8c61605be0fe1d40651aa5e696b05f45ad8075d066f"): true, - common.HexToHash("0x9d9d544cd37890e5971e5f29c1d630059166125b70fd04059e6b6ac99d4685a7"): true, - common.HexToHash("0x542836bd3c0791e93db8f268e6f72d2e56a7d5c2fe05f1fa0bcfad1bf4ffc6d6"): true, - common.HexToHash("0x41dc115eac25fc12591c927cb045b70df4025a288ebf0df3cb99427226c0a12d"): true, - common.HexToHash("0xf36b1ff9e641c1473cac4c56340161a3d7915bd251f05365c0540d714eee9d28"): true, - common.HexToHash("0x73c314e38937c4a5682c3c95ceab04c0260909bd7d64788885a9afffa52444b5"): true, - common.HexToHash("0x6c02480a8ff00eb8336cf7c1bc0262a5970ae472b370638ca15e514627a8bec8"): true, - common.HexToHash("0x4291d1cfbdc4d3361385f4d80ee177b0b11864bc734a2feee0ea3fbd24eb10cb"): true, - common.HexToHash("0xac145f0a4a4303906fdf639344d7807e0e086d6e5f9d78ca032217bb0e2d6b3d"): true, - common.HexToHash("0x351fdff29db94f8895cb08068da49b07280ac69a76e12b05d81b7663c3493652"): true, - common.HexToHash("0x2c26050bb2541af454637281d460b8a5be214e654a7595e569160d489606913e"): true, - common.HexToHash("0x62361e0594ad9e13eb357edb612fba811c26d470c5c4a3d9138b82274778a13f"): true, - common.HexToHash("0x21e6fbe2c7d18d0aa0d2a44eacf973d739226b885d7cb2eb3bf563078112754f"): true, - common.HexToHash("0x4ef27efa794965d5de2881c484b6fe0380d897f8cd3520ad0ee40454d4e8f3ab"): true, - common.HexToHash("0x429aaaf65c24539804a1ae95389d227dbbdffc95630a9f2eb6a478eb2e0e549b"): true, - common.HexToHash("0x883ec7e325c172f59435175cb4e692a1d3f76b570629bc1ab25d0de3e4547a75"): true, - common.HexToHash("0x477c209e37894e8e826094cca3e4020e37f1a9cb096b65ac8608cae6a20477cc"): true, - common.HexToHash("0x4cbe2f6a25d5985cdf5f008e58d0ec7eceaab05c0b2ea946e9d3e256d7ecec2d"): true, - common.HexToHash("0xd484e09b531d9cdb32e9271e8cc35c0ee5a2574baa11572ab66413f17e160d9a"): true, - common.HexToHash("0xb7ee3325f71919b5efe23178c92b9059d854831ad8fa1dfe59d4300f06c0b03c"): true, - common.HexToHash("0x5af96a0c41ad8ab613695081f60aae53a3bba7e305bda61b18281c9ecff42f98"): true, - common.HexToHash("0xbca423ba99bfd20eb8b97c4b1e47c1fb94933abcd6941cc2cf8d1fa8aae72d09"): true, - common.HexToHash("0x3b4eb09bd03204c15b138127f97156d1f9af5eccca842a745256aeb6f5f52cac"): true, - common.HexToHash("0x97ae7aae824d15b60992bda9bb7e4594493d6d725fbfbc715590be0684223b8b"): true, - common.HexToHash("0x3c903ea0d270ad5214df3d6d585f215c78b4e658b38751e5009008e1d60069c0"): true, - common.HexToHash("0x3fec95d4117d87efbe1ae9f2acd833809d74d09b7fbd31b090981832a3279c70"): true, - common.HexToHash("0xd21c5915230e9c7878822fb5a3ce0d70a971b4f91b76ccc7b24572e72a378d2a"): true, - common.HexToHash("0xb52f6211f06c696c35265b134aa7aae63377eb6d93310e5d025db69386cea8d7"): true, - common.HexToHash("0x3df0d331133938da7798af0c63101d4d65dc4de3499b8467254ba1cc8dc8c2f9"): true, - common.HexToHash("0xce6aec090dff6527efcad5fb422aa7445c35e92729dc63b706ecd0ba48e7c929"): true, - common.HexToHash("0x5a473880cff2ff8ee112992b462df2f3e202ee0808d6ca13732f990dfc40554c"): true, - common.HexToHash("0x15f14ec4fe404648b0d311c393505789a3710137ae3fb960dd96824c2bc14646"): true, - common.HexToHash("0xc9be2a77b0f1368242ab9908fa5cf22fab90c40745b2b083aa898b582b2c3ba0"): true, - common.HexToHash("0xa0131858b591c2aaaef4124b3341969db247a31f8c8fc5e54cdda83a12cb0a3f"): true, - common.HexToHash("0x0ba4d4d0ec54c14d692bd4c9ef6731d8d2f6b19b11c8867cfc1dc6f78d958217"): true, - common.HexToHash("0xffe690130ad9aa479f8f916e94bf03865901c14c6408393a741e458c946681f6"): true, - common.HexToHash("0x13309d1d5207ea191a5e3eace881644c30772d1f79e5e267abc115b488edc9d3"): true, - common.HexToHash("0x33804b0ab86e35d010bb60b66ac3f5b0cc8600251cbcffed64b0ece57c004519"): true, - common.HexToHash("0x7a903fe9888269044418192e98aaeca885118a890ea6d7e593022adccda4ee7e"): true, - common.HexToHash("0x11790409e85fbec2ef8e8f46de769e6721c1710dcebf2f8cf2e0422422f86e80"): true, - common.HexToHash("0x0e88ab3ee483aac088436a55611faae66170f50b18829b9e5a099995fade1d6b"): true, - common.HexToHash("0x241d5c7720ea2c2fa3663041ed929a72f4ae41d271de627036f31df8c517ea58"): true, - common.HexToHash("0xd097724448ffea21204afd9ffdf46056fb755061202c13ecac7683412dc18236"): true, - common.HexToHash("0x05574b166511c549d3677b4196b6f4fd8478f3705848813d8768fe283ae235f4"): true, - common.HexToHash("0x2bb56957e535068727971384688002891951ab827eba817debe32b1c705aea1f"): true, - common.HexToHash("0x09cb0ce0eef208f4c244b6add256c49d038d4ae647f4461860644ac70aff46be"): true, - common.HexToHash("0x6d737e35559cd46e36ca35a6e1d78e0d411a9bb75bd15419e99971d1e9f421f9"): true, - common.HexToHash("0x4b694dbdad45655708c7d61e9d5c18d2827434257d6e90ce52120d5139bf23e6"): true, - common.HexToHash("0x836542b88d1eee95b6f402b5d2eaae55be5d5b2e636f1641eea5371c2d40d245"): true, - common.HexToHash("0x7a82580c935bbf698ae6e078dd350dd6aea0e33552f8fe10f89e32c2ae73b258"): true, - common.HexToHash("0xb317b50232aa014caa0d910015837b7b809411fc2c7df2e6409c4d7726cd8123"): true, - common.HexToHash("0xa5a2aec3205aec03dd43a24adecd620a1d530a965aff612682932d2c3ee52d1d"): true, - common.HexToHash("0x7974cb480b6a1cddafd4bf6ca71abbd1ba3b72c277fcad0a3cb69e52c475c34b"): true, - common.HexToHash("0x963acda76ac17c25494aa32a6f226ad0f7ebdce18bad0c118f89b8237110c085"): true, - common.HexToHash("0xeb3ca8f26e022905044e238b19bd8631c825f0cd6c9e7f78c13ead0d889ca93f"): true, - common.HexToHash("0x112b1cba4ac0f2652db16e22518294fb00c7a8442549140a924829027439ca03"): true, - common.HexToHash("0x4e9598e54fefa2ff4006c956fecfb237f4fc8498d3f201f29d9c996503e1b690"): true, - common.HexToHash("0x78e36cf0ce4af8b2d3d11d01abe36788c0adb24ac26c375bca282e45d5b88ef7"): true, - common.HexToHash("0x7776845cb822640ccd1e97bafdd7175407b7cc6b6ea81bd022be6ded0dc6e715"): true, - common.HexToHash("0x70f1c8fe6e3fec95b9a36f6cae34c86e068ad45063aadc5c2bce52b2e3f8f2c1"): true, - common.HexToHash("0x3de8a46c5f3747de92ce05c5bbfdbdcedc8e57af864665708b2b966ba71efb79"): true, - common.HexToHash("0x4b07bf7726e86b7fc2233c4fb744ce0fe82e6e153accdf49a570d43574290dff"): true, - common.HexToHash("0x2282a4ec0040f4e2e4732afdd0862bc6d02fbdf65ff92038e5d459122a36ff76"): true, - common.HexToHash("0x07555018531da894617b8b942f282d04530f2f0622cfedf831fcb8ea2950612c"): true, - common.HexToHash("0x4e4b98d5be6fc65fc9ae4986a9e86bc21db05041a5b6df6e133327cb9685d2cb"): true, - common.HexToHash("0x3d17d835ffaf50b3e55e091735180ec48033c5b90b5c61f5b8d6eb897d6a7351"): true, - common.HexToHash("0xe09478df2a3bf49d69f5fe04ae9d5ddc9bf24373fc3adda96d269e5c26842bcb"): true, - common.HexToHash("0x35e8a716280e03b83126b1527c5b2bcdac72e84e914a2911073975fa2b3199c7"): true, - common.HexToHash("0x3fd24aa35bffa38f0ee6f030b660ba64ec85ebf0ba4ee99a7864b79c761096bb"): true, - common.HexToHash("0x32fd6e68cf91b89b6c58a1b3ec21259e1f0559c552d70236aa3f9b2c0d422092"): true, - common.HexToHash("0xa00de8b00a582f1037c453ebe85278139a54e74f030a4a840dd2715af7a2f903"): true, - common.HexToHash("0x495e978a0ffa7660684d7047ae164354ea54bae97f502f1bc306dd5c4fc7ee0a"): true, - common.HexToHash("0x2ace053148aba036c2f7da15248b760ee16c8b4f2ef1f34b45ec36d56fba8549"): true, - common.HexToHash("0xd0a445cc9e95efe83574f62b6db78166f1e9f4d876188ec59114995bf0b136af"): true, - common.HexToHash("0x275a4bb1a5e59c0993e998d38e95d8bbe253de81b9202f6a9a59f7d775930acd"): true, - common.HexToHash("0x57802fbc1804ea6618b2e355ae3e2aafe9d3871a762afd741cb18561a4521d77"): true, - common.HexToHash("0xab16c364a4fe4d61501d1a40266ba2875fc51bbcac827e25524dcd75ecfe525a"): true, - common.HexToHash("0xadffcf18c978e1abe65f7c7e3c5b9f6645bbd5c505dc674afb342d9fa563ec5b"): true, - common.HexToHash("0x30ee5df34615cebd862af8e4ca3d1e0feae338a131af839b72a119515e4b925d"): true, - common.HexToHash("0xcf61c93bd81121a9204507df11b180c70ff65e49f437b0bc1f5fb910f026609c"): true, - common.HexToHash("0xd4b47211921b02692e081ee9fc1a87bbc6482c6ae49a2b03e58bf39f21b5b2fd"): true, - common.HexToHash("0xc58b5208577870c56026a36d57d12e804d42197b9b3cf54f855c2798bd80af0a"): true, - common.HexToHash("0x82fbe8fc949d582d3ae2b19e3d8ec9cca9c84483b7203445eee531674af7fd3f"): true, - common.HexToHash("0xe4322f12206df42b847042ec57eef3a3c6d8b49b66e679fc49b9bafbd7c48f84"): true, - common.HexToHash("0xdb078721c45027345991f19400819df143c09fbfad54cefdf2dfb34cfa604f51"): true, - common.HexToHash("0xd0799340f5987f6850ac48fea9fc225c60c39b0d2e58c6c9c79447d1e38a9882"): true, - common.HexToHash("0x0ee025e772cb24b97a03dbb9f6c7e23a86529bd4b0b192944705e605c36dfb52"): true, - common.HexToHash("0x9d700e904ff584b82755c7acbb055ff71ad4434f9b680dcad8688d038dff9697"): true, - common.HexToHash("0xe12ec5c34cf26482e520efebfb719c75121436f23d5e35edbff26ed5d29ace54"): true, - common.HexToHash("0x239d3db68a72a5227fc5522b7f0c9ff61c0f70339942dd5f7e58f88cc98a857f"): true, - common.HexToHash("0x8b64b95b5033d22e746ed8eabb41d80f1031ba1529a07ac3fb6e80c6ad948b4f"): true, - common.HexToHash("0x73c09ac4bb2e83b94ad09cbdc7418de3679c73b97cccb9a0eef702c6dce79b95"): true, - common.HexToHash("0x809097039a175d96f990c2a016ece8b9f46069d5d1bb404119af985f921c2e80"): true, - common.HexToHash("0x75be507a4637437631cee85eaafbfd054cc07497d0e2e0b196daccbfc868fdd6"): true, - common.HexToHash("0x1fbd6f83ef51425739e26550d5ffee5c57a0a5caa3cdcb596dc09b69b4cf7749"): true, - common.HexToHash("0x10753d32e6fea36d2ec7a96db3a8f69b13cb178f6c4416b5f11976f1f740af15"): true, - common.HexToHash("0x7624920a711800e2161fc7249a98aa32de667856ea9f403696a5ced3628c177d"): true, - common.HexToHash("0x1fdd12d173e887d032fefddf732f2b4db10a2cc49b24973fd382bda4f2cddfbe"): true, - common.HexToHash("0xa9d13a1803e736980d0c87f0840b530143befa0f68c2db3e543dee6f9c2ea35f"): true, - common.HexToHash("0x38597d532f483494ba23dee981e29a6eb4f97bb45385a2893e835bb2a77991e0"): true, - common.HexToHash("0xc6f62e3e725938f7d7bc52ba67f6b704a0903684df6dfe3dc3ba3ca416133890"): true, - common.HexToHash("0x8676d58d1eca216243d8224015bb1269a2f4c88657d2f0851de7bca887b0fd75"): true, - common.HexToHash("0x212a068846160aadd254c02bf21760ce10198cb434032c7abc5df253d687cf53"): true, - common.HexToHash("0x2d295806a22161e86de0a2987e33fc32f1476460ccb5248b0a13e250ed5d772b"): true, - common.HexToHash("0xaf8d9ecd3f157e64a50095cece9fc3541e35936cd9b4813c5abbc684d2cbb050"): true, - common.HexToHash("0x18f9ef66e5f8f17f0509e314d68474a48d36810e923c78769799e2df123e1712"): true, - common.HexToHash("0xc37255da7edc4f41d051ea20a2038b8f69cc76c38fc17d6d2f3841bf736ab86a"): true, - common.HexToHash("0x7bd6fb9af24b2a4741054627e588eab08e84bc2c70b22c0f077f89979849ad49"): true, - common.HexToHash("0x22bb6afa4da620a73c9dc86d49d198ff7ceb3b765a3ff1f8cdbafdb9d215caee"): true, - common.HexToHash("0x1e1fcfaad94859f2a5c5d83837e86e9c91de30252aaf95a6241b7e39c00a5c46"): true, - common.HexToHash("0xa46ae845e281d11195f60ac4071d6ebfbc03a45ad1a03a1952e35ddb36bcee28"): true, - common.HexToHash("0xf51458b147754d2a2b649f070e89616993b09121c155e3164881ec50f0b0b412"): true, - common.HexToHash("0xb9a512e3849683d4cd49730e1cb528f8ae845f9968d7fad574f06aa4fe3cca3e"): true, - common.HexToHash("0x21d6b4cb20696758f5f58b5fe018cc37f7748a593aa0a757b93b97237f70d780"): true, - common.HexToHash("0x312b25d12300deeb06c4ab54ef2da5aa30e53d0510bb6abd25eaa3c78bdca771"): true, - common.HexToHash("0x85446d248909b85211714e3c4547ccb80fa18e46dca2d46303ca87b26ef93d51"): true, - common.HexToHash("0xf8df96c57c6b659e86628b49c8d7e180788e804845f6f86c1ab9fab50b4a3be0"): true, - common.HexToHash("0x3ddfd8779bf4c61306e8f550c522d74fa5a67e13de2845aae942c2a67c28a132"): true, - common.HexToHash("0x48071e37c0ca1916e6533a3be461590a5542808dd7fbc4936ef4792decdeb58a"): true, - common.HexToHash("0x85cff247a48d5a78c261f62526cccc093e198314036d0d8840d7d02cbb9b2484"): true, - common.HexToHash("0x640e2a93170d08544e9b2e6e3157ee7f28c34ffa40526fdfb81e6ba29b4d0614"): true, - common.HexToHash("0x71a12f7cfb67177e9d2bc8d8f88f0412151e0bd20dbafa2bfacde72ca17304c2"): true, - common.HexToHash("0x173a44a72e3ccd40063a433b42f871c7d15dfe063641898916371307f9fbc18e"): true, - common.HexToHash("0x9b57d88a5800a8eb4dd26c535273a067a3a6c664f6bb4106a1f55cad89bfded4"): true, - common.HexToHash("0x0ba10a4bfcbaaad3c1533bc0836cdd139fa29888ef6b3461e4f5304b283a2f85"): true, - common.HexToHash("0x712d9b2a1354dd4fd0093ea12110166dd3a66c2150d3ddc1d00c4d07323f61b6"): true, - common.HexToHash("0xc694d59ef6f421bfe12aa9af2c0b2bbc5429eecc842bced5a2833c542e262a17"): true, - common.HexToHash("0xa68b0e764a44c6297cda0992489da69d1de46acd9f6c5972916a886c1df96fcf"): true, - common.HexToHash("0xc78de3329a170387d2efa2cf51728523ef09ddae1066908c606da355ebc134c5"): true, - common.HexToHash("0x3c7ab9f2d70e30a0870366024d09679060542f0f4d985eab417313bcd4c7dc86"): true, - common.HexToHash("0x260899df4e4cadf2d7cd41cf39eaafe88d1ee5f7df1e1e98ab24afb43edae8d4"): true, - common.HexToHash("0x0d3bc2bef2b8d69bd8b117375c0411c5d770e469d45b81642bdfba3144fa612e"): true, - common.HexToHash("0xd525fcdec2edc7162c839ce7b73a0c19fb5647d4337739e6cd8b48b8c2094007"): true, - common.HexToHash("0xcd6fdc9246465bed35a071a9834465f13dd5673bbd842d4f358313b53c1076f2"): true, - common.HexToHash("0x740161ad0a19088ec847bdbff4b0420b9db95285ca1a2b3e416d768ea8301a9d"): true, - common.HexToHash("0x3ea42258aaba72ce186bdcc5a0aaf27c6c6a6eaffffc8dda605b90150acf87db"): true, - common.HexToHash("0x8978e04d898bfa2b8b9c29fbdca635f1a2b2a91cc15a0d8bbd477375683f52ec"): true, - common.HexToHash("0xfe00267333e3eb375dcf1c1a6a964d844735a8610b4b0bf966313523b9951c1d"): true, - common.HexToHash("0xe3e764d3c4b9d32136e6562df5632601d64bda7111a2bcdab246cb1d15d2ed8b"): true, - common.HexToHash("0xe8eafd8859f2e8bb42d952dddec0828ce1e89e9c6748064f3f2f2a9afc3fcc5e"): true, - common.HexToHash("0xb1f235e62c1a26412a483ced72e87d77dce330ac471837db1195b1e50861ddf0"): true, - common.HexToHash("0x851d749c759b1f9c0845cd8998f9b4ab4cdcca9d507026c0366107d2e4d7cd9a"): true, - common.HexToHash("0x8c07cf9f3e42850f3792c7d023caf5194bab4ab1c2183b76be0f2636d2e63026"): true, - common.HexToHash("0xcb3f8826ee1a847eae24bb5e67115e41e169a00d7aa40b5f63d2a2b72d754e8e"): true, - common.HexToHash("0xeb0d0d7b3246199b5c89203118d249e098a5614d5937b5fe95744b993bfe2105"): true, - common.HexToHash("0x3435b3fb3ba6f16832d7098be3c8ff1759a122f6799dbb5e999963323e51cfad"): true, - common.HexToHash("0x35cb61bb9bb490a50650b92c78101f16d8623a0f1eecef86e4bedf292c75caa5"): true, - common.HexToHash("0x5ffdba2c8e19fadc7a37e58b31e86fe49e107d1f6f10e0d2c19d91caab696ffe"): true, - common.HexToHash("0x5acaac7738e9cc2382dcd81cc932b92d7eef9a09b39d1126129aeee69a6d59d9"): true, - common.HexToHash("0x8377d3b49f4a7a4e7c8187feb2512acadae5d289a09690a89c986206b0763777"): true, - common.HexToHash("0x7192a1d3e518e94ffd44569e3714ac7bcc506c49cfb2f3eef9734f39037e7842"): true, - common.HexToHash("0x125ffd89a1b42673e8be04edd4770930ff3857ba2a849817f70efc93c81079b0"): true, - common.HexToHash("0x12c8564fda631843492284a5d5eb2320cecd32340e0ea1ce8e34ab7d8370afc0"): true, - common.HexToHash("0x6fd2bb39e5d69a2e2a09b04e9fcfcfee4d5cd94d662299bca6710ad2d028558f"): true, - common.HexToHash("0x2f3cb6975707f206e94129451b0ff136dbd6db7bb959bfcd4d6bfc3da1582399"): true, - common.HexToHash("0x712f6d6b88fd353ae4da4c5fd7c960de3b231699cc5e8ae7577d1b688a8edca3"): true, - common.HexToHash("0xd4f33c26eb94c4bb9e661e5e6b385e565880487adbd1eabd45699ae8a392b30b"): true, - common.HexToHash("0xafb1f3df43776253d427699bd08cefe2eb097cb6825c5a0cc8fce79df44278c6"): true, - common.HexToHash("0x484f849ab582f477e45a088477cb150a5183b803307933c903c00b85da92b3bb"): true, - common.HexToHash("0x9501c2c0fc764d30faed6dbf79a4c8bb3eaa15c357893f0f02103c26736384c0"): true, - common.HexToHash("0xf2f8613e3d2eef51a56542c96b88abcd7bb43fa9220216938ac1c36c6af61aa9"): true, - common.HexToHash("0x908ed43e4660de2f0e8a13ec52fe248b969a74fb6074ec45e5397b73bbc730ce"): true, - common.HexToHash("0x5b2a68a23f68ecb8125d06e6e196b736baa96e8341b4ca80c304506c79bf9045"): true, - common.HexToHash("0x49a171350a209b3116573ba17cc1905b63b345ad3d48d1c5c2897017ba7909f3"): true, - common.HexToHash("0x7b433847166348e5f8487293c29007c784f762f7db3c75d5a99a2d7fd8ef6948"): true, - common.HexToHash("0xca8dbf0b3d7182fe57b06c318bb06d6bf4c1e281a319fc8581edeee849c955c7"): true, - common.HexToHash("0xed476b90dd6c6b383aeec7bb943a079bbad76d344ced6311346ce2b5409acbd0"): true, - common.HexToHash("0x02c1b5b68f0561d3c4c01dd6abb313d3ee02366263b71805c2a031344720b380"): true, - common.HexToHash("0xaccd41c6f7f2a6cd6da129eef9b0cffc299fe6f6c7913d2ac96ac63e8ef256ea"): true, - common.HexToHash("0xae06aff4ec67d4a60a115172c4002c46bb1b4c956cbefd865678f9d5b651f4d5"): true, - common.HexToHash("0xd17426b6dc51893c80b3a59d2f2b0f0a0de41ea64b8dee49284de286d1c38296"): true, - common.HexToHash("0x8d2d83b23ce7ef31e8a179e0b85bd8c49602d21e335f4dbcca1548f524340a44"): true, - common.HexToHash("0xb1a83e62d03013f910ea48456e4b9e438adade5aa90f2d29b1d821f8be5ea216"): true, - common.HexToHash("0xe8f7868e896a5407c56b0c6ff31eaf93a9bed8d9baaddb1ca9a2882296909495"): true, - common.HexToHash("0xc4d11175b232c3928f7e538272ae05e1aacc41ef358fe06bdbddbae73623f428"): true, - common.HexToHash("0xe872cdd8f04997ae04c6b86cc1a67b992219cb00be37811539fd43b38618a7e2"): true, - common.HexToHash("0xb4671882cd261ae1b83a8185a3869d8014792506f16edc0200679a555c416094"): true, - common.HexToHash("0x965855fcc98de8fa8b59fa5913f5a3d17f1f491d3a1bdd1efe075ef09293d57e"): true, - common.HexToHash("0xa687a571b90d7aa1f3903b9a6675462d148ee55b599612a865fed8292bc8e62a"): true, - common.HexToHash("0x611bd04c7dffd28900f3b797a86e1592c0c6659dd2bd3a79d9ac47917807ce65"): true, - common.HexToHash("0x89c782e05447b540bf5d2ee38c66bb35a7afa6d8aa1493bf83e4df3253ab286d"): true, - common.HexToHash("0x7dc1c0e874dc3a14870e52362d7ef60a0f43cf87aac225f6c99a8b4390be65ae"): true, - common.HexToHash("0x3be0867a9d49d0062ba090c6c0dc4a45b2662fe9e8c47815f93e2deb730a521c"): true, - common.HexToHash("0xa2196cf95a31554f551dc39370b948adb6fcc07d4fe521d996196278ccdb919c"): true, - common.HexToHash("0xe943d42dc6f1ebca9bd718b3964c0bdffd1e12137be82e06d7e516e8282fe3e8"): true, - common.HexToHash("0x5c6347d2057871e8f2d1bae8f17c2f8b01b3c86ccc963cc33500ed87f07511f4"): true, - common.HexToHash("0x23215b8a7c288baa538255203ac06f164c348bf8bb062fc64b04f9de754bf6d2"): true, - common.HexToHash("0xd76670c76ed36dbb4153ec1c18d3c3f9d5f0108a914f66a96e1d9ab8683b3089"): true, - common.HexToHash("0x4d5900f3cde4d2cfec373be18838c7482c589e5af9557a468448813658f7af51"): true, - common.HexToHash("0x77617efa708361f9b3e01152226489bff21c11e44208f8ce6d911ed2b40c90ba"): true, - common.HexToHash("0x53803e1b395683cf92c7c41362a587e7a3eab2f8ce5ef430e4257599a034a13a"): true, - common.HexToHash("0xf14cd0e0a1a6989c9c9e7757c108c1f3af8d2e4aa46a3a2f8ea5b80956dd10f1"): true, - common.HexToHash("0x4d52952a6e74eb1f168ec568dfbfea0b089c7113f790e1fd03032a8ea56d56de"): true, - common.HexToHash("0x43024d72f5244b1f24b7dc05f6fdcd1e541fa19a548f30e225e6f4f4307e0386"): true, - common.HexToHash("0xf5b7f8e13ffd26b97edafb90d293f1802f6a269695c7879898c83070d3de8769"): true, - common.HexToHash("0x26869bd6fe870a2c457f94214c149fdf65529984f7ddbda59aca49151e8d6c6d"): true, - common.HexToHash("0xa2dfd64e23f0ec042f9bf5c9a61ec2ec4dbd6ca2e4e73b4cf6c324cf36cb2971"): true, - common.HexToHash("0xde9bc4471d9233d7f467029d3df145a7d351d151285bbda27dc6bf9c09c9cba1"): true, - common.HexToHash("0x300f2607b9275c2fd3b399b5114f1adf3d8b76fd85001de9b9cd9ccf87fcec59"): true, - common.HexToHash("0x51f3d27ecfccb28bd83bafd07f1248aa1fb3f22c2974279dae5088d95f4d302a"): true, - common.HexToHash("0x0144254b94f19b19bc9d33644a71ff33726602bd30485aebfeb6a506f27ee976"): true, - common.HexToHash("0xdbb4f29519513f38b8d81ecf663510d7fc9011e70fdb865c19657d286420785a"): true, - common.HexToHash("0xef506b34519f2e89dcf3d9d685f912c342f04baa2c17cae9816b14915c8a625d"): true, - common.HexToHash("0x7bfd877f680b8034e1ba9ed80fef819769d13b0c5c2059ee614f0681cbf639c3"): true, - common.HexToHash("0xc092b753b3ebfa32486265841c85c79bb4ed74965e5fc5bc31d1164d8e80b5d4"): true, - common.HexToHash("0x2986398d6d291ff85d66ce03345ebaa91472c003b2b18ea431746a297644b7c6"): true, - common.HexToHash("0xb006e27bf722a2cdbd5d90ca9996929dc2545a45f926788191a2052aabe91652"): true, - common.HexToHash("0xdcb4d626559312eaff0c652e523156149271a4f407ca44dda335f77091bd3552"): true, - common.HexToHash("0x4fb91f39c1f273ff5ddde828787564ab36c153a9917947e567565dd17e2339d4"): true, - common.HexToHash("0xb399f616686e35ce02919dae5420acd8351f699c0d261689e0847105b5483b54"): true, - common.HexToHash("0xe7e7e6ea4762a8782fa8b938499d55117dc58302826d33a3245cb8ab982b1957"): true, - common.HexToHash("0x18b55093e9c84a869620b5eb414f3196bdc9213eb98759ba1c60ede39be319e5"): true, - common.HexToHash("0x8e937a8316d47af79e6a2908e86014282cd95014f1abb9e644c4afcfd28c0644"): true, - common.HexToHash("0x8da16d67d31b2850a636b70f4db6ba93044fd98f4164bcef4952e8d28014787f"): true, - common.HexToHash("0x2a0a107e01d6cbf717197013573a284ad5ff94b4ccccb3d5255ab749402a90ea"): true, - common.HexToHash("0x44030cc0e1952db1ab94c78ceb6ada0186de861807c22045635fcf0d0c5d0edf"): true, - common.HexToHash("0x0b9ea3661f008369e1afad4ebcf3824f6ea0bf8ac8a771f163f915d312afabc2"): true, - common.HexToHash("0x3e1f697e34f00d306449f2206b6f7e364e76761f1683110dec1ae517e619dd95"): true, - common.HexToHash("0xcfb6a3a98e373a2d1d1f038252961119fc900397523a8b1442158c77777328db"): true, - common.HexToHash("0xc0198ec0ce92d7d9342f301a524ab98ba73e9fe0f462c9315223804af6ca6642"): true, - common.HexToHash("0xa252b712cce9bde2cf998c3d6f805ce1c392f448b2e04b9ba05ae0c73210c821"): true, - common.HexToHash("0x52d1ff62e42d8f13d239ce9362459e2afd2d068e52d7ecae41682845e5b34fc7"): true, - common.HexToHash("0x377352dbdb60aff526b2a6915e99add57e80b40b55e8343eefafe56d58b5ebba"): true, - common.HexToHash("0x5418a3eecce75c88031b30fcc2f798bbe8c46cee55903e46ae3dabf6c38666ad"): true, - common.HexToHash("0x8f3576eb423b6be4eb2d014d0e06db71982f6a4cdee60598d33b962f26dcd3cc"): true, - common.HexToHash("0x67f558710720266948125dc6551d0996d05ac3cfc23fc4ae993f5cded9826d00"): true, - common.HexToHash("0xbf3cd7f67ed9ee58a81ad49c3d5ab4c5d1b4a6efe439f16cad7fe0310942fad5"): true, - common.HexToHash("0xfbd18e659efac229cdc79962b10a6ba1937fb4f58d3811b4c4dba043073cd268"): true, - common.HexToHash("0x8ac48336f20bfc2df916c417caadd975bb45c8929f76a17dafeacefa2ecea95d"): true, - common.HexToHash("0xe068a5c3228dedd61af7c24c3acf336f078162e5b86f8fa1f6fdf9a769e2121c"): true, - common.HexToHash("0xfa93939ccd4a7c206e4069f64ab5986a0d3089d12063c9aef47583010f9a862e"): true, - common.HexToHash("0x64b188a0084e143d65554a62f551b5b615f87ce4f4bcfef4dbce62abaef441b4"): true, - common.HexToHash("0xbb334d4ec6d5ab18ae62ec1c64c8836282e8c7102546a37d3307b9373e5a5347"): true, - common.HexToHash("0xee8d206387f8b243da53963b469fc761bfa45372c8faf5e57420b44da4924d66"): true, - common.HexToHash("0xe4103fb8cddb7d86e8ab987996648f5cd486142455971dc4f292c2eb929427c4"): true, - common.HexToHash("0x18ba7179750b8a11d88d23309fa052ec3485c7445914f95f056d6667e8db3664"): true, - common.HexToHash("0xc965fc943f2def44d0e946491ac6661d2a274f0b2f7cc023e40e42a3e6a9bdf5"): true, - common.HexToHash("0xf6d55d653ceb41ba4c16010d47cee49a2a8ed34051c4f8dc265153e784bcb550"): true, - common.HexToHash("0x922bd057b9cfd0d493102304c6e107acc58f3b1f1f75c6ab5477d4f12a081486"): true, - common.HexToHash("0xeab35800c0b7e5b50765dc185096502ec69d8ad4e204017f5c73307a493b10c3"): true, - common.HexToHash("0xfbbca375d45aeb0c06ff9f45c9e83e2ba661ed398041f037cbfc1c7acddcf009"): true, - common.HexToHash("0x7fc626db76f2190c85d506c711ae4b7a07e2ab7926dd1cb8432c5a4886d6eee8"): true, - common.HexToHash("0x1a09d36f32e44cc5b5bb50fd7d0747f5bef012ac3dfa8e7539caaa9d47cd61f2"): true, - common.HexToHash("0xae97b99d689282deaa4e80dd16002c7f40b463521813625a6d93705d1699365f"): true, - common.HexToHash("0xc40b4edb71399dcb7eebed2035e69d60f9ba369150d1db243bf431837254e231"): true, - common.HexToHash("0xd473f277aa9bde66dc7edf788a2e7b8a0404fe0b085493de42e903cf6b8521e1"): true, - common.HexToHash("0x1ac98f13fb0fd1e59241698d64d611ec965ce02d1ac754ed9f73c2c2ec911db7"): true, - common.HexToHash("0xddf0fc792f173262c67be0e28bd5c95c3626828f52f56fdd3c8efcc5c289e993"): true, - common.HexToHash("0x13de01ff6aa03c889d4afe1cd215bf79dd2d8e122976ddfcab547c95b82e08df"): true, - common.HexToHash("0xe1ef8252b2a45bee21adf13a808c0614849d43a1313fda6e6350db14491e38f5"): true, - common.HexToHash("0x292875c3424cda66eb8727378fcb0f78f6816193d04d621fd8c7966b5bbf5256"): true, - common.HexToHash("0x3bdf8377c6e03a77252a9d31d9a8932acf41ac79cd17e88feaecdd17159af349"): true, - common.HexToHash("0x2fef475f077ba0401d638617da64fc6f0c2f8cda25a1cb43199236c49cbaecb3"): true, - common.HexToHash("0xcc6383f05305ddb59b469bbb94bf9de9c67ab9c8679375a8eb6f77c7ee22e815"): true, - common.HexToHash("0xe027b24784584454a652e1656df6fabda2f921d408d69ada7dd19dfd0b388f94"): true, - common.HexToHash("0x172d140946108dd78b67cf1e3b57c3c2e718764242acc93a1d3127748e968e30"): true, - common.HexToHash("0x286b4795daeef797aab6dcf972b7c7b293912c95d594842eaf7caa63fbd10ad5"): true, - common.HexToHash("0x13cfc2f6b0e37e7ce9e706fc1a818f4bb2f41309bdfefa6879854d6e1b436538"): true, - common.HexToHash("0xcdcc696ccfeb86e07dd0274c4e35d021b6d38b497db7554269d89fbf9ccaf4e1"): true, - common.HexToHash("0x126d97bf742933ab17d72a1fd56cdcc5b82e509ee3edbee219af399c743b00c0"): true, - common.HexToHash("0x1029967463514986023eeb214f6b6ddfbceaa0ea34af2d74d4831f51c131c9fc"): true, - common.HexToHash("0x7e67dd87f4576580eac6662d7788b03484b8767518c02066cad4cce8e4cb6efb"): true, - common.HexToHash("0xe17530f25d34095881e24298257542d3cc19174bfcfd461b35555d6fadb854cc"): true, - common.HexToHash("0x034627ea13d5ae6f854ec3e195dcad7936c374a9e8488168ce85cf726638fece"): true, - common.HexToHash("0xdc72db86d5d0bdb79bbf74bd1b79df06ba95b8cfe27e3d68cf9383edd56ce0e8"): true, - common.HexToHash("0xd7576c0b236a48f13aa29b46ec64867b865203315483659b2fd9f60f82c77813"): true, - common.HexToHash("0xbb2b5db37a162d2115351bbee7f443b6e3ace397a6cf90fb195fe5b6444bf732"): true, - common.HexToHash("0xc8405bdb6296520d15ebde9c4444a0bdb04b6ff32ec3b6bccd03ef2ab950b480"): true, - common.HexToHash("0x2108e106044088a7722c16817df6e18c1ed63ae3fe05b96fe4f33f1641e05693"): true, - common.HexToHash("0xd9a53a3811ccdf4b37203a81d536e232a6bf3bf1ce708f6c4e5f044d1dee87a5"): true, - common.HexToHash("0xba09b32bcc0022a3fcca8cbae8f7124c4df8d2ace3ecb14cc043b8712ce82aed"): true, - common.HexToHash("0xf601f7915bd392b072f8eb503b23e67c91073c263db8ee84ce82e35727950a8b"): true, - common.HexToHash("0x80c6dc6f89f5ddb749c18b7733e36917f2eddc607e7ef53ea6607a691dd52e19"): true, - common.HexToHash("0x122bbfa355176fd4eb90dcf4b9beacc6e0fccb7a3df3780a5c8f4bff8aa87c0a"): true, - common.HexToHash("0x2c33803551863b7f4378af3c3802808f764adc2d8b4139a3052514be5b27a4a6"): true, - common.HexToHash("0x9f92130dec85455041c4a39265c41983bb457c60671218696f4179ff70058756"): true, - common.HexToHash("0xe6a08499bd5b7cd5558ee1e5f73842d012dd8d73fe9c17510a8861a9fd6437a1"): true, - common.HexToHash("0x6ecb138e574fbd04b743971b7bb768d2b6c7adf9e6c8ad043a30d9bb0e942313"): true, - common.HexToHash("0x3bd0613cdad486df4ebfcb67bda3669f09bd402e6596713cb6205bafd27854ab"): true, - common.HexToHash("0xa74f9f23b1233603c40d0890152b746755fbd445412cfe193463b9993b4dcef8"): true, - common.HexToHash("0x872088698fd4fe39ec037ef862ba757f63235f514cb337031a8bb10703e10c51"): true, - common.HexToHash("0xd7518e0356b994fc3d804f882bffc37822c334f4cc38e2c1af0a099239b5aab5"): true, - common.HexToHash("0x7bbb049d439292d6317243bcf5f1ecd09e05c2abaa2ef412447c75162179065f"): true, - common.HexToHash("0x8c977dbf7fa9d248fe4881ab3dff88c0d4f0e64798d29634b469b4e08e088418"): true, - common.HexToHash("0x30eb12504e2003580f02a2d81901b7ac09bfc04fae6783d0a287458a9766057d"): true, - common.HexToHash("0x3828668735f5718ae7939714e5c45bf2ad03709195c9b01dbdf37d4ea3332330"): true, - common.HexToHash("0x934cfd04adb3b38725e4f5863a691bc303221cf0ce1f59c2d812195e2b4819e2"): true, - common.HexToHash("0x299d7ed7180c1c4863b4f61bd6b193f36962d8bf36d1282f041c5082682eaec9"): true, - common.HexToHash("0x533856f95964fc04b7b15b204ac724dd53ad5156ba60a09a0a7bfe5f7f4ad835"): true, - common.HexToHash("0x75570ff0c0ecb3549dc135de76cfa56a26ace0a553e5dd2197fd95b4dfd04331"): true, - common.HexToHash("0xc2f135ecb591a3df13edb9da5cff1389dea6b745c14382b2329ef8a78aaaf7bf"): true, - common.HexToHash("0x33344544306285b5b03848fd6e27107ce833b830b4401f8db555501bf6ef50f6"): true, - common.HexToHash("0x7ab4a4ff0bf3d90d9b75c3e5406e2332f333b17e62538423540a7dda4e8774cd"): true, - common.HexToHash("0x028f3fa87b486f1fb8d7c743a03ef43f5677a24f4e0dd4ab42e0db5ad505456f"): true, - common.HexToHash("0xef9c472be09077cc1553c1be23470d41ebd88e3b94c570e9c4904a73f3fa06d9"): true, - common.HexToHash("0xdbca07f400ffcf041cf0047dfd055ed38d138943de27f611e09cea5c6d096f4c"): true, - common.HexToHash("0x6a1c60d47a421da92d3f50e122a30d0bbf8541413ef0588d9588bd6c05c22c7d"): true, - common.HexToHash("0x3e169d472d466b68a66cbef70c9389b40866cea4c25b6e69d111ac4bff537d0e"): true, - common.HexToHash("0x2dd876d480e16dc76d473f768e45fad7b1a1584c08259818478cae07ebe01609"): true, - common.HexToHash("0xe36eec0530636793354dfdbd55799d266e9e3c7f8bbe6c0649e03295a6e64fa6"): true, - common.HexToHash("0xc44101233db98528830387bdf15d064002f58f9cf2fc984c69ac73fda3bdfa2f"): true, - common.HexToHash("0x1c8bc39be8945f363dfdbcf70cd8479d2dccd08ade0bed32d6a6638cd92b4d3d"): true, - common.HexToHash("0xeb6a1e12149e1b5b822bcec703f475fc0e19d0bbcafbd8699e17486f502ef24f"): true, - common.HexToHash("0x22ab3048dbdbdd3f5278bc6c511639dd010ebb07ace60d60c146d6044e639397"): true, - common.HexToHash("0xbda73ba256d8c66e2223a9995c99610e1098096ece94d8698cfa2dfca6bed491"): true, - common.HexToHash("0xa125d12a349847587c9b6381afc5fa970a227006795f77ee0153722221e804d0"): true, - common.HexToHash("0xa330056d9c88e5f19206d90cc8fa403074cd02dd8cac4f62bb306a45fb359b7c"): true, - common.HexToHash("0x38bbe56dd27bca5e5aaf3a38911fdb958f21a72a2644bb817ac54c2897595af1"): true, - common.HexToHash("0x52cd1512023dcbdf14ef56ce0f1189bfdae29eb411fcf2b8d191e5d8b8116da3"): true, - common.HexToHash("0xd28a7456c6515e5da434c8e85ca39b85b27dc2179a6d542f8ed830b06dda61fc"): true, - common.HexToHash("0x8e784b6287f75ff2484580c9c568ddf7d12d76d6965002c5fb1db525ba753589"): true, - common.HexToHash("0xeb257b4344c9a3d607179cd5618447e50010c54a056cc4c9ea6e81459359c36d"): true, - common.HexToHash("0x1020925e95425583552e59b3390623b50985d3fd6676c96d3b9d0c7f1015d27d"): true, - common.HexToHash("0xf2cfbd83718664ce0ccf189aced3a64013a466ccd4fca175d323f840b1733d4b"): true, - common.HexToHash("0xfd048e5652487adf2d971ef17d44e292434ef94fc4a8df43db96b78a7205f18e"): true, - common.HexToHash("0x02cad3b63e2e3097c42a6798d9332c92ed0e2f03a7498d5dd9bf75e81bee5b46"): true, - common.HexToHash("0xf6558ec6b46e92acbfd39f580be16308da17206c432ea8933e06ded86f5a06f7"): true, - common.HexToHash("0x1cae70048830d0895b81fb726a51e2cb26f4bb8cffc010d3e2907a76e1d74939"): true, - common.HexToHash("0xb875a6e243c602525ee49c862d73316a848b3e0c266eb230aae6a556798195f8"): true, - common.HexToHash("0x9e439e3ba9318ddd62db03d9fbbde756268b778c87177fbb623e14649783b83b"): true, - common.HexToHash("0x5781098699097e74535ee14610c6f4f09922a064611fddea8cb43a2da0deab93"): true, - common.HexToHash("0x5d5bbf7440624a9c74975f28d070eba759848e7d2533c5440f656695fa368348"): true, - common.HexToHash("0x40b978e03bb23cd0e79a228d39947b6a623cbdf09308bd30affdf7c4194b43d3"): true, - common.HexToHash("0xad60688428c596396b05d31ffbc449cf1be49efd31384805b0c6cb5d8fa1e233"): true, - common.HexToHash("0x786cff6f605070e6e54757cef896c27d94e71244d7319c642f9f7dd131eebc47"): true, - common.HexToHash("0x0053f85df9d53cfc5f0a59f8763090349c54b420a808ef4b57d034747d355b21"): true, - common.HexToHash("0x768c72ad2bf55337728cdfc49c8b7a352862b62dc7de2f9dc98ee9654e4492da"): true, - common.HexToHash("0xdbc28cb6502902f37f3796dbad16b10fdefd567d9a4fcf8d17e6c3052acf38ea"): true, - common.HexToHash("0x28c6a944507221aac1dd1e87c125ac3e89e16278b3a9aef94d79aa4a6c2f88f7"): true, - common.HexToHash("0xf35c76b816f67c058f2132c9ac11b07ba82e70a24e287b399cd3c498f95c32d3"): true, - common.HexToHash("0x829c1b5f7b180e11dd0848d75be7adc83cd44452a9237f880733f395d71ef73a"): true, - common.HexToHash("0xd44d785251d9e05500ec9d46cae810b39a8e0c012c2fdc64afb8839f5ef07b59"): true, - common.HexToHash("0xbbda71eb244805658e101411838c3bf16f4783c3f2008928628f9ef7963a1926"): true, - common.HexToHash("0x3128b851dd5506472e273cf1d201e2e1d28b0948e7ede841d05d1b1201b9bb5f"): true, - common.HexToHash("0xf3eced4675fbf517493ce52588a8aef4692cafec957659f60fbe8642ab7a052d"): true, - common.HexToHash("0xd92c8075de456c11793a6e1cf51a3288cfe705dd73e0a1dc20994aa506f87a22"): true, - common.HexToHash("0xf940fdaae983fc57c8337415efcf0b77b91e21798e1e6d30344f9af3bb2f6ef3"): true, - common.HexToHash("0x160106afbb5adc6d29dc3017a2f1942aa3c02859b61b1f72a0c63725f3dab05f"): true, - common.HexToHash("0xe784e1a63212a3e8c7e0aab6e5baafe68dd11d0eeb62dbfd1f9e28d5509acbe3"): true, - common.HexToHash("0x7710d361d215a064c94ef59c4c89ebbcf9af087bc714c373436cf38bbdcc03f4"): true, - common.HexToHash("0xd0b23067ad9d8555594988125842187392db5ee8c60776e8ff8a47aeed2aa679"): true, - common.HexToHash("0x8b0c9310d8887916d42d55de23152fadf050fba9ebe963a70d001dbfe6ecda31"): true, - common.HexToHash("0x07f747786c025a76eca5efb9144b5b33de5ee2c0fdeecf957bc6fdabbc02fea1"): true, - common.HexToHash("0x5b55a434eaf1124cbd2fae23e713c15b6c8d44f28ab17ae1e1537677d764246a"): true, - common.HexToHash("0x6558e5ff27309d7e8327ef75af8bac426615f81d69b10f83b72c292b1c4541ec"): true, - common.HexToHash("0x49601d7b36efaa3e7e3e93985b3ce5781491d6b605432ee1acd5aa6a25452c39"): true, - common.HexToHash("0xcfc123cc708dca853258b0c10f61ca40e739a284eb5932cd142b2d60e117dcd7"): true, - common.HexToHash("0xf8fdb7c1c6f461fa7b3a6e7a15a61fc0489b678a81f418b311b9c22ef9e65f71"): true, - common.HexToHash("0x17a9ca8e2d333fae0b8318aa93dcf159a9d358d6987044f7aa757e2a0b742613"): true, - common.HexToHash("0x4fc68cdd3a3d8b1d616d2f2869a7337650e53a45da8042a715a8c77d792879f0"): true, - common.HexToHash("0xf61b096ac1b0a0a43270cf98fce8282a5fc2de10dad34d5830af11b10d93430e"): true, - common.HexToHash("0x684b713fa7b6bfc7ed4522d70ddd0d038c0cbf5aec9a7bc8d4747769c63b941e"): true, - common.HexToHash("0x6e4ffecafbf425c652c87702440428d9f1d00104174e2adf27f7209fe03868a5"): true, - common.HexToHash("0xe53ebc3129fb009222a4062cf21c6cb4c1768036ce303fdb005b4b073fd8b866"): true, - common.HexToHash("0xdffc0d9db0ba205d43a998ed687e7454d710690b7df52c8fa10c0b891e4e631c"): true, - common.HexToHash("0x82aef69cb8e404afb0a8b85b51ec96c470bdd4668bc544b76b47bf69a1df2441"): true, - common.HexToHash("0x714a474edffa752cca4eb26b64e1d210361b1ff33999bc92459e70928055cb35"): true, - common.HexToHash("0xe080883addb541adb50f80466b32ce5034769396ae8e137758e971c9074db53a"): true, - common.HexToHash("0xb012da67c8c0e30cb8172ce7b0846beebe75b4b4671f8cd770387e5059e60d95"): true, - common.HexToHash("0x2215943a94dce03639e9cfa345dfeb80258b95628a9a2d6c805605746fb21284"): true, - common.HexToHash("0x4706bbd33bfedcfcee8770615977c7043a607f1a6708b4b34d7241356a50fa97"): true, - common.HexToHash("0x849b32eae449645aecb62cd61d69e3945fdfd3d73ab813e257ab9bba36853c04"): true, - common.HexToHash("0xef1afedfa9f2af2a2fd88ff439daa2e8bcf3d3b36de01b1919454020b096307c"): true, - common.HexToHash("0x6a6465190e8ff72ccdb8fc46d1dfbcb0acf94ebc4b5db9da832994a68b9a95e9"): true, - common.HexToHash("0x590de006c27a8560705bc196b615a4231a6078e1c254ac48e82c52fa36154f72"): true, - common.HexToHash("0xb755833102c106de904d9a681b92f3b4fe6f834aae1d565ee2c5de3dbfc445d5"): true, - common.HexToHash("0xc54cf57d6578e931e62c2b41db9a0cb065b538e116b74d9b424ffc9f662c9c01"): true, - common.HexToHash("0xd10ed1c47a66bef5da52f5a137375e3d2c235805cacbdf12bb8ba6278b671404"): true, - common.HexToHash("0xd491040b2e68e8da81e2e4b815235f8bbe77e1473a15804a84ecb513add326ef"): true, - common.HexToHash("0x16693db7e63d2f40eee743099937cbb6c612d832912c19ac35e1d50039bd4ffd"): true, - common.HexToHash("0xc907ae4f292ffd98e5cdfd4f503a1e703e4ba3c39dda40f2b6b518513f35da3d"): true, - common.HexToHash("0x9b453b78f017d61c55aa80e51a2d56dde5b17cdaedbaa79b526f85c9db4b4350"): true, - common.HexToHash("0x8c746235edf3c67652353f1e9f4380cfad548f03ce9e796a28c32afcf227edd5"): true, - common.HexToHash("0xf9aee42b836c609d28c724e42931d28e09c24b6054e39195eac705f9377a241a"): true, - common.HexToHash("0xe679d281b912024e4b69320ded67ff69e234850206215518159aed13ef1aafd7"): true, - common.HexToHash("0x876f5fdfca06bc7d7e9471b07b035ce6556c13e5077d4366e1b704fa9366341e"): true, - common.HexToHash("0xac463a714c493b195112722b24673836fe6e99dc0dfc063e0cbb9bf7fedd56b9"): true, - common.HexToHash("0x0ea138137865dc1e45845df9cbe9e634d080fa4640d183113b43f204db4d1f37"): true, - common.HexToHash("0x3bb1ace19790e53f8dc754534684af25b1afd54faa4b0329f5b9d42743b7a6aa"): true, - common.HexToHash("0x327673f2dc0c4765bb3ea2e24aa455ac45e46fa42e32acdc0c0cd1db548201e0"): true, - common.HexToHash("0x97a49c4802fbfdaf128708722169130562a9e4cabc158b9610e6d33ee94e83c4"): true, - common.HexToHash("0x64af0b81703691b0dc27047ebc961f351c258d5f544e7f0f807338d7e1649cc0"): true, - common.HexToHash("0xbb9bdc331513867d5a17634f0a2e51891d7498063b185bf4c0cad91caf2234e7"): true, - common.HexToHash("0xe48d836b3b0bfaa5063bfca2566ad02f9e5e38468e5de5ca30e8f411026b2898"): true, - common.HexToHash("0xe9108eac88bab79bc299cd6bfabef3d0a0d378c0d2f7a147d85a9a7c1671b125"): true, - common.HexToHash("0xf0b5fea55d74a76c0984df6f630d68490f3372688b5334233419e21277612719"): true, - common.HexToHash("0x6076abf602ed6dfa4c89c5e0f98c20cc8ce1a027cf7bc1227ae764e7eb49d75d"): true, - common.HexToHash("0xf5a17efcbb01a5557cb1131d6453498c696b70f2ba46f12ac30017b50cc9529d"): true, - common.HexToHash("0xdf22d04931d259fee6d762485a81ae4713aba3c574f374b9604d9129a7a73e70"): true, - common.HexToHash("0x61631d946892e3ff9a1103be0effd72904c276b232d800cea1aab11c20fe3691"): true, - common.HexToHash("0xf8a5cff64e5dfaa0b66511e70e4050e00e47b7dcef217b0a6909ea571a6b7bf4"): true, - common.HexToHash("0x7a6f45ef12343e4d160bb0d9112b712daac4de1b25b85be2d2bdbf918690da32"): true, - common.HexToHash("0x920eee1990ea228fd94a9cc88c994856132565c66e8c1503a9ee987e5bf12473"): true, - common.HexToHash("0xb86049f4513552bae2433173421b519f512b89fbfd2f24fe9de8832dcca7a939"): true, - common.HexToHash("0xcd9c5d307dc50dfaaaa8a2780fb56df567331d80e4209d63129302efcdce3250"): true, - common.HexToHash("0xde2ab1d3c3864e8acbee59fa07e5df029459b596c06c5ab734707e019d805993"): true, - common.HexToHash("0xe1fc308af2387d7014adb55759ba9ce5b3c4fc2682bb80f3fd4182d00df05ac0"): true, - common.HexToHash("0xa6d8b553b8d431510f3a9d3a6198d25fb7b8747792d51b96dbea248c731a8292"): true, - common.HexToHash("0x83fae404ee81342b380d5da9289fa256fb4897e0b3aa235e87771802c1d88f44"): true, - common.HexToHash("0x9cbba5ac1278c71fe6174be71da455922366b575128ffb562629e3fc7a4e370b"): true, - common.HexToHash("0x225fecd126fd60ce1c83f573849775666378bd6903398d0ab300e2f02d05a436"): true, - common.HexToHash("0x926fe12200e0d7dca0685f6e91e8cbfb24b58226de613d1fc79e73def52effe3"): true, - common.HexToHash("0x37f0ca9c84aff3225ff66c703e669b4ab4038c88d3d15682966a091957fc366d"): true, - common.HexToHash("0xc14d0804e17a45f42e55c786a19d0c07fb84b1735c907c239104ce8ae712905e"): true, - common.HexToHash("0x3d9c09533ea7de9517b98fc7345564b29954f0c35a783489005fbe5274cfb4bc"): true, - common.HexToHash("0x095e26ebea83462c6e673d3d0a9fdf4341d57c1631d34df781d2753b84b1911d"): true, - common.HexToHash("0x8fe3d0f57b3ae2780a9f14000ee4d922997c01b8596456b409e2fbae00a872a4"): true, - common.HexToHash("0x02ce0b6662a04e9d28dea84ab18b5326cd84f5a22ca9f34eb90fb493e9458ada"): true, - common.HexToHash("0x55e2b7dd5d135c3383bac1f5c399cc48f5dcced87193bb0f0d24326936debd66"): true, - common.HexToHash("0x21852e918fd9881ff0fd3a5c09b3ae1aa08de7d9ade9a8939d6024e91b97f780"): true, - common.HexToHash("0x33035b2238d9077caa219959d0ce122218197dd07c54c6fc90490f3bb6143828"): true, - common.HexToHash("0x85b36905c3b2bdf18d52ce67d75a6468f027f569302c1f12b62bc92384a58ece"): true, - common.HexToHash("0x0f6a61c9532730ed044ec33600650c5f7545605e52ecaa029f66d1bd168ca44e"): true, - common.HexToHash("0x5348397cd816d8e5a8a521937c0f567a19c4547662e3bf6b378e534dd5323ad1"): true, - common.HexToHash("0x0ba479d7d95d99dd27d9717a83587f6e4c24e827d591c8e1de431d2d3e07d02e"): true, - common.HexToHash("0x54de461ebabe6716784e00a263bc9a6faadbc4946a11b8e5862eba2c478302c0"): true, - common.HexToHash("0x5c73b0d81e0f274ac60f8a2a8bcecdfdbf14b5f1acfd5d73782913014c4e2053"): true, - common.HexToHash("0x220ee38a62f4bf280ceef30fcacf302126e4f29e65af3ee292b528bce5a74e98"): true, - common.HexToHash("0x4da8c39c6dd820e9228b161a7813cb6c0e89feffe8b8905044a48e6df213d420"): true, - common.HexToHash("0x7104a2dcc3400686bd8d3d452802f3c351fe355d045f9cd7ec159c74ef490852"): true, - common.HexToHash("0x8404ace5da8e9be0dae99b509161ca7fcaae7ca18a544ed8015612023e6d8ef3"): true, - common.HexToHash("0x413b8863964ecbc13639fa25c5122baa792a03b52315d0203035d2a3c4c4cb86"): true, - common.HexToHash("0xb098af50e64c550b6273bcfd2adccc76e892772134ace327ab373c98be5de40b"): true, - common.HexToHash("0xcfe3a5c0bca721aa32085adf2184cab18188237a5762d0ba49dbd7ca8d969d15"): true, - common.HexToHash("0x061ed458d96cbcbc12c4644a2cc9b979889047f5ca28709dde14f977e6dea4f2"): true, - common.HexToHash("0xfa3a441d56892b3c69523f4372628e4ea0849a4971914df1911c0544ba9f423f"): true, - common.HexToHash("0xc015dbd9de24cac3e8aca963f6ce5b7640427a56d23fbd582e6e8c86e0bc11ca"): true, - common.HexToHash("0x89d6e9cff8783f4ead8d6c1a5c76833f36d416cf032fe788c544a36c8c4543e8"): true, - common.HexToHash("0x69c14976090d04ca8bb0dfe605ebd29c4f67a28025eba00a319e530a9d9ec971"): true, - common.HexToHash("0x706505c8ae4597970b601a539fb622021a29fb01ce5aaae32b57da8f1b00e1b8"): true, - common.HexToHash("0x6624209c20837d3149d923a9b93b391e762ffee0dbc15d08b9fac8be4c1ce38a"): true, - common.HexToHash("0x968859397b819cd637da66fc1e9324d0e3beefcda367b2301dd6e1c2177e6c82"): true, - common.HexToHash("0x5b9498d685c4ef372db140ba2a72d6c8a87fce6c3cd427608a5d29d20960e90c"): true, - common.HexToHash("0x3865cb74df32f04b47c45460b3152053e9e3956b51a5df4ea1eccd1e7d17cf79"): true, - common.HexToHash("0x55f3ae17c91f0977e5f8246451d5ff31e5e7f9670244837b46e1c5ad68033ab1"): true, - common.HexToHash("0x19d3f1bc6517d0c6de6a218eaad17f079c6faa72c0736640bdb82755ded10446"): true, - common.HexToHash("0xbbb641c0485853ac1832e0a282ed6dddb798deac1325a484ea303f7cc3e0ae88"): true, - common.HexToHash("0x81dd85157c40bf77692b4706b940f23113790c52d5d55f373593335eb736c578"): true, - common.HexToHash("0x36aa99f22feb3f12c7ce0b50cc3cb2acc8659314eee0615e946cffc7e308cbec"): true, - common.HexToHash("0xfb756941d04adad1b03f4bd476b505257add2ef112dfaaada4b1718e171f392c"): true, - common.HexToHash("0x85fa6135f41e8180a536afb6157990c9415144780a071b60465713bcf350daeb"): true, - common.HexToHash("0xf38ab1c0feb7cd807322b2a56381eae526cb2452d492c8bd49ae1163b928a74f"): true, - common.HexToHash("0x50a3b8ffac5fb5227c517b0f2225c5020c0df8cd8bcb8b5434d68ead72d69bf9"): true, - common.HexToHash("0x0c493f7e29280101396fb5cfdaea5e75407ca0b81078287c13b7ab8f2fb1a512"): true, - common.HexToHash("0xff1656d0d758dc28c2bfe46e42b56f4cf03684900cf1bebc0cc3fa2e2b881d91"): true, - common.HexToHash("0xdd41bc92628b673e47c402811083d5dd286dd7751d870713d5f271b235aa67c0"): true, - common.HexToHash("0x8751e9ea611d0cac2cf0a67c1bc282cd0174493cc72aae1ff7935a7b8d23752a"): true, - common.HexToHash("0x36dee5147615f66b77a5c62066abe8139ad1fe87348a3dc8ce75523db2bef3e6"): true, - common.HexToHash("0x11b8486fd4d31e7662a93acd997f3426bfe240b44ca6f0cf043df18a076ef5e7"): true, - common.HexToHash("0x00bc82aa74fe201a94219766a863e9604c86067e450c93a831f5ced73ff6fbe8"): true, - common.HexToHash("0x973e3618a2db3579ae56662708bed4b03bbdddd9ccd8cb8ca985dc11628ff36c"): true, - common.HexToHash("0xece004df3c1cc89258b909415cf9fea96a29605960a89e4d1f68e376519b81e2"): true, - common.HexToHash("0xc48249770a7b833fa4c6819604bafac5edf6d5aa59ce58524514efe8971d8b5b"): true, - common.HexToHash("0xa4080fc79ac8bfcf24bf21a540bec97d119a4a9f42c1054af95ff5cd20f3fbed"): true, - common.HexToHash("0x3a21d2a077107f470ac0d4010edc7c2614dc944839301e5b7b7b752b024db139"): true, - common.HexToHash("0x76012afbabc681c37075f606397f08796db005414e984b5c9f39cf2de7b81186"): true, - common.HexToHash("0xac525927f3bd6b25cef92636e84681adc67f7bf5fa0d309c446dbe9c47964ee9"): true, - common.HexToHash("0x2b8b27efa56750039adc723d9487f1d467b08860b3774fcbd0e7be53fe7a901e"): true, - common.HexToHash("0xc656f18e6aa177839dd8a9fe76059198ee0723fbbbb8239382f6c0693e620ba6"): true, - common.HexToHash("0x484e95537f0b84a4ab9ebf93c3f03aa4425ba5542b83cfb8687d3dc375d2fbc8"): true, - common.HexToHash("0x583e6ae584d90af03815ce362c7c93339eb525ac2e9764541f45a0b80bc5cf30"): true, - common.HexToHash("0xea8830ad0665518bab243cd0c17b5a0311fdd3a31113812b5abf9bca2394c104"): true, - common.HexToHash("0x62aecc5b34331f817c59715cf41d88e9d4f17c41757da2c53262448bc50c57e6"): true, - common.HexToHash("0xdf9bbf6f7cdb85f6b95f17da43830074036cddbb6402c69752193dd8ca3e7eb2"): true, - common.HexToHash("0x5f62c81093e0be62bfc7ed30accac2f16379d5db978f67346735aa7e1446d256"): true, - common.HexToHash("0xe1226f32016b0be70aa338622680bb7e2357938999cb4fffe8a57e0fa3e87fd8"): true, - common.HexToHash("0xb38970494ae07e577601229adc3520d7dea2a050094607e2932d2b7bb005e119"): true, - common.HexToHash("0x5254c48e10d99bf188340d126abd14899e2a90c96dd803faf0b529d92f47cd66"): true, - common.HexToHash("0x861c7f12a4ad39353e8ee086fb58a70544f4da286adaa8285b42a3f392a7ba28"): true, - common.HexToHash("0x03fa226ef65ef2e3604959cf3e2dc035b26e1e9cfd0a31053ca2601b03f7dbe5"): true, - common.HexToHash("0xbf767e90c46809a02c00db0e5b09d8712a194ce1f78c80a86822666d8f18a99f"): true, - common.HexToHash("0x0400daa2ff8820f2191bdc5de00a34248815e1375d4367934d7ec33fe5f2e53d"): true, - common.HexToHash("0x1effa7c0ccef56f2aef3d0feb1f5e61dc66b548e65c3fc4b20ea77bba7385d48"): true, - common.HexToHash("0x9b6af0ea3cc176ec02dd01a61286f6f31e5186708b63a4c42b02ea9117f007c4"): true, - common.HexToHash("0xe56e69f270920e6cc4bc93d5f00762b64c0ec3e172c5b1485df48426cf5f7ca6"): true, - common.HexToHash("0xa22d0bd506a530a624134b472473ed9f56e0616fc9949d6feb202fd92e487480"): true, - common.HexToHash("0xf351524815093c3fad60862e0f0678428a1d0c76c812e142959ed7466b555659"): true, - common.HexToHash("0x45573f5ce1156dd59a732af37d27635488d659092ba749a5bc5b84540d1ad5c6"): true, - common.HexToHash("0xc73d59e3848c6678c4b46ba172cfd8b2354be2e2829815c979712c5bcf9a2aeb"): true, - common.HexToHash("0xad7fbc483f0540a25d2fff1d064dbc9c62056c4c4d5853a26243376a747c8ff2"): true, - common.HexToHash("0x61c64343e89c0a3e50fd6391295bca7792116d1070dbadbbd93b093ea9f4a00d"): true, - common.HexToHash("0xb03d00b19439850ab8c547d0b550a5a1723d2bddd34d6315d5d0f14123e52888"): true, - common.HexToHash("0x42ef0e41aa24ed58ce276f4070a5802ce0a405f326c9969d5c066a3258341b7d"): true, - common.HexToHash("0x81d18facd34a9b6b05fee4ee69fa4f377618ab44c5fa84d09cb607dce7bf65e3"): true, - common.HexToHash("0xcee8618e6ecb9e39e189379f3bf6f1835121e65534b863c7cf4d2391c8e770ed"): true, - common.HexToHash("0x4f21f04f19db0f90deb537533a0c12b1e47cc928d23e5ecfe801847d1fbb15dd"): true, - common.HexToHash("0xb43fffaa6837faa5dfc87488c49a592345d520ae420575653e39fea740d15f15"): true, - common.HexToHash("0x2e74486b43248b673a0c87eb443c475759be8b70327b41e83a121c722d25d995"): true, - common.HexToHash("0x579c3672396600c5a3a2dc0878d3d6b0587dcfd8abcdc2f7bdf9ff9ba887e545"): true, - common.HexToHash("0xc23fbc331122a09e89ffa7e0a0461a91ad5edd6223fcfdba3fd24e624688a28d"): true, - common.HexToHash("0x28637d527629b0f9a9dd3fab962a9fd2d347e2687579004153512742e47c19dd"): true, - common.HexToHash("0xd456a8e3546c5d1ff2cd715aaacc44c74eaf740ee5086bbce74194ec92fd52fd"): true, - common.HexToHash("0x34b84ab8b4ff32a78807e0e6a9c77f092b25c801aa8eed3798c38e5fc6db66ff"): true, - common.HexToHash("0x84c867f6ea8f138fb0d7e3025a375a397f446b0fb3b91754cbe4ff311d0564bb"): true, - common.HexToHash("0x33f8323ba69a4eca9d6dde083486fdd37cf19180fbda0bee843c54c903510c9b"): true, - common.HexToHash("0x6d59ce565d40fbd7dbd8db3a4332f9bbb266f370b89d6d0b749bb2d47222fc4f"): true, - common.HexToHash("0x44e4ee931a96270d522dd2da09e93ef92132efc65e52ce4883c23c0a1e339c4e"): true, - common.HexToHash("0x64a75c636d624e9e56f15beb7a50ab55648d0f0a3258c1c34bdd4226ef168292"): true, - common.HexToHash("0x8a2d7c3468c8b8363eb4aca764e12ecdb0e8f84bed5ba5ad3d242b929f7caa9b"): true, - common.HexToHash("0xaf17eb247fe260a2aa3a03a9d99167f7ecfecd6a4be73cc0708a7b32e3e31024"): true, - common.HexToHash("0x5e3ed931e77f735d2491ec26ea1053e9c0e0d07dcba5507174da927155ff8af5"): true, - common.HexToHash("0xd482587cd677552b00bd7a366ff427cd82455eae431521ec646e070d4f40b9ae"): true, - common.HexToHash("0xb98d6ab37028d126d28b1db37b6efbc85480d4e2ce932802867a981c0dfab9fc"): true, - common.HexToHash("0x52f327e4cc48f67df38777820a71ee0bfd1d9dc208b15a86b3f83cfafa750eed"): true, - common.HexToHash("0x2fd9c3eb7c7f661c4b2c606d3bf19c521355512a9fd0196d466f19b72bd97731"): true, - common.HexToHash("0x6f0cc5fc0ce7b519f30770f26e2ddc74c22a06fe7b47e6ebe6bd991cde25096d"): true, - common.HexToHash("0x91f8f3c39ecdd2e5382d0d3248b91b42919a0e81a9e75aaeb5c68a42417fbe0d"): true, - common.HexToHash("0x5435bba9d1d359d1a0d9564c8b7b06582f16f5b0c0e0b5fe2d1be7b43a1180bb"): true, - common.HexToHash("0xa94658325f1e107fb9c743b159ff14542cb39582a8ac0eff0d5f2dde5e607cee"): true, - common.HexToHash("0xfabd51475efdaaaae5b49ee0fe0c16e20a8795d456206b270e0dd2fed4a33023"): true, - common.HexToHash("0xb11d4f73812f6439cdaf0945f979b04fce6969225e299e98aba63fbfe03f0f5c"): true, - common.HexToHash("0x99e3937e65d6ad5e24020fbee502629c44c3e71b8f29736495426d6fdbf22bbe"): true, - common.HexToHash("0x7cab00e0417b2d1d96512f9aec0fb3ec7babf6e0d7354213d8e9be582d7f1358"): true, - common.HexToHash("0x29e60e6239f4b39d0b6dfd386309582c4faa5b48bf2aa240954938fea1409c4b"): true, - common.HexToHash("0x58fb695c3ae06fdf161290b447b7724b754c0fca1258673086279327a8675f67"): true, - common.HexToHash("0x91bbccb7a8337ed6c0c27515b8e4c38318d25b3e2bef55afebbd37fe50c0e45b"): true, - common.HexToHash("0x4c347788306f85cff4c6d6530c9c632e1047a967c1855fe0d0812b4978ab9f96"): true, - common.HexToHash("0x5f785193fe03e9b6b8ffd470335ea6854a2c1325a517a52ce57bbdc3490a0ed1"): true, - common.HexToHash("0x3387ba8e98d2c28752f439f1d90b71b2302e268b9964982704b2a7826d74981d"): true, - common.HexToHash("0x253d4815b58943cd438553f708829a49b454decc787b73590a634a1aff2b4950"): true, - common.HexToHash("0x3c3d05cf119c4252f280e57815de2f649113927416cee0a350a91e33c92bb577"): true, - common.HexToHash("0x7969b36cfc185ef305206dee7f450a50220d9f5b3194f4ea493b9b266848664c"): true, - common.HexToHash("0xdeffa2d21ff96477ccc0f3957227730f86df81f9fa838023151bab40d040faab"): true, - common.HexToHash("0x997918520dfbf126e69cfffd26b89c84217c607f393392d258c014060c52f46a"): true, - common.HexToHash("0x3f54c687eb9517d4e7e831de2aa9d8d6b808b7b64f69498eb5205da717645452"): true, - common.HexToHash("0x5db55793e7a5fd334fc364b3aadf4aff28520e03aa41c1f84c498a2a4ba19390"): true, - common.HexToHash("0xfb2f455a73b5a65aa8bce881730dd79e43e9ac95cfc586a58a2dfa33f1bbce0c"): true, - common.HexToHash("0xec364991112d47227e2a1d47bbc4d3ac36ee397517e6e7e7ab4b289636047283"): true, - common.HexToHash("0x06aad3ddd9b93e456f7b066522580aed44f22d351d415c08a0514631ad34ef74"): true, - common.HexToHash("0x37b4b33060b1dbf703defc079ca1fc22795f9c865019be0a40b3e978409d0902"): true, - common.HexToHash("0x718db9b97a30c5cda22fe4a2767808a373a861f748c0bae93b18da45112f5e8e"): true, - common.HexToHash("0x8626f838bbb31932106b801972a4b71f14487f9b28cf653e16f1e66fe2464051"): true, - common.HexToHash("0x2114a824278b545fc703797b4cada217427082e34e10c21b551803aa17288306"): true, - common.HexToHash("0xb885205ab9176081272dc57fb25ad132f1c39c3c67fe34572ba38f24a4eed077"): true, - common.HexToHash("0xfc05937a2d2f137ac8323a7a85c3f8f176e1543d49b96c5d2d0917a784ecb084"): true, - common.HexToHash("0x7117cd4e2fd3eb954cc037dc7b49605dfcf16f4dbba483d76b854964eab16d94"): true, - common.HexToHash("0x472e30274f2964943ea4eaf82d0ac59c8c0abff31de7c171a74d6f1bdeaef79a"): true, - common.HexToHash("0xdc5c7067c5ab194a4d64d9acae190f22701f6582787bb7c39158b53815711828"): true, - common.HexToHash("0x641eef73c279d23e5946c30e62b2531c1fa9f2dcd06397f4d2e5e4b24cfb59ef"): true, - common.HexToHash("0x6e7f7f290201bdb2de052e51462b462e88eab95ce5b155b5a4958d1bf4837bab"): true, - common.HexToHash("0x0d8bf04eec2ef95a65d5e06b653571d1ee6e1875fc1a1e02d98560e4ec576363"): true, - common.HexToHash("0x56ba02c77504b7b5fc68b089b0fb0140b67c452679b7ab45b1860dc84b44ec99"): true, - common.HexToHash("0x4fdd33252d847c5bd98824c49d47d31cf756d3c9df3b55b28a20c335a624e63b"): true, - common.HexToHash("0x85ee0d444573259a4973f434fb8ef446f3508e8e1e207581b3c044d563ad97f2"): true, - common.HexToHash("0x3dd7224900ec1c83ebf6926e7690a50cabf1472fd5a722ddfba6a47b4a5b386d"): true, - common.HexToHash("0x3f339bf5b30e78166bdd67280d474d5fe44f85f63d4efdbbaae02d53e914f6aa"): true, - common.HexToHash("0xb10160890f18052535e74b2e4733aba35cbdb3119c7053c0307dc70175bb2ef0"): true, - common.HexToHash("0xa3802117bccbd0b2077d65d1d500063fe8a28303da05ee93da996e36cc762b0b"): true, - common.HexToHash("0xcf2592e21627f1625409e23fcbb9697411e4f5f7696b8982e18d4baec09cbc74"): true, - common.HexToHash("0x996ff04213e96f65173c918cd463c5e405503e15482f79519ee0ee31cf40f53b"): true, - common.HexToHash("0x78df2a781181cdf77d68fea9b3788b0202bfe8fa066c7fe5c5a714d5444708dc"): true, - common.HexToHash("0x5b393f00f94476bda4e261c4b984ffb8fa04df99c70c8c75f39391f40c01ffc9"): true, - common.HexToHash("0x484278c6b020cacf8dfdec4796b5cfbfe41a20e8a5c9493c77f6c20b4ebe891d"): true, - common.HexToHash("0xd700bc7a549467ccb38bf7254fff688dd30a30f693b1ab1e2b772d858efc9da7"): true, - common.HexToHash("0x75936fb8224977d399ab7e99e589cc42c518e599428371be1b264cb5d3de11ad"): true, - common.HexToHash("0xcb6e0955e92b730fa21dc75281cf4a400c97508da7af08b491705d8747195e83"): true, - common.HexToHash("0xd54cb1b5cc52bfbce92c03cc7c5c2c53055808898c2f48ab2dbd3100def32883"): true, - common.HexToHash("0x31dfa72356f53ea7cbc8df1bd122e1dfdc8e091bd0ad101841af7623bb7541af"): true, - common.HexToHash("0xdddffb1758c88709f564bcc7c0d95ffe5b0a646e2beca6b6fd6f33887113cb8b"): true, - common.HexToHash("0xecaf3a9a4c2a0c19a6b2fcb8c339168c64959c8c60fb9160b0c9c90da6e7a54f"): true, - common.HexToHash("0x85f4044b5ba4ef8326e7be2ad559b91f5490f05855265954fbf28cc1403200e1"): true, - common.HexToHash("0x812fdadd7df1817477b886c355efa7080e5071aec943e1d0c2f96380d61a9514"): true, - common.HexToHash("0x583de89859e177bba09bf6549ff1894ee6e0d883134fee4da02d33247c10799b"): true, - common.HexToHash("0x2d7e377e5ad05a39046d2cdef3e639eb9b3f03cc9f2614e5dfcf0a79614f37a4"): true, - common.HexToHash("0x7c8935cea73fb305bd94d333e725dd6b7448ffb214b8a10982ca0049f2f3692c"): true, - common.HexToHash("0x4ef4699068755efb6e89d66e5f0db3370c22dacb505612d46e6e89e5a7711f6b"): true, - common.HexToHash("0x4d46ef23760ed76e195a25882a17369432a013b058bb8186585ad2c5cbcf0158"): true, - common.HexToHash("0xa13c895cb1cfca9df4a95532e9bbb305b47e938b43a8a17f474c7334071958c0"): true, - common.HexToHash("0x387988ae7206523689c2698bd071bbbb1dc2ac36e13c63543767e10f647a0524"): true, - common.HexToHash("0xa0f9abc9f5d8f44d0a75ece4e191e9cd931667adbb1b4fd4a47670b31c3ea186"): true, - common.HexToHash("0x798726c2e362dbc44f5b0a00322f87832b4a071a3607de6405c184036affbb8f"): true, - common.HexToHash("0xaeca6d5eec11e616a952b6bf18807d5109950488dfe9d1f8b1a81935d1a830ef"): true, - common.HexToHash("0x9b800a770a1eae5d3d729152555ad135eb621fc65c8a87568d848e0eba315d4c"): true, - common.HexToHash("0xd849901cac304a55cdadbd318f21a4e2789a54da7e18ffd495f74b1bb8f1cedd"): true, - common.HexToHash("0xbc759f89ca9a4e1058f608aa3a280011539feb438e371152b3887264a42f72a7"): true, - common.HexToHash("0x8c687a5b9de903d8b8daa4790c3baa431d92a3a832b7786c191d9a839a24d1a1"): true, - common.HexToHash("0x8d6d58666f5b303c10b8a8db30b192340d27025d90018aec9a8eae675a0ca47d"): true, - common.HexToHash("0xe302470d4045256489d498fa9e46247d52bcfee6823d99ad8dbd7b0b697fd334"): true, - common.HexToHash("0xf2c4b9c6f42e21aaeb88172904d0bc99329bc1487bb3ba1e99578bd101e6ac5f"): true, - common.HexToHash("0x7e58b8a09d3c799e54ba9d5cfc9cbc3bb05b40c6f843d5d0c41fd49ffee0305e"): true, - common.HexToHash("0x855f38969eddc363d6bc5df543df7c2935640bb9204ef70004e06f8975c768bd"): true, - common.HexToHash("0xb0d30a2db77c1c7220f094f80e7a81b1e706c4de58a7d08464c0ad106c3729a9"): true, - common.HexToHash("0x9c20e24e07b4b36aaf1045e6f714908be686beac93410c4536d16d64ee5c8f39"): true, - common.HexToHash("0xe1bfb7a902ab990c612f5ca8a1ed679361193627620ca5a47f701c0763a32963"): true, - common.HexToHash("0xfad6da7c94a27c3121e16baf26b031aa4b826648c014ab8b0fd573f6163d258b"): true, - common.HexToHash("0xda48ca192faca0a2beaea14d389fdbbfd555f02d4fd7156284212ad578e723c8"): true, - common.HexToHash("0xb25667393cc7e32b42f6d79fa0d8ebf0ba75a5d34911cc75f3af7ba34079ed08"): true, - common.HexToHash("0x875b3fe393a16b642b5d81e664f7402cd46a1faf0ab22330d18dc244ee6751b3"): true, - common.HexToHash("0xa526c94cbcf4617e3e0ed678aa98342763ec63b69e6ad83eef2ef43137a4e6da"): true, - common.HexToHash("0x52d2b3ea1411623c16aa4fc082b4c61aecbd918d49a08f71abdfa1f20bb58251"): true, - common.HexToHash("0x265ce7118a2b27d96f5121ab12ace2cba3e71d050e244a339ea90c323e2ff23c"): true, - common.HexToHash("0xc5b98117ac5eee875263913409e74f3cb69b13aa1313c3e0bb425edfd7cc5401"): true, - common.HexToHash("0x04bd5d1c033a1f8b0bbcd0f226154de16cead3ba1c66eba13f78314fc8537e20"): true, - common.HexToHash("0x3c5b8b440e24a10daf09c706458d1be8dca7d519388630b54529c27264f092be"): true, - common.HexToHash("0x9a5565c3b19d398fe3ad1f6b9b394a5bfa8e0fb85678812debf9b5b2353f2bde"): true, - common.HexToHash("0x359c018d9f3ed1e7b539cdea48a278fcc5b3a45d5b8f747f992fae13f5e7a0c8"): true, - common.HexToHash("0xde136f4b9b87588ec07f779e6ca1f0ef6f2ac9e6c1951cc9e1529ff8bc7707b7"): true, - common.HexToHash("0xadd6b33daa2acffb92656a680733f9c17111afcaf3dee596f9a554a2dabc087c"): true, - common.HexToHash("0xb2b2b929deb837286328113f74e6402d122b634a4c6ec4cb266d62b8011c6f4c"): true, - common.HexToHash("0x932b555fc6a125318b5706706cf3d14a29996ed7e67dd1fa52d64a5de3d3098a"): true, - common.HexToHash("0x4314c1c32d1ff52faeb4a95ab1366e710212197a69ee1a22606fd51cea040b0e"): true, - common.HexToHash("0x12c21adedce209c13b5a5bc3075ed774bfba341538dee2d6b045b0db11d9d3c6"): true, - common.HexToHash("0x2efab1e44c0fb64db029376f6252c3a9bb11e2bfa9c7c534767f3ad740b69bc4"): true, - common.HexToHash("0x137ca702d10effd8ffbaa43f864b5c27eeb362a88b3a77333c323db8e04eb74b"): true, - common.HexToHash("0xaae6604d43405d7663cd182540e35a925308195dbf480408169a954bcde91d72"): true, - common.HexToHash("0xc2d9dbf1f52a8da25357bed8ba89a95832916b8187fea3c8d5241d632226f9b6"): true, - common.HexToHash("0x418af742372d2916d447b6e3433281e269700a6bc6a4a1448ffa1e61e51c45d3"): true, - common.HexToHash("0x9ac66ab8f6b1fea74710a992101423bc84ef3e5d18fdd661a5cec57a131803de"): true, - common.HexToHash("0xb442db66977d3b0564174a54d893d406f90da0bfa283c64d970fb7df0731ed76"): true, - common.HexToHash("0x53b9155b32968438062ed4e40f22c06d33067f8b8a3516f811de2b9a6ac12616"): true, - common.HexToHash("0x67d85994762b712b2d06543ab7531ea39c47f318245eb297e85f5c11420c0a58"): true, - common.HexToHash("0xb0e83651e11cd13ea4df8a77aa795eb05027ce3a31448f3b685b9ae617273d47"): true, - common.HexToHash("0xf699d0b72db0f5a522b0408fa5f9dcedea62b7630d911bc31530219f37f71e4b"): true, - common.HexToHash("0x4e62e2ee3324d45cedba71fb576d51b9b82068dc1a8da2c53ef0250b5715430b"): true, - common.HexToHash("0xf787ba279d80be3756985ade19d7d4c748ab1ecba80ba5ecd6edf4ca27a03cf8"): true, - common.HexToHash("0x86b1ac482630c0ca4ed57976159de4cbec85933e707815c242af3efa122e13dc"): true, - common.HexToHash("0x780366002ec83c29c64841c753986ef67cd234e8359ad1c5113dd82aaa517aa7"): true, - common.HexToHash("0x550ea23779ae60a19f390548b67ba126b882402ea88835b53140af4c29d502b0"): true, - common.HexToHash("0x3dce8491854a074d2715f7f8faba6f5e39d3af6ba273e4bd2d049280bb0056fe"): true, - common.HexToHash("0x6558445725bd0ce92ae73a1069f836a65170291e66cdb14167bfef67fab5a167"): true, - common.HexToHash("0xf17ee2106f527eae01d3588498837f6b1ee8a65bfa267fec157efc52c4ad9e7b"): true, - common.HexToHash("0x0e08cabc9c61ff8f3be128f306c08c68b13fe72e47dd19d8063709dbff663e82"): true, - common.HexToHash("0x8154e996474e93910f09f0a0aa59ec5ef08c5eb7befab447d07d5ce8b54ccc92"): true, - common.HexToHash("0x01bdcdf5d5e087e9143b1d6b3729b81017ccb84a52e1011a6dcfc592bf72fa15"): true, - common.HexToHash("0x17d2a04b2da79177883527dd25c4a4d701af8320dd9cf54597a268e5048bdd3c"): true, - common.HexToHash("0x805888adb44790a8dcdcdd89b054269285def112e60cc9037b4684c6b3a00c47"): true, - common.HexToHash("0x4371a4b1300d7c68b5085239e9451bd10cc5500bd7aaeb94a007ca5c4952bcc7"): true, - common.HexToHash("0x92fa1211e003a7e7ad98408c49f1348ab6e12d308665ee3b28d2494d21ab584d"): true, - common.HexToHash("0xaf9b41e92fd5ba32f5d6031a080379cfc35e5f016ed98015e211efb1984c3058"): true, - common.HexToHash("0xbcccb632f392adae43095e30ed2c17fd99ccb53198c122e9471029f35f305f9d"): true, - common.HexToHash("0xd27822f4c866ac5b3bba2d30d1cf73149d9de4922670f4417cc46a2a02c08c6e"): true, - common.HexToHash("0xabb0ba038b57cb91411bc40cd9e1498b4bd6f36bcfe94fa35d6d52b63a561317"): true, - common.HexToHash("0xb80070505574b0b77d87332a0a8ab3c637928493023a2ad3b4b1c39d4d04e599"): true, - common.HexToHash("0x7a804a45f83cbd4a0093695b58083669aab2bee150d3b1c664609f989175cfe7"): true, - common.HexToHash("0xe15346e6fa2c1d40aaec0ed758f5b12313e707c59158fd96fd282d87aaff5b1a"): true, - common.HexToHash("0x8c49f52e99ac9d8a7f0a349a5acec4ccfdb7b88f3ab794d9f535b4364d912220"): true, - common.HexToHash("0x993c1030e5be7de5d22162e587700c61cd29b2dd75116347f422a4d99a41b091"): true, - common.HexToHash("0xcb08804badbd8df592d3e40031da4078ba667ca912d4e1c92c4c8a6682e32385"): true, - common.HexToHash("0xec424301fbc70eb10a49f3b618a988f73f3a9999da008ff03fb769e4ccc749a4"): true, - common.HexToHash("0x1312a431afbaabb8bd7fc5fbb8bef90646291e5c5788fe3ebe79ca4fcfd25dc7"): true, - common.HexToHash("0xf43f9d53d6c5de209fe08af62ebdc64e8c0700e9c8859710a66ec6b741b1df4f"): true, - common.HexToHash("0xc2c2f2a40e53c6ec53a0892b10d4ed48d2650cf6f998aa4305369e8ba7a1a2b6"): true, - common.HexToHash("0x4628e2f32050240ef86fae0093f09bd83dc112e947229efa159fc0be23c5f06a"): true, - common.HexToHash("0x225e3d44e6ea78d600c36261fa1ec2ab845d4a221783172a5f6f7531af2fb501"): true, - common.HexToHash("0x981a1cd7bf86c72dd4f0dec044e242104711faeae41c182be70ae9d9e27ef865"): true, - common.HexToHash("0x75ca5b37a1a1016bc73915fbe04675aa777a8b1a477190d0764822cb168bd622"): true, - common.HexToHash("0x3d602766875c0f000f951003f7a6d4884bd87056741aeb1b0b68d7cc217012d0"): true, - common.HexToHash("0x609e1b9d9a7b7ef8cf0e6c760e423d1eb48591591b1c72e8c7e1664e325b1927"): true, - common.HexToHash("0xe0b76e56630c5863ca66c11f910627a8779ff89294396645f95c0eecaaba79d0"): true, - common.HexToHash("0x3b077cd652dd887638e9b8ad1c9466a1f99fde63b88f986297b16ee235633665"): true, - common.HexToHash("0x788e87e56e7453b5709ad885f4eaa50578f3c5efb14ca2d26e090919a4007cb2"): true, - common.HexToHash("0xb73f0d7a23ba1ef137913a72d097c6d0f9801660fa41595b718bb2ebb46010d0"): true, - common.HexToHash("0x7133463cd3f384a8238413361ca66e4c2bc8bea43cdf55462a41240497f0b4ba"): true, - common.HexToHash("0x33703c48c3fe565b759914c408dba695219827c37367c9cec456280240bceb68"): true, - common.HexToHash("0x8f644440bb09bfb0c922c8088463cb3cc2bf2c2386336e440e91a10b22a3bf96"): true, - common.HexToHash("0xa711b4b800d2b602abbae53e3c546f3abbf8b643b9c925ee49a55781e9c6665a"): true, - common.HexToHash("0xde12f552fa393a4808929c238f8343b03bbbbc170df9fe65898b55a71cf40542"): true, - common.HexToHash("0xcc997b0f5d7d80c8fdd66d061b56640b43d8837380b69e3a9c7984993c96aaea"): true, - common.HexToHash("0x5dc997d0767d26710489c5b0b9fe7ba89277fa80a5159dd304d0cbd22da23534"): true, - common.HexToHash("0xa9b110368a6052c04b8b429eb2583ffd4f1225db02268bd721a988a771cbf828"): true, - common.HexToHash("0x9400f0960b7dbbc0ef0cc2a9db4e8b1f2344d38b116ded1d59da11021d365cf5"): true, - common.HexToHash("0x1de212913d6a04a07264575ec4a549064b4655048dcc128da74e5f3a2831ed87"): true, - common.HexToHash("0xfd2eedc401efaa73614b8ef7919dcbaa9c5c5528cf865f00216bd551c7c37399"): true, - common.HexToHash("0xa7d47effb340f88da8e4aad8d3fdbaaa94395fbf2924a948627af790d44ca68b"): true, - common.HexToHash("0xaf9fa8870bbdd1d7256895c77fa48b7cc0cda9f9acce2bd8c885feabc26d845d"): true, - common.HexToHash("0xafb790ce67678de09e862a397c44968462ec71eaecdaa60507b85b72a8185366"): true, - common.HexToHash("0xde810c0ae8640a33662a61a065dfc5d09324ac303e82188f18f832af409bb1a0"): true, - common.HexToHash("0x6cac32d5bd46bea1947da0e083b34df2e399dc8020570fd753562b93973c4f53"): true, - common.HexToHash("0x336fd29101a80b0ab1c1acaec7915280f2077a6d01f5ee733047cc26378f1d9e"): true, - common.HexToHash("0xa2a957586e17c4270359d052016eaaa16cb502d5b8be5313ba3e9897406a9fff"): true, - common.HexToHash("0x50ef3c613040e75c8308ee71babcfb3357a701a33c7fc12e69077fd0988769d6"): true, - common.HexToHash("0xd827fd0964908d9f22b502a25f56c72e232cc1afa4dc24ef8763cc0e743d9a16"): true, - common.HexToHash("0xe95f2cc79f03165faa4f689e5fac8a90a1529646459d4df0f4876b40c8621240"): true, - common.HexToHash("0xb16f500a65cfc1f59f58028319ed7b8c3cb6111cf7637e4429bdbcc9b2e470fd"): true, - common.HexToHash("0x0d4fc1bfa7ee5ddb45337a947f3a2300a96e4e2cbfe6f6f7dec1eadce929c1da"): true, - common.HexToHash("0xa27e2b1d2a88f5b7354a1b8ff1a55a7099449a3b97cd3c955f5bd640feb2b9c7"): true, - common.HexToHash("0xb008cd27b4c447318084a658cd7e08ba60d2388d8c3c36f2d1f3f36a9fde5621"): true, - common.HexToHash("0xaa10e17298d63ba4d35b3c6a9e3fed7c1a71b5e30049cc640b78d756144da1bf"): true, - common.HexToHash("0x93b1d2967ce69d8bdcd038df2a5837b3fe3e198a3f2e8d0138f3cd425c135ee1"): true, - common.HexToHash("0xc40ff663f9814581a4dc6fa87ced19f649db3eb9920669964814422c8d955ea7"): true, - common.HexToHash("0x88c993532b8ed99b462d1d8d89717ed0b7f8836d0e9f7615c3ec2f88644b336a"): true, - common.HexToHash("0x17207e874c61c4708fdbdc6063aca3d6e68534dfdf6ca0265c41cd2e1d21ad6a"): true, - common.HexToHash("0x51273de9b8f190452010e71003348241a9d136defe8db4b082a7af5f281b9f64"): true, - common.HexToHash("0x39a3279819ecf6b0baa858bca82379dfa8c797321f6bb2fc026291fd18de3acb"): true, - common.HexToHash("0x564cd54e54a5ea8c9bc63024f1da2f60bc4c5603ed9da6d69251c1b358f5a7e2"): true, - common.HexToHash("0xa64e4870c539859674b5e628ce31edc0c9f28d250eb0eba5b5dc8c1587bd292d"): true, - common.HexToHash("0x7a6e8c5f34cd54745dd759910a590808604f410cd5f07b209a22abd0c6850a6e"): true, - common.HexToHash("0x494e45de5f2fd519813aa76f690e234e1eab27e4657278930af8ba2f37761679"): true, - common.HexToHash("0xa508292da14311d1756be7d27fda6f880edca40f30baa805ec1599711baab9a0"): true, - common.HexToHash("0x8a2eeb423480120d7fd36e7963f7cc2a2d1da1b5262c1227c776cc47c318b553"): true, - common.HexToHash("0x35950f2f6f9c5320f46bbc428b85a2c12b0712038ebdfc7318acd6dead4b7dae"): true, - common.HexToHash("0xb574272734a269c39cfbcecd293fbbb80a33e1974230204333c351c34728c6cc"): true, - common.HexToHash("0xf5dd250306bd9b47cb513a15187e5dd21760fe35b46b041e6427e14f83b81719"): true, - common.HexToHash("0x67d33d1e992a35d0f536d74070b26cfeb0b633a38e86c42bb2b16aaf27023754"): true, - common.HexToHash("0x89d4761e918d71df80105d364e1e8ee48729dd863a5851175be8f0de2bb7b8a0"): true, - common.HexToHash("0x956028f3b193952421b0fb32a1e0b1658a0080b990ab6856668d3b4978c83dbc"): true, - common.HexToHash("0x1fe6b1958915082849ae1363045c7c6806ccda2ab7dd8861a1ea4e9f89a48cbe"): true, - common.HexToHash("0x3df71b7de73a11ba9437173fe67e2625039a77be86f2d4d880f9ec3055b9313a"): true, - common.HexToHash("0xdbceb909fa21bc802a7870e0b1ece3c67ab7bae4ba760f4d6438531f6b51aea5"): true, - common.HexToHash("0xc43568e5ba1b12d33fdedc133894e8fbb655d215866d821fd0825e9a3cfb18a1"): true, - common.HexToHash("0x9f522e4f1d80506f549e9a9510f986a18621d7df7ce35fad5da9b7652630fd6b"): true, - common.HexToHash("0x90d9ca7916e0a96ca59afd31f5abf79802daa943bb5836cb64b16fafc001c946"): true, - common.HexToHash("0xac54a1e6ea578f673594d589c3772fe2e787314aa2a38dafc95bc9ac722aded3"): true, - common.HexToHash("0x730f60f864eb5fc7d95224a42b6043a8f3aad83d8afe28260e4be85cd0f9697a"): true, - common.HexToHash("0xf73ca6122b49fe52c64e8477648874fcf9ad209da95d6e8d02cafe1e832ff6c5"): true, - common.HexToHash("0xb940f9b7c62de81195f82fe6de8bd4c8a3f5a5ec3c482a26f00d4f3a27727656"): true, - common.HexToHash("0x4bed1fb76b369da8ba9c8fd0cee800b456f6663f08f2c6d458332a2ee9888da7"): true, - common.HexToHash("0xa52fa7413f3ca1aa7212032d8b9cb84ae2543e8a17c11899ae5c4c709cf4c570"): true, - common.HexToHash("0xc8ec096615fd073e9bdd0a57899e30daa2e8b3f99e0c23626da3cdb21788eeba"): true, - common.HexToHash("0xc278c39a2ab6b9d76627dcffa46c7b46b26eebded322c0f119de0e959de21156"): true, - common.HexToHash("0xcecd205167a6805925b2f5fad84d282a8ad981162d0fb8e21621b1f9ccf3dbd9"): true, - common.HexToHash("0x176aa6799a6640b3e9280570342fb5263019e8b5f88386e1051630dfaedfeb4f"): true, - common.HexToHash("0x3ab844cb0d91ba427c758576140a858ab921325bdb81144f40692fb0f92254f3"): true, - common.HexToHash("0x9af57d120b37df882a1208570d0dfcdb8d3b60056492251fad3dfbe94674c747"): true, - common.HexToHash("0x4fb7490fd36af7baf0a9250257ebe18a5702e7fff2f1c3bd6d6b2e54e381cafc"): true, - common.HexToHash("0x3c91b7dfcd085795ebe6fcd9ecce7e0ff2ae30a765cea58add21d6e350bdd9ec"): true, - common.HexToHash("0x6eab8f2803966b795636e76ec9a624201e96ca95b51a601dfd574e75e984de89"): true, - common.HexToHash("0x3b2b420978ed8134aac1baabd6c0122efaa87c33dc504e7ceba5c5d252c238ba"): true, - common.HexToHash("0xef66a97c0a640a2a75af35ba5797d5cc313f8b6f0b4d029fe41ec215c3b02bad"): true, - common.HexToHash("0xdfe318a3cc94737eeb60f1f5cda3bc7d69552f255d7570cb6fedd5643bf1b390"): true, - common.HexToHash("0x8cb2faa3071068c280b7e14371fdd733843d6067270424e031d187bb5e380c6b"): true, - common.HexToHash("0x74ea7082e28b195b0ee3f7b7fc2ee07b77accd179df3300245ab4d89aa953f71"): true, - common.HexToHash("0x34e8f3deff0bc344a9491b45856f2a0bdabadc9ea53c3ee2115691c12419ba5c"): true, - common.HexToHash("0xf7a4bdec0186a7564fa95b9d934bbee542b7f993cfef8d690dc05566ea078b28"): true, - common.HexToHash("0x69b8b04a7523926b4e31532f68f1c738e4133577a80d48e4bd1f05ea810ec07e"): true, - common.HexToHash("0x996335c76551274ed7335b428642e596a0c1a59a9ee189035d2f7d5664456e8a"): true, - common.HexToHash("0x729cde297672d3fc4145bef05c8c7707ca322e98d5158e87f4240af1dc815493"): true, - common.HexToHash("0xbde41f6ab11a9fd10ca0a87ba494a203675899c178f679b575a42dbf1ec726cd"): true, - common.HexToHash("0x9e6ae8cdd1628efc7b17ead5cd4901d54ffc946d651da6cbee84eaa6a872c08a"): true, - common.HexToHash("0xb868b54ed8d38840c49eee055d3659f7ce534108883b903255a49c3834738150"): true, - common.HexToHash("0xa1ce05cd3dbe972c321e3a1de1533b75134ecd40ffd69201320fbf31c2712c94"): true, - common.HexToHash("0xc35b2a206cf5d13c85fb1ea35e0627543981a89a6aa432b0043fe25ca9d566b0"): true, - common.HexToHash("0x9950664a7d8d2e4b5d772722e1337ea9758cac77fed61cfc37bea54deb79cb89"): true, - common.HexToHash("0xe98b23684a2947393c5b4f0e47cabe4ec764e31ee5d6bbee2130cae1105e68bd"): true, - common.HexToHash("0xee4e673b99c705127ac712d6cc6a24017b6c57b4ce5ffdb52044dd5e476ce808"): true, - common.HexToHash("0x3d4deb69769b0550120e3663c9a6dbbdccc4b0ba4b6c73f1dc4ba2768a44ceed"): true, - common.HexToHash("0x6f8f3157368b6b301632cde269e8d426659385b0385d2c028316d7da87380f64"): true, - common.HexToHash("0x0ed37d143edfdfaec8b926bb3451147268ad9179ce9fb069b9118ed4afd79c2a"): true, - common.HexToHash("0x37e8340d3d080143836fb81339bb62deea555a60236bfaefc3a2a0911b861ebc"): true, - common.HexToHash("0xee45ffdabe94f547ab6d28b0817d66e494e5b79942286896cc71881bc19f8db4"): true, - common.HexToHash("0x3355d8c3116a27c645670c449ec515243adb0356cf39571bb6d6512d02fe0623"): true, - common.HexToHash("0x03aad1d07e6b84c9efe856d213d4ef5c66a6a0e085bb8df749ca7f12b6a0c3c1"): true, - common.HexToHash("0x044c6de1fc909016a3384cce8e29dcbdcb70a92bab6cf32d63b025e91e84ec81"): true, - common.HexToHash("0x313dd2d843fffafcf3eaea2b321f1b6e0c00805217fc58309fca05a8dd65f87d"): true, - common.HexToHash("0x22158c9d5b390ce262edb16badf2fc552c088c16b2b43e06e6a38c33c9a9b01b"): true, - common.HexToHash("0x8dabb31b4239a83cb2579da7c9fe3aa1c2574afd97e66c90660218c31a7d4dd4"): true, - common.HexToHash("0x480846cf6c2c467efd23c1409f952eff4c9d3f44e8530a9075209c62b430843c"): true, - common.HexToHash("0xd83874ca0a80ad522d04e45344ac949d2b4371a9baa917300f33f8984c805382"): true, - common.HexToHash("0x2a8af6a267bbf17532d43ee313724f152bded55b2a1b01999029669e12cc3960"): true, - common.HexToHash("0x6e6f5c9782296a7e2fde6c16dd882bd882793ece18d73e5deb52f48969ab781d"): true, - common.HexToHash("0xf683be203b495d689ea69b36185ff1f6aed870d346afdb3ae302ca398843b622"): true, - common.HexToHash("0xccdd36a21a55d71117f88e47850e56d127ef869835530d783883af97c9401979"): true, - common.HexToHash("0x741889aeab54579b3abd4ebaee049615580e31871f21fdc30c6af8c5e3974e61"): true, - common.HexToHash("0xd04cfc8ae4cd3ef1ba0d00ad7f38706114ba6bae79ba379977ee286d785bf818"): true, - common.HexToHash("0x7470804ce546c4a8ad6f3be00b5532b6107fd53bf0e90d0d5a70fc1e3454e454"): true, - common.HexToHash("0xc420cb614c3f8238fab279ddf86e825a1f876ac014d5309b531a839ba700fa0a"): true, - common.HexToHash("0xc874f0025deae829b2007637f1c7911da30261e7342a518a3fc2a706e5ed0893"): true, - common.HexToHash("0x2a536b42a9f981eb1b162cbf64586a23947ff4daacb5f3d8da63637f3d7d1be1"): true, - common.HexToHash("0xc596ae561dce986cbeb936df984bcfbffc504872165bb23d444f615490123768"): true, - common.HexToHash("0x22b6dfc71a6f269cac754cbc492159ff1cab6f716bfc4d97abe89b9d5433439a"): true, - common.HexToHash("0xa36517f20b74f531bba0f96ab5373dbf4bd67cfd9156b13d0f8b2d102b3610c8"): true, - common.HexToHash("0x0a090c6c88bc524ad3bb6f85fb42bcb1754811a623a900ff07eed35a987af239"): true, - common.HexToHash("0xdb1af1d9ef01faf66ec3fa1d402253221648106580bb1ab2ef507639054b3a19"): true, - common.HexToHash("0x383b4cb963e94cb0c869f0f30f905370941b502e6fc30858f56129a2bde9c1fb"): true, - common.HexToHash("0x1b35e898cf794dbdab5e73f2e3c2649e462bf6abf6be3dc4dcf9aba5591d52b4"): true, - common.HexToHash("0x2168343fde5a543af36835d52308b915ddc37663531b94f772060f3725a66253"): true, - common.HexToHash("0xe99bec7b6bc61d89d127aea75360f6384b312969c3f979aee3bafb0e3978f638"): true, - common.HexToHash("0x9a2107328ec5538261f81d869a4f50258d314bcef153b13adb101dc5e68351ba"): true, - common.HexToHash("0xff195b75524cbe2ad24ea8b107cddfb3ec6d179447ff4e87c9d0149ccb509c7e"): true, - common.HexToHash("0x0cb9d74d57793b242f0ae8fafdd354f8ce0f4681da3eacb486a5b4f0101b71d9"): true, - common.HexToHash("0x8883469aef1f21e4477a439c12cb6ef720f678653bb2abb3f8a352dfea799e6f"): true, - common.HexToHash("0xa767988cd7206b8c9f04fc17cc3339df4081d21ee527308c4025140b18219c5b"): true, - common.HexToHash("0x528f9dcf838aac71e8801327486ba65e0e9aa361030a232961fe19e382f32ad6"): true, - common.HexToHash("0x1baff0272a4bbcfbf2440335a3584ac7d0f6c702cca0aa79c2fba27f366847c4"): true, - common.HexToHash("0x783c78761856f99e38344c04525972d41d29df86a4e27f777141e807ac8682eb"): true, - common.HexToHash("0x16d53d7e9abcb7f3d07af3ef6ccbfbe27beae5a467a1113d7115275dc2c46f03"): true, - common.HexToHash("0x60ebbf9097951e6f50468ee55083342896521a7d6f69866cade961352fa3fa37"): true, - common.HexToHash("0xa2c6aaacb1ff32005d56a9f9fb58bbc0ea829303abfc13393cf5e0007b675550"): true, - common.HexToHash("0x430350f3d6334c6a662abfba8f6aa211fbc15ee0d7ab7e15c2b7fa6e1dd6863f"): true, - common.HexToHash("0xf49d9e2b4231ef0362cc8586a54bae12144ce04e17ff3dac356fe416da6da38a"): true, - common.HexToHash("0x230c7179abf0634d17ae8cb88ff2b12700c405a0a8ffdd321c5a7eda6470592d"): true, - common.HexToHash("0x059b6bb1787067b17a6da143adc5772d838bcaf4c6511235ea991fcbdecd108a"): true, - common.HexToHash("0xbbbe40eb05f8ca1f2aa470ec4fbed3345c724a26188c50bc380fffef94539f1f"): true, - common.HexToHash("0xfd3e9522e21972584a8d1955f482ab812321e2185c774053ec94ed9f49e2d6d9"): true, - common.HexToHash("0xa8a19a48e3f78e512411d3fb3ae09ddaaa9fe62c5cff6a42370d39acda82f232"): true, - common.HexToHash("0xb12ff480def6d0cdecf81ef32b5c72fb5940f6d81fcd456426fdada147760c4b"): true, - common.HexToHash("0x02628e88c7604c5ca9dd56410459bdce55849fbb6205b7c0ac6f0d639ae1d8dc"): true, - common.HexToHash("0xb7ce36d8ea324cc7e476493e88a76ae1d871b3036b5d2d33267c93b8ea0358ab"): true, - common.HexToHash("0x9136053f3a85acb9f80354c4e1416c53aa781d97e6d7e3ef8d0f629c26c8c939"): true, - common.HexToHash("0x2950188390257fd5f117a1b6e60190f1a780d2c230371c94221b9a774226249c"): true, - common.HexToHash("0xf042589b7be7bcdf12c0b3b56170a4d9052890c8ffb6dcd88fe7e2eb9dfd3aaf"): true, - common.HexToHash("0xdf87f43f1252f8698d3f5b4816a03047c933c417d6ce5c0bff4f1a3e6a724301"): true, - common.HexToHash("0xc5450968e55ddefb450e19a14529a7849f5ad66cde61ab4c036e7e0f60efd854"): true, - common.HexToHash("0xf4d0ea7a96dc36e143fbb9f82d0af09a3879d46197e93fd354ddfa37738560bd"): true, - common.HexToHash("0xa1fcd7e3fb77aceb5c24d0d1fd2deb5d12df24350ea2c416112aa1c5e4c1ed41"): true, - common.HexToHash("0x9eb97c0658f41280e7d778d1324c7c4738af51e4d5d57210ac921ee3e583fd49"): true, - common.HexToHash("0xefe59eaecb0e7f5e494ec881b80c3ed55543c09e9b24ad69ad46e38c68c70396"): true, - common.HexToHash("0x78d61a668a154158a5516efa0b76e6aa3b92dbd3f61864bc8c63c15d0e8b7e7f"): true, - common.HexToHash("0x3b636be19bad075a294f8de8ab5cfbaa7a492473452eaf5daafbabec4970533f"): true, - common.HexToHash("0x4b8625fcb932bb68b16ae7c99db9ccc3371de240b9b8ce6b9d4dbc2e263f6b7b"): true, - common.HexToHash("0xb0b8cc7a28eb47ad1c290ac580ab0093f65acf68d4e501c8d8a6627488edb443"): true, - common.HexToHash("0xe663ea80db358141472af5f5ff9e88272c6151258c21b57d5475e4dc80b34208"): true, - common.HexToHash("0x63fb0699915e55e5dc503f5e06394caf35cf00f6135b1fd6fa48673aba3a8e00"): true, - common.HexToHash("0x78356f6b164c24821cfb69ff3e39ae419acc4145e14d632e5d2dcac7bd5dbbda"): true, - common.HexToHash("0xd2aab4e6cedcaf53fb38fcc75532bbf2410a42344b61a6439e39a99165653d6d"): true, - common.HexToHash("0x01cbb6ce92e395eaae4ad7335ec5c79d650b9689d5cbb2f1f0bf9c6f0badf280"): true, - common.HexToHash("0xe840be30b82dc140db09315fca9fde352b4b857d5052c45321d70c81e7c62430"): true, - common.HexToHash("0xfc0dd4be2c21b2fe60cd1ccbcf902307b822a8706de0487c2be39a460c5315bc"): true, - common.HexToHash("0x3808e6b4955c72b0a990e1a12e80e145febf7cb3237116d848abf41590bb47dc"): true, - common.HexToHash("0x1ec54fe898d9c9e9ea0bdce980749e8173b5cde067e91ca1e19724be9d724f2d"): true, - common.HexToHash("0x14519611a01a828fae649422c0cd45251416e6ec60544005bc4f936706f78b02"): true, - common.HexToHash("0x521ffceba3e9da2ddf2bd88cfee827ce326ca636722e023f9158387980a25c45"): true, - common.HexToHash("0xf9a424cb058b08ac1103fb9784831e61526d238c420b1966d96889c40ebf97dc"): true, - common.HexToHash("0xfcdc21e663dd3e271aa0e513b7c9805ad3739192ecf767eeedb74a381a7d718a"): true, - common.HexToHash("0xce5a45e3106c3a994ea0ae270c322cd75ebcd6d63a494c285491f64f53437798"): true, - common.HexToHash("0xe393b8a0ac6154c5bec6da9faa2edd98cf1864c18be75bb50f490f0945ee3d6a"): true, - common.HexToHash("0x6607a64596183ec9f9774aee089ebe7a87959346e8bd9c2ffd3277ddd81b2606"): true, - common.HexToHash("0xb852732751e03d69175ed7bcfcf97ed0d4d47113b6d8c3f7623474c41db8f5a0"): true, - common.HexToHash("0x8dfb8d4c0a15160d1081babaa33ce384b23c48e00c7e7e97a8651cb091d848e7"): true, - common.HexToHash("0x56dbc59cf8de56a9aa404f3ae85683b369ee4340690e26ae36774db136e5e74e"): true, - common.HexToHash("0xda02a8ecb200f126f08d2d67945c2a8ba02e9d1c6271147b2e9b093ac968630f"): true, - common.HexToHash("0x27e30603da3064202d618f5f2af5fa76a61ef3a80c39a922338f8ec40fb101bc"): true, - common.HexToHash("0xfaba0b5295fda5e2badfc68ed08751d40b225d6abd5e0e5b7dd4c07dc7a7569c"): true, - common.HexToHash("0xda4504302a3663662899b5c5a48821e4455da250f068cd8d02f12a82c4e098c2"): true, - common.HexToHash("0xd721b0bfa7768b58601292463a2345a1ed945880f4e0bfa388fe1c6ddcb6e429"): true, - common.HexToHash("0x048b8698ebc1c20bb424150aa62ad9a380dc58b828b512c49976297aadf9954a"): true, - common.HexToHash("0xe91533cfb01f1a0bb1303c25b91d4ffc17ef740f105000f1c9215a72afd56f5a"): true, - common.HexToHash("0x6bf0b0085ecb5266dbe36cef98e5526160b15f77c3c8c17e15906359ad53e7e0"): true, - common.HexToHash("0x51beb5eb624da75176c41f71fa6e46b0bd1c2b9bf68da822fadecb033ff2942c"): true, - common.HexToHash("0xe2a91e378c9445da68ccfae49b39ac956bd598daa5fc47d20e41fe55cba1edfc"): true, - common.HexToHash("0x4f05baa15846dc545a1e4a9414044f9505062ede35f62486a073c26ad8b17f0f"): true, - common.HexToHash("0xde0bfb83654f7c37ff1513f4619572d00c611a76b35c9a21e2d04373360bca6b"): true, - common.HexToHash("0xc09b3427ce3604768de6928b87e5520d91bd8f3fb8268d1c31ec212133716d52"): true, - common.HexToHash("0x2384a51f0c9716bd091c4713582621eb3f70df2577f1ee6eb2033027c31affb9"): true, - common.HexToHash("0x18ed7298ac14bc880bfab216b545179cb5d3cb20393df0e6f1fcef544a34e682"): true, - common.HexToHash("0xe0c5c369cf74914904962e22b6297919e54c52ce4b3ca337829174d6ccfec932"): true, - common.HexToHash("0x061bab760924d0ca83725acf9d08314e36f16a17f22c440431b62dfce931e0c8"): true, - common.HexToHash("0x80fe6c3d5fb3d8d01fb1127e07505701b8f3ffe6cf205acead2076e618f3d165"): true, - common.HexToHash("0xe9bce6c6109e3af1118ab032c60a22c29ce6a735d1aca71daa9de441b77ece65"): true, - common.HexToHash("0x63b451fd73fd25c4f77ecd8625f493b4651369aca0961c025c146204bf6fc2f6"): true, - common.HexToHash("0x3d773d71d1a0a948c81edfb4b3841cf760924ce2d3d98fe117a1487b13bac596"): true, - common.HexToHash("0x44f9a19bd0ddec1efaf63b4e671155d20b0846c11f7eaf9ecff7914e05528a74"): true, - common.HexToHash("0x4e3409ee9e3f168c65a85d89fd5d5054eca1f8b8bff051abd5b3013f91f68007"): true, - common.HexToHash("0x589bfca8f9ba7ec05a1d109da040a916a3e361d4389f385b9c5f949fdfab9f1e"): true, - common.HexToHash("0x809a983d4e5bc61dacfe32253a4b4d54626b3f3243120fa0a39f69428c33cb3a"): true, - common.HexToHash("0x67d1564122c0dd095dc9c2c47c64f3022d88e18e7eb1b1dee780e62625aadf81"): true, - common.HexToHash("0x994426b95056d94c172d771b3122873fbeefeda1e6e17051794aa82516e80068"): true, - common.HexToHash("0xd13cb78badef94f60a28bb7b868bf4872ee981a5683909c5e0d30b11dc621337"): true, - common.HexToHash("0x6ae227985c6cfa09d8a271cd416af964983f858cbb87a0a3740fabfd36b82b3b"): true, - common.HexToHash("0xf7bbe671afbd378e3e89e0f0e9c637c9080b6154ee9138b8e2b021d4eb1ebbc6"): true, - common.HexToHash("0xe9b36e669d8e7dec88f3badd86e7bb445316f0c58d3246ac3bfaa1e257d218dc"): true, - common.HexToHash("0xfa98f745d067827cc3364955d7ecdad8380f732a1a9e5a54af174afde1d805c3"): true, - common.HexToHash("0xf9fed6412bd435842bb1dfb0e759d7d62c3fdc43205c4c82f1747f6395035952"): true, - common.HexToHash("0x77099b626ac15d8f9f31a25d59fcd62b8bcff742af37110b385b872d456b9a19"): true, - common.HexToHash("0x3825756f2f2bff0c304bd826556889dc5755e81d348ef530840e2dcb2a0fdf9f"): true, - common.HexToHash("0xad49a2bda1989129a92761df302f0544724bd12d04a599519a8d1c903725c837"): true, - common.HexToHash("0xbe22105c225dd1bbc3d6abd721ffb4796c610a3b9a1ef23da534af688949ec56"): true, - common.HexToHash("0xdbfa6953c6cff0f3b7962af6d192716a159664b27fcc176cfd26ed327a76b3b2"): true, - common.HexToHash("0x83013046d2a40f087b65a6d158e845175b27c6093a9ecb1835db4f248a54bd45"): true, - common.HexToHash("0x2edb51f53e8da5ee89c48e6f20cc81d5462ec50cc3ac4cc262812ae530b663e3"): true, - common.HexToHash("0x736e02aea8fdf736a9c5aadfa6628cfe812b632b2e149f0f591e3c935725e514"): true, - common.HexToHash("0xd6fab21b56eec4fe09550990193b021048c14ea67880493048d040baa9a39391"): true, - common.HexToHash("0x7d9cc6959d99741c7b89d30b5893521de619910c707117f91f78c17069ec2072"): true, - common.HexToHash("0x8ae2e235d869b09a3be3ad17ba07dc08bcc1ca6fed881721eade400fc37deabd"): true, - common.HexToHash("0xe3b3936a3b1758befc72b62c973db346ebda27c4f5a7b5b47b6022433bac733b"): true, - common.HexToHash("0x8c3bdeff8dffddb31f6f8a38d181d0b2eba229193b6c2e47c240025b413f5a59"): true, - common.HexToHash("0xf090a410188eb29a0d10cf2449ff137a4aaa53f4eaf20bff96f2d87ee703a16f"): true, - common.HexToHash("0x1e7a967bdca12e15cb5c28cb994ad0a7c05a4d354e00d85bed169218f0b2251f"): true, - common.HexToHash("0xefd41ce1fe5cfd2a5bcc2f4616460a6baf92577b72307791bebdd71f63f21fd2"): true, - common.HexToHash("0xb21792b03fce3e2c39dd9b4acd545836e96897d8132eb5881f724538c779ed07"): true, - common.HexToHash("0xd27b5d491d0a8aa7b1955b8e534b8582906a89892be1ba1c1198fea4139d7540"): true, - common.HexToHash("0x3088604fdc5cfde5edc9b70e951f5be68d0a8dc7c7c9077852314ea1dd178bec"): true, - common.HexToHash("0xc7fac985dfd1854d1696f6bfb22892bdb8d093ee0d67b1a7d56497daa27a44c9"): true, - common.HexToHash("0x387d7d5343079b4bb9bc344e26f72fd812a6b18ead7636c1080e0db262fe66ab"): true, - common.HexToHash("0x6e17c91acbb756db47dae903c47f85b0a32efd72548b76cc4787befb187487fc"): true, - common.HexToHash("0x83543ad4f57c7f07b3cff32257c4b50bc74800e4a27c99a795866f466335f2b6"): true, - common.HexToHash("0x1c71f4637780e2bb471c7a0ec8fca834a2d8ebe537cb0123fb31d6b021eff6f6"): true, - common.HexToHash("0x0e6c5767b73272ccc6ea4b59faebbc6941000962494ccd956481bb87f6a7116d"): true, - common.HexToHash("0xf7631f0da3b7ce6deb899a686ff2d2caa580be3b4f718908ab8f67df99f8f06f"): true, - common.HexToHash("0xaec89191f357e97e6f6a7745a2f6d63401a49823390cb533942456458e7c65be"): true, - common.HexToHash("0x38b497fee3ddf4cebb0c83549381d4c0c0c16d2dd16b5339b1581523c6914e2f"): true, - common.HexToHash("0x894947463203a2d86a76af8752042c183dfa30659488e6d788b7a1e8fcbfd3ba"): true, - common.HexToHash("0xfd736c8edf95eb39bf8df96f9981bd03c12742559b51fb18221ef925616f7479"): true, - common.HexToHash("0x627a93f1a31ed45fe87a614665eeeff695a47c9a70663423bc803488598d19c5"): true, - common.HexToHash("0x38ff6f53462dbf70ef3256d5eee70c855bcc0f1deb36500519af0f3c9776eaf2"): true, - common.HexToHash("0xc71a9fef662200602e5b91977b023900e83b2ce6ce49b11b361d8302fbc9b37b"): true, - common.HexToHash("0x334874ed7fc5a8a01e21332fe44d03126c8871f3ae7e2098f5453f50b8fb4677"): true, - common.HexToHash("0x4956c642f68e8127fd6eaa27a173dd24d357f7a288d192af99cd139a51292798"): true, - common.HexToHash("0x02f6029c2c75f3c8fd5593d18968232b798ba73d2575f0403eaeee1bbf0eba9f"): true, - common.HexToHash("0x9cb2bdd61ea2c7440bdbaceb94d2999d642b444ae09a6cf94b9ce6df28e18e97"): true, - common.HexToHash("0xedb5540557fdc3a21d7e92cdba1cbb09d12c913ed724ef2aad0239fd2c111bdf"): true, - common.HexToHash("0xd0e855c20abc3a9a4235585467b700019ca1437921181b9baf7b519d3d7c2987"): true, - common.HexToHash("0x36e3c71b92237850d7199905f4b1e1cc6bed6c863a2ba59ecc921c321c396643"): true, - common.HexToHash("0xc5a6c33c357b742ac979ea0fbf8729318c1a1a20ae201494672147080d477e5b"): true, - common.HexToHash("0x2c460870b9df431f654d0f87589ec85622529bf2228584d05f7c732bf8656d3f"): true, - common.HexToHash("0xe586e9487444af3a2cbff84e81f5f41fa901e57aff507ad41d2cbffb2ef37e95"): true, - common.HexToHash("0x36155aa4108132b88700b68535cb7accf23a40c9cc90fe2a3858baf4debe5edf"): true, - common.HexToHash("0xa6494896b8a17acf3febe215b1e5e10a30e92521f15ed7a5062b30405ebfb2e3"): true, - common.HexToHash("0x28bcba7ecb5152d488bbcf8d88537c6bd99f069a7aba07353d58db0890f9fe09"): true, - common.HexToHash("0x43ad1f0cb448d43a23de8563d0be42737a1fb214ab154db22965135a012020a1"): true, - common.HexToHash("0xfa5654a55bc5283378a89d9b2a9efeb09bff0b1680ebebcaaa04cea5a1d8b088"): true, - common.HexToHash("0x59e19c2f078285cd76795e14d6c02bdc0c165ddc6ecbb41f7b33d723dcc3157d"): true, - common.HexToHash("0x74dba729015383c19b180abfabd803d19a9bdd70b4de1101db499d91a36cf5bf"): true, - common.HexToHash("0x873d585c6d59e90f32265d6529cc9210016421390e28d2789cd2584405514dc5"): true, - common.HexToHash("0x48acaaa7efc1608da7f64dcfc133621d2c7aa7980ca325925f7be28ab017f57c"): true, - common.HexToHash("0x019aa3ecf0e97f05af753236cd122fe617b82ad735a9f0089fd5668aa581fe8b"): true, - common.HexToHash("0x92cd9da09a2d17ebfbd15f01308500b3d2cce236e52f900a5b6da61ed2536432"): true, - common.HexToHash("0xe8a5f27894dec7122e89c188cb7e949df45a6586775ed2545607584f9fe54e4f"): true, - common.HexToHash("0xce406a1426740d7369d71a0737d79e4a8b1be64252f02b216893a56a65af14ed"): true, - common.HexToHash("0x4bc45eb8dc1e6b4773e2c5ee2e66dedaa1c518e264bd080721f6024a4a7f1b94"): true, - common.HexToHash("0xc8339587170bc2ac8fc2441104f402e3a46f7001340d3922fe34904b6afe0eaf"): true, - common.HexToHash("0x08ab0cb154c1c526d587be76861bb2b6a17cac60a98de37b7ce820c2f84ea999"): true, - common.HexToHash("0xf085f7a9d72f6eca9f43465c529a1ea33791dae0eebc1f847f825c1b629caf18"): true, - common.HexToHash("0x1ec63ba4329e38b099f01e131265c8b4aed42f7a040f5f0889296c2b3a4e1d85"): true, - common.HexToHash("0xdc4a4c03fbbab7fc58ecee9c6e26173e11f65d7ff86ec353b1436bba69e4a971"): true, - common.HexToHash("0xaa2059ad99f570dec13ac837926276af2af496664b8075df02298403f0192b93"): true, - common.HexToHash("0x136dc3054634cc86e676b73b9ee75e1beec07760529dafd705a11754683b3480"): true, - common.HexToHash("0x01c6a635fbd6e78590e1cfff62aa148d7a2d05029ac0b4f00ad42abae9cc92a7"): true, - common.HexToHash("0x0eae0228aea706ee9141209e7948c288ef60e1ae4f940c624db4975e66290430"): true, - common.HexToHash("0x742abdc14bed51eb1cb35523844e33c7c42535fe7809b5bd7525f98c57ad1dfe"): true, - common.HexToHash("0x09d48813616375f0686e6900db85096dcef0d3fa1474286e476893649636c60c"): true, - common.HexToHash("0x6b33536a8c057b6db6f2b5f3aa70fa9d2e7b3347214218625d15f73b1b60b4b2"): true, - common.HexToHash("0xd349761e3af2cd65dd63d6d647e13a7634d7838112dede33cf72b01b0cb4bc25"): true, - common.HexToHash("0x698201f1cbf8011fad01b76eca69154daf1c2d1608056ff9c553be2a3820d7fa"): true, - common.HexToHash("0x65323e1931e37d44c9037b989d8adceb3711a43561e644729b2e996d41caea0a"): true, - common.HexToHash("0x496139c641a85cf8fd3e39a8cdc5388826c300152a349e8648143d8a3cb4917d"): true, - common.HexToHash("0x65920bd9e064d1198d38fd49a30f0e9ce2b9791ba81ce1246f955ac113086d85"): true, - common.HexToHash("0x3cc53e85daf7b71f3a2baef37fe718e3a951b30c7d5e8a3317d674a678b469e5"): true, - common.HexToHash("0xb0552349a090f79549ef0a0afd36f9ace116d59b7504d2f77e10fd671f1a7ea3"): true, - common.HexToHash("0x0c355cf6db9d8c10d93c0eac99b923d51f81a442e7e004176091d5e5dfd4a5c6"): true, - common.HexToHash("0x4523f8d92d1d4a2b82e6fa57484dfce6af2713cabd8da8942d059e4dad46952f"): true, - common.HexToHash("0x8ab5deed52549529ec94f54b141023009b320ee844a28673fe6efc48afcc18bb"): true, - common.HexToHash("0x5a0a0709f62dc5a02670cf29d9fa074ed9f58f291d17992b2c5618b031608ec8"): true, - common.HexToHash("0xc595543ca31b414f1b5acd65d62bfd105d22e99f503a3d1581358c78a57595ca"): true, - common.HexToHash("0xcee7524f41c7ca607c3519b17c740266af72dc10f50b3cd1335ec7d56560d80e"): true, - common.HexToHash("0x977f31f7ddbe60e3b288df08eb88da957713aac5438cffa53628b9136733e413"): true, - common.HexToHash("0xa376f3426147778a5446c7d52d9159724a0bacbb40e97483fb2d1cb52b56daf9"): true, - common.HexToHash("0xf04dc93275d14f2312de75cdc1bb38676a6a334a4c2c59700934e85d9d9b6ae8"): true, - common.HexToHash("0xc67394782cfaee0057fbfc38df1c712ed7b4b1218d292e5fdd973a57c6c5a705"): true, - common.HexToHash("0xaa1ee71c2cba59396dbb1386f839e92befdbf2863c800b5bd5fa9d50dfe8ffcd"): true, - common.HexToHash("0x091ebfe924ee81644dac8ef9220b5b0ede5bc43d0692f7d1057c6d54793b1bf4"): true, - common.HexToHash("0x2824305cf20f85f3c5e10f0ec3ba19ad0f288e7cbbb3d44228b89b1145f3341f"): true, - common.HexToHash("0x9618735742b9d1aebf452afcadf35d058b0bb4e116609a0b1f50d124bd898749"): true, - common.HexToHash("0x9708c30a1eb52a97593aa1d9159c5c5e01a70b394782a0a1c39512543cb7e1aa"): true, - common.HexToHash("0x3ad1a7fcc307300c99016682b36468694dd6a8ad9b63f379479da50dce062c1e"): true, - common.HexToHash("0x4d6b2e7ac60d5d990a0fa12f104779e821a1b1b453604899adaed9763c4992d8"): true, - common.HexToHash("0x7cae338278eb6c54042ed118036d017a0f55a68c3df60a0efa0be73b0cc7010f"): true, - common.HexToHash("0xc93f0227d6281c5b2dcb87ae9f947be0c20468be0d991d56726f43fdf5fa8a43"): true, - common.HexToHash("0xc9ae46e1fb92310ea39dde38a9b455cbd2b7e9c0f6703d9b8ea0464bcfb5c955"): true, - common.HexToHash("0x05af18ec2907ba818bd5713f4f8582f6c7edd61fd425ea46fa9c202453c1844f"): true, - common.HexToHash("0xfee56e358adbf912c8404caada6121aef23527a3a85a0e3ef5104e855ea999de"): true, - common.HexToHash("0xe1c8e5a247d014f2121ed32235c50c43a9d01afd4df45dad7d478afbd03f68a5"): true, - common.HexToHash("0x2b7b96d91a4510cbbb0004236c4c06a061b6fa9779ecc2acb4dee46bc9cf37aa"): true, - common.HexToHash("0xd9d7a55783fc4cf005b173df706178a6d79e9221c0883d92747548c38d8ac0e8"): true, - common.HexToHash("0x3a3da492e4d42c234a5e436345e94ae7d1196ca739f620c0db38f2167862be75"): true, - common.HexToHash("0x03fa8fbd22c0194f8ed480f2da5034a996e2c7c7068391e264acf2581e44e4a0"): true, - common.HexToHash("0x5db1b9bb57f72c63f1c1f3477ac2601f697e1d5a54addcd2e3d6715e1d75b17d"): true, - common.HexToHash("0x73326bc3884c843009911f7a1af794ef703d756afd53393dca9237270482ce73"): true, - common.HexToHash("0x67c3252ae6baad76a47f472ddeb304a0c5ee63dd2f430df15a26f436589bb0ce"): true, - common.HexToHash("0xb6811fe6fb8c94b5c0107b1d1b2d6c4f6fa15869e596e0b3590987c8b5ae582f"): true, - common.HexToHash("0x005869f2e1f233f5056d384a347a62e7a891da478e6a6b5ce76a096dec6b5604"): true, - common.HexToHash("0x79c165a512cc9d57b4f9c83b0f1de8ba239f2c34521f6688ff936d8fd3dd0fa1"): true, - common.HexToHash("0xc7690e0953187ed8c2935667e8310bc9f0884ceae97891a4dfe1e51c085fcfbd"): true, - common.HexToHash("0xb31f211c265de235569aa8a9309f0d533be88d4c42a49db231374c5adb36445d"): true, - common.HexToHash("0xaeb756d6920342fab0417ab2864b99dce49c9510971e7ae74fb849dfd21ca55b"): true, - common.HexToHash("0x16fbda0365a0d3e9271d87587a5e7210a92cc461539c10107c19c1f60a31e033"): true, - common.HexToHash("0x294bd77e45dd16b2f8b7fcf864198b6c82f0a009773d19d441ee9d9e842632b9"): true, - common.HexToHash("0xb782f94c0ef21a7f73d28c23822a6dc79cc9ec8f476a2c900def1e0e2b09bf40"): true, - common.HexToHash("0xd4e017be8f5bdb2229f3557200408ca4fb335e564d40c576ba75b4141d83bdbb"): true, - common.HexToHash("0x2952b8d6a8dd517b7986549a5b430209b31904113a03c6a75acc6ba4f3cfcd9d"): true, - common.HexToHash("0xd7c5755974811ef92dba4e8d144e5599a623092e8ed97fbc1d135f12d9d6e6da"): true, - common.HexToHash("0x2f124157e6e7268889b6f8c196da169bc47760157abacf46012d1f0a75c9a98f"): true, - common.HexToHash("0xf5cdf09300f42d1f637c90d739064a3fb5c8e18602859a4052a8a02463fbd1e5"): true, - common.HexToHash("0x567b9e6b3e39f5b7642903c20cb1505d1607af0f61a4759ad7374d7259cdf0b9"): true, - common.HexToHash("0x314eab38dccca3e557650f572f3bd25af505f8d4dda893e1415b7219e846b545"): true, - common.HexToHash("0x8b65d38a950d2adf50bd3337daa1fd8edb16e4114b4863b9be871ea358dfeb61"): true, - common.HexToHash("0xd90bd581182afae822464444073be54e3fcf61d43060ad73c6ab353617a658c2"): true, - common.HexToHash("0x78f759914bed8b1a9c8c0a0500249bcd477dbc9dd8f29934ec69552707ae3f13"): true, - common.HexToHash("0x41ff211444c7495a58b2dcfb3f9e68a6df22d3f85985f064da173b115952417b"): true, - common.HexToHash("0xe23122bc9a41a12fed594592095b74a3740c906f9367647c809b557fe53670e4"): true, - common.HexToHash("0x19c5789adc50ed84198e672818545aa0503e07405fdebc078d158cc1d731c779"): true, - common.HexToHash("0xd4ce299240a10f48fe7a18f9a01054126b7c7981aa98c2c4d87f9e63dae7c39c"): true, - common.HexToHash("0xbc23937033b757749b560e051d557f14e8fd64fea2450c9bd3de8ad41dcf9a85"): true, - common.HexToHash("0x39443776d098c0208223ac8fc1f201cb3fb4896fb7883425c4d4f9b3712117ae"): true, - common.HexToHash("0xccecc310d4032d5a13cfcb303ca2f2ee0fc5643866378474e90f8b255d3d00eb"): true, - common.HexToHash("0x0bb1a88a3a68cc74ed0ec166f46978d72827efb979ab8f550f612e2347b38873"): true, - common.HexToHash("0x42ccd0c30a9444f61960b2c08c25e4ef465eb7218ad3c126fee3bcccbae7c56a"): true, - common.HexToHash("0x9c19964638f6620115592a4096c8e529a408d270832d61f63bd2e6194daab3e2"): true, - common.HexToHash("0x7554c0a1d736456c04a28b58d23668e646df51b84623f97ffc9aa049ac2348c2"): true, - common.HexToHash("0xe8447d6c9059070e57b802f1130f01d70a32856b94ecbc0c2e5f321a7ef43fd0"): true, - common.HexToHash("0xb41ab35e334699060b28927cc30ad96a269d4abbd37357d71ef38f2cc2c083bd"): true, - common.HexToHash("0x82fa6b41bfa1e1dd750c62e7dc27050ab136dc95c04cf955edac4e9265983efe"): true, - common.HexToHash("0x264f9aa4af110535ebfef3296fbe55c05e2f7f9054f67381fccec403d3711b60"): true, - common.HexToHash("0xd2e71f3fe9d65eaf0d69a47e7f0a69ab4c37ab1a779218b14f2bcb8dc739b0de"): true, - common.HexToHash("0xe1340d5ed14d73dbe8aa51b4978135db504e687d213892979ef2487f4ffbc3d7"): true, - common.HexToHash("0x8eb7d93f26f7db6e95bf8e1b95777fc0827a22ddc40ece1a1dfa157ebe4f3e13"): true, - common.HexToHash("0xf1da1df66f482e73a9eccfbdc642335e0e58562e9cadb3dbb70b200ba0f53846"): true, - common.HexToHash("0x48c8d6b9d8c396490aa521b78cd60f75c500383b99d961233195af8ad37b4f8a"): true, - common.HexToHash("0x7859c2be5bfb19956ff2921951d55e3ee936cc5755c36396c20f06f98175a2ac"): true, - common.HexToHash("0xe7e5cbbfda5b3499c9305b2dace7af425c43ab329b7cb9a9bdfbd56a58054a04"): true, - common.HexToHash("0x1a7ce3153d5ff9ec531bb997a2d54e533ccfc0c993c7edc073f4915bb9323bea"): true, - common.HexToHash("0x5b6f65814e1d95ab376079c1fe8c32a3d8b48c48b058a18c3940e1ad628470eb"): true, - common.HexToHash("0x02a899a48be368a3bd3f8a04c30d9299a41fa6049aa11271ac5a59fe7b1c81f7"): true, - common.HexToHash("0xdab6c4cf091f7c5cea9a455d5645aae4195ef305999cb66941a8feea5b0310fb"): true, - common.HexToHash("0x69ab785eb2873212fe5fb96188ec7ff253d32aad71169b804cb2aef3da11a106"): true, - common.HexToHash("0x8397aa3aad14bf3f0547885055ca0cb059cfa8e431df877b859d4b64e215330d"): true, - common.HexToHash("0x9824689037757b7cf75f8db7bff272614e6dc95f8f15b38577215f0330b29b39"): true, - common.HexToHash("0x4dbd3a162f470350d67b48fbc9e6d221c4f545f8646855fdc2803526de508e6a"): true, - common.HexToHash("0xdb9aa15f0417ab28ce3019b8ea5f7c1f634fa773681880d6a38d811fd084dfd0"): true, - common.HexToHash("0x8d48e1a0686762e462f9024f96f3870de1ec7ea8708d94b31985586f2d265d54"): true, - common.HexToHash("0x51e17068f8544aca4a75013efb1e5516456078632f55cbb627e600e2212e68e4"): true, - common.HexToHash("0x480a70732b479cb0775308e0d649ae5b3595c8beff091c763d5f8cc9cb8d5e87"): true, - common.HexToHash("0xd69bf654ad86cdfa9a4daa04999aace3adb4a24362fa7c9a60e1b274ffd0715f"): true, - common.HexToHash("0xbbfa2547c009c0c2eb348ac05ed629ad77a685ef0d947f63b71994e2a1e18a2b"): true, - common.HexToHash("0x622fac41fd2c53e4080da2e66ab4b5a53b44e98a6c1fd4c482ecc95b00b9bf25"): true, - common.HexToHash("0x59932e96964b00f15f625b4060b31fd0e4c0f35fa05bd25e0cf94f83645bb59d"): true, - common.HexToHash("0x76dc3d977d2dd666768a42016128c186310704cbe44956f29f7ea60e227c2599"): true, - common.HexToHash("0x22d69361fc32c55f78094ac9f50cf030452e0f99e090175ef853a67914a3a2c7"): true, - common.HexToHash("0x55b3c0f244d040757a84dfd05b09f22fef5706db19a7473afbd83a7c672ddb9f"): true, - common.HexToHash("0xc5dd69b41d74a463288244559451d457f877f5fac84d7d257122bc2f27baa2bb"): true, - common.HexToHash("0xa9cf1b47fd07604b96555b5f9c650720ebad7fe731d69935988647f763f4e18f"): true, - common.HexToHash("0x35d2d4cd072fbd7b296a8979d75997613aeee8cfe5d6edd23ce10b45f1aae456"): true, - common.HexToHash("0x5a12e35b501b99bcf3ad40831f252a86786e8e12b1843abce6f98ce5b316fc3e"): true, - common.HexToHash("0xc5e162851fef6ddd549240269f7fa46d1e4cbfbf92ca84f6b84db9943f4d4637"): true, - common.HexToHash("0x5fe4cacf83434f06b3154f64df1fc6c0d8ccd3cf6cfea908790c13cfde34be27"): true, - common.HexToHash("0xb6701e49c3e1a660568f0301b60fc483a149bbfb6442d3336dbb38bcedb569ec"): true, - common.HexToHash("0x2651bee6ef46e05c33e4bb77eb25516acd9cecc378f25c7b2505edaf60f2fba3"): true, - common.HexToHash("0xfad635eb6f20d15f169c342589b9efe3149f0a57894c7b0e33884829d5a16a7c"): true, - common.HexToHash("0x7ebd76550e6dee08475c43fefae2aae5338b155798094d749ee114fb77743187"): true, - common.HexToHash("0x16fe71842883ab23e82d82dca856b7c84cc546573c966ad02f331826ae44e739"): true, - common.HexToHash("0x51969776ff798c451ac7089c8ea4c147493685474f6568a5596ead2bccf81164"): true, - common.HexToHash("0x6fc2f9ac4c5dbabfe9fd3fe699d12611766509a44bdbbdc13524a1bd513393b0"): true, - common.HexToHash("0xc83fa314e6a5e819205a1dbf472f56ee103964bb12bee006310bb04a4f85eaa8"): true, - common.HexToHash("0xed40c486d509fee468515791753cad2b174fa75bc67bddca1999a92e9c0d89bc"): true, - common.HexToHash("0x2f51795b22f8a3eaf6f155b9c60ecdf506175a909f2cdc3ab8be8971fc307e99"): true, - common.HexToHash("0x2d0beca36f9310fdede63c5ce6888f14e0f1dc7d9eb11db08b7874f34607ca77"): true, - common.HexToHash("0x426a146fcc7a161db36d8fd201f38d0f861a07a57c2e78df8d0b39275f391c46"): true, - common.HexToHash("0x0cf1fb3c3b5f5c7e564c3f95129b6c7980f76cf5dbc5e196132bf3af10dd672c"): true, - common.HexToHash("0xb430c0604c1dcd2fff0af138871198bc4861e239a713844e63512c330a3a2e0c"): true, - common.HexToHash("0x429b561b5d836430c62e947066197f1cda0d0cb9f0e95f5f66d10123ba8215e3"): true, - common.HexToHash("0x67133e95576438d35641a83c1a7bc96de895b53d7296f69e8bd16e52e2c0def4"): true, - common.HexToHash("0x0f8de33b58f5dc0a957dcbbb0a82feefba8e829b4424827dd5c0cca8917a36cc"): true, - common.HexToHash("0x7eba291173839457d1ec2754f5e3b142e79986ff029056309de5f581bc7c91b4"): true, - common.HexToHash("0xaf909bfce37de71892d1b4c006f575866fb600be6c739d7a7800370723d12fa1"): true, - common.HexToHash("0xe1d8476f9ec08a1e608e942aba38a31e51d30163718b1978bbef128c295d4ccc"): true, - common.HexToHash("0x33510d65d02f46c46febebf44f80f4bbef2cc37495345fbfa4444c6f6dd842f7"): true, - common.HexToHash("0x69e55223ef2ceb84eccf2986c73501916dff89394bb9ec15e29871e138973f9d"): true, - common.HexToHash("0x3e90549882b14a081202f872bfff4330f74b6bcf4aaf1a6ed6853352046e3b00"): true, - common.HexToHash("0xa494b301e1c76c44f9eac061e86329281d3d210e73567d926c5ed8696e2419f1"): true, - common.HexToHash("0x41cd4c010195d51e73e1735a42a38984db87ef14ab544a9de502685d41fdc9a1"): true, - common.HexToHash("0x26eb0b575456ece88ddc05d4f0d76173f9da813dcb8dcb823a4b510ba7778f87"): true, - common.HexToHash("0xc9f548078635447864802b450cfb9047349987e8b1353e51f3fcaf186ba28b1d"): true, - common.HexToHash("0x4c5176956a7c243d7ca82873efa00bd51124801044e0db86f9dea2ce448bd0ad"): true, - common.HexToHash("0x60980ec2e41456d6fa5c4a19aac8ee0d551e56b444f65c3bde7888f71bcb1fb8"): true, - common.HexToHash("0x587f4cfb3b663a02c295a487171dc1dbd73f8c30cad0c17a4c240671240496ad"): true, - common.HexToHash("0x325ec645aea44975c20a4f72d9836950c94bbd1d28ac70970fca157ae18ca30b"): true, - common.HexToHash("0x48151219d12178defdce47a10d472592c583f7e1b964b40f02d175a1cd4e3686"): true, - common.HexToHash("0x6535a981de74f4ef4f2401db1c9c8470e5c40297229aed4574ad632a64c45344"): true, - common.HexToHash("0x084a9f1010c6f25c3846249fb28f698695fbb12bdf8ac9503af3a9028073d923"): true, - common.HexToHash("0xa2205e64d0f5924a7f9fbfd5f957118eb98e131e3ca9a8439a4fc089a3d5605f"): true, - common.HexToHash("0xcd3a2a545738c0034ef89f055bb6b6acfeee3341f8fbc5fabed0941793b84628"): true, - common.HexToHash("0xe5ad85c4b6d938771fe14be447b214247fb7bf147be5f026f3e37f5b7df8d03c"): true, - common.HexToHash("0xa1736446e7911bae396519523e8747bfb80acf93ee8a3ca4662655a0273b310f"): true, - common.HexToHash("0x097f8889430dd46c829f8a15f04fdaec04e5581ff90b8999263f3dcb63a6955e"): true, - common.HexToHash("0xe7ca5888cd1dc842966f9a3c6a2d54d13fd264ff0a57bd9ad409b5feac928f27"): true, - common.HexToHash("0x1c2f5cc537e0bc11c3121b390b8efaee14ca02c37331dc8999eb4fa47e986b66"): true, - common.HexToHash("0x890baba0c18763fcf77220a410aa793a6ae2c93e8200bec3c657d0ed93fbb18d"): true, - common.HexToHash("0x9ff5717ac1989690dde13218225f198816cf60114e0485ad9ca1e81644b716ff"): true, - common.HexToHash("0x7699251026a09b5f2b21aae48a075a349991c9fc86464d31bd909c98f165b8f2"): true, - common.HexToHash("0xd3e5de0b59b6d6ba63aa6fd90547cd9c06abeab622f3735bd6168f8edf7cdeb8"): true, - common.HexToHash("0x478b996bc3d88aa0ac868a5d72f6a4a0b0ecd6e1c6cf241b91590dac28048622"): true, - common.HexToHash("0xc4ba9fb2bbe714126e104ccf9a9bf386fdbe383b26db1d898a73c14134f90631"): true, - common.HexToHash("0x5394242b38c05556233c1361523777f87c67c62b8f78246d3dd6c45bde646eed"): true, - common.HexToHash("0x320abd92245d255c48a6e1887624a6ffb1fb019d2358905c45fb0436366c10af"): true, - common.HexToHash("0x2122bbd188e5bbf2e11c5b1f53e478ea026aa006fb903c9d9a671c704180b617"): true, - common.HexToHash("0xa753a19b7f895e3ded34820437244716bdeafe4c399099f82e2645a1cd0012b9"): true, - common.HexToHash("0xed02ecfc681d3e2623cda190cb4a5a0dc125e99e59e6d32198435d13019ddeb6"): true, - common.HexToHash("0xb9b005fcf4dba3d183b8ffcd0e296a0341d07fdef8f93fe0166eed9d9e4cdb86"): true, - common.HexToHash("0xefc7aa37ca049f97e91f93fda30461509dc85ac4b63cf08971b7ba71468b657d"): true, - common.HexToHash("0x3f317e330afdc67b7952734326cbc765d0bb486c79f6750eba642abbf1591825"): true, - common.HexToHash("0x41e03a42bafd0a975eda6e24c741d19d6e22200ea4aa25bb3ca17602daaecc40"): true, - common.HexToHash("0x7e60d5b2657b3ccf2adbe5841e984f1896408cbc0b2ee683ca5902a4ca020212"): true, - common.HexToHash("0xe86ab648e4be6128163f121890dd2987cd0f92d9745e0ee346bb42880f9b97c5"): true, - common.HexToHash("0x45ff59ac3c435a87e971f72b6bf223befb1c150848420453fd2f85cd5a6c120f"): true, - common.HexToHash("0xab1a773cfae1f0c1d40969beae6ec57506501519cd97e74c1b28de31ed453bda"): true, - common.HexToHash("0x451b8a5f0e769b8623062c9eebe698541e2ce3b5900d371996bb11c6c888c617"): true, - common.HexToHash("0x8136740b3ab4f8a7e0e6a5e3b4fabd5209dc20eaa373d942830dee891c426017"): true, - common.HexToHash("0x28eb6c004aab4e0be0bc477efe61ed728d44bb5e23edb0cb69d0155d5454396a"): true, - common.HexToHash("0x3647416ab5c88b79ca639496dd6329f978cfb0be1d5b05660054cf78a16c354e"): true, - common.HexToHash("0x2dea54ea45ef4a2e47295625e35b2972dda607c61c51d40929ca85748c663820"): true, - common.HexToHash("0xda9326456945b50aa0e8ac595d2c1f152d9da4cec89e200a0a3207290d10e1d4"): true, - common.HexToHash("0x1b035630e57fbc4a05a23171d54747c00f04a2fe65ca2fea782eeaf28a3f6672"): true, - common.HexToHash("0x64a4fcb5c591002cb113bad8afa123b1e99d46bd7b72163e1e561440e57f3180"): true, - common.HexToHash("0x1df4d1d28c90e2d646560dfff0f2586bed1c65eb94e980c9ce14368173a12feb"): true, - common.HexToHash("0xb48e43f4e8f3d563db2fccfe4f9208a617b1af5ab976ee63ad4d15304d0f2cd6"): true, - common.HexToHash("0x9c42a4ac83c85f7fc6a5924aeaea36009d6345ce3221025d0d00bcd688290cf3"): true, - common.HexToHash("0x39818fb0abea48eab917d024b9db7fa5d2c01d7008a7aed515c950366ec6672a"): true, - common.HexToHash("0xf5d40f8ddac4054c5e605f5f9f4aac024787022800f478258f282685c762eb5f"): true, - common.HexToHash("0x1592bcf2a4a2af6c065c4dc25b1bc24ce093fcc62720f28210ccf2a009f35ae2"): true, - common.HexToHash("0xb8e62dd5247ecc5f3936553d4e72963de2409feca94e2fe8910949d265e27d08"): true, - common.HexToHash("0xea4873f7633f4abe2b2c40127c351868c5f3427b304617ccee956da9c1d87a08"): true, - common.HexToHash("0x4001e6158a72928b0306b4c0d044cd6e665cfb62a4376609bf4f1ca5fd4cab84"): true, - common.HexToHash("0xa147e892221cbc159d1a351989770b9a500add802905962220b7e6dbc4171f4a"): true, - common.HexToHash("0xb1a7e5787dd2749f8699d1a20bf1a7a629e9cc56b4a1c5aa53a515246df38c14"): true, - common.HexToHash("0x61e7d347e00d98e6d6148393833497f1b776a36ce0ac89a97e5349aa39c1ff39"): true, - common.HexToHash("0x8428e53b05ccf22e79455f290fea44ef282d7c19f9f8dd969bc39e1ca9bc4d67"): true, - common.HexToHash("0x8a7940fbd9a696cbed9233a4f0e683865d2ef948e7f5d399fabfbb61a5f8eb22"): true, - common.HexToHash("0x70eaa5027c0d97045722ba76b9faf3147e8a84d120e005d0173ec6f0d6db0fcf"): true, - common.HexToHash("0x80a17293ae97a46c72a9e9b38ce3d5fc471cb5e55d4ab8facfbaaca5dad8856c"): true, - common.HexToHash("0x5021bd6eebd046c9990d008d42af82f72811294d5e081701e17c00f948317b48"): true, - common.HexToHash("0x639c7884661a6f40026e524d2f80740ec45d157e9a90410b293194d41731ce4b"): true, - common.HexToHash("0x2345d4ec9f3f562beb154035d5dade40f5c96a7c4376128cfc7705116fe01efb"): true, - common.HexToHash("0xc00d499a78279479a19f447ac3f331d5f838193f8d311d470c3fb1571df34105"): true, - common.HexToHash("0xc3920ef98d68c2826943a04da13a780e9d2be2dbc31cb3bd44db3fd3de0bc055"): true, - common.HexToHash("0xc07203be6e5305ba4f10af8bdf93ec03b883100c095dd49bc9e0d9b467977996"): true, - common.HexToHash("0xfb87372c460b7ea139bb697cf8a04d2aa892b8e815199e8aae53277c5960a1d0"): true, - common.HexToHash("0x14d158ac1fbf92b2a0db1a531beefb8b2395cc614f9fc53aa942bdc0b1873022"): true, - common.HexToHash("0xc7fa3bdbf85e5b80b2d5a594b6371b7f4bd6eff5486ce7ed8d4492734adda37f"): true, - common.HexToHash("0x7fde76c1552f117f714e2052cdadb819a0ba90e5c05d0bee47e2cae6186b1c7d"): true, - common.HexToHash("0x4640c560956c483853b4b2500d58513a36c26061f227a690e283a89681b42c57"): true, - common.HexToHash("0xbef9167f85463641f67ecf39120e45705b2e3df9164a15cfa33e08f6bda75f3b"): true, - common.HexToHash("0x398d4a283546b0468db663345cbb87540816d316a93ae7d701a0322a7783e2ff"): true, - common.HexToHash("0x5c863bf9c17d45c2b71e0b009e620808868fe2b2bfbb58ea8cc2dd4d1a80d940"): true, - common.HexToHash("0x1286758346c50277368065b1a4b8be62ec9d542384703b63e29943afef9f8165"): true, - common.HexToHash("0x215ac97d2243a980862e1b7bf9232203fa23b8078971a72794e593965d1f6ac7"): true, - common.HexToHash("0x1156c2ea52f456e126964d7974a8749657c6573a55284b2d8764582f2f5a5756"): true, - common.HexToHash("0xc02b0576e251e254134bc247cf5f065102dcee9864579dd83039d4c42d937e00"): true, - common.HexToHash("0x57787068a7ded5454b4a8fda9c37a77bf5a30937e7284d6b5b8dfaaec957eb1c"): true, - common.HexToHash("0xa0ac653d8b7b4a8c0c7bac5afa9d563961fac3dab2f899ec27c76adc325ab956"): true, - common.HexToHash("0xff40b1c2c58d2eb9f62f92728c0ad843656a7bbec9ab418cb9e68b639ffc78a4"): true, - common.HexToHash("0x8d56937e96d39b825876f70d6b74c9bbf53503ab4bef4d5898e05b6c6cf093c2"): true, - common.HexToHash("0x1a01e2fe12be68a15695ab0b3704cabfe88b1d48471cc68d0149e387bbd913ab"): true, - common.HexToHash("0xd592f67b5d3128d39b7b4fdc27b700c62d8d80f19709c1277c371308da59c4a8"): true, - common.HexToHash("0x3973abc43b177031d860ea27e3717d0120261a5aa8ceb7896f027704864781f3"): true, - common.HexToHash("0x729f3abc1eadbca979b44e276c70006248256d623daeb08254ecfb5e9b8b7294"): true, - common.HexToHash("0xaeccc5120a3ffd326b1366853c8f28f619c8d928b5e19ea44e27f412814c61f7"): true, - common.HexToHash("0xf7cbdf93723a9c4539790a65df641af0242d46e1e1f9ea5c80ffb673902f6ff3"): true, - common.HexToHash("0x8de876f26b4645ca6c782813ceb7b594b95baa8c856b61a1628610e90c106617"): true, - common.HexToHash("0xd864a82e52431066d1ce21931a6628d2060d40abad14077f6ab01a50beb61895"): true, - common.HexToHash("0x718d3f9fb54acdc006fae5ea37ed4917f389e1ab8c0e96621995a3d1d72b802c"): true, - common.HexToHash("0xc3a211b1c396c13ad0c5418df64a4755385f77d30e805062fe747e79b93f20cb"): true, - common.HexToHash("0xfef93fec936ad8d0c38cf49370a9e73add6c1c308bd6c10f3b1389d389ec274b"): true, - common.HexToHash("0xb6f466e1212f7abb95aba852f12c1133c2dc8a22d2008fea3d4d51f7253578c3"): true, - common.HexToHash("0x550009c94f70498549551554bc3dd522f707447d3c59dcd102e666de961d63f3"): true, - common.HexToHash("0xefa94ce544b44a0d594f01743a260f9e39686a2757d90d8b222cde512aa42038"): true, - common.HexToHash("0x998b1f850ffbd71989ccf6e67e1ba78388b4b4bf852cee8b8a8ccff6fb9ddaed"): true, - common.HexToHash("0x68e9d70c276e0c1b1838fa324f8376845d57073e080b0e49e549c18d2322abda"): true, - common.HexToHash("0x07082abd1fd686025087c8747698582c5c09794e23dbdd24e786866a7a00d5cc"): true, - common.HexToHash("0xefee4b8ce0ff24e79de268d6d4e2ca60bfc340ae4e3fbd63069bd0a08cad273b"): true, - common.HexToHash("0xce41a56c9943958fe4b0f118f3f510f592c6c7e4a9378dafb13019644fc1723b"): true, - common.HexToHash("0xd3835d8e384b0857046bcc464ffe77c1311ae08d5d4920fa82d324034e8fe5e9"): true, - common.HexToHash("0xe840817be0e558fffc28dbe7ccbd617afb170916c9371947a4ce1078b23656e0"): true, - common.HexToHash("0x202f2854f915410abd97b3819cd2574f885505f5871374eac284ad30faf778de"): true, - common.HexToHash("0x480b045b3e52e16fc15123644479f498cb320fcbb17e30ced0d8248bbf2db332"): true, - common.HexToHash("0xc7c0d4864bb2549646eee0bbf6effc3ed18c9e2b651dfc93fcd3ddbfa2f00a72"): true, - common.HexToHash("0x0164c2231312a024a5fa31c53198d6a4268f7fad64bb2d4b940da2d09cf99f3b"): true, - common.HexToHash("0x6ffd881bfea0151ce51360a707efdff12443638cc72735df90cbb73983943b4f"): true, - common.HexToHash("0xf5d4af92db25dd6f6ba06e8e9ae82ad048be6ac945dac4a9fb6a154c27516f0f"): true, - common.HexToHash("0x9741eaff16e1580e303fe0d58dbd99aa3673750277fb10989e37cbf96b83f13c"): true, - common.HexToHash("0xfe9541774260ba07621f09a0cb9cdf5cf0c736b5dc6eafccc704a2ff30e0af22"): true, - common.HexToHash("0x4e7282b1f7bd9347c6392d9f9500d2e35474d6ea6aaf34618179d3f261a297be"): true, - common.HexToHash("0x238c997d511c275567949889cffece4467b2f74c61728da55b84b8b2efa6554b"): true, - common.HexToHash("0xfb22ca0069fac62548734de3e196e7094b8118feffeb86276ed4736e6ef24f2a"): true, - common.HexToHash("0x4f5f6314c73d562e355cc86572d47ff7c7484476afb08732da9060f808372e4c"): true, - common.HexToHash("0x2716b0ef1518c18c197fe35f5b2933760b0731b71295f369fa09e95d5cfdf127"): true, - common.HexToHash("0x853beac1c1272e0e53ffca57a9cba7ee96a3afaceb171f05aa054faba1acf623"): true, - common.HexToHash("0xd5c71158c0ead7f7b95ed4b4f799a76ef4782cc734856f6fbc20f0602792da16"): true, - common.HexToHash("0xe387f3a98299c968f00c9f88cc5841bfb4c9dfc59efb2f6874164de28536b52f"): true, - common.HexToHash("0x1444c88e8c9f67ee0690d0f94d75304546b594070915655e43e1c91dbbccb741"): true, - common.HexToHash("0x216f731920a77db10c10ac35891a2199abee3b1a663b33c1ffff8419315811fc"): true, - common.HexToHash("0x4f2ca5af4a683ed489ddef5a7f34a35a07dec32e33bf6287abf1f3b01ca91893"): true, - common.HexToHash("0x7f9def093b064b46d2633518a1b10bfb6da72d487637130d9edd9b1a8e56b501"): true, - common.HexToHash("0x8f122ffe8727300074f6299eebdd3fcccdadafbf872e9265768b85911e39e66c"): true, - common.HexToHash("0xac0878717f9e9b3863c5c6072020fbe5ac4589afd5aa8df919dd4a463bb35ba7"): true, - common.HexToHash("0x8c2cbedede5cd93497ebfae436ace89cf47050a993fb27d44bc21dcc9c1564a5"): true, - common.HexToHash("0x391ea233ac77085d53d167b8712a8e9f8c18069a9e7082380a159f0ab841d40e"): true, - common.HexToHash("0xe15ea3c5c0931f8e8bb01aafd2d0f29886f6dc284c2662e21be485a6340b7ff9"): true, - common.HexToHash("0x0d27662706aacc31dbb6900678aa17ecf6f2847abc9005578197a73c51d464ec"): true, - common.HexToHash("0x673c0b3eb95deb3eecefff01b03fba918f304d28a1c8cca7b819ebd842e349e2"): true, - common.HexToHash("0xe614534807d74523d09673ffb6a6635ee5f2120e1a34ca084afcd34cf6446d69"): true, - common.HexToHash("0x1a764fa85a7f416f922fd9990b12dce15f8ddc3704d2ab24b0820badd0519cf1"): true, - common.HexToHash("0x1f6d4a03cdad8d80b1d24d9391da1ac12065cb06c24a052a461094f44ec0b8c7"): true, - common.HexToHash("0xec078aad71726e4dff97bb8f57b23887c56b1f6bbffae2a86d21f4497d166b8b"): true, - common.HexToHash("0x1d6c6deaf847277a67adc2a984b3631be113816dce1e3a20a9c8320564850abc"): true, - common.HexToHash("0x4d75bb07397415d19084334c7a8ad7ee6490c524d57932f553f88366fdecab10"): true, - common.HexToHash("0x64a4a7abd0f9db032104ca8a6f87cc63b24fbb3a94ec5379f5e6a375afb5a495"): true, - common.HexToHash("0x2f8f241bbb7df8ab07e0d937f7ac7e4d04ce010bbe08fa8c72474352a36db3b4"): true, - common.HexToHash("0x07ddbf7bbc813fb3f4f8bd3feb0d7640c8e13fc722552e6678a411015771d063"): true, - common.HexToHash("0xbbd3daeeb96255f4a3aedee8a6f5ba6d30853ff5552b0ac2c9577701849aec99"): true, - common.HexToHash("0xd9bc25309a8828f320b86b0d24367fb1c6b35c2ea533c9823e0f858e3abeba63"): true, - common.HexToHash("0x9cb832ae83afa58e4681e394075b0af34bb063b9c5417bf1ae5359257a026db5"): true, - common.HexToHash("0x61ef71f8dc7fcfea38ec61ddd4b8ac492d42f3bec1859d3287a5f9fd6dabd6fb"): true, - common.HexToHash("0xa23a3360bb65c3e6a153d35678afe2b20f551bc1d7a763ef27082c434682670d"): true, - common.HexToHash("0x672fb77da0fd076668da708b22e6e1c7ab750bc47e3df78d5ad143d0576f21fe"): true, - common.HexToHash("0x439ba36a0c6ec1a1d3f0ceb42212ace719b28015f66a467989c1e7bc2dc8aa48"): true, - common.HexToHash("0x627bcc833c84abcc1e29db3098f3e6dbbcc83727003c10748318765b25143105"): true, - common.HexToHash("0x8dcb3abae76856463d978d0e074af61e970cceef744600a705c6cfcbc97e5851"): true, - common.HexToHash("0x6aa9622936ef1a32bdfe49db894eaa922ccfb44fe0755a0293b178a7bedeb3d1"): true, - common.HexToHash("0x7698e1e3a6321dafe0d67acba305661ab3728ba913f61d11cfa0e64cafa4f30f"): true, - common.HexToHash("0x21a4f12485321acb7ba29221f1df1b58fd1c4b348e4a61d03c4832389f8c687a"): true, - common.HexToHash("0x7c1f51e700fdbb9feb611b29d1bb01988d7cf9d860f93e97e89ed4bea50fc389"): true, - common.HexToHash("0x527efb77deb59ed7a90f82604553efb8a2c38ddcf2f594c0f0c5242e63a52711"): true, - common.HexToHash("0x93e020f5c458758acb846aedb2cc0db39a197ceb8cdd8fdb8806f6aaf1b639f5"): true, - common.HexToHash("0xb48712a81d27d1c012df34a422017ad33a9bb0badc3983c8be3b7eeb875ac3d9"): true, - common.HexToHash("0x06dd66e64b1262d474472b7b2b25e4b7ec87713922643146e5086c043fe0e52c"): true, - common.HexToHash("0xa6f407249bb67ca5743b3b75412c6c47729d6677020b22a2330a1f38ad7da1cb"): true, - common.HexToHash("0x358f37fe82c2ccb8aefacdd26d1b63309bf755986825bad91afd796ea06a8199"): true, - common.HexToHash("0x6ceebad9474cc61b82d72e2a77e0d489b6503cf43ca6ef91649069eb28010ebc"): true, - common.HexToHash("0x550d54e1e918219013adc28c4db84748e8d265a9f5c3b9e60c8c6f8961dcc298"): true, - common.HexToHash("0x7a862b6b42136b3137a2ecc5a69ba4d86395a42337c364412ae26f247db176b4"): true, - common.HexToHash("0xe4001d7ee2b117e3b29d3bfdb9e8d609afd62e5c442780af0a2c3ab87bd09e9d"): true, - common.HexToHash("0x496e367ecfce310d6b0501bc1e7b23bca99fedacdf664e0e4a7e8deff0e04431"): true, - common.HexToHash("0xbdda87c37ad880f9015cc107bab66dbbfb435a74f719c729e5275dbb189d76bf"): true, - common.HexToHash("0x241701f0b6b80a5e2f65b62a49f97cbd8dd552eec037ab1b52adf134eb7269a3"): true, - common.HexToHash("0xe565a5784bd5da650b01320d9687e834ea542e024f23b1d8084d3f735c421601"): true, - common.HexToHash("0x441e0062edac01e48e85d09bd7c99288900cacd3276d3968f261aec886ebc895"): true, - common.HexToHash("0x22099fab06a49138621fe0747084d628e84d2331070a1e1fa5b7eee0cd8a5ff2"): true, - common.HexToHash("0x03c2f6fdb72b89aa4db14bf8f8a46ff2a122966c51cbc17339a573de3ed4deeb"): true, - common.HexToHash("0x4fb5b54dc2952513b7f75016fe4cdb9b265bf97952727ed6e52e5d9619557370"): true, - common.HexToHash("0xad20071855d758e9b766f0fa27ffd5d430b71d4dd32bf30a6212995a2916af1d"): true, - common.HexToHash("0x36a70f8d618c729dcf855352fdb3b9981fe7863d91fbef1973c4243f965b57d6"): true, - common.HexToHash("0xb102af2a6af90e82100b773b5962f84c9188088b9d5fa7e98c50e6560cc147a1"): true, - common.HexToHash("0xfffa7a8a33f2852d77b5101a8fbb15350fcbdb84fa06a790e64a576f917d8729"): true, - common.HexToHash("0xc656d11e3273921dd348e3bc418a076c7f25cd656bd435aef9a463e53c78ce6c"): true, - common.HexToHash("0x052d34fb0e64a4de6975f2de61689be332b33db00e8060d0599e0ae9a57f1d52"): true, - common.HexToHash("0x7bc954b7f437a21d9a34ee07fab41ebd60bbcae44752c561f5e05a9b7164ba52"): true, - common.HexToHash("0xd0a39d5325a74bc144500f8001806b68993350355e4484ca1bba89c227bbbb92"): true, - common.HexToHash("0xb7c171cc07f12d6a2f451254fed35fd1805844f874553e0fc559ead3092bcd5a"): true, - common.HexToHash("0x37ac91e8c48403d6128a931679058a9201e70f6ca17f776abdf2dafd9643356f"): true, - common.HexToHash("0x218a1d1c5100e8f1fd4ebfb45b6aa2ada98cb676a420862e1dbbcc3916bdd680"): true, - common.HexToHash("0xad46a4f9ce6b07ec83a73f3680faa9cb9250fe2dfc3bbbb6017ece56fc4b05e0"): true, - common.HexToHash("0x843e64bbd6d209fa0e308bcb6269dc7c0e3c20bb09839510666bdc222352be33"): true, - common.HexToHash("0xed0756841aef3850853a9d86a504191f9c3cda3f0dfbe5b6f2a5fe325806a41b"): true, - common.HexToHash("0x89f2d89a0fa68263b47506ac7c8b51267b1ccbccd12cc318abeeaba8bd40a7b9"): true, - common.HexToHash("0x5123ff2d7adbaa1518974a7bcb9099841bfb402552503534f2f7f7bf6a968ff3"): true, - common.HexToHash("0xfaa05533b48595c8360ae944826106fe0aa414903a9f18637b153aeda1b2381f"): true, - common.HexToHash("0x5007ba4af329a8161629443a110274a177a9653d676eb4dc501f2cfba36bec17"): true, - common.HexToHash("0xf120cce07b80b4e562dc4e8869338f73a95e6c31775f4a79e3086781456a1e12"): true, - common.HexToHash("0x1109b93a201caab4724a21c9010b082d04f032f7a37f5d560704f4911e32c047"): true, - common.HexToHash("0x41432dc3ef33c78bcfa05bdfdc12f05c131d25ac8210ac1d21454d77f6ca3e27"): true, - common.HexToHash("0xbcab2cdf507117e29dae0500c6d97b567661cccd3b1e968c48fb962d6b212072"): true, - common.HexToHash("0x75cf65a43082c31155cb203d8b78fef9f397cc601e3ce9c715668a0f7a634528"): true, - common.HexToHash("0xf4abb48b68a6f974693b419ecc436a41c6596625493ecbb2520d98f63053e5a4"): true, - common.HexToHash("0xafbb23448be00eadd409e867161174db81dee4c30e6faf40ace26ee3b046538b"): true, - common.HexToHash("0xdabd2b967703987955685adf893f98b3da5f116bf58b524f86d2af2740f040dc"): true, - common.HexToHash("0x98a629405cf85acfafe9f167ac36419fd32f292a8e24864ec118933f4090695f"): true, - common.HexToHash("0xb9fd486bbc709826b5c1383d3aa5fdab278be6262f4fd4fc7ade5c1fa5144d63"): true, - common.HexToHash("0x65a8ab383a2482c0fd958b13e7a3587c1a07c911a723834ce5d044240059e3d0"): true, - common.HexToHash("0xe2fc06044a31d13e1dc72dfd10eed8e020daa66b495bf87a68c377e5d8975ca8"): true, - common.HexToHash("0x0a1346c2cacfc677a1de3dc173284e200b40541c244f8c7c6beafc7c24603034"): true, - common.HexToHash("0x872cc193296e226a9d63a0463dcd720914d7f5b654a8cab414b1102084cac5c4"): true, - common.HexToHash("0xcd3725dc892c1aa01cb9dd9ffec6f810895b23b0f1df360d747b81de0362cc0b"): true, - common.HexToHash("0x87cdbb89691d2093fdc784aa83b816bf70365e8066b03cecefc8c7f3b5568c0e"): true, - common.HexToHash("0x6ae4406f6a57579991def8b42fbba09942d9607df7e4629dff4b68f684d76774"): true, - common.HexToHash("0x964e821d967afe29b7fcceebb76fa0f89a08f29af170ddf73e0019f9b239f89f"): true, - common.HexToHash("0x080f32f7fbe030f8d1416fc06a78387e8a64d6e1b80577a622837c65cd62b167"): true, - common.HexToHash("0x7969abb0d2e685c45a182c6729dfee26a3dedd9af283a863cfc5303e0a3602f2"): true, - common.HexToHash("0x7ae50fe40e932a8833c262b1d8aca8e9384da3d33dd46e74abd1abf196d31d2a"): true, - common.HexToHash("0x2d91cb42864234fe27f7a3633ca7c2863c4b6769a9a19a466b564e96b17fda3a"): true, - common.HexToHash("0x6697dff7fbdf96816c2b251ed1bccdb4b95606efbef94a7d5ef7fb941a7b518f"): true, - common.HexToHash("0x32a72916b6cbadfe33df977130f5e51c72892d1dced2c2da54b274387eb02dc9"): true, - common.HexToHash("0x7bf9d7269e0ee1c041b8d358b40188e504310c0217d5d6b372dbf8532a136ae9"): true, - common.HexToHash("0x635e1ece7e47c2c418604ece16b44ea7e78eb3382aa4c73046d8b69807a5b925"): true, - common.HexToHash("0x3f5c7787dc6144c4276a2d1eadf0ad96aa8cd626596563a7d27ba98f0b39ca68"): true, - common.HexToHash("0x1c417da95174e3acd0ffaef95a22d7f330818a2e509c51d5f3b309b05e579944"): true, - common.HexToHash("0x2fce8d265d0682920b892373ba06667eaafbcdd300908c284e9f68b3758a3765"): true, - common.HexToHash("0xaa824bd89057494ddb011a0a86ce7c13d4eb693206b4057b8a219d41d4cca7ed"): true, - common.HexToHash("0x92208cb90f141c63cc586a72b4ae24e32471737fba2d6d7711c8facff592c44a"): true, - common.HexToHash("0x80049859c831539ca8d367463cd078374da666fe25555aacc35e8f524d770994"): true, - common.HexToHash("0x187185a70c2094a13e3a23b1c3fd9fca76785859a8e409faa3b6924994945c80"): true, - common.HexToHash("0x9b32ab2b6c27ca4250daf53a7a610d947c5a88034942168b7581cbf403820f02"): true, - common.HexToHash("0x0ac291a24477a8e665c8eab4aafd6c26fdd51fce06911511a41bbeee28d6f96d"): true, - common.HexToHash("0x4ad503cadd170be00884c0e0e435e4e52983095231714334a7d7d63ba47fc96a"): true, - common.HexToHash("0xabc7b65a6af1f5d7422ceaa635c6a0d98c0251edc9f65b0a9796005d4beb9f27"): true, - common.HexToHash("0xfb278f6844ef89d99968bb3fa9cd6a31b8d445f56b235aeea476e7fb6b741085"): true, - common.HexToHash("0x65a490df79d6f04ed3d1b9aba6fda35950927a1420c84182a9333a65df8303ba"): true, - common.HexToHash("0xb776942b9bbef3afe2044efc9a9ac01c82cd190f8c0fa3f2527011bd18847d22"): true, - common.HexToHash("0x44208cb9b62ac71c7275cb24150be1389d4acaf94d96bc8c401a0d4e611065b1"): true, - common.HexToHash("0xad94cec8c7098d5c571ef5acd813ef2dae0340218daf76416db6fd46a5cf9c73"): true, - common.HexToHash("0x6fa95229d61139d06c9fd8bde2e051fdb3d9ff4e214f13e00e1283cb802ce1fb"): true, - common.HexToHash("0xfb012d9b0f89fcaac5be1b8041fbabbd50917dff8f1dd0de5ec6e5c155ac33ea"): true, - common.HexToHash("0xe77aec41041672f9a4eaf05b02106df2be5b5565371ad84ac6380e4946ef5832"): true, - common.HexToHash("0x0a85b23c5fc790672667206752ed3372913f3f049315db81e0e77e0a5364881e"): true, - common.HexToHash("0x0778f8b967016dde46030836fbb3c96ab4321cf3447278bff55981ff8ecc4f50"): true, - common.HexToHash("0xbaba7480574764d1b3c344e12999d3071ba96b483c3d0011f5bcd168c2c43468"): true, - common.HexToHash("0x47034cf0c5dc2e6043d518fdaddb715d04f5da4c2320314ef2d31d3ad1024aa5"): true, - common.HexToHash("0x7c2d49a63e606ad32cf711f484e97f28424f3f687390d762387030da48b46f82"): true, - common.HexToHash("0x67a613bb50f485cef1930dca3f59f3e51b367290ebe0700a30d80367a2bcc1da"): true, - common.HexToHash("0x338714105f45c06abdcfaa5815e2fbb03b28c3040d411edb278959698503db19"): true, - common.HexToHash("0xd577c7d8ae69805495c132132b1f7d71e69be7cbfe978dc0ce793de30622a5fe"): true, - common.HexToHash("0xee4e2f2e332feba6fd2be00b27ab52a16f442de3f28c50cb5d9f5fa9182cef7b"): true, - common.HexToHash("0xc4b836efb903a20fa320bc7dd9a74b40631686717b28c1cde9148d31c2c6966a"): true, - common.HexToHash("0x57720494fd0188157f3ac8efdb9cd3fa3065a2f1668f4388a422704a3e1d210b"): true, - common.HexToHash("0xd165e6703af6ae172671209f602acf58545d150e3931da8f4b6829e377d6fc38"): true, - common.HexToHash("0x68f74acd1e90bee096cd064881dfaa52fb3d6c45b6752b15e21484ea4f7ba188"): true, - common.HexToHash("0x40e32032cc7f358509d52c90c3fba1da73623b822f6adb98bbf38cc143ba6e61"): true, - common.HexToHash("0x12ee728c3db1748ffb18396802f8995c997d30cb20c3d27924ae07ed24018be8"): true, - common.HexToHash("0x01852fcb5c2ef1ca1862710c3c508a27a8c2dc05cc02f6d0c4c3ce9139cc73d8"): true, - common.HexToHash("0x2138ca970b9d6478e064f8cbd7adaae31487a806b011c244b4cc2f1c5a9a2546"): true, - common.HexToHash("0xeaee525ee63b33bd50441526bfc3f65c1132ac434b3571e3684e6f97430b7803"): true, - common.HexToHash("0xbef6c14af3b741f4fbf325a7c927fafb6065d687a9a0ece19c90956038db848b"): true, - common.HexToHash("0x621cfade0ec6051af144918e1c18208670b721de1126ce8626f5913ccd54e637"): true, - common.HexToHash("0x776bdd6d8a03eb52f082f2cca127fab37b7a1d985a61283d5299584cebbba9af"): true, - common.HexToHash("0x2ea0ec2782a3eb4000af0cc6c59e64ae7ebbfae0cfc1444db571016b91afcfd0"): true, - common.HexToHash("0x13d3ebb1acbd8bb966f8580acde8654d1213c9dfd498168f3618d85675a65c7e"): true, - common.HexToHash("0xd2dd0e182b793a5826484ed787df73c3d427749721e4163525c8370adf32aa21"): true, - common.HexToHash("0x111eaa23ede75a632f659e825cde91bee4a1d7263b44e53ec1c73a5de52902a1"): true, - common.HexToHash("0x4db800a4a42f745df1f82ecb68b26f264af77f7813ce7158d24efd88abf5d53b"): true, - common.HexToHash("0xeb5ca553b5d6296154e1b3207399ef774a51835f5fd1ca94a7328eeb2144a5aa"): true, - common.HexToHash("0x935868e214a10759587fb140a8bd4e68f73a7028a55ee1fbc90a3240b57a6597"): true, - common.HexToHash("0x6db7ad19abbc84c5583127f99757eeb2f1ccfb7311cde29d1383f872635f6689"): true, - common.HexToHash("0x2aa7befec3525a138fc19ad5a2769d318c794b7e5d30ebaba87bc9725d237ff1"): true, - common.HexToHash("0x9dca456add3092da4a33d9150236ef3c98638c90fcdbb268408decd2ba3f9e2a"): true, - common.HexToHash("0xb5ae6f21c6b06e0bb46db6b024d63431beda204758fda10ef0ba044edff34b72"): true, - common.HexToHash("0xda39c5933da8243d6033ffa37b9f421a759c0bf3e5c5af02ba99d53ce6b7779c"): true, - common.HexToHash("0x73c4ae88b4b754499afa94e79b433ce4d3d9bc746febd90350554484c9c9959b"): true, - common.HexToHash("0xb9bf6f61eb87170efcd2c7a6903cb36b233b6ec9f49b9ed8fc33afe2244d5e50"): true, - common.HexToHash("0x3d361a22efb83629c17e5039cb61bf95248e8b6f23ff3edcc5cb418780fc2390"): true, - common.HexToHash("0x1ef5db2d815bedd6993e37f64e5d4430c7ccbf5f69b3b35c35646ca6b177a257"): true, - common.HexToHash("0xa8320858275e0ff2f77494b5f64b6ff2c8e767815534b96f7cbf148f43efc5ce"): true, - common.HexToHash("0x2a6c707500f2e922106853710e3e63755b75bddcf7328aeba6118d1fd6dd72f0"): true, - common.HexToHash("0xc2e19b3c585619a74116c8600addc1c38e65770a64c8c16b8b83f19545964fda"): true, - common.HexToHash("0xc61b97cf1b2faef84bd8e033abe03ee28d4c9a022db20f9ad91b0c344efc9673"): true, - common.HexToHash("0x2aa83ca94b1a2aa75d01be528eebd6fc5c651c99c2ac4ebfab7a840319e29dd3"): true, - common.HexToHash("0x38e4cb6e5d3b9543529756a7692805e4bbca407d29412d122b8b5d1176cef14e"): true, - common.HexToHash("0x375a6796700b3350d2eb25047a57c9b404fd33fbb7c2868d2bfcebae2783d8ad"): true, - common.HexToHash("0x65a6adae51fbb0f09d83273f48cb3a078fa666bfa348304f448139273b3c27b6"): true, - common.HexToHash("0x3319974dc0bc4ae39dc7bd212c610ee188ef73d25cc56d78423a7f3a31881538"): true, - common.HexToHash("0x1d0eb00e0bb95e101a137c85c6674119a6eecae0396309a841c6b6e149c95011"): true, - common.HexToHash("0x5dea1e052b448597d393cf81f0736fe6fa7f05ea296c1c7690f0c552e2c8a1fc"): true, - common.HexToHash("0xccc20eb1107cfcdba0434813a06d9b36caa42df885718fdb901040b9c9458bf0"): true, - common.HexToHash("0x39339174027dcce2e1c4dca60ed3ac69710716923130749dd45f5c2ded85c3c3"): true, - common.HexToHash("0x2fc7d5b254f1ca15d8bb9e8a77f56191621a7b12235e7f50ec08a802d0278ae4"): true, - common.HexToHash("0x33af0d05823ebb0065d4bfeb155c9fe2591d82fefd7c566289db63b0ddf94ef1"): true, - common.HexToHash("0xde4e31b04914b5852c1d015a33c6ac81c0d79ad97f058e9854b8c9657830c143"): true, - common.HexToHash("0x92519a655b4b8a93d91ede1b592c06cd033454018f1df4c954423acdb0afe758"): true, - common.HexToHash("0x263b822ecaafabe71a780f15ed38e23f62cb97b700b41f0f2d0c0d8bc2668d77"): true, - common.HexToHash("0x4def05da417295df7e8d792d4864bd1cd63dfdccfb3f3a2c23b25291b7248542"): true, - common.HexToHash("0x3fe01c1fa8545c1577a6da7eb8fe60f5a8877caf5701317852e34cfc8ea8514f"): true, - common.HexToHash("0x05c4b7a1bcd804f5ff103aee90bafc61bd66435d2764d50d93b2cd84637407f8"): true, - common.HexToHash("0x52582b8e5e2cd3b22ad7c59c1e40e6da5b1ef284a722f81eeea6ba123b75fc94"): true, - common.HexToHash("0x908186e1d9b4ac9a1c4eeccb43e59d7c49b0f18a290e08284dc663b20b4bd00f"): true, - common.HexToHash("0x36f55f73bb6581e129b1c30f8980d0e9eebf33f570bb03918d8ddca125a9ef9d"): true, - common.HexToHash("0x6b82a524b04d7c0976536cd6a70fd195e72a28ef9d5bcc3ded305714f828255c"): true, - common.HexToHash("0x5da6f21acb855f7498fca77ed948574aa07f7c29234971606efefaaea41ffd36"): true, - common.HexToHash("0x2f46e85a1c13bf6faf470cdab29353f5589b4de3e212cf551c4ececfc2b6019d"): true, - common.HexToHash("0xc065696f94bfb502ae12346cc51acb1c1d2761034a5ec507772270d5d6d0d754"): true, - common.HexToHash("0x71b02011090fd02f15a88fdf4bba0a5316218f3d1785a4eb39269ca46598500c"): true, - common.HexToHash("0x683cc80151407eb815730116076c22a735cb5498c578ecd029391512f8afde8f"): true, - common.HexToHash("0xcdbf1bc7ccdce30e028ddfe6b792692431c0efc9bcaa48fe208bc01452c75ded"): true, - common.HexToHash("0x2161a2fda3c176ff5a670a362c0d8f53c689ed0f79e22ba4b3456575dc9c12e8"): true, - common.HexToHash("0x379ef8846cb03d224f074f3791e1da7dffb04df6b7856db979a6147a33815993"): true, - common.HexToHash("0xcb299bd55304af3ec14fb4b5c9c012823393766db4435fc1788765798fe4db91"): true, - common.HexToHash("0x519868f47aa99dd7c054521330e9476bbf39fa0c5f431e75815aebb7f722dc19"): true, - common.HexToHash("0xf906366dc4d92d2651db3e3a243d3d377dd2c0b180551644af2eaf44bec4d4b9"): true, - common.HexToHash("0x0d32c4b438224e50a6baa1bd78631a52168354966aba0c8d03ec682edb2b7b92"): true, - common.HexToHash("0xeff64cd55a8c72a69850fe915cc9715ad1e9047fce72ae2b40e4e6d27bfd6fb7"): true, - common.HexToHash("0x4fd84ac9681ae5582a2868420be968da36214350e91ed49b778b90412fbf0f15"): true, - common.HexToHash("0x6b6fdd41b6d1bdd0ce748a3603ea23f5a100357a6a4e7a3254db84793052bc1e"): true, - common.HexToHash("0x76594ba712a4de2c2aa110aadc5db5bbfeac2b9e77d66e7e7d80a94070d5b484"): true, - common.HexToHash("0x920e48e4bcc0c5aa5025809fd24fe99544d70d00f499c0f0d577e517cf60e919"): true, - common.HexToHash("0xaf7327ee08f551e56724f0013a5408c1a3a212be2bf1308ce11a5d8dd2d5dfbf"): true, - common.HexToHash("0x324e6909f1e59e5c84b987841e3254f5eafac50ddfec58dc6ae62f09890af974"): true, - common.HexToHash("0x94ef3424f97d7e7a72dda9aca8c3bbb4080e4937e971145325ce29b98cf41ae3"): true, - common.HexToHash("0xf97c70fec3f992b27112ce2ad5e40805cc8dd11c86d2d620c3f92f819918e9d1"): true, - common.HexToHash("0x73010a65be4e723276d652a6ec453f20ab7d2593193a10a255901fde00c3ccf1"): true, - common.HexToHash("0x132876c968259dcc36f7f70998bef3215c1badb6cd1cbe129bb96340929a30f5"): true, - common.HexToHash("0xa63b7fd0cbb87c1eb1716fc50d2e82256940b52ac8245db76cdf264aaba3adff"): true, - common.HexToHash("0x8db8f37585ac19718603e6a1c3076d7f902ece0bfecd57dfde17ebac46c5c08f"): true, - common.HexToHash("0xace176047826d43a0710960755b60dc465848004c950b34346b26a259421a04a"): true, - common.HexToHash("0x4af21138e1f44a89e624dffd8f32cf001317ef297bc3cefca63c998bd30c319c"): true, - common.HexToHash("0xe7cc773c1f2102bfb12d716cd834e2ac6a57daa418ed970b8e50475e2d09ca77"): true, - common.HexToHash("0x20a3cc9423ac468bee18723b0a45c6bf303573723da65d00f5340840bff620a1"): true, - common.HexToHash("0x6660954b7329dac9a49eb92f99f96a5a9087bf6b167f23b5677373b648eed4f5"): true, - common.HexToHash("0x04d796d4d27555b752a1ea381c9f7fb43bfc31b9e679f8cabfef34a2b1e83cb1"): true, - common.HexToHash("0xfdd26065efc5839bac7450c3c48f596206eb82a565cd7da9e9b037d263b2b3c9"): true, - common.HexToHash("0x329a50d9e709b020f6f9ae1621534e048bab50198be4cd954a0a914a04ba7776"): true, - common.HexToHash("0x9540ea7bae114e554641f035d3d2c2ee54757d284191b2a2007c9f5b3ca8b59d"): true, - common.HexToHash("0x6579bd8f0ad39273dd12f62fb6659790f805f920f7713f091739066313d53218"): true, - common.HexToHash("0x1f0572ce90f6b231e132b39d933bc5e680e898956fde0d9e7d14b0d58aff4f6a"): true, - common.HexToHash("0x90afc7be38e46f3f474bfcaf24eb17f5796f6db04c6256e74dd872f10549eeba"): true, - common.HexToHash("0xdda82a3dd81dcc89878c87c14f4fdc6d898f66e135dcf20417db584cd0e55fb3"): true, - common.HexToHash("0x9bdbb329615a2b58624bacae75f749bf7893412b4939d5319e7591402fc6732a"): true, - common.HexToHash("0x4bd3b4c2b323d783927712d9ceccb547f942278877caa6d812f989e70393db5f"): true, - common.HexToHash("0x41476508e488f18d2a6d3d79e582d6122be9d3ecc0e10e64249f4d384f558f19"): true, - common.HexToHash("0x0819d8be3305bfeb07adeb6871a10afd1b9779c965f4b9cccd98527f04047b0e"): true, - common.HexToHash("0x378a36b8220067d8e63b7c3dcdb19d13d8075f75f0df096a6d6d292db45bc465"): true, - common.HexToHash("0xc007268ea20758d8000a0e8b6a38be244335768dcfef1a51c2bb65cbf5744fd1"): true, - common.HexToHash("0xf897056feaff27f7ce5329954d2e7c7b5e088d9ac9d07f84f85de67ed49b911c"): true, - common.HexToHash("0x8a79b48c45dbfbb7c75b151a1779c4f5d794f0d8c0e1402f167efeb8d3e09dbb"): true, - common.HexToHash("0xdf139305edca840d4ecb8665ad8d24d8ed9b5d4aa67d1b4292fd444bcde2c1d9"): true, - common.HexToHash("0x5c494ad150f21387522ab3880476304c8b812800113515dc05c7bc43e1a11588"): true, - common.HexToHash("0xd270f52626ebe648b713d24252ef896fb6db7a8e32e068a8393556b9dec96a63"): true, - common.HexToHash("0x0a80955559db7ea006eecbc1ec39d1ca04111aeed4542e1e5fa522ce215b5658"): true, - common.HexToHash("0x7c1ba3743811cf39e3cac961d4811f020cab2aa07abb81de7a783ee693cc8491"): true, - common.HexToHash("0xe9c71cbb4398bbe6cf9e5b6bf245391c9ae65a4d25a23b7119212e5dd105fa86"): true, - common.HexToHash("0xc67e88a4a0273032e55f771aa0248d93c6aedda5c8def19a2b9c5cab6286985c"): true, - common.HexToHash("0x99021a841e43bd599e87c089cf851bc295823a8772dd7f1e18558c0ce4b6908f"): true, - common.HexToHash("0x04e8fe6a14792d756b8ae98cb23a458171c55fc28b3d02e7f7dd14dbe467b672"): true, - common.HexToHash("0x02e687972e19ac17120806b5feb2be8e6b8a5e626c65ae6a902efd09123cf7d6"): true, - common.HexToHash("0x2d84e956eee66f5fcff860784233e9780a1a30b600c49130a29539cd3cb1bb4f"): true, - common.HexToHash("0x9ecbb0cc5e4e51b8374397d7e3d294956fc23913e02ce21f0c002806df90e283"): true, - common.HexToHash("0xfa1519a44d341db8144b8e9c583b716c094e88a0cc6cf2ec13af2624a5572f68"): true, - common.HexToHash("0x0709de6541474ec7db7c16beccf0eb92692777551dc54f83a6db7292d29546f2"): true, - common.HexToHash("0x8f48009730988649fb94e911a52ed28b37162231e51800cf450b6e45c415a453"): true, - common.HexToHash("0xa475fa1b2301d3197e2da0b6c4a81a6b230bb4e92b2be5e5873a785be09fe87f"): true, - common.HexToHash("0xaf9250d6e2025051aadb4c510b2cde7e2955bd4330f16bfcec8326d174efd023"): true, - common.HexToHash("0xd5c4e2fa7bf356f2ca2b73b712876274d4593dbf47bd96cd3f7ecdc6f91a3ac4"): true, - common.HexToHash("0x18437cd35835103739374625cfd99708d309c27b4904caf81868354bbf3082e1"): true, - common.HexToHash("0x44f7d61b1d14c9d4d467ffb6c6d72951f8fa930d8fd0051d1acef46827ae428c"): true, - common.HexToHash("0xaf88ac115e2465dcd317bd4e7e509c149d2dae8c86af4915d6bf2cd99fbe18b6"): true, - common.HexToHash("0xaa0149c513fcc624a29c945a71bbe8ae3490ff22b9aa3f0b27e281f70aaa71c4"): true, - common.HexToHash("0x70bb736ffd200bde946596f973fc833abc61cd306d66130785fb3951bfc11183"): true, - common.HexToHash("0x0f50bc870aa4d15893dcd125d9e4e89d5b5a8dbe7bb59ae18eb6eba264ee7035"): true, - common.HexToHash("0x714eba00868dbbcbc78d1a96968b167fecfe32b1e3924aa66c83d3a44e318a60"): true, - common.HexToHash("0x0ec019e31c02c02174f43c7053036cea48aa89d59c2c1dbe47afb0c3deb421b5"): true, - common.HexToHash("0x8fa03767c27d3bddb71eb6cc3bdbd256554dc03f304c49cdd6427b3d7812a0f1"): true, - common.HexToHash("0x7f904a09ab23e33facf8f3f9aa1dcfaed65611cec480b15545854b6fb18d3702"): true, - common.HexToHash("0x0e96bbdc348d2c75e5248d97869f3a2eb44ab4f56096c935e3dc0746dcb13e70"): true, - common.HexToHash("0x1b0e95b92dd39529ad18c0291c1d9be01d5e50a407b8a18ac20ad51acfa387dc"): true, - common.HexToHash("0xa2a114be1b1f19252292d4a7650e31a3bf8e24be55989920c2ca221979d2b9fc"): true, - common.HexToHash("0x8f49ce7f567022a43d967681680aa7dbbafb0abbcdf69e112cede4f410e6d2c2"): true, - common.HexToHash("0xb42c559a5d79d2374fad671384c7fb5ed199b0fdff558e14452557accac82c1c"): true, - common.HexToHash("0x4e0597c25a4cccc60c5a95d87e62b88c55ddc234cadf809a04f56456754c4c9b"): true, - common.HexToHash("0xf455c71926a3be85785243c2e095381dcf4b5435dd60737b2bfd39725d3ddc66"): true, - common.HexToHash("0xc1087267dfad1097624c905b655e24bcb1dd1d5b673629655725f6caccd4a9d9"): true, - common.HexToHash("0x5d88d4cb02913d8ecf17a64689bf2bd97fd68b8f23a584fa9454fd1a2fd50f53"): true, - common.HexToHash("0x141d03aef998d9ab58ad25b6d5efa0e8571acf072eb61684cce755c7d0b153a2"): true, - common.HexToHash("0x2dc94b86dbe0e528f299fe352ef72d154b2c6b0be08276c27bc590ed6347e438"): true, - common.HexToHash("0x152104d93b457021d914b269daab2f7b6e6ad57509ad3de2365c006bca323428"): true, - common.HexToHash("0xb2170f35864653a894a086b2695fcec4915065422dc651d5e9025cbd9002fef6"): true, - common.HexToHash("0xfe17a92ddbf8eccb10b4320d07f294b4d102545f6e8122f1ca69c136b2ff572d"): true, - common.HexToHash("0x9c22053e87afbe1c686371e16226ee989b20bfa40edf87e0bc302e25c653e2cd"): true, - common.HexToHash("0x2dabf625db9184b5443ddb3afa8360b588f70489d6d3ecb605bffdf9ba7587b0"): true, - common.HexToHash("0xa7dba7c9866fbd0f8ccdc2ac0e4ae64a05fc9ef9ba68be592934573629c6b94c"): true, - common.HexToHash("0x4be51d69813b2f10a754927c43980745324b85455422b37ed20adc7e6d589873"): true, - common.HexToHash("0xa38f3ad40c9091c13aa39a0f5d17838950346d6db7b3739167aeb97b5b21f787"): true, - common.HexToHash("0x4a7a81eb58918b51b1ee751eac855fb6592061e74f5c5e8bb80d0a28ad08bbf1"): true, - common.HexToHash("0xbf18c671c3017fe2564b40cf9aacc8fb1f9a3b577b6bb29e7cbfe28caa50363d"): true, - common.HexToHash("0x8c0b3b6e9f4e6b7560757c6221e40fc08fd5df6319bd23f38035fee0b57a2bcb"): true, - common.HexToHash("0x1941ef6e0184f399febe5f5c27f96b7b44b949e15a944434c56966e86cae6997"): true, - common.HexToHash("0xbcac44d1767e8378f0c7dce850520a9e8b9e7b1c4c42b12d5431f841e8d3707f"): true, - common.HexToHash("0x6f56441d16799792d08f774e8f13e225c98c008a0fa6b6f1a601dd0e3d12ab11"): true, - common.HexToHash("0xd7f8e9f49675642e8265b45fdf12b18f473fa8cb2613088723b7b0342c9ad6de"): true, - common.HexToHash("0x6c78d0c61b7c5595594bd95264114b6d75931668459fbfdbfaa2bee36951cd69"): true, - common.HexToHash("0xf72a1ef487217354ce3ed6763d47a70db1ccf39606ddbaea84b94723dd68937d"): true, - common.HexToHash("0x2f9d31affa2b62c4e145aa7914f120e7a730b4f7226d048f364751dff794a1ca"): true, - common.HexToHash("0xf63be13b50eb711bcea5356e78e0658472c1e0ba4bc1070dbbbb4ec39f42d8e3"): true, - common.HexToHash("0xd0252dc75cc0f87e7bb8ef4a792f80c7fdfffcd356e9bd00a5ecf6c7d89f3f4b"): true, - common.HexToHash("0x767f5276b3e65a742c26b2db14d8daf34b50ef5f73b8f3b22702b787573fea94"): true, - common.HexToHash("0x8fed9a4e8c4f511794fad61c0d4d6bd192e1e1236aad2f9a9f5ad5612f053339"): true, - common.HexToHash("0xf496e1d9a75a73ed59c992cc7fb02a7391552dfb37328976b3b65404a57b1f0e"): true, - common.HexToHash("0xc9d4a422e5615219de9625f6c93bb02d761311d3f6b902bbfbc50d4fe9008d95"): true, - common.HexToHash("0x95f0637fbfd1ebc33358803b7ceb31dbfae79e9fb42f7b79126e535a99ad0864"): true, - common.HexToHash("0x0ca41561b475fe1489ef5bf4f4c1ce41f83fcb846ae89ed091abca444efbdd3c"): true, - common.HexToHash("0xa8a175486f5473cdf71b3062cdf2392c8056346ac108d8ddf17cccfadce90171"): true, - common.HexToHash("0xbf4d15bd2be946337580081046294f2ec0d5b7f7742ae110b48560772932007e"): true, - common.HexToHash("0x7ae7dc3146e3e5ac5b738c2cc23a0fcdb272857ec98990138f631d429bd1c10d"): true, - common.HexToHash("0xa37071c292580a29b841673e5c7ae17d70325f46e189123575d7d61ed46f1530"): true, - common.HexToHash("0xb66f2700ec1a633b63b1e73916b7a9d636737958dadbe05cac8ee6b534f1c2f7"): true, - common.HexToHash("0xf645964ef20d3ef805cbebecc5ba93a783f68c27bbde2e67e4da4357e452a0d4"): true, - common.HexToHash("0x2237bd81f9e417ee2acbcc511fa8c7bafeb796f8678287cf6433517782722f56"): true, - common.HexToHash("0xb6aeacaf6ce291dd2236b57110e61eddaf917bfba17fadd0b6f042b110592a9e"): true, - common.HexToHash("0xc8a2fe36186333753b09e9d673bc95ece9da81cf3877c4063967388d1626a537"): true, - common.HexToHash("0x236c2233f20d3e3b329ee048e077c94aa935bcacbd70f66182e3aad782c6f3dc"): true, - common.HexToHash("0xf21d46f2bbba64ea47dbea8fa145098360e0982013522c5ded753a412dd340bc"): true, - common.HexToHash("0x76ea80caa75f500ffd48e07925f470f62610d7d48e138736c12a3e430471a5b6"): true, - common.HexToHash("0x99260222f48cb3bd556d5d46fae19e486be1cc371eb2c909e63e931311d3567a"): true, - common.HexToHash("0x73b6f18fcc4bfe6930965396035a8201bc9c350b0f9fd5e13b016823c21e2f63"): true, - common.HexToHash("0x0720f1b621bd0af931169b9fe6b816e7d1f92b3d9ff72fc66251d163ec7acaa5"): true, - common.HexToHash("0x0a0239449da56134e61f578fa0e75f017ffee3802780915d9d8b0a146fbe3aed"): true, - common.HexToHash("0xb18ebbfc0cb685744c96934ee013880126b4123a591ff17b51f25b16cc731ec2"): true, - common.HexToHash("0x69cb1f04cf70b8168b81ea35617bb52f960eb9cffee8616cf5c87a46b83f05fe"): true, - common.HexToHash("0xab1cae5752ebbcd1ccd9d50bbfe573ad2d4cee2f5677f72a3a6c26e411bdab29"): true, - common.HexToHash("0xc98101b31bb6318efb5e259eecd9efb5d46a65b64ed8ad02684b46a5d169fe14"): true, - common.HexToHash("0xfe45e582ebf56fc0fb9a30b866f7821f6dc2c0f3809610424919ed477469dce5"): true, - common.HexToHash("0x850fb4fcb1c4eb1751bf8bae419732c8c7ac4272718c094af181a7b748419401"): true, - common.HexToHash("0x72b46a829e420d358faeef57f73e4986aa36e244bf33e1a766392ec838786392"): true, - common.HexToHash("0xb8408e13e11f4a4c02fc9fbfde65123cc19149e29b70713968ab6ce116cba653"): true, - common.HexToHash("0x4c2d7b44e997732c71296b87125044eae2bad3cd09f0ef7e8bb9eef87f779637"): true, - common.HexToHash("0x1ace21d7a3f7b3060261ed75f7d234d3fd66171411b6fecb05d6f4373857adce"): true, - common.HexToHash("0x9457e350ffd0ac8ea148089b37c9586ccd63284897795bbfc10efc381e416371"): true, - common.HexToHash("0x367fea4c7067e37dea3c5d27406872dd17e4e63040b12ef24ea1e9af866c17da"): true, - common.HexToHash("0xc6539dff3fa8e2fab045b538a9ca5b6b0cb1023ca58c7218a8852cc20ee67c46"): true, - common.HexToHash("0xbbab7d38146306af1e1b1f7a8e6c9368e75f9133a6ac7b88d02a296f90cd865e"): true, - common.HexToHash("0x54fe9336e2ba28b482aa3b78d2a9deedac82f1b25e4af5f5a8b769dc13693aba"): true, - common.HexToHash("0xd0d1777885ee8b011c7c942353efc5cf7bc02e0a42f63c4257e0e8fac63396b5"): true, - common.HexToHash("0x77fcb73a880654dd68b91af8b24dff9e7c28be7a19e7ff82de34f6de2f2a93b5"): true, - common.HexToHash("0xbe6a4feece860acd4bab390d2accb58fec2c03b37a798220017182e81a903f67"): true, - common.HexToHash("0xb5118e79d4775200c60de48978f20266f97fdcbb33c3234d08458d2e2e724813"): true, - common.HexToHash("0xab575b85d3f0716b3fde4e4277ff5244ae245dfd07e05622735e7486a5c61e61"): true, - common.HexToHash("0x0d531f7ed4af9c55edf38af1e7429514a45b5f16e8235829bce2ea65131673b9"): true, - common.HexToHash("0x6e76f60befb34caeabd5566751e93e46874d3694f9bc33b4df815b889c0297c2"): true, - common.HexToHash("0xffdda7dbd2f5807112f8b3988c0b00c747050d31660920886f39bae1ea5677ba"): true, - common.HexToHash("0x113b641a382cf80ca9b3dc2b072a8056d376b46d833589925531fd4e9f100b25"): true, - common.HexToHash("0x2ac59016a2937b12a8547f9ff0c02fc4a0d8f205dbb708ccb0f8e5d4745b7c34"): true, - common.HexToHash("0x19828b0320cc981ecdec521b0c7c72e6730046aaa6226e0e83128d3c51f1881f"): true, - common.HexToHash("0x8e6afeb54901d4349724a43eef7f2f20ea785ecd1b44d125a5ec14936ca276e1"): true, - common.HexToHash("0xe5d8a43a4e62c17d1571028813f301e093e79c857bce0fadb0ab52997bd1af60"): true, - common.HexToHash("0x798751d90ff2b90c29ce30757ffcb6ff11fe3acef5bb580cf71750edc90be2ff"): true, - common.HexToHash("0x33bf9bca4c6dcff9b17e35f9c8222870cb8e9da1219d2df8363ff7ef258c6b93"): true, - common.HexToHash("0x55a7c1c776cd43cd7e0a87a63ad575bc357323686b334a3852ca4a2761b36665"): true, - common.HexToHash("0x0acf57138ce7c71d026d6e476cdccb230060f846be59c2ee323ff076582d2a3d"): true, - common.HexToHash("0x0c8d1f7da83ca5bc0abe1199fadab638008301debe142a27d14cdc1f54d2a3e2"): true, - common.HexToHash("0xffd209bd5681e7e74b99e47b73953b19154db764714bfa4df9590e8875e07175"): true, - common.HexToHash("0x21c70f56a2bea486b26d8565285e8b8a6e85d2a16cb5a0e57c95dfaee048e5b3"): true, - common.HexToHash("0xade1bb9ffa5d52d1e12d9ddf003235e8983809639d2462dc373c0d920efe634b"): true, - common.HexToHash("0x7da2f3e0697b60d693366f882806d32ec35af84f8c2c8bc89ece7774557202df"): true, - common.HexToHash("0xa5650fb960e886879216da22eb9ea63177aa43aa4d20e198ca472da8f5e4a32e"): true, - common.HexToHash("0x7e6f46506189270c2530347adfe2456491cb07cb07bc4ac511f5c545ad6724fa"): true, - common.HexToHash("0x05eaebf5429604bf2f0b92a0d7d0636a8173611988ef75129d6de22ce583a8ad"): true, - common.HexToHash("0x18403c144f4380bb832711050d53bb9d0b43b830946bf2cf074174ea122c1fd6"): true, - common.HexToHash("0x6f762831d67932f41005194bfff0b49ffa4839f27d9e55d2f68a6bebb4148be1"): true, - common.HexToHash("0x24fa2624b6a73fbbd3269f609084e11f02a9a0565ea1cfc955dd08bbf4e93e8f"): true, - common.HexToHash("0xfacb2c4eaca0e6b6bdf46bc2fb5a30941b24261539f6d1aaad6af48e7e32eb99"): true, - common.HexToHash("0x3e80095383eab9070b2da41bc76958c859cf886ca2cef3b69b38634ef60e643c"): true, - common.HexToHash("0x477967803c32f9d8810416166a0d0c70ac96f29baf249538c833d1e15530ae34"): true, - common.HexToHash("0x0927b06be7294189397752bfdd19d7fdca7d9fc50bae4a7dc4acf0aa0d7230f2"): true, - common.HexToHash("0xa0dd365ef949e23081af76677063b44fe10525e5212c7bbe7e263f3b7603a615"): true, - common.HexToHash("0xa8c5693a8d9c5c32d9fd133ee29fd9436cc21febce8f7883d3f5a403cdf5a521"): true, - common.HexToHash("0xed20dc09ee1b78f068d2fb2fd007a42886dec930677ec4bd31bc02e827cab788"): true, - common.HexToHash("0x45eee8aa5889c70fc20621b016d4ea186cd59c3b683a6a47cf5de4f455436cea"): true, - common.HexToHash("0x92c379415f9d010ba059b36ac210ead9dc42f3dda5f890bcfbc4e3714f93af3e"): true, - common.HexToHash("0xa3e2ce9ac33f84cc78c640ce960bb62b7fe1b885013d0ae634c8012842ce7423"): true, - common.HexToHash("0x35d8be25d67b833356e6db1c3e33487129e10a12635db5bf13373c875e4cd9b3"): true, - common.HexToHash("0x19b10401c0e9dbf8ad02031358150815f02be90f3083c67b604d9df9aca03085"): true, - common.HexToHash("0x88cbcabd5b65606416e048856b8d7feb997bb93f525e474d3cceeb300d74c303"): true, - common.HexToHash("0x7d866fbf1ac745d16bd8431993d2c8bbcd32fd7bf3a01459f621fd2d49470cc9"): true, - common.HexToHash("0xb2ab4152f2bb2d4dc7af2fc11b89583b2c5667030e576b6497a2320ec035e5ea"): true, - common.HexToHash("0xb5d8a759c194eade592e518191a65272de336c84f7828815b2009f430aa0d83c"): true, - common.HexToHash("0x5bf47b95ceb2890240f5e9727f220fffdca54bd3c74a70309d08e30840fc8294"): true, - common.HexToHash("0x2cc20eeeeb24da41fb117a737c9f9e0d9de5c31174d92ceb7bd5edc3f42929c9"): true, - common.HexToHash("0x18e1d36315a8c6eb112fffe382dbc80c8cafb6a89151bfec0b3b917ca5c9946a"): true, - common.HexToHash("0x3aa2ff15a88fcb3dac4533be81cf47c72c92848333af211906afe50abeb460f6"): true, - common.HexToHash("0x7c5e81c71b1c246f8965450aa566ae08871e8c2c01d2eee3ed5dd41ee5e8a212"): true, - common.HexToHash("0xa5ad4b5b823393d95b2912834ad1a0a9d0cf1ba6df916fe86a749f6140e7546c"): true, - common.HexToHash("0x350e68fdbe02ff6673db3b27fb7463031de915dd4456f7e0539bde3a0afa1057"): true, - common.HexToHash("0x5b059f7a093d7e9d09e98919313c0cf006e7ed6322d7f9a4aed53825ade18351"): true, - common.HexToHash("0xb89ce69a3565a7437ea9d6f2ece9abbfaf5dae45a6c131190d82925c6ccdadb4"): true, - common.HexToHash("0x03537fdb3a1f18dfa1296378ea0971a223cfd3a0fdba7c2521d9f6ef8d9e3e34"): true, - common.HexToHash("0xd2c6aa5333ea92b90bfdfb861fa9cfe7aa5bb6e332394a018cad4117f4aff8c0"): true, - common.HexToHash("0x883c926c333ba672a5abe2da472dcd07ee8e020a309028381d5788439f106852"): true, - common.HexToHash("0x2579d36234e157edeb3a942eb34439875b300bbc926d5ec8e6daeca9a9ee1fed"): true, - common.HexToHash("0x68d43eae0b1d199ad4ea7b15441e0d3cad35e486783929c087f4fa7ba2d8981c"): true, - common.HexToHash("0x59726a2de2a2fca17762035a9c9d24676632d491789daffd54c60362f658a5e7"): true, - common.HexToHash("0x744b586ad046af154e03b5cae4d987b291b57e19f73fcfa64f68e5481439047c"): true, - common.HexToHash("0x37170b687acfd1c4ee47bf7bd2643a21ae115adf464b153b379f01b9bc4b7209"): true, - common.HexToHash("0xf4fb8482b1327786894464857010110b3443f531c92f91060ca0094b7dc14295"): true, - common.HexToHash("0x3e5aa87cbf3b4f6e52a235435ab02c9f7899854da1a5fbbd7c221241dee004c0"): true, - common.HexToHash("0x61146c1ffcf32786ddfbc9575db6724978775d572ac664a789ebbeaaed6ae07e"): true, - common.HexToHash("0x2d82a5e6fc9e6592db788b8edaa8fab90cbda6bc0e0194144c4ace0ab6b6a77c"): true, - common.HexToHash("0x6b76b008c36a54d4ed1b739289d22650b3857899aef883eb65126a4d4caa201e"): true, - common.HexToHash("0xbcef001ec8894855d90c6d22d22aea1c97cb491d4dedabdb8448242d53b26185"): true, - common.HexToHash("0xa3dbcdb22bf72a038dd3998ade312aa6a8a7d541e37bc5b1f4c484afcb3aea2a"): true, - common.HexToHash("0x1e24d23fa9fec24e99d193f528a42d7e666fd6254ba72f663b1bf60ed4990c8f"): true, - common.HexToHash("0xd050817e5ad5b99126c3b84762143e5169c93cb56b744d372ba4f464c532673f"): true, - common.HexToHash("0xa989f5f2bdb3d4d492910586fb9c8c754934d4dc5074c6d84466ee51cb5b9cde"): true, - common.HexToHash("0x82a36b9f388405119c1bc8fb6d014599dcc833ce1d37892399a98ac0d70fb783"): true, - common.HexToHash("0x67b8413e376298ff3ab5defd8eaaec3b66d78b5b41022ff2748516bf97b7c70d"): true, - common.HexToHash("0xa634c929b55bd9b7d726d25c31c824d75abb183359e456665b9ba0ab50edb725"): true, - common.HexToHash("0x3253da4e2ac5a133c7834439b20702f44ad2b58de9e39fb50275a5a5a007296e"): true, - common.HexToHash("0x73f3d07a57dc2e3baf13bfa7c4b5b1dc6dfbb0d79ff5d13ac797482a2bd65b0e"): true, - common.HexToHash("0x8e3780116d48096466891db19b5a24973de96a723d5754b095df049bcdf562a1"): true, - common.HexToHash("0x3f2ccfe2ccd8989c241620e4bed556e8b6dff0ebe312f4d25311aae3e0e61ea0"): true, - common.HexToHash("0x713af0f6b9922898656ecbf49daf5f79d72a6bb5e3b078eeaff4ce54cb8fd81f"): true, - common.HexToHash("0x46dedcb7ec4def9956487a2d7cf8bd30b74cdabf585b00e6efc37c38e84b5154"): true, - common.HexToHash("0xf68ccd0cc1bf07a545d0200c77fcb06b504cffa187bb5c375b535c8f8c9305e9"): true, - common.HexToHash("0x639535f1a7d80bb0003748589e71c0c050702526cdbf243a6432c6a6ad734aea"): true, - common.HexToHash("0x7fedad28ef88756f9c80e5aea990c430e6a4c614b24ae125ff253eac1577147f"): true, - common.HexToHash("0xfac2a4b7001bb409c664e3e4e4f89f248831525ad16c5b6369eb860885635ed8"): true, - common.HexToHash("0xc3d8a64a1eb3e10c21525a7990e464fb76d94dd76c052daa0207c566f5e4d6ca"): true, - common.HexToHash("0x16e5d2287e000e04f0c95829a0ceae4d368e65c4d17dc07b409eb61273fd5af9"): true, - common.HexToHash("0xa8fb1e0f911e8db0748b1ae7d1d31d59033f310972f8b1201bdff8a22830c960"): true, - common.HexToHash("0x5dab9dceeba3c2f5952c50cb9ecaae771fbdb0e6fc5a5ecf70cc82a4c8725e5a"): true, - common.HexToHash("0x3910f2d251028604054b11859f3592f29b66f88a301d31654c53eaa66fa37723"): true, - common.HexToHash("0x9fa0f1f2e6932d52451b3acbd1e057786c3bf9550b5e6cf37f556a8f79eb4474"): true, - common.HexToHash("0x148af6c278250b7c97deeaa1289fb191eb29de28ee42051f9c969f7342e8ed56"): true, - common.HexToHash("0xdb3a596e80218e6d142b52cdf61851e43899fbe89117f2414056da3568a0ea5f"): true, - common.HexToHash("0x244a347bda56bd37fe5b8933730e0ee84ff15446d79a0b793410749628c457d3"): true, - common.HexToHash("0xaea404f865288054dddddcbbbb31fd9090a601b116e0ac120ab4c892fb47b65e"): true, - common.HexToHash("0x78bf89ee09ad288c8ec2e87d1bebe5ce9b58eb5af4d58c1a856ce43f97fcba25"): true, - common.HexToHash("0x3572859acce625f32d70d77bb17535fd972eb30394eadb19806f02998baf141e"): true, - common.HexToHash("0x64a1a22bf403286db4b39644247061b7f5c6781e5c8816d803cac6081b55e446"): true, - common.HexToHash("0xd9b6ce7d25426f881cf1cbb1514a2ebd8119dd78ddb0191154d5abd76cdbac15"): true, - common.HexToHash("0xffcc72ae29d918b6c9f1e58fc46330d34d45cfedbe44f86852939cb3304115c8"): true, - common.HexToHash("0xb9f1cd17e97472d860ccec788d277601b941a9485722a8fa3aac64a0da99b3c2"): true, - common.HexToHash("0xd86f39ccb91129489184c847a46e762920d686a8e9ba9ef42a74c386de5c28bb"): true, - common.HexToHash("0x0bc931fc592408190e47c2c2fed8331cef1499b1a81a292b970711928f2b9d4b"): true, - common.HexToHash("0x0bd27ec62641913813a6b650fdfbafaa2d8f2fc6d2059cbfcf5868eafc0eb997"): true, - common.HexToHash("0x8c81af7da6a9a68fd6d34e9f88fdb523134af357d683815bf0c576176b6f5cf0"): true, - common.HexToHash("0x179a4181fa1871a7e211cd94b4f754d577ad53aa0b15ee822cc5e0532f243fdf"): true, - common.HexToHash("0x6da114df55e8a7a95830aa39a4b28da2dacedc1020aaf23d846032dd83f84f50"): true, - common.HexToHash("0x1d1ef79cd1901d56838161136df871c5c96b2a9841683da30b7f37b2331e6a15"): true, - common.HexToHash("0xeaf11a62980effe9b1622168870b005a52695ddfd0c6d52d0ad7cde2158be9b3"): true, - common.HexToHash("0x80bbb4db938a157ec217a9eadf384671eaca03fcd57e62871b9af213afd9f059"): true, - common.HexToHash("0x590e02b4e4c6f8e1338733b36837a80e33144ade856e8b27d4cd4616b5fcbf49"): true, - common.HexToHash("0x9415e7b9cf88d8bb72f8608fae85f3021d595dcb36acc4881d1941baf6ea2e3d"): true, - common.HexToHash("0xb44d176b038f9059da5b4a62ed328365fa5b98cc687cbc28f2a5e9737368f4ef"): true, - common.HexToHash("0xb5c1608cecf71433cb507f0e7d66ae582d3f8056a820764ab764ad5fd3e1fda2"): true, - common.HexToHash("0xa9e97299b7698f3ae23458ca69a5ff267c57f5628f495513066138b6c8306293"): true, - common.HexToHash("0xd70daf2f5162b4880da9b2be3827c56a372ad4d258bc5060444acbeb31c2b878"): true, - common.HexToHash("0x7f86869a6e581aaa8332249b962c260a0f29bb172dd99cf64ed0c3b641f82e43"): true, - common.HexToHash("0xfae47919914e93aa3e3b8e7fd36daf145e3a41ea7b76dec1c61a1b5f41afd809"): true, - common.HexToHash("0xd7ca1770071adbd2acbc02a2290732f2b024ac80cc01583475583746f71974f4"): true, - common.HexToHash("0x32e2c95c405acb39554da71c254a44c373e5d1018acc21ef0bf1eeff3906d814"): true, - common.HexToHash("0x7716be1a7bd4863d93eadd513e40f9dcd40352d9734d0b5d66a5c588e8997e77"): true, - common.HexToHash("0x34bc2ea7095b4b8d5d7cbb81eaac04e21bffd0af7ddf52327894254f53ab342e"): true, - common.HexToHash("0xa43d1d21ef4b48de0ca5924d8d7bd0811bd4bac6861976c9429e478d24c21a3a"): true, - common.HexToHash("0x780ab503c57887c5558c5083911379013a8407e7818617ca2e87177a21c8a689"): true, - common.HexToHash("0x3f6970d898c5761786e1b708367c0f3fa2a64c3eaf234ceb29d18252ffdeb378"): true, - common.HexToHash("0xd7f98a68d4d7d2bb32d546cd0a11001db2b6f341f92f72ca34a98fab7ddfbc13"): true, - common.HexToHash("0xc36cf2765c80cecdd1010b849a8f94e2f8c23335a43cd9a3a11f62369171421f"): true, - common.HexToHash("0x904830500f9c9ff58f57873346e210be4049af508fa539b3476835c8cc0dd879"): true, - common.HexToHash("0xeafcaae7452a683274851a5aca546c0421b3911d0648f0b67b027d22c2dc2fc0"): true, - common.HexToHash("0x7d874487fc41abb071233f3851e87fc5530153a49bad6b9c3d84bbdcab710f72"): true, - common.HexToHash("0xcaa4ea936ae48fcab50e6ffda0e8702db8de92ac57ac6391bde4a96ac4b117f5"): true, - common.HexToHash("0xc36c5e73eaafc50c5fc43a0bb32e95b938fa287e7d43e741ef5e88e79dfc78b3"): true, - common.HexToHash("0x74370c278f002286fd4541460074a858be253c852424904b99f30f1c0742aa9a"): true, - common.HexToHash("0x73db54b08251674638447d6d145674bf6e39b892151380f6a176320eaa1ef655"): true, - common.HexToHash("0xee6ec48b7b7808dba0fcbc791289eca0a84382c6e5ae35353f8b2bc2b7d0f428"): true, - common.HexToHash("0x5bfb047788e6961119207ea10473640322f28c88dc16f9b2f9c2a2483cf60f3f"): true, - common.HexToHash("0xe286941284748b10ad4f3f51c3b0cb869b4b7be51bd87ca9d64dff56063827ba"): true, - common.HexToHash("0x5567745614cb17cc97e688d8f0b15c1936931b7c9c1937f1011ba8bb4e61d830"): true, - common.HexToHash("0x87ba74bdf5dd6ae6d45d1d6ae4aa31af364e98a1059b0e75cca441402bb4efa0"): true, - common.HexToHash("0xf9dc6df532fa6bb7790a794590e1d40f566e254f0219464e4a730b48009195e0"): true, - common.HexToHash("0x8159dab08d71d8b479a4cbdd4c2c6b369df9a131e5c74b9c14c2adcec2744c39"): true, - common.HexToHash("0xd12edb645fa6aa71902fbc415fa2db39f1602735a7bc425d8548212128793bba"): true, - common.HexToHash("0xe5203ed06219bcb934751ae0a9e4744a914b04248c460853f6b99b16142a9720"): true, - common.HexToHash("0x4c34932ead183717ee227516f256b40bd73ecad4819c60406805d0420377f0f0"): true, - common.HexToHash("0xb282b3217dce3723d6a982f8ded91e59ca335fc27610523390afb345d11baaf1"): true, - common.HexToHash("0x67b6db72f7ca9d7695af6e4aceaad3f693505e5702f6e1b42a9f8065868bc6f4"): true, - common.HexToHash("0x71aab0060f3ae3c8439de215641af042760a6d624c6502b033f2d59c6281a736"): true, - common.HexToHash("0x3e95c467e590cdfafc7a5adbbd1487004b0dc18260387f2f5af15c1e011ad668"): true, - common.HexToHash("0x753fc926864f08226f028c08c8dc748e0340431e64745328a7c1e06e65eafdb9"): true, - common.HexToHash("0x2d49d765c829f249c6b629dbf54ca1d54376144bd4c488b1edd30ca84200c368"): true, - common.HexToHash("0x530712c7e6a9f970fa0d83c3b22ad6628aa109f4928f5460870a9f9aaff01dc3"): true, - common.HexToHash("0xa8c4d71003d470b9536f17c11e8336554e7a8706adc6d8681370bfdf36fff70c"): true, - common.HexToHash("0x4a2e9e00fc6bfc6fed3da6410d0856998d57d10261cee22cd4427ff91dc29eb8"): true, - common.HexToHash("0xabec3bb820126376b052aee6f343063a4293c53abcbc232586fd2bb1417b3b28"): true, - common.HexToHash("0xba818d15e0843d0a74f3297a396338c86b8c12c9e087107cc686c3b5a4f8840e"): true, - common.HexToHash("0x272559357d7cd41256f125dd4aa728ecd28772783946b31d2b2224101ed999e2"): true, - common.HexToHash("0xa1bcb8240496986ed64f22d7590c67e95be7a63c27acc51ab89684f7b5e0713f"): true, - common.HexToHash("0x423872f6692c6405821ea768503e0b6923231e4b9ef6699451334a4e3e4d0d07"): true, - common.HexToHash("0x2e8b8d10d77b44430f574d139858ada53290a07bc6a6f5d9508bc7a652ce515d"): true, - common.HexToHash("0x9c593aa7430e8ac3b44e8e68a90a8a6df48b5b30427f97f54ec1d563f0209564"): true, - common.HexToHash("0x6efb3bfecfd8d61f402f59f796bc85ad18c9147c08e4b059975e63614656838f"): true, - common.HexToHash("0x4dd40515bcf97067419544de7c2a51b3d5448edc0cf33c9ef9e16edd8ad81c40"): true, - common.HexToHash("0x127881f7194a24df7cd33729dcd11947e16564b3cb43826e0cbcccb6edc64797"): true, - common.HexToHash("0x9fcbd5808133ec75924608286a25102769b4ae8a6b10612ad129508ad816a412"): true, - common.HexToHash("0x837782653e7f39e0562326df35b4a8bd27bbc2484d2280e2a150f694fa4cecae"): true, - common.HexToHash("0x4a4aae2db561b4469ac9bd09d1ef6faff0850928b007119ad9dedc61c6f96da5"): true, - common.HexToHash("0xd98b7842c6c80cf02a7bec2f236a33647cd3d3f741b38479955f6a474286c570"): true, - common.HexToHash("0x52a3ec60b44fdce888d98190521a7be54d2687452c55e34ed4a3853f241a18db"): true, - common.HexToHash("0xb38737b99a6a62b78737b99077f7bd97f4398133f8fc1a45c1eb7a3b6bf41870"): true, - common.HexToHash("0x9e5840113b4e33f2344c316317c7ce5074edb2f32de3f210f9292db3d08878c3"): true, - common.HexToHash("0x9bef2e9a474fc1c9bf4ccbd404086fa45297e79565f8c8489abc2f83aec8f919"): true, - common.HexToHash("0x8591daff901a9af8c159cb7ac2cd09d510acaadd862ba736a55c2975eb7f311a"): true, - common.HexToHash("0x7bd9d9cae7e4a8898a91cd529f363ef747b94971e4c2aff877be519f8da060d5"): true, - common.HexToHash("0xdef544ef68a49bfbb7028b21bf08236e17da6ec0aea77a1b0c41128e8b199548"): true, - common.HexToHash("0x5e8045220c20d39ad642f1808efa9278d9ba97a10b08b494ffb09091bce51f4a"): true, - common.HexToHash("0x772aa4690924530d44f79e338126f05a76366fc47b804d82f1f534755fae5797"): true, - common.HexToHash("0xd0adb4f7165515e1e9df62ca36f9f214b3822eec5f703d25f8c4058b1f35b2ea"): true, - common.HexToHash("0x990748ad0f88c0866da150b4575777ac213e0d2f4345729adb0febd095f51a84"): true, - common.HexToHash("0xb6c38371b38c930c04e02a97c77d6013db12843e9c4c2b88465c49079f77d3df"): true, - common.HexToHash("0x5f9e9afa92c4c1d42c6dab7538d77254049138a9c765a28fe8d1fba724101dea"): true, - common.HexToHash("0xdbc3e3724d496986eec72f360caa8c3ae83279117d8efd049712d613e5724a92"): true, - common.HexToHash("0xbb381f4c47a3326a013fc4a757c6e8fecf9adbcf38a221ca1ee562526a41b024"): true, - common.HexToHash("0xf6078258d7485fee6db07eb2f5d20d5157c02bc8dddba69f1ec8c661ad9bd66f"): true, - common.HexToHash("0x98e9bb0dad1bdb04128f0265b410d71b58f16404017d5502ea4f412bc65db81a"): true, - common.HexToHash("0x1108bf5b6a4b339d16d3b252b087929fef0087ea915183a1db476fb4607d1c02"): true, - common.HexToHash("0x3ed0352e4bedf7f836188bcd2abcae561961d607a220f9d07cc57bbf6960e188"): true, - common.HexToHash("0xcb62f7a81c38ba42387ce7e6c1a56b6a0072d0697df3c065cf87e1dba4ed6c33"): true, - common.HexToHash("0x093b18b83fea7cbc5569e42836a51237bc8ed6e0da3f9435562945d5a49ff110"): true, - common.HexToHash("0x2be347241106f1754bb7af1b18799ca74b884d9b6c42e5135b55585f98a380da"): true, - common.HexToHash("0x194eb7f98f040092a1b8b68864a41aa2439d224d087fc5128275279b3f336665"): true, - common.HexToHash("0xf6714d74ccc43f265477cb0fadbc73b9ce51d9f8323270a819e1687da4c55f99"): true, - common.HexToHash("0x004f5e3dff0d0e2645d3b2e81eec5b50e8560475959d7b993147f36a25ef0f95"): true, - common.HexToHash("0xca076462162e9cb8c016c1258e26438827fb7ede2e6c9dec56f989dc01a783f7"): true, - common.HexToHash("0x28a02799c47aab7c109cd50321a6d3617058bbbe536311f99c21c11fff2970c7"): true, - common.HexToHash("0x1388edfc94fb2d11302b5fc31ab83f5d796778133968cc6a2950928a252085a3"): true, - common.HexToHash("0x581ad570b8d0f5f1345705437ef680a18091e6771cc42c294d6c171ca7fefdb7"): true, - common.HexToHash("0x00be6b0c4155e469655492d01672ffec714f00f395888cc69d53a13940fb91b3"): true, - common.HexToHash("0x5516f998321e79877864ab7f317fe1270c5fcb5099d3fe2cf3c825fcfabb24de"): true, - common.HexToHash("0xb61bb321f0ef4a564fe75e80385e8e830059a754aab3f395cf5bfb8dd5b4b9db"): true, - common.HexToHash("0xbcc7e468a0600dff7afb549cfc9d9202eca8815980fbd428328c91590c1fd356"): true, - common.HexToHash("0x05f5049d9ea71535626b77067fbd6568629745f1ced245ac8d409de5babe5513"): true, - common.HexToHash("0xe78a7364011ca1f388c8eca7ba8c6e5fad08ce9149185cfd8111c152fa934d1d"): true, - common.HexToHash("0xcb75e880f94dce56ea1ea2f6f741a29203895743743036f5da6e44d2b02654c2"): true, - common.HexToHash("0x1bab795349231658eef76bc654ca2aa73a517abd08ada0942f837594e69e3014"): true, - common.HexToHash("0x4264e2a70f1c37c5c26f346b92bf4d1aa5ece8578211fda4b549569a17fbad12"): true, - common.HexToHash("0x833f8e8f29567f0dc34bc925cbe1fd7eac10fa77a1c5413cbf42b63c6790bc8c"): true, - common.HexToHash("0x28f3b4abb6439c1b97c09905f6909b32a2ba79a6857581d3906d303a747619e1"): true, - common.HexToHash("0x2f6a4453760f871f3cff672f6da04163a2e9a4d7580cbcb494479a21fdd3dd43"): true, - common.HexToHash("0xeb177c04987744013ca52be2a2cbf24376724d4efb4039ea96edaf6e2bbd8978"): true, - common.HexToHash("0x992864aa379aaed1ef33fc87871488f0b183621aaf8f28198c295358f3394d34"): true, - common.HexToHash("0x9a31cdb824fced6aa40f699fcd1e3c856d11b525e211f98de90fbb4eca0faa88"): true, - common.HexToHash("0x146213a9606972deadea418103725bb0b14079ce0f1adcdec3aa413e531e1749"): true, - common.HexToHash("0xbaedcd710b2a468bdae1eee1e4775fbd2b3badae318e416c7716a4f2f90eb001"): true, - common.HexToHash("0xb57491da3d4e81282adb0112fc83cb307a59a712153053ab2a1e697189ba4734"): true, - common.HexToHash("0xb483cca2377e9d193bb8da09ffe1be4e36241caa1008489bc37ed41ce2557dae"): true, - common.HexToHash("0xd7f9a02a26d2ab4c936ed6f14ba6abd71e47255627bcf942db57672958928966"): true, - common.HexToHash("0xc9f3d8eb3e4c339e40c53d30a902a50a733353488d13ab606be6cdf6c772527b"): true, - common.HexToHash("0xf85ace1f4bb51e6dcbb6285d46f29970ea618fc550acaeea744b962b37f966de"): true, - common.HexToHash("0xd6193dc625a14956ebc8e996c570e6e2e01d5a5792e50b6b466569c76b021c21"): true, - common.HexToHash("0x35a877141fe3cd092db4c72955863442b7c9e61839a995020fb194c901f545a0"): true, - common.HexToHash("0x2e829757dd1034090c0d71d0367baa6b097e0ecd23c53a61f049d84641bd7be6"): true, - common.HexToHash("0xde63a480c9d5fc1c6e2adf3a8a685acd8cd57c2710cb2576839510454a9851e8"): true, - common.HexToHash("0x327fd05aa511196181b8f2743dd6d3a22e409c043a7d8977737ece5087152ebf"): true, - common.HexToHash("0x3082a3f45e20753d8d1148376797bfd9732828d3f0b740fce3c7a2666dad4eca"): true, - common.HexToHash("0x69854dfd05d67e9c80e9b3e49e721360b7befe462dc40825355a0d9cc99e9d32"): true, - common.HexToHash("0xd3cfb856d3c835a8fac53cb3cad4fe200440890a7a2f687b6d6d4b666046db76"): true, - common.HexToHash("0xd4bb8d25891454f2dbe492198fa6549239809b8b5a3137a9ef637bfda3f5efef"): true, - common.HexToHash("0x476054604ca96a843fa91314df7b1856f723e84c9498189aaede56a4d2c7f5d4"): true, - common.HexToHash("0xcc7591cb9cd6269bd83e550351295e4d7e3066c8f5a33258ab8dae00d7ddfec4"): true, - common.HexToHash("0x2e14b6d8ee42ee54f4d373c11a68e66dbece9d9dfc6633753a4a5056f35b5952"): true, - common.HexToHash("0x7f5a26afdf79b7ddb4c5e4a356effe071d739b84379a81e672baf8a78673fb72"): true, - common.HexToHash("0x89c416e52ee67dc53b45f4a7f1fc03cc976cc257328ac7c048884ef2ca6c99e6"): true, - common.HexToHash("0xf1f695d201a7496563427767b27c9f3bbf4f8291b01c297903acb37f84be7bc9"): true, - common.HexToHash("0x20a60d18085b78f2163a2b7d4d08d5410573c2ebc01b30f8bf029d985812f6f4"): true, - common.HexToHash("0x9c35e2ffc563222ecfe27935d6c7c4c325cbde95bebbab8d18fdf135fbfb46b4"): true, - common.HexToHash("0xb0b2bf26e60a213f0a378182596e36f3041fb42c1ee3d7fe7468b5250b76ba34"): true, - common.HexToHash("0x0d024f20d75b7c81af62434680a45ade1a01719eb862260d6e791bc3a1b8b762"): true, - common.HexToHash("0xa374559df771d978845969d85f02180afe3b80812c589b6a6dc580e6baab81f4"): true, - common.HexToHash("0x7a4a5a93f63a821e8aa3cf2d0b22f9b02f2e195aac6b6b08a29ccb8116c874f3"): true, - common.HexToHash("0x7300ebd92b171660aaf00edde9cb1afdb39767d662642d1391f156eb5bbe7ff9"): true, - common.HexToHash("0xfd19dda835ad91cd03e065e93257fcebbf9b122c5bf7e9820228d4d1e5544cc2"): true, - common.HexToHash("0xed0c2a4969dfd20ce9199648a3e77ef573e889038710bf00e75bc9c68bf476f0"): true, - common.HexToHash("0x9b10cc81aff67cbf57bf5c307007fbdc6bfd915bc120e4c594e42a63db6afa6d"): true, - common.HexToHash("0x1a1b2c49cd6536577a6cc02d15cd385645dcbc643ac5a300a8981e6471457fdb"): true, - common.HexToHash("0x6e1938701494545f10f674a095d577768144e13a81b32753a74abc8f46be4ec6"): true, - common.HexToHash("0x78bfd2df5503ebd52f84f4886e5373fe8a7c6b1f46a0f4381bfba24c6efe3899"): true, - common.HexToHash("0x882214d78a59d043ea3ab71abcdb262f3a7d762e38fbeba6669ea4fbbebe5a10"): true, - common.HexToHash("0x93df4ba5f5d570897a5a433dda2da358d0ccb79fa15ee41a45b99612d829633f"): true, - common.HexToHash("0x2a640b8c9390b0c5f4c6cb4196ad209ef2c63a46c52315b1e2d4953d59198d65"): true, - common.HexToHash("0xc59eae025a9eeca2f9f2b87cec8b41720e6eb47e0cef6e52c56212baefc36618"): true, - common.HexToHash("0x5f154a20951e1ef895d1cc486002318075d72d1fb9f7f1607cfeb242091d31db"): true, - common.HexToHash("0x3e5a23e2eb389964528c2293bbf08a685c2e9f26e1611e187d2a52d002a04762"): true, - common.HexToHash("0x2e8db1c353571d8c11a05ff9e7f7a24d48893db4ff299ea3602998ab97893f83"): true, - common.HexToHash("0xb4a32c0eb55c502f3c637e1e6cdc0e3b094173ffa40faca697b5b66515e68f0b"): true, - common.HexToHash("0xe8fd82bd5d6a886476a38507c13fd162eba008fe2d3873a81b949302bf3e308b"): true, - common.HexToHash("0x269ec6624facff0a4a547aaaf0b49037ae1f2bf311fae4ef787a36e9a13af86f"): true, - common.HexToHash("0x1048b184ed8969a506e9fdecbb4fdfafaedb44b0429a9dcbec9d991b82927056"): true, - common.HexToHash("0xc9e3b6614f421a1b37c626257830aebbbb9cd0c7618dc156308d1ca1efa7973b"): true, - common.HexToHash("0xea9cc67a110e5c1a6244fcb8e4ba63178d0a3cc5687dca01ed2675178751f94b"): true, - common.HexToHash("0xdff8fbe6f5d625dabe5b4fffd6a145e4b3ae5763d3a0be0a1eedc9c20fe6fb11"): true, - common.HexToHash("0x26fd8461dec36e624a375174d872916f2b9b23d1f23866007a1e1c3f943d28ff"): true, - common.HexToHash("0xab1fc2ac93d6df48899054bd7d8da313feea30d91aef542509d0dfa45c22ceb0"): true, - common.HexToHash("0xafe98ade27da80cecff46e5b641deee1779901ef0178541f235d9c577d98d255"): true, - common.HexToHash("0x0d00bf257e05d604491c4773e1e725b866b48e62f24bb4cb4be799dc962fdd49"): true, - common.HexToHash("0x37671711cdb9accc144bd742e5558a4e9fc5dc2baae6b15a560c0cbbe4130393"): true, - common.HexToHash("0xa67a3accf2c5b54b88a1d07c75c5b4c2eea1b0f52acdda3d97d9bae26f865582"): true, - common.HexToHash("0x8c5cb67d3782197e42329772e8990545fdcb58bfd488f454ac254e90ba30c50a"): true, - common.HexToHash("0xb36ed550e87e15d1aa8bb59439be6d635fc9d779e2ced7d73da79177842707d4"): true, - common.HexToHash("0xeb1752d9422fc15496ee6d92caec3065ead3f381e6296c0fbc55fd52ac93bf1e"): true, - common.HexToHash("0x87f8b2c0ae039e2eafe10c04aab0ebec34263fdb73052cfa282396b93153ae14"): true, - common.HexToHash("0x489c379bd5d0044a76efb7691713e66476b82c1c55de968aeeb49d0eb8854f38"): true, - common.HexToHash("0x4bed8f739faa4a4c507bfce715b6137e4554428660da48ab527fbab3996cc149"): true, - common.HexToHash("0xfaf7976507ae217b6ec164acab20170d29a8dce7d2121173765f50553b01a218"): true, - common.HexToHash("0xdc076528dd1db684c4e20558870543bab10ea3c4a9847df0403e060dee98f676"): true, - common.HexToHash("0xc098c41ca5cce94687ab8f89059b49e7df564737b753e033d120817955ec7b06"): true, - common.HexToHash("0xf1013ce99cbb1c7e96a410ebf4e54ccadc6a44efd36d3de10f3444f135ae8c74"): true, - common.HexToHash("0x9dec4be2bc7d18d6126cba51a6bc37a0fb6f2ae7aff93367665f49672097c55b"): true, - common.HexToHash("0x9884d4030dbc8f58d18da8267dec0cf11d10f415134b144e845245f8132f52d5"): true, - common.HexToHash("0xbb6ea9b7b426c372215a425e8f1ca1c1550c3c94367e77354daaffa06b8878fd"): true, - common.HexToHash("0x0c2819752c4f4107aea2ebe6b6daf90d222a19d6f94166ce08c1559f599f706b"): true, - common.HexToHash("0xbca81d7e2ca19c797e21c74ec019e8ce355f8403e81ca19c6a3479658aaa307e"): true, - common.HexToHash("0x542ee52fd50a62ddf1106cf210a7b6655292b9acdc0edafdf06d89803de2b6f0"): true, - common.HexToHash("0x1d048a0bf1e66e06f161baa7701e31d5db89312496793511f57ef9bfd4b1c6a3"): true, - common.HexToHash("0xfc7c666be19e0aa9ac5f8ad05a5d90e0b3231c62b9e6009fa757576d0781892c"): true, - common.HexToHash("0xb500bdd7466cd1d9ecc8be61e7a5b75daff16b450954171f98aaeda88e1eb871"): true, - common.HexToHash("0x98569b231a5a1e2dd7ca4d6fb65d8042c8d920bb93425caa6e8116c660de6dab"): true, - common.HexToHash("0x97e2de25c05b8b1dbebc5fe4c75c1e339d9ad7b80ff4761a826a22a3bb8365ac"): true, - common.HexToHash("0xf5fec74ac5774079edc42d88b6c9136d928f026226e07ec753d63cd12541197b"): true, - common.HexToHash("0xbbf14fcc917afc815811d50b79ba70867ca2e5a3dbf8bffb4c5a6b3ced2646fd"): true, - common.HexToHash("0xc77526b370fd0a30f532e4b092151cd5e1f50d4d97ff79249569e2b4106aa52a"): true, - common.HexToHash("0x9f431d2e2d3f82e02106768cb7045a4f4fdf098ea166ff9773377e3c438bb88f"): true, - common.HexToHash("0xa407af5e865619b5a59a52c123c8850945b8eb4b8da1585e903fe68f65933f93"): true, - common.HexToHash("0x9f25b2ab3fad6bb8a68ed301d00a133c90e258d53492569329ac8c114f4b9ba5"): true, - common.HexToHash("0x69ab098f5c69137a07b4f51c1d2dfe07c3f1d782c925f3593dcf83b02bc25d87"): true, - common.HexToHash("0xca71c1c1865d462b24bc0bddf8ac551de6144314f17f20329c1e436e916a52ae"): true, - common.HexToHash("0xba476c04d6abc10bffd972f436bbaa7299bd6012360973c6dc9a060f7bd56c6b"): true, - common.HexToHash("0x812a6c8641bf19de37ac53af81fe6fb0090825e934a8f27fc5cc9f230a2345ed"): true, - common.HexToHash("0xf3ab0c97f17dbccdb4ca26e839f31af727a8a927b1f098f233d863046e05116a"): true, - common.HexToHash("0x02fa7597cf47bd72c48888ed779111a0e4848bc175c066d23384e63c5e96676f"): true, - common.HexToHash("0xd1c2f6648d43b440449fb97847d1d4e13074ff24832a020cf1ccb99c7ffa49a2"): true, - common.HexToHash("0xf1979cc7d417ba22a587f5f02c18b802c0b6073e72f8e031d66a27be53094b15"): true, - common.HexToHash("0x1aa3bb430e28b9a08389660af677561dc26f94e70260a219c894ed22caec9758"): true, - common.HexToHash("0x7fc8db186fa13a7d058d3b6b7e3eaa27e0b9da978f08a883bc5ec3105f12dc08"): true, - common.HexToHash("0xc2c3b5f87f62398d5d68afa44ee44f283bbd5df7cc0c03b75129ee513c7dc3e5"): true, - common.HexToHash("0x2de0f6be6a697686f17c676bbcb688f40def9aa59fa3f0964f3f0a5ff67d231e"): true, - common.HexToHash("0x16fa491040de78d3d18ff1f409d9c6a4dcabd879739679b4688e4f92aa73e431"): true, - common.HexToHash("0xe8d5a0eaa2fb83caae8bfe95a06b8cd93b94dc15ad1fba8a7eeecf13e27e501a"): true, - common.HexToHash("0x898fbe9ddca24da6847fa2874cef5dd6e146b29f71b95328d77272e30c259a06"): true, - common.HexToHash("0x2ae3737123bb91b6ef3d9586b2acf67edf4fe9fdc49ff6d5594eaea3212310b1"): true, - common.HexToHash("0xebd90b1246b2993c5384ccaaeb2bd2db4cc77b53deb3e09d15660b7026b29be3"): true, - common.HexToHash("0xa6ba70fb38ca155802e31feaece03ad18d1c0cf0713564290fc1a5cf3eedfaf6"): true, - common.HexToHash("0x74b4404e5bebe97ac23723b62095ffaff1743bdb6436ca3676bd8d4546a5f2af"): true, - common.HexToHash("0x79a1aa1e24216330efe88dc7421cc85f8a14c5857354c6d6a9abf68cf193c2c7"): true, - common.HexToHash("0x78f98b44004b42dc96e071570bb507d47b3ce7bbd6c4a60bc3add1f6f5243594"): true, - common.HexToHash("0x6272dcf1af876b11633ea569b84f171c5b32bf779aa6641855ad796598d463f6"): true, - common.HexToHash("0x96adeedea8102b959e2332284c6599291b876b9a261a8ec7d6aaa83a1b7d5da9"): true, - common.HexToHash("0x8bdee0abc563d3e049e335301c7d96017e53ec3ad70d6616c5900fb1bc7f0b5b"): true, - common.HexToHash("0x201a2773599a3803cf8441165bee8ed1ce134eba54ebe4818c45b3e7adaa4adc"): true, - common.HexToHash("0xfd2c3b2770b085ca1fca61378d7a970aa25d4868515e32b2335977bfa893b641"): true, - common.HexToHash("0xba932e37d51da0bf4856e2564f06519307a9b2b0eabf43631ceb4ef6c8dbb791"): true, - common.HexToHash("0xce43fd475064dd5f057f423ebf271f420e7904ee01c57672cac0924ff8f550ee"): true, - common.HexToHash("0x27854e00cded18f9cbd435ca985ef5a66d2e817348d034c915bc7db160a53134"): true, - common.HexToHash("0xfc4d9fe5f866055926155a636dd6dc593e4518fd169af659deb889c70f1b2548"): true, - common.HexToHash("0xa0209d36eb3bcbd3bd49ab45d8e947b90ff667e2409376a4350265144662f770"): true, - common.HexToHash("0x3ad5a0e15214585bd6313b35f9881960d554c68ed2a9a12578a23113a85f293d"): true, - common.HexToHash("0xa3288961e6a73143043961d19d4bcbd8f53e95ba55bd0f6e9c56dacb1c3d3d24"): true, - common.HexToHash("0x8ddb81df78f3c5b66a5a485f813d5aeaa17de78308663504a491e6da707b6fc4"): true, - common.HexToHash("0xa050bffb91333830241383431a900633fa3185daebc5efd4ecc22d7b611debd9"): true, - common.HexToHash("0xc87e677e4a418c0729dcff249eacc3a0181df2db16753d76e54050c93cc502bc"): true, - common.HexToHash("0xc4ffa7a69cee3e6fd280404fe22f87375301042085c5f43ba466da41a7f05b3f"): true, - common.HexToHash("0x0aa2477f0c6842d1c6b6cd22c5746ce5dc2000dd374d912be03ed8e5d1b9b71a"): true, - common.HexToHash("0x8b650053d269e9d5fbe1fc195dde1e8adf5ba19bce82ad83ea9cde0bd29dc62f"): true, - common.HexToHash("0x80726b95ac7825549f2292dfd40bb01b13ba7e3014a307a13a4ff38a4ce0c6b0"): true, - common.HexToHash("0xc02155aaa71d5b863e3b77e47191308719698b785a7707c1273da01d29a37bdf"): true, - common.HexToHash("0xccf048c8ef030a995ccb3ee13158bdd21c75f73a60f90b26d5ca62b8a6e6c1b6"): true, - common.HexToHash("0xd5b7be24d0c6d418ae1d69b1a7162dad1658dad336b9163f829d75d1a26c6a62"): true, - common.HexToHash("0x40b0efe86092feefc837c094898cf7eb2a48358a2be2596ac1c200492907a2ff"): true, - common.HexToHash("0x6fa6fdf28a99e02b864f65712c342090323ec37f97eb3a8a20ff4ae54423fe01"): true, - common.HexToHash("0xe6a8ffbab5f92a449e015dd6a04bf1742ba7baee4f39dff20b928e87846e8fee"): true, - common.HexToHash("0x1b75b46cbae4465dadb9f61fe9a770a8086f7b64363d171c46acd1263997d8af"): true, - common.HexToHash("0x1a9c72efafa1a46e665c0f0bcb5c7cc41f573c170ae53a39ac8f481845a3138f"): true, - common.HexToHash("0x8ce68a559f8f8a2f8a941a3c34d556315624fd8e5633ccdf4b1fa16af7cabb20"): true, - common.HexToHash("0x777eadfc2ea41a965c258e252fa6e21a3d456c085c3ffb74418e77580ca5a5e8"): true, - common.HexToHash("0xc12cfd65fc82420fc6327130ea63bc357e9cb6893d03febbfb239b5a363518ae"): true, - common.HexToHash("0x0d80ee9063bb32c8bda85470511c818b3d80c1503a6182048b5d1047c88e743b"): true, - common.HexToHash("0xcae26d31da685b862b0eb510251317d1452239039a3595420cc0e97f0489ffc0"): true, - common.HexToHash("0x3f447751b9e35174f016612762832fdad6931c16f19f0b3903fdc8f7d9e4b608"): true, - common.HexToHash("0x73de5c470d90c2284fdd3f1007c9f1f348dd68fd25835b3cec97bf2c6d7d0602"): true, - common.HexToHash("0x08065aec5004bca006c7ba3077dddfb8aa6dff1a212f3f76b56ddf11ca47d4b8"): true, - common.HexToHash("0x51e5bade17986e6a5af43a3569cda039206bd539524132ceacff9c7365c029e2"): true, - common.HexToHash("0xc42ec1d0b959066a8af0ab09261521d521ee56220c13725062c87275222108f6"): true, - common.HexToHash("0x8a716271fe07f29aa131dd4a6d2ac626c2f23908be35a4ae9eff598653d18588"): true, - common.HexToHash("0xd091e770f2ddb4efc005d4f4290a161d3276ec2ca1e064802ed4273bf9c9b594"): true, - common.HexToHash("0xeaa239ce2db213735564adceb2e05c2eb60de2d09db2334add11c79fcb5ccb79"): true, - common.HexToHash("0x0bf142d521b9c359073a838deed0cf80c8ccafcf1f9888eb2dd127806da62e9c"): true, - common.HexToHash("0x9fa2ca7a5aaabcb394f233faf854e685265fe5a1bb33e8f28510712ece414217"): true, - common.HexToHash("0x56e9b732839c6f21ea937193ee07e5c90238385638be1d099142a4be67524f68"): true, - common.HexToHash("0x828f434e6f6dc95ba21f7a0edf68cae63c2140f4b135215c44e26178aa07f3a2"): true, - common.HexToHash("0xee9dc07b2dd9b41f77b7e0dfd0fb6d54c263955d91a4cd1c3da435855f363942"): true, - common.HexToHash("0xe7369febd26140ea769f9988fea198dd9273e8b81e6319ce2d7eb6f3e62d74cc"): true, - common.HexToHash("0x8eafd59da7be61fec24b59082c5092bb28a9b1471a8445f1eef7d1ad3d3deaad"): true, - common.HexToHash("0x900a06415ededbb1a2a30f5677d24418982d59f12238ea07b3855b9207a70fb2"): true, - common.HexToHash("0x5f9020fe8daaba8712ac02019cf51184bd27eacb523477433cc414be56f00ee0"): true, - common.HexToHash("0x315c20f9da6e10168449da5ecb8689b56da5bc12e98fd1a3e9ced5b4026fb638"): true, - common.HexToHash("0x99a0767fa26ead5e6cfd8fa95673cb728b6d74412e082513d5beeeaceb9f6ab0"): true, - common.HexToHash("0x1432ed21e246dcabf21be129b8c58b949a5826815e3c4e5539e034ddef54fc78"): true, - common.HexToHash("0x74a8849d26e60bd7de479eac66250e58654b18ed6e2a0770faa5c4dbe13cc549"): true, - common.HexToHash("0x2f436a3359fa5b2d7c2c77fbe45005d6f2e77bf8c7de3f3e0997d9335dd9e8b1"): true, - common.HexToHash("0x48a0bd62e92178d958b1f59ea7cf50c9556f794ce5fdd763d0bd7434ebefa078"): true, - common.HexToHash("0x142e58f091f2333110d634427ee399455bbb7473225e275f4d7ba8ecb0b4a4e3"): true, - common.HexToHash("0x601c688e86f1e3d6a8558b93142ba84a944e2a068ccce2f223a8854713b4e55b"): true, - common.HexToHash("0xe26b28080313d140226e278499b1b2eae7044021c680ff4c24a3d70c1ccc791b"): true, - common.HexToHash("0xe527f79257434017ba99688fbbfecacaf971e603eb0954abcdd3e7a3de4999be"): true, - common.HexToHash("0xacb979a3514afa662dfd9a4d585c1cf35c4d57d5b7c2c49d9fe812423ef901ee"): true, - common.HexToHash("0x18e58c653eaa5ac90c78a8ff7df2126e18bd009eb37fa750a0dd3a0eea3b43f6"): true, - common.HexToHash("0xc9d2979b7b632599387e7a0d2c6f8961a2f541838e30370fde7c3b32f8b8d39b"): true, - common.HexToHash("0x8361de1ebcbde486daf94c98f081efa8b0f71a224867dca7866aabe0766f866c"): true, - common.HexToHash("0x7ea41d2bd279f92838b2042e837b65be6fb797009c1c61e99eb9158856bb3edc"): true, - common.HexToHash("0xed937d4fc3cdad0ba5cde27ed71bd0f8c43e250d04d083c6d2f9baa5eca9ee71"): true, - common.HexToHash("0x55326ab5e6879668d3edddfaa77ca8d72f389bcbb5288123a65de95cca663ec3"): true, - common.HexToHash("0x931b72352ea41d5416afb4e5e2ea837ded8827eaa66c97379f9dc61767ffda7c"): true, - common.HexToHash("0xa8f823114883d156eaba37a134f5889f19030646bdf147ddb3636f5809974ccd"): true, - common.HexToHash("0xb83b5b7b23258e80c57eb6f6b239777bef63575e4fa154097887bf85c0674ea3"): true, - common.HexToHash("0xeb488a9daed3220ce6765fedffd1ee06a75d28e5f132801987c212ce5e7ed99f"): true, - common.HexToHash("0x4e1f38b029da9dbc08f18ada82e31dafc6b7020d30f9980833460f4fd4bf1f34"): true, - common.HexToHash("0x2b7ef70ee13cc8fe0eca4ab31a92025f29a418a6087d61bc1fd8374209ec69c2"): true, - common.HexToHash("0x047ef5d698108ae4e76cda43770a432f43af5f767c6a117f4be0a85e28e55353"): true, - common.HexToHash("0x575ab16d567924c3e726d907ac551503c418eca327609e399bee62f2f9edff1b"): true, - common.HexToHash("0xb26d5f3ce414af18e672b816bd8f42833b39290b1e90d4f342254e0b3bfcc525"): true, - common.HexToHash("0xca2109ff2cc4279fc4d271732d3f974a33069be213672a54802fb9fd93ab61e5"): true, - common.HexToHash("0x330fcba5c97aa63bbed3a8745891e301c7cd682f1ab339fe01660f1c3c4b3184"): true, - common.HexToHash("0x90af1209910dc3e2bf6df357b9b175dae02cf43c7e3251a5e094872c777f9266"): true, - common.HexToHash("0x311ed791ce7ea14bb93d7b0d54dddf00c8072ceb9bda1ccb905789c959e7e15c"): true, - common.HexToHash("0x7224ad442bcacb3813650fb505a1540d2209888d2e28dba1b0b7530dd866ebff"): true, - common.HexToHash("0xc112a8b2c0c87c0f0c8b21fbaf7bbcce4206bae805cf7f71ca6a3a35b5f746d4"): true, - common.HexToHash("0xa04bb7536768e1d7f11cb3e4ada47d5cf4ff72c1a3984e011c30d5dface230b3"): true, - common.HexToHash("0x7adaed7eccd4432dc89fb8b7d02a447a1a4c7e1d628309bdd4a4187a291b9cc0"): true, - common.HexToHash("0xb9db60a119e00eaf5f2f67665c1688bf0dd41d81da31477353780714b3660343"): true, - common.HexToHash("0x72ba0a6e7eff1b6683ef3b981587c9b061f3a3ce8c8d687b4dc8e70819f0e82b"): true, - common.HexToHash("0x7ef90df27fa50ac666ab2fb2c2a12a1e7094e484570ce4c6d175d3d465a34d53"): true, - common.HexToHash("0x1d8803abebb0e75c597d4bd40a3158f62bf953814cc87bfacb070cc5760b5650"): true, - common.HexToHash("0x80c5aa3322db9df3b3344efb6fbec4d3099749f2eee46295237d7e5af9ab507a"): true, - common.HexToHash("0x686df01e5c0e6046e7fa99086f169405597c1a93784866f2b68cb95aeef8806f"): true, - common.HexToHash("0xa68996bac63609020e754e5777a426b5a108d1b9769c53a0fd98a049a65e79f5"): true, - common.HexToHash("0x58ba618a2239e4bdf9cf9f2f5845584088a97bbe6d8d8d7de944d1a11a2ff7f2"): true, - common.HexToHash("0x6b671ea3016802e4682eafee55925806adbe8dd09159d64dbc7a2ae1c6f53d22"): true, - common.HexToHash("0x83ef3186493d503d64cbc3337c8e5c65e1be914225f923e5bbcfa7d84f8c91d7"): true, - common.HexToHash("0xe2fdb6fe42765a5c5d3a3d8d323a8beb29744b278815658f4dcabd90cc91b477"): true, - common.HexToHash("0x026291eb74331bca3a3319f82dd7d9fe7855795ffe270e6e079f492a94af5b42"): true, - common.HexToHash("0xee7d0822e0f172d8dc72317200897aa23b684e0cdbdec3ccfbe73ddc2cbdcaf7"): true, - common.HexToHash("0x10322207e6688f4258b0a525c806efde4cca09fec45d90330f863fe60c4a165a"): true, - common.HexToHash("0x8a1422a1cf5f89bb9468a4cd96753ec0b301d7ba45e8b6efd6264a6aa3d325ef"): true, - common.HexToHash("0x47265fd3fe5a5172eaf2c1116bef11a7cc820903a04a02ef95b3ec1bc16887a3"): true, - common.HexToHash("0xf652f1d6b11be26ac6c0880797e486ead38b165d45bc983f3117c5c497c19b53"): true, - common.HexToHash("0x23ff460ad23481e7af446675137e07fc09d2351d8656a050ebfe5c92224b06f6"): true, - common.HexToHash("0x9738bd8b332285f620df78a6c45ea97fc356989f3e2fa703fa1159930ee96aba"): true, - common.HexToHash("0x9e2c9552d360e1f93644baafe169294d2b5a110919f3ccaa882606e59465a0e8"): true, - common.HexToHash("0x8c99a05b1848a90a6d51d0225a14621ced15608b6ebbe27c040e2857f53c737c"): true, - common.HexToHash("0xe03db51969fbfb027c08ee1062de523f89292c63b4329b686f64f965be75c1c8"): true, - common.HexToHash("0x0a2ee9af6a3d7a3aa44ed855f1edda7420cb748f9b011eb3b024e70c7fa763de"): true, - common.HexToHash("0xf19984c6c97d4432564f6df94acd7c700ab847670f137da043446f3092b9545e"): true, - common.HexToHash("0x2a08af795e37f243ca12cbde6e2237e16b554871404248bec6ab3be36798a3cb"): true, - common.HexToHash("0x0b6817b9e907502f31f4d61ce5afbe947a6afa7ff30b86604938233747247ab9"): true, - common.HexToHash("0x24f36315011f6dab87fa725896778b499941aa5508df470d0843d65a96f02644"): true, - common.HexToHash("0x55fa79958e72eb8142b693cef90cd2a05050ad7f0b83869758b4e1534352f2eb"): true, - common.HexToHash("0x4e41131551e173b4e74941c72949006b9aaab22abb5b7330338f9ce759b01cde"): true, - common.HexToHash("0x69185bae98bb8a24246269b6c9b2de69a59c966ff7934cfea3e13cf83504d58d"): true, - common.HexToHash("0x8a9943f10f017e94cf23451c3aa8b004aa369016c0a3af06f7baf99b1a45eb8b"): true, - common.HexToHash("0xcafdba764e2a4f4273f8b544d662ced1706de28d3c2c960f1af4f0f01be4ed94"): true, - common.HexToHash("0x8ad7f28495ebbd04b986c23d10936ee85730bcd03b7f99c60ad9c3d3de3a5cbe"): true, - common.HexToHash("0xe20de2918e584326721752e08af25472d4c8ca4f7a0a3e3fbfbc1282274f6ca0"): true, - common.HexToHash("0x1a19434cf9753f751e2d4f1bf8fb264b963209dad4abf87e3dd113353bbc2dd8"): true, - common.HexToHash("0xfd116fffbc0a146320e85df433679c4b45cb09401669cfa74a2515c8215471ce"): true, - common.HexToHash("0x4b7f7def1b51ab35cbaf63e92b48de043670eae7308d4f5372f6608809f55e9f"): true, - common.HexToHash("0x4151f721678652537ff1375c7b0b1ec7a5076cffee0d95c02d1fef2062cb5dab"): true, - common.HexToHash("0x63a9f1030eac9b0565ea77125f99adf7e5c4521057673b3463cd13fe27cfd5ab"): true, - common.HexToHash("0xd07836f7fe824b76dadbaedbc4f782e4170c62f784c457db759ef368785291c3"): true, - common.HexToHash("0x30030ba1f059554ff1073fc7f534d1d6522e936143db059fcf270cd7976cb5d0"): true, - common.HexToHash("0x53b21798011f4092b57f3f19824bdcf309b3438caee55191c8e4a9b58f4e5445"): true, - common.HexToHash("0x6b3e78e4c57f7e5a01ecf7be9fac30de35290328d205708168c3adb3c945384b"): true, - common.HexToHash("0x8e1660ab17d771c5b2d5c630f3a661c955f56c447edfd61345a663a8fe42f53a"): true, - common.HexToHash("0x4aadc9b2c599b8ef3c699c14e6537e244195b3269dd0b21eb8c9b6053421deb8"): true, - common.HexToHash("0x74fca5068a88f9ebdff4d02f0dac34adc4d0882b50c6feea791a658df9fcf8c2"): true, - common.HexToHash("0xed36029edacdb4ecd3528bd3081910e23954601fb9404ca5b4af27aedf9b7f3d"): true, - common.HexToHash("0x58a5baae0ab358c19b8e38ba4d6265d9ecb54d872488d59ba923015c470c58b0"): true, - common.HexToHash("0x70c41d863a7bd0aed0c67a45bf7ca17f7a26602b306d6aa01209361c5987d068"): true, - common.HexToHash("0xc04b065f06a3673074a45c60e14e84dbd11d9333e3adc5cd311c42c4b010b156"): true, - common.HexToHash("0x6fb74dcc736a981e4d1d034382a92b2181b376d4d806422dddb78337a5d022aa"): true, - common.HexToHash("0xa930a7c2bf5791edd38abaabcb59ff6e763d59939b7057ee954b631b53f6f7fa"): true, - common.HexToHash("0xd575b906f3c6274d389f1b1e17fb6619a49baca40ca4b89add4a9f2932281cdf"): true, - common.HexToHash("0x4f3d5886362effe8929ab18bdb53c2a8e507fb45dcbc122667c80e1a65b487f1"): true, - common.HexToHash("0x67b7e1d8407fd9e6ebd9a1001320bc68b6bf1f68ffa91c0180ab1427ec8d47d3"): true, - common.HexToHash("0x0bc04ae6646ddc1a9c876263e1f1d598e54b0f145b9fe8fcaae6c75a5edf675d"): true, - common.HexToHash("0xf2bd1caff5ebb69bdf64050ced3ff8e1912cebf98cb2df721e83a386efd8eb3b"): true, - common.HexToHash("0xbc894d51ad3559090ab9fda56ce1e38e536ebc894d0bf5afc57fe47fb7ba72d6"): true, - common.HexToHash("0xce2063fba02937870a98726b4ac416954ab03992842434292fdbc29efb428f12"): true, - common.HexToHash("0xf20961c5509166a8476697d9e28f38b828d79782f3dbd974d6185b46e5690796"): true, - common.HexToHash("0xf70a3c801f960dcc33ea98171fa0b8cff68b6c6ca39851296b3e0dd3d4db90a3"): true, - common.HexToHash("0x10714ce2dcf5ac1b70d549b2d42c3076b36e4a098db50b64e5947ceda41aa027"): true, - common.HexToHash("0x25c666a1e7f965c17c4a13f0ed660deb761626fe74c5c8cadb36cb8222bed434"): true, - common.HexToHash("0xfa42754f0eba34dfb5f05c36d6382937a1d7d5acafaa72ad471691843b6904f7"): true, - common.HexToHash("0x5df35c39b3afd4deb200afe07634c8c1b180e4651a0d8b01420c505e19912677"): true, - common.HexToHash("0x07558df14b5de3dc224be1340781fe04238eea48909efc8cb9ebbf42e97107c2"): true, - common.HexToHash("0xe52006517ecf8038da44e23ee41a27babb5ce9d2ed1e2d302bfa65eeb52bc287"): true, - common.HexToHash("0xb952b6cb4acf5597f201121604fd9919cbf22fb329aa239eb3c97eacfe4cbe10"): true, - common.HexToHash("0xcedee877927849c0de6427ecb18d5adf87d10bb616a749905a72a84d6cec4bdf"): true, - common.HexToHash("0x4a39a3bbb6ccd9295ad26053afc9bac883ccf780505fdee5d49d1419454244dd"): true, - common.HexToHash("0xf86fd11bbf968f5e9178f85e0c65ad7e62a13cceda17934dcaaad7aa7c931326"): true, - common.HexToHash("0x7d22ce3c5a0828e38fd8ad3f7c76e5f497f1efd8d12b4276589a851bcabc9138"): true, - common.HexToHash("0xcc00d63e2576b28648fed93f52adbbf6168f0caecb83cf5b0f87b0c8c0a2169b"): true, - common.HexToHash("0x313a1f28ee2cd550f732ac1c0e5137e3c31b37c0015128e3c184637fdf054e45"): true, - common.HexToHash("0x8d9c534a790341d13a07c81bd5ddbcce2b02f86b024ac6f78a77bdbb6be7ddf9"): true, - common.HexToHash("0x0b027a3e179ed2cd4ac36b089bf42c49d69141bac07ad21114521f76af2f8b80"): true, - common.HexToHash("0x3be0e15e5a4c46438f88b04cf25e5631e2cc2a7ff0d9d0438b1843a245189bab"): true, - common.HexToHash("0xb69867ae90be205a445f59ad7211e61c70d7836b807a6961898611b9391aa1e7"): true, - common.HexToHash("0x10deae902babfd3f800ca4cc5e6576683736f755464cae9d0f753e00365e13d4"): true, - common.HexToHash("0xf421e0b6c8f5c2ec08075a8fc67558af8d8d0a05517c57da8365aad8a7b0e69f"): true, - common.HexToHash("0x4004bff3c5ef93edcb3e6823fc5a02608f67df903574c17d7c0be0ede853bb66"): true, - common.HexToHash("0xcdc12c2de51c9b8d451c19dcaa41f0438fae6badb199e7495b23c983a83c68a3"): true, - common.HexToHash("0x4d69d838eedfd0df842bd2fd097aeb0e52b5d666f23cebdf7bc224f109a0787c"): true, - common.HexToHash("0x12077ba64fddaccd91fd2af9320f31953702717fc6a35e5c0dc5cd5c2037ea42"): true, - common.HexToHash("0x5705946a64f6bec6f465f5e6e51590fd87fe38fa6fcedb37cab7b1825d97c71e"): true, - common.HexToHash("0x75c71d58e065772bbbd71377d5060e15c026468e95968c33ce261e8913686e8e"): true, - common.HexToHash("0x5e797fc26e505ce8b973e29ef4dba9b8540606b3550ed61dc02354348406ce57"): true, - common.HexToHash("0x8bc45b443d17859aee43c20c432cc8afb60c34bae15529e7596da4f410adb81d"): true, - common.HexToHash("0x55220b204012a19722ae7e795b2b723c0a57d8189c76a4d0f75f37ad1b5f8c55"): true, - common.HexToHash("0xfc53c82ed604abe7a5a47dd4c1d0c99259c77039960122756d6f4d7ce576aaf0"): true, - common.HexToHash("0x74a08d15ae277b6567bf184bed953983948548e12f0ab220017371cef5a0f1bd"): true, - common.HexToHash("0x78f46f2ef9cac5dac4af3be8b434a2923b99d1e232a7ab0a4f7da743fbecc3da"): true, - common.HexToHash("0xcb6613a7ae6451955f561405033e533466b98e1a1d0af4e4bedff8635021543a"): true, - common.HexToHash("0xe46ceba4c0c587960946d77b3c8f6ec24d800ccd313d1efbab501916be9ead48"): true, - common.HexToHash("0x337bf1b85567b507635bff0af35c53ce50b155e94079977ccd0dade292a429a2"): true, - common.HexToHash("0x29302faaac0942fb9b003938d0d75f3c80872eb017226ddc4e23cf22caab582e"): true, - common.HexToHash("0x9db5b856feda13810db241325aaa956bffa560a2678c62ce67c41f70fdd77cd7"): true, - common.HexToHash("0xf7ffcc08aa1f97892f3c2c130453845103e8cc9c61dcd9d9d96e91000886f677"): true, - common.HexToHash("0x53c4e8f89c53ba7e5c2a01dee3770638cf5988603851c4d247c05162d9ad1cba"): true, - common.HexToHash("0x78ac0d8ca3154fec48172feb62fba268db8e0f6fc2049db7c03a106c1d1b6a81"): true, - common.HexToHash("0x5e9240af2d103ae5b1d8469582f65c758ef5f5808a9b43a7bb0ccee8c074eebd"): true, - common.HexToHash("0xa8c6aad48a9a85ad0f8ac21f945ab848dd26bd623ec750f5a611a18c9235da00"): true, - common.HexToHash("0x02f33212cff551d83d891c0d82294c3f95c0baed4d8bde73a0a2ec995c150207"): true, - common.HexToHash("0x794c0c63f77e34428323406e9f5a61efb39fc14eba8d1b11b6ce8f6e66a9410a"): true, - common.HexToHash("0x9d37b92d449471b6dc684c6cd04e9f95bd44c6a8fd1996b33af5133eaac4c771"): true, - common.HexToHash("0xbda8a8a523356d9c991f0093875ad30590279df395343c1df6bcbd9e3e9e1f8a"): true, - common.HexToHash("0xb16f3434b0fff89bd3fe1c26d16d22240946de50ca8126c95c293e97066b7f7d"): true, - common.HexToHash("0x8a45d2a8ccc71893ddb2e63b0614819ab13f9c604dff997f8bc47fd3b5622712"): true, - common.HexToHash("0xaf8d9fad0ba9d4180d87ddfffbcaceba289ff9bd99eb7cde91a51bc7a351984a"): true, - common.HexToHash("0xdfe12ceb012865f0147e91f2727d5488d9629a7e7f5e0db31d7e57e2713f1a33"): true, - common.HexToHash("0x52ccb3d86884700b308ae9170c47f7e85207f9ce6ce605fd659c1c3d285dd0d7"): true, - common.HexToHash("0xc7d04bfd53056da3b366127819c21ccd48bd47ddf76eff005436ab53c0f29be3"): true, - common.HexToHash("0x665235eaf4ccaf2acb34960cf262c8ca04d22ebce8716a16a6c472c182e522e7"): true, - common.HexToHash("0xb4a504432261ef1111aa2667e56746a6212d9ebb03c0116f176bf55acb4af571"): true, - common.HexToHash("0x2424a942129d9924e9f51d88de56c0e2302ed2c0c1ea9a780eb89320a9229e35"): true, - common.HexToHash("0xcfaad8ea264499ffde50fc1eb4ae4d0923b9844ed2346dab5f0af8c7e7fa8cf6"): true, - common.HexToHash("0x767cb57c039615e820b6326c784243111492ec7e629ea176b7824997f08d7f34"): true, - common.HexToHash("0x1d0b1fb491b88e0f656cc0e23c3201ed46f80fbe093d9b3b75430c5af85a7063"): true, - common.HexToHash("0x62c845bdc8817127190a48ee90d370d1d489267648a34b703f689b4b92b165f6"): true, - common.HexToHash("0x2dccac61d07046ad4b817d343a8f0541eb458d41f05f641a4e5f308ce5e6bd43"): true, - common.HexToHash("0x18d9390f31e4937525e0f14bc92f260217ba26e728518fdc8c8dc499f42eedc8"): true, - common.HexToHash("0x6135e79f067ce8bcfb0dad68958a57106bbd5b9291455c0ebcc94d5cbb4919a5"): true, - common.HexToHash("0xfb7e67df61d4256e2ec26e4b8617b6c2b3db5a58a143fc23e282033d5ba99ef1"): true, - common.HexToHash("0xce8be5e626001a6c441481612536e4befd7ac0f01fd69cdbdf56645856f3a817"): true, - common.HexToHash("0x5dc634df18490b843f8f16343bce99578c608dcc34592ac49bfc7ff3ac9ee09c"): true, - common.HexToHash("0x7a67f0a279dc9176de1f288501f216f7e79ce40d8f58020aa44c93b896703c2d"): true, - common.HexToHash("0x02ff221b7566778f3fb24d6950937470075d1699d82b101f610fbf3994e5de38"): true, - common.HexToHash("0x18145dbb25a3491d29938f6a5ab07e0111f2cb2d2927b20d8f4939466aabafa7"): true, - common.HexToHash("0xd35aee46b8f3682e99c2c150fd113988faf3688c82944cd8e1283731820a59d3"): true, - common.HexToHash("0xd2ed13ea3bb5fb9865bc9dee643eeeb382ea93663c0bf18cebebe73c68489020"): true, - common.HexToHash("0xbcaeb4d813c8f9cef2aa4f9d30d1ac570c03800d2f6a0fc78fdea9814dca76e3"): true, - common.HexToHash("0x1ad5e426ae51416faf3d41a54ebdc570d00e8c67c5f140b76233ee944557e2c3"): true, - common.HexToHash("0xde4072e31492e7e629054632a3e0f1a7392f6c907180dcbd56980f725687633e"): true, - common.HexToHash("0x4ab465ff8163f1573daaec5b2b2dfbf7200cdb21f71de33e824b717c6ee5b1a0"): true, - common.HexToHash("0x152fa8890ef118aabc410678232f18bbd46521b302d07e357025f1ee401fc46d"): true, - common.HexToHash("0x737e951c6d812681d80088ca249eb1bfcdbed7a51da8a966ebe277d27a6bf48d"): true, - common.HexToHash("0xd2cfe05d0f69ba59c31c23502527bfb237ee0ad4c65113150f7b07fa0214a673"): true, - common.HexToHash("0x95d8a901b26618ece3ae8193c5b760d1641c3bd85866d9a280561c94c69e95c0"): true, - common.HexToHash("0x831c7233c7d094cb88d70eadb0c7246b5c09ece3209edde28d725fa17ff408d0"): true, - common.HexToHash("0x3731f8ee5f3828f598536c4ef024922ab2eb1578d4bedd02e09482a47d402f8d"): true, - common.HexToHash("0xf9855d24a74932b78a9addc5dc5fa873ec296b19888c00dfc73b761e27ce8fc5"): true, - common.HexToHash("0xc26f8f340e77723b28e412105a247de52fae615cde10d216802f08f86299e04a"): true, - common.HexToHash("0x1abfabb20928cb784057b51e2e8a1468100265e9d85896b6f52d5ccc29d286c3"): true, - common.HexToHash("0x7277855aea36d88da5c335b68e9ee188ea75c47c2e9cff979baa2e6c65c24f58"): true, - common.HexToHash("0x5a610e1141ddb184e23f0c536ae403082c71081dc5afd88ce43f6d85202dea26"): true, - common.HexToHash("0x8034b5f7888fcb0e05342a6e044e334fa372eee70349c9dd06b561b5553b8586"): true, - common.HexToHash("0x7f33091b5b23a9a98619e2d33ba75332aa81a832a8f15cd751198e5fca64d62f"): true, - common.HexToHash("0x651a006742f6fad0c1cd82a13bb7879c42c163879b149f62a7ce594ca5030131"): true, - common.HexToHash("0x48cd60c91cbb30f8cc6d2e7dc5431cce4e0738bd4b14b1aa959d508994a09ad2"): true, - common.HexToHash("0x3dccf3b08f8387a53a59e7d0ed3b0c926a4ecb01a2b93c8dd18f971ea5f011ee"): true, - common.HexToHash("0x70d3ad94a09fb82397686f53d24853b9a3b0e9eda0ec774143cc2a2a616ccbff"): true, - common.HexToHash("0xd74121a07e746cafaf12b3576e700198c3e1781d941fb998364ae6ea551c6614"): true, - common.HexToHash("0x2b4bce80c80119637491d8971101b7cfee45ebe54eb8f280c8bae5bbadd4969d"): true, - common.HexToHash("0x67337446ebcc8e966e34c4c290bf5cb670259dcd49b1cc64c13b35765b4d7427"): true, - common.HexToHash("0x71b6d8ea89b2a02fbb41de0441e3d483c2384f7351968a25d76097e85dcd94ad"): true, - common.HexToHash("0xa836bcd0e4aa5630a3ec72d5e62c23c2fcb89f88fb52db386ac2b2f803a2135e"): true, - common.HexToHash("0x624abc5f417ed0581f374634039be58fcf5f03ffa305465d17620e90740e6ce9"): true, - common.HexToHash("0xa6f5039d0873cfced1a48b2b0447620ece196ad77e7ed7d8c0ea1990b71a13b9"): true, - common.HexToHash("0xe5576a4461753e2b69a7b26bdb07932c81d7728cc65705fa88ae296513933bd1"): true, - common.HexToHash("0x9c15dde0a63cf157233605c8928796515b5135095b4c2e721439c007a3c88849"): true, - common.HexToHash("0x8bd6cb25f9fbb89086f90a93608287ba0d0980aa1765f94e1ed92e7d7e8a7d46"): true, - common.HexToHash("0x5f84ebd1094c00a6781c54e0241cd1e737a12797eeb01824669af6726929782d"): true, - common.HexToHash("0xa76cccd9a6d93104a6373f4e5f3766905015756b8deb6ce8e64593c8baac09f0"): true, - common.HexToHash("0xb49bf2d635e84ff70ce798cf5f28af0b154e5946c4a0eec06a43c95e873b1635"): true, - common.HexToHash("0xb91e3551fa4c85a2bcbfe4dea33a654fee2cd34ba7bdd3e9c37d59e7dc461ea4"): true, - common.HexToHash("0x8d51dbc6b79c7a0a90b339a6d07ec9d7768688a4c5eab20b292e22d78f1e6f85"): true, - common.HexToHash("0x3e4780548393ca3df0be28d5910910756651776d23befe0ebba8a617337040bb"): true, - common.HexToHash("0xe5cf5dbd7a9006f6e4c85f3f2930e3de4d293914ed19786211da1b0402f4d177"): true, - common.HexToHash("0x318606d2d42c9691cad1d614d26dae101b5f9d4c3f3de0daae476fe62aad68b6"): true, - common.HexToHash("0x6f40075e1ac836303634dc8253121059a3e589c76f27cae441eba41c5c329120"): true, - common.HexToHash("0xb710566f0331abf4a087429b73cb325bd2603c00ea6da340e60cd2256797aa95"): true, - common.HexToHash("0x68f21838901ff46f91694e19bbef6d2d505ea1ab45777724acc129971c85efc5"): true, - common.HexToHash("0x264bc83af80cb5978d35486f5ada091b0f7c4d5328f4e33abacecf003a523c37"): true, - common.HexToHash("0x604f409ddeb3eaddaa1ae3faa73767ca0d58036a44f7fbb32a7ea37051ab52d3"): true, - common.HexToHash("0x6d6dd182d6ee36a0d2893c52628a923f8150b9115673fb226716c5bf69543ade"): true, - common.HexToHash("0xf671ec485fa978106bc33f8317f7cf25d5478c414aab53f13555609ddd83208b"): true, - common.HexToHash("0xffee52f411fe928fae73ae305bbc98c2444d16df7b841cf61be1af491226cfea"): true, - common.HexToHash("0xcdb00a09fdc2512a9784d9d52a1a377ac9e762ca5f7dacff370dcdca5c2cb406"): true, - common.HexToHash("0xc7e48ca9538b6daecd0cdd99d314a795d47413d7fe412cdf46df54378b9d21d0"): true, - common.HexToHash("0x4266a117a46cd44e3a2b9c8987413513158e1852213c461b5af094781225f9b1"): true, - common.HexToHash("0x4e458895e1a7de4711f2b59530696e159d8864ea105ec31139d9bcbcf80957f0"): true, - common.HexToHash("0xb98b462a3dfe8ecd75db4e816cd45cdec75eb8e4ebb9b0f7c65932e881ca56ab"): true, - common.HexToHash("0x238aeaea45b2e978d9f8fb7ec376ce255885f321ccd163c9ab68af9eef92f948"): true, - common.HexToHash("0xe0bcb3accd99ca4037c2e3abd8b54c9decb6d943310588fb5441e2fef16c3171"): true, - common.HexToHash("0x19388e17a1998ad82aca922bf492c1e1eb8fa5f9220b2519f53e09fc917e528d"): true, - common.HexToHash("0x39d2f34b1b8540f4308a93edf8d093167cc344330850acc13e3a6a58c7ada80f"): true, - common.HexToHash("0x4408b83090b29b64af8e1dc6384d8962e481a7d7f63192a31ca08604b480036a"): true, - common.HexToHash("0x6d886ecb6ee7eb370511d55777c30bbef653ba8c65d903c2b7037f854788abcf"): true, - common.HexToHash("0x5f0a92f882c8b31f41066a817040ec7e10e5f37521f0af1b62ce733ff55f657c"): true, - common.HexToHash("0xbf894bdc9075b89a5820207f5fde893936a956612f7bdca1a909899a5bcc4f26"): true, - common.HexToHash("0xccc42ac2ceae9771bbacabaa246fa528f69fb5ac285b96beed2a0902c7b1a490"): true, - common.HexToHash("0x4ff66b7f1bb67f9fe79b9baa0ed0065fb26939d5ace9a6c2cc39db25168b879e"): true, - common.HexToHash("0xf12c7bfcc23c7ade920922165eb243655b41e7b301edb3ddb8df7ba0ce03b6ab"): true, - common.HexToHash("0xe5332fda30389c1c6dc1fa9549b44800fb260954c22cb2fa5fe0cadb47b86682"): true, - common.HexToHash("0xaaa4abfd1366aad128e82eeb3913b4f3755095168c6f1c28f5c8650c1c0a74b6"): true, - common.HexToHash("0x5ec146c10d7245b0ca3a4c222c0cd3028a1651f240e7fd7bb6339c624c1e3558"): true, - common.HexToHash("0x1eccc1eb34d5099abd8099f6294173d8cd294817117c2753645afc195f11f517"): true, - common.HexToHash("0x9c9216d4f532209b02dd2780e8c415bcd5f542e27a3844f799e441f9cf31f821"): true, - common.HexToHash("0xaa7d9a445397c1020fcfef7e39fe2e754ecd2b1740be00124641a4dd1f90d843"): true, - common.HexToHash("0xb411dc11d466256144588833d125dbd4150d39a5f237a7473aadb4574b3d1e82"): true, - common.HexToHash("0x72433a53e6d0f9227dbc4a27361b5fedb2985257bf3a9c1bb499d31ff4927535"): true, - common.HexToHash("0x4ad848a31413405fe187cbeefd4fd350030a12973fecb01b8606bec95bbd707b"): true, - common.HexToHash("0xa67656e79cffb6ac1461dc6ebc54bf8cb0d3ce3dbd7848fb0f8268a688ee4c87"): true, - common.HexToHash("0x21446d624a891953d32fe0b8ee800d9b50efa4dfc1e6821762f032ef68d77eaa"): true, - common.HexToHash("0xda2fe59b584852f0cb2ffc36065e7f3554f1f0116fd14be4fa4ea95912663fe2"): true, - common.HexToHash("0x9856346aa90a4a06b29167ad821e7eb289e2e0b6de6c301b7992e65eedf152e0"): true, - common.HexToHash("0xc6cb2003600bdc43703abe34357cb91501152907abba21f79f9b53b3ac3a0af6"): true, - common.HexToHash("0xa585c877802efba10b717631795fa506b49ed552597a37386e08087146120f58"): true, - common.HexToHash("0x6675b88381d3959ec4ef693fde196ad5e507a77de5eca4c5fedb5b1067799b05"): true, - common.HexToHash("0x9f92f1cd1a83b8f2c87d0d339292365e3fc92b05e70b3d4578a83b5d634feb27"): true, - common.HexToHash("0x8d57f6eb62e2eeabcf38a72e2d39db4952134760c8d0189628b382c3758bed35"): true, - common.HexToHash("0xee1041d2e72ffe8df085e7477c64ceeda6ccfa645b226e9be7eca69972fab3d5"): true, - common.HexToHash("0x57ff0f6a74ceb5e5fab59fe7b5df263fbe2ac5d55e3992752308a491195d0b92"): true, - common.HexToHash("0x3d5ec468102927b37a1bc9824ca8353bab20f44374de6e3c6ad2a235818060d0"): true, - common.HexToHash("0x0583526e3207227a76aeed52f70f43b9bcfbc54b47384dc9daf646f5cb4de1c1"): true, - common.HexToHash("0x503fc82bc2024e617870985e9e6baeb9e7bf93fa7da15e9fba465994be092b3a"): true, - common.HexToHash("0x7f028632a0feb6a115f991f081d0663a72ccbbf95c48315f804188f26225c333"): true, - common.HexToHash("0xaaeb3e515dd0267a3184169210aa18626c23e31c6038537e46f45596c0f067d6"): true, - common.HexToHash("0x0924cf1dc0fcbc56bf290abf4e9187a744948f9dbe98ae2ee031683c91d59af2"): true, - common.HexToHash("0x443626418963b18c013c4d1964a6ef964040af647b1d71cba478d204f2bbcbff"): true, - common.HexToHash("0xd1b749e492eca49e10b0c0f0d61a2eec0a89fdbffe122007c6dd919fb427a65b"): true, - common.HexToHash("0x80f3b46b233670625549922a00a2cd3d1e5ce08298cdf81e79375360533991fc"): true, - common.HexToHash("0x7d85d78f7cbdbd86a8b4fca04c54c7a7fc60350e2a6d363ffaa44819ae4f7f14"): true, - common.HexToHash("0x64a813ee188c39a0a8cfbf6ae02db17c3304a5d6802cdfd74980f0a8a0b11679"): true, - common.HexToHash("0x80fe3c9474415b3c694c50e02d73829f9f6970ebdcff75e6c6b2207e15a897fb"): true, - common.HexToHash("0x41c02eb238a75843975b6cd4f4b389f80cdef77b43e3f86d314e0d07d4a96b3e"): true, - common.HexToHash("0x6c62abb07a3905d17866caf6cdb9e04ab53a5358e1e310d2cf10004c1f2a1770"): true, - common.HexToHash("0x724e5b0f28119bac269012aaccf6ef7a965877b1ab15a09a159ef9275179fe07"): true, - common.HexToHash("0x7944a6b382665f5aa5bda187c6b1d137220af05239dae7c6f89be3b59b72a712"): true, - common.HexToHash("0x8fa19fe3404d30e631d00f305afe38ad6d9c2b8106d8a2ad2ee2d53af153d4b2"): true, - common.HexToHash("0x38f892312ff7b8fb38ef9481f405b468a86125316cb005f21a2b6c1ed4b2cf45"): true, - common.HexToHash("0x4aa360527fdeb920d15ee37365e3c92332eec06a70d92ae060b6092c5d859bd8"): true, - common.HexToHash("0x60de79b01dfc2bc1c8e67e5240b01db13352d4318217c03951fe182650c94b4b"): true, - common.HexToHash("0xd39d868e5133a3971c803cd8d87362f2bbd49075f844d97082e874f804e373a1"): true, - common.HexToHash("0xb5091172417bfc15b878ac9a40bae281603a109a9f907638ee3b256044bf9c9e"): true, - common.HexToHash("0xc47b4e8f13c3810b844196983be3869189bfeb300636cbb8d6ab931ced0f6d1c"): true, - common.HexToHash("0xc7c6591f8caf8cf5e695bb40b042dc498bc1b391410730614eecd01976b5591a"): true, - common.HexToHash("0x9fe917898fa3ee56ff5e8a54bb0e0c175462c9af3858f497c77eb677751a049d"): true, - common.HexToHash("0xe82f06e6470c2ed139d4ebf2b15d6b8a07510e71550533ddfe1861620620bd37"): true, - common.HexToHash("0xe33a07c87418c5e39a56d5a1b1e2be71265fad308b8d600c8570b9fe5990ffa6"): true, - common.HexToHash("0xaf4bfde3a6bbc8052363ea7944e2655047d7f562898028de81cdee5000d94120"): true, - common.HexToHash("0xcbbc609af5a26f75a2cbb4fa330d91e31484bfa00d8e72c05bec24c4346df19e"): true, - common.HexToHash("0x0af3232485be4f654e02e6f86c13c20c4255f400b3b671f4618d541963d57b8b"): true, - common.HexToHash("0xdffee8e2325f6043ba34f9f633547a5f3f5068acfb4232240f8bfe8ff01306e9"): true, - common.HexToHash("0xd9b48107c455a4f5221c10c075df4b0192fbf9543393266a443b361aa84e2c17"): true, - common.HexToHash("0xf34cede5899fc570c29d38c10a4e6d4dabf208f805d3f1fa1a9fc1a7ce968f25"): true, - common.HexToHash("0x1fafef2819035f2b65ff99700b6c427692364b1bbd8acf3aa5c2ba0dc0fd08bb"): true, - common.HexToHash("0x8a63772f7b9abdb49b504b9898bc56177ad3a67628716f9a1a47ab4a63ecffb7"): true, - common.HexToHash("0x29f47baa451c6a79a9e00cad613de36886398fbbd4dfe548d90476f2df9b11b4"): true, - common.HexToHash("0x0d34ba009ef811c8df320e7e46a48940f84e59c4748ef6b634c5c5e205016ae8"): true, - common.HexToHash("0x5d0054fae7f48b77b2cb5ec5318b06f9a1368b1d113826d15ccc334123c6e956"): true, - common.HexToHash("0xebb2f3f527b84054fd9811e8ceb2c3fca0abe8bb722e678997aca30d77415f8a"): true, - common.HexToHash("0x3fb130e05f825357961d3f670019d8b161c914a164dfc5057edb709099d0137a"): true, - common.HexToHash("0x33716060a655c6ce19647a6218961eb8e0577e70e0484e877417836ea224d932"): true, - common.HexToHash("0xea8f64092e2854495239bc84cead1a811fbc5907d1a06363fd2e0e5ba80cc791"): true, - common.HexToHash("0xede5aa40c02a3c385d2d013714ff0790f7dfbd1361fc65710ecd2ecdc4ce95ee"): true, - common.HexToHash("0x5b8fd05a28d0304583f28d34693ab5254445f9f2ff90512aab7351b28070d7fe"): true, - common.HexToHash("0x56636b0fee3594ad4cfe31a2a86f84618b98f60a33c08da36e36de172ce2517d"): true, - common.HexToHash("0x99ed28ead02b11087f5df8ff89ee17e88e152172fee1400d692b845db93334be"): true, - common.HexToHash("0x2bf4ff3f0866677390d3c288ced2a701c864ffb9e96ec136ea32dac42fb95f95"): true, - common.HexToHash("0x9f34a7669bc48cba0eaf057f56aa0a3b6e93909eef57cfe4f66546d8d461b427"): true, - common.HexToHash("0x5510cfec8dd2d51bf27f8c8d1b7e68af56e18783715310ec5b297bbb674d1860"): true, - common.HexToHash("0x4738fd72bbb0f5496d95e5abdebb775463f832c2eede29e61f99ab4a987248ff"): true, - common.HexToHash("0xa1896b18267798037c29332389345583d876266fdfa74ab7a803c2a7d442f03c"): true, - common.HexToHash("0x605ddc19b3ce7be5bbaeebee98409e913a197b803ea8185755122025156d9d77"): true, - common.HexToHash("0xf1376e7988c88c8fae5ef2a6ef3b2801169af671c4cd8132a58c955aefb17177"): true, - common.HexToHash("0x77197ec7550a84a016f75156920ee0d74c772e7c89db81a071e9a396b2af73f2"): true, - common.HexToHash("0xb80d3a547a15350380d8561b61adff6ade7da36da7d56ce947531180c8cbd5aa"): true, - common.HexToHash("0x52a70bca4688bbc3d04e2f930bfc50ed8fbbc8f404844eef6b31b96b40374b05"): true, - common.HexToHash("0xfa1ee4def89f184353f044c03ee422fa2102150babd0ea7083b9baccfbe48509"): true, - common.HexToHash("0xc899cc9f0355b665d9234cea902c9e7257e548d24084fc5b1b7c14216e129b85"): true, - common.HexToHash("0x4314af325b4bc11baaadc94277999a1a372b572ccee30db8bb0adabd7a7140dd"): true, - common.HexToHash("0x7e4d56c1576c919281b768e3ca1bfb85b676443b2026c333c723e4bf8b702ff8"): true, - common.HexToHash("0xe2303b90dea65ccc1a9fe8da18e326fa71ccb377812a88eeb52032b8781f9138"): true, - common.HexToHash("0x18f57dcae844b5cb2741c88eb0b663a7796475a3a69c04a50ed32a4e81e9a149"): true, - common.HexToHash("0x5834eeeebe537d599ffb3d36810254332d00e5bd7bd3847ac5e88be739ed380f"): true, - common.HexToHash("0x917a5046effe5d62e94256ea10913cfb85e72b2af92193999ae84b9e94d610f7"): true, - common.HexToHash("0x57ae6ff53bc4b3e5d9e56e5b0ecf488a6b109c19755b7780078921286ad90434"): true, - common.HexToHash("0x66d155f16ad5b8b0e29e2c6a6c820382a41335df9e6a21b02c50ee5a841a0fff"): true, - common.HexToHash("0x2c36e16e4acbd26a9a75c397e606a18dfd44a8ae3de5b5844e24224bca9e3bf5"): true, - common.HexToHash("0x9d43895ac5e603186a886da7f5302ec71106e13362adf634673b2191925d8118"): true, - common.HexToHash("0xd5bdd7771d3b021f428ecca8f75a81504fb2523b89621a2f5f573e590e790996"): true, - common.HexToHash("0xf3c16b8f0b4be3156769943c92a156d8d60f07b68ce25ad6a30b33e7d3de76e9"): true, - common.HexToHash("0xd410e2cf7272aad93eba35781797a7cb4b26b5a1cca35ace865e2ec3238f2ecc"): true, - common.HexToHash("0x27c41ff582fa40319a89511beb5f30ca7d22f41b0d33321be58a2b8072437eb9"): true, - common.HexToHash("0x54ef09f9919932d9edae268fb558ad8d732e116e2ce16408c5cdaf206b84da1a"): true, - common.HexToHash("0x6187aa01ea087da574dbd823f5ddb55b9cf81f1f08057e801ed96192d125690f"): true, - common.HexToHash("0xd4328251c5ee28ed4bfc8680d9d2efe716a9a415108b8af343a4fb58dff88605"): true, - common.HexToHash("0x6a0b079de1e6164dd071d63b69e14431278173c58412358f81435011dcf9937d"): true, - common.HexToHash("0xd62b2753f4ff54d33d6f02c2cb853132994ddfd2944b845598ff9ad035eef2f2"): true, - common.HexToHash("0xb06cf999c6d861a205ed88a1c0ae76f2d81f7584fe5416e91af67186774e2590"): true, - common.HexToHash("0x552316ae8a4372574045c1a8a2edb51b2d3ff8f6cc07151627505bcaf9f1c06d"): true, - common.HexToHash("0xa9cfe5313bc4f618395e483a51ab36256277dc67fa9ce4246cdc6c8fbd89fed0"): true, - common.HexToHash("0x7a2fa87947512ee78dd99d4bf4fbe8c7e4ea135c0b950d6d0d0bff27e70f7bfe"): true, - common.HexToHash("0x39de5e5ba315f3786fe13e1ebddb4a068b9d06953b039f674e4fb02ea3b99311"): true, - common.HexToHash("0xd1663701b0148978890e787533240f69ccc31738947ea2f3c5e9270aa1ab17c4"): true, - common.HexToHash("0x718aedbc1bd16f90bd2019483fffe3027ff4df90cdd59eb691e70cfd54266f6d"): true, - common.HexToHash("0xd93cbb04ebd5752641a36dbe18b8705947a56ec765e01c47f0d872cb7daf4abb"): true, - common.HexToHash("0xcee320903216fa89618047e9cd2af9653f62c261f3bfdd837d70e80496df8d17"): true, - common.HexToHash("0x7d1affe74a8dca38ab56c433e165af9c5c75e4be90f5425eb18dc25c7e1da074"): true, - common.HexToHash("0x5bf9d5b53f31682e927f9b2193daec44e09506b867a7c815bd06283a8db0a584"): true, - common.HexToHash("0xfdf4b6c184b26cc910db96fc95760a7eb39a0d141a64ce9ed99f5aafcf4e01f6"): true, - common.HexToHash("0xad091e9928c493e6bb92753889b50a003787e81266d93376b20ef5dae94e5a51"): true, - common.HexToHash("0xb9ab3712efd0e5c767a1289650d5c7bfa8b9f91ce589d4f9b19fc3ad2db4f285"): true, - common.HexToHash("0x67b2f235af22d5be0bafc0f74779547cd0b4c5208ef09e40805ada4914ce9d3f"): true, - common.HexToHash("0xe9bd070e555193d3e033e0e5800cb5ee7c8b8cd8fda033760f54a63c1eb9d614"): true, - common.HexToHash("0x45b42b5fda64da7fdf5c9901312481baec2f3fd1e0a183c72e7615d31cde7ddd"): true, - common.HexToHash("0x54297d1ec78c5235967057f10bb5325499f95f7eefefdac9244076c62a58c3b1"): true, - common.HexToHash("0x5d525c4b30df13e22190b78c6aabe8409f8dc11f990f57cf06f4b8248e1ef324"): true, - common.HexToHash("0x7bd5bbea138853f7ab136b977d74db83985af085852fac1da7e7874af35ba65e"): true, - common.HexToHash("0x3155109b6ad841e75ce5399bc603fac7507ab18a693f3a9c616f6e17b5017ed7"): true, - common.HexToHash("0xaa9d9e114bf4063c15954b01dfc1a889dbc8e8159d9ef0a3651660bddad0446c"): true, - common.HexToHash("0x9f9dfd479983345a85a43acd680efdbec969067c1e6885851608d467a2d98fe1"): true, - common.HexToHash("0x304a356ae99121a9540babc9707c62b4c41f2f581a5e372ca04a374987c1566c"): true, - common.HexToHash("0xad1222c85393d0a32efcc152fe1e2df707b9b28289fc4af889a5e905c0863ca1"): true, - common.HexToHash("0x3752f3fc92b7d717c99869198e6a04bfb4a603b09426b6cdcf56d35981ec794f"): true, - common.HexToHash("0xc29624aa720f53e2834c316c2453ada58e8099f4cea46ad555a08b9088cd309b"): true, - common.HexToHash("0xd0993399d602aabb6e5ad3175e829ae99067aef9f125c8fb5b6060d01f4dcf6d"): true, - common.HexToHash("0x980640461434ef986262b59609edac0ded911dba84e27c2ef7e2d3eab72ae58f"): true, - common.HexToHash("0x7ed3ea59226f9e0fa647a72d03906269b4adf6473f3128490c05b4b32dc787cc"): true, - common.HexToHash("0x0b1f47516e5a8b6d19755d8166c607bbbc13e6465f1da8d118b6a26663bc5c3b"): true, - common.HexToHash("0x1d2d3831390f449ecac4415f433bd784c32a6421f76236896b5791683d163552"): true, - common.HexToHash("0xf5142d5cc6b171e24d85746fe40ed1c982e3e1dc6b8d4a5290a02ceebf9c71b9"): true, - common.HexToHash("0x9866e7f58aea3841719d2f96cb4118d2efa078fd84f709009ed579c33c89c82a"): true, - common.HexToHash("0x4192de0810d0cdeca111ec20dddf72fe693e7779e9909ca44470043fac11f2df"): true, - common.HexToHash("0xfeca51ea53cd94bd7d5b535290d7b712707e0e1fddcf790840586bfe1fe22c0e"): true, - common.HexToHash("0x0bc2c5704d60c8c0f2232e4b97c6a0a92528d9b16484c74aad4db9559052d7b9"): true, - common.HexToHash("0x4d453b0fb2ac05829616d16d154745dc46e619509ad8a89e54fff2c2d06c443d"): true, - common.HexToHash("0x624894b3ede185b16645f147a10238c74b192ffd89cb5c90f6433ed268ff1df7"): true, - common.HexToHash("0x84c7e5b7eb80edb9cf35923971277cf5c53a984d383845292a38bc704251916e"): true, - common.HexToHash("0x7ff681ba115e39f18c6200f5770b389a8a4a22f45d81a51acbaa36aa4010be8b"): true, - common.HexToHash("0xe3b5656d8643f42edfca8a86d4a0724c0473ecce1132e811ae3740320a5d87f4"): true, - common.HexToHash("0xcf9a6e62301deff138455b3b21f468024363384a7b9d747a8b51f634cf78bd80"): true, - common.HexToHash("0x486744320db74b4c17b5163ac2b3dceb20ff320932fc7e197335c640605d2e1d"): true, - common.HexToHash("0x60bd77c934d9885fb53b7e6b2fe166a654c8d4331e3aff8d84ee306c6599971a"): true, - common.HexToHash("0x512cace2a3e5c326e543606c5c39eef9bba17c6c1c812e29a808c117d27e8743"): true, - common.HexToHash("0xb046612a0048ee5602a0a9d73b091061142b9433fe98f4f95e4abdfbaf3585b2"): true, - common.HexToHash("0x3f33d0a01d14b9f5ef58cce6449f9ef011f19836ce055f84ad84103aafe02211"): true, - common.HexToHash("0x6abe8b77b0cbe0bbbeaee7bca24979adc702ff81e350fd745608e129dae4043a"): true, - common.HexToHash("0xacdba686bf9aa57d466d785552921e1a425e7877b1a33009ee851c01e66cea49"): true, - common.HexToHash("0xac2459ccb3156d56d24790358c8bb995427a8d2d768d65dca94a1e283c905f62"): true, - common.HexToHash("0x4fbb34164b7d330b345a9ee65e80860188e80d7dd41a998ca835dd6853eec733"): true, - common.HexToHash("0x05c550bdeb532c6aff332a1a455aa03fbc0d7666139a8d12feb5eaaec2cb4380"): true, - common.HexToHash("0xa484505835ee9b234f2b9a18bb28beaf4b2b5c2bd618149acf8cb810f86f61bc"): true, - common.HexToHash("0xfad6eae71404839ec86ccf3cc8d2f67e1ab3549aff5222355d3b8978240b5289"): true, - common.HexToHash("0x434813f871ba32cdfb9b2cc242e3c3c9e7383ad27bbab261dc4ade1f8ab0417b"): true, - common.HexToHash("0xe73a8e83b4ad5d77e35145dc67d71f0426f2cb844ed851163adfbc1d7214638e"): true, - common.HexToHash("0x66b44dc872b92daeb7c56336c868a501232b4bbd3ede237605cbbc0addd7dd01"): true, - common.HexToHash("0x4c7be533d3cf79a4e0ab4f6941a94dac5b2b18cd5c62f342ddf5341736f3a4ae"): true, - common.HexToHash("0xd721b8afdb1b4644c0d21ff2ab1a9c95d849d34ef6d695147f4d77a4ab4e3b26"): true, - common.HexToHash("0x10779e99cf64d6f5834d6b7be01479f2085b7ec1aba583295ccf03882b1a4b9b"): true, - common.HexToHash("0x4b23e5b16d2e4e9237d9b20f231d5a6d7c2c1c3c25f420575056d7e9239542cd"): true, - common.HexToHash("0x64b4fb5ca16096cf2c472cd3501e211bf78f24a5bbdfb0a63484161bb7904523"): true, - common.HexToHash("0xb2c62a6ceeff1483fb9b53aae2e0a4181753390187d13d901d87b82c8189ace7"): true, - common.HexToHash("0x72c36d2cf9cfeb4291272be4d827b982b4c22d6bce87e623c60d0d2fa8912f78"): true, - common.HexToHash("0xdf4f6177eb117407751efd5e39cd47101e1a7a3298b1f3e62c586e0332f6bb14"): true, - common.HexToHash("0x091083c84b1047b550b5d626eef78360067354a44c9c1f17ab3da32d4a0ab675"): true, - common.HexToHash("0x2f2624ff1a3df966b58933585be4a23e634d8787432fa6507dbe31055a59e088"): true, - common.HexToHash("0xc7c2c477223b2fe9dceb421874e7fe21b5dac7d8f160040002bcd362f1a3c56e"): true, - common.HexToHash("0x43db96cd1f16d7eb4969153b2ab77f6adf294e2b25d37d6083f49c39597fd997"): true, - common.HexToHash("0x3cfeff570bd97c42e2b3957d33e5fd86f3f73154572b33c67291d863ddf861bd"): true, - common.HexToHash("0x3157970fbd37968c8cd5efb415e7bda9a24f872412ae5313af9894d8f0c53eaf"): true, - common.HexToHash("0x2e2668c22277a70dd9523342e9ee04019b04a3d3a68167b843856c01914c8301"): true, - common.HexToHash("0xa1f71bf222062dd08500761277a94a68870987fd6f5f63c0c05999024260839e"): true, - common.HexToHash("0x180b40bc702633cd72fe347e199e9a3be7874999d7b01c83bfbcec786bdd6796"): true, - common.HexToHash("0x85bd8abdaaf501880d432d43f44ad63784503439575c20db28f1e59dc4dc5225"): true, - common.HexToHash("0xf633cc2e962562b547f9803ec4fb70b9f71d2e1750f9bfe093b4408acce7bbf8"): true, - common.HexToHash("0xf0eb1d0fab2987951f695085f1add99b3195d0ca3e0ed9b60ffbaca04dc7b518"): true, - common.HexToHash("0x859b060e103c7b13befe7ae18d47a874bb091d54d24961fffdd5896020d317eb"): true, - common.HexToHash("0x02fd36f32483b2219fddf3d23c9755b50effa968cb43a0b6d9ef00daaa14510b"): true, - common.HexToHash("0x6e9b6c4ae7844869c1cc7b1ebe7aa7cc27633054ee007e7e5bcbb1786a04ff69"): true, - common.HexToHash("0x2bff36dd7f64aa5af4a03a68ca2e85bedd5d2d00ef131dda94d13b1db4723c9b"): true, - common.HexToHash("0xdaafc62841134d6b40e9c64ce7bf64bf98e3fda994407ca33a04d6c6ee0c5103"): true, - common.HexToHash("0x18996e055aac3438d477b83f9c1d3a1e8d807e75b022a2955877aa89935f826e"): true, - common.HexToHash("0xba8df1fb8a4e7402251aa4232209c905ae76ae70e3593a6a1bc211495b53b267"): true, - common.HexToHash("0xaeefc2634406cfef34189907c5b05583522082dd1f693df240545a15f76a99b2"): true, - common.HexToHash("0x5da4daf74c0db5f8a550e55bf301890e72ba09b027f6c6f691f7a987f894405d"): true, - common.HexToHash("0x9402d3915e204596b62820e0e40d738a703d1c13dda9bb8ae016218aba462abd"): true, - common.HexToHash("0x5fcaca79be2fa7ac6572b6ed62e8579ce533799edcbf1c2956e77c0e81ed9151"): true, - common.HexToHash("0xfedc90f490c0a9122e0ad71b756c3fb14ab2f086603013272ebaba3ba256eea9"): true, - common.HexToHash("0x1ffae809539978877aa20ff5da9fd6269444e57026b151d8d069360d971a8df2"): true, - common.HexToHash("0x6eea2d50f4ebcfb2d9710b87a5876a29f0de17dc88d028e010221cf7e00e81eb"): true, - common.HexToHash("0xf8bfca9e8084c8f0629bdc3b5b5f2553a7f1e6f70c7a3c24c9a4a04117e78bc3"): true, - common.HexToHash("0x9bed94bd79a7488aecfb1fda41067b07859d8c09b8cb767adbdac5b00804161f"): true, - common.HexToHash("0x65f2b5f8af9082c9fb27d80f219be35ca990df354a756379f976bf91f2251883"): true, - common.HexToHash("0xcfeab12d7a8e472250e219637011459b99f4062ba4f6ee6ecd3a2a46d99ead9f"): true, - common.HexToHash("0x5bafaeed11b6feb6ab1b805091b59331ac54df08e1c7c7c2431b34ea8668e3e6"): true, - common.HexToHash("0x79b181167c4e0280eacd9adbdf957845097e6cb01c598905ba37dca3ec16ac66"): true, - common.HexToHash("0xd5b9c767834214a68376b260d825624a3c4ba917ebe28bcf1b06c525471a65cb"): true, - common.HexToHash("0xc1f9b00cf17f96f3d06fcb2f62675bd9b2303bbbbf208b7d74176681cf8d4777"): true, - common.HexToHash("0x09a31e73689c9339855ffe22542ea4a417288fb276130b4de99eb833528540af"): true, - common.HexToHash("0x8e946ac3e56e99759ee4357f06c9070b5fd742551d85041b7c6320ee9f82fc93"): true, - common.HexToHash("0x20af83bb67730f90355ec2b13536cf05eaf9e3da14a2096e56096f38f90c3f15"): true, - common.HexToHash("0x5598dc7312dcf943776625047bff1f7f287fcb8ba78de41343b9a1aa1748010e"): true, - common.HexToHash("0xcfa58d74b8f0de548d01ba5cea44af0e02b68579b0d2bf146aa3883ca2d5707b"): true, - common.HexToHash("0x3dd0efbf33321d079d6c5eb5f4a0892d0e3acf1a5a858e149eeb6fc809477d3e"): true, - common.HexToHash("0x1ae3ba422e13be8ce2dfbdc427b7f9565c8cf0c64318a51a7711838a8b04b9e7"): true, - common.HexToHash("0xc5228e0b9e49eeeb3fc923a563103339de9527e7547e203517668ea64db198a7"): true, - common.HexToHash("0x67ce79d626f1925fd196db430525d0ba0c2e41837cde00b175f4d1cb90c3c84c"): true, - common.HexToHash("0xc384cc216342b9fb529efbed00bc9a5fd0fb3f2eb7f396b3e90cfda151103860"): true, - common.HexToHash("0xdf341a135466eac1326d5596f9c6aa6e066a908258a4ec94918a73e84f155f0d"): true, - common.HexToHash("0x2d4ecce29c53b761352c332e582eb3683175d49ee95c2f1ddc64f6b8af8927cc"): true, - common.HexToHash("0xcc5381a0447254ca4d6042b6c85917300202409ccae83e6357b942cce1b0c240"): true, - common.HexToHash("0xca6393519a7ded861467ecfc467764a453ef7d26bcb08ae168fd21f7322226b6"): true, - common.HexToHash("0xf6a8221ccae907afb1567cad14acad68604af0e742497c3667a1864c1ae38c49"): true, - common.HexToHash("0x839127e9bb0d4bf6f29a90d1bbed8159647f8f943eb5c6ee2503dc5d6067af10"): true, - common.HexToHash("0x6bfb641277f5d218abfb55a5a1eba517be3069f1be545f6bc6832af8916a0f49"): true, - common.HexToHash("0x3967f9c16ef06e02e4496e95169a396463c68ce5985695f1523289ac635d450c"): true, - common.HexToHash("0x3e63bfebff8be233e2352ac5a784bae34c9c481038b8607c1b2cf7db47fc77e7"): true, - common.HexToHash("0xc945ce775895fa3de520d11b64ce63956e76a02326cf1b06421d742c51a91c35"): true, - common.HexToHash("0x35fa312e8ee4b87f51a71c2cbf23fde64e48a078795fac3a410c4c777c2324c1"): true, - common.HexToHash("0xc2011db5db6eecdf5b9e25ecdde215939024cff0cc325516e9231454548edd11"): true, - common.HexToHash("0xbf350f2aa20fe179e3aff0e4ce7f7e971817d7578efc3b78706019aea370fd7b"): true, - common.HexToHash("0x54b466c8abf10d8166e2a5392b0f25f082d65c51d8e4a9d26f26a83ce4ade1b6"): true, - common.HexToHash("0x7891cd6b12117e7a1aecccbbdf6723462e8064b25355d6ccb945684ed6d4b424"): true, - common.HexToHash("0x2f8c2305fd8ebf1e59dc328ef50163b554a3b58c08aea3437d88003f9b2e77a7"): true, - common.HexToHash("0xf617dd94df9a49cc6eb438f5fb5019244c92721d9769b017d3535bca5b0ae69a"): true, - common.HexToHash("0x8a8311025c3ff614fc7439d9d1cf705029db2ccb89f780d2c2ff0eac62617820"): true, - common.HexToHash("0xbd7db4429d0d3da187d72dc2e20c694b4da5d5e068204cd33cd62e5128dc3341"): true, - common.HexToHash("0xe3be2584ba9a1f19cc03d9447a848f4e767b6cbd17d5702a71ccf9223eb9d2b7"): true, - common.HexToHash("0xcea45d58d3b7ec48f55b1e557be12ab55979dd1963927b5062634602a8fe60bd"): true, - common.HexToHash("0x281c17c00aff9d53e19a74e7c4656a522af337e09ae4eae7b8799e8770728026"): true, - common.HexToHash("0xecd679d95f9e3c25e42ab1d1c3c52ecf2c5af1b8f745da67e0ca17d25460b0e8"): true, - common.HexToHash("0x1fec4948023fa9b5bbc6906b9d9e7b0609c520276af80d7b150c15563860f935"): true, - common.HexToHash("0xffcb2405d1e53131c36d5c0fe19e983862f28181604688ce6049d1f95b7ac0de"): true, - common.HexToHash("0x807756d59481ccc5933ddd1f6dbdbc453e02e796f53e8f98219f74b39f9a6d8a"): true, - common.HexToHash("0xebcd9acee77a1938d94b520fd5fbd14286f0c24e4b6e39c4c7ff3254201f128d"): true, - common.HexToHash("0x4b65a07cb34534a1cf3d42876b7e3fec0857c2db6c394cc8d9edb8a56f5c603b"): true, - common.HexToHash("0xd5d218821f840e7c482edb833ddfe83d91ea98ddf85870cadafaaba5cc265e70"): true, - common.HexToHash("0xd10041cb4db026a7dd62abc407cf38ae4d626de0d2bd1aea009aaf62d61874fa"): true, - common.HexToHash("0x98c13e2b19a57948ff28601e02eb0c86d2a2717719a55aef23f688bf57f65eef"): true, - common.HexToHash("0x77bcb91bb115172de82286b40f9d8b653bf4499a754af12c260557d156d2846c"): true, - common.HexToHash("0x993abd321fab7b5806621b800a61eb09a64c8371446a54bb336d2214aab564e6"): true, - common.HexToHash("0xea8d8c1a7e90f15d845b57e0875d95e5a56bb3fa919b813f5dcd53ee18a5dfb0"): true, - common.HexToHash("0x97a76bb7de8d018dc97f51b04de375368fba59c6a481c0ecff36c34c3c69755c"): true, - common.HexToHash("0xde6ba823df53acd77cafab7b8bcb192f57bfb1b7a0e0ac0885ed7dd06408eba1"): true, - common.HexToHash("0x4d8eb77a10603a6a1092f222e53192d3ea04bfcf6b2535252ee9d025eda6e035"): true, - common.HexToHash("0x974dab0aca5b511cd879220f864f5d00e206b19cc31517353376d74588dc6584"): true, - common.HexToHash("0xbd996c7f4e81dd6c7e40a3b2f77e18c9d81da59cf9c051b12455467d5a4daba1"): true, - common.HexToHash("0xf3165b999b2a1583267784d514523019d225ad589686e6b277aaa550f1fdca57"): true, - common.HexToHash("0xe0e6c1e2f65dfbdafba21257b33ba1cdbdc5e73ef604a26b7670814ab27f79a1"): true, - common.HexToHash("0x7fb1a5ee9c8e803446ab30f7f15085afe49e0ed5b24368b0663c4ca722c7a56f"): true, - common.HexToHash("0x9519657d4bd8c6d20fcb5044d253e8199b78fd984fe817207acb71c898131447"): true, - common.HexToHash("0x5f6d8d20803104321f8dc27836e11c1b5e968acd1a68a20d5b5f689a4d620e31"): true, - common.HexToHash("0x67ea4e3578a302dcd02f36fde192c57bc4d61de453e739242d58adeccd0001f9"): true, - common.HexToHash("0x7b7ef12edb54edc40875263728248b4b642da6afcc5e01636c26fc124e234578"): true, - common.HexToHash("0x3187b8a4e6d288e5ca512fa9c3fddfa80091c8008c36e24ce825ac0df856b001"): true, - common.HexToHash("0x69255c34cf9effc9db84fc8b4a774c1fce9e46a4320125f3028e6f4b0243eca8"): true, - common.HexToHash("0x60fcbbaaa0823b4c658e2dafcac20c0ef21d21072269fa406b8c20fcc1819bd7"): true, - common.HexToHash("0x560ab268ff09cdf42ebf05862f2100675d11791b793d17ab4dc128cd2091a746"): true, - common.HexToHash("0x91212b534fde3f21d8dd45db995424eb6cd8ae0652c46da063ceef016c673a23"): true, - common.HexToHash("0xa2975d0cca0146ce79165fbf8537728b8766d92c83acad5a54c1158b0ceaf85c"): true, - common.HexToHash("0xbc8e444ee8df63f2ce650ce2873d390a48365e1d50d89a795a1f923716c1b56a"): true, - common.HexToHash("0xa4f802e99df917e41bad00c83ee5dbaa861ff950a70fb7608051be1b0944ae59"): true, - common.HexToHash("0x34154fc87b6d28b3d2690ca88001f7438b6885e97239cd9b8128b6be154d830c"): true, - common.HexToHash("0x2a0c86c34374f211ab3973584227984719f0b87f77a8afa31fdcf3c467acacfa"): true, - common.HexToHash("0xfb992b5803e8dc1f2dbfb8c604e2ba7cb2b1488c8d7ccf6f4805e308d5350f3a"): true, - common.HexToHash("0x1a2514fd01e697c12f129cfb2bc2a81780a3e2a08aade45ebcc390e79995abf5"): true, - common.HexToHash("0x1419fdafb1ee3ea6cc608bb6faebd789dae0cf77d01cab7eb13471bc8797a022"): true, - common.HexToHash("0xda7c8fc5586c657a200c9cf7d3d58a66e0a2f85fe7e35f4fa79e0c76c30bc0b0"): true, - common.HexToHash("0xf09b480278faeba7bede5bcdb54c8aedd1035a7505e3c32f19890c482f5f0c7c"): true, - common.HexToHash("0x11057f1141f797ba816b4a256b13c60f2d2a446ab197b0e41df6976c9779befe"): true, - common.HexToHash("0x047e7dd4d9aedd436ebfd33b1481273d982dcbc0214e9524e52b3455ab1dad77"): true, -} - -/* Sample Go script used to parse through the list of OVM1 withdrawals to generate and -dump the hashes that need to get skipped as L1 finalization events are processed. - - Dune Query used to generate CSV: https://dune.com/queries/3231132/5404047 - -func GenerateOVM1Hashes() error { - file, err := os.Open("OVM1Withdrawals.csv") - if err != nil { - return err - } - - r := csv.NewReader(file) - records, err := r.ReadAll() - if err != nil { - return err - } - fmt.Printf("First Nonce: %s, Last Nonce: %s", records[1][0], records[len(records)-1][0]) - - withdrawals, messages := "", "" - for _, record := range records[1:] { - nonce, ok := new(big.Int).SetString(record[0], 10) - if !ok { - return fmt.Errorf("bad nonce: %s", record[0]) - } - - target := common.HexToAddress(record[1]) - sender := common.HexToAddress(record[2]) - data := common.FromHex(record[3]) - - legacyWithdrawal := crossdomain.NewLegacyWithdrawal(predeploys.L2CrossDomainMessengerAddr, target, sender, data, nonce) - - relayMsgVersion := record[6] - switch relayMsgVersion { - case "0": - messageHash, err := crossdomain.HashCrossDomainMessageV0(target, sender, data, nonce) - if err != nil { - return err - } - - messages = fmt.Sprintf("%s\ncommon.HexToHash(\"%s\"): true,", messages, messageHash) - case "1": - l1CdmAddr := config.Presets[10].ChainConfig.L1Contracts.L1CrossDomainMessengerProxy - value, err := legacyWithdrawal.Value() - if err != nil { - return err - } - - migratedWithdrawal, err := crossdomain.MigrateWithdrawal(legacyWithdrawal, &l1CdmAddr, big.NewInt(int64(10))) - if err != nil { - return err - } - - withdrawalHash, err := migratedWithdrawal.Hash() - if err != nil { - return err - } - - messageHash, err := crossdomain.HashCrossDomainMessageV1(nonce, sender, target, value, new(big.Int), data) - if err != nil { - return err - } - - withdrawals = fmt.Sprintf("%s\ncommon.HexToHash(\"%s\"): true,", withdrawals, withdrawalHash) - messages = fmt.Sprintf("%s\ncommon.HexToHash(\"%s\"): true,", messages, messageHash) - } - } - - withdrawalsFile, err := os.Create("skipped_withdrawal_hashes.txt") - if err != nil { - return err - } - - messagesFile, err := os.Create("skipped_message_hashes.txt") - if err != nil { - return err - } - - withdrawalsFile.WriteString(withdrawals) - messagesFile.WriteString(messages) - return nil -} - -*/ diff --git a/indexer/processors/bridge/types.go b/indexer/processors/bridge/types.go deleted file mode 100644 index 95e7d7ebf616..000000000000 --- a/indexer/processors/bridge/types.go +++ /dev/null @@ -1,8 +0,0 @@ -package bridge - -import "github.com/ethereum/go-ethereum/common" - -type logKey struct { - BlockHash common.Hash - LogIndex uint64 -} diff --git a/indexer/processors/contracts/cross_domain_messenger.go b/indexer/processors/contracts/cross_domain_messenger.go deleted file mode 100644 index 628822f54d55..000000000000 --- a/indexer/processors/contracts/cross_domain_messenger.go +++ /dev/null @@ -1,149 +0,0 @@ -package contracts - -import ( - "fmt" - "math/big" - - "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-chain-ops/crossdomain" -) - -type CrossDomainMessengerSentMessageEvent struct { - Event *database.ContractEvent - BridgeMessage database.BridgeMessage - Version uint16 -} - -type CrossDomainMessengerRelayedMessageEvent struct { - Event *database.ContractEvent - MessageHash common.Hash -} - -func CrossDomainMessengerSentMessageEvents(chainSelector string, contractAddress common.Address, db *database.DB, fromHeight, toHeight *big.Int) ([]CrossDomainMessengerSentMessageEvent, error) { - crossDomainMessengerAbi, err := bindings.CrossDomainMessengerMetaData.GetAbi() - if err != nil { - return nil, err - } - - sentMessageEventAbi := crossDomainMessengerAbi.Events["SentMessage"] - contractEventFilter := database.ContractEvent{ContractAddress: contractAddress, EventSignature: sentMessageEventAbi.ID} - sentMessageEvents, err := db.ContractEvents.ContractEventsWithFilter(contractEventFilter, chainSelector, fromHeight, toHeight) - if err != nil { - return nil, err - } - if len(sentMessageEvents) == 0 { - return nil, nil - } - - sentMessageExtensionEventAbi := crossDomainMessengerAbi.Events["SentMessageExtension1"] - contractEventFilter = database.ContractEvent{ContractAddress: contractAddress, EventSignature: sentMessageExtensionEventAbi.ID} - sentMessageExtensionEvents, err := db.ContractEvents.ContractEventsWithFilter(contractEventFilter, chainSelector, fromHeight, toHeight) - if err != nil { - return nil, err - } - if len(sentMessageExtensionEvents) > len(sentMessageEvents) { - return nil, fmt.Errorf("mismatch. %d sent messages & %d sent message extensions", len(sentMessageEvents), len(sentMessageExtensionEvents)) - } - - // We handle version zero messages uniquely since the first version of cross domain messages - // do not have the SentMessageExtension1 event emitted, introduced in version 1. - numVersionZeroMessages := len(sentMessageEvents) - len(sentMessageExtensionEvents) - crossDomainSentMessages := make([]CrossDomainMessengerSentMessageEvent, len(sentMessageEvents)) - for i := range sentMessageEvents { - sentMessage := bindings.CrossDomainMessengerSentMessage{Raw: *sentMessageEvents[i].RLPLog} - err = UnpackLog(&sentMessage, sentMessageEvents[i].RLPLog, sentMessageEventAbi.Name, crossDomainMessengerAbi) - if err != nil { - return nil, err - } - - _, versionBig := crossdomain.DecodeVersionedNonce(sentMessage.MessageNonce) - version := uint16(versionBig.Uint64()) - if i < numVersionZeroMessages && version != 0 { - return nil, fmt.Errorf("expected version zero nonce: nonce %d, tx_hash %s", sentMessage.MessageNonce, sentMessage.Raw.TxHash) - } - - value := bigint.Zero - var messageHash common.Hash - switch version { - case 0: - messageHash, err = crossdomain.HashCrossDomainMessageV0(sentMessage.Target, sentMessage.Sender, sentMessage.Message, sentMessage.MessageNonce) - if err != nil { - return nil, err - } - - case 1: - sentMessageExtension := bindings.CrossDomainMessengerSentMessageExtension1{Raw: *sentMessageExtensionEvents[i].RLPLog} - err = UnpackLog(&sentMessageExtension, sentMessageExtensionEvents[i].RLPLog, sentMessageExtensionEventAbi.Name, crossDomainMessengerAbi) - if err != nil { - return nil, err - } - - value = sentMessageExtension.Value - messageHash, err = crossdomain.HashCrossDomainMessageV1(sentMessage.MessageNonce, sentMessage.Sender, sentMessage.Target, value, sentMessage.GasLimit, sentMessage.Message) - if err != nil { - return nil, err - } - - default: - // NOTE: We explicitly fail here since the presence of a new version means finalization - // logic needs to be updated to ensure L1 finalization can run from genesis and handle - // the changing version formats. Any unrelayed OVM1 messages that have been hardcoded with - // the v1 hash format also need to be updated. This failure is a serving indicator - return nil, fmt.Errorf("expected cross domain version 0 or version 1: %d", version) - } - - crossDomainSentMessages[i] = CrossDomainMessengerSentMessageEvent{ - Event: &sentMessageEvents[i], - Version: version, - BridgeMessage: database.BridgeMessage{ - MessageHash: messageHash, - Nonce: sentMessage.MessageNonce, - SentMessageEventGUID: sentMessageEvents[i].GUID, - GasLimit: sentMessage.GasLimit, - Tx: database.Transaction{ - FromAddress: sentMessage.Sender, - ToAddress: sentMessage.Target, - Amount: value, - Data: sentMessage.Message, - Timestamp: sentMessageEvents[i].Timestamp, - }, - }, - } - } - - return crossDomainSentMessages, nil -} - -func CrossDomainMessengerRelayedMessageEvents(chainSelector string, contractAddress common.Address, db *database.DB, fromHeight, toHeight *big.Int) ([]CrossDomainMessengerRelayedMessageEvent, error) { - crossDomainMessengerAbi, err := bindings.CrossDomainMessengerMetaData.GetAbi() - if err != nil { - return nil, err - } - - relayedMessageEventAbi := crossDomainMessengerAbi.Events["RelayedMessage"] - contractEventFilter := database.ContractEvent{ContractAddress: contractAddress, EventSignature: relayedMessageEventAbi.ID} - relayedMessageEvents, err := db.ContractEvents.ContractEventsWithFilter(contractEventFilter, chainSelector, fromHeight, toHeight) - if err != nil { - return nil, err - } - - crossDomainRelayedMessages := make([]CrossDomainMessengerRelayedMessageEvent, len(relayedMessageEvents)) - for i := range relayedMessageEvents { - relayedMessage := bindings.CrossDomainMessengerRelayedMessage{Raw: *relayedMessageEvents[i].RLPLog} - err = UnpackLog(&relayedMessage, relayedMessageEvents[i].RLPLog, relayedMessageEventAbi.Name, crossDomainMessengerAbi) - if err != nil { - return nil, err - } - - crossDomainRelayedMessages[i] = CrossDomainMessengerRelayedMessageEvent{ - Event: &relayedMessageEvents[i], - MessageHash: relayedMessage.MsgHash, - } - } - - return crossDomainRelayedMessages, nil -} diff --git a/indexer/processors/contracts/l2_to_l1_message_passer.go b/indexer/processors/contracts/l2_to_l1_message_passer.go deleted file mode 100644 index a33e7860bd1a..000000000000 --- a/indexer/processors/contracts/l2_to_l1_message_passer.go +++ /dev/null @@ -1,56 +0,0 @@ -package contracts - -import ( - "math/big" - - "github.com/ethereum-optimism/optimism/indexer/bindings" - "github.com/ethereum-optimism/optimism/indexer/database" - "github.com/ethereum/go-ethereum/common" -) - -type L2ToL1MessagePasserMessagePassed struct { - Event *database.ContractEvent - WithdrawalHash common.Hash - GasLimit *big.Int - Nonce *big.Int - Tx database.Transaction -} - -func L2ToL1MessagePasserMessagePassedEvents(contractAddress common.Address, db *database.DB, fromHeight, toHeight *big.Int) ([]L2ToL1MessagePasserMessagePassed, error) { - l2ToL1MessagePasserAbi, err := bindings.L2ToL1MessagePasserMetaData.GetAbi() - if err != nil { - return nil, err - } - - messagePassedAbi := l2ToL1MessagePasserAbi.Events["MessagePassed"] - contractEventFilter := database.ContractEvent{ContractAddress: contractAddress, EventSignature: messagePassedAbi.ID} - messagePassedEvents, err := db.ContractEvents.L2ContractEventsWithFilter(contractEventFilter, fromHeight, toHeight) - if err != nil { - return nil, err - } - - messagesPassed := make([]L2ToL1MessagePasserMessagePassed, len(messagePassedEvents)) - for i := range messagePassedEvents { - messagePassed := bindings.L2ToL1MessagePasserMessagePassed{Raw: *messagePassedEvents[i].RLPLog} - err := UnpackLog(&messagePassed, messagePassedEvents[i].RLPLog, messagePassedAbi.Name, l2ToL1MessagePasserAbi) - if err != nil { - return nil, err - } - - messagesPassed[i] = L2ToL1MessagePasserMessagePassed{ - Event: &messagePassedEvents[i].ContractEvent, - WithdrawalHash: messagePassed.WithdrawalHash, - Nonce: messagePassed.Nonce, - GasLimit: messagePassed.GasLimit, - Tx: database.Transaction{ - FromAddress: messagePassed.Sender, - ToAddress: messagePassed.Target, - Amount: messagePassed.Value, - Data: messagePassed.Data, - Timestamp: messagePassedEvents[i].Timestamp, - }, - } - } - - return messagesPassed, nil -} diff --git a/indexer/processors/contracts/legacy_ctc.go b/indexer/processors/contracts/legacy_ctc.go deleted file mode 100644 index 130947f1a252..000000000000 --- a/indexer/processors/contracts/legacy_ctc.go +++ /dev/null @@ -1,58 +0,0 @@ -package contracts - -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/go-ethereum/common" - "github.com/ethereum/go-ethereum/core/types" -) - -type LegacyCTCDepositEvent struct { - Event *database.ContractEvent - Tx database.Transaction - TxHash common.Hash - GasLimit *big.Int -} - -func LegacyCTCDepositEvents(contractAddress common.Address, db *database.DB, fromHeight, toHeight *big.Int) ([]LegacyCTCDepositEvent, error) { - ctcAbi, err := bindings.CanonicalTransactionChainMetaData.GetAbi() - if err != nil { - return nil, err - } - - transactionEnqueuedEventAbi := ctcAbi.Events["TransactionEnqueued"] - contractEventFilter := database.ContractEvent{ContractAddress: contractAddress, EventSignature: transactionEnqueuedEventAbi.ID} - events, err := db.ContractEvents.L1ContractEventsWithFilter(contractEventFilter, fromHeight, toHeight) - if err != nil { - return nil, err - } - - ctcTxDeposits := make([]LegacyCTCDepositEvent, len(events)) - for i := range events { - txEnqueued := bindings.CanonicalTransactionChainTransactionEnqueued{Raw: *events[i].RLPLog} - err = UnpackLog(&txEnqueued, events[i].RLPLog, transactionEnqueuedEventAbi.Name, ctcAbi) - if err != nil { - return nil, err - } - - // Enqueued Deposits do not carry a `msg.value` amount. ETH is only minted on L2 via the L1StandardBridge - ctcTxDeposits[i] = LegacyCTCDepositEvent{ - Event: &events[i].ContractEvent, - GasLimit: txEnqueued.GasLimit, - TxHash: types.NewTransaction(0, txEnqueued.Target, bigint.Zero, txEnqueued.GasLimit.Uint64(), nil, txEnqueued.Data).Hash(), - Tx: database.Transaction{ - FromAddress: txEnqueued.L1TxOrigin, - ToAddress: txEnqueued.Target, - Amount: bigint.Zero, - Data: txEnqueued.Data, - Timestamp: events[i].Timestamp, - }, - } - } - - return ctcTxDeposits, nil -} diff --git a/indexer/processors/contracts/legacy_standard_bridge.go b/indexer/processors/contracts/legacy_standard_bridge.go deleted file mode 100644 index 723aa17d748b..000000000000 --- a/indexer/processors/contracts/legacy_standard_bridge.go +++ /dev/null @@ -1,123 +0,0 @@ -package contracts - -import ( - "math/big" - - "github.com/ethereum-optimism/optimism/indexer/bindings" - "github.com/ethereum-optimism/optimism/indexer/database" - - "github.com/ethereum/go-ethereum/common" -) - -type LegacyBridgeEvent struct { - Event *database.ContractEvent - BridgeTransfer database.BridgeTransfer -} - -func L1StandardBridgeLegacyDepositInitiatedEvents(contractAddress common.Address, db *database.DB, fromHeight, toHeight *big.Int) ([]LegacyBridgeEvent, error) { - // The L1StandardBridge ABI contains the legacy events - l1StandardBridgeAbi, err := bindings.L1StandardBridgeMetaData.GetAbi() - if err != nil { - return nil, err - } - - ethDepositEventAbi := l1StandardBridgeAbi.Events["ETHDepositInitiated"] - erc20DepositEventAbi := l1StandardBridgeAbi.Events["ERC20DepositInitiated"] - - // Grab both ETH & ERC20 Events - contractEventFilter := database.ContractEvent{ContractAddress: contractAddress, EventSignature: ethDepositEventAbi.ID} - ethDepositEvents, err := db.ContractEvents.L1ContractEventsWithFilter(contractEventFilter, fromHeight, toHeight) - if err != nil { - return nil, err - } - contractEventFilter.EventSignature = erc20DepositEventAbi.ID - erc20DepositEvents, err := db.ContractEvents.L1ContractEventsWithFilter(contractEventFilter, fromHeight, toHeight) - if err != nil { - return nil, err - } - - // Represent the ETH deposits via the ETH ERC20 predeploy address - deposits := make([]LegacyBridgeEvent, len(ethDepositEvents)+len(erc20DepositEvents)) - for i := range ethDepositEvents { - bridgeEvent := bindings.L1StandardBridgeETHDepositInitiated{Raw: *ethDepositEvents[i].RLPLog} - err := UnpackLog(&bridgeEvent, &bridgeEvent.Raw, ethDepositEventAbi.Name, l1StandardBridgeAbi) - if err != nil { - return nil, err - } - deposits[i] = LegacyBridgeEvent{ - Event: ðDepositEvents[i].ContractEvent, - BridgeTransfer: database.BridgeTransfer{ - TokenPair: database.ETHTokenPair, - Tx: database.Transaction{ - FromAddress: bridgeEvent.From, - ToAddress: bridgeEvent.To, - Amount: bridgeEvent.Amount, - Data: bridgeEvent.ExtraData, - Timestamp: ethDepositEvents[i].Timestamp, - }, - }, - } - } - for i := range erc20DepositEvents { - bridgeEvent := bindings.L1StandardBridgeERC20DepositInitiated{Raw: *erc20DepositEvents[i].RLPLog} - err := UnpackLog(&bridgeEvent, &bridgeEvent.Raw, erc20DepositEventAbi.Name, l1StandardBridgeAbi) - if err != nil { - return nil, err - } - deposits[len(ethDepositEvents)+i] = LegacyBridgeEvent{ - Event: &erc20DepositEvents[i].ContractEvent, - BridgeTransfer: database.BridgeTransfer{ - TokenPair: database.TokenPair{LocalTokenAddress: bridgeEvent.L1Token, RemoteTokenAddress: bridgeEvent.L2Token}, - Tx: database.Transaction{ - FromAddress: bridgeEvent.From, - ToAddress: bridgeEvent.To, - Amount: bridgeEvent.Amount, - Data: bridgeEvent.ExtraData, - Timestamp: erc20DepositEvents[i].Timestamp, - }, - }, - } - } - - return deposits, nil -} - -func L2StandardBridgeLegacyWithdrawalInitiatedEvents(contractAddress common.Address, db *database.DB, fromHeight, toHeight *big.Int) ([]LegacyBridgeEvent, error) { - // The L2StandardBridge ABI contains the legacy events - l2StandardBridgeAbi, err := bindings.L2StandardBridgeMetaData.GetAbi() - if err != nil { - return nil, err - } - - withdrawalInitiatedEventAbi := l2StandardBridgeAbi.Events["WithdrawalInitiated"] - contractEventFilter := database.ContractEvent{ContractAddress: contractAddress, EventSignature: withdrawalInitiatedEventAbi.ID} - withdrawalEvents, err := db.ContractEvents.L2ContractEventsWithFilter(contractEventFilter, fromHeight, toHeight) - if err != nil { - return nil, err - } - - withdrawals := make([]LegacyBridgeEvent, len(withdrawalEvents)) - for i := range withdrawalEvents { - bridgeEvent := bindings.L2StandardBridgeWithdrawalInitiated{Raw: *withdrawalEvents[i].RLPLog} - err := UnpackLog(&bridgeEvent, &bridgeEvent.Raw, withdrawalInitiatedEventAbi.Name, l2StandardBridgeAbi) - if err != nil { - return nil, err - } - - withdrawals[i] = LegacyBridgeEvent{ - Event: &withdrawalEvents[i].ContractEvent, - BridgeTransfer: database.BridgeTransfer{ - TokenPair: database.ETHTokenPair, - Tx: database.Transaction{ - FromAddress: bridgeEvent.From, - ToAddress: bridgeEvent.To, - Amount: bridgeEvent.Amount, - Data: bridgeEvent.ExtraData, - Timestamp: withdrawalEvents[i].Timestamp, - }, - }, - } - } - - return withdrawals, nil -} diff --git a/indexer/processors/contracts/optimism_portal.go b/indexer/processors/contracts/optimism_portal.go deleted file mode 100644 index 025b2d59bc7e..000000000000 --- a/indexer/processors/contracts/optimism_portal.go +++ /dev/null @@ -1,142 +0,0 @@ -package contracts - -import ( - "errors" - "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-node/rollup/derive" - - "github.com/ethereum/go-ethereum/common" - "github.com/ethereum/go-ethereum/core/types" -) - -type OptimismPortalTransactionDepositEvent struct { - Event *database.ContractEvent - DepositTx *types.DepositTx - Tx database.Transaction - GasLimit *big.Int -} - -type OptimismPortalWithdrawalProvenEvent struct { - *bindings.OptimismPortalWithdrawalProven - Event *database.ContractEvent -} - -type OptimismPortalWithdrawalFinalizedEvent struct { - *bindings.OptimismPortalWithdrawalFinalized - Event *database.ContractEvent -} - -func OptimismPortalTransactionDepositEvents(contractAddress common.Address, db *database.DB, fromHeight, toHeight *big.Int) ([]OptimismPortalTransactionDepositEvent, error) { - optimismPortalAbi, err := bindings.OptimismPortalMetaData.GetAbi() - if err != nil { - return nil, err - } - transactionDepositedEventAbi := optimismPortalAbi.Events["TransactionDeposited"] - if transactionDepositedEventAbi.ID != derive.DepositEventABIHash { - return nil, errors.New("op-node DepositEventABIHash & optimism portal TransactionDeposited ID mismatch") - } - - contractEventFilter := database.ContractEvent{ContractAddress: contractAddress, EventSignature: transactionDepositedEventAbi.ID} - transactionDepositEvents, err := db.ContractEvents.L1ContractEventsWithFilter(contractEventFilter, fromHeight, toHeight) - if err != nil { - return nil, err - } - - optimismPortalTxDeposits := make([]OptimismPortalTransactionDepositEvent, len(transactionDepositEvents)) - for i := range transactionDepositEvents { - depositTx, err := derive.UnmarshalDepositLogEvent(transactionDepositEvents[i].RLPLog) - if err != nil { - return nil, err - } - - txDeposit := bindings.OptimismPortalTransactionDeposited{Raw: *transactionDepositEvents[i].RLPLog} - err = UnpackLog(&txDeposit, transactionDepositEvents[i].RLPLog, transactionDepositedEventAbi.Name, optimismPortalAbi) - if err != nil { - return nil, err - } - - mint := depositTx.Mint - if mint == nil { - mint = bigint.Zero - } - - optimismPortalTxDeposits[i] = OptimismPortalTransactionDepositEvent{ - Event: &transactionDepositEvents[i].ContractEvent, - DepositTx: depositTx, - GasLimit: new(big.Int).SetUint64(depositTx.Gas), - Tx: database.Transaction{ - FromAddress: txDeposit.From, - ToAddress: txDeposit.To, - Amount: mint, - Data: depositTx.Data, - Timestamp: transactionDepositEvents[i].Timestamp, - }, - } - } - - return optimismPortalTxDeposits, nil -} - -func OptimismPortalWithdrawalProvenEvents(contractAddress common.Address, db *database.DB, fromHeight, toHeight *big.Int) ([]OptimismPortalWithdrawalProvenEvent, error) { - optimismPortalAbi, err := bindings.OptimismPortalMetaData.GetAbi() - if err != nil { - return nil, err - } - - withdrawalProvenEventAbi := optimismPortalAbi.Events["WithdrawalProven"] - contractEventFilter := database.ContractEvent{ContractAddress: contractAddress, EventSignature: withdrawalProvenEventAbi.ID} - withdrawalProvenEvents, err := db.ContractEvents.L1ContractEventsWithFilter(contractEventFilter, fromHeight, toHeight) - if err != nil { - return nil, err - } - - provenWithdrawals := make([]OptimismPortalWithdrawalProvenEvent, len(withdrawalProvenEvents)) - for i := range withdrawalProvenEvents { - withdrawalProven := bindings.OptimismPortalWithdrawalProven{Raw: *withdrawalProvenEvents[i].RLPLog} - err := UnpackLog(&withdrawalProven, withdrawalProvenEvents[i].RLPLog, withdrawalProvenEventAbi.Name, optimismPortalAbi) - if err != nil { - return nil, err - } - - provenWithdrawals[i] = OptimismPortalWithdrawalProvenEvent{ - OptimismPortalWithdrawalProven: &withdrawalProven, - Event: &withdrawalProvenEvents[i].ContractEvent, - } - } - - return provenWithdrawals, nil -} - -func OptimismPortalWithdrawalFinalizedEvents(contractAddress common.Address, db *database.DB, fromHeight, toHeight *big.Int) ([]OptimismPortalWithdrawalFinalizedEvent, error) { - optimismPortalAbi, err := bindings.OptimismPortalMetaData.GetAbi() - if err != nil { - return nil, err - } - - withdrawalFinalizedEventAbi := optimismPortalAbi.Events["WithdrawalFinalized"] - contractEventFilter := database.ContractEvent{ContractAddress: contractAddress, EventSignature: withdrawalFinalizedEventAbi.ID} - withdrawalFinalizedEvents, err := db.ContractEvents.L1ContractEventsWithFilter(contractEventFilter, fromHeight, toHeight) - if err != nil { - return nil, err - } - - finalizedWithdrawals := make([]OptimismPortalWithdrawalFinalizedEvent, len(withdrawalFinalizedEvents)) - for i := range withdrawalFinalizedEvents { - withdrawalFinalized := bindings.OptimismPortalWithdrawalFinalized{Raw: *withdrawalFinalizedEvents[i].RLPLog} - err := UnpackLog(&withdrawalFinalized, withdrawalFinalizedEvents[i].RLPLog, withdrawalFinalizedEventAbi.Name, optimismPortalAbi) - if err != nil { - return nil, err - } - - finalizedWithdrawals[i] = OptimismPortalWithdrawalFinalizedEvent{ - OptimismPortalWithdrawalFinalized: &withdrawalFinalized, - Event: &withdrawalFinalizedEvents[i].ContractEvent, - } - } - - return finalizedWithdrawals, nil -} diff --git a/indexer/processors/contracts/standard_bridge.go b/indexer/processors/contracts/standard_bridge.go deleted file mode 100644 index 34f0eff7088f..000000000000 --- a/indexer/processors/contracts/standard_bridge.go +++ /dev/null @@ -1,173 +0,0 @@ -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-service/predeploys" - - "github.com/ethereum/go-ethereum/common" -) - -type StandardBridgeInitiatedEvent struct { - Event *database.ContractEvent - BridgeTransfer database.BridgeTransfer -} - -type StandardBridgeFinalizedEvent struct { - Event *database.ContractEvent - BridgeTransfer database.BridgeTransfer -} - -// StandardBridgeInitiatedEvents extracts all initiated bridge events from the contracts that follow the StandardBridge ABI. The -// correlated CrossDomainMessenger nonce is also parsed from the associated messenger events. -func StandardBridgeInitiatedEvents(chainSelector string, contractAddress common.Address, db *database.DB, fromHeight, toHeight *big.Int) ([]StandardBridgeInitiatedEvent, error) { - ethBridgeInitiatedEvents, err := _standardBridgeInitiatedEvents[bindings.StandardBridgeETHBridgeInitiated](contractAddress, chainSelector, db, fromHeight, toHeight) - if err != nil { - return nil, err - } - - erc20BridgeInitiatedEvents, err := _standardBridgeInitiatedEvents[bindings.StandardBridgeERC20BridgeInitiated](contractAddress, chainSelector, db, fromHeight, toHeight) - if err != nil { - return nil, err - } - - return append(ethBridgeInitiatedEvents, erc20BridgeInitiatedEvents...), nil -} - -// StandardBridgeFinalizedEvents extracts all finalization bridge events from the contracts that follow the StandardBridge ABI. The -// correlated CrossDomainMessenger nonce is also parsed by looking at the parameters of the corresponding relayMessage transaction data. -func StandardBridgeFinalizedEvents(chainSelector string, contractAddress common.Address, db *database.DB, fromHeight, toHeight *big.Int) ([]StandardBridgeFinalizedEvent, error) { - ethBridgeFinalizedEvents, err := _standardBridgeFinalizedEvents[bindings.StandardBridgeETHBridgeFinalized](contractAddress, chainSelector, db, fromHeight, toHeight) - if err != nil { - return nil, err - } - - erc20BridgeFinalizedEvents, err := _standardBridgeFinalizedEvents[bindings.StandardBridgeERC20BridgeFinalized](contractAddress, chainSelector, db, fromHeight, toHeight) - if err != nil { - return nil, err - } - - return append(ethBridgeFinalizedEvents, erc20BridgeFinalizedEvents...), nil -} - -// parse out eth or erc20 bridge initiated events -func _standardBridgeInitiatedEvents[BridgeEventType bindings.StandardBridgeETHBridgeInitiated | bindings.StandardBridgeERC20BridgeInitiated]( - contractAddress common.Address, chainSelector string, db *database.DB, fromHeight, toHeight *big.Int, -) ([]StandardBridgeInitiatedEvent, error) { - standardBridgeAbi, err := bindings.StandardBridgeMetaData.GetAbi() - if err != nil { - return nil, err - } - - var eventType BridgeEventType - var eventName string - switch any(eventType).(type) { - case bindings.StandardBridgeETHBridgeInitiated: - eventName = "ETHBridgeInitiated" - case bindings.StandardBridgeERC20BridgeInitiated: - eventName = "ERC20BridgeInitiated" - default: - panic("should not be here") - } - - initiatedBridgeEventAbi := standardBridgeAbi.Events[eventName] - contractEventFilter := database.ContractEvent{ContractAddress: contractAddress, EventSignature: initiatedBridgeEventAbi.ID} - initiatedBridgeEvents, err := db.ContractEvents.ContractEventsWithFilter(contractEventFilter, chainSelector, fromHeight, toHeight) - if err != nil { - return nil, err - } - - standardBridgeInitiatedEvents := make([]StandardBridgeInitiatedEvent, len(initiatedBridgeEvents)) - for i := range initiatedBridgeEvents { - erc20Bridge := bindings.StandardBridgeERC20BridgeInitiated{Raw: *initiatedBridgeEvents[i].RLPLog} - err := UnpackLog(&erc20Bridge, initiatedBridgeEvents[i].RLPLog, eventName, standardBridgeAbi) - if err != nil { - return nil, err - } - - // If an ETH bridge, lets fill in the needed fields - switch any(eventType).(type) { - case bindings.StandardBridgeETHBridgeInitiated: - erc20Bridge.LocalToken = predeploys.LegacyERC20ETHAddr - erc20Bridge.RemoteToken = predeploys.LegacyERC20ETHAddr - } - - standardBridgeInitiatedEvents[i] = StandardBridgeInitiatedEvent{ - Event: &initiatedBridgeEvents[i], - BridgeTransfer: database.BridgeTransfer{ - TokenPair: database.TokenPair{LocalTokenAddress: erc20Bridge.LocalToken, RemoteTokenAddress: erc20Bridge.RemoteToken}, - Tx: database.Transaction{ - FromAddress: erc20Bridge.From, - ToAddress: erc20Bridge.To, - Amount: erc20Bridge.Amount, - Data: erc20Bridge.ExtraData, - Timestamp: initiatedBridgeEvents[i].Timestamp, - }, - }, - } - } - - return standardBridgeInitiatedEvents, nil -} - -// parse out eth or erc20 bridge finalization events -func _standardBridgeFinalizedEvents[BridgeEventType bindings.StandardBridgeETHBridgeFinalized | bindings.StandardBridgeERC20BridgeFinalized]( - contractAddress common.Address, chainSelector string, db *database.DB, fromHeight, toHeight *big.Int, -) ([]StandardBridgeFinalizedEvent, error) { - standardBridgeAbi, err := bindings.StandardBridgeMetaData.GetAbi() - if err != nil { - return nil, err - } - - var eventType BridgeEventType - var eventName string - switch any(eventType).(type) { - case bindings.StandardBridgeETHBridgeFinalized: - eventName = "ETHBridgeFinalized" - case bindings.StandardBridgeERC20BridgeFinalized: - eventName = "ERC20BridgeFinalized" - default: - panic("should not be here") - } - - bridgeFinalizedEventAbi := standardBridgeAbi.Events[eventName] - contractEventFilter := database.ContractEvent{ContractAddress: contractAddress, EventSignature: bridgeFinalizedEventAbi.ID} - bridgeFinalizedEvents, err := db.ContractEvents.ContractEventsWithFilter(contractEventFilter, chainSelector, fromHeight, toHeight) - if err != nil { - return nil, err - } - - standardBridgeFinalizedEvents := make([]StandardBridgeFinalizedEvent, len(bridgeFinalizedEvents)) - for i := range bridgeFinalizedEvents { - erc20Bridge := bindings.StandardBridgeERC20BridgeFinalized{Raw: *bridgeFinalizedEvents[i].RLPLog} - err := UnpackLog(&erc20Bridge, bridgeFinalizedEvents[i].RLPLog, eventName, standardBridgeAbi) - if err != nil { - return nil, err - } - - // If an ETH bridge, lets fill in the needed fields - switch any(eventType).(type) { - case bindings.StandardBridgeETHBridgeFinalized: - erc20Bridge.LocalToken = predeploys.LegacyERC20ETHAddr - erc20Bridge.RemoteToken = predeploys.LegacyERC20ETHAddr - } - - standardBridgeFinalizedEvents[i] = StandardBridgeFinalizedEvent{ - Event: &bridgeFinalizedEvents[i], - BridgeTransfer: database.BridgeTransfer{ - TokenPair: database.TokenPair{LocalTokenAddress: erc20Bridge.LocalToken, RemoteTokenAddress: erc20Bridge.RemoteToken}, - Tx: database.Transaction{ - FromAddress: erc20Bridge.From, - ToAddress: erc20Bridge.To, - Amount: erc20Bridge.Amount, - Data: erc20Bridge.ExtraData, - Timestamp: bridgeFinalizedEvents[i].Timestamp, - }, - }, - } - } - - return standardBridgeFinalizedEvents, nil -} diff --git a/indexer/processors/contracts/utils.go b/indexer/processors/contracts/utils.go deleted file mode 100644 index 1c249d4b9765..000000000000 --- a/indexer/processors/contracts/utils.go +++ /dev/null @@ -1,43 +0,0 @@ -package contracts - -import ( - "errors" - "fmt" - - "github.com/ethereum/go-ethereum/accounts/abi" - "github.com/ethereum/go-ethereum/core/types" -) - -func UnpackLog(out interface{}, log *types.Log, name string, contractAbi *abi.ABI) error { - eventAbi, ok := contractAbi.Events[name] - if !ok { - return fmt.Errorf("event %s not present in supplied ABI", name) - } else if len(log.Topics) == 0 { - return errors.New("anonymous events are not supported") - } else if log.Topics[0] != eventAbi.ID { - return errors.New("event signature mismatch") - } - - err := contractAbi.UnpackIntoInterface(out, name, log.Data) - if err != nil { - return err - } - - // handle topics if present - if len(log.Topics) > 1 { - var indexedArgs abi.Arguments - for _, arg := range eventAbi.Inputs { - if arg.Indexed { - indexedArgs = append(indexedArgs, arg) - } - } - - // The first topic (event signature) is omitted - err := abi.ParseTopics(out, indexedArgs, log.Topics[1:]) - if err != nil { - return err - } - } - - return nil -} diff --git a/justfile b/justfile new file mode 100644 index 000000000000..36b27c7e439e --- /dev/null +++ b/justfile @@ -0,0 +1,44 @@ +issues: + ./ops/scripts/todo-checker.sh + +lint-shellcheck: + find . -type f -name '*.sh' -not -path '*/node_modules/*' -not -path './packages/contracts-bedrock/lib/*' -not -path './packages/contracts-bedrock/kout*/*' -exec sh -c 'echo \"Checking $1\"; shellcheck \"$1\"' _ {} \\; + +install-foundry: + curl -L https://foundry.paradigm.xyz | bash && just update-foundry + +update-foundry: + bash ./ops/scripts/install-foundry.sh + +check-foundry: + bash ./packages/contracts-bedrock/scripts/checks/check-foundry-install.sh + +install-kontrol: + curl -L https://kframework.org/install | bash && just update-kontrol + +update-kontrol: + kup install kontrol --version v$(jq -r .kontrol < versions.json) + +install-abigen: + go install github.com/ethereum/go-ethereum/cmd/abigen@$(jq -r .abigen < versions.json) + +print-abigen: + abigen --version | sed -e 's/[^0-9]/ /g' -e 's/^ *//g' -e 's/ *$//g' -e 's/ /./g' -e 's/^/v/' + +check-abigen: + [[ $(just print-abigen) = $(cat versions.json | jq -r '.abigen') ]] && echo '✓ abigen versions match' || (echo '✗ abigen version mismatch. Run `just upgrade:abigen` to upgrade.' && exit 1) + +upgrade-abigen: + jq '.abigen = $v' --arg v $(just print:abigen) <<<$(cat versions.json) > versions.json + +install-slither: + pip3 install slither-analyzer==$(jq -r .slither < versions.json) + +print-slither: + slither --version + +check-slither: + [[ $(just print-slither) = $(jq -r .slither < versions.json) ]] && echo '✓ slither versions match' || (echo '✗ slither version mismatch. Run `just upgrade-slither` to upgrade.' && exit 1) + +upgrade-slither: + jq '.slither = $v' --arg v $(just print-slither) <<<$(cat versions.json) > versions.json diff --git a/nx.json b/nx.json deleted file mode 100644 index 9ad91cf1a539..000000000000 --- a/nx.json +++ /dev/null @@ -1,85 +0,0 @@ -{ - "$schema": "./node_modules/nx/schemas/nx-schema.json", - "defaultBase": "develop", - "neverConnectToCloud": true, - "affected": { - "defaultBase": "develop" - }, - "implicitDependencies": { - "nx.json": "*", - "tsconfig.json": "*", - ".foundryrc": "*", - "pnpm.lock.yaml": "*", - ".npmrc": "*", - ".nvmrc": "*" - }, - "tasksRunnerOptions": { - "default": { - "runner": "nx-cloud", - "options": { - "accessToken": "MDdkNmQwZWEtOGYwNy00ZjhkLWI5NGMtNjBiNGExY2Q5MzI2fHJlYWQ=", - "cacheableOperations": [ - "lint", - "build", - "test", - "build:contracts", - "autogen:artifacts" - ] - } - } - }, - "namedInputs": { - "configsWorkspace": [ - "{workspaceRoot}/package.json", - "{workspaceRoot}/tsconfig.json" - ], - "configsProject": [ - "{projectRoot}/foundry.toml", - "{projectRoot}/tsconfig.json", - "{projectRoot}/package.json" - ], - "default": ["{projectRoot}/**/*", "configsWorkspace"], - "srcGenerated": [ - "{projectRoot}/src/contract-artifacts.ts", - "{projectRoot}/src/contract-deployed-artifacts.ts" - ], - "productionSrc": [ - "{projectRoot}/src/**/*", - "!{projectRoot}/src/**/*.spec.ts" - ], - "productionContracts": ["{projectRoot}/contracts/**/*"], - "production": ["productionSrc", "productionContracts"], - "testing": ["configsWorkspace", "default"] - }, - "targetDefaults": { - "lint": { - "inputs": ["default"] - }, - "test": { - "inputs": ["default", "testing", "^production"], - "dependsOn": ["^build"] - }, - "generate": { - "dependsOn": ["^build"] - }, - "build:contracts": { - "inputs": [ - "configsProject", - "productionContracts", - "^productionContracts" - ], - "dependsOn": ["^build"], - "outputs": ["{projectRoot}/artifacts", "{projectRoot}/forge-artifacts"] - }, - "build": { - "inputs": [ - "configsWorkspace", - "configsProject", - "production", - "^production" - ], - "dependsOn": ["^build", "build:contracts"], - "outputs": ["{projectRoot}/dist"] - } - } -} diff --git a/endpoint-monitor/.gitignore b/op-alt-da/.gitignore similarity index 100% rename from endpoint-monitor/.gitignore rename to op-alt-da/.gitignore diff --git a/op-plasma/Dockerfile b/op-alt-da/Dockerfile similarity index 100% rename from op-plasma/Dockerfile rename to op-alt-da/Dockerfile diff --git a/op-alt-da/Dockerfile.dockerignore b/op-alt-da/Dockerfile.dockerignore new file mode 100644 index 000000000000..96de4da2ef25 --- /dev/null +++ b/op-alt-da/Dockerfile.dockerignore @@ -0,0 +1,6 @@ +* + +!/op-service +!/op-alt-da +!/go.mod +!/go.sum diff --git a/op-alt-da/Makefile b/op-alt-da/Makefile new file mode 100644 index 000000000000..c98ea24c2095 --- /dev/null +++ b/op-alt-da/Makefile @@ -0,0 +1,22 @@ +GITCOMMIT ?= $(shell git rev-parse HEAD) +GITDATE ?= $(shell git show -s --format='%ct') +VERSION ?= v0.0.0 + +LDFLAGSSTRING +=-X main.GitCommit=$(GITCOMMIT) +LDFLAGSSTRING +=-X main.GitDate=$(GITDATE) +LDFLAGSSTRING +=-X main.Version=$(VERSION) +LDFLAGS := -ldflags "$(LDFLAGSSTRING)" + +da-server: + env GO111MODULE=on GOOS=$(TARGETOS) GOARCH=$(TARGETARCH) CGO_ENABLED=0 go build -v $(LDFLAGS) -o ./bin/da-server ./cmd/daserver + +clean: + rm bin/da-server + +test: + go test -v ./... + +.PHONY: \ + op-batcher \ + clean \ + test diff --git a/op-plasma/bindings/dataavailabilitychallenge.go b/op-alt-da/bindings/dataavailabilitychallenge.go similarity index 100% rename from op-plasma/bindings/dataavailabilitychallenge.go rename to op-alt-da/bindings/dataavailabilitychallenge.go diff --git a/op-alt-da/cli.go b/op-alt-da/cli.go new file mode 100644 index 000000000000..30ce2168f570 --- /dev/null +++ b/op-alt-da/cli.go @@ -0,0 +1,116 @@ +package altda + +import ( + "fmt" + "net/url" + "time" + + "github.com/urfave/cli/v2" +) + +var ( + EnabledFlagName = altDAFlags("enabled") + DaServerAddressFlagName = altDAFlags("da-server") + VerifyOnReadFlagName = altDAFlags("verify-on-read") + DaServiceFlagName = altDAFlags("da-service") + PutTimeoutFlagName = altDAFlags("put-timeout") + GetTimeoutFlagName = altDAFlags("get-timeout") + MaxConcurrentRequestsFlagName = altDAFlags("max-concurrent-da-requests") +) + +// altDAFlags returns the flag names for altDA +func altDAFlags(v string) string { + return "altda." + v +} + +func altDAEnvs(envprefix, v string) []string { + return []string{envprefix + "_ALTDA_" + v} +} + +func CLIFlags(envPrefix string, category string) []cli.Flag { + return []cli.Flag{ + &cli.BoolFlag{ + Name: EnabledFlagName, + Usage: "Enable Alt-DA mode\nAlt-DA Mode 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.", + Value: false, + EnvVars: altDAEnvs(envPrefix, "ENABLED"), + Category: category, + }, + &cli.StringFlag{ + Name: DaServerAddressFlagName, + Usage: "HTTP address of a DA Server", + EnvVars: altDAEnvs(envPrefix, "DA_SERVER"), + Category: category, + }, + &cli.BoolFlag{ + Name: VerifyOnReadFlagName, + Usage: "Verify input data matches the commitments from the DA storage service", + Value: true, + EnvVars: altDAEnvs(envPrefix, "VERIFY_ON_READ"), + Category: category, + }, + &cli.BoolFlag{ + Name: DaServiceFlagName, + Usage: "Use DA service type where commitments are generated by Alt-DA server", + Value: false, + EnvVars: altDAEnvs(envPrefix, "DA_SERVICE"), + Category: category, + }, + &cli.DurationFlag{ + Name: PutTimeoutFlagName, + Usage: "Timeout for put requests. 0 means no timeout.", + Value: time.Duration(0), + EnvVars: altDAEnvs(envPrefix, "PUT_TIMEOUT"), + }, + &cli.DurationFlag{ + Name: GetTimeoutFlagName, + Usage: "Timeout for get requests. 0 means no timeout.", + Value: time.Duration(0), + EnvVars: altDAEnvs(envPrefix, "GET_TIMEOUT"), + }, + &cli.Uint64Flag{ + Name: MaxConcurrentRequestsFlagName, + Usage: "Maximum number of concurrent requests to the DA server", + Value: 1, + EnvVars: altDAEnvs(envPrefix, "MAX_CONCURRENT_DA_REQUESTS"), + }, + } +} + +type CLIConfig struct { + Enabled bool + DAServerURL string + VerifyOnRead bool + GenericDA bool + PutTimeout time.Duration + GetTimeout time.Duration + MaxConcurrentRequests uint64 +} + +func (c CLIConfig) Check() error { + if c.Enabled { + if c.DAServerURL == "" { + return fmt.Errorf("DA server URL is required when altDA is enabled") + } + if _, err := url.Parse(c.DAServerURL); err != nil { + return fmt.Errorf("DA server URL is invalid: %w", err) + } + } + return nil +} + +func (c CLIConfig) NewDAClient() *DAClient { + return &DAClient{url: c.DAServerURL, verify: c.VerifyOnRead, precompute: !c.GenericDA, getTimeout: c.GetTimeout, putTimeout: c.PutTimeout} +} + +func ReadCLIConfig(c *cli.Context) CLIConfig { + return CLIConfig{ + Enabled: c.Bool(EnabledFlagName), + DAServerURL: c.String(DaServerAddressFlagName), + VerifyOnRead: c.Bool(VerifyOnReadFlagName), + GenericDA: c.Bool(DaServiceFlagName), + PutTimeout: c.Duration(PutTimeoutFlagName), + GetTimeout: c.Duration(GetTimeoutFlagName), + MaxConcurrentRequests: c.Uint64(MaxConcurrentRequestsFlagName), + } +} diff --git a/op-alt-da/cmd/daserver/README.md b/op-alt-da/cmd/daserver/README.md new file mode 100644 index 000000000000..cd100aad65ad --- /dev/null +++ b/op-alt-da/cmd/daserver/README.md @@ -0,0 +1,31 @@ +# AltDA 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-alt-da/cmd/daserver/entrypoint.go b/op-alt-da/cmd/daserver/entrypoint.go new file mode 100644 index 000000000000..32ff7d29f651 --- /dev/null +++ b/op-alt-da/cmd/daserver/entrypoint.go @@ -0,0 +1,59 @@ +package main + +import ( + "fmt" + + "github.com/urfave/cli/v2" + + altda "github.com/ethereum-optimism/optimism/op-alt-da" + "github.com/ethereum-optimism/optimism/op-service/ctxinterrupt" + oplog "github.com/ethereum-optimism/optimism/op-service/log" +) + +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 AltDA server...") + + var store altda.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 := altda.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) + } + }() + + return ctxinterrupt.Wait(cliCtx.Context) +} diff --git a/op-alt-da/cmd/daserver/file.go b/op-alt-da/cmd/daserver/file.go new file mode 100644 index 000000000000..4ff86bc64f7f --- /dev/null +++ b/op-alt-da/cmd/daserver/file.go @@ -0,0 +1,39 @@ +package main + +import ( + "context" + "encoding/hex" + "os" + "path" + + altda "github.com/ethereum-optimism/optimism/op-alt-da" +) + +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, altda.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-alt-da/cmd/daserver/flags.go b/op-alt-da/cmd/daserver/flags.go new file mode 100644 index 000000000000..82c48321d016 --- /dev/null +++ b/op-alt-da/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_ALTDA_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-alt-da/cmd/daserver/main.go b/op-alt-da/cmd/daserver/main.go new file mode 100644 index 000000000000..3ed37bd05321 --- /dev/null +++ b/op-alt-da/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" + "github.com/ethereum-optimism/optimism/op-service/ctxinterrupt" + oplog "github.com/ethereum-optimism/optimism/op-service/log" +) + +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 = "AltDA Storage Service" + app.Description = "Service for storing AltDA inputs" + app.Action = StartDAServer + + ctx := ctxinterrupt.WithSignalWaiterMain(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-alt-da/cmd/daserver/s3.go similarity index 93% rename from op-plasma/cmd/daserver/s3.go rename to op-alt-da/cmd/daserver/s3.go index 68eaf93270e4..aac1e2a84eaa 100644 --- a/op-plasma/cmd/daserver/s3.go +++ b/op-alt-da/cmd/daserver/s3.go @@ -9,7 +9,7 @@ import ( "github.com/minio/minio-go/v7" "github.com/minio/minio-go/v7/pkg/credentials" - plasma "github.com/ethereum-optimism/optimism/op-plasma" + altda "github.com/ethereum-optimism/optimism/op-alt-da" ) type S3Config struct { @@ -43,7 +43,7 @@ func (s *S3Store) Get(ctx context.Context, key []byte) ([]byte, error) { if err != nil { errResponse := minio.ToErrorResponse(err) if errResponse.Code == "NoSuchKey" { - return nil, plasma.ErrNotFound + return nil, altda.ErrNotFound } return nil, err } diff --git a/op-plasma/commitment.go b/op-alt-da/commitment.go similarity index 87% rename from op-plasma/commitment.go rename to op-alt-da/commitment.go index 7d1e310d4d35..cc5829ad4dc6 100644 --- a/op-plasma/commitment.go +++ b/op-alt-da/commitment.go @@ -1,8 +1,10 @@ -package plasma +package altda import ( "bytes" + "encoding/hex" "errors" + "fmt" "github.com/ethereum/go-ethereum/crypto" ) @@ -16,12 +18,25 @@ var ErrCommitmentMismatch = errors.New("commitment mismatch") // CommitmentType is the commitment type prefix. type CommitmentType byte +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. // KeccakCommitmentType 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" ) // CommitmentData is the binary representation of a commitment. @@ -30,6 +45,7 @@ type CommitmentData interface { Encode() []byte TxData() []byte Verify(input []byte) error + String() string } // Keccak256Commitment is an implementation of CommitmentData that uses Keccak256 as the commitment function. @@ -110,6 +126,10 @@ func (c Keccak256Commitment) Verify(input []byte) error { return nil } +func (c Keccak256Commitment) String() string { + return hex.EncodeToString(c.Encode()) +} + // NewGenericCommitment creates a new commitment from the given input. func NewGenericCommitment(input []byte) GenericCommitment { return GenericCommitment(input) @@ -142,3 +162,7 @@ func (c GenericCommitment) TxData() []byte { func (c GenericCommitment) Verify(input []byte) error { return nil } + +func (c GenericCommitment) String() string { + return hex.EncodeToString(c.Encode()) +} diff --git a/op-plasma/commitment_test.go b/op-alt-da/commitment_test.go similarity index 99% rename from op-plasma/commitment_test.go rename to op-alt-da/commitment_test.go index 96d845f8c63a..52abc5d88657 100644 --- a/op-plasma/commitment_test.go +++ b/op-alt-da/commitment_test.go @@ -1,4 +1,4 @@ -package plasma +package altda import ( "testing" diff --git a/op-plasma/daclient.go b/op-alt-da/daclient.go similarity index 89% rename from op-plasma/daclient.go rename to op-alt-da/daclient.go index e3e8f57a1e26..269b71f3c104 100644 --- a/op-plasma/daclient.go +++ b/op-alt-da/daclient.go @@ -1,4 +1,4 @@ -package plasma +package altda import ( "bytes" @@ -7,6 +7,7 @@ import ( "fmt" "io" "net/http" + "time" ) // ErrNotFound is returned when the server could not find the input. @@ -23,10 +24,16 @@ type DAClient struct { verify bool // whether commitment is precomputable (only applicable to keccak256) precompute bool + getTimeout time.Duration + putTimeout time.Duration } func NewDAClient(url string, verify bool, pc bool) *DAClient { - return &DAClient{url, verify, pc} + return &DAClient{ + url: url, + verify: verify, + precompute: pc, + } } // GetInput returns the input data for the given encoded commitment bytes. @@ -35,7 +42,8 @@ func (c *DAClient) GetInput(ctx context.Context, comm CommitmentData) ([]byte, e if err != nil { return nil, fmt.Errorf("failed to create HTTP request: %w", err) } - resp, err := http.DefaultClient.Do(req) + client := &http.Client{Timeout: c.getTimeout} + resp, err := client.Do(req) if err != nil { return nil, err } @@ -91,7 +99,8 @@ func (c *DAClient) setInputWithCommit(ctx context.Context, comm CommitmentData, return fmt.Errorf("failed to create HTTP request: %w", err) } req.Header.Set("Content-Type", "application/octet-stream") - resp, err := http.DefaultClient.Do(req) + client := &http.Client{Timeout: c.putTimeout} + resp, err := client.Do(req) if err != nil { return err } @@ -116,7 +125,8 @@ func (c *DAClient) setInput(ctx context.Context, img []byte) (CommitmentData, er return nil, fmt.Errorf("failed to create HTTP request: %w", err) } req.Header.Set("Content-Type", "application/octet-stream") - resp, err := http.DefaultClient.Do(req) + client := &http.Client{Timeout: c.putTimeout} + resp, err := client.Do(req) if err != nil { return nil, err } @@ -130,7 +140,7 @@ func (c *DAClient) setInput(ctx context.Context, img []byte) (CommitmentData, er return nil, err } - comm, err := DecodeGenericCommitment(b) + comm, err := DecodeCommitmentData(b) if err != nil { return nil, err } diff --git a/op-alt-da/daclient_test.go b/op-alt-da/daclient_test.go new file mode 100644 index 000000000000..d9f7902aadee --- /dev/null +++ b/op-alt-da/daclient_test.go @@ -0,0 +1,127 @@ +package altda + +import ( + "context" + "math/rand" + "testing" + + "github.com/ethereum-optimism/optimism/op-service/testlog" + "github.com/ethereum/go-ethereum/log" + "github.com/stretchr/testify/require" +) + +func TestDAClientPrecomputed(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: server.HttpEndpoint(), + VerifyOnRead: 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, NewKeccak256Commitment(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"))) + + _, err = client.GetInput(ctx, comm) + require.ErrorIs(t, err, ErrCommitmentMismatch) + + // test not found error + 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: server.HttpEndpoint(), + VerifyOnRead: false, + GenericDA: false, + } + 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.String(), NewKeccak256Commitment(input).String()) + + 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 = 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) +} diff --git a/op-alt-da/damgr.go b/op-alt-da/damgr.go new file mode 100644 index 000000000000..15814263c4ff --- /dev/null +++ b/op-alt-da/damgr.go @@ -0,0 +1,486 @@ +package altda + +import ( + "context" + "errors" + "fmt" + "io" + + "github.com/ethereum/go-ethereum/accounts/abi" + "github.com/ethereum/go-ethereum/common" + "github.com/ethereum/go-ethereum/core/types" + "github.com/ethereum/go-ethereum/crypto" + "github.com/ethereum/go-ethereum/log" + + "github.com/ethereum-optimism/optimism/op-alt-da/bindings" + "github.com/ethereum-optimism/optimism/op-service/eth" +) + +// ErrPendingChallenge is returned when data is not available but can still be challenged/resolved +// so derivation should halt temporarily. +var ErrPendingChallenge = errors.New("not found, pending challenge") + +// ErrExpiredChallenge is returned when a challenge was not resolved and derivation should skip this input. +var ErrExpiredChallenge = errors.New("challenge expired") + +// ErrMissingPastWindow is returned when the input data is MIA and cannot be challenged. +// This is a protocol fatal error. +var ErrMissingPastWindow = errors.New("data missing past window") + +// ErrInvalidChallenge is returned when a challenge event does is decoded but does not +// relate to the actual chain commitments. +var ErrInvalidChallenge = errors.New("invalid challenge") + +// L1Fetcher is the required interface for syncing the DA challenge contract state. +type L1Fetcher interface { + InfoAndTxsByHash(ctx context.Context, hash common.Hash) (eth.BlockInfo, types.Transactions, error) + FetchReceipts(ctx context.Context, blockHash common.Hash) (eth.BlockInfo, types.Receipts, error) + L1BlockRefByNumber(context.Context, uint64) (eth.L1BlockRef, error) +} + +// DAStorage interface for calling the DA storage server. +type DAStorage interface { + 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. +type HeadSignalFn func(eth.L1BlockRef) + +// Config is the relevant subset of rollup config for AltDA. +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. + ResolveWindow uint64 +} + +type DA struct { + log log.Logger + cfg Config + metrics Metricer + storage DAStorage + state *State // the DA state keeps track of all the commitments and their challenge status. + + challengeOrigin eth.BlockID // the highest l1 block we synced challenge contract events from + commitmentOrigin eth.BlockID // the highest l1 block we read commitments from + finalizedHead eth.L1BlockRef // the latest recorded finalized head as per the challenge contract + l1FinalizedHead eth.L1BlockRef // the latest recorded finalized head as per the l1 finalization signal + + // flag the reset function we are resetting because of an expired challenge + resetting bool + + finalizedHeadSignalHandler HeadSignalFn +} + +// NewAltDA creates a new AltDA instance with the given log and CLIConfig. +func NewAltDA(log log.Logger, cli CLIConfig, cfg Config, metrics Metricer) *DA { + return NewAltDAWithStorage(log, cfg, cli.NewDAClient(), metrics) +} + +// NewAltDAWithStorage creates a new AltDA instance with the given log and DAStorage interface. +func NewAltDAWithStorage(log log.Logger, cfg Config, storage DAStorage, metrics Metricer) *DA { + return &DA{ + log: log, + cfg: cfg, + storage: storage, + metrics: metrics, + state: NewState(log, metrics, cfg), + } +} + +// NewAltDAWithState creates an AltDA 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 NewAltDAWithState(log log.Logger, cfg Config, storage DAStorage, metrics Metricer, state *State) *DA { + return &DA{ + log: log, + cfg: cfg, + storage: storage, + metrics: metrics, + state: state, + } +} + +// OnFinalizedHeadSignal sets the callback function to be called when the finalized head is updated. +// This will signal to the engine queue that will set the proper L2 block as finalized. +func (d *DA) OnFinalizedHeadSignal(f HeadSignalFn) { + d.finalizedHeadSignalHandler = f +} + +// updateFinalizedHead sets the finalized head and prunes the state to the L1 Finalized head. +// the finalized head is set to the latest reference pruned in this way. +// It is called by the Finalize function, as it has an L1 finalized head to use. +func (d *DA) updateFinalizedHead(l1Finalized eth.L1BlockRef) { + d.l1FinalizedHead = l1Finalized + // Prune the state to the finalized head + d.state.Prune(l1Finalized.ID()) + d.finalizedHead = d.state.lastPrunedCommitment +} + +// updateFinalizedFromL1 updates the finalized head based on the challenge window. +// it uses the L1 fetcher to get the block reference at the finalized head - challenge window. +// It is called in AdvanceL1Origin if there are no commitments to finalize, as it has an L1 fetcher to use. +func (d *DA) updateFinalizedFromL1(ctx context.Context, l1 L1Fetcher) error { + // don't update if the finalized head is smaller than the challenge window + if d.l1FinalizedHead.Number < d.cfg.ChallengeWindow { + return nil + } + ref, err := l1.L1BlockRefByNumber(ctx, d.l1FinalizedHead.Number-d.cfg.ChallengeWindow) + if err != nil { + return err + } + d.finalizedHead = ref + return nil +} + +// Finalize sets the L1 finalized head signal and calls the handler function if set. +func (d *DA) Finalize(l1Finalized eth.L1BlockRef) { + d.updateFinalizedHead(l1Finalized) + d.metrics.RecordChallengesHead("finalized", d.finalizedHead.Number) + + // Record and Log the latest L1 finalized head + d.log.Info("received l1 finalized signal, forwarding altDA finalization to finalizedHeadSignalHandler", + "l1", l1Finalized, + "altDA", d.finalizedHead) + + // execute the handler function if set + // the handler function is called with the altDA finalized head + if d.finalizedHeadSignalHandler == nil { + d.log.Warn("finalized head signal handler not set") + return + } + d.finalizedHeadSignalHandler(d.finalizedHead) +} + +// LookAhead increments the challenges origin and process the new block if it exists. +// It is used when the derivation pipeline stalls due to missing data and we need to continue +// syncing challenge events until the challenge is resolved or expires. +func (d *DA) LookAhead(ctx context.Context, l1 L1Fetcher) error { + blkRef, err := l1.L1BlockRefByNumber(ctx, d.challengeOrigin.Number+1) + // temporary error, will do a backoff + if err != nil { + return err + } + return d.AdvanceChallengeOrigin(ctx, l1, blkRef.ID()) +} + +// Reset the challenge event derivation origin in case of L1 reorg +func (d *DA) Reset(ctx context.Context, base eth.L1BlockRef, baseCfg eth.SystemConfig) error { + // resetting due to expired challenge, do not clear state. + // If the DA source returns ErrReset, the pipeline is forced to reset by the rollup driver. + // In that case the Reset function will be called immediately, BEFORE the pipeline can + // call any further stage to step. Thus the state will NOT be cleared if the reset originates + // from this stage of the pipeline. + if d.resetting { + d.resetting = false + d.commitmentOrigin = base.ID() + d.state.ClearCommitments() + } else { + // resetting due to L1 reorg, clear state + d.challengeOrigin = base.ID() + d.commitmentOrigin = base.ID() + d.state.Reset() + } + return io.EOF +} + +// 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 CommitmentData, blockId eth.L1BlockRef) (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) + } + status := d.state.GetChallengeStatus(comm, blockId.Number) + // check if the challenge is expired + if status == ChallengeExpired { + // Don't track the expired commitment. If we hit this case we have seen an expired challenge, but never used the data. + // this indicates that the data which might cause us to reorg is expired (not to be used) so we can optimize by skipping the reorg. + // If we used the data & then expire the challenge later, we do that during the AdvanceChallengeOrigin step + return nil, ErrExpiredChallenge + } + // Record the commitment for later finalization / invalidation + d.state.TrackCommitment(comm, blockId) + d.log.Info("getting input", "comm", comm, "status", status) + + // Fetch the input from the DA storage. + data, err := d.storage.GetInput(ctx, comm) + notFound := errors.Is(ErrNotFound, err) + if err != nil && !notFound { + d.log.Error("failed to get preimage", "err", err) + // the storage client request failed for some other reason + // in which case derivation pipeline should be retried + return nil, err + } + + // If the data is not found, things are handled differently based on the challenge status. + if notFound { + log.Warn("data not found for the given commitment", "comm", comm, "status", status, "block", blockId.Number) + switch status { + case ChallengeUninitialized: + // If this commitment was never challenged & we can't find the data, treat it as unrecoverable. + if d.challengeOrigin.Number > blockId.Number+d.cfg.ChallengeWindow { + return nil, ErrMissingPastWindow + } + // Otherwise continue syncing challenges hoping it eventually is challenged and resolved + if err := d.LookAhead(ctx, l1); err != nil { + return nil, err + } + return nil, ErrPendingChallenge + case ChallengeActive: + // If the commitment is active, we must wait for the challenge to resolve + // hence we continue syncing new origins to sync the new challenge events. + // Active challenges are expired by the AdvanceChallengeOrigin function which calls state.ExpireChallenges + if err := d.LookAhead(ctx, l1); err != nil { + return nil, err + } + return nil, ErrPendingChallenge + case ChallengeResolved: + // Generic Commitments don't resolve from L1 so if we still can't find the data we're out of luck + if comm.CommitmentType() == GenericCommitmentType { + return nil, ErrMissingPastWindow + } + // Keccak commitments resolve from L1, so we should have the data in the challenge resolved input + if comm.CommitmentType() == Keccak256CommitmentType { + ch, _ := d.state.GetChallenge(comm, blockId.Number) + return ch.input, nil + } + } + } + // regardless of the potential notFound error, if this challenge status is not handled, return an error + if status != ChallengeUninitialized && status != ChallengeActive && status != ChallengeResolved { + return nil, fmt.Errorf("unknown challenge status: %v", status) + } + + return data, nil +} + +// AdvanceChallengeOrigin reads & stores challenge events for the given L1 block +func (d *DA) AdvanceChallengeOrigin(ctx context.Context, l1 L1Fetcher, block eth.BlockID) error { + // do not repeat for the same or old origin + if block.Number <= d.challengeOrigin.Number { + return nil + } + + // load challenge events from the l1 block + if err := d.loadChallengeEvents(ctx, l1, block); err != nil { + return err + } + + // Expire challenges + d.state.ExpireChallenges(block) + + // set and record the new challenge origin + d.challengeOrigin = block + d.metrics.RecordChallengesHead("latest", d.challengeOrigin.Number) + d.log.Info("processed altDA challenge origin", "origin", block) + return nil +} + +// AdvanceCommitmentOrigin updates the commitment origin and the finalized head. +func (d *DA) AdvanceCommitmentOrigin(ctx context.Context, l1 L1Fetcher, block eth.BlockID) error { + // do not repeat for the same origin + if block.Number <= d.commitmentOrigin.Number { + return nil + } + + // Expire commitments + err := d.state.ExpireCommitments(block) + if err != nil { + // warn the reset function not to clear the state + d.resetting = true + return err + } + + // set and record the new commitment origin + d.commitmentOrigin = block + d.metrics.RecordChallengesHead("latest", d.challengeOrigin.Number) + d.log.Info("processed altDA l1 origin", "origin", block, "finalized", d.finalizedHead.ID(), "l1-finalize", d.l1FinalizedHead.ID()) + + return nil +} + +// AdvanceL1Origin syncs any challenge events included in the l1 block, expires any active challenges +// after the new resolveWindow, computes and signals the new finalized head and sets the l1 block +// as the new head for tracking challenges and commitments. If forwards an error if any new challenge have expired to +// trigger a derivation reset. +func (d *DA) AdvanceL1Origin(ctx context.Context, l1 L1Fetcher, block eth.BlockID) error { + if err := d.AdvanceChallengeOrigin(ctx, l1, block); err != nil { + return fmt.Errorf("failed to advance challenge origin: %w", err) + } + if err := d.AdvanceCommitmentOrigin(ctx, l1, block); err != nil { + return fmt.Errorf("failed to advance commitment origin: %w", err) + } + // if there are no commitments, we can calculate the finalized head based on the challenge window + // otherwise, the finalization signal is used to set the finalized head + if d.state.NoCommitments() { + if err := d.updateFinalizedFromL1(ctx, l1); err != nil { + return err + } + d.metrics.RecordChallengesHead("finalized", d.finalizedHead.Number) + } + return nil +} + +// loadChallengeEvents fetches the l1 block receipts and updates the challenge status +func (d *DA) loadChallengeEvents(ctx context.Context, l1 L1Fetcher, block eth.BlockID) error { + // filter any challenge event logs in the block + logs, err := d.fetchChallengeLogs(ctx, l1, block) + if err != nil { + return err + } + + for _, log := range logs { + i := log.TxIndex + status, comm, bn, err := d.decodeChallengeStatus(log) + if err != nil { + d.log.Error("failed to decode challenge event", "block", block.Number, "tx", i, "log", log.Index, "err", err) + continue + } + switch status { + case ChallengeResolved: + // cached with input resolution call so not expensive + _, txs, err := l1.InfoAndTxsByHash(ctx, block.Hash) + if err != nil { + d.log.Error("failed to fetch l1 block", "block", block.Number, "err", err) + continue + } + // avoid panic in black swan case of faulty rpc + if uint(len(txs)) <= i { + d.log.Error("tx/receipt mismatch in InfoAndTxsByHash") + continue + } + // select the transaction corresponding to the receipt + tx := txs[i] + // txs and receipts must be in the same order + if tx.Hash() != log.TxHash { + d.log.Error("tx hash mismatch", "block", block.Number, "txIdx", i, "log", log.Index, "txHash", tx.Hash(), "receiptTxHash", log.TxHash) + 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.Info("challenge resolved", "block", block, "txIdx", i) + // Resolve challenge in state + if err := d.state.ResolveChallenge(comm, block, bn, input); err != nil { + d.log.Error("failed to resolve challenge", "block", block.Number, "txIdx", i, "err", err) + continue + } + case ChallengeActive: + // create challenge in state + d.log.Info("detected new active challenge", "block", block, "comm", comm) + d.state.CreateChallenge(comm, block, bn) + default: + d.log.Warn("skipping unknown challenge status", "block", block.Number, "tx", i, "log", log.Index, "status", status, "comm", comm) + } + } + 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) { + 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 + } + d.log.Info("loading challenges", "epoch", block.Number, "numReceipts", len(receipts)) + for _, rec := range receipts { + // skip error logs + if rec.Status != types.ReceiptStatusSuccessful { + continue + } + for _, log := range rec.Logs { + if log.Address == d.cfg.DAChallengeContractAddress && len(log.Topics) > 0 && log.Topics[0] == ChallengeStatusEventABIHash { + logs = append(logs, log) + } + } + } + + return logs, nil +} + +// decodeChallengeStatus decodes and validates a challenge event from a transaction log, returning the associated commitment bytes. +func (d *DA) decodeChallengeStatus(log *types.Log) (ChallengeStatus, CommitmentData, uint64, error) { + event, err := DecodeChallengeStatusEvent(log) + if err != nil { + return 0, nil, 0, err + } + comm, err := DecodeCommitmentData(event.ChallengedCommitment) + if err != nil { + return 0, nil, 0, err + } + d.log.Debug("decoded challenge status event", "log", log, "event", event, "comm", fmt.Sprintf("%x", comm.Encode())) + return ChallengeStatus(event.Status), comm, event.ChallengedBlockNumber.Uint64(), nil +} + +var ( + ChallengeStatusEventName = "ChallengeStatusChanged" + ChallengeStatusEventABI = "ChallengeStatusChanged(uint256,bytes,uint8)" + ChallengeStatusEventABIHash = crypto.Keccak256Hash([]byte(ChallengeStatusEventABI)) +) + +// DecodeChallengeStatusEvent decodes the challenge status event from the log data and the indexed challenged +// hash and block number from the topics. +func DecodeChallengeStatusEvent(log *types.Log) (*bindings.DataAvailabilityChallengeChallengeStatusChanged, error) { + // abi lazy loaded, cached after decoded once + dacAbi, err := bindings.DataAvailabilityChallengeMetaData.GetAbi() + if err != nil { + return nil, err + } + var event bindings.DataAvailabilityChallengeChallengeStatusChanged + err = dacAbi.UnpackIntoInterface(&event, ChallengeStatusEventName, log.Data) + if err != nil { + return nil, err + } + var indexed abi.Arguments + for _, arg := range dacAbi.Events[ChallengeStatusEventName].Inputs { + if arg.Indexed { + indexed = append(indexed, arg) + } + } + if err := abi.ParseTopics(&event, indexed, log.Topics[1:]); err != nil { + return nil, err + } + return &event, nil +} + +// DecodeResolvedInput decodes the preimage bytes from the tx input data. +func DecodeResolvedInput(data []byte) ([]byte, error) { + 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:]) + if err != nil { + return nil, err + } + rd, ok := args["resolveData"].([]byte) + if !ok || len(rd) == 0 { + return nil, fmt.Errorf("invalid resolve data") + } + return rd, nil +} diff --git a/op-alt-da/damgr_test.go b/op-alt-da/damgr_test.go new file mode 100644 index 000000000000..cba8f3de9b48 --- /dev/null +++ b/op-alt-da/damgr_test.go @@ -0,0 +1,304 @@ +package altda + +import ( + "context" + "math/big" + "math/rand" + "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/ethereum/go-ethereum/core/types" + "github.com/ethereum/go-ethereum/log" + "github.com/stretchr/testify/mock" + "github.com/stretchr/testify/require" +) + +func RandomData(rng *rand.Rand, size int) []byte { + out := make([]byte, size) + rng.Read(out) + return out +} + +func RandomCommitment(rng *rand.Rand) CommitmentData { + return NewKeccak256Commitment(RandomData(rng, 32)) +} + +func l1Ref(n uint64) eth.L1BlockRef { + return eth.L1BlockRef{Number: n} +} + +func bID(n uint64) eth.BlockID { + return eth.BlockID{Number: n} +} + +// TestFinalization checks that the finalized L1 block ref is returned correctly when pruning with and without challenges +func TestFinalization(t *testing.T) { + logger := testlog.Logger(t, log.LevelInfo) + cfg := Config{ + ResolveWindow: 6, + ChallengeWindow: 6, + } + rng := rand.New(rand.NewSource(1234)) + state := NewState(logger, &NoopMetrics{}, cfg) + + c1 := RandomCommitment(rng) + bn1 := uint64(2) + + // Track a commitment without a challenge + state.TrackCommitment(c1, l1Ref(bn1)) + require.NoError(t, state.ExpireCommitments(bID(7))) + require.Empty(t, state.expiredCommitments) + require.NoError(t, state.ExpireCommitments(bID(8))) + require.Empty(t, state.commitments) + + state.Prune(bID(bn1)) + require.Equal(t, eth.L1BlockRef{}, state.lastPrunedCommitment) + state.Prune(bID(7)) + require.Equal(t, eth.L1BlockRef{}, state.lastPrunedCommitment) + state.Prune(bID(8)) + require.Equal(t, eth.L1BlockRef{}, state.lastPrunedCommitment) + + // Track a commitment, challenge it, & then resolve it + c2 := RandomCommitment(rng) + bn2 := uint64(20) + state.TrackCommitment(c2, l1Ref(bn2)) + require.Equal(t, ChallengeUninitialized, state.GetChallengeStatus(c2, bn2)) + state.CreateChallenge(c2, bID(24), bn2) + require.Equal(t, ChallengeActive, state.GetChallengeStatus(c2, bn2)) + require.NoError(t, state.ResolveChallenge(c2, bID(30), bn2, nil)) + require.Equal(t, ChallengeResolved, state.GetChallengeStatus(c2, bn2)) + + // Expire Challenges & Comms after challenge period but before resolve end & assert they are not expired yet + require.NoError(t, state.ExpireCommitments(bID(28))) + require.Empty(t, state.expiredCommitments) + state.ExpireChallenges(bID(28)) + require.Empty(t, state.expiredChallenges) + + // Now fully expire them + require.NoError(t, state.ExpireCommitments(bID(30))) + require.Empty(t, state.commitments) + state.ExpireChallenges(bID(30)) + require.Empty(t, state.challenges) + + // Now finalize everything + state.Prune(bID(20)) + require.Equal(t, eth.L1BlockRef{}, state.lastPrunedCommitment) + state.Prune(bID(28)) + require.Equal(t, eth.L1BlockRef{}, state.lastPrunedCommitment) + state.Prune(bID(32)) + require.Equal(t, eth.L1BlockRef{Number: bn2}, state.lastPrunedCommitment) +} + +// TestExpireChallenges expires challenges and prunes the state for longer windows +// with commitments every 6 blocks. +func TestExpireChallenges(t *testing.T) { + logger := testlog.Logger(t, log.LevelInfo) + + cfg := Config{ + ResolveWindow: 90, + ChallengeWindow: 90, + } + + rng := rand.New(rand.NewSource(1234)) + state := NewState(logger, &NoopMetrics{}, cfg) + + comms := make(map[uint64]CommitmentData) + + i := uint64(3713854) + + // increment new commitments every 6 blocks + for ; i < 3713948; i += 6 { + comm := RandomCommitment(rng) + comms[i] = comm + logger.Info("set commitment", "block", i, "comm", comm) + state.TrackCommitment(comm, l1Ref(i)) + + require.NoError(t, state.ExpireCommitments(bID(i))) + state.ExpireChallenges(bID(i)) + } + + // activate a couple of subsequent challenges + state.CreateChallenge(comms[3713926], bID(3713948), 3713926) + state.CreateChallenge(comms[3713932], bID(3713950), 3713932) + + // continue incrementing commitments + for ; i < 3714038; i += 6 { + comm := RandomCommitment(rng) + comms[i] = comm + logger.Info("set commitment", "block", i) + state.TrackCommitment(comm, l1Ref(i)) + + require.NoError(t, state.ExpireCommitments(bID(i))) + state.ExpireChallenges(bID(i)) + } + + // Jump ahead to the end of the resolve window for comm included in block 3713926 which triggers a reorg + state.ExpireChallenges(bID(3714106)) + require.ErrorIs(t, state.ExpireCommitments(bID(3714106)), ErrReorgRequired) +} + +// TestDAChallengeDetached tests the lookahead + reorg handling of the da state +func TestDAChallengeDetached(t *testing.T) { + logger := testlog.Logger(t, log.LevelWarn) + + cfg := Config{ + ResolveWindow: 6, + ChallengeWindow: 6, + } + + rng := rand.New(rand.NewSource(1234)) + state := NewState(logger, &NoopMetrics{}, cfg) + + c1 := RandomCommitment(rng) + c2 := RandomCommitment(rng) + + // c1 at bn1 is missing, pipeline stalls + state.TrackCommitment(c1, l1Ref(1)) + + // c2 at bn2 is challenged at bn3 + state.CreateChallenge(c2, bID(3), uint64(2)) + require.Equal(t, ChallengeActive, state.GetChallengeStatus(c2, uint64(2))) + + // c1 is finally challenged at bn5 + state.CreateChallenge(c1, bID(5), uint64(1)) + + // c2 expires but should not trigger a reset because we're waiting for c1 to expire + state.ExpireChallenges(bID(10)) + err := state.ExpireCommitments(bID(10)) + require.NoError(t, err) + + // c1 expires finally + state.ExpireChallenges(bID(11)) + err = state.ExpireCommitments(bID(11)) + require.ErrorIs(t, err, ErrReorgRequired) + + // pruning finalized block is safe. It should not prune any commitments yet. + state.Prune(bID(1)) + require.Equal(t, eth.L1BlockRef{}, state.lastPrunedCommitment) + + // Perform reorg back to bn2 + state.ClearCommitments() + + // pipeline discovers c2 at bn2 + state.TrackCommitment(c2, l1Ref(2)) + // it is already marked as expired so it will be skipped without needing a reorg + require.Equal(t, ChallengeExpired, state.GetChallengeStatus(c2, uint64(2))) + + // later when we get to finalizing block 10 + margin, the pending challenge is safely pruned + // Note: We need to go through the expire then prune steps + state.ExpireChallenges(bID(201)) + err = state.ExpireCommitments(bID(201)) + require.ErrorIs(t, err, ErrReorgRequired) + state.Prune(bID(201)) + require.True(t, state.NoCommitments()) +} + +// cannot import from testutils at this time because of import cycle +type mockL1Fetcher struct { + mock.Mock +} + +func (m *mockL1Fetcher) InfoAndTxsByHash(ctx context.Context, hash common.Hash) (eth.BlockInfo, types.Transactions, error) { + out := m.Mock.Called(hash) + return out.Get(0).(eth.BlockInfo), out.Get(1).(types.Transactions), out.Error(2) +} + +func (m *mockL1Fetcher) ExpectInfoAndTxsByHash(hash common.Hash, info eth.BlockInfo, transactions types.Transactions, err error) { + m.Mock.On("InfoAndTxsByHash", hash).Once().Return(info, transactions, err) +} + +func (m *mockL1Fetcher) FetchReceipts(ctx context.Context, blockHash common.Hash) (eth.BlockInfo, types.Receipts, error) { + out := m.Mock.Called(blockHash) + return *out.Get(0).(*eth.BlockInfo), out.Get(1).(types.Receipts), out.Error(2) +} + +func (m *mockL1Fetcher) ExpectFetchReceipts(hash common.Hash, info eth.BlockInfo, receipts types.Receipts, err error) { + m.Mock.On("FetchReceipts", hash).Once().Return(&info, receipts, err) +} + +func (m *mockL1Fetcher) L1BlockRefByNumber(ctx context.Context, num uint64) (eth.L1BlockRef, error) { + out := m.Mock.Called(num) + return out.Get(0).(eth.L1BlockRef), out.Error(1) +} + +func (m *mockL1Fetcher) ExpectL1BlockRefByNumber(num uint64, ref eth.L1BlockRef, err error) { + m.Mock.On("L1BlockRefByNumber", num).Once().Return(ref, err) +} + +func TestAdvanceChallengeOrigin(t *testing.T) { + logger := testlog.Logger(t, log.LevelWarn) + ctx := context.Background() + + l1F := &mockL1Fetcher{} + defer l1F.AssertExpectations(t) + + storage := NewMockDAClient(logger) + + daddr := common.HexToAddress("0x978e3286eb805934215a88694d80b09aded68d90") + pcfg := Config{ + ChallengeWindow: 90, ResolveWindow: 90, DAChallengeContractAddress: daddr, + } + + bhash := common.HexToHash("0xd438144ffab918b1349e7cd06889c26800c26d8edc34d64f750e3e097166a09c") + bhash2 := common.HexToHash("0xd000004ffab918b1349e7cd06889c26800c26d8edc34d64f750e3e097166a09c") + bn := uint64(19) + comm := Keccak256Commitment(common.FromHex("eed82c1026bdd0f23461dd6ca515ef677624e63e6fc0ff91e3672af8eddf579d")) + + state := NewState(logger, &NoopMetrics{}, pcfg) + + da := NewAltDAWithState(logger, pcfg, storage, &NoopMetrics{}, state) + + receipts := types.Receipts{&types.Receipt{ + Type: 2, + Status: 1, + Logs: []*types.Log{ + { + BlockNumber: bn, + Address: daddr, + Topics: []common.Hash{ + common.HexToHash("0xa448afda7ea1e3a7a10fcab0c29fe9a9dd85791503bf0171f281521551c7ec05"), + }, + }, + { + BlockNumber: bn, + Address: daddr, + Topics: []common.Hash{ + common.HexToHash("0xc5d8c630ba2fdacb1db24c4599df78c7fb8cf97b5aecde34939597f6697bb1ad"), + common.HexToHash("0x000000000000000000000000000000000000000000000000000000000000000e"), + }, + Data: common.FromHex("0x00000000000000000000000000000000000000000000000000000000000000400000000000000000000000000000000000000000000000000000000000000001000000000000000000000000000000000000000000000000000000000000002100eed82c1026bdd0f23461dd6ca515ef677624e63e6fc0ff91e3672af8eddf579d00000000000000000000000000000000000000000000000000000000000000"), + }, + }, + BlockNumber: big.NewInt(int64(bn)), + }} + id := eth.BlockID{ + Number: bn, + Hash: bhash, + } + l1F.ExpectFetchReceipts(bhash, nil, receipts, nil) + + // Advance the challenge origin & ensure that we track the challenge + err := da.AdvanceChallengeOrigin(ctx, l1F, id) + require.NoError(t, err) + + c, has := state.GetChallenge(comm, 14) + require.True(t, has) + require.Equal(t, ChallengeActive, c.challengeStatus) + + // Advance the challenge origin until the challenge should be expired + for i := bn + 1; i < bn+1+pcfg.ChallengeWindow; i++ { + id2 := eth.BlockID{ + Number: i, + Hash: bhash2, + } + l1F.ExpectFetchReceipts(bhash2, nil, nil, nil) + err = da.AdvanceChallengeOrigin(ctx, l1F, id2) + require.NoError(t, err) + } + state.Prune(bID(bn + 1 + pcfg.ChallengeWindow + pcfg.ResolveWindow)) + + _, has = state.GetChallenge(comm, 14) + require.False(t, has) +} diff --git a/op-alt-da/damock.go b/op-alt-da/damock.go new file mode 100644 index 000000000000..0db129171a82 --- /dev/null +++ b/op-alt-da/damock.go @@ -0,0 +1,186 @@ +package altda + +import ( + "context" + "errors" + "io" + "net/http" + "sync" + "time" + + "github.com/ethereum-optimism/optimism/op-service/eth" + "github.com/ethereum/go-ethereum/common" + "github.com/ethereum/go-ethereum/ethdb" + "github.com/ethereum/go-ethereum/ethdb/memorydb" + "github.com/ethereum/go-ethereum/log" +) + +// MockDAClient mocks a DA storage provider to avoid running an HTTP DA server +// in unit tests. +type MockDAClient struct { + CommitmentType CommitmentType + store ethdb.KeyValueStore + log log.Logger +} + +func NewMockDAClient(log log.Logger) *MockDAClient { + return &MockDAClient{ + CommitmentType: Keccak256CommitmentType, + store: memorydb.New(), + log: log, + } +} + +func (c *MockDAClient) GetInput(ctx context.Context, key CommitmentData) ([]byte, error) { + bytes, err := c.store.Get(key.Encode()) + if err != nil { + return nil, ErrNotFound + } + return bytes, nil +} + +func (c *MockDAClient) SetInput(ctx context.Context, data []byte) (CommitmentData, error) { + key := NewCommitmentData(c.CommitmentType, data) + return key, c.store.Put(key.Encode(), data) +} + +func (c *MockDAClient) DeleteData(key []byte) error { + return c.store.Delete(key) +} + +type DAErrFaker struct { + Client *MockDAClient + + getInputErr error + setInputErr error +} + +func (f *DAErrFaker) GetInput(ctx context.Context, key CommitmentData) ([]byte, error) { + if err := f.getInputErr; err != nil { + f.getInputErr = nil + return nil, err + } + return f.Client.GetInput(ctx, key) +} + +func (f *DAErrFaker) SetInput(ctx context.Context, data []byte) (CommitmentData, error) { + if err := f.setInputErr; err != nil { + f.setInputErr = nil + return nil, err + } + return f.Client.SetInput(ctx, data) +} + +func (f *DAErrFaker) ActGetPreImageFail() { + f.getInputErr = errors.New("get input failed") +} + +func (f *DAErrFaker) ActSetPreImageFail() { + f.setInputErr = errors.New("set input failed") +} + +var Disabled = &AltDADisabled{} + +var ErrNotEnabled = errors.New("altDA not enabled") + +// AltDADisabled is a noop AltDA implementation for stubbing. +type AltDADisabled struct{} + +func (d *AltDADisabled) GetInput(ctx context.Context, l1 L1Fetcher, commitment CommitmentData, blockId eth.L1BlockRef) (eth.Data, error) { + return nil, ErrNotEnabled +} + +func (d *AltDADisabled) Reset(ctx context.Context, base eth.L1BlockRef, baseCfg eth.SystemConfig) error { + return io.EOF +} + +func (d *AltDADisabled) Finalize(ref eth.L1BlockRef) { +} + +func (d *AltDADisabled) OnFinalizedHeadSignal(f HeadSignalFn) { +} + +func (d *AltDADisabled) AdvanceL1Origin(ctx context.Context, l1 L1Fetcher, blockId eth.BlockID) error { + return ErrNotEnabled +} + +// FakeDAServer is a fake DA server for e2e tests. +// It is a small wrapper around DAServer that allows for setting request latencies, +// to mimic a DA service with slow responses (eg. eigenDA with 10 min batching interval). +type FakeDAServer struct { + *DAServer + putRequestLatency time.Duration + getRequestLatency time.Duration +} + +func NewFakeDAServer(host string, port int, log log.Logger) *FakeDAServer { + store := NewMemStore() + fakeDAServer := &FakeDAServer{ + DAServer: NewDAServer(host, port, store, log, true), + putRequestLatency: 0, + getRequestLatency: 0, + } + return fakeDAServer +} + +func (s *FakeDAServer) HandleGet(w http.ResponseWriter, r *http.Request) { + time.Sleep(s.getRequestLatency) + s.DAServer.HandleGet(w, r) +} + +func (s *FakeDAServer) HandlePut(w http.ResponseWriter, r *http.Request) { + time.Sleep(s.putRequestLatency) + s.DAServer.HandlePut(w, r) +} + +func (s *FakeDAServer) Start() error { + err := s.DAServer.Start() + if err != nil { + return err + } + // Override the HandleGet/Put method registrations + mux := http.NewServeMux() + mux.HandleFunc("/get/", s.HandleGet) + mux.HandleFunc("/put/", s.HandlePut) + s.httpServer.Handler = mux + return nil +} + +func (s *FakeDAServer) SetPutRequestLatency(latency time.Duration) { + s.putRequestLatency = latency +} + +func (s *FakeDAServer) SetGetRequestLatency(latency time.Duration) { + s.getRequestLatency = latency +} + +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 +} diff --git a/op-plasma/daserver.go b/op-alt-da/daserver.go similarity index 79% rename from op-plasma/daserver.go rename to op-alt-da/daserver.go index c1925d3e606d..94446944b543 100644 --- a/op-plasma/daserver.go +++ b/op-alt-da/daserver.go @@ -1,10 +1,13 @@ -package plasma +package altda import ( "context" + "crypto/rand" + "encoding/hex" "errors" "fmt" "io" + "math/big" "net" "net/http" "path" @@ -13,7 +16,6 @@ import ( "github.com/ethereum-optimism/optimism/op-service/rpc" "github.com/ethereum/go-ethereum/common/hexutil" - "github.com/ethereum/go-ethereum/crypto" "github.com/ethereum/go-ethereum/log" ) @@ -25,15 +27,16 @@ type KVStore interface { } type DAServer struct { - log log.Logger - endpoint string - store KVStore - tls *rpc.ServerTLSConfig - httpServer *http.Server - listener net.Listener + 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) *DAServer { +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, @@ -42,6 +45,7 @@ func NewDAServer(host string, port int, store KVStore, log log.Logger) *DAServer httpServer: &http.Server{ Addr: endpoint, }, + useGenericComm: useGenericComm, } } @@ -118,9 +122,8 @@ func (d *DAServer) HandleGet(w http.ResponseWriter, r *http.Request) { w.WriteHeader(http.StatusInternalServerError) return } - - w.WriteHeader(http.StatusOK) } + func (d *DAServer) HandlePut(w http.ResponseWriter, r *http.Request) { d.log.Info("PUT", "url", r.URL) @@ -138,20 +141,34 @@ func (d *DAServer) HandlePut(w http.ResponseWriter, r *http.Request) { } 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()...) - comm := GenericCommitment(crypto.Keccak256Hash(input).Bytes()) - if err = d.store.Put(r.Context(), comm.Encode(), input); err != nil { + } 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) @@ -166,14 +183,12 @@ func (d *DAServer) HandlePut(w http.ResponseWriter, r *http.Request) { w.WriteHeader(http.StatusInternalServerError) return } + w.WriteHeader(http.StatusOK) } - - w.WriteHeader(http.StatusOK) - } -func (b *DAServer) Endpoint() string { - return b.listener.Addr().String() +func (b *DAServer) HttpEndpoint() string { + return fmt.Sprintf("http://%s", b.listener.Addr().String()) } func (b *DAServer) Stop() error { diff --git a/op-alt-da/dastate.go b/op-alt-da/dastate.go new file mode 100644 index 000000000000..9d7a05382f64 --- /dev/null +++ b/op-alt-da/dastate.go @@ -0,0 +1,258 @@ +package altda + +import ( + "errors" + "fmt" + + "github.com/ethereum-optimism/optimism/op-service/eth" + "github.com/ethereum/go-ethereum/log" +) + +// ErrReorgRequired is returned when a commitment was derived but for which the challenge expired. +// This requires a reorg to rederive without the input even if the input was previously available. +var ErrReorgRequired = errors.New("reorg required") + +type ChallengeStatus uint8 + +const ( + ChallengeUninitialized ChallengeStatus = iota + ChallengeActive + ChallengeResolved + ChallengeExpired +) + +// Commitment keeps track of the onchain state of an input commitment. +type Commitment struct { + data CommitmentData + inclusionBlock eth.L1BlockRef // block where the commitment is included as calldata to the batcher inbox. + challengeWindowEnd uint64 // represents the block number after which the commitment can no longer be challenged. +} + +// Challenges are used to track the status of a challenge against a commitment. +type Challenge struct { + commData CommitmentData // the specific commitment which was challenged + commInclusionBlockNumber uint64 // block where the commitment is included as calldata to the batcher inbox + resolveWindowEnd uint64 // block number at which the challenge must be resolved by + input []byte // the input itself if it was resolved onchain + challengeStatus ChallengeStatus // status of the challenge based on the highest processed action +} + +func (c *Challenge) key() string { + return challengeKey(c.commData, c.commInclusionBlockNumber) +} + +func challengeKey(comm CommitmentData, inclusionBlockNumber uint64) string { + return fmt.Sprintf("%d%x", inclusionBlockNumber, comm.Encode()) +} + +// State tracks the commitment and their challenges in order of l1 inclusion. +// Commitments and Challenges are tracked in L1 inclusion order. They are tracked in two separate queues for Active and Expired commitments. +// When commitments are moved to Expired, if there is an active challenge, the DA Manager is informed that a commitment became invalid. +// Challenges and Commitments can be pruned when they are beyond a certain block number (e.g. when they are finalized). +// In the special case of a L2 reorg, challenges are still tracked but commitments are removed. +// This will allow the altDA fetcher to find the expired challenge. +type State struct { + commitments []Commitment // commitments where the challenge/resolve period has not expired yet + expiredCommitments []Commitment // commitments where the challenge/resolve period has expired but not finalized + challenges []*Challenge // challenges ordered by L1 inclusion + expiredChallenges []*Challenge // challenges ordered by L1 inclusion + challengesMap map[string]*Challenge // challenges by seralized comm + block number for easy lookup + lastPrunedCommitment eth.L1BlockRef // the last commitment to be pruned + cfg Config + log log.Logger + metrics Metricer +} + +func NewState(log log.Logger, m Metricer, cfg Config) *State { + return &State{ + commitments: make([]Commitment, 0), + expiredCommitments: make([]Commitment, 0), + challenges: make([]*Challenge, 0), + expiredChallenges: make([]*Challenge, 0), + challengesMap: make(map[string]*Challenge), + cfg: cfg, + log: log, + metrics: m, + } +} + +// ClearCommitments removes all tracked commitments but not challenges. +// This should be used to retain the challenge state when performing a L2 reorg +func (s *State) ClearCommitments() { + s.commitments = s.commitments[:0] + s.expiredCommitments = s.expiredCommitments[:0] +} + +// Reset clears the state. It should be used when a L1 reorg occurs. +func (s *State) Reset() { + s.commitments = s.commitments[:0] + s.expiredCommitments = s.expiredCommitments[:0] + s.challenges = s.challenges[:0] + s.expiredChallenges = s.expiredChallenges[:0] + clear(s.challengesMap) +} + +// CreateChallenge creates & tracks a challenge. It will overwrite earlier challenges if the +// same commitment is challenged again. +func (s *State) CreateChallenge(comm CommitmentData, inclusionBlock eth.BlockID, commBlockNumber uint64) { + c := &Challenge{ + commData: comm, + commInclusionBlockNumber: commBlockNumber, + resolveWindowEnd: inclusionBlock.Number + s.cfg.ResolveWindow, + challengeStatus: ChallengeActive, + } + s.challenges = append(s.challenges, c) + s.challengesMap[c.key()] = c +} + +// ResolveChallenge marks a challenge as resolved. It will return an error if there was not a corresponding challenge. +func (s *State) ResolveChallenge(comm CommitmentData, inclusionBlock eth.BlockID, commBlockNumber uint64, input []byte) error { + c, ok := s.challengesMap[challengeKey(comm, commBlockNumber)] + if !ok { + return errors.New("challenge was not tracked") + } + c.input = input + c.challengeStatus = ChallengeResolved + return nil +} + +// TrackCommitment stores a commitment in the State +func (s *State) TrackCommitment(comm CommitmentData, inclusionBlock eth.L1BlockRef) { + c := Commitment{ + data: comm, + inclusionBlock: inclusionBlock, + challengeWindowEnd: inclusionBlock.Number + s.cfg.ChallengeWindow, + } + s.commitments = append(s.commitments, c) +} + +// GetChallenge looks up a challenge against commitment + inclusion block. +func (s *State) GetChallenge(comm CommitmentData, commBlockNumber uint64) (*Challenge, bool) { + challenge, ok := s.challengesMap[challengeKey(comm, commBlockNumber)] + return challenge, ok +} + +// GetChallengeStatus looks up a challenge's status, or returns ChallengeUninitialized if there is no challenge. +func (s *State) GetChallengeStatus(comm CommitmentData, commBlockNumber uint64) ChallengeStatus { + challenge, ok := s.GetChallenge(comm, commBlockNumber) + if ok { + return challenge.challengeStatus + } + return ChallengeUninitialized +} + +// NoCommitments returns true iff it is not tracking any commitments or challenges. +func (s *State) NoCommitments() bool { + return len(s.challenges) == 0 && len(s.expiredChallenges) == 0 && len(s.commitments) == 0 && len(s.expiredCommitments) == 0 +} + +// ExpireCommitments moves commitments from the acive state map to the expired state map. +// commitments are considered expired when the challenge window ends without a challenge, or when the resolve window ends without a resolution to the challenge. +// This function processess commitments in order of inclusion until it finds a commitment which has not expired. +// If a commitment expires which did not resolve its challenge, it returns ErrReorgRequired to indicate that a L2 reorg should be performed. +func (s *State) ExpireCommitments(origin eth.BlockID) error { + var err error + for len(s.commitments) > 0 { + c := s.commitments[0] + challenge, ok := s.GetChallenge(c.data, c.inclusionBlock.Number) + + // A commitment expires when the challenge window ends without a challenge, + // or when the resolve window on the challenge ends. + expiresAt := c.challengeWindowEnd + if ok { + expiresAt = challenge.resolveWindowEnd + } + + // If the commitment expires the in future, return early + if expiresAt > origin.Number { + return err + } + + // If it has expired, move the commitment to the expired queue + s.log.Info("Expiring commitment", "comm", c.data, "commInclusionBlockNumber", c.inclusionBlock.Number, "origin", origin, "challenged", ok) + s.expiredCommitments = append(s.expiredCommitments, c) + s.commitments = s.commitments[1:] + + // If the expiring challenge was not resolved, return an error to indicate a reorg is required. + if ok && challenge.challengeStatus != ChallengeResolved { + err = ErrReorgRequired + } + } + return err +} + +// ExpireChallenges moves challenges from the active state map to the expired state map. +// challenges are considered expired when the oirgin is beyond the challenge's resolve window. +// This function processess challenges in order of inclusion until it finds a commitment which has not expired. +// This function must be called for every block because there is no contract event to expire challenges. +func (s *State) ExpireChallenges(origin eth.BlockID) { + for len(s.challenges) > 0 { + c := s.challenges[0] + + // If the challenge can still be resolved, return early + if c.resolveWindowEnd > origin.Number { + return + } + + // Move the challenge to the expired queue + s.log.Info("Expiring challenge", "comm", c.commData, "commInclusionBlockNumber", c.commInclusionBlockNumber, "origin", origin) + s.expiredChallenges = append(s.expiredChallenges, c) + s.challenges = s.challenges[1:] + + // Mark the challenge as expired if it was not resolved + if c.challengeStatus == ChallengeActive { + c.challengeStatus = ChallengeExpired + } + } +} + +// Prune removes challenges & commitments which have an expiry block number beyond the given block number. +func (s *State) Prune(origin eth.BlockID) { + // Commitments rely on challenges, so we prune commitments first. + s.pruneCommitments(origin) + s.pruneChallenges(origin) +} + +// pruneCommitments removes commitments which have are beyond a given block number. +// It will remove commitments in order of inclusion until it finds a commitment which is not beyond the given block number. +func (s *State) pruneCommitments(origin eth.BlockID) { + for len(s.expiredCommitments) > 0 { + c := s.expiredCommitments[0] + challenge, ok := s.GetChallenge(c.data, c.inclusionBlock.Number) + + // the commitment is considered removable when the challenge window ends without a challenge, + // or when the resolve window on the challenge ends. + expiresAt := c.challengeWindowEnd + if ok { + expiresAt = challenge.resolveWindowEnd + } + + // If the commitment is not beyond the given block number, return early + if expiresAt > origin.Number { + break + } + + // Remove the commitment + s.expiredCommitments = s.expiredCommitments[1:] + + // Record the latest inclusion block to be returned + s.lastPrunedCommitment = c.inclusionBlock + } +} + +// pruneChallenges removes challenges which have are beyond a given block number. +// It will remove challenges in order of inclusion until it finds a challenge which is not beyond the given block number. +func (s *State) pruneChallenges(origin eth.BlockID) { + for len(s.expiredChallenges) > 0 { + c := s.expiredChallenges[0] + + // If the challenge is not beyond the given block number, return early + if c.resolveWindowEnd > origin.Number { + break + } + + // Remove the challenge + s.expiredChallenges = s.expiredChallenges[1:] + delete(s.challengesMap, c.key()) + } +} diff --git a/op-alt-da/metrics.go b/op-alt-da/metrics.go new file mode 100644 index 000000000000..19ad576c7ea5 --- /dev/null +++ b/op-alt-da/metrics.go @@ -0,0 +1,73 @@ +package altda + +import ( + "github.com/ethereum-optimism/optimism/op-service/metrics" + "github.com/prometheus/client_golang/prometheus" +) + +type Metricer interface { + RecordActiveChallenge(commBlock uint64, startBlock uint64, hash []byte) + RecordResolvedChallenge(hash []byte) + RecordExpiredChallenge(hash []byte) + RecordChallengesHead(name string, num uint64) + RecordStorageError() +} + +type Metrics struct { + ChallengesStatus *prometheus.GaugeVec + ChallengesHead *prometheus.GaugeVec + + StorageErrors *metrics.Event +} + +var _ Metricer = (*Metrics)(nil) + +func MakeMetrics(ns string, factory metrics.Factory) *Metrics { + return &Metrics{ + ChallengesStatus: factory.NewGaugeVec(prometheus.GaugeOpts{ + Namespace: ns, + Name: "challenges_status", + Help: "Gauge representing the status of challenges synced", + }, []string{"status"}), + ChallengesHead: factory.NewGaugeVec(prometheus.GaugeOpts{ + Namespace: ns, + Name: "challenges_head", + Help: "Gauge representing the l1 heads of challenges synced", + }, []string{"type"}), + StorageErrors: metrics.NewEvent(factory, ns, "", "storage_errors", "errors when fetching or uploading to storage service"), + } +} + +func (m *Metrics) RecordChallenge(status string) { + m.ChallengesStatus.WithLabelValues(status).Inc() +} + +// RecordActiveChallenge records when a commitment is challenged including the block where the commitment +// is included, the block where the commitment was challenged and the commitment hash. +func (m *Metrics) RecordActiveChallenge(commBlock uint64, startBlock uint64, hash []byte) { + m.RecordChallenge("active") +} + +func (m *Metrics) RecordResolvedChallenge(hash []byte) { + m.RecordChallenge("resolved") +} + +func (m *Metrics) RecordExpiredChallenge(hash []byte) { + m.RecordChallenge("expired") +} + +func (m *Metrics) RecordStorageError() { + m.StorageErrors.Record() +} + +func (m *Metrics) RecordChallengesHead(name string, num uint64) { + m.ChallengesHead.WithLabelValues(name).Set(float64(num)) +} + +type NoopMetrics struct{} + +func (m *NoopMetrics) RecordActiveChallenge(commBlock uint64, startBlock uint64, hash []byte) {} +func (m *NoopMetrics) RecordResolvedChallenge(hash []byte) {} +func (m *NoopMetrics) RecordExpiredChallenge(hash []byte) {} +func (m *NoopMetrics) RecordChallengesHead(name string, num uint64) {} +func (m *NoopMetrics) RecordStorageError() {} diff --git a/op-alt-da/params.go b/op-alt-da/params.go new file mode 100644 index 000000000000..86339200f7fc --- /dev/null +++ b/op-alt-da/params.go @@ -0,0 +1,11 @@ +package altda + +// 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 + +// TxDataVersion1 is the version number for batcher transactions containing +// altDA commitments. It should not collide with DerivationVersion which is still +// used downstream when parsing the frames. +const TxDataVersion1 = 1 diff --git a/op-batcher/Makefile b/op-batcher/Makefile index 24d719c3b106..8e680ec2bec1 100644 --- a/op-batcher/Makefile +++ b/op-batcher/Makefile @@ -25,7 +25,7 @@ ifeq ($(shell uname),Darwin) endif op-batcher: - env GO111MODULE=on GOOS=$(TARGETOS) GOARCH=$(TARGETARCH) go build -v $(LDFLAGS) -o ./bin/op-batcher ./cmd + env GO111MODULE=on GOOS=$(TARGETOS) GOARCH=$(TARGETARCH) CGO_ENABLED=0 go build -v $(LDFLAGS) -o ./bin/op-batcher ./cmd clean: rm bin/op-batcher diff --git a/op-batcher/batcher/channel.go b/op-batcher/batcher/channel.go index 0aaa194a73c4..e35124d8525a 100644 --- a/op-batcher/batcher/channel.go +++ b/op-batcher/batcher/channel.go @@ -35,7 +35,7 @@ type channel struct { } func newChannel(log log.Logger, metr metrics.Metricer, cfg ChannelConfig, rollupCfg *rollup.Config, latestL1OriginBlockNum uint64) (*channel, error) { - cb, err := NewChannelBuilder(cfg, *rollupCfg, latestL1OriginBlockNum) + cb, err := NewChannelBuilder(cfg, rollupCfg, latestL1OriginBlockNum) if err != nil { return nil, fmt.Errorf("creating new channel: %w", err) } @@ -134,6 +134,9 @@ func (s *channel) updateInclusionBlocks() { func (s *channel) isTimedOut() bool { // Update min/max inclusion blocks for timeout check s.updateInclusionBlocks() + // Prior to the granite hard fork activating, the use of the shorter ChannelTimeout here may cause the batcher + // to believe the channel timed out when it was valid. It would then resubmit the blocks needlessly. + // This wastes batcher funds but doesn't cause any problems for the chain progressing safe head. return s.maxInclusionBlock-s.minInclusionBlock >= s.cfg.ChannelTimeout } @@ -160,21 +163,21 @@ func (s *channel) ID() derive.ChannelID { // NextTxData should only be called after HasTxData returned true. func (s *channel) NextTxData() txData { nf := s.cfg.MaxFramesPerTx() - txdata := txData{frames: make([]frameData, 0, nf)} + txdata := txData{frames: make([]frameData, 0, nf), asBlob: s.cfg.UseBlobs} for i := 0; i < nf && s.channelBuilder.HasFrame(); i++ { frame := s.channelBuilder.NextFrame() txdata.frames = append(txdata.frames, frame) } id := txdata.ID().String() - s.log.Debug("returning next tx data", "id", id, "num_frames", len(txdata.frames)) + s.log.Debug("returning next tx data", "id", id, "num_frames", len(txdata.frames), "as_blob", txdata.asBlob) s.pendingTransactions[id] = txdata return txdata } func (s *channel) HasTxData() bool { - if s.IsFull() || !s.cfg.MultiFrameTxs { + if s.IsFull() || !s.cfg.UseBlobs { return s.channelBuilder.HasFrame() } // collect enough frames if channel is not full yet @@ -226,6 +229,21 @@ func (c *channel) LatestL1Origin() eth.BlockID { return c.channelBuilder.LatestL1Origin() } +// OldestL1Origin returns the oldest L1 block origin from all the L2 blocks that have been added to the channel +func (c *channel) OldestL1Origin() eth.BlockID { + return c.channelBuilder.OldestL1Origin() +} + +// LatestL2 returns the latest L2 block from all the L2 blocks that have been added to the channel +func (c *channel) LatestL2() eth.BlockID { + return c.channelBuilder.LatestL2() +} + +// OldestL2 returns the oldest L2 block from all the L2 blocks that have been added to the channel +func (c *channel) OldestL2() eth.BlockID { + return c.channelBuilder.OldestL2() +} + func (s *channel) Close() { s.channelBuilder.Close() } diff --git a/op-batcher/batcher/channel_builder.go b/op-batcher/batcher/channel_builder.go index d63e1d45b5dc..cb4345e419d4 100644 --- a/op-batcher/batcher/channel_builder.go +++ b/op-batcher/batcher/channel_builder.go @@ -48,7 +48,7 @@ type frameData struct { // size approximation. type ChannelBuilder struct { cfg ChannelConfig - rollupCfg rollup.Config + rollupCfg *rollup.Config // L1 block number timeout of combined // - channel duration timeout, @@ -68,6 +68,12 @@ type ChannelBuilder struct { blocks []*types.Block // latestL1Origin is the latest L1 origin of all the L2 blocks that have been added to the channel latestL1Origin eth.BlockID + // oldestL1Origin is the oldest L1 origin of all the L2 blocks that have been added to the channel + oldestL1Origin eth.BlockID + // latestL2 is the latest L2 block of all the L2 blocks that have been added to the channel + latestL2 eth.BlockID + // oldestL2 is the oldest L2 block of all the L2 blocks that have been added to the channel + oldestL2 eth.BlockID // frames data queue, to be send as txs frames []frameData // total frames counter @@ -76,20 +82,11 @@ type ChannelBuilder struct { outputBytes int } -// newChannelBuilder creates a new channel builder or returns an error if the +// 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 co derive.ChannelOut - if cfg.BatchType == derive.SpanBatchType { - co, err = derive.NewSpanChannelOut(rollupCfg.Genesis.L2Time, rollupCfg.L2ChainID, cfg.CompressorConfig.TargetOutputSize, cfg.CompressorConfig.CompressionAlgo) - } else { - co, err = derive.NewSingularChannelOut(c) - } +func NewChannelBuilder(cfg ChannelConfig, rollupCfg *rollup.Config, latestL1OriginBlockNum uint64) (*ChannelBuilder, error) { + co, err := newChannelOut(cfg, rollupCfg) if err != nil { return nil, fmt.Errorf("creating channel out: %w", err) } @@ -105,6 +102,21 @@ func NewChannelBuilder(cfg ChannelConfig, rollupCfg rollup.Config, latestL1Origi return cb, nil } +// newChannelOut creates a new channel out based on the given configuration. +func newChannelOut(cfg ChannelConfig, rollupCfg *rollup.Config) (derive.ChannelOut, error) { + spec := rollup.NewChainSpec(rollupCfg) + if cfg.BatchType == derive.SpanBatchType { + return derive.NewSpanChannelOut( + cfg.CompressorConfig.TargetOutputSize, cfg.CompressorConfig.CompressionAlgo, + spec, derive.WithMaxBlocksPerSpanBatch(cfg.MaxBlocksPerSpanBatch)) + } + comp, err := cfg.CompressorConfig.NewCompressor() + if err != nil { + return nil, err + } + return derive.NewSingularChannelOut(comp, spec) +} + func (c *ChannelBuilder) ID() derive.ChannelID { return c.co.ID() } @@ -135,6 +147,21 @@ func (c *ChannelBuilder) LatestL1Origin() eth.BlockID { return c.latestL1Origin } +// OldestL1Origin returns the oldest L1 block origin from all the L2 blocks that have been added to the channel +func (c *ChannelBuilder) OldestL1Origin() eth.BlockID { + return c.oldestL1Origin +} + +// LatestL2 returns the latest L2 block from all the L2 blocks that have been added to the channel +func (c *ChannelBuilder) LatestL2() eth.BlockID { + return c.latestL2 +} + +// OldestL2 returns the oldest L2 block from all the L2 blocks that have been added to the channel +func (c *ChannelBuilder) OldestL2() eth.BlockID { + return c.oldestL2 +} + // AddBlock adds a block to the channel compression pipeline. IsFull should be // called afterwards to test whether the channel is full. If full, a new channel // must be started. @@ -151,7 +178,7 @@ func (c *ChannelBuilder) AddBlock(block *types.Block) (*derive.L1BlockInfo, erro return nil, c.FullErr() } - batch, l1info, err := derive.BlockToSingularBatch(&c.rollupCfg, block) + batch, l1info, err := derive.BlockToSingularBatch(c.rollupCfg, block) if err != nil { return l1info, fmt.Errorf("converting block to batch: %w", err) } @@ -172,6 +199,18 @@ func (c *ChannelBuilder) AddBlock(block *types.Block) (*derive.L1BlockInfo, erro Number: l1info.Number, } } + if c.oldestL1Origin.Number == 0 || l1info.Number < c.latestL1Origin.Number { + c.oldestL1Origin = eth.BlockID{ + Hash: l1info.BlockHash, + Number: l1info.Number, + } + } + if block.NumberU64() > c.latestL2.Number { + c.latestL2 = eth.ToBlockID(block) + } + if c.oldestL2.Number == 0 || block.NumberU64() < c.oldestL2.Number { + c.oldestL2 = eth.ToBlockID(block) + } if err = c.co.FullErr(); err != nil { c.setFullErr(err) @@ -219,7 +258,7 @@ func (c *ChannelBuilder) updateSwTimeout(batch *derive.SingularBatch) { } // updateTimeout updates the timeout block to the given block number if it is -// earlier than the current block timeout, or if it still unset. +// earlier than the current block timeout, or if it is still unset. // // If the timeout is updated, the provided reason will be set as the channel // full error reason in case the timeout is hit in the future. diff --git a/op-batcher/batcher/channel_builder_test.go b/op-batcher/batcher/channel_builder_test.go index 8d1cbd8219ee..1c25f06d81c0 100644 --- a/op-batcher/batcher/channel_builder_test.go +++ b/op-batcher/batcher/channel_builder_test.go @@ -22,7 +22,7 @@ import ( const latestL1BlockOrigin = 10 -var defaultTestRollupConfig = rollup.Config{ +var defaultTestRollupConfig = &rollup.Config{ Genesis: rollup.Genesis{L2: eth.BlockID{Number: 0}}, L2ChainID: big.NewInt(1234), } @@ -62,8 +62,8 @@ func newMiniL2BlockWithNumberParentAndL1Information(numTx int, l2Number *big.Int Difficulty: common.Big0, Number: big.NewInt(l1Number), Time: blockTime, - }, nil, nil, nil, trie.NewStackTrie(nil)) - l1InfoTx, err := derive.L1InfoDeposit(&defaultTestRollupConfig, eth.SystemConfig{}, 0, eth.BlockToInfo(l1Block), blockTime) + }, nil, nil, trie.NewStackTrie(nil)) + l1InfoTx, err := derive.L1InfoDeposit(defaultTestRollupConfig, eth.SystemConfig{}, 0, eth.BlockToInfo(l1Block), blockTime) if err != nil { panic(err) } @@ -77,23 +77,24 @@ func newMiniL2BlockWithNumberParentAndL1Information(numTx int, l2Number *big.Int return types.NewBlock(&types.Header{ Number: l2Number, ParentHash: parent, - }, txs, nil, nil, trie.NewStackTrie(nil)) + }, &types.Body{Transactions: txs}, nil, trie.NewStackTrie(nil)) } // addTooManyBlocks adds blocks to the channel until it hits an error, // which is presumably ErrTooManyRLPBytes. -func addTooManyBlocks(cb *ChannelBuilder) error { +func addTooManyBlocks(cb *ChannelBuilder, blockCount int) (int, error) { rng := rand.New(rand.NewSource(1234)) t := time.Now() - for i := 0; i < 10_000; i++ { + + for i := 0; i < blockCount; i++ { block := dtest.RandomL2BlockWithChainIdAndTime(rng, 1000, defaultTestRollupConfig.L2ChainID, t.Add(time.Duration(i)*time.Second)) _, err := cb.AddBlock(block) if err != nil { - return err + return i + 1, err } } - return nil + return blockCount, nil } // FuzzDurationTimeoutZeroMaxChannelDuration ensures that when whenever the MaxChannelDuration @@ -292,6 +293,7 @@ func TestChannelBuilderBatchType(t *testing.T) { f func(t *testing.T, batchType uint) }{ {"ChannelBuilder_MaxRLPBytesPerChannel", ChannelBuilder_MaxRLPBytesPerChannel}, + {"ChannelBuilder_MaxRLPBytesPerFjord", ChannelBuilder_MaxRLPBytesPerChannelFjord}, {"ChannelBuilder_OutputFramesMaxFrameIndex", ChannelBuilder_OutputFramesMaxFrameIndex}, {"ChannelBuilder_AddBlock", ChannelBuilder_AddBlock}, {"ChannelBuilder_PendingFrames_TotalFrames", ChannelBuilder_PendingFrames_TotalFrames}, @@ -367,7 +369,7 @@ func ChannelBuilder_OutputWrongFramePanic(t *testing.T, batchType uint) { // 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.NewSingularChannelOut(c) + co, err := derive.NewSingularChannelOut(c, rollup.NewChainSpec(defaultTestRollupConfig)) require.NoError(t, err) var buf bytes.Buffer fn, err := co.OutputFrame(&buf, channelConfig.MaxFrameSize) @@ -432,11 +434,7 @@ func TestChannelBuilder_OutputFrames(t *testing.T) { 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) - } + ChannelBuilder_OutputFrames_SpanBatch(t, algo) // to fill faster for brotli }) } } @@ -505,7 +503,8 @@ func ChannelBuilder_OutputFrames_SpanBatch(t *testing.T, algo derive.Compression func ChannelBuilder_MaxRLPBytesPerChannel(t *testing.T, batchType uint) { t.Parallel() channelConfig := defaultTestChannelConfig() - channelConfig.MaxFrameSize = rollup.SafeMaxRLPBytesPerChannel * 2 + chainSpec := rollup.NewChainSpec(defaultTestRollupConfig) + channelConfig.MaxFrameSize = chainSpec.MaxRLPBytesPerChannel(latestL1BlockOrigin) * 2 channelConfig.InitNoneCompressor() channelConfig.BatchType = batchType @@ -514,8 +513,52 @@ func ChannelBuilder_MaxRLPBytesPerChannel(t *testing.T, batchType uint) { require.NoError(t, err) // Add a block that overflows the [ChannelOut] - err = addTooManyBlocks(cb) + _, err = addTooManyBlocks(cb, 10_000) + require.ErrorIs(t, err, derive.ErrTooManyRLPBytes) +} + +// ChannelBuilder_MaxRLPBytesPerChannelFjord tests the [ChannelBuilder.OutputFrames] +// function works as intended postFjord. +// strategy: +// check preFjord how many blocks to fill the channel +// then check postFjord w/ double the amount of blocks +func ChannelBuilder_MaxRLPBytesPerChannelFjord(t *testing.T, batchType uint) { + t.Parallel() + channelConfig := defaultTestChannelConfig() + chainSpec := rollup.NewChainSpec(defaultTestRollupConfig) + channelConfig.MaxFrameSize = chainSpec.MaxRLPBytesPerChannel(latestL1BlockOrigin) * 2 + channelConfig.InitNoneCompressor() + channelConfig.BatchType = batchType + + // Construct the channel builder + cb, err := NewChannelBuilder(channelConfig, defaultTestRollupConfig, latestL1BlockOrigin) + require.NoError(t, err) + + // Count how many a block that overflows the [ChannelOut] + blockCount, err := addTooManyBlocks(cb, 10_000) require.ErrorIs(t, err, derive.ErrTooManyRLPBytes) + + // Create a new channel builder with fjord fork + now := time.Now() + fjordTime := uint64(now.Add(-1 * time.Second).Unix()) + rollupConfig := &rollup.Config{ + Genesis: rollup.Genesis{L2: eth.BlockID{Number: 0}}, + L2ChainID: big.NewInt(1234), + FjordTime: &fjordTime, + } + + chainSpec = rollup.NewChainSpec(rollupConfig) + channelConfig.MaxFrameSize = chainSpec.MaxRLPBytesPerChannel(uint64(now.Unix())) * 2 + channelConfig.InitNoneCompressor() + channelConfig.BatchType = batchType + + cb, err = NewChannelBuilder(channelConfig, rollupConfig, latestL1BlockOrigin) + require.NoError(t, err) + + // try add double the amount of block, it should not error + _, err = addTooManyBlocks(cb, 2*blockCount) + + require.NoError(t, err) } // ChannelBuilder_OutputFramesMaxFrameIndex tests the [ChannelBuilder.OutputFrames] @@ -712,6 +755,72 @@ func TestChannelBuilder_LatestL1Origin(t *testing.T) { require.Equal(t, uint64(2), cb.LatestL1Origin().Number) } +func TestChannelBuilder_OldestL1Origin(t *testing.T) { + cb, err := NewChannelBuilder(defaultTestChannelConfig(), defaultTestRollupConfig, latestL1BlockOrigin) + require.NoError(t, err) + require.Equal(t, eth.BlockID{}, cb.OldestL1Origin()) + + _, err = cb.AddBlock(newMiniL2BlockWithNumberParentAndL1Information(0, big.NewInt(1), common.Hash{}, 1, 100)) + require.NoError(t, err) + require.Equal(t, uint64(1), cb.OldestL1Origin().Number) + + _, err = cb.AddBlock(newMiniL2BlockWithNumberParentAndL1Information(0, big.NewInt(2), common.Hash{}, 1, 100)) + require.NoError(t, err) + require.Equal(t, uint64(1), cb.OldestL1Origin().Number) + + _, err = cb.AddBlock(newMiniL2BlockWithNumberParentAndL1Information(0, big.NewInt(3), common.Hash{}, 2, 110)) + require.NoError(t, err) + require.Equal(t, uint64(1), cb.OldestL1Origin().Number) + + _, err = cb.AddBlock(newMiniL2BlockWithNumberParentAndL1Information(0, big.NewInt(3), common.Hash{}, 1, 110)) + require.NoError(t, err) + require.Equal(t, uint64(1), cb.OldestL1Origin().Number) +} + +func TestChannelBuilder_LatestL2(t *testing.T) { + cb, err := NewChannelBuilder(defaultTestChannelConfig(), defaultTestRollupConfig, latestL1BlockOrigin) + require.NoError(t, err) + require.Equal(t, eth.BlockID{}, cb.LatestL2()) + + _, err = cb.AddBlock(newMiniL2BlockWithNumberParentAndL1Information(0, big.NewInt(1), common.Hash{}, 1, 100)) + require.NoError(t, err) + require.Equal(t, uint64(1), cb.LatestL2().Number) + + _, err = cb.AddBlock(newMiniL2BlockWithNumberParentAndL1Information(0, big.NewInt(2), common.Hash{}, 1, 100)) + require.NoError(t, err) + require.Equal(t, uint64(2), cb.LatestL2().Number) + + _, err = cb.AddBlock(newMiniL2BlockWithNumberParentAndL1Information(0, big.NewInt(3), common.Hash{}, 2, 110)) + require.NoError(t, err) + require.Equal(t, uint64(3), cb.LatestL2().Number) + + _, err = cb.AddBlock(newMiniL2BlockWithNumberParentAndL1Information(0, big.NewInt(3), common.Hash{}, 1, 110)) + require.NoError(t, err) + require.Equal(t, uint64(3), cb.LatestL2().Number) +} + +func TestChannelBuilder_OldestL2(t *testing.T) { + cb, err := NewChannelBuilder(defaultTestChannelConfig(), defaultTestRollupConfig, latestL1BlockOrigin) + require.NoError(t, err) + require.Equal(t, eth.BlockID{}, cb.OldestL2()) + + _, err = cb.AddBlock(newMiniL2BlockWithNumberParentAndL1Information(0, big.NewInt(1), common.Hash{}, 1, 100)) + require.NoError(t, err) + require.Equal(t, uint64(1), cb.OldestL2().Number) + + _, err = cb.AddBlock(newMiniL2BlockWithNumberParentAndL1Information(0, big.NewInt(2), common.Hash{}, 1, 100)) + require.NoError(t, err) + require.Equal(t, uint64(1), cb.OldestL2().Number) + + _, err = cb.AddBlock(newMiniL2BlockWithNumberParentAndL1Information(0, big.NewInt(3), common.Hash{}, 2, 110)) + require.NoError(t, err) + require.Equal(t, uint64(1), cb.OldestL2().Number) + + _, err = cb.AddBlock(newMiniL2BlockWithNumberParentAndL1Information(0, big.NewInt(3), common.Hash{}, 1, 110)) + require.NoError(t, err) + require.Equal(t, uint64(1), cb.OldestL2().Number) +} + func ChannelBuilder_PendingFrames_TotalFrames(t *testing.T, batchType uint) { const tnf = 9 rng := rand.New(rand.NewSource(94572314)) @@ -778,7 +887,7 @@ func ChannelBuilder_InputBytes(t *testing.T, batchType uint) { if batchType == derive.SingularBatchType { l += blockBatchRlpSize(t, block) } else { - singularBatch, l1Info, err := derive.BlockToSingularBatch(&defaultTestRollupConfig, block) + singularBatch, l1Info, err := derive.BlockToSingularBatch(defaultTestRollupConfig, block) require.NoError(err) err = spanBatch.AppendSingularBatch(singularBatch, l1Info.SequenceNumber) require.NoError(err) @@ -833,7 +942,7 @@ func ChannelBuilder_OutputBytes(t *testing.T, batchType uint) { func blockBatchRlpSize(t *testing.T, b *types.Block) int { t.Helper() - singularBatch, _, err := derive.BlockToSingularBatch(&defaultTestRollupConfig, b) + singularBatch, _, err := derive.BlockToSingularBatch(defaultTestRollupConfig, b) batch := derive.NewBatchData(singularBatch) require.NoError(t, err) var buf bytes.Buffer diff --git a/op-batcher/batcher/channel_config.go b/op-batcher/batcher/channel_config.go index b504d2480f3d..63e0d5d5deef 100644 --- a/op-batcher/batcher/channel_config.go +++ b/op-batcher/batcher/channel_config.go @@ -29,6 +29,9 @@ type ChannelConfig struct { SubSafetyMargin uint64 // The maximum byte-size a frame can have. MaxFrameSize uint64 + // MaxBlocksPerSpanBatch is the maximum number of blocks to add to a span batch. + // A value of 0 disables a maximum. + MaxBlocksPerSpanBatch int // Target number of frames to create per channel. // For blob transactions, this controls the number of blobs to target adding @@ -43,9 +46,15 @@ type ChannelConfig struct { // 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 + // UseBlobs indicates that this channel should be sent as a multi-blob + // transaction with one blob per frame. + UseBlobs bool +} + +// ChannelConfig returns a copy of itself. This makes a ChannelConfig a static +// ChannelConfigProvider of itself. +func (cc ChannelConfig) ChannelConfig() ChannelConfig { + return cc } // InitCompressorConfig (re)initializes the channel configuration's compressor @@ -75,8 +84,16 @@ func (cc *ChannelConfig) InitNoneCompressor() { cc.InitCompressorConfig(0, compressor.NoneKind, derive.Zlib) } +func (cc *ChannelConfig) ReinitCompressorConfig() { + cc.InitCompressorConfig( + cc.CompressorConfig.ApproxComprRatio, + cc.CompressorConfig.Kind, + cc.CompressorConfig.CompressionAlgo, + ) +} + func (cc *ChannelConfig) MaxFramesPerTx() int { - if !cc.MultiFrameTxs { + if !cc.UseBlobs { return 1 } return cc.TargetNumFrames diff --git a/op-batcher/batcher/channel_config_provider.go b/op-batcher/batcher/channel_config_provider.go new file mode 100644 index 000000000000..c65e83b8289f --- /dev/null +++ b/op-batcher/batcher/channel_config_provider.go @@ -0,0 +1,100 @@ +package batcher + +import ( + "context" + "math/big" + "time" + + "github.com/ethereum-optimism/optimism/op-service/eth" + "github.com/ethereum/go-ethereum/log" + "github.com/ethereum/go-ethereum/params" +) + +const randomByteCalldataGas = params.TxDataNonZeroGasEIP2028 + +type ( + ChannelConfigProvider interface { + ChannelConfig() ChannelConfig + } + + GasPricer interface { + SuggestGasPriceCaps(ctx context.Context) (tipCap *big.Int, baseFee *big.Int, blobBaseFee *big.Int, err error) + } + + DynamicEthChannelConfig struct { + log log.Logger + timeout time.Duration // query timeout + gasPricer GasPricer + + blobConfig ChannelConfig + calldataConfig ChannelConfig + lastConfig *ChannelConfig + } +) + +func NewDynamicEthChannelConfig(lgr log.Logger, + reqTimeout time.Duration, gasPricer GasPricer, + blobConfig ChannelConfig, calldataConfig ChannelConfig, +) *DynamicEthChannelConfig { + dec := &DynamicEthChannelConfig{ + log: lgr, + timeout: reqTimeout, + gasPricer: gasPricer, + blobConfig: blobConfig, + calldataConfig: calldataConfig, + } + // start with blob config + dec.lastConfig = &dec.blobConfig + return dec +} + +func (dec *DynamicEthChannelConfig) ChannelConfig() ChannelConfig { + ctx, cancel := context.WithTimeout(context.Background(), dec.timeout) + defer cancel() + tipCap, baseFee, blobBaseFee, err := dec.gasPricer.SuggestGasPriceCaps(ctx) + if err != nil { + dec.log.Warn("Error querying gas prices, returning last config", "err", err) + return *dec.lastConfig + } + + // We estimate the gas costs of a calldata and blob tx under the assumption that we'd fill + // a frame fully and compressed random channel data has few zeros, so they can be + // ignored in the calldata gas price estimation. + // It is also assumed that a calldata tx would contain exactly one full frame + // and a blob tx would contain target-num-frames many blobs. + + // It would be nicer to use core.IntrinsicGas, but we don't have the actual data at hand + calldataBytes := dec.calldataConfig.MaxFrameSize + 1 // + 1 version byte + calldataGas := big.NewInt(int64(calldataBytes*randomByteCalldataGas + params.TxGas)) + calldataPrice := new(big.Int).Add(baseFee, tipCap) + calldataCost := new(big.Int).Mul(calldataGas, calldataPrice) + + blobGas := big.NewInt(params.BlobTxBlobGasPerBlob * int64(dec.blobConfig.TargetNumFrames)) + blobCost := new(big.Int).Mul(blobGas, blobBaseFee) + // blobs still have intrinsic calldata costs + blobCalldataCost := new(big.Int).Mul(big.NewInt(int64(params.TxGas)), calldataPrice) + blobCost = blobCost.Add(blobCost, blobCalldataCost) + + // Now we compare the prices divided by the number of bytes that can be + // submitted for that price. + blobDataBytes := big.NewInt(eth.MaxBlobDataSize * int64(dec.blobConfig.TargetNumFrames)) + // The following will compare blobCost(a)/blobDataBytes(x) > calldataCost(b)/calldataBytes(y): + ay := new(big.Int).Mul(blobCost, big.NewInt(int64(calldataBytes))) + bx := new(big.Int).Mul(calldataCost, blobDataBytes) + // ratio only used for logging, more correct multiplicative calculation used for comparison + ayf, bxf := new(big.Float).SetInt(ay), new(big.Float).SetInt(bx) + costRatio := new(big.Float).Quo(ayf, bxf) + lgr := dec.log.New("base_fee", baseFee, "blob_base_fee", blobBaseFee, "tip_cap", tipCap, + "calldata_bytes", calldataBytes, "calldata_cost", calldataCost, + "blob_data_bytes", blobDataBytes, "blob_cost", blobCost, + "cost_ratio", costRatio) + + if ay.Cmp(bx) == 1 { + lgr.Info("Using calldata channel config") + dec.lastConfig = &dec.calldataConfig + return dec.calldataConfig + } + lgr.Info("Using blob channel config") + dec.lastConfig = &dec.blobConfig + return dec.blobConfig +} diff --git a/op-batcher/batcher/channel_config_provider_test.go b/op-batcher/batcher/channel_config_provider_test.go new file mode 100644 index 000000000000..169d122e210a --- /dev/null +++ b/op-batcher/batcher/channel_config_provider_test.go @@ -0,0 +1,126 @@ +package batcher + +import ( + "context" + "errors" + "log/slog" + "math/big" + "testing" + "time" + + "github.com/ethereum-optimism/optimism/op-service/eth" + "github.com/ethereum-optimism/optimism/op-service/testlog" + "github.com/stretchr/testify/require" +) + +type mockGasPricer struct { + err error + tipCap int64 + baseFee int64 + blobBaseFee int64 +} + +func (gp *mockGasPricer) SuggestGasPriceCaps(context.Context) (tipCap *big.Int, baseFee *big.Int, blobBaseFee *big.Int, err error) { + if gp.err != nil { + return nil, nil, nil, gp.err + } + return big.NewInt(gp.tipCap), big.NewInt(gp.baseFee), big.NewInt(gp.blobBaseFee), nil +} + +func TestDynamicEthChannelConfig_ChannelConfig(t *testing.T) { + calldataCfg := ChannelConfig{ + MaxFrameSize: 120_000 - 1, + TargetNumFrames: 1, + } + blobCfg := ChannelConfig{ + MaxFrameSize: eth.MaxBlobDataSize - 1, + TargetNumFrames: 3, // gets closest to amortized fixed tx costs + UseBlobs: true, + } + + tests := []struct { + name string + tipCap int64 + baseFee int64 + blobBaseFee int64 + wantCalldata bool + }{ + { + name: "much-cheaper-blobs", + tipCap: 1e3, + baseFee: 1e6, + blobBaseFee: 1, + }, + { + name: "close-cheaper-blobs", + tipCap: 1e3, + baseFee: 1e6, + blobBaseFee: 16e6, // because of amortized fixed 21000 tx cost, blobs are still cheaper here... + }, + { + name: "close-cheaper-calldata", + tipCap: 1e3, + baseFee: 1e6, + blobBaseFee: 161e5, // ...but then increasing the fee just a tiny bit makes blobs more expensive + wantCalldata: true, + }, + { + name: "much-cheaper-calldata", + tipCap: 1e3, + baseFee: 1e6, + blobBaseFee: 1e9, + wantCalldata: true, + }, + } + for _, tt := range tests { + t.Run(tt.name, func(t *testing.T) { + lgr, ch := testlog.CaptureLogger(t, slog.LevelInfo) + gp := &mockGasPricer{ + tipCap: tt.tipCap, + baseFee: tt.baseFee, + blobBaseFee: tt.blobBaseFee, + } + dec := NewDynamicEthChannelConfig(lgr, 1*time.Second, gp, blobCfg, calldataCfg) + cc := dec.ChannelConfig() + if tt.wantCalldata { + require.Equal(t, cc, calldataCfg) + require.NotNil(t, ch.FindLog(testlog.NewMessageContainsFilter("calldata"))) + require.Same(t, &dec.calldataConfig, dec.lastConfig) + } else { + require.Equal(t, cc, blobCfg) + require.NotNil(t, ch.FindLog(testlog.NewMessageContainsFilter("blob"))) + require.Same(t, &dec.blobConfig, dec.lastConfig) + } + }) + } + + t.Run("error-latest", func(t *testing.T) { + lgr, ch := testlog.CaptureLogger(t, slog.LevelInfo) + gp := &mockGasPricer{ + tipCap: 1, + baseFee: 1e3, + blobBaseFee: 1e6, // should return calldata cfg without error + err: errors.New("gp-error"), + } + dec := NewDynamicEthChannelConfig(lgr, 1*time.Second, gp, blobCfg, calldataCfg) + require.Equal(t, dec.ChannelConfig(), blobCfg) + require.NotNil(t, ch.FindLog( + testlog.NewLevelFilter(slog.LevelWarn), + testlog.NewMessageContainsFilter("returning last config"), + )) + + gp.err = nil + require.Equal(t, dec.ChannelConfig(), calldataCfg) + require.NotNil(t, ch.FindLog( + testlog.NewLevelFilter(slog.LevelInfo), + testlog.NewMessageContainsFilter("calldata"), + )) + + gp.err = errors.New("gp-error-2") + require.Equal(t, dec.ChannelConfig(), calldataCfg) + require.NotNil(t, ch.FindLog( + testlog.NewLevelFilter(slog.LevelWarn), + testlog.NewMessageContainsFilter("returning last config"), + )) + }) +} diff --git a/op-batcher/batcher/channel_manager.go b/op-batcher/batcher/channel_manager.go index b6f26d25fe86..1f22565c94c5 100644 --- a/op-batcher/batcher/channel_manager.go +++ b/op-batcher/batcher/channel_manager.go @@ -25,11 +25,11 @@ var ErrReorg = errors.New("block does not extend existing chain") // channel. // Public functions on channelManager are safe for concurrent access. type channelManager struct { - mu sync.Mutex - log log.Logger - metr metrics.Metricer - cfg ChannelConfig - rollupCfg *rollup.Config + mu sync.Mutex + log log.Logger + metr metrics.Metricer + cfgProvider ChannelConfigProvider + rollupCfg *rollup.Config // All blocks since the last request for new tx data. blocks []*types.Block @@ -49,13 +49,13 @@ type channelManager struct { closed bool } -func NewChannelManager(log log.Logger, metr metrics.Metricer, cfg ChannelConfig, rollupCfg *rollup.Config) *channelManager { +func NewChannelManager(log log.Logger, metr metrics.Metricer, cfgProvider ChannelConfigProvider, rollupCfg *rollup.Config) *channelManager { return &channelManager{ - log: log, - metr: metr, - cfg: cfg, - rollupCfg: rollupCfg, - txChannels: make(map[string]*channel), + log: log, + metr: metr, + cfgProvider: cfgProvider, + rollupCfg: rollupCfg, + txChannels: make(map[string]*channel), } } @@ -203,7 +203,8 @@ func (s *channelManager) ensureChannelWithSpace(l1Head eth.BlockID) error { return nil } - pc, err := newChannel(s.log, s.metr, s.cfg, s.rollupCfg, s.l1OriginLastClosedChannel.Number) + cfg := s.cfgProvider.ChannelConfig() + pc, err := newChannel(s.log, s.metr, cfg, s.rollupCfg, s.l1OriginLastClosedChannel.Number) if err != nil { return fmt.Errorf("creating new channel: %w", err) } @@ -216,10 +217,11 @@ func (s *channelManager) ensureChannelWithSpace(l1Head eth.BlockID) error { "l1Head", l1Head, "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, + "batch_type", cfg.BatchType, + "compression_algo", cfg.CompressorConfig.CompressionAlgo, + "target_num_frames", cfg.TargetNumFrames, + "max_frame_size", cfg.MaxFrameSize, + "use_blobs", cfg.UseBlobs, ) s.metr.RecordChannelOpened(pc.ID(), len(s.blocks)) @@ -320,7 +322,10 @@ func (s *channelManager) outputFrames() error { "num_frames", s.currentChannel.TotalFrames(), "input_bytes", inBytes, "output_bytes", outBytes, + "oldest_l1_origin", s.currentChannel.OldestL1Origin(), "l1_origin", lastClosedL1Origin, + "oldest_l2", s.currentChannel.OldestL2(), + "latest_l2", s.currentChannel.LatestL2(), "full_reason", s.currentChannel.FullErr(), "compr_ratio", comprRatio, "latest_l1_origin", s.l1OriginLastClosedChannel, diff --git a/op-batcher/batcher/channel_manager_test.go b/op-batcher/batcher/channel_manager_test.go index eafcc49d1143..a6271df9a535 100644 --- a/op-batcher/batcher/channel_manager_test.go +++ b/op-batcher/batcher/channel_manager_test.go @@ -67,19 +67,19 @@ func ChannelManagerReturnsErrReorg(t *testing.T, batchType uint) { a := types.NewBlock(&types.Header{ Number: big.NewInt(0), - }, nil, nil, nil, nil) + }, nil, nil, nil) b := types.NewBlock(&types.Header{ Number: big.NewInt(1), ParentHash: a.Hash(), - }, nil, nil, nil, nil) + }, nil, nil, nil) c := types.NewBlock(&types.Header{ Number: big.NewInt(2), ParentHash: b.Hash(), - }, nil, nil, nil, nil) + }, nil, nil, nil) x := types.NewBlock(&types.Header{ Number: big.NewInt(2), ParentHash: common.Hash{0xff}, - }, nil, nil, nil, nil) + }, nil, nil, nil) require.NoError(t, m.AddL2Block(a)) require.NoError(t, m.AddL2Block(b)) @@ -124,7 +124,7 @@ func ChannelManager_Clear(t *testing.T, batchType uint) { // clearing confirmed transactions, and resetting the pendingChannels map cfg.ChannelTimeout = 10 cfg.InitRatioCompressor(1, derive.Zlib) - m := NewChannelManager(log, metrics.NoopMetrics, cfg, &defaultTestRollupConfig) + m := NewChannelManager(log, metrics.NoopMetrics, cfg, defaultTestRollupConfig) // Channel Manager state should be empty by default require.Empty(m.blocks) @@ -169,7 +169,7 @@ func ChannelManager_Clear(t *testing.T, batchType uint) { b := types.NewBlock(&types.Header{ Number: big.NewInt(1), ParentHash: a.Hash(), - }, nil, nil, nil, nil) + }, nil, nil, nil) require.NoError(m.AddL2Block(b)) require.Len(m.blocks, 1) require.Equal(b.Hash(), m.tip) @@ -195,7 +195,7 @@ func ChannelManager_TxResend(t *testing.T, batchType uint) { log := testlog.Logger(t, log.LevelError) cfg := channelManagerTestConfig(120_000, batchType) cfg.CompressorConfig.TargetOutputSize = 1 // full on first block - m := NewChannelManager(log, metrics.NoopMetrics, cfg, &defaultTestRollupConfig) + m := NewChannelManager(log, metrics.NoopMetrics, cfg, defaultTestRollupConfig) m.Clear(eth.BlockID{}) a := derivetest.RandomL2BlockWithChainId(rng, 4, defaultTestRollupConfig.L2ChainID) @@ -234,7 +234,7 @@ func ChannelManagerCloseBeforeFirstUse(t *testing.T, batchType uint) { log := testlog.Logger(t, log.LevelCrit) m := NewChannelManager(log, metrics.NoopMetrics, channelManagerTestConfig(10000, batchType), - &defaultTestRollupConfig, + defaultTestRollupConfig, ) m.Clear(eth.BlockID{}) @@ -258,7 +258,7 @@ func ChannelManagerCloseNoPendingChannel(t *testing.T, batchType uint) { cfg := channelManagerTestConfig(10000, batchType) cfg.CompressorConfig.TargetOutputSize = 1 // full on first block cfg.ChannelTimeout = 1000 - m := NewChannelManager(log, metrics.NoopMetrics, cfg, &defaultTestRollupConfig) + m := NewChannelManager(log, metrics.NoopMetrics, cfg, defaultTestRollupConfig) m.Clear(eth.BlockID{}) a := newMiniL2Block(0) b := newMiniL2BlockWithNumberParent(0, big.NewInt(1), a.Hash()) @@ -283,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) { @@ -294,7 +294,7 @@ func ChannelManagerClosePendingChannel(t *testing.T, batchType uint) { log := testlog.Logger(t, log.LevelError) cfg := channelManagerTestConfig(10_000, batchType) cfg.ChannelTimeout = 1000 - m := NewChannelManager(log, metrics.NoopMetrics, cfg, &defaultTestRollupConfig) + m := NewChannelManager(log, metrics.NoopMetrics, cfg, defaultTestRollupConfig) m.Clear(eth.BlockID{}) numTx := 20 // Adjust number of txs to make 2 frames @@ -346,7 +346,7 @@ func TestChannelManager_Close_PartiallyPendingChannel(t *testing.T) { TargetNumFrames: 100, } cfg.InitNoneCompressor() - m := NewChannelManager(log, metrics.NoopMetrics, cfg, &defaultTestRollupConfig) + m := NewChannelManager(log, metrics.NoopMetrics, cfg, defaultTestRollupConfig) m.Clear(eth.BlockID{}) numTx := 3 // Adjust number of txs to make 2 frames @@ -398,7 +398,7 @@ func ChannelManagerCloseAllTxsFailed(t *testing.T, batchType uint) { cfg := channelManagerTestConfig(100, batchType) cfg.TargetNumFrames = 1000 cfg.InitNoneCompressor() - m := NewChannelManager(log, metrics.NoopMetrics, cfg, &defaultTestRollupConfig) + m := NewChannelManager(log, metrics.NoopMetrics, cfg, defaultTestRollupConfig) m.Clear(eth.BlockID{}) a := derivetest.RandomL2BlockWithChainId(rng, 1000, defaultTestRollupConfig.L2ChainID) @@ -471,7 +471,7 @@ func TestChannelManager_ChannelCreation(t *testing.T) { } { test := tt t.Run(test.name, func(t *testing.T) { - m := NewChannelManager(l, metrics.NoopMetrics, cfg, &defaultTestRollupConfig) + m := NewChannelManager(l, metrics.NoopMetrics, cfg, defaultTestRollupConfig) m.l1OriginLastClosedChannel = test.safeL1Block require.Nil(t, m.currentChannel) diff --git a/op-batcher/batcher/channel_test.go b/op-batcher/batcher/channel_test.go index 3d3e813d0ae8..7fa8030e771e 100644 --- a/op-batcher/batcher/channel_test.go +++ b/op-batcher/batcher/channel_test.go @@ -122,7 +122,7 @@ 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, + UseBlobs: false, TargetNumFrames: n, CompressorConfig: compressor.Config{ CompressionAlgo: derive.Zlib, @@ -163,7 +163,7 @@ 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, + UseBlobs: true, TargetNumFrames: n, CompressorConfig: compressor.Config{ CompressionAlgo: derive.Zlib, diff --git a/op-batcher/batcher/config.go b/op-batcher/batcher/config.go index 5180d8434b2f..250d893e2a71 100644 --- a/op-batcher/batcher/config.go +++ b/op-batcher/batcher/config.go @@ -8,10 +8,10 @@ import ( "github.com/urfave/cli/v2" + altda "github.com/ethereum-optimism/optimism/op-alt-da" "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" "github.com/ethereum-optimism/optimism/op-service/oppprof" @@ -56,6 +56,9 @@ type CLIConfig struct { // If using blobs, this setting is ignored and the max blob size is used. MaxL1TxSize uint64 + // Maximum number of blocks to add to a span batch. Default is 0 - no maximum. + MaxBlocksPerSpanBatch int + // The target number of frames to create per channel. Controls number of blobs // per blob tx, if using Blob DA. TargetNumFrames int @@ -85,22 +88,23 @@ type CLIConfig struct { BatchType uint // DataAvailabilityType is one of the values defined in op-batcher/flags/types.go and dictates - // the data availability type to use for posting batches, e.g. blobs vs calldata. + // the data availability type to use for posting batches, e.g. blobs vs calldata, or auto + // for choosing the most economic type dynamically at the start of each channel. DataAvailabilityType flags.DataAvailabilityType + // ActiveSequencerCheckDuration is the duration between checks to determine the active sequencer endpoint. + ActiveSequencerCheckDuration time.Duration + // TestUseMaxTxSizeForBlobs allows to set the blob size with MaxL1TxSize. // Should only be used for testing purposes. TestUseMaxTxSizeForBlobs bool - // 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 RPC oprpc.CLIConfig - PlasmaDA plasma.CLIConfig + AltDA altda.CLIConfig } func (c *CLIConfig) Check() error { @@ -172,6 +176,7 @@ func NewConfig(ctx *cli.Context) *CLIConfig { MaxPendingTransactions: ctx.Uint64(flags.MaxPendingTransactionsFlag.Name), MaxChannelDuration: ctx.Uint64(flags.MaxChannelDurationFlag.Name), MaxL1TxSize: ctx.Uint64(flags.MaxL1TxSizeBytesFlag.Name), + MaxBlocksPerSpanBatch: ctx.Int(flags.MaxBlocksPerSpanBatch.Name), TargetNumFrames: ctx.Int(flags.TargetNumFramesFlag.Name), ApproxComprRatio: ctx.Float64(flags.ApproxComprRatioFlag.Name), Compressor: ctx.String(flags.CompressorFlag.Name), @@ -187,6 +192,6 @@ func NewConfig(ctx *cli.Context) *CLIConfig { MetricsConfig: opmetrics.ReadCLIConfig(ctx), PprofConfig: oppprof.ReadCLIConfig(ctx), RPC: oprpc.ReadCLIConfig(ctx), - PlasmaDA: plasma.ReadCLIConfig(ctx), + AltDA: altda.ReadCLIConfig(ctx), } } diff --git a/op-batcher/batcher/driver.go b/op-batcher/batcher/driver.go index 56a12e4eb5c0..5050b674f1dc 100644 --- a/op-batcher/batcher/driver.go +++ b/op-batcher/batcher/driver.go @@ -11,21 +11,57 @@ import ( "sync/atomic" "time" + altda "github.com/ethereum-optimism/optimism/op-alt-da" "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" - plasma "github.com/ethereum-optimism/optimism/op-plasma" "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/txpool" "github.com/ethereum/go-ethereum/core/types" "github.com/ethereum/go-ethereum/log" + "golang.org/x/sync/errgroup" ) -var ErrBatcherNotRunning = errors.New("batcher is not running") -var ErrInboxTransactionFailed = errors.New("inbox transaction failed") +var ( + ErrBatcherNotRunning = errors.New("batcher is not running") + ErrInboxTransactionFailed = errors.New("inbox transaction failed") + emptyTxData = txData{ + frames: []frameData{ + { + data: []byte{}, + }, + }, + } +) + +type txRef struct { + id txID + isCancel bool + isBlob bool +} + +func (r txRef) String() string { + return r.string(func(id txID) string { return id.String() }) +} + +func (r txRef) TerminalString() string { + return r.string(func(id txID) string { return id.TerminalString() }) +} + +func (r txRef) string(txIDStringer func(txID) string) string { + if r.isCancel { + if r.isBlob { + return "blob-cancellation" + } else { + return "calldata-cancellation" + } + } + return txIDStringer(r.id) +} type L1Client interface { HeaderByNumber(ctx context.Context, number *big.Int) (*types.Header, error) @@ -50,8 +86,8 @@ type DriverSetup struct { Txmgr txmgr.TxManager L1Client L1Client EndpointProvider dial.L2EndpointProvider - ChannelConfig ChannelConfig - PlasmaDA *plasma.DAClient + ChannelConfig ChannelConfigProvider + AltDA *altda.DAClient } // BatchSubmitter encapsulates a service responsible for submitting L2 tx @@ -69,6 +105,10 @@ type BatchSubmitter struct { mutex sync.Mutex running bool + txpoolMutex sync.Mutex // guards txpoolState and txpoolBlockedBlob + txpoolState int + txpoolBlockedBlob bool + // lastStoredBlock is the last block loaded into `state`. If it is empty it should be set to the l2 safe head. lastStoredBlock eth.BlockID lastL1Tip eth.L1BlockRef @@ -101,6 +141,13 @@ func (l *BatchSubmitter) StartBatchSubmitting() error { l.clearState(l.shutdownCtx) l.lastStoredBlock = eth.BlockID{} + if l.Config.WaitNodeSync { + err := l.waitNodeSync() + if err != nil { + return fmt.Errorf("error waiting for node sync: %w", err) + } + } + l.wg.Add(1) go l.loop() @@ -171,7 +218,7 @@ func (l *BatchSubmitter) loadBlocksIntoState(ctx context.Context) error { l.lastStoredBlock = eth.BlockID{} return err } else if err != nil { - l.Log.Warn("failed to load block into state", "err", err) + l.Log.Warn("Failed to load block into state", "err", err) return err } l.lastStoredBlock = eth.ToBlockID(block) @@ -190,13 +237,15 @@ func (l *BatchSubmitter) loadBlocksIntoState(ctx context.Context) error { // loadBlockIntoState fetches & stores a single block into `state`. It returns the block it loaded. func (l *BatchSubmitter) loadBlockIntoState(ctx context.Context, blockNumber uint64) (*types.Block, error) { - ctx, cancel := context.WithTimeout(ctx, l.Config.NetworkTimeout) - defer cancel() l2Client, err := l.EndpointProvider.EthClient(ctx) if err != nil { return nil, fmt.Errorf("getting L2 client: %w", err) } - block, err := l2Client.BlockByNumber(ctx, new(big.Int).SetUint64(blockNumber)) + + cCtx, cancel := context.WithTimeout(ctx, l.Config.NetworkTimeout) + defer cancel() + + block, err := l2Client.BlockByNumber(cCtx, new(big.Int).SetUint64(blockNumber)) if err != nil { return nil, fmt.Errorf("getting L2 block: %w", err) } @@ -205,20 +254,22 @@ func (l *BatchSubmitter) loadBlockIntoState(ctx context.Context, blockNumber uin return nil, fmt.Errorf("adding L2 block to state: %w", err) } - l.Log.Info("added L2 block to local state", "block", eth.ToBlockID(block), "tx_count", len(block.Transactions()), "time", block.Time()) + l.Log.Info("Added L2 block to local state", "block", eth.ToBlockID(block), "tx_count", len(block.Transactions()), "time", block.Time()) return block, nil } // calculateL2BlockRangeToStore determines the range (start,end] that should be loaded into the local state. // It also takes care of initializing some local state (i.e. will modify l.lastStoredBlock in certain conditions) func (l *BatchSubmitter) calculateL2BlockRangeToStore(ctx context.Context) (eth.BlockID, eth.BlockID, error) { - ctx, cancel := context.WithTimeout(ctx, l.Config.NetworkTimeout) - defer cancel() rollupClient, err := l.EndpointProvider.RollupClient(ctx) if err != nil { return eth.BlockID{}, eth.BlockID{}, fmt.Errorf("getting rollup client: %w", err) } - syncStatus, err := rollupClient.SyncStatus(ctx) + + cCtx, cancel := context.WithTimeout(ctx, l.Config.NetworkTimeout) + defer cancel() + + syncStatus, err := rollupClient.SyncStatus(cCtx) // Ensure that we have the sync status if err != nil { return eth.BlockID{}, eth.BlockID{}, fmt.Errorf("failed to get sync status: %w", err) @@ -233,13 +284,13 @@ func (l *BatchSubmitter) calculateL2BlockRangeToStore(ctx context.Context) (eth. l.Log.Info("Starting batch-submitter work at safe-head", "safe", syncStatus.SafeL2) l.lastStoredBlock = syncStatus.SafeL2.ID() } else if l.lastStoredBlock.Number < syncStatus.SafeL2.Number { - l.Log.Warn("last submitted block lagged behind L2 safe head: batch submission will continue from the safe head now", "last", l.lastStoredBlock, "safe", syncStatus.SafeL2) + l.Log.Warn("Last submitted block lagged behind L2 safe head: batch submission will continue from the safe head now", "last", l.lastStoredBlock, "safe", syncStatus.SafeL2) l.lastStoredBlock = syncStatus.SafeL2.ID() } // Check if we should even attempt to load any blocks. TODO: May not need this check if syncStatus.SafeL2.Number >= syncStatus.UnsafeL2.Number { - return eth.BlockID{}, eth.BlockID{}, errors.New("L2 safe head ahead of L2 unsafe head") + return eth.BlockID{}, eth.BlockID{}, fmt.Errorf("L2 safe head(%d) ahead of L2 unsafe head(%d)", syncStatus.SafeL2.Number, syncStatus.UnsafeL2.Number) } return l.lastStoredBlock, syncStatus.UnsafeL2.ID(), nil @@ -256,30 +307,59 @@ func (l *BatchSubmitter) calculateL2BlockRangeToStore(ctx context.Context) (eth. // Submitted batch, but it is not valid // Missed L2 block somehow. +const ( + // Txpool states. Possible state transitions: + // TxpoolGood -> TxpoolBlocked: + // happens when ErrAlreadyReserved is ever returned by the TxMgr. + // TxpoolBlocked -> TxpoolCancelPending: + // happens once the send loop detects the txpool is blocked, and results in attempting to + // send a cancellation transaction. + // TxpoolCancelPending -> TxpoolGood: + // happens once the cancel transaction completes, whether successfully or in error. + TxpoolGood int = iota + TxpoolBlocked + TxpoolCancelPending +) + 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[txID]) - queue := txmgr.NewQueue[txID](l.killCtx, l.Txmgr, l.Config.MaxPendingTransactions) + receiptsCh := make(chan txmgr.TxReceipt[txRef]) + queue := txmgr.NewQueue[txRef](l.killCtx, l.Txmgr, l.Config.MaxPendingTransactions) + daGroup := &errgroup.Group{} + // errgroup with limit of 0 means no goroutine is able to run concurrently, + // so we only set the limit if it is greater than 0. + if l.Config.MaxConcurrentDARequests > 0 { + daGroup.SetLimit(int(l.Config.MaxConcurrentDARequests)) + } // start the receipt/result processing loop receiptLoopDone := make(chan struct{}) defer close(receiptLoopDone) // shut down receipt loop + + l.txpoolMutex.Lock() + l.txpoolState = TxpoolGood + l.txpoolMutex.Unlock() go func() { for { select { case r := <-receiptsCh: - l.Log.Info("handling receipt", "id", r.ID) + l.txpoolMutex.Lock() + if errors.Is(r.Err, txpool.ErrAlreadyReserved) && l.txpoolState == TxpoolGood { + l.txpoolState = TxpoolBlocked + l.txpoolBlockedBlob = r.ID.isBlob + l.Log.Info("incompatible tx in txpool", "is_blob", r.ID.isBlob) + } else if r.ID.isCancel && l.txpoolState == TxpoolCancelPending { + // Set state to TxpoolGood even if the cancellation transaction ended in error + // since the stuck transaction could have cleared while we were waiting. + l.txpoolState = TxpoolGood + l.Log.Info("txpool may no longer be blocked", "err", r.Err) + } + l.txpoolMutex.Unlock() + l.Log.Info("Handling receipt", "id", r.ID) l.handleReceipt(r) case <-receiptLoopDone: - l.Log.Info("receipt processing loop done") + l.Log.Info("Receipt processing loop done") return } } @@ -289,9 +369,20 @@ func (l *BatchSubmitter) loop() { defer ticker.Stop() publishAndWait := func() { - l.publishStateToL1(queue, receiptsCh) + l.publishStateToL1(queue, receiptsCh, daGroup) if !l.Txmgr.IsClosed() { - queue.Wait() + if l.Config.UseAltDA { + l.Log.Info("Waiting for altDA writes to complete...") + err := daGroup.Wait() + if err != nil { + l.Log.Error("Error returned by one of the altda goroutines waited on", "err", err) + } + } + l.Log.Info("Waiting for L1 txs to be confirmed...") + err := queue.Wait() + if err != nil { + l.Log.Error("Error returned by one of the txmgr goroutines waited on", "err", err) + } } else { l.Log.Info("Txmgr is closed, remaining channel data won't be sent") } @@ -300,6 +391,9 @@ func (l *BatchSubmitter) loop() { for { select { case <-ticker.C: + if !l.checkTxpool(queue, receiptsCh) { + continue + } if err := l.loadBlocksIntoState(l.shutdownCtx); errors.Is(err, ErrReorg) { err := l.state.Close() if err != nil { @@ -315,7 +409,7 @@ func (l *BatchSubmitter) loop() { l.clearState(l.shutdownCtx) continue } - l.publishStateToL1(queue, receiptsCh) + l.publishStateToL1(queue, receiptsCh, daGroup) case <-l.shutdownCtx.Done(): if l.Txmgr.IsClosed() { l.Log.Info("Txmgr is closed, remaining channel data won't be sent") @@ -341,15 +435,16 @@ 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() - + ctx := l.shutdownCtx rollupClient, err := l.EndpointProvider.RollupClient(ctx) if err != nil { return fmt.Errorf("failed to get rollup client: %w", err) } - l1Tip, err := l.l1Tip(ctx) + cCtx, cancel := context.WithTimeout(ctx, l.Config.NetworkTimeout) + defer cancel() + + l1Tip, err := l.l1Tip(cCtx) if err != nil { return fmt.Errorf("failed to retrieve l1 tip: %w", err) } @@ -357,7 +452,7 @@ func (l *BatchSubmitter) waitNodeSync() error { 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()) + recentBlock, found, err := eth.CheckRecentTxs(cCtx, l.L1Client, l.Config.CheckRecentTxsDepth, l.Txmgr.From()) if err != nil { return fmt.Errorf("failed checking recent batcher txs: %w", err) } @@ -371,17 +466,21 @@ func (l *BatchSubmitter) waitNodeSync() error { // 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[txID], receiptsCh chan txmgr.TxReceipt[txID]) { +func (l *BatchSubmitter) publishStateToL1(queue *txmgr.Queue[txRef], receiptsCh chan txmgr.TxReceipt[txRef], daGroup *errgroup.Group) { for { // if the txmgr is closed, we stop the transaction sending if l.Txmgr.IsClosed() { l.Log.Info("Txmgr is closed, aborting state publishing") return } - err := l.publishTxToL1(l.killCtx, queue, receiptsCh) + if !l.checkTxpool(queue, receiptsCh) { + l.Log.Info("txpool state is not good, aborting state publishing") + return + } + err := l.publishTxToL1(l.killCtx, queue, receiptsCh, daGroup) if err != nil { if err != io.EOF { - l.Log.Error("error publishing tx to l1", "err", err) + l.Log.Error("Error publishing tx to l1", "err", err) } return } @@ -428,7 +527,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[txID], receiptsCh chan txmgr.TxReceipt[txID]) error { +func (l *BatchSubmitter) publishTxToL1(ctx context.Context, queue *txmgr.Queue[txRef], receiptsCh chan txmgr.TxReceipt[txRef], daGroup *errgroup.Group) error { // send all available transactions l1tip, err := l.l1Tip(ctx) if err != nil { @@ -437,34 +536,35 @@ func (l *BatchSubmitter) publishTxToL1(ctx context.Context, queue *txmgr.Queue[t } l.recordL1Tip(l1tip) - // Collect next transaction data + // Collect next transaction data. This pulls data out of the channel, so we need to make sure + // to put it back if ever da or txmgr requests fail, by calling l.recordFailedDARequest/recordFailedTx. txdata, err := l.state.TxData(l1tip.ID()) if err == io.EOF { - l.Log.Trace("no transaction data available") + l.Log.Trace("No transaction data available") return err } else if err != nil { - l.Log.Error("unable to get tx data", "err", err) + l.Log.Error("Unable to get tx data", "err", err) return err } - if err = l.sendTransaction(ctx, txdata, queue, receiptsCh); err != nil { + if err = l.sendTransaction(txdata, queue, receiptsCh, daGroup); err != nil { return fmt.Errorf("BatchSubmitter.sendTransaction failed: %w", err) } return nil } func (l *BatchSubmitter) safeL1Origin(ctx context.Context) (eth.BlockID, error) { - ctx, cancel := context.WithTimeout(ctx, l.Config.NetworkTimeout) - defer cancel() - c, err := l.EndpointProvider.RollupClient(ctx) if err != nil { log.Error("Failed to get rollup client", "err", err) return eth.BlockID{}, fmt.Errorf("safe l1 origin: error getting rollup client: %w", err) } - status, err := c.SyncStatus(ctx) + cCtx, cancel := context.WithTimeout(ctx, l.Config.NetworkTimeout) + defer cancel() + + status, err := c.SyncStatus(cCtx) if err != nil { log.Error("Failed to get sync status", "err", err) return eth.BlockID{}, fmt.Errorf("safe l1 origin: error getting sync status: %w", err) @@ -478,14 +578,74 @@ func (l *BatchSubmitter) safeL1Origin(ctx context.Context) (eth.BlockID, error) return status.SafeL2.L1Origin, nil } +// cancelBlockingTx creates an empty transaction of appropriate type to cancel out the incompatible +// transaction stuck in the txpool. In the future we might send an actual batch transaction instead +// of an empty one to avoid wasting the tx fee. +func (l *BatchSubmitter) cancelBlockingTx(queue *txmgr.Queue[txRef], receiptsCh chan txmgr.TxReceipt[txRef], isBlockedBlob bool) { + var candidate *txmgr.TxCandidate + var err error + if isBlockedBlob { + candidate = l.calldataTxCandidate([]byte{}) + } else if candidate, err = l.blobTxCandidate(emptyTxData); err != nil { + panic(err) // this error should not happen + } + l.Log.Warn("sending a cancellation transaction to unblock txpool", "blocked_blob", isBlockedBlob) + l.sendTx(txData{}, true, candidate, queue, receiptsCh) +} + +// publishToAltDAAndL1 posts the txdata to the DA Provider and then sends the commitment to L1. +func (l *BatchSubmitter) publishToAltDAAndL1(txdata txData, queue *txmgr.Queue[txRef], receiptsCh chan txmgr.TxReceipt[txRef], daGroup *errgroup.Group) { + // sanity checks + if nf := len(txdata.frames); nf != 1 { + l.Log.Crit("Unexpected number of frames in calldata tx", "num_frames", nf) + } + if txdata.asBlob { + l.Log.Crit("Unexpected blob txdata with AltDA enabled") + } + + // when posting txdata to an external DA Provider, we use a goroutine to avoid blocking the main loop + // since it may take a while for the request to return. + goroutineSpawned := daGroup.TryGo(func() error { + // TODO: probably shouldn't be using the global shutdownCtx here, see https://go.dev/blog/context-and-structs + // but sendTransaction receives l.killCtx as an argument, which currently is only canceled after waiting for the main loop + // to exit, which would wait on this DA call to finish, which would take a long time. + // So we prefer to mimic the behavior of txmgr and cancel all pending DA/txmgr requests when the batcher is stopped. + comm, err := l.AltDA.SetInput(l.shutdownCtx, txdata.CallData()) + if err != nil { + l.Log.Error("Failed to post input to Alt DA", "error", err) + // requeue frame if we fail to post to the DA Provider so it can be retried + // note: this assumes that the da server caches requests, otherwise it might lead to resubmissions of the blobs + l.recordFailedDARequest(txdata.ID(), err) + return nil + } + l.Log.Info("Set altda input", "commitment", comm, "tx", txdata.ID()) + candidate := l.calldataTxCandidate(comm.TxData()) + l.sendTx(txdata, false, candidate, queue, receiptsCh) + return nil + }) + if !goroutineSpawned { + // We couldn't start the goroutine because the errgroup.Group limit + // is already reached. Since we can't send the txdata, we have to + // return it for later processing. We use nil error to skip error logging. + l.recordFailedDARequest(txdata.ID(), nil) + } +} + // sendTransaction creates & queues for sending a transaction to the batch inbox address with the given `txData`. +// This call will block if the txmgr queue is at the max-pending limit. // The method will block if the queue's MaxPendingTransactions is exceeded. -func (l *BatchSubmitter) sendTransaction(ctx context.Context, txdata txData, queue *txmgr.Queue[txID], receiptsCh chan txmgr.TxReceipt[txID]) error { +func (l *BatchSubmitter) sendTransaction(txdata txData, queue *txmgr.Queue[txRef], receiptsCh chan txmgr.TxReceipt[txRef], daGroup *errgroup.Group) error { var err error - // Do the gas estimation offline. A value of 0 will cause the [txmgr] to estimate the gas limit. + + // if Alt DA is enabled we post the txdata to the DA Provider and replace it with the commitment. + if l.Config.UseAltDA { + l.publishToAltDAAndL1(txdata, queue, receiptsCh, daGroup) + // we return nil to allow publishStateToL1 to keep processing the next txdata + return nil + } var candidate *txmgr.TxCandidate - if l.Config.UseBlobs { + if txdata.asBlob { if candidate, err = l.blobTxCandidate(txdata); err != nil { // We could potentially fall through and try a calldata tx instead, but this would // likely result in the chain spending more in gas fees than it is tuned for, so best @@ -496,22 +656,9 @@ func (l *BatchSubmitter) sendTransaction(ctx context.Context, txdata txData, que } else { // sanity check if nf := len(txdata.frames); nf != 1 { - l.Log.Crit("unexpected number of frames in calldata tx", "num_frames", nf) + l.Log.Crit("Unexpected number of frames in calldata tx", "num_frames", nf) } - data := txdata.CallData() - // if plasma DA is enabled we post the txdata to the DA Provider and replace it with the commitment. - if l.Config.UsePlasma { - comm, err := l.PlasmaDA.SetInput(ctx, data) - 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.ID(), err) - return nil - } - // signal plasma commitment tx with TxDataVersion1 - data = comm.TxData() - } - candidate = l.calldataTxCandidate(data) + candidate = l.calldataTxCandidate(txdata.CallData()) } if *candidate.To != l.RollupConfig.BatchInboxAddress { @@ -519,6 +666,8 @@ func (l *BatchSubmitter) sendTransaction(ctx context.Context, txdata txData, que } isEOAPointer := l.inboxIsEOA.Load() if isEOAPointer == nil { + ctx, cancel := context.WithTimeout(context.Background(), time.Second*2) + defer cancel() var code []byte code, err = l.L1Client.CodeAt(ctx, *candidate.To, nil) if err != nil { @@ -539,11 +688,24 @@ func (l *BatchSubmitter) sendTransaction(ctx context.Context, txdata txData, que candidate.GasLimit = intrinsicGas } } - - queue.Send(txdata.ID(), *candidate, receiptsCh) + l.sendTx(txdata, false, candidate, queue, receiptsCh) return nil } +// sendTx uses the txmgr queue to send the given transaction candidate after setting its +// gaslimit. It will block if the txmgr queue has reached its MaxPendingTransactions limit. +func (l *BatchSubmitter) sendTx(txdata txData, isCancel bool, candidate *txmgr.TxCandidate, queue *txmgr.Queue[txRef], receiptsCh chan txmgr.TxReceipt[txRef]) { + intrinsicGas, err := core.IntrinsicGas(candidate.TxData, nil, false, true, true, false) + if err != nil { + // we log instead of return an error here because txmgr can do its own gas estimation + l.Log.Error("Failed to calculate intrinsic gas", "err", err) + } else { + candidate.GasLimit = intrinsicGas + } + + queue.Send(txRef{id: txdata.ID(), isCancel: isCancel, isBlob: txdata.asBlob}, *candidate, receiptsCh) +} + func (l *BatchSubmitter) blobTxCandidate(data txData) (*txmgr.TxCandidate, error) { blobs, err := data.Blobs() if err != nil { @@ -551,7 +713,7 @@ func (l *BatchSubmitter) blobTxCandidate(data txData) (*txmgr.TxCandidate, error } size := data.Len() lastSize := len(data.frames[len(data.frames)-1].data) - l.Log.Info("building Blob transaction candidate", + l.Log.Info("Building Blob transaction candidate", "size", size, "last_size", lastSize, "num_blobs", len(blobs)) l.Metr.RecordBlobUsedBytes(lastSize) return &txmgr.TxCandidate{ @@ -561,25 +723,25 @@ func (l *BatchSubmitter) blobTxCandidate(data txData) (*txmgr.TxCandidate, error } func (l *BatchSubmitter) calldataTxCandidate(data []byte) *txmgr.TxCandidate { - l.Log.Info("building Calldata transaction candidate", "size", len(data)) + l.Log.Info("Building Calldata transaction candidate", "size", len(data)) return &txmgr.TxCandidate{ To: &l.RollupConfig.BatchInboxAddress, TxData: data, } } -func (l *BatchSubmitter) handleReceipt(r txmgr.TxReceipt[txID]) { +func (l *BatchSubmitter) handleReceipt(r txmgr.TxReceipt[txRef]) { // Record TX Status if r.Err != nil { - l.recordFailedTx(r.ID, r.Err) + l.recordFailedTx(r.ID.id, r.Err) } else { // check tx status if r.Receipt.Status == types.ReceiptStatusFailed { - l.recordFailedTx(r.ID, ErrInboxTransactionFailed) + l.recordFailedTx(r.ID.id, ErrInboxTransactionFailed) return } - l.recordConfirmedTx(r.ID, r.Receipt) + l.recordConfirmedTx(r.ID.id, r.Receipt) } } @@ -591,6 +753,13 @@ func (l *BatchSubmitter) recordL1Tip(l1tip eth.L1BlockRef) { l.Metr.RecordLatestL1Block(l1tip) } +func (l *BatchSubmitter) recordFailedDARequest(id txID, err error) { + if err != nil { + l.Log.Warn("DA request failed", logFields(id, err)...) + } + l.state.TxFailed(id) +} + func (l *BatchSubmitter) recordFailedTx(id txID, err error) { l.inboxIsEOA.Store(nil) l.Log.Warn("Transaction failed to send", logFields(id, err)...) @@ -615,6 +784,23 @@ func (l *BatchSubmitter) l1Tip(ctx context.Context) (eth.L1BlockRef, error) { return eth.InfoToL1BlockRef(eth.HeaderBlockInfo(head)), nil } +func (l *BatchSubmitter) checkTxpool(queue *txmgr.Queue[txRef], receiptsCh chan txmgr.TxReceipt[txRef]) bool { + l.txpoolMutex.Lock() + if l.txpoolState == TxpoolBlocked { + // txpoolState is set to Blocked only if Send() is returning + // ErrAlreadyReserved. In this case, the TxMgr nonce should be reset to nil, + // allowing us to send a cancellation transaction. + l.txpoolState = TxpoolCancelPending + isBlob := l.txpoolBlockedBlob + l.txpoolMutex.Unlock() + l.cancelBlockingTx(queue, receiptsCh, isBlob) + return false + } + r := l.txpoolState == TxpoolGood + l.txpoolMutex.Unlock() + return r +} + func logFields(xs ...any) (fs []any) { for _, x := range xs { switch v := x.(type) { diff --git a/op-batcher/batcher/driver_test.go b/op-batcher/batcher/driver_test.go index df72fa28d49a..1c5ace753771 100644 --- a/op-batcher/batcher/driver_test.go +++ b/op-batcher/batcher/driver_test.go @@ -49,7 +49,7 @@ func setup(t *testing.T) (*BatchSubmitter, *mockL2EndpointProvider) { return NewBatchSubmitter(DriverSetup{ Log: testlog.Logger(t, log.LevelDebug), Metr: metrics.NoopMetrics, - RollupConfig: &cfg, + RollupConfig: cfg, EndpointProvider: ep, }), ep } diff --git a/op-batcher/batcher/service.go b/op-batcher/batcher/service.go index 1969b2acf5fb..6ed906af15aa 100644 --- a/op-batcher/batcher/service.go +++ b/op-batcher/batcher/service.go @@ -5,7 +5,6 @@ import ( "errors" "fmt" "io" - _ "net/http/pprof" "strings" "sync/atomic" "time" @@ -13,12 +12,13 @@ import ( "github.com/ethereum/go-ethereum/ethclient" "github.com/ethereum/go-ethereum/log" + altda "github.com/ethereum-optimism/optimism/op-alt-da" "github.com/ethereum-optimism/optimism/op-batcher/flags" "github.com/ethereum-optimism/optimism/op-batcher/metrics" "github.com/ethereum-optimism/optimism/op-batcher/rpc" "github.com/ethereum-optimism/optimism/op-node/chaincfg" + "github.com/ethereum-optimism/optimism/op-node/params" "github.com/ethereum-optimism/optimism/op-node/rollup" - plasma "github.com/ethereum-optimism/optimism/op-plasma" "github.com/ethereum-optimism/optimism/op-service/cliapp" "github.com/ethereum-optimism/optimism/op-service/dial" "github.com/ethereum-optimism/optimism/op-service/eth" @@ -36,12 +36,11 @@ type BatcherConfig struct { PollInterval time.Duration MaxPendingTransactions uint64 - // UseBlobs is true if the batcher should use blobs instead of calldata for posting blobs - UseBlobs bool - - // 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 + // UseAltDA is true if the rollup config has a DA challenge address so the batcher + // will post inputs to the DA server and post commitments to blobs or calldata. + UseAltDA bool + // maximum number of concurrent blob put requests to the DA server + MaxConcurrentDARequests uint64 WaitNodeSync bool CheckRecentTxsDepth int @@ -55,14 +54,12 @@ type BatcherService struct { L1Client *ethclient.Client EndpointProvider dial.L2EndpointProvider TxManager txmgr.TxManager - PlasmaDA *plasma.DAClient + AltDA *altda.DAClient BatcherConfig - RollupConfig *rollup.Config - - // Channel builder parameters - ChannelConfig ChannelConfig + ChannelConfig ChannelConfigProvider + RollupConfig *rollup.Config driver *BatchSubmitter @@ -98,6 +95,7 @@ func (bs *BatcherService) initFromCLIConfig(ctx context.Context, version string, bs.PollInterval = cfg.PollInterval bs.MaxPendingTransactions = cfg.MaxPendingTransactions + bs.MaxConcurrentDARequests = cfg.AltDA.MaxConcurrentRequests bs.NetworkTimeout = cfg.TxMgrConfig.NetworkTimeout bs.CheckRecentTxsDepth = cfg.CheckRecentTxsDepth bs.WaitNodeSync = cfg.WaitNodeSync @@ -107,12 +105,16 @@ func (bs *BatcherService) initFromCLIConfig(ctx context.Context, version string, if err := bs.initRollupConfig(ctx); err != nil { return fmt.Errorf("failed to load rollup config: %w", err) } - if err := bs.initChannelConfig(cfg); err != nil { - return fmt.Errorf("failed to init channel config: %w", err) - } if err := bs.initTxManager(cfg); err != nil { return fmt.Errorf("failed to init Tx manager: %w", err) } + // must be init before driver and channel config + if err := bs.initAltDA(cfg); err != nil { + return fmt.Errorf("failed to init AltDA: %w", err) + } + if err := bs.initChannelConfig(cfg); err != nil { + return fmt.Errorf("failed to init channel config: %w", err) + } bs.initBalanceMonitor(cfg) if err := bs.initMetricsServer(cfg); err != nil { return fmt.Errorf("failed to start metrics server: %w", err) @@ -120,10 +122,6 @@ func (bs *BatcherService) initFromCLIConfig(ctx context.Context, version string, if err := bs.initPProf(cfg); err != nil { return fmt.Errorf("failed to init profiling: %w", err) } - // init before driver - if err := bs.initPlasmaDA(cfg); err != nil { - return fmt.Errorf("failed to init plasma DA: %w", err) - } bs.initDriver() if err := bs.initRPCServer(cfg); err != nil { return fmt.Errorf("failed to start RPC server: %w", err) @@ -191,54 +189,59 @@ func (bs *BatcherService) initRollupConfig(ctx context.Context) error { } func (bs *BatcherService) initChannelConfig(cfg *CLIConfig) error { + channelTimeout := bs.RollupConfig.ChannelTimeoutBedrock + // Use lower channel timeout if granite is scheduled. + // Ensures channels are restricted to the tighter timeout even if granite hasn't activated yet + if bs.RollupConfig.GraniteTime != nil { + channelTimeout = params.ChannelTimeoutGranite + } cc := ChannelConfig{ - SeqWindowSize: bs.RollupConfig.SeqWindowSize, - ChannelTimeout: bs.RollupConfig.ChannelTimeout, - MaxChannelDuration: cfg.MaxChannelDuration, - MaxFrameSize: cfg.MaxL1TxSize - 1, // account for version byte prefix; reset for blobs - TargetNumFrames: cfg.TargetNumFrames, - SubSafetyMargin: cfg.SubSafetyMargin, - BatchType: cfg.BatchType, + SeqWindowSize: bs.RollupConfig.SeqWindowSize, + ChannelTimeout: channelTimeout, + MaxChannelDuration: cfg.MaxChannelDuration, + MaxFrameSize: cfg.MaxL1TxSize - 1, // account for version byte prefix; reset for blobs + MaxBlocksPerSpanBatch: cfg.MaxBlocksPerSpanBatch, + TargetNumFrames: cfg.TargetNumFrames, + SubSafetyMargin: cfg.SubSafetyMargin, + BatchType: cfg.BatchType, } switch cfg.DataAvailabilityType { - case flags.BlobsType: + case flags.BlobsType, flags.AutoType: if !cfg.TestUseMaxTxSizeForBlobs { // account for version byte prefix cc.MaxFrameSize = eth.MaxBlobDataSize - 1 } - cc.MultiFrameTxs = true - bs.UseBlobs = true - case flags.CalldataType: - bs.UseBlobs = false + cc.UseBlobs = true + case flags.CalldataType: // do nothing default: return fmt.Errorf("unknown data availability type: %v", cfg.DataAvailabilityType) } - if bs.UsePlasma && cc.MaxFrameSize > plasma.MaxInputSize { - return fmt.Errorf("max frame size %d exceeds plasma max input size %d", cc.MaxFrameSize, plasma.MaxInputSize) + if bs.UseAltDA && cc.MaxFrameSize > altda.MaxInputSize { + return fmt.Errorf("max frame size %d exceeds altDA max input size %d", cc.MaxFrameSize, altda.MaxInputSize) } 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. + if cc.UseBlobs && !bs.RollupConfig.IsEcotone(uint64(time.Now().Unix())) { + return errors.New("cannot use Blobs before Ecotone") } - if !bs.UseBlobs && bs.RollupConfig.IsEcotone(uint64(time.Now().Unix())) { + if !cc.UseBlobs && bs.RollupConfig.IsEcotone(uint64(time.Now().Unix())) { bs.Log.Warn("Ecotone upgrade is active, but batcher is not configured to use Blobs!") } // 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 cc.CompressorConfig.CompressionAlgo.IsBrotli() && !bs.RollupConfig.IsFjord(uint64(time.Now().Unix())) { + return errors.New("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, - "use_plasma", bs.UsePlasma, + "da_type", cfg.DataAvailabilityType, + "use_alt_da", bs.UseAltDA, "max_frame_size", cc.MaxFrameSize, "target_num_frames", cc.TargetNumFrames, "compressor", cc.CompressorConfig.Kind, @@ -247,7 +250,23 @@ func (bs *BatcherService) initChannelConfig(cfg *CLIConfig) error { "max_channel_duration", cc.MaxChannelDuration, "channel_timeout", cc.ChannelTimeout, "sub_safety_margin", cc.SubSafetyMargin) - bs.ChannelConfig = cc + if bs.UseAltDA { + bs.Log.Warn("Alt-DA Mode 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.") + } + + if cfg.DataAvailabilityType == flags.AutoType { + // copy blobs config and use hardcoded calldata fallback config for now + calldataCC := cc + calldataCC.TargetNumFrames = 1 + calldataCC.MaxFrameSize = 120_000 + calldataCC.UseBlobs = false + calldataCC.ReinitCompressorConfig() + + bs.ChannelConfig = NewDynamicEthChannelConfig(bs.Log, 10*time.Second, bs.TxManager, cc, calldataCC) + } else { + bs.ChannelConfig = cc + } + return nil } @@ -279,19 +298,19 @@ func (bs *BatcherService) initPProf(cfg *CLIConfig) error { func (bs *BatcherService) initMetricsServer(cfg *CLIConfig) error { if !cfg.MetricsConfig.Enabled { - bs.Log.Info("metrics disabled") + bs.Log.Info("Metrics disabled") return nil } m, ok := bs.Metrics.(opmetrics.RegistryMetricer) if !ok { return fmt.Errorf("metrics were enabled, but metricer %T does not expose registry for metrics-server", bs.Metrics) } - bs.Log.Debug("starting metrics server", "addr", cfg.MetricsConfig.ListenAddr, "port", cfg.MetricsConfig.ListenPort) + bs.Log.Debug("Starting metrics server", "addr", cfg.MetricsConfig.ListenAddr, "port", cfg.MetricsConfig.ListenPort) metricsSrv, err := opmetrics.StartServer(m.Registry(), cfg.MetricsConfig.ListenAddr, cfg.MetricsConfig.ListenPort) if err != nil { return fmt.Errorf("failed to start metrics server: %w", err) } - bs.Log.Info("started metrics server", "addr", metricsSrv.Addr()) + bs.Log.Info("Started metrics server", "addr", metricsSrv.Addr()) bs.metricsSrv = metricsSrv return nil } @@ -306,7 +325,7 @@ func (bs *BatcherService) initDriver() { L1Client: bs.L1Client, EndpointProvider: bs.EndpointProvider, ChannelConfig: bs.ChannelConfig, - PlasmaDA: bs.PlasmaDA, + AltDA: bs.AltDA, }) } @@ -320,6 +339,7 @@ func (bs *BatcherService) initRPCServer(cfg *CLIConfig) error { if cfg.RPC.EnableAdmin { adminAPI := rpc.NewAdminAPI(bs.driver, bs.Metrics, bs.Log) server.AddAPI(rpc.GetAdminAPI(adminAPI)) + server.AddAPI(bs.TxManager.API()) bs.Log.Info("Admin RPC enabled") } bs.Log.Info("Starting JSON-RPC server") @@ -330,13 +350,13 @@ func (bs *BatcherService) initRPCServer(cfg *CLIConfig) error { return nil } -func (bs *BatcherService) initPlasmaDA(cfg *CLIConfig) error { - config := cfg.PlasmaDA +func (bs *BatcherService) initAltDA(cfg *CLIConfig) error { + config := cfg.AltDA if err := config.Check(); err != nil { return err } - bs.PlasmaDA = config.NewDAClient() - bs.UsePlasma = config.Enabled + bs.AltDA = config.NewDAClient() + bs.UseAltDA = config.Enabled return nil } @@ -424,8 +444,10 @@ func (bs *BatcherService) Stop(ctx context.Context) error { var _ cliapp.Lifecycle = (*BatcherService)(nil) -// Driver returns the handler on the batch-submitter driver element, -// to start/stop/restart the batch-submission work, for use in testing. -func (bs *BatcherService) Driver() rpc.BatcherDriver { - return bs.driver +// TestDriver returns a handler for the batch-submitter driver element, to start/stop/restart the +// batch-submission work, for use only in testing. +func (bs *BatcherService) TestDriver() *TestBatchSubmitter { + return &TestBatchSubmitter{ + BatchSubmitter: bs.driver, + } } diff --git a/op-batcher/batcher/test_batch_submitter.go b/op-batcher/batcher/test_batch_submitter.go new file mode 100644 index 000000000000..9ff5ca69796f --- /dev/null +++ b/op-batcher/batcher/test_batch_submitter.go @@ -0,0 +1,66 @@ +package batcher + +import ( + "context" + "errors" + "strings" + + "github.com/ethereum/go-ethereum/core" + "github.com/ethereum/go-ethereum/core/txpool" + + "github.com/ethereum-optimism/optimism/op-service/txmgr" +) + +type TestBatchSubmitter struct { + *BatchSubmitter + ttm *txmgr.TestTxManager +} + +// JamTxPool is for testing ONLY. It sends a txpool-blocking transaction. This function must be +// called *before* the batcher starts submitting batches to ensure successful jamming, and will +// error out otherwise. +func (l *TestBatchSubmitter) JamTxPool(ctx context.Context) error { + l.mutex.Lock() + defer l.mutex.Unlock() + if l.running { + return errors.New("tried to jam tx pool but batcher is already running") + } + var candidate *txmgr.TxCandidate + var err error + cc := l.state.cfgProvider.ChannelConfig() + if cc.UseBlobs { + candidate = l.calldataTxCandidate([]byte{}) + } else if candidate, err = l.blobTxCandidate(emptyTxData); err != nil { + return err + } + if candidate.GasLimit, err = core.IntrinsicGas(candidate.TxData, nil, false, true, true, false); err != nil { + return err + } + + simpleTxMgr, ok := l.Txmgr.(*txmgr.SimpleTxManager) + if !ok { + return errors.New("txmgr is not a SimpleTxManager") + } + l.ttm = &txmgr.TestTxManager{ + SimpleTxManager: simpleTxMgr, + } + l.Log.Info("sending txpool blocking test tx") + if err := l.ttm.JamTxPool(ctx, *candidate); err != nil { + return err + } + return nil +} + +// Wait on the jamming transaction, and return error if it completes successfully. (Tests should +// expect the blocking transaction to result in error from the context being cancelled.) +func (l *TestBatchSubmitter) WaitOnJammingTx(ctx context.Context) error { + err := l.ttm.WaitOnJammingTx(ctx) + if err == nil { + return errors.New("txpool blocking tx didn't block!") + } + if strings.Contains(err.Error(), txpool.ErrAlreadyReserved.Error()) { + return errors.New("txpool blocking tx failed because other tx in mempool is blocking it") + } + l.Log.Info("done waiting on jamming tx", "err", err) + return nil +} diff --git a/op-batcher/batcher/tx_data.go b/op-batcher/batcher/tx_data.go index 73e1adbbe179..d0f5474fd5f2 100644 --- a/op-batcher/batcher/tx_data.go +++ b/op-batcher/batcher/tx_data.go @@ -15,6 +15,7 @@ import ( // different channels. type txData struct { frames []frameData + asBlob bool // indicates whether this should be sent as blob } func singleFrameTxData(frame frameData) txData { @@ -62,7 +63,7 @@ func (td *txData) Len() (l int) { return l } -// Frame returns the single frame of this tx data. +// Frames returns the single frame of this tx data. func (td *txData) Frames() []frameData { return td.frames } diff --git a/op-batcher/cmd/main.go b/op-batcher/cmd/main.go index 91e032ff36b4..82472006da27 100644 --- a/op-batcher/cmd/main.go +++ b/op-batcher/cmd/main.go @@ -11,9 +11,9 @@ import ( "github.com/ethereum-optimism/optimism/op-batcher/metrics" opservice "github.com/ethereum-optimism/optimism/op-service" "github.com/ethereum-optimism/optimism/op-service/cliapp" + "github.com/ethereum-optimism/optimism/op-service/ctxinterrupt" oplog "github.com/ethereum-optimism/optimism/op-service/log" "github.com/ethereum-optimism/optimism/op-service/metrics/doc" - "github.com/ethereum-optimism/optimism/op-service/opio" "github.com/ethereum/go-ethereum/log" ) @@ -40,7 +40,7 @@ func main() { }, } - ctx := opio.WithInterruptBlocker(context.Background()) + ctx := ctxinterrupt.WithSignalWaiterMain(context.Background()) err := app.RunContext(ctx, os.Args) if err != nil { log.Crit("Application failed", "message", err) diff --git a/op-batcher/compressor/compressors.go b/op-batcher/compressor/compressors.go index 1a6d64da13e6..d03d245239ac 100644 --- a/op-batcher/compressor/compressors.go +++ b/op-batcher/compressor/compressors.go @@ -2,6 +2,7 @@ package compressor import ( "github.com/ethereum-optimism/optimism/op-node/rollup/derive" + "golang.org/x/exp/maps" ) type FactoryFunc func(Config) (derive.Compressor, error) @@ -25,7 +26,5 @@ var Kinds = map[string]FactoryFunc{ var KindKeys []string func init() { - for k := range Kinds { - KindKeys = append(KindKeys, k) - } + KindKeys = maps.Keys(Kinds) } diff --git a/op-batcher/compressor/shadow_compressor_test.go b/op-batcher/compressor/shadow_compressor_test.go index c29daeaad322..6d085b4a46ed 100644 --- a/op-batcher/compressor/shadow_compressor_test.go +++ b/op-batcher/compressor/shadow_compressor_test.go @@ -109,7 +109,7 @@ func TestShadowCompressor(t *testing.T) { } } -// TestBoundInaccruateForLargeRandomData documents where our bounding heuristic starts to fail +// TestBoundInaccurateForLargeRandomData documents where our bounding heuristic starts to fail // (writing at least 128k of random data) func TestBoundInaccurateForLargeRandomData(t *testing.T) { const sizeLimit = 1 << 17 diff --git a/op-batcher/flags/flags.go b/op-batcher/flags/flags.go index 5aa833b75bf7..3fe66f33981b 100644 --- a/op-batcher/flags/flags.go +++ b/op-batcher/flags/flags.go @@ -8,9 +8,9 @@ import ( "github.com/urfave/cli/v2" + altda "github.com/ethereum-optimism/optimism/op-alt-da" "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" oplog "github.com/ethereum-optimism/optimism/op-service/log" @@ -76,6 +76,11 @@ var ( Value: 120_000, // will be overwritten to max for blob da-type EnvVars: prefixEnvVars("MAX_L1_TX_SIZE_BYTES"), } + MaxBlocksPerSpanBatch = &cli.IntFlag{ + Name: "max-blocks-per-span-batch", + Usage: "Maximum number of blocks to add to a span batch. Default is 0 - no maximum.", + EnvVars: prefixEnvVars("MAX_BLOCKS_PER_SPAN_BATCH"), + } 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.", @@ -169,6 +174,7 @@ var optionalFlags = []cli.Flag{ MaxPendingTransactionsFlag, MaxChannelDurationFlag, MaxL1TxSizeBytesFlag, + MaxBlocksPerSpanBatch, TargetNumFramesFlag, ApproxComprRatioFlag, CompressorFlag, @@ -186,7 +192,7 @@ func init() { optionalFlags = append(optionalFlags, opmetrics.CLIFlags(EnvVarPrefix)...) optionalFlags = append(optionalFlags, oppprof.CLIFlags(EnvVarPrefix)...) optionalFlags = append(optionalFlags, txmgr.CLIFlags(EnvVarPrefix)...) - optionalFlags = append(optionalFlags, plasma.CLIFlags(EnvVarPrefix, "")...) + optionalFlags = append(optionalFlags, altda.CLIFlags(EnvVarPrefix, "")...) Flags = append(requiredFlags, optionalFlags...) } diff --git a/op-batcher/flags/flags_test.go b/op-batcher/flags/flags_test.go index af303724e25d..9589b3928e3a 100644 --- a/op-batcher/flags/flags_test.go +++ b/op-batcher/flags/flags_test.go @@ -65,8 +65,8 @@ func TestHasEnvVar(t *testing.T) { envFlagGetter, ok := flag.(interface { GetEnvVars() []string }) - envFlags := envFlagGetter.GetEnvVars() require.True(t, ok, "must be able to cast the flag to an EnvVar interface") + envFlags := envFlagGetter.GetEnvVars() require.Equal(t, 1, len(envFlags), "flags should have exactly one env var") }) } @@ -92,7 +92,6 @@ func TestEnvVarFormat(t *testing.T) { }) envFlags := envFlagGetter.GetEnvVars() require.True(t, ok, "must be able to cast the flag to an EnvVar interface") - require.Equal(t, 1, len(envFlags), "flags should have exactly one env var") expectedEnvVar := opservice.FlagNameToEnvVarName(flagName, "OP_BATCHER") require.Equal(t, expectedEnvVar, envFlags[0]) }) diff --git a/op-batcher/flags/types.go b/op-batcher/flags/types.go index 0db97cdad219..775c916d0270 100644 --- a/op-batcher/flags/types.go +++ b/op-batcher/flags/types.go @@ -8,11 +8,13 @@ const ( // data availability types CalldataType DataAvailabilityType = "calldata" BlobsType DataAvailabilityType = "blobs" + AutoType DataAvailabilityType = "auto" ) var DataAvailabilityTypes = []DataAvailabilityType{ CalldataType, BlobsType, + AutoType, } func (kind DataAvailabilityType) String() string { diff --git a/op-bootnode/bootnode/entrypoint.go b/op-bootnode/bootnode/entrypoint.go index 0dcf356fa1f3..0c33383c70c7 100644 --- a/op-bootnode/bootnode/entrypoint.go +++ b/op-bootnode/bootnode/entrypoint.go @@ -17,10 +17,10 @@ import ( "github.com/ethereum-optimism/optimism/op-node/p2p" p2pcli "github.com/ethereum-optimism/optimism/op-node/p2p/cli" "github.com/ethereum-optimism/optimism/op-node/rollup" + "github.com/ethereum-optimism/optimism/op-service/ctxinterrupt" "github.com/ethereum-optimism/optimism/op-service/eth" 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" oprpc "github.com/ethereum-optimism/optimism/op-service/rpc" ) @@ -116,9 +116,7 @@ func Main(cliCtx *cli.Context) error { m.RecordUp() } - opio.BlockOnInterrupts() - - return nil + return ctxinterrupt.Wait(ctx) } // validateConfig ensures the minimal config required to run a bootnode diff --git a/op-chain-ops/.gitignore b/op-chain-ops/.gitignore index ba077a4031ad..2d94eb56a7db 100644 --- a/op-chain-ops/.gitignore +++ b/op-chain-ops/.gitignore @@ -1 +1,3 @@ bin +intent.toml +state.json \ No newline at end of file diff --git a/op-chain-ops/Makefile b/op-chain-ops/Makefile index 1808807c7378..630167f7b60e 100644 --- a/op-chain-ops/Makefile +++ b/op-chain-ops/Makefile @@ -1,27 +1,47 @@ +GITCOMMIT ?= $(shell git rev-parse HEAD) +GITDATE ?= $(shell git show -s --format='%ct') + +# 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-deployer/' | sed 's/op-deployer\///' | 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 github.com/ethereum-optimism/optimism/op-chain-ops/deployer/version.Version=$(VERSION) +LDFLAGSSTRING +=-X github.com/ethereum-optimism/optimism/op-chain-ops/deployer/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-version-check: - go build -o ./bin/op-version-check ./cmd/op-version-check/main.go - ecotone-scalar: go build -o ./bin/ecotone-scalar ./cmd/ecotone-scalar/main.go 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 ./... +op-deployer: + GOOS=$(TARGETOS) GOARCH=$(TARGETARCH) CGO_ENABLED=0 go build -v $(LDFLAGS) -o ./bin/op-deployer ./cmd/op-deployer/main.go + fuzz: 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 +.PHONY: test fuzz op-deployer \ No newline at end of file diff --git a/op-chain-ops/README.md b/op-chain-ops/README.md deleted file mode 100644 index a40232fe7d17..000000000000 --- a/op-chain-ops/README.md +++ /dev/null @@ -1,52 +0,0 @@ -# op-chain-ops - -This package contains utilities for working with chain state. - -## op-version-check - -A CLI tool for determining which contract versions are deployed for -chains in a superchain. It will output a JSON file that contains a -list of each chain's versions. It is assumed that the implementations -that are being checked have already been deployed and their contract -addresses exist inside of the `superchain-registry` repository. It is -also assumed that the semantic version file in the `superchain-registry` -has been updated. The tool will output the semantic versioning to -determine which contract versions are deployed. - -### Configuration - -#### L1 RPC URL - -The L1 RPC URL is used to determine which superchain to target. All -L2s that are not based on top of the L1 chain that corresponds to the -L1 RPC URL are filtered out from being checked. It also is used to -double check that the data in the `superchain-registry` is correct. - -#### Chain IDs - -A list of L2 chain IDs can be passed that will be used to filter which -L2 chains will have their versions checked. Omitting this argument will -result in all chains in the superchain being considered. - -#### Deploy Config - -The path to the `deploy-config` directory in the contracts package. -Since multiple L2 networks may be considered in the check, the `deploy-config` -directory must be passed and then the particular deploy config files will -be read out of the directory as needed. - -#### Outfile - -The file that the versions should be written to. If omitted, the file -will be written to stdout - -#### Usage - -It can be built and run using the [Makefile](./Makefile) `op-version-check` -target. Run `make op-version-check` to create a binary in [./bin/op-version-check](./bin/op-version-check) -that can be executed, optionally providing the `--l1-rpc-url`, `--chain-ids`, -`--superchain-target`, and `--outfile` flags. - -```sh -./bin/op-version-check -``` diff --git a/op-chain-ops/clients/clients.go b/op-chain-ops/clients/clients.go index 475a130a1f03..16cf1970728c 100644 --- a/op-chain-ops/clients/clients.go +++ b/op-chain-ops/clients/clients.go @@ -10,7 +10,7 @@ import ( "github.com/urfave/cli/v2" ) -// clients represents a set of initialized RPC clients +// Clients represents a set of initialized RPC clients type Clients struct { L1Client *ethclient.Client L2Client *ethclient.Client diff --git a/op-chain-ops/cmd/check-deploy-config/main.go b/op-chain-ops/cmd/check-deploy-config/main.go index 599f91611e01..5092bbc25adf 100644 --- a/op-chain-ops/cmd/check-deploy-config/main.go +++ b/op-chain-ops/cmd/check-deploy-config/main.go @@ -46,8 +46,11 @@ func entrypoint(ctx *cli.Context) error { return err } + cfg := oplog.DefaultCLIConfig() + logger := oplog.NewLogger(ctx.App.Writer, cfg) + // Check the config, no need to call `CheckAddresses()` - if err := config.Check(); err != nil { + if err := config.Check(logger); err != nil { return err } diff --git a/op-chain-ops/cmd/check-ecotone/main.go b/op-chain-ops/cmd/check-ecotone/main.go index 711a090aa04f..58a11e9ce1ad 100644 --- a/op-chain-ops/cmd/check-ecotone/main.go +++ b/op-chain-ops/cmd/check-ecotone/main.go @@ -32,10 +32,10 @@ import ( op_service "github.com/ethereum-optimism/optimism/op-service" "github.com/ethereum-optimism/optimism/op-service/cliapp" "github.com/ethereum-optimism/optimism/op-service/client" + "github.com/ethereum-optimism/optimism/op-service/ctxinterrupt" "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/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" @@ -168,7 +168,7 @@ func makeCommandAction(fn CheckAction) func(c *cli.Context) error { logCfg := oplog.ReadCLIConfig(c) logger := oplog.NewLogger(c.App.Writer, logCfg) - c.Context = opio.CancelOnInterrupt(c.Context) + c.Context = ctxinterrupt.WithCancelOnInterrupt(c.Context) l1Cl, err := ethclient.DialContext(c.Context, c.String(EndpointL1.Name)) if err != nil { return fmt.Errorf("failed to dial L1 RPC: %w", err) @@ -271,7 +271,8 @@ func check4844Precompile(ctx context.Context, env *actionEnv) error { return fmt.Errorf("failed to compute commitment: %w", err) } point := kzg4844.Point{} - proof, claim, err := kzg4844.ComputeProof(kzg4844.Blob(x), point) + blob := kzg4844.Blob(x) + proof, claim, err := kzg4844.ComputeProof(&blob, point) if err != nil { return fmt.Errorf("failed to compute proof: %w", err) } @@ -667,7 +668,7 @@ func checkUpgradeTxs(ctx context.Context, env *actionEnv) error { if err != nil { return fmt.Errorf("failed to create eth client") } - activBlock, txs, err := l2EthCl.InfoAndTxsByNumber(ctx, activationBlockNum) + activeBlock, txs, err := l2EthCl.InfoAndTxsByNumber(ctx, activationBlockNum) if err != nil { return fmt.Errorf("failed to get activation block: %w", err) } @@ -679,7 +680,7 @@ func checkUpgradeTxs(ctx context.Context, env *actionEnv) error { return fmt.Errorf("unexpected non-deposit tx in activation block, index %d, hash %s", i, tx.Hash()) } } - _, receipts, err := l2EthCl.FetchReceipts(ctx, activBlock.Hash()) + _, receipts, err := l2EthCl.FetchReceipts(ctx, activeBlock.Hash()) if err != nil { return fmt.Errorf("failed to fetch receipts of activation block: %w", err) } @@ -725,11 +726,11 @@ func checkGPO(ctx context.Context, env *actionEnv) error { } _, err = cl.Overhead(nil) if err == nil || !strings.Contains(err.Error(), "revert") { - return fmt.Errorf("expected revert on legacy overhead attribute acccess, but got %w", err) + return fmt.Errorf("expected revert on legacy overhead attribute access, but got %w", err) } _, err = cl.Scalar(nil) if err == nil || !strings.Contains(err.Error(), "revert") { - return fmt.Errorf("expected revert on legacy scalar attribute acccess, but got %w", err) + return fmt.Errorf("expected revert on legacy scalar attribute access, but got %w", err) } isEcotone, err := cl.IsEcotone(nil) if err != nil { diff --git a/op-chain-ops/cmd/check-fjord/main.go b/op-chain-ops/cmd/check-fjord/main.go index 5a2ef66fbcb9..c63cc43493f5 100644 --- a/op-chain-ops/cmd/check-fjord/main.go +++ b/op-chain-ops/cmd/check-fjord/main.go @@ -9,8 +9,8 @@ import ( "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" + "github.com/ethereum-optimism/optimism/op-service/ctxinterrupt" 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" @@ -54,7 +54,7 @@ func makeCommandAction(fn CheckAction) func(c *cli.Context) error { logCfg := oplog.ReadCLIConfig(c) logger := oplog.NewLogger(c.App.Writer, logCfg) - c.Context = opio.CancelOnInterrupt(c.Context) + c.Context = ctxinterrupt.WithCancelOnInterrupt(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) diff --git a/op-chain-ops/cmd/op-deployer/main.go b/op-chain-ops/cmd/op-deployer/main.go new file mode 100644 index 000000000000..023d8adca39d --- /dev/null +++ b/op-chain-ops/cmd/op-deployer/main.go @@ -0,0 +1,57 @@ +package main + +import ( + "fmt" + "os" + + "github.com/ethereum-optimism/optimism/op-chain-ops/deployer/version" + opservice "github.com/ethereum-optimism/optimism/op-service" + + "github.com/ethereum-optimism/optimism/op-chain-ops/deployer/inspect" + + "github.com/ethereum-optimism/optimism/op-chain-ops/deployer" + "github.com/ethereum-optimism/optimism/op-service/cliapp" + "github.com/urfave/cli/v2" +) + +var ( + GitCommit = "" + GitDate = "" +) + +// VersionWithMeta holds the textual version string including the metadata. +var VersionWithMeta = opservice.FormatVersion(version.Version, GitCommit, GitDate, version.Meta) + +func main() { + app := cli.NewApp() + app.Version = VersionWithMeta + app.Name = "op-deployer" + app.Usage = "Tool to configure and deploy OP Chains." + app.Flags = cliapp.ProtectFlags(deployer.GlobalFlags) + app.Commands = []*cli.Command{ + { + Name: "init", + Usage: "initializes a chain intent and state file", + Flags: cliapp.ProtectFlags(deployer.InitFlags), + Action: deployer.InitCLI(), + }, + { + Name: "apply", + Usage: "applies a chain intent to the chain", + Flags: cliapp.ProtectFlags(deployer.ApplyFlags), + Action: deployer.ApplyCLI(), + }, + { + Name: "inspect", + Usage: "inspects the state of a deployment", + Subcommands: inspect.Commands, + }, + } + app.Writer = os.Stdout + app.ErrWriter = os.Stderr + 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/op-simulate/main.go b/op-chain-ops/cmd/op-simulate/main.go index cec69c2454f7..8b0986e4554f 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/ethereum/go-ethereum/core/tracing" "github.com/holiman/uint256" "github.com/pkg/profile" "github.com/urfave/cli/v2" @@ -32,8 +33,8 @@ import ( op_service "github.com/ethereum-optimism/optimism/op-service" "github.com/ethereum-optimism/optimism/op-service/cliapp" + "github.com/ethereum-optimism/optimism/op-service/ctxinterrupt" oplog "github.com/ethereum-optimism/optimism/op-service/log" - "github.com/ethereum-optimism/optimism/op-service/opio" ) var EnvPrefix = "OP_SIMULATE" @@ -81,7 +82,7 @@ func main() { } func mainAction(c *cli.Context) error { - ctx := opio.CancelOnInterrupt(c.Context) + ctx := ctxinterrupt.WithCancelOnInterrupt(c.Context) logCfg := oplog.ReadCLIConfig(c) logger := oplog.NewLogger(c.App.Writer, logCfg) @@ -258,7 +259,7 @@ func simulate(ctx context.Context, logger log.Logger, conf *params.ChainConfig, } for addr, acc := range dump { state.CreateAccount(addr) - state.SetBalance(addr, uint256.MustFromBig((*big.Int)(&acc.Balance))) + state.SetBalance(addr, uint256.MustFromBig((*big.Int)(&acc.Balance)), tracing.BalanceChangeUnspecified) state.SetNonce(addr, acc.Nonce) state.SetCode(addr, acc.Code) state.SetStorage(addr, acc.Storage) diff --git a/op-chain-ops/cmd/op-upgrade/README.md b/op-chain-ops/cmd/op-upgrade/README.md deleted file mode 100644 index 8494c83ebce2..000000000000 --- a/op-chain-ops/cmd/op-upgrade/README.md +++ /dev/null @@ -1,60 +0,0 @@ -# op-upgrade - -A CLI tool for building Safe bundles that can upgrade many chains -at the same time. It will output a JSON file that is compatible with -the Safe UI. It is assumed that the implementations that are being -upgraded to have already been deployed and their contract addresses -exist inside of the `superchain-registry` repository. It is also -assumed that the semantic version file in the `superchain-registry` -has been updated. The tool will use semantic versioning to determine -which contract versions should be upgraded to and then build all of -the calldata. - -### Configuration - -#### L1 RPC URL - -The L1 RPC URL is used to determine which superchain to target. All -L2s that are not based on top of the L1 chain that corresponds to the -L1 RPC URL are filtered out from being included. It also is used to -double check that the data in the `superchain-registry` is correct. - -#### Chain IDs - -A list of L2 chain IDs can be passed that will be used to filter which -L2 chains will have upgrades included in the bundle transaction. Omitting -this argument will result in all chains in the superchain being considered. - -#### Deploy Config - -The path to the `deploy-config` directory in the contracts package. -Since multiple L2 networks may be included in the bundle, the `deploy-config` -directory must be passed and then the particular deploy config files will -be read out of the directory as needed. - -#### Outfile - -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 deleted file mode 100644 index 736cd67b833b..000000000000 --- a/op-chain-ops/cmd/op-upgrade/main.go +++ /dev/null @@ -1,299 +0,0 @@ -package main - -import ( - "encoding/json" - "errors" - "fmt" - "os" - "slices" - - "golang.org/x/exp/maps" - - "github.com/ethereum/go-ethereum/ethclient" - "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" - "github.com/ethereum-optimism/optimism/op-service/jsonutil" - oplog "github.com/ethereum-optimism/optimism/op-service/log" - - "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)) - - 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", - EnvVars: []string{"L1_RPC_URL"}, - }, - &cli.Uint64SliceFlag{ - Name: "chain-ids", - Usage: "L2 Chain IDs corresponding to chains to upgrade. Corresponds to all chains if empty", - }, - &cli.StringFlag{ - Name: "superchain-target", - 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", - 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 { - client, err := ethclient.Dial(ctx.String("l1-rpc-url")) - if err != nil { - return err - } - - // Fetch the L1 chain ID to determine the superchain name - l1ChainID, err := client.ChainID(ctx.Context) - if err != nil { - return err - } - - superchainName := ctx.String("superchain-target") - sc, ok := superchain.Superchains[superchainName] - if !ok { - return fmt.Errorf("superchain name %s not registered", superchainName) - } - - declaredChainID := sc.Config.L1.ChainID - - if declaredChainID != l1ChainID.Uint64() { - return fmt.Errorf("superchain %s has chainID %d, but the l1-rpc-url returned a chainId of %d", - superchainName, declaredChainID, l1ChainID.Uint64()) - } - - 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 - if len(chainIDs) == 0 { - chainIDs = maps.Keys(superchain.OPChains) - } - slices.Sort(chainIDs) - - targets := make([]*superchain.ChainConfig, 0) - for _, chainConfig := range superchain.OPChains { - if chainConfig.Superchain == superchainName && slices.Contains(chainIDs, chainConfig.ChainID) { - targets = append(targets, chainConfig) - } - } - - 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) - }) - - // Create a batch of transactions - 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, so validity checks will be skipped", "name", chainConfig.Name, "deploy-config-name", name, "path", deployConfig, "err", err) - } - - if config != nil { - log.Info("Checking deploy config validity", "name", chainConfig.Name) - if err := config.Check(); err != nil { - return fmt.Errorf("error checking deploy config: %w", err) - } - } - - clients, err := clients.NewClients(ctx.String("l1-rpc-url"), chainConfig.PublicRPC) - if err != nil { - return fmt.Errorf("cannot create RPC clients: %w", err) - } - // The L1Client is required - if clients.L1Client == nil { - return errors.New("Cannot create L1 client") - } - - l1ChainID, err := clients.L1Client.ChainID(ctx.Context) - if err != nil { - return fmt.Errorf("cannot fetch L1 chain ID: %w", err) - } - - // The L2Client is not required, but double check the chain id matches if possible - if clients.L2Client != nil { - l2ChainID, err := clients.L2Client.ChainID(ctx.Context) - if err != nil { - return fmt.Errorf("cannot fetch L2 chain ID: %w", err) - } - if chainConfig.ChainID != l2ChainID.Uint64() { - return fmt.Errorf("Mismatched chain IDs: %d != %d", chainConfig.ChainID, l2ChainID) - } - } - - log.Info(chainConfig.Name, "l1-chain-id", l1ChainID, "l2-chain-id", chainConfig.ChainID) - - log.Info("Detecting on chain contracts") - // Tracking the individual addresses can be deprecated once the system is upgraded - // to the new contracts where the system config has a reference to each address. - addresses, ok := superchain.Addresses[chainConfig.ChainID] - if !ok { - return fmt.Errorf("no addresses for chain ID %d", chainConfig.ChainID) - } - versions, err := upgrades.GetContractVersions(ctx.Context, addresses, chainConfig, clients.L1Client) - if err != nil { - return fmt.Errorf("error getting contract versions: %w", err) - } - - log.Info("L1CrossDomainMessenger", "version", versions.L1CrossDomainMessenger, "address", addresses.L1CrossDomainMessengerProxy) - log.Info("L1ERC721Bridge", "version", versions.L1ERC721Bridge, "address", addresses.L1ERC721BridgeProxy) - log.Info("L1StandardBridge", "version", versions.L1StandardBridge, "address", addresses.L1StandardBridgeProxy) - log.Info("L2OutputOracle", "version", versions.L2OutputOracle, "address", addresses.L2OutputOracleProxy) - log.Info("OptimismMintableERC20Factory", "version", versions.OptimismMintableERC20Factory, "address", addresses.OptimismMintableERC20FactoryProxy) - log.Info("OptimismPortal", "version", versions.OptimismPortal, "address", addresses.OptimismPortalProxy) - log.Info("SystemConfig", "version", versions.SystemConfig, "address", addresses.SystemConfigProxy) - - implementations, ok := superchain.Implementations[chainConfig.Superchain] - if !ok { - return fmt.Errorf("no implementations for chain ID %d", l1ChainID.Uint64()) - } - - // 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 - } - - 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) - - // Ensure that the superchain registry information is correct by checking the - // actual versions based on what the registry says is true. - if err := upgrades.CheckL1(ctx.Context, &list, clients.L1Client); err != nil { - return fmt.Errorf("error checking L1: %w", err) - } - - // Build the batch - // 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 - } - } - - // Write the batch to disk or stdout - if outfile := ctx.Path("outfile"); outfile != "" { - if err := jsonutil.WriteJSON(outfile, batch, 0o666); err != nil { - return err - } - } else { - data, err := json.MarshalIndent(batch, "", " ") - if err != nil { - return err - } - fmt.Println(string(data)) - } - return nil -} - -// toDeployConfigName is a temporary function that maps the chain config names -// to deploy config names. This should be able to be removed in the future -// with a canonical naming scheme. If an empty string is returned, then -// it means that the chain is not supported yet. -func toDeployConfigName(cfg *superchain.ChainConfig) (string, error) { - if cfg.Name == "OP-Sepolia" { - return "sepolia", nil - } - if cfg.Name == "OP-Goerli" { - return "goerli", nil - } - if cfg.Name == "PGN" { - return "pgn", nil - } - if cfg.Name == "Zora" { - return "zora", nil - } - if cfg.Name == "OP-Mainnet" { - return "mainnet", nil - } - if cfg.Name == "Zora Goerli" { - return "zora-goerli", nil - } - return "", fmt.Errorf("unsupported chain name %s", cfg.Name) -} diff --git a/op-chain-ops/cmd/op-version-check/README.md b/op-chain-ops/cmd/op-version-check/README.md deleted file mode 100644 index 29e5f08ab4de..000000000000 --- a/op-chain-ops/cmd/op-version-check/README.md +++ /dev/null @@ -1,48 +0,0 @@ -# op-version-check - -A CLI tool for determining which contract versions are deployed for -chains in a superchain. It will output a JSON file that contains a -list of each chain's versions. It is assumed that the implementations -that are being checked have already been deployed and their contract -addresses exist inside of the `superchain-registry` repository. It is -also assumed that the semantic version file in the `superchain-registry` -has been updated. The tool will output the semantic versioning to -determine which contract versions are deployed. - -### Configuration - -#### L1 RPC URL - -The L1 RPC URL is used to determine which superchain to target. All -L2s that are not based on top of the L1 chain that corresponds to the -L1 RPC URL are filtered out from being checked. It also is used to -double check that the data in the `superchain-registry` is correct. - -#### Chain IDs - -A list of L2 chain IDs can be passed that will be used to filter which -L2 chains will have their versions checked. Omitting this argument will -result in all chains in the superchain being considered. - -#### Deploy Config - -The path to the `deploy-config` directory in the contracts package. -Since multiple L2 networks may be considered in the check, the `deploy-config` -directory must be passed and then the particular deploy config files will -be read out of the directory as needed. - -#### Outfile - -The file that the versions should be written to. If omitted, the file -will be written to stdout - -#### Usage - -It can be built and run using the [Makefile](../../Makefile) `op-version-check` -target. Run `make op-version-check` to create a binary in [../../bin/op-version-check](../../bin/op-version-check) -that can be executed, optionally providing the `--l1-rpc-url`, `--chain-ids`, -`--superchain-target`, and `--outfile` flags. - -```sh -./bin/op-version-check -``` diff --git a/op-chain-ops/cmd/op-version-check/main.go b/op-chain-ops/cmd/op-version-check/main.go deleted file mode 100644 index 163ff8599ef5..000000000000 --- a/op-chain-ops/cmd/op-version-check/main.go +++ /dev/null @@ -1,169 +0,0 @@ -package main - -import ( - "encoding/json" - "errors" - "fmt" - "os" - - "github.com/ethereum/go-ethereum/ethclient" - "github.com/ethereum/go-ethereum/log" - "github.com/mattn/go-isatty" - "github.com/urfave/cli/v2" - "golang.org/x/exp/maps" - - "github.com/ethereum-optimism/optimism/op-chain-ops/upgrades" - "github.com/ethereum-optimism/optimism/op-service/jsonutil" - oplog "github.com/ethereum-optimism/optimism/op-service/log" - - "github.com/ethereum-optimism/superchain-registry/superchain" -) - -type Contract struct { - Version string `yaml:"version"` - Address superchain.Address `yaml:"address"` -} - -type ChainVersionCheck struct { - Name string `yaml:"name"` - ChainID uint64 `yaml:"chain_id"` - Contracts map[string]Contract `yaml:"contracts"` -} - -func main() { - color := isatty.IsTerminal(os.Stderr.Fd()) - oplog.SetGlobalLogHandler(log.NewTerminalHandler(os.Stderr, color)) - - app := &cli.App{ - Name: "op-version-check", - Usage: "Determine which contract versions are deployed for chains in a superchain", - Flags: []cli.Flag{ - &cli.StringSliceFlag{ - Name: "l1-rpc-urls", - Usage: "L1 RPC URLs, the chain ID will be used to determine the superchain", - EnvVars: []string{"L1_RPC_URLS"}, - }, - &cli.StringSliceFlag{ - Name: "l2-rpc-urls", - Usage: "L2 RPC URLs, corresponding to chains to check versions for. Corresponds to all chains if empty", - EnvVars: []string{"L2_RPC_URLS"}, - }, - &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-version-check", "err", err) - } -} - -// entrypoint contains the main logic of the script -func entrypoint(ctx *cli.Context) error { - l1RPCURLs := ctx.StringSlice("l1-rpc-urls") - l2RPCURLs := ctx.StringSlice("l2-rpc-urls") - - var l2ChainIDs []uint64 - - // If no L2 RPC URLs are specified, we check all chains for the L1 RPC URL - if len(l2RPCURLs) == 0 { - l2ChainIDs = maps.Keys(superchain.OPChains) - } else { - for _, l2RPCURL := range l2RPCURLs { - client, err := ethclient.Dial(l2RPCURL) - if err != nil { - return errors.New("cannot create L2 client") - } - - l2ChainID, err := client.ChainID(ctx.Context) - if err != nil { - return fmt.Errorf("cannot fetch L2 chain ID: %w", err) - } - - l2ChainIDs = append(l2ChainIDs, l2ChainID.Uint64()) - } - } - - output := []ChainVersionCheck{} - - for _, l2ChainID := range l2ChainIDs { - chainConfig := superchain.OPChains[l2ChainID] - - if chainConfig.ChainID != l2ChainID { - return fmt.Errorf("mismatched chain IDs: %d != %d", chainConfig.ChainID, l2ChainID) - } - - for _, l1RPCURL := range l1RPCURLs { - client, err := ethclient.Dial(l1RPCURL) - if err != nil { - return errors.New("cannot create L1 client") - } - - l1ChainID, err := client.ChainID(ctx.Context) - if err != nil { - return fmt.Errorf("cannot fetch L1 chain ID: %w", err) - } - - sc, ok := superchain.Superchains[chainConfig.Superchain] - if !ok { - return fmt.Errorf("superchain name %s not registered", chainConfig.Superchain) - } - - declaredL1ChainID := sc.Config.L1.ChainID - - if l1ChainID.Uint64() != declaredL1ChainID { - // L2 corresponds to a different superchain than L1, skip - log.Info("Ignoring L1/L2", "l1-chain-id", l1ChainID, "l2-chain-id", l2ChainID) - continue - } - - log.Info(chainConfig.Name, "l1-chain-id", l1ChainID, "l2-chain-id", l2ChainID) - - log.Info("Detecting on chain contracts") - // Tracking the individual addresses can be deprecated once the system is upgraded - // to the new contracts where the system config has a reference to each address. - addresses, ok := superchain.Addresses[l2ChainID] - if !ok { - return fmt.Errorf("no addresses for chain ID %d", l2ChainID) - } - versions, err := upgrades.GetContractVersions(ctx.Context, addresses, chainConfig, client) - if err != nil { - return fmt.Errorf("error getting contract versions: %w", err) - } - - contracts := make(map[string]Contract) - - contracts["AddressManager"] = Contract{Version: "null", Address: addresses.AddressManager} - contracts["L1CrossDomainMessenger"] = Contract{Version: versions.L1CrossDomainMessenger, Address: addresses.L1CrossDomainMessengerProxy} - contracts["L1ERC721Bridge"] = Contract{Version: versions.L1ERC721Bridge, Address: addresses.L1ERC721BridgeProxy} - contracts["L1StandardBridge"] = Contract{Version: versions.L1ERC721Bridge, Address: addresses.L1StandardBridgeProxy} - contracts["L2OutputOracle"] = Contract{Version: versions.L2OutputOracle, Address: addresses.L2OutputOracleProxy} - contracts["OptimismMintableERC20Factory"] = Contract{Version: versions.OptimismMintableERC20Factory, Address: addresses.OptimismMintableERC20FactoryProxy} - contracts["OptimismPortal"] = Contract{Version: versions.OptimismPortal, Address: addresses.OptimismPortalProxy} - contracts["SystemConfig"] = Contract{Version: versions.SystemConfig, Address: addresses.SystemConfigProxy} - contracts["ProxyAdmin"] = Contract{Version: "null", Address: addresses.ProxyAdmin} - - output = append(output, ChainVersionCheck{Name: chainConfig.Name, ChainID: l2ChainID, Contracts: contracts}) - - log.Info("Successfully processed contract versions", "chain", chainConfig.Name, "l1-chain-id", l1ChainID, "l2-chain-id", l2ChainID) - break - } - } - // Write contract versions to disk or stdout - if outfile := ctx.Path("outfile"); outfile != "" { - if err := jsonutil.WriteJSON(outfile, output, 0o666); err != nil { - return err - } - } else { - data, err := json.MarshalIndent(output, "", " ") - if err != nil { - return err - } - fmt.Println(string(data)) - } - return nil -} diff --git a/op-chain-ops/cmd/protocol-version/main.go b/op-chain-ops/cmd/protocol-version/main.go index a5bd6b434921..cf4fef1efd06 100644 --- a/op-chain-ops/cmd/protocol-version/main.go +++ b/op-chain-ops/cmd/protocol-version/main.go @@ -3,11 +3,11 @@ package main import ( "encoding/hex" "fmt" + "log/slog" "os" "github.com/mattn/go-isatty" "github.com/urfave/cli/v2" - "golang.org/x/exp/slog" "github.com/ethereum/go-ethereum/common" "github.com/ethereum/go-ethereum/log" diff --git a/op-chain-ops/cmd/receipt-reference-builder/README.md b/op-chain-ops/cmd/receipt-reference-builder/README.md index dea2aaa3a085..89d1dbac24d5 100644 --- a/op-chain-ops/cmd/receipt-reference-builder/README.md +++ b/op-chain-ops/cmd/receipt-reference-builder/README.md @@ -34,6 +34,6 @@ This tool is designed with a static range of blocks in mind, the size of which i To maximize parallel efficiency, a higher number of `-workers` can utilize more RPC requests per second. Additionally `-batch-size` can be increased to group more RPC requests together per network exchange. I am using 5 workers with 100 requests per batch. -To avoid wasteful abandon of work already done, errors which are encountered by workers are noted, but do not stop the aggregation process. Jobs which fail are reinserted into the work queue with no maximum retry, and workers back off when encountering failures. This is all to allow an RPC endpoint to become temporarily unavailalbe while letting aggregation stay persistent. +To avoid wasteful abandon of work already done, errors which are encountered by workers are noted, but do not stop the aggregation process. Jobs which fail are reinserted into the work queue with no maximum retry, and workers back off when encountering failures. This is all to allow an RPC endpoint to become temporarily unavailable while letting aggregation stay persistent. Even at high speed, collecting this much data can take several hours. You may benefit from planning a collection of smaller-sized runs, merging them with the `merge` subcommand as they become available. diff --git a/op-chain-ops/cmd/receipt-reference-builder/main.go b/op-chain-ops/cmd/receipt-reference-builder/main.go index 0418e92193e7..90cd9bd4568b 100644 --- a/op-chain-ops/cmd/receipt-reference-builder/main.go +++ b/op-chain-ops/cmd/receipt-reference-builder/main.go @@ -1,12 +1,12 @@ package main import ( + "log/slog" "os" "time" "github.com/mattn/go-isatty" "github.com/urfave/cli/v2" - "golang.org/x/exp/slog" "github.com/ethereum/go-ethereum/common" "github.com/ethereum/go-ethereum/log" diff --git a/op-chain-ops/cmd/receipt-reference-builder/merge.go b/op-chain-ops/cmd/receipt-reference-builder/merge.go index a269af2ae4b1..c6dbe3240651 100644 --- a/op-chain-ops/cmd/receipt-reference-builder/merge.go +++ b/op-chain-ops/cmd/receipt-reference-builder/merge.go @@ -2,6 +2,7 @@ package main import ( "errors" + "maps" "sort" "github.com/ethereum/go-ethereum/log" @@ -96,9 +97,8 @@ func checkBlockRanges(aggregates []aggregate) error { func mergeAggregates(a1, a2 aggregate, log log.Logger) aggregate { log.Info("merging", "a1", a1, "a2", a2) // merge the results - for k, v := range a2.Results { - a1.Results[k] = v - } + maps.Copy(a1.Results, a2.Results) + a1.Last = a2.Last log.Info("result", "aggregate", a1) return a1 diff --git a/op-chain-ops/cmd/receipt-reference-builder/pull.go b/op-chain-ops/cmd/receipt-reference-builder/pull.go index d6fa95eef33c..3c692955026c 100644 --- a/op-chain-ops/cmd/receipt-reference-builder/pull.go +++ b/op-chain-ops/cmd/receipt-reference-builder/pull.go @@ -298,7 +298,7 @@ func processBlockRange( // process each transaction in the block for j := 0; j < len(b.Transactions); j++ { tx := b.Transactions[j] - ok, err := checkTransaction(ctx, c, *tx, log) + ok, err := checkTransaction(ctx, c, tx, log) if err != nil { log.Error("Failed to Check Tx", "Err", err) return []result{}, err @@ -346,8 +346,8 @@ func batchBlockByNumber(ctx context.Context, c *ethclient.Client, blockNumbers [ } // checkTransaction will check if a transaction is a user deposit, and not initiated by the system address -func checkTransaction(ctx context.Context, c *ethclient.Client, tx types.Transaction, log log.Logger) (bool, error) { - from, err := types.Sender(types.LatestSignerForChainID(tx.ChainId()), &tx) +func checkTransaction(ctx context.Context, c *ethclient.Client, tx *types.Transaction, log log.Logger) (bool, error) { + from, err := types.Sender(types.LatestSignerForChainID(tx.ChainId()), tx) if err != nil { log.Error("Failed to Get Sender", "Err", err) return false, err @@ -355,7 +355,7 @@ func checkTransaction(ctx context.Context, c *ethclient.Client, tx types.Transac // we are filtering for deposit transactions which are not system transactions if tx.Type() == depositType && from != systemAddress { - log.Info("Got Transaction", "From", from, "Nonce", *tx.EffectiveNonce(), "Type", tx.Type()) + log.Info("Got Transaction", "From", from, "Nonce", tx.EffectiveNonce(), "Type", tx.Type()) return true, nil } return false, nil diff --git a/op-chain-ops/cmd/registry-data/main.go b/op-chain-ops/cmd/registry-data/main.go deleted file mode 100644 index 7992edf897dc..000000000000 --- a/op-chain-ops/cmd/registry-data/main.go +++ /dev/null @@ -1,303 +0,0 @@ -package main - -import ( - "bytes" - "compress/flate" - "compress/gzip" - "encoding/json" - "errors" - "fmt" - "os" - "path/filepath" - - opservice "github.com/ethereum-optimism/optimism/op-service" - "github.com/ethereum-optimism/optimism/op-service/jsonutil" - oplog "github.com/ethereum-optimism/optimism/op-service/log" - "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/ethereum/go-ethereum/crypto" - "github.com/ethereum/go-ethereum/log" - "github.com/mattn/go-isatty" - "github.com/urfave/cli/v2" -) - -const EnvPrefix = "OP_CHAIN_OPS_REGISTRY_DATA" - -var ( - L2GenesisFlag = &cli.PathFlag{ - Name: "l2-genesis", - Value: "genesis.json", - Usage: "Path to genesis json (go-ethereum format)", - EnvVars: opservice.PrefixEnvVar(EnvPrefix, "L2_GENESIS"), - } - L2GenesisHeaderFlag = &cli.PathFlag{ - Name: "l2-genesis-header", - Value: "genesis-header.json", - Usage: "Alternative to l2-genesis flag, if genesis-state is omitted. Path to block header at genesis", - EnvVars: opservice.PrefixEnvVar(EnvPrefix, "L2_GENESIS_HEADER"), - } - BytecodesDirFlag = &cli.PathFlag{ - Name: "bytecodes-dir", - Value: "superchain-registry/superchain/bytecodes", - Usage: "Collection of gzipped L2 bytecodes", - EnvVars: opservice.PrefixEnvVar(EnvPrefix, "BYTECODES_DIR"), - } - OutputFlag = &cli.PathFlag{ - Name: "output", - Value: "out.json.gz", - Usage: "output gzipped JSON file path to write to", - EnvVars: opservice.PrefixEnvVar(EnvPrefix, "OUTPUT"), - } -) - -func main() { - color := isatty.IsTerminal(os.Stderr.Fd()) - oplog.SetGlobalLogHandler(log.NewTerminalHandler(os.Stderr, color)) - - app := &cli.App{ - Name: "registry-data", - Usage: "Prepare superchain-registry genesis data files based on full genesis dump", - Flags: []cli.Flag{ - L2GenesisFlag, - L2GenesisHeaderFlag, - BytecodesDirFlag, - OutputFlag, - }, - Action: entrypoint, - } - app.Commands = []*cli.Command{ - { - Name: "bytecode", - Usage: "Generate a single gzipped data file from a bytecode hex string", - Flags: []cli.Flag{ - BytecodesDirFlag, - }, - Action: bytecode, - }, - } - - if err := app.Run(os.Args); err != nil { - log.Crit("error while generating registry data", "err", err) - } -} - -type GenesisAccount struct { - CodeHash common.Hash `json:"codeHash,omitempty"` - Storage jsonutil.LazySortedJsonMap[common.Hash, common.Hash] `json:"storage,omitempty"` - Balance *hexutil.Big `json:"balance,omitempty"` - Nonce uint64 `json:"nonce,omitempty"` -} - -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"` - 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) - StateHash *common.Hash `json:"stateHash,omitempty"` -} - -func loadJSON[X any](inputPath string) (*X, error) { - if inputPath == "" { - return nil, errors.New("no path specified") - } - f, err := os.OpenFile(inputPath, os.O_RDONLY, 0) - if err != nil { - return nil, fmt.Errorf("failed to open file %q: %w", inputPath, err) - } - defer f.Close() - var obj X - if err := json.NewDecoder(f).Decode(&obj); err != nil { - return nil, fmt.Errorf("failed to decode file %q: %w", inputPath, err) - } - return &obj, nil -} - -func writeGzipJSON(outputPath string, value any) error { - f, err := os.OpenFile(outputPath, os.O_WRONLY|os.O_CREATE|os.O_TRUNC, 0755) - if err != nil { - return fmt.Errorf("failed to open output file: %w", err) - } - defer f.Close() - w, err := gzip.NewWriterLevel(f, flate.BestCompression) - if err != nil { - return fmt.Errorf("failed to create gzip writer: %w", err) - } - defer w.Close() - enc := json.NewEncoder(w) - if err := enc.Encode(value); err != nil { - return fmt.Errorf("failed to encode to JSON: %w", err) - } - return nil -} - -func entrypoint(ctx *cli.Context) error { - genesisPath := ctx.Path(L2GenesisFlag.Name) - if genesisPath == "" { - // When the genesis-state is too large, or not meant to be available, only the header data is made available. - // This allows the user to verify the header-chain starting from genesis, and state-sync the latest state, - // skipping the historical state. - // Archive nodes that depend on this historical state should instantiate the chain from a full genesis dump - // with allocation data, or datadir. - genesisHeaderPath := ctx.Path(L2GenesisHeaderFlag.Name) - genesisHeader, err := loadJSON[types.Header](genesisHeaderPath) - if err != nil { - return fmt.Errorf("genesis-header %q failed to load: %w", genesisHeaderPath, err) - } - if genesisHeader.TxHash != types.EmptyTxsHash { - return errors.New("genesis-header based genesis must have no transactions") - } - if genesisHeader.ReceiptHash != types.EmptyReceiptsHash { - return errors.New("genesis-header based genesis must have no receipts") - } - if genesisHeader.UncleHash != types.EmptyUncleHash { - return errors.New("genesis-header based genesis must have no uncle hashes") - } - if genesisHeader.WithdrawalsHash != nil && *genesisHeader.WithdrawalsHash != types.EmptyWithdrawalsHash { - 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), - 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) - } - return nil - } - - genesis, err := loadJSON[core.Genesis](genesisPath) - if err != nil { - return fmt.Errorf("failed to load L2 genesis: %w", err) - } - - // export all contract bytecodes, write them to bytecodes collection - bytecodesDir := ctx.Path(BytecodesDirFlag.Name) - if err := os.MkdirAll(bytecodesDir, 0755); err != nil { - return fmt.Errorf("failed to make bytecodes dir: %w", err) - } - for addr, account := range genesis.Alloc { - if len(account.Code) > 0 { - err = writeBytecode(bytecodesDir, account.Code, addr) - if err != nil { - return err - } - } - } - - // 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), - 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. - for addr, account := range genesis.Alloc { - var codeHash common.Hash - if len(account.Code) > 0 { - codeHash = crypto.Keccak256Hash(account.Code) - } - outAcc := GenesisAccount{ - CodeHash: codeHash, - Nonce: account.Nonce, - } - if account.Balance != nil && account.Balance.Cmp(common.Big0) != 0 { - outAcc.Balance = (*hexutil.Big)(account.Balance) - } - if len(account.Storage) > 0 { - outAcc.Storage = make(jsonutil.LazySortedJsonMap[common.Hash, common.Hash]) - for k, v := range account.Storage { - outAcc.Storage[k] = v - } - } - out.Alloc[addr] = outAcc - } - - // write genesis alloc - if err := writeGzipJSON(ctx.Path(OutputFlag.Name), out); err != nil { - return fmt.Errorf("failed to write output: %w", err) - } - return nil -} - -func bytecode(ctx *cli.Context) error { - if ctx.NArg() != 1 { - return fmt.Errorf("expected hex-encoded bytecode as single argument; received %d arguments", ctx.NArg()) - } - bc, err := hexutil.Decode(ctx.Args().First()) - if err != nil { - return fmt.Errorf("failed to decode hex: %w", err) - } - bytecodesDir := ctx.Path(BytecodesDirFlag.Name) - if err := os.MkdirAll(bytecodesDir, 0755); err != nil { - return fmt.Errorf("failed to make bytecodes dir: %w", err) - } - return writeBytecode(bytecodesDir, bc, common.Address{}) -} - -func writeBytecode(bytecodesDir string, code []byte, addr common.Address) error { - codeHash := crypto.Keccak256Hash(code) - name := filepath.Join(bytecodesDir, fmt.Sprintf("%s.bin.gz", codeHash)) - _, err := os.Stat(name) - if err == nil { - // file already exists - return nil - } - if !os.IsNotExist(err) { - return fmt.Errorf("failed to check for pre-existing bytecode %s for address %s: %w", codeHash, addr, err) - } - var buf bytes.Buffer - w, err := gzip.NewWriterLevel(&buf, 9) - if err != nil { - return fmt.Errorf("failed to construct gzip writer for bytecode %s: %w", codeHash, err) - } - if _, err := w.Write(code); err != nil { - return fmt.Errorf("failed to write bytecode %s to gzip writer: %w", codeHash, err) - } - if err := w.Close(); err != nil { - return fmt.Errorf("failed to close gzip writer: %w", err) - } - // new bytecode - if err := os.WriteFile(name, buf.Bytes(), 0755); err != nil { - return fmt.Errorf("failed to write bytecode %s of account %s: %w", codeHash, addr, err) - } - return nil -} diff --git a/op-chain-ops/crossdomain/legacy_withdrawal.go b/op-chain-ops/crossdomain/legacy_withdrawal.go deleted file mode 100644 index a70d12deecd9..000000000000 --- a/op-chain-ops/crossdomain/legacy_withdrawal.go +++ /dev/null @@ -1,192 +0,0 @@ -package crossdomain - -import ( - "bytes" - "errors" - "fmt" - "math/big" - - "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" - "github.com/ethereum/go-ethereum/crypto" -) - -// LegacyWithdrawal represents a pre bedrock upgrade withdrawal. -type LegacyWithdrawal struct { - // MessageSender is the caller of the message passer - MessageSender common.Address `json:"who"` - // XDomainTarget is the L1 target of the withdrawal message - XDomainTarget common.Address `json:"target"` - // XDomainSender is the L2 withdrawing account - XDomainSender common.Address `json:"sender"` - // XDomainData represents the calldata of the withdrawal message - XDomainData hexutil.Bytes `json:"data"` - // XDomainNonce represents the nonce of the withdrawal - XDomainNonce *big.Int `json:"nonce"` -} - -var _ WithdrawalMessage = (*LegacyWithdrawal)(nil) - -// NewLegacyWithdrawal will construct a LegacyWithdrawal -func NewLegacyWithdrawal(msgSender, target, sender common.Address, data []byte, nonce *big.Int) *LegacyWithdrawal { - return &LegacyWithdrawal{ - MessageSender: msgSender, - XDomainTarget: target, - XDomainSender: sender, - XDomainData: data, - XDomainNonce: nonce, - } -} - -// Encode will serialize the Withdrawal in the legacy format so that it -// is suitable for hashing. This assumes that the message is being withdrawn -// through the standard optimism cross domain messaging system by hashing in -// the L2CrossDomainMessenger address. -func (w *LegacyWithdrawal) Encode() ([]byte, error) { - enc, err := EncodeCrossDomainMessageV0(w.XDomainTarget, w.XDomainSender, []byte(w.XDomainData), w.XDomainNonce) - if err != nil { - return nil, fmt.Errorf("cannot encode LegacyWithdrawal: %w", err) - } - - out := make([]byte, len(enc)+len(predeploys.L2CrossDomainMessengerAddr.Bytes())) - copy(out, enc) - copy(out[len(enc):], predeploys.L2CrossDomainMessengerAddr.Bytes()) - return out, nil -} - -// Decode will decode a serialized LegacyWithdrawal. There is a known inconsistency -// where the decoded `msg.sender` is not authenticated. A round trip of encoding and -// decoding with a spoofed withdrawal will result in a different message being recovered. -func (w *LegacyWithdrawal) Decode(data []byte) error { - if len(data) < len(predeploys.L2CrossDomainMessengerAddr)+4 { - return fmt.Errorf("withdrawal data too short: %d", len(data)) - } - - selector := crypto.Keccak256([]byte("relayMessage(address,address,bytes,uint256)"))[0:4] - if !bytes.Equal(data[0:4], selector) { - return fmt.Errorf("invalid selector: 0x%x", data[0:4]) - } - - // This should be the L2CrossDomainMessenger address but is not guaranteed - // to be. - msgSender := data[len(data)-len(predeploys.L2CrossDomainMessengerAddr):] - - raw := data[4 : len(data)-len(predeploys.L2CrossDomainMessengerAddr)] - - args := abi.Arguments{ - {Name: "target", Type: AddressType}, - {Name: "sender", Type: AddressType}, - {Name: "data", Type: BytesType}, - {Name: "nonce", Type: Uint256Type}, - } - - decoded, err := args.Unpack(raw) - if err != nil { - return err - } - - target, ok := decoded[0].(common.Address) - if !ok { - return errors.New("cannot abi decode target") - } - sender, ok := decoded[1].(common.Address) - if !ok { - return errors.New("cannot abi decode sender") - } - msgData, ok := decoded[2].([]byte) - if !ok { - return errors.New("cannot abi decode data") - } - nonce, ok := decoded[3].(*big.Int) - if !ok { - return errors.New("cannot abi decode nonce") - } - - w.MessageSender = common.BytesToAddress(msgSender) - w.XDomainTarget = target - w.XDomainSender = sender - w.XDomainData = msgData - w.XDomainNonce = nonce - return nil -} - -// Hash will compute the legacy style hash that is computed in the -// OVM_L2ToL1MessagePasser. -func (w *LegacyWithdrawal) Hash() (common.Hash, error) { - encoded, err := w.Encode() - if err != nil { - return common.Hash{}, fmt.Errorf("cannot hash LegacyWithdrawal: %w", err) - } - hash := crypto.Keccak256(encoded) - return common.BytesToHash(hash), nil -} - -// StorageSlot will compute the storage slot that is set -// to true in the legacy L2ToL1MessagePasser. -func (w *LegacyWithdrawal) StorageSlot() (common.Hash, error) { - hash, err := w.Hash() - if err != nil { - return common.Hash{}, fmt.Errorf("cannot compute storage slot: %w", err) - } - preimage := make([]byte, 64) - copy(preimage, hash.Bytes()) - - slot := crypto.Keccak256(preimage) - return common.BytesToHash(slot), nil -} - -// Value returns the ETH value associated with the withdrawal. Since -// ETH was represented as an ERC20 token before the Bedrock upgrade, -// the sender and calldata must be observed and the value must be parsed -// out if "finalizeETHWithdrawal" is the method. -func (w *LegacyWithdrawal) Value() (*big.Int, error) { - abi, err := bindings.L1StandardBridgeMetaData.GetAbi() - if err != nil { - return nil, err - } - - value := new(big.Int) - - // Parse the 4byte selector - method, err := abi.MethodById(w.XDomainData) - // If it is an unknown selector, there is no value - if err != nil { - return value, nil - } - - isFromL2StandardBridge := w.XDomainSender == predeploys.L2StandardBridgeAddr - if isFromL2StandardBridge && method.Name == "finalizeETHWithdrawal" { - data, err := method.Inputs.Unpack(w.XDomainData[4:]) - if err != nil { - return nil, err - } - // bounds check - if len(data) < 3 { - return nil, errors.New("not enough data") - } - var ok bool - value, ok = data[2].(*big.Int) - if !ok { - return nil, errors.New("not big.Int") - } - } - - return value, nil -} - -// CrossDomainMessage turns the LegacyWithdrawal into -// a CrossDomainMessage. LegacyWithdrawals do not have -// the concept of value or gaslimit, so set them to 0. -func (w *LegacyWithdrawal) CrossDomainMessage() *CrossDomainMessage { - return &CrossDomainMessage{ - Nonce: w.XDomainNonce, - Sender: w.XDomainSender, - Target: w.XDomainTarget, - Value: new(big.Int), - GasLimit: new(big.Int), - Data: []byte(w.XDomainData), - } -} diff --git a/op-chain-ops/crossdomain/legacy_withdrawal_test.go b/op-chain-ops/crossdomain/legacy_withdrawal_test.go deleted file mode 100644 index 3402835d23c7..000000000000 --- a/op-chain-ops/crossdomain/legacy_withdrawal_test.go +++ /dev/null @@ -1,365 +0,0 @@ -package crossdomain_test - -import ( - "encoding/json" - "fmt" - "math/big" - "os" - "path/filepath" - "strings" - "testing" - - "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" - "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" -) - -// callFrame represents the response returned from geth's -// `debug_traceTransaction` callTracer -type callFrame struct { - Type string `json:"type"` - From string `json:"from"` - To string `json:"to,omitempty"` - Value string `json:"value,omitempty"` - Gas string `json:"gas"` - GasUsed string `json:"gasUsed"` - Input string `json:"input"` - Output string `json:"output,omitempty"` - Error string `json:"error,omitempty"` - Calls []callFrame `json:"calls,omitempty"` -} - -// stateDiff represents the response returned from geth's -// `debug_traceTransaction` preStateTracer -type stateDiff map[common.Address]stateDiffAccount - -// stateDiffAccount represents a single account in the preStateTracer -type stateDiffAccount struct { - Balance hexutil.Big `json:"balance"` - Code hexutil.Bytes `json:"code"` - Nonce uint64 `json:"nonce"` - Storage map[common.Hash]common.Hash -} - -var ( - // traces represents a prepopulated map of call traces - traces map[string]*callFrame - // receipts represents a prepopulated map of receipts - receipts map[string]*types.Receipt - // stateDiffs represents a prepopulated map of state diffs - stateDiffs map[string]stateDiff - // passMessageABI is a JSON representation of the legacy L2ToL1MessagePasser ABI - passMessageABI = "[{\"inputs\":[{\"internalType\":\"bytes\",\"name\":\"_message\",\"type\":\"bytes\"}],\"name\":\"passMessageToL1\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"}]" - // passMessage represents an initialized L2ToL1MessagePasser ABI - passMessage abi.ABI - // base represents - base = "testdata" - // callTracesPath represents - callTracesPath = filepath.Join(base, "call-traces") - // receiptsPath represents - receiptsPath = filepath.Join(base, "receipts") - // stateDiffsPath represents - stateDiffsPath = filepath.Join(base, "state-diffs") -) - -func init() { - traces = make(map[string]*callFrame) - receipts = make(map[string]*types.Receipt) - stateDiffs = make(map[string]stateDiff) - - // Read all of the receipt test vectors into memory - if err := readReceipts(); err != nil { - panic(err) - } - // Read all of the transaction trace vectors into memory - if err := readTraces(); err != nil { - panic(err) - } - // Read all of the state diff vectors into memory - if err := readStateDiffs(); err != nil { - panic(err) - } - // Initialize the message passer ABI - var err error - passMessage, err = abi.JSON(strings.NewReader(passMessageABI)) - if err != nil { - panic(err) - } -} - -// TestWithdrawalLegacyStorageSlot will test that the computation -// of the legacy storage slot is correct. It is done so using real -// test vectors generated from mainnet. -func TestWithdrawalLegacyStorageSlot(t *testing.T) { - for hash, trace := range traces { - t.Run(hash, func(t *testing.T) { - // Given a callTrace, find the call that corresponds - // to L2ToL1MessagePasser.passMessageToL1 - call := findPassMessage(trace) - require.NotNil(t, call) - - receipt, ok := receipts[hash] - require.True(t, ok) - - // Given a receipt, parse the cross domain message - // from its logs - msg, err := findCrossDomainMessage(receipt) - require.Nil(t, err) - // Ensure that it is a version 0 cross domain message - require.Equal(t, uint64(0), msg.Version()) - - // Encode the cross domain message - encoded, err := msg.Encode() - require.Nil(t, err) - - // ABI encode the serialized cross domain message - packed, err := passMessage.Pack("passMessageToL1", encoded) - require.Nil(t, err) - - // Decode the calldata where the L2CrossDomainMessenger is calling - // L2ToL1MessagePasser.passMessageToL1 from the callTrace - calldata := hexutil.MustDecode(call.Input) - - // If these values are the same, we know for a fact that the - // cross domain message was correctly parsed from the logs. - require.Equal(t, calldata, packed) - - // Cast the cross domain message to a withdrawal. Note that - // this only works for legacy style messages - withdrawal := toWithdrawal(t, common.HexToAddress(call.From), msg) - - // Compute the legacy storage slot for the withdrawal - slot, err := withdrawal.StorageSlot() - require.Nil(t, err) - - // Get the state diff that corresponds to this transaction - diff, ok := stateDiffs[hash] - require.True(t, ok) - - // Get the account out of the state diff that corresponds - // to the L2ToL1MessagePasser - messagePasser, ok := diff[predeploys.LegacyMessagePasserAddr] - require.True(t, ok) - - // The computed storage slot must be in the state diff. Note - // that the built-in preStateTracer includes the storage slots - // that were altered by the transaction but the values are - // the values before any modifications to state by the transaction - _, ok = messagePasser.Storage[slot] - require.True(t, ok) - }) - } -} - -func FuzzEncodeDecodeLegacyWithdrawal(f *testing.F) { - f.Fuzz(func(t *testing.T, _msgSender, _target, _sender, _nonce, data []byte) { - msgSender := common.BytesToAddress(_msgSender) - target := common.BytesToAddress(_target) - sender := common.BytesToAddress(_sender) - nonce := new(big.Int).SetBytes(_nonce) - - withdrawal := crossdomain.NewLegacyWithdrawal(msgSender, target, sender, data, nonce) - - encoded, err := withdrawal.Encode() - require.Nil(t, err) - - var w crossdomain.LegacyWithdrawal - err = w.Decode(encoded) - require.Nil(t, err) - - require.Equal(t, withdrawal.XDomainNonce.Uint64(), w.XDomainNonce.Uint64()) - require.Equal(t, withdrawal.XDomainSender, w.XDomainSender) - require.Equal(t, withdrawal.XDomainTarget, w.XDomainTarget) - require.Equal(t, withdrawal.XDomainData, w.XDomainData) - }) -} - -// findPassMessage pulls the call from the L2CrossDomainMessenger to the -// L2ToL1MessagePasser out of the call trace. This call is used to assert -// against the calldata -func findPassMessage(trace *callFrame) *callFrame { - isCall := trace.Type == "CALL" - isTarget := trace.To == predeploys.LegacyMessagePasser - isFrom := trace.From == predeploys.L2CrossDomainMessenger - if isCall && isTarget && isFrom { - return trace - } - for _, subcall := range trace.Calls { - if call := findPassMessage(&subcall); call != nil { - return call - } - } - return nil -} - -// findCrossDomainMessage will parse a CrossDomainMessage from a receipt -func findCrossDomainMessage(receipt *types.Receipt) (*crossdomain.CrossDomainMessage, error) { - backend := backends.NewSimulatedBackend(nil, 15000000) // nolint:staticcheck - l2xdm, err := bindings.NewL2CrossDomainMessenger(predeploys.L2CrossDomainMessengerAddr, backend) - if err != nil { - return nil, err - } - abi, _ := bindings.L2CrossDomainMessengerMetaData.GetAbi() - var msg crossdomain.CrossDomainMessage - - seen := false - - // Assume there is only 1 deposit per transaction - for _, log := range receipt.Logs { - event, _ := abi.EventByID(log.Topics[0]) - // Not the event we are looking for - if event == nil { - continue - } - // Parse the legacy event - if event.Name == "SentMessage" { - e, _ := l2xdm.ParseSentMessage(*log) - msg.Target = e.Target - msg.Sender = e.Sender - msg.Data = e.Message - msg.Nonce = e.MessageNonce - msg.GasLimit = e.GasLimit - - // Set seen to true to ensure that this event - // was observed - seen = true - } - // Parse the new extension event - if event.Name == "SentMessageExtension1" { - e, _ := l2xdm.ParseSentMessageExtension1(*log) - msg.Value = e.Value - } - } - if seen { - return &msg, nil - } else { - return nil, fmt.Errorf("cannot find receipt for %s", receipt.TxHash) - } -} - -// readTraces will read all traces into memory -func readTraces() error { - entries, err := os.ReadDir(callTracesPath) - if err != nil { - return err - } - for _, entry := range entries { - name := entry.Name() - trace, err := readTrace(name) - if err != nil { - return err - } - traces[name] = trace - } - return nil -} - -// readReceipts will read all receipts into memory -func readReceipts() error { - entries, err := os.ReadDir(receiptsPath) - if err != nil { - return err - } - for _, entry := range entries { - name := entry.Name() - trace, err := readReceipt(name) - if err != nil { - return err - } - receipts[name] = trace - } - return nil -} - -// readStateDiffs will read all state diffs into memory -func readStateDiffs() error { - entries, err := os.ReadDir(stateDiffsPath) - if err != nil { - return err - } - for _, entry := range entries { - name := entry.Name() - diff, err := readStateDiff(name) - if err != nil { - return err - } - stateDiffs[name] = diff - } - return nil -} - -// readTrace will read the transaction trace by hash from disk -func readTrace(hash string) (*callFrame, error) { - vector := filepath.Join(callTracesPath, hash) - file, err := os.ReadFile(vector) - if err != nil { - return nil, err - } - var trace callFrame - if err := json.Unmarshal(file, &trace); err != nil { - return nil, err - } - return &trace, nil -} - -// readReceipt will read the receipt by hash from disk -func readReceipt(hash string) (*types.Receipt, error) { - vector := filepath.Join(receiptsPath, hash) - file, err := os.ReadFile(vector) - if err != nil { - return nil, err - } - var receipt types.Receipt - if err := json.Unmarshal(file, &receipt); err != nil { - return nil, err - } - return &receipt, nil -} - -// readStateDiff will read the state diff by hash from disk -func readStateDiff(hash string) (stateDiff, error) { - vector := filepath.Join(stateDiffsPath, hash) - file, err := os.ReadFile(vector) - if err != nil { - return nil, err - } - var diff stateDiff - if err := json.Unmarshal(file, &diff); err != nil { - return nil, err - } - return diff, nil -} - -// ToWithdrawal will turn a CrossDomainMessage into a Withdrawal. -// This only works for version 0 CrossDomainMessages as not all of -// the data is present for version 1 CrossDomainMessages to be turned -// into Withdrawals. -func toWithdrawal(t *testing.T, msgSender common.Address, c *crossdomain.CrossDomainMessage) *crossdomain.LegacyWithdrawal { - version := c.Version() - switch version { - case 0: - if c.Value != nil && c.Value.Cmp(common.Big0) != 0 { - t.Fatalf("version 0 messages must have 0 value") - } - w := &crossdomain.LegacyWithdrawal{ - MessageSender: msgSender, - XDomainTarget: c.Target, - XDomainSender: c.Sender, - XDomainData: c.Data, - XDomainNonce: c.Nonce, - } - return w - case 1: - t.Fatalf("cannot convert version 1 messages to withdrawals") - default: - t.Fatalf("unknown message version: %d", version) - } - return nil -} diff --git a/op-chain-ops/crossdomain/migrate.go b/op-chain-ops/crossdomain/migrate.go deleted file mode 100644 index e542db2c4ecc..000000000000 --- a/op-chain-ops/crossdomain/migrate.go +++ /dev/null @@ -1,120 +0,0 @@ -package crossdomain - -import ( - "fmt" - "math/big" - - "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" -) - -// Constants used by `CrossDomainMessenger.baseGas` -var ( - RelayConstantOverhead uint64 = 200_000 - RelayPerByteDataCost uint64 = params.TxDataNonZeroGasEIP2028 - MinGasDynamicOverheadNumerator uint64 = 64 - MinGasDynamicOverheadDenominator uint64 = 63 - RelayCallOverhead uint64 = 40_000 - RelayReservedGas uint64 = 40_000 - RelayGasCheckBuffer uint64 = 5_000 -) - -// MigrateWithdrawal will turn a LegacyWithdrawal into a bedrock -// style Withdrawal. -func MigrateWithdrawal( - withdrawal *LegacyWithdrawal, - l1CrossDomainMessenger *common.Address, - chainID *big.Int, -) (*Withdrawal, error) { - // Attempt to parse the value - value, err := withdrawal.Value() - if err != nil { - return nil, fmt.Errorf("cannot migrate withdrawal: %w", err) - } - - abi, err := bindings.L1CrossDomainMessengerMetaData.GetAbi() - if err != nil { - return nil, err - } - - // Migrated withdrawals are specified as version 0. Both the - // L2ToL1MessagePasser and the CrossDomainMessenger use the same - // versioning scheme. Both should be set to version 0 - versionedNonce := EncodeVersionedNonce(withdrawal.XDomainNonce, new(big.Int)) - // Encode the call to `relayMessage` on the `CrossDomainMessenger`. - // The minGasLimit can safely be 0 here. - data, err := abi.Pack( - "relayMessage", - versionedNonce, - withdrawal.XDomainSender, - withdrawal.XDomainTarget, - value, - new(big.Int), - []byte(withdrawal.XDomainData), - ) - if err != nil { - return nil, fmt.Errorf("cannot abi encode relayMessage: %w", err) - } - - gasLimit := MigrateWithdrawalGasLimit(data, chainID) - - w := NewWithdrawal( - versionedNonce, - &predeploys.L2CrossDomainMessengerAddr, - l1CrossDomainMessenger, - value, - new(big.Int).SetUint64(gasLimit), - data, - ) - return w, nil -} - -// MigrateWithdrawalGasLimit computes the gas limit for the migrated withdrawal. -// The chain id is used to determine the overhead. -func MigrateWithdrawalGasLimit(data []byte, chainID *big.Int) uint64 { - // Compute the upper bound on the gas limit. This could be more - // accurate if individual 0 bytes and non zero bytes were accounted - // for. - dataCost := uint64(len(data)) * RelayPerByteDataCost - - // Goerli has a lower gas limit than other chains. - var overhead uint64 - if chainID.Cmp(big.NewInt(420)) == 0 { - overhead = uint64(200_000) - } else { - // Mimic `baseGas` from `CrossDomainMessenger.sol` - overhead = uint64( - // Constant overhead - RelayConstantOverhead + - // Dynamic overhead (EIP-150) - // We use a constant 1 million gas limit due to the overhead of simulating all migrated withdrawal - // transactions during the migration. This is a conservative estimate, and if a withdrawal - // uses more than the minimum gas limit, it will fail and need to be replayed with a higher - // gas limit. - (MinGasDynamicOverheadNumerator*1_000_000)/MinGasDynamicOverheadDenominator + - // Gas reserved for the worst-case cost of 3/5 of the `CALL` opcode's dynamic gas - // factors. (Conservative) - RelayCallOverhead + - // Relay reserved gas (to ensure execution of `relayMessage` completes after the - // subcontext finishes executing) (Conservative) - RelayReservedGas + - // Gas reserved for the execution between the `hasMinGas` check and the `CALL` - // opcode. (Conservative) - RelayGasCheckBuffer, - ) - } - - // Set the outer minimum gas limit. This cannot be zero - gasLimit := dataCost + overhead - - // Cap the gas limit to be 25 million to prevent creating withdrawals - // that go over the block gas limit. - if gasLimit > 25_000_000 { - gasLimit = 25_000_000 - } - - return gasLimit -} diff --git a/op-chain-ops/crossdomain/migrate_test.go b/op-chain-ops/crossdomain/migrate_test.go deleted file mode 100644 index 362b129246e0..000000000000 --- a/op-chain-ops/crossdomain/migrate_test.go +++ /dev/null @@ -1,93 +0,0 @@ -package crossdomain_test - -import ( - "fmt" - "math/big" - "testing" - - "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" -) - -var ( - big25Million = big.NewInt(25_000_000) - bigGoerliChainID = big.NewInt(420) -) - -func TestMigrateWithdrawal(t *testing.T) { - withdrawals := make([]*crossdomain.LegacyWithdrawal, 0) - - for _, receipt := range receipts { - msg, err := findCrossDomainMessage(receipt) - require.Nil(t, err) - legacyWithdrawal := toWithdrawal(t, predeploys.L2CrossDomainMessengerAddr, msg) - withdrawals = append(withdrawals, legacyWithdrawal) - } - - l1CrossDomainMessenger := common.HexToAddress("0x25ace71c97B33Cc4729CF772ae268934F7ab5fA1") - for i, legacy := range withdrawals { - t.Run(fmt.Sprintf("test%d", i), func(t *testing.T) { - withdrawal, err := crossdomain.MigrateWithdrawal(legacy, &l1CrossDomainMessenger, bigGoerliChainID) - require.Nil(t, err) - require.NotNil(t, withdrawal) - - require.Equal(t, legacy.XDomainNonce.Uint64(), withdrawal.Nonce.Uint64()) - require.Equal(t, *withdrawal.Sender, predeploys.L2CrossDomainMessengerAddr) - require.Equal(t, *withdrawal.Target, l1CrossDomainMessenger) - // Always equal to or lower than the cap - require.True(t, withdrawal.GasLimit.Cmp(big25Million) <= 0) - }) - } -} - -// TestMigrateWithdrawalGasLimitMax computes the migrated withdrawal -// gas limit with a very large amount of data. The max value for a migrated -// withdrawal's gas limit is 25 million. -func TestMigrateWithdrawalGasLimitMax(t *testing.T) { - size := 300_000_000 / 16 - data := make([]byte, size) - for _, i := range data { - data[i] = 0xff - } - - result := crossdomain.MigrateWithdrawalGasLimit(data, bigGoerliChainID) - require.Equal(t, result, big25Million.Uint64()) -} - -// TestMigrateWithdrawalGasLimit tests an assortment of zero and non zero -// bytes when computing the migrated withdrawal's gas limit. -func TestMigrateWithdrawalGasLimit(t *testing.T) { - tests := []struct { - input []byte - output uint64 - }{ - { - input: []byte{}, - output: 200_000, - }, - { - input: []byte{0xff}, - output: 200_000 + 16, - }, - { - input: []byte{0xff, 0x00}, - output: 200_000 + 16 + 16, - }, - { - input: []byte{0x00}, - output: 200_000 + 16, - }, - { - input: []byte{0x00, 0x00, 0x00}, - output: 200_000 + 16 + 16 + 16, - }, - } - - for _, test := range tests { - result := crossdomain.MigrateWithdrawalGasLimit(test.input, bigGoerliChainID) - require.Equal(t, test.output, result) - } -} diff --git a/op-chain-ops/crossdomain/testdata/README.md b/op-chain-ops/crossdomain/testdata/README.md deleted file mode 100644 index 584c077a1e5c..000000000000 --- a/op-chain-ops/crossdomain/testdata/README.md +++ /dev/null @@ -1,9 +0,0 @@ -# crossdomain/testdata - -Real world test data is used to generate test vectors for the withdrawal -hashing. The `trace.sh` script will generate artifacts used as part of the -tests. It accepts a single argument, being the transaction hash to fetch -artifacts for. It will fetch a receipt, a call trace and a state diff. -The tests require that a file named after the transaction hash exists -in each of the directories `call-traces`, `receipts` and `state-diffs`. -The `trace.sh` script will ensure that the files are created correctly. diff --git a/op-chain-ops/crossdomain/testdata/call-traces/0x26b854fe0b8f0c5ad15d5c3c1291107cc870f5d7351cfc399e23e68f22231fbe.json b/op-chain-ops/crossdomain/testdata/call-traces/0x26b854fe0b8f0c5ad15d5c3c1291107cc870f5d7351cfc399e23e68f22231fbe.json deleted file mode 100644 index 6896bb87a64e..000000000000 --- a/op-chain-ops/crossdomain/testdata/call-traces/0x26b854fe0b8f0c5ad15d5c3c1291107cc870f5d7351cfc399e23e68f22231fbe.json +++ /dev/null @@ -1,55 +0,0 @@ -{ - "calls": [ - { - "from": "0x4200000000000000000000000000000000000010", - "gas": "0x1647d", - "gasUsed": "0x341b", - "input": "0x9dc29fac0000000000000000000000009c8f005ab27adb94f3d49020a15722db2fcd9f2700000000000000000000000000000000000000000000000000232bff5f46c000", - "output": "0x", - "to": "0xdeaddeaddeaddeaddeaddeaddeaddeaddead0000", - "type": "CALL", - "value": "0x0" - }, - { - "from": "0x4200000000000000000000000000000000000010", - "gas": "0x12fe8", - "gasUsed": "0x94b", - "input": "0xc01e1bd6", - "output": "0x0000000000000000000000000000000000000000000000000000000000000000", - "to": "0xdeaddeaddeaddeaddeaddeaddeaddeaddead0000", - "type": "CALL", - "value": "0x0" - }, - { - "calls": [ - { - "from": "0x4200000000000000000000000000000000000007", - "gas": "0x8ea6", - "gasUsed": "0x5e1e", - "input": "0xcafa81dc00000000000000000000000000000000000000000000000000000000000000200000000000000000000000000000000000000000000000000000000000000164cbd4ece900000000000000000000000099c9fc46f92e8a1c0dec1b1747d010903e884be100000000000000000000000042000000000000000000000000000000000000100000000000000000000000000000000000000000000000000000000000000080000000000000000000000000000000000000000000000000000000000001b04d00000000000000000000000000000000000000000000000000000000000000a41532ec340000000000000000000000009c8f005ab27adb94f3d49020a15722db2fcd9f270000000000000000000000009c8f005ab27adb94f3d49020a15722db2fcd9f2700000000000000000000000000000000000000000000000000232bff5f46c000000000000000000000000000000000000000000000000000000000000000008000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000", - "output": "0x", - "to": "0x4200000000000000000000000000000000000000", - "type": "CALL", - "value": "0x0" - } - ], - "from": "0x4200000000000000000000000000000000000010", - "gas": "0x10644", - "gasUsed": "0xf29d", - "input": "0x3dbb202b00000000000000000000000099c9fc46f92e8a1c0dec1b1747d010903e884be10000000000000000000000000000000000000000000000000000000000000060000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000a41532ec340000000000000000000000009c8f005ab27adb94f3d49020a15722db2fcd9f270000000000000000000000009c8f005ab27adb94f3d49020a15722db2fcd9f2700000000000000000000000000000000000000000000000000232bff5f46c0000000000000000000000000000000000000000000000000000000000000000080000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000", - "output": "0x", - "to": "0x4200000000000000000000000000000000000007", - "type": "CALL", - "value": "0x0" - } - ], - "from": "0x9c8f005ab27adb94f3d49020a15722db2fcd9f27", - "gas": "0x177d2", - "gasUsed": "0x16ce2", - "input": "0x32b7006d000000000000000000000000deaddeaddeaddeaddeaddeaddeaddeaddead000000000000000000000000000000000000000000000000000000232bff5f46c000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000", - "output": "0x", - "time": "112.522948ms", - "to": "0x4200000000000000000000000000000000000010", - "type": "CALL", - "value": "0x0" -} diff --git a/op-chain-ops/crossdomain/testdata/call-traces/0x32d3b5a0178a33cfbf904cfd36f66a13ff8576f409f15aae86dc3ff0e101c93a.json b/op-chain-ops/crossdomain/testdata/call-traces/0x32d3b5a0178a33cfbf904cfd36f66a13ff8576f409f15aae86dc3ff0e101c93a.json deleted file mode 100644 index 284b4167dc11..000000000000 --- a/op-chain-ops/crossdomain/testdata/call-traces/0x32d3b5a0178a33cfbf904cfd36f66a13ff8576f409f15aae86dc3ff0e101c93a.json +++ /dev/null @@ -1,55 +0,0 @@ -{ - "calls": [ - { - "from": "0x4200000000000000000000000000000000000010", - "gas": "0x318ce", - "gasUsed": "0x427b", - "input": "0x9dc29fac0000000000000000000000003178490d60b5cceaa5a79fd4d9050c7405bab80c0000000000000000000000000000000000000000000000a3b61828488b117259", - "output": "0x", - "to": "0x76fb31fb4af56892a25e32cfc43de717950c9278", - "type": "CALL", - "value": "0x0" - }, - { - "from": "0x4200000000000000000000000000000000000010", - "gas": "0x2d612", - "gasUsed": "0xa14", - "input": "0xc01e1bd6", - "output": "0x0000000000000000000000007fc66500c84a76ad7e9c93437bfc5ac33e2ddae9", - "to": "0x76fb31fb4af56892a25e32cfc43de717950c9278", - "type": "CALL", - "value": "0x0" - }, - { - "calls": [ - { - "from": "0x4200000000000000000000000000000000000007", - "gas": "0x22b8c", - "gasUsed": "0x5ecf", - "input": "0xcafa81dc000000000000000000000000000000000000000000000000000000000000002000000000000000000000000000000000000000000000000000000000000001a4cbd4ece900000000000000000000000099c9fc46f92e8a1c0dec1b1747d010903e884be100000000000000000000000042000000000000000000000000000000000000100000000000000000000000000000000000000000000000000000000000000080000000000000000000000000000000000000000000000000000000000001b04f00000000000000000000000000000000000000000000000000000000000000e4a9f9e6750000000000000000000000007fc66500c84a76ad7e9c93437bfc5ac33e2ddae900000000000000000000000076fb31fb4af56892a25e32cfc43de717950c92780000000000000000000000003178490d60b5cceaa5a79fd4d9050c7405bab80c0000000000000000000000003178490d60b5cceaa5a79fd4d9050c7405bab80c0000000000000000000000000000000000000000000000a3b61828488b11725900000000000000000000000000000000000000000000000000000000000000c000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000", - "output": "0x", - "to": "0x4200000000000000000000000000000000000000", - "type": "CALL", - "value": "0x0" - } - ], - "from": "0x4200000000000000000000000000000000000010", - "gas": "0x2aae9", - "gasUsed": "0xf705", - "input": "0x3dbb202b00000000000000000000000099c9fc46f92e8a1c0dec1b1747d010903e884be10000000000000000000000000000000000000000000000000000000000000060000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000e4a9f9e6750000000000000000000000007fc66500c84a76ad7e9c93437bfc5ac33e2ddae900000000000000000000000076fb31fb4af56892a25e32cfc43de717950c92780000000000000000000000003178490d60b5cceaa5a79fd4d9050c7405bab80c0000000000000000000000003178490d60b5cceaa5a79fd4d9050c7405bab80c0000000000000000000000000000000000000000000000a3b61828488b11725900000000000000000000000000000000000000000000000000000000000000c0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000", - "output": "0x", - "to": "0x4200000000000000000000000000000000000007", - "type": "CALL", - "value": "0x0" - } - ], - "from": "0x3178490d60b5cceaa5a79fd4d9050c7405bab80c", - "gas": "0x33310", - "gasUsed": "0x18136", - "input": "0x32b7006d00000000000000000000000076fb31fb4af56892a25e32cfc43de717950c92780000000000000000000000000000000000000000000000a3b61828488b117259000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000", - "output": "0x", - "time": "40.447524ms", - "to": "0x4200000000000000000000000000000000000010", - "type": "CALL", - "value": "0x0" -} diff --git a/op-chain-ops/crossdomain/testdata/call-traces/0x38236157c6941ef64f4dd0dfa7efed4a82ef9fccdcdda75a8ee89cbe831b182b.json b/op-chain-ops/crossdomain/testdata/call-traces/0x38236157c6941ef64f4dd0dfa7efed4a82ef9fccdcdda75a8ee89cbe831b182b.json deleted file mode 100644 index e756e620a1fd..000000000000 --- a/op-chain-ops/crossdomain/testdata/call-traces/0x38236157c6941ef64f4dd0dfa7efed4a82ef9fccdcdda75a8ee89cbe831b182b.json +++ /dev/null @@ -1,45 +0,0 @@ -{ - "calls": [ - { - "from": "0x467194771dae2967aef3ecbedd3bf9a310c76c65", - "gas": "0x150b9", - "gasUsed": "0x395f", - "input": "0x9dc29fac0000000000000000000000006659612eb0e2464ccadf7a5e851bcd12873f6e040000000000000000000000000000000000000000000211654585005212800000", - "output": "0x", - "to": "0xda10009cbd5d07dd0cecc66161fc93d7c9000da1", - "type": "CALL", - "value": "0x0" - }, - { - "calls": [ - { - "from": "0x4200000000000000000000000000000000000007", - "gas": "0x86e2", - "gasUsed": "0x5ecf", - "input": "0xcafa81dc000000000000000000000000000000000000000000000000000000000000002000000000000000000000000000000000000000000000000000000000000001a4cbd4ece900000000000000000000000010e6593cdda8c58a1d0f14c5164b376352a55f2f000000000000000000000000467194771dae2967aef3ecbedd3bf9a310c76c650000000000000000000000000000000000000000000000000000000000000080000000000000000000000000000000000000000000000000000000000001b05e00000000000000000000000000000000000000000000000000000000000000e4a9f9e6750000000000000000000000006b175474e89094c44da98b954eedeac495271d0f000000000000000000000000da10009cbd5d07dd0cecc66161fc93d7c9000da10000000000000000000000006659612eb0e2464ccadf7a5e851bcd12873f6e040000000000000000000000006659612eb0e2464ccadf7a5e851bcd12873f6e04000000000000000000000000000000000000000000021165458500521280000000000000000000000000000000000000000000000000000000000000000000c000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000", - "output": "0x", - "to": "0x4200000000000000000000000000000000000000", - "type": "CALL", - "value": "0x0" - } - ], - "from": "0x467194771dae2967aef3ecbedd3bf9a310c76c65", - "gas": "0xff92", - "gasUsed": "0xf705", - "input": "0x3dbb202b00000000000000000000000010e6593cdda8c58a1d0f14c5164b376352a55f2f0000000000000000000000000000000000000000000000000000000000000060000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000e4a9f9e6750000000000000000000000006b175474e89094c44da98b954eedeac495271d0f000000000000000000000000da10009cbd5d07dd0cecc66161fc93d7c9000da10000000000000000000000006659612eb0e2464ccadf7a5e851bcd12873f6e040000000000000000000000006659612eb0e2464ccadf7a5e851bcd12873f6e04000000000000000000000000000000000000000000021165458500521280000000000000000000000000000000000000000000000000000000000000000000c0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000", - "output": "0x", - "to": "0x4200000000000000000000000000000000000007", - "type": "CALL", - "value": "0x0" - } - ], - "from": "0x6659612eb0e2464ccadf7a5e851bcd12873f6e04", - "gas": "0x16bb3", - "gasUsed": "0x16bb3", - "input": "0x32b7006d000000000000000000000000da10009cbd5d07dd0cecc66161fc93d7c9000da10000000000000000000000000000000000000000000211654585005212800000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000", - "output": "0x", - "time": "30.357952ms", - "to": "0x467194771dae2967aef3ecbedd3bf9a310c76c65", - "type": "CALL", - "value": "0x0" -} diff --git a/op-chain-ops/crossdomain/testdata/call-traces/0xed57a510022157b14542491a501daed1d58003e4b274b331d2fc40dcc43f0941.json b/op-chain-ops/crossdomain/testdata/call-traces/0xed57a510022157b14542491a501daed1d58003e4b274b331d2fc40dcc43f0941.json deleted file mode 100644 index 71c930e5c2a5..000000000000 --- a/op-chain-ops/crossdomain/testdata/call-traces/0xed57a510022157b14542491a501daed1d58003e4b274b331d2fc40dcc43f0941.json +++ /dev/null @@ -1,210 +0,0 @@ -{ - "calls": [ - { - "calls": [ - { - "from": "0xfe8e48bf36ccc3254081ec8c65965d1c8b2e744d", - "gas": "0x2d816", - "gasUsed": "0x9bb", - "input": "0x70a0823100000000000000000000000090f1cb932dbf94385434c40d53df3727f00e50b1", - "output": "0x0000000000000000000000000000000000000000000001c9f23e7ccc897c65e5", - "to": "0xb9c6ca25452e7f6d0d3340ce1e9b573421afc2ee", - "type": "STATICCALL" - }, - { - "calls": [ - { - "from": "0x01da457aa57abc0dba3fc26d6c350899f04e8417", - "gas": "0x29fdd", - "gasUsed": "0xa27", - "input": "0x70a0823100000000000000000000000090f1cb932dbf94385434c40d53df3727f00e50b1", - "output": "0x0000000000000000000000000000000000000000000000000000000000000000", - "to": "0x45c55bf488d3cb8640f12f63cbedc027e8261e79", - "type": "STATICCALL" - }, - { - "calls": [ - { - "from": "0x37aafb2ee35f1250a001202c660b13c301d2130b", - "gas": "0x258ad", - "gasUsed": "0x1cf2", - "input": "0xfeaf968c", - "output": "0x0000000000000000000000000000000000000000000000000000000000003a1600000000000000000000000000000000000000000082e0fab52217072028a796000000000000000000000000000000000000000000000000000000006327dde9000000000000000000000000000000000000000000000000000000006327dde90000000000000000000000000000000000000000000000000000000000003a16", - "to": "0x22f04bc4162d63730dcde051fdfd97b4f55ff63b", - "type": "STATICCALL" - } - ], - "from": "0x01da457aa57abc0dba3fc26d6c350899f04e8417", - "gas": "0x27fba", - "gasUsed": "0x3d1b", - "input": "0xfeaf968c", - "output": "0x0000000000000000000000000000000000000000000000010000000000003a1600000000000000000000000000000000000000000082e0fab52217072028a796000000000000000000000000000000000000000000000000000000006327dde9000000000000000000000000000000000000000000000000000000006327dde90000000000000000000000000000000000000000000000010000000000003a16", - "to": "0x37aafb2ee35f1250a001202c660b13c301d2130b", - "type": "STATICCALL" - }, - { - "calls": [ - { - "from": "0x94a178f2c480d14f8cdda908d173d7a73f779cb7", - "gas": "0x20589", - "gasUsed": "0x1cf2", - "input": "0xfeaf968c", - "output": "0x00000000000000000000000000000000000000000000000000000000000039e1000000000000000000000000000000000000000003eed3c5c4dd1b5d426c4280000000000000000000000000000000000000000000000000000000006327dfb7000000000000000000000000000000000000000000000000000000006327dfb700000000000000000000000000000000000000000000000000000000000039e1", - "to": "0x0d5642c6329adb3246c13d78b429a9fb1965a0d8", - "type": "STATICCALL" - } - ], - "from": "0x01da457aa57abc0dba3fc26d6c350899f04e8417", - "gas": "0x22b44", - "gasUsed": "0x3d1b", - "input": "0xfeaf968c", - "output": "0x00000000000000000000000000000000000000000000000100000000000039e1000000000000000000000000000000000000000003eed3c5c4dd1b5d426c4280000000000000000000000000000000000000000000000000000000006327dfb7000000000000000000000000000000000000000000000000000000006327dfb700000000000000000000000000000000000000000000000100000000000039e1", - "to": "0x94a178f2c480d14f8cdda908d173d7a73f779cb7", - "type": "STATICCALL" - }, - { - "from": "0x01da457aa57abc0dba3fc26d6c350899f04e8417", - "gas": "0x1d414", - "gasUsed": "0x12a0", - "input": "0x23257c2b53797374656d53657474696e6773000000000000000000000000000000000000726174655374616c65506572696f640000000000000000000000000000000000", - "output": "0x0000000000000000000000000000000000000000000000000000000000001518", - "to": "0x47649022380d182da8010ae5d257fea4227b21ff", - "type": "STATICCALL" - }, - { - "from": "0x01da457aa57abc0dba3fc26d6c350899f04e8417", - "gas": "0x1bbf0", - "gasUsed": "0x300", - "input": "0x23257c2b53797374656d53657474696e6773000000000000000000000000000000000000726174655374616c65506572696f640000000000000000000000000000000000", - "output": "0x0000000000000000000000000000000000000000000000000000000000001518", - "to": "0x47649022380d182da8010ae5d257fea4227b21ff", - "type": "STATICCALL" - }, - { - "from": "0x01da457aa57abc0dba3fc26d6c350899f04e8417", - "gas": "0x1b330", - "gasUsed": "0x300", - "input": "0x23257c2b53797374656d53657474696e6773000000000000000000000000000000000000726174655374616c65506572696f640000000000000000000000000000000000", - "output": "0x0000000000000000000000000000000000000000000000000000000000001518", - "to": "0x47649022380d182da8010ae5d257fea4227b21ff", - "type": "STATICCALL" - }, - { - "from": "0x01da457aa57abc0dba3fc26d6c350899f04e8417", - "gas": "0x1a9f6", - "gasUsed": "0xad0", - "input": "0x23257c2b53797374656d53657474696e677300000000000000000000000000000000000069737375616e6365526174696f00000000000000000000000000000000000000", - "output": "0x00000000000000000000000000000000000000000000000003f70fa11c48cc00", - "to": "0x47649022380d182da8010ae5d257fea4227b21ff", - "type": "STATICCALL" - } - ], - "from": "0xfe8e48bf36ccc3254081ec8c65965d1c8b2e744d", - "gas": "0x2c32d", - "gasUsed": "0x12144", - "input": "0x6bed041500000000000000000000000090f1cb932dbf94385434c40d53df3727f00e50b10000000000000000000000000000000000000000000001c9f23e7ccc897c65e5", - "output": "0x0000000000000000000000000000000000000000000001c9f23e7ccc897c65e50000000000000000000000000000000000000000000000000000000000000000", - "to": "0x01da457aa57abc0dba3fc26d6c350899f04e8417", - "type": "STATICCALL" - } - ], - "from": "0x136b1ec699c62b0606854056f02dc7bb80482d63", - "gas": "0x301cc", - "gasUsed": "0x1552d", - "input": "0x6ac0bf9c00000000000000000000000090f1cb932dbf94385434c40d53df3727f00e50b1", - "output": "0x0000000000000000000000000000000000000000000001c9f23e7ccc897c65e5", - "to": "0xfe8e48bf36ccc3254081ec8c65965d1c8b2e744d", - "type": "STATICCALL" - }, - { - "calls": [ - { - "from": "0xfe8e48bf36ccc3254081ec8c65965d1c8b2e744d", - "gas": "0x18618", - "gasUsed": "0x9c8", - "input": "0x086dabd1", - "output": "0x", - "to": "0xe8c41be1a167314abaf2423b72bf8da826943ffd", - "type": "STATICCALL" - }, - { - "from": "0xfe8e48bf36ccc3254081ec8c65965d1c8b2e744d", - "gas": "0x17a5c", - "gasUsed": "0x1eb", - "input": "0x70a0823100000000000000000000000090f1cb932dbf94385434c40d53df3727f00e50b1", - "output": "0x0000000000000000000000000000000000000000000001c9f23e7ccc897c65e5", - "to": "0xb9c6ca25452e7f6d0d3340ce1e9b573421afc2ee", - "type": "STATICCALL" - }, - { - "from": "0xfe8e48bf36ccc3254081ec8c65965d1c8b2e744d", - "gas": "0x17682", - "gasUsed": "0x1514", - "input": "0xb46310f600000000000000000000000090f1cb932dbf94385434c40d53df3727f00e50b10000000000000000000000000000000000000000000000000000000000000000", - "output": "0x", - "to": "0xb9c6ca25452e7f6d0d3340ce1e9b573421afc2ee", - "type": "CALL", - "value": "0x0" - }, - { - "from": "0xfe8e48bf36ccc3254081ec8c65965d1c8b2e744d", - "gas": "0x14c2b", - "gasUsed": "0x1277", - "input": "0x907dff9700000000000000000000000000000000000000000000000000000000000000c00000000000000000000000000000000000000000000000000000000000000003ddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef00000000000000000000000090f1cb932dbf94385434c40d53df3727f00e50b10000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000200000000000000000000000000000000000000000000001c9f23e7ccc897c65e5", - "output": "0x", - "to": "0x8700daec35af8ff88c16bdf0418774cb3d7599b4", - "type": "CALL", - "value": "0x0" - } - ], - "from": "0x136b1ec699c62b0606854056f02dc7bb80482d63", - "gas": "0x1abd5", - "gasUsed": "0x80f1", - "input": "0xedef719a00000000000000000000000090f1cb932dbf94385434c40d53df3727f00e50b10000000000000000000000000000000000000000000001c9f23e7ccc897c65e5", - "output": "0x", - "to": "0xfe8e48bf36ccc3254081ec8c65965d1c8b2e744d", - "type": "CALL", - "value": "0x0" - }, - { - "from": "0x136b1ec699c62b0606854056f02dc7bb80482d63", - "gas": "0x109c6", - "gasUsed": "0xad0", - "input": "0x23257c2b53797374656d53657474696e677300000000000000000000000000000000000063726f7373446f6d61696e5769746864726177616c4761734c696d6974000000", - "output": "0x00000000000000000000000000000000000000000000000000000000002dc6c0", - "to": "0x47649022380d182da8010ae5d257fea4227b21ff", - "type": "STATICCALL" - }, - { - "calls": [ - { - "from": "0x4200000000000000000000000000000000000007", - "gas": "0x7a8c", - "gasUsed": "0x5d16", - "input": "0xcafa81dc00000000000000000000000000000000000000000000000000000000000000200000000000000000000000000000000000000000000000000000000000000104cbd4ece900000000000000000000000039ea01a0298c315d149a490e34b59dbf2ec7e48f000000000000000000000000136b1ec699c62b0606854056f02dc7bb80482d630000000000000000000000000000000000000000000000000000000000000080000000000000000000000000000000000000000000000000000000000001b04c0000000000000000000000000000000000000000000000000000000000000044f4f7b41a00000000000000000000000090f1cb932dbf94385434c40d53df3727f00e50b10000000000000000000000000000000000000000000001c9f23e7ccc897c65e50000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000", - "output": "0x", - "to": "0x4200000000000000000000000000000000000000", - "type": "CALL", - "value": "0x0" - } - ], - "from": "0x136b1ec699c62b0606854056f02dc7bb80482d63", - "gas": "0xf00f", - "gasUsed": "0xec03", - "input": "0x3dbb202b00000000000000000000000039ea01a0298c315d149a490e34b59dbf2ec7e48f000000000000000000000000000000000000000000000000000000000000006000000000000000000000000000000000000000000000000000000000002dc6c00000000000000000000000000000000000000000000000000000000000000044f4f7b41a00000000000000000000000090f1cb932dbf94385434c40d53df3727f00e50b10000000000000000000000000000000000000000000001c9f23e7ccc897c65e500000000000000000000000000000000000000000000000000000000", - "output": "0x", - "to": "0x4200000000000000000000000000000000000007", - "type": "CALL", - "value": "0x0" - } - ], - "from": "0x90f1cb932dbf94385434c40d53df3727f00e50b1", - "gas": "0x32e3f", - "gasUsed": "0x32e3f", - "input": "0x2e1a7d4d0000000000000000000000000000000000000000000001c9f23e7ccc897c65e5", - "output": "0x", - "time": "406.907662ms", - "to": "0x136b1ec699c62b0606854056f02dc7bb80482d63", - "type": "CALL", - "value": "0x0" -} diff --git a/op-chain-ops/crossdomain/testdata/receipts/0x26b854fe0b8f0c5ad15d5c3c1291107cc870f5d7351cfc399e23e68f22231fbe.json b/op-chain-ops/crossdomain/testdata/receipts/0x26b854fe0b8f0c5ad15d5c3c1291107cc870f5d7351cfc399e23e68f22231fbe.json deleted file mode 100644 index 523bca53d281..000000000000 --- a/op-chain-ops/crossdomain/testdata/receipts/0x26b854fe0b8f0c5ad15d5c3c1291107cc870f5d7351cfc399e23e68f22231fbe.json +++ /dev/null @@ -1,74 +0,0 @@ -{ - "blockHash": "0x4f5fdc9747712cb61871d6d35618a6580671d5ddb85796c9d0790453509cf4cc", - "blockNumber": "0x169900c", - "contractAddress": null, - "cumulativeGasUsed": "0x1c2ca", - "from": "0x9c8f005ab27adb94f3d49020a15722db2fcd9f27", - "gasUsed": "0x1c2ca", - "logs": [ - { - "address": "0xdeaddeaddeaddeaddeaddeaddeaddeaddead0000", - "blockHash": "0x4f5fdc9747712cb61871d6d35618a6580671d5ddb85796c9d0790453509cf4cc", - "blockNumber": "0x169900c", - "data": "0x00000000000000000000000000000000000000000000000000232bff5f46c000", - "logIndex": "0x0", - "removed": false, - "topics": [ - "0xddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef", - "0x0000000000000000000000009c8f005ab27adb94f3d49020a15722db2fcd9f27", - "0x0000000000000000000000000000000000000000000000000000000000000000" - ], - "transactionHash": "0x26b854fe0b8f0c5ad15d5c3c1291107cc870f5d7351cfc399e23e68f22231fbe", - "transactionIndex": "0x0" - }, - { - "address": "0xdeaddeaddeaddeaddeaddeaddeaddeaddead0000", - "blockHash": "0x4f5fdc9747712cb61871d6d35618a6580671d5ddb85796c9d0790453509cf4cc", - "blockNumber": "0x169900c", - "data": "0x00000000000000000000000000000000000000000000000000232bff5f46c000", - "logIndex": "0x1", - "removed": false, - "topics": [ - "0xcc16f5dbb4873280815c1ee09dbd06736cffcc184412cf7a71a0fdb75d397ca5", - "0x0000000000000000000000009c8f005ab27adb94f3d49020a15722db2fcd9f27" - ], - "transactionHash": "0x26b854fe0b8f0c5ad15d5c3c1291107cc870f5d7351cfc399e23e68f22231fbe", - "transactionIndex": "0x0" - }, - { - "address": "0x4200000000000000000000000000000000000007", - "blockHash": "0x4f5fdc9747712cb61871d6d35618a6580671d5ddb85796c9d0790453509cf4cc", - "blockNumber": "0x169900c", - "data": "0x00000000000000000000000042000000000000000000000000000000000000100000000000000000000000000000000000000000000000000000000000000080000000000000000000000000000000000000000000000000000000000001b04d000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000a41532ec340000000000000000000000009c8f005ab27adb94f3d49020a15722db2fcd9f270000000000000000000000009c8f005ab27adb94f3d49020a15722db2fcd9f2700000000000000000000000000000000000000000000000000232bff5f46c0000000000000000000000000000000000000000000000000000000000000000080000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000", - "logIndex": "0x2", - "removed": false, - "topics": [ - "0xcb0f7ffd78f9aee47a248fae8db181db6eee833039123e026dcbff529522e52a", - "0x00000000000000000000000099c9fc46f92e8a1c0dec1b1747d010903e884be1" - ], - "transactionHash": "0x26b854fe0b8f0c5ad15d5c3c1291107cc870f5d7351cfc399e23e68f22231fbe", - "transactionIndex": "0x0" - }, - { - "address": "0x4200000000000000000000000000000000000010", - "blockHash": "0x4f5fdc9747712cb61871d6d35618a6580671d5ddb85796c9d0790453509cf4cc", - "blockNumber": "0x169900c", - "data": "0x0000000000000000000000009c8f005ab27adb94f3d49020a15722db2fcd9f2700000000000000000000000000000000000000000000000000232bff5f46c00000000000000000000000000000000000000000000000000000000000000000600000000000000000000000000000000000000000000000000000000000000000", - "logIndex": "0x3", - "removed": false, - "topics": [ - "0x73d170910aba9e6d50b102db522b1dbcd796216f5128b445aa2135272886497e", - "0x0000000000000000000000000000000000000000000000000000000000000000", - "0x000000000000000000000000deaddeaddeaddeaddeaddeaddeaddeaddead0000", - "0x0000000000000000000000009c8f005ab27adb94f3d49020a15722db2fcd9f27" - ], - "transactionHash": "0x26b854fe0b8f0c5ad15d5c3c1291107cc870f5d7351cfc399e23e68f22231fbe", - "transactionIndex": "0x0" - } - ], - "logsBloom": "0x00000000000000000010000000000000000000000000001000100000001000000000000000000080000000000000008000000800000000000000000000000240000000000000000040000008000000000000000000000000000000004000000100000000020000000000000000000800080000000000000000000010000000000001000000000000000000000000000000800000000000000020000000200000000000000000000001000000000000000000200000000000000000000000000000000002010000000000000400000000000002100000000008000004000020001000000000000000000000000000000100000000000000000000000000000000", - "status": "0x1", - "to": "0x4200000000000000000000000000000000000010", - "transactionHash": "0x26b854fe0b8f0c5ad15d5c3c1291107cc870f5d7351cfc399e23e68f22231fbe", - "transactionIndex": "0x0" -} diff --git a/op-chain-ops/crossdomain/testdata/receipts/0x32d3b5a0178a33cfbf904cfd36f66a13ff8576f409f15aae86dc3ff0e101c93a.json b/op-chain-ops/crossdomain/testdata/receipts/0x32d3b5a0178a33cfbf904cfd36f66a13ff8576f409f15aae86dc3ff0e101c93a.json deleted file mode 100644 index 7e1bdae361c4..000000000000 --- a/op-chain-ops/crossdomain/testdata/receipts/0x32d3b5a0178a33cfbf904cfd36f66a13ff8576f409f15aae86dc3ff0e101c93a.json +++ /dev/null @@ -1,74 +0,0 @@ -{ - "blockHash": "0x13bf6e592e572c0a021488b6f2d910114be3491fc08a35f2ee2b38063df24abf", - "blockNumber": "0x169a45d", - "contractAddress": null, - "cumulativeGasUsed": "0x1c49a", - "from": "0x3178490d60b5cceaa5a79fd4d9050c7405bab80c", - "gasUsed": "0x1c49a", - "logs": [ - { - "address": "0x76fb31fb4af56892a25e32cfc43de717950c9278", - "blockHash": "0x13bf6e592e572c0a021488b6f2d910114be3491fc08a35f2ee2b38063df24abf", - "blockNumber": "0x169a45d", - "data": "0x0000000000000000000000000000000000000000000000a3b61828488b117259", - "logIndex": "0x0", - "removed": false, - "topics": [ - "0xddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef", - "0x0000000000000000000000003178490d60b5cceaa5a79fd4d9050c7405bab80c", - "0x0000000000000000000000000000000000000000000000000000000000000000" - ], - "transactionHash": "0x32d3b5a0178a33cfbf904cfd36f66a13ff8576f409f15aae86dc3ff0e101c93a", - "transactionIndex": "0x0" - }, - { - "address": "0x76fb31fb4af56892a25e32cfc43de717950c9278", - "blockHash": "0x13bf6e592e572c0a021488b6f2d910114be3491fc08a35f2ee2b38063df24abf", - "blockNumber": "0x169a45d", - "data": "0x0000000000000000000000000000000000000000000000a3b61828488b117259", - "logIndex": "0x1", - "removed": false, - "topics": [ - "0xcc16f5dbb4873280815c1ee09dbd06736cffcc184412cf7a71a0fdb75d397ca5", - "0x0000000000000000000000003178490d60b5cceaa5a79fd4d9050c7405bab80c" - ], - "transactionHash": "0x32d3b5a0178a33cfbf904cfd36f66a13ff8576f409f15aae86dc3ff0e101c93a", - "transactionIndex": "0x0" - }, - { - "address": "0x4200000000000000000000000000000000000007", - "blockHash": "0x13bf6e592e572c0a021488b6f2d910114be3491fc08a35f2ee2b38063df24abf", - "blockNumber": "0x169a45d", - "data": "0x00000000000000000000000042000000000000000000000000000000000000100000000000000000000000000000000000000000000000000000000000000080000000000000000000000000000000000000000000000000000000000001b04f000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000e4a9f9e6750000000000000000000000007fc66500c84a76ad7e9c93437bfc5ac33e2ddae900000000000000000000000076fb31fb4af56892a25e32cfc43de717950c92780000000000000000000000003178490d60b5cceaa5a79fd4d9050c7405bab80c0000000000000000000000003178490d60b5cceaa5a79fd4d9050c7405bab80c0000000000000000000000000000000000000000000000a3b61828488b11725900000000000000000000000000000000000000000000000000000000000000c0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000", - "logIndex": "0x2", - "removed": false, - "topics": [ - "0xcb0f7ffd78f9aee47a248fae8db181db6eee833039123e026dcbff529522e52a", - "0x00000000000000000000000099c9fc46f92e8a1c0dec1b1747d010903e884be1" - ], - "transactionHash": "0x32d3b5a0178a33cfbf904cfd36f66a13ff8576f409f15aae86dc3ff0e101c93a", - "transactionIndex": "0x0" - }, - { - "address": "0x4200000000000000000000000000000000000010", - "blockHash": "0x13bf6e592e572c0a021488b6f2d910114be3491fc08a35f2ee2b38063df24abf", - "blockNumber": "0x169a45d", - "data": "0x0000000000000000000000003178490d60b5cceaa5a79fd4d9050c7405bab80c0000000000000000000000000000000000000000000000a3b61828488b11725900000000000000000000000000000000000000000000000000000000000000600000000000000000000000000000000000000000000000000000000000000000", - "logIndex": "0x3", - "removed": false, - "topics": [ - "0x73d170910aba9e6d50b102db522b1dbcd796216f5128b445aa2135272886497e", - "0x0000000000000000000000007fc66500c84a76ad7e9c93437bfc5ac33e2ddae9", - "0x00000000000000000000000076fb31fb4af56892a25e32cfc43de717950c9278", - "0x0000000000000000000000003178490d60b5cceaa5a79fd4d9050c7405bab80c" - ], - "transactionHash": "0x32d3b5a0178a33cfbf904cfd36f66a13ff8576f409f15aae86dc3ff0e101c93a", - "transactionIndex": "0x0" - } - ], - "logsBloom": "0x00000000000000000010000000000000000000000000001000100000001000000000000000000080000000000000008000000000000000000000040000000000000000000000000040000008000000000000100000000000000000004000000000000000020000000000000000000820080000000000000000000010014000000001000000000000000000000000000000800000000000000004000000200000000000000000000001000000000000000000200000000000000000000000000000000002000000000000000400000000000002100400000008000000000020000000000000000000000010000000000000000000000000002000000000248000", - "status": "0x1", - "to": "0x4200000000000000000000000000000000000010", - "transactionHash": "0x32d3b5a0178a33cfbf904cfd36f66a13ff8576f409f15aae86dc3ff0e101c93a", - "transactionIndex": "0x0" -} diff --git a/op-chain-ops/crossdomain/testdata/receipts/0x38236157c6941ef64f4dd0dfa7efed4a82ef9fccdcdda75a8ee89cbe831b182b.json b/op-chain-ops/crossdomain/testdata/receipts/0x38236157c6941ef64f4dd0dfa7efed4a82ef9fccdcdda75a8ee89cbe831b182b.json deleted file mode 100644 index dabee33f2fa7..000000000000 --- a/op-chain-ops/crossdomain/testdata/receipts/0x38236157c6941ef64f4dd0dfa7efed4a82ef9fccdcdda75a8ee89cbe831b182b.json +++ /dev/null @@ -1,60 +0,0 @@ -{ - "blockHash": "0x1fae89e0362ec677f76f7f3b7693b0dc05de5b5e1c4f34ee9add4339cb6391b6", - "blockNumber": "0x16a58e2", - "contractAddress": null, - "cumulativeGasUsed": "0x1aef3", - "from": "0x6659612eb0e2464ccadf7a5e851bcd12873f6e04", - "gasUsed": "0x1aef3", - "logs": [ - { - "address": "0xda10009cbd5d07dd0cecc66161fc93d7c9000da1", - "blockHash": "0x1fae89e0362ec677f76f7f3b7693b0dc05de5b5e1c4f34ee9add4339cb6391b6", - "blockNumber": "0x16a58e2", - "data": "0x0000000000000000000000000000000000000000000211654585005212800000", - "logIndex": "0x0", - "removed": false, - "topics": [ - "0xddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef", - "0x0000000000000000000000006659612eb0e2464ccadf7a5e851bcd12873f6e04", - "0x0000000000000000000000000000000000000000000000000000000000000000" - ], - "transactionHash": "0x38236157c6941ef64f4dd0dfa7efed4a82ef9fccdcdda75a8ee89cbe831b182b", - "transactionIndex": "0x0" - }, - { - "address": "0x4200000000000000000000000000000000000007", - "blockHash": "0x1fae89e0362ec677f76f7f3b7693b0dc05de5b5e1c4f34ee9add4339cb6391b6", - "blockNumber": "0x16a58e2", - "data": "0x000000000000000000000000467194771dae2967aef3ecbedd3bf9a310c76c650000000000000000000000000000000000000000000000000000000000000080000000000000000000000000000000000000000000000000000000000001b05e000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000e4a9f9e6750000000000000000000000006b175474e89094c44da98b954eedeac495271d0f000000000000000000000000da10009cbd5d07dd0cecc66161fc93d7c9000da10000000000000000000000006659612eb0e2464ccadf7a5e851bcd12873f6e040000000000000000000000006659612eb0e2464ccadf7a5e851bcd12873f6e04000000000000000000000000000000000000000000021165458500521280000000000000000000000000000000000000000000000000000000000000000000c0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000", - "logIndex": "0x1", - "removed": false, - "topics": [ - "0xcb0f7ffd78f9aee47a248fae8db181db6eee833039123e026dcbff529522e52a", - "0x00000000000000000000000010e6593cdda8c58a1d0f14c5164b376352a55f2f" - ], - "transactionHash": "0x38236157c6941ef64f4dd0dfa7efed4a82ef9fccdcdda75a8ee89cbe831b182b", - "transactionIndex": "0x0" - }, - { - "address": "0x467194771dae2967aef3ecbedd3bf9a310c76c65", - "blockHash": "0x1fae89e0362ec677f76f7f3b7693b0dc05de5b5e1c4f34ee9add4339cb6391b6", - "blockNumber": "0x16a58e2", - "data": "0x0000000000000000000000006659612eb0e2464ccadf7a5e851bcd12873f6e04000000000000000000000000000000000000000000021165458500521280000000000000000000000000000000000000000000000000000000000000000000600000000000000000000000000000000000000000000000000000000000000000", - "logIndex": "0x2", - "removed": false, - "topics": [ - "0x73d170910aba9e6d50b102db522b1dbcd796216f5128b445aa2135272886497e", - "0x0000000000000000000000006b175474e89094c44da98b954eedeac495271d0f", - "0x000000000000000000000000da10009cbd5d07dd0cecc66161fc93d7c9000da1", - "0x0000000000000000000000006659612eb0e2464ccadf7a5e851bcd12873f6e04" - ], - "transactionHash": "0x38236157c6941ef64f4dd0dfa7efed4a82ef9fccdcdda75a8ee89cbe831b182b", - "transactionIndex": "0x0" - } - ], - "logsBloom": "0x000000000000008000100000000000000000000000000000001000000010000000000000000000800000000000000080000000000000000000000000000000c0000000000000000041000008000080000000000000000000000000000000008000400000020000000000000000000800000000000000000000002010000000200000000100000000000000000000000000000000800000000000000400000200000000000000000001000000010000000000000000000000000000000000000000000002000000000000000400000000200000100000000000000000000020000000000020000000000800000000000000000000000000100000000000000000", - "status": "0x1", - "to": "0x467194771dae2967aef3ecbedd3bf9a310c76c65", - "transactionHash": "0x38236157c6941ef64f4dd0dfa7efed4a82ef9fccdcdda75a8ee89cbe831b182b", - "transactionIndex": "0x0" -} diff --git a/op-chain-ops/crossdomain/testdata/receipts/0xed57a510022157b14542491a501daed1d58003e4b274b331d2fc40dcc43f0941.json b/op-chain-ops/crossdomain/testdata/receipts/0xed57a510022157b14542491a501daed1d58003e4b274b331d2fc40dcc43f0941.json deleted file mode 100644 index 1d92d789e399..000000000000 --- a/op-chain-ops/crossdomain/testdata/receipts/0xed57a510022157b14542491a501daed1d58003e4b274b331d2fc40dcc43f0941.json +++ /dev/null @@ -1,58 +0,0 @@ -{ - "blockHash": "0x8a150d06f327859edb6e45e347105df56e047c690617d784c7aadedd0d426ff9", - "blockNumber": "0x1698be0", - "contractAddress": null, - "cumulativeGasUsed": "0x36ebf", - "from": "0x90f1cb932dbf94385434c40d53df3727f00e50b1", - "gasUsed": "0x36ebf", - "logs": [ - { - "address": "0x8700daec35af8ff88c16bdf0418774cb3d7599b4", - "blockHash": "0x8a150d06f327859edb6e45e347105df56e047c690617d784c7aadedd0d426ff9", - "blockNumber": "0x1698be0", - "data": "0x0000000000000000000000000000000000000000000001c9f23e7ccc897c65e5", - "logIndex": "0x0", - "removed": false, - "topics": [ - "0xddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef", - "0x00000000000000000000000090f1cb932dbf94385434c40d53df3727f00e50b1", - "0x0000000000000000000000000000000000000000000000000000000000000000" - ], - "transactionHash": "0xed57a510022157b14542491a501daed1d58003e4b274b331d2fc40dcc43f0941", - "transactionIndex": "0x0" - }, - { - "address": "0x4200000000000000000000000000000000000007", - "blockHash": "0x8a150d06f327859edb6e45e347105df56e047c690617d784c7aadedd0d426ff9", - "blockNumber": "0x1698be0", - "data": "0x000000000000000000000000136b1ec699c62b0606854056f02dc7bb80482d630000000000000000000000000000000000000000000000000000000000000080000000000000000000000000000000000000000000000000000000000001b04c00000000000000000000000000000000000000000000000000000000002dc6c00000000000000000000000000000000000000000000000000000000000000044f4f7b41a00000000000000000000000090f1cb932dbf94385434c40d53df3727f00e50b10000000000000000000000000000000000000000000001c9f23e7ccc897c65e500000000000000000000000000000000000000000000000000000000", - "logIndex": "0x1", - "removed": false, - "topics": [ - "0xcb0f7ffd78f9aee47a248fae8db181db6eee833039123e026dcbff529522e52a", - "0x00000000000000000000000039ea01a0298c315d149a490e34b59dbf2ec7e48f" - ], - "transactionHash": "0xed57a510022157b14542491a501daed1d58003e4b274b331d2fc40dcc43f0941", - "transactionIndex": "0x0" - }, - { - "address": "0x136b1ec699c62b0606854056f02dc7bb80482d63", - "blockHash": "0x8a150d06f327859edb6e45e347105df56e047c690617d784c7aadedd0d426ff9", - "blockNumber": "0x1698be0", - "data": "0x00000000000000000000000090f1cb932dbf94385434c40d53df3727f00e50b10000000000000000000000000000000000000000000001c9f23e7ccc897c65e5", - "logIndex": "0x2", - "removed": false, - "topics": [ - "0xbb2689ff876f7ef453cf8865dde5ab10349d222e2e1383c5152fbdb083f02da2", - "0x00000000000000000000000090f1cb932dbf94385434c40d53df3727f00e50b1" - ], - "transactionHash": "0xed57a510022157b14542491a501daed1d58003e4b274b331d2fc40dcc43f0941", - "transactionIndex": "0x0" - } - ], - "logsBloom": "0x00000000000000000010000000000040000000000000000000000000081000000000000000000080000000000000008000000000000000001000000000000000000000080000000041000008000000000000000000000000000000000000080000100000020000000000000200000800000000000000000000000010000000000002000000000000000004000000000000000000000000000000000000000000000000000000000000000000000000000000000000002000000000000000000000000002000000000200000000000001000000100000000000000000000020020000000000000000000000000000000000000000000000800000000000000000", - "status": "0x1", - "to": "0x136b1ec699c62b0606854056f02dc7bb80482d63", - "transactionHash": "0xed57a510022157b14542491a501daed1d58003e4b274b331d2fc40dcc43f0941", - "transactionIndex": "0x0" -} diff --git a/op-chain-ops/crossdomain/testdata/state-diffs/0x26b854fe0b8f0c5ad15d5c3c1291107cc870f5d7351cfc399e23e68f22231fbe.json b/op-chain-ops/crossdomain/testdata/state-diffs/0x26b854fe0b8f0c5ad15d5c3c1291107cc870f5d7351cfc399e23e68f22231fbe.json deleted file mode 100644 index 9ea8984c547e..000000000000 --- a/op-chain-ops/crossdomain/testdata/state-diffs/0x26b854fe0b8f0c5ad15d5c3c1291107cc870f5d7351cfc399e23e68f22231fbe.json +++ /dev/null @@ -1,45 +0,0 @@ -{ - "0x4200000000000000000000000000000000000000": { - "balance": "0x0", - "code": "0x608060405234801561001057600080fd5b50600436106100365760003560e01c806382e3702d1461003b578063cafa81dc14610072575b600080fd5b61005e610049366004610112565b60006020819052908152604090205460ff1681565b604051901515815260200160405180910390f35b61008561008036600461015a565b610087565b005b6001600080833360405160200161009f929190610229565b604080518083037fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe001815291815281516020928301208352908201929092520160002080547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff001691151591909117905550565b60006020828403121561012457600080fd5b5035919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b60006020828403121561016c57600080fd5b813567ffffffffffffffff8082111561018457600080fd5b818401915084601f83011261019857600080fd5b8135818111156101aa576101aa61012b565b604051601f82017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0908116603f011681019083821181831017156101f0576101f061012b565b8160405282815287602084870101111561020957600080fd5b826020860160208301376000928101602001929092525095945050505050565b6000835160005b8181101561024a5760208187018101518583015201610230565b81811115610259576000828501525b5060609390931b7fffffffffffffffffffffffffffffffffffffffff00000000000000000000000016919092019081526014019291505056fea26469706673582212200b48ded2e68f3541ccec6b89e65ba6788c333cfabcd8ebb2d833e41d3b8df28164736f6c63430008090033", - "nonce": 0, - "storage": { - "0xd21effe9499bc64d50ca07a52775e216265a2b43768d634d0e93da33d178c1fe": "0x0000000000000000000000000000000000000000000000000000000000000000" - } - }, - "0x4200000000000000000000000000000000000007": { - "balance": "0x0", - "code": "0x608060405234801561001057600080fd5b50600436106100885760003560e01c8063a71198691161005b578063a71198691461012a578063b1b1b2091461014a578063cbd4ece91461016d578063ecc704281461018057600080fd5b806321d800ec1461008d5780633dbb202b146100c55780636e296e45146100da57806382e3702d14610107575b600080fd5b6100b061009b366004610826565b60006020819052908152604090205460ff1681565b60405190151581526020015b60405180910390f35b6100d86100d3366004610942565b610197565b005b6100e26102e2565b60405173ffffffffffffffffffffffffffffffffffffffff90911681526020016100bc565b6100b0610115366004610826565b60026020526000908152604090205460ff1681565b6005546100e29073ffffffffffffffffffffffffffffffffffffffff1681565b6100b0610158366004610826565b60016020526000908152604090205460ff1681565b6100d861017b3660046109ad565b61038b565b61018960035481565b6040519081526020016100bc565b60006101a784338560035461078d565b80516020808301919091206000908152600290915260409081902080547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00166001179055517fcafa81dc0000000000000000000000000000000000000000000000000000000081529091507342000000000000000000000000000000000000009063cafa81dc9061023c908490600401610a89565b600060405180830381600087803b15801561025657600080fd5b505af115801561026a573d6000803e3d6000fd5b505050508373ffffffffffffffffffffffffffffffffffffffff167fcb0f7ffd78f9aee47a248fae8db181db6eee833039123e026dcbff529522e52a3385600354866040516102bc9493929190610aa3565b60405180910390a26001600360008282546102d79190610aef565b909155505050505050565b60045460009073ffffffffffffffffffffffffffffffffffffffff1661dead141561036e576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601f60248201527f78446f6d61696e4d65737361676553656e646572206973206e6f74207365740060448201526064015b60405180910390fd5b5060045473ffffffffffffffffffffffffffffffffffffffff1690565b60055473ffffffffffffffffffffffffffffffffffffffff167fffffffffffffffffffffffffeeeeffffffffffffffffffffffffffffffffeeef330173ffffffffffffffffffffffffffffffffffffffff161461046a576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602760248201527f50726f7669646564206d65737361676520636f756c64206e6f7420626520766560448201527f7269666965642e000000000000000000000000000000000000000000000000006064820152608401610365565b60006104788585858561078d565b8051602080830191909120600081815260019092526040909120549192509060ff1615610527576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602b60248201527f50726f7669646564206d6573736167652068617320616c72656164792062656560448201527f6e2072656365697665642e0000000000000000000000000000000000000000006064820152608401610365565b73ffffffffffffffffffffffffffffffffffffffff8616734200000000000000000000000000000000000000141561059957600090815260016020819052604090912080547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0016909117905550610787565b600480547fffffffffffffffffffffffff00000000000000000000000000000000000000001673ffffffffffffffffffffffffffffffffffffffff878116919091179091556040516000918816906105f2908790610b2e565b6000604051808303816000865af19150503d806000811461062f576040519150601f19603f3d011682016040523d82523d6000602084013e610634565b606091505b5050600480547fffffffffffffffffffffffff00000000000000000000000000000000000000001661dead1790559050801515600114156106d557600082815260016020819052604080832080547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00169092179091555183917f4641df4a962071e12719d8c8c8e5ac7fc4d97b927346a3d7a335b1f7517e133c91a2610701565b60405182907f99d0e048484baa1b1540b1367cb128acd7ab2946d1ed91ec10e3c85e4bf51b8f90600090a25b600083334360405160200161071893929190610b4a565b604080517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe08184030181529181528151602092830120600090815291829052902080547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00166001179055505050505b50505050565b6060848484846040516024016107a69493929190610b9c565b604080517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe08184030181529190526020810180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff167fcbd4ece9000000000000000000000000000000000000000000000000000000001790529050949350505050565b60006020828403121561083857600080fd5b5035919050565b803573ffffffffffffffffffffffffffffffffffffffff8116811461086357600080fd5b919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b600082601f8301126108a857600080fd5b813567ffffffffffffffff808211156108c3576108c3610868565b604051601f83017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0908116603f0116810190828211818310171561090957610909610868565b8160405283815286602085880101111561092257600080fd5b836020870160208301376000602085830101528094505050505092915050565b60008060006060848603121561095757600080fd5b6109608461083f565b9250602084013567ffffffffffffffff81111561097c57600080fd5b61098886828701610897565b925050604084013563ffffffff811681146109a257600080fd5b809150509250925092565b600080600080608085870312156109c357600080fd5b6109cc8561083f565b93506109da6020860161083f565b9250604085013567ffffffffffffffff8111156109f657600080fd5b610a0287828801610897565b949793965093946060013593505050565b60005b83811015610a2e578181015183820152602001610a16565b838111156107875750506000910152565b60008151808452610a57816020860160208601610a13565b601f017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0169290920160200192915050565b602081526000610a9c6020830184610a3f565b9392505050565b73ffffffffffffffffffffffffffffffffffffffff85168152608060208201526000610ad26080830186610a3f565b905083604083015263ffffffff8316606083015295945050505050565b60008219821115610b29577f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b500190565b60008251610b40818460208701610a13565b9190910192915050565b60008451610b5c818460208901610a13565b60609490941b7fffffffffffffffffffffffffffffffffffffffff0000000000000000000000001691909301908152601481019190915260340192915050565b600073ffffffffffffffffffffffffffffffffffffffff808716835280861660208401525060806040830152610bd56080830185610a3f565b90508260608301529594505050505056fea26469706673582212202e10f5e906e4d6b76a9239c97481d533896c41191186b3ec3ca5feab5203fde664736f6c63430008090033", - "nonce": 0, - "storage": { - "0x0000000000000000000000000000000000000000000000000000000000000003": "0x000000000000000000000000000000000000000000000000000000000001b04d", - "0x56cd54638e7c1388997f530b64562a8d4d938866fe3dd082986ff807670ec616": "0x0000000000000000000000000000000000000000000000000000000000000000" - } - }, - "0x4200000000000000000000000000000000000010": { - "balance": "0x0", - "code": "0x608060405234801561001057600080fd5b50600436106100675760003560e01c80633cb747bf116100505780633cb747bf146100ca578063662a633a146100ea578063a3a79548146100fd57600080fd5b806332b7006d1461006c57806336c717c114610081575b600080fd5b61007f61007a366004610d0f565b610110565b005b6001546100a19073ffffffffffffffffffffffffffffffffffffffff1681565b60405173ffffffffffffffffffffffffffffffffffffffff909116815260200160405180910390f35b6000546100a19073ffffffffffffffffffffffffffffffffffffffff1681565b61007f6100f8366004610d80565b610126565b61007f61010b366004610e18565b6106c1565b61011f853333878787876106d8565b5050505050565b60015473ffffffffffffffffffffffffffffffffffffffff1661015e60005473ffffffffffffffffffffffffffffffffffffffff1690565b73ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff161461021d576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602e60248201527f4f564d5f58434841494e3a206d657373656e67657220636f6e7472616374207560448201527f6e61757468656e7469636174656400000000000000000000000000000000000060648201526084015b60405180910390fd5b8073ffffffffffffffffffffffffffffffffffffffff1661025360005473ffffffffffffffffffffffffffffffffffffffff1690565b73ffffffffffffffffffffffffffffffffffffffff16636e296e456040518163ffffffff1660e01b815260040160206040518083038186803b15801561029857600080fd5b505afa1580156102ac573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906102d09190610e9b565b73ffffffffffffffffffffffffffffffffffffffff1614610373576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152603060248201527f4f564d5f58434841494e3a2077726f6e672073656e646572206f662063726f7360448201527f732d646f6d61696e206d657373616765000000000000000000000000000000006064820152608401610214565b61039d877f1d1d8b6300000000000000000000000000000000000000000000000000000000610a32565b801561045357508673ffffffffffffffffffffffffffffffffffffffff1663c01e1bd66040518163ffffffff1660e01b8152600401602060405180830381600087803b1580156103ec57600080fd5b505af1158015610400573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906104249190610e9b565b73ffffffffffffffffffffffffffffffffffffffff168873ffffffffffffffffffffffffffffffffffffffff16145b15610567576040517f40c10f1900000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff8681166004830152602482018690528816906340c10f1990604401600060405180830381600087803b1580156104c857600080fd5b505af11580156104dc573d6000803e3d6000fd5b505050508573ffffffffffffffffffffffffffffffffffffffff168773ffffffffffffffffffffffffffffffffffffffff168973ffffffffffffffffffffffffffffffffffffffff167fb0444523268717a02698be47d0803aa7468c00acbed2f8bd93a0459cde61dd898888888860405161055a9493929190610f08565b60405180910390a46106b7565b600063a9f9e67560e01b8989888a89898960405160240161058e9796959493929190610f3e565b604080517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe08184030181529190526020810180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff167fffffffff00000000000000000000000000000000000000000000000000000000909316929092179091526001549091506106339073ffffffffffffffffffffffffffffffffffffffff16600083610a57565b8673ffffffffffffffffffffffffffffffffffffffff168873ffffffffffffffffffffffffffffffffffffffff168a73ffffffffffffffffffffffffffffffffffffffff167f7ea89a4591614515571c2b51f5ea06494056f261c10ab1ed8c03c7590d87bce0898989896040516106ad9493929190610f08565b60405180910390a4505b5050505050505050565b6106d0863387878787876106d8565b505050505050565b6040517f9dc29fac0000000000000000000000000000000000000000000000000000000081523360048201526024810185905273ffffffffffffffffffffffffffffffffffffffff881690639dc29fac90604401600060405180830381600087803b15801561074657600080fd5b505af115801561075a573d6000803e3d6000fd5b5050505060008773ffffffffffffffffffffffffffffffffffffffff1663c01e1bd66040518163ffffffff1660e01b8152600401602060405180830381600087803b1580156107a857600080fd5b505af11580156107bc573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906107e09190610e9b565b9050606073ffffffffffffffffffffffffffffffffffffffff891673deaddeaddeaddeaddeaddeaddeaddeaddead000014156108d5576040517f1532ec340000000000000000000000000000000000000000000000000000000090610851908a908a908a9089908990602401610f9b565b604080517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe08184030181529190526020810180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff167fffffffff00000000000000000000000000000000000000000000000000000000909316929092179091529050610994565b6040517fa9f9e67500000000000000000000000000000000000000000000000000000000906109149084908c908c908c908c908b908b90602401610f3e565b604080517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe08184030181529190526020810180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff167fffffffff000000000000000000000000000000000000000000000000000000009093169290921790915290505b6001546109b89073ffffffffffffffffffffffffffffffffffffffff168683610a57565b3373ffffffffffffffffffffffffffffffffffffffff168973ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff167f73d170910aba9e6d50b102db522b1dbcd796216f5128b445aa2135272886497e8a8a89896040516106ad9493929190610f08565b6000610a3d83610ae8565b8015610a4e5750610a4e8383610b4c565b90505b92915050565b6000546040517f3dbb202b00000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff90911690633dbb202b90610ab190869085908790600401611016565b600060405180830381600087803b158015610acb57600080fd5b505af1158015610adf573d6000803e3d6000fd5b50505050505050565b6000610b14827f01ffc9a700000000000000000000000000000000000000000000000000000000610b4c565b8015610a515750610b45827fffffffff00000000000000000000000000000000000000000000000000000000610b4c565b1592915050565b604080517fffffffff00000000000000000000000000000000000000000000000000000000831660248083019190915282518083039091018152604490910182526020810180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff167f01ffc9a7000000000000000000000000000000000000000000000000000000001790529051600091908290819073ffffffffffffffffffffffffffffffffffffffff87169061753090610c06908690611092565b6000604051808303818686fa925050503d8060008114610c42576040519150601f19603f3d011682016040523d82523d6000602084013e610c47565b606091505b5091509150602081511015610c625760009350505050610a51565b818015610c7e575080806020019051810190610c7e91906110ae565b9695505050505050565b73ffffffffffffffffffffffffffffffffffffffff81168114610caa57600080fd5b50565b803563ffffffff81168114610cc157600080fd5b919050565b60008083601f840112610cd857600080fd5b50813567ffffffffffffffff811115610cf057600080fd5b602083019150836020828501011115610d0857600080fd5b9250929050565b600080600080600060808688031215610d2757600080fd5b8535610d3281610c88565b945060208601359350610d4760408701610cad565b9250606086013567ffffffffffffffff811115610d6357600080fd5b610d6f88828901610cc6565b969995985093965092949392505050565b600080600080600080600060c0888a031215610d9b57600080fd5b8735610da681610c88565b96506020880135610db681610c88565b95506040880135610dc681610c88565b94506060880135610dd681610c88565b93506080880135925060a088013567ffffffffffffffff811115610df957600080fd5b610e058a828b01610cc6565b989b979a50959850939692959293505050565b60008060008060008060a08789031215610e3157600080fd5b8635610e3c81610c88565b95506020870135610e4c81610c88565b945060408701359350610e6160608801610cad565b9250608087013567ffffffffffffffff811115610e7d57600080fd5b610e8989828a01610cc6565b979a9699509497509295939492505050565b600060208284031215610ead57600080fd5b8151610eb881610c88565b9392505050565b8183528181602085013750600060208284010152600060207fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0601f840116840101905092915050565b73ffffffffffffffffffffffffffffffffffffffff85168152836020820152606060408201526000610c7e606083018486610ebf565b600073ffffffffffffffffffffffffffffffffffffffff808a1683528089166020840152808816604084015280871660608401525084608083015260c060a0830152610f8e60c083018486610ebf565b9998505050505050505050565b600073ffffffffffffffffffffffffffffffffffffffff808816835280871660208401525084604083015260806060830152610fdb608083018486610ebf565b979650505050505050565b60005b83811015611001578181015183820152602001610fe9565b83811115611010576000848401525b50505050565b73ffffffffffffffffffffffffffffffffffffffff841681526060602082015260008351806060840152611051816080850160208801610fe6565b63ffffffff93909316604083015250601f919091017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0160160800192915050565b600082516110a4818460208701610fe6565b9190910192915050565b6000602082840312156110c057600080fd5b81518015158114610eb857600080fdfea264697066735822122038e8e2f2aaba8e45262542b2bfcd3b0c7b236b5eb945f0c4380d3b5f4028f11164736f6c63430008090033", - "nonce": 0, - "storage": { - "0x0000000000000000000000000000000000000000000000000000000000000000": "0x0000000000000000000000004200000000000000000000000000000000000007", - "0x0000000000000000000000000000000000000000000000000000000000000001": "0x00000000000000000000000099c9fc46f92e8a1c0dec1b1747d010903e884be1" - } - }, - "0x9c8f005ab27adb94f3d49020a15722db2fcd9f27": { - "balance": "0x40703c17c6d4", - "code": "0x", - "nonce": 0, - "storage": {} - }, - "0xdeaddeaddeaddeaddeaddeaddeaddeaddead0000": { - "balance": "0x0", - "code": "0x608060405234801561001057600080fd5b50600436106101005760003560e01c806370a0823111610097578063a9059cbb11610066578063a9059cbb14610215578063ae1f6aaf14610228578063c01e1bd61461026d578063dd62ed3e1461028d57600080fd5b806370a08231146101b157806395d89b41146101e75780639dc29fac146101ef578063a457c2d71461020257600080fd5b806323b872dd116100d357806323b872dd14610167578063313ce5671461017a578063395093511461018957806340c10f191461019c57600080fd5b806301ffc9a71461010557806306fdde031461012d578063095ea7b31461014257806318160ddd14610155575b600080fd5b610118610113366004610c6d565b6102d3565b60405190151581526020015b60405180910390f35b610135610393565b6040516101249190610cb6565b610118610150366004610d52565b610425565b6002545b604051908152602001610124565b610118610175366004610d7c565b6104db565b60405160128152602001610124565b610118610197366004610d52565b61058c565b6101af6101aa366004610d52565b61063d565b005b6101596101bf366004610db8565b73ffffffffffffffffffffffffffffffffffffffff1660009081526020819052604090205490565b61013561071c565b6101af6101fd366004610d52565b61072b565b610118610210366004610d52565b6107fe565b610118610223366004610d52565b6108af565b6006546102489073ffffffffffffffffffffffffffffffffffffffff1681565b60405173ffffffffffffffffffffffffffffffffffffffff9091168152602001610124565b6005546102489073ffffffffffffffffffffffffffffffffffffffff1681565b61015961029b366004610dd3565b73ffffffffffffffffffffffffffffffffffffffff918216600090815260016020908152604080832093909416825291909152205490565b60007f01ffc9a7a5cef8baa21ed3c5c0d7e23accb804b619e9333b597f47a0d84076e27f1d1d8b63000000000000000000000000000000000000000000000000000000007fffffffff0000000000000000000000000000000000000000000000000000000084167f01ffc9a700000000000000000000000000000000000000000000000000000000148061038b57507fffffffff00000000000000000000000000000000000000000000000000000000848116908216145b949350505050565b6060600380546103a290610e06565b80601f01602080910402602001604051908101604052809291908181526020018280546103ce90610e06565b801561041b5780601f106103f05761010080835404028352916020019161041b565b820191906000526020600020905b8154815290600101906020018083116103fe57829003601f168201915b5050505050905090565b6040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152604260248201527f4f564d5f4554483a20617070726f76652069732064697361626c65642070656e60448201527f64696e67206675727468657220636f6d6d756e6974792064697363757373696f60648201527f6e2e000000000000000000000000000000000000000000000000000000000000608482015260009060a4015b60405180910390fd5b6040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152604760248201527f4f564d5f4554483a207472616e7366657246726f6d2069732064697361626c6560448201527f642070656e64696e67206675727468657220636f6d6d756e697479206469736360648201527f757373696f6e2e00000000000000000000000000000000000000000000000000608482015260009060a4016104d2565b6040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152604c60248201527f4f564d5f4554483a20696e637265617365416c6c6f77616e636520697320646960448201527f7361626c65642070656e64696e67206675727468657220636f6d6d756e69747960648201527f2064697363757373696f6e2e0000000000000000000000000000000000000000608482015260009060a4016104d2565b60065473ffffffffffffffffffffffffffffffffffffffff1633146106be576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820181905260248201527f4f6e6c79204c32204272696467652063616e206d696e7420616e64206275726e60448201526064016104d2565b6106c88282610960565b8173ffffffffffffffffffffffffffffffffffffffff167f0f6798a560793a54c3bcfe86a93cde1e73087d944c0ea20544137d41213968858260405161071091815260200190565b60405180910390a25050565b6060600480546103a290610e06565b60065473ffffffffffffffffffffffffffffffffffffffff1633146107ac576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820181905260248201527f4f6e6c79204c32204272696467652063616e206d696e7420616e64206275726e60448201526064016104d2565b6107b68282610a80565b8173ffffffffffffffffffffffffffffffffffffffff167fcc16f5dbb4873280815c1ee09dbd06736cffcc184412cf7a71a0fdb75d397ca58260405161071091815260200190565b6040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152604c60248201527f4f564d5f4554483a206465637265617365416c6c6f77616e636520697320646960448201527f7361626c65642070656e64696e67206675727468657220636f6d6d756e69747960648201527f2064697363757373696f6e2e0000000000000000000000000000000000000000608482015260009060a4016104d2565b6040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152604360248201527f4f564d5f4554483a207472616e736665722069732064697361626c656420706560448201527f6e64696e67206675727468657220636f6d6d756e69747920646973637573736960648201527f6f6e2e0000000000000000000000000000000000000000000000000000000000608482015260009060a4016104d2565b73ffffffffffffffffffffffffffffffffffffffff82166109dd576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601f60248201527f45524332303a206d696e7420746f20746865207a65726f20616464726573730060448201526064016104d2565b80600260008282546109ef9190610e89565b909155505073ffffffffffffffffffffffffffffffffffffffff821660009081526020819052604081208054839290610a29908490610e89565b909155505060405181815273ffffffffffffffffffffffffffffffffffffffff8316906000907fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef9060200160405180910390a35050565b73ffffffffffffffffffffffffffffffffffffffff8216610b23576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602160248201527f45524332303a206275726e2066726f6d20746865207a65726f2061646472657360448201527f730000000000000000000000000000000000000000000000000000000000000060648201526084016104d2565b73ffffffffffffffffffffffffffffffffffffffff821660009081526020819052604090205481811015610bd9576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602260248201527f45524332303a206275726e20616d6f756e7420657863656564732062616c616e60448201527f636500000000000000000000000000000000000000000000000000000000000060648201526084016104d2565b73ffffffffffffffffffffffffffffffffffffffff83166000908152602081905260408120838303905560028054849290610c15908490610ea1565b909155505060405182815260009073ffffffffffffffffffffffffffffffffffffffff8516907fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef9060200160405180910390a3505050565b600060208284031215610c7f57600080fd5b81357fffffffff0000000000000000000000000000000000000000000000000000000081168114610caf57600080fd5b9392505050565b600060208083528351808285015260005b81811015610ce357858101830151858201604001528201610cc7565b81811115610cf5576000604083870101525b50601f017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe016929092016040019392505050565b803573ffffffffffffffffffffffffffffffffffffffff81168114610d4d57600080fd5b919050565b60008060408385031215610d6557600080fd5b610d6e83610d29565b946020939093013593505050565b600080600060608486031215610d9157600080fd5b610d9a84610d29565b9250610da860208501610d29565b9150604084013590509250925092565b600060208284031215610dca57600080fd5b610caf82610d29565b60008060408385031215610de657600080fd5b610def83610d29565b9150610dfd60208401610d29565b90509250929050565b600181811c90821680610e1a57607f821691505b60208210811415610e54577f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b50919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b60008219821115610e9c57610e9c610e5a565b500190565b600082821015610eb357610eb3610e5a565b50039056fea26469706673582212203d7fb50030ef7ba9f3e38703216d01cd0231ec1f800d1fcca134a651c58c574264736f6c63430008090033", - "nonce": 0, - "storage": { - "0x0000000000000000000000000000000000000000000000000000000000000002": "0x000000000000000000000000000000000000000000001ea9e7e5b9eb3ad119b9", - "0x0000000000000000000000000000000000000000000000000000000000000005": "0x0000000000000000000000000000000000000000000000000000000000000000", - "0x0000000000000000000000000000000000000000000000000000000000000006": "0x0000000000000000000000004200000000000000000000000000000000000010", - "0x392cee78a7ed6bfb84759857691585b9601a228d4d7e003c2b1c657fd70ea4bc": "0x00000000000000000000000000000000000000000000000000236c6ef479ead4" - } - } -} diff --git a/op-chain-ops/crossdomain/testdata/state-diffs/0x32d3b5a0178a33cfbf904cfd36f66a13ff8576f409f15aae86dc3ff0e101c93a.json b/op-chain-ops/crossdomain/testdata/state-diffs/0x32d3b5a0178a33cfbf904cfd36f66a13ff8576f409f15aae86dc3ff0e101c93a.json deleted file mode 100644 index cd3fb6cc25c7..000000000000 --- a/op-chain-ops/crossdomain/testdata/state-diffs/0x32d3b5a0178a33cfbf904cfd36f66a13ff8576f409f15aae86dc3ff0e101c93a.json +++ /dev/null @@ -1,45 +0,0 @@ -{ - "0x3178490d60b5cceaa5a79fd4d9050c7405bab80c": { - "balance": "0x203b088b1ee7e4", - "code": "0x", - "nonce": 25, - "storage": {} - }, - "0x4200000000000000000000000000000000000000": { - "balance": "0x0", - "code": "0x608060405234801561001057600080fd5b50600436106100365760003560e01c806382e3702d1461003b578063cafa81dc14610072575b600080fd5b61005e610049366004610112565b60006020819052908152604090205460ff1681565b604051901515815260200160405180910390f35b61008561008036600461015a565b610087565b005b6001600080833360405160200161009f929190610229565b604080518083037fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe001815291815281516020928301208352908201929092520160002080547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff001691151591909117905550565b60006020828403121561012457600080fd5b5035919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b60006020828403121561016c57600080fd5b813567ffffffffffffffff8082111561018457600080fd5b818401915084601f83011261019857600080fd5b8135818111156101aa576101aa61012b565b604051601f82017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0908116603f011681019083821181831017156101f0576101f061012b565b8160405282815287602084870101111561020957600080fd5b826020860160208301376000928101602001929092525095945050505050565b6000835160005b8181101561024a5760208187018101518583015201610230565b81811115610259576000828501525b5060609390931b7fffffffffffffffffffffffffffffffffffffffff00000000000000000000000016919092019081526014019291505056fea26469706673582212200b48ded2e68f3541ccec6b89e65ba6788c333cfabcd8ebb2d833e41d3b8df28164736f6c63430008090033", - "nonce": 0, - "storage": { - "0xb6ad38a27f840d6bba487f3e259a8cfb2e32abd98d88beacb84ab9418a2f308e": "0x0000000000000000000000000000000000000000000000000000000000000000" - } - }, - "0x4200000000000000000000000000000000000007": { - "balance": "0x0", - "code": "0x608060405234801561001057600080fd5b50600436106100885760003560e01c8063a71198691161005b578063a71198691461012a578063b1b1b2091461014a578063cbd4ece91461016d578063ecc704281461018057600080fd5b806321d800ec1461008d5780633dbb202b146100c55780636e296e45146100da57806382e3702d14610107575b600080fd5b6100b061009b366004610826565b60006020819052908152604090205460ff1681565b60405190151581526020015b60405180910390f35b6100d86100d3366004610942565b610197565b005b6100e26102e2565b60405173ffffffffffffffffffffffffffffffffffffffff90911681526020016100bc565b6100b0610115366004610826565b60026020526000908152604090205460ff1681565b6005546100e29073ffffffffffffffffffffffffffffffffffffffff1681565b6100b0610158366004610826565b60016020526000908152604090205460ff1681565b6100d861017b3660046109ad565b61038b565b61018960035481565b6040519081526020016100bc565b60006101a784338560035461078d565b80516020808301919091206000908152600290915260409081902080547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00166001179055517fcafa81dc0000000000000000000000000000000000000000000000000000000081529091507342000000000000000000000000000000000000009063cafa81dc9061023c908490600401610a89565b600060405180830381600087803b15801561025657600080fd5b505af115801561026a573d6000803e3d6000fd5b505050508373ffffffffffffffffffffffffffffffffffffffff167fcb0f7ffd78f9aee47a248fae8db181db6eee833039123e026dcbff529522e52a3385600354866040516102bc9493929190610aa3565b60405180910390a26001600360008282546102d79190610aef565b909155505050505050565b60045460009073ffffffffffffffffffffffffffffffffffffffff1661dead141561036e576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601f60248201527f78446f6d61696e4d65737361676553656e646572206973206e6f74207365740060448201526064015b60405180910390fd5b5060045473ffffffffffffffffffffffffffffffffffffffff1690565b60055473ffffffffffffffffffffffffffffffffffffffff167fffffffffffffffffffffffffeeeeffffffffffffffffffffffffffffffffeeef330173ffffffffffffffffffffffffffffffffffffffff161461046a576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602760248201527f50726f7669646564206d65737361676520636f756c64206e6f7420626520766560448201527f7269666965642e000000000000000000000000000000000000000000000000006064820152608401610365565b60006104788585858561078d565b8051602080830191909120600081815260019092526040909120549192509060ff1615610527576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602b60248201527f50726f7669646564206d6573736167652068617320616c72656164792062656560448201527f6e2072656365697665642e0000000000000000000000000000000000000000006064820152608401610365565b73ffffffffffffffffffffffffffffffffffffffff8616734200000000000000000000000000000000000000141561059957600090815260016020819052604090912080547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0016909117905550610787565b600480547fffffffffffffffffffffffff00000000000000000000000000000000000000001673ffffffffffffffffffffffffffffffffffffffff878116919091179091556040516000918816906105f2908790610b2e565b6000604051808303816000865af19150503d806000811461062f576040519150601f19603f3d011682016040523d82523d6000602084013e610634565b606091505b5050600480547fffffffffffffffffffffffff00000000000000000000000000000000000000001661dead1790559050801515600114156106d557600082815260016020819052604080832080547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00169092179091555183917f4641df4a962071e12719d8c8c8e5ac7fc4d97b927346a3d7a335b1f7517e133c91a2610701565b60405182907f99d0e048484baa1b1540b1367cb128acd7ab2946d1ed91ec10e3c85e4bf51b8f90600090a25b600083334360405160200161071893929190610b4a565b604080517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe08184030181529181528151602092830120600090815291829052902080547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00166001179055505050505b50505050565b6060848484846040516024016107a69493929190610b9c565b604080517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe08184030181529190526020810180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff167fcbd4ece9000000000000000000000000000000000000000000000000000000001790529050949350505050565b60006020828403121561083857600080fd5b5035919050565b803573ffffffffffffffffffffffffffffffffffffffff8116811461086357600080fd5b919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b600082601f8301126108a857600080fd5b813567ffffffffffffffff808211156108c3576108c3610868565b604051601f83017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0908116603f0116810190828211818310171561090957610909610868565b8160405283815286602085880101111561092257600080fd5b836020870160208301376000602085830101528094505050505092915050565b60008060006060848603121561095757600080fd5b6109608461083f565b9250602084013567ffffffffffffffff81111561097c57600080fd5b61098886828701610897565b925050604084013563ffffffff811681146109a257600080fd5b809150509250925092565b600080600080608085870312156109c357600080fd5b6109cc8561083f565b93506109da6020860161083f565b9250604085013567ffffffffffffffff8111156109f657600080fd5b610a0287828801610897565b949793965093946060013593505050565b60005b83811015610a2e578181015183820152602001610a16565b838111156107875750506000910152565b60008151808452610a57816020860160208601610a13565b601f017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0169290920160200192915050565b602081526000610a9c6020830184610a3f565b9392505050565b73ffffffffffffffffffffffffffffffffffffffff85168152608060208201526000610ad26080830186610a3f565b905083604083015263ffffffff8316606083015295945050505050565b60008219821115610b29577f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b500190565b60008251610b40818460208701610a13565b9190910192915050565b60008451610b5c818460208901610a13565b60609490941b7fffffffffffffffffffffffffffffffffffffffff0000000000000000000000001691909301908152601481019190915260340192915050565b600073ffffffffffffffffffffffffffffffffffffffff808716835280861660208401525060806040830152610bd56080830185610a3f565b90508260608301529594505050505056fea26469706673582212202e10f5e906e4d6b76a9239c97481d533896c41191186b3ec3ca5feab5203fde664736f6c63430008090033", - "nonce": 0, - "storage": { - "0x0000000000000000000000000000000000000000000000000000000000000003": "0x000000000000000000000000000000000000000000000000000000000001b04f", - "0x3322d05c07eafa912f11b56def40a67135198db85f5721bf3a549270c99900f3": "0x0000000000000000000000000000000000000000000000000000000000000000" - } - }, - "0x4200000000000000000000000000000000000010": { - "balance": "0x0", - "code": "0x608060405234801561001057600080fd5b50600436106100675760003560e01c80633cb747bf116100505780633cb747bf146100ca578063662a633a146100ea578063a3a79548146100fd57600080fd5b806332b7006d1461006c57806336c717c114610081575b600080fd5b61007f61007a366004610d0f565b610110565b005b6001546100a19073ffffffffffffffffffffffffffffffffffffffff1681565b60405173ffffffffffffffffffffffffffffffffffffffff909116815260200160405180910390f35b6000546100a19073ffffffffffffffffffffffffffffffffffffffff1681565b61007f6100f8366004610d80565b610126565b61007f61010b366004610e18565b6106c1565b61011f853333878787876106d8565b5050505050565b60015473ffffffffffffffffffffffffffffffffffffffff1661015e60005473ffffffffffffffffffffffffffffffffffffffff1690565b73ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff161461021d576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602e60248201527f4f564d5f58434841494e3a206d657373656e67657220636f6e7472616374207560448201527f6e61757468656e7469636174656400000000000000000000000000000000000060648201526084015b60405180910390fd5b8073ffffffffffffffffffffffffffffffffffffffff1661025360005473ffffffffffffffffffffffffffffffffffffffff1690565b73ffffffffffffffffffffffffffffffffffffffff16636e296e456040518163ffffffff1660e01b815260040160206040518083038186803b15801561029857600080fd5b505afa1580156102ac573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906102d09190610e9b565b73ffffffffffffffffffffffffffffffffffffffff1614610373576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152603060248201527f4f564d5f58434841494e3a2077726f6e672073656e646572206f662063726f7360448201527f732d646f6d61696e206d657373616765000000000000000000000000000000006064820152608401610214565b61039d877f1d1d8b6300000000000000000000000000000000000000000000000000000000610a32565b801561045357508673ffffffffffffffffffffffffffffffffffffffff1663c01e1bd66040518163ffffffff1660e01b8152600401602060405180830381600087803b1580156103ec57600080fd5b505af1158015610400573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906104249190610e9b565b73ffffffffffffffffffffffffffffffffffffffff168873ffffffffffffffffffffffffffffffffffffffff16145b15610567576040517f40c10f1900000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff8681166004830152602482018690528816906340c10f1990604401600060405180830381600087803b1580156104c857600080fd5b505af11580156104dc573d6000803e3d6000fd5b505050508573ffffffffffffffffffffffffffffffffffffffff168773ffffffffffffffffffffffffffffffffffffffff168973ffffffffffffffffffffffffffffffffffffffff167fb0444523268717a02698be47d0803aa7468c00acbed2f8bd93a0459cde61dd898888888860405161055a9493929190610f08565b60405180910390a46106b7565b600063a9f9e67560e01b8989888a89898960405160240161058e9796959493929190610f3e565b604080517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe08184030181529190526020810180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff167fffffffff00000000000000000000000000000000000000000000000000000000909316929092179091526001549091506106339073ffffffffffffffffffffffffffffffffffffffff16600083610a57565b8673ffffffffffffffffffffffffffffffffffffffff168873ffffffffffffffffffffffffffffffffffffffff168a73ffffffffffffffffffffffffffffffffffffffff167f7ea89a4591614515571c2b51f5ea06494056f261c10ab1ed8c03c7590d87bce0898989896040516106ad9493929190610f08565b60405180910390a4505b5050505050505050565b6106d0863387878787876106d8565b505050505050565b6040517f9dc29fac0000000000000000000000000000000000000000000000000000000081523360048201526024810185905273ffffffffffffffffffffffffffffffffffffffff881690639dc29fac90604401600060405180830381600087803b15801561074657600080fd5b505af115801561075a573d6000803e3d6000fd5b5050505060008773ffffffffffffffffffffffffffffffffffffffff1663c01e1bd66040518163ffffffff1660e01b8152600401602060405180830381600087803b1580156107a857600080fd5b505af11580156107bc573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906107e09190610e9b565b9050606073ffffffffffffffffffffffffffffffffffffffff891673deaddeaddeaddeaddeaddeaddeaddeaddead000014156108d5576040517f1532ec340000000000000000000000000000000000000000000000000000000090610851908a908a908a9089908990602401610f9b565b604080517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe08184030181529190526020810180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff167fffffffff00000000000000000000000000000000000000000000000000000000909316929092179091529050610994565b6040517fa9f9e67500000000000000000000000000000000000000000000000000000000906109149084908c908c908c908c908b908b90602401610f3e565b604080517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe08184030181529190526020810180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff167fffffffff000000000000000000000000000000000000000000000000000000009093169290921790915290505b6001546109b89073ffffffffffffffffffffffffffffffffffffffff168683610a57565b3373ffffffffffffffffffffffffffffffffffffffff168973ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff167f73d170910aba9e6d50b102db522b1dbcd796216f5128b445aa2135272886497e8a8a89896040516106ad9493929190610f08565b6000610a3d83610ae8565b8015610a4e5750610a4e8383610b4c565b90505b92915050565b6000546040517f3dbb202b00000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff90911690633dbb202b90610ab190869085908790600401611016565b600060405180830381600087803b158015610acb57600080fd5b505af1158015610adf573d6000803e3d6000fd5b50505050505050565b6000610b14827f01ffc9a700000000000000000000000000000000000000000000000000000000610b4c565b8015610a515750610b45827fffffffff00000000000000000000000000000000000000000000000000000000610b4c565b1592915050565b604080517fffffffff00000000000000000000000000000000000000000000000000000000831660248083019190915282518083039091018152604490910182526020810180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff167f01ffc9a7000000000000000000000000000000000000000000000000000000001790529051600091908290819073ffffffffffffffffffffffffffffffffffffffff87169061753090610c06908690611092565b6000604051808303818686fa925050503d8060008114610c42576040519150601f19603f3d011682016040523d82523d6000602084013e610c47565b606091505b5091509150602081511015610c625760009350505050610a51565b818015610c7e575080806020019051810190610c7e91906110ae565b9695505050505050565b73ffffffffffffffffffffffffffffffffffffffff81168114610caa57600080fd5b50565b803563ffffffff81168114610cc157600080fd5b919050565b60008083601f840112610cd857600080fd5b50813567ffffffffffffffff811115610cf057600080fd5b602083019150836020828501011115610d0857600080fd5b9250929050565b600080600080600060808688031215610d2757600080fd5b8535610d3281610c88565b945060208601359350610d4760408701610cad565b9250606086013567ffffffffffffffff811115610d6357600080fd5b610d6f88828901610cc6565b969995985093965092949392505050565b600080600080600080600060c0888a031215610d9b57600080fd5b8735610da681610c88565b96506020880135610db681610c88565b95506040880135610dc681610c88565b94506060880135610dd681610c88565b93506080880135925060a088013567ffffffffffffffff811115610df957600080fd5b610e058a828b01610cc6565b989b979a50959850939692959293505050565b60008060008060008060a08789031215610e3157600080fd5b8635610e3c81610c88565b95506020870135610e4c81610c88565b945060408701359350610e6160608801610cad565b9250608087013567ffffffffffffffff811115610e7d57600080fd5b610e8989828a01610cc6565b979a9699509497509295939492505050565b600060208284031215610ead57600080fd5b8151610eb881610c88565b9392505050565b8183528181602085013750600060208284010152600060207fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0601f840116840101905092915050565b73ffffffffffffffffffffffffffffffffffffffff85168152836020820152606060408201526000610c7e606083018486610ebf565b600073ffffffffffffffffffffffffffffffffffffffff808a1683528089166020840152808816604084015280871660608401525084608083015260c060a0830152610f8e60c083018486610ebf565b9998505050505050505050565b600073ffffffffffffffffffffffffffffffffffffffff808816835280871660208401525084604083015260806060830152610fdb608083018486610ebf565b979650505050505050565b60005b83811015611001578181015183820152602001610fe9565b83811115611010576000848401525b50505050565b73ffffffffffffffffffffffffffffffffffffffff841681526060602082015260008351806060840152611051816080850160208801610fe6565b63ffffffff93909316604083015250601f919091017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0160160800192915050565b600082516110a4818460208701610fe6565b9190910192915050565b6000602082840312156110c057600080fd5b81518015158114610eb857600080fdfea264697066735822122038e8e2f2aaba8e45262542b2bfcd3b0c7b236b5eb945f0c4380d3b5f4028f11164736f6c63430008090033", - "nonce": 0, - "storage": { - "0x0000000000000000000000000000000000000000000000000000000000000000": "0x0000000000000000000000004200000000000000000000000000000000000007", - "0x0000000000000000000000000000000000000000000000000000000000000001": "0x00000000000000000000000099c9fc46f92e8a1c0dec1b1747d010903e884be1" - } - }, - "0x76fb31fb4af56892a25e32cfc43de717950c9278": { - "balance": "0x0", - "code": "0x608060405234801561001057600080fd5b50600436106101215760003560e01c806370a08231116100ad578063a9059cbb11610071578063a9059cbb14610344578063ae1f6aaf14610374578063c01e1bd614610392578063d505accf146103b0578063dd62ed3e146103cc57610121565b806370a082311461027a5780637ecebe00146102aa57806395d89b41146102da5780639dc29fac146102f8578063a457c2d71461031457610121565b806323b872dd116100f457806323b872dd146101c2578063313ce567146101f25780633644e51514610210578063395093511461022e57806340c10f191461025e57610121565b806301ffc9a71461012657806306fdde0314610156578063095ea7b31461017457806318160ddd146101a4575b600080fd5b610140600480360381019061013b9190611a33565b6103fc565b60405161014d9190611a7b565b60405180910390f35b61015e6104d2565b60405161016b9190611b2f565b60405180910390f35b61018e60048036038101906101899190611be5565b610564565b60405161019b9190611a7b565b60405180910390f35b6101ac610582565b6040516101b99190611c34565b60405180910390f35b6101dc60048036038101906101d79190611c4f565b61058c565b6040516101e99190611a7b565b60405180910390f35b6101fa610684565b6040516102079190611cbe565b60405180910390f35b61021861068d565b6040516102259190611cf2565b60405180910390f35b61024860048036038101906102439190611be5565b61069c565b6040516102559190611a7b565b60405180910390f35b61027860048036038101906102739190611be5565b610748565b005b610294600480360381019061028f9190611d0d565b610834565b6040516102a19190611c34565b60405180910390f35b6102c460048036038101906102bf9190611d0d565b61087c565b6040516102d19190611c34565b60405180910390f35b6102e26108cc565b6040516102ef9190611b2f565b60405180910390f35b610312600480360381019061030d9190611be5565b61095e565b005b61032e60048036038101906103299190611be5565b610a4a565b60405161033b9190611a7b565b60405180910390f35b61035e60048036038101906103599190611be5565b610b35565b60405161036b9190611a7b565b60405180910390f35b61037c610b53565b6040516103899190611d49565b60405180910390f35b61039a610b79565b6040516103a79190611d49565b60405180910390f35b6103ca60048036038101906103c59190611dbc565b610b9f565b005b6103e660048036038101906103e19190611e5e565b610ce1565b6040516103f39190611c34565b60405180910390f35b6000807f01ffc9a7a5cef8baa21ed3c5c0d7e23accb804b619e9333b597f47a0d84076e290506000639dc29fac60e01b6340c10f1960e01b63c01e1bd660e01b18189050817bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916847bffffffffffffffffffffffffffffffffffffffffffffffffffffffff191614806104c95750807bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916847bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916145b92505050919050565b6060600380546104e190611ecd565b80601f016020809104026020016040519081016040528092919081815260200182805461050d90611ecd565b801561055a5780601f1061052f5761010080835404028352916020019161055a565b820191906000526020600020905b81548152906001019060200180831161053d57829003601f168201915b5050505050905090565b6000610578610571610d68565b8484610d70565b6001905092915050565b6000600254905090565b6000610599848484610f3b565b6000600160008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006105e4610d68565b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054905082811015610664576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161065b90611f71565b60405180910390fd5b61067885610670610d68565b858403610d70565b60019150509392505050565b60006012905090565b60006106976111bc565b905090565b600061073e6106a9610d68565b8484600160006106b7610d68565b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008873ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020546107399190611fc0565b610d70565b6001905092915050565b600760009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff16146107d8576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016107cf90612062565b60405180910390fd5b6107e2828261127f565b8173ffffffffffffffffffffffffffffffffffffffff167f0f6798a560793a54c3bcfe86a93cde1e73087d944c0ea20544137d4121396885826040516108289190611c34565b60405180910390a25050565b60008060008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020549050919050565b60006108c5600560008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206113df565b9050919050565b6060600480546108db90611ecd565b80601f016020809104026020016040519081016040528092919081815260200182805461090790611ecd565b80156109545780601f1061092957610100808354040283529160200191610954565b820191906000526020600020905b81548152906001019060200180831161093757829003601f168201915b5050505050905090565b600760009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff16146109ee576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016109e590612062565b60405180910390fd5b6109f882826113ed565b8173ffffffffffffffffffffffffffffffffffffffff167fcc16f5dbb4873280815c1ee09dbd06736cffcc184412cf7a71a0fdb75d397ca582604051610a3e9190611c34565b60405180910390a25050565b60008060016000610a59610d68565b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054905082811015610b16576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610b0d906120f4565b60405180910390fd5b610b2a610b21610d68565b85858403610d70565b600191505092915050565b6000610b49610b42610d68565b8484610f3b565b6001905092915050565b600760009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b600660009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b83421115610be2576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610bd990612160565b60405180910390fd5b60007f6e71edae12b1b97f4d1f60370fef10105fa2faae0126114a169c64845d6126c9888888610c118c6115c4565b89604051602001610c2796959493929190612180565b6040516020818303038152906040528051906020012090506000610c4a82611622565b90506000610c5a8287878761163c565b90508973ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff1614610cca576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610cc19061222d565b60405180910390fd5b610cd58a8a8a610d70565b50505050505050505050565b6000600160008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054905092915050565b600033905090565b600073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff161415610de0576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610dd7906122bf565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff161415610e50576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610e4790612351565b60405180910390fd5b80600160008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020819055508173ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92583604051610f2e9190611c34565b60405180910390a3505050565b600073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff161415610fab576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610fa2906123e3565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff16141561101b576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161101290612475565b60405180910390fd5b611026838383611667565b60008060008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020549050818110156110ac576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016110a390612507565b60405180910390fd5b8181036000808673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002081905550816000808573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600082825461113f9190611fc0565b925050819055508273ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef846040516111a39190611c34565b60405180910390a36111b684848461166c565b50505050565b60007f000000000000000000000000000000000000000000000000000000000000000a46141561120e577f17b074fd049541578d029dfa94d1389a7db759e0497e5e30d2b6f7d75413e140905061127c565b6112797f8b73c3c69bb8fe3d512ecc4cf759cc79239f7b179b0ffacaa9a75d522b39400f7fc79ca22c0992a4cca3636d52362fc61ce7d8001b81a7b225d701c42fb0636f327fc89efdaa54c0f20c7adf612882df0950f5a951637e0307cdcb4c672f298b8bc6611671565b90505b90565b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1614156112ef576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016112e690612573565b60405180910390fd5b6112fb60008383611667565b806002600082825461130d9190611fc0565b92505081905550806000808473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008282546113629190611fc0565b925050819055508173ffffffffffffffffffffffffffffffffffffffff16600073ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef836040516113c79190611c34565b60405180910390a36113db6000838361166c565b5050565b600081600001549050919050565b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff16141561145d576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161145490612605565b60405180910390fd5b61146982600083611667565b60008060008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020549050818110156114ef576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016114e690612697565b60405180910390fd5b8181036000808573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002081905550816002600082825461154691906126b7565b92505081905550600073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef846040516115ab9190611c34565b60405180910390a36115bf8360008461166c565b505050565b600080600560008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000209050611611816113df565b915061161c816116ab565b50919050565b600061163561162f6111bc565b836116c1565b9050919050565b600080600061164d878787876116f4565b9150915061165a81611801565b8192505050949350505050565b505050565b505050565b6000838383463060405160200161168c9594939291906126eb565b6040516020818303038152906040528051906020012090509392505050565b6001816000016000828254019250508190555050565b600082826040516020016116d69291906127b6565b60405160208183030381529060405280519060200120905092915050565b6000807f7fffffffffffffffffffffffffffffff5d576e7357a4501ddfe92f46681b20a08360001c111561172f5760006003915091506117f8565b601b8560ff16141580156117475750601c8560ff1614155b156117595760006004915091506117f8565b60006001878787876040516000815260200160405260405161177e94939291906127ed565b6020604051602081039080840390855afa1580156117a0573d6000803e3d6000fd5b505050602060405103519050600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff1614156117ef576000600192509250506117f8565b80600092509250505b94509492505050565b6000600481111561181557611814612832565b5b81600481111561182857611827612832565b5b1415611833576119d3565b6001600481111561184757611846612832565b5b81600481111561185a57611859612832565b5b141561189b576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611892906128ad565b60405180910390fd5b600260048111156118af576118ae612832565b5b8160048111156118c2576118c1612832565b5b1415611903576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016118fa90612919565b60405180910390fd5b6003600481111561191757611916612832565b5b81600481111561192a57611929612832565b5b141561196b576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611962906129ab565b60405180910390fd5b60048081111561197e5761197d612832565b5b81600481111561199157611990612832565b5b14156119d2576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016119c990612a3d565b60405180910390fd5b5b50565b600080fd5b60007fffffffff0000000000000000000000000000000000000000000000000000000082169050919050565b611a10816119db565b8114611a1b57600080fd5b50565b600081359050611a2d81611a07565b92915050565b600060208284031215611a4957611a486119d6565b5b6000611a5784828501611a1e565b91505092915050565b60008115159050919050565b611a7581611a60565b82525050565b6000602082019050611a906000830184611a6c565b92915050565b600081519050919050565b600082825260208201905092915050565b60005b83811015611ad0578082015181840152602081019050611ab5565b83811115611adf576000848401525b50505050565b6000601f19601f8301169050919050565b6000611b0182611a96565b611b0b8185611aa1565b9350611b1b818560208601611ab2565b611b2481611ae5565b840191505092915050565b60006020820190508181036000830152611b498184611af6565b905092915050565b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b6000611b7c82611b51565b9050919050565b611b8c81611b71565b8114611b9757600080fd5b50565b600081359050611ba981611b83565b92915050565b6000819050919050565b611bc281611baf565b8114611bcd57600080fd5b50565b600081359050611bdf81611bb9565b92915050565b60008060408385031215611bfc57611bfb6119d6565b5b6000611c0a85828601611b9a565b9250506020611c1b85828601611bd0565b9150509250929050565b611c2e81611baf565b82525050565b6000602082019050611c496000830184611c25565b92915050565b600080600060608486031215611c6857611c676119d6565b5b6000611c7686828701611b9a565b9350506020611c8786828701611b9a565b9250506040611c9886828701611bd0565b9150509250925092565b600060ff82169050919050565b611cb881611ca2565b82525050565b6000602082019050611cd36000830184611caf565b92915050565b6000819050919050565b611cec81611cd9565b82525050565b6000602082019050611d076000830184611ce3565b92915050565b600060208284031215611d2357611d226119d6565b5b6000611d3184828501611b9a565b91505092915050565b611d4381611b71565b82525050565b6000602082019050611d5e6000830184611d3a565b92915050565b611d6d81611ca2565b8114611d7857600080fd5b50565b600081359050611d8a81611d64565b92915050565b611d9981611cd9565b8114611da457600080fd5b50565b600081359050611db681611d90565b92915050565b600080600080600080600060e0888a031215611ddb57611dda6119d6565b5b6000611de98a828b01611b9a565b9750506020611dfa8a828b01611b9a565b9650506040611e0b8a828b01611bd0565b9550506060611e1c8a828b01611bd0565b9450506080611e2d8a828b01611d7b565b93505060a0611e3e8a828b01611da7565b92505060c0611e4f8a828b01611da7565b91505092959891949750929550565b60008060408385031215611e7557611e746119d6565b5b6000611e8385828601611b9a565b9250506020611e9485828601611b9a565b9150509250929050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b60006002820490506001821680611ee557607f821691505b60208210811415611ef957611ef8611e9e565b5b50919050565b7f45524332303a207472616e7366657220616d6f756e742065786365656473206160008201527f6c6c6f77616e6365000000000000000000000000000000000000000000000000602082015250565b6000611f5b602883611aa1565b9150611f6682611eff565b604082019050919050565b60006020820190508181036000830152611f8a81611f4e565b9050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b6000611fcb82611baf565b9150611fd683611baf565b9250827fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0382111561200b5761200a611f91565b5b828201905092915050565b7f4f6e6c79204c32204272696467652063616e206d696e7420616e64206275726e600082015250565b600061204c602083611aa1565b915061205782612016565b602082019050919050565b6000602082019050818103600083015261207b8161203f565b9050919050565b7f45524332303a2064656372656173656420616c6c6f77616e63652062656c6f7760008201527f207a65726f000000000000000000000000000000000000000000000000000000602082015250565b60006120de602583611aa1565b91506120e982612082565b604082019050919050565b6000602082019050818103600083015261210d816120d1565b9050919050565b7f45524332305065726d69743a206578706972656420646561646c696e65000000600082015250565b600061214a601d83611aa1565b915061215582612114565b602082019050919050565b600060208201905081810360008301526121798161213d565b9050919050565b600060c0820190506121956000830189611ce3565b6121a26020830188611d3a565b6121af6040830187611d3a565b6121bc6060830186611c25565b6121c96080830185611c25565b6121d660a0830184611c25565b979650505050505050565b7f45524332305065726d69743a20696e76616c6964207369676e61747572650000600082015250565b6000612217601e83611aa1565b9150612222826121e1565b602082019050919050565b600060208201905081810360008301526122468161220a565b9050919050565b7f45524332303a20617070726f76652066726f6d20746865207a65726f2061646460008201527f7265737300000000000000000000000000000000000000000000000000000000602082015250565b60006122a9602483611aa1565b91506122b48261224d565b604082019050919050565b600060208201905081810360008301526122d88161229c565b9050919050565b7f45524332303a20617070726f766520746f20746865207a65726f20616464726560008201527f7373000000000000000000000000000000000000000000000000000000000000602082015250565b600061233b602283611aa1565b9150612346826122df565b604082019050919050565b6000602082019050818103600083015261236a8161232e565b9050919050565b7f45524332303a207472616e736665722066726f6d20746865207a65726f20616460008201527f6472657373000000000000000000000000000000000000000000000000000000602082015250565b60006123cd602583611aa1565b91506123d882612371565b604082019050919050565b600060208201905081810360008301526123fc816123c0565b9050919050565b7f45524332303a207472616e7366657220746f20746865207a65726f206164647260008201527f6573730000000000000000000000000000000000000000000000000000000000602082015250565b600061245f602383611aa1565b915061246a82612403565b604082019050919050565b6000602082019050818103600083015261248e81612452565b9050919050565b7f45524332303a207472616e7366657220616d6f756e742065786365656473206260008201527f616c616e63650000000000000000000000000000000000000000000000000000602082015250565b60006124f1602683611aa1565b91506124fc82612495565b604082019050919050565b60006020820190508181036000830152612520816124e4565b9050919050565b7f45524332303a206d696e7420746f20746865207a65726f206164647265737300600082015250565b600061255d601f83611aa1565b915061256882612527565b602082019050919050565b6000602082019050818103600083015261258c81612550565b9050919050565b7f45524332303a206275726e2066726f6d20746865207a65726f2061646472657360008201527f7300000000000000000000000000000000000000000000000000000000000000602082015250565b60006125ef602183611aa1565b91506125fa82612593565b604082019050919050565b6000602082019050818103600083015261261e816125e2565b9050919050565b7f45524332303a206275726e20616d6f756e7420657863656564732062616c616e60008201527f6365000000000000000000000000000000000000000000000000000000000000602082015250565b6000612681602283611aa1565b915061268c82612625565b604082019050919050565b600060208201905081810360008301526126b081612674565b9050919050565b60006126c282611baf565b91506126cd83611baf565b9250828210156126e0576126df611f91565b5b828203905092915050565b600060a0820190506127006000830188611ce3565b61270d6020830187611ce3565b61271a6040830186611ce3565b6127276060830185611c25565b6127346080830184611d3a565b9695505050505050565b600081905092915050565b7f1901000000000000000000000000000000000000000000000000000000000000600082015250565b600061277f60028361273e565b915061278a82612749565b600282019050919050565b6000819050919050565b6127b06127ab82611cd9565b612795565b82525050565b60006127c182612772565b91506127cd828561279f565b6020820191506127dd828461279f565b6020820191508190509392505050565b60006080820190506128026000830187611ce3565b61280f6020830186611caf565b61281c6040830185611ce3565b6128296060830184611ce3565b95945050505050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602160045260246000fd5b7f45434453413a20696e76616c6964207369676e61747572650000000000000000600082015250565b6000612897601883611aa1565b91506128a282612861565b602082019050919050565b600060208201905081810360008301526128c68161288a565b9050919050565b7f45434453413a20696e76616c6964207369676e6174757265206c656e67746800600082015250565b6000612903601f83611aa1565b915061290e826128cd565b602082019050919050565b60006020820190508181036000830152612932816128f6565b9050919050565b7f45434453413a20696e76616c6964207369676e6174757265202773272076616c60008201527f7565000000000000000000000000000000000000000000000000000000000000602082015250565b6000612995602283611aa1565b91506129a082612939565b604082019050919050565b600060208201905081810360008301526129c481612988565b9050919050565b7f45434453413a20696e76616c6964207369676e6174757265202776272076616c60008201527f7565000000000000000000000000000000000000000000000000000000000000602082015250565b6000612a27602283611aa1565b9150612a32826129cb565b604082019050919050565b60006020820190508181036000830152612a5681612a1a565b905091905056fea26469706673582212207181ce9a02b427094b74c5404e30a090e6ee25656076ae413e01f3c7f06475d564736f6c63430008090033", - "nonce": 1, - "storage": { - "0x0000000000000000000000000000000000000000000000000000000000000002": "0x00000000000000000000000000000000000000000000225ba536a2b6ff234ac2", - "0x0000000000000000000000000000000000000000000000000000000000000006": "0x0000000000000000000000007fc66500c84a76ad7e9c93437bfc5ac33e2ddae9", - "0x0000000000000000000000000000000000000000000000000000000000000007": "0x0000000000000000000000004200000000000000000000000000000000000010", - "0x1509dc2d3edb4ce500ec2cb71c3704f1ff95f76ef6d47e814e70a9baeb685496": "0x0000000000000000000000000000000000000000000000a3b61828488b117259" - } - } -} diff --git a/op-chain-ops/crossdomain/testdata/state-diffs/0x38236157c6941ef64f4dd0dfa7efed4a82ef9fccdcdda75a8ee89cbe831b182b.json b/op-chain-ops/crossdomain/testdata/state-diffs/0x38236157c6941ef64f4dd0dfa7efed4a82ef9fccdcdda75a8ee89cbe831b182b.json deleted file mode 100644 index f32a0dcdf583..000000000000 --- a/op-chain-ops/crossdomain/testdata/state-diffs/0x38236157c6941ef64f4dd0dfa7efed4a82ef9fccdcdda75a8ee89cbe831b182b.json +++ /dev/null @@ -1,44 +0,0 @@ -{ - "0x4200000000000000000000000000000000000000": { - "balance": "0x0", - "code": "0x608060405234801561001057600080fd5b50600436106100365760003560e01c806382e3702d1461003b578063cafa81dc14610072575b600080fd5b61005e610049366004610112565b60006020819052908152604090205460ff1681565b604051901515815260200160405180910390f35b61008561008036600461015a565b610087565b005b6001600080833360405160200161009f929190610229565b604080518083037fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe001815291815281516020928301208352908201929092520160002080547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff001691151591909117905550565b60006020828403121561012457600080fd5b5035919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b60006020828403121561016c57600080fd5b813567ffffffffffffffff8082111561018457600080fd5b818401915084601f83011261019857600080fd5b8135818111156101aa576101aa61012b565b604051601f82017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0908116603f011681019083821181831017156101f0576101f061012b565b8160405282815287602084870101111561020957600080fd5b826020860160208301376000928101602001929092525095945050505050565b6000835160005b8181101561024a5760208187018101518583015201610230565b81811115610259576000828501525b5060609390931b7fffffffffffffffffffffffffffffffffffffffff00000000000000000000000016919092019081526014019291505056fea26469706673582212200b48ded2e68f3541ccec6b89e65ba6788c333cfabcd8ebb2d833e41d3b8df28164736f6c63430008090033", - "nonce": 0, - "storage": { - "0xc32253d1d1c74c419f0e9cc13cf38144381fbc9374b0b8cd31f260009e851a74": "0x0000000000000000000000000000000000000000000000000000000000000000" - } - }, - "0x4200000000000000000000000000000000000007": { - "balance": "0x0", - "code": "0x608060405234801561001057600080fd5b50600436106100885760003560e01c8063a71198691161005b578063a71198691461012a578063b1b1b2091461014a578063cbd4ece91461016d578063ecc704281461018057600080fd5b806321d800ec1461008d5780633dbb202b146100c55780636e296e45146100da57806382e3702d14610107575b600080fd5b6100b061009b366004610826565b60006020819052908152604090205460ff1681565b60405190151581526020015b60405180910390f35b6100d86100d3366004610942565b610197565b005b6100e26102e2565b60405173ffffffffffffffffffffffffffffffffffffffff90911681526020016100bc565b6100b0610115366004610826565b60026020526000908152604090205460ff1681565b6005546100e29073ffffffffffffffffffffffffffffffffffffffff1681565b6100b0610158366004610826565b60016020526000908152604090205460ff1681565b6100d861017b3660046109ad565b61038b565b61018960035481565b6040519081526020016100bc565b60006101a784338560035461078d565b80516020808301919091206000908152600290915260409081902080547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00166001179055517fcafa81dc0000000000000000000000000000000000000000000000000000000081529091507342000000000000000000000000000000000000009063cafa81dc9061023c908490600401610a89565b600060405180830381600087803b15801561025657600080fd5b505af115801561026a573d6000803e3d6000fd5b505050508373ffffffffffffffffffffffffffffffffffffffff167fcb0f7ffd78f9aee47a248fae8db181db6eee833039123e026dcbff529522e52a3385600354866040516102bc9493929190610aa3565b60405180910390a26001600360008282546102d79190610aef565b909155505050505050565b60045460009073ffffffffffffffffffffffffffffffffffffffff1661dead141561036e576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601f60248201527f78446f6d61696e4d65737361676553656e646572206973206e6f74207365740060448201526064015b60405180910390fd5b5060045473ffffffffffffffffffffffffffffffffffffffff1690565b60055473ffffffffffffffffffffffffffffffffffffffff167fffffffffffffffffffffffffeeeeffffffffffffffffffffffffffffffffeeef330173ffffffffffffffffffffffffffffffffffffffff161461046a576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602760248201527f50726f7669646564206d65737361676520636f756c64206e6f7420626520766560448201527f7269666965642e000000000000000000000000000000000000000000000000006064820152608401610365565b60006104788585858561078d565b8051602080830191909120600081815260019092526040909120549192509060ff1615610527576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602b60248201527f50726f7669646564206d6573736167652068617320616c72656164792062656560448201527f6e2072656365697665642e0000000000000000000000000000000000000000006064820152608401610365565b73ffffffffffffffffffffffffffffffffffffffff8616734200000000000000000000000000000000000000141561059957600090815260016020819052604090912080547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0016909117905550610787565b600480547fffffffffffffffffffffffff00000000000000000000000000000000000000001673ffffffffffffffffffffffffffffffffffffffff878116919091179091556040516000918816906105f2908790610b2e565b6000604051808303816000865af19150503d806000811461062f576040519150601f19603f3d011682016040523d82523d6000602084013e610634565b606091505b5050600480547fffffffffffffffffffffffff00000000000000000000000000000000000000001661dead1790559050801515600114156106d557600082815260016020819052604080832080547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00169092179091555183917f4641df4a962071e12719d8c8c8e5ac7fc4d97b927346a3d7a335b1f7517e133c91a2610701565b60405182907f99d0e048484baa1b1540b1367cb128acd7ab2946d1ed91ec10e3c85e4bf51b8f90600090a25b600083334360405160200161071893929190610b4a565b604080517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe08184030181529181528151602092830120600090815291829052902080547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00166001179055505050505b50505050565b6060848484846040516024016107a69493929190610b9c565b604080517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe08184030181529190526020810180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff167fcbd4ece9000000000000000000000000000000000000000000000000000000001790529050949350505050565b60006020828403121561083857600080fd5b5035919050565b803573ffffffffffffffffffffffffffffffffffffffff8116811461086357600080fd5b919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b600082601f8301126108a857600080fd5b813567ffffffffffffffff808211156108c3576108c3610868565b604051601f83017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0908116603f0116810190828211818310171561090957610909610868565b8160405283815286602085880101111561092257600080fd5b836020870160208301376000602085830101528094505050505092915050565b60008060006060848603121561095757600080fd5b6109608461083f565b9250602084013567ffffffffffffffff81111561097c57600080fd5b61098886828701610897565b925050604084013563ffffffff811681146109a257600080fd5b809150509250925092565b600080600080608085870312156109c357600080fd5b6109cc8561083f565b93506109da6020860161083f565b9250604085013567ffffffffffffffff8111156109f657600080fd5b610a0287828801610897565b949793965093946060013593505050565b60005b83811015610a2e578181015183820152602001610a16565b838111156107875750506000910152565b60008151808452610a57816020860160208601610a13565b601f017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0169290920160200192915050565b602081526000610a9c6020830184610a3f565b9392505050565b73ffffffffffffffffffffffffffffffffffffffff85168152608060208201526000610ad26080830186610a3f565b905083604083015263ffffffff8316606083015295945050505050565b60008219821115610b29577f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b500190565b60008251610b40818460208701610a13565b9190910192915050565b60008451610b5c818460208901610a13565b60609490941b7fffffffffffffffffffffffffffffffffffffffff0000000000000000000000001691909301908152601481019190915260340192915050565b600073ffffffffffffffffffffffffffffffffffffffff808716835280861660208401525060806040830152610bd56080830185610a3f565b90508260608301529594505050505056fea26469706673582212202e10f5e906e4d6b76a9239c97481d533896c41191186b3ec3ca5feab5203fde664736f6c63430008090033", - "nonce": 0, - "storage": { - "0x0000000000000000000000000000000000000000000000000000000000000003": "0x000000000000000000000000000000000000000000000000000000000001b05e", - "0x174b99571f743bb9e3d8522491be4132c795fc625571f8b9f181353f5aac7dd7": "0x0000000000000000000000000000000000000000000000000000000000000000" - } - }, - "0x467194771dae2967aef3ecbedd3bf9a310c76c65": { - "balance": "0x0", - "code": "0x608060405234801561001057600080fd5b50600436106100b45760003560e01c806365fae35e1161007157806365fae35e14610230578063662a633a146102745780639c52a7f114610377578063a3a79548146103bb578063bf353dbb1461048e578063c01e1bd6146104e6576100b4565b8063092d0ce3146100b957806332b7006d146100ed5780633cb747bf146101a057806343d726d6146101d457806347535d7b146101de57806356eff267146101fc575b600080fd5b6100c161051a565b604051808273ffffffffffffffffffffffffffffffffffffffff16815260200191505060405180910390f35b61019e6004803603608081101561010357600080fd5b81019080803573ffffffffffffffffffffffffffffffffffffffff16906020019092919080359060200190929190803563ffffffff1690602001909291908035906020019064010000000081111561015a57600080fd5b82018360208201111561016c57600080fd5b8035906020019184600183028401116401000000008311171561018e57600080fd5b909192939192939050505061053e565b005b6101a8610614565b604051808273ffffffffffffffffffffffffffffffffffffffff16815260200191505060405180910390f35b6101dc610638565b005b6101e6610722565b6040518082815260200191505060405180910390f35b610204610728565b604051808273ffffffffffffffffffffffffffffffffffffffff16815260200191505060405180910390f35b6102726004803603602081101561024657600080fd5b81019080803573ffffffffffffffffffffffffffffffffffffffff16906020019092919050505061074c565b005b610375600480360360c081101561028a57600080fd5b81019080803573ffffffffffffffffffffffffffffffffffffffff169060200190929190803573ffffffffffffffffffffffffffffffffffffffff169060200190929190803573ffffffffffffffffffffffffffffffffffffffff169060200190929190803573ffffffffffffffffffffffffffffffffffffffff169060200190929190803590602001909291908035906020019064010000000081111561033157600080fd5b82018360208201111561034357600080fd5b8035906020019184600183028401116401000000008311171561036557600080fd5b909192939192939050505061088a565b005b6103b96004803603602081101561038d57600080fd5b81019080803573ffffffffffffffffffffffffffffffffffffffff169060200190929190505050610cda565b005b61048c600480360360a08110156103d157600080fd5b81019080803573ffffffffffffffffffffffffffffffffffffffff169060200190929190803573ffffffffffffffffffffffffffffffffffffffff16906020019092919080359060200190929190803563ffffffff1690602001909291908035906020019064010000000081111561044857600080fd5b82018360208201111561045a57600080fd5b8035906020019184600183028401116401000000008311171561047c57600080fd5b9091929391929390505050610e19565b005b6104d0600480360360208110156104a457600080fd5b81019080803573ffffffffffffffffffffffffffffffffffffffff169060200190929190505050610ef0565b6040518082815260200191505060405180910390f35b6104ee610f08565b604051808273ffffffffffffffffffffffffffffffffffffffff16815260200191505060405180910390f35b7f00000000000000000000000010e6593cdda8c58a1d0f14c5164b376352a55f2f81565b7f000000000000000000000000da10009cbd5d07dd0cecc66161fc93d7c9000da173ffffffffffffffffffffffffffffffffffffffff168573ffffffffffffffffffffffffffffffffffffffff16146105ff576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252601e8152602001807f4c32444149546f6b656e4272696467652f746f6b656e2d6e6f742d646169000081525060200191505060405180910390fd5b61060d333386868686610f2c565b5050505050565b60008054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b60018060003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054146106ec576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252601f8152602001807f4c32444149546f6b656e4272696467652f6e6f742d617574686f72697a65640081525060200191505060405180910390fd5b60006002819055507f1cdde67b72a90f19919ac732a437ac2f7a10fc128d28c2a6e525d89ce5cd9d3a60405160405180910390a1565b60025481565b7f000000000000000000000000da10009cbd5d07dd0cecc66161fc93d7c9000da181565b60018060003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000205414610800576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252601f8152602001807f4c32444149546f6b656e4272696467652f6e6f742d617574686f72697a65640081525060200191505060405180910390fd5b60018060008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020819055508073ffffffffffffffffffffffffffffffffffffffff167fdd0e34038ac38b2a1ce960229778ac48a8719bc900b6c4f8d0475c6e8b385a6060405160405180910390a250565b7f00000000000000000000000010e6593cdda8c58a1d0f14c5164b376352a55f2f6108b36112f5565b73ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff1614610936576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252602e815260200180611427602e913960400191505060405180910390fd5b8073ffffffffffffffffffffffffffffffffffffffff166109556112f5565b73ffffffffffffffffffffffffffffffffffffffff16636e296e456040518163ffffffff1660e01b815260040160206040518083038186803b15801561099a57600080fd5b505afa1580156109ae573d6000803e3d6000fd5b505050506040513d60208110156109c457600080fd5b810190808051906020019092919050505073ffffffffffffffffffffffffffffffffffffffff1614610a41576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260308152602001806114556030913960400191505060405180910390fd5b7f0000000000000000000000006b175474e89094c44da98b954eedeac495271d0f73ffffffffffffffffffffffffffffffffffffffff168873ffffffffffffffffffffffffffffffffffffffff16148015610ae757507f000000000000000000000000da10009cbd5d07dd0cecc66161fc93d7c9000da173ffffffffffffffffffffffffffffffffffffffff168773ffffffffffffffffffffffffffffffffffffffff16145b610b59576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252601e8152602001807f4c32444149546f6b656e4272696467652f746f6b656e2d6e6f742d646169000081525060200191505060405180910390fd5b7f000000000000000000000000da10009cbd5d07dd0cecc66161fc93d7c9000da173ffffffffffffffffffffffffffffffffffffffff166340c10f1986866040518363ffffffff1660e01b8152600401808373ffffffffffffffffffffffffffffffffffffffff16815260200182815260200192505050600060405180830381600087803b158015610bea57600080fd5b505af1158015610bfe573d6000803e3d6000fd5b505050508573ffffffffffffffffffffffffffffffffffffffff168773ffffffffffffffffffffffffffffffffffffffff168973ffffffffffffffffffffffffffffffffffffffff167fb0444523268717a02698be47d0803aa7468c00acbed2f8bd93a0459cde61dd8988888888604051808573ffffffffffffffffffffffffffffffffffffffff168152602001848152602001806020018281038252848482818152602001925080828437600081840152601f19601f8201169050808301925050509550505050505060405180910390a45050505050505050565b60018060003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000205414610d8e576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252601f8152602001807f4c32444149546f6b656e4272696467652f6e6f742d617574686f72697a65640081525060200191505060405180910390fd5b6000600160008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020819055508073ffffffffffffffffffffffffffffffffffffffff167f184450df2e323acec0ed3b5c7531b81f9b4cdef7914dfd4c0a4317416bb5251b60405160405180910390a250565b7f000000000000000000000000da10009cbd5d07dd0cecc66161fc93d7c9000da173ffffffffffffffffffffffffffffffffffffffff168673ffffffffffffffffffffffffffffffffffffffff1614610eda576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252601e8152602001807f4c32444149546f6b656e4272696467652f746f6b656e2d6e6f742d646169000081525060200191505060405180910390fd5b610ee8338686868686610f2c565b505050505050565b60016020528060005260406000206000915090505481565b7f0000000000000000000000006b175474e89094c44da98b954eedeac495271d0f81565b600160025414610fa4576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260178152602001807f4c32444149546f6b656e4272696467652f636c6f73656400000000000000000081525060200191505060405180910390fd5b7f000000000000000000000000da10009cbd5d07dd0cecc66161fc93d7c9000da173ffffffffffffffffffffffffffffffffffffffff16639dc29fac33866040518363ffffffff1660e01b8152600401808373ffffffffffffffffffffffffffffffffffffffff16815260200182815260200192505050600060405180830381600087803b15801561103557600080fd5b505af1158015611049573d6000803e3d6000fd5b50505050600063a9f9e67560e01b7f0000000000000000000000006b175474e89094c44da98b954eedeac495271d0f7f000000000000000000000000da10009cbd5d07dd0cecc66161fc93d7c9000da18989898888604051602401808873ffffffffffffffffffffffffffffffffffffffff1681526020018773ffffffffffffffffffffffffffffffffffffffff1681526020018673ffffffffffffffffffffffffffffffffffffffff1681526020018573ffffffffffffffffffffffffffffffffffffffff168152602001848152602001806020018281038252848482818152602001925080828437600081840152601f19601f82011690508083019250505098505050505050505050604051602081830303815290604052907bffffffffffffffffffffffffffffffffffffffffffffffffffffffff19166020820180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff838183161783525050505090506111de7f00000000000000000000000010e6593cdda8c58a1d0f14c5164b376352a55f2f858361131e565b3373ffffffffffffffffffffffffffffffffffffffff167f000000000000000000000000da10009cbd5d07dd0cecc66161fc93d7c9000da173ffffffffffffffffffffffffffffffffffffffff167f0000000000000000000000006b175474e89094c44da98b954eedeac495271d0f73ffffffffffffffffffffffffffffffffffffffff167f73d170910aba9e6d50b102db522b1dbcd796216f5128b445aa2135272886497e89898888604051808573ffffffffffffffffffffffffffffffffffffffff168152602001848152602001806020018281038252848482818152602001925080828437600081840152601f19601f8201169050808301925050509550505050505060405180910390a450505050505050565b60008060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905090565b6113266112f5565b73ffffffffffffffffffffffffffffffffffffffff16633dbb202b8483856040518463ffffffff1660e01b8152600401808473ffffffffffffffffffffffffffffffffffffffff168152602001806020018363ffffffff168152602001828103825284818151815260200191508051906020019080838360005b838110156113bb5780820151818401526020810190506113a0565b50505050905090810190601f1680156113e85780820380516001836020036101000a031916815260200191505b50945050505050600060405180830381600087803b15801561140957600080fd5b505af115801561141d573d6000803e3d6000fd5b5050505050505056fe4f564d5f58434841494e3a206d657373656e67657220636f6e747261637420756e61757468656e746963617465644f564d5f58434841494e3a2077726f6e672073656e646572206f662063726f73732d646f6d61696e206d657373616765a264697066735822122096b15b6d3a22ffc8a296ccd771ce8d2bb75f0fbbd83b41c342a38aac4330798e64736f6c63430007060033", - "nonce": 1, - "storage": { - "0x0000000000000000000000000000000000000000000000000000000000000000": "0x0000000000000000000000004200000000000000000000000000000000000007", - "0x0000000000000000000000000000000000000000000000000000000000000002": "0x0000000000000000000000000000000000000000000000000000000000000001" - } - }, - "0x6659612eb0e2464ccadf7a5e851bcd12873f6e04": { - "balance": "0x2b08bb3dcd1c1c", - "code": "0x", - "nonce": 113, - "storage": {} - }, - "0xda10009cbd5d07dd0cecc66161fc93d7c9000da1": { - "balance": "0x0", - "code": "0x608060405234801561001057600080fd5b50600436106101425760003560e01c806370a08231116100b8578063a457c2d71161007c578063a457c2d7146103b0578063a9059cbb146103dc578063bf353dbb14610408578063cd0d00961461042e578063d505accf14610436578063dd62ed3e1461048757610142565b806370a082311461030a5780637ecebe001461033057806395d89b41146103565780639c52a7f11461035e5780639dc29fac1461038457610142565b8063313ce5671161010a578063313ce5671461025c5780633644e5151461027a578063395093511461028257806340c10f19146102ae57806354fd4d50146102dc57806365fae35e146102e457610142565b806306fdde0314610147578063095ea7b3146101c457806318160ddd1461020457806323b872dd1461021e57806330adf81f14610254575b600080fd5b61014f6104b5565b6040805160208082528351818301528351919283929083019185019080838360005b83811015610189578181015183820152602001610171565b50505050905090810190601f1680156101b65780820380516001836020036101000a031916815260200191505b509250505060405180910390f35b6101f0600480360360408110156101da57600080fd5b506001600160a01b0381351690602001356104df565b604080519115158252519081900360200190f35b61020c610534565b60408051918252519081900360200190f35b6101f06004803603606081101561023457600080fd5b506001600160a01b0381358116916020810135909116906040013561053a565b61020c610725565b610264610749565b6040805160ff9092168252519081900360200190f35b61020c61074e565b6101f06004803603604081101561029857600080fd5b506001600160a01b0381351690602001356107ae565b6102da600480360360408110156102c457600080fd5b506001600160a01b038135169060200135610835565b005b61014f610957565b6102da600480360360208110156102fa57600080fd5b50356001600160a01b0316610974565b61020c6004803603602081101561032057600080fd5b50356001600160a01b0316610a12565b61020c6004803603602081101561034657600080fd5b50356001600160a01b0316610a24565b61014f610a36565b6102da6004803603602081101561037457600080fd5b50356001600160a01b0316610a55565b6102da6004803603604081101561039a57600080fd5b506001600160a01b038135169060200135610af2565b6101f0600480360360408110156103c657600080fd5b506001600160a01b038135169060200135610c84565b6101f0600480360360408110156103f257600080fd5b506001600160a01b038135169060200135610d55565b61020c6004803603602081101561041e57600080fd5b50356001600160a01b0316610e7a565b61020c610e8c565b6102da600480360360e081101561044c57600080fd5b506001600160a01b03813581169160208101359091169060408101359060608101359060ff6080820135169060a08101359060c00135610eb0565b61020c6004803603604081101561049d57600080fd5b506001600160a01b0381358116916020013516611134565b6040518060400160405280600e81526020016d2230b49029ba30b13632b1b7b4b760911b81525081565b3360008181526003602090815260408083206001600160a01b03871680855290835281842086905581518681529151939490939092600080516020611259833981519152928290030190a35060015b92915050565b60015481565b60006001600160a01b0383161580159061055d57506001600160a01b0383163014155b6105a4576040805162461bcd60e51b81526020600482015260136024820152724461692f696e76616c69642d6164647265737360681b604482015290519081900360640190fd5b6001600160a01b0384166000908152600260205260409020548281101561060d576040805162461bcd60e51b81526020600482015260186024820152774461692f696e73756666696369656e742d62616c616e636560401b604482015290519081900360640190fd5b6001600160a01b03851633146106c7576001600160a01b038516600090815260036020908152604080832033845290915290205460001981146106c5578381101561069c576040805162461bcd60e51b815260206004820152601a6024820152794461692f696e73756666696369656e742d616c6c6f77616e636560301b604482015290519081900360640190fd5b6001600160a01b0386166000908152600360209081526040808320338452909152902084820390555b505b6001600160a01b038086166000818152600260209081526040808320888703905593881680835291849020805488019055835187815293519193600080516020611239833981519152929081900390910190a3506001949350505050565b7f6e71edae12b1b97f4d1f60370fef10105fa2faae0126114a169c64845d6126c981565b601281565b6000467f000000000000000000000000000000000000000000000000000000000000000a81146107865761078181611151565b6107a8565b7fc7bbf40a5fb081e6759d5d0ce2447e84427793536887332b932877b94ce51bd65b91505090565b3360009081526003602090815260408083206001600160a01b038616845290915281205481906107de9084611228565b3360008181526003602090815260408083206001600160a01b038a16808552908352928190208590558051858152905194955091936000805160206112598339815191529281900390910190a35060019392505050565b3360009081526020819052604090205460011461088e576040805162461bcd60e51b815260206004820152601260248201527111185a4bdb9bdd0b585d5d1a1bdc9a5e995960721b604482015290519081900360640190fd5b6001600160a01b038216158015906108af57506001600160a01b0382163014155b6108f6576040805162461bcd60e51b81526020600482015260136024820152724461692f696e76616c69642d6164647265737360681b604482015290519081900360640190fd5b6001600160a01b03821660009081526002602052604090208054820190556001546109219082611228565b6001556040805182815290516001600160a01b038416916000916000805160206112398339815191529181900360200190a35050565b604051806040016040528060018152602001601960f91b81525081565b336000908152602081905260409020546001146109cd576040805162461bcd60e51b815260206004820152601260248201527111185a4bdb9bdd0b585d5d1a1bdc9a5e995960721b604482015290519081900360640190fd5b6001600160a01b03811660008181526020819052604080822060019055517fdd0e34038ac38b2a1ce960229778ac48a8719bc900b6c4f8d0475c6e8b385a609190a250565b60026020526000908152604090205481565b60046020526000908152604090205481565b6040518060400160405280600381526020016244414960e81b81525081565b33600090815260208190526040902054600114610aae576040805162461bcd60e51b815260206004820152601260248201527111185a4bdb9bdd0b585d5d1a1bdc9a5e995960721b604482015290519081900360640190fd5b6001600160a01b038116600081815260208190526040808220829055517f184450df2e323acec0ed3b5c7531b81f9b4cdef7914dfd4c0a4317416bb5251b9190a250565b6001600160a01b03821660009081526002602052604090205481811015610b5b576040805162461bcd60e51b81526020600482015260186024820152774461692f696e73756666696369656e742d62616c616e636560401b604482015290519081900360640190fd5b6001600160a01b0383163314801590610b84575033600090815260208190526040902054600114155b15610c33576001600160a01b03831660009081526003602090815260408083203384529091529020546000198114610c315782811015610c08576040805162461bcd60e51b815260206004820152601a6024820152794461692f696e73756666696369656e742d616c6c6f77616e636560301b604482015290519081900360640190fd5b6001600160a01b0384166000908152600360209081526040808320338452909152902083820390555b505b6001600160a01b0383166000818152600260209081526040808320868603905560018054879003905580518681529051929392600080516020611239833981519152929181900390910190a3505050565b3360009081526003602090815260408083206001600160a01b038616845290915281205482811015610cfa576040805162461bcd60e51b815260206004820152601a6024820152794461692f696e73756666696369656e742d616c6c6f77616e636560301b604482015290519081900360640190fd5b3360008181526003602090815260408083206001600160a01b03891680855290835292819020948790039485905580518581529051929392600080516020611259833981519152929181900390910190a35060019392505050565b60006001600160a01b03831615801590610d7857506001600160a01b0383163014155b610dbf576040805162461bcd60e51b81526020600482015260136024820152724461692f696e76616c69642d6164647265737360681b604482015290519081900360640190fd5b3360009081526002602052604090205482811015610e1f576040805162461bcd60e51b81526020600482015260186024820152774461692f696e73756666696369656e742d62616c616e636560401b604482015290519081900360640190fd5b33600081815260026020908152604080832087860390556001600160a01b0388168084529281902080548801905580518781529051929392600080516020611239833981519152929181900390910190a35060019392505050565b60006020819052908152604090205481565b7f000000000000000000000000000000000000000000000000000000000000000a81565b83421115610efa576040805162461bcd60e51b815260206004820152601260248201527111185a4bdc195c9b5a5d0b595e1c1a5c995960721b604482015290519081900360640190fd5b4660007f000000000000000000000000000000000000000000000000000000000000000a8214610f3257610f2d82611151565b610f54565b7fc7bbf40a5fb081e6759d5d0ce2447e84427793536887332b932877b94ce51bd65b6001600160a01b03808b1660008181526004602090815260409182902080546001810190915582517f6e71edae12b1b97f4d1f60370fef10105fa2faae0126114a169c64845d6126c981840152808401859052948e166060860152608085018d905260a085015260c08085018c90528251808603909101815260e08501835280519082012061190160f01b6101008601526101028501959095526101228085019590955281518085039095018552610142909301905282519290910191909120915015801590611098575060018186868660405160008152602001604052604051808581526020018460ff1681526020018381526020018281526020019450505050506020604051602081039080840390855afa158015611079573d6000803e3d6000fd5b505050602060405103516001600160a01b0316896001600160a01b0316145b6110de576040805162461bcd60e51b815260206004820152601260248201527111185a4bda5b9d985b1a590b5c195c9b5a5d60721b604482015290519081900360640190fd5b6001600160a01b03808a166000818152600360209081526040808320948d16808452948252918290208b905581518b815291516000805160206112598339815191529281900390910190a3505050505050505050565b600360209081526000928352604080842090915290825290205481565b604080518082018252600e81526d2230b49029ba30b13632b1b7b4b760911b6020918201528151808301835260018152601960f91b9082015281517f8b73c3c69bb8fe3d512ecc4cf759cc79239f7b179b0ffacaa9a75d522b39400f818301527f0b1461ddc0c1d5ded79a1db0f74dae949050a7c0b28728c724b24958c27a328b818401527fad7c5bef027816a800da1736444fb58a807ef4c9603b7848673f7e3a68eb14a5606082015260808101939093523060a0808501919091528251808503909101815260c0909301909152815191012090565b8082018281101561052e57600080fdfeddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b925a26469706673582212204174ca7efe9461957e50debebcf436a7f5badaf0bd4b64389fd2735d2369a5b264736f6c63430007060033", - "nonce": 1, - "storage": { - "0x0000000000000000000000000000000000000000000000000000000000000001": "0x00000000000000000000000000000000000000000061bf8d88298b1ffe52f94d", - "0x3d696424a1574a5cfad82632e041a0db95524994dc24c3dc663736e964bde80b": "0x0000000000000000000000000000000000000000000211654585005212800000", - "0x8d978f993a82ab3ac5aed2bd07c006cca7add3f770030beb5560ea0fb804b15c": "0x0000000000000000000000000000000000000000000000000000000000000001" - } - } -} diff --git a/op-chain-ops/crossdomain/testdata/state-diffs/0xed57a510022157b14542491a501daed1d58003e4b274b331d2fc40dcc43f0941.json b/op-chain-ops/crossdomain/testdata/state-diffs/0xed57a510022157b14542491a501daed1d58003e4b274b331d2fc40dcc43f0941.json deleted file mode 100644 index d7200127ad85..000000000000 --- a/op-chain-ops/crossdomain/testdata/state-diffs/0xed57a510022157b14542491a501daed1d58003e4b274b331d2fc40dcc43f0941.json +++ /dev/null @@ -1,143 +0,0 @@ -{ - "0x01da457aa57abc0dba3fc26d6c350899f04e8417": { - "balance": "0x0", - "code": "0x608060405234801561001057600080fd5b50600436106102955760003560e01c806372c6581611610167578063a5fdc5de116100ce578063c897713211610087578063c8977132146105a9578063d37c4d8b146105bc578063d686c06c146105cf578063dbf63340146105e2578063dd3d2b2e146105ea578063fd864ccf146105fd57610295565b8063a5fdc5de14610542578063ae3bbbbb14610555578063b06e8c6514610568578063b410a0341461057b578063bff4fdfc14610583578063c81ff8fa1461059657610295565b8063849cf58811610120578063849cf588146104e6578063890235d4146104f9578063899ffef41461050c5780638da5cb5b146105145780639a5154b41461051c578063a311c7c21461052f57610295565b806372c658161461047a57806372cb051f1461049b57806374185360146104b057806379ba5097146104b85780637b1001b7146104c0578063835e119c146104d357610295565b80632b3f41aa1161020b578063497d704a116101c4578063497d704a1461040e5780634e99bda91461042157806353a47bb714610429578063614d08f81461043e5780636bed0415146104465780637168d2c21461046757610295565b80632b3f41aa1461038f57806331e6da5a146103a257806332608039146103b55780633b6afe40146103c857806344ec6b62146103e857806347a9b6db146103fb57610295565b80631313e6ca1161025d5780631313e6ca146103225780631627540c1461033957806316b2213f1461034c5780631b3ba4d01461035f578063242df9e1146103725780632af64bd31461037a57610295565b8063042e06881461029a57806304f3bcec146102af57806305b3c1c9146102cd5780630b887dae146102ed5780631137aedf14610300575b600080fd5b6102ad6102a8366004614d0d565b610610565b005b6102b7610681565b6040516102c49190615b61565b60405180910390f35b6102e06102db366004614c1a565b610690565b6040516102c49190615aad565b6102ad6102fb366004614de4565b6106a6565b61031361030e366004614c1a565b610784565b6040516102c493929190615ad7565b61032a6107a0565b6040516102c493929190615d77565b6102ad610347366004614c1a565b61094b565b6102e061035a366004614c1a565b6109a9565b6102ad61036d366004614d0d565b6109bb565b6102e0610c12565b610382610c22565b6040516102c49190615a9f565b6102ad61039d366004614c56565b610d39565b6102ad6103b0366004614e9c565b610d88565b6102b76103c3366004614de4565b610e82565b6103db6103d6366004614d3d565b610e9d565b6040516102c49190615a8e565b6102ad6103f6366004614c90565b610f4b565b6102ad610409366004614d3d565b610f9e565b6102ad61041c366004614c1a565b61104f565b610382611097565b610431611129565b6040516102c491906159ba565b6102e0611138565b610459610454366004614d0d565b611145565b6040516102c4929190615d69565b6102ad610475366004614d3d565b61122b565b61048d610488366004614cdd565b611360565b6040516102c4929190615ac9565b6104a361180e565b6040516102c49190615a7d565b6102ad61181a565b6102ad61196c565b6102e06104ce366004614e41565b611a08565b6102b76104e1366004614de4565b611a1c565b6102ad6104f4366004614e60565b611a43565b610382610507366004614e20565b611abd565b6104a3611e51565b610431612122565b6102ad61052a366004614c90565b612131565b6102e061053d366004614c1a565b61217f565b6102e0610550366004614c1a565b612191565b610459610563366004614c1a565b61219c565b6102ad610576366004614d0d565b6121b2565b6102e06121f6565b610382610591366004614c1a565b612200565b6103826105a4366004614e20565b61220b565b6102ad6105b7366004614c1a565b6125e0565b6102e06105ca366004614d0d565b612625565b6102ad6105dd366004614c90565b6126d8565b6102e061277e565b6102e06105f8366004614c1a565b612784565b6102ad61060b366004614c56565b61278f565b6106186127de565b6001600160a01b0316336001600160a01b0316146106515760405162461bcd60e51b815260040161064890615c4b565b60405180910390fd5b600081116106715760405162461bcd60e51b815260040161064890615cfb565b61067d828260006127f5565b5050565b6002546001600160a01b031681565b60008061069c83612958565b509150505b919050565b6106ae612a24565b60006106b8612a50565b604051636b42ba1d60e11b81529091506001600160a01b0382169063d685743a906106ea908590600090600401615aff565b600060405180830381600087803b15801561070457600080fd5b505af1158015610718573d6000803e3d6000fd5b50506040516304bd11e560e01b81526001600160a01b03841692506304bd11e5915061074990600190600401615a9f565b600060405180830381600087803b15801561076357600080fd5b505af1158015610777573d6000803e3d6000fd5b5050505061067d82612a67565b600080600061079284612f15565b509196909550909350915050565b60008060008060006107d17f6578743a41676772656761746f7249737375656453796e746873000000000000612fa2565b6001600160a01b031663feaf968c6040518163ffffffff1660e01b815260040160a06040518083038186803b15801561080957600080fd5b505afa15801561081d573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052506108419190810190614fde565b5093505092505060008061086e766578743a41676772656761746f7244656274526174696f60481b612fa2565b6001600160a01b031663feaf968c6040518163ffffffff1660e01b815260040160a06040518083038186803b1580156108a657600080fd5b505afa1580156108ba573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052506108de9190810190614fde565b509350509250508396508160001461090557610900878363ffffffff612fff16565b610908565b60005b9550600061091461301f565b9050428110801561093f57508361092961301f565b4203118061093f57508161093b61301f565b4203115b95505050505050909192565b610953612a24565b600180546001600160a01b0319166001600160a01b0383161790556040517f906a1c6bd7e3091ea86693dd029a831c19049ce77f1dce2ce0bab1cacbabce229061099e9083906159ba565b60405180910390a150565b60066020526000908152604090205481565b6109c3612a24565b6001600160a01b0382166109e95760405162461bcd60e51b815260040161064890615cbb565b6002546040516321f8a72160e01b81526001600160a01b03909116906321f8a72190610a1790600401615bfe565b60206040518083038186803b158015610a2f57600080fd5b505afa158015610a43573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250610a679190810190614c38565b6001600160a01b0316826001600160a01b031614610a975760405162461bcd60e51b815260040161064890615bce565b631cd554d160e21b6000526005602052600080516020615ee2833981519152546001600160a01b0316610adc5760405162461bcd60e51b815260040161064890615d1b565b60008111610afc5760405162461bcd60e51b815260040161064890615bbe565b610b046130c9565b6001600160a01b0316631b16802c83631cd554d160e21b6040518363ffffffff1660e01b8152600401610b389291906159fe565b606060405180830381600087803b158015610b5257600080fd5b505af1158015610b66573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250610b8a9190810190614f9b565b5050631cd554d160e21b600052506005602052600080516020615ee283398151915254604051632770a7eb60e21b81526001600160a01b0390911690639dc29fac90610bdc90859085906004016159fe565b600060405180830381600087803b158015610bf657600080fd5b505af1158015610c0a573d6000803e3d6000fd5b505050505050565b6000610c1c6130e0565b90505b90565b60006060610c2e611e51565b905060005b8151811015610d30576000828281518110610c4a57fe5b602090810291909101810151600081815260039092526040918290205460025492516321f8a72160e01b81529193506001600160a01b039081169216906321f8a72190610c9b908590600401615aad565b60206040518083038186803b158015610cb357600080fd5b505afa158015610cc7573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250610ceb9190810190614c38565b6001600160a01b0316141580610d1657506000818152600360205260409020546001600160a01b0316155b15610d275760009350505050610c1f565b50600101610c33565b50600191505090565b610d416127de565b6001600160a01b0316336001600160a01b031614610d715760405162461bcd60e51b815260040161064890615c4b565b610d7b828261313b565b61067d82600060016131dc565b610d9061344d565b6001600160a01b0316336001600160a01b031614610dc05760405162461bcd60e51b815260040161064890615c5b565b6000610dca613462565b9050816001600160801b0316816001600160a01b031663988e65956040518163ffffffff1660e01b815260040160206040518083038186803b158015610e0f57600080fd5b505afa158015610e23573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250610e479190810190614eba565b6001600160801b0316101561067d5760405163abb6de9560e01b81526001600160a01b0382169063abb6de9590610bdc908590600401615d5b565b6005602052600090815260409020546001600160a01b031681565b60408051828152602080840282010190915260609082908290828015610ecd578160200160208202803883390190505b50905060005b82811015610f405760056000878784818110610eeb57fe5b90506020020135815260200190815260200160002060009054906101000a90046001600160a01b0316828281518110610f2057fe5b6001600160a01b0390921660209283029190910190910152600101610ed3565b509150505b92915050565b610f536127de565b6001600160a01b0316336001600160a01b031614610f835760405162461bcd60e51b815260040161064890615c4b565b610f8d8383613482565b610f99838260006127f5565b505050565b610fa6612a24565b8060005b81811015610fe357610fdb848483818110610fc157fe5b9050602002016020610fd69190810190614e60565b6134b7565b600101610faa565b50610fec612a50565b6001600160a01b03166304bd11e560016040518263ffffffff1660e01b81526004016110189190615a9f565b600060405180830381600087803b15801561103257600080fd5b505af1158015611046573d6000803e3d6000fd5b50505050505050565b6110576127de565b6001600160a01b0316336001600160a01b0316146110875760405162461bcd60e51b815260040161064890615c4b565b61109481600060016131dc565b50565b60006110a1613648565b6001600160a01b031663c8e5bbd56110b96001613663565b6040518263ffffffff1660e01b81526004016110d59190615a7d565b60006040518083038186803b1580156110ed57600080fd5b505afa158015611101573d6000803e3d6000fd5b505050506040513d6000823e601f3d908101601f19168201604052610f459190810190614d7f565b6001546001600160a01b031681565b6524b9b9bab2b960d11b81565b60008060006111dc611155613462565b6001600160a01b03166370a08231876040518263ffffffff1660e01b815260040161118091906159ba565b60206040518083038186803b15801561119857600080fd5b505afa1580156111ac573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052506111d09190810190614e02565b620a69cb60eb1b61373f565b9350909150600090506111fd6111f0613829565b839063ffffffff61388116565b905084811061120f5760009350611222565b61121f858263ffffffff61389616565b93505b50509250929050565b611233612a24565b80600061123e612a50565b905060608260405190808252806020026020018201604052801561126c578160200160208202803883390190505b506040516305ece36d60e21b81529091506001600160a01b038316906317b38db4906112a090889088908690600401615a57565b600060405180830381600087803b1580156112ba57600080fd5b505af11580156112ce573d6000803e3d6000fd5b50506040516304bd11e560e01b81526001600160a01b03851692506304bd11e591506112ff90600190600401615a9f565b600060405180830381600087803b15801561131957600080fd5b505af115801561132d573d6000803e3d6000fd5b506000925050505b83811015610c0a5761135886868381811061134c57fe5b90506020020135612a67565b600101611335565b60008061136b6127de565b6001600160a01b0316336001600160a01b03161461139b5760405162461bcd60e51b815260040161064890615c4b565b6113a36138be565b6001600160a01b031663952225f385856040518363ffffffff1660e01b81526004016113d09291906159e3565b60206040518083038186803b1580156113e857600080fd5b505afa1580156113fc573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052506114209190810190614dc6565b61143c5760405162461bcd60e51b815260040161064890615c9b565b6000836114505761144b6138d6565b611458565b611458613936565b90506000806114f0611468613462565b6001600160a01b03166370a08231896040518263ffffffff1660e01b815260040161149391906159ba565b60206040518083038186803b1580156114ab57600080fd5b505afa1580156114bf573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052506114e39190810190614e02565b631cd554d160e21b61373f565b9250509150600080611500613648565b6001600160a01b0316630c71cd23620a69cb60eb1b6040518263ffffffff1660e01b81526004016115319190615aad565b604080518083038186803b15801561154857600080fd5b505afa15801561155c573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052506115809190810190614ed8565b9150915061159583806115905750815b613997565b60006115a08a6139b5565b90506115aa6138be565b6001600160a01b031663f557f73c866115c38487613b5e565b896040518463ffffffff1660e01b81526004016115e293929190615ad7565b60206040518083038186803b1580156115fa57600080fd5b505afa15801561160e573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052506116329190810190614e02565b96506116d96116c387730142f40c25ce1f1177ed131101fa19217396cb8863907af6c06040518163ffffffff1660e01b815260040160206040518083038186803b15801561167f57600080fd5b505af4158015611693573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052506116b79190810190614e02565b9063ffffffff613b7016565b6116cd8986613b95565b9063ffffffff613ba716565b975060006116e56127de565b6001600160a01b03166370a082318c6040518263ffffffff1660e01b815260040161171091906159ba565b60206040518083038186803b15801561172857600080fd5b505afa15801561173c573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052506117609190810190614e02565b9050808911156117905761178a8961177e8a8463ffffffff613ba716565b9063ffffffff613bd116565b97508098505b61179b8b8988613bfb565b6117a36138be565b6001600160a01b031663974e9e7f8c6040518263ffffffff1660e01b81526004016117ce91906159ba565b600060405180830381600087803b1580156117e857600080fd5b505af11580156117fc573d6000803e3d6000fd5b50505050505050505050509250929050565b6060610c1c6000613663565b6060611824611e51565b905060005b815181101561067d57600082828151811061184057fe5b602002602001015190506000600260009054906101000a90046001600160a01b03166001600160a01b031663dacb2d01838460405160200161188291906159af565b6040516020818303038152906040526040518363ffffffff1660e01b81526004016118ae929190615b1a565b60206040518083038186803b1580156118c657600080fd5b505afa1580156118da573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052506118fe9190810190614c38565b6000838152600360205260409081902080546001600160a01b0319166001600160a01b038416179055519091507f88a93678a3692f6789d9546fc621bf7234b101ddb7d4fe479455112831b8aa689061195a9084908490615abb565b60405180910390a15050600101611829565b6001546001600160a01b031633146119965760405162461bcd60e51b815260040161064890615b9e565b6000546001546040517fb532073b38c83145e3e5135377a08bf9aab55bc0fd7c1179cd4fb995d2a5159c926119d9926001600160a01b03918216929116906159c8565b60405180910390a160018054600080546001600160a01b03199081166001600160a01b03841617909155169055565b6000611a148383613ddc565b509392505050565b60048181548110611a2957fe5b6000918252602090912001546001600160a01b0316905081565b611a4b612a24565b611a54816134b7565b611a5c612a50565b6001600160a01b03166304bd11e560016040518263ffffffff1660e01b8152600401611a889190615a9f565b600060405180830381600087803b158015611aa257600080fd5b505af1158015611ab6573d6000803e3d6000fd5b5050505050565b6002546040516321f8a72160e01b815260009182916001600160a01b03909116906321f8a72190611b0e907853796e746865746978427269646765546f4f7074696d69736d60381b90600401615aad565b60206040518083038186803b158015611b2657600080fd5b505afa158015611b3a573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250611b5e9190810190614c38565b6002546040516321f8a72160e01b81529192506000916001600160a01b03909116906321f8a72190611bac907453796e746865746978427269646765546f4261736560581b90600401615aad565b60206040518083038186803b158015611bc457600080fd5b505afa158015611bd8573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250611bfc9190810190614c38565b9050336001600160a01b0383161480611c1d5750336001600160a01b038216145b611c395760405162461bcd60e51b815260040161064890615d4b565b6001600160a01b0382161580611c5657506001600160a01b038116155b611c725760405162461bcd60e51b815260040161064890615b8e565b6000868152600560205260409020546001600160a01b0316611ca65760405162461bcd60e51b815260040161064890615d1b565b60008411611cc65760405162461bcd60e51b815260040161064890615cfb565b611ccf85613fe7565b6000868152600560205260409081902054905163219e412d60e21b81526001600160a01b039091169063867904b490611d0e90889088906004016159fe565b600060405180830381600087803b158015611d2857600080fd5b505af1158015611d3c573d6000803e3d6000fd5b50505050600080611d4b613648565b6001600160a01b0316630c71cd23896040518263ffffffff1660e01b8152600401611d769190615aad565b604080518083038186803b158015611d8d57600080fd5b505afa158015611da1573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250611dc59190810190614ed8565b91509150611dd1612a50565b6001600160a01b03166342c7b819611df7611df2898663ffffffff613ba716565b614060565b6040518263ffffffff1660e01b8152600401611e139190615aad565b600060405180830381600087803b158015611e2d57600080fd5b505af1158015611e41573d6000803e3d6000fd5b50929a9950505050505050505050565b606080611e5c614089565b60408051600f808252610200820190925291925060609190602082016101e080388339019050509050680a6f2dce8d0cae8d2f60bb1b81600081518110611e9f57fe5b6020026020010181815250506822bc31b430b733b2b960b91b81600181518110611ec557fe5b6020026020010181815250506c45786368616e6765526174657360981b81600281518110611eef57fe5b6020026020010181815250506d21b4b931bab4ba213932b0b5b2b960911b81600381518110611f1a57fe5b6020026020010181815250507153796e74686574697844656274536861726560701b81600481518110611f4957fe5b60200260200101818152505066119959541bdbdb60ca1b81600581518110611f6d57fe5b6020026020010181815250507044656c6567617465417070726f76616c7360781b81600681518110611f9b57fe5b6020026020010181815250506d2932bbb0b93222b9b1b937bbab1960911b81600781518110611fc657fe5b6020026020010181815250506e53796e746865746978457363726f7760881b81600881518110611ff257fe5b602002602001018181525050692634b8bab4b230ba37b960b11b8160098151811061201957fe5b602002602001018181525050704c697175696461746f725265776172647360781b81600a8151811061204757fe5b6020026020010181815250506844656274436163686560b81b81600b8151811061206d57fe5b6020026020010181815250506c29bcb73a342932b232b2b6b2b960991b81600c8151811061209757fe5b6020026020010181815250507f6578743a41676772656761746f7249737375656453796e74687300000000000081600d815181106120d157fe5b602002602001018181525050766578743a41676772656761746f7244656274526174696f60481b81600e8151811061210557fe5b60200260200101818152505061211b82826140da565b9250505090565b6000546001600160a01b031681565b6121396127de565b6001600160a01b0316336001600160a01b0316146121695760405162461bcd60e51b815260040161064890615c4b565b612173838361313b565b610f99838260006131dc565b600061218a8261418f565b5092915050565b6000610f45826139b5565b6000806121a88361418f565b915091505b915091565b6121ba6127de565b6001600160a01b0316336001600160a01b0316146121ea5760405162461bcd60e51b815260040161064890615c4b565b61067d828260006131dc565b6000610c1c613829565b6000610f458261420f565b6002546040516321f8a72160e01b815260009182916001600160a01b03909116906321f8a7219061225c907853796e746865746978427269646765546f4f7074696d69736d60381b90600401615aad565b60206040518083038186803b15801561227457600080fd5b505afa158015612288573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052506122ac9190810190614c38565b6002546040516321f8a72160e01b81529192506000916001600160a01b03909116906321f8a721906122fa907453796e746865746978427269646765546f4261736560581b90600401615aad565b60206040518083038186803b15801561231257600080fd5b505afa158015612326573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525061234a9190810190614c38565b9050336001600160a01b038316148061236b5750336001600160a01b038216145b6123875760405162461bcd60e51b815260040161064890615d4b565b6001600160a01b03821615806123a457506001600160a01b038116155b6123c05760405162461bcd60e51b815260040161064890615b8e565b6000868152600560205260409020546001600160a01b03166123f45760405162461bcd60e51b815260040161064890615d1b565b600084116124145760405162461bcd60e51b815260040161064890615cfb565b61241c6130c9565b6001600160a01b0316631b16802c86886040518363ffffffff1660e01b81526004016124499291906159fe565b606060405180830381600087803b15801561246357600080fd5b505af1158015612477573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525061249b9190810190614f9b565b50505060008681526005602052604090819020549051632770a7eb60e21b81526001600160a01b0390911690639dc29fac906124dd90889088906004016159fe565b600060405180830381600087803b1580156124f757600080fd5b505af115801561250b573d6000803e3d6000fd5b5050505060008061251a613648565b6001600160a01b0316630c71cd23896040518263ffffffff1660e01b81526004016125459190615aad565b604080518083038186803b15801561255c57600080fd5b505afa158015612570573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052506125949190810190614ed8565b915091506125a0612a50565b6001600160a01b03166342c7b8196125c1611df2898663ffffffff613ba716565b6000036040518263ffffffff1660e01b8152600401611e139190615aad565b6125e86127de565b6001600160a01b0316336001600160a01b0316146126185760405162461bcd60e51b815260040161064890615c4b565b61109481600060016127f5565b600080612630613462565b90506000816001600160a01b03166370a08231866040518263ffffffff1660e01b815260040161266091906159ba565b60206040518083038186803b15801561267857600080fd5b505afa15801561268c573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052506126b09190810190614e02565b9050806126c257600092505050610f45565b6126cc818561373f565b50909695505050505050565b6126e061422e565b826001600160a01b031663d4b839926040518163ffffffff1660e01b815260040160206040518083038186803b15801561271957600080fd5b505afa15801561272d573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052506127519190810190614c38565b6001600160a01b0316639dc29fac83836040518363ffffffff1660e01b81526004016110189291906159fe565b60045490565b6000610f4582614266565b6127976127de565b6001600160a01b0316336001600160a01b0316146127c75760405162461bcd60e51b815260040161064890615c4b565b6127d18282613482565b61067d82600060016127f5565b6000610c1c680a6f2dce8d0cae8d2f60bb1b612fa2565b6127fd61432f565b1561280757610f99565b60008061281385612f15565b93505050915061282281613997565b8261284c57818411156128475760405162461bcd60e51b815260040161064890615c1b565b612850565b8193505b61285a85856144f8565b61286385613fe7565b631cd554d160e21b6000526005602052600080516020615ee28339815191525460405163219e412d60e21b81526001600160a01b039091169063867904b4906128b290889088906004016159fe565b600060405180830381600087803b1580156128cc57600080fd5b505af11580156128e0573d6000803e3d6000fd5b505050506128ec612a50565b6001600160a01b03166342c7b81961290386614060565b6040518263ffffffff1660e01b815260040161291f9190615aad565b600060405180830381600087803b15801561293957600080fd5b505af115801561294d573d6000803e3d6000fd5b505050505050505050565b600080600080612966613648565b6001600160a01b0316630c71cd23620a69cb60eb1b6040518263ffffffff1660e01b81526004016129979190615aad565b604080518083038186803b1580156129ae57600080fd5b505afa1580156129c2573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052506129e69190810190614ed8565b9150915060006129fe6129f8876139b5565b84613b5e565b9050612a18612a0b613829565b829063ffffffff613ba716565b94509092505050915091565b6000546001600160a01b03163314612a4e5760405162461bcd60e51b815260040161064890615cab565b565b6000610c1c6844656274436163686560b81b612fa2565b6000818152600560205260409020546001600160a01b031680612a9c5760405162461bcd60e51b815260040161064890615c7b565b631cd554d160e21b821415612ac35760405162461bcd60e51b815260040161064890615ceb565b6000816001600160a01b03166318160ddd6040518163ffffffff1660e01b815260040160206040518083038186803b158015612afe57600080fd5b505afa158015612b12573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250612b369190810190614e02565b90508015612db857600080612b49613648565b6001600160a01b0316638295016a86856040518363ffffffff1660e01b8152600401612b76929190615b3a565b60606040518083038186803b158015612b8e57600080fd5b505afa158015612ba2573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250612bc69190810190614f9b565b509150915060008111612beb5760405162461bcd60e51b815260040161064890615c8b565b6000612bf5614642565b631cd554d160e21b6000526005602052600080516020615ee28339815191525460405163219e412d60e21b81529192506001600160a01b03169063867904b490612c4590849087906004016159fe565b600060405180830381600087803b158015612c5f57600080fd5b505af1158015612c73573d6000803e3d6000fd5b50505050612c7f612a50565b6001600160a01b03166342c7b819612c9685614060565b6040518263ffffffff1660e01b8152600401612cb29190615aad565b600060405180830381600087803b158015612ccc57600080fd5b505af1158015612ce0573d6000803e3d6000fd5b50505050806001600160a01b0316633a70599c866001600160a01b031663ec5568896040518163ffffffff1660e01b815260040160206040518083038186803b158015612d2c57600080fd5b505afa158015612d40573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250612d649190810190614e7e565b846040518363ffffffff1660e01b8152600401612d82929190615b6f565b600060405180830381600087803b158015612d9c57600080fd5b505af1158015612db0573d6000803e3d6000fd5b505050505050505b60005b600454811015612e9f57826001600160a01b031660048281548110612ddc57fe5b6000918252602090912001546001600160a01b03161415612e975760048181548110612e0457fe5b600091825260209091200180546001600160a01b0319169055600480546000198101908110612e2f57fe5b600091825260209091200154600480546001600160a01b039092169183908110612e5557fe5b600091825260209091200180546001600160a01b0319166001600160a01b03929092169190911790556004805490612e91906000198301614aa7565b50612e9f565b600101612dbb565b506001600160a01b038216600090815260066020908152604080832083905585835260059091529081902080546001600160a01b0319169055517f6166f5c475cc1cd535c6cdf14a6d5edb811e34117031fc2863392a136eb655d090612f089085908590615abb565b60405180910390a1505050565b600080600080612f51612f26613462565b6001600160a01b03166370a08231876040518263ffffffff1660e01b815260040161149391906159ba565b91945092509050600080612f6487612958565b915091508195508280612f745750805b9250858510612f865760009550612f99565b612f96868663ffffffff61389616565b95505b50509193509193565b60008181526003602090815260408083205490516001600160a01b039091169182151591612fd29186910161598f565b6040516020818303038152906040529061218a5760405162461bcd60e51b81526004016106489190615b7d565b600061301883836b033b2e3c9fd0803ce800000061465d565b9392505050565b6000613029614695565b6001600160a01b03166323257c2b6d53797374656d53657474696e677360901b6e1c985d1954dd185b1954195c9a5bd9608a1b6040518363ffffffff1660e01b8152600401613079929190615ac9565b60206040518083038186803b15801561309157600080fd5b505afa1580156130a5573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250610c1c9190810190614e02565b6000610c1c6822bc31b430b733b2b960b91b612fa2565b60006130ea614695565b6001600160a01b03166323257c2b6d53797374656d53657474696e677360901b6f6d696e696d756d5374616b6554696d6560801b6040518363ffffffff1660e01b8152600401613079929190615ac9565b6131436146b2565b6001600160a01b0316637d3f0ba283836040518363ffffffff1660e01b81526004016131709291906159c8565b60206040518083038186803b15801561318857600080fd5b505afa15801561319c573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052506131c09190810190614dc6565b61067d5760405162461bcd60e51b815260040161064890615bae565b6131e461432f565b156131ee57610f99565b8061334b576131fc8361420f565b6132185760405162461bcd60e51b815260040161064890615d2b565b6000806132236130c9565b6001600160a01b0316631b16802c86631cd554d160e21b6040518363ffffffff1660e01b81526004016132579291906159fe565b606060405180830381600087803b15801561327157600080fd5b505af1158015613285573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052506132a99190810190614f9b565b9093509150508015613348576132bd6130c9565b6001600160a01b0316634c268fc886631cd554d160e21b87866040518563ffffffff1660e01b81526004016132f59493929190615a19565b60206040518083038186803b15801561330d57600080fd5b505afa158015613321573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052506133459190810190614e02565b93505b50505b600080613359612f26613462565b925050915060008061336a87612958565b9150915061337e8380611590575081613997565b6000841161339e5760405162461bcd60e51b815260040161064890615c0b565b84156133b7576133b4848363ffffffff61389616565b95505b60006133c5888989886146d1565b9050826133d8868363ffffffff61389616565b11613443576133e56138be565b6001600160a01b031663974e9e7f896040518263ffffffff1660e01b815260040161341091906159ba565b600060405180830381600087803b15801561342a57600080fd5b505af115801561343e573d6000803e3d6000fd5b505050505b5050505050505050565b6000610c1c66119959541bdbdb60ca1b612fa2565b6000610c1c7153796e74686574697844656274536861726560701b612fa2565b61348a6146b2565b6001600160a01b0316630487261783836040518363ffffffff1660e01b81526004016131709291906159c8565b6000816001600160a01b031663dbd06c856040518163ffffffff1660e01b815260040160206040518083038186803b1580156134f257600080fd5b505afa158015613506573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525061352a9190810190614e02565b6000818152600560205260409020549091506001600160a01b0316156135625760405162461bcd60e51b815260040161064890615d0b565b6001600160a01b038216600090815260066020526040902054156135985760405162461bcd60e51b815260040161064890615ccb565b60048054600181019091557f8a35acfbc15ff81a39ae7d344fd709f28e8600b4aa8c65c6b64bfe7fe36bd19b0180546001600160a01b0384166001600160a01b03199182168117909255600083815260056020908152604080832080549094168517909355928152600690925290819020829055517f0a2b6ebf143b3e9fcd67e17748ad315174746100c27228468b2c98c302c628849061363c9083908590615abb565b60405180910390a15050565b6000610c1c6c45786368616e6765526174657360981b612fa2565b60608082613672576000613675565b60015b60ff16600480549050016040519080825280602002602001820160405280156136a8578160200160208202803883390190505b50905060005b60045481101561370f5760066000600483815481106136c957fe5b60009182526020808320909101546001600160a01b0316835282019290925260400190205482518390839081106136fc57fe5b60209081029190910101526001016136ae565b508215610f45576004548151620a69cb60eb1b918391811061372d57fe5b60200260200101818152505092915050565b600080600080600061374f6107a0565b9250509150866000141561376b57600094509092509050613822565b600080613776613648565b6001600160a01b0316630c71cd23896040518263ffffffff1660e01b81526004016137a19190615aad565b604080518083038186803b1580156137b857600080fd5b505afa1580156137cc573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052506137f09190810190614ed8565b9150915061380d826138018b6147fe565b9063ffffffff61388116565b9650839550808061381b5750825b9450505050505b9250925092565b6000613833614695565b6001600160a01b03166323257c2b6d53797374656d53657474696e677360901b6c69737375616e6365526174696f60981b6040518363ffffffff1660e01b8152600401613079929190615ac9565b60006130188383670de0b6b3a764000061465d565b6000828211156138b85760405162461bcd60e51b815260040161064890615c2b565b50900390565b6000610c1c692634b8bab4b230ba37b960b11b612fa2565b60006138e0614695565b6001600160a01b03166323257c2b6d53797374656d53657474696e677360901b74736e784c69717569646174696f6e50656e616c747960581b6040518363ffffffff1660e01b8152600401613079929190615ac9565b6000613940614695565b6001600160a01b03166323257c2b6d53797374656d53657474696e677360901b7573656c664c69717569646174696f6e50656e616c747960501b6040518363ffffffff1660e01b8152600401613079929190615ac9565b80156110945760405162461bcd60e51b815260040161064890615c6b565b6000806139c06127de565b6001600160a01b03166370a08231846040518263ffffffff1660e01b81526004016139eb91906159ba565b60206040518083038186803b158015613a0357600080fd5b505afa158015613a17573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250613a3b9190810190614e02565b90506000613a476148ad565b6001600160a01b031614613aeb57613ae8613a606148ad565b6001600160a01b03166370a08231856040518263ffffffff1660e01b8152600401613a8b91906159ba565b60206040518083038186803b158015613aa357600080fd5b505afa158015613ab7573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250613adb9190810190614e02565b829063ffffffff613b7016565b90505b6000613af56148ca565b6001600160a01b031614613b1157613b0e613a606148ca565b90505b6000613b1b6148e6565b6001600160a01b031614610f4557613018613b346148e6565b6001600160a01b0316628cc262856040518263ffffffff1660e01b8152600401613a8b91906159ba565b6000613018838363ffffffff61490516565b6000828201838110156130185760405162461bcd60e51b815260040161064890615bde565b6000613018838363ffffffff61388116565b6000670de0b6b3a7640000613bc2848463ffffffff61491a16565b81613bc957fe5b049392505050565b600061301882613bef85670de0b6b3a764000063ffffffff61491a16565b9063ffffffff61495416565b613c036148e6565b6001600160a01b031663270fb338846040518263ffffffff1660e01b8152600401613c2e91906159ba565b600060405180830381600087803b158015613c4857600080fd5b505af1158015613c5c573d6000803e3d6000fd5b505050506000613c6a613462565b90506000816001600160a01b03166370a08231866040518263ffffffff1660e01b8152600401613c9a91906159ba565b60206040518083038186803b158015613cb257600080fd5b505afa158015613cc6573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250613cea9190810190614e02565b905082841415613d5957604051631a378f0d60e01b81526001600160a01b03831690631a378f0d90613d2290889085906004016159fe565b600060405180830381600087803b158015613d3c57600080fd5b505af1158015613d50573d6000803e3d6000fd5b50505050611ab6565b6000613d6485614989565b9050826001600160a01b0316631a378f0d87848410613d835784613d85565b835b6040518363ffffffff1660e01b8152600401613da29291906159fe565b600060405180830381600087803b158015613dbc57600080fd5b505af1158015613dd0573d6000803e3d6000fd5b50505050505050505050565b6000806000806000613dec612a50565b6001600160a01b0316633a900a2e6040518163ffffffff1660e01b815260040160806040518083038186803b158015613e2457600080fd5b505afa158015613e38573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250613e5c9190810190614f3a565b935093505092508180613e6c5750805b93506000613e78613648565b905086613f1e57600080613e8a612a50565b6001600160a01b0316632992dba26040518163ffffffff1660e01b8152600401604080518083038186803b158015613ec157600080fd5b505afa158015613ed5573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250613ef99190810190614ed8565b9092509050613f0e868363ffffffff613b7016565b95508680613f195750805b965050505b631cd554d160e21b881415613f395750919350613fe0915050565b600080826001600160a01b0316630c71cd238b6040518263ffffffff1660e01b8152600401613f689190615aad565b604080518083038186803b158015613f7f57600080fd5b505afa158015613f93573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250613fb79190810190614ed8565b9092509050613fcc868363ffffffff61388116565b8780613fd55750815b975097505050505050505b9250929050565b613fef614695565b6001600160a01b0316631d5b277f6524b9b9bab2b960d11b6d1b185cdd125cdcdd59515d995b9d60921b8460405160200161402b929190615969565b60405160208183030381529060405280519060200120426040518463ffffffff1660e01b8152600401611a8893929190615ad7565b6000600160ff1b82106140855760405162461bcd60e51b815260040161064890615d3b565b5090565b604080516001808252818301909252606091602080830190803883390190505090506e466c657869626c6553746f7261676560881b816000815181106140cb57fe5b60200260200101818152505090565b6060815183510160405190808252806020026020018201604052801561410a578160200160208202803883390190505b50905060005b835181101561414c5783818151811061412557fe5b602002602001015182828151811061413957fe5b6020908102919091010152600101614110565b5060005b825181101561218a5782818151811061416557fe5b602002602001015182828651018151811061417c57fe5b6020908102919091010152600101614150565b600080600061419d846139b5565b90506000806141d86141ad613462565b6001600160a01b03166370a08231886040518263ffffffff1660e01b815260040161118091906159ba565b925050915082600014156141f4576000945092506121ad915050565b614204828463ffffffff61388116565b945092505050915091565b600061422561421c6130e0565b6116b784614266565b42101592915050565b614236614642565b6001600160a01b0316336001600160a01b031614612a4e5760405162461bcd60e51b815260040161064890615bee565b6000614270614695565b6001600160a01b03166323257c2b6524b9b9bab2b960d11b6d1b185cdd125cdcdd59515d995b9d60921b856040516020016142ac929190615969565b604051602081830303815290604052805190602001206040518363ffffffff1660e01b81526004016142df929190615ac9565b60206040518083038186803b1580156142f757600080fd5b505afa15801561430b573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250610f459190810190614e02565b600080614355766578743a41676772656761746f7244656274526174696f60481b612fa2565b90506000816001600160a01b031663feaf968c6040518163ffffffff1660e01b815260040160a06040518083038186803b15801561439257600080fd5b505afa1580156143a6573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052506143ca9190810190614fde565b50505091505060006143da613648565b6001600160a01b031663045056f8620a69cb60eb1b6040518263ffffffff1660e01b815260040161440b9190615aad565b606060405180830381600087803b15801561442557600080fd5b505af1158015614439573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525061445d9190810190614ef7565b50915050614469614a4b565b6001600160a01b031663413caeb584846040518363ffffffff1660e01b81526004016144969291906159fe565b602060405180830381600087803b1580156144b057600080fd5b505af11580156144c4573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052506144e89190810190614dc6565b806144f05750805b935050505090565b6145006148e6565b6001600160a01b031663270fb338836040518263ffffffff1660e01b815260040161452b91906159ba565b600060405180830381600087803b15801561454557600080fd5b505af1158015614559573d6000803e3d6000fd5b505050506000614567613462565b9050600061457483614989565b9050806145e057604051636178258560e11b81526001600160a01b0383169063c2f04b0a906145a990879087906004016159fe565b600060405180830381600087803b1580156145c357600080fd5b505af11580156145d7573d6000803e3d6000fd5b5050505061463c565b604051636178258560e11b81526001600160a01b0383169063c2f04b0a9061460e90879085906004016159fe565b600060405180830381600087803b15801561462857600080fd5b505af1158015613443573d6000803e3d6000fd5b50505050565b6000610c1c6c29bcb73a342932b232b2b6b2b960991b612fa2565b60008061467784613bef87600a870263ffffffff61491a16565b90506005600a825b061061468957600a015b600a9004949350505050565b6000610c1c6e466c657869626c6553746f7261676560881b612fa2565b6000610c1c7044656c6567617465417070726f76616c7360781b612fa2565b60006146db61432f565b156146e8575060006147f6565b8282106146f557826146f7565b815b9050614704858284613bfb565b631cd554d160e21b6000526005602052600080516020615ee283398151915254604051632770a7eb60e21b81526001600160a01b0390911690639dc29fac9061475390879085906004016159fe565b600060405180830381600087803b15801561476d57600080fd5b505af1158015614781573d6000803e3d6000fd5b5050505061478d612a50565b6001600160a01b03166342c7b8196147a483614060565b6000036040518263ffffffff1660e01b81526004016147c39190615aad565b600060405180830381600087803b1580156147dd57600080fd5b505af11580156147f1573d6000803e3d6000fd5b505050505b949350505050565b600080614824766578743a41676772656761746f7244656274526174696f60481b612fa2565b6001600160a01b031663feaf968c6040518163ffffffff1660e01b815260040160a06040518083038186803b15801561485c57600080fd5b505afa158015614870573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052506148949190810190614fde565b5050509150506130188184614a6790919063ffffffff16565b6000610c1c6e53796e746865746978457363726f7760881b612fa2565b6000610c1c6d2932bbb0b93222b9b1b937bbab1960911b612fa2565b6000610c1c704c697175696461746f725265776172647360781b612fa2565b60006130188383670de0b6b3a7640000614a7c565b60008261492957506000610f45565b8282028284828161493657fe5b04146130185760405162461bcd60e51b815260040161064890615cdb565b60008082116149755760405162461bcd60e51b815260040161064890615c3b565b600082848161498057fe5b04949350505050565b6000806149af766578743a41676772656761746f7244656274526174696f60481b612fa2565b6001600160a01b031663feaf968c6040518163ffffffff1660e01b815260040160a06040518083038186803b1580156149e757600080fd5b505afa1580156149fb573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250614a1f9190810190614fde565b50505091505080600014614a4257614a3d838263ffffffff612fff16565b613018565b50600092915050565b6000610c1c6d21b4b931bab4ba213932b0b5b2b960911b612fa2565b600061301883836b033b2e3c9fd0803ce80000005b600080600a8304614a93868663ffffffff61491a16565b81614a9a57fe5b0490506005600a8261467f565b815481835581811115610f9957600083815260209020610f99918101908301610c1f91905b808211156140855760008155600101614acc565b8035610f4581615ea0565b8051610f4581615ea0565b60008083601f840112614b0857600080fd5b50813567ffffffffffffffff811115614b2057600080fd5b602083019150836020820283011115613fe057600080fd5b600082601f830112614b4957600080fd5b8151614b5c614b5782615dc6565b615d9f565b91508181835260208401935060208101905083856020840282011115614b8157600080fd5b60005b83811015614bad5781614b978882614bd8565b8452506020928301929190910190600101614b84565b5050505092915050565b8035610f4581615eb4565b8051610f4581615eb4565b8035610f4581615ebd565b8051610f4581615ebd565b8035610f4581615ec6565b8051610f4581615ec6565b8035610f4581615ecf565b8051610f4581615ecf565b8051610f4581615ed8565b600060208284031215614c2c57600080fd5b60006147f68484614ae0565b600060208284031215614c4a57600080fd5b60006147f68484614aeb565b60008060408385031215614c6957600080fd5b6000614c758585614ae0565b9250506020614c8685828601614ae0565b9150509250929050565b600080600060608486031215614ca557600080fd5b6000614cb18686614ae0565b9350506020614cc286828701614ae0565b9250506040614cd386828701614bcd565b9150509250925092565b60008060408385031215614cf057600080fd5b6000614cfc8585614ae0565b9250506020614c8685828601614bb7565b60008060408385031215614d2057600080fd5b6000614d2c8585614ae0565b9250506020614c8685828601614bcd565b60008060208385031215614d5057600080fd5b823567ffffffffffffffff811115614d6757600080fd5b614d7385828601614af6565b92509250509250929050565b60008060408385031215614d9257600080fd5b825167ffffffffffffffff811115614da957600080fd5b614db585828601614b38565b9250506020614c8685828601614bc2565b600060208284031215614dd857600080fd5b60006147f68484614bc2565b600060208284031215614df657600080fd5b60006147f68484614bcd565b600060208284031215614e1457600080fd5b60006147f68484614bd8565b600080600060608486031215614e3557600080fd5b6000614cb18686614bcd565b60008060408385031215614e5457600080fd5b6000614cfc8585614bcd565b600060208284031215614e7257600080fd5b60006147f68484614be3565b600060208284031215614e9057600080fd5b60006147f68484614bee565b600060208284031215614eae57600080fd5b60006147f68484614bf9565b600060208284031215614ecc57600080fd5b60006147f68484614c04565b60008060408385031215614eeb57600080fd5b6000614db58585614bd8565b600080600060608486031215614f0c57600080fd5b6000614f188686614bd8565b9350506020614f2986828701614bc2565b9250506040614cd386828701614bc2565b60008060008060808587031215614f5057600080fd5b6000614f5c8787614bd8565b9450506020614f6d87828801614bd8565b9350506040614f7e87828801614bc2565b9250506060614f8f87828801614bc2565b91505092959194509250565b600080600060608486031215614fb057600080fd5b6000614fbc8686614bd8565b9350506020614fcd86828701614bd8565b9250506040614cd386828701614bd8565b600080600080600060a08688031215614ff657600080fd5b60006150028888614c0f565b955050602061501388828901614bd8565b945050604061502488828901614bd8565b935050606061503588828901614bd8565b925050608061504688828901614c0f565b9150509295509295909350565b600061505f83836151ca565b505060200190565b600061505f83836151e4565b61507c81615dfa565b82525050565b61507c61508e82615dfa565b615e7f565b600061509f8385615df1565b93506001600160fb1b038311156150b557600080fd5b6020830292506150c6838584615e47565b50500190565b60006150d782615ded565b6150e18185615df1565b93506150ec83615de7565b8060005b8381101561511a5781516151048882615053565b975061510f83615de7565b9250506001016150f0565b509495945050505050565b600061513082615ded565b61513a8185615df1565b935061514583615de7565b8060005b8381101561511a57815161515d8882615067565b975061516883615de7565b925050600101615149565b600061517e82615ded565b6151888185615df1565b935061519383615de7565b8060005b8381101561511a5781516151ab8882615053565b97506151b683615de7565b925050600101615197565b61507c81615e05565b61507c81610c1f565b61507c6151df82610c1f565b610c1f565b61507c81615e0a565b61507c81615e3c565b600061520182615ded565b61520b8185615df1565b935061521b818560208601615e53565b61522481615e90565b9093019392505050565b600061523b601e83615df1565b7f4973737565723a206f6e65206d696e746572206d757374206265203078300000815260200192915050565b6000615274603583615df1565b7f596f75206d757374206265206e6f6d696e61746564206265666f726520796f7581527402063616e20616363657074206f776e65727368697605c1b602082015260400192915050565b60006152cb601d83615df1565b7f4e6f7420617070726f76656420746f20616374206f6e20626568616c66000000815260200192915050565b6000615304601c83615df1565b7f4973737565723a2063616e6e6f74206275726e20302073796e74687300000000815260200192915050565b600061533d601b83615df1565b7f4973737565723a2077726f6e672073686f727420616464726573730000000000815260200192915050565b6000615376601b83615df1565b7f536166654d6174683a206164646974696f6e206f766572666c6f770000000000815260200192915050565b60006153af603f83615df1565b7f4973737565723a204f6e6c79207468652053796e746852656465656d6572206381527f6f6e74726163742063616e20706572666f726d207468697320616374696f6e00602082015260400192915050565b74436f6c6c61746572616c53686f72744c656761637960581b9052565b600061542b601283615df1565b714e6f206465627420746f20666f726769766560701b815260200192915050565b6000615459601083615df1565b6f416d6f756e7420746f6f206c6172676560801b815260200192915050565b6000615485601e83615df1565b7f536166654d6174683a207375627472616374696f6e206f766572666c6f770000815260200192915050565b60006154be601a83615df1565b7f536166654d6174683a206469766973696f6e206279207a65726f000000000000815260200192915050565b60006154f76011836106a1565b70026b4b9b9b4b7339030b2323932b9b99d1607d1b815260110192915050565b6000615524603b83615df1565b7f4973737565723a204f6e6c79207468652073796e74686574697820636f6e747281527f6163742063616e20706572666f726d207468697320616374696f6e0000000000602082015260400192915050565b6000615583601083615df1565b6f135d5cdd08189948199959481c1bdbdb60821b815260200192915050565b60006155af601e83615df1565b7f412073796e7468206f7220534e58207261746520697320696e76616c69640000815260200192915050565b60006155e8601483615df1565b7314de5b9d1a08191bd95cc81b9bdd08195e1a5cdd60621b815260200192915050565b6000615618602a83615df1565b7f43616e6e6f742072656d6f76652073796e746820746f2072656465656d20776981526974686f7574207261746560b01b602082015260400192915050565b6000615664601883615df1565b7f4e6f74206f70656e20666f72206c69717569646174696f6e0000000000000000815260200192915050565b600061569d602f83615df1565b7f4f6e6c792074686520636f6e7472616374206f776e6572206d6179207065726681526e37b936903a3434b99030b1ba34b7b760891b602082015260400192915050565b631cd554d160e21b9052565b60006156fa601783615df1565b7f4973737565723a20696e76616c69642061646472657373000000000000000000815260200192915050565b6000615733601c83615df1565b7f53796e7468206164647265737320616c72656164792065786973747300000000815260200192915050565b600061576c602183615df1565b7f536166654d6174683a206d756c7469706c69636174696f6e206f766572666c6f8152607760f81b602082015260400192915050565b60006157af601383615df1565b72086c2dcdcdee840e4cadadeecca40e6f2dce8d606b1b815260200192915050565b60006157de601d83615df1565b7f4973737565723a2063616e6e6f7420697373756520302073796e746873000000815260200192915050565b60006158176019836106a1565b7f5265736f6c766572206d697373696e67207461726765743a2000000000000000815260190192915050565b6000615850600c83615df1565b6b53796e74682065786973747360a01b815260200192915050565b6000615878601b83615df1565b7f4973737565723a2073796e746820646f65736e27742065786973740000000000815260200192915050565b60006158b1601e83615df1565b7f4d696e696d756d207374616b652074696d65206e6f7420726561636865640000815260200192915050565b60006158ea602883615df1565b7f53616665436173743a2076616c756520646f65736e27742066697420696e2061815267371034b73a191a9b60c11b602082015260400192915050565b6000615934601c83615df1565b7f4973737565723a206f6e6c792074727573746564206d696e7465727300000000815260200192915050565b61507c81615e15565b600061597582856151d3565b6020820191506159858284615082565b5060140192915050565b600061599a826154ea565b91506159a682846151d3565b50602001919050565b600061599a8261580a565b60208101610f458284615073565b604081016159d68285615073565b6130186020830184615073565b604081016159f18285615073565b61301860208301846151c1565b60408101615a0c8285615073565b61301860208301846151ca565b60808101615a278287615073565b615a3460208301866151ca565b615a4160408301856151ca565b615a4e60608301846151ca565b95945050505050565b60408082528101615a69818587615093565b90508181036020830152615a4e8184615173565b6020808252810161301881846150cc565b602080825281016130188184615125565b60208101610f4582846151c1565b60208101610f4582846151ca565b604081016159d682856151ca565b60408101615a0c82856151ca565b60608101615ae582866151ca565b615af260208301856151ca565b6147f660408301846151ca565b60408101615b0d82856151ca565b61301860208301846151ed565b60408101615b2882856151ca565b81810360208301526147f681846151f6565b60608101615b4882856151ca565b615b5560208301846151ca565b613018604083016156e1565b60208101610f4582846151e4565b60408101615a0c82856151e4565b6020808252810161301881846151f6565b60208082528101610f458161522e565b60208082528101610f4581615267565b60208082528101610f45816152be565b60208082528101610f45816152f7565b60208082528101610f4581615330565b60208082528101610f4581615369565b60208082528101610f45816153a2565b602081016106a182615401565b60208082528101610f458161541e565b60208082528101610f458161544c565b60208082528101610f4581615478565b60208082528101610f45816154b1565b60208082528101610f4581615517565b60208082528101610f4581615576565b60208082528101610f45816155a2565b60208082528101610f45816155db565b60208082528101610f458161560b565b60208082528101610f4581615657565b60208082528101610f4581615690565b60208082528101610f45816156ed565b60208082528101610f4581615726565b60208082528101610f458161575f565b60208082528101610f45816157a2565b60208082528101610f45816157d1565b60208082528101610f4581615843565b60208082528101610f458161586b565b60208082528101610f45816158a4565b60208082528101610f45816158dd565b60208082528101610f4581615927565b60208101610f458284615960565b604081016159f182856151ca565b60608101615d8582866151ca565b615d9260208301856151ca565b6147f660408301846151c1565b60405181810167ffffffffffffffff81118282101715615dbe57600080fd5b604052919050565b600067ffffffffffffffff821115615ddd57600080fd5b5060209081020190565b60200190565b5190565b90815260200190565b6000610f4582615e21565b151590565b6000610f4582615dfa565b6001600160801b031690565b6001600160a01b031690565b69ffffffffffffffffffff1690565b6000610f4582610c1f565b82818337506000910152565b60005b83811015615e6e578181015183820152602001615e56565b8381111561463c5750506000910152565b6000610f45826000610f4582615e9a565b601f01601f191690565b60601b90565b615ea981615dfa565b811461109457600080fd5b615ea981615e05565b615ea981610c1f565b615ea981615e0a565b615ea981615e15565b615ea981615e2d56fe74c62d09fbc50aefae0794a9a068f786a692826fbdfe63828ec23a875865823fa365627a7a72315820c9d0d256818d7004ad92d8268ff5d9da6d64f6e1a4f50ec9df7c30538a46349f6c6578706572696d656e74616cf564736f6c63430005100040", - "nonce": 1, - "storage": { - "0x0563a8a19823933e751ef690567f0351d13ee18500841743a77290b3deeac37d": "0x00000000000000000000000047649022380d182da8010ae5d257fea4227b21ff", - "0x2afd905ac9e6ece2684aa6ded88f37849f2e8a1c0799f495019247a77b9400e4": "0x00000000000000000000000094a178f2c480d14f8cdda908d173d7a73f779cb7", - "0x2c32d9bea188d6227c14c18423322d2274518c2d17a0f2f01e7c51c2a11f2e80": "0x00000000000000000000000037aafb2ee35f1250a001202c660b13c301d2130b", - "0xd027d05cd8d91cd8ee694a5d839324f059c2a6452b85bb3ef588f068c493c615": "0x00000000000000000000000045c55bf488d3cb8640f12f63cbedc027e8261e79" - } - }, - "0x0d5642c6329adb3246c13d78b429a9fb1965a0d8": { - "balance": "0x0", - "code": "0x608060405234801561001057600080fd5b506004361061030a5760003560e01c80638e0566de1161019c578063c1075329116100ee578063e76d516811610097578063f2fde38b11610071578063f2fde38b14610cb6578063fbffd2c114610cdc578063feaf968c14610d025761030a565b8063e76d516814610c4e578063eb45716314610c56578063eb5dcd6c14610c885761030a565b8063dc7f0124116100c8578063dc7f012414610b9f578063e4902f8214610ba7578063e5fe457714610be45761030a565b8063c107532914610a57578063c980753914610a83578063d09dc33914610b975761030a565b80639e3ceeab11610150578063b5ab58dc1161012a578063b5ab58dc146109d8578063b633620c146109f5578063bd82470614610a125761030a565b80639e3ceeab14610966578063a118f2491461098c578063b121e147146109b25761030a565b8063996e829811610181578063996e8298146108295780639a6fc8f5146108315780639c849b30146108a45761030a565b80638e0566de146107d257806398e5b12a146108025761030a565b80636b14daf81161026057806381411834116102095780638823da6c116101e35780638823da6c1461077e5780638ac28d5a146107a45780638da5cb5b146107ca5761030a565b806381411834146106cd57806381ff7048146107255780638205bf6a146107765761030a565b80637284e4161161023a5780637284e416146106b557806379ba5097146106bd5780638038e4a1146106c55761030a565b80636b14daf8146105bf57806370da2f671461068957806370efdf2d146106915761030a565b8063313ce567116102c257806354fd4d501161029c57806354fd4d5014610482578063585aa7de1461048a578063668a0f02146105b75761030a565b8063313ce5671461042e5780634fb174701461044c57806350d25bcd1461047a5761030a565b8063181f5a77116102f3578063181f5a771461035157806322adbc78146103ce57806329937268146103ed5761030a565b80630a7569831461030f5780630eafb25b14610319575b600080fd5b610317610d0a565b005b61033f6004803603602081101561032f57600080fd5b50356001600160a01b0316610dc8565b60408051918252519081900360200190f35b610359610f13565b6040805160208082528351818301528351919283929083019185019080838360005b8381101561039357818101518382015260200161037b565b50505050905090810190601f1680156103c05780820380516001836020036101000a031916815260200191505b509250505060405180910390f35b6103d6610f33565b6040805160179290920b8252519081900360200190f35b6103f5610f57565b6040805163ffffffff96871681529486166020860152928516848401529084166060840152909216608082015290519081900360a00190f35b610436610fd4565b6040805160ff9092168252519081900360200190f35b6103176004803603604081101561046257600080fd5b506001600160a01b0381358116916020013516610ff8565b61033f6112dc565b61033f61137d565b610317600480360360a08110156104a057600080fd5b8101906020810181356401000000008111156104bb57600080fd5b8201836020820111156104cd57600080fd5b803590602001918460208302840111640100000000831117156104ef57600080fd5b91939092909160208101903564010000000081111561050d57600080fd5b82018360208201111561051f57600080fd5b8035906020019184602083028401116401000000008311171561054157600080fd5b9193909260ff8335169267ffffffffffffffff60208201351692919060608101906040013564010000000081111561057857600080fd5b82018360208201111561058a57600080fd5b803590602001918460018302840111640100000000831117156105ac57600080fd5b509092509050611382565b61033f611d5d565b610675600480360360408110156105d557600080fd5b6001600160a01b03823516919081019060408101602082013564010000000081111561060057600080fd5b82018360208201111561061257600080fd5b8035906020019184600183028401116401000000008311171561063457600080fd5b91908080601f016020809104026020016040519081016040528093929190818152602001838380828437600092019190915250929550611df9945050505050565b604080519115158252519081900360200190f35b6103d6611e21565b610699611e45565b604080516001600160a01b039092168252519081900360200190f35b610359611e54565b610317611ef0565b610317611fbe565b6106d561207d565b60408051602080825283518183015283519192839290830191858101910280838360005b838110156107115781810151838201526020016106f9565b505050509050019250505060405180910390f35b61072d6120df565b6040805163ffffffff94851681529290931660208301527fffffffffffffffffffffffffffffffff00000000000000000000000000000000168183015290519081900360600190f35b61033f612100565b6103176004803603602081101561079457600080fd5b50356001600160a01b031661219c565b610317600480360360208110156107ba57600080fd5b50356001600160a01b0316612293565b61069961230a565b6107da612319565b604080516001600160a01b03909316835263ffffffff90911660208301528051918290030190f35b61080a61235d565b6040805169ffffffffffffffffffff9092168252519081900360200190f35b6106996125b1565b61085a6004803603602081101561084757600080fd5b503569ffffffffffffffffffff166125c0565b604051808669ffffffffffffffffffff1681526020018581526020018481526020018381526020018269ffffffffffffffffffff1681526020019550505050505060405180910390f35b610317600480360360408110156108ba57600080fd5b8101906020810181356401000000008111156108d557600080fd5b8201836020820111156108e757600080fd5b8035906020019184602083028401116401000000008311171561090957600080fd5b91939092909160208101903564010000000081111561092757600080fd5b82018360208201111561093957600080fd5b8035906020019184602083028401116401000000008311171561095b57600080fd5b509092509050612675565b6103176004803603602081101561097c57600080fd5b50356001600160a01b03166128ae565b610317600480360360208110156109a257600080fd5b50356001600160a01b031661299c565b610317600480360360208110156109c857600080fd5b50356001600160a01b0316612a04565b61033f600480360360208110156109ee57600080fd5b5035612afd565b61033f60048036036020811015610a0b57600080fd5b5035612b9a565b610317600480360360a0811015610a2857600080fd5b5063ffffffff813581169160208101358216916040820135811691606081013582169160809091013516612c37565b61031760048036036040811015610a6d57600080fd5b506001600160a01b038135169060200135612d9d565b61031760048036036080811015610a9957600080fd5b810190602081018135640100000000811115610ab457600080fd5b820183602082011115610ac657600080fd5b80359060200191846001830284011164010000000083111715610ae857600080fd5b919390929091602081019035640100000000811115610b0657600080fd5b820183602082011115610b1857600080fd5b80359060200191846020830284011164010000000083111715610b3a57600080fd5b919390929091602081019035640100000000811115610b5857600080fd5b820183602082011115610b6a57600080fd5b80359060200191846020830284011164010000000083111715610b8c57600080fd5b9193509150356130c4565b61033f613fcd565b610675614077565b610bcd60048036036020811015610bbd57600080fd5b50356001600160a01b0316614080565b6040805161ffff9092168252519081900360200190f35b610bec61412d565b604080517fffffffffffffffffffffffffffffffff00000000000000000000000000000000909616865263ffffffff909416602086015260ff9092168484015260170b606084015267ffffffffffffffff166080830152519081900360a00190f35b61069961421c565b61031760048036036040811015610c6c57600080fd5b5080356001600160a01b0316906020013563ffffffff1661422b565b61031760048036036040811015610c9e57600080fd5b506001600160a01b03813581169160200135166143c0565b61031760048036036020811015610ccc57600080fd5b50356001600160a01b031661451b565b61031760048036036020811015610cf257600080fd5b50356001600160a01b03166145e3565b61085a61464b565b6000546001600160a01b03163314610d69576040805162461bcd60e51b815260206004820152601660248201527f4f6e6c792063616c6c61626c65206279206f776e657200000000000000000000604482015290519081900360640190fd5b60315460ff1615610dc657603180547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff001690556040517f3be8a977a014527b50ae38adda80b56911c267328965c98ddc385d248f53963890600090a15b565b6001600160a01b03811660009081526028602090815260408083208151808301909252805460ff808216845285948401916101009004166002811115610e0a57fe5b6002811115610e1557fe5b9052509050600081602001516002811115610e2c57fe5b1415610e3c576000915050610f0e565b6040805160a08101825260025463ffffffff80821683526401000000008204811660208401526801000000000000000082048116938301939093526c01000000000000000000000000810483166060830181905270010000000000000000000000000000000090910490921660808201528251909160009160019060059060ff16601f8110610ec757fe5b601091828204019190066002029054906101000a900461ffff160361ffff1602633b9aca0002905060016009846000015160ff16601f8110610f0557fe5b01540301925050505b919050565b6060604051806060016040528060288152602001615cc460289139905090565b7f00000000000000000000000000000000000000000052b7d2dcc80cd2e400000081565b6040805160a08101825260025463ffffffff808216808452640100000000830482166020850181905268010000000000000000840483169585018690526c01000000000000000000000000840483166060860181905270010000000000000000000000000000000090940490921660809094018490529490939290565b7f000000000000000000000000000000000000000000000000000000000000001b81565b6000546001600160a01b03163314611057576040805162461bcd60e51b815260206004820152601660248201527f4f6e6c792063616c6c61626c65206279206f776e657200000000000000000000604482015290519081900360640190fd5b6003546001600160a01b0390811690831681141561107557506112d8565b604080517f70a0823100000000000000000000000000000000000000000000000000000000815230600482015290516001600160a01b038516916370a08231916024808301926020929190829003018186803b1580156110d457600080fd5b505afa1580156110e8573d6000803e3d6000fd5b505050506040513d60208110156110fe57600080fd5b5061110990506146fe565b6000816001600160a01b03166370a08231306040518263ffffffff1660e01b815260040180826001600160a01b0316815260200191505060206040518083038186803b15801561115857600080fd5b505afa15801561116c573d6000803e3d6000fd5b505050506040513d602081101561118257600080fd5b5051604080517fa9059cbb0000000000000000000000000000000000000000000000000000000081526001600160a01b0386811660048301526024820184905291519293509084169163a9059cbb916044808201926020929091908290030181600087803b1580156111f357600080fd5b505af1158015611207573d6000803e3d6000fd5b505050506040513d602081101561121d57600080fd5b5051611270576040805162461bcd60e51b815260206004820152601f60248201527f7472616e736665722072656d61696e696e672066756e6473206661696c656400604482015290519081900360640190fd5b600380547fffffffffffffffffffffffff0000000000000000000000000000000000000000166001600160a01b0386811691821790925560405190918416907f4966a50c93f855342ccf6c5c0d358b85b91335b2acedc7da0932f691f351711a90600090a350505b5050565b600061131f336000368080601f016020809104026020016040519081016040528093929190818152602001838380828437600092019190915250611df992505050565b611370576040805162461bcd60e51b815260206004820152600960248201527f4e6f206163636573730000000000000000000000000000000000000000000000604482015290519081900360640190fd5b611378614aae565b905090565b600481565b868560ff8616601f8311156113de576040805162461bcd60e51b815260206004820152601060248201527f746f6f206d616e79207369676e65727300000000000000000000000000000000604482015290519081900360640190fd5b60008111611433576040805162461bcd60e51b815260206004820152601a60248201527f7468726573686f6c64206d75737420626520706f736974697665000000000000604482015290519081900360640190fd5b8183146114715760405162461bcd60e51b8152600401808060200182810382526024815260200180615cec6024913960400191505060405180910390fd5b8060030283116114c8576040805162461bcd60e51b815260206004820181905260248201527f6661756c74792d6f7261636c65207468726573686f6c6420746f6f2068696768604482015290519081900360640190fd5b6000546001600160a01b03163314611527576040805162461bcd60e51b815260206004820152601660248201527f4f6e6c792063616c6c61626c65206279206f776e657200000000000000000000604482015290519081900360640190fd5b602954156116cb57602980547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff8101916000918390811061156457fe5b6000918252602082200154602a80546001600160a01b039092169350908490811061158b57fe5b6000918252602090912001546001600160a01b031690506115ab81614aea565b6001600160a01b0380831660009081526028602052604080822080547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00009081169091559284168252902080549091169055602980548061160757fe5b60008281526020902081017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff90810180547fffffffffffffffffffffffff0000000000000000000000000000000000000000169055019055602a80548061166a57fe5b60008281526020902081017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff90810180547fffffffffffffffffffffffff000000000000000000000000000000000000000016905501905550611527915050565b60005b8a811015611ad9576000602860008e8e858181106116e857fe5b602090810292909201356001600160a01b031683525081019190915260400160002054610100900460ff16600281111561171e57fe5b14611770576040805162461bcd60e51b815260206004820152601760248201527f7265706561746564207369676e65722061646472657373000000000000000000604482015290519081900360640190fd5b6040805180820190915260ff8216815260016020820152602860008e8e8581811061179757fe5b602090810292909201356001600160a01b031683525081810192909252604001600020825181547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff001660ff9091161780825591830151909182907fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00ff1661010083600281111561182257fe5b02179055506000915060079050818c8c8581811061183c57fe5b6001600160a01b03602091820293909301358316845283019390935260409091016000205416919091141590506118ba576040805162461bcd60e51b815260206004820152601160248201527f7061796565206d75737420626520736574000000000000000000000000000000604482015290519081900360640190fd5b6000602860008c8c858181106118cc57fe5b602090810292909201356001600160a01b031683525081019190915260400160002054610100900460ff16600281111561190257fe5b14611954576040805162461bcd60e51b815260206004820152601c60248201527f7265706561746564207472616e736d6974746572206164647265737300000000604482015290519081900360640190fd5b6040805180820190915260ff8216815260026020820152602860008c8c8581811061197b57fe5b602090810292909201356001600160a01b031683525081810192909252604001600020825181547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff001660ff9091161780825591830151909182907fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00ff16610100836002811115611a0657fe5b021790555090505060298c8c83818110611a1c57fe5b835460018101855560009485526020948590200180547fffffffffffffffffffffffff0000000000000000000000000000000000000000166001600160a01b039590920293909301359390931692909217905550602a8a8a83818110611a7e57fe5b835460018181018655600095865260209586902090910180547fffffffffffffffffffffffff0000000000000000000000000000000000000000166001600160a01b03969093029490940135949094161790915550016116ce565b50602b805460ff89167501000000000000000000000000000000000000000000027fffffffffffffffffffff00ffffffffffffffffffffffffffffffffffffffffff909116179055602d80544363ffffffff9081166401000000009081027fffffffffffffffffffffffffffffffffffffffffffffffff00000000ffffffff84161780831660010183167fffffffffffffffffffffffffffffffffffffffffffffffffffffffff00000000909116179384905590910481169116611ba530828f8f8f8f8f8f8f8f614cf6565b602b60000160006101000a8154816fffffffffffffffffffffffffffffffff021916908360801c02179055506000602b60000160106101000a81548164ffffffffff021916908364ffffffffff1602179055507f25d719d88a4512dd76c7442b910a83360845505894eb444ef299409e180f8fb982828f8f8f8f8f8f8f8f604051808b63ffffffff1681526020018a67ffffffffffffffff16815260200180602001806020018760ff1681526020018667ffffffffffffffff1681526020018060200184810384528c8c82818152602001925060200280828437600083820152601f017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe01690910185810384528a8152602090810191508b908b0280828437600083820152601f017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe01690910185810383528681526020019050868680828437600083820152604051601f9091017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0169092018290039f50909d5050505050505050505050505050a150505050505050505050505050565b6000611da0336000368080601f016020809104026020016040519081016040528093929190818152602001838380828437600092019190915250611df992505050565b611df1576040805162461bcd60e51b815260206004820152600960248201527f4e6f206163636573730000000000000000000000000000000000000000000000604482015290519081900360640190fd5b611378614e36565b6000611e058383614e5c565b80611e1857506001600160a01b03831632145b90505b92915050565b7f0000000000000000000000000000000000000000204fce5e3e2502611000000081565b602f546001600160a01b031690565b6060611e97336000368080601f016020809104026020016040519081016040528093929190818152602001838380828437600092019190915250611df992505050565b611ee8576040805162461bcd60e51b815260206004820152600960248201527f4e6f206163636573730000000000000000000000000000000000000000000000604482015290519081900360640190fd5b611378614e8c565b6001546001600160a01b03163314611f4f576040805162461bcd60e51b815260206004820152601660248201527f4d7573742062652070726f706f736564206f776e657200000000000000000000604482015290519081900360640190fd5b60008054337fffffffffffffffffffffffff0000000000000000000000000000000000000000808316821784556001805490911690556040516001600160a01b0390921692909183917f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e091a350565b6000546001600160a01b0316331461201d576040805162461bcd60e51b815260206004820152601660248201527f4f6e6c792063616c6c61626c65206279206f776e657200000000000000000000604482015290519081900360640190fd5b60315460ff16610dc657603180547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff001660011790556040517faebf329500988c6488a0074e5a0a9ff304561fc5c6fc877aeb1d59c8282c348090600090a1565b6060602a8054806020026020016040519081016040528092919081815260200182805480156120d557602002820191906000526020600020905b81546001600160a01b031681526001909101906020018083116120b7575b5050505050905090565b602d54602b5463ffffffff808316926401000000009004169060801b909192565b6000612143336000368080601f016020809104026020016040519081016040528093929190818152602001838380828437600092019190915250611df992505050565b612194576040805162461bcd60e51b815260206004820152600960248201527f4e6f206163636573730000000000000000000000000000000000000000000000604482015290519081900360640190fd5b611378614f37565b6000546001600160a01b031633146121fb576040805162461bcd60e51b815260206004820152601660248201527f4f6e6c792063616c6c61626c65206279206f776e657200000000000000000000604482015290519081900360640190fd5b6001600160a01b03811660009081526032602052604090205460ff1615612290576001600160a01b03811660008181526032602090815260409182902080547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00169055815192835290517f3d68a6fce901d20453d1a7aa06bf3950302a735948037deb182a8db66df2a0d19281900390910190a15b50565b6001600160a01b03818116600090815260076020526040902054163314612301576040805162461bcd60e51b815260206004820152601760248201527f4f6e6c792070617965652063616e207769746864726177000000000000000000604482015290519081900360640190fd5b61229081614aea565b6000546001600160a01b031681565b60408051808201909152602e546001600160a01b0381168083527401000000000000000000000000000000000000000090910463ffffffff16602090920182905291565b600080546001600160a01b03163314806124575750602f54604080517f6b14daf800000000000000000000000000000000000000000000000000000000815233600482018181526024830193845236604484018190526001600160a01b0390951694636b14daf894929360009391929190606401848480828437600083820152604051601f9091017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe016909201965060209550909350505081840390508186803b15801561242a57600080fd5b505afa15801561243e573d6000803e3d6000fd5b505050506040513d602081101561245457600080fd5b50515b6124a8576040805162461bcd60e51b815260206004820152601d60248201527f4f6e6c79206f776e6572267265717565737465722063616e2063616c6c000000604482015290519081900360640190fd5b6040805160808082018352602b549081901b7fffffffffffffffffffffffffffffffff0000000000000000000000000000000016808352700100000000000000000000000000000000820464ffffffffff81166020808601919091527501000000000000000000000000000000000000000000840460ff9081168688015276010000000000000000000000000000000000000000000090940463ffffffff9081166060808801919091528751948552600884901c909116918401919091529216818501529251919233927f3ea16a923ff4b1df6526e854c9e3a995c43385d70e73359e10623c74f0b52037929181900390910190a2806060015160010163ffffffff1691505090565b6004546001600160a01b031690565b6000806000806000612609336000368080601f016020809104026020016040519081016040528093929190818152602001838380828437600092019190915250611df992505050565b61265a576040805162461bcd60e51b815260206004820152600960248201527f4e6f206163636573730000000000000000000000000000000000000000000000604482015290519081900360640190fd5b61266386614f92565b939a9299509097509550909350915050565b6000546001600160a01b031633146126d4576040805162461bcd60e51b815260206004820152601660248201527f4f6e6c792063616c6c61626c65206279206f776e657200000000000000000000604482015290519081900360640190fd5b828114612728576040805162461bcd60e51b815260206004820181905260248201527f7472616e736d6974746572732e73697a6520213d207061796565732e73697a65604482015290519081900360640190fd5b60005b838110156128a757600085858381811061274157fe5b905060200201356001600160a01b03169050600084848481811061276157fe5b6001600160a01b0385811660009081526007602090815260409091205492029390930135831693509091169050801580806127ad5750826001600160a01b0316826001600160a01b0316145b6127fe576040805162461bcd60e51b815260206004820152601160248201527f706179656520616c726561647920736574000000000000000000000000000000604482015290519081900360640190fd5b6001600160a01b03848116600090815260076020526040902080547fffffffffffffffffffffffff0000000000000000000000000000000000000000168583169081179091559083161461289757826001600160a01b0316826001600160a01b0316856001600160a01b03167f78af32efdcad432315431e9b03d27e6cd98fb79c405fdc5af7c1714d9c0f75b360405160405180910390a45b50506001909201915061272b9050565b5050505050565b6000546001600160a01b0316331461290d576040805162461bcd60e51b815260206004820152601660248201527f4f6e6c792063616c6c61626c65206279206f776e657200000000000000000000604482015290519081900360640190fd5b602f546001600160a01b0390811690821681146112d857602f80547fffffffffffffffffffffffff0000000000000000000000000000000000000000166001600160a01b03848116918217909255604080519284168352602083019190915280517f27b89aede8b560578baaa25ee5ce3852c5eecad1e114b941bbd89e1eb4bae6349281900390910190a15050565b6000546001600160a01b031633146129fb576040805162461bcd60e51b815260206004820152601660248201527f4f6e6c792063616c6c61626c65206279206f776e657200000000000000000000604482015290519081900360640190fd5b612290816150dd565b6001600160a01b03818116600090815260086020526040902054163314612a72576040805162461bcd60e51b815260206004820152601f60248201527f6f6e6c792070726f706f736564207061796565732063616e2061636365707400604482015290519081900360640190fd5b6001600160a01b0381811660008181526007602090815260408083208054337fffffffffffffffffffffffff000000000000000000000000000000000000000080831682179093556008909452828520805490921690915590519416939092849290917f78af32efdcad432315431e9b03d27e6cd98fb79c405fdc5af7c1714d9c0f75b39190a45050565b6000612b40336000368080601f016020809104026020016040519081016040528093929190818152602001838380828437600092019190915250611df992505050565b612b91576040805162461bcd60e51b815260206004820152600960248201527f4e6f206163636573730000000000000000000000000000000000000000000000604482015290519081900360640190fd5b611e1b82615176565b6000612bdd336000368080601f016020809104026020016040519081016040528093929190818152602001838380828437600092019190915250611df992505050565b612c2e576040805162461bcd60e51b815260206004820152600960248201527f4e6f206163636573730000000000000000000000000000000000000000000000604482015290519081900360640190fd5b611e1b826151ac565b6004546000546001600160a01b039182169116331480612d2f5750604080517f6b14daf800000000000000000000000000000000000000000000000000000000815233600482018181526024830193845236604484018190526001600160a01b03861694636b14daf8946000939190606401848480828437600083820152604051601f9091017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe016909201965060209550909350505081840390508186803b158015612d0257600080fd5b505afa158015612d16573d6000803e3d6000fd5b505050506040513d6020811015612d2c57600080fd5b50515b612d80576040805162461bcd60e51b815260206004820181905260248201527f4f6e6c79206f776e65722662696c6c696e6741646d696e2063616e2063616c6c604482015290519081900360640190fd5b612d886146fe565b612d958686868686615201565b505050505050565b6000546001600160a01b0316331480612e95575060048054604080517f6b14daf8000000000000000000000000000000000000000000000000000000008152339381018481526024820192835236604483018190526001600160a01b0390941694636b14daf8949093600093919291606401848480828437600083820152604051601f9091017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe016909201965060209550909350505081840390508186803b158015612e6857600080fd5b505afa158015612e7c573d6000803e3d6000fd5b505050506040513d6020811015612e9257600080fd5b50515b612ee6576040805162461bcd60e51b815260206004820181905260248201527f4f6e6c79206f776e65722662696c6c696e6741646d696e2063616e2063616c6c604482015290519081900360640190fd5b6000612ef061537b565b600354604080517f70a0823100000000000000000000000000000000000000000000000000000000815230600482015290519293506000926001600160a01b03909216916370a0823191602480820192602092909190829003018186803b158015612f5a57600080fd5b505afa158015612f6e573d6000803e3d6000fd5b505050506040513d6020811015612f8457600080fd5b5051905081811015612fdd576040805162461bcd60e51b815260206004820152601460248201527f696e73756666696369656e742062616c616e6365000000000000000000000000604482015290519081900360640190fd5b6003546001600160a01b031663a9059cbb85612ffb8585038761554b565b6040518363ffffffff1660e01b815260040180836001600160a01b0316815260200182815260200192505050602060405180830381600087803b15801561304157600080fd5b505af1158015613055573d6000803e3d6000fd5b505050506040513d602081101561306b57600080fd5b50516130be576040805162461bcd60e51b815260206004820152601260248201527f696e73756666696369656e742066756e64730000000000000000000000000000604482015290519081900360640190fd5b50505050565b60005a90506130d7888888888888615562565b361461312a576040805162461bcd60e51b815260206004820152601960248201527f7472616e736d6974206d65737361676520746f6f206c6f6e6700000000000000604482015290519081900360640190fd5b613132615b59565b6040805160808082018352602b549081901b7fffffffffffffffffffffffffffffffff00000000000000000000000000000000168252700100000000000000000000000000000000810464ffffffffff1660208301527501000000000000000000000000000000000000000000810460ff169282019290925276010000000000000000000000000000000000000000000090910463ffffffff166060808301919091529082526000908a908a908110156131eb57600080fd5b81359160208101359181019060608101604082013564010000000081111561321257600080fd5b82018360208201111561322457600080fd5b8035906020019184602083028401116401000000008311171561324657600080fd5b91908080602002602001604051908101604052809392919081815260200183836020028082843760009201919091525050505060408801525050506080840182905283515190925060589190911b907fffffffffffffffffffffffffffffffff0000000000000000000000000000000080831691161461330d576040805162461bcd60e51b815260206004820152601560248201527f636f6e666967446967657374206d69736d617463680000000000000000000000604482015290519081900360640190fd5b608083015183516020015164ffffffffff808316911610613375576040805162461bcd60e51b815260206004820152600c60248201527f7374616c65207265706f72740000000000000000000000000000000000000000604482015290519081900360640190fd5b83516040015160ff1689116133d1576040805162461bcd60e51b815260206004820152601560248201527f6e6f7420656e6f756768207369676e6174757265730000000000000000000000604482015290519081900360640190fd5b601f891115613427576040805162461bcd60e51b815260206004820152601360248201527f746f6f206d616e79207369676e61747572657300000000000000000000000000604482015290519081900360640190fd5b86891461347b576040805162461bcd60e51b815260206004820152601e60248201527f7369676e617475726573206f7574206f6620726567697374726174696f6e0000604482015290519081900360640190fd5b601f84604001515111156134d6576040805162461bcd60e51b815260206004820152601e60248201527f6e756d206f62736572766174696f6e73206f7574206f6620626f756e64730000604482015290519081900360640190fd5b83600001516040015160020260ff168460400151511161353d576040805162461bcd60e51b815260206004820152601e60248201527f746f6f206665772076616c75657320746f207472757374206d656469616e0000604482015290519081900360640190fd5b8867ffffffffffffffff8111801561355457600080fd5b506040519080825280601f01601f19166020018201604052801561357f576020820181803683370190505b50606085015260005b60ff81168a11156135f057868160ff16602081106135a257fe5b1a60f81b85606001518260ff16815181106135b957fe5b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a905350600101613588565b5083604001515167ffffffffffffffff8111801561360d57600080fd5b506040519080825280601f01601f191660200182016040528015613638576020820181803683370190505b506020850152613646615b8d565b60005b8560400151518160ff16101561374c576000858260ff166020811061366a57fe5b1a90508281601f811061367957fe5b6020020151156136d0576040805162461bcd60e51b815260206004820152601760248201527f6f6273657276657220696e646578207265706561746564000000000000000000604482015290519081900360640190fd5b6001838260ff16601f81106136e157fe5b91151560209283029190910152869060ff84169081106136fd57fe5b1a60f81b87602001518360ff168151811061371457fe5b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a90535050600101613649565b503360009081526028602090815260408083208151808301909252805460ff8082168452929391929184019161010090910416600281111561378a57fe5b600281111561379557fe5b90525090506002816020015160028111156137ac57fe5b1480156137e05750602a816000015160ff16815481106137c857fe5b6000918252602090912001546001600160a01b031633145b613831576040805162461bcd60e51b815260206004820152601860248201527f756e617574686f72697a6564207472616e736d69747465720000000000000000604482015290519081900360640190fd5b5050835164ffffffffff90911660209091015250506040516000908a908a9080838380828437604051920182900390912094506138729350615b8d92505050565b61387a615bac565b60005b89811015613a915760006001858760600151848151811061389a57fe5b60209101015160f81c601b018e8e868181106138b257fe5b905060200201358d8d878181106138c557fe5b9050602002013560405160008152602001604052604051808581526020018460ff1681526020018381526020018281526020019450505050506020604051602081039080840390855afa158015613920573d6000803e3d6000fd5b5050604080517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe08101516001600160a01b03811660009081526028602090815290849020838501909452835460ff8082168552929650929450840191610100900416600281111561398d57fe5b600281111561399857fe5b90525092506001836020015160028111156139af57fe5b14613a01576040805162461bcd60e51b815260206004820152601e60248201527f61646472657373206e6f7420617574686f72697a656420746f207369676e0000604482015290519081900360640190fd5b8251849060ff16601f8110613a1257fe5b602002015115613a69576040805162461bcd60e51b815260206004820152601460248201527f6e6f6e2d756e69717565207369676e6174757265000000000000000000000000604482015290519081900360640190fd5b600184846000015160ff16601f8110613a7e57fe5b911515602090920201525060010161387d565b5050505060005b600182604001515103811015613b4257600082604001518260010181518110613abd57fe5b602002602001015160170b83604001518381518110613ad857fe5b602002602001015160170b1315905080613b39576040805162461bcd60e51b815260206004820152601760248201527f6f62736572766174696f6e73206e6f7420736f72746564000000000000000000604482015290519081900360640190fd5b50600101613a98565b50604081015180516000919060028104908110613b5b57fe5b602002602001015190508060170b7f00000000000000000000000000000000000000000052b7d2dcc80cd2e400000060170b13158015613bc157507f0000000000000000000000000000000000000000204fce5e3e2502611000000060170b8160170b13155b613c12576040805162461bcd60e51b815260206004820152601e60248201527f6d656469616e206973206f7574206f66206d696e2d6d61782072616e67650000604482015290519081900360640190fd5b81516060908101805163ffffffff60019091018116909152604080518082018252601785810b80835267ffffffffffffffff42811660208086019182528a5189015188166000908152602c82528781209651875493519094167801000000000000000000000000000000000000000000000000029390950b77ffffffffffffffffffffffffffffffffffffffffffffffff9081167fffffffffffffffff0000000000000000000000000000000000000000000000009093169290921790911691909117909355875186015184890151848a01516080808c015188519586523386890181905291860181905260a0988601898152845199870199909952835194909916997ff6a97944f31ea060dfde0566e4167c1a1082551e64b60ecb14d599a9d023d451998c999298949793969095909492939185019260c086019289820192909102908190849084905b83811015613d75578181015183820152602001613d5d565b50505050905001838103825285818151815260200191508051906020019080838360005b83811015613db1578181015183820152602001613d99565b50505050905090810190601f168015613dde5780820380516001836020036101000a031916815260200191505b5097505050505050505060405180910390a281516060015160408051428152905160009263ffffffff16917f0109fc6f55cf40689f02fbaad7af7fe7bbac8a3d2186600afc7d3e10cac60271919081900360200190a381600001516060015163ffffffff168160170b7f0559884fd3a460db3073b7fc896cc77986f16e378210ded43186175bf646fc5f426040518082815260200191505060405180910390a3613e938260000151606001518260170b61557a565b5080518051602b8054602084015160408501516060909501517fffffffffffffffffffffffffffffffff0000000000000000000000000000000090921660809490941c939093177fffffffffffffffffffffff0000000000ffffffffffffffffffffffffffffffff1670010000000000000000000000000000000064ffffffffff90941693909302929092177fffffffffffffffffffff00ffffffffffffffffffffffffffffffffffffffffff16750100000000000000000000000000000000000000000060ff90941693909302929092177fffffffffffff00000000ffffffffffffffffffffffffffffffffffffffffffff1676010000000000000000000000000000000000000000000063ffffffff92831602179091558210613fb457fe5b613fc28282602001516156ba565b505050505050505050565b600354604080517f70a08231000000000000000000000000000000000000000000000000000000008152306004820152905160009283926001600160a01b03909116916370a0823191602480820192602092909190829003018186803b15801561403657600080fd5b505afa15801561404a573d6000803e3d6000fd5b505050506040513d602081101561406057600080fd5b50519050600061406e61537b565b90910391505090565b60315460ff1681565b6001600160a01b03811660009081526028602090815260408083208151808301909252805460ff8082168452859484019161010090041660028111156140c257fe5b60028111156140cd57fe5b90525090506000816020015160028111156140e457fe5b14156140f4576000915050610f0e565b60016005826000015160ff16601f811061410a57fe5b601091828204019190066002029054906101000a900461ffff1603915050919050565b600080808080333214614187576040805162461bcd60e51b815260206004820152601460248201527f4f6e6c792063616c6c61626c6520627920454f41000000000000000000000000604482015290519081900360640190fd5b5050602b5463ffffffff760100000000000000000000000000000000000000000000820481166000908152602c6020526040902054608083901b96700100000000000000000000000000000000909304600881901c909216955064ffffffffff9091169350601781900b92507801000000000000000000000000000000000000000000000000900467ffffffffffffffff1690565b6003546001600160a01b031690565b6000546001600160a01b0316331461428a576040805162461bcd60e51b815260206004820152601660248201527f4f6e6c792063616c6c61626c65206279206f776e657200000000000000000000604482015290519081900360640190fd5b60408051808201909152602e546001600160a01b038082168084527401000000000000000000000000000000000000000090920463ffffffff16602084015284161415806142e857508163ffffffff16816020015163ffffffff1614155b156143bb576040805180820182526001600160a01b0385811680835263ffffffff8681166020948501819052602e80547fffffffffffffffffffffffff00000000000000000000000000000000000000001684177fffffffffffffffff00000000ffffffffffffffffffffffffffffffffffffffff16740100000000000000000000000000000000000000008302179055865187860151875193168352948201528451919493909216927fb04e3a37abe9c0fcdfebdeae019a8e2b12ddf53f5d55ffb0caccc1bedaca1541928290030190a35b505050565b6001600160a01b0382811660009081526007602052604090205416331461442e576040805162461bcd60e51b815260206004820152601d60248201527f6f6e6c792063757272656e742070617965652063616e20757064617465000000604482015290519081900360640190fd5b336001600160a01b038216141561448c576040805162461bcd60e51b815260206004820152601760248201527f63616e6e6f74207472616e7366657220746f2073656c66000000000000000000604482015290519081900360640190fd5b6001600160a01b03808316600090815260086020526040902080548383167fffffffffffffffffffffffff0000000000000000000000000000000000000000821681179092559091169081146143bb576040516001600160a01b038084169133918616907f84f7c7c80bb8ed2279b4aab5f61cd05e6374073d38f46d7f32de8c30e9e3836790600090a4505050565b6000546001600160a01b0316331461457a576040805162461bcd60e51b815260206004820152601660248201527f4f6e6c792063616c6c61626c65206279206f776e657200000000000000000000604482015290519081900360640190fd5b600180547fffffffffffffffffffffffff0000000000000000000000000000000000000000166001600160a01b0383811691821790925560008054604051929316917fed8889f560326eb138920d842192f0eb3dd22b4f139c87a2c57538e05bae12789190a350565b6000546001600160a01b03163314614642576040805162461bcd60e51b815260206004820152601660248201527f4f6e6c792063616c6c61626c65206279206f776e657200000000000000000000604482015290519081900360640190fd5b61229081615907565b6000806000806000614694336000368080601f016020809104026020016040519081016040528093929190818152602001838380828437600092019190915250611df992505050565b6146e5576040805162461bcd60e51b815260206004820152600960248201527f4e6f206163636573730000000000000000000000000000000000000000000000604482015290519081900360640190fd5b6146ed615996565b945094509450945094509091929394565b6040805160a08101825260025463ffffffff80821683526401000000008204811660208401526801000000000000000082048116838501526c0100000000000000000000000082048116606084015270010000000000000000000000000000000090910416608082015260035482516103e081019384905291926001600160a01b0390911691600091600590601f908285855b82829054906101000a900461ffff1661ffff1681526020019060020190602082600101049283019260010382029150808411614791575050604080516103e0810191829052959650600095945060099350601f9250905082845b8154815260200190600101908083116147eb57505050505090506000602a80548060200260200160405190810160405280929190818152602001828054801561485d57602002820191906000526020600020905b81546001600160a01b0316815260019091019060200180831161483f575b5050505050905060005b8151811015614a9257600060018483601f811061488057fe5b6020020151039050600060018684601f811061489857fe5b60200201510361ffff169050600082896060015163ffffffff168302633b9aca00020190506000811115614a87576000600760008787815181106148d857fe5b60200260200101516001600160a01b03166001600160a01b0316815260200190815260200160002060009054906101000a90046001600160a01b03169050886001600160a01b031663a9059cbb82846040518363ffffffff1660e01b815260040180836001600160a01b0316815260200182815260200192505050602060405180830381600087803b15801561496d57600080fd5b505af1158015614981573d6000803e3d6000fd5b505050506040513d602081101561499757600080fd5b50516149ea576040805162461bcd60e51b815260206004820152601260248201527f696e73756666696369656e742066756e64730000000000000000000000000000604482015290519081900360640190fd5b60018886601f81106149f857fe5b61ffff909216602092909202015260018786601f8110614a1457fe5b602002018181525050886001600160a01b0316816001600160a01b0316878781518110614a3d57fe5b60200260200101516001600160a01b03167fd0b1dac935d85bd54cf0a33b0d41d39f8cf53a968465fc7ea2377526b8ac712c856040518082815260200191505060405180910390a4505b505050600101614867565b50614aa0600584601f615bc3565b50612d95600983601f615c59565b602b54760100000000000000000000000000000000000000000000900463ffffffff166000908152602c6020526040902054601790810b900b90565b6001600160a01b03811660009081526028602090815260408083208151808301909252805460ff80821684529293919291840191610100909104166002811115614b3057fe5b6002811115614b3b57fe5b90525090506000614b4b83610dc8565b905080156143bb576001600160a01b0380841660009081526007602090815260408083205460035482517fa9059cbb000000000000000000000000000000000000000000000000000000008152918616600483018190526024830188905292519295169363a9059cbb9360448084019491939192918390030190829087803b158015614bd657600080fd5b505af1158015614bea573d6000803e3d6000fd5b505050506040513d6020811015614c0057600080fd5b5051614c53576040805162461bcd60e51b815260206004820152601260248201527f696e73756666696369656e742066756e64730000000000000000000000000000604482015290519081900360640190fd5b60016005846000015160ff16601f8110614c6957fe5b601091828204019190066002026101000a81548161ffff021916908361ffff16021790555060016009846000015160ff16601f8110614ca457fe5b01556003546040805184815290516001600160a01b039283169284811692908816917fd0b1dac935d85bd54cf0a33b0d41d39f8cf53a968465fc7ea2377526b8ac712c9181900360200190a450505050565b60008a8a8a8a8a8a8a8a8a8a604051602001808b6001600160a01b031681526020018a67ffffffffffffffff16815260200180602001806020018760ff1681526020018667ffffffffffffffff1681526020018060200184810384528c8c82818152602001925060200280828437600083820152601f017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe01690910185810384528a8152602090810191508b908b0280828437600083820152601f017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe01690910185810383528681526020019050868680828437600081840152601f19601f8201169050808301925050509d50505050505050505050505050506040516020818303038152906040528051906020012090509a9950505050505050505050565b602b54760100000000000000000000000000000000000000000000900463ffffffff1690565b6001600160a01b03821660009081526032602052604081205460ff1680611e1857505060315460ff161592915050565b60308054604080516020601f60027fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff6101006001881615020190951694909404938401819004810282018101909252828152606093909290918301828280156120d55780601f10614f0b576101008083540402835291602001916120d5565b820191906000526020600020905b815481529060010190602001808311614f1957509395945050505050565b602b54760100000000000000000000000000000000000000000000900463ffffffff166000908152602c60205260409020547801000000000000000000000000000000000000000000000000900467ffffffffffffffff1690565b600080600080600063ffffffff8669ffffffffffffffffffff1611156040518060400160405280600f81526020017f4e6f20646174612070726573656e7400000000000000000000000000000000008152509061506d5760405162461bcd60e51b81526004018080602001828103825283818151815260200191508051906020019080838360005b8381101561503257818101518382015260200161501a565b50505050905090810190601f16801561505f5780820380516001836020036101000a031916815260200191505b509250505060405180910390fd5b5050505063ffffffff83166000908152602c6020908152604091829020825180840190935254601781810b810b810b808552780100000000000000000000000000000000000000000000000090920467ffffffffffffffff1693909201839052949594900b939092508291508490565b6001600160a01b03811660009081526032602052604090205460ff16612290576001600160a01b03811660008181526032602090815260409182902080547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00166001179055815192835290517f87286ad1f399c8e82bf0c4ef4fcdc570ea2e1e92176e5c848b6413545b885db49281900390910190a150565b600063ffffffff82111561518c57506000610f0e565b5063ffffffff166000908152602c6020526040902054601790810b900b90565b600063ffffffff8211156151c257506000610f0e565b5063ffffffff166000908152602c60205260409020547801000000000000000000000000000000000000000000000000900467ffffffffffffffff1690565b6040805160a0808201835263ffffffff88811680845288821660208086018290528984168688018190528985166060808901829052958a166080988901819052600280547fffffffffffffffffffffffffffffffffffffffffffffffffffffffff000000001687177fffffffffffffffffffffffffffffffffffffffffffffffff00000000ffffffff166401000000008702177fffffffffffffffffffffffffffffffffffffffff00000000ffffffffffffffff16680100000000000000008502177fffffffffffffffffffffffffffffffff00000000ffffffffffffffffffffffff166c010000000000000000000000008402177fffffffffffffffffffffffff00000000ffffffffffffffffffffffffffffffff16700100000000000000000000000000000000830217905589519586529285019390935283880152928201529283015291517fd0d9486a2c673e2a4b57fc82e4c8a556b3e2b82dd5db07e2c04a920ca0f469b6929181900390910190a15050505050565b604080516103e0810191829052600091829190600590601f908285855b82829054906101000a900461ffff1661ffff16815260200190600201906020826001010492830192600103820291508084116153985790505050505050905060005b601f8110156154085760018282601f81106153f157fe5b60200201510361ffff1692909201916001016153da565b506040805160a08101825260025463ffffffff8082168352640100000000820481166020808501919091526801000000000000000083048216848601526c0100000000000000000000000083048216606085018190527001000000000000000000000000000000009093049091166080840152602a805485518184028101840190965280865296909202633b9aca00029592936000939092918301828280156154da57602002820191906000526020600020905b81546001600160a01b031681526001909101906020018083116154bc575b5050604080516103e0810191829052949550600094935060099250601f915082845b8154815260200190600101908083116154fc575050505050905060005b82518110156155435760018282601f811061553057fe5b6020020151039590950194600101615519565b505050505090565b60008183101561555c575081611e1b565b50919050565b602083810286019082020160e4019695505050505050565b60408051808201909152602e546001600160a01b0381168083527401000000000000000000000000000000000000000090910463ffffffff1660208301526155c257506112d8565b7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff830163ffffffff8181166000818152602c602090815260408083205487518884015183517fbeed9b510000000000000000000000000000000000000000000000000000000081526004810197909752601792830b90920b602487018190528b88166044880152606487018b9052925192966001600160a01b039091169563beed9b51959290911693608480830194919391928390030190829088803b15801561568b57600080fd5b5087f1935050505080156156b157506040513d60208110156156ac57600080fd5b505160015b612d95576128a7565b3360009081526028602090815260408083208151808301909252805460ff808216845292939192918401916101009091041660028111156156f757fe5b600281111561570257fe5b9052506040805160a08101825260025463ffffffff80821683526401000000008204811660208401526801000000000000000082048116838501526c0100000000000000000000000082048116606084015270010000000000000000000000000000000090910416608082015281516103e0810192839052929350916157d291859190600590601f90826000855b82829054906101000a900461ffff1661ffff16815260200190600201906020826001010492830192600103820291508084116157905790505050505050615a1a565b6157e090600590601f615bc3565b506002826020015160028111156157f357fe5b14615845576040805162461bcd60e51b815260206004820181905260248201527f73656e7420627920756e64657369676e61746564207472616e736d6974746572604482015290519081900360640190fd5b600061586c633b9aca003a04836020015163ffffffff16846000015163ffffffff16615a8f565b90506010360260005a9050600061588b8863ffffffff16858585615ab5565b6fffffffffffffffffffffffffffffffff1690506000620f4240866040015163ffffffff168302816158b957fe5b049050856080015163ffffffff16633b9aca0002816009896000015160ff16601f81106158e257fe5b015401016009886000015160ff16601f81106158fa57fe5b0155505050505050505050565b6004546001600160a01b0390811690821681146112d857600480547fffffffffffffffffffffffff0000000000000000000000000000000000000000166001600160a01b03848116918217909255604080519284168352602083019190915280517f793cb73064f3c8cde7e187ae515511e6e56d1ee89bf08b82fa60fb70f8d489129281900390910190a15050565b602b54760100000000000000000000000000000000000000000000900463ffffffff166000818152602c6020908152604091829020825180840190935254601781810b810b810b808552780100000000000000000000000000000000000000000000000090920467ffffffffffffffff1693909201839052929392900b9181908490565b615a22615b8d565b60005b8351811015615a87576000848281518110615a3c57fe5b016020015160f81c9050615a618482601f8110615a5557fe5b60200201516001615b41565b848260ff16601f8110615a7057fe5b61ffff909216602092909202015250600101615a25565b509092915050565b60008383811015615aa257600285850304015b615aac818461554b565b95945050505050565b600081851015615b0c576040805162461bcd60e51b815260206004820181905260248201527f6761734c6566742063616e6e6f742065786365656420696e697469616c476173604482015290519081900360640190fd5b818503830161179301633b9aca00858202026fffffffffffffffffffffffffffffffff8110615b3757fe5b9695505050505050565b6000611e188261ffff168461ffff160161ffff61554b565b6040518060a00160405280615b6c615c87565b81526060602082018190526040820181905280820152600060809091015290565b604051806103e00160405280601f906020820280368337509192915050565b604080518082019091526000808252602082015290565b600283019183908215615c495791602002820160005b83821115615c1957835183826101000a81548161ffff021916908361ffff1602179055509260200192600201602081600101049283019260010302615bd9565b8015615c475782816101000a81549061ffff0219169055600201602081600101049283019260010302615c19565b505b50615c55929150615cae565b5090565b82601f8101928215615c49579160200282015b82811115615c49578251825591602001919060010190615c6c565b60408051608081018252600080825260208201819052918101829052606081019190915290565b5b80821115615c555760008155600101615caf56fe416363657373436f6e74726f6c6c65644f6666636861696e41676772656761746f7220332e302e306f7261636c6520616464726573736573206f7574206f6620726567697374726174696f6ea2646970667358221220757bff216f6d81152fcaa510caac9632619adc3b29bcb61ba73c0af8d453fb2864736f6c63430007060033", - "nonce": 1, - "storage": { - "0x000000000000000000000000000000000000000000000000000000000000002b": "0x000000000000000039e1030001743201f78c40af99036ec997d9c5c7d68b6fbf", - "0x46dbf7453d7b171ee2e0f1448d8b66cde8344e1b7fcf03ff341a75ac2be5e2b9": "0x000000006327dfb700000000000000000000000003eed3c5c4dd1b5d426c4280", - "0x88e4ebf3cadec4bfd3bd17505049e8d2bdcf038a585aa951e10cb3b7feb919dd": "0x0000000000000000000000000000000000000000000000000000000000000001" - } - }, - "0x136b1ec699c62b0606854056f02dc7bb80482d63": { - "balance": "0x0", - "code": "0x608060405234801561001057600080fd5b50600436106101425760003560e01c8063614d08f8116100b85780638d6e9a5b1161007c5780638d6e9a5b1461024a5780638da5cb5b1461025d578063a616cdfb14610265578063a6492fe214610278578063bb91f6a31461028b578063f97824fe1461029357610142565b8063614d08f814610215578063698a26b21461021d578063741853601461022557806379ba50971461022d578063899ffef41461023557610142565b80632af64bd31161010a5780632af64bd3146101b55780632e1a7d4d146101bd5780633872dda3146101d05780634873966f146101d857806353a47bb7146101eb5780635aba32ae1461020057610142565b806304f3bcec14610147578063100be6d4146101655780631627540c1461017a578063205c28781461018f57806325aae563146101a2575b600080fd5b61014f6102a6565b60405161015c91906128f5565b60405180910390f35b61016d6102b5565b60405161015c919061281f565b61018d610188366004611ec2565b6102be565b005b61018d61019d366004611f06565b61031c565b61018d6101b0366004612100565b610332565b61016d6103de565b61018d6101cb3660046120c4565b6104f6565b61018d61050b565b61018d6101e6366004612077565b610573565b6101f36107fe565b60405161015c9190612747565b61020861080d565b60405161015c919061282d565b610208610824565b61018d610840565b61018d6108a3565b61018d6109f5565b61023d610a91565b60405161015c919061280e565b61018d610258366004611f06565b610b0d565b6101f3610bc1565b61018d610273366004611f06565b610bd0565b61018d610286366004612077565b610c6e565b610208610d59565b61018d6102a1366004611f40565b610d6b565b6002546001600160a01b031681565b60045460ff1681565b6102c6610e96565b600180546001600160a01b0319166001600160a01b0383161790556040517f906a1c6bd7e3091ea86693dd029a831c19049ce77f1dce2ce0bab1cacbabce2290610311908390612747565b60405180910390a150565b610324610ec2565b61032e8282610ee4565b5050565b61033a611105565b6103426111e1565b6001600160a01b03166373941b9683836040518363ffffffff1660e01b815260040161036f9291906128ac565b600060405180830381600087803b15801561038957600080fd5b505af115801561039d573d6000803e3d6000fd5b505050507f64691ff866d6248d6d89e8c1b6c92df685ddf8224377dc6f1e928ef732e55ace82826040516103d29291906128ac565b60405180910390a15050565b600060606103ea610a91565b905060005b81518110156104ec57600082828151811061040657fe5b602090810291909101810151600081815260039092526040918290205460025492516321f8a72160e01b81529193506001600160a01b039081169216906321f8a7219061045790859060040161282d565b60206040518083038186803b15801561046f57600080fd5b505afa158015610483573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052506104a79190810190611ee8565b6001600160a01b03161415806104d257506000818152600360205260409020546001600160a01b0316155b156104e357600093505050506104f3565b506001016103ef565b5060019150505b90565b6104fe610ec2565b6105083382610ee4565b50565b610513610e96565b60045460ff1661053e5760405162461bcd60e51b815260040161053590612944565b60405180910390fd5b6004805460ff191690556040517f43e00f2c8f8651a29db34d34fb689573423f8aaae8f9d32e3e871b4c35c6254690600090a1565b61057b610ec2565b6001600160a01b0382166105a15760405162461bcd60e51b815260040161053590612974565b60006105ac846111f6565b116105c95760405162461bcd60e51b8152600401610535906129a4565b6105d16112de565b6001600160a01b03166342a28e21846040518263ffffffff1660e01b81526004016105fc919061282d565b60006040518083038186803b15801561061457600080fd5b505afa158015610628573d6000803e3d6000fd5b5050505061063e6314d95b9d60e21b84836112f8565b600061064861144d565b6001600160a01b031663c81ff8fa8533856040518463ffffffff1660e01b815260040161067793929190612849565b602060405180830381600087803b15801561069157600080fd5b505af11580156106a5573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052506106c99190810190612059565b905080156106e95760405162461bcd60e51b8152600401610535906129d4565b606063a6492fe260e01b85858560405160240161070893929190612871565b60408051601f198184030181529190526020810180516001600160e01b03166001600160e01b0319909316929092179091529050610744611461565b6001600160a01b0316633dbb202b61075a61147c565b836107656003611486565b6040518463ffffffff1660e01b815260040161078393929190612799565b600060405180830381600087803b15801561079d57600080fd5b505af11580156107b1573d6000803e3d6000fd5b50505050836001600160a01b0316857f8437572793cb04c0a02524a185d39f9b72a4284bd2e69151b0ca0cf254b2cb0b856040516107ef919061282d565b60405180910390a35050505050565b6001546001600160a01b031681565b600061081f6314d95b9d60e21b6114d6565b905090565b7453796e746865746978427269646765546f4261736560581b90565b610848610e96565b60045460ff161561086b5760405162461bcd60e51b815260040161053590612914565b6004805460ff191660011790556040517f7c88488c18e2ff121a34a4a2a44990557a5b76ab1ceb6bd95ebe7d419c7575f490600090a1565b60606108ad610a91565b905060005b815181101561032e5760008282815181106108c957fe5b602002602001015190506000600260009054906101000a90046001600160a01b03166001600160a01b031663dacb2d01838460405160200161090b919061273c565b6040516020818303038152906040526040518363ffffffff1660e01b81526004016109379291906128d5565b60206040518083038186803b15801561094f57600080fd5b505afa158015610963573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052506109879190810190611ee8565b6000838152600360205260409081902080546001600160a01b0319166001600160a01b038416179055519091507f88a93678a3692f6789d9546fc621bf7234b101ddb7d4fe479455112831b8aa68906109e3908490849061283b565b60405180910390a150506001016108b2565b6001546001600160a01b03163314610a1f5760405162461bcd60e51b815260040161053590612924565b6000546001546040517fb532073b38c83145e3e5135377a08bf9aab55bc0fd7c1179cd4fb995d2a5159c92610a62926001600160a01b039182169291169061277e565b60405180910390a160018054600080546001600160a01b03199081166001600160a01b03841617909155169055565b606080610a9c6117ad565b60408051600180825281830190925291925060609190602080830190803883390190505090507f626173653a53796e746865746978427269646765546f4f7074696d69736d000081600081518110610af057fe5b602002602001018181525050610b068282611916565b9250505090565b610b15611105565b610b1d6119d2565b6001600160a01b031663666ed4f183836040518363ffffffff1660e01b8152600401610b4a9291906127c8565b600060405180830381600087803b158015610b6457600080fd5b505af1158015610b78573d6000803e3d6000fd5b50505050816001600160a01b03167f162eb12ad2bd8b6ca7960f162208414ab3bc2da9f37953788ffd8cf850c3492b82604051610bb5919061282d565b60405180910390a25050565b6000546001600160a01b031681565b610bd8611105565b610be06119d2565b6001600160a01b031663d8a1f76f826040518263ffffffff1660e01b8152600401610c0b919061282d565b600060405180830381600087803b158015610c2557600080fd5b505af1158015610c39573d6000803e3d6000fd5b505050507f3b30e867826d81d6591924b1675cfdcac994f0199eed66250d8c834b3b0ed21682826040516103d29291906127c8565b610c76611105565b610c88632932b1bb60e11b84836112f8565b610c9061144d565b6001600160a01b031663890235d48484846040518463ffffffff1660e01b8152600401610cbf93929190612871565b602060405180830381600087803b158015610cd957600080fd5b505af1158015610ced573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250610d119190810190612059565b50816001600160a01b0316837f81b100a611d2b249e23d093c64f09470928821e123a7cff2a033eb24c85b797983604051610d4c919061282d565b60405180910390a3505050565b600061081f632932b1bb60e11b6114d6565b610d73611105565b6000610d7d6119e9565b9050610d876119d2565b6001600160a01b031663666ed4f182866040518363ffffffff1660e01b8152600401610db49291906127c8565b600060405180830381600087803b158015610dce57600080fd5b505af1158015610de2573d6000803e3d6000fd5b505060405163cd7b43dd60e01b81526001600160a01b038416925063cd7b43dd9150610e189088908890889088906004016127d6565b600060405180830381600087803b158015610e3257600080fd5b505af1158015610e46573d6000803e3d6000fd5b50505050846001600160a01b03167f7538b9bce825b4555048bb2f80c04ee79b5ffc422f39b959994a27c21c32c8d1858585604051610e8793929190612a04565b60405180910390a25050505050565b6000546001600160a01b03163314610ec05760405162461bcd60e51b815260040161053590612984565b565b60045460ff16610ec05760405162461bcd60e51b815260040161053590612954565b80610eed6119d2565b6001600160a01b0316636ac0bf9c336040518263ffffffff1660e01b8152600401610f189190612755565b60206040518083038186803b158015610f3057600080fd5b505afa158015610f44573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250610f6891908101906120e2565b1015610f865760405162461bcd60e51b8152600401610535906129f4565b610f8e6119d2565b6001600160a01b031663edef719a33836040518363ffffffff1660e01b8152600401610fbb929190612763565b600060405180830381600087803b158015610fd557600080fd5b505af1158015610fe9573d6000803e3d6000fd5b50506040516000925060609150637a7bda0d60e11b9061100f90869086906024016127c8565b60408051601f198184030181529190526020810180516001600160e01b03166001600160e01b031990931692909217909152905061104b611461565b6001600160a01b0316633dbb202b611061611a05565b8361106c6003611486565b6040518463ffffffff1660e01b815260040161108a93929190612799565b600060405180830381600087803b1580156110a457600080fd5b505af11580156110b8573d6000803e3d6000fd5b50505050336001600160a01b03167fbb2689ff876f7ef453cf8865dde5ab10349d222e2e1383c5152fbdb083f02da285856040516110f79291906127c8565b60405180910390a250505050565b600061110f611461565b9050336001600160a01b038216146111395760405162461bcd60e51b8152600401610535906129b4565b61114161147c565b6001600160a01b0316816001600160a01b0316636e296e456040518163ffffffff1660e01b815260040160206040518083038186803b15801561118357600080fd5b505afa158015611197573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052506111bb9190810190611ee8565b6001600160a01b0316146105085760405162461bcd60e51b8152600401610535906129c4565b600061081f66119959541bdbdb60ca1b611a2c565b6000611200611a89565b6001600160a01b03166323257c2b6d53797374656d53657474696e677360901b7f63726f7373436861696e53796e74685472616e73666572456e61626c65640000856040516020016112539291906126bf565b604051602081830303815290604052805190602001206040518363ffffffff1660e01b81526004016112869291906128ac565b60206040518083038186803b15801561129e57600080fd5b505afa1580156112b2573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052506112d691908101906120e2565b90505b919050565b600061081f6b53797374656d53746174757360a01b611a2c565b60006c29bcb73a342a3930b739b332b960991b848460405160200161131f939291906126e5565b6040516020818303038152906040528051906020012090506000611341611a89565b6001600160a01b03166323257c2b611357610824565b846040518363ffffffff1660e01b81526004016113759291906128ac565b60206040518083038186803b15801561138d57600080fd5b505afa1580156113a1573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052506113c591908101906120e2565b90506113cf611a89565b6001600160a01b0316631d5b277f6113e5610824565b846113f6858863ffffffff611aa616565b6040518463ffffffff1660e01b8152600401611414939291906128ba565b600060405180830381600087803b15801561142e57600080fd5b505af1158015611442573d6000803e3d6000fd5b505050505050505050565b600061081f6524b9b9bab2b960d11b611a2c565b600061081f6c32bc3a1d26b2b9b9b2b733b2b960991b611a2c565b600061081f611a05565b6000611490611a89565b6001600160a01b03166323257c2b6d53797374656d53657474696e677360901b6114b985611ad4565b6040518363ffffffff1660e01b81526004016112869291906128ac565b600060606114e261144d565b6001600160a01b03166372cb051f6040518163ffffffff1660e01b815260040160006040518083038186803b15801561151a57600080fd5b505afa15801561152e573d6000803e3d6000fd5b505050506040513d6000823e601f3d908101601f191682016040526115569190810190611fa8565b905060606000611564611c4f565b6001600160a01b031663c8e5bbd5846040518263ffffffff1660e01b815260040161158f919061280e565b60006040518083038186803b1580156115a757600080fd5b505afa1580156115bb573d6000803e3d6000fd5b505050506040513d6000823e601f3d908101601f191682016040526115e39190810190612012565b9150915080156116055760405162461bcd60e51b815260040161053590612964565b60608351604051908082528060200260200182016040528015611632578160200160208202803883390190505b50905060005b84518110156116ae576c29bcb73a342a3930b739b332b960991b8786838151811061165f57fe5b6020026020010151604051602001611679939291906126e5565b6040516020818303038152906040528051906020012082828151811061169b57fe5b6020908102919091010152600101611638565b5060606116b9611a89565b6001600160a01b031663b67fa7ed6116cf610824565b846040518363ffffffff1660e01b81526004016116ed92919061288c565b60006040518083038186803b15801561170557600080fd5b505afa158015611719573d6000803e3d6000fd5b505050506040513d6000823e601f3d908101601f191682016040526117419190810190611fdd565b905060005b85518110156117a25761179861178b86838151811061176157fe5b602002602001015184848151811061177557fe5b6020026020010151611c6a90919063ffffffff16565b889063ffffffff611aa616565b9650600101611746565b505050505050919050565b6060806117b8611c7f565b60408051600880825261012082019092529192506060919060208201610100803883390190505090506c32bc3a1d26b2b9b9b2b733b2b960991b816000815181106117ff57fe5b602002602001018181525050680a6f2dce8d0cae8d2f60bb1b8160018151811061182557fe5b6020026020010181815250506d2932bbb0b93222b9b1b937bbab1960911b8160028151811061185057fe5b6020026020010181815250506524b9b9bab2b960d11b8160038151811061187357fe5b60200260200101818152505066119959541bdbdb60ca1b8160048151811061189757fe5b6020026020010181815250506e466c657869626c6553746f7261676560881b816005815181106118c357fe5b6020026020010181815250506c45786368616e6765526174657360981b816006815181106118ed57fe5b6020026020010181815250506b53797374656d53746174757360a01b81600781518110610af057fe5b60608151835101604051908082528060200260200182016040528015611946578160200160208202803883390190505b50905060005b83518110156119885783818151811061196157fe5b602002602001015182828151811061197557fe5b602090810291909101015260010161194c565b5060005b82518110156119cb578281815181106119a157fe5b60200260200101518282865101815181106119b857fe5b602090810291909101015260010161198c565b5092915050565b600061081f680a6f2dce8d0cae8d2f60bb1b611a2c565b600061081f6d2932bbb0b93222b9b1b937bbab1960911b611a2c565b600061081f7f626173653a53796e746865746978427269646765546f4f7074696d69736d00005b60008181526003602090815260408083205490516001600160a01b039091169182151591611a5c9186910161271c565b604051602081830303815290604052906119cb5760405162461bcd60e51b81526004016105359190612903565b600061081f6e466c657869626c6553746f7261676560881b611a2c565b600082820183811015611acb5760405162461bcd60e51b815260040161053590612934565b90505b92915050565b600080826005811115611ae357fe5b1415611b1057507f63726f7373446f6d61696e4465706f7369744761734c696d69740000000000006112d9565b6001826005811115611b1e57fe5b1415611b4b57507f63726f7373446f6d61696e457363726f774761734c696d6974000000000000006112d9565b6002826005811115611b5957fe5b1415611b8657507f63726f7373446f6d61696e5265776172644761734c696d6974000000000000006112d9565b6003826005811115611b9457fe5b1415611bc157507f63726f7373446f6d61696e5769746864726177616c4761734c696d69740000006112d9565b6005826005811115611bcf57fe5b1415611bfc57507f63726f7373446f6d61696e52656c61794761734c696d697400000000000000006112d9565b6004826005811115611c0a57fe5b1415611c3757507f63726f7373446f6d61696e436c6f73654761734c696d697400000000000000006112d9565b60405162461bcd60e51b8152600401610535906129e4565b600061081f6c45786368616e6765526174657360981b611a2c565b6000611acb8383670de0b6b3a7640000611cd0565b604080516001808252818301909252606091602080830190803883390190505090506e466c657869626c6553746f7261676560881b81600081518110611cc157fe5b60200260200101818152505090565b600080600a8304611ce7868663ffffffff611d0e16565b81611cee57fe5b0490506005600a820610611d0057600a015b600a900490505b9392505050565b600082611d1d57506000611ace565b82820282848281611d2a57fe5b0414611acb5760405162461bcd60e51b815260040161053590612994565b8035611ace81612b2b565b8051611ace81612b2b565b600082601f830112611d6f57600080fd5b8151611d82611d7d82612a55565b612a2e565b91508181835260208401935060208101905083856020840282011115611da757600080fd5b60005b83811015611dd35781611dbd8882611eac565b8452506020928301929190910190600101611daa565b5050505092915050565b60008083601f840112611def57600080fd5b50813567ffffffffffffffff811115611e0757600080fd5b602083019150836040820283011115611e1f57600080fd5b9250929050565b600082601f830112611e3757600080fd5b8151611e45611d7d82612a55565b91508181835260208401935060208101905083856020840282011115611e6a57600080fd5b60005b83811015611dd35781611e808882611eac565b8452506020928301929190910190600101611e6d565b8051611ace81612b3f565b8035611ace81612b48565b8051611ace81612b48565b8035611ace81612b51565b600060208284031215611ed457600080fd5b6000611ee08484611d48565b949350505050565b600060208284031215611efa57600080fd5b6000611ee08484611d53565b60008060408385031215611f1957600080fd5b6000611f258585611d48565b9250506020611f3685828601611ea1565b9150509250929050565b60008060008060608587031215611f5657600080fd5b6000611f628787611d48565b9450506020611f7387828801611ea1565b935050604085013567ffffffffffffffff811115611f9057600080fd5b611f9c87828801611ddd565b95989497509550505050565b600060208284031215611fba57600080fd5b815167ffffffffffffffff811115611fd157600080fd5b611ee084828501611d5e565b600060208284031215611fef57600080fd5b815167ffffffffffffffff81111561200657600080fd5b611ee084828501611e26565b6000806040838503121561202557600080fd5b825167ffffffffffffffff81111561203c57600080fd5b61204885828601611e26565b9250506020611f3685828601611e96565b60006020828403121561206b57600080fd5b6000611ee08484611e96565b60008060006060848603121561208c57600080fd5b60006120988686611ea1565b93505060206120a986828701611d48565b92505060406120ba86828701611ea1565b9150509250925092565b6000602082840312156120d657600080fd5b6000611ee08484611ea1565b6000602082840312156120f457600080fd5b6000611ee08484611eac565b6000806040838503121561211357600080fd5b6000611f258585611ea1565b600061212b838361220e565b505060200190565b600061213f8383612674565b505060400190565b61215081612ae3565b82525050565b61215081612ab1565b600061216a82612a7c565b6121748185612a86565b935061217f83612a76565b8060005b838110156121ad578151612197888261211f565b97506121a283612a76565b925050600101612183565b509495945050505050565b60006121c48385612a86565b93506121cf826104f3565b8060005b858110156121ad576121e58284612a8f565b6121ef8882612133565b97506121fa83612a80565b9250506001016121d3565b61215081612abc565b612150816104f3565b612150612223826104f3565b6104f3565b600061223382612a7c565b61223d8185612a86565b935061224d818560208601612af5565b61225681612b21565b9093019392505050565b61215081612aea565b6000612276601883612a86565b7f496e6974696174696f6e206e6f742073757370656e6465640000000000000000815260200192915050565b60006122af603583612a86565b7f596f75206d757374206265206e6f6d696e61746564206265666f726520796f7581527402063616e20616363657074206f776e65727368697605c1b602082015260400192915050565b6000612306601b83612a86565b7f536166654d6174683a206164646974696f6e206f766572666c6f770000000000815260200192915050565b600061233f601483612a86565b73125b9a5d1a585d1a5bdb881cdd5cdc195b99195960621b815260200192915050565b600061236f6011836112d9565b70026b4b9b9b4b7339030b2323932b9b99d1607d1b815260110192915050565b600061239c601683612a86565b75125b9a5d1a585d1a5bdb8819195858dd1a5d985d195960521b815260200192915050565b60006123ce601183612a86565b7014985d195cc8185c99481a5b9d985b1a59607a1b815260200192915050565b60006123fb601b83612a86565b7f43616e6e6f742073656e6420746f207a65726f20616464726573730000000000815260200192915050565b6000612434602f83612a86565b7f4f6e6c792074686520636f6e7472616374206f776e6572206d6179207065726681526e37b936903a3434b99030b1ba34b7b760891b602082015260400192915050565b6000612485602183612a86565b7f536166654d6174683a206d756c7469706c69636174696f6e206f766572666c6f8152607760f81b602082015260400192915050565b60006124c8602a83612a86565b7f53796e7468206e6f7420656e61626c656420666f722063726f7373206368616981526937103a3930b739b332b960b11b602082015260400192915050565b6000612514601e83612a86565b7f4f6e6c79207468652072656c617965722063616e2063616c6c20746869730000815260200192915050565b600061254d6019836112d9565b7f5265736f6c766572206d697373696e67207461726765743a2000000000000000815260190192915050565b6000612586602483612a86565b7f4f6e6c79206120636f756e74657270617274206272696467652063616e20696e815263766f6b6560e01b602082015260400192915050565b60006125cc602883612a86565b7f43616e6e6f7420696e6974696174652069662073796e74682072617465206973815267081a5b9d985b1a5960c21b602082015260400192915050565b6000612616601683612a86565b75556e6b6e6f776e20676173206c696d6974207479706560501b815260200192915050565b6000612648601b83612a86565b7f4e6f7420656e6f756768207472616e7366657261626c6520534e580000000000815260200192915050565b604082016126828280612aa2565b61268c84826126b6565b5061269a6020830183612a93565b6126a7602085018261220e565b50505050565b61215081612acd565b61215081612ad6565b60006126cb8285612217565b6020820191506126db8284612217565b5060200192915050565b60006126f18286612217565b6020820191506127018285612217565b6020820191506127118284612217565b506020019392505050565b600061272782612362565b91506127338284612217565b50602001919050565b600061272782612540565b60208101611ace8284612156565b60208101611ace8284612147565b604081016127718285612147565b611d07602083018461220e565b6040810161278c8285612156565b611d076020830184612156565b606081016127a78286612156565b81810360208301526127b98185612228565b9050611ee060408301846126ad565b604081016127718285612156565b606081016127e48287612156565b6127f1602083018661220e565b81810360408301526128048184866121b8565b9695505050505050565b60208082528101611acb818461215f565b60208101611ace8284612205565b60208101611ace828461220e565b6040810161278c828561220e565b60608101612857828661220e565b6128646020830185612147565b611ee0604083018461220e565b6060810161287f828661220e565b6128646020830185612156565b6040810161289a828561220e565b8181036020830152611ee0818461215f565b60408101612771828561220e565b606081016128c8828661220e565b612864602083018561220e565b604081016128e3828561220e565b8181036020830152611ee08184612228565b60208101611ace8284612260565b60208082528101611acb8184612228565b602080825281016112d681612269565b602080825281016112d6816122a2565b602080825281016112d6816122f9565b602080825281016112d681612332565b602080825281016112d68161238f565b602080825281016112d6816123c1565b602080825281016112d6816123ee565b602080825281016112d681612427565b602080825281016112d681612478565b602080825281016112d6816124bb565b602080825281016112d681612507565b602080825281016112d681612579565b602080825281016112d6816125bf565b602080825281016112d681612609565b602080825281016112d68161263b565b60408101612a12828661220e565b8181036020830152612a258184866121b8565b95945050505050565b60405181810167ffffffffffffffff81118282101715612a4d57600080fd5b604052919050565b600067ffffffffffffffff821115612a6c57600080fd5b5060209081020190565b60200190565b5190565b60400190565b90815260200190565b5090565b6000611acb6020840184611ea1565b6000611acb6020840184611eb7565b60006112d682612ac1565b151590565b6001600160a01b031690565b63ffffffff1690565b67ffffffffffffffff1690565b60006112d6825b60006112d682612ab1565b60005b83811015612b10578181015183820152602001612af8565b838111156126a75750506000910152565b601f01601f191690565b612b3481612ab1565b811461050857600080fd5b612b3481612abc565b612b34816104f3565b612b3481612ad656fea365627a7a72315820f2bf16b9091e75361a5e3dadf7290baf59d8ae988954679a538c3f78e5d389126c6578706572696d656e74616cf564736f6c63430005100040", - "nonce": 1, - "storage": { - "0x0000000000000000000000000000000000000000000000000000000000000004": "0x0000000000000000000000000000000000000000000000000000000000000001", - "0x0563a8a19823933e751ef690567f0351d13ee18500841743a77290b3deeac37d": "0x00000000000000000000000047649022380d182da8010ae5d257fea4227b21ff", - "0xa26e8efac5036060b6f13405335c46a4dbdbf07c8df1402212c6760b6f43b85f": "0x00000000000000000000000039ea01a0298c315d149a490e34b59dbf2ec7e48f", - "0xe7b1c2e3c885282fdf899b6c2ae3315dea19846af9f98331f4f9ed02f79179b7": "0x0000000000000000000000004200000000000000000000000000000000000007", - "0xef1fda38994bec7640de7e59be9a362a1867825f866afa6d2d780ea42a353ec0": "0x000000000000000000000000fe8e48bf36ccc3254081ec8c65965d1c8b2e744d" - } - }, - "0x22f04bc4162d63730dcde051fdfd97b4f55ff63b": { - "balance": "0x0", - "code": "0x608060405234801561001057600080fd5b506004361061030a5760003560e01c80638e0566de1161019c578063c1075329116100ee578063e76d516811610097578063f2fde38b11610071578063f2fde38b14610cb6578063fbffd2c114610cdc578063feaf968c14610d025761030a565b8063e76d516814610c4e578063eb45716314610c56578063eb5dcd6c14610c885761030a565b8063dc7f0124116100c8578063dc7f012414610b9f578063e4902f8214610ba7578063e5fe457714610be45761030a565b8063c107532914610a57578063c980753914610a83578063d09dc33914610b975761030a565b80639e3ceeab11610150578063b5ab58dc1161012a578063b5ab58dc146109d8578063b633620c146109f5578063bd82470614610a125761030a565b80639e3ceeab14610966578063a118f2491461098c578063b121e147146109b25761030a565b8063996e829811610181578063996e8298146108295780639a6fc8f5146108315780639c849b30146108a45761030a565b80638e0566de146107d257806398e5b12a146108025761030a565b80636b14daf81161026057806381411834116102095780638823da6c116101e35780638823da6c1461077e5780638ac28d5a146107a45780638da5cb5b146107ca5761030a565b806381411834146106cd57806381ff7048146107255780638205bf6a146107765761030a565b80637284e4161161023a5780637284e416146106b557806379ba5097146106bd5780638038e4a1146106c55761030a565b80636b14daf8146105bf57806370da2f671461068957806370efdf2d146106915761030a565b8063313ce567116102c257806354fd4d501161029c57806354fd4d5014610482578063585aa7de1461048a578063668a0f02146105b75761030a565b8063313ce5671461042e5780634fb174701461044c57806350d25bcd1461047a5761030a565b8063181f5a77116102f3578063181f5a771461035157806322adbc78146103ce57806329937268146103ed5761030a565b80630a7569831461030f5780630eafb25b14610319575b600080fd5b610317610d0a565b005b61033f6004803603602081101561032f57600080fd5b50356001600160a01b0316610dc8565b60408051918252519081900360200190f35b610359610f13565b6040805160208082528351818301528351919283929083019185019080838360005b8381101561039357818101518382015260200161037b565b50505050905090810190601f1680156103c05780820380516001836020036101000a031916815260200191505b509250505060405180910390f35b6103d6610f33565b6040805160179290920b8252519081900360200190f35b6103f5610f57565b6040805163ffffffff96871681529486166020860152928516848401529084166060840152909216608082015290519081900360a00190f35b610436610fd4565b6040805160ff9092168252519081900360200190f35b6103176004803603604081101561046257600080fd5b506001600160a01b0381358116916020013516610ff8565b61033f6112dc565b61033f61137d565b610317600480360360a08110156104a057600080fd5b8101906020810181356401000000008111156104bb57600080fd5b8201836020820111156104cd57600080fd5b803590602001918460208302840111640100000000831117156104ef57600080fd5b91939092909160208101903564010000000081111561050d57600080fd5b82018360208201111561051f57600080fd5b8035906020019184602083028401116401000000008311171561054157600080fd5b9193909260ff8335169267ffffffffffffffff60208201351692919060608101906040013564010000000081111561057857600080fd5b82018360208201111561058a57600080fd5b803590602001918460018302840111640100000000831117156105ac57600080fd5b509092509050611382565b61033f611d5d565b610675600480360360408110156105d557600080fd5b6001600160a01b03823516919081019060408101602082013564010000000081111561060057600080fd5b82018360208201111561061257600080fd5b8035906020019184600183028401116401000000008311171561063457600080fd5b91908080601f016020809104026020016040519081016040528093929190818152602001838380828437600092019190915250929550611df9945050505050565b604080519115158252519081900360200190f35b6103d6611e21565b610699611e45565b604080516001600160a01b039092168252519081900360200190f35b610359611e54565b610317611ef0565b610317611fbe565b6106d561207d565b60408051602080825283518183015283519192839290830191858101910280838360005b838110156107115781810151838201526020016106f9565b505050509050019250505060405180910390f35b61072d6120df565b6040805163ffffffff94851681529290931660208301527fffffffffffffffffffffffffffffffff00000000000000000000000000000000168183015290519081900360600190f35b61033f612100565b6103176004803603602081101561079457600080fd5b50356001600160a01b031661219c565b610317600480360360208110156107ba57600080fd5b50356001600160a01b0316612293565b61069961230a565b6107da612319565b604080516001600160a01b03909316835263ffffffff90911660208301528051918290030190f35b61080a61235d565b6040805169ffffffffffffffffffff9092168252519081900360200190f35b6106996125b1565b61085a6004803603602081101561084757600080fd5b503569ffffffffffffffffffff166125c0565b604051808669ffffffffffffffffffff1681526020018581526020018481526020018381526020018269ffffffffffffffffffff1681526020019550505050505060405180910390f35b610317600480360360408110156108ba57600080fd5b8101906020810181356401000000008111156108d557600080fd5b8201836020820111156108e757600080fd5b8035906020019184602083028401116401000000008311171561090957600080fd5b91939092909160208101903564010000000081111561092757600080fd5b82018360208201111561093957600080fd5b8035906020019184602083028401116401000000008311171561095b57600080fd5b509092509050612675565b6103176004803603602081101561097c57600080fd5b50356001600160a01b03166128ae565b610317600480360360208110156109a257600080fd5b50356001600160a01b031661299c565b610317600480360360208110156109c857600080fd5b50356001600160a01b0316612a04565b61033f600480360360208110156109ee57600080fd5b5035612afd565b61033f60048036036020811015610a0b57600080fd5b5035612b9a565b610317600480360360a0811015610a2857600080fd5b5063ffffffff813581169160208101358216916040820135811691606081013582169160809091013516612c37565b61031760048036036040811015610a6d57600080fd5b506001600160a01b038135169060200135612d9d565b61031760048036036080811015610a9957600080fd5b810190602081018135640100000000811115610ab457600080fd5b820183602082011115610ac657600080fd5b80359060200191846001830284011164010000000083111715610ae857600080fd5b919390929091602081019035640100000000811115610b0657600080fd5b820183602082011115610b1857600080fd5b80359060200191846020830284011164010000000083111715610b3a57600080fd5b919390929091602081019035640100000000811115610b5857600080fd5b820183602082011115610b6a57600080fd5b80359060200191846020830284011164010000000083111715610b8c57600080fd5b9193509150356130c4565b61033f613fcd565b610675614077565b610bcd60048036036020811015610bbd57600080fd5b50356001600160a01b0316614080565b6040805161ffff9092168252519081900360200190f35b610bec61412d565b604080517fffffffffffffffffffffffffffffffff00000000000000000000000000000000909616865263ffffffff909416602086015260ff9092168484015260170b606084015267ffffffffffffffff166080830152519081900360a00190f35b61069961421c565b61031760048036036040811015610c6c57600080fd5b5080356001600160a01b0316906020013563ffffffff1661422b565b61031760048036036040811015610c9e57600080fd5b506001600160a01b03813581169160200135166143c0565b61031760048036036020811015610ccc57600080fd5b50356001600160a01b031661451b565b61031760048036036020811015610cf257600080fd5b50356001600160a01b03166145e3565b61085a61464b565b6000546001600160a01b03163314610d69576040805162461bcd60e51b815260206004820152601660248201527f4f6e6c792063616c6c61626c65206279206f776e657200000000000000000000604482015290519081900360640190fd5b60315460ff1615610dc657603180547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff001690556040517f3be8a977a014527b50ae38adda80b56911c267328965c98ddc385d248f53963890600090a15b565b6001600160a01b03811660009081526028602090815260408083208151808301909252805460ff808216845285948401916101009004166002811115610e0a57fe5b6002811115610e1557fe5b9052509050600081602001516002811115610e2c57fe5b1415610e3c576000915050610f0e565b6040805160a08101825260025463ffffffff80821683526401000000008204811660208401526801000000000000000082048116938301939093526c01000000000000000000000000810483166060830181905270010000000000000000000000000000000090910490921660808201528251909160009160019060059060ff16601f8110610ec757fe5b601091828204019190066002029054906101000a900461ffff160361ffff1602633b9aca0002905060016009846000015160ff16601f8110610f0557fe5b01540301925050505b919050565b6060604051806060016040528060288152602001615cc460289139905090565b7f00000000000000000000000000000000000000000000d3c21bcecceda100000081565b6040805160a08101825260025463ffffffff808216808452640100000000830482166020850181905268010000000000000000840483169585018690526c01000000000000000000000000840483166060860181905270010000000000000000000000000000000090940490921660809094018490529490939290565b7f000000000000000000000000000000000000000000000000000000000000001281565b6000546001600160a01b03163314611057576040805162461bcd60e51b815260206004820152601660248201527f4f6e6c792063616c6c61626c65206279206f776e657200000000000000000000604482015290519081900360640190fd5b6003546001600160a01b0390811690831681141561107557506112d8565b604080517f70a0823100000000000000000000000000000000000000000000000000000000815230600482015290516001600160a01b038516916370a08231916024808301926020929190829003018186803b1580156110d457600080fd5b505afa1580156110e8573d6000803e3d6000fd5b505050506040513d60208110156110fe57600080fd5b5061110990506146fe565b6000816001600160a01b03166370a08231306040518263ffffffff1660e01b815260040180826001600160a01b0316815260200191505060206040518083038186803b15801561115857600080fd5b505afa15801561116c573d6000803e3d6000fd5b505050506040513d602081101561118257600080fd5b5051604080517fa9059cbb0000000000000000000000000000000000000000000000000000000081526001600160a01b0386811660048301526024820184905291519293509084169163a9059cbb916044808201926020929091908290030181600087803b1580156111f357600080fd5b505af1158015611207573d6000803e3d6000fd5b505050506040513d602081101561121d57600080fd5b5051611270576040805162461bcd60e51b815260206004820152601f60248201527f7472616e736665722072656d61696e696e672066756e6473206661696c656400604482015290519081900360640190fd5b600380547fffffffffffffffffffffffff0000000000000000000000000000000000000000166001600160a01b0386811691821790925560405190918416907f4966a50c93f855342ccf6c5c0d358b85b91335b2acedc7da0932f691f351711a90600090a350505b5050565b600061131f336000368080601f016020809104026020016040519081016040528093929190818152602001838380828437600092019190915250611df992505050565b611370576040805162461bcd60e51b815260206004820152600960248201527f4e6f206163636573730000000000000000000000000000000000000000000000604482015290519081900360640190fd5b611378614aae565b905090565b600481565b868560ff8616601f8311156113de576040805162461bcd60e51b815260206004820152601060248201527f746f6f206d616e79207369676e65727300000000000000000000000000000000604482015290519081900360640190fd5b60008111611433576040805162461bcd60e51b815260206004820152601a60248201527f7468726573686f6c64206d75737420626520706f736974697665000000000000604482015290519081900360640190fd5b8183146114715760405162461bcd60e51b8152600401808060200182810382526024815260200180615cec6024913960400191505060405180910390fd5b8060030283116114c8576040805162461bcd60e51b815260206004820181905260248201527f6661756c74792d6f7261636c65207468726573686f6c6420746f6f2068696768604482015290519081900360640190fd5b6000546001600160a01b03163314611527576040805162461bcd60e51b815260206004820152601660248201527f4f6e6c792063616c6c61626c65206279206f776e657200000000000000000000604482015290519081900360640190fd5b602954156116cb57602980547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff8101916000918390811061156457fe5b6000918252602082200154602a80546001600160a01b039092169350908490811061158b57fe5b6000918252602090912001546001600160a01b031690506115ab81614aea565b6001600160a01b0380831660009081526028602052604080822080547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00009081169091559284168252902080549091169055602980548061160757fe5b60008281526020902081017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff90810180547fffffffffffffffffffffffff0000000000000000000000000000000000000000169055019055602a80548061166a57fe5b60008281526020902081017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff90810180547fffffffffffffffffffffffff000000000000000000000000000000000000000016905501905550611527915050565b60005b8a811015611ad9576000602860008e8e858181106116e857fe5b602090810292909201356001600160a01b031683525081019190915260400160002054610100900460ff16600281111561171e57fe5b14611770576040805162461bcd60e51b815260206004820152601760248201527f7265706561746564207369676e65722061646472657373000000000000000000604482015290519081900360640190fd5b6040805180820190915260ff8216815260016020820152602860008e8e8581811061179757fe5b602090810292909201356001600160a01b031683525081810192909252604001600020825181547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff001660ff9091161780825591830151909182907fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00ff1661010083600281111561182257fe5b02179055506000915060079050818c8c8581811061183c57fe5b6001600160a01b03602091820293909301358316845283019390935260409091016000205416919091141590506118ba576040805162461bcd60e51b815260206004820152601160248201527f7061796565206d75737420626520736574000000000000000000000000000000604482015290519081900360640190fd5b6000602860008c8c858181106118cc57fe5b602090810292909201356001600160a01b031683525081019190915260400160002054610100900460ff16600281111561190257fe5b14611954576040805162461bcd60e51b815260206004820152601c60248201527f7265706561746564207472616e736d6974746572206164647265737300000000604482015290519081900360640190fd5b6040805180820190915260ff8216815260026020820152602860008c8c8581811061197b57fe5b602090810292909201356001600160a01b031683525081810192909252604001600020825181547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff001660ff9091161780825591830151909182907fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00ff16610100836002811115611a0657fe5b021790555090505060298c8c83818110611a1c57fe5b835460018101855560009485526020948590200180547fffffffffffffffffffffffff0000000000000000000000000000000000000000166001600160a01b039590920293909301359390931692909217905550602a8a8a83818110611a7e57fe5b835460018181018655600095865260209586902090910180547fffffffffffffffffffffffff0000000000000000000000000000000000000000166001600160a01b03969093029490940135949094161790915550016116ce565b50602b805460ff89167501000000000000000000000000000000000000000000027fffffffffffffffffffff00ffffffffffffffffffffffffffffffffffffffffff909116179055602d80544363ffffffff9081166401000000009081027fffffffffffffffffffffffffffffffffffffffffffffffff00000000ffffffff84161780831660010183167fffffffffffffffffffffffffffffffffffffffffffffffffffffffff00000000909116179384905590910481169116611ba530828f8f8f8f8f8f8f8f614cf6565b602b60000160006101000a8154816fffffffffffffffffffffffffffffffff021916908360801c02179055506000602b60000160106101000a81548164ffffffffff021916908364ffffffffff1602179055507f25d719d88a4512dd76c7442b910a83360845505894eb444ef299409e180f8fb982828f8f8f8f8f8f8f8f604051808b63ffffffff1681526020018a67ffffffffffffffff16815260200180602001806020018760ff1681526020018667ffffffffffffffff1681526020018060200184810384528c8c82818152602001925060200280828437600083820152601f017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe01690910185810384528a8152602090810191508b908b0280828437600083820152601f017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe01690910185810383528681526020019050868680828437600083820152604051601f9091017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0169092018290039f50909d5050505050505050505050505050a150505050505050505050505050565b6000611da0336000368080601f016020809104026020016040519081016040528093929190818152602001838380828437600092019190915250611df992505050565b611df1576040805162461bcd60e51b815260206004820152600960248201527f4e6f206163636573730000000000000000000000000000000000000000000000604482015290519081900360640190fd5b611378614e36565b6000611e058383614e5c565b80611e1857506001600160a01b03831632145b90505b92915050565b7f0000000000000000000000000000000000000000204fce5e3e2502611000000081565b602f546001600160a01b031690565b6060611e97336000368080601f016020809104026020016040519081016040528093929190818152602001838380828437600092019190915250611df992505050565b611ee8576040805162461bcd60e51b815260206004820152600960248201527f4e6f206163636573730000000000000000000000000000000000000000000000604482015290519081900360640190fd5b611378614e8c565b6001546001600160a01b03163314611f4f576040805162461bcd60e51b815260206004820152601660248201527f4d7573742062652070726f706f736564206f776e657200000000000000000000604482015290519081900360640190fd5b60008054337fffffffffffffffffffffffff0000000000000000000000000000000000000000808316821784556001805490911690556040516001600160a01b0390921692909183917f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e091a350565b6000546001600160a01b0316331461201d576040805162461bcd60e51b815260206004820152601660248201527f4f6e6c792063616c6c61626c65206279206f776e657200000000000000000000604482015290519081900360640190fd5b60315460ff16610dc657603180547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff001660011790556040517faebf329500988c6488a0074e5a0a9ff304561fc5c6fc877aeb1d59c8282c348090600090a1565b6060602a8054806020026020016040519081016040528092919081815260200182805480156120d557602002820191906000526020600020905b81546001600160a01b031681526001909101906020018083116120b7575b5050505050905090565b602d54602b5463ffffffff808316926401000000009004169060801b909192565b6000612143336000368080601f016020809104026020016040519081016040528093929190818152602001838380828437600092019190915250611df992505050565b612194576040805162461bcd60e51b815260206004820152600960248201527f4e6f206163636573730000000000000000000000000000000000000000000000604482015290519081900360640190fd5b611378614f37565b6000546001600160a01b031633146121fb576040805162461bcd60e51b815260206004820152601660248201527f4f6e6c792063616c6c61626c65206279206f776e657200000000000000000000604482015290519081900360640190fd5b6001600160a01b03811660009081526032602052604090205460ff1615612290576001600160a01b03811660008181526032602090815260409182902080547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00169055815192835290517f3d68a6fce901d20453d1a7aa06bf3950302a735948037deb182a8db66df2a0d19281900390910190a15b50565b6001600160a01b03818116600090815260076020526040902054163314612301576040805162461bcd60e51b815260206004820152601760248201527f4f6e6c792070617965652063616e207769746864726177000000000000000000604482015290519081900360640190fd5b61229081614aea565b6000546001600160a01b031681565b60408051808201909152602e546001600160a01b0381168083527401000000000000000000000000000000000000000090910463ffffffff16602090920182905291565b600080546001600160a01b03163314806124575750602f54604080517f6b14daf800000000000000000000000000000000000000000000000000000000815233600482018181526024830193845236604484018190526001600160a01b0390951694636b14daf894929360009391929190606401848480828437600083820152604051601f9091017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe016909201965060209550909350505081840390508186803b15801561242a57600080fd5b505afa15801561243e573d6000803e3d6000fd5b505050506040513d602081101561245457600080fd5b50515b6124a8576040805162461bcd60e51b815260206004820152601d60248201527f4f6e6c79206f776e6572267265717565737465722063616e2063616c6c000000604482015290519081900360640190fd5b6040805160808082018352602b549081901b7fffffffffffffffffffffffffffffffff0000000000000000000000000000000016808352700100000000000000000000000000000000820464ffffffffff81166020808601919091527501000000000000000000000000000000000000000000840460ff9081168688015276010000000000000000000000000000000000000000000090940463ffffffff9081166060808801919091528751948552600884901c909116918401919091529216818501529251919233927f3ea16a923ff4b1df6526e854c9e3a995c43385d70e73359e10623c74f0b52037929181900390910190a2806060015160010163ffffffff1691505090565b6004546001600160a01b031690565b6000806000806000612609336000368080601f016020809104026020016040519081016040528093929190818152602001838380828437600092019190915250611df992505050565b61265a576040805162461bcd60e51b815260206004820152600960248201527f4e6f206163636573730000000000000000000000000000000000000000000000604482015290519081900360640190fd5b61266386614f92565b939a9299509097509550909350915050565b6000546001600160a01b031633146126d4576040805162461bcd60e51b815260206004820152601660248201527f4f6e6c792063616c6c61626c65206279206f776e657200000000000000000000604482015290519081900360640190fd5b828114612728576040805162461bcd60e51b815260206004820181905260248201527f7472616e736d6974746572732e73697a6520213d207061796565732e73697a65604482015290519081900360640190fd5b60005b838110156128a757600085858381811061274157fe5b905060200201356001600160a01b03169050600084848481811061276157fe5b6001600160a01b0385811660009081526007602090815260409091205492029390930135831693509091169050801580806127ad5750826001600160a01b0316826001600160a01b0316145b6127fe576040805162461bcd60e51b815260206004820152601160248201527f706179656520616c726561647920736574000000000000000000000000000000604482015290519081900360640190fd5b6001600160a01b03848116600090815260076020526040902080547fffffffffffffffffffffffff0000000000000000000000000000000000000000168583169081179091559083161461289757826001600160a01b0316826001600160a01b0316856001600160a01b03167f78af32efdcad432315431e9b03d27e6cd98fb79c405fdc5af7c1714d9c0f75b360405160405180910390a45b50506001909201915061272b9050565b5050505050565b6000546001600160a01b0316331461290d576040805162461bcd60e51b815260206004820152601660248201527f4f6e6c792063616c6c61626c65206279206f776e657200000000000000000000604482015290519081900360640190fd5b602f546001600160a01b0390811690821681146112d857602f80547fffffffffffffffffffffffff0000000000000000000000000000000000000000166001600160a01b03848116918217909255604080519284168352602083019190915280517f27b89aede8b560578baaa25ee5ce3852c5eecad1e114b941bbd89e1eb4bae6349281900390910190a15050565b6000546001600160a01b031633146129fb576040805162461bcd60e51b815260206004820152601660248201527f4f6e6c792063616c6c61626c65206279206f776e657200000000000000000000604482015290519081900360640190fd5b612290816150dd565b6001600160a01b03818116600090815260086020526040902054163314612a72576040805162461bcd60e51b815260206004820152601f60248201527f6f6e6c792070726f706f736564207061796565732063616e2061636365707400604482015290519081900360640190fd5b6001600160a01b0381811660008181526007602090815260408083208054337fffffffffffffffffffffffff000000000000000000000000000000000000000080831682179093556008909452828520805490921690915590519416939092849290917f78af32efdcad432315431e9b03d27e6cd98fb79c405fdc5af7c1714d9c0f75b39190a45050565b6000612b40336000368080601f016020809104026020016040519081016040528093929190818152602001838380828437600092019190915250611df992505050565b612b91576040805162461bcd60e51b815260206004820152600960248201527f4e6f206163636573730000000000000000000000000000000000000000000000604482015290519081900360640190fd5b611e1b82615176565b6000612bdd336000368080601f016020809104026020016040519081016040528093929190818152602001838380828437600092019190915250611df992505050565b612c2e576040805162461bcd60e51b815260206004820152600960248201527f4e6f206163636573730000000000000000000000000000000000000000000000604482015290519081900360640190fd5b611e1b826151ac565b6004546000546001600160a01b039182169116331480612d2f5750604080517f6b14daf800000000000000000000000000000000000000000000000000000000815233600482018181526024830193845236604484018190526001600160a01b03861694636b14daf8946000939190606401848480828437600083820152604051601f9091017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe016909201965060209550909350505081840390508186803b158015612d0257600080fd5b505afa158015612d16573d6000803e3d6000fd5b505050506040513d6020811015612d2c57600080fd5b50515b612d80576040805162461bcd60e51b815260206004820181905260248201527f4f6e6c79206f776e65722662696c6c696e6741646d696e2063616e2063616c6c604482015290519081900360640190fd5b612d886146fe565b612d958686868686615201565b505050505050565b6000546001600160a01b0316331480612e95575060048054604080517f6b14daf8000000000000000000000000000000000000000000000000000000008152339381018481526024820192835236604483018190526001600160a01b0390941694636b14daf8949093600093919291606401848480828437600083820152604051601f9091017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe016909201965060209550909350505081840390508186803b158015612e6857600080fd5b505afa158015612e7c573d6000803e3d6000fd5b505050506040513d6020811015612e9257600080fd5b50515b612ee6576040805162461bcd60e51b815260206004820181905260248201527f4f6e6c79206f776e65722662696c6c696e6741646d696e2063616e2063616c6c604482015290519081900360640190fd5b6000612ef061537b565b600354604080517f70a0823100000000000000000000000000000000000000000000000000000000815230600482015290519293506000926001600160a01b03909216916370a0823191602480820192602092909190829003018186803b158015612f5a57600080fd5b505afa158015612f6e573d6000803e3d6000fd5b505050506040513d6020811015612f8457600080fd5b5051905081811015612fdd576040805162461bcd60e51b815260206004820152601460248201527f696e73756666696369656e742062616c616e6365000000000000000000000000604482015290519081900360640190fd5b6003546001600160a01b031663a9059cbb85612ffb8585038761554b565b6040518363ffffffff1660e01b815260040180836001600160a01b0316815260200182815260200192505050602060405180830381600087803b15801561304157600080fd5b505af1158015613055573d6000803e3d6000fd5b505050506040513d602081101561306b57600080fd5b50516130be576040805162461bcd60e51b815260206004820152601260248201527f696e73756666696369656e742066756e64730000000000000000000000000000604482015290519081900360640190fd5b50505050565b60005a90506130d7888888888888615562565b361461312a576040805162461bcd60e51b815260206004820152601960248201527f7472616e736d6974206d65737361676520746f6f206c6f6e6700000000000000604482015290519081900360640190fd5b613132615b59565b6040805160808082018352602b549081901b7fffffffffffffffffffffffffffffffff00000000000000000000000000000000168252700100000000000000000000000000000000810464ffffffffff1660208301527501000000000000000000000000000000000000000000810460ff169282019290925276010000000000000000000000000000000000000000000090910463ffffffff166060808301919091529082526000908a908a908110156131eb57600080fd5b81359160208101359181019060608101604082013564010000000081111561321257600080fd5b82018360208201111561322457600080fd5b8035906020019184602083028401116401000000008311171561324657600080fd5b91908080602002602001604051908101604052809392919081815260200183836020028082843760009201919091525050505060408801525050506080840182905283515190925060589190911b907fffffffffffffffffffffffffffffffff0000000000000000000000000000000080831691161461330d576040805162461bcd60e51b815260206004820152601560248201527f636f6e666967446967657374206d69736d617463680000000000000000000000604482015290519081900360640190fd5b608083015183516020015164ffffffffff808316911610613375576040805162461bcd60e51b815260206004820152600c60248201527f7374616c65207265706f72740000000000000000000000000000000000000000604482015290519081900360640190fd5b83516040015160ff1689116133d1576040805162461bcd60e51b815260206004820152601560248201527f6e6f7420656e6f756768207369676e6174757265730000000000000000000000604482015290519081900360640190fd5b601f891115613427576040805162461bcd60e51b815260206004820152601360248201527f746f6f206d616e79207369676e61747572657300000000000000000000000000604482015290519081900360640190fd5b86891461347b576040805162461bcd60e51b815260206004820152601e60248201527f7369676e617475726573206f7574206f6620726567697374726174696f6e0000604482015290519081900360640190fd5b601f84604001515111156134d6576040805162461bcd60e51b815260206004820152601e60248201527f6e756d206f62736572766174696f6e73206f7574206f6620626f756e64730000604482015290519081900360640190fd5b83600001516040015160020260ff168460400151511161353d576040805162461bcd60e51b815260206004820152601e60248201527f746f6f206665772076616c75657320746f207472757374206d656469616e0000604482015290519081900360640190fd5b8867ffffffffffffffff8111801561355457600080fd5b506040519080825280601f01601f19166020018201604052801561357f576020820181803683370190505b50606085015260005b60ff81168a11156135f057868160ff16602081106135a257fe5b1a60f81b85606001518260ff16815181106135b957fe5b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a905350600101613588565b5083604001515167ffffffffffffffff8111801561360d57600080fd5b506040519080825280601f01601f191660200182016040528015613638576020820181803683370190505b506020850152613646615b8d565b60005b8560400151518160ff16101561374c576000858260ff166020811061366a57fe5b1a90508281601f811061367957fe5b6020020151156136d0576040805162461bcd60e51b815260206004820152601760248201527f6f6273657276657220696e646578207265706561746564000000000000000000604482015290519081900360640190fd5b6001838260ff16601f81106136e157fe5b91151560209283029190910152869060ff84169081106136fd57fe5b1a60f81b87602001518360ff168151811061371457fe5b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a90535050600101613649565b503360009081526028602090815260408083208151808301909252805460ff8082168452929391929184019161010090910416600281111561378a57fe5b600281111561379557fe5b90525090506002816020015160028111156137ac57fe5b1480156137e05750602a816000015160ff16815481106137c857fe5b6000918252602090912001546001600160a01b031633145b613831576040805162461bcd60e51b815260206004820152601860248201527f756e617574686f72697a6564207472616e736d69747465720000000000000000604482015290519081900360640190fd5b5050835164ffffffffff90911660209091015250506040516000908a908a9080838380828437604051920182900390912094506138729350615b8d92505050565b61387a615bac565b60005b89811015613a915760006001858760600151848151811061389a57fe5b60209101015160f81c601b018e8e868181106138b257fe5b905060200201358d8d878181106138c557fe5b9050602002013560405160008152602001604052604051808581526020018460ff1681526020018381526020018281526020019450505050506020604051602081039080840390855afa158015613920573d6000803e3d6000fd5b5050604080517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe08101516001600160a01b03811660009081526028602090815290849020838501909452835460ff8082168552929650929450840191610100900416600281111561398d57fe5b600281111561399857fe5b90525092506001836020015160028111156139af57fe5b14613a01576040805162461bcd60e51b815260206004820152601e60248201527f61646472657373206e6f7420617574686f72697a656420746f207369676e0000604482015290519081900360640190fd5b8251849060ff16601f8110613a1257fe5b602002015115613a69576040805162461bcd60e51b815260206004820152601460248201527f6e6f6e2d756e69717565207369676e6174757265000000000000000000000000604482015290519081900360640190fd5b600184846000015160ff16601f8110613a7e57fe5b911515602090920201525060010161387d565b5050505060005b600182604001515103811015613b4257600082604001518260010181518110613abd57fe5b602002602001015160170b83604001518381518110613ad857fe5b602002602001015160170b1315905080613b39576040805162461bcd60e51b815260206004820152601760248201527f6f62736572766174696f6e73206e6f7420736f72746564000000000000000000604482015290519081900360640190fd5b50600101613a98565b50604081015180516000919060028104908110613b5b57fe5b602002602001015190508060170b7f00000000000000000000000000000000000000000000d3c21bcecceda100000060170b13158015613bc157507f0000000000000000000000000000000000000000204fce5e3e2502611000000060170b8160170b13155b613c12576040805162461bcd60e51b815260206004820152601e60248201527f6d656469616e206973206f7574206f66206d696e2d6d61782072616e67650000604482015290519081900360640190fd5b81516060908101805163ffffffff60019091018116909152604080518082018252601785810b80835267ffffffffffffffff42811660208086019182528a5189015188166000908152602c82528781209651875493519094167801000000000000000000000000000000000000000000000000029390950b77ffffffffffffffffffffffffffffffffffffffffffffffff9081167fffffffffffffffff0000000000000000000000000000000000000000000000009093169290921790911691909117909355875186015184890151848a01516080808c015188519586523386890181905291860181905260a0988601898152845199870199909952835194909916997ff6a97944f31ea060dfde0566e4167c1a1082551e64b60ecb14d599a9d023d451998c999298949793969095909492939185019260c086019289820192909102908190849084905b83811015613d75578181015183820152602001613d5d565b50505050905001838103825285818151815260200191508051906020019080838360005b83811015613db1578181015183820152602001613d99565b50505050905090810190601f168015613dde5780820380516001836020036101000a031916815260200191505b5097505050505050505060405180910390a281516060015160408051428152905160009263ffffffff16917f0109fc6f55cf40689f02fbaad7af7fe7bbac8a3d2186600afc7d3e10cac60271919081900360200190a381600001516060015163ffffffff168160170b7f0559884fd3a460db3073b7fc896cc77986f16e378210ded43186175bf646fc5f426040518082815260200191505060405180910390a3613e938260000151606001518260170b61557a565b5080518051602b8054602084015160408501516060909501517fffffffffffffffffffffffffffffffff0000000000000000000000000000000090921660809490941c939093177fffffffffffffffffffffff0000000000ffffffffffffffffffffffffffffffff1670010000000000000000000000000000000064ffffffffff90941693909302929092177fffffffffffffffffffff00ffffffffffffffffffffffffffffffffffffffffff16750100000000000000000000000000000000000000000060ff90941693909302929092177fffffffffffff00000000ffffffffffffffffffffffffffffffffffffffffffff1676010000000000000000000000000000000000000000000063ffffffff92831602179091558210613fb457fe5b613fc28282602001516156ba565b505050505050505050565b600354604080517f70a08231000000000000000000000000000000000000000000000000000000008152306004820152905160009283926001600160a01b03909116916370a0823191602480820192602092909190829003018186803b15801561403657600080fd5b505afa15801561404a573d6000803e3d6000fd5b505050506040513d602081101561406057600080fd5b50519050600061406e61537b565b90910391505090565b60315460ff1681565b6001600160a01b03811660009081526028602090815260408083208151808301909252805460ff8082168452859484019161010090041660028111156140c257fe5b60028111156140cd57fe5b90525090506000816020015160028111156140e457fe5b14156140f4576000915050610f0e565b60016005826000015160ff16601f811061410a57fe5b601091828204019190066002029054906101000a900461ffff1603915050919050565b600080808080333214614187576040805162461bcd60e51b815260206004820152601460248201527f4f6e6c792063616c6c61626c6520627920454f41000000000000000000000000604482015290519081900360640190fd5b5050602b5463ffffffff760100000000000000000000000000000000000000000000820481166000908152602c6020526040902054608083901b96700100000000000000000000000000000000909304600881901c909216955064ffffffffff9091169350601781900b92507801000000000000000000000000000000000000000000000000900467ffffffffffffffff1690565b6003546001600160a01b031690565b6000546001600160a01b0316331461428a576040805162461bcd60e51b815260206004820152601660248201527f4f6e6c792063616c6c61626c65206279206f776e657200000000000000000000604482015290519081900360640190fd5b60408051808201909152602e546001600160a01b038082168084527401000000000000000000000000000000000000000090920463ffffffff16602084015284161415806142e857508163ffffffff16816020015163ffffffff1614155b156143bb576040805180820182526001600160a01b0385811680835263ffffffff8681166020948501819052602e80547fffffffffffffffffffffffff00000000000000000000000000000000000000001684177fffffffffffffffff00000000ffffffffffffffffffffffffffffffffffffffff16740100000000000000000000000000000000000000008302179055865187860151875193168352948201528451919493909216927fb04e3a37abe9c0fcdfebdeae019a8e2b12ddf53f5d55ffb0caccc1bedaca1541928290030190a35b505050565b6001600160a01b0382811660009081526007602052604090205416331461442e576040805162461bcd60e51b815260206004820152601d60248201527f6f6e6c792063757272656e742070617965652063616e20757064617465000000604482015290519081900360640190fd5b336001600160a01b038216141561448c576040805162461bcd60e51b815260206004820152601760248201527f63616e6e6f74207472616e7366657220746f2073656c66000000000000000000604482015290519081900360640190fd5b6001600160a01b03808316600090815260086020526040902080548383167fffffffffffffffffffffffff0000000000000000000000000000000000000000821681179092559091169081146143bb576040516001600160a01b038084169133918616907f84f7c7c80bb8ed2279b4aab5f61cd05e6374073d38f46d7f32de8c30e9e3836790600090a4505050565b6000546001600160a01b0316331461457a576040805162461bcd60e51b815260206004820152601660248201527f4f6e6c792063616c6c61626c65206279206f776e657200000000000000000000604482015290519081900360640190fd5b600180547fffffffffffffffffffffffff0000000000000000000000000000000000000000166001600160a01b0383811691821790925560008054604051929316917fed8889f560326eb138920d842192f0eb3dd22b4f139c87a2c57538e05bae12789190a350565b6000546001600160a01b03163314614642576040805162461bcd60e51b815260206004820152601660248201527f4f6e6c792063616c6c61626c65206279206f776e657200000000000000000000604482015290519081900360640190fd5b61229081615907565b6000806000806000614694336000368080601f016020809104026020016040519081016040528093929190818152602001838380828437600092019190915250611df992505050565b6146e5576040805162461bcd60e51b815260206004820152600960248201527f4e6f206163636573730000000000000000000000000000000000000000000000604482015290519081900360640190fd5b6146ed615996565b945094509450945094509091929394565b6040805160a08101825260025463ffffffff80821683526401000000008204811660208401526801000000000000000082048116838501526c0100000000000000000000000082048116606084015270010000000000000000000000000000000090910416608082015260035482516103e081019384905291926001600160a01b0390911691600091600590601f908285855b82829054906101000a900461ffff1661ffff1681526020019060020190602082600101049283019260010382029150808411614791575050604080516103e0810191829052959650600095945060099350601f9250905082845b8154815260200190600101908083116147eb57505050505090506000602a80548060200260200160405190810160405280929190818152602001828054801561485d57602002820191906000526020600020905b81546001600160a01b0316815260019091019060200180831161483f575b5050505050905060005b8151811015614a9257600060018483601f811061488057fe5b6020020151039050600060018684601f811061489857fe5b60200201510361ffff169050600082896060015163ffffffff168302633b9aca00020190506000811115614a87576000600760008787815181106148d857fe5b60200260200101516001600160a01b03166001600160a01b0316815260200190815260200160002060009054906101000a90046001600160a01b03169050886001600160a01b031663a9059cbb82846040518363ffffffff1660e01b815260040180836001600160a01b0316815260200182815260200192505050602060405180830381600087803b15801561496d57600080fd5b505af1158015614981573d6000803e3d6000fd5b505050506040513d602081101561499757600080fd5b50516149ea576040805162461bcd60e51b815260206004820152601260248201527f696e73756666696369656e742066756e64730000000000000000000000000000604482015290519081900360640190fd5b60018886601f81106149f857fe5b61ffff909216602092909202015260018786601f8110614a1457fe5b602002018181525050886001600160a01b0316816001600160a01b0316878781518110614a3d57fe5b60200260200101516001600160a01b03167fd0b1dac935d85bd54cf0a33b0d41d39f8cf53a968465fc7ea2377526b8ac712c856040518082815260200191505060405180910390a4505b505050600101614867565b50614aa0600584601f615bc3565b50612d95600983601f615c59565b602b54760100000000000000000000000000000000000000000000900463ffffffff166000908152602c6020526040902054601790810b900b90565b6001600160a01b03811660009081526028602090815260408083208151808301909252805460ff80821684529293919291840191610100909104166002811115614b3057fe5b6002811115614b3b57fe5b90525090506000614b4b83610dc8565b905080156143bb576001600160a01b0380841660009081526007602090815260408083205460035482517fa9059cbb000000000000000000000000000000000000000000000000000000008152918616600483018190526024830188905292519295169363a9059cbb9360448084019491939192918390030190829087803b158015614bd657600080fd5b505af1158015614bea573d6000803e3d6000fd5b505050506040513d6020811015614c0057600080fd5b5051614c53576040805162461bcd60e51b815260206004820152601260248201527f696e73756666696369656e742066756e64730000000000000000000000000000604482015290519081900360640190fd5b60016005846000015160ff16601f8110614c6957fe5b601091828204019190066002026101000a81548161ffff021916908361ffff16021790555060016009846000015160ff16601f8110614ca457fe5b01556003546040805184815290516001600160a01b039283169284811692908816917fd0b1dac935d85bd54cf0a33b0d41d39f8cf53a968465fc7ea2377526b8ac712c9181900360200190a450505050565b60008a8a8a8a8a8a8a8a8a8a604051602001808b6001600160a01b031681526020018a67ffffffffffffffff16815260200180602001806020018760ff1681526020018667ffffffffffffffff1681526020018060200184810384528c8c82818152602001925060200280828437600083820152601f017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe01690910185810384528a8152602090810191508b908b0280828437600083820152601f017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe01690910185810383528681526020019050868680828437600081840152601f19601f8201169050808301925050509d50505050505050505050505050506040516020818303038152906040528051906020012090509a9950505050505050505050565b602b54760100000000000000000000000000000000000000000000900463ffffffff1690565b6001600160a01b03821660009081526032602052604081205460ff1680611e1857505060315460ff161592915050565b60308054604080516020601f60027fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff6101006001881615020190951694909404938401819004810282018101909252828152606093909290918301828280156120d55780601f10614f0b576101008083540402835291602001916120d5565b820191906000526020600020905b815481529060010190602001808311614f1957509395945050505050565b602b54760100000000000000000000000000000000000000000000900463ffffffff166000908152602c60205260409020547801000000000000000000000000000000000000000000000000900467ffffffffffffffff1690565b600080600080600063ffffffff8669ffffffffffffffffffff1611156040518060400160405280600f81526020017f4e6f20646174612070726573656e7400000000000000000000000000000000008152509061506d5760405162461bcd60e51b81526004018080602001828103825283818151815260200191508051906020019080838360005b8381101561503257818101518382015260200161501a565b50505050905090810190601f16801561505f5780820380516001836020036101000a031916815260200191505b509250505060405180910390fd5b5050505063ffffffff83166000908152602c6020908152604091829020825180840190935254601781810b810b810b808552780100000000000000000000000000000000000000000000000090920467ffffffffffffffff1693909201839052949594900b939092508291508490565b6001600160a01b03811660009081526032602052604090205460ff16612290576001600160a01b03811660008181526032602090815260409182902080547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00166001179055815192835290517f87286ad1f399c8e82bf0c4ef4fcdc570ea2e1e92176e5c848b6413545b885db49281900390910190a150565b600063ffffffff82111561518c57506000610f0e565b5063ffffffff166000908152602c6020526040902054601790810b900b90565b600063ffffffff8211156151c257506000610f0e565b5063ffffffff166000908152602c60205260409020547801000000000000000000000000000000000000000000000000900467ffffffffffffffff1690565b6040805160a0808201835263ffffffff88811680845288821660208086018290528984168688018190528985166060808901829052958a166080988901819052600280547fffffffffffffffffffffffffffffffffffffffffffffffffffffffff000000001687177fffffffffffffffffffffffffffffffffffffffffffffffff00000000ffffffff166401000000008702177fffffffffffffffffffffffffffffffffffffffff00000000ffffffffffffffff16680100000000000000008502177fffffffffffffffffffffffffffffffff00000000ffffffffffffffffffffffff166c010000000000000000000000008402177fffffffffffffffffffffffff00000000ffffffffffffffffffffffffffffffff16700100000000000000000000000000000000830217905589519586529285019390935283880152928201529283015291517fd0d9486a2c673e2a4b57fc82e4c8a556b3e2b82dd5db07e2c04a920ca0f469b6929181900390910190a15050505050565b604080516103e0810191829052600091829190600590601f908285855b82829054906101000a900461ffff1661ffff16815260200190600201906020826001010492830192600103820291508084116153985790505050505050905060005b601f8110156154085760018282601f81106153f157fe5b60200201510361ffff1692909201916001016153da565b506040805160a08101825260025463ffffffff8082168352640100000000820481166020808501919091526801000000000000000083048216848601526c0100000000000000000000000083048216606085018190527001000000000000000000000000000000009093049091166080840152602a805485518184028101840190965280865296909202633b9aca00029592936000939092918301828280156154da57602002820191906000526020600020905b81546001600160a01b031681526001909101906020018083116154bc575b5050604080516103e0810191829052949550600094935060099250601f915082845b8154815260200190600101908083116154fc575050505050905060005b82518110156155435760018282601f811061553057fe5b6020020151039590950194600101615519565b505050505090565b60008183101561555c575081611e1b565b50919050565b602083810286019082020160e4019695505050505050565b60408051808201909152602e546001600160a01b0381168083527401000000000000000000000000000000000000000090910463ffffffff1660208301526155c257506112d8565b7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff830163ffffffff8181166000818152602c602090815260408083205487518884015183517fbeed9b510000000000000000000000000000000000000000000000000000000081526004810197909752601792830b90920b602487018190528b88166044880152606487018b9052925192966001600160a01b039091169563beed9b51959290911693608480830194919391928390030190829088803b15801561568b57600080fd5b5087f1935050505080156156b157506040513d60208110156156ac57600080fd5b505160015b612d95576128a7565b3360009081526028602090815260408083208151808301909252805460ff808216845292939192918401916101009091041660028111156156f757fe5b600281111561570257fe5b9052506040805160a08101825260025463ffffffff80821683526401000000008204811660208401526801000000000000000082048116838501526c0100000000000000000000000082048116606084015270010000000000000000000000000000000090910416608082015281516103e0810192839052929350916157d291859190600590601f90826000855b82829054906101000a900461ffff1661ffff16815260200190600201906020826001010492830192600103820291508084116157905790505050505050615a1a565b6157e090600590601f615bc3565b506002826020015160028111156157f357fe5b14615845576040805162461bcd60e51b815260206004820181905260248201527f73656e7420627920756e64657369676e61746564207472616e736d6974746572604482015290519081900360640190fd5b600061586c633b9aca003a04836020015163ffffffff16846000015163ffffffff16615a8f565b90506010360260005a9050600061588b8863ffffffff16858585615ab5565b6fffffffffffffffffffffffffffffffff1690506000620f4240866040015163ffffffff168302816158b957fe5b049050856080015163ffffffff16633b9aca0002816009896000015160ff16601f81106158e257fe5b015401016009886000015160ff16601f81106158fa57fe5b0155505050505050505050565b6004546001600160a01b0390811690821681146112d857600480547fffffffffffffffffffffffff0000000000000000000000000000000000000000166001600160a01b03848116918217909255604080519284168352602083019190915280517f793cb73064f3c8cde7e187ae515511e6e56d1ee89bf08b82fa60fb70f8d489129281900390910190a15050565b602b54760100000000000000000000000000000000000000000000900463ffffffff166000818152602c6020908152604091829020825180840190935254601781810b810b810b808552780100000000000000000000000000000000000000000000000090920467ffffffffffffffff1693909201839052929392900b9181908490565b615a22615b8d565b60005b8351811015615a87576000848281518110615a3c57fe5b016020015160f81c9050615a618482601f8110615a5557fe5b60200201516001615b41565b848260ff16601f8110615a7057fe5b61ffff909216602092909202015250600101615a25565b509092915050565b60008383811015615aa257600285850304015b615aac818461554b565b95945050505050565b600081851015615b0c576040805162461bcd60e51b815260206004820181905260248201527f6761734c6566742063616e6e6f742065786365656420696e697469616c476173604482015290519081900360640190fd5b818503830161179301633b9aca00858202026fffffffffffffffffffffffffffffffff8110615b3757fe5b9695505050505050565b6000611e188261ffff168461ffff160161ffff61554b565b6040518060a00160405280615b6c615c87565b81526060602082018190526040820181905280820152600060809091015290565b604051806103e00160405280601f906020820280368337509192915050565b604080518082019091526000808252602082015290565b600283019183908215615c495791602002820160005b83821115615c1957835183826101000a81548161ffff021916908361ffff1602179055509260200192600201602081600101049283019260010302615bd9565b8015615c475782816101000a81549061ffff0219169055600201602081600101049283019260010302615c19565b505b50615c55929150615cae565b5090565b82601f8101928215615c49579160200282015b82811115615c49578251825591602001919060010190615c6c565b60408051608081018252600080825260208201819052918101829052606081019190915290565b5b80821115615c555760008155600101615caf56fe416363657373436f6e74726f6c6c65644f6666636861696e41676772656761746f7220332e302e306f7261636c6520616464726573736573206f7574206f6620726567697374726174696f6ea2646970667358221220757bff216f6d81152fcaa510caac9632619adc3b29bcb61ba73c0af8d453fb2864736f6c63430007060033", - "nonce": 1, - "storage": { - "0x000000000000000000000000000000000000000000000000000000000000002b": "0x00000000000000003a160300016f49041476ca30af590904b92a3e4e7842885e", - "0xccbdb3cfb1dd93518ef00eca066729d13761bc6a8d7a46af8b2b4e584a5adb54": "0x0000000000000000000000000000000000000000000000000000000000000001", - "0xd011157f54b11514bc3bf592956380e736b5b7359c42b0dd549ec8ef9c7b9d67": "0x000000006327dde90000000000000000000000000082e0fab52217072028a796" - } - }, - "0x37aafb2ee35f1250a001202c660b13c301d2130b": { - "balance": "0x0", - "code": "0x608060405234801561001057600080fd5b506004361061018d5760003560e01c80638f6b4d91116100e3578063bc43cbaf1161008c578063f2fde38b11610066578063f2fde38b1461042b578063f8a2abd31461045e578063feaf968c146104915761018d565b8063bc43cbaf146103fa578063c159730414610402578063e8c4be30146104235761018d565b8063a928c096116100bd578063a928c0961461038d578063b5ab58dc146103c0578063b633620c146103dd5761018d565b80638f6b4d911461032957806392eefe9b146103315780639a6fc8f5146103645761018d565b80636001ac531161014557806379ba50971161011f57806379ba50971461030f5780638205bf6a146103195780638da5cb5b146103215761018d565b80636001ac5314610222578063668a0f021461028a5780637284e416146102925761018d565b806350d25bcd1161017657806350d25bcd146101e157806354fd4d50146101fb57806358303b10146102035761018d565b8063245a7bfc14610192578063313ce567146101c3575b600080fd5b61019a610499565b6040805173ffffffffffffffffffffffffffffffffffffffff9092168252519081900360200190f35b6101cb6104bb565b6040805160ff9092168252519081900360200190f35b6101e9610559565b60408051918252519081900360200190f35b6101e96106e0565b61020b61074d565b6040805161ffff9092168252519081900360200190f35b61024b6004803603602081101561023857600080fd5b503569ffffffffffffffffffff16610757565b6040805169ffffffffffffffffffff96871681526020810195909552848101939093526060840191909152909216608082015290519081900360a00190f35b6101e9610978565b61029a610af9565b6040805160208082528351818301528351919283929083019185019080838360005b838110156102d45781810151838201526020016102bc565b50505050905090810190601f1680156103015780820380516001836020036101000a031916815260200191505b509250505060405180910390f35b610317610c76565b005b6101e9610d78565b61019a610ef9565b61024b610f15565b6103176004803603602081101561034757600080fd5b503573ffffffffffffffffffffffffffffffffffffffff16611134565b61024b6004803603602081101561037a57600080fd5b503569ffffffffffffffffffff16611201565b610317600480360360208110156103a357600080fd5b503573ffffffffffffffffffffffffffffffffffffffff1661138b565b6101e9600480360360208110156103d657600080fd5b50356114ce565b6101e9600480360360208110156103f357600080fd5b5035611657565b61019a6117d9565b61019a6004803603602081101561041857600080fd5b503561ffff166117f5565b61019a61181d565b6103176004803603602081101561044157600080fd5b503573ffffffffffffffffffffffffffffffffffffffff16611839565b6103176004803603602081101561047457600080fd5b503573ffffffffffffffffffffffffffffffffffffffff16611935565b61024b611a02565b60025462010000900473ffffffffffffffffffffffffffffffffffffffff1690565b6000600260000160029054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1663313ce5676040518163ffffffff1660e01b815260040160206040518083038186803b15801561052857600080fd5b505afa15801561053c573d6000803e3d6000fd5b505050506040513d602081101561055257600080fd5b5051905090565b60055460009073ffffffffffffffffffffffffffffffffffffffff168015806106675750604080517f6b14daf8000000000000000000000000000000000000000000000000000000008152336004820181815260248301938452366044840181905273ffffffffffffffffffffffffffffffffffffffff861694636b14daf8946000939190606401848480828437600083820152604051601f9091017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe016909201965060209550909350505081840390508186803b15801561063a57600080fd5b505afa15801561064e573d6000803e3d6000fd5b505050506040513d602081101561066457600080fd5b50515b6106d257604080517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152600960248201527f4e6f206163636573730000000000000000000000000000000000000000000000604482015290519081900360640190fd5b6106da611b8b565b91505090565b6000600260000160029054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166354fd4d506040518163ffffffff1660e01b815260040160206040518083038186803b15801561052857600080fd5b60025461ffff1690565b600554600090819081908190819073ffffffffffffffffffffffffffffffffffffffff1680158061086d5750604080517f6b14daf8000000000000000000000000000000000000000000000000000000008152336004820181815260248301938452366044840181905273ffffffffffffffffffffffffffffffffffffffff861694636b14daf8946000939190606401848480828437600083820152604051601f9091017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe016909201965060209550909350505081840390508186803b15801561084057600080fd5b505afa158015610854573d6000803e3d6000fd5b505050506040513d602081101561086a57600080fd5b50515b6108d857604080517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152600960248201527f4e6f206163636573730000000000000000000000000000000000000000000000604482015290519081900360640190fd5b60035473ffffffffffffffffffffffffffffffffffffffff1661095c57604080517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601e60248201527f4e6f2070726f706f7365642061676772656761746f722070726573656e740000604482015290519081900360640190fd5b61096587611bf8565b939b929a50909850965090945092505050565b60055460009073ffffffffffffffffffffffffffffffffffffffff16801580610a865750604080517f6b14daf8000000000000000000000000000000000000000000000000000000008152336004820181815260248301938452366044840181905273ffffffffffffffffffffffffffffffffffffffff861694636b14daf8946000939190606401848480828437600083820152604051601f9091017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe016909201965060209550909350505081840390508186803b158015610a5957600080fd5b505afa158015610a6d573d6000803e3d6000fd5b505050506040513d6020811015610a8357600080fd5b50515b610af157604080517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152600960248201527f4e6f206163636573730000000000000000000000000000000000000000000000604482015290519081900360640190fd5b6106da611d57565b6060600260000160029054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16637284e4166040518163ffffffff1660e01b815260040160006040518083038186803b158015610b6657600080fd5b505afa158015610b7a573d6000803e3d6000fd5b505050506040513d6000823e601f3d9081017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe01682016040526020811015610bc157600080fd5b8101908080516040519392919084640100000000821115610be157600080fd5b908301906020820185811115610bf657600080fd5b8251640100000000811182820188101715610c1057600080fd5b82525081516020918201929091019080838360005b83811015610c3d578181015183820152602001610c25565b50505050905090810190601f168015610c6a5780820380516001836020036101000a031916815260200191505b50604052505050905090565b60015473ffffffffffffffffffffffffffffffffffffffff163314610cfc57604080517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601660248201527f4d7573742062652070726f706f736564206f776e657200000000000000000000604482015290519081900360640190fd5b60008054337fffffffffffffffffffffffff00000000000000000000000000000000000000008083168217845560018054909116905560405173ffffffffffffffffffffffffffffffffffffffff90921692909183917f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e091a350565b60055460009073ffffffffffffffffffffffffffffffffffffffff16801580610e865750604080517f6b14daf8000000000000000000000000000000000000000000000000000000008152336004820181815260248301938452366044840181905273ffffffffffffffffffffffffffffffffffffffff861694636b14daf8946000939190606401848480828437600083820152604051601f9091017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe016909201965060209550909350505081840390508186803b158015610e5957600080fd5b505afa158015610e6d573d6000803e3d6000fd5b505050506040513d6020811015610e8357600080fd5b50515b610ef157604080517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152600960248201527f4e6f206163636573730000000000000000000000000000000000000000000000604482015290519081900360640190fd5b6106da611e2e565b60005473ffffffffffffffffffffffffffffffffffffffff1681565b600554600090819081908190819073ffffffffffffffffffffffffffffffffffffffff1680158061102b5750604080517f6b14daf8000000000000000000000000000000000000000000000000000000008152336004820181815260248301938452366044840181905273ffffffffffffffffffffffffffffffffffffffff861694636b14daf8946000939190606401848480828437600083820152604051601f9091017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe016909201965060209550909350505081840390508186803b158015610ffe57600080fd5b505afa158015611012573d6000803e3d6000fd5b505050506040513d602081101561102857600080fd5b50515b61109657604080517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152600960248201527f4e6f206163636573730000000000000000000000000000000000000000000000604482015290519081900360640190fd5b60035473ffffffffffffffffffffffffffffffffffffffff1661111a57604080517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601e60248201527f4e6f2070726f706f7365642061676772656761746f722070726573656e740000604482015290519081900360640190fd5b611122611e9b565b95509550955095509550509091929394565b60005473ffffffffffffffffffffffffffffffffffffffff1633146111ba57604080517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601660248201527f4f6e6c792063616c6c61626c65206279206f776e657200000000000000000000604482015290519081900360640190fd5b600580547fffffffffffffffffffffffff00000000000000000000000000000000000000001673ffffffffffffffffffffffffffffffffffffffff92909216919091179055565b600554600090819081908190819073ffffffffffffffffffffffffffffffffffffffff168015806113175750604080517f6b14daf8000000000000000000000000000000000000000000000000000000008152336004820181815260248301938452366044840181905273ffffffffffffffffffffffffffffffffffffffff861694636b14daf8946000939190606401848480828437600083820152604051601f9091017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe016909201965060209550909350505081840390508186803b1580156112ea57600080fd5b505afa1580156112fe573d6000803e3d6000fd5b505050506040513d602081101561131457600080fd5b50515b61138257604080517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152600960248201527f4e6f206163636573730000000000000000000000000000000000000000000000604482015290519081900360640190fd5b61096587611fe4565b60005473ffffffffffffffffffffffffffffffffffffffff16331461141157604080517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601660248201527f4f6e6c792063616c6c61626c65206279206f776e657200000000000000000000604482015290519081900360640190fd5b60035473ffffffffffffffffffffffffffffffffffffffff82811691161461149a57604080517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601b60248201527f496e76616c69642070726f706f7365642061676772656761746f720000000000604482015290519081900360640190fd5b600380547fffffffffffffffffffffffff00000000000000000000000000000000000000001690556114cb81612117565b50565b60055460009073ffffffffffffffffffffffffffffffffffffffff168015806115dc5750604080517f6b14daf8000000000000000000000000000000000000000000000000000000008152336004820181815260248301938452366044840181905273ffffffffffffffffffffffffffffffffffffffff861694636b14daf8946000939190606401848480828437600083820152604051601f9091017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe016909201965060209550909350505081840390508186803b1580156115af57600080fd5b505afa1580156115c3573d6000803e3d6000fd5b505050506040513d60208110156115d957600080fd5b50515b61164757604080517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152600960248201527f4e6f206163636573730000000000000000000000000000000000000000000000604482015290519081900360640190fd5b611650836121de565b9392505050565b60055460009073ffffffffffffffffffffffffffffffffffffffff168015806117655750604080517f6b14daf8000000000000000000000000000000000000000000000000000000008152336004820181815260248301938452366044840181905273ffffffffffffffffffffffffffffffffffffffff861694636b14daf8946000939190606401848480828437600083820152604051601f9091017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe016909201965060209550909350505081840390508186803b15801561173857600080fd5b505afa15801561174c573d6000803e3d6000fd5b505050506040513d602081101561176257600080fd5b50515b6117d057604080517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152600960248201527f4e6f206163636573730000000000000000000000000000000000000000000000604482015290519081900360640190fd5b611650836122d8565b60055473ffffffffffffffffffffffffffffffffffffffff1681565b60046020526000908152604090205473ffffffffffffffffffffffffffffffffffffffff1681565b60035473ffffffffffffffffffffffffffffffffffffffff1681565b60005473ffffffffffffffffffffffffffffffffffffffff1633146118bf57604080517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601660248201527f4f6e6c792063616c6c61626c65206279206f776e657200000000000000000000604482015290519081900360640190fd5b600180547fffffffffffffffffffffffff00000000000000000000000000000000000000001673ffffffffffffffffffffffffffffffffffffffff83811691821790925560008054604051929316917fed8889f560326eb138920d842192f0eb3dd22b4f139c87a2c57538e05bae12789190a350565b60005473ffffffffffffffffffffffffffffffffffffffff1633146119bb57604080517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601660248201527f4f6e6c792063616c6c61626c65206279206f776e657200000000000000000000604482015290519081900360640190fd5b600380547fffffffffffffffffffffffff00000000000000000000000000000000000000001673ffffffffffffffffffffffffffffffffffffffff92909216919091179055565b600554600090819081908190819073ffffffffffffffffffffffffffffffffffffffff16801580611b185750604080517f6b14daf8000000000000000000000000000000000000000000000000000000008152336004820181815260248301938452366044840181905273ffffffffffffffffffffffffffffffffffffffff861694636b14daf8946000939190606401848480828437600083820152604051601f9091017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe016909201965060209550909350505081840390508186803b158015611aeb57600080fd5b505afa158015611aff573d6000803e3d6000fd5b505050506040513d6020811015611b1557600080fd5b50515b611b8357604080517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152600960248201527f4e6f206163636573730000000000000000000000000000000000000000000000604482015290519081900360640190fd5b61112261239b565b6000600260000160029054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166350d25bcd6040518163ffffffff1660e01b815260040160206040518083038186803b15801561052857600080fd5b600354600090819081908190819073ffffffffffffffffffffffffffffffffffffffff16611c8757604080517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601e60248201527f4e6f2070726f706f7365642061676772656761746f722070726573656e740000604482015290519081900360640190fd5b600354604080517f9a6fc8f500000000000000000000000000000000000000000000000000000000815269ffffffffffffffffffff89166004820152905173ffffffffffffffffffffffffffffffffffffffff90921691639a6fc8f59160248082019260a092909190829003018186803b158015611d0457600080fd5b505afa158015611d18573d6000803e3d6000fd5b505050506040513d60a0811015611d2e57600080fd5b508051602082015160408301516060840151608090940151929a91995097509195509350915050565b6000611d61612516565b5060408051808201825260025461ffff81168083526201000090910473ffffffffffffffffffffffffffffffffffffffff16602080840182905284517f668a0f0200000000000000000000000000000000000000000000000000000000815294519394611e1c9463668a0f0292600480840193919291829003018186803b158015611deb57600080fd5b505afa158015611dff573d6000803e3d6000fd5b505050506040513d6020811015611e1557600080fd5b50516124b8565b69ffffffffffffffffffff1691505090565b6000600260000160029054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16638205bf6a6040518163ffffffff1660e01b815260040160206040518083038186803b15801561052857600080fd5b600354600090819081908190819073ffffffffffffffffffffffffffffffffffffffff16611f2a57604080517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601e60248201527f4e6f2070726f706f7365642061676772656761746f722070726573656e740000604482015290519081900360640190fd5b600360009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1663feaf968c6040518163ffffffff1660e01b815260040160a06040518083038186803b158015611f9257600080fd5b505afa158015611fa6573d6000803e3d6000fd5b505050506040513d60a0811015611fbc57600080fd5b5080516020820151604083015160608401516080909401519299919850965091945092509050565b60008060008060008060006120048869ffffffffffffffffffff166124d8565b61ffff821660009081526004602081905260408083205481517f9a6fc8f500000000000000000000000000000000000000000000000000000000815267ffffffffffffffff86169381019390935290519496509294509092839283928392839273ffffffffffffffffffffffffffffffffffffffff1691639a6fc8f59160248083019260a0929190829003018186803b1580156120a057600080fd5b505afa1580156120b4573d6000803e3d6000fd5b505050506040513d60a08110156120ca57600080fd5b508051602082015160408301516060840151608090940151929850909650945090925090506120fd85858585858c6124e0565b9b509b509b509b509b505050505050505091939590929450565b60028054604080518082018252600161ffff808516919091011680825273ffffffffffffffffffffffffffffffffffffffff9590951660209182018190527fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff000090931685177fffffffffffffffffffff0000000000000000000000000000000000000000ffff166201000084021790935560009384526004909252912080547fffffffffffffffffffffffff0000000000000000000000000000000000000000169091179055565b600069ffffffffffffffffffff8211156121fa575060006122d3565b600080612206846124d8565b61ffff8216600090815260046020526040902054919350915073ffffffffffffffffffffffffffffffffffffffff168061224657600093505050506122d3565b8073ffffffffffffffffffffffffffffffffffffffff1663b5ab58dc836040518263ffffffff1660e01b8152600401808267ffffffffffffffff16815260200191505060206040518083038186803b1580156122a157600080fd5b505afa1580156122b5573d6000803e3d6000fd5b505050506040513d60208110156122cb57600080fd5b505193505050505b919050565b600069ffffffffffffffffffff8211156122f4575060006122d3565b600080612300846124d8565b61ffff8216600090815260046020526040902054919350915073ffffffffffffffffffffffffffffffffffffffff168061234057600093505050506122d3565b8073ffffffffffffffffffffffffffffffffffffffff1663b633620c836040518263ffffffff1660e01b8152600401808267ffffffffffffffff16815260200191505060206040518083038186803b1580156122a157600080fd5b60008060008060006123ab612516565b5060408051808201825260025461ffff8116825262010000900473ffffffffffffffffffffffffffffffffffffffff166020820181905282517ffeaf968c0000000000000000000000000000000000000000000000000000000081529251919260009283928392839283929163feaf968c9160048083019260a0929190829003018186803b15801561243c57600080fd5b505afa158015612450573d6000803e3d6000fd5b505050506040513d60a081101561246657600080fd5b5080516020820151604083015160608401516080909401518a5193995091975095509193509091506124a190869086908690869086906124e0565b9a509a509a509a509a505050505050509091929394565b67ffffffffffffffff1660409190911b69ffff0000000000000000161790565b604081901c91565b60008060008060006124f2868c6124b8565b8a8a8a6124ff8a8c6124b8565b939f929e50909c509a509098509650505050505050565b60408051808201909152600080825260208201529056fea2646970667358221220c6148a0e63011d3b8b4f67078be31115256b163e26351db6fe3b70d7faf433f964736f6c63430006060033", - "nonce": 1, - "storage": { - "0x0000000000000000000000000000000000000000000000000000000000000002": "0x0000000000000000000022f04bc4162d63730dcde051fdfd97b4f55ff63b0001", - "0x0000000000000000000000000000000000000000000000000000000000000005": "0x0000000000000000000000000000000000000000000000000000000000000000" - } - }, - "0x4200000000000000000000000000000000000000": { - "balance": "0x0", - "code": "0x608060405234801561001057600080fd5b50600436106100365760003560e01c806382e3702d1461003b578063cafa81dc14610072575b600080fd5b61005e610049366004610112565b60006020819052908152604090205460ff1681565b604051901515815260200160405180910390f35b61008561008036600461015a565b610087565b005b6001600080833360405160200161009f929190610229565b604080518083037fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe001815291815281516020928301208352908201929092520160002080547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff001691151591909117905550565b60006020828403121561012457600080fd5b5035919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b60006020828403121561016c57600080fd5b813567ffffffffffffffff8082111561018457600080fd5b818401915084601f83011261019857600080fd5b8135818111156101aa576101aa61012b565b604051601f82017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0908116603f011681019083821181831017156101f0576101f061012b565b8160405282815287602084870101111561020957600080fd5b826020860160208301376000928101602001929092525095945050505050565b6000835160005b8181101561024a5760208187018101518583015201610230565b81811115610259576000828501525b5060609390931b7fffffffffffffffffffffffffffffffffffffffff00000000000000000000000016919092019081526014019291505056fea26469706673582212200b48ded2e68f3541ccec6b89e65ba6788c333cfabcd8ebb2d833e41d3b8df28164736f6c63430008090033", - "nonce": 0, - "storage": { - "0xd17ff301622dba618269df506fbc2f7dc6efff195c68d8279d33502f0943572b": "0x0000000000000000000000000000000000000000000000000000000000000000" - } - }, - "0x4200000000000000000000000000000000000007": { - "balance": "0x0", - "code": "0x608060405234801561001057600080fd5b50600436106100885760003560e01c8063a71198691161005b578063a71198691461012a578063b1b1b2091461014a578063cbd4ece91461016d578063ecc704281461018057600080fd5b806321d800ec1461008d5780633dbb202b146100c55780636e296e45146100da57806382e3702d14610107575b600080fd5b6100b061009b366004610826565b60006020819052908152604090205460ff1681565b60405190151581526020015b60405180910390f35b6100d86100d3366004610942565b610197565b005b6100e26102e2565b60405173ffffffffffffffffffffffffffffffffffffffff90911681526020016100bc565b6100b0610115366004610826565b60026020526000908152604090205460ff1681565b6005546100e29073ffffffffffffffffffffffffffffffffffffffff1681565b6100b0610158366004610826565b60016020526000908152604090205460ff1681565b6100d861017b3660046109ad565b61038b565b61018960035481565b6040519081526020016100bc565b60006101a784338560035461078d565b80516020808301919091206000908152600290915260409081902080547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00166001179055517fcafa81dc0000000000000000000000000000000000000000000000000000000081529091507342000000000000000000000000000000000000009063cafa81dc9061023c908490600401610a89565b600060405180830381600087803b15801561025657600080fd5b505af115801561026a573d6000803e3d6000fd5b505050508373ffffffffffffffffffffffffffffffffffffffff167fcb0f7ffd78f9aee47a248fae8db181db6eee833039123e026dcbff529522e52a3385600354866040516102bc9493929190610aa3565b60405180910390a26001600360008282546102d79190610aef565b909155505050505050565b60045460009073ffffffffffffffffffffffffffffffffffffffff1661dead141561036e576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601f60248201527f78446f6d61696e4d65737361676553656e646572206973206e6f74207365740060448201526064015b60405180910390fd5b5060045473ffffffffffffffffffffffffffffffffffffffff1690565b60055473ffffffffffffffffffffffffffffffffffffffff167fffffffffffffffffffffffffeeeeffffffffffffffffffffffffffffffffeeef330173ffffffffffffffffffffffffffffffffffffffff161461046a576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602760248201527f50726f7669646564206d65737361676520636f756c64206e6f7420626520766560448201527f7269666965642e000000000000000000000000000000000000000000000000006064820152608401610365565b60006104788585858561078d565b8051602080830191909120600081815260019092526040909120549192509060ff1615610527576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602b60248201527f50726f7669646564206d6573736167652068617320616c72656164792062656560448201527f6e2072656365697665642e0000000000000000000000000000000000000000006064820152608401610365565b73ffffffffffffffffffffffffffffffffffffffff8616734200000000000000000000000000000000000000141561059957600090815260016020819052604090912080547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0016909117905550610787565b600480547fffffffffffffffffffffffff00000000000000000000000000000000000000001673ffffffffffffffffffffffffffffffffffffffff878116919091179091556040516000918816906105f2908790610b2e565b6000604051808303816000865af19150503d806000811461062f576040519150601f19603f3d011682016040523d82523d6000602084013e610634565b606091505b5050600480547fffffffffffffffffffffffff00000000000000000000000000000000000000001661dead1790559050801515600114156106d557600082815260016020819052604080832080547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00169092179091555183917f4641df4a962071e12719d8c8c8e5ac7fc4d97b927346a3d7a335b1f7517e133c91a2610701565b60405182907f99d0e048484baa1b1540b1367cb128acd7ab2946d1ed91ec10e3c85e4bf51b8f90600090a25b600083334360405160200161071893929190610b4a565b604080517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe08184030181529181528151602092830120600090815291829052902080547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00166001179055505050505b50505050565b6060848484846040516024016107a69493929190610b9c565b604080517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe08184030181529190526020810180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff167fcbd4ece9000000000000000000000000000000000000000000000000000000001790529050949350505050565b60006020828403121561083857600080fd5b5035919050565b803573ffffffffffffffffffffffffffffffffffffffff8116811461086357600080fd5b919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b600082601f8301126108a857600080fd5b813567ffffffffffffffff808211156108c3576108c3610868565b604051601f83017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0908116603f0116810190828211818310171561090957610909610868565b8160405283815286602085880101111561092257600080fd5b836020870160208301376000602085830101528094505050505092915050565b60008060006060848603121561095757600080fd5b6109608461083f565b9250602084013567ffffffffffffffff81111561097c57600080fd5b61098886828701610897565b925050604084013563ffffffff811681146109a257600080fd5b809150509250925092565b600080600080608085870312156109c357600080fd5b6109cc8561083f565b93506109da6020860161083f565b9250604085013567ffffffffffffffff8111156109f657600080fd5b610a0287828801610897565b949793965093946060013593505050565b60005b83811015610a2e578181015183820152602001610a16565b838111156107875750506000910152565b60008151808452610a57816020860160208601610a13565b601f017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0169290920160200192915050565b602081526000610a9c6020830184610a3f565b9392505050565b73ffffffffffffffffffffffffffffffffffffffff85168152608060208201526000610ad26080830186610a3f565b905083604083015263ffffffff8316606083015295945050505050565b60008219821115610b29577f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b500190565b60008251610b40818460208701610a13565b9190910192915050565b60008451610b5c818460208901610a13565b60609490941b7fffffffffffffffffffffffffffffffffffffffff0000000000000000000000001691909301908152601481019190915260340192915050565b600073ffffffffffffffffffffffffffffffffffffffff808716835280861660208401525060806040830152610bd56080830185610a3f565b90508260608301529594505050505056fea26469706673582212202e10f5e906e4d6b76a9239c97481d533896c41191186b3ec3ca5feab5203fde664736f6c63430008090033", - "nonce": 0, - "storage": { - "0x0000000000000000000000000000000000000000000000000000000000000003": "0x000000000000000000000000000000000000000000000000000000000001b04c", - "0xaaa0f45b7dc247a658cdea0d67cccd5a57541a072e61d1daada2ff2100a916af": "0x0000000000000000000000000000000000000000000000000000000000000000" - } - }, - "0x45c55bf488d3cb8640f12f63cbedc027e8261e79": { - "balance": "0x0", - "code": "0x608060405234801561001057600080fd5b506004361061021c5760003560e01c806379ba509711610125578063a3e0a7d7116100ad578063cbf1304d1161007c578063cbf1304d146106cf578063d186820614610721578063dd62ed3e14610747578063e6d24bbd14610775578063f9cb1da31461079b5761021c565b8063a3e0a7d714610660578063a9059cbb146102c2578063abb6de951461067d578063c2f04b0a146106a35761021c565b80638ced14df116100f45780638ced14df1461053e5780638da5cb5b1461056a5780638f8495181461057257806395d89b4114610634578063988e65951461063c5761021c565b806379ba5097146104aa57806386f25e4d146104b2578063899ffef4146104ba5780638a25acf4146105125761021c565b806325428394116101a8578063392e53cd11610177578063392e53cd1461046457806353a47bb71461046c578063614d08f81461047457806370a082311461047c57806374185360146104a25761021c565b806325428394146103f25780632af64bd314610418578063313ce567146104205780633913d24b1461043e5761021c565b80631627540c116101ef5780631627540c1461032a578063174495dd1461035057806318160ddd146103765780631a378f0d1461039057806323b872dd146103bc5761021c565b806304f3bcec1461022157806306fdde0314610245578063095ea7b3146102c25780631495552814610302575b600080fd5b6102296107c1565b604080516001600160a01b039092168252519081900360200190f35b61024d6107d0565b6040805160208082528351818301528351919283929083019185019080838360005b8381101561028757818101518382015260200161026f565b50505050905090810190601f1680156102b45780820380516001836020036101000a031916815260200191505b509250505060405180910390f35b6102ee600480360360408110156102d857600080fd5b506001600160a01b03813516906020013561085e565b604080519115158252519081900360200190f35b6103286004803603602081101561031857600080fd5b50356001600160a01b0316610897565b005b6103286004803603602081101561034057600080fd5b50356001600160a01b03166108fd565b6103286004803603602081101561036657600080fd5b50356001600160a01b0316610959565b61037e6109b7565b60408051918252519081900360200190f35b610328600480360360408110156103a657600080fd5b506001600160a01b0381351690602001356109db565b6102ee600480360360608110156103d257600080fd5b506001600160a01b03813581169160208101359091169060400135610b61565b6103286004803603602081101561040857600080fd5b50356001600160a01b0316610c61565b6102ee610cbf565b610428610dc9565b6040805160ff9092168252519081900360200190f35b6103286004803603602081101561045457600080fd5b50356001600160a01b0316610dd2565b6102ee610e38565b610229610e48565b61037e610e57565b61037e6004803603602081101561049257600080fd5b50356001600160a01b0316610e70565b610328610ede565b6103286110a6565b610328611162565b6104c261117f565b60408051602080825283518183015283519192839290830191858101910280838360005b838110156104fe5781810151838201526020016104e6565b505050509050019250505060405180910390f35b61037e6004803603604081101561052857600080fd5b506001600160a01b0381351690602001356111c7565b61037e6004803603604081101561055457600080fd5b506001600160a01b0381351690602001356112e6565b61022961132c565b6103286004803603604081101561058857600080fd5b8101906020810181356401000000008111156105a357600080fd5b8201836020820111156105b557600080fd5b803590602001918460208302840111640100000000831117156105d757600080fd5b9193909290916020810190356401000000008111156105f557600080fd5b82018360208201111561060757600080fd5b8035906020019184602083028401116401000000008311171561062957600080fd5b50909250905061133b565b61024d611643565b61064461169e565b604080516001600160801b039092168252519081900360200190f35b61037e6004803603602081101561067657600080fd5b50356116b2565b6103286004803603602081101561069357600080fd5b50356001600160801b03166116c4565b610328600480360360408110156106b957600080fd5b506001600160a01b0381351690602001356117fb565b6106fb600480360360408110156106e557600080fd5b506001600160a01b03813516906020013561197d565b604080516001600160801b03938416815291909216602082015281519081900390910190f35b6102ee6004803603602081101561073757600080fd5b50356001600160a01b03166119bd565b61037e6004803603604081101561075d57600080fd5b506001600160a01b03813581169160200135166119d2565b61037e6004803603602081101561078b57600080fd5b50356001600160a01b0316611a04565b6102ee600480360360208110156107b157600080fd5b50356001600160a01b0316611a23565b6002546001600160a01b031681565b6008805460408051602060026001851615610100026000190190941693909304601f810184900484028201840190925281815292918301828280156108565780601f1061082b57610100808354040283529160200191610856565b820191906000526020600020905b81548152906001019060200180831161083957829003601f168201915b505050505081565b600060405162461bcd60e51b815260040180806020018281038252602181526020018061215c6021913960400191505060405180910390fd5b61089f611a38565b6001600160a01b038116600081815260046020908152604091829020805460ff19166001908117909155825190815291517f6e713465f03f44982be319e75ac01e2170374630e7bde28a104881e236fb07e39281900390910190a250565b610905611a38565b600180546001600160a01b0383166001600160a01b0319909116811790915560408051918252517f906a1c6bd7e3091ea86693dd029a831c19049ce77f1dce2ce0bab1cacbabce229181900360200190a150565b610961611a38565b6001600160a01b0381166000818152600560209081526040808320805460ff191690558051928352517f6c26d4e15c21227ab0fca84cab71715b23c6c4137b24cbcaedc517b673a1781f9281900390910190a250565b600a5461010090046001600160801b03166000908152600760205260409020545b90565b6109ed6524b9b9bab2b960d11b611a83565b6001600160a01b0316336001600160a01b031614610a3c5760405162461bcd60e51b815260040180806020018281038252602d81526020018061212f602d913960400191505060405180910390fd5b6001600160a01b038216610a97576040805162461bcd60e51b815260206004820152601d60248201527f45524332303a206275726e2066726f6d207a65726f2061646472657373000000604482015290519081900360640190fd5b610aa18282611b67565b600a5461010090046001600160801b0316600090815260076020526040902054610acb9082611d45565b600a5461010090046001600160801b03166000908152600760209081526040808320939093558251848152925191926001600160a01b0386169260008051602061217d833981519152929181900390910190a36040805182815290516001600160a01b038416917fcc16f5dbb4873280815c1ee09dbd06736cffcc184412cf7a71a0fdb75d397ca5919081900360200190a25050565b3360009081526004602052604081205460ff16610baf5760405162461bcd60e51b81526004018080602001828103825260318152602001806120a86031913960400191505060405180910390fd5b6001600160a01b038316610c0a576040805162461bcd60e51b815260206004820152601f60248201527f45524332303a2073656e6420746f20746865207a65726f206164647265737300604482015290519081900360640190fd5b610c148483611b67565b610c1e8383611da2565b826001600160a01b0316846001600160a01b031660008051602061217d833981519152846040518082815260200191505060405180910390a35060019392505050565b610c69611a38565b6001600160a01b0381166000818152600460209081526040808320805460ff191690558051928352517f6e713465f03f44982be319e75ac01e2170374630e7bde28a104881e236fb07e39281900390910190a250565b60006060610ccb61117f565b905060005b8151811015610dc0576000828281518110610ce757fe5b6020908102919091018101516000818152600383526040908190205460025482516321f8a72160e01b81526004810185905292519395506001600160a01b03918216949116926321f8a721926024808201939291829003018186803b158015610d4f57600080fd5b505afa158015610d63573d6000803e3d6000fd5b505050506040513d6020811015610d7957600080fd5b50516001600160a01b0316141580610da657506000818152600360205260409020546001600160a01b0316155b15610db757600093505050506109d8565b50600101610cd0565b50600191505090565b600a5460ff1681565b610dda611a38565b6001600160a01b038116600081815260056020908152604091829020805460ff19166001908117909155825190815291517f6c26d4e15c21227ab0fca84cab71715b23c6c4137b24cbcaedc517b673a1781f9281900390910190a250565b600a54600160881b900460ff1681565b6001546001600160a01b031681565b7153796e74686574697844656274536861726560701b81565b6001600160a01b03811660009081526006602052604081205480610e98576000915050610ed9565b6001600160a01b038316600090815260066020526040902080546000198301908110610ec057fe5b6000918252602090912001546001600160801b03169150505b919050565b6060610ee861117f565b905060005b81518110156110a2576000828281518110610f0457fe5b602090810291909101810151600254604080517f5265736f6c766572206d697373696e67207461726765743a2000000000000000818601526039808201859052825180830390910181526059820180845263dacb2d0160e01b9052605d8201858152607d83019384528151609d84015281519597506000966001600160a01b039095169563dacb2d01958995939492939260bd0191908501908083838c5b83811015610fba578181015183820152602001610fa2565b50505050905090810190601f168015610fe75780820380516001836020036101000a031916815260200191505b50935050505060206040518083038186803b15801561100557600080fd5b505afa158015611019573d6000803e3d6000fd5b505050506040513d602081101561102f57600080fd5b505160008381526003602090815260409182902080546001600160a01b0319166001600160a01b03851690811790915582518681529182015281519293507f88a93678a3692f6789d9546fc621bf7234b101ddb7d4fe479455112831b8aa68929081900390910190a15050600101610eed565b5050565b6001546001600160a01b031633146110ef5760405162461bcd60e51b8152600401808060200182810382526035815260200180611fe36035913960400191505060405180910390fd5b600054600154604080516001600160a01b03938416815292909116602083015280517fb532073b38c83145e3e5135377a08bf9aab55bc0fd7c1179cd4fb995d2a5159c9281900390910190a160018054600080546001600160a01b03199081166001600160a01b03841617909155169055565b61116a611a38565b600a805460ff60881b1916600160881b179055565b604080516001808252818301909252606091602080830190803883390190505090506524b9b9bab2b960d11b816000815181106111b857fe5b60200260200101818152505090565b6001600160a01b03821660009081526006602052604081205481601e82116111f05760006111f5565b601e82035b905060001982015b818112611299576001600160a01b038616600090815260066020526040902080548691908390811061122b57fe5b600091825260209091200154600160801b90046001600160801b031611611290576001600160a01b038616600090815260066020526040902080548290811061127057fe5b6000918252602090912001546001600160801b031693506112e092505050565b600019016111fd565b600081126112d85760405162461bcd60e51b815260040180806020018281038252602f815260200180612018602f913960400191505060405180910390fd5b600093505050505b92915050565b6000806112f384846111c7565b9050806113045760009150506112e0565b60008381526007602052604090205461132490829063ffffffff611e9416565b949350505050565b6000546001600160a01b031681565b611343611a38565b600a54600160881b900460ff161561138c5760405162461bcd60e51b81526004018080602001828103825260358152602001806120fa6035913960400191505060405180910390fd5b600a5461010090046001600160801b0316600090815260076020526040812054905b8481101561161c5760006113dc8787848181106113c757fe5b905060200201356001600160a01b0316610e70565b90508484838181106113ea57fe5b905060200201358110156114ff5760008186868581811061140757fe5b9050602002013503905061143688888581811061142057fe5b905060200201356001600160a01b031682611da2565b611446848263ffffffff611ec516565b935087878481811061145457fe5b905060200201356001600160a01b03166001600160a01b03167f0f6798a560793a54c3bcfe86a93cde1e73087d944c0ea20544137d4121396885826040518082815260200191505060405180910390a28787848181106114b057fe5b905060200201356001600160a01b03166001600160a01b031660006001600160a01b031660008051602061217d833981519152836040518082815260200191505060405180910390a350611613565b84848381811061150b57fe5b9050602002013581111561161357600085858481811061152757fe5b905060200201358203905061155788888581811061154157fe5b905060200201356001600160a01b031682611b67565b611567848263ffffffff611d4516565b935087878481811061157557fe5b905060200201356001600160a01b03166001600160a01b03167fcc16f5dbb4873280815c1ee09dbd06736cffcc184412cf7a71a0fdb75d397ca5826040518082815260200191505060405180910390a260008888858181106115d357fe5b905060200201356001600160a01b03166001600160a01b031660008051602061217d833981519152836040518082815260200191505060405180910390a3505b506001016113ae565b50600a5461010090046001600160801b031660009081526007602052604090205550505050565b6009805460408051602060026001851615610100026000190190941693909304601f810184900484028201840190925281815292918301828280156108565780601f1061082b57610100808354040283529160200191610856565b600a5461010090046001600160801b031681565b60076020526000908152604090205481565b3360009081526005602052604090205460ff168061170457506116ef6524b9b9bab2b960d11b611a83565b6001600160a01b0316336001600160a01b0316145b61173f5760405162461bcd60e51b815260040180806020018281038252602e81526020018061219d602e913960400191505060405180910390fd5b600a546001600160801b036101009091048116908216116117a7576040805162461bcd60e51b815260206004820152601e60248201527f706572696f64206964206d75737420616c7761797320696e6372656173650000604482015290519081900360640190fd5b600a8054610100908190046001600160801b03908116600090815260076020526040808220549590921680825291902093909355815470ffffffffffffffffffffffffffffffff0019169202919091179055565b61180d6524b9b9bab2b960d11b611a83565b6001600160a01b0316336001600160a01b03161461185c5760405162461bcd60e51b815260040180806020018281038252602d81526020018061212f602d913960400191505060405180910390fd5b6001600160a01b0382166118b7576040805162461bcd60e51b815260206004820152601f60248201527f45524332303a206d696e7420746f20746865207a65726f206164647265737300604482015290519081900360640190fd5b6118c18282611da2565b600a5461010090046001600160801b03166000908152600760205260409020546118eb9082611ec5565b600a5461010090046001600160801b0316600090815260076020908152604080832093909355825184815292516001600160a01b0386169360008051602061217d83398151915292908290030190a36040805182815290516001600160a01b038416917f0f6798a560793a54c3bcfe86a93cde1e73087d944c0ea20544137d4121396885919081900360200190a25050565b6006602052816000526040600020818154811061199657fe5b6000918252602090912001546001600160801b038082169350600160801b90910416905082565b60046020526000908152604090205460ff1681565b6001600160a01b03811660009081526004602052604081205460ff16156119fc57506000196112e0565b5060006112e0565b600a546000906112e090839061010090046001600160801b03166112e6565b60056020526000908152604090205460ff1681565b6000546001600160a01b03163314611a815760405162461bcd60e51b815260040180806020018281038252602f815260200180612079602f913960400191505060405180910390fd5b565b600081815260036020908152604080832054815170026b4b9b9b4b7339030b2323932b9b99d1607d1b9381019390935260318084018690528251808503909101815260519093019091526001600160a01b03169081611b605760405162461bcd60e51b81526004018080602001828103825283818151815260200191508051906020019080838360005b83811015611b25578181015183820152602001611b0d565b50505050905090810190601f168015611b525780820380516001836020036101000a031916815260200191505b509250505060405180910390fd5b5092915050565b6001600160a01b03821660009081526006602052604090205480611bbc5760405162461bcd60e51b81526004018080602001828103825260328152602001806120476032913960400191505060405180910390fd5b6001600160a01b03831660009081526006602052604081208054611c0b9185916000198601908110611bea57fe5b6000918252602090912001546001600160801b03169063ffffffff611d4516565b600a546001600160a01b038616600090815260066020526040902080549293506101009091046001600160801b0316916000198501908110611c4957fe5b600091825260209091200154600160801b90046001600160801b031614611cea576001600160a01b038416600090815260066020908152604080832081518083019092526001600160801b038086168352600a546101009004811683850190815282546001810184559286529390942091519101805492518416600160801b029184166001600160801b031990931692909217909216919091179055611d3f565b6001600160a01b038416600090815260066020526040902080548291906000198501908110611d1557fe5b600091825260209091200180546001600160801b0319166001600160801b03929092169190911790555b50505050565b600082821115611d9c576040805162461bcd60e51b815260206004820152601e60248201527f536166654d6174683a207375627472616374696f6e206f766572666c6f770000604482015290519081900360640190fd5b50900390565b6001600160a01b03821660009081526006602052604090205480611e40576001600160a01b038316600090815260066020908152604080832081518083019092526001600160801b038087168352600a546101009004811683850190815282546001810184559286529390942091519101805492518416600160801b029184166001600160801b031990931692909217909216919091179055611e8f565b6001600160a01b03831660009081526006602052604081208054611c0b9185916000198601908110611e6e57fe5b6000918252602090912001546001600160801b03169063ffffffff611ec516565b505050565b6000611ebe82611eb285670de0b6b3a764000063ffffffff611f1f16565b9063ffffffff611f7816565b9392505050565b600082820183811015611ebe576040805162461bcd60e51b815260206004820152601b60248201527f536166654d6174683a206164646974696f6e206f766572666c6f770000000000604482015290519081900360640190fd5b600082611f2e575060006112e0565b82820282848281611f3b57fe5b0414611ebe5760405162461bcd60e51b81526004018080602001828103825260218152602001806120d96021913960400191505060405180910390fd5b6000808211611fce576040805162461bcd60e51b815260206004820152601a60248201527f536166654d6174683a206469766973696f6e206279207a65726f000000000000604482015290519081900360640190fd5b6000828481611fd957fe5b0494935050505056fe596f75206d757374206265206e6f6d696e61746564206265666f726520796f752063616e20616363657074206f776e65727368697053796e7468657469784465627453686172653a206e6f7420666f756e6420696e20726563656e7420686973746f727953796e7468657469784465627453686172653a206163636f756e7420686173206e6f20736861726520746f206465647563744f6e6c792074686520636f6e7472616374206f776e6572206d617920706572666f726d207468697320616374696f6e53796e7468657469784465627453686172653a206f6e6c792062726f6b6572732063616e207472616e7366657246726f6d536166654d6174683a206d756c7469706c69636174696f6e206f766572666c6f7753796e746865746978446562743a206f6e6c792063616c6c61626c65207768696c65207374696c6c20696e697469616c697a696e6753796e7468657469784465627453686172653a206f6e6c79206973737565722063616e206d696e742f6275726e646562742073686172657320617265206e6f74207472616e736665727261626c65ddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef53796e7468657469784465627453686172653a206e6f7420617574686f72697a656420746f20736e617073686f74a265627a7a72315820e11b43536dd21a59bb3dcb49ad27bfd66750e25ebf7094c5f21da77098b7418064736f6c63430005100032", - "nonce": 1, - "storage": { - "0x5efa3cce09f413ff4b4a2b89e1ad448fa2e23e2b62becca318b5647c8dcbc04d": "0x0000000000000000000000000000000000000000000000000000000000000000" - } - }, - "0x47649022380d182da8010ae5d257fea4227b21ff": { - "balance": "0x0", - "code": "0x608060405234801561001057600080fd5b50600436106101c35760003560e01c80638ca0adaf116100f9578063c89eb56211610097578063d994502d11610071578063d994502d146109c2578063f7833c5d146109f9578063f9c39d2f14610a1c578063fdfc4c1314610ae1576101c3565b8063c89eb562146108b7578063d658d2e91461097c578063d71a9b0114610999576101c3565b8063ab15985d116100d3578063ab15985d146106e5578063b67fa7ed146107aa578063c13a2b0c1461081f578063c4f610ed14610894576101c3565b80638ca0adaf1461062a5780638f6b95a31461069f5780639ee5955a146106c2576101c3565b806335ab2708116101665780634dca0978116101405780634dca0978146105345780635bda91e2146105665780636a59e495146105915780638408a5e5146105b5576101c3565b806335ab2708146104215780633bd6ad89146104445780633f28a6fc14610509576101c3565b80631625e3ef116101a25780631625e3ef1461037d57806318f662ed146103a05780631d5b277f146103c357806323257c2b146103ec576101c3565b80624b62d6146101c857806303cdc017146101f3578063142a391e146102b8575b600080fd5b6101f1600480360360608110156101de57600080fd5b5080359060208101359060400135610b04565b005b6101f16004803603606081101561020957600080fd5b81359190810190604081016020820135600160201b81111561022a57600080fd5b82018360208201111561023c57600080fd5b803590602001918460208302840111600160201b8311171561025d57600080fd5b919390929091602081019035600160201b81111561027a57600080fd5b82018360208201111561028c57600080fd5b803590602001918460208302840111600160201b831117156102ad57600080fd5b509092509050610bf4565b61032d600480360360408110156102ce57600080fd5b81359190810190604081016020820135600160201b8111156102ef57600080fd5b82018360208201111561030157600080fd5b803590602001918460208302840111600160201b8311171561032257600080fd5b509092509050610d60565b60408051602080825283518183015283519192839290830191858101910280838360005b83811015610369578181015183820152602001610351565b505050509050019250505060405180910390f35b6101f16004803603604081101561039357600080fd5b5080359060200135610e07565b6101f1600480360360408110156103b657600080fd5b5080359060200135610f7b565b6101f1600480360360608110156103d957600080fd5b50803590602081013590604001356110e4565b61040f6004803603604081101561040257600080fd5b50803590602001356111cd565b60408051918252519081900360200190f35b6101f16004803603604081101561043757600080fd5b50803590602001356111f4565b6101f16004803603606081101561045a57600080fd5b81359190810190604081016020820135600160201b81111561047b57600080fd5b82018360208201111561048d57600080fd5b803590602001918460208302840111600160201b831117156104ae57600080fd5b919390929091602081019035600160201b8111156104cb57600080fd5b8201836020820111156104dd57600080fd5b803590602001918460208302840111600160201b831117156104fe57600080fd5b50909250905061135d565b6101f16004803603606081101561051f57600080fd5b508035906020810135906040013515156114c8565b6101f16004803603606081101561054a57600080fd5b50803590602081013590604001356001600160a01b03166115b1565b6101f16004803603606081101561057c57600080fd5b5080359060208101359060400135151561169a565b61059961184c565b604080516001600160a01b039092168252519081900360200190f35b61032d600480360360408110156105cb57600080fd5b81359190810190604081016020820135600160201b8111156105ec57600080fd5b8201836020820111156105fe57600080fd5b803590602001918460208302840111600160201b8311171561061f57600080fd5b50909250905061185b565b61032d6004803603604081101561064057600080fd5b81359190810190604081016020820135600160201b81111561066157600080fd5b82018360208201111561067357600080fd5b803590602001918460208302840111600160201b8311171561069457600080fd5b5090925090506118f7565b6101f1600480360360408110156106b557600080fd5b50803590602001356119b3565b610599600480360360408110156106d857600080fd5b5080359060200135611b32565b6101f1600480360360608110156106fb57600080fd5b81359190810190604081016020820135600160201b81111561071c57600080fd5b82018360208201111561072e57600080fd5b803590602001918460208302840111600160201b8311171561074f57600080fd5b919390929091602081019035600160201b81111561076c57600080fd5b82018360208201111561077e57600080fd5b803590602001918460208302840111600160201b8311171561079f57600080fd5b509092509050611b62565b61032d600480360360408110156107c057600080fd5b81359190810190604081016020820135600160201b8111156107e157600080fd5b8201836020820111156107f357600080fd5b803590602001918460208302840111600160201b8311171561081457600080fd5b509092509050611cc4565b61032d6004803603604081101561083557600080fd5b81359190810190604081016020820135600160201b81111561085657600080fd5b82018360208201111561086857600080fd5b803590602001918460208302840111600160201b8311171561088957600080fd5b509092509050611d60565b61040f600480360360408110156108aa57600080fd5b5080359060200135611e0e565b6101f1600480360360608110156108cd57600080fd5b81359190810190604081016020820135600160201b8111156108ee57600080fd5b82018360208201111561090057600080fd5b803590602001918460208302840111600160201b8311171561092157600080fd5b919390929091602081019035600160201b81111561093e57600080fd5b82018360208201111561095057600080fd5b803590602001918460208302840111600160201b8311171561097157600080fd5b509092509050611e35565b61040f6004803603602081101561099257600080fd5b5035611f97565b6101f1600480360360608110156109af57600080fd5b5080359060208101359060400135611fa9565b6109e5600480360360408110156109d857600080fd5b5080359060200135612092565b604080519115158252519081900360200190f35b61040f60048036036040811015610a0f57600080fd5b50803590602001356120bc565b6101f160048036036060811015610a3257600080fd5b81359190810190604081016020820135600160201b811115610a5357600080fd5b820183602082011115610a6557600080fd5b803590602001918460208302840111600160201b83111715610a8657600080fd5b919390929091602081019035600160201b811115610aa357600080fd5b820183602082011115610ab557600080fd5b803590602001918460208302840111600160201b83111715610ad657600080fd5b5090925090506120e3565b6101f160048036036040811015610af757600080fd5b5080359060200135612247565b600080546040805163dacb2d0160e01b815260048101878152602482019283526028604483018190528895946001600160a01b03169363dacb2d019387939260649091019061267482396040019250505060206040518083038186803b158015610b6d57600080fd5b505afa158015610b81573d6000803e3d6000fd5b505050506040513d6020811015610b9757600080fd5b505190506001600160a01b0381163314610be25760405162461bcd60e51b815260040180806020018281038252602e81526020018061269c602e913960400191505060405180910390fd5b610bed8585856123b0565b5050505050565b600080546040805163dacb2d0160e01b815260048101898152602482019283526028604483018190528a95946001600160a01b03169363dacb2d019387939260649091019061267482396040019250505060206040518083038186803b158015610c5d57600080fd5b505afa158015610c71573d6000803e3d6000fd5b505050506040513d6020811015610c8757600080fd5b505190506001600160a01b0381163314610cd25760405162461bcd60e51b815260040180806020018281038252602e81526020018061269c602e913960400191505060405180910390fd5b848314610d14576040805162461bcd60e51b815260206004820152601860248201526000805160206126ca833981519152604482015290519081900360640190fd5b60005b85811015610d5657610d4e88888884818110610d2f57fe5b90506020020135878785818110610d4257fe5b90506020020135612421565b600101610d17565b5050505050505050565b60608083839050604051908082528060200260200182016040528015610d90578160200160208202803883390190505b506000868152600160209081526040808320548352600390915281209192505b84811015610dfc57816000878784818110610dc757fe5b90506020020135815260200190815260200160002054838281518110610de957fe5b6020908102919091010152600101610db0565b509095945050505050565b600080546040805163dacb2d0160e01b815260048101868152602482019283526028604483018190528795946001600160a01b03169363dacb2d019387939260649091019061267482396040019250505060206040518083038186803b158015610e7057600080fd5b505afa158015610e84573d6000803e3d6000fd5b505050506040513d6020811015610e9a57600080fd5b505190506001600160a01b0381163314610ee55760405162461bcd60e51b815260040180806020018281038252602e81526020018061269c602e913960400191505060405180910390fd5b60008481526001602090815260408083205483526005825280832086845282529182902054825187815291820186905260ff168015158284015291517f321123223c2c7bffd7484ae8fb80c6eb45aa5537df0a621c47833ab9376a4a9c9181900360600190a15050506000918252600160209081526040808420548452600582528084209284529190529020805460ff19169055565b600080546040805163dacb2d0160e01b815260048101868152602482019283526028604483018190528795946001600160a01b03169363dacb2d019387939260649091019061267482396040019250505060206040518083038186803b158015610fe457600080fd5b505afa158015610ff8573d6000803e3d6000fd5b505050506040513d602081101561100e57600080fd5b505190506001600160a01b03811633146110595760405162461bcd60e51b815260040180806020018281038252602e81526020018061269c602e913960400191505060405180910390fd5b60008481526001602090815260408083205483526002825280832086845282529182902054825187815291820186905281830181905291517f8a6b612c1a1e056bc504f34fe56106a878fca2d1a50be35360d02ac39d4d46629181900360600190a1505050600091825260016020908152604080842054845260028252808420928452919052812055565b600080546040805163dacb2d0160e01b815260048101878152602482019283526028604483018190528895946001600160a01b03169363dacb2d019387939260649091019061267482396040019250505060206040518083038186803b15801561114d57600080fd5b505afa158015611161573d6000803e3d6000fd5b505050506040513d602081101561117757600080fd5b505190506001600160a01b03811633146111c25760405162461bcd60e51b815260040180806020018281038252602e81526020018061269c602e913960400191505060405180910390fd5b610bed858585612421565b60009182526001602090815260408084205484526002825280842092845291905290205490565b600080546040805163dacb2d0160e01b815260048101868152602482019283526028604483018190528795946001600160a01b03169363dacb2d019387939260649091019061267482396040019250505060206040518083038186803b15801561125d57600080fd5b505afa158015611271573d6000803e3d6000fd5b505050506040513d602081101561128757600080fd5b505190506001600160a01b03811633146112d25760405162461bcd60e51b815260040180806020018281038252602e81526020018061269c602e913960400191505060405180910390fd5b60008481526001602090815260408083205483526006825280832086845282529182902054825187815291820186905281830181905291517f1f751825a531bf2a176e42d5cb792bb7228163cf53e36b033509ccbe869cfd939181900360600190a1505050600091825260016020908152604080842054845260068252808420928452919052812055565b600080546040805163dacb2d0160e01b815260048101898152602482019283526028604483018190528a95946001600160a01b03169363dacb2d019387939260649091019061267482396040019250505060206040518083038186803b1580156113c657600080fd5b505afa1580156113da573d6000803e3d6000fd5b505050506040513d60208110156113f057600080fd5b505190506001600160a01b038116331461143b5760405162461bcd60e51b815260040180806020018281038252602e81526020018061269c602e913960400191505060405180910390fd5b84831461147d576040805162461bcd60e51b815260206004820152601860248201526000805160206126ca833981519152604482015290519081900360640190fd5b60005b85811015610d56576114c08888888481811061149857fe5b905060200201358787858181106114ab57fe5b905060200201356001600160a01b0316612492565b600101611480565b600080546040805163dacb2d0160e01b815260048101878152602482019283526028604483018190528895946001600160a01b03169363dacb2d019387939260649091019061267482396040019250505060206040518083038186803b15801561153157600080fd5b505afa158015611545573d6000803e3d6000fd5b505050506040513d602081101561155b57600080fd5b505190506001600160a01b03811633146115a65760405162461bcd60e51b815260040180806020018281038252602e81526020018061269c602e913960400191505060405180910390fd5b610bed85858561251b565b600080546040805163dacb2d0160e01b815260048101878152602482019283526028604483018190528895946001600160a01b03169363dacb2d019387939260649091019061267482396040019250505060206040518083038186803b15801561161a57600080fd5b505afa15801561162e573d6000803e3d6000fd5b505050506040513d602081101561164457600080fd5b505190506001600160a01b038116331461168f5760405162461bcd60e51b815260040180806020018281038252602e81526020018061269c602e913960400191505060405180910390fd5b610bed858585612492565b600080546040805163dacb2d0160e01b815260048101878152602482019283526028604483018190528895946001600160a01b03169363dacb2d019387939260649091019061267482396040019250505060206040518083038186803b15801561170357600080fd5b505afa158015611717573d6000803e3d6000fd5b505050506040513d602081101561172d57600080fd5b505190506001600160a01b03811633146117785760405162461bcd60e51b815260040180806020018281038252602e81526020018061269c602e913960400191505060405180910390fd5b6000858152600160205260409020546117d8576040805162461bcd60e51b815260206004820152601d60248201527f43616e6e6f74206d69677261746520656d70747920636f6e7472616374000000604482015290519081900360640190fd5b600085815260016020526040808220548683529120558215611804576000858152600160205260408120555b60408051868152602081018690528415158183015290517fa3db9c909daa141b61562c797dae4dc4b3d7751686068c98111db87b2a8c374c9181900360600190a15050505050565b6000546001600160a01b031681565b6060808383905060405190808252806020026020018201604052801561188b578160200160208202803883390190505b506000868152600160209081526040808320548352600690915281209192505b84811015610dfc578160008787848181106118c257fe5b905060200201358152602001908152602001600020548382815181106118e457fe5b60209081029190910101526001016118ab565b60608083839050604051908082528060200260200182016040528015611927578160200160208202803883390190505b506000868152600160209081526040808320548352600490915281209192505b84811015610dfc5781600087878481811061195e57fe5b90506020020135815260200190815260200160002060009054906101000a90046001600160a01b031683828151811061199357fe5b6001600160a01b0390921660209283029190910190910152600101611947565b600080546040805163dacb2d0160e01b815260048101868152602482019283526028604483018190528795946001600160a01b03169363dacb2d019387939260649091019061267482396040019250505060206040518083038186803b158015611a1c57600080fd5b505afa158015611a30573d6000803e3d6000fd5b505050506040513d6020811015611a4657600080fd5b505190506001600160a01b0381163314611a915760405162461bcd60e51b815260040180806020018281038252602e81526020018061269c602e913960400191505060405180910390fd5b6000848152600160209081526040808320548352600482528083208684528252918290205482518781529182018690526001600160a01b031681830181905291517fec1140277b8f20820dc76b92216489238a207d5f22c964099303820fbd2bdf669181900360600190a1505050600091825260016020908152604080842054845260048252808420928452919052902080546001600160a01b0319169055565b6000918252600160209081526040808420548452600482528084209284529190529020546001600160a01b031690565b600080546040805163dacb2d0160e01b815260048101898152602482019283526028604483018190528a95946001600160a01b03169363dacb2d019387939260649091019061267482396040019250505060206040518083038186803b158015611bcb57600080fd5b505afa158015611bdf573d6000803e3d6000fd5b505050506040513d6020811015611bf557600080fd5b505190506001600160a01b0381163314611c405760405162461bcd60e51b815260040180806020018281038252602e81526020018061269c602e913960400191505060405180910390fd5b848314611c82576040805162461bcd60e51b815260206004820152601860248201526000805160206126ca833981519152604482015290519081900360640190fd5b60005b85811015610d5657611cbc88888884818110611c9d57fe5b90506020020135878785818110611cb057fe5b9050602002013561259a565b600101611c85565b60608083839050604051908082528060200260200182016040528015611cf4578160200160208202803883390190505b506000868152600160209081526040808320548352600290915281209192505b84811015610dfc57816000878784818110611d2b57fe5b90506020020135815260200190815260200160002054838281518110611d4d57fe5b6020908102919091010152600101611d14565b60608083839050604051908082528060200260200182016040528015611d90578160200160208202803883390190505b506000868152600160209081526040808320548352600590915281209192505b84811015610dfc57816000878784818110611dc757fe5b90506020020135815260200190815260200160002060009054906101000a900460ff16838281518110611df657fe5b91151560209283029190910190910152600101611db0565b60009182526001602090815260408084205484526003825280842092845291905290205490565b600080546040805163dacb2d0160e01b815260048101898152602482019283526028604483018190528a95946001600160a01b03169363dacb2d019387939260649091019061267482396040019250505060206040518083038186803b158015611e9e57600080fd5b505afa158015611eb2573d6000803e3d6000fd5b505050506040513d6020811015611ec857600080fd5b505190506001600160a01b0381163314611f135760405162461bcd60e51b815260040180806020018281038252602e81526020018061269c602e913960400191505060405180910390fd5b848314611f55576040805162461bcd60e51b815260206004820152601860248201526000805160206126ca833981519152604482015290519081900360640190fd5b60005b85811015610d5657611f8f88888884818110611f7057fe5b90506020020135878785818110611f8357fe5b905060200201356123b0565b600101611f58565b60016020526000908152604090205481565b600080546040805163dacb2d0160e01b815260048101878152602482019283526028604483018190528895946001600160a01b03169363dacb2d019387939260649091019061267482396040019250505060206040518083038186803b15801561201257600080fd5b505afa158015612026573d6000803e3d6000fd5b505050506040513d602081101561203c57600080fd5b505190506001600160a01b03811633146120875760405162461bcd60e51b815260040180806020018281038252602e81526020018061269c602e913960400191505060405180910390fd5b610bed85858561259a565b60009182526001602090815260408084205484526005825280842092845291905290205460ff1690565b60009182526001602090815260408084205484526006825280842092845291905290205490565b600080546040805163dacb2d0160e01b815260048101898152602482019283526028604483018190528a95946001600160a01b03169363dacb2d019387939260649091019061267482396040019250505060206040518083038186803b15801561214c57600080fd5b505afa158015612160573d6000803e3d6000fd5b505050506040513d602081101561217657600080fd5b505190506001600160a01b03811633146121c15760405162461bcd60e51b815260040180806020018281038252602e81526020018061269c602e913960400191505060405180910390fd5b848314612203576040805162461bcd60e51b815260206004820152601860248201526000805160206126ca833981519152604482015290519081900360640190fd5b60005b85811015610d565761223f8888888481811061221e57fe5b9050602002013587878581811061223157fe5b90506020020135151561251b565b600101612206565b600080546040805163dacb2d0160e01b815260048101868152602482019283526028604483018190528795946001600160a01b03169363dacb2d019387939260649091019061267482396040019250505060206040518083038186803b1580156122b057600080fd5b505afa1580156122c4573d6000803e3d6000fd5b505050506040513d60208110156122da57600080fd5b505190506001600160a01b03811633146123255760405162461bcd60e51b815260040180806020018281038252602e81526020018061269c602e913960400191505060405180910390fd5b60008481526001602090815260408083205483526003825280832086845282529182902054825187815291820186905281830181905291517f78962c711b5655608c554689ba42e4890d9e5d3f590b99842612ad39cd7ae0ae9181900360600190a1505050600091825260016020908152604080842054845260038252808420928452919052812055565b80600660006123be8661260b565b815260208082019290925260409081016000908120868252835281902092909255815185815290810184905280820183905290517f961abb018d8a303304c9f1ff1f306c7493a8b68b381bbe4e9a3abf9588a952809181900360600190a1505050565b806002600061242f8661260b565b815260208082019290925260409081016000908120868252835281902092909255815185815290810184905280820183905290517f60738523f766167cfd2310c61593dc795bc9d77de9276ed7e0c514df55e0a2c99181900360600190a1505050565b80600460006124a08661260b565b815260208082019290925260409081016000908120868252835281902080546001600160a01b0319166001600160a01b0394851617905580518681529182018590529183168183015290517f524fb430ecbfd4606a947f9ae445dbf7c9703944cf928789b86f3a8aad639365916060908290030190a1505050565b80600560006125298661260b565b8152602080820192909252604090810160009081208682528352819020805460ff19169315159390931790925581518581529081018490528215158183015290517f9c94ad4cfff55907724cb65340f342d3897dd884e6cd3c2d3777087191d5eb7b916060908290030190a1505050565b80600360006125a88661260b565b815260208082019290925260409081016000908120868252835281902092909255815185815290810184905280820183905290517f0d8877f604dfe262a8ac3904781814f022156c9341af779608a2ae0beef1906c9181900360600190a1505050565b6000818152600160205260408120548061266d5750604080513360601b60208083019190915260348201859052436054808401919091528351808403909101815260749092018352815191810191909120600085815260019092529190208190555b9291505056fe43616e6e6f742066696e6420636f6e747261637420696e2041646472657373205265736f6c76657243616e206f6e6c7920626520696e766f6b65642062792074686520636f6e6669677572656420636f6e7472616374496e707574206c656e67746873206d757374206d617463680000000000000000a265627a7a723158202a2a3d4e260aacb77fdc759d8da358d0d895da39b8739ea8b722a9a4fc1b630c64736f6c63430005100032", - "nonce": 1, - "storage": { - "0x43f6887b8391b6c28fc4d03a96ce4ebeb1f51e4ef31e72da3f30d8c3cb05864b": "0x0000000000000000000000000000000000000000000000000000000000001518", - "0xa240b2df818dc814fbbd4a66bf613b9ed83aa1ae35d310a3d7664caf24a689a4": "0x00000000000000000000000000000000000000000000000000000000002dc6c0", - "0xad77bf801726b2c83e9e3fa10f319bf2df99397a561126e8c3df0f7596519f75": "0xff00ba2347f8ab953c30a9fcb5c233c00aa7df3c879aebfe685e17759175759f", - "0xb9575a404391813baec87483ccc8b5d7bbbda672eff4e43ec067850a45e02cb0": "0x00000000000000000000000000000000000000000000000003f70fa11c48cc00" - } - }, - "0x8700daec35af8ff88c16bdf0418774cb3d7599b4": { - "balance": "0x0", - "code": "0x6080604052600436106100f35760003560e01c8063776d1a011161008a57806395d89b411161005957806395d89b4114610473578063a9059cbb14610488578063d4b83992146104c1578063dd62ed3e146104d6576100f3565b8063776d1a011461038157806379ba5097146103b45780638da5cb5b146103c9578063907dff97146103de576100f3565b806323b872dd116100c657806323b872dd146102af578063313ce567146102f257806353a47bb71461031d57806370a082311461034e576100f3565b806306fdde031461017c578063095ea7b3146102065780631627540c1461025357806318160ddd14610288575b60025460408051635e33fc1960e11b815233600482015290516001600160a01b039092169163bc67f8329160248082019260009290919082900301818387803b15801561013f57600080fd5b505af1158015610153573d6000803e3d6000fd5b5050505060405136600082376000803683346002545af13d6000833e80610178573d82fd5b3d82f35b34801561018857600080fd5b50610191610511565b6040805160208082528351818301528351919283929083019185019080838360005b838110156101cb5781810151838201526020016101b3565b50505050905090810190601f1680156101f85780820380516001836020036101000a031916815260200191505b509250505060405180910390f35b34801561021257600080fd5b5061023f6004803603604081101561022957600080fd5b506001600160a01b038135169060200135610648565b604080519115158252519081900360200190f35b34801561025f57600080fd5b506102866004803603602081101561027657600080fd5b50356001600160a01b0316610736565b005b34801561029457600080fd5b5061029d610792565b60408051918252519081900360200190f35b3480156102bb57600080fd5b5061023f600480360360608110156102d257600080fd5b506001600160a01b03813581169160208101359091169060400135610808565b3480156102fe57600080fd5b506103076108ff565b6040805160ff9092168252519081900360200190f35b34801561032957600080fd5b50610332610944565b604080516001600160a01b039092168252519081900360200190f35b34801561035a57600080fd5b5061029d6004803603602081101561037157600080fd5b50356001600160a01b0316610953565b34801561038d57600080fd5b50610286600480360360208110156103a457600080fd5b50356001600160a01b03166109d6565b3480156103c057600080fd5b50610286610a32565b3480156103d557600080fd5b50610332610aee565b3480156103ea57600080fd5b50610286600480360360c081101561040157600080fd5b81019060208101813564010000000081111561041c57600080fd5b82018360208201111561042e57600080fd5b8035906020019184600183028401116401000000008311171561045057600080fd5b919350915080359060208101359060408101359060608101359060800135610afd565b34801561047f57600080fd5b50610191610c06565b34801561049457600080fd5b5061023f600480360360408110156104ab57600080fd5b506001600160a01b038135169060200135610c4b565b3480156104cd57600080fd5b50610332610d04565b3480156104e257600080fd5b5061029d600480360360408110156104f957600080fd5b506001600160a01b0381358116916020013516610d13565b600254604080516306fdde0360e01b815290516060926001600160a01b0316916306fdde03916004808301926000929190829003018186803b15801561055657600080fd5b505afa15801561056a573d6000803e3d6000fd5b505050506040513d6000823e601f3d908101601f19168201604052602081101561059357600080fd5b81019080805160405193929190846401000000008211156105b357600080fd5b9083019060208201858111156105c857600080fd5b82516401000000008111828201881017156105e257600080fd5b82525081516020918201929091019080838360005b8381101561060f5781810151838201526020016105f7565b50505050905090810190601f16801561063c5780820380516001836020036101000a031916815260200191505b50604052505050905090565b60025460408051635e33fc1960e11b815233600482015290516000926001600160a01b03169163bc67f832916024808301928692919082900301818387803b15801561069357600080fd5b505af11580156106a7573d6000803e3d6000fd5b50506002546040805163095ea7b360e01b81526001600160a01b03888116600483015260248201889052915191909216935063095ea7b3925060448083019260209291908290030181600087803b15801561070157600080fd5b505af1158015610715573d6000803e3d6000fd5b505050506040513d602081101561072b57600080fd5b506001949350505050565b61073e610d9f565b600180546001600160a01b0383166001600160a01b0319909116811790915560408051918252517f906a1c6bd7e3091ea86693dd029a831c19049ce77f1dce2ce0bab1cacbabce229181900360200190a150565b600254604080516318160ddd60e01b815290516000926001600160a01b0316916318160ddd916004808301926020929190829003018186803b1580156107d757600080fd5b505afa1580156107eb573d6000803e3d6000fd5b505050506040513d602081101561080157600080fd5b5051905090565b60025460408051635e33fc1960e11b815233600482015290516000926001600160a01b03169163bc67f832916024808301928692919082900301818387803b15801561085357600080fd5b505af1158015610867573d6000803e3d6000fd5b5050600254604080516323b872dd60e01b81526001600160a01b03898116600483015288811660248301526044820188905291519190921693506323b872dd925060648083019260209291908290030181600087803b1580156108c957600080fd5b505af11580156108dd573d6000803e3d6000fd5b505050506040513d60208110156108f357600080fd5b50600195945050505050565b6002546040805163313ce56760e01b815290516000926001600160a01b03169163313ce567916004808301926020929190829003018186803b1580156107d757600080fd5b6001546001600160a01b031681565b600254604080516370a0823160e01b81526001600160a01b038481166004830152915160009392909216916370a0823191602480820192602092909190829003018186803b1580156109a457600080fd5b505afa1580156109b8573d6000803e3d6000fd5b505050506040513d60208110156109ce57600080fd5b505192915050565b6109de610d9f565b600280546001600160a01b0383166001600160a01b0319909116811790915560408051918252517f814250a3b8c79fcbe2ead2c131c952a278491c8f4322a79fe84b5040a810373e9181900360200190a150565b6001546001600160a01b03163314610a7b5760405162461bcd60e51b8152600401808060200182810382526035815260200180610deb6035913960400191505060405180910390fd5b600054600154604080516001600160a01b03938416815292909116602083015280517fb532073b38c83145e3e5135377a08bf9aab55bc0fd7c1179cd4fb995d2a5159c9281900390910190a160018054600080546001600160a01b03199081166001600160a01b03841617909155169055565b6000546001600160a01b031681565b6002546001600160a01b03163314610b53576040805162461bcd60e51b8152602060048201526014602482015273135d5cdd081899481c1c9bde1e481d185c99d95d60621b604482015290519081900360640190fd5b604080516020601f89018190048102820181019092528781528791606091908a908490819084018382808284376000920191909152509293508992505081159050610bbd5760018114610bc85760028114610bd45760038114610be15760048114610bef57610bfa565b8260208301a0610bfa565b868360208401a1610bfa565b85878460208501a2610bfa565b8486888560208601a3610bfa565b838587898660208701a45b50505050505050505050565b600254604080516395d89b4160e01b815290516060926001600160a01b0316916395d89b41916004808301926000929190829003018186803b15801561055657600080fd5b60025460408051635e33fc1960e11b815233600482015290516000926001600160a01b03169163bc67f832916024808301928692919082900301818387803b158015610c9657600080fd5b505af1158015610caa573d6000803e3d6000fd5b50506002546040805163a9059cbb60e01b81526001600160a01b03888116600483015260248201889052915191909216935063a9059cbb925060448083019260209291908290030181600087803b15801561070157600080fd5b6002546001600160a01b031681565b60025460408051636eb1769f60e11b81526001600160a01b03858116600483015284811660248301529151600093929092169163dd62ed3e91604480820192602092909190829003018186803b158015610d6c57600080fd5b505afa158015610d80573d6000803e3d6000fd5b505050506040513d6020811015610d9657600080fd5b50519392505050565b6000546001600160a01b03163314610de85760405162461bcd60e51b815260040180806020018281038252602f815260200180610e20602f913960400191505060405180910390fd5b56fe596f75206d757374206265206e6f6d696e61746564206265666f726520796f752063616e20616363657074206f776e6572736869704f6e6c792074686520636f6e7472616374206f776e6572206d617920706572666f726d207468697320616374696f6ea265627a7a723158208e94edf35869a730a856486697ccc72821948d0c9c45ee17f049d8c4e3cbb9a564736f6c63430005100032", - "nonce": 1, - "storage": { - "0x0000000000000000000000000000000000000000000000000000000000000002": "0x000000000000000000000000fe8e48bf36ccc3254081ec8c65965d1c8b2e744d" - } - }, - "0x90f1cb932dbf94385434c40d53df3727f00e50b1": { - "balance": "0x1f9fd1b922d07f", - "code": "0x", - "nonce": 15, - "storage": {} - }, - "0x94a178f2c480d14f8cdda908d173d7a73f779cb7": { - "balance": "0x0", - "code": "0x608060405234801561001057600080fd5b506004361061018d5760003560e01c80638f6b4d91116100e3578063bc43cbaf1161008c578063f2fde38b11610066578063f2fde38b1461042b578063f8a2abd31461045e578063feaf968c146104915761018d565b8063bc43cbaf146103fa578063c159730414610402578063e8c4be30146104235761018d565b8063a928c096116100bd578063a928c0961461038d578063b5ab58dc146103c0578063b633620c146103dd5761018d565b80638f6b4d911461032957806392eefe9b146103315780639a6fc8f5146103645761018d565b80636001ac531161014557806379ba50971161011f57806379ba50971461030f5780638205bf6a146103195780638da5cb5b146103215761018d565b80636001ac5314610222578063668a0f021461028a5780637284e416146102925761018d565b806350d25bcd1161017657806350d25bcd146101e157806354fd4d50146101fb57806358303b10146102035761018d565b8063245a7bfc14610192578063313ce567146101c3575b600080fd5b61019a610499565b6040805173ffffffffffffffffffffffffffffffffffffffff9092168252519081900360200190f35b6101cb6104bb565b6040805160ff9092168252519081900360200190f35b6101e9610559565b60408051918252519081900360200190f35b6101e96106e0565b61020b61074d565b6040805161ffff9092168252519081900360200190f35b61024b6004803603602081101561023857600080fd5b503569ffffffffffffffffffff16610757565b6040805169ffffffffffffffffffff96871681526020810195909552848101939093526060840191909152909216608082015290519081900360a00190f35b6101e9610978565b61029a610af9565b6040805160208082528351818301528351919283929083019185019080838360005b838110156102d45781810151838201526020016102bc565b50505050905090810190601f1680156103015780820380516001836020036101000a031916815260200191505b509250505060405180910390f35b610317610c76565b005b6101e9610d78565b61019a610ef9565b61024b610f15565b6103176004803603602081101561034757600080fd5b503573ffffffffffffffffffffffffffffffffffffffff16611134565b61024b6004803603602081101561037a57600080fd5b503569ffffffffffffffffffff16611201565b610317600480360360208110156103a357600080fd5b503573ffffffffffffffffffffffffffffffffffffffff1661138b565b6101e9600480360360208110156103d657600080fd5b50356114ce565b6101e9600480360360208110156103f357600080fd5b5035611657565b61019a6117d9565b61019a6004803603602081101561041857600080fd5b503561ffff166117f5565b61019a61181d565b6103176004803603602081101561044157600080fd5b503573ffffffffffffffffffffffffffffffffffffffff16611839565b6103176004803603602081101561047457600080fd5b503573ffffffffffffffffffffffffffffffffffffffff16611935565b61024b611a02565b60025462010000900473ffffffffffffffffffffffffffffffffffffffff1690565b6000600260000160029054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1663313ce5676040518163ffffffff1660e01b815260040160206040518083038186803b15801561052857600080fd5b505afa15801561053c573d6000803e3d6000fd5b505050506040513d602081101561055257600080fd5b5051905090565b60055460009073ffffffffffffffffffffffffffffffffffffffff168015806106675750604080517f6b14daf8000000000000000000000000000000000000000000000000000000008152336004820181815260248301938452366044840181905273ffffffffffffffffffffffffffffffffffffffff861694636b14daf8946000939190606401848480828437600083820152604051601f9091017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe016909201965060209550909350505081840390508186803b15801561063a57600080fd5b505afa15801561064e573d6000803e3d6000fd5b505050506040513d602081101561066457600080fd5b50515b6106d257604080517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152600960248201527f4e6f206163636573730000000000000000000000000000000000000000000000604482015290519081900360640190fd5b6106da611b8b565b91505090565b6000600260000160029054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166354fd4d506040518163ffffffff1660e01b815260040160206040518083038186803b15801561052857600080fd5b60025461ffff1690565b600554600090819081908190819073ffffffffffffffffffffffffffffffffffffffff1680158061086d5750604080517f6b14daf8000000000000000000000000000000000000000000000000000000008152336004820181815260248301938452366044840181905273ffffffffffffffffffffffffffffffffffffffff861694636b14daf8946000939190606401848480828437600083820152604051601f9091017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe016909201965060209550909350505081840390508186803b15801561084057600080fd5b505afa158015610854573d6000803e3d6000fd5b505050506040513d602081101561086a57600080fd5b50515b6108d857604080517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152600960248201527f4e6f206163636573730000000000000000000000000000000000000000000000604482015290519081900360640190fd5b60035473ffffffffffffffffffffffffffffffffffffffff1661095c57604080517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601e60248201527f4e6f2070726f706f7365642061676772656761746f722070726573656e740000604482015290519081900360640190fd5b61096587611bf8565b939b929a50909850965090945092505050565b60055460009073ffffffffffffffffffffffffffffffffffffffff16801580610a865750604080517f6b14daf8000000000000000000000000000000000000000000000000000000008152336004820181815260248301938452366044840181905273ffffffffffffffffffffffffffffffffffffffff861694636b14daf8946000939190606401848480828437600083820152604051601f9091017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe016909201965060209550909350505081840390508186803b158015610a5957600080fd5b505afa158015610a6d573d6000803e3d6000fd5b505050506040513d6020811015610a8357600080fd5b50515b610af157604080517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152600960248201527f4e6f206163636573730000000000000000000000000000000000000000000000604482015290519081900360640190fd5b6106da611d57565b6060600260000160029054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16637284e4166040518163ffffffff1660e01b815260040160006040518083038186803b158015610b6657600080fd5b505afa158015610b7a573d6000803e3d6000fd5b505050506040513d6000823e601f3d9081017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe01682016040526020811015610bc157600080fd5b8101908080516040519392919084640100000000821115610be157600080fd5b908301906020820185811115610bf657600080fd5b8251640100000000811182820188101715610c1057600080fd5b82525081516020918201929091019080838360005b83811015610c3d578181015183820152602001610c25565b50505050905090810190601f168015610c6a5780820380516001836020036101000a031916815260200191505b50604052505050905090565b60015473ffffffffffffffffffffffffffffffffffffffff163314610cfc57604080517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601660248201527f4d7573742062652070726f706f736564206f776e657200000000000000000000604482015290519081900360640190fd5b60008054337fffffffffffffffffffffffff00000000000000000000000000000000000000008083168217845560018054909116905560405173ffffffffffffffffffffffffffffffffffffffff90921692909183917f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e091a350565b60055460009073ffffffffffffffffffffffffffffffffffffffff16801580610e865750604080517f6b14daf8000000000000000000000000000000000000000000000000000000008152336004820181815260248301938452366044840181905273ffffffffffffffffffffffffffffffffffffffff861694636b14daf8946000939190606401848480828437600083820152604051601f9091017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe016909201965060209550909350505081840390508186803b158015610e5957600080fd5b505afa158015610e6d573d6000803e3d6000fd5b505050506040513d6020811015610e8357600080fd5b50515b610ef157604080517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152600960248201527f4e6f206163636573730000000000000000000000000000000000000000000000604482015290519081900360640190fd5b6106da611e2e565b60005473ffffffffffffffffffffffffffffffffffffffff1681565b600554600090819081908190819073ffffffffffffffffffffffffffffffffffffffff1680158061102b5750604080517f6b14daf8000000000000000000000000000000000000000000000000000000008152336004820181815260248301938452366044840181905273ffffffffffffffffffffffffffffffffffffffff861694636b14daf8946000939190606401848480828437600083820152604051601f9091017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe016909201965060209550909350505081840390508186803b158015610ffe57600080fd5b505afa158015611012573d6000803e3d6000fd5b505050506040513d602081101561102857600080fd5b50515b61109657604080517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152600960248201527f4e6f206163636573730000000000000000000000000000000000000000000000604482015290519081900360640190fd5b60035473ffffffffffffffffffffffffffffffffffffffff1661111a57604080517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601e60248201527f4e6f2070726f706f7365642061676772656761746f722070726573656e740000604482015290519081900360640190fd5b611122611e9b565b95509550955095509550509091929394565b60005473ffffffffffffffffffffffffffffffffffffffff1633146111ba57604080517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601660248201527f4f6e6c792063616c6c61626c65206279206f776e657200000000000000000000604482015290519081900360640190fd5b600580547fffffffffffffffffffffffff00000000000000000000000000000000000000001673ffffffffffffffffffffffffffffffffffffffff92909216919091179055565b600554600090819081908190819073ffffffffffffffffffffffffffffffffffffffff168015806113175750604080517f6b14daf8000000000000000000000000000000000000000000000000000000008152336004820181815260248301938452366044840181905273ffffffffffffffffffffffffffffffffffffffff861694636b14daf8946000939190606401848480828437600083820152604051601f9091017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe016909201965060209550909350505081840390508186803b1580156112ea57600080fd5b505afa1580156112fe573d6000803e3d6000fd5b505050506040513d602081101561131457600080fd5b50515b61138257604080517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152600960248201527f4e6f206163636573730000000000000000000000000000000000000000000000604482015290519081900360640190fd5b61096587611fe4565b60005473ffffffffffffffffffffffffffffffffffffffff16331461141157604080517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601660248201527f4f6e6c792063616c6c61626c65206279206f776e657200000000000000000000604482015290519081900360640190fd5b60035473ffffffffffffffffffffffffffffffffffffffff82811691161461149a57604080517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601b60248201527f496e76616c69642070726f706f7365642061676772656761746f720000000000604482015290519081900360640190fd5b600380547fffffffffffffffffffffffff00000000000000000000000000000000000000001690556114cb81612117565b50565b60055460009073ffffffffffffffffffffffffffffffffffffffff168015806115dc5750604080517f6b14daf8000000000000000000000000000000000000000000000000000000008152336004820181815260248301938452366044840181905273ffffffffffffffffffffffffffffffffffffffff861694636b14daf8946000939190606401848480828437600083820152604051601f9091017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe016909201965060209550909350505081840390508186803b1580156115af57600080fd5b505afa1580156115c3573d6000803e3d6000fd5b505050506040513d60208110156115d957600080fd5b50515b61164757604080517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152600960248201527f4e6f206163636573730000000000000000000000000000000000000000000000604482015290519081900360640190fd5b611650836121de565b9392505050565b60055460009073ffffffffffffffffffffffffffffffffffffffff168015806117655750604080517f6b14daf8000000000000000000000000000000000000000000000000000000008152336004820181815260248301938452366044840181905273ffffffffffffffffffffffffffffffffffffffff861694636b14daf8946000939190606401848480828437600083820152604051601f9091017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe016909201965060209550909350505081840390508186803b15801561173857600080fd5b505afa15801561174c573d6000803e3d6000fd5b505050506040513d602081101561176257600080fd5b50515b6117d057604080517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152600960248201527f4e6f206163636573730000000000000000000000000000000000000000000000604482015290519081900360640190fd5b611650836122d8565b60055473ffffffffffffffffffffffffffffffffffffffff1681565b60046020526000908152604090205473ffffffffffffffffffffffffffffffffffffffff1681565b60035473ffffffffffffffffffffffffffffffffffffffff1681565b60005473ffffffffffffffffffffffffffffffffffffffff1633146118bf57604080517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601660248201527f4f6e6c792063616c6c61626c65206279206f776e657200000000000000000000604482015290519081900360640190fd5b600180547fffffffffffffffffffffffff00000000000000000000000000000000000000001673ffffffffffffffffffffffffffffffffffffffff83811691821790925560008054604051929316917fed8889f560326eb138920d842192f0eb3dd22b4f139c87a2c57538e05bae12789190a350565b60005473ffffffffffffffffffffffffffffffffffffffff1633146119bb57604080517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601660248201527f4f6e6c792063616c6c61626c65206279206f776e657200000000000000000000604482015290519081900360640190fd5b600380547fffffffffffffffffffffffff00000000000000000000000000000000000000001673ffffffffffffffffffffffffffffffffffffffff92909216919091179055565b600554600090819081908190819073ffffffffffffffffffffffffffffffffffffffff16801580611b185750604080517f6b14daf8000000000000000000000000000000000000000000000000000000008152336004820181815260248301938452366044840181905273ffffffffffffffffffffffffffffffffffffffff861694636b14daf8946000939190606401848480828437600083820152604051601f9091017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe016909201965060209550909350505081840390508186803b158015611aeb57600080fd5b505afa158015611aff573d6000803e3d6000fd5b505050506040513d6020811015611b1557600080fd5b50515b611b8357604080517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152600960248201527f4e6f206163636573730000000000000000000000000000000000000000000000604482015290519081900360640190fd5b61112261239b565b6000600260000160029054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166350d25bcd6040518163ffffffff1660e01b815260040160206040518083038186803b15801561052857600080fd5b600354600090819081908190819073ffffffffffffffffffffffffffffffffffffffff16611c8757604080517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601e60248201527f4e6f2070726f706f7365642061676772656761746f722070726573656e740000604482015290519081900360640190fd5b600354604080517f9a6fc8f500000000000000000000000000000000000000000000000000000000815269ffffffffffffffffffff89166004820152905173ffffffffffffffffffffffffffffffffffffffff90921691639a6fc8f59160248082019260a092909190829003018186803b158015611d0457600080fd5b505afa158015611d18573d6000803e3d6000fd5b505050506040513d60a0811015611d2e57600080fd5b508051602082015160408301516060840151608090940151929a91995097509195509350915050565b6000611d61612516565b5060408051808201825260025461ffff81168083526201000090910473ffffffffffffffffffffffffffffffffffffffff16602080840182905284517f668a0f0200000000000000000000000000000000000000000000000000000000815294519394611e1c9463668a0f0292600480840193919291829003018186803b158015611deb57600080fd5b505afa158015611dff573d6000803e3d6000fd5b505050506040513d6020811015611e1557600080fd5b50516124b8565b69ffffffffffffffffffff1691505090565b6000600260000160029054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16638205bf6a6040518163ffffffff1660e01b815260040160206040518083038186803b15801561052857600080fd5b600354600090819081908190819073ffffffffffffffffffffffffffffffffffffffff16611f2a57604080517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601e60248201527f4e6f2070726f706f7365642061676772656761746f722070726573656e740000604482015290519081900360640190fd5b600360009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1663feaf968c6040518163ffffffff1660e01b815260040160a06040518083038186803b158015611f9257600080fd5b505afa158015611fa6573d6000803e3d6000fd5b505050506040513d60a0811015611fbc57600080fd5b5080516020820151604083015160608401516080909401519299919850965091945092509050565b60008060008060008060006120048869ffffffffffffffffffff166124d8565b61ffff821660009081526004602081905260408083205481517f9a6fc8f500000000000000000000000000000000000000000000000000000000815267ffffffffffffffff86169381019390935290519496509294509092839283928392839273ffffffffffffffffffffffffffffffffffffffff1691639a6fc8f59160248083019260a0929190829003018186803b1580156120a057600080fd5b505afa1580156120b4573d6000803e3d6000fd5b505050506040513d60a08110156120ca57600080fd5b508051602082015160408301516060840151608090940151929850909650945090925090506120fd85858585858c6124e0565b9b509b509b509b509b505050505050505091939590929450565b60028054604080518082018252600161ffff808516919091011680825273ffffffffffffffffffffffffffffffffffffffff9590951660209182018190527fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff000090931685177fffffffffffffffffffff0000000000000000000000000000000000000000ffff166201000084021790935560009384526004909252912080547fffffffffffffffffffffffff0000000000000000000000000000000000000000169091179055565b600069ffffffffffffffffffff8211156121fa575060006122d3565b600080612206846124d8565b61ffff8216600090815260046020526040902054919350915073ffffffffffffffffffffffffffffffffffffffff168061224657600093505050506122d3565b8073ffffffffffffffffffffffffffffffffffffffff1663b5ab58dc836040518263ffffffff1660e01b8152600401808267ffffffffffffffff16815260200191505060206040518083038186803b1580156122a157600080fd5b505afa1580156122b5573d6000803e3d6000fd5b505050506040513d60208110156122cb57600080fd5b505193505050505b919050565b600069ffffffffffffffffffff8211156122f4575060006122d3565b600080612300846124d8565b61ffff8216600090815260046020526040902054919350915073ffffffffffffffffffffffffffffffffffffffff168061234057600093505050506122d3565b8073ffffffffffffffffffffffffffffffffffffffff1663b633620c836040518263ffffffff1660e01b8152600401808267ffffffffffffffff16815260200191505060206040518083038186803b1580156122a157600080fd5b60008060008060006123ab612516565b5060408051808201825260025461ffff8116825262010000900473ffffffffffffffffffffffffffffffffffffffff166020820181905282517ffeaf968c0000000000000000000000000000000000000000000000000000000081529251919260009283928392839283929163feaf968c9160048083019260a0929190829003018186803b15801561243c57600080fd5b505afa158015612450573d6000803e3d6000fd5b505050506040513d60a081101561246657600080fd5b5080516020820151604083015160608401516080909401518a5193995091975095509193509091506124a190869086908690869086906124e0565b9a509a509a509a509a505050505050509091929394565b67ffffffffffffffff1660409190911b69ffff0000000000000000161790565b604081901c91565b60008060008060006124f2868c6124b8565b8a8a8a6124ff8a8c6124b8565b939f929e50909c509a509098509650505050505050565b60408051808201909152600080825260208201529056fea2646970667358221220c6148a0e63011d3b8b4f67078be31115256b163e26351db6fe3b70d7faf433f964736f6c63430006060033", - "nonce": 1, - "storage": { - "0x0000000000000000000000000000000000000000000000000000000000000002": "0x000000000000000000000d5642c6329adb3246c13d78b429a9fb1965a0d80001", - "0x0000000000000000000000000000000000000000000000000000000000000005": "0x0000000000000000000000000000000000000000000000000000000000000000" - } - }, - "0xb9c6ca25452e7f6d0d3340ce1e9b573421afc2ee": { - "balance": "0x0", - "code": "0x608060405234801561001057600080fd5b506004361061009e5760003560e01c80638da5cb5b116100665780638da5cb5b14610155578063aefc4ccb1461015d578063b46310f614610165578063da46098c14610191578063dd62ed3e146101c75761009e565b80631627540c146100a357806352f445ca146100cb57806353a47bb7146100f157806370a082311461011557806379ba50971461014d575b600080fd5b6100c9600480360360208110156100b957600080fd5b50356001600160a01b03166101f5565b005b6100c9600480360360208110156100e157600080fd5b50356001600160a01b0316610251565b6100f96102ad565b604080516001600160a01b039092168252519081900360200190f35b61013b6004803603602081101561012b57600080fd5b50356001600160a01b03166102bc565b60408051918252519081900360200190f35b6100c96102ce565b6100f961038a565b6100f9610399565b6100c96004803603604081101561017b57600080fd5b506001600160a01b0381351690602001356103a8565b6100c9600480360360608110156101a757600080fd5b506001600160a01b0381358116916020810135909116906040013561040d565b61013b600480360360408110156101dd57600080fd5b506001600160a01b0381358116916020013516610482565b6101fd61049f565b600180546001600160a01b0383166001600160a01b0319909116811790915560408051918252517f906a1c6bd7e3091ea86693dd029a831c19049ce77f1dce2ce0bab1cacbabce229181900360200190a150565b61025961049f565b600280546001600160a01b0383166001600160a01b0319909116811790915560408051918252517f73f20cff579e8a4086fa607db83867595f1b6a798e718c0bfa0b94a404128e039181900360200190a150565b6001546001600160a01b031681565b60036020526000908152604090205481565b6001546001600160a01b031633146103175760405162461bcd60e51b81526004018080602001828103825260358152602001806104eb6035913960400191505060405180910390fd5b600054600154604080516001600160a01b03938416815292909116602083015280517fb532073b38c83145e3e5135377a08bf9aab55bc0fd7c1179cd4fb995d2a5159c9281900390910190a160018054600080546001600160a01b03199081166001600160a01b03841617909155169055565b6000546001600160a01b031681565b6002546001600160a01b031681565b6002546001600160a01b031633146103f15760405162461bcd60e51b815260040180806020018281038252603481526020018061054f6034913960400191505060405180910390fd5b6001600160a01b03909116600090815260036020526040902055565b6002546001600160a01b031633146104565760405162461bcd60e51b815260040180806020018281038252603481526020018061054f6034913960400191505060405180910390fd5b6001600160a01b0392831660009081526004602090815260408083209490951682529290925291902055565b600460209081526000928352604080842090915290825290205481565b6000546001600160a01b031633146104e85760405162461bcd60e51b815260040180806020018281038252602f815260200180610520602f913960400191505060405180910390fd5b56fe596f75206d757374206265206e6f6d696e61746564206265666f726520796f752063616e20616363657074206f776e6572736869704f6e6c792074686520636f6e7472616374206f776e6572206d617920706572666f726d207468697320616374696f6e4f6e6c7920746865206173736f63696174656420636f6e74726163742063616e20706572666f726d207468697320616374696f6ea265627a7a723158205a09da4484c09fa9990447b4cbf9b0b9396250bc95bcd44864af2aa877ed8abc64736f6c63430005100032", - "nonce": 1, - "storage": { - "0x0000000000000000000000000000000000000000000000000000000000000002": "0x000000000000000000000000fe8e48bf36ccc3254081ec8c65965d1c8b2e744d", - "0x5a0fddb88603470c8096d4582a5d98d923b03dbb9585c9e09a8f119a9dbe7668": "0x0000000000000000000000000000000000000000000001c9f23e7ccc897c65e5" - } - }, - "0xe8c41be1a167314abaf2423b72bf8da826943ffd": { - "balance": "0x0", - "code": "0x608060405234801561001057600080fd5b50600436106103835760003560e01c80636309a10c116101de578063a55ce9c51161010f578063e470df58116100ad578063f405f65a1161007c578063f405f65a14610d61578063f44d1e0b14610d69578063f4c80f5e14610d71578063f8b4b08414610d8e57610383565b8063e470df5814610cb1578063e665edf014610cce578063e91e691814610d3c578063f161620714610d5957610383565b8063b9a49869116100e9578063b9a4986914610bb0578063c0eee44314610c1e578063da5917ae14610c26578063de1b885114610c4357610383565b8063a55ce9c514610b68578063abc0bb6e14610b70578063b431c0ea14610b9357610383565b80637c3125411161017c5780638da5cb5b116101565780638da5cb5b14610b1757806394c79f7414610b1f5780639f8a95ba14610b3c578063a0aad31c14610b6057610383565b80637c31254114610a845780637fe9b23d14610a8c578063856aae6c14610afa57610383565b80636ef5d841116101b85780636ef5d841146109505780637118d43114610a575780637243bc2c14610a5f57806379ba509714610a7c57610383565b80636309a10c146108bd57806367a280b2146108da57806369eaced2146108e257610383565b80632dd8afdb116102b85780634abdb44d1161025657806355585bce1161023057806355585bce1461088257806356c3da451461088a5780636132eba414610892578063614d08f8146108b557610383565b80634abdb44d146106f8578063517d60c61461070057806353a47bb71461085e57610383565b8063396e258e11610292578063396e258e1461065f57806342a28e211461067c57806348bf1971146106995780634a661850146106d557610383565b80632dd8afdb146106335780632e8d0b9e1461063b578063346cde511461065757610383565b80631ce00ba21161032557806322264567116102ff578063222645671461057d5780632366245e146105a05780632a647ab7146105a85780632be470901461061657610383565b80631ce00ba2146104a55780631f4b3401146104c857806320f2bf001461053657610383565b80631588e817116103615780631588e817146103b45780631627540c146103d1578063180113bc146103f75780631cba727c1461043757610383565b8063086dabd11461038857806312bde51414610392578063157c51d3146103ac575b600080fd5b610390610d96565b005b61039a610da0565b60408051918252519081900360200190f35b610390610dad565b610390600480360360208110156103ca57600080fd5b5035610e17565b610390600480360360208110156103e757600080fd5b50356001600160a01b0316610e82565b6104146004803603602081101561040d57600080fd5b5035610ede565b6040805192151583526001600160f81b0390911660208301528051918290030190f35b6103906004803603604081101561044d57600080fd5b810190602081018135600160201b81111561046757600080fd5b82018360208201111561047957600080fd5b803590602001918460208302840111600160201b8311171561049a57600080fd5b919350915035610f03565b610390600480360360408110156104bb57600080fd5b5080359060200135610f46565b610390600480360360208110156104de57600080fd5b810190602081018135600160201b8111156104f857600080fd5b82018360208201111561050a57600080fd5b803590602001918460208302840111600160201b8311171561052b57600080fd5b509092509050610f7e565b6105626004803603604081101561054c57600080fd5b50803590602001356001600160a01b0316610fba565b60408051921515835290151560208301528051918290030190f35b6103906004803603604081101561059357600080fd5b5080359060200135610fe3565b610414611029565b610390600480360360408110156105be57600080fd5b810190602081018135600160201b8111156105d857600080fd5b8201836020820111156105ea57600080fd5b803590602001918460208302840111600160201b8311171561060b57600080fd5b919350915035611042565b6103906004803603602081101561062c57600080fd5b5035611080565b6104146110ea565b610643611103565b604080519115158252519081900360200190f35b61041461112d565b6103906004803603602081101561067557600080fd5b5035611146565b6103906004803603602081101561069257600080fd5b50356111b1565b610390600480360360808110156106af57600080fd5b508035906001600160a01b036020820135169060408101351515906060013515156111c5565b610390600480360360408110156106eb57600080fd5b50803590602001356111df565b61039a611225565b6103906004803603608081101561071657600080fd5b810190602081018135600160201b81111561073057600080fd5b82018360208201111561074257600080fd5b803590602001918460208302840111600160201b8311171561076357600080fd5b919390929091602081019035600160201b81111561078057600080fd5b82018360208201111561079257600080fd5b803590602001918460208302840111600160201b831117156107b357600080fd5b919390929091602081019035600160201b8111156107d057600080fd5b8201836020820111156107e257600080fd5b803590602001918460208302840111600160201b8311171561080357600080fd5b919390929091602081019035600160201b81111561082057600080fd5b82018360208201111561083257600080fd5b803590602001918460208302840111600160201b8311171561085357600080fd5b509092509050611234565b610866611325565b604080516001600160a01b039092168252519081900360200190f35b610390611334565b61039a61139f565b610390600480360360408110156108a857600080fd5b50803590602001356113ad565b61039a6113b5565b610390600480360360208110156108d357600080fd5b50356113c8565b61039061140d565b610390600480360360208110156108f857600080fd5b810190602081018135600160201b81111561091257600080fd5b82018360208201111561092457600080fd5b803590602001918460208302840111600160201b8311171561094557600080fd5b509092509050611479565b6109be6004803603602081101561096657600080fd5b810190602081018135600160201b81111561098057600080fd5b82018360208201111561099257600080fd5b803590602001918460208302840111600160201b831117156109b357600080fd5b5090925090506114b5565b604051808060200180602001838103835285818151815260200191508051906020019060200280838360005b83811015610a025781810151838201526020016109ea565b50505050905001838103825284818151815260200191508051906020019060200280838360005b83811015610a41578181015183820152602001610a29565b5050505090500194505050505060405180910390f35b6103906115de565b61041460048036036020811015610a7557600080fd5b50356115ee565b610390611613565b6103906116cf565b61039060048036036040811015610aa257600080fd5b810190602081018135600160201b811115610abc57600080fd5b820183602082011115610ace57600080fd5b803590602001918460208302840111600160201b83111715610aef57600080fd5b9193509150356116df565b61039060048036036020811015610b1057600080fd5b503561171d565b61086661173e565b61039060048036036020811015610b3557600080fd5b503561174d565b610b44611792565b604080516001600160f81b039092168252519081900360200190f35b610390611797565b61039a6117af565b61039060048036036040811015610b8657600080fd5b50803590602001356117c3565b61064360048036036020811015610ba957600080fd5b5035611809565b6109be60048036036020811015610bc657600080fd5b810190602081018135600160201b811115610be057600080fd5b820183602082011115610bf257600080fd5b803590602001918460208302840111600160201b83111715610c1357600080fd5b509092509050611831565b610643611952565b61039060048036036020811015610c3c57600080fd5b503561195b565b61039060048036036020811015610c5957600080fd5b810190602081018135600160201b811115610c7357600080fd5b820183602082011115610c8557600080fd5b803590602001918460208302840111600160201b83111715610ca657600080fd5b50909250905061196c565b61039060048036036020811015610cc757600080fd5b50356119a8565b6109be60048036036020811015610ce457600080fd5b810190602081018135600160201b811115610cfe57600080fd5b820183602082011115610d1057600080fd5b803590602001918460208302840111600160201b83111715610d3157600080fd5b509092509050611a1d565b61041460048036036020811015610d5257600080fd5b5035611b3e565b61039a611b63565b610390611b72565b61039a611bde565b61039060048036036020811015610d8757600080fd5b5035611bea565b610414611c2f565b610d9e611c48565b565b6553797374656d60d01b81565b610dbf6553797374656d60d01b611d27565b6003805460ff191690819055604080516101009092046001600160f81b03168252517fb392a95118344e8edff8eff56183afb4bb0240310c406a0fc1217d2755c66d8f916020908290030190a16003805460ff169055565b610e2b6745786368616e676560c01b611d84565b600580546001600160f81b0383166101000260ff1990911660011760ff161790556040805182815290517f078773069a9216cdb6acaa7b184785f12f62048c7ce8b7ede1bad6785de16b229181900360200190a150565b610e8a611ddc565b600180546001600160a01b0383166001600160a01b0319909116811790915560408051918252517f906a1c6bd7e3091ea86693dd029a831c19049ce77f1dce2ce0bab1cacbabce229181900360200190a150565b60096020526000908152604090205460ff81169061010090046001600160f81b031682565b610f41838380806020026020016040519081016040528093929190818152602001838360200280828437600092019190915250859250611e25915050565b505050565b610f4e611c48565b610f56611ed3565b610f5f82611f15565b610f6881611f15565b610f7182611f63565b610f7a81611f63565b5050565b610f7a828280806020026020016040519081016040528093929190818152602001838360200280828437600092019190915250611fb192505050565b600260209081526000928352604080842090915290825290205460ff8082169161010090041682565b60408051600180825281830190925260609160208083019080388339019050509050828160008151811061101357fe5b602002602001018181525050610f418183612059565b60045460ff81169061010090046001600160f81b031682565b610f41838380806020026020016040519081016040528093929190818152602001838360200280828437600092019190915250859250612059915050565b611093664675747572657360c81b611d84565b600680546001600160f81b0383166101000260ff1990911660011760ff161790556040805182815290517fbb77bf6af5bb933d0fb912130167ce25b6debb9c728f232ee4e7c181f16c8e0c9181900360200190a150565b60035460ff81169061010090046001600160f81b031682565b60035460009060ff168015611128575060035461010090046001600160f81b03166001145b905090565b60065460ff81169061010090046001600160f81b031682565b61115a6749737375616e636560c01b611d84565b600480546001600160f81b0383166101000260ff1990911660011760ff161790556040805182815290517fee8bf45d6e3141aa521ae4f0d05dfefe0327a3f23a9fbae6a64680458b34ebb89181900360200190a150565b6111b9611c48565b6111c281611f63565b50565b6111cd611ddc565b6111d984848484612101565b50505050565b60408051600180825281830190925260609160208083019080388339019050509050828160008151811061120f57fe5b602002602001018181525050610f418183611e25565b6749737375616e636560c01b81565b61123c611ddc565b868514801561124a57508483145b801561125557508281145b6112a6576040805162461bcd60e51b815260206004820152601e60248201527f496e707574206172726179206c656e67746873206d757374206d617463680000604482015290519081900360640190fd5b60005b8781101561131a576113128989838181106112c057fe5b905060200201358888848181106112d357fe5b905060200201356001600160a01b03168787858181106112ef57fe5b90506020020135151586868681811061130457fe5b905060200201351515612101565b6001016112a9565b505050505050505050565b6001546001600160a01b031681565b611347664675747572657360c81b611d27565b6006805460ff191690819055604080516101009092046001600160f81b03168252517fcbdc17547b5be7fb4a78666d4253509496561d5b1088a019865bd70d7e248fa6916020908290030190a16006805460ff169055565b664675747572657360c81b81565b610f68611c48565b6b53797374656d53746174757360a01b81565b6040805160018082528183019092526060916020808301908038833901905050905081816000815181106113f857fe5b602002602001018181525050610f7a81612247565b6114216749737375616e636560c01b611d27565b6004805460ff191690819055604080516101009092046001600160f81b03168252517f0f1a80395faba9a11017f830db5f90ad6525a1621dbfb2cbc2b6679ba5716837916020908290030190a16004805460ff169055565b610f7a82828080602002602001604051908101604052809392919081815260200183836020028082843760009201919091525061224792505050565b606080838390506040519080825280602002602001820160405280156114e5578160200160208202803883390190505b50604080518581526020808702820101909152909250838015611512578160200160208202803883390190505b50905060005b838110156115d6576009600086868481811061153057fe5b90506020020135815260200190815260200160002060000160009054906101000a900460ff1683828151811061156257fe5b911515602092830291909101909101526009600086868481811061158257fe5b90506020020135815260200190815260200160002060000160019054906101000a90046001600160f81b03166001600160f81b03168282815181106115c357fe5b6020908102919091010152600101611518565b509250929050565b6115e6611c48565b610d9e611ed3565b60086020526000908152604090205460ff81169061010090046001600160f81b031682565b6001546001600160a01b0316331461165c5760405162461bcd60e51b815260040180806020018281038252603581526020018061251d6035913960400191505060405180910390fd5b600054600154604080516001600160a01b03938416815292909116602083015280517fb532073b38c83145e3e5135377a08bf9aab55bc0fd7c1179cd4fb995d2a5159c9281900390910190a160018054600080546001600160a01b03199081166001600160a01b03841617909155169055565b6116d7611c48565b610d9e6122f5565b610f41838380806020026020016040519081016040528093929190818152602001838360200280828437600092019190915250859250612337915050565b611725611c48565b61172d611ed3565b6117356123dd565b6111c28161241f565b6000546001600160a01b031681565b60408051600180825281830190925260609160208083019080388339019050509050818160008151811061177d57fe5b602002602001018181525050610f7a81612476565b600181565b61179f611c48565b6117a7611ed3565b610d9e6123dd565b6c53796e746845786368616e676560981b81565b6040805160018082528183019092526060916020808301908038833901905050905082816000815181106117f357fe5b602002602001018181525050610f418183612337565b60035460009060ff168061182b575060008281526008602052604090205460ff165b92915050565b60608083839050604051908082528060200260200182016040528015611861578160200160208202803883390190505b5060408051858152602080870282010190915290925083801561188e578160200160208202803883390190505b50905060005b838110156115d657600860008686848181106118ac57fe5b90506020020135815260200190815260200160002060000160009054906101000a900460ff168382815181106118de57fe5b91151560209283029190910190910152600860008686848181106118fe57fe5b90506020020135815260200190815260200160002060000160019054906101000a90046001600160f81b03166001600160f81b031682828151811061193f57fe5b6020908102919091010152600101611894565b60035460ff1690565b611963611c48565b6111c281611f15565b610f7a82828080602002602001604051908101604052809392919081815260200183836020028082843760009201919091525061247692505050565b6119ba6553797374656d60d01b611d84565b600380546001600160f81b0380841661010090810260ff1990931660011760ff169290921792839055604080519290930416815290517f86b7ed06c3a2c3763514d475ced33f9ac8b1bb8f028ded18de0100b7678f3c4f9181900360200190a150565b60608083839050604051908082528060200260200182016040528015611a4d578160200160208202803883390190505b50604080518581526020808702820101909152909250838015611a7a578160200160208202803883390190505b50905060005b838110156115d65760076000868684818110611a9857fe5b90506020020135815260200190815260200160002060000160009054906101000a900460ff16838281518110611aca57fe5b9115156020928302919091019091015260076000868684818110611aea57fe5b90506020020135815260200190815260200160002060000160019054906101000a90046001600160f81b03166001600160f81b0316828281518110611b2b57fe5b6020908102919091010152600101611a80565b60076020526000908152604090205460ff81169061010090046001600160f81b031682565b6745786368616e676560c01b81565b611b866745786368616e676560c01b611d27565b6005805460ff191690819055604080516101009092046001600160f81b03168252517f07966fe79d35c7abf1f3b2ad9970ea24cae0f11406e283e848e3e6608ae3c214916020908290030190a16005805460ff169055565b640a6f2dce8d60db1b81565b604080516001808252818301909252606091602080830190803883390190505090508181600081518110611c1a57fe5b602002602001018181525050610f7a81611fb1565b60055460ff81169061010090046001600160f81b031682565b60035460ff8116159061010090046001600160f81b0316600114611c84576040518060600160405280602c8152602001612659602c9139611c9e565b6040518060600160405280603e8152602001612685603e91395b906111c25760405162461bcd60e51b81526004018080602001828103825283818151815260200191508051906020019080838360005b83811015611cec578181015183820152602001611cd4565b50505050905090810190601f168015611d195780820380516001836020036101000a031916815260200191505b509250505060405180910390fd5b6000818152600260209081526040808320338452909152902054610100900460ff166111c25760405162461bcd60e51b81526004018080602001828103825260218152602001806126386021913960400191505060405180910390fd5b600081815260026020908152604080832033845290915290205460ff166111c25760405162461bcd60e51b81526004018080602001828103825260218152602001806126386021913960400191505060405180910390fd5b6000546001600160a01b03163314610d9e5760405162461bcd60e51b815260040180806020018281038252602f8152602001806125de602f913960400191505060405180910390fd5b611e3e6c53796e746845786368616e676560981b611d84565b60005b8251811015610f41576000838281518110611e5857fe5b60209081029190910181015160008181526007835260409081902080546001600160f81b0388166101000260ff1990911660011760ff16179055805182815292830186905280519193507fcea0da706e9f2a6a1cb56cdab42ac548791339f1710deadf814f15fc0a6a7114928290030190a150600101611e41565b60055460ff1615610d9e5760405162461bcd60e51b815260040180806020018281038252602b81526020018061260d602b913960400191505060405180910390fd5b60008181526007602052604090205460ff16156111c25760405162461bcd60e51b815260040180806020018281038252602e81526020018061257d602e913960400191505060405180910390fd5b60008181526008602052604090205460ff16156111c25760405162461bcd60e51b81526004018080602001828103825260288152602001806126c36028913960400191505060405180910390fd5b611fc4664675747572657360c81b611d27565b60005b8151811015610f7a576000828281518110611fde57fe5b6020908102919091018101516000818152600983526040908190205481518381526101009091046001600160f81b03169381019390935280519193507f250fcb5d34afaf9bc18ec9ca0bf709e0f2ecb8ae4d4a3a616c0bf54b2ddf53e6928290030190a1600090815260096020526040812055600101611fc7565b61206c664675747572657360c81b611d84565b60005b8251811015610f4157600083828151811061208657fe5b60209081029190910181015160008181526009835260409081902080546001600160f81b0388166101000260ff1990911660011760ff16179055805182815292830186905280519193507fcaa561b71353382b62092c429c14613b5db8f9c5f3a27cb51df16e51f350f8ca928290030190a15060010161206f565b6553797374656d60d01b84148061212257506749737375616e636560c01b84145b8061213757506745786368616e676560c01b84145b8061214b5750664675747572657360c81b84145b8061216557506c53796e746845786368616e676560981b84145b806121775750640a6f2dce8d60db1b84145b6121c8576040805162461bcd60e51b815260206004820152601860248201527f496e76616c69642073656374696f6e20737570706c6965640000000000000000604482015290519081900360640190fd5b60008481526002602090815260408083206001600160a01b038716808552908352928190208054851515610100810261ff001989151560ff1990941684171617909255825190815292830152805187927f95bad30f8fe717e4a02906d7b05a6f90698c7135cd053e5b6d5239146b4c40d192908290030190a350505050565b6122606c53796e746845786368616e676560981b611d27565b60005b8151811015610f7a57600082828151811061227a57fe5b6020908102919091018101516000818152600783526040908190205481518381526101009091046001600160f81b03169381019390935280519193507f91037f810fbf9c3c6d5573650d27de6b5e8d2187698822700d4524102472bc08928290030190a1600090815260076020526040812055600101612263565b60045460ff1615610d9e5760405162461bcd60e51b815260040180806020018281038252602b815260200180612552602b913960400191505060405180910390fd5b612348640a6f2dce8d60db1b611d84565b60005b8251811015610f4157600083828151811061236257fe5b60209081029190910181015160008181526008835260409081902080546001600160f81b0388166101000260ff1990911660011760ff16179055805182815292830186905280519193507f9cca506f9028bbcc0d976db0eaf80dfe6a6d7cadd99024edd88f690e1eda5541928290030190a15060010161234b565b60065460ff1615610d9e5760405162461bcd60e51b81526004018080602001828103825260338152602001806125ab6033913960400191505060405180910390fd5b60008181526009602052604090205460ff16156111c2576040805162461bcd60e51b815260206004820152601060248201526f13585c9ad95d081cdd5cdc195b99195960821b604482015290519081900360640190fd5b612487640a6f2dce8d60db1b611d27565b60005b8151811015610f7a5760008282815181106124a157fe5b6020908102919091018101516000818152600883526040908190205481518381526101009091046001600160f81b03169381019390935280519193507f691b6c9654fa1f01847f7e98a061557ca10378bb9670782b60ed13891703d220928290030190a160009081526008602052604081205560010161248a56fe596f75206d757374206265206e6f6d696e61746564206265666f726520796f752063616e20616363657074206f776e65727368697049737375616e63652069732073757370656e6465642e204f7065726174696f6e2070726f6869626974656453796e74682065786368616e67652073757370656e6465642e204f7065726174696f6e2070726f6869626974656446757475726573206d61726b657473206172652073757370656e6465642e204f7065726174696f6e2070726f686962697465644f6e6c792074686520636f6e7472616374206f776e6572206d617920706572666f726d207468697320616374696f6e45786368616e67652069732073757370656e6465642e204f7065726174696f6e2070726f686962697465645265737472696374656420746f2061636365737320636f6e74726f6c206c69737453796e7468657469782069732073757370656e6465642e204f7065726174696f6e2070726f6869626974656453796e7468657469782069732073757370656e6465642c207570677261646520696e2070726f67726573732e2e2e20706c65617365207374616e6420627953796e74682069732073757370656e6465642e204f7065726174696f6e2070726f68696269746564a265627a7a723158202225676251b5f53c6aeb0b703bd197b625c299226f79ad58e087f41a4b1e20ad64736f6c63430005100032", - "nonce": 1, - "storage": { - "0x0000000000000000000000000000000000000000000000000000000000000003": "0x0000000000000000000000000000000000000000000000000000000000000000" - } - }, - "0xfe8e48bf36ccc3254081ec8c65965d1c8b2e744d": { - "balance": "0x0", - "code": "0x608060405234801561001057600080fd5b50600436106104125760003560e01c806370a0823111610220578063a47ed94c11610130578063d67bdd25116100b8578063e8e09b8b11610087578063e8e09b8b14610ce2578063e90dd9e214610d0e578063ec55688914610d16578063edef719a14610d1e578063ee52a2f314610d4a57610412565b8063d67bdd2514610c87578063d8a1f76f14610c8f578063dbf6334014610cac578063dd62ed3e14610cb457610412565b8063af086c7e116100ff578063af086c7e14610bc9578063bc67f83214610bd1578063c2bf388014610bf7578063c836fa0a14610c23578063d37c4d8b14610c5b57610412565b8063a47ed94c14610b28578063a5fdc5de14610b45578063a9059cbb14610b6b578063ace88afd14610b9757610412565b80638da5cb5b116101b357806397107d6d1161018257806397107d6d14610a915780639741fb2214610ab7578063987757dd14610abf5780639f76980714610adc578063a311c7c214610b0257610412565b80638da5cb5b14610a3357806391e56b6814610a3b5780639324cac714610a8157806395d89b4114610a8957610412565b8063835e119c116101ef578063835e119c146109d457806383d625d4146109f1578063899ffef414610a0e5780638a29001414610a1657610412565b806370a082311461094657806372cb051f1461096c57806374185360146109c457806379ba5097146109cc57610412565b80632d3169eb116103265780634e99bda9116102ae5780635e22846a1161027d5780635e22846a14610856578063666ed4f11461087c5780636ac0bf9c146108a85780636c00f310146108ce5780636f01a9861461091457610412565b80634e99bda914610800578063528c7efb1461080857806353a47bb7146108105780635af090ef1461081857610412565b8063320223db116102f5578063320223db1461076357806332608039146107895780633b05796b146107a65780633e89b9e5146107ae57806344b3e923146107cb57610412565b80632d3169eb146106d05780632e0f2625146106ff57806330ead7601461071d578063313ce5671461075b57610412565b806316b2213f116103a957806323b872dd1161037857806323b872dd14610647578063295da87d1461067d5780632a9053181461069a5780632af64bd3146106a25780632c955fa7146106aa57610412565b806316b2213f146105f457806318160ddd1461061a57806318821400146106225780631fce304d1461062a57610412565b80630e30963c116103e55780630e30963c146105305780631137aedf146105805780631249c58b146105c45780631627540c146105cc57610412565b806304f3bcec1461041757806305b3c1c91461043b57806306fdde0314610473578063095ea7b3146104f0575b600080fd5b61041f610d73565b604080516001600160a01b039092168252519081900360200190f35b6104616004803603602081101561045157600080fd5b50356001600160a01b0316610d87565b60408051918252519081900360200190f35b61047b610e1a565b6040805160208082528351818301528351919283929083019185019080838360005b838110156104b557818101518382015260200161049d565b50505050905090810190601f1680156104e25780820380516001836020036101000a031916815260200191505b509250505060405180910390f35b61051c6004803603604081101561050657600080fd5b506001600160a01b038135169060200135610ea8565b604080519115158252519081900360200190f35b61055f6004803603608081101561054657600080fd5b5080359060208101359060408101359060600135610f43565b604080519283526001600160a01b0390911660208301528051918290030190f35b6105a66004803603602081101561059657600080fd5b50356001600160a01b0316610f57565b60408051938452602084019290925282820152519081900360600190f35b61051c610ffd565b6105f2600480360360208110156105e257600080fd5b50356001600160a01b031661100a565b005b6104616004803603602081101561060a57600080fd5b50356001600160a01b0316611066565b6104616110c5565b61047b6110cb565b61051c6004803603602081101561064057600080fd5b5035611104565b61051c6004803603606081101561065d57600080fd5b506001600160a01b03813581169160208101359091169060400135611197565b6105f26004803603602081101561069357600080fd5b50356111d4565b61047b61125e565b61051c61127d565b6105f2600480360360208110156106c057600080fd5b50356001600160a01b031661138e565b6105f2600480360360808110156106e657600080fd5b50803590602081013590604081013590606001356113fd565b610707611540565b6040805160ff9092168252519081900360200190f35b610461600480360360a081101561073357600080fd5b508035906020810135906040810135906001600160a01b036060820135169060800135611545565b610707611623565b6105f26004803603602081101561077957600080fd5b50356001600160a01b031661162c565b61041f6004803603602081101561079f57600080fd5b503561169b565b61051c6116e8565b610461600480360360208110156107c457600080fd5b50356116f1565b610461600480360360a08110156107e157600080fd5b508035906020810135906040810135906060810135906080013561174b565b61051c61175e565b61051c6117d1565b61041f61195d565b610461600480360360a081101561082e57600080fd5b508035906020810135906040810135906001600160a01b03606082013516906080013561174b565b61051c6004803603602081101561086c57600080fd5b50356001600160a01b031661196c565b6105f26004803603604081101561089257600080fd5b506001600160a01b038135169060200135611d5d565b610461600480360360208110156108be57600080fd5b50356001600160a01b0316611d73565b6105f2600480360360c08110156108e457600080fd5b506001600160a01b03813581169160208101359160408201359160608101359160808201359160a0013516611e7d565b6105f26004803603606081101561092a57600080fd5b506001600160a01b038135169060208101359060400135611fdc565b6104616004803603602081101561095c57600080fd5b50356001600160a01b031661211d565b610974612170565b60408051602080825283518183015283519192839290830191858101910280838360005b838110156109b0578181015183820152602001610998565b505050509050019250505060405180910390f35b6105f2612280565b6105f2612459565b61041f600480360360208110156109ea57600080fd5b5035612515565b61046160048036036020811015610a0757600080fd5b5035612562565b6109746125bc565b6105f260048036036020811015610a2c57600080fd5b5035612630565b61041f61269d565b610461600480360360c0811015610a5157600080fd5b506001600160a01b0381358116916020810135916040820135916060810135916080820135169060a001356126ac565b61046161278f565b61047b61279a565b6105f260048036036020811015610aa757600080fd5b50356001600160a01b03166127f5565b6105f2612851565b6105a660048036036020811015610ad557600080fd5b50356128d3565b6105f260048036036020811015610af257600080fd5b50356001600160a01b0316612953565b61046160048036036020811015610b1857600080fd5b50356001600160a01b031661297f565b6105f260048036036020811015610b3e57600080fd5b50356129de565b61046160048036036020811015610b5b57600080fd5b50356001600160a01b0316612a70565b61051c60048036036040811015610b8157600080fd5b506001600160a01b038135169060200135612acf565b6105f260048036036060811015610bad57600080fd5b506001600160a01b038135169060208101359060400135612b0f565b6105f2612b6f565b6105f260048036036020811015610be757600080fd5b50356001600160a01b0316612bd6565b6105f260048036036040811015610c0d57600080fd5b506001600160a01b038135169060200135612c00565b61046160048036036080811015610c3957600080fd5b506001600160a01b038135169060208101359060408101359060600135612c92565b61046160048036036040811015610c7157600080fd5b506001600160a01b038135169060200135612d70565b61041f612e0a565b6105f260048036036020811015610ca557600080fd5b5035612e19565b610461612ea7565b61046160048036036040811015610cca57600080fd5b506001600160a01b0381358116916020013516612ee9565b6105f260048036036040811015610cf857600080fd5b506001600160a01b038135169060200135612f44565b61041f612fba565b61041f612fc9565b6105f260048036036040811015610d3457600080fd5b506001600160a01b038135169060200135612fd8565b61046160048036036060811015610d6057600080fd5b508035906020810135906040013561310d565b60085461010090046001600160a01b031681565b6000610d916131eb565b6001600160a01b03166305b3c1c9836040518263ffffffff1660e01b815260040180826001600160a01b03166001600160a01b0316815260200191505060206040518083038186803b158015610de657600080fd5b505afa158015610dfa573d6000803e3d6000fd5b505050506040513d6020811015610e1057600080fd5b505190505b919050565b6005805460408051602060026001851615610100026000190190941693909304601f81018490048402820184019092528181529291830182828015610ea05780601f10610e7557610100808354040283529160200191610ea0565b820191906000526020600020905b815481529060010190602001808311610e8357829003601f168201915b505050505081565b6000610eb2613204565b6003546004805460408051633691826360e21b81526001600160a01b03948516938101849052878516602482015260448101879052905192939091169163da46098c9160648082019260009290919082900301818387803b158015610f1657600080fd5b505af1158015610f2a573d6000803e3d6000fd5b50505050610f39818585613243565b5060019392505050565b600080610f4e61330d565b94509492505050565b6000806000610f646131eb565b6001600160a01b0316631137aedf856040518263ffffffff1660e01b815260040180826001600160a01b03166001600160a01b0316815260200191505060606040518083038186803b158015610fb957600080fd5b505afa158015610fcd573d6000803e3d6000fd5b505050506040513d6060811015610fe357600080fd5b508051602082015160409092015190969195509350915050565b600061100761330d565b90565b61101261335a565b600180546001600160a01b0383166001600160a01b0319909116811790915560408051918252517f906a1c6bd7e3091ea86693dd029a831c19049ce77f1dce2ce0bab1cacbabce229181900360200190a150565b60006110706131eb565b6001600160a01b03166316b2213f836040518263ffffffff1660e01b815260040180826001600160a01b03166001600160a01b0316815260200191505060206040518083038186803b158015610de657600080fd5b60075481565b6040518060400160405280601781526020017f53796e746865746978204e6574776f726b20546f6b656e00000000000000000081525081565b60008061110f6133a3565b600354604080516301670a7b60e21b81526001600160a01b039283166004820152602481018790529051929091169163059c29ec91604480820192602092909190829003018186803b15801561116457600080fd5b505afa158015611178573d6000803e3d6000fd5b505050506040513d602081101561118e57600080fd5b50511192915050565b60006111a16133ba565b6111a961343e565b6111b38483613492565b506003546111cc906001600160a01b03168585856136e2565b949350505050565b6111dc6137da565b6111e4613204565b6111ec6131eb565b6003546040805163b06e8c6560e01b81526001600160a01b039283166004820152602481018590529051929091169163b06e8c659160448082019260009290919082900301818387803b15801561124257600080fd5b505af1158015611256573d6000803e3d6000fd5b505050505b50565b604051806040016040528060038152602001620a69cb60eb1b81525081565b600060606112896125bc565b905060005b81518110156113855760008282815181106112a557fe5b6020908102919091018101516000818152600983526040908190205460085482516321f8a72160e01b81526004810185905292519395506001600160a01b0391821694610100909104909116926321f8a721926024808201939291829003018186803b15801561131457600080fd5b505afa158015611328573d6000803e3d6000fd5b505050506040513d602081101561133e57600080fd5b50516001600160a01b031614158061136b57506000818152600960205260409020546001600160a01b0316155b1561137c5760009350505050611007565b5060010161128e565b50600191505090565b6113966137da565b61139e613204565b6113a66131eb565b6003546040805163159fa0d560e11b81526001600160a01b038581166004830152928316602482015290519290911691632b3f41aa9160448082019260009290919082900301818387803b15801561124257600080fd5b61140561381a565b6002805460408051602081018790528082018690526060808201869052825180830390910181526080909101918290526001600160a01b039092169263907dff979291806031614887823960310190506040518091039020886000806040518763ffffffff1660e01b815260040180806020018781526020018681526020018581526020018460001b81526020018360001b8152602001828103825288818151815260200191508051906020019080838360005b838110156114d15781810151838201526020016114b9565b50505050905090810190601f1680156114fe5780820380516001836020036101000a031916815260200191505b50975050505050505050600060405180830381600087803b15801561152257600080fd5b505af1158015611536573d6000803e3d6000fd5b5050505050505050565b601281565b600085846115538282613887565b61155b613204565b6115636133a3565b600354604080516327c319e960e11b81526001600160a01b039283166004820181905260248201819052604482018d9052606482018c9052608482018b905260a4820152600060c4820181905289841660e4830152610104820189905282519490931693634f8633d29361012480840194938390030190829087803b1580156115eb57600080fd5b505af11580156115ff573d6000803e3d6000fd5b505050506040513d604081101561161557600080fd5b505198975050505050505050565b60085460ff1681565b6116346137da565b61163c613204565b6116446131eb565b6003546040805163fd864ccf60e01b81526001600160a01b03858116600483015292831660248201529051929091169163fd864ccf9160448082019260009290919082900301818387803b15801561124257600080fd5b60006116a56131eb565b6001600160a01b03166332608039836040518263ffffffff1660e01b81526004018082815260200191505060206040518083038186803b158015610de657600080fd5b600a5460ff1681565b60006116fb6131eb565b6001600160a01b0316637b1001b78360016040518363ffffffff1660e01b815260040180838152602001821515151581526020019250505060206040518083038186803b158015610de657600080fd5b600061175561330d565b95945050505050565b60006117686131eb565b6001600160a01b0316634e99bda96040518163ffffffff1660e01b815260040160206040518083038186803b1580156117a057600080fd5b505afa1580156117b4573d6000803e3d6000fd5b505050506040513d60208110156117ca57600080fd5b5051905090565b60006117db61343e565b6117e3613204565b6000806117ee6131eb565b600354604080516339632c0b60e11b81526001600160a01b03928316600482015260016024820152815193909216926372c658169260448082019392918290030181600087803b15801561184157600080fd5b505af1158015611855573d6000803e3d6000fd5b505050506040513d604081101561186b57600080fd5b5080516020909101516003549193509150611891906001600160a01b03168383826138ee565b6003546000906118b2906001600160a01b03166118ac6139c5565b856139e4565b9050806118f05760405162461bcd60e51b815260040180806020018281038252602481526020018061494b6024913960400191505060405180910390fd5b6118f86139c5565b6001600160a01b0316633c6b16ab846040518263ffffffff1660e01b815260040180828152602001915050600060405180830381600087803b15801561193d57600080fd5b505af1158015611951573d6000803e3d6000fd5b50929550505050505090565b6001546001600160a01b031681565b600061197661343e565b61197e613204565b6000806119896131eb565b604080516339632c0b60e11b81526001600160a01b038781166004830152600060248301819052835194909116936372c65816936044808501949193918390030190829087803b1580156119dc57600080fd5b505af11580156119f0573d6000803e3d6000fd5b505050506040513d6040811015611a0657600080fd5b5080516020909101516003549193509150611a2f908590849084906001600160a01b03166138ee565b8115611d5257600080611a406139f1565b6001600160a01b0316638074b3726040518163ffffffff1660e01b815260040160206040518083038186803b158015611a7857600080fd5b505afa158015611a8c573d6000803e3d6000fd5b505050506040513d6020811015611aa257600080fd5b505190506000611ab06139f1565b6001600160a01b03166331e4e0306040518163ffffffff1660e01b815260040160206040518083038186803b158015611ae857600080fd5b505afa158015611afc573d6000803e3d6000fd5b505050506040513d6020811015611b1257600080fd5b50519050611b26828263ffffffff613a0916565b851115611c88576000611b376139f1565b6001600160a01b0316635616c957896040518263ffffffff1660e01b815260040180826001600160a01b03166001600160a01b0316815260200191505060206040518083038186803b158015611b8c57600080fd5b505afa158015611ba0573d6000803e3d6000fd5b505050506040513d6020811015611bb657600080fd5b505190506000611bc78983866139e4565b905080611c055760405162461bcd60e51b815260040180806020018281038252602481526020018061483b6024913960400191505060405180910390fd5b600354600090611c20908b906001600160a01b0316866139e4565b905080611c5e5760405162461bcd60e51b81526004018080602001828103825260298152602001806149e96029913960400191505060405180910390fd5b611c7e611c71868663ffffffff613a0916565b899063ffffffff613a6a16565b9550505050611c8c565b8492505b6000611ca088611c9a6139c5565b866139e4565b905080611cde5760405162461bcd60e51b815260040180806020018281038252602481526020018061494b6024913960400191505060405180910390fd5b611ce66139c5565b6001600160a01b0316633c6b16ab856040518263ffffffff1660e01b815260040180828152602001915050600060405180830381600087803b158015611d2b57600080fd5b505af1158015611d3f573d6000803e3d6000fd5b5050505060019650505050505050610e15565b600092505050610e15565b611d65613ac7565b611d6f8282613b34565b5050565b6000611d7d6131eb565b60048054604080516370a0823160e01b81526001600160a01b0387811694820194909452905193831693636bed041593879316916370a08231916024808301926020929190829003018186803b158015611dd657600080fd5b505afa158015611dea573d6000803e3d6000fd5b505050506040513d6020811015611e0057600080fd5b5051604080516001600160e01b031960e086901b1681526001600160a01b03909316600484015260248301919091528051604480840193829003018186803b158015611e4b57600080fd5b505afa158015611e5f573d6000803e3d6000fd5b505050506040513d6040811015611e7557600080fd5b505192915050565b611e8561381a565b60028054604080516020810189905280820188905260608101879052608081018690526001600160a01b0385811660a0808401919091528351808403909101815260c0909201928390529092169263907dff97929180603e6148b88239603e0190506040518091039020611ef88b613c51565b6000806040518763ffffffff1660e01b815260040180806020018781526020018681526020018581526020018460001b81526020018360001b8152602001828103825288818151815260200191508051906020019080838360005b83811015611f6b578181015183820152602001611f53565b50505050905090810190601f168015611f985780820380516001836020036101000a031916815260200191505b50975050505050505050600060405180830381600087803b158015611fbc57600080fd5b505af1158015611fd0573d6000803e3d6000fd5b50505050505050505050565b611fe461381a565b6002805460408051602081018690528082018590528151808203830181526060909101918290526001600160a01b039092169263907dff97929180602761499082396027019050604051809103902061203c88613c51565b6000806040518763ffffffff1660e01b815260040180806020018781526020018681526020018581526020018460001b81526020018360001b8152602001828103825288818151815260200191508051906020019080838360005b838110156120af578181015183820152602001612097565b50505050905090810190601f1680156120dc5780820380516001836020036101000a031916815260200191505b50975050505050505050600060405180830381600087803b15801561210057600080fd5b505af1158015612114573d6000803e3d6000fd5b50505050505050565b60048054604080516370a0823160e01b81526001600160a01b03858116948201949094529051600093909216916370a0823191602480820192602092909190829003018186803b158015610de657600080fd5b606061217a6131eb565b6001600160a01b03166372cb051f6040518163ffffffff1660e01b815260040160006040518083038186803b1580156121b257600080fd5b505afa1580156121c6573d6000803e3d6000fd5b505050506040513d6000823e601f3d908101601f1916820160405260208110156121ef57600080fd5b810190808051604051939291908464010000000082111561220f57600080fd5b90830190602082018581111561222457600080fd5b825186602082028301116401000000008211171561224157600080fd5b82525081516020918201928201910280838360005b8381101561226e578181015183820152602001612256565b50505050905001604052505050905090565b606061228a6125bc565b905060005b8151811015611d6f5760008282815181106122a657fe5b602002602001015190506000600860019054906101000a90046001600160a01b03166001600160a01b031663dacb2d01838460405160200180807f5265736f6c766572206d697373696e67207461726765743a20000000000000008152506019018281526020019150506040516020818303038152906040526040518363ffffffff1660e01b81526004018083815260200180602001828103825283818151815260200191508051906020019080838360005b83811015612371578181015183820152602001612359565b50505050905090810190601f16801561239e5780820380516001836020036101000a031916815260200191505b50935050505060206040518083038186803b1580156123bc57600080fd5b505afa1580156123d0573d6000803e3d6000fd5b505050506040513d60208110156123e657600080fd5b505160008381526009602090815260409182902080546001600160a01b0319166001600160a01b03851690811790915582518681529182015281519293507f88a93678a3692f6789d9546fc621bf7234b101ddb7d4fe479455112831b8aa68929081900390910190a1505060010161228f565b6001546001600160a01b031633146124a25760405162461bcd60e51b81526004018080602001828103825260358152602001806148066035913960400191505060405180910390fd5b600054600154604080516001600160a01b03938416815292909116602083015280517fb532073b38c83145e3e5135377a08bf9aab55bc0fd7c1179cd4fb995d2a5159c9281900390910190a160018054600080546001600160a01b03199081166001600160a01b03841617909155169055565b600061251f6131eb565b6001600160a01b031663835e119c836040518263ffffffff1660e01b81526004018082815260200191505060206040518083038186803b158015610de657600080fd5b600061256c6131eb565b6001600160a01b0316637b1001b78360006040518363ffffffff1660e01b815260040180838152602001821515151581526020019250505060206040518083038186803b158015610de657600080fd5b6060806125c7613c5d565b60408051600180825281830190925291925060609190602080830190803883390190505090507453796e746865746978427269646765546f4261736560581b8160008151811061261357fe5b6020026020010181815250506126298282613d7a565b9250505090565b6126386137da565b612640613204565b6126486131eb565b600354604080516285c0d160e31b81526001600160a01b039283166004820152602481018590529051929091169163042e06889160448082019260009290919082900301818387803b15801561124257600080fd5b6000546001600160a01b031681565b600085846126ba8282613887565b6126c2613204565b6126ca6133a3565b600354604080516327c319e960e11b81526001600160a01b038d8116600483018190529381166024830152604482018d9052606482018c9052608482018b905260a4820193909352600060c4820181905289841660e4830152610104820189905282519490931693634f8633d29361012480840194938390030190829087803b15801561275657600080fd5b505af115801561276a573d6000803e3d6000fd5b505050506040513d604081101561278057600080fd5b50519998505050505050505050565b631cd554d160e21b81565b6006805460408051602060026001851615610100026000190190941693909304601f81018490048402820184019092528181529291830182828015610ea05780601f10610e7557610100808354040283529160200191610ea0565b6127fd61335a565b600280546001600160a01b0383166001600160a01b0319909116811790915560408051918252517ffc80377ca9c49cc11ae6982f390a42db976d5530af7c43889264b13fbbd7c57e9181900360200190a150565b6128596137da565b612861613204565b6128696131eb565b600354604080516324beb82560e11b81526001600160a01b0392831660048201529051929091169163497d704a9160248082019260009290919082900301818387803b1580156128b857600080fd5b505af11580156128cc573d6000803e3d6000fd5b505050505b565b60008060006128e0613204565b6128e86133a3565b600354604080516306c5a00b60e21b81526001600160a01b0392831660048201526024810188905290519290911691631b16802c916044808201926060929091908290030181600087803b15801561293f57600080fd5b505af1158015610fcd573d6000803e3d6000fd5b61295b613e36565b600480546001600160a01b0319166001600160a01b03831617905561125b81613ecf565b60006129896131eb565b6001600160a01b031663a311c7c2836040518263ffffffff1660e01b815260040180826001600160a01b03166001600160a01b0316815260200191505060206040518083038186803b158015610de657600080fd5b6129e661335a565b600a5460ff1661125b57600a805460ff191660011790556000612a1c612a0a6139c5565b6000546001600160a01b0316846139e4565b905080611d6f576040805162461bcd60e51b815260206004820152601b60248201527f7265737469747574696f6e207472616e73666572206661696c65640000000000604482015290519081900360640190fd5b6000612a7a6131eb565b6001600160a01b031663a5fdc5de836040518263ffffffff1660e01b815260040180826001600160a01b03166001600160a01b0316815260200191505060206040518083038186803b158015610de657600080fd5b6000612ad96133ba565b612ae161343e565b600354612af7906001600160a01b031683613492565b50600354610f39906001600160a01b031684846139e4565b612b1761381a565b6002805460408051602081018690528082018590528151808203830181526060909101918290526001600160a01b039092169263907dff97929180602861485f82396028019050604051809103902061203c88613c51565b612b776137da565b612b7f613204565b612b876131eb565b6003546040805163644bb89960e11b81526001600160a01b0392831660048201529051929091169163c89771329160248082019260009290919082900301818387803b1580156128b857600080fd5b612bde613ffa565b600380546001600160a01b0319166001600160a01b0392909216919091179055565b612c086137da565b612c10613204565b612c186131eb565b60035460408051632694552d60e21b81526001600160a01b03868116600483015292831660248201526044810185905290519290911691639a5154b49160648082019260009290919082900301818387803b158015612c7657600080fd5b505af1158015612c8a573d6000803e3d6000fd5b505050505050565b60008382612ca08282613887565b612ca8613204565b612cb06133a3565b600354604080516327c319e960e11b81526001600160a01b038b8116600483018190529381166024830152604482018b9052606482018a90526084820189905260a48201849052600060c4830181905260e483019490945261010482018490528251941693634f8633d29361012480840194938390030190829087803b158015612d3957600080fd5b505af1158015612d4d573d6000803e3d6000fd5b505050506040513d6040811015612d6357600080fd5b5051979650505050505050565b6000612d7a6131eb565b6001600160a01b031663d37c4d8b84846040518363ffffffff1660e01b815260040180836001600160a01b03166001600160a01b031681526020018281526020019250505060206040518083038186803b158015612dd757600080fd5b505afa158015612deb573d6000803e3d6000fd5b505050506040513d6020811015612e0157600080fd5b50519392505050565b6003546001600160a01b031681565b612e21613ac7565b6000612e2b614053565b9050612e378183613b34565b806001600160a01b03166359974e38836040518263ffffffff1660e01b815260040180828152602001915050602060405180830381600087803b158015612e7d57600080fd5b505af1158015612e91573d6000803e3d6000fd5b505050506040513d60208110156128cc57600080fd5b6000612eb16131eb565b6001600160a01b031663dbf633406040518163ffffffff1660e01b815260040160206040518083038186803b1580156117a057600080fd5b6004805460408051636eb1769f60e11b81526001600160a01b0386811694820194909452848416602482015290516000939092169163dd62ed3e91604480820192602092909190829003018186803b158015612dd757600080fd5b612f4c6137da565b612f54613204565b612f5c6131eb565b6003546040805163227635b160e11b81526001600160a01b038681166004830152928316602482015260448101859052905192909116916344ec6b629160648082019260009290919082900301818387803b158015612c7657600080fd5b6004546001600160a01b031681565b6002546001600160a01b031681565b612fe0613ac7565b612fe861343e565b60048054604080516370a0823160e01b81526001600160a01b03868116948201949094529051929091169163b46310f691859161308091869186916370a08231916024808301926020929190829003018186803b15801561304857600080fd5b505afa15801561305c573d6000803e3d6000fd5b505050506040513d602081101561307257600080fd5b50519063ffffffff613a6a16565b6040518363ffffffff1660e01b815260040180836001600160a01b03166001600160a01b0316815260200182815260200192505050600060405180830381600087803b1580156130cf57600080fd5b505af11580156130e3573d6000803e3d6000fd5b505050506130f382600083614074565b600754613106908263ffffffff613a6a16565b6007555050565b6000838261311b8282613887565b613123613204565b61312b6133a3565b600354604080516327c319e960e11b81526001600160a01b039283166004820181905260248201819052604482018b9052606482018a90526084820189905260a48201819052600060c4830181905260e4830191909152610104820181905282519490931693634f8633d29361012480840194938390030190829087803b1580156131b557600080fd5b505af11580156131c9573d6000803e3d6000fd5b505050506040513d60408110156131df57600080fd5b50519695505050505050565b60006131ff6524b9b9bab2b960d11b6140c7565b905090565b6002546001600160a01b0316331480159061322a57506003546001600160a01b03163314155b156128d157600380546001600160a01b03191633179055565b60025460408051602080820185905282518083039091018152908201918290526001600160a01b039092169163907dff979160039080602161496f82396021019050604051809103902061329688613c51565b61329f88613c51565b60006040518763ffffffff1660e01b815260040180806020018781526020018681526020018581526020018481526020018360001b815260200182810382528881815181526020019150805190602001908083836000838110156120af578181015183820152602001612097565b6040805162461bcd60e51b815260206004820152601b60248201527f43616e6e6f742062652072756e206f6e2074686973206c617965720000000000604482015290519081900360640190fd5b6000546001600160a01b031633146128d15760405162461bcd60e51b815260040180806020018281038252602f81526020018061491c602f913960400191505060405180910390fd5b60006131ff6822bc31b430b733b2b960b91b6140c7565b6002546001600160a01b03163314156133d2576128d1565b6133db336141a4565b156133f757600380546001600160a01b031916331790556128d1565b6040805162461bcd60e51b815260206004820152601760248201527613db9b1e481d1a19481c1c9bde1e4818d85b8818d85b1b604a1b604482015290519081900360640190fd5b6134466145a1565b6001600160a01b031663086dabd16040518163ffffffff1660e01b815260040160006040518083038186803b15801561347e57600080fd5b505afa1580156128cc573d6000803e3d6000fd5b60008061349d6131eb565b6001600160a01b031663d37c4d8b85631cd554d160e21b6040518363ffffffff1660e01b815260040180836001600160a01b03166001600160a01b031681526020018281526020019250505060206040518083038186803b15801561350157600080fd5b505afa158015613515573d6000803e3d6000fd5b505050506040513d602081101561352b57600080fd5b505111156136d95760008061353e6131eb565b60048054604080516370a0823160e01b81526001600160a01b038a811694820194909452905193831693636bed0415938a9316916370a08231916024808301926020929190829003018186803b15801561359757600080fd5b505afa1580156135ab573d6000803e3d6000fd5b505050506040513d60208110156135c157600080fd5b5051604080516001600160e01b031960e086901b1681526001600160a01b03909316600484015260248301919091528051604480840193829003018186803b15801561360c57600080fd5b505afa158015613620573d6000803e3d6000fd5b505050506040513d604081101561363657600080fd5b5080516020909101519092509050818411156136835760405162461bcd60e51b81526004018080602001828103825260268152602001806148f66026913960400191505060405180910390fd5b80156136d6576040805162461bcd60e51b815260206004820152601e60248201527f412073796e7468206f7220534e58207261746520697320696e76616c69640000604482015290519081900360640190fd5b50505b50600192915050565b6004805460408051636eb1769f60e11b81526001600160a01b0387811694820194909452878416602482015290516000939092169163da46098c918791899161374f918891879163dd62ed3e91604480820192602092909190829003018186803b15801561304857600080fd5b6040518463ffffffff1660e01b815260040180846001600160a01b03166001600160a01b03168152602001836001600160a01b03166001600160a01b031681526020018281526020019350505050600060405180830381600087803b1580156137b757600080fd5b505af11580156137cb573d6000803e3d6000fd5b505050506117558484846145bb565b6137e26145a1565b6001600160a01b0316637c3125416040518163ffffffff1660e01b815260040160006040518083038186803b15801561347e57600080fd5b6138226133a3565b6001600160a01b0316336001600160a01b0316146128d1576040805162461bcd60e51b815260206004820152601e60248201527f4f6e6c792045786368616e6765722063616e20696e766f6b6520746869730000604482015290519081900360640190fd5b61388f6145a1565b6001600160a01b0316631ce00ba283836040518363ffffffff1660e01b8152600401808381526020018281526020019250505060006040518083038186803b1580156138da57600080fd5b505afa158015612c8a573d6000803e3d6000fd5b6002805460408051602081018790528082018690526001600160a01b03858116606080840191909152835180840390910181526080909201928390529092169263907dff9792918060326149b782396032019050604051809103902061395389613c51565b6000806040518763ffffffff1660e01b815260040180806020018781526020018681526020018581526020018460001b81526020018360001b815260200182810382528881815181526020019150805190602001908083836000838110156114d15781810151838201526020016114b9565b60006131ff704c697175696461746f725265776172647360781b6140c7565b60006111cc8484846145bb565b60006131ff692634b8bab4b230ba37b960b11b6140c7565b600082820183811015613a63576040805162461bcd60e51b815260206004820152601b60248201527f536166654d6174683a206164646974696f6e206f766572666c6f770000000000604482015290519081900360640190fd5b9392505050565b600082821115613ac1576040805162461bcd60e51b815260206004820152601e60248201527f536166654d6174683a207375627472616374696f6e206f766572666c6f770000604482015290519081900360640190fd5b50900390565b613acf6147e2565b6001600160a01b0316336001600160a01b0316146128d1576040805162461bcd60e51b815260206004820152601d60248201527f43616e206f6e6c7920626520696e766f6b656420627920627269646765000000604482015290519081900360640190fd5b60048054604080516370a0823160e01b81526001600160a01b03868116948201949094529051929091169163b46310f6918591613bcc91869186916370a08231916024808301926020929190829003018186803b158015613b9457600080fd5b505afa158015613ba8573d6000803e3d6000fd5b505050506040513d6020811015613bbe57600080fd5b50519063ffffffff613a0916565b6040518363ffffffff1660e01b815260040180836001600160a01b03166001600160a01b0316815260200182815260200192505050600060405180830381600087803b158015613c1b57600080fd5b505af1158015613c2f573d6000803e3d6000fd5b50505050613c3e308383614074565b600754613106908263ffffffff613a0916565b6001600160a01b031690565b60408051600680825260e082019092526060916020820160c0803883390190505090506b53797374656d53746174757360a01b81600081518110613c9d57fe5b6020026020010181815250506822bc31b430b733b2b960b91b81600181518110613cc357fe5b6020026020010181815250506524b9b9bab2b960d11b81600281518110613ce657fe5b602002602001018181525050722932bbb0b93239a234b9ba3934b13aba34b7b760691b81600381518110613d1657fe5b602002602001018181525050704c697175696461746f725265776172647360781b81600481518110613d4457fe5b602002602001018181525050692634b8bab4b230ba37b960b11b81600581518110613d6b57fe5b60200260200101818152505090565b60608151835101604051908082528060200260200182016040528015613daa578160200160208202803883390190505b50905060005b8351811015613dec57838181518110613dc557fe5b6020026020010151828281518110613dd957fe5b6020908102919091010152600101613db0565b5060005b8251811015613e2f57828181518110613e0557fe5b6020026020010151828286510181518110613e1c57fe5b6020908102919091010152600101613df0565b5092915050565b6002546001600160a01b03163314801590613e5c57506003546001600160a01b03163314155b15613e7457600380546001600160a01b031916331790555b6000546003546001600160a01b039081169116146128d1576040805162461bcd60e51b815260206004820152601360248201527227bbb732b91037b7363c90333ab731ba34b7b760691b604482015290519081900360640190fd5b600254604080516001600160a01b038481166020808401919091528351808403820181528385018086527f546f6b656e5374617465557064617465642861646472657373290000000000009052935192839003605a01832063907dff9760e01b8452600160248501819052604485018290526000606486018190526084860181905260a4860181905260c060048701908152875160c48801528751959098169763907dff97979692959394919384938493839260e490920191908a0190808383885b83811015613fa9578181015183820152602001613f91565b50505050905090810190601f168015613fd65780820380516001836020036101000a031916815260200191505b50975050505050505050600060405180830381600087803b15801561124257600080fd5b6002546001600160a01b031633146128d1576040805162461bcd60e51b815260206004820152601760248201527613db9b1e481d1a19481c1c9bde1e4818d85b8818d85b1b604a1b604482015290519081900360640190fd5b60006131ff722932bbb0b93239a234b9ba3934b13aba34b7b760691b6140c7565b60025460408051602080820185905282518083039091018152908201918290526001600160a01b039092169163907dff9791600390806021614a1282396021019050604051809103902061329688613c51565b600081815260096020908152604080832054815170026b4b9b9b4b7339030b2323932b9b99d1607d1b9381019390935260318084018690528251808503909101815260519093019091526001600160a01b03169081613e2f5760405162461bcd60e51b81526004018080602001828103825283818151815260200191508051906020019080838360005b83811015614169578181015183820152602001614151565b50505050905090810190601f1680156141965780820380516001836020036101000a031916815260200191505b509250505060405180910390fd5b600854604080516321f8a72160e01b81527f53796e746865746978427269646765546f4f7074696d69736d000000000000006004820152905160009261010090046001600160a01b0316916321f8a721916024808301926020929190829003018186803b15801561421457600080fd5b505afa158015614228573d6000803e3d6000fd5b505050506040513d602081101561423e57600080fd5b50516001600160a01b03838116911614806142f95750600860019054906101000a90046001600160a01b03166001600160a01b03166321f8a7216040518163ffffffff1660e01b815260040180806d2932bbb0b93222b9b1b937bbab1960911b815250602001905060206040518083038186803b1580156142be57600080fd5b505afa1580156142d2573d6000803e3d6000fd5b505050506040513d60208110156142e857600080fd5b50516001600160a01b038381169116145b806143a25750600860019054906101000a90046001600160a01b03166001600160a01b03166321f8a7216040518163ffffffff1660e01b815260040180806b526577617264457363726f7760a01b815250602001905060206040518083038186803b15801561436757600080fd5b505afa15801561437b573d6000803e3d6000fd5b505050506040513d602081101561439157600080fd5b50516001600160a01b038381169116145b8061444e5750600860019054906101000a90046001600160a01b03166001600160a01b03166321f8a7216040518163ffffffff1660e01b815260040180806e53796e746865746978457363726f7760881b815250602001905060206040518083038186803b15801561441357600080fd5b505afa158015614427573d6000803e3d6000fd5b505050506040513d602081101561443d57600080fd5b50516001600160a01b038381169116145b806144f95750600860019054906101000a90046001600160a01b03166001600160a01b03166321f8a7216040518163ffffffff1660e01b815260040180806d54726164696e675265776172647360901b815250602001905060206040518083038186803b1580156144be57600080fd5b505afa1580156144d2573d6000803e3d6000fd5b505050506040513d60208110156144e857600080fd5b50516001600160a01b038381169116145b8061459b5750600860019054906101000a90046001600160a01b03166001600160a01b03166321f8a7216040518163ffffffff1660e01b815260040180806411195c1bdd60da1b815250602001905060206040518083038186803b15801561456057600080fd5b505afa158015614574573d6000803e3d6000fd5b505050506040513d602081101561458a57600080fd5b50516001600160a01b038381169116145b92915050565b60006131ff6b53797374656d53746174757360a01b6140c7565b60006001600160a01b038316158015906145de57506001600160a01b0383163014155b80156145f857506002546001600160a01b03848116911614155b614649576040805162461bcd60e51b815260206004820152601f60248201527f43616e6e6f74207472616e7366657220746f2074686973206164647265737300604482015290519081900360640190fd5b60048054604080516370a0823160e01b81526001600160a01b03888116948201949094529051929091169163b46310f69187916146a991879186916370a08231916024808301926020929190829003018186803b15801561304857600080fd5b6040518363ffffffff1660e01b815260040180836001600160a01b03166001600160a01b0316815260200182815260200192505050600060405180830381600087803b1580156146f857600080fd5b505af115801561470c573d6000803e3d6000fd5b505060048054604080516370a0823160e01b81526001600160a01b0389811694820194909452905192909116935063b46310f69250869161477091879186916370a08231916024808301926020929190829003018186803b158015613b9457600080fd5b6040518363ffffffff1660e01b815260040180836001600160a01b03166001600160a01b0316815260200182815260200192505050600060405180830381600087803b1580156147bf57600080fd5b505af11580156147d3573d6000803e3d6000fd5b50505050610f39848484614074565b60006131ff7453796e746865746978427269646765546f4261736560581b6140c756fe596f75206d757374206265206e6f6d696e61746564206265666f726520796f752063616e20616363657074206f776e657273686970466c616720726577617264207472616e7366657220646964206e6f74207375636365656445786368616e67655265636c61696d28616464726573732c627974657333322c75696e743235362945786368616e6765547261636b696e6728627974657333322c627974657333322c75696e743235362c75696e743235362953796e746845786368616e676528616464726573732c627974657333322c75696e743235362c627974657333322c75696e743235362c616464726573732943616e6e6f74207472616e73666572207374616b6564206f7220657363726f77656420534e584f6e6c792074686520636f6e7472616374206f776e6572206d617920706572666f726d207468697320616374696f6e5472616e7366657220746f204c697175696461746f7252657761726473206661696c6564417070726f76616c28616464726573732c616464726573732c75696e743235362945786368616e676552656261746528616464726573732c627974657333322c75696e74323536294163636f756e744c69717569646174656428616464726573732c75696e743235362c75696e743235362c61646472657373294c697175696461746520726577617264207472616e7366657220646964206e6f7420737563636565645472616e7366657228616464726573732c616464726573732c75696e7432353629a265627a7a7231582040e513b13586dbe77dc8669110fcb80eb4668e64de26b8327036fc3dbc0f773d64736f6c63430005100032", - "nonce": 1, - "storage": { - "0x0000000000000000000000000000000000000000000000000000000000000002": "0x0000000000000000000000008700daec35af8ff88c16bdf0418774cb3d7599b4", - "0x0000000000000000000000000000000000000000000000000000000000000004": "0x000000000000000000000000b9c6ca25452e7f6d0d3340ce1e9b573421afc2ee", - "0x0000000000000000000000000000000000000000000000000000000000000007": "0x00000000000000000000000000000000000000000045d7d9edef875430aa78fd", - "0x00c50324f2cbbee41befa4c7fdd00b343ec22bfee15cf5653e85155e78b68e49": "0x00000000000000000000000001da457aa57abc0dba3fc26d6c350899f04e8417", - "0x939f3357d1ca64c26b8c45a68fa9fdeb7f4f7521b847cde512de59efdb59b00e": "0x000000000000000000000000136b1ec699c62b0606854056f02dc7bb80482d63", - "0xf3b5e7b2afaa87733d8bedb8430937194b0018dc023c813428f433d751622932": "0x000000000000000000000000e8c41be1a167314abaf2423b72bf8da826943ffd" - } - } -} diff --git a/op-chain-ops/crossdomain/testdata/trace.sh b/op-chain-ops/crossdomain/testdata/trace.sh deleted file mode 100755 index a2c6308782b7..000000000000 --- a/op-chain-ops/crossdomain/testdata/trace.sh +++ /dev/null @@ -1,30 +0,0 @@ -#!/usr/bin/env bash - -HASH=$1 - -if [[ -z $HASH ]]; then - exit 1 -fi - -DIR="$( cd "$( dirname "${BASH_SOURCE[0]}" )" > /dev/null && pwd )" - -TRACES=$DIR/call-traces -RECEIPTS=$DIR/receipts -DIFFS=$DIR/state-diffs - -mkdir -p "$TRACES" -mkdir -p "$RECEIPTS" -mkdir -p "$DIFFS" - -cast rpc \ - debug_traceTransaction \ - "$HASH" \ - '{"tracer": "callTracer"}' | jq > "$TRACES"/"$HASH".json - -cast receipt "$HASH" --json | jq > "$RECEIPTS"/"$HASH".json - -cast rpc \ - debug_traceTransaction \ - "$HASH" \ - '{"tracer": "prestateTracer"}' | jq > "$DIFFS"/"$HASH".json - diff --git a/op-chain-ops/crossdomain/testdata/witness.txt b/op-chain-ops/crossdomain/testdata/witness.txt deleted file mode 100644 index d7a8345a9425..000000000000 --- a/op-chain-ops/crossdomain/testdata/witness.txt +++ /dev/null @@ -1,3 +0,0 @@ -MSG|0x4200000000000000000000000000000000000007|cafa81dc000000000000000000000000000000000000000000000000000000000000002000000000000000000000000000000000000000000000000000000000000001a4cbd4ece900000000000000000000000099c9fc46f92e8a1c0dec1b1747d010903e884be1000000000000000000000000420000000000000000000000000000000000001000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000019bd000000000000000000000000000000000000000000000000000000000000000e4a9f9e675000000000000000000000000d533a949740bb3306d119cc777fa900ba034cd520000000000000000000000000994206dfe8de6ec6920ff4d779b0d950605fb53000000000000000000000000e3a44dd2a8c108be56a78635121ec914074da16d000000000000000000000000e3a44dd2a8c108be56a78635121ec914074da16d0000000000000000000000000000000000000000000001b0ac98ab3858d7547800000000000000000000000000000000000000000000000000000000000000c000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 -MSG|0x8B1d477410344785ff1DF52500032E6D5f532EE4|cafa81dc000000000000000000000000000000000000000000000000000000000000002000000000000000000000000000000000000000000000000000000000000000030420690000000000000000000000000000000000000000000000000000000000 -ETH|0x6340d44c5174588B312F545eEC4a42f8a514eF50 \ No newline at end of file diff --git a/op-chain-ops/deployer/apply.go b/op-chain-ops/deployer/apply.go new file mode 100644 index 000000000000..ca34d4266df7 --- /dev/null +++ b/op-chain-ops/deployer/apply.go @@ -0,0 +1,189 @@ +package deployer + +import ( + "context" + "crypto/ecdsa" + "fmt" + "strings" + + "github.com/ethereum-optimism/optimism/op-chain-ops/foundry" + + "github.com/ethereum-optimism/optimism/op-chain-ops/deployer/state" + + "github.com/ethereum-optimism/optimism/op-chain-ops/deployer/pipeline" + opcrypto "github.com/ethereum-optimism/optimism/op-service/crypto" + "github.com/ethereum-optimism/optimism/op-service/ctxinterrupt" + oplog "github.com/ethereum-optimism/optimism/op-service/log" + "github.com/ethereum/go-ethereum/crypto" + "github.com/ethereum/go-ethereum/ethclient" + "github.com/ethereum/go-ethereum/log" + "github.com/urfave/cli/v2" +) + +type ApplyConfig struct { + L1RPCUrl string + Workdir string + PrivateKey string + Logger log.Logger + + privateKeyECDSA *ecdsa.PrivateKey +} + +func (a *ApplyConfig) Check() error { + if a.L1RPCUrl == "" { + return fmt.Errorf("l1RPCUrl must be specified") + } + + if a.Workdir == "" { + return fmt.Errorf("workdir must be specified") + } + + if a.PrivateKey == "" { + return fmt.Errorf("private key must be specified") + } + + privECDSA, err := crypto.HexToECDSA(strings.TrimPrefix(a.PrivateKey, "0x")) + if err != nil { + return fmt.Errorf("failed to parse private key: %w", err) + } + a.privateKeyECDSA = privECDSA + + if a.Logger == nil { + return fmt.Errorf("logger must be specified") + } + + return nil +} + +func ApplyCLI() func(cliCtx *cli.Context) error { + return func(cliCtx *cli.Context) error { + logCfg := oplog.ReadCLIConfig(cliCtx) + l := oplog.NewLogger(oplog.AppOut(cliCtx), logCfg) + oplog.SetGlobalLogHandler(l.Handler()) + + l1RPCUrl := cliCtx.String(L1RPCURLFlagName) + workdir := cliCtx.String(WorkdirFlagName) + privateKey := cliCtx.String(PrivateKeyFlagName) + + ctx := ctxinterrupt.WithCancelOnInterrupt(cliCtx.Context) + + return Apply(ctx, ApplyConfig{ + L1RPCUrl: l1RPCUrl, + Workdir: workdir, + PrivateKey: privateKey, + Logger: l, + }) + } +} + +func Apply(ctx context.Context, cfg ApplyConfig) error { + if err := cfg.Check(); err != nil { + return fmt.Errorf("invalid config for apply: %w", err) + } + + l1Client, err := ethclient.Dial(cfg.L1RPCUrl) + if err != nil { + return fmt.Errorf("failed to connect to L1 RPC: %w", err) + } + + chainID, err := l1Client.ChainID(ctx) + if err != nil { + return fmt.Errorf("failed to get chain ID: %w", err) + } + + signer := opcrypto.SignerFnFromBind(opcrypto.PrivateKeySignerFn(cfg.privateKeyECDSA, chainID)) + deployer := crypto.PubkeyToAddress(cfg.privateKeyECDSA.PublicKey) + + env := &pipeline.Env{ + Workdir: cfg.Workdir, + L1Client: l1Client, + Logger: cfg.Logger, + Signer: signer, + Deployer: deployer, + } + + intent, err := env.ReadIntent() + if err != nil { + return err + } + + if err := intent.Check(); err != nil { + return fmt.Errorf("invalid intent: %w", err) + } + + st, err := env.ReadState() + if err != nil { + return err + } + + if err := ApplyPipeline(ctx, env, intent, st); err != nil { + return err + } + + st.AppliedIntent = intent + if err := env.WriteState(st); err != nil { + return err + } + + return nil +} + +type pipelineStage struct { + name string + apply pipeline.Stage +} + +func ApplyPipeline( + ctx context.Context, + env *pipeline.Env, + intent *state.Intent, + st *state.State, +) error { + progressor := func(curr, total int64) { + env.Logger.Info("artifacts download progress", "current", curr, "total", total) + } + + artifactsFS, cleanup, err := pipeline.DownloadArtifacts(ctx, intent.ContractArtifactsURL, progressor) + if err != nil { + return fmt.Errorf("failed to download artifacts: %w", err) + } + defer func() { + if err := cleanup(); err != nil { + env.Logger.Warn("failed to clean up artifacts", "err", err) + } + }() + + pline := []pipelineStage{ + {"init", pipeline.Init}, + {"deploy-superchain", pipeline.DeploySuperchain}, + {"deploy-implementations", pipeline.DeployImplementations}, + } + + for _, chain := range intent.Chains { + chainID := chain.ID + pline = append(pline, pipelineStage{ + fmt.Sprintf("deploy-opchain-%s", chainID.Hex()), + func(ctx context.Context, env *pipeline.Env, artifactsFS foundry.StatDirFs, intent *state.Intent, st *state.State) error { + return pipeline.DeployOPChain(ctx, env, artifactsFS, intent, st, chainID) + }, + }, pipelineStage{ + fmt.Sprintf("generate-l2-genesis-%s", chainID.Hex()), + func(ctx context.Context, env *pipeline.Env, artifactsFS foundry.StatDirFs, intent *state.Intent, st *state.State) error { + return pipeline.GenerateL2Genesis(ctx, env, artifactsFS, intent, st, chainID) + }, + }) + } + + for _, stage := range pline { + if err := stage.apply(ctx, env, artifactsFS, intent, st); err != nil { + return fmt.Errorf("error in pipeline stage apply: %w", err) + } + } + + st.AppliedIntent = intent + if err := env.WriteState(st); err != nil { + return fmt.Errorf("failed to write state: %w", err) + } + + return nil +} diff --git a/op-chain-ops/deployer/broadcaster/broadcaster.go b/op-chain-ops/deployer/broadcaster/broadcaster.go new file mode 100644 index 000000000000..641d1f73dfb5 --- /dev/null +++ b/op-chain-ops/deployer/broadcaster/broadcaster.go @@ -0,0 +1,21 @@ +package broadcaster + +import ( + "context" + + "github.com/ethereum-optimism/optimism/op-chain-ops/script" + "github.com/ethereum/go-ethereum/common" + "github.com/ethereum/go-ethereum/core/types" +) + +type Broadcaster interface { + Broadcast(ctx context.Context) ([]BroadcastResult, error) + Hook(bcast script.Broadcast) +} + +type BroadcastResult struct { + Broadcast script.Broadcast `json:"broadcast"` + TxHash common.Hash `json:"txHash"` + Receipt *types.Receipt `json:"receipt"` + Err error `json:"-"` +} diff --git a/op-chain-ops/deployer/broadcaster/discard.go b/op-chain-ops/deployer/broadcaster/discard.go new file mode 100644 index 000000000000..42f5b1b0a964 --- /dev/null +++ b/op-chain-ops/deployer/broadcaster/discard.go @@ -0,0 +1,20 @@ +package broadcaster + +import ( + "context" + + "github.com/ethereum-optimism/optimism/op-chain-ops/script" +) + +type discardBroadcaster struct { +} + +func DiscardBroadcaster() Broadcaster { + return &discardBroadcaster{} +} + +func (d *discardBroadcaster) Broadcast(ctx context.Context) ([]BroadcastResult, error) { + return nil, nil +} + +func (d *discardBroadcaster) Hook(bcast script.Broadcast) {} diff --git a/op-chain-ops/deployer/broadcaster/keyed.go b/op-chain-ops/deployer/broadcaster/keyed.go new file mode 100644 index 000000000000..2784c4d455be --- /dev/null +++ b/op-chain-ops/deployer/broadcaster/keyed.go @@ -0,0 +1,224 @@ +package broadcaster + +import ( + "context" + "fmt" + "math/big" + "time" + + "github.com/ethereum-optimism/optimism/op-chain-ops/script" + opcrypto "github.com/ethereum-optimism/optimism/op-service/crypto" + "github.com/ethereum-optimism/optimism/op-service/eth" + "github.com/ethereum-optimism/optimism/op-service/txmgr" + "github.com/ethereum-optimism/optimism/op-service/txmgr/metrics" + "github.com/ethereum/go-ethereum/common" + "github.com/ethereum/go-ethereum/core" + "github.com/ethereum/go-ethereum/ethclient" + "github.com/ethereum/go-ethereum/log" + "github.com/hashicorp/go-multierror" + "github.com/holiman/uint256" +) + +const ( + GasPadFactor = 2.0 +) + +type KeyedBroadcaster struct { + lgr log.Logger + mgr txmgr.TxManager + bcasts []script.Broadcast + client *ethclient.Client +} + +type KeyedBroadcasterOpts struct { + Logger log.Logger + ChainID *big.Int + Client *ethclient.Client + Signer opcrypto.SignerFn + From common.Address + TXManagerLogger log.Logger +} + +func NewKeyedBroadcaster(cfg KeyedBroadcasterOpts) (*KeyedBroadcaster, error) { + mgrCfg := &txmgr.Config{ + Backend: cfg.Client, + ChainID: cfg.ChainID, + TxSendTimeout: 5 * time.Minute, + TxNotInMempoolTimeout: time.Minute, + NetworkTimeout: 10 * time.Second, + ReceiptQueryInterval: time.Second, + NumConfirmations: 1, + SafeAbortNonceTooLowCount: 3, + Signer: cfg.Signer, + From: cfg.From, + } + + minTipCap, err := eth.GweiToWei(1.0) + if err != nil { + panic(err) + } + minBaseFee, err := eth.GweiToWei(1.0) + if err != nil { + panic(err) + } + + mgrCfg.ResubmissionTimeout.Store(int64(48 * time.Second)) + mgrCfg.FeeLimitMultiplier.Store(5) + mgrCfg.FeeLimitThreshold.Store(big.NewInt(100)) + mgrCfg.MinTipCap.Store(minTipCap) + mgrCfg.MinTipCap.Store(minBaseFee) + + txmLogger := log.NewLogger(log.DiscardHandler()) + if cfg.TXManagerLogger != nil { + txmLogger = cfg.TXManagerLogger + } + + mgr, err := txmgr.NewSimpleTxManagerFromConfig( + "transactor", + txmLogger, + &metrics.NoopTxMetrics{}, + mgrCfg, + ) + + if err != nil { + return nil, fmt.Errorf("failed to create tx manager: %w", err) + } + + return &KeyedBroadcaster{ + lgr: cfg.Logger, + mgr: mgr, + client: cfg.Client, + }, nil +} + +func (t *KeyedBroadcaster) Hook(bcast script.Broadcast) { + t.bcasts = append(t.bcasts, bcast) +} + +func (t *KeyedBroadcaster) Broadcast(ctx context.Context) ([]BroadcastResult, error) { + results := make([]BroadcastResult, len(t.bcasts)) + futures := make([]<-chan txmgr.SendResponse, len(t.bcasts)) + ids := make([]common.Hash, len(t.bcasts)) + + latestBlock, err := t.client.BlockByNumber(ctx, nil) + if err != nil { + return nil, fmt.Errorf("failed to get latest block: %w", err) + } + + for i, bcast := range t.bcasts { + futures[i], ids[i] = t.broadcast(ctx, bcast, latestBlock.GasLimit()) + t.lgr.Info( + "transaction broadcasted", + "id", ids[i], + "nonce", bcast.Nonce, + ) + } + + var txErr *multierror.Error + var completed int + for i, fut := range futures { + bcastRes := <-fut + completed++ + outRes := BroadcastResult{ + Broadcast: t.bcasts[i], + } + + if bcastRes.Err == nil { + outRes.Receipt = bcastRes.Receipt + outRes.TxHash = bcastRes.Receipt.TxHash + + if bcastRes.Receipt.Status == 0 { + failErr := fmt.Errorf("transaction failed: %s", outRes.Receipt.TxHash.String()) + txErr = multierror.Append(txErr, failErr) + outRes.Err = failErr + t.lgr.Error( + "transaction failed on chain", + "id", ids[i], + "completed", completed, + "total", len(t.bcasts), + "hash", outRes.Receipt.TxHash.String(), + "nonce", outRes.Broadcast.Nonce, + ) + } else { + t.lgr.Info( + "transaction confirmed", + "id", ids[i], + "completed", completed, + "total", len(t.bcasts), + "hash", outRes.Receipt.TxHash.String(), + "nonce", outRes.Broadcast.Nonce, + "creation", outRes.Receipt.ContractAddress, + ) + } + } else { + txErr = multierror.Append(txErr, bcastRes.Err) + outRes.Err = bcastRes.Err + t.lgr.Error( + "transaction failed", + "id", ids[i], + "completed", completed, + "total", len(t.bcasts), + "err", bcastRes.Err, + ) + } + + results = append(results, outRes) + } + return results, txErr.ErrorOrNil() +} + +func (t *KeyedBroadcaster) broadcast(ctx context.Context, bcast script.Broadcast, blockGasLimit uint64) (<-chan txmgr.SendResponse, common.Hash) { + ch := make(chan txmgr.SendResponse, 1) + + id := bcast.ID() + value := ((*uint256.Int)(bcast.Value)).ToBig() + var candidate txmgr.TxCandidate + switch bcast.Type { + case script.BroadcastCall: + to := &bcast.To + candidate = txmgr.TxCandidate{ + TxData: bcast.Input, + To: to, + Value: value, + GasLimit: padGasLimit(bcast.Input, bcast.GasUsed, false, blockGasLimit), + } + case script.BroadcastCreate: + candidate = txmgr.TxCandidate{ + TxData: bcast.Input, + To: nil, + GasLimit: padGasLimit(bcast.Input, bcast.GasUsed, true, blockGasLimit), + } + case script.BroadcastCreate2: + txData := make([]byte, len(bcast.Salt)+len(bcast.Input)) + copy(txData, bcast.Salt[:]) + copy(txData[len(bcast.Salt):], bcast.Input) + + candidate = txmgr.TxCandidate{ + TxData: txData, + To: &script.DeterministicDeployerAddress, + Value: value, + GasLimit: padGasLimit(bcast.Input, bcast.GasUsed, true, blockGasLimit), + } + } + + t.mgr.SendAsync(ctx, candidate, ch) + return ch, id +} + +// padGasLimit calculates the gas limit for a transaction based on the intrinsic gas and the gas used by +// the underlying call. Values are multiplied by a pad factor to account for any discrepancies. The output +// is clamped to the block gas limit since Geth will reject transactions that exceed it before letting them +// into the mempool. +func padGasLimit(data []byte, gasUsed uint64, creation bool, blockGasLimit uint64) uint64 { + intrinsicGas, err := core.IntrinsicGas(data, nil, creation, true, true, false) + // This method never errors - we should look into it if it does. + if err != nil { + panic(err) + } + + limit := uint64(float64(intrinsicGas+gasUsed) * GasPadFactor) + if limit > blockGasLimit { + return blockGasLimit + } + return limit +} diff --git a/op-chain-ops/deployer/flags.go b/op-chain-ops/deployer/flags.go new file mode 100644 index 000000000000..e0ab864bdada --- /dev/null +++ b/op-chain-ops/deployer/flags.go @@ -0,0 +1,82 @@ +package deployer + +import ( + "os" + + op_service "github.com/ethereum-optimism/optimism/op-service" + oplog "github.com/ethereum-optimism/optimism/op-service/log" + "github.com/urfave/cli/v2" +) + +const ( + EnvVarPrefix = "DEPLOYER" + L1RPCURLFlagName = "l1-rpc-url" + L1ChainIDFlagName = "l1-chain-id" + L2ChainIDsFlagName = "l2-chain-ids" + WorkdirFlagName = "workdir" + OutdirFlagName = "outdir" + PrivateKeyFlagName = "private-key" +) + +var ( + L1RPCURLFlag = &cli.StringFlag{ + Name: L1RPCURLFlagName, + Usage: "RPC URL for the L1 chain. Can be set to 'genesis' for deployments " + + "that will be deployed at the launch of the L1.", + EnvVars: []string{ + "L1_RPC_URL", + }, + } + L1ChainIDFlag = &cli.Uint64Flag{ + Name: L1ChainIDFlagName, + Usage: "Chain ID of the L1 chain.", + EnvVars: prefixEnvVar("L1_CHAIN_ID"), + Value: 900, + } + L2ChainIDsFlag = &cli.StringFlag{ + Name: L2ChainIDsFlagName, + Usage: "Comma-separated list of L2 chain IDs to deploy.", + EnvVars: prefixEnvVar("L2_CHAIN_IDS"), + } + WorkdirFlag = &cli.StringFlag{ + Name: WorkdirFlagName, + Usage: "Directory storing intent and stage. Defaults to the current directory.", + EnvVars: prefixEnvVar("WORKDIR"), + Value: cwd(), + Aliases: []string{ + OutdirFlagName, + }, + } + + PrivateKeyFlag = &cli.StringFlag{ + Name: PrivateKeyFlagName, + Usage: "Private key of the deployer account.", + EnvVars: prefixEnvVar("PRIVATE_KEY"), + } +) + +var GlobalFlags = append([]cli.Flag{}, oplog.CLIFlags(EnvVarPrefix)...) + +var InitFlags = []cli.Flag{ + L1ChainIDFlag, + L2ChainIDsFlag, + WorkdirFlag, +} + +var ApplyFlags = []cli.Flag{ + L1RPCURLFlag, + WorkdirFlag, + PrivateKeyFlag, +} + +func prefixEnvVar(name string) []string { + return op_service.PrefixEnvVar(EnvVarPrefix, name) +} + +func cwd() string { + dir, err := os.Getwd() + if err != nil { + return "" + } + return dir +} diff --git a/op-chain-ops/deployer/init.go b/op-chain-ops/deployer/init.go new file mode 100644 index 000000000000..0cc288b40ffb --- /dev/null +++ b/op-chain-ops/deployer/init.go @@ -0,0 +1,121 @@ +package deployer + +import ( + "fmt" + "path" + "strings" + + op_service "github.com/ethereum-optimism/optimism/op-service" + + "github.com/ethereum-optimism/optimism/op-chain-ops/deployer/state" + "github.com/ethereum-optimism/optimism/op-chain-ops/devkeys" + "github.com/ethereum/go-ethereum/common" + "github.com/urfave/cli/v2" +) + +type InitConfig struct { + L1ChainID uint64 + Outdir string + L2ChainIDs []common.Hash +} + +func (c *InitConfig) Check() error { + if c.L1ChainID == 0 { + return fmt.Errorf("l1ChainID must be specified") + } + + if c.Outdir == "" { + return fmt.Errorf("outdir must be specified") + } + + if len(c.L2ChainIDs) == 0 { + return fmt.Errorf("must specify at least one L2 chain ID") + } + + return nil +} + +func InitCLI() func(ctx *cli.Context) error { + return func(ctx *cli.Context) error { + l1ChainID := ctx.Uint64(L1ChainIDFlagName) + outdir := ctx.String(OutdirFlagName) + + l2ChainIDsRaw := ctx.String(L2ChainIDsFlagName) + l2ChainIDsStr := strings.Split(l2ChainIDsRaw, ",") + l2ChainIDs := make([]common.Hash, 0, len(l2ChainIDsStr)) + for _, idStr := range l2ChainIDsStr { + id, err := op_service.Parse256BitChainID(idStr) + if err != nil { + return fmt.Errorf("invalid chain ID: %w", err) + } + l2ChainIDs = append(l2ChainIDs, id) + } + + return Init(InitConfig{ + L1ChainID: l1ChainID, + Outdir: outdir, + L2ChainIDs: l2ChainIDs, + }) + } +} + +func Init(cfg InitConfig) error { + if err := cfg.Check(); err != nil { + return fmt.Errorf("invalid config for init: %w", err) + } + + intent := &state.Intent{ + L1ChainID: cfg.L1ChainID, + UseFaultProofs: true, + FundDevAccounts: true, + } + + l1ChainIDBig := intent.L1ChainIDBig() + + dk, err := devkeys.NewMnemonicDevKeys(devkeys.TestMnemonic) + if err != nil { + return fmt.Errorf("failed to create dev keys: %w", err) + } + + addrFor := func(key devkeys.Key) common.Address { + // The error below should never happen, so panic if it does. + addr, err := dk.Address(key) + if err != nil { + panic(err) + } + return addr + } + intent.SuperchainRoles = state.SuperchainRoles{ + ProxyAdminOwner: addrFor(devkeys.L1ProxyAdminOwnerRole.Key(l1ChainIDBig)), + ProtocolVersionsOwner: addrFor(devkeys.SuperchainProtocolVersionsOwner.Key(l1ChainIDBig)), + Guardian: addrFor(devkeys.SuperchainConfigGuardianKey.Key(l1ChainIDBig)), + } + + for _, l2ChainID := range cfg.L2ChainIDs { + l2ChainIDBig := l2ChainID.Big() + intent.Chains = append(intent.Chains, &state.ChainIntent{ + ID: l2ChainID, + Roles: state.ChainRoles{ + ProxyAdminOwner: addrFor(devkeys.L2ProxyAdminOwnerRole.Key(l2ChainIDBig)), + SystemConfigOwner: addrFor(devkeys.SystemConfigOwner.Key(l2ChainIDBig)), + GovernanceTokenOwner: addrFor(devkeys.L2ProxyAdminOwnerRole.Key(l2ChainIDBig)), + UnsafeBlockSigner: addrFor(devkeys.SequencerP2PRole.Key(l2ChainIDBig)), + Batcher: addrFor(devkeys.BatcherRole.Key(l2ChainIDBig)), + Proposer: addrFor(devkeys.ProposerRole.Key(l2ChainIDBig)), + Challenger: addrFor(devkeys.ChallengerRole.Key(l2ChainIDBig)), + }, + }) + } + + st := &state.State{ + Version: 1, + } + + if err := intent.WriteToFile(path.Join(cfg.Outdir, "intent.toml")); err != nil { + return fmt.Errorf("failed to write intent to file: %w", err) + } + if err := st.WriteToFile(path.Join(cfg.Outdir, "state.json")); err != nil { + return fmt.Errorf("failed to write state to file: %w", err) + } + return nil +} diff --git a/op-chain-ops/deployer/inspect/flags.go b/op-chain-ops/deployer/inspect/flags.go new file mode 100644 index 000000000000..601e28ba85a5 --- /dev/null +++ b/op-chain-ops/deployer/inspect/flags.go @@ -0,0 +1,83 @@ +package inspect + +import ( + "fmt" + + op_service "github.com/ethereum-optimism/optimism/op-service" + + "github.com/ethereum-optimism/optimism/op-chain-ops/deployer" + "github.com/ethereum/go-ethereum/common" + "github.com/urfave/cli/v2" +) + +const ( + OutfileFlagName = "outfile" +) + +var ( + FlagOutfile = &cli.StringFlag{ + Name: OutfileFlagName, + Usage: "output file. set to - to use stdout", + Value: "-", + } +) + +var Flags = []cli.Flag{ + deployer.WorkdirFlag, + FlagOutfile, +} + +var Commands = []*cli.Command{ + { + Name: "genesis", + Usage: "outputs the genesis for an L2 chain", + Args: true, + ArgsUsage: "", + Action: GenesisCLI, + Flags: Flags, + }, + { + Name: "rollup", + Usage: "outputs the rollup config for an L2 chain", + Args: true, + ArgsUsage: "", + Action: RollupCLI, + Flags: Flags, + }, +} + +type cliConfig struct { + Workdir string + Outfile string + ChainID common.Hash +} + +func readConfig(cliCtx *cli.Context) (cliConfig, error) { + var cfg cliConfig + + outfile := cliCtx.String(OutfileFlagName) + if outfile == "" { + return cfg, fmt.Errorf("outfile flag is required") + } + + workdir := cliCtx.String(deployer.WorkdirFlagName) + if workdir == "" { + return cfg, fmt.Errorf("workdir flag is required") + } + + chainIDStr := cliCtx.Args().First() + if chainIDStr == "" { + return cfg, fmt.Errorf("chain-id argument is required") + } + + chainID, err := op_service.Parse256BitChainID(chainIDStr) + if err != nil { + return cfg, fmt.Errorf("failed to parse chain ID: %w", err) + } + + return cliConfig{ + Workdir: cliCtx.String(deployer.WorkdirFlagName), + Outfile: cliCtx.String(OutfileFlagName), + ChainID: chainID, + }, nil +} diff --git a/op-chain-ops/deployer/inspect/genesis.go b/op-chain-ops/deployer/inspect/genesis.go new file mode 100644 index 000000000000..4c2fbad01092 --- /dev/null +++ b/op-chain-ops/deployer/inspect/genesis.go @@ -0,0 +1,92 @@ +package inspect + +import ( + "fmt" + + "github.com/ethereum-optimism/optimism/op-chain-ops/deployer/pipeline" + "github.com/ethereum-optimism/optimism/op-chain-ops/deployer/state" + "github.com/ethereum-optimism/optimism/op-chain-ops/genesis" + "github.com/ethereum-optimism/optimism/op-node/rollup" + "github.com/ethereum/go-ethereum/core" + + "github.com/ethereum-optimism/optimism/op-service/ioutil" + "github.com/ethereum-optimism/optimism/op-service/jsonutil" + "github.com/ethereum/go-ethereum/common" + "github.com/urfave/cli/v2" +) + +func GenesisCLI(cliCtx *cli.Context) error { + cfg, err := readConfig(cliCtx) + if err != nil { + return err + } + + env := &pipeline.Env{Workdir: cfg.Workdir} + globalState, err := env.ReadState() + if err != nil { + return fmt.Errorf("failed to read intent: %w", err) + } + + l2Genesis, _, err := GenesisAndRollup(globalState, cfg.ChainID) + if err != nil { + return fmt.Errorf("failed to generate genesis block: %w", err) + } + + if err := jsonutil.WriteJSON(l2Genesis, ioutil.ToStdOutOrFileOrNoop(cfg.Outfile, 0o666)); err != nil { + return fmt.Errorf("failed to write genesis: %w", err) + } + + return nil +} + +func GenesisAndRollup(globalState *state.State, chainID common.Hash) (*core.Genesis, *rollup.Config, error) { + if globalState.AppliedIntent == nil { + return nil, nil, fmt.Errorf("chain state is not applied - run op-deployer apply") + } + + chainIntent, err := globalState.AppliedIntent.Chain(chainID) + if err != nil { + return nil, nil, fmt.Errorf("failed to get applied chain intent: %w", err) + } + + chainState, err := globalState.Chain(chainID) + if err != nil { + return nil, nil, fmt.Errorf("failed to get chain ID %s: %w", chainID.String(), err) + } + + l2Allocs, err := chainState.UnmarshalAllocs() + if err != nil { + return nil, nil, fmt.Errorf("failed to unmarshal genesis: %w", err) + } + + config, err := state.CombineDeployConfig( + globalState.AppliedIntent, + chainIntent, + globalState, + chainState, + ) + if err != nil { + return nil, nil, fmt.Errorf("failed to combine L2 init config: %w", err) + } + + l2GenesisBuilt, err := genesis.BuildL2Genesis(&config, l2Allocs, chainState.StartBlock) + if err != nil { + return nil, nil, fmt.Errorf("failed to build L2 genesis: %w", err) + } + l2GenesisBlock := l2GenesisBuilt.ToBlock() + + rollupConfig, err := config.RollupConfig( + chainState.StartBlock, + l2GenesisBlock.Hash(), + l2GenesisBlock.Number().Uint64(), + ) + if err != nil { + return nil, nil, fmt.Errorf("failed to build rollup config: %w", err) + } + + if err := rollupConfig.Check(); err != nil { + return nil, nil, fmt.Errorf("generated rollup config does not pass validation: %w", err) + } + + return l2GenesisBuilt, rollupConfig, nil +} diff --git a/op-chain-ops/deployer/inspect/rollup.go b/op-chain-ops/deployer/inspect/rollup.go new file mode 100644 index 000000000000..60cbf4f5c46c --- /dev/null +++ b/op-chain-ops/deployer/inspect/rollup.go @@ -0,0 +1,34 @@ +package inspect + +import ( + "fmt" + + "github.com/ethereum-optimism/optimism/op-chain-ops/deployer/pipeline" + "github.com/ethereum-optimism/optimism/op-service/ioutil" + "github.com/ethereum-optimism/optimism/op-service/jsonutil" + "github.com/urfave/cli/v2" +) + +func RollupCLI(cliCtx *cli.Context) error { + cfg, err := readConfig(cliCtx) + if err != nil { + return err + } + + env := &pipeline.Env{Workdir: cfg.Workdir} + globalState, err := env.ReadState() + if err != nil { + return fmt.Errorf("failed to read intent: %w", err) + } + + _, rollupConfig, err := GenesisAndRollup(globalState, cfg.ChainID) + if err != nil { + return fmt.Errorf("failed to generate rollup config: %w", err) + } + + if err := jsonutil.WriteJSON(rollupConfig, ioutil.ToStdOutOrFileOrNoop(cfg.Outfile, 0o666)); err != nil { + return fmt.Errorf("failed to write rollup config: %w", err) + } + + return nil +} diff --git a/op-chain-ops/deployer/integration_test/apply_test.go b/op-chain-ops/deployer/integration_test/apply_test.go new file mode 100644 index 000000000000..6d673ed03791 --- /dev/null +++ b/op-chain-ops/deployer/integration_test/apply_test.go @@ -0,0 +1,203 @@ +package integration_test + +import ( + "context" + "fmt" + "log/slog" + "math/big" + "net/url" + "path" + "runtime" + "testing" + + "github.com/ethereum-optimism/optimism/op-chain-ops/deployer" + "github.com/holiman/uint256" + + "github.com/ethereum-optimism/optimism/op-chain-ops/deployer/pipeline" + "github.com/ethereum-optimism/optimism/op-chain-ops/deployer/state" + "github.com/ethereum-optimism/optimism/op-chain-ops/devkeys" + opcrypto "github.com/ethereum-optimism/optimism/op-service/crypto" + "github.com/ethereum-optimism/optimism/op-service/testlog" + "github.com/ethereum-optimism/optimism/op-service/testutils/kurtosisutil" + "github.com/ethereum/go-ethereum/common" + "github.com/ethereum/go-ethereum/ethclient" + "github.com/stretchr/testify/require" +) + +const TestParams = ` +participants: + - el_type: geth + cl_type: lighthouse +network_params: + prefunded_accounts: '{ "0xf39Fd6e51aad88F6F4ce6aB8827279cffFb92266": { "balance": "1000000ETH" } }' + additional_preloaded_contracts: '{ + "0x4e59b44847b379578588920cA78FbF26c0B4956C": { + balance: "0ETH", + code: "0x7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe03601600081602082378035828234f58015156039578182fd5b8082525050506014600cf3", + storage: {}, + nonce: 0, + secretKey: "0x" + } + }' + network_id: "77799777" + seconds_per_slot: 3 +` + +type deployerKey struct{} + +func (d *deployerKey) HDPath() string { + return "m/44'/60'/0'/0/0" +} + +func (d *deployerKey) String() string { + return "deployer-key" +} + +func TestEndToEndApply(t *testing.T) { + kurtosisutil.Test(t) + + lgr := testlog.Logger(t, slog.LevelInfo) + + ctx, cancel := context.WithCancel(context.Background()) + defer cancel() + + _, testFilename, _, ok := runtime.Caller(0) + require.Truef(t, ok, "failed to get test filename") + monorepoDir := path.Join(path.Dir(testFilename), "..", "..", "..") + artifactsDir := path.Join(monorepoDir, "packages", "contracts-bedrock", "forge-artifacts") + + enclaveCtx := kurtosisutil.StartEnclave(t, ctx, lgr, "github.com/ethpandaops/ethereum-package", TestParams) + + service, err := enclaveCtx.GetServiceContext("el-1-geth-lighthouse") + require.NoError(t, err) + + ip := service.GetMaybePublicIPAddress() + ports := service.GetPublicPorts() + rpcURL := fmt.Sprintf("http://%s:%d", ip, ports["rpc"].GetNumber()) + l1Client, err := ethclient.Dial(rpcURL) + require.NoError(t, err) + + artifactsURL, err := url.Parse(fmt.Sprintf("file://%s", artifactsDir)) + require.NoError(t, err) + + depKey := new(deployerKey) + l1ChainID := big.NewInt(77799777) + dk, err := devkeys.NewMnemonicDevKeys(devkeys.TestMnemonic) + require.NoError(t, err) + pk, err := dk.Secret(depKey) + require.NoError(t, err) + signer := opcrypto.SignerFnFromBind(opcrypto.PrivateKeySignerFn(pk, l1ChainID)) + + id := uint256.NewInt(1) + + addrFor := func(key devkeys.Key) common.Address { + addr, err := dk.Address(key) + require.NoError(t, err) + return addr + } + env := &pipeline.Env{ + Workdir: t.TempDir(), + L1Client: l1Client, + Signer: signer, + Deployer: addrFor(depKey), + Logger: lgr, + } + intent := &state.Intent{ + L1ChainID: l1ChainID.Uint64(), + SuperchainRoles: state.SuperchainRoles{ + ProxyAdminOwner: addrFor(devkeys.L1ProxyAdminOwnerRole.Key(l1ChainID)), + ProtocolVersionsOwner: addrFor(devkeys.SuperchainDeployerKey.Key(l1ChainID)), + Guardian: addrFor(devkeys.SuperchainConfigGuardianKey.Key(l1ChainID)), + }, + UseFaultProofs: true, + FundDevAccounts: true, + ContractArtifactsURL: (*state.ArtifactsURL)(artifactsURL), + Chains: []*state.ChainIntent{ + { + ID: id.Bytes32(), + Roles: state.ChainRoles{ + ProxyAdminOwner: addrFor(devkeys.L2ProxyAdminOwnerRole.Key(l1ChainID)), + SystemConfigOwner: addrFor(devkeys.SystemConfigOwner.Key(l1ChainID)), + GovernanceTokenOwner: addrFor(devkeys.L2ProxyAdminOwnerRole.Key(l1ChainID)), + UnsafeBlockSigner: addrFor(devkeys.SequencerP2PRole.Key(l1ChainID)), + Batcher: addrFor(devkeys.BatcherRole.Key(l1ChainID)), + Proposer: addrFor(devkeys.ProposerRole.Key(l1ChainID)), + Challenger: addrFor(devkeys.ChallengerRole.Key(l1ChainID)), + }, + }, + }, + } + st := &state.State{ + Version: 1, + } + + require.NoError(t, deployer.ApplyPipeline( + ctx, + env, + intent, + st, + )) + + addrs := []struct { + name string + addr common.Address + }{ + {"SuperchainProxyAdmin", st.SuperchainDeployment.ProxyAdminAddress}, + {"SuperchainConfigProxy", st.SuperchainDeployment.SuperchainConfigProxyAddress}, + {"SuperchainConfigImpl", st.SuperchainDeployment.SuperchainConfigImplAddress}, + {"ProtocolVersionsProxy", st.SuperchainDeployment.ProtocolVersionsProxyAddress}, + {"ProtocolVersionsImpl", st.SuperchainDeployment.ProtocolVersionsImplAddress}, + {"OpsmProxy", st.ImplementationsDeployment.OpsmProxyAddress}, + {"DelayedWETHImpl", st.ImplementationsDeployment.DelayedWETHImplAddress}, + {"OptimismPortalImpl", st.ImplementationsDeployment.OptimismPortalImplAddress}, + {"PreimageOracleSingleton", st.ImplementationsDeployment.PreimageOracleSingletonAddress}, + {"MipsSingleton", st.ImplementationsDeployment.MipsSingletonAddress}, + {"SystemConfigImpl", st.ImplementationsDeployment.SystemConfigImplAddress}, + {"L1CrossDomainMessengerImpl", st.ImplementationsDeployment.L1CrossDomainMessengerImplAddress}, + {"L1ERC721BridgeImpl", st.ImplementationsDeployment.L1ERC721BridgeImplAddress}, + {"L1StandardBridgeImpl", st.ImplementationsDeployment.L1StandardBridgeImplAddress}, + {"OptimismMintableERC20FactoryImpl", st.ImplementationsDeployment.OptimismMintableERC20FactoryImplAddress}, + {"DisputeGameFactoryImpl", st.ImplementationsDeployment.DisputeGameFactoryImplAddress}, + } + for _, addr := range addrs { + t.Run(addr.name, func(t *testing.T) { + code, err := l1Client.CodeAt(ctx, addr.addr, nil) + require.NoError(t, err) + require.NotEmpty(t, code, "contracts %s at %s has no code", addr.name, addr.addr) + }) + } + + for _, chainState := range st.Chains { + chainAddrs := []struct { + name string + addr common.Address + }{ + {"ProxyAdminAddress", chainState.ProxyAdminAddress}, + {"AddressManagerAddress", chainState.AddressManagerAddress}, + {"L1ERC721BridgeProxyAddress", chainState.L1ERC721BridgeProxyAddress}, + {"SystemConfigProxyAddress", chainState.SystemConfigProxyAddress}, + {"OptimismMintableERC20FactoryProxyAddress", chainState.OptimismMintableERC20FactoryProxyAddress}, + {"L1StandardBridgeProxyAddress", chainState.L1StandardBridgeProxyAddress}, + {"L1CrossDomainMessengerProxyAddress", chainState.L1CrossDomainMessengerProxyAddress}, + {"OptimismPortalProxyAddress", chainState.OptimismPortalProxyAddress}, + {"DisputeGameFactoryProxyAddress", chainState.DisputeGameFactoryProxyAddress}, + {"AnchorStateRegistryProxyAddress", chainState.AnchorStateRegistryProxyAddress}, + {"AnchorStateRegistryImplAddress", chainState.AnchorStateRegistryImplAddress}, + {"FaultDisputeGameAddress", chainState.FaultDisputeGameAddress}, + {"PermissionedDisputeGameAddress", chainState.PermissionedDisputeGameAddress}, + {"DelayedWETHPermissionedGameProxyAddress", chainState.DelayedWETHPermissionedGameProxyAddress}, + {"DelayedWETHPermissionlessGameProxyAddress", chainState.DelayedWETHPermissionlessGameProxyAddress}, + } + for _, addr := range chainAddrs { + t.Run(fmt.Sprintf("chain %s - %s", chainState.ID, addr.name), func(t *testing.T) { + code, err := l1Client.CodeAt(ctx, addr.addr, nil) + require.NoError(t, err) + require.NotEmpty(t, code, "contracts %s at %s for chain %s has no code", addr.name, addr.addr, chainState.ID) + }) + } + + t.Run("l2 genesis", func(t *testing.T) { + require.Greater(t, len(chainState.Allocs), 0) + }) + } +} diff --git a/op-chain-ops/deployer/opsm/implementations.go b/op-chain-ops/deployer/opsm/implementations.go new file mode 100644 index 000000000000..ed20b55f1522 --- /dev/null +++ b/op-chain-ops/deployer/opsm/implementations.go @@ -0,0 +1,107 @@ +package opsm + +import ( + "fmt" + "math/big" + + "github.com/ethereum/go-ethereum/common" + + "github.com/ethereum-optimism/optimism/op-chain-ops/script" +) + +type DeployImplementationsInput struct { + Salt common.Hash + WithdrawalDelaySeconds *big.Int + MinProposalSizeBytes *big.Int + ChallengePeriodSeconds *big.Int + ProofMaturityDelaySeconds *big.Int + DisputeGameFinalityDelaySeconds *big.Int + // Release version to set OPSM implementations for, of the format `op-contracts/vX.Y.Z`. + Release string + SuperchainConfigProxy common.Address + ProtocolVersionsProxy common.Address + UseInterop bool // if true, deploy Interop implementations + + SuperchainProxyAdmin common.Address +} + +func (input *DeployImplementationsInput) InputSet() bool { + return true +} + +type DeployImplementationsOutput struct { + OpsmProxy common.Address + DelayedWETHImpl common.Address + OptimismPortalImpl common.Address + PreimageOracleSingleton common.Address + MipsSingleton common.Address + SystemConfigImpl common.Address + L1CrossDomainMessengerImpl common.Address + L1ERC721BridgeImpl common.Address + L1StandardBridgeImpl common.Address + OptimismMintableERC20FactoryImpl common.Address + DisputeGameFactoryImpl common.Address +} + +func (output *DeployImplementationsOutput) CheckOutput(input common.Address) error { + return nil +} + +type DeployImplementationsScript struct { + Run func(input, output common.Address) error +} + +func DeployImplementations( + host *script.Host, + input DeployImplementationsInput, +) (DeployImplementationsOutput, error) { + var output DeployImplementationsOutput + inputAddr := host.NewScriptAddress() + outputAddr := host.NewScriptAddress() + + cleanupInput, err := script.WithPrecompileAtAddress[*DeployImplementationsInput](host, inputAddr, &input) + if err != nil { + return output, fmt.Errorf("failed to insert DeployImplementationsInput precompile: %w", err) + } + defer cleanupInput() + + cleanupOutput, err := script.WithPrecompileAtAddress[*DeployImplementationsOutput](host, outputAddr, &output, + script.WithFieldSetter[*DeployImplementationsOutput]) + if err != nil { + return output, fmt.Errorf("failed to insert DeployImplementationsOutput precompile: %w", err) + } + defer cleanupOutput() + + implContract := "DeployImplementations" + if input.UseInterop { + implContract = "DeployImplementationsInterop" + } + deployScript, cleanupDeploy, err := script.WithScript[DeployImplementationsScript](host, "DeployImplementations.s.sol", implContract) + if err != nil { + return output, fmt.Errorf("failed to load %s script: %w", implContract, err) + } + defer cleanupDeploy() + + opsmContract := "OPStackManager" + if input.UseInterop { + opsmContract = "OPStackManagerInterop" + } + if err := host.RememberOnLabel("OPStackManager", opsmContract+".sol", opsmContract); err != nil { + return output, fmt.Errorf("failed to link OPStackManager label: %w", err) + } + + // So we can see in detail where the SystemConfig interop initializer fails + sysConfig := "SystemConfig" + if input.UseInterop { + sysConfig = "SystemConfigInterop" + } + if err := host.RememberOnLabel("SystemConfigImpl", sysConfig+".sol", sysConfig); err != nil { + return output, fmt.Errorf("failed to link SystemConfig label: %w", err) + } + + if err := deployScript.Run(inputAddr, outputAddr); err != nil { + return output, fmt.Errorf("failed to run %s script: %w", implContract, err) + } + + return output, nil +} diff --git a/op-chain-ops/deployer/opsm/l2genesis.go b/op-chain-ops/deployer/opsm/l2genesis.go new file mode 100644 index 000000000000..3567df71858f --- /dev/null +++ b/op-chain-ops/deployer/opsm/l2genesis.go @@ -0,0 +1,55 @@ +package opsm + +import ( + "fmt" + + "github.com/ethereum-optimism/optimism/op-chain-ops/genesis" + "github.com/ethereum-optimism/optimism/op-chain-ops/script" + "github.com/ethereum/go-ethereum/common" +) + +var ( + // address(uint160(uint256(keccak256(abi.encode("optimism.deployconfig"))))) - not a simple hash, due to ABI encode + deployConfigAddr = common.HexToAddress("0x9568d36E291c2C4c34fa5593fcE73715abEf6F9c") +) + +type L1Deployments struct { + L1CrossDomainMessengerProxy common.Address + L1StandardBridgeProxy common.Address + L1ERC721BridgeProxy common.Address +} + +type L2GenesisInput struct { + L1Deployments L1Deployments + L2Config genesis.L2InitializationConfig +} + +type L2GenesisScript struct { + RunWithEnv func() error +} + +func L2Genesis(l2Host *script.Host, input *L2GenesisInput) error { + l2Host.SetEnvVar("L2GENESIS_L1CrossDomainMessengerProxy", input.L1Deployments.L1CrossDomainMessengerProxy.String()) + l2Host.SetEnvVar("L2GENESIS_L1StandardBridgeProxy", input.L1Deployments.L1StandardBridgeProxy.String()) + l2Host.SetEnvVar("L2GENESIS_L1ERC721BridgeProxy", input.L1Deployments.L1ERC721BridgeProxy.String()) + + deployConfig := &genesis.DeployConfig{ + L2InitializationConfig: input.L2Config, + } + cleanupDeployConfig, err := script.WithPrecompileAtAddress[*genesis.DeployConfig](l2Host, deployConfigAddr, deployConfig, script.WithFieldsOnly[*genesis.DeployConfig]) + if err != nil { + return fmt.Errorf("failed to insert DeployConfig precompile: %w", err) + } + defer cleanupDeployConfig() + + l2GenesisScript, cleanupL2Genesis, err := script.WithScript[L2GenesisScript](l2Host, "L2Genesis.s.sol", "L2Genesis") + if err != nil { + return fmt.Errorf("failed to load L2Genesis script: %w", err) + } + defer cleanupL2Genesis() + + if err := l2GenesisScript.RunWithEnv(); err != nil { + return fmt.Errorf("failed to run L2 genesis script: %w", err) + } + return nil +} diff --git a/op-chain-ops/deployer/opsm/opchain.go b/op-chain-ops/deployer/opsm/opchain.go new file mode 100644 index 000000000000..d600f200dcf1 --- /dev/null +++ b/op-chain-ops/deployer/opsm/opchain.go @@ -0,0 +1,99 @@ +package opsm + +import ( + "fmt" + "math/big" + + "github.com/ethereum/go-ethereum/common" + + "github.com/ethereum-optimism/optimism/op-chain-ops/script" +) + +// PermissionedGameStartingAnchorRoots is a root of bytes32(hex"dead") for the permissioned game at block 0, +// and no root for the permissionless game. +var PermissionedGameStartingAnchorRoots = []byte{ + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x20, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0xde, 0xad, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +} + +type DeployOPChainInput struct { + OpChainProxyAdminOwner common.Address + SystemConfigOwner common.Address + Batcher common.Address + UnsafeBlockSigner common.Address + Proposer common.Address + Challenger common.Address + + BasefeeScalar uint32 + BlobBaseFeeScalar uint32 + L2ChainId *big.Int + OpsmProxy common.Address +} + +func (input *DeployOPChainInput) InputSet() bool { + return true +} + +func (input *DeployOPChainInput) StartingAnchorRoots() []byte { + return PermissionedGameStartingAnchorRoots +} + +type DeployOPChainOutput struct { + OpChainProxyAdmin common.Address + AddressManager common.Address + L1ERC721BridgeProxy common.Address + SystemConfigProxy common.Address + OptimismMintableERC20FactoryProxy common.Address + L1StandardBridgeProxy common.Address + L1CrossDomainMessengerProxy common.Address + + // Fault proof contracts below. + OptimismPortalProxy common.Address + DisputeGameFactoryProxy common.Address + AnchorStateRegistryProxy common.Address + AnchorStateRegistryImpl common.Address + FaultDisputeGame common.Address + PermissionedDisputeGame common.Address + DelayedWETHPermissionedGameProxy common.Address + DelayedWETHPermissionlessGameProxy common.Address +} + +func (output *DeployOPChainOutput) CheckOutput(input common.Address) error { + return nil +} + +type DeployOPChainScript struct { + Run func(input, output common.Address) error +} + +func DeployOPChain(host *script.Host, input DeployOPChainInput) (DeployOPChainOutput, error) { + var dco DeployOPChainOutput + inputAddr := host.NewScriptAddress() + outputAddr := host.NewScriptAddress() + + cleanupInput, err := script.WithPrecompileAtAddress[*DeployOPChainInput](host, inputAddr, &input) + if err != nil { + return dco, fmt.Errorf("failed to insert DeployOPChainInput precompile: %w", err) + } + defer cleanupInput() + host.Label(inputAddr, "DeployOPChainInput") + + cleanupOutput, err := script.WithPrecompileAtAddress[*DeployOPChainOutput](host, outputAddr, &dco, + script.WithFieldSetter[*DeployOPChainOutput]) + if err != nil { + return dco, fmt.Errorf("failed to insert DeployOPChainOutput precompile: %w", err) + } + defer cleanupOutput() + host.Label(outputAddr, "DeployOPChainOutput") + + deployScript, cleanupDeploy, err := script.WithScript[DeployOPChainScript](host, "DeployOPChain.s.sol", "DeployOPChain") + if err != nil { + return dco, fmt.Errorf("failed to load DeployOPChain script: %w", err) + } + defer cleanupDeploy() + + if err := deployScript.Run(inputAddr, outputAddr); err != nil { + return dco, fmt.Errorf("failed to run DeployOPChain script: %w", err) + } + + return dco, nil +} diff --git a/op-chain-ops/deployer/opsm/superchain.go b/op-chain-ops/deployer/opsm/superchain.go new file mode 100644 index 000000000000..d27f85499021 --- /dev/null +++ b/op-chain-ops/deployer/opsm/superchain.go @@ -0,0 +1,89 @@ +package opsm + +import ( + "fmt" + "math/big" + + "github.com/ethereum-optimism/optimism/op-chain-ops/foundry" + "github.com/ethereum-optimism/optimism/op-chain-ops/script" + opcrypto "github.com/ethereum-optimism/optimism/op-service/crypto" + "github.com/ethereum/go-ethereum/common" + "github.com/ethereum/go-ethereum/ethclient" + "github.com/ethereum/go-ethereum/log" + "github.com/ethereum/go-ethereum/params" +) + +type DeploySuperchainInput struct { + ProxyAdminOwner common.Address `toml:"proxyAdminOwner"` + ProtocolVersionsOwner common.Address `toml:"protocolVersionsOwner"` + Guardian common.Address `toml:"guardian"` + Paused bool `toml:"paused"` + RequiredProtocolVersion params.ProtocolVersion `toml:"requiredProtocolVersion"` + RecommendedProtocolVersion params.ProtocolVersion `toml:"recommendedProtocolVersion"` +} + +func (dsi *DeploySuperchainInput) InputSet() bool { + return true +} + +type DeploySuperchainOutput struct { + SuperchainProxyAdmin common.Address + SuperchainConfigImpl common.Address + SuperchainConfigProxy common.Address + ProtocolVersionsImpl common.Address + ProtocolVersionsProxy common.Address +} + +func (output *DeploySuperchainOutput) CheckOutput(input common.Address) error { + return nil +} + +type DeploySuperchainScript struct { + Run func(in common.Address, out common.Address) error +} + +type DeploySuperchainOpts struct { + ChainID *big.Int + ArtifactsFS foundry.StatDirFs + Deployer common.Address + Signer opcrypto.SignerFn + Input DeploySuperchainInput + Client *ethclient.Client + Logger log.Logger +} + +func DeploySuperchain(h *script.Host, input DeploySuperchainInput) (DeploySuperchainOutput, error) { + var dso DeploySuperchainOutput + + inputAddr := h.NewScriptAddress() + outputAddr := h.NewScriptAddress() + + cleanupInput, err := script.WithPrecompileAtAddress[*DeploySuperchainInput](h, inputAddr, &input) + if err != nil { + return dso, fmt.Errorf("failed to insert DeploySuperchainInput precompile: %w", err) + } + defer cleanupInput() + + cleanupOutput, err := script.WithPrecompileAtAddress[*DeploySuperchainOutput]( + h, + outputAddr, + &dso, + script.WithFieldSetter[*DeploySuperchainOutput], + ) + if err != nil { + return dso, fmt.Errorf("failed to insert DeploySuperchainOutput precompile: %w", err) + } + defer cleanupOutput() + + deployScript, cleanupDeploy, err := script.WithScript[DeploySuperchainScript](h, "DeploySuperchain.s.sol", "DeploySuperchain") + if err != nil { + return dso, fmt.Errorf("failed to load DeploySuperchain script: %w", err) + } + defer cleanupDeploy() + + if err := deployScript.Run(inputAddr, outputAddr); err != nil { + return dso, fmt.Errorf("failed to run DeploySuperchain script: %w", err) + } + + return dso, nil +} diff --git a/op-chain-ops/deployer/pipeline/downloader.go b/op-chain-ops/deployer/pipeline/downloader.go new file mode 100644 index 000000000000..8932792f822f --- /dev/null +++ b/op-chain-ops/deployer/pipeline/downloader.go @@ -0,0 +1,138 @@ +package pipeline + +import ( + "archive/tar" + "bufio" + "compress/gzip" + "context" + "errors" + "fmt" + "io" + "net/http" + "net/url" + "os" + "path" + "strings" + "time" + + "github.com/ethereum-optimism/optimism/op-chain-ops/deployer/state" + "github.com/ethereum-optimism/optimism/op-chain-ops/foundry" +) + +var ErrUnsupportedArtifactsScheme = errors.New("unsupported artifacts URL scheme") + +type DownloadProgressor func(current, total int64) + +type CleanupFunc func() error + +var noopCleanup = func() error { return nil } + +func DownloadArtifacts(ctx context.Context, artifactsURL *state.ArtifactsURL, progress DownloadProgressor) (foundry.StatDirFs, CleanupFunc, error) { + switch artifactsURL.Scheme { + case "http", "https": + req, err := http.NewRequestWithContext(ctx, http.MethodGet, (*url.URL)(artifactsURL).String(), nil) + if err != nil { + return nil, nil, fmt.Errorf("failed to create request: %w", err) + } + + resp, err := http.DefaultClient.Do(req) + if err != nil { + return nil, nil, fmt.Errorf("failed to download artifacts: %w", err) + } + defer resp.Body.Close() + + if resp.StatusCode != http.StatusOK { + return nil, nil, fmt.Errorf("failed to download artifacts: invalid status code %s", resp.Status) + } + + tmpDir, err := os.MkdirTemp("", "op-deployer-artifacts-*") + if err != nil { + return nil, nil, fmt.Errorf("failed to create temp dir: %w", err) + } + + pr := &progressReader{ + r: resp.Body, + progress: progress, + total: resp.ContentLength, + } + + gr, err := gzip.NewReader(pr) + if err != nil { + return nil, nil, fmt.Errorf("failed to create gzip reader: %w", err) + } + defer gr.Close() + + tr := tar.NewReader(gr) + if err := untar(tmpDir, tr); err != nil { + return nil, nil, fmt.Errorf("failed to untar: %w", err) + } + + fs := os.DirFS(path.Join(tmpDir, "forge-artifacts")) + cleanup := func() error { + return os.RemoveAll(tmpDir) + } + return fs.(foundry.StatDirFs), cleanup, nil + case "file": + fs := os.DirFS(artifactsURL.Path) + return fs.(foundry.StatDirFs), noopCleanup, nil + default: + return nil, nil, ErrUnsupportedArtifactsScheme + } +} + +type progressReader struct { + r io.Reader + progress DownloadProgressor + curr int64 + total int64 + lastPrint time.Time +} + +func (pr *progressReader) Read(p []byte) (int, error) { + + n, err := pr.r.Read(p) + pr.curr += int64(n) + if pr.progress != nil && time.Since(pr.lastPrint) > 1*time.Second { + pr.progress(pr.curr, pr.total) + pr.lastPrint = time.Now() + } + return n, err +} + +func untar(dir string, tr *tar.Reader) error { + for { + hdr, err := tr.Next() + if err == io.EOF { + return nil + } + if err != nil { + return fmt.Errorf("failed to read tar header: %w", err) + } + + cleanedName := path.Clean(hdr.Name) + if strings.Contains(cleanedName, "..") { + return fmt.Errorf("invalid file path: %s", hdr.Name) + } + dst := path.Join(dir, cleanedName) + if hdr.FileInfo().IsDir() { + if err := os.MkdirAll(dst, 0o755); err != nil { + return fmt.Errorf("failed to create directory: %w", err) + } + continue + } + + f, err := os.Create(dst) + buf := bufio.NewWriter(f) + if err != nil { + return fmt.Errorf("failed to create file: %w", err) + } + if _, err := io.Copy(buf, tr); err != nil { + _ = f.Close() + return fmt.Errorf("failed to write file: %w", err) + } + if err := buf.Flush(); err != nil { + return fmt.Errorf("failed to flush buffer: %w", err) + } + _ = f.Close() + } +} diff --git a/op-chain-ops/deployer/pipeline/downloader_test.go b/op-chain-ops/deployer/pipeline/downloader_test.go new file mode 100644 index 000000000000..277409461a41 --- /dev/null +++ b/op-chain-ops/deployer/pipeline/downloader_test.go @@ -0,0 +1,42 @@ +package pipeline + +import ( + "context" + "io" + "net/http" + "net/http/httptest" + "net/url" + "os" + "testing" + + "github.com/ethereum-optimism/optimism/op-chain-ops/deployer/state" + "github.com/stretchr/testify/require" +) + +func TestDownloadArtifacts(t *testing.T) { + f, err := os.OpenFile("testdata/artifacts.tar.gz", os.O_RDONLY, 0o644) + require.NoError(t, err) + defer f.Close() + + ts := httptest.NewServer(http.HandlerFunc(func(w http.ResponseWriter, r *http.Request) { + w.WriteHeader(http.StatusOK) + _, err := io.Copy(w, f) + require.NoError(t, err) + })) + defer ts.Close() + + ctx := context.Background() + artifactsURL, err := url.Parse(ts.URL) + require.NoError(t, err) + + fs, cleanup, err := DownloadArtifacts(ctx, (*state.ArtifactsURL)(artifactsURL), nil) + require.NoError(t, err) + require.NotNil(t, fs) + defer func() { + require.NoError(t, cleanup()) + }() + + info, err := fs.Stat("WETH98.sol/WETH98.json") + require.NoError(t, err) + require.Greater(t, info.Size(), int64(0)) +} diff --git a/op-chain-ops/deployer/pipeline/env.go b/op-chain-ops/deployer/pipeline/env.go new file mode 100644 index 000000000000..d0778122d27a --- /dev/null +++ b/op-chain-ops/deployer/pipeline/env.go @@ -0,0 +1,49 @@ +package pipeline + +import ( + "context" + "fmt" + "path" + + "github.com/ethereum-optimism/optimism/op-chain-ops/foundry" + + "github.com/ethereum-optimism/optimism/op-chain-ops/deployer/state" + opcrypto "github.com/ethereum-optimism/optimism/op-service/crypto" + "github.com/ethereum-optimism/optimism/op-service/jsonutil" + "github.com/ethereum/go-ethereum/common" + "github.com/ethereum/go-ethereum/ethclient" + "github.com/ethereum/go-ethereum/log" +) + +type Env struct { + Workdir string + L1Client *ethclient.Client + Signer opcrypto.SignerFn + Deployer common.Address + Logger log.Logger +} + +func (e *Env) ReadIntent() (*state.Intent, error) { + intentPath := path.Join(e.Workdir, "intent.toml") + intent, err := jsonutil.LoadTOML[state.Intent](intentPath) + if err != nil { + return nil, fmt.Errorf("failed to read intent file: %w", err) + } + return intent, nil +} + +func (e *Env) ReadState() (*state.State, error) { + statePath := path.Join(e.Workdir, "state.json") + st, err := jsonutil.LoadJSON[state.State](statePath) + if err != nil { + return nil, fmt.Errorf("failed to read state file: %w", err) + } + return st, nil +} + +func (e *Env) WriteState(st *state.State) error { + statePath := path.Join(e.Workdir, "state.json") + return st.WriteToFile(statePath) +} + +type Stage func(ctx context.Context, env *Env, artifactsFS foundry.StatDirFs, intent *state.Intent, state2 *state.State) error diff --git a/op-chain-ops/deployer/pipeline/host.go b/op-chain-ops/deployer/pipeline/host.go new file mode 100644 index 000000000000..71bc9e29e05c --- /dev/null +++ b/op-chain-ops/deployer/pipeline/host.go @@ -0,0 +1,87 @@ +package pipeline + +import ( + "context" + "fmt" + "math/big" + + "github.com/ethereum-optimism/optimism/op-chain-ops/deployer/broadcaster" + "github.com/ethereum-optimism/optimism/op-chain-ops/foundry" + "github.com/ethereum-optimism/optimism/op-chain-ops/script" + opcrypto "github.com/ethereum-optimism/optimism/op-service/crypto" + "github.com/ethereum/go-ethereum/common" + "github.com/ethereum/go-ethereum/ethclient" + "github.com/ethereum/go-ethereum/log" +) + +type BroadcasterFactory func(opts CallScriptBroadcastOpts) (broadcaster.Broadcaster, error) + +func KeyedBroadcaster(opts CallScriptBroadcastOpts) (broadcaster.Broadcaster, error) { + return broadcaster.NewKeyedBroadcaster(broadcaster.KeyedBroadcasterOpts{ + Logger: opts.Logger, + ChainID: opts.L1ChainID, + Client: opts.Client, + Signer: opts.Signer, + From: opts.Deployer, + }) +} + +func DiscardBroadcaster(opts CallScriptBroadcastOpts) (broadcaster.Broadcaster, error) { + return broadcaster.DiscardBroadcaster(), nil +} + +type CallScriptBroadcastOpts struct { + L1ChainID *big.Int + Logger log.Logger + ArtifactsFS foundry.StatDirFs + Deployer common.Address + Signer opcrypto.SignerFn + Client *ethclient.Client + Handler func(host *script.Host) error + Broadcaster BroadcasterFactory +} + +func CallScriptBroadcast( + ctx context.Context, + opts CallScriptBroadcastOpts, +) error { + bcaster, err := opts.Broadcaster(opts) + if err != nil { + return fmt.Errorf("failed to create broadcaster: %w", err) + } + + scriptCtx := script.DefaultContext + scriptCtx.Sender = opts.Deployer + scriptCtx.Origin = opts.Deployer + artifacts := &foundry.ArtifactsFS{FS: opts.ArtifactsFS} + h := script.NewHost( + opts.Logger, + artifacts, + nil, + scriptCtx, + script.WithBroadcastHook(bcaster.Hook), + script.WithIsolatedBroadcasts(), + script.WithCreate2Deployer(), + ) + + if err := h.EnableCheats(); err != nil { + return fmt.Errorf("failed to enable cheats: %w", err) + } + + nonce, err := opts.Client.NonceAt(ctx, opts.Deployer, nil) + if err != nil { + return fmt.Errorf("failed to fetch nonce: %w", err) + } + h.SetNonce(opts.Deployer, nonce) + + err = opts.Handler(h) + if err != nil { + return fmt.Errorf("failed to run handler: %w", err) + } + + if _, err := bcaster.Broadcast(ctx); err != nil { + return fmt.Errorf("failed to broadcast: %w", err) + } + + return nil +} diff --git a/op-chain-ops/deployer/pipeline/implementations.go b/op-chain-ops/deployer/pipeline/implementations.go new file mode 100644 index 000000000000..f9e125e4150b --- /dev/null +++ b/op-chain-ops/deployer/pipeline/implementations.go @@ -0,0 +1,94 @@ +package pipeline + +import ( + "context" + "fmt" + "math/big" + + "github.com/ethereum-optimism/optimism/op-chain-ops/deployer/opsm" + "github.com/ethereum-optimism/optimism/op-chain-ops/deployer/state" + "github.com/ethereum-optimism/optimism/op-chain-ops/foundry" + "github.com/ethereum-optimism/optimism/op-chain-ops/script" +) + +func DeployImplementations(ctx context.Context, env *Env, artifactsFS foundry.StatDirFs, intent *state.Intent, st *state.State) error { + lgr := env.Logger.New("stage", "deploy-implementations") + + if !shouldDeployImplementations(intent, st) { + lgr.Info("implementations deployment not needed") + return nil + } + + lgr.Info("deploying implementations") + + var dump *foundry.ForgeAllocs + var dio opsm.DeployImplementationsOutput + var err error + err = CallScriptBroadcast( + ctx, + CallScriptBroadcastOpts{ + L1ChainID: big.NewInt(int64(intent.L1ChainID)), + Logger: lgr, + ArtifactsFS: artifactsFS, + Deployer: env.Deployer, + Signer: env.Signer, + Client: env.L1Client, + Broadcaster: KeyedBroadcaster, + Handler: func(host *script.Host) error { + host.SetEnvVar("IMPL_SALT", st.Create2Salt.Hex()[2:]) + host.ImportState(st.SuperchainDeployment.StateDump) + dio, err = opsm.DeployImplementations( + host, + opsm.DeployImplementationsInput{ + Salt: st.Create2Salt, + WithdrawalDelaySeconds: big.NewInt(604800), + MinProposalSizeBytes: big.NewInt(126000), + ChallengePeriodSeconds: big.NewInt(86400), + ProofMaturityDelaySeconds: big.NewInt(604800), + DisputeGameFinalityDelaySeconds: big.NewInt(302400), + Release: "op-contracts/v1.6.0", + SuperchainConfigProxy: st.SuperchainDeployment.SuperchainConfigProxyAddress, + ProtocolVersionsProxy: st.SuperchainDeployment.ProtocolVersionsProxyAddress, + SuperchainProxyAdmin: st.SuperchainDeployment.ProxyAdminAddress, + UseInterop: false, + }, + ) + if err != nil { + return fmt.Errorf("error deploying implementations: %w", err) + } + dump, err = host.StateDump() + if err != nil { + return fmt.Errorf("error dumping state: %w", err) + } + return nil + }, + }, + ) + if err != nil { + return fmt.Errorf("error deploying implementations: %w", err) + } + + st.ImplementationsDeployment = &state.ImplementationsDeployment{ + OpsmProxyAddress: dio.OpsmProxy, + DelayedWETHImplAddress: dio.DelayedWETHImpl, + OptimismPortalImplAddress: dio.OptimismPortalImpl, + PreimageOracleSingletonAddress: dio.PreimageOracleSingleton, + MipsSingletonAddress: dio.MipsSingleton, + SystemConfigImplAddress: dio.SystemConfigImpl, + L1CrossDomainMessengerImplAddress: dio.L1CrossDomainMessengerImpl, + L1ERC721BridgeImplAddress: dio.L1ERC721BridgeImpl, + L1StandardBridgeImplAddress: dio.L1StandardBridgeImpl, + OptimismMintableERC20FactoryImplAddress: dio.OptimismMintableERC20FactoryImpl, + DisputeGameFactoryImplAddress: dio.DisputeGameFactoryImpl, + StateDump: dump, + } + if err := env.WriteState(st); err != nil { + return err + } + + return nil +} + +func shouldDeployImplementations(intent *state.Intent, st *state.State) bool { + return st.ImplementationsDeployment == nil +} diff --git a/op-chain-ops/deployer/pipeline/init.go b/op-chain-ops/deployer/pipeline/init.go new file mode 100644 index 000000000000..094e103aa940 --- /dev/null +++ b/op-chain-ops/deployer/pipeline/init.go @@ -0,0 +1,85 @@ +package pipeline + +import ( + "context" + "crypto/rand" + "fmt" + + "github.com/ethereum-optimism/optimism/op-chain-ops/foundry" + + "github.com/ethereum-optimism/optimism/op-chain-ops/script" + + "github.com/ethereum/go-ethereum/common" + + "github.com/ethereum-optimism/optimism/op-chain-ops/deployer/state" +) + +func IsSupportedStateVersion(version int) bool { + return version == 1 +} + +func Init(ctx context.Context, env *Env, artifactsFS foundry.StatDirFs, intent *state.Intent, st *state.State) error { + lgr := env.Logger.New("stage", "init") + lgr.Info("initializing pipeline") + + // Ensure the state version is supported. + if !IsSupportedStateVersion(st.Version) { + return fmt.Errorf("unsupported state version: %d", st.Version) + } + + if st.Create2Salt == (common.Hash{}) { + _, err := rand.Read(st.Create2Salt[:]) + if err != nil { + return fmt.Errorf("failed to generate CREATE2 salt: %w", err) + } + } + + // If the state has never been applied, we don't need to perform + // any additional checks. + if st.AppliedIntent == nil { + return nil + } + + // If the state has been applied, we need to check if any immutable + // fields have changed. + if st.AppliedIntent.L1ChainID != intent.L1ChainID { + return immutableErr("L1ChainID", st.AppliedIntent.L1ChainID, intent.L1ChainID) + } + + if st.AppliedIntent.UseFaultProofs != intent.UseFaultProofs { + return immutableErr("useFaultProofs", st.AppliedIntent.UseFaultProofs, intent.UseFaultProofs) + } + + if st.AppliedIntent.UseAltDA != intent.UseAltDA { + return immutableErr("useAltDA", st.AppliedIntent.UseAltDA, intent.UseAltDA) + } + + if st.AppliedIntent.FundDevAccounts != intent.FundDevAccounts { + return immutableErr("fundDevAccounts", st.AppliedIntent.FundDevAccounts, intent.FundDevAccounts) + } + + l1ChainID, err := env.L1Client.ChainID(ctx) + if err != nil { + return fmt.Errorf("failed to get L1 chain ID: %w", err) + } + + if l1ChainID.Cmp(intent.L1ChainIDBig()) != 0 { + return fmt.Errorf("L1 chain ID mismatch: got %d, expected %d", l1ChainID, intent.L1ChainID) + } + + deployerCode, err := env.L1Client.CodeAt(ctx, script.DeterministicDeployerAddress, nil) + if err != nil { + return fmt.Errorf("failed to get deployer code: %w", err) + } + if len(deployerCode) == 0 { + return fmt.Errorf("deterministic deployer is not deployed on this chain - please deploy it first") + } + + // TODO: validate individual + + return nil +} + +func immutableErr(field string, was, is any) error { + return fmt.Errorf("%s is immutable: was %v, is %v", field, was, is) +} diff --git a/op-chain-ops/deployer/pipeline/l2genesis.go b/op-chain-ops/deployer/pipeline/l2genesis.go new file mode 100644 index 000000000000..f74c6e833620 --- /dev/null +++ b/op-chain-ops/deployer/pipeline/l2genesis.go @@ -0,0 +1,97 @@ +package pipeline + +import ( + "bytes" + "compress/gzip" + "context" + "encoding/json" + "fmt" + "math/big" + + "github.com/ethereum-optimism/optimism/op-chain-ops/deployer/opsm" + "github.com/ethereum-optimism/optimism/op-chain-ops/deployer/state" + "github.com/ethereum-optimism/optimism/op-chain-ops/foundry" + "github.com/ethereum-optimism/optimism/op-chain-ops/script" + "github.com/ethereum/go-ethereum/common" +) + +func GenerateL2Genesis(ctx context.Context, env *Env, artifactsFS foundry.StatDirFs, intent *state.Intent, st *state.State, chainID common.Hash) error { + lgr := env.Logger.New("stage", "generate-l2-genesis") + + lgr.Info("generating L2 genesis", "id", chainID.Hex()) + + thisIntent, err := intent.Chain(chainID) + if err != nil { + return fmt.Errorf("failed to get chain intent: %w", err) + } + + thisChainState, err := st.Chain(chainID) + if err != nil { + return fmt.Errorf("failed to get chain state: %w", err) + } + + initCfg, err := state.CombineDeployConfig(intent, thisIntent, st, thisChainState) + if err != nil { + return fmt.Errorf("failed to combine L2 init config: %w", err) + } + + var dump *foundry.ForgeAllocs + err = CallScriptBroadcast( + ctx, + CallScriptBroadcastOpts{ + L1ChainID: big.NewInt(int64(intent.L1ChainID)), + Logger: lgr, + ArtifactsFS: artifactsFS, + Deployer: env.Deployer, + Signer: env.Signer, + Client: env.L1Client, + Broadcaster: DiscardBroadcaster, + Handler: func(host *script.Host) error { + err := opsm.L2Genesis(host, &opsm.L2GenesisInput{ + L1Deployments: opsm.L1Deployments{ + L1CrossDomainMessengerProxy: thisChainState.L1CrossDomainMessengerProxyAddress, + L1StandardBridgeProxy: thisChainState.L1StandardBridgeProxyAddress, + L1ERC721BridgeProxy: thisChainState.L1ERC721BridgeProxyAddress, + }, + L2Config: initCfg.L2InitializationConfig, + }) + if err != nil { + return fmt.Errorf("failed to call L2Genesis script: %w", err) + } + + host.Wipe(env.Deployer) + + dump, err = host.StateDump() + if err != nil { + return fmt.Errorf("failed to dump state: %w", err) + } + + return nil + }, + }, + ) + if err != nil { + return fmt.Errorf("failed to call L2Genesis script: %w", err) + } + + var buf bytes.Buffer + gw := gzip.NewWriter(&buf) + if err := json.NewEncoder(gw).Encode(dump); err != nil { + return fmt.Errorf("failed to encode state dump: %w", err) + } + if err := gw.Close(); err != nil { + return fmt.Errorf("failed to close gzip writer: %w", err) + } + thisChainState.Allocs = buf.Bytes() + startHeader, err := env.L1Client.HeaderByNumber(ctx, nil) + if err != nil { + return fmt.Errorf("failed to get start block: %w", err) + } + thisChainState.StartBlock = startHeader + + if err := env.WriteState(st); err != nil { + return fmt.Errorf("failed to write state: %w", err) + } + + return nil +} diff --git a/op-chain-ops/deployer/pipeline/opchain.go b/op-chain-ops/deployer/pipeline/opchain.go new file mode 100644 index 000000000000..90d03b028142 --- /dev/null +++ b/op-chain-ops/deployer/pipeline/opchain.go @@ -0,0 +1,100 @@ +package pipeline + +import ( + "context" + "fmt" + "math/big" + + "github.com/ethereum-optimism/optimism/op-chain-ops/deployer/opsm" + "github.com/ethereum-optimism/optimism/op-chain-ops/deployer/state" + "github.com/ethereum-optimism/optimism/op-chain-ops/foundry" + "github.com/ethereum-optimism/optimism/op-chain-ops/script" + "github.com/ethereum/go-ethereum/common" +) + +func DeployOPChain(ctx context.Context, env *Env, artifactsFS foundry.StatDirFs, intent *state.Intent, st *state.State, chainID common.Hash) error { + lgr := env.Logger.New("stage", "deploy-opchain") + + if !shouldDeployOPChain(intent, st, chainID) { + lgr.Info("opchain deployment not needed") + return nil + } + + lgr.Info("deploying OP chain", "id", chainID.Hex()) + + thisIntent, err := intent.Chain(chainID) + if err != nil { + return fmt.Errorf("failed to get chain intent: %w", err) + } + + var dco opsm.DeployOPChainOutput + err = CallScriptBroadcast( + ctx, + CallScriptBroadcastOpts{ + L1ChainID: big.NewInt(int64(intent.L1ChainID)), + Logger: lgr, + ArtifactsFS: artifactsFS, + Deployer: env.Deployer, + Signer: env.Signer, + Client: env.L1Client, + Broadcaster: KeyedBroadcaster, + Handler: func(host *script.Host) error { + host.ImportState(st.ImplementationsDeployment.StateDump) + dco, err = opsm.DeployOPChain( + host, + opsm.DeployOPChainInput{ + OpChainProxyAdminOwner: thisIntent.Roles.ProxyAdminOwner, + SystemConfigOwner: thisIntent.Roles.SystemConfigOwner, + Batcher: thisIntent.Roles.Batcher, + UnsafeBlockSigner: thisIntent.Roles.UnsafeBlockSigner, + Proposer: thisIntent.Roles.Proposer, + Challenger: thisIntent.Roles.Challenger, + BasefeeScalar: 1368, + BlobBaseFeeScalar: 801949, + L2ChainId: chainID.Big(), + OpsmProxy: st.ImplementationsDeployment.OpsmProxyAddress, + }, + ) + return err + }, + }, + ) + if err != nil { + return fmt.Errorf("error deploying OP chain: %w", err) + } + + st.Chains = append(st.Chains, &state.ChainState{ + ID: chainID, + + ProxyAdminAddress: dco.OpChainProxyAdmin, + AddressManagerAddress: dco.AddressManager, + L1ERC721BridgeProxyAddress: dco.L1ERC721BridgeProxy, + SystemConfigProxyAddress: dco.SystemConfigProxy, + OptimismMintableERC20FactoryProxyAddress: dco.OptimismMintableERC20FactoryProxy, + L1StandardBridgeProxyAddress: dco.L1StandardBridgeProxy, + L1CrossDomainMessengerProxyAddress: dco.L1CrossDomainMessengerProxy, + OptimismPortalProxyAddress: dco.OptimismPortalProxy, + DisputeGameFactoryProxyAddress: dco.DisputeGameFactoryProxy, + AnchorStateRegistryProxyAddress: dco.AnchorStateRegistryProxy, + AnchorStateRegistryImplAddress: dco.AnchorStateRegistryImpl, + FaultDisputeGameAddress: dco.FaultDisputeGame, + PermissionedDisputeGameAddress: dco.PermissionedDisputeGame, + DelayedWETHPermissionedGameProxyAddress: dco.DelayedWETHPermissionedGameProxy, + DelayedWETHPermissionlessGameProxyAddress: dco.DelayedWETHPermissionlessGameProxy, + }) + if err := env.WriteState(st); err != nil { + return err + } + + return nil +} + +func shouldDeployOPChain(intent *state.Intent, st *state.State, chainID common.Hash) bool { + for _, chain := range st.Chains { + if chain.ID == chainID { + return false + } + } + + return true +} diff --git a/op-chain-ops/deployer/pipeline/superchain.go b/op-chain-ops/deployer/pipeline/superchain.go new file mode 100644 index 000000000000..21aeda0e23dc --- /dev/null +++ b/op-chain-ops/deployer/pipeline/superchain.go @@ -0,0 +1,83 @@ +package pipeline + +import ( + "context" + "fmt" + "math/big" + + "github.com/ethereum-optimism/optimism/op-chain-ops/script" + + "github.com/ethereum-optimism/optimism/op-chain-ops/deployer/opsm" + "github.com/ethereum-optimism/optimism/op-chain-ops/deployer/state" + "github.com/ethereum-optimism/optimism/op-chain-ops/foundry" + "github.com/ethereum-optimism/optimism/op-node/rollup" +) + +func DeploySuperchain(ctx context.Context, env *Env, artifactsFS foundry.StatDirFs, intent *state.Intent, st *state.State) error { + lgr := env.Logger.New("stage", "deploy-superchain") + + if !shouldDeploySuperchain(intent, st) { + lgr.Info("superchain deployment not needed") + return nil + } + + lgr.Info("deploying superchain") + + var dump *foundry.ForgeAllocs + var dso opsm.DeploySuperchainOutput + var err error + err = CallScriptBroadcast( + ctx, + CallScriptBroadcastOpts{ + L1ChainID: big.NewInt(int64(intent.L1ChainID)), + Logger: lgr, + ArtifactsFS: artifactsFS, + Deployer: env.Deployer, + Signer: env.Signer, + Client: env.L1Client, + Broadcaster: KeyedBroadcaster, + Handler: func(host *script.Host) error { + dso, err = opsm.DeploySuperchain( + host, + opsm.DeploySuperchainInput{ + ProxyAdminOwner: intent.SuperchainRoles.ProxyAdminOwner, + ProtocolVersionsOwner: intent.SuperchainRoles.ProtocolVersionsOwner, + Guardian: intent.SuperchainRoles.Guardian, + Paused: false, + RequiredProtocolVersion: rollup.OPStackSupport, + RecommendedProtocolVersion: rollup.OPStackSupport, + }, + ) + if err != nil { + return fmt.Errorf("failed to deploy superchain: %w", err) + } + dump, err = host.StateDump() + if err != nil { + return fmt.Errorf("error dumping state: %w", err) + } + return nil + }, + }, + ) + if err != nil { + return fmt.Errorf("error deploying superchain: %w", err) + } + + st.SuperchainDeployment = &state.SuperchainDeployment{ + ProxyAdminAddress: dso.SuperchainProxyAdmin, + SuperchainConfigProxyAddress: dso.SuperchainConfigProxy, + SuperchainConfigImplAddress: dso.SuperchainConfigImpl, + ProtocolVersionsProxyAddress: dso.ProtocolVersionsProxy, + ProtocolVersionsImplAddress: dso.ProtocolVersionsImpl, + StateDump: dump, + } + if err := env.WriteState(st); err != nil { + return err + } + + return nil +} + +func shouldDeploySuperchain(intent *state.Intent, st *state.State) bool { + return st.SuperchainDeployment == nil +} diff --git a/op-chain-ops/deployer/pipeline/testdata/artifacts.tar.gz b/op-chain-ops/deployer/pipeline/testdata/artifacts.tar.gz new file mode 100644 index 000000000000..58f034254f46 Binary files /dev/null and b/op-chain-ops/deployer/pipeline/testdata/artifacts.tar.gz differ diff --git a/op-chain-ops/deployer/state/artifacts_url.go b/op-chain-ops/deployer/state/artifacts_url.go new file mode 100644 index 000000000000..5ea576d79eec --- /dev/null +++ b/op-chain-ops/deployer/state/artifacts_url.go @@ -0,0 +1,18 @@ +package state + +import "net/url" + +type ArtifactsURL url.URL + +func (a *ArtifactsURL) MarshalText() ([]byte, error) { + return []byte((*url.URL)(a).String()), nil +} + +func (a *ArtifactsURL) UnmarshalText(text []byte) error { + u, err := url.Parse(string(text)) + if err != nil { + return err + } + *a = ArtifactsURL(*u) + return nil +} diff --git a/op-chain-ops/deployer/state/base64.go b/op-chain-ops/deployer/state/base64.go new file mode 100644 index 000000000000..23e4379fe5fa --- /dev/null +++ b/op-chain-ops/deployer/state/base64.go @@ -0,0 +1,30 @@ +package state + +import ( + "encoding/base64" + "encoding/json" +) + +type Base64Bytes []byte + +func (b Base64Bytes) MarshalJSON() ([]byte, error) { + if len(b) == 0 { + return []byte(`null`), nil + } + + encoded := base64.StdEncoding.EncodeToString(b) + return []byte(`"` + encoded + `"`), nil +} + +func (b *Base64Bytes) UnmarshalJSON(data []byte) error { + var dataStr string + if err := json.Unmarshal(data, &dataStr); err != nil { + return err + } + decoded, err := base64.StdEncoding.DecodeString(dataStr) + if err != nil { + return err + } + *b = decoded + return nil +} diff --git a/op-chain-ops/deployer/state/base64_test.go b/op-chain-ops/deployer/state/base64_test.go new file mode 100644 index 000000000000..abfa6654cee5 --- /dev/null +++ b/op-chain-ops/deployer/state/base64_test.go @@ -0,0 +1,38 @@ +package state + +import ( + "testing" + + "github.com/stretchr/testify/require" +) + +func TestBase64BytesMarshaling(t *testing.T) { + tests := []struct { + name string + in Base64Bytes + out string + }{ + { + name: "empty", + in: Base64Bytes{}, + out: "null", + }, + { + name: "non-empty", + in: Base64Bytes{0x01, 0x02, 0x03}, + out: `"AQID"`, + }, + } + for _, tt := range tests { + t.Run(tt.name, func(t *testing.T) { + data, err := tt.in.MarshalJSON() + require.NoError(t, err) + require.Equal(t, tt.out, string(data)) + + var b Base64Bytes + err = b.UnmarshalJSON(data) + require.NoError(t, err) + require.Equal(t, tt.in, b) + }) + } +} diff --git a/op-chain-ops/deployer/state/deploy_config.go b/op-chain-ops/deployer/state/deploy_config.go new file mode 100644 index 000000000000..81801e5865cb --- /dev/null +++ b/op-chain-ops/deployer/state/deploy_config.go @@ -0,0 +1,158 @@ +package state + +import ( + "encoding/json" + "fmt" + "math/big" + + "github.com/ethereum/go-ethereum/common" + "github.com/ethereum/go-ethereum/crypto" + + "github.com/ethereum-optimism/optimism/op-chain-ops/genesis" + "github.com/ethereum/go-ethereum/common/hexutil" +) + +var ( + l2GenesisBlockBaseFeePerGas = hexutil.Big(*(big.NewInt(1000000000))) + + vaultMinWithdrawalAmount = mustHexBigFromHex("0x8ac7230489e80000") +) + +func DefaultDeployConfig() genesis.DeployConfig { + return genesis.DeployConfig{ + L2InitializationConfig: genesis.L2InitializationConfig{ + L2GenesisBlockDeployConfig: genesis.L2GenesisBlockDeployConfig{ + L2GenesisBlockGasLimit: 30_000_000, + L2GenesisBlockBaseFeePerGas: &l2GenesisBlockBaseFeePerGas, + }, + L2VaultsDeployConfig: genesis.L2VaultsDeployConfig{ + BaseFeeVaultWithdrawalNetwork: "local", + L1FeeVaultWithdrawalNetwork: "local", + SequencerFeeVaultWithdrawalNetwork: "local", + SequencerFeeVaultMinimumWithdrawalAmount: vaultMinWithdrawalAmount, + BaseFeeVaultMinimumWithdrawalAmount: vaultMinWithdrawalAmount, + L1FeeVaultMinimumWithdrawalAmount: vaultMinWithdrawalAmount, + }, + GovernanceDeployConfig: genesis.GovernanceDeployConfig{ + EnableGovernance: true, + GovernanceTokenSymbol: "OP", + GovernanceTokenName: "Optimism", + }, + GasPriceOracleDeployConfig: genesis.GasPriceOracleDeployConfig{ + GasPriceOracleBaseFeeScalar: 1368, + GasPriceOracleBlobBaseFeeScalar: 810949, + }, + EIP1559DeployConfig: genesis.EIP1559DeployConfig{ + EIP1559Denominator: 50, + EIP1559DenominatorCanyon: 250, + EIP1559Elasticity: 6, + }, + UpgradeScheduleDeployConfig: genesis.UpgradeScheduleDeployConfig{ + L2GenesisRegolithTimeOffset: u64UtilPtr(0), + L2GenesisCanyonTimeOffset: u64UtilPtr(0), + L2GenesisDeltaTimeOffset: u64UtilPtr(0), + L2GenesisEcotoneTimeOffset: u64UtilPtr(0), + L2GenesisFjordTimeOffset: u64UtilPtr(0), + L2GenesisGraniteTimeOffset: u64UtilPtr(0), + UseInterop: false, + }, + L2CoreDeployConfig: genesis.L2CoreDeployConfig{ + L2BlockTime: 2, + FinalizationPeriodSeconds: 12, + MaxSequencerDrift: 600, + SequencerWindowSize: 3600, + ChannelTimeoutBedrock: 300, + SystemConfigStartBlock: 0, + }, + }, + } +} + +func CombineDeployConfig(intent *Intent, chainIntent *ChainIntent, state *State, chainState *ChainState) (genesis.DeployConfig, error) { + cfg := DefaultDeployConfig() + + var err error + if len(intent.GlobalDeployOverrides) > 0 { + cfg, err = mergeJSON(cfg, intent.GlobalDeployOverrides) + if err != nil { + return genesis.DeployConfig{}, fmt.Errorf("error merging global L2 overrides: %w", err) + + } + } + + if len(chainIntent.DeployOverrides) > 0 { + cfg, err = mergeJSON(cfg, chainIntent.DeployOverrides) + if err != nil { + return genesis.DeployConfig{}, fmt.Errorf("error merging chain L2 overrides: %w", err) + } + } + + cfg.L2ChainID = chainState.ID.Big().Uint64() + cfg.L1DependenciesConfig = genesis.L1DependenciesConfig{ + L1StandardBridgeProxy: chainState.L1StandardBridgeProxyAddress, + L1CrossDomainMessengerProxy: chainState.L1CrossDomainMessengerProxyAddress, + L1ERC721BridgeProxy: chainState.L1ERC721BridgeProxyAddress, + SystemConfigProxy: chainState.SystemConfigProxyAddress, + OptimismPortalProxy: chainState.OptimismPortalProxyAddress, + ProtocolVersionsProxy: state.SuperchainDeployment.ProtocolVersionsProxyAddress, + } + cfg.OperatorDeployConfig = genesis.OperatorDeployConfig{ + BatchSenderAddress: chainIntent.Roles.Batcher, + P2PSequencerAddress: chainIntent.Roles.UnsafeBlockSigner, + } + cfg.BatchInboxAddress = calculateBatchInboxAddr(chainState.ID) + cfg.L1ChainID = intent.L1ChainID + + return cfg, nil +} + +// mergeJSON merges the provided overrides into the input struct. Fields +// must be JSON-serializable for this to work. Overrides are applied in +// order of precedence - i.e., the last overrides will override keys from +// all preceding overrides. +func mergeJSON[T any](in T, overrides ...map[string]any) (T, error) { + var out T + inJSON, err := json.Marshal(in) + if err != nil { + return out, err + } + + var tmpMap map[string]interface{} + if err := json.Unmarshal(inJSON, &tmpMap); err != nil { + return out, err + } + + for _, override := range overrides { + for k, v := range override { + tmpMap[k] = v + } + } + + inJSON, err = json.Marshal(tmpMap) + if err != nil { + return out, err + } + + if err := json.Unmarshal(inJSON, &out); err != nil { + return out, err + } + + return out, nil +} + +func mustHexBigFromHex(hex string) *hexutil.Big { + num := hexutil.MustDecodeBig(hex) + hexBig := hexutil.Big(*num) + return &hexBig +} + +func u64UtilPtr(in uint64) *hexutil.Uint64 { + util := hexutil.Uint64(in) + return &util +} + +func calculateBatchInboxAddr(chainID common.Hash) common.Address { + var out common.Address + copy(out[1:], crypto.Keccak256(chainID[:])[:19]) + return out +} diff --git a/op-chain-ops/deployer/state/deploy_config_test.go b/op-chain-ops/deployer/state/deploy_config_test.go new file mode 100644 index 000000000000..be431b5740ce --- /dev/null +++ b/op-chain-ops/deployer/state/deploy_config_test.go @@ -0,0 +1,36 @@ +package state + +import ( + "testing" + + "github.com/stretchr/testify/require" +) + +func TestMergeJSON(t *testing.T) { + type testStruct struct { + A string `json:"a"` + B int `json:"b"` + C bool `json:"c"` + } + + out, err := mergeJSON( + testStruct{ + "hello", + 42, + true, + }, + map[string]any{ + "a": "world", + "c": false, + }, + map[string]any{ + "d": "shouldn't show up", + }, + ) + require.NoError(t, err) + require.EqualValues(t, out, testStruct{ + "world", + 42, + false, + }) +} diff --git a/op-chain-ops/deployer/state/intent.go b/op-chain-ops/deployer/state/intent.go new file mode 100644 index 000000000000..c737dab37dd0 --- /dev/null +++ b/op-chain-ops/deployer/state/intent.go @@ -0,0 +1,137 @@ +package state + +import ( + "fmt" + "math/big" + + "github.com/ethereum-optimism/optimism/op-service/ioutil" + "github.com/ethereum-optimism/optimism/op-service/jsonutil" + "github.com/ethereum/go-ethereum/common" +) + +var emptyAddress common.Address + +type Intent struct { + L1ChainID uint64 `json:"l1ChainID" toml:"l1ChainID"` + + SuperchainRoles SuperchainRoles `json:"superchainRoles" toml:"superchainRoles"` + + UseFaultProofs bool `json:"useFaultProofs" toml:"useFaultProofs"` + + UseAltDA bool `json:"useAltDA" toml:"useAltDA"` + + FundDevAccounts bool `json:"fundDevAccounts" toml:"fundDevAccounts"` + + ContractArtifactsURL *ArtifactsURL `json:"contractArtifactsURL" toml:"contractArtifactsURL"` + + Chains []*ChainIntent `json:"chains" toml:"chains"` + + GlobalDeployOverrides map[string]any `json:"globalDeployOverrides" toml:"globalDeployOverrides"` +} + +func (c *Intent) L1ChainIDBig() *big.Int { + return big.NewInt(int64(c.L1ChainID)) +} + +func (c *Intent) Check() error { + if c.L1ChainID == 0 { + return fmt.Errorf("l1ChainID must be set") + } + + if c.UseFaultProofs && c.UseAltDA { + return fmt.Errorf("cannot use both fault proofs and alt-DA") + } + + if c.SuperchainRoles.ProxyAdminOwner == emptyAddress { + return fmt.Errorf("proxyAdminOwner must be set") + } + + if c.SuperchainRoles.ProtocolVersionsOwner == emptyAddress { + c.SuperchainRoles.ProtocolVersionsOwner = c.SuperchainRoles.ProxyAdminOwner + } + + if c.SuperchainRoles.Guardian == emptyAddress { + c.SuperchainRoles.Guardian = c.SuperchainRoles.ProxyAdminOwner + } + + if c.ContractArtifactsURL == nil { + return fmt.Errorf("contractArtifactsURL must be set") + } + + return nil +} + +func (c *Intent) Chain(id common.Hash) (*ChainIntent, error) { + for i := range c.Chains { + if c.Chains[i].ID == id { + return c.Chains[i], nil + } + } + + return nil, fmt.Errorf("chain %d not found", id) +} + +func (c *Intent) WriteToFile(path string) error { + return jsonutil.WriteTOML(c, ioutil.ToAtomicFile(path, 0o755)) +} + +type SuperchainRoles struct { + ProxyAdminOwner common.Address `json:"proxyAdminOwner" toml:"proxyAdminOwner"` + + ProtocolVersionsOwner common.Address `json:"protocolVersionsOwner" toml:"protocolVersionsOwner"` + + Guardian common.Address `json:"guardian" toml:"guardian"` +} + +type ChainIntent struct { + ID common.Hash `json:"id" toml:"id"` + + Roles ChainRoles `json:"roles" toml:"roles"` + + DeployOverrides map[string]any `json:"deployOverrides" toml:"deployOverrides"` +} + +type ChainRoles struct { + ProxyAdminOwner common.Address `json:"proxyAdminOwner" toml:"proxyAdminOwner"` + + SystemConfigOwner common.Address `json:"systemConfigOwner" toml:"systemConfigOwner"` + + GovernanceTokenOwner common.Address `json:"governanceTokenOwner" toml:"governanceTokenOwner"` + + UnsafeBlockSigner common.Address `json:"unsafeBlockSigner" toml:"unsafeBlockSigner"` + + Batcher common.Address `json:"batcher" toml:"batcher"` + + Proposer common.Address `json:"proposer" toml:"proposer"` + + Challenger common.Address `json:"challenger" toml:"challenger"` +} + +func (c *ChainIntent) Check() error { + var emptyHash common.Hash + if c.ID == emptyHash { + return fmt.Errorf("id must be set") + } + + if c.Roles.ProxyAdminOwner == emptyAddress { + return fmt.Errorf("proxyAdminOwner must be set") + } + + if c.Roles.SystemConfigOwner == emptyAddress { + c.Roles.SystemConfigOwner = c.Roles.ProxyAdminOwner + } + + if c.Roles.GovernanceTokenOwner == emptyAddress { + c.Roles.GovernanceTokenOwner = c.Roles.ProxyAdminOwner + } + + if c.Roles.UnsafeBlockSigner == emptyAddress { + return fmt.Errorf("unsafeBlockSigner must be set") + } + + if c.Roles.Batcher == emptyAddress { + return fmt.Errorf("batcher must be set") + } + + return nil +} diff --git a/op-chain-ops/deployer/state/state.go b/op-chain-ops/deployer/state/state.go new file mode 100644 index 000000000000..098fa7a731d7 --- /dev/null +++ b/op-chain-ops/deployer/state/state.go @@ -0,0 +1,119 @@ +package state + +import ( + "bytes" + "compress/gzip" + "encoding/json" + "fmt" + + "github.com/ethereum/go-ethereum/core/types" + + "github.com/ethereum-optimism/optimism/op-chain-ops/foundry" + "github.com/ethereum-optimism/optimism/op-service/ioutil" + "github.com/ethereum-optimism/optimism/op-service/jsonutil" + "github.com/ethereum/go-ethereum/common" +) + +// State contains the data needed to recreate the deployment +// as it progresses and once it is fully applied. +type State struct { + // Version versions the state so we can update it later. + Version int `json:"version"` + + // Create2Salt is the salt used for CREATE2 deployments. + Create2Salt common.Hash `json:"create2Salt"` + + // AppliedIntent contains the chain intent that was last + // successfully applied. It is diffed against new intent + // in order to determine what deployment steps to take. + // This field is nil for new deployments. + AppliedIntent *Intent `json:"appliedIntent"` + + // SuperchainDeployment contains the addresses of the Superchain + // deployment. It only contains the proxies because the implementations + // can be looked up on chain. + SuperchainDeployment *SuperchainDeployment `json:"superchainDeployment"` + + // ImplementationsDeployment contains the addresses of the common implementation + // contracts required for the Superchain to function. + ImplementationsDeployment *ImplementationsDeployment `json:"implementationsDeployment"` + + // Chains contains data about L2 chain deployments. + Chains []*ChainState `json:"opChainDeployments"` +} + +func (s *State) WriteToFile(path string) error { + return jsonutil.WriteJSON(s, ioutil.ToAtomicFile(path, 0o755)) +} + +func (s *State) Chain(id common.Hash) (*ChainState, error) { + for _, chain := range s.Chains { + if chain.ID == id { + return chain, nil + } + } + return nil, fmt.Errorf("chain not found: %s", id.Hex()) +} + +type SuperchainDeployment struct { + ProxyAdminAddress common.Address `json:"proxyAdminAddress"` + SuperchainConfigProxyAddress common.Address `json:"superchainConfigProxyAddress"` + SuperchainConfigImplAddress common.Address `json:"superchainConfigImplAddress"` + ProtocolVersionsProxyAddress common.Address `json:"protocolVersionsProxyAddress"` + ProtocolVersionsImplAddress common.Address `json:"protocolVersionsImplAddress"` + StateDump *foundry.ForgeAllocs `json:"stateDump"` +} + +type ImplementationsDeployment struct { + OpsmProxyAddress common.Address `json:"opsmProxyAddress"` + DelayedWETHImplAddress common.Address `json:"delayedWETHImplAddress"` + OptimismPortalImplAddress common.Address `json:"optimismPortalImplAddress"` + PreimageOracleSingletonAddress common.Address `json:"preimageOracleSingletonAddress"` + MipsSingletonAddress common.Address `json:"mipsSingletonAddress"` + SystemConfigImplAddress common.Address `json:"systemConfigImplAddress"` + L1CrossDomainMessengerImplAddress common.Address `json:"l1CrossDomainMessengerImplAddress"` + L1ERC721BridgeImplAddress common.Address `json:"l1ERC721BridgeImplAddress"` + L1StandardBridgeImplAddress common.Address `json:"l1StandardBridgeImplAddress"` + OptimismMintableERC20FactoryImplAddress common.Address `json:"optimismMintableERC20FactoryImplAddress"` + DisputeGameFactoryImplAddress common.Address `json:"disputeGameFactoryImplAddress"` + StateDump *foundry.ForgeAllocs `json:"stateDump"` +} + +type ChainState struct { + ID common.Hash `json:"id"` + + ProxyAdminAddress common.Address `json:"proxyAdminAddress"` + AddressManagerAddress common.Address `json:"addressManagerAddress"` + L1ERC721BridgeProxyAddress common.Address `json:"l1ERC721BridgeProxyAddress"` + SystemConfigProxyAddress common.Address `json:"systemConfigProxyAddress"` + OptimismMintableERC20FactoryProxyAddress common.Address `json:"optimismMintableERC20FactoryProxyAddress"` + L1StandardBridgeProxyAddress common.Address `json:"l1StandardBridgeProxyAddress"` + L1CrossDomainMessengerProxyAddress common.Address `json:"l1CrossDomainMessengerProxyAddress"` + OptimismPortalProxyAddress common.Address `json:"optimismPortalProxyAddress"` + DisputeGameFactoryProxyAddress common.Address `json:"disputeGameFactoryProxyAddress"` + AnchorStateRegistryProxyAddress common.Address `json:"anchorStateRegistryProxyAddress"` + AnchorStateRegistryImplAddress common.Address `json:"anchorStateRegistryImplAddress"` + FaultDisputeGameAddress common.Address `json:"faultDisputeGameAddress"` + PermissionedDisputeGameAddress common.Address `json:"permissionedDisputeGameAddress"` + DelayedWETHPermissionedGameProxyAddress common.Address `json:"delayedWETHPermissionedGameProxyAddress"` + DelayedWETHPermissionlessGameProxyAddress common.Address `json:"delayedWETHPermissionlessGameProxyAddress"` + + Allocs Base64Bytes `json:"allocs"` + + StartBlock *types.Header `json:"startBlock"` +} + +func (c *ChainState) UnmarshalAllocs() (*foundry.ForgeAllocs, error) { + gr, err := gzip.NewReader(bytes.NewReader(c.Allocs)) + if err != nil { + return nil, fmt.Errorf("failed to create gzip reader: %w", err) + } + defer gr.Close() + + var allocs foundry.ForgeAllocs + if err := json.NewDecoder(gr).Decode(&allocs); err != nil { + return nil, fmt.Errorf("failed to decode allocs: %w", err) + } + + return &allocs, nil +} diff --git a/op-chain-ops/deployer/version/version.go b/op-chain-ops/deployer/version/version.go new file mode 100644 index 000000000000..2456f656d45c --- /dev/null +++ b/op-chain-ops/deployer/version/version.go @@ -0,0 +1,6 @@ +package version + +var ( + Version = "v0.0.0" + Meta = "dev" +) diff --git a/op-chain-ops/devkeys/devkeys.go b/op-chain-ops/devkeys/devkeys.go new file mode 100644 index 000000000000..d0526c8c1d3a --- /dev/null +++ b/op-chain-ops/devkeys/devkeys.go @@ -0,0 +1,255 @@ +package devkeys + +import ( + "crypto/ecdsa" + "fmt" + "math/big" + + "github.com/ethereum/go-ethereum/common" +) + +// UserKey identifies an account for any user, by index, not specific to any chain. +type UserKey uint64 + +const ( + DefaultKey UserKey = 0 +) + +var _ Key = DefaultKey + +func (k UserKey) HDPath() string { + return fmt.Sprintf("m/44'/60'/0'/0/%d", uint64(k)) +} + +func (k UserKey) String() string { + return fmt.Sprintf("user-key-%d", uint64(k)) +} + +// ChainUserKey is a user-key, but purpose-specific to a single chain. +// ChainID == 0 results in deriving the same key as a regular UserKey for any chain. +type ChainUserKey struct { + ChainID *big.Int + Index uint64 +} + +var _ Key = ChainUserKey{} + +func (k ChainUserKey) HDPath() string { + return fmt.Sprintf("m/44'/60'/0'/%d/%d", k.ChainID, k.Index) +} + +func (k ChainUserKey) String() string { + return fmt.Sprintf("user-key-chain(%d)-%d", k.ChainID, k.Index) +} + +// ChainUserKeys is a helper method to not repeat chainID for every user key +func ChainUserKeys(chainID *big.Int) func(index uint64) ChainUserKey { + return func(index uint64) ChainUserKey { + return ChainUserKey{ChainID: chainID, Index: index} + } +} + +type Role interface { + Key(chainID *big.Int) Key +} + +// SuperchainOperatorRole identifies an account used in the operations of superchain contracts +type SuperchainOperatorRole uint64 + +const ( + // SuperchainDeployerKey is the deployer of the superchain contracts. + SuperchainDeployerKey SuperchainOperatorRole = 0 + // SuperchainProxyAdminOwner is the key that owns the superchain ProxyAdmin + SuperchainProxyAdminOwner SuperchainOperatorRole = 1 + // SuperchainConfigGuardianKey is the Guardian of the SuperchainConfig. + SuperchainConfigGuardianKey SuperchainOperatorRole = 2 + // SuperchainProtocolVersionsOwner is the key that can make ProtocolVersions changes. + SuperchainProtocolVersionsOwner SuperchainOperatorRole = 3 + // DependencySetManagerKey is the key used to manage the dependency set of a superchain. + DependencySetManagerKey SuperchainOperatorRole = 4 +) + +func (role SuperchainOperatorRole) String() string { + switch role { + case SuperchainDeployerKey: + return "superchain-deployer" + case SuperchainProxyAdminOwner: + return "superchain-proxy-admin-owner" + case SuperchainConfigGuardianKey: + return "superchain-config-guardian" + case SuperchainProtocolVersionsOwner: + return "superchain-protocol-versions-owner" + case DependencySetManagerKey: + return "dependency-set-manager" + default: + return fmt.Sprintf("unknown-superchain-%d", uint64(role)) + } +} + +func (role SuperchainOperatorRole) Key(chainID *big.Int) Key { + return &SuperchainOperatorKey{ + ChainID: chainID, + Role: role, + } +} + +// SuperchainOperatorKey is an account specific to an OperationRole of a given OP-Stack chain. +type SuperchainOperatorKey struct { + ChainID *big.Int + Role SuperchainOperatorRole +} + +var _ Key = SuperchainOperatorKey{} + +func (k SuperchainOperatorKey) HDPath() string { + return fmt.Sprintf("m/44'/60'/1'/%d/%d", k.ChainID, uint64(k.Role)) +} + +func (k SuperchainOperatorKey) String() string { + return fmt.Sprintf("superchain(%d)-%s", k.ChainID, k.Role) +} + +// SuperchainOperatorKeys is a helper method to not repeat chainID on every operator role +func SuperchainOperatorKeys(chainID *big.Int) func(role SuperchainOperatorRole) SuperchainOperatorKey { + return func(role SuperchainOperatorRole) SuperchainOperatorKey { + return SuperchainOperatorKey{ChainID: chainID, Role: role} + } +} + +// ChainOperatorRole identifies an account for a specific OP-Stack chain operator role. +type ChainOperatorRole uint64 + +const ( + // DeployerRole is the deployer of contracts for an OP-Stack chain + DeployerRole ChainOperatorRole = 0 + // ProposerRole is the key used by op-proposer + ProposerRole ChainOperatorRole = 1 + // BatcherRole is the key used by op-batcher + BatcherRole ChainOperatorRole = 2 + // SequencerP2PRole is the key used to publish sequenced L2 blocks + SequencerP2PRole ChainOperatorRole = 3 + // ChallengerRole is the key used by op-challenger + ChallengerRole ChainOperatorRole = 4 + // L2ProxyAdminOwnerRole is the key that controls the ProxyAdmin predeploy in L2 + L2ProxyAdminOwnerRole ChainOperatorRole = 5 + // L1ProxyAdminOwnerRole is the key that owns the ProxyAdmin on the L1 side of the deployment. + // This can be the ProxyAdmin of a L2 chain deployment, or a superchain deployment, depending on the domain. + L1ProxyAdminOwnerRole ChainOperatorRole = 6 + // BaseFeeVaultRecipientRole is the key that receives from the BaseFeeVault predeploy + BaseFeeVaultRecipientRole ChainOperatorRole = 7 + // L1FeeVaultRecipientRole is the key that receives from the L1FeeVault predeploy + L1FeeVaultRecipientRole ChainOperatorRole = 8 + // SequencerFeeVaultRecipientRole is the key that receives form the SequencerFeeVault predeploy + SequencerFeeVaultRecipientRole ChainOperatorRole = 9 + // SystemConfigOwner is the key that can make SystemConfig changes. + SystemConfigOwner ChainOperatorRole = 10 +) + +func (role ChainOperatorRole) String() string { + switch role { + case DeployerRole: + return "deployer" + case ProposerRole: + return "proposer" + case BatcherRole: + return "batcher" + case SequencerP2PRole: + return "sequencer-p2p" + case ChallengerRole: + return "challenger" + case L2ProxyAdminOwnerRole: + return "l2-proxy-admin-owner" + case L1ProxyAdminOwnerRole: + return "l1-proxy-admin-owner" + case BaseFeeVaultRecipientRole: + return "base-fee-vault-recipient" + case L1FeeVaultRecipientRole: + return "l1-fee-vault-recipient" + case SequencerFeeVaultRecipientRole: + return "sequencer-fee-vault-recipient" + case SystemConfigOwner: + return "system-config-owner" + default: + return fmt.Sprintf("unknown-operator-%d", uint64(role)) + } +} + +func (role ChainOperatorRole) Key(chainID *big.Int) Key { + return &ChainOperatorKey{ + ChainID: chainID, + Role: role, + } +} + +// ChainOperatorKey is an account specific to an OperationRole of a given OP-Stack chain. +type ChainOperatorKey struct { + ChainID *big.Int + Role ChainOperatorRole +} + +var _ Key = ChainOperatorKey{} + +func (k ChainOperatorKey) HDPath() string { + return fmt.Sprintf("m/44'/60'/2'/%d/%d", k.ChainID, uint64(k.Role)) +} + +func (k ChainOperatorKey) String() string { + return fmt.Sprintf("chain(%d)-%s", k.ChainID, k.Role) +} + +// ChainOperatorKeys is a helper method to not repeat chainID on every operator role +func ChainOperatorKeys(chainID *big.Int) func(ChainOperatorRole) ChainOperatorKey { + return func(role ChainOperatorRole) ChainOperatorKey { + return ChainOperatorKey{ChainID: chainID, Role: role} + } +} + +// Key identifies an account, and produces an HD-Path to derive the secret-key from. +// +// We organize the dev keys with a mnemonic key-path structure as following: +// BIP-44: `m / purpose' / coin_type' / account' / change / address_index` +// purpose = standard secp256k1 usage (Eth2 BLS keys use different purpose data). +// coin_type = chain type, set to 60' for ETH. See SLIP-0044. +// account = for different identities, used here to separate domains: +// +// domain 0: users +// domain 1: superchain operations +// domain 2: chain operations +// +// change = to separate external and internal addresses. +// +// Used here for chain ID, may be 0 for user accounts (any-chain addresses). +// +// address_index = used here to separate roles. +// The `'` char signifies BIP-32 hardened derivation. +// +// See: +// https://github.com/bitcoin/bips/blob/master/bip-0044.mediawiki +// https://github.com/satoshilabs/slips/blob/master/slip-0044.md +// https://github.com/bitcoin/bips/blob/master/bip-0032.mediawiki +type Key interface { + // HDPath produces the hierarchical derivation path to (re)create this key. + HDPath() string + // String describes the role of the key + String() string +} + +// Secrets selects a secret-key based on a key. +// This is meant for dev-purposes only. +// Secret keys should not directly be exposed to live production services. +type Secrets interface { + Secret(key Key) (*ecdsa.PrivateKey, error) +} + +// Addresses selects an address based on a key. +// This interface is preferred in tools that do not directly rely on secret-key material. +type Addresses interface { + // Address produces an address for the given key + Address(key Key) (common.Address, error) +} + +// Keys is a joint interface of Secrets and Addresses +type Keys interface { + Secrets + Addresses +} diff --git a/op-chain-ops/devkeys/hd.go b/op-chain-ops/devkeys/hd.go new file mode 100644 index 000000000000..ebc7260a8d5c --- /dev/null +++ b/op-chain-ops/devkeys/hd.go @@ -0,0 +1,47 @@ +package devkeys + +import ( + "crypto/ecdsa" + "fmt" + + hdwallet "github.com/ethereum-optimism/go-ethereum-hdwallet" + + "github.com/ethereum/go-ethereum/accounts" + "github.com/ethereum/go-ethereum/common" + "github.com/ethereum/go-ethereum/crypto" +) + +const TestMnemonic = "test test test test test test test test test test test junk" + +type MnemonicDevKeys struct { + w *hdwallet.Wallet +} + +var _ Keys = (*MnemonicDevKeys)(nil) + +func NewMnemonicDevKeys(mnemonic string) (*MnemonicDevKeys, error) { + w, err := hdwallet.NewFromMnemonic(mnemonic) + if err != nil { + return nil, fmt.Errorf("invalid mnemonic: %w", err) + } + return &MnemonicDevKeys{w: w}, nil +} + +func (d *MnemonicDevKeys) Secret(key Key) (*ecdsa.PrivateKey, error) { + account := accounts.Account{URL: accounts.URL{ + Path: key.HDPath(), + }} + priv, err := d.w.PrivateKey(account) + if err != nil { + return nil, fmt.Errorf("failed to derive key of path %s (key description: %s): %w", account.URL.Path, key.String(), err) + } + return priv, nil +} + +func (d *MnemonicDevKeys) Address(key Key) (common.Address, error) { + secret, err := d.Secret(key) + if err != nil { + return common.Address{}, err + } + return crypto.PubkeyToAddress(secret.PublicKey), nil +} diff --git a/op-chain-ops/devkeys/hd_test.go b/op-chain-ops/devkeys/hd_test.go new file mode 100644 index 000000000000..f7f67e205a48 --- /dev/null +++ b/op-chain-ops/devkeys/hd_test.go @@ -0,0 +1,68 @@ +package devkeys + +import ( + "math/big" + "testing" + + "github.com/stretchr/testify/require" + + "github.com/ethereum/go-ethereum/common" + "github.com/ethereum/go-ethereum/crypto" +) + +func TestMnemonicDevKeys(t *testing.T) { + m, err := NewMnemonicDevKeys(TestMnemonic) + require.NoError(t, err) + + t.Run("default", func(t *testing.T) { + defaultAccount, err := m.Address(DefaultKey) + require.NoError(t, err) + // Sanity check against a well-known dev account address, + // to ensure the mnemonic path is formatted with the right hardening at each path segment. + require.Equal(t, common.HexToAddress("0xf39Fd6e51aad88F6F4ce6aB8827279cffFb92266"), defaultAccount) + + // Check that we can localize users to a chain + chain1UserKey0, err := m.Address(ChainUserKeys(big.NewInt(1))(0)) + require.NoError(t, err) + require.NotEqual(t, defaultAccount, chain1UserKey0) + }) + + t.Run("superchain-operator", func(t *testing.T) { + keys := SuperchainOperatorKeys(big.NewInt(1)) + // Check that each key address and name is unique + addrs := make(map[common.Address]struct{}) + names := make(map[string]struct{}) + for i := SuperchainOperatorRole(0); i < 20; i++ { + key := keys(i) + secret, err := m.Secret(key) + require.NoError(t, err) + addr, err := m.Address(key) + require.NoError(t, err) + require.Equal(t, crypto.PubkeyToAddress(secret.PublicKey), addr) + addrs[addr] = struct{}{} + names[key.String()] = struct{}{} + } + require.Len(t, addrs, 20, "unique address for each account") + require.Len(t, names, 20, "unique name for each account") + }) + + t.Run("chain-operator", func(t *testing.T) { + keys := ChainOperatorKeys(big.NewInt(1)) + // Check that each key address and name is unique + addrs := make(map[common.Address]struct{}) + names := make(map[string]struct{}) + for i := ChainOperatorRole(0); i < 20; i++ { + key := keys(i) + secret, err := m.Secret(key) + require.NoError(t, err) + addr, err := m.Address(key) + require.NoError(t, err) + require.Equal(t, crypto.PubkeyToAddress(secret.PublicKey), addr) + addrs[addr] = struct{}{} + names[key.String()] = struct{}{} + } + require.Len(t, addrs, 20, "unique address for each account") + require.Len(t, names, 20, "unique name for each account") + }) + +} diff --git a/op-chain-ops/etherscan/client.go b/op-chain-ops/etherscan/client.go deleted file mode 100644 index 5d94a4cdd859..000000000000 --- a/op-chain-ops/etherscan/client.go +++ /dev/null @@ -1,221 +0,0 @@ -package etherscan - -import ( - "context" - "encoding/json" - "errors" - "fmt" - "io" - "net/http" - "net/url" - "time" - - "github.com/ethereum-optimism/optimism/op-service/retry" -) - -type client struct { - baseUrl string - httpClient *http.Client -} - -type apiResponse struct { - Status string `json:"status"` - Message string `json:"message"` - Result json.RawMessage `json:"result"` -} - -type rpcResponse struct { - JsonRpc string `json:"jsonrpc"` - Id int `json:"id"` - Result json.RawMessage `json:"result"` -} - -type Transaction struct { - Hash string `json:"hash"` - Input string `json:"input"` - To string `json:"to"` -} - -const apiMaxRetries = 3 -const apiRetryDelay = time.Duration(2) * time.Second -const errRateLimited = "Max rate limit reached" - -func NewClient(baseUrl, apiKey string) *client { - return &client{ - baseUrl: baseUrl + "/api?apikey=" + apiKey + "&", - httpClient: &http.Client{ - Timeout: time.Second * 10, - }, - } -} - -func NewEthereumClient(apiKey string) *client { - return NewClient("https://api.etherscan.io", apiKey) -} - -func NewOptimismClient(apiKey string) *client { - return NewClient("https://api-optimistic.etherscan.io", apiKey) -} - -func (c *client) fetch(ctx context.Context, url string) ([]byte, error) { - req, err := http.NewRequestWithContext(ctx, http.MethodGet, url, nil) - if err != nil { - return nil, err - } - resp, err := c.httpClient.Do(req) - if err != nil { - return nil, err - } - defer resp.Body.Close() - - body, err := io.ReadAll(resp.Body) - if err != nil { - return nil, err - } - return body, nil -} - -func (c *client) fetchEtherscanApi(ctx context.Context, url string) (apiResponse, error) { - return retry.Do[apiResponse](ctx, apiMaxRetries, retry.Fixed(apiRetryDelay), func() (apiResponse, error) { - body, err := c.fetch(ctx, url) - if err != nil { - return apiResponse{}, err - } - - var response apiResponse - err = json.Unmarshal(body, &response) - if err != nil { - return apiResponse{}, fmt.Errorf("failed to unmarshal as apiResponse: %w", err) - } - - if response.Message != "OK" { - var resultString string - err = json.Unmarshal(response.Result, &resultString) - if err != nil { - return apiResponse{}, fmt.Errorf("response for %s not OK, returned message: %s", url, response.Message) - } - - if resultString == errRateLimited { - return apiResponse{}, errors.New(errRateLimited) - } - - return apiResponse{}, fmt.Errorf("there was an issue with the Etherscan request to %s, received response: %v", url, response) - } - - return response, nil - }) -} - -func (c *client) fetchEtherscanRpc(ctx context.Context, url string) (rpcResponse, error) { - return retry.Do[rpcResponse](ctx, apiMaxRetries, retry.Fixed(apiRetryDelay), func() (rpcResponse, error) { - body, err := c.fetch(ctx, url) - if err != nil { - return rpcResponse{}, err - } - - var response rpcResponse - err = json.Unmarshal(body, &response) - if err != nil { - return rpcResponse{}, fmt.Errorf("failed to unmarshal as rpcResponse: %w", err) - } - - var resultString string - _ = json.Unmarshal(response.Result, &resultString) - if resultString == errRateLimited { - return rpcResponse{}, errors.New(errRateLimited) - } - - return response, nil - }) -} - -func (c *client) FetchAbi(ctx context.Context, address string) (string, error) { - params := url.Values{} - params.Set("address", address) - url := constructUrl(c.baseUrl, "getabi", "contract", params) - response, err := c.fetchEtherscanApi(ctx, url) - if err != nil { - return "", err - } - - var abi string - err = json.Unmarshal(response.Result, &abi) - if err != nil { - return "", fmt.Errorf("API response result is not expected ABI string: %w", err) - } - - return abi, nil -} - -func (c *client) FetchDeployedBytecode(ctx context.Context, address string) (string, error) { - params := url.Values{} - params.Set("address", address) - url := constructUrl(c.baseUrl, "eth_getCode", "proxy", params) - response, err := c.fetchEtherscanRpc(ctx, url) - if err != nil { - return "", fmt.Errorf("error fetching deployed bytecode: %w", err) - } - - var bytecode string - err = json.Unmarshal(response.Result, &bytecode) - if err != nil { - return "", errors.New("API response result is not expected bytecode string") - } - - return bytecode, nil -} - -func (c *client) FetchDeploymentTxHash(ctx context.Context, address string) (string, error) { - params := url.Values{} - params.Set("contractaddresses", address) - url := constructUrl(c.baseUrl, "getcontractcreation", "contract", params) - response, err := c.fetchEtherscanApi(ctx, url) - if err != nil { - return "", err - } - - var results []struct { - Hash string `json:"txHash"` - } - err = json.Unmarshal(response.Result, &results) - if err != nil { - return "", fmt.Errorf("failed to unmarshal API response as []txInfo: %w", err) - } - - if len(results) == 0 { - return "", fmt.Errorf("API response result is an empty array") - } - - return results[0].Hash, nil -} - -func (c *client) FetchDeploymentTx(ctx context.Context, txHash string) (Transaction, error) { - params := url.Values{} - params.Set("txHash", txHash) - params.Set("tag", "latest") - url := constructUrl(c.baseUrl, "eth_getTransactionByHash", "proxy", params) - response, err := c.fetchEtherscanRpc(ctx, url) - if err != nil { - return Transaction{}, err - } - - resultBytes, err := json.Marshal(response.Result) - if err != nil { - return Transaction{}, fmt.Errorf("failed to marshal Result into JSON: %w", err) - } - - var tx Transaction - err = json.Unmarshal(resultBytes, &tx) - if err != nil { - return Transaction{}, fmt.Errorf("API response result is not expected txInfo struct: %w", err) - } - - return tx, nil -} - -func constructUrl(baseUrl, action, module string, params url.Values) string { - params.Set("action", action) - params.Set("module", module) - queryFragment := params.Encode() - return baseUrl + queryFragment -} diff --git a/op-chain-ops/foundry/allocs.go b/op-chain-ops/foundry/allocs.go new file mode 100644 index 000000000000..af0c28f4faf0 --- /dev/null +++ b/op-chain-ops/foundry/allocs.go @@ -0,0 +1,126 @@ +package foundry + +import ( + "encoding/json" + "fmt" + "maps" + "math/big" + "os" + + "github.com/holiman/uint256" + + "github.com/ethereum/go-ethereum/common" + "github.com/ethereum/go-ethereum/common/hexutil" + "github.com/ethereum/go-ethereum/core/state" + "github.com/ethereum/go-ethereum/core/types" +) + +type ForgeAllocs struct { + Accounts types.GenesisAlloc +} + +// FromState takes a geth StateDB, and dumps the accounts into the ForgeAllocs. +// Any previous allocs contents are removed. +// Warning: the state must be committed first, trie-key preimages must be present for iteration, +// and a fresh state around the committed state-root must be presented, for the latest state-contents to be dumped. +func (f *ForgeAllocs) FromState(stateDB StateDB) { + f.Accounts = make(types.GenesisAlloc) + stateDB.DumpToCollector((*forgeAllocsDump)(f), &state.DumpConfig{ + OnlyWithAddresses: true, + }) +} + +// StateDB is a minimal interface to support dumping of Geth EVM state to ForgeAllocs. +type StateDB interface { + DumpToCollector(c state.DumpCollector, conf *state.DumpConfig) (nextKey []byte) +} + +// Assert that the Geth StateDB implements this interface still. +var _ StateDB = (*state.StateDB)(nil) + +// forgeAllocsDump is a wrapper to hide the error-prone state-dumping interface from public API. +// Use ForgeAllocs.FromState to dump a state to forge-allocs. +type forgeAllocsDump ForgeAllocs + +// ForgeAllocs implements state.DumpAllocator, such that the EVM state can be dumped into it: +// with a StateDB.DumpToCollector call. +var _ state.DumpCollector = (*forgeAllocsDump)(nil) + +func (d *forgeAllocsDump) OnRoot(hash common.Hash) { + // Unlike the geth raw-state-dump, forge-allocs do not reference the state trie root. +} + +func (d *forgeAllocsDump) OnAccount(address *common.Address, account state.DumpAccount) { + if address == nil { + return + } + if _, ok := d.Accounts[*address]; ok { + panic(fmt.Errorf("cannot dump account %s twice", *address)) + } + balance, ok := new(big.Int).SetString(account.Balance, 0) + if !ok { + panic("invalid balance") + } + var storage map[common.Hash]common.Hash + if len(account.Storage) > 0 { + storage = make(map[common.Hash]common.Hash, len(account.Storage)) + for k, v := range account.Storage { + storage[k] = common.HexToHash(v) + } + } + d.Accounts[*address] = types.Account{ + Code: account.Code, + Storage: storage, + Balance: balance, + Nonce: account.Nonce, + } +} + +func (d *ForgeAllocs) Copy() *ForgeAllocs { + out := make(types.GenesisAlloc, len(d.Accounts)) + maps.Copy(out, d.Accounts) + return &ForgeAllocs{Accounts: out} +} + +func (d ForgeAllocs) MarshalJSON() ([]byte, error) { + return json.Marshal(d.Accounts) +} + +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"` + } + var allocs map[common.Address]forgeAllocAccount + if err := json.Unmarshal(b, &allocs); err != nil { + return err + } + 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, + } + } + return nil +} + +func LoadForgeAllocs(allocsPath string) (*ForgeAllocs, error) { + f, err := os.OpenFile(allocsPath, os.O_RDONLY, 0644) + if err != nil { + return nil, fmt.Errorf("failed to open forge allocs %q: %w", allocsPath, 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", allocsPath, err) + } + return &out, nil +} diff --git a/op-chain-ops/foundry/allocs_test.go b/op-chain-ops/foundry/allocs_test.go new file mode 100644 index 000000000000..6d19557016cb --- /dev/null +++ b/op-chain-ops/foundry/allocs_test.go @@ -0,0 +1,121 @@ +package foundry + +import ( + "encoding/json" + "math/big" + "os" + "testing" + + "github.com/holiman/uint256" + "github.com/stretchr/testify/require" + + oplog "github.com/ethereum-optimism/optimism/op-service/log" + "github.com/ethereum/go-ethereum/common" + "github.com/ethereum/go-ethereum/core/rawdb" + "github.com/ethereum/go-ethereum/core/state" + "github.com/ethereum/go-ethereum/core/tracing" + "github.com/ethereum/go-ethereum/core/types" + "github.com/ethereum/go-ethereum/crypto" + "github.com/ethereum/go-ethereum/log" + "github.com/ethereum/go-ethereum/triedb" + "github.com/ethereum/go-ethereum/triedb/hashdb" +) + +func TestForgeAllocs_FromState(t *testing.T) { + // Internals of state-dumping of Geth have silent errors. + cfg := oplog.DefaultCLIConfig() + cfg.Level = log.LevelTrace + oplog.SetGlobalLogHandler(oplog.NewLogHandler(os.Stdout, cfg)) + + rawDB := rawdb.NewMemoryDatabase() + stateDB := state.NewDatabaseWithConfig(rawDB, &triedb.Config{ + Preimages: true, + IsVerkle: false, + HashDB: hashdb.Defaults, + PathDB: nil, + }) + st, err := state.New(types.EmptyRootHash, stateDB, nil) + require.NoError(t, err) + + alice := common.HexToAddress("0xf39Fd6e51aad88F6F4ce6aB8827279cffFb92266") + st.CreateAccount(alice) + st.SetBalance(alice, uint256.NewInt(123), tracing.BalanceChangeUnspecified) + st.SetNonce(alice, 42) + + bob := common.HexToAddress("0x70997970C51812dc3A010C7d01b50e0d17dc79C8") + st.CreateAccount(bob) + st.CreateContract(bob) + st.SetBalance(bob, uint256.NewInt(100), tracing.BalanceChangeUnspecified) + st.SetNonce(bob, 1) + st.SetState(bob, common.Hash{0: 0x42}, common.Hash{0: 7}) + + contract := common.HexToAddress("0xCcCCccccCCCCcCCCCCCcCcCccCcCCCcCcccccccC") + st.CreateAccount(contract) + st.CreateContract(contract) + st.SetNonce(contract, 30) + st.SetBalance(contract, uint256.NewInt(0), tracing.BalanceChangeUnspecified) + st.SetCode(contract, []byte{10, 11, 12, 13, 14}) + + // Commit and make a new state, we cannot reuse the state after Commit + // (see doc-comment in Commit, absolute footgun) + root, err := st.Commit(0, false) + require.NoError(t, err) + st, err = state.New(root, stateDB, nil) + require.NoError(t, err) + + st.SetState(contract, common.Hash{0: 0xa}, common.Hash{0: 1}) + st.SetState(contract, crypto.Keccak256Hash([]byte("hello")), crypto.Keccak256Hash([]byte("world"))) + + root, err = st.Commit(0, false) + require.NoError(t, err) + st, err = state.New(root, stateDB, nil) + require.NoError(t, err) + + var allocs ForgeAllocs + allocs.FromState(st) + + require.Len(t, allocs.Accounts, 3) + + require.Contains(t, allocs.Accounts, alice) + require.Nil(t, allocs.Accounts[alice].Code) + require.Nil(t, allocs.Accounts[alice].Storage) + require.Equal(t, "123", allocs.Accounts[alice].Balance.String()) + require.Equal(t, uint64(42), allocs.Accounts[alice].Nonce) + + require.Contains(t, allocs.Accounts, bob) + require.Nil(t, allocs.Accounts[bob].Code) + require.Len(t, allocs.Accounts[bob].Storage, 1) + require.Equal(t, common.Hash{0: 7}, allocs.Accounts[bob].Storage[common.Hash{0: 0x42}]) + require.Equal(t, "100", allocs.Accounts[bob].Balance.String()) + require.Equal(t, uint64(1), allocs.Accounts[bob].Nonce) + + require.Contains(t, allocs.Accounts, contract) + require.Equal(t, []byte{10, 11, 12, 13, 14}, allocs.Accounts[contract].Code) + require.Len(t, allocs.Accounts[contract].Storage, 2) + require.Equal(t, common.Hash{0: 1}, allocs.Accounts[contract].Storage[common.Hash{0: 0xa}]) + require.Equal(t, crypto.Keccak256Hash([]byte("world")), + allocs.Accounts[contract].Storage[crypto.Keccak256Hash([]byte("hello"))]) + require.Equal(t, "0", allocs.Accounts[contract].Balance.String()) + require.Equal(t, uint64(30), allocs.Accounts[contract].Nonce) +} + +func TestForgeAllocs_Marshaling(t *testing.T) { + data := &ForgeAllocs{ + Accounts: map[common.Address]types.Account{ + common.HexToAddress("0x12345"): { + Balance: big.NewInt(12345), + Code: []byte{0x01, 0x02, 0x03}, + Nonce: 123, + Storage: map[common.Hash]common.Hash{ + common.HexToHash("0x12345"): common.HexToHash("0x12345"), + }, + }, + }, + } + + out, err := json.Marshal(data) + require.NoError(t, err) + + var in ForgeAllocs + require.NoError(t, json.Unmarshal(out, &in)) +} diff --git a/op-chain-ops/foundry/artifact.go b/op-chain-ops/foundry/artifact.go index 93791ef806d0..70e3085b0961 100644 --- a/op-chain-ops/foundry/artifact.go +++ b/op-chain-ops/foundry/artifact.go @@ -1,13 +1,16 @@ package foundry import ( + "bytes" "encoding/json" + "errors" "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" "github.com/ethereum/go-ethereum/common/hexutil" ) @@ -20,6 +23,7 @@ type Artifact struct { StorageLayout solc.StorageLayout DeployedBytecode DeployedBytecode Bytecode Bytecode + Metadata Metadata } func (a *Artifact) UnmarshalJSON(data []byte) error { @@ -36,6 +40,7 @@ func (a *Artifact) UnmarshalJSON(data []byte) error { a.StorageLayout = artifact.StorageLayout a.DeployedBytecode = artifact.DeployedBytecode a.Bytecode = artifact.Bytecode + a.Metadata = artifact.Metadata return nil } @@ -45,33 +50,95 @@ func (a Artifact) MarshalJSON() ([]byte, error) { StorageLayout: a.StorageLayout, DeployedBytecode: a.DeployedBytecode, Bytecode: a.Bytecode, + Metadata: a.Metadata, } return json.Marshal(artifact) } -// artifactMarshaling is a helper struct for marshaling and unmarshaling +// artifactMarshaling is a helper struct for marshaling and unmarshalling // foundry artifacts. type artifactMarshaling struct { ABI json.RawMessage `json:"abi"` StorageLayout solc.StorageLayout `json:"storageLayout"` DeployedBytecode DeployedBytecode `json:"deployedBytecode"` Bytecode Bytecode `json:"bytecode"` + Metadata Metadata `json:"metadata"` +} + +// Metadata is the subset of metadata in a foundry contract artifact that we use in OP-Stack tooling. +type Metadata struct { + Compiler struct { + Version string `json:"version"` + } `json:"compiler"` + + Language string `json:"language"` + + Output json.RawMessage `json:"output"` + + Settings struct { + // Remappings of the contract imports + Remappings json.RawMessage `json:"remappings"` + // Optimizer settings affect the compiler output, but can be arbitrary. + // We load them opaquely, to include it in the hash of what we run. + Optimizer json.RawMessage `json:"optimizer"` + // Metadata is loaded opaquely, similar to the Optimizer, to include in hashing. + // E.g. the bytecode-hash contract suffix as setting is enabled/disabled in here. + Metadata json.RawMessage `json:"metadata"` + // Map of full contract path to compiled contract name. + CompilationTarget map[string]string `json:"compilationTarget"` + // EVM version affects output, and hence included. + EVMVersion string `json:"evmVersion"` + // Libraries data + Libraries json.RawMessage `json:"libraries"` + } `json:"settings"` + + Sources map[string]ContractSource `json:"sources"` + + Version int `json:"version"` +} + +// ContractSource represents a JSON value in the "sources" map of a contract metadata dump. +// This uniquely identifies the source code of the contract. +type ContractSource struct { + Keccak256 common.Hash `json:"keccak256"` + URLs []string `json:"urls"` + License string `json:"license"` +} + +var ErrLinkingUnsupported = errors.New("cannot load bytecode with linking placeholders") + +// LinkableBytecode is not purely hex, it returns an ErrLinkingUnsupported error when +// input contains __$aaaaaaa$__ style linking placeholders. +// See https://docs.soliditylang.org/en/latest/using-the-compiler.html#library-linking +// In practice this is only used by test contracts to link in large test libraries. +type LinkableBytecode []byte + +func (lb *LinkableBytecode) UnmarshalJSON(data []byte) error { + if bytes.Contains(data, []byte("__$")) { + return ErrLinkingUnsupported + } + return (*hexutil.Bytes)(lb).UnmarshalJSON(data) +} + +func (lb LinkableBytecode) MarshalText() ([]byte, error) { + return (hexutil.Bytes)(lb).MarshalText() } // 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"` + SourceMap string `json:"sourceMap"` + Object LinkableBytecode `json:"object"` + LinkReferences json.RawMessage `json:"linkReferences"` + ImmutableReferences json.RawMessage `json:"immutableReferences,omitempty"` } -// DeployedBytecode represents the bytecode section of the solc compiler output. +// Bytecode 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"` + SourceMap string `json:"sourceMap"` + // not purely hex, can contain __$aaaaaaa$__ style linking placeholders + Object LinkableBytecode `json:"object"` + LinkReferences json.RawMessage `json:"linkReferences"` + ImmutableReferences json.RawMessage `json:"immutableReferences,omitempty"` } // ReadArtifact will read an artifact from disk given a path. diff --git a/op-chain-ops/foundry/artifact_test.go b/op-chain-ops/foundry/artifact_test.go index 7cb362226ae4..5430a023eba7 100644 --- a/op-chain-ops/foundry/artifact_test.go +++ b/op-chain-ops/foundry/artifact_test.go @@ -10,13 +10,13 @@ import ( // TestArtifactJSON tests roundtrip serialization of a foundry artifact for commonly used fields. func TestArtifactJSON(t *testing.T) { - artifact, err := ReadArtifact("testdata/OptimismPortal.json") + artifact, err := ReadArtifact("testdata/forge-artifacts/Owned.sol/Owned.json") require.NoError(t, err) data, err := json.Marshal(artifact) require.NoError(t, err) - file, err := os.ReadFile("testdata/OptimismPortal.json") + file, err := os.ReadFile("testdata/forge-artifacts/Owned.sol/Owned.json") require.NoError(t, err) got := unmarshalIntoMap(t, data) @@ -26,6 +26,7 @@ func TestArtifactJSON(t *testing.T) { 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"])) + require.JSONEq(t, marshal(t, got["metadata"]), marshal(t, expected["metadata"])) } func unmarshalIntoMap(t *testing.T, file []byte) map[string]any { diff --git a/op-chain-ops/foundry/artifactsfs.go b/op-chain-ops/foundry/artifactsfs.go new file mode 100644 index 000000000000..13229c41bc06 --- /dev/null +++ b/op-chain-ops/foundry/artifactsfs.go @@ -0,0 +1,96 @@ +package foundry + +import ( + "encoding/json" + "fmt" + "io/fs" + "os" + "path" + "strings" +) + +type StatDirFs interface { + fs.StatFS + fs.ReadDirFS +} + +func OpenArtifactsDir(dirPath string) *ArtifactsFS { + dir := os.DirFS(dirPath) + if d, ok := dir.(StatDirFs); !ok { + panic("Go DirFS guarantees changed") + } else { + return &ArtifactsFS{FS: d} + } +} + +// ArtifactsFS wraps a filesystem (read-only access) of a forge-artifacts bundle. +// The root contains directories for every artifact, +// each containing one or more entries (one per solidity compiler version) for a solidity contract. +// See OpenArtifactsDir for reading from a local directory. +// Alternative FS systems, like a tarball, may be used too. +type ArtifactsFS struct { + FS StatDirFs +} + +// ListArtifacts lists the artifacts. Each artifact matches a source-file name. +// This name includes the extension, e.g. ".sol" +// (no other artifact-types are supported at this time). +func (af *ArtifactsFS) ListArtifacts() ([]string, error) { + entries, err := af.FS.ReadDir(".") + if err != nil { + return nil, fmt.Errorf("failed to list artifacts: %w", err) + } + out := make([]string, 0, len(entries)) + for _, d := range entries { + // Some artifacts may be nested in directories not suffixed with ".sol" + // Nested artifacts, and non-solidity artifacts, are not supported. + if name := d.Name(); strings.HasSuffix(name, ".sol") { + out = append(out, d.Name()) + } + } + return out, nil +} + +// ListContracts lists the contracts of the named artifact, including the file extension. +// E.g. "Owned.sol" might list "Owned.0.8.15", "Owned.0.8.25", and "Owned". +func (af *ArtifactsFS) ListContracts(name string) ([]string, error) { + f, err := af.FS.Open(name) + if err != nil { + return nil, fmt.Errorf("failed to open artifact %q: %w", name, err) + } + defer f.Close() + dirFile, ok := f.(fs.ReadDirFile) + if !ok { + return nil, fmt.Errorf("no dir for artifact %q, but got %T", name, f) + } + entries, err := dirFile.ReadDir(0) + if err != nil { + return nil, fmt.Errorf("failed to list artifact contents of %q: %w", name, err) + } + out := make([]string, 0, len(entries)) + for _, d := range entries { + if name := d.Name(); strings.HasSuffix(name, ".json") { + out = append(out, strings.TrimSuffix(name, ".json")) + } + } + return out, nil +} + +// ReadArtifact reads a specific JSON contract artifact from the FS. +// The contract name may be suffixed by a solidity compiler version, e.g. "Owned.0.8.25". +// The contract name does not include ".json", this is a detail internal to the artifacts. +// The name of the artifact is the source-file name, this must include the suffix such as ".sol". +func (af *ArtifactsFS) ReadArtifact(name string, contract string) (*Artifact, error) { + artifactPath := path.Join(name, contract+".json") + f, err := af.FS.Open(artifactPath) + if err != nil { + return nil, fmt.Errorf("failed to open artifact %q: %w", artifactPath, err) + } + defer f.Close() + dec := json.NewDecoder(f) + var out Artifact + if err := dec.Decode(&out); err != nil { + return nil, fmt.Errorf("failed to decode artifact %q: %w", name, err) + } + return &out, nil +} diff --git a/op-chain-ops/foundry/artifactsfs_test.go b/op-chain-ops/foundry/artifactsfs_test.go new file mode 100644 index 000000000000..23b6a5c8608c --- /dev/null +++ b/op-chain-ops/foundry/artifactsfs_test.go @@ -0,0 +1,42 @@ +package foundry + +import ( + "errors" + "testing" + + "github.com/stretchr/testify/require" + + "github.com/ethereum/go-ethereum/log" + + "github.com/ethereum-optimism/optimism/op-service/testlog" +) + +func TestArtifacts(t *testing.T) { + logger := testlog.Logger(t, log.LevelWarn) // lower this log level to get verbose test dump of all artifacts + af := OpenArtifactsDir("./testdata/forge-artifacts") + artifacts, err := af.ListArtifacts() + require.NoError(t, err) + require.NotEmpty(t, artifacts) + for _, name := range artifacts { + contracts, err := af.ListContracts(name) + require.NoError(t, err, "failed to list %s", name) + require.NotEmpty(t, contracts) + for _, contract := range contracts { + artifact, err := af.ReadArtifact(name, contract) + if err != nil { + if errors.Is(err, ErrLinkingUnsupported) { + logger.Info("linking not supported", "name", name, "contract", contract, "err", err) + continue + } + require.NoError(t, err, "failed to read artifact %s / %s", name, contract) + } + logger.Info("artifact", + "name", name, + "contract", contract, + "compiler", artifact.Metadata.Compiler.Version, + "sources", len(artifact.Metadata.Sources), + "evmVersion", artifact.Metadata.Settings.EVMVersion, + ) + } + } +} diff --git a/op-chain-ops/foundry/sourcefs.go b/op-chain-ops/foundry/sourcefs.go new file mode 100644 index 000000000000..964794e5fd65 --- /dev/null +++ b/op-chain-ops/foundry/sourcefs.go @@ -0,0 +1,147 @@ +package foundry + +import ( + "encoding/json" + "errors" + "fmt" + "io/fs" + "path" + "path/filepath" + "strings" + + "golang.org/x/exp/maps" + + "github.com/ethereum-optimism/optimism/op-chain-ops/srcmap" +) + +// SourceMapFS wraps an FS to provide source-maps. +// This FS relies on the following file path assumptions: +// - `/artifacts/build-info/X.json` (build-info path is read from the below file): build files, of foundry incremental builds. +// - `/cache/solidity-files-cache.json`: a JSON file enumerating all files, and when the build last changed. +// - `/` a root dir, relative to where the source files are located (as per the compilationTarget metadata in an artifact). +type SourceMapFS struct { + fs fs.FS +} + +// NewSourceMapFS creates a new SourceMapFS. +// The source-map FS loads identifiers for srcmap.ParseSourceMap +// and provides a util to retrieve a source-map for an Artifact. +// The solidity source-files are lazy-loaded when using the produced sourcemap. +func NewSourceMapFS(fs fs.FS) *SourceMapFS { + return &SourceMapFS{fs: fs} +} + +// ForgeBuild represents the JSON content of a forge-build entry in the `artifacts/build-info` output. +type ForgeBuild struct { + ID string `json:"id"` // ID of the build itself + SourceIDToPath map[srcmap.SourceID]string `json:"source_id_to_path"` // srcmap ID to source filepath +} + +func (s *SourceMapFS) readBuild(buildInfoPath string, id string) (*ForgeBuild, error) { + buildPath := path.Join(buildInfoPath, id+".json") + f, err := s.fs.Open(buildPath) + if err != nil { + return nil, fmt.Errorf("failed to open build: %w", err) + } + defer f.Close() + var build ForgeBuild + if err := json.NewDecoder(f).Decode(&build); err != nil { + return nil, fmt.Errorf("failed to read build: %w", err) + } + return &build, nil +} + +// ForgeBuildEntry represents a JSON entry that links the build job of a contract source file. +type ForgeBuildEntry struct { + Path string `json:"path"` + BuildID string `json:"build_id"` +} + +// ForgeBuildInfo represents a JSON entry that enumerates the latest builds per contract per compiler version. +type ForgeBuildInfo struct { + // contract name -> solidity version -> build entry + Artifacts map[string]map[string]ForgeBuildEntry `json:"artifacts"` +} + +// ForgeBuildCache rep +type ForgeBuildCache struct { + Paths struct { + BuildInfos string `json:"build_infos"` + } `json:"paths"` + Files map[string]ForgeBuildInfo `json:"files"` +} + +func (s *SourceMapFS) readBuildCache() (*ForgeBuildCache, error) { + cachePath := path.Join("cache", "solidity-files-cache.json") + f, err := s.fs.Open(cachePath) + if err != nil { + return nil, fmt.Errorf("failed to open build cache: %w", err) + } + defer f.Close() + var buildCache ForgeBuildCache + if err := json.NewDecoder(f).Decode(&buildCache); err != nil { + return nil, fmt.Errorf("failed to read build cache: %w", err) + } + return &buildCache, nil +} + +// ReadSourceIDs reads the source-identifier to source file-path mapping that is needed to translate a source-map +// of the given contract, the given compiler version, and within the given source file path. +func (s *SourceMapFS) ReadSourceIDs(path string, contract string, compilerVersion string) (map[srcmap.SourceID]string, error) { + buildCache, err := s.readBuildCache() + if err != nil { + return nil, err + } + artifactBuilds, ok := buildCache.Files[path] + if !ok { + return nil, fmt.Errorf("no known builds for path %q", path) + } + byCompilerVersion, ok := artifactBuilds.Artifacts[contract] + if !ok { + return nil, fmt.Errorf("contract not found in artifact: %q", contract) + } + var buildEntry ForgeBuildEntry + if compilerVersion != "" { + entry, ok := byCompilerVersion[compilerVersion] + if !ok { + return nil, fmt.Errorf("no known build for compiler version: %q", compilerVersion) + } + buildEntry = entry + } else { + if len(byCompilerVersion) == 0 { + return nil, errors.New("no known build, unspecified compiler version") + } + if len(byCompilerVersion) > 1 { + return nil, fmt.Errorf("no compiler version specified, and more than one option: %s", strings.Join(maps.Keys(byCompilerVersion), ", ")) + } + for _, entry := range byCompilerVersion { + buildEntry = entry + } + } + build, err := s.readBuild(filepath.ToSlash(buildCache.Paths.BuildInfos), buildEntry.BuildID) + if err != nil { + return nil, fmt.Errorf("failed to read build %q of contract %q: %w", buildEntry.BuildID, contract, err) + } + return build.SourceIDToPath, nil +} + +// SourceMap retrieves a source-map for a given contract of a foundry Artifact. +func (s *SourceMapFS) SourceMap(artifact *Artifact, contract string) (*srcmap.SourceMap, error) { + srcPath := "" + for path, name := range artifact.Metadata.Settings.CompilationTarget { + if name == contract { + srcPath = path + break + } + } + if srcPath == "" { + return nil, fmt.Errorf("no known source path for contract %s in artifact", contract) + } + // The commit suffix is ignored, the core semver part is what is used in the resolution of builds. + basicCompilerVersion := strings.SplitN(artifact.Metadata.Compiler.Version, "+", 2)[0] + ids, err := s.ReadSourceIDs(srcPath, contract, basicCompilerVersion) + if err != nil { + return nil, fmt.Errorf("failed to read source IDs of %q: %w", srcPath, err) + } + return srcmap.ParseSourceMap(s.fs, ids, artifact.DeployedBytecode.Object, artifact.DeployedBytecode.SourceMap) +} diff --git a/op-chain-ops/foundry/sourcefs_test.go b/op-chain-ops/foundry/sourcefs_test.go new file mode 100644 index 000000000000..bb30a10ad1a2 --- /dev/null +++ b/op-chain-ops/foundry/sourcefs_test.go @@ -0,0 +1,25 @@ +package foundry + +import ( + "os" + "testing" + + "github.com/stretchr/testify/require" +) + +//go:generate ./testdata/srcmaps/generate.sh + +func TestSourceMapFS(t *testing.T) { + artifactFS := OpenArtifactsDir("./testdata/srcmaps/test-artifacts") + exampleArtifact, err := artifactFS.ReadArtifact("SimpleStorage.sol", "SimpleStorage") + require.NoError(t, err) + srcFS := NewSourceMapFS(os.DirFS("./testdata/srcmaps")) + srcMap, err := srcFS.SourceMap(exampleArtifact, "SimpleStorage") + require.NoError(t, err) + seenInfo := make(map[string]struct{}) + for i := range exampleArtifact.DeployedBytecode.Object { + seenInfo[srcMap.FormattedInfo(uint64(i))] = struct{}{} + } + require.Contains(t, seenInfo, "src/SimpleStorage.sol:11:5") + require.Contains(t, seenInfo, "src/StorageLibrary.sol:8:9") +} diff --git a/op-chain-ops/foundry/testdata/OptimismPortal.json b/op-chain-ops/foundry/testdata/OptimismPortal.json deleted file mode 100644 index 488fb5343069..000000000000 --- a/op-chain-ops/foundry/testdata/OptimismPortal.json +++ /dev/null @@ -1,10591 +0,0 @@ -{ - "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/foundry/testdata/README.md b/op-chain-ops/foundry/testdata/README.md new file mode 100644 index 000000000000..549103b7de3f --- /dev/null +++ b/op-chain-ops/foundry/testdata/README.md @@ -0,0 +1,3 @@ +# source-map test data + +Simple small multi-contract forge setup, to test Go forge map functionality against. diff --git a/op-chain-ops/foundry/testdata/forge-artifacts/ERC20.sol/ERC20.0.8.15.json b/op-chain-ops/foundry/testdata/forge-artifacts/ERC20.sol/ERC20.0.8.15.json new file mode 100644 index 000000000000..73c1bf30953c --- /dev/null +++ b/op-chain-ops/foundry/testdata/forge-artifacts/ERC20.sol/ERC20.0.8.15.json @@ -0,0 +1 @@ +{"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}],"bytecode":{"object":"0x","sourceMap":"","linkReferences":{}},"deployedBytecode":{"object":"0x","sourceMap":"","linkReferences":{}},"methodIdentifiers":{"DOMAIN_SEPARATOR()":"3644e515","allowance(address,address)":"dd62ed3e","approve(address,uint256)":"095ea7b3","balanceOf(address)":"70a08231","decimals()":"313ce567","name()":"06fdde03","nonces(address)":"7ecebe00","permit(address,address,uint256,uint256,uint8,bytes32,bytes32)":"d505accf","symbol()":"95d89b41","totalSupply()":"18160ddd","transfer(address,uint256)":"a9059cbb","transferFrom(address,address,uint256)":"23b872dd"},"rawMetadata":"{\"compiler\":{\"version\":\"0.8.15+commit.e14f2714\"},\"language\":\"Solidity\",\"output\":{\"abi\":[{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"address\",\"name\":\"owner\",\"type\":\"address\"},{\"indexed\":true,\"internalType\":\"address\",\"name\":\"spender\",\"type\":\"address\"},{\"indexed\":false,\"internalType\":\"uint256\",\"name\":\"amount\",\"type\":\"uint256\"}],\"name\":\"Approval\",\"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\"}],\"name\":\"Transfer\",\"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\"}],\"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\":\"\",\"type\":\"address\"}],\"name\":\"balanceOf\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"\",\"type\":\"uint256\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"decimals\",\"outputs\":[{\"internalType\":\"uint8\",\"name\":\"\",\"type\":\"uint8\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"name\",\"outputs\":[{\"internalType\":\"string\",\"name\":\"\",\"type\":\"string\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"\",\"type\":\"address\"}],\"name\":\"nonces\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"\",\"type\":\"uint256\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"owner\",\"type\":\"address\"},{\"internalType\":\"address\",\"name\":\"spender\",\"type\":\"address\"},{\"internalType\":\"uint256\",\"name\":\"value\",\"type\":\"uint256\"},{\"internalType\":\"uint256\",\"name\":\"deadline\",\"type\":\"uint256\"},{\"internalType\":\"uint8\",\"name\":\"v\",\"type\":\"uint8\"},{\"internalType\":\"bytes32\",\"name\":\"r\",\"type\":\"bytes32\"},{\"internalType\":\"bytes32\",\"name\":\"s\",\"type\":\"bytes32\"}],\"name\":\"permit\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"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\"}],\"devdoc\":{\"author\":\"Solmate (https://github.com/Rari-Capital/solmate/blob/main/src/tokens/ERC20.sol)Modified from Uniswap (https://github.com/Uniswap/uniswap-v2-core/blob/master/contracts/UniswapV2ERC20.sol)\",\"details\":\"Do not manually set balances without updating totalSupply, as the sum of all user balances must not exceed it.\",\"kind\":\"dev\",\"methods\":{},\"version\":1},\"userdoc\":{\"kind\":\"user\",\"methods\":{},\"notice\":\"Modern and gas efficient ERC20 + EIP-2612 implementation.\",\"version\":1}},\"settings\":{\"compilationTarget\":{\"lib/solmate/src/tokens/ERC20.sol\":\"ERC20\"},\"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/\",\":automate/=lib/automate/contracts/\",\":ds-test/=lib/forge-std/lib/ds-test/src/\",\":erc4626-tests/=lib/automate/lib/openzeppelin-contracts/lib/erc4626-tests/\",\":forge-std/=lib/forge-std/src/\",\":gelato/=lib/automate/contracts/\",\":hardhat/=lib/automate/node_modules/hardhat/\",\":kontrol-cheatcodes/=lib/kontrol-cheatcodes/src/\",\":lib-keccak/=lib/lib-keccak/contracts/\",\":openzeppelin-contracts-upgradeable/=lib/openzeppelin-contracts-upgradeable/\",\":openzeppelin-contracts/=lib/openzeppelin-contracts/\",\":prb-test/=lib/automate/lib/prb-test/src/\",\":prb/-est/=lib/automate/lib/prb-test/src/\",\":safe-contracts/=lib/safe-contracts/contracts/\",\":solady/=lib/solady/\",\":solmate/=lib/solmate/src/\"]},\"sources\":{\"lib/solmate/src/tokens/ERC20.sol\":{\"keccak256\":\"0x43aa1509bb753f053143530705d9c4eee415691d26a4779769bf028a74e6ac69\",\"license\":\"MIT\",\"urls\":[\"bzz-raw://fb440672ebad7d487c1600e406e140fd1ffc4bd7520c86b5709183ca2602da58\",\"dweb:/ipfs/QmNgZaBoAZwnwm4mTL1cUZnMtvt1iZnruMnfpJnDu6upuc\"]}},\"version\":1}","metadata":{"compiler":{"version":"0.8.15+commit.e14f2714"},"language":"Solidity","output":{"abi":[{"inputs":[{"internalType":"address","name":"owner","type":"address","indexed":true},{"internalType":"address","name":"spender","type":"address","indexed":true},{"internalType":"uint256","name":"amount","type":"uint256","indexed":false}],"type":"event","name":"Approval","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}],"type":"event","name":"Transfer","anonymous":false},{"inputs":[],"stateMutability":"view","type":"function","name":"DOMAIN_SEPARATOR","outputs":[{"internalType":"bytes32","name":"","type":"bytes32"}]},{"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":"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":"","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":"view","type":"function","name":"name","outputs":[{"internalType":"string","name":"","type":"string"}]},{"inputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function","name":"nonces","outputs":[{"internalType":"uint256","name":"","type":"uint256"}]},{"inputs":[{"internalType":"address","name":"owner","type":"address"},{"internalType":"address","name":"spender","type":"address"},{"internalType":"uint256","name":"value","type":"uint256"},{"internalType":"uint256","name":"deadline","type":"uint256"},{"internalType":"uint8","name":"v","type":"uint8"},{"internalType":"bytes32","name":"r","type":"bytes32"},{"internalType":"bytes32","name":"s","type":"bytes32"}],"stateMutability":"nonpayable","type":"function","name":"permit"},{"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"}]}],"devdoc":{"kind":"dev","methods":{},"version":1},"userdoc":{"kind":"user","methods":{},"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/","automate/=lib/automate/contracts/","ds-test/=lib/forge-std/lib/ds-test/src/","erc4626-tests/=lib/automate/lib/openzeppelin-contracts/lib/erc4626-tests/","forge-std/=lib/forge-std/src/","gelato/=lib/automate/contracts/","hardhat/=lib/automate/node_modules/hardhat/","kontrol-cheatcodes/=lib/kontrol-cheatcodes/src/","lib-keccak/=lib/lib-keccak/contracts/","openzeppelin-contracts-upgradeable/=lib/openzeppelin-contracts-upgradeable/","openzeppelin-contracts/=lib/openzeppelin-contracts/","prb-test/=lib/automate/lib/prb-test/src/","prb/-est/=lib/automate/lib/prb-test/src/","safe-contracts/=lib/safe-contracts/contracts/","solady/=lib/solady/","solmate/=lib/solmate/src/"],"optimizer":{"enabled":true,"runs":999999},"metadata":{"bytecodeHash":"none"},"compilationTarget":{"lib/solmate/src/tokens/ERC20.sol":"ERC20"},"evmVersion":"london","libraries":{}},"sources":{"lib/solmate/src/tokens/ERC20.sol":{"keccak256":"0x43aa1509bb753f053143530705d9c4eee415691d26a4779769bf028a74e6ac69","urls":["bzz-raw://fb440672ebad7d487c1600e406e140fd1ffc4bd7520c86b5709183ca2602da58","dweb:/ipfs/QmNgZaBoAZwnwm4mTL1cUZnMtvt1iZnruMnfpJnDu6upuc"],"license":"MIT"}},"version":1},"storageLayout":{"storage":[{"astId":64822,"contract":"lib/solmate/src/tokens/ERC20.sol:ERC20","label":"name","offset":0,"slot":"0","type":"t_string_storage"},{"astId":64824,"contract":"lib/solmate/src/tokens/ERC20.sol:ERC20","label":"symbol","offset":0,"slot":"1","type":"t_string_storage"},{"astId":64828,"contract":"lib/solmate/src/tokens/ERC20.sol:ERC20","label":"totalSupply","offset":0,"slot":"2","type":"t_uint256"},{"astId":64832,"contract":"lib/solmate/src/tokens/ERC20.sol:ERC20","label":"balanceOf","offset":0,"slot":"3","type":"t_mapping(t_address,t_uint256)"},{"astId":64838,"contract":"lib/solmate/src/tokens/ERC20.sol:ERC20","label":"allowance","offset":0,"slot":"4","type":"t_mapping(t_address,t_mapping(t_address,t_uint256))"},{"astId":64846,"contract":"lib/solmate/src/tokens/ERC20.sol:ERC20","label":"nonces","offset":0,"slot":"5","type":"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"}}},"userdoc":{"version":1,"kind":"user","notice":"Modern and gas efficient ERC20 + EIP-2612 implementation."},"devdoc":{"version":1,"kind":"dev","author":"Solmate (https://github.com/Rari-Capital/solmate/blob/main/src/tokens/ERC20.sol)Modified from Uniswap (https://github.com/Uniswap/uniswap-v2-core/blob/master/contracts/UniswapV2ERC20.sol)","details":"Do not manually set balances without updating totalSupply, as the sum of all user balances must not exceed it."},"ast":{"absolutePath":"lib/solmate/src/tokens/ERC20.sol","id":65190,"exportedSymbols":{"ERC20":[65189]},"nodeType":"SourceUnit","src":"32:6767:110","nodes":[{"id":64803,"nodeType":"PragmaDirective","src":"32:24:110","nodes":[],"literals":["solidity",">=","0.8",".0"]},{"id":65189,"nodeType":"ContractDefinition","src":"461:6337:110","nodes":[{"id":64812,"nodeType":"EventDefinition","src":"670:73:110","nodes":[],"anonymous":false,"eventSelector":"ddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef","name":"Transfer","nameLocation":"676:8:110","parameters":{"id":64811,"nodeType":"ParameterList","parameters":[{"constant":false,"id":64806,"indexed":true,"mutability":"mutable","name":"from","nameLocation":"701:4:110","nodeType":"VariableDeclaration","scope":64812,"src":"685:20:110","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"},"typeName":{"id":64805,"name":"address","nodeType":"ElementaryTypeName","src":"685:7:110","stateMutability":"nonpayable","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"}},"visibility":"internal"},{"constant":false,"id":64808,"indexed":true,"mutability":"mutable","name":"to","nameLocation":"723:2:110","nodeType":"VariableDeclaration","scope":64812,"src":"707:18:110","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"},"typeName":{"id":64807,"name":"address","nodeType":"ElementaryTypeName","src":"707:7:110","stateMutability":"nonpayable","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"}},"visibility":"internal"},{"constant":false,"id":64810,"indexed":false,"mutability":"mutable","name":"amount","nameLocation":"735:6:110","nodeType":"VariableDeclaration","scope":64812,"src":"727:14:110","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"},"typeName":{"id":64809,"name":"uint256","nodeType":"ElementaryTypeName","src":"727:7:110","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"visibility":"internal"}],"src":"684:58:110"}},{"id":64820,"nodeType":"EventDefinition","src":"749:79:110","nodes":[],"anonymous":false,"eventSelector":"8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b925","name":"Approval","nameLocation":"755:8:110","parameters":{"id":64819,"nodeType":"ParameterList","parameters":[{"constant":false,"id":64814,"indexed":true,"mutability":"mutable","name":"owner","nameLocation":"780:5:110","nodeType":"VariableDeclaration","scope":64820,"src":"764:21:110","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"},"typeName":{"id":64813,"name":"address","nodeType":"ElementaryTypeName","src":"764:7:110","stateMutability":"nonpayable","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"}},"visibility":"internal"},{"constant":false,"id":64816,"indexed":true,"mutability":"mutable","name":"spender","nameLocation":"803:7:110","nodeType":"VariableDeclaration","scope":64820,"src":"787:23:110","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"},"typeName":{"id":64815,"name":"address","nodeType":"ElementaryTypeName","src":"787:7:110","stateMutability":"nonpayable","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"}},"visibility":"internal"},{"constant":false,"id":64818,"indexed":false,"mutability":"mutable","name":"amount","nameLocation":"820:6:110","nodeType":"VariableDeclaration","scope":64820,"src":"812:14:110","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"},"typeName":{"id":64817,"name":"uint256","nodeType":"ElementaryTypeName","src":"812:7:110","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"visibility":"internal"}],"src":"763:64:110"}},{"id":64822,"nodeType":"VariableDeclaration","src":"1018:18:110","nodes":[],"constant":false,"functionSelector":"06fdde03","mutability":"mutable","name":"name","nameLocation":"1032:4:110","scope":65189,"stateVariable":true,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_string_storage","typeString":"string"},"typeName":{"id":64821,"name":"string","nodeType":"ElementaryTypeName","src":"1018:6:110","typeDescriptions":{"typeIdentifier":"t_string_storage_ptr","typeString":"string"}},"visibility":"public"},{"id":64824,"nodeType":"VariableDeclaration","src":"1043:20:110","nodes":[],"constant":false,"functionSelector":"95d89b41","mutability":"mutable","name":"symbol","nameLocation":"1057:6:110","scope":65189,"stateVariable":true,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_string_storage","typeString":"string"},"typeName":{"id":64823,"name":"string","nodeType":"ElementaryTypeName","src":"1043:6:110","typeDescriptions":{"typeIdentifier":"t_string_storage_ptr","typeString":"string"}},"visibility":"public"},{"id":64826,"nodeType":"VariableDeclaration","src":"1070:31:110","nodes":[],"constant":false,"functionSelector":"313ce567","mutability":"immutable","name":"decimals","nameLocation":"1093:8:110","scope":65189,"stateVariable":true,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_uint8","typeString":"uint8"},"typeName":{"id":64825,"name":"uint8","nodeType":"ElementaryTypeName","src":"1070:5:110","typeDescriptions":{"typeIdentifier":"t_uint8","typeString":"uint8"}},"visibility":"public"},{"id":64828,"nodeType":"VariableDeclaration","src":"1291:26:110","nodes":[],"constant":false,"functionSelector":"18160ddd","mutability":"mutable","name":"totalSupply","nameLocation":"1306:11:110","scope":65189,"stateVariable":true,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"},"typeName":{"id":64827,"name":"uint256","nodeType":"ElementaryTypeName","src":"1291:7:110","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"visibility":"public"},{"id":64832,"nodeType":"VariableDeclaration","src":"1324:44:110","nodes":[],"constant":false,"functionSelector":"70a08231","mutability":"mutable","name":"balanceOf","nameLocation":"1359:9:110","scope":65189,"stateVariable":true,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_mapping$_t_address_$_t_uint256_$","typeString":"mapping(address => uint256)"},"typeName":{"id":64831,"keyType":{"id":64829,"name":"address","nodeType":"ElementaryTypeName","src":"1332:7:110","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"}},"nodeType":"Mapping","src":"1324:27:110","typeDescriptions":{"typeIdentifier":"t_mapping$_t_address_$_t_uint256_$","typeString":"mapping(address => uint256)"},"valueType":{"id":64830,"name":"uint256","nodeType":"ElementaryTypeName","src":"1343:7:110","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}}},"visibility":"public"},{"id":64838,"nodeType":"VariableDeclaration","src":"1375:64:110","nodes":[],"constant":false,"functionSelector":"dd62ed3e","mutability":"mutable","name":"allowance","nameLocation":"1430:9:110","scope":65189,"stateVariable":true,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_mapping$_t_address_$_t_mapping$_t_address_$_t_uint256_$_$","typeString":"mapping(address => mapping(address => uint256))"},"typeName":{"id":64837,"keyType":{"id":64833,"name":"address","nodeType":"ElementaryTypeName","src":"1383:7:110","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"}},"nodeType":"Mapping","src":"1375:47:110","typeDescriptions":{"typeIdentifier":"t_mapping$_t_address_$_t_mapping$_t_address_$_t_uint256_$_$","typeString":"mapping(address => mapping(address => uint256))"},"valueType":{"id":64836,"keyType":{"id":64834,"name":"address","nodeType":"ElementaryTypeName","src":"1402:7:110","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"}},"nodeType":"Mapping","src":"1394:27:110","typeDescriptions":{"typeIdentifier":"t_mapping$_t_address_$_t_uint256_$","typeString":"mapping(address => uint256)"},"valueType":{"id":64835,"name":"uint256","nodeType":"ElementaryTypeName","src":"1413:7:110","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}}}},"visibility":"public"},{"id":64840,"nodeType":"VariableDeclaration","src":"1630:43:110","nodes":[],"constant":false,"mutability":"immutable","name":"INITIAL_CHAIN_ID","nameLocation":"1657:16:110","scope":65189,"stateVariable":true,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"},"typeName":{"id":64839,"name":"uint256","nodeType":"ElementaryTypeName","src":"1630:7:110","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"visibility":"internal"},{"id":64842,"nodeType":"VariableDeclaration","src":"1680:51:110","nodes":[],"constant":false,"mutability":"immutable","name":"INITIAL_DOMAIN_SEPARATOR","nameLocation":"1707:24:110","scope":65189,"stateVariable":true,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_bytes32","typeString":"bytes32"},"typeName":{"id":64841,"name":"bytes32","nodeType":"ElementaryTypeName","src":"1680:7:110","typeDescriptions":{"typeIdentifier":"t_bytes32","typeString":"bytes32"}},"visibility":"internal"},{"id":64846,"nodeType":"VariableDeclaration","src":"1738:41:110","nodes":[],"constant":false,"functionSelector":"7ecebe00","mutability":"mutable","name":"nonces","nameLocation":"1773:6:110","scope":65189,"stateVariable":true,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_mapping$_t_address_$_t_uint256_$","typeString":"mapping(address => uint256)"},"typeName":{"id":64845,"keyType":{"id":64843,"name":"address","nodeType":"ElementaryTypeName","src":"1746:7:110","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"}},"nodeType":"Mapping","src":"1738:27:110","typeDescriptions":{"typeIdentifier":"t_mapping$_t_address_$_t_uint256_$","typeString":"mapping(address => uint256)"},"valueType":{"id":64844,"name":"uint256","nodeType":"ElementaryTypeName","src":"1757:7:110","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}}},"visibility":"public"},{"id":64878,"nodeType":"FunctionDefinition","src":"1968:292:110","nodes":[],"body":{"id":64877,"nodeType":"Block","src":"2071:189:110","nodes":[],"statements":[{"expression":{"id":64857,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"leftHandSide":{"id":64855,"name":"name","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":64822,"src":"2081:4:110","typeDescriptions":{"typeIdentifier":"t_string_storage","typeString":"string storage ref"}},"nodeType":"Assignment","operator":"=","rightHandSide":{"id":64856,"name":"_name","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":64848,"src":"2088:5:110","typeDescriptions":{"typeIdentifier":"t_string_memory_ptr","typeString":"string memory"}},"src":"2081:12:110","typeDescriptions":{"typeIdentifier":"t_string_storage","typeString":"string storage ref"}},"id":64858,"nodeType":"ExpressionStatement","src":"2081:12:110"},{"expression":{"id":64861,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"leftHandSide":{"id":64859,"name":"symbol","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":64824,"src":"2103:6:110","typeDescriptions":{"typeIdentifier":"t_string_storage","typeString":"string storage ref"}},"nodeType":"Assignment","operator":"=","rightHandSide":{"id":64860,"name":"_symbol","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":64850,"src":"2112:7:110","typeDescriptions":{"typeIdentifier":"t_string_memory_ptr","typeString":"string memory"}},"src":"2103:16:110","typeDescriptions":{"typeIdentifier":"t_string_storage","typeString":"string storage ref"}},"id":64862,"nodeType":"ExpressionStatement","src":"2103:16:110"},{"expression":{"id":64865,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"leftHandSide":{"id":64863,"name":"decimals","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":64826,"src":"2129:8:110","typeDescriptions":{"typeIdentifier":"t_uint8","typeString":"uint8"}},"nodeType":"Assignment","operator":"=","rightHandSide":{"id":64864,"name":"_decimals","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":64852,"src":"2140:9:110","typeDescriptions":{"typeIdentifier":"t_uint8","typeString":"uint8"}},"src":"2129:20:110","typeDescriptions":{"typeIdentifier":"t_uint8","typeString":"uint8"}},"id":64866,"nodeType":"ExpressionStatement","src":"2129:20:110"},{"expression":{"id":64870,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"leftHandSide":{"id":64867,"name":"INITIAL_CHAIN_ID","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":64840,"src":"2160:16:110","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"nodeType":"Assignment","operator":"=","rightHandSide":{"expression":{"id":64868,"name":"block","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":-4,"src":"2179:5:110","typeDescriptions":{"typeIdentifier":"t_magic_block","typeString":"block"}},"id":64869,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"memberName":"chainid","nodeType":"MemberAccess","src":"2179:13:110","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"src":"2160:32:110","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"id":64871,"nodeType":"ExpressionStatement","src":"2160:32:110"},{"expression":{"id":64875,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"leftHandSide":{"id":64872,"name":"INITIAL_DOMAIN_SEPARATOR","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":64842,"src":"2202:24:110","typeDescriptions":{"typeIdentifier":"t_bytes32","typeString":"bytes32"}},"nodeType":"Assignment","operator":"=","rightHandSide":{"arguments":[],"expression":{"argumentTypes":[],"id":64873,"name":"computeDomainSeparator","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":65132,"src":"2229:22:110","typeDescriptions":{"typeIdentifier":"t_function_internal_view$__$returns$_t_bytes32_$","typeString":"function () view returns (bytes32)"}},"id":64874,"isConstant":false,"isLValue":false,"isPure":false,"kind":"functionCall","lValueRequested":false,"names":[],"nodeType":"FunctionCall","src":"2229:24:110","tryCall":false,"typeDescriptions":{"typeIdentifier":"t_bytes32","typeString":"bytes32"}},"src":"2202:51:110","typeDescriptions":{"typeIdentifier":"t_bytes32","typeString":"bytes32"}},"id":64876,"nodeType":"ExpressionStatement","src":"2202:51:110"}]},"implemented":true,"kind":"constructor","modifiers":[],"name":"","nameLocation":"-1:-1:-1","parameters":{"id":64853,"nodeType":"ParameterList","parameters":[{"constant":false,"id":64848,"mutability":"mutable","name":"_name","nameLocation":"2003:5:110","nodeType":"VariableDeclaration","scope":64878,"src":"1989:19:110","stateVariable":false,"storageLocation":"memory","typeDescriptions":{"typeIdentifier":"t_string_memory_ptr","typeString":"string"},"typeName":{"id":64847,"name":"string","nodeType":"ElementaryTypeName","src":"1989:6:110","typeDescriptions":{"typeIdentifier":"t_string_storage_ptr","typeString":"string"}},"visibility":"internal"},{"constant":false,"id":64850,"mutability":"mutable","name":"_symbol","nameLocation":"2032:7:110","nodeType":"VariableDeclaration","scope":64878,"src":"2018:21:110","stateVariable":false,"storageLocation":"memory","typeDescriptions":{"typeIdentifier":"t_string_memory_ptr","typeString":"string"},"typeName":{"id":64849,"name":"string","nodeType":"ElementaryTypeName","src":"2018:6:110","typeDescriptions":{"typeIdentifier":"t_string_storage_ptr","typeString":"string"}},"visibility":"internal"},{"constant":false,"id":64852,"mutability":"mutable","name":"_decimals","nameLocation":"2055:9:110","nodeType":"VariableDeclaration","scope":64878,"src":"2049:15:110","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_uint8","typeString":"uint8"},"typeName":{"id":64851,"name":"uint8","nodeType":"ElementaryTypeName","src":"2049:5:110","typeDescriptions":{"typeIdentifier":"t_uint8","typeString":"uint8"}},"visibility":"internal"}],"src":"1979:91:110"},"returnParameters":{"id":64854,"nodeType":"ParameterList","parameters":[],"src":"2071:0:110"},"scope":65189,"stateMutability":"nonpayable","virtual":false,"visibility":"internal"},{"id":64906,"nodeType":"FunctionDefinition","src":"2448:211:110","nodes":[],"body":{"id":64905,"nodeType":"Block","src":"2528:131:110","nodes":[],"statements":[{"expression":{"id":64894,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"leftHandSide":{"baseExpression":{"baseExpression":{"id":64887,"name":"allowance","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":64838,"src":"2538:9:110","typeDescriptions":{"typeIdentifier":"t_mapping$_t_address_$_t_mapping$_t_address_$_t_uint256_$_$","typeString":"mapping(address => mapping(address => uint256))"}},"id":64891,"indexExpression":{"expression":{"id":64888,"name":"msg","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":-15,"src":"2548:3:110","typeDescriptions":{"typeIdentifier":"t_magic_message","typeString":"msg"}},"id":64889,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"memberName":"sender","nodeType":"MemberAccess","src":"2548:10:110","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"}},"isConstant":false,"isLValue":true,"isPure":false,"lValueRequested":false,"nodeType":"IndexAccess","src":"2538:21:110","typeDescriptions":{"typeIdentifier":"t_mapping$_t_address_$_t_uint256_$","typeString":"mapping(address => uint256)"}},"id":64892,"indexExpression":{"id":64890,"name":"spender","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":64880,"src":"2560:7:110","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"}},"isConstant":false,"isLValue":true,"isPure":false,"lValueRequested":true,"nodeType":"IndexAccess","src":"2538:30:110","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"nodeType":"Assignment","operator":"=","rightHandSide":{"id":64893,"name":"amount","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":64882,"src":"2571:6:110","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"src":"2538:39:110","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"id":64895,"nodeType":"ExpressionStatement","src":"2538:39:110"},{"eventCall":{"arguments":[{"expression":{"id":64897,"name":"msg","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":-15,"src":"2602:3:110","typeDescriptions":{"typeIdentifier":"t_magic_message","typeString":"msg"}},"id":64898,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"memberName":"sender","nodeType":"MemberAccess","src":"2602:10:110","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"}},{"id":64899,"name":"spender","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":64880,"src":"2614:7:110","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"}},{"id":64900,"name":"amount","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":64882,"src":"2623:6:110","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}}],"expression":{"argumentTypes":[{"typeIdentifier":"t_address","typeString":"address"},{"typeIdentifier":"t_address","typeString":"address"},{"typeIdentifier":"t_uint256","typeString":"uint256"}],"id":64896,"name":"Approval","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":64820,"src":"2593:8:110","typeDescriptions":{"typeIdentifier":"t_function_event_nonpayable$_t_address_$_t_address_$_t_uint256_$returns$__$","typeString":"function (address,address,uint256)"}},"id":64901,"isConstant":false,"isLValue":false,"isPure":false,"kind":"functionCall","lValueRequested":false,"names":[],"nodeType":"FunctionCall","src":"2593:37:110","tryCall":false,"typeDescriptions":{"typeIdentifier":"t_tuple$__$","typeString":"tuple()"}},"id":64902,"nodeType":"EmitStatement","src":"2588:42:110"},{"expression":{"hexValue":"74727565","id":64903,"isConstant":false,"isLValue":false,"isPure":true,"kind":"bool","lValueRequested":false,"nodeType":"Literal","src":"2648:4:110","typeDescriptions":{"typeIdentifier":"t_bool","typeString":"bool"},"value":"true"},"functionReturnParameters":64886,"id":64904,"nodeType":"Return","src":"2641:11:110"}]},"functionSelector":"095ea7b3","implemented":true,"kind":"function","modifiers":[],"name":"approve","nameLocation":"2457:7:110","parameters":{"id":64883,"nodeType":"ParameterList","parameters":[{"constant":false,"id":64880,"mutability":"mutable","name":"spender","nameLocation":"2473:7:110","nodeType":"VariableDeclaration","scope":64906,"src":"2465:15:110","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"},"typeName":{"id":64879,"name":"address","nodeType":"ElementaryTypeName","src":"2465:7:110","stateMutability":"nonpayable","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"}},"visibility":"internal"},{"constant":false,"id":64882,"mutability":"mutable","name":"amount","nameLocation":"2490:6:110","nodeType":"VariableDeclaration","scope":64906,"src":"2482:14:110","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"},"typeName":{"id":64881,"name":"uint256","nodeType":"ElementaryTypeName","src":"2482:7:110","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"visibility":"internal"}],"src":"2464:33:110"},"returnParameters":{"id":64886,"nodeType":"ParameterList","parameters":[{"constant":false,"id":64885,"mutability":"mutable","name":"","nameLocation":"-1:-1:-1","nodeType":"VariableDeclaration","scope":64906,"src":"2522:4:110","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_bool","typeString":"bool"},"typeName":{"id":64884,"name":"bool","nodeType":"ElementaryTypeName","src":"2522:4:110","typeDescriptions":{"typeIdentifier":"t_bool","typeString":"bool"}},"visibility":"internal"}],"src":"2521:6:110"},"scope":65189,"stateMutability":"nonpayable","virtual":true,"visibility":"public"},{"id":64939,"nodeType":"FunctionDefinition","src":"2665:373:110","nodes":[],"body":{"id":64938,"nodeType":"Block","src":"2741:297:110","nodes":[],"statements":[{"expression":{"id":64920,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"leftHandSide":{"baseExpression":{"id":64915,"name":"balanceOf","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":64832,"src":"2751:9:110","typeDescriptions":{"typeIdentifier":"t_mapping$_t_address_$_t_uint256_$","typeString":"mapping(address => uint256)"}},"id":64918,"indexExpression":{"expression":{"id":64916,"name":"msg","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":-15,"src":"2761:3:110","typeDescriptions":{"typeIdentifier":"t_magic_message","typeString":"msg"}},"id":64917,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"memberName":"sender","nodeType":"MemberAccess","src":"2761:10:110","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"}},"isConstant":false,"isLValue":true,"isPure":false,"lValueRequested":true,"nodeType":"IndexAccess","src":"2751:21:110","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"nodeType":"Assignment","operator":"-=","rightHandSide":{"id":64919,"name":"amount","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":64910,"src":"2776:6:110","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"src":"2751:31:110","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"id":64921,"nodeType":"ExpressionStatement","src":"2751:31:110"},{"id":64928,"nodeType":"UncheckedBlock","src":"2904:58:110","statements":[{"expression":{"id":64926,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"leftHandSide":{"baseExpression":{"id":64922,"name":"balanceOf","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":64832,"src":"2928:9:110","typeDescriptions":{"typeIdentifier":"t_mapping$_t_address_$_t_uint256_$","typeString":"mapping(address => uint256)"}},"id":64924,"indexExpression":{"id":64923,"name":"to","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":64908,"src":"2938:2:110","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"}},"isConstant":false,"isLValue":true,"isPure":false,"lValueRequested":true,"nodeType":"IndexAccess","src":"2928:13:110","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"nodeType":"Assignment","operator":"+=","rightHandSide":{"id":64925,"name":"amount","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":64910,"src":"2945:6:110","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"src":"2928:23:110","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"id":64927,"nodeType":"ExpressionStatement","src":"2928:23:110"}]},{"eventCall":{"arguments":[{"expression":{"id":64930,"name":"msg","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":-15,"src":"2986:3:110","typeDescriptions":{"typeIdentifier":"t_magic_message","typeString":"msg"}},"id":64931,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"memberName":"sender","nodeType":"MemberAccess","src":"2986:10:110","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"}},{"id":64932,"name":"to","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":64908,"src":"2998:2:110","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"}},{"id":64933,"name":"amount","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":64910,"src":"3002:6:110","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}}],"expression":{"argumentTypes":[{"typeIdentifier":"t_address","typeString":"address"},{"typeIdentifier":"t_address","typeString":"address"},{"typeIdentifier":"t_uint256","typeString":"uint256"}],"id":64929,"name":"Transfer","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":64812,"src":"2977:8:110","typeDescriptions":{"typeIdentifier":"t_function_event_nonpayable$_t_address_$_t_address_$_t_uint256_$returns$__$","typeString":"function (address,address,uint256)"}},"id":64934,"isConstant":false,"isLValue":false,"isPure":false,"kind":"functionCall","lValueRequested":false,"names":[],"nodeType":"FunctionCall","src":"2977:32:110","tryCall":false,"typeDescriptions":{"typeIdentifier":"t_tuple$__$","typeString":"tuple()"}},"id":64935,"nodeType":"EmitStatement","src":"2972:37:110"},{"expression":{"hexValue":"74727565","id":64936,"isConstant":false,"isLValue":false,"isPure":true,"kind":"bool","lValueRequested":false,"nodeType":"Literal","src":"3027:4:110","typeDescriptions":{"typeIdentifier":"t_bool","typeString":"bool"},"value":"true"},"functionReturnParameters":64914,"id":64937,"nodeType":"Return","src":"3020:11:110"}]},"functionSelector":"a9059cbb","implemented":true,"kind":"function","modifiers":[],"name":"transfer","nameLocation":"2674:8:110","parameters":{"id":64911,"nodeType":"ParameterList","parameters":[{"constant":false,"id":64908,"mutability":"mutable","name":"to","nameLocation":"2691:2:110","nodeType":"VariableDeclaration","scope":64939,"src":"2683:10:110","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"},"typeName":{"id":64907,"name":"address","nodeType":"ElementaryTypeName","src":"2683:7:110","stateMutability":"nonpayable","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"}},"visibility":"internal"},{"constant":false,"id":64910,"mutability":"mutable","name":"amount","nameLocation":"2703:6:110","nodeType":"VariableDeclaration","scope":64939,"src":"2695:14:110","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"},"typeName":{"id":64909,"name":"uint256","nodeType":"ElementaryTypeName","src":"2695:7:110","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"visibility":"internal"}],"src":"2682:28:110"},"returnParameters":{"id":64914,"nodeType":"ParameterList","parameters":[{"constant":false,"id":64913,"mutability":"mutable","name":"","nameLocation":"-1:-1:-1","nodeType":"VariableDeclaration","scope":64939,"src":"2735:4:110","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_bool","typeString":"bool"},"typeName":{"id":64912,"name":"bool","nodeType":"ElementaryTypeName","src":"2735:4:110","typeDescriptions":{"typeIdentifier":"t_bool","typeString":"bool"}},"visibility":"internal"}],"src":"2734:6:110"},"scope":65189,"stateMutability":"nonpayable","virtual":true,"visibility":"public"},{"id":65000,"nodeType":"FunctionDefinition","src":"3044:592:110","nodes":[],"body":{"id":64999,"nodeType":"Block","src":"3168:468:110","nodes":[],"statements":[{"assignments":[64951],"declarations":[{"constant":false,"id":64951,"mutability":"mutable","name":"allowed","nameLocation":"3186:7:110","nodeType":"VariableDeclaration","scope":64999,"src":"3178:15:110","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"},"typeName":{"id":64950,"name":"uint256","nodeType":"ElementaryTypeName","src":"3178:7:110","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"visibility":"internal"}],"id":64958,"initialValue":{"baseExpression":{"baseExpression":{"id":64952,"name":"allowance","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":64838,"src":"3196:9:110","typeDescriptions":{"typeIdentifier":"t_mapping$_t_address_$_t_mapping$_t_address_$_t_uint256_$_$","typeString":"mapping(address => mapping(address => uint256))"}},"id":64954,"indexExpression":{"id":64953,"name":"from","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":64941,"src":"3206:4:110","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"}},"isConstant":false,"isLValue":true,"isPure":false,"lValueRequested":false,"nodeType":"IndexAccess","src":"3196:15:110","typeDescriptions":{"typeIdentifier":"t_mapping$_t_address_$_t_uint256_$","typeString":"mapping(address => uint256)"}},"id":64957,"indexExpression":{"expression":{"id":64955,"name":"msg","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":-15,"src":"3212:3:110","typeDescriptions":{"typeIdentifier":"t_magic_message","typeString":"msg"}},"id":64956,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"memberName":"sender","nodeType":"MemberAccess","src":"3212:10:110","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"}},"isConstant":false,"isLValue":true,"isPure":false,"lValueRequested":false,"nodeType":"IndexAccess","src":"3196:27:110","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"nodeType":"VariableDeclarationStatement","src":"3178:45:110"},{"condition":{"commonType":{"typeIdentifier":"t_uint256","typeString":"uint256"},"id":64965,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"leftExpression":{"id":64959,"name":"allowed","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":64951,"src":"3274:7:110","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"nodeType":"BinaryOperation","operator":"!=","rightExpression":{"expression":{"arguments":[{"id":64962,"isConstant":false,"isLValue":false,"isPure":true,"lValueRequested":false,"nodeType":"ElementaryTypeNameExpression","src":"3290:7:110","typeDescriptions":{"typeIdentifier":"t_type$_t_uint256_$","typeString":"type(uint256)"},"typeName":{"id":64961,"name":"uint256","nodeType":"ElementaryTypeName","src":"3290:7:110","typeDescriptions":{}}}],"expression":{"argumentTypes":[{"typeIdentifier":"t_type$_t_uint256_$","typeString":"type(uint256)"}],"id":64960,"name":"type","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":-27,"src":"3285:4:110","typeDescriptions":{"typeIdentifier":"t_function_metatype_pure$__$returns$__$","typeString":"function () pure"}},"id":64963,"isConstant":false,"isLValue":false,"isPure":true,"kind":"functionCall","lValueRequested":false,"names":[],"nodeType":"FunctionCall","src":"3285:13:110","tryCall":false,"typeDescriptions":{"typeIdentifier":"t_magic_meta_type_t_uint256","typeString":"type(uint256)"}},"id":64964,"isConstant":false,"isLValue":false,"isPure":true,"lValueRequested":false,"memberName":"max","nodeType":"MemberAccess","src":"3285:17:110","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"src":"3274:28:110","typeDescriptions":{"typeIdentifier":"t_bool","typeString":"bool"}},"id":64977,"nodeType":"IfStatement","src":"3270:80:110","trueBody":{"expression":{"id":64975,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"leftHandSide":{"baseExpression":{"baseExpression":{"id":64966,"name":"allowance","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":64838,"src":"3304:9:110","typeDescriptions":{"typeIdentifier":"t_mapping$_t_address_$_t_mapping$_t_address_$_t_uint256_$_$","typeString":"mapping(address => mapping(address => uint256))"}},"id":64970,"indexExpression":{"id":64967,"name":"from","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":64941,"src":"3314:4:110","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"}},"isConstant":false,"isLValue":true,"isPure":false,"lValueRequested":false,"nodeType":"IndexAccess","src":"3304:15:110","typeDescriptions":{"typeIdentifier":"t_mapping$_t_address_$_t_uint256_$","typeString":"mapping(address => uint256)"}},"id":64971,"indexExpression":{"expression":{"id":64968,"name":"msg","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":-15,"src":"3320:3:110","typeDescriptions":{"typeIdentifier":"t_magic_message","typeString":"msg"}},"id":64969,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"memberName":"sender","nodeType":"MemberAccess","src":"3320:10:110","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"}},"isConstant":false,"isLValue":true,"isPure":false,"lValueRequested":true,"nodeType":"IndexAccess","src":"3304:27:110","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"nodeType":"Assignment","operator":"=","rightHandSide":{"commonType":{"typeIdentifier":"t_uint256","typeString":"uint256"},"id":64974,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"leftExpression":{"id":64972,"name":"allowed","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":64951,"src":"3334:7:110","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"nodeType":"BinaryOperation","operator":"-","rightExpression":{"id":64973,"name":"amount","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":64945,"src":"3344:6:110","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"src":"3334:16:110","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"src":"3304:46:110","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"id":64976,"nodeType":"ExpressionStatement","src":"3304:46:110"}},{"expression":{"id":64982,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"leftHandSide":{"baseExpression":{"id":64978,"name":"balanceOf","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":64832,"src":"3361:9:110","typeDescriptions":{"typeIdentifier":"t_mapping$_t_address_$_t_uint256_$","typeString":"mapping(address => uint256)"}},"id":64980,"indexExpression":{"id":64979,"name":"from","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":64941,"src":"3371:4:110","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"}},"isConstant":false,"isLValue":true,"isPure":false,"lValueRequested":true,"nodeType":"IndexAccess","src":"3361:15:110","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"nodeType":"Assignment","operator":"-=","rightHandSide":{"id":64981,"name":"amount","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":64945,"src":"3380:6:110","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"src":"3361:25:110","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"id":64983,"nodeType":"ExpressionStatement","src":"3361:25:110"},{"id":64990,"nodeType":"UncheckedBlock","src":"3508:58:110","statements":[{"expression":{"id":64988,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"leftHandSide":{"baseExpression":{"id":64984,"name":"balanceOf","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":64832,"src":"3532:9:110","typeDescriptions":{"typeIdentifier":"t_mapping$_t_address_$_t_uint256_$","typeString":"mapping(address => uint256)"}},"id":64986,"indexExpression":{"id":64985,"name":"to","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":64943,"src":"3542:2:110","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"}},"isConstant":false,"isLValue":true,"isPure":false,"lValueRequested":true,"nodeType":"IndexAccess","src":"3532:13:110","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"nodeType":"Assignment","operator":"+=","rightHandSide":{"id":64987,"name":"amount","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":64945,"src":"3549:6:110","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"src":"3532:23:110","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"id":64989,"nodeType":"ExpressionStatement","src":"3532:23:110"}]},{"eventCall":{"arguments":[{"id":64992,"name":"from","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":64941,"src":"3590:4:110","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"}},{"id":64993,"name":"to","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":64943,"src":"3596:2:110","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"}},{"id":64994,"name":"amount","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":64945,"src":"3600:6:110","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}}],"expression":{"argumentTypes":[{"typeIdentifier":"t_address","typeString":"address"},{"typeIdentifier":"t_address","typeString":"address"},{"typeIdentifier":"t_uint256","typeString":"uint256"}],"id":64991,"name":"Transfer","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":64812,"src":"3581:8:110","typeDescriptions":{"typeIdentifier":"t_function_event_nonpayable$_t_address_$_t_address_$_t_uint256_$returns$__$","typeString":"function (address,address,uint256)"}},"id":64995,"isConstant":false,"isLValue":false,"isPure":false,"kind":"functionCall","lValueRequested":false,"names":[],"nodeType":"FunctionCall","src":"3581:26:110","tryCall":false,"typeDescriptions":{"typeIdentifier":"t_tuple$__$","typeString":"tuple()"}},"id":64996,"nodeType":"EmitStatement","src":"3576:31:110"},{"expression":{"hexValue":"74727565","id":64997,"isConstant":false,"isLValue":false,"isPure":true,"kind":"bool","lValueRequested":false,"nodeType":"Literal","src":"3625:4:110","typeDescriptions":{"typeIdentifier":"t_bool","typeString":"bool"},"value":"true"},"functionReturnParameters":64949,"id":64998,"nodeType":"Return","src":"3618:11:110"}]},"functionSelector":"23b872dd","implemented":true,"kind":"function","modifiers":[],"name":"transferFrom","nameLocation":"3053:12:110","parameters":{"id":64946,"nodeType":"ParameterList","parameters":[{"constant":false,"id":64941,"mutability":"mutable","name":"from","nameLocation":"3083:4:110","nodeType":"VariableDeclaration","scope":65000,"src":"3075:12:110","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"},"typeName":{"id":64940,"name":"address","nodeType":"ElementaryTypeName","src":"3075:7:110","stateMutability":"nonpayable","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"}},"visibility":"internal"},{"constant":false,"id":64943,"mutability":"mutable","name":"to","nameLocation":"3105:2:110","nodeType":"VariableDeclaration","scope":65000,"src":"3097:10:110","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"},"typeName":{"id":64942,"name":"address","nodeType":"ElementaryTypeName","src":"3097:7:110","stateMutability":"nonpayable","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"}},"visibility":"internal"},{"constant":false,"id":64945,"mutability":"mutable","name":"amount","nameLocation":"3125:6:110","nodeType":"VariableDeclaration","scope":65000,"src":"3117:14:110","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"},"typeName":{"id":64944,"name":"uint256","nodeType":"ElementaryTypeName","src":"3117:7:110","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"visibility":"internal"}],"src":"3065:72:110"},"returnParameters":{"id":64949,"nodeType":"ParameterList","parameters":[{"constant":false,"id":64948,"mutability":"mutable","name":"","nameLocation":"-1:-1:-1","nodeType":"VariableDeclaration","scope":65000,"src":"3162:4:110","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_bool","typeString":"bool"},"typeName":{"id":64947,"name":"bool","nodeType":"ElementaryTypeName","src":"3162:4:110","typeDescriptions":{"typeIdentifier":"t_bool","typeString":"bool"}},"visibility":"internal"}],"src":"3161:6:110"},"scope":65189,"stateMutability":"nonpayable","virtual":true,"visibility":"public"},{"id":65087,"nodeType":"FunctionDefinition","src":"3825:1483:110","nodes":[],"body":{"id":65086,"nodeType":"Block","src":"4014:1294:110","nodes":[],"statements":[{"expression":{"arguments":[{"commonType":{"typeIdentifier":"t_uint256","typeString":"uint256"},"id":65021,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"leftExpression":{"id":65018,"name":"deadline","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":65008,"src":"4032:8:110","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"nodeType":"BinaryOperation","operator":">=","rightExpression":{"expression":{"id":65019,"name":"block","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":-4,"src":"4044:5:110","typeDescriptions":{"typeIdentifier":"t_magic_block","typeString":"block"}},"id":65020,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"memberName":"timestamp","nodeType":"MemberAccess","src":"4044:15:110","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"src":"4032:27:110","typeDescriptions":{"typeIdentifier":"t_bool","typeString":"bool"}},{"hexValue":"5045524d49545f444541444c494e455f45585049524544","id":65022,"isConstant":false,"isLValue":false,"isPure":true,"kind":"string","lValueRequested":false,"nodeType":"Literal","src":"4061:25:110","typeDescriptions":{"typeIdentifier":"t_stringliteral_dd18cfd81b4c1281b56302a044e7f751a261543590362c41d86af048f8ed4b3e","typeString":"literal_string \"PERMIT_DEADLINE_EXPIRED\""},"value":"PERMIT_DEADLINE_EXPIRED"}],"expression":{"argumentTypes":[{"typeIdentifier":"t_bool","typeString":"bool"},{"typeIdentifier":"t_stringliteral_dd18cfd81b4c1281b56302a044e7f751a261543590362c41d86af048f8ed4b3e","typeString":"literal_string \"PERMIT_DEADLINE_EXPIRED\""}],"id":65017,"name":"require","nodeType":"Identifier","overloadedDeclarations":[-18,-18],"referencedDeclaration":-18,"src":"4024:7:110","typeDescriptions":{"typeIdentifier":"t_function_require_pure$_t_bool_$_t_string_memory_ptr_$returns$__$","typeString":"function (bool,string memory) pure"}},"id":65023,"isConstant":false,"isLValue":false,"isPure":false,"kind":"functionCall","lValueRequested":false,"names":[],"nodeType":"FunctionCall","src":"4024:63:110","tryCall":false,"typeDescriptions":{"typeIdentifier":"t_tuple$__$","typeString":"tuple()"}},"id":65024,"nodeType":"ExpressionStatement","src":"4024:63:110"},{"id":65079,"nodeType":"UncheckedBlock","src":"4228:1027:110","statements":[{"assignments":[65026],"declarations":[{"constant":false,"id":65026,"mutability":"mutable","name":"recoveredAddress","nameLocation":"4260:16:110","nodeType":"VariableDeclaration","scope":65079,"src":"4252:24:110","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"},"typeName":{"id":65025,"name":"address","nodeType":"ElementaryTypeName","src":"4252:7:110","stateMutability":"nonpayable","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"}},"visibility":"internal"}],"id":65056,"initialValue":{"arguments":[{"arguments":[{"arguments":[{"hexValue":"1901","id":65031,"isConstant":false,"isLValue":false,"isPure":true,"kind":"string","lValueRequested":false,"nodeType":"Literal","src":"4379:10:110","typeDescriptions":{"typeIdentifier":"t_stringliteral_301a50b291d33ce1e8e9064e3f6a6c51d902ec22892b50d58abf6357c6a45541","typeString":"literal_string hex\"1901\""},"value":"\u0019\u0001"},{"arguments":[],"expression":{"argumentTypes":[],"id":65032,"name":"DOMAIN_SEPARATOR","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":65102,"src":"4415:16:110","typeDescriptions":{"typeIdentifier":"t_function_internal_view$__$returns$_t_bytes32_$","typeString":"function () view returns (bytes32)"}},"id":65033,"isConstant":false,"isLValue":false,"isPure":false,"kind":"functionCall","lValueRequested":false,"names":[],"nodeType":"FunctionCall","src":"4415:18:110","tryCall":false,"typeDescriptions":{"typeIdentifier":"t_bytes32","typeString":"bytes32"}},{"arguments":[{"arguments":[{"arguments":[{"hexValue":"5065726d69742861646472657373206f776e65722c61646472657373207370656e6465722c75696e743235362076616c75652c75696e74323536206e6f6e63652c75696e7432353620646561646c696e6529","id":65038,"isConstant":false,"isLValue":false,"isPure":true,"kind":"string","lValueRequested":false,"nodeType":"Literal","src":"4589:84:110","typeDescriptions":{"typeIdentifier":"t_stringliteral_6e71edae12b1b97f4d1f60370fef10105fa2faae0126114a169c64845d6126c9","typeString":"literal_string \"Permit(address owner,address spender,uint256 value,uint256 nonce,uint256 deadline)\""},"value":"Permit(address owner,address spender,uint256 value,uint256 nonce,uint256 deadline)"}],"expression":{"argumentTypes":[{"typeIdentifier":"t_stringliteral_6e71edae12b1b97f4d1f60370fef10105fa2faae0126114a169c64845d6126c9","typeString":"literal_string \"Permit(address owner,address spender,uint256 value,uint256 nonce,uint256 deadline)\""}],"id":65037,"name":"keccak256","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":-8,"src":"4542:9:110","typeDescriptions":{"typeIdentifier":"t_function_keccak256_pure$_t_bytes_memory_ptr_$returns$_t_bytes32_$","typeString":"function (bytes memory) pure returns (bytes32)"}},"id":65039,"isConstant":false,"isLValue":false,"isPure":true,"kind":"functionCall","lValueRequested":false,"names":[],"nodeType":"FunctionCall","src":"4542:165:110","tryCall":false,"typeDescriptions":{"typeIdentifier":"t_bytes32","typeString":"bytes32"}},{"id":65040,"name":"owner","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":65002,"src":"4741:5:110","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"}},{"id":65041,"name":"spender","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":65004,"src":"4780:7:110","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"}},{"id":65042,"name":"value","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":65006,"src":"4821:5:110","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},{"id":65046,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"nodeType":"UnaryOperation","operator":"++","prefix":false,"src":"4860:15:110","subExpression":{"baseExpression":{"id":65043,"name":"nonces","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":64846,"src":"4860:6:110","typeDescriptions":{"typeIdentifier":"t_mapping$_t_address_$_t_uint256_$","typeString":"mapping(address => uint256)"}},"id":65045,"indexExpression":{"id":65044,"name":"owner","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":65002,"src":"4867:5:110","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"}},"isConstant":false,"isLValue":true,"isPure":false,"lValueRequested":true,"nodeType":"IndexAccess","src":"4860:13:110","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},{"id":65047,"name":"deadline","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":65008,"src":"4909:8:110","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}}],"expression":{"argumentTypes":[{"typeIdentifier":"t_bytes32","typeString":"bytes32"},{"typeIdentifier":"t_address","typeString":"address"},{"typeIdentifier":"t_address","typeString":"address"},{"typeIdentifier":"t_uint256","typeString":"uint256"},{"typeIdentifier":"t_uint256","typeString":"uint256"},{"typeIdentifier":"t_uint256","typeString":"uint256"}],"expression":{"id":65035,"name":"abi","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":-1,"src":"4498:3:110","typeDescriptions":{"typeIdentifier":"t_magic_abi","typeString":"abi"}},"id":65036,"isConstant":false,"isLValue":false,"isPure":true,"lValueRequested":false,"memberName":"encode","nodeType":"MemberAccess","src":"4498:10:110","typeDescriptions":{"typeIdentifier":"t_function_abiencode_pure$__$returns$_t_bytes_memory_ptr_$","typeString":"function () pure returns (bytes memory)"}},"id":65048,"isConstant":false,"isLValue":false,"isPure":false,"kind":"functionCall","lValueRequested":false,"names":[],"nodeType":"FunctionCall","src":"4498:449:110","tryCall":false,"typeDescriptions":{"typeIdentifier":"t_bytes_memory_ptr","typeString":"bytes memory"}}],"expression":{"argumentTypes":[{"typeIdentifier":"t_bytes_memory_ptr","typeString":"bytes memory"}],"id":65034,"name":"keccak256","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":-8,"src":"4459:9:110","typeDescriptions":{"typeIdentifier":"t_function_keccak256_pure$_t_bytes_memory_ptr_$returns$_t_bytes32_$","typeString":"function (bytes memory) pure returns (bytes32)"}},"id":65049,"isConstant":false,"isLValue":false,"isPure":false,"kind":"functionCall","lValueRequested":false,"names":[],"nodeType":"FunctionCall","src":"4459:514:110","tryCall":false,"typeDescriptions":{"typeIdentifier":"t_bytes32","typeString":"bytes32"}}],"expression":{"argumentTypes":[{"typeIdentifier":"t_stringliteral_301a50b291d33ce1e8e9064e3f6a6c51d902ec22892b50d58abf6357c6a45541","typeString":"literal_string hex\"1901\""},{"typeIdentifier":"t_bytes32","typeString":"bytes32"},{"typeIdentifier":"t_bytes32","typeString":"bytes32"}],"expression":{"id":65029,"name":"abi","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":-1,"src":"4337:3:110","typeDescriptions":{"typeIdentifier":"t_magic_abi","typeString":"abi"}},"id":65030,"isConstant":false,"isLValue":false,"isPure":true,"lValueRequested":false,"memberName":"encodePacked","nodeType":"MemberAccess","src":"4337:16:110","typeDescriptions":{"typeIdentifier":"t_function_abiencodepacked_pure$__$returns$_t_bytes_memory_ptr_$","typeString":"function () pure returns (bytes memory)"}},"id":65050,"isConstant":false,"isLValue":false,"isPure":false,"kind":"functionCall","lValueRequested":false,"names":[],"nodeType":"FunctionCall","src":"4337:658:110","tryCall":false,"typeDescriptions":{"typeIdentifier":"t_bytes_memory_ptr","typeString":"bytes memory"}}],"expression":{"argumentTypes":[{"typeIdentifier":"t_bytes_memory_ptr","typeString":"bytes memory"}],"id":65028,"name":"keccak256","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":-8,"src":"4306:9:110","typeDescriptions":{"typeIdentifier":"t_function_keccak256_pure$_t_bytes_memory_ptr_$returns$_t_bytes32_$","typeString":"function (bytes memory) pure returns (bytes32)"}},"id":65051,"isConstant":false,"isLValue":false,"isPure":false,"kind":"functionCall","lValueRequested":false,"names":[],"nodeType":"FunctionCall","src":"4306:707:110","tryCall":false,"typeDescriptions":{"typeIdentifier":"t_bytes32","typeString":"bytes32"}},{"id":65052,"name":"v","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":65010,"src":"5031:1:110","typeDescriptions":{"typeIdentifier":"t_uint8","typeString":"uint8"}},{"id":65053,"name":"r","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":65012,"src":"5050:1:110","typeDescriptions":{"typeIdentifier":"t_bytes32","typeString":"bytes32"}},{"id":65054,"name":"s","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":65014,"src":"5069:1:110","typeDescriptions":{"typeIdentifier":"t_bytes32","typeString":"bytes32"}}],"expression":{"argumentTypes":[{"typeIdentifier":"t_bytes32","typeString":"bytes32"},{"typeIdentifier":"t_uint8","typeString":"uint8"},{"typeIdentifier":"t_bytes32","typeString":"bytes32"},{"typeIdentifier":"t_bytes32","typeString":"bytes32"}],"id":65027,"name":"ecrecover","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":-6,"src":"4279:9:110","typeDescriptions":{"typeIdentifier":"t_function_ecrecover_pure$_t_bytes32_$_t_uint8_$_t_bytes32_$_t_bytes32_$returns$_t_address_$","typeString":"function (bytes32,uint8,bytes32,bytes32) pure returns (address)"}},"id":65055,"isConstant":false,"isLValue":false,"isPure":false,"kind":"functionCall","lValueRequested":false,"names":[],"nodeType":"FunctionCall","src":"4279:805:110","tryCall":false,"typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"}},"nodeType":"VariableDeclarationStatement","src":"4252:832:110"},{"expression":{"arguments":[{"commonType":{"typeIdentifier":"t_bool","typeString":"bool"},"id":65067,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"leftExpression":{"commonType":{"typeIdentifier":"t_address","typeString":"address"},"id":65063,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"leftExpression":{"id":65058,"name":"recoveredAddress","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":65026,"src":"5107:16:110","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"}},"nodeType":"BinaryOperation","operator":"!=","rightExpression":{"arguments":[{"hexValue":"30","id":65061,"isConstant":false,"isLValue":false,"isPure":true,"kind":"number","lValueRequested":false,"nodeType":"Literal","src":"5135:1:110","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":65060,"isConstant":false,"isLValue":false,"isPure":true,"lValueRequested":false,"nodeType":"ElementaryTypeNameExpression","src":"5127:7:110","typeDescriptions":{"typeIdentifier":"t_type$_t_address_$","typeString":"type(address)"},"typeName":{"id":65059,"name":"address","nodeType":"ElementaryTypeName","src":"5127:7:110","typeDescriptions":{}}},"id":65062,"isConstant":false,"isLValue":false,"isPure":true,"kind":"typeConversion","lValueRequested":false,"names":[],"nodeType":"FunctionCall","src":"5127:10:110","tryCall":false,"typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"}},"src":"5107:30:110","typeDescriptions":{"typeIdentifier":"t_bool","typeString":"bool"}},"nodeType":"BinaryOperation","operator":"&&","rightExpression":{"commonType":{"typeIdentifier":"t_address","typeString":"address"},"id":65066,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"leftExpression":{"id":65064,"name":"recoveredAddress","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":65026,"src":"5141:16:110","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"}},"nodeType":"BinaryOperation","operator":"==","rightExpression":{"id":65065,"name":"owner","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":65002,"src":"5161:5:110","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"}},"src":"5141:25:110","typeDescriptions":{"typeIdentifier":"t_bool","typeString":"bool"}},"src":"5107:59:110","typeDescriptions":{"typeIdentifier":"t_bool","typeString":"bool"}},{"hexValue":"494e56414c49445f5349474e4552","id":65068,"isConstant":false,"isLValue":false,"isPure":true,"kind":"string","lValueRequested":false,"nodeType":"Literal","src":"5168:16:110","typeDescriptions":{"typeIdentifier":"t_stringliteral_ba2319f5fa9f0c8e55f0d6899910b7354e6f643d1d349de47190066d85e68a1c","typeString":"literal_string \"INVALID_SIGNER\""},"value":"INVALID_SIGNER"}],"expression":{"argumentTypes":[{"typeIdentifier":"t_bool","typeString":"bool"},{"typeIdentifier":"t_stringliteral_ba2319f5fa9f0c8e55f0d6899910b7354e6f643d1d349de47190066d85e68a1c","typeString":"literal_string \"INVALID_SIGNER\""}],"id":65057,"name":"require","nodeType":"Identifier","overloadedDeclarations":[-18,-18],"referencedDeclaration":-18,"src":"5099:7:110","typeDescriptions":{"typeIdentifier":"t_function_require_pure$_t_bool_$_t_string_memory_ptr_$returns$__$","typeString":"function (bool,string memory) pure"}},"id":65069,"isConstant":false,"isLValue":false,"isPure":false,"kind":"functionCall","lValueRequested":false,"names":[],"nodeType":"FunctionCall","src":"5099:86:110","tryCall":false,"typeDescriptions":{"typeIdentifier":"t_tuple$__$","typeString":"tuple()"}},"id":65070,"nodeType":"ExpressionStatement","src":"5099:86:110"},{"expression":{"id":65077,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"leftHandSide":{"baseExpression":{"baseExpression":{"id":65071,"name":"allowance","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":64838,"src":"5200:9:110","typeDescriptions":{"typeIdentifier":"t_mapping$_t_address_$_t_mapping$_t_address_$_t_uint256_$_$","typeString":"mapping(address => mapping(address => uint256))"}},"id":65074,"indexExpression":{"id":65072,"name":"recoveredAddress","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":65026,"src":"5210:16:110","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"}},"isConstant":false,"isLValue":true,"isPure":false,"lValueRequested":false,"nodeType":"IndexAccess","src":"5200:27:110","typeDescriptions":{"typeIdentifier":"t_mapping$_t_address_$_t_uint256_$","typeString":"mapping(address => uint256)"}},"id":65075,"indexExpression":{"id":65073,"name":"spender","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":65004,"src":"5228:7:110","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"}},"isConstant":false,"isLValue":true,"isPure":false,"lValueRequested":true,"nodeType":"IndexAccess","src":"5200:36:110","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"nodeType":"Assignment","operator":"=","rightHandSide":{"id":65076,"name":"value","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":65006,"src":"5239:5:110","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"src":"5200:44:110","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"id":65078,"nodeType":"ExpressionStatement","src":"5200:44:110"}]},{"eventCall":{"arguments":[{"id":65081,"name":"owner","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":65002,"src":"5279:5:110","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"}},{"id":65082,"name":"spender","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":65004,"src":"5286:7:110","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"}},{"id":65083,"name":"value","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":65006,"src":"5295:5:110","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}}],"expression":{"argumentTypes":[{"typeIdentifier":"t_address","typeString":"address"},{"typeIdentifier":"t_address","typeString":"address"},{"typeIdentifier":"t_uint256","typeString":"uint256"}],"id":65080,"name":"Approval","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":64820,"src":"5270:8:110","typeDescriptions":{"typeIdentifier":"t_function_event_nonpayable$_t_address_$_t_address_$_t_uint256_$returns$__$","typeString":"function (address,address,uint256)"}},"id":65084,"isConstant":false,"isLValue":false,"isPure":false,"kind":"functionCall","lValueRequested":false,"names":[],"nodeType":"FunctionCall","src":"5270:31:110","tryCall":false,"typeDescriptions":{"typeIdentifier":"t_tuple$__$","typeString":"tuple()"}},"id":65085,"nodeType":"EmitStatement","src":"5265:36:110"}]},"functionSelector":"d505accf","implemented":true,"kind":"function","modifiers":[],"name":"permit","nameLocation":"3834:6:110","parameters":{"id":65015,"nodeType":"ParameterList","parameters":[{"constant":false,"id":65002,"mutability":"mutable","name":"owner","nameLocation":"3858:5:110","nodeType":"VariableDeclaration","scope":65087,"src":"3850:13:110","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"},"typeName":{"id":65001,"name":"address","nodeType":"ElementaryTypeName","src":"3850:7:110","stateMutability":"nonpayable","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"}},"visibility":"internal"},{"constant":false,"id":65004,"mutability":"mutable","name":"spender","nameLocation":"3881:7:110","nodeType":"VariableDeclaration","scope":65087,"src":"3873:15:110","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"},"typeName":{"id":65003,"name":"address","nodeType":"ElementaryTypeName","src":"3873:7:110","stateMutability":"nonpayable","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"}},"visibility":"internal"},{"constant":false,"id":65006,"mutability":"mutable","name":"value","nameLocation":"3906:5:110","nodeType":"VariableDeclaration","scope":65087,"src":"3898:13:110","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"},"typeName":{"id":65005,"name":"uint256","nodeType":"ElementaryTypeName","src":"3898:7:110","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"visibility":"internal"},{"constant":false,"id":65008,"mutability":"mutable","name":"deadline","nameLocation":"3929:8:110","nodeType":"VariableDeclaration","scope":65087,"src":"3921:16:110","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"},"typeName":{"id":65007,"name":"uint256","nodeType":"ElementaryTypeName","src":"3921:7:110","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"visibility":"internal"},{"constant":false,"id":65010,"mutability":"mutable","name":"v","nameLocation":"3953:1:110","nodeType":"VariableDeclaration","scope":65087,"src":"3947:7:110","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_uint8","typeString":"uint8"},"typeName":{"id":65009,"name":"uint8","nodeType":"ElementaryTypeName","src":"3947:5:110","typeDescriptions":{"typeIdentifier":"t_uint8","typeString":"uint8"}},"visibility":"internal"},{"constant":false,"id":65012,"mutability":"mutable","name":"r","nameLocation":"3972:1:110","nodeType":"VariableDeclaration","scope":65087,"src":"3964:9:110","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_bytes32","typeString":"bytes32"},"typeName":{"id":65011,"name":"bytes32","nodeType":"ElementaryTypeName","src":"3964:7:110","typeDescriptions":{"typeIdentifier":"t_bytes32","typeString":"bytes32"}},"visibility":"internal"},{"constant":false,"id":65014,"mutability":"mutable","name":"s","nameLocation":"3991:1:110","nodeType":"VariableDeclaration","scope":65087,"src":"3983:9:110","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_bytes32","typeString":"bytes32"},"typeName":{"id":65013,"name":"bytes32","nodeType":"ElementaryTypeName","src":"3983:7:110","typeDescriptions":{"typeIdentifier":"t_bytes32","typeString":"bytes32"}},"visibility":"internal"}],"src":"3840:158:110"},"returnParameters":{"id":65016,"nodeType":"ParameterList","parameters":[],"src":"4014:0:110"},"scope":65189,"stateMutability":"nonpayable","virtual":true,"visibility":"public"},{"id":65102,"nodeType":"FunctionDefinition","src":"5314:177:110","nodes":[],"body":{"id":65101,"nodeType":"Block","src":"5380:111:110","nodes":[],"statements":[{"expression":{"condition":{"commonType":{"typeIdentifier":"t_uint256","typeString":"uint256"},"id":65095,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"leftExpression":{"expression":{"id":65092,"name":"block","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":-4,"src":"5397:5:110","typeDescriptions":{"typeIdentifier":"t_magic_block","typeString":"block"}},"id":65093,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"memberName":"chainid","nodeType":"MemberAccess","src":"5397:13:110","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"nodeType":"BinaryOperation","operator":"==","rightExpression":{"id":65094,"name":"INITIAL_CHAIN_ID","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":64840,"src":"5414:16:110","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"src":"5397:33:110","typeDescriptions":{"typeIdentifier":"t_bool","typeString":"bool"}},"falseExpression":{"arguments":[],"expression":{"argumentTypes":[],"id":65097,"name":"computeDomainSeparator","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":65132,"src":"5460:22:110","typeDescriptions":{"typeIdentifier":"t_function_internal_view$__$returns$_t_bytes32_$","typeString":"function () view returns (bytes32)"}},"id":65098,"isConstant":false,"isLValue":false,"isPure":false,"kind":"functionCall","lValueRequested":false,"names":[],"nodeType":"FunctionCall","src":"5460:24:110","tryCall":false,"typeDescriptions":{"typeIdentifier":"t_bytes32","typeString":"bytes32"}},"id":65099,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"nodeType":"Conditional","src":"5397:87:110","trueExpression":{"id":65096,"name":"INITIAL_DOMAIN_SEPARATOR","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":64842,"src":"5433:24:110","typeDescriptions":{"typeIdentifier":"t_bytes32","typeString":"bytes32"}},"typeDescriptions":{"typeIdentifier":"t_bytes32","typeString":"bytes32"}},"functionReturnParameters":65091,"id":65100,"nodeType":"Return","src":"5390:94:110"}]},"functionSelector":"3644e515","implemented":true,"kind":"function","modifiers":[],"name":"DOMAIN_SEPARATOR","nameLocation":"5323:16:110","parameters":{"id":65088,"nodeType":"ParameterList","parameters":[],"src":"5339:2:110"},"returnParameters":{"id":65091,"nodeType":"ParameterList","parameters":[{"constant":false,"id":65090,"mutability":"mutable","name":"","nameLocation":"-1:-1:-1","nodeType":"VariableDeclaration","scope":65102,"src":"5371:7:110","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_bytes32","typeString":"bytes32"},"typeName":{"id":65089,"name":"bytes32","nodeType":"ElementaryTypeName","src":"5371:7:110","typeDescriptions":{"typeIdentifier":"t_bytes32","typeString":"bytes32"}},"visibility":"internal"}],"src":"5370:9:110"},"scope":65189,"stateMutability":"view","virtual":true,"visibility":"public"},{"id":65132,"nodeType":"FunctionDefinition","src":"5497:446:110","nodes":[],"body":{"id":65131,"nodeType":"Block","src":"5571:372:110","nodes":[],"statements":[{"expression":{"arguments":[{"arguments":[{"arguments":[{"hexValue":"454950373132446f6d61696e28737472696e67206e616d652c737472696e672076657273696f6e2c75696e7432353620636861696e49642c6164647265737320766572696679696e67436f6e747261637429","id":65111,"isConstant":false,"isLValue":false,"isPure":true,"kind":"string","lValueRequested":false,"nodeType":"Literal","src":"5669:84:110","typeDescriptions":{"typeIdentifier":"t_stringliteral_8b73c3c69bb8fe3d512ecc4cf759cc79239f7b179b0ffacaa9a75d522b39400f","typeString":"literal_string \"EIP712Domain(string name,string version,uint256 chainId,address verifyingContract)\""},"value":"EIP712Domain(string name,string version,uint256 chainId,address verifyingContract)"}],"expression":{"argumentTypes":[{"typeIdentifier":"t_stringliteral_8b73c3c69bb8fe3d512ecc4cf759cc79239f7b179b0ffacaa9a75d522b39400f","typeString":"literal_string \"EIP712Domain(string name,string version,uint256 chainId,address verifyingContract)\""}],"id":65110,"name":"keccak256","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":-8,"src":"5659:9:110","typeDescriptions":{"typeIdentifier":"t_function_keccak256_pure$_t_bytes_memory_ptr_$returns$_t_bytes32_$","typeString":"function (bytes memory) pure returns (bytes32)"}},"id":65112,"isConstant":false,"isLValue":false,"isPure":true,"kind":"functionCall","lValueRequested":false,"names":[],"nodeType":"FunctionCall","src":"5659:95:110","tryCall":false,"typeDescriptions":{"typeIdentifier":"t_bytes32","typeString":"bytes32"}},{"arguments":[{"arguments":[{"id":65116,"name":"name","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":64822,"src":"5792:4:110","typeDescriptions":{"typeIdentifier":"t_string_storage","typeString":"string storage ref"}}],"expression":{"argumentTypes":[{"typeIdentifier":"t_string_storage","typeString":"string storage ref"}],"id":65115,"isConstant":false,"isLValue":false,"isPure":true,"lValueRequested":false,"nodeType":"ElementaryTypeNameExpression","src":"5786:5:110","typeDescriptions":{"typeIdentifier":"t_type$_t_bytes_storage_ptr_$","typeString":"type(bytes storage pointer)"},"typeName":{"id":65114,"name":"bytes","nodeType":"ElementaryTypeName","src":"5786:5:110","typeDescriptions":{}}},"id":65117,"isConstant":false,"isLValue":false,"isPure":false,"kind":"typeConversion","lValueRequested":false,"names":[],"nodeType":"FunctionCall","src":"5786:11:110","tryCall":false,"typeDescriptions":{"typeIdentifier":"t_bytes_storage_ptr","typeString":"bytes storage pointer"}}],"expression":{"argumentTypes":[{"typeIdentifier":"t_bytes_storage_ptr","typeString":"bytes storage pointer"}],"id":65113,"name":"keccak256","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":-8,"src":"5776:9:110","typeDescriptions":{"typeIdentifier":"t_function_keccak256_pure$_t_bytes_memory_ptr_$returns$_t_bytes32_$","typeString":"function (bytes memory) pure returns (bytes32)"}},"id":65118,"isConstant":false,"isLValue":false,"isPure":false,"kind":"functionCall","lValueRequested":false,"names":[],"nodeType":"FunctionCall","src":"5776:22:110","tryCall":false,"typeDescriptions":{"typeIdentifier":"t_bytes32","typeString":"bytes32"}},{"arguments":[{"hexValue":"31","id":65120,"isConstant":false,"isLValue":false,"isPure":true,"kind":"string","lValueRequested":false,"nodeType":"Literal","src":"5830:3:110","typeDescriptions":{"typeIdentifier":"t_stringliteral_c89efdaa54c0f20c7adf612882df0950f5a951637e0307cdcb4c672f298b8bc6","typeString":"literal_string \"1\""},"value":"1"}],"expression":{"argumentTypes":[{"typeIdentifier":"t_stringliteral_c89efdaa54c0f20c7adf612882df0950f5a951637e0307cdcb4c672f298b8bc6","typeString":"literal_string \"1\""}],"id":65119,"name":"keccak256","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":-8,"src":"5820:9:110","typeDescriptions":{"typeIdentifier":"t_function_keccak256_pure$_t_bytes_memory_ptr_$returns$_t_bytes32_$","typeString":"function (bytes memory) pure returns (bytes32)"}},"id":65121,"isConstant":false,"isLValue":false,"isPure":true,"kind":"functionCall","lValueRequested":false,"names":[],"nodeType":"FunctionCall","src":"5820:14:110","tryCall":false,"typeDescriptions":{"typeIdentifier":"t_bytes32","typeString":"bytes32"}},{"expression":{"id":65122,"name":"block","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":-4,"src":"5856:5:110","typeDescriptions":{"typeIdentifier":"t_magic_block","typeString":"block"}},"id":65123,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"memberName":"chainid","nodeType":"MemberAccess","src":"5856:13:110","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},{"arguments":[{"id":65126,"name":"this","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":-28,"src":"5899:4:110","typeDescriptions":{"typeIdentifier":"t_contract$_ERC20_$65189","typeString":"contract ERC20"}}],"expression":{"argumentTypes":[{"typeIdentifier":"t_contract$_ERC20_$65189","typeString":"contract ERC20"}],"id":65125,"isConstant":false,"isLValue":false,"isPure":true,"lValueRequested":false,"nodeType":"ElementaryTypeNameExpression","src":"5891:7:110","typeDescriptions":{"typeIdentifier":"t_type$_t_address_$","typeString":"type(address)"},"typeName":{"id":65124,"name":"address","nodeType":"ElementaryTypeName","src":"5891:7:110","typeDescriptions":{}}},"id":65127,"isConstant":false,"isLValue":false,"isPure":false,"kind":"typeConversion","lValueRequested":false,"names":[],"nodeType":"FunctionCall","src":"5891:13:110","tryCall":false,"typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"}}],"expression":{"argumentTypes":[{"typeIdentifier":"t_bytes32","typeString":"bytes32"},{"typeIdentifier":"t_bytes32","typeString":"bytes32"},{"typeIdentifier":"t_bytes32","typeString":"bytes32"},{"typeIdentifier":"t_uint256","typeString":"uint256"},{"typeIdentifier":"t_address","typeString":"address"}],"expression":{"id":65108,"name":"abi","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":-1,"src":"5627:3:110","typeDescriptions":{"typeIdentifier":"t_magic_abi","typeString":"abi"}},"id":65109,"isConstant":false,"isLValue":false,"isPure":true,"lValueRequested":false,"memberName":"encode","nodeType":"MemberAccess","src":"5627:10:110","typeDescriptions":{"typeIdentifier":"t_function_abiencode_pure$__$returns$_t_bytes_memory_ptr_$","typeString":"function () pure returns (bytes memory)"}},"id":65128,"isConstant":false,"isLValue":false,"isPure":false,"kind":"functionCall","lValueRequested":false,"names":[],"nodeType":"FunctionCall","src":"5627:295:110","tryCall":false,"typeDescriptions":{"typeIdentifier":"t_bytes_memory_ptr","typeString":"bytes memory"}}],"expression":{"argumentTypes":[{"typeIdentifier":"t_bytes_memory_ptr","typeString":"bytes memory"}],"id":65107,"name":"keccak256","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":-8,"src":"5600:9:110","typeDescriptions":{"typeIdentifier":"t_function_keccak256_pure$_t_bytes_memory_ptr_$returns$_t_bytes32_$","typeString":"function (bytes memory) pure returns (bytes32)"}},"id":65129,"isConstant":false,"isLValue":false,"isPure":false,"kind":"functionCall","lValueRequested":false,"names":[],"nodeType":"FunctionCall","src":"5600:336:110","tryCall":false,"typeDescriptions":{"typeIdentifier":"t_bytes32","typeString":"bytes32"}},"functionReturnParameters":65106,"id":65130,"nodeType":"Return","src":"5581:355:110"}]},"implemented":true,"kind":"function","modifiers":[],"name":"computeDomainSeparator","nameLocation":"5506:22:110","parameters":{"id":65103,"nodeType":"ParameterList","parameters":[],"src":"5528:2:110"},"returnParameters":{"id":65106,"nodeType":"ParameterList","parameters":[{"constant":false,"id":65105,"mutability":"mutable","name":"","nameLocation":"-1:-1:-1","nodeType":"VariableDeclaration","scope":65132,"src":"5562:7:110","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_bytes32","typeString":"bytes32"},"typeName":{"id":65104,"name":"bytes32","nodeType":"ElementaryTypeName","src":"5562:7:110","typeDescriptions":{"typeIdentifier":"t_bytes32","typeString":"bytes32"}},"visibility":"internal"}],"src":"5561:9:110"},"scope":65189,"stateMutability":"view","virtual":true,"visibility":"internal"},{"id":65160,"nodeType":"FunctionDefinition","src":"6137:325:110","nodes":[],"body":{"id":65159,"nodeType":"Block","src":"6197:265:110","nodes":[],"statements":[{"expression":{"id":65141,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"leftHandSide":{"id":65139,"name":"totalSupply","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":64828,"src":"6207:11:110","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"nodeType":"Assignment","operator":"+=","rightHandSide":{"id":65140,"name":"amount","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":65136,"src":"6222:6:110","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"src":"6207:21:110","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"id":65142,"nodeType":"ExpressionStatement","src":"6207:21:110"},{"id":65149,"nodeType":"UncheckedBlock","src":"6350:58:110","statements":[{"expression":{"id":65147,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"leftHandSide":{"baseExpression":{"id":65143,"name":"balanceOf","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":64832,"src":"6374:9:110","typeDescriptions":{"typeIdentifier":"t_mapping$_t_address_$_t_uint256_$","typeString":"mapping(address => uint256)"}},"id":65145,"indexExpression":{"id":65144,"name":"to","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":65134,"src":"6384:2:110","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"}},"isConstant":false,"isLValue":true,"isPure":false,"lValueRequested":true,"nodeType":"IndexAccess","src":"6374:13:110","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"nodeType":"Assignment","operator":"+=","rightHandSide":{"id":65146,"name":"amount","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":65136,"src":"6391:6:110","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"src":"6374:23:110","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"id":65148,"nodeType":"ExpressionStatement","src":"6374:23:110"}]},{"eventCall":{"arguments":[{"arguments":[{"hexValue":"30","id":65153,"isConstant":false,"isLValue":false,"isPure":true,"kind":"number","lValueRequested":false,"nodeType":"Literal","src":"6440:1:110","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":65152,"isConstant":false,"isLValue":false,"isPure":true,"lValueRequested":false,"nodeType":"ElementaryTypeNameExpression","src":"6432:7:110","typeDescriptions":{"typeIdentifier":"t_type$_t_address_$","typeString":"type(address)"},"typeName":{"id":65151,"name":"address","nodeType":"ElementaryTypeName","src":"6432:7:110","typeDescriptions":{}}},"id":65154,"isConstant":false,"isLValue":false,"isPure":true,"kind":"typeConversion","lValueRequested":false,"names":[],"nodeType":"FunctionCall","src":"6432:10:110","tryCall":false,"typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"}},{"id":65155,"name":"to","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":65134,"src":"6444:2:110","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"}},{"id":65156,"name":"amount","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":65136,"src":"6448:6:110","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}}],"expression":{"argumentTypes":[{"typeIdentifier":"t_address","typeString":"address"},{"typeIdentifier":"t_address","typeString":"address"},{"typeIdentifier":"t_uint256","typeString":"uint256"}],"id":65150,"name":"Transfer","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":64812,"src":"6423:8:110","typeDescriptions":{"typeIdentifier":"t_function_event_nonpayable$_t_address_$_t_address_$_t_uint256_$returns$__$","typeString":"function (address,address,uint256)"}},"id":65157,"isConstant":false,"isLValue":false,"isPure":false,"kind":"functionCall","lValueRequested":false,"names":[],"nodeType":"FunctionCall","src":"6423:32:110","tryCall":false,"typeDescriptions":{"typeIdentifier":"t_tuple$__$","typeString":"tuple()"}},"id":65158,"nodeType":"EmitStatement","src":"6418:37:110"}]},"implemented":true,"kind":"function","modifiers":[],"name":"_mint","nameLocation":"6146:5:110","parameters":{"id":65137,"nodeType":"ParameterList","parameters":[{"constant":false,"id":65134,"mutability":"mutable","name":"to","nameLocation":"6160:2:110","nodeType":"VariableDeclaration","scope":65160,"src":"6152:10:110","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"},"typeName":{"id":65133,"name":"address","nodeType":"ElementaryTypeName","src":"6152:7:110","stateMutability":"nonpayable","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"}},"visibility":"internal"},{"constant":false,"id":65136,"mutability":"mutable","name":"amount","nameLocation":"6172:6:110","nodeType":"VariableDeclaration","scope":65160,"src":"6164:14:110","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"},"typeName":{"id":65135,"name":"uint256","nodeType":"ElementaryTypeName","src":"6164:7:110","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"visibility":"internal"}],"src":"6151:28:110"},"returnParameters":{"id":65138,"nodeType":"ParameterList","parameters":[],"src":"6197:0:110"},"scope":65189,"stateMutability":"nonpayable","virtual":true,"visibility":"internal"},{"id":65188,"nodeType":"FunctionDefinition","src":"6468:328:110","nodes":[],"body":{"id":65187,"nodeType":"Block","src":"6530:266:110","nodes":[],"statements":[{"expression":{"id":65171,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"leftHandSide":{"baseExpression":{"id":65167,"name":"balanceOf","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":64832,"src":"6540:9:110","typeDescriptions":{"typeIdentifier":"t_mapping$_t_address_$_t_uint256_$","typeString":"mapping(address => uint256)"}},"id":65169,"indexExpression":{"id":65168,"name":"from","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":65162,"src":"6550:4:110","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"}},"isConstant":false,"isLValue":true,"isPure":false,"lValueRequested":true,"nodeType":"IndexAccess","src":"6540:15:110","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"nodeType":"Assignment","operator":"-=","rightHandSide":{"id":65170,"name":"amount","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":65164,"src":"6559:6:110","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"src":"6540:25:110","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"id":65172,"nodeType":"ExpressionStatement","src":"6540:25:110"},{"id":65177,"nodeType":"UncheckedBlock","src":"6684:56:110","statements":[{"expression":{"id":65175,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"leftHandSide":{"id":65173,"name":"totalSupply","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":64828,"src":"6708:11:110","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"nodeType":"Assignment","operator":"-=","rightHandSide":{"id":65174,"name":"amount","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":65164,"src":"6723:6:110","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"src":"6708:21:110","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"id":65176,"nodeType":"ExpressionStatement","src":"6708:21:110"}]},{"eventCall":{"arguments":[{"id":65179,"name":"from","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":65162,"src":"6764:4:110","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"}},{"arguments":[{"hexValue":"30","id":65182,"isConstant":false,"isLValue":false,"isPure":true,"kind":"number","lValueRequested":false,"nodeType":"Literal","src":"6778:1:110","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":65181,"isConstant":false,"isLValue":false,"isPure":true,"lValueRequested":false,"nodeType":"ElementaryTypeNameExpression","src":"6770:7:110","typeDescriptions":{"typeIdentifier":"t_type$_t_address_$","typeString":"type(address)"},"typeName":{"id":65180,"name":"address","nodeType":"ElementaryTypeName","src":"6770:7:110","typeDescriptions":{}}},"id":65183,"isConstant":false,"isLValue":false,"isPure":true,"kind":"typeConversion","lValueRequested":false,"names":[],"nodeType":"FunctionCall","src":"6770:10:110","tryCall":false,"typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"}},{"id":65184,"name":"amount","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":65164,"src":"6782:6:110","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}}],"expression":{"argumentTypes":[{"typeIdentifier":"t_address","typeString":"address"},{"typeIdentifier":"t_address","typeString":"address"},{"typeIdentifier":"t_uint256","typeString":"uint256"}],"id":65178,"name":"Transfer","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":64812,"src":"6755:8:110","typeDescriptions":{"typeIdentifier":"t_function_event_nonpayable$_t_address_$_t_address_$_t_uint256_$returns$__$","typeString":"function (address,address,uint256)"}},"id":65185,"isConstant":false,"isLValue":false,"isPure":false,"kind":"functionCall","lValueRequested":false,"names":[],"nodeType":"FunctionCall","src":"6755:34:110","tryCall":false,"typeDescriptions":{"typeIdentifier":"t_tuple$__$","typeString":"tuple()"}},"id":65186,"nodeType":"EmitStatement","src":"6750:39:110"}]},"implemented":true,"kind":"function","modifiers":[],"name":"_burn","nameLocation":"6477:5:110","parameters":{"id":65165,"nodeType":"ParameterList","parameters":[{"constant":false,"id":65162,"mutability":"mutable","name":"from","nameLocation":"6491:4:110","nodeType":"VariableDeclaration","scope":65188,"src":"6483:12:110","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"},"typeName":{"id":65161,"name":"address","nodeType":"ElementaryTypeName","src":"6483:7:110","stateMutability":"nonpayable","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"}},"visibility":"internal"},{"constant":false,"id":65164,"mutability":"mutable","name":"amount","nameLocation":"6505:6:110","nodeType":"VariableDeclaration","scope":65188,"src":"6497:14:110","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"},"typeName":{"id":65163,"name":"uint256","nodeType":"ElementaryTypeName","src":"6497:7:110","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"visibility":"internal"}],"src":"6482:30:110"},"returnParameters":{"id":65166,"nodeType":"ParameterList","parameters":[],"src":"6530:0:110"},"scope":65189,"stateMutability":"nonpayable","virtual":true,"visibility":"internal"}],"abstract":true,"baseContracts":[],"canonicalName":"ERC20","contractDependencies":[],"contractKind":"contract","documentation":{"id":64804,"nodeType":"StructuredDocumentation","src":"58:403:110","text":"@notice Modern and gas efficient ERC20 + EIP-2612 implementation.\n @author Solmate (https://github.com/Rari-Capital/solmate/blob/main/src/tokens/ERC20.sol)\n @author Modified from Uniswap (https://github.com/Uniswap/uniswap-v2-core/blob/master/contracts/UniswapV2ERC20.sol)\n @dev Do not manually set balances without updating totalSupply, as the sum of all user balances must not exceed it."},"fullyImplemented":true,"linearizedBaseContracts":[65189],"name":"ERC20","nameLocation":"479:5:110","scope":65190,"usedErrors":[]}],"license":"MIT"},"id":110} \ No newline at end of file diff --git a/op-chain-ops/foundry/testdata/forge-artifacts/ERC20.sol/ERC20.0.8.25.json b/op-chain-ops/foundry/testdata/forge-artifacts/ERC20.sol/ERC20.0.8.25.json new file mode 100644 index 000000000000..e0850c845619 --- /dev/null +++ b/op-chain-ops/foundry/testdata/forge-artifacts/ERC20.sol/ERC20.0.8.25.json @@ -0,0 +1 @@ +{"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}],"bytecode":{"object":"0x","sourceMap":"","linkReferences":{}},"deployedBytecode":{"object":"0x","sourceMap":"","linkReferences":{}},"methodIdentifiers":{"DOMAIN_SEPARATOR()":"3644e515","allowance(address,address)":"dd62ed3e","approve(address,uint256)":"095ea7b3","balanceOf(address)":"70a08231","decimals()":"313ce567","name()":"06fdde03","nonces(address)":"7ecebe00","permit(address,address,uint256,uint256,uint8,bytes32,bytes32)":"d505accf","symbol()":"95d89b41","totalSupply()":"18160ddd","transfer(address,uint256)":"a9059cbb","transferFrom(address,address,uint256)":"23b872dd"},"rawMetadata":"{\"compiler\":{\"version\":\"0.8.25+commit.b61c2a91\"},\"language\":\"Solidity\",\"output\":{\"abi\":[{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"address\",\"name\":\"owner\",\"type\":\"address\"},{\"indexed\":true,\"internalType\":\"address\",\"name\":\"spender\",\"type\":\"address\"},{\"indexed\":false,\"internalType\":\"uint256\",\"name\":\"amount\",\"type\":\"uint256\"}],\"name\":\"Approval\",\"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\"}],\"name\":\"Transfer\",\"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\"}],\"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\":\"\",\"type\":\"address\"}],\"name\":\"balanceOf\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"\",\"type\":\"uint256\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"decimals\",\"outputs\":[{\"internalType\":\"uint8\",\"name\":\"\",\"type\":\"uint8\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"name\",\"outputs\":[{\"internalType\":\"string\",\"name\":\"\",\"type\":\"string\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"\",\"type\":\"address\"}],\"name\":\"nonces\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"\",\"type\":\"uint256\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"owner\",\"type\":\"address\"},{\"internalType\":\"address\",\"name\":\"spender\",\"type\":\"address\"},{\"internalType\":\"uint256\",\"name\":\"value\",\"type\":\"uint256\"},{\"internalType\":\"uint256\",\"name\":\"deadline\",\"type\":\"uint256\"},{\"internalType\":\"uint8\",\"name\":\"v\",\"type\":\"uint8\"},{\"internalType\":\"bytes32\",\"name\":\"r\",\"type\":\"bytes32\"},{\"internalType\":\"bytes32\",\"name\":\"s\",\"type\":\"bytes32\"}],\"name\":\"permit\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"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\"}],\"devdoc\":{\"author\":\"Solmate (https://github.com/Rari-Capital/solmate/blob/main/src/tokens/ERC20.sol)Modified from Uniswap (https://github.com/Uniswap/uniswap-v2-core/blob/master/contracts/UniswapV2ERC20.sol)\",\"details\":\"Do not manually set balances without updating totalSupply, as the sum of all user balances must not exceed it.\",\"kind\":\"dev\",\"methods\":{},\"version\":1},\"userdoc\":{\"kind\":\"user\",\"methods\":{},\"notice\":\"Modern and gas efficient ERC20 + EIP-2612 implementation.\",\"version\":1}},\"settings\":{\"compilationTarget\":{\"lib/solmate/src/tokens/ERC20.sol\":\"ERC20\"},\"evmVersion\":\"cancun\",\"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/\",\":automate/=lib/automate/contracts/\",\":ds-test/=lib/forge-std/lib/ds-test/src/\",\":erc4626-tests/=lib/automate/lib/openzeppelin-contracts/lib/erc4626-tests/\",\":forge-std/=lib/forge-std/src/\",\":gelato/=lib/automate/contracts/\",\":hardhat/=lib/automate/node_modules/hardhat/\",\":kontrol-cheatcodes/=lib/kontrol-cheatcodes/src/\",\":lib-keccak/=lib/lib-keccak/contracts/\",\":openzeppelin-contracts-upgradeable/=lib/openzeppelin-contracts-upgradeable/\",\":openzeppelin-contracts/=lib/openzeppelin-contracts/\",\":prb-test/=lib/automate/lib/prb-test/src/\",\":prb/-est/=lib/automate/lib/prb-test/src/\",\":safe-contracts/=lib/safe-contracts/contracts/\",\":solady/=lib/solady/\",\":solmate/=lib/solmate/src/\"]},\"sources\":{\"lib/solmate/src/tokens/ERC20.sol\":{\"keccak256\":\"0x43aa1509bb753f053143530705d9c4eee415691d26a4779769bf028a74e6ac69\",\"license\":\"MIT\",\"urls\":[\"bzz-raw://fb440672ebad7d487c1600e406e140fd1ffc4bd7520c86b5709183ca2602da58\",\"dweb:/ipfs/QmNgZaBoAZwnwm4mTL1cUZnMtvt1iZnruMnfpJnDu6upuc\"]}},\"version\":1}","metadata":{"compiler":{"version":"0.8.25+commit.b61c2a91"},"language":"Solidity","output":{"abi":[{"inputs":[{"internalType":"address","name":"owner","type":"address","indexed":true},{"internalType":"address","name":"spender","type":"address","indexed":true},{"internalType":"uint256","name":"amount","type":"uint256","indexed":false}],"type":"event","name":"Approval","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}],"type":"event","name":"Transfer","anonymous":false},{"inputs":[],"stateMutability":"view","type":"function","name":"DOMAIN_SEPARATOR","outputs":[{"internalType":"bytes32","name":"","type":"bytes32"}]},{"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":"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":"","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":"view","type":"function","name":"name","outputs":[{"internalType":"string","name":"","type":"string"}]},{"inputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function","name":"nonces","outputs":[{"internalType":"uint256","name":"","type":"uint256"}]},{"inputs":[{"internalType":"address","name":"owner","type":"address"},{"internalType":"address","name":"spender","type":"address"},{"internalType":"uint256","name":"value","type":"uint256"},{"internalType":"uint256","name":"deadline","type":"uint256"},{"internalType":"uint8","name":"v","type":"uint8"},{"internalType":"bytes32","name":"r","type":"bytes32"},{"internalType":"bytes32","name":"s","type":"bytes32"}],"stateMutability":"nonpayable","type":"function","name":"permit"},{"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"}]}],"devdoc":{"kind":"dev","methods":{},"version":1},"userdoc":{"kind":"user","methods":{},"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/","automate/=lib/automate/contracts/","ds-test/=lib/forge-std/lib/ds-test/src/","erc4626-tests/=lib/automate/lib/openzeppelin-contracts/lib/erc4626-tests/","forge-std/=lib/forge-std/src/","gelato/=lib/automate/contracts/","hardhat/=lib/automate/node_modules/hardhat/","kontrol-cheatcodes/=lib/kontrol-cheatcodes/src/","lib-keccak/=lib/lib-keccak/contracts/","openzeppelin-contracts-upgradeable/=lib/openzeppelin-contracts-upgradeable/","openzeppelin-contracts/=lib/openzeppelin-contracts/","prb-test/=lib/automate/lib/prb-test/src/","prb/-est/=lib/automate/lib/prb-test/src/","safe-contracts/=lib/safe-contracts/contracts/","solady/=lib/solady/","solmate/=lib/solmate/src/"],"optimizer":{"enabled":true,"runs":999999},"metadata":{"bytecodeHash":"none"},"compilationTarget":{"lib/solmate/src/tokens/ERC20.sol":"ERC20"},"evmVersion":"cancun","libraries":{}},"sources":{"lib/solmate/src/tokens/ERC20.sol":{"keccak256":"0x43aa1509bb753f053143530705d9c4eee415691d26a4779769bf028a74e6ac69","urls":["bzz-raw://fb440672ebad7d487c1600e406e140fd1ffc4bd7520c86b5709183ca2602da58","dweb:/ipfs/QmNgZaBoAZwnwm4mTL1cUZnMtvt1iZnruMnfpJnDu6upuc"],"license":"MIT"}},"version":1},"storageLayout":{"storage":[{"astId":52092,"contract":"lib/solmate/src/tokens/ERC20.sol:ERC20","label":"name","offset":0,"slot":"0","type":"t_string_storage"},{"astId":52094,"contract":"lib/solmate/src/tokens/ERC20.sol:ERC20","label":"symbol","offset":0,"slot":"1","type":"t_string_storage"},{"astId":52098,"contract":"lib/solmate/src/tokens/ERC20.sol:ERC20","label":"totalSupply","offset":0,"slot":"2","type":"t_uint256"},{"astId":52102,"contract":"lib/solmate/src/tokens/ERC20.sol:ERC20","label":"balanceOf","offset":0,"slot":"3","type":"t_mapping(t_address,t_uint256)"},{"astId":52108,"contract":"lib/solmate/src/tokens/ERC20.sol:ERC20","label":"allowance","offset":0,"slot":"4","type":"t_mapping(t_address,t_mapping(t_address,t_uint256))"},{"astId":52116,"contract":"lib/solmate/src/tokens/ERC20.sol:ERC20","label":"nonces","offset":0,"slot":"5","type":"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"}}},"userdoc":{"version":1,"kind":"user","notice":"Modern and gas efficient ERC20 + EIP-2612 implementation."},"devdoc":{"version":1,"kind":"dev","author":"Solmate (https://github.com/Rari-Capital/solmate/blob/main/src/tokens/ERC20.sol)Modified from Uniswap (https://github.com/Uniswap/uniswap-v2-core/blob/master/contracts/UniswapV2ERC20.sol)","details":"Do not manually set balances without updating totalSupply, as the sum of all user balances must not exceed it."},"ast":{"absolutePath":"lib/solmate/src/tokens/ERC20.sol","id":52460,"exportedSymbols":{"ERC20":[52459]},"nodeType":"SourceUnit","src":"32:6767:61","nodes":[{"id":52073,"nodeType":"PragmaDirective","src":"32:24:61","nodes":[],"literals":["solidity",">=","0.8",".0"]},{"id":52459,"nodeType":"ContractDefinition","src":"461:6337:61","nodes":[{"id":52082,"nodeType":"EventDefinition","src":"670:73:61","nodes":[],"anonymous":false,"eventSelector":"ddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef","name":"Transfer","nameLocation":"676:8:61","parameters":{"id":52081,"nodeType":"ParameterList","parameters":[{"constant":false,"id":52076,"indexed":true,"mutability":"mutable","name":"from","nameLocation":"701:4:61","nodeType":"VariableDeclaration","scope":52082,"src":"685:20:61","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"},"typeName":{"id":52075,"name":"address","nodeType":"ElementaryTypeName","src":"685:7:61","stateMutability":"nonpayable","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"}},"visibility":"internal"},{"constant":false,"id":52078,"indexed":true,"mutability":"mutable","name":"to","nameLocation":"723:2:61","nodeType":"VariableDeclaration","scope":52082,"src":"707:18:61","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"},"typeName":{"id":52077,"name":"address","nodeType":"ElementaryTypeName","src":"707:7:61","stateMutability":"nonpayable","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"}},"visibility":"internal"},{"constant":false,"id":52080,"indexed":false,"mutability":"mutable","name":"amount","nameLocation":"735:6:61","nodeType":"VariableDeclaration","scope":52082,"src":"727:14:61","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"},"typeName":{"id":52079,"name":"uint256","nodeType":"ElementaryTypeName","src":"727:7:61","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"visibility":"internal"}],"src":"684:58:61"}},{"id":52090,"nodeType":"EventDefinition","src":"749:79:61","nodes":[],"anonymous":false,"eventSelector":"8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b925","name":"Approval","nameLocation":"755:8:61","parameters":{"id":52089,"nodeType":"ParameterList","parameters":[{"constant":false,"id":52084,"indexed":true,"mutability":"mutable","name":"owner","nameLocation":"780:5:61","nodeType":"VariableDeclaration","scope":52090,"src":"764:21:61","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"},"typeName":{"id":52083,"name":"address","nodeType":"ElementaryTypeName","src":"764:7:61","stateMutability":"nonpayable","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"}},"visibility":"internal"},{"constant":false,"id":52086,"indexed":true,"mutability":"mutable","name":"spender","nameLocation":"803:7:61","nodeType":"VariableDeclaration","scope":52090,"src":"787:23:61","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"},"typeName":{"id":52085,"name":"address","nodeType":"ElementaryTypeName","src":"787:7:61","stateMutability":"nonpayable","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"}},"visibility":"internal"},{"constant":false,"id":52088,"indexed":false,"mutability":"mutable","name":"amount","nameLocation":"820:6:61","nodeType":"VariableDeclaration","scope":52090,"src":"812:14:61","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"},"typeName":{"id":52087,"name":"uint256","nodeType":"ElementaryTypeName","src":"812:7:61","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"visibility":"internal"}],"src":"763:64:61"}},{"id":52092,"nodeType":"VariableDeclaration","src":"1018:18:61","nodes":[],"constant":false,"functionSelector":"06fdde03","mutability":"mutable","name":"name","nameLocation":"1032:4:61","scope":52459,"stateVariable":true,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_string_storage","typeString":"string"},"typeName":{"id":52091,"name":"string","nodeType":"ElementaryTypeName","src":"1018:6:61","typeDescriptions":{"typeIdentifier":"t_string_storage_ptr","typeString":"string"}},"visibility":"public"},{"id":52094,"nodeType":"VariableDeclaration","src":"1043:20:61","nodes":[],"constant":false,"functionSelector":"95d89b41","mutability":"mutable","name":"symbol","nameLocation":"1057:6:61","scope":52459,"stateVariable":true,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_string_storage","typeString":"string"},"typeName":{"id":52093,"name":"string","nodeType":"ElementaryTypeName","src":"1043:6:61","typeDescriptions":{"typeIdentifier":"t_string_storage_ptr","typeString":"string"}},"visibility":"public"},{"id":52096,"nodeType":"VariableDeclaration","src":"1070:31:61","nodes":[],"constant":false,"functionSelector":"313ce567","mutability":"immutable","name":"decimals","nameLocation":"1093:8:61","scope":52459,"stateVariable":true,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_uint8","typeString":"uint8"},"typeName":{"id":52095,"name":"uint8","nodeType":"ElementaryTypeName","src":"1070:5:61","typeDescriptions":{"typeIdentifier":"t_uint8","typeString":"uint8"}},"visibility":"public"},{"id":52098,"nodeType":"VariableDeclaration","src":"1291:26:61","nodes":[],"constant":false,"functionSelector":"18160ddd","mutability":"mutable","name":"totalSupply","nameLocation":"1306:11:61","scope":52459,"stateVariable":true,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"},"typeName":{"id":52097,"name":"uint256","nodeType":"ElementaryTypeName","src":"1291:7:61","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"visibility":"public"},{"id":52102,"nodeType":"VariableDeclaration","src":"1324:44:61","nodes":[],"constant":false,"functionSelector":"70a08231","mutability":"mutable","name":"balanceOf","nameLocation":"1359:9:61","scope":52459,"stateVariable":true,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_mapping$_t_address_$_t_uint256_$","typeString":"mapping(address => uint256)"},"typeName":{"id":52101,"keyName":"","keyNameLocation":"-1:-1:-1","keyType":{"id":52099,"name":"address","nodeType":"ElementaryTypeName","src":"1332:7:61","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"}},"nodeType":"Mapping","src":"1324:27:61","typeDescriptions":{"typeIdentifier":"t_mapping$_t_address_$_t_uint256_$","typeString":"mapping(address => uint256)"},"valueName":"","valueNameLocation":"-1:-1:-1","valueType":{"id":52100,"name":"uint256","nodeType":"ElementaryTypeName","src":"1343:7:61","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}}},"visibility":"public"},{"id":52108,"nodeType":"VariableDeclaration","src":"1375:64:61","nodes":[],"constant":false,"functionSelector":"dd62ed3e","mutability":"mutable","name":"allowance","nameLocation":"1430:9:61","scope":52459,"stateVariable":true,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_mapping$_t_address_$_t_mapping$_t_address_$_t_uint256_$_$","typeString":"mapping(address => mapping(address => uint256))"},"typeName":{"id":52107,"keyName":"","keyNameLocation":"-1:-1:-1","keyType":{"id":52103,"name":"address","nodeType":"ElementaryTypeName","src":"1383:7:61","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"}},"nodeType":"Mapping","src":"1375:47:61","typeDescriptions":{"typeIdentifier":"t_mapping$_t_address_$_t_mapping$_t_address_$_t_uint256_$_$","typeString":"mapping(address => mapping(address => uint256))"},"valueName":"","valueNameLocation":"-1:-1:-1","valueType":{"id":52106,"keyName":"","keyNameLocation":"-1:-1:-1","keyType":{"id":52104,"name":"address","nodeType":"ElementaryTypeName","src":"1402:7:61","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"}},"nodeType":"Mapping","src":"1394:27:61","typeDescriptions":{"typeIdentifier":"t_mapping$_t_address_$_t_uint256_$","typeString":"mapping(address => uint256)"},"valueName":"","valueNameLocation":"-1:-1:-1","valueType":{"id":52105,"name":"uint256","nodeType":"ElementaryTypeName","src":"1413:7:61","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}}}},"visibility":"public"},{"id":52110,"nodeType":"VariableDeclaration","src":"1630:43:61","nodes":[],"constant":false,"mutability":"immutable","name":"INITIAL_CHAIN_ID","nameLocation":"1657:16:61","scope":52459,"stateVariable":true,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"},"typeName":{"id":52109,"name":"uint256","nodeType":"ElementaryTypeName","src":"1630:7:61","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"visibility":"internal"},{"id":52112,"nodeType":"VariableDeclaration","src":"1680:51:61","nodes":[],"constant":false,"mutability":"immutable","name":"INITIAL_DOMAIN_SEPARATOR","nameLocation":"1707:24:61","scope":52459,"stateVariable":true,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_bytes32","typeString":"bytes32"},"typeName":{"id":52111,"name":"bytes32","nodeType":"ElementaryTypeName","src":"1680:7:61","typeDescriptions":{"typeIdentifier":"t_bytes32","typeString":"bytes32"}},"visibility":"internal"},{"id":52116,"nodeType":"VariableDeclaration","src":"1738:41:61","nodes":[],"constant":false,"functionSelector":"7ecebe00","mutability":"mutable","name":"nonces","nameLocation":"1773:6:61","scope":52459,"stateVariable":true,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_mapping$_t_address_$_t_uint256_$","typeString":"mapping(address => uint256)"},"typeName":{"id":52115,"keyName":"","keyNameLocation":"-1:-1:-1","keyType":{"id":52113,"name":"address","nodeType":"ElementaryTypeName","src":"1746:7:61","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"}},"nodeType":"Mapping","src":"1738:27:61","typeDescriptions":{"typeIdentifier":"t_mapping$_t_address_$_t_uint256_$","typeString":"mapping(address => uint256)"},"valueName":"","valueNameLocation":"-1:-1:-1","valueType":{"id":52114,"name":"uint256","nodeType":"ElementaryTypeName","src":"1757:7:61","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}}},"visibility":"public"},{"id":52148,"nodeType":"FunctionDefinition","src":"1968:292:61","nodes":[],"body":{"id":52147,"nodeType":"Block","src":"2071:189:61","nodes":[],"statements":[{"expression":{"id":52127,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"leftHandSide":{"id":52125,"name":"name","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":52092,"src":"2081:4:61","typeDescriptions":{"typeIdentifier":"t_string_storage","typeString":"string storage ref"}},"nodeType":"Assignment","operator":"=","rightHandSide":{"id":52126,"name":"_name","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":52118,"src":"2088:5:61","typeDescriptions":{"typeIdentifier":"t_string_memory_ptr","typeString":"string memory"}},"src":"2081:12:61","typeDescriptions":{"typeIdentifier":"t_string_storage","typeString":"string storage ref"}},"id":52128,"nodeType":"ExpressionStatement","src":"2081:12:61"},{"expression":{"id":52131,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"leftHandSide":{"id":52129,"name":"symbol","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":52094,"src":"2103:6:61","typeDescriptions":{"typeIdentifier":"t_string_storage","typeString":"string storage ref"}},"nodeType":"Assignment","operator":"=","rightHandSide":{"id":52130,"name":"_symbol","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":52120,"src":"2112:7:61","typeDescriptions":{"typeIdentifier":"t_string_memory_ptr","typeString":"string memory"}},"src":"2103:16:61","typeDescriptions":{"typeIdentifier":"t_string_storage","typeString":"string storage ref"}},"id":52132,"nodeType":"ExpressionStatement","src":"2103:16:61"},{"expression":{"id":52135,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"leftHandSide":{"id":52133,"name":"decimals","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":52096,"src":"2129:8:61","typeDescriptions":{"typeIdentifier":"t_uint8","typeString":"uint8"}},"nodeType":"Assignment","operator":"=","rightHandSide":{"id":52134,"name":"_decimals","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":52122,"src":"2140:9:61","typeDescriptions":{"typeIdentifier":"t_uint8","typeString":"uint8"}},"src":"2129:20:61","typeDescriptions":{"typeIdentifier":"t_uint8","typeString":"uint8"}},"id":52136,"nodeType":"ExpressionStatement","src":"2129:20:61"},{"expression":{"id":52140,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"leftHandSide":{"id":52137,"name":"INITIAL_CHAIN_ID","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":52110,"src":"2160:16:61","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"nodeType":"Assignment","operator":"=","rightHandSide":{"expression":{"id":52138,"name":"block","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":-4,"src":"2179:5:61","typeDescriptions":{"typeIdentifier":"t_magic_block","typeString":"block"}},"id":52139,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"memberLocation":"2185:7:61","memberName":"chainid","nodeType":"MemberAccess","src":"2179:13:61","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"src":"2160:32:61","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"id":52141,"nodeType":"ExpressionStatement","src":"2160:32:61"},{"expression":{"id":52145,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"leftHandSide":{"id":52142,"name":"INITIAL_DOMAIN_SEPARATOR","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":52112,"src":"2202:24:61","typeDescriptions":{"typeIdentifier":"t_bytes32","typeString":"bytes32"}},"nodeType":"Assignment","operator":"=","rightHandSide":{"arguments":[],"expression":{"argumentTypes":[],"id":52143,"name":"computeDomainSeparator","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":52402,"src":"2229:22:61","typeDescriptions":{"typeIdentifier":"t_function_internal_view$__$returns$_t_bytes32_$","typeString":"function () view returns (bytes32)"}},"id":52144,"isConstant":false,"isLValue":false,"isPure":false,"kind":"functionCall","lValueRequested":false,"nameLocations":[],"names":[],"nodeType":"FunctionCall","src":"2229:24:61","tryCall":false,"typeDescriptions":{"typeIdentifier":"t_bytes32","typeString":"bytes32"}},"src":"2202:51:61","typeDescriptions":{"typeIdentifier":"t_bytes32","typeString":"bytes32"}},"id":52146,"nodeType":"ExpressionStatement","src":"2202:51:61"}]},"implemented":true,"kind":"constructor","modifiers":[],"name":"","nameLocation":"-1:-1:-1","parameters":{"id":52123,"nodeType":"ParameterList","parameters":[{"constant":false,"id":52118,"mutability":"mutable","name":"_name","nameLocation":"2003:5:61","nodeType":"VariableDeclaration","scope":52148,"src":"1989:19:61","stateVariable":false,"storageLocation":"memory","typeDescriptions":{"typeIdentifier":"t_string_memory_ptr","typeString":"string"},"typeName":{"id":52117,"name":"string","nodeType":"ElementaryTypeName","src":"1989:6:61","typeDescriptions":{"typeIdentifier":"t_string_storage_ptr","typeString":"string"}},"visibility":"internal"},{"constant":false,"id":52120,"mutability":"mutable","name":"_symbol","nameLocation":"2032:7:61","nodeType":"VariableDeclaration","scope":52148,"src":"2018:21:61","stateVariable":false,"storageLocation":"memory","typeDescriptions":{"typeIdentifier":"t_string_memory_ptr","typeString":"string"},"typeName":{"id":52119,"name":"string","nodeType":"ElementaryTypeName","src":"2018:6:61","typeDescriptions":{"typeIdentifier":"t_string_storage_ptr","typeString":"string"}},"visibility":"internal"},{"constant":false,"id":52122,"mutability":"mutable","name":"_decimals","nameLocation":"2055:9:61","nodeType":"VariableDeclaration","scope":52148,"src":"2049:15:61","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_uint8","typeString":"uint8"},"typeName":{"id":52121,"name":"uint8","nodeType":"ElementaryTypeName","src":"2049:5:61","typeDescriptions":{"typeIdentifier":"t_uint8","typeString":"uint8"}},"visibility":"internal"}],"src":"1979:91:61"},"returnParameters":{"id":52124,"nodeType":"ParameterList","parameters":[],"src":"2071:0:61"},"scope":52459,"stateMutability":"nonpayable","virtual":false,"visibility":"internal"},{"id":52176,"nodeType":"FunctionDefinition","src":"2448:211:61","nodes":[],"body":{"id":52175,"nodeType":"Block","src":"2528:131:61","nodes":[],"statements":[{"expression":{"id":52164,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"leftHandSide":{"baseExpression":{"baseExpression":{"id":52157,"name":"allowance","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":52108,"src":"2538:9:61","typeDescriptions":{"typeIdentifier":"t_mapping$_t_address_$_t_mapping$_t_address_$_t_uint256_$_$","typeString":"mapping(address => mapping(address => uint256))"}},"id":52161,"indexExpression":{"expression":{"id":52158,"name":"msg","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":-15,"src":"2548:3:61","typeDescriptions":{"typeIdentifier":"t_magic_message","typeString":"msg"}},"id":52159,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"memberLocation":"2552:6:61","memberName":"sender","nodeType":"MemberAccess","src":"2548:10:61","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"}},"isConstant":false,"isLValue":true,"isPure":false,"lValueRequested":false,"nodeType":"IndexAccess","src":"2538:21:61","typeDescriptions":{"typeIdentifier":"t_mapping$_t_address_$_t_uint256_$","typeString":"mapping(address => uint256)"}},"id":52162,"indexExpression":{"id":52160,"name":"spender","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":52150,"src":"2560:7:61","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"}},"isConstant":false,"isLValue":true,"isPure":false,"lValueRequested":true,"nodeType":"IndexAccess","src":"2538:30:61","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"nodeType":"Assignment","operator":"=","rightHandSide":{"id":52163,"name":"amount","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":52152,"src":"2571:6:61","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"src":"2538:39:61","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"id":52165,"nodeType":"ExpressionStatement","src":"2538:39:61"},{"eventCall":{"arguments":[{"expression":{"id":52167,"name":"msg","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":-15,"src":"2602:3:61","typeDescriptions":{"typeIdentifier":"t_magic_message","typeString":"msg"}},"id":52168,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"memberLocation":"2606:6:61","memberName":"sender","nodeType":"MemberAccess","src":"2602:10:61","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"}},{"id":52169,"name":"spender","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":52150,"src":"2614:7:61","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"}},{"id":52170,"name":"amount","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":52152,"src":"2623:6:61","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}}],"expression":{"argumentTypes":[{"typeIdentifier":"t_address","typeString":"address"},{"typeIdentifier":"t_address","typeString":"address"},{"typeIdentifier":"t_uint256","typeString":"uint256"}],"id":52166,"name":"Approval","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":52090,"src":"2593:8:61","typeDescriptions":{"typeIdentifier":"t_function_event_nonpayable$_t_address_$_t_address_$_t_uint256_$returns$__$","typeString":"function (address,address,uint256)"}},"id":52171,"isConstant":false,"isLValue":false,"isPure":false,"kind":"functionCall","lValueRequested":false,"nameLocations":[],"names":[],"nodeType":"FunctionCall","src":"2593:37:61","tryCall":false,"typeDescriptions":{"typeIdentifier":"t_tuple$__$","typeString":"tuple()"}},"id":52172,"nodeType":"EmitStatement","src":"2588:42:61"},{"expression":{"hexValue":"74727565","id":52173,"isConstant":false,"isLValue":false,"isPure":true,"kind":"bool","lValueRequested":false,"nodeType":"Literal","src":"2648:4:61","typeDescriptions":{"typeIdentifier":"t_bool","typeString":"bool"},"value":"true"},"functionReturnParameters":52156,"id":52174,"nodeType":"Return","src":"2641:11:61"}]},"functionSelector":"095ea7b3","implemented":true,"kind":"function","modifiers":[],"name":"approve","nameLocation":"2457:7:61","parameters":{"id":52153,"nodeType":"ParameterList","parameters":[{"constant":false,"id":52150,"mutability":"mutable","name":"spender","nameLocation":"2473:7:61","nodeType":"VariableDeclaration","scope":52176,"src":"2465:15:61","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"},"typeName":{"id":52149,"name":"address","nodeType":"ElementaryTypeName","src":"2465:7:61","stateMutability":"nonpayable","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"}},"visibility":"internal"},{"constant":false,"id":52152,"mutability":"mutable","name":"amount","nameLocation":"2490:6:61","nodeType":"VariableDeclaration","scope":52176,"src":"2482:14:61","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"},"typeName":{"id":52151,"name":"uint256","nodeType":"ElementaryTypeName","src":"2482:7:61","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"visibility":"internal"}],"src":"2464:33:61"},"returnParameters":{"id":52156,"nodeType":"ParameterList","parameters":[{"constant":false,"id":52155,"mutability":"mutable","name":"","nameLocation":"-1:-1:-1","nodeType":"VariableDeclaration","scope":52176,"src":"2522:4:61","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_bool","typeString":"bool"},"typeName":{"id":52154,"name":"bool","nodeType":"ElementaryTypeName","src":"2522:4:61","typeDescriptions":{"typeIdentifier":"t_bool","typeString":"bool"}},"visibility":"internal"}],"src":"2521:6:61"},"scope":52459,"stateMutability":"nonpayable","virtual":true,"visibility":"public"},{"id":52209,"nodeType":"FunctionDefinition","src":"2665:373:61","nodes":[],"body":{"id":52208,"nodeType":"Block","src":"2741:297:61","nodes":[],"statements":[{"expression":{"id":52190,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"leftHandSide":{"baseExpression":{"id":52185,"name":"balanceOf","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":52102,"src":"2751:9:61","typeDescriptions":{"typeIdentifier":"t_mapping$_t_address_$_t_uint256_$","typeString":"mapping(address => uint256)"}},"id":52188,"indexExpression":{"expression":{"id":52186,"name":"msg","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":-15,"src":"2761:3:61","typeDescriptions":{"typeIdentifier":"t_magic_message","typeString":"msg"}},"id":52187,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"memberLocation":"2765:6:61","memberName":"sender","nodeType":"MemberAccess","src":"2761:10:61","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"}},"isConstant":false,"isLValue":true,"isPure":false,"lValueRequested":true,"nodeType":"IndexAccess","src":"2751:21:61","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"nodeType":"Assignment","operator":"-=","rightHandSide":{"id":52189,"name":"amount","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":52180,"src":"2776:6:61","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"src":"2751:31:61","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"id":52191,"nodeType":"ExpressionStatement","src":"2751:31:61"},{"id":52198,"nodeType":"UncheckedBlock","src":"2904:58:61","statements":[{"expression":{"id":52196,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"leftHandSide":{"baseExpression":{"id":52192,"name":"balanceOf","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":52102,"src":"2928:9:61","typeDescriptions":{"typeIdentifier":"t_mapping$_t_address_$_t_uint256_$","typeString":"mapping(address => uint256)"}},"id":52194,"indexExpression":{"id":52193,"name":"to","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":52178,"src":"2938:2:61","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"}},"isConstant":false,"isLValue":true,"isPure":false,"lValueRequested":true,"nodeType":"IndexAccess","src":"2928:13:61","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"nodeType":"Assignment","operator":"+=","rightHandSide":{"id":52195,"name":"amount","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":52180,"src":"2945:6:61","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"src":"2928:23:61","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"id":52197,"nodeType":"ExpressionStatement","src":"2928:23:61"}]},{"eventCall":{"arguments":[{"expression":{"id":52200,"name":"msg","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":-15,"src":"2986:3:61","typeDescriptions":{"typeIdentifier":"t_magic_message","typeString":"msg"}},"id":52201,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"memberLocation":"2990:6:61","memberName":"sender","nodeType":"MemberAccess","src":"2986:10:61","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"}},{"id":52202,"name":"to","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":52178,"src":"2998:2:61","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"}},{"id":52203,"name":"amount","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":52180,"src":"3002:6:61","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}}],"expression":{"argumentTypes":[{"typeIdentifier":"t_address","typeString":"address"},{"typeIdentifier":"t_address","typeString":"address"},{"typeIdentifier":"t_uint256","typeString":"uint256"}],"id":52199,"name":"Transfer","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":52082,"src":"2977:8:61","typeDescriptions":{"typeIdentifier":"t_function_event_nonpayable$_t_address_$_t_address_$_t_uint256_$returns$__$","typeString":"function (address,address,uint256)"}},"id":52204,"isConstant":false,"isLValue":false,"isPure":false,"kind":"functionCall","lValueRequested":false,"nameLocations":[],"names":[],"nodeType":"FunctionCall","src":"2977:32:61","tryCall":false,"typeDescriptions":{"typeIdentifier":"t_tuple$__$","typeString":"tuple()"}},"id":52205,"nodeType":"EmitStatement","src":"2972:37:61"},{"expression":{"hexValue":"74727565","id":52206,"isConstant":false,"isLValue":false,"isPure":true,"kind":"bool","lValueRequested":false,"nodeType":"Literal","src":"3027:4:61","typeDescriptions":{"typeIdentifier":"t_bool","typeString":"bool"},"value":"true"},"functionReturnParameters":52184,"id":52207,"nodeType":"Return","src":"3020:11:61"}]},"functionSelector":"a9059cbb","implemented":true,"kind":"function","modifiers":[],"name":"transfer","nameLocation":"2674:8:61","parameters":{"id":52181,"nodeType":"ParameterList","parameters":[{"constant":false,"id":52178,"mutability":"mutable","name":"to","nameLocation":"2691:2:61","nodeType":"VariableDeclaration","scope":52209,"src":"2683:10:61","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"},"typeName":{"id":52177,"name":"address","nodeType":"ElementaryTypeName","src":"2683:7:61","stateMutability":"nonpayable","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"}},"visibility":"internal"},{"constant":false,"id":52180,"mutability":"mutable","name":"amount","nameLocation":"2703:6:61","nodeType":"VariableDeclaration","scope":52209,"src":"2695:14:61","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"},"typeName":{"id":52179,"name":"uint256","nodeType":"ElementaryTypeName","src":"2695:7:61","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"visibility":"internal"}],"src":"2682:28:61"},"returnParameters":{"id":52184,"nodeType":"ParameterList","parameters":[{"constant":false,"id":52183,"mutability":"mutable","name":"","nameLocation":"-1:-1:-1","nodeType":"VariableDeclaration","scope":52209,"src":"2735:4:61","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_bool","typeString":"bool"},"typeName":{"id":52182,"name":"bool","nodeType":"ElementaryTypeName","src":"2735:4:61","typeDescriptions":{"typeIdentifier":"t_bool","typeString":"bool"}},"visibility":"internal"}],"src":"2734:6:61"},"scope":52459,"stateMutability":"nonpayable","virtual":true,"visibility":"public"},{"id":52270,"nodeType":"FunctionDefinition","src":"3044:592:61","nodes":[],"body":{"id":52269,"nodeType":"Block","src":"3168:468:61","nodes":[],"statements":[{"assignments":[52221],"declarations":[{"constant":false,"id":52221,"mutability":"mutable","name":"allowed","nameLocation":"3186:7:61","nodeType":"VariableDeclaration","scope":52269,"src":"3178:15:61","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"},"typeName":{"id":52220,"name":"uint256","nodeType":"ElementaryTypeName","src":"3178:7:61","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"visibility":"internal"}],"id":52228,"initialValue":{"baseExpression":{"baseExpression":{"id":52222,"name":"allowance","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":52108,"src":"3196:9:61","typeDescriptions":{"typeIdentifier":"t_mapping$_t_address_$_t_mapping$_t_address_$_t_uint256_$_$","typeString":"mapping(address => mapping(address => uint256))"}},"id":52224,"indexExpression":{"id":52223,"name":"from","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":52211,"src":"3206:4:61","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"}},"isConstant":false,"isLValue":true,"isPure":false,"lValueRequested":false,"nodeType":"IndexAccess","src":"3196:15:61","typeDescriptions":{"typeIdentifier":"t_mapping$_t_address_$_t_uint256_$","typeString":"mapping(address => uint256)"}},"id":52227,"indexExpression":{"expression":{"id":52225,"name":"msg","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":-15,"src":"3212:3:61","typeDescriptions":{"typeIdentifier":"t_magic_message","typeString":"msg"}},"id":52226,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"memberLocation":"3216:6:61","memberName":"sender","nodeType":"MemberAccess","src":"3212:10:61","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"}},"isConstant":false,"isLValue":true,"isPure":false,"lValueRequested":false,"nodeType":"IndexAccess","src":"3196:27:61","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"nodeType":"VariableDeclarationStatement","src":"3178:45:61"},{"condition":{"commonType":{"typeIdentifier":"t_uint256","typeString":"uint256"},"id":52235,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"leftExpression":{"id":52229,"name":"allowed","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":52221,"src":"3274:7:61","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"nodeType":"BinaryOperation","operator":"!=","rightExpression":{"expression":{"arguments":[{"id":52232,"isConstant":false,"isLValue":false,"isPure":true,"lValueRequested":false,"nodeType":"ElementaryTypeNameExpression","src":"3290:7:61","typeDescriptions":{"typeIdentifier":"t_type$_t_uint256_$","typeString":"type(uint256)"},"typeName":{"id":52231,"name":"uint256","nodeType":"ElementaryTypeName","src":"3290:7:61","typeDescriptions":{}}}],"expression":{"argumentTypes":[{"typeIdentifier":"t_type$_t_uint256_$","typeString":"type(uint256)"}],"id":52230,"name":"type","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":-27,"src":"3285:4:61","typeDescriptions":{"typeIdentifier":"t_function_metatype_pure$__$returns$__$","typeString":"function () pure"}},"id":52233,"isConstant":false,"isLValue":false,"isPure":true,"kind":"functionCall","lValueRequested":false,"nameLocations":[],"names":[],"nodeType":"FunctionCall","src":"3285:13:61","tryCall":false,"typeDescriptions":{"typeIdentifier":"t_magic_meta_type_t_uint256","typeString":"type(uint256)"}},"id":52234,"isConstant":false,"isLValue":false,"isPure":true,"lValueRequested":false,"memberLocation":"3299:3:61","memberName":"max","nodeType":"MemberAccess","src":"3285:17:61","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"src":"3274:28:61","typeDescriptions":{"typeIdentifier":"t_bool","typeString":"bool"}},"id":52247,"nodeType":"IfStatement","src":"3270:80:61","trueBody":{"expression":{"id":52245,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"leftHandSide":{"baseExpression":{"baseExpression":{"id":52236,"name":"allowance","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":52108,"src":"3304:9:61","typeDescriptions":{"typeIdentifier":"t_mapping$_t_address_$_t_mapping$_t_address_$_t_uint256_$_$","typeString":"mapping(address => mapping(address => uint256))"}},"id":52240,"indexExpression":{"id":52237,"name":"from","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":52211,"src":"3314:4:61","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"}},"isConstant":false,"isLValue":true,"isPure":false,"lValueRequested":false,"nodeType":"IndexAccess","src":"3304:15:61","typeDescriptions":{"typeIdentifier":"t_mapping$_t_address_$_t_uint256_$","typeString":"mapping(address => uint256)"}},"id":52241,"indexExpression":{"expression":{"id":52238,"name":"msg","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":-15,"src":"3320:3:61","typeDescriptions":{"typeIdentifier":"t_magic_message","typeString":"msg"}},"id":52239,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"memberLocation":"3324:6:61","memberName":"sender","nodeType":"MemberAccess","src":"3320:10:61","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"}},"isConstant":false,"isLValue":true,"isPure":false,"lValueRequested":true,"nodeType":"IndexAccess","src":"3304:27:61","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"nodeType":"Assignment","operator":"=","rightHandSide":{"commonType":{"typeIdentifier":"t_uint256","typeString":"uint256"},"id":52244,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"leftExpression":{"id":52242,"name":"allowed","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":52221,"src":"3334:7:61","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"nodeType":"BinaryOperation","operator":"-","rightExpression":{"id":52243,"name":"amount","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":52215,"src":"3344:6:61","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"src":"3334:16:61","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"src":"3304:46:61","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"id":52246,"nodeType":"ExpressionStatement","src":"3304:46:61"}},{"expression":{"id":52252,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"leftHandSide":{"baseExpression":{"id":52248,"name":"balanceOf","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":52102,"src":"3361:9:61","typeDescriptions":{"typeIdentifier":"t_mapping$_t_address_$_t_uint256_$","typeString":"mapping(address => uint256)"}},"id":52250,"indexExpression":{"id":52249,"name":"from","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":52211,"src":"3371:4:61","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"}},"isConstant":false,"isLValue":true,"isPure":false,"lValueRequested":true,"nodeType":"IndexAccess","src":"3361:15:61","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"nodeType":"Assignment","operator":"-=","rightHandSide":{"id":52251,"name":"amount","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":52215,"src":"3380:6:61","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"src":"3361:25:61","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"id":52253,"nodeType":"ExpressionStatement","src":"3361:25:61"},{"id":52260,"nodeType":"UncheckedBlock","src":"3508:58:61","statements":[{"expression":{"id":52258,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"leftHandSide":{"baseExpression":{"id":52254,"name":"balanceOf","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":52102,"src":"3532:9:61","typeDescriptions":{"typeIdentifier":"t_mapping$_t_address_$_t_uint256_$","typeString":"mapping(address => uint256)"}},"id":52256,"indexExpression":{"id":52255,"name":"to","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":52213,"src":"3542:2:61","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"}},"isConstant":false,"isLValue":true,"isPure":false,"lValueRequested":true,"nodeType":"IndexAccess","src":"3532:13:61","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"nodeType":"Assignment","operator":"+=","rightHandSide":{"id":52257,"name":"amount","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":52215,"src":"3549:6:61","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"src":"3532:23:61","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"id":52259,"nodeType":"ExpressionStatement","src":"3532:23:61"}]},{"eventCall":{"arguments":[{"id":52262,"name":"from","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":52211,"src":"3590:4:61","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"}},{"id":52263,"name":"to","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":52213,"src":"3596:2:61","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"}},{"id":52264,"name":"amount","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":52215,"src":"3600:6:61","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}}],"expression":{"argumentTypes":[{"typeIdentifier":"t_address","typeString":"address"},{"typeIdentifier":"t_address","typeString":"address"},{"typeIdentifier":"t_uint256","typeString":"uint256"}],"id":52261,"name":"Transfer","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":52082,"src":"3581:8:61","typeDescriptions":{"typeIdentifier":"t_function_event_nonpayable$_t_address_$_t_address_$_t_uint256_$returns$__$","typeString":"function (address,address,uint256)"}},"id":52265,"isConstant":false,"isLValue":false,"isPure":false,"kind":"functionCall","lValueRequested":false,"nameLocations":[],"names":[],"nodeType":"FunctionCall","src":"3581:26:61","tryCall":false,"typeDescriptions":{"typeIdentifier":"t_tuple$__$","typeString":"tuple()"}},"id":52266,"nodeType":"EmitStatement","src":"3576:31:61"},{"expression":{"hexValue":"74727565","id":52267,"isConstant":false,"isLValue":false,"isPure":true,"kind":"bool","lValueRequested":false,"nodeType":"Literal","src":"3625:4:61","typeDescriptions":{"typeIdentifier":"t_bool","typeString":"bool"},"value":"true"},"functionReturnParameters":52219,"id":52268,"nodeType":"Return","src":"3618:11:61"}]},"functionSelector":"23b872dd","implemented":true,"kind":"function","modifiers":[],"name":"transferFrom","nameLocation":"3053:12:61","parameters":{"id":52216,"nodeType":"ParameterList","parameters":[{"constant":false,"id":52211,"mutability":"mutable","name":"from","nameLocation":"3083:4:61","nodeType":"VariableDeclaration","scope":52270,"src":"3075:12:61","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"},"typeName":{"id":52210,"name":"address","nodeType":"ElementaryTypeName","src":"3075:7:61","stateMutability":"nonpayable","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"}},"visibility":"internal"},{"constant":false,"id":52213,"mutability":"mutable","name":"to","nameLocation":"3105:2:61","nodeType":"VariableDeclaration","scope":52270,"src":"3097:10:61","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"},"typeName":{"id":52212,"name":"address","nodeType":"ElementaryTypeName","src":"3097:7:61","stateMutability":"nonpayable","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"}},"visibility":"internal"},{"constant":false,"id":52215,"mutability":"mutable","name":"amount","nameLocation":"3125:6:61","nodeType":"VariableDeclaration","scope":52270,"src":"3117:14:61","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"},"typeName":{"id":52214,"name":"uint256","nodeType":"ElementaryTypeName","src":"3117:7:61","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"visibility":"internal"}],"src":"3065:72:61"},"returnParameters":{"id":52219,"nodeType":"ParameterList","parameters":[{"constant":false,"id":52218,"mutability":"mutable","name":"","nameLocation":"-1:-1:-1","nodeType":"VariableDeclaration","scope":52270,"src":"3162:4:61","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_bool","typeString":"bool"},"typeName":{"id":52217,"name":"bool","nodeType":"ElementaryTypeName","src":"3162:4:61","typeDescriptions":{"typeIdentifier":"t_bool","typeString":"bool"}},"visibility":"internal"}],"src":"3161:6:61"},"scope":52459,"stateMutability":"nonpayable","virtual":true,"visibility":"public"},{"id":52357,"nodeType":"FunctionDefinition","src":"3825:1483:61","nodes":[],"body":{"id":52356,"nodeType":"Block","src":"4014:1294:61","nodes":[],"statements":[{"expression":{"arguments":[{"commonType":{"typeIdentifier":"t_uint256","typeString":"uint256"},"id":52291,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"leftExpression":{"id":52288,"name":"deadline","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":52278,"src":"4032:8:61","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"nodeType":"BinaryOperation","operator":">=","rightExpression":{"expression":{"id":52289,"name":"block","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":-4,"src":"4044:5:61","typeDescriptions":{"typeIdentifier":"t_magic_block","typeString":"block"}},"id":52290,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"memberLocation":"4050:9:61","memberName":"timestamp","nodeType":"MemberAccess","src":"4044:15:61","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"src":"4032:27:61","typeDescriptions":{"typeIdentifier":"t_bool","typeString":"bool"}},{"hexValue":"5045524d49545f444541444c494e455f45585049524544","id":52292,"isConstant":false,"isLValue":false,"isPure":true,"kind":"string","lValueRequested":false,"nodeType":"Literal","src":"4061:25:61","typeDescriptions":{"typeIdentifier":"t_stringliteral_dd18cfd81b4c1281b56302a044e7f751a261543590362c41d86af048f8ed4b3e","typeString":"literal_string \"PERMIT_DEADLINE_EXPIRED\""},"value":"PERMIT_DEADLINE_EXPIRED"}],"expression":{"argumentTypes":[{"typeIdentifier":"t_bool","typeString":"bool"},{"typeIdentifier":"t_stringliteral_dd18cfd81b4c1281b56302a044e7f751a261543590362c41d86af048f8ed4b3e","typeString":"literal_string \"PERMIT_DEADLINE_EXPIRED\""}],"id":52287,"name":"require","nodeType":"Identifier","overloadedDeclarations":[-18,-18],"referencedDeclaration":-18,"src":"4024:7:61","typeDescriptions":{"typeIdentifier":"t_function_require_pure$_t_bool_$_t_string_memory_ptr_$returns$__$","typeString":"function (bool,string memory) pure"}},"id":52293,"isConstant":false,"isLValue":false,"isPure":false,"kind":"functionCall","lValueRequested":false,"nameLocations":[],"names":[],"nodeType":"FunctionCall","src":"4024:63:61","tryCall":false,"typeDescriptions":{"typeIdentifier":"t_tuple$__$","typeString":"tuple()"}},"id":52294,"nodeType":"ExpressionStatement","src":"4024:63:61"},{"id":52349,"nodeType":"UncheckedBlock","src":"4228:1027:61","statements":[{"assignments":[52296],"declarations":[{"constant":false,"id":52296,"mutability":"mutable","name":"recoveredAddress","nameLocation":"4260:16:61","nodeType":"VariableDeclaration","scope":52349,"src":"4252:24:61","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"},"typeName":{"id":52295,"name":"address","nodeType":"ElementaryTypeName","src":"4252:7:61","stateMutability":"nonpayable","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"}},"visibility":"internal"}],"id":52326,"initialValue":{"arguments":[{"arguments":[{"arguments":[{"hexValue":"1901","id":52301,"isConstant":false,"isLValue":false,"isPure":true,"kind":"string","lValueRequested":false,"nodeType":"Literal","src":"4379:10:61","typeDescriptions":{"typeIdentifier":"t_stringliteral_301a50b291d33ce1e8e9064e3f6a6c51d902ec22892b50d58abf6357c6a45541","typeString":"literal_string hex\"1901\""},"value":"\u0019\u0001"},{"arguments":[],"expression":{"argumentTypes":[],"id":52302,"name":"DOMAIN_SEPARATOR","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":52372,"src":"4415:16:61","typeDescriptions":{"typeIdentifier":"t_function_internal_view$__$returns$_t_bytes32_$","typeString":"function () view returns (bytes32)"}},"id":52303,"isConstant":false,"isLValue":false,"isPure":false,"kind":"functionCall","lValueRequested":false,"nameLocations":[],"names":[],"nodeType":"FunctionCall","src":"4415:18:61","tryCall":false,"typeDescriptions":{"typeIdentifier":"t_bytes32","typeString":"bytes32"}},{"arguments":[{"arguments":[{"arguments":[{"hexValue":"5065726d69742861646472657373206f776e65722c61646472657373207370656e6465722c75696e743235362076616c75652c75696e74323536206e6f6e63652c75696e7432353620646561646c696e6529","id":52308,"isConstant":false,"isLValue":false,"isPure":true,"kind":"string","lValueRequested":false,"nodeType":"Literal","src":"4589:84:61","typeDescriptions":{"typeIdentifier":"t_stringliteral_6e71edae12b1b97f4d1f60370fef10105fa2faae0126114a169c64845d6126c9","typeString":"literal_string \"Permit(address owner,address spender,uint256 value,uint256 nonce,uint256 deadline)\""},"value":"Permit(address owner,address spender,uint256 value,uint256 nonce,uint256 deadline)"}],"expression":{"argumentTypes":[{"typeIdentifier":"t_stringliteral_6e71edae12b1b97f4d1f60370fef10105fa2faae0126114a169c64845d6126c9","typeString":"literal_string \"Permit(address owner,address spender,uint256 value,uint256 nonce,uint256 deadline)\""}],"id":52307,"name":"keccak256","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":-8,"src":"4542:9:61","typeDescriptions":{"typeIdentifier":"t_function_keccak256_pure$_t_bytes_memory_ptr_$returns$_t_bytes32_$","typeString":"function (bytes memory) pure returns (bytes32)"}},"id":52309,"isConstant":false,"isLValue":false,"isPure":true,"kind":"functionCall","lValueRequested":false,"nameLocations":[],"names":[],"nodeType":"FunctionCall","src":"4542:165:61","tryCall":false,"typeDescriptions":{"typeIdentifier":"t_bytes32","typeString":"bytes32"}},{"id":52310,"name":"owner","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":52272,"src":"4741:5:61","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"}},{"id":52311,"name":"spender","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":52274,"src":"4780:7:61","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"}},{"id":52312,"name":"value","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":52276,"src":"4821:5:61","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},{"id":52316,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"nodeType":"UnaryOperation","operator":"++","prefix":false,"src":"4860:15:61","subExpression":{"baseExpression":{"id":52313,"name":"nonces","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":52116,"src":"4860:6:61","typeDescriptions":{"typeIdentifier":"t_mapping$_t_address_$_t_uint256_$","typeString":"mapping(address => uint256)"}},"id":52315,"indexExpression":{"id":52314,"name":"owner","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":52272,"src":"4867:5:61","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"}},"isConstant":false,"isLValue":true,"isPure":false,"lValueRequested":true,"nodeType":"IndexAccess","src":"4860:13:61","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},{"id":52317,"name":"deadline","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":52278,"src":"4909:8:61","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}}],"expression":{"argumentTypes":[{"typeIdentifier":"t_bytes32","typeString":"bytes32"},{"typeIdentifier":"t_address","typeString":"address"},{"typeIdentifier":"t_address","typeString":"address"},{"typeIdentifier":"t_uint256","typeString":"uint256"},{"typeIdentifier":"t_uint256","typeString":"uint256"},{"typeIdentifier":"t_uint256","typeString":"uint256"}],"expression":{"id":52305,"name":"abi","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":-1,"src":"4498:3:61","typeDescriptions":{"typeIdentifier":"t_magic_abi","typeString":"abi"}},"id":52306,"isConstant":false,"isLValue":false,"isPure":true,"lValueRequested":false,"memberLocation":"4502:6:61","memberName":"encode","nodeType":"MemberAccess","src":"4498:10:61","typeDescriptions":{"typeIdentifier":"t_function_abiencode_pure$__$returns$_t_bytes_memory_ptr_$","typeString":"function () pure returns (bytes memory)"}},"id":52318,"isConstant":false,"isLValue":false,"isPure":false,"kind":"functionCall","lValueRequested":false,"nameLocations":[],"names":[],"nodeType":"FunctionCall","src":"4498:449:61","tryCall":false,"typeDescriptions":{"typeIdentifier":"t_bytes_memory_ptr","typeString":"bytes memory"}}],"expression":{"argumentTypes":[{"typeIdentifier":"t_bytes_memory_ptr","typeString":"bytes memory"}],"id":52304,"name":"keccak256","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":-8,"src":"4459:9:61","typeDescriptions":{"typeIdentifier":"t_function_keccak256_pure$_t_bytes_memory_ptr_$returns$_t_bytes32_$","typeString":"function (bytes memory) pure returns (bytes32)"}},"id":52319,"isConstant":false,"isLValue":false,"isPure":false,"kind":"functionCall","lValueRequested":false,"nameLocations":[],"names":[],"nodeType":"FunctionCall","src":"4459:514:61","tryCall":false,"typeDescriptions":{"typeIdentifier":"t_bytes32","typeString":"bytes32"}}],"expression":{"argumentTypes":[{"typeIdentifier":"t_stringliteral_301a50b291d33ce1e8e9064e3f6a6c51d902ec22892b50d58abf6357c6a45541","typeString":"literal_string hex\"1901\""},{"typeIdentifier":"t_bytes32","typeString":"bytes32"},{"typeIdentifier":"t_bytes32","typeString":"bytes32"}],"expression":{"id":52299,"name":"abi","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":-1,"src":"4337:3:61","typeDescriptions":{"typeIdentifier":"t_magic_abi","typeString":"abi"}},"id":52300,"isConstant":false,"isLValue":false,"isPure":true,"lValueRequested":false,"memberLocation":"4341:12:61","memberName":"encodePacked","nodeType":"MemberAccess","src":"4337:16:61","typeDescriptions":{"typeIdentifier":"t_function_abiencodepacked_pure$__$returns$_t_bytes_memory_ptr_$","typeString":"function () pure returns (bytes memory)"}},"id":52320,"isConstant":false,"isLValue":false,"isPure":false,"kind":"functionCall","lValueRequested":false,"nameLocations":[],"names":[],"nodeType":"FunctionCall","src":"4337:658:61","tryCall":false,"typeDescriptions":{"typeIdentifier":"t_bytes_memory_ptr","typeString":"bytes memory"}}],"expression":{"argumentTypes":[{"typeIdentifier":"t_bytes_memory_ptr","typeString":"bytes memory"}],"id":52298,"name":"keccak256","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":-8,"src":"4306:9:61","typeDescriptions":{"typeIdentifier":"t_function_keccak256_pure$_t_bytes_memory_ptr_$returns$_t_bytes32_$","typeString":"function (bytes memory) pure returns (bytes32)"}},"id":52321,"isConstant":false,"isLValue":false,"isPure":false,"kind":"functionCall","lValueRequested":false,"nameLocations":[],"names":[],"nodeType":"FunctionCall","src":"4306:707:61","tryCall":false,"typeDescriptions":{"typeIdentifier":"t_bytes32","typeString":"bytes32"}},{"id":52322,"name":"v","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":52280,"src":"5031:1:61","typeDescriptions":{"typeIdentifier":"t_uint8","typeString":"uint8"}},{"id":52323,"name":"r","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":52282,"src":"5050:1:61","typeDescriptions":{"typeIdentifier":"t_bytes32","typeString":"bytes32"}},{"id":52324,"name":"s","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":52284,"src":"5069:1:61","typeDescriptions":{"typeIdentifier":"t_bytes32","typeString":"bytes32"}}],"expression":{"argumentTypes":[{"typeIdentifier":"t_bytes32","typeString":"bytes32"},{"typeIdentifier":"t_uint8","typeString":"uint8"},{"typeIdentifier":"t_bytes32","typeString":"bytes32"},{"typeIdentifier":"t_bytes32","typeString":"bytes32"}],"id":52297,"name":"ecrecover","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":-6,"src":"4279:9:61","typeDescriptions":{"typeIdentifier":"t_function_ecrecover_pure$_t_bytes32_$_t_uint8_$_t_bytes32_$_t_bytes32_$returns$_t_address_$","typeString":"function (bytes32,uint8,bytes32,bytes32) pure returns (address)"}},"id":52325,"isConstant":false,"isLValue":false,"isPure":false,"kind":"functionCall","lValueRequested":false,"nameLocations":[],"names":[],"nodeType":"FunctionCall","src":"4279:805:61","tryCall":false,"typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"}},"nodeType":"VariableDeclarationStatement","src":"4252:832:61"},{"expression":{"arguments":[{"commonType":{"typeIdentifier":"t_bool","typeString":"bool"},"id":52337,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"leftExpression":{"commonType":{"typeIdentifier":"t_address","typeString":"address"},"id":52333,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"leftExpression":{"id":52328,"name":"recoveredAddress","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":52296,"src":"5107:16:61","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"}},"nodeType":"BinaryOperation","operator":"!=","rightExpression":{"arguments":[{"hexValue":"30","id":52331,"isConstant":false,"isLValue":false,"isPure":true,"kind":"number","lValueRequested":false,"nodeType":"Literal","src":"5135:1:61","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":52330,"isConstant":false,"isLValue":false,"isPure":true,"lValueRequested":false,"nodeType":"ElementaryTypeNameExpression","src":"5127:7:61","typeDescriptions":{"typeIdentifier":"t_type$_t_address_$","typeString":"type(address)"},"typeName":{"id":52329,"name":"address","nodeType":"ElementaryTypeName","src":"5127:7:61","typeDescriptions":{}}},"id":52332,"isConstant":false,"isLValue":false,"isPure":true,"kind":"typeConversion","lValueRequested":false,"nameLocations":[],"names":[],"nodeType":"FunctionCall","src":"5127:10:61","tryCall":false,"typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"}},"src":"5107:30:61","typeDescriptions":{"typeIdentifier":"t_bool","typeString":"bool"}},"nodeType":"BinaryOperation","operator":"&&","rightExpression":{"commonType":{"typeIdentifier":"t_address","typeString":"address"},"id":52336,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"leftExpression":{"id":52334,"name":"recoveredAddress","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":52296,"src":"5141:16:61","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"}},"nodeType":"BinaryOperation","operator":"==","rightExpression":{"id":52335,"name":"owner","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":52272,"src":"5161:5:61","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"}},"src":"5141:25:61","typeDescriptions":{"typeIdentifier":"t_bool","typeString":"bool"}},"src":"5107:59:61","typeDescriptions":{"typeIdentifier":"t_bool","typeString":"bool"}},{"hexValue":"494e56414c49445f5349474e4552","id":52338,"isConstant":false,"isLValue":false,"isPure":true,"kind":"string","lValueRequested":false,"nodeType":"Literal","src":"5168:16:61","typeDescriptions":{"typeIdentifier":"t_stringliteral_ba2319f5fa9f0c8e55f0d6899910b7354e6f643d1d349de47190066d85e68a1c","typeString":"literal_string \"INVALID_SIGNER\""},"value":"INVALID_SIGNER"}],"expression":{"argumentTypes":[{"typeIdentifier":"t_bool","typeString":"bool"},{"typeIdentifier":"t_stringliteral_ba2319f5fa9f0c8e55f0d6899910b7354e6f643d1d349de47190066d85e68a1c","typeString":"literal_string \"INVALID_SIGNER\""}],"id":52327,"name":"require","nodeType":"Identifier","overloadedDeclarations":[-18,-18],"referencedDeclaration":-18,"src":"5099:7:61","typeDescriptions":{"typeIdentifier":"t_function_require_pure$_t_bool_$_t_string_memory_ptr_$returns$__$","typeString":"function (bool,string memory) pure"}},"id":52339,"isConstant":false,"isLValue":false,"isPure":false,"kind":"functionCall","lValueRequested":false,"nameLocations":[],"names":[],"nodeType":"FunctionCall","src":"5099:86:61","tryCall":false,"typeDescriptions":{"typeIdentifier":"t_tuple$__$","typeString":"tuple()"}},"id":52340,"nodeType":"ExpressionStatement","src":"5099:86:61"},{"expression":{"id":52347,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"leftHandSide":{"baseExpression":{"baseExpression":{"id":52341,"name":"allowance","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":52108,"src":"5200:9:61","typeDescriptions":{"typeIdentifier":"t_mapping$_t_address_$_t_mapping$_t_address_$_t_uint256_$_$","typeString":"mapping(address => mapping(address => uint256))"}},"id":52344,"indexExpression":{"id":52342,"name":"recoveredAddress","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":52296,"src":"5210:16:61","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"}},"isConstant":false,"isLValue":true,"isPure":false,"lValueRequested":false,"nodeType":"IndexAccess","src":"5200:27:61","typeDescriptions":{"typeIdentifier":"t_mapping$_t_address_$_t_uint256_$","typeString":"mapping(address => uint256)"}},"id":52345,"indexExpression":{"id":52343,"name":"spender","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":52274,"src":"5228:7:61","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"}},"isConstant":false,"isLValue":true,"isPure":false,"lValueRequested":true,"nodeType":"IndexAccess","src":"5200:36:61","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"nodeType":"Assignment","operator":"=","rightHandSide":{"id":52346,"name":"value","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":52276,"src":"5239:5:61","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"src":"5200:44:61","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"id":52348,"nodeType":"ExpressionStatement","src":"5200:44:61"}]},{"eventCall":{"arguments":[{"id":52351,"name":"owner","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":52272,"src":"5279:5:61","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"}},{"id":52352,"name":"spender","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":52274,"src":"5286:7:61","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"}},{"id":52353,"name":"value","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":52276,"src":"5295:5:61","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}}],"expression":{"argumentTypes":[{"typeIdentifier":"t_address","typeString":"address"},{"typeIdentifier":"t_address","typeString":"address"},{"typeIdentifier":"t_uint256","typeString":"uint256"}],"id":52350,"name":"Approval","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":52090,"src":"5270:8:61","typeDescriptions":{"typeIdentifier":"t_function_event_nonpayable$_t_address_$_t_address_$_t_uint256_$returns$__$","typeString":"function (address,address,uint256)"}},"id":52354,"isConstant":false,"isLValue":false,"isPure":false,"kind":"functionCall","lValueRequested":false,"nameLocations":[],"names":[],"nodeType":"FunctionCall","src":"5270:31:61","tryCall":false,"typeDescriptions":{"typeIdentifier":"t_tuple$__$","typeString":"tuple()"}},"id":52355,"nodeType":"EmitStatement","src":"5265:36:61"}]},"functionSelector":"d505accf","implemented":true,"kind":"function","modifiers":[],"name":"permit","nameLocation":"3834:6:61","parameters":{"id":52285,"nodeType":"ParameterList","parameters":[{"constant":false,"id":52272,"mutability":"mutable","name":"owner","nameLocation":"3858:5:61","nodeType":"VariableDeclaration","scope":52357,"src":"3850:13:61","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"},"typeName":{"id":52271,"name":"address","nodeType":"ElementaryTypeName","src":"3850:7:61","stateMutability":"nonpayable","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"}},"visibility":"internal"},{"constant":false,"id":52274,"mutability":"mutable","name":"spender","nameLocation":"3881:7:61","nodeType":"VariableDeclaration","scope":52357,"src":"3873:15:61","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"},"typeName":{"id":52273,"name":"address","nodeType":"ElementaryTypeName","src":"3873:7:61","stateMutability":"nonpayable","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"}},"visibility":"internal"},{"constant":false,"id":52276,"mutability":"mutable","name":"value","nameLocation":"3906:5:61","nodeType":"VariableDeclaration","scope":52357,"src":"3898:13:61","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"},"typeName":{"id":52275,"name":"uint256","nodeType":"ElementaryTypeName","src":"3898:7:61","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"visibility":"internal"},{"constant":false,"id":52278,"mutability":"mutable","name":"deadline","nameLocation":"3929:8:61","nodeType":"VariableDeclaration","scope":52357,"src":"3921:16:61","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"},"typeName":{"id":52277,"name":"uint256","nodeType":"ElementaryTypeName","src":"3921:7:61","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"visibility":"internal"},{"constant":false,"id":52280,"mutability":"mutable","name":"v","nameLocation":"3953:1:61","nodeType":"VariableDeclaration","scope":52357,"src":"3947:7:61","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_uint8","typeString":"uint8"},"typeName":{"id":52279,"name":"uint8","nodeType":"ElementaryTypeName","src":"3947:5:61","typeDescriptions":{"typeIdentifier":"t_uint8","typeString":"uint8"}},"visibility":"internal"},{"constant":false,"id":52282,"mutability":"mutable","name":"r","nameLocation":"3972:1:61","nodeType":"VariableDeclaration","scope":52357,"src":"3964:9:61","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_bytes32","typeString":"bytes32"},"typeName":{"id":52281,"name":"bytes32","nodeType":"ElementaryTypeName","src":"3964:7:61","typeDescriptions":{"typeIdentifier":"t_bytes32","typeString":"bytes32"}},"visibility":"internal"},{"constant":false,"id":52284,"mutability":"mutable","name":"s","nameLocation":"3991:1:61","nodeType":"VariableDeclaration","scope":52357,"src":"3983:9:61","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_bytes32","typeString":"bytes32"},"typeName":{"id":52283,"name":"bytes32","nodeType":"ElementaryTypeName","src":"3983:7:61","typeDescriptions":{"typeIdentifier":"t_bytes32","typeString":"bytes32"}},"visibility":"internal"}],"src":"3840:158:61"},"returnParameters":{"id":52286,"nodeType":"ParameterList","parameters":[],"src":"4014:0:61"},"scope":52459,"stateMutability":"nonpayable","virtual":true,"visibility":"public"},{"id":52372,"nodeType":"FunctionDefinition","src":"5314:177:61","nodes":[],"body":{"id":52371,"nodeType":"Block","src":"5380:111:61","nodes":[],"statements":[{"expression":{"condition":{"commonType":{"typeIdentifier":"t_uint256","typeString":"uint256"},"id":52365,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"leftExpression":{"expression":{"id":52362,"name":"block","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":-4,"src":"5397:5:61","typeDescriptions":{"typeIdentifier":"t_magic_block","typeString":"block"}},"id":52363,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"memberLocation":"5403:7:61","memberName":"chainid","nodeType":"MemberAccess","src":"5397:13:61","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"nodeType":"BinaryOperation","operator":"==","rightExpression":{"id":52364,"name":"INITIAL_CHAIN_ID","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":52110,"src":"5414:16:61","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"src":"5397:33:61","typeDescriptions":{"typeIdentifier":"t_bool","typeString":"bool"}},"falseExpression":{"arguments":[],"expression":{"argumentTypes":[],"id":52367,"name":"computeDomainSeparator","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":52402,"src":"5460:22:61","typeDescriptions":{"typeIdentifier":"t_function_internal_view$__$returns$_t_bytes32_$","typeString":"function () view returns (bytes32)"}},"id":52368,"isConstant":false,"isLValue":false,"isPure":false,"kind":"functionCall","lValueRequested":false,"nameLocations":[],"names":[],"nodeType":"FunctionCall","src":"5460:24:61","tryCall":false,"typeDescriptions":{"typeIdentifier":"t_bytes32","typeString":"bytes32"}},"id":52369,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"nodeType":"Conditional","src":"5397:87:61","trueExpression":{"id":52366,"name":"INITIAL_DOMAIN_SEPARATOR","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":52112,"src":"5433:24:61","typeDescriptions":{"typeIdentifier":"t_bytes32","typeString":"bytes32"}},"typeDescriptions":{"typeIdentifier":"t_bytes32","typeString":"bytes32"}},"functionReturnParameters":52361,"id":52370,"nodeType":"Return","src":"5390:94:61"}]},"functionSelector":"3644e515","implemented":true,"kind":"function","modifiers":[],"name":"DOMAIN_SEPARATOR","nameLocation":"5323:16:61","parameters":{"id":52358,"nodeType":"ParameterList","parameters":[],"src":"5339:2:61"},"returnParameters":{"id":52361,"nodeType":"ParameterList","parameters":[{"constant":false,"id":52360,"mutability":"mutable","name":"","nameLocation":"-1:-1:-1","nodeType":"VariableDeclaration","scope":52372,"src":"5371:7:61","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_bytes32","typeString":"bytes32"},"typeName":{"id":52359,"name":"bytes32","nodeType":"ElementaryTypeName","src":"5371:7:61","typeDescriptions":{"typeIdentifier":"t_bytes32","typeString":"bytes32"}},"visibility":"internal"}],"src":"5370:9:61"},"scope":52459,"stateMutability":"view","virtual":true,"visibility":"public"},{"id":52402,"nodeType":"FunctionDefinition","src":"5497:446:61","nodes":[],"body":{"id":52401,"nodeType":"Block","src":"5571:372:61","nodes":[],"statements":[{"expression":{"arguments":[{"arguments":[{"arguments":[{"hexValue":"454950373132446f6d61696e28737472696e67206e616d652c737472696e672076657273696f6e2c75696e7432353620636861696e49642c6164647265737320766572696679696e67436f6e747261637429","id":52381,"isConstant":false,"isLValue":false,"isPure":true,"kind":"string","lValueRequested":false,"nodeType":"Literal","src":"5669:84:61","typeDescriptions":{"typeIdentifier":"t_stringliteral_8b73c3c69bb8fe3d512ecc4cf759cc79239f7b179b0ffacaa9a75d522b39400f","typeString":"literal_string \"EIP712Domain(string name,string version,uint256 chainId,address verifyingContract)\""},"value":"EIP712Domain(string name,string version,uint256 chainId,address verifyingContract)"}],"expression":{"argumentTypes":[{"typeIdentifier":"t_stringliteral_8b73c3c69bb8fe3d512ecc4cf759cc79239f7b179b0ffacaa9a75d522b39400f","typeString":"literal_string \"EIP712Domain(string name,string version,uint256 chainId,address verifyingContract)\""}],"id":52380,"name":"keccak256","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":-8,"src":"5659:9:61","typeDescriptions":{"typeIdentifier":"t_function_keccak256_pure$_t_bytes_memory_ptr_$returns$_t_bytes32_$","typeString":"function (bytes memory) pure returns (bytes32)"}},"id":52382,"isConstant":false,"isLValue":false,"isPure":true,"kind":"functionCall","lValueRequested":false,"nameLocations":[],"names":[],"nodeType":"FunctionCall","src":"5659:95:61","tryCall":false,"typeDescriptions":{"typeIdentifier":"t_bytes32","typeString":"bytes32"}},{"arguments":[{"arguments":[{"id":52386,"name":"name","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":52092,"src":"5792:4:61","typeDescriptions":{"typeIdentifier":"t_string_storage","typeString":"string storage ref"}}],"expression":{"argumentTypes":[{"typeIdentifier":"t_string_storage","typeString":"string storage ref"}],"id":52385,"isConstant":false,"isLValue":false,"isPure":true,"lValueRequested":false,"nodeType":"ElementaryTypeNameExpression","src":"5786:5:61","typeDescriptions":{"typeIdentifier":"t_type$_t_bytes_storage_ptr_$","typeString":"type(bytes storage pointer)"},"typeName":{"id":52384,"name":"bytes","nodeType":"ElementaryTypeName","src":"5786:5:61","typeDescriptions":{}}},"id":52387,"isConstant":false,"isLValue":false,"isPure":false,"kind":"typeConversion","lValueRequested":false,"nameLocations":[],"names":[],"nodeType":"FunctionCall","src":"5786:11:61","tryCall":false,"typeDescriptions":{"typeIdentifier":"t_bytes_storage_ptr","typeString":"bytes storage pointer"}}],"expression":{"argumentTypes":[{"typeIdentifier":"t_bytes_storage_ptr","typeString":"bytes storage pointer"}],"id":52383,"name":"keccak256","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":-8,"src":"5776:9:61","typeDescriptions":{"typeIdentifier":"t_function_keccak256_pure$_t_bytes_memory_ptr_$returns$_t_bytes32_$","typeString":"function (bytes memory) pure returns (bytes32)"}},"id":52388,"isConstant":false,"isLValue":false,"isPure":false,"kind":"functionCall","lValueRequested":false,"nameLocations":[],"names":[],"nodeType":"FunctionCall","src":"5776:22:61","tryCall":false,"typeDescriptions":{"typeIdentifier":"t_bytes32","typeString":"bytes32"}},{"arguments":[{"hexValue":"31","id":52390,"isConstant":false,"isLValue":false,"isPure":true,"kind":"string","lValueRequested":false,"nodeType":"Literal","src":"5830:3:61","typeDescriptions":{"typeIdentifier":"t_stringliteral_c89efdaa54c0f20c7adf612882df0950f5a951637e0307cdcb4c672f298b8bc6","typeString":"literal_string \"1\""},"value":"1"}],"expression":{"argumentTypes":[{"typeIdentifier":"t_stringliteral_c89efdaa54c0f20c7adf612882df0950f5a951637e0307cdcb4c672f298b8bc6","typeString":"literal_string \"1\""}],"id":52389,"name":"keccak256","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":-8,"src":"5820:9:61","typeDescriptions":{"typeIdentifier":"t_function_keccak256_pure$_t_bytes_memory_ptr_$returns$_t_bytes32_$","typeString":"function (bytes memory) pure returns (bytes32)"}},"id":52391,"isConstant":false,"isLValue":false,"isPure":true,"kind":"functionCall","lValueRequested":false,"nameLocations":[],"names":[],"nodeType":"FunctionCall","src":"5820:14:61","tryCall":false,"typeDescriptions":{"typeIdentifier":"t_bytes32","typeString":"bytes32"}},{"expression":{"id":52392,"name":"block","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":-4,"src":"5856:5:61","typeDescriptions":{"typeIdentifier":"t_magic_block","typeString":"block"}},"id":52393,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"memberLocation":"5862:7:61","memberName":"chainid","nodeType":"MemberAccess","src":"5856:13:61","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},{"arguments":[{"id":52396,"name":"this","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":-28,"src":"5899:4:61","typeDescriptions":{"typeIdentifier":"t_contract$_ERC20_$52459","typeString":"contract ERC20"}}],"expression":{"argumentTypes":[{"typeIdentifier":"t_contract$_ERC20_$52459","typeString":"contract ERC20"}],"id":52395,"isConstant":false,"isLValue":false,"isPure":true,"lValueRequested":false,"nodeType":"ElementaryTypeNameExpression","src":"5891:7:61","typeDescriptions":{"typeIdentifier":"t_type$_t_address_$","typeString":"type(address)"},"typeName":{"id":52394,"name":"address","nodeType":"ElementaryTypeName","src":"5891:7:61","typeDescriptions":{}}},"id":52397,"isConstant":false,"isLValue":false,"isPure":false,"kind":"typeConversion","lValueRequested":false,"nameLocations":[],"names":[],"nodeType":"FunctionCall","src":"5891:13:61","tryCall":false,"typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"}}],"expression":{"argumentTypes":[{"typeIdentifier":"t_bytes32","typeString":"bytes32"},{"typeIdentifier":"t_bytes32","typeString":"bytes32"},{"typeIdentifier":"t_bytes32","typeString":"bytes32"},{"typeIdentifier":"t_uint256","typeString":"uint256"},{"typeIdentifier":"t_address","typeString":"address"}],"expression":{"id":52378,"name":"abi","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":-1,"src":"5627:3:61","typeDescriptions":{"typeIdentifier":"t_magic_abi","typeString":"abi"}},"id":52379,"isConstant":false,"isLValue":false,"isPure":true,"lValueRequested":false,"memberLocation":"5631:6:61","memberName":"encode","nodeType":"MemberAccess","src":"5627:10:61","typeDescriptions":{"typeIdentifier":"t_function_abiencode_pure$__$returns$_t_bytes_memory_ptr_$","typeString":"function () pure returns (bytes memory)"}},"id":52398,"isConstant":false,"isLValue":false,"isPure":false,"kind":"functionCall","lValueRequested":false,"nameLocations":[],"names":[],"nodeType":"FunctionCall","src":"5627:295:61","tryCall":false,"typeDescriptions":{"typeIdentifier":"t_bytes_memory_ptr","typeString":"bytes memory"}}],"expression":{"argumentTypes":[{"typeIdentifier":"t_bytes_memory_ptr","typeString":"bytes memory"}],"id":52377,"name":"keccak256","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":-8,"src":"5600:9:61","typeDescriptions":{"typeIdentifier":"t_function_keccak256_pure$_t_bytes_memory_ptr_$returns$_t_bytes32_$","typeString":"function (bytes memory) pure returns (bytes32)"}},"id":52399,"isConstant":false,"isLValue":false,"isPure":false,"kind":"functionCall","lValueRequested":false,"nameLocations":[],"names":[],"nodeType":"FunctionCall","src":"5600:336:61","tryCall":false,"typeDescriptions":{"typeIdentifier":"t_bytes32","typeString":"bytes32"}},"functionReturnParameters":52376,"id":52400,"nodeType":"Return","src":"5581:355:61"}]},"implemented":true,"kind":"function","modifiers":[],"name":"computeDomainSeparator","nameLocation":"5506:22:61","parameters":{"id":52373,"nodeType":"ParameterList","parameters":[],"src":"5528:2:61"},"returnParameters":{"id":52376,"nodeType":"ParameterList","parameters":[{"constant":false,"id":52375,"mutability":"mutable","name":"","nameLocation":"-1:-1:-1","nodeType":"VariableDeclaration","scope":52402,"src":"5562:7:61","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_bytes32","typeString":"bytes32"},"typeName":{"id":52374,"name":"bytes32","nodeType":"ElementaryTypeName","src":"5562:7:61","typeDescriptions":{"typeIdentifier":"t_bytes32","typeString":"bytes32"}},"visibility":"internal"}],"src":"5561:9:61"},"scope":52459,"stateMutability":"view","virtual":true,"visibility":"internal"},{"id":52430,"nodeType":"FunctionDefinition","src":"6137:325:61","nodes":[],"body":{"id":52429,"nodeType":"Block","src":"6197:265:61","nodes":[],"statements":[{"expression":{"id":52411,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"leftHandSide":{"id":52409,"name":"totalSupply","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":52098,"src":"6207:11:61","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"nodeType":"Assignment","operator":"+=","rightHandSide":{"id":52410,"name":"amount","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":52406,"src":"6222:6:61","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"src":"6207:21:61","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"id":52412,"nodeType":"ExpressionStatement","src":"6207:21:61"},{"id":52419,"nodeType":"UncheckedBlock","src":"6350:58:61","statements":[{"expression":{"id":52417,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"leftHandSide":{"baseExpression":{"id":52413,"name":"balanceOf","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":52102,"src":"6374:9:61","typeDescriptions":{"typeIdentifier":"t_mapping$_t_address_$_t_uint256_$","typeString":"mapping(address => uint256)"}},"id":52415,"indexExpression":{"id":52414,"name":"to","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":52404,"src":"6384:2:61","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"}},"isConstant":false,"isLValue":true,"isPure":false,"lValueRequested":true,"nodeType":"IndexAccess","src":"6374:13:61","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"nodeType":"Assignment","operator":"+=","rightHandSide":{"id":52416,"name":"amount","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":52406,"src":"6391:6:61","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"src":"6374:23:61","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"id":52418,"nodeType":"ExpressionStatement","src":"6374:23:61"}]},{"eventCall":{"arguments":[{"arguments":[{"hexValue":"30","id":52423,"isConstant":false,"isLValue":false,"isPure":true,"kind":"number","lValueRequested":false,"nodeType":"Literal","src":"6440:1:61","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":52422,"isConstant":false,"isLValue":false,"isPure":true,"lValueRequested":false,"nodeType":"ElementaryTypeNameExpression","src":"6432:7:61","typeDescriptions":{"typeIdentifier":"t_type$_t_address_$","typeString":"type(address)"},"typeName":{"id":52421,"name":"address","nodeType":"ElementaryTypeName","src":"6432:7:61","typeDescriptions":{}}},"id":52424,"isConstant":false,"isLValue":false,"isPure":true,"kind":"typeConversion","lValueRequested":false,"nameLocations":[],"names":[],"nodeType":"FunctionCall","src":"6432:10:61","tryCall":false,"typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"}},{"id":52425,"name":"to","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":52404,"src":"6444:2:61","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"}},{"id":52426,"name":"amount","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":52406,"src":"6448:6:61","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}}],"expression":{"argumentTypes":[{"typeIdentifier":"t_address","typeString":"address"},{"typeIdentifier":"t_address","typeString":"address"},{"typeIdentifier":"t_uint256","typeString":"uint256"}],"id":52420,"name":"Transfer","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":52082,"src":"6423:8:61","typeDescriptions":{"typeIdentifier":"t_function_event_nonpayable$_t_address_$_t_address_$_t_uint256_$returns$__$","typeString":"function (address,address,uint256)"}},"id":52427,"isConstant":false,"isLValue":false,"isPure":false,"kind":"functionCall","lValueRequested":false,"nameLocations":[],"names":[],"nodeType":"FunctionCall","src":"6423:32:61","tryCall":false,"typeDescriptions":{"typeIdentifier":"t_tuple$__$","typeString":"tuple()"}},"id":52428,"nodeType":"EmitStatement","src":"6418:37:61"}]},"implemented":true,"kind":"function","modifiers":[],"name":"_mint","nameLocation":"6146:5:61","parameters":{"id":52407,"nodeType":"ParameterList","parameters":[{"constant":false,"id":52404,"mutability":"mutable","name":"to","nameLocation":"6160:2:61","nodeType":"VariableDeclaration","scope":52430,"src":"6152:10:61","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"},"typeName":{"id":52403,"name":"address","nodeType":"ElementaryTypeName","src":"6152:7:61","stateMutability":"nonpayable","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"}},"visibility":"internal"},{"constant":false,"id":52406,"mutability":"mutable","name":"amount","nameLocation":"6172:6:61","nodeType":"VariableDeclaration","scope":52430,"src":"6164:14:61","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"},"typeName":{"id":52405,"name":"uint256","nodeType":"ElementaryTypeName","src":"6164:7:61","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"visibility":"internal"}],"src":"6151:28:61"},"returnParameters":{"id":52408,"nodeType":"ParameterList","parameters":[],"src":"6197:0:61"},"scope":52459,"stateMutability":"nonpayable","virtual":true,"visibility":"internal"},{"id":52458,"nodeType":"FunctionDefinition","src":"6468:328:61","nodes":[],"body":{"id":52457,"nodeType":"Block","src":"6530:266:61","nodes":[],"statements":[{"expression":{"id":52441,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"leftHandSide":{"baseExpression":{"id":52437,"name":"balanceOf","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":52102,"src":"6540:9:61","typeDescriptions":{"typeIdentifier":"t_mapping$_t_address_$_t_uint256_$","typeString":"mapping(address => uint256)"}},"id":52439,"indexExpression":{"id":52438,"name":"from","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":52432,"src":"6550:4:61","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"}},"isConstant":false,"isLValue":true,"isPure":false,"lValueRequested":true,"nodeType":"IndexAccess","src":"6540:15:61","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"nodeType":"Assignment","operator":"-=","rightHandSide":{"id":52440,"name":"amount","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":52434,"src":"6559:6:61","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"src":"6540:25:61","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"id":52442,"nodeType":"ExpressionStatement","src":"6540:25:61"},{"id":52447,"nodeType":"UncheckedBlock","src":"6684:56:61","statements":[{"expression":{"id":52445,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"leftHandSide":{"id":52443,"name":"totalSupply","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":52098,"src":"6708:11:61","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"nodeType":"Assignment","operator":"-=","rightHandSide":{"id":52444,"name":"amount","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":52434,"src":"6723:6:61","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"src":"6708:21:61","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"id":52446,"nodeType":"ExpressionStatement","src":"6708:21:61"}]},{"eventCall":{"arguments":[{"id":52449,"name":"from","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":52432,"src":"6764:4:61","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"}},{"arguments":[{"hexValue":"30","id":52452,"isConstant":false,"isLValue":false,"isPure":true,"kind":"number","lValueRequested":false,"nodeType":"Literal","src":"6778:1:61","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":52451,"isConstant":false,"isLValue":false,"isPure":true,"lValueRequested":false,"nodeType":"ElementaryTypeNameExpression","src":"6770:7:61","typeDescriptions":{"typeIdentifier":"t_type$_t_address_$","typeString":"type(address)"},"typeName":{"id":52450,"name":"address","nodeType":"ElementaryTypeName","src":"6770:7:61","typeDescriptions":{}}},"id":52453,"isConstant":false,"isLValue":false,"isPure":true,"kind":"typeConversion","lValueRequested":false,"nameLocations":[],"names":[],"nodeType":"FunctionCall","src":"6770:10:61","tryCall":false,"typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"}},{"id":52454,"name":"amount","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":52434,"src":"6782:6:61","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}}],"expression":{"argumentTypes":[{"typeIdentifier":"t_address","typeString":"address"},{"typeIdentifier":"t_address","typeString":"address"},{"typeIdentifier":"t_uint256","typeString":"uint256"}],"id":52448,"name":"Transfer","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":52082,"src":"6755:8:61","typeDescriptions":{"typeIdentifier":"t_function_event_nonpayable$_t_address_$_t_address_$_t_uint256_$returns$__$","typeString":"function (address,address,uint256)"}},"id":52455,"isConstant":false,"isLValue":false,"isPure":false,"kind":"functionCall","lValueRequested":false,"nameLocations":[],"names":[],"nodeType":"FunctionCall","src":"6755:34:61","tryCall":false,"typeDescriptions":{"typeIdentifier":"t_tuple$__$","typeString":"tuple()"}},"id":52456,"nodeType":"EmitStatement","src":"6750:39:61"}]},"implemented":true,"kind":"function","modifiers":[],"name":"_burn","nameLocation":"6477:5:61","parameters":{"id":52435,"nodeType":"ParameterList","parameters":[{"constant":false,"id":52432,"mutability":"mutable","name":"from","nameLocation":"6491:4:61","nodeType":"VariableDeclaration","scope":52458,"src":"6483:12:61","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"},"typeName":{"id":52431,"name":"address","nodeType":"ElementaryTypeName","src":"6483:7:61","stateMutability":"nonpayable","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"}},"visibility":"internal"},{"constant":false,"id":52434,"mutability":"mutable","name":"amount","nameLocation":"6505:6:61","nodeType":"VariableDeclaration","scope":52458,"src":"6497:14:61","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"},"typeName":{"id":52433,"name":"uint256","nodeType":"ElementaryTypeName","src":"6497:7:61","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"visibility":"internal"}],"src":"6482:30:61"},"returnParameters":{"id":52436,"nodeType":"ParameterList","parameters":[],"src":"6530:0:61"},"scope":52459,"stateMutability":"nonpayable","virtual":true,"visibility":"internal"}],"abstract":true,"baseContracts":[],"canonicalName":"ERC20","contractDependencies":[],"contractKind":"contract","documentation":{"id":52074,"nodeType":"StructuredDocumentation","src":"58:403:61","text":"@notice Modern and gas efficient ERC20 + EIP-2612 implementation.\n @author Solmate (https://github.com/Rari-Capital/solmate/blob/main/src/tokens/ERC20.sol)\n @author Modified from Uniswap (https://github.com/Uniswap/uniswap-v2-core/blob/master/contracts/UniswapV2ERC20.sol)\n @dev Do not manually set balances without updating totalSupply, as the sum of all user balances must not exceed it."},"fullyImplemented":true,"linearizedBaseContracts":[52459],"name":"ERC20","nameLocation":"479:5:61","scope":52460,"usedErrors":[],"usedEvents":[52082,52090]}],"license":"MIT"},"id":61} \ No newline at end of file diff --git a/op-chain-ops/foundry/testdata/forge-artifacts/ERC20.sol/ERC20.json b/op-chain-ops/foundry/testdata/forge-artifacts/ERC20.sol/ERC20.json new file mode 100644 index 000000000000..3f2b9075175e --- /dev/null +++ b/op-chain-ops/foundry/testdata/forge-artifacts/ERC20.sol/ERC20.json @@ -0,0 +1 @@ +{"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}],"bytecode":{"object":"0x60806040523480156200001157600080fd5b5060405162000e3c38038062000e3c833981016040819052620000349162000127565b600362000042838262000220565b50600462000051828262000220565b505050620002ec565b634e487b7160e01b600052604160045260246000fd5b600082601f8301126200008257600080fd5b81516001600160401b03808211156200009f576200009f6200005a565b604051601f8301601f19908116603f01168101908282118183101715620000ca57620000ca6200005a565b81604052838152602092508683858801011115620000e757600080fd5b600091505b838210156200010b5785820183015181830184015290820190620000ec565b838211156200011d5760008385830101525b9695505050505050565b600080604083850312156200013b57600080fd5b82516001600160401b03808211156200015357600080fd5b620001618683870162000070565b935060208501519150808211156200017857600080fd5b50620001878582860162000070565b9150509250929050565b600181811c90821680620001a657607f821691505b602082108103620001c757634e487b7160e01b600052602260045260246000fd5b50919050565b601f8211156200021b57600081815260208120601f850160051c81016020861015620001f65750805b601f850160051c820191505b81811015620002175782815560010162000202565b5050505b505050565b81516001600160401b038111156200023c576200023c6200005a565b62000254816200024d845462000191565b84620001cd565b602080601f8311600181146200028c5760008415620002735750858301515b600019600386901b1c1916600185901b17855562000217565b600085815260208120601f198616915b82811015620002bd578886015182559484019460019091019084016200029c565b5085821015620002dc5787850151600019600388901b60f8161c191681555b5050505050600190811b01905550565b610b4080620002fc6000396000f3fe608060405234801561001057600080fd5b50600436106100c95760003560e01c80633950935111610081578063a457c2d71161005b578063a457c2d714610194578063a9059cbb146101a7578063dd62ed3e146101ba57600080fd5b8063395093511461014357806370a082311461015657806395d89b411461018c57600080fd5b806318160ddd116100b257806318160ddd1461010f57806323b872dd14610121578063313ce5671461013457600080fd5b806306fdde03146100ce578063095ea7b3146100ec575b600080fd5b6100d6610200565b6040516100e3919061094a565b60405180910390f35b6100ff6100fa3660046109e6565b610292565b60405190151581526020016100e3565b6002545b6040519081526020016100e3565b6100ff61012f366004610a10565b6102aa565b604051601281526020016100e3565b6100ff6101513660046109e6565b6102ce565b610113610164366004610a4c565b73ffffffffffffffffffffffffffffffffffffffff1660009081526020819052604090205490565b6100d661031a565b6100ff6101a23660046109e6565b610329565b6100ff6101b53660046109e6565b6103ff565b6101136101c8366004610a6e565b73ffffffffffffffffffffffffffffffffffffffff918216600090815260016020908152604080832093909416825291909152205490565b60606003805461020f90610aa1565b80601f016020809104026020016040519081016040528092919081815260200182805461023b90610aa1565b80156102885780601f1061025d57610100808354040283529160200191610288565b820191906000526020600020905b81548152906001019060200180831161026b57829003601f168201915b5050505050905090565b6000336102a081858561040d565b5060019392505050565b6000336102b88582856105c0565b6102c3858585610697565b506001949350505050565b33600081815260016020908152604080832073ffffffffffffffffffffffffffffffffffffffff871684529091528120549091906102a09082908690610315908790610af4565b61040d565b60606004805461020f90610aa1565b33600081815260016020908152604080832073ffffffffffffffffffffffffffffffffffffffff87168452909152812054909190838110156103f2576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602560248201527f45524332303a2064656372656173656420616c6c6f77616e63652062656c6f7760448201527f207a65726f00000000000000000000000000000000000000000000000000000060648201526084015b60405180910390fd5b6102c3828686840361040d565b6000336102a0818585610697565b73ffffffffffffffffffffffffffffffffffffffff83166104af576040517f08c379a0000000000000000000000000000000000000000000000000000000008152602060048201526024808201527f45524332303a20617070726f76652066726f6d20746865207a65726f2061646460448201527f726573730000000000000000000000000000000000000000000000000000000060648201526084016103e9565b73ffffffffffffffffffffffffffffffffffffffff8216610552576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602260248201527f45524332303a20617070726f766520746f20746865207a65726f20616464726560448201527f737300000000000000000000000000000000000000000000000000000000000060648201526084016103e9565b73ffffffffffffffffffffffffffffffffffffffff83811660008181526001602090815260408083209487168084529482529182902085905590518481527f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b925910160405180910390a3505050565b73ffffffffffffffffffffffffffffffffffffffff8381166000908152600160209081526040808320938616835292905220547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff81146106915781811015610684576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601d60248201527f45524332303a20696e73756666696369656e7420616c6c6f77616e636500000060448201526064016103e9565b610691848484840361040d565b50505050565b73ffffffffffffffffffffffffffffffffffffffff831661073a576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602560248201527f45524332303a207472616e736665722066726f6d20746865207a65726f20616460448201527f647265737300000000000000000000000000000000000000000000000000000060648201526084016103e9565b73ffffffffffffffffffffffffffffffffffffffff82166107dd576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602360248201527f45524332303a207472616e7366657220746f20746865207a65726f206164647260448201527f657373000000000000000000000000000000000000000000000000000000000060648201526084016103e9565b73ffffffffffffffffffffffffffffffffffffffff831660009081526020819052604090205481811015610893576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602660248201527f45524332303a207472616e7366657220616d6f756e742065786365656473206260448201527f616c616e6365000000000000000000000000000000000000000000000000000060648201526084016103e9565b73ffffffffffffffffffffffffffffffffffffffff8085166000908152602081905260408082208585039055918516815290812080548492906108d7908490610af4565b925050819055508273ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef8460405161093d91815260200190565b60405180910390a3610691565b600060208083528351808285015260005b818110156109775785810183015185820160400152820161095b565b81811115610989576000604083870101525b50601f017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe016929092016040019392505050565b803573ffffffffffffffffffffffffffffffffffffffff811681146109e157600080fd5b919050565b600080604083850312156109f957600080fd5b610a02836109bd565b946020939093013593505050565b600080600060608486031215610a2557600080fd5b610a2e846109bd565b9250610a3c602085016109bd565b9150604084013590509250925092565b600060208284031215610a5e57600080fd5b610a67826109bd565b9392505050565b60008060408385031215610a8157600080fd5b610a8a836109bd565b9150610a98602084016109bd565b90509250929050565b600181811c90821680610ab557607f821691505b602082108103610aee577f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b50919050565b60008219821115610b2e577f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b50019056fea164736f6c634300080f000a","sourceMap":"1403:11214:50:-:0;;;1978:113;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;2044:5;:13;2052:5;2044;:13;:::i;:::-;-1:-1:-1;2067:7:50;:17;2077:7;2067;:17;:::i;:::-;;1978:113;;1403:11214;;14:127:409;75:10;70:3;66:20;63:1;56:31;106:4;103:1;96:15;130:4;127:1;120:15;146:885;200:5;253:3;246:4;238:6;234:17;230:27;220:55;;271:1;268;261:12;220:55;294:13;;-1:-1:-1;;;;;356:10:409;;;353:36;;;369:18;;:::i;:::-;444:2;438:9;412:2;498:13;;-1:-1:-1;;494:22:409;;;518:2;490:31;486:40;474:53;;;542:18;;;562:22;;;539:46;536:72;;;588:18;;:::i;:::-;628:10;624:2;617:22;663:2;655:6;648:18;685:4;675:14;;730:3;725:2;720;712:6;708:15;704:24;701:33;698:53;;;747:1;744;737:12;698:53;769:1;760:10;;779:133;793:2;790:1;787:9;779:133;;;881:14;;;877:23;;871:30;850:14;;;846:23;;839:63;804:10;;;;779:133;;;930:2;927:1;924:9;921:80;;;989:1;984:2;979;971:6;967:15;963:24;956:35;921:80;1019:6;146:885;-1:-1:-1;;;;;;146:885:409:o;1036:562::-;1135:6;1143;1196:2;1184:9;1175:7;1171:23;1167:32;1164:52;;;1212:1;1209;1202:12;1164:52;1239:16;;-1:-1:-1;;;;;1304:14:409;;;1301:34;;;1331:1;1328;1321:12;1301:34;1354:61;1407:7;1398:6;1387:9;1383:22;1354:61;:::i;:::-;1344:71;;1461:2;1450:9;1446:18;1440:25;1424:41;;1490:2;1480:8;1477:16;1474:36;;;1506:1;1503;1496:12;1474:36;;1529:63;1584:7;1573:8;1562:9;1558:24;1529:63;:::i;:::-;1519:73;;;1036:562;;;;;:::o;1603:380::-;1682:1;1678:12;;;;1725;;;1746:61;;1800:4;1792:6;1788:17;1778:27;;1746:61;1853:2;1845:6;1842:14;1822:18;1819:38;1816:161;;1899:10;1894:3;1890:20;1887:1;1880:31;1934:4;1931:1;1924:15;1962:4;1959:1;1952:15;1816:161;;1603:380;;;:::o;2114:545::-;2216:2;2211:3;2208:11;2205:448;;;2252:1;2277:5;2273:2;2266:17;2322:4;2318:2;2308:19;2392:2;2380:10;2376:19;2373:1;2369:27;2363:4;2359:38;2428:4;2416:10;2413:20;2410:47;;;-1:-1:-1;2451:4:409;2410:47;2506:2;2501:3;2497:12;2494:1;2490:20;2484:4;2480:31;2470:41;;2561:82;2579:2;2572:5;2569:13;2561:82;;;2624:17;;;2605:1;2594:13;2561:82;;;2565:3;;;2205:448;2114:545;;;:::o;2835:1352::-;2955:10;;-1:-1:-1;;;;;2977:30:409;;2974:56;;;3010:18;;:::i;:::-;3039:97;3129:6;3089:38;3121:4;3115:11;3089:38;:::i;:::-;3083:4;3039:97;:::i;:::-;3191:4;;3255:2;3244:14;;3272:1;3267:663;;;;3974:1;3991:6;3988:89;;;-1:-1:-1;4043:19:409;;;4037:26;3988:89;-1:-1:-1;;2792:1:409;2788:11;;;2784:24;2780:29;2770:40;2816:1;2812:11;;;2767:57;4090:81;;3237:944;;3267:663;2061:1;2054:14;;;2098:4;2085:18;;-1:-1:-1;;3303:20:409;;;3421:236;3435:7;3432:1;3429:14;3421:236;;;3524:19;;;3518:26;3503:42;;3616:27;;;;3584:1;3572:14;;;;3451:19;;3421:236;;;3425:3;3685:6;3676:7;3673:19;3670:201;;;3746:19;;;3740:26;-1:-1:-1;;3829:1:409;3825:14;;;3841:3;3821:24;3817:37;3813:42;3798:58;3783:74;;3670:201;-1:-1:-1;;;;;3917:1:409;3901:14;;;3897:22;3884:36;;-1:-1:-1;2835:1352:409:o;:::-;1403:11214:50;;;;;;","linkReferences":{}},"deployedBytecode":{"object":"0x608060405234801561001057600080fd5b50600436106100c95760003560e01c80633950935111610081578063a457c2d71161005b578063a457c2d714610194578063a9059cbb146101a7578063dd62ed3e146101ba57600080fd5b8063395093511461014357806370a082311461015657806395d89b411461018c57600080fd5b806318160ddd116100b257806318160ddd1461010f57806323b872dd14610121578063313ce5671461013457600080fd5b806306fdde03146100ce578063095ea7b3146100ec575b600080fd5b6100d6610200565b6040516100e3919061094a565b60405180910390f35b6100ff6100fa3660046109e6565b610292565b60405190151581526020016100e3565b6002545b6040519081526020016100e3565b6100ff61012f366004610a10565b6102aa565b604051601281526020016100e3565b6100ff6101513660046109e6565b6102ce565b610113610164366004610a4c565b73ffffffffffffffffffffffffffffffffffffffff1660009081526020819052604090205490565b6100d661031a565b6100ff6101a23660046109e6565b610329565b6100ff6101b53660046109e6565b6103ff565b6101136101c8366004610a6e565b73ffffffffffffffffffffffffffffffffffffffff918216600090815260016020908152604080832093909416825291909152205490565b60606003805461020f90610aa1565b80601f016020809104026020016040519081016040528092919081815260200182805461023b90610aa1565b80156102885780601f1061025d57610100808354040283529160200191610288565b820191906000526020600020905b81548152906001019060200180831161026b57829003601f168201915b5050505050905090565b6000336102a081858561040d565b5060019392505050565b6000336102b88582856105c0565b6102c3858585610697565b506001949350505050565b33600081815260016020908152604080832073ffffffffffffffffffffffffffffffffffffffff871684529091528120549091906102a09082908690610315908790610af4565b61040d565b60606004805461020f90610aa1565b33600081815260016020908152604080832073ffffffffffffffffffffffffffffffffffffffff87168452909152812054909190838110156103f2576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602560248201527f45524332303a2064656372656173656420616c6c6f77616e63652062656c6f7760448201527f207a65726f00000000000000000000000000000000000000000000000000000060648201526084015b60405180910390fd5b6102c3828686840361040d565b6000336102a0818585610697565b73ffffffffffffffffffffffffffffffffffffffff83166104af576040517f08c379a0000000000000000000000000000000000000000000000000000000008152602060048201526024808201527f45524332303a20617070726f76652066726f6d20746865207a65726f2061646460448201527f726573730000000000000000000000000000000000000000000000000000000060648201526084016103e9565b73ffffffffffffffffffffffffffffffffffffffff8216610552576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602260248201527f45524332303a20617070726f766520746f20746865207a65726f20616464726560448201527f737300000000000000000000000000000000000000000000000000000000000060648201526084016103e9565b73ffffffffffffffffffffffffffffffffffffffff83811660008181526001602090815260408083209487168084529482529182902085905590518481527f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b925910160405180910390a3505050565b73ffffffffffffffffffffffffffffffffffffffff8381166000908152600160209081526040808320938616835292905220547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff81146106915781811015610684576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601d60248201527f45524332303a20696e73756666696369656e7420616c6c6f77616e636500000060448201526064016103e9565b610691848484840361040d565b50505050565b73ffffffffffffffffffffffffffffffffffffffff831661073a576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602560248201527f45524332303a207472616e736665722066726f6d20746865207a65726f20616460448201527f647265737300000000000000000000000000000000000000000000000000000060648201526084016103e9565b73ffffffffffffffffffffffffffffffffffffffff82166107dd576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602360248201527f45524332303a207472616e7366657220746f20746865207a65726f206164647260448201527f657373000000000000000000000000000000000000000000000000000000000060648201526084016103e9565b73ffffffffffffffffffffffffffffffffffffffff831660009081526020819052604090205481811015610893576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602660248201527f45524332303a207472616e7366657220616d6f756e742065786365656473206260448201527f616c616e6365000000000000000000000000000000000000000000000000000060648201526084016103e9565b73ffffffffffffffffffffffffffffffffffffffff8085166000908152602081905260408082208585039055918516815290812080548492906108d7908490610af4565b925050819055508273ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef8460405161093d91815260200190565b60405180910390a3610691565b600060208083528351808285015260005b818110156109775785810183015185820160400152820161095b565b81811115610989576000604083870101525b50601f017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe016929092016040019392505050565b803573ffffffffffffffffffffffffffffffffffffffff811681146109e157600080fd5b919050565b600080604083850312156109f957600080fd5b610a02836109bd565b946020939093013593505050565b600080600060608486031215610a2557600080fd5b610a2e846109bd565b9250610a3c602085016109bd565b9150604084013590509250925092565b600060208284031215610a5e57600080fd5b610a67826109bd565b9392505050565b60008060408385031215610a8157600080fd5b610a8a836109bd565b9150610a98602084016109bd565b90509250929050565b600181811c90821680610ab557607f821691505b602082108103610aee577f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b50919050565b60008219821115610b2e577f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b50019056fea164736f6c634300080f000a","sourceMap":"1403:11214:50:-:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;2156:98;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;4433:197;;;;;;:::i;:::-;;:::i;:::-;;;1300:14:409;;1293:22;1275:41;;1263:2;1248:18;4433:197:50;1135:187:409;3244:106:50;3331:12;;3244:106;;;1473:25:409;;;1461:2;1446:18;3244:106:50;1327:177:409;5192:286:50;;;;;;:::i;:::-;;:::i;3093:91::-;;;3175:2;1984:36:409;;1972:2;1957:18;3093:91:50;1842:184:409;5873:234:50;;;;;;:::i;:::-;;:::i;3408:125::-;;;;;;:::i;:::-;3508:18;;3482:7;3508:18;;;;;;;;;;;;3408:125;2367:102;;;:::i;6594:427::-;;;;;;:::i;:::-;;:::i;3729:189::-;;;;;;:::i;:::-;;:::i;3976:149::-;;;;;;:::i;:::-;4091:18;;;;4065:7;4091:18;;;:11;:18;;;;;;;;:27;;;;;;;;;;;;;3976:149;2156:98;2210:13;2242:5;2235:12;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;2156:98;:::o;4433:197::-;4516:4;719:10:65;4570:32:50;719:10:65;4586:7:50;4595:6;4570:8;:32::i;:::-;-1:-1:-1;4619:4:50;;4433:197;-1:-1:-1;;;4433:197:50:o;5192:286::-;5319:4;719:10:65;5375:38:50;5391:4;719:10:65;5406:6:50;5375:15;:38::i;:::-;5423:27;5433:4;5439:2;5443:6;5423:9;:27::i;:::-;-1:-1:-1;5467:4:50;;5192:286;-1:-1:-1;;;;5192:286:50:o;5873:234::-;719:10:65;5961:4:50;4091:18;;;:11;:18;;;;;;;;;:27;;;;;;;;;;5961:4;;719:10:65;6015:64:50;;719:10:65;;4091:27:50;;6040:38;;6068:10;;6040:38;:::i;:::-;6015:8;:64::i;2367:102::-;2423:13;2455:7;2448:14;;;;;:::i;6594:427::-;719:10:65;6687:4:50;4091:18;;;:11;:18;;;;;;;;;:27;;;;;;;;;;6687:4;;719:10:65;6831:15:50;6811:16;:35;;6803:85;;;;;;;3418:2:409;6803:85:50;;;3400:21:409;3457:2;3437:18;;;3430:30;3496:34;3476:18;;;3469:62;3567:7;3547:18;;;3540:35;3592:19;;6803:85:50;;;;;;;;;6922:60;6931:5;6938:7;6966:15;6947:16;:34;6922:8;:60::i;3729:189::-;3808:4;719:10:65;3862:28:50;719:10:65;3879:2:50;3883:6;3862:9;:28::i;10110:370::-;10241:19;;;10233:68;;;;;;;3824:2:409;10233:68:50;;;3806:21:409;3863:2;3843:18;;;3836:30;3902:34;3882:18;;;3875:62;3973:6;3953:18;;;3946:34;3997:19;;10233:68:50;3622:400:409;10233:68:50;10319:21;;;10311:68;;;;;;;4229:2:409;10311:68:50;;;4211:21:409;4268:2;4248:18;;;4241:30;4307:34;4287:18;;;4280:62;4378:4;4358:18;;;4351:32;4400:19;;10311:68:50;4027:398:409;10311:68:50;10390:18;;;;;;;;:11;:18;;;;;;;;:27;;;;;;;;;;;;;:36;;;10441:32;;1473:25:409;;;10441:32:50;;1446:18:409;10441:32:50;;;;;;;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;;;;;;;4632:2:409;11010:68:50;;;4614:21:409;4671:2;4651:18;;;4644:30;4710:31;4690:18;;;4683:59;4759:18;;11010:68:50;4430:353:409;11010:68:50;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;;;;;;;4990:2:409;7593:68:50;;;4972:21:409;5029:2;5009:18;;;5002:30;5068:34;5048:18;;;5041:62;5139:7;5119:18;;;5112:35;5164:19;;7593:68:50;4788:401:409;7593:68:50;7679:16;;;7671:64;;;;;;;5396:2:409;7671:64:50;;;5378:21:409;5435:2;5415:18;;;5408:30;5474:34;5454:18;;;5447:62;5545:5;5525:18;;;5518:33;5568:19;;7671:64:50;5194:399:409;7671:64:50;7817:15;;;7795:19;7817:15;;;;;;;;;;;7850:21;;;;7842:72;;;;;;;5800:2:409;7842:72:50;;;5782:21:409;5839:2;5819:18;;;5812:30;5878:34;5858:18;;;5851:62;5949:8;5929:18;;;5922:36;5975:19;;7842:72:50;5598:402:409;7842:72:50;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;;;;1473:25:409;;1461:2;1446:18;;1327:177;8045:26:50;;;;;;;;8082:37;11786:121;14:656:409;126:4;155:2;184;173:9;166:21;216:6;210:13;259:6;254:2;243:9;239:18;232:34;284:1;294:140;308:6;305:1;302:13;294:140;;;403:14;;;399:23;;393:30;369:17;;;388:2;365:26;358:66;323:10;;294:140;;;452:6;449:1;446:13;443:91;;;522:1;517:2;508:6;497:9;493:22;489:31;482:42;443:91;-1:-1:-1;586:2:409;574:15;591:66;570:88;555:104;;;;661:2;551:113;;14:656;-1:-1:-1;;;14:656:409:o;675:196::-;743:20;;803:42;792:54;;782:65;;772:93;;861:1;858;851:12;772:93;675:196;;;:::o;876:254::-;944:6;952;1005:2;993:9;984:7;980:23;976:32;973:52;;;1021:1;1018;1011:12;973:52;1044:29;1063:9;1044:29;:::i;:::-;1034:39;1120:2;1105:18;;;;1092:32;;-1:-1:-1;;;876:254:409:o;1509:328::-;1586:6;1594;1602;1655:2;1643:9;1634:7;1630:23;1626:32;1623:52;;;1671:1;1668;1661:12;1623:52;1694:29;1713:9;1694:29;:::i;:::-;1684:39;;1742:38;1776:2;1765:9;1761:18;1742:38;:::i;:::-;1732:48;;1827:2;1816:9;1812:18;1799:32;1789:42;;1509:328;;;;;:::o;2031:186::-;2090:6;2143:2;2131:9;2122:7;2118:23;2114:32;2111:52;;;2159:1;2156;2149:12;2111:52;2182:29;2201:9;2182:29;:::i;:::-;2172:39;2031:186;-1:-1:-1;;;2031:186:409:o;2222:260::-;2290:6;2298;2351:2;2339:9;2330:7;2326:23;2322:32;2319:52;;;2367:1;2364;2357:12;2319:52;2390:29;2409:9;2390:29;:::i;:::-;2380:39;;2438:38;2472:2;2461:9;2457:18;2438:38;:::i;:::-;2428:48;;2222:260;;;;;:::o;2487:437::-;2566:1;2562:12;;;;2609;;;2630:61;;2684:4;2676:6;2672:17;2662:27;;2630:61;2737:2;2729:6;2726:14;2706:18;2703:38;2700:218;;2774:77;2771:1;2764:88;2875:4;2872:1;2865:15;2903:4;2900:1;2893:15;2700:218;;2487:437;;;:::o;2929:282::-;2969:3;3000:1;2996:6;2993:1;2990:13;2987:193;;;3036:77;3033:1;3026:88;3137:4;3134:1;3127:15;3165:4;3162:1;3155:15;2987:193;-1:-1:-1;3196:9:409;;2929:282::o","linkReferences":{}},"methodIdentifiers":{"allowance(address,address)":"dd62ed3e","approve(address,uint256)":"095ea7b3","balanceOf(address)":"70a08231","decimals()":"313ce567","decreaseAllowance(address,uint256)":"a457c2d7","increaseAllowance(address,uint256)":"39509351","name()":"06fdde03","symbol()":"95d89b41","totalSupply()":"18160ddd","transfer(address,uint256)":"a9059cbb","transferFrom(address,address,uint256)":"23b872dd"},"rawMetadata":"{\"compiler\":{\"version\":\"0.8.15+commit.e14f2714\"},\"language\":\"Solidity\",\"output\":{\"abi\":[{\"inputs\":[{\"internalType\":\"string\",\"name\":\"name_\",\"type\":\"string\"},{\"internalType\":\"string\",\"name\":\"symbol_\",\"type\":\"string\"}],\"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\":\"from\",\"type\":\"address\"},{\"indexed\":true,\"internalType\":\"address\",\"name\":\"to\",\"type\":\"address\"},{\"indexed\":false,\"internalType\":\"uint256\",\"name\":\"value\",\"type\":\"uint256\"}],\"name\":\"Transfer\",\"type\":\"event\"},{\"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\":\"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\":\"name\",\"outputs\":[{\"internalType\":\"string\",\"name\":\"\",\"type\":\"string\"}],\"stateMutability\":\"view\",\"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\"}],\"devdoc\":{\"details\":\"Implementation of the {IERC20} interface. This implementation is agnostic to the way tokens are created. This means that a supply mechanism has to be added in a derived contract using {_mint}. For a generic mechanism see {ERC20PresetMinterPauser}. TIP: For a detailed writeup see our guide https://forum.zeppelin.solutions/t/how-to-implement-erc20-supply-mechanisms/226[How to implement supply mechanisms]. We have followed general OpenZeppelin Contracts guidelines: functions revert instead returning `false` on failure. This behavior is nonetheless conventional and does not conflict with the expectations of ERC20 applications. Additionally, an {Approval} event is emitted on calls to {transferFrom}. This allows applications to reconstruct the allowance for all accounts just by listening to said events. Other implementations of the EIP may not emit these events, as it isn't required by the specification. Finally, the non-standard {decreaseAllowance} and {increaseAllowance} functions have been added to mitigate the well-known issues around setting allowances. See {IERC20-approve}.\",\"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}.\"},\"constructor\":{\"details\":\"Sets the values for {name} and {symbol}. The default value of {decimals} is 18. To select a different value for {decimals} you should overload it. All two of these values are immutable: they can only be set once during construction.\"},\"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`). Tokens usually opt for a value of 18, imitating the relationship between Ether and Wei. This is the value {ERC20} uses, unless this function is overridden; 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.\"},\"name()\":{\"details\":\"Returns the name of the token.\"},\"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\":{},\"version\":1}},\"settings\":{\"compilationTarget\":{\"lib/openzeppelin-contracts/contracts/token/ERC20/ERC20.sol\":\"ERC20\"},\"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/\",\":automate/=lib/automate/contracts/\",\":ds-test/=lib/forge-std/lib/ds-test/src/\",\":erc4626-tests/=lib/automate/lib/openzeppelin-contracts/lib/erc4626-tests/\",\":forge-std/=lib/forge-std/src/\",\":gelato/=lib/automate/contracts/\",\":hardhat/=lib/automate/node_modules/hardhat/\",\":kontrol-cheatcodes/=lib/kontrol-cheatcodes/src/\",\":lib-keccak/=lib/lib-keccak/contracts/\",\":openzeppelin-contracts-upgradeable/=lib/openzeppelin-contracts-upgradeable/\",\":openzeppelin-contracts/=lib/openzeppelin-contracts/\",\":prb-test/=lib/automate/lib/prb-test/src/\",\":prb/-est/=lib/automate/lib/prb-test/src/\",\":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\"]}},\"version\":1}","metadata":{"compiler":{"version":"0.8.15+commit.e14f2714"},"language":"Solidity","output":{"abi":[{"inputs":[{"internalType":"string","name":"name_","type":"string"},{"internalType":"string","name":"symbol_","type":"string"}],"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":"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":[{"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":"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":"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":"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"}]}],"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}."},"constructor":{"details":"Sets the values for {name} and {symbol}. The default value of {decimals} is 18. To select a different value for {decimals} you should overload it. All two of these values are immutable: they can only be set once during construction."},"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`). Tokens usually opt for a value of 18, imitating the relationship between Ether and Wei. This is the value {ERC20} uses, unless this function is overridden; 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."},"name()":{"details":"Returns the name of the token."},"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":{},"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/","automate/=lib/automate/contracts/","ds-test/=lib/forge-std/lib/ds-test/src/","erc4626-tests/=lib/automate/lib/openzeppelin-contracts/lib/erc4626-tests/","forge-std/=lib/forge-std/src/","gelato/=lib/automate/contracts/","hardhat/=lib/automate/node_modules/hardhat/","kontrol-cheatcodes/=lib/kontrol-cheatcodes/src/","lib-keccak/=lib/lib-keccak/contracts/","openzeppelin-contracts-upgradeable/=lib/openzeppelin-contracts-upgradeable/","openzeppelin-contracts/=lib/openzeppelin-contracts/","prb-test/=lib/automate/lib/prb-test/src/","prb/-est/=lib/automate/lib/prb-test/src/","safe-contracts/=lib/safe-contracts/contracts/","solady/=lib/solady/","solmate/=lib/solmate/src/"],"optimizer":{"enabled":true,"runs":999999},"metadata":{"bytecodeHash":"none"},"compilationTarget":{"lib/openzeppelin-contracts/contracts/token/ERC20/ERC20.sol":"ERC20"},"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"}},"version":1},"storageLayout":{"storage":[{"astId":50345,"contract":"lib/openzeppelin-contracts/contracts/token/ERC20/ERC20.sol:ERC20","label":"_balances","offset":0,"slot":"0","type":"t_mapping(t_address,t_uint256)"},{"astId":50351,"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":50353,"contract":"lib/openzeppelin-contracts/contracts/token/ERC20/ERC20.sol:ERC20","label":"_totalSupply","offset":0,"slot":"2","type":"t_uint256"},{"astId":50355,"contract":"lib/openzeppelin-contracts/contracts/token/ERC20/ERC20.sol:ERC20","label":"_name","offset":0,"slot":"3","type":"t_string_storage"},{"astId":50357,"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","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"},"devdoc":{"version":1,"kind":"dev","details":"Implementation of the {IERC20} interface. This implementation is agnostic to the way tokens are created. This means that a supply mechanism has to be added in a derived contract using {_mint}. For a generic mechanism see {ERC20PresetMinterPauser}. TIP: For a detailed writeup see our guide https://forum.zeppelin.solutions/t/how-to-implement-erc20-supply-mechanisms/226[How to implement supply mechanisms]. We have followed general OpenZeppelin Contracts guidelines: functions revert instead returning `false` on failure. This behavior is nonetheless conventional and does not conflict with the expectations of ERC20 applications. Additionally, an {Approval} event is emitted on calls to {transferFrom}. This allows applications to reconstruct the allowance for all accounts just by listening to said events. Other implementations of the EIP may not emit these events, as it isn't required by the specification. Finally, the non-standard {decreaseAllowance} and {increaseAllowance} functions have been added to mitigate the well-known issues around setting allowances. See {IERC20-approve}.","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}."},"constructor":{"details":"Sets the values for {name} and {symbol}. The default value of {decimals} is 18. To select a different value for {decimals} you should overload it. All two of these values are immutable: they can only be set once during construction."},"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`). Tokens usually opt for a value of 18, imitating the relationship between Ether and Wei. This is the value {ERC20} uses, unless this function is overridden; 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."},"name()":{"details":"Returns the name of the token."},"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`."}}},"ast":{"absolutePath":"lib/openzeppelin-contracts/contracts/token/ERC20/ERC20.sol","id":50916,"exportedSymbols":{"Context":[53902],"ERC20":[50915],"IERC20":[50993],"IERC20Metadata":[51699]},"nodeType":"SourceUnit","src":"105:12513:50","nodes":[{"id":50331,"nodeType":"PragmaDirective","src":"105:23:50","nodes":[],"literals":["solidity","^","0.8",".0"]},{"id":50332,"nodeType":"ImportDirective","src":"130:22:50","nodes":[],"absolutePath":"lib/openzeppelin-contracts/contracts/token/ERC20/IERC20.sol","file":"./IERC20.sol","nameLocation":"-1:-1:-1","scope":50916,"sourceUnit":50994,"symbolAliases":[],"unitAlias":""},{"id":50333,"nodeType":"ImportDirective","src":"153:41:50","nodes":[],"absolutePath":"lib/openzeppelin-contracts/contracts/token/ERC20/extensions/IERC20Metadata.sol","file":"./extensions/IERC20Metadata.sol","nameLocation":"-1:-1:-1","scope":50916,"sourceUnit":51700,"symbolAliases":[],"unitAlias":""},{"id":50334,"nodeType":"ImportDirective","src":"195:33:50","nodes":[],"absolutePath":"lib/openzeppelin-contracts/contracts/utils/Context.sol","file":"../../utils/Context.sol","nameLocation":"-1:-1:-1","scope":50916,"sourceUnit":53903,"symbolAliases":[],"unitAlias":""},{"id":50915,"nodeType":"ContractDefinition","src":"1403:11214:50","nodes":[{"id":50345,"nodeType":"VariableDeclaration","src":"1459:45:50","nodes":[],"constant":false,"mutability":"mutable","name":"_balances","nameLocation":"1495:9:50","scope":50915,"stateVariable":true,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_mapping$_t_address_$_t_uint256_$","typeString":"mapping(address => uint256)"},"typeName":{"id":50344,"keyType":{"id":50342,"name":"address","nodeType":"ElementaryTypeName","src":"1467:7:50","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"}},"nodeType":"Mapping","src":"1459:27:50","typeDescriptions":{"typeIdentifier":"t_mapping$_t_address_$_t_uint256_$","typeString":"mapping(address => uint256)"},"valueType":{"id":50343,"name":"uint256","nodeType":"ElementaryTypeName","src":"1478:7:50","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}}},"visibility":"private"},{"id":50351,"nodeType":"VariableDeclaration","src":"1511:67:50","nodes":[],"constant":false,"mutability":"mutable","name":"_allowances","nameLocation":"1567:11:50","scope":50915,"stateVariable":true,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_mapping$_t_address_$_t_mapping$_t_address_$_t_uint256_$_$","typeString":"mapping(address => mapping(address => uint256))"},"typeName":{"id":50350,"keyType":{"id":50346,"name":"address","nodeType":"ElementaryTypeName","src":"1519:7:50","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"}},"nodeType":"Mapping","src":"1511:47:50","typeDescriptions":{"typeIdentifier":"t_mapping$_t_address_$_t_mapping$_t_address_$_t_uint256_$_$","typeString":"mapping(address => mapping(address => uint256))"},"valueType":{"id":50349,"keyType":{"id":50347,"name":"address","nodeType":"ElementaryTypeName","src":"1538:7:50","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"}},"nodeType":"Mapping","src":"1530:27:50","typeDescriptions":{"typeIdentifier":"t_mapping$_t_address_$_t_uint256_$","typeString":"mapping(address => uint256)"},"valueType":{"id":50348,"name":"uint256","nodeType":"ElementaryTypeName","src":"1549:7:50","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}}}},"visibility":"private"},{"id":50353,"nodeType":"VariableDeclaration","src":"1585:28:50","nodes":[],"constant":false,"mutability":"mutable","name":"_totalSupply","nameLocation":"1601:12:50","scope":50915,"stateVariable":true,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"},"typeName":{"id":50352,"name":"uint256","nodeType":"ElementaryTypeName","src":"1585:7:50","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"visibility":"private"},{"id":50355,"nodeType":"VariableDeclaration","src":"1620:20:50","nodes":[],"constant":false,"mutability":"mutable","name":"_name","nameLocation":"1635:5:50","scope":50915,"stateVariable":true,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_string_storage","typeString":"string"},"typeName":{"id":50354,"name":"string","nodeType":"ElementaryTypeName","src":"1620:6:50","typeDescriptions":{"typeIdentifier":"t_string_storage_ptr","typeString":"string"}},"visibility":"private"},{"id":50357,"nodeType":"VariableDeclaration","src":"1646:22:50","nodes":[],"constant":false,"mutability":"mutable","name":"_symbol","nameLocation":"1661:7:50","scope":50915,"stateVariable":true,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_string_storage","typeString":"string"},"typeName":{"id":50356,"name":"string","nodeType":"ElementaryTypeName","src":"1646:6:50","typeDescriptions":{"typeIdentifier":"t_string_storage_ptr","typeString":"string"}},"visibility":"private"},{"id":50374,"nodeType":"FunctionDefinition","src":"1978:113:50","nodes":[],"body":{"id":50373,"nodeType":"Block","src":"2034:57:50","nodes":[],"statements":[{"expression":{"id":50367,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"leftHandSide":{"id":50365,"name":"_name","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":50355,"src":"2044:5:50","typeDescriptions":{"typeIdentifier":"t_string_storage","typeString":"string storage ref"}},"nodeType":"Assignment","operator":"=","rightHandSide":{"id":50366,"name":"name_","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":50360,"src":"2052:5:50","typeDescriptions":{"typeIdentifier":"t_string_memory_ptr","typeString":"string memory"}},"src":"2044:13:50","typeDescriptions":{"typeIdentifier":"t_string_storage","typeString":"string storage ref"}},"id":50368,"nodeType":"ExpressionStatement","src":"2044:13:50"},{"expression":{"id":50371,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"leftHandSide":{"id":50369,"name":"_symbol","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":50357,"src":"2067:7:50","typeDescriptions":{"typeIdentifier":"t_string_storage","typeString":"string storage ref"}},"nodeType":"Assignment","operator":"=","rightHandSide":{"id":50370,"name":"symbol_","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":50362,"src":"2077:7:50","typeDescriptions":{"typeIdentifier":"t_string_memory_ptr","typeString":"string memory"}},"src":"2067:17:50","typeDescriptions":{"typeIdentifier":"t_string_storage","typeString":"string storage ref"}},"id":50372,"nodeType":"ExpressionStatement","src":"2067:17:50"}]},"documentation":{"id":50358,"nodeType":"StructuredDocumentation","src":"1675:298:50","text":" @dev Sets the values for {name} and {symbol}.\n The default value of {decimals} is 18. To select a different value for\n {decimals} you should overload it.\n All two of these values are immutable: they can only be set once during\n construction."},"implemented":true,"kind":"constructor","modifiers":[],"name":"","nameLocation":"-1:-1:-1","parameters":{"id":50363,"nodeType":"ParameterList","parameters":[{"constant":false,"id":50360,"mutability":"mutable","name":"name_","nameLocation":"2004:5:50","nodeType":"VariableDeclaration","scope":50374,"src":"1990:19:50","stateVariable":false,"storageLocation":"memory","typeDescriptions":{"typeIdentifier":"t_string_memory_ptr","typeString":"string"},"typeName":{"id":50359,"name":"string","nodeType":"ElementaryTypeName","src":"1990:6:50","typeDescriptions":{"typeIdentifier":"t_string_storage_ptr","typeString":"string"}},"visibility":"internal"},{"constant":false,"id":50362,"mutability":"mutable","name":"symbol_","nameLocation":"2025:7:50","nodeType":"VariableDeclaration","scope":50374,"src":"2011:21:50","stateVariable":false,"storageLocation":"memory","typeDescriptions":{"typeIdentifier":"t_string_memory_ptr","typeString":"string"},"typeName":{"id":50361,"name":"string","nodeType":"ElementaryTypeName","src":"2011:6:50","typeDescriptions":{"typeIdentifier":"t_string_storage_ptr","typeString":"string"}},"visibility":"internal"}],"src":"1989:44:50"},"returnParameters":{"id":50364,"nodeType":"ParameterList","parameters":[],"src":"2034:0:50"},"scope":50915,"stateMutability":"nonpayable","virtual":false,"visibility":"public"},{"id":50384,"nodeType":"FunctionDefinition","src":"2156:98:50","nodes":[],"body":{"id":50383,"nodeType":"Block","src":"2225:29:50","nodes":[],"statements":[{"expression":{"id":50381,"name":"_name","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":50355,"src":"2242:5:50","typeDescriptions":{"typeIdentifier":"t_string_storage","typeString":"string storage ref"}},"functionReturnParameters":50380,"id":50382,"nodeType":"Return","src":"2235:12:50"}]},"baseFunctions":[51686],"documentation":{"id":50375,"nodeType":"StructuredDocumentation","src":"2097:54:50","text":" @dev Returns the name of the token."},"functionSelector":"06fdde03","implemented":true,"kind":"function","modifiers":[],"name":"name","nameLocation":"2165:4:50","overrides":{"id":50377,"nodeType":"OverrideSpecifier","overrides":[],"src":"2192:8:50"},"parameters":{"id":50376,"nodeType":"ParameterList","parameters":[],"src":"2169:2:50"},"returnParameters":{"id":50380,"nodeType":"ParameterList","parameters":[{"constant":false,"id":50379,"mutability":"mutable","name":"","nameLocation":"-1:-1:-1","nodeType":"VariableDeclaration","scope":50384,"src":"2210:13:50","stateVariable":false,"storageLocation":"memory","typeDescriptions":{"typeIdentifier":"t_string_memory_ptr","typeString":"string"},"typeName":{"id":50378,"name":"string","nodeType":"ElementaryTypeName","src":"2210:6:50","typeDescriptions":{"typeIdentifier":"t_string_storage_ptr","typeString":"string"}},"visibility":"internal"}],"src":"2209:15:50"},"scope":50915,"stateMutability":"view","virtual":true,"visibility":"public"},{"id":50394,"nodeType":"FunctionDefinition","src":"2367:102:50","nodes":[],"body":{"id":50393,"nodeType":"Block","src":"2438:31:50","nodes":[],"statements":[{"expression":{"id":50391,"name":"_symbol","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":50357,"src":"2455:7:50","typeDescriptions":{"typeIdentifier":"t_string_storage","typeString":"string storage ref"}},"functionReturnParameters":50390,"id":50392,"nodeType":"Return","src":"2448:14:50"}]},"baseFunctions":[51692],"documentation":{"id":50385,"nodeType":"StructuredDocumentation","src":"2260:102:50","text":" @dev Returns the symbol of the token, usually a shorter version of the\n name."},"functionSelector":"95d89b41","implemented":true,"kind":"function","modifiers":[],"name":"symbol","nameLocation":"2376:6:50","overrides":{"id":50387,"nodeType":"OverrideSpecifier","overrides":[],"src":"2405:8:50"},"parameters":{"id":50386,"nodeType":"ParameterList","parameters":[],"src":"2382:2:50"},"returnParameters":{"id":50390,"nodeType":"ParameterList","parameters":[{"constant":false,"id":50389,"mutability":"mutable","name":"","nameLocation":"-1:-1:-1","nodeType":"VariableDeclaration","scope":50394,"src":"2423:13:50","stateVariable":false,"storageLocation":"memory","typeDescriptions":{"typeIdentifier":"t_string_memory_ptr","typeString":"string"},"typeName":{"id":50388,"name":"string","nodeType":"ElementaryTypeName","src":"2423:6:50","typeDescriptions":{"typeIdentifier":"t_string_storage_ptr","typeString":"string"}},"visibility":"internal"}],"src":"2422:15:50"},"scope":50915,"stateMutability":"view","virtual":true,"visibility":"public"},{"id":50404,"nodeType":"FunctionDefinition","src":"3093:91:50","nodes":[],"body":{"id":50403,"nodeType":"Block","src":"3158:26:50","nodes":[],"statements":[{"expression":{"hexValue":"3138","id":50401,"isConstant":false,"isLValue":false,"isPure":true,"kind":"number","lValueRequested":false,"nodeType":"Literal","src":"3175:2:50","typeDescriptions":{"typeIdentifier":"t_rational_18_by_1","typeString":"int_const 18"},"value":"18"},"functionReturnParameters":50400,"id":50402,"nodeType":"Return","src":"3168:9:50"}]},"baseFunctions":[51698],"documentation":{"id":50395,"nodeType":"StructuredDocumentation","src":"2475:613:50","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 Tokens usually opt for a value of 18, imitating the relationship between\n Ether and Wei. This is the value {ERC20} uses, unless this function is\n overridden;\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":"3102:8:50","overrides":{"id":50397,"nodeType":"OverrideSpecifier","overrides":[],"src":"3133:8:50"},"parameters":{"id":50396,"nodeType":"ParameterList","parameters":[],"src":"3110:2:50"},"returnParameters":{"id":50400,"nodeType":"ParameterList","parameters":[{"constant":false,"id":50399,"mutability":"mutable","name":"","nameLocation":"-1:-1:-1","nodeType":"VariableDeclaration","scope":50404,"src":"3151:5:50","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_uint8","typeString":"uint8"},"typeName":{"id":50398,"name":"uint8","nodeType":"ElementaryTypeName","src":"3151:5:50","typeDescriptions":{"typeIdentifier":"t_uint8","typeString":"uint8"}},"visibility":"internal"}],"src":"3150:7:50"},"scope":50915,"stateMutability":"view","virtual":true,"visibility":"public"},{"id":50414,"nodeType":"FunctionDefinition","src":"3244:106:50","nodes":[],"body":{"id":50413,"nodeType":"Block","src":"3314:36:50","nodes":[],"statements":[{"expression":{"id":50411,"name":"_totalSupply","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":50353,"src":"3331:12:50","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"functionReturnParameters":50410,"id":50412,"nodeType":"Return","src":"3324:19:50"}]},"baseFunctions":[50942],"documentation":{"id":50405,"nodeType":"StructuredDocumentation","src":"3190:49:50","text":" @dev See {IERC20-totalSupply}."},"functionSelector":"18160ddd","implemented":true,"kind":"function","modifiers":[],"name":"totalSupply","nameLocation":"3253:11:50","overrides":{"id":50407,"nodeType":"OverrideSpecifier","overrides":[],"src":"3287:8:50"},"parameters":{"id":50406,"nodeType":"ParameterList","parameters":[],"src":"3264:2:50"},"returnParameters":{"id":50410,"nodeType":"ParameterList","parameters":[{"constant":false,"id":50409,"mutability":"mutable","name":"","nameLocation":"-1:-1:-1","nodeType":"VariableDeclaration","scope":50414,"src":"3305:7:50","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"},"typeName":{"id":50408,"name":"uint256","nodeType":"ElementaryTypeName","src":"3305:7:50","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"visibility":"internal"}],"src":"3304:9:50"},"scope":50915,"stateMutability":"view","virtual":true,"visibility":"public"},{"id":50428,"nodeType":"FunctionDefinition","src":"3408:125:50","nodes":[],"body":{"id":50427,"nodeType":"Block","src":"3491:42:50","nodes":[],"statements":[{"expression":{"baseExpression":{"id":50423,"name":"_balances","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":50345,"src":"3508:9:50","typeDescriptions":{"typeIdentifier":"t_mapping$_t_address_$_t_uint256_$","typeString":"mapping(address => uint256)"}},"id":50425,"indexExpression":{"id":50424,"name":"account","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":50417,"src":"3518:7:50","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"}},"isConstant":false,"isLValue":true,"isPure":false,"lValueRequested":false,"nodeType":"IndexAccess","src":"3508:18:50","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"functionReturnParameters":50422,"id":50426,"nodeType":"Return","src":"3501:25:50"}]},"baseFunctions":[50950],"documentation":{"id":50415,"nodeType":"StructuredDocumentation","src":"3356:47:50","text":" @dev See {IERC20-balanceOf}."},"functionSelector":"70a08231","implemented":true,"kind":"function","modifiers":[],"name":"balanceOf","nameLocation":"3417:9:50","overrides":{"id":50419,"nodeType":"OverrideSpecifier","overrides":[],"src":"3464:8:50"},"parameters":{"id":50418,"nodeType":"ParameterList","parameters":[{"constant":false,"id":50417,"mutability":"mutable","name":"account","nameLocation":"3435:7:50","nodeType":"VariableDeclaration","scope":50428,"src":"3427:15:50","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"},"typeName":{"id":50416,"name":"address","nodeType":"ElementaryTypeName","src":"3427:7:50","stateMutability":"nonpayable","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"}},"visibility":"internal"}],"src":"3426:17:50"},"returnParameters":{"id":50422,"nodeType":"ParameterList","parameters":[{"constant":false,"id":50421,"mutability":"mutable","name":"","nameLocation":"-1:-1:-1","nodeType":"VariableDeclaration","scope":50428,"src":"3482:7:50","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"},"typeName":{"id":50420,"name":"uint256","nodeType":"ElementaryTypeName","src":"3482:7:50","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"visibility":"internal"}],"src":"3481:9:50"},"scope":50915,"stateMutability":"view","virtual":true,"visibility":"public"},{"id":50453,"nodeType":"FunctionDefinition","src":"3729:189:50","nodes":[],"body":{"id":50452,"nodeType":"Block","src":"3814:104:50","nodes":[],"statements":[{"assignments":[50440],"declarations":[{"constant":false,"id":50440,"mutability":"mutable","name":"owner","nameLocation":"3832:5:50","nodeType":"VariableDeclaration","scope":50452,"src":"3824:13:50","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"},"typeName":{"id":50439,"name":"address","nodeType":"ElementaryTypeName","src":"3824:7:50","stateMutability":"nonpayable","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"}},"visibility":"internal"}],"id":50443,"initialValue":{"arguments":[],"expression":{"argumentTypes":[],"id":50441,"name":"_msgSender","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":53892,"src":"3840:10:50","typeDescriptions":{"typeIdentifier":"t_function_internal_view$__$returns$_t_address_$","typeString":"function () view returns (address)"}},"id":50442,"isConstant":false,"isLValue":false,"isPure":false,"kind":"functionCall","lValueRequested":false,"names":[],"nodeType":"FunctionCall","src":"3840:12:50","tryCall":false,"typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"}},"nodeType":"VariableDeclarationStatement","src":"3824:28:50"},{"expression":{"arguments":[{"id":50445,"name":"owner","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":50440,"src":"3872:5:50","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"}},{"id":50446,"name":"to","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":50431,"src":"3879:2:50","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"}},{"id":50447,"name":"amount","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":50433,"src":"3883:6:50","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}}],"expression":{"argumentTypes":[{"typeIdentifier":"t_address","typeString":"address"},{"typeIdentifier":"t_address","typeString":"address"},{"typeIdentifier":"t_uint256","typeString":"uint256"}],"id":50444,"name":"_transfer","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":50676,"src":"3862:9:50","typeDescriptions":{"typeIdentifier":"t_function_internal_nonpayable$_t_address_$_t_address_$_t_uint256_$returns$__$","typeString":"function (address,address,uint256)"}},"id":50448,"isConstant":false,"isLValue":false,"isPure":false,"kind":"functionCall","lValueRequested":false,"names":[],"nodeType":"FunctionCall","src":"3862:28:50","tryCall":false,"typeDescriptions":{"typeIdentifier":"t_tuple$__$","typeString":"tuple()"}},"id":50449,"nodeType":"ExpressionStatement","src":"3862:28:50"},{"expression":{"hexValue":"74727565","id":50450,"isConstant":false,"isLValue":false,"isPure":true,"kind":"bool","lValueRequested":false,"nodeType":"Literal","src":"3907:4:50","typeDescriptions":{"typeIdentifier":"t_bool","typeString":"bool"},"value":"true"},"functionReturnParameters":50438,"id":50451,"nodeType":"Return","src":"3900:11:50"}]},"baseFunctions":[50960],"documentation":{"id":50429,"nodeType":"StructuredDocumentation","src":"3539:185:50","text":" @dev See {IERC20-transfer}.\n Requirements:\n - `to` cannot be the zero address.\n - the caller must have a balance of at least `amount`."},"functionSelector":"a9059cbb","implemented":true,"kind":"function","modifiers":[],"name":"transfer","nameLocation":"3738:8:50","overrides":{"id":50435,"nodeType":"OverrideSpecifier","overrides":[],"src":"3790:8:50"},"parameters":{"id":50434,"nodeType":"ParameterList","parameters":[{"constant":false,"id":50431,"mutability":"mutable","name":"to","nameLocation":"3755:2:50","nodeType":"VariableDeclaration","scope":50453,"src":"3747:10:50","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"},"typeName":{"id":50430,"name":"address","nodeType":"ElementaryTypeName","src":"3747:7:50","stateMutability":"nonpayable","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"}},"visibility":"internal"},{"constant":false,"id":50433,"mutability":"mutable","name":"amount","nameLocation":"3767:6:50","nodeType":"VariableDeclaration","scope":50453,"src":"3759:14:50","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"},"typeName":{"id":50432,"name":"uint256","nodeType":"ElementaryTypeName","src":"3759:7:50","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"visibility":"internal"}],"src":"3746:28:50"},"returnParameters":{"id":50438,"nodeType":"ParameterList","parameters":[{"constant":false,"id":50437,"mutability":"mutable","name":"","nameLocation":"-1:-1:-1","nodeType":"VariableDeclaration","scope":50453,"src":"3808:4:50","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_bool","typeString":"bool"},"typeName":{"id":50436,"name":"bool","nodeType":"ElementaryTypeName","src":"3808:4:50","typeDescriptions":{"typeIdentifier":"t_bool","typeString":"bool"}},"visibility":"internal"}],"src":"3807:6:50"},"scope":50915,"stateMutability":"nonpayable","virtual":true,"visibility":"public"},{"id":50471,"nodeType":"FunctionDefinition","src":"3976:149:50","nodes":[],"body":{"id":50470,"nodeType":"Block","src":"4074:51:50","nodes":[],"statements":[{"expression":{"baseExpression":{"baseExpression":{"id":50464,"name":"_allowances","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":50351,"src":"4091:11:50","typeDescriptions":{"typeIdentifier":"t_mapping$_t_address_$_t_mapping$_t_address_$_t_uint256_$_$","typeString":"mapping(address => mapping(address => uint256))"}},"id":50466,"indexExpression":{"id":50465,"name":"owner","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":50456,"src":"4103:5:50","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"}},"isConstant":false,"isLValue":true,"isPure":false,"lValueRequested":false,"nodeType":"IndexAccess","src":"4091:18:50","typeDescriptions":{"typeIdentifier":"t_mapping$_t_address_$_t_uint256_$","typeString":"mapping(address => uint256)"}},"id":50468,"indexExpression":{"id":50467,"name":"spender","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":50458,"src":"4110:7:50","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"}},"isConstant":false,"isLValue":true,"isPure":false,"lValueRequested":false,"nodeType":"IndexAccess","src":"4091:27:50","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"functionReturnParameters":50463,"id":50469,"nodeType":"Return","src":"4084:34:50"}]},"baseFunctions":[50970],"documentation":{"id":50454,"nodeType":"StructuredDocumentation","src":"3924:47:50","text":" @dev See {IERC20-allowance}."},"functionSelector":"dd62ed3e","implemented":true,"kind":"function","modifiers":[],"name":"allowance","nameLocation":"3985:9:50","overrides":{"id":50460,"nodeType":"OverrideSpecifier","overrides":[],"src":"4047:8:50"},"parameters":{"id":50459,"nodeType":"ParameterList","parameters":[{"constant":false,"id":50456,"mutability":"mutable","name":"owner","nameLocation":"4003:5:50","nodeType":"VariableDeclaration","scope":50471,"src":"3995:13:50","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"},"typeName":{"id":50455,"name":"address","nodeType":"ElementaryTypeName","src":"3995:7:50","stateMutability":"nonpayable","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"}},"visibility":"internal"},{"constant":false,"id":50458,"mutability":"mutable","name":"spender","nameLocation":"4018:7:50","nodeType":"VariableDeclaration","scope":50471,"src":"4010:15:50","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"},"typeName":{"id":50457,"name":"address","nodeType":"ElementaryTypeName","src":"4010:7:50","stateMutability":"nonpayable","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"}},"visibility":"internal"}],"src":"3994:32:50"},"returnParameters":{"id":50463,"nodeType":"ParameterList","parameters":[{"constant":false,"id":50462,"mutability":"mutable","name":"","nameLocation":"-1:-1:-1","nodeType":"VariableDeclaration","scope":50471,"src":"4065:7:50","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"},"typeName":{"id":50461,"name":"uint256","nodeType":"ElementaryTypeName","src":"4065:7:50","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"visibility":"internal"}],"src":"4064:9:50"},"scope":50915,"stateMutability":"view","virtual":true,"visibility":"public"},{"id":50496,"nodeType":"FunctionDefinition","src":"4433:197:50","nodes":[],"body":{"id":50495,"nodeType":"Block","src":"4522:108:50","nodes":[],"statements":[{"assignments":[50483],"declarations":[{"constant":false,"id":50483,"mutability":"mutable","name":"owner","nameLocation":"4540:5:50","nodeType":"VariableDeclaration","scope":50495,"src":"4532:13:50","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"},"typeName":{"id":50482,"name":"address","nodeType":"ElementaryTypeName","src":"4532:7:50","stateMutability":"nonpayable","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"}},"visibility":"internal"}],"id":50486,"initialValue":{"arguments":[],"expression":{"argumentTypes":[],"id":50484,"name":"_msgSender","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":53892,"src":"4548:10:50","typeDescriptions":{"typeIdentifier":"t_function_internal_view$__$returns$_t_address_$","typeString":"function () view returns (address)"}},"id":50485,"isConstant":false,"isLValue":false,"isPure":false,"kind":"functionCall","lValueRequested":false,"names":[],"nodeType":"FunctionCall","src":"4548:12:50","tryCall":false,"typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"}},"nodeType":"VariableDeclarationStatement","src":"4532:28:50"},{"expression":{"arguments":[{"id":50488,"name":"owner","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":50483,"src":"4579:5:50","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"}},{"id":50489,"name":"spender","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":50474,"src":"4586:7:50","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"}},{"id":50490,"name":"amount","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":50476,"src":"4595:6:50","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}}],"expression":{"argumentTypes":[{"typeIdentifier":"t_address","typeString":"address"},{"typeIdentifier":"t_address","typeString":"address"},{"typeIdentifier":"t_uint256","typeString":"uint256"}],"id":50487,"name":"_approve","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":50849,"src":"4570:8:50","typeDescriptions":{"typeIdentifier":"t_function_internal_nonpayable$_t_address_$_t_address_$_t_uint256_$returns$__$","typeString":"function (address,address,uint256)"}},"id":50491,"isConstant":false,"isLValue":false,"isPure":false,"kind":"functionCall","lValueRequested":false,"names":[],"nodeType":"FunctionCall","src":"4570:32:50","tryCall":false,"typeDescriptions":{"typeIdentifier":"t_tuple$__$","typeString":"tuple()"}},"id":50492,"nodeType":"ExpressionStatement","src":"4570:32:50"},{"expression":{"hexValue":"74727565","id":50493,"isConstant":false,"isLValue":false,"isPure":true,"kind":"bool","lValueRequested":false,"nodeType":"Literal","src":"4619:4:50","typeDescriptions":{"typeIdentifier":"t_bool","typeString":"bool"},"value":"true"},"functionReturnParameters":50481,"id":50494,"nodeType":"Return","src":"4612:11:50"}]},"baseFunctions":[50980],"documentation":{"id":50472,"nodeType":"StructuredDocumentation","src":"4131:297:50","text":" @dev See {IERC20-approve}.\n NOTE: If `amount` is the maximum `uint256`, the allowance is not updated on\n `transferFrom`. This is semantically equivalent to an infinite approval.\n Requirements:\n - `spender` cannot be the zero address."},"functionSelector":"095ea7b3","implemented":true,"kind":"function","modifiers":[],"name":"approve","nameLocation":"4442:7:50","overrides":{"id":50478,"nodeType":"OverrideSpecifier","overrides":[],"src":"4498:8:50"},"parameters":{"id":50477,"nodeType":"ParameterList","parameters":[{"constant":false,"id":50474,"mutability":"mutable","name":"spender","nameLocation":"4458:7:50","nodeType":"VariableDeclaration","scope":50496,"src":"4450:15:50","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"},"typeName":{"id":50473,"name":"address","nodeType":"ElementaryTypeName","src":"4450:7:50","stateMutability":"nonpayable","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"}},"visibility":"internal"},{"constant":false,"id":50476,"mutability":"mutable","name":"amount","nameLocation":"4475:6:50","nodeType":"VariableDeclaration","scope":50496,"src":"4467:14:50","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"},"typeName":{"id":50475,"name":"uint256","nodeType":"ElementaryTypeName","src":"4467:7:50","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"visibility":"internal"}],"src":"4449:33:50"},"returnParameters":{"id":50481,"nodeType":"ParameterList","parameters":[{"constant":false,"id":50480,"mutability":"mutable","name":"","nameLocation":"-1:-1:-1","nodeType":"VariableDeclaration","scope":50496,"src":"4516:4:50","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_bool","typeString":"bool"},"typeName":{"id":50479,"name":"bool","nodeType":"ElementaryTypeName","src":"4516:4:50","typeDescriptions":{"typeIdentifier":"t_bool","typeString":"bool"}},"visibility":"internal"}],"src":"4515:6:50"},"scope":50915,"stateMutability":"nonpayable","virtual":true,"visibility":"public"},{"id":50529,"nodeType":"FunctionDefinition","src":"5192:286:50","nodes":[],"body":{"id":50528,"nodeType":"Block","src":"5325:153:50","nodes":[],"statements":[{"assignments":[50510],"declarations":[{"constant":false,"id":50510,"mutability":"mutable","name":"spender","nameLocation":"5343:7:50","nodeType":"VariableDeclaration","scope":50528,"src":"5335:15:50","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"},"typeName":{"id":50509,"name":"address","nodeType":"ElementaryTypeName","src":"5335:7:50","stateMutability":"nonpayable","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"}},"visibility":"internal"}],"id":50513,"initialValue":{"arguments":[],"expression":{"argumentTypes":[],"id":50511,"name":"_msgSender","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":53892,"src":"5353:10:50","typeDescriptions":{"typeIdentifier":"t_function_internal_view$__$returns$_t_address_$","typeString":"function () view returns (address)"}},"id":50512,"isConstant":false,"isLValue":false,"isPure":false,"kind":"functionCall","lValueRequested":false,"names":[],"nodeType":"FunctionCall","src":"5353:12:50","tryCall":false,"typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"}},"nodeType":"VariableDeclarationStatement","src":"5335:30:50"},{"expression":{"arguments":[{"id":50515,"name":"from","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":50499,"src":"5391:4:50","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"}},{"id":50516,"name":"spender","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":50510,"src":"5397:7:50","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"}},{"id":50517,"name":"amount","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":50503,"src":"5406:6:50","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}}],"expression":{"argumentTypes":[{"typeIdentifier":"t_address","typeString":"address"},{"typeIdentifier":"t_address","typeString":"address"},{"typeIdentifier":"t_uint256","typeString":"uint256"}],"id":50514,"name":"_spendAllowance","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":50892,"src":"5375:15:50","typeDescriptions":{"typeIdentifier":"t_function_internal_nonpayable$_t_address_$_t_address_$_t_uint256_$returns$__$","typeString":"function (address,address,uint256)"}},"id":50518,"isConstant":false,"isLValue":false,"isPure":false,"kind":"functionCall","lValueRequested":false,"names":[],"nodeType":"FunctionCall","src":"5375:38:50","tryCall":false,"typeDescriptions":{"typeIdentifier":"t_tuple$__$","typeString":"tuple()"}},"id":50519,"nodeType":"ExpressionStatement","src":"5375:38:50"},{"expression":{"arguments":[{"id":50521,"name":"from","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":50499,"src":"5433:4:50","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"}},{"id":50522,"name":"to","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":50501,"src":"5439:2:50","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"}},{"id":50523,"name":"amount","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":50503,"src":"5443:6:50","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}}],"expression":{"argumentTypes":[{"typeIdentifier":"t_address","typeString":"address"},{"typeIdentifier":"t_address","typeString":"address"},{"typeIdentifier":"t_uint256","typeString":"uint256"}],"id":50520,"name":"_transfer","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":50676,"src":"5423:9:50","typeDescriptions":{"typeIdentifier":"t_function_internal_nonpayable$_t_address_$_t_address_$_t_uint256_$returns$__$","typeString":"function (address,address,uint256)"}},"id":50524,"isConstant":false,"isLValue":false,"isPure":false,"kind":"functionCall","lValueRequested":false,"names":[],"nodeType":"FunctionCall","src":"5423:27:50","tryCall":false,"typeDescriptions":{"typeIdentifier":"t_tuple$__$","typeString":"tuple()"}},"id":50525,"nodeType":"ExpressionStatement","src":"5423:27:50"},{"expression":{"hexValue":"74727565","id":50526,"isConstant":false,"isLValue":false,"isPure":true,"kind":"bool","lValueRequested":false,"nodeType":"Literal","src":"5467:4:50","typeDescriptions":{"typeIdentifier":"t_bool","typeString":"bool"},"value":"true"},"functionReturnParameters":50508,"id":50527,"nodeType":"Return","src":"5460:11:50"}]},"baseFunctions":[50992],"documentation":{"id":50497,"nodeType":"StructuredDocumentation","src":"4636:551:50","text":" @dev See {IERC20-transferFrom}.\n Emits an {Approval} event indicating the updated allowance. This is not\n required by the EIP. See the note at the beginning of {ERC20}.\n NOTE: Does not update the allowance if the current allowance\n is the maximum `uint256`.\n Requirements:\n - `from` and `to` cannot be the zero address.\n - `from` must have a balance of at least `amount`.\n - the caller must have allowance for ``from``'s tokens of at least\n `amount`."},"functionSelector":"23b872dd","implemented":true,"kind":"function","modifiers":[],"name":"transferFrom","nameLocation":"5201:12:50","overrides":{"id":50505,"nodeType":"OverrideSpecifier","overrides":[],"src":"5301:8:50"},"parameters":{"id":50504,"nodeType":"ParameterList","parameters":[{"constant":false,"id":50499,"mutability":"mutable","name":"from","nameLocation":"5231:4:50","nodeType":"VariableDeclaration","scope":50529,"src":"5223:12:50","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"},"typeName":{"id":50498,"name":"address","nodeType":"ElementaryTypeName","src":"5223:7:50","stateMutability":"nonpayable","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"}},"visibility":"internal"},{"constant":false,"id":50501,"mutability":"mutable","name":"to","nameLocation":"5253:2:50","nodeType":"VariableDeclaration","scope":50529,"src":"5245:10:50","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"},"typeName":{"id":50500,"name":"address","nodeType":"ElementaryTypeName","src":"5245:7:50","stateMutability":"nonpayable","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"}},"visibility":"internal"},{"constant":false,"id":50503,"mutability":"mutable","name":"amount","nameLocation":"5273:6:50","nodeType":"VariableDeclaration","scope":50529,"src":"5265:14:50","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"},"typeName":{"id":50502,"name":"uint256","nodeType":"ElementaryTypeName","src":"5265:7:50","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"visibility":"internal"}],"src":"5213:72:50"},"returnParameters":{"id":50508,"nodeType":"ParameterList","parameters":[{"constant":false,"id":50507,"mutability":"mutable","name":"","nameLocation":"-1:-1:-1","nodeType":"VariableDeclaration","scope":50529,"src":"5319:4:50","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_bool","typeString":"bool"},"typeName":{"id":50506,"name":"bool","nodeType":"ElementaryTypeName","src":"5319:4:50","typeDescriptions":{"typeIdentifier":"t_bool","typeString":"bool"}},"visibility":"internal"}],"src":"5318:6:50"},"scope":50915,"stateMutability":"nonpayable","virtual":true,"visibility":"public"},{"id":50558,"nodeType":"FunctionDefinition","src":"5873:234:50","nodes":[],"body":{"id":50557,"nodeType":"Block","src":"5967:140:50","nodes":[],"statements":[{"assignments":[50540],"declarations":[{"constant":false,"id":50540,"mutability":"mutable","name":"owner","nameLocation":"5985:5:50","nodeType":"VariableDeclaration","scope":50557,"src":"5977:13:50","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"},"typeName":{"id":50539,"name":"address","nodeType":"ElementaryTypeName","src":"5977:7:50","stateMutability":"nonpayable","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"}},"visibility":"internal"}],"id":50543,"initialValue":{"arguments":[],"expression":{"argumentTypes":[],"id":50541,"name":"_msgSender","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":53892,"src":"5993:10:50","typeDescriptions":{"typeIdentifier":"t_function_internal_view$__$returns$_t_address_$","typeString":"function () view returns (address)"}},"id":50542,"isConstant":false,"isLValue":false,"isPure":false,"kind":"functionCall","lValueRequested":false,"names":[],"nodeType":"FunctionCall","src":"5993:12:50","tryCall":false,"typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"}},"nodeType":"VariableDeclarationStatement","src":"5977:28:50"},{"expression":{"arguments":[{"id":50545,"name":"owner","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":50540,"src":"6024:5:50","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"}},{"id":50546,"name":"spender","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":50532,"src":"6031:7:50","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"}},{"commonType":{"typeIdentifier":"t_uint256","typeString":"uint256"},"id":50552,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"leftExpression":{"arguments":[{"id":50548,"name":"owner","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":50540,"src":"6050:5:50","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"}},{"id":50549,"name":"spender","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":50532,"src":"6057:7:50","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"}}],"expression":{"argumentTypes":[{"typeIdentifier":"t_address","typeString":"address"},{"typeIdentifier":"t_address","typeString":"address"}],"id":50547,"name":"allowance","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":50471,"src":"6040:9:50","typeDescriptions":{"typeIdentifier":"t_function_internal_view$_t_address_$_t_address_$returns$_t_uint256_$","typeString":"function (address,address) view returns (uint256)"}},"id":50550,"isConstant":false,"isLValue":false,"isPure":false,"kind":"functionCall","lValueRequested":false,"names":[],"nodeType":"FunctionCall","src":"6040:25:50","tryCall":false,"typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"nodeType":"BinaryOperation","operator":"+","rightExpression":{"id":50551,"name":"addedValue","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":50534,"src":"6068:10:50","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"src":"6040:38:50","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}}],"expression":{"argumentTypes":[{"typeIdentifier":"t_address","typeString":"address"},{"typeIdentifier":"t_address","typeString":"address"},{"typeIdentifier":"t_uint256","typeString":"uint256"}],"id":50544,"name":"_approve","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":50849,"src":"6015:8:50","typeDescriptions":{"typeIdentifier":"t_function_internal_nonpayable$_t_address_$_t_address_$_t_uint256_$returns$__$","typeString":"function (address,address,uint256)"}},"id":50553,"isConstant":false,"isLValue":false,"isPure":false,"kind":"functionCall","lValueRequested":false,"names":[],"nodeType":"FunctionCall","src":"6015:64:50","tryCall":false,"typeDescriptions":{"typeIdentifier":"t_tuple$__$","typeString":"tuple()"}},"id":50554,"nodeType":"ExpressionStatement","src":"6015:64:50"},{"expression":{"hexValue":"74727565","id":50555,"isConstant":false,"isLValue":false,"isPure":true,"kind":"bool","lValueRequested":false,"nodeType":"Literal","src":"6096:4:50","typeDescriptions":{"typeIdentifier":"t_bool","typeString":"bool"},"value":"true"},"functionReturnParameters":50538,"id":50556,"nodeType":"Return","src":"6089:11:50"}]},"documentation":{"id":50530,"nodeType":"StructuredDocumentation","src":"5484:384:50","text":" @dev Atomically increases the allowance granted to `spender` by the caller.\n This is an alternative to {approve} that can be used as a mitigation for\n problems described in {IERC20-approve}.\n Emits an {Approval} event indicating the updated allowance.\n Requirements:\n - `spender` cannot be the zero address."},"functionSelector":"39509351","implemented":true,"kind":"function","modifiers":[],"name":"increaseAllowance","nameLocation":"5882:17:50","parameters":{"id":50535,"nodeType":"ParameterList","parameters":[{"constant":false,"id":50532,"mutability":"mutable","name":"spender","nameLocation":"5908:7:50","nodeType":"VariableDeclaration","scope":50558,"src":"5900:15:50","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"},"typeName":{"id":50531,"name":"address","nodeType":"ElementaryTypeName","src":"5900:7:50","stateMutability":"nonpayable","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"}},"visibility":"internal"},{"constant":false,"id":50534,"mutability":"mutable","name":"addedValue","nameLocation":"5925:10:50","nodeType":"VariableDeclaration","scope":50558,"src":"5917:18:50","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"},"typeName":{"id":50533,"name":"uint256","nodeType":"ElementaryTypeName","src":"5917:7:50","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"visibility":"internal"}],"src":"5899:37:50"},"returnParameters":{"id":50538,"nodeType":"ParameterList","parameters":[{"constant":false,"id":50537,"mutability":"mutable","name":"","nameLocation":"-1:-1:-1","nodeType":"VariableDeclaration","scope":50558,"src":"5961:4:50","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_bool","typeString":"bool"},"typeName":{"id":50536,"name":"bool","nodeType":"ElementaryTypeName","src":"5961:4:50","typeDescriptions":{"typeIdentifier":"t_bool","typeString":"bool"}},"visibility":"internal"}],"src":"5960:6:50"},"scope":50915,"stateMutability":"nonpayable","virtual":true,"visibility":"public"},{"id":50599,"nodeType":"FunctionDefinition","src":"6594:427:50","nodes":[],"body":{"id":50598,"nodeType":"Block","src":"6693:328:50","nodes":[],"statements":[{"assignments":[50569],"declarations":[{"constant":false,"id":50569,"mutability":"mutable","name":"owner","nameLocation":"6711:5:50","nodeType":"VariableDeclaration","scope":50598,"src":"6703:13:50","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"},"typeName":{"id":50568,"name":"address","nodeType":"ElementaryTypeName","src":"6703:7:50","stateMutability":"nonpayable","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"}},"visibility":"internal"}],"id":50572,"initialValue":{"arguments":[],"expression":{"argumentTypes":[],"id":50570,"name":"_msgSender","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":53892,"src":"6719:10:50","typeDescriptions":{"typeIdentifier":"t_function_internal_view$__$returns$_t_address_$","typeString":"function () view returns (address)"}},"id":50571,"isConstant":false,"isLValue":false,"isPure":false,"kind":"functionCall","lValueRequested":false,"names":[],"nodeType":"FunctionCall","src":"6719:12:50","tryCall":false,"typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"}},"nodeType":"VariableDeclarationStatement","src":"6703:28:50"},{"assignments":[50574],"declarations":[{"constant":false,"id":50574,"mutability":"mutable","name":"currentAllowance","nameLocation":"6749:16:50","nodeType":"VariableDeclaration","scope":50598,"src":"6741:24:50","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"},"typeName":{"id":50573,"name":"uint256","nodeType":"ElementaryTypeName","src":"6741:7:50","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"visibility":"internal"}],"id":50579,"initialValue":{"arguments":[{"id":50576,"name":"owner","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":50569,"src":"6778:5:50","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"}},{"id":50577,"name":"spender","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":50561,"src":"6785:7:50","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"}}],"expression":{"argumentTypes":[{"typeIdentifier":"t_address","typeString":"address"},{"typeIdentifier":"t_address","typeString":"address"}],"id":50575,"name":"allowance","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":50471,"src":"6768:9:50","typeDescriptions":{"typeIdentifier":"t_function_internal_view$_t_address_$_t_address_$returns$_t_uint256_$","typeString":"function (address,address) view returns (uint256)"}},"id":50578,"isConstant":false,"isLValue":false,"isPure":false,"kind":"functionCall","lValueRequested":false,"names":[],"nodeType":"FunctionCall","src":"6768:25:50","tryCall":false,"typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"nodeType":"VariableDeclarationStatement","src":"6741:52:50"},{"expression":{"arguments":[{"commonType":{"typeIdentifier":"t_uint256","typeString":"uint256"},"id":50583,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"leftExpression":{"id":50581,"name":"currentAllowance","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":50574,"src":"6811:16:50","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"nodeType":"BinaryOperation","operator":">=","rightExpression":{"id":50582,"name":"subtractedValue","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":50563,"src":"6831:15:50","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"src":"6811:35:50","typeDescriptions":{"typeIdentifier":"t_bool","typeString":"bool"}},{"hexValue":"45524332303a2064656372656173656420616c6c6f77616e63652062656c6f77207a65726f","id":50584,"isConstant":false,"isLValue":false,"isPure":true,"kind":"string","lValueRequested":false,"nodeType":"Literal","src":"6848:39:50","typeDescriptions":{"typeIdentifier":"t_stringliteral_f8b476f7d28209d77d4a4ac1fe36b9f8259aa1bb6bddfa6e89de7e51615cf8a8","typeString":"literal_string \"ERC20: decreased allowance below zero\""},"value":"ERC20: decreased allowance below zero"}],"expression":{"argumentTypes":[{"typeIdentifier":"t_bool","typeString":"bool"},{"typeIdentifier":"t_stringliteral_f8b476f7d28209d77d4a4ac1fe36b9f8259aa1bb6bddfa6e89de7e51615cf8a8","typeString":"literal_string \"ERC20: decreased allowance below zero\""}],"id":50580,"name":"require","nodeType":"Identifier","overloadedDeclarations":[-18,-18],"referencedDeclaration":-18,"src":"6803:7:50","typeDescriptions":{"typeIdentifier":"t_function_require_pure$_t_bool_$_t_string_memory_ptr_$returns$__$","typeString":"function (bool,string memory) pure"}},"id":50585,"isConstant":false,"isLValue":false,"isPure":false,"kind":"functionCall","lValueRequested":false,"names":[],"nodeType":"FunctionCall","src":"6803:85:50","tryCall":false,"typeDescriptions":{"typeIdentifier":"t_tuple$__$","typeString":"tuple()"}},"id":50586,"nodeType":"ExpressionStatement","src":"6803:85:50"},{"id":50595,"nodeType":"UncheckedBlock","src":"6898:95:50","statements":[{"expression":{"arguments":[{"id":50588,"name":"owner","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":50569,"src":"6931:5:50","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"}},{"id":50589,"name":"spender","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":50561,"src":"6938:7:50","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"}},{"commonType":{"typeIdentifier":"t_uint256","typeString":"uint256"},"id":50592,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"leftExpression":{"id":50590,"name":"currentAllowance","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":50574,"src":"6947:16:50","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"nodeType":"BinaryOperation","operator":"-","rightExpression":{"id":50591,"name":"subtractedValue","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":50563,"src":"6966:15:50","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"src":"6947:34:50","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}}],"expression":{"argumentTypes":[{"typeIdentifier":"t_address","typeString":"address"},{"typeIdentifier":"t_address","typeString":"address"},{"typeIdentifier":"t_uint256","typeString":"uint256"}],"id":50587,"name":"_approve","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":50849,"src":"6922:8:50","typeDescriptions":{"typeIdentifier":"t_function_internal_nonpayable$_t_address_$_t_address_$_t_uint256_$returns$__$","typeString":"function (address,address,uint256)"}},"id":50593,"isConstant":false,"isLValue":false,"isPure":false,"kind":"functionCall","lValueRequested":false,"names":[],"nodeType":"FunctionCall","src":"6922:60:50","tryCall":false,"typeDescriptions":{"typeIdentifier":"t_tuple$__$","typeString":"tuple()"}},"id":50594,"nodeType":"ExpressionStatement","src":"6922:60:50"}]},{"expression":{"hexValue":"74727565","id":50596,"isConstant":false,"isLValue":false,"isPure":true,"kind":"bool","lValueRequested":false,"nodeType":"Literal","src":"7010:4:50","typeDescriptions":{"typeIdentifier":"t_bool","typeString":"bool"},"value":"true"},"functionReturnParameters":50567,"id":50597,"nodeType":"Return","src":"7003:11:50"}]},"documentation":{"id":50559,"nodeType":"StructuredDocumentation","src":"6113:476:50","text":" @dev Atomically decreases the allowance granted to `spender` by the caller.\n This is an alternative to {approve} that can be used as a mitigation for\n problems described in {IERC20-approve}.\n Emits an {Approval} event indicating the updated allowance.\n Requirements:\n - `spender` cannot be the zero address.\n - `spender` must have allowance for the caller of at least\n `subtractedValue`."},"functionSelector":"a457c2d7","implemented":true,"kind":"function","modifiers":[],"name":"decreaseAllowance","nameLocation":"6603:17:50","parameters":{"id":50564,"nodeType":"ParameterList","parameters":[{"constant":false,"id":50561,"mutability":"mutable","name":"spender","nameLocation":"6629:7:50","nodeType":"VariableDeclaration","scope":50599,"src":"6621:15:50","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"},"typeName":{"id":50560,"name":"address","nodeType":"ElementaryTypeName","src":"6621:7:50","stateMutability":"nonpayable","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"}},"visibility":"internal"},{"constant":false,"id":50563,"mutability":"mutable","name":"subtractedValue","nameLocation":"6646:15:50","nodeType":"VariableDeclaration","scope":50599,"src":"6638:23:50","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"},"typeName":{"id":50562,"name":"uint256","nodeType":"ElementaryTypeName","src":"6638:7:50","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"visibility":"internal"}],"src":"6620:42:50"},"returnParameters":{"id":50567,"nodeType":"ParameterList","parameters":[{"constant":false,"id":50566,"mutability":"mutable","name":"","nameLocation":"-1:-1:-1","nodeType":"VariableDeclaration","scope":50599,"src":"6687:4:50","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_bool","typeString":"bool"},"typeName":{"id":50565,"name":"bool","nodeType":"ElementaryTypeName","src":"6687:4:50","typeDescriptions":{"typeIdentifier":"t_bool","typeString":"bool"}},"visibility":"internal"}],"src":"6686:6:50"},"scope":50915,"stateMutability":"nonpayable","virtual":true,"visibility":"public"},{"id":50676,"nodeType":"FunctionDefinition","src":"7475:651:50","nodes":[],"body":{"id":50675,"nodeType":"Block","src":"7583:543:50","nodes":[],"statements":[{"expression":{"arguments":[{"commonType":{"typeIdentifier":"t_address","typeString":"address"},"id":50615,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"leftExpression":{"id":50610,"name":"from","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":50602,"src":"7601:4:50","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"}},"nodeType":"BinaryOperation","operator":"!=","rightExpression":{"arguments":[{"hexValue":"30","id":50613,"isConstant":false,"isLValue":false,"isPure":true,"kind":"number","lValueRequested":false,"nodeType":"Literal","src":"7617:1:50","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":50612,"isConstant":false,"isLValue":false,"isPure":true,"lValueRequested":false,"nodeType":"ElementaryTypeNameExpression","src":"7609:7:50","typeDescriptions":{"typeIdentifier":"t_type$_t_address_$","typeString":"type(address)"},"typeName":{"id":50611,"name":"address","nodeType":"ElementaryTypeName","src":"7609:7:50","typeDescriptions":{}}},"id":50614,"isConstant":false,"isLValue":false,"isPure":true,"kind":"typeConversion","lValueRequested":false,"names":[],"nodeType":"FunctionCall","src":"7609:10:50","tryCall":false,"typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"}},"src":"7601:18:50","typeDescriptions":{"typeIdentifier":"t_bool","typeString":"bool"}},{"hexValue":"45524332303a207472616e736665722066726f6d20746865207a65726f2061646472657373","id":50616,"isConstant":false,"isLValue":false,"isPure":true,"kind":"string","lValueRequested":false,"nodeType":"Literal","src":"7621:39:50","typeDescriptions":{"typeIdentifier":"t_stringliteral_baecc556b46f4ed0f2b4cb599d60785ac8563dd2dc0a5bf12edea1c39e5e1fea","typeString":"literal_string \"ERC20: transfer from the zero address\""},"value":"ERC20: transfer from the zero address"}],"expression":{"argumentTypes":[{"typeIdentifier":"t_bool","typeString":"bool"},{"typeIdentifier":"t_stringliteral_baecc556b46f4ed0f2b4cb599d60785ac8563dd2dc0a5bf12edea1c39e5e1fea","typeString":"literal_string \"ERC20: transfer from the zero address\""}],"id":50609,"name":"require","nodeType":"Identifier","overloadedDeclarations":[-18,-18],"referencedDeclaration":-18,"src":"7593:7:50","typeDescriptions":{"typeIdentifier":"t_function_require_pure$_t_bool_$_t_string_memory_ptr_$returns$__$","typeString":"function (bool,string memory) pure"}},"id":50617,"isConstant":false,"isLValue":false,"isPure":false,"kind":"functionCall","lValueRequested":false,"names":[],"nodeType":"FunctionCall","src":"7593:68:50","tryCall":false,"typeDescriptions":{"typeIdentifier":"t_tuple$__$","typeString":"tuple()"}},"id":50618,"nodeType":"ExpressionStatement","src":"7593:68:50"},{"expression":{"arguments":[{"commonType":{"typeIdentifier":"t_address","typeString":"address"},"id":50625,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"leftExpression":{"id":50620,"name":"to","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":50604,"src":"7679:2:50","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"}},"nodeType":"BinaryOperation","operator":"!=","rightExpression":{"arguments":[{"hexValue":"30","id":50623,"isConstant":false,"isLValue":false,"isPure":true,"kind":"number","lValueRequested":false,"nodeType":"Literal","src":"7693:1:50","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":50622,"isConstant":false,"isLValue":false,"isPure":true,"lValueRequested":false,"nodeType":"ElementaryTypeNameExpression","src":"7685:7:50","typeDescriptions":{"typeIdentifier":"t_type$_t_address_$","typeString":"type(address)"},"typeName":{"id":50621,"name":"address","nodeType":"ElementaryTypeName","src":"7685:7:50","typeDescriptions":{}}},"id":50624,"isConstant":false,"isLValue":false,"isPure":true,"kind":"typeConversion","lValueRequested":false,"names":[],"nodeType":"FunctionCall","src":"7685:10:50","tryCall":false,"typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"}},"src":"7679:16:50","typeDescriptions":{"typeIdentifier":"t_bool","typeString":"bool"}},{"hexValue":"45524332303a207472616e7366657220746f20746865207a65726f2061646472657373","id":50626,"isConstant":false,"isLValue":false,"isPure":true,"kind":"string","lValueRequested":false,"nodeType":"Literal","src":"7697:37:50","typeDescriptions":{"typeIdentifier":"t_stringliteral_0557e210f7a69a685100a7e4e3d0a7024c546085cee28910fd17d0b081d9516f","typeString":"literal_string \"ERC20: transfer to the zero address\""},"value":"ERC20: transfer to the zero address"}],"expression":{"argumentTypes":[{"typeIdentifier":"t_bool","typeString":"bool"},{"typeIdentifier":"t_stringliteral_0557e210f7a69a685100a7e4e3d0a7024c546085cee28910fd17d0b081d9516f","typeString":"literal_string \"ERC20: transfer to the zero address\""}],"id":50619,"name":"require","nodeType":"Identifier","overloadedDeclarations":[-18,-18],"referencedDeclaration":-18,"src":"7671:7:50","typeDescriptions":{"typeIdentifier":"t_function_require_pure$_t_bool_$_t_string_memory_ptr_$returns$__$","typeString":"function (bool,string memory) pure"}},"id":50627,"isConstant":false,"isLValue":false,"isPure":false,"kind":"functionCall","lValueRequested":false,"names":[],"nodeType":"FunctionCall","src":"7671:64:50","tryCall":false,"typeDescriptions":{"typeIdentifier":"t_tuple$__$","typeString":"tuple()"}},"id":50628,"nodeType":"ExpressionStatement","src":"7671:64:50"},{"expression":{"arguments":[{"id":50630,"name":"from","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":50602,"src":"7767:4:50","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"}},{"id":50631,"name":"to","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":50604,"src":"7773:2:50","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"}},{"id":50632,"name":"amount","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":50606,"src":"7777:6:50","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}}],"expression":{"argumentTypes":[{"typeIdentifier":"t_address","typeString":"address"},{"typeIdentifier":"t_address","typeString":"address"},{"typeIdentifier":"t_uint256","typeString":"uint256"}],"id":50629,"name":"_beforeTokenTransfer","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":50903,"src":"7746:20:50","typeDescriptions":{"typeIdentifier":"t_function_internal_nonpayable$_t_address_$_t_address_$_t_uint256_$returns$__$","typeString":"function (address,address,uint256)"}},"id":50633,"isConstant":false,"isLValue":false,"isPure":false,"kind":"functionCall","lValueRequested":false,"names":[],"nodeType":"FunctionCall","src":"7746:38:50","tryCall":false,"typeDescriptions":{"typeIdentifier":"t_tuple$__$","typeString":"tuple()"}},"id":50634,"nodeType":"ExpressionStatement","src":"7746:38:50"},{"assignments":[50636],"declarations":[{"constant":false,"id":50636,"mutability":"mutable","name":"fromBalance","nameLocation":"7803:11:50","nodeType":"VariableDeclaration","scope":50675,"src":"7795:19:50","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"},"typeName":{"id":50635,"name":"uint256","nodeType":"ElementaryTypeName","src":"7795:7:50","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"visibility":"internal"}],"id":50640,"initialValue":{"baseExpression":{"id":50637,"name":"_balances","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":50345,"src":"7817:9:50","typeDescriptions":{"typeIdentifier":"t_mapping$_t_address_$_t_uint256_$","typeString":"mapping(address => uint256)"}},"id":50639,"indexExpression":{"id":50638,"name":"from","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":50602,"src":"7827:4:50","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"}},"isConstant":false,"isLValue":true,"isPure":false,"lValueRequested":false,"nodeType":"IndexAccess","src":"7817:15:50","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"nodeType":"VariableDeclarationStatement","src":"7795:37:50"},{"expression":{"arguments":[{"commonType":{"typeIdentifier":"t_uint256","typeString":"uint256"},"id":50644,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"leftExpression":{"id":50642,"name":"fromBalance","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":50636,"src":"7850:11:50","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"nodeType":"BinaryOperation","operator":">=","rightExpression":{"id":50643,"name":"amount","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":50606,"src":"7865:6:50","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"src":"7850:21:50","typeDescriptions":{"typeIdentifier":"t_bool","typeString":"bool"}},{"hexValue":"45524332303a207472616e7366657220616d6f756e7420657863656564732062616c616e6365","id":50645,"isConstant":false,"isLValue":false,"isPure":true,"kind":"string","lValueRequested":false,"nodeType":"Literal","src":"7873:40:50","typeDescriptions":{"typeIdentifier":"t_stringliteral_4107e8a8b9e94bf8ff83080ddec1c0bffe897ebc2241b89d44f66b3d274088b6","typeString":"literal_string \"ERC20: transfer amount exceeds balance\""},"value":"ERC20: transfer amount exceeds balance"}],"expression":{"argumentTypes":[{"typeIdentifier":"t_bool","typeString":"bool"},{"typeIdentifier":"t_stringliteral_4107e8a8b9e94bf8ff83080ddec1c0bffe897ebc2241b89d44f66b3d274088b6","typeString":"literal_string \"ERC20: transfer amount exceeds balance\""}],"id":50641,"name":"require","nodeType":"Identifier","overloadedDeclarations":[-18,-18],"referencedDeclaration":-18,"src":"7842:7:50","typeDescriptions":{"typeIdentifier":"t_function_require_pure$_t_bool_$_t_string_memory_ptr_$returns$__$","typeString":"function (bool,string memory) pure"}},"id":50646,"isConstant":false,"isLValue":false,"isPure":false,"kind":"functionCall","lValueRequested":false,"names":[],"nodeType":"FunctionCall","src":"7842:72:50","tryCall":false,"typeDescriptions":{"typeIdentifier":"t_tuple$__$","typeString":"tuple()"}},"id":50647,"nodeType":"ExpressionStatement","src":"7842:72:50"},{"id":50656,"nodeType":"UncheckedBlock","src":"7924:73:50","statements":[{"expression":{"id":50654,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"leftHandSide":{"baseExpression":{"id":50648,"name":"_balances","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":50345,"src":"7948:9:50","typeDescriptions":{"typeIdentifier":"t_mapping$_t_address_$_t_uint256_$","typeString":"mapping(address => uint256)"}},"id":50650,"indexExpression":{"id":50649,"name":"from","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":50602,"src":"7958:4:50","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"}},"isConstant":false,"isLValue":true,"isPure":false,"lValueRequested":true,"nodeType":"IndexAccess","src":"7948:15:50","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"nodeType":"Assignment","operator":"=","rightHandSide":{"commonType":{"typeIdentifier":"t_uint256","typeString":"uint256"},"id":50653,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"leftExpression":{"id":50651,"name":"fromBalance","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":50636,"src":"7966:11:50","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"nodeType":"BinaryOperation","operator":"-","rightExpression":{"id":50652,"name":"amount","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":50606,"src":"7980:6:50","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"src":"7966:20:50","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"src":"7948:38:50","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"id":50655,"nodeType":"ExpressionStatement","src":"7948:38:50"}]},{"expression":{"id":50661,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"leftHandSide":{"baseExpression":{"id":50657,"name":"_balances","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":50345,"src":"8006:9:50","typeDescriptions":{"typeIdentifier":"t_mapping$_t_address_$_t_uint256_$","typeString":"mapping(address => uint256)"}},"id":50659,"indexExpression":{"id":50658,"name":"to","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":50604,"src":"8016:2:50","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"}},"isConstant":false,"isLValue":true,"isPure":false,"lValueRequested":true,"nodeType":"IndexAccess","src":"8006:13:50","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"nodeType":"Assignment","operator":"+=","rightHandSide":{"id":50660,"name":"amount","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":50606,"src":"8023:6:50","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"src":"8006:23:50","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"id":50662,"nodeType":"ExpressionStatement","src":"8006:23:50"},{"eventCall":{"arguments":[{"id":50664,"name":"from","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":50602,"src":"8054:4:50","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"}},{"id":50665,"name":"to","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":50604,"src":"8060:2:50","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"}},{"id":50666,"name":"amount","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":50606,"src":"8064:6:50","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}}],"expression":{"argumentTypes":[{"typeIdentifier":"t_address","typeString":"address"},{"typeIdentifier":"t_address","typeString":"address"},{"typeIdentifier":"t_uint256","typeString":"uint256"}],"id":50663,"name":"Transfer","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":50927,"src":"8045:8:50","typeDescriptions":{"typeIdentifier":"t_function_event_nonpayable$_t_address_$_t_address_$_t_uint256_$returns$__$","typeString":"function (address,address,uint256)"}},"id":50667,"isConstant":false,"isLValue":false,"isPure":false,"kind":"functionCall","lValueRequested":false,"names":[],"nodeType":"FunctionCall","src":"8045:26:50","tryCall":false,"typeDescriptions":{"typeIdentifier":"t_tuple$__$","typeString":"tuple()"}},"id":50668,"nodeType":"EmitStatement","src":"8040:31:50"},{"expression":{"arguments":[{"id":50670,"name":"from","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":50602,"src":"8102:4:50","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"}},{"id":50671,"name":"to","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":50604,"src":"8108:2:50","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"}},{"id":50672,"name":"amount","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":50606,"src":"8112:6:50","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}}],"expression":{"argumentTypes":[{"typeIdentifier":"t_address","typeString":"address"},{"typeIdentifier":"t_address","typeString":"address"},{"typeIdentifier":"t_uint256","typeString":"uint256"}],"id":50669,"name":"_afterTokenTransfer","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":50914,"src":"8082:19:50","typeDescriptions":{"typeIdentifier":"t_function_internal_nonpayable$_t_address_$_t_address_$_t_uint256_$returns$__$","typeString":"function (address,address,uint256)"}},"id":50673,"isConstant":false,"isLValue":false,"isPure":false,"kind":"functionCall","lValueRequested":false,"names":[],"nodeType":"FunctionCall","src":"8082:37:50","tryCall":false,"typeDescriptions":{"typeIdentifier":"t_tuple$__$","typeString":"tuple()"}},"id":50674,"nodeType":"ExpressionStatement","src":"8082:37:50"}]},"documentation":{"id":50600,"nodeType":"StructuredDocumentation","src":"7027:443:50","text":" @dev Moves `amount` of tokens from `from` to `to`.\n This internal function is equivalent to {transfer}, and can be used to\n e.g. implement automatic token fees, slashing mechanisms, etc.\n Emits a {Transfer} event.\n Requirements:\n - `from` cannot be the zero address.\n - `to` cannot be the zero address.\n - `from` must have a balance of at least `amount`."},"implemented":true,"kind":"function","modifiers":[],"name":"_transfer","nameLocation":"7484:9:50","parameters":{"id":50607,"nodeType":"ParameterList","parameters":[{"constant":false,"id":50602,"mutability":"mutable","name":"from","nameLocation":"7511:4:50","nodeType":"VariableDeclaration","scope":50676,"src":"7503:12:50","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"},"typeName":{"id":50601,"name":"address","nodeType":"ElementaryTypeName","src":"7503:7:50","stateMutability":"nonpayable","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"}},"visibility":"internal"},{"constant":false,"id":50604,"mutability":"mutable","name":"to","nameLocation":"7533:2:50","nodeType":"VariableDeclaration","scope":50676,"src":"7525:10:50","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"},"typeName":{"id":50603,"name":"address","nodeType":"ElementaryTypeName","src":"7525:7:50","stateMutability":"nonpayable","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"}},"visibility":"internal"},{"constant":false,"id":50606,"mutability":"mutable","name":"amount","nameLocation":"7553:6:50","nodeType":"VariableDeclaration","scope":50676,"src":"7545:14:50","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"},"typeName":{"id":50605,"name":"uint256","nodeType":"ElementaryTypeName","src":"7545:7:50","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"visibility":"internal"}],"src":"7493:72:50"},"returnParameters":{"id":50608,"nodeType":"ParameterList","parameters":[],"src":"7583:0:50"},"scope":50915,"stateMutability":"nonpayable","virtual":true,"visibility":"internal"},{"id":50732,"nodeType":"FunctionDefinition","src":"8402:389:50","nodes":[],"body":{"id":50731,"nodeType":"Block","src":"8467:324:50","nodes":[],"statements":[{"expression":{"arguments":[{"commonType":{"typeIdentifier":"t_address","typeString":"address"},"id":50690,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"leftExpression":{"id":50685,"name":"account","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":50679,"src":"8485:7:50","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"}},"nodeType":"BinaryOperation","operator":"!=","rightExpression":{"arguments":[{"hexValue":"30","id":50688,"isConstant":false,"isLValue":false,"isPure":true,"kind":"number","lValueRequested":false,"nodeType":"Literal","src":"8504:1:50","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":50687,"isConstant":false,"isLValue":false,"isPure":true,"lValueRequested":false,"nodeType":"ElementaryTypeNameExpression","src":"8496:7:50","typeDescriptions":{"typeIdentifier":"t_type$_t_address_$","typeString":"type(address)"},"typeName":{"id":50686,"name":"address","nodeType":"ElementaryTypeName","src":"8496:7:50","typeDescriptions":{}}},"id":50689,"isConstant":false,"isLValue":false,"isPure":true,"kind":"typeConversion","lValueRequested":false,"names":[],"nodeType":"FunctionCall","src":"8496:10:50","tryCall":false,"typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"}},"src":"8485:21:50","typeDescriptions":{"typeIdentifier":"t_bool","typeString":"bool"}},{"hexValue":"45524332303a206d696e7420746f20746865207a65726f2061646472657373","id":50691,"isConstant":false,"isLValue":false,"isPure":true,"kind":"string","lValueRequested":false,"nodeType":"Literal","src":"8508:33:50","typeDescriptions":{"typeIdentifier":"t_stringliteral_fc0b381caf0a47702017f3c4b358ebe3d3aff6c60ce819a8bf3ef5a95d4f202e","typeString":"literal_string \"ERC20: mint to the zero address\""},"value":"ERC20: mint to the zero address"}],"expression":{"argumentTypes":[{"typeIdentifier":"t_bool","typeString":"bool"},{"typeIdentifier":"t_stringliteral_fc0b381caf0a47702017f3c4b358ebe3d3aff6c60ce819a8bf3ef5a95d4f202e","typeString":"literal_string \"ERC20: mint to the zero address\""}],"id":50684,"name":"require","nodeType":"Identifier","overloadedDeclarations":[-18,-18],"referencedDeclaration":-18,"src":"8477:7:50","typeDescriptions":{"typeIdentifier":"t_function_require_pure$_t_bool_$_t_string_memory_ptr_$returns$__$","typeString":"function (bool,string memory) pure"}},"id":50692,"isConstant":false,"isLValue":false,"isPure":false,"kind":"functionCall","lValueRequested":false,"names":[],"nodeType":"FunctionCall","src":"8477:65:50","tryCall":false,"typeDescriptions":{"typeIdentifier":"t_tuple$__$","typeString":"tuple()"}},"id":50693,"nodeType":"ExpressionStatement","src":"8477:65:50"},{"expression":{"arguments":[{"arguments":[{"hexValue":"30","id":50697,"isConstant":false,"isLValue":false,"isPure":true,"kind":"number","lValueRequested":false,"nodeType":"Literal","src":"8582:1:50","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":50696,"isConstant":false,"isLValue":false,"isPure":true,"lValueRequested":false,"nodeType":"ElementaryTypeNameExpression","src":"8574:7:50","typeDescriptions":{"typeIdentifier":"t_type$_t_address_$","typeString":"type(address)"},"typeName":{"id":50695,"name":"address","nodeType":"ElementaryTypeName","src":"8574:7:50","typeDescriptions":{}}},"id":50698,"isConstant":false,"isLValue":false,"isPure":true,"kind":"typeConversion","lValueRequested":false,"names":[],"nodeType":"FunctionCall","src":"8574:10:50","tryCall":false,"typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"}},{"id":50699,"name":"account","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":50679,"src":"8586:7:50","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"}},{"id":50700,"name":"amount","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":50681,"src":"8595:6:50","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}}],"expression":{"argumentTypes":[{"typeIdentifier":"t_address","typeString":"address"},{"typeIdentifier":"t_address","typeString":"address"},{"typeIdentifier":"t_uint256","typeString":"uint256"}],"id":50694,"name":"_beforeTokenTransfer","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":50903,"src":"8553:20:50","typeDescriptions":{"typeIdentifier":"t_function_internal_nonpayable$_t_address_$_t_address_$_t_uint256_$returns$__$","typeString":"function (address,address,uint256)"}},"id":50701,"isConstant":false,"isLValue":false,"isPure":false,"kind":"functionCall","lValueRequested":false,"names":[],"nodeType":"FunctionCall","src":"8553:49:50","tryCall":false,"typeDescriptions":{"typeIdentifier":"t_tuple$__$","typeString":"tuple()"}},"id":50702,"nodeType":"ExpressionStatement","src":"8553:49:50"},{"expression":{"id":50705,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"leftHandSide":{"id":50703,"name":"_totalSupply","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":50353,"src":"8613:12:50","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"nodeType":"Assignment","operator":"+=","rightHandSide":{"id":50704,"name":"amount","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":50681,"src":"8629:6:50","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"src":"8613:22:50","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"id":50706,"nodeType":"ExpressionStatement","src":"8613:22:50"},{"expression":{"id":50711,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"leftHandSide":{"baseExpression":{"id":50707,"name":"_balances","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":50345,"src":"8645:9:50","typeDescriptions":{"typeIdentifier":"t_mapping$_t_address_$_t_uint256_$","typeString":"mapping(address => uint256)"}},"id":50709,"indexExpression":{"id":50708,"name":"account","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":50679,"src":"8655:7:50","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"}},"isConstant":false,"isLValue":true,"isPure":false,"lValueRequested":true,"nodeType":"IndexAccess","src":"8645:18:50","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"nodeType":"Assignment","operator":"+=","rightHandSide":{"id":50710,"name":"amount","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":50681,"src":"8667:6:50","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"src":"8645:28:50","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"id":50712,"nodeType":"ExpressionStatement","src":"8645:28:50"},{"eventCall":{"arguments":[{"arguments":[{"hexValue":"30","id":50716,"isConstant":false,"isLValue":false,"isPure":true,"kind":"number","lValueRequested":false,"nodeType":"Literal","src":"8705:1:50","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":50715,"isConstant":false,"isLValue":false,"isPure":true,"lValueRequested":false,"nodeType":"ElementaryTypeNameExpression","src":"8697:7:50","typeDescriptions":{"typeIdentifier":"t_type$_t_address_$","typeString":"type(address)"},"typeName":{"id":50714,"name":"address","nodeType":"ElementaryTypeName","src":"8697:7:50","typeDescriptions":{}}},"id":50717,"isConstant":false,"isLValue":false,"isPure":true,"kind":"typeConversion","lValueRequested":false,"names":[],"nodeType":"FunctionCall","src":"8697:10:50","tryCall":false,"typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"}},{"id":50718,"name":"account","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":50679,"src":"8709:7:50","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"}},{"id":50719,"name":"amount","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":50681,"src":"8718:6:50","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}}],"expression":{"argumentTypes":[{"typeIdentifier":"t_address","typeString":"address"},{"typeIdentifier":"t_address","typeString":"address"},{"typeIdentifier":"t_uint256","typeString":"uint256"}],"id":50713,"name":"Transfer","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":50927,"src":"8688:8:50","typeDescriptions":{"typeIdentifier":"t_function_event_nonpayable$_t_address_$_t_address_$_t_uint256_$returns$__$","typeString":"function (address,address,uint256)"}},"id":50720,"isConstant":false,"isLValue":false,"isPure":false,"kind":"functionCall","lValueRequested":false,"names":[],"nodeType":"FunctionCall","src":"8688:37:50","tryCall":false,"typeDescriptions":{"typeIdentifier":"t_tuple$__$","typeString":"tuple()"}},"id":50721,"nodeType":"EmitStatement","src":"8683:42:50"},{"expression":{"arguments":[{"arguments":[{"hexValue":"30","id":50725,"isConstant":false,"isLValue":false,"isPure":true,"kind":"number","lValueRequested":false,"nodeType":"Literal","src":"8764:1:50","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":50724,"isConstant":false,"isLValue":false,"isPure":true,"lValueRequested":false,"nodeType":"ElementaryTypeNameExpression","src":"8756:7:50","typeDescriptions":{"typeIdentifier":"t_type$_t_address_$","typeString":"type(address)"},"typeName":{"id":50723,"name":"address","nodeType":"ElementaryTypeName","src":"8756:7:50","typeDescriptions":{}}},"id":50726,"isConstant":false,"isLValue":false,"isPure":true,"kind":"typeConversion","lValueRequested":false,"names":[],"nodeType":"FunctionCall","src":"8756:10:50","tryCall":false,"typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"}},{"id":50727,"name":"account","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":50679,"src":"8768:7:50","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"}},{"id":50728,"name":"amount","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":50681,"src":"8777:6:50","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}}],"expression":{"argumentTypes":[{"typeIdentifier":"t_address","typeString":"address"},{"typeIdentifier":"t_address","typeString":"address"},{"typeIdentifier":"t_uint256","typeString":"uint256"}],"id":50722,"name":"_afterTokenTransfer","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":50914,"src":"8736:19:50","typeDescriptions":{"typeIdentifier":"t_function_internal_nonpayable$_t_address_$_t_address_$_t_uint256_$returns$__$","typeString":"function (address,address,uint256)"}},"id":50729,"isConstant":false,"isLValue":false,"isPure":false,"kind":"functionCall","lValueRequested":false,"names":[],"nodeType":"FunctionCall","src":"8736:48:50","tryCall":false,"typeDescriptions":{"typeIdentifier":"t_tuple$__$","typeString":"tuple()"}},"id":50730,"nodeType":"ExpressionStatement","src":"8736:48:50"}]},"documentation":{"id":50677,"nodeType":"StructuredDocumentation","src":"8132:265:50","text":"@dev Creates `amount` tokens and assigns them to `account`, increasing\n the total supply.\n Emits a {Transfer} event with `from` set to the zero address.\n Requirements:\n - `account` cannot be the zero address."},"implemented":true,"kind":"function","modifiers":[],"name":"_mint","nameLocation":"8411:5:50","parameters":{"id":50682,"nodeType":"ParameterList","parameters":[{"constant":false,"id":50679,"mutability":"mutable","name":"account","nameLocation":"8425:7:50","nodeType":"VariableDeclaration","scope":50732,"src":"8417:15:50","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"},"typeName":{"id":50678,"name":"address","nodeType":"ElementaryTypeName","src":"8417:7:50","stateMutability":"nonpayable","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"}},"visibility":"internal"},{"constant":false,"id":50681,"mutability":"mutable","name":"amount","nameLocation":"8442:6:50","nodeType":"VariableDeclaration","scope":50732,"src":"8434:14:50","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"},"typeName":{"id":50680,"name":"uint256","nodeType":"ElementaryTypeName","src":"8434:7:50","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"visibility":"internal"}],"src":"8416:33:50"},"returnParameters":{"id":50683,"nodeType":"ParameterList","parameters":[],"src":"8467:0:50"},"scope":50915,"stateMutability":"nonpayable","virtual":true,"visibility":"internal"},{"id":50804,"nodeType":"FunctionDefinition","src":"9111:576:50","nodes":[],"body":{"id":50803,"nodeType":"Block","src":"9176:511:50","nodes":[],"statements":[{"expression":{"arguments":[{"commonType":{"typeIdentifier":"t_address","typeString":"address"},"id":50746,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"leftExpression":{"id":50741,"name":"account","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":50735,"src":"9194:7:50","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"}},"nodeType":"BinaryOperation","operator":"!=","rightExpression":{"arguments":[{"hexValue":"30","id":50744,"isConstant":false,"isLValue":false,"isPure":true,"kind":"number","lValueRequested":false,"nodeType":"Literal","src":"9213:1:50","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":50743,"isConstant":false,"isLValue":false,"isPure":true,"lValueRequested":false,"nodeType":"ElementaryTypeNameExpression","src":"9205:7:50","typeDescriptions":{"typeIdentifier":"t_type$_t_address_$","typeString":"type(address)"},"typeName":{"id":50742,"name":"address","nodeType":"ElementaryTypeName","src":"9205:7:50","typeDescriptions":{}}},"id":50745,"isConstant":false,"isLValue":false,"isPure":true,"kind":"typeConversion","lValueRequested":false,"names":[],"nodeType":"FunctionCall","src":"9205:10:50","tryCall":false,"typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"}},"src":"9194:21:50","typeDescriptions":{"typeIdentifier":"t_bool","typeString":"bool"}},{"hexValue":"45524332303a206275726e2066726f6d20746865207a65726f2061646472657373","id":50747,"isConstant":false,"isLValue":false,"isPure":true,"kind":"string","lValueRequested":false,"nodeType":"Literal","src":"9217:35:50","typeDescriptions":{"typeIdentifier":"t_stringliteral_b16788493b576042bb52c50ed56189e0b250db113c7bfb1c3897d25cf9632d7f","typeString":"literal_string \"ERC20: burn from the zero address\""},"value":"ERC20: burn from the zero address"}],"expression":{"argumentTypes":[{"typeIdentifier":"t_bool","typeString":"bool"},{"typeIdentifier":"t_stringliteral_b16788493b576042bb52c50ed56189e0b250db113c7bfb1c3897d25cf9632d7f","typeString":"literal_string \"ERC20: burn from the zero address\""}],"id":50740,"name":"require","nodeType":"Identifier","overloadedDeclarations":[-18,-18],"referencedDeclaration":-18,"src":"9186:7:50","typeDescriptions":{"typeIdentifier":"t_function_require_pure$_t_bool_$_t_string_memory_ptr_$returns$__$","typeString":"function (bool,string memory) pure"}},"id":50748,"isConstant":false,"isLValue":false,"isPure":false,"kind":"functionCall","lValueRequested":false,"names":[],"nodeType":"FunctionCall","src":"9186:67:50","tryCall":false,"typeDescriptions":{"typeIdentifier":"t_tuple$__$","typeString":"tuple()"}},"id":50749,"nodeType":"ExpressionStatement","src":"9186:67:50"},{"expression":{"arguments":[{"id":50751,"name":"account","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":50735,"src":"9285:7:50","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"}},{"arguments":[{"hexValue":"30","id":50754,"isConstant":false,"isLValue":false,"isPure":true,"kind":"number","lValueRequested":false,"nodeType":"Literal","src":"9302:1:50","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":50753,"isConstant":false,"isLValue":false,"isPure":true,"lValueRequested":false,"nodeType":"ElementaryTypeNameExpression","src":"9294:7:50","typeDescriptions":{"typeIdentifier":"t_type$_t_address_$","typeString":"type(address)"},"typeName":{"id":50752,"name":"address","nodeType":"ElementaryTypeName","src":"9294:7:50","typeDescriptions":{}}},"id":50755,"isConstant":false,"isLValue":false,"isPure":true,"kind":"typeConversion","lValueRequested":false,"names":[],"nodeType":"FunctionCall","src":"9294:10:50","tryCall":false,"typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"}},{"id":50756,"name":"amount","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":50737,"src":"9306:6:50","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}}],"expression":{"argumentTypes":[{"typeIdentifier":"t_address","typeString":"address"},{"typeIdentifier":"t_address","typeString":"address"},{"typeIdentifier":"t_uint256","typeString":"uint256"}],"id":50750,"name":"_beforeTokenTransfer","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":50903,"src":"9264:20:50","typeDescriptions":{"typeIdentifier":"t_function_internal_nonpayable$_t_address_$_t_address_$_t_uint256_$returns$__$","typeString":"function (address,address,uint256)"}},"id":50757,"isConstant":false,"isLValue":false,"isPure":false,"kind":"functionCall","lValueRequested":false,"names":[],"nodeType":"FunctionCall","src":"9264:49:50","tryCall":false,"typeDescriptions":{"typeIdentifier":"t_tuple$__$","typeString":"tuple()"}},"id":50758,"nodeType":"ExpressionStatement","src":"9264:49:50"},{"assignments":[50760],"declarations":[{"constant":false,"id":50760,"mutability":"mutable","name":"accountBalance","nameLocation":"9332:14:50","nodeType":"VariableDeclaration","scope":50803,"src":"9324:22:50","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"},"typeName":{"id":50759,"name":"uint256","nodeType":"ElementaryTypeName","src":"9324:7:50","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"visibility":"internal"}],"id":50764,"initialValue":{"baseExpression":{"id":50761,"name":"_balances","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":50345,"src":"9349:9:50","typeDescriptions":{"typeIdentifier":"t_mapping$_t_address_$_t_uint256_$","typeString":"mapping(address => uint256)"}},"id":50763,"indexExpression":{"id":50762,"name":"account","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":50735,"src":"9359:7:50","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"}},"isConstant":false,"isLValue":true,"isPure":false,"lValueRequested":false,"nodeType":"IndexAccess","src":"9349:18:50","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"nodeType":"VariableDeclarationStatement","src":"9324:43:50"},{"expression":{"arguments":[{"commonType":{"typeIdentifier":"t_uint256","typeString":"uint256"},"id":50768,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"leftExpression":{"id":50766,"name":"accountBalance","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":50760,"src":"9385:14:50","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"nodeType":"BinaryOperation","operator":">=","rightExpression":{"id":50767,"name":"amount","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":50737,"src":"9403:6:50","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"src":"9385:24:50","typeDescriptions":{"typeIdentifier":"t_bool","typeString":"bool"}},{"hexValue":"45524332303a206275726e20616d6f756e7420657863656564732062616c616e6365","id":50769,"isConstant":false,"isLValue":false,"isPure":true,"kind":"string","lValueRequested":false,"nodeType":"Literal","src":"9411:36:50","typeDescriptions":{"typeIdentifier":"t_stringliteral_149b126e7125232b4200af45303d04fba8b74653b1a295a6a561a528c33fefdd","typeString":"literal_string \"ERC20: burn amount exceeds balance\""},"value":"ERC20: burn amount exceeds balance"}],"expression":{"argumentTypes":[{"typeIdentifier":"t_bool","typeString":"bool"},{"typeIdentifier":"t_stringliteral_149b126e7125232b4200af45303d04fba8b74653b1a295a6a561a528c33fefdd","typeString":"literal_string \"ERC20: burn amount exceeds balance\""}],"id":50765,"name":"require","nodeType":"Identifier","overloadedDeclarations":[-18,-18],"referencedDeclaration":-18,"src":"9377:7:50","typeDescriptions":{"typeIdentifier":"t_function_require_pure$_t_bool_$_t_string_memory_ptr_$returns$__$","typeString":"function (bool,string memory) pure"}},"id":50770,"isConstant":false,"isLValue":false,"isPure":false,"kind":"functionCall","lValueRequested":false,"names":[],"nodeType":"FunctionCall","src":"9377:71:50","tryCall":false,"typeDescriptions":{"typeIdentifier":"t_tuple$__$","typeString":"tuple()"}},"id":50771,"nodeType":"ExpressionStatement","src":"9377:71:50"},{"id":50780,"nodeType":"UncheckedBlock","src":"9458:79:50","statements":[{"expression":{"id":50778,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"leftHandSide":{"baseExpression":{"id":50772,"name":"_balances","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":50345,"src":"9482:9:50","typeDescriptions":{"typeIdentifier":"t_mapping$_t_address_$_t_uint256_$","typeString":"mapping(address => uint256)"}},"id":50774,"indexExpression":{"id":50773,"name":"account","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":50735,"src":"9492:7:50","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"}},"isConstant":false,"isLValue":true,"isPure":false,"lValueRequested":true,"nodeType":"IndexAccess","src":"9482:18:50","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"nodeType":"Assignment","operator":"=","rightHandSide":{"commonType":{"typeIdentifier":"t_uint256","typeString":"uint256"},"id":50777,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"leftExpression":{"id":50775,"name":"accountBalance","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":50760,"src":"9503:14:50","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"nodeType":"BinaryOperation","operator":"-","rightExpression":{"id":50776,"name":"amount","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":50737,"src":"9520:6:50","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"src":"9503:23:50","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"src":"9482:44:50","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"id":50779,"nodeType":"ExpressionStatement","src":"9482:44:50"}]},{"expression":{"id":50783,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"leftHandSide":{"id":50781,"name":"_totalSupply","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":50353,"src":"9546:12:50","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"nodeType":"Assignment","operator":"-=","rightHandSide":{"id":50782,"name":"amount","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":50737,"src":"9562:6:50","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"src":"9546:22:50","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"id":50784,"nodeType":"ExpressionStatement","src":"9546:22:50"},{"eventCall":{"arguments":[{"id":50786,"name":"account","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":50735,"src":"9593:7:50","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"}},{"arguments":[{"hexValue":"30","id":50789,"isConstant":false,"isLValue":false,"isPure":true,"kind":"number","lValueRequested":false,"nodeType":"Literal","src":"9610:1:50","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":50788,"isConstant":false,"isLValue":false,"isPure":true,"lValueRequested":false,"nodeType":"ElementaryTypeNameExpression","src":"9602:7:50","typeDescriptions":{"typeIdentifier":"t_type$_t_address_$","typeString":"type(address)"},"typeName":{"id":50787,"name":"address","nodeType":"ElementaryTypeName","src":"9602:7:50","typeDescriptions":{}}},"id":50790,"isConstant":false,"isLValue":false,"isPure":true,"kind":"typeConversion","lValueRequested":false,"names":[],"nodeType":"FunctionCall","src":"9602:10:50","tryCall":false,"typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"}},{"id":50791,"name":"amount","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":50737,"src":"9614:6:50","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}}],"expression":{"argumentTypes":[{"typeIdentifier":"t_address","typeString":"address"},{"typeIdentifier":"t_address","typeString":"address"},{"typeIdentifier":"t_uint256","typeString":"uint256"}],"id":50785,"name":"Transfer","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":50927,"src":"9584:8:50","typeDescriptions":{"typeIdentifier":"t_function_event_nonpayable$_t_address_$_t_address_$_t_uint256_$returns$__$","typeString":"function (address,address,uint256)"}},"id":50792,"isConstant":false,"isLValue":false,"isPure":false,"kind":"functionCall","lValueRequested":false,"names":[],"nodeType":"FunctionCall","src":"9584:37:50","tryCall":false,"typeDescriptions":{"typeIdentifier":"t_tuple$__$","typeString":"tuple()"}},"id":50793,"nodeType":"EmitStatement","src":"9579:42:50"},{"expression":{"arguments":[{"id":50795,"name":"account","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":50735,"src":"9652:7:50","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"}},{"arguments":[{"hexValue":"30","id":50798,"isConstant":false,"isLValue":false,"isPure":true,"kind":"number","lValueRequested":false,"nodeType":"Literal","src":"9669:1:50","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":50797,"isConstant":false,"isLValue":false,"isPure":true,"lValueRequested":false,"nodeType":"ElementaryTypeNameExpression","src":"9661:7:50","typeDescriptions":{"typeIdentifier":"t_type$_t_address_$","typeString":"type(address)"},"typeName":{"id":50796,"name":"address","nodeType":"ElementaryTypeName","src":"9661:7:50","typeDescriptions":{}}},"id":50799,"isConstant":false,"isLValue":false,"isPure":true,"kind":"typeConversion","lValueRequested":false,"names":[],"nodeType":"FunctionCall","src":"9661:10:50","tryCall":false,"typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"}},{"id":50800,"name":"amount","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":50737,"src":"9673:6:50","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}}],"expression":{"argumentTypes":[{"typeIdentifier":"t_address","typeString":"address"},{"typeIdentifier":"t_address","typeString":"address"},{"typeIdentifier":"t_uint256","typeString":"uint256"}],"id":50794,"name":"_afterTokenTransfer","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":50914,"src":"9632:19:50","typeDescriptions":{"typeIdentifier":"t_function_internal_nonpayable$_t_address_$_t_address_$_t_uint256_$returns$__$","typeString":"function (address,address,uint256)"}},"id":50801,"isConstant":false,"isLValue":false,"isPure":false,"kind":"functionCall","lValueRequested":false,"names":[],"nodeType":"FunctionCall","src":"9632:48:50","tryCall":false,"typeDescriptions":{"typeIdentifier":"t_tuple$__$","typeString":"tuple()"}},"id":50802,"nodeType":"ExpressionStatement","src":"9632:48:50"}]},"documentation":{"id":50733,"nodeType":"StructuredDocumentation","src":"8797:309:50","text":" @dev Destroys `amount` tokens from `account`, reducing the\n total supply.\n Emits a {Transfer} event with `to` set to the zero address.\n Requirements:\n - `account` cannot be the zero address.\n - `account` must have at least `amount` tokens."},"implemented":true,"kind":"function","modifiers":[],"name":"_burn","nameLocation":"9120:5:50","parameters":{"id":50738,"nodeType":"ParameterList","parameters":[{"constant":false,"id":50735,"mutability":"mutable","name":"account","nameLocation":"9134:7:50","nodeType":"VariableDeclaration","scope":50804,"src":"9126:15:50","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"},"typeName":{"id":50734,"name":"address","nodeType":"ElementaryTypeName","src":"9126:7:50","stateMutability":"nonpayable","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"}},"visibility":"internal"},{"constant":false,"id":50737,"mutability":"mutable","name":"amount","nameLocation":"9151:6:50","nodeType":"VariableDeclaration","scope":50804,"src":"9143:14:50","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"},"typeName":{"id":50736,"name":"uint256","nodeType":"ElementaryTypeName","src":"9143:7:50","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"visibility":"internal"}],"src":"9125:33:50"},"returnParameters":{"id":50739,"nodeType":"ParameterList","parameters":[],"src":"9176:0:50"},"scope":50915,"stateMutability":"nonpayable","virtual":true,"visibility":"internal"},{"id":50849,"nodeType":"FunctionDefinition","src":"10110:370:50","nodes":[],"body":{"id":50848,"nodeType":"Block","src":"10223:257:50","nodes":[],"statements":[{"expression":{"arguments":[{"commonType":{"typeIdentifier":"t_address","typeString":"address"},"id":50820,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"leftExpression":{"id":50815,"name":"owner","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":50807,"src":"10241:5:50","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"}},"nodeType":"BinaryOperation","operator":"!=","rightExpression":{"arguments":[{"hexValue":"30","id":50818,"isConstant":false,"isLValue":false,"isPure":true,"kind":"number","lValueRequested":false,"nodeType":"Literal","src":"10258:1:50","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":50817,"isConstant":false,"isLValue":false,"isPure":true,"lValueRequested":false,"nodeType":"ElementaryTypeNameExpression","src":"10250:7:50","typeDescriptions":{"typeIdentifier":"t_type$_t_address_$","typeString":"type(address)"},"typeName":{"id":50816,"name":"address","nodeType":"ElementaryTypeName","src":"10250:7:50","typeDescriptions":{}}},"id":50819,"isConstant":false,"isLValue":false,"isPure":true,"kind":"typeConversion","lValueRequested":false,"names":[],"nodeType":"FunctionCall","src":"10250:10:50","tryCall":false,"typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"}},"src":"10241:19:50","typeDescriptions":{"typeIdentifier":"t_bool","typeString":"bool"}},{"hexValue":"45524332303a20617070726f76652066726f6d20746865207a65726f2061646472657373","id":50821,"isConstant":false,"isLValue":false,"isPure":true,"kind":"string","lValueRequested":false,"nodeType":"Literal","src":"10262:38:50","typeDescriptions":{"typeIdentifier":"t_stringliteral_c953f4879035ed60e766b34720f656aab5c697b141d924c283124ecedb91c208","typeString":"literal_string \"ERC20: approve from the zero address\""},"value":"ERC20: approve from the zero address"}],"expression":{"argumentTypes":[{"typeIdentifier":"t_bool","typeString":"bool"},{"typeIdentifier":"t_stringliteral_c953f4879035ed60e766b34720f656aab5c697b141d924c283124ecedb91c208","typeString":"literal_string \"ERC20: approve from the zero address\""}],"id":50814,"name":"require","nodeType":"Identifier","overloadedDeclarations":[-18,-18],"referencedDeclaration":-18,"src":"10233:7:50","typeDescriptions":{"typeIdentifier":"t_function_require_pure$_t_bool_$_t_string_memory_ptr_$returns$__$","typeString":"function (bool,string memory) pure"}},"id":50822,"isConstant":false,"isLValue":false,"isPure":false,"kind":"functionCall","lValueRequested":false,"names":[],"nodeType":"FunctionCall","src":"10233:68:50","tryCall":false,"typeDescriptions":{"typeIdentifier":"t_tuple$__$","typeString":"tuple()"}},"id":50823,"nodeType":"ExpressionStatement","src":"10233:68:50"},{"expression":{"arguments":[{"commonType":{"typeIdentifier":"t_address","typeString":"address"},"id":50830,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"leftExpression":{"id":50825,"name":"spender","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":50809,"src":"10319:7:50","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"}},"nodeType":"BinaryOperation","operator":"!=","rightExpression":{"arguments":[{"hexValue":"30","id":50828,"isConstant":false,"isLValue":false,"isPure":true,"kind":"number","lValueRequested":false,"nodeType":"Literal","src":"10338:1:50","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":50827,"isConstant":false,"isLValue":false,"isPure":true,"lValueRequested":false,"nodeType":"ElementaryTypeNameExpression","src":"10330:7:50","typeDescriptions":{"typeIdentifier":"t_type$_t_address_$","typeString":"type(address)"},"typeName":{"id":50826,"name":"address","nodeType":"ElementaryTypeName","src":"10330:7:50","typeDescriptions":{}}},"id":50829,"isConstant":false,"isLValue":false,"isPure":true,"kind":"typeConversion","lValueRequested":false,"names":[],"nodeType":"FunctionCall","src":"10330:10:50","tryCall":false,"typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"}},"src":"10319:21:50","typeDescriptions":{"typeIdentifier":"t_bool","typeString":"bool"}},{"hexValue":"45524332303a20617070726f766520746f20746865207a65726f2061646472657373","id":50831,"isConstant":false,"isLValue":false,"isPure":true,"kind":"string","lValueRequested":false,"nodeType":"Literal","src":"10342:36:50","typeDescriptions":{"typeIdentifier":"t_stringliteral_24883cc5fe64ace9d0df1893501ecb93c77180f0ff69cca79affb3c316dc8029","typeString":"literal_string \"ERC20: approve to the zero address\""},"value":"ERC20: approve to the zero address"}],"expression":{"argumentTypes":[{"typeIdentifier":"t_bool","typeString":"bool"},{"typeIdentifier":"t_stringliteral_24883cc5fe64ace9d0df1893501ecb93c77180f0ff69cca79affb3c316dc8029","typeString":"literal_string \"ERC20: approve to the zero address\""}],"id":50824,"name":"require","nodeType":"Identifier","overloadedDeclarations":[-18,-18],"referencedDeclaration":-18,"src":"10311:7:50","typeDescriptions":{"typeIdentifier":"t_function_require_pure$_t_bool_$_t_string_memory_ptr_$returns$__$","typeString":"function (bool,string memory) pure"}},"id":50832,"isConstant":false,"isLValue":false,"isPure":false,"kind":"functionCall","lValueRequested":false,"names":[],"nodeType":"FunctionCall","src":"10311:68:50","tryCall":false,"typeDescriptions":{"typeIdentifier":"t_tuple$__$","typeString":"tuple()"}},"id":50833,"nodeType":"ExpressionStatement","src":"10311:68:50"},{"expression":{"id":50840,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"leftHandSide":{"baseExpression":{"baseExpression":{"id":50834,"name":"_allowances","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":50351,"src":"10390:11:50","typeDescriptions":{"typeIdentifier":"t_mapping$_t_address_$_t_mapping$_t_address_$_t_uint256_$_$","typeString":"mapping(address => mapping(address => uint256))"}},"id":50837,"indexExpression":{"id":50835,"name":"owner","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":50807,"src":"10402:5:50","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"}},"isConstant":false,"isLValue":true,"isPure":false,"lValueRequested":false,"nodeType":"IndexAccess","src":"10390:18:50","typeDescriptions":{"typeIdentifier":"t_mapping$_t_address_$_t_uint256_$","typeString":"mapping(address => uint256)"}},"id":50838,"indexExpression":{"id":50836,"name":"spender","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":50809,"src":"10409:7:50","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"}},"isConstant":false,"isLValue":true,"isPure":false,"lValueRequested":true,"nodeType":"IndexAccess","src":"10390:27:50","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"nodeType":"Assignment","operator":"=","rightHandSide":{"id":50839,"name":"amount","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":50811,"src":"10420:6:50","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"src":"10390:36:50","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"id":50841,"nodeType":"ExpressionStatement","src":"10390:36:50"},{"eventCall":{"arguments":[{"id":50843,"name":"owner","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":50807,"src":"10450:5:50","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"}},{"id":50844,"name":"spender","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":50809,"src":"10457:7:50","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"}},{"id":50845,"name":"amount","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":50811,"src":"10466:6:50","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}}],"expression":{"argumentTypes":[{"typeIdentifier":"t_address","typeString":"address"},{"typeIdentifier":"t_address","typeString":"address"},{"typeIdentifier":"t_uint256","typeString":"uint256"}],"id":50842,"name":"Approval","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":50936,"src":"10441:8:50","typeDescriptions":{"typeIdentifier":"t_function_event_nonpayable$_t_address_$_t_address_$_t_uint256_$returns$__$","typeString":"function (address,address,uint256)"}},"id":50846,"isConstant":false,"isLValue":false,"isPure":false,"kind":"functionCall","lValueRequested":false,"names":[],"nodeType":"FunctionCall","src":"10441:32:50","tryCall":false,"typeDescriptions":{"typeIdentifier":"t_tuple$__$","typeString":"tuple()"}},"id":50847,"nodeType":"EmitStatement","src":"10436:37:50"}]},"documentation":{"id":50805,"nodeType":"StructuredDocumentation","src":"9693:412:50","text":" @dev Sets `amount` as the allowance of `spender` over the `owner` s tokens.\n This internal function is equivalent to `approve`, and can be used to\n e.g. set automatic allowances for certain subsystems, etc.\n Emits an {Approval} event.\n Requirements:\n - `owner` cannot be the zero address.\n - `spender` cannot be the zero address."},"implemented":true,"kind":"function","modifiers":[],"name":"_approve","nameLocation":"10119:8:50","parameters":{"id":50812,"nodeType":"ParameterList","parameters":[{"constant":false,"id":50807,"mutability":"mutable","name":"owner","nameLocation":"10145:5:50","nodeType":"VariableDeclaration","scope":50849,"src":"10137:13:50","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"},"typeName":{"id":50806,"name":"address","nodeType":"ElementaryTypeName","src":"10137:7:50","stateMutability":"nonpayable","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"}},"visibility":"internal"},{"constant":false,"id":50809,"mutability":"mutable","name":"spender","nameLocation":"10168:7:50","nodeType":"VariableDeclaration","scope":50849,"src":"10160:15:50","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"},"typeName":{"id":50808,"name":"address","nodeType":"ElementaryTypeName","src":"10160:7:50","stateMutability":"nonpayable","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"}},"visibility":"internal"},{"constant":false,"id":50811,"mutability":"mutable","name":"amount","nameLocation":"10193:6:50","nodeType":"VariableDeclaration","scope":50849,"src":"10185:14:50","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"},"typeName":{"id":50810,"name":"uint256","nodeType":"ElementaryTypeName","src":"10185:7:50","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"visibility":"internal"}],"src":"10127:78:50"},"returnParameters":{"id":50813,"nodeType":"ParameterList","parameters":[],"src":"10223:0:50"},"scope":50915,"stateMutability":"nonpayable","virtual":true,"visibility":"internal"},{"id":50892,"nodeType":"FunctionDefinition","src":"10761:441:50","nodes":[],"body":{"id":50891,"nodeType":"Block","src":"10881:321:50","nodes":[],"statements":[{"assignments":[50860],"declarations":[{"constant":false,"id":50860,"mutability":"mutable","name":"currentAllowance","nameLocation":"10899:16:50","nodeType":"VariableDeclaration","scope":50891,"src":"10891:24:50","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"},"typeName":{"id":50859,"name":"uint256","nodeType":"ElementaryTypeName","src":"10891:7:50","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"visibility":"internal"}],"id":50865,"initialValue":{"arguments":[{"id":50862,"name":"owner","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":50852,"src":"10928:5:50","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"}},{"id":50863,"name":"spender","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":50854,"src":"10935:7:50","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"}}],"expression":{"argumentTypes":[{"typeIdentifier":"t_address","typeString":"address"},{"typeIdentifier":"t_address","typeString":"address"}],"id":50861,"name":"allowance","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":50471,"src":"10918:9:50","typeDescriptions":{"typeIdentifier":"t_function_internal_view$_t_address_$_t_address_$returns$_t_uint256_$","typeString":"function (address,address) view returns (uint256)"}},"id":50864,"isConstant":false,"isLValue":false,"isPure":false,"kind":"functionCall","lValueRequested":false,"names":[],"nodeType":"FunctionCall","src":"10918:25:50","tryCall":false,"typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"nodeType":"VariableDeclarationStatement","src":"10891:52:50"},{"condition":{"commonType":{"typeIdentifier":"t_uint256","typeString":"uint256"},"id":50872,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"leftExpression":{"id":50866,"name":"currentAllowance","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":50860,"src":"10957:16:50","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"nodeType":"BinaryOperation","operator":"!=","rightExpression":{"expression":{"arguments":[{"id":50869,"isConstant":false,"isLValue":false,"isPure":true,"lValueRequested":false,"nodeType":"ElementaryTypeNameExpression","src":"10982:7:50","typeDescriptions":{"typeIdentifier":"t_type$_t_uint256_$","typeString":"type(uint256)"},"typeName":{"id":50868,"name":"uint256","nodeType":"ElementaryTypeName","src":"10982:7:50","typeDescriptions":{}}}],"expression":{"argumentTypes":[{"typeIdentifier":"t_type$_t_uint256_$","typeString":"type(uint256)"}],"id":50867,"name":"type","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":-27,"src":"10977:4:50","typeDescriptions":{"typeIdentifier":"t_function_metatype_pure$__$returns$__$","typeString":"function () pure"}},"id":50870,"isConstant":false,"isLValue":false,"isPure":true,"kind":"functionCall","lValueRequested":false,"names":[],"nodeType":"FunctionCall","src":"10977:13:50","tryCall":false,"typeDescriptions":{"typeIdentifier":"t_magic_meta_type_t_uint256","typeString":"type(uint256)"}},"id":50871,"isConstant":false,"isLValue":false,"isPure":true,"lValueRequested":false,"memberName":"max","nodeType":"MemberAccess","src":"10977:17:50","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"src":"10957:37:50","typeDescriptions":{"typeIdentifier":"t_bool","typeString":"bool"}},"id":50890,"nodeType":"IfStatement","src":"10953:243:50","trueBody":{"id":50889,"nodeType":"Block","src":"10996:200:50","statements":[{"expression":{"arguments":[{"commonType":{"typeIdentifier":"t_uint256","typeString":"uint256"},"id":50876,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"leftExpression":{"id":50874,"name":"currentAllowance","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":50860,"src":"11018:16:50","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"nodeType":"BinaryOperation","operator":">=","rightExpression":{"id":50875,"name":"amount","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":50856,"src":"11038:6:50","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"src":"11018:26:50","typeDescriptions":{"typeIdentifier":"t_bool","typeString":"bool"}},{"hexValue":"45524332303a20696e73756666696369656e7420616c6c6f77616e6365","id":50877,"isConstant":false,"isLValue":false,"isPure":true,"kind":"string","lValueRequested":false,"nodeType":"Literal","src":"11046:31:50","typeDescriptions":{"typeIdentifier":"t_stringliteral_3b6607e091cba9325f958656d2b5e0622ab7dc0eac71a26ac788cb25bc19f4fe","typeString":"literal_string \"ERC20: insufficient allowance\""},"value":"ERC20: insufficient allowance"}],"expression":{"argumentTypes":[{"typeIdentifier":"t_bool","typeString":"bool"},{"typeIdentifier":"t_stringliteral_3b6607e091cba9325f958656d2b5e0622ab7dc0eac71a26ac788cb25bc19f4fe","typeString":"literal_string \"ERC20: insufficient allowance\""}],"id":50873,"name":"require","nodeType":"Identifier","overloadedDeclarations":[-18,-18],"referencedDeclaration":-18,"src":"11010:7:50","typeDescriptions":{"typeIdentifier":"t_function_require_pure$_t_bool_$_t_string_memory_ptr_$returns$__$","typeString":"function (bool,string memory) pure"}},"id":50878,"isConstant":false,"isLValue":false,"isPure":false,"kind":"functionCall","lValueRequested":false,"names":[],"nodeType":"FunctionCall","src":"11010:68:50","tryCall":false,"typeDescriptions":{"typeIdentifier":"t_tuple$__$","typeString":"tuple()"}},"id":50879,"nodeType":"ExpressionStatement","src":"11010:68:50"},{"id":50888,"nodeType":"UncheckedBlock","src":"11092:94:50","statements":[{"expression":{"arguments":[{"id":50881,"name":"owner","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":50852,"src":"11129:5:50","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"}},{"id":50882,"name":"spender","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":50854,"src":"11136:7:50","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"}},{"commonType":{"typeIdentifier":"t_uint256","typeString":"uint256"},"id":50885,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"leftExpression":{"id":50883,"name":"currentAllowance","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":50860,"src":"11145:16:50","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"nodeType":"BinaryOperation","operator":"-","rightExpression":{"id":50884,"name":"amount","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":50856,"src":"11164:6:50","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"src":"11145:25:50","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}}],"expression":{"argumentTypes":[{"typeIdentifier":"t_address","typeString":"address"},{"typeIdentifier":"t_address","typeString":"address"},{"typeIdentifier":"t_uint256","typeString":"uint256"}],"id":50880,"name":"_approve","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":50849,"src":"11120:8:50","typeDescriptions":{"typeIdentifier":"t_function_internal_nonpayable$_t_address_$_t_address_$_t_uint256_$returns$__$","typeString":"function (address,address,uint256)"}},"id":50886,"isConstant":false,"isLValue":false,"isPure":false,"kind":"functionCall","lValueRequested":false,"names":[],"nodeType":"FunctionCall","src":"11120:51:50","tryCall":false,"typeDescriptions":{"typeIdentifier":"t_tuple$__$","typeString":"tuple()"}},"id":50887,"nodeType":"ExpressionStatement","src":"11120:51:50"}]}]}}]},"documentation":{"id":50850,"nodeType":"StructuredDocumentation","src":"10486:270:50","text":" @dev Updates `owner` s allowance for `spender` based on spent `amount`.\n Does not update the allowance amount in case of infinite allowance.\n Revert if not enough allowance is available.\n Might emit an {Approval} event."},"implemented":true,"kind":"function","modifiers":[],"name":"_spendAllowance","nameLocation":"10770:15:50","parameters":{"id":50857,"nodeType":"ParameterList","parameters":[{"constant":false,"id":50852,"mutability":"mutable","name":"owner","nameLocation":"10803:5:50","nodeType":"VariableDeclaration","scope":50892,"src":"10795:13:50","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"},"typeName":{"id":50851,"name":"address","nodeType":"ElementaryTypeName","src":"10795:7:50","stateMutability":"nonpayable","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"}},"visibility":"internal"},{"constant":false,"id":50854,"mutability":"mutable","name":"spender","nameLocation":"10826:7:50","nodeType":"VariableDeclaration","scope":50892,"src":"10818:15:50","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"},"typeName":{"id":50853,"name":"address","nodeType":"ElementaryTypeName","src":"10818:7:50","stateMutability":"nonpayable","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"}},"visibility":"internal"},{"constant":false,"id":50856,"mutability":"mutable","name":"amount","nameLocation":"10851:6:50","nodeType":"VariableDeclaration","scope":50892,"src":"10843:14:50","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"},"typeName":{"id":50855,"name":"uint256","nodeType":"ElementaryTypeName","src":"10843:7:50","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"visibility":"internal"}],"src":"10785:78:50"},"returnParameters":{"id":50858,"nodeType":"ParameterList","parameters":[],"src":"10881:0:50"},"scope":50915,"stateMutability":"nonpayable","virtual":true,"visibility":"internal"},{"id":50903,"nodeType":"FunctionDefinition","src":"11786:121:50","nodes":[],"body":{"id":50902,"nodeType":"Block","src":"11905:2:50","nodes":[],"statements":[]},"documentation":{"id":50893,"nodeType":"StructuredDocumentation","src":"11208:573:50","text":" @dev Hook that is called before any transfer of tokens. This includes\n minting and burning.\n Calling conditions:\n - when `from` and `to` are both non-zero, `amount` of ``from``'s tokens\n will be transferred to `to`.\n - when `from` is zero, `amount` tokens will be minted for `to`.\n - when `to` is zero, `amount` of ``from``'s tokens will be burned.\n - `from` and `to` are never both zero.\n To learn more about hooks, head to xref:ROOT:extending-contracts.adoc#using-hooks[Using Hooks]."},"implemented":true,"kind":"function","modifiers":[],"name":"_beforeTokenTransfer","nameLocation":"11795:20:50","parameters":{"id":50900,"nodeType":"ParameterList","parameters":[{"constant":false,"id":50895,"mutability":"mutable","name":"from","nameLocation":"11833:4:50","nodeType":"VariableDeclaration","scope":50903,"src":"11825:12:50","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"},"typeName":{"id":50894,"name":"address","nodeType":"ElementaryTypeName","src":"11825:7:50","stateMutability":"nonpayable","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"}},"visibility":"internal"},{"constant":false,"id":50897,"mutability":"mutable","name":"to","nameLocation":"11855:2:50","nodeType":"VariableDeclaration","scope":50903,"src":"11847:10:50","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"},"typeName":{"id":50896,"name":"address","nodeType":"ElementaryTypeName","src":"11847:7:50","stateMutability":"nonpayable","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"}},"visibility":"internal"},{"constant":false,"id":50899,"mutability":"mutable","name":"amount","nameLocation":"11875:6:50","nodeType":"VariableDeclaration","scope":50903,"src":"11867:14:50","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"},"typeName":{"id":50898,"name":"uint256","nodeType":"ElementaryTypeName","src":"11867:7:50","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"visibility":"internal"}],"src":"11815:72:50"},"returnParameters":{"id":50901,"nodeType":"ParameterList","parameters":[],"src":"11905:0:50"},"scope":50915,"stateMutability":"nonpayable","virtual":true,"visibility":"internal"},{"id":50914,"nodeType":"FunctionDefinition","src":"12495:120:50","nodes":[],"body":{"id":50913,"nodeType":"Block","src":"12613:2:50","nodes":[],"statements":[]},"documentation":{"id":50904,"nodeType":"StructuredDocumentation","src":"11913:577:50","text":" @dev Hook that is called after any transfer of tokens. This includes\n minting and burning.\n Calling conditions:\n - when `from` and `to` are both non-zero, `amount` of ``from``'s tokens\n has been transferred to `to`.\n - when `from` is zero, `amount` tokens have been minted for `to`.\n - when `to` is zero, `amount` of ``from``'s tokens have been burned.\n - `from` and `to` are never both zero.\n To learn more about hooks, head to xref:ROOT:extending-contracts.adoc#using-hooks[Using Hooks]."},"implemented":true,"kind":"function","modifiers":[],"name":"_afterTokenTransfer","nameLocation":"12504:19:50","parameters":{"id":50911,"nodeType":"ParameterList","parameters":[{"constant":false,"id":50906,"mutability":"mutable","name":"from","nameLocation":"12541:4:50","nodeType":"VariableDeclaration","scope":50914,"src":"12533:12:50","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"},"typeName":{"id":50905,"name":"address","nodeType":"ElementaryTypeName","src":"12533:7:50","stateMutability":"nonpayable","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"}},"visibility":"internal"},{"constant":false,"id":50908,"mutability":"mutable","name":"to","nameLocation":"12563:2:50","nodeType":"VariableDeclaration","scope":50914,"src":"12555:10:50","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"},"typeName":{"id":50907,"name":"address","nodeType":"ElementaryTypeName","src":"12555:7:50","stateMutability":"nonpayable","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"}},"visibility":"internal"},{"constant":false,"id":50910,"mutability":"mutable","name":"amount","nameLocation":"12583:6:50","nodeType":"VariableDeclaration","scope":50914,"src":"12575:14:50","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"},"typeName":{"id":50909,"name":"uint256","nodeType":"ElementaryTypeName","src":"12575:7:50","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"visibility":"internal"}],"src":"12523:72:50"},"returnParameters":{"id":50912,"nodeType":"ParameterList","parameters":[],"src":"12613:0:50"},"scope":50915,"stateMutability":"nonpayable","virtual":true,"visibility":"internal"}],"abstract":false,"baseContracts":[{"baseName":{"id":50336,"name":"Context","nodeType":"IdentifierPath","referencedDeclaration":53902,"src":"1421:7:50"},"id":50337,"nodeType":"InheritanceSpecifier","src":"1421:7:50"},{"baseName":{"id":50338,"name":"IERC20","nodeType":"IdentifierPath","referencedDeclaration":50993,"src":"1430:6:50"},"id":50339,"nodeType":"InheritanceSpecifier","src":"1430:6:50"},{"baseName":{"id":50340,"name":"IERC20Metadata","nodeType":"IdentifierPath","referencedDeclaration":51699,"src":"1438:14:50"},"id":50341,"nodeType":"InheritanceSpecifier","src":"1438:14:50"}],"canonicalName":"ERC20","contractDependencies":[],"contractKind":"contract","documentation":{"id":50335,"nodeType":"StructuredDocumentation","src":"230:1172:50","text":" @dev Implementation of the {IERC20} interface.\n This implementation is agnostic to the way tokens are created. This means\n that a supply mechanism has to be added in a derived contract using {_mint}.\n For a generic mechanism see {ERC20PresetMinterPauser}.\n TIP: For a detailed writeup see our guide\n https://forum.zeppelin.solutions/t/how-to-implement-erc20-supply-mechanisms/226[How\n to implement supply mechanisms].\n We have followed general OpenZeppelin Contracts guidelines: functions revert\n instead returning `false` on failure. This behavior is nonetheless\n conventional and does not conflict with the expectations of ERC20\n applications.\n Additionally, an {Approval} event is emitted on calls to {transferFrom}.\n This allows applications to reconstruct the allowance for all accounts just\n by listening to said events. Other implementations of the EIP may not emit\n these events, as it isn't required by the specification.\n Finally, the non-standard {decreaseAllowance} and {increaseAllowance}\n functions have been added to mitigate the well-known issues around setting\n allowances. See {IERC20-approve}."},"fullyImplemented":true,"linearizedBaseContracts":[50915,51699,50993,53902],"name":"ERC20","nameLocation":"1412:5:50","scope":50916,"usedErrors":[]}],"license":"MIT"},"id":50} \ No newline at end of file diff --git a/op-chain-ops/foundry/testdata/forge-artifacts/Owned.sol/Owned.0.8.15.json b/op-chain-ops/foundry/testdata/forge-artifacts/Owned.sol/Owned.0.8.15.json new file mode 100644 index 000000000000..6a1eaa1cf303 --- /dev/null +++ b/op-chain-ops/foundry/testdata/forge-artifacts/Owned.sol/Owned.0.8.15.json @@ -0,0 +1 @@ +{"abi":[{"type":"function","name":"owner","inputs":[],"outputs":[{"name":"","type":"address","internalType":"address"}],"stateMutability":"view"},{"type":"function","name":"setOwner","inputs":[{"name":"newOwner","type":"address","internalType":"address"}],"outputs":[],"stateMutability":"nonpayable"},{"type":"event","name":"OwnerUpdated","inputs":[{"name":"user","type":"address","indexed":true,"internalType":"address"},{"name":"newOwner","type":"address","indexed":true,"internalType":"address"}],"anonymous":false}],"bytecode":{"object":"0x","sourceMap":"","linkReferences":{}},"deployedBytecode":{"object":"0x","sourceMap":"","linkReferences":{}},"methodIdentifiers":{"owner()":"8da5cb5b","setOwner(address)":"13af4035"},"rawMetadata":"{\"compiler\":{\"version\":\"0.8.15+commit.e14f2714\"},\"language\":\"Solidity\",\"output\":{\"abi\":[{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"address\",\"name\":\"user\",\"type\":\"address\"},{\"indexed\":true,\"internalType\":\"address\",\"name\":\"newOwner\",\"type\":\"address\"}],\"name\":\"OwnerUpdated\",\"type\":\"event\"},{\"inputs\":[],\"name\":\"owner\",\"outputs\":[{\"internalType\":\"address\",\"name\":\"\",\"type\":\"address\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"newOwner\",\"type\":\"address\"}],\"name\":\"setOwner\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"}],\"devdoc\":{\"author\":\"Solmate (https://github.com/Rari-Capital/solmate/blob/main/src/auth/Owned.sol)\",\"kind\":\"dev\",\"methods\":{},\"version\":1},\"userdoc\":{\"kind\":\"user\",\"methods\":{},\"notice\":\"Simple single owner authorization mixin.\",\"version\":1}},\"settings\":{\"compilationTarget\":{\"lib/solmate/src/auth/Owned.sol\":\"Owned\"},\"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/\",\":automate/=lib/automate/contracts/\",\":ds-test/=lib/forge-std/lib/ds-test/src/\",\":erc4626-tests/=lib/automate/lib/openzeppelin-contracts/lib/erc4626-tests/\",\":forge-std/=lib/forge-std/src/\",\":gelato/=lib/automate/contracts/\",\":hardhat/=lib/automate/node_modules/hardhat/\",\":kontrol-cheatcodes/=lib/kontrol-cheatcodes/src/\",\":lib-keccak/=lib/lib-keccak/contracts/\",\":openzeppelin-contracts-upgradeable/=lib/openzeppelin-contracts-upgradeable/\",\":openzeppelin-contracts/=lib/openzeppelin-contracts/\",\":prb-test/=lib/automate/lib/prb-test/src/\",\":prb/-est/=lib/automate/lib/prb-test/src/\",\":safe-contracts/=lib/safe-contracts/contracts/\",\":solady/=lib/solady/\",\":solmate/=lib/solmate/src/\"]},\"sources\":{\"lib/solmate/src/auth/Owned.sol\":{\"keccak256\":\"0x7e91c80b0dd1a14a19cb9e661b99924043adab6d9d893bbfcf3a6a3dc23a6743\",\"license\":\"AGPL-3.0-only\",\"urls\":[\"bzz-raw://515890d9fc87d6762dae2354a3a0714a26c652f0ea5bb631122be1968ef8c0e9\",\"dweb:/ipfs/QmTRpQ7uoAR1vCACKJm14Ba3oKVLqcA9reTwbHAPxawVpM\"]}},\"version\":1}","metadata":{"compiler":{"version":"0.8.15+commit.e14f2714"},"language":"Solidity","output":{"abi":[{"inputs":[{"internalType":"address","name":"user","type":"address","indexed":true},{"internalType":"address","name":"newOwner","type":"address","indexed":true}],"type":"event","name":"OwnerUpdated","anonymous":false},{"inputs":[],"stateMutability":"view","type":"function","name":"owner","outputs":[{"internalType":"address","name":"","type":"address"}]},{"inputs":[{"internalType":"address","name":"newOwner","type":"address"}],"stateMutability":"nonpayable","type":"function","name":"setOwner"}],"devdoc":{"kind":"dev","methods":{},"version":1},"userdoc":{"kind":"user","methods":{},"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/","automate/=lib/automate/contracts/","ds-test/=lib/forge-std/lib/ds-test/src/","erc4626-tests/=lib/automate/lib/openzeppelin-contracts/lib/erc4626-tests/","forge-std/=lib/forge-std/src/","gelato/=lib/automate/contracts/","hardhat/=lib/automate/node_modules/hardhat/","kontrol-cheatcodes/=lib/kontrol-cheatcodes/src/","lib-keccak/=lib/lib-keccak/contracts/","openzeppelin-contracts-upgradeable/=lib/openzeppelin-contracts-upgradeable/","openzeppelin-contracts/=lib/openzeppelin-contracts/","prb-test/=lib/automate/lib/prb-test/src/","prb/-est/=lib/automate/lib/prb-test/src/","safe-contracts/=lib/safe-contracts/contracts/","solady/=lib/solady/","solmate/=lib/solmate/src/"],"optimizer":{"enabled":true,"runs":999999},"metadata":{"bytecodeHash":"none"},"compilationTarget":{"lib/solmate/src/auth/Owned.sol":"Owned"},"evmVersion":"london","libraries":{}},"sources":{"lib/solmate/src/auth/Owned.sol":{"keccak256":"0x7e91c80b0dd1a14a19cb9e661b99924043adab6d9d893bbfcf3a6a3dc23a6743","urls":["bzz-raw://515890d9fc87d6762dae2354a3a0714a26c652f0ea5bb631122be1968ef8c0e9","dweb:/ipfs/QmTRpQ7uoAR1vCACKJm14Ba3oKVLqcA9reTwbHAPxawVpM"],"license":"AGPL-3.0-only"}},"version":1},"storageLayout":{"storage":[{"astId":64704,"contract":"lib/solmate/src/auth/Owned.sol:Owned","label":"owner","offset":0,"slot":"0","type":"t_address"}],"types":{"t_address":{"encoding":"inplace","label":"address","numberOfBytes":"20"}}},"userdoc":{"version":1,"kind":"user","notice":"Simple single owner authorization mixin."},"devdoc":{"version":1,"kind":"dev","author":"Solmate (https://github.com/Rari-Capital/solmate/blob/main/src/auth/Owned.sol)"},"ast":{"absolutePath":"lib/solmate/src/auth/Owned.sol","id":64754,"exportedSymbols":{"Owned":[64753]},"nodeType":"SourceUnit","src":"42:1398:108","nodes":[{"id":64695,"nodeType":"PragmaDirective","src":"42:24:108","nodes":[],"literals":["solidity",">=","0.8",".0"]},{"id":64753,"nodeType":"ContractDefinition","src":"212:1227:108","nodes":[{"id":64702,"nodeType":"EventDefinition","src":"421:67:108","nodes":[],"anonymous":false,"eventSelector":"8292fce18fa69edf4db7b94ea2e58241df0ae57f97e0a6c9b29067028bf92d76","name":"OwnerUpdated","nameLocation":"427:12:108","parameters":{"id":64701,"nodeType":"ParameterList","parameters":[{"constant":false,"id":64698,"indexed":true,"mutability":"mutable","name":"user","nameLocation":"456:4:108","nodeType":"VariableDeclaration","scope":64702,"src":"440:20:108","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"},"typeName":{"id":64697,"name":"address","nodeType":"ElementaryTypeName","src":"440:7:108","stateMutability":"nonpayable","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"}},"visibility":"internal"},{"constant":false,"id":64700,"indexed":true,"mutability":"mutable","name":"newOwner","nameLocation":"478:8:108","nodeType":"VariableDeclaration","scope":64702,"src":"462:24:108","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"},"typeName":{"id":64699,"name":"address","nodeType":"ElementaryTypeName","src":"462:7:108","stateMutability":"nonpayable","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"}},"visibility":"internal"}],"src":"439:48:108"}},{"id":64704,"nodeType":"VariableDeclaration","src":"679:20:108","nodes":[],"constant":false,"functionSelector":"8da5cb5b","mutability":"mutable","name":"owner","nameLocation":"694:5:108","scope":64753,"stateVariable":true,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"},"typeName":{"id":64703,"name":"address","nodeType":"ElementaryTypeName","src":"679:7:108","stateMutability":"nonpayable","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"}},"visibility":"public"},{"id":64716,"nodeType":"ModifierDefinition","src":"706:102:108","nodes":[],"body":{"id":64715,"nodeType":"Block","src":"735:73:108","nodes":[],"statements":[{"expression":{"arguments":[{"commonType":{"typeIdentifier":"t_address","typeString":"address"},"id":64710,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"leftExpression":{"expression":{"id":64707,"name":"msg","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":-15,"src":"753:3:108","typeDescriptions":{"typeIdentifier":"t_magic_message","typeString":"msg"}},"id":64708,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"memberName":"sender","nodeType":"MemberAccess","src":"753:10:108","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"}},"nodeType":"BinaryOperation","operator":"==","rightExpression":{"id":64709,"name":"owner","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":64704,"src":"767:5:108","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"}},"src":"753:19:108","typeDescriptions":{"typeIdentifier":"t_bool","typeString":"bool"}},{"hexValue":"554e415554484f52495a4544","id":64711,"isConstant":false,"isLValue":false,"isPure":true,"kind":"string","lValueRequested":false,"nodeType":"Literal","src":"774:14:108","typeDescriptions":{"typeIdentifier":"t_stringliteral_269df367cd41cace5897a935d0e0858fe4543b5619d45e09af6b124c1bb3d528","typeString":"literal_string \"UNAUTHORIZED\""},"value":"UNAUTHORIZED"}],"expression":{"argumentTypes":[{"typeIdentifier":"t_bool","typeString":"bool"},{"typeIdentifier":"t_stringliteral_269df367cd41cace5897a935d0e0858fe4543b5619d45e09af6b124c1bb3d528","typeString":"literal_string \"UNAUTHORIZED\""}],"id":64706,"name":"require","nodeType":"Identifier","overloadedDeclarations":[-18,-18],"referencedDeclaration":-18,"src":"745:7:108","typeDescriptions":{"typeIdentifier":"t_function_require_pure$_t_bool_$_t_string_memory_ptr_$returns$__$","typeString":"function (bool,string memory) pure"}},"id":64712,"isConstant":false,"isLValue":false,"isPure":false,"kind":"functionCall","lValueRequested":false,"names":[],"nodeType":"FunctionCall","src":"745:44:108","tryCall":false,"typeDescriptions":{"typeIdentifier":"t_tuple$__$","typeString":"tuple()"}},"id":64713,"nodeType":"ExpressionStatement","src":"745:44:108"},{"id":64714,"nodeType":"PlaceholderStatement","src":"800:1:108"}]},"name":"onlyOwner","nameLocation":"715:9:108","parameters":{"id":64705,"nodeType":"ParameterList","parameters":[],"src":"724:2:108"},"virtual":true,"visibility":"internal"},{"id":64734,"nodeType":"FunctionDefinition","src":"996:107:108","nodes":[],"body":{"id":64733,"nodeType":"Block","src":"1024:79:108","nodes":[],"statements":[{"expression":{"id":64723,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"leftHandSide":{"id":64721,"name":"owner","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":64704,"src":"1034:5:108","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"}},"nodeType":"Assignment","operator":"=","rightHandSide":{"id":64722,"name":"_owner","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":64718,"src":"1042:6:108","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"}},"src":"1034:14:108","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"}},"id":64724,"nodeType":"ExpressionStatement","src":"1034:14:108"},{"eventCall":{"arguments":[{"arguments":[{"hexValue":"30","id":64728,"isConstant":false,"isLValue":false,"isPure":true,"kind":"number","lValueRequested":false,"nodeType":"Literal","src":"1085:1:108","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":64727,"isConstant":false,"isLValue":false,"isPure":true,"lValueRequested":false,"nodeType":"ElementaryTypeNameExpression","src":"1077:7:108","typeDescriptions":{"typeIdentifier":"t_type$_t_address_$","typeString":"type(address)"},"typeName":{"id":64726,"name":"address","nodeType":"ElementaryTypeName","src":"1077:7:108","typeDescriptions":{}}},"id":64729,"isConstant":false,"isLValue":false,"isPure":true,"kind":"typeConversion","lValueRequested":false,"names":[],"nodeType":"FunctionCall","src":"1077:10:108","tryCall":false,"typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"}},{"id":64730,"name":"_owner","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":64718,"src":"1089:6:108","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"}}],"expression":{"argumentTypes":[{"typeIdentifier":"t_address","typeString":"address"},{"typeIdentifier":"t_address","typeString":"address"}],"id":64725,"name":"OwnerUpdated","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":64702,"src":"1064:12:108","typeDescriptions":{"typeIdentifier":"t_function_event_nonpayable$_t_address_$_t_address_$returns$__$","typeString":"function (address,address)"}},"id":64731,"isConstant":false,"isLValue":false,"isPure":false,"kind":"functionCall","lValueRequested":false,"names":[],"nodeType":"FunctionCall","src":"1064:32:108","tryCall":false,"typeDescriptions":{"typeIdentifier":"t_tuple$__$","typeString":"tuple()"}},"id":64732,"nodeType":"EmitStatement","src":"1059:37:108"}]},"implemented":true,"kind":"constructor","modifiers":[],"name":"","nameLocation":"-1:-1:-1","parameters":{"id":64719,"nodeType":"ParameterList","parameters":[{"constant":false,"id":64718,"mutability":"mutable","name":"_owner","nameLocation":"1016:6:108","nodeType":"VariableDeclaration","scope":64734,"src":"1008:14:108","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"},"typeName":{"id":64717,"name":"address","nodeType":"ElementaryTypeName","src":"1008:7:108","stateMutability":"nonpayable","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"}},"visibility":"internal"}],"src":"1007:16:108"},"returnParameters":{"id":64720,"nodeType":"ParameterList","parameters":[],"src":"1024:0:108"},"scope":64753,"stateMutability":"nonpayable","virtual":false,"visibility":"internal"},{"id":64752,"nodeType":"FunctionDefinition","src":"1293:144:108","nodes":[],"body":{"id":64751,"nodeType":"Block","src":"1354:83:108","nodes":[],"statements":[{"expression":{"id":64743,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"leftHandSide":{"id":64741,"name":"owner","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":64704,"src":"1364:5:108","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"}},"nodeType":"Assignment","operator":"=","rightHandSide":{"id":64742,"name":"newOwner","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":64736,"src":"1372:8:108","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"}},"src":"1364:16:108","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"}},"id":64744,"nodeType":"ExpressionStatement","src":"1364:16:108"},{"eventCall":{"arguments":[{"expression":{"id":64746,"name":"msg","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":-15,"src":"1409:3:108","typeDescriptions":{"typeIdentifier":"t_magic_message","typeString":"msg"}},"id":64747,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"memberName":"sender","nodeType":"MemberAccess","src":"1409:10:108","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"}},{"id":64748,"name":"newOwner","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":64736,"src":"1421:8:108","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"}}],"expression":{"argumentTypes":[{"typeIdentifier":"t_address","typeString":"address"},{"typeIdentifier":"t_address","typeString":"address"}],"id":64745,"name":"OwnerUpdated","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":64702,"src":"1396:12:108","typeDescriptions":{"typeIdentifier":"t_function_event_nonpayable$_t_address_$_t_address_$returns$__$","typeString":"function (address,address)"}},"id":64749,"isConstant":false,"isLValue":false,"isPure":false,"kind":"functionCall","lValueRequested":false,"names":[],"nodeType":"FunctionCall","src":"1396:34:108","tryCall":false,"typeDescriptions":{"typeIdentifier":"t_tuple$__$","typeString":"tuple()"}},"id":64750,"nodeType":"EmitStatement","src":"1391:39:108"}]},"functionSelector":"13af4035","implemented":true,"kind":"function","modifiers":[{"id":64739,"kind":"modifierInvocation","modifierName":{"id":64738,"name":"onlyOwner","nodeType":"IdentifierPath","referencedDeclaration":64716,"src":"1344:9:108"},"nodeType":"ModifierInvocation","src":"1344:9:108"}],"name":"setOwner","nameLocation":"1302:8:108","parameters":{"id":64737,"nodeType":"ParameterList","parameters":[{"constant":false,"id":64736,"mutability":"mutable","name":"newOwner","nameLocation":"1319:8:108","nodeType":"VariableDeclaration","scope":64752,"src":"1311:16:108","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"},"typeName":{"id":64735,"name":"address","nodeType":"ElementaryTypeName","src":"1311:7:108","stateMutability":"nonpayable","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"}},"visibility":"internal"}],"src":"1310:18:108"},"returnParameters":{"id":64740,"nodeType":"ParameterList","parameters":[],"src":"1354:0:108"},"scope":64753,"stateMutability":"nonpayable","virtual":true,"visibility":"public"}],"abstract":true,"baseContracts":[],"canonicalName":"Owned","contractDependencies":[],"contractKind":"contract","documentation":{"id":64696,"nodeType":"StructuredDocumentation","src":"68:144:108","text":"@notice Simple single owner authorization mixin.\n @author Solmate (https://github.com/Rari-Capital/solmate/blob/main/src/auth/Owned.sol)"},"fullyImplemented":true,"linearizedBaseContracts":[64753],"name":"Owned","nameLocation":"230:5:108","scope":64754,"usedErrors":[]}],"license":"AGPL-3.0-only"},"id":108} \ No newline at end of file diff --git a/op-chain-ops/foundry/testdata/forge-artifacts/Owned.sol/Owned.0.8.25.json b/op-chain-ops/foundry/testdata/forge-artifacts/Owned.sol/Owned.0.8.25.json new file mode 100644 index 000000000000..180ed5f5be6b --- /dev/null +++ b/op-chain-ops/foundry/testdata/forge-artifacts/Owned.sol/Owned.0.8.25.json @@ -0,0 +1 @@ +{"abi":[{"type":"function","name":"owner","inputs":[],"outputs":[{"name":"","type":"address","internalType":"address"}],"stateMutability":"view"},{"type":"function","name":"setOwner","inputs":[{"name":"newOwner","type":"address","internalType":"address"}],"outputs":[],"stateMutability":"nonpayable"},{"type":"event","name":"OwnerUpdated","inputs":[{"name":"user","type":"address","indexed":true,"internalType":"address"},{"name":"newOwner","type":"address","indexed":true,"internalType":"address"}],"anonymous":false}],"bytecode":{"object":"0x","sourceMap":"","linkReferences":{}},"deployedBytecode":{"object":"0x","sourceMap":"","linkReferences":{}},"methodIdentifiers":{"owner()":"8da5cb5b","setOwner(address)":"13af4035"},"rawMetadata":"{\"compiler\":{\"version\":\"0.8.25+commit.b61c2a91\"},\"language\":\"Solidity\",\"output\":{\"abi\":[{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"address\",\"name\":\"user\",\"type\":\"address\"},{\"indexed\":true,\"internalType\":\"address\",\"name\":\"newOwner\",\"type\":\"address\"}],\"name\":\"OwnerUpdated\",\"type\":\"event\"},{\"inputs\":[],\"name\":\"owner\",\"outputs\":[{\"internalType\":\"address\",\"name\":\"\",\"type\":\"address\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"newOwner\",\"type\":\"address\"}],\"name\":\"setOwner\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"}],\"devdoc\":{\"author\":\"Solmate (https://github.com/Rari-Capital/solmate/blob/main/src/auth/Owned.sol)\",\"kind\":\"dev\",\"methods\":{},\"version\":1},\"userdoc\":{\"kind\":\"user\",\"methods\":{},\"notice\":\"Simple single owner authorization mixin.\",\"version\":1}},\"settings\":{\"compilationTarget\":{\"lib/solmate/src/auth/Owned.sol\":\"Owned\"},\"evmVersion\":\"cancun\",\"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/\",\":automate/=lib/automate/contracts/\",\":ds-test/=lib/forge-std/lib/ds-test/src/\",\":erc4626-tests/=lib/automate/lib/openzeppelin-contracts/lib/erc4626-tests/\",\":forge-std/=lib/forge-std/src/\",\":gelato/=lib/automate/contracts/\",\":hardhat/=lib/automate/node_modules/hardhat/\",\":kontrol-cheatcodes/=lib/kontrol-cheatcodes/src/\",\":lib-keccak/=lib/lib-keccak/contracts/\",\":openzeppelin-contracts-upgradeable/=lib/openzeppelin-contracts-upgradeable/\",\":openzeppelin-contracts/=lib/openzeppelin-contracts/\",\":prb-test/=lib/automate/lib/prb-test/src/\",\":prb/-est/=lib/automate/lib/prb-test/src/\",\":safe-contracts/=lib/safe-contracts/contracts/\",\":solady/=lib/solady/\",\":solmate/=lib/solmate/src/\"]},\"sources\":{\"lib/solmate/src/auth/Owned.sol\":{\"keccak256\":\"0x7e91c80b0dd1a14a19cb9e661b99924043adab6d9d893bbfcf3a6a3dc23a6743\",\"license\":\"AGPL-3.0-only\",\"urls\":[\"bzz-raw://515890d9fc87d6762dae2354a3a0714a26c652f0ea5bb631122be1968ef8c0e9\",\"dweb:/ipfs/QmTRpQ7uoAR1vCACKJm14Ba3oKVLqcA9reTwbHAPxawVpM\"]}},\"version\":1}","metadata":{"compiler":{"version":"0.8.25+commit.b61c2a91"},"language":"Solidity","output":{"abi":[{"inputs":[{"internalType":"address","name":"user","type":"address","indexed":true},{"internalType":"address","name":"newOwner","type":"address","indexed":true}],"type":"event","name":"OwnerUpdated","anonymous":false},{"inputs":[],"stateMutability":"view","type":"function","name":"owner","outputs":[{"internalType":"address","name":"","type":"address"}]},{"inputs":[{"internalType":"address","name":"newOwner","type":"address"}],"stateMutability":"nonpayable","type":"function","name":"setOwner"}],"devdoc":{"kind":"dev","methods":{},"version":1},"userdoc":{"kind":"user","methods":{},"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/","automate/=lib/automate/contracts/","ds-test/=lib/forge-std/lib/ds-test/src/","erc4626-tests/=lib/automate/lib/openzeppelin-contracts/lib/erc4626-tests/","forge-std/=lib/forge-std/src/","gelato/=lib/automate/contracts/","hardhat/=lib/automate/node_modules/hardhat/","kontrol-cheatcodes/=lib/kontrol-cheatcodes/src/","lib-keccak/=lib/lib-keccak/contracts/","openzeppelin-contracts-upgradeable/=lib/openzeppelin-contracts-upgradeable/","openzeppelin-contracts/=lib/openzeppelin-contracts/","prb-test/=lib/automate/lib/prb-test/src/","prb/-est/=lib/automate/lib/prb-test/src/","safe-contracts/=lib/safe-contracts/contracts/","solady/=lib/solady/","solmate/=lib/solmate/src/"],"optimizer":{"enabled":true,"runs":999999},"metadata":{"bytecodeHash":"none"},"compilationTarget":{"lib/solmate/src/auth/Owned.sol":"Owned"},"evmVersion":"cancun","libraries":{}},"sources":{"lib/solmate/src/auth/Owned.sol":{"keccak256":"0x7e91c80b0dd1a14a19cb9e661b99924043adab6d9d893bbfcf3a6a3dc23a6743","urls":["bzz-raw://515890d9fc87d6762dae2354a3a0714a26c652f0ea5bb631122be1968ef8c0e9","dweb:/ipfs/QmTRpQ7uoAR1vCACKJm14Ba3oKVLqcA9reTwbHAPxawVpM"],"license":"AGPL-3.0-only"}},"version":1},"storageLayout":{"storage":[{"astId":52022,"contract":"lib/solmate/src/auth/Owned.sol:Owned","label":"owner","offset":0,"slot":"0","type":"t_address"}],"types":{"t_address":{"encoding":"inplace","label":"address","numberOfBytes":"20"}}},"userdoc":{"version":1,"kind":"user","notice":"Simple single owner authorization mixin."},"devdoc":{"version":1,"kind":"dev","author":"Solmate (https://github.com/Rari-Capital/solmate/blob/main/src/auth/Owned.sol)"},"ast":{"absolutePath":"lib/solmate/src/auth/Owned.sol","id":52072,"exportedSymbols":{"Owned":[52071]},"nodeType":"SourceUnit","src":"42:1398:60","nodes":[{"id":52013,"nodeType":"PragmaDirective","src":"42:24:60","nodes":[],"literals":["solidity",">=","0.8",".0"]},{"id":52071,"nodeType":"ContractDefinition","src":"212:1227:60","nodes":[{"id":52020,"nodeType":"EventDefinition","src":"421:67:60","nodes":[],"anonymous":false,"eventSelector":"8292fce18fa69edf4db7b94ea2e58241df0ae57f97e0a6c9b29067028bf92d76","name":"OwnerUpdated","nameLocation":"427:12:60","parameters":{"id":52019,"nodeType":"ParameterList","parameters":[{"constant":false,"id":52016,"indexed":true,"mutability":"mutable","name":"user","nameLocation":"456:4:60","nodeType":"VariableDeclaration","scope":52020,"src":"440:20:60","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"},"typeName":{"id":52015,"name":"address","nodeType":"ElementaryTypeName","src":"440:7:60","stateMutability":"nonpayable","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"}},"visibility":"internal"},{"constant":false,"id":52018,"indexed":true,"mutability":"mutable","name":"newOwner","nameLocation":"478:8:60","nodeType":"VariableDeclaration","scope":52020,"src":"462:24:60","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"},"typeName":{"id":52017,"name":"address","nodeType":"ElementaryTypeName","src":"462:7:60","stateMutability":"nonpayable","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"}},"visibility":"internal"}],"src":"439:48:60"}},{"id":52022,"nodeType":"VariableDeclaration","src":"679:20:60","nodes":[],"constant":false,"functionSelector":"8da5cb5b","mutability":"mutable","name":"owner","nameLocation":"694:5:60","scope":52071,"stateVariable":true,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"},"typeName":{"id":52021,"name":"address","nodeType":"ElementaryTypeName","src":"679:7:60","stateMutability":"nonpayable","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"}},"visibility":"public"},{"id":52034,"nodeType":"ModifierDefinition","src":"706:102:60","nodes":[],"body":{"id":52033,"nodeType":"Block","src":"735:73:60","nodes":[],"statements":[{"expression":{"arguments":[{"commonType":{"typeIdentifier":"t_address","typeString":"address"},"id":52028,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"leftExpression":{"expression":{"id":52025,"name":"msg","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":-15,"src":"753:3:60","typeDescriptions":{"typeIdentifier":"t_magic_message","typeString":"msg"}},"id":52026,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"memberLocation":"757:6:60","memberName":"sender","nodeType":"MemberAccess","src":"753:10:60","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"}},"nodeType":"BinaryOperation","operator":"==","rightExpression":{"id":52027,"name":"owner","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":52022,"src":"767:5:60","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"}},"src":"753:19:60","typeDescriptions":{"typeIdentifier":"t_bool","typeString":"bool"}},{"hexValue":"554e415554484f52495a4544","id":52029,"isConstant":false,"isLValue":false,"isPure":true,"kind":"string","lValueRequested":false,"nodeType":"Literal","src":"774:14:60","typeDescriptions":{"typeIdentifier":"t_stringliteral_269df367cd41cace5897a935d0e0858fe4543b5619d45e09af6b124c1bb3d528","typeString":"literal_string \"UNAUTHORIZED\""},"value":"UNAUTHORIZED"}],"expression":{"argumentTypes":[{"typeIdentifier":"t_bool","typeString":"bool"},{"typeIdentifier":"t_stringliteral_269df367cd41cace5897a935d0e0858fe4543b5619d45e09af6b124c1bb3d528","typeString":"literal_string \"UNAUTHORIZED\""}],"id":52024,"name":"require","nodeType":"Identifier","overloadedDeclarations":[-18,-18],"referencedDeclaration":-18,"src":"745:7:60","typeDescriptions":{"typeIdentifier":"t_function_require_pure$_t_bool_$_t_string_memory_ptr_$returns$__$","typeString":"function (bool,string memory) pure"}},"id":52030,"isConstant":false,"isLValue":false,"isPure":false,"kind":"functionCall","lValueRequested":false,"nameLocations":[],"names":[],"nodeType":"FunctionCall","src":"745:44:60","tryCall":false,"typeDescriptions":{"typeIdentifier":"t_tuple$__$","typeString":"tuple()"}},"id":52031,"nodeType":"ExpressionStatement","src":"745:44:60"},{"id":52032,"nodeType":"PlaceholderStatement","src":"800:1:60"}]},"name":"onlyOwner","nameLocation":"715:9:60","parameters":{"id":52023,"nodeType":"ParameterList","parameters":[],"src":"724:2:60"},"virtual":true,"visibility":"internal"},{"id":52052,"nodeType":"FunctionDefinition","src":"996:107:60","nodes":[],"body":{"id":52051,"nodeType":"Block","src":"1024:79:60","nodes":[],"statements":[{"expression":{"id":52041,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"leftHandSide":{"id":52039,"name":"owner","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":52022,"src":"1034:5:60","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"}},"nodeType":"Assignment","operator":"=","rightHandSide":{"id":52040,"name":"_owner","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":52036,"src":"1042:6:60","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"}},"src":"1034:14:60","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"}},"id":52042,"nodeType":"ExpressionStatement","src":"1034:14:60"},{"eventCall":{"arguments":[{"arguments":[{"hexValue":"30","id":52046,"isConstant":false,"isLValue":false,"isPure":true,"kind":"number","lValueRequested":false,"nodeType":"Literal","src":"1085:1:60","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":52045,"isConstant":false,"isLValue":false,"isPure":true,"lValueRequested":false,"nodeType":"ElementaryTypeNameExpression","src":"1077:7:60","typeDescriptions":{"typeIdentifier":"t_type$_t_address_$","typeString":"type(address)"},"typeName":{"id":52044,"name":"address","nodeType":"ElementaryTypeName","src":"1077:7:60","typeDescriptions":{}}},"id":52047,"isConstant":false,"isLValue":false,"isPure":true,"kind":"typeConversion","lValueRequested":false,"nameLocations":[],"names":[],"nodeType":"FunctionCall","src":"1077:10:60","tryCall":false,"typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"}},{"id":52048,"name":"_owner","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":52036,"src":"1089:6:60","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"}}],"expression":{"argumentTypes":[{"typeIdentifier":"t_address","typeString":"address"},{"typeIdentifier":"t_address","typeString":"address"}],"id":52043,"name":"OwnerUpdated","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":52020,"src":"1064:12:60","typeDescriptions":{"typeIdentifier":"t_function_event_nonpayable$_t_address_$_t_address_$returns$__$","typeString":"function (address,address)"}},"id":52049,"isConstant":false,"isLValue":false,"isPure":false,"kind":"functionCall","lValueRequested":false,"nameLocations":[],"names":[],"nodeType":"FunctionCall","src":"1064:32:60","tryCall":false,"typeDescriptions":{"typeIdentifier":"t_tuple$__$","typeString":"tuple()"}},"id":52050,"nodeType":"EmitStatement","src":"1059:37:60"}]},"implemented":true,"kind":"constructor","modifiers":[],"name":"","nameLocation":"-1:-1:-1","parameters":{"id":52037,"nodeType":"ParameterList","parameters":[{"constant":false,"id":52036,"mutability":"mutable","name":"_owner","nameLocation":"1016:6:60","nodeType":"VariableDeclaration","scope":52052,"src":"1008:14:60","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"},"typeName":{"id":52035,"name":"address","nodeType":"ElementaryTypeName","src":"1008:7:60","stateMutability":"nonpayable","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"}},"visibility":"internal"}],"src":"1007:16:60"},"returnParameters":{"id":52038,"nodeType":"ParameterList","parameters":[],"src":"1024:0:60"},"scope":52071,"stateMutability":"nonpayable","virtual":false,"visibility":"internal"},{"id":52070,"nodeType":"FunctionDefinition","src":"1293:144:60","nodes":[],"body":{"id":52069,"nodeType":"Block","src":"1354:83:60","nodes":[],"statements":[{"expression":{"id":52061,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"leftHandSide":{"id":52059,"name":"owner","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":52022,"src":"1364:5:60","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"}},"nodeType":"Assignment","operator":"=","rightHandSide":{"id":52060,"name":"newOwner","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":52054,"src":"1372:8:60","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"}},"src":"1364:16:60","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"}},"id":52062,"nodeType":"ExpressionStatement","src":"1364:16:60"},{"eventCall":{"arguments":[{"expression":{"id":52064,"name":"msg","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":-15,"src":"1409:3:60","typeDescriptions":{"typeIdentifier":"t_magic_message","typeString":"msg"}},"id":52065,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"memberLocation":"1413:6:60","memberName":"sender","nodeType":"MemberAccess","src":"1409:10:60","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"}},{"id":52066,"name":"newOwner","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":52054,"src":"1421:8:60","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"}}],"expression":{"argumentTypes":[{"typeIdentifier":"t_address","typeString":"address"},{"typeIdentifier":"t_address","typeString":"address"}],"id":52063,"name":"OwnerUpdated","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":52020,"src":"1396:12:60","typeDescriptions":{"typeIdentifier":"t_function_event_nonpayable$_t_address_$_t_address_$returns$__$","typeString":"function (address,address)"}},"id":52067,"isConstant":false,"isLValue":false,"isPure":false,"kind":"functionCall","lValueRequested":false,"nameLocations":[],"names":[],"nodeType":"FunctionCall","src":"1396:34:60","tryCall":false,"typeDescriptions":{"typeIdentifier":"t_tuple$__$","typeString":"tuple()"}},"id":52068,"nodeType":"EmitStatement","src":"1391:39:60"}]},"functionSelector":"13af4035","implemented":true,"kind":"function","modifiers":[{"id":52057,"kind":"modifierInvocation","modifierName":{"id":52056,"name":"onlyOwner","nameLocations":["1344:9:60"],"nodeType":"IdentifierPath","referencedDeclaration":52034,"src":"1344:9:60"},"nodeType":"ModifierInvocation","src":"1344:9:60"}],"name":"setOwner","nameLocation":"1302:8:60","parameters":{"id":52055,"nodeType":"ParameterList","parameters":[{"constant":false,"id":52054,"mutability":"mutable","name":"newOwner","nameLocation":"1319:8:60","nodeType":"VariableDeclaration","scope":52070,"src":"1311:16:60","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"},"typeName":{"id":52053,"name":"address","nodeType":"ElementaryTypeName","src":"1311:7:60","stateMutability":"nonpayable","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"}},"visibility":"internal"}],"src":"1310:18:60"},"returnParameters":{"id":52058,"nodeType":"ParameterList","parameters":[],"src":"1354:0:60"},"scope":52071,"stateMutability":"nonpayable","virtual":true,"visibility":"public"}],"abstract":true,"baseContracts":[],"canonicalName":"Owned","contractDependencies":[],"contractKind":"contract","documentation":{"id":52014,"nodeType":"StructuredDocumentation","src":"68:144:60","text":"@notice Simple single owner authorization mixin.\n @author Solmate (https://github.com/Rari-Capital/solmate/blob/main/src/auth/Owned.sol)"},"fullyImplemented":true,"linearizedBaseContracts":[52071],"name":"Owned","nameLocation":"230:5:60","scope":52072,"usedErrors":[],"usedEvents":[52020]}],"license":"AGPL-3.0-only"},"id":60} \ No newline at end of file diff --git a/op-chain-ops/foundry/testdata/forge-artifacts/Owned.sol/Owned.json b/op-chain-ops/foundry/testdata/forge-artifacts/Owned.sol/Owned.json new file mode 100644 index 000000000000..2646394b6347 --- /dev/null +++ b/op-chain-ops/foundry/testdata/forge-artifacts/Owned.sol/Owned.json @@ -0,0 +1 @@ +{"abi":[{"type":"function","name":"owner","inputs":[],"outputs":[{"name":"","type":"address","internalType":"address"}],"stateMutability":"view"},{"type":"function","name":"setOwner","inputs":[{"name":"newOwner","type":"address","internalType":"address"}],"outputs":[],"stateMutability":"nonpayable"},{"type":"event","name":"OwnerUpdated","inputs":[{"name":"user","type":"address","indexed":true,"internalType":"address"},{"name":"newOwner","type":"address","indexed":true,"internalType":"address"}],"anonymous":false}],"bytecode":{"object":"0x","sourceMap":"","linkReferences":{}},"deployedBytecode":{"object":"0x","sourceMap":"","linkReferences":{}},"methodIdentifiers":{"owner()":"8da5cb5b","setOwner(address)":"13af4035"},"rawMetadata":"{\"compiler\":{\"version\":\"0.8.15+commit.e14f2714\"},\"language\":\"Solidity\",\"output\":{\"abi\":[{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"address\",\"name\":\"user\",\"type\":\"address\"},{\"indexed\":true,\"internalType\":\"address\",\"name\":\"newOwner\",\"type\":\"address\"}],\"name\":\"OwnerUpdated\",\"type\":\"event\"},{\"inputs\":[],\"name\":\"owner\",\"outputs\":[{\"internalType\":\"address\",\"name\":\"\",\"type\":\"address\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"newOwner\",\"type\":\"address\"}],\"name\":\"setOwner\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"}],\"devdoc\":{\"author\":\"Solmate (https://github.com/Rari-Capital/solmate/blob/main/src/auth/Owned.sol)\",\"kind\":\"dev\",\"methods\":{},\"version\":1},\"userdoc\":{\"kind\":\"user\",\"methods\":{},\"notice\":\"Simple single owner authorization mixin.\",\"version\":1}},\"settings\":{\"compilationTarget\":{\"lib/solmate/src/auth/Owned.sol\":\"Owned\"},\"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/\",\":automate/=lib/automate/contracts/\",\":ds-test/=lib/forge-std/lib/ds-test/src/\",\":erc4626-tests/=lib/automate/lib/openzeppelin-contracts/lib/erc4626-tests/\",\":forge-std/=lib/forge-std/src/\",\":gelato/=lib/automate/contracts/\",\":hardhat/=lib/automate/node_modules/hardhat/\",\":kontrol-cheatcodes/=lib/kontrol-cheatcodes/src/\",\":lib-keccak/=lib/lib-keccak/contracts/\",\":openzeppelin-contracts-upgradeable/=lib/openzeppelin-contracts-upgradeable/\",\":openzeppelin-contracts/=lib/openzeppelin-contracts/\",\":prb-test/=lib/automate/lib/prb-test/src/\",\":prb/-est/=lib/automate/lib/prb-test/src/\",\":safe-contracts/=lib/safe-contracts/contracts/\",\":solady/=lib/solady/\",\":solmate/=lib/solmate/src/\"]},\"sources\":{\"lib/solmate/src/auth/Owned.sol\":{\"keccak256\":\"0x7e91c80b0dd1a14a19cb9e661b99924043adab6d9d893bbfcf3a6a3dc23a6743\",\"license\":\"AGPL-3.0-only\",\"urls\":[\"bzz-raw://515890d9fc87d6762dae2354a3a0714a26c652f0ea5bb631122be1968ef8c0e9\",\"dweb:/ipfs/QmTRpQ7uoAR1vCACKJm14Ba3oKVLqcA9reTwbHAPxawVpM\"]}},\"version\":1}","metadata":{"compiler":{"version":"0.8.15+commit.e14f2714"},"language":"Solidity","output":{"abi":[{"inputs":[{"internalType":"address","name":"user","type":"address","indexed":true},{"internalType":"address","name":"newOwner","type":"address","indexed":true}],"type":"event","name":"OwnerUpdated","anonymous":false},{"inputs":[],"stateMutability":"view","type":"function","name":"owner","outputs":[{"internalType":"address","name":"","type":"address"}]},{"inputs":[{"internalType":"address","name":"newOwner","type":"address"}],"stateMutability":"nonpayable","type":"function","name":"setOwner"}],"devdoc":{"kind":"dev","methods":{},"version":1},"userdoc":{"kind":"user","methods":{},"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/","automate/=lib/automate/contracts/","ds-test/=lib/forge-std/lib/ds-test/src/","erc4626-tests/=lib/automate/lib/openzeppelin-contracts/lib/erc4626-tests/","forge-std/=lib/forge-std/src/","gelato/=lib/automate/contracts/","hardhat/=lib/automate/node_modules/hardhat/","kontrol-cheatcodes/=lib/kontrol-cheatcodes/src/","lib-keccak/=lib/lib-keccak/contracts/","openzeppelin-contracts-upgradeable/=lib/openzeppelin-contracts-upgradeable/","openzeppelin-contracts/=lib/openzeppelin-contracts/","prb-test/=lib/automate/lib/prb-test/src/","prb/-est/=lib/automate/lib/prb-test/src/","safe-contracts/=lib/safe-contracts/contracts/","solady/=lib/solady/","solmate/=lib/solmate/src/"],"optimizer":{"enabled":true,"runs":999999},"metadata":{"bytecodeHash":"none"},"compilationTarget":{"lib/solmate/src/auth/Owned.sol":"Owned"},"evmVersion":"london","libraries":{}},"sources":{"lib/solmate/src/auth/Owned.sol":{"keccak256":"0x7e91c80b0dd1a14a19cb9e661b99924043adab6d9d893bbfcf3a6a3dc23a6743","urls":["bzz-raw://515890d9fc87d6762dae2354a3a0714a26c652f0ea5bb631122be1968ef8c0e9","dweb:/ipfs/QmTRpQ7uoAR1vCACKJm14Ba3oKVLqcA9reTwbHAPxawVpM"],"license":"AGPL-3.0-only"}},"version":1},"storageLayout":{"storage":[{"astId":53517,"contract":"lib/solmate/src/auth/Owned.sol:Owned","label":"owner","offset":0,"slot":"0","type":"t_address"}],"types":{"t_address":{"encoding":"inplace","label":"address","numberOfBytes":"20"}}},"userdoc":{"version":1,"kind":"user","notice":"Simple single owner authorization mixin."},"devdoc":{"version":1,"kind":"dev","author":"Solmate (https://github.com/Rari-Capital/solmate/blob/main/src/auth/Owned.sol)"},"ast":{"absolutePath":"lib/solmate/src/auth/Owned.sol","id":53567,"exportedSymbols":{"Owned":[53566]},"nodeType":"SourceUnit","src":"42:1398:68","nodes":[{"id":53508,"nodeType":"PragmaDirective","src":"42:24:68","nodes":[],"literals":["solidity",">=","0.8",".0"]},{"id":53566,"nodeType":"ContractDefinition","src":"212:1227:68","nodes":[{"id":53515,"nodeType":"EventDefinition","src":"421:67:68","nodes":[],"anonymous":false,"eventSelector":"8292fce18fa69edf4db7b94ea2e58241df0ae57f97e0a6c9b29067028bf92d76","name":"OwnerUpdated","nameLocation":"427:12:68","parameters":{"id":53514,"nodeType":"ParameterList","parameters":[{"constant":false,"id":53511,"indexed":true,"mutability":"mutable","name":"user","nameLocation":"456:4:68","nodeType":"VariableDeclaration","scope":53515,"src":"440:20:68","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"},"typeName":{"id":53510,"name":"address","nodeType":"ElementaryTypeName","src":"440:7:68","stateMutability":"nonpayable","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"}},"visibility":"internal"},{"constant":false,"id":53513,"indexed":true,"mutability":"mutable","name":"newOwner","nameLocation":"478:8:68","nodeType":"VariableDeclaration","scope":53515,"src":"462:24:68","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"},"typeName":{"id":53512,"name":"address","nodeType":"ElementaryTypeName","src":"462:7:68","stateMutability":"nonpayable","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"}},"visibility":"internal"}],"src":"439:48:68"}},{"id":53517,"nodeType":"VariableDeclaration","src":"679:20:68","nodes":[],"constant":false,"functionSelector":"8da5cb5b","mutability":"mutable","name":"owner","nameLocation":"694:5:68","scope":53566,"stateVariable":true,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"},"typeName":{"id":53516,"name":"address","nodeType":"ElementaryTypeName","src":"679:7:68","stateMutability":"nonpayable","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"}},"visibility":"public"},{"id":53529,"nodeType":"ModifierDefinition","src":"706:102:68","nodes":[],"body":{"id":53528,"nodeType":"Block","src":"735:73:68","nodes":[],"statements":[{"expression":{"arguments":[{"commonType":{"typeIdentifier":"t_address","typeString":"address"},"id":53523,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"leftExpression":{"expression":{"id":53520,"name":"msg","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":-15,"src":"753:3:68","typeDescriptions":{"typeIdentifier":"t_magic_message","typeString":"msg"}},"id":53521,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"memberName":"sender","nodeType":"MemberAccess","src":"753:10:68","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"}},"nodeType":"BinaryOperation","operator":"==","rightExpression":{"id":53522,"name":"owner","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":53517,"src":"767:5:68","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"}},"src":"753:19:68","typeDescriptions":{"typeIdentifier":"t_bool","typeString":"bool"}},{"hexValue":"554e415554484f52495a4544","id":53524,"isConstant":false,"isLValue":false,"isPure":true,"kind":"string","lValueRequested":false,"nodeType":"Literal","src":"774:14:68","typeDescriptions":{"typeIdentifier":"t_stringliteral_269df367cd41cace5897a935d0e0858fe4543b5619d45e09af6b124c1bb3d528","typeString":"literal_string \"UNAUTHORIZED\""},"value":"UNAUTHORIZED"}],"expression":{"argumentTypes":[{"typeIdentifier":"t_bool","typeString":"bool"},{"typeIdentifier":"t_stringliteral_269df367cd41cace5897a935d0e0858fe4543b5619d45e09af6b124c1bb3d528","typeString":"literal_string \"UNAUTHORIZED\""}],"id":53519,"name":"require","nodeType":"Identifier","overloadedDeclarations":[-18,-18],"referencedDeclaration":-18,"src":"745:7:68","typeDescriptions":{"typeIdentifier":"t_function_require_pure$_t_bool_$_t_string_memory_ptr_$returns$__$","typeString":"function (bool,string memory) pure"}},"id":53525,"isConstant":false,"isLValue":false,"isPure":false,"kind":"functionCall","lValueRequested":false,"names":[],"nodeType":"FunctionCall","src":"745:44:68","tryCall":false,"typeDescriptions":{"typeIdentifier":"t_tuple$__$","typeString":"tuple()"}},"id":53526,"nodeType":"ExpressionStatement","src":"745:44:68"},{"id":53527,"nodeType":"PlaceholderStatement","src":"800:1:68"}]},"name":"onlyOwner","nameLocation":"715:9:68","parameters":{"id":53518,"nodeType":"ParameterList","parameters":[],"src":"724:2:68"},"virtual":true,"visibility":"internal"},{"id":53547,"nodeType":"FunctionDefinition","src":"996:107:68","nodes":[],"body":{"id":53546,"nodeType":"Block","src":"1024:79:68","nodes":[],"statements":[{"expression":{"id":53536,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"leftHandSide":{"id":53534,"name":"owner","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":53517,"src":"1034:5:68","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"}},"nodeType":"Assignment","operator":"=","rightHandSide":{"id":53535,"name":"_owner","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":53531,"src":"1042:6:68","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"}},"src":"1034:14:68","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"}},"id":53537,"nodeType":"ExpressionStatement","src":"1034:14:68"},{"eventCall":{"arguments":[{"arguments":[{"hexValue":"30","id":53541,"isConstant":false,"isLValue":false,"isPure":true,"kind":"number","lValueRequested":false,"nodeType":"Literal","src":"1085:1:68","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":53540,"isConstant":false,"isLValue":false,"isPure":true,"lValueRequested":false,"nodeType":"ElementaryTypeNameExpression","src":"1077:7:68","typeDescriptions":{"typeIdentifier":"t_type$_t_address_$","typeString":"type(address)"},"typeName":{"id":53539,"name":"address","nodeType":"ElementaryTypeName","src":"1077:7:68","typeDescriptions":{}}},"id":53542,"isConstant":false,"isLValue":false,"isPure":true,"kind":"typeConversion","lValueRequested":false,"names":[],"nodeType":"FunctionCall","src":"1077:10:68","tryCall":false,"typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"}},{"id":53543,"name":"_owner","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":53531,"src":"1089:6:68","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"}}],"expression":{"argumentTypes":[{"typeIdentifier":"t_address","typeString":"address"},{"typeIdentifier":"t_address","typeString":"address"}],"id":53538,"name":"OwnerUpdated","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":53515,"src":"1064:12:68","typeDescriptions":{"typeIdentifier":"t_function_event_nonpayable$_t_address_$_t_address_$returns$__$","typeString":"function (address,address)"}},"id":53544,"isConstant":false,"isLValue":false,"isPure":false,"kind":"functionCall","lValueRequested":false,"names":[],"nodeType":"FunctionCall","src":"1064:32:68","tryCall":false,"typeDescriptions":{"typeIdentifier":"t_tuple$__$","typeString":"tuple()"}},"id":53545,"nodeType":"EmitStatement","src":"1059:37:68"}]},"implemented":true,"kind":"constructor","modifiers":[],"name":"","nameLocation":"-1:-1:-1","parameters":{"id":53532,"nodeType":"ParameterList","parameters":[{"constant":false,"id":53531,"mutability":"mutable","name":"_owner","nameLocation":"1016:6:68","nodeType":"VariableDeclaration","scope":53547,"src":"1008:14:68","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"},"typeName":{"id":53530,"name":"address","nodeType":"ElementaryTypeName","src":"1008:7:68","stateMutability":"nonpayable","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"}},"visibility":"internal"}],"src":"1007:16:68"},"returnParameters":{"id":53533,"nodeType":"ParameterList","parameters":[],"src":"1024:0:68"},"scope":53566,"stateMutability":"nonpayable","virtual":false,"visibility":"internal"},{"id":53565,"nodeType":"FunctionDefinition","src":"1293:144:68","nodes":[],"body":{"id":53564,"nodeType":"Block","src":"1354:83:68","nodes":[],"statements":[{"expression":{"id":53556,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"leftHandSide":{"id":53554,"name":"owner","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":53517,"src":"1364:5:68","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"}},"nodeType":"Assignment","operator":"=","rightHandSide":{"id":53555,"name":"newOwner","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":53549,"src":"1372:8:68","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"}},"src":"1364:16:68","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"}},"id":53557,"nodeType":"ExpressionStatement","src":"1364:16:68"},{"eventCall":{"arguments":[{"expression":{"id":53559,"name":"msg","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":-15,"src":"1409:3:68","typeDescriptions":{"typeIdentifier":"t_magic_message","typeString":"msg"}},"id":53560,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"memberName":"sender","nodeType":"MemberAccess","src":"1409:10:68","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"}},{"id":53561,"name":"newOwner","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":53549,"src":"1421:8:68","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"}}],"expression":{"argumentTypes":[{"typeIdentifier":"t_address","typeString":"address"},{"typeIdentifier":"t_address","typeString":"address"}],"id":53558,"name":"OwnerUpdated","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":53515,"src":"1396:12:68","typeDescriptions":{"typeIdentifier":"t_function_event_nonpayable$_t_address_$_t_address_$returns$__$","typeString":"function (address,address)"}},"id":53562,"isConstant":false,"isLValue":false,"isPure":false,"kind":"functionCall","lValueRequested":false,"names":[],"nodeType":"FunctionCall","src":"1396:34:68","tryCall":false,"typeDescriptions":{"typeIdentifier":"t_tuple$__$","typeString":"tuple()"}},"id":53563,"nodeType":"EmitStatement","src":"1391:39:68"}]},"functionSelector":"13af4035","implemented":true,"kind":"function","modifiers":[{"id":53552,"kind":"modifierInvocation","modifierName":{"id":53551,"name":"onlyOwner","nodeType":"IdentifierPath","referencedDeclaration":53529,"src":"1344:9:68"},"nodeType":"ModifierInvocation","src":"1344:9:68"}],"name":"setOwner","nameLocation":"1302:8:68","parameters":{"id":53550,"nodeType":"ParameterList","parameters":[{"constant":false,"id":53549,"mutability":"mutable","name":"newOwner","nameLocation":"1319:8:68","nodeType":"VariableDeclaration","scope":53565,"src":"1311:16:68","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"},"typeName":{"id":53548,"name":"address","nodeType":"ElementaryTypeName","src":"1311:7:68","stateMutability":"nonpayable","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"}},"visibility":"internal"}],"src":"1310:18:68"},"returnParameters":{"id":53553,"nodeType":"ParameterList","parameters":[],"src":"1354:0:68"},"scope":53566,"stateMutability":"nonpayable","virtual":true,"visibility":"public"}],"abstract":true,"baseContracts":[],"canonicalName":"Owned","contractDependencies":[],"contractKind":"contract","documentation":{"id":53509,"nodeType":"StructuredDocumentation","src":"68:144:68","text":"@notice Simple single owner authorization mixin.\n @author Solmate (https://github.com/Rari-Capital/solmate/blob/main/src/auth/Owned.sol)"},"fullyImplemented":true,"linearizedBaseContracts":[53566],"name":"Owned","nameLocation":"230:5:68","scope":53567,"usedErrors":[]}],"license":"AGPL-3.0-only"},"id":68} diff --git a/op-chain-ops/foundry/testdata/srcmaps/artifacts/build-info/c79aa2c3b4578aee2dd8f02d20b1aeb6.json b/op-chain-ops/foundry/testdata/srcmaps/artifacts/build-info/c79aa2c3b4578aee2dd8f02d20b1aeb6.json new file mode 100644 index 000000000000..59cd6663b18f --- /dev/null +++ b/op-chain-ops/foundry/testdata/srcmaps/artifacts/build-info/c79aa2c3b4578aee2dd8f02d20b1aeb6.json @@ -0,0 +1 @@ +{"id":"c79aa2c3b4578aee2dd8f02d20b1aeb6","source_id_to_path":{"0":"src/SimpleStorage.sol","1":"src/StorageLibrary.sol"},"language":"Solidity"} \ No newline at end of file diff --git a/op-chain-ops/foundry/testdata/srcmaps/cache/solidity-files-cache.json b/op-chain-ops/foundry/testdata/srcmaps/cache/solidity-files-cache.json new file mode 100644 index 000000000000..47bdef8c6965 --- /dev/null +++ b/op-chain-ops/foundry/testdata/srcmaps/cache/solidity-files-cache.json @@ -0,0 +1 @@ +{"_format":"","paths":{"artifacts":"test-artifacts","build_infos":"artifacts/build-info","sources":"src","tests":"test","scripts":"scripts","libraries":["lib","node_modules"]},"files":{"src/SimpleStorage.sol":{"lastModificationDate":1724351550959,"contentHash":"25499c2e202ada22ebd26f8e886cc2e1","sourceName":"src/SimpleStorage.sol","compilerSettings":{"solc":{"optimizer":{"enabled":true,"runs":999999},"metadata":{"useLiteralContent":false,"bytecodeHash":"none","appendCBOR":true},"outputSelection":{"*":{"":["ast"],"*":["abi","evm.bytecode","evm.deployedBytecode","evm.methodIdentifiers","metadata","storageLayout","devdoc","userdoc"]}},"evmVersion":"cancun","viaIR":false,"libraries":{}},"vyper":{"evmVersion":"cancun","outputSelection":{"*":{"*":["abi","evm.bytecode","evm.deployedBytecode"]}}}},"imports":["src/StorageLibrary.sol"],"versionRequirement":"=0.8.15","artifacts":{"SimpleStorage":{"0.8.15":{"path":"SimpleStorage.sol/SimpleStorage.json","build_id":"c79aa2c3b4578aee2dd8f02d20b1aeb6"}}},"seenByCompiler":true},"src/StorageLibrary.sol":{"lastModificationDate":1724351550967,"contentHash":"61545ea51326b6aa0e3bafaf3116b0a8","sourceName":"src/StorageLibrary.sol","compilerSettings":{"solc":{"optimizer":{"enabled":true,"runs":999999},"metadata":{"useLiteralContent":false,"bytecodeHash":"none","appendCBOR":true},"outputSelection":{"*":{"":["ast"],"*":["abi","evm.bytecode","evm.deployedBytecode","evm.methodIdentifiers","metadata","storageLayout","devdoc","userdoc"]}},"evmVersion":"cancun","viaIR":false,"libraries":{}},"vyper":{"evmVersion":"cancun","outputSelection":{"*":{"*":["abi","evm.bytecode","evm.deployedBytecode"]}}}},"imports":[],"versionRequirement":"=0.8.15","artifacts":{"StorageLibrary":{"0.8.15":{"path":"StorageLibrary.sol/StorageLibrary.json","build_id":"c79aa2c3b4578aee2dd8f02d20b1aeb6"}}},"seenByCompiler":true}},"builds":["c79aa2c3b4578aee2dd8f02d20b1aeb6"]} \ No newline at end of file diff --git a/op-chain-ops/foundry/testdata/srcmaps/foundry.toml b/op-chain-ops/foundry/testdata/srcmaps/foundry.toml new file mode 100644 index 000000000000..c321ef0af22a --- /dev/null +++ b/op-chain-ops/foundry/testdata/srcmaps/foundry.toml @@ -0,0 +1,31 @@ +################################################################ +# PROFILE: DEFAULT (Local) # +################################################################ + +[profile.default] + +# Compilation settings +src = 'src' +out = 'test-artifacts' +script = 'scripts' +optimizer = true +optimizer_runs = 999999 +remappings = [] +extra_output = ['devdoc', 'userdoc', 'metadata', 'storageLayout'] +bytecode_hash = 'none' +build_info_path = 'artifacts/build-info' +ast = true +evm_version = "cancun" +# 5159 error code is selfdestruct error code +ignored_error_codes = ["transient-storage", "code-size", "init-code-size", 5159] + +# We set the gas limit to max int64 to avoid running out of gas during testing, since the default +# gas limit is 1B and some of our tests require more gas than that, such as `test_callWithMinGas_noLeakageLow_succeeds`. +# We use this gas limit since it was the default gas limit prior to https://github.com/foundry-rs/foundry/pull/8274. +# Due to toml-rs limitations, if you increase the gas limit above this value it must be a string. +gas_limit = 9223372036854775807 + +# Test / Script Runner Settings +ffi = false +fs_permissions = [] +libs = ["node_modules", "lib"] diff --git a/op-chain-ops/foundry/testdata/srcmaps/generate.sh b/op-chain-ops/foundry/testdata/srcmaps/generate.sh new file mode 100755 index 000000000000..f63cb05ed60d --- /dev/null +++ b/op-chain-ops/foundry/testdata/srcmaps/generate.sh @@ -0,0 +1,8 @@ +#!/bin/sh + +set -euo + +# Don't include previous build outputs +forge clean + +forge build diff --git a/op-chain-ops/foundry/testdata/srcmaps/src/SimpleStorage.sol b/op-chain-ops/foundry/testdata/srcmaps/src/SimpleStorage.sol new file mode 100644 index 000000000000..05477b6e747d --- /dev/null +++ b/op-chain-ops/foundry/testdata/srcmaps/src/SimpleStorage.sol @@ -0,0 +1,14 @@ +// SPDX-License-Identifier: MIT +pragma solidity 0.8.15; + +import {StorageLibrary} from "./StorageLibrary.sol"; + +// @notice SimpleStorage is a contract to test Go <> foundry integration. +// @dev uses a dependency, to test source-mapping with multiple sources. +contract SimpleStorage { + + // @dev example getter + function getExampleData() public pure returns (uint256) { + return StorageLibrary.addData(42); + } +} diff --git a/op-chain-ops/foundry/testdata/srcmaps/src/StorageLibrary.sol b/op-chain-ops/foundry/testdata/srcmaps/src/StorageLibrary.sol new file mode 100644 index 000000000000..049b03ac2f8e --- /dev/null +++ b/op-chain-ops/foundry/testdata/srcmaps/src/StorageLibrary.sol @@ -0,0 +1,12 @@ +// SPDX-License-Identifier: MIT +pragma solidity 0.8.15; + +// @notice StorageLibrary is an example library used for integration testing. +library StorageLibrary { + + function addData(uint256 _data) internal pure returns (uint256) { + return _data + 123; + } + +} + diff --git a/op-chain-ops/foundry/testdata/srcmaps/test-artifacts/SimpleStorage.sol/SimpleStorage.json b/op-chain-ops/foundry/testdata/srcmaps/test-artifacts/SimpleStorage.sol/SimpleStorage.json new file mode 100644 index 000000000000..f6aed9db421f --- /dev/null +++ b/op-chain-ops/foundry/testdata/srcmaps/test-artifacts/SimpleStorage.sol/SimpleStorage.json @@ -0,0 +1 @@ +{"abi":[{"type":"function","name":"getExampleData","inputs":[],"outputs":[{"name":"","type":"uint256","internalType":"uint256"}],"stateMutability":"pure"}],"bytecode":{"object":"0x608060405234801561001057600080fd5b5060b08061001f6000396000f3fe6080604052348015600f57600080fd5b506004361060285760003560e01c8063b5bc337e14602d575b600080fd5b60336045565b60405190815260200160405180910390f35b6000604f602a6054565b905090565b6000605f82607b6065565b92915050565b60008219821115609e577f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b50019056fea164736f6c634300080f000a","sourceMap":"258:165:0:-:0;;;;;;;;;;;;;;;;;;;","linkReferences":{}},"deployedBytecode":{"object":"0x6080604052348015600f57600080fd5b506004361060285760003560e01c8063b5bc337e14602d575b600080fd5b60336045565b60405190815260200160405180910390f35b6000604f602a6054565b905090565b6000605f82607b6065565b92915050565b60008219821115609e577f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b50019056fea164736f6c634300080f000a","sourceMap":"258:165:0:-:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;315:106;;;:::i;:::-;;;160:25:2;;;148:2;133:18;315:106:0;;;;;;;;362:7;388:26;411:2;388:22;:26::i;:::-;381:33;;315:106;:::o;165:99:1:-;220:7;246:11;:5;254:3;246:11;:::i;:::-;239:18;165:99;-1:-1:-1;;165:99:1:o;196:282:2:-;236:3;267:1;263:6;260:1;257:13;254:193;;;303:77;300:1;293:88;404:4;401:1;394:15;432:4;429:1;422:15;254:193;-1:-1:-1;463:9:2;;196:282::o","linkReferences":{}},"methodIdentifiers":{"getExampleData()":"b5bc337e"},"rawMetadata":"{\"compiler\":{\"version\":\"0.8.15+commit.e14f2714\"},\"language\":\"Solidity\",\"output\":{\"abi\":[{\"inputs\":[],\"name\":\"getExampleData\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"\",\"type\":\"uint256\"}],\"stateMutability\":\"pure\",\"type\":\"function\"}],\"devdoc\":{\"kind\":\"dev\",\"methods\":{},\"version\":1},\"userdoc\":{\"kind\":\"user\",\"methods\":{},\"version\":1}},\"settings\":{\"compilationTarget\":{\"src/SimpleStorage.sol\":\"SimpleStorage\"},\"evmVersion\":\"london\",\"libraries\":{},\"metadata\":{\"bytecodeHash\":\"none\"},\"optimizer\":{\"enabled\":true,\"runs\":999999},\"remappings\":[]},\"sources\":{\"src/SimpleStorage.sol\":{\"keccak256\":\"0x72903094842a1afc1a226391c402411969dc9736b4aa71222a620bfa5a712e91\",\"license\":\"MIT\",\"urls\":[\"bzz-raw://59876be2e0433af20a46cd8d00de4f461f1f75e53c79ff821787684329077812\",\"dweb:/ipfs/QmXzGm3ka8PoUoD7kyEv77babg49uo3TZFMfcWUYrA9QTJ\"]},\"src/StorageLibrary.sol\":{\"keccak256\":\"0x29bbbc60bf5a5f414ff1bf0198d06e007b193071767991a7ae92fd0683bf63b3\",\"license\":\"MIT\",\"urls\":[\"bzz-raw://83ec033aadcafafc309c246e6fd83d75ceb77eef37658a4876d61b7436bd4a7d\",\"dweb:/ipfs/QmQg2wwT5xfm1yMetzioBccKg6nEv5bhRsrmZC69Z9QN8F\"]}},\"version\":1}","metadata":{"compiler":{"version":"0.8.15+commit.e14f2714"},"language":"Solidity","output":{"abi":[{"inputs":[],"stateMutability":"pure","type":"function","name":"getExampleData","outputs":[{"internalType":"uint256","name":"","type":"uint256"}]}],"devdoc":{"kind":"dev","methods":{},"version":1},"userdoc":{"kind":"user","methods":{},"version":1}},"settings":{"remappings":[],"optimizer":{"enabled":true,"runs":999999},"metadata":{"bytecodeHash":"none"},"compilationTarget":{"src/SimpleStorage.sol":"SimpleStorage"},"evmVersion":"london","libraries":{}},"sources":{"src/SimpleStorage.sol":{"keccak256":"0x72903094842a1afc1a226391c402411969dc9736b4aa71222a620bfa5a712e91","urls":["bzz-raw://59876be2e0433af20a46cd8d00de4f461f1f75e53c79ff821787684329077812","dweb:/ipfs/QmXzGm3ka8PoUoD7kyEv77babg49uo3TZFMfcWUYrA9QTJ"],"license":"MIT"},"src/StorageLibrary.sol":{"keccak256":"0x29bbbc60bf5a5f414ff1bf0198d06e007b193071767991a7ae92fd0683bf63b3","urls":["bzz-raw://83ec033aadcafafc309c246e6fd83d75ceb77eef37658a4876d61b7436bd4a7d","dweb:/ipfs/QmQg2wwT5xfm1yMetzioBccKg6nEv5bhRsrmZC69Z9QN8F"],"license":"MIT"}},"version":1},"storageLayout":{"storage":[],"types":{}},"userdoc":{"version":1,"kind":"user"},"devdoc":{"version":1,"kind":"dev"},"ast":{"absolutePath":"src/SimpleStorage.sol","id":16,"exportedSymbols":{"SimpleStorage":[15],"StorageLibrary":[30]},"nodeType":"SourceUnit","src":"32:392:0","nodes":[{"id":1,"nodeType":"PragmaDirective","src":"32:23:0","nodes":[],"literals":["solidity","0.8",".15"]},{"id":3,"nodeType":"ImportDirective","src":"57:52:0","nodes":[],"absolutePath":"src/StorageLibrary.sol","file":"./StorageLibrary.sol","nameLocation":"-1:-1:-1","scope":16,"sourceUnit":31,"symbolAliases":[{"foreign":{"id":2,"name":"StorageLibrary","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":30,"src":"65:14:0","typeDescriptions":{}},"nameLocation":"-1:-1:-1"}],"unitAlias":""},{"id":15,"nodeType":"ContractDefinition","src":"258:165:0","nodes":[{"id":14,"nodeType":"FunctionDefinition","src":"315:106:0","nodes":[],"body":{"id":13,"nodeType":"Block","src":"371:50:0","nodes":[],"statements":[{"expression":{"arguments":[{"hexValue":"3432","id":10,"isConstant":false,"isLValue":false,"isPure":true,"kind":"number","lValueRequested":false,"nodeType":"Literal","src":"411:2:0","typeDescriptions":{"typeIdentifier":"t_rational_42_by_1","typeString":"int_const 42"},"value":"42"}],"expression":{"argumentTypes":[{"typeIdentifier":"t_rational_42_by_1","typeString":"int_const 42"}],"expression":{"id":8,"name":"StorageLibrary","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":30,"src":"388:14:0","typeDescriptions":{"typeIdentifier":"t_type$_t_contract$_StorageLibrary_$30_$","typeString":"type(library StorageLibrary)"}},"id":9,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"memberName":"addData","nodeType":"MemberAccess","referencedDeclaration":29,"src":"388:22:0","typeDescriptions":{"typeIdentifier":"t_function_internal_pure$_t_uint256_$returns$_t_uint256_$","typeString":"function (uint256) pure returns (uint256)"}},"id":11,"isConstant":false,"isLValue":false,"isPure":false,"kind":"functionCall","lValueRequested":false,"names":[],"nodeType":"FunctionCall","src":"388:26:0","tryCall":false,"typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"functionReturnParameters":7,"id":12,"nodeType":"Return","src":"381:33:0"}]},"functionSelector":"b5bc337e","implemented":true,"kind":"function","modifiers":[],"name":"getExampleData","nameLocation":"324:14:0","parameters":{"id":4,"nodeType":"ParameterList","parameters":[],"src":"338:2:0"},"returnParameters":{"id":7,"nodeType":"ParameterList","parameters":[{"constant":false,"id":6,"mutability":"mutable","name":"","nameLocation":"-1:-1:-1","nodeType":"VariableDeclaration","scope":14,"src":"362:7:0","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"},"typeName":{"id":5,"name":"uint256","nodeType":"ElementaryTypeName","src":"362:7:0","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"visibility":"internal"}],"src":"361:9:0"},"scope":15,"stateMutability":"pure","virtual":false,"visibility":"public"}],"abstract":false,"baseContracts":[],"canonicalName":"SimpleStorage","contractDependencies":[],"contractKind":"contract","fullyImplemented":true,"linearizedBaseContracts":[15],"name":"SimpleStorage","nameLocation":"267:13:0","scope":16,"usedErrors":[]}],"license":"MIT"},"id":0} \ No newline at end of file diff --git a/op-chain-ops/foundry/testdata/srcmaps/test-artifacts/StorageLibrary.sol/StorageLibrary.json b/op-chain-ops/foundry/testdata/srcmaps/test-artifacts/StorageLibrary.sol/StorageLibrary.json new file mode 100644 index 000000000000..c27a93db99ee --- /dev/null +++ b/op-chain-ops/foundry/testdata/srcmaps/test-artifacts/StorageLibrary.sol/StorageLibrary.json @@ -0,0 +1 @@ +{"abi":[],"bytecode":{"object":"0x602d6037600b82828239805160001a607314602a57634e487b7160e01b600052600060045260246000fd5b30600052607381538281f3fe73000000000000000000000000000000000000000030146080604052600080fdfea164736f6c634300080f000a","sourceMap":"135:132:1:-:0;;;;;;;;;;;;;;;-1:-1:-1;;;135:132:1;;;;;;;;;;;;;;;;;","linkReferences":{}},"deployedBytecode":{"object":"0x73000000000000000000000000000000000000000030146080604052600080fdfea164736f6c634300080f000a","sourceMap":"135:132:1:-:0;;;;;;;;","linkReferences":{}},"methodIdentifiers":{},"rawMetadata":"{\"compiler\":{\"version\":\"0.8.15+commit.e14f2714\"},\"language\":\"Solidity\",\"output\":{\"abi\":[],\"devdoc\":{\"kind\":\"dev\",\"methods\":{},\"version\":1},\"userdoc\":{\"kind\":\"user\",\"methods\":{},\"version\":1}},\"settings\":{\"compilationTarget\":{\"src/StorageLibrary.sol\":\"StorageLibrary\"},\"evmVersion\":\"london\",\"libraries\":{},\"metadata\":{\"bytecodeHash\":\"none\"},\"optimizer\":{\"enabled\":true,\"runs\":999999},\"remappings\":[]},\"sources\":{\"src/StorageLibrary.sol\":{\"keccak256\":\"0x29bbbc60bf5a5f414ff1bf0198d06e007b193071767991a7ae92fd0683bf63b3\",\"license\":\"MIT\",\"urls\":[\"bzz-raw://83ec033aadcafafc309c246e6fd83d75ceb77eef37658a4876d61b7436bd4a7d\",\"dweb:/ipfs/QmQg2wwT5xfm1yMetzioBccKg6nEv5bhRsrmZC69Z9QN8F\"]}},\"version\":1}","metadata":{"compiler":{"version":"0.8.15+commit.e14f2714"},"language":"Solidity","output":{"abi":[],"devdoc":{"kind":"dev","methods":{},"version":1},"userdoc":{"kind":"user","methods":{},"version":1}},"settings":{"remappings":[],"optimizer":{"enabled":true,"runs":999999},"metadata":{"bytecodeHash":"none"},"compilationTarget":{"src/StorageLibrary.sol":"StorageLibrary"},"evmVersion":"london","libraries":{}},"sources":{"src/StorageLibrary.sol":{"keccak256":"0x29bbbc60bf5a5f414ff1bf0198d06e007b193071767991a7ae92fd0683bf63b3","urls":["bzz-raw://83ec033aadcafafc309c246e6fd83d75ceb77eef37658a4876d61b7436bd4a7d","dweb:/ipfs/QmQg2wwT5xfm1yMetzioBccKg6nEv5bhRsrmZC69Z9QN8F"],"license":"MIT"}},"version":1},"storageLayout":{"storage":[],"types":{}},"userdoc":{"version":1,"kind":"user"},"devdoc":{"version":1,"kind":"dev"},"ast":{"absolutePath":"src/StorageLibrary.sol","id":31,"exportedSymbols":{"StorageLibrary":[30]},"nodeType":"SourceUnit","src":"32:237:1","nodes":[{"id":17,"nodeType":"PragmaDirective","src":"32:23:1","nodes":[],"literals":["solidity","0.8",".15"]},{"id":30,"nodeType":"ContractDefinition","src":"135:132:1","nodes":[{"id":29,"nodeType":"FunctionDefinition","src":"165:99:1","nodes":[],"body":{"id":28,"nodeType":"Block","src":"229:35:1","nodes":[],"statements":[{"expression":{"commonType":{"typeIdentifier":"t_uint256","typeString":"uint256"},"id":26,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"leftExpression":{"id":24,"name":"_data","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":19,"src":"246:5:1","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"nodeType":"BinaryOperation","operator":"+","rightExpression":{"hexValue":"313233","id":25,"isConstant":false,"isLValue":false,"isPure":true,"kind":"number","lValueRequested":false,"nodeType":"Literal","src":"254:3:1","typeDescriptions":{"typeIdentifier":"t_rational_123_by_1","typeString":"int_const 123"},"value":"123"},"src":"246:11:1","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"functionReturnParameters":23,"id":27,"nodeType":"Return","src":"239:18:1"}]},"implemented":true,"kind":"function","modifiers":[],"name":"addData","nameLocation":"174:7:1","parameters":{"id":20,"nodeType":"ParameterList","parameters":[{"constant":false,"id":19,"mutability":"mutable","name":"_data","nameLocation":"190:5:1","nodeType":"VariableDeclaration","scope":29,"src":"182:13:1","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"},"typeName":{"id":18,"name":"uint256","nodeType":"ElementaryTypeName","src":"182:7:1","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"visibility":"internal"}],"src":"181:15:1"},"returnParameters":{"id":23,"nodeType":"ParameterList","parameters":[{"constant":false,"id":22,"mutability":"mutable","name":"","nameLocation":"-1:-1:-1","nodeType":"VariableDeclaration","scope":29,"src":"220:7:1","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"},"typeName":{"id":21,"name":"uint256","nodeType":"ElementaryTypeName","src":"220:7:1","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"visibility":"internal"}],"src":"219:9:1"},"scope":30,"stateMutability":"pure","virtual":false,"visibility":"internal"}],"abstract":false,"baseContracts":[],"canonicalName":"StorageLibrary","contractDependencies":[],"contractKind":"library","fullyImplemented":true,"linearizedBaseContracts":[30],"name":"StorageLibrary","nameLocation":"143:14:1","scope":31,"usedErrors":[]}],"license":"MIT"},"id":1} \ No newline at end of file diff --git a/op-chain-ops/genesis/beacondeposit/beacon_deposit.go b/op-chain-ops/genesis/beacondeposit/beacon_deposit.go new file mode 100644 index 000000000000..0434b52a0824 --- /dev/null +++ b/op-chain-ops/genesis/beacondeposit/beacon_deposit.go @@ -0,0 +1,23 @@ +package beacondeposit + +import ( + _ "embed" + "encoding/json" + "fmt" + + "github.com/ethereum/go-ethereum/common" + "github.com/ethereum/go-ethereum/core" + "github.com/ethereum/go-ethereum/core/types" +) + +//go:embed l1_empty_beacon_deposit_contract.json +var l1EmptyBeaconDepositContractJSON []byte + +func InsertEmptyBeaconDepositContract(gen *core.Genesis, addr common.Address) error { + var beaconDepositContractAccount types.Account + if err := json.Unmarshal(l1EmptyBeaconDepositContractJSON, &beaconDepositContractAccount); err != nil { + return fmt.Errorf("failed to read beacon deposit contract definition: %w", err) + } + gen.Alloc[addr] = beaconDepositContractAccount + return nil +} diff --git a/op-chain-ops/genesis/beacondeposit/l1_empty_beacon_deposit_contract.json b/op-chain-ops/genesis/beacondeposit/l1_empty_beacon_deposit_contract.json new file mode 100644 index 000000000000..cacf6105668e --- /dev/null +++ b/op-chain-ops/genesis/beacondeposit/l1_empty_beacon_deposit_contract.json @@ -0,0 +1,38 @@ +{ + "balance": "0", + "nonce": 1, + "code": "0x60806040526004361061003f5760003560e01c806301ffc9a71461004457806322895118146100a4578063621fd130146101ba578063c5f2892f14610244575b600080fd5b34801561005057600080fd5b506100906004803603602081101561006757600080fd5b50357fffffffff000000000000000000000000000000000000000000000000000000001661026b565b604080519115158252519081900360200190f35b6101b8600480360360808110156100ba57600080fd5b8101906020810181356401000000008111156100d557600080fd5b8201836020820111156100e757600080fd5b8035906020019184600183028401116401000000008311171561010957600080fd5b91939092909160208101903564010000000081111561012757600080fd5b82018360208201111561013957600080fd5b8035906020019184600183028401116401000000008311171561015b57600080fd5b91939092909160208101903564010000000081111561017957600080fd5b82018360208201111561018b57600080fd5b803590602001918460018302840111640100000000831117156101ad57600080fd5b919350915035610304565b005b3480156101c657600080fd5b506101cf6110b5565b6040805160208082528351818301528351919283929083019185019080838360005b838110156102095781810151838201526020016101f1565b50505050905090810190601f1680156102365780820380516001836020036101000a031916815260200191505b509250505060405180910390f35b34801561025057600080fd5b506102596110c7565b60408051918252519081900360200190f35b60007fffffffff0000000000000000000000000000000000000000000000000000000082167f01ffc9a70000000000000000000000000000000000000000000000000000000014806102fe57507fffffffff0000000000000000000000000000000000000000000000000000000082167f8564090700000000000000000000000000000000000000000000000000000000145b92915050565b6030861461035d576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260268152602001806118056026913960400191505060405180910390fd5b602084146103b6576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252603681526020018061179c6036913960400191505060405180910390fd5b6060821461040f576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260298152602001806118786029913960400191505060405180910390fd5b670de0b6b3a7640000341015610470576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260268152602001806118526026913960400191505060405180910390fd5b633b9aca003406156104cd576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260338152602001806117d26033913960400191505060405180910390fd5b633b9aca00340467ffffffffffffffff811115610535576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252602781526020018061182b6027913960400191505060405180910390fd5b6060610540826114ba565b90507f649bbc62d0e31342afea4e5cd82d4049e7e1ee912fc0889aa790803be39038c589898989858a8a6105756020546114ba565b6040805160a0808252810189905290819060208201908201606083016080840160c085018e8e80828437600083820152601f017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe01690910187810386528c815260200190508c8c808284376000838201819052601f9091017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe01690920188810386528c5181528c51602091820193918e019250908190849084905b83811015610648578181015183820152602001610630565b50505050905090810190601f1680156106755780820380516001836020036101000a031916815260200191505b5086810383528881526020018989808284376000838201819052601f9091017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0169092018881038452895181528951602091820193918b019250908190849084905b838110156106ef5781810151838201526020016106d7565b50505050905090810190601f16801561071c5780820380516001836020036101000a031916815260200191505b509d505050505050505050505050505060405180910390a1600060028a8a600060801b604051602001808484808284377fffffffffffffffffffffffffffffffff0000000000000000000000000000000090941691909301908152604080517ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0818403018152601090920190819052815191955093508392506020850191508083835b602083106107fc57805182527fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe090920191602091820191016107bf565b51815160209384036101000a7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff01801990921691161790526040519190930194509192505080830381855afa158015610859573d6000803e3d6000fd5b5050506040513d602081101561086e57600080fd5b5051905060006002806108846040848a8c6116fe565b6040516020018083838082843780830192505050925050506040516020818303038152906040526040518082805190602001908083835b602083106108f857805182527fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe090920191602091820191016108bb565b51815160209384036101000a7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff01801990921691161790526040519190930194509192505080830381855afa158015610955573d6000803e3d6000fd5b5050506040513d602081101561096a57600080fd5b5051600261097b896040818d6116fe565b60405160009060200180848480828437919091019283525050604080518083038152602092830191829052805190945090925082918401908083835b602083106109f457805182527fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe090920191602091820191016109b7565b51815160209384036101000a7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff01801990921691161790526040519190930194509192505080830381855afa158015610a51573d6000803e3d6000fd5b5050506040513d6020811015610a6657600080fd5b5051604080516020818101949094528082019290925280518083038201815260609092019081905281519192909182918401908083835b60208310610ada57805182527fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe09092019160209182019101610a9d565b51815160209384036101000a7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff01801990921691161790526040519190930194509192505080830381855afa158015610b37573d6000803e3d6000fd5b5050506040513d6020811015610b4c57600080fd5b50516040805160208101858152929350600092600292839287928f928f92018383808284378083019250505093505050506040516020818303038152906040526040518082805190602001908083835b60208310610bd957805182527fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe09092019160209182019101610b9c565b51815160209384036101000a7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff01801990921691161790526040519190930194509192505080830381855afa158015610c36573d6000803e3d6000fd5b5050506040513d6020811015610c4b57600080fd5b50516040518651600291889160009188916020918201918291908601908083835b60208310610ca957805182527fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe09092019160209182019101610c6c565b6001836020036101000a0380198251168184511680821785525050505050509050018367ffffffffffffffff191667ffffffffffffffff1916815260180182815260200193505050506040516020818303038152906040526040518082805190602001908083835b60208310610d4e57805182527fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe09092019160209182019101610d11565b51815160209384036101000a7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff01801990921691161790526040519190930194509192505080830381855afa158015610dab573d6000803e3d6000fd5b5050506040513d6020811015610dc057600080fd5b5051604080516020818101949094528082019290925280518083038201815260609092019081905281519192909182918401908083835b60208310610e3457805182527fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe09092019160209182019101610df7565b51815160209384036101000a7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff01801990921691161790526040519190930194509192505080830381855afa158015610e91573d6000803e3d6000fd5b5050506040513d6020811015610ea657600080fd5b50519050858114610f02576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260548152602001806117486054913960600191505060405180910390fd5b60205463ffffffff11610f60576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260218152602001806117276021913960400191505060405180910390fd5b602080546001019081905560005b60208110156110a9578160011660011415610fa0578260008260208110610f9157fe5b0155506110ac95505050505050565b600260008260208110610faf57fe5b01548460405160200180838152602001828152602001925050506040516020818303038152906040526040518082805190602001908083835b6020831061102557805182527fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe09092019160209182019101610fe8565b51815160209384036101000a7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff01801990921691161790526040519190930194509192505080830381855afa158015611082573d6000803e3d6000fd5b5050506040513d602081101561109757600080fd5b50519250600282049150600101610f6e565b50fe5b50505050505050565b60606110c26020546114ba565b905090565b6020546000908190815b60208110156112f05781600116600114156111e6576002600082602081106110f557fe5b01548460405160200180838152602001828152602001925050506040516020818303038152906040526040518082805190602001908083835b6020831061116b57805182527fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0909201916020918201910161112e565b51815160209384036101000a7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff01801990921691161790526040519190930194509192505080830381855afa1580156111c8573d6000803e3d6000fd5b5050506040513d60208110156111dd57600080fd5b505192506112e2565b600283602183602081106111f657fe5b015460405160200180838152602001828152602001925050506040516020818303038152906040526040518082805190602001908083835b6020831061126b57805182527fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0909201916020918201910161122e565b51815160209384036101000a7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff01801990921691161790526040519190930194509192505080830381855afa1580156112c8573d6000803e3d6000fd5b5050506040513d60208110156112dd57600080fd5b505192505b6002820491506001016110d1565b506002826112ff6020546114ba565b600060401b6040516020018084815260200183805190602001908083835b6020831061135a57805182527fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0909201916020918201910161131d565b51815160209384036101000a7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff01801990921691161790527fffffffffffffffffffffffffffffffffffffffffffffffff000000000000000095909516920191825250604080518083037ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff8018152601890920190819052815191955093508392850191508083835b6020831061143f57805182527fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe09092019160209182019101611402565b51815160209384036101000a7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff01801990921691161790526040519190930194509192505080830381855afa15801561149c573d6000803e3d6000fd5b5050506040513d60208110156114b157600080fd5b50519250505090565b60408051600880825281830190925260609160208201818036833701905050905060c082901b8060071a60f81b826000815181106114f457fe5b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a9053508060061a60f81b8260018151811061153757fe5b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a9053508060051a60f81b8260028151811061157a57fe5b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a9053508060041a60f81b826003815181106115bd57fe5b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a9053508060031a60f81b8260048151811061160057fe5b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a9053508060021a60f81b8260058151811061164357fe5b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a9053508060011a60f81b8260068151811061168657fe5b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a9053508060001a60f81b826007815181106116c957fe5b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a90535050919050565b6000808585111561170d578182fd5b83861115611719578182fd5b505082019391909203915056fe4465706f736974436f6e74726163743a206d65726b6c6520747265652066756c6c4465706f736974436f6e74726163743a207265636f6e7374727563746564204465706f7369744461746120646f6573206e6f74206d6174636820737570706c696564206465706f7369745f646174615f726f6f744465706f736974436f6e74726163743a20696e76616c6964207769746864726177616c5f63726564656e7469616c73206c656e6774684465706f736974436f6e74726163743a206465706f7369742076616c7565206e6f74206d756c7469706c65206f6620677765694465706f736974436f6e74726163743a20696e76616c6964207075626b6579206c656e6774684465706f736974436f6e74726163743a206465706f7369742076616c756520746f6f20686967684465706f736974436f6e74726163743a206465706f7369742076616c756520746f6f206c6f774465706f736974436f6e74726163743a20696e76616c6964207369676e6174757265206c656e677468a26469706673582212201dd26f37a621703009abf16e77e69c93dc50c79db7f6cc37543e3e0e3decdc9764736f6c634300060b0033", + "storage": { + "0x0000000000000000000000000000000000000000000000000000000000000022": "0xf5a5fd42d16a20302798ef6ed309979b43003d2320d9f0e8ea9831a92759fb4b", + "0x0000000000000000000000000000000000000000000000000000000000000023": "0xdb56114e00fdd4c1f85c892bf35ac9a89289aaecb1ebd0a96cde606a748b5d71", + "0x0000000000000000000000000000000000000000000000000000000000000024": "0xc78009fdf07fc56a11f122370658a353aaa542ed63e44c4bc15ff4cd105ab33c", + "0x0000000000000000000000000000000000000000000000000000000000000025": "0x536d98837f2dd165a55d5eeae91485954472d56f246df256bf3cae19352a123c", + "0x0000000000000000000000000000000000000000000000000000000000000026": "0x9efde052aa15429fae05bad4d0b1d7c64da64d03d7a1854a588c2cb8430c0d30", + "0x0000000000000000000000000000000000000000000000000000000000000027": "0xd88ddfeed400a8755596b21942c1497e114c302e6118290f91e6772976041fa1", + "0x0000000000000000000000000000000000000000000000000000000000000028": "0x87eb0ddba57e35f6d286673802a4af5975e22506c7cf4c64bb6be5ee11527f2c", + "0x0000000000000000000000000000000000000000000000000000000000000029": "0x26846476fd5fc54a5d43385167c95144f2643f533cc85bb9d16b782f8d7db193", + "0x000000000000000000000000000000000000000000000000000000000000002a": "0x506d86582d252405b840018792cad2bf1259f1ef5aa5f887e13cb2f0094f51e1", + "0x000000000000000000000000000000000000000000000000000000000000002b": "0xffff0ad7e659772f9534c195c815efc4014ef1e1daed4404c06385d11192e92b", + "0x000000000000000000000000000000000000000000000000000000000000002c": "0x6cf04127db05441cd833107a52be852868890e4317e6a02ab47683aa75964220", + "0x000000000000000000000000000000000000000000000000000000000000002d": "0xb7d05f875f140027ef5118a2247bbb84ce8f2f0f1123623085daf7960c329f5f", + "0x000000000000000000000000000000000000000000000000000000000000002e": "0xdf6af5f5bbdb6be9ef8aa618e4bf8073960867171e29676f8b284dea6a08a85e", + "0x000000000000000000000000000000000000000000000000000000000000002f": "0xb58d900f5e182e3c50ef74969ea16c7726c549757cc23523c369587da7293784", + "0x0000000000000000000000000000000000000000000000000000000000000030": "0xd49a7502ffcfb0340b1d7885688500ca308161a7f96b62df9d083b71fcc8f2bb", + "0x0000000000000000000000000000000000000000000000000000000000000031": "0x8fe6b1689256c0d385f42f5bbe2027a22c1996e110ba97c171d3e5948de92beb", + "0x0000000000000000000000000000000000000000000000000000000000000032": "0x8d0d63c39ebade8509e0ae3c9c3876fb5fa112be18f905ecacfecb92057603ab", + "0x0000000000000000000000000000000000000000000000000000000000000033": "0x95eec8b2e541cad4e91de38385f2e046619f54496c2382cb6cacd5b98c26f5a4", + "0x0000000000000000000000000000000000000000000000000000000000000034": "0xf893e908917775b62bff23294dbbe3a1cd8e6cc1c35b4801887b646a6f81f17f", + "0x0000000000000000000000000000000000000000000000000000000000000035": "0xcddba7b592e3133393c16194fac7431abf2f5485ed711db282183c819e08ebaa", + "0x0000000000000000000000000000000000000000000000000000000000000036": "0x8a8d7fe3af8caa085a7639a832001457dfb9128a8061142ad0335629ff23ff9c", + "0x0000000000000000000000000000000000000000000000000000000000000037": "0xfeb3c337d7a51a6fbf00b9e34c52e1c9195c969bd4e7a0bfd51d5c5bed9c1167", + "0x0000000000000000000000000000000000000000000000000000000000000038": "0xe71f0aa83cc32edfbefa9f4d3e0174ca85182eec9f3a09f6a6c0df6377a510d7", + "0x0000000000000000000000000000000000000000000000000000000000000039": "0x31206fa80a50bb6abe29085058f16212212a60eec8f049fecb92d8c8e0a84bc0", + "0x000000000000000000000000000000000000000000000000000000000000003a": "0x21352bfecbeddde993839f614c3dac0a3ee37543f9b412b16199dc158e23b544", + "0x000000000000000000000000000000000000000000000000000000000000003b": "0x619e312724bb6d7c3153ed9de791d764a366b389af13c58bf8a8d90481a46765", + "0x000000000000000000000000000000000000000000000000000000000000003c": "0x7cdd2986268250628d0c10e385c58c6191e6fbe05191bcc04f133f2cea72c1c4", + "0x000000000000000000000000000000000000000000000000000000000000003d": "0x848930bd7ba8cac54661072113fb278869e07bb8587f91392933374d017bcbe1", + "0x000000000000000000000000000000000000000000000000000000000000003e": "0x8869ff2c22b28cc10510d9853292803328be4fb0e80495e8bb8d271f5b889636", + "0x000000000000000000000000000000000000000000000000000000000000003f": "0xb5fe28e79f1b850f8658246ce9b6a1e7b49fc06db7143e8fe0b4f2b0c5523a5c", + "0x0000000000000000000000000000000000000000000000000000000000000040": "0x985e929f70af28d0bdd1a90a808f977f597c7c778c489e98d3bd8910d31ac0f7" + } +} diff --git a/op-chain-ops/genesis/config.go b/op-chain-ops/genesis/config.go index 43752d4bdd39..73c2840799fc 100644 --- a/op-chain-ops/genesis/config.go +++ b/op-chain-ops/genesis/config.go @@ -10,9 +10,6 @@ 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" "github.com/ethereum/go-ethereum/core/types" @@ -20,6 +17,8 @@ import ( "github.com/ethereum/go-ethereum/params" "github.com/ethereum/go-ethereum/rpc" + altda "github.com/ethereum-optimism/optimism/op-alt-da" + opparams "github.com/ethereum-optimism/optimism/op-node/params" "github.com/ethereum-optimism/optimism/op-node/rollup" "github.com/ethereum-optimism/optimism/op-service/eth" ) @@ -47,72 +46,46 @@ const ( SystemTxMaxGas = 1_000_000 ) -// DeployConfig represents the deployment configuration for an OP Stack chain. -// It is used to deploy the L1 contracts as well as create the L2 genesis state. -type DeployConfig struct { - // L1StartingBlockTag is used to fill in the storage of the L1Block info predeploy. The rollup - // config script uses this to fill the L1 genesis info for the rollup. The Output oracle deploy - // script may use it if the L2 starting timestamp is nil, assuming the L2 genesis is set up - // with this. - L1StartingBlockTag *MarshalableRPCBlockNumberOrHash `json:"l1StartingBlockTag"` - // L1ChainID is the chain ID of the L1 chain. - L1ChainID uint64 `json:"l1ChainID"` - // L2ChainID is the chain ID of the L2 chain. - L2ChainID uint64 `json:"l2ChainID"` - // L2BlockTime is the number of seconds between each L2 block. - L2BlockTime uint64 `json:"l2BlockTime"` - // FinalizationPeriodSeconds represents the number of seconds before an output is considered - // finalized. This impacts the amount of time that withdrawals take to finalize and is - // generally set to 1 week. - FinalizationPeriodSeconds uint64 `json:"finalizationPeriodSeconds"` - // MaxSequencerDrift is the number of seconds after the L1 timestamp of the end of the - // sequencing window that batches must be included, otherwise L2 blocks including - // deposits are force included. - MaxSequencerDrift uint64 `json:"maxSequencerDrift"` - // SequencerWindowSize is the number of L1 blocks per sequencing window. - SequencerWindowSize uint64 `json:"sequencerWindowSize"` - // ChannelTimeout is the number of L1 blocks that a frame stays valid when included in L1. - ChannelTimeout uint64 `json:"channelTimeout"` - // P2PSequencerAddress is the address of the key the sequencer uses to sign blocks on the P2P layer. - P2PSequencerAddress common.Address `json:"p2pSequencerAddress"` - // BatchInboxAddress is the L1 account that batches are sent to. - BatchInboxAddress common.Address `json:"batchInboxAddress"` - // BatchSenderAddress represents the initial sequencer account that authorizes batches. - // Transactions sent from this account to the batch inbox address are considered valid. - BatchSenderAddress common.Address `json:"batchSenderAddress"` - // L2OutputOracleSubmissionInterval is the number of L2 blocks between outputs that are submitted - // to the L2OutputOracle contract located on L1. - L2OutputOracleSubmissionInterval uint64 `json:"l2OutputOracleSubmissionInterval"` - // L2OutputOracleStartingTimestamp is the starting timestamp for the L2OutputOracle. - // MUST be the same as the timestamp of the L2OO start block. - L2OutputOracleStartingTimestamp int `json:"l2OutputOracleStartingTimestamp"` - // L2OutputOracleStartingBlockNumber is the starting block number for the L2OutputOracle. - // Must be greater than or equal to the first Bedrock block. The first L2 output will correspond - // to this value plus the submission interval. - L2OutputOracleStartingBlockNumber uint64 `json:"l2OutputOracleStartingBlockNumber"` - // L2OutputOracleProposer is the address of the account that proposes L2 outputs. - L2OutputOracleProposer common.Address `json:"l2OutputOracleProposer"` - // L2OutputOracleChallenger is the address of the account that challenges L2 outputs. - L2OutputOracleChallenger common.Address `json:"l2OutputOracleChallenger"` +type ConfigChecker interface { + // Check verifies the contents of a config are correct. + // Check may log warnings for non-critical configuration remarks. + Check(log log.Logger) error +} - // CliqueSignerAddress represents the signer address for the clique consensus engine. - // It is used in the multi-process devnet to sign blocks. - CliqueSignerAddress common.Address `json:"cliqueSignerAddress"` - // L1UseClique represents whether or not to use the clique consensus engine. - L1UseClique bool `json:"l1UseClique"` +func checkConfigBundle(bundle any, log log.Logger) error { + cfgValue := reflect.ValueOf(bundle) + for cfgValue.Kind() == reflect.Interface || cfgValue.Kind() == reflect.Pointer { + cfgValue = cfgValue.Elem() + } + if cfgValue.Kind() != reflect.Struct { + return fmt.Errorf("bundle type %s is not a struct", cfgValue.Type().String()) + } + for i := 0; i < cfgValue.NumField(); i++ { + field := cfgValue.Field(i) + if field.Kind() != reflect.Pointer { // to call pointer-receiver methods + field = field.Addr() + } + name := cfgValue.Type().Field(i).Name + if v, ok := field.Interface().(ConfigChecker); ok { + if err := v.Check(log.New("config", name)); err != nil { + return fmt.Errorf("config field %s failed checks: %w", name, err) + } else { + log.Debug("Checked config-field", "name", name) + } + } else { + log.Debug("Ignoring config-field", "name", name) + } + } + return nil +} - L1BlockTime uint64 `json:"l1BlockTime"` - L1GenesisBlockTimestamp hexutil.Uint64 `json:"l1GenesisBlockTimestamp"` - L1GenesisBlockNonce hexutil.Uint64 `json:"l1GenesisBlockNonce"` - L1GenesisBlockGasLimit hexutil.Uint64 `json:"l1GenesisBlockGasLimit"` - L1GenesisBlockDifficulty *hexutil.Big `json:"l1GenesisBlockDifficulty"` - L1GenesisBlockMixHash common.Hash `json:"l1GenesisBlockMixHash"` - L1GenesisBlockCoinbase common.Address `json:"l1GenesisBlockCoinbase"` - L1GenesisBlockNumber hexutil.Uint64 `json:"l1GenesisBlockNumber"` - L1GenesisBlockGasUsed hexutil.Uint64 `json:"l1GenesisBlockGasUsed"` - L1GenesisBlockParentHash common.Hash `json:"l1GenesisBlockParentHash"` - L1GenesisBlockBaseFeePerGas *hexutil.Big `json:"l1GenesisBlockBaseFeePerGas"` +type DevDeployConfig struct { + // FundDevAccounts configures whether to fund the dev accounts. + // This should only be used during devnet deployments. + FundDevAccounts bool `json:"fundDevAccounts"` +} +type L2GenesisBlockDeployConfig struct { L2GenesisBlockNonce hexutil.Uint64 `json:"l2GenesisBlockNonce"` L2GenesisBlockGasLimit hexutil.Uint64 `json:"l2GenesisBlockGasLimit"` L2GenesisBlockDifficulty *hexutil.Big `json:"l2GenesisBlockDifficulty"` @@ -121,34 +94,52 @@ type DeployConfig struct { L2GenesisBlockGasUsed hexutil.Uint64 `json:"l2GenesisBlockGasUsed"` L2GenesisBlockParentHash common.Hash `json:"l2GenesisBlockParentHash"` L2GenesisBlockBaseFeePerGas *hexutil.Big `json:"l2GenesisBlockBaseFeePerGas"` - - // L2GenesisRegolithTimeOffset is the number of seconds after genesis block that Regolith hard fork activates. - // Set it to 0 to activate at genesis. Nil to disable Regolith. - L2GenesisRegolithTimeOffset *hexutil.Uint64 `json:"l2GenesisRegolithTimeOffset,omitempty"` - // L2GenesisCanyonTimeOffset is the number of seconds after genesis block that Canyon hard fork activates. - // Set it to 0 to activate at genesis. Nil to disable Canyon. - L2GenesisCanyonTimeOffset *hexutil.Uint64 `json:"l2GenesisCanyonTimeOffset,omitempty"` - // L2GenesisDeltaTimeOffset is the number of seconds after genesis block that Delta hard fork activates. - // Set it to 0 to activate at genesis. Nil to disable Delta. - L2GenesisDeltaTimeOffset *hexutil.Uint64 `json:"l2GenesisDeltaTimeOffset,omitempty"` - // L2GenesisEcotoneTimeOffset is the number of seconds after genesis block that Ecotone hard fork activates. - // Set it to 0 to activate at genesis. Nil to disable Ecotone. - L2GenesisEcotoneTimeOffset *hexutil.Uint64 `json:"l2GenesisEcotoneTimeOffset,omitempty"` - // L2GenesisFjordTimeOffset is the number of seconds after genesis block that Fjord hard fork activates. - // Set it to 0 to activate at genesis. Nil to disable Fjord. - L2GenesisFjordTimeOffset *hexutil.Uint64 `json:"l2GenesisFjordTimeOffset,omitempty"` - // L2GenesisInteropTimeOffset is the number of seconds after genesis block that the Interop hard fork activates. - // Set it to 0 to activate at genesis. Nil to disable Interop. - L2GenesisInteropTimeOffset *hexutil.Uint64 `json:"l2GenesisInteropTimeOffset,omitempty"` // L2GenesisBlockExtraData is configurable extradata. Will default to []byte("BEDROCK") if left unspecified. L2GenesisBlockExtraData []byte `json:"l2GenesisBlockExtraData"` + // Note that there is no L2 genesis timestamp: + // This is instead configured based on the timestamp of "l1StartingBlockTag". +} + +var _ ConfigChecker = (*L2GenesisBlockDeployConfig)(nil) + +func (d *L2GenesisBlockDeployConfig) Check(log log.Logger) error { + if d.L2GenesisBlockGasLimit == 0 { + return fmt.Errorf("%w: L2 genesis block gas limit cannot be 0", ErrInvalidDeployConfig) + } + // 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(MaxResourceLimit+SystemTxMaxGas) { + return fmt.Errorf("%w: L2 genesis block gas limit is too small", ErrInvalidDeployConfig) + } + if d.L2GenesisBlockBaseFeePerGas == nil { + return fmt.Errorf("%w: L2 genesis block base fee per gas cannot be nil", ErrInvalidDeployConfig) + } + return nil +} + +// OwnershipDeployConfig defines the ownership of an L2 chain deployment. +// This excludes superchain-wide contracts. +type OwnershipDeployConfig struct { // ProxyAdminOwner represents the owner of the ProxyAdmin predeploy on L2. ProxyAdminOwner common.Address `json:"proxyAdminOwner"` // FinalSystemOwner is the owner of the system on L1. Any L1 contract that is ownable has // this account set as its owner. FinalSystemOwner common.Address `json:"finalSystemOwner"` - // SuperchainConfigGuardian represents the GUARDIAN account in the SuperchainConfig. Has the ability to pause withdrawals. - SuperchainConfigGuardian common.Address `json:"superchainConfigGuardian"` +} + +var _ ConfigChecker = (*OwnershipDeployConfig)(nil) + +func (d *OwnershipDeployConfig) Check(log log.Logger) error { + if d.FinalSystemOwner == (common.Address{}) { + return fmt.Errorf("%w: FinalSystemOwner cannot be address(0)", ErrInvalidDeployConfig) + } + if d.ProxyAdminOwner == (common.Address{}) { + return fmt.Errorf("%w: ProxyAdminOwner cannot be address(0)", ErrInvalidDeployConfig) + } + return nil +} + +type L2VaultsDeployConfig struct { // BaseFeeVaultRecipient represents the recipient of fees accumulated in the BaseFeeVault. // Can be an account on L1 or L2, depending on the BaseFeeVaultWithdrawalNetwork value. BaseFeeVaultRecipient common.Address `json:"baseFeeVaultRecipient"` @@ -170,31 +161,34 @@ type DeployConfig struct { L1FeeVaultWithdrawalNetwork WithdrawalNetwork `json:"l1FeeVaultWithdrawalNetwork"` // SequencerFeeVaultWithdrawalNetwork represents the withdrawal network for the SequencerFeeVault. SequencerFeeVaultWithdrawalNetwork WithdrawalNetwork `json:"sequencerFeeVaultWithdrawalNetwork"` - // L1StandardBridgeProxy represents the address of the L1StandardBridgeProxy on L1 and is used - // as part of building the L2 genesis state. - L1StandardBridgeProxy common.Address `json:"l1StandardBridgeProxy"` - // L1CrossDomainMessengerProxy represents the address of the L1CrossDomainMessengerProxy on L1 and is used - // as part of building the L2 genesis state. - L1CrossDomainMessengerProxy common.Address `json:"l1CrossDomainMessengerProxy"` - // L1ERC721BridgeProxy represents the address of the L1ERC721Bridge on L1 and is used - // as part of building the L2 genesis state. - L1ERC721BridgeProxy common.Address `json:"l1ERC721BridgeProxy"` - // SystemConfigProxy represents the address of the SystemConfigProxy on L1 and is used - // as part of the derivation pipeline. - SystemConfigProxy common.Address `json:"systemConfigProxy"` - // OptimismPortalProxy represents the address of the OptimismPortalProxy on L1 and is used - // 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"` +} + +var _ ConfigChecker = (*L2VaultsDeployConfig)(nil) + +func (d *L2VaultsDeployConfig) Check(log log.Logger) error { + if d.BaseFeeVaultRecipient == (common.Address{}) { + return fmt.Errorf("%w: BaseFeeVaultRecipient cannot be address(0)", ErrInvalidDeployConfig) + } + if d.L1FeeVaultRecipient == (common.Address{}) { + return fmt.Errorf("%w: L1FeeVaultRecipient cannot be address(0)", ErrInvalidDeployConfig) + } + if d.SequencerFeeVaultRecipient == (common.Address{}) { + return fmt.Errorf("%w: SequencerFeeVaultRecipient cannot be address(0)", ErrInvalidDeployConfig) + } + if !d.BaseFeeVaultWithdrawalNetwork.Valid() { + return fmt.Errorf("%w: BaseFeeVaultWithdrawalNetwork can only be 0 (L1) or 1 (L2)", ErrInvalidDeployConfig) + } + if !d.L1FeeVaultWithdrawalNetwork.Valid() { + return fmt.Errorf("%w: L1FeeVaultWithdrawalNetwork can only be 0 (L1) or 1 (L2)", ErrInvalidDeployConfig) + } + if !d.SequencerFeeVaultWithdrawalNetwork.Valid() { + return fmt.Errorf("%w: SequencerFeeVaultWithdrawalNetwork can only be 0 (L1) or 1 (L2)", ErrInvalidDeployConfig) + } + return nil +} + +// GovernanceDeployConfig is exclusive to OP-Mainnet and the testing of OP-Mainnet-like chains. +type GovernanceDeployConfig struct { // EnableGovernance configures whether or not include governance token predeploy. EnableGovernance bool `json:"enableGovernance"` // GovernanceTokenSymbol represents the ERC20 symbol of the GovernanceToken. @@ -204,309 +198,577 @@ type DeployConfig struct { // GovernanceTokenOwner represents the owner of the GovernanceToken. Has the ability // to mint and burn tokens. GovernanceTokenOwner common.Address `json:"governanceTokenOwner"` - // DeploymentWaitConfirmations is the number of confirmations to wait during - // deployment. This is DEPRECATED and should be removed in a future PR. - DeploymentWaitConfirmations int `json:"deploymentWaitConfirmations"` +} + +var _ ConfigChecker = (*GovernanceDeployConfig)(nil) + +func (d *GovernanceDeployConfig) Check(log log.Logger) error { + if d.EnableGovernance { + if d.GovernanceTokenName == "" { + return fmt.Errorf("%w: GovernanceToken.name cannot be empty", ErrInvalidDeployConfig) + } + if d.GovernanceTokenSymbol == "" { + return fmt.Errorf("%w: GovernanceToken.symbol cannot be empty", ErrInvalidDeployConfig) + } + if d.GovernanceTokenOwner == (common.Address{}) { + return fmt.Errorf("%w: GovernanceToken owner cannot be address(0)", ErrInvalidDeployConfig) + } + } + return nil +} + +func (d *GovernanceDeployConfig) GovernanceEnabled() bool { + return d.EnableGovernance +} + +// GasPriceOracleDeployConfig configures the GasPriceOracle L2 predeploy. +type GasPriceOracleDeployConfig struct { + // 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" evm:"basefeeScalar"` + // GasPriceOracleBlobBaseFeeScalar represents the value of the blob base fee scalar used for fee calculations. + GasPriceOracleBlobBaseFeeScalar uint32 `json:"gasPriceOracleBlobBaseFeeScalar" evm:"blobbasefeeScalar"` +} + +var _ ConfigChecker = (*GasPriceOracleDeployConfig)(nil) + +func (d *GasPriceOracleDeployConfig) Check(log log.Logger) error { + if d.GasPriceOracleBaseFeeScalar == 0 { + log.Warn("GasPriceOracleBaseFeeScalar is 0") + } + if d.GasPriceOracleBlobBaseFeeScalar == 0 { + log.Warn("GasPriceOracleBlobBaseFeeScalar is 0") + } + 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 *GasPriceOracleDeployConfig) 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, + }) +} + +// GasTokenDeployConfig configures the optional custom gas token functionality. +type GasTokenDeployConfig struct { + // 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"` +} + +var _ ConfigChecker = (*GasTokenDeployConfig)(nil) + +func (d *GasTokenDeployConfig) Check(log log.Logger) error { + 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) + } + return nil +} + +// OperatorDeployConfig configures the hot-key addresses for operations such as sequencing and batch-submission. +type OperatorDeployConfig struct { + // P2PSequencerAddress is the address of the key the sequencer uses to sign blocks on the P2P layer. + P2PSequencerAddress common.Address `json:"p2pSequencerAddress" evm:"p2pSequencerAddress"` + // BatchSenderAddress represents the initial sequencer account that authorizes batches. + // Transactions sent from this account to the batch inbox address are considered valid. + BatchSenderAddress common.Address `json:"batchSenderAddress"` +} + +var _ ConfigChecker = (*OperatorDeployConfig)(nil) + +func (d *OperatorDeployConfig) Check(log log.Logger) error { + if d.P2PSequencerAddress == (common.Address{}) { + return fmt.Errorf("%w: P2PSequencerAddress cannot be address(0)", ErrInvalidDeployConfig) + } + if d.BatchSenderAddress == (common.Address{}) { + return fmt.Errorf("%w: BatchSenderAddress cannot be address(0)", ErrInvalidDeployConfig) + } + return nil +} + +// EIP1559DeployConfig configures the EIP-1559 parameters of the chain. +type EIP1559DeployConfig struct { // EIP1559Elasticity is the elasticity of the EIP1559 fee market. EIP1559Elasticity uint64 `json:"eip1559Elasticity"` // EIP1559Denominator is the denominator of EIP1559 base fee market. EIP1559Denominator uint64 `json:"eip1559Denominator"` // EIP1559DenominatorCanyon is the denominator of EIP1559 base fee market when Canyon is active. EIP1559DenominatorCanyon uint64 `json:"eip1559DenominatorCanyon"` - // SystemConfigStartBlock represents the block at which the op-node should start syncing - // from. It is an override to set this value on legacy networks where it is not set by - // default. It can be removed once all networks have this value set in their storage. - SystemConfigStartBlock uint64 `json:"systemConfigStartBlock"` - // FaultGameAbsolutePrestate is the absolute prestate of Cannon. This is computed - // by generating a proof from the 0th -> 1st instruction and grabbing the prestate from - // the output JSON. All honest challengers should agree on the setup state of the program. - FaultGameAbsolutePrestate common.Hash `json:"faultGameAbsolutePrestate"` - // FaultGameMaxDepth is the maximum depth of the position tree within the fault dispute game. - // `2^{FaultGameMaxDepth}` is how many instructions the execution trace bisection game - // supports. Ideally, this should be conservatively set so that there is always enough - // room for a full Cannon trace. - FaultGameMaxDepth uint64 `json:"faultGameMaxDepth"` - // 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. - FaultGameGenesisOutputRoot common.Hash `json:"faultGameGenesisOutputRoot"` - // FaultGameSplitDepth is the depth at which the fault dispute game splits from output roots to execution trace claims. - FaultGameSplitDepth uint64 `json:"faultGameSplitDepth"` - // FaultGameWithdrawalDelay is the number of seconds that users must wait before withdrawing ETH from a fault game. - FaultGameWithdrawalDelay uint64 `json:"faultGameWithdrawalDelay"` - // PreimageOracleMinProposalSize is the minimum number of bytes that a large preimage oracle proposal can be. - PreimageOracleMinProposalSize uint64 `json:"preimageOracleMinProposalSize"` - // PreimageOracleChallengePeriod is the number of seconds that challengers have to challenge a large preimage proposal. - PreimageOracleChallengePeriod uint64 `json:"preimageOracleChallengePeriod"` - // FundDevAccounts configures whether or not to fund the dev accounts. Should only be used - // during devnet deployments. - FundDevAccounts bool `json:"fundDevAccounts"` - // RequiredProtocolVersion indicates the protocol version that - // nodes are required to adopt, to stay in sync with the network. - RequiredProtocolVersion params.ProtocolVersion `json:"requiredProtocolVersion"` - // RequiredProtocolVersion indicates the protocol version that - // nodes are recommended to adopt, to stay in sync with the network. - RecommendedProtocolVersion params.ProtocolVersion `json:"recommendedProtocolVersion"` - // ProofMaturityDelaySeconds is the number of seconds that a proof must be - // mature before it can be used to finalize a withdrawal. - ProofMaturityDelaySeconds uint64 `json:"proofMaturityDelaySeconds"` - // DisputeGameFinalityDelaySeconds is an additional number of seconds a - // dispute game must wait before it can be used to finalize a withdrawal. - DisputeGameFinalityDelaySeconds uint64 `json:"disputeGameFinalityDelaySeconds"` - // RespectedGameType is the dispute game type that the OptimismPortal - // contract will respect for finalizing withdrawals. - RespectedGameType uint32 `json:"respectedGameType"` - // 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"` - // 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. - DAResolveWindow uint64 `json:"daResolveWindow"` - // DABondSize represents the required bond size to initiate a data availability challenge. - DABondSize uint64 `json:"daBondSize"` - // DAResolverRefundPercentage represents the percentage of the resolving cost to be refunded to the resolver - // such as 100 means 100% refund. - DAResolverRefundPercentage uint64 `json:"daResolverRefundPercentage"` +} - // DAChallengeProxy represents the L1 address of the DataAvailabilityChallenge contract. - DAChallengeProxy common.Address `json:"daChallengeProxy"` +var _ ConfigChecker = (*EIP1559DeployConfig)(nil) + +func (d *EIP1559DeployConfig) Check(log log.Logger) error { + if d.EIP1559Denominator == 0 { + return fmt.Errorf("%w: EIP1559Denominator cannot be 0", ErrInvalidDeployConfig) + } + if d.EIP1559Elasticity == 0 { + return fmt.Errorf("%w: EIP1559Elasticity cannot be 0", ErrInvalidDeployConfig) + } + return nil +} + +// UpgradeScheduleDeployConfig configures when network upgrades activate. +type UpgradeScheduleDeployConfig struct { + // L2GenesisRegolithTimeOffset is the number of seconds after genesis block that Regolith hard fork activates. + // Set it to 0 to activate at genesis. Nil to disable Regolith. + L2GenesisRegolithTimeOffset *hexutil.Uint64 `json:"l2GenesisRegolithTimeOffset,omitempty"` + // L2GenesisCanyonTimeOffset is the number of seconds after genesis block that Canyon hard fork activates. + // Set it to 0 to activate at genesis. Nil to disable Canyon. + L2GenesisCanyonTimeOffset *hexutil.Uint64 `json:"l2GenesisCanyonTimeOffset,omitempty"` + // L2GenesisDeltaTimeOffset is the number of seconds after genesis block that Delta hard fork activates. + // Set it to 0 to activate at genesis. Nil to disable Delta. + L2GenesisDeltaTimeOffset *hexutil.Uint64 `json:"l2GenesisDeltaTimeOffset,omitempty"` + // L2GenesisEcotoneTimeOffset is the number of seconds after genesis block that Ecotone hard fork activates. + // Set it to 0 to activate at genesis. Nil to disable Ecotone. + L2GenesisEcotoneTimeOffset *hexutil.Uint64 `json:"l2GenesisEcotoneTimeOffset,omitempty"` + // L2GenesisFjordTimeOffset is the number of seconds after genesis block that Fjord hard fork activates. + // Set it to 0 to activate at genesis. Nil to disable Fjord. + L2GenesisFjordTimeOffset *hexutil.Uint64 `json:"l2GenesisFjordTimeOffset,omitempty"` + // L2GenesisGraniteTimeOffset is the number of seconds after genesis block that Granite hard fork activates. + // Set it to 0 to activate at genesis. Nil to disable Granite. + L2GenesisGraniteTimeOffset *hexutil.Uint64 `json:"l2GenesisGraniteTimeOffset,omitempty"` + // L2GenesisInteropTimeOffset is the number of seconds after genesis block that the Interop hard fork activates. + // Set it to 0 to activate at genesis. Nil to disable Interop. + L2GenesisInteropTimeOffset *hexutil.Uint64 `json:"l2GenesisInteropTimeOffset,omitempty"` // 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"` + // L2GenesisBlobTimeOffset is the number of seconds after genesis block that the L2Blob hard fork activates. // Set it to 0 to activate at genesis. Nil to disable L2Blob. L2GenesisBlobTimeOffset *hexutil.Uint64 `json:"l2GenesisBlobTimeOffset,omitempty"` +} - // UseSoulGasToken is a flag that indicates if the system is using SoulGasToken - UseSoulGasToken bool `json:"useSoulGasToken"` - // IsSoulBackedByNative is a flag that indicates if the SoulGasToken is backed by native. - // Only effective when UseSoulGasToken is true. - IsSoulBackedByNative bool `json:"isSoulBackedByNative"` +var _ ConfigChecker = (*UpgradeScheduleDeployConfig)(nil) + +func offsetToUpgradeTime(offset *hexutil.Uint64, genesisTime uint64) *uint64 { + if offset == nil { + return nil + } + v := uint64(0) + if offset := *offset; offset > 0 { + v = genesisTime + uint64(offset) + } + return &v } -// Copy will deeply copy the DeployConfig. This does a JSON roundtrip to copy -// which makes it easier to maintain, we do not need efficiency in this case. -func (d *DeployConfig) Copy() *DeployConfig { - raw, err := json.Marshal(d) - if err != nil { - panic(err) +func (d *UpgradeScheduleDeployConfig) RegolithTime(genesisTime uint64) *uint64 { + return offsetToUpgradeTime(d.L2GenesisRegolithTimeOffset, genesisTime) +} + +func (d *UpgradeScheduleDeployConfig) CanyonTime(genesisTime uint64) *uint64 { + return offsetToUpgradeTime(d.L2GenesisCanyonTimeOffset, genesisTime) +} + +func (d *UpgradeScheduleDeployConfig) DeltaTime(genesisTime uint64) *uint64 { + return offsetToUpgradeTime(d.L2GenesisDeltaTimeOffset, genesisTime) +} + +func (d *UpgradeScheduleDeployConfig) EcotoneTime(genesisTime uint64) *uint64 { + return offsetToUpgradeTime(d.L2GenesisEcotoneTimeOffset, genesisTime) +} + +func (d *UpgradeScheduleDeployConfig) FjordTime(genesisTime uint64) *uint64 { + return offsetToUpgradeTime(d.L2GenesisFjordTimeOffset, genesisTime) +} + +func (d *UpgradeScheduleDeployConfig) GraniteTime(genesisTime uint64) *uint64 { + return offsetToUpgradeTime(d.L2GenesisGraniteTimeOffset, genesisTime) +} + +func (d *UpgradeScheduleDeployConfig) InteropTime(genesisTime uint64) *uint64 { + return offsetToUpgradeTime(d.L2GenesisInteropTimeOffset, genesisTime) +} + +func (d *UpgradeScheduleDeployConfig) L2BlobTime(genesisTime uint64) *uint64 { + if d.L2GenesisBlobTimeOffset == nil { + return nil + } + v := uint64(0) + if offset := *d.L2GenesisBlobTimeOffset; offset > 0 { + v = genesisTime + uint64(offset) } + return &v +} - cpy := DeployConfig{} - if err = json.Unmarshal(raw, &cpy); err != nil { - panic(err) +func (d *UpgradeScheduleDeployConfig) AllocMode(genesisTime uint64) L2AllocsMode { + + forks := d.forks() + for i := len(forks) - 1; i >= 0; i-- { + if forkTime := offsetToUpgradeTime(forks[i].L2GenesisTimeOffset, genesisTime); forkTime != nil && *forkTime == 0 { + return L2AllocsMode(forks[i].Name) + } + // the oldest L2AllocsMode is delta + if forks[i].Name == string(L2AllocsDelta) { + return L2AllocsDelta + } } - return &cpy + panic("should never reach here") } -// Check will ensure that the config is sane and return an error when it is not -func (d *DeployConfig) Check() error { - if d.L1StartingBlockTag == nil { - return fmt.Errorf("%w: L1StartingBlockTag cannot be nil", ErrInvalidDeployConfig) +type Fork struct { + L2GenesisTimeOffset *hexutil.Uint64 + Name string +} + +func (d *UpgradeScheduleDeployConfig) forks() []Fork { + return []Fork{ + {L2GenesisTimeOffset: d.L2GenesisRegolithTimeOffset, Name: "regolith"}, + {L2GenesisTimeOffset: d.L2GenesisCanyonTimeOffset, Name: "canyon"}, + {L2GenesisTimeOffset: d.L2GenesisDeltaTimeOffset, Name: string(L2AllocsDelta)}, + {L2GenesisTimeOffset: d.L2GenesisEcotoneTimeOffset, Name: string(L2AllocsEcotone)}, + {L2GenesisTimeOffset: d.L2GenesisFjordTimeOffset, Name: string(L2AllocsFjord)}, + {L2GenesisTimeOffset: d.L2GenesisGraniteTimeOffset, Name: string(L2AllocsGranite)}, + } +} + +func (d *UpgradeScheduleDeployConfig) Check(log log.Logger) error { + // 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 { + return nil + } + if a == nil && b != nil { + return fmt.Errorf("fork %s set (to %d), but prior fork %s missing", bName, *b, aName) + } + if a != nil && b == nil { + return nil + } + if *a > *b { + return fmt.Errorf("fork %s set to %d, but prior fork %s has higher offset %d", bName, *b, aName, *a) + } + return nil + } + forks := d.forks() + for i := 0; i < len(forks)-1; i++ { + if err := checkFork(forks[i].L2GenesisTimeOffset, forks[i+1].L2GenesisTimeOffset, forks[i].Name, forks[i+1].Name); err != nil { + return err + } } + return nil +} + +// L2CoreDeployConfig configures the core protocol parameters of the chain. +type L2CoreDeployConfig struct { + // L1ChainID is the chain ID of the L1 chain. + L1ChainID uint64 `json:"l1ChainID"` + + // L2ChainID is the chain ID of the L2 chain. + L2ChainID uint64 `json:"l2ChainID"` + + // L2BlockTime is the number of seconds between each L2 block. + L2BlockTime uint64 `json:"l2BlockTime"` + // FinalizationPeriodSeconds represents the number of seconds before an output is considered + // finalized. This impacts the amount of time that withdrawals take to finalize and is + // generally set to 1 week. + FinalizationPeriodSeconds uint64 `json:"finalizationPeriodSeconds"` + // MaxSequencerDrift is the number of seconds after the L1 timestamp of the end of the + // sequencing window that batches must be included, otherwise L2 blocks including + // deposits are force included. + MaxSequencerDrift uint64 `json:"maxSequencerDrift"` + // SequencerWindowSize is the number of L1 blocks per sequencing window. + SequencerWindowSize uint64 `json:"sequencerWindowSize"` + // ChannelTimeoutBedrock is the number of L1 blocks that a frame stays valid when included in L1. + ChannelTimeoutBedrock uint64 `json:"channelTimeout"` + // BatchInboxAddress is the L1 account that batches are sent to. + BatchInboxAddress common.Address `json:"batchInboxAddress"` + + // SystemConfigStartBlock represents the block at which the op-node should start syncing + // from. It is an override to set this value on legacy networks where it is not set by + // default. It can be removed once all networks have this value set in their storage. + SystemConfigStartBlock uint64 `json:"systemConfigStartBlock"` +} + +var _ ConfigChecker = (*L2CoreDeployConfig)(nil) + +func (d *L2CoreDeployConfig) Check(log log.Logger) error { if d.L1ChainID == 0 { return fmt.Errorf("%w: L1ChainID cannot be 0", ErrInvalidDeployConfig) } if d.L2ChainID == 0 { return fmt.Errorf("%w: L2ChainID cannot be 0", ErrInvalidDeployConfig) } - if d.L2BlockTime == 0 { - return fmt.Errorf("%w: L2BlockTime cannot be 0", ErrInvalidDeployConfig) - } - if d.FinalizationPeriodSeconds == 0 { - return fmt.Errorf("%w: FinalizationPeriodSeconds cannot be 0", ErrInvalidDeployConfig) - } - if d.L2OutputOracleStartingBlockNumber == 0 { - log.Warn("L2OutputOracleStartingBlockNumber is 0, should only be 0 for fresh chains") - } - if d.SuperchainConfigGuardian == (common.Address{}) { - return fmt.Errorf("%w: SuperchainConfigGuardian cannot be address(0)", ErrInvalidDeployConfig) - } if d.MaxSequencerDrift == 0 { return fmt.Errorf("%w: MaxSequencerDrift cannot be 0", ErrInvalidDeployConfig) } if d.SequencerWindowSize == 0 { return fmt.Errorf("%w: SequencerWindowSize cannot be 0", ErrInvalidDeployConfig) } - if d.ChannelTimeout == 0 { + if d.ChannelTimeoutBedrock == 0 { return fmt.Errorf("%w: ChannelTimeout cannot be 0", ErrInvalidDeployConfig) } - if d.P2PSequencerAddress == (common.Address{}) { - return fmt.Errorf("%w: P2PSequencerAddress cannot be address(0)", ErrInvalidDeployConfig) - } if d.BatchInboxAddress == (common.Address{}) { return fmt.Errorf("%w: BatchInboxAddress cannot be address(0)", ErrInvalidDeployConfig) } - if d.BatchSenderAddress == (common.Address{}) { - return fmt.Errorf("%w: BatchSenderAddress cannot be address(0)", ErrInvalidDeployConfig) - } - if d.L2OutputOracleSubmissionInterval == 0 { - return fmt.Errorf("%w: L2OutputOracleSubmissionInterval cannot be 0", ErrInvalidDeployConfig) - } - if d.L2OutputOracleStartingTimestamp == 0 { - log.Warn("L2OutputOracleStartingTimestamp is 0") - } - if d.L2OutputOracleProposer == (common.Address{}) { - return fmt.Errorf("%w: L2OutputOracleProposer cannot be address(0)", ErrInvalidDeployConfig) - } - if d.L2OutputOracleChallenger == (common.Address{}) { - return fmt.Errorf("%w: L2OutputOracleChallenger cannot be address(0)", ErrInvalidDeployConfig) - } - if d.FinalSystemOwner == (common.Address{}) { - return fmt.Errorf("%w: FinalSystemOwner cannot be address(0)", ErrInvalidDeployConfig) - } - if d.ProxyAdminOwner == (common.Address{}) { - return fmt.Errorf("%w: ProxyAdminOwner cannot be address(0)", ErrInvalidDeployConfig) - } - if d.BaseFeeVaultRecipient == (common.Address{}) { - return fmt.Errorf("%w: BaseFeeVaultRecipient cannot be address(0)", ErrInvalidDeployConfig) - } - if d.L1FeeVaultRecipient == (common.Address{}) { - return fmt.Errorf("%w: L1FeeVaultRecipient cannot be address(0)", ErrInvalidDeployConfig) - } - if d.SequencerFeeVaultRecipient == (common.Address{}) { - return fmt.Errorf("%w: SequencerFeeVaultRecipient cannot be address(0)", ErrInvalidDeployConfig) - } - if !d.BaseFeeVaultWithdrawalNetwork.Valid() { - return fmt.Errorf("%w: BaseFeeVaultWithdrawalNetwork can only be 0 (L1) or 1 (L2)", ErrInvalidDeployConfig) - } - if !d.L1FeeVaultWithdrawalNetwork.Valid() { - return fmt.Errorf("%w: L1FeeVaultWithdrawalNetwork can only be 0 (L1) or 1 (L2)", ErrInvalidDeployConfig) - } - if !d.SequencerFeeVaultWithdrawalNetwork.Valid() { - return fmt.Errorf("%w: SequencerFeeVaultWithdrawalNetwork can only be 0 (L1) or 1 (L2)", ErrInvalidDeployConfig) - } - if d.GasPriceOracleBaseFeeScalar == 0 { - log.Warn("GasPriceOracleBaseFeeScalar is 0") - } - if d.GasPriceOracleBlobBaseFeeScalar == 0 { - log.Warn("GasPriceOracleBlobBaseFeeScalar is 0") + if d.L2BlockTime == 0 { + return fmt.Errorf("%w: L2BlockTime cannot be 0", ErrInvalidDeployConfig) } - if d.EIP1559Denominator == 0 { - return fmt.Errorf("%w: EIP1559Denominator cannot be 0", ErrInvalidDeployConfig) + if d.FinalizationPeriodSeconds == 0 { + return fmt.Errorf("%w: FinalizationPeriodSeconds cannot be 0", ErrInvalidDeployConfig) } - if d.L2GenesisCanyonTimeOffset != nil && d.EIP1559DenominatorCanyon == 0 { - return fmt.Errorf("%w: EIP1559DenominatorCanyon cannot be 0 if Canyon is activated", ErrInvalidDeployConfig) + return nil +} + +// AltDADeployConfig configures optional AltDA functionality. +type AltDADeployConfig struct { + // UseAltDA is a flag that indicates if the system is using op-alt-da + UseAltDA bool `json:"useAltDA"` + // 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. + DAResolveWindow uint64 `json:"daResolveWindow"` + // DABondSize represents the required bond size to initiate a data availability challenge. + DABondSize uint64 `json:"daBondSize"` + // DAResolverRefundPercentage represents the percentage of the resolving cost to be refunded to the resolver + // such as 100 means 100% refund. + DAResolverRefundPercentage uint64 `json:"daResolverRefundPercentage"` +} + +var _ ConfigChecker = (*AltDADeployConfig)(nil) + +func (d *AltDADeployConfig) Check(log log.Logger) error { + if d.UseAltDA { + if !(d.DACommitmentType == altda.KeccakCommitmentString || d.DACommitmentType == altda.GenericCommitmentString) { + return fmt.Errorf("%w: DACommitmentType must be either KeccakCommitment or GenericCommitment", ErrInvalidDeployConfig) + } + // only enforce challenge and resolve window if using alt-da mode with Keccak Commitments + if d.DACommitmentType != altda.GenericCommitmentString { + if d.DAChallengeWindow == 0 { + return fmt.Errorf("%w: DAChallengeWindow cannot be 0 when using alt-da mode with Keccak Commitments", ErrInvalidDeployConfig) + } + if d.DAResolveWindow == 0 { + return fmt.Errorf("%w: DAResolveWindow cannot be 0 when using alt-da mode with Keccak Commitments", ErrInvalidDeployConfig) + } + } } - if d.EIP1559Elasticity == 0 { - return fmt.Errorf("%w: EIP1559Elasticity cannot be 0", ErrInvalidDeployConfig) + return nil +} + +// L2InitializationConfig represents all L2 configuration +// data that can be configured before the deployment of any L1 contracts. +type L2InitializationConfig struct { + DevDeployConfig + L2GenesisBlockDeployConfig + OwnershipDeployConfig + L2VaultsDeployConfig + GovernanceDeployConfig + GasPriceOracleDeployConfig + GasTokenDeployConfig + OperatorDeployConfig + EIP1559DeployConfig + UpgradeScheduleDeployConfig + L2CoreDeployConfig + AltDADeployConfig + SoulGasTokenConfig +} + +func (d *L2InitializationConfig) Check(log log.Logger) error { + if err := checkConfigBundle(d, log); err != nil { + return err } - if d.L2GenesisBlockGasLimit == 0 { - return fmt.Errorf("%w: L2 genesis block gas limit cannot be 0", ErrInvalidDeployConfig) + return nil +} + +// DevL1DeployConfig is used to configure a L1 chain for development/testing purposes. +// A production L2 deployment does not utilize this configuration, +// except of a L1BlockTime sanity-check (set this to 12 for L1 Ethereum). +type DevL1DeployConfig struct { + L1BlockTime uint64 `json:"l1BlockTime"` + L1GenesisBlockTimestamp hexutil.Uint64 `json:"l1GenesisBlockTimestamp"` + L1GenesisBlockNonce hexutil.Uint64 `json:"l1GenesisBlockNonce"` + L1GenesisBlockGasLimit hexutil.Uint64 `json:"l1GenesisBlockGasLimit"` + L1GenesisBlockDifficulty *hexutil.Big `json:"l1GenesisBlockDifficulty"` + L1GenesisBlockMixHash common.Hash `json:"l1GenesisBlockMixHash"` + L1GenesisBlockCoinbase common.Address `json:"l1GenesisBlockCoinbase"` + L1GenesisBlockNumber hexutil.Uint64 `json:"l1GenesisBlockNumber"` + L1GenesisBlockGasUsed hexutil.Uint64 `json:"l1GenesisBlockGasUsed"` + L1GenesisBlockParentHash common.Hash `json:"l1GenesisBlockParentHash"` + L1GenesisBlockBaseFeePerGas *hexutil.Big `json:"l1GenesisBlockBaseFeePerGas"` + L1GenesisBlockExcessBlobGas *hexutil.Uint64 `json:"l1GenesisBlockExcessBlobGas,omitempty"` // EIP-4844 + L1GenesisBlockBlobGasUsed *hexutil.Uint64 `json:"l1GenesisBlockblobGasUsed,omitempty"` // EIP-4844 +} + +// SuperchainL1DeployConfig configures parameters of the superchain-wide deployed contracts to L1. +// This deployment is global, and can be reused between L2s that target the same superchain. +type SuperchainL1DeployConfig struct { + // RequiredProtocolVersion indicates the protocol version that + // nodes are required to adopt, to stay in sync with the network. + RequiredProtocolVersion params.ProtocolVersion `json:"requiredProtocolVersion"` + // RequiredProtocolVersion indicates the protocol version that + // nodes are recommended to adopt, to stay in sync with the network. + RecommendedProtocolVersion params.ProtocolVersion `json:"recommendedProtocolVersion"` + + // SuperchainConfigGuardian represents the GUARDIAN account in the SuperchainConfig. Has the ability to pause withdrawals. + SuperchainConfigGuardian common.Address `json:"superchainConfigGuardian"` +} + +func (d *SuperchainL1DeployConfig) Check(log log.Logger) error { + if d.RequiredProtocolVersion == (params.ProtocolVersion{}) { + log.Warn("RequiredProtocolVersion is empty") } - // 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(MaxResourceLimit+SystemTxMaxGas) { - return fmt.Errorf("%w: L2 genesis block gas limit is too small", ErrInvalidDeployConfig) + if d.RecommendedProtocolVersion == (params.ProtocolVersion{}) { + log.Warn("RecommendedProtocolVersion is empty") } - if d.L2GenesisBlockBaseFeePerGas == nil { - return fmt.Errorf("%w: L2 genesis block base fee per gas cannot be nil", ErrInvalidDeployConfig) + if d.SuperchainConfigGuardian == (common.Address{}) { + return fmt.Errorf("%w: SuperchainConfigGuardian cannot be address(0)", ErrInvalidDeployConfig) } - if d.EnableGovernance { - if d.GovernanceTokenName == "" { - return fmt.Errorf("%w: GovernanceToken.name cannot be empty", ErrInvalidDeployConfig) - } - if d.GovernanceTokenSymbol == "" { - return fmt.Errorf("%w: GovernanceToken.symbol cannot be empty", ErrInvalidDeployConfig) - } - if d.GovernanceTokenOwner == (common.Address{}) { - return fmt.Errorf("%w: GovernanceToken owner cannot be address(0)", ErrInvalidDeployConfig) - } + return nil +} + +// OutputOracleDeployConfig configures the legacy OutputOracle deployment to L1. +// This is obsoleted with Fault Proofs. See FaultProofDeployConfig. +type OutputOracleDeployConfig struct { + // L2OutputOracleSubmissionInterval is the number of L2 blocks between outputs that are submitted + // to the L2OutputOracle contract located on L1. + L2OutputOracleSubmissionInterval uint64 `json:"l2OutputOracleSubmissionInterval"` + // L2OutputOracleStartingTimestamp is the starting timestamp for the L2OutputOracle. + // MUST be the same as the timestamp of the L2OO start block. + L2OutputOracleStartingTimestamp int64 `json:"l2OutputOracleStartingTimestamp"` + // L2OutputOracleStartingBlockNumber is the starting block number for the L2OutputOracle. + // Must be greater than or equal to the first Bedrock block. The first L2 output will correspond + // to this value plus the submission interval. + L2OutputOracleStartingBlockNumber uint64 `json:"l2OutputOracleStartingBlockNumber"` + // L2OutputOracleProposer is the address of the account that proposes L2 outputs. + L2OutputOracleProposer common.Address `json:"l2OutputOracleProposer"` + // L2OutputOracleChallenger is the address of the account that challenges L2 outputs. + L2OutputOracleChallenger common.Address `json:"l2OutputOracleChallenger"` +} + +func (d *OutputOracleDeployConfig) Check(log log.Logger) error { + if d.L2OutputOracleSubmissionInterval == 0 { + return fmt.Errorf("%w: L2OutputOracleSubmissionInterval cannot be 0", ErrInvalidDeployConfig) } - // L2 block time must always be smaller than L1 block time - if d.L1BlockTime < d.L2BlockTime { - return fmt.Errorf("L2 block time (%d) is larger than L1 block time (%d)", d.L2BlockTime, d.L1BlockTime) + if d.L2OutputOracleStartingTimestamp == 0 { + log.Warn("L2OutputOracleStartingTimestamp is 0") } - if d.RequiredProtocolVersion == (params.ProtocolVersion{}) { - log.Warn("RequiredProtocolVersion is empty") + if d.L2OutputOracleProposer == (common.Address{}) { + return fmt.Errorf("%w: L2OutputOracleProposer cannot be address(0)", ErrInvalidDeployConfig) } - if d.RecommendedProtocolVersion == (params.ProtocolVersion{}) { - log.Warn("RecommendedProtocolVersion is empty") + if d.L2OutputOracleChallenger == (common.Address{}) { + return fmt.Errorf("%w: L2OutputOracleChallenger cannot be address(0)", ErrInvalidDeployConfig) + } + if d.L2OutputOracleStartingBlockNumber == 0 { + log.Warn("L2OutputOracleStartingBlockNumber is 0, should only be 0 for fresh chains") } + return nil +} + +// FaultProofDeployConfig configures the fault-proof deployment to L1. +type FaultProofDeployConfig 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"` + // FaultGameAbsolutePrestate is the absolute prestate of Cannon. This is computed + // by generating a proof from the 0th -> 1st instruction and grabbing the prestate from + // the output JSON. All honest challengers should agree on the setup state of the program. + FaultGameAbsolutePrestate common.Hash `json:"faultGameAbsolutePrestate"` + // FaultGameMaxDepth is the maximum depth of the position tree within the fault dispute game. + // `2^{FaultGameMaxDepth}` is how many instructions the execution trace bisection game + // supports. Ideally, this should be conservatively set so that there is always enough + // room for a full Cannon trace. + FaultGameMaxDepth uint64 `json:"faultGameMaxDepth"` + // 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. + FaultGameGenesisOutputRoot common.Hash `json:"faultGameGenesisOutputRoot"` + // FaultGameSplitDepth is the depth at which the fault dispute game splits from output roots to execution trace claims. + FaultGameSplitDepth uint64 `json:"faultGameSplitDepth"` + // FaultGameWithdrawalDelay is the number of seconds that users must wait before withdrawing ETH from a fault game. + FaultGameWithdrawalDelay uint64 `json:"faultGameWithdrawalDelay"` + // PreimageOracleMinProposalSize is the minimum number of bytes that a large preimage oracle proposal can be. + PreimageOracleMinProposalSize uint64 `json:"preimageOracleMinProposalSize"` + // PreimageOracleChallengePeriod is the number of seconds that challengers have to challenge a large preimage proposal. + PreimageOracleChallengePeriod uint64 `json:"preimageOracleChallengePeriod"` + // ProofMaturityDelaySeconds is the number of seconds that a proof must be + // mature before it can be used to finalize a withdrawal. + ProofMaturityDelaySeconds uint64 `json:"proofMaturityDelaySeconds"` + // DisputeGameFinalityDelaySeconds is an additional number of seconds a + // dispute game must wait before it can be used to finalize a withdrawal. + DisputeGameFinalityDelaySeconds uint64 `json:"disputeGameFinalityDelaySeconds"` + // RespectedGameType is the dispute game type that the OptimismPortal + // contract will respect for finalizing withdrawals. + RespectedGameType uint32 `json:"respectedGameType"` +} + +func (d *FaultProofDeployConfig) Check(log log.Logger) error { if d.ProofMaturityDelaySeconds == 0 { log.Warn("ProofMaturityDelaySeconds is 0") } if d.DisputeGameFinalityDelaySeconds == 0 { log.Warn("DisputeGameFinalityDelaySeconds is 0") } - if d.UsePlasma { - if d.DAChallengeWindow == 0 { - return fmt.Errorf("%w: DAChallengeWindow cannot be 0 when using plasma mode", ErrInvalidDeployConfig) - } - if d.DAResolveWindow == 0 { - return fmt.Errorf("%w: DAResolveWindow cannot be 0 when using plasma mode", 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 { - return nil - } - if a == nil && b != nil { - return fmt.Errorf("fork %s set (to %d), but prior fork %s missing", bName, *b, aName) - } - if a != nil && b == nil { - return nil - } - if *a > *b { - return fmt.Errorf("fork %s set to %d, but prior fork %s has higher offset %d", bName, *b, aName, *a) - } - return nil - } - if err := checkFork(d.L2GenesisRegolithTimeOffset, d.L2GenesisCanyonTimeOffset, "regolith", "canyon"); err != nil { - return err - } - if err := checkFork(d.L2GenesisCanyonTimeOffset, d.L2GenesisDeltaTimeOffset, "canyon", "delta"); err != nil { - return err - } - if err := checkFork(d.L2GenesisDeltaTimeOffset, d.L2GenesisEcotoneTimeOffset, "delta", "ecotone"); err != nil { - return err - } - if err := checkFork(d.L2GenesisEcotoneTimeOffset, d.L2GenesisFjordTimeOffset, "ecotone", "fjord"); err != nil { - return err - } 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, - }) +// L1DependenciesConfig is the set of addresses that affect the L2 genesis construction, +// and is dependent on prior deployment of contracts to L1. This is generally not configured in deploy-config JSON, +// but rather merged in through a L1 deployments JSON file. +type L1DependenciesConfig struct { + // L1StandardBridgeProxy represents the address of the L1StandardBridgeProxy on L1 and is used + // as part of building the L2 genesis state. + L1StandardBridgeProxy common.Address `json:"l1StandardBridgeProxy"` + // L1CrossDomainMessengerProxy represents the address of the L1CrossDomainMessengerProxy on L1 and is used + // as part of building the L2 genesis state. + L1CrossDomainMessengerProxy common.Address `json:"l1CrossDomainMessengerProxy"` + // L1ERC721BridgeProxy represents the address of the L1ERC721Bridge on L1 and is used + // as part of building the L2 genesis state. + L1ERC721BridgeProxy common.Address `json:"l1ERC721BridgeProxy"` + // SystemConfigProxy represents the address of the SystemConfigProxy on L1 and is used + // as part of the derivation pipeline. + SystemConfigProxy common.Address `json:"systemConfigProxy"` + // OptimismPortalProxy represents the address of the OptimismPortalProxy on L1 and is used + // as part of the derivation pipeline. + OptimismPortalProxy common.Address `json:"optimismPortalProxy"` + + // DAChallengeProxy represents the L1 address of the DataAvailabilityChallenge contract. + DAChallengeProxy common.Address `json:"daChallengeProxy"` + + ProtocolVersionsProxy common.Address `json:"protocolVersionsProxy"` } -// 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 -// circular dependency that should be resolved in the future. -func (d *DeployConfig) CheckAddresses() error { +// SoulGasTokenConfig configures the SoulGasToken deployment to L2. +type SoulGasTokenConfig struct { + // UseSoulGasToken is a flag that indicates if the system is using SoulGasToken + UseSoulGasToken bool `json:"useSoulGasToken"` + // IsSoulBackedByNative is a flag that indicates if the SoulGasToken is backed by native. + // Only effective when UseSoulGasToken is true. + IsSoulBackedByNative bool `json:"isSoulBackedByNative"` +} + +// DependencyContext is the contextual configuration needed to verify the L1 dependencies, +// used by DeployConfig.CheckAddresses. +type DependencyContext struct { + UseAltDA bool + DACommitmentType string +} + +func (d *L1DependenciesConfig) CheckAddresses(dependencyContext DependencyContext) error { if d.L1StandardBridgeProxy == (common.Address{}) { return fmt.Errorf("%w: L1StandardBridgeProxy cannot be address(0)", ErrInvalidDeployConfig) } @@ -522,139 +784,163 @@ func (d *DeployConfig) CheckAddresses() error { if d.OptimismPortalProxy == (common.Address{}) { return fmt.Errorf("%w: OptimismPortalProxy cannot be address(0)", ErrInvalidDeployConfig) } - if d.UsePlasma && d.DAChallengeProxy == (common.Address{}) { - return fmt.Errorf("%w: DAChallengeContract cannot be address(0) when using plasma mode", ErrInvalidDeployConfig) + if dependencyContext.UseAltDA && dependencyContext.DACommitmentType == altda.KeccakCommitmentString && d.DAChallengeProxy == (common.Address{}) { + return fmt.Errorf("%w: DAChallengeContract cannot be address(0) when using alt-da mode", ErrInvalidDeployConfig) + } else if dependencyContext.UseAltDA && dependencyContext.DACommitmentType == altda.GenericCommitmentString && d.DAChallengeProxy != (common.Address{}) { + return fmt.Errorf("%w: DAChallengeContract must be address(0) when using generic commitments in alt-da mode", ErrInvalidDeployConfig) } return nil } -// SetDeployments will merge a Deployments into a DeployConfig. -func (d *DeployConfig) SetDeployments(deployments *L1Deployments) { - d.L1StandardBridgeProxy = deployments.L1StandardBridgeProxy - d.L1CrossDomainMessengerProxy = deployments.L1CrossDomainMessengerProxy - d.L1ERC721BridgeProxy = deployments.L1ERC721BridgeProxy - d.SystemConfigProxy = deployments.SystemConfigProxy - d.OptimismPortalProxy = deployments.OptimismPortalProxy - d.DAChallengeProxy = deployments.DataAvailabilityChallengeProxy -} +// LegacyDeployConfig retains legacy DeployConfig attributes. +// The genesis generation may log warnings, do a best-effort support attempt, +// or ignore these attributes completely. +type LegacyDeployConfig struct { + // CliqueSignerAddress represents the signer address for the clique consensus engine. + // It is used in the multi-process devnet to sign blocks. + CliqueSignerAddress common.Address `json:"cliqueSignerAddress"` + // L1UseClique represents whether or not to use the clique consensus engine. + L1UseClique bool `json:"l1UseClique"` -func (d *DeployConfig) GovernanceEnabled() bool { - return d.EnableGovernance + // DeploymentWaitConfirmations is the number of confirmations to wait during + // deployment. This is DEPRECATED and should be removed in a future PR. + DeploymentWaitConfirmations int `json:"deploymentWaitConfirmations"` + + UnusedChannelTimeoutGranite uint64 `json:"channelTimeoutGranite,omitempty"` } -func (d *DeployConfig) RegolithTime(genesisTime uint64) *uint64 { - if d.L2GenesisRegolithTimeOffset == nil { - return nil - } - v := uint64(0) - if offset := *d.L2GenesisRegolithTimeOffset; offset > 0 { - v = genesisTime + uint64(offset) +var _ ConfigChecker = (*LegacyDeployConfig)(nil) + +func (d *LegacyDeployConfig) Check(log log.Logger) error { + if d.UnusedChannelTimeoutGranite != 0 && d.UnusedChannelTimeoutGranite != opparams.ChannelTimeoutGranite { + return fmt.Errorf("%w: channelTimeoutGranite is no longer used. Only valid values are 0 or the protocol constant (%d)", ErrInvalidDeployConfig, opparams.ChannelTimeoutGranite) } - return &v + return nil } -func (d *DeployConfig) CanyonTime(genesisTime uint64) *uint64 { - if d.L2GenesisCanyonTimeOffset == nil { - return nil - } - v := uint64(0) - if offset := *d.L2GenesisCanyonTimeOffset; offset > 0 { - v = genesisTime + uint64(offset) - } - return &v +// DeployConfig represents the deployment configuration for an OP Stack chain. +// It is used to deploy the L1 contracts as well as create the L2 genesis state. +type DeployConfig struct { + // Pre-L1-deployment L2 configs + L2InitializationConfig + + // Development purposes only + DevL1DeployConfig + + // L1StartingBlockTag anchors the L2 at an L1 block. + // The timestamp of the block referenced by l1StartingBlockTag is used + // in the L2 genesis block, rollup-config, and L1 output-oracle contract. + // The Output oracle deploy script may use it if the L2 starting timestamp is nil, assuming the L2 genesis is set up with this. + // The L2 genesis timestamp does not affect the initial L2 account state: + // the storage of the L1Block contract at genesis is zeroed, since the adoption of + // the L2-genesis allocs-generation through solidity script. + L1StartingBlockTag *MarshalableRPCBlockNumberOrHash `json:"l1StartingBlockTag" evm:"-"` + + // L1 contracts configuration. + // The deployer of the contracts chooses which sub-systems to deploy. + SuperchainL1DeployConfig + OutputOracleDeployConfig + FaultProofDeployConfig + + // Post-L1-deployment L2 configs + L1DependenciesConfig + + // Legacy, ignored, here for strict-JSON decoding to be accepted. + LegacyDeployConfig `evm:"-"` } -func (d *DeployConfig) DeltaTime(genesisTime uint64) *uint64 { - if d.L2GenesisDeltaTimeOffset == nil { - return nil +// Copy will deeply copy the DeployConfig. This does a JSON roundtrip to copy +// which makes it easier to maintain, we do not need efficiency in this case. +func (d *DeployConfig) Copy() *DeployConfig { + raw, err := json.Marshal(d) + if err != nil { + panic(err) } - v := uint64(0) - if offset := *d.L2GenesisDeltaTimeOffset; offset > 0 { - v = genesisTime + uint64(offset) + + cpy := DeployConfig{} + if err = json.Unmarshal(raw, &cpy); err != nil { + panic(err) } - return &v + return &cpy } -func (d *DeployConfig) EcotoneTime(genesisTime uint64) *uint64 { - if d.L2GenesisEcotoneTimeOffset == nil { - return nil - } - v := uint64(0) - if offset := *d.L2GenesisEcotoneTimeOffset; offset > 0 { - v = genesisTime + uint64(offset) +// Check will ensure that the config is sane and return an error when it is not +func (d *DeployConfig) Check(log log.Logger) error { + if d.L1StartingBlockTag == nil { + return fmt.Errorf("%w: L1StartingBlockTag cannot be nil", ErrInvalidDeployConfig) } - return &v -} -func (d *DeployConfig) FjordTime(genesisTime uint64) *uint64 { - if d.L2GenesisFjordTimeOffset == nil { - return nil + if d.L2GenesisCanyonTimeOffset != nil && d.EIP1559DenominatorCanyon == 0 { + return fmt.Errorf("%w: EIP1559DenominatorCanyon cannot be 0 if Canyon is activated", ErrInvalidDeployConfig) } - v := uint64(0) - if offset := *d.L2GenesisFjordTimeOffset; offset > 0 { - v = genesisTime + uint64(offset) + // L2 block time must always be smaller than L1 block time + if d.L1BlockTime < d.L2BlockTime { + return fmt.Errorf("L2 block time (%d) is larger than L1 block time (%d)", d.L2BlockTime, d.L1BlockTime) } - return &v + return checkConfigBundle(d, log) } -func (d *DeployConfig) InteropTime(genesisTime uint64) *uint64 { - if d.L2GenesisInteropTimeOffset == nil { - return nil - } - v := uint64(0) - if offset := *d.L2GenesisInteropTimeOffset; offset > 0 { - v = genesisTime + uint64(offset) - } - return &v +// 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 +// circular dependency that should be resolved in the future. +func (d *DeployConfig) CheckAddresses() error { + return d.L1DependenciesConfig.CheckAddresses(DependencyContext{ + UseAltDA: d.UseAltDA, + DACommitmentType: d.DACommitmentType, + }) } -func (d *DeployConfig) L2BlobTime(genesisTime uint64) *uint64 { - if d.L2GenesisBlobTimeOffset == nil { - return nil - } - v := uint64(0) - if offset := *d.L2GenesisBlobTimeOffset; offset > 0 { - v = genesisTime + uint64(offset) - } - return &v +// SetDeployments will merge a Deployments into a DeployConfig. +func (d *DeployConfig) SetDeployments(deployments *L1Deployments) { + d.L1StandardBridgeProxy = deployments.L1StandardBridgeProxy + d.L1CrossDomainMessengerProxy = deployments.L1CrossDomainMessengerProxy + d.L1ERC721BridgeProxy = deployments.L1ERC721BridgeProxy + d.SystemConfigProxy = deployments.SystemConfigProxy + d.OptimismPortalProxy = deployments.OptimismPortalProxy + d.DAChallengeProxy = deployments.DataAvailabilityChallengeProxy } // 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) { +func (d *DeployConfig) RollupConfig(l1StartBlock *types.Header, l2GenesisBlockHash common.Hash, l2GenesisBlockNumber uint64) (*rollup.Config, error) { if d.OptimismPortalProxy == (common.Address{}) { return nil, errors.New("OptimismPortalProxy cannot be address(0)") } if d.SystemConfigProxy == (common.Address{}) { return nil, errors.New("SystemConfigProxy cannot be address(0)") } - var plasma *rollup.PlasmaConfig - if d.UsePlasma { - plasma = &rollup.PlasmaConfig{ + var altDA *rollup.AltDAConfig + if d.UseAltDA { + altDA = &rollup.AltDAConfig{ + CommitmentType: d.DACommitmentType, DAChallengeAddress: d.DAChallengeProxy, DAChallengeWindow: d.DAChallengeWindow, DAResolveWindow: d.DAResolveWindow, } } + l1StartTime := l1StartBlock.Time + var l2BlobConfig *rollup.L2BlobConfig if d.L2GenesisBlobTimeOffset != nil { l2BlobConfig = &rollup.L2BlobConfig{ - L2BlobTime: d.L2BlobTime(l1StartBlock.Time()), + L2BlobTime: d.L2BlobTime(l1StartTime), } } + return &rollup.Config{ Genesis: rollup.Genesis{ L1: eth.BlockID{ Hash: l1StartBlock.Hash(), - Number: l1StartBlock.NumberU64(), + Number: l1StartBlock.Number.Uint64(), }, L2: eth.BlockID{ Hash: l2GenesisBlockHash, Number: l2GenesisBlockNumber, }, - L2Time: l1StartBlock.Time(), + L2Time: l1StartBlock.Time, SystemConfig: eth.SystemConfig{ BatcherAddr: d.BatchSenderAddress, Overhead: eth.Bytes32(common.BigToHash(new(big.Int).SetUint64(d.GasPriceOracleOverhead))), @@ -662,23 +948,25 @@ func (d *DeployConfig) RollupConfig(l1StartBlock *types.Block, l2GenesisBlockHas GasLimit: uint64(d.L2GenesisBlockGasLimit), }, }, - BlockTime: d.L2BlockTime, - MaxSequencerDrift: d.MaxSequencerDrift, - SeqWindowSize: d.SequencerWindowSize, - ChannelTimeout: d.ChannelTimeout, - L1ChainID: new(big.Int).SetUint64(d.L1ChainID), - L2ChainID: new(big.Int).SetUint64(d.L2ChainID), - BatchInboxAddress: d.BatchInboxAddress, - DepositContractAddress: d.OptimismPortalProxy, - L1SystemConfigAddress: d.SystemConfigProxy, - RegolithTime: d.RegolithTime(l1StartBlock.Time()), - CanyonTime: d.CanyonTime(l1StartBlock.Time()), - DeltaTime: d.DeltaTime(l1StartBlock.Time()), - EcotoneTime: d.EcotoneTime(l1StartBlock.Time()), - FjordTime: d.FjordTime(l1StartBlock.Time()), - InteropTime: d.InteropTime(l1StartBlock.Time()), - PlasmaConfig: plasma, - L2BlobConfig: l2BlobConfig, + BlockTime: d.L2BlockTime, + MaxSequencerDrift: d.MaxSequencerDrift, + SeqWindowSize: d.SequencerWindowSize, + ChannelTimeoutBedrock: d.ChannelTimeoutBedrock, + L1ChainID: new(big.Int).SetUint64(d.L1ChainID), + L2ChainID: new(big.Int).SetUint64(d.L2ChainID), + BatchInboxAddress: d.BatchInboxAddress, + DepositContractAddress: d.OptimismPortalProxy, + L1SystemConfigAddress: d.SystemConfigProxy, + RegolithTime: d.RegolithTime(l1StartTime), + CanyonTime: d.CanyonTime(l1StartTime), + DeltaTime: d.DeltaTime(l1StartTime), + EcotoneTime: d.EcotoneTime(l1StartTime), + FjordTime: d.FjordTime(l1StartTime), + GraniteTime: d.GraniteTime(l1StartTime), + InteropTime: d.InteropTime(l1StartTime), + ProtocolVersionsAddress: d.ProtocolVersionsProxy, + AltDAConfig: altDA, + L2BlobConfig: l2BlobConfig, }, nil } @@ -709,9 +997,9 @@ func NewDeployConfigWithNetwork(network, path string) (*DeployConfig, error) { } // L1Deployments represents a set of L1 contracts that are deployed. +// This should be consolidated with https://github.com/ethereum-optimism/superchain-registry/blob/f9702a89214244c8dde39e45f5c2955f26d857d0/superchain/superchain.go#L227 type L1Deployments struct { AddressManager common.Address `json:"AddressManager"` - BlockOracle common.Address `json:"BlockOracle"` DisputeGameFactory common.Address `json:"DisputeGameFactory"` DisputeGameFactoryProxy common.Address `json:"DisputeGameFactoryProxy"` L1CrossDomainMessenger common.Address `json:"L1CrossDomainMessenger"` @@ -757,13 +1045,12 @@ func (d *L1Deployments) Check(deployConfig *DeployConfig) error { } for i := 0; i < val.NumField(); i++ { name := val.Type().Field(i).Name - // Skip the non production ready contracts - if name == "DisputeGameFactory" || - name == "DisputeGameFactoryProxy" || - name == "BlockOracle" { + if !deployConfig.UseFaultProofs && + (name == "DisputeGameFactory" || + name == "DisputeGameFactoryProxy") { continue } - if !deployConfig.UsePlasma && + if !deployConfig.UseAltDA && (name == "DataAvailabilityChallenge" || name == "DataAvailabilityChallengeProxy") { continue @@ -816,42 +1103,6 @@ func NewL1Deployments(path string) (*L1Deployments, error) { return &deployments, nil } -type ForgeAllocs struct { - Accounts types.GenesisAlloc -} - -func (d *ForgeAllocs) Copy() *ForgeAllocs { - out := make(types.GenesisAlloc, len(d.Accounts)) - maps.Copy(out, d.Accounts) - return &ForgeAllocs{Accounts: out} -} - -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"` - } - var allocs map[common.Address]forgeAllocAccount - if err := json.Unmarshal(b, &allocs); err != nil { - return err - } - 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, - } - } - return nil -} - type MarshalableRPCBlockNumberOrHash rpc.BlockNumberOrHash func (m *MarshalableRPCBlockNumberOrHash) MarshalJSON() ([]byte, error) { diff --git a/op-chain-ops/genesis/config_test.go b/op-chain-ops/genesis/config_test.go index 026cf509d244..3bb55e7b52dc 100644 --- a/op-chain-ops/genesis/config_test.go +++ b/op-chain-ops/genesis/config_test.go @@ -9,9 +9,12 @@ import ( "github.com/ethereum/go-ethereum/common" "github.com/ethereum/go-ethereum/common/hexutil" + "github.com/ethereum/go-ethereum/log" "github.com/ethereum/go-ethereum/rpc" "github.com/stretchr/testify/require" + + "github.com/ethereum-optimism/optimism/op-service/testlog" ) func TestConfigDataMarshalUnmarshal(t *testing.T) { @@ -23,6 +26,8 @@ func TestConfigDataMarshalUnmarshal(t *testing.T) { require.NoError(t, dec.Decode(decoded)) require.EqualValues(t, "non-default value", string(decoded.L2GenesisBlockExtraData)) + require.NoError(t, decoded.Check(testlog.Logger(t, log.LevelDebug))) + encoded, err := json.MarshalIndent(decoded, "", " ") require.NoError(t, err) require.JSONEq(t, string(b), string(encoded)) @@ -39,25 +44,37 @@ func TestUnmarshalL1StartingBlockTag(t *testing.T) { func TestRegolithTimeZero(t *testing.T) { regolithOffset := hexutil.Uint64(0) - config := &DeployConfig{L2GenesisRegolithTimeOffset: ®olithOffset} + config := &DeployConfig{ + L2InitializationConfig: L2InitializationConfig{ + UpgradeScheduleDeployConfig: UpgradeScheduleDeployConfig{ + L2GenesisRegolithTimeOffset: ®olithOffset}}} require.Equal(t, uint64(0), *config.RegolithTime(1234)) } func TestRegolithTimeAsOffset(t *testing.T) { regolithOffset := hexutil.Uint64(1500) - config := &DeployConfig{L2GenesisRegolithTimeOffset: ®olithOffset} + config := &DeployConfig{ + L2InitializationConfig: L2InitializationConfig{ + UpgradeScheduleDeployConfig: UpgradeScheduleDeployConfig{ + L2GenesisRegolithTimeOffset: ®olithOffset}}} require.Equal(t, uint64(1500+5000), *config.RegolithTime(5000)) } func TestCanyonTimeZero(t *testing.T) { canyonOffset := hexutil.Uint64(0) - config := &DeployConfig{L2GenesisCanyonTimeOffset: &canyonOffset} + config := &DeployConfig{ + L2InitializationConfig: L2InitializationConfig{ + UpgradeScheduleDeployConfig: UpgradeScheduleDeployConfig{ + L2GenesisCanyonTimeOffset: &canyonOffset}}} require.Equal(t, uint64(0), *config.CanyonTime(1234)) } func TestCanyonTimeOffset(t *testing.T) { canyonOffset := hexutil.Uint64(1500) - config := &DeployConfig{L2GenesisCanyonTimeOffset: &canyonOffset} + config := &DeployConfig{ + L2InitializationConfig: L2InitializationConfig{ + UpgradeScheduleDeployConfig: UpgradeScheduleDeployConfig{ + L2GenesisCanyonTimeOffset: &canyonOffset}}} require.Equal(t, uint64(1234+1500), *config.CanyonTime(1234)) } diff --git a/op-chain-ops/genesis/genesis.go b/op-chain-ops/genesis/genesis.go index fc5c94387073..05029b1c097e 100644 --- a/op-chain-ops/genesis/genesis.go +++ b/op-chain-ops/genesis/genesis.go @@ -22,7 +22,7 @@ const defaultGasLimit = 30_000_000 var BedrockTransitionBlockExtraData = []byte("BEDROCK") // NewL2Genesis will create a new L2 genesis -func NewL2Genesis(config *DeployConfig, block *types.Block) (*core.Genesis, error) { +func NewL2Genesis(config *DeployConfig, l1StartHeader *types.Header) (*core.Genesis, error) { if config.L2ChainID == 0 { return nil, errors.New("must define L2 ChainID") } @@ -40,6 +40,8 @@ func NewL2Genesis(config *DeployConfig, block *types.Block) (*core.Genesis, erro eip1559Elasticity = 10 } + l1StartTime := l1StartHeader.Time + optimismChainConfig := params.ChainConfig{ ChainID: new(big.Int).SetUint64(config.L2ChainID), HomesteadBlock: big.NewInt(0), @@ -61,18 +63,19 @@ func NewL2Genesis(config *DeployConfig, block *types.Block) (*core.Genesis, erro TerminalTotalDifficulty: big.NewInt(0), TerminalTotalDifficultyPassed: true, BedrockBlock: new(big.Int).SetUint64(uint64(config.L2GenesisBlockNumber)), - RegolithTime: config.RegolithTime(block.Time()), - CanyonTime: config.CanyonTime(block.Time()), - 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()), - L2BlobTime: config.L2BlobTime(block.Time()), + RegolithTime: config.RegolithTime(l1StartTime), + CanyonTime: config.CanyonTime(l1StartTime), + ShanghaiTime: config.CanyonTime(l1StartTime), + CancunTime: config.EcotoneTime(l1StartTime), + EcotoneTime: config.EcotoneTime(l1StartTime), + FjordTime: config.FjordTime(l1StartTime), + GraniteTime: config.GraniteTime(l1StartTime), + InteropTime: config.InteropTime(l1StartTime), + L2BlobTime: config.L2BlobTime(l1StartTime), Optimism: ¶ms.OptimismConfig{ EIP1559Denominator: eip1559Denom, EIP1559Elasticity: eip1559Elasticity, - EIP1559DenominatorCanyon: eip1559DenomCanyon, + EIP1559DenominatorCanyon: &eip1559DenomCanyon, IsSoulBackedByNative: config.IsSoulBackedByNative, UseSoulGasToken: config.UseSoulGasToken, }, @@ -104,7 +107,7 @@ func NewL2Genesis(config *DeployConfig, block *types.Block) (*core.Genesis, erro genesis := &core.Genesis{ Config: &optimismChainConfig, Nonce: uint64(config.L2GenesisBlockNonce), - Timestamp: block.Time(), + Timestamp: l1StartTime, ExtraData: extraData, GasLimit: uint64(gasLimit), Difficulty: difficulty.ToInt(), @@ -179,7 +182,7 @@ func NewL1Genesis(config *DeployConfig) (*core.Genesis, error) { } difficulty := config.L1GenesisBlockDifficulty if difficulty == nil { - difficulty = newHexBig(1) + difficulty = newHexBig(0) // default to Merge-compatible difficulty value } timestamp := config.L1GenesisBlockTimestamp if timestamp == 0 { @@ -191,19 +194,21 @@ func NewL1Genesis(config *DeployConfig) (*core.Genesis, error) { } return &core.Genesis{ - Config: &chainConfig, - Nonce: uint64(config.L1GenesisBlockNonce), - Timestamp: uint64(timestamp), - ExtraData: extraData, - GasLimit: uint64(gasLimit), - Difficulty: difficulty.ToInt(), - Mixhash: config.L1GenesisBlockMixHash, - Coinbase: config.L1GenesisBlockCoinbase, - Number: uint64(config.L1GenesisBlockNumber), - GasUsed: uint64(config.L1GenesisBlockGasUsed), - ParentHash: config.L1GenesisBlockParentHash, - BaseFee: baseFee.ToInt(), - Alloc: map[common.Address]types.Account{}, + Config: &chainConfig, + Nonce: uint64(config.L1GenesisBlockNonce), + Timestamp: uint64(timestamp), + ExtraData: extraData, + GasLimit: uint64(gasLimit), + Difficulty: difficulty.ToInt(), + Mixhash: config.L1GenesisBlockMixHash, + Coinbase: config.L1GenesisBlockCoinbase, + Number: uint64(config.L1GenesisBlockNumber), + GasUsed: uint64(config.L1GenesisBlockGasUsed), + ParentHash: config.L1GenesisBlockParentHash, + BaseFee: baseFee.ToInt(), + ExcessBlobGas: (*uint64)(config.L1GenesisBlockExcessBlobGas), + BlobGasUsed: (*uint64)(config.L1GenesisBlockBlobGasUsed), + Alloc: map[common.Address]types.Account{}, }, nil } diff --git a/op-chain-ops/genesis/layer_one.go b/op-chain-ops/genesis/layer_one.go index ee9d408212a9..7178cccebb94 100644 --- a/op-chain-ops/genesis/layer_one.go +++ b/op-chain-ops/genesis/layer_one.go @@ -4,9 +4,15 @@ import ( "fmt" "math/big" + "github.com/ethereum-optimism/optimism/op-chain-ops/foundry" + "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-optimism/optimism/op-chain-ops/genesis/beacondeposit" + "github.com/ethereum-optimism/optimism/op-service/predeploys" ) // PrecompileCount represents the number of precompile addresses @@ -18,14 +24,14 @@ const PrecompileCount = 256 // 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 *ForgeAllocs, l1Deployments *L1Deployments) (*core.Genesis, error) { +func BuildL1DeveloperGenesis(config *DeployConfig, dump *foundry.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) } - if genesis.Alloc != nil && len(genesis.Alloc) != 0 { + if 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) @@ -44,6 +50,24 @@ func BuildL1DeveloperGenesis(config *DeployConfig, dump *ForgeAllocs, l1Deployme } }) + beaconDepositAddr := common.HexToAddress("0x1111111111111111111111111111111111111111") + if err := beacondeposit.InsertEmptyBeaconDepositContract(genesis, beaconDepositAddr); err != nil { + return nil, fmt.Errorf("failed to insert beacon deposit contract into L1 dev genesis: %w", err) + } + + // For 4788, make sure the 4788 beacon-roots contract is there. + // (required to be there before L1 Dencun activation) + genesis.Alloc[predeploys.EIP4788ContractAddr] = types.Account{ + Balance: new(big.Int), + Nonce: 1, + Code: predeploys.EIP4788ContractCode, + } + // Also record the virtual deployer address + genesis.Alloc[predeploys.EIP4788ContractDeployer] = types.Account{ + Balance: new(big.Int), + Nonce: 1, + } + return genesis, nil } diff --git a/op-chain-ops/genesis/layer_two.go b/op-chain-ops/genesis/layer_two.go index a534957243bd..5e79b55ce69d 100644 --- a/op-chain-ops/genesis/layer_two.go +++ b/op-chain-ops/genesis/layer_two.go @@ -1,11 +1,8 @@ package genesis import ( - "encoding/json" "fmt" "math/big" - "os" - "path/filepath" hdwallet "github.com/ethereum-optimism/go-ethereum-hdwallet" "github.com/holiman/uint256" @@ -16,6 +13,7 @@ import ( "github.com/ethereum/go-ethereum/core/types" "github.com/ethereum/go-ethereum/crypto" + "github.com/ethereum-optimism/optimism/op-chain-ops/foundry" "github.com/ethereum-optimism/optimism/op-service/predeploys" ) @@ -24,7 +22,8 @@ type L2AllocsMode string const ( L2AllocsDelta L2AllocsMode = "delta" L2AllocsEcotone L2AllocsMode = "ecotone" - L2AllocsFjord L2AllocsMode = "" // the default in solidity scripting / testing + L2AllocsFjord L2AllocsMode = "fjord" + L2AllocsGranite L2AllocsMode = "granite" ) var ( @@ -34,10 +33,10 @@ var ( testMnemonic = "test test test test test test test test test test test junk" ) -type AllocsLoader func(mode L2AllocsMode) *ForgeAllocs +type AllocsLoader func(mode L2AllocsMode) *foundry.ForgeAllocs // BuildL2Genesis will build the L2 genesis block. -func BuildL2Genesis(config *DeployConfig, dump *ForgeAllocs, l1StartBlock *types.Block) (*core.Genesis, error) { +func BuildL2Genesis(config *DeployConfig, dump *foundry.ForgeAllocs, l1StartBlock *types.Header) (*core.Genesis, error) { genspec, err := NewL2Genesis(config, l1StartBlock) if err != nil { return nil, err @@ -94,17 +93,3 @@ func HasAnyDevAccounts(allocs types.GenesisAlloc) (bool, error) { } return false, nil } - -func LoadForgeAllocs(allocsPath string) (*ForgeAllocs, error) { - path := filepath.Join(allocsPath) - f, err := os.OpenFile(path, os.O_RDONLY, 0644) - if err != nil { - return nil, fmt.Errorf("failed to open forge allocs %q: %w", path, 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 &out, nil -} 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 ffaf7c4c841b..1d0702e0218e 100644 --- a/op-chain-ops/genesis/testdata/test-deploy-config-full.json +++ b/op-chain-ops/genesis/testdata/test-deploy-config-full.json @@ -55,6 +55,7 @@ "systemConfigProxy": "0x4200000000000000000000000000000000000061", "optimismPortalProxy": "0x4200000000000000000000000000000000000062", "proxyAdminOwner": "0x0000000000000000000000000000000000000222", + "protocolVersionsProxy": "0x0000000000000000000000000000000000000000", "gasPriceOracleBaseFeeScalar": 0, "gasPriceOracleBlobBaseFeeScalar": 0, "gasPriceOracleOverhead": 2100, @@ -86,8 +87,9 @@ "respectedGameType": 0, "useCustomGasToken": false, "useFaultProofs": false, - "usePlasma": false, + "useAltDA": false, "daBondSize": 0, + "daCommitmentType": "KeccakCommitment", "daChallengeProxy": "0x0000000000000000000000000000000000000000", "daChallengeWindow": 0, "daResolveWindow": 0, diff --git a/op-chain-ops/genesis/withdrawal_network.go b/op-chain-ops/genesis/withdrawal_network.go index f52f12d5558d..6aa753d36bd8 100644 --- a/op-chain-ops/genesis/withdrawal_network.go +++ b/op-chain-ops/genesis/withdrawal_network.go @@ -4,6 +4,8 @@ import ( "encoding/json" "fmt" "strconv" + + "github.com/holiman/uint256" ) // WithdrawalNetwork represents the network that withdrawals are sent to. @@ -32,6 +34,11 @@ func (w *WithdrawalNetwork) ToUint8() uint8 { } } +func (w WithdrawalNetwork) ToABI() []byte { + out := uint256.NewInt(uint64(w.ToUint8())).Bytes32() + return out[:] +} + // FromUint8 converts a uint8 to a WithdrawalNetwork. func FromUint8(i uint8) WithdrawalNetwork { switch i { diff --git a/op-chain-ops/interopgen/configs.go b/op-chain-ops/interopgen/configs.go new file mode 100644 index 000000000000..0bc939ec0351 --- /dev/null +++ b/op-chain-ops/interopgen/configs.go @@ -0,0 +1,108 @@ +package interopgen + +import ( + "errors" + "fmt" + "math/big" + + "github.com/ethereum/go-ethereum/common" + "github.com/ethereum/go-ethereum/log" + + "github.com/ethereum-optimism/optimism/op-chain-ops/genesis" +) + +type L1Config struct { + ChainID *big.Int + genesis.DevL1DeployConfig + Prefund map[common.Address]*big.Int +} + +func (c *L1Config) Check(log log.Logger) error { + if c.ChainID == nil { + return errors.New("missing L1 chain ID") + } + // nothing to check on c.DevL1DeployConfig + return nil +} + +type SuperFaultProofConfig struct { + WithdrawalDelaySeconds *big.Int + MinProposalSizeBytes *big.Int + ChallengePeriodSeconds *big.Int + ProofMaturityDelaySeconds *big.Int + DisputeGameFinalityDelaySeconds *big.Int +} + +type OPSMImplementationsConfig struct { + Release string + + FaultProof SuperFaultProofConfig + + UseInterop bool // to deploy Interop implementation contracts, instead of the regular ones. +} + +type SuperchainConfig struct { + Deployer common.Address + + ProxyAdminOwner common.Address + ProtocolVersionsOwner common.Address + + Paused bool + + Implementations OPSMImplementationsConfig + + genesis.SuperchainL1DeployConfig +} + +func (c *SuperchainConfig) Check(log log.Logger) error { + if c.Deployer == (common.Address{}) { + return errors.New("missing superchain deployer address") + } + if c.ProxyAdminOwner == (common.Address{}) { + return errors.New("missing superchain ProxyAdminOwner address") + } + if err := c.SuperchainL1DeployConfig.Check(log); err != nil { + return err + } + return nil +} + +type L2Config struct { + Deployer common.Address // account used to deploy contracts to L2 + Proposer common.Address + Challenger common.Address + SystemConfigOwner common.Address + genesis.L2InitializationConfig + Prefund map[common.Address]*big.Int +} + +func (c *L2Config) Check(log log.Logger) error { + if c.Deployer == (common.Address{}) { + return errors.New("missing L2 deployer address") + } + if err := c.L2InitializationConfig.Check(log); err != nil { + return err + } + return nil +} + +type WorldConfig struct { + L1 *L1Config + Superchain *SuperchainConfig + L2s map[string]*L2Config +} + +func (c *WorldConfig) Check(log log.Logger) error { + if err := c.L1.Check(log); err != nil { + return fmt.Errorf("invalid L1 config: %w", err) + } + if err := c.Superchain.Check(log); err != nil { + return fmt.Errorf("invalid Superchain config: %w", err) + } + for l2ChainID, l2Cfg := range c.L2s { + if err := l2Cfg.Check(log.New("l2", &l2ChainID)); err != nil { + return fmt.Errorf("invalid L2 (chain ID %s) config: %w", l2ChainID, err) + } + } + return nil +} diff --git a/op-chain-ops/interopgen/deploy.go b/op-chain-ops/interopgen/deploy.go new file mode 100644 index 000000000000..fde7485e04da --- /dev/null +++ b/op-chain-ops/interopgen/deploy.go @@ -0,0 +1,341 @@ +package interopgen + +import ( + "errors" + "fmt" + "math/big" + + "github.com/ethereum-optimism/optimism/op-chain-ops/deployer/opsm" + + "github.com/ethereum/go-ethereum/common" + "github.com/ethereum/go-ethereum/core/types" + "github.com/ethereum/go-ethereum/crypto" + "github.com/ethereum/go-ethereum/log" + + "github.com/ethereum-optimism/optimism/op-chain-ops/foundry" + "github.com/ethereum-optimism/optimism/op-chain-ops/genesis" + "github.com/ethereum-optimism/optimism/op-chain-ops/genesis/beacondeposit" + "github.com/ethereum-optimism/optimism/op-chain-ops/interopgen/deployers" + "github.com/ethereum-optimism/optimism/op-chain-ops/script" +) + +var ( + // sysGenesisDeployer is used as tx.origin/msg.sender on system genesis script calls. + // At the end we verify none of the deployed contracts persist (there may be temporary ones, to insert bytecode). + sysGenesisDeployer = common.Address(crypto.Keccak256([]byte("System genesis deployer"))[12:]) +) + +func Deploy(logger log.Logger, fa *foundry.ArtifactsFS, srcFS *foundry.SourceMapFS, cfg *WorldConfig) (*WorldDeployment, *WorldOutput, error) { + // Sanity check all L2s have consistent chain ID and attach to the same L1 + for id, l2Cfg := range cfg.L2s { + if fmt.Sprintf("%d", l2Cfg.L2ChainID) != id { + return nil, nil, fmt.Errorf("chain L2 %s declared different L2 chain ID %d in config", id, l2Cfg.L2ChainID) + } + if !cfg.L1.ChainID.IsUint64() || cfg.L1.ChainID.Uint64() != l2Cfg.L1ChainID { + return nil, nil, fmt.Errorf("chain L2 %s declared different L1 chain ID %d in config than global %d", id, l2Cfg.L1ChainID, cfg.L1.ChainID) + } + } + + deployments := &WorldDeployment{ + L2s: make(map[string]*L2Deployment), + } + + l1Host := createL1(logger, fa, srcFS, cfg.L1) + if err := l1Host.EnableCheats(); err != nil { + return nil, nil, fmt.Errorf("failed to enable cheats in L1 state: %w", err) + } + + l1Deployment, err := prepareInitialL1(l1Host, cfg.L1) + if err != nil { + return nil, nil, fmt.Errorf("failed to deploy initial L1 content: %w", err) + } + deployments.L1 = l1Deployment + + superDeployment, err := deploySuperchainToL1(l1Host, cfg.Superchain) + if err != nil { + return nil, nil, fmt.Errorf("failed to deploy superchain to L1: %w", err) + } + deployments.Superchain = superDeployment + + // We deploy contracts for each L2 to the L1 + // because we need to compute the genesis block hash + // to put into the L2 genesis configs, and can thus not mutate the L1 state + // after creating the final config for any particular L2. Will add comments. + + for l2ChainID, l2Cfg := range cfg.L2s { + l2Deployment, err := deployL2ToL1(l1Host, cfg.Superchain, superDeployment, l2Cfg) + if err != nil { + return nil, nil, fmt.Errorf("failed to deploy L2 %d to L1: %w", &l2ChainID, err) + } + deployments.L2s[l2ChainID] = l2Deployment + } + + out := &WorldOutput{ + L2s: make(map[string]*L2Output), + } + l1Out, err := completeL1(l1Host, cfg.L1) + if err != nil { + return nil, nil, fmt.Errorf("failed to complete L1: %w", err) + } + out.L1 = l1Out + + // Now that the L1 does not change anymore we can compute the L1 genesis block, to anchor all the L2s to. + l1GenesisBlock := l1Out.Genesis.ToBlock() + genesisTimestamp := l1Out.Genesis.Timestamp + + for l2ChainID, l2Cfg := range cfg.L2s { + l2Host := createL2(logger, fa, srcFS, l2Cfg, genesisTimestamp) + if err := l2Host.EnableCheats(); err != nil { + return nil, nil, fmt.Errorf("failed to enable cheats in L2 state %s: %w", l2ChainID, err) + } + if err := genesisL2(l2Host, l2Cfg, deployments.L2s[l2ChainID]); err != nil { + return nil, nil, fmt.Errorf("failed to apply genesis data to L2 %s: %w", l2ChainID, err) + } + l2Out, err := completeL2(l2Host, l2Cfg, l1GenesisBlock, deployments.L2s[l2ChainID]) + if err != nil { + return nil, nil, fmt.Errorf("failed to complete L2 %s: %w", l2ChainID, err) + } + out.L2s[l2ChainID] = l2Out + } + return deployments, out, nil +} + +func createL1(logger log.Logger, fa *foundry.ArtifactsFS, srcFS *foundry.SourceMapFS, cfg *L1Config) *script.Host { + l1Context := script.Context{ + ChainID: cfg.ChainID, + Sender: sysGenesisDeployer, + Origin: sysGenesisDeployer, + FeeRecipient: common.Address{}, + GasLimit: script.DefaultFoundryGasLimit, + BlockNum: uint64(cfg.L1GenesisBlockNumber), + Timestamp: uint64(cfg.L1GenesisBlockTimestamp), + PrevRandao: cfg.L1GenesisBlockMixHash, + BlobHashes: nil, + } + l1Host := script.NewHost(logger.New("role", "l1", "chain", cfg.ChainID), fa, srcFS, l1Context) + return l1Host +} + +func createL2(logger log.Logger, fa *foundry.ArtifactsFS, srcFS *foundry.SourceMapFS, l2Cfg *L2Config, genesisTimestamp uint64) *script.Host { + l2Context := script.Context{ + ChainID: new(big.Int).SetUint64(l2Cfg.L2ChainID), + Sender: sysGenesisDeployer, + Origin: sysGenesisDeployer, + FeeRecipient: common.Address{}, + GasLimit: script.DefaultFoundryGasLimit, + BlockNum: uint64(l2Cfg.L2GenesisBlockNumber), + Timestamp: genesisTimestamp, + PrevRandao: l2Cfg.L2GenesisBlockMixHash, + BlobHashes: nil, + } + l2Host := script.NewHost(logger.New("role", "l2", "chain", l2Cfg.L2ChainID), fa, srcFS, l2Context) + l2Host.SetEnvVar("OUTPUT_MODE", "none") // we don't use the cheatcode, but capture the state outside of EVM execution + l2Host.SetEnvVar("FORK", "granite") // latest fork + return l2Host +} + +// prepareInitialL1 deploys basics such as preinstalls to L1 (incl. EIP-4788) +func prepareInitialL1(l1Host *script.Host, cfg *L1Config) (*L1Deployment, error) { + l1Host.SetTxOrigin(sysGenesisDeployer) + + if err := deployers.InsertPreinstalls(l1Host); err != nil { + return nil, fmt.Errorf("failed to install preinstalls in L1: %w", err) + } + // No global contracts inserted at this point. + // All preinstalls have known constant addresses. + return &L1Deployment{}, nil +} + +func deploySuperchainToL1(l1Host *script.Host, superCfg *SuperchainConfig) (*SuperchainDeployment, error) { + l1Host.SetTxOrigin(superCfg.Deployer) + + superDeployment, err := opsm.DeploySuperchain(l1Host, opsm.DeploySuperchainInput{ + ProxyAdminOwner: superCfg.ProxyAdminOwner, + ProtocolVersionsOwner: superCfg.ProtocolVersionsOwner, + Guardian: superCfg.SuperchainConfigGuardian, + Paused: superCfg.Paused, + RequiredProtocolVersion: superCfg.RequiredProtocolVersion, + RecommendedProtocolVersion: superCfg.RecommendedProtocolVersion, + }) + if err != nil { + return nil, fmt.Errorf("failed to deploy Superchain contracts: %w", err) + } + + implementationsDeployment, err := opsm.DeployImplementations(l1Host, opsm.DeployImplementationsInput{ + WithdrawalDelaySeconds: superCfg.Implementations.FaultProof.WithdrawalDelaySeconds, + MinProposalSizeBytes: superCfg.Implementations.FaultProof.MinProposalSizeBytes, + ChallengePeriodSeconds: superCfg.Implementations.FaultProof.ChallengePeriodSeconds, + ProofMaturityDelaySeconds: superCfg.Implementations.FaultProof.ProofMaturityDelaySeconds, + DisputeGameFinalityDelaySeconds: superCfg.Implementations.FaultProof.DisputeGameFinalityDelaySeconds, + Release: superCfg.Implementations.Release, + SuperchainConfigProxy: superDeployment.SuperchainConfigProxy, + ProtocolVersionsProxy: superDeployment.ProtocolVersionsProxy, + SuperchainProxyAdmin: superDeployment.SuperchainProxyAdmin, + UseInterop: superCfg.Implementations.UseInterop, + }) + if err != nil { + return nil, fmt.Errorf("failed to deploy Implementations contracts: %w", err) + } + + // Collect deployment addresses + // This could all be automatic once we have better output-contract typing/scripting + return &SuperchainDeployment{ + Implementations: Implementations(implementationsDeployment), + ProxyAdmin: superDeployment.SuperchainProxyAdmin, + ProtocolVersions: superDeployment.ProtocolVersionsImpl, + ProtocolVersionsProxy: superDeployment.ProtocolVersionsProxy, + SuperchainConfig: superDeployment.SuperchainConfigImpl, + SuperchainConfigProxy: superDeployment.SuperchainConfigProxy, + }, nil +} + +func deployL2ToL1(l1Host *script.Host, superCfg *SuperchainConfig, superDeployment *SuperchainDeployment, cfg *L2Config) (*L2Deployment, error) { + if cfg.UseAltDA { + return nil, errors.New("alt-da mode not supported yet") + } + + l1Host.SetTxOrigin(cfg.Deployer) + + output, err := opsm.DeployOPChain(l1Host, opsm.DeployOPChainInput{ + OpChainProxyAdminOwner: cfg.ProxyAdminOwner, + SystemConfigOwner: cfg.SystemConfigOwner, + Batcher: cfg.BatchSenderAddress, + UnsafeBlockSigner: cfg.P2PSequencerAddress, + Proposer: cfg.Proposer, + Challenger: cfg.Challenger, + BasefeeScalar: cfg.GasPriceOracleBaseFeeScalar, + BlobBaseFeeScalar: cfg.GasPriceOracleBlobBaseFeeScalar, + L2ChainId: new(big.Int).SetUint64(cfg.L2ChainID), + OpsmProxy: superDeployment.OpsmProxy, + }) + if err != nil { + return nil, fmt.Errorf("failed to deploy L2 OP chain: %w", err) + } + + // Collect deployment addresses + return &L2Deployment{ + L2OpchainDeployment: L2OpchainDeployment(output), + }, nil +} + +func genesisL2(l2Host *script.Host, cfg *L2Config, deployment *L2Deployment) error { + if err := opsm.L2Genesis(l2Host, &opsm.L2GenesisInput{ + L1Deployments: opsm.L1Deployments{ + L1CrossDomainMessengerProxy: deployment.L1CrossDomainMessengerProxy, + L1StandardBridgeProxy: deployment.L1StandardBridgeProxy, + L1ERC721BridgeProxy: deployment.L1ERC721BridgeProxy, + }, + L2Config: cfg.L2InitializationConfig, + }); err != nil { + return fmt.Errorf("failed L2 genesis: %w", err) + } + + return nil +} + +func completeL1(l1Host *script.Host, cfg *L1Config) (*L1Output, error) { + l1Genesis, err := genesis.NewL1Genesis(&genesis.DeployConfig{ + L2InitializationConfig: genesis.L2InitializationConfig{ + L2CoreDeployConfig: genesis.L2CoreDeployConfig{ + L1ChainID: cfg.ChainID.Uint64(), + }, + }, + DevL1DeployConfig: cfg.DevL1DeployConfig, + }) + if err != nil { + return nil, fmt.Errorf("failed to build L1 genesis template: %w", err) + } + allocs, err := l1Host.StateDump() + if err != nil { + return nil, fmt.Errorf("failed to dump L1 state: %w", err) + } + + // Sanity check that the default deployer didn't include anything, + // and make sure it's not in the state. + if err := ensureNoDeployed(allocs, sysGenesisDeployer); err != nil { + return nil, fmt.Errorf("unexpected deployed account content by L1 genesis deployer: %w", err) + } + + for addr, amount := range cfg.Prefund { + acc := allocs.Accounts[addr] + acc.Balance = amount + allocs.Accounts[addr] = acc + } + + l1Genesis.Alloc = allocs.Accounts + + // Insert an empty beaconchain deposit contract with valid empty-tree prestate. + // This is part of dev-genesis, but not part of scripts yet. + beaconDepositAddr := common.HexToAddress("0x1111111111111111111111111111111111111111") + if err := beacondeposit.InsertEmptyBeaconDepositContract(l1Genesis, beaconDepositAddr); err != nil { + return nil, fmt.Errorf("failed to insert beacon deposit contract into L1 dev genesis: %w", err) + } + + return &L1Output{ + Genesis: l1Genesis, + }, nil +} + +func completeL2(l2Host *script.Host, cfg *L2Config, l1Block *types.Block, deployment *L2Deployment) (*L2Output, error) { + deployCfg := &genesis.DeployConfig{ + L2InitializationConfig: cfg.L2InitializationConfig, + L1DependenciesConfig: genesis.L1DependenciesConfig{ + L1StandardBridgeProxy: deployment.L1StandardBridgeProxy, + L1CrossDomainMessengerProxy: deployment.L1CrossDomainMessengerProxy, + L1ERC721BridgeProxy: deployment.L1ERC721BridgeProxy, + SystemConfigProxy: deployment.SystemConfigProxy, + OptimismPortalProxy: deployment.OptimismPortalProxy, + DAChallengeProxy: common.Address{}, // unsupported for now + }, + } + // l1Block is used to determine genesis time. + l2Genesis, err := genesis.NewL2Genesis(deployCfg, l1Block.Header()) + if err != nil { + return nil, fmt.Errorf("failed to build L2 genesis config: %w", err) + } + + allocs, err := l2Host.StateDump() + if err != nil { + return nil, fmt.Errorf("failed to dump L1 state: %w", err) + } + + // Sanity check that the default deployer didn't include anything, + // and make sure it's not in the state. + if err := ensureNoDeployed(allocs, sysGenesisDeployer); err != nil { + return nil, fmt.Errorf("unexpected deployed account content by L2 genesis deployer: %w", err) + } + + for addr, amount := range cfg.Prefund { + acc := allocs.Accounts[addr] + acc.Balance = amount + allocs.Accounts[addr] = acc + } + + l2Genesis.Alloc = allocs.Accounts + l2GenesisBlock := l2Genesis.ToBlock() + + rollupCfg, err := deployCfg.RollupConfig(l1Block.Header(), l2GenesisBlock.Hash(), l2GenesisBlock.NumberU64()) + if err != nil { + return nil, fmt.Errorf("failed to build L2 rollup config: %w", err) + } + return &L2Output{ + Genesis: l2Genesis, + RollupCfg: rollupCfg, + }, nil +} + +// ensureNoDeployed checks that non of the contracts that +// could have been deployed by the given deployer address are around. +// And removes deployer from the allocs. +func ensureNoDeployed(allocs *foundry.ForgeAllocs, deployer common.Address) error { + // Sanity check we have no deploy output that's not meant to be there. + for i := uint64(0); i <= allocs.Accounts[deployer].Nonce; i++ { + addr := crypto.CreateAddress(deployer, i) + if _, ok := allocs.Accounts[addr]; ok { + return fmt.Errorf("system deployer output %s (deployed with nonce %d) was not cleaned up", addr, i) + } + } + // Don't include the deployer account + delete(allocs.Accounts, deployer) + return nil +} diff --git a/op-chain-ops/interopgen/deployers/preinstalls.go b/op-chain-ops/interopgen/deployers/preinstalls.go new file mode 100644 index 000000000000..8a4dca1af26d --- /dev/null +++ b/op-chain-ops/interopgen/deployers/preinstalls.go @@ -0,0 +1,24 @@ +package deployers + +import ( + "fmt" + + "github.com/ethereum-optimism/optimism/op-chain-ops/script" +) + +type PreinstallsScript struct { + SetPreinstalls func() error +} + +func InsertPreinstalls(host *script.Host) error { + l2GenesisScript, cleanupL2Genesis, err := script.WithScript[PreinstallsScript](host, "SetPreinstalls.s.sol", "SetPreinstalls") + if err != nil { + return fmt.Errorf("failed to load SetPreinstalls script: %w", err) + } + defer cleanupL2Genesis() + + if err := l2GenesisScript.SetPreinstalls(); err != nil { + return fmt.Errorf("failed to set preinstalls: %w", err) + } + return nil +} diff --git a/op-chain-ops/interopgen/deployments.go b/op-chain-ops/interopgen/deployments.go new file mode 100644 index 000000000000..5b54c2286f9a --- /dev/null +++ b/op-chain-ops/interopgen/deployments.go @@ -0,0 +1,67 @@ +package interopgen + +import ( + "github.com/ethereum/go-ethereum/common" +) + +type L1Deployment struct { + // No global deployed contracts that aren't part of the superchain, yet. +} + +type Implementations struct { + OpsmProxy common.Address `json:"OPSMProxy"` + DelayedWETHImpl common.Address `json:"DelayedWETHImpl"` + OptimismPortalImpl common.Address `json:"OptimismPortalImpl"` + PreimageOracleSingleton common.Address `json:"PreimageOracleSingleton"` + MipsSingleton common.Address `json:"MipsSingleton"` + SystemConfigImpl common.Address `json:"SystemConfigImpl"` + L1CrossDomainMessengerImpl common.Address `json:"L1CrossDomainMessengerImpl"` + L1ERC721BridgeImpl common.Address `json:"L1ERC721BridgeImpl"` + L1StandardBridgeImpl common.Address `json:"L1StandardBridgeImpl"` + OptimismMintableERC20FactoryImpl common.Address `json:"OptimismMintableERC20FactoryImpl"` + DisputeGameFactoryImpl common.Address `json:"DisputeGameFactoryImpl"` +} + +type SuperchainDeployment struct { + Implementations + + ProxyAdmin common.Address `json:"ProxyAdmin"` + + ProtocolVersions common.Address `json:"ProtocolVersions"` + ProtocolVersionsProxy common.Address `json:"ProtocolVersionsProxy"` + + SuperchainConfig common.Address `json:"SuperchainConfig"` + SuperchainConfigProxy common.Address `json:"SuperchainConfigProxy"` +} + +type L2OpchainDeployment struct { + OpChainProxyAdmin common.Address `json:"OpChainProxyAdmin"` + AddressManager common.Address `json:"AddressManager"` + L1ERC721BridgeProxy common.Address `json:"L1ERC721BridgeProxy"` + SystemConfigProxy common.Address `json:"SystemConfigProxy"` + OptimismMintableERC20FactoryProxy common.Address `json:"OptimismMintableERC20FactoryProxy"` + L1StandardBridgeProxy common.Address `json:"L1StandardBridgeProxy"` + L1CrossDomainMessengerProxy common.Address `json:"L1CrossDomainMessengerProxy"` + // Fault proof contracts below. + OptimismPortalProxy common.Address `json:"OptimismPortalProxy"` + DisputeGameFactoryProxy common.Address `json:"DisputeGameFactoryProxy"` + AnchorStateRegistryProxy common.Address `json:"AnchorStateRegistryProxy"` + AnchorStateRegistryImpl common.Address `json:"AnchorStateRegistryImpl"` + FaultDisputeGame common.Address `json:"FaultDisputeGame"` + PermissionedDisputeGame common.Address `json:"PermissionedDisputeGame"` + DelayedWETHPermissionedGameProxy common.Address `json:"DelayedWETHPermissionedGameProxy"` + DelayedWETHPermissionlessGameProxy common.Address `json:"DelayedWETHPermissionlessGameProxy"` +} + +type L2Deployment struct { + L2OpchainDeployment + + // In the future this may contain optional extras, + // e.g. a Safe that will own the L2 chain contracts +} + +type WorldDeployment struct { + L1 *L1Deployment `json:"L1"` + Superchain *SuperchainDeployment `json:"Superchain"` + L2s map[string]*L2Deployment `json:"L2s"` +} diff --git a/op-chain-ops/interopgen/outputs.go b/op-chain-ops/interopgen/outputs.go new file mode 100644 index 000000000000..c0543ab06293 --- /dev/null +++ b/op-chain-ops/interopgen/outputs.go @@ -0,0 +1,21 @@ +package interopgen + +import ( + "github.com/ethereum/go-ethereum/core" + + "github.com/ethereum-optimism/optimism/op-node/rollup" +) + +type L1Output struct { + Genesis *core.Genesis +} + +type L2Output struct { + Genesis *core.Genesis + RollupCfg *rollup.Config +} + +type WorldOutput struct { + L1 *L1Output + L2s map[string]*L2Output +} diff --git a/op-chain-ops/interopgen/recipe.go b/op-chain-ops/interopgen/recipe.go new file mode 100644 index 000000000000..a1761f9f0dc8 --- /dev/null +++ b/op-chain-ops/interopgen/recipe.go @@ -0,0 +1,272 @@ +package interopgen + +import ( + "fmt" + "math/big" + + "github.com/ethereum/go-ethereum/common" + "github.com/ethereum/go-ethereum/common/hexutil" + "github.com/ethereum/go-ethereum/params" + + "github.com/ethereum-optimism/optimism/op-chain-ops/devkeys" + "github.com/ethereum-optimism/optimism/op-chain-ops/genesis" +) + +type InteropDevRecipe struct { + L1ChainID uint64 + L2ChainIDs []uint64 + GenesisTimestamp uint64 +} + +func (r *InteropDevRecipe) Build(addrs devkeys.Addresses) (*WorldConfig, error) { + // L1 genesis + l1Cfg := &L1Config{ + ChainID: new(big.Int).SetUint64(r.L1ChainID), + DevL1DeployConfig: genesis.DevL1DeployConfig{ + L1BlockTime: 6, + L1GenesisBlockTimestamp: hexutil.Uint64(r.GenesisTimestamp), + L1GenesisBlockGasLimit: 30_000_000, + }, + Prefund: make(map[common.Address]*big.Int), + } + + // TODO(#11887): consider making the number of prefunded keys configurable. + l1Users := devkeys.ChainUserKeys(l1Cfg.ChainID) + for i := uint64(0); i < 20; i++ { + userAddr, err := addrs.Address(l1Users(i)) + if err != nil { + return nil, fmt.Errorf("failed to get L1 user addr %d: %w", i, err) + } + l1Cfg.Prefund[userAddr] = Ether(10_000_000) + } + + superchainOps := devkeys.SuperchainOperatorKeys(l1Cfg.ChainID) + + superchainDeployer, err := addrs.Address(superchainOps(devkeys.SuperchainDeployerKey)) + if err != nil { + return nil, err + } + superchainProxyAdmin, err := addrs.Address(superchainOps(devkeys.SuperchainProxyAdminOwner)) + if err != nil { + return nil, err + } + superchainProtocolVersionsOwner, err := addrs.Address(superchainOps(devkeys.SuperchainProtocolVersionsOwner)) + if err != nil { + return nil, err + } + superchainConfigGuardian, err := addrs.Address(superchainOps(devkeys.SuperchainConfigGuardianKey)) + if err != nil { + return nil, err + } + l1Cfg.Prefund[superchainDeployer] = Ether(10_000_000) + l1Cfg.Prefund[superchainProxyAdmin] = Ether(10_000_000) + l1Cfg.Prefund[superchainConfigGuardian] = Ether(10_000_000) + superchainCfg := &SuperchainConfig{ + ProxyAdminOwner: superchainProxyAdmin, + ProtocolVersionsOwner: superchainProtocolVersionsOwner, + Deployer: superchainDeployer, + Implementations: OPSMImplementationsConfig{ + Release: "op-contracts/0.0.1", + FaultProof: SuperFaultProofConfig{ + WithdrawalDelaySeconds: big.NewInt(604800), + MinProposalSizeBytes: big.NewInt(10000), + ChallengePeriodSeconds: big.NewInt(120), + ProofMaturityDelaySeconds: big.NewInt(12), + DisputeGameFinalityDelaySeconds: big.NewInt(6), + }, + UseInterop: true, + }, + SuperchainL1DeployConfig: genesis.SuperchainL1DeployConfig{ + RequiredProtocolVersion: params.OPStackSupport, + RecommendedProtocolVersion: params.OPStackSupport, + SuperchainConfigGuardian: superchainConfigGuardian, + }, + } + world := &WorldConfig{ + L1: l1Cfg, + Superchain: superchainCfg, + L2s: make(map[string]*L2Config), + } + for _, l2ChainID := range r.L2ChainIDs { + l2Cfg, err := InteropL2DevConfig(r.L1ChainID, l2ChainID, addrs) + if err != nil { + return nil, fmt.Errorf("failed to generate L2 config for chain %d: %w", l2ChainID, err) + } + if err := prefundL2Accounts(l1Cfg, l2Cfg, addrs); err != nil { + return nil, fmt.Errorf("failed to prefund addresses on L1 for L2 chain %d: %w", l2ChainID, err) + } + world.L2s[fmt.Sprintf("%d", l2ChainID)] = l2Cfg + } + return world, nil +} + +func prefundL2Accounts(l1Cfg *L1Config, l2Cfg *L2Config, addrs devkeys.Addresses) error { + l1Cfg.Prefund[l2Cfg.BatchSenderAddress] = Ether(10_000_000) + l1Cfg.Prefund[l2Cfg.Deployer] = Ether(10_000_000) + l1Cfg.Prefund[l2Cfg.FinalSystemOwner] = Ether(10_000_000) + proposer, err := addrs.Address(devkeys.ChainOperatorKey{ + ChainID: new(big.Int).SetUint64(l2Cfg.L2ChainID), + Role: devkeys.ProposerRole, + }) + if err != nil { + return err + } + l1Cfg.Prefund[proposer] = Ether(10_000_000) + challenger, err := addrs.Address(devkeys.ChainOperatorKey{ + ChainID: new(big.Int).SetUint64(l2Cfg.L2ChainID), + Role: devkeys.ChallengerRole, + }) + if err != nil { + return err + } + l1Cfg.Prefund[challenger] = Ether(10_000_000) + return nil +} + +func InteropL2DevConfig(l1ChainID, l2ChainID uint64, addrs devkeys.Addresses) (*L2Config, error) { + // Padded chain ID, hex encoded, prefixed with 0xff like inboxes, then 0x02 to signify devnet. + batchInboxAddress := common.HexToAddress(fmt.Sprintf("0xff02%016x", l2ChainID)) + chainOps := devkeys.ChainOperatorKeys(new(big.Int).SetUint64(l2ChainID)) + + deployer, err := addrs.Address(chainOps(devkeys.DeployerRole)) + if err != nil { + return nil, err + } + l1ProxyAdminOwner, err := addrs.Address(chainOps(devkeys.L1ProxyAdminOwnerRole)) + if err != nil { + return nil, err + } + l2ProxyAdminOwner, err := addrs.Address(chainOps(devkeys.L2ProxyAdminOwnerRole)) + if err != nil { + return nil, err + } + baseFeeVaultRecipient, err := addrs.Address(chainOps(devkeys.BaseFeeVaultRecipientRole)) + if err != nil { + return nil, err + } + l1FeeVaultRecipient, err := addrs.Address(chainOps(devkeys.L1FeeVaultRecipientRole)) + if err != nil { + return nil, err + } + sequencerFeeVaultRecipient, err := addrs.Address(chainOps(devkeys.SequencerFeeVaultRecipientRole)) + if err != nil { + return nil, err + } + sequencerP2P, err := addrs.Address(chainOps(devkeys.SequencerP2PRole)) + if err != nil { + return nil, err + } + batcher, err := addrs.Address(chainOps(devkeys.BatcherRole)) + if err != nil { + return nil, err + } + proposer, err := addrs.Address(chainOps(devkeys.ProposerRole)) + if err != nil { + return nil, err + } + challenger, err := addrs.Address(chainOps(devkeys.ChallengerRole)) + if err != nil { + return nil, err + } + systemConfigOwner, err := addrs.Address(chainOps(devkeys.SystemConfigOwner)) + if err != nil { + return nil, err + } + + l2Cfg := &L2Config{ + Deployer: deployer, + Proposer: proposer, + Challenger: challenger, + SystemConfigOwner: systemConfigOwner, + L2InitializationConfig: genesis.L2InitializationConfig{ + DevDeployConfig: genesis.DevDeployConfig{ + FundDevAccounts: true, + }, + L2GenesisBlockDeployConfig: genesis.L2GenesisBlockDeployConfig{ + L2GenesisBlockGasLimit: 30_000_000, + L2GenesisBlockBaseFeePerGas: (*hexutil.Big)(big.NewInt(params.InitialBaseFee)), + }, + OwnershipDeployConfig: genesis.OwnershipDeployConfig{ + ProxyAdminOwner: l2ProxyAdminOwner, + FinalSystemOwner: l1ProxyAdminOwner, + }, + L2VaultsDeployConfig: genesis.L2VaultsDeployConfig{ + BaseFeeVaultRecipient: baseFeeVaultRecipient, + L1FeeVaultRecipient: l1FeeVaultRecipient, + SequencerFeeVaultRecipient: sequencerFeeVaultRecipient, + BaseFeeVaultMinimumWithdrawalAmount: (*hexutil.Big)(Ether(10)), + L1FeeVaultMinimumWithdrawalAmount: (*hexutil.Big)(Ether(10)), + SequencerFeeVaultMinimumWithdrawalAmount: (*hexutil.Big)(Ether(10)), + BaseFeeVaultWithdrawalNetwork: "remote", + L1FeeVaultWithdrawalNetwork: "remote", + SequencerFeeVaultWithdrawalNetwork: "remote", + }, + GovernanceDeployConfig: genesis.GovernanceDeployConfig{ + EnableGovernance: false, + }, + GasPriceOracleDeployConfig: genesis.GasPriceOracleDeployConfig{ + GasPriceOracleBaseFeeScalar: 1368, + GasPriceOracleBlobBaseFeeScalar: 810949, + }, + GasTokenDeployConfig: genesis.GasTokenDeployConfig{ + UseCustomGasToken: false, + }, + OperatorDeployConfig: genesis.OperatorDeployConfig{ + P2PSequencerAddress: sequencerP2P, + BatchSenderAddress: batcher, + }, + EIP1559DeployConfig: genesis.EIP1559DeployConfig{ + EIP1559Elasticity: 6, + EIP1559Denominator: 50, + EIP1559DenominatorCanyon: 250, + }, + UpgradeScheduleDeployConfig: genesis.UpgradeScheduleDeployConfig{ + L2GenesisRegolithTimeOffset: new(hexutil.Uint64), + L2GenesisCanyonTimeOffset: new(hexutil.Uint64), + L2GenesisDeltaTimeOffset: new(hexutil.Uint64), + L2GenesisEcotoneTimeOffset: new(hexutil.Uint64), + L2GenesisFjordTimeOffset: new(hexutil.Uint64), + L2GenesisGraniteTimeOffset: new(hexutil.Uint64), + L2GenesisInteropTimeOffset: new(hexutil.Uint64), + L1CancunTimeOffset: new(hexutil.Uint64), + UseInterop: true, + }, + L2CoreDeployConfig: genesis.L2CoreDeployConfig{ + L1ChainID: l1ChainID, + L2ChainID: l2ChainID, + L2BlockTime: 2, + FinalizationPeriodSeconds: 2, // instant output finalization + MaxSequencerDrift: 300, + SequencerWindowSize: 200, + ChannelTimeoutBedrock: 120, + BatchInboxAddress: batchInboxAddress, + SystemConfigStartBlock: 0, + }, + AltDADeployConfig: genesis.AltDADeployConfig{ + UseAltDA: false, + }, + }, + Prefund: make(map[common.Address]*big.Int), + } + + // TODO(#11887): consider making the number of prefunded keys configurable. + l2Users := devkeys.ChainUserKeys(new(big.Int).SetUint64(l2ChainID)) + for i := uint64(0); i < 20; i++ { + userAddr, err := addrs.Address(l2Users(i)) + if err != nil { + return nil, fmt.Errorf("failed to get L2 user addr %d: %w", i, err) + } + l2Cfg.Prefund[userAddr] = Ether(10_000_000) + } + + l2Cfg.Prefund[l2ProxyAdminOwner] = Ether(10_000_000) + + return l2Cfg, nil +} + +var etherScalar = new(big.Int).Exp(big.NewInt(10), big.NewInt(18), nil) + +// Ether converts a uint64 Ether amount into a *big.Int amount in wei units, for allocating test balances. +func Ether(v uint64) *big.Int { + return new(big.Int).Mul(new(big.Int).SetUint64(v), etherScalar) +} diff --git a/op-chain-ops/justfile b/op-chain-ops/justfile deleted file mode 100644 index 9775f535d227..000000000000 --- a/op-chain-ops/justfile +++ /dev/null @@ -1,25 +0,0 @@ -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.go b/op-chain-ops/safe/batch.go deleted file mode 100644 index 93c03100db97..000000000000 --- a/op-chain-ops/safe/batch.go +++ /dev/null @@ -1,310 +0,0 @@ -// Package safe contains types for working with Safe smart contract wallets. These are used to -// build batch transactions for the tx-builder app. The types are based on -// https://github.com/safe-global/safe-react-apps/blob/development/apps/tx-builder/src/typings/models.ts. -package safe - -import ( - "bytes" - "encoding/json" - "errors" - "fmt" - "math/big" - "strings" - - "golang.org/x/exp/maps" - - "github.com/ethereum/go-ethereum/accounts/abi" - "github.com/ethereum/go-ethereum/common" - "github.com/ethereum/go-ethereum/common/hexutil" - "github.com/ethereum/go-ethereum/crypto" -) - -// Batch represents a Safe tx-builder transaction. -// SkipCalldata will skip adding the calldata to the BatchTransaction. -// This is useful for when using the Safe UI because it prefers using -// the raw calldata when both the calldata and ABIs with arguments are -// present. -type Batch struct { - SkipCalldata bool `json:"-"` - Version string `json:"version"` - ChainID *big.Int `json:"chainId"` - CreatedAt uint64 `json:"createdAt"` - Meta BatchMeta `json:"meta"` - Transactions []BatchTransaction `json:"transactions"` -} - -// AddCall will add a call to the batch. After a series of calls are -// added to the batch, it can be serialized to JSON. -func (b *Batch) AddCall(to common.Address, value *big.Int, sig string, args []any, iface *abi.ABI) error { - if iface == nil { - return errors.New("abi cannot be nil") - } - // Attempt to pull out the signature from the top level methods. - // The abi package uses normalization that we do not want to be - // coupled to, so attempt to search for the raw name if the top - // level name is not found to handle overloading more gracefully. - method, ok := iface.Methods[sig] - if !ok { - for _, m := range iface.Methods { - if m.RawName == sig || m.Sig == sig { - method = m - ok = true - } - } - } - if !ok { - keys := maps.Keys(iface.Methods) - methods := strings.Join(keys, ",") - return fmt.Errorf("%s not found in abi, options are %s", sig, methods) - } - - if len(args) != len(method.Inputs) { - return fmt.Errorf("requires %d inputs but got %d for %s", len(method.Inputs), len(args), method.RawName) - } - - contractMethod := ContractMethod{ - Name: method.RawName, - Payable: method.Payable, - } - - inputValues := make(map[string]string) - contractInputs := make([]ContractInput, 0) - - for i, input := range method.Inputs { - contractInput, err := createContractInput(input, contractInputs) - if err != nil { - return err - } - contractMethod.Inputs = append(contractMethod.Inputs, contractInput...) - - str, err := stringifyArg(args[i]) - if err != nil { - return err - } - inputValues[input.Name] = str - } - - encoded, err := method.Inputs.PackValues(args) - if err != nil { - return err - } - data := make([]byte, len(method.ID)+len(encoded)) - copy(data, method.ID) - copy(data[len(method.ID):], encoded) - - batchTransaction := BatchTransaction{ - To: to, - Value: value, - Method: contractMethod, - InputValues: inputValues, - } - - if !b.SkipCalldata { - batchTransaction.Data = data - } - - b.Transactions = append(b.Transactions, batchTransaction) - - return nil -} - -// Check will check the batch for errors -func (b *Batch) Check() error { - for _, tx := range b.Transactions { - if err := tx.Check(); err != nil { - return err - } - } - return nil -} - -// bathcFileMarshaling is a helper type used for JSON marshaling. -type batchMarshaling struct { - Version string `json:"version"` - ChainID string `json:"chainId"` - CreatedAt uint64 `json:"createdAt"` - Meta BatchMeta `json:"meta"` - Transactions []BatchTransaction `json:"transactions"` -} - -// MarshalJSON will marshal a Batch to JSON. -func (b *Batch) MarshalJSON() ([]byte, error) { - batch := batchMarshaling{ - Version: b.Version, - CreatedAt: b.CreatedAt, - Meta: b.Meta, - Transactions: b.Transactions, - } - if b.ChainID != nil { - batch.ChainID = b.ChainID.String() - } - return json.Marshal(batch) -} - -// UnmarshalJSON will unmarshal a Batch from JSON. -func (b *Batch) UnmarshalJSON(data []byte) error { - var bf batchMarshaling - if err := json.Unmarshal(data, &bf); err != nil { - return err - } - b.Version = bf.Version - chainId, ok := new(big.Int).SetString(bf.ChainID, 10) - if !ok { - return fmt.Errorf("cannot set chainId to %s", bf.ChainID) - } - b.ChainID = chainId - b.CreatedAt = bf.CreatedAt - b.Meta = bf.Meta - b.Transactions = bf.Transactions - return nil -} - -// BatchMeta contains metadata about a Batch. Not all -// of the fields are required. -type BatchMeta struct { - TxBuilderVersion string `json:"txBuilderVersion,omitempty"` - Checksum string `json:"checksum,omitempty"` - CreatedFromSafeAddress string `json:"createdFromSafeAddress"` - CreatedFromOwnerAddress string `json:"createdFromOwnerAddress"` - Name string `json:"name"` - Description string `json:"description"` -} - -// BatchTransaction represents a single call in a tx-builder transaction. -type BatchTransaction struct { - To common.Address `json:"to"` - Value *big.Int `json:"value"` - Data []byte `json:"data"` - Method ContractMethod `json:"contractMethod"` - InputValues map[string]string `json:"contractInputsValues"` -} - -// Check will check the batch transaction for errors. -// An error is defined by: -// - incorrectly encoded calldata -// - mismatch in number of arguments -// It does not currently work on structs, will return no error if a "tuple" -// is used as an argument. Need to find a generic way to work with structs. -func (bt *BatchTransaction) Check() error { - if len(bt.Method.Inputs) != len(bt.InputValues) { - return fmt.Errorf("expected %d inputs but got %d", len(bt.Method.Inputs), len(bt.InputValues)) - } - - if len(bt.Data) > 0 && bt.Method.Name != "fallback" { - if len(bt.Data) < 4 { - return fmt.Errorf("must have at least 4 bytes of calldata, got %d", len(bt.Data)) - } - sig := bt.Signature() - selector := crypto.Keccak256([]byte(sig))[0:4] - if !bytes.Equal(bt.Data[0:4], selector) { - return fmt.Errorf("data does not match signature") - } - - // Check the calldata - values := make([]any, len(bt.Method.Inputs)) - for i, input := range bt.Method.Inputs { - value, ok := bt.InputValues[input.Name] - if !ok { - return fmt.Errorf("missing input %s", input.Name) - } - // Need to figure out better way to handle tuples in a generic way - if input.Type == "tuple" { - return nil - } - arg, err := unstringifyArg(value, input.Type) - if err != nil { - return err - } - values[i] = arg - } - - calldata, err := bt.Arguments().PackValues(values) - if err != nil { - return err - } - if !bytes.Equal(bt.Data[4:], calldata) { - return fmt.Errorf("calldata does not match inputs, expected %s, got %s", hexutil.Encode(bt.Data[4:]), hexutil.Encode(calldata)) - } - } - return nil -} - -// Signature returns the function signature of the batch transaction. -func (bt *BatchTransaction) Signature() string { - types := make([]string, len(bt.Method.Inputs)) - for i, input := range bt.Method.Inputs { - types[i] = buildFunctionSignature(input) - } - return fmt.Sprintf("%s(%s)", bt.Method.Name, strings.Join(types, ",")) -} - -func (bt *BatchTransaction) Arguments() abi.Arguments { - arguments := make(abi.Arguments, len(bt.Method.Inputs)) - for i, input := range bt.Method.Inputs { - serialized, err := json.Marshal(input) - if err != nil { - panic(err) - } - var arg abi.Argument - if err := json.Unmarshal(serialized, &arg); err != nil { - panic(err) - } - arguments[i] = arg - } - return arguments -} - -// UnmarshalJSON will unmarshal a BatchTransaction from JSON. -func (b *BatchTransaction) UnmarshalJSON(data []byte) error { - var bt batchTransactionMarshaling - if err := json.Unmarshal(data, &bt); err != nil { - return err - } - b.To = common.HexToAddress(bt.To) - b.Value = new(big.Int).SetUint64(bt.Value) - if bt.Data != nil { - b.Data = common.CopyBytes(*bt.Data) - } - b.Method = bt.Method - b.InputValues = bt.InputValues - return nil -} - -// MarshalJSON will marshal a BatchTransaction to JSON. -func (b *BatchTransaction) MarshalJSON() ([]byte, error) { - batch := batchTransactionMarshaling{ - To: b.To.Hex(), - Value: b.Value.Uint64(), - Method: b.Method, - InputValues: b.InputValues, - } - if len(b.Data) != 0 { - data := hexutil.Bytes(b.Data) - batch.Data = &data - } - return json.Marshal(batch) -} - -// batchTransactionMarshaling is a helper type used for JSON marshaling. -type batchTransactionMarshaling struct { - To string `json:"to"` - Value uint64 `json:"value,string"` - Data *hexutil.Bytes `json:"data"` - Method ContractMethod `json:"contractMethod"` - InputValues map[string]string `json:"contractInputsValues"` -} - -// ContractMethod represents a method call in a tx-builder transaction. -type ContractMethod struct { - Inputs []ContractInput `json:"inputs"` - Name string `json:"name"` - Payable bool `json:"payable"` -} - -// ContractInput represents an input to a contract method. -type ContractInput struct { - InternalType string `json:"internalType"` - Name string `json:"name"` - Type string `json:"type"` - Components []ContractInput `json:"components,omitempty"` -} diff --git a/op-chain-ops/safe/batch_helpers.go b/op-chain-ops/safe/batch_helpers.go deleted file mode 100644 index 171de2b0eeff..000000000000 --- a/op-chain-ops/safe/batch_helpers.go +++ /dev/null @@ -1,208 +0,0 @@ -package safe - -import ( - "fmt" - "math/big" - "reflect" - "strconv" - "strings" - - "github.com/ethereum/go-ethereum/accounts/abi" - "github.com/ethereum/go-ethereum/common" - "github.com/ethereum/go-ethereum/common/hexutil" -) - -// stringifyArg converts a Go type to a string that is representable by ABI. -// To do so, this function must be recursive to handle nested tuples. -func stringifyArg(argument any) (string, error) { - switch arg := argument.(type) { - case common.Address: - return arg.String(), nil - case *common.Address: - return arg.String(), nil - case *big.Int: - return arg.String(), nil - case big.Int: - return arg.String(), nil - case bool: - if arg { - return "true", nil - } - return "false", nil - case int64: - return strconv.FormatInt(arg, 10), nil - case int32: - return strconv.FormatInt(int64(arg), 10), nil - case int16: - return strconv.FormatInt(int64(arg), 10), nil - case int8: - return strconv.FormatInt(int64(arg), 10), nil - case int: - return strconv.FormatInt(int64(arg), 10), nil - case uint64: - return strconv.FormatUint(uint64(arg), 10), nil - case uint32: - return strconv.FormatUint(uint64(arg), 10), nil - case uint16: - return strconv.FormatUint(uint64(arg), 10), nil - case uint8: - return strconv.FormatUint(uint64(arg), 10), nil - case uint: - return strconv.FormatUint(uint64(arg), 10), nil - case []byte: - return hexutil.Encode(arg), nil - case []any: - ret := make([]string, len(arg)) - for i, v := range arg { - str, err := stringifyArg(v) - if err != nil { - return "", err - } - ret[i] = str - } - return "[" + strings.Join(ret, ",") + "]", nil - default: - typ := reflect.TypeOf(argument) - if typ.Kind() == reflect.Ptr { - typ = typ.Elem() - } - - if typ.Kind() == reflect.Struct { - v := reflect.ValueOf(argument) - numField := v.NumField() - ret := make([]string, numField) - - for i := 0; i < numField; i++ { - val := v.Field(i).Interface() - str, err := stringifyArg(val) - if err != nil { - return "", err - } - ret[i] = str - } - - return "[" + strings.Join(ret, ",") + "]", nil - } - - return "", fmt.Errorf("unknown type as argument: %T", arg) - } -} - -// unstringifyArg converts a string to a Go type. -func unstringifyArg(arg string, typ string) (any, error) { - switch typ { - case "address": - return common.HexToAddress(arg), nil - case "bool": - return strconv.ParseBool(arg) - case "uint8": - val, err := strconv.ParseUint(arg, 10, 8) - return uint8(val), err - case "uint16": - val, err := strconv.ParseUint(arg, 10, 16) - return uint16(val), err - case "uint32": - val, err := strconv.ParseUint(arg, 10, 32) - return uint32(val), err - case "uint64": - val, err := strconv.ParseUint(arg, 10, 64) - return val, err - case "int8": - val, err := strconv.ParseInt(arg, 10, 8) - return val, err - case "int16": - val, err := strconv.ParseInt(arg, 10, 16) - return val, err - case "int32": - val, err := strconv.ParseInt(arg, 10, 32) - return val, err - case "int64": - val, err := strconv.ParseInt(arg, 10, 64) - return val, err - case "uint256", "int256": - val, ok := new(big.Int).SetString(arg, 10) - if !ok { - return nil, fmt.Errorf("failed to parse %s as big.Int", arg) - } - return val, nil - case "string": - return arg, nil - case "bytes": - return hexutil.Decode(arg) - default: - return nil, fmt.Errorf("unknown type: %s", typ) - } -} - -// createContractInput converts an abi.Argument to one or more ContractInputs. -func createContractInput(input abi.Argument, inputs []ContractInput) ([]ContractInput, error) { - inputType, err := stringifyType(input.Type) - if err != nil { - return nil, err - } - - internalType := input.Type.String() - if input.Type.T == abi.TupleTy { - internalType = input.Type.TupleRawName - } - - components := make([]ContractInput, 0) - for i, elem := range input.Type.TupleElems { - e := *elem - arg := abi.Argument{ - Name: input.Type.TupleRawNames[i], - Type: e, - } - component, err := createContractInput(arg, inputs) - if err != nil { - return nil, err - } - components = append(components, component...) - } - - contractInput := ContractInput{ - InternalType: internalType, - Name: input.Name, - Type: inputType, - Components: components, - } - - inputs = append(inputs, contractInput) - - return inputs, nil -} - -// stringifyType turns an abi.Type into a string -func stringifyType(t abi.Type) (string, error) { - switch t.T { - case abi.TupleTy: - return "tuple", nil - case abi.BoolTy: - return t.String(), nil - case abi.AddressTy: - return t.String(), nil - case abi.UintTy: - return t.String(), nil - case abi.IntTy: - return t.String(), nil - case abi.StringTy: - return t.String(), nil - case abi.BytesTy: - return t.String(), nil - default: - return "", fmt.Errorf("unknown type: %d", t.T) - } -} - -// buildFunctionSignature builds a function signature from a ContractInput. -// It is recursive to handle tuples. -func buildFunctionSignature(input ContractInput) string { - if input.Type == "tuple" { - types := make([]string, len(input.Components)) - for i, component := range input.Components { - types[i] = buildFunctionSignature(component) - } - return fmt.Sprintf("(%s)", strings.Join(types, ",")) - } - return input.InternalType -} diff --git a/op-chain-ops/safe/batch_test.go b/op-chain-ops/safe/batch_test.go deleted file mode 100644 index e92019b1ed2b..000000000000 --- a/op-chain-ops/safe/batch_test.go +++ /dev/null @@ -1,156 +0,0 @@ -package safe - -import ( - "bytes" - "encoding/json" - "errors" - "math/big" - "os" - "testing" - - "github.com/ethereum-optimism/optimism/op-chain-ops/upgrades/bindings" - - "github.com/ethereum/go-ethereum/accounts/abi" - "github.com/ethereum/go-ethereum/common" - - "github.com/stretchr/testify/require" -) - -func TestBatchJSONPrepareBedrock(t *testing.T) { - testBatchJSON(t, "testdata/batch-prepare-bedrock.json") -} - -func TestBatchJSONL2OO(t *testing.T) { - testBatchJSON(t, "testdata/l2-output-oracle.json") -} - -func testBatchJSON(t *testing.T, path string) { - b, err := os.ReadFile(path) - require.NoError(t, err) - dec := json.NewDecoder(bytes.NewReader(b)) - decoded := new(Batch) - require.NoError(t, dec.Decode(decoded)) - data, err := json.Marshal(decoded) - require.NoError(t, err) - require.JSONEq(t, string(b), string(data)) -} - -// TestBatchAddCallFinalizeWithdrawalTransaction ensures that structs can be serialized correctly. -func TestBatchAddCallFinalizeWithdrawalTransaction(t *testing.T) { - file, err := os.ReadFile("testdata/portal-abi.json") - require.NoError(t, err) - portalABI, err := abi.JSON(bytes.NewReader(file)) - require.NoError(t, err) - - sig := "finalizeWithdrawalTransaction" - argument := []any{ - bindings.TypesWithdrawalTransaction{ - Nonce: big.NewInt(0), - Sender: common.Address{19: 0x01}, - Target: common.Address{19: 0x02}, - Value: big.NewInt(1), - GasLimit: big.NewInt(2), - Data: []byte{}, - }, - } - - batch := new(Batch) - to := common.Address{19: 0x01} - value := big.NewInt(222) - - require.NoError(t, batch.AddCall(to, value, sig, argument, &portalABI)) - require.NoError(t, batch.Check()) - require.Equal(t, batch.Transactions[0].Signature(), "finalizeWithdrawalTransaction((uint256,address,address,uint256,uint256,bytes))") - - expected, err := os.ReadFile("testdata/finalize-withdrawal-tx.json") - require.NoError(t, err) - - serialized, err := json.Marshal(batch) - require.NoError(t, err) - require.JSONEq(t, string(expected), string(serialized)) -} - -// 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)) - require.NoError(t, err) - - batch := new(Batch) - to := common.Address{19: 0x01} - value := big.NewInt(222) - sig := "depositTransaction" - argument := []any{ - common.Address{01}, - big.NewInt(2), - uint64(100), - false, - []byte{}, - } - - require.NoError(t, batch.AddCall(to, value, sig, argument, &portalABI)) - require.NoError(t, batch.Check()) - require.Equal(t, batch.Transactions[0].Signature(), "depositTransaction(address,uint256,uint64,bool,bytes)") - - expected, err := os.ReadFile("testdata/deposit-tx.json") - require.NoError(t, err) - - serialized, err := json.Marshal(batch) - require.NoError(t, err) - require.JSONEq(t, string(expected), string(serialized)) -} - -// TestBatchCheck checks for the various failure cases of Batch.Check -// as well as a simple check for a valid batch. -func TestBatchCheck(t *testing.T) { - cases := []struct { - name string - bt BatchTransaction - err error - }{ - { - name: "bad-input-count", - bt: BatchTransaction{ - Method: ContractMethod{}, - InputValues: map[string]string{ - "foo": "bar", - }, - }, - err: errors.New("expected 0 inputs but got 1"), - }, - { - name: "bad-calldata-too-small", - bt: BatchTransaction{ - Data: []byte{0x01}, - }, - err: errors.New("must have at least 4 bytes of calldata, got 1"), - }, - { - name: "bad-calldata-mismatch", - bt: BatchTransaction{ - Data: []byte{0x01, 0x02, 0x03, 0x04}, - Method: ContractMethod{ - Name: "foo", - }, - }, - err: errors.New("data does not match signature"), - }, - { - name: "good-calldata", - bt: BatchTransaction{ - Data: []byte{0xc2, 0x98, 0x55, 0x78}, - Method: ContractMethod{ - Name: "foo", - }, - }, - err: nil, - }, - } - - for _, tc := range cases { - t.Run(tc.name, func(t *testing.T) { - require.Equal(t, tc.err, tc.bt.Check()) - }) - } -} diff --git a/op-chain-ops/safe/testdata/batch-prepare-bedrock.json b/op-chain-ops/safe/testdata/batch-prepare-bedrock.json deleted file mode 100644 index 978a0f160584..000000000000 --- a/op-chain-ops/safe/testdata/batch-prepare-bedrock.json +++ /dev/null @@ -1 +0,0 @@ -{"version":"1.0","chainId":"1","createdAt":1683299982633,"meta":{"name":"Transactions Batch","description":"","txBuilderVersion":"1.13.3","createdFromSafeAddress":"0xAB23dE0DbE0aedF356af3F815c8B47D88575D82d","createdFromOwnerAddress":"","checksum":"0x3be12fb2a12e07f516c3895194f8418c6640f27fb3324e4dc06dce337b7ae7c3"},"transactions":[{"to":"0x09AA72510eE2e1c705Dc4e2114b025a12E116bb8","value":"0","data":null,"contractMethod":{"inputs":[{"internalType":"address","name":"newOwner","type":"address"}],"name":"transferOwnership","payable":false},"contractInputsValues":{"newOwner":"0x3C0dD22068a69433938097ad335Cb44a9DBf5c1A"}},{"to":"0x20835fbB5Dcb9B9c3074C0780bB07790a7525f41","value":"0","data":null,"contractMethod":{"inputs":[{"internalType":"address","name":"newOwner","type":"address"}],"name":"transferOwnership","payable":false},"contractInputsValues":{"newOwner":"0x3C0dD22068a69433938097ad335Cb44a9DBf5c1A"}},{"to":"0xcAC4CDD0C2D87e65710C87dE3955974d6a0b6940","value":"0","data":null,"contractMethod":{"inputs":[{"internalType":"address","name":"_owner","type":"address"}],"name":"setOwner","payable":false},"contractInputsValues":{"_owner":"0x3C0dD22068a69433938097ad335Cb44a9DBf5c1A"}},{"to":"0xE1229AbA7DC7e74C9995254bbaa40bedDB0B8B4d","value":"0","data":null,"contractMethod":{"inputs":[{"internalType":"address","name":"_admin","type":"address"}],"name":"changeAdmin","payable":false},"contractInputsValues":{"_admin":"0x3C0dD22068a69433938097ad335Cb44a9DBf5c1A"}}]} \ No newline at end of file diff --git a/op-chain-ops/safe/testdata/deposit-tx.json b/op-chain-ops/safe/testdata/deposit-tx.json deleted file mode 100644 index 3847cd2b16a6..000000000000 --- a/op-chain-ops/safe/testdata/deposit-tx.json +++ /dev/null @@ -1,56 +0,0 @@ -{ - "version": "", - "chainId": "", - "createdAt": 0, - "meta": { - "createdFromSafeAddress": "", - "createdFromOwnerAddress": "", - "name": "", - "description": "" - }, - "transactions": [ - { - "to": "0x0000000000000000000000000000000000000001", - "value": "222", - "data": "0xe9e05c42000000000000000000000000010000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000020000000000000000000000000000000000000000000000000000000000000064000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000a00000000000000000000000000000000000000000000000000000000000000000", - "contractMethod": { - "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", - "payable": false - }, - "contractInputsValues": { - "_data": "0x", - "_gasLimit": "100", - "_isCreation": "false", - "_to": "0x0100000000000000000000000000000000000000", - "_value": "2" - } - } - ] - } diff --git a/op-chain-ops/safe/testdata/finalize-withdrawal-tx.json b/op-chain-ops/safe/testdata/finalize-withdrawal-tx.json deleted file mode 100644 index 0d4da7846cb5..000000000000 --- a/op-chain-ops/safe/testdata/finalize-withdrawal-tx.json +++ /dev/null @@ -1,64 +0,0 @@ -{ - "version": "", - "chainId": "", - "createdAt": 0, - "meta": { - "createdFromSafeAddress": "", - "createdFromOwnerAddress": "", - "name": "", - "description": "" - }, - "transactions": [ - { - "to": "0x0000000000000000000000000000000000000001", - "value": "222", - "data": "0x8c3152e900000000000000000000000000000000000000000000000000000000000000200000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000100000000000000000000000000000000000000000000000000000000000000020000000000000000000000000000000000000000000000000000000000000001000000000000000000000000000000000000000000000000000000000000000200000000000000000000000000000000000000000000000000000000000000c00000000000000000000000000000000000000000000000000000000000000000", - "contractMethod": { - "inputs": [ - { - "internalType": "TypesWithdrawalTransaction", - "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" - } - ] - } - ], - "name": "finalizeWithdrawalTransaction", - "payable": false - }, - "contractInputsValues": { - "_tx": "[0,0x0000000000000000000000000000000000000001,0x0000000000000000000000000000000000000002,1,2,0x]" - } - } - ] -} diff --git a/op-chain-ops/safe/testdata/l2-output-oracle.json b/op-chain-ops/safe/testdata/l2-output-oracle.json deleted file mode 100644 index f0eee342a26f..000000000000 --- a/op-chain-ops/safe/testdata/l2-output-oracle.json +++ /dev/null @@ -1 +0,0 @@ -{"version":"1.0","chainId":"1","createdAt":1691808995527,"meta":{"name":"Transactions Batch","description":"","txBuilderVersion":"1.16.1","createdFromSafeAddress":"0xc9D26D376dD75573E0C3247C141881F053d27Ae8","createdFromOwnerAddress":"","checksum":"0x2a88db9ce20d2eb5a80910842e9e94d5870497af45986a6c1c7e2c91d15e34f0"},"transactions":[{"to":"0xE5FF3b57695079f808a24256734483CD3889fA9E","value":"0","data":null,"contractMethod":{"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","payable":true},"contractInputsValues":{"_outputRoot":"0x5398552529cbd710f485e297bcf15233b8475bdad43280c99334f65a1d4278ff","_l2BlockNumber":"0","_l1BlockHash":"0x01f814a4547c01c18c0eb8b96cff19bc5dc83b1d2d8a8bbb03206587f594c80a","_l1BlockNumber":"1"}},{"to":"0xE5FF3b57695079f808a24256734483CD3889fA9E","value":"0","data":null,"contractMethod":{"inputs":[{"internalType":"uint256","name":"_l2OutputIndex","type":"uint256"}],"name":"deleteL2Outputs","payable":false},"contractInputsValues":{"_l2OutputIndex":"2"}}]} \ No newline at end of file diff --git a/op-chain-ops/safe/testdata/portal-abi.json b/op-chain-ops/safe/testdata/portal-abi.json deleted file mode 100644 index 4ee86e3be7ce..000000000000 --- a/op-chain-ops/safe/testdata/portal-abi.json +++ /dev/null @@ -1,560 +0,0 @@ -[ - { - "inputs": [], - "stateMutability": "nonpayable", - "type": "constructor" - }, - { - "anonymous": false, - "inputs": [ - { - "indexed": false, - "internalType": "uint8", - "name": "version", - "type": "uint8" - } - ], - "name": "Initialized", - "type": "event" - }, - { - "anonymous": false, - "inputs": [ - { - "indexed": false, - "internalType": "address", - "name": "account", - "type": "address" - } - ], - "name": "Paused", - "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": false, - "internalType": "address", - "name": "account", - "type": "address" - } - ], - "name": "Unpaused", - "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": "GUARDIAN", - "outputs": [ - { - "internalType": "address", - "name": "", - "type": "address" - } - ], - "stateMutability": "view", - "type": "function" - }, - { - "inputs": [], - "name": "L2_ORACLE", - "outputs": [ - { - "internalType": "contract L2OutputOracle", - "name": "", - "type": "address" - } - ], - "stateMutability": "view", - "type": "function" - }, - { - "inputs": [], - "name": "SYSTEM_CONFIG", - "outputs": [ - { - "internalType": "contract SystemConfig", - "name": "", - "type": "address" - } - ], - "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": [], - "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": "address", - "name": "_guardian", - "type": "address" - }, - { - "internalType": "contract SystemConfig", - "name": "_systemConfig", - "type": "address" - }, - { - "internalType": "bool", - "name": "_paused", - "type": "bool" - } - ], - "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": "pause", - "outputs": [], - "stateMutability": "nonpayable", - "type": "function" - }, - { - "inputs": [], - "name": "paused", - "outputs": [ - { - "internalType": "bool", - "name": "", - "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": "systemConfig", - "outputs": [ - { - "internalType": "contract SystemConfig", - "name": "", - "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" - }, - { - "stateMutability": "payable", - "type": "receive" - } -] diff --git a/op-chain-ops/script/bindings.go b/op-chain-ops/script/bindings.go new file mode 100644 index 000000000000..724d9ca31fd7 --- /dev/null +++ b/op-chain-ops/script/bindings.go @@ -0,0 +1,188 @@ +package script + +import ( + "errors" + "fmt" + "reflect" + "strings" + + "github.com/ethereum/go-ethereum/accounts/abi" + "github.com/ethereum/go-ethereum/core/vm" +) + +// CallBackendFn is the function that encoded binding calls get made with. +// The function may return vm.ErrExecutionReverted to revert (revert is ABI decoded from data). +// Or any other error, where the return-data is then ignored. +type CallBackendFn func(data []byte) ([]byte, error) + +// MakeBindings turns a struct type with function-typed fields into EVM call bindings +// that are hooked up to the backend function. +// fields annotated with `evm:"-"` are ignored. +func MakeBindings[E any](backendFn CallBackendFn, + checkABI func(abiDef string) bool, +) (*E, error) { + v := new(E) + val := reflect.ValueOf(v) + err := hydrateBindingsStruct(val, backendFn, checkABI) + return v, err +} + +// hydrateBindingsStruct initializes a struct with function fields into +// a struct of ABI functions hooked up to the backend. +func hydrateBindingsStruct( + val reflect.Value, + backendFn CallBackendFn, + checkABI func(abiDef string) bool, +) error { + typ := val.Type() + if typ.Kind() == reflect.Pointer { + if val.IsNil() { + return errors.New("cannot hydrate nil pointer value") + } + val = val.Elem() + typ = val.Type() + } + if typ.Kind() != reflect.Struct { + return fmt.Errorf("object is not a struct: %s", typ) + } + // Hydrate each of the fields + fieldCount := val.NumField() + for i := 0; i < fieldCount; i++ { + fieldDef := typ.Field(i) + if !fieldDef.IsExported() { // ignore unexposed fields + continue + } + // ignore fields / embedded structs that are annotated with `evm:"-"` + if v, ok := fieldDef.Tag.Lookup("evm"); ok && v == "-" { + continue + } + if fieldDef.Anonymous { // fields of embedded structs will be hydrated too + if err := hydrateBindingsStruct(val.Field(i), backendFn, checkABI); err != nil { + return fmt.Errorf("failed to hydrate bindings of embedded field %q: %w", fieldDef.Name, err) + } + continue + } + if fieldDef.Type.Kind() != reflect.Func { // We can only hydrate fields with a function type + continue + } + fVal := val.Field(i) + if !fVal.IsNil() { + return fmt.Errorf("cannot hydrate bindings func, field %q is already set", fieldDef.Name) + } + if err := hydrateBindingsField(fVal, fieldDef, backendFn, checkABI); err != nil { + return fmt.Errorf("cannot hydrate bindings field %q: %w", fieldDef.Name, err) + } + } + return nil +} + +var ErrABICheck = errors.New("failed ABI check") + +// hydrateBindingsField initializes a struct field value to a function that calls the implied ABI function. +func hydrateBindingsField( + fVal reflect.Value, + fieldDef reflect.StructField, + backendFn CallBackendFn, + checkABI func(abiDef string) bool, +) error { + // derive the ABI function name from the field name + abiFunctionName := fieldDef.Name + if len(abiFunctionName) == 0 { + return errors.New("ABI method name must not be empty") + } + if lo := strings.ToLower(abiFunctionName[:1]); lo != abiFunctionName[:1] { + abiFunctionName = lo + abiFunctionName[1:] + } + + // derive the ABI function arguments from the function type + inArgs, err := makeArgs(fieldDef.Type.NumIn(), fieldDef.Type.In) + if err != nil { + return fmt.Errorf("failed to determine ABI types of input args: %w", err) + } + inArgTypes := makeArgTypes(inArgs) + methodSig := fmt.Sprintf("%v(%v)", abiFunctionName, strings.Join(inArgTypes, ",")) + + // check the ABI, if we can + if checkABI != nil { + if !checkABI(methodSig) { + return fmt.Errorf("function %s with signature %q is invalid: %w", fieldDef.Name, methodSig, ErrABICheck) + } + } + byte4Sig := bytes4(methodSig) + + // Define how we encode Go arguments as function calldata, including the function selector + inArgsEncodeFn := func(args []reflect.Value) ([]byte, error) { + vals := make([]interface{}, len(args)) + for i := range args { + vals[i] = args[i].Interface() + } + out, err := inArgs.PackValues(vals) + if err != nil { + return nil, fmt.Errorf("failed to encode call data: %w", err) + } + calldata := make([]byte, 0, len(out)+4) + calldata = append(calldata, byte4Sig[:]...) + calldata = append(calldata, out...) + return calldata, nil + } + // Determine how many arguments we decode from ABI, and if we have an error return case. + outArgCount := fieldDef.Type.NumOut() + errReturn := hasTrailingError(outArgCount, fieldDef.Type.Out) + var nilErrValue reflect.Value + if errReturn { + outArgCount -= 1 + nilErrValue = reflect.New(fieldDef.Type.Out(outArgCount)).Elem() + } + outArgs, err := makeArgs(outArgCount, fieldDef.Type.Out) + if err != nil { + return fmt.Errorf("failed to determine ABI types of output args: %w", err) + } + outAllocators := makeArgAllocators(outArgCount, fieldDef.Type.Out) + // Helper func to return an error with, where we try to fit it in the returned error value, if there is any. + returnErr := func(err error) []reflect.Value { + if !errReturn { + panic(fmt.Errorf("error, but cannot return as arg: %w", err)) + } + out := make([]reflect.Value, outArgCount+1) + for i := 0; i < outArgCount; i++ { + out[i] = reflect.New(fieldDef.Type.Out(i)).Elem() + } + out[outArgCount] = reflect.ValueOf(err) + return out + } + // Decodes the result of the backend into values to return as function, including error/revert handling. + outDecodeFn := func(result []byte, resultErr error) []reflect.Value { + if resultErr != nil { + // Empty return-data might happen on a regular description-less revert. No need to unpack in that case. + if len(result) > 0 && errors.Is(resultErr, vm.ErrExecutionReverted) { + msg, err := abi.UnpackRevert(result) + if err != nil { + return returnErr(fmt.Errorf("failed to unpack result args: %w", err)) + } + return returnErr(fmt.Errorf("revert: %s", msg)) + } + return returnErr(resultErr) + } + out := make([]reflect.Value, outArgCount, outArgCount+1) + err := abiToValues(outArgs, outAllocators, out, result) + if err != nil { + return returnErr(fmt.Errorf("failed to convert output to return values: %w", err)) + } + if errReturn { // don't forget the nil error value, to match the expected output arg count + out = append(out, nilErrValue) + } + return out + } + // Construct the actual Go function: it encodes the Go args, turns it into an ABI call, and decodes the results. + f := reflect.MakeFunc(fieldDef.Type, func(args []reflect.Value) (results []reflect.Value) { + input, err := inArgsEncodeFn(args) // ABI encode args + if err != nil { + return returnErr(fmt.Errorf("failed to encode input args: %w", err)) + } + result, err := backendFn(input) // call backend func + return outDecodeFn(result, err) // ABI decode result + }) + // Now hydrate the field definition with our new Go function + fVal.Set(f) + return nil +} diff --git a/op-chain-ops/script/bindings_test.go b/op-chain-ops/script/bindings_test.go new file mode 100644 index 000000000000..5fbc9f8f2c9f --- /dev/null +++ b/op-chain-ops/script/bindings_test.go @@ -0,0 +1,101 @@ +package script + +import ( + "errors" + "fmt" + "math/big" + "testing" + + "github.com/stretchr/testify/require" + + "github.com/ethereum/go-ethereum/common" +) + +type EmbeddedBindings struct { + Adder func(a uint8, b uint64) *big.Int +} + +type ExampleBindings struct { + DoThing func() error + EmbeddedBindings + Hello func(greeting string, target common.Address) string +} + +func TestBindings(t *testing.T) { + var testFn CallBackendFn + backendFn := func(data []byte) ([]byte, error) { + return testFn(data) // indirect call, so we can swap it per test case. + } + bindings, err := MakeBindings[ExampleBindings](backendFn, nil) + require.NoError(t, err) + + testFn = func(data []byte) ([]byte, error) { + require.Len(t, data, 4) + require.Equal(t, bytes4("doThing()"), [4]byte(data)) + return encodeRevert(errors.New("example revert")) + } + err = bindings.DoThing() + require.ErrorContains(t, err, "example revert") + + testFn = func(data []byte) ([]byte, error) { + require.Len(t, data, 4) + require.Equal(t, bytes4("doThing()"), [4]byte(data)) + return []byte{}, nil + } + err = bindings.DoThing() + require.NoError(t, err, "no revert") + + testFn = func(data []byte) ([]byte, error) { + require.Len(t, data, 4+32+32, "selector and two ABI args") + require.Equal(t, bytes4("adder(uint8,uint64)"), [4]byte(data[:4])) + a := new(big.Int).SetBytes(data[4 : 4+32]) + b := new(big.Int).SetBytes(data[4+32:]) + return leftPad32(new(big.Int).Add(a, b).Bytes()), nil + } + result := bindings.Adder(42, 0x1337) + require.NoError(t, err) + require.True(t, result.IsUint64()) + require.Equal(t, uint64(42+0x1337), result.Uint64()) +} + +type TestContract struct{} + +func (e *TestContract) Hello(greeting string, target common.Address) string { + return fmt.Sprintf("Test says: %s %s!", greeting, target) +} + +func TestPrecompileBindings(t *testing.T) { + contract, err := NewPrecompile[*TestContract](&TestContract{}) + require.NoError(t, err) + + bindings, err := MakeBindings[ExampleBindings](contract.Run, nil) + require.NoError(t, err) + + addr := common.HexToAddress("0xf39Fd6e51aad88F6F4ce6aB8827279cffFb92266") + response := bindings.Hello("Hola", addr) + require.Equal(t, fmt.Sprintf("Test says: Hola %s!", addr), response) +} + +func TestBindingsABICheck(t *testing.T) { + fn := CallBackendFn(func(data []byte) ([]byte, error) { + panic("should not run") + }) + needABI := map[string]struct{}{ + "doThing()": {}, + "adder(uint8,uint64)": {}, + "hello(string,address)": {}, + } + gotABI := make(map[string]struct{}) + abiCheckFn := func(abiDef string) bool { + _, ok := needABI[abiDef] + gotABI[abiDef] = struct{}{} + return ok + } + _, err := MakeBindings[ExampleBindings](fn, abiCheckFn) + require.NoError(t, err) + require.Equal(t, needABI, gotABI, "checked all ABI methods") + + delete(needABI, "doThing()") + _, err = MakeBindings[ExampleBindings](fn, abiCheckFn) + require.ErrorIs(t, err, ErrABICheck) +} diff --git a/op-chain-ops/script/cheatcodes.go b/op-chain-ops/script/cheatcodes.go new file mode 100644 index 000000000000..07755e527314 --- /dev/null +++ b/op-chain-ops/script/cheatcodes.go @@ -0,0 +1,8 @@ +package script + +// CheatCodesPrecompile implements the Forge vm cheatcodes. +// Note that forge-std wraps these cheatcodes, +// and provides additional convenience functions that use these cheatcodes. +type CheatCodesPrecompile struct { + h *Host +} diff --git a/op-chain-ops/script/cheatcodes_environment.go b/op-chain-ops/script/cheatcodes_environment.go new file mode 100644 index 000000000000..92baa429010e --- /dev/null +++ b/op-chain-ops/script/cheatcodes_environment.go @@ -0,0 +1,232 @@ +package script + +import ( + "bytes" + "math/big" + + "github.com/holiman/uint256" + + "github.com/ethereum/go-ethereum/common" + "github.com/ethereum/go-ethereum/core/tracing" + "github.com/ethereum/go-ethereum/core/types" + "github.com/ethereum/go-ethereum/core/vm" +) + +// Warp implements https://book.getfoundry.sh/cheatcodes/warp +func (c *CheatCodesPrecompile) Warp(timestamp *big.Int) { + c.h.env.Context.Time = timestamp.Uint64() +} + +// Roll implements https://book.getfoundry.sh/cheatcodes/roll +func (c *CheatCodesPrecompile) Roll(num *big.Int) { + c.h.env.Context.BlockNumber = num +} + +// Fee implements https://book.getfoundry.sh/cheatcodes/fee +func (c *CheatCodesPrecompile) Fee(fee *big.Int) { + c.h.env.Context.BaseFee = fee +} + +// GetBlockTimestamp implements https://book.getfoundry.sh/cheatcodes/get-block-timestamp +func (c *CheatCodesPrecompile) GetBlockTimestamp() *big.Int { + return new(big.Int).SetUint64(c.h.env.Context.Time) +} + +// GetBlockNumber implements https://book.getfoundry.sh/cheatcodes/get-block-number +func (c *CheatCodesPrecompile) GetBlockNumber() *big.Int { + return c.h.env.Context.BlockNumber +} + +// Difficulty implements https://book.getfoundry.sh/cheatcodes/difficulty +func (c *CheatCodesPrecompile) Difficulty(_ *big.Int) error { + return vm.ErrExecutionReverted // only post-merge is supported +} + +// Prevrandao implements https://book.getfoundry.sh/cheatcodes/prevrandao +func (c *CheatCodesPrecompile) Prevrandao(v [32]byte) { + c.h.env.Context.Random = (*common.Hash)(&v) +} + +// ChainId implements https://book.getfoundry.sh/cheatcodes/chain-id +func (c *CheatCodesPrecompile) ChainId(id *big.Int) { + c.h.env.ChainConfig().ChainID = id + c.h.chainCfg.ChainID = id + // c.h.env.rules.ChainID is unused, but should maybe also be modified +} + +// Store implements https://book.getfoundry.sh/cheatcodes/store +func (c *CheatCodesPrecompile) Store(account common.Address, slot [32]byte, value [32]byte) { + c.h.state.SetState(account, slot, value) +} + +// Load implements https://book.getfoundry.sh/cheatcodes/load +func (c *CheatCodesPrecompile) Load(account common.Address, slot [32]byte) [32]byte { + return c.h.state.GetState(account, slot) +} + +// Etch implements https://book.getfoundry.sh/cheatcodes/etch +func (c *CheatCodesPrecompile) Etch(who common.Address, code []byte) { + c.h.state.SetCode(who, bytes.Clone(code)) // important to clone; geth EVM will reuse the calldata memory. +} + +// Deal implements https://book.getfoundry.sh/cheatcodes/deal +func (c *CheatCodesPrecompile) Deal(who common.Address, newBalance *big.Int) { + c.h.state.SetBalance(who, uint256.MustFromBig(newBalance), tracing.BalanceChangeUnspecified) +} + +// Prank_ca669fa7 implements https://book.getfoundry.sh/cheatcodes/prank +func (c *CheatCodesPrecompile) Prank_ca669fa7(sender common.Address) error { + return c.h.Prank(&sender, nil, false, false) +} + +// Prank_47e50cce implements https://book.getfoundry.sh/cheatcodes/prank +func (c *CheatCodesPrecompile) Prank_47e50cce(sender common.Address, origin common.Address) error { + return c.h.Prank(&sender, &origin, false, false) +} + +// StartPrank_06447d56 implements https://book.getfoundry.sh/cheatcodes/start-prank +func (c *CheatCodesPrecompile) StartPrank_06447d56(sender common.Address) error { + return c.h.Prank(&sender, nil, true, false) +} + +// StartPrank_45b56078 implements https://book.getfoundry.sh/cheatcodes/start-prank +func (c *CheatCodesPrecompile) StartPrank_45b56078(sender common.Address, origin common.Address) error { + return c.h.Prank(&sender, &origin, true, false) +} + +// StopPrank implements https://book.getfoundry.sh/cheatcodes/stop-prank +func (c *CheatCodesPrecompile) StopPrank() error { + return c.h.StopPrank(false) +} + +// ReadCallers implements https://book.getfoundry.sh/cheatcodes/read-callers +func (c *CheatCodesPrecompile) ReadCallers() (callerMode *big.Int, msgSender common.Address, txOrigin common.Address) { + return c.h.CallerMode().Big(), c.h.MsgSender(), c.h.env.TxContext.Origin +} + +// Record implements https://book.getfoundry.sh/cheatcodes/record +func (c *CheatCodesPrecompile) Record() error { + panic("vm.record not supported") +} + +// Accesses implements https://book.getfoundry.sh/cheatcodes/accesses +func (c *CheatCodesPrecompile) Accesses() (reads [][32]byte, writes [][32]byte, err error) { + panic("vm.accesses not supported") +} + +// RecordLogs implements https://book.getfoundry.sh/cheatcodes/record-logs +func (c *CheatCodesPrecompile) RecordLogs() error { + panic("vm.recordLogs not supported") +} + +type Log struct { + Topics [][32]byte + Data []byte + Emitter common.Address +} + +// GetRecordedLogs implements https://book.getfoundry.sh/cheatcodes/get-recorded-logs +//func (c *CheatCodesPrecompile) GetRecordedLogs() []Log { +// return nil // TODO +//} + +// SetNonce implements https://book.getfoundry.sh/cheatcodes/set-nonce +func (c *CheatCodesPrecompile) SetNonce(account common.Address, nonce uint64) { + c.h.state.SetNonce(account, nonce) +} + +// GetNonce implements https://book.getfoundry.sh/cheatcodes/get-nonce +func (c *CheatCodesPrecompile) GetNonce(addr common.Address) uint64 { + return c.h.state.GetNonce(addr) +} + +func (c *CheatCodesPrecompile) ResetNonce(addr common.Address) { + // Undocumented cheatcode of forge, but used a lot. + // Resets nonce to 0 if EOA, or 1 if contract. + // In scripts often set code to empty first when using it, it then becomes 0. + if c.h.state.GetCodeHash(addr) == types.EmptyCodeHash { + c.h.state.SetNonce(addr, 0) + } else { + c.h.state.SetNonce(addr, 1) + } +} + +// MockCall_b96213e4 implements https://book.getfoundry.sh/cheatcodes/mock-call +func (c *CheatCodesPrecompile) MockCall_b96213e4(where common.Address, data []byte, retdata []byte) error { + panic("mockCall not supported") +} + +// MockCall_81409b91 implements https://book.getfoundry.sh/cheatcodes/mock-call +func (c *CheatCodesPrecompile) MockCall_81409b91(where common.Address, value *big.Int, data []byte, retdata []byte) error { + panic("vm.mockCall not supported") +} + +// MockCallRevert_dbaad147 implements https://book.getfoundry.sh/cheatcodes/mock-call-revert +func (c *CheatCodesPrecompile) MockCallRevert_dbaad147(where common.Address, data []byte, retdata []byte) error { + panic("vm.mockCall not supported") +} + +// MockCallRevert_d23cd037 implements https://book.getfoundry.sh/cheatcodes/mock-call-revert +func (c *CheatCodesPrecompile) MockCallRevert_d23cd037(where common.Address, value *big.Int, data []byte, retdata []byte) error { + panic("vm.mockCall not supported") +} + +// ClearMockedCalls implements https://book.getfoundry.sh/cheatcodes/clear-mocked-calls +func (c *CheatCodesPrecompile) ClearMockedCalls() error { + panic("vm.clearMockedCalls not supported") +} + +// Coinbase implements https://book.getfoundry.sh/cheatcodes/coinbase +func (c *CheatCodesPrecompile) Coinbase(addr common.Address) { + c.h.env.Context.Coinbase = addr +} + +// Broadcast_afc98040 implements https://book.getfoundry.sh/cheatcodes/broadcast +func (c *CheatCodesPrecompile) Broadcast_afc98040() error { + return c.h.Prank(nil, nil, false, true) +} + +// Broadcast_e6962cdb implements https://book.getfoundry.sh/cheatcodes/broadcast +func (c *CheatCodesPrecompile) Broadcast_e6962cdb(who common.Address) error { + return c.h.Prank(&who, nil, false, true) +} + +// StartBroadcast_7fb5297f implements https://book.getfoundry.sh/cheatcodes/start-broadcast +func (c *CheatCodesPrecompile) StartBroadcast_7fb5297f() error { + return c.h.Prank(nil, nil, true, true) +} + +// StartBroadcast_7fec2a8d implements https://book.getfoundry.sh/cheatcodes/start-broadcast +func (c *CheatCodesPrecompile) StartBroadcast_7fec2a8d(who common.Address) error { + return c.h.Prank(&who, nil, true, true) +} + +// StopBroadcast implements https://book.getfoundry.sh/cheatcodes/stop-broadcast +func (c *CheatCodesPrecompile) StopBroadcast() error { + return c.h.StopPrank(true) +} + +// PauseGasMetering implements https://book.getfoundry.sh/cheatcodes/pause-gas-metering +func (c *CheatCodesPrecompile) PauseGasMetering() error { + panic("vm.pauseGasMetering not supported") +} + +// ResumeGasMetering implements https://book.getfoundry.sh/cheatcodes/resume-gas-metering +func (c *CheatCodesPrecompile) ResumeGasMetering() error { + panic("vm.resumeGasMetering not supported") +} + +// TxGasPrice implements https://book.getfoundry.sh/cheatcodes/tx-gas-price +func (c *CheatCodesPrecompile) TxGasPrice(newGasPrice *big.Int) { + c.h.env.TxContext.GasPrice = newGasPrice +} + +// StartStateDiffRecording implements https://book.getfoundry.sh/cheatcodes/start-state-diff-recording +func (c *CheatCodesPrecompile) StartStateDiffRecording() error { + panic("vm.startStateDiffRecording not supported") +} + +// StopAndReturnStateDiff implements https://book.getfoundry.sh/cheatcodes/stop-and-return-state-diff +func (c *CheatCodesPrecompile) StopAndReturnStateDiff() error { + panic("vm.stopAndReturnStateDiff not supported") +} diff --git a/op-chain-ops/script/cheatcodes_external.go b/op-chain-ops/script/cheatcodes_external.go new file mode 100644 index 000000000000..afb42de58f65 --- /dev/null +++ b/op-chain-ops/script/cheatcodes_external.go @@ -0,0 +1,533 @@ +package script + +import ( + "bytes" + "encoding/json" + "errors" + "fmt" + "math/big" + "strconv" + "strings" + "time" + + "github.com/BurntSushi/toml" + "golang.org/x/exp/maps" + + "github.com/ethereum/go-ethereum/common" + "github.com/ethereum/go-ethereum/common/hexutil" + "github.com/ethereum/go-ethereum/core/vm" + + "github.com/ethereum-optimism/optimism/op-chain-ops/foundry" +) + +// Ffi implements https://book.getfoundry.sh/cheatcodes/ffi +func (c *CheatCodesPrecompile) Ffi(args []string) ([]byte, error) { + return nil, vm.ErrExecutionReverted +} + +// Prompt implements https://book.getfoundry.sh/cheatcodes/prompt +func (c *CheatCodesPrecompile) Prompt() error { + return vm.ErrExecutionReverted +} + +// ProjectRoot implements https://book.getfoundry.sh/cheatcodes/project-root +func (c *CheatCodesPrecompile) ProjectRoot() string { + return "" +} + +func (c *CheatCodesPrecompile) getArtifact(input string) (*foundry.Artifact, error) { + // fetching by relative file path, or using a contract version, is not supported + parts := strings.SplitN(input, ":", 2) + name := parts[0] + ".sol" + contract := parts[0] + if len(parts) == 2 { + name = parts[0] + contract = parts[1] + } + return c.h.af.ReadArtifact(name, contract) +} + +// GetCode implements https://book.getfoundry.sh/cheatcodes/get-code +func (c *CheatCodesPrecompile) GetCode(input string) ([]byte, error) { + artifact, err := c.getArtifact(input) + if err != nil { + return nil, err + } + return bytes.Clone(artifact.Bytecode.Object), nil +} + +// GetDeployedCode implements https://book.getfoundry.sh/cheatcodes/get-deployed-code +func (c *CheatCodesPrecompile) GetDeployedCode(input string) ([]byte, error) { + artifact, err := c.getArtifact(input) + if err != nil { + return nil, err + } + return bytes.Clone(artifact.DeployedBytecode.Object), nil +} + +// Sleep implements https://book.getfoundry.sh/cheatcodes/sleep +func (c *CheatCodesPrecompile) Sleep(ms *big.Int) error { + if !ms.IsUint64() { + return vm.ErrExecutionReverted + } + time.Sleep(time.Duration(ms.Uint64()) * time.Millisecond) + return nil +} + +// UnixTime implements https://book.getfoundry.sh/cheatcodes/unix-time +func (c *CheatCodesPrecompile) UnixTime() (ms *big.Int) { + return big.NewInt(time.Now().UnixMilli()) +} + +// SetEnv implements https://book.getfoundry.sh/cheatcodes/set-env +func (c *CheatCodesPrecompile) SetEnv(key string, value string) error { + if key == "" { + return errors.New("env key must not be empty") + } + if strings.ContainsRune(key, '=') { + return errors.New("env key must not contain = sign") + } + if strings.ContainsRune(key, 0) { + return errors.New("env key must not contain NUL") + } + if strings.ContainsRune(value, 0) { + return errors.New("env value must not contain NUL") + } + c.h.SetEnvVar(key, value) + return nil +} + +// helper function for EnvOr, implements https://book.getfoundry.sh/cheatcodes/env-or +func envOrSingular[E any](key string, + getFn func(key string) (string, bool), + fn func(v string) (E, error), + defaultValue E, +) (out E, err error) { + envValue, ok := getFn(key) + if !ok { + return defaultValue, nil + } + v, err := fn(envValue) + if err != nil { + return out, fmt.Errorf("failed to parse env var %q: %w", key, err) + } + return v, nil +} + +// helper function for EnvOr, implements https://book.getfoundry.sh/cheatcodes/env-or +func envOrList[E any](key string, + getFn func(key string) (string, bool), + delimiter string, fn func(v string) (E, error), + defaultValues []E, +) ([]E, error) { + envValue, ok := getFn(key) + if !ok { + return defaultValues, nil + } + parts := strings.Split(envValue, delimiter) + out := make([]E, len(parts)) + for i, p := range parts { + v, err := fn(p) + if err != nil { + return nil, fmt.Errorf("failed to parse entry %d of envVar %q: %w", i, key, err) + } + out[i] = v + } + return out, nil +} + +func (c *CheatCodesPrecompile) EnvOr_4777f3cf(key string, defaultValue bool) (bool, error) { + return envOrSingular[bool](key, c.h.GetEnvVar, c.ParseBool, defaultValue) +} +func (c *CheatCodesPrecompile) EnvOr_5e97348f(key string, defaultValue *big.Int) (*big.Int, error) { + return envOrSingular[*big.Int](key, c.h.GetEnvVar, c.ParseUint, defaultValue) +} +func (c *CheatCodesPrecompile) EnvOr_bbcb713e(key string, defaultValue *ABIInt256) (*ABIInt256, error) { + return envOrSingular[*ABIInt256](key, c.h.GetEnvVar, c.ParseInt, defaultValue) +} +func (c *CheatCodesPrecompile) EnvOr_561fe540(key string, defaultValue common.Address) (common.Address, error) { + return envOrSingular[common.Address](key, c.h.GetEnvVar, c.ParseAddress, defaultValue) +} +func (c *CheatCodesPrecompile) EnvOr_b4a85892(key string, defaultValue [32]byte) ([32]byte, error) { + return envOrSingular[[32]byte](key, c.h.GetEnvVar, c.ParseBytes32, defaultValue) +} +func (c *CheatCodesPrecompile) EnvOr_d145736c(key string, defaultValue string) (string, error) { + return envOrSingular[string](key, c.h.GetEnvVar, func(v string) (string, error) { + return v, nil + }, defaultValue) +} +func (c *CheatCodesPrecompile) EnvOr_b3e47705(key string, defaultValue []byte) ([]byte, error) { + return envOrSingular[[]byte](key, c.h.GetEnvVar, c.ParseBytes, defaultValue) +} + +func (c *CheatCodesPrecompile) EnvOr_eb85e83b(key string, delimiter string, defaultValue []bool) ([]bool, error) { + return envOrList[bool](key, c.h.GetEnvVar, delimiter, c.ParseBool, defaultValue) +} +func (c *CheatCodesPrecompile) EnvOr_74318528(key string, delimiter string, defaultValue []*big.Int) ([]*big.Int, error) { + return envOrList[*big.Int](key, c.h.GetEnvVar, delimiter, c.ParseUint, defaultValue) +} +func (c *CheatCodesPrecompile) EnvOr_4700d74b(key string, delimiter string, defaultValue []*ABIInt256) ([]*ABIInt256, error) { + return envOrList[*ABIInt256](key, c.h.GetEnvVar, delimiter, c.ParseInt, defaultValue) +} +func (c *CheatCodesPrecompile) EnvOr_c74e9deb(key string, delimiter string, defaultValue []common.Address) ([]common.Address, error) { + return envOrList[common.Address](key, c.h.GetEnvVar, delimiter, c.ParseAddress, defaultValue) +} +func (c *CheatCodesPrecompile) EnvOr_2281f367(key string, delimiter string, defaultValue [][32]byte) ([][32]byte, error) { + return envOrList[[32]byte](key, c.h.GetEnvVar, delimiter, c.ParseBytes32, defaultValue) +} +func (c *CheatCodesPrecompile) EnvOr_859216bc(key string, delimiter string, defaultValue []string) ([]string, error) { + return envOrList[string](key, c.h.GetEnvVar, delimiter, func(v string) (string, error) { + return v, nil + }, defaultValue) +} +func (c *CheatCodesPrecompile) EnvOr_64bc3e64(key string, delimiter string, defaultValue [][]byte) ([][]byte, error) { + return envOrList[[]byte](key, c.h.GetEnvVar, delimiter, c.ParseBytes, defaultValue) +} + +func envSingular[E any](key string, + getFn func(key string) (string, bool), + fn func(v string) (E, error), +) (out E, err error) { + envValue, ok := getFn(key) + if !ok { + return out, fmt.Errorf("environment variable %q not found", key) + } + v, err := fn(envValue) + if err != nil { + return out, fmt.Errorf("failed to parse env var %q: %w", key, err) + } + return v, nil +} + +func envList[E any](key string, + getFn func(key string) (string, bool), + delimiter string, fn func(v string) (E, error), +) ([]E, error) { + envValue, ok := getFn(key) + if !ok { + return nil, fmt.Errorf("environment variable %q not found", key) + } + parts := strings.Split(envValue, delimiter) + out := make([]E, len(parts)) + for i, p := range parts { + v, err := fn(p) + if err != nil { + return nil, fmt.Errorf("failed to parse entry %d of envVar %q: %w", i, key, err) + } + out[i] = v + } + return out, nil +} + +// EnvBool implements https://book.getfoundry.sh/cheatcodes/env-bool +func (c *CheatCodesPrecompile) EnvBool_7ed1ec7d(key string) (bool, error) { + return envSingular[bool](key, c.h.GetEnvVar, c.ParseBool) +} + +func (c *CheatCodesPrecompile) EnvBool_aaaddeaf(key string, delimiter string) ([]bool, error) { + return envList[bool](key, c.h.GetEnvVar, delimiter, c.ParseBool) +} + +// EnvUint implements https://book.getfoundry.sh/cheatcodes/env-uint +func (c *CheatCodesPrecompile) EnvUint_c1978d1f(key string) (*big.Int, error) { + return envSingular[*big.Int](key, c.h.GetEnvVar, c.ParseUint) +} + +func (c *CheatCodesPrecompile) EnvUint_f3dec099(key string, delimiter string) ([]*big.Int, error) { + return envList[*big.Int](key, c.h.GetEnvVar, delimiter, c.ParseUint) +} + +// EnvInt implements https://book.getfoundry.sh/cheatcodes/env-int +func (c *CheatCodesPrecompile) EnvInt_892a0c61(key string) (*ABIInt256, error) { + return envSingular[*ABIInt256](key, c.h.GetEnvVar, c.ParseInt) +} + +func (c *CheatCodesPrecompile) EnvInt_42181150(key string, delimiter string) ([]*ABIInt256, error) { + return envList[*ABIInt256](key, c.h.GetEnvVar, delimiter, c.ParseInt) +} + +// EnvAddress implements https://book.getfoundry.sh/cheatcodes/env-address +func (c *CheatCodesPrecompile) EnvAddress_350d56bf(key string) (common.Address, error) { + return envSingular[common.Address](key, c.h.GetEnvVar, c.ParseAddress) +} + +func (c *CheatCodesPrecompile) EnvAddress_ad31b9fa(key string, delimiter string) ([]common.Address, error) { + return envList[common.Address](key, c.h.GetEnvVar, delimiter, c.ParseAddress) +} + +// EnvBytes32 implements https://book.getfoundry.sh/cheatcodes/env-bytes32 +func (c *CheatCodesPrecompile) EnvBytes32_97949042(key string) ([32]byte, error) { + return envSingular[[32]byte](key, c.h.GetEnvVar, c.ParseBytes32) +} + +func (c *CheatCodesPrecompile) EnvBytes32_5af231c1(key string, delimiter string) ([][32]byte, error) { + return envList[[32]byte](key, c.h.GetEnvVar, delimiter, c.ParseBytes32) +} + +// EnvString implements https://book.getfoundry.sh/cheatcodes/env-string +func (c *CheatCodesPrecompile) EnvString_f877cb19(key string) (string, error) { + return envSingular[string](key, c.h.GetEnvVar, func(v string) (string, error) { + return v, nil + }) +} + +func (c *CheatCodesPrecompile) EnvString_14b02bc9(key string, delimiter string) ([]string, error) { + return envList[string](key, c.h.GetEnvVar, delimiter, func(v string) (string, error) { + return v, nil + }) +} + +// EnvBytes implements https://book.getfoundry.sh/cheatcodes/env-bytes +func (c *CheatCodesPrecompile) EnvBytes_4d7baf06(key string) ([]byte, error) { + return envSingular[[]byte](key, c.h.GetEnvVar, c.ParseBytes) +} + +func (c *CheatCodesPrecompile) EnvBytes_ddc2651b(key string, delimiter string) ([][]byte, error) { + return envList[[]byte](key, c.h.GetEnvVar, delimiter, c.ParseBytes) +} + +// KeyExists implements https://book.getfoundry.sh/cheatcodes/key-exists +func (c *CheatCodesPrecompile) KeyExists(jsonData string, key string) (bool, error) { + return c.KeyExistsJson(jsonData, key) + +} + +// KeyExistsJson implements https://book.getfoundry.sh/cheatcodes/key-exists-json +func (c *CheatCodesPrecompile) KeyExistsJson(data string, key string) (bool, error) { + var x map[string]json.RawMessage + if err := json.Unmarshal([]byte(data), &x); err != nil { + return false, err + } + _, ok := x[key] + return ok, nil +} + +// KeyExistsToml implements https://book.getfoundry.sh/cheatcodes/key-exists-toml +func (c *CheatCodesPrecompile) KeyExistsToml(data string, key string) (bool, error) { + var x map[string]any + if err := toml.Unmarshal([]byte(data), &x); err != nil { + return false, err + } + _, ok := x[key] + return ok, nil +} + +// ParseJSON implements https://book.getfoundry.sh/cheatcodes/parse-json +func (c *CheatCodesPrecompile) ParseJson_85940ef1(data string, key string) { + panic("parseJson(string,string) is not supported") // inferring an ABI type dynamically from sorted JSON content, this is mad. +} + +func (c *CheatCodesPrecompile) ParseJson_6a82600a(data string) { + panic("parseJson(string) is not supported") +} + +// ParseToml implements https://book.getfoundry.sh/cheatcodes/parse-toml +func (c *CheatCodesPrecompile) ParseToml_37736e08(data string, key string) { + panic("parseToml(string,string) is not supported") +} + +func (c *CheatCodesPrecompile) ParseToml_592151f0(data string) { + panic("parseToml(string) is not supported") +} + +// See https://github.com/foundry-rs/foundry/issues/8672 +// Forge uses dots and `[%d]` mixed together for JSON paths. +// It's like jq, but does not match foundry docs, and hard to parse. +func takePath(query string) (trailing string, stringKey string, index uint64, err error) { + if query == "" { + return "", "", 0, errors.New("empty keys are not supported") + } + dotIndex := strings.Index(query, ".") + openBracketIndex := strings.Index(query, "[") + if dotIndex < 0 || (openBracketIndex >= 0 && openBracketIndex < dotIndex) { + if openBracketIndex < 0 { + return "", query, 0, nil + } else if openBracketIndex == 0 { + closingBracketIndex := strings.Index(query, "]") + if closingBracketIndex <= openBracketIndex { + return "", "", 0, fmt.Errorf("invalid query: %q", query) + } + index, err := strconv.ParseUint(query[1:closingBracketIndex], 10, 64) + if err != nil { + return "", "", 0, fmt.Errorf("invalid index in query: %w", err) + } + return query[closingBracketIndex+1:], "", index, nil + } else { + return query[openBracketIndex:], query[:openBracketIndex], 0, nil + } + } else { + return query[dotIndex+1:], query[:dotIndex], 0, nil + } +} + +func lookupKeys(v any, query string) ([]string, error) { + if query == "$" || query == "" { + switch x := v.(type) { + case map[string]any: + return maps.Keys(x), nil + default: + return nil, fmt.Errorf("JSON value (Type %T) is not an object", x) + } + } + trailing, stringKey, index, err := takePath(query) + if err != nil { + return nil, err + } + switch x := v.(type) { + case []any: + if stringKey != "" { + return nil, fmt.Errorf("expected array index, but got string key in path: %q", stringKey) + } + if index >= uint64(len(x)) { + return nil, fmt.Errorf("index %d larger than length %d", index, len(x)) + } + return lookupKeys(x[index], trailing) + case map[string]any: + if stringKey == "" { + return nil, fmt.Errorf("expected string key, but got index in path: %q", index) + } + if stringKey == "$" { + if trailing != "" { + return nil, errors.New("cannot continue query after $ sign") + } + return maps.Keys(x), nil + } + data, ok := x[stringKey] + if !ok { + return nil, fmt.Errorf("unknown key %q", stringKey) + } + return lookupKeys(data, trailing) + default: + return nil, fmt.Errorf("cannot read keys of value of type %T", x) + } +} + +// ParseJsonKeys implements https://book.getfoundry.sh/cheatcodes/parse-json-keys +func (c *CheatCodesPrecompile) ParseJsonKeys(data string, key string) ([]string, error) { + var x map[string]any + if err := json.Unmarshal([]byte(data), &x); err != nil { + return nil, err + } + if key != "$" { + if !strings.HasPrefix(key, ".") { + return nil, fmt.Errorf("key %q is invalid. A key must be \"$\" or start with \".\"", key) + } + key = strings.TrimPrefix(key, ".") + } + return lookupKeys(x, key) +} + +// ParseTomlKeys implements https://book.getfoundry.sh/cheatcodes/parse-toml-keys +func (c *CheatCodesPrecompile) ParseTomlKeys(data string, key string) ([]string, error) { + var x map[string]any + if err := toml.Unmarshal([]byte(data), &x); err != nil { + return nil, err + } + return lookupKeys(x, key) +} + +// SerializeJson implements https://book.getfoundry.sh/cheatcodes/serialize-json +func (c *CheatCodesPrecompile) SerializeJson(objectKey string, value string) (string, error) { + var x json.RawMessage + if err := json.Unmarshal([]byte(value), &x); err != nil { + return "", fmt.Errorf("invalid JSON value: %w", err) + } + c.h.serializerStates[objectKey] = x + return string(x), nil +} + +func (c *CheatCodesPrecompile) serializeJsonValue(objectKey string, valueKey string, value any) (string, error) { + st, ok := c.h.serializerStates[objectKey] + if !ok { + st = json.RawMessage("{}") + } + var x map[string]json.RawMessage + if err := json.Unmarshal(st, &x); err != nil { + return "", fmt.Errorf("failed to decode existing JSON serializer state of %q: %w", objectKey, err) + } + v, err := json.Marshal(value) + if err != nil { + return "", fmt.Errorf("failed to encode value: %w", err) + } + x[valueKey] = v + out, err := json.Marshal(x) + if err != nil { + return "", fmt.Errorf("failed to encode updated JSON serializer state of %q: %w", objectKey, err) + } + c.h.serializerStates[objectKey] = out + return string(out), nil +} + +func (c *CheatCodesPrecompile) SerializeBool_ac22e971(objectKey string, valueKey string, value bool) (string, error) { + return c.serializeJsonValue(objectKey, valueKey, value) +} + +func (c *CheatCodesPrecompile) SerializeUint_129e9002(objectKey string, valueKey string, value *big.Int) (string, error) { + return c.serializeJsonValue(objectKey, valueKey, value) +} + +func (c *CheatCodesPrecompile) SerializeInt_3f33db60(objectKey string, valueKey string, value *ABIInt256) (string, error) { + return c.serializeJsonValue(objectKey, valueKey, value) +} + +func (c *CheatCodesPrecompile) SerializeAddress_972c6062(objectKey string, valueKey string, value common.Address) (string, error) { + return c.serializeJsonValue(objectKey, valueKey, value) +} + +func (c *CheatCodesPrecompile) SerializeBytes32_2d812b44(objectKey string, valueKey string, value common.Hash) (string, error) { + return c.serializeJsonValue(objectKey, valueKey, value) +} + +func (c *CheatCodesPrecompile) SerializeString_88da6d35(objectKey string, valueKey string, value string) (string, error) { + return c.serializeJsonValue(objectKey, valueKey, value) +} + +func (c *CheatCodesPrecompile) SerializeBytes_f21d52c7(objectKey string, valueKey string, value hexutil.Bytes) (string, error) { + return c.serializeJsonValue(objectKey, valueKey, value) +} + +func (c *CheatCodesPrecompile) SerializeBool_92925aa1(objectKey string, valueKey string, values []bool) (string, error) { + return c.serializeJsonValue(objectKey, valueKey, values) +} + +func (c *CheatCodesPrecompile) SerializeUint_fee9a469(objectKey string, valueKey string, values []*big.Int) (string, error) { + return c.serializeJsonValue(objectKey, valueKey, values) +} + +func (c *CheatCodesPrecompile) SerializeInt_7676e127(objectKey string, valueKey string, values []*ABIInt256) (string, error) { + return c.serializeJsonValue(objectKey, valueKey, values) +} + +func (c *CheatCodesPrecompile) SerializeAddress_1e356e1a(objectKey string, valueKey string, values []common.Address) (string, error) { + return c.serializeJsonValue(objectKey, valueKey, values) +} + +func (c *CheatCodesPrecompile) SerializeBytes32_201e43e2(objectKey string, valueKey string, values []common.Hash) (string, error) { + return c.serializeJsonValue(objectKey, valueKey, values) +} + +func (c *CheatCodesPrecompile) SerializeString_561cd6f3(objectKey string, valueKey string, values []string) (string, error) { + return c.serializeJsonValue(objectKey, valueKey, values) +} + +func (c *CheatCodesPrecompile) SerializeBytes_9884b232(objectKey string, valueKey string, values []hexutil.Bytes) (string, error) { + return c.serializeJsonValue(objectKey, valueKey, values) +} + +// WriteJson implements https://book.getfoundry.sh/cheatcodes/write-json +func (c *CheatCodesPrecompile) WriteJson_e23cd19f(data string, path string) error { + return vm.ErrExecutionReverted +} + +func (c *CheatCodesPrecompile) WriteJson_35d6ad46(data string, path string, valueKey string) error { + return vm.ErrExecutionReverted +} + +// WriteToml implements https://book.getfoundry.sh/cheatcodes/write-toml +func (c *CheatCodesPrecompile) WriteToml_c0865ba7(data string, path string) error { + return vm.ErrExecutionReverted +} + +func (c *CheatCodesPrecompile) WriteToml_51ac6a33(data string, path string, valueKey string) error { + return vm.ErrExecutionReverted +} diff --git a/op-chain-ops/script/cheatcodes_state.go b/op-chain-ops/script/cheatcodes_state.go new file mode 100644 index 000000000000..ee8d74bf3bc2 --- /dev/null +++ b/op-chain-ops/script/cheatcodes_state.go @@ -0,0 +1,24 @@ +package script + +import ( + "errors" +) + +func (c *CheatCodesPrecompile) LoadAllocs(pathToAllocsJson string) error { + c.h.log.Info("loading state", "target", pathToAllocsJson) + return errors.New("state-loading is not supported") +} + +func (c *CheatCodesPrecompile) DumpState(pathToStateJson string) error { + c.h.log.Info("dumping state", "target", pathToStateJson) + + allocs, err := c.h.StateDump() + if err != nil { + return err + } + // This may be written somewhere in the future (or run some callback to collect the state dump) + _ = allocs + c.h.log.Info("state-dumping is not supported, but have state", + "path", pathToStateJson, "accounts", len(allocs.Accounts)) + return nil +} diff --git a/op-chain-ops/script/cheatcodes_utilities.go b/op-chain-ops/script/cheatcodes_utilities.go new file mode 100644 index 000000000000..2ae53a52e910 --- /dev/null +++ b/op-chain-ops/script/cheatcodes_utilities.go @@ -0,0 +1,192 @@ +package script + +import ( + "fmt" + "math/big" + "strconv" + "strings" + + hdwallet "github.com/ethereum-optimism/go-ethereum-hdwallet" + + "github.com/ethereum/go-ethereum/accounts" + "github.com/ethereum/go-ethereum/common" + "github.com/ethereum/go-ethereum/common/hexutil" + "github.com/ethereum/go-ethereum/common/math" + "github.com/ethereum/go-ethereum/core/vm" + "github.com/ethereum/go-ethereum/crypto" +) + +// Addr implements https://book.getfoundry.sh/cheatcodes/addr +func (c *CheatCodesPrecompile) Addr(privateKey *big.Int) (common.Address, error) { + priv, err := crypto.ToECDSA(leftPad32(privateKey.Bytes())) + if err != nil { + return common.Address{}, err + } + return crypto.PubkeyToAddress(priv.PublicKey), nil +} + +// Sign implements https://book.getfoundry.sh/cheatcodes/sign +func (c *CheatCodesPrecompile) Sign() error { + return vm.ErrExecutionReverted +} + +// Skip implements https://book.getfoundry.sh/cheatcodes/skip +func (c *CheatCodesPrecompile) Skip() error { + return vm.ErrExecutionReverted +} + +// Label implements https://book.getfoundry.sh/cheatcodes/label +func (c *CheatCodesPrecompile) Label(addr common.Address, label string) { + c.h.Label(addr, label) +} + +// GetLabel implements https://book.getfoundry.sh/cheatcodes/get-label +func (c *CheatCodesPrecompile) GetLabel(addr common.Address) string { + label, ok := c.h.labels[addr] + if !ok { + return "unlabeled:" + addr.String() + } + return label +} + +// DeriveKey_6229498b implements https://book.getfoundry.sh/cheatcodes/derive-key +func (c *CheatCodesPrecompile) DeriveKey_6229498b(mnemonic string, index uint32) (*big.Int, error) { + return c.DeriveKey_6bcb2c1b(mnemonic, "m/44'/60'/0'/0/", index) +} + +// DeriveKey_6bcb2c1b implements https://book.getfoundry.sh/cheatcodes/derive-key +func (c *CheatCodesPrecompile) DeriveKey_6bcb2c1b(mnemonic string, path string, index uint32) (*big.Int, error) { + w, err := hdwallet.NewFromMnemonic(mnemonic) + if err != nil { + return nil, fmt.Errorf("invalid mnemonic: %w", err) + } + account := accounts.Account{URL: accounts.URL{Path: path + strconv.FormatInt(int64(index), 10)}} + priv, err := w.PrivateKey(account) + if err != nil { + return nil, fmt.Errorf("failed to derive key of path %s: %w", account.URL.Path, err) + } + return common.Hash(crypto.FromECDSA(priv)).Big(), nil +} + +// ParseBytes implements https://book.getfoundry.sh/cheatcodes/parse-bytes +func (c *CheatCodesPrecompile) ParseBytes(stringifiedValue string) ([]byte, error) { + return hexutil.Decode(stringifiedValue) +} + +// ParseAddress implements https://book.getfoundry.sh/cheatcodes/parse-address +func (c *CheatCodesPrecompile) ParseAddress(stringifiedValue string) (common.Address, error) { + var out common.Address + err := out.UnmarshalText([]byte(stringifiedValue)) + return out, err +} + +// ParseUint implements https://book.getfoundry.sh/cheatcodes/parse-uint +func (c *CheatCodesPrecompile) ParseUint(stringifiedValue string) (*big.Int, error) { + out := new(big.Int) + err := out.UnmarshalText([]byte(stringifiedValue)) + if err != nil { + return big.NewInt(0), err + } + if out.BitLen() > 256 { + return big.NewInt(0), fmt.Errorf("value %d is not a uint256, got %d bits", out, out.BitLen()) + } + if out.Sign() < 0 { + return big.NewInt(0), fmt.Errorf("value %d is not a uint256, it has a negative sign", out) + } + return out, nil +} + +var ( + topBit = math.BigPow(2, 255) + maxInt256 = new(big.Int).Sub(topBit, big.NewInt(1)) + minInt256 = new(big.Int).Neg(topBit) +) + +// ParseInt implements https://book.getfoundry.sh/cheatcodes/parse-int +func (c *CheatCodesPrecompile) ParseInt(stringifiedValue string) (*ABIInt256, error) { + out := new(big.Int) + err := out.UnmarshalText([]byte(stringifiedValue)) + if err != nil { + return (*ABIInt256)(big.NewInt(0)), err + } + if out.Cmp(minInt256) < 0 || out.Cmp(maxInt256) > 0 { + return (*ABIInt256)(big.NewInt(0)), fmt.Errorf("input %q out of int256 bounds", stringifiedValue) + } + return (*ABIInt256)(out), nil +} + +// ParseBytes32 implements https://book.getfoundry.sh/cheatcodes/parse-bytes32 +func (c *CheatCodesPrecompile) ParseBytes32(stringifiedValue string) ([32]byte, error) { + var out common.Hash + err := out.UnmarshalText([]byte(stringifiedValue)) + return out, err +} + +// ParseBool implements https://book.getfoundry.sh/cheatcodes/parse-bool +func (c *CheatCodesPrecompile) ParseBool(stringifiedValue string) (bool, error) { + switch strings.ToLower(stringifiedValue) { + case "true", "1": + return true, nil + case "false", "0": + return false, nil + default: + return false, fmt.Errorf("failed parsing %q as type `bool`", stringifiedValue) + } +} + +// RememberKey implements https://book.getfoundry.sh/cheatcodes/remember-key +func (c *CheatCodesPrecompile) RememberKey(privateKey *big.Int) (common.Address, error) { + // We don't store the key, but we can return the address of it, to not break compat + return c.Addr(privateKey) +} + +// ToString_56ca623e implements https://book.getfoundry.sh/cheatcodes/to-string +func (c *CheatCodesPrecompile) ToString_56ca623e(v common.Address) string { + return v.String() +} + +// ToString_71dce7da implements https://book.getfoundry.sh/cheatcodes/to-string +func (c *CheatCodesPrecompile) ToString_71dce7da(v bool) string { + if v { + return "true" + } else { + return "false" + } +} + +// ToString_6900a3ae implements https://book.getfoundry.sh/cheatcodes/to-string +func (c *CheatCodesPrecompile) ToString_6900a3ae(v *big.Int) string { + return v.String() +} + +// ToString_a322c40e implements https://book.getfoundry.sh/cheatcodes/to-string +func (c *CheatCodesPrecompile) ToString_a322c40e(v *ABIInt256) string { + return (*big.Int)(v).String() +} + +// ToString_b11a19e8 implements https://book.getfoundry.sh/cheatcodes/to-string +func (c *CheatCodesPrecompile) ToString_b11a19e8(v [32]byte) string { + return common.Hash(v).String() +} + +// ToString_71aad10d implements https://book.getfoundry.sh/cheatcodes/to-string +func (c *CheatCodesPrecompile) ToString_71aad10d(v []byte) string { + return hexutil.Bytes(v).String() +} + +// Breakpoint_f0259e92 implements https://book.getfoundry.sh/cheatcodes/breakpoint +func (c *CheatCodesPrecompile) Breakpoint_f0259e92(name string) { + c.h.log.Debug("breakpoint hit", "name", name) +} + +// Breakpoint_f7d39a8d implements https://book.getfoundry.sh/cheatcodes/breakpoint +func (c *CheatCodesPrecompile) Breakpoint_f7d39a8d(name string, v bool) { + if v { + c.h.log.Debug("breakpoint set", "name", name) + } else { + c.h.log.Debug("breakpoint unset", "name", name) + } +} + +// unsupported +//func (c *CheatCodesPrecompile) CreateWallet() {} diff --git a/op-chain-ops/script/console.go b/op-chain-ops/script/console.go new file mode 100644 index 000000000000..b3bba1ed0ff2 --- /dev/null +++ b/op-chain-ops/script/console.go @@ -0,0 +1,247 @@ +package script + +import ( + "bytes" + "fmt" + "math/big" + "reflect" + "strconv" + "strings" + "text/scanner" + + "github.com/ethereum/go-ethereum/common" + "github.com/ethereum/go-ethereum/common/hexutil" + "github.com/ethereum/go-ethereum/log" +) + +//go:generate go run ./consolegen --abi-txt=console2.txt --out=console2_gen.go + +type ConsolePrecompile struct { + logger log.Logger + sender func() common.Address +} + +func (c *ConsolePrecompile) log(args ...any) { + sender := c.sender() + logger := c.logger.With("sender", sender) + if len(args) == 0 { + logger.Info("") + return + } + if msg, ok := args[0].(string); ok { // if starting with a string, use it as message. And format with args if needed. + logger.Info(consoleFormat(msg, args[1:]...)) + return + } else { + logger.Info(consoleFormat("", args...)) + } +} + +type stringFormat struct{} +type numberFormat struct{} +type objectFormat struct{} +type integerFormat struct{} +type exponentialFormat struct { + precision int +} +type hexadecimalFormat struct{} + +func formatBigInt(x *big.Int, precision int) string { + if precision < 0 { + precision = len(new(big.Int).Abs(x).String()) - 1 + return formatBigIntFixedPrecision(x, uint(precision)) + fmt.Sprintf("e%d", precision) + } + return formatBigIntFixedPrecision(x, uint(precision)) +} + +func formatBigIntFixedPrecision(x *big.Int, precision uint) string { + prec := new(big.Int).Exp(big.NewInt(10), big.NewInt(int64(precision)), nil) + integer, remainder := new(big.Int).QuoRem(x, prec, new(big.Int)) + if remainder.Sign() != 0 { + decimal := fmt.Sprintf("%0"+fmt.Sprintf("%d", precision)+"d", + new(big.Int).Abs(remainder)) + decimal = strings.TrimRight(decimal, "0") + return fmt.Sprintf("%d.%s", integer, decimal) + } else { + return fmt.Sprintf("%d", integer) + } +} + +// formatValue formats a value v following the given format-spec. +func formatValue(v any, spec any) string { + switch x := v.(type) { + case string: + switch spec.(type) { + case stringFormat: + return x + case objectFormat: + return fmt.Sprintf("'%s'", v) + default: + return "NaN" + } + case bool: + switch spec.(type) { + case stringFormat: + return fmt.Sprintf("%v", x) + case objectFormat: + return fmt.Sprintf("'%v'", x) + case numberFormat: + if x { + return "1" + } + return "0" + default: + return "NaN" + } + case *big.Int: + switch s := spec.(type) { + case stringFormat, objectFormat, numberFormat, integerFormat: + return fmt.Sprintf("%d", x) + case exponentialFormat: + return formatBigInt(x, s.precision) + case hexadecimalFormat: + return (*hexutil.Big)(x).String() + default: + return fmt.Sprintf("%d", x) + } + case *ABIInt256: + switch s := spec.(type) { + case stringFormat, objectFormat, numberFormat, integerFormat: + return fmt.Sprintf("%d", (*big.Int)(x)) + case exponentialFormat: + return formatBigInt((*big.Int)(x), s.precision) + case hexadecimalFormat: + return (*hexutil.Big)(x).String() + default: + return fmt.Sprintf("%d", (*big.Int)(x)) + } + case common.Address: + switch spec.(type) { + case stringFormat, hexadecimalFormat: + return x.String() + case objectFormat: + return fmt.Sprintf("'%s'", x) + default: + return "NaN" + } + default: + if typ := reflect.TypeOf(v); (typ.Kind() == reflect.Array || typ.Kind() == reflect.Slice) && + typ.Elem().Kind() == reflect.Uint8 { + switch spec.(type) { + case stringFormat, hexadecimalFormat: + return fmt.Sprintf("0x%x", v) + case objectFormat: + return fmt.Sprintf("'0x%x'", v) + default: + return "NaN" + } + } + return fmt.Sprintf("%v", v) + } +} + +// consoleFormat emulates the foundry-flavor of printf, to format console.log data. +func consoleFormat(fmtMsg string, values ...any) string { + var sc scanner.Scanner + sc.Init(bytes.NewReader([]byte(fmtMsg))) + // default scanner settings are for Go source code parsing. Reset all of that. + sc.Whitespace = 0 + sc.Mode = 0 + sc.IsIdentRune = func(ch rune, i int) bool { + return false + } + + nextValue := func() (v any, ok bool) { + if len(values) > 0 { + v = values[0] + values = values[1:] + return v, true + } + return nil, false + } + + // Parses a format-spec from a string sequence (excl. the % prefix) + // Returns the spec (if any), and the consumed characters (to abort with / fall back to) + formatSpecFromChars := func() (spec any, consumed string) { + fmtChar := sc.Scan() + switch fmtChar { + case 's': + return stringFormat{}, "s" + case 'd': + return numberFormat{}, "d" + case 'i': + return integerFormat{}, "i" + case 'o': + return objectFormat{}, "o" + case 'e': + return exponentialFormat{precision: -1}, "e" + case 'x': + return hexadecimalFormat{}, "x" + case scanner.EOF: + return nil, "" + default: + for ; fmtChar != scanner.EOF; fmtChar = sc.Scan() { + if fmtChar == 'e' { + precision, err := strconv.ParseUint(consumed, 10, 16) + consumed += "e" + if err != nil { + return nil, consumed + } + return exponentialFormat{precision: int(precision)}, consumed + } + consumed += string(fmtChar) + if !strings.ContainsRune("0123456789", fmtChar) { + return nil, consumed + } + } + return nil, consumed + } + } + + expectFmt := false + var out strings.Builder + for sc.Peek() != scanner.EOF { + if expectFmt { + expectFmt = false + spec, consumed := formatSpecFromChars() + if spec != nil { + value, ok := nextValue() + if ok { + out.WriteString(formatValue(value, spec)) + } else { + // rather than panic with an .expect() like foundry, + // just log the original format string + out.WriteRune('%') + out.WriteString(consumed) + } + } else { + // on parser failure, write '%' and consumed characters + out.WriteRune('%') + out.WriteString(consumed) + } + } else { + tok := sc.Scan() + if tok == '%' { + next := sc.Peek() + switch next { + case '%': // %% formats as "%" + out.WriteRune('%') + case scanner.EOF: + out.WriteRune(tok) + default: + expectFmt = true + } + } else { + out.WriteRune(tok) + } + } + } + + // for all remaining values, append them to the output + for _, v := range values { + if out.Len() > 0 { + out.WriteRune(' ') + } + out.WriteString(formatValue(v, stringFormat{})) + } + return out.String() +} diff --git a/op-chain-ops/script/console2.txt b/op-chain-ops/script/console2.txt new file mode 100644 index 000000000000..9858d56faf3b --- /dev/null +++ b/op-chain-ops/script/console2.txt @@ -0,0 +1,376 @@ +log() +log(address,address,address,address) +log(address,address,address,bool) +log(address,address,address) +log(address,address,address,string) +log(address,address,address,uint256) +log(address,address,bool,address) +log(address,address,bool,bool) +log(address,address,bool) +log(address,address,bool,string) +log(address,address,bool,uint256) +log(address,address) +log(address,address,string,address) +log(address,address,string,bool) +log(address,address,string) +log(address,address,string,string) +log(address,address,string,uint256) +log(address,address,uint256,address) +log(address,address,uint256,bool) +log(address,address,uint256) +log(address,address,uint256,string) +log(address,address,uint256,uint256) +log(address,bool,address,address) +log(address,bool,address,bool) +log(address,bool,address) +log(address,bool,address,string) +log(address,bool,address,uint256) +log(address,bool,bool,address) +log(address,bool,bool,bool) +log(address,bool,bool) +log(address,bool,bool,string) +log(address,bool,bool,uint256) +log(address,bool) +log(address,bool,string,address) +log(address,bool,string,bool) +log(address,bool,string) +log(address,bool,string,string) +log(address,bool,string,uint256) +log(address,bool,uint256,address) +log(address,bool,uint256,bool) +log(address,bool,uint256) +log(address,bool,uint256,string) +log(address,bool,uint256,uint256) +log(address) +log(address,string,address,address) +log(address,string,address,bool) +log(address,string,address) +log(address,string,address,string) +log(address,string,address,uint256) +log(address,string,bool,address) +log(address,string,bool,bool) +log(address,string,bool) +log(address,string,bool,string) +log(address,string,bool,uint256) +log(address,string) +log(address,string,string,address) +log(address,string,string,bool) +log(address,string,string) +log(address,string,string,string) +log(address,string,string,uint256) +log(address,string,uint256,address) +log(address,string,uint256,bool) +log(address,string,uint256) +log(address,string,uint256,string) +log(address,string,uint256,uint256) +log(address,uint256,address,address) +log(address,uint256,address,bool) +log(address,uint256,address) +log(address,uint256,address,string) +log(address,uint256,address,uint256) +log(address,uint256,bool,address) +log(address,uint256,bool,bool) +log(address,uint256,bool) +log(address,uint256,bool,string) +log(address,uint256,bool,uint256) +log(address,uint256) +log(address,uint256,string,address) +log(address,uint256,string,bool) +log(address,uint256,string) +log(address,uint256,string,string) +log(address,uint256,string,uint256) +log(address,uint256,uint256,address) +log(address,uint256,uint256,bool) +log(address,uint256,uint256) +log(address,uint256,uint256,string) +log(address,uint256,uint256,uint256) +log(bool,address,address,address) +log(bool,address,address,bool) +log(bool,address,address) +log(bool,address,address,string) +log(bool,address,address,uint256) +log(bool,address,bool,address) +log(bool,address,bool,bool) +log(bool,address,bool) +log(bool,address,bool,string) +log(bool,address,bool,uint256) +log(bool,address) +log(bool,address,string,address) +log(bool,address,string,bool) +log(bool,address,string) +log(bool,address,string,string) +log(bool,address,string,uint256) +log(bool,address,uint256,address) +log(bool,address,uint256,bool) +log(bool,address,uint256) +log(bool,address,uint256,string) +log(bool,address,uint256,uint256) +log(bool,bool,address,address) +log(bool,bool,address,bool) +log(bool,bool,address) +log(bool,bool,address,string) +log(bool,bool,address,uint256) +log(bool,bool,bool,address) +log(bool,bool,bool,bool) +log(bool,bool,bool) +log(bool,bool,bool,string) +log(bool,bool,bool,uint256) +log(bool,bool) +log(bool,bool,string,address) +log(bool,bool,string,bool) +log(bool,bool,string) +log(bool,bool,string,string) +log(bool,bool,string,uint256) +log(bool,bool,uint256,address) +log(bool,bool,uint256,bool) +log(bool,bool,uint256) +log(bool,bool,uint256,string) +log(bool,bool,uint256,uint256) +log(bool) +log(bool,string,address,address) +log(bool,string,address,bool) +log(bool,string,address) +log(bool,string,address,string) +log(bool,string,address,uint256) +log(bool,string,bool,address) +log(bool,string,bool,bool) +log(bool,string,bool) +log(bool,string,bool,string) +log(bool,string,bool,uint256) +log(bool,string) +log(bool,string,string,address) +log(bool,string,string,bool) +log(bool,string,string) +log(bool,string,string,string) +log(bool,string,string,uint256) +log(bool,string,uint256,address) +log(bool,string,uint256,bool) +log(bool,string,uint256) +log(bool,string,uint256,string) +log(bool,string,uint256,uint256) +log(bool,uint256,address,address) +log(bool,uint256,address,bool) +log(bool,uint256,address) +log(bool,uint256,address,string) +log(bool,uint256,address,uint256) +log(bool,uint256,bool,address) +log(bool,uint256,bool,bool) +log(bool,uint256,bool) +log(bool,uint256,bool,string) +log(bool,uint256,bool,uint256) +log(bool,uint256) +log(bool,uint256,string,address) +log(bool,uint256,string,bool) +log(bool,uint256,string) +log(bool,uint256,string,string) +log(bool,uint256,string,uint256) +log(bool,uint256,uint256,address) +log(bool,uint256,uint256,bool) +log(bool,uint256,uint256) +log(bool,uint256,uint256,string) +log(bool,uint256,uint256,uint256) +log(bytes10) +log(bytes11) +log(bytes12) +log(bytes13) +log(bytes14) +log(bytes15) +log(bytes16) +log(bytes17) +log(bytes18) +log(bytes19) +log(bytes1) +log(bytes20) +log(bytes21) +log(bytes22) +log(bytes23) +log(bytes24) +log(bytes25) +log(bytes26) +log(bytes27) +log(bytes28) +log(bytes29) +log(bytes2) +log(bytes30) +log(bytes31) +log(bytes32) +log(bytes3) +log(bytes4) +log(bytes5) +log(bytes6) +log(bytes7) +log(bytes8) +log(bytes9) +log(bytes) +log(int256) +log(string,address,address,address) +log(string,address,address,bool) +log(string,address,address) +log(string,address,address,string) +log(string,address,address,uint256) +log(string,address,bool,address) +log(string,address,bool,bool) +log(string,address,bool) +log(string,address,bool,string) +log(string,address,bool,uint256) +log(string,address) +log(string,address,string,address) +log(string,address,string,bool) +log(string,address,string) +log(string,address,string,string) +log(string,address,string,uint256) +log(string,address,uint256,address) +log(string,address,uint256,bool) +log(string,address,uint256) +log(string,address,uint256,string) +log(string,address,uint256,uint256) +log(string,bool,address,address) +log(string,bool,address,bool) +log(string,bool,address) +log(string,bool,address,string) +log(string,bool,address,uint256) +log(string,bool,bool,address) +log(string,bool,bool,bool) +log(string,bool,bool) +log(string,bool,bool,string) +log(string,bool,bool,uint256) +log(string,bool) +log(string,bool,string,address) +log(string,bool,string,bool) +log(string,bool,string) +log(string,bool,string,string) +log(string,bool,string,uint256) +log(string,bool,uint256,address) +log(string,bool,uint256,bool) +log(string,bool,uint256) +log(string,bool,uint256,string) +log(string,bool,uint256,uint256) +log(string,int256) +log(string) +log(string,string,address,address) +log(string,string,address,bool) +log(string,string,address) +log(string,string,address,string) +log(string,string,address,uint256) +log(string,string,bool,address) +log(string,string,bool,bool) +log(string,string,bool) +log(string,string,bool,string) +log(string,string,bool,uint256) +log(string,string) +log(string,string,string,address) +log(string,string,string,bool) +log(string,string,string) +log(string,string,string,string) +log(string,string,string,uint256) +log(string,string,uint256,address) +log(string,string,uint256,bool) +log(string,string,uint256) +log(string,string,uint256,string) +log(string,string,uint256,uint256) +log(string,uint256,address,address) +log(string,uint256,address,bool) +log(string,uint256,address) +log(string,uint256,address,string) +log(string,uint256,address,uint256) +log(string,uint256,bool,address) +log(string,uint256,bool,bool) +log(string,uint256,bool) +log(string,uint256,bool,string) +log(string,uint256,bool,uint256) +log(string,uint256) +log(string,uint256,string,address) +log(string,uint256,string,bool) +log(string,uint256,string) +log(string,uint256,string,string) +log(string,uint256,string,uint256) +log(string,uint256,uint256,address) +log(string,uint256,uint256,bool) +log(string,uint256,uint256) +log(string,uint256,uint256,string) +log(string,uint256,uint256,uint256) +log(uint256,address,address,address) +log(uint256,address,address,bool) +log(uint256,address,address) +log(uint256,address,address,string) +log(uint256,address,address,uint256) +log(uint256,address,bool,address) +log(uint256,address,bool,bool) +log(uint256,address,bool) +log(uint256,address,bool,string) +log(uint256,address,bool,uint256) +log(uint256,address) +log(uint256,address,string,address) +log(uint256,address,string,bool) +log(uint256,address,string) +log(uint256,address,string,string) +log(uint256,address,string,uint256) +log(uint256,address,uint256,address) +log(uint256,address,uint256,bool) +log(uint256,address,uint256) +log(uint256,address,uint256,string) +log(uint256,address,uint256,uint256) +log(uint256,bool,address,address) +log(uint256,bool,address,bool) +log(uint256,bool,address) +log(uint256,bool,address,string) +log(uint256,bool,address,uint256) +log(uint256,bool,bool,address) +log(uint256,bool,bool,bool) +log(uint256,bool,bool) +log(uint256,bool,bool,string) +log(uint256,bool,bool,uint256) +log(uint256,bool) +log(uint256,bool,string,address) +log(uint256,bool,string,bool) +log(uint256,bool,string) +log(uint256,bool,string,string) +log(uint256,bool,string,uint256) +log(uint256,bool,uint256,address) +log(uint256,bool,uint256,bool) +log(uint256,bool,uint256) +log(uint256,bool,uint256,string) +log(uint256,bool,uint256,uint256) +log(uint256) +log(uint256,string,address,address) +log(uint256,string,address,bool) +log(uint256,string,address) +log(uint256,string,address,string) +log(uint256,string,address,uint256) +log(uint256,string,bool,address) +log(uint256,string,bool,bool) +log(uint256,string,bool) +log(uint256,string,bool,string) +log(uint256,string,bool,uint256) +log(uint256,string) +log(uint256,string,string,address) +log(uint256,string,string,bool) +log(uint256,string,string) +log(uint256,string,string,string) +log(uint256,string,string,uint256) +log(uint256,string,uint256,address) +log(uint256,string,uint256,bool) +log(uint256,string,uint256) +log(uint256,string,uint256,string) +log(uint256,string,uint256,uint256) +log(uint256,uint256,address,address) +log(uint256,uint256,address,bool) +log(uint256,uint256,address) +log(uint256,uint256,address,string) +log(uint256,uint256,address,uint256) +log(uint256,uint256,bool,address) +log(uint256,uint256,bool,bool) +log(uint256,uint256,bool) +log(uint256,uint256,bool,string) +log(uint256,uint256,bool,uint256) +log(uint256,uint256) +log(uint256,uint256,string,address) +log(uint256,uint256,string,bool) +log(uint256,uint256,string) +log(uint256,uint256,string,string) +log(uint256,uint256,string,uint256) +log(uint256,uint256,uint256,address) +log(uint256,uint256,uint256,bool) +log(uint256,uint256,uint256) +log(uint256,uint256,uint256,string) +log(uint256,uint256,uint256,uint256) diff --git a/op-chain-ops/script/console2_gen.go b/op-chain-ops/script/console2_gen.go new file mode 100644 index 000000000000..0c6dcc44f462 --- /dev/null +++ b/op-chain-ops/script/console2_gen.go @@ -0,0 +1,1513 @@ +// AUTO-GENERATED - DO NOT EDIT +package script + +import ( + "math/big" + + "github.com/ethereum/go-ethereum/common" + "github.com/ethereum/go-ethereum/common/hexutil" +) + +func (c *ConsolePrecompile) Log_51973ec9() { + c.log() +} + +func (c *ConsolePrecompile) Log_665bf134(p0 common.Address, p1 common.Address, p2 common.Address, p3 common.Address) { + c.log(p0, p1, p2, p3) +} + +func (c *ConsolePrecompile) Log_0e378994(p0 common.Address, p1 common.Address, p2 common.Address, p3 bool) { + c.log(p0, p1, p2, p3) +} + +func (c *ConsolePrecompile) Log_018c84c2(p0 common.Address, p1 common.Address, p2 common.Address) { + c.log(p0, p1, p2) +} + +func (c *ConsolePrecompile) Log_f808da20(p0 common.Address, p1 common.Address, p2 common.Address, p3 string) { + c.log(p0, p1, p2, p3) +} + +func (c *ConsolePrecompile) Log_94250d77(p0 common.Address, p1 common.Address, p2 common.Address, p3 *big.Int) { + c.log(p0, p1, p2, p3) +} + +func (c *ConsolePrecompile) Log_9f1bc36e(p0 common.Address, p1 common.Address, p2 bool, p3 common.Address) { + c.log(p0, p1, p2, p3) +} + +func (c *ConsolePrecompile) Log_2cd4134a(p0 common.Address, p1 common.Address, p2 bool, p3 bool) { + c.log(p0, p1, p2, p3) +} + +func (c *ConsolePrecompile) Log_f2a66286(p0 common.Address, p1 common.Address, p2 bool) { + c.log(p0, p1, p2) +} + +func (c *ConsolePrecompile) Log_aa6540c8(p0 common.Address, p1 common.Address, p2 bool, p3 string) { + c.log(p0, p1, p2, p3) +} + +func (c *ConsolePrecompile) Log_3971e78c(p0 common.Address, p1 common.Address, p2 bool, p3 *big.Int) { + c.log(p0, p1, p2, p3) +} + +func (c *ConsolePrecompile) Log_daf0d4aa(p0 common.Address, p1 common.Address) { + c.log(p0, p1) +} + +func (c *ConsolePrecompile) Log_8f736d16(p0 common.Address, p1 common.Address, p2 string, p3 common.Address) { + c.log(p0, p1, p2, p3) +} + +func (c *ConsolePrecompile) Log_6f1a594e(p0 common.Address, p1 common.Address, p2 string, p3 bool) { + c.log(p0, p1, p2, p3) +} + +func (c *ConsolePrecompile) Log_007150be(p0 common.Address, p1 common.Address, p2 string) { + c.log(p0, p1, p2) +} + +func (c *ConsolePrecompile) Log_21bdaf25(p0 common.Address, p1 common.Address, p2 string, p3 string) { + c.log(p0, p1, p2, p3) +} + +func (c *ConsolePrecompile) Log_ef1cefe7(p0 common.Address, p1 common.Address, p2 string, p3 *big.Int) { + c.log(p0, p1, p2, p3) +} + +func (c *ConsolePrecompile) Log_8da6def5(p0 common.Address, p1 common.Address, p2 *big.Int, p3 common.Address) { + c.log(p0, p1, p2, p3) +} + +func (c *ConsolePrecompile) Log_9b4254e2(p0 common.Address, p1 common.Address, p2 *big.Int, p3 bool) { + c.log(p0, p1, p2, p3) +} + +func (c *ConsolePrecompile) Log_17fe6185(p0 common.Address, p1 common.Address, p2 *big.Int) { + c.log(p0, p1, p2) +} + +func (c *ConsolePrecompile) Log_fdb4f990(p0 common.Address, p1 common.Address, p2 *big.Int, p3 string) { + c.log(p0, p1, p2, p3) +} + +func (c *ConsolePrecompile) Log_be553481(p0 common.Address, p1 common.Address, p2 *big.Int, p3 *big.Int) { + c.log(p0, p1, p2, p3) +} + +func (c *ConsolePrecompile) Log_660375dd(p0 common.Address, p1 bool, p2 common.Address, p3 common.Address) { + c.log(p0, p1, p2, p3) +} + +func (c *ConsolePrecompile) Log_a6f50b0f(p0 common.Address, p1 bool, p2 common.Address, p3 bool) { + c.log(p0, p1, p2, p3) +} + +func (c *ConsolePrecompile) Log_f11699ed(p0 common.Address, p1 bool, p2 common.Address) { + c.log(p0, p1, p2) +} + +func (c *ConsolePrecompile) Log_2dd778e6(p0 common.Address, p1 bool, p2 common.Address, p3 string) { + c.log(p0, p1, p2, p3) +} + +func (c *ConsolePrecompile) Log_a75c59de(p0 common.Address, p1 bool, p2 common.Address, p3 *big.Int) { + c.log(p0, p1, p2, p3) +} + +func (c *ConsolePrecompile) Log_cf394485(p0 common.Address, p1 bool, p2 bool, p3 common.Address) { + c.log(p0, p1, p2, p3) +} + +func (c *ConsolePrecompile) Log_cac43479(p0 common.Address, p1 bool, p2 bool, p3 bool) { + c.log(p0, p1, p2, p3) +} + +func (c *ConsolePrecompile) Log_eb830c92(p0 common.Address, p1 bool, p2 bool) { + c.log(p0, p1, p2) +} + +func (c *ConsolePrecompile) Log_dfc4a2e8(p0 common.Address, p1 bool, p2 bool, p3 string) { + c.log(p0, p1, p2, p3) +} + +func (c *ConsolePrecompile) Log_8c4e5de6(p0 common.Address, p1 bool, p2 bool, p3 *big.Int) { + c.log(p0, p1, p2, p3) +} + +func (c *ConsolePrecompile) Log_75b605d3(p0 common.Address, p1 bool) { + c.log(p0, p1) +} + +func (c *ConsolePrecompile) Log_19fd4956(p0 common.Address, p1 bool, p2 string, p3 common.Address) { + c.log(p0, p1, p2, p3) +} + +func (c *ConsolePrecompile) Log_50ad461d(p0 common.Address, p1 bool, p2 string, p3 bool) { + c.log(p0, p1, p2, p3) +} + +func (c *ConsolePrecompile) Log_212255cc(p0 common.Address, p1 bool, p2 string) { + c.log(p0, p1, p2) +} + +func (c *ConsolePrecompile) Log_475c5c33(p0 common.Address, p1 bool, p2 string, p3 string) { + c.log(p0, p1, p2, p3) +} + +func (c *ConsolePrecompile) Log_80e6a20b(p0 common.Address, p1 bool, p2 string, p3 *big.Int) { + c.log(p0, p1, p2, p3) +} + +func (c *ConsolePrecompile) Log_ccf790a1(p0 common.Address, p1 bool, p2 *big.Int, p3 common.Address) { + c.log(p0, p1, p2, p3) +} + +func (c *ConsolePrecompile) Log_c4643e20(p0 common.Address, p1 bool, p2 *big.Int, p3 bool) { + c.log(p0, p1, p2, p3) +} + +func (c *ConsolePrecompile) Log_9c4f99fb(p0 common.Address, p1 bool, p2 *big.Int) { + c.log(p0, p1, p2) +} + +func (c *ConsolePrecompile) Log_0aa6cfad(p0 common.Address, p1 bool, p2 *big.Int, p3 string) { + c.log(p0, p1, p2, p3) +} + +func (c *ConsolePrecompile) Log_386ff5f4(p0 common.Address, p1 bool, p2 *big.Int, p3 *big.Int) { + c.log(p0, p1, p2, p3) +} + +func (c *ConsolePrecompile) Log_2c2ecbc2(p0 common.Address) { + c.log(p0) +} + +func (c *ConsolePrecompile) Log_0d36fa20(p0 common.Address, p1 string, p2 common.Address, p3 common.Address) { + c.log(p0, p1, p2, p3) +} + +func (c *ConsolePrecompile) Log_0df12b76(p0 common.Address, p1 string, p2 common.Address, p3 bool) { + c.log(p0, p1, p2, p3) +} + +func (c *ConsolePrecompile) Log_f08744e8(p0 common.Address, p1 string, p2 common.Address) { + c.log(p0, p1, p2) +} + +func (c *ConsolePrecompile) Log_f7e36245(p0 common.Address, p1 string, p2 common.Address, p3 string) { + c.log(p0, p1, p2, p3) +} + +func (c *ConsolePrecompile) Log_457fe3cf(p0 common.Address, p1 string, p2 common.Address, p3 *big.Int) { + c.log(p0, p1, p2, p3) +} + +func (c *ConsolePrecompile) Log_205871c2(p0 common.Address, p1 string, p2 bool, p3 common.Address) { + c.log(p0, p1, p2, p3) +} + +func (c *ConsolePrecompile) Log_5f1d5c9f(p0 common.Address, p1 string, p2 bool, p3 bool) { + c.log(p0, p1, p2, p3) +} + +func (c *ConsolePrecompile) Log_cf020fb1(p0 common.Address, p1 string, p2 bool) { + c.log(p0, p1, p2) +} + +func (c *ConsolePrecompile) Log_bc0b61fe(p0 common.Address, p1 string, p2 bool, p3 string) { + c.log(p0, p1, p2, p3) +} + +func (c *ConsolePrecompile) Log_515e38b6(p0 common.Address, p1 string, p2 bool, p3 *big.Int) { + c.log(p0, p1, p2, p3) +} + +func (c *ConsolePrecompile) Log_759f86bb(p0 common.Address, p1 string) { + c.log(p0, p1) +} + +func (c *ConsolePrecompile) Log_a04e2f87(p0 common.Address, p1 string, p2 string, p3 common.Address) { + c.log(p0, p1, p2, p3) +} + +func (c *ConsolePrecompile) Log_35a5071f(p0 common.Address, p1 string, p2 string, p3 bool) { + c.log(p0, p1, p2, p3) +} + +func (c *ConsolePrecompile) Log_fb772265(p0 common.Address, p1 string, p2 string) { + c.log(p0, p1, p2) +} + +func (c *ConsolePrecompile) Log_5d02c50b(p0 common.Address, p1 string, p2 string, p3 string) { + c.log(p0, p1, p2, p3) +} + +func (c *ConsolePrecompile) Log_159f8927(p0 common.Address, p1 string, p2 string, p3 *big.Int) { + c.log(p0, p1, p2, p3) +} + +func (c *ConsolePrecompile) Log_63183678(p0 common.Address, p1 string, p2 *big.Int, p3 common.Address) { + c.log(p0, p1, p2, p3) +} + +func (c *ConsolePrecompile) Log_0ef7e050(p0 common.Address, p1 string, p2 *big.Int, p3 bool) { + c.log(p0, p1, p2, p3) +} + +func (c *ConsolePrecompile) Log_67dd6ff1(p0 common.Address, p1 string, p2 *big.Int) { + c.log(p0, p1, p2) +} + +func (c *ConsolePrecompile) Log_448830a8(p0 common.Address, p1 string, p2 *big.Int, p3 string) { + c.log(p0, p1, p2, p3) +} + +func (c *ConsolePrecompile) Log_1dc8e1b8(p0 common.Address, p1 string, p2 *big.Int, p3 *big.Int) { + c.log(p0, p1, p2, p3) +} + +func (c *ConsolePrecompile) Log_478d1c62(p0 common.Address, p1 *big.Int, p2 common.Address, p3 common.Address) { + c.log(p0, p1, p2, p3) +} + +func (c *ConsolePrecompile) Log_a1bcc9b3(p0 common.Address, p1 *big.Int, p2 common.Address, p3 bool) { + c.log(p0, p1, p2, p3) +} + +func (c *ConsolePrecompile) Log_7bc0d848(p0 common.Address, p1 *big.Int, p2 common.Address) { + c.log(p0, p1, p2) +} + +func (c *ConsolePrecompile) Log_1da986ea(p0 common.Address, p1 *big.Int, p2 common.Address, p3 string) { + c.log(p0, p1, p2, p3) +} + +func (c *ConsolePrecompile) Log_100f650e(p0 common.Address, p1 *big.Int, p2 common.Address, p3 *big.Int) { + c.log(p0, p1, p2, p3) +} + +func (c *ConsolePrecompile) Log_a31bfdcc(p0 common.Address, p1 *big.Int, p2 bool, p3 common.Address) { + c.log(p0, p1, p2, p3) +} + +func (c *ConsolePrecompile) Log_3bf5e537(p0 common.Address, p1 *big.Int, p2 bool, p3 bool) { + c.log(p0, p1, p2, p3) +} + +func (c *ConsolePrecompile) Log_678209a8(p0 common.Address, p1 *big.Int, p2 bool) { + c.log(p0, p1, p2) +} + +func (c *ConsolePrecompile) Log_c5ad85f9(p0 common.Address, p1 *big.Int, p2 bool, p3 string) { + c.log(p0, p1, p2, p3) +} + +func (c *ConsolePrecompile) Log_22f6b999(p0 common.Address, p1 *big.Int, p2 bool, p3 *big.Int) { + c.log(p0, p1, p2, p3) +} + +func (c *ConsolePrecompile) Log_8309e8a8(p0 common.Address, p1 *big.Int) { + c.log(p0, p1) +} + +func (c *ConsolePrecompile) Log_5c430d47(p0 common.Address, p1 *big.Int, p2 string, p3 common.Address) { + c.log(p0, p1, p2, p3) +} + +func (c *ConsolePrecompile) Log_cf18105c(p0 common.Address, p1 *big.Int, p2 string, p3 bool) { + c.log(p0, p1, p2, p3) +} + +func (c *ConsolePrecompile) Log_a1f2e8aa(p0 common.Address, p1 *big.Int, p2 string) { + c.log(p0, p1, p2) +} + +func (c *ConsolePrecompile) Log_88a8c406(p0 common.Address, p1 *big.Int, p2 string, p3 string) { + c.log(p0, p1, p2, p3) +} + +func (c *ConsolePrecompile) Log_bf01f891(p0 common.Address, p1 *big.Int, p2 string, p3 *big.Int) { + c.log(p0, p1, p2, p3) +} + +func (c *ConsolePrecompile) Log_20e3984d(p0 common.Address, p1 *big.Int, p2 *big.Int, p3 common.Address) { + c.log(p0, p1, p2, p3) +} + +func (c *ConsolePrecompile) Log_66f1bc67(p0 common.Address, p1 *big.Int, p2 *big.Int, p3 bool) { + c.log(p0, p1, p2, p3) +} + +func (c *ConsolePrecompile) Log_b69bcaf6(p0 common.Address, p1 *big.Int, p2 *big.Int) { + c.log(p0, p1, p2) +} + +func (c *ConsolePrecompile) Log_4a28c017(p0 common.Address, p1 *big.Int, p2 *big.Int, p3 string) { + c.log(p0, p1, p2, p3) +} + +func (c *ConsolePrecompile) Log_34f0e636(p0 common.Address, p1 *big.Int, p2 *big.Int, p3 *big.Int) { + c.log(p0, p1, p2, p3) +} + +func (c *ConsolePrecompile) Log_1d14d001(p0 bool, p1 common.Address, p2 common.Address, p3 common.Address) { + c.log(p0, p1, p2, p3) +} + +func (c *ConsolePrecompile) Log_46600be0(p0 bool, p1 common.Address, p2 common.Address, p3 bool) { + c.log(p0, p1, p2, p3) +} + +func (c *ConsolePrecompile) Log_d2763667(p0 bool, p1 common.Address, p2 common.Address) { + c.log(p0, p1, p2) +} + +func (c *ConsolePrecompile) Log_d812a167(p0 bool, p1 common.Address, p2 common.Address, p3 string) { + c.log(p0, p1, p2, p3) +} + +func (c *ConsolePrecompile) Log_0c66d1be(p0 bool, p1 common.Address, p2 common.Address, p3 *big.Int) { + c.log(p0, p1, p2, p3) +} + +func (c *ConsolePrecompile) Log_1c41a336(p0 bool, p1 common.Address, p2 bool, p3 common.Address) { + c.log(p0, p1, p2, p3) +} + +func (c *ConsolePrecompile) Log_6a9c478b(p0 bool, p1 common.Address, p2 bool, p3 bool) { + c.log(p0, p1, p2, p3) +} + +func (c *ConsolePrecompile) Log_18c9c746(p0 bool, p1 common.Address, p2 bool) { + c.log(p0, p1, p2) +} + +func (c *ConsolePrecompile) Log_4a66cb34(p0 bool, p1 common.Address, p2 bool, p3 string) { + c.log(p0, p1, p2, p3) +} + +func (c *ConsolePrecompile) Log_07831502(p0 bool, p1 common.Address, p2 bool, p3 *big.Int) { + c.log(p0, p1, p2, p3) +} + +func (c *ConsolePrecompile) Log_853c4849(p0 bool, p1 common.Address) { + c.log(p0, p1) +} + +func (c *ConsolePrecompile) Log_6f7c603e(p0 bool, p1 common.Address, p2 string, p3 common.Address) { + c.log(p0, p1, p2, p3) +} + +func (c *ConsolePrecompile) Log_e2bfd60b(p0 bool, p1 common.Address, p2 string, p3 bool) { + c.log(p0, p1, p2, p3) +} + +func (c *ConsolePrecompile) Log_de9a9270(p0 bool, p1 common.Address, p2 string) { + c.log(p0, p1, p2) +} + +func (c *ConsolePrecompile) Log_a73c1db6(p0 bool, p1 common.Address, p2 string, p3 string) { + c.log(p0, p1, p2, p3) +} + +func (c *ConsolePrecompile) Log_c21f64c7(p0 bool, p1 common.Address, p2 string, p3 *big.Int) { + c.log(p0, p1, p2, p3) +} + +func (c *ConsolePrecompile) Log_136b05dd(p0 bool, p1 common.Address, p2 *big.Int, p3 common.Address) { + c.log(p0, p1, p2, p3) +} + +func (c *ConsolePrecompile) Log_d6019f1c(p0 bool, p1 common.Address, p2 *big.Int, p3 bool) { + c.log(p0, p1, p2, p3) +} + +func (c *ConsolePrecompile) Log_5f7b9afb(p0 bool, p1 common.Address, p2 *big.Int) { + c.log(p0, p1, p2) +} + +func (c *ConsolePrecompile) Log_51f09ff8(p0 bool, p1 common.Address, p2 *big.Int, p3 string) { + c.log(p0, p1, p2, p3) +} + +func (c *ConsolePrecompile) Log_7bf181a1(p0 bool, p1 common.Address, p2 *big.Int, p3 *big.Int) { + c.log(p0, p1, p2, p3) +} + +func (c *ConsolePrecompile) Log_f4880ea4(p0 bool, p1 bool, p2 common.Address, p3 common.Address) { + c.log(p0, p1, p2, p3) +} + +func (c *ConsolePrecompile) Log_c0a302d8(p0 bool, p1 bool, p2 common.Address, p3 bool) { + c.log(p0, p1, p2, p3) +} + +func (c *ConsolePrecompile) Log_1078f68d(p0 bool, p1 bool, p2 common.Address) { + c.log(p0, p1, p2) +} + +func (c *ConsolePrecompile) Log_a0a47963(p0 bool, p1 bool, p2 common.Address, p3 string) { + c.log(p0, p1, p2, p3) +} + +func (c *ConsolePrecompile) Log_4c123d57(p0 bool, p1 bool, p2 common.Address, p3 *big.Int) { + c.log(p0, p1, p2, p3) +} + +func (c *ConsolePrecompile) Log_8c329b1a(p0 bool, p1 bool, p2 bool, p3 common.Address) { + c.log(p0, p1, p2, p3) +} + +func (c *ConsolePrecompile) Log_3b2a5ce0(p0 bool, p1 bool, p2 bool, p3 bool) { + c.log(p0, p1, p2, p3) +} + +func (c *ConsolePrecompile) Log_50709698(p0 bool, p1 bool, p2 bool) { + c.log(p0, p1, p2) +} + +func (c *ConsolePrecompile) Log_2ae408d4(p0 bool, p1 bool, p2 bool, p3 string) { + c.log(p0, p1, p2, p3) +} + +func (c *ConsolePrecompile) Log_6d7045c1(p0 bool, p1 bool, p2 bool, p3 *big.Int) { + c.log(p0, p1, p2, p3) +} + +func (c *ConsolePrecompile) Log_2a110e83(p0 bool, p1 bool) { + c.log(p0, p1) +} + +func (c *ConsolePrecompile) Log_f9ad2b89(p0 bool, p1 bool, p2 string, p3 common.Address) { + c.log(p0, p1, p2, p3) +} + +func (c *ConsolePrecompile) Log_b857163a(p0 bool, p1 bool, p2 string, p3 bool) { + c.log(p0, p1, p2, p3) +} + +func (c *ConsolePrecompile) Log_2555fa46(p0 bool, p1 bool, p2 string) { + c.log(p0, p1, p2) +} + +func (c *ConsolePrecompile) Log_6d1e8751(p0 bool, p1 bool, p2 string, p3 string) { + c.log(p0, p1, p2, p3) +} + +func (c *ConsolePrecompile) Log_e3a9ca2f(p0 bool, p1 bool, p2 string, p3 *big.Int) { + c.log(p0, p1, p2, p3) +} + +func (c *ConsolePrecompile) Log_54a7a9a0(p0 bool, p1 bool, p2 *big.Int, p3 common.Address) { + c.log(p0, p1, p2, p3) +} + +func (c *ConsolePrecompile) Log_619e4d0e(p0 bool, p1 bool, p2 *big.Int, p3 bool) { + c.log(p0, p1, p2, p3) +} + +func (c *ConsolePrecompile) Log_12f21602(p0 bool, p1 bool, p2 *big.Int) { + c.log(p0, p1, p2) +} + +func (c *ConsolePrecompile) Log_7dd4d0e0(p0 bool, p1 bool, p2 *big.Int, p3 string) { + c.log(p0, p1, p2, p3) +} + +func (c *ConsolePrecompile) Log_0bb00eab(p0 bool, p1 bool, p2 *big.Int, p3 *big.Int) { + c.log(p0, p1, p2, p3) +} + +func (c *ConsolePrecompile) Log_32458eed(p0 bool) { + c.log(p0) +} + +func (c *ConsolePrecompile) Log_2b2b18dc(p0 bool, p1 string, p2 common.Address, p3 common.Address) { + c.log(p0, p1, p2, p3) +} + +func (c *ConsolePrecompile) Log_6dd434ca(p0 bool, p1 string, p2 common.Address, p3 bool) { + c.log(p0, p1, p2, p3) +} + +func (c *ConsolePrecompile) Log_9591b953(p0 bool, p1 string, p2 common.Address) { + c.log(p0, p1, p2) +} + +func (c *ConsolePrecompile) Log_12d6c788(p0 bool, p1 string, p2 common.Address, p3 string) { + c.log(p0, p1, p2, p3) +} + +func (c *ConsolePrecompile) Log_a5cada94(p0 bool, p1 string, p2 common.Address, p3 *big.Int) { + c.log(p0, p1, p2, p3) +} + +func (c *ConsolePrecompile) Log_538e06ab(p0 bool, p1 string, p2 bool, p3 common.Address) { + c.log(p0, p1, p2, p3) +} + +func (c *ConsolePrecompile) Log_dc5e935b(p0 bool, p1 string, p2 bool, p3 bool) { + c.log(p0, p1, p2, p3) +} + +func (c *ConsolePrecompile) Log_dbb4c247(p0 bool, p1 string, p2 bool) { + c.log(p0, p1, p2) +} + +func (c *ConsolePrecompile) Log_483d0416(p0 bool, p1 string, p2 bool, p3 string) { + c.log(p0, p1, p2, p3) +} + +func (c *ConsolePrecompile) Log_1606a393(p0 bool, p1 string, p2 bool, p3 *big.Int) { + c.log(p0, p1, p2, p3) +} + +func (c *ConsolePrecompile) Log_8feac525(p0 bool, p1 string) { + c.log(p0, p1) +} + +func (c *ConsolePrecompile) Log_97d394d8(p0 bool, p1 string, p2 string, p3 common.Address) { + c.log(p0, p1, p2, p3) +} + +func (c *ConsolePrecompile) Log_1e4b87e5(p0 bool, p1 string, p2 string, p3 bool) { + c.log(p0, p1, p2, p3) +} + +func (c *ConsolePrecompile) Log_b076847f(p0 bool, p1 string, p2 string) { + c.log(p0, p1, p2) +} + +func (c *ConsolePrecompile) Log_1762e32a(p0 bool, p1 string, p2 string, p3 string) { + c.log(p0, p1, p2, p3) +} + +func (c *ConsolePrecompile) Log_7be0c3eb(p0 bool, p1 string, p2 string, p3 *big.Int) { + c.log(p0, p1, p2, p3) +} + +func (c *ConsolePrecompile) Log_1596a1ce(p0 bool, p1 string, p2 *big.Int, p3 common.Address) { + c.log(p0, p1, p2, p3) +} + +func (c *ConsolePrecompile) Log_6b0e5d53(p0 bool, p1 string, p2 *big.Int, p3 bool) { + c.log(p0, p1, p2, p3) +} + +func (c *ConsolePrecompile) Log_1093ee11(p0 bool, p1 string, p2 *big.Int) { + c.log(p0, p1, p2) +} + +func (c *ConsolePrecompile) Log_1ad96de6(p0 bool, p1 string, p2 *big.Int, p3 string) { + c.log(p0, p1, p2, p3) +} + +func (c *ConsolePrecompile) Log_28863fcb(p0 bool, p1 string, p2 *big.Int, p3 *big.Int) { + c.log(p0, p1, p2, p3) +} + +func (c *ConsolePrecompile) Log_26f560a8(p0 bool, p1 *big.Int, p2 common.Address, p3 common.Address) { + c.log(p0, p1, p2, p3) +} + +func (c *ConsolePrecompile) Log_b4c314ff(p0 bool, p1 *big.Int, p2 common.Address, p3 bool) { + c.log(p0, p1, p2, p3) +} + +func (c *ConsolePrecompile) Log_088ef9d2(p0 bool, p1 *big.Int, p2 common.Address) { + c.log(p0, p1, p2) +} + +func (c *ConsolePrecompile) Log_1bb3b09a(p0 bool, p1 *big.Int, p2 common.Address, p3 string) { + c.log(p0, p1, p2, p3) +} + +func (c *ConsolePrecompile) Log_1537dc87(p0 bool, p1 *big.Int, p2 common.Address, p3 *big.Int) { + c.log(p0, p1, p2, p3) +} + +func (c *ConsolePrecompile) Log_9acd3616(p0 bool, p1 *big.Int, p2 bool, p3 common.Address) { + c.log(p0, p1, p2, p3) +} + +func (c *ConsolePrecompile) Log_ceb5f4d7(p0 bool, p1 *big.Int, p2 bool, p3 bool) { + c.log(p0, p1, p2, p3) +} + +func (c *ConsolePrecompile) Log_e8defba9(p0 bool, p1 *big.Int, p2 bool) { + c.log(p0, p1, p2) +} + +func (c *ConsolePrecompile) Log_9143dbb1(p0 bool, p1 *big.Int, p2 bool, p3 string) { + c.log(p0, p1, p2, p3) +} + +func (c *ConsolePrecompile) Log_7f9bbca2(p0 bool, p1 *big.Int, p2 bool, p3 *big.Int) { + c.log(p0, p1, p2, p3) +} + +func (c *ConsolePrecompile) Log_399174d3(p0 bool, p1 *big.Int) { + c.log(p0, p1) +} + +func (c *ConsolePrecompile) Log_fedd1fff(p0 bool, p1 *big.Int, p2 string, p3 common.Address) { + c.log(p0, p1, p2, p3) +} + +func (c *ConsolePrecompile) Log_e5e70b2b(p0 bool, p1 *big.Int, p2 string, p3 bool) { + c.log(p0, p1, p2, p3) +} + +func (c *ConsolePrecompile) Log_c3fc3970(p0 bool, p1 *big.Int, p2 string) { + c.log(p0, p1, p2) +} + +func (c *ConsolePrecompile) Log_f5bc2249(p0 bool, p1 *big.Int, p2 string, p3 string) { + c.log(p0, p1, p2, p3) +} + +func (c *ConsolePrecompile) Log_6a1199e2(p0 bool, p1 *big.Int, p2 string, p3 *big.Int) { + c.log(p0, p1, p2, p3) +} + +func (c *ConsolePrecompile) Log_00dd87b9(p0 bool, p1 *big.Int, p2 *big.Int, p3 common.Address) { + c.log(p0, p1, p2, p3) +} + +func (c *ConsolePrecompile) Log_be984353(p0 bool, p1 *big.Int, p2 *big.Int, p3 bool) { + c.log(p0, p1, p2, p3) +} + +func (c *ConsolePrecompile) Log_37103367(p0 bool, p1 *big.Int, p2 *big.Int) { + c.log(p0, p1, p2) +} + +func (c *ConsolePrecompile) Log_8e69fb5d(p0 bool, p1 *big.Int, p2 *big.Int, p3 string) { + c.log(p0, p1, p2, p3) +} + +func (c *ConsolePrecompile) Log_374bb4b2(p0 bool, p1 *big.Int, p2 *big.Int, p3 *big.Int) { + c.log(p0, p1, p2, p3) +} + +func (c *ConsolePrecompile) Log_013d178b(p0 [10]byte) { + c.log(hexutil.Bytes(p0[:])) +} + +func (c *ConsolePrecompile) Log_04004a2e(p0 [11]byte) { + c.log(hexutil.Bytes(p0[:])) +} + +func (c *ConsolePrecompile) Log_86a06abd(p0 [12]byte) { + c.log(hexutil.Bytes(p0[:])) +} + +func (c *ConsolePrecompile) Log_94529e34(p0 [13]byte) { + c.log(hexutil.Bytes(p0[:])) +} + +func (c *ConsolePrecompile) Log_9266f07f(p0 [14]byte) { + c.log(hexutil.Bytes(p0[:])) +} + +func (c *ConsolePrecompile) Log_da9574e0(p0 [15]byte) { + c.log(hexutil.Bytes(p0[:])) +} + +func (c *ConsolePrecompile) Log_665c6104(p0 [16]byte) { + c.log(hexutil.Bytes(p0[:])) +} + +func (c *ConsolePrecompile) Log_339f673a(p0 [17]byte) { + c.log(hexutil.Bytes(p0[:])) +} + +func (c *ConsolePrecompile) Log_c4d23d9a(p0 [18]byte) { + c.log(hexutil.Bytes(p0[:])) +} + +func (c *ConsolePrecompile) Log_5e6b5a33(p0 [19]byte) { + c.log(hexutil.Bytes(p0[:])) +} + +func (c *ConsolePrecompile) Log_6e18a128(p0 [1]byte) { + c.log(hexutil.Bytes(p0[:])) +} + +func (c *ConsolePrecompile) Log_5188e3e9(p0 [20]byte) { + c.log(hexutil.Bytes(p0[:])) +} + +func (c *ConsolePrecompile) Log_e9da3560(p0 [21]byte) { + c.log(hexutil.Bytes(p0[:])) +} + +func (c *ConsolePrecompile) Log_d5fae89c(p0 [22]byte) { + c.log(hexutil.Bytes(p0[:])) +} + +func (c *ConsolePrecompile) Log_aba1cf0d(p0 [23]byte) { + c.log(hexutil.Bytes(p0[:])) +} + +func (c *ConsolePrecompile) Log_f1b35b34(p0 [24]byte) { + c.log(hexutil.Bytes(p0[:])) +} + +func (c *ConsolePrecompile) Log_0b84bc58(p0 [25]byte) { + c.log(hexutil.Bytes(p0[:])) +} + +func (c *ConsolePrecompile) Log_f8b149f1(p0 [26]byte) { + c.log(hexutil.Bytes(p0[:])) +} + +func (c *ConsolePrecompile) Log_3a3757dd(p0 [27]byte) { + c.log(hexutil.Bytes(p0[:])) +} + +func (c *ConsolePrecompile) Log_c82aeaee(p0 [28]byte) { + c.log(hexutil.Bytes(p0[:])) +} + +func (c *ConsolePrecompile) Log_4b69c3d5(p0 [29]byte) { + c.log(hexutil.Bytes(p0[:])) +} + +func (c *ConsolePrecompile) Log_e9b62296(p0 [2]byte) { + c.log(hexutil.Bytes(p0[:])) +} + +func (c *ConsolePrecompile) Log_ee12c4ed(p0 [30]byte) { + c.log(hexutil.Bytes(p0[:])) +} + +func (c *ConsolePrecompile) Log_c2854d92(p0 [31]byte) { + c.log(hexutil.Bytes(p0[:])) +} + +func (c *ConsolePrecompile) Log_27b7cf85(p0 [32]byte) { + c.log(hexutil.Bytes(p0[:])) +} + +func (c *ConsolePrecompile) Log_2d834926(p0 [3]byte) { + c.log(hexutil.Bytes(p0[:])) +} + +func (c *ConsolePrecompile) Log_e05f48d1(p0 [4]byte) { + c.log(hexutil.Bytes(p0[:])) +} + +func (c *ConsolePrecompile) Log_a684808d(p0 [5]byte) { + c.log(hexutil.Bytes(p0[:])) +} + +func (c *ConsolePrecompile) Log_ae84a591(p0 [6]byte) { + c.log(hexutil.Bytes(p0[:])) +} + +func (c *ConsolePrecompile) Log_4ed57e28(p0 [7]byte) { + c.log(hexutil.Bytes(p0[:])) +} + +func (c *ConsolePrecompile) Log_4f84252e(p0 [8]byte) { + c.log(hexutil.Bytes(p0[:])) +} + +func (c *ConsolePrecompile) Log_90bd8cd0(p0 [9]byte) { + c.log(hexutil.Bytes(p0[:])) +} + +func (c *ConsolePrecompile) Log_0be77f56(p0 hexutil.Bytes) { + c.log(p0) +} + +func (c *ConsolePrecompile) Log_2d5b6cb9(p0 *ABIInt256) { + c.log((*big.Int)(p0)) +} + +func (c *ConsolePrecompile) Log_ed8f28f6(p0 string, p1 common.Address, p2 common.Address, p3 common.Address) { + c.log(p0, p1, p2, p3) +} + +func (c *ConsolePrecompile) Log_b59dbd60(p0 string, p1 common.Address, p2 common.Address, p3 bool) { + c.log(p0, p1, p2, p3) +} + +func (c *ConsolePrecompile) Log_fcec75e0(p0 string, p1 common.Address, p2 common.Address) { + c.log(p0, p1, p2) +} + +func (c *ConsolePrecompile) Log_800a1c67(p0 string, p1 common.Address, p2 common.Address, p3 string) { + c.log(p0, p1, p2, p3) +} + +func (c *ConsolePrecompile) Log_8ef3f399(p0 string, p1 common.Address, p2 common.Address, p3 *big.Int) { + c.log(p0, p1, p2, p3) +} + +func (c *ConsolePrecompile) Log_223603bd(p0 string, p1 common.Address, p2 bool, p3 common.Address) { + c.log(p0, p1, p2, p3) +} + +func (c *ConsolePrecompile) Log_79884c2b(p0 string, p1 common.Address, p2 bool, p3 bool) { + c.log(p0, p1, p2, p3) +} + +func (c *ConsolePrecompile) Log_c91d5ed4(p0 string, p1 common.Address, p2 bool) { + c.log(p0, p1, p2) +} + +func (c *ConsolePrecompile) Log_0454c079(p0 string, p1 common.Address, p2 bool, p3 string) { + c.log(p0, p1, p2, p3) +} + +func (c *ConsolePrecompile) Log_3e9f866a(p0 string, p1 common.Address, p2 bool, p3 *big.Int) { + c.log(p0, p1, p2, p3) +} + +func (c *ConsolePrecompile) Log_319af333(p0 string, p1 common.Address) { + c.log(p0, p1) +} + +func (c *ConsolePrecompile) Log_aabc9a31(p0 string, p1 common.Address, p2 string, p3 common.Address) { + c.log(p0, p1, p2, p3) +} + +func (c *ConsolePrecompile) Log_5f15d28c(p0 string, p1 common.Address, p2 string, p3 bool) { + c.log(p0, p1, p2, p3) +} + +func (c *ConsolePrecompile) Log_e0e9ad4f(p0 string, p1 common.Address, p2 string) { + c.log(p0, p1, p2) +} + +func (c *ConsolePrecompile) Log_245986f2(p0 string, p1 common.Address, p2 string, p3 string) { + c.log(p0, p1, p2, p3) +} + +func (c *ConsolePrecompile) Log_91d1112e(p0 string, p1 common.Address, p2 string, p3 *big.Int) { + c.log(p0, p1, p2, p3) +} + +func (c *ConsolePrecompile) Log_63fb8bc5(p0 string, p1 common.Address, p2 *big.Int, p3 common.Address) { + c.log(p0, p1, p2, p3) +} + +func (c *ConsolePrecompile) Log_fc4845f0(p0 string, p1 common.Address, p2 *big.Int, p3 bool) { + c.log(p0, p1, p2, p3) +} + +func (c *ConsolePrecompile) Log_0d26b925(p0 string, p1 common.Address, p2 *big.Int) { + c.log(p0, p1, p2) +} + +func (c *ConsolePrecompile) Log_5a477632(p0 string, p1 common.Address, p2 *big.Int, p3 string) { + c.log(p0, p1, p2, p3) +} + +func (c *ConsolePrecompile) Log_f8f51b1e(p0 string, p1 common.Address, p2 *big.Int, p3 *big.Int) { + c.log(p0, p1, p2, p3) +} + +func (c *ConsolePrecompile) Log_33e9dd1d(p0 string, p1 bool, p2 common.Address, p3 common.Address) { + c.log(p0, p1, p2, p3) +} + +func (c *ConsolePrecompile) Log_958c28c6(p0 string, p1 bool, p2 common.Address, p3 bool) { + c.log(p0, p1, p2, p3) +} + +func (c *ConsolePrecompile) Log_932bbb38(p0 string, p1 bool, p2 common.Address) { + c.log(p0, p1, p2) +} + +func (c *ConsolePrecompile) Log_2d8e33a4(p0 string, p1 bool, p2 common.Address, p3 string) { + c.log(p0, p1, p2, p3) +} + +func (c *ConsolePrecompile) Log_5d08bb05(p0 string, p1 bool, p2 common.Address, p3 *big.Int) { + c.log(p0, p1, p2, p3) +} + +func (c *ConsolePrecompile) Log_7190a529(p0 string, p1 bool, p2 bool, p3 common.Address) { + c.log(p0, p1, p2, p3) +} + +func (c *ConsolePrecompile) Log_895af8c5(p0 string, p1 bool, p2 bool, p3 bool) { + c.log(p0, p1, p2, p3) +} + +func (c *ConsolePrecompile) Log_850b7ad6(p0 string, p1 bool, p2 bool) { + c.log(p0, p1, p2) +} + +func (c *ConsolePrecompile) Log_9d22d5dd(p0 string, p1 bool, p2 bool, p3 string) { + c.log(p0, p1, p2, p3) +} + +func (c *ConsolePrecompile) Log_8e3f78a9(p0 string, p1 bool, p2 bool, p3 *big.Int) { + c.log(p0, p1, p2, p3) +} + +func (c *ConsolePrecompile) Log_c3b55635(p0 string, p1 bool) { + c.log(p0, p1) +} + +func (c *ConsolePrecompile) Log_e0625b29(p0 string, p1 bool, p2 string, p3 common.Address) { + c.log(p0, p1, p2, p3) +} + +func (c *ConsolePrecompile) Log_3f8a701d(p0 string, p1 bool, p2 string, p3 bool) { + c.log(p0, p1, p2, p3) +} + +func (c *ConsolePrecompile) Log_e298f47d(p0 string, p1 bool, p2 string) { + c.log(p0, p1, p2) +} + +func (c *ConsolePrecompile) Log_a826caeb(p0 string, p1 bool, p2 string, p3 string) { + c.log(p0, p1, p2, p3) +} + +func (c *ConsolePrecompile) Log_24f91465(p0 string, p1 bool, p2 string, p3 *big.Int) { + c.log(p0, p1, p2, p3) +} + +func (c *ConsolePrecompile) Log_935e09bf(p0 string, p1 bool, p2 *big.Int, p3 common.Address) { + c.log(p0, p1, p2, p3) +} + +func (c *ConsolePrecompile) Log_8af7cf8a(p0 string, p1 bool, p2 *big.Int, p3 bool) { + c.log(p0, p1, p2, p3) +} + +func (c *ConsolePrecompile) Log_c95958d6(p0 string, p1 bool, p2 *big.Int) { + c.log(p0, p1, p2) +} + +func (c *ConsolePrecompile) Log_742d6ee7(p0 string, p1 bool, p2 *big.Int, p3 string) { + c.log(p0, p1, p2, p3) +} + +func (c *ConsolePrecompile) Log_64b5bb67(p0 string, p1 bool, p2 *big.Int, p3 *big.Int) { + c.log(p0, p1, p2, p3) +} + +func (c *ConsolePrecompile) Log_3ca6268e(p0 string, p1 *ABIInt256) { + c.log(p0, (*big.Int)(p1)) +} + +func (c *ConsolePrecompile) Log_41304fac(p0 string) { + c.log(p0) +} + +func (c *ConsolePrecompile) Log_439c7bef(p0 string, p1 string, p2 common.Address, p3 common.Address) { + c.log(p0, p1, p2, p3) +} + +func (c *ConsolePrecompile) Log_5ccd4e37(p0 string, p1 string, p2 common.Address, p3 bool) { + c.log(p0, p1, p2, p3) +} + +func (c *ConsolePrecompile) Log_95ed0195(p0 string, p1 string, p2 common.Address) { + c.log(p0, p1, p2) +} + +func (c *ConsolePrecompile) Log_eb1bff80(p0 string, p1 string, p2 common.Address, p3 string) { + c.log(p0, p1, p2, p3) +} + +func (c *ConsolePrecompile) Log_7cc3c607(p0 string, p1 string, p2 common.Address, p3 *big.Int) { + c.log(p0, p1, p2, p3) +} + +func (c *ConsolePrecompile) Log_c371c7db(p0 string, p1 string, p2 bool, p3 common.Address) { + c.log(p0, p1, p2, p3) +} + +func (c *ConsolePrecompile) Log_40785869(p0 string, p1 string, p2 bool, p3 bool) { + c.log(p0, p1, p2, p3) +} + +func (c *ConsolePrecompile) Log_b0e0f9b5(p0 string, p1 string, p2 bool) { + c.log(p0, p1, p2) +} + +func (c *ConsolePrecompile) Log_5e84b0ea(p0 string, p1 string, p2 bool, p3 string) { + c.log(p0, p1, p2, p3) +} + +func (c *ConsolePrecompile) Log_d6aefad2(p0 string, p1 string, p2 bool, p3 *big.Int) { + c.log(p0, p1, p2, p3) +} + +func (c *ConsolePrecompile) Log_4b5c4277(p0 string, p1 string) { + c.log(p0, p1) +} + +func (c *ConsolePrecompile) Log_6d572f44(p0 string, p1 string, p2 string, p3 common.Address) { + c.log(p0, p1, p2, p3) +} + +func (c *ConsolePrecompile) Log_2c1754ed(p0 string, p1 string, p2 string, p3 bool) { + c.log(p0, p1, p2, p3) +} + +func (c *ConsolePrecompile) Log_2ced7cef(p0 string, p1 string, p2 string) { + c.log(p0, p1, p2) +} + +func (c *ConsolePrecompile) Log_de68f20a(p0 string, p1 string, p2 string, p3 string) { + c.log(p0, p1, p2, p3) +} + +func (c *ConsolePrecompile) Log_8eafb02b(p0 string, p1 string, p2 string, p3 *big.Int) { + c.log(p0, p1, p2, p3) +} + +func (c *ConsolePrecompile) Log_1023f7b2(p0 string, p1 string, p2 *big.Int, p3 common.Address) { + c.log(p0, p1, p2, p3) +} + +func (c *ConsolePrecompile) Log_c3a8a654(p0 string, p1 string, p2 *big.Int, p3 bool) { + c.log(p0, p1, p2, p3) +} + +func (c *ConsolePrecompile) Log_5821efa1(p0 string, p1 string, p2 *big.Int) { + c.log(p0, p1, p2) +} + +func (c *ConsolePrecompile) Log_5d1a971a(p0 string, p1 string, p2 *big.Int, p3 string) { + c.log(p0, p1, p2, p3) +} + +func (c *ConsolePrecompile) Log_f45d7d2c(p0 string, p1 string, p2 *big.Int, p3 *big.Int) { + c.log(p0, p1, p2, p3) +} + +func (c *ConsolePrecompile) Log_5ea2b7ae(p0 string, p1 *big.Int, p2 common.Address, p3 common.Address) { + c.log(p0, p1, p2, p3) +} + +func (c *ConsolePrecompile) Log_82112a42(p0 string, p1 *big.Int, p2 common.Address, p3 bool) { + c.log(p0, p1, p2, p3) +} + +func (c *ConsolePrecompile) Log_1c7ec448(p0 string, p1 *big.Int, p2 common.Address) { + c.log(p0, p1, p2) +} + +func (c *ConsolePrecompile) Log_9ffb2f93(p0 string, p1 *big.Int, p2 common.Address, p3 string) { + c.log(p0, p1, p2, p3) +} + +func (c *ConsolePrecompile) Log_4f04fdc6(p0 string, p1 *big.Int, p2 common.Address, p3 *big.Int) { + c.log(p0, p1, p2, p3) +} + +func (c *ConsolePrecompile) Log_e0e95b98(p0 string, p1 *big.Int, p2 bool, p3 common.Address) { + c.log(p0, p1, p2, p3) +} + +func (c *ConsolePrecompile) Log_354c36d6(p0 string, p1 *big.Int, p2 bool, p3 bool) { + c.log(p0, p1, p2, p3) +} + +func (c *ConsolePrecompile) Log_ca7733b1(p0 string, p1 *big.Int, p2 bool) { + c.log(p0, p1, p2) +} + +func (c *ConsolePrecompile) Log_abf73a98(p0 string, p1 *big.Int, p2 bool, p3 string) { + c.log(p0, p1, p2, p3) +} + +func (c *ConsolePrecompile) Log_e41b6f6f(p0 string, p1 *big.Int, p2 bool, p3 *big.Int) { + c.log(p0, p1, p2, p3) +} + +func (c *ConsolePrecompile) Log_b60e72cc(p0 string, p1 *big.Int) { + c.log(p0, p1) +} + +func (c *ConsolePrecompile) Log_7c4632a4(p0 string, p1 *big.Int, p2 string, p3 common.Address) { + c.log(p0, p1, p2, p3) +} + +func (c *ConsolePrecompile) Log_7d24491d(p0 string, p1 *big.Int, p2 string, p3 bool) { + c.log(p0, p1, p2, p3) +} + +func (c *ConsolePrecompile) Log_5970e089(p0 string, p1 *big.Int, p2 string) { + c.log(p0, p1, p2) +} + +func (c *ConsolePrecompile) Log_5ab84e1f(p0 string, p1 *big.Int, p2 string, p3 string) { + c.log(p0, p1, p2, p3) +} + +func (c *ConsolePrecompile) Log_c67ea9d1(p0 string, p1 *big.Int, p2 string, p3 *big.Int) { + c.log(p0, p1, p2, p3) +} + +func (c *ConsolePrecompile) Log_e21de278(p0 string, p1 *big.Int, p2 *big.Int, p3 common.Address) { + c.log(p0, p1, p2, p3) +} + +func (c *ConsolePrecompile) Log_7626db92(p0 string, p1 *big.Int, p2 *big.Int, p3 bool) { + c.log(p0, p1, p2, p3) +} + +func (c *ConsolePrecompile) Log_ca47c4eb(p0 string, p1 *big.Int, p2 *big.Int) { + c.log(p0, p1, p2) +} + +func (c *ConsolePrecompile) Log_854b3496(p0 string, p1 *big.Int, p2 *big.Int, p3 string) { + c.log(p0, p1, p2, p3) +} + +func (c *ConsolePrecompile) Log_a7a87853(p0 string, p1 *big.Int, p2 *big.Int, p3 *big.Int) { + c.log(p0, p1, p2, p3) +} + +func (c *ConsolePrecompile) Log_2488b414(p0 *big.Int, p1 common.Address, p2 common.Address, p3 common.Address) { + c.log(p0, p1, p2, p3) +} + +func (c *ConsolePrecompile) Log_091ffaf5(p0 *big.Int, p1 common.Address, p2 common.Address, p3 bool) { + c.log(p0, p1, p2, p3) +} + +func (c *ConsolePrecompile) Log_bcfd9be0(p0 *big.Int, p1 common.Address, p2 common.Address) { + c.log(p0, p1, p2) +} + +func (c *ConsolePrecompile) Log_031c6f73(p0 *big.Int, p1 common.Address, p2 common.Address, p3 string) { + c.log(p0, p1, p2, p3) +} + +func (c *ConsolePrecompile) Log_736efbb6(p0 *big.Int, p1 common.Address, p2 common.Address, p3 *big.Int) { + c.log(p0, p1, p2, p3) +} + +func (c *ConsolePrecompile) Log_ef72c513(p0 *big.Int, p1 common.Address, p2 bool, p3 common.Address) { + c.log(p0, p1, p2, p3) +} + +func (c *ConsolePrecompile) Log_e351140f(p0 *big.Int, p1 common.Address, p2 bool, p3 bool) { + c.log(p0, p1, p2, p3) +} + +func (c *ConsolePrecompile) Log_9b6ec042(p0 *big.Int, p1 common.Address, p2 bool) { + c.log(p0, p1, p2) +} + +func (c *ConsolePrecompile) Log_90fb06aa(p0 *big.Int, p1 common.Address, p2 bool, p3 string) { + c.log(p0, p1, p2, p3) +} + +func (c *ConsolePrecompile) Log_5abd992a(p0 *big.Int, p1 common.Address, p2 bool, p3 *big.Int) { + c.log(p0, p1, p2, p3) +} + +func (c *ConsolePrecompile) Log_69276c86(p0 *big.Int, p1 common.Address) { + c.log(p0, p1) +} + +func (c *ConsolePrecompile) Log_9cba8fff(p0 *big.Int, p1 common.Address, p2 string, p3 common.Address) { + c.log(p0, p1, p2, p3) +} + +func (c *ConsolePrecompile) Log_cc32ab07(p0 *big.Int, p1 common.Address, p2 string, p3 bool) { + c.log(p0, p1, p2, p3) +} + +func (c *ConsolePrecompile) Log_63cb41f9(p0 *big.Int, p1 common.Address, p2 string) { + c.log(p0, p1, p2) +} + +func (c *ConsolePrecompile) Log_3e128ca3(p0 *big.Int, p1 common.Address, p2 string, p3 string) { + c.log(p0, p1, p2, p3) +} + +func (c *ConsolePrecompile) Log_46826b5d(p0 *big.Int, p1 common.Address, p2 string, p3 *big.Int) { + c.log(p0, p1, p2, p3) +} + +func (c *ConsolePrecompile) Log_15c127b5(p0 *big.Int, p1 common.Address, p2 *big.Int, p3 common.Address) { + c.log(p0, p1, p2, p3) +} + +func (c *ConsolePrecompile) Log_5f743a7c(p0 *big.Int, p1 common.Address, p2 *big.Int, p3 bool) { + c.log(p0, p1, p2, p3) +} + +func (c *ConsolePrecompile) Log_5a9b5ed5(p0 *big.Int, p1 common.Address, p2 *big.Int) { + c.log(p0, p1, p2) +} + +func (c *ConsolePrecompile) Log_ddb06521(p0 *big.Int, p1 common.Address, p2 *big.Int, p3 string) { + c.log(p0, p1, p2, p3) +} + +func (c *ConsolePrecompile) Log_0c9cd9c1(p0 *big.Int, p1 common.Address, p2 *big.Int, p3 *big.Int) { + c.log(p0, p1, p2, p3) +} + +func (c *ConsolePrecompile) Log_a1ef4cbb(p0 *big.Int, p1 bool, p2 common.Address, p3 common.Address) { + c.log(p0, p1, p2, p3) +} + +func (c *ConsolePrecompile) Log_454d54a5(p0 *big.Int, p1 bool, p2 common.Address, p3 bool) { + c.log(p0, p1, p2, p3) +} + +func (c *ConsolePrecompile) Log_35085f7b(p0 *big.Int, p1 bool, p2 common.Address) { + c.log(p0, p1, p2) +} + +func (c *ConsolePrecompile) Log_ade052c7(p0 *big.Int, p1 bool, p2 common.Address, p3 string) { + c.log(p0, p1, p2, p3) +} + +func (c *ConsolePrecompile) Log_078287f5(p0 *big.Int, p1 bool, p2 common.Address, p3 *big.Int) { + c.log(p0, p1, p2, p3) +} + +func (c *ConsolePrecompile) Log_69640b59(p0 *big.Int, p1 bool, p2 bool, p3 common.Address) { + c.log(p0, p1, p2, p3) +} + +func (c *ConsolePrecompile) Log_b6f577a1(p0 *big.Int, p1 bool, p2 bool, p3 bool) { + c.log(p0, p1, p2, p3) +} + +func (c *ConsolePrecompile) Log_20718650(p0 *big.Int, p1 bool, p2 bool) { + c.log(p0, p1, p2) +} + +func (c *ConsolePrecompile) Log_dddb9561(p0 *big.Int, p1 bool, p2 bool, p3 string) { + c.log(p0, p1, p2, p3) +} + +func (c *ConsolePrecompile) Log_7464ce23(p0 *big.Int, p1 bool, p2 bool, p3 *big.Int) { + c.log(p0, p1, p2, p3) +} + +func (c *ConsolePrecompile) Log_1c9d7eb3(p0 *big.Int, p1 bool) { + c.log(p0, p1) +} + +func (c *ConsolePrecompile) Log_ef529018(p0 *big.Int, p1 bool, p2 string, p3 common.Address) { + c.log(p0, p1, p2, p3) +} + +func (c *ConsolePrecompile) Log_eb928d7f(p0 *big.Int, p1 bool, p2 string, p3 bool) { + c.log(p0, p1, p2, p3) +} + +func (c *ConsolePrecompile) Log_85775021(p0 *big.Int, p1 bool, p2 string) { + c.log(p0, p1, p2) +} + +func (c *ConsolePrecompile) Log_68c8b8bd(p0 *big.Int, p1 bool, p2 string, p3 string) { + c.log(p0, p1, p2, p3) +} + +func (c *ConsolePrecompile) Log_2c1d0746(p0 *big.Int, p1 bool, p2 string, p3 *big.Int) { + c.log(p0, p1, p2, p3) +} + +func (c *ConsolePrecompile) Log_88cb6041(p0 *big.Int, p1 bool, p2 *big.Int, p3 common.Address) { + c.log(p0, p1, p2, p3) +} + +func (c *ConsolePrecompile) Log_91a02e2a(p0 *big.Int, p1 bool, p2 *big.Int, p3 bool) { + c.log(p0, p1, p2, p3) +} + +func (c *ConsolePrecompile) Log_20098014(p0 *big.Int, p1 bool, p2 *big.Int) { + c.log(p0, p1, p2) +} + +func (c *ConsolePrecompile) Log_de03e774(p0 *big.Int, p1 bool, p2 *big.Int, p3 string) { + c.log(p0, p1, p2, p3) +} + +func (c *ConsolePrecompile) Log_c6acc7a8(p0 *big.Int, p1 bool, p2 *big.Int, p3 *big.Int) { + c.log(p0, p1, p2, p3) +} + +func (c *ConsolePrecompile) Log_f82c50f1(p0 *big.Int) { + c.log(p0) +} + +func (c *ConsolePrecompile) Log_6168ed61(p0 *big.Int, p1 string, p2 common.Address, p3 common.Address) { + c.log(p0, p1, p2, p3) +} + +func (c *ConsolePrecompile) Log_90c30a56(p0 *big.Int, p1 string, p2 common.Address, p3 bool) { + c.log(p0, p1, p2, p3) +} + +func (c *ConsolePrecompile) Log_7afac959(p0 *big.Int, p1 string, p2 common.Address) { + c.log(p0, p1, p2) +} + +func (c *ConsolePrecompile) Log_9c3adfa1(p0 *big.Int, p1 string, p2 common.Address, p3 string) { + c.log(p0, p1, p2, p3) +} + +func (c *ConsolePrecompile) Log_e8d3018d(p0 *big.Int, p1 string, p2 common.Address, p3 *big.Int) { + c.log(p0, p1, p2, p3) +} + +func (c *ConsolePrecompile) Log_ae2ec581(p0 *big.Int, p1 string, p2 bool, p3 common.Address) { + c.log(p0, p1, p2, p3) +} + +func (c *ConsolePrecompile) Log_ba535d9c(p0 *big.Int, p1 string, p2 bool, p3 bool) { + c.log(p0, p1, p2, p3) +} + +func (c *ConsolePrecompile) Log_4ceda75a(p0 *big.Int, p1 string, p2 bool) { + c.log(p0, p1, p2) +} + +func (c *ConsolePrecompile) Log_d2d423cd(p0 *big.Int, p1 string, p2 bool, p3 string) { + c.log(p0, p1, p2, p3) +} + +func (c *ConsolePrecompile) Log_cf009880(p0 *big.Int, p1 string, p2 bool, p3 *big.Int) { + c.log(p0, p1, p2, p3) +} + +func (c *ConsolePrecompile) Log_643fd0df(p0 *big.Int, p1 string) { + c.log(p0, p1) +} + +func (c *ConsolePrecompile) Log_d583c602(p0 *big.Int, p1 string, p2 string, p3 common.Address) { + c.log(p0, p1, p2, p3) +} + +func (c *ConsolePrecompile) Log_b3a6b6bd(p0 *big.Int, p1 string, p2 string, p3 bool) { + c.log(p0, p1, p2, p3) +} + +func (c *ConsolePrecompile) Log_b115611f(p0 *big.Int, p1 string, p2 string) { + c.log(p0, p1, p2) +} + +func (c *ConsolePrecompile) Log_21ad0683(p0 *big.Int, p1 string, p2 string, p3 string) { + c.log(p0, p1, p2, p3) +} + +func (c *ConsolePrecompile) Log_b028c9bd(p0 *big.Int, p1 string, p2 string, p3 *big.Int) { + c.log(p0, p1, p2, p3) +} + +func (c *ConsolePrecompile) Log_3b2279b4(p0 *big.Int, p1 string, p2 *big.Int, p3 common.Address) { + c.log(p0, p1, p2, p3) +} + +func (c *ConsolePrecompile) Log_691a8f74(p0 *big.Int, p1 string, p2 *big.Int, p3 bool) { + c.log(p0, p1, p2, p3) +} + +func (c *ConsolePrecompile) Log_37aa7d4c(p0 *big.Int, p1 string, p2 *big.Int) { + c.log(p0, p1, p2) +} + +func (c *ConsolePrecompile) Log_b7b914ca(p0 *big.Int, p1 string, p2 *big.Int, p3 string) { + c.log(p0, p1, p2, p3) +} + +func (c *ConsolePrecompile) Log_82c25b74(p0 *big.Int, p1 string, p2 *big.Int, p3 *big.Int) { + c.log(p0, p1, p2, p3) +} + +func (c *ConsolePrecompile) Log_56a5d1b1(p0 *big.Int, p1 *big.Int, p2 common.Address, p3 common.Address) { + c.log(p0, p1, p2, p3) +} + +func (c *ConsolePrecompile) Log_15cac476(p0 *big.Int, p1 *big.Int, p2 common.Address, p3 bool) { + c.log(p0, p1, p2, p3) +} + +func (c *ConsolePrecompile) Log_5c96b331(p0 *big.Int, p1 *big.Int, p2 common.Address) { + c.log(p0, p1, p2) +} + +func (c *ConsolePrecompile) Log_6cde40b8(p0 *big.Int, p1 *big.Int, p2 common.Address, p3 string) { + c.log(p0, p1, p2, p3) +} + +func (c *ConsolePrecompile) Log_88f6e4b2(p0 *big.Int, p1 *big.Int, p2 common.Address, p3 *big.Int) { + c.log(p0, p1, p2, p3) +} + +func (c *ConsolePrecompile) Log_9a816a83(p0 *big.Int, p1 *big.Int, p2 bool, p3 common.Address) { + c.log(p0, p1, p2, p3) +} + +func (c *ConsolePrecompile) Log_ab085ae6(p0 *big.Int, p1 *big.Int, p2 bool, p3 bool) { + c.log(p0, p1, p2, p3) +} + +func (c *ConsolePrecompile) Log_4766da72(p0 *big.Int, p1 *big.Int, p2 bool) { + c.log(p0, p1, p2) +} + +func (c *ConsolePrecompile) Log_a5b4fc99(p0 *big.Int, p1 *big.Int, p2 bool, p3 string) { + c.log(p0, p1, p2, p3) +} + +func (c *ConsolePrecompile) Log_eb7f6fd2(p0 *big.Int, p1 *big.Int, p2 bool, p3 *big.Int) { + c.log(p0, p1, p2, p3) +} + +func (c *ConsolePrecompile) Log_f666715a(p0 *big.Int, p1 *big.Int) { + c.log(p0, p1) +} + +func (c *ConsolePrecompile) Log_42d21db7(p0 *big.Int, p1 *big.Int, p2 string, p3 common.Address) { + c.log(p0, p1, p2, p3) +} + +func (c *ConsolePrecompile) Log_7af6ab25(p0 *big.Int, p1 *big.Int, p2 string, p3 bool) { + c.log(p0, p1, p2, p3) +} + +func (c *ConsolePrecompile) Log_71d04af2(p0 *big.Int, p1 *big.Int, p2 string) { + c.log(p0, p1, p2) +} + +func (c *ConsolePrecompile) Log_27d8afd2(p0 *big.Int, p1 *big.Int, p2 string, p3 string) { + c.log(p0, p1, p2, p3) +} + +func (c *ConsolePrecompile) Log_5da297eb(p0 *big.Int, p1 *big.Int, p2 string, p3 *big.Int) { + c.log(p0, p1, p2, p3) +} + +func (c *ConsolePrecompile) Log_fa8185af(p0 *big.Int, p1 *big.Int, p2 *big.Int, p3 common.Address) { + c.log(p0, p1, p2, p3) +} + +func (c *ConsolePrecompile) Log_c598d185(p0 *big.Int, p1 *big.Int, p2 *big.Int, p3 bool) { + c.log(p0, p1, p2, p3) +} + +func (c *ConsolePrecompile) Log_d1ed7a3c(p0 *big.Int, p1 *big.Int, p2 *big.Int) { + c.log(p0, p1, p2) +} + +func (c *ConsolePrecompile) Log_59cfcbe3(p0 *big.Int, p1 *big.Int, p2 *big.Int, p3 string) { + c.log(p0, p1, p2, p3) +} + +func (c *ConsolePrecompile) Log_193fb800(p0 *big.Int, p1 *big.Int, p2 *big.Int, p3 *big.Int) { + c.log(p0, p1, p2, p3) +} diff --git a/op-chain-ops/script/console_test.go b/op-chain-ops/script/console_test.go new file mode 100644 index 000000000000..d67f5efc0f5f --- /dev/null +++ b/op-chain-ops/script/console_test.go @@ -0,0 +1,75 @@ +package script + +import ( + "fmt" + "log/slog" + "math/big" + "math/rand" // nosemgrep + "testing" + + "github.com/ethereum/go-ethereum/common" + "github.com/ethereum/go-ethereum/common/hexutil" + "github.com/ethereum/go-ethereum/log" + "github.com/stretchr/testify/require" + + "github.com/ethereum-optimism/optimism/op-service/testlog" + "github.com/ethereum-optimism/optimism/op-service/testutils" +) + +func TestConsole(t *testing.T) { + logger, captLog := testlog.CaptureLogger(t, log.LevelDebug) + + rng := rand.New(rand.NewSource(123)) + sender := testutils.RandomAddress(rng) + alice := testutils.RandomAddress(rng) + bob := testutils.RandomAddress(rng) + t.Logf("sender: %s", sender) + t.Logf("alice: %s", alice) + t.Logf("bob: %s", bob) + c := &ConsolePrecompile{ + logger: logger, + sender: func() common.Address { return sender }, + } + p, err := NewPrecompile[*ConsolePrecompile](c) + require.NoError(t, err) + + // test Log_daf0d4aa + input := make([]byte, 0, 4+32+32) + input = append(input, hexutil.MustDecode("0xdaf0d4aa")...) + input = append(input, leftPad32(alice[:])...) + input = append(input, leftPad32(bob[:])...) + t.Logf("input: %x", input) + + _, err = p.Run(input) + require.NoError(t, err) + + for i, l := range *captLog.Logs { + t.Logf("log %d", i) + l.Attrs(func(attr slog.Attr) bool { + t.Logf("attr: k: %s, v: %s", attr.Key, attr.Value.String()) + return true + }) + } + + require.NotNil(t, captLog.FindLog(testlog.NewMessageFilter(fmt.Sprintf("%s %s", alice, bob)))) + require.NotNil(t, captLog.FindLog(testlog.NewAttributesFilter("sender", sender.String()))) +} + +func TestFormatter(t *testing.T) { + got := consoleFormat("hello %d world %x example %3e", + big.NewInt(3), big.NewInt(0xc0ffee), big.NewInt(42), big.NewInt(123)) + require.Equal(t, "hello 3 world 0xc0ffee example 0.042 123", got) + require.Equal(t, "4.2", consoleFormat("%8e", big.NewInt(420000000))) + require.Equal(t, "foo true bar false", consoleFormat("foo %s bar %s", true, false)) + require.Equal(t, "foo 1 bar 0", consoleFormat("foo %d bar %d", true, false)) + require.Equal(t, "sender: "+DefaultSenderAddr.String(), + consoleFormat("sender: %s", DefaultSenderAddr)) + require.Equal(t, "long 0.000000000000000042 number", consoleFormat("long %18e number", big.NewInt(42))) + require.Equal(t, "long 4200.000000000000000003 number", consoleFormat("long %18e number", + new(big.Int).Add(new(big.Int).Mul( + big.NewInt(42), + new(big.Int).Exp(big.NewInt(10), big.NewInt(20), nil), + ), big.NewInt(3)))) + require.Equal(t, "1.23456e5", consoleFormat("%e", big.NewInt(123456))) + require.Equal(t, "-1.23456e5", consoleFormat("%e", (*ABIInt256)(big.NewInt(-123456)))) +} diff --git a/op-chain-ops/script/consolegen/main.go b/op-chain-ops/script/consolegen/main.go new file mode 100644 index 000000000000..9a3140d52f45 --- /dev/null +++ b/op-chain-ops/script/consolegen/main.go @@ -0,0 +1,128 @@ +package main + +import ( + "flag" + "fmt" + "os" + "strconv" + "strings" + + "github.com/ethereum/go-ethereum/crypto" +) + +func main() { + var abiTxtPath string + flag.StringVar(&abiTxtPath, "abi-txt", "console2.txt", "Path of text file with ABI method signatures") + var outPath string + flag.StringVar(&outPath, "out", "console2_gen.go", "Path to write output to") + flag.Parse() + data, err := os.ReadFile(abiTxtPath) + if err != nil { + fmt.Printf("failed to read file: %v\n", err) + os.Exit(1) + } + lines := strings.Split(string(data), "\n") + var out strings.Builder + out.WriteString(`// AUTO-GENERATED - DO NOT EDIT +package script + +import ( + "math/big" + + "github.com/ethereum/go-ethereum/common" + "github.com/ethereum/go-ethereum/common/hexutil" +) + +`) + for _, line := range lines { + line = strings.TrimSpace(line) + if line == "" { + continue + } + byte4ID := crypto.Keccak256([]byte(line))[:4] + if !strings.HasPrefix(line, "log(") { + fmt.Printf("unexpected line: %q\n", line) + os.Exit(1) + } + line = strings.TrimPrefix(line, "log(") + line = strings.TrimSuffix(line, ")") + params := strings.Split(line, ",") + out.WriteString("func (c *ConsolePrecompile) Log_") + out.WriteString(fmt.Sprintf("%x", byte4ID)) + out.WriteString("(") + for i, p := range params { + if p == "" { + continue + } + out.WriteString(fmt.Sprintf("p%d ", i)) + name, err := solToGo(p) + if err != nil { + fmt.Printf("unexpected param type: %q\n", p) + os.Exit(1) + } + out.WriteString(name) + if i != len(params)-1 { + out.WriteString(", ") + } + } + out.WriteString(") {\n") + out.WriteString("\tc.log(") + for i, p := range params { + if p == "" { + continue + } + out.WriteString(prettyArg(fmt.Sprintf("p%d", i), p)) + if i != len(params)-1 { + out.WriteString(", ") + } + } + out.WriteString(")\n") + out.WriteString("}\n\n") + } + if err := os.WriteFile(outPath, []byte(out.String()), 0644); err != nil { + fmt.Printf("failed to write output: %v\n", err) + os.Exit(1) + } + fmt.Println("done!") +} + +func solToGo(name string) (string, error) { + switch name { + case "address": + return "common.Address", nil + case "uint256": + return "*big.Int", nil + case "int256": + return "*ABIInt256", nil + case "string", "bool", "int8", "int16", "int32", "int64", "uint8", "uint16", "uint32", "uint64": + return name, nil + case "bytes": + return "hexutil.Bytes", nil + default: + if strings.HasPrefix(name, "bytes") { + n, err := strconv.Atoi(strings.TrimPrefix(name, "bytes")) + if err != nil { + return "", err + } + if n > 32 { + return "", fmt.Errorf("unexpected large bytes slice type: %d", n) + } + return fmt.Sprintf("[%d]byte", n), nil + } + return "", fmt.Errorf("unrecognized solidity type name: %s", name) + } +} + +func prettyArg(arg string, typ string) string { + switch typ { + case "int256": + return fmt.Sprintf("(*big.Int)(%s)", arg) + case "bytes": + return arg + default: + if strings.HasPrefix(typ, "bytes") { + return fmt.Sprintf("hexutil.Bytes(%s[:])", arg) + } + return arg + } +} diff --git a/op-chain-ops/script/context.go b/op-chain-ops/script/context.go new file mode 100644 index 000000000000..a7a8fb7eb46a --- /dev/null +++ b/op-chain-ops/script/context.go @@ -0,0 +1,51 @@ +package script + +import ( + "math/big" + + "github.com/ethereum/go-ethereum/common" +) + +var ( + // DefaultSenderAddr is known as DEFAULT_SENDER = address(uint160(uint256(keccak256("foundry default caller")))) + DefaultSenderAddr = common.HexToAddress("0x1804c8AB1F12E6bbf3894d4083f33e07309d1f38") + // DefaultScriptAddr is the address of the initial executing script, computed from: + // cast compute-address --nonce 1 0x1804c8AB1F12E6bbf3894d4083f33e07309d1f38 + DefaultScriptAddr = common.HexToAddress("0x7FA9385bE102ac3EAc297483Dd6233D62b3e1496") + // VMAddr is known as VM_ADDRESS = address(uint160(uint256(keccak256("hevm cheat code")))); + VMAddr = common.HexToAddress("0x7109709ECfa91a80626fF3989D68f67F5b1DD12D") + // ConsoleAddr is known as CONSOLE, "console.log" in ascii. + // Utils like console.sol and console2.sol work by executing a staticcall to this address. + ConsoleAddr = common.HexToAddress("0x000000000000000000636F6e736F6c652e6c6f67") + // ScriptDeployer is used for temporary scripts address(uint160(uint256(keccak256("op-stack script deployer")))) + ScriptDeployer = common.HexToAddress("0x76Ce131128F3616871f8CDA86d18fAB44E4d0D8B") +) + +const ( + // DefaultFoundryGasLimit is set to int64.max in foundry.toml + DefaultFoundryGasLimit = 9223372036854775807 +) + +type Context struct { + ChainID *big.Int + Sender common.Address + Origin common.Address + FeeRecipient common.Address + GasLimit uint64 + BlockNum uint64 + Timestamp uint64 + PrevRandao common.Hash + BlobHashes []common.Hash +} + +var DefaultContext = Context{ + ChainID: big.NewInt(1337), + Sender: DefaultSenderAddr, + Origin: DefaultSenderAddr, + FeeRecipient: common.Address{}, + GasLimit: DefaultFoundryGasLimit, + BlockNum: 0, + Timestamp: 0, + PrevRandao: common.Hash{}, + BlobHashes: []common.Hash{}, +} diff --git a/op-chain-ops/script/deterministic.go b/op-chain-ops/script/deterministic.go new file mode 100644 index 000000000000..c7b02632a55e --- /dev/null +++ b/op-chain-ops/script/deterministic.go @@ -0,0 +1,9 @@ +package script + +import "github.com/ethereum/go-ethereum/common" + +var ( + // DeterministicDeployerAddress is the address of the deterministic deployer Forge uses + // to provide deterministic contract addresses. + DeterministicDeployerAddress = common.HexToAddress("0x4e59b44847b379578588920ca78fbf26c0b4956c") +) diff --git a/op-chain-ops/script/prank.go b/op-chain-ops/script/prank.go new file mode 100644 index 000000000000..b6a68f4c44b1 --- /dev/null +++ b/op-chain-ops/script/prank.go @@ -0,0 +1,294 @@ +package script + +import ( + "bytes" + "crypto/sha256" + "encoding/binary" + "errors" + "fmt" + "math/big" + + "github.com/holiman/uint256" + + "github.com/ethereum/go-ethereum/common" + "github.com/ethereum/go-ethereum/common/hexutil" + "github.com/ethereum/go-ethereum/core/vm" + "github.com/ethereum/go-ethereum/crypto" +) + +// Prank represents an active prank task for the next sub-call. +// This is embedded into a call-frame, to then influence the sub-call through a caller-override. +type Prank struct { + // Sender overrides msg.sender + Sender *common.Address + // Origin overrides tx.origin (set to actual origin if not part of the prank) + Origin *common.Address + // PrevOrigin is the tx.origin to restore after the prank + PrevOrigin common.Address + // Repeat is true if the prank persists after returning from a sub-call + Repeat bool + // A Prank may be a broadcast also. + Broadcast bool +} + +// prankRef implements the vm.ContractRef interface, to mock a caller. +type prankRef struct { + prank common.Address + ref vm.ContractRef +} + +var _ vm.ContractRef = (*prankRef)(nil) + +func (p *prankRef) Address() common.Address { + return p.prank +} + +// Value returns the value send into this contract context. +// The delegate call tracer implicitly relies on this being implemented on ContractRef +func (p *prankRef) Value() *uint256.Int { + return p.ref.(interface{ Value() *uint256.Int }).Value() +} + +func (h *Host) handleCaller(caller vm.ContractRef) vm.ContractRef { + // apply prank, if top call-frame had set up a prank + if len(h.callStack) > 0 { + parentCallFrame := h.callStack[len(h.callStack)-1] + if parentCallFrame.Prank != nil && caller.Address() != VMAddr { // pranks do not apply to the cheatcode precompile + if parentCallFrame.Prank.Broadcast && parentCallFrame.LastOp == vm.CREATE2 && h.useCreate2Deployer { + return &prankRef{ + prank: DeterministicDeployerAddress, + ref: caller, + } + } + + if parentCallFrame.Prank.Sender != nil { + return &prankRef{ + prank: *parentCallFrame.Prank.Sender, + ref: caller, + } + } + if parentCallFrame.Prank.Origin != nil { + h.env.TxContext.Origin = *parentCallFrame.Prank.Origin + } + } + } + return caller +} + +// Prank applies a prank to the current call-frame. +// Any sub-call will apply the prank to their frame context. +func (h *Host) Prank(msgSender *common.Address, txOrigin *common.Address, repeat bool, broadcast bool) error { + if len(h.callStack) == 0 { + h.log.Warn("no call stack") + return nil // cannot prank while not in a call. + } + cf := h.callStack[len(h.callStack)-1] + if cf.Prank != nil { + if cf.Prank.Broadcast && !broadcast { + return errors.New("you have an active broadcast; broadcasting and pranks are not compatible") + } + if !cf.Prank.Broadcast && broadcast { + return errors.New("you have an active prank; broadcasting and pranks are not compatible") + } + } + if broadcast { + h.log.Debug("starting broadcast", "sender", msgSender, "repeat", repeat) + } else { + h.log.Debug("starting prank", "sender", msgSender, "repeat", repeat) + } + cf.Prank = &Prank{ + Sender: msgSender, + Origin: txOrigin, + PrevOrigin: h.env.TxContext.Origin, + Repeat: repeat, + Broadcast: broadcast, + } + return nil +} + +// StopPrank disables the current prank. Any sub-call will not be pranked. +func (h *Host) StopPrank(broadcast bool) error { + if len(h.callStack) == 0 { + return nil + } + cf := h.callStack[len(h.callStack)-1] + if cf.Prank == nil { + if broadcast { + return errors.New("no broadcast in progress to stop") + } + return nil + } + if cf.Prank.Broadcast && !broadcast { + // stopPrank on active broadcast is silent and no-op + return nil + } + if !cf.Prank.Broadcast && broadcast { + return errors.New("no broadcast in progress to stop") + } + if broadcast { + h.log.Debug("stopping broadcast") + } else { + h.log.Debug("stopping prank") + } + cf.Prank = nil + return nil +} + +// CallerMode returns the type of the top-most callframe, +// i.e. if we are in regular operation, a prank, or a broadcast (special kind of prank). +func (h *Host) CallerMode() CallerMode { + if len(h.callStack) == 0 { + return CallerModeNone + } + cf := h.callStack[len(h.callStack)-1] + if cf.Prank != nil { + if cf.Prank.Broadcast { + if cf.Prank.Repeat { + return CallerModeRecurrentBroadcast + } + return CallerModeBroadcast + } + if cf.Prank.Repeat { + return CallerModeRecurrentPrank + } + return CallerModePrank + } + return CallerModeNone +} + +// CallerMode matches the CallerMode forge cheatcode enum. +type CallerMode uint8 + +func (cm CallerMode) Big() *big.Int { + return big.NewInt(int64(cm)) +} + +const ( + CallerModeNone CallerMode = iota + CallerModeBroadcast + CallerModeRecurrentBroadcast + CallerModePrank + CallerModeRecurrentPrank +) + +type BroadcastType string + +const ( + BroadcastCall BroadcastType = "call" + BroadcastCreate BroadcastType = "create" + // BroadcastCreate2 is to be broadcast via the Create2Deployer, + // and not really documented much anywhere. + BroadcastCreate2 BroadcastType = "create2" +) + +func (bt BroadcastType) String() string { + return string(bt) +} + +func (bt BroadcastType) MarshalText() ([]byte, error) { + return []byte(bt.String()), nil +} + +func (bt *BroadcastType) UnmarshalText(data []byte) error { + v := BroadcastType(data) + switch v { + case BroadcastCall, BroadcastCreate, BroadcastCreate2: + *bt = v + return nil + default: + return fmt.Errorf("unrecognized broadcast type bytes: %x", data) + } +} + +// Broadcast captures a transaction that was selected to be broadcast +// via vm.broadcast(). Actually submitting the transaction is left up +// to other tools. +type Broadcast struct { + From common.Address `json:"from"` + To common.Address `json:"to"` // set to expected contract address, if this is a deployment + Input hexutil.Bytes `json:"input"` // set to contract-creation code, if this is a deployment + Value *hexutil.U256 `json:"value"` + Salt common.Hash `json:"salt"` // set if this is a Create2 broadcast + GasUsed uint64 `json:"gasUsed"` + Type BroadcastType `json:"type"` + Nonce uint64 `json:"nonce"` // pre-state nonce of From, before any increment (always 0 if create2) +} + +// ID returns a hash that can be used to identify the broadcast. +// This is used instead of the transaction hash since broadcasting +// tools can change gas limits and other fields which would change +// the resulting transaction hash. +func (b Broadcast) ID() common.Hash { + h := sha256.New() + _, _ = h.Write(b.From[:]) + _, _ = h.Write(b.To[:]) + _, _ = h.Write(b.Input) + _, _ = h.Write(((*uint256.Int)(b.Value)).Bytes()) + _, _ = h.Write(b.Salt[:]) + nonce := make([]byte, 8) + binary.BigEndian.PutUint64(nonce, b.Nonce) + _, _ = h.Write(nonce) + sum := h.Sum(nil) + return common.BytesToHash(sum) +} + +// NewBroadcast creates a Broadcast from a parent callframe, and the completed child callframe. +// This method is preferred to manually creating the struct since it correctly handles +// data that must be copied prior to being returned to prevent accidental mutation. +func NewBroadcast(parent, current *CallFrame) Broadcast { + ctx := current.Ctx + + value := ctx.CallValue() + if value == nil { + value = uint256.NewInt(0) + } + + // Code is tracked separate from calldata input, + // even though they are the same thing for a regular contract creation + input := ctx.CallInput() + if ctx.Contract.IsDeployment { + input = ctx.Contract.Code + } + + bcast := Broadcast{ + From: ctx.Caller(), + To: ctx.Address(), + // Need to clone the input below since memory is reused in the VM + Input: bytes.Clone(input), + Value: (*hexutil.U256)(value.Clone()), + GasUsed: current.GasUsed, + } + + switch parent.LastOp { + case vm.CREATE: + bcast.Type = BroadcastCreate + // Nonce bump was already applied, but we need the pre-state + bcast.Nonce = current.CallerNonce - 1 + expectedAddr := crypto.CreateAddress(bcast.From, bcast.Nonce) + if expectedAddr != bcast.To { + panic(fmt.Errorf("script bug: create broadcast has "+ + "unexpected address: %s, expected %s. Sender: %s, Nonce: %d", + bcast.To, expectedAddr, bcast.From, bcast.Nonce)) + } + case vm.CREATE2: + bcast.Salt = parent.LastCreate2Salt + initHash := crypto.Keccak256Hash(bcast.Input) + expectedAddr := crypto.CreateAddress2(bcast.From, bcast.Salt, initHash[:]) + // Sanity-check the create2 salt is correct by checking the address computation. + if expectedAddr != bcast.To { + panic(fmt.Errorf("script bug: create2 broadcast has "+ + "unexpected address: %s, expected %s. Sender: %s, Salt: %s, Inithash: %s", + bcast.To, expectedAddr, bcast.From, bcast.Salt, initHash)) + } + bcast.Type = BroadcastCreate2 + bcast.Nonce = 0 // always 0. The nonce should not matter for create2. + case vm.CALL: + bcast.Type = BroadcastCall + // Nonce bump was already applied, but we need the pre-state + bcast.Nonce = current.CallerNonce - 1 + default: + panic(fmt.Errorf("unexpected broadcast operation %s", parent.LastOp)) + } + + return bcast +} diff --git a/op-chain-ops/script/precompile.go b/op-chain-ops/script/precompile.go new file mode 100644 index 000000000000..2dcea6601883 --- /dev/null +++ b/op-chain-ops/script/precompile.go @@ -0,0 +1,596 @@ +package script + +import ( + "bytes" + "encoding/binary" + "errors" + "fmt" + "math/big" + "reflect" + "strings" + + "github.com/ethereum/go-ethereum/accounts/abi" + "github.com/ethereum/go-ethereum/common" + "github.com/ethereum/go-ethereum/common/hexutil" + "github.com/ethereum/go-ethereum/core/vm" + "github.com/ethereum/go-ethereum/crypto" +) + +var setterFnSig = "set(bytes4,address)" +var setterFnBytes4 = bytes4(setterFnSig) + +// precompileFunc is a prepared function to perform a method call / field read with ABI decoding/encoding. +type precompileFunc struct { + goName string + abiSignature string + fn func(input []byte) ([]byte, error) +} + +// bytes4 computes a 4-byte method-selector ID of a solidity method signature +func bytes4(sig string) [4]byte { + return [4]byte(crypto.Keccak256([]byte(sig))[:4]) +} + +// big-endian uint64 to bytes32 +func b32(v uint64) []byte { + out := make([]byte, 32) + binary.BigEndian.PutUint64(out[24:], v) + return out +} + +// leftPad32 to multiple of 32 bytes +func leftPad32(data []byte) []byte { + out := bytes.Clone(data) + if len(out)%32 == 0 { + return out + } + return append(make([]byte, 32-(len(out)%32)), out...) +} + +// rightPad32 to multiple of 32 bytes +func rightPad32(data []byte) []byte { + out := bytes.Clone(data) + if len(out)%32 == 0 { + return out + } + return append(out, make([]byte, 32-(len(out)%32))...) +} + +type settableField struct { + name string + value *reflect.Value +} + +// Precompile is a wrapper around a Go object, making it a precompile. +type Precompile[E any] struct { + Precompile E + + fieldsOnly bool + + fieldSetter bool + settable map[[4]byte]*settableField + + // abiMethods is effectively the jump-table for 4-byte ABI calls to the precompile. + abiMethods map[[4]byte]*precompileFunc +} + +var _ vm.PrecompiledContract = (*Precompile[struct{}])(nil) + +type PrecompileOption[E any] func(p *Precompile[E]) + +func WithFieldsOnly[E any](p *Precompile[E]) { + p.fieldsOnly = true +} + +func WithFieldSetter[E any](p *Precompile[E]) { + p.fieldSetter = true +} + +// NewPrecompile wraps a Go object into a Precompile. +// All exported fields and methods will have a corresponding ABI interface. +// Fields with a tag `evm:"-"` will be ignored, or can override their ABI name to x with this tag: `evm:"x"`. +// Field names and method names are adjusted to start with a lowercase character in the ABI signature. +// Method names may end with a `_X` where X must be the 4byte selector (this is sanity-checked), +// to support multiple variants of the same method with different ABI input parameters. +// Methods may return an error, which will result in a revert, rather than become an ABI encoded arg, if not nil. +// All precompile methods have 0 gas cost. +func NewPrecompile[E any](e E, opts ...PrecompileOption[E]) (*Precompile[E], error) { + out := &Precompile[E]{ + Precompile: e, + abiMethods: make(map[[4]byte]*precompileFunc), + fieldsOnly: false, + fieldSetter: false, + settable: make(map[[4]byte]*settableField), + } + for _, opt := range opts { + opt(out) + } + elemVal := reflect.ValueOf(e) + // setup methods (and if pointer, the indirect methods also) + if err := out.setupMethods(&elemVal); err != nil { + return nil, fmt.Errorf("failed to setup methods of precompile: %w", err) + } + // setup fields and embedded types (if a struct) + if err := out.setupFields(&elemVal); err != nil { + return nil, fmt.Errorf("failed to setup fields of precompile: %w", err) + } + // create setter that can handle of the fields + out.setupFieldSetter() + return out, nil +} + +// setupMethods iterates through all exposed methods of val, and sets them all up as ABI methods. +func (p *Precompile[E]) setupMethods(val *reflect.Value) error { + if p.fieldsOnly { + return nil + } + typ := val.Type() + methodCount := val.NumMethod() + for i := 0; i < methodCount; i++ { + methodDef := typ.Method(i) + if !methodDef.IsExported() { + continue + } + if err := p.setupMethod(val, &methodDef); err != nil { + return fmt.Errorf("failed to set up call-handler for method %d (%s): %w", i, methodDef.Name, err) + } + } + return nil +} + +// makeArgs infers a list of ABI types, from a list of Go arguments. +func makeArgs(argCount int, getType func(i int) reflect.Type) (abi.Arguments, error) { + out := make(abi.Arguments, argCount) + for i := 0; i < argCount; i++ { + argType := getType(i) + abiTyp, err := goTypeToABIType(argType) + if err != nil { + return nil, fmt.Errorf("failed to determine ABI type of input arg %d: %w", i, err) + } + out[i] = abi.Argument{ + Name: fmt.Sprintf("arg_%d", i), + Type: abiTyp, + } + } + return out, nil +} + +// makeArgTypes turns a slice of ABI argument types into a slice of ABI stringified types +func makeArgTypes(args abi.Arguments) []string { + out := make([]string, len(args)) + for i := 0; i < len(args); i++ { + out[i] = args[i].Type.String() + } + return out +} + +// makeArgAllocators returns a lice of Go object allocator functions, for each of the arguments. +func makeArgAllocators(argCount int, getType func(i int) reflect.Type) []func() any { + out := make([]func() interface{}, argCount) + for i := 0; i < argCount; i++ { + argType := getType(i) + out[i] = func() interface{} { + return reflect.New(argType).Elem().Interface() + } + } + return out +} + +// hasTrailingError checks if the last returned argument type, if any, is a Go error. +func hasTrailingError(argCount int, getType func(i int) reflect.Type) bool { + if argCount == 0 { + return false + } + lastTyp := getType(argCount - 1) + return lastTyp.Kind() == reflect.Interface && lastTyp.Implements(typeFor[error]()) +} + +// setupMethod takes a method definition, attached to selfVal, +// and builds an ABI method to handle the input decoding and output encoding around the inner Go function. +func (p *Precompile[E]) setupMethod(selfVal *reflect.Value, methodDef *reflect.Method) error { + methodName := methodDef.Name + + abiFunctionName := methodName + // Solidity allows multiple functions with the same name, but different input params. + // So cut off the suffix after the last "_", to allow the different variants to be defined in Go. + variantSuffixIndex := strings.LastIndexByte(methodName, '_') + variantSuffix := "" + if variantSuffixIndex >= 0 { + abiFunctionName = methodName[:variantSuffixIndex] + variantSuffix = methodName[variantSuffixIndex+1:] // strip out the underscore + } + if len(abiFunctionName) == 0 { + return fmt.Errorf("ABI method name of %s must not be empty", methodDef.Name) + } + if lo := strings.ToLower(abiFunctionName[:1]); lo != abiFunctionName[:1] { + abiFunctionName = lo + abiFunctionName[1:] + } + // Prepare ABI definitions of call parameters. + inArgCount := methodDef.Type.NumIn() - 1 + if inArgCount < 0 { + return errors.New("expected method with receiver as first argument") + } + getInArg := func(i int) reflect.Type { + return methodDef.Type.In(i + 1) // +1 to account for the receiver + } + inArgs, err := makeArgs(inArgCount, getInArg) + if err != nil { + return fmt.Errorf("failed to preserve input args: %w", err) + } + inArgTypes := makeArgTypes(inArgs) + methodSig := fmt.Sprintf("%v(%v)", abiFunctionName, strings.Join(inArgTypes, ",")) + byte4Sig := bytes4(methodSig) + if variantSuffix != "" { + if expected := fmt.Sprintf("%x", byte4Sig); expected != variantSuffix { + return fmt.Errorf("expected variant suffix %s for ABI method %s (Go: %s), but got %s", + expected, methodSig, methodDef.Name, variantSuffix) + } + } + if m, ok := p.abiMethods[byte4Sig]; ok { + return fmt.Errorf("method %s conflicts with existing ABI method %s (Go: %s), signature: %x", + methodDef.Name, m.abiSignature, m.goName, byte4Sig) + } + + outArgCount := methodDef.Type.NumOut() + // A Go method may return an error, which we do not ABI-encode, but rather forward as revert. + errReturn := hasTrailingError(outArgCount, methodDef.Type.Out) + if errReturn { + outArgCount -= 1 + } + + // Prepare ABI definitions of return parameters. + outArgs, err := makeArgs(outArgCount, methodDef.Type.Out) + if err != nil { + return fmt.Errorf("failed to prepare output arg types: %w", err) + } + + inArgAllocators := makeArgAllocators(inArgCount, getInArg) + fn := makeFn(selfVal, &methodDef.Func, errReturn, inArgs, outArgs, inArgAllocators) + + p.abiMethods[byte4Sig] = &precompileFunc{ + goName: methodName, + abiSignature: methodSig, + fn: fn, + } + return nil +} + +// abiToValues turns serialized ABI input data into values, which are written to the given dest slice. +// The ABI decoding happens following the given args ABI type definitions. +// Values are allocated with the given respective allocator functions. +func abiToValues(args abi.Arguments, allocators []func() any, dest []reflect.Value, input []byte) error { + // sanity check that we have as many allocators as result destination slots + if len(allocators) != len(dest) { + return fmt.Errorf("have %d allocators, but %d destinations", len(allocators), len(dest)) + } + // Unpack the ABI data into default Go types + inVals, err := args.UnpackValues(input) + if err != nil { + return fmt.Errorf("failed to decode input: %x\nerr: %w", input, err) + } + // Sanity check that the ABI util returned the expected number of inputs + if len(inVals) != len(allocators) { + return fmt.Errorf("expected %d args, got %d", len(allocators), len(inVals)) + } + for i, inAlloc := range allocators { + argSrc := inVals[i] + argDest := inAlloc() + argDest, err = convertType(argSrc, argDest) + if err != nil { + return fmt.Errorf("failed to convert arg %d from Go type %T to %T: %w", i, argSrc, argDest, err) + } + dest[i] = reflect.ValueOf(argDest) + } + return nil +} + +// makeFn is a helper function to perform a method call: +// - ABI decoding of input +// - type conversion of inputs +// - actual function Go call +// - handling of error return value +// - and ABI encoding of outputs +func makeFn(selfVal, methodVal *reflect.Value, errReturn bool, inArgs, outArgs abi.Arguments, inArgAllocators []func() any) func(input []byte) ([]byte, error) { + return func(input []byte) ([]byte, error) { + // Convert each default Go type into the expected opinionated Go type + callArgs := make([]reflect.Value, 1+len(inArgAllocators)) + callArgs[0] = *selfVal + err := abiToValues(inArgs, inArgAllocators, callArgs[1:], input) + if err != nil { + return nil, err + } + // Call the precompile Go function + returnReflectVals := methodVal.Call(callArgs) + // Collect the return values + returnVals := make([]interface{}, len(returnReflectVals)) + for i := range returnReflectVals { + returnVals[i] = returnReflectVals[i].Interface() + } + if errReturn { + errIndex := len(returnVals) - 1 + if errV := returnVals[errIndex]; errV != nil { + if err, ok := errV.(error); ok { + return nil, err + } + } + returnVals = returnVals[:errIndex] + } + // Encode the return values + out, err := outArgs.PackValues(returnVals) + if err != nil { + return nil, fmt.Errorf("failed to encode return data: %w", err) + } + return out, nil + } +} + +// convertType is a helper to run the Geth type conversion util, +// forcing one Go type into another approximately equivalent Go type +// (handling pointers and underlying equivalent types). +func convertType(src, dest any) (out any, err error) { + defer func() { + if rErr := recover(); rErr != nil { + err = fmt.Errorf("ConvertType fail: %v", rErr) + } + }() + out = abi.ConvertType(src, dest) // no error return, just panics if invalid. + return +} + +// goTypeToABIType infers the geth ABI type definition from a Go reflect type definition. +func goTypeToABIType(typ reflect.Type) (abi.Type, error) { + solType, internalType, err := goTypeToSolidityType(typ) + if err != nil { + return abi.Type{}, err + } + return abi.NewType(solType, internalType, nil) +} + +// ABIInt256 is an alias for big.Int that is represented as int256 in ABI method signature, +// since big.Int interpretation defaults to uint256. +type ABIInt256 big.Int + +var abiInt256Type = typeFor[ABIInt256]() + +// goTypeToSolidityType converts a Go type to the solidity ABI type definition. +// The "internalType" is a quirk of the Geth ABI utils, for nested structures. +// Unfortunately we have to convert to string, not directly to ABI type structure, +// as it is the only way to initialize Geth ABI types. +func goTypeToSolidityType(typ reflect.Type) (typeDef, internalType string, err error) { + switch typ.Kind() { + case reflect.Int, reflect.Uint: + return "", "", fmt.Errorf("ints must have explicit size, type not valid: %s", typ) + case reflect.Bool, reflect.String, reflect.Uint8, reflect.Uint16, reflect.Uint32, reflect.Uint64, + reflect.Int8, reflect.Int16, reflect.Int32, reflect.Int64: + return strings.ToLower(typ.Kind().String()), "", nil + case reflect.Array: + if typ.Elem().Kind() == reflect.Uint8 { + if typ.Len() == 20 && typ.Name() == "Address" { + return "address", "", nil + } + if typ.Len() > 32 { + return "", "", fmt.Errorf("byte array too large: %d", typ.Len()) + } + return fmt.Sprintf("bytes%d", typ.Len()), "", nil + } + elemTyp, internalTyp, err := goTypeToSolidityType(typ.Elem()) + if err != nil { + return "", "", fmt.Errorf("unrecognized slice-elem type: %w", err) + } + if internalTyp != "" { + return "", "", fmt.Errorf("nested internal types not supported: %w", err) + } + return fmt.Sprintf("%s[%d]", elemTyp, typ.Len()), "", nil + case reflect.Slice: + if typ.Elem().Kind() == reflect.Uint8 { + return "bytes", "", nil + } + elemABITyp, internalTyp, err := goTypeToSolidityType(typ.Elem()) + if err != nil { + return "", "", fmt.Errorf("unrecognized slice-elem type: %w", err) + } + if internalTyp != "" { + return "", "", fmt.Errorf("nested internal types not supported: %w", err) + } + return elemABITyp + "[]", "", nil + case reflect.Struct: + if typ.AssignableTo(abiInt256Type) { + return "int256", "", nil + } + if typ.ConvertibleTo(typeFor[big.Int]()) { + return "uint256", "", nil + } + // We can parse into abi.TupleTy in the future, if necessary + return "", "", fmt.Errorf("structs are not supported, cannot handle type %s", typ) + case reflect.Pointer: + elemABITyp, internalTyp, err := goTypeToSolidityType(typ.Elem()) + if err != nil { + return "", "", fmt.Errorf("unrecognized pointer-elem type: %w", err) + } + return elemABITyp, internalTyp, nil + default: + return "", "", fmt.Errorf("unrecognized typ: %s", typ) + } +} + +// setupFields registers all exported non-ignored fields as public ABI getters. +// Fields and methods of embedded structs are registered along the way. +func (p *Precompile[E]) setupFields(val *reflect.Value) error { + if val.Kind() == reflect.Pointer { + if val.IsNil() { + return fmt.Errorf("cannot setupFields of nil value (type: %s)", val.Type()) + } + inner := val.Elem() + if err := p.setupFields(&inner); err != nil { + return fmt.Errorf("failed to setupFields of inner pointer type: %w", err) + } + return nil + } + if val.Kind() != reflect.Struct { + return nil // ignore non-struct types + } + typ := val.Type() + fieldCount := val.NumField() + for i := 0; i < fieldCount; i++ { + fieldTyp := typ.Field(i) + if !fieldTyp.IsExported() { + continue + } + // With the "evm" struct tag set to "-", exposed fields can explicitly be ignored, + // and will not be translated into getter functions on the precompile or further exposed. + if tag, ok := fieldTyp.Tag.Lookup("evm"); ok && tag == "-" { + continue + } + fieldVal := val.Field(i) + if fieldTyp.Anonymous { + // process methods and inner fields of embedded fields + if err := p.setupMethods(&fieldVal); err != nil { + return fmt.Errorf("failed to setup methods of embedded field %s (type: %s): %w", + fieldTyp.Name, fieldTyp.Type, err) + } + if err := p.setupFields(&fieldVal); err != nil { + return fmt.Errorf("failed to setup fields of embedded field %s (type %s): %w", + fieldTyp.Name, fieldTyp.Type, err) + } + continue + } + if err := p.setupStructField(&fieldTyp, &fieldVal); err != nil { + return fmt.Errorf("failed to setup struct field %s (type %s): %w", fieldTyp.Name, fieldTyp.Type, err) + } + } + return nil +} + +// setupStructField registers a struct field as a public-getter ABI method. +func (p *Precompile[E]) setupStructField(fieldDef *reflect.StructField, fieldVal *reflect.Value) error { + abiFunctionName := fieldDef.Name + if len(abiFunctionName) == 0 { + return fmt.Errorf("ABI name of %s must not be empty", fieldDef.Name) + } + if lo := strings.ToLower(abiFunctionName[:1]); lo != abiFunctionName[:1] { + abiFunctionName = lo + abiFunctionName[1:] + } + // The tag can override the field name + if v, ok := fieldDef.Tag.Lookup("evm"); ok { + abiFunctionName = v + } + // The ABI signature of public fields in solidity is simply a getter function of the same name. + // The return type is not part of the ABI signature. So we just append "()" to turn it into a function. + methodSig := abiFunctionName + "()" + byte4Sig := bytes4(methodSig) + if m, ok := p.abiMethods[byte4Sig]; ok { + return fmt.Errorf("struct field %s conflicts with existing ABI method %s (Go: %s), signature: %x", + fieldDef.Name, m.abiSignature, m.goName, byte4Sig) + } + // Determine the type to ABI-encode the Go field value into + abiTyp, err := goTypeToABIType(fieldDef.Type) + if err != nil { + return fmt.Errorf("failed to determine ABI type of struct field of type %s: %w", fieldDef.Type, err) + } + outArgs := abi.Arguments{ + { + Name: abiFunctionName, + Type: abiTyp, + }, + } + // Create the getter ABI method, that will take the field value, encode it, and return it. + fn := func(input []byte) ([]byte, error) { + if len(input) != 0 { // 4 byte selector is already trimmed + return nil, fmt.Errorf("unexpected input: %x", input) + } + v := fieldVal.Interface() + if abiVal, ok := v.(interface{ ToABI() []byte }); ok { + return abiVal.ToABI(), nil + } + if bigInt, ok := v.(*hexutil.Big); ok { // We can change this to use convertType later, if we need more generic type handling. + v = (*big.Int)(bigInt) + } + outData, err := outArgs.PackValues([]any{v}) + if err != nil { + return nil, fmt.Errorf("method %s failed to pack return data: %w", methodSig, err) + } + return outData, nil + } + p.abiMethods[byte4Sig] = &precompileFunc{ + goName: fieldDef.Name, + abiSignature: methodSig, + fn: fn, + } + // register field as settable + if p.fieldSetter && fieldDef.Type.AssignableTo(typeFor[common.Address]()) { + p.settable[byte4Sig] = &settableField{ + name: fieldDef.Name, + value: fieldVal, + } + } + return nil +} + +func (p *Precompile[E]) setupFieldSetter() { + if !p.fieldSetter { + return + } + p.abiMethods[setterFnBytes4] = &precompileFunc{ + goName: "__fieldSetter___", + abiSignature: setterFnSig, + fn: func(input []byte) ([]byte, error) { + if len(input) != 32*2 { + return nil, fmt.Errorf("cannot set address field to %d bytes", len(input)) + } + if [32 - 4]byte(input[4:32]) != ([32 - 4]byte{}) { + return nil, fmt.Errorf("unexpected selector content, input: %x", input[:]) + } + selector := [4]byte(input[:4]) + f, ok := p.settable[selector] + if !ok { + return nil, fmt.Errorf("unknown address field selector 0x%x", selector) + } + addr := common.Address(input[32*2-20 : 32*2]) + f.value.Set(reflect.ValueOf(addr)) + return nil, nil + }, + } +} + +// RequiredGas is part of the vm.PrecompiledContract interface, and all system precompiles use 0 gas. +func (p *Precompile[E]) RequiredGas(input []byte) uint64 { + return 0 +} + +// Run implements the vm.PrecompiledContract interface. +// This takes the ABI calldata, finds the applicable method by selector, and then runs that method with the data. +func (p *Precompile[E]) Run(input []byte) ([]byte, error) { + if len(input) < 4 { + return encodeRevert(fmt.Errorf("expected at least 4 bytes, but got '%x'", input)) + } + sig := [4]byte(input[:4]) + params := input[4:] + fn, ok := p.abiMethods[sig] + if !ok { + return encodeRevert(fmt.Errorf("unrecognized 4 byte signature: %x", sig)) + } + out, err := fn.fn(params) + if err != nil { + return encodeRevert(fmt.Errorf("failed to run %s, ABI: %q, err: %w", fn.goName, fn.abiSignature, err)) + } + return out, nil +} + +// revertSelector is the ABI signature of a default error type in solidity. +var revertSelector = crypto.Keccak256([]byte("Error(string)"))[:4] + +func encodeRevert(outErr error) ([]byte, error) { + outErrStr := []byte(outErr.Error()) + out := make([]byte, 0, 4+32*2+len(outErrStr)+32) + out = append(out, revertSelector...) // selector + out = append(out, b32(0x20)...) // offset to string + out = append(out, b32(uint64(len(outErrStr)))...) // length of string + out = append(out, rightPad32(outErrStr)...) // the error message string + return out, vm.ErrExecutionReverted // Geth EVM will pick this up as a revert with return-data +} + +// typeFor returns the [Type] that represents the type argument T. +// Note: not available yet in Go 1.21, but part of std-lib later. +func typeFor[T any]() reflect.Type { + return reflect.TypeOf((*T)(nil)).Elem() +} diff --git a/op-chain-ops/script/precompile_test.go b/op-chain-ops/script/precompile_test.go new file mode 100644 index 000000000000..a207c1221f9f --- /dev/null +++ b/op-chain-ops/script/precompile_test.go @@ -0,0 +1,143 @@ +package script + +import ( + "errors" + "math/big" + "strings" + "testing" + + "github.com/stretchr/testify/require" + + "github.com/ethereum/go-ethereum/accounts/abi" + "github.com/ethereum/go-ethereum/common" + "github.com/ethereum/go-ethereum/core/vm" + "github.com/ethereum/go-ethereum/crypto" +) + +type EmbeddedExample struct { + Foo uint64 +} + +func (e *EmbeddedExample) TwoFoo() uint64 { + e.Foo *= 2 + return e.Foo +} + +type ExamplePrecompile struct { + EmbeddedExample + + Bar *big.Int + hello string + helloFrom string +} + +var testErr = errors.New("test err") + +func (e *ExamplePrecompile) Greet(name string) (string, error) { + if name == "mallory" { + return "", testErr + } + e.helloFrom = name + return e.hello + " " + name + "!", nil +} + +func (e *ExamplePrecompile) Things() (bar *big.Int, hello string, seen string) { + return e.Bar, e.hello, e.helloFrom +} + +func (e *ExamplePrecompile) AddAndMul(a, b, c uint64, x uint8) uint64 { + return (a + b + c) * uint64(x) +} + +func TestPrecompile(t *testing.T) { + e := &ExamplePrecompile{hello: "Hola", EmbeddedExample: EmbeddedExample{Foo: 42}, Bar: big.NewInt(123)} + p, err := NewPrecompile[*ExamplePrecompile](e) + require.NoError(t, err) + + for k, v := range p.abiMethods { + t.Logf("4byte: %x ABI: %s Go: %s", k, v.abiSignature, v.goName) + } + + // input/output + input := crypto.Keccak256([]byte("greet(string)"))[:4] + input = append(input, b32(0x20)...) // offset + input = append(input, b32(uint64(len("alice")))...) // length + input = append(input, "alice"...) + out, err := p.Run(input) + require.NoError(t, err) + require.Equal(t, e.helloFrom, "alice") + require.Equal(t, out[:32], b32(0x20)) + require.Equal(t, out[32:32*2], b32(uint64(len("Hola alice!")))) + require.Equal(t, out[32*2:32*3], rightPad32([]byte("Hola alice!"))) + + // error handling + input = crypto.Keccak256([]byte("greet(string)"))[:4] + input = append(input, b32(0x20)...) // offset + input = append(input, b32(uint64(len("mallory")))...) // length + input = append(input, "mallory"...) + out, err = p.Run(input) + require.Equal(t, err, vm.ErrExecutionReverted) + msg, err := abi.UnpackRevert(out) + require.NoError(t, err, "must unpack revert data") + require.True(t, strings.HasSuffix(msg, testErr.Error()), "revert data must end with the inner error") + + // field reads + input = crypto.Keccak256([]byte("foo()"))[:4] + out, err = p.Run(input) + require.NoError(t, err) + require.Equal(t, out, b32(42)) + + input = crypto.Keccak256([]byte("twoFoo()"))[:4] + out, err = p.Run(input) + require.NoError(t, err) + require.Equal(t, out, b32(42*2)) + + // persistent state changes + input = crypto.Keccak256([]byte("twoFoo()"))[:4] + out, err = p.Run(input) + require.NoError(t, err) + require.Equal(t, out, b32(42*2*2)) + + // multi-output + input = crypto.Keccak256([]byte("things()"))[:4] + out, err = p.Run(input) + require.NoError(t, err) + require.Equal(t, b32(123), out[:32]) + require.Equal(t, b32(32*3), out[32*1:32*2]) // offset of hello + require.Equal(t, b32(32*5), out[32*2:32*3]) // offset of seen + require.Equal(t, b32(uint64(len("Hola"))), out[32*3:32*4]) // length of hello + require.Equal(t, rightPad32([]byte("Hola")), out[32*4:32*5]) // hello content + require.Equal(t, b32(uint64(len("alice"))), out[32*5:32*6]) // length of seen + require.Equal(t, rightPad32([]byte("alice")), out[32*6:32*7]) // seen content + + // multi-input + input = crypto.Keccak256([]byte("addAndMul(uint64,uint64,uint64,uint8)"))[:4] + input = append(input, b32(42)...) + input = append(input, b32(100)...) + input = append(input, b32(7)...) + input = append(input, b32(3)...) + out, err = p.Run(input) + require.NoError(t, err) + require.Equal(t, b32((42+100+7)*3), out) +} + +type DeploymentExample struct { + FooBar common.Address +} + +func TestDeploymentOutputPrecompile(t *testing.T) { + e := &DeploymentExample{} + p, err := NewPrecompile[*DeploymentExample](e, WithFieldSetter[*DeploymentExample]) + require.NoError(t, err) + + addr := common.Address{0: 0x42, 19: 0xaa} + fooBarSelector := bytes4("fooBar()") + var input []byte + input = append(input, setterFnBytes4[:]...) + input = append(input, rightPad32(fooBarSelector[:])...) + input = append(input, leftPad32(addr[:])...) + out, err := p.Run(input) + require.NoError(t, err) + require.Empty(t, out) + require.Equal(t, addr, e.FooBar) +} diff --git a/op-chain-ops/script/script.go b/op-chain-ops/script/script.go new file mode 100644 index 000000000000..d156adb67187 --- /dev/null +++ b/op-chain-ops/script/script.go @@ -0,0 +1,774 @@ +package script + +import ( + "bytes" + "encoding/binary" + "encoding/json" + "fmt" + "math/big" + + "github.com/holiman/uint256" + + "github.com/ethereum/go-ethereum/accounts/abi" + "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/rawdb" + "github.com/ethereum/go-ethereum/core/state" + "github.com/ethereum/go-ethereum/core/tracing" + "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/ethdb" + "github.com/ethereum/go-ethereum/log" + "github.com/ethereum/go-ethereum/params" + "github.com/ethereum/go-ethereum/triedb" + "github.com/ethereum/go-ethereum/triedb/hashdb" + + "github.com/ethereum-optimism/optimism/op-chain-ops/foundry" + "github.com/ethereum-optimism/optimism/op-chain-ops/srcmap" +) + +// jumpHistory is the amount of successful jumps to track for debugging. +const jumpHistory = 5 + +// CallFrame encodes the scope context of the current call +type CallFrame struct { + Depth int + + LastOp vm.OpCode + LastPC uint64 + + // To reconstruct a create2 later, e.g. on broadcast + LastCreate2Salt [32]byte + + // Reverts often happen in generated code. + // We want to fallback to logging the source-map position of + // the non-generated code, i.e. the origin of the last successful jump. + // And beyond that, a short history of the latest jumps is useful for debugging. + // This is a list of program-counters at the time of the jump (i.e. before raching JUMPDEST). + LastJumps []uint64 + + Ctx *vm.ScopeContext + + // Prank overrides the msg.sender, and optionally the origin. + // Forge script does not support nested pranks on the same call-depth. + // Pranks can also be broadcasting. + Prank *Prank + + // GasUsed keeps track of the amount of gas used by this call frame. + // This is useful for broadcasts, which sometimes cannot correctly + // estimate gas when sending transactions in parallel. + GasUsed uint64 + + // CallerNonce keeps track of the nonce of the caller who entered the callframe + // (nonce of pranked caller, if pranked). + CallerNonce uint64 +} + +// Host is an EVM executor that runs Forge scripts. +type Host struct { + log log.Logger + af *foundry.ArtifactsFS + chainCfg *params.ChainConfig + env *vm.EVM + state *state.StateDB + stateDB state.Database + rawDB ethdb.Database + + cheatcodes *Precompile[*CheatCodesPrecompile] + console *Precompile[*ConsolePrecompile] + + precompiles map[common.Address]vm.PrecompiledContract + + callStack []*CallFrame + + // serializerStates are in-progress JSON payloads by name, + // for the serializeX family of cheat codes, see: + // https://book.getfoundry.sh/cheatcodes/serialize-json + serializerStates map[string]json.RawMessage + + envVars map[string]string + labels map[common.Address]string + + // srcFS enables src-map loading; + // this is a bit more expensive, but provides useful debug information. + // src-maps are disabled if this is nil. + srcFS *foundry.SourceMapFS + srcMaps map[common.Address]*srcmap.SourceMap + + onLabel []func(name string, addr common.Address) + + hooks *Hooks + + // isolateBroadcasts will flush the journal changes, + // and prepare the ephemeral tx context again, + // to make gas accounting of a broadcast sub-call more accurate. + isolateBroadcasts bool + + // useCreate2Deployer uses the Create2Deployer for broadcasted + // create2 calls. + useCreate2Deployer bool +} + +type HostOption func(h *Host) + +type BroadcastHook func(broadcast Broadcast) + +type Hooks struct { + OnBroadcast BroadcastHook +} + +func WithBroadcastHook(hook BroadcastHook) HostOption { + return func(h *Host) { + h.hooks.OnBroadcast = hook + } +} + +// WithIsolatedBroadcasts makes each broadcast clean the context, +// by flushing the dirty storage changes, and preparing the ephemeral state again. +// This then produces more accurate gas estimation for broadcast calls. +// This is not compatible with state-snapshots: upon cleaning, +// it is assumed that the state has to never revert back, similar to the state-dump guarantees. +func WithIsolatedBroadcasts() HostOption { + return func(h *Host) { + h.isolateBroadcasts = true + } +} + +// WithCreate2Deployer proxies each CREATE2 call through the CREATE2 deployer +// contract located at 0x4e59b44847b379578588920cA78FbF26c0B4956C. This is the Arachnid +// Create2Deployer contract Forge uses. See https://github.com/Arachnid/deterministic-deployment-proxy +// for the implementation. +func WithCreate2Deployer() HostOption { + return func(h *Host) { + h.useCreate2Deployer = true + } +} + +// NewHost creates a Host that can load contracts from the given Artifacts FS, +// and with an EVM initialized to the given executionContext. +// Optionally src-map loading may be enabled, by providing a non-nil srcFS to read sources from. +func NewHost( + logger log.Logger, + fs *foundry.ArtifactsFS, + srcFS *foundry.SourceMapFS, + executionContext Context, + options ...HostOption, +) *Host { + h := &Host{ + log: logger, + af: fs, + serializerStates: make(map[string]json.RawMessage), + envVars: make(map[string]string), + labels: make(map[common.Address]string), + precompiles: make(map[common.Address]vm.PrecompiledContract), + srcFS: srcFS, + srcMaps: make(map[common.Address]*srcmap.SourceMap), + hooks: &Hooks{ + OnBroadcast: func(broadcast Broadcast) {}, + }, + } + + for _, opt := range options { + opt(h) + } + + // Init a default chain config, with all the mainnet L1 forks activated + h.chainCfg = ¶ms.ChainConfig{ + ChainID: executionContext.ChainID, + // Ethereum forks in proof-of-work era. + HomesteadBlock: big.NewInt(0), + 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), + MergeNetsplitBlock: big.NewInt(0), + // Ethereum forks in proof-of-stake era. + TerminalTotalDifficulty: big.NewInt(1), + TerminalTotalDifficultyPassed: true, + ShanghaiTime: new(uint64), + CancunTime: new(uint64), + PragueTime: nil, + VerkleTime: nil, + // OP-Stack forks are disabled, since we use this for L1. + BedrockBlock: nil, + RegolithTime: nil, + CanyonTime: nil, + EcotoneTime: nil, + FjordTime: nil, + GraniteTime: nil, + InteropTime: nil, + Optimism: nil, + } + + // Create an in-memory database, to host our temporary script state changes + h.rawDB = rawdb.NewMemoryDatabase() + h.stateDB = state.NewDatabaseWithConfig(h.rawDB, &triedb.Config{ + Preimages: true, // To be able to iterate the state we need the Preimages + IsVerkle: false, + HashDB: hashdb.Defaults, + PathDB: nil, + }) + var err error + h.state, err = state.New(types.EmptyRootHash, h.stateDB, nil) + if err != nil { + panic(fmt.Errorf("failed to create memory state db: %w", err)) + } + + // Initialize a block-context for the EVM to access environment variables. + // The block context (after embedding inside of the EVM environment) may be mutated later. + blockContext := vm.BlockContext{ + CanTransfer: core.CanTransfer, + Transfer: core.Transfer, + GetHash: func(n uint64) (out common.Hash) { + binary.BigEndian.PutUint64(out[:8], n) + return crypto.Keccak256Hash(out[:]) + }, + L1CostFunc: nil, + Coinbase: executionContext.FeeRecipient, + GasLimit: executionContext.GasLimit, + BlockNumber: new(big.Int).SetUint64(executionContext.BlockNum), + Time: executionContext.Timestamp, + Difficulty: nil, // not used anymore post-merge + BaseFee: big.NewInt(0), + BlobBaseFee: big.NewInt(0), + Random: &executionContext.PrevRandao, + } + + // Initialize a transaction-context for the EVM to access environment variables. + // The transaction context (after embedding inside of the EVM environment) may be mutated later. + txContext := vm.TxContext{ + Origin: executionContext.Origin, + GasPrice: big.NewInt(0), + BlobHashes: executionContext.BlobHashes, + BlobFeeCap: big.NewInt(0), + AccessEvents: state.NewAccessEvents(h.stateDB.PointCache()), + } + + // Hook up the Host to capture the EVM environment changes + trHooks := &tracing.Hooks{ + OnEnter: h.onEnter, + OnExit: h.onExit, + OnOpcode: h.onOpcode, + OnFault: h.onFault, + OnStorageChange: h.onStorageChange, + OnLog: h.onLog, + } + + // Configure the EVM without basefee (because scripting), our trace hooks, and runtime precompile overrides. + vmCfg := vm.Config{ + NoBaseFee: true, + Tracer: trHooks, + PrecompileOverrides: h.getPrecompile, + CallerOverride: h.handleCaller, + } + + h.env = vm.NewEVM(blockContext, txContext, h.state, h.chainCfg, vmCfg) + + return h +} + +// EnableCheats enables the Forge/HVM cheat-codes precompile and the Hardhat-style console2 precompile. +func (h *Host) EnableCheats() error { + vmPrecompile, err := NewPrecompile[*CheatCodesPrecompile](&CheatCodesPrecompile{h: h}) + if err != nil { + return fmt.Errorf("failed to init VM cheatcodes precompile: %w", err) + } + h.cheatcodes = vmPrecompile + // Solidity does EXTCODESIZE checks on functions without return-data. + // We need to insert some placeholder code to prevent it from aborting calls. + // Emulates Forge script: https://github.com/foundry-rs/foundry/blob/224fe9cbf76084c176dabf7d3b2edab5df1ab818/crates/evm/evm/src/executors/mod.rs#L108 + h.state.SetCode(VMAddr, []byte{0x00}) + h.precompiles[VMAddr] = h.cheatcodes + + consolePrecompile, err := NewPrecompile[*ConsolePrecompile](&ConsolePrecompile{ + logger: h.log, + sender: h.MsgSender, + }) + if err != nil { + return fmt.Errorf("failed to init console precompile: %w", err) + } + h.console = consolePrecompile + h.precompiles[ConsoleAddr] = h.console + // The Console precompile does not need bytecode, + // calls all go through a console lib, which avoids the EXTCODESIZE. + return nil +} + +// prelude is a helper function to prepare the Host for a new call/create on the EVM environment. +func (h *Host) prelude(from common.Address, to *common.Address) { + rules := h.chainCfg.Rules(h.env.Context.BlockNumber, true, h.env.Context.Time) + activePrecompiles := vm.ActivePrecompiles(rules) + h.env.StateDB.Prepare(rules, from, h.env.Context.Coinbase, to, activePrecompiles, nil) +} + +// Call calls a contract in the EVM. The state changes persist. +func (h *Host) Call(from common.Address, to common.Address, input []byte, gas uint64, value *uint256.Int) (returnData []byte, leftOverGas uint64, err error) { + h.prelude(from, &to) + return h.env.Call(vm.AccountRef(from), to, input, gas, value) +} + +// LoadContract loads the bytecode of a contract, and deploys it with regular CREATE. +func (h *Host) LoadContract(artifactName, contractName string) (common.Address, error) { + artifact, err := h.af.ReadArtifact(artifactName, contractName) + if err != nil { + return common.Address{}, fmt.Errorf("failed to load %s / %s: %w", artifactName, contractName, err) + } + addr, err := h.Create(h.TxOrigin(), artifact.Bytecode.Object) + if err != nil { + return common.Address{}, err + } + h.RememberArtifact(addr, artifact, contractName) + return addr, nil +} + +// RememberArtifact registers an address as originating from a particular artifact. +// This register a source-map, if the Host is configured with a source-map FS. +func (h *Host) RememberArtifact(addr common.Address, artifact *foundry.Artifact, contract string) { + if h.srcFS == nil { + return + } + code := h.state.GetCode(addr) + if !bytes.Equal(code, artifact.DeployedBytecode.Object) { + h.log.Warn("src map warning: state bytecode does not match artifact deployed bytecode", "addr", addr) + } + + srcMap, err := h.srcFS.SourceMap(artifact, contract) + if err != nil { + h.log.Warn("failed to load srcmap", "addr", addr, "err", err) + return + } + h.srcMaps[addr] = srcMap +} + +// Create a contract with unlimited gas, and 0 ETH value. +// This create function helps deploy contracts quickly for scripting etc. +func (h *Host) Create(from common.Address, initCode []byte) (common.Address, error) { + h.prelude(from, nil) + ret, addr, _, err := h.env.Create(vm.AccountRef(from), + initCode, DefaultFoundryGasLimit, uint256.NewInt(0)) + if err != nil { + retStr := fmt.Sprintf("%x", ret) + if len(retStr) > 20 { + retStr = retStr[:20] + "..." + } + return common.Address{}, fmt.Errorf("failed to create contract, return: %s, err: %w", retStr, err) + } + return addr, nil +} + +// Wipe an account: removing the code, and setting address and balance to 0. This makes the account "empty". +// Note that storage is not removed. +func (h *Host) Wipe(addr common.Address) { + if h.state.GetCodeSize(addr) > 0 { + h.state.SetCode(addr, nil) + } + h.state.SetNonce(addr, 0) + h.state.SetBalance(addr, uint256.NewInt(0), tracing.BalanceChangeUnspecified) +} + +// SetNonce sets an account's nonce in state. +func (h *Host) SetNonce(addr common.Address, nonce uint64) { + h.state.SetNonce(addr, nonce) +} + +// GetNonce returs an account's nonce from state. +func (h *Host) GetNonce(addr common.Address) uint64 { + return h.state.GetNonce(addr) +} + +// ImportState imports a set of foundry.ForgeAllocs into the +// host's state database. It does not erase existing state +// when importing. +func (h *Host) ImportState(allocs *foundry.ForgeAllocs) { + for addr, alloc := range allocs.Accounts { + h.state.SetBalance(addr, uint256.MustFromBig(alloc.Balance), tracing.BalanceChangeUnspecified) + h.state.SetNonce(addr, alloc.Nonce) + h.state.SetCode(addr, alloc.Code) + for key, value := range alloc.Storage { + h.state.SetState(addr, key, value) + } + } +} + +// getPrecompile overrides any accounts during runtime, to insert special precompiles, if activated. +func (h *Host) getPrecompile(rules params.Rules, original vm.PrecompiledContract, addr common.Address) vm.PrecompiledContract { + if p, ok := h.precompiles[addr]; ok { + return p + } + return original +} + +// SetPrecompile inserts a precompile at the given address. +// If the precompile is nil, it removes the precompile override from that address, and wipes the account. +func (h *Host) SetPrecompile(addr common.Address, precompile vm.PrecompiledContract) { + if precompile == nil { + h.log.Debug("removing precompile", "addr", addr) + delete(h.precompiles, addr) + h.Wipe(addr) + return + } + h.log.Debug("adding precompile", "addr", addr) + h.precompiles[addr] = precompile + // insert non-empty placeholder bytecode, so EXTCODESIZE checks pass + h.state.SetCode(addr, []byte{0}) +} + +// HasPrecompileOverride inspects if there exists an active precompile-override at the given address. +func (h *Host) HasPrecompileOverride(addr common.Address) bool { + _, ok := h.precompiles[addr] + return ok +} + +// onEnter is a trace-hook, which we use to apply changes to the state-DB, to simulate isolated broadcast calls, +// for better gas estimation of the exact broadcast call execution. +func (h *Host) onEnter(depth int, typ byte, from common.Address, to common.Address, input []byte, gas uint64, value *big.Int) { + if len(h.callStack) == 0 { + return + } + parentCallFrame := h.callStack[len(h.callStack)-1] + if parentCallFrame.Prank == nil { + return + } + // sanity check our callframe is set up correctly + if parentCallFrame.LastOp != vm.OpCode(typ) { + panic(fmt.Errorf("parent call-frame has invalid last Op: %d", typ)) + } + if !parentCallFrame.Prank.Broadcast { + return + } + if to == VMAddr || to == ConsoleAddr { // no broadcasts to the cheatcode or console address + return + } + + // Bump nonce value, such that a broadcast Call or CREATE2 appears like a tx + if parentCallFrame.LastOp == vm.CALL || parentCallFrame.LastOp == vm.CREATE2 { + sender := parentCallFrame.Ctx.Address() + if parentCallFrame.Prank.Sender != nil { + sender = *parentCallFrame.Prank.Sender + } + h.state.SetNonce(sender, h.state.GetNonce(sender)+1) + } + + if h.isolateBroadcasts { + var dest *common.Address + switch parentCallFrame.LastOp { + case vm.CREATE, vm.CREATE2: + dest = nil // no destination address to warm up + case vm.CALL: + dest = &to + default: + return + } + h.state.Finalise(true) + // the prank msg.sender, if any, has already been applied to 'from' before onEnter + h.prelude(from, dest) + } +} + +// onExit is a trace-hook, which we use to maintain an accurate view of functions, and log any revert warnings. +func (h *Host) onExit(depth int, output []byte, gasUsed uint64, err error, reverted bool) { + // Note: onExit runs also when going deeper, exiting the context into a nested context. + addr := h.SelfAddress() + if reverted { + h.LogCallStack() + if msg, revertInspectErr := abi.UnpackRevert(output); revertInspectErr == nil { + h.log.Warn("Revert", "addr", addr, "err", err, "revertMsg", msg, "depth", depth) + } else { + h.log.Warn("Revert", "addr", addr, "err", err, "revertData", hexutil.Bytes(output), "depth", depth) + } + } + + h.callStack[len(h.callStack)-1].GasUsed += gasUsed + h.unwindCallstack(depth) +} + +// onFault is a trace-hook, catches things more generic than regular EVM reverts. +func (h *Host) onFault(pc uint64, op byte, gas, cost uint64, scope tracing.OpContext, depth int, err error) { + h.log.Warn("Fault", "addr", scope.Address(), "err", err, "depth", depth) +} + +// unwindCallstack is a helper to remove call-stack entries. +func (h *Host) unwindCallstack(depth int) { + // pop the callstack until the depth matches + for len(h.callStack) > 0 && h.callStack[len(h.callStack)-1].Depth > depth { + // unset the prank, if the parent call-frame had set up a prank that does not repeat + if len(h.callStack) > 1 { + parentCallFrame := h.callStack[len(h.callStack)-2] + if parentCallFrame.Prank != nil { + if parentCallFrame.Prank.Broadcast { + if parentCallFrame.LastOp == vm.DELEGATECALL { + h.log.Warn("Cannot broadcast a delegate-call. Ignoring broadcast hook.") + } else if parentCallFrame.LastOp == vm.STATICCALL { + h.log.Trace("Broadcast is active, ignoring static-call.") + } else { + currentCallFrame := h.callStack[len(h.callStack)-1] + bcast := NewBroadcast(parentCallFrame, currentCallFrame) + h.log.Debug( + "calling broadcast hook", + "from", bcast.From, + "to", bcast.To, + "input", bcast.Input, + "value", bcast.Value, + "type", bcast.Type, + ) + h.hooks.OnBroadcast(bcast) + } + } + + // While going back to the parent, restore the tx.origin. + // It will later be re-applied on sub-calls if the prank persists (if Repeat == true). + if parentCallFrame.Prank.Origin != nil { + h.env.TxContext.Origin = parentCallFrame.Prank.PrevOrigin + } + if !parentCallFrame.Prank.Repeat { + parentCallFrame.Prank = nil + } + } + } + // Now pop the call-frame + h.callStack[len(h.callStack)-1] = nil // don't hold on to the underlying call-frame resources + h.callStack = h.callStack[:len(h.callStack)-1] + } +} + +// onOpcode is a trace-hook, used to maintain a view of the call-stack, and do any per op-code overrides. +func (h *Host) onOpcode(pc uint64, op byte, gas, cost uint64, scope tracing.OpContext, rData []byte, depth int, err error) { + h.unwindCallstack(depth) + scopeCtx := scope.(*vm.ScopeContext) + // Check if we are entering a new depth, add it to the call-stack if so. + // We do this here, instead of onEnter, to capture an initialized scope. + if len(h.callStack) == 0 || h.callStack[len(h.callStack)-1].Depth < depth { + h.callStack = append(h.callStack, &CallFrame{ + Depth: depth, + LastOp: vm.OpCode(op), + LastPC: pc, + Ctx: scopeCtx, + CallerNonce: h.GetNonce(scopeCtx.Caller()), + }) + } + // Sanity check that top of the call-stack matches the scope context now + if len(h.callStack) == 0 || h.callStack[len(h.callStack)-1].Ctx != scopeCtx { + panic("scope context changed without call-frame pop/push") + } + cf := h.callStack[len(h.callStack)-1] + if vm.OpCode(op) == vm.JUMPDEST { // remember the last PC before successful jump + cf.LastJumps = append(cf.LastJumps, cf.LastPC) + if len(cf.LastJumps) > jumpHistory { + copy(cf.LastJumps[:], cf.LastJumps[len(cf.LastJumps)-jumpHistory:]) + cf.LastJumps = cf.LastJumps[:jumpHistory] + } + } + cf.LastOp = vm.OpCode(op) + cf.LastPC = pc + if cf.LastOp == vm.CREATE2 { + cf.LastCreate2Salt = scopeCtx.Stack.Back(3).Bytes32() + } +} + +// onStorageChange is a trace-hook to capture state changes +func (h *Host) onStorageChange(addr common.Address, slot common.Hash, prev, new common.Hash) { + h.log.Debug("storage change", "addr", addr, "slot", slot, "prev_value", prev, "new_value", new) + // future storage recording +} + +// onLog is a trace-hook to capture log events +func (h *Host) onLog(ev *types.Log) { + logger := h.log + for i, topic := range ev.Topics { + logger = logger.With(fmt.Sprintf("topic%d", i), topic) + } + logger.Debug("log event", "data", hexutil.Bytes(ev.Data)) + // future log recording +} + +// CurrentCall returns the top of the callstack. Or zeroed if there was no call frame yet. +// If zeroed, the call-frame has a nil scope context. +func (h *Host) CurrentCall() CallFrame { + if len(h.callStack) == 0 { + return CallFrame{} + } + return *h.callStack[len(h.callStack)-1] +} + +// MsgSender returns the msg.sender of the current active EVM call-frame, +// or a zero address if there is no active call-frame. +func (h *Host) MsgSender() common.Address { + cf := h.CurrentCall() + if cf.Ctx == nil { + return common.Address{} + } + return cf.Ctx.Caller() +} + +// SelfAddress returns the current executing address of the current active EVM call-frame, +// or a zero address if there is no active call-frame. +func (h *Host) SelfAddress() common.Address { + cf := h.CurrentCall() + if cf.Ctx == nil { + return common.Address{} + } + return cf.Ctx.Address() +} + +func (h *Host) GetEnvVar(key string) (value string, ok bool) { + value, ok = h.envVars[key] + return +} + +func (h *Host) SetEnvVar(key string, value string) { + h.envVars[key] = value +} + +// StateDump turns the current EVM state into a foundry-allocs dump +// (wrapping a geth Account allocs type). This is used to export the state. +// Note that upon dumping, the state-DB is committed and flushed. +// This affects any remaining self-destructs, as all accounts are flushed to persistent state. +// After flushing the EVM state also cannot revert to a previous snapshot state: +// the state should not be dumped within contract-execution that needs to revert. +func (h *Host) StateDump() (*foundry.ForgeAllocs, error) { + // We have to commit the existing state to the trie, + // for all the state-changes to be captured by the trie iterator. + root, err := h.state.Commit(h.env.Context.BlockNumber.Uint64(), true) + if err != nil { + return nil, fmt.Errorf("failed to commit state: %w", err) + } + // We need a state object around the state DB + st, err := state.New(root, h.stateDB, nil) + if err != nil { + return nil, fmt.Errorf("failed to create state object for state-dumping: %w", err) + } + // After Commit we cannot reuse the old State, so we update the host to use the new one + h.state = st + h.env.StateDB = st + + var allocs foundry.ForgeAllocs + allocs.FromState(st) + + // Sanity check we have no lingering scripts. + for i := uint64(0); i <= allocs.Accounts[ScriptDeployer].Nonce; i++ { + scriptAddr := crypto.CreateAddress(ScriptDeployer, i) + h.log.Info("removing script from state-dump", "addr", scriptAddr, "label", h.labels[scriptAddr]) + delete(allocs.Accounts, scriptAddr) + } + + // Remove the script deployer from the output + delete(allocs.Accounts, ScriptDeployer) + + // The cheatcodes VM has a placeholder bytecode, + // because solidity checks if the code exists prior to regular EVM-calls to it. + delete(allocs.Accounts, VMAddr) + + // Precompile overrides come with temporary state account placeholders. Ignore those. + for addr := range h.precompiles { + delete(allocs.Accounts, addr) + } + + return &allocs, nil +} + +func (h *Host) SetTxOrigin(addr common.Address) { + h.env.TxContext.Origin = addr +} + +func (h *Host) TxOrigin() common.Address { + return h.env.TxContext.Origin +} + +// ScriptBackendFn is a convenience method for scripts to attach to the Host. +// It return a function pre-configured with the given destination-address, +// to call the destination script. +func (h *Host) ScriptBackendFn(to common.Address) CallBackendFn { + return func(data []byte) ([]byte, error) { + ret, _, err := h.Call(h.env.TxContext.Origin, to, data, DefaultFoundryGasLimit, uint256.NewInt(0)) + return ret, err + } +} + +// EnforceMaxCodeSize configures the EVM to enforce (if true), or not enforce (if false), +// the maximum contract bytecode size. +func (h *Host) EnforceMaxCodeSize(v bool) { + h.env.Config.NoMaxCodeSize = !v +} + +// LogCallStack is a convenience method for debugging, +// to log details of each call-frame (from bottom to top) to the logger. +func (h *Host) LogCallStack() { + for _, cf := range h.callStack { + callsite := "" + srcMap, ok := h.srcMaps[cf.Ctx.Address()] + if !ok && cf.Ctx.Contract.CodeAddr != nil { // if delegate-call, we might know the implementation code. + srcMap, ok = h.srcMaps[*cf.Ctx.Contract.CodeAddr] + } + if ok { + callsite = srcMap.FormattedInfo(cf.LastPC) + if callsite == "unknown:0:0" && len(cf.LastJumps) > 0 { + callsite = srcMap.FormattedInfo(cf.LastJumps[len(cf.LastJumps)-1]) + } + } + input := cf.Ctx.CallInput() + byte4 := "" + if len(input) >= 4 { + byte4 = fmt.Sprintf("0x%x", input[:4]) + } + h.log.Debug("callframe input", "depth", cf.Depth, "input", hexutil.Bytes(input), "pc", cf.LastPC, "op", cf.LastOp) + h.log.Warn("callframe", "depth", cf.Depth, "byte4", byte4, + "addr", cf.Ctx.Address(), "callsite", callsite, "label", h.labels[cf.Ctx.Address()]) + if srcMap != nil { + for _, jmpPC := range cf.LastJumps { + h.log.Debug("recent jump", "depth", cf.Depth, "callsite", srcMap.FormattedInfo(jmpPC), "pc", jmpPC) + } + } + } +} + +// Label an address with a name, like the foundry vm.label cheatcode. +func (h *Host) Label(addr common.Address, label string) { + h.log.Debug("labeling", "addr", addr, "label", label) + h.labels[addr] = label + + for _, fn := range h.onLabel { + fn(label, addr) + } +} + +// NewScriptAddress creates a new address for the ScriptDeployer account, and bumps the nonce. +func (h *Host) NewScriptAddress() common.Address { + deployer := ScriptDeployer + deployNonce := h.state.GetNonce(deployer) + // compute address of script contract to be deployed + addr := crypto.CreateAddress(deployer, deployNonce) + h.state.SetNonce(deployer, deployNonce+1) + return addr +} + +func (h *Host) ChainID() *big.Int { + return new(big.Int).Set(h.chainCfg.ChainID) +} + +func (h *Host) Artifacts() *foundry.ArtifactsFS { + return h.af +} + +// RememberOnLabel links the contract source-code of srcFile upon a given label +func (h *Host) RememberOnLabel(label, srcFile, contract string) error { + artifact, err := h.af.ReadArtifact(srcFile, contract) + if err != nil { + return fmt.Errorf("failed to read artifact %s (contract %s) for label %q", srcFile, contract, label) + } + h.onLabel = append(h.onLabel, func(v string, addr common.Address) { + if label == v { + h.RememberArtifact(addr, artifact, contract) + } + }) + return nil +} diff --git a/op-chain-ops/script/script_test.go b/op-chain-ops/script/script_test.go new file mode 100644 index 000000000000..9d029c801060 --- /dev/null +++ b/op-chain-ops/script/script_test.go @@ -0,0 +1,170 @@ +package script + +import ( + "bytes" + "encoding/json" + "fmt" + "math/big" + "strings" + "testing" + + "github.com/holiman/uint256" + "github.com/stretchr/testify/require" + + "github.com/ethereum/go-ethereum/accounts/abi" + "github.com/ethereum/go-ethereum/common" + "github.com/ethereum/go-ethereum/common/hexutil" + "github.com/ethereum/go-ethereum/crypto" + "github.com/ethereum/go-ethereum/log" + + "github.com/ethereum-optimism/optimism/op-chain-ops/foundry" + "github.com/ethereum-optimism/optimism/op-service/testlog" +) + +//go:generate ./testdata/generate.sh + +func TestScript(t *testing.T) { + logger, captLog := testlog.CaptureLogger(t, log.LevelInfo) + af := foundry.OpenArtifactsDir("./testdata/test-artifacts") + + scriptContext := DefaultContext + h := NewHost(logger, af, nil, scriptContext) + addr, err := h.LoadContract("ScriptExample.s.sol", "ScriptExample") + require.NoError(t, err) + + require.NoError(t, h.EnableCheats()) + + h.SetEnvVar("EXAMPLE_BOOL", "true") + input := bytes4("run()") + returnData, _, err := h.Call(scriptContext.Sender, addr, input[:], DefaultFoundryGasLimit, uint256.NewInt(0)) + require.NoError(t, err, "call failed: %x", string(returnData)) + require.NotNil(t, captLog.FindLog(testlog.NewMessageFilter("sender nonce 1"))) + + require.NoError(t, h.cheatcodes.Precompile.DumpState("noop")) + // and a second time, to see if we can revisit the host state. + require.NoError(t, h.cheatcodes.Precompile.DumpState("noop")) +} + +func TestScriptBroadcast(t *testing.T) { + logger := testlog.Logger(t, log.LevelDebug) + af := foundry.OpenArtifactsDir("./testdata/test-artifacts") + + mustEncodeCalldata := func(method, input string) []byte { + packer, err := abi.JSON(strings.NewReader(fmt.Sprintf(`[{"type":"function","name":"%s","inputs":[{"type":"string","name":"input"}]}]`, method))) + require.NoError(t, err) + + data, err := packer.Pack(method, input) + require.NoError(t, err) + return data + } + + fooBar, err := af.ReadArtifact("ScriptExample.s.sol", "FooBar") + require.NoError(t, err) + + expectedInitCode := bytes.Clone(fooBar.Bytecode.Object) + // Add the contract init argument we use in the script + expectedInitCode = append(expectedInitCode, leftPad32(big.NewInt(1234).Bytes())...) + salt := uint256.NewInt(42).Bytes32() + + senderAddr := common.HexToAddress("0x0000000000000000000000000000000000Badc0d") + scriptAddr := common.HexToAddress("0x5b73c5498c1e3b4dba84de0f1833c4a029d90519") + coffeeAddr := common.HexToAddress("0x0000000000000000000000000000000000C0FFEE") + cafeAddr := common.HexToAddress("0xcafe") + expBroadcasts := []Broadcast{ + { + From: scriptAddr, + To: scriptAddr, + Input: mustEncodeCalldata("call1", "single_call1"), + Value: (*hexutil.U256)(uint256.NewInt(0)), + GasUsed: 23421, + Type: BroadcastCall, + Nonce: 1, // first action by script (script already has a nonce of 1) + }, + { + From: coffeeAddr, + To: scriptAddr, + Input: mustEncodeCalldata("call1", "startstop_call1"), + Value: (*hexutil.U256)(uint256.NewInt(0)), + GasUsed: 1521, + Type: BroadcastCall, + Nonce: 0, // first action by 0xc0ffee + }, + { + From: coffeeAddr, + To: scriptAddr, + Input: mustEncodeCalldata("call2", "startstop_call2"), + Value: (*hexutil.U256)(uint256.NewInt(0)), + GasUsed: 1565, + Type: BroadcastCall, + Nonce: 1, // second action of 0xc0ffee + }, + { + From: common.HexToAddress("0x1234"), + To: scriptAddr, + Input: mustEncodeCalldata("nested1", "nested"), + Value: (*hexutil.U256)(uint256.NewInt(0)), + GasUsed: 2763, + Type: BroadcastCall, + Nonce: 0, // first action of 0x1234 + }, + { + From: common.HexToAddress("0x123456"), + To: crypto.CreateAddress(common.HexToAddress("0x123456"), 0), + Input: expectedInitCode, + Value: (*hexutil.U256)(uint256.NewInt(0)), + GasUsed: 39112, + Type: BroadcastCreate, + Nonce: 0, // first action of 0x123456 + }, + { + From: DeterministicDeployerAddress, + To: crypto.CreateAddress2(DeterministicDeployerAddress, salt, crypto.Keccak256(expectedInitCode)), + Input: expectedInitCode, + Value: (*hexutil.U256)(uint256.NewInt(0)), + Type: BroadcastCreate2, + GasUsed: 39112, + Salt: salt, + Nonce: 0, // first action of 0xcafe + }, + { + From: scriptAddr, + To: crypto.CreateAddress(scriptAddr, 2), + Input: expectedInitCode, + Value: (*hexutil.U256)(uint256.NewInt(0)), + GasUsed: 39112, + Type: BroadcastCreate, + Nonce: 2, // second action, on top of starting at 1. + }, + } + + var broadcasts []Broadcast + hook := func(broadcast Broadcast) { + broadcasts = append(broadcasts, broadcast) + } + h := NewHost(logger, af, nil, DefaultContext, WithBroadcastHook(hook), WithCreate2Deployer()) + addr, err := h.LoadContract("ScriptExample.s.sol", "ScriptExample") + require.NoError(t, err) + + require.NoError(t, h.EnableCheats()) + + input := bytes4("runBroadcast()") + returnData, _, err := h.Call(senderAddr, addr, input[:], DefaultFoundryGasLimit, uint256.NewInt(0)) + require.NoError(t, err, "call failed: %x", string(returnData)) + + expected, err := json.MarshalIndent(expBroadcasts, " ", " ") + require.NoError(t, err) + got, err := json.MarshalIndent(broadcasts, " ", " ") + require.NoError(t, err) + require.Equal(t, string(expected), string(got)) + + // Assert that the nonces for accounts participating in the + // broadcast increase. The scriptAddr check is set to 3 to + // account for the initial deployment of the contract and + // two additional calls. + require.EqualValues(t, 0, h.GetNonce(senderAddr)) + require.EqualValues(t, 3, h.GetNonce(scriptAddr)) + require.EqualValues(t, 2, h.GetNonce(coffeeAddr)) + // This is one because we still need to bump the nonce of the + // address that will perform the send to the Create2Deployer. + require.EqualValues(t, 1, h.GetNonce(cafeAddr)) +} diff --git a/op-chain-ops/script/testdata/foundry.toml b/op-chain-ops/script/testdata/foundry.toml new file mode 100644 index 000000000000..c321ef0af22a --- /dev/null +++ b/op-chain-ops/script/testdata/foundry.toml @@ -0,0 +1,31 @@ +################################################################ +# PROFILE: DEFAULT (Local) # +################################################################ + +[profile.default] + +# Compilation settings +src = 'src' +out = 'test-artifacts' +script = 'scripts' +optimizer = true +optimizer_runs = 999999 +remappings = [] +extra_output = ['devdoc', 'userdoc', 'metadata', 'storageLayout'] +bytecode_hash = 'none' +build_info_path = 'artifacts/build-info' +ast = true +evm_version = "cancun" +# 5159 error code is selfdestruct error code +ignored_error_codes = ["transient-storage", "code-size", "init-code-size", 5159] + +# We set the gas limit to max int64 to avoid running out of gas during testing, since the default +# gas limit is 1B and some of our tests require more gas than that, such as `test_callWithMinGas_noLeakageLow_succeeds`. +# We use this gas limit since it was the default gas limit prior to https://github.com/foundry-rs/foundry/pull/8274. +# Due to toml-rs limitations, if you increase the gas limit above this value it must be a string. +gas_limit = 9223372036854775807 + +# Test / Script Runner Settings +ffi = false +fs_permissions = [] +libs = ["node_modules", "lib"] diff --git a/op-chain-ops/script/testdata/generate.sh b/op-chain-ops/script/testdata/generate.sh new file mode 100755 index 000000000000..0a53be62ddf7 --- /dev/null +++ b/op-chain-ops/script/testdata/generate.sh @@ -0,0 +1,5 @@ +#!/bin/sh + +set -euo + +forge build diff --git a/op-chain-ops/script/testdata/scripts/ScriptExample.s.sol b/op-chain-ops/script/testdata/scripts/ScriptExample.s.sol new file mode 100644 index 000000000000..f2f20e5ca14e --- /dev/null +++ b/op-chain-ops/script/testdata/scripts/ScriptExample.s.sol @@ -0,0 +1,178 @@ +// SPDX-License-Identifier: MIT +pragma solidity 0.8.15; + +// Vm is a minimal interface to the forge cheatcode precompile +interface Vm { + function envOr(string calldata name, bool defaultValue) external view returns (bool value); + function getNonce(address account) external view returns (uint64 nonce); + function parseJsonKeys(string calldata json, string calldata key) external pure returns (string[] memory keys); + function startPrank(address msgSender) external; + function stopPrank() external; + function broadcast() external; + function broadcast(address msgSender) external; + function startBroadcast(address msgSender) external; + function startBroadcast() external; + function stopBroadcast() external; +} + +// console is a minimal version of the console2 lib. +library console { + address constant CONSOLE_ADDRESS = address(0x000000000000000000636F6e736F6c652e6c6f67); + + function _castLogPayloadViewToPure( + function(bytes memory) internal view fnIn + ) internal pure returns (function(bytes memory) internal pure fnOut) { + assembly { + fnOut := fnIn + } + } + + function _sendLogPayload(bytes memory payload) internal pure { + _castLogPayloadViewToPure(_sendLogPayloadView)(payload); + } + + function _sendLogPayloadView(bytes memory payload) private view { + uint256 payloadLength = payload.length; + address consoleAddress = CONSOLE_ADDRESS; + /// @solidity memory-safe-assembly + assembly { + let payloadStart := add(payload, 32) + let r := staticcall(gas(), consoleAddress, payloadStart, payloadLength, 0, 0) + } + } + + function log(string memory p0) internal pure { + _sendLogPayload(abi.encodeWithSignature("log(string)", p0)); + } + + function log(string memory p0, bool p1) internal pure { + _sendLogPayload(abi.encodeWithSignature("log(string,bool)", p0, p1)); + } + + function log(string memory p0, uint256 p1) internal pure { + _sendLogPayload(abi.encodeWithSignature("log(string,uint256)", p0, p1)); + } + + function log(string memory p0, address p1) internal pure { + _sendLogPayload(abi.encodeWithSignature("log(string,address)", p0, p1)); + } + + function log(string memory p0, string memory p1, string memory p2) internal pure { + _sendLogPayload(abi.encodeWithSignature("log(string,string,string)", p0, p1, p2)); + } +} + +/// @title ScriptExample +/// @notice ScriptExample is an example script. The Go forge script code tests that it can run this. +contract ScriptExample { + + address internal constant VM_ADDRESS = address(uint160(uint256(keccak256("hevm cheat code")))); + Vm internal constant vm = Vm(VM_ADDRESS); + + // @notice counter variable to force non-pure calls. + uint256 public counter; + + /// @notice example function, runs through basic cheat-codes and console logs. + function run() public { + bool x = vm.envOr("EXAMPLE_BOOL", false); + console.log("bool value from env", x); + + console.log("contract addr", address(this)); + console.log("contract nonce", vm.getNonce(address(this))); + console.log("sender addr", address(msg.sender)); + console.log("sender nonce", vm.getNonce(address(msg.sender))); + + string memory json = '{"root_key": [{"a": 1, "b": 2}]}'; + string[] memory keys = vm.parseJsonKeys(json, ".root_key[0]"); + console.log("keys", keys[0], keys[1]); + + this.hello("from original"); + vm.startPrank(address(uint160(0x42))); + this.hello("from prank 1"); + console.log("parent scope msg.sender", address(msg.sender)); + console.log("parent scope contract.addr", address(this)); + this.hello("from prank 2"); + vm.stopPrank(); + this.hello("from original again"); + + console.log("done!"); + } + + /// @notice example function, to test vm.broadcast with. + function runBroadcast() public { + console.log("nonce start", uint256(vm.getNonce(address(this)))); + + console.log("testing single"); + vm.broadcast(); + this.call1("single_call1"); + this.call2("single_call2"); + + console.log("testing start/stop"); + vm.startBroadcast(address(uint160(0xc0ffee))); + this.call1("startstop_call1"); + this.call2("startstop_call2"); + this.callPure("startstop_pure"); + vm.stopBroadcast(); + this.call1("startstop_call3"); + + console.log("testing nested"); + vm.startBroadcast(address(uint160(0x1234))); + this.nested1("nested"); + vm.stopBroadcast(); + + console.log("contract deployment"); + vm.broadcast(address(uint160(0x123456))); + FooBar x = new FooBar(1234); + require(x.foo() == 1234); + + console.log("create 2"); + vm.broadcast(address(uint160(0xcafe))); + FooBar y = new FooBar{salt: bytes32(uint256(42))}(1234); + require(y.foo() == 1234); + console.log("done!"); + + // Deploy a script without a pranked sender and check the nonce. + vm.broadcast(); + new FooBar(1234); + + console.log("nonce end", uint256(vm.getNonce(address(this)))); + } + + /// @notice example external function, to force a CALL, and test vm.startPrank with. + function hello(string calldata _v) external view { + console.log(_v); + console.log("hello msg.sender", address(msg.sender)); + } + + function call1(string calldata _v) external { + counter++; + console.log(_v); + } + + function call2(string calldata _v) external { + counter++; + console.log(_v); + } + + function nested1(string calldata _v) external { + counter++; + this.nested2(_v); + } + + function nested2(string calldata _v) external { + counter++; + console.log(_v); + } + + function callPure(string calldata _v) external pure { + console.log(_v); + } +} + +contract FooBar { + uint256 public foo; + + constructor(uint256 v) { + foo = v; + } +} diff --git a/op-chain-ops/script/testdata/test-artifacts/ScriptExample.s.sol/FooBar.json b/op-chain-ops/script/testdata/test-artifacts/ScriptExample.s.sol/FooBar.json new file mode 100644 index 000000000000..ad4ac1569433 --- /dev/null +++ b/op-chain-ops/script/testdata/test-artifacts/ScriptExample.s.sol/FooBar.json @@ -0,0 +1 @@ +{"abi":[{"type":"constructor","inputs":[{"name":"v","type":"uint256","internalType":"uint256"}],"stateMutability":"nonpayable"},{"type":"function","name":"foo","inputs":[],"outputs":[{"name":"","type":"uint256","internalType":"uint256"}],"stateMutability":"view"}],"bytecode":{"object":"0x608060405234801561001057600080fd5b506040516100b23803806100b283398101604081905261002f91610037565b600055610050565b60006020828403121561004957600080fd5b5051919050565b60548061005e6000396000f3fe6080604052348015600f57600080fd5b506004361060285760003560e01c8063c298557814602d575b600080fd5b603560005481565b60405190815260200160405180910390f3fea164736f6c634300080f000a","sourceMap":"5902:96:0:-:0;;;5949:47;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;5982:3;:7;5902:96;;14:184:1;84:6;137:2;125:9;116:7;112:23;108:32;105:52;;;153:1;150;143:12;105:52;-1:-1:-1;176:16:1;;14:184;-1:-1:-1;14:184:1:o;:::-;5902:96:0;;;;;;","linkReferences":{}},"deployedBytecode":{"object":"0x6080604052348015600f57600080fd5b506004361060285760003560e01c8063c298557814602d575b600080fd5b603560005481565b60405190815260200160405180910390f3fea164736f6c634300080f000a","sourceMap":"5902:96:0:-:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;5924:18;;;;;;;;;160:25:1;;;148:2;133:18;5924::0;;;;;;","linkReferences":{}},"methodIdentifiers":{"foo()":"c2985578"},"rawMetadata":"{\"compiler\":{\"version\":\"0.8.15+commit.e14f2714\"},\"language\":\"Solidity\",\"output\":{\"abi\":[{\"inputs\":[{\"internalType\":\"uint256\",\"name\":\"v\",\"type\":\"uint256\"}],\"stateMutability\":\"nonpayable\",\"type\":\"constructor\"},{\"inputs\":[],\"name\":\"foo\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"\",\"type\":\"uint256\"}],\"stateMutability\":\"view\",\"type\":\"function\"}],\"devdoc\":{\"kind\":\"dev\",\"methods\":{},\"version\":1},\"userdoc\":{\"kind\":\"user\",\"methods\":{},\"version\":1}},\"settings\":{\"compilationTarget\":{\"scripts/ScriptExample.s.sol\":\"FooBar\"},\"evmVersion\":\"london\",\"libraries\":{},\"metadata\":{\"bytecodeHash\":\"none\"},\"optimizer\":{\"enabled\":true,\"runs\":999999},\"remappings\":[]},\"sources\":{\"scripts/ScriptExample.s.sol\":{\"keccak256\":\"0x8d1dfa41908e7ccc3a498a2a2aa51c5275bedbb904ce32d08f8598e36f896d8d\",\"license\":\"MIT\",\"urls\":[\"bzz-raw://5117bb7158363cae8b9dc0508d2852692fd36172f1c699ff680afbb5acebe1f3\",\"dweb:/ipfs/QmQdahJ8SPKfJ4yea5Ge9qaj5qh1TxVffhHvaWytBaL95h\"]}},\"version\":1}","metadata":{"compiler":{"version":"0.8.15+commit.e14f2714"},"language":"Solidity","output":{"abi":[{"inputs":[{"internalType":"uint256","name":"v","type":"uint256"}],"stateMutability":"nonpayable","type":"constructor"},{"inputs":[],"stateMutability":"view","type":"function","name":"foo","outputs":[{"internalType":"uint256","name":"","type":"uint256"}]}],"devdoc":{"kind":"dev","methods":{},"version":1},"userdoc":{"kind":"user","methods":{},"version":1}},"settings":{"remappings":[],"optimizer":{"enabled":true,"runs":999999},"metadata":{"bytecodeHash":"none"},"compilationTarget":{"scripts/ScriptExample.s.sol":"FooBar"},"evmVersion":"london","libraries":{}},"sources":{"scripts/ScriptExample.s.sol":{"keccak256":"0x8d1dfa41908e7ccc3a498a2a2aa51c5275bedbb904ce32d08f8598e36f896d8d","urls":["bzz-raw://5117bb7158363cae8b9dc0508d2852692fd36172f1c699ff680afbb5acebe1f3","dweb:/ipfs/QmQdahJ8SPKfJ4yea5Ge9qaj5qh1TxVffhHvaWytBaL95h"],"license":"MIT"}},"version":1},"storageLayout":{"storage":[{"astId":708,"contract":"scripts/ScriptExample.s.sol:FooBar","label":"foo","offset":0,"slot":"0","type":"t_uint256"}],"types":{"t_uint256":{"encoding":"inplace","label":"uint256","numberOfBytes":"32"}}},"userdoc":{"version":1,"kind":"user"},"devdoc":{"version":1,"kind":"dev"},"ast":{"absolutePath":"scripts/ScriptExample.s.sol","id":720,"exportedSymbols":{"FooBar":[719],"ScriptExample":[706],"Vm":[55],"console":[192]},"nodeType":"SourceUnit","src":"32:5967:0","nodes":[{"id":1,"nodeType":"PragmaDirective","src":"32:23:0","nodes":[],"literals":["solidity","0.8",".15"]},{"id":55,"nodeType":"ContractDefinition","src":"120:616:0","nodes":[{"id":10,"nodeType":"FunctionDefinition","src":"139:91:0","nodes":[],"functionSelector":"4777f3cf","implemented":false,"kind":"function","modifiers":[],"name":"envOr","nameLocation":"148:5:0","parameters":{"id":6,"nodeType":"ParameterList","parameters":[{"constant":false,"id":3,"mutability":"mutable","name":"name","nameLocation":"170:4:0","nodeType":"VariableDeclaration","scope":10,"src":"154:20:0","stateVariable":false,"storageLocation":"calldata","typeDescriptions":{"typeIdentifier":"t_string_calldata_ptr","typeString":"string"},"typeName":{"id":2,"name":"string","nodeType":"ElementaryTypeName","src":"154:6:0","typeDescriptions":{"typeIdentifier":"t_string_storage_ptr","typeString":"string"}},"visibility":"internal"},{"constant":false,"id":5,"mutability":"mutable","name":"defaultValue","nameLocation":"181:12:0","nodeType":"VariableDeclaration","scope":10,"src":"176:17:0","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_bool","typeString":"bool"},"typeName":{"id":4,"name":"bool","nodeType":"ElementaryTypeName","src":"176:4:0","typeDescriptions":{"typeIdentifier":"t_bool","typeString":"bool"}},"visibility":"internal"}],"src":"153:41:0"},"returnParameters":{"id":9,"nodeType":"ParameterList","parameters":[{"constant":false,"id":8,"mutability":"mutable","name":"value","nameLocation":"223:5:0","nodeType":"VariableDeclaration","scope":10,"src":"218:10:0","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_bool","typeString":"bool"},"typeName":{"id":7,"name":"bool","nodeType":"ElementaryTypeName","src":"218:4:0","typeDescriptions":{"typeIdentifier":"t_bool","typeString":"bool"}},"visibility":"internal"}],"src":"217:12:0"},"scope":55,"stateMutability":"view","virtual":false,"visibility":"external"},{"id":17,"nodeType":"FunctionDefinition","src":"235:72:0","nodes":[],"functionSelector":"2d0335ab","implemented":false,"kind":"function","modifiers":[],"name":"getNonce","nameLocation":"244:8:0","parameters":{"id":13,"nodeType":"ParameterList","parameters":[{"constant":false,"id":12,"mutability":"mutable","name":"account","nameLocation":"261:7:0","nodeType":"VariableDeclaration","scope":17,"src":"253:15:0","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"},"typeName":{"id":11,"name":"address","nodeType":"ElementaryTypeName","src":"253:7:0","stateMutability":"nonpayable","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"}},"visibility":"internal"}],"src":"252:17:0"},"returnParameters":{"id":16,"nodeType":"ParameterList","parameters":[{"constant":false,"id":15,"mutability":"mutable","name":"nonce","nameLocation":"300:5:0","nodeType":"VariableDeclaration","scope":17,"src":"293:12:0","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_uint64","typeString":"uint64"},"typeName":{"id":14,"name":"uint64","nodeType":"ElementaryTypeName","src":"293:6:0","typeDescriptions":{"typeIdentifier":"t_uint64","typeString":"uint64"}},"visibility":"internal"}],"src":"292:14:0"},"scope":55,"stateMutability":"view","virtual":false,"visibility":"external"},{"id":27,"nodeType":"FunctionDefinition","src":"312:111:0","nodes":[],"functionSelector":"213e4198","implemented":false,"kind":"function","modifiers":[],"name":"parseJsonKeys","nameLocation":"321:13:0","parameters":{"id":22,"nodeType":"ParameterList","parameters":[{"constant":false,"id":19,"mutability":"mutable","name":"json","nameLocation":"351:4:0","nodeType":"VariableDeclaration","scope":27,"src":"335:20:0","stateVariable":false,"storageLocation":"calldata","typeDescriptions":{"typeIdentifier":"t_string_calldata_ptr","typeString":"string"},"typeName":{"id":18,"name":"string","nodeType":"ElementaryTypeName","src":"335:6:0","typeDescriptions":{"typeIdentifier":"t_string_storage_ptr","typeString":"string"}},"visibility":"internal"},{"constant":false,"id":21,"mutability":"mutable","name":"key","nameLocation":"373:3:0","nodeType":"VariableDeclaration","scope":27,"src":"357:19:0","stateVariable":false,"storageLocation":"calldata","typeDescriptions":{"typeIdentifier":"t_string_calldata_ptr","typeString":"string"},"typeName":{"id":20,"name":"string","nodeType":"ElementaryTypeName","src":"357:6:0","typeDescriptions":{"typeIdentifier":"t_string_storage_ptr","typeString":"string"}},"visibility":"internal"}],"src":"334:43:0"},"returnParameters":{"id":26,"nodeType":"ParameterList","parameters":[{"constant":false,"id":25,"mutability":"mutable","name":"keys","nameLocation":"417:4:0","nodeType":"VariableDeclaration","scope":27,"src":"401:20:0","stateVariable":false,"storageLocation":"memory","typeDescriptions":{"typeIdentifier":"t_array$_t_string_memory_ptr_$dyn_memory_ptr","typeString":"string[]"},"typeName":{"baseType":{"id":23,"name":"string","nodeType":"ElementaryTypeName","src":"401:6:0","typeDescriptions":{"typeIdentifier":"t_string_storage_ptr","typeString":"string"}},"id":24,"nodeType":"ArrayTypeName","src":"401:8:0","typeDescriptions":{"typeIdentifier":"t_array$_t_string_storage_$dyn_storage_ptr","typeString":"string[]"}},"visibility":"internal"}],"src":"400:22:0"},"scope":55,"stateMutability":"pure","virtual":false,"visibility":"external"},{"id":32,"nodeType":"FunctionDefinition","src":"428:48:0","nodes":[],"functionSelector":"06447d56","implemented":false,"kind":"function","modifiers":[],"name":"startPrank","nameLocation":"437:10:0","parameters":{"id":30,"nodeType":"ParameterList","parameters":[{"constant":false,"id":29,"mutability":"mutable","name":"msgSender","nameLocation":"456:9:0","nodeType":"VariableDeclaration","scope":32,"src":"448:17:0","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"},"typeName":{"id":28,"name":"address","nodeType":"ElementaryTypeName","src":"448:7:0","stateMutability":"nonpayable","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"}},"visibility":"internal"}],"src":"447:19:0"},"returnParameters":{"id":31,"nodeType":"ParameterList","parameters":[],"src":"475:0:0"},"scope":55,"stateMutability":"nonpayable","virtual":false,"visibility":"external"},{"id":35,"nodeType":"FunctionDefinition","src":"481:30:0","nodes":[],"functionSelector":"90c5013b","implemented":false,"kind":"function","modifiers":[],"name":"stopPrank","nameLocation":"490:9:0","parameters":{"id":33,"nodeType":"ParameterList","parameters":[],"src":"499:2:0"},"returnParameters":{"id":34,"nodeType":"ParameterList","parameters":[],"src":"510:0:0"},"scope":55,"stateMutability":"nonpayable","virtual":false,"visibility":"external"},{"id":38,"nodeType":"FunctionDefinition","src":"516:30:0","nodes":[],"functionSelector":"afc98040","implemented":false,"kind":"function","modifiers":[],"name":"broadcast","nameLocation":"525:9:0","parameters":{"id":36,"nodeType":"ParameterList","parameters":[],"src":"534:2:0"},"returnParameters":{"id":37,"nodeType":"ParameterList","parameters":[],"src":"545:0:0"},"scope":55,"stateMutability":"nonpayable","virtual":false,"visibility":"external"},{"id":43,"nodeType":"FunctionDefinition","src":"551:47:0","nodes":[],"functionSelector":"e6962cdb","implemented":false,"kind":"function","modifiers":[],"name":"broadcast","nameLocation":"560:9:0","parameters":{"id":41,"nodeType":"ParameterList","parameters":[{"constant":false,"id":40,"mutability":"mutable","name":"msgSender","nameLocation":"578:9:0","nodeType":"VariableDeclaration","scope":43,"src":"570:17:0","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"},"typeName":{"id":39,"name":"address","nodeType":"ElementaryTypeName","src":"570:7:0","stateMutability":"nonpayable","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"}},"visibility":"internal"}],"src":"569:19:0"},"returnParameters":{"id":42,"nodeType":"ParameterList","parameters":[],"src":"597:0:0"},"scope":55,"stateMutability":"nonpayable","virtual":false,"visibility":"external"},{"id":48,"nodeType":"FunctionDefinition","src":"603:52:0","nodes":[],"functionSelector":"7fec2a8d","implemented":false,"kind":"function","modifiers":[],"name":"startBroadcast","nameLocation":"612:14:0","parameters":{"id":46,"nodeType":"ParameterList","parameters":[{"constant":false,"id":45,"mutability":"mutable","name":"msgSender","nameLocation":"635:9:0","nodeType":"VariableDeclaration","scope":48,"src":"627:17:0","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"},"typeName":{"id":44,"name":"address","nodeType":"ElementaryTypeName","src":"627:7:0","stateMutability":"nonpayable","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"}},"visibility":"internal"}],"src":"626:19:0"},"returnParameters":{"id":47,"nodeType":"ParameterList","parameters":[],"src":"654:0:0"},"scope":55,"stateMutability":"nonpayable","virtual":false,"visibility":"external"},{"id":51,"nodeType":"FunctionDefinition","src":"660:35:0","nodes":[],"functionSelector":"7fb5297f","implemented":false,"kind":"function","modifiers":[],"name":"startBroadcast","nameLocation":"669:14:0","parameters":{"id":49,"nodeType":"ParameterList","parameters":[],"src":"683:2:0"},"returnParameters":{"id":50,"nodeType":"ParameterList","parameters":[],"src":"694:0:0"},"scope":55,"stateMutability":"nonpayable","virtual":false,"visibility":"external"},{"id":54,"nodeType":"FunctionDefinition","src":"700:34:0","nodes":[],"functionSelector":"76eadd36","implemented":false,"kind":"function","modifiers":[],"name":"stopBroadcast","nameLocation":"709:13:0","parameters":{"id":52,"nodeType":"ParameterList","parameters":[],"src":"722:2:0"},"returnParameters":{"id":53,"nodeType":"ParameterList","parameters":[],"src":"733:0:0"},"scope":55,"stateMutability":"nonpayable","virtual":false,"visibility":"external"}],"abstract":false,"baseContracts":[],"canonicalName":"Vm","contractDependencies":[],"contractKind":"interface","fullyImplemented":false,"linearizedBaseContracts":[55],"name":"Vm","nameLocation":"130:2:0","scope":720,"usedErrors":[]},{"id":192,"nodeType":"ContractDefinition","src":"791:1622:0","nodes":[{"id":61,"nodeType":"VariableDeclaration","src":"813:86:0","nodes":[],"constant":true,"mutability":"constant","name":"CONSOLE_ADDRESS","nameLocation":"830:15:0","scope":192,"stateVariable":true,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"},"typeName":{"id":56,"name":"address","nodeType":"ElementaryTypeName","src":"813:7:0","stateMutability":"nonpayable","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"}},"value":{"arguments":[{"hexValue":"307830303030303030303030303030303030303036333646366537333646366336353265366336663637","id":59,"isConstant":false,"isLValue":false,"isPure":true,"kind":"number","lValueRequested":false,"nodeType":"Literal","src":"856:42:0","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"},"value":"0x000000000000000000636F6e736F6c652e6c6f67"}],"expression":{"argumentTypes":[{"typeIdentifier":"t_address","typeString":"address"}],"id":58,"isConstant":false,"isLValue":false,"isPure":true,"lValueRequested":false,"nodeType":"ElementaryTypeNameExpression","src":"848:7:0","typeDescriptions":{"typeIdentifier":"t_type$_t_address_$","typeString":"type(address)"},"typeName":{"id":57,"name":"address","nodeType":"ElementaryTypeName","src":"848:7:0","typeDescriptions":{}}},"id":60,"isConstant":false,"isLValue":false,"isPure":true,"kind":"typeConversion","lValueRequested":false,"names":[],"nodeType":"FunctionCall","src":"848:51:0","tryCall":false,"typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"}},"visibility":"internal"},{"id":78,"nodeType":"FunctionDefinition","src":"906:221:0","nodes":[],"body":{"id":77,"nodeType":"Block","src":"1065:62:0","nodes":[],"statements":[{"AST":{"nodeType":"YulBlock","src":"1084:37:0","statements":[{"nodeType":"YulAssignment","src":"1098:13:0","value":{"name":"fnIn","nodeType":"YulIdentifier","src":"1107:4:0"},"variableNames":[{"name":"fnOut","nodeType":"YulIdentifier","src":"1098:5:0"}]}]},"evmVersion":"london","externalReferences":[{"declaration":67,"isOffset":false,"isSlot":false,"src":"1107:4:0","valueSize":1},{"declaration":74,"isOffset":false,"isSlot":false,"src":"1098:5:0","valueSize":1}],"id":76,"nodeType":"InlineAssembly","src":"1075:46:0"}]},"implemented":true,"kind":"function","modifiers":[],"name":"_castLogPayloadViewToPure","nameLocation":"915:25:0","parameters":{"id":68,"nodeType":"ParameterList","parameters":[{"constant":false,"id":67,"mutability":"mutable","name":"fnIn","nameLocation":"987:4:0","nodeType":"VariableDeclaration","scope":78,"src":"950:41:0","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_function_internal_view$_t_bytes_memory_ptr_$returns$__$","typeString":"function (bytes) view"},"typeName":{"id":66,"nodeType":"FunctionTypeName","parameterTypes":{"id":64,"nodeType":"ParameterList","parameters":[{"constant":false,"id":63,"mutability":"mutable","name":"","nameLocation":"-1:-1:-1","nodeType":"VariableDeclaration","scope":66,"src":"959:12:0","stateVariable":false,"storageLocation":"memory","typeDescriptions":{"typeIdentifier":"t_bytes_memory_ptr","typeString":"bytes"},"typeName":{"id":62,"name":"bytes","nodeType":"ElementaryTypeName","src":"959:5:0","typeDescriptions":{"typeIdentifier":"t_bytes_storage_ptr","typeString":"bytes"}},"visibility":"internal"}],"src":"958:14:0"},"returnParameterTypes":{"id":65,"nodeType":"ParameterList","parameters":[],"src":"987:0:0"},"src":"950:41:0","stateMutability":"view","typeDescriptions":{"typeIdentifier":"t_function_internal_view$_t_bytes_memory_ptr_$returns$__$","typeString":"function (bytes) view"},"visibility":"internal"},"visibility":"internal"}],"src":"940:57:0"},"returnParameters":{"id":75,"nodeType":"ParameterList","parameters":[{"constant":false,"id":74,"mutability":"mutable","name":"fnOut","nameLocation":"1058:5:0","nodeType":"VariableDeclaration","scope":78,"src":"1021:42:0","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_function_internal_pure$_t_bytes_memory_ptr_$returns$__$","typeString":"function (bytes) pure"},"typeName":{"id":73,"nodeType":"FunctionTypeName","parameterTypes":{"id":71,"nodeType":"ParameterList","parameters":[{"constant":false,"id":70,"mutability":"mutable","name":"","nameLocation":"-1:-1:-1","nodeType":"VariableDeclaration","scope":73,"src":"1030:12:0","stateVariable":false,"storageLocation":"memory","typeDescriptions":{"typeIdentifier":"t_bytes_memory_ptr","typeString":"bytes"},"typeName":{"id":69,"name":"bytes","nodeType":"ElementaryTypeName","src":"1030:5:0","typeDescriptions":{"typeIdentifier":"t_bytes_storage_ptr","typeString":"bytes"}},"visibility":"internal"}],"src":"1029:14:0"},"returnParameterTypes":{"id":72,"nodeType":"ParameterList","parameters":[],"src":"1058:0:0"},"src":"1021:42:0","stateMutability":"pure","typeDescriptions":{"typeIdentifier":"t_function_internal_pure$_t_bytes_memory_ptr_$returns$__$","typeString":"function (bytes) pure"},"visibility":"internal"},"visibility":"internal"}],"src":"1020:44:0"},"scope":192,"stateMutability":"pure","virtual":false,"visibility":"internal"},{"id":90,"nodeType":"FunctionDefinition","src":"1133:133:0","nodes":[],"body":{"id":89,"nodeType":"Block","src":"1194:72:0","nodes":[],"statements":[{"expression":{"arguments":[{"id":86,"name":"payload","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":80,"src":"1251:7:0","typeDescriptions":{"typeIdentifier":"t_bytes_memory_ptr","typeString":"bytes memory"}}],"expression":{"argumentTypes":[{"typeIdentifier":"t_bytes_memory_ptr","typeString":"bytes memory"}],"arguments":[{"id":84,"name":"_sendLogPayloadView","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":106,"src":"1230:19:0","typeDescriptions":{"typeIdentifier":"t_function_internal_view$_t_bytes_memory_ptr_$returns$__$","typeString":"function (bytes memory) view"}}],"expression":{"argumentTypes":[{"typeIdentifier":"t_function_internal_view$_t_bytes_memory_ptr_$returns$__$","typeString":"function (bytes memory) view"}],"id":83,"name":"_castLogPayloadViewToPure","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":78,"src":"1204:25:0","typeDescriptions":{"typeIdentifier":"t_function_internal_pure$_t_function_internal_view$_t_bytes_memory_ptr_$returns$__$_$returns$_t_function_internal_pure$_t_bytes_memory_ptr_$returns$__$_$","typeString":"function (function (bytes memory) view) pure returns (function (bytes memory) pure)"}},"id":85,"isConstant":false,"isLValue":false,"isPure":false,"kind":"functionCall","lValueRequested":false,"names":[],"nodeType":"FunctionCall","src":"1204:46:0","tryCall":false,"typeDescriptions":{"typeIdentifier":"t_function_internal_pure$_t_bytes_memory_ptr_$returns$__$","typeString":"function (bytes memory) pure"}},"id":87,"isConstant":false,"isLValue":false,"isPure":false,"kind":"functionCall","lValueRequested":false,"names":[],"nodeType":"FunctionCall","src":"1204:55:0","tryCall":false,"typeDescriptions":{"typeIdentifier":"t_tuple$__$","typeString":"tuple()"}},"id":88,"nodeType":"ExpressionStatement","src":"1204:55:0"}]},"implemented":true,"kind":"function","modifiers":[],"name":"_sendLogPayload","nameLocation":"1142:15:0","parameters":{"id":81,"nodeType":"ParameterList","parameters":[{"constant":false,"id":80,"mutability":"mutable","name":"payload","nameLocation":"1171:7:0","nodeType":"VariableDeclaration","scope":90,"src":"1158:20:0","stateVariable":false,"storageLocation":"memory","typeDescriptions":{"typeIdentifier":"t_bytes_memory_ptr","typeString":"bytes"},"typeName":{"id":79,"name":"bytes","nodeType":"ElementaryTypeName","src":"1158:5:0","typeDescriptions":{"typeIdentifier":"t_bytes_storage_ptr","typeString":"bytes"}},"visibility":"internal"}],"src":"1157:22:0"},"returnParameters":{"id":82,"nodeType":"ParameterList","parameters":[],"src":"1194:0:0"},"scope":192,"stateMutability":"pure","virtual":false,"visibility":"internal"},{"id":106,"nodeType":"FunctionDefinition","src":"1272:380:0","nodes":[],"body":{"id":105,"nodeType":"Block","src":"1336:316:0","nodes":[],"statements":[{"assignments":[96],"declarations":[{"constant":false,"id":96,"mutability":"mutable","name":"payloadLength","nameLocation":"1354:13:0","nodeType":"VariableDeclaration","scope":105,"src":"1346:21:0","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"},"typeName":{"id":95,"name":"uint256","nodeType":"ElementaryTypeName","src":"1346:7:0","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"visibility":"internal"}],"id":99,"initialValue":{"expression":{"id":97,"name":"payload","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":92,"src":"1370:7:0","typeDescriptions":{"typeIdentifier":"t_bytes_memory_ptr","typeString":"bytes memory"}},"id":98,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"memberName":"length","nodeType":"MemberAccess","src":"1370:14:0","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"nodeType":"VariableDeclarationStatement","src":"1346:38:0"},{"assignments":[101],"declarations":[{"constant":false,"id":101,"mutability":"mutable","name":"consoleAddress","nameLocation":"1402:14:0","nodeType":"VariableDeclaration","scope":105,"src":"1394:22:0","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"},"typeName":{"id":100,"name":"address","nodeType":"ElementaryTypeName","src":"1394:7:0","stateMutability":"nonpayable","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"}},"visibility":"internal"}],"id":103,"initialValue":{"id":102,"name":"CONSOLE_ADDRESS","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":61,"src":"1419:15:0","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"}},"nodeType":"VariableDeclarationStatement","src":"1394:40:0"},{"AST":{"nodeType":"YulBlock","src":"1496:150:0","statements":[{"nodeType":"YulVariableDeclaration","src":"1510:36:0","value":{"arguments":[{"name":"payload","nodeType":"YulIdentifier","src":"1534:7:0"},{"kind":"number","nodeType":"YulLiteral","src":"1543:2:0","type":"","value":"32"}],"functionName":{"name":"add","nodeType":"YulIdentifier","src":"1530:3:0"},"nodeType":"YulFunctionCall","src":"1530:16:0"},"variables":[{"name":"payloadStart","nodeType":"YulTypedName","src":"1514:12:0","type":""}]},{"nodeType":"YulVariableDeclaration","src":"1559:77:0","value":{"arguments":[{"arguments":[],"functionName":{"name":"gas","nodeType":"YulIdentifier","src":"1579:3:0"},"nodeType":"YulFunctionCall","src":"1579:5:0"},{"name":"consoleAddress","nodeType":"YulIdentifier","src":"1586:14:0"},{"name":"payloadStart","nodeType":"YulIdentifier","src":"1602:12:0"},{"name":"payloadLength","nodeType":"YulIdentifier","src":"1616:13:0"},{"kind":"number","nodeType":"YulLiteral","src":"1631:1:0","type":"","value":"0"},{"kind":"number","nodeType":"YulLiteral","src":"1634:1:0","type":"","value":"0"}],"functionName":{"name":"staticcall","nodeType":"YulIdentifier","src":"1568:10:0"},"nodeType":"YulFunctionCall","src":"1568:68:0"},"variables":[{"name":"r","nodeType":"YulTypedName","src":"1563:1:0","type":""}]}]},"documentation":"@solidity memory-safe-assembly","evmVersion":"london","externalReferences":[{"declaration":101,"isOffset":false,"isSlot":false,"src":"1586:14:0","valueSize":1},{"declaration":92,"isOffset":false,"isSlot":false,"src":"1534:7:0","valueSize":1},{"declaration":96,"isOffset":false,"isSlot":false,"src":"1616:13:0","valueSize":1}],"id":104,"nodeType":"InlineAssembly","src":"1487:159:0"}]},"implemented":true,"kind":"function","modifiers":[],"name":"_sendLogPayloadView","nameLocation":"1281:19:0","parameters":{"id":93,"nodeType":"ParameterList","parameters":[{"constant":false,"id":92,"mutability":"mutable","name":"payload","nameLocation":"1314:7:0","nodeType":"VariableDeclaration","scope":106,"src":"1301:20:0","stateVariable":false,"storageLocation":"memory","typeDescriptions":{"typeIdentifier":"t_bytes_memory_ptr","typeString":"bytes"},"typeName":{"id":91,"name":"bytes","nodeType":"ElementaryTypeName","src":"1301:5:0","typeDescriptions":{"typeIdentifier":"t_bytes_storage_ptr","typeString":"bytes"}},"visibility":"internal"}],"src":"1300:22:0"},"returnParameters":{"id":94,"nodeType":"ParameterList","parameters":[],"src":"1336:0:0"},"scope":192,"stateMutability":"view","virtual":false,"visibility":"private"},{"id":120,"nodeType":"FunctionDefinition","src":"1658:121:0","nodes":[],"body":{"id":119,"nodeType":"Block","src":"1703:76:0","nodes":[],"statements":[{"expression":{"arguments":[{"arguments":[{"hexValue":"6c6f6728737472696e6729","id":114,"isConstant":false,"isLValue":false,"isPure":true,"kind":"string","lValueRequested":false,"nodeType":"Literal","src":"1753:13:0","typeDescriptions":{"typeIdentifier":"t_stringliteral_41304facd9323d75b11bcdd609cb38effffdb05710f7caf0e9b16c6d9d709f50","typeString":"literal_string \"log(string)\""},"value":"log(string)"},{"id":115,"name":"p0","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":108,"src":"1768:2:0","typeDescriptions":{"typeIdentifier":"t_string_memory_ptr","typeString":"string memory"}}],"expression":{"argumentTypes":[{"typeIdentifier":"t_stringliteral_41304facd9323d75b11bcdd609cb38effffdb05710f7caf0e9b16c6d9d709f50","typeString":"literal_string \"log(string)\""},{"typeIdentifier":"t_string_memory_ptr","typeString":"string memory"}],"expression":{"id":112,"name":"abi","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":-1,"src":"1729:3:0","typeDescriptions":{"typeIdentifier":"t_magic_abi","typeString":"abi"}},"id":113,"isConstant":false,"isLValue":false,"isPure":true,"lValueRequested":false,"memberName":"encodeWithSignature","nodeType":"MemberAccess","src":"1729:23:0","typeDescriptions":{"typeIdentifier":"t_function_abiencodewithsignature_pure$_t_string_memory_ptr_$returns$_t_bytes_memory_ptr_$","typeString":"function (string memory) pure returns (bytes memory)"}},"id":116,"isConstant":false,"isLValue":false,"isPure":false,"kind":"functionCall","lValueRequested":false,"names":[],"nodeType":"FunctionCall","src":"1729:42:0","tryCall":false,"typeDescriptions":{"typeIdentifier":"t_bytes_memory_ptr","typeString":"bytes memory"}}],"expression":{"argumentTypes":[{"typeIdentifier":"t_bytes_memory_ptr","typeString":"bytes memory"}],"id":111,"name":"_sendLogPayload","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":90,"src":"1713:15:0","typeDescriptions":{"typeIdentifier":"t_function_internal_pure$_t_bytes_memory_ptr_$returns$__$","typeString":"function (bytes memory) pure"}},"id":117,"isConstant":false,"isLValue":false,"isPure":false,"kind":"functionCall","lValueRequested":false,"names":[],"nodeType":"FunctionCall","src":"1713:59:0","tryCall":false,"typeDescriptions":{"typeIdentifier":"t_tuple$__$","typeString":"tuple()"}},"id":118,"nodeType":"ExpressionStatement","src":"1713:59:0"}]},"implemented":true,"kind":"function","modifiers":[],"name":"log","nameLocation":"1667:3:0","parameters":{"id":109,"nodeType":"ParameterList","parameters":[{"constant":false,"id":108,"mutability":"mutable","name":"p0","nameLocation":"1685:2:0","nodeType":"VariableDeclaration","scope":120,"src":"1671:16:0","stateVariable":false,"storageLocation":"memory","typeDescriptions":{"typeIdentifier":"t_string_memory_ptr","typeString":"string"},"typeName":{"id":107,"name":"string","nodeType":"ElementaryTypeName","src":"1671:6:0","typeDescriptions":{"typeIdentifier":"t_string_storage_ptr","typeString":"string"}},"visibility":"internal"}],"src":"1670:18:0"},"returnParameters":{"id":110,"nodeType":"ParameterList","parameters":[],"src":"1703:0:0"},"scope":192,"stateMutability":"pure","virtual":false,"visibility":"internal"},{"id":137,"nodeType":"FunctionDefinition","src":"1785:139:0","nodes":[],"body":{"id":136,"nodeType":"Block","src":"1839:85:0","nodes":[],"statements":[{"expression":{"arguments":[{"arguments":[{"hexValue":"6c6f6728737472696e672c626f6f6c29","id":130,"isConstant":false,"isLValue":false,"isPure":true,"kind":"string","lValueRequested":false,"nodeType":"Literal","src":"1889:18:0","typeDescriptions":{"typeIdentifier":"t_stringliteral_c3b556354c088fbb43886eb83c2a04bc7089663f964d22be308197a236f5b870","typeString":"literal_string \"log(string,bool)\""},"value":"log(string,bool)"},{"id":131,"name":"p0","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":122,"src":"1909:2:0","typeDescriptions":{"typeIdentifier":"t_string_memory_ptr","typeString":"string memory"}},{"id":132,"name":"p1","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":124,"src":"1913:2:0","typeDescriptions":{"typeIdentifier":"t_bool","typeString":"bool"}}],"expression":{"argumentTypes":[{"typeIdentifier":"t_stringliteral_c3b556354c088fbb43886eb83c2a04bc7089663f964d22be308197a236f5b870","typeString":"literal_string \"log(string,bool)\""},{"typeIdentifier":"t_string_memory_ptr","typeString":"string memory"},{"typeIdentifier":"t_bool","typeString":"bool"}],"expression":{"id":128,"name":"abi","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":-1,"src":"1865:3:0","typeDescriptions":{"typeIdentifier":"t_magic_abi","typeString":"abi"}},"id":129,"isConstant":false,"isLValue":false,"isPure":true,"lValueRequested":false,"memberName":"encodeWithSignature","nodeType":"MemberAccess","src":"1865:23:0","typeDescriptions":{"typeIdentifier":"t_function_abiencodewithsignature_pure$_t_string_memory_ptr_$returns$_t_bytes_memory_ptr_$","typeString":"function (string memory) pure returns (bytes memory)"}},"id":133,"isConstant":false,"isLValue":false,"isPure":false,"kind":"functionCall","lValueRequested":false,"names":[],"nodeType":"FunctionCall","src":"1865:51:0","tryCall":false,"typeDescriptions":{"typeIdentifier":"t_bytes_memory_ptr","typeString":"bytes memory"}}],"expression":{"argumentTypes":[{"typeIdentifier":"t_bytes_memory_ptr","typeString":"bytes memory"}],"id":127,"name":"_sendLogPayload","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":90,"src":"1849:15:0","typeDescriptions":{"typeIdentifier":"t_function_internal_pure$_t_bytes_memory_ptr_$returns$__$","typeString":"function (bytes memory) pure"}},"id":134,"isConstant":false,"isLValue":false,"isPure":false,"kind":"functionCall","lValueRequested":false,"names":[],"nodeType":"FunctionCall","src":"1849:68:0","tryCall":false,"typeDescriptions":{"typeIdentifier":"t_tuple$__$","typeString":"tuple()"}},"id":135,"nodeType":"ExpressionStatement","src":"1849:68:0"}]},"implemented":true,"kind":"function","modifiers":[],"name":"log","nameLocation":"1794:3:0","parameters":{"id":125,"nodeType":"ParameterList","parameters":[{"constant":false,"id":122,"mutability":"mutable","name":"p0","nameLocation":"1812:2:0","nodeType":"VariableDeclaration","scope":137,"src":"1798:16:0","stateVariable":false,"storageLocation":"memory","typeDescriptions":{"typeIdentifier":"t_string_memory_ptr","typeString":"string"},"typeName":{"id":121,"name":"string","nodeType":"ElementaryTypeName","src":"1798:6:0","typeDescriptions":{"typeIdentifier":"t_string_storage_ptr","typeString":"string"}},"visibility":"internal"},{"constant":false,"id":124,"mutability":"mutable","name":"p1","nameLocation":"1821:2:0","nodeType":"VariableDeclaration","scope":137,"src":"1816:7:0","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_bool","typeString":"bool"},"typeName":{"id":123,"name":"bool","nodeType":"ElementaryTypeName","src":"1816:4:0","typeDescriptions":{"typeIdentifier":"t_bool","typeString":"bool"}},"visibility":"internal"}],"src":"1797:27:0"},"returnParameters":{"id":126,"nodeType":"ParameterList","parameters":[],"src":"1839:0:0"},"scope":192,"stateMutability":"pure","virtual":false,"visibility":"internal"},{"id":154,"nodeType":"FunctionDefinition","src":"1930:145:0","nodes":[],"body":{"id":153,"nodeType":"Block","src":"1987:88:0","nodes":[],"statements":[{"expression":{"arguments":[{"arguments":[{"hexValue":"6c6f6728737472696e672c75696e7432353629","id":147,"isConstant":false,"isLValue":false,"isPure":true,"kind":"string","lValueRequested":false,"nodeType":"Literal","src":"2037:21:0","typeDescriptions":{"typeIdentifier":"t_stringliteral_b60e72ccf6d57ab53eb84d7e94a9545806ed7f93c4d5673f11a64f03471e584e","typeString":"literal_string \"log(string,uint256)\""},"value":"log(string,uint256)"},{"id":148,"name":"p0","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":139,"src":"2060:2:0","typeDescriptions":{"typeIdentifier":"t_string_memory_ptr","typeString":"string memory"}},{"id":149,"name":"p1","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":141,"src":"2064:2:0","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}}],"expression":{"argumentTypes":[{"typeIdentifier":"t_stringliteral_b60e72ccf6d57ab53eb84d7e94a9545806ed7f93c4d5673f11a64f03471e584e","typeString":"literal_string \"log(string,uint256)\""},{"typeIdentifier":"t_string_memory_ptr","typeString":"string memory"},{"typeIdentifier":"t_uint256","typeString":"uint256"}],"expression":{"id":145,"name":"abi","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":-1,"src":"2013:3:0","typeDescriptions":{"typeIdentifier":"t_magic_abi","typeString":"abi"}},"id":146,"isConstant":false,"isLValue":false,"isPure":true,"lValueRequested":false,"memberName":"encodeWithSignature","nodeType":"MemberAccess","src":"2013:23:0","typeDescriptions":{"typeIdentifier":"t_function_abiencodewithsignature_pure$_t_string_memory_ptr_$returns$_t_bytes_memory_ptr_$","typeString":"function (string memory) pure returns (bytes memory)"}},"id":150,"isConstant":false,"isLValue":false,"isPure":false,"kind":"functionCall","lValueRequested":false,"names":[],"nodeType":"FunctionCall","src":"2013:54:0","tryCall":false,"typeDescriptions":{"typeIdentifier":"t_bytes_memory_ptr","typeString":"bytes memory"}}],"expression":{"argumentTypes":[{"typeIdentifier":"t_bytes_memory_ptr","typeString":"bytes memory"}],"id":144,"name":"_sendLogPayload","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":90,"src":"1997:15:0","typeDescriptions":{"typeIdentifier":"t_function_internal_pure$_t_bytes_memory_ptr_$returns$__$","typeString":"function (bytes memory) pure"}},"id":151,"isConstant":false,"isLValue":false,"isPure":false,"kind":"functionCall","lValueRequested":false,"names":[],"nodeType":"FunctionCall","src":"1997:71:0","tryCall":false,"typeDescriptions":{"typeIdentifier":"t_tuple$__$","typeString":"tuple()"}},"id":152,"nodeType":"ExpressionStatement","src":"1997:71:0"}]},"implemented":true,"kind":"function","modifiers":[],"name":"log","nameLocation":"1939:3:0","parameters":{"id":142,"nodeType":"ParameterList","parameters":[{"constant":false,"id":139,"mutability":"mutable","name":"p0","nameLocation":"1957:2:0","nodeType":"VariableDeclaration","scope":154,"src":"1943:16:0","stateVariable":false,"storageLocation":"memory","typeDescriptions":{"typeIdentifier":"t_string_memory_ptr","typeString":"string"},"typeName":{"id":138,"name":"string","nodeType":"ElementaryTypeName","src":"1943:6:0","typeDescriptions":{"typeIdentifier":"t_string_storage_ptr","typeString":"string"}},"visibility":"internal"},{"constant":false,"id":141,"mutability":"mutable","name":"p1","nameLocation":"1969:2:0","nodeType":"VariableDeclaration","scope":154,"src":"1961:10:0","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"},"typeName":{"id":140,"name":"uint256","nodeType":"ElementaryTypeName","src":"1961:7:0","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"visibility":"internal"}],"src":"1942:30:0"},"returnParameters":{"id":143,"nodeType":"ParameterList","parameters":[],"src":"1987:0:0"},"scope":192,"stateMutability":"pure","virtual":false,"visibility":"internal"},{"id":171,"nodeType":"FunctionDefinition","src":"2081:145:0","nodes":[],"body":{"id":170,"nodeType":"Block","src":"2138:88:0","nodes":[],"statements":[{"expression":{"arguments":[{"arguments":[{"hexValue":"6c6f6728737472696e672c6164647265737329","id":164,"isConstant":false,"isLValue":false,"isPure":true,"kind":"string","lValueRequested":false,"nodeType":"Literal","src":"2188:21:0","typeDescriptions":{"typeIdentifier":"t_stringliteral_319af333460570a1937bf195dd33445c0d0951c59127da6f1f038b9fdce3fd72","typeString":"literal_string \"log(string,address)\""},"value":"log(string,address)"},{"id":165,"name":"p0","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":156,"src":"2211:2:0","typeDescriptions":{"typeIdentifier":"t_string_memory_ptr","typeString":"string memory"}},{"id":166,"name":"p1","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":158,"src":"2215:2:0","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"}}],"expression":{"argumentTypes":[{"typeIdentifier":"t_stringliteral_319af333460570a1937bf195dd33445c0d0951c59127da6f1f038b9fdce3fd72","typeString":"literal_string \"log(string,address)\""},{"typeIdentifier":"t_string_memory_ptr","typeString":"string memory"},{"typeIdentifier":"t_address","typeString":"address"}],"expression":{"id":162,"name":"abi","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":-1,"src":"2164:3:0","typeDescriptions":{"typeIdentifier":"t_magic_abi","typeString":"abi"}},"id":163,"isConstant":false,"isLValue":false,"isPure":true,"lValueRequested":false,"memberName":"encodeWithSignature","nodeType":"MemberAccess","src":"2164:23:0","typeDescriptions":{"typeIdentifier":"t_function_abiencodewithsignature_pure$_t_string_memory_ptr_$returns$_t_bytes_memory_ptr_$","typeString":"function (string memory) pure returns (bytes memory)"}},"id":167,"isConstant":false,"isLValue":false,"isPure":false,"kind":"functionCall","lValueRequested":false,"names":[],"nodeType":"FunctionCall","src":"2164:54:0","tryCall":false,"typeDescriptions":{"typeIdentifier":"t_bytes_memory_ptr","typeString":"bytes memory"}}],"expression":{"argumentTypes":[{"typeIdentifier":"t_bytes_memory_ptr","typeString":"bytes memory"}],"id":161,"name":"_sendLogPayload","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":90,"src":"2148:15:0","typeDescriptions":{"typeIdentifier":"t_function_internal_pure$_t_bytes_memory_ptr_$returns$__$","typeString":"function (bytes memory) pure"}},"id":168,"isConstant":false,"isLValue":false,"isPure":false,"kind":"functionCall","lValueRequested":false,"names":[],"nodeType":"FunctionCall","src":"2148:71:0","tryCall":false,"typeDescriptions":{"typeIdentifier":"t_tuple$__$","typeString":"tuple()"}},"id":169,"nodeType":"ExpressionStatement","src":"2148:71:0"}]},"implemented":true,"kind":"function","modifiers":[],"name":"log","nameLocation":"2090:3:0","parameters":{"id":159,"nodeType":"ParameterList","parameters":[{"constant":false,"id":156,"mutability":"mutable","name":"p0","nameLocation":"2108:2:0","nodeType":"VariableDeclaration","scope":171,"src":"2094:16:0","stateVariable":false,"storageLocation":"memory","typeDescriptions":{"typeIdentifier":"t_string_memory_ptr","typeString":"string"},"typeName":{"id":155,"name":"string","nodeType":"ElementaryTypeName","src":"2094:6:0","typeDescriptions":{"typeIdentifier":"t_string_storage_ptr","typeString":"string"}},"visibility":"internal"},{"constant":false,"id":158,"mutability":"mutable","name":"p1","nameLocation":"2120:2:0","nodeType":"VariableDeclaration","scope":171,"src":"2112:10:0","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"},"typeName":{"id":157,"name":"address","nodeType":"ElementaryTypeName","src":"2112:7:0","stateMutability":"nonpayable","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"}},"visibility":"internal"}],"src":"2093:30:0"},"returnParameters":{"id":160,"nodeType":"ParameterList","parameters":[],"src":"2138:0:0"},"scope":192,"stateMutability":"pure","virtual":false,"visibility":"internal"},{"id":191,"nodeType":"FunctionDefinition","src":"2232:179:0","nodes":[],"body":{"id":190,"nodeType":"Block","src":"2313:98:0","nodes":[],"statements":[{"expression":{"arguments":[{"arguments":[{"hexValue":"6c6f6728737472696e672c737472696e672c737472696e6729","id":183,"isConstant":false,"isLValue":false,"isPure":true,"kind":"string","lValueRequested":false,"nodeType":"Literal","src":"2363:27:0","typeDescriptions":{"typeIdentifier":"t_stringliteral_2ced7cef693312206c21f0e92e3b54e2e16bf33db5eec350c78866822c665e1f","typeString":"literal_string \"log(string,string,string)\""},"value":"log(string,string,string)"},{"id":184,"name":"p0","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":173,"src":"2392:2:0","typeDescriptions":{"typeIdentifier":"t_string_memory_ptr","typeString":"string memory"}},{"id":185,"name":"p1","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":175,"src":"2396:2:0","typeDescriptions":{"typeIdentifier":"t_string_memory_ptr","typeString":"string memory"}},{"id":186,"name":"p2","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":177,"src":"2400:2:0","typeDescriptions":{"typeIdentifier":"t_string_memory_ptr","typeString":"string memory"}}],"expression":{"argumentTypes":[{"typeIdentifier":"t_stringliteral_2ced7cef693312206c21f0e92e3b54e2e16bf33db5eec350c78866822c665e1f","typeString":"literal_string \"log(string,string,string)\""},{"typeIdentifier":"t_string_memory_ptr","typeString":"string memory"},{"typeIdentifier":"t_string_memory_ptr","typeString":"string memory"},{"typeIdentifier":"t_string_memory_ptr","typeString":"string memory"}],"expression":{"id":181,"name":"abi","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":-1,"src":"2339:3:0","typeDescriptions":{"typeIdentifier":"t_magic_abi","typeString":"abi"}},"id":182,"isConstant":false,"isLValue":false,"isPure":true,"lValueRequested":false,"memberName":"encodeWithSignature","nodeType":"MemberAccess","src":"2339:23:0","typeDescriptions":{"typeIdentifier":"t_function_abiencodewithsignature_pure$_t_string_memory_ptr_$returns$_t_bytes_memory_ptr_$","typeString":"function (string memory) pure returns (bytes memory)"}},"id":187,"isConstant":false,"isLValue":false,"isPure":false,"kind":"functionCall","lValueRequested":false,"names":[],"nodeType":"FunctionCall","src":"2339:64:0","tryCall":false,"typeDescriptions":{"typeIdentifier":"t_bytes_memory_ptr","typeString":"bytes memory"}}],"expression":{"argumentTypes":[{"typeIdentifier":"t_bytes_memory_ptr","typeString":"bytes memory"}],"id":180,"name":"_sendLogPayload","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":90,"src":"2323:15:0","typeDescriptions":{"typeIdentifier":"t_function_internal_pure$_t_bytes_memory_ptr_$returns$__$","typeString":"function (bytes memory) pure"}},"id":188,"isConstant":false,"isLValue":false,"isPure":false,"kind":"functionCall","lValueRequested":false,"names":[],"nodeType":"FunctionCall","src":"2323:81:0","tryCall":false,"typeDescriptions":{"typeIdentifier":"t_tuple$__$","typeString":"tuple()"}},"id":189,"nodeType":"ExpressionStatement","src":"2323:81:0"}]},"implemented":true,"kind":"function","modifiers":[],"name":"log","nameLocation":"2241:3:0","parameters":{"id":178,"nodeType":"ParameterList","parameters":[{"constant":false,"id":173,"mutability":"mutable","name":"p0","nameLocation":"2259:2:0","nodeType":"VariableDeclaration","scope":191,"src":"2245:16:0","stateVariable":false,"storageLocation":"memory","typeDescriptions":{"typeIdentifier":"t_string_memory_ptr","typeString":"string"},"typeName":{"id":172,"name":"string","nodeType":"ElementaryTypeName","src":"2245:6:0","typeDescriptions":{"typeIdentifier":"t_string_storage_ptr","typeString":"string"}},"visibility":"internal"},{"constant":false,"id":175,"mutability":"mutable","name":"p1","nameLocation":"2277:2:0","nodeType":"VariableDeclaration","scope":191,"src":"2263:16:0","stateVariable":false,"storageLocation":"memory","typeDescriptions":{"typeIdentifier":"t_string_memory_ptr","typeString":"string"},"typeName":{"id":174,"name":"string","nodeType":"ElementaryTypeName","src":"2263:6:0","typeDescriptions":{"typeIdentifier":"t_string_storage_ptr","typeString":"string"}},"visibility":"internal"},{"constant":false,"id":177,"mutability":"mutable","name":"p2","nameLocation":"2295:2:0","nodeType":"VariableDeclaration","scope":191,"src":"2281:16:0","stateVariable":false,"storageLocation":"memory","typeDescriptions":{"typeIdentifier":"t_string_memory_ptr","typeString":"string"},"typeName":{"id":176,"name":"string","nodeType":"ElementaryTypeName","src":"2281:6:0","typeDescriptions":{"typeIdentifier":"t_string_storage_ptr","typeString":"string"}},"visibility":"internal"}],"src":"2244:54:0"},"returnParameters":{"id":179,"nodeType":"ParameterList","parameters":[],"src":"2313:0:0"},"scope":192,"stateMutability":"pure","virtual":false,"visibility":"internal"}],"abstract":false,"baseContracts":[],"canonicalName":"console","contractDependencies":[],"contractKind":"library","fullyImplemented":true,"linearizedBaseContracts":[192],"name":"console","nameLocation":"799:7:0","scope":720,"usedErrors":[]},{"id":706,"nodeType":"ContractDefinition","src":"2541:3359:0","nodes":[{"id":207,"nodeType":"VariableDeclaration","src":"2571:94:0","nodes":[],"constant":true,"mutability":"constant","name":"VM_ADDRESS","nameLocation":"2597:10:0","scope":706,"stateVariable":true,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"},"typeName":{"id":194,"name":"address","nodeType":"ElementaryTypeName","src":"2571:7:0","stateMutability":"nonpayable","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"}},"value":{"arguments":[{"arguments":[{"arguments":[{"arguments":[{"hexValue":"6865766d20636865617420636f6465","id":202,"isConstant":false,"isLValue":false,"isPure":true,"kind":"string","lValueRequested":false,"nodeType":"Literal","src":"2644:17:0","typeDescriptions":{"typeIdentifier":"t_stringliteral_885cb69240a935d632d79c317109709ecfa91a80626ff3989d68f67f5b1dd12d","typeString":"literal_string \"hevm cheat code\""},"value":"hevm cheat code"}],"expression":{"argumentTypes":[{"typeIdentifier":"t_stringliteral_885cb69240a935d632d79c317109709ecfa91a80626ff3989d68f67f5b1dd12d","typeString":"literal_string \"hevm cheat code\""}],"id":201,"name":"keccak256","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":-8,"src":"2634:9:0","typeDescriptions":{"typeIdentifier":"t_function_keccak256_pure$_t_bytes_memory_ptr_$returns$_t_bytes32_$","typeString":"function (bytes memory) pure returns (bytes32)"}},"id":203,"isConstant":false,"isLValue":false,"isPure":true,"kind":"functionCall","lValueRequested":false,"names":[],"nodeType":"FunctionCall","src":"2634:28:0","tryCall":false,"typeDescriptions":{"typeIdentifier":"t_bytes32","typeString":"bytes32"}}],"expression":{"argumentTypes":[{"typeIdentifier":"t_bytes32","typeString":"bytes32"}],"id":200,"isConstant":false,"isLValue":false,"isPure":true,"lValueRequested":false,"nodeType":"ElementaryTypeNameExpression","src":"2626:7:0","typeDescriptions":{"typeIdentifier":"t_type$_t_uint256_$","typeString":"type(uint256)"},"typeName":{"id":199,"name":"uint256","nodeType":"ElementaryTypeName","src":"2626:7:0","typeDescriptions":{}}},"id":204,"isConstant":false,"isLValue":false,"isPure":true,"kind":"typeConversion","lValueRequested":false,"names":[],"nodeType":"FunctionCall","src":"2626:37:0","tryCall":false,"typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}}],"expression":{"argumentTypes":[{"typeIdentifier":"t_uint256","typeString":"uint256"}],"id":198,"isConstant":false,"isLValue":false,"isPure":true,"lValueRequested":false,"nodeType":"ElementaryTypeNameExpression","src":"2618:7:0","typeDescriptions":{"typeIdentifier":"t_type$_t_uint160_$","typeString":"type(uint160)"},"typeName":{"id":197,"name":"uint160","nodeType":"ElementaryTypeName","src":"2618:7:0","typeDescriptions":{}}},"id":205,"isConstant":false,"isLValue":false,"isPure":true,"kind":"typeConversion","lValueRequested":false,"names":[],"nodeType":"FunctionCall","src":"2618:46:0","tryCall":false,"typeDescriptions":{"typeIdentifier":"t_uint160","typeString":"uint160"}}],"expression":{"argumentTypes":[{"typeIdentifier":"t_uint160","typeString":"uint160"}],"id":196,"isConstant":false,"isLValue":false,"isPure":true,"lValueRequested":false,"nodeType":"ElementaryTypeNameExpression","src":"2610:7:0","typeDescriptions":{"typeIdentifier":"t_type$_t_address_$","typeString":"type(address)"},"typeName":{"id":195,"name":"address","nodeType":"ElementaryTypeName","src":"2610:7:0","typeDescriptions":{}}},"id":206,"isConstant":false,"isLValue":false,"isPure":true,"kind":"typeConversion","lValueRequested":false,"names":[],"nodeType":"FunctionCall","src":"2610:55:0","tryCall":false,"typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"}},"visibility":"internal"},{"id":213,"nodeType":"VariableDeclaration","src":"2671:40:0","nodes":[],"constant":true,"mutability":"constant","name":"vm","nameLocation":"2692:2:0","scope":706,"stateVariable":true,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_contract$_Vm_$55","typeString":"contract Vm"},"typeName":{"id":209,"nodeType":"UserDefinedTypeName","pathNode":{"id":208,"name":"Vm","nodeType":"IdentifierPath","referencedDeclaration":55,"src":"2671:2:0"},"referencedDeclaration":55,"src":"2671:2:0","typeDescriptions":{"typeIdentifier":"t_contract$_Vm_$55","typeString":"contract Vm"}},"value":{"arguments":[{"id":211,"name":"VM_ADDRESS","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":207,"src":"2700:10:0","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"}}],"expression":{"argumentTypes":[{"typeIdentifier":"t_address","typeString":"address"}],"id":210,"name":"Vm","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":55,"src":"2697:2:0","typeDescriptions":{"typeIdentifier":"t_type$_t_contract$_Vm_$55_$","typeString":"type(contract Vm)"}},"id":212,"isConstant":false,"isLValue":false,"isPure":true,"kind":"typeConversion","lValueRequested":false,"names":[],"nodeType":"FunctionCall","src":"2697:14:0","tryCall":false,"typeDescriptions":{"typeIdentifier":"t_contract$_Vm_$55","typeString":"contract Vm"}},"visibility":"internal"},{"id":215,"nodeType":"VariableDeclaration","src":"2775:22:0","nodes":[],"constant":false,"functionSelector":"61bc221a","mutability":"mutable","name":"counter","nameLocation":"2790:7:0","scope":706,"stateVariable":true,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"},"typeName":{"id":214,"name":"uint256","nodeType":"ElementaryTypeName","src":"2775:7:0","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"visibility":"public"},{"id":378,"nodeType":"FunctionDefinition","src":"2887:949:0","nodes":[],"body":{"id":377,"nodeType":"Block","src":"2909:927:0","nodes":[],"statements":[{"assignments":[220],"declarations":[{"constant":false,"id":220,"mutability":"mutable","name":"x","nameLocation":"2924:1:0","nodeType":"VariableDeclaration","scope":377,"src":"2919:6:0","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_bool","typeString":"bool"},"typeName":{"id":219,"name":"bool","nodeType":"ElementaryTypeName","src":"2919:4:0","typeDescriptions":{"typeIdentifier":"t_bool","typeString":"bool"}},"visibility":"internal"}],"id":226,"initialValue":{"arguments":[{"hexValue":"4558414d504c455f424f4f4c","id":223,"isConstant":false,"isLValue":false,"isPure":true,"kind":"string","lValueRequested":false,"nodeType":"Literal","src":"2937:14:0","typeDescriptions":{"typeIdentifier":"t_stringliteral_a634dae177a0e138ae7aaa2afae347412e148992e88c7aabd33ee71be146cb7f","typeString":"literal_string \"EXAMPLE_BOOL\""},"value":"EXAMPLE_BOOL"},{"hexValue":"66616c7365","id":224,"isConstant":false,"isLValue":false,"isPure":true,"kind":"bool","lValueRequested":false,"nodeType":"Literal","src":"2953:5:0","typeDescriptions":{"typeIdentifier":"t_bool","typeString":"bool"},"value":"false"}],"expression":{"argumentTypes":[{"typeIdentifier":"t_stringliteral_a634dae177a0e138ae7aaa2afae347412e148992e88c7aabd33ee71be146cb7f","typeString":"literal_string \"EXAMPLE_BOOL\""},{"typeIdentifier":"t_bool","typeString":"bool"}],"expression":{"id":221,"name":"vm","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":213,"src":"2928:2:0","typeDescriptions":{"typeIdentifier":"t_contract$_Vm_$55","typeString":"contract Vm"}},"id":222,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"memberName":"envOr","nodeType":"MemberAccess","referencedDeclaration":10,"src":"2928:8:0","typeDescriptions":{"typeIdentifier":"t_function_external_view$_t_string_memory_ptr_$_t_bool_$returns$_t_bool_$","typeString":"function (string memory,bool) view external returns (bool)"}},"id":225,"isConstant":false,"isLValue":false,"isPure":false,"kind":"functionCall","lValueRequested":false,"names":[],"nodeType":"FunctionCall","src":"2928:31:0","tryCall":false,"typeDescriptions":{"typeIdentifier":"t_bool","typeString":"bool"}},"nodeType":"VariableDeclarationStatement","src":"2919:40:0"},{"expression":{"arguments":[{"hexValue":"626f6f6c2076616c75652066726f6d20656e76","id":230,"isConstant":false,"isLValue":false,"isPure":true,"kind":"string","lValueRequested":false,"nodeType":"Literal","src":"2981:21:0","typeDescriptions":{"typeIdentifier":"t_stringliteral_5a607d0b5a1295325aa8901721d78ba402601bba6f62cebdd5235dd0204a590b","typeString":"literal_string \"bool value from env\""},"value":"bool value from env"},{"id":231,"name":"x","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":220,"src":"3004:1:0","typeDescriptions":{"typeIdentifier":"t_bool","typeString":"bool"}}],"expression":{"argumentTypes":[{"typeIdentifier":"t_stringliteral_5a607d0b5a1295325aa8901721d78ba402601bba6f62cebdd5235dd0204a590b","typeString":"literal_string \"bool value from env\""},{"typeIdentifier":"t_bool","typeString":"bool"}],"expression":{"id":227,"name":"console","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":192,"src":"2969:7:0","typeDescriptions":{"typeIdentifier":"t_type$_t_contract$_console_$192_$","typeString":"type(library console)"}},"id":229,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"memberName":"log","nodeType":"MemberAccess","referencedDeclaration":137,"src":"2969:11:0","typeDescriptions":{"typeIdentifier":"t_function_internal_pure$_t_string_memory_ptr_$_t_bool_$returns$__$","typeString":"function (string memory,bool) pure"}},"id":232,"isConstant":false,"isLValue":false,"isPure":false,"kind":"functionCall","lValueRequested":false,"names":[],"nodeType":"FunctionCall","src":"2969:37:0","tryCall":false,"typeDescriptions":{"typeIdentifier":"t_tuple$__$","typeString":"tuple()"}},"id":233,"nodeType":"ExpressionStatement","src":"2969:37:0"},{"expression":{"arguments":[{"hexValue":"636f6e74726163742061646472","id":237,"isConstant":false,"isLValue":false,"isPure":true,"kind":"string","lValueRequested":false,"nodeType":"Literal","src":"3029:15:0","typeDescriptions":{"typeIdentifier":"t_stringliteral_fa50728770d00fe8f6a0592f3565bbfaf063ee4077f1f5bbc003d091d33cd0c4","typeString":"literal_string \"contract addr\""},"value":"contract addr"},{"arguments":[{"id":240,"name":"this","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":-28,"src":"3054:4:0","typeDescriptions":{"typeIdentifier":"t_contract$_ScriptExample_$706","typeString":"contract ScriptExample"}}],"expression":{"argumentTypes":[{"typeIdentifier":"t_contract$_ScriptExample_$706","typeString":"contract ScriptExample"}],"id":239,"isConstant":false,"isLValue":false,"isPure":true,"lValueRequested":false,"nodeType":"ElementaryTypeNameExpression","src":"3046:7:0","typeDescriptions":{"typeIdentifier":"t_type$_t_address_$","typeString":"type(address)"},"typeName":{"id":238,"name":"address","nodeType":"ElementaryTypeName","src":"3046:7:0","typeDescriptions":{}}},"id":241,"isConstant":false,"isLValue":false,"isPure":false,"kind":"typeConversion","lValueRequested":false,"names":[],"nodeType":"FunctionCall","src":"3046:13:0","tryCall":false,"typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"}}],"expression":{"argumentTypes":[{"typeIdentifier":"t_stringliteral_fa50728770d00fe8f6a0592f3565bbfaf063ee4077f1f5bbc003d091d33cd0c4","typeString":"literal_string \"contract addr\""},{"typeIdentifier":"t_address","typeString":"address"}],"expression":{"id":234,"name":"console","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":192,"src":"3017:7:0","typeDescriptions":{"typeIdentifier":"t_type$_t_contract$_console_$192_$","typeString":"type(library console)"}},"id":236,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"memberName":"log","nodeType":"MemberAccess","referencedDeclaration":171,"src":"3017:11:0","typeDescriptions":{"typeIdentifier":"t_function_internal_pure$_t_string_memory_ptr_$_t_address_$returns$__$","typeString":"function (string memory,address) pure"}},"id":242,"isConstant":false,"isLValue":false,"isPure":false,"kind":"functionCall","lValueRequested":false,"names":[],"nodeType":"FunctionCall","src":"3017:43:0","tryCall":false,"typeDescriptions":{"typeIdentifier":"t_tuple$__$","typeString":"tuple()"}},"id":243,"nodeType":"ExpressionStatement","src":"3017:43:0"},{"expression":{"arguments":[{"hexValue":"636f6e7472616374206e6f6e6365","id":247,"isConstant":false,"isLValue":false,"isPure":true,"kind":"string","lValueRequested":false,"nodeType":"Literal","src":"3082:16:0","typeDescriptions":{"typeIdentifier":"t_stringliteral_3a23091615a5de8c0a35ffd8857a37e2c4e0b72f3ef8a34d6caf65efcd562e2f","typeString":"literal_string \"contract nonce\""},"value":"contract nonce"},{"arguments":[{"arguments":[{"id":252,"name":"this","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":-28,"src":"3120:4:0","typeDescriptions":{"typeIdentifier":"t_contract$_ScriptExample_$706","typeString":"contract ScriptExample"}}],"expression":{"argumentTypes":[{"typeIdentifier":"t_contract$_ScriptExample_$706","typeString":"contract ScriptExample"}],"id":251,"isConstant":false,"isLValue":false,"isPure":true,"lValueRequested":false,"nodeType":"ElementaryTypeNameExpression","src":"3112:7:0","typeDescriptions":{"typeIdentifier":"t_type$_t_address_$","typeString":"type(address)"},"typeName":{"id":250,"name":"address","nodeType":"ElementaryTypeName","src":"3112:7:0","typeDescriptions":{}}},"id":253,"isConstant":false,"isLValue":false,"isPure":false,"kind":"typeConversion","lValueRequested":false,"names":[],"nodeType":"FunctionCall","src":"3112:13:0","tryCall":false,"typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"}}],"expression":{"argumentTypes":[{"typeIdentifier":"t_address","typeString":"address"}],"expression":{"id":248,"name":"vm","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":213,"src":"3100:2:0","typeDescriptions":{"typeIdentifier":"t_contract$_Vm_$55","typeString":"contract Vm"}},"id":249,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"memberName":"getNonce","nodeType":"MemberAccess","referencedDeclaration":17,"src":"3100:11:0","typeDescriptions":{"typeIdentifier":"t_function_external_view$_t_address_$returns$_t_uint64_$","typeString":"function (address) view external returns (uint64)"}},"id":254,"isConstant":false,"isLValue":false,"isPure":false,"kind":"functionCall","lValueRequested":false,"names":[],"nodeType":"FunctionCall","src":"3100:26:0","tryCall":false,"typeDescriptions":{"typeIdentifier":"t_uint64","typeString":"uint64"}}],"expression":{"argumentTypes":[{"typeIdentifier":"t_stringliteral_3a23091615a5de8c0a35ffd8857a37e2c4e0b72f3ef8a34d6caf65efcd562e2f","typeString":"literal_string \"contract nonce\""},{"typeIdentifier":"t_uint64","typeString":"uint64"}],"expression":{"id":244,"name":"console","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":192,"src":"3070:7:0","typeDescriptions":{"typeIdentifier":"t_type$_t_contract$_console_$192_$","typeString":"type(library console)"}},"id":246,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"memberName":"log","nodeType":"MemberAccess","referencedDeclaration":154,"src":"3070:11:0","typeDescriptions":{"typeIdentifier":"t_function_internal_pure$_t_string_memory_ptr_$_t_uint256_$returns$__$","typeString":"function (string memory,uint256) pure"}},"id":255,"isConstant":false,"isLValue":false,"isPure":false,"kind":"functionCall","lValueRequested":false,"names":[],"nodeType":"FunctionCall","src":"3070:57:0","tryCall":false,"typeDescriptions":{"typeIdentifier":"t_tuple$__$","typeString":"tuple()"}},"id":256,"nodeType":"ExpressionStatement","src":"3070:57:0"},{"expression":{"arguments":[{"hexValue":"73656e6465722061646472","id":260,"isConstant":false,"isLValue":false,"isPure":true,"kind":"string","lValueRequested":false,"nodeType":"Literal","src":"3149:13:0","typeDescriptions":{"typeIdentifier":"t_stringliteral_8125ca2decf812b25b65606ff16dad37cb198ff0433485a7926e50feafacfc35","typeString":"literal_string \"sender addr\""},"value":"sender addr"},{"arguments":[{"expression":{"id":263,"name":"msg","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":-15,"src":"3172:3:0","typeDescriptions":{"typeIdentifier":"t_magic_message","typeString":"msg"}},"id":264,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"memberName":"sender","nodeType":"MemberAccess","src":"3172:10:0","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"}}],"expression":{"argumentTypes":[{"typeIdentifier":"t_address","typeString":"address"}],"id":262,"isConstant":false,"isLValue":false,"isPure":true,"lValueRequested":false,"nodeType":"ElementaryTypeNameExpression","src":"3164:7:0","typeDescriptions":{"typeIdentifier":"t_type$_t_address_$","typeString":"type(address)"},"typeName":{"id":261,"name":"address","nodeType":"ElementaryTypeName","src":"3164:7:0","typeDescriptions":{}}},"id":265,"isConstant":false,"isLValue":false,"isPure":false,"kind":"typeConversion","lValueRequested":false,"names":[],"nodeType":"FunctionCall","src":"3164:19:0","tryCall":false,"typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"}}],"expression":{"argumentTypes":[{"typeIdentifier":"t_stringliteral_8125ca2decf812b25b65606ff16dad37cb198ff0433485a7926e50feafacfc35","typeString":"literal_string \"sender addr\""},{"typeIdentifier":"t_address","typeString":"address"}],"expression":{"id":257,"name":"console","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":192,"src":"3137:7:0","typeDescriptions":{"typeIdentifier":"t_type$_t_contract$_console_$192_$","typeString":"type(library console)"}},"id":259,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"memberName":"log","nodeType":"MemberAccess","referencedDeclaration":171,"src":"3137:11:0","typeDescriptions":{"typeIdentifier":"t_function_internal_pure$_t_string_memory_ptr_$_t_address_$returns$__$","typeString":"function (string memory,address) pure"}},"id":266,"isConstant":false,"isLValue":false,"isPure":false,"kind":"functionCall","lValueRequested":false,"names":[],"nodeType":"FunctionCall","src":"3137:47:0","tryCall":false,"typeDescriptions":{"typeIdentifier":"t_tuple$__$","typeString":"tuple()"}},"id":267,"nodeType":"ExpressionStatement","src":"3137:47:0"},{"expression":{"arguments":[{"hexValue":"73656e646572206e6f6e6365","id":271,"isConstant":false,"isLValue":false,"isPure":true,"kind":"string","lValueRequested":false,"nodeType":"Literal","src":"3206:14:0","typeDescriptions":{"typeIdentifier":"t_stringliteral_db7deb43f2f9e0404016de53b7e64c4976b54149581f7534daae2551e8cf4e40","typeString":"literal_string \"sender nonce\""},"value":"sender nonce"},{"arguments":[{"arguments":[{"expression":{"id":276,"name":"msg","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":-15,"src":"3242:3:0","typeDescriptions":{"typeIdentifier":"t_magic_message","typeString":"msg"}},"id":277,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"memberName":"sender","nodeType":"MemberAccess","src":"3242:10:0","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"}}],"expression":{"argumentTypes":[{"typeIdentifier":"t_address","typeString":"address"}],"id":275,"isConstant":false,"isLValue":false,"isPure":true,"lValueRequested":false,"nodeType":"ElementaryTypeNameExpression","src":"3234:7:0","typeDescriptions":{"typeIdentifier":"t_type$_t_address_$","typeString":"type(address)"},"typeName":{"id":274,"name":"address","nodeType":"ElementaryTypeName","src":"3234:7:0","typeDescriptions":{}}},"id":278,"isConstant":false,"isLValue":false,"isPure":false,"kind":"typeConversion","lValueRequested":false,"names":[],"nodeType":"FunctionCall","src":"3234:19:0","tryCall":false,"typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"}}],"expression":{"argumentTypes":[{"typeIdentifier":"t_address","typeString":"address"}],"expression":{"id":272,"name":"vm","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":213,"src":"3222:2:0","typeDescriptions":{"typeIdentifier":"t_contract$_Vm_$55","typeString":"contract Vm"}},"id":273,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"memberName":"getNonce","nodeType":"MemberAccess","referencedDeclaration":17,"src":"3222:11:0","typeDescriptions":{"typeIdentifier":"t_function_external_view$_t_address_$returns$_t_uint64_$","typeString":"function (address) view external returns (uint64)"}},"id":279,"isConstant":false,"isLValue":false,"isPure":false,"kind":"functionCall","lValueRequested":false,"names":[],"nodeType":"FunctionCall","src":"3222:32:0","tryCall":false,"typeDescriptions":{"typeIdentifier":"t_uint64","typeString":"uint64"}}],"expression":{"argumentTypes":[{"typeIdentifier":"t_stringliteral_db7deb43f2f9e0404016de53b7e64c4976b54149581f7534daae2551e8cf4e40","typeString":"literal_string \"sender nonce\""},{"typeIdentifier":"t_uint64","typeString":"uint64"}],"expression":{"id":268,"name":"console","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":192,"src":"3194:7:0","typeDescriptions":{"typeIdentifier":"t_type$_t_contract$_console_$192_$","typeString":"type(library console)"}},"id":270,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"memberName":"log","nodeType":"MemberAccess","referencedDeclaration":154,"src":"3194:11:0","typeDescriptions":{"typeIdentifier":"t_function_internal_pure$_t_string_memory_ptr_$_t_uint256_$returns$__$","typeString":"function (string memory,uint256) pure"}},"id":280,"isConstant":false,"isLValue":false,"isPure":false,"kind":"functionCall","lValueRequested":false,"names":[],"nodeType":"FunctionCall","src":"3194:61:0","tryCall":false,"typeDescriptions":{"typeIdentifier":"t_tuple$__$","typeString":"tuple()"}},"id":281,"nodeType":"ExpressionStatement","src":"3194:61:0"},{"assignments":[283],"declarations":[{"constant":false,"id":283,"mutability":"mutable","name":"json","nameLocation":"3280:4:0","nodeType":"VariableDeclaration","scope":377,"src":"3266:18:0","stateVariable":false,"storageLocation":"memory","typeDescriptions":{"typeIdentifier":"t_string_memory_ptr","typeString":"string"},"typeName":{"id":282,"name":"string","nodeType":"ElementaryTypeName","src":"3266:6:0","typeDescriptions":{"typeIdentifier":"t_string_storage_ptr","typeString":"string"}},"visibility":"internal"}],"id":285,"initialValue":{"hexValue":"7b22726f6f745f6b6579223a205b7b2261223a20312c202262223a20327d5d7d","id":284,"isConstant":false,"isLValue":false,"isPure":true,"kind":"string","lValueRequested":false,"nodeType":"Literal","src":"3287:34:0","typeDescriptions":{"typeIdentifier":"t_stringliteral_e95522e99766888d0261f55bd1eae5e3f3e26eaf009a16e2433eafaf0a4ecdf2","typeString":"literal_string \"{\"root_key\": [{\"a\": 1, \"b\": 2}]}\""},"value":"{\"root_key\": [{\"a\": 1, \"b\": 2}]}"},"nodeType":"VariableDeclarationStatement","src":"3266:55:0"},{"assignments":[290],"declarations":[{"constant":false,"id":290,"mutability":"mutable","name":"keys","nameLocation":"3347:4:0","nodeType":"VariableDeclaration","scope":377,"src":"3331:20:0","stateVariable":false,"storageLocation":"memory","typeDescriptions":{"typeIdentifier":"t_array$_t_string_memory_ptr_$dyn_memory_ptr","typeString":"string[]"},"typeName":{"baseType":{"id":288,"name":"string","nodeType":"ElementaryTypeName","src":"3331:6:0","typeDescriptions":{"typeIdentifier":"t_string_storage_ptr","typeString":"string"}},"id":289,"nodeType":"ArrayTypeName","src":"3331:8:0","typeDescriptions":{"typeIdentifier":"t_array$_t_string_storage_$dyn_storage_ptr","typeString":"string[]"}},"visibility":"internal"}],"id":296,"initialValue":{"arguments":[{"id":293,"name":"json","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":283,"src":"3371:4:0","typeDescriptions":{"typeIdentifier":"t_string_memory_ptr","typeString":"string memory"}},{"hexValue":"2e726f6f745f6b65795b305d","id":294,"isConstant":false,"isLValue":false,"isPure":true,"kind":"string","lValueRequested":false,"nodeType":"Literal","src":"3377:14:0","typeDescriptions":{"typeIdentifier":"t_stringliteral_d82f67100edb80050915e1ec4b565c9a8319a22efb1075e1298b7bb60101d266","typeString":"literal_string \".root_key[0]\""},"value":".root_key[0]"}],"expression":{"argumentTypes":[{"typeIdentifier":"t_string_memory_ptr","typeString":"string memory"},{"typeIdentifier":"t_stringliteral_d82f67100edb80050915e1ec4b565c9a8319a22efb1075e1298b7bb60101d266","typeString":"literal_string \".root_key[0]\""}],"expression":{"id":291,"name":"vm","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":213,"src":"3354:2:0","typeDescriptions":{"typeIdentifier":"t_contract$_Vm_$55","typeString":"contract Vm"}},"id":292,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"memberName":"parseJsonKeys","nodeType":"MemberAccess","referencedDeclaration":27,"src":"3354:16:0","typeDescriptions":{"typeIdentifier":"t_function_external_pure$_t_string_memory_ptr_$_t_string_memory_ptr_$returns$_t_array$_t_string_memory_ptr_$dyn_memory_ptr_$","typeString":"function (string memory,string memory) pure external returns (string memory[] memory)"}},"id":295,"isConstant":false,"isLValue":false,"isPure":false,"kind":"functionCall","lValueRequested":false,"names":[],"nodeType":"FunctionCall","src":"3354:38:0","tryCall":false,"typeDescriptions":{"typeIdentifier":"t_array$_t_string_memory_ptr_$dyn_memory_ptr","typeString":"string memory[] memory"}},"nodeType":"VariableDeclarationStatement","src":"3331:61:0"},{"expression":{"arguments":[{"hexValue":"6b657973","id":300,"isConstant":false,"isLValue":false,"isPure":true,"kind":"string","lValueRequested":false,"nodeType":"Literal","src":"3414:6:0","typeDescriptions":{"typeIdentifier":"t_stringliteral_f29790a80c4ce5f42f59892f424f9c92856c6b656c3378e2cf305b260c6f4195","typeString":"literal_string \"keys\""},"value":"keys"},{"baseExpression":{"id":301,"name":"keys","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":290,"src":"3422:4:0","typeDescriptions":{"typeIdentifier":"t_array$_t_string_memory_ptr_$dyn_memory_ptr","typeString":"string memory[] memory"}},"id":303,"indexExpression":{"hexValue":"30","id":302,"isConstant":false,"isLValue":false,"isPure":true,"kind":"number","lValueRequested":false,"nodeType":"Literal","src":"3427:1:0","typeDescriptions":{"typeIdentifier":"t_rational_0_by_1","typeString":"int_const 0"},"value":"0"},"isConstant":false,"isLValue":true,"isPure":false,"lValueRequested":false,"nodeType":"IndexAccess","src":"3422:7:0","typeDescriptions":{"typeIdentifier":"t_string_memory_ptr","typeString":"string memory"}},{"baseExpression":{"id":304,"name":"keys","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":290,"src":"3431:4:0","typeDescriptions":{"typeIdentifier":"t_array$_t_string_memory_ptr_$dyn_memory_ptr","typeString":"string memory[] memory"}},"id":306,"indexExpression":{"hexValue":"31","id":305,"isConstant":false,"isLValue":false,"isPure":true,"kind":"number","lValueRequested":false,"nodeType":"Literal","src":"3436:1:0","typeDescriptions":{"typeIdentifier":"t_rational_1_by_1","typeString":"int_const 1"},"value":"1"},"isConstant":false,"isLValue":true,"isPure":false,"lValueRequested":false,"nodeType":"IndexAccess","src":"3431:7:0","typeDescriptions":{"typeIdentifier":"t_string_memory_ptr","typeString":"string memory"}}],"expression":{"argumentTypes":[{"typeIdentifier":"t_stringliteral_f29790a80c4ce5f42f59892f424f9c92856c6b656c3378e2cf305b260c6f4195","typeString":"literal_string \"keys\""},{"typeIdentifier":"t_string_memory_ptr","typeString":"string memory"},{"typeIdentifier":"t_string_memory_ptr","typeString":"string memory"}],"expression":{"id":297,"name":"console","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":192,"src":"3402:7:0","typeDescriptions":{"typeIdentifier":"t_type$_t_contract$_console_$192_$","typeString":"type(library console)"}},"id":299,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"memberName":"log","nodeType":"MemberAccess","referencedDeclaration":191,"src":"3402:11:0","typeDescriptions":{"typeIdentifier":"t_function_internal_pure$_t_string_memory_ptr_$_t_string_memory_ptr_$_t_string_memory_ptr_$returns$__$","typeString":"function (string memory,string memory,string memory) pure"}},"id":307,"isConstant":false,"isLValue":false,"isPure":false,"kind":"functionCall","lValueRequested":false,"names":[],"nodeType":"FunctionCall","src":"3402:37:0","tryCall":false,"typeDescriptions":{"typeIdentifier":"t_tuple$__$","typeString":"tuple()"}},"id":308,"nodeType":"ExpressionStatement","src":"3402:37:0"},{"expression":{"arguments":[{"hexValue":"66726f6d206f726967696e616c","id":312,"isConstant":false,"isLValue":false,"isPure":true,"kind":"string","lValueRequested":false,"nodeType":"Literal","src":"3461:15:0","typeDescriptions":{"typeIdentifier":"t_stringliteral_77928970c8757d110f3c23e003246f49e0de890480ba9717ba659b2f56f316b2","typeString":"literal_string \"from original\""},"value":"from original"}],"expression":{"argumentTypes":[{"typeIdentifier":"t_stringliteral_77928970c8757d110f3c23e003246f49e0de890480ba9717ba659b2f56f316b2","typeString":"literal_string \"from original\""}],"expression":{"id":309,"name":"this","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":-28,"src":"3450:4:0","typeDescriptions":{"typeIdentifier":"t_contract$_ScriptExample_$706","typeString":"contract ScriptExample"}},"id":311,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"memberName":"hello","nodeType":"MemberAccess","referencedDeclaration":633,"src":"3450:10:0","typeDescriptions":{"typeIdentifier":"t_function_external_view$_t_string_memory_ptr_$returns$__$","typeString":"function (string memory) view external"}},"id":313,"isConstant":false,"isLValue":false,"isPure":false,"kind":"functionCall","lValueRequested":false,"names":[],"nodeType":"FunctionCall","src":"3450:27:0","tryCall":false,"typeDescriptions":{"typeIdentifier":"t_tuple$__$","typeString":"tuple()"}},"id":314,"nodeType":"ExpressionStatement","src":"3450:27:0"},{"expression":{"arguments":[{"arguments":[{"arguments":[{"hexValue":"30783432","id":322,"isConstant":false,"isLValue":false,"isPure":true,"kind":"number","lValueRequested":false,"nodeType":"Literal","src":"3517:4:0","typeDescriptions":{"typeIdentifier":"t_rational_66_by_1","typeString":"int_const 66"},"value":"0x42"}],"expression":{"argumentTypes":[{"typeIdentifier":"t_rational_66_by_1","typeString":"int_const 66"}],"id":321,"isConstant":false,"isLValue":false,"isPure":true,"lValueRequested":false,"nodeType":"ElementaryTypeNameExpression","src":"3509:7:0","typeDescriptions":{"typeIdentifier":"t_type$_t_uint160_$","typeString":"type(uint160)"},"typeName":{"id":320,"name":"uint160","nodeType":"ElementaryTypeName","src":"3509:7:0","typeDescriptions":{}}},"id":323,"isConstant":false,"isLValue":false,"isPure":true,"kind":"typeConversion","lValueRequested":false,"names":[],"nodeType":"FunctionCall","src":"3509:13:0","tryCall":false,"typeDescriptions":{"typeIdentifier":"t_uint160","typeString":"uint160"}}],"expression":{"argumentTypes":[{"typeIdentifier":"t_uint160","typeString":"uint160"}],"id":319,"isConstant":false,"isLValue":false,"isPure":true,"lValueRequested":false,"nodeType":"ElementaryTypeNameExpression","src":"3501:7:0","typeDescriptions":{"typeIdentifier":"t_type$_t_address_$","typeString":"type(address)"},"typeName":{"id":318,"name":"address","nodeType":"ElementaryTypeName","src":"3501:7:0","typeDescriptions":{}}},"id":324,"isConstant":false,"isLValue":false,"isPure":true,"kind":"typeConversion","lValueRequested":false,"names":[],"nodeType":"FunctionCall","src":"3501:22:0","tryCall":false,"typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"}}],"expression":{"argumentTypes":[{"typeIdentifier":"t_address","typeString":"address"}],"expression":{"id":315,"name":"vm","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":213,"src":"3487:2:0","typeDescriptions":{"typeIdentifier":"t_contract$_Vm_$55","typeString":"contract Vm"}},"id":317,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"memberName":"startPrank","nodeType":"MemberAccess","referencedDeclaration":32,"src":"3487:13:0","typeDescriptions":{"typeIdentifier":"t_function_external_nonpayable$_t_address_$returns$__$","typeString":"function (address) external"}},"id":325,"isConstant":false,"isLValue":false,"isPure":false,"kind":"functionCall","lValueRequested":false,"names":[],"nodeType":"FunctionCall","src":"3487:37:0","tryCall":false,"typeDescriptions":{"typeIdentifier":"t_tuple$__$","typeString":"tuple()"}},"id":326,"nodeType":"ExpressionStatement","src":"3487:37:0"},{"expression":{"arguments":[{"hexValue":"66726f6d207072616e6b2031","id":330,"isConstant":false,"isLValue":false,"isPure":true,"kind":"string","lValueRequested":false,"nodeType":"Literal","src":"3545:14:0","typeDescriptions":{"typeIdentifier":"t_stringliteral_42b34abfe37a8b0add910cda7b4a379e6538fa7a1dcafce47a02bd38f6c88e2a","typeString":"literal_string \"from prank 1\""},"value":"from prank 1"}],"expression":{"argumentTypes":[{"typeIdentifier":"t_stringliteral_42b34abfe37a8b0add910cda7b4a379e6538fa7a1dcafce47a02bd38f6c88e2a","typeString":"literal_string \"from prank 1\""}],"expression":{"id":327,"name":"this","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":-28,"src":"3534:4:0","typeDescriptions":{"typeIdentifier":"t_contract$_ScriptExample_$706","typeString":"contract ScriptExample"}},"id":329,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"memberName":"hello","nodeType":"MemberAccess","referencedDeclaration":633,"src":"3534:10:0","typeDescriptions":{"typeIdentifier":"t_function_external_view$_t_string_memory_ptr_$returns$__$","typeString":"function (string memory) view external"}},"id":331,"isConstant":false,"isLValue":false,"isPure":false,"kind":"functionCall","lValueRequested":false,"names":[],"nodeType":"FunctionCall","src":"3534:26:0","tryCall":false,"typeDescriptions":{"typeIdentifier":"t_tuple$__$","typeString":"tuple()"}},"id":332,"nodeType":"ExpressionStatement","src":"3534:26:0"},{"expression":{"arguments":[{"hexValue":"706172656e742073636f7065206d73672e73656e646572","id":336,"isConstant":false,"isLValue":false,"isPure":true,"kind":"string","lValueRequested":false,"nodeType":"Literal","src":"3582:25:0","typeDescriptions":{"typeIdentifier":"t_stringliteral_83ec9246154d8845de47aafc5c2865c9985d2efe84472c27283879f2fbf5cc94","typeString":"literal_string \"parent scope msg.sender\""},"value":"parent scope msg.sender"},{"arguments":[{"expression":{"id":339,"name":"msg","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":-15,"src":"3617:3:0","typeDescriptions":{"typeIdentifier":"t_magic_message","typeString":"msg"}},"id":340,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"memberName":"sender","nodeType":"MemberAccess","src":"3617:10:0","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"}}],"expression":{"argumentTypes":[{"typeIdentifier":"t_address","typeString":"address"}],"id":338,"isConstant":false,"isLValue":false,"isPure":true,"lValueRequested":false,"nodeType":"ElementaryTypeNameExpression","src":"3609:7:0","typeDescriptions":{"typeIdentifier":"t_type$_t_address_$","typeString":"type(address)"},"typeName":{"id":337,"name":"address","nodeType":"ElementaryTypeName","src":"3609:7:0","typeDescriptions":{}}},"id":341,"isConstant":false,"isLValue":false,"isPure":false,"kind":"typeConversion","lValueRequested":false,"names":[],"nodeType":"FunctionCall","src":"3609:19:0","tryCall":false,"typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"}}],"expression":{"argumentTypes":[{"typeIdentifier":"t_stringliteral_83ec9246154d8845de47aafc5c2865c9985d2efe84472c27283879f2fbf5cc94","typeString":"literal_string \"parent scope msg.sender\""},{"typeIdentifier":"t_address","typeString":"address"}],"expression":{"id":333,"name":"console","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":192,"src":"3570:7:0","typeDescriptions":{"typeIdentifier":"t_type$_t_contract$_console_$192_$","typeString":"type(library console)"}},"id":335,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"memberName":"log","nodeType":"MemberAccess","referencedDeclaration":171,"src":"3570:11:0","typeDescriptions":{"typeIdentifier":"t_function_internal_pure$_t_string_memory_ptr_$_t_address_$returns$__$","typeString":"function (string memory,address) pure"}},"id":342,"isConstant":false,"isLValue":false,"isPure":false,"kind":"functionCall","lValueRequested":false,"names":[],"nodeType":"FunctionCall","src":"3570:59:0","tryCall":false,"typeDescriptions":{"typeIdentifier":"t_tuple$__$","typeString":"tuple()"}},"id":343,"nodeType":"ExpressionStatement","src":"3570:59:0"},{"expression":{"arguments":[{"hexValue":"706172656e742073636f706520636f6e74726163742e61646472","id":347,"isConstant":false,"isLValue":false,"isPure":true,"kind":"string","lValueRequested":false,"nodeType":"Literal","src":"3651:28:0","typeDescriptions":{"typeIdentifier":"t_stringliteral_97df66250e0b2b48f0ec8d0e01eb1b8ca012d95f1572895622aa1ea433e5570f","typeString":"literal_string \"parent scope contract.addr\""},"value":"parent scope contract.addr"},{"arguments":[{"id":350,"name":"this","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":-28,"src":"3689:4:0","typeDescriptions":{"typeIdentifier":"t_contract$_ScriptExample_$706","typeString":"contract ScriptExample"}}],"expression":{"argumentTypes":[{"typeIdentifier":"t_contract$_ScriptExample_$706","typeString":"contract ScriptExample"}],"id":349,"isConstant":false,"isLValue":false,"isPure":true,"lValueRequested":false,"nodeType":"ElementaryTypeNameExpression","src":"3681:7:0","typeDescriptions":{"typeIdentifier":"t_type$_t_address_$","typeString":"type(address)"},"typeName":{"id":348,"name":"address","nodeType":"ElementaryTypeName","src":"3681:7:0","typeDescriptions":{}}},"id":351,"isConstant":false,"isLValue":false,"isPure":false,"kind":"typeConversion","lValueRequested":false,"names":[],"nodeType":"FunctionCall","src":"3681:13:0","tryCall":false,"typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"}}],"expression":{"argumentTypes":[{"typeIdentifier":"t_stringliteral_97df66250e0b2b48f0ec8d0e01eb1b8ca012d95f1572895622aa1ea433e5570f","typeString":"literal_string \"parent scope contract.addr\""},{"typeIdentifier":"t_address","typeString":"address"}],"expression":{"id":344,"name":"console","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":192,"src":"3639:7:0","typeDescriptions":{"typeIdentifier":"t_type$_t_contract$_console_$192_$","typeString":"type(library console)"}},"id":346,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"memberName":"log","nodeType":"MemberAccess","referencedDeclaration":171,"src":"3639:11:0","typeDescriptions":{"typeIdentifier":"t_function_internal_pure$_t_string_memory_ptr_$_t_address_$returns$__$","typeString":"function (string memory,address) pure"}},"id":352,"isConstant":false,"isLValue":false,"isPure":false,"kind":"functionCall","lValueRequested":false,"names":[],"nodeType":"FunctionCall","src":"3639:56:0","tryCall":false,"typeDescriptions":{"typeIdentifier":"t_tuple$__$","typeString":"tuple()"}},"id":353,"nodeType":"ExpressionStatement","src":"3639:56:0"},{"expression":{"arguments":[{"hexValue":"66726f6d207072616e6b2032","id":357,"isConstant":false,"isLValue":false,"isPure":true,"kind":"string","lValueRequested":false,"nodeType":"Literal","src":"3716:14:0","typeDescriptions":{"typeIdentifier":"t_stringliteral_a38a34f8cad750a79aa097a92971f8f405b51ee9d53d25c5b14fc129ba3684bb","typeString":"literal_string \"from prank 2\""},"value":"from prank 2"}],"expression":{"argumentTypes":[{"typeIdentifier":"t_stringliteral_a38a34f8cad750a79aa097a92971f8f405b51ee9d53d25c5b14fc129ba3684bb","typeString":"literal_string \"from prank 2\""}],"expression":{"id":354,"name":"this","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":-28,"src":"3705:4:0","typeDescriptions":{"typeIdentifier":"t_contract$_ScriptExample_$706","typeString":"contract ScriptExample"}},"id":356,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"memberName":"hello","nodeType":"MemberAccess","referencedDeclaration":633,"src":"3705:10:0","typeDescriptions":{"typeIdentifier":"t_function_external_view$_t_string_memory_ptr_$returns$__$","typeString":"function (string memory) view external"}},"id":358,"isConstant":false,"isLValue":false,"isPure":false,"kind":"functionCall","lValueRequested":false,"names":[],"nodeType":"FunctionCall","src":"3705:26:0","tryCall":false,"typeDescriptions":{"typeIdentifier":"t_tuple$__$","typeString":"tuple()"}},"id":359,"nodeType":"ExpressionStatement","src":"3705:26:0"},{"expression":{"arguments":[],"expression":{"argumentTypes":[],"expression":{"id":360,"name":"vm","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":213,"src":"3741:2:0","typeDescriptions":{"typeIdentifier":"t_contract$_Vm_$55","typeString":"contract Vm"}},"id":362,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"memberName":"stopPrank","nodeType":"MemberAccess","referencedDeclaration":35,"src":"3741:12:0","typeDescriptions":{"typeIdentifier":"t_function_external_nonpayable$__$returns$__$","typeString":"function () external"}},"id":363,"isConstant":false,"isLValue":false,"isPure":false,"kind":"functionCall","lValueRequested":false,"names":[],"nodeType":"FunctionCall","src":"3741:14:0","tryCall":false,"typeDescriptions":{"typeIdentifier":"t_tuple$__$","typeString":"tuple()"}},"id":364,"nodeType":"ExpressionStatement","src":"3741:14:0"},{"expression":{"arguments":[{"hexValue":"66726f6d206f726967696e616c20616761696e","id":368,"isConstant":false,"isLValue":false,"isPure":true,"kind":"string","lValueRequested":false,"nodeType":"Literal","src":"3776:21:0","typeDescriptions":{"typeIdentifier":"t_stringliteral_0c805c6579e20a9c4c8e11aeab23330910a9f2da629191dc119d1730e8ed6860","typeString":"literal_string \"from original again\""},"value":"from original again"}],"expression":{"argumentTypes":[{"typeIdentifier":"t_stringliteral_0c805c6579e20a9c4c8e11aeab23330910a9f2da629191dc119d1730e8ed6860","typeString":"literal_string \"from original again\""}],"expression":{"id":365,"name":"this","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":-28,"src":"3765:4:0","typeDescriptions":{"typeIdentifier":"t_contract$_ScriptExample_$706","typeString":"contract ScriptExample"}},"id":367,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"memberName":"hello","nodeType":"MemberAccess","referencedDeclaration":633,"src":"3765:10:0","typeDescriptions":{"typeIdentifier":"t_function_external_view$_t_string_memory_ptr_$returns$__$","typeString":"function (string memory) view external"}},"id":369,"isConstant":false,"isLValue":false,"isPure":false,"kind":"functionCall","lValueRequested":false,"names":[],"nodeType":"FunctionCall","src":"3765:33:0","tryCall":false,"typeDescriptions":{"typeIdentifier":"t_tuple$__$","typeString":"tuple()"}},"id":370,"nodeType":"ExpressionStatement","src":"3765:33:0"},{"expression":{"arguments":[{"hexValue":"646f6e6521","id":374,"isConstant":false,"isLValue":false,"isPure":true,"kind":"string","lValueRequested":false,"nodeType":"Literal","src":"3821:7:0","typeDescriptions":{"typeIdentifier":"t_stringliteral_080382d5c9e9e7c5e3d1d33f5e7422740375955180fadff167d8130e0c35f3fc","typeString":"literal_string \"done!\""},"value":"done!"}],"expression":{"argumentTypes":[{"typeIdentifier":"t_stringliteral_080382d5c9e9e7c5e3d1d33f5e7422740375955180fadff167d8130e0c35f3fc","typeString":"literal_string \"done!\""}],"expression":{"id":371,"name":"console","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":192,"src":"3809:7:0","typeDescriptions":{"typeIdentifier":"t_type$_t_contract$_console_$192_$","typeString":"type(library console)"}},"id":373,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"memberName":"log","nodeType":"MemberAccess","referencedDeclaration":120,"src":"3809:11:0","typeDescriptions":{"typeIdentifier":"t_function_internal_pure$_t_string_memory_ptr_$returns$__$","typeString":"function (string memory) pure"}},"id":375,"isConstant":false,"isLValue":false,"isPure":false,"kind":"functionCall","lValueRequested":false,"names":[],"nodeType":"FunctionCall","src":"3809:20:0","tryCall":false,"typeDescriptions":{"typeIdentifier":"t_tuple$__$","typeString":"tuple()"}},"id":376,"nodeType":"ExpressionStatement","src":"3809:20:0"}]},"documentation":{"id":216,"nodeType":"StructuredDocumentation","src":"2804:78:0","text":"@notice example function, runs through basic cheat-codes and console logs."},"functionSelector":"c0406226","implemented":true,"kind":"function","modifiers":[],"name":"run","nameLocation":"2896:3:0","parameters":{"id":217,"nodeType":"ParameterList","parameters":[],"src":"2899:2:0"},"returnParameters":{"id":218,"nodeType":"ParameterList","parameters":[],"src":"2909:0:0"},"scope":706,"stateMutability":"nonpayable","virtual":false,"visibility":"public"},{"id":609,"nodeType":"FunctionDefinition","src":"3903:1258:0","nodes":[],"body":{"id":608,"nodeType":"Block","src":"3934:1227:0","nodes":[],"statements":[{"expression":{"arguments":[{"hexValue":"6e6f6e6365207374617274","id":385,"isConstant":false,"isLValue":false,"isPure":true,"kind":"string","lValueRequested":false,"nodeType":"Literal","src":"3956:13:0","typeDescriptions":{"typeIdentifier":"t_stringliteral_71efc69b9a13b6bc1e9a14d766ff01c79022262c6daa6532fb5dfb14f8511a20","typeString":"literal_string \"nonce start\""},"value":"nonce start"},{"arguments":[{"arguments":[{"arguments":[{"id":392,"name":"this","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":-28,"src":"3999:4:0","typeDescriptions":{"typeIdentifier":"t_contract$_ScriptExample_$706","typeString":"contract ScriptExample"}}],"expression":{"argumentTypes":[{"typeIdentifier":"t_contract$_ScriptExample_$706","typeString":"contract ScriptExample"}],"id":391,"isConstant":false,"isLValue":false,"isPure":true,"lValueRequested":false,"nodeType":"ElementaryTypeNameExpression","src":"3991:7:0","typeDescriptions":{"typeIdentifier":"t_type$_t_address_$","typeString":"type(address)"},"typeName":{"id":390,"name":"address","nodeType":"ElementaryTypeName","src":"3991:7:0","typeDescriptions":{}}},"id":393,"isConstant":false,"isLValue":false,"isPure":false,"kind":"typeConversion","lValueRequested":false,"names":[],"nodeType":"FunctionCall","src":"3991:13:0","tryCall":false,"typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"}}],"expression":{"argumentTypes":[{"typeIdentifier":"t_address","typeString":"address"}],"expression":{"id":388,"name":"vm","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":213,"src":"3979:2:0","typeDescriptions":{"typeIdentifier":"t_contract$_Vm_$55","typeString":"contract Vm"}},"id":389,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"memberName":"getNonce","nodeType":"MemberAccess","referencedDeclaration":17,"src":"3979:11:0","typeDescriptions":{"typeIdentifier":"t_function_external_view$_t_address_$returns$_t_uint64_$","typeString":"function (address) view external returns (uint64)"}},"id":394,"isConstant":false,"isLValue":false,"isPure":false,"kind":"functionCall","lValueRequested":false,"names":[],"nodeType":"FunctionCall","src":"3979:26:0","tryCall":false,"typeDescriptions":{"typeIdentifier":"t_uint64","typeString":"uint64"}}],"expression":{"argumentTypes":[{"typeIdentifier":"t_uint64","typeString":"uint64"}],"id":387,"isConstant":false,"isLValue":false,"isPure":true,"lValueRequested":false,"nodeType":"ElementaryTypeNameExpression","src":"3971:7:0","typeDescriptions":{"typeIdentifier":"t_type$_t_uint256_$","typeString":"type(uint256)"},"typeName":{"id":386,"name":"uint256","nodeType":"ElementaryTypeName","src":"3971:7:0","typeDescriptions":{}}},"id":395,"isConstant":false,"isLValue":false,"isPure":false,"kind":"typeConversion","lValueRequested":false,"names":[],"nodeType":"FunctionCall","src":"3971:35:0","tryCall":false,"typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}}],"expression":{"argumentTypes":[{"typeIdentifier":"t_stringliteral_71efc69b9a13b6bc1e9a14d766ff01c79022262c6daa6532fb5dfb14f8511a20","typeString":"literal_string \"nonce start\""},{"typeIdentifier":"t_uint256","typeString":"uint256"}],"expression":{"id":382,"name":"console","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":192,"src":"3944:7:0","typeDescriptions":{"typeIdentifier":"t_type$_t_contract$_console_$192_$","typeString":"type(library console)"}},"id":384,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"memberName":"log","nodeType":"MemberAccess","referencedDeclaration":154,"src":"3944:11:0","typeDescriptions":{"typeIdentifier":"t_function_internal_pure$_t_string_memory_ptr_$_t_uint256_$returns$__$","typeString":"function (string memory,uint256) pure"}},"id":396,"isConstant":false,"isLValue":false,"isPure":false,"kind":"functionCall","lValueRequested":false,"names":[],"nodeType":"FunctionCall","src":"3944:63:0","tryCall":false,"typeDescriptions":{"typeIdentifier":"t_tuple$__$","typeString":"tuple()"}},"id":397,"nodeType":"ExpressionStatement","src":"3944:63:0"},{"expression":{"arguments":[{"hexValue":"74657374696e672073696e676c65","id":401,"isConstant":false,"isLValue":false,"isPure":true,"kind":"string","lValueRequested":false,"nodeType":"Literal","src":"4030:16:0","typeDescriptions":{"typeIdentifier":"t_stringliteral_b75103528423218e7569082dad569ed0d2ce7c0ac770c0812b220e2d369fe474","typeString":"literal_string \"testing single\""},"value":"testing single"}],"expression":{"argumentTypes":[{"typeIdentifier":"t_stringliteral_b75103528423218e7569082dad569ed0d2ce7c0ac770c0812b220e2d369fe474","typeString":"literal_string \"testing single\""}],"expression":{"id":398,"name":"console","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":192,"src":"4018:7:0","typeDescriptions":{"typeIdentifier":"t_type$_t_contract$_console_$192_$","typeString":"type(library console)"}},"id":400,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"memberName":"log","nodeType":"MemberAccess","referencedDeclaration":120,"src":"4018:11:0","typeDescriptions":{"typeIdentifier":"t_function_internal_pure$_t_string_memory_ptr_$returns$__$","typeString":"function (string memory) pure"}},"id":402,"isConstant":false,"isLValue":false,"isPure":false,"kind":"functionCall","lValueRequested":false,"names":[],"nodeType":"FunctionCall","src":"4018:29:0","tryCall":false,"typeDescriptions":{"typeIdentifier":"t_tuple$__$","typeString":"tuple()"}},"id":403,"nodeType":"ExpressionStatement","src":"4018:29:0"},{"expression":{"arguments":[],"expression":{"argumentTypes":[],"expression":{"id":404,"name":"vm","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":213,"src":"4057:2:0","typeDescriptions":{"typeIdentifier":"t_contract$_Vm_$55","typeString":"contract Vm"}},"id":406,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"memberName":"broadcast","nodeType":"MemberAccess","referencedDeclaration":38,"src":"4057:12:0","typeDescriptions":{"typeIdentifier":"t_function_external_nonpayable$__$returns$__$","typeString":"function () external"}},"id":407,"isConstant":false,"isLValue":false,"isPure":false,"kind":"functionCall","lValueRequested":false,"names":[],"nodeType":"FunctionCall","src":"4057:14:0","tryCall":false,"typeDescriptions":{"typeIdentifier":"t_tuple$__$","typeString":"tuple()"}},"id":408,"nodeType":"ExpressionStatement","src":"4057:14:0"},{"expression":{"arguments":[{"hexValue":"73696e676c655f63616c6c31","id":412,"isConstant":false,"isLValue":false,"isPure":true,"kind":"string","lValueRequested":false,"nodeType":"Literal","src":"4092:14:0","typeDescriptions":{"typeIdentifier":"t_stringliteral_5e1cad6d7a968cfacf2731373e1248ffb11f4886bced66a02a6de1a67ac8f777","typeString":"literal_string \"single_call1\""},"value":"single_call1"}],"expression":{"argumentTypes":[{"typeIdentifier":"t_stringliteral_5e1cad6d7a968cfacf2731373e1248ffb11f4886bced66a02a6de1a67ac8f777","typeString":"literal_string \"single_call1\""}],"expression":{"id":409,"name":"this","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":-28,"src":"4081:4:0","typeDescriptions":{"typeIdentifier":"t_contract$_ScriptExample_$706","typeString":"contract ScriptExample"}},"id":411,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"memberName":"call1","nodeType":"MemberAccess","referencedDeclaration":648,"src":"4081:10:0","typeDescriptions":{"typeIdentifier":"t_function_external_nonpayable$_t_string_memory_ptr_$returns$__$","typeString":"function (string memory) external"}},"id":413,"isConstant":false,"isLValue":false,"isPure":false,"kind":"functionCall","lValueRequested":false,"names":[],"nodeType":"FunctionCall","src":"4081:26:0","tryCall":false,"typeDescriptions":{"typeIdentifier":"t_tuple$__$","typeString":"tuple()"}},"id":414,"nodeType":"ExpressionStatement","src":"4081:26:0"},{"expression":{"arguments":[{"hexValue":"73696e676c655f63616c6c32","id":418,"isConstant":false,"isLValue":false,"isPure":true,"kind":"string","lValueRequested":false,"nodeType":"Literal","src":"4128:14:0","typeDescriptions":{"typeIdentifier":"t_stringliteral_b37ddaf5d00ad9e6371de3fb71b91eef731fae1e86b768666380f7d44e1ada25","typeString":"literal_string \"single_call2\""},"value":"single_call2"}],"expression":{"argumentTypes":[{"typeIdentifier":"t_stringliteral_b37ddaf5d00ad9e6371de3fb71b91eef731fae1e86b768666380f7d44e1ada25","typeString":"literal_string \"single_call2\""}],"expression":{"id":415,"name":"this","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":-28,"src":"4117:4:0","typeDescriptions":{"typeIdentifier":"t_contract$_ScriptExample_$706","typeString":"contract ScriptExample"}},"id":417,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"memberName":"call2","nodeType":"MemberAccess","referencedDeclaration":663,"src":"4117:10:0","typeDescriptions":{"typeIdentifier":"t_function_external_nonpayable$_t_string_memory_ptr_$returns$__$","typeString":"function (string memory) external"}},"id":419,"isConstant":false,"isLValue":false,"isPure":false,"kind":"functionCall","lValueRequested":false,"names":[],"nodeType":"FunctionCall","src":"4117:26:0","tryCall":false,"typeDescriptions":{"typeIdentifier":"t_tuple$__$","typeString":"tuple()"}},"id":420,"nodeType":"ExpressionStatement","src":"4117:26:0"},{"expression":{"arguments":[{"hexValue":"74657374696e672073746172742f73746f70","id":424,"isConstant":false,"isLValue":false,"isPure":true,"kind":"string","lValueRequested":false,"nodeType":"Literal","src":"4166:20:0","typeDescriptions":{"typeIdentifier":"t_stringliteral_778e886e3a1c3c5096aca76228832105f3f9269f362effd0e8ce3737787cb784","typeString":"literal_string \"testing start/stop\""},"value":"testing start/stop"}],"expression":{"argumentTypes":[{"typeIdentifier":"t_stringliteral_778e886e3a1c3c5096aca76228832105f3f9269f362effd0e8ce3737787cb784","typeString":"literal_string \"testing start/stop\""}],"expression":{"id":421,"name":"console","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":192,"src":"4154:7:0","typeDescriptions":{"typeIdentifier":"t_type$_t_contract$_console_$192_$","typeString":"type(library console)"}},"id":423,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"memberName":"log","nodeType":"MemberAccess","referencedDeclaration":120,"src":"4154:11:0","typeDescriptions":{"typeIdentifier":"t_function_internal_pure$_t_string_memory_ptr_$returns$__$","typeString":"function (string memory) pure"}},"id":425,"isConstant":false,"isLValue":false,"isPure":false,"kind":"functionCall","lValueRequested":false,"names":[],"nodeType":"FunctionCall","src":"4154:33:0","tryCall":false,"typeDescriptions":{"typeIdentifier":"t_tuple$__$","typeString":"tuple()"}},"id":426,"nodeType":"ExpressionStatement","src":"4154:33:0"},{"expression":{"arguments":[{"arguments":[{"arguments":[{"hexValue":"3078633066666565","id":434,"isConstant":false,"isLValue":false,"isPure":true,"kind":"number","lValueRequested":false,"nodeType":"Literal","src":"4231:8:0","typeDescriptions":{"typeIdentifier":"t_rational_12648430_by_1","typeString":"int_const 12648430"},"value":"0xc0ffee"}],"expression":{"argumentTypes":[{"typeIdentifier":"t_rational_12648430_by_1","typeString":"int_const 12648430"}],"id":433,"isConstant":false,"isLValue":false,"isPure":true,"lValueRequested":false,"nodeType":"ElementaryTypeNameExpression","src":"4223:7:0","typeDescriptions":{"typeIdentifier":"t_type$_t_uint160_$","typeString":"type(uint160)"},"typeName":{"id":432,"name":"uint160","nodeType":"ElementaryTypeName","src":"4223:7:0","typeDescriptions":{}}},"id":435,"isConstant":false,"isLValue":false,"isPure":true,"kind":"typeConversion","lValueRequested":false,"names":[],"nodeType":"FunctionCall","src":"4223:17:0","tryCall":false,"typeDescriptions":{"typeIdentifier":"t_uint160","typeString":"uint160"}}],"expression":{"argumentTypes":[{"typeIdentifier":"t_uint160","typeString":"uint160"}],"id":431,"isConstant":false,"isLValue":false,"isPure":true,"lValueRequested":false,"nodeType":"ElementaryTypeNameExpression","src":"4215:7:0","typeDescriptions":{"typeIdentifier":"t_type$_t_address_$","typeString":"type(address)"},"typeName":{"id":430,"name":"address","nodeType":"ElementaryTypeName","src":"4215:7:0","typeDescriptions":{}}},"id":436,"isConstant":false,"isLValue":false,"isPure":true,"kind":"typeConversion","lValueRequested":false,"names":[],"nodeType":"FunctionCall","src":"4215:26:0","tryCall":false,"typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"}}],"expression":{"argumentTypes":[{"typeIdentifier":"t_address","typeString":"address"}],"expression":{"id":427,"name":"vm","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":213,"src":"4197:2:0","typeDescriptions":{"typeIdentifier":"t_contract$_Vm_$55","typeString":"contract Vm"}},"id":429,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"memberName":"startBroadcast","nodeType":"MemberAccess","referencedDeclaration":48,"src":"4197:17:0","typeDescriptions":{"typeIdentifier":"t_function_external_nonpayable$_t_address_$returns$__$","typeString":"function (address) external"}},"id":437,"isConstant":false,"isLValue":false,"isPure":false,"kind":"functionCall","lValueRequested":false,"names":[],"nodeType":"FunctionCall","src":"4197:45:0","tryCall":false,"typeDescriptions":{"typeIdentifier":"t_tuple$__$","typeString":"tuple()"}},"id":438,"nodeType":"ExpressionStatement","src":"4197:45:0"},{"expression":{"arguments":[{"hexValue":"737461727473746f705f63616c6c31","id":442,"isConstant":false,"isLValue":false,"isPure":true,"kind":"string","lValueRequested":false,"nodeType":"Literal","src":"4263:17:0","typeDescriptions":{"typeIdentifier":"t_stringliteral_2fc2682edf10ed478ee3b9a190f6b1c88bb492b300935ce44545a1613cf8f041","typeString":"literal_string \"startstop_call1\""},"value":"startstop_call1"}],"expression":{"argumentTypes":[{"typeIdentifier":"t_stringliteral_2fc2682edf10ed478ee3b9a190f6b1c88bb492b300935ce44545a1613cf8f041","typeString":"literal_string \"startstop_call1\""}],"expression":{"id":439,"name":"this","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":-28,"src":"4252:4:0","typeDescriptions":{"typeIdentifier":"t_contract$_ScriptExample_$706","typeString":"contract ScriptExample"}},"id":441,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"memberName":"call1","nodeType":"MemberAccess","referencedDeclaration":648,"src":"4252:10:0","typeDescriptions":{"typeIdentifier":"t_function_external_nonpayable$_t_string_memory_ptr_$returns$__$","typeString":"function (string memory) external"}},"id":443,"isConstant":false,"isLValue":false,"isPure":false,"kind":"functionCall","lValueRequested":false,"names":[],"nodeType":"FunctionCall","src":"4252:29:0","tryCall":false,"typeDescriptions":{"typeIdentifier":"t_tuple$__$","typeString":"tuple()"}},"id":444,"nodeType":"ExpressionStatement","src":"4252:29:0"},{"expression":{"arguments":[{"hexValue":"737461727473746f705f63616c6c32","id":448,"isConstant":false,"isLValue":false,"isPure":true,"kind":"string","lValueRequested":false,"nodeType":"Literal","src":"4302:17:0","typeDescriptions":{"typeIdentifier":"t_stringliteral_1a6fd77f04b28bf45d6d0e2dd4c65c0bbfeba174f849e43bb67ebca1c019cda4","typeString":"literal_string \"startstop_call2\""},"value":"startstop_call2"}],"expression":{"argumentTypes":[{"typeIdentifier":"t_stringliteral_1a6fd77f04b28bf45d6d0e2dd4c65c0bbfeba174f849e43bb67ebca1c019cda4","typeString":"literal_string \"startstop_call2\""}],"expression":{"id":445,"name":"this","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":-28,"src":"4291:4:0","typeDescriptions":{"typeIdentifier":"t_contract$_ScriptExample_$706","typeString":"contract ScriptExample"}},"id":447,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"memberName":"call2","nodeType":"MemberAccess","referencedDeclaration":663,"src":"4291:10:0","typeDescriptions":{"typeIdentifier":"t_function_external_nonpayable$_t_string_memory_ptr_$returns$__$","typeString":"function (string memory) external"}},"id":449,"isConstant":false,"isLValue":false,"isPure":false,"kind":"functionCall","lValueRequested":false,"names":[],"nodeType":"FunctionCall","src":"4291:29:0","tryCall":false,"typeDescriptions":{"typeIdentifier":"t_tuple$__$","typeString":"tuple()"}},"id":450,"nodeType":"ExpressionStatement","src":"4291:29:0"},{"expression":{"arguments":[{"hexValue":"737461727473746f705f70757265","id":454,"isConstant":false,"isLValue":false,"isPure":true,"kind":"string","lValueRequested":false,"nodeType":"Literal","src":"4344:16:0","typeDescriptions":{"typeIdentifier":"t_stringliteral_b6e9eb1efd186b1d92b54da45026aa97a178e6eaffdf9dbf9f666fc751fb0ff9","typeString":"literal_string \"startstop_pure\""},"value":"startstop_pure"}],"expression":{"argumentTypes":[{"typeIdentifier":"t_stringliteral_b6e9eb1efd186b1d92b54da45026aa97a178e6eaffdf9dbf9f666fc751fb0ff9","typeString":"literal_string \"startstop_pure\""}],"expression":{"id":451,"name":"this","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":-28,"src":"4330:4:0","typeDescriptions":{"typeIdentifier":"t_contract$_ScriptExample_$706","typeString":"contract ScriptExample"}},"id":453,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"memberName":"callPure","nodeType":"MemberAccess","referencedDeclaration":705,"src":"4330:13:0","typeDescriptions":{"typeIdentifier":"t_function_external_pure$_t_string_memory_ptr_$returns$__$","typeString":"function (string memory) pure external"}},"id":455,"isConstant":false,"isLValue":false,"isPure":false,"kind":"functionCall","lValueRequested":false,"names":[],"nodeType":"FunctionCall","src":"4330:31:0","tryCall":false,"typeDescriptions":{"typeIdentifier":"t_tuple$__$","typeString":"tuple()"}},"id":456,"nodeType":"ExpressionStatement","src":"4330:31:0"},{"expression":{"arguments":[],"expression":{"argumentTypes":[],"expression":{"id":457,"name":"vm","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":213,"src":"4371:2:0","typeDescriptions":{"typeIdentifier":"t_contract$_Vm_$55","typeString":"contract Vm"}},"id":459,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"memberName":"stopBroadcast","nodeType":"MemberAccess","referencedDeclaration":54,"src":"4371:16:0","typeDescriptions":{"typeIdentifier":"t_function_external_nonpayable$__$returns$__$","typeString":"function () external"}},"id":460,"isConstant":false,"isLValue":false,"isPure":false,"kind":"functionCall","lValueRequested":false,"names":[],"nodeType":"FunctionCall","src":"4371:18:0","tryCall":false,"typeDescriptions":{"typeIdentifier":"t_tuple$__$","typeString":"tuple()"}},"id":461,"nodeType":"ExpressionStatement","src":"4371:18:0"},{"expression":{"arguments":[{"hexValue":"737461727473746f705f63616c6c33","id":465,"isConstant":false,"isLValue":false,"isPure":true,"kind":"string","lValueRequested":false,"nodeType":"Literal","src":"4410:17:0","typeDescriptions":{"typeIdentifier":"t_stringliteral_8eb502bfdc4adda22bd960aa2ae13ce4c0ed8cc3b3791ed65e321a38cdd36f72","typeString":"literal_string \"startstop_call3\""},"value":"startstop_call3"}],"expression":{"argumentTypes":[{"typeIdentifier":"t_stringliteral_8eb502bfdc4adda22bd960aa2ae13ce4c0ed8cc3b3791ed65e321a38cdd36f72","typeString":"literal_string \"startstop_call3\""}],"expression":{"id":462,"name":"this","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":-28,"src":"4399:4:0","typeDescriptions":{"typeIdentifier":"t_contract$_ScriptExample_$706","typeString":"contract ScriptExample"}},"id":464,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"memberName":"call1","nodeType":"MemberAccess","referencedDeclaration":648,"src":"4399:10:0","typeDescriptions":{"typeIdentifier":"t_function_external_nonpayable$_t_string_memory_ptr_$returns$__$","typeString":"function (string memory) external"}},"id":466,"isConstant":false,"isLValue":false,"isPure":false,"kind":"functionCall","lValueRequested":false,"names":[],"nodeType":"FunctionCall","src":"4399:29:0","tryCall":false,"typeDescriptions":{"typeIdentifier":"t_tuple$__$","typeString":"tuple()"}},"id":467,"nodeType":"ExpressionStatement","src":"4399:29:0"},{"expression":{"arguments":[{"hexValue":"74657374696e67206e6573746564","id":471,"isConstant":false,"isLValue":false,"isPure":true,"kind":"string","lValueRequested":false,"nodeType":"Literal","src":"4451:16:0","typeDescriptions":{"typeIdentifier":"t_stringliteral_f92f19f7a5b5b9ce341188bf4e15925f184cdb5ac135c4846ced718f259dbde5","typeString":"literal_string \"testing nested\""},"value":"testing nested"}],"expression":{"argumentTypes":[{"typeIdentifier":"t_stringliteral_f92f19f7a5b5b9ce341188bf4e15925f184cdb5ac135c4846ced718f259dbde5","typeString":"literal_string \"testing nested\""}],"expression":{"id":468,"name":"console","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":192,"src":"4439:7:0","typeDescriptions":{"typeIdentifier":"t_type$_t_contract$_console_$192_$","typeString":"type(library console)"}},"id":470,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"memberName":"log","nodeType":"MemberAccess","referencedDeclaration":120,"src":"4439:11:0","typeDescriptions":{"typeIdentifier":"t_function_internal_pure$_t_string_memory_ptr_$returns$__$","typeString":"function (string memory) pure"}},"id":472,"isConstant":false,"isLValue":false,"isPure":false,"kind":"functionCall","lValueRequested":false,"names":[],"nodeType":"FunctionCall","src":"4439:29:0","tryCall":false,"typeDescriptions":{"typeIdentifier":"t_tuple$__$","typeString":"tuple()"}},"id":473,"nodeType":"ExpressionStatement","src":"4439:29:0"},{"expression":{"arguments":[{"arguments":[{"arguments":[{"hexValue":"307831323334","id":481,"isConstant":false,"isLValue":false,"isPure":true,"kind":"number","lValueRequested":false,"nodeType":"Literal","src":"4512:6:0","typeDescriptions":{"typeIdentifier":"t_rational_4660_by_1","typeString":"int_const 4660"},"value":"0x1234"}],"expression":{"argumentTypes":[{"typeIdentifier":"t_rational_4660_by_1","typeString":"int_const 4660"}],"id":480,"isConstant":false,"isLValue":false,"isPure":true,"lValueRequested":false,"nodeType":"ElementaryTypeNameExpression","src":"4504:7:0","typeDescriptions":{"typeIdentifier":"t_type$_t_uint160_$","typeString":"type(uint160)"},"typeName":{"id":479,"name":"uint160","nodeType":"ElementaryTypeName","src":"4504:7:0","typeDescriptions":{}}},"id":482,"isConstant":false,"isLValue":false,"isPure":true,"kind":"typeConversion","lValueRequested":false,"names":[],"nodeType":"FunctionCall","src":"4504:15:0","tryCall":false,"typeDescriptions":{"typeIdentifier":"t_uint160","typeString":"uint160"}}],"expression":{"argumentTypes":[{"typeIdentifier":"t_uint160","typeString":"uint160"}],"id":478,"isConstant":false,"isLValue":false,"isPure":true,"lValueRequested":false,"nodeType":"ElementaryTypeNameExpression","src":"4496:7:0","typeDescriptions":{"typeIdentifier":"t_type$_t_address_$","typeString":"type(address)"},"typeName":{"id":477,"name":"address","nodeType":"ElementaryTypeName","src":"4496:7:0","typeDescriptions":{}}},"id":483,"isConstant":false,"isLValue":false,"isPure":true,"kind":"typeConversion","lValueRequested":false,"names":[],"nodeType":"FunctionCall","src":"4496:24:0","tryCall":false,"typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"}}],"expression":{"argumentTypes":[{"typeIdentifier":"t_address","typeString":"address"}],"expression":{"id":474,"name":"vm","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":213,"src":"4478:2:0","typeDescriptions":{"typeIdentifier":"t_contract$_Vm_$55","typeString":"contract Vm"}},"id":476,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"memberName":"startBroadcast","nodeType":"MemberAccess","referencedDeclaration":48,"src":"4478:17:0","typeDescriptions":{"typeIdentifier":"t_function_external_nonpayable$_t_address_$returns$__$","typeString":"function (address) external"}},"id":484,"isConstant":false,"isLValue":false,"isPure":false,"kind":"functionCall","lValueRequested":false,"names":[],"nodeType":"FunctionCall","src":"4478:43:0","tryCall":false,"typeDescriptions":{"typeIdentifier":"t_tuple$__$","typeString":"tuple()"}},"id":485,"nodeType":"ExpressionStatement","src":"4478:43:0"},{"expression":{"arguments":[{"hexValue":"6e6573746564","id":489,"isConstant":false,"isLValue":false,"isPure":true,"kind":"string","lValueRequested":false,"nodeType":"Literal","src":"4544:8:0","typeDescriptions":{"typeIdentifier":"t_stringliteral_4d5b14044d78fbf0c9dd8b9c49e35f09ee5a6f5b1b3b8117b5d0e15c8dd2cb09","typeString":"literal_string \"nested\""},"value":"nested"}],"expression":{"argumentTypes":[{"typeIdentifier":"t_stringliteral_4d5b14044d78fbf0c9dd8b9c49e35f09ee5a6f5b1b3b8117b5d0e15c8dd2cb09","typeString":"literal_string \"nested\""}],"expression":{"id":486,"name":"this","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":-28,"src":"4531:4:0","typeDescriptions":{"typeIdentifier":"t_contract$_ScriptExample_$706","typeString":"contract ScriptExample"}},"id":488,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"memberName":"nested1","nodeType":"MemberAccess","referencedDeclaration":678,"src":"4531:12:0","typeDescriptions":{"typeIdentifier":"t_function_external_nonpayable$_t_string_memory_ptr_$returns$__$","typeString":"function (string memory) external"}},"id":490,"isConstant":false,"isLValue":false,"isPure":false,"kind":"functionCall","lValueRequested":false,"names":[],"nodeType":"FunctionCall","src":"4531:22:0","tryCall":false,"typeDescriptions":{"typeIdentifier":"t_tuple$__$","typeString":"tuple()"}},"id":491,"nodeType":"ExpressionStatement","src":"4531:22:0"},{"expression":{"arguments":[],"expression":{"argumentTypes":[],"expression":{"id":492,"name":"vm","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":213,"src":"4563:2:0","typeDescriptions":{"typeIdentifier":"t_contract$_Vm_$55","typeString":"contract Vm"}},"id":494,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"memberName":"stopBroadcast","nodeType":"MemberAccess","referencedDeclaration":54,"src":"4563:16:0","typeDescriptions":{"typeIdentifier":"t_function_external_nonpayable$__$returns$__$","typeString":"function () external"}},"id":495,"isConstant":false,"isLValue":false,"isPure":false,"kind":"functionCall","lValueRequested":false,"names":[],"nodeType":"FunctionCall","src":"4563:18:0","tryCall":false,"typeDescriptions":{"typeIdentifier":"t_tuple$__$","typeString":"tuple()"}},"id":496,"nodeType":"ExpressionStatement","src":"4563:18:0"},{"expression":{"arguments":[{"hexValue":"636f6e7472616374206465706c6f796d656e74","id":500,"isConstant":false,"isLValue":false,"isPure":true,"kind":"string","lValueRequested":false,"nodeType":"Literal","src":"4604:21:0","typeDescriptions":{"typeIdentifier":"t_stringliteral_aaf9be86adf9b6872d87eed3526f7c55f3c5d61f4e4dd6d55ef2fcbb8ad0bd57","typeString":"literal_string \"contract deployment\""},"value":"contract deployment"}],"expression":{"argumentTypes":[{"typeIdentifier":"t_stringliteral_aaf9be86adf9b6872d87eed3526f7c55f3c5d61f4e4dd6d55ef2fcbb8ad0bd57","typeString":"literal_string \"contract deployment\""}],"expression":{"id":497,"name":"console","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":192,"src":"4592:7:0","typeDescriptions":{"typeIdentifier":"t_type$_t_contract$_console_$192_$","typeString":"type(library console)"}},"id":499,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"memberName":"log","nodeType":"MemberAccess","referencedDeclaration":120,"src":"4592:11:0","typeDescriptions":{"typeIdentifier":"t_function_internal_pure$_t_string_memory_ptr_$returns$__$","typeString":"function (string memory) pure"}},"id":501,"isConstant":false,"isLValue":false,"isPure":false,"kind":"functionCall","lValueRequested":false,"names":[],"nodeType":"FunctionCall","src":"4592:34:0","tryCall":false,"typeDescriptions":{"typeIdentifier":"t_tuple$__$","typeString":"tuple()"}},"id":502,"nodeType":"ExpressionStatement","src":"4592:34:0"},{"expression":{"arguments":[{"arguments":[{"arguments":[{"hexValue":"3078313233343536","id":510,"isConstant":false,"isLValue":false,"isPure":true,"kind":"number","lValueRequested":false,"nodeType":"Literal","src":"4665:8:0","typeDescriptions":{"typeIdentifier":"t_rational_1193046_by_1","typeString":"int_const 1193046"},"value":"0x123456"}],"expression":{"argumentTypes":[{"typeIdentifier":"t_rational_1193046_by_1","typeString":"int_const 1193046"}],"id":509,"isConstant":false,"isLValue":false,"isPure":true,"lValueRequested":false,"nodeType":"ElementaryTypeNameExpression","src":"4657:7:0","typeDescriptions":{"typeIdentifier":"t_type$_t_uint160_$","typeString":"type(uint160)"},"typeName":{"id":508,"name":"uint160","nodeType":"ElementaryTypeName","src":"4657:7:0","typeDescriptions":{}}},"id":511,"isConstant":false,"isLValue":false,"isPure":true,"kind":"typeConversion","lValueRequested":false,"names":[],"nodeType":"FunctionCall","src":"4657:17:0","tryCall":false,"typeDescriptions":{"typeIdentifier":"t_uint160","typeString":"uint160"}}],"expression":{"argumentTypes":[{"typeIdentifier":"t_uint160","typeString":"uint160"}],"id":507,"isConstant":false,"isLValue":false,"isPure":true,"lValueRequested":false,"nodeType":"ElementaryTypeNameExpression","src":"4649:7:0","typeDescriptions":{"typeIdentifier":"t_type$_t_address_$","typeString":"type(address)"},"typeName":{"id":506,"name":"address","nodeType":"ElementaryTypeName","src":"4649:7:0","typeDescriptions":{}}},"id":512,"isConstant":false,"isLValue":false,"isPure":true,"kind":"typeConversion","lValueRequested":false,"names":[],"nodeType":"FunctionCall","src":"4649:26:0","tryCall":false,"typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"}}],"expression":{"argumentTypes":[{"typeIdentifier":"t_address","typeString":"address"}],"expression":{"id":503,"name":"vm","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":213,"src":"4636:2:0","typeDescriptions":{"typeIdentifier":"t_contract$_Vm_$55","typeString":"contract Vm"}},"id":505,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"memberName":"broadcast","nodeType":"MemberAccess","referencedDeclaration":43,"src":"4636:12:0","typeDescriptions":{"typeIdentifier":"t_function_external_nonpayable$_t_address_$returns$__$","typeString":"function (address) external"}},"id":513,"isConstant":false,"isLValue":false,"isPure":false,"kind":"functionCall","lValueRequested":false,"names":[],"nodeType":"FunctionCall","src":"4636:40:0","tryCall":false,"typeDescriptions":{"typeIdentifier":"t_tuple$__$","typeString":"tuple()"}},"id":514,"nodeType":"ExpressionStatement","src":"4636:40:0"},{"assignments":[517],"declarations":[{"constant":false,"id":517,"mutability":"mutable","name":"x","nameLocation":"4693:1:0","nodeType":"VariableDeclaration","scope":608,"src":"4686:8:0","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_contract$_FooBar_$719","typeString":"contract FooBar"},"typeName":{"id":516,"nodeType":"UserDefinedTypeName","pathNode":{"id":515,"name":"FooBar","nodeType":"IdentifierPath","referencedDeclaration":719,"src":"4686:6:0"},"referencedDeclaration":719,"src":"4686:6:0","typeDescriptions":{"typeIdentifier":"t_contract$_FooBar_$719","typeString":"contract FooBar"}},"visibility":"internal"}],"id":523,"initialValue":{"arguments":[{"hexValue":"31323334","id":521,"isConstant":false,"isLValue":false,"isPure":true,"kind":"number","lValueRequested":false,"nodeType":"Literal","src":"4708:4:0","typeDescriptions":{"typeIdentifier":"t_rational_1234_by_1","typeString":"int_const 1234"},"value":"1234"}],"expression":{"argumentTypes":[{"typeIdentifier":"t_rational_1234_by_1","typeString":"int_const 1234"}],"id":520,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"nodeType":"NewExpression","src":"4697:10:0","typeDescriptions":{"typeIdentifier":"t_function_creation_nonpayable$_t_uint256_$returns$_t_contract$_FooBar_$719_$","typeString":"function (uint256) returns (contract FooBar)"},"typeName":{"id":519,"nodeType":"UserDefinedTypeName","pathNode":{"id":518,"name":"FooBar","nodeType":"IdentifierPath","referencedDeclaration":719,"src":"4701:6:0"},"referencedDeclaration":719,"src":"4701:6:0","typeDescriptions":{"typeIdentifier":"t_contract$_FooBar_$719","typeString":"contract FooBar"}}},"id":522,"isConstant":false,"isLValue":false,"isPure":false,"kind":"functionCall","lValueRequested":false,"names":[],"nodeType":"FunctionCall","src":"4697:16:0","tryCall":false,"typeDescriptions":{"typeIdentifier":"t_contract$_FooBar_$719","typeString":"contract FooBar"}},"nodeType":"VariableDeclarationStatement","src":"4686:27:0"},{"expression":{"arguments":[{"commonType":{"typeIdentifier":"t_uint256","typeString":"uint256"},"id":529,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"leftExpression":{"arguments":[],"expression":{"argumentTypes":[],"expression":{"id":525,"name":"x","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":517,"src":"4731:1:0","typeDescriptions":{"typeIdentifier":"t_contract$_FooBar_$719","typeString":"contract FooBar"}},"id":526,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"memberName":"foo","nodeType":"MemberAccess","referencedDeclaration":708,"src":"4731:5:0","typeDescriptions":{"typeIdentifier":"t_function_external_view$__$returns$_t_uint256_$","typeString":"function () view external returns (uint256)"}},"id":527,"isConstant":false,"isLValue":false,"isPure":false,"kind":"functionCall","lValueRequested":false,"names":[],"nodeType":"FunctionCall","src":"4731:7:0","tryCall":false,"typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"nodeType":"BinaryOperation","operator":"==","rightExpression":{"hexValue":"31323334","id":528,"isConstant":false,"isLValue":false,"isPure":true,"kind":"number","lValueRequested":false,"nodeType":"Literal","src":"4742:4:0","typeDescriptions":{"typeIdentifier":"t_rational_1234_by_1","typeString":"int_const 1234"},"value":"1234"},"src":"4731:15:0","typeDescriptions":{"typeIdentifier":"t_bool","typeString":"bool"}}],"expression":{"argumentTypes":[{"typeIdentifier":"t_bool","typeString":"bool"}],"id":524,"name":"require","nodeType":"Identifier","overloadedDeclarations":[-18,-18],"referencedDeclaration":-18,"src":"4723:7:0","typeDescriptions":{"typeIdentifier":"t_function_require_pure$_t_bool_$returns$__$","typeString":"function (bool) pure"}},"id":530,"isConstant":false,"isLValue":false,"isPure":false,"kind":"functionCall","lValueRequested":false,"names":[],"nodeType":"FunctionCall","src":"4723:24:0","tryCall":false,"typeDescriptions":{"typeIdentifier":"t_tuple$__$","typeString":"tuple()"}},"id":531,"nodeType":"ExpressionStatement","src":"4723:24:0"},{"expression":{"arguments":[{"hexValue":"6372656174652032","id":535,"isConstant":false,"isLValue":false,"isPure":true,"kind":"string","lValueRequested":false,"nodeType":"Literal","src":"4770:10:0","typeDescriptions":{"typeIdentifier":"t_stringliteral_4411d6d4ffcd00382a95255a63761e69de9810e1236042a5c64948a7b6c04daa","typeString":"literal_string \"create 2\""},"value":"create 2"}],"expression":{"argumentTypes":[{"typeIdentifier":"t_stringliteral_4411d6d4ffcd00382a95255a63761e69de9810e1236042a5c64948a7b6c04daa","typeString":"literal_string \"create 2\""}],"expression":{"id":532,"name":"console","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":192,"src":"4758:7:0","typeDescriptions":{"typeIdentifier":"t_type$_t_contract$_console_$192_$","typeString":"type(library console)"}},"id":534,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"memberName":"log","nodeType":"MemberAccess","referencedDeclaration":120,"src":"4758:11:0","typeDescriptions":{"typeIdentifier":"t_function_internal_pure$_t_string_memory_ptr_$returns$__$","typeString":"function (string memory) pure"}},"id":536,"isConstant":false,"isLValue":false,"isPure":false,"kind":"functionCall","lValueRequested":false,"names":[],"nodeType":"FunctionCall","src":"4758:23:0","tryCall":false,"typeDescriptions":{"typeIdentifier":"t_tuple$__$","typeString":"tuple()"}},"id":537,"nodeType":"ExpressionStatement","src":"4758:23:0"},{"expression":{"arguments":[{"arguments":[{"arguments":[{"hexValue":"307863616665","id":545,"isConstant":false,"isLValue":false,"isPure":true,"kind":"number","lValueRequested":false,"nodeType":"Literal","src":"4820:6:0","typeDescriptions":{"typeIdentifier":"t_rational_51966_by_1","typeString":"int_const 51966"},"value":"0xcafe"}],"expression":{"argumentTypes":[{"typeIdentifier":"t_rational_51966_by_1","typeString":"int_const 51966"}],"id":544,"isConstant":false,"isLValue":false,"isPure":true,"lValueRequested":false,"nodeType":"ElementaryTypeNameExpression","src":"4812:7:0","typeDescriptions":{"typeIdentifier":"t_type$_t_uint160_$","typeString":"type(uint160)"},"typeName":{"id":543,"name":"uint160","nodeType":"ElementaryTypeName","src":"4812:7:0","typeDescriptions":{}}},"id":546,"isConstant":false,"isLValue":false,"isPure":true,"kind":"typeConversion","lValueRequested":false,"names":[],"nodeType":"FunctionCall","src":"4812:15:0","tryCall":false,"typeDescriptions":{"typeIdentifier":"t_uint160","typeString":"uint160"}}],"expression":{"argumentTypes":[{"typeIdentifier":"t_uint160","typeString":"uint160"}],"id":542,"isConstant":false,"isLValue":false,"isPure":true,"lValueRequested":false,"nodeType":"ElementaryTypeNameExpression","src":"4804:7:0","typeDescriptions":{"typeIdentifier":"t_type$_t_address_$","typeString":"type(address)"},"typeName":{"id":541,"name":"address","nodeType":"ElementaryTypeName","src":"4804:7:0","typeDescriptions":{}}},"id":547,"isConstant":false,"isLValue":false,"isPure":true,"kind":"typeConversion","lValueRequested":false,"names":[],"nodeType":"FunctionCall","src":"4804:24:0","tryCall":false,"typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"}}],"expression":{"argumentTypes":[{"typeIdentifier":"t_address","typeString":"address"}],"expression":{"id":538,"name":"vm","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":213,"src":"4791:2:0","typeDescriptions":{"typeIdentifier":"t_contract$_Vm_$55","typeString":"contract Vm"}},"id":540,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"memberName":"broadcast","nodeType":"MemberAccess","referencedDeclaration":43,"src":"4791:12:0","typeDescriptions":{"typeIdentifier":"t_function_external_nonpayable$_t_address_$returns$__$","typeString":"function (address) external"}},"id":548,"isConstant":false,"isLValue":false,"isPure":false,"kind":"functionCall","lValueRequested":false,"names":[],"nodeType":"FunctionCall","src":"4791:38:0","tryCall":false,"typeDescriptions":{"typeIdentifier":"t_tuple$__$","typeString":"tuple()"}},"id":549,"nodeType":"ExpressionStatement","src":"4791:38:0"},{"assignments":[552],"declarations":[{"constant":false,"id":552,"mutability":"mutable","name":"y","nameLocation":"4846:1:0","nodeType":"VariableDeclaration","scope":608,"src":"4839:8:0","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_contract$_FooBar_$719","typeString":"contract FooBar"},"typeName":{"id":551,"nodeType":"UserDefinedTypeName","pathNode":{"id":550,"name":"FooBar","nodeType":"IdentifierPath","referencedDeclaration":719,"src":"4839:6:0"},"referencedDeclaration":719,"src":"4839:6:0","typeDescriptions":{"typeIdentifier":"t_contract$_FooBar_$719","typeString":"contract FooBar"}},"visibility":"internal"}],"id":566,"initialValue":{"arguments":[{"hexValue":"31323334","id":564,"isConstant":false,"isLValue":false,"isPure":true,"kind":"number","lValueRequested":false,"nodeType":"Literal","src":"4889:4:0","typeDescriptions":{"typeIdentifier":"t_rational_1234_by_1","typeString":"int_const 1234"},"value":"1234"}],"expression":{"argumentTypes":[{"typeIdentifier":"t_rational_1234_by_1","typeString":"int_const 1234"}],"expression":{"argumentTypes":[{"typeIdentifier":"t_rational_1234_by_1","typeString":"int_const 1234"}],"id":555,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"nodeType":"NewExpression","src":"4850:10:0","typeDescriptions":{"typeIdentifier":"t_function_creation_nonpayable$_t_uint256_$returns$_t_contract$_FooBar_$719_$","typeString":"function (uint256) returns (contract FooBar)"},"typeName":{"id":554,"nodeType":"UserDefinedTypeName","pathNode":{"id":553,"name":"FooBar","nodeType":"IdentifierPath","referencedDeclaration":719,"src":"4854:6:0"},"referencedDeclaration":719,"src":"4854:6:0","typeDescriptions":{"typeIdentifier":"t_contract$_FooBar_$719","typeString":"contract FooBar"}}},"id":563,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"names":["salt"],"nodeType":"FunctionCallOptions","options":[{"arguments":[{"arguments":[{"hexValue":"3432","id":560,"isConstant":false,"isLValue":false,"isPure":true,"kind":"number","lValueRequested":false,"nodeType":"Literal","src":"4883:2:0","typeDescriptions":{"typeIdentifier":"t_rational_42_by_1","typeString":"int_const 42"},"value":"42"}],"expression":{"argumentTypes":[{"typeIdentifier":"t_rational_42_by_1","typeString":"int_const 42"}],"id":559,"isConstant":false,"isLValue":false,"isPure":true,"lValueRequested":false,"nodeType":"ElementaryTypeNameExpression","src":"4875:7:0","typeDescriptions":{"typeIdentifier":"t_type$_t_uint256_$","typeString":"type(uint256)"},"typeName":{"id":558,"name":"uint256","nodeType":"ElementaryTypeName","src":"4875:7:0","typeDescriptions":{}}},"id":561,"isConstant":false,"isLValue":false,"isPure":true,"kind":"typeConversion","lValueRequested":false,"names":[],"nodeType":"FunctionCall","src":"4875:11:0","tryCall":false,"typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}}],"expression":{"argumentTypes":[{"typeIdentifier":"t_uint256","typeString":"uint256"}],"id":557,"isConstant":false,"isLValue":false,"isPure":true,"lValueRequested":false,"nodeType":"ElementaryTypeNameExpression","src":"4867:7:0","typeDescriptions":{"typeIdentifier":"t_type$_t_bytes32_$","typeString":"type(bytes32)"},"typeName":{"id":556,"name":"bytes32","nodeType":"ElementaryTypeName","src":"4867:7:0","typeDescriptions":{}}},"id":562,"isConstant":false,"isLValue":false,"isPure":true,"kind":"typeConversion","lValueRequested":false,"names":[],"nodeType":"FunctionCall","src":"4867:20:0","tryCall":false,"typeDescriptions":{"typeIdentifier":"t_bytes32","typeString":"bytes32"}}],"src":"4850:38:0","typeDescriptions":{"typeIdentifier":"t_function_creation_nonpayable$_t_uint256_$returns$_t_contract$_FooBar_$719_$salt","typeString":"function (uint256) returns (contract FooBar)"}},"id":565,"isConstant":false,"isLValue":false,"isPure":false,"kind":"functionCall","lValueRequested":false,"names":[],"nodeType":"FunctionCall","src":"4850:44:0","tryCall":false,"typeDescriptions":{"typeIdentifier":"t_contract$_FooBar_$719","typeString":"contract FooBar"}},"nodeType":"VariableDeclarationStatement","src":"4839:55:0"},{"expression":{"arguments":[{"commonType":{"typeIdentifier":"t_uint256","typeString":"uint256"},"id":572,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"leftExpression":{"arguments":[],"expression":{"argumentTypes":[],"expression":{"id":568,"name":"y","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":552,"src":"4912:1:0","typeDescriptions":{"typeIdentifier":"t_contract$_FooBar_$719","typeString":"contract FooBar"}},"id":569,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"memberName":"foo","nodeType":"MemberAccess","referencedDeclaration":708,"src":"4912:5:0","typeDescriptions":{"typeIdentifier":"t_function_external_view$__$returns$_t_uint256_$","typeString":"function () view external returns (uint256)"}},"id":570,"isConstant":false,"isLValue":false,"isPure":false,"kind":"functionCall","lValueRequested":false,"names":[],"nodeType":"FunctionCall","src":"4912:7:0","tryCall":false,"typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"nodeType":"BinaryOperation","operator":"==","rightExpression":{"hexValue":"31323334","id":571,"isConstant":false,"isLValue":false,"isPure":true,"kind":"number","lValueRequested":false,"nodeType":"Literal","src":"4923:4:0","typeDescriptions":{"typeIdentifier":"t_rational_1234_by_1","typeString":"int_const 1234"},"value":"1234"},"src":"4912:15:0","typeDescriptions":{"typeIdentifier":"t_bool","typeString":"bool"}}],"expression":{"argumentTypes":[{"typeIdentifier":"t_bool","typeString":"bool"}],"id":567,"name":"require","nodeType":"Identifier","overloadedDeclarations":[-18,-18],"referencedDeclaration":-18,"src":"4904:7:0","typeDescriptions":{"typeIdentifier":"t_function_require_pure$_t_bool_$returns$__$","typeString":"function (bool) pure"}},"id":573,"isConstant":false,"isLValue":false,"isPure":false,"kind":"functionCall","lValueRequested":false,"names":[],"nodeType":"FunctionCall","src":"4904:24:0","tryCall":false,"typeDescriptions":{"typeIdentifier":"t_tuple$__$","typeString":"tuple()"}},"id":574,"nodeType":"ExpressionStatement","src":"4904:24:0"},{"expression":{"arguments":[{"hexValue":"646f6e6521","id":578,"isConstant":false,"isLValue":false,"isPure":true,"kind":"string","lValueRequested":false,"nodeType":"Literal","src":"4950:7:0","typeDescriptions":{"typeIdentifier":"t_stringliteral_080382d5c9e9e7c5e3d1d33f5e7422740375955180fadff167d8130e0c35f3fc","typeString":"literal_string \"done!\""},"value":"done!"}],"expression":{"argumentTypes":[{"typeIdentifier":"t_stringliteral_080382d5c9e9e7c5e3d1d33f5e7422740375955180fadff167d8130e0c35f3fc","typeString":"literal_string \"done!\""}],"expression":{"id":575,"name":"console","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":192,"src":"4938:7:0","typeDescriptions":{"typeIdentifier":"t_type$_t_contract$_console_$192_$","typeString":"type(library console)"}},"id":577,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"memberName":"log","nodeType":"MemberAccess","referencedDeclaration":120,"src":"4938:11:0","typeDescriptions":{"typeIdentifier":"t_function_internal_pure$_t_string_memory_ptr_$returns$__$","typeString":"function (string memory) pure"}},"id":579,"isConstant":false,"isLValue":false,"isPure":false,"kind":"functionCall","lValueRequested":false,"names":[],"nodeType":"FunctionCall","src":"4938:20:0","tryCall":false,"typeDescriptions":{"typeIdentifier":"t_tuple$__$","typeString":"tuple()"}},"id":580,"nodeType":"ExpressionStatement","src":"4938:20:0"},{"expression":{"arguments":[],"expression":{"argumentTypes":[],"expression":{"id":581,"name":"vm","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":213,"src":"5042:2:0","typeDescriptions":{"typeIdentifier":"t_contract$_Vm_$55","typeString":"contract Vm"}},"id":583,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"memberName":"broadcast","nodeType":"MemberAccess","referencedDeclaration":38,"src":"5042:12:0","typeDescriptions":{"typeIdentifier":"t_function_external_nonpayable$__$returns$__$","typeString":"function () external"}},"id":584,"isConstant":false,"isLValue":false,"isPure":false,"kind":"functionCall","lValueRequested":false,"names":[],"nodeType":"FunctionCall","src":"5042:14:0","tryCall":false,"typeDescriptions":{"typeIdentifier":"t_tuple$__$","typeString":"tuple()"}},"id":585,"nodeType":"ExpressionStatement","src":"5042:14:0"},{"expression":{"arguments":[{"hexValue":"31323334","id":589,"isConstant":false,"isLValue":false,"isPure":true,"kind":"number","lValueRequested":false,"nodeType":"Literal","src":"5077:4:0","typeDescriptions":{"typeIdentifier":"t_rational_1234_by_1","typeString":"int_const 1234"},"value":"1234"}],"expression":{"argumentTypes":[{"typeIdentifier":"t_rational_1234_by_1","typeString":"int_const 1234"}],"id":588,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"nodeType":"NewExpression","src":"5066:10:0","typeDescriptions":{"typeIdentifier":"t_function_creation_nonpayable$_t_uint256_$returns$_t_contract$_FooBar_$719_$","typeString":"function (uint256) returns (contract FooBar)"},"typeName":{"id":587,"nodeType":"UserDefinedTypeName","pathNode":{"id":586,"name":"FooBar","nodeType":"IdentifierPath","referencedDeclaration":719,"src":"5070:6:0"},"referencedDeclaration":719,"src":"5070:6:0","typeDescriptions":{"typeIdentifier":"t_contract$_FooBar_$719","typeString":"contract FooBar"}}},"id":590,"isConstant":false,"isLValue":false,"isPure":false,"kind":"functionCall","lValueRequested":false,"names":[],"nodeType":"FunctionCall","src":"5066:16:0","tryCall":false,"typeDescriptions":{"typeIdentifier":"t_contract$_FooBar_$719","typeString":"contract FooBar"}},"id":591,"nodeType":"ExpressionStatement","src":"5066:16:0"},{"expression":{"arguments":[{"hexValue":"6e6f6e636520656e64","id":595,"isConstant":false,"isLValue":false,"isPure":true,"kind":"string","lValueRequested":false,"nodeType":"Literal","src":"5105:11:0","typeDescriptions":{"typeIdentifier":"t_stringliteral_fa629e6661ad2a2bdb09cf9a3a276ce0d722482ae5c2887650751be0938847e8","typeString":"literal_string \"nonce end\""},"value":"nonce end"},{"arguments":[{"arguments":[{"arguments":[{"id":602,"name":"this","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":-28,"src":"5146:4:0","typeDescriptions":{"typeIdentifier":"t_contract$_ScriptExample_$706","typeString":"contract ScriptExample"}}],"expression":{"argumentTypes":[{"typeIdentifier":"t_contract$_ScriptExample_$706","typeString":"contract ScriptExample"}],"id":601,"isConstant":false,"isLValue":false,"isPure":true,"lValueRequested":false,"nodeType":"ElementaryTypeNameExpression","src":"5138:7:0","typeDescriptions":{"typeIdentifier":"t_type$_t_address_$","typeString":"type(address)"},"typeName":{"id":600,"name":"address","nodeType":"ElementaryTypeName","src":"5138:7:0","typeDescriptions":{}}},"id":603,"isConstant":false,"isLValue":false,"isPure":false,"kind":"typeConversion","lValueRequested":false,"names":[],"nodeType":"FunctionCall","src":"5138:13:0","tryCall":false,"typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"}}],"expression":{"argumentTypes":[{"typeIdentifier":"t_address","typeString":"address"}],"expression":{"id":598,"name":"vm","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":213,"src":"5126:2:0","typeDescriptions":{"typeIdentifier":"t_contract$_Vm_$55","typeString":"contract Vm"}},"id":599,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"memberName":"getNonce","nodeType":"MemberAccess","referencedDeclaration":17,"src":"5126:11:0","typeDescriptions":{"typeIdentifier":"t_function_external_view$_t_address_$returns$_t_uint64_$","typeString":"function (address) view external returns (uint64)"}},"id":604,"isConstant":false,"isLValue":false,"isPure":false,"kind":"functionCall","lValueRequested":false,"names":[],"nodeType":"FunctionCall","src":"5126:26:0","tryCall":false,"typeDescriptions":{"typeIdentifier":"t_uint64","typeString":"uint64"}}],"expression":{"argumentTypes":[{"typeIdentifier":"t_uint64","typeString":"uint64"}],"id":597,"isConstant":false,"isLValue":false,"isPure":true,"lValueRequested":false,"nodeType":"ElementaryTypeNameExpression","src":"5118:7:0","typeDescriptions":{"typeIdentifier":"t_type$_t_uint256_$","typeString":"type(uint256)"},"typeName":{"id":596,"name":"uint256","nodeType":"ElementaryTypeName","src":"5118:7:0","typeDescriptions":{}}},"id":605,"isConstant":false,"isLValue":false,"isPure":false,"kind":"typeConversion","lValueRequested":false,"names":[],"nodeType":"FunctionCall","src":"5118:35:0","tryCall":false,"typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}}],"expression":{"argumentTypes":[{"typeIdentifier":"t_stringliteral_fa629e6661ad2a2bdb09cf9a3a276ce0d722482ae5c2887650751be0938847e8","typeString":"literal_string \"nonce end\""},{"typeIdentifier":"t_uint256","typeString":"uint256"}],"expression":{"id":592,"name":"console","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":192,"src":"5093:7:0","typeDescriptions":{"typeIdentifier":"t_type$_t_contract$_console_$192_$","typeString":"type(library console)"}},"id":594,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"memberName":"log","nodeType":"MemberAccess","referencedDeclaration":154,"src":"5093:11:0","typeDescriptions":{"typeIdentifier":"t_function_internal_pure$_t_string_memory_ptr_$_t_uint256_$returns$__$","typeString":"function (string memory,uint256) pure"}},"id":606,"isConstant":false,"isLValue":false,"isPure":false,"kind":"functionCall","lValueRequested":false,"names":[],"nodeType":"FunctionCall","src":"5093:61:0","tryCall":false,"typeDescriptions":{"typeIdentifier":"t_tuple$__$","typeString":"tuple()"}},"id":607,"nodeType":"ExpressionStatement","src":"5093:61:0"}]},"documentation":{"id":379,"nodeType":"StructuredDocumentation","src":"3842:56:0","text":"@notice example function, to test vm.broadcast with."},"functionSelector":"bef03abc","implemented":true,"kind":"function","modifiers":[],"name":"runBroadcast","nameLocation":"3912:12:0","parameters":{"id":380,"nodeType":"ParameterList","parameters":[],"src":"3924:2:0"},"returnParameters":{"id":381,"nodeType":"ParameterList","parameters":[],"src":"3934:0:0"},"scope":706,"stateMutability":"nonpayable","virtual":false,"visibility":"public"},{"id":633,"nodeType":"FunctionDefinition","src":"5256:143:0","nodes":[],"body":{"id":632,"nodeType":"Block","src":"5305:94:0","nodes":[],"statements":[{"expression":{"arguments":[{"id":618,"name":"_v","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":612,"src":"5327:2:0","typeDescriptions":{"typeIdentifier":"t_string_calldata_ptr","typeString":"string calldata"}}],"expression":{"argumentTypes":[{"typeIdentifier":"t_string_calldata_ptr","typeString":"string calldata"}],"expression":{"id":615,"name":"console","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":192,"src":"5315:7:0","typeDescriptions":{"typeIdentifier":"t_type$_t_contract$_console_$192_$","typeString":"type(library console)"}},"id":617,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"memberName":"log","nodeType":"MemberAccess","referencedDeclaration":120,"src":"5315:11:0","typeDescriptions":{"typeIdentifier":"t_function_internal_pure$_t_string_memory_ptr_$returns$__$","typeString":"function (string memory) pure"}},"id":619,"isConstant":false,"isLValue":false,"isPure":false,"kind":"functionCall","lValueRequested":false,"names":[],"nodeType":"FunctionCall","src":"5315:15:0","tryCall":false,"typeDescriptions":{"typeIdentifier":"t_tuple$__$","typeString":"tuple()"}},"id":620,"nodeType":"ExpressionStatement","src":"5315:15:0"},{"expression":{"arguments":[{"hexValue":"68656c6c6f206d73672e73656e646572","id":624,"isConstant":false,"isLValue":false,"isPure":true,"kind":"string","lValueRequested":false,"nodeType":"Literal","src":"5352:18:0","typeDescriptions":{"typeIdentifier":"t_stringliteral_b3cc13bc51228b2c4c4334d82a4772908254dc0e1c512893dd16208ef13efb8e","typeString":"literal_string \"hello msg.sender\""},"value":"hello msg.sender"},{"arguments":[{"expression":{"id":627,"name":"msg","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":-15,"src":"5380:3:0","typeDescriptions":{"typeIdentifier":"t_magic_message","typeString":"msg"}},"id":628,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"memberName":"sender","nodeType":"MemberAccess","src":"5380:10:0","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"}}],"expression":{"argumentTypes":[{"typeIdentifier":"t_address","typeString":"address"}],"id":626,"isConstant":false,"isLValue":false,"isPure":true,"lValueRequested":false,"nodeType":"ElementaryTypeNameExpression","src":"5372:7:0","typeDescriptions":{"typeIdentifier":"t_type$_t_address_$","typeString":"type(address)"},"typeName":{"id":625,"name":"address","nodeType":"ElementaryTypeName","src":"5372:7:0","typeDescriptions":{}}},"id":629,"isConstant":false,"isLValue":false,"isPure":false,"kind":"typeConversion","lValueRequested":false,"names":[],"nodeType":"FunctionCall","src":"5372:19:0","tryCall":false,"typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"}}],"expression":{"argumentTypes":[{"typeIdentifier":"t_stringliteral_b3cc13bc51228b2c4c4334d82a4772908254dc0e1c512893dd16208ef13efb8e","typeString":"literal_string \"hello msg.sender\""},{"typeIdentifier":"t_address","typeString":"address"}],"expression":{"id":621,"name":"console","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":192,"src":"5340:7:0","typeDescriptions":{"typeIdentifier":"t_type$_t_contract$_console_$192_$","typeString":"type(library console)"}},"id":623,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"memberName":"log","nodeType":"MemberAccess","referencedDeclaration":171,"src":"5340:11:0","typeDescriptions":{"typeIdentifier":"t_function_internal_pure$_t_string_memory_ptr_$_t_address_$returns$__$","typeString":"function (string memory,address) pure"}},"id":630,"isConstant":false,"isLValue":false,"isPure":false,"kind":"functionCall","lValueRequested":false,"names":[],"nodeType":"FunctionCall","src":"5340:52:0","tryCall":false,"typeDescriptions":{"typeIdentifier":"t_tuple$__$","typeString":"tuple()"}},"id":631,"nodeType":"ExpressionStatement","src":"5340:52:0"}]},"documentation":{"id":610,"nodeType":"StructuredDocumentation","src":"5167:84:0","text":"@notice example external function, to force a CALL, and test vm.startPrank with."},"functionSelector":"a777d0dc","implemented":true,"kind":"function","modifiers":[],"name":"hello","nameLocation":"5265:5:0","parameters":{"id":613,"nodeType":"ParameterList","parameters":[{"constant":false,"id":612,"mutability":"mutable","name":"_v","nameLocation":"5287:2:0","nodeType":"VariableDeclaration","scope":633,"src":"5271:18:0","stateVariable":false,"storageLocation":"calldata","typeDescriptions":{"typeIdentifier":"t_string_calldata_ptr","typeString":"string"},"typeName":{"id":611,"name":"string","nodeType":"ElementaryTypeName","src":"5271:6:0","typeDescriptions":{"typeIdentifier":"t_string_storage_ptr","typeString":"string"}},"visibility":"internal"}],"src":"5270:20:0"},"returnParameters":{"id":614,"nodeType":"ParameterList","parameters":[],"src":"5305:0:0"},"scope":706,"stateMutability":"view","virtual":false,"visibility":"external"},{"id":648,"nodeType":"FunctionDefinition","src":"5405:95:0","nodes":[],"body":{"id":647,"nodeType":"Block","src":"5449:51:0","nodes":[],"statements":[{"expression":{"id":639,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"nodeType":"UnaryOperation","operator":"++","prefix":false,"src":"5459:9:0","subExpression":{"id":638,"name":"counter","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":215,"src":"5459:7:0","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"id":640,"nodeType":"ExpressionStatement","src":"5459:9:0"},{"expression":{"arguments":[{"id":644,"name":"_v","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":635,"src":"5490:2:0","typeDescriptions":{"typeIdentifier":"t_string_calldata_ptr","typeString":"string calldata"}}],"expression":{"argumentTypes":[{"typeIdentifier":"t_string_calldata_ptr","typeString":"string calldata"}],"expression":{"id":641,"name":"console","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":192,"src":"5478:7:0","typeDescriptions":{"typeIdentifier":"t_type$_t_contract$_console_$192_$","typeString":"type(library console)"}},"id":643,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"memberName":"log","nodeType":"MemberAccess","referencedDeclaration":120,"src":"5478:11:0","typeDescriptions":{"typeIdentifier":"t_function_internal_pure$_t_string_memory_ptr_$returns$__$","typeString":"function (string memory) pure"}},"id":645,"isConstant":false,"isLValue":false,"isPure":false,"kind":"functionCall","lValueRequested":false,"names":[],"nodeType":"FunctionCall","src":"5478:15:0","tryCall":false,"typeDescriptions":{"typeIdentifier":"t_tuple$__$","typeString":"tuple()"}},"id":646,"nodeType":"ExpressionStatement","src":"5478:15:0"}]},"functionSelector":"7e79255d","implemented":true,"kind":"function","modifiers":[],"name":"call1","nameLocation":"5414:5:0","parameters":{"id":636,"nodeType":"ParameterList","parameters":[{"constant":false,"id":635,"mutability":"mutable","name":"_v","nameLocation":"5436:2:0","nodeType":"VariableDeclaration","scope":648,"src":"5420:18:0","stateVariable":false,"storageLocation":"calldata","typeDescriptions":{"typeIdentifier":"t_string_calldata_ptr","typeString":"string"},"typeName":{"id":634,"name":"string","nodeType":"ElementaryTypeName","src":"5420:6:0","typeDescriptions":{"typeIdentifier":"t_string_storage_ptr","typeString":"string"}},"visibility":"internal"}],"src":"5419:20:0"},"returnParameters":{"id":637,"nodeType":"ParameterList","parameters":[],"src":"5449:0:0"},"scope":706,"stateMutability":"nonpayable","virtual":false,"visibility":"external"},{"id":663,"nodeType":"FunctionDefinition","src":"5506:95:0","nodes":[],"body":{"id":662,"nodeType":"Block","src":"5550:51:0","nodes":[],"statements":[{"expression":{"id":654,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"nodeType":"UnaryOperation","operator":"++","prefix":false,"src":"5560:9:0","subExpression":{"id":653,"name":"counter","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":215,"src":"5560:7:0","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"id":655,"nodeType":"ExpressionStatement","src":"5560:9:0"},{"expression":{"arguments":[{"id":659,"name":"_v","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":650,"src":"5591:2:0","typeDescriptions":{"typeIdentifier":"t_string_calldata_ptr","typeString":"string calldata"}}],"expression":{"argumentTypes":[{"typeIdentifier":"t_string_calldata_ptr","typeString":"string calldata"}],"expression":{"id":656,"name":"console","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":192,"src":"5579:7:0","typeDescriptions":{"typeIdentifier":"t_type$_t_contract$_console_$192_$","typeString":"type(library console)"}},"id":658,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"memberName":"log","nodeType":"MemberAccess","referencedDeclaration":120,"src":"5579:11:0","typeDescriptions":{"typeIdentifier":"t_function_internal_pure$_t_string_memory_ptr_$returns$__$","typeString":"function (string memory) pure"}},"id":660,"isConstant":false,"isLValue":false,"isPure":false,"kind":"functionCall","lValueRequested":false,"names":[],"nodeType":"FunctionCall","src":"5579:15:0","tryCall":false,"typeDescriptions":{"typeIdentifier":"t_tuple$__$","typeString":"tuple()"}},"id":661,"nodeType":"ExpressionStatement","src":"5579:15:0"}]},"functionSelector":"8d3ef7ca","implemented":true,"kind":"function","modifiers":[],"name":"call2","nameLocation":"5515:5:0","parameters":{"id":651,"nodeType":"ParameterList","parameters":[{"constant":false,"id":650,"mutability":"mutable","name":"_v","nameLocation":"5537:2:0","nodeType":"VariableDeclaration","scope":663,"src":"5521:18:0","stateVariable":false,"storageLocation":"calldata","typeDescriptions":{"typeIdentifier":"t_string_calldata_ptr","typeString":"string"},"typeName":{"id":649,"name":"string","nodeType":"ElementaryTypeName","src":"5521:6:0","typeDescriptions":{"typeIdentifier":"t_string_storage_ptr","typeString":"string"}},"visibility":"internal"}],"src":"5520:20:0"},"returnParameters":{"id":652,"nodeType":"ParameterList","parameters":[],"src":"5550:0:0"},"scope":706,"stateMutability":"nonpayable","virtual":false,"visibility":"external"},{"id":678,"nodeType":"FunctionDefinition","src":"5607:98:0","nodes":[],"body":{"id":677,"nodeType":"Block","src":"5653:52:0","nodes":[],"statements":[{"expression":{"id":669,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"nodeType":"UnaryOperation","operator":"++","prefix":false,"src":"5663:9:0","subExpression":{"id":668,"name":"counter","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":215,"src":"5663:7:0","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"id":670,"nodeType":"ExpressionStatement","src":"5663:9:0"},{"expression":{"arguments":[{"id":674,"name":"_v","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":665,"src":"5695:2:0","typeDescriptions":{"typeIdentifier":"t_string_calldata_ptr","typeString":"string calldata"}}],"expression":{"argumentTypes":[{"typeIdentifier":"t_string_calldata_ptr","typeString":"string calldata"}],"expression":{"id":671,"name":"this","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":-28,"src":"5682:4:0","typeDescriptions":{"typeIdentifier":"t_contract$_ScriptExample_$706","typeString":"contract ScriptExample"}},"id":673,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"memberName":"nested2","nodeType":"MemberAccess","referencedDeclaration":693,"src":"5682:12:0","typeDescriptions":{"typeIdentifier":"t_function_external_nonpayable$_t_string_memory_ptr_$returns$__$","typeString":"function (string memory) external"}},"id":675,"isConstant":false,"isLValue":false,"isPure":false,"kind":"functionCall","lValueRequested":false,"names":[],"nodeType":"FunctionCall","src":"5682:16:0","tryCall":false,"typeDescriptions":{"typeIdentifier":"t_tuple$__$","typeString":"tuple()"}},"id":676,"nodeType":"ExpressionStatement","src":"5682:16:0"}]},"functionSelector":"a76ccdfa","implemented":true,"kind":"function","modifiers":[],"name":"nested1","nameLocation":"5616:7:0","parameters":{"id":666,"nodeType":"ParameterList","parameters":[{"constant":false,"id":665,"mutability":"mutable","name":"_v","nameLocation":"5640:2:0","nodeType":"VariableDeclaration","scope":678,"src":"5624:18:0","stateVariable":false,"storageLocation":"calldata","typeDescriptions":{"typeIdentifier":"t_string_calldata_ptr","typeString":"string"},"typeName":{"id":664,"name":"string","nodeType":"ElementaryTypeName","src":"5624:6:0","typeDescriptions":{"typeIdentifier":"t_string_storage_ptr","typeString":"string"}},"visibility":"internal"}],"src":"5623:20:0"},"returnParameters":{"id":667,"nodeType":"ParameterList","parameters":[],"src":"5653:0:0"},"scope":706,"stateMutability":"nonpayable","virtual":false,"visibility":"external"},{"id":693,"nodeType":"FunctionDefinition","src":"5711:97:0","nodes":[],"body":{"id":692,"nodeType":"Block","src":"5757:51:0","nodes":[],"statements":[{"expression":{"id":684,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"nodeType":"UnaryOperation","operator":"++","prefix":false,"src":"5767:9:0","subExpression":{"id":683,"name":"counter","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":215,"src":"5767:7:0","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"id":685,"nodeType":"ExpressionStatement","src":"5767:9:0"},{"expression":{"arguments":[{"id":689,"name":"_v","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":680,"src":"5798:2:0","typeDescriptions":{"typeIdentifier":"t_string_calldata_ptr","typeString":"string calldata"}}],"expression":{"argumentTypes":[{"typeIdentifier":"t_string_calldata_ptr","typeString":"string calldata"}],"expression":{"id":686,"name":"console","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":192,"src":"5786:7:0","typeDescriptions":{"typeIdentifier":"t_type$_t_contract$_console_$192_$","typeString":"type(library console)"}},"id":688,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"memberName":"log","nodeType":"MemberAccess","referencedDeclaration":120,"src":"5786:11:0","typeDescriptions":{"typeIdentifier":"t_function_internal_pure$_t_string_memory_ptr_$returns$__$","typeString":"function (string memory) pure"}},"id":690,"isConstant":false,"isLValue":false,"isPure":false,"kind":"functionCall","lValueRequested":false,"names":[],"nodeType":"FunctionCall","src":"5786:15:0","tryCall":false,"typeDescriptions":{"typeIdentifier":"t_tuple$__$","typeString":"tuple()"}},"id":691,"nodeType":"ExpressionStatement","src":"5786:15:0"}]},"functionSelector":"dbf1282f","implemented":true,"kind":"function","modifiers":[],"name":"nested2","nameLocation":"5720:7:0","parameters":{"id":681,"nodeType":"ParameterList","parameters":[{"constant":false,"id":680,"mutability":"mutable","name":"_v","nameLocation":"5744:2:0","nodeType":"VariableDeclaration","scope":693,"src":"5728:18:0","stateVariable":false,"storageLocation":"calldata","typeDescriptions":{"typeIdentifier":"t_string_calldata_ptr","typeString":"string"},"typeName":{"id":679,"name":"string","nodeType":"ElementaryTypeName","src":"5728:6:0","typeDescriptions":{"typeIdentifier":"t_string_storage_ptr","typeString":"string"}},"visibility":"internal"}],"src":"5727:20:0"},"returnParameters":{"id":682,"nodeType":"ParameterList","parameters":[],"src":"5757:0:0"},"scope":706,"stateMutability":"nonpayable","virtual":false,"visibility":"external"},{"id":705,"nodeType":"FunctionDefinition","src":"5814:84:0","nodes":[],"body":{"id":704,"nodeType":"Block","src":"5866:32:0","nodes":[],"statements":[{"expression":{"arguments":[{"id":701,"name":"_v","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":695,"src":"5888:2:0","typeDescriptions":{"typeIdentifier":"t_string_calldata_ptr","typeString":"string calldata"}}],"expression":{"argumentTypes":[{"typeIdentifier":"t_string_calldata_ptr","typeString":"string calldata"}],"expression":{"id":698,"name":"console","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":192,"src":"5876:7:0","typeDescriptions":{"typeIdentifier":"t_type$_t_contract$_console_$192_$","typeString":"type(library console)"}},"id":700,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"memberName":"log","nodeType":"MemberAccess","referencedDeclaration":120,"src":"5876:11:0","typeDescriptions":{"typeIdentifier":"t_function_internal_pure$_t_string_memory_ptr_$returns$__$","typeString":"function (string memory) pure"}},"id":702,"isConstant":false,"isLValue":false,"isPure":false,"kind":"functionCall","lValueRequested":false,"names":[],"nodeType":"FunctionCall","src":"5876:15:0","tryCall":false,"typeDescriptions":{"typeIdentifier":"t_tuple$__$","typeString":"tuple()"}},"id":703,"nodeType":"ExpressionStatement","src":"5876:15:0"}]},"functionSelector":"7f8b915c","implemented":true,"kind":"function","modifiers":[],"name":"callPure","nameLocation":"5823:8:0","parameters":{"id":696,"nodeType":"ParameterList","parameters":[{"constant":false,"id":695,"mutability":"mutable","name":"_v","nameLocation":"5848:2:0","nodeType":"VariableDeclaration","scope":705,"src":"5832:18:0","stateVariable":false,"storageLocation":"calldata","typeDescriptions":{"typeIdentifier":"t_string_calldata_ptr","typeString":"string"},"typeName":{"id":694,"name":"string","nodeType":"ElementaryTypeName","src":"5832:6:0","typeDescriptions":{"typeIdentifier":"t_string_storage_ptr","typeString":"string"}},"visibility":"internal"}],"src":"5831:20:0"},"returnParameters":{"id":697,"nodeType":"ParameterList","parameters":[],"src":"5866:0:0"},"scope":706,"stateMutability":"pure","virtual":false,"visibility":"external"}],"abstract":false,"baseContracts":[],"canonicalName":"ScriptExample","contractDependencies":[719],"contractKind":"contract","documentation":{"id":193,"nodeType":"StructuredDocumentation","src":"2415:126:0","text":"@title ScriptExample\n @notice ScriptExample is an example script. The Go forge script code tests that it can run this."},"fullyImplemented":true,"linearizedBaseContracts":[706],"name":"ScriptExample","nameLocation":"2550:13:0","scope":720,"usedErrors":[]},{"id":719,"nodeType":"ContractDefinition","src":"5902:96:0","nodes":[{"id":708,"nodeType":"VariableDeclaration","src":"5924:18:0","nodes":[],"constant":false,"functionSelector":"c2985578","mutability":"mutable","name":"foo","nameLocation":"5939:3:0","scope":719,"stateVariable":true,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"},"typeName":{"id":707,"name":"uint256","nodeType":"ElementaryTypeName","src":"5924:7:0","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"visibility":"public"},{"id":718,"nodeType":"FunctionDefinition","src":"5949:47:0","nodes":[],"body":{"id":717,"nodeType":"Block","src":"5972:24:0","nodes":[],"statements":[{"expression":{"id":715,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"leftHandSide":{"id":713,"name":"foo","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":708,"src":"5982:3:0","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"nodeType":"Assignment","operator":"=","rightHandSide":{"id":714,"name":"v","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":710,"src":"5988:1:0","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"src":"5982:7:0","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"id":716,"nodeType":"ExpressionStatement","src":"5982:7:0"}]},"implemented":true,"kind":"constructor","modifiers":[],"name":"","nameLocation":"-1:-1:-1","parameters":{"id":711,"nodeType":"ParameterList","parameters":[{"constant":false,"id":710,"mutability":"mutable","name":"v","nameLocation":"5969:1:0","nodeType":"VariableDeclaration","scope":718,"src":"5961:9:0","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"},"typeName":{"id":709,"name":"uint256","nodeType":"ElementaryTypeName","src":"5961:7:0","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"visibility":"internal"}],"src":"5960:11:0"},"returnParameters":{"id":712,"nodeType":"ParameterList","parameters":[],"src":"5972:0:0"},"scope":719,"stateMutability":"nonpayable","virtual":false,"visibility":"public"}],"abstract":false,"baseContracts":[],"canonicalName":"FooBar","contractDependencies":[],"contractKind":"contract","fullyImplemented":true,"linearizedBaseContracts":[719],"name":"FooBar","nameLocation":"5911:6:0","scope":720,"usedErrors":[]}],"license":"MIT"},"id":0} \ No newline at end of file diff --git a/op-chain-ops/script/testdata/test-artifacts/ScriptExample.s.sol/ScriptExample.json b/op-chain-ops/script/testdata/test-artifacts/ScriptExample.s.sol/ScriptExample.json new file mode 100644 index 000000000000..09a0bf47f02d --- /dev/null +++ b/op-chain-ops/script/testdata/test-artifacts/ScriptExample.s.sol/ScriptExample.json @@ -0,0 +1 @@ +{"abi":[{"type":"function","name":"call1","inputs":[{"name":"_v","type":"string","internalType":"string"}],"outputs":[],"stateMutability":"nonpayable"},{"type":"function","name":"call2","inputs":[{"name":"_v","type":"string","internalType":"string"}],"outputs":[],"stateMutability":"nonpayable"},{"type":"function","name":"callPure","inputs":[{"name":"_v","type":"string","internalType":"string"}],"outputs":[],"stateMutability":"pure"},{"type":"function","name":"counter","inputs":[],"outputs":[{"name":"","type":"uint256","internalType":"uint256"}],"stateMutability":"view"},{"type":"function","name":"hello","inputs":[{"name":"_v","type":"string","internalType":"string"}],"outputs":[],"stateMutability":"view"},{"type":"function","name":"nested1","inputs":[{"name":"_v","type":"string","internalType":"string"}],"outputs":[],"stateMutability":"nonpayable"},{"type":"function","name":"nested2","inputs":[{"name":"_v","type":"string","internalType":"string"}],"outputs":[],"stateMutability":"nonpayable"},{"type":"function","name":"run","inputs":[],"outputs":[],"stateMutability":"nonpayable"},{"type":"function","name":"runBroadcast","inputs":[],"outputs":[],"stateMutability":"nonpayable"}],"bytecode":{"object":"0x608060405234801561001057600080fd5b5061202a806100206000396000f3fe608060405234801561001057600080fd5b50600436106100a35760003560e01c8063a76ccdfa11610076578063bef03abc1161005b578063bef03abc14610111578063c040622614610119578063dbf1282f146100c357600080fd5b8063a76ccdfa146100eb578063a777d0dc146100fe57600080fd5b806361bc221a146100a85780637e79255d146100c35780637f8b915c146100d85780638d3ef7ca146100c3575b600080fd5b6100b160005481565b60405190815260200160405180910390f35b6100d66100d1366004611a60565b610121565b005b6100d66100e6366004611a60565b610178565b6100d66100f9366004611a60565b6101b7565b6100d661010c366004611a60565b61023f565b6100d66102bd565b6100d6610f54565b60008054908061013083611ad2565b919050555061017482828080601f01602080910402602001604051908101604052809392919081815260200183838082843760009201919091525061175b92505050565b5050565b61017482828080601f01602080910402602001604051908101604052809392919081815260200183838082843760009201919091525061175b92505050565b6000805490806101c683611ad2565b90915550506040517fdbf1282f000000000000000000000000000000000000000000000000000000008152309063dbf1282f906102099085908590600401611b31565b600060405180830381600087803b15801561022357600080fd5b505af1158015610237573d6000803e3d6000fd5b505050505050565b61027e82828080601f01602080910402602001604051908101604052809392919081815260200183838082843760009201919091525061175b92505050565b6101746040518060400160405280601081526020017f68656c6c6f206d73672e73656e64657200000000000000000000000000000000815250336117ed565b604080518082018252600b81527f6e6f6e6365207374617274000000000000000000000000000000000000000000602082015290517f2d0335ab0000000000000000000000000000000000000000000000000000000081523060048201526103909190737109709ecfa91a80626ff3989d68f67f5b1dd12d90632d0335ab906024015b602060405180830381865afa15801561035d573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906103819190611b7e565b67ffffffffffffffff1661187e565b6103ce6040518060400160405280600e81526020017f74657374696e672073696e676c6500000000000000000000000000000000000081525061175b565b7f885cb69240a935d632d79c317109709ecfa91a80626ff3989d68f67f5b1dd12d60001c73ffffffffffffffffffffffffffffffffffffffff1663afc980406040518163ffffffff1660e01b8152600401600060405180830381600087803b15801561043957600080fd5b505af115801561044d573d6000803e3d6000fd5b50506040517f7e79255d00000000000000000000000000000000000000000000000000000000815260206004820152600c60248201527f73696e676c655f63616c6c3100000000000000000000000000000000000000006044820152309250637e79255d9150606401600060405180830381600087803b1580156104d057600080fd5b505af11580156104e4573d6000803e3d6000fd5b50506040517f8d3ef7ca00000000000000000000000000000000000000000000000000000000815260206004820152600c60248201527f73696e676c655f63616c6c3200000000000000000000000000000000000000006044820152309250638d3ef7ca9150606401600060405180830381600087803b15801561056757600080fd5b505af115801561057b573d6000803e3d6000fd5b505050506105bd6040518060400160405280601281526020017f74657374696e672073746172742f73746f70000000000000000000000000000081525061175b565b6040517f7fec2a8d00000000000000000000000000000000000000000000000000000000815262c0ffee6004820152737109709ecfa91a80626ff3989d68f67f5b1dd12d90637fec2a8d90602401600060405180830381600087803b15801561062557600080fd5b505af1158015610639573d6000803e3d6000fd5b50506040517f7e79255d00000000000000000000000000000000000000000000000000000000815260206004820152600f60248201527f737461727473746f705f63616c6c3100000000000000000000000000000000006044820152309250637e79255d9150606401600060405180830381600087803b1580156106bc57600080fd5b505af11580156106d0573d6000803e3d6000fd5b50506040517f8d3ef7ca00000000000000000000000000000000000000000000000000000000815260206004820152600f60248201527f737461727473746f705f63616c6c3200000000000000000000000000000000006044820152309250638d3ef7ca9150606401600060405180830381600087803b15801561075357600080fd5b505af1158015610767573d6000803e3d6000fd5b50506040517f7f8b915c00000000000000000000000000000000000000000000000000000000815260206004820152600e60248201527f737461727473746f705f707572650000000000000000000000000000000000006044820152309250637f8b915c915060640160006040518083038186803b1580156107e857600080fd5b505afa1580156107fc573d6000803e3d6000fd5b505050507f885cb69240a935d632d79c317109709ecfa91a80626ff3989d68f67f5b1dd12d60001c73ffffffffffffffffffffffffffffffffffffffff166376eadd366040518163ffffffff1660e01b8152600401600060405180830381600087803b15801561086b57600080fd5b505af115801561087f573d6000803e3d6000fd5b50506040517f7e79255d00000000000000000000000000000000000000000000000000000000815260206004820152600f60248201527f737461727473746f705f63616c6c3300000000000000000000000000000000006044820152309250637e79255d9150606401600060405180830381600087803b15801561090257600080fd5b505af1158015610916573d6000803e3d6000fd5b505050506109586040518060400160405280600e81526020017f74657374696e67206e657374656400000000000000000000000000000000000081525061175b565b6040517f7fec2a8d0000000000000000000000000000000000000000000000000000000081526112346004820152737109709ecfa91a80626ff3989d68f67f5b1dd12d90637fec2a8d90602401600060405180830381600087803b1580156109bf57600080fd5b505af11580156109d3573d6000803e3d6000fd5b50506040517fa76ccdfa00000000000000000000000000000000000000000000000000000000815260206004820152600660248201527f6e65737465640000000000000000000000000000000000000000000000000000604482015230925063a76ccdfa9150606401600060405180830381600087803b158015610a5657600080fd5b505af1158015610a6a573d6000803e3d6000fd5b505050507f885cb69240a935d632d79c317109709ecfa91a80626ff3989d68f67f5b1dd12d60001c73ffffffffffffffffffffffffffffffffffffffff166376eadd366040518163ffffffff1660e01b8152600401600060405180830381600087803b158015610ad957600080fd5b505af1158015610aed573d6000803e3d6000fd5b50505050610b2f6040518060400160405280601381526020017f636f6e7472616374206465706c6f796d656e740000000000000000000000000081525061175b565b6040517fe6962cdb000000000000000000000000000000000000000000000000000000008152621234566004820152737109709ecfa91a80626ff3989d68f67f5b1dd12d9063e6962cdb90602401600060405180830381600087803b158015610b9757600080fd5b505af1158015610bab573d6000803e3d6000fd5b5050505060006104d2604051610bc090611a54565b908152602001604051809103906000f080158015610be2573d6000803e3d6000fd5b5090508073ffffffffffffffffffffffffffffffffffffffff1663c29855786040518163ffffffff1660e01b8152600401602060405180830381865afa158015610c30573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610c549190611baf565b6104d214610c6157600080fd5b610c9f6040518060400160405280600881526020017f637265617465203200000000000000000000000000000000000000000000000081525061175b565b6040517fe6962cdb00000000000000000000000000000000000000000000000000000000815261cafe6004820152737109709ecfa91a80626ff3989d68f67f5b1dd12d9063e6962cdb90602401600060405180830381600087803b158015610d0657600080fd5b505af1158015610d1a573d6000803e3d6000fd5b505050506000602a60001b6104d2604051610d3490611a54565b9081526020018190604051809103906000f5905080158015610d5a573d6000803e3d6000fd5b5090508073ffffffffffffffffffffffffffffffffffffffff1663c29855786040518163ffffffff1660e01b8152600401602060405180830381865afa158015610da8573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610dcc9190611baf565b6104d214610dd957600080fd5b610e176040518060400160405280600581526020017f646f6e652100000000000000000000000000000000000000000000000000000081525061175b565b7f885cb69240a935d632d79c317109709ecfa91a80626ff3989d68f67f5b1dd12d60001c73ffffffffffffffffffffffffffffffffffffffff1663afc980406040518163ffffffff1660e01b8152600401600060405180830381600087803b158015610e8257600080fd5b505af1158015610e96573d6000803e3d6000fd5b505050506104d2604051610ea990611a54565b908152602001604051809103906000f080158015610ecb573d6000803e3d6000fd5b5050604080518082018252600981527f6e6f6e636520656e640000000000000000000000000000000000000000000000602082015290517f2d0335ab0000000000000000000000000000000000000000000000000000000081523060048201526101749190737109709ecfa91a80626ff3989d68f67f5b1dd12d90632d0335ab90602401610340565b604080517f4777f3cf0000000000000000000000000000000000000000000000000000000081526004810191909152600c60448201527f4558414d504c455f424f4f4c0000000000000000000000000000000000000000606482015260006024820181905290737109709ecfa91a80626ff3989d68f67f5b1dd12d90634777f3cf90608401602060405180830381865afa158015610ff6573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061101a9190611bc8565b905061105b6040518060400160405280601381526020017f626f6f6c2076616c75652066726f6d20656e76000000000000000000000000008152508261190f565b61109a6040518060400160405280600d81526020017f636f6e7472616374206164647200000000000000000000000000000000000000815250306117ed565b604080518082018252600e81527f636f6e7472616374206e6f6e6365000000000000000000000000000000000000602082015290517f2d0335ab0000000000000000000000000000000000000000000000000000000081523060048201526111219190737109709ecfa91a80626ff3989d68f67f5b1dd12d90632d0335ab90602401610340565b6111606040518060400160405280600b81526020017f73656e6465722061646472000000000000000000000000000000000000000000815250336117ed565b604080518082018252600c81527f73656e646572206e6f6e63650000000000000000000000000000000000000000602082015290517f2d0335ab0000000000000000000000000000000000000000000000000000000081523360048201526111e79190737109709ecfa91a80626ff3989d68f67f5b1dd12d90632d0335ab90602401610340565b60408051808201825260208082527f7b22726f6f745f6b6579223a205b7b2261223a20312c202262223a20327d5d7d9082015290517f213e4198000000000000000000000000000000000000000000000000000000008152600090737109709ecfa91a80626ff3989d68f67f5b1dd12d9063213e41989061126c908590600401611c64565b600060405180830381865afa158015611289573d6000803e3d6000fd5b505050506040513d6000823e601f3d9081017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe01682016040526112cf9190810190611d34565b90506113456040518060400160405280600481526020017f6b657973000000000000000000000000000000000000000000000000000000008152508260008151811061131d5761131d611e68565b60200260200101518360018151811061133857611338611e68565b60200260200101516119a0565b6040517fa777d0dc00000000000000000000000000000000000000000000000000000000815260206004820152600d60248201527f66726f6d206f726967696e616c000000000000000000000000000000000000006044820152309063a777d0dc9060640160006040518083038186803b1580156113c257600080fd5b505afa1580156113d6573d6000803e3d6000fd5b50506040517f06447d5600000000000000000000000000000000000000000000000000000000815260426004820152737109709ecfa91a80626ff3989d68f67f5b1dd12d92506306447d569150602401600060405180830381600087803b15801561144057600080fd5b505af1158015611454573d6000803e3d6000fd5b50506040517fa777d0dc00000000000000000000000000000000000000000000000000000000815260206004820152600c60248201527f66726f6d207072616e6b20310000000000000000000000000000000000000000604482015230925063a777d0dc915060640160006040518083038186803b1580156114d557600080fd5b505afa1580156114e9573d6000803e3d6000fd5b5050505061152c6040518060400160405280601781526020017f706172656e742073636f7065206d73672e73656e646572000000000000000000815250336117ed565b61156b6040518060400160405280601a81526020017f706172656e742073636f706520636f6e74726163742e61646472000000000000815250306117ed565b6040517fa777d0dc00000000000000000000000000000000000000000000000000000000815260206004820152600c60248201527f66726f6d207072616e6b203200000000000000000000000000000000000000006044820152309063a777d0dc9060640160006040518083038186803b1580156115e857600080fd5b505afa1580156115fc573d6000803e3d6000fd5b505050507f885cb69240a935d632d79c317109709ecfa91a80626ff3989d68f67f5b1dd12d60001c73ffffffffffffffffffffffffffffffffffffffff166390c5013b6040518163ffffffff1660e01b8152600401600060405180830381600087803b15801561166b57600080fd5b505af115801561167f573d6000803e3d6000fd5b50506040517fa777d0dc00000000000000000000000000000000000000000000000000000000815260206004820152601360248201527f66726f6d206f726967696e616c20616761696e00000000000000000000000000604482015230925063a777d0dc915060640160006040518083038186803b15801561170057600080fd5b505afa158015611714573d6000803e3d6000fd5b505050506117566040518060400160405280600581526020017f646f6e652100000000000000000000000000000000000000000000000000000081525061175b565b505050565b6117ea8160405160240161176f9190611e97565b604080517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe08184030181529190526020810180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff167f41304fac00000000000000000000000000000000000000000000000000000000179052611a2f565b50565b6101748282604051602401611803929190611eaa565b604080517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe08184030181529190526020810180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff167f319af33300000000000000000000000000000000000000000000000000000000179052611a2f565b6101748282604051602401611894929190611ee2565b604080517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe08184030181529190526020810180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff167fb60e72cc00000000000000000000000000000000000000000000000000000000179052611a2f565b6101748282604051602401611925929190611f04565b604080517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe08184030181529190526020810180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff167fc3b5563500000000000000000000000000000000000000000000000000000000179052611a2f565b6117568383836040516024016119b893929190611f28565b604080517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe08184030181529190526020810180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff167f2ced7cef000000000000000000000000000000000000000000000000000000001790525b6117ea8180516a636f6e736f6c652e6c6f67602083016000808483855afa5050505050565b60b280611f6c83390190565b60008060208385031215611a7357600080fd5b823567ffffffffffffffff80821115611a8b57600080fd5b818501915085601f830112611a9f57600080fd5b813581811115611aae57600080fd5b866020828501011115611ac057600080fd5b60209290920196919550909350505050565b60007fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff8203611b2a577f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b5060010190565b60208152816020820152818360408301376000818301604090810191909152601f9092017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0160101919050565b600060208284031215611b9057600080fd5b815167ffffffffffffffff81168114611ba857600080fd5b9392505050565b600060208284031215611bc157600080fd5b5051919050565b600060208284031215611bda57600080fd5b81518015158114611ba857600080fd5b60005b83811015611c05578181015183820152602001611bed565b83811115611c14576000848401525b50505050565b60008151808452611c32816020860160208601611bea565b601f017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0169290920160200192915050565b604081526000611c776040830184611c1a565b8281036020840152600c81527f2e726f6f745f6b65795b305d000000000000000000000000000000000000000060208201526040810191505092915050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b604051601f82017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe016810167ffffffffffffffff81118282101715611d2c57611d2c611cb6565b604052919050565b60006020808385031215611d4757600080fd5b825167ffffffffffffffff80821115611d5f57600080fd5b8185019150601f8681840112611d7457600080fd5b825182811115611d8657611d86611cb6565b8060051b611d95868201611ce5565b918252848101860191868101908a841115611daf57600080fd5b87870192505b83831015611e5a57825186811115611dcd5760008081fd5b8701603f81018c13611ddf5760008081fd5b88810151604088821115611df557611df5611cb6565b611e248b7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe08a85011601611ce5565b8281528e82848601011115611e395760008081fd5b611e48838d8301848701611bea565b85525050509187019190870190611db5565b9a9950505050505050505050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b602081526000611ba86020830184611c1a565b604081526000611ebd6040830185611c1a565b905073ffffffffffffffffffffffffffffffffffffffff831660208301529392505050565b604081526000611ef56040830185611c1a565b90508260208301529392505050565b604081526000611f176040830185611c1a565b905082151560208301529392505050565b606081526000611f3b6060830186611c1a565b8281036020840152611f4d8186611c1a565b90508281036040840152611f618185611c1a565b969550505050505056fe608060405234801561001057600080fd5b506040516100b23803806100b283398101604081905261002f91610037565b600055610050565b60006020828403121561004957600080fd5b5051919050565b60548061005e6000396000f3fe6080604052348015600f57600080fd5b506004361060285760003560e01c8063c298557814602d575b600080fd5b603560005481565b60405190815260200160405180910390f3fea164736f6c634300080f000aa164736f6c634300080f000a","sourceMap":"2541:3359:0:-:0;;;;;;;;;;;;;;;;;;;","linkReferences":{}},"deployedBytecode":{"object":"0x608060405234801561001057600080fd5b50600436106100a35760003560e01c8063a76ccdfa11610076578063bef03abc1161005b578063bef03abc14610111578063c040622614610119578063dbf1282f146100c357600080fd5b8063a76ccdfa146100eb578063a777d0dc146100fe57600080fd5b806361bc221a146100a85780637e79255d146100c35780637f8b915c146100d85780638d3ef7ca146100c3575b600080fd5b6100b160005481565b60405190815260200160405180910390f35b6100d66100d1366004611a60565b610121565b005b6100d66100e6366004611a60565b610178565b6100d66100f9366004611a60565b6101b7565b6100d661010c366004611a60565b61023f565b6100d66102bd565b6100d6610f54565b60008054908061013083611ad2565b919050555061017482828080601f01602080910402602001604051908101604052809392919081815260200183838082843760009201919091525061175b92505050565b5050565b61017482828080601f01602080910402602001604051908101604052809392919081815260200183838082843760009201919091525061175b92505050565b6000805490806101c683611ad2565b90915550506040517fdbf1282f000000000000000000000000000000000000000000000000000000008152309063dbf1282f906102099085908590600401611b31565b600060405180830381600087803b15801561022357600080fd5b505af1158015610237573d6000803e3d6000fd5b505050505050565b61027e82828080601f01602080910402602001604051908101604052809392919081815260200183838082843760009201919091525061175b92505050565b6101746040518060400160405280601081526020017f68656c6c6f206d73672e73656e64657200000000000000000000000000000000815250336117ed565b604080518082018252600b81527f6e6f6e6365207374617274000000000000000000000000000000000000000000602082015290517f2d0335ab0000000000000000000000000000000000000000000000000000000081523060048201526103909190737109709ecfa91a80626ff3989d68f67f5b1dd12d90632d0335ab906024015b602060405180830381865afa15801561035d573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906103819190611b7e565b67ffffffffffffffff1661187e565b6103ce6040518060400160405280600e81526020017f74657374696e672073696e676c6500000000000000000000000000000000000081525061175b565b7f885cb69240a935d632d79c317109709ecfa91a80626ff3989d68f67f5b1dd12d60001c73ffffffffffffffffffffffffffffffffffffffff1663afc980406040518163ffffffff1660e01b8152600401600060405180830381600087803b15801561043957600080fd5b505af115801561044d573d6000803e3d6000fd5b50506040517f7e79255d00000000000000000000000000000000000000000000000000000000815260206004820152600c60248201527f73696e676c655f63616c6c3100000000000000000000000000000000000000006044820152309250637e79255d9150606401600060405180830381600087803b1580156104d057600080fd5b505af11580156104e4573d6000803e3d6000fd5b50506040517f8d3ef7ca00000000000000000000000000000000000000000000000000000000815260206004820152600c60248201527f73696e676c655f63616c6c3200000000000000000000000000000000000000006044820152309250638d3ef7ca9150606401600060405180830381600087803b15801561056757600080fd5b505af115801561057b573d6000803e3d6000fd5b505050506105bd6040518060400160405280601281526020017f74657374696e672073746172742f73746f70000000000000000000000000000081525061175b565b6040517f7fec2a8d00000000000000000000000000000000000000000000000000000000815262c0ffee6004820152737109709ecfa91a80626ff3989d68f67f5b1dd12d90637fec2a8d90602401600060405180830381600087803b15801561062557600080fd5b505af1158015610639573d6000803e3d6000fd5b50506040517f7e79255d00000000000000000000000000000000000000000000000000000000815260206004820152600f60248201527f737461727473746f705f63616c6c3100000000000000000000000000000000006044820152309250637e79255d9150606401600060405180830381600087803b1580156106bc57600080fd5b505af11580156106d0573d6000803e3d6000fd5b50506040517f8d3ef7ca00000000000000000000000000000000000000000000000000000000815260206004820152600f60248201527f737461727473746f705f63616c6c3200000000000000000000000000000000006044820152309250638d3ef7ca9150606401600060405180830381600087803b15801561075357600080fd5b505af1158015610767573d6000803e3d6000fd5b50506040517f7f8b915c00000000000000000000000000000000000000000000000000000000815260206004820152600e60248201527f737461727473746f705f707572650000000000000000000000000000000000006044820152309250637f8b915c915060640160006040518083038186803b1580156107e857600080fd5b505afa1580156107fc573d6000803e3d6000fd5b505050507f885cb69240a935d632d79c317109709ecfa91a80626ff3989d68f67f5b1dd12d60001c73ffffffffffffffffffffffffffffffffffffffff166376eadd366040518163ffffffff1660e01b8152600401600060405180830381600087803b15801561086b57600080fd5b505af115801561087f573d6000803e3d6000fd5b50506040517f7e79255d00000000000000000000000000000000000000000000000000000000815260206004820152600f60248201527f737461727473746f705f63616c6c3300000000000000000000000000000000006044820152309250637e79255d9150606401600060405180830381600087803b15801561090257600080fd5b505af1158015610916573d6000803e3d6000fd5b505050506109586040518060400160405280600e81526020017f74657374696e67206e657374656400000000000000000000000000000000000081525061175b565b6040517f7fec2a8d0000000000000000000000000000000000000000000000000000000081526112346004820152737109709ecfa91a80626ff3989d68f67f5b1dd12d90637fec2a8d90602401600060405180830381600087803b1580156109bf57600080fd5b505af11580156109d3573d6000803e3d6000fd5b50506040517fa76ccdfa00000000000000000000000000000000000000000000000000000000815260206004820152600660248201527f6e65737465640000000000000000000000000000000000000000000000000000604482015230925063a76ccdfa9150606401600060405180830381600087803b158015610a5657600080fd5b505af1158015610a6a573d6000803e3d6000fd5b505050507f885cb69240a935d632d79c317109709ecfa91a80626ff3989d68f67f5b1dd12d60001c73ffffffffffffffffffffffffffffffffffffffff166376eadd366040518163ffffffff1660e01b8152600401600060405180830381600087803b158015610ad957600080fd5b505af1158015610aed573d6000803e3d6000fd5b50505050610b2f6040518060400160405280601381526020017f636f6e7472616374206465706c6f796d656e740000000000000000000000000081525061175b565b6040517fe6962cdb000000000000000000000000000000000000000000000000000000008152621234566004820152737109709ecfa91a80626ff3989d68f67f5b1dd12d9063e6962cdb90602401600060405180830381600087803b158015610b9757600080fd5b505af1158015610bab573d6000803e3d6000fd5b5050505060006104d2604051610bc090611a54565b908152602001604051809103906000f080158015610be2573d6000803e3d6000fd5b5090508073ffffffffffffffffffffffffffffffffffffffff1663c29855786040518163ffffffff1660e01b8152600401602060405180830381865afa158015610c30573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610c549190611baf565b6104d214610c6157600080fd5b610c9f6040518060400160405280600881526020017f637265617465203200000000000000000000000000000000000000000000000081525061175b565b6040517fe6962cdb00000000000000000000000000000000000000000000000000000000815261cafe6004820152737109709ecfa91a80626ff3989d68f67f5b1dd12d9063e6962cdb90602401600060405180830381600087803b158015610d0657600080fd5b505af1158015610d1a573d6000803e3d6000fd5b505050506000602a60001b6104d2604051610d3490611a54565b9081526020018190604051809103906000f5905080158015610d5a573d6000803e3d6000fd5b5090508073ffffffffffffffffffffffffffffffffffffffff1663c29855786040518163ffffffff1660e01b8152600401602060405180830381865afa158015610da8573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610dcc9190611baf565b6104d214610dd957600080fd5b610e176040518060400160405280600581526020017f646f6e652100000000000000000000000000000000000000000000000000000081525061175b565b7f885cb69240a935d632d79c317109709ecfa91a80626ff3989d68f67f5b1dd12d60001c73ffffffffffffffffffffffffffffffffffffffff1663afc980406040518163ffffffff1660e01b8152600401600060405180830381600087803b158015610e8257600080fd5b505af1158015610e96573d6000803e3d6000fd5b505050506104d2604051610ea990611a54565b908152602001604051809103906000f080158015610ecb573d6000803e3d6000fd5b5050604080518082018252600981527f6e6f6e636520656e640000000000000000000000000000000000000000000000602082015290517f2d0335ab0000000000000000000000000000000000000000000000000000000081523060048201526101749190737109709ecfa91a80626ff3989d68f67f5b1dd12d90632d0335ab90602401610340565b604080517f4777f3cf0000000000000000000000000000000000000000000000000000000081526004810191909152600c60448201527f4558414d504c455f424f4f4c0000000000000000000000000000000000000000606482015260006024820181905290737109709ecfa91a80626ff3989d68f67f5b1dd12d90634777f3cf90608401602060405180830381865afa158015610ff6573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061101a9190611bc8565b905061105b6040518060400160405280601381526020017f626f6f6c2076616c75652066726f6d20656e76000000000000000000000000008152508261190f565b61109a6040518060400160405280600d81526020017f636f6e7472616374206164647200000000000000000000000000000000000000815250306117ed565b604080518082018252600e81527f636f6e7472616374206e6f6e6365000000000000000000000000000000000000602082015290517f2d0335ab0000000000000000000000000000000000000000000000000000000081523060048201526111219190737109709ecfa91a80626ff3989d68f67f5b1dd12d90632d0335ab90602401610340565b6111606040518060400160405280600b81526020017f73656e6465722061646472000000000000000000000000000000000000000000815250336117ed565b604080518082018252600c81527f73656e646572206e6f6e63650000000000000000000000000000000000000000602082015290517f2d0335ab0000000000000000000000000000000000000000000000000000000081523360048201526111e79190737109709ecfa91a80626ff3989d68f67f5b1dd12d90632d0335ab90602401610340565b60408051808201825260208082527f7b22726f6f745f6b6579223a205b7b2261223a20312c202262223a20327d5d7d9082015290517f213e4198000000000000000000000000000000000000000000000000000000008152600090737109709ecfa91a80626ff3989d68f67f5b1dd12d9063213e41989061126c908590600401611c64565b600060405180830381865afa158015611289573d6000803e3d6000fd5b505050506040513d6000823e601f3d9081017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe01682016040526112cf9190810190611d34565b90506113456040518060400160405280600481526020017f6b657973000000000000000000000000000000000000000000000000000000008152508260008151811061131d5761131d611e68565b60200260200101518360018151811061133857611338611e68565b60200260200101516119a0565b6040517fa777d0dc00000000000000000000000000000000000000000000000000000000815260206004820152600d60248201527f66726f6d206f726967696e616c000000000000000000000000000000000000006044820152309063a777d0dc9060640160006040518083038186803b1580156113c257600080fd5b505afa1580156113d6573d6000803e3d6000fd5b50506040517f06447d5600000000000000000000000000000000000000000000000000000000815260426004820152737109709ecfa91a80626ff3989d68f67f5b1dd12d92506306447d569150602401600060405180830381600087803b15801561144057600080fd5b505af1158015611454573d6000803e3d6000fd5b50506040517fa777d0dc00000000000000000000000000000000000000000000000000000000815260206004820152600c60248201527f66726f6d207072616e6b20310000000000000000000000000000000000000000604482015230925063a777d0dc915060640160006040518083038186803b1580156114d557600080fd5b505afa1580156114e9573d6000803e3d6000fd5b5050505061152c6040518060400160405280601781526020017f706172656e742073636f7065206d73672e73656e646572000000000000000000815250336117ed565b61156b6040518060400160405280601a81526020017f706172656e742073636f706520636f6e74726163742e61646472000000000000815250306117ed565b6040517fa777d0dc00000000000000000000000000000000000000000000000000000000815260206004820152600c60248201527f66726f6d207072616e6b203200000000000000000000000000000000000000006044820152309063a777d0dc9060640160006040518083038186803b1580156115e857600080fd5b505afa1580156115fc573d6000803e3d6000fd5b505050507f885cb69240a935d632d79c317109709ecfa91a80626ff3989d68f67f5b1dd12d60001c73ffffffffffffffffffffffffffffffffffffffff166390c5013b6040518163ffffffff1660e01b8152600401600060405180830381600087803b15801561166b57600080fd5b505af115801561167f573d6000803e3d6000fd5b50506040517fa777d0dc00000000000000000000000000000000000000000000000000000000815260206004820152601360248201527f66726f6d206f726967696e616c20616761696e00000000000000000000000000604482015230925063a777d0dc915060640160006040518083038186803b15801561170057600080fd5b505afa158015611714573d6000803e3d6000fd5b505050506117566040518060400160405280600581526020017f646f6e652100000000000000000000000000000000000000000000000000000081525061175b565b505050565b6117ea8160405160240161176f9190611e97565b604080517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe08184030181529190526020810180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff167f41304fac00000000000000000000000000000000000000000000000000000000179052611a2f565b50565b6101748282604051602401611803929190611eaa565b604080517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe08184030181529190526020810180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff167f319af33300000000000000000000000000000000000000000000000000000000179052611a2f565b6101748282604051602401611894929190611ee2565b604080517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe08184030181529190526020810180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff167fb60e72cc00000000000000000000000000000000000000000000000000000000179052611a2f565b6101748282604051602401611925929190611f04565b604080517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe08184030181529190526020810180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff167fc3b5563500000000000000000000000000000000000000000000000000000000179052611a2f565b6117568383836040516024016119b893929190611f28565b604080517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe08184030181529190526020810180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff167f2ced7cef000000000000000000000000000000000000000000000000000000001790525b6117ea8180516a636f6e736f6c652e6c6f67602083016000808483855afa5050505050565b60b280611f6c83390190565b60008060208385031215611a7357600080fd5b823567ffffffffffffffff80821115611a8b57600080fd5b818501915085601f830112611a9f57600080fd5b813581811115611aae57600080fd5b866020828501011115611ac057600080fd5b60209290920196919550909350505050565b60007fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff8203611b2a577f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b5060010190565b60208152816020820152818360408301376000818301604090810191909152601f9092017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0160101919050565b600060208284031215611b9057600080fd5b815167ffffffffffffffff81168114611ba857600080fd5b9392505050565b600060208284031215611bc157600080fd5b5051919050565b600060208284031215611bda57600080fd5b81518015158114611ba857600080fd5b60005b83811015611c05578181015183820152602001611bed565b83811115611c14576000848401525b50505050565b60008151808452611c32816020860160208601611bea565b601f017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0169290920160200192915050565b604081526000611c776040830184611c1a565b8281036020840152600c81527f2e726f6f745f6b65795b305d000000000000000000000000000000000000000060208201526040810191505092915050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b604051601f82017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe016810167ffffffffffffffff81118282101715611d2c57611d2c611cb6565b604052919050565b60006020808385031215611d4757600080fd5b825167ffffffffffffffff80821115611d5f57600080fd5b8185019150601f8681840112611d7457600080fd5b825182811115611d8657611d86611cb6565b8060051b611d95868201611ce5565b918252848101860191868101908a841115611daf57600080fd5b87870192505b83831015611e5a57825186811115611dcd5760008081fd5b8701603f81018c13611ddf5760008081fd5b88810151604088821115611df557611df5611cb6565b611e248b7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe08a85011601611ce5565b8281528e82848601011115611e395760008081fd5b611e48838d8301848701611bea565b85525050509187019190870190611db5565b9a9950505050505050505050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b602081526000611ba86020830184611c1a565b604081526000611ebd6040830185611c1a565b905073ffffffffffffffffffffffffffffffffffffffff831660208301529392505050565b604081526000611ef56040830185611c1a565b90508260208301529392505050565b604081526000611f176040830185611c1a565b905082151560208301529392505050565b606081526000611f3b6060830186611c1a565b8281036020840152611f4d8186611c1a565b90508281036040840152611f618185611c1a565b969550505050505056fe608060405234801561001057600080fd5b506040516100b23803806100b283398101604081905261002f91610037565b600055610050565b60006020828403121561004957600080fd5b5051919050565b60548061005e6000396000f3fe6080604052348015600f57600080fd5b506004361060285760003560e01c8063c298557814602d575b600080fd5b603560005481565b60405190815260200160405180910390f3fea164736f6c634300080f000aa164736f6c634300080f000a","sourceMap":"2541:3359:0:-:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;2775:22;;;;;;;;;160:25:1;;;148:2;133:18;2775:22:0;;;;;;;5405:95;;;;;;:::i;:::-;;:::i;:::-;;5814:84;;;;;;:::i;:::-;;:::i;5607:98::-;;;;;;:::i;:::-;;:::i;5256:143::-;;;;;;:::i;:::-;;:::i;3903:1258::-;;;:::i;2887:949::-;;;:::i;5405:95::-;5459:7;:9;;;:7;:9;;;:::i;:::-;;;;;;5478:15;5490:2;;5478:15;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;5478:11:0;;-1:-1:-1;;;5478:15:0:i;:::-;5405:95;;:::o;5814:84::-;5876:15;5888:2;;5876:15;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;5876:11:0;;-1:-1:-1;;;5876:15:0:i;5607:98::-;5663:7;:9;;;:7;:9;;;:::i;:::-;;;;-1:-1:-1;;5682:16:0;;;;;:4;;:12;;:16;;5695:2;;;;5682:16;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;5607:98;;:::o;5256:143::-;5315:15;5327:2;;5315:15;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;5315:11:0;;-1:-1:-1;;;5315:15:0:i;:::-;5340:52;;;;;;;;;;;;;;;;;;5380:10;5340:11;:52::i;3903:1258::-;3944:63;;;;;;;;;;;;;;;;3979:26;;;;;3999:4;3979:26;;;1747:74:1;3944:63:0;;;3979:11;;;;1720:18:1;;3979:26:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;3971:35;;3944:11;:63::i;:::-;4018:29;;;;;;;;;;;;;;;;;;:11;:29::i;:::-;2634:28;2626:37;;4057:12;;;:14;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;4081:26:0;;;;;2327:2:1;4081:26:0;;;2309:21:1;2366:2;2346:18;;;2339:30;2405:14;2385:18;;;2378:42;4081:4:0;;-1:-1:-1;4081:10:0;;-1:-1:-1;2437:18:1;;4081:26:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;4117:26:0;;;;;2668:2:1;4117:26:0;;;2650:21:1;2707:2;2687:18;;;2680:30;2746:14;2726:18;;;2719:42;4117:4:0;;-1:-1:-1;4117:10:0;;-1:-1:-1;2778:18:1;;4117:26:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;4154:33;;;;;;;;;;;;;;;;;;:11;:33::i;:::-;4197:45;;;;;4231:8;4197:45;;;1747:74:1;4197:17:0;;;;1720:18:1;;4197:45:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;4252:29:0;;;;;3009:2:1;4252:29:0;;;2991:21:1;3048:2;3028:18;;;3021:30;3087:17;3067:18;;;3060:45;4252:4:0;;-1:-1:-1;4252:10:0;;-1:-1:-1;3122:18:1;;4252:29:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;4291:29:0;;;;;3353:2:1;4291:29:0;;;3335:21:1;3392:2;3372:18;;;3365:30;3431:17;3411:18;;;3404:45;4291:4:0;;-1:-1:-1;4291:10:0;;-1:-1:-1;3466:18:1;;4291:29:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;4330:31:0;;;;;3697:2:1;4330:31:0;;;3679:21:1;3736:2;3716:18;;;3709:30;3775:16;3755:18;;;3748:44;4330:4:0;;-1:-1:-1;4330:13:0;;-1:-1:-1;3809:18:1;;4330:31:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;2634:28;2626:37;;4371:16;;;:18;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;4399:29:0;;;;;4040:2:1;4399:29:0;;;4022:21:1;4079:2;4059:18;;;4052:30;4118:17;4098:18;;;4091:45;4399:4:0;;-1:-1:-1;4399:10:0;;-1:-1:-1;4153:18:1;;4399:29:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;4439;;;;;;;;;;;;;;;;;;:11;:29::i;:::-;4478:43;;;;;4512:6;4478:43;;;1747:74:1;4478:17:0;;;;1720:18:1;;4478:43:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;4531:22:0;;;;;4384:2:1;4531:22:0;;;4366:21:1;4423:1;4403:18;;;4396:29;4461:8;4441:18;;;4434:36;4531:4:0;;-1:-1:-1;4531:12:0;;-1:-1:-1;4487:18:1;;4531:22:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;2634:28;2626:37;;4563:16;;;:18;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;4592:34;;;;;;;;;;;;;;;;;;:11;:34::i;:::-;4636:40;;;;;4665:8;4636:40;;;1747:74:1;4636:12:0;;;;1720:18:1;;4636:40:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;4686:8;4708:4;4697:16;;;;;:::i;:::-;160:25:1;;;148:2;133:18;4697:16:0;;;;;;;;;;;;;;;;;;;;;;;4686:27;;4731:1;:5;;;:7;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;4742:4;4731:15;4723:24;;;;;;4758:23;;;;;;;;;;;;;;;;;;:11;:23::i;:::-;4791:38;;;;;4820:6;4791:38;;;1747:74:1;4791:12:0;;;;1720:18:1;;4791:38:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;4839:8;4883:2;4867:20;;4889:4;4850:44;;;;;:::i;:::-;160:25:1;;;148:2;133:18;4850:44:0;;;;;;;;;;;;;;;;;;;;;;;;;;;4839:55;;4912:1;:5;;;:7;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;4923:4;4912:15;4904:24;;;;;;4938:20;;;;;;;;;;;;;;;;;;:11;:20::i;:::-;2634:28;2626:37;;5042:12;;;:14;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;5077:4;5066:16;;;;;:::i;:::-;160:25:1;;;148:2;133:18;5066:16:0;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;5093:61:0;;;;;;;;;;;;;;;;5126:26;;;;;5146:4;5126:26;;;1747:74:1;5093:61:0;;;5126:11;;;;1720:18:1;;5126:26:0;1601:226:1;2887:949:0;2928:31;;;;;;;;;5104:21:1;;;;5161:2;5141:18;;;5134:30;5200:14;5180:18;;;5173:42;2919:6:0;5267:20:1;;;5260:52;;;2919:6:0;2928:8;;;;5232:19:1;;2928:31:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;2919:40;;2969:37;;;;;;;;;;;;;;;;;;3004:1;2969:11;:37::i;:::-;3017:43;;;;;;;;;;;;;;;;;;3054:4;3017:11;:43::i;:::-;3070:57;;;;;;;;;;;;;;;;3100:26;;;;;3120:4;3100:26;;;1747:74:1;3070:57:0;;;3100:11;;;;1720:18:1;;3100:26:0;1601:226:1;3070:57:0;3137:47;;;;;;;;;;;;;;;;;;3172:10;3137:11;:47::i;:::-;3194:61;;;;;;;;;;;;;;;;3222:32;;;;;3242:10;3222:32;;;1747:74:1;3194:61:0;;;3222:11;;;;1720:18:1;;3222:32:0;1601:226:1;3194:61:0;3266:55;;;;;;;;;;;;;;;;;3354:38;;;;;3266:18;;3354:16;;;;:38;;3266:55;;3354:38;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;3331:61;;3402:37;;;;;;;;;;;;;;;;;;3422:4;3427:1;3422:7;;;;;;;;:::i;:::-;;;;;;;3431:4;3436:1;3431:7;;;;;;;;:::i;:::-;;;;;;;3402:11;:37::i;:::-;3450:27;;;;;9413:2:1;3450:27:0;;;9395:21:1;9452:2;9432:18;;;9425:30;9491:15;9471:18;;;9464:43;3450:4:0;;:10;;9524:18:1;;3450:27:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;3487:37:0;;;;;3517:4;3487:37;;;1747:74:1;3487:13:0;;-1:-1:-1;3487:13:0;;-1:-1:-1;1720:18:1;;3487:37:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;3534:26:0;;;;;9755:2:1;3534:26:0;;;9737:21:1;9794:2;9774:18;;;9767:30;9833:14;9813:18;;;9806:42;3534:4:0;;-1:-1:-1;3534:10:0;;-1:-1:-1;9865:18:1;;3534:26:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;3570:59;;;;;;;;;;;;;;;;;;3617:10;3570:11;:59::i;:::-;3639:56;;;;;;;;;;;;;;;;;;3689:4;3639:11;:56::i;:::-;3705:26;;;;;10096:2:1;3705:26:0;;;10078:21:1;10135:2;10115:18;;;10108:30;10174:14;10154:18;;;10147:42;3705:4:0;;:10;;10206:18:1;;3705:26:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;2634:28;2626:37;;3741:12;;;:14;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;3765:33:0;;;;;10437:2:1;3765:33:0;;;10419:21:1;10476:2;10456:18;;;10449:30;10515:21;10495:18;;;10488:49;3765:4:0;;-1:-1:-1;3765:10:0;;-1:-1:-1;10554:18:1;;3765:33:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;3809:20;;;;;;;;;;;;;;;;;;:11;:20::i;:::-;2909:927;;;2887:949::o;1658:121::-;1713:59;1768:2;1729:42;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;1713:15;:59::i;:::-;1658:121;:::o;2081:145::-;2148:71;2211:2;2215;2164:54;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;2148:15;:71::i;1930:145::-;1997:71;2060:2;2064;2013:54;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;1997:15;:71::i;1785:139::-;1849:68;1909:2;1913;1865:51;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;1849:15;:68::i;2232:179::-;2323:81;2392:2;2396;2400;2339:64;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;1133:133;1204:55;1251:7;1370:14;;856:42;1543:2;1530:16;;1346:21;;1370:14;1530:16;856:42;1579:5;1568:68;1559:77;;1496:150;;1272:380;:::o;-1:-1:-1:-;;;;;;;;:::o;196:592:1:-;267:6;275;328:2;316:9;307:7;303:23;299:32;296:52;;;344:1;341;334:12;296:52;384:9;371:23;413:18;454:2;446:6;443:14;440:34;;;470:1;467;460:12;440:34;508:6;497:9;493:22;483:32;;553:7;546:4;542:2;538:13;534:27;524:55;;575:1;572;565:12;524:55;615:2;602:16;641:2;633:6;630:14;627:34;;;657:1;654;647:12;627:34;702:7;697:2;688:6;684:2;680:15;676:24;673:37;670:57;;;723:1;720;713:12;670:57;754:2;746:11;;;;;776:6;;-1:-1:-1;196:592:1;;-1:-1:-1;;;;196:592:1:o;793:349::-;832:3;863:66;856:5;853:77;850:257;;963:77;960:1;953:88;1064:4;1061:1;1054:15;1092:4;1089:1;1082:15;850:257;-1:-1:-1;1134:1:1;1123:13;;793:349::o;1147:449::-;1306:2;1295:9;1288:21;1345:6;1340:2;1329:9;1325:18;1318:34;1402:6;1394;1389:2;1378:9;1374:18;1361:48;1458:1;1429:22;;;1453:2;1425:31;;;1418:42;;;;1512:2;1500:15;;;1517:66;1496:88;1481:104;1477:113;;1147:449;-1:-1:-1;1147:449:1:o;1832:288::-;1901:6;1954:2;1942:9;1933:7;1929:23;1925:32;1922:52;;;1970:1;1967;1960:12;1922:52;2002:9;1996:16;2052:18;2045:5;2041:30;2034:5;2031:41;2021:69;;2086:1;2083;2076:12;2021:69;2109:5;1832:288;-1:-1:-1;;;1832:288:1:o;4709:184::-;4779:6;4832:2;4820:9;4811:7;4807:23;4803:32;4800:52;;;4848:1;4845;4838:12;4800:52;-1:-1:-1;4871:16:1;;4709:184;-1:-1:-1;4709:184:1:o;5323:277::-;5390:6;5443:2;5431:9;5422:7;5418:23;5414:32;5411:52;;;5459:1;5456;5449:12;5411:52;5491:9;5485:16;5544:5;5537:13;5530:21;5523:5;5520:32;5510:60;;5566:1;5563;5556:12;5605:258;5677:1;5687:113;5701:6;5698:1;5695:13;5687:113;;;5777:11;;;5771:18;5758:11;;;5751:39;5723:2;5716:10;5687:113;;;5818:6;5815:1;5812:13;5809:48;;;5853:1;5844:6;5839:3;5835:16;5828:27;5809:48;;5605:258;;;:::o;5868:317::-;5910:3;5948:5;5942:12;5975:6;5970:3;5963:19;5991:63;6047:6;6040:4;6035:3;6031:14;6024:4;6017:5;6013:16;5991:63;:::i;:::-;6099:2;6087:15;6104:66;6083:88;6074:98;;;;6174:4;6070:109;;5868:317;-1:-1:-1;;5868:317:1:o;6190:493::-;6440:2;6429:9;6422:21;6403:4;6466:45;6507:2;6496:9;6492:18;6484:6;6466:45;:::i;:::-;6559:9;6551:6;6547:22;6542:2;6531:9;6527:18;6520:50;6594:2;6586:6;6579:18;6630:14;6625:2;6617:6;6613:15;6606:39;6674:2;6666:6;6662:15;6654:23;;;6190:493;;;;:::o;6688:184::-;6740:77;6737:1;6730:88;6837:4;6834:1;6827:15;6861:4;6858:1;6851:15;6877:334;6948:2;6942:9;7004:2;6994:13;;7009:66;6990:86;6978:99;;7107:18;7092:34;;7128:22;;;7089:62;7086:88;;;7154:18;;:::i;:::-;7190:2;7183:22;6877:334;;-1:-1:-1;6877:334:1:o;7216:1801::-;7321:6;7352:2;7395;7383:9;7374:7;7370:23;7366:32;7363:52;;;7411:1;7408;7401:12;7363:52;7444:9;7438:16;7473:18;7514:2;7506:6;7503:14;7500:34;;;7530:1;7527;7520:12;7500:34;7568:6;7557:9;7553:22;7543:32;;7594:4;7634:7;7629:2;7625;7621:11;7617:25;7607:53;;7656:1;7653;7646:12;7607:53;7685:2;7679:9;7707:2;7703;7700:10;7697:36;;;7713:18;;:::i;:::-;7759:2;7756:1;7752:10;7782:28;7806:2;7802;7798:11;7782:28;:::i;:::-;7844:15;;;7914:11;;;7910:20;;;7875:12;;;;7942:19;;;7939:39;;;7974:1;7971;7964:12;7939:39;8006:2;8002;7998:11;7987:22;;8018:969;8034:6;8029:3;8026:15;8018:969;;;8113:3;8107:10;8149:2;8136:11;8133:19;8130:109;;;8193:1;8222:2;8218;8211:14;8130:109;8262:20;;8317:2;8309:11;;8305:25;-1:-1:-1;8295:123:1;;8372:1;8401:2;8397;8390:14;8295:123;8456:2;8452;8448:11;8442:18;8484:2;8510;8505:3;8502:11;8499:37;;;8516:18;;:::i;:::-;8562:111;8669:2;8600:66;8595:2;8590:3;8586:12;8582:85;8578:94;8562:111;:::i;:::-;8700:3;8693:5;8686:18;8747:7;8741:3;8735;8731:2;8727:12;8723:22;8720:35;8717:128;;;8797:1;8827:3;8822;8815:16;8717:128;8858:56;8910:3;8905:2;8898:5;8894:14;8888:3;8884:2;8880:12;8858:56;:::i;:::-;8927:18;;-1:-1:-1;;;8051:12:1;;;;8965;;;;8018:969;;;9006:5;7216:1801;-1:-1:-1;;;;;;;;;;7216:1801:1:o;9022:184::-;9074:77;9071:1;9064:88;9171:4;9168:1;9161:15;9195:4;9192:1;9185:15;10583:220;10732:2;10721:9;10714:21;10695:4;10752:45;10793:2;10782:9;10778:18;10770:6;10752:45;:::i;10808:340::-;10985:2;10974:9;10967:21;10948:4;11005:45;11046:2;11035:9;11031:18;11023:6;11005:45;:::i;:::-;10997:53;;11098:42;11090:6;11086:55;11081:2;11070:9;11066:18;11059:83;10808:340;;;;;:::o;11153:291::-;11330:2;11319:9;11312:21;11293:4;11350:45;11391:2;11380:9;11376:18;11368:6;11350:45;:::i;:::-;11342:53;;11431:6;11426:2;11415:9;11411:18;11404:34;11153:291;;;;;:::o;11449:301::-;11620:2;11609:9;11602:21;11583:4;11640:45;11681:2;11670:9;11666:18;11658:6;11640:45;:::i;:::-;11632:53;;11735:6;11728:14;11721:22;11716:2;11705:9;11701:18;11694:50;11449:301;;;;;:::o;11755:546::-;12000:2;11989:9;11982:21;11963:4;12026:45;12067:2;12056:9;12052:18;12044:6;12026:45;:::i;:::-;12119:9;12111:6;12107:22;12102:2;12091:9;12087:18;12080:50;12153:33;12179:6;12171;12153:33;:::i;:::-;12139:47;;12234:9;12226:6;12222:22;12217:2;12206:9;12202:18;12195:50;12262:33;12288:6;12280;12262:33;:::i;:::-;12254:41;11755:546;-1:-1:-1;;;;;;11755:546:1:o","linkReferences":{}},"methodIdentifiers":{"call1(string)":"7e79255d","call2(string)":"8d3ef7ca","callPure(string)":"7f8b915c","counter()":"61bc221a","hello(string)":"a777d0dc","nested1(string)":"a76ccdfa","nested2(string)":"dbf1282f","run()":"c0406226","runBroadcast()":"bef03abc"},"rawMetadata":"{\"compiler\":{\"version\":\"0.8.15+commit.e14f2714\"},\"language\":\"Solidity\",\"output\":{\"abi\":[{\"inputs\":[{\"internalType\":\"string\",\"name\":\"_v\",\"type\":\"string\"}],\"name\":\"call1\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"string\",\"name\":\"_v\",\"type\":\"string\"}],\"name\":\"call2\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"string\",\"name\":\"_v\",\"type\":\"string\"}],\"name\":\"callPure\",\"outputs\":[],\"stateMutability\":\"pure\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"counter\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"\",\"type\":\"uint256\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"string\",\"name\":\"_v\",\"type\":\"string\"}],\"name\":\"hello\",\"outputs\":[],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"string\",\"name\":\"_v\",\"type\":\"string\"}],\"name\":\"nested1\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"string\",\"name\":\"_v\",\"type\":\"string\"}],\"name\":\"nested2\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"run\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"runBroadcast\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"}],\"devdoc\":{\"kind\":\"dev\",\"methods\":{},\"title\":\"ScriptExample\",\"version\":1},\"userdoc\":{\"kind\":\"user\",\"methods\":{\"hello(string)\":{\"notice\":\"example external function, to force a CALL, and test vm.startPrank with.\"},\"run()\":{\"notice\":\"example function, runs through basic cheat-codes and console logs.\"},\"runBroadcast()\":{\"notice\":\"example function, to test vm.broadcast with.\"}},\"notice\":\"ScriptExample is an example script. The Go forge script code tests that it can run this.\",\"version\":1}},\"settings\":{\"compilationTarget\":{\"scripts/ScriptExample.s.sol\":\"ScriptExample\"},\"evmVersion\":\"london\",\"libraries\":{},\"metadata\":{\"bytecodeHash\":\"none\"},\"optimizer\":{\"enabled\":true,\"runs\":999999},\"remappings\":[]},\"sources\":{\"scripts/ScriptExample.s.sol\":{\"keccak256\":\"0x8d1dfa41908e7ccc3a498a2a2aa51c5275bedbb904ce32d08f8598e36f896d8d\",\"license\":\"MIT\",\"urls\":[\"bzz-raw://5117bb7158363cae8b9dc0508d2852692fd36172f1c699ff680afbb5acebe1f3\",\"dweb:/ipfs/QmQdahJ8SPKfJ4yea5Ge9qaj5qh1TxVffhHvaWytBaL95h\"]}},\"version\":1}","metadata":{"compiler":{"version":"0.8.15+commit.e14f2714"},"language":"Solidity","output":{"abi":[{"inputs":[{"internalType":"string","name":"_v","type":"string"}],"stateMutability":"nonpayable","type":"function","name":"call1"},{"inputs":[{"internalType":"string","name":"_v","type":"string"}],"stateMutability":"nonpayable","type":"function","name":"call2"},{"inputs":[{"internalType":"string","name":"_v","type":"string"}],"stateMutability":"pure","type":"function","name":"callPure"},{"inputs":[],"stateMutability":"view","type":"function","name":"counter","outputs":[{"internalType":"uint256","name":"","type":"uint256"}]},{"inputs":[{"internalType":"string","name":"_v","type":"string"}],"stateMutability":"view","type":"function","name":"hello"},{"inputs":[{"internalType":"string","name":"_v","type":"string"}],"stateMutability":"nonpayable","type":"function","name":"nested1"},{"inputs":[{"internalType":"string","name":"_v","type":"string"}],"stateMutability":"nonpayable","type":"function","name":"nested2"},{"inputs":[],"stateMutability":"nonpayable","type":"function","name":"run"},{"inputs":[],"stateMutability":"nonpayable","type":"function","name":"runBroadcast"}],"devdoc":{"kind":"dev","methods":{},"version":1},"userdoc":{"kind":"user","methods":{"hello(string)":{"notice":"example external function, to force a CALL, and test vm.startPrank with."},"run()":{"notice":"example function, runs through basic cheat-codes and console logs."},"runBroadcast()":{"notice":"example function, to test vm.broadcast with."}},"version":1}},"settings":{"remappings":[],"optimizer":{"enabled":true,"runs":999999},"metadata":{"bytecodeHash":"none"},"compilationTarget":{"scripts/ScriptExample.s.sol":"ScriptExample"},"evmVersion":"london","libraries":{}},"sources":{"scripts/ScriptExample.s.sol":{"keccak256":"0x8d1dfa41908e7ccc3a498a2a2aa51c5275bedbb904ce32d08f8598e36f896d8d","urls":["bzz-raw://5117bb7158363cae8b9dc0508d2852692fd36172f1c699ff680afbb5acebe1f3","dweb:/ipfs/QmQdahJ8SPKfJ4yea5Ge9qaj5qh1TxVffhHvaWytBaL95h"],"license":"MIT"}},"version":1},"storageLayout":{"storage":[{"astId":215,"contract":"scripts/ScriptExample.s.sol:ScriptExample","label":"counter","offset":0,"slot":"0","type":"t_uint256"}],"types":{"t_uint256":{"encoding":"inplace","label":"uint256","numberOfBytes":"32"}}},"userdoc":{"version":1,"kind":"user","methods":{"hello(string)":{"notice":"example external function, to force a CALL, and test vm.startPrank with."},"run()":{"notice":"example function, runs through basic cheat-codes and console logs."},"runBroadcast()":{"notice":"example function, to test vm.broadcast with."}},"notice":"ScriptExample is an example script. The Go forge script code tests that it can run this."},"devdoc":{"version":1,"kind":"dev","title":"ScriptExample"},"ast":{"absolutePath":"scripts/ScriptExample.s.sol","id":720,"exportedSymbols":{"FooBar":[719],"ScriptExample":[706],"Vm":[55],"console":[192]},"nodeType":"SourceUnit","src":"32:5967:0","nodes":[{"id":1,"nodeType":"PragmaDirective","src":"32:23:0","nodes":[],"literals":["solidity","0.8",".15"]},{"id":55,"nodeType":"ContractDefinition","src":"120:616:0","nodes":[{"id":10,"nodeType":"FunctionDefinition","src":"139:91:0","nodes":[],"functionSelector":"4777f3cf","implemented":false,"kind":"function","modifiers":[],"name":"envOr","nameLocation":"148:5:0","parameters":{"id":6,"nodeType":"ParameterList","parameters":[{"constant":false,"id":3,"mutability":"mutable","name":"name","nameLocation":"170:4:0","nodeType":"VariableDeclaration","scope":10,"src":"154:20:0","stateVariable":false,"storageLocation":"calldata","typeDescriptions":{"typeIdentifier":"t_string_calldata_ptr","typeString":"string"},"typeName":{"id":2,"name":"string","nodeType":"ElementaryTypeName","src":"154:6:0","typeDescriptions":{"typeIdentifier":"t_string_storage_ptr","typeString":"string"}},"visibility":"internal"},{"constant":false,"id":5,"mutability":"mutable","name":"defaultValue","nameLocation":"181:12:0","nodeType":"VariableDeclaration","scope":10,"src":"176:17:0","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_bool","typeString":"bool"},"typeName":{"id":4,"name":"bool","nodeType":"ElementaryTypeName","src":"176:4:0","typeDescriptions":{"typeIdentifier":"t_bool","typeString":"bool"}},"visibility":"internal"}],"src":"153:41:0"},"returnParameters":{"id":9,"nodeType":"ParameterList","parameters":[{"constant":false,"id":8,"mutability":"mutable","name":"value","nameLocation":"223:5:0","nodeType":"VariableDeclaration","scope":10,"src":"218:10:0","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_bool","typeString":"bool"},"typeName":{"id":7,"name":"bool","nodeType":"ElementaryTypeName","src":"218:4:0","typeDescriptions":{"typeIdentifier":"t_bool","typeString":"bool"}},"visibility":"internal"}],"src":"217:12:0"},"scope":55,"stateMutability":"view","virtual":false,"visibility":"external"},{"id":17,"nodeType":"FunctionDefinition","src":"235:72:0","nodes":[],"functionSelector":"2d0335ab","implemented":false,"kind":"function","modifiers":[],"name":"getNonce","nameLocation":"244:8:0","parameters":{"id":13,"nodeType":"ParameterList","parameters":[{"constant":false,"id":12,"mutability":"mutable","name":"account","nameLocation":"261:7:0","nodeType":"VariableDeclaration","scope":17,"src":"253:15:0","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"},"typeName":{"id":11,"name":"address","nodeType":"ElementaryTypeName","src":"253:7:0","stateMutability":"nonpayable","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"}},"visibility":"internal"}],"src":"252:17:0"},"returnParameters":{"id":16,"nodeType":"ParameterList","parameters":[{"constant":false,"id":15,"mutability":"mutable","name":"nonce","nameLocation":"300:5:0","nodeType":"VariableDeclaration","scope":17,"src":"293:12:0","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_uint64","typeString":"uint64"},"typeName":{"id":14,"name":"uint64","nodeType":"ElementaryTypeName","src":"293:6:0","typeDescriptions":{"typeIdentifier":"t_uint64","typeString":"uint64"}},"visibility":"internal"}],"src":"292:14:0"},"scope":55,"stateMutability":"view","virtual":false,"visibility":"external"},{"id":27,"nodeType":"FunctionDefinition","src":"312:111:0","nodes":[],"functionSelector":"213e4198","implemented":false,"kind":"function","modifiers":[],"name":"parseJsonKeys","nameLocation":"321:13:0","parameters":{"id":22,"nodeType":"ParameterList","parameters":[{"constant":false,"id":19,"mutability":"mutable","name":"json","nameLocation":"351:4:0","nodeType":"VariableDeclaration","scope":27,"src":"335:20:0","stateVariable":false,"storageLocation":"calldata","typeDescriptions":{"typeIdentifier":"t_string_calldata_ptr","typeString":"string"},"typeName":{"id":18,"name":"string","nodeType":"ElementaryTypeName","src":"335:6:0","typeDescriptions":{"typeIdentifier":"t_string_storage_ptr","typeString":"string"}},"visibility":"internal"},{"constant":false,"id":21,"mutability":"mutable","name":"key","nameLocation":"373:3:0","nodeType":"VariableDeclaration","scope":27,"src":"357:19:0","stateVariable":false,"storageLocation":"calldata","typeDescriptions":{"typeIdentifier":"t_string_calldata_ptr","typeString":"string"},"typeName":{"id":20,"name":"string","nodeType":"ElementaryTypeName","src":"357:6:0","typeDescriptions":{"typeIdentifier":"t_string_storage_ptr","typeString":"string"}},"visibility":"internal"}],"src":"334:43:0"},"returnParameters":{"id":26,"nodeType":"ParameterList","parameters":[{"constant":false,"id":25,"mutability":"mutable","name":"keys","nameLocation":"417:4:0","nodeType":"VariableDeclaration","scope":27,"src":"401:20:0","stateVariable":false,"storageLocation":"memory","typeDescriptions":{"typeIdentifier":"t_array$_t_string_memory_ptr_$dyn_memory_ptr","typeString":"string[]"},"typeName":{"baseType":{"id":23,"name":"string","nodeType":"ElementaryTypeName","src":"401:6:0","typeDescriptions":{"typeIdentifier":"t_string_storage_ptr","typeString":"string"}},"id":24,"nodeType":"ArrayTypeName","src":"401:8:0","typeDescriptions":{"typeIdentifier":"t_array$_t_string_storage_$dyn_storage_ptr","typeString":"string[]"}},"visibility":"internal"}],"src":"400:22:0"},"scope":55,"stateMutability":"pure","virtual":false,"visibility":"external"},{"id":32,"nodeType":"FunctionDefinition","src":"428:48:0","nodes":[],"functionSelector":"06447d56","implemented":false,"kind":"function","modifiers":[],"name":"startPrank","nameLocation":"437:10:0","parameters":{"id":30,"nodeType":"ParameterList","parameters":[{"constant":false,"id":29,"mutability":"mutable","name":"msgSender","nameLocation":"456:9:0","nodeType":"VariableDeclaration","scope":32,"src":"448:17:0","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"},"typeName":{"id":28,"name":"address","nodeType":"ElementaryTypeName","src":"448:7:0","stateMutability":"nonpayable","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"}},"visibility":"internal"}],"src":"447:19:0"},"returnParameters":{"id":31,"nodeType":"ParameterList","parameters":[],"src":"475:0:0"},"scope":55,"stateMutability":"nonpayable","virtual":false,"visibility":"external"},{"id":35,"nodeType":"FunctionDefinition","src":"481:30:0","nodes":[],"functionSelector":"90c5013b","implemented":false,"kind":"function","modifiers":[],"name":"stopPrank","nameLocation":"490:9:0","parameters":{"id":33,"nodeType":"ParameterList","parameters":[],"src":"499:2:0"},"returnParameters":{"id":34,"nodeType":"ParameterList","parameters":[],"src":"510:0:0"},"scope":55,"stateMutability":"nonpayable","virtual":false,"visibility":"external"},{"id":38,"nodeType":"FunctionDefinition","src":"516:30:0","nodes":[],"functionSelector":"afc98040","implemented":false,"kind":"function","modifiers":[],"name":"broadcast","nameLocation":"525:9:0","parameters":{"id":36,"nodeType":"ParameterList","parameters":[],"src":"534:2:0"},"returnParameters":{"id":37,"nodeType":"ParameterList","parameters":[],"src":"545:0:0"},"scope":55,"stateMutability":"nonpayable","virtual":false,"visibility":"external"},{"id":43,"nodeType":"FunctionDefinition","src":"551:47:0","nodes":[],"functionSelector":"e6962cdb","implemented":false,"kind":"function","modifiers":[],"name":"broadcast","nameLocation":"560:9:0","parameters":{"id":41,"nodeType":"ParameterList","parameters":[{"constant":false,"id":40,"mutability":"mutable","name":"msgSender","nameLocation":"578:9:0","nodeType":"VariableDeclaration","scope":43,"src":"570:17:0","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"},"typeName":{"id":39,"name":"address","nodeType":"ElementaryTypeName","src":"570:7:0","stateMutability":"nonpayable","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"}},"visibility":"internal"}],"src":"569:19:0"},"returnParameters":{"id":42,"nodeType":"ParameterList","parameters":[],"src":"597:0:0"},"scope":55,"stateMutability":"nonpayable","virtual":false,"visibility":"external"},{"id":48,"nodeType":"FunctionDefinition","src":"603:52:0","nodes":[],"functionSelector":"7fec2a8d","implemented":false,"kind":"function","modifiers":[],"name":"startBroadcast","nameLocation":"612:14:0","parameters":{"id":46,"nodeType":"ParameterList","parameters":[{"constant":false,"id":45,"mutability":"mutable","name":"msgSender","nameLocation":"635:9:0","nodeType":"VariableDeclaration","scope":48,"src":"627:17:0","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"},"typeName":{"id":44,"name":"address","nodeType":"ElementaryTypeName","src":"627:7:0","stateMutability":"nonpayable","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"}},"visibility":"internal"}],"src":"626:19:0"},"returnParameters":{"id":47,"nodeType":"ParameterList","parameters":[],"src":"654:0:0"},"scope":55,"stateMutability":"nonpayable","virtual":false,"visibility":"external"},{"id":51,"nodeType":"FunctionDefinition","src":"660:35:0","nodes":[],"functionSelector":"7fb5297f","implemented":false,"kind":"function","modifiers":[],"name":"startBroadcast","nameLocation":"669:14:0","parameters":{"id":49,"nodeType":"ParameterList","parameters":[],"src":"683:2:0"},"returnParameters":{"id":50,"nodeType":"ParameterList","parameters":[],"src":"694:0:0"},"scope":55,"stateMutability":"nonpayable","virtual":false,"visibility":"external"},{"id":54,"nodeType":"FunctionDefinition","src":"700:34:0","nodes":[],"functionSelector":"76eadd36","implemented":false,"kind":"function","modifiers":[],"name":"stopBroadcast","nameLocation":"709:13:0","parameters":{"id":52,"nodeType":"ParameterList","parameters":[],"src":"722:2:0"},"returnParameters":{"id":53,"nodeType":"ParameterList","parameters":[],"src":"733:0:0"},"scope":55,"stateMutability":"nonpayable","virtual":false,"visibility":"external"}],"abstract":false,"baseContracts":[],"canonicalName":"Vm","contractDependencies":[],"contractKind":"interface","fullyImplemented":false,"linearizedBaseContracts":[55],"name":"Vm","nameLocation":"130:2:0","scope":720,"usedErrors":[]},{"id":192,"nodeType":"ContractDefinition","src":"791:1622:0","nodes":[{"id":61,"nodeType":"VariableDeclaration","src":"813:86:0","nodes":[],"constant":true,"mutability":"constant","name":"CONSOLE_ADDRESS","nameLocation":"830:15:0","scope":192,"stateVariable":true,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"},"typeName":{"id":56,"name":"address","nodeType":"ElementaryTypeName","src":"813:7:0","stateMutability":"nonpayable","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"}},"value":{"arguments":[{"hexValue":"307830303030303030303030303030303030303036333646366537333646366336353265366336663637","id":59,"isConstant":false,"isLValue":false,"isPure":true,"kind":"number","lValueRequested":false,"nodeType":"Literal","src":"856:42:0","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"},"value":"0x000000000000000000636F6e736F6c652e6c6f67"}],"expression":{"argumentTypes":[{"typeIdentifier":"t_address","typeString":"address"}],"id":58,"isConstant":false,"isLValue":false,"isPure":true,"lValueRequested":false,"nodeType":"ElementaryTypeNameExpression","src":"848:7:0","typeDescriptions":{"typeIdentifier":"t_type$_t_address_$","typeString":"type(address)"},"typeName":{"id":57,"name":"address","nodeType":"ElementaryTypeName","src":"848:7:0","typeDescriptions":{}}},"id":60,"isConstant":false,"isLValue":false,"isPure":true,"kind":"typeConversion","lValueRequested":false,"names":[],"nodeType":"FunctionCall","src":"848:51:0","tryCall":false,"typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"}},"visibility":"internal"},{"id":78,"nodeType":"FunctionDefinition","src":"906:221:0","nodes":[],"body":{"id":77,"nodeType":"Block","src":"1065:62:0","nodes":[],"statements":[{"AST":{"nodeType":"YulBlock","src":"1084:37:0","statements":[{"nodeType":"YulAssignment","src":"1098:13:0","value":{"name":"fnIn","nodeType":"YulIdentifier","src":"1107:4:0"},"variableNames":[{"name":"fnOut","nodeType":"YulIdentifier","src":"1098:5:0"}]}]},"evmVersion":"london","externalReferences":[{"declaration":67,"isOffset":false,"isSlot":false,"src":"1107:4:0","valueSize":1},{"declaration":74,"isOffset":false,"isSlot":false,"src":"1098:5:0","valueSize":1}],"id":76,"nodeType":"InlineAssembly","src":"1075:46:0"}]},"implemented":true,"kind":"function","modifiers":[],"name":"_castLogPayloadViewToPure","nameLocation":"915:25:0","parameters":{"id":68,"nodeType":"ParameterList","parameters":[{"constant":false,"id":67,"mutability":"mutable","name":"fnIn","nameLocation":"987:4:0","nodeType":"VariableDeclaration","scope":78,"src":"950:41:0","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_function_internal_view$_t_bytes_memory_ptr_$returns$__$","typeString":"function (bytes) view"},"typeName":{"id":66,"nodeType":"FunctionTypeName","parameterTypes":{"id":64,"nodeType":"ParameterList","parameters":[{"constant":false,"id":63,"mutability":"mutable","name":"","nameLocation":"-1:-1:-1","nodeType":"VariableDeclaration","scope":66,"src":"959:12:0","stateVariable":false,"storageLocation":"memory","typeDescriptions":{"typeIdentifier":"t_bytes_memory_ptr","typeString":"bytes"},"typeName":{"id":62,"name":"bytes","nodeType":"ElementaryTypeName","src":"959:5:0","typeDescriptions":{"typeIdentifier":"t_bytes_storage_ptr","typeString":"bytes"}},"visibility":"internal"}],"src":"958:14:0"},"returnParameterTypes":{"id":65,"nodeType":"ParameterList","parameters":[],"src":"987:0:0"},"src":"950:41:0","stateMutability":"view","typeDescriptions":{"typeIdentifier":"t_function_internal_view$_t_bytes_memory_ptr_$returns$__$","typeString":"function (bytes) view"},"visibility":"internal"},"visibility":"internal"}],"src":"940:57:0"},"returnParameters":{"id":75,"nodeType":"ParameterList","parameters":[{"constant":false,"id":74,"mutability":"mutable","name":"fnOut","nameLocation":"1058:5:0","nodeType":"VariableDeclaration","scope":78,"src":"1021:42:0","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_function_internal_pure$_t_bytes_memory_ptr_$returns$__$","typeString":"function (bytes) pure"},"typeName":{"id":73,"nodeType":"FunctionTypeName","parameterTypes":{"id":71,"nodeType":"ParameterList","parameters":[{"constant":false,"id":70,"mutability":"mutable","name":"","nameLocation":"-1:-1:-1","nodeType":"VariableDeclaration","scope":73,"src":"1030:12:0","stateVariable":false,"storageLocation":"memory","typeDescriptions":{"typeIdentifier":"t_bytes_memory_ptr","typeString":"bytes"},"typeName":{"id":69,"name":"bytes","nodeType":"ElementaryTypeName","src":"1030:5:0","typeDescriptions":{"typeIdentifier":"t_bytes_storage_ptr","typeString":"bytes"}},"visibility":"internal"}],"src":"1029:14:0"},"returnParameterTypes":{"id":72,"nodeType":"ParameterList","parameters":[],"src":"1058:0:0"},"src":"1021:42:0","stateMutability":"pure","typeDescriptions":{"typeIdentifier":"t_function_internal_pure$_t_bytes_memory_ptr_$returns$__$","typeString":"function (bytes) pure"},"visibility":"internal"},"visibility":"internal"}],"src":"1020:44:0"},"scope":192,"stateMutability":"pure","virtual":false,"visibility":"internal"},{"id":90,"nodeType":"FunctionDefinition","src":"1133:133:0","nodes":[],"body":{"id":89,"nodeType":"Block","src":"1194:72:0","nodes":[],"statements":[{"expression":{"arguments":[{"id":86,"name":"payload","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":80,"src":"1251:7:0","typeDescriptions":{"typeIdentifier":"t_bytes_memory_ptr","typeString":"bytes memory"}}],"expression":{"argumentTypes":[{"typeIdentifier":"t_bytes_memory_ptr","typeString":"bytes memory"}],"arguments":[{"id":84,"name":"_sendLogPayloadView","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":106,"src":"1230:19:0","typeDescriptions":{"typeIdentifier":"t_function_internal_view$_t_bytes_memory_ptr_$returns$__$","typeString":"function (bytes memory) view"}}],"expression":{"argumentTypes":[{"typeIdentifier":"t_function_internal_view$_t_bytes_memory_ptr_$returns$__$","typeString":"function (bytes memory) view"}],"id":83,"name":"_castLogPayloadViewToPure","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":78,"src":"1204:25:0","typeDescriptions":{"typeIdentifier":"t_function_internal_pure$_t_function_internal_view$_t_bytes_memory_ptr_$returns$__$_$returns$_t_function_internal_pure$_t_bytes_memory_ptr_$returns$__$_$","typeString":"function (function (bytes memory) view) pure returns (function (bytes memory) pure)"}},"id":85,"isConstant":false,"isLValue":false,"isPure":false,"kind":"functionCall","lValueRequested":false,"names":[],"nodeType":"FunctionCall","src":"1204:46:0","tryCall":false,"typeDescriptions":{"typeIdentifier":"t_function_internal_pure$_t_bytes_memory_ptr_$returns$__$","typeString":"function (bytes memory) pure"}},"id":87,"isConstant":false,"isLValue":false,"isPure":false,"kind":"functionCall","lValueRequested":false,"names":[],"nodeType":"FunctionCall","src":"1204:55:0","tryCall":false,"typeDescriptions":{"typeIdentifier":"t_tuple$__$","typeString":"tuple()"}},"id":88,"nodeType":"ExpressionStatement","src":"1204:55:0"}]},"implemented":true,"kind":"function","modifiers":[],"name":"_sendLogPayload","nameLocation":"1142:15:0","parameters":{"id":81,"nodeType":"ParameterList","parameters":[{"constant":false,"id":80,"mutability":"mutable","name":"payload","nameLocation":"1171:7:0","nodeType":"VariableDeclaration","scope":90,"src":"1158:20:0","stateVariable":false,"storageLocation":"memory","typeDescriptions":{"typeIdentifier":"t_bytes_memory_ptr","typeString":"bytes"},"typeName":{"id":79,"name":"bytes","nodeType":"ElementaryTypeName","src":"1158:5:0","typeDescriptions":{"typeIdentifier":"t_bytes_storage_ptr","typeString":"bytes"}},"visibility":"internal"}],"src":"1157:22:0"},"returnParameters":{"id":82,"nodeType":"ParameterList","parameters":[],"src":"1194:0:0"},"scope":192,"stateMutability":"pure","virtual":false,"visibility":"internal"},{"id":106,"nodeType":"FunctionDefinition","src":"1272:380:0","nodes":[],"body":{"id":105,"nodeType":"Block","src":"1336:316:0","nodes":[],"statements":[{"assignments":[96],"declarations":[{"constant":false,"id":96,"mutability":"mutable","name":"payloadLength","nameLocation":"1354:13:0","nodeType":"VariableDeclaration","scope":105,"src":"1346:21:0","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"},"typeName":{"id":95,"name":"uint256","nodeType":"ElementaryTypeName","src":"1346:7:0","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"visibility":"internal"}],"id":99,"initialValue":{"expression":{"id":97,"name":"payload","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":92,"src":"1370:7:0","typeDescriptions":{"typeIdentifier":"t_bytes_memory_ptr","typeString":"bytes memory"}},"id":98,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"memberName":"length","nodeType":"MemberAccess","src":"1370:14:0","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"nodeType":"VariableDeclarationStatement","src":"1346:38:0"},{"assignments":[101],"declarations":[{"constant":false,"id":101,"mutability":"mutable","name":"consoleAddress","nameLocation":"1402:14:0","nodeType":"VariableDeclaration","scope":105,"src":"1394:22:0","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"},"typeName":{"id":100,"name":"address","nodeType":"ElementaryTypeName","src":"1394:7:0","stateMutability":"nonpayable","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"}},"visibility":"internal"}],"id":103,"initialValue":{"id":102,"name":"CONSOLE_ADDRESS","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":61,"src":"1419:15:0","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"}},"nodeType":"VariableDeclarationStatement","src":"1394:40:0"},{"AST":{"nodeType":"YulBlock","src":"1496:150:0","statements":[{"nodeType":"YulVariableDeclaration","src":"1510:36:0","value":{"arguments":[{"name":"payload","nodeType":"YulIdentifier","src":"1534:7:0"},{"kind":"number","nodeType":"YulLiteral","src":"1543:2:0","type":"","value":"32"}],"functionName":{"name":"add","nodeType":"YulIdentifier","src":"1530:3:0"},"nodeType":"YulFunctionCall","src":"1530:16:0"},"variables":[{"name":"payloadStart","nodeType":"YulTypedName","src":"1514:12:0","type":""}]},{"nodeType":"YulVariableDeclaration","src":"1559:77:0","value":{"arguments":[{"arguments":[],"functionName":{"name":"gas","nodeType":"YulIdentifier","src":"1579:3:0"},"nodeType":"YulFunctionCall","src":"1579:5:0"},{"name":"consoleAddress","nodeType":"YulIdentifier","src":"1586:14:0"},{"name":"payloadStart","nodeType":"YulIdentifier","src":"1602:12:0"},{"name":"payloadLength","nodeType":"YulIdentifier","src":"1616:13:0"},{"kind":"number","nodeType":"YulLiteral","src":"1631:1:0","type":"","value":"0"},{"kind":"number","nodeType":"YulLiteral","src":"1634:1:0","type":"","value":"0"}],"functionName":{"name":"staticcall","nodeType":"YulIdentifier","src":"1568:10:0"},"nodeType":"YulFunctionCall","src":"1568:68:0"},"variables":[{"name":"r","nodeType":"YulTypedName","src":"1563:1:0","type":""}]}]},"documentation":"@solidity memory-safe-assembly","evmVersion":"london","externalReferences":[{"declaration":101,"isOffset":false,"isSlot":false,"src":"1586:14:0","valueSize":1},{"declaration":92,"isOffset":false,"isSlot":false,"src":"1534:7:0","valueSize":1},{"declaration":96,"isOffset":false,"isSlot":false,"src":"1616:13:0","valueSize":1}],"id":104,"nodeType":"InlineAssembly","src":"1487:159:0"}]},"implemented":true,"kind":"function","modifiers":[],"name":"_sendLogPayloadView","nameLocation":"1281:19:0","parameters":{"id":93,"nodeType":"ParameterList","parameters":[{"constant":false,"id":92,"mutability":"mutable","name":"payload","nameLocation":"1314:7:0","nodeType":"VariableDeclaration","scope":106,"src":"1301:20:0","stateVariable":false,"storageLocation":"memory","typeDescriptions":{"typeIdentifier":"t_bytes_memory_ptr","typeString":"bytes"},"typeName":{"id":91,"name":"bytes","nodeType":"ElementaryTypeName","src":"1301:5:0","typeDescriptions":{"typeIdentifier":"t_bytes_storage_ptr","typeString":"bytes"}},"visibility":"internal"}],"src":"1300:22:0"},"returnParameters":{"id":94,"nodeType":"ParameterList","parameters":[],"src":"1336:0:0"},"scope":192,"stateMutability":"view","virtual":false,"visibility":"private"},{"id":120,"nodeType":"FunctionDefinition","src":"1658:121:0","nodes":[],"body":{"id":119,"nodeType":"Block","src":"1703:76:0","nodes":[],"statements":[{"expression":{"arguments":[{"arguments":[{"hexValue":"6c6f6728737472696e6729","id":114,"isConstant":false,"isLValue":false,"isPure":true,"kind":"string","lValueRequested":false,"nodeType":"Literal","src":"1753:13:0","typeDescriptions":{"typeIdentifier":"t_stringliteral_41304facd9323d75b11bcdd609cb38effffdb05710f7caf0e9b16c6d9d709f50","typeString":"literal_string \"log(string)\""},"value":"log(string)"},{"id":115,"name":"p0","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":108,"src":"1768:2:0","typeDescriptions":{"typeIdentifier":"t_string_memory_ptr","typeString":"string memory"}}],"expression":{"argumentTypes":[{"typeIdentifier":"t_stringliteral_41304facd9323d75b11bcdd609cb38effffdb05710f7caf0e9b16c6d9d709f50","typeString":"literal_string \"log(string)\""},{"typeIdentifier":"t_string_memory_ptr","typeString":"string memory"}],"expression":{"id":112,"name":"abi","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":-1,"src":"1729:3:0","typeDescriptions":{"typeIdentifier":"t_magic_abi","typeString":"abi"}},"id":113,"isConstant":false,"isLValue":false,"isPure":true,"lValueRequested":false,"memberName":"encodeWithSignature","nodeType":"MemberAccess","src":"1729:23:0","typeDescriptions":{"typeIdentifier":"t_function_abiencodewithsignature_pure$_t_string_memory_ptr_$returns$_t_bytes_memory_ptr_$","typeString":"function (string memory) pure returns (bytes memory)"}},"id":116,"isConstant":false,"isLValue":false,"isPure":false,"kind":"functionCall","lValueRequested":false,"names":[],"nodeType":"FunctionCall","src":"1729:42:0","tryCall":false,"typeDescriptions":{"typeIdentifier":"t_bytes_memory_ptr","typeString":"bytes memory"}}],"expression":{"argumentTypes":[{"typeIdentifier":"t_bytes_memory_ptr","typeString":"bytes memory"}],"id":111,"name":"_sendLogPayload","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":90,"src":"1713:15:0","typeDescriptions":{"typeIdentifier":"t_function_internal_pure$_t_bytes_memory_ptr_$returns$__$","typeString":"function (bytes memory) pure"}},"id":117,"isConstant":false,"isLValue":false,"isPure":false,"kind":"functionCall","lValueRequested":false,"names":[],"nodeType":"FunctionCall","src":"1713:59:0","tryCall":false,"typeDescriptions":{"typeIdentifier":"t_tuple$__$","typeString":"tuple()"}},"id":118,"nodeType":"ExpressionStatement","src":"1713:59:0"}]},"implemented":true,"kind":"function","modifiers":[],"name":"log","nameLocation":"1667:3:0","parameters":{"id":109,"nodeType":"ParameterList","parameters":[{"constant":false,"id":108,"mutability":"mutable","name":"p0","nameLocation":"1685:2:0","nodeType":"VariableDeclaration","scope":120,"src":"1671:16:0","stateVariable":false,"storageLocation":"memory","typeDescriptions":{"typeIdentifier":"t_string_memory_ptr","typeString":"string"},"typeName":{"id":107,"name":"string","nodeType":"ElementaryTypeName","src":"1671:6:0","typeDescriptions":{"typeIdentifier":"t_string_storage_ptr","typeString":"string"}},"visibility":"internal"}],"src":"1670:18:0"},"returnParameters":{"id":110,"nodeType":"ParameterList","parameters":[],"src":"1703:0:0"},"scope":192,"stateMutability":"pure","virtual":false,"visibility":"internal"},{"id":137,"nodeType":"FunctionDefinition","src":"1785:139:0","nodes":[],"body":{"id":136,"nodeType":"Block","src":"1839:85:0","nodes":[],"statements":[{"expression":{"arguments":[{"arguments":[{"hexValue":"6c6f6728737472696e672c626f6f6c29","id":130,"isConstant":false,"isLValue":false,"isPure":true,"kind":"string","lValueRequested":false,"nodeType":"Literal","src":"1889:18:0","typeDescriptions":{"typeIdentifier":"t_stringliteral_c3b556354c088fbb43886eb83c2a04bc7089663f964d22be308197a236f5b870","typeString":"literal_string \"log(string,bool)\""},"value":"log(string,bool)"},{"id":131,"name":"p0","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":122,"src":"1909:2:0","typeDescriptions":{"typeIdentifier":"t_string_memory_ptr","typeString":"string memory"}},{"id":132,"name":"p1","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":124,"src":"1913:2:0","typeDescriptions":{"typeIdentifier":"t_bool","typeString":"bool"}}],"expression":{"argumentTypes":[{"typeIdentifier":"t_stringliteral_c3b556354c088fbb43886eb83c2a04bc7089663f964d22be308197a236f5b870","typeString":"literal_string \"log(string,bool)\""},{"typeIdentifier":"t_string_memory_ptr","typeString":"string memory"},{"typeIdentifier":"t_bool","typeString":"bool"}],"expression":{"id":128,"name":"abi","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":-1,"src":"1865:3:0","typeDescriptions":{"typeIdentifier":"t_magic_abi","typeString":"abi"}},"id":129,"isConstant":false,"isLValue":false,"isPure":true,"lValueRequested":false,"memberName":"encodeWithSignature","nodeType":"MemberAccess","src":"1865:23:0","typeDescriptions":{"typeIdentifier":"t_function_abiencodewithsignature_pure$_t_string_memory_ptr_$returns$_t_bytes_memory_ptr_$","typeString":"function (string memory) pure returns (bytes memory)"}},"id":133,"isConstant":false,"isLValue":false,"isPure":false,"kind":"functionCall","lValueRequested":false,"names":[],"nodeType":"FunctionCall","src":"1865:51:0","tryCall":false,"typeDescriptions":{"typeIdentifier":"t_bytes_memory_ptr","typeString":"bytes memory"}}],"expression":{"argumentTypes":[{"typeIdentifier":"t_bytes_memory_ptr","typeString":"bytes memory"}],"id":127,"name":"_sendLogPayload","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":90,"src":"1849:15:0","typeDescriptions":{"typeIdentifier":"t_function_internal_pure$_t_bytes_memory_ptr_$returns$__$","typeString":"function (bytes memory) pure"}},"id":134,"isConstant":false,"isLValue":false,"isPure":false,"kind":"functionCall","lValueRequested":false,"names":[],"nodeType":"FunctionCall","src":"1849:68:0","tryCall":false,"typeDescriptions":{"typeIdentifier":"t_tuple$__$","typeString":"tuple()"}},"id":135,"nodeType":"ExpressionStatement","src":"1849:68:0"}]},"implemented":true,"kind":"function","modifiers":[],"name":"log","nameLocation":"1794:3:0","parameters":{"id":125,"nodeType":"ParameterList","parameters":[{"constant":false,"id":122,"mutability":"mutable","name":"p0","nameLocation":"1812:2:0","nodeType":"VariableDeclaration","scope":137,"src":"1798:16:0","stateVariable":false,"storageLocation":"memory","typeDescriptions":{"typeIdentifier":"t_string_memory_ptr","typeString":"string"},"typeName":{"id":121,"name":"string","nodeType":"ElementaryTypeName","src":"1798:6:0","typeDescriptions":{"typeIdentifier":"t_string_storage_ptr","typeString":"string"}},"visibility":"internal"},{"constant":false,"id":124,"mutability":"mutable","name":"p1","nameLocation":"1821:2:0","nodeType":"VariableDeclaration","scope":137,"src":"1816:7:0","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_bool","typeString":"bool"},"typeName":{"id":123,"name":"bool","nodeType":"ElementaryTypeName","src":"1816:4:0","typeDescriptions":{"typeIdentifier":"t_bool","typeString":"bool"}},"visibility":"internal"}],"src":"1797:27:0"},"returnParameters":{"id":126,"nodeType":"ParameterList","parameters":[],"src":"1839:0:0"},"scope":192,"stateMutability":"pure","virtual":false,"visibility":"internal"},{"id":154,"nodeType":"FunctionDefinition","src":"1930:145:0","nodes":[],"body":{"id":153,"nodeType":"Block","src":"1987:88:0","nodes":[],"statements":[{"expression":{"arguments":[{"arguments":[{"hexValue":"6c6f6728737472696e672c75696e7432353629","id":147,"isConstant":false,"isLValue":false,"isPure":true,"kind":"string","lValueRequested":false,"nodeType":"Literal","src":"2037:21:0","typeDescriptions":{"typeIdentifier":"t_stringliteral_b60e72ccf6d57ab53eb84d7e94a9545806ed7f93c4d5673f11a64f03471e584e","typeString":"literal_string \"log(string,uint256)\""},"value":"log(string,uint256)"},{"id":148,"name":"p0","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":139,"src":"2060:2:0","typeDescriptions":{"typeIdentifier":"t_string_memory_ptr","typeString":"string memory"}},{"id":149,"name":"p1","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":141,"src":"2064:2:0","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}}],"expression":{"argumentTypes":[{"typeIdentifier":"t_stringliteral_b60e72ccf6d57ab53eb84d7e94a9545806ed7f93c4d5673f11a64f03471e584e","typeString":"literal_string \"log(string,uint256)\""},{"typeIdentifier":"t_string_memory_ptr","typeString":"string memory"},{"typeIdentifier":"t_uint256","typeString":"uint256"}],"expression":{"id":145,"name":"abi","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":-1,"src":"2013:3:0","typeDescriptions":{"typeIdentifier":"t_magic_abi","typeString":"abi"}},"id":146,"isConstant":false,"isLValue":false,"isPure":true,"lValueRequested":false,"memberName":"encodeWithSignature","nodeType":"MemberAccess","src":"2013:23:0","typeDescriptions":{"typeIdentifier":"t_function_abiencodewithsignature_pure$_t_string_memory_ptr_$returns$_t_bytes_memory_ptr_$","typeString":"function (string memory) pure returns (bytes memory)"}},"id":150,"isConstant":false,"isLValue":false,"isPure":false,"kind":"functionCall","lValueRequested":false,"names":[],"nodeType":"FunctionCall","src":"2013:54:0","tryCall":false,"typeDescriptions":{"typeIdentifier":"t_bytes_memory_ptr","typeString":"bytes memory"}}],"expression":{"argumentTypes":[{"typeIdentifier":"t_bytes_memory_ptr","typeString":"bytes memory"}],"id":144,"name":"_sendLogPayload","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":90,"src":"1997:15:0","typeDescriptions":{"typeIdentifier":"t_function_internal_pure$_t_bytes_memory_ptr_$returns$__$","typeString":"function (bytes memory) pure"}},"id":151,"isConstant":false,"isLValue":false,"isPure":false,"kind":"functionCall","lValueRequested":false,"names":[],"nodeType":"FunctionCall","src":"1997:71:0","tryCall":false,"typeDescriptions":{"typeIdentifier":"t_tuple$__$","typeString":"tuple()"}},"id":152,"nodeType":"ExpressionStatement","src":"1997:71:0"}]},"implemented":true,"kind":"function","modifiers":[],"name":"log","nameLocation":"1939:3:0","parameters":{"id":142,"nodeType":"ParameterList","parameters":[{"constant":false,"id":139,"mutability":"mutable","name":"p0","nameLocation":"1957:2:0","nodeType":"VariableDeclaration","scope":154,"src":"1943:16:0","stateVariable":false,"storageLocation":"memory","typeDescriptions":{"typeIdentifier":"t_string_memory_ptr","typeString":"string"},"typeName":{"id":138,"name":"string","nodeType":"ElementaryTypeName","src":"1943:6:0","typeDescriptions":{"typeIdentifier":"t_string_storage_ptr","typeString":"string"}},"visibility":"internal"},{"constant":false,"id":141,"mutability":"mutable","name":"p1","nameLocation":"1969:2:0","nodeType":"VariableDeclaration","scope":154,"src":"1961:10:0","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"},"typeName":{"id":140,"name":"uint256","nodeType":"ElementaryTypeName","src":"1961:7:0","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"visibility":"internal"}],"src":"1942:30:0"},"returnParameters":{"id":143,"nodeType":"ParameterList","parameters":[],"src":"1987:0:0"},"scope":192,"stateMutability":"pure","virtual":false,"visibility":"internal"},{"id":171,"nodeType":"FunctionDefinition","src":"2081:145:0","nodes":[],"body":{"id":170,"nodeType":"Block","src":"2138:88:0","nodes":[],"statements":[{"expression":{"arguments":[{"arguments":[{"hexValue":"6c6f6728737472696e672c6164647265737329","id":164,"isConstant":false,"isLValue":false,"isPure":true,"kind":"string","lValueRequested":false,"nodeType":"Literal","src":"2188:21:0","typeDescriptions":{"typeIdentifier":"t_stringliteral_319af333460570a1937bf195dd33445c0d0951c59127da6f1f038b9fdce3fd72","typeString":"literal_string \"log(string,address)\""},"value":"log(string,address)"},{"id":165,"name":"p0","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":156,"src":"2211:2:0","typeDescriptions":{"typeIdentifier":"t_string_memory_ptr","typeString":"string memory"}},{"id":166,"name":"p1","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":158,"src":"2215:2:0","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"}}],"expression":{"argumentTypes":[{"typeIdentifier":"t_stringliteral_319af333460570a1937bf195dd33445c0d0951c59127da6f1f038b9fdce3fd72","typeString":"literal_string \"log(string,address)\""},{"typeIdentifier":"t_string_memory_ptr","typeString":"string memory"},{"typeIdentifier":"t_address","typeString":"address"}],"expression":{"id":162,"name":"abi","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":-1,"src":"2164:3:0","typeDescriptions":{"typeIdentifier":"t_magic_abi","typeString":"abi"}},"id":163,"isConstant":false,"isLValue":false,"isPure":true,"lValueRequested":false,"memberName":"encodeWithSignature","nodeType":"MemberAccess","src":"2164:23:0","typeDescriptions":{"typeIdentifier":"t_function_abiencodewithsignature_pure$_t_string_memory_ptr_$returns$_t_bytes_memory_ptr_$","typeString":"function (string memory) pure returns (bytes memory)"}},"id":167,"isConstant":false,"isLValue":false,"isPure":false,"kind":"functionCall","lValueRequested":false,"names":[],"nodeType":"FunctionCall","src":"2164:54:0","tryCall":false,"typeDescriptions":{"typeIdentifier":"t_bytes_memory_ptr","typeString":"bytes memory"}}],"expression":{"argumentTypes":[{"typeIdentifier":"t_bytes_memory_ptr","typeString":"bytes memory"}],"id":161,"name":"_sendLogPayload","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":90,"src":"2148:15:0","typeDescriptions":{"typeIdentifier":"t_function_internal_pure$_t_bytes_memory_ptr_$returns$__$","typeString":"function (bytes memory) pure"}},"id":168,"isConstant":false,"isLValue":false,"isPure":false,"kind":"functionCall","lValueRequested":false,"names":[],"nodeType":"FunctionCall","src":"2148:71:0","tryCall":false,"typeDescriptions":{"typeIdentifier":"t_tuple$__$","typeString":"tuple()"}},"id":169,"nodeType":"ExpressionStatement","src":"2148:71:0"}]},"implemented":true,"kind":"function","modifiers":[],"name":"log","nameLocation":"2090:3:0","parameters":{"id":159,"nodeType":"ParameterList","parameters":[{"constant":false,"id":156,"mutability":"mutable","name":"p0","nameLocation":"2108:2:0","nodeType":"VariableDeclaration","scope":171,"src":"2094:16:0","stateVariable":false,"storageLocation":"memory","typeDescriptions":{"typeIdentifier":"t_string_memory_ptr","typeString":"string"},"typeName":{"id":155,"name":"string","nodeType":"ElementaryTypeName","src":"2094:6:0","typeDescriptions":{"typeIdentifier":"t_string_storage_ptr","typeString":"string"}},"visibility":"internal"},{"constant":false,"id":158,"mutability":"mutable","name":"p1","nameLocation":"2120:2:0","nodeType":"VariableDeclaration","scope":171,"src":"2112:10:0","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"},"typeName":{"id":157,"name":"address","nodeType":"ElementaryTypeName","src":"2112:7:0","stateMutability":"nonpayable","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"}},"visibility":"internal"}],"src":"2093:30:0"},"returnParameters":{"id":160,"nodeType":"ParameterList","parameters":[],"src":"2138:0:0"},"scope":192,"stateMutability":"pure","virtual":false,"visibility":"internal"},{"id":191,"nodeType":"FunctionDefinition","src":"2232:179:0","nodes":[],"body":{"id":190,"nodeType":"Block","src":"2313:98:0","nodes":[],"statements":[{"expression":{"arguments":[{"arguments":[{"hexValue":"6c6f6728737472696e672c737472696e672c737472696e6729","id":183,"isConstant":false,"isLValue":false,"isPure":true,"kind":"string","lValueRequested":false,"nodeType":"Literal","src":"2363:27:0","typeDescriptions":{"typeIdentifier":"t_stringliteral_2ced7cef693312206c21f0e92e3b54e2e16bf33db5eec350c78866822c665e1f","typeString":"literal_string \"log(string,string,string)\""},"value":"log(string,string,string)"},{"id":184,"name":"p0","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":173,"src":"2392:2:0","typeDescriptions":{"typeIdentifier":"t_string_memory_ptr","typeString":"string memory"}},{"id":185,"name":"p1","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":175,"src":"2396:2:0","typeDescriptions":{"typeIdentifier":"t_string_memory_ptr","typeString":"string memory"}},{"id":186,"name":"p2","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":177,"src":"2400:2:0","typeDescriptions":{"typeIdentifier":"t_string_memory_ptr","typeString":"string memory"}}],"expression":{"argumentTypes":[{"typeIdentifier":"t_stringliteral_2ced7cef693312206c21f0e92e3b54e2e16bf33db5eec350c78866822c665e1f","typeString":"literal_string \"log(string,string,string)\""},{"typeIdentifier":"t_string_memory_ptr","typeString":"string memory"},{"typeIdentifier":"t_string_memory_ptr","typeString":"string memory"},{"typeIdentifier":"t_string_memory_ptr","typeString":"string memory"}],"expression":{"id":181,"name":"abi","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":-1,"src":"2339:3:0","typeDescriptions":{"typeIdentifier":"t_magic_abi","typeString":"abi"}},"id":182,"isConstant":false,"isLValue":false,"isPure":true,"lValueRequested":false,"memberName":"encodeWithSignature","nodeType":"MemberAccess","src":"2339:23:0","typeDescriptions":{"typeIdentifier":"t_function_abiencodewithsignature_pure$_t_string_memory_ptr_$returns$_t_bytes_memory_ptr_$","typeString":"function (string memory) pure returns (bytes memory)"}},"id":187,"isConstant":false,"isLValue":false,"isPure":false,"kind":"functionCall","lValueRequested":false,"names":[],"nodeType":"FunctionCall","src":"2339:64:0","tryCall":false,"typeDescriptions":{"typeIdentifier":"t_bytes_memory_ptr","typeString":"bytes memory"}}],"expression":{"argumentTypes":[{"typeIdentifier":"t_bytes_memory_ptr","typeString":"bytes memory"}],"id":180,"name":"_sendLogPayload","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":90,"src":"2323:15:0","typeDescriptions":{"typeIdentifier":"t_function_internal_pure$_t_bytes_memory_ptr_$returns$__$","typeString":"function (bytes memory) pure"}},"id":188,"isConstant":false,"isLValue":false,"isPure":false,"kind":"functionCall","lValueRequested":false,"names":[],"nodeType":"FunctionCall","src":"2323:81:0","tryCall":false,"typeDescriptions":{"typeIdentifier":"t_tuple$__$","typeString":"tuple()"}},"id":189,"nodeType":"ExpressionStatement","src":"2323:81:0"}]},"implemented":true,"kind":"function","modifiers":[],"name":"log","nameLocation":"2241:3:0","parameters":{"id":178,"nodeType":"ParameterList","parameters":[{"constant":false,"id":173,"mutability":"mutable","name":"p0","nameLocation":"2259:2:0","nodeType":"VariableDeclaration","scope":191,"src":"2245:16:0","stateVariable":false,"storageLocation":"memory","typeDescriptions":{"typeIdentifier":"t_string_memory_ptr","typeString":"string"},"typeName":{"id":172,"name":"string","nodeType":"ElementaryTypeName","src":"2245:6:0","typeDescriptions":{"typeIdentifier":"t_string_storage_ptr","typeString":"string"}},"visibility":"internal"},{"constant":false,"id":175,"mutability":"mutable","name":"p1","nameLocation":"2277:2:0","nodeType":"VariableDeclaration","scope":191,"src":"2263:16:0","stateVariable":false,"storageLocation":"memory","typeDescriptions":{"typeIdentifier":"t_string_memory_ptr","typeString":"string"},"typeName":{"id":174,"name":"string","nodeType":"ElementaryTypeName","src":"2263:6:0","typeDescriptions":{"typeIdentifier":"t_string_storage_ptr","typeString":"string"}},"visibility":"internal"},{"constant":false,"id":177,"mutability":"mutable","name":"p2","nameLocation":"2295:2:0","nodeType":"VariableDeclaration","scope":191,"src":"2281:16:0","stateVariable":false,"storageLocation":"memory","typeDescriptions":{"typeIdentifier":"t_string_memory_ptr","typeString":"string"},"typeName":{"id":176,"name":"string","nodeType":"ElementaryTypeName","src":"2281:6:0","typeDescriptions":{"typeIdentifier":"t_string_storage_ptr","typeString":"string"}},"visibility":"internal"}],"src":"2244:54:0"},"returnParameters":{"id":179,"nodeType":"ParameterList","parameters":[],"src":"2313:0:0"},"scope":192,"stateMutability":"pure","virtual":false,"visibility":"internal"}],"abstract":false,"baseContracts":[],"canonicalName":"console","contractDependencies":[],"contractKind":"library","fullyImplemented":true,"linearizedBaseContracts":[192],"name":"console","nameLocation":"799:7:0","scope":720,"usedErrors":[]},{"id":706,"nodeType":"ContractDefinition","src":"2541:3359:0","nodes":[{"id":207,"nodeType":"VariableDeclaration","src":"2571:94:0","nodes":[],"constant":true,"mutability":"constant","name":"VM_ADDRESS","nameLocation":"2597:10:0","scope":706,"stateVariable":true,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"},"typeName":{"id":194,"name":"address","nodeType":"ElementaryTypeName","src":"2571:7:0","stateMutability":"nonpayable","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"}},"value":{"arguments":[{"arguments":[{"arguments":[{"arguments":[{"hexValue":"6865766d20636865617420636f6465","id":202,"isConstant":false,"isLValue":false,"isPure":true,"kind":"string","lValueRequested":false,"nodeType":"Literal","src":"2644:17:0","typeDescriptions":{"typeIdentifier":"t_stringliteral_885cb69240a935d632d79c317109709ecfa91a80626ff3989d68f67f5b1dd12d","typeString":"literal_string \"hevm cheat code\""},"value":"hevm cheat code"}],"expression":{"argumentTypes":[{"typeIdentifier":"t_stringliteral_885cb69240a935d632d79c317109709ecfa91a80626ff3989d68f67f5b1dd12d","typeString":"literal_string \"hevm cheat code\""}],"id":201,"name":"keccak256","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":-8,"src":"2634:9:0","typeDescriptions":{"typeIdentifier":"t_function_keccak256_pure$_t_bytes_memory_ptr_$returns$_t_bytes32_$","typeString":"function (bytes memory) pure returns (bytes32)"}},"id":203,"isConstant":false,"isLValue":false,"isPure":true,"kind":"functionCall","lValueRequested":false,"names":[],"nodeType":"FunctionCall","src":"2634:28:0","tryCall":false,"typeDescriptions":{"typeIdentifier":"t_bytes32","typeString":"bytes32"}}],"expression":{"argumentTypes":[{"typeIdentifier":"t_bytes32","typeString":"bytes32"}],"id":200,"isConstant":false,"isLValue":false,"isPure":true,"lValueRequested":false,"nodeType":"ElementaryTypeNameExpression","src":"2626:7:0","typeDescriptions":{"typeIdentifier":"t_type$_t_uint256_$","typeString":"type(uint256)"},"typeName":{"id":199,"name":"uint256","nodeType":"ElementaryTypeName","src":"2626:7:0","typeDescriptions":{}}},"id":204,"isConstant":false,"isLValue":false,"isPure":true,"kind":"typeConversion","lValueRequested":false,"names":[],"nodeType":"FunctionCall","src":"2626:37:0","tryCall":false,"typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}}],"expression":{"argumentTypes":[{"typeIdentifier":"t_uint256","typeString":"uint256"}],"id":198,"isConstant":false,"isLValue":false,"isPure":true,"lValueRequested":false,"nodeType":"ElementaryTypeNameExpression","src":"2618:7:0","typeDescriptions":{"typeIdentifier":"t_type$_t_uint160_$","typeString":"type(uint160)"},"typeName":{"id":197,"name":"uint160","nodeType":"ElementaryTypeName","src":"2618:7:0","typeDescriptions":{}}},"id":205,"isConstant":false,"isLValue":false,"isPure":true,"kind":"typeConversion","lValueRequested":false,"names":[],"nodeType":"FunctionCall","src":"2618:46:0","tryCall":false,"typeDescriptions":{"typeIdentifier":"t_uint160","typeString":"uint160"}}],"expression":{"argumentTypes":[{"typeIdentifier":"t_uint160","typeString":"uint160"}],"id":196,"isConstant":false,"isLValue":false,"isPure":true,"lValueRequested":false,"nodeType":"ElementaryTypeNameExpression","src":"2610:7:0","typeDescriptions":{"typeIdentifier":"t_type$_t_address_$","typeString":"type(address)"},"typeName":{"id":195,"name":"address","nodeType":"ElementaryTypeName","src":"2610:7:0","typeDescriptions":{}}},"id":206,"isConstant":false,"isLValue":false,"isPure":true,"kind":"typeConversion","lValueRequested":false,"names":[],"nodeType":"FunctionCall","src":"2610:55:0","tryCall":false,"typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"}},"visibility":"internal"},{"id":213,"nodeType":"VariableDeclaration","src":"2671:40:0","nodes":[],"constant":true,"mutability":"constant","name":"vm","nameLocation":"2692:2:0","scope":706,"stateVariable":true,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_contract$_Vm_$55","typeString":"contract Vm"},"typeName":{"id":209,"nodeType":"UserDefinedTypeName","pathNode":{"id":208,"name":"Vm","nodeType":"IdentifierPath","referencedDeclaration":55,"src":"2671:2:0"},"referencedDeclaration":55,"src":"2671:2:0","typeDescriptions":{"typeIdentifier":"t_contract$_Vm_$55","typeString":"contract Vm"}},"value":{"arguments":[{"id":211,"name":"VM_ADDRESS","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":207,"src":"2700:10:0","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"}}],"expression":{"argumentTypes":[{"typeIdentifier":"t_address","typeString":"address"}],"id":210,"name":"Vm","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":55,"src":"2697:2:0","typeDescriptions":{"typeIdentifier":"t_type$_t_contract$_Vm_$55_$","typeString":"type(contract Vm)"}},"id":212,"isConstant":false,"isLValue":false,"isPure":true,"kind":"typeConversion","lValueRequested":false,"names":[],"nodeType":"FunctionCall","src":"2697:14:0","tryCall":false,"typeDescriptions":{"typeIdentifier":"t_contract$_Vm_$55","typeString":"contract Vm"}},"visibility":"internal"},{"id":215,"nodeType":"VariableDeclaration","src":"2775:22:0","nodes":[],"constant":false,"functionSelector":"61bc221a","mutability":"mutable","name":"counter","nameLocation":"2790:7:0","scope":706,"stateVariable":true,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"},"typeName":{"id":214,"name":"uint256","nodeType":"ElementaryTypeName","src":"2775:7:0","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"visibility":"public"},{"id":378,"nodeType":"FunctionDefinition","src":"2887:949:0","nodes":[],"body":{"id":377,"nodeType":"Block","src":"2909:927:0","nodes":[],"statements":[{"assignments":[220],"declarations":[{"constant":false,"id":220,"mutability":"mutable","name":"x","nameLocation":"2924:1:0","nodeType":"VariableDeclaration","scope":377,"src":"2919:6:0","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_bool","typeString":"bool"},"typeName":{"id":219,"name":"bool","nodeType":"ElementaryTypeName","src":"2919:4:0","typeDescriptions":{"typeIdentifier":"t_bool","typeString":"bool"}},"visibility":"internal"}],"id":226,"initialValue":{"arguments":[{"hexValue":"4558414d504c455f424f4f4c","id":223,"isConstant":false,"isLValue":false,"isPure":true,"kind":"string","lValueRequested":false,"nodeType":"Literal","src":"2937:14:0","typeDescriptions":{"typeIdentifier":"t_stringliteral_a634dae177a0e138ae7aaa2afae347412e148992e88c7aabd33ee71be146cb7f","typeString":"literal_string \"EXAMPLE_BOOL\""},"value":"EXAMPLE_BOOL"},{"hexValue":"66616c7365","id":224,"isConstant":false,"isLValue":false,"isPure":true,"kind":"bool","lValueRequested":false,"nodeType":"Literal","src":"2953:5:0","typeDescriptions":{"typeIdentifier":"t_bool","typeString":"bool"},"value":"false"}],"expression":{"argumentTypes":[{"typeIdentifier":"t_stringliteral_a634dae177a0e138ae7aaa2afae347412e148992e88c7aabd33ee71be146cb7f","typeString":"literal_string \"EXAMPLE_BOOL\""},{"typeIdentifier":"t_bool","typeString":"bool"}],"expression":{"id":221,"name":"vm","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":213,"src":"2928:2:0","typeDescriptions":{"typeIdentifier":"t_contract$_Vm_$55","typeString":"contract Vm"}},"id":222,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"memberName":"envOr","nodeType":"MemberAccess","referencedDeclaration":10,"src":"2928:8:0","typeDescriptions":{"typeIdentifier":"t_function_external_view$_t_string_memory_ptr_$_t_bool_$returns$_t_bool_$","typeString":"function (string memory,bool) view external returns (bool)"}},"id":225,"isConstant":false,"isLValue":false,"isPure":false,"kind":"functionCall","lValueRequested":false,"names":[],"nodeType":"FunctionCall","src":"2928:31:0","tryCall":false,"typeDescriptions":{"typeIdentifier":"t_bool","typeString":"bool"}},"nodeType":"VariableDeclarationStatement","src":"2919:40:0"},{"expression":{"arguments":[{"hexValue":"626f6f6c2076616c75652066726f6d20656e76","id":230,"isConstant":false,"isLValue":false,"isPure":true,"kind":"string","lValueRequested":false,"nodeType":"Literal","src":"2981:21:0","typeDescriptions":{"typeIdentifier":"t_stringliteral_5a607d0b5a1295325aa8901721d78ba402601bba6f62cebdd5235dd0204a590b","typeString":"literal_string \"bool value from env\""},"value":"bool value from env"},{"id":231,"name":"x","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":220,"src":"3004:1:0","typeDescriptions":{"typeIdentifier":"t_bool","typeString":"bool"}}],"expression":{"argumentTypes":[{"typeIdentifier":"t_stringliteral_5a607d0b5a1295325aa8901721d78ba402601bba6f62cebdd5235dd0204a590b","typeString":"literal_string \"bool value from env\""},{"typeIdentifier":"t_bool","typeString":"bool"}],"expression":{"id":227,"name":"console","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":192,"src":"2969:7:0","typeDescriptions":{"typeIdentifier":"t_type$_t_contract$_console_$192_$","typeString":"type(library console)"}},"id":229,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"memberName":"log","nodeType":"MemberAccess","referencedDeclaration":137,"src":"2969:11:0","typeDescriptions":{"typeIdentifier":"t_function_internal_pure$_t_string_memory_ptr_$_t_bool_$returns$__$","typeString":"function (string memory,bool) pure"}},"id":232,"isConstant":false,"isLValue":false,"isPure":false,"kind":"functionCall","lValueRequested":false,"names":[],"nodeType":"FunctionCall","src":"2969:37:0","tryCall":false,"typeDescriptions":{"typeIdentifier":"t_tuple$__$","typeString":"tuple()"}},"id":233,"nodeType":"ExpressionStatement","src":"2969:37:0"},{"expression":{"arguments":[{"hexValue":"636f6e74726163742061646472","id":237,"isConstant":false,"isLValue":false,"isPure":true,"kind":"string","lValueRequested":false,"nodeType":"Literal","src":"3029:15:0","typeDescriptions":{"typeIdentifier":"t_stringliteral_fa50728770d00fe8f6a0592f3565bbfaf063ee4077f1f5bbc003d091d33cd0c4","typeString":"literal_string \"contract addr\""},"value":"contract addr"},{"arguments":[{"id":240,"name":"this","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":-28,"src":"3054:4:0","typeDescriptions":{"typeIdentifier":"t_contract$_ScriptExample_$706","typeString":"contract ScriptExample"}}],"expression":{"argumentTypes":[{"typeIdentifier":"t_contract$_ScriptExample_$706","typeString":"contract ScriptExample"}],"id":239,"isConstant":false,"isLValue":false,"isPure":true,"lValueRequested":false,"nodeType":"ElementaryTypeNameExpression","src":"3046:7:0","typeDescriptions":{"typeIdentifier":"t_type$_t_address_$","typeString":"type(address)"},"typeName":{"id":238,"name":"address","nodeType":"ElementaryTypeName","src":"3046:7:0","typeDescriptions":{}}},"id":241,"isConstant":false,"isLValue":false,"isPure":false,"kind":"typeConversion","lValueRequested":false,"names":[],"nodeType":"FunctionCall","src":"3046:13:0","tryCall":false,"typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"}}],"expression":{"argumentTypes":[{"typeIdentifier":"t_stringliteral_fa50728770d00fe8f6a0592f3565bbfaf063ee4077f1f5bbc003d091d33cd0c4","typeString":"literal_string \"contract addr\""},{"typeIdentifier":"t_address","typeString":"address"}],"expression":{"id":234,"name":"console","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":192,"src":"3017:7:0","typeDescriptions":{"typeIdentifier":"t_type$_t_contract$_console_$192_$","typeString":"type(library console)"}},"id":236,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"memberName":"log","nodeType":"MemberAccess","referencedDeclaration":171,"src":"3017:11:0","typeDescriptions":{"typeIdentifier":"t_function_internal_pure$_t_string_memory_ptr_$_t_address_$returns$__$","typeString":"function (string memory,address) pure"}},"id":242,"isConstant":false,"isLValue":false,"isPure":false,"kind":"functionCall","lValueRequested":false,"names":[],"nodeType":"FunctionCall","src":"3017:43:0","tryCall":false,"typeDescriptions":{"typeIdentifier":"t_tuple$__$","typeString":"tuple()"}},"id":243,"nodeType":"ExpressionStatement","src":"3017:43:0"},{"expression":{"arguments":[{"hexValue":"636f6e7472616374206e6f6e6365","id":247,"isConstant":false,"isLValue":false,"isPure":true,"kind":"string","lValueRequested":false,"nodeType":"Literal","src":"3082:16:0","typeDescriptions":{"typeIdentifier":"t_stringliteral_3a23091615a5de8c0a35ffd8857a37e2c4e0b72f3ef8a34d6caf65efcd562e2f","typeString":"literal_string \"contract nonce\""},"value":"contract nonce"},{"arguments":[{"arguments":[{"id":252,"name":"this","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":-28,"src":"3120:4:0","typeDescriptions":{"typeIdentifier":"t_contract$_ScriptExample_$706","typeString":"contract ScriptExample"}}],"expression":{"argumentTypes":[{"typeIdentifier":"t_contract$_ScriptExample_$706","typeString":"contract ScriptExample"}],"id":251,"isConstant":false,"isLValue":false,"isPure":true,"lValueRequested":false,"nodeType":"ElementaryTypeNameExpression","src":"3112:7:0","typeDescriptions":{"typeIdentifier":"t_type$_t_address_$","typeString":"type(address)"},"typeName":{"id":250,"name":"address","nodeType":"ElementaryTypeName","src":"3112:7:0","typeDescriptions":{}}},"id":253,"isConstant":false,"isLValue":false,"isPure":false,"kind":"typeConversion","lValueRequested":false,"names":[],"nodeType":"FunctionCall","src":"3112:13:0","tryCall":false,"typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"}}],"expression":{"argumentTypes":[{"typeIdentifier":"t_address","typeString":"address"}],"expression":{"id":248,"name":"vm","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":213,"src":"3100:2:0","typeDescriptions":{"typeIdentifier":"t_contract$_Vm_$55","typeString":"contract Vm"}},"id":249,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"memberName":"getNonce","nodeType":"MemberAccess","referencedDeclaration":17,"src":"3100:11:0","typeDescriptions":{"typeIdentifier":"t_function_external_view$_t_address_$returns$_t_uint64_$","typeString":"function (address) view external returns (uint64)"}},"id":254,"isConstant":false,"isLValue":false,"isPure":false,"kind":"functionCall","lValueRequested":false,"names":[],"nodeType":"FunctionCall","src":"3100:26:0","tryCall":false,"typeDescriptions":{"typeIdentifier":"t_uint64","typeString":"uint64"}}],"expression":{"argumentTypes":[{"typeIdentifier":"t_stringliteral_3a23091615a5de8c0a35ffd8857a37e2c4e0b72f3ef8a34d6caf65efcd562e2f","typeString":"literal_string \"contract nonce\""},{"typeIdentifier":"t_uint64","typeString":"uint64"}],"expression":{"id":244,"name":"console","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":192,"src":"3070:7:0","typeDescriptions":{"typeIdentifier":"t_type$_t_contract$_console_$192_$","typeString":"type(library console)"}},"id":246,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"memberName":"log","nodeType":"MemberAccess","referencedDeclaration":154,"src":"3070:11:0","typeDescriptions":{"typeIdentifier":"t_function_internal_pure$_t_string_memory_ptr_$_t_uint256_$returns$__$","typeString":"function (string memory,uint256) pure"}},"id":255,"isConstant":false,"isLValue":false,"isPure":false,"kind":"functionCall","lValueRequested":false,"names":[],"nodeType":"FunctionCall","src":"3070:57:0","tryCall":false,"typeDescriptions":{"typeIdentifier":"t_tuple$__$","typeString":"tuple()"}},"id":256,"nodeType":"ExpressionStatement","src":"3070:57:0"},{"expression":{"arguments":[{"hexValue":"73656e6465722061646472","id":260,"isConstant":false,"isLValue":false,"isPure":true,"kind":"string","lValueRequested":false,"nodeType":"Literal","src":"3149:13:0","typeDescriptions":{"typeIdentifier":"t_stringliteral_8125ca2decf812b25b65606ff16dad37cb198ff0433485a7926e50feafacfc35","typeString":"literal_string \"sender addr\""},"value":"sender addr"},{"arguments":[{"expression":{"id":263,"name":"msg","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":-15,"src":"3172:3:0","typeDescriptions":{"typeIdentifier":"t_magic_message","typeString":"msg"}},"id":264,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"memberName":"sender","nodeType":"MemberAccess","src":"3172:10:0","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"}}],"expression":{"argumentTypes":[{"typeIdentifier":"t_address","typeString":"address"}],"id":262,"isConstant":false,"isLValue":false,"isPure":true,"lValueRequested":false,"nodeType":"ElementaryTypeNameExpression","src":"3164:7:0","typeDescriptions":{"typeIdentifier":"t_type$_t_address_$","typeString":"type(address)"},"typeName":{"id":261,"name":"address","nodeType":"ElementaryTypeName","src":"3164:7:0","typeDescriptions":{}}},"id":265,"isConstant":false,"isLValue":false,"isPure":false,"kind":"typeConversion","lValueRequested":false,"names":[],"nodeType":"FunctionCall","src":"3164:19:0","tryCall":false,"typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"}}],"expression":{"argumentTypes":[{"typeIdentifier":"t_stringliteral_8125ca2decf812b25b65606ff16dad37cb198ff0433485a7926e50feafacfc35","typeString":"literal_string \"sender addr\""},{"typeIdentifier":"t_address","typeString":"address"}],"expression":{"id":257,"name":"console","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":192,"src":"3137:7:0","typeDescriptions":{"typeIdentifier":"t_type$_t_contract$_console_$192_$","typeString":"type(library console)"}},"id":259,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"memberName":"log","nodeType":"MemberAccess","referencedDeclaration":171,"src":"3137:11:0","typeDescriptions":{"typeIdentifier":"t_function_internal_pure$_t_string_memory_ptr_$_t_address_$returns$__$","typeString":"function (string memory,address) pure"}},"id":266,"isConstant":false,"isLValue":false,"isPure":false,"kind":"functionCall","lValueRequested":false,"names":[],"nodeType":"FunctionCall","src":"3137:47:0","tryCall":false,"typeDescriptions":{"typeIdentifier":"t_tuple$__$","typeString":"tuple()"}},"id":267,"nodeType":"ExpressionStatement","src":"3137:47:0"},{"expression":{"arguments":[{"hexValue":"73656e646572206e6f6e6365","id":271,"isConstant":false,"isLValue":false,"isPure":true,"kind":"string","lValueRequested":false,"nodeType":"Literal","src":"3206:14:0","typeDescriptions":{"typeIdentifier":"t_stringliteral_db7deb43f2f9e0404016de53b7e64c4976b54149581f7534daae2551e8cf4e40","typeString":"literal_string \"sender nonce\""},"value":"sender nonce"},{"arguments":[{"arguments":[{"expression":{"id":276,"name":"msg","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":-15,"src":"3242:3:0","typeDescriptions":{"typeIdentifier":"t_magic_message","typeString":"msg"}},"id":277,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"memberName":"sender","nodeType":"MemberAccess","src":"3242:10:0","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"}}],"expression":{"argumentTypes":[{"typeIdentifier":"t_address","typeString":"address"}],"id":275,"isConstant":false,"isLValue":false,"isPure":true,"lValueRequested":false,"nodeType":"ElementaryTypeNameExpression","src":"3234:7:0","typeDescriptions":{"typeIdentifier":"t_type$_t_address_$","typeString":"type(address)"},"typeName":{"id":274,"name":"address","nodeType":"ElementaryTypeName","src":"3234:7:0","typeDescriptions":{}}},"id":278,"isConstant":false,"isLValue":false,"isPure":false,"kind":"typeConversion","lValueRequested":false,"names":[],"nodeType":"FunctionCall","src":"3234:19:0","tryCall":false,"typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"}}],"expression":{"argumentTypes":[{"typeIdentifier":"t_address","typeString":"address"}],"expression":{"id":272,"name":"vm","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":213,"src":"3222:2:0","typeDescriptions":{"typeIdentifier":"t_contract$_Vm_$55","typeString":"contract Vm"}},"id":273,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"memberName":"getNonce","nodeType":"MemberAccess","referencedDeclaration":17,"src":"3222:11:0","typeDescriptions":{"typeIdentifier":"t_function_external_view$_t_address_$returns$_t_uint64_$","typeString":"function (address) view external returns (uint64)"}},"id":279,"isConstant":false,"isLValue":false,"isPure":false,"kind":"functionCall","lValueRequested":false,"names":[],"nodeType":"FunctionCall","src":"3222:32:0","tryCall":false,"typeDescriptions":{"typeIdentifier":"t_uint64","typeString":"uint64"}}],"expression":{"argumentTypes":[{"typeIdentifier":"t_stringliteral_db7deb43f2f9e0404016de53b7e64c4976b54149581f7534daae2551e8cf4e40","typeString":"literal_string \"sender nonce\""},{"typeIdentifier":"t_uint64","typeString":"uint64"}],"expression":{"id":268,"name":"console","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":192,"src":"3194:7:0","typeDescriptions":{"typeIdentifier":"t_type$_t_contract$_console_$192_$","typeString":"type(library console)"}},"id":270,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"memberName":"log","nodeType":"MemberAccess","referencedDeclaration":154,"src":"3194:11:0","typeDescriptions":{"typeIdentifier":"t_function_internal_pure$_t_string_memory_ptr_$_t_uint256_$returns$__$","typeString":"function (string memory,uint256) pure"}},"id":280,"isConstant":false,"isLValue":false,"isPure":false,"kind":"functionCall","lValueRequested":false,"names":[],"nodeType":"FunctionCall","src":"3194:61:0","tryCall":false,"typeDescriptions":{"typeIdentifier":"t_tuple$__$","typeString":"tuple()"}},"id":281,"nodeType":"ExpressionStatement","src":"3194:61:0"},{"assignments":[283],"declarations":[{"constant":false,"id":283,"mutability":"mutable","name":"json","nameLocation":"3280:4:0","nodeType":"VariableDeclaration","scope":377,"src":"3266:18:0","stateVariable":false,"storageLocation":"memory","typeDescriptions":{"typeIdentifier":"t_string_memory_ptr","typeString":"string"},"typeName":{"id":282,"name":"string","nodeType":"ElementaryTypeName","src":"3266:6:0","typeDescriptions":{"typeIdentifier":"t_string_storage_ptr","typeString":"string"}},"visibility":"internal"}],"id":285,"initialValue":{"hexValue":"7b22726f6f745f6b6579223a205b7b2261223a20312c202262223a20327d5d7d","id":284,"isConstant":false,"isLValue":false,"isPure":true,"kind":"string","lValueRequested":false,"nodeType":"Literal","src":"3287:34:0","typeDescriptions":{"typeIdentifier":"t_stringliteral_e95522e99766888d0261f55bd1eae5e3f3e26eaf009a16e2433eafaf0a4ecdf2","typeString":"literal_string \"{\"root_key\": [{\"a\": 1, \"b\": 2}]}\""},"value":"{\"root_key\": [{\"a\": 1, \"b\": 2}]}"},"nodeType":"VariableDeclarationStatement","src":"3266:55:0"},{"assignments":[290],"declarations":[{"constant":false,"id":290,"mutability":"mutable","name":"keys","nameLocation":"3347:4:0","nodeType":"VariableDeclaration","scope":377,"src":"3331:20:0","stateVariable":false,"storageLocation":"memory","typeDescriptions":{"typeIdentifier":"t_array$_t_string_memory_ptr_$dyn_memory_ptr","typeString":"string[]"},"typeName":{"baseType":{"id":288,"name":"string","nodeType":"ElementaryTypeName","src":"3331:6:0","typeDescriptions":{"typeIdentifier":"t_string_storage_ptr","typeString":"string"}},"id":289,"nodeType":"ArrayTypeName","src":"3331:8:0","typeDescriptions":{"typeIdentifier":"t_array$_t_string_storage_$dyn_storage_ptr","typeString":"string[]"}},"visibility":"internal"}],"id":296,"initialValue":{"arguments":[{"id":293,"name":"json","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":283,"src":"3371:4:0","typeDescriptions":{"typeIdentifier":"t_string_memory_ptr","typeString":"string memory"}},{"hexValue":"2e726f6f745f6b65795b305d","id":294,"isConstant":false,"isLValue":false,"isPure":true,"kind":"string","lValueRequested":false,"nodeType":"Literal","src":"3377:14:0","typeDescriptions":{"typeIdentifier":"t_stringliteral_d82f67100edb80050915e1ec4b565c9a8319a22efb1075e1298b7bb60101d266","typeString":"literal_string \".root_key[0]\""},"value":".root_key[0]"}],"expression":{"argumentTypes":[{"typeIdentifier":"t_string_memory_ptr","typeString":"string memory"},{"typeIdentifier":"t_stringliteral_d82f67100edb80050915e1ec4b565c9a8319a22efb1075e1298b7bb60101d266","typeString":"literal_string \".root_key[0]\""}],"expression":{"id":291,"name":"vm","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":213,"src":"3354:2:0","typeDescriptions":{"typeIdentifier":"t_contract$_Vm_$55","typeString":"contract Vm"}},"id":292,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"memberName":"parseJsonKeys","nodeType":"MemberAccess","referencedDeclaration":27,"src":"3354:16:0","typeDescriptions":{"typeIdentifier":"t_function_external_pure$_t_string_memory_ptr_$_t_string_memory_ptr_$returns$_t_array$_t_string_memory_ptr_$dyn_memory_ptr_$","typeString":"function (string memory,string memory) pure external returns (string memory[] memory)"}},"id":295,"isConstant":false,"isLValue":false,"isPure":false,"kind":"functionCall","lValueRequested":false,"names":[],"nodeType":"FunctionCall","src":"3354:38:0","tryCall":false,"typeDescriptions":{"typeIdentifier":"t_array$_t_string_memory_ptr_$dyn_memory_ptr","typeString":"string memory[] memory"}},"nodeType":"VariableDeclarationStatement","src":"3331:61:0"},{"expression":{"arguments":[{"hexValue":"6b657973","id":300,"isConstant":false,"isLValue":false,"isPure":true,"kind":"string","lValueRequested":false,"nodeType":"Literal","src":"3414:6:0","typeDescriptions":{"typeIdentifier":"t_stringliteral_f29790a80c4ce5f42f59892f424f9c92856c6b656c3378e2cf305b260c6f4195","typeString":"literal_string \"keys\""},"value":"keys"},{"baseExpression":{"id":301,"name":"keys","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":290,"src":"3422:4:0","typeDescriptions":{"typeIdentifier":"t_array$_t_string_memory_ptr_$dyn_memory_ptr","typeString":"string memory[] memory"}},"id":303,"indexExpression":{"hexValue":"30","id":302,"isConstant":false,"isLValue":false,"isPure":true,"kind":"number","lValueRequested":false,"nodeType":"Literal","src":"3427:1:0","typeDescriptions":{"typeIdentifier":"t_rational_0_by_1","typeString":"int_const 0"},"value":"0"},"isConstant":false,"isLValue":true,"isPure":false,"lValueRequested":false,"nodeType":"IndexAccess","src":"3422:7:0","typeDescriptions":{"typeIdentifier":"t_string_memory_ptr","typeString":"string memory"}},{"baseExpression":{"id":304,"name":"keys","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":290,"src":"3431:4:0","typeDescriptions":{"typeIdentifier":"t_array$_t_string_memory_ptr_$dyn_memory_ptr","typeString":"string memory[] memory"}},"id":306,"indexExpression":{"hexValue":"31","id":305,"isConstant":false,"isLValue":false,"isPure":true,"kind":"number","lValueRequested":false,"nodeType":"Literal","src":"3436:1:0","typeDescriptions":{"typeIdentifier":"t_rational_1_by_1","typeString":"int_const 1"},"value":"1"},"isConstant":false,"isLValue":true,"isPure":false,"lValueRequested":false,"nodeType":"IndexAccess","src":"3431:7:0","typeDescriptions":{"typeIdentifier":"t_string_memory_ptr","typeString":"string memory"}}],"expression":{"argumentTypes":[{"typeIdentifier":"t_stringliteral_f29790a80c4ce5f42f59892f424f9c92856c6b656c3378e2cf305b260c6f4195","typeString":"literal_string \"keys\""},{"typeIdentifier":"t_string_memory_ptr","typeString":"string memory"},{"typeIdentifier":"t_string_memory_ptr","typeString":"string memory"}],"expression":{"id":297,"name":"console","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":192,"src":"3402:7:0","typeDescriptions":{"typeIdentifier":"t_type$_t_contract$_console_$192_$","typeString":"type(library console)"}},"id":299,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"memberName":"log","nodeType":"MemberAccess","referencedDeclaration":191,"src":"3402:11:0","typeDescriptions":{"typeIdentifier":"t_function_internal_pure$_t_string_memory_ptr_$_t_string_memory_ptr_$_t_string_memory_ptr_$returns$__$","typeString":"function (string memory,string memory,string memory) pure"}},"id":307,"isConstant":false,"isLValue":false,"isPure":false,"kind":"functionCall","lValueRequested":false,"names":[],"nodeType":"FunctionCall","src":"3402:37:0","tryCall":false,"typeDescriptions":{"typeIdentifier":"t_tuple$__$","typeString":"tuple()"}},"id":308,"nodeType":"ExpressionStatement","src":"3402:37:0"},{"expression":{"arguments":[{"hexValue":"66726f6d206f726967696e616c","id":312,"isConstant":false,"isLValue":false,"isPure":true,"kind":"string","lValueRequested":false,"nodeType":"Literal","src":"3461:15:0","typeDescriptions":{"typeIdentifier":"t_stringliteral_77928970c8757d110f3c23e003246f49e0de890480ba9717ba659b2f56f316b2","typeString":"literal_string \"from original\""},"value":"from original"}],"expression":{"argumentTypes":[{"typeIdentifier":"t_stringliteral_77928970c8757d110f3c23e003246f49e0de890480ba9717ba659b2f56f316b2","typeString":"literal_string \"from original\""}],"expression":{"id":309,"name":"this","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":-28,"src":"3450:4:0","typeDescriptions":{"typeIdentifier":"t_contract$_ScriptExample_$706","typeString":"contract ScriptExample"}},"id":311,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"memberName":"hello","nodeType":"MemberAccess","referencedDeclaration":633,"src":"3450:10:0","typeDescriptions":{"typeIdentifier":"t_function_external_view$_t_string_memory_ptr_$returns$__$","typeString":"function (string memory) view external"}},"id":313,"isConstant":false,"isLValue":false,"isPure":false,"kind":"functionCall","lValueRequested":false,"names":[],"nodeType":"FunctionCall","src":"3450:27:0","tryCall":false,"typeDescriptions":{"typeIdentifier":"t_tuple$__$","typeString":"tuple()"}},"id":314,"nodeType":"ExpressionStatement","src":"3450:27:0"},{"expression":{"arguments":[{"arguments":[{"arguments":[{"hexValue":"30783432","id":322,"isConstant":false,"isLValue":false,"isPure":true,"kind":"number","lValueRequested":false,"nodeType":"Literal","src":"3517:4:0","typeDescriptions":{"typeIdentifier":"t_rational_66_by_1","typeString":"int_const 66"},"value":"0x42"}],"expression":{"argumentTypes":[{"typeIdentifier":"t_rational_66_by_1","typeString":"int_const 66"}],"id":321,"isConstant":false,"isLValue":false,"isPure":true,"lValueRequested":false,"nodeType":"ElementaryTypeNameExpression","src":"3509:7:0","typeDescriptions":{"typeIdentifier":"t_type$_t_uint160_$","typeString":"type(uint160)"},"typeName":{"id":320,"name":"uint160","nodeType":"ElementaryTypeName","src":"3509:7:0","typeDescriptions":{}}},"id":323,"isConstant":false,"isLValue":false,"isPure":true,"kind":"typeConversion","lValueRequested":false,"names":[],"nodeType":"FunctionCall","src":"3509:13:0","tryCall":false,"typeDescriptions":{"typeIdentifier":"t_uint160","typeString":"uint160"}}],"expression":{"argumentTypes":[{"typeIdentifier":"t_uint160","typeString":"uint160"}],"id":319,"isConstant":false,"isLValue":false,"isPure":true,"lValueRequested":false,"nodeType":"ElementaryTypeNameExpression","src":"3501:7:0","typeDescriptions":{"typeIdentifier":"t_type$_t_address_$","typeString":"type(address)"},"typeName":{"id":318,"name":"address","nodeType":"ElementaryTypeName","src":"3501:7:0","typeDescriptions":{}}},"id":324,"isConstant":false,"isLValue":false,"isPure":true,"kind":"typeConversion","lValueRequested":false,"names":[],"nodeType":"FunctionCall","src":"3501:22:0","tryCall":false,"typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"}}],"expression":{"argumentTypes":[{"typeIdentifier":"t_address","typeString":"address"}],"expression":{"id":315,"name":"vm","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":213,"src":"3487:2:0","typeDescriptions":{"typeIdentifier":"t_contract$_Vm_$55","typeString":"contract Vm"}},"id":317,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"memberName":"startPrank","nodeType":"MemberAccess","referencedDeclaration":32,"src":"3487:13:0","typeDescriptions":{"typeIdentifier":"t_function_external_nonpayable$_t_address_$returns$__$","typeString":"function (address) external"}},"id":325,"isConstant":false,"isLValue":false,"isPure":false,"kind":"functionCall","lValueRequested":false,"names":[],"nodeType":"FunctionCall","src":"3487:37:0","tryCall":false,"typeDescriptions":{"typeIdentifier":"t_tuple$__$","typeString":"tuple()"}},"id":326,"nodeType":"ExpressionStatement","src":"3487:37:0"},{"expression":{"arguments":[{"hexValue":"66726f6d207072616e6b2031","id":330,"isConstant":false,"isLValue":false,"isPure":true,"kind":"string","lValueRequested":false,"nodeType":"Literal","src":"3545:14:0","typeDescriptions":{"typeIdentifier":"t_stringliteral_42b34abfe37a8b0add910cda7b4a379e6538fa7a1dcafce47a02bd38f6c88e2a","typeString":"literal_string \"from prank 1\""},"value":"from prank 1"}],"expression":{"argumentTypes":[{"typeIdentifier":"t_stringliteral_42b34abfe37a8b0add910cda7b4a379e6538fa7a1dcafce47a02bd38f6c88e2a","typeString":"literal_string \"from prank 1\""}],"expression":{"id":327,"name":"this","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":-28,"src":"3534:4:0","typeDescriptions":{"typeIdentifier":"t_contract$_ScriptExample_$706","typeString":"contract ScriptExample"}},"id":329,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"memberName":"hello","nodeType":"MemberAccess","referencedDeclaration":633,"src":"3534:10:0","typeDescriptions":{"typeIdentifier":"t_function_external_view$_t_string_memory_ptr_$returns$__$","typeString":"function (string memory) view external"}},"id":331,"isConstant":false,"isLValue":false,"isPure":false,"kind":"functionCall","lValueRequested":false,"names":[],"nodeType":"FunctionCall","src":"3534:26:0","tryCall":false,"typeDescriptions":{"typeIdentifier":"t_tuple$__$","typeString":"tuple()"}},"id":332,"nodeType":"ExpressionStatement","src":"3534:26:0"},{"expression":{"arguments":[{"hexValue":"706172656e742073636f7065206d73672e73656e646572","id":336,"isConstant":false,"isLValue":false,"isPure":true,"kind":"string","lValueRequested":false,"nodeType":"Literal","src":"3582:25:0","typeDescriptions":{"typeIdentifier":"t_stringliteral_83ec9246154d8845de47aafc5c2865c9985d2efe84472c27283879f2fbf5cc94","typeString":"literal_string \"parent scope msg.sender\""},"value":"parent scope msg.sender"},{"arguments":[{"expression":{"id":339,"name":"msg","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":-15,"src":"3617:3:0","typeDescriptions":{"typeIdentifier":"t_magic_message","typeString":"msg"}},"id":340,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"memberName":"sender","nodeType":"MemberAccess","src":"3617:10:0","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"}}],"expression":{"argumentTypes":[{"typeIdentifier":"t_address","typeString":"address"}],"id":338,"isConstant":false,"isLValue":false,"isPure":true,"lValueRequested":false,"nodeType":"ElementaryTypeNameExpression","src":"3609:7:0","typeDescriptions":{"typeIdentifier":"t_type$_t_address_$","typeString":"type(address)"},"typeName":{"id":337,"name":"address","nodeType":"ElementaryTypeName","src":"3609:7:0","typeDescriptions":{}}},"id":341,"isConstant":false,"isLValue":false,"isPure":false,"kind":"typeConversion","lValueRequested":false,"names":[],"nodeType":"FunctionCall","src":"3609:19:0","tryCall":false,"typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"}}],"expression":{"argumentTypes":[{"typeIdentifier":"t_stringliteral_83ec9246154d8845de47aafc5c2865c9985d2efe84472c27283879f2fbf5cc94","typeString":"literal_string \"parent scope msg.sender\""},{"typeIdentifier":"t_address","typeString":"address"}],"expression":{"id":333,"name":"console","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":192,"src":"3570:7:0","typeDescriptions":{"typeIdentifier":"t_type$_t_contract$_console_$192_$","typeString":"type(library console)"}},"id":335,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"memberName":"log","nodeType":"MemberAccess","referencedDeclaration":171,"src":"3570:11:0","typeDescriptions":{"typeIdentifier":"t_function_internal_pure$_t_string_memory_ptr_$_t_address_$returns$__$","typeString":"function (string memory,address) pure"}},"id":342,"isConstant":false,"isLValue":false,"isPure":false,"kind":"functionCall","lValueRequested":false,"names":[],"nodeType":"FunctionCall","src":"3570:59:0","tryCall":false,"typeDescriptions":{"typeIdentifier":"t_tuple$__$","typeString":"tuple()"}},"id":343,"nodeType":"ExpressionStatement","src":"3570:59:0"},{"expression":{"arguments":[{"hexValue":"706172656e742073636f706520636f6e74726163742e61646472","id":347,"isConstant":false,"isLValue":false,"isPure":true,"kind":"string","lValueRequested":false,"nodeType":"Literal","src":"3651:28:0","typeDescriptions":{"typeIdentifier":"t_stringliteral_97df66250e0b2b48f0ec8d0e01eb1b8ca012d95f1572895622aa1ea433e5570f","typeString":"literal_string \"parent scope contract.addr\""},"value":"parent scope contract.addr"},{"arguments":[{"id":350,"name":"this","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":-28,"src":"3689:4:0","typeDescriptions":{"typeIdentifier":"t_contract$_ScriptExample_$706","typeString":"contract ScriptExample"}}],"expression":{"argumentTypes":[{"typeIdentifier":"t_contract$_ScriptExample_$706","typeString":"contract ScriptExample"}],"id":349,"isConstant":false,"isLValue":false,"isPure":true,"lValueRequested":false,"nodeType":"ElementaryTypeNameExpression","src":"3681:7:0","typeDescriptions":{"typeIdentifier":"t_type$_t_address_$","typeString":"type(address)"},"typeName":{"id":348,"name":"address","nodeType":"ElementaryTypeName","src":"3681:7:0","typeDescriptions":{}}},"id":351,"isConstant":false,"isLValue":false,"isPure":false,"kind":"typeConversion","lValueRequested":false,"names":[],"nodeType":"FunctionCall","src":"3681:13:0","tryCall":false,"typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"}}],"expression":{"argumentTypes":[{"typeIdentifier":"t_stringliteral_97df66250e0b2b48f0ec8d0e01eb1b8ca012d95f1572895622aa1ea433e5570f","typeString":"literal_string \"parent scope contract.addr\""},{"typeIdentifier":"t_address","typeString":"address"}],"expression":{"id":344,"name":"console","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":192,"src":"3639:7:0","typeDescriptions":{"typeIdentifier":"t_type$_t_contract$_console_$192_$","typeString":"type(library console)"}},"id":346,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"memberName":"log","nodeType":"MemberAccess","referencedDeclaration":171,"src":"3639:11:0","typeDescriptions":{"typeIdentifier":"t_function_internal_pure$_t_string_memory_ptr_$_t_address_$returns$__$","typeString":"function (string memory,address) pure"}},"id":352,"isConstant":false,"isLValue":false,"isPure":false,"kind":"functionCall","lValueRequested":false,"names":[],"nodeType":"FunctionCall","src":"3639:56:0","tryCall":false,"typeDescriptions":{"typeIdentifier":"t_tuple$__$","typeString":"tuple()"}},"id":353,"nodeType":"ExpressionStatement","src":"3639:56:0"},{"expression":{"arguments":[{"hexValue":"66726f6d207072616e6b2032","id":357,"isConstant":false,"isLValue":false,"isPure":true,"kind":"string","lValueRequested":false,"nodeType":"Literal","src":"3716:14:0","typeDescriptions":{"typeIdentifier":"t_stringliteral_a38a34f8cad750a79aa097a92971f8f405b51ee9d53d25c5b14fc129ba3684bb","typeString":"literal_string \"from prank 2\""},"value":"from prank 2"}],"expression":{"argumentTypes":[{"typeIdentifier":"t_stringliteral_a38a34f8cad750a79aa097a92971f8f405b51ee9d53d25c5b14fc129ba3684bb","typeString":"literal_string \"from prank 2\""}],"expression":{"id":354,"name":"this","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":-28,"src":"3705:4:0","typeDescriptions":{"typeIdentifier":"t_contract$_ScriptExample_$706","typeString":"contract ScriptExample"}},"id":356,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"memberName":"hello","nodeType":"MemberAccess","referencedDeclaration":633,"src":"3705:10:0","typeDescriptions":{"typeIdentifier":"t_function_external_view$_t_string_memory_ptr_$returns$__$","typeString":"function (string memory) view external"}},"id":358,"isConstant":false,"isLValue":false,"isPure":false,"kind":"functionCall","lValueRequested":false,"names":[],"nodeType":"FunctionCall","src":"3705:26:0","tryCall":false,"typeDescriptions":{"typeIdentifier":"t_tuple$__$","typeString":"tuple()"}},"id":359,"nodeType":"ExpressionStatement","src":"3705:26:0"},{"expression":{"arguments":[],"expression":{"argumentTypes":[],"expression":{"id":360,"name":"vm","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":213,"src":"3741:2:0","typeDescriptions":{"typeIdentifier":"t_contract$_Vm_$55","typeString":"contract Vm"}},"id":362,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"memberName":"stopPrank","nodeType":"MemberAccess","referencedDeclaration":35,"src":"3741:12:0","typeDescriptions":{"typeIdentifier":"t_function_external_nonpayable$__$returns$__$","typeString":"function () external"}},"id":363,"isConstant":false,"isLValue":false,"isPure":false,"kind":"functionCall","lValueRequested":false,"names":[],"nodeType":"FunctionCall","src":"3741:14:0","tryCall":false,"typeDescriptions":{"typeIdentifier":"t_tuple$__$","typeString":"tuple()"}},"id":364,"nodeType":"ExpressionStatement","src":"3741:14:0"},{"expression":{"arguments":[{"hexValue":"66726f6d206f726967696e616c20616761696e","id":368,"isConstant":false,"isLValue":false,"isPure":true,"kind":"string","lValueRequested":false,"nodeType":"Literal","src":"3776:21:0","typeDescriptions":{"typeIdentifier":"t_stringliteral_0c805c6579e20a9c4c8e11aeab23330910a9f2da629191dc119d1730e8ed6860","typeString":"literal_string \"from original again\""},"value":"from original again"}],"expression":{"argumentTypes":[{"typeIdentifier":"t_stringliteral_0c805c6579e20a9c4c8e11aeab23330910a9f2da629191dc119d1730e8ed6860","typeString":"literal_string \"from original again\""}],"expression":{"id":365,"name":"this","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":-28,"src":"3765:4:0","typeDescriptions":{"typeIdentifier":"t_contract$_ScriptExample_$706","typeString":"contract ScriptExample"}},"id":367,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"memberName":"hello","nodeType":"MemberAccess","referencedDeclaration":633,"src":"3765:10:0","typeDescriptions":{"typeIdentifier":"t_function_external_view$_t_string_memory_ptr_$returns$__$","typeString":"function (string memory) view external"}},"id":369,"isConstant":false,"isLValue":false,"isPure":false,"kind":"functionCall","lValueRequested":false,"names":[],"nodeType":"FunctionCall","src":"3765:33:0","tryCall":false,"typeDescriptions":{"typeIdentifier":"t_tuple$__$","typeString":"tuple()"}},"id":370,"nodeType":"ExpressionStatement","src":"3765:33:0"},{"expression":{"arguments":[{"hexValue":"646f6e6521","id":374,"isConstant":false,"isLValue":false,"isPure":true,"kind":"string","lValueRequested":false,"nodeType":"Literal","src":"3821:7:0","typeDescriptions":{"typeIdentifier":"t_stringliteral_080382d5c9e9e7c5e3d1d33f5e7422740375955180fadff167d8130e0c35f3fc","typeString":"literal_string \"done!\""},"value":"done!"}],"expression":{"argumentTypes":[{"typeIdentifier":"t_stringliteral_080382d5c9e9e7c5e3d1d33f5e7422740375955180fadff167d8130e0c35f3fc","typeString":"literal_string \"done!\""}],"expression":{"id":371,"name":"console","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":192,"src":"3809:7:0","typeDescriptions":{"typeIdentifier":"t_type$_t_contract$_console_$192_$","typeString":"type(library console)"}},"id":373,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"memberName":"log","nodeType":"MemberAccess","referencedDeclaration":120,"src":"3809:11:0","typeDescriptions":{"typeIdentifier":"t_function_internal_pure$_t_string_memory_ptr_$returns$__$","typeString":"function (string memory) pure"}},"id":375,"isConstant":false,"isLValue":false,"isPure":false,"kind":"functionCall","lValueRequested":false,"names":[],"nodeType":"FunctionCall","src":"3809:20:0","tryCall":false,"typeDescriptions":{"typeIdentifier":"t_tuple$__$","typeString":"tuple()"}},"id":376,"nodeType":"ExpressionStatement","src":"3809:20:0"}]},"documentation":{"id":216,"nodeType":"StructuredDocumentation","src":"2804:78:0","text":"@notice example function, runs through basic cheat-codes and console logs."},"functionSelector":"c0406226","implemented":true,"kind":"function","modifiers":[],"name":"run","nameLocation":"2896:3:0","parameters":{"id":217,"nodeType":"ParameterList","parameters":[],"src":"2899:2:0"},"returnParameters":{"id":218,"nodeType":"ParameterList","parameters":[],"src":"2909:0:0"},"scope":706,"stateMutability":"nonpayable","virtual":false,"visibility":"public"},{"id":609,"nodeType":"FunctionDefinition","src":"3903:1258:0","nodes":[],"body":{"id":608,"nodeType":"Block","src":"3934:1227:0","nodes":[],"statements":[{"expression":{"arguments":[{"hexValue":"6e6f6e6365207374617274","id":385,"isConstant":false,"isLValue":false,"isPure":true,"kind":"string","lValueRequested":false,"nodeType":"Literal","src":"3956:13:0","typeDescriptions":{"typeIdentifier":"t_stringliteral_71efc69b9a13b6bc1e9a14d766ff01c79022262c6daa6532fb5dfb14f8511a20","typeString":"literal_string \"nonce start\""},"value":"nonce start"},{"arguments":[{"arguments":[{"arguments":[{"id":392,"name":"this","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":-28,"src":"3999:4:0","typeDescriptions":{"typeIdentifier":"t_contract$_ScriptExample_$706","typeString":"contract ScriptExample"}}],"expression":{"argumentTypes":[{"typeIdentifier":"t_contract$_ScriptExample_$706","typeString":"contract ScriptExample"}],"id":391,"isConstant":false,"isLValue":false,"isPure":true,"lValueRequested":false,"nodeType":"ElementaryTypeNameExpression","src":"3991:7:0","typeDescriptions":{"typeIdentifier":"t_type$_t_address_$","typeString":"type(address)"},"typeName":{"id":390,"name":"address","nodeType":"ElementaryTypeName","src":"3991:7:0","typeDescriptions":{}}},"id":393,"isConstant":false,"isLValue":false,"isPure":false,"kind":"typeConversion","lValueRequested":false,"names":[],"nodeType":"FunctionCall","src":"3991:13:0","tryCall":false,"typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"}}],"expression":{"argumentTypes":[{"typeIdentifier":"t_address","typeString":"address"}],"expression":{"id":388,"name":"vm","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":213,"src":"3979:2:0","typeDescriptions":{"typeIdentifier":"t_contract$_Vm_$55","typeString":"contract Vm"}},"id":389,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"memberName":"getNonce","nodeType":"MemberAccess","referencedDeclaration":17,"src":"3979:11:0","typeDescriptions":{"typeIdentifier":"t_function_external_view$_t_address_$returns$_t_uint64_$","typeString":"function (address) view external returns (uint64)"}},"id":394,"isConstant":false,"isLValue":false,"isPure":false,"kind":"functionCall","lValueRequested":false,"names":[],"nodeType":"FunctionCall","src":"3979:26:0","tryCall":false,"typeDescriptions":{"typeIdentifier":"t_uint64","typeString":"uint64"}}],"expression":{"argumentTypes":[{"typeIdentifier":"t_uint64","typeString":"uint64"}],"id":387,"isConstant":false,"isLValue":false,"isPure":true,"lValueRequested":false,"nodeType":"ElementaryTypeNameExpression","src":"3971:7:0","typeDescriptions":{"typeIdentifier":"t_type$_t_uint256_$","typeString":"type(uint256)"},"typeName":{"id":386,"name":"uint256","nodeType":"ElementaryTypeName","src":"3971:7:0","typeDescriptions":{}}},"id":395,"isConstant":false,"isLValue":false,"isPure":false,"kind":"typeConversion","lValueRequested":false,"names":[],"nodeType":"FunctionCall","src":"3971:35:0","tryCall":false,"typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}}],"expression":{"argumentTypes":[{"typeIdentifier":"t_stringliteral_71efc69b9a13b6bc1e9a14d766ff01c79022262c6daa6532fb5dfb14f8511a20","typeString":"literal_string \"nonce start\""},{"typeIdentifier":"t_uint256","typeString":"uint256"}],"expression":{"id":382,"name":"console","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":192,"src":"3944:7:0","typeDescriptions":{"typeIdentifier":"t_type$_t_contract$_console_$192_$","typeString":"type(library console)"}},"id":384,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"memberName":"log","nodeType":"MemberAccess","referencedDeclaration":154,"src":"3944:11:0","typeDescriptions":{"typeIdentifier":"t_function_internal_pure$_t_string_memory_ptr_$_t_uint256_$returns$__$","typeString":"function (string memory,uint256) pure"}},"id":396,"isConstant":false,"isLValue":false,"isPure":false,"kind":"functionCall","lValueRequested":false,"names":[],"nodeType":"FunctionCall","src":"3944:63:0","tryCall":false,"typeDescriptions":{"typeIdentifier":"t_tuple$__$","typeString":"tuple()"}},"id":397,"nodeType":"ExpressionStatement","src":"3944:63:0"},{"expression":{"arguments":[{"hexValue":"74657374696e672073696e676c65","id":401,"isConstant":false,"isLValue":false,"isPure":true,"kind":"string","lValueRequested":false,"nodeType":"Literal","src":"4030:16:0","typeDescriptions":{"typeIdentifier":"t_stringliteral_b75103528423218e7569082dad569ed0d2ce7c0ac770c0812b220e2d369fe474","typeString":"literal_string \"testing single\""},"value":"testing single"}],"expression":{"argumentTypes":[{"typeIdentifier":"t_stringliteral_b75103528423218e7569082dad569ed0d2ce7c0ac770c0812b220e2d369fe474","typeString":"literal_string \"testing single\""}],"expression":{"id":398,"name":"console","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":192,"src":"4018:7:0","typeDescriptions":{"typeIdentifier":"t_type$_t_contract$_console_$192_$","typeString":"type(library console)"}},"id":400,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"memberName":"log","nodeType":"MemberAccess","referencedDeclaration":120,"src":"4018:11:0","typeDescriptions":{"typeIdentifier":"t_function_internal_pure$_t_string_memory_ptr_$returns$__$","typeString":"function (string memory) pure"}},"id":402,"isConstant":false,"isLValue":false,"isPure":false,"kind":"functionCall","lValueRequested":false,"names":[],"nodeType":"FunctionCall","src":"4018:29:0","tryCall":false,"typeDescriptions":{"typeIdentifier":"t_tuple$__$","typeString":"tuple()"}},"id":403,"nodeType":"ExpressionStatement","src":"4018:29:0"},{"expression":{"arguments":[],"expression":{"argumentTypes":[],"expression":{"id":404,"name":"vm","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":213,"src":"4057:2:0","typeDescriptions":{"typeIdentifier":"t_contract$_Vm_$55","typeString":"contract Vm"}},"id":406,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"memberName":"broadcast","nodeType":"MemberAccess","referencedDeclaration":38,"src":"4057:12:0","typeDescriptions":{"typeIdentifier":"t_function_external_nonpayable$__$returns$__$","typeString":"function () external"}},"id":407,"isConstant":false,"isLValue":false,"isPure":false,"kind":"functionCall","lValueRequested":false,"names":[],"nodeType":"FunctionCall","src":"4057:14:0","tryCall":false,"typeDescriptions":{"typeIdentifier":"t_tuple$__$","typeString":"tuple()"}},"id":408,"nodeType":"ExpressionStatement","src":"4057:14:0"},{"expression":{"arguments":[{"hexValue":"73696e676c655f63616c6c31","id":412,"isConstant":false,"isLValue":false,"isPure":true,"kind":"string","lValueRequested":false,"nodeType":"Literal","src":"4092:14:0","typeDescriptions":{"typeIdentifier":"t_stringliteral_5e1cad6d7a968cfacf2731373e1248ffb11f4886bced66a02a6de1a67ac8f777","typeString":"literal_string \"single_call1\""},"value":"single_call1"}],"expression":{"argumentTypes":[{"typeIdentifier":"t_stringliteral_5e1cad6d7a968cfacf2731373e1248ffb11f4886bced66a02a6de1a67ac8f777","typeString":"literal_string \"single_call1\""}],"expression":{"id":409,"name":"this","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":-28,"src":"4081:4:0","typeDescriptions":{"typeIdentifier":"t_contract$_ScriptExample_$706","typeString":"contract ScriptExample"}},"id":411,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"memberName":"call1","nodeType":"MemberAccess","referencedDeclaration":648,"src":"4081:10:0","typeDescriptions":{"typeIdentifier":"t_function_external_nonpayable$_t_string_memory_ptr_$returns$__$","typeString":"function (string memory) external"}},"id":413,"isConstant":false,"isLValue":false,"isPure":false,"kind":"functionCall","lValueRequested":false,"names":[],"nodeType":"FunctionCall","src":"4081:26:0","tryCall":false,"typeDescriptions":{"typeIdentifier":"t_tuple$__$","typeString":"tuple()"}},"id":414,"nodeType":"ExpressionStatement","src":"4081:26:0"},{"expression":{"arguments":[{"hexValue":"73696e676c655f63616c6c32","id":418,"isConstant":false,"isLValue":false,"isPure":true,"kind":"string","lValueRequested":false,"nodeType":"Literal","src":"4128:14:0","typeDescriptions":{"typeIdentifier":"t_stringliteral_b37ddaf5d00ad9e6371de3fb71b91eef731fae1e86b768666380f7d44e1ada25","typeString":"literal_string \"single_call2\""},"value":"single_call2"}],"expression":{"argumentTypes":[{"typeIdentifier":"t_stringliteral_b37ddaf5d00ad9e6371de3fb71b91eef731fae1e86b768666380f7d44e1ada25","typeString":"literal_string \"single_call2\""}],"expression":{"id":415,"name":"this","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":-28,"src":"4117:4:0","typeDescriptions":{"typeIdentifier":"t_contract$_ScriptExample_$706","typeString":"contract ScriptExample"}},"id":417,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"memberName":"call2","nodeType":"MemberAccess","referencedDeclaration":663,"src":"4117:10:0","typeDescriptions":{"typeIdentifier":"t_function_external_nonpayable$_t_string_memory_ptr_$returns$__$","typeString":"function (string memory) external"}},"id":419,"isConstant":false,"isLValue":false,"isPure":false,"kind":"functionCall","lValueRequested":false,"names":[],"nodeType":"FunctionCall","src":"4117:26:0","tryCall":false,"typeDescriptions":{"typeIdentifier":"t_tuple$__$","typeString":"tuple()"}},"id":420,"nodeType":"ExpressionStatement","src":"4117:26:0"},{"expression":{"arguments":[{"hexValue":"74657374696e672073746172742f73746f70","id":424,"isConstant":false,"isLValue":false,"isPure":true,"kind":"string","lValueRequested":false,"nodeType":"Literal","src":"4166:20:0","typeDescriptions":{"typeIdentifier":"t_stringliteral_778e886e3a1c3c5096aca76228832105f3f9269f362effd0e8ce3737787cb784","typeString":"literal_string \"testing start/stop\""},"value":"testing start/stop"}],"expression":{"argumentTypes":[{"typeIdentifier":"t_stringliteral_778e886e3a1c3c5096aca76228832105f3f9269f362effd0e8ce3737787cb784","typeString":"literal_string \"testing start/stop\""}],"expression":{"id":421,"name":"console","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":192,"src":"4154:7:0","typeDescriptions":{"typeIdentifier":"t_type$_t_contract$_console_$192_$","typeString":"type(library console)"}},"id":423,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"memberName":"log","nodeType":"MemberAccess","referencedDeclaration":120,"src":"4154:11:0","typeDescriptions":{"typeIdentifier":"t_function_internal_pure$_t_string_memory_ptr_$returns$__$","typeString":"function (string memory) pure"}},"id":425,"isConstant":false,"isLValue":false,"isPure":false,"kind":"functionCall","lValueRequested":false,"names":[],"nodeType":"FunctionCall","src":"4154:33:0","tryCall":false,"typeDescriptions":{"typeIdentifier":"t_tuple$__$","typeString":"tuple()"}},"id":426,"nodeType":"ExpressionStatement","src":"4154:33:0"},{"expression":{"arguments":[{"arguments":[{"arguments":[{"hexValue":"3078633066666565","id":434,"isConstant":false,"isLValue":false,"isPure":true,"kind":"number","lValueRequested":false,"nodeType":"Literal","src":"4231:8:0","typeDescriptions":{"typeIdentifier":"t_rational_12648430_by_1","typeString":"int_const 12648430"},"value":"0xc0ffee"}],"expression":{"argumentTypes":[{"typeIdentifier":"t_rational_12648430_by_1","typeString":"int_const 12648430"}],"id":433,"isConstant":false,"isLValue":false,"isPure":true,"lValueRequested":false,"nodeType":"ElementaryTypeNameExpression","src":"4223:7:0","typeDescriptions":{"typeIdentifier":"t_type$_t_uint160_$","typeString":"type(uint160)"},"typeName":{"id":432,"name":"uint160","nodeType":"ElementaryTypeName","src":"4223:7:0","typeDescriptions":{}}},"id":435,"isConstant":false,"isLValue":false,"isPure":true,"kind":"typeConversion","lValueRequested":false,"names":[],"nodeType":"FunctionCall","src":"4223:17:0","tryCall":false,"typeDescriptions":{"typeIdentifier":"t_uint160","typeString":"uint160"}}],"expression":{"argumentTypes":[{"typeIdentifier":"t_uint160","typeString":"uint160"}],"id":431,"isConstant":false,"isLValue":false,"isPure":true,"lValueRequested":false,"nodeType":"ElementaryTypeNameExpression","src":"4215:7:0","typeDescriptions":{"typeIdentifier":"t_type$_t_address_$","typeString":"type(address)"},"typeName":{"id":430,"name":"address","nodeType":"ElementaryTypeName","src":"4215:7:0","typeDescriptions":{}}},"id":436,"isConstant":false,"isLValue":false,"isPure":true,"kind":"typeConversion","lValueRequested":false,"names":[],"nodeType":"FunctionCall","src":"4215:26:0","tryCall":false,"typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"}}],"expression":{"argumentTypes":[{"typeIdentifier":"t_address","typeString":"address"}],"expression":{"id":427,"name":"vm","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":213,"src":"4197:2:0","typeDescriptions":{"typeIdentifier":"t_contract$_Vm_$55","typeString":"contract Vm"}},"id":429,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"memberName":"startBroadcast","nodeType":"MemberAccess","referencedDeclaration":48,"src":"4197:17:0","typeDescriptions":{"typeIdentifier":"t_function_external_nonpayable$_t_address_$returns$__$","typeString":"function (address) external"}},"id":437,"isConstant":false,"isLValue":false,"isPure":false,"kind":"functionCall","lValueRequested":false,"names":[],"nodeType":"FunctionCall","src":"4197:45:0","tryCall":false,"typeDescriptions":{"typeIdentifier":"t_tuple$__$","typeString":"tuple()"}},"id":438,"nodeType":"ExpressionStatement","src":"4197:45:0"},{"expression":{"arguments":[{"hexValue":"737461727473746f705f63616c6c31","id":442,"isConstant":false,"isLValue":false,"isPure":true,"kind":"string","lValueRequested":false,"nodeType":"Literal","src":"4263:17:0","typeDescriptions":{"typeIdentifier":"t_stringliteral_2fc2682edf10ed478ee3b9a190f6b1c88bb492b300935ce44545a1613cf8f041","typeString":"literal_string \"startstop_call1\""},"value":"startstop_call1"}],"expression":{"argumentTypes":[{"typeIdentifier":"t_stringliteral_2fc2682edf10ed478ee3b9a190f6b1c88bb492b300935ce44545a1613cf8f041","typeString":"literal_string \"startstop_call1\""}],"expression":{"id":439,"name":"this","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":-28,"src":"4252:4:0","typeDescriptions":{"typeIdentifier":"t_contract$_ScriptExample_$706","typeString":"contract ScriptExample"}},"id":441,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"memberName":"call1","nodeType":"MemberAccess","referencedDeclaration":648,"src":"4252:10:0","typeDescriptions":{"typeIdentifier":"t_function_external_nonpayable$_t_string_memory_ptr_$returns$__$","typeString":"function (string memory) external"}},"id":443,"isConstant":false,"isLValue":false,"isPure":false,"kind":"functionCall","lValueRequested":false,"names":[],"nodeType":"FunctionCall","src":"4252:29:0","tryCall":false,"typeDescriptions":{"typeIdentifier":"t_tuple$__$","typeString":"tuple()"}},"id":444,"nodeType":"ExpressionStatement","src":"4252:29:0"},{"expression":{"arguments":[{"hexValue":"737461727473746f705f63616c6c32","id":448,"isConstant":false,"isLValue":false,"isPure":true,"kind":"string","lValueRequested":false,"nodeType":"Literal","src":"4302:17:0","typeDescriptions":{"typeIdentifier":"t_stringliteral_1a6fd77f04b28bf45d6d0e2dd4c65c0bbfeba174f849e43bb67ebca1c019cda4","typeString":"literal_string \"startstop_call2\""},"value":"startstop_call2"}],"expression":{"argumentTypes":[{"typeIdentifier":"t_stringliteral_1a6fd77f04b28bf45d6d0e2dd4c65c0bbfeba174f849e43bb67ebca1c019cda4","typeString":"literal_string \"startstop_call2\""}],"expression":{"id":445,"name":"this","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":-28,"src":"4291:4:0","typeDescriptions":{"typeIdentifier":"t_contract$_ScriptExample_$706","typeString":"contract ScriptExample"}},"id":447,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"memberName":"call2","nodeType":"MemberAccess","referencedDeclaration":663,"src":"4291:10:0","typeDescriptions":{"typeIdentifier":"t_function_external_nonpayable$_t_string_memory_ptr_$returns$__$","typeString":"function (string memory) external"}},"id":449,"isConstant":false,"isLValue":false,"isPure":false,"kind":"functionCall","lValueRequested":false,"names":[],"nodeType":"FunctionCall","src":"4291:29:0","tryCall":false,"typeDescriptions":{"typeIdentifier":"t_tuple$__$","typeString":"tuple()"}},"id":450,"nodeType":"ExpressionStatement","src":"4291:29:0"},{"expression":{"arguments":[{"hexValue":"737461727473746f705f70757265","id":454,"isConstant":false,"isLValue":false,"isPure":true,"kind":"string","lValueRequested":false,"nodeType":"Literal","src":"4344:16:0","typeDescriptions":{"typeIdentifier":"t_stringliteral_b6e9eb1efd186b1d92b54da45026aa97a178e6eaffdf9dbf9f666fc751fb0ff9","typeString":"literal_string \"startstop_pure\""},"value":"startstop_pure"}],"expression":{"argumentTypes":[{"typeIdentifier":"t_stringliteral_b6e9eb1efd186b1d92b54da45026aa97a178e6eaffdf9dbf9f666fc751fb0ff9","typeString":"literal_string \"startstop_pure\""}],"expression":{"id":451,"name":"this","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":-28,"src":"4330:4:0","typeDescriptions":{"typeIdentifier":"t_contract$_ScriptExample_$706","typeString":"contract ScriptExample"}},"id":453,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"memberName":"callPure","nodeType":"MemberAccess","referencedDeclaration":705,"src":"4330:13:0","typeDescriptions":{"typeIdentifier":"t_function_external_pure$_t_string_memory_ptr_$returns$__$","typeString":"function (string memory) pure external"}},"id":455,"isConstant":false,"isLValue":false,"isPure":false,"kind":"functionCall","lValueRequested":false,"names":[],"nodeType":"FunctionCall","src":"4330:31:0","tryCall":false,"typeDescriptions":{"typeIdentifier":"t_tuple$__$","typeString":"tuple()"}},"id":456,"nodeType":"ExpressionStatement","src":"4330:31:0"},{"expression":{"arguments":[],"expression":{"argumentTypes":[],"expression":{"id":457,"name":"vm","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":213,"src":"4371:2:0","typeDescriptions":{"typeIdentifier":"t_contract$_Vm_$55","typeString":"contract Vm"}},"id":459,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"memberName":"stopBroadcast","nodeType":"MemberAccess","referencedDeclaration":54,"src":"4371:16:0","typeDescriptions":{"typeIdentifier":"t_function_external_nonpayable$__$returns$__$","typeString":"function () external"}},"id":460,"isConstant":false,"isLValue":false,"isPure":false,"kind":"functionCall","lValueRequested":false,"names":[],"nodeType":"FunctionCall","src":"4371:18:0","tryCall":false,"typeDescriptions":{"typeIdentifier":"t_tuple$__$","typeString":"tuple()"}},"id":461,"nodeType":"ExpressionStatement","src":"4371:18:0"},{"expression":{"arguments":[{"hexValue":"737461727473746f705f63616c6c33","id":465,"isConstant":false,"isLValue":false,"isPure":true,"kind":"string","lValueRequested":false,"nodeType":"Literal","src":"4410:17:0","typeDescriptions":{"typeIdentifier":"t_stringliteral_8eb502bfdc4adda22bd960aa2ae13ce4c0ed8cc3b3791ed65e321a38cdd36f72","typeString":"literal_string \"startstop_call3\""},"value":"startstop_call3"}],"expression":{"argumentTypes":[{"typeIdentifier":"t_stringliteral_8eb502bfdc4adda22bd960aa2ae13ce4c0ed8cc3b3791ed65e321a38cdd36f72","typeString":"literal_string \"startstop_call3\""}],"expression":{"id":462,"name":"this","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":-28,"src":"4399:4:0","typeDescriptions":{"typeIdentifier":"t_contract$_ScriptExample_$706","typeString":"contract ScriptExample"}},"id":464,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"memberName":"call1","nodeType":"MemberAccess","referencedDeclaration":648,"src":"4399:10:0","typeDescriptions":{"typeIdentifier":"t_function_external_nonpayable$_t_string_memory_ptr_$returns$__$","typeString":"function (string memory) external"}},"id":466,"isConstant":false,"isLValue":false,"isPure":false,"kind":"functionCall","lValueRequested":false,"names":[],"nodeType":"FunctionCall","src":"4399:29:0","tryCall":false,"typeDescriptions":{"typeIdentifier":"t_tuple$__$","typeString":"tuple()"}},"id":467,"nodeType":"ExpressionStatement","src":"4399:29:0"},{"expression":{"arguments":[{"hexValue":"74657374696e67206e6573746564","id":471,"isConstant":false,"isLValue":false,"isPure":true,"kind":"string","lValueRequested":false,"nodeType":"Literal","src":"4451:16:0","typeDescriptions":{"typeIdentifier":"t_stringliteral_f92f19f7a5b5b9ce341188bf4e15925f184cdb5ac135c4846ced718f259dbde5","typeString":"literal_string \"testing nested\""},"value":"testing nested"}],"expression":{"argumentTypes":[{"typeIdentifier":"t_stringliteral_f92f19f7a5b5b9ce341188bf4e15925f184cdb5ac135c4846ced718f259dbde5","typeString":"literal_string \"testing nested\""}],"expression":{"id":468,"name":"console","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":192,"src":"4439:7:0","typeDescriptions":{"typeIdentifier":"t_type$_t_contract$_console_$192_$","typeString":"type(library console)"}},"id":470,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"memberName":"log","nodeType":"MemberAccess","referencedDeclaration":120,"src":"4439:11:0","typeDescriptions":{"typeIdentifier":"t_function_internal_pure$_t_string_memory_ptr_$returns$__$","typeString":"function (string memory) pure"}},"id":472,"isConstant":false,"isLValue":false,"isPure":false,"kind":"functionCall","lValueRequested":false,"names":[],"nodeType":"FunctionCall","src":"4439:29:0","tryCall":false,"typeDescriptions":{"typeIdentifier":"t_tuple$__$","typeString":"tuple()"}},"id":473,"nodeType":"ExpressionStatement","src":"4439:29:0"},{"expression":{"arguments":[{"arguments":[{"arguments":[{"hexValue":"307831323334","id":481,"isConstant":false,"isLValue":false,"isPure":true,"kind":"number","lValueRequested":false,"nodeType":"Literal","src":"4512:6:0","typeDescriptions":{"typeIdentifier":"t_rational_4660_by_1","typeString":"int_const 4660"},"value":"0x1234"}],"expression":{"argumentTypes":[{"typeIdentifier":"t_rational_4660_by_1","typeString":"int_const 4660"}],"id":480,"isConstant":false,"isLValue":false,"isPure":true,"lValueRequested":false,"nodeType":"ElementaryTypeNameExpression","src":"4504:7:0","typeDescriptions":{"typeIdentifier":"t_type$_t_uint160_$","typeString":"type(uint160)"},"typeName":{"id":479,"name":"uint160","nodeType":"ElementaryTypeName","src":"4504:7:0","typeDescriptions":{}}},"id":482,"isConstant":false,"isLValue":false,"isPure":true,"kind":"typeConversion","lValueRequested":false,"names":[],"nodeType":"FunctionCall","src":"4504:15:0","tryCall":false,"typeDescriptions":{"typeIdentifier":"t_uint160","typeString":"uint160"}}],"expression":{"argumentTypes":[{"typeIdentifier":"t_uint160","typeString":"uint160"}],"id":478,"isConstant":false,"isLValue":false,"isPure":true,"lValueRequested":false,"nodeType":"ElementaryTypeNameExpression","src":"4496:7:0","typeDescriptions":{"typeIdentifier":"t_type$_t_address_$","typeString":"type(address)"},"typeName":{"id":477,"name":"address","nodeType":"ElementaryTypeName","src":"4496:7:0","typeDescriptions":{}}},"id":483,"isConstant":false,"isLValue":false,"isPure":true,"kind":"typeConversion","lValueRequested":false,"names":[],"nodeType":"FunctionCall","src":"4496:24:0","tryCall":false,"typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"}}],"expression":{"argumentTypes":[{"typeIdentifier":"t_address","typeString":"address"}],"expression":{"id":474,"name":"vm","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":213,"src":"4478:2:0","typeDescriptions":{"typeIdentifier":"t_contract$_Vm_$55","typeString":"contract Vm"}},"id":476,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"memberName":"startBroadcast","nodeType":"MemberAccess","referencedDeclaration":48,"src":"4478:17:0","typeDescriptions":{"typeIdentifier":"t_function_external_nonpayable$_t_address_$returns$__$","typeString":"function (address) external"}},"id":484,"isConstant":false,"isLValue":false,"isPure":false,"kind":"functionCall","lValueRequested":false,"names":[],"nodeType":"FunctionCall","src":"4478:43:0","tryCall":false,"typeDescriptions":{"typeIdentifier":"t_tuple$__$","typeString":"tuple()"}},"id":485,"nodeType":"ExpressionStatement","src":"4478:43:0"},{"expression":{"arguments":[{"hexValue":"6e6573746564","id":489,"isConstant":false,"isLValue":false,"isPure":true,"kind":"string","lValueRequested":false,"nodeType":"Literal","src":"4544:8:0","typeDescriptions":{"typeIdentifier":"t_stringliteral_4d5b14044d78fbf0c9dd8b9c49e35f09ee5a6f5b1b3b8117b5d0e15c8dd2cb09","typeString":"literal_string \"nested\""},"value":"nested"}],"expression":{"argumentTypes":[{"typeIdentifier":"t_stringliteral_4d5b14044d78fbf0c9dd8b9c49e35f09ee5a6f5b1b3b8117b5d0e15c8dd2cb09","typeString":"literal_string \"nested\""}],"expression":{"id":486,"name":"this","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":-28,"src":"4531:4:0","typeDescriptions":{"typeIdentifier":"t_contract$_ScriptExample_$706","typeString":"contract ScriptExample"}},"id":488,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"memberName":"nested1","nodeType":"MemberAccess","referencedDeclaration":678,"src":"4531:12:0","typeDescriptions":{"typeIdentifier":"t_function_external_nonpayable$_t_string_memory_ptr_$returns$__$","typeString":"function (string memory) external"}},"id":490,"isConstant":false,"isLValue":false,"isPure":false,"kind":"functionCall","lValueRequested":false,"names":[],"nodeType":"FunctionCall","src":"4531:22:0","tryCall":false,"typeDescriptions":{"typeIdentifier":"t_tuple$__$","typeString":"tuple()"}},"id":491,"nodeType":"ExpressionStatement","src":"4531:22:0"},{"expression":{"arguments":[],"expression":{"argumentTypes":[],"expression":{"id":492,"name":"vm","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":213,"src":"4563:2:0","typeDescriptions":{"typeIdentifier":"t_contract$_Vm_$55","typeString":"contract Vm"}},"id":494,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"memberName":"stopBroadcast","nodeType":"MemberAccess","referencedDeclaration":54,"src":"4563:16:0","typeDescriptions":{"typeIdentifier":"t_function_external_nonpayable$__$returns$__$","typeString":"function () external"}},"id":495,"isConstant":false,"isLValue":false,"isPure":false,"kind":"functionCall","lValueRequested":false,"names":[],"nodeType":"FunctionCall","src":"4563:18:0","tryCall":false,"typeDescriptions":{"typeIdentifier":"t_tuple$__$","typeString":"tuple()"}},"id":496,"nodeType":"ExpressionStatement","src":"4563:18:0"},{"expression":{"arguments":[{"hexValue":"636f6e7472616374206465706c6f796d656e74","id":500,"isConstant":false,"isLValue":false,"isPure":true,"kind":"string","lValueRequested":false,"nodeType":"Literal","src":"4604:21:0","typeDescriptions":{"typeIdentifier":"t_stringliteral_aaf9be86adf9b6872d87eed3526f7c55f3c5d61f4e4dd6d55ef2fcbb8ad0bd57","typeString":"literal_string \"contract deployment\""},"value":"contract deployment"}],"expression":{"argumentTypes":[{"typeIdentifier":"t_stringliteral_aaf9be86adf9b6872d87eed3526f7c55f3c5d61f4e4dd6d55ef2fcbb8ad0bd57","typeString":"literal_string \"contract deployment\""}],"expression":{"id":497,"name":"console","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":192,"src":"4592:7:0","typeDescriptions":{"typeIdentifier":"t_type$_t_contract$_console_$192_$","typeString":"type(library console)"}},"id":499,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"memberName":"log","nodeType":"MemberAccess","referencedDeclaration":120,"src":"4592:11:0","typeDescriptions":{"typeIdentifier":"t_function_internal_pure$_t_string_memory_ptr_$returns$__$","typeString":"function (string memory) pure"}},"id":501,"isConstant":false,"isLValue":false,"isPure":false,"kind":"functionCall","lValueRequested":false,"names":[],"nodeType":"FunctionCall","src":"4592:34:0","tryCall":false,"typeDescriptions":{"typeIdentifier":"t_tuple$__$","typeString":"tuple()"}},"id":502,"nodeType":"ExpressionStatement","src":"4592:34:0"},{"expression":{"arguments":[{"arguments":[{"arguments":[{"hexValue":"3078313233343536","id":510,"isConstant":false,"isLValue":false,"isPure":true,"kind":"number","lValueRequested":false,"nodeType":"Literal","src":"4665:8:0","typeDescriptions":{"typeIdentifier":"t_rational_1193046_by_1","typeString":"int_const 1193046"},"value":"0x123456"}],"expression":{"argumentTypes":[{"typeIdentifier":"t_rational_1193046_by_1","typeString":"int_const 1193046"}],"id":509,"isConstant":false,"isLValue":false,"isPure":true,"lValueRequested":false,"nodeType":"ElementaryTypeNameExpression","src":"4657:7:0","typeDescriptions":{"typeIdentifier":"t_type$_t_uint160_$","typeString":"type(uint160)"},"typeName":{"id":508,"name":"uint160","nodeType":"ElementaryTypeName","src":"4657:7:0","typeDescriptions":{}}},"id":511,"isConstant":false,"isLValue":false,"isPure":true,"kind":"typeConversion","lValueRequested":false,"names":[],"nodeType":"FunctionCall","src":"4657:17:0","tryCall":false,"typeDescriptions":{"typeIdentifier":"t_uint160","typeString":"uint160"}}],"expression":{"argumentTypes":[{"typeIdentifier":"t_uint160","typeString":"uint160"}],"id":507,"isConstant":false,"isLValue":false,"isPure":true,"lValueRequested":false,"nodeType":"ElementaryTypeNameExpression","src":"4649:7:0","typeDescriptions":{"typeIdentifier":"t_type$_t_address_$","typeString":"type(address)"},"typeName":{"id":506,"name":"address","nodeType":"ElementaryTypeName","src":"4649:7:0","typeDescriptions":{}}},"id":512,"isConstant":false,"isLValue":false,"isPure":true,"kind":"typeConversion","lValueRequested":false,"names":[],"nodeType":"FunctionCall","src":"4649:26:0","tryCall":false,"typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"}}],"expression":{"argumentTypes":[{"typeIdentifier":"t_address","typeString":"address"}],"expression":{"id":503,"name":"vm","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":213,"src":"4636:2:0","typeDescriptions":{"typeIdentifier":"t_contract$_Vm_$55","typeString":"contract Vm"}},"id":505,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"memberName":"broadcast","nodeType":"MemberAccess","referencedDeclaration":43,"src":"4636:12:0","typeDescriptions":{"typeIdentifier":"t_function_external_nonpayable$_t_address_$returns$__$","typeString":"function (address) external"}},"id":513,"isConstant":false,"isLValue":false,"isPure":false,"kind":"functionCall","lValueRequested":false,"names":[],"nodeType":"FunctionCall","src":"4636:40:0","tryCall":false,"typeDescriptions":{"typeIdentifier":"t_tuple$__$","typeString":"tuple()"}},"id":514,"nodeType":"ExpressionStatement","src":"4636:40:0"},{"assignments":[517],"declarations":[{"constant":false,"id":517,"mutability":"mutable","name":"x","nameLocation":"4693:1:0","nodeType":"VariableDeclaration","scope":608,"src":"4686:8:0","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_contract$_FooBar_$719","typeString":"contract FooBar"},"typeName":{"id":516,"nodeType":"UserDefinedTypeName","pathNode":{"id":515,"name":"FooBar","nodeType":"IdentifierPath","referencedDeclaration":719,"src":"4686:6:0"},"referencedDeclaration":719,"src":"4686:6:0","typeDescriptions":{"typeIdentifier":"t_contract$_FooBar_$719","typeString":"contract FooBar"}},"visibility":"internal"}],"id":523,"initialValue":{"arguments":[{"hexValue":"31323334","id":521,"isConstant":false,"isLValue":false,"isPure":true,"kind":"number","lValueRequested":false,"nodeType":"Literal","src":"4708:4:0","typeDescriptions":{"typeIdentifier":"t_rational_1234_by_1","typeString":"int_const 1234"},"value":"1234"}],"expression":{"argumentTypes":[{"typeIdentifier":"t_rational_1234_by_1","typeString":"int_const 1234"}],"id":520,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"nodeType":"NewExpression","src":"4697:10:0","typeDescriptions":{"typeIdentifier":"t_function_creation_nonpayable$_t_uint256_$returns$_t_contract$_FooBar_$719_$","typeString":"function (uint256) returns (contract FooBar)"},"typeName":{"id":519,"nodeType":"UserDefinedTypeName","pathNode":{"id":518,"name":"FooBar","nodeType":"IdentifierPath","referencedDeclaration":719,"src":"4701:6:0"},"referencedDeclaration":719,"src":"4701:6:0","typeDescriptions":{"typeIdentifier":"t_contract$_FooBar_$719","typeString":"contract FooBar"}}},"id":522,"isConstant":false,"isLValue":false,"isPure":false,"kind":"functionCall","lValueRequested":false,"names":[],"nodeType":"FunctionCall","src":"4697:16:0","tryCall":false,"typeDescriptions":{"typeIdentifier":"t_contract$_FooBar_$719","typeString":"contract FooBar"}},"nodeType":"VariableDeclarationStatement","src":"4686:27:0"},{"expression":{"arguments":[{"commonType":{"typeIdentifier":"t_uint256","typeString":"uint256"},"id":529,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"leftExpression":{"arguments":[],"expression":{"argumentTypes":[],"expression":{"id":525,"name":"x","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":517,"src":"4731:1:0","typeDescriptions":{"typeIdentifier":"t_contract$_FooBar_$719","typeString":"contract FooBar"}},"id":526,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"memberName":"foo","nodeType":"MemberAccess","referencedDeclaration":708,"src":"4731:5:0","typeDescriptions":{"typeIdentifier":"t_function_external_view$__$returns$_t_uint256_$","typeString":"function () view external returns (uint256)"}},"id":527,"isConstant":false,"isLValue":false,"isPure":false,"kind":"functionCall","lValueRequested":false,"names":[],"nodeType":"FunctionCall","src":"4731:7:0","tryCall":false,"typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"nodeType":"BinaryOperation","operator":"==","rightExpression":{"hexValue":"31323334","id":528,"isConstant":false,"isLValue":false,"isPure":true,"kind":"number","lValueRequested":false,"nodeType":"Literal","src":"4742:4:0","typeDescriptions":{"typeIdentifier":"t_rational_1234_by_1","typeString":"int_const 1234"},"value":"1234"},"src":"4731:15:0","typeDescriptions":{"typeIdentifier":"t_bool","typeString":"bool"}}],"expression":{"argumentTypes":[{"typeIdentifier":"t_bool","typeString":"bool"}],"id":524,"name":"require","nodeType":"Identifier","overloadedDeclarations":[-18,-18],"referencedDeclaration":-18,"src":"4723:7:0","typeDescriptions":{"typeIdentifier":"t_function_require_pure$_t_bool_$returns$__$","typeString":"function (bool) pure"}},"id":530,"isConstant":false,"isLValue":false,"isPure":false,"kind":"functionCall","lValueRequested":false,"names":[],"nodeType":"FunctionCall","src":"4723:24:0","tryCall":false,"typeDescriptions":{"typeIdentifier":"t_tuple$__$","typeString":"tuple()"}},"id":531,"nodeType":"ExpressionStatement","src":"4723:24:0"},{"expression":{"arguments":[{"hexValue":"6372656174652032","id":535,"isConstant":false,"isLValue":false,"isPure":true,"kind":"string","lValueRequested":false,"nodeType":"Literal","src":"4770:10:0","typeDescriptions":{"typeIdentifier":"t_stringliteral_4411d6d4ffcd00382a95255a63761e69de9810e1236042a5c64948a7b6c04daa","typeString":"literal_string \"create 2\""},"value":"create 2"}],"expression":{"argumentTypes":[{"typeIdentifier":"t_stringliteral_4411d6d4ffcd00382a95255a63761e69de9810e1236042a5c64948a7b6c04daa","typeString":"literal_string \"create 2\""}],"expression":{"id":532,"name":"console","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":192,"src":"4758:7:0","typeDescriptions":{"typeIdentifier":"t_type$_t_contract$_console_$192_$","typeString":"type(library console)"}},"id":534,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"memberName":"log","nodeType":"MemberAccess","referencedDeclaration":120,"src":"4758:11:0","typeDescriptions":{"typeIdentifier":"t_function_internal_pure$_t_string_memory_ptr_$returns$__$","typeString":"function (string memory) pure"}},"id":536,"isConstant":false,"isLValue":false,"isPure":false,"kind":"functionCall","lValueRequested":false,"names":[],"nodeType":"FunctionCall","src":"4758:23:0","tryCall":false,"typeDescriptions":{"typeIdentifier":"t_tuple$__$","typeString":"tuple()"}},"id":537,"nodeType":"ExpressionStatement","src":"4758:23:0"},{"expression":{"arguments":[{"arguments":[{"arguments":[{"hexValue":"307863616665","id":545,"isConstant":false,"isLValue":false,"isPure":true,"kind":"number","lValueRequested":false,"nodeType":"Literal","src":"4820:6:0","typeDescriptions":{"typeIdentifier":"t_rational_51966_by_1","typeString":"int_const 51966"},"value":"0xcafe"}],"expression":{"argumentTypes":[{"typeIdentifier":"t_rational_51966_by_1","typeString":"int_const 51966"}],"id":544,"isConstant":false,"isLValue":false,"isPure":true,"lValueRequested":false,"nodeType":"ElementaryTypeNameExpression","src":"4812:7:0","typeDescriptions":{"typeIdentifier":"t_type$_t_uint160_$","typeString":"type(uint160)"},"typeName":{"id":543,"name":"uint160","nodeType":"ElementaryTypeName","src":"4812:7:0","typeDescriptions":{}}},"id":546,"isConstant":false,"isLValue":false,"isPure":true,"kind":"typeConversion","lValueRequested":false,"names":[],"nodeType":"FunctionCall","src":"4812:15:0","tryCall":false,"typeDescriptions":{"typeIdentifier":"t_uint160","typeString":"uint160"}}],"expression":{"argumentTypes":[{"typeIdentifier":"t_uint160","typeString":"uint160"}],"id":542,"isConstant":false,"isLValue":false,"isPure":true,"lValueRequested":false,"nodeType":"ElementaryTypeNameExpression","src":"4804:7:0","typeDescriptions":{"typeIdentifier":"t_type$_t_address_$","typeString":"type(address)"},"typeName":{"id":541,"name":"address","nodeType":"ElementaryTypeName","src":"4804:7:0","typeDescriptions":{}}},"id":547,"isConstant":false,"isLValue":false,"isPure":true,"kind":"typeConversion","lValueRequested":false,"names":[],"nodeType":"FunctionCall","src":"4804:24:0","tryCall":false,"typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"}}],"expression":{"argumentTypes":[{"typeIdentifier":"t_address","typeString":"address"}],"expression":{"id":538,"name":"vm","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":213,"src":"4791:2:0","typeDescriptions":{"typeIdentifier":"t_contract$_Vm_$55","typeString":"contract Vm"}},"id":540,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"memberName":"broadcast","nodeType":"MemberAccess","referencedDeclaration":43,"src":"4791:12:0","typeDescriptions":{"typeIdentifier":"t_function_external_nonpayable$_t_address_$returns$__$","typeString":"function (address) external"}},"id":548,"isConstant":false,"isLValue":false,"isPure":false,"kind":"functionCall","lValueRequested":false,"names":[],"nodeType":"FunctionCall","src":"4791:38:0","tryCall":false,"typeDescriptions":{"typeIdentifier":"t_tuple$__$","typeString":"tuple()"}},"id":549,"nodeType":"ExpressionStatement","src":"4791:38:0"},{"assignments":[552],"declarations":[{"constant":false,"id":552,"mutability":"mutable","name":"y","nameLocation":"4846:1:0","nodeType":"VariableDeclaration","scope":608,"src":"4839:8:0","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_contract$_FooBar_$719","typeString":"contract FooBar"},"typeName":{"id":551,"nodeType":"UserDefinedTypeName","pathNode":{"id":550,"name":"FooBar","nodeType":"IdentifierPath","referencedDeclaration":719,"src":"4839:6:0"},"referencedDeclaration":719,"src":"4839:6:0","typeDescriptions":{"typeIdentifier":"t_contract$_FooBar_$719","typeString":"contract FooBar"}},"visibility":"internal"}],"id":566,"initialValue":{"arguments":[{"hexValue":"31323334","id":564,"isConstant":false,"isLValue":false,"isPure":true,"kind":"number","lValueRequested":false,"nodeType":"Literal","src":"4889:4:0","typeDescriptions":{"typeIdentifier":"t_rational_1234_by_1","typeString":"int_const 1234"},"value":"1234"}],"expression":{"argumentTypes":[{"typeIdentifier":"t_rational_1234_by_1","typeString":"int_const 1234"}],"expression":{"argumentTypes":[{"typeIdentifier":"t_rational_1234_by_1","typeString":"int_const 1234"}],"id":555,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"nodeType":"NewExpression","src":"4850:10:0","typeDescriptions":{"typeIdentifier":"t_function_creation_nonpayable$_t_uint256_$returns$_t_contract$_FooBar_$719_$","typeString":"function (uint256) returns (contract FooBar)"},"typeName":{"id":554,"nodeType":"UserDefinedTypeName","pathNode":{"id":553,"name":"FooBar","nodeType":"IdentifierPath","referencedDeclaration":719,"src":"4854:6:0"},"referencedDeclaration":719,"src":"4854:6:0","typeDescriptions":{"typeIdentifier":"t_contract$_FooBar_$719","typeString":"contract FooBar"}}},"id":563,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"names":["salt"],"nodeType":"FunctionCallOptions","options":[{"arguments":[{"arguments":[{"hexValue":"3432","id":560,"isConstant":false,"isLValue":false,"isPure":true,"kind":"number","lValueRequested":false,"nodeType":"Literal","src":"4883:2:0","typeDescriptions":{"typeIdentifier":"t_rational_42_by_1","typeString":"int_const 42"},"value":"42"}],"expression":{"argumentTypes":[{"typeIdentifier":"t_rational_42_by_1","typeString":"int_const 42"}],"id":559,"isConstant":false,"isLValue":false,"isPure":true,"lValueRequested":false,"nodeType":"ElementaryTypeNameExpression","src":"4875:7:0","typeDescriptions":{"typeIdentifier":"t_type$_t_uint256_$","typeString":"type(uint256)"},"typeName":{"id":558,"name":"uint256","nodeType":"ElementaryTypeName","src":"4875:7:0","typeDescriptions":{}}},"id":561,"isConstant":false,"isLValue":false,"isPure":true,"kind":"typeConversion","lValueRequested":false,"names":[],"nodeType":"FunctionCall","src":"4875:11:0","tryCall":false,"typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}}],"expression":{"argumentTypes":[{"typeIdentifier":"t_uint256","typeString":"uint256"}],"id":557,"isConstant":false,"isLValue":false,"isPure":true,"lValueRequested":false,"nodeType":"ElementaryTypeNameExpression","src":"4867:7:0","typeDescriptions":{"typeIdentifier":"t_type$_t_bytes32_$","typeString":"type(bytes32)"},"typeName":{"id":556,"name":"bytes32","nodeType":"ElementaryTypeName","src":"4867:7:0","typeDescriptions":{}}},"id":562,"isConstant":false,"isLValue":false,"isPure":true,"kind":"typeConversion","lValueRequested":false,"names":[],"nodeType":"FunctionCall","src":"4867:20:0","tryCall":false,"typeDescriptions":{"typeIdentifier":"t_bytes32","typeString":"bytes32"}}],"src":"4850:38:0","typeDescriptions":{"typeIdentifier":"t_function_creation_nonpayable$_t_uint256_$returns$_t_contract$_FooBar_$719_$salt","typeString":"function (uint256) returns (contract FooBar)"}},"id":565,"isConstant":false,"isLValue":false,"isPure":false,"kind":"functionCall","lValueRequested":false,"names":[],"nodeType":"FunctionCall","src":"4850:44:0","tryCall":false,"typeDescriptions":{"typeIdentifier":"t_contract$_FooBar_$719","typeString":"contract FooBar"}},"nodeType":"VariableDeclarationStatement","src":"4839:55:0"},{"expression":{"arguments":[{"commonType":{"typeIdentifier":"t_uint256","typeString":"uint256"},"id":572,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"leftExpression":{"arguments":[],"expression":{"argumentTypes":[],"expression":{"id":568,"name":"y","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":552,"src":"4912:1:0","typeDescriptions":{"typeIdentifier":"t_contract$_FooBar_$719","typeString":"contract FooBar"}},"id":569,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"memberName":"foo","nodeType":"MemberAccess","referencedDeclaration":708,"src":"4912:5:0","typeDescriptions":{"typeIdentifier":"t_function_external_view$__$returns$_t_uint256_$","typeString":"function () view external returns (uint256)"}},"id":570,"isConstant":false,"isLValue":false,"isPure":false,"kind":"functionCall","lValueRequested":false,"names":[],"nodeType":"FunctionCall","src":"4912:7:0","tryCall":false,"typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"nodeType":"BinaryOperation","operator":"==","rightExpression":{"hexValue":"31323334","id":571,"isConstant":false,"isLValue":false,"isPure":true,"kind":"number","lValueRequested":false,"nodeType":"Literal","src":"4923:4:0","typeDescriptions":{"typeIdentifier":"t_rational_1234_by_1","typeString":"int_const 1234"},"value":"1234"},"src":"4912:15:0","typeDescriptions":{"typeIdentifier":"t_bool","typeString":"bool"}}],"expression":{"argumentTypes":[{"typeIdentifier":"t_bool","typeString":"bool"}],"id":567,"name":"require","nodeType":"Identifier","overloadedDeclarations":[-18,-18],"referencedDeclaration":-18,"src":"4904:7:0","typeDescriptions":{"typeIdentifier":"t_function_require_pure$_t_bool_$returns$__$","typeString":"function (bool) pure"}},"id":573,"isConstant":false,"isLValue":false,"isPure":false,"kind":"functionCall","lValueRequested":false,"names":[],"nodeType":"FunctionCall","src":"4904:24:0","tryCall":false,"typeDescriptions":{"typeIdentifier":"t_tuple$__$","typeString":"tuple()"}},"id":574,"nodeType":"ExpressionStatement","src":"4904:24:0"},{"expression":{"arguments":[{"hexValue":"646f6e6521","id":578,"isConstant":false,"isLValue":false,"isPure":true,"kind":"string","lValueRequested":false,"nodeType":"Literal","src":"4950:7:0","typeDescriptions":{"typeIdentifier":"t_stringliteral_080382d5c9e9e7c5e3d1d33f5e7422740375955180fadff167d8130e0c35f3fc","typeString":"literal_string \"done!\""},"value":"done!"}],"expression":{"argumentTypes":[{"typeIdentifier":"t_stringliteral_080382d5c9e9e7c5e3d1d33f5e7422740375955180fadff167d8130e0c35f3fc","typeString":"literal_string \"done!\""}],"expression":{"id":575,"name":"console","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":192,"src":"4938:7:0","typeDescriptions":{"typeIdentifier":"t_type$_t_contract$_console_$192_$","typeString":"type(library console)"}},"id":577,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"memberName":"log","nodeType":"MemberAccess","referencedDeclaration":120,"src":"4938:11:0","typeDescriptions":{"typeIdentifier":"t_function_internal_pure$_t_string_memory_ptr_$returns$__$","typeString":"function (string memory) pure"}},"id":579,"isConstant":false,"isLValue":false,"isPure":false,"kind":"functionCall","lValueRequested":false,"names":[],"nodeType":"FunctionCall","src":"4938:20:0","tryCall":false,"typeDescriptions":{"typeIdentifier":"t_tuple$__$","typeString":"tuple()"}},"id":580,"nodeType":"ExpressionStatement","src":"4938:20:0"},{"expression":{"arguments":[],"expression":{"argumentTypes":[],"expression":{"id":581,"name":"vm","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":213,"src":"5042:2:0","typeDescriptions":{"typeIdentifier":"t_contract$_Vm_$55","typeString":"contract Vm"}},"id":583,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"memberName":"broadcast","nodeType":"MemberAccess","referencedDeclaration":38,"src":"5042:12:0","typeDescriptions":{"typeIdentifier":"t_function_external_nonpayable$__$returns$__$","typeString":"function () external"}},"id":584,"isConstant":false,"isLValue":false,"isPure":false,"kind":"functionCall","lValueRequested":false,"names":[],"nodeType":"FunctionCall","src":"5042:14:0","tryCall":false,"typeDescriptions":{"typeIdentifier":"t_tuple$__$","typeString":"tuple()"}},"id":585,"nodeType":"ExpressionStatement","src":"5042:14:0"},{"expression":{"arguments":[{"hexValue":"31323334","id":589,"isConstant":false,"isLValue":false,"isPure":true,"kind":"number","lValueRequested":false,"nodeType":"Literal","src":"5077:4:0","typeDescriptions":{"typeIdentifier":"t_rational_1234_by_1","typeString":"int_const 1234"},"value":"1234"}],"expression":{"argumentTypes":[{"typeIdentifier":"t_rational_1234_by_1","typeString":"int_const 1234"}],"id":588,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"nodeType":"NewExpression","src":"5066:10:0","typeDescriptions":{"typeIdentifier":"t_function_creation_nonpayable$_t_uint256_$returns$_t_contract$_FooBar_$719_$","typeString":"function (uint256) returns (contract FooBar)"},"typeName":{"id":587,"nodeType":"UserDefinedTypeName","pathNode":{"id":586,"name":"FooBar","nodeType":"IdentifierPath","referencedDeclaration":719,"src":"5070:6:0"},"referencedDeclaration":719,"src":"5070:6:0","typeDescriptions":{"typeIdentifier":"t_contract$_FooBar_$719","typeString":"contract FooBar"}}},"id":590,"isConstant":false,"isLValue":false,"isPure":false,"kind":"functionCall","lValueRequested":false,"names":[],"nodeType":"FunctionCall","src":"5066:16:0","tryCall":false,"typeDescriptions":{"typeIdentifier":"t_contract$_FooBar_$719","typeString":"contract FooBar"}},"id":591,"nodeType":"ExpressionStatement","src":"5066:16:0"},{"expression":{"arguments":[{"hexValue":"6e6f6e636520656e64","id":595,"isConstant":false,"isLValue":false,"isPure":true,"kind":"string","lValueRequested":false,"nodeType":"Literal","src":"5105:11:0","typeDescriptions":{"typeIdentifier":"t_stringliteral_fa629e6661ad2a2bdb09cf9a3a276ce0d722482ae5c2887650751be0938847e8","typeString":"literal_string \"nonce end\""},"value":"nonce end"},{"arguments":[{"arguments":[{"arguments":[{"id":602,"name":"this","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":-28,"src":"5146:4:0","typeDescriptions":{"typeIdentifier":"t_contract$_ScriptExample_$706","typeString":"contract ScriptExample"}}],"expression":{"argumentTypes":[{"typeIdentifier":"t_contract$_ScriptExample_$706","typeString":"contract ScriptExample"}],"id":601,"isConstant":false,"isLValue":false,"isPure":true,"lValueRequested":false,"nodeType":"ElementaryTypeNameExpression","src":"5138:7:0","typeDescriptions":{"typeIdentifier":"t_type$_t_address_$","typeString":"type(address)"},"typeName":{"id":600,"name":"address","nodeType":"ElementaryTypeName","src":"5138:7:0","typeDescriptions":{}}},"id":603,"isConstant":false,"isLValue":false,"isPure":false,"kind":"typeConversion","lValueRequested":false,"names":[],"nodeType":"FunctionCall","src":"5138:13:0","tryCall":false,"typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"}}],"expression":{"argumentTypes":[{"typeIdentifier":"t_address","typeString":"address"}],"expression":{"id":598,"name":"vm","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":213,"src":"5126:2:0","typeDescriptions":{"typeIdentifier":"t_contract$_Vm_$55","typeString":"contract Vm"}},"id":599,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"memberName":"getNonce","nodeType":"MemberAccess","referencedDeclaration":17,"src":"5126:11:0","typeDescriptions":{"typeIdentifier":"t_function_external_view$_t_address_$returns$_t_uint64_$","typeString":"function (address) view external returns (uint64)"}},"id":604,"isConstant":false,"isLValue":false,"isPure":false,"kind":"functionCall","lValueRequested":false,"names":[],"nodeType":"FunctionCall","src":"5126:26:0","tryCall":false,"typeDescriptions":{"typeIdentifier":"t_uint64","typeString":"uint64"}}],"expression":{"argumentTypes":[{"typeIdentifier":"t_uint64","typeString":"uint64"}],"id":597,"isConstant":false,"isLValue":false,"isPure":true,"lValueRequested":false,"nodeType":"ElementaryTypeNameExpression","src":"5118:7:0","typeDescriptions":{"typeIdentifier":"t_type$_t_uint256_$","typeString":"type(uint256)"},"typeName":{"id":596,"name":"uint256","nodeType":"ElementaryTypeName","src":"5118:7:0","typeDescriptions":{}}},"id":605,"isConstant":false,"isLValue":false,"isPure":false,"kind":"typeConversion","lValueRequested":false,"names":[],"nodeType":"FunctionCall","src":"5118:35:0","tryCall":false,"typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}}],"expression":{"argumentTypes":[{"typeIdentifier":"t_stringliteral_fa629e6661ad2a2bdb09cf9a3a276ce0d722482ae5c2887650751be0938847e8","typeString":"literal_string \"nonce end\""},{"typeIdentifier":"t_uint256","typeString":"uint256"}],"expression":{"id":592,"name":"console","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":192,"src":"5093:7:0","typeDescriptions":{"typeIdentifier":"t_type$_t_contract$_console_$192_$","typeString":"type(library console)"}},"id":594,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"memberName":"log","nodeType":"MemberAccess","referencedDeclaration":154,"src":"5093:11:0","typeDescriptions":{"typeIdentifier":"t_function_internal_pure$_t_string_memory_ptr_$_t_uint256_$returns$__$","typeString":"function (string memory,uint256) pure"}},"id":606,"isConstant":false,"isLValue":false,"isPure":false,"kind":"functionCall","lValueRequested":false,"names":[],"nodeType":"FunctionCall","src":"5093:61:0","tryCall":false,"typeDescriptions":{"typeIdentifier":"t_tuple$__$","typeString":"tuple()"}},"id":607,"nodeType":"ExpressionStatement","src":"5093:61:0"}]},"documentation":{"id":379,"nodeType":"StructuredDocumentation","src":"3842:56:0","text":"@notice example function, to test vm.broadcast with."},"functionSelector":"bef03abc","implemented":true,"kind":"function","modifiers":[],"name":"runBroadcast","nameLocation":"3912:12:0","parameters":{"id":380,"nodeType":"ParameterList","parameters":[],"src":"3924:2:0"},"returnParameters":{"id":381,"nodeType":"ParameterList","parameters":[],"src":"3934:0:0"},"scope":706,"stateMutability":"nonpayable","virtual":false,"visibility":"public"},{"id":633,"nodeType":"FunctionDefinition","src":"5256:143:0","nodes":[],"body":{"id":632,"nodeType":"Block","src":"5305:94:0","nodes":[],"statements":[{"expression":{"arguments":[{"id":618,"name":"_v","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":612,"src":"5327:2:0","typeDescriptions":{"typeIdentifier":"t_string_calldata_ptr","typeString":"string calldata"}}],"expression":{"argumentTypes":[{"typeIdentifier":"t_string_calldata_ptr","typeString":"string calldata"}],"expression":{"id":615,"name":"console","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":192,"src":"5315:7:0","typeDescriptions":{"typeIdentifier":"t_type$_t_contract$_console_$192_$","typeString":"type(library console)"}},"id":617,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"memberName":"log","nodeType":"MemberAccess","referencedDeclaration":120,"src":"5315:11:0","typeDescriptions":{"typeIdentifier":"t_function_internal_pure$_t_string_memory_ptr_$returns$__$","typeString":"function (string memory) pure"}},"id":619,"isConstant":false,"isLValue":false,"isPure":false,"kind":"functionCall","lValueRequested":false,"names":[],"nodeType":"FunctionCall","src":"5315:15:0","tryCall":false,"typeDescriptions":{"typeIdentifier":"t_tuple$__$","typeString":"tuple()"}},"id":620,"nodeType":"ExpressionStatement","src":"5315:15:0"},{"expression":{"arguments":[{"hexValue":"68656c6c6f206d73672e73656e646572","id":624,"isConstant":false,"isLValue":false,"isPure":true,"kind":"string","lValueRequested":false,"nodeType":"Literal","src":"5352:18:0","typeDescriptions":{"typeIdentifier":"t_stringliteral_b3cc13bc51228b2c4c4334d82a4772908254dc0e1c512893dd16208ef13efb8e","typeString":"literal_string \"hello msg.sender\""},"value":"hello msg.sender"},{"arguments":[{"expression":{"id":627,"name":"msg","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":-15,"src":"5380:3:0","typeDescriptions":{"typeIdentifier":"t_magic_message","typeString":"msg"}},"id":628,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"memberName":"sender","nodeType":"MemberAccess","src":"5380:10:0","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"}}],"expression":{"argumentTypes":[{"typeIdentifier":"t_address","typeString":"address"}],"id":626,"isConstant":false,"isLValue":false,"isPure":true,"lValueRequested":false,"nodeType":"ElementaryTypeNameExpression","src":"5372:7:0","typeDescriptions":{"typeIdentifier":"t_type$_t_address_$","typeString":"type(address)"},"typeName":{"id":625,"name":"address","nodeType":"ElementaryTypeName","src":"5372:7:0","typeDescriptions":{}}},"id":629,"isConstant":false,"isLValue":false,"isPure":false,"kind":"typeConversion","lValueRequested":false,"names":[],"nodeType":"FunctionCall","src":"5372:19:0","tryCall":false,"typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"}}],"expression":{"argumentTypes":[{"typeIdentifier":"t_stringliteral_b3cc13bc51228b2c4c4334d82a4772908254dc0e1c512893dd16208ef13efb8e","typeString":"literal_string \"hello msg.sender\""},{"typeIdentifier":"t_address","typeString":"address"}],"expression":{"id":621,"name":"console","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":192,"src":"5340:7:0","typeDescriptions":{"typeIdentifier":"t_type$_t_contract$_console_$192_$","typeString":"type(library console)"}},"id":623,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"memberName":"log","nodeType":"MemberAccess","referencedDeclaration":171,"src":"5340:11:0","typeDescriptions":{"typeIdentifier":"t_function_internal_pure$_t_string_memory_ptr_$_t_address_$returns$__$","typeString":"function (string memory,address) pure"}},"id":630,"isConstant":false,"isLValue":false,"isPure":false,"kind":"functionCall","lValueRequested":false,"names":[],"nodeType":"FunctionCall","src":"5340:52:0","tryCall":false,"typeDescriptions":{"typeIdentifier":"t_tuple$__$","typeString":"tuple()"}},"id":631,"nodeType":"ExpressionStatement","src":"5340:52:0"}]},"documentation":{"id":610,"nodeType":"StructuredDocumentation","src":"5167:84:0","text":"@notice example external function, to force a CALL, and test vm.startPrank with."},"functionSelector":"a777d0dc","implemented":true,"kind":"function","modifiers":[],"name":"hello","nameLocation":"5265:5:0","parameters":{"id":613,"nodeType":"ParameterList","parameters":[{"constant":false,"id":612,"mutability":"mutable","name":"_v","nameLocation":"5287:2:0","nodeType":"VariableDeclaration","scope":633,"src":"5271:18:0","stateVariable":false,"storageLocation":"calldata","typeDescriptions":{"typeIdentifier":"t_string_calldata_ptr","typeString":"string"},"typeName":{"id":611,"name":"string","nodeType":"ElementaryTypeName","src":"5271:6:0","typeDescriptions":{"typeIdentifier":"t_string_storage_ptr","typeString":"string"}},"visibility":"internal"}],"src":"5270:20:0"},"returnParameters":{"id":614,"nodeType":"ParameterList","parameters":[],"src":"5305:0:0"},"scope":706,"stateMutability":"view","virtual":false,"visibility":"external"},{"id":648,"nodeType":"FunctionDefinition","src":"5405:95:0","nodes":[],"body":{"id":647,"nodeType":"Block","src":"5449:51:0","nodes":[],"statements":[{"expression":{"id":639,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"nodeType":"UnaryOperation","operator":"++","prefix":false,"src":"5459:9:0","subExpression":{"id":638,"name":"counter","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":215,"src":"5459:7:0","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"id":640,"nodeType":"ExpressionStatement","src":"5459:9:0"},{"expression":{"arguments":[{"id":644,"name":"_v","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":635,"src":"5490:2:0","typeDescriptions":{"typeIdentifier":"t_string_calldata_ptr","typeString":"string calldata"}}],"expression":{"argumentTypes":[{"typeIdentifier":"t_string_calldata_ptr","typeString":"string calldata"}],"expression":{"id":641,"name":"console","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":192,"src":"5478:7:0","typeDescriptions":{"typeIdentifier":"t_type$_t_contract$_console_$192_$","typeString":"type(library console)"}},"id":643,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"memberName":"log","nodeType":"MemberAccess","referencedDeclaration":120,"src":"5478:11:0","typeDescriptions":{"typeIdentifier":"t_function_internal_pure$_t_string_memory_ptr_$returns$__$","typeString":"function (string memory) pure"}},"id":645,"isConstant":false,"isLValue":false,"isPure":false,"kind":"functionCall","lValueRequested":false,"names":[],"nodeType":"FunctionCall","src":"5478:15:0","tryCall":false,"typeDescriptions":{"typeIdentifier":"t_tuple$__$","typeString":"tuple()"}},"id":646,"nodeType":"ExpressionStatement","src":"5478:15:0"}]},"functionSelector":"7e79255d","implemented":true,"kind":"function","modifiers":[],"name":"call1","nameLocation":"5414:5:0","parameters":{"id":636,"nodeType":"ParameterList","parameters":[{"constant":false,"id":635,"mutability":"mutable","name":"_v","nameLocation":"5436:2:0","nodeType":"VariableDeclaration","scope":648,"src":"5420:18:0","stateVariable":false,"storageLocation":"calldata","typeDescriptions":{"typeIdentifier":"t_string_calldata_ptr","typeString":"string"},"typeName":{"id":634,"name":"string","nodeType":"ElementaryTypeName","src":"5420:6:0","typeDescriptions":{"typeIdentifier":"t_string_storage_ptr","typeString":"string"}},"visibility":"internal"}],"src":"5419:20:0"},"returnParameters":{"id":637,"nodeType":"ParameterList","parameters":[],"src":"5449:0:0"},"scope":706,"stateMutability":"nonpayable","virtual":false,"visibility":"external"},{"id":663,"nodeType":"FunctionDefinition","src":"5506:95:0","nodes":[],"body":{"id":662,"nodeType":"Block","src":"5550:51:0","nodes":[],"statements":[{"expression":{"id":654,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"nodeType":"UnaryOperation","operator":"++","prefix":false,"src":"5560:9:0","subExpression":{"id":653,"name":"counter","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":215,"src":"5560:7:0","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"id":655,"nodeType":"ExpressionStatement","src":"5560:9:0"},{"expression":{"arguments":[{"id":659,"name":"_v","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":650,"src":"5591:2:0","typeDescriptions":{"typeIdentifier":"t_string_calldata_ptr","typeString":"string calldata"}}],"expression":{"argumentTypes":[{"typeIdentifier":"t_string_calldata_ptr","typeString":"string calldata"}],"expression":{"id":656,"name":"console","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":192,"src":"5579:7:0","typeDescriptions":{"typeIdentifier":"t_type$_t_contract$_console_$192_$","typeString":"type(library console)"}},"id":658,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"memberName":"log","nodeType":"MemberAccess","referencedDeclaration":120,"src":"5579:11:0","typeDescriptions":{"typeIdentifier":"t_function_internal_pure$_t_string_memory_ptr_$returns$__$","typeString":"function (string memory) pure"}},"id":660,"isConstant":false,"isLValue":false,"isPure":false,"kind":"functionCall","lValueRequested":false,"names":[],"nodeType":"FunctionCall","src":"5579:15:0","tryCall":false,"typeDescriptions":{"typeIdentifier":"t_tuple$__$","typeString":"tuple()"}},"id":661,"nodeType":"ExpressionStatement","src":"5579:15:0"}]},"functionSelector":"8d3ef7ca","implemented":true,"kind":"function","modifiers":[],"name":"call2","nameLocation":"5515:5:0","parameters":{"id":651,"nodeType":"ParameterList","parameters":[{"constant":false,"id":650,"mutability":"mutable","name":"_v","nameLocation":"5537:2:0","nodeType":"VariableDeclaration","scope":663,"src":"5521:18:0","stateVariable":false,"storageLocation":"calldata","typeDescriptions":{"typeIdentifier":"t_string_calldata_ptr","typeString":"string"},"typeName":{"id":649,"name":"string","nodeType":"ElementaryTypeName","src":"5521:6:0","typeDescriptions":{"typeIdentifier":"t_string_storage_ptr","typeString":"string"}},"visibility":"internal"}],"src":"5520:20:0"},"returnParameters":{"id":652,"nodeType":"ParameterList","parameters":[],"src":"5550:0:0"},"scope":706,"stateMutability":"nonpayable","virtual":false,"visibility":"external"},{"id":678,"nodeType":"FunctionDefinition","src":"5607:98:0","nodes":[],"body":{"id":677,"nodeType":"Block","src":"5653:52:0","nodes":[],"statements":[{"expression":{"id":669,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"nodeType":"UnaryOperation","operator":"++","prefix":false,"src":"5663:9:0","subExpression":{"id":668,"name":"counter","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":215,"src":"5663:7:0","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"id":670,"nodeType":"ExpressionStatement","src":"5663:9:0"},{"expression":{"arguments":[{"id":674,"name":"_v","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":665,"src":"5695:2:0","typeDescriptions":{"typeIdentifier":"t_string_calldata_ptr","typeString":"string calldata"}}],"expression":{"argumentTypes":[{"typeIdentifier":"t_string_calldata_ptr","typeString":"string calldata"}],"expression":{"id":671,"name":"this","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":-28,"src":"5682:4:0","typeDescriptions":{"typeIdentifier":"t_contract$_ScriptExample_$706","typeString":"contract ScriptExample"}},"id":673,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"memberName":"nested2","nodeType":"MemberAccess","referencedDeclaration":693,"src":"5682:12:0","typeDescriptions":{"typeIdentifier":"t_function_external_nonpayable$_t_string_memory_ptr_$returns$__$","typeString":"function (string memory) external"}},"id":675,"isConstant":false,"isLValue":false,"isPure":false,"kind":"functionCall","lValueRequested":false,"names":[],"nodeType":"FunctionCall","src":"5682:16:0","tryCall":false,"typeDescriptions":{"typeIdentifier":"t_tuple$__$","typeString":"tuple()"}},"id":676,"nodeType":"ExpressionStatement","src":"5682:16:0"}]},"functionSelector":"a76ccdfa","implemented":true,"kind":"function","modifiers":[],"name":"nested1","nameLocation":"5616:7:0","parameters":{"id":666,"nodeType":"ParameterList","parameters":[{"constant":false,"id":665,"mutability":"mutable","name":"_v","nameLocation":"5640:2:0","nodeType":"VariableDeclaration","scope":678,"src":"5624:18:0","stateVariable":false,"storageLocation":"calldata","typeDescriptions":{"typeIdentifier":"t_string_calldata_ptr","typeString":"string"},"typeName":{"id":664,"name":"string","nodeType":"ElementaryTypeName","src":"5624:6:0","typeDescriptions":{"typeIdentifier":"t_string_storage_ptr","typeString":"string"}},"visibility":"internal"}],"src":"5623:20:0"},"returnParameters":{"id":667,"nodeType":"ParameterList","parameters":[],"src":"5653:0:0"},"scope":706,"stateMutability":"nonpayable","virtual":false,"visibility":"external"},{"id":693,"nodeType":"FunctionDefinition","src":"5711:97:0","nodes":[],"body":{"id":692,"nodeType":"Block","src":"5757:51:0","nodes":[],"statements":[{"expression":{"id":684,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"nodeType":"UnaryOperation","operator":"++","prefix":false,"src":"5767:9:0","subExpression":{"id":683,"name":"counter","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":215,"src":"5767:7:0","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"id":685,"nodeType":"ExpressionStatement","src":"5767:9:0"},{"expression":{"arguments":[{"id":689,"name":"_v","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":680,"src":"5798:2:0","typeDescriptions":{"typeIdentifier":"t_string_calldata_ptr","typeString":"string calldata"}}],"expression":{"argumentTypes":[{"typeIdentifier":"t_string_calldata_ptr","typeString":"string calldata"}],"expression":{"id":686,"name":"console","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":192,"src":"5786:7:0","typeDescriptions":{"typeIdentifier":"t_type$_t_contract$_console_$192_$","typeString":"type(library console)"}},"id":688,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"memberName":"log","nodeType":"MemberAccess","referencedDeclaration":120,"src":"5786:11:0","typeDescriptions":{"typeIdentifier":"t_function_internal_pure$_t_string_memory_ptr_$returns$__$","typeString":"function (string memory) pure"}},"id":690,"isConstant":false,"isLValue":false,"isPure":false,"kind":"functionCall","lValueRequested":false,"names":[],"nodeType":"FunctionCall","src":"5786:15:0","tryCall":false,"typeDescriptions":{"typeIdentifier":"t_tuple$__$","typeString":"tuple()"}},"id":691,"nodeType":"ExpressionStatement","src":"5786:15:0"}]},"functionSelector":"dbf1282f","implemented":true,"kind":"function","modifiers":[],"name":"nested2","nameLocation":"5720:7:0","parameters":{"id":681,"nodeType":"ParameterList","parameters":[{"constant":false,"id":680,"mutability":"mutable","name":"_v","nameLocation":"5744:2:0","nodeType":"VariableDeclaration","scope":693,"src":"5728:18:0","stateVariable":false,"storageLocation":"calldata","typeDescriptions":{"typeIdentifier":"t_string_calldata_ptr","typeString":"string"},"typeName":{"id":679,"name":"string","nodeType":"ElementaryTypeName","src":"5728:6:0","typeDescriptions":{"typeIdentifier":"t_string_storage_ptr","typeString":"string"}},"visibility":"internal"}],"src":"5727:20:0"},"returnParameters":{"id":682,"nodeType":"ParameterList","parameters":[],"src":"5757:0:0"},"scope":706,"stateMutability":"nonpayable","virtual":false,"visibility":"external"},{"id":705,"nodeType":"FunctionDefinition","src":"5814:84:0","nodes":[],"body":{"id":704,"nodeType":"Block","src":"5866:32:0","nodes":[],"statements":[{"expression":{"arguments":[{"id":701,"name":"_v","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":695,"src":"5888:2:0","typeDescriptions":{"typeIdentifier":"t_string_calldata_ptr","typeString":"string calldata"}}],"expression":{"argumentTypes":[{"typeIdentifier":"t_string_calldata_ptr","typeString":"string calldata"}],"expression":{"id":698,"name":"console","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":192,"src":"5876:7:0","typeDescriptions":{"typeIdentifier":"t_type$_t_contract$_console_$192_$","typeString":"type(library console)"}},"id":700,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"memberName":"log","nodeType":"MemberAccess","referencedDeclaration":120,"src":"5876:11:0","typeDescriptions":{"typeIdentifier":"t_function_internal_pure$_t_string_memory_ptr_$returns$__$","typeString":"function (string memory) pure"}},"id":702,"isConstant":false,"isLValue":false,"isPure":false,"kind":"functionCall","lValueRequested":false,"names":[],"nodeType":"FunctionCall","src":"5876:15:0","tryCall":false,"typeDescriptions":{"typeIdentifier":"t_tuple$__$","typeString":"tuple()"}},"id":703,"nodeType":"ExpressionStatement","src":"5876:15:0"}]},"functionSelector":"7f8b915c","implemented":true,"kind":"function","modifiers":[],"name":"callPure","nameLocation":"5823:8:0","parameters":{"id":696,"nodeType":"ParameterList","parameters":[{"constant":false,"id":695,"mutability":"mutable","name":"_v","nameLocation":"5848:2:0","nodeType":"VariableDeclaration","scope":705,"src":"5832:18:0","stateVariable":false,"storageLocation":"calldata","typeDescriptions":{"typeIdentifier":"t_string_calldata_ptr","typeString":"string"},"typeName":{"id":694,"name":"string","nodeType":"ElementaryTypeName","src":"5832:6:0","typeDescriptions":{"typeIdentifier":"t_string_storage_ptr","typeString":"string"}},"visibility":"internal"}],"src":"5831:20:0"},"returnParameters":{"id":697,"nodeType":"ParameterList","parameters":[],"src":"5866:0:0"},"scope":706,"stateMutability":"pure","virtual":false,"visibility":"external"}],"abstract":false,"baseContracts":[],"canonicalName":"ScriptExample","contractDependencies":[719],"contractKind":"contract","documentation":{"id":193,"nodeType":"StructuredDocumentation","src":"2415:126:0","text":"@title ScriptExample\n @notice ScriptExample is an example script. The Go forge script code tests that it can run this."},"fullyImplemented":true,"linearizedBaseContracts":[706],"name":"ScriptExample","nameLocation":"2550:13:0","scope":720,"usedErrors":[]},{"id":719,"nodeType":"ContractDefinition","src":"5902:96:0","nodes":[{"id":708,"nodeType":"VariableDeclaration","src":"5924:18:0","nodes":[],"constant":false,"functionSelector":"c2985578","mutability":"mutable","name":"foo","nameLocation":"5939:3:0","scope":719,"stateVariable":true,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"},"typeName":{"id":707,"name":"uint256","nodeType":"ElementaryTypeName","src":"5924:7:0","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"visibility":"public"},{"id":718,"nodeType":"FunctionDefinition","src":"5949:47:0","nodes":[],"body":{"id":717,"nodeType":"Block","src":"5972:24:0","nodes":[],"statements":[{"expression":{"id":715,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"leftHandSide":{"id":713,"name":"foo","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":708,"src":"5982:3:0","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"nodeType":"Assignment","operator":"=","rightHandSide":{"id":714,"name":"v","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":710,"src":"5988:1:0","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"src":"5982:7:0","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"id":716,"nodeType":"ExpressionStatement","src":"5982:7:0"}]},"implemented":true,"kind":"constructor","modifiers":[],"name":"","nameLocation":"-1:-1:-1","parameters":{"id":711,"nodeType":"ParameterList","parameters":[{"constant":false,"id":710,"mutability":"mutable","name":"v","nameLocation":"5969:1:0","nodeType":"VariableDeclaration","scope":718,"src":"5961:9:0","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"},"typeName":{"id":709,"name":"uint256","nodeType":"ElementaryTypeName","src":"5961:7:0","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"visibility":"internal"}],"src":"5960:11:0"},"returnParameters":{"id":712,"nodeType":"ParameterList","parameters":[],"src":"5972:0:0"},"scope":719,"stateMutability":"nonpayable","virtual":false,"visibility":"public"}],"abstract":false,"baseContracts":[],"canonicalName":"FooBar","contractDependencies":[],"contractKind":"contract","fullyImplemented":true,"linearizedBaseContracts":[719],"name":"FooBar","nameLocation":"5911:6:0","scope":720,"usedErrors":[]}],"license":"MIT"},"id":0} \ No newline at end of file diff --git a/op-chain-ops/script/testdata/test-artifacts/ScriptExample.s.sol/Vm.json b/op-chain-ops/script/testdata/test-artifacts/ScriptExample.s.sol/Vm.json new file mode 100644 index 000000000000..34175684c5aa --- /dev/null +++ b/op-chain-ops/script/testdata/test-artifacts/ScriptExample.s.sol/Vm.json @@ -0,0 +1 @@ +{"abi":[{"type":"function","name":"broadcast","inputs":[],"outputs":[],"stateMutability":"nonpayable"},{"type":"function","name":"broadcast","inputs":[{"name":"msgSender","type":"address","internalType":"address"}],"outputs":[],"stateMutability":"nonpayable"},{"type":"function","name":"envOr","inputs":[{"name":"name","type":"string","internalType":"string"},{"name":"defaultValue","type":"bool","internalType":"bool"}],"outputs":[{"name":"value","type":"bool","internalType":"bool"}],"stateMutability":"view"},{"type":"function","name":"getNonce","inputs":[{"name":"account","type":"address","internalType":"address"}],"outputs":[{"name":"nonce","type":"uint64","internalType":"uint64"}],"stateMutability":"view"},{"type":"function","name":"parseJsonKeys","inputs":[{"name":"json","type":"string","internalType":"string"},{"name":"key","type":"string","internalType":"string"}],"outputs":[{"name":"keys","type":"string[]","internalType":"string[]"}],"stateMutability":"pure"},{"type":"function","name":"startBroadcast","inputs":[],"outputs":[],"stateMutability":"nonpayable"},{"type":"function","name":"startBroadcast","inputs":[{"name":"msgSender","type":"address","internalType":"address"}],"outputs":[],"stateMutability":"nonpayable"},{"type":"function","name":"startPrank","inputs":[{"name":"msgSender","type":"address","internalType":"address"}],"outputs":[],"stateMutability":"nonpayable"},{"type":"function","name":"stopBroadcast","inputs":[],"outputs":[],"stateMutability":"nonpayable"},{"type":"function","name":"stopPrank","inputs":[],"outputs":[],"stateMutability":"nonpayable"}],"bytecode":{"object":"0x","sourceMap":"","linkReferences":{}},"deployedBytecode":{"object":"0x","sourceMap":"","linkReferences":{}},"methodIdentifiers":{"broadcast()":"afc98040","broadcast(address)":"e6962cdb","envOr(string,bool)":"4777f3cf","getNonce(address)":"2d0335ab","parseJsonKeys(string,string)":"213e4198","startBroadcast()":"7fb5297f","startBroadcast(address)":"7fec2a8d","startPrank(address)":"06447d56","stopBroadcast()":"76eadd36","stopPrank()":"90c5013b"},"rawMetadata":"{\"compiler\":{\"version\":\"0.8.15+commit.e14f2714\"},\"language\":\"Solidity\",\"output\":{\"abi\":[{\"inputs\":[],\"name\":\"broadcast\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"msgSender\",\"type\":\"address\"}],\"name\":\"broadcast\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"string\",\"name\":\"name\",\"type\":\"string\"},{\"internalType\":\"bool\",\"name\":\"defaultValue\",\"type\":\"bool\"}],\"name\":\"envOr\",\"outputs\":[{\"internalType\":\"bool\",\"name\":\"value\",\"type\":\"bool\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"account\",\"type\":\"address\"}],\"name\":\"getNonce\",\"outputs\":[{\"internalType\":\"uint64\",\"name\":\"nonce\",\"type\":\"uint64\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"string\",\"name\":\"json\",\"type\":\"string\"},{\"internalType\":\"string\",\"name\":\"key\",\"type\":\"string\"}],\"name\":\"parseJsonKeys\",\"outputs\":[{\"internalType\":\"string[]\",\"name\":\"keys\",\"type\":\"string[]\"}],\"stateMutability\":\"pure\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"startBroadcast\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"msgSender\",\"type\":\"address\"}],\"name\":\"startBroadcast\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"msgSender\",\"type\":\"address\"}],\"name\":\"startPrank\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"stopBroadcast\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"stopPrank\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"}],\"devdoc\":{\"kind\":\"dev\",\"methods\":{},\"version\":1},\"userdoc\":{\"kind\":\"user\",\"methods\":{},\"version\":1}},\"settings\":{\"compilationTarget\":{\"scripts/ScriptExample.s.sol\":\"Vm\"},\"evmVersion\":\"london\",\"libraries\":{},\"metadata\":{\"bytecodeHash\":\"none\"},\"optimizer\":{\"enabled\":true,\"runs\":999999},\"remappings\":[]},\"sources\":{\"scripts/ScriptExample.s.sol\":{\"keccak256\":\"0x8d1dfa41908e7ccc3a498a2a2aa51c5275bedbb904ce32d08f8598e36f896d8d\",\"license\":\"MIT\",\"urls\":[\"bzz-raw://5117bb7158363cae8b9dc0508d2852692fd36172f1c699ff680afbb5acebe1f3\",\"dweb:/ipfs/QmQdahJ8SPKfJ4yea5Ge9qaj5qh1TxVffhHvaWytBaL95h\"]}},\"version\":1}","metadata":{"compiler":{"version":"0.8.15+commit.e14f2714"},"language":"Solidity","output":{"abi":[{"inputs":[],"stateMutability":"nonpayable","type":"function","name":"broadcast"},{"inputs":[{"internalType":"address","name":"msgSender","type":"address"}],"stateMutability":"nonpayable","type":"function","name":"broadcast"},{"inputs":[{"internalType":"string","name":"name","type":"string"},{"internalType":"bool","name":"defaultValue","type":"bool"}],"stateMutability":"view","type":"function","name":"envOr","outputs":[{"internalType":"bool","name":"value","type":"bool"}]},{"inputs":[{"internalType":"address","name":"account","type":"address"}],"stateMutability":"view","type":"function","name":"getNonce","outputs":[{"internalType":"uint64","name":"nonce","type":"uint64"}]},{"inputs":[{"internalType":"string","name":"json","type":"string"},{"internalType":"string","name":"key","type":"string"}],"stateMutability":"pure","type":"function","name":"parseJsonKeys","outputs":[{"internalType":"string[]","name":"keys","type":"string[]"}]},{"inputs":[],"stateMutability":"nonpayable","type":"function","name":"startBroadcast"},{"inputs":[{"internalType":"address","name":"msgSender","type":"address"}],"stateMutability":"nonpayable","type":"function","name":"startBroadcast"},{"inputs":[{"internalType":"address","name":"msgSender","type":"address"}],"stateMutability":"nonpayable","type":"function","name":"startPrank"},{"inputs":[],"stateMutability":"nonpayable","type":"function","name":"stopBroadcast"},{"inputs":[],"stateMutability":"nonpayable","type":"function","name":"stopPrank"}],"devdoc":{"kind":"dev","methods":{},"version":1},"userdoc":{"kind":"user","methods":{},"version":1}},"settings":{"remappings":[],"optimizer":{"enabled":true,"runs":999999},"metadata":{"bytecodeHash":"none"},"compilationTarget":{"scripts/ScriptExample.s.sol":"Vm"},"evmVersion":"london","libraries":{}},"sources":{"scripts/ScriptExample.s.sol":{"keccak256":"0x8d1dfa41908e7ccc3a498a2a2aa51c5275bedbb904ce32d08f8598e36f896d8d","urls":["bzz-raw://5117bb7158363cae8b9dc0508d2852692fd36172f1c699ff680afbb5acebe1f3","dweb:/ipfs/QmQdahJ8SPKfJ4yea5Ge9qaj5qh1TxVffhHvaWytBaL95h"],"license":"MIT"}},"version":1},"storageLayout":{"storage":[],"types":{}},"userdoc":{"version":1,"kind":"user"},"devdoc":{"version":1,"kind":"dev"},"ast":{"absolutePath":"scripts/ScriptExample.s.sol","id":720,"exportedSymbols":{"FooBar":[719],"ScriptExample":[706],"Vm":[55],"console":[192]},"nodeType":"SourceUnit","src":"32:5967:0","nodes":[{"id":1,"nodeType":"PragmaDirective","src":"32:23:0","nodes":[],"literals":["solidity","0.8",".15"]},{"id":55,"nodeType":"ContractDefinition","src":"120:616:0","nodes":[{"id":10,"nodeType":"FunctionDefinition","src":"139:91:0","nodes":[],"functionSelector":"4777f3cf","implemented":false,"kind":"function","modifiers":[],"name":"envOr","nameLocation":"148:5:0","parameters":{"id":6,"nodeType":"ParameterList","parameters":[{"constant":false,"id":3,"mutability":"mutable","name":"name","nameLocation":"170:4:0","nodeType":"VariableDeclaration","scope":10,"src":"154:20:0","stateVariable":false,"storageLocation":"calldata","typeDescriptions":{"typeIdentifier":"t_string_calldata_ptr","typeString":"string"},"typeName":{"id":2,"name":"string","nodeType":"ElementaryTypeName","src":"154:6:0","typeDescriptions":{"typeIdentifier":"t_string_storage_ptr","typeString":"string"}},"visibility":"internal"},{"constant":false,"id":5,"mutability":"mutable","name":"defaultValue","nameLocation":"181:12:0","nodeType":"VariableDeclaration","scope":10,"src":"176:17:0","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_bool","typeString":"bool"},"typeName":{"id":4,"name":"bool","nodeType":"ElementaryTypeName","src":"176:4:0","typeDescriptions":{"typeIdentifier":"t_bool","typeString":"bool"}},"visibility":"internal"}],"src":"153:41:0"},"returnParameters":{"id":9,"nodeType":"ParameterList","parameters":[{"constant":false,"id":8,"mutability":"mutable","name":"value","nameLocation":"223:5:0","nodeType":"VariableDeclaration","scope":10,"src":"218:10:0","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_bool","typeString":"bool"},"typeName":{"id":7,"name":"bool","nodeType":"ElementaryTypeName","src":"218:4:0","typeDescriptions":{"typeIdentifier":"t_bool","typeString":"bool"}},"visibility":"internal"}],"src":"217:12:0"},"scope":55,"stateMutability":"view","virtual":false,"visibility":"external"},{"id":17,"nodeType":"FunctionDefinition","src":"235:72:0","nodes":[],"functionSelector":"2d0335ab","implemented":false,"kind":"function","modifiers":[],"name":"getNonce","nameLocation":"244:8:0","parameters":{"id":13,"nodeType":"ParameterList","parameters":[{"constant":false,"id":12,"mutability":"mutable","name":"account","nameLocation":"261:7:0","nodeType":"VariableDeclaration","scope":17,"src":"253:15:0","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"},"typeName":{"id":11,"name":"address","nodeType":"ElementaryTypeName","src":"253:7:0","stateMutability":"nonpayable","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"}},"visibility":"internal"}],"src":"252:17:0"},"returnParameters":{"id":16,"nodeType":"ParameterList","parameters":[{"constant":false,"id":15,"mutability":"mutable","name":"nonce","nameLocation":"300:5:0","nodeType":"VariableDeclaration","scope":17,"src":"293:12:0","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_uint64","typeString":"uint64"},"typeName":{"id":14,"name":"uint64","nodeType":"ElementaryTypeName","src":"293:6:0","typeDescriptions":{"typeIdentifier":"t_uint64","typeString":"uint64"}},"visibility":"internal"}],"src":"292:14:0"},"scope":55,"stateMutability":"view","virtual":false,"visibility":"external"},{"id":27,"nodeType":"FunctionDefinition","src":"312:111:0","nodes":[],"functionSelector":"213e4198","implemented":false,"kind":"function","modifiers":[],"name":"parseJsonKeys","nameLocation":"321:13:0","parameters":{"id":22,"nodeType":"ParameterList","parameters":[{"constant":false,"id":19,"mutability":"mutable","name":"json","nameLocation":"351:4:0","nodeType":"VariableDeclaration","scope":27,"src":"335:20:0","stateVariable":false,"storageLocation":"calldata","typeDescriptions":{"typeIdentifier":"t_string_calldata_ptr","typeString":"string"},"typeName":{"id":18,"name":"string","nodeType":"ElementaryTypeName","src":"335:6:0","typeDescriptions":{"typeIdentifier":"t_string_storage_ptr","typeString":"string"}},"visibility":"internal"},{"constant":false,"id":21,"mutability":"mutable","name":"key","nameLocation":"373:3:0","nodeType":"VariableDeclaration","scope":27,"src":"357:19:0","stateVariable":false,"storageLocation":"calldata","typeDescriptions":{"typeIdentifier":"t_string_calldata_ptr","typeString":"string"},"typeName":{"id":20,"name":"string","nodeType":"ElementaryTypeName","src":"357:6:0","typeDescriptions":{"typeIdentifier":"t_string_storage_ptr","typeString":"string"}},"visibility":"internal"}],"src":"334:43:0"},"returnParameters":{"id":26,"nodeType":"ParameterList","parameters":[{"constant":false,"id":25,"mutability":"mutable","name":"keys","nameLocation":"417:4:0","nodeType":"VariableDeclaration","scope":27,"src":"401:20:0","stateVariable":false,"storageLocation":"memory","typeDescriptions":{"typeIdentifier":"t_array$_t_string_memory_ptr_$dyn_memory_ptr","typeString":"string[]"},"typeName":{"baseType":{"id":23,"name":"string","nodeType":"ElementaryTypeName","src":"401:6:0","typeDescriptions":{"typeIdentifier":"t_string_storage_ptr","typeString":"string"}},"id":24,"nodeType":"ArrayTypeName","src":"401:8:0","typeDescriptions":{"typeIdentifier":"t_array$_t_string_storage_$dyn_storage_ptr","typeString":"string[]"}},"visibility":"internal"}],"src":"400:22:0"},"scope":55,"stateMutability":"pure","virtual":false,"visibility":"external"},{"id":32,"nodeType":"FunctionDefinition","src":"428:48:0","nodes":[],"functionSelector":"06447d56","implemented":false,"kind":"function","modifiers":[],"name":"startPrank","nameLocation":"437:10:0","parameters":{"id":30,"nodeType":"ParameterList","parameters":[{"constant":false,"id":29,"mutability":"mutable","name":"msgSender","nameLocation":"456:9:0","nodeType":"VariableDeclaration","scope":32,"src":"448:17:0","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"},"typeName":{"id":28,"name":"address","nodeType":"ElementaryTypeName","src":"448:7:0","stateMutability":"nonpayable","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"}},"visibility":"internal"}],"src":"447:19:0"},"returnParameters":{"id":31,"nodeType":"ParameterList","parameters":[],"src":"475:0:0"},"scope":55,"stateMutability":"nonpayable","virtual":false,"visibility":"external"},{"id":35,"nodeType":"FunctionDefinition","src":"481:30:0","nodes":[],"functionSelector":"90c5013b","implemented":false,"kind":"function","modifiers":[],"name":"stopPrank","nameLocation":"490:9:0","parameters":{"id":33,"nodeType":"ParameterList","parameters":[],"src":"499:2:0"},"returnParameters":{"id":34,"nodeType":"ParameterList","parameters":[],"src":"510:0:0"},"scope":55,"stateMutability":"nonpayable","virtual":false,"visibility":"external"},{"id":38,"nodeType":"FunctionDefinition","src":"516:30:0","nodes":[],"functionSelector":"afc98040","implemented":false,"kind":"function","modifiers":[],"name":"broadcast","nameLocation":"525:9:0","parameters":{"id":36,"nodeType":"ParameterList","parameters":[],"src":"534:2:0"},"returnParameters":{"id":37,"nodeType":"ParameterList","parameters":[],"src":"545:0:0"},"scope":55,"stateMutability":"nonpayable","virtual":false,"visibility":"external"},{"id":43,"nodeType":"FunctionDefinition","src":"551:47:0","nodes":[],"functionSelector":"e6962cdb","implemented":false,"kind":"function","modifiers":[],"name":"broadcast","nameLocation":"560:9:0","parameters":{"id":41,"nodeType":"ParameterList","parameters":[{"constant":false,"id":40,"mutability":"mutable","name":"msgSender","nameLocation":"578:9:0","nodeType":"VariableDeclaration","scope":43,"src":"570:17:0","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"},"typeName":{"id":39,"name":"address","nodeType":"ElementaryTypeName","src":"570:7:0","stateMutability":"nonpayable","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"}},"visibility":"internal"}],"src":"569:19:0"},"returnParameters":{"id":42,"nodeType":"ParameterList","parameters":[],"src":"597:0:0"},"scope":55,"stateMutability":"nonpayable","virtual":false,"visibility":"external"},{"id":48,"nodeType":"FunctionDefinition","src":"603:52:0","nodes":[],"functionSelector":"7fec2a8d","implemented":false,"kind":"function","modifiers":[],"name":"startBroadcast","nameLocation":"612:14:0","parameters":{"id":46,"nodeType":"ParameterList","parameters":[{"constant":false,"id":45,"mutability":"mutable","name":"msgSender","nameLocation":"635:9:0","nodeType":"VariableDeclaration","scope":48,"src":"627:17:0","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"},"typeName":{"id":44,"name":"address","nodeType":"ElementaryTypeName","src":"627:7:0","stateMutability":"nonpayable","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"}},"visibility":"internal"}],"src":"626:19:0"},"returnParameters":{"id":47,"nodeType":"ParameterList","parameters":[],"src":"654:0:0"},"scope":55,"stateMutability":"nonpayable","virtual":false,"visibility":"external"},{"id":51,"nodeType":"FunctionDefinition","src":"660:35:0","nodes":[],"functionSelector":"7fb5297f","implemented":false,"kind":"function","modifiers":[],"name":"startBroadcast","nameLocation":"669:14:0","parameters":{"id":49,"nodeType":"ParameterList","parameters":[],"src":"683:2:0"},"returnParameters":{"id":50,"nodeType":"ParameterList","parameters":[],"src":"694:0:0"},"scope":55,"stateMutability":"nonpayable","virtual":false,"visibility":"external"},{"id":54,"nodeType":"FunctionDefinition","src":"700:34:0","nodes":[],"functionSelector":"76eadd36","implemented":false,"kind":"function","modifiers":[],"name":"stopBroadcast","nameLocation":"709:13:0","parameters":{"id":52,"nodeType":"ParameterList","parameters":[],"src":"722:2:0"},"returnParameters":{"id":53,"nodeType":"ParameterList","parameters":[],"src":"733:0:0"},"scope":55,"stateMutability":"nonpayable","virtual":false,"visibility":"external"}],"abstract":false,"baseContracts":[],"canonicalName":"Vm","contractDependencies":[],"contractKind":"interface","fullyImplemented":false,"linearizedBaseContracts":[55],"name":"Vm","nameLocation":"130:2:0","scope":720,"usedErrors":[]},{"id":192,"nodeType":"ContractDefinition","src":"791:1622:0","nodes":[{"id":61,"nodeType":"VariableDeclaration","src":"813:86:0","nodes":[],"constant":true,"mutability":"constant","name":"CONSOLE_ADDRESS","nameLocation":"830:15:0","scope":192,"stateVariable":true,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"},"typeName":{"id":56,"name":"address","nodeType":"ElementaryTypeName","src":"813:7:0","stateMutability":"nonpayable","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"}},"value":{"arguments":[{"hexValue":"307830303030303030303030303030303030303036333646366537333646366336353265366336663637","id":59,"isConstant":false,"isLValue":false,"isPure":true,"kind":"number","lValueRequested":false,"nodeType":"Literal","src":"856:42:0","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"},"value":"0x000000000000000000636F6e736F6c652e6c6f67"}],"expression":{"argumentTypes":[{"typeIdentifier":"t_address","typeString":"address"}],"id":58,"isConstant":false,"isLValue":false,"isPure":true,"lValueRequested":false,"nodeType":"ElementaryTypeNameExpression","src":"848:7:0","typeDescriptions":{"typeIdentifier":"t_type$_t_address_$","typeString":"type(address)"},"typeName":{"id":57,"name":"address","nodeType":"ElementaryTypeName","src":"848:7:0","typeDescriptions":{}}},"id":60,"isConstant":false,"isLValue":false,"isPure":true,"kind":"typeConversion","lValueRequested":false,"names":[],"nodeType":"FunctionCall","src":"848:51:0","tryCall":false,"typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"}},"visibility":"internal"},{"id":78,"nodeType":"FunctionDefinition","src":"906:221:0","nodes":[],"body":{"id":77,"nodeType":"Block","src":"1065:62:0","nodes":[],"statements":[{"AST":{"nodeType":"YulBlock","src":"1084:37:0","statements":[{"nodeType":"YulAssignment","src":"1098:13:0","value":{"name":"fnIn","nodeType":"YulIdentifier","src":"1107:4:0"},"variableNames":[{"name":"fnOut","nodeType":"YulIdentifier","src":"1098:5:0"}]}]},"evmVersion":"london","externalReferences":[{"declaration":67,"isOffset":false,"isSlot":false,"src":"1107:4:0","valueSize":1},{"declaration":74,"isOffset":false,"isSlot":false,"src":"1098:5:0","valueSize":1}],"id":76,"nodeType":"InlineAssembly","src":"1075:46:0"}]},"implemented":true,"kind":"function","modifiers":[],"name":"_castLogPayloadViewToPure","nameLocation":"915:25:0","parameters":{"id":68,"nodeType":"ParameterList","parameters":[{"constant":false,"id":67,"mutability":"mutable","name":"fnIn","nameLocation":"987:4:0","nodeType":"VariableDeclaration","scope":78,"src":"950:41:0","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_function_internal_view$_t_bytes_memory_ptr_$returns$__$","typeString":"function (bytes) view"},"typeName":{"id":66,"nodeType":"FunctionTypeName","parameterTypes":{"id":64,"nodeType":"ParameterList","parameters":[{"constant":false,"id":63,"mutability":"mutable","name":"","nameLocation":"-1:-1:-1","nodeType":"VariableDeclaration","scope":66,"src":"959:12:0","stateVariable":false,"storageLocation":"memory","typeDescriptions":{"typeIdentifier":"t_bytes_memory_ptr","typeString":"bytes"},"typeName":{"id":62,"name":"bytes","nodeType":"ElementaryTypeName","src":"959:5:0","typeDescriptions":{"typeIdentifier":"t_bytes_storage_ptr","typeString":"bytes"}},"visibility":"internal"}],"src":"958:14:0"},"returnParameterTypes":{"id":65,"nodeType":"ParameterList","parameters":[],"src":"987:0:0"},"src":"950:41:0","stateMutability":"view","typeDescriptions":{"typeIdentifier":"t_function_internal_view$_t_bytes_memory_ptr_$returns$__$","typeString":"function (bytes) view"},"visibility":"internal"},"visibility":"internal"}],"src":"940:57:0"},"returnParameters":{"id":75,"nodeType":"ParameterList","parameters":[{"constant":false,"id":74,"mutability":"mutable","name":"fnOut","nameLocation":"1058:5:0","nodeType":"VariableDeclaration","scope":78,"src":"1021:42:0","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_function_internal_pure$_t_bytes_memory_ptr_$returns$__$","typeString":"function (bytes) pure"},"typeName":{"id":73,"nodeType":"FunctionTypeName","parameterTypes":{"id":71,"nodeType":"ParameterList","parameters":[{"constant":false,"id":70,"mutability":"mutable","name":"","nameLocation":"-1:-1:-1","nodeType":"VariableDeclaration","scope":73,"src":"1030:12:0","stateVariable":false,"storageLocation":"memory","typeDescriptions":{"typeIdentifier":"t_bytes_memory_ptr","typeString":"bytes"},"typeName":{"id":69,"name":"bytes","nodeType":"ElementaryTypeName","src":"1030:5:0","typeDescriptions":{"typeIdentifier":"t_bytes_storage_ptr","typeString":"bytes"}},"visibility":"internal"}],"src":"1029:14:0"},"returnParameterTypes":{"id":72,"nodeType":"ParameterList","parameters":[],"src":"1058:0:0"},"src":"1021:42:0","stateMutability":"pure","typeDescriptions":{"typeIdentifier":"t_function_internal_pure$_t_bytes_memory_ptr_$returns$__$","typeString":"function (bytes) pure"},"visibility":"internal"},"visibility":"internal"}],"src":"1020:44:0"},"scope":192,"stateMutability":"pure","virtual":false,"visibility":"internal"},{"id":90,"nodeType":"FunctionDefinition","src":"1133:133:0","nodes":[],"body":{"id":89,"nodeType":"Block","src":"1194:72:0","nodes":[],"statements":[{"expression":{"arguments":[{"id":86,"name":"payload","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":80,"src":"1251:7:0","typeDescriptions":{"typeIdentifier":"t_bytes_memory_ptr","typeString":"bytes memory"}}],"expression":{"argumentTypes":[{"typeIdentifier":"t_bytes_memory_ptr","typeString":"bytes memory"}],"arguments":[{"id":84,"name":"_sendLogPayloadView","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":106,"src":"1230:19:0","typeDescriptions":{"typeIdentifier":"t_function_internal_view$_t_bytes_memory_ptr_$returns$__$","typeString":"function (bytes memory) view"}}],"expression":{"argumentTypes":[{"typeIdentifier":"t_function_internal_view$_t_bytes_memory_ptr_$returns$__$","typeString":"function (bytes memory) view"}],"id":83,"name":"_castLogPayloadViewToPure","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":78,"src":"1204:25:0","typeDescriptions":{"typeIdentifier":"t_function_internal_pure$_t_function_internal_view$_t_bytes_memory_ptr_$returns$__$_$returns$_t_function_internal_pure$_t_bytes_memory_ptr_$returns$__$_$","typeString":"function (function (bytes memory) view) pure returns (function (bytes memory) pure)"}},"id":85,"isConstant":false,"isLValue":false,"isPure":false,"kind":"functionCall","lValueRequested":false,"names":[],"nodeType":"FunctionCall","src":"1204:46:0","tryCall":false,"typeDescriptions":{"typeIdentifier":"t_function_internal_pure$_t_bytes_memory_ptr_$returns$__$","typeString":"function (bytes memory) pure"}},"id":87,"isConstant":false,"isLValue":false,"isPure":false,"kind":"functionCall","lValueRequested":false,"names":[],"nodeType":"FunctionCall","src":"1204:55:0","tryCall":false,"typeDescriptions":{"typeIdentifier":"t_tuple$__$","typeString":"tuple()"}},"id":88,"nodeType":"ExpressionStatement","src":"1204:55:0"}]},"implemented":true,"kind":"function","modifiers":[],"name":"_sendLogPayload","nameLocation":"1142:15:0","parameters":{"id":81,"nodeType":"ParameterList","parameters":[{"constant":false,"id":80,"mutability":"mutable","name":"payload","nameLocation":"1171:7:0","nodeType":"VariableDeclaration","scope":90,"src":"1158:20:0","stateVariable":false,"storageLocation":"memory","typeDescriptions":{"typeIdentifier":"t_bytes_memory_ptr","typeString":"bytes"},"typeName":{"id":79,"name":"bytes","nodeType":"ElementaryTypeName","src":"1158:5:0","typeDescriptions":{"typeIdentifier":"t_bytes_storage_ptr","typeString":"bytes"}},"visibility":"internal"}],"src":"1157:22:0"},"returnParameters":{"id":82,"nodeType":"ParameterList","parameters":[],"src":"1194:0:0"},"scope":192,"stateMutability":"pure","virtual":false,"visibility":"internal"},{"id":106,"nodeType":"FunctionDefinition","src":"1272:380:0","nodes":[],"body":{"id":105,"nodeType":"Block","src":"1336:316:0","nodes":[],"statements":[{"assignments":[96],"declarations":[{"constant":false,"id":96,"mutability":"mutable","name":"payloadLength","nameLocation":"1354:13:0","nodeType":"VariableDeclaration","scope":105,"src":"1346:21:0","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"},"typeName":{"id":95,"name":"uint256","nodeType":"ElementaryTypeName","src":"1346:7:0","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"visibility":"internal"}],"id":99,"initialValue":{"expression":{"id":97,"name":"payload","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":92,"src":"1370:7:0","typeDescriptions":{"typeIdentifier":"t_bytes_memory_ptr","typeString":"bytes memory"}},"id":98,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"memberName":"length","nodeType":"MemberAccess","src":"1370:14:0","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"nodeType":"VariableDeclarationStatement","src":"1346:38:0"},{"assignments":[101],"declarations":[{"constant":false,"id":101,"mutability":"mutable","name":"consoleAddress","nameLocation":"1402:14:0","nodeType":"VariableDeclaration","scope":105,"src":"1394:22:0","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"},"typeName":{"id":100,"name":"address","nodeType":"ElementaryTypeName","src":"1394:7:0","stateMutability":"nonpayable","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"}},"visibility":"internal"}],"id":103,"initialValue":{"id":102,"name":"CONSOLE_ADDRESS","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":61,"src":"1419:15:0","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"}},"nodeType":"VariableDeclarationStatement","src":"1394:40:0"},{"AST":{"nodeType":"YulBlock","src":"1496:150:0","statements":[{"nodeType":"YulVariableDeclaration","src":"1510:36:0","value":{"arguments":[{"name":"payload","nodeType":"YulIdentifier","src":"1534:7:0"},{"kind":"number","nodeType":"YulLiteral","src":"1543:2:0","type":"","value":"32"}],"functionName":{"name":"add","nodeType":"YulIdentifier","src":"1530:3:0"},"nodeType":"YulFunctionCall","src":"1530:16:0"},"variables":[{"name":"payloadStart","nodeType":"YulTypedName","src":"1514:12:0","type":""}]},{"nodeType":"YulVariableDeclaration","src":"1559:77:0","value":{"arguments":[{"arguments":[],"functionName":{"name":"gas","nodeType":"YulIdentifier","src":"1579:3:0"},"nodeType":"YulFunctionCall","src":"1579:5:0"},{"name":"consoleAddress","nodeType":"YulIdentifier","src":"1586:14:0"},{"name":"payloadStart","nodeType":"YulIdentifier","src":"1602:12:0"},{"name":"payloadLength","nodeType":"YulIdentifier","src":"1616:13:0"},{"kind":"number","nodeType":"YulLiteral","src":"1631:1:0","type":"","value":"0"},{"kind":"number","nodeType":"YulLiteral","src":"1634:1:0","type":"","value":"0"}],"functionName":{"name":"staticcall","nodeType":"YulIdentifier","src":"1568:10:0"},"nodeType":"YulFunctionCall","src":"1568:68:0"},"variables":[{"name":"r","nodeType":"YulTypedName","src":"1563:1:0","type":""}]}]},"documentation":"@solidity memory-safe-assembly","evmVersion":"london","externalReferences":[{"declaration":101,"isOffset":false,"isSlot":false,"src":"1586:14:0","valueSize":1},{"declaration":92,"isOffset":false,"isSlot":false,"src":"1534:7:0","valueSize":1},{"declaration":96,"isOffset":false,"isSlot":false,"src":"1616:13:0","valueSize":1}],"id":104,"nodeType":"InlineAssembly","src":"1487:159:0"}]},"implemented":true,"kind":"function","modifiers":[],"name":"_sendLogPayloadView","nameLocation":"1281:19:0","parameters":{"id":93,"nodeType":"ParameterList","parameters":[{"constant":false,"id":92,"mutability":"mutable","name":"payload","nameLocation":"1314:7:0","nodeType":"VariableDeclaration","scope":106,"src":"1301:20:0","stateVariable":false,"storageLocation":"memory","typeDescriptions":{"typeIdentifier":"t_bytes_memory_ptr","typeString":"bytes"},"typeName":{"id":91,"name":"bytes","nodeType":"ElementaryTypeName","src":"1301:5:0","typeDescriptions":{"typeIdentifier":"t_bytes_storage_ptr","typeString":"bytes"}},"visibility":"internal"}],"src":"1300:22:0"},"returnParameters":{"id":94,"nodeType":"ParameterList","parameters":[],"src":"1336:0:0"},"scope":192,"stateMutability":"view","virtual":false,"visibility":"private"},{"id":120,"nodeType":"FunctionDefinition","src":"1658:121:0","nodes":[],"body":{"id":119,"nodeType":"Block","src":"1703:76:0","nodes":[],"statements":[{"expression":{"arguments":[{"arguments":[{"hexValue":"6c6f6728737472696e6729","id":114,"isConstant":false,"isLValue":false,"isPure":true,"kind":"string","lValueRequested":false,"nodeType":"Literal","src":"1753:13:0","typeDescriptions":{"typeIdentifier":"t_stringliteral_41304facd9323d75b11bcdd609cb38effffdb05710f7caf0e9b16c6d9d709f50","typeString":"literal_string \"log(string)\""},"value":"log(string)"},{"id":115,"name":"p0","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":108,"src":"1768:2:0","typeDescriptions":{"typeIdentifier":"t_string_memory_ptr","typeString":"string memory"}}],"expression":{"argumentTypes":[{"typeIdentifier":"t_stringliteral_41304facd9323d75b11bcdd609cb38effffdb05710f7caf0e9b16c6d9d709f50","typeString":"literal_string \"log(string)\""},{"typeIdentifier":"t_string_memory_ptr","typeString":"string memory"}],"expression":{"id":112,"name":"abi","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":-1,"src":"1729:3:0","typeDescriptions":{"typeIdentifier":"t_magic_abi","typeString":"abi"}},"id":113,"isConstant":false,"isLValue":false,"isPure":true,"lValueRequested":false,"memberName":"encodeWithSignature","nodeType":"MemberAccess","src":"1729:23:0","typeDescriptions":{"typeIdentifier":"t_function_abiencodewithsignature_pure$_t_string_memory_ptr_$returns$_t_bytes_memory_ptr_$","typeString":"function (string memory) pure returns (bytes memory)"}},"id":116,"isConstant":false,"isLValue":false,"isPure":false,"kind":"functionCall","lValueRequested":false,"names":[],"nodeType":"FunctionCall","src":"1729:42:0","tryCall":false,"typeDescriptions":{"typeIdentifier":"t_bytes_memory_ptr","typeString":"bytes memory"}}],"expression":{"argumentTypes":[{"typeIdentifier":"t_bytes_memory_ptr","typeString":"bytes memory"}],"id":111,"name":"_sendLogPayload","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":90,"src":"1713:15:0","typeDescriptions":{"typeIdentifier":"t_function_internal_pure$_t_bytes_memory_ptr_$returns$__$","typeString":"function (bytes memory) pure"}},"id":117,"isConstant":false,"isLValue":false,"isPure":false,"kind":"functionCall","lValueRequested":false,"names":[],"nodeType":"FunctionCall","src":"1713:59:0","tryCall":false,"typeDescriptions":{"typeIdentifier":"t_tuple$__$","typeString":"tuple()"}},"id":118,"nodeType":"ExpressionStatement","src":"1713:59:0"}]},"implemented":true,"kind":"function","modifiers":[],"name":"log","nameLocation":"1667:3:0","parameters":{"id":109,"nodeType":"ParameterList","parameters":[{"constant":false,"id":108,"mutability":"mutable","name":"p0","nameLocation":"1685:2:0","nodeType":"VariableDeclaration","scope":120,"src":"1671:16:0","stateVariable":false,"storageLocation":"memory","typeDescriptions":{"typeIdentifier":"t_string_memory_ptr","typeString":"string"},"typeName":{"id":107,"name":"string","nodeType":"ElementaryTypeName","src":"1671:6:0","typeDescriptions":{"typeIdentifier":"t_string_storage_ptr","typeString":"string"}},"visibility":"internal"}],"src":"1670:18:0"},"returnParameters":{"id":110,"nodeType":"ParameterList","parameters":[],"src":"1703:0:0"},"scope":192,"stateMutability":"pure","virtual":false,"visibility":"internal"},{"id":137,"nodeType":"FunctionDefinition","src":"1785:139:0","nodes":[],"body":{"id":136,"nodeType":"Block","src":"1839:85:0","nodes":[],"statements":[{"expression":{"arguments":[{"arguments":[{"hexValue":"6c6f6728737472696e672c626f6f6c29","id":130,"isConstant":false,"isLValue":false,"isPure":true,"kind":"string","lValueRequested":false,"nodeType":"Literal","src":"1889:18:0","typeDescriptions":{"typeIdentifier":"t_stringliteral_c3b556354c088fbb43886eb83c2a04bc7089663f964d22be308197a236f5b870","typeString":"literal_string \"log(string,bool)\""},"value":"log(string,bool)"},{"id":131,"name":"p0","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":122,"src":"1909:2:0","typeDescriptions":{"typeIdentifier":"t_string_memory_ptr","typeString":"string memory"}},{"id":132,"name":"p1","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":124,"src":"1913:2:0","typeDescriptions":{"typeIdentifier":"t_bool","typeString":"bool"}}],"expression":{"argumentTypes":[{"typeIdentifier":"t_stringliteral_c3b556354c088fbb43886eb83c2a04bc7089663f964d22be308197a236f5b870","typeString":"literal_string \"log(string,bool)\""},{"typeIdentifier":"t_string_memory_ptr","typeString":"string memory"},{"typeIdentifier":"t_bool","typeString":"bool"}],"expression":{"id":128,"name":"abi","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":-1,"src":"1865:3:0","typeDescriptions":{"typeIdentifier":"t_magic_abi","typeString":"abi"}},"id":129,"isConstant":false,"isLValue":false,"isPure":true,"lValueRequested":false,"memberName":"encodeWithSignature","nodeType":"MemberAccess","src":"1865:23:0","typeDescriptions":{"typeIdentifier":"t_function_abiencodewithsignature_pure$_t_string_memory_ptr_$returns$_t_bytes_memory_ptr_$","typeString":"function (string memory) pure returns (bytes memory)"}},"id":133,"isConstant":false,"isLValue":false,"isPure":false,"kind":"functionCall","lValueRequested":false,"names":[],"nodeType":"FunctionCall","src":"1865:51:0","tryCall":false,"typeDescriptions":{"typeIdentifier":"t_bytes_memory_ptr","typeString":"bytes memory"}}],"expression":{"argumentTypes":[{"typeIdentifier":"t_bytes_memory_ptr","typeString":"bytes memory"}],"id":127,"name":"_sendLogPayload","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":90,"src":"1849:15:0","typeDescriptions":{"typeIdentifier":"t_function_internal_pure$_t_bytes_memory_ptr_$returns$__$","typeString":"function (bytes memory) pure"}},"id":134,"isConstant":false,"isLValue":false,"isPure":false,"kind":"functionCall","lValueRequested":false,"names":[],"nodeType":"FunctionCall","src":"1849:68:0","tryCall":false,"typeDescriptions":{"typeIdentifier":"t_tuple$__$","typeString":"tuple()"}},"id":135,"nodeType":"ExpressionStatement","src":"1849:68:0"}]},"implemented":true,"kind":"function","modifiers":[],"name":"log","nameLocation":"1794:3:0","parameters":{"id":125,"nodeType":"ParameterList","parameters":[{"constant":false,"id":122,"mutability":"mutable","name":"p0","nameLocation":"1812:2:0","nodeType":"VariableDeclaration","scope":137,"src":"1798:16:0","stateVariable":false,"storageLocation":"memory","typeDescriptions":{"typeIdentifier":"t_string_memory_ptr","typeString":"string"},"typeName":{"id":121,"name":"string","nodeType":"ElementaryTypeName","src":"1798:6:0","typeDescriptions":{"typeIdentifier":"t_string_storage_ptr","typeString":"string"}},"visibility":"internal"},{"constant":false,"id":124,"mutability":"mutable","name":"p1","nameLocation":"1821:2:0","nodeType":"VariableDeclaration","scope":137,"src":"1816:7:0","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_bool","typeString":"bool"},"typeName":{"id":123,"name":"bool","nodeType":"ElementaryTypeName","src":"1816:4:0","typeDescriptions":{"typeIdentifier":"t_bool","typeString":"bool"}},"visibility":"internal"}],"src":"1797:27:0"},"returnParameters":{"id":126,"nodeType":"ParameterList","parameters":[],"src":"1839:0:0"},"scope":192,"stateMutability":"pure","virtual":false,"visibility":"internal"},{"id":154,"nodeType":"FunctionDefinition","src":"1930:145:0","nodes":[],"body":{"id":153,"nodeType":"Block","src":"1987:88:0","nodes":[],"statements":[{"expression":{"arguments":[{"arguments":[{"hexValue":"6c6f6728737472696e672c75696e7432353629","id":147,"isConstant":false,"isLValue":false,"isPure":true,"kind":"string","lValueRequested":false,"nodeType":"Literal","src":"2037:21:0","typeDescriptions":{"typeIdentifier":"t_stringliteral_b60e72ccf6d57ab53eb84d7e94a9545806ed7f93c4d5673f11a64f03471e584e","typeString":"literal_string \"log(string,uint256)\""},"value":"log(string,uint256)"},{"id":148,"name":"p0","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":139,"src":"2060:2:0","typeDescriptions":{"typeIdentifier":"t_string_memory_ptr","typeString":"string memory"}},{"id":149,"name":"p1","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":141,"src":"2064:2:0","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}}],"expression":{"argumentTypes":[{"typeIdentifier":"t_stringliteral_b60e72ccf6d57ab53eb84d7e94a9545806ed7f93c4d5673f11a64f03471e584e","typeString":"literal_string \"log(string,uint256)\""},{"typeIdentifier":"t_string_memory_ptr","typeString":"string memory"},{"typeIdentifier":"t_uint256","typeString":"uint256"}],"expression":{"id":145,"name":"abi","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":-1,"src":"2013:3:0","typeDescriptions":{"typeIdentifier":"t_magic_abi","typeString":"abi"}},"id":146,"isConstant":false,"isLValue":false,"isPure":true,"lValueRequested":false,"memberName":"encodeWithSignature","nodeType":"MemberAccess","src":"2013:23:0","typeDescriptions":{"typeIdentifier":"t_function_abiencodewithsignature_pure$_t_string_memory_ptr_$returns$_t_bytes_memory_ptr_$","typeString":"function (string memory) pure returns (bytes memory)"}},"id":150,"isConstant":false,"isLValue":false,"isPure":false,"kind":"functionCall","lValueRequested":false,"names":[],"nodeType":"FunctionCall","src":"2013:54:0","tryCall":false,"typeDescriptions":{"typeIdentifier":"t_bytes_memory_ptr","typeString":"bytes memory"}}],"expression":{"argumentTypes":[{"typeIdentifier":"t_bytes_memory_ptr","typeString":"bytes memory"}],"id":144,"name":"_sendLogPayload","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":90,"src":"1997:15:0","typeDescriptions":{"typeIdentifier":"t_function_internal_pure$_t_bytes_memory_ptr_$returns$__$","typeString":"function (bytes memory) pure"}},"id":151,"isConstant":false,"isLValue":false,"isPure":false,"kind":"functionCall","lValueRequested":false,"names":[],"nodeType":"FunctionCall","src":"1997:71:0","tryCall":false,"typeDescriptions":{"typeIdentifier":"t_tuple$__$","typeString":"tuple()"}},"id":152,"nodeType":"ExpressionStatement","src":"1997:71:0"}]},"implemented":true,"kind":"function","modifiers":[],"name":"log","nameLocation":"1939:3:0","parameters":{"id":142,"nodeType":"ParameterList","parameters":[{"constant":false,"id":139,"mutability":"mutable","name":"p0","nameLocation":"1957:2:0","nodeType":"VariableDeclaration","scope":154,"src":"1943:16:0","stateVariable":false,"storageLocation":"memory","typeDescriptions":{"typeIdentifier":"t_string_memory_ptr","typeString":"string"},"typeName":{"id":138,"name":"string","nodeType":"ElementaryTypeName","src":"1943:6:0","typeDescriptions":{"typeIdentifier":"t_string_storage_ptr","typeString":"string"}},"visibility":"internal"},{"constant":false,"id":141,"mutability":"mutable","name":"p1","nameLocation":"1969:2:0","nodeType":"VariableDeclaration","scope":154,"src":"1961:10:0","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"},"typeName":{"id":140,"name":"uint256","nodeType":"ElementaryTypeName","src":"1961:7:0","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"visibility":"internal"}],"src":"1942:30:0"},"returnParameters":{"id":143,"nodeType":"ParameterList","parameters":[],"src":"1987:0:0"},"scope":192,"stateMutability":"pure","virtual":false,"visibility":"internal"},{"id":171,"nodeType":"FunctionDefinition","src":"2081:145:0","nodes":[],"body":{"id":170,"nodeType":"Block","src":"2138:88:0","nodes":[],"statements":[{"expression":{"arguments":[{"arguments":[{"hexValue":"6c6f6728737472696e672c6164647265737329","id":164,"isConstant":false,"isLValue":false,"isPure":true,"kind":"string","lValueRequested":false,"nodeType":"Literal","src":"2188:21:0","typeDescriptions":{"typeIdentifier":"t_stringliteral_319af333460570a1937bf195dd33445c0d0951c59127da6f1f038b9fdce3fd72","typeString":"literal_string \"log(string,address)\""},"value":"log(string,address)"},{"id":165,"name":"p0","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":156,"src":"2211:2:0","typeDescriptions":{"typeIdentifier":"t_string_memory_ptr","typeString":"string memory"}},{"id":166,"name":"p1","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":158,"src":"2215:2:0","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"}}],"expression":{"argumentTypes":[{"typeIdentifier":"t_stringliteral_319af333460570a1937bf195dd33445c0d0951c59127da6f1f038b9fdce3fd72","typeString":"literal_string \"log(string,address)\""},{"typeIdentifier":"t_string_memory_ptr","typeString":"string memory"},{"typeIdentifier":"t_address","typeString":"address"}],"expression":{"id":162,"name":"abi","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":-1,"src":"2164:3:0","typeDescriptions":{"typeIdentifier":"t_magic_abi","typeString":"abi"}},"id":163,"isConstant":false,"isLValue":false,"isPure":true,"lValueRequested":false,"memberName":"encodeWithSignature","nodeType":"MemberAccess","src":"2164:23:0","typeDescriptions":{"typeIdentifier":"t_function_abiencodewithsignature_pure$_t_string_memory_ptr_$returns$_t_bytes_memory_ptr_$","typeString":"function (string memory) pure returns (bytes memory)"}},"id":167,"isConstant":false,"isLValue":false,"isPure":false,"kind":"functionCall","lValueRequested":false,"names":[],"nodeType":"FunctionCall","src":"2164:54:0","tryCall":false,"typeDescriptions":{"typeIdentifier":"t_bytes_memory_ptr","typeString":"bytes memory"}}],"expression":{"argumentTypes":[{"typeIdentifier":"t_bytes_memory_ptr","typeString":"bytes memory"}],"id":161,"name":"_sendLogPayload","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":90,"src":"2148:15:0","typeDescriptions":{"typeIdentifier":"t_function_internal_pure$_t_bytes_memory_ptr_$returns$__$","typeString":"function (bytes memory) pure"}},"id":168,"isConstant":false,"isLValue":false,"isPure":false,"kind":"functionCall","lValueRequested":false,"names":[],"nodeType":"FunctionCall","src":"2148:71:0","tryCall":false,"typeDescriptions":{"typeIdentifier":"t_tuple$__$","typeString":"tuple()"}},"id":169,"nodeType":"ExpressionStatement","src":"2148:71:0"}]},"implemented":true,"kind":"function","modifiers":[],"name":"log","nameLocation":"2090:3:0","parameters":{"id":159,"nodeType":"ParameterList","parameters":[{"constant":false,"id":156,"mutability":"mutable","name":"p0","nameLocation":"2108:2:0","nodeType":"VariableDeclaration","scope":171,"src":"2094:16:0","stateVariable":false,"storageLocation":"memory","typeDescriptions":{"typeIdentifier":"t_string_memory_ptr","typeString":"string"},"typeName":{"id":155,"name":"string","nodeType":"ElementaryTypeName","src":"2094:6:0","typeDescriptions":{"typeIdentifier":"t_string_storage_ptr","typeString":"string"}},"visibility":"internal"},{"constant":false,"id":158,"mutability":"mutable","name":"p1","nameLocation":"2120:2:0","nodeType":"VariableDeclaration","scope":171,"src":"2112:10:0","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"},"typeName":{"id":157,"name":"address","nodeType":"ElementaryTypeName","src":"2112:7:0","stateMutability":"nonpayable","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"}},"visibility":"internal"}],"src":"2093:30:0"},"returnParameters":{"id":160,"nodeType":"ParameterList","parameters":[],"src":"2138:0:0"},"scope":192,"stateMutability":"pure","virtual":false,"visibility":"internal"},{"id":191,"nodeType":"FunctionDefinition","src":"2232:179:0","nodes":[],"body":{"id":190,"nodeType":"Block","src":"2313:98:0","nodes":[],"statements":[{"expression":{"arguments":[{"arguments":[{"hexValue":"6c6f6728737472696e672c737472696e672c737472696e6729","id":183,"isConstant":false,"isLValue":false,"isPure":true,"kind":"string","lValueRequested":false,"nodeType":"Literal","src":"2363:27:0","typeDescriptions":{"typeIdentifier":"t_stringliteral_2ced7cef693312206c21f0e92e3b54e2e16bf33db5eec350c78866822c665e1f","typeString":"literal_string \"log(string,string,string)\""},"value":"log(string,string,string)"},{"id":184,"name":"p0","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":173,"src":"2392:2:0","typeDescriptions":{"typeIdentifier":"t_string_memory_ptr","typeString":"string memory"}},{"id":185,"name":"p1","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":175,"src":"2396:2:0","typeDescriptions":{"typeIdentifier":"t_string_memory_ptr","typeString":"string memory"}},{"id":186,"name":"p2","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":177,"src":"2400:2:0","typeDescriptions":{"typeIdentifier":"t_string_memory_ptr","typeString":"string memory"}}],"expression":{"argumentTypes":[{"typeIdentifier":"t_stringliteral_2ced7cef693312206c21f0e92e3b54e2e16bf33db5eec350c78866822c665e1f","typeString":"literal_string \"log(string,string,string)\""},{"typeIdentifier":"t_string_memory_ptr","typeString":"string memory"},{"typeIdentifier":"t_string_memory_ptr","typeString":"string memory"},{"typeIdentifier":"t_string_memory_ptr","typeString":"string memory"}],"expression":{"id":181,"name":"abi","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":-1,"src":"2339:3:0","typeDescriptions":{"typeIdentifier":"t_magic_abi","typeString":"abi"}},"id":182,"isConstant":false,"isLValue":false,"isPure":true,"lValueRequested":false,"memberName":"encodeWithSignature","nodeType":"MemberAccess","src":"2339:23:0","typeDescriptions":{"typeIdentifier":"t_function_abiencodewithsignature_pure$_t_string_memory_ptr_$returns$_t_bytes_memory_ptr_$","typeString":"function (string memory) pure returns (bytes memory)"}},"id":187,"isConstant":false,"isLValue":false,"isPure":false,"kind":"functionCall","lValueRequested":false,"names":[],"nodeType":"FunctionCall","src":"2339:64:0","tryCall":false,"typeDescriptions":{"typeIdentifier":"t_bytes_memory_ptr","typeString":"bytes memory"}}],"expression":{"argumentTypes":[{"typeIdentifier":"t_bytes_memory_ptr","typeString":"bytes memory"}],"id":180,"name":"_sendLogPayload","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":90,"src":"2323:15:0","typeDescriptions":{"typeIdentifier":"t_function_internal_pure$_t_bytes_memory_ptr_$returns$__$","typeString":"function (bytes memory) pure"}},"id":188,"isConstant":false,"isLValue":false,"isPure":false,"kind":"functionCall","lValueRequested":false,"names":[],"nodeType":"FunctionCall","src":"2323:81:0","tryCall":false,"typeDescriptions":{"typeIdentifier":"t_tuple$__$","typeString":"tuple()"}},"id":189,"nodeType":"ExpressionStatement","src":"2323:81:0"}]},"implemented":true,"kind":"function","modifiers":[],"name":"log","nameLocation":"2241:3:0","parameters":{"id":178,"nodeType":"ParameterList","parameters":[{"constant":false,"id":173,"mutability":"mutable","name":"p0","nameLocation":"2259:2:0","nodeType":"VariableDeclaration","scope":191,"src":"2245:16:0","stateVariable":false,"storageLocation":"memory","typeDescriptions":{"typeIdentifier":"t_string_memory_ptr","typeString":"string"},"typeName":{"id":172,"name":"string","nodeType":"ElementaryTypeName","src":"2245:6:0","typeDescriptions":{"typeIdentifier":"t_string_storage_ptr","typeString":"string"}},"visibility":"internal"},{"constant":false,"id":175,"mutability":"mutable","name":"p1","nameLocation":"2277:2:0","nodeType":"VariableDeclaration","scope":191,"src":"2263:16:0","stateVariable":false,"storageLocation":"memory","typeDescriptions":{"typeIdentifier":"t_string_memory_ptr","typeString":"string"},"typeName":{"id":174,"name":"string","nodeType":"ElementaryTypeName","src":"2263:6:0","typeDescriptions":{"typeIdentifier":"t_string_storage_ptr","typeString":"string"}},"visibility":"internal"},{"constant":false,"id":177,"mutability":"mutable","name":"p2","nameLocation":"2295:2:0","nodeType":"VariableDeclaration","scope":191,"src":"2281:16:0","stateVariable":false,"storageLocation":"memory","typeDescriptions":{"typeIdentifier":"t_string_memory_ptr","typeString":"string"},"typeName":{"id":176,"name":"string","nodeType":"ElementaryTypeName","src":"2281:6:0","typeDescriptions":{"typeIdentifier":"t_string_storage_ptr","typeString":"string"}},"visibility":"internal"}],"src":"2244:54:0"},"returnParameters":{"id":179,"nodeType":"ParameterList","parameters":[],"src":"2313:0:0"},"scope":192,"stateMutability":"pure","virtual":false,"visibility":"internal"}],"abstract":false,"baseContracts":[],"canonicalName":"console","contractDependencies":[],"contractKind":"library","fullyImplemented":true,"linearizedBaseContracts":[192],"name":"console","nameLocation":"799:7:0","scope":720,"usedErrors":[]},{"id":706,"nodeType":"ContractDefinition","src":"2541:3359:0","nodes":[{"id":207,"nodeType":"VariableDeclaration","src":"2571:94:0","nodes":[],"constant":true,"mutability":"constant","name":"VM_ADDRESS","nameLocation":"2597:10:0","scope":706,"stateVariable":true,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"},"typeName":{"id":194,"name":"address","nodeType":"ElementaryTypeName","src":"2571:7:0","stateMutability":"nonpayable","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"}},"value":{"arguments":[{"arguments":[{"arguments":[{"arguments":[{"hexValue":"6865766d20636865617420636f6465","id":202,"isConstant":false,"isLValue":false,"isPure":true,"kind":"string","lValueRequested":false,"nodeType":"Literal","src":"2644:17:0","typeDescriptions":{"typeIdentifier":"t_stringliteral_885cb69240a935d632d79c317109709ecfa91a80626ff3989d68f67f5b1dd12d","typeString":"literal_string \"hevm cheat code\""},"value":"hevm cheat code"}],"expression":{"argumentTypes":[{"typeIdentifier":"t_stringliteral_885cb69240a935d632d79c317109709ecfa91a80626ff3989d68f67f5b1dd12d","typeString":"literal_string \"hevm cheat code\""}],"id":201,"name":"keccak256","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":-8,"src":"2634:9:0","typeDescriptions":{"typeIdentifier":"t_function_keccak256_pure$_t_bytes_memory_ptr_$returns$_t_bytes32_$","typeString":"function (bytes memory) pure returns (bytes32)"}},"id":203,"isConstant":false,"isLValue":false,"isPure":true,"kind":"functionCall","lValueRequested":false,"names":[],"nodeType":"FunctionCall","src":"2634:28:0","tryCall":false,"typeDescriptions":{"typeIdentifier":"t_bytes32","typeString":"bytes32"}}],"expression":{"argumentTypes":[{"typeIdentifier":"t_bytes32","typeString":"bytes32"}],"id":200,"isConstant":false,"isLValue":false,"isPure":true,"lValueRequested":false,"nodeType":"ElementaryTypeNameExpression","src":"2626:7:0","typeDescriptions":{"typeIdentifier":"t_type$_t_uint256_$","typeString":"type(uint256)"},"typeName":{"id":199,"name":"uint256","nodeType":"ElementaryTypeName","src":"2626:7:0","typeDescriptions":{}}},"id":204,"isConstant":false,"isLValue":false,"isPure":true,"kind":"typeConversion","lValueRequested":false,"names":[],"nodeType":"FunctionCall","src":"2626:37:0","tryCall":false,"typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}}],"expression":{"argumentTypes":[{"typeIdentifier":"t_uint256","typeString":"uint256"}],"id":198,"isConstant":false,"isLValue":false,"isPure":true,"lValueRequested":false,"nodeType":"ElementaryTypeNameExpression","src":"2618:7:0","typeDescriptions":{"typeIdentifier":"t_type$_t_uint160_$","typeString":"type(uint160)"},"typeName":{"id":197,"name":"uint160","nodeType":"ElementaryTypeName","src":"2618:7:0","typeDescriptions":{}}},"id":205,"isConstant":false,"isLValue":false,"isPure":true,"kind":"typeConversion","lValueRequested":false,"names":[],"nodeType":"FunctionCall","src":"2618:46:0","tryCall":false,"typeDescriptions":{"typeIdentifier":"t_uint160","typeString":"uint160"}}],"expression":{"argumentTypes":[{"typeIdentifier":"t_uint160","typeString":"uint160"}],"id":196,"isConstant":false,"isLValue":false,"isPure":true,"lValueRequested":false,"nodeType":"ElementaryTypeNameExpression","src":"2610:7:0","typeDescriptions":{"typeIdentifier":"t_type$_t_address_$","typeString":"type(address)"},"typeName":{"id":195,"name":"address","nodeType":"ElementaryTypeName","src":"2610:7:0","typeDescriptions":{}}},"id":206,"isConstant":false,"isLValue":false,"isPure":true,"kind":"typeConversion","lValueRequested":false,"names":[],"nodeType":"FunctionCall","src":"2610:55:0","tryCall":false,"typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"}},"visibility":"internal"},{"id":213,"nodeType":"VariableDeclaration","src":"2671:40:0","nodes":[],"constant":true,"mutability":"constant","name":"vm","nameLocation":"2692:2:0","scope":706,"stateVariable":true,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_contract$_Vm_$55","typeString":"contract Vm"},"typeName":{"id":209,"nodeType":"UserDefinedTypeName","pathNode":{"id":208,"name":"Vm","nodeType":"IdentifierPath","referencedDeclaration":55,"src":"2671:2:0"},"referencedDeclaration":55,"src":"2671:2:0","typeDescriptions":{"typeIdentifier":"t_contract$_Vm_$55","typeString":"contract Vm"}},"value":{"arguments":[{"id":211,"name":"VM_ADDRESS","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":207,"src":"2700:10:0","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"}}],"expression":{"argumentTypes":[{"typeIdentifier":"t_address","typeString":"address"}],"id":210,"name":"Vm","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":55,"src":"2697:2:0","typeDescriptions":{"typeIdentifier":"t_type$_t_contract$_Vm_$55_$","typeString":"type(contract Vm)"}},"id":212,"isConstant":false,"isLValue":false,"isPure":true,"kind":"typeConversion","lValueRequested":false,"names":[],"nodeType":"FunctionCall","src":"2697:14:0","tryCall":false,"typeDescriptions":{"typeIdentifier":"t_contract$_Vm_$55","typeString":"contract Vm"}},"visibility":"internal"},{"id":215,"nodeType":"VariableDeclaration","src":"2775:22:0","nodes":[],"constant":false,"functionSelector":"61bc221a","mutability":"mutable","name":"counter","nameLocation":"2790:7:0","scope":706,"stateVariable":true,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"},"typeName":{"id":214,"name":"uint256","nodeType":"ElementaryTypeName","src":"2775:7:0","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"visibility":"public"},{"id":378,"nodeType":"FunctionDefinition","src":"2887:949:0","nodes":[],"body":{"id":377,"nodeType":"Block","src":"2909:927:0","nodes":[],"statements":[{"assignments":[220],"declarations":[{"constant":false,"id":220,"mutability":"mutable","name":"x","nameLocation":"2924:1:0","nodeType":"VariableDeclaration","scope":377,"src":"2919:6:0","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_bool","typeString":"bool"},"typeName":{"id":219,"name":"bool","nodeType":"ElementaryTypeName","src":"2919:4:0","typeDescriptions":{"typeIdentifier":"t_bool","typeString":"bool"}},"visibility":"internal"}],"id":226,"initialValue":{"arguments":[{"hexValue":"4558414d504c455f424f4f4c","id":223,"isConstant":false,"isLValue":false,"isPure":true,"kind":"string","lValueRequested":false,"nodeType":"Literal","src":"2937:14:0","typeDescriptions":{"typeIdentifier":"t_stringliteral_a634dae177a0e138ae7aaa2afae347412e148992e88c7aabd33ee71be146cb7f","typeString":"literal_string \"EXAMPLE_BOOL\""},"value":"EXAMPLE_BOOL"},{"hexValue":"66616c7365","id":224,"isConstant":false,"isLValue":false,"isPure":true,"kind":"bool","lValueRequested":false,"nodeType":"Literal","src":"2953:5:0","typeDescriptions":{"typeIdentifier":"t_bool","typeString":"bool"},"value":"false"}],"expression":{"argumentTypes":[{"typeIdentifier":"t_stringliteral_a634dae177a0e138ae7aaa2afae347412e148992e88c7aabd33ee71be146cb7f","typeString":"literal_string \"EXAMPLE_BOOL\""},{"typeIdentifier":"t_bool","typeString":"bool"}],"expression":{"id":221,"name":"vm","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":213,"src":"2928:2:0","typeDescriptions":{"typeIdentifier":"t_contract$_Vm_$55","typeString":"contract Vm"}},"id":222,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"memberName":"envOr","nodeType":"MemberAccess","referencedDeclaration":10,"src":"2928:8:0","typeDescriptions":{"typeIdentifier":"t_function_external_view$_t_string_memory_ptr_$_t_bool_$returns$_t_bool_$","typeString":"function (string memory,bool) view external returns (bool)"}},"id":225,"isConstant":false,"isLValue":false,"isPure":false,"kind":"functionCall","lValueRequested":false,"names":[],"nodeType":"FunctionCall","src":"2928:31:0","tryCall":false,"typeDescriptions":{"typeIdentifier":"t_bool","typeString":"bool"}},"nodeType":"VariableDeclarationStatement","src":"2919:40:0"},{"expression":{"arguments":[{"hexValue":"626f6f6c2076616c75652066726f6d20656e76","id":230,"isConstant":false,"isLValue":false,"isPure":true,"kind":"string","lValueRequested":false,"nodeType":"Literal","src":"2981:21:0","typeDescriptions":{"typeIdentifier":"t_stringliteral_5a607d0b5a1295325aa8901721d78ba402601bba6f62cebdd5235dd0204a590b","typeString":"literal_string \"bool value from env\""},"value":"bool value from env"},{"id":231,"name":"x","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":220,"src":"3004:1:0","typeDescriptions":{"typeIdentifier":"t_bool","typeString":"bool"}}],"expression":{"argumentTypes":[{"typeIdentifier":"t_stringliteral_5a607d0b5a1295325aa8901721d78ba402601bba6f62cebdd5235dd0204a590b","typeString":"literal_string \"bool value from env\""},{"typeIdentifier":"t_bool","typeString":"bool"}],"expression":{"id":227,"name":"console","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":192,"src":"2969:7:0","typeDescriptions":{"typeIdentifier":"t_type$_t_contract$_console_$192_$","typeString":"type(library console)"}},"id":229,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"memberName":"log","nodeType":"MemberAccess","referencedDeclaration":137,"src":"2969:11:0","typeDescriptions":{"typeIdentifier":"t_function_internal_pure$_t_string_memory_ptr_$_t_bool_$returns$__$","typeString":"function (string memory,bool) pure"}},"id":232,"isConstant":false,"isLValue":false,"isPure":false,"kind":"functionCall","lValueRequested":false,"names":[],"nodeType":"FunctionCall","src":"2969:37:0","tryCall":false,"typeDescriptions":{"typeIdentifier":"t_tuple$__$","typeString":"tuple()"}},"id":233,"nodeType":"ExpressionStatement","src":"2969:37:0"},{"expression":{"arguments":[{"hexValue":"636f6e74726163742061646472","id":237,"isConstant":false,"isLValue":false,"isPure":true,"kind":"string","lValueRequested":false,"nodeType":"Literal","src":"3029:15:0","typeDescriptions":{"typeIdentifier":"t_stringliteral_fa50728770d00fe8f6a0592f3565bbfaf063ee4077f1f5bbc003d091d33cd0c4","typeString":"literal_string \"contract addr\""},"value":"contract addr"},{"arguments":[{"id":240,"name":"this","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":-28,"src":"3054:4:0","typeDescriptions":{"typeIdentifier":"t_contract$_ScriptExample_$706","typeString":"contract ScriptExample"}}],"expression":{"argumentTypes":[{"typeIdentifier":"t_contract$_ScriptExample_$706","typeString":"contract ScriptExample"}],"id":239,"isConstant":false,"isLValue":false,"isPure":true,"lValueRequested":false,"nodeType":"ElementaryTypeNameExpression","src":"3046:7:0","typeDescriptions":{"typeIdentifier":"t_type$_t_address_$","typeString":"type(address)"},"typeName":{"id":238,"name":"address","nodeType":"ElementaryTypeName","src":"3046:7:0","typeDescriptions":{}}},"id":241,"isConstant":false,"isLValue":false,"isPure":false,"kind":"typeConversion","lValueRequested":false,"names":[],"nodeType":"FunctionCall","src":"3046:13:0","tryCall":false,"typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"}}],"expression":{"argumentTypes":[{"typeIdentifier":"t_stringliteral_fa50728770d00fe8f6a0592f3565bbfaf063ee4077f1f5bbc003d091d33cd0c4","typeString":"literal_string \"contract addr\""},{"typeIdentifier":"t_address","typeString":"address"}],"expression":{"id":234,"name":"console","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":192,"src":"3017:7:0","typeDescriptions":{"typeIdentifier":"t_type$_t_contract$_console_$192_$","typeString":"type(library console)"}},"id":236,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"memberName":"log","nodeType":"MemberAccess","referencedDeclaration":171,"src":"3017:11:0","typeDescriptions":{"typeIdentifier":"t_function_internal_pure$_t_string_memory_ptr_$_t_address_$returns$__$","typeString":"function (string memory,address) pure"}},"id":242,"isConstant":false,"isLValue":false,"isPure":false,"kind":"functionCall","lValueRequested":false,"names":[],"nodeType":"FunctionCall","src":"3017:43:0","tryCall":false,"typeDescriptions":{"typeIdentifier":"t_tuple$__$","typeString":"tuple()"}},"id":243,"nodeType":"ExpressionStatement","src":"3017:43:0"},{"expression":{"arguments":[{"hexValue":"636f6e7472616374206e6f6e6365","id":247,"isConstant":false,"isLValue":false,"isPure":true,"kind":"string","lValueRequested":false,"nodeType":"Literal","src":"3082:16:0","typeDescriptions":{"typeIdentifier":"t_stringliteral_3a23091615a5de8c0a35ffd8857a37e2c4e0b72f3ef8a34d6caf65efcd562e2f","typeString":"literal_string \"contract nonce\""},"value":"contract nonce"},{"arguments":[{"arguments":[{"id":252,"name":"this","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":-28,"src":"3120:4:0","typeDescriptions":{"typeIdentifier":"t_contract$_ScriptExample_$706","typeString":"contract ScriptExample"}}],"expression":{"argumentTypes":[{"typeIdentifier":"t_contract$_ScriptExample_$706","typeString":"contract ScriptExample"}],"id":251,"isConstant":false,"isLValue":false,"isPure":true,"lValueRequested":false,"nodeType":"ElementaryTypeNameExpression","src":"3112:7:0","typeDescriptions":{"typeIdentifier":"t_type$_t_address_$","typeString":"type(address)"},"typeName":{"id":250,"name":"address","nodeType":"ElementaryTypeName","src":"3112:7:0","typeDescriptions":{}}},"id":253,"isConstant":false,"isLValue":false,"isPure":false,"kind":"typeConversion","lValueRequested":false,"names":[],"nodeType":"FunctionCall","src":"3112:13:0","tryCall":false,"typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"}}],"expression":{"argumentTypes":[{"typeIdentifier":"t_address","typeString":"address"}],"expression":{"id":248,"name":"vm","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":213,"src":"3100:2:0","typeDescriptions":{"typeIdentifier":"t_contract$_Vm_$55","typeString":"contract Vm"}},"id":249,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"memberName":"getNonce","nodeType":"MemberAccess","referencedDeclaration":17,"src":"3100:11:0","typeDescriptions":{"typeIdentifier":"t_function_external_view$_t_address_$returns$_t_uint64_$","typeString":"function (address) view external returns (uint64)"}},"id":254,"isConstant":false,"isLValue":false,"isPure":false,"kind":"functionCall","lValueRequested":false,"names":[],"nodeType":"FunctionCall","src":"3100:26:0","tryCall":false,"typeDescriptions":{"typeIdentifier":"t_uint64","typeString":"uint64"}}],"expression":{"argumentTypes":[{"typeIdentifier":"t_stringliteral_3a23091615a5de8c0a35ffd8857a37e2c4e0b72f3ef8a34d6caf65efcd562e2f","typeString":"literal_string \"contract nonce\""},{"typeIdentifier":"t_uint64","typeString":"uint64"}],"expression":{"id":244,"name":"console","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":192,"src":"3070:7:0","typeDescriptions":{"typeIdentifier":"t_type$_t_contract$_console_$192_$","typeString":"type(library console)"}},"id":246,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"memberName":"log","nodeType":"MemberAccess","referencedDeclaration":154,"src":"3070:11:0","typeDescriptions":{"typeIdentifier":"t_function_internal_pure$_t_string_memory_ptr_$_t_uint256_$returns$__$","typeString":"function (string memory,uint256) pure"}},"id":255,"isConstant":false,"isLValue":false,"isPure":false,"kind":"functionCall","lValueRequested":false,"names":[],"nodeType":"FunctionCall","src":"3070:57:0","tryCall":false,"typeDescriptions":{"typeIdentifier":"t_tuple$__$","typeString":"tuple()"}},"id":256,"nodeType":"ExpressionStatement","src":"3070:57:0"},{"expression":{"arguments":[{"hexValue":"73656e6465722061646472","id":260,"isConstant":false,"isLValue":false,"isPure":true,"kind":"string","lValueRequested":false,"nodeType":"Literal","src":"3149:13:0","typeDescriptions":{"typeIdentifier":"t_stringliteral_8125ca2decf812b25b65606ff16dad37cb198ff0433485a7926e50feafacfc35","typeString":"literal_string \"sender addr\""},"value":"sender addr"},{"arguments":[{"expression":{"id":263,"name":"msg","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":-15,"src":"3172:3:0","typeDescriptions":{"typeIdentifier":"t_magic_message","typeString":"msg"}},"id":264,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"memberName":"sender","nodeType":"MemberAccess","src":"3172:10:0","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"}}],"expression":{"argumentTypes":[{"typeIdentifier":"t_address","typeString":"address"}],"id":262,"isConstant":false,"isLValue":false,"isPure":true,"lValueRequested":false,"nodeType":"ElementaryTypeNameExpression","src":"3164:7:0","typeDescriptions":{"typeIdentifier":"t_type$_t_address_$","typeString":"type(address)"},"typeName":{"id":261,"name":"address","nodeType":"ElementaryTypeName","src":"3164:7:0","typeDescriptions":{}}},"id":265,"isConstant":false,"isLValue":false,"isPure":false,"kind":"typeConversion","lValueRequested":false,"names":[],"nodeType":"FunctionCall","src":"3164:19:0","tryCall":false,"typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"}}],"expression":{"argumentTypes":[{"typeIdentifier":"t_stringliteral_8125ca2decf812b25b65606ff16dad37cb198ff0433485a7926e50feafacfc35","typeString":"literal_string \"sender addr\""},{"typeIdentifier":"t_address","typeString":"address"}],"expression":{"id":257,"name":"console","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":192,"src":"3137:7:0","typeDescriptions":{"typeIdentifier":"t_type$_t_contract$_console_$192_$","typeString":"type(library console)"}},"id":259,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"memberName":"log","nodeType":"MemberAccess","referencedDeclaration":171,"src":"3137:11:0","typeDescriptions":{"typeIdentifier":"t_function_internal_pure$_t_string_memory_ptr_$_t_address_$returns$__$","typeString":"function (string memory,address) pure"}},"id":266,"isConstant":false,"isLValue":false,"isPure":false,"kind":"functionCall","lValueRequested":false,"names":[],"nodeType":"FunctionCall","src":"3137:47:0","tryCall":false,"typeDescriptions":{"typeIdentifier":"t_tuple$__$","typeString":"tuple()"}},"id":267,"nodeType":"ExpressionStatement","src":"3137:47:0"},{"expression":{"arguments":[{"hexValue":"73656e646572206e6f6e6365","id":271,"isConstant":false,"isLValue":false,"isPure":true,"kind":"string","lValueRequested":false,"nodeType":"Literal","src":"3206:14:0","typeDescriptions":{"typeIdentifier":"t_stringliteral_db7deb43f2f9e0404016de53b7e64c4976b54149581f7534daae2551e8cf4e40","typeString":"literal_string \"sender nonce\""},"value":"sender nonce"},{"arguments":[{"arguments":[{"expression":{"id":276,"name":"msg","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":-15,"src":"3242:3:0","typeDescriptions":{"typeIdentifier":"t_magic_message","typeString":"msg"}},"id":277,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"memberName":"sender","nodeType":"MemberAccess","src":"3242:10:0","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"}}],"expression":{"argumentTypes":[{"typeIdentifier":"t_address","typeString":"address"}],"id":275,"isConstant":false,"isLValue":false,"isPure":true,"lValueRequested":false,"nodeType":"ElementaryTypeNameExpression","src":"3234:7:0","typeDescriptions":{"typeIdentifier":"t_type$_t_address_$","typeString":"type(address)"},"typeName":{"id":274,"name":"address","nodeType":"ElementaryTypeName","src":"3234:7:0","typeDescriptions":{}}},"id":278,"isConstant":false,"isLValue":false,"isPure":false,"kind":"typeConversion","lValueRequested":false,"names":[],"nodeType":"FunctionCall","src":"3234:19:0","tryCall":false,"typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"}}],"expression":{"argumentTypes":[{"typeIdentifier":"t_address","typeString":"address"}],"expression":{"id":272,"name":"vm","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":213,"src":"3222:2:0","typeDescriptions":{"typeIdentifier":"t_contract$_Vm_$55","typeString":"contract Vm"}},"id":273,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"memberName":"getNonce","nodeType":"MemberAccess","referencedDeclaration":17,"src":"3222:11:0","typeDescriptions":{"typeIdentifier":"t_function_external_view$_t_address_$returns$_t_uint64_$","typeString":"function (address) view external returns (uint64)"}},"id":279,"isConstant":false,"isLValue":false,"isPure":false,"kind":"functionCall","lValueRequested":false,"names":[],"nodeType":"FunctionCall","src":"3222:32:0","tryCall":false,"typeDescriptions":{"typeIdentifier":"t_uint64","typeString":"uint64"}}],"expression":{"argumentTypes":[{"typeIdentifier":"t_stringliteral_db7deb43f2f9e0404016de53b7e64c4976b54149581f7534daae2551e8cf4e40","typeString":"literal_string \"sender nonce\""},{"typeIdentifier":"t_uint64","typeString":"uint64"}],"expression":{"id":268,"name":"console","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":192,"src":"3194:7:0","typeDescriptions":{"typeIdentifier":"t_type$_t_contract$_console_$192_$","typeString":"type(library console)"}},"id":270,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"memberName":"log","nodeType":"MemberAccess","referencedDeclaration":154,"src":"3194:11:0","typeDescriptions":{"typeIdentifier":"t_function_internal_pure$_t_string_memory_ptr_$_t_uint256_$returns$__$","typeString":"function (string memory,uint256) pure"}},"id":280,"isConstant":false,"isLValue":false,"isPure":false,"kind":"functionCall","lValueRequested":false,"names":[],"nodeType":"FunctionCall","src":"3194:61:0","tryCall":false,"typeDescriptions":{"typeIdentifier":"t_tuple$__$","typeString":"tuple()"}},"id":281,"nodeType":"ExpressionStatement","src":"3194:61:0"},{"assignments":[283],"declarations":[{"constant":false,"id":283,"mutability":"mutable","name":"json","nameLocation":"3280:4:0","nodeType":"VariableDeclaration","scope":377,"src":"3266:18:0","stateVariable":false,"storageLocation":"memory","typeDescriptions":{"typeIdentifier":"t_string_memory_ptr","typeString":"string"},"typeName":{"id":282,"name":"string","nodeType":"ElementaryTypeName","src":"3266:6:0","typeDescriptions":{"typeIdentifier":"t_string_storage_ptr","typeString":"string"}},"visibility":"internal"}],"id":285,"initialValue":{"hexValue":"7b22726f6f745f6b6579223a205b7b2261223a20312c202262223a20327d5d7d","id":284,"isConstant":false,"isLValue":false,"isPure":true,"kind":"string","lValueRequested":false,"nodeType":"Literal","src":"3287:34:0","typeDescriptions":{"typeIdentifier":"t_stringliteral_e95522e99766888d0261f55bd1eae5e3f3e26eaf009a16e2433eafaf0a4ecdf2","typeString":"literal_string \"{\"root_key\": [{\"a\": 1, \"b\": 2}]}\""},"value":"{\"root_key\": [{\"a\": 1, \"b\": 2}]}"},"nodeType":"VariableDeclarationStatement","src":"3266:55:0"},{"assignments":[290],"declarations":[{"constant":false,"id":290,"mutability":"mutable","name":"keys","nameLocation":"3347:4:0","nodeType":"VariableDeclaration","scope":377,"src":"3331:20:0","stateVariable":false,"storageLocation":"memory","typeDescriptions":{"typeIdentifier":"t_array$_t_string_memory_ptr_$dyn_memory_ptr","typeString":"string[]"},"typeName":{"baseType":{"id":288,"name":"string","nodeType":"ElementaryTypeName","src":"3331:6:0","typeDescriptions":{"typeIdentifier":"t_string_storage_ptr","typeString":"string"}},"id":289,"nodeType":"ArrayTypeName","src":"3331:8:0","typeDescriptions":{"typeIdentifier":"t_array$_t_string_storage_$dyn_storage_ptr","typeString":"string[]"}},"visibility":"internal"}],"id":296,"initialValue":{"arguments":[{"id":293,"name":"json","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":283,"src":"3371:4:0","typeDescriptions":{"typeIdentifier":"t_string_memory_ptr","typeString":"string memory"}},{"hexValue":"2e726f6f745f6b65795b305d","id":294,"isConstant":false,"isLValue":false,"isPure":true,"kind":"string","lValueRequested":false,"nodeType":"Literal","src":"3377:14:0","typeDescriptions":{"typeIdentifier":"t_stringliteral_d82f67100edb80050915e1ec4b565c9a8319a22efb1075e1298b7bb60101d266","typeString":"literal_string \".root_key[0]\""},"value":".root_key[0]"}],"expression":{"argumentTypes":[{"typeIdentifier":"t_string_memory_ptr","typeString":"string memory"},{"typeIdentifier":"t_stringliteral_d82f67100edb80050915e1ec4b565c9a8319a22efb1075e1298b7bb60101d266","typeString":"literal_string \".root_key[0]\""}],"expression":{"id":291,"name":"vm","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":213,"src":"3354:2:0","typeDescriptions":{"typeIdentifier":"t_contract$_Vm_$55","typeString":"contract Vm"}},"id":292,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"memberName":"parseJsonKeys","nodeType":"MemberAccess","referencedDeclaration":27,"src":"3354:16:0","typeDescriptions":{"typeIdentifier":"t_function_external_pure$_t_string_memory_ptr_$_t_string_memory_ptr_$returns$_t_array$_t_string_memory_ptr_$dyn_memory_ptr_$","typeString":"function (string memory,string memory) pure external returns (string memory[] memory)"}},"id":295,"isConstant":false,"isLValue":false,"isPure":false,"kind":"functionCall","lValueRequested":false,"names":[],"nodeType":"FunctionCall","src":"3354:38:0","tryCall":false,"typeDescriptions":{"typeIdentifier":"t_array$_t_string_memory_ptr_$dyn_memory_ptr","typeString":"string memory[] memory"}},"nodeType":"VariableDeclarationStatement","src":"3331:61:0"},{"expression":{"arguments":[{"hexValue":"6b657973","id":300,"isConstant":false,"isLValue":false,"isPure":true,"kind":"string","lValueRequested":false,"nodeType":"Literal","src":"3414:6:0","typeDescriptions":{"typeIdentifier":"t_stringliteral_f29790a80c4ce5f42f59892f424f9c92856c6b656c3378e2cf305b260c6f4195","typeString":"literal_string \"keys\""},"value":"keys"},{"baseExpression":{"id":301,"name":"keys","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":290,"src":"3422:4:0","typeDescriptions":{"typeIdentifier":"t_array$_t_string_memory_ptr_$dyn_memory_ptr","typeString":"string memory[] memory"}},"id":303,"indexExpression":{"hexValue":"30","id":302,"isConstant":false,"isLValue":false,"isPure":true,"kind":"number","lValueRequested":false,"nodeType":"Literal","src":"3427:1:0","typeDescriptions":{"typeIdentifier":"t_rational_0_by_1","typeString":"int_const 0"},"value":"0"},"isConstant":false,"isLValue":true,"isPure":false,"lValueRequested":false,"nodeType":"IndexAccess","src":"3422:7:0","typeDescriptions":{"typeIdentifier":"t_string_memory_ptr","typeString":"string memory"}},{"baseExpression":{"id":304,"name":"keys","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":290,"src":"3431:4:0","typeDescriptions":{"typeIdentifier":"t_array$_t_string_memory_ptr_$dyn_memory_ptr","typeString":"string memory[] memory"}},"id":306,"indexExpression":{"hexValue":"31","id":305,"isConstant":false,"isLValue":false,"isPure":true,"kind":"number","lValueRequested":false,"nodeType":"Literal","src":"3436:1:0","typeDescriptions":{"typeIdentifier":"t_rational_1_by_1","typeString":"int_const 1"},"value":"1"},"isConstant":false,"isLValue":true,"isPure":false,"lValueRequested":false,"nodeType":"IndexAccess","src":"3431:7:0","typeDescriptions":{"typeIdentifier":"t_string_memory_ptr","typeString":"string memory"}}],"expression":{"argumentTypes":[{"typeIdentifier":"t_stringliteral_f29790a80c4ce5f42f59892f424f9c92856c6b656c3378e2cf305b260c6f4195","typeString":"literal_string \"keys\""},{"typeIdentifier":"t_string_memory_ptr","typeString":"string memory"},{"typeIdentifier":"t_string_memory_ptr","typeString":"string memory"}],"expression":{"id":297,"name":"console","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":192,"src":"3402:7:0","typeDescriptions":{"typeIdentifier":"t_type$_t_contract$_console_$192_$","typeString":"type(library console)"}},"id":299,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"memberName":"log","nodeType":"MemberAccess","referencedDeclaration":191,"src":"3402:11:0","typeDescriptions":{"typeIdentifier":"t_function_internal_pure$_t_string_memory_ptr_$_t_string_memory_ptr_$_t_string_memory_ptr_$returns$__$","typeString":"function (string memory,string memory,string memory) pure"}},"id":307,"isConstant":false,"isLValue":false,"isPure":false,"kind":"functionCall","lValueRequested":false,"names":[],"nodeType":"FunctionCall","src":"3402:37:0","tryCall":false,"typeDescriptions":{"typeIdentifier":"t_tuple$__$","typeString":"tuple()"}},"id":308,"nodeType":"ExpressionStatement","src":"3402:37:0"},{"expression":{"arguments":[{"hexValue":"66726f6d206f726967696e616c","id":312,"isConstant":false,"isLValue":false,"isPure":true,"kind":"string","lValueRequested":false,"nodeType":"Literal","src":"3461:15:0","typeDescriptions":{"typeIdentifier":"t_stringliteral_77928970c8757d110f3c23e003246f49e0de890480ba9717ba659b2f56f316b2","typeString":"literal_string \"from original\""},"value":"from original"}],"expression":{"argumentTypes":[{"typeIdentifier":"t_stringliteral_77928970c8757d110f3c23e003246f49e0de890480ba9717ba659b2f56f316b2","typeString":"literal_string \"from original\""}],"expression":{"id":309,"name":"this","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":-28,"src":"3450:4:0","typeDescriptions":{"typeIdentifier":"t_contract$_ScriptExample_$706","typeString":"contract ScriptExample"}},"id":311,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"memberName":"hello","nodeType":"MemberAccess","referencedDeclaration":633,"src":"3450:10:0","typeDescriptions":{"typeIdentifier":"t_function_external_view$_t_string_memory_ptr_$returns$__$","typeString":"function (string memory) view external"}},"id":313,"isConstant":false,"isLValue":false,"isPure":false,"kind":"functionCall","lValueRequested":false,"names":[],"nodeType":"FunctionCall","src":"3450:27:0","tryCall":false,"typeDescriptions":{"typeIdentifier":"t_tuple$__$","typeString":"tuple()"}},"id":314,"nodeType":"ExpressionStatement","src":"3450:27:0"},{"expression":{"arguments":[{"arguments":[{"arguments":[{"hexValue":"30783432","id":322,"isConstant":false,"isLValue":false,"isPure":true,"kind":"number","lValueRequested":false,"nodeType":"Literal","src":"3517:4:0","typeDescriptions":{"typeIdentifier":"t_rational_66_by_1","typeString":"int_const 66"},"value":"0x42"}],"expression":{"argumentTypes":[{"typeIdentifier":"t_rational_66_by_1","typeString":"int_const 66"}],"id":321,"isConstant":false,"isLValue":false,"isPure":true,"lValueRequested":false,"nodeType":"ElementaryTypeNameExpression","src":"3509:7:0","typeDescriptions":{"typeIdentifier":"t_type$_t_uint160_$","typeString":"type(uint160)"},"typeName":{"id":320,"name":"uint160","nodeType":"ElementaryTypeName","src":"3509:7:0","typeDescriptions":{}}},"id":323,"isConstant":false,"isLValue":false,"isPure":true,"kind":"typeConversion","lValueRequested":false,"names":[],"nodeType":"FunctionCall","src":"3509:13:0","tryCall":false,"typeDescriptions":{"typeIdentifier":"t_uint160","typeString":"uint160"}}],"expression":{"argumentTypes":[{"typeIdentifier":"t_uint160","typeString":"uint160"}],"id":319,"isConstant":false,"isLValue":false,"isPure":true,"lValueRequested":false,"nodeType":"ElementaryTypeNameExpression","src":"3501:7:0","typeDescriptions":{"typeIdentifier":"t_type$_t_address_$","typeString":"type(address)"},"typeName":{"id":318,"name":"address","nodeType":"ElementaryTypeName","src":"3501:7:0","typeDescriptions":{}}},"id":324,"isConstant":false,"isLValue":false,"isPure":true,"kind":"typeConversion","lValueRequested":false,"names":[],"nodeType":"FunctionCall","src":"3501:22:0","tryCall":false,"typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"}}],"expression":{"argumentTypes":[{"typeIdentifier":"t_address","typeString":"address"}],"expression":{"id":315,"name":"vm","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":213,"src":"3487:2:0","typeDescriptions":{"typeIdentifier":"t_contract$_Vm_$55","typeString":"contract Vm"}},"id":317,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"memberName":"startPrank","nodeType":"MemberAccess","referencedDeclaration":32,"src":"3487:13:0","typeDescriptions":{"typeIdentifier":"t_function_external_nonpayable$_t_address_$returns$__$","typeString":"function (address) external"}},"id":325,"isConstant":false,"isLValue":false,"isPure":false,"kind":"functionCall","lValueRequested":false,"names":[],"nodeType":"FunctionCall","src":"3487:37:0","tryCall":false,"typeDescriptions":{"typeIdentifier":"t_tuple$__$","typeString":"tuple()"}},"id":326,"nodeType":"ExpressionStatement","src":"3487:37:0"},{"expression":{"arguments":[{"hexValue":"66726f6d207072616e6b2031","id":330,"isConstant":false,"isLValue":false,"isPure":true,"kind":"string","lValueRequested":false,"nodeType":"Literal","src":"3545:14:0","typeDescriptions":{"typeIdentifier":"t_stringliteral_42b34abfe37a8b0add910cda7b4a379e6538fa7a1dcafce47a02bd38f6c88e2a","typeString":"literal_string \"from prank 1\""},"value":"from prank 1"}],"expression":{"argumentTypes":[{"typeIdentifier":"t_stringliteral_42b34abfe37a8b0add910cda7b4a379e6538fa7a1dcafce47a02bd38f6c88e2a","typeString":"literal_string \"from prank 1\""}],"expression":{"id":327,"name":"this","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":-28,"src":"3534:4:0","typeDescriptions":{"typeIdentifier":"t_contract$_ScriptExample_$706","typeString":"contract ScriptExample"}},"id":329,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"memberName":"hello","nodeType":"MemberAccess","referencedDeclaration":633,"src":"3534:10:0","typeDescriptions":{"typeIdentifier":"t_function_external_view$_t_string_memory_ptr_$returns$__$","typeString":"function (string memory) view external"}},"id":331,"isConstant":false,"isLValue":false,"isPure":false,"kind":"functionCall","lValueRequested":false,"names":[],"nodeType":"FunctionCall","src":"3534:26:0","tryCall":false,"typeDescriptions":{"typeIdentifier":"t_tuple$__$","typeString":"tuple()"}},"id":332,"nodeType":"ExpressionStatement","src":"3534:26:0"},{"expression":{"arguments":[{"hexValue":"706172656e742073636f7065206d73672e73656e646572","id":336,"isConstant":false,"isLValue":false,"isPure":true,"kind":"string","lValueRequested":false,"nodeType":"Literal","src":"3582:25:0","typeDescriptions":{"typeIdentifier":"t_stringliteral_83ec9246154d8845de47aafc5c2865c9985d2efe84472c27283879f2fbf5cc94","typeString":"literal_string \"parent scope msg.sender\""},"value":"parent scope msg.sender"},{"arguments":[{"expression":{"id":339,"name":"msg","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":-15,"src":"3617:3:0","typeDescriptions":{"typeIdentifier":"t_magic_message","typeString":"msg"}},"id":340,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"memberName":"sender","nodeType":"MemberAccess","src":"3617:10:0","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"}}],"expression":{"argumentTypes":[{"typeIdentifier":"t_address","typeString":"address"}],"id":338,"isConstant":false,"isLValue":false,"isPure":true,"lValueRequested":false,"nodeType":"ElementaryTypeNameExpression","src":"3609:7:0","typeDescriptions":{"typeIdentifier":"t_type$_t_address_$","typeString":"type(address)"},"typeName":{"id":337,"name":"address","nodeType":"ElementaryTypeName","src":"3609:7:0","typeDescriptions":{}}},"id":341,"isConstant":false,"isLValue":false,"isPure":false,"kind":"typeConversion","lValueRequested":false,"names":[],"nodeType":"FunctionCall","src":"3609:19:0","tryCall":false,"typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"}}],"expression":{"argumentTypes":[{"typeIdentifier":"t_stringliteral_83ec9246154d8845de47aafc5c2865c9985d2efe84472c27283879f2fbf5cc94","typeString":"literal_string \"parent scope msg.sender\""},{"typeIdentifier":"t_address","typeString":"address"}],"expression":{"id":333,"name":"console","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":192,"src":"3570:7:0","typeDescriptions":{"typeIdentifier":"t_type$_t_contract$_console_$192_$","typeString":"type(library console)"}},"id":335,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"memberName":"log","nodeType":"MemberAccess","referencedDeclaration":171,"src":"3570:11:0","typeDescriptions":{"typeIdentifier":"t_function_internal_pure$_t_string_memory_ptr_$_t_address_$returns$__$","typeString":"function (string memory,address) pure"}},"id":342,"isConstant":false,"isLValue":false,"isPure":false,"kind":"functionCall","lValueRequested":false,"names":[],"nodeType":"FunctionCall","src":"3570:59:0","tryCall":false,"typeDescriptions":{"typeIdentifier":"t_tuple$__$","typeString":"tuple()"}},"id":343,"nodeType":"ExpressionStatement","src":"3570:59:0"},{"expression":{"arguments":[{"hexValue":"706172656e742073636f706520636f6e74726163742e61646472","id":347,"isConstant":false,"isLValue":false,"isPure":true,"kind":"string","lValueRequested":false,"nodeType":"Literal","src":"3651:28:0","typeDescriptions":{"typeIdentifier":"t_stringliteral_97df66250e0b2b48f0ec8d0e01eb1b8ca012d95f1572895622aa1ea433e5570f","typeString":"literal_string \"parent scope contract.addr\""},"value":"parent scope contract.addr"},{"arguments":[{"id":350,"name":"this","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":-28,"src":"3689:4:0","typeDescriptions":{"typeIdentifier":"t_contract$_ScriptExample_$706","typeString":"contract ScriptExample"}}],"expression":{"argumentTypes":[{"typeIdentifier":"t_contract$_ScriptExample_$706","typeString":"contract ScriptExample"}],"id":349,"isConstant":false,"isLValue":false,"isPure":true,"lValueRequested":false,"nodeType":"ElementaryTypeNameExpression","src":"3681:7:0","typeDescriptions":{"typeIdentifier":"t_type$_t_address_$","typeString":"type(address)"},"typeName":{"id":348,"name":"address","nodeType":"ElementaryTypeName","src":"3681:7:0","typeDescriptions":{}}},"id":351,"isConstant":false,"isLValue":false,"isPure":false,"kind":"typeConversion","lValueRequested":false,"names":[],"nodeType":"FunctionCall","src":"3681:13:0","tryCall":false,"typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"}}],"expression":{"argumentTypes":[{"typeIdentifier":"t_stringliteral_97df66250e0b2b48f0ec8d0e01eb1b8ca012d95f1572895622aa1ea433e5570f","typeString":"literal_string \"parent scope contract.addr\""},{"typeIdentifier":"t_address","typeString":"address"}],"expression":{"id":344,"name":"console","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":192,"src":"3639:7:0","typeDescriptions":{"typeIdentifier":"t_type$_t_contract$_console_$192_$","typeString":"type(library console)"}},"id":346,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"memberName":"log","nodeType":"MemberAccess","referencedDeclaration":171,"src":"3639:11:0","typeDescriptions":{"typeIdentifier":"t_function_internal_pure$_t_string_memory_ptr_$_t_address_$returns$__$","typeString":"function (string memory,address) pure"}},"id":352,"isConstant":false,"isLValue":false,"isPure":false,"kind":"functionCall","lValueRequested":false,"names":[],"nodeType":"FunctionCall","src":"3639:56:0","tryCall":false,"typeDescriptions":{"typeIdentifier":"t_tuple$__$","typeString":"tuple()"}},"id":353,"nodeType":"ExpressionStatement","src":"3639:56:0"},{"expression":{"arguments":[{"hexValue":"66726f6d207072616e6b2032","id":357,"isConstant":false,"isLValue":false,"isPure":true,"kind":"string","lValueRequested":false,"nodeType":"Literal","src":"3716:14:0","typeDescriptions":{"typeIdentifier":"t_stringliteral_a38a34f8cad750a79aa097a92971f8f405b51ee9d53d25c5b14fc129ba3684bb","typeString":"literal_string \"from prank 2\""},"value":"from prank 2"}],"expression":{"argumentTypes":[{"typeIdentifier":"t_stringliteral_a38a34f8cad750a79aa097a92971f8f405b51ee9d53d25c5b14fc129ba3684bb","typeString":"literal_string \"from prank 2\""}],"expression":{"id":354,"name":"this","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":-28,"src":"3705:4:0","typeDescriptions":{"typeIdentifier":"t_contract$_ScriptExample_$706","typeString":"contract ScriptExample"}},"id":356,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"memberName":"hello","nodeType":"MemberAccess","referencedDeclaration":633,"src":"3705:10:0","typeDescriptions":{"typeIdentifier":"t_function_external_view$_t_string_memory_ptr_$returns$__$","typeString":"function (string memory) view external"}},"id":358,"isConstant":false,"isLValue":false,"isPure":false,"kind":"functionCall","lValueRequested":false,"names":[],"nodeType":"FunctionCall","src":"3705:26:0","tryCall":false,"typeDescriptions":{"typeIdentifier":"t_tuple$__$","typeString":"tuple()"}},"id":359,"nodeType":"ExpressionStatement","src":"3705:26:0"},{"expression":{"arguments":[],"expression":{"argumentTypes":[],"expression":{"id":360,"name":"vm","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":213,"src":"3741:2:0","typeDescriptions":{"typeIdentifier":"t_contract$_Vm_$55","typeString":"contract Vm"}},"id":362,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"memberName":"stopPrank","nodeType":"MemberAccess","referencedDeclaration":35,"src":"3741:12:0","typeDescriptions":{"typeIdentifier":"t_function_external_nonpayable$__$returns$__$","typeString":"function () external"}},"id":363,"isConstant":false,"isLValue":false,"isPure":false,"kind":"functionCall","lValueRequested":false,"names":[],"nodeType":"FunctionCall","src":"3741:14:0","tryCall":false,"typeDescriptions":{"typeIdentifier":"t_tuple$__$","typeString":"tuple()"}},"id":364,"nodeType":"ExpressionStatement","src":"3741:14:0"},{"expression":{"arguments":[{"hexValue":"66726f6d206f726967696e616c20616761696e","id":368,"isConstant":false,"isLValue":false,"isPure":true,"kind":"string","lValueRequested":false,"nodeType":"Literal","src":"3776:21:0","typeDescriptions":{"typeIdentifier":"t_stringliteral_0c805c6579e20a9c4c8e11aeab23330910a9f2da629191dc119d1730e8ed6860","typeString":"literal_string \"from original again\""},"value":"from original again"}],"expression":{"argumentTypes":[{"typeIdentifier":"t_stringliteral_0c805c6579e20a9c4c8e11aeab23330910a9f2da629191dc119d1730e8ed6860","typeString":"literal_string \"from original again\""}],"expression":{"id":365,"name":"this","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":-28,"src":"3765:4:0","typeDescriptions":{"typeIdentifier":"t_contract$_ScriptExample_$706","typeString":"contract ScriptExample"}},"id":367,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"memberName":"hello","nodeType":"MemberAccess","referencedDeclaration":633,"src":"3765:10:0","typeDescriptions":{"typeIdentifier":"t_function_external_view$_t_string_memory_ptr_$returns$__$","typeString":"function (string memory) view external"}},"id":369,"isConstant":false,"isLValue":false,"isPure":false,"kind":"functionCall","lValueRequested":false,"names":[],"nodeType":"FunctionCall","src":"3765:33:0","tryCall":false,"typeDescriptions":{"typeIdentifier":"t_tuple$__$","typeString":"tuple()"}},"id":370,"nodeType":"ExpressionStatement","src":"3765:33:0"},{"expression":{"arguments":[{"hexValue":"646f6e6521","id":374,"isConstant":false,"isLValue":false,"isPure":true,"kind":"string","lValueRequested":false,"nodeType":"Literal","src":"3821:7:0","typeDescriptions":{"typeIdentifier":"t_stringliteral_080382d5c9e9e7c5e3d1d33f5e7422740375955180fadff167d8130e0c35f3fc","typeString":"literal_string \"done!\""},"value":"done!"}],"expression":{"argumentTypes":[{"typeIdentifier":"t_stringliteral_080382d5c9e9e7c5e3d1d33f5e7422740375955180fadff167d8130e0c35f3fc","typeString":"literal_string \"done!\""}],"expression":{"id":371,"name":"console","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":192,"src":"3809:7:0","typeDescriptions":{"typeIdentifier":"t_type$_t_contract$_console_$192_$","typeString":"type(library console)"}},"id":373,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"memberName":"log","nodeType":"MemberAccess","referencedDeclaration":120,"src":"3809:11:0","typeDescriptions":{"typeIdentifier":"t_function_internal_pure$_t_string_memory_ptr_$returns$__$","typeString":"function (string memory) pure"}},"id":375,"isConstant":false,"isLValue":false,"isPure":false,"kind":"functionCall","lValueRequested":false,"names":[],"nodeType":"FunctionCall","src":"3809:20:0","tryCall":false,"typeDescriptions":{"typeIdentifier":"t_tuple$__$","typeString":"tuple()"}},"id":376,"nodeType":"ExpressionStatement","src":"3809:20:0"}]},"documentation":{"id":216,"nodeType":"StructuredDocumentation","src":"2804:78:0","text":"@notice example function, runs through basic cheat-codes and console logs."},"functionSelector":"c0406226","implemented":true,"kind":"function","modifiers":[],"name":"run","nameLocation":"2896:3:0","parameters":{"id":217,"nodeType":"ParameterList","parameters":[],"src":"2899:2:0"},"returnParameters":{"id":218,"nodeType":"ParameterList","parameters":[],"src":"2909:0:0"},"scope":706,"stateMutability":"nonpayable","virtual":false,"visibility":"public"},{"id":609,"nodeType":"FunctionDefinition","src":"3903:1258:0","nodes":[],"body":{"id":608,"nodeType":"Block","src":"3934:1227:0","nodes":[],"statements":[{"expression":{"arguments":[{"hexValue":"6e6f6e6365207374617274","id":385,"isConstant":false,"isLValue":false,"isPure":true,"kind":"string","lValueRequested":false,"nodeType":"Literal","src":"3956:13:0","typeDescriptions":{"typeIdentifier":"t_stringliteral_71efc69b9a13b6bc1e9a14d766ff01c79022262c6daa6532fb5dfb14f8511a20","typeString":"literal_string \"nonce start\""},"value":"nonce start"},{"arguments":[{"arguments":[{"arguments":[{"id":392,"name":"this","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":-28,"src":"3999:4:0","typeDescriptions":{"typeIdentifier":"t_contract$_ScriptExample_$706","typeString":"contract ScriptExample"}}],"expression":{"argumentTypes":[{"typeIdentifier":"t_contract$_ScriptExample_$706","typeString":"contract ScriptExample"}],"id":391,"isConstant":false,"isLValue":false,"isPure":true,"lValueRequested":false,"nodeType":"ElementaryTypeNameExpression","src":"3991:7:0","typeDescriptions":{"typeIdentifier":"t_type$_t_address_$","typeString":"type(address)"},"typeName":{"id":390,"name":"address","nodeType":"ElementaryTypeName","src":"3991:7:0","typeDescriptions":{}}},"id":393,"isConstant":false,"isLValue":false,"isPure":false,"kind":"typeConversion","lValueRequested":false,"names":[],"nodeType":"FunctionCall","src":"3991:13:0","tryCall":false,"typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"}}],"expression":{"argumentTypes":[{"typeIdentifier":"t_address","typeString":"address"}],"expression":{"id":388,"name":"vm","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":213,"src":"3979:2:0","typeDescriptions":{"typeIdentifier":"t_contract$_Vm_$55","typeString":"contract Vm"}},"id":389,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"memberName":"getNonce","nodeType":"MemberAccess","referencedDeclaration":17,"src":"3979:11:0","typeDescriptions":{"typeIdentifier":"t_function_external_view$_t_address_$returns$_t_uint64_$","typeString":"function (address) view external returns (uint64)"}},"id":394,"isConstant":false,"isLValue":false,"isPure":false,"kind":"functionCall","lValueRequested":false,"names":[],"nodeType":"FunctionCall","src":"3979:26:0","tryCall":false,"typeDescriptions":{"typeIdentifier":"t_uint64","typeString":"uint64"}}],"expression":{"argumentTypes":[{"typeIdentifier":"t_uint64","typeString":"uint64"}],"id":387,"isConstant":false,"isLValue":false,"isPure":true,"lValueRequested":false,"nodeType":"ElementaryTypeNameExpression","src":"3971:7:0","typeDescriptions":{"typeIdentifier":"t_type$_t_uint256_$","typeString":"type(uint256)"},"typeName":{"id":386,"name":"uint256","nodeType":"ElementaryTypeName","src":"3971:7:0","typeDescriptions":{}}},"id":395,"isConstant":false,"isLValue":false,"isPure":false,"kind":"typeConversion","lValueRequested":false,"names":[],"nodeType":"FunctionCall","src":"3971:35:0","tryCall":false,"typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}}],"expression":{"argumentTypes":[{"typeIdentifier":"t_stringliteral_71efc69b9a13b6bc1e9a14d766ff01c79022262c6daa6532fb5dfb14f8511a20","typeString":"literal_string \"nonce start\""},{"typeIdentifier":"t_uint256","typeString":"uint256"}],"expression":{"id":382,"name":"console","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":192,"src":"3944:7:0","typeDescriptions":{"typeIdentifier":"t_type$_t_contract$_console_$192_$","typeString":"type(library console)"}},"id":384,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"memberName":"log","nodeType":"MemberAccess","referencedDeclaration":154,"src":"3944:11:0","typeDescriptions":{"typeIdentifier":"t_function_internal_pure$_t_string_memory_ptr_$_t_uint256_$returns$__$","typeString":"function (string memory,uint256) pure"}},"id":396,"isConstant":false,"isLValue":false,"isPure":false,"kind":"functionCall","lValueRequested":false,"names":[],"nodeType":"FunctionCall","src":"3944:63:0","tryCall":false,"typeDescriptions":{"typeIdentifier":"t_tuple$__$","typeString":"tuple()"}},"id":397,"nodeType":"ExpressionStatement","src":"3944:63:0"},{"expression":{"arguments":[{"hexValue":"74657374696e672073696e676c65","id":401,"isConstant":false,"isLValue":false,"isPure":true,"kind":"string","lValueRequested":false,"nodeType":"Literal","src":"4030:16:0","typeDescriptions":{"typeIdentifier":"t_stringliteral_b75103528423218e7569082dad569ed0d2ce7c0ac770c0812b220e2d369fe474","typeString":"literal_string \"testing single\""},"value":"testing single"}],"expression":{"argumentTypes":[{"typeIdentifier":"t_stringliteral_b75103528423218e7569082dad569ed0d2ce7c0ac770c0812b220e2d369fe474","typeString":"literal_string \"testing single\""}],"expression":{"id":398,"name":"console","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":192,"src":"4018:7:0","typeDescriptions":{"typeIdentifier":"t_type$_t_contract$_console_$192_$","typeString":"type(library console)"}},"id":400,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"memberName":"log","nodeType":"MemberAccess","referencedDeclaration":120,"src":"4018:11:0","typeDescriptions":{"typeIdentifier":"t_function_internal_pure$_t_string_memory_ptr_$returns$__$","typeString":"function (string memory) pure"}},"id":402,"isConstant":false,"isLValue":false,"isPure":false,"kind":"functionCall","lValueRequested":false,"names":[],"nodeType":"FunctionCall","src":"4018:29:0","tryCall":false,"typeDescriptions":{"typeIdentifier":"t_tuple$__$","typeString":"tuple()"}},"id":403,"nodeType":"ExpressionStatement","src":"4018:29:0"},{"expression":{"arguments":[],"expression":{"argumentTypes":[],"expression":{"id":404,"name":"vm","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":213,"src":"4057:2:0","typeDescriptions":{"typeIdentifier":"t_contract$_Vm_$55","typeString":"contract Vm"}},"id":406,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"memberName":"broadcast","nodeType":"MemberAccess","referencedDeclaration":38,"src":"4057:12:0","typeDescriptions":{"typeIdentifier":"t_function_external_nonpayable$__$returns$__$","typeString":"function () external"}},"id":407,"isConstant":false,"isLValue":false,"isPure":false,"kind":"functionCall","lValueRequested":false,"names":[],"nodeType":"FunctionCall","src":"4057:14:0","tryCall":false,"typeDescriptions":{"typeIdentifier":"t_tuple$__$","typeString":"tuple()"}},"id":408,"nodeType":"ExpressionStatement","src":"4057:14:0"},{"expression":{"arguments":[{"hexValue":"73696e676c655f63616c6c31","id":412,"isConstant":false,"isLValue":false,"isPure":true,"kind":"string","lValueRequested":false,"nodeType":"Literal","src":"4092:14:0","typeDescriptions":{"typeIdentifier":"t_stringliteral_5e1cad6d7a968cfacf2731373e1248ffb11f4886bced66a02a6de1a67ac8f777","typeString":"literal_string \"single_call1\""},"value":"single_call1"}],"expression":{"argumentTypes":[{"typeIdentifier":"t_stringliteral_5e1cad6d7a968cfacf2731373e1248ffb11f4886bced66a02a6de1a67ac8f777","typeString":"literal_string \"single_call1\""}],"expression":{"id":409,"name":"this","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":-28,"src":"4081:4:0","typeDescriptions":{"typeIdentifier":"t_contract$_ScriptExample_$706","typeString":"contract ScriptExample"}},"id":411,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"memberName":"call1","nodeType":"MemberAccess","referencedDeclaration":648,"src":"4081:10:0","typeDescriptions":{"typeIdentifier":"t_function_external_nonpayable$_t_string_memory_ptr_$returns$__$","typeString":"function (string memory) external"}},"id":413,"isConstant":false,"isLValue":false,"isPure":false,"kind":"functionCall","lValueRequested":false,"names":[],"nodeType":"FunctionCall","src":"4081:26:0","tryCall":false,"typeDescriptions":{"typeIdentifier":"t_tuple$__$","typeString":"tuple()"}},"id":414,"nodeType":"ExpressionStatement","src":"4081:26:0"},{"expression":{"arguments":[{"hexValue":"73696e676c655f63616c6c32","id":418,"isConstant":false,"isLValue":false,"isPure":true,"kind":"string","lValueRequested":false,"nodeType":"Literal","src":"4128:14:0","typeDescriptions":{"typeIdentifier":"t_stringliteral_b37ddaf5d00ad9e6371de3fb71b91eef731fae1e86b768666380f7d44e1ada25","typeString":"literal_string \"single_call2\""},"value":"single_call2"}],"expression":{"argumentTypes":[{"typeIdentifier":"t_stringliteral_b37ddaf5d00ad9e6371de3fb71b91eef731fae1e86b768666380f7d44e1ada25","typeString":"literal_string \"single_call2\""}],"expression":{"id":415,"name":"this","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":-28,"src":"4117:4:0","typeDescriptions":{"typeIdentifier":"t_contract$_ScriptExample_$706","typeString":"contract ScriptExample"}},"id":417,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"memberName":"call2","nodeType":"MemberAccess","referencedDeclaration":663,"src":"4117:10:0","typeDescriptions":{"typeIdentifier":"t_function_external_nonpayable$_t_string_memory_ptr_$returns$__$","typeString":"function (string memory) external"}},"id":419,"isConstant":false,"isLValue":false,"isPure":false,"kind":"functionCall","lValueRequested":false,"names":[],"nodeType":"FunctionCall","src":"4117:26:0","tryCall":false,"typeDescriptions":{"typeIdentifier":"t_tuple$__$","typeString":"tuple()"}},"id":420,"nodeType":"ExpressionStatement","src":"4117:26:0"},{"expression":{"arguments":[{"hexValue":"74657374696e672073746172742f73746f70","id":424,"isConstant":false,"isLValue":false,"isPure":true,"kind":"string","lValueRequested":false,"nodeType":"Literal","src":"4166:20:0","typeDescriptions":{"typeIdentifier":"t_stringliteral_778e886e3a1c3c5096aca76228832105f3f9269f362effd0e8ce3737787cb784","typeString":"literal_string \"testing start/stop\""},"value":"testing start/stop"}],"expression":{"argumentTypes":[{"typeIdentifier":"t_stringliteral_778e886e3a1c3c5096aca76228832105f3f9269f362effd0e8ce3737787cb784","typeString":"literal_string \"testing start/stop\""}],"expression":{"id":421,"name":"console","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":192,"src":"4154:7:0","typeDescriptions":{"typeIdentifier":"t_type$_t_contract$_console_$192_$","typeString":"type(library console)"}},"id":423,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"memberName":"log","nodeType":"MemberAccess","referencedDeclaration":120,"src":"4154:11:0","typeDescriptions":{"typeIdentifier":"t_function_internal_pure$_t_string_memory_ptr_$returns$__$","typeString":"function (string memory) pure"}},"id":425,"isConstant":false,"isLValue":false,"isPure":false,"kind":"functionCall","lValueRequested":false,"names":[],"nodeType":"FunctionCall","src":"4154:33:0","tryCall":false,"typeDescriptions":{"typeIdentifier":"t_tuple$__$","typeString":"tuple()"}},"id":426,"nodeType":"ExpressionStatement","src":"4154:33:0"},{"expression":{"arguments":[{"arguments":[{"arguments":[{"hexValue":"3078633066666565","id":434,"isConstant":false,"isLValue":false,"isPure":true,"kind":"number","lValueRequested":false,"nodeType":"Literal","src":"4231:8:0","typeDescriptions":{"typeIdentifier":"t_rational_12648430_by_1","typeString":"int_const 12648430"},"value":"0xc0ffee"}],"expression":{"argumentTypes":[{"typeIdentifier":"t_rational_12648430_by_1","typeString":"int_const 12648430"}],"id":433,"isConstant":false,"isLValue":false,"isPure":true,"lValueRequested":false,"nodeType":"ElementaryTypeNameExpression","src":"4223:7:0","typeDescriptions":{"typeIdentifier":"t_type$_t_uint160_$","typeString":"type(uint160)"},"typeName":{"id":432,"name":"uint160","nodeType":"ElementaryTypeName","src":"4223:7:0","typeDescriptions":{}}},"id":435,"isConstant":false,"isLValue":false,"isPure":true,"kind":"typeConversion","lValueRequested":false,"names":[],"nodeType":"FunctionCall","src":"4223:17:0","tryCall":false,"typeDescriptions":{"typeIdentifier":"t_uint160","typeString":"uint160"}}],"expression":{"argumentTypes":[{"typeIdentifier":"t_uint160","typeString":"uint160"}],"id":431,"isConstant":false,"isLValue":false,"isPure":true,"lValueRequested":false,"nodeType":"ElementaryTypeNameExpression","src":"4215:7:0","typeDescriptions":{"typeIdentifier":"t_type$_t_address_$","typeString":"type(address)"},"typeName":{"id":430,"name":"address","nodeType":"ElementaryTypeName","src":"4215:7:0","typeDescriptions":{}}},"id":436,"isConstant":false,"isLValue":false,"isPure":true,"kind":"typeConversion","lValueRequested":false,"names":[],"nodeType":"FunctionCall","src":"4215:26:0","tryCall":false,"typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"}}],"expression":{"argumentTypes":[{"typeIdentifier":"t_address","typeString":"address"}],"expression":{"id":427,"name":"vm","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":213,"src":"4197:2:0","typeDescriptions":{"typeIdentifier":"t_contract$_Vm_$55","typeString":"contract Vm"}},"id":429,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"memberName":"startBroadcast","nodeType":"MemberAccess","referencedDeclaration":48,"src":"4197:17:0","typeDescriptions":{"typeIdentifier":"t_function_external_nonpayable$_t_address_$returns$__$","typeString":"function (address) external"}},"id":437,"isConstant":false,"isLValue":false,"isPure":false,"kind":"functionCall","lValueRequested":false,"names":[],"nodeType":"FunctionCall","src":"4197:45:0","tryCall":false,"typeDescriptions":{"typeIdentifier":"t_tuple$__$","typeString":"tuple()"}},"id":438,"nodeType":"ExpressionStatement","src":"4197:45:0"},{"expression":{"arguments":[{"hexValue":"737461727473746f705f63616c6c31","id":442,"isConstant":false,"isLValue":false,"isPure":true,"kind":"string","lValueRequested":false,"nodeType":"Literal","src":"4263:17:0","typeDescriptions":{"typeIdentifier":"t_stringliteral_2fc2682edf10ed478ee3b9a190f6b1c88bb492b300935ce44545a1613cf8f041","typeString":"literal_string \"startstop_call1\""},"value":"startstop_call1"}],"expression":{"argumentTypes":[{"typeIdentifier":"t_stringliteral_2fc2682edf10ed478ee3b9a190f6b1c88bb492b300935ce44545a1613cf8f041","typeString":"literal_string \"startstop_call1\""}],"expression":{"id":439,"name":"this","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":-28,"src":"4252:4:0","typeDescriptions":{"typeIdentifier":"t_contract$_ScriptExample_$706","typeString":"contract ScriptExample"}},"id":441,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"memberName":"call1","nodeType":"MemberAccess","referencedDeclaration":648,"src":"4252:10:0","typeDescriptions":{"typeIdentifier":"t_function_external_nonpayable$_t_string_memory_ptr_$returns$__$","typeString":"function (string memory) external"}},"id":443,"isConstant":false,"isLValue":false,"isPure":false,"kind":"functionCall","lValueRequested":false,"names":[],"nodeType":"FunctionCall","src":"4252:29:0","tryCall":false,"typeDescriptions":{"typeIdentifier":"t_tuple$__$","typeString":"tuple()"}},"id":444,"nodeType":"ExpressionStatement","src":"4252:29:0"},{"expression":{"arguments":[{"hexValue":"737461727473746f705f63616c6c32","id":448,"isConstant":false,"isLValue":false,"isPure":true,"kind":"string","lValueRequested":false,"nodeType":"Literal","src":"4302:17:0","typeDescriptions":{"typeIdentifier":"t_stringliteral_1a6fd77f04b28bf45d6d0e2dd4c65c0bbfeba174f849e43bb67ebca1c019cda4","typeString":"literal_string \"startstop_call2\""},"value":"startstop_call2"}],"expression":{"argumentTypes":[{"typeIdentifier":"t_stringliteral_1a6fd77f04b28bf45d6d0e2dd4c65c0bbfeba174f849e43bb67ebca1c019cda4","typeString":"literal_string \"startstop_call2\""}],"expression":{"id":445,"name":"this","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":-28,"src":"4291:4:0","typeDescriptions":{"typeIdentifier":"t_contract$_ScriptExample_$706","typeString":"contract ScriptExample"}},"id":447,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"memberName":"call2","nodeType":"MemberAccess","referencedDeclaration":663,"src":"4291:10:0","typeDescriptions":{"typeIdentifier":"t_function_external_nonpayable$_t_string_memory_ptr_$returns$__$","typeString":"function (string memory) external"}},"id":449,"isConstant":false,"isLValue":false,"isPure":false,"kind":"functionCall","lValueRequested":false,"names":[],"nodeType":"FunctionCall","src":"4291:29:0","tryCall":false,"typeDescriptions":{"typeIdentifier":"t_tuple$__$","typeString":"tuple()"}},"id":450,"nodeType":"ExpressionStatement","src":"4291:29:0"},{"expression":{"arguments":[{"hexValue":"737461727473746f705f70757265","id":454,"isConstant":false,"isLValue":false,"isPure":true,"kind":"string","lValueRequested":false,"nodeType":"Literal","src":"4344:16:0","typeDescriptions":{"typeIdentifier":"t_stringliteral_b6e9eb1efd186b1d92b54da45026aa97a178e6eaffdf9dbf9f666fc751fb0ff9","typeString":"literal_string \"startstop_pure\""},"value":"startstop_pure"}],"expression":{"argumentTypes":[{"typeIdentifier":"t_stringliteral_b6e9eb1efd186b1d92b54da45026aa97a178e6eaffdf9dbf9f666fc751fb0ff9","typeString":"literal_string \"startstop_pure\""}],"expression":{"id":451,"name":"this","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":-28,"src":"4330:4:0","typeDescriptions":{"typeIdentifier":"t_contract$_ScriptExample_$706","typeString":"contract ScriptExample"}},"id":453,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"memberName":"callPure","nodeType":"MemberAccess","referencedDeclaration":705,"src":"4330:13:0","typeDescriptions":{"typeIdentifier":"t_function_external_pure$_t_string_memory_ptr_$returns$__$","typeString":"function (string memory) pure external"}},"id":455,"isConstant":false,"isLValue":false,"isPure":false,"kind":"functionCall","lValueRequested":false,"names":[],"nodeType":"FunctionCall","src":"4330:31:0","tryCall":false,"typeDescriptions":{"typeIdentifier":"t_tuple$__$","typeString":"tuple()"}},"id":456,"nodeType":"ExpressionStatement","src":"4330:31:0"},{"expression":{"arguments":[],"expression":{"argumentTypes":[],"expression":{"id":457,"name":"vm","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":213,"src":"4371:2:0","typeDescriptions":{"typeIdentifier":"t_contract$_Vm_$55","typeString":"contract Vm"}},"id":459,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"memberName":"stopBroadcast","nodeType":"MemberAccess","referencedDeclaration":54,"src":"4371:16:0","typeDescriptions":{"typeIdentifier":"t_function_external_nonpayable$__$returns$__$","typeString":"function () external"}},"id":460,"isConstant":false,"isLValue":false,"isPure":false,"kind":"functionCall","lValueRequested":false,"names":[],"nodeType":"FunctionCall","src":"4371:18:0","tryCall":false,"typeDescriptions":{"typeIdentifier":"t_tuple$__$","typeString":"tuple()"}},"id":461,"nodeType":"ExpressionStatement","src":"4371:18:0"},{"expression":{"arguments":[{"hexValue":"737461727473746f705f63616c6c33","id":465,"isConstant":false,"isLValue":false,"isPure":true,"kind":"string","lValueRequested":false,"nodeType":"Literal","src":"4410:17:0","typeDescriptions":{"typeIdentifier":"t_stringliteral_8eb502bfdc4adda22bd960aa2ae13ce4c0ed8cc3b3791ed65e321a38cdd36f72","typeString":"literal_string \"startstop_call3\""},"value":"startstop_call3"}],"expression":{"argumentTypes":[{"typeIdentifier":"t_stringliteral_8eb502bfdc4adda22bd960aa2ae13ce4c0ed8cc3b3791ed65e321a38cdd36f72","typeString":"literal_string \"startstop_call3\""}],"expression":{"id":462,"name":"this","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":-28,"src":"4399:4:0","typeDescriptions":{"typeIdentifier":"t_contract$_ScriptExample_$706","typeString":"contract ScriptExample"}},"id":464,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"memberName":"call1","nodeType":"MemberAccess","referencedDeclaration":648,"src":"4399:10:0","typeDescriptions":{"typeIdentifier":"t_function_external_nonpayable$_t_string_memory_ptr_$returns$__$","typeString":"function (string memory) external"}},"id":466,"isConstant":false,"isLValue":false,"isPure":false,"kind":"functionCall","lValueRequested":false,"names":[],"nodeType":"FunctionCall","src":"4399:29:0","tryCall":false,"typeDescriptions":{"typeIdentifier":"t_tuple$__$","typeString":"tuple()"}},"id":467,"nodeType":"ExpressionStatement","src":"4399:29:0"},{"expression":{"arguments":[{"hexValue":"74657374696e67206e6573746564","id":471,"isConstant":false,"isLValue":false,"isPure":true,"kind":"string","lValueRequested":false,"nodeType":"Literal","src":"4451:16:0","typeDescriptions":{"typeIdentifier":"t_stringliteral_f92f19f7a5b5b9ce341188bf4e15925f184cdb5ac135c4846ced718f259dbde5","typeString":"literal_string \"testing nested\""},"value":"testing nested"}],"expression":{"argumentTypes":[{"typeIdentifier":"t_stringliteral_f92f19f7a5b5b9ce341188bf4e15925f184cdb5ac135c4846ced718f259dbde5","typeString":"literal_string \"testing nested\""}],"expression":{"id":468,"name":"console","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":192,"src":"4439:7:0","typeDescriptions":{"typeIdentifier":"t_type$_t_contract$_console_$192_$","typeString":"type(library console)"}},"id":470,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"memberName":"log","nodeType":"MemberAccess","referencedDeclaration":120,"src":"4439:11:0","typeDescriptions":{"typeIdentifier":"t_function_internal_pure$_t_string_memory_ptr_$returns$__$","typeString":"function (string memory) pure"}},"id":472,"isConstant":false,"isLValue":false,"isPure":false,"kind":"functionCall","lValueRequested":false,"names":[],"nodeType":"FunctionCall","src":"4439:29:0","tryCall":false,"typeDescriptions":{"typeIdentifier":"t_tuple$__$","typeString":"tuple()"}},"id":473,"nodeType":"ExpressionStatement","src":"4439:29:0"},{"expression":{"arguments":[{"arguments":[{"arguments":[{"hexValue":"307831323334","id":481,"isConstant":false,"isLValue":false,"isPure":true,"kind":"number","lValueRequested":false,"nodeType":"Literal","src":"4512:6:0","typeDescriptions":{"typeIdentifier":"t_rational_4660_by_1","typeString":"int_const 4660"},"value":"0x1234"}],"expression":{"argumentTypes":[{"typeIdentifier":"t_rational_4660_by_1","typeString":"int_const 4660"}],"id":480,"isConstant":false,"isLValue":false,"isPure":true,"lValueRequested":false,"nodeType":"ElementaryTypeNameExpression","src":"4504:7:0","typeDescriptions":{"typeIdentifier":"t_type$_t_uint160_$","typeString":"type(uint160)"},"typeName":{"id":479,"name":"uint160","nodeType":"ElementaryTypeName","src":"4504:7:0","typeDescriptions":{}}},"id":482,"isConstant":false,"isLValue":false,"isPure":true,"kind":"typeConversion","lValueRequested":false,"names":[],"nodeType":"FunctionCall","src":"4504:15:0","tryCall":false,"typeDescriptions":{"typeIdentifier":"t_uint160","typeString":"uint160"}}],"expression":{"argumentTypes":[{"typeIdentifier":"t_uint160","typeString":"uint160"}],"id":478,"isConstant":false,"isLValue":false,"isPure":true,"lValueRequested":false,"nodeType":"ElementaryTypeNameExpression","src":"4496:7:0","typeDescriptions":{"typeIdentifier":"t_type$_t_address_$","typeString":"type(address)"},"typeName":{"id":477,"name":"address","nodeType":"ElementaryTypeName","src":"4496:7:0","typeDescriptions":{}}},"id":483,"isConstant":false,"isLValue":false,"isPure":true,"kind":"typeConversion","lValueRequested":false,"names":[],"nodeType":"FunctionCall","src":"4496:24:0","tryCall":false,"typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"}}],"expression":{"argumentTypes":[{"typeIdentifier":"t_address","typeString":"address"}],"expression":{"id":474,"name":"vm","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":213,"src":"4478:2:0","typeDescriptions":{"typeIdentifier":"t_contract$_Vm_$55","typeString":"contract Vm"}},"id":476,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"memberName":"startBroadcast","nodeType":"MemberAccess","referencedDeclaration":48,"src":"4478:17:0","typeDescriptions":{"typeIdentifier":"t_function_external_nonpayable$_t_address_$returns$__$","typeString":"function (address) external"}},"id":484,"isConstant":false,"isLValue":false,"isPure":false,"kind":"functionCall","lValueRequested":false,"names":[],"nodeType":"FunctionCall","src":"4478:43:0","tryCall":false,"typeDescriptions":{"typeIdentifier":"t_tuple$__$","typeString":"tuple()"}},"id":485,"nodeType":"ExpressionStatement","src":"4478:43:0"},{"expression":{"arguments":[{"hexValue":"6e6573746564","id":489,"isConstant":false,"isLValue":false,"isPure":true,"kind":"string","lValueRequested":false,"nodeType":"Literal","src":"4544:8:0","typeDescriptions":{"typeIdentifier":"t_stringliteral_4d5b14044d78fbf0c9dd8b9c49e35f09ee5a6f5b1b3b8117b5d0e15c8dd2cb09","typeString":"literal_string \"nested\""},"value":"nested"}],"expression":{"argumentTypes":[{"typeIdentifier":"t_stringliteral_4d5b14044d78fbf0c9dd8b9c49e35f09ee5a6f5b1b3b8117b5d0e15c8dd2cb09","typeString":"literal_string \"nested\""}],"expression":{"id":486,"name":"this","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":-28,"src":"4531:4:0","typeDescriptions":{"typeIdentifier":"t_contract$_ScriptExample_$706","typeString":"contract ScriptExample"}},"id":488,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"memberName":"nested1","nodeType":"MemberAccess","referencedDeclaration":678,"src":"4531:12:0","typeDescriptions":{"typeIdentifier":"t_function_external_nonpayable$_t_string_memory_ptr_$returns$__$","typeString":"function (string memory) external"}},"id":490,"isConstant":false,"isLValue":false,"isPure":false,"kind":"functionCall","lValueRequested":false,"names":[],"nodeType":"FunctionCall","src":"4531:22:0","tryCall":false,"typeDescriptions":{"typeIdentifier":"t_tuple$__$","typeString":"tuple()"}},"id":491,"nodeType":"ExpressionStatement","src":"4531:22:0"},{"expression":{"arguments":[],"expression":{"argumentTypes":[],"expression":{"id":492,"name":"vm","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":213,"src":"4563:2:0","typeDescriptions":{"typeIdentifier":"t_contract$_Vm_$55","typeString":"contract Vm"}},"id":494,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"memberName":"stopBroadcast","nodeType":"MemberAccess","referencedDeclaration":54,"src":"4563:16:0","typeDescriptions":{"typeIdentifier":"t_function_external_nonpayable$__$returns$__$","typeString":"function () external"}},"id":495,"isConstant":false,"isLValue":false,"isPure":false,"kind":"functionCall","lValueRequested":false,"names":[],"nodeType":"FunctionCall","src":"4563:18:0","tryCall":false,"typeDescriptions":{"typeIdentifier":"t_tuple$__$","typeString":"tuple()"}},"id":496,"nodeType":"ExpressionStatement","src":"4563:18:0"},{"expression":{"arguments":[{"hexValue":"636f6e7472616374206465706c6f796d656e74","id":500,"isConstant":false,"isLValue":false,"isPure":true,"kind":"string","lValueRequested":false,"nodeType":"Literal","src":"4604:21:0","typeDescriptions":{"typeIdentifier":"t_stringliteral_aaf9be86adf9b6872d87eed3526f7c55f3c5d61f4e4dd6d55ef2fcbb8ad0bd57","typeString":"literal_string \"contract deployment\""},"value":"contract deployment"}],"expression":{"argumentTypes":[{"typeIdentifier":"t_stringliteral_aaf9be86adf9b6872d87eed3526f7c55f3c5d61f4e4dd6d55ef2fcbb8ad0bd57","typeString":"literal_string \"contract deployment\""}],"expression":{"id":497,"name":"console","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":192,"src":"4592:7:0","typeDescriptions":{"typeIdentifier":"t_type$_t_contract$_console_$192_$","typeString":"type(library console)"}},"id":499,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"memberName":"log","nodeType":"MemberAccess","referencedDeclaration":120,"src":"4592:11:0","typeDescriptions":{"typeIdentifier":"t_function_internal_pure$_t_string_memory_ptr_$returns$__$","typeString":"function (string memory) pure"}},"id":501,"isConstant":false,"isLValue":false,"isPure":false,"kind":"functionCall","lValueRequested":false,"names":[],"nodeType":"FunctionCall","src":"4592:34:0","tryCall":false,"typeDescriptions":{"typeIdentifier":"t_tuple$__$","typeString":"tuple()"}},"id":502,"nodeType":"ExpressionStatement","src":"4592:34:0"},{"expression":{"arguments":[{"arguments":[{"arguments":[{"hexValue":"3078313233343536","id":510,"isConstant":false,"isLValue":false,"isPure":true,"kind":"number","lValueRequested":false,"nodeType":"Literal","src":"4665:8:0","typeDescriptions":{"typeIdentifier":"t_rational_1193046_by_1","typeString":"int_const 1193046"},"value":"0x123456"}],"expression":{"argumentTypes":[{"typeIdentifier":"t_rational_1193046_by_1","typeString":"int_const 1193046"}],"id":509,"isConstant":false,"isLValue":false,"isPure":true,"lValueRequested":false,"nodeType":"ElementaryTypeNameExpression","src":"4657:7:0","typeDescriptions":{"typeIdentifier":"t_type$_t_uint160_$","typeString":"type(uint160)"},"typeName":{"id":508,"name":"uint160","nodeType":"ElementaryTypeName","src":"4657:7:0","typeDescriptions":{}}},"id":511,"isConstant":false,"isLValue":false,"isPure":true,"kind":"typeConversion","lValueRequested":false,"names":[],"nodeType":"FunctionCall","src":"4657:17:0","tryCall":false,"typeDescriptions":{"typeIdentifier":"t_uint160","typeString":"uint160"}}],"expression":{"argumentTypes":[{"typeIdentifier":"t_uint160","typeString":"uint160"}],"id":507,"isConstant":false,"isLValue":false,"isPure":true,"lValueRequested":false,"nodeType":"ElementaryTypeNameExpression","src":"4649:7:0","typeDescriptions":{"typeIdentifier":"t_type$_t_address_$","typeString":"type(address)"},"typeName":{"id":506,"name":"address","nodeType":"ElementaryTypeName","src":"4649:7:0","typeDescriptions":{}}},"id":512,"isConstant":false,"isLValue":false,"isPure":true,"kind":"typeConversion","lValueRequested":false,"names":[],"nodeType":"FunctionCall","src":"4649:26:0","tryCall":false,"typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"}}],"expression":{"argumentTypes":[{"typeIdentifier":"t_address","typeString":"address"}],"expression":{"id":503,"name":"vm","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":213,"src":"4636:2:0","typeDescriptions":{"typeIdentifier":"t_contract$_Vm_$55","typeString":"contract Vm"}},"id":505,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"memberName":"broadcast","nodeType":"MemberAccess","referencedDeclaration":43,"src":"4636:12:0","typeDescriptions":{"typeIdentifier":"t_function_external_nonpayable$_t_address_$returns$__$","typeString":"function (address) external"}},"id":513,"isConstant":false,"isLValue":false,"isPure":false,"kind":"functionCall","lValueRequested":false,"names":[],"nodeType":"FunctionCall","src":"4636:40:0","tryCall":false,"typeDescriptions":{"typeIdentifier":"t_tuple$__$","typeString":"tuple()"}},"id":514,"nodeType":"ExpressionStatement","src":"4636:40:0"},{"assignments":[517],"declarations":[{"constant":false,"id":517,"mutability":"mutable","name":"x","nameLocation":"4693:1:0","nodeType":"VariableDeclaration","scope":608,"src":"4686:8:0","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_contract$_FooBar_$719","typeString":"contract FooBar"},"typeName":{"id":516,"nodeType":"UserDefinedTypeName","pathNode":{"id":515,"name":"FooBar","nodeType":"IdentifierPath","referencedDeclaration":719,"src":"4686:6:0"},"referencedDeclaration":719,"src":"4686:6:0","typeDescriptions":{"typeIdentifier":"t_contract$_FooBar_$719","typeString":"contract FooBar"}},"visibility":"internal"}],"id":523,"initialValue":{"arguments":[{"hexValue":"31323334","id":521,"isConstant":false,"isLValue":false,"isPure":true,"kind":"number","lValueRequested":false,"nodeType":"Literal","src":"4708:4:0","typeDescriptions":{"typeIdentifier":"t_rational_1234_by_1","typeString":"int_const 1234"},"value":"1234"}],"expression":{"argumentTypes":[{"typeIdentifier":"t_rational_1234_by_1","typeString":"int_const 1234"}],"id":520,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"nodeType":"NewExpression","src":"4697:10:0","typeDescriptions":{"typeIdentifier":"t_function_creation_nonpayable$_t_uint256_$returns$_t_contract$_FooBar_$719_$","typeString":"function (uint256) returns (contract FooBar)"},"typeName":{"id":519,"nodeType":"UserDefinedTypeName","pathNode":{"id":518,"name":"FooBar","nodeType":"IdentifierPath","referencedDeclaration":719,"src":"4701:6:0"},"referencedDeclaration":719,"src":"4701:6:0","typeDescriptions":{"typeIdentifier":"t_contract$_FooBar_$719","typeString":"contract FooBar"}}},"id":522,"isConstant":false,"isLValue":false,"isPure":false,"kind":"functionCall","lValueRequested":false,"names":[],"nodeType":"FunctionCall","src":"4697:16:0","tryCall":false,"typeDescriptions":{"typeIdentifier":"t_contract$_FooBar_$719","typeString":"contract FooBar"}},"nodeType":"VariableDeclarationStatement","src":"4686:27:0"},{"expression":{"arguments":[{"commonType":{"typeIdentifier":"t_uint256","typeString":"uint256"},"id":529,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"leftExpression":{"arguments":[],"expression":{"argumentTypes":[],"expression":{"id":525,"name":"x","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":517,"src":"4731:1:0","typeDescriptions":{"typeIdentifier":"t_contract$_FooBar_$719","typeString":"contract FooBar"}},"id":526,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"memberName":"foo","nodeType":"MemberAccess","referencedDeclaration":708,"src":"4731:5:0","typeDescriptions":{"typeIdentifier":"t_function_external_view$__$returns$_t_uint256_$","typeString":"function () view external returns (uint256)"}},"id":527,"isConstant":false,"isLValue":false,"isPure":false,"kind":"functionCall","lValueRequested":false,"names":[],"nodeType":"FunctionCall","src":"4731:7:0","tryCall":false,"typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"nodeType":"BinaryOperation","operator":"==","rightExpression":{"hexValue":"31323334","id":528,"isConstant":false,"isLValue":false,"isPure":true,"kind":"number","lValueRequested":false,"nodeType":"Literal","src":"4742:4:0","typeDescriptions":{"typeIdentifier":"t_rational_1234_by_1","typeString":"int_const 1234"},"value":"1234"},"src":"4731:15:0","typeDescriptions":{"typeIdentifier":"t_bool","typeString":"bool"}}],"expression":{"argumentTypes":[{"typeIdentifier":"t_bool","typeString":"bool"}],"id":524,"name":"require","nodeType":"Identifier","overloadedDeclarations":[-18,-18],"referencedDeclaration":-18,"src":"4723:7:0","typeDescriptions":{"typeIdentifier":"t_function_require_pure$_t_bool_$returns$__$","typeString":"function (bool) pure"}},"id":530,"isConstant":false,"isLValue":false,"isPure":false,"kind":"functionCall","lValueRequested":false,"names":[],"nodeType":"FunctionCall","src":"4723:24:0","tryCall":false,"typeDescriptions":{"typeIdentifier":"t_tuple$__$","typeString":"tuple()"}},"id":531,"nodeType":"ExpressionStatement","src":"4723:24:0"},{"expression":{"arguments":[{"hexValue":"6372656174652032","id":535,"isConstant":false,"isLValue":false,"isPure":true,"kind":"string","lValueRequested":false,"nodeType":"Literal","src":"4770:10:0","typeDescriptions":{"typeIdentifier":"t_stringliteral_4411d6d4ffcd00382a95255a63761e69de9810e1236042a5c64948a7b6c04daa","typeString":"literal_string \"create 2\""},"value":"create 2"}],"expression":{"argumentTypes":[{"typeIdentifier":"t_stringliteral_4411d6d4ffcd00382a95255a63761e69de9810e1236042a5c64948a7b6c04daa","typeString":"literal_string \"create 2\""}],"expression":{"id":532,"name":"console","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":192,"src":"4758:7:0","typeDescriptions":{"typeIdentifier":"t_type$_t_contract$_console_$192_$","typeString":"type(library console)"}},"id":534,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"memberName":"log","nodeType":"MemberAccess","referencedDeclaration":120,"src":"4758:11:0","typeDescriptions":{"typeIdentifier":"t_function_internal_pure$_t_string_memory_ptr_$returns$__$","typeString":"function (string memory) pure"}},"id":536,"isConstant":false,"isLValue":false,"isPure":false,"kind":"functionCall","lValueRequested":false,"names":[],"nodeType":"FunctionCall","src":"4758:23:0","tryCall":false,"typeDescriptions":{"typeIdentifier":"t_tuple$__$","typeString":"tuple()"}},"id":537,"nodeType":"ExpressionStatement","src":"4758:23:0"},{"expression":{"arguments":[{"arguments":[{"arguments":[{"hexValue":"307863616665","id":545,"isConstant":false,"isLValue":false,"isPure":true,"kind":"number","lValueRequested":false,"nodeType":"Literal","src":"4820:6:0","typeDescriptions":{"typeIdentifier":"t_rational_51966_by_1","typeString":"int_const 51966"},"value":"0xcafe"}],"expression":{"argumentTypes":[{"typeIdentifier":"t_rational_51966_by_1","typeString":"int_const 51966"}],"id":544,"isConstant":false,"isLValue":false,"isPure":true,"lValueRequested":false,"nodeType":"ElementaryTypeNameExpression","src":"4812:7:0","typeDescriptions":{"typeIdentifier":"t_type$_t_uint160_$","typeString":"type(uint160)"},"typeName":{"id":543,"name":"uint160","nodeType":"ElementaryTypeName","src":"4812:7:0","typeDescriptions":{}}},"id":546,"isConstant":false,"isLValue":false,"isPure":true,"kind":"typeConversion","lValueRequested":false,"names":[],"nodeType":"FunctionCall","src":"4812:15:0","tryCall":false,"typeDescriptions":{"typeIdentifier":"t_uint160","typeString":"uint160"}}],"expression":{"argumentTypes":[{"typeIdentifier":"t_uint160","typeString":"uint160"}],"id":542,"isConstant":false,"isLValue":false,"isPure":true,"lValueRequested":false,"nodeType":"ElementaryTypeNameExpression","src":"4804:7:0","typeDescriptions":{"typeIdentifier":"t_type$_t_address_$","typeString":"type(address)"},"typeName":{"id":541,"name":"address","nodeType":"ElementaryTypeName","src":"4804:7:0","typeDescriptions":{}}},"id":547,"isConstant":false,"isLValue":false,"isPure":true,"kind":"typeConversion","lValueRequested":false,"names":[],"nodeType":"FunctionCall","src":"4804:24:0","tryCall":false,"typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"}}],"expression":{"argumentTypes":[{"typeIdentifier":"t_address","typeString":"address"}],"expression":{"id":538,"name":"vm","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":213,"src":"4791:2:0","typeDescriptions":{"typeIdentifier":"t_contract$_Vm_$55","typeString":"contract Vm"}},"id":540,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"memberName":"broadcast","nodeType":"MemberAccess","referencedDeclaration":43,"src":"4791:12:0","typeDescriptions":{"typeIdentifier":"t_function_external_nonpayable$_t_address_$returns$__$","typeString":"function (address) external"}},"id":548,"isConstant":false,"isLValue":false,"isPure":false,"kind":"functionCall","lValueRequested":false,"names":[],"nodeType":"FunctionCall","src":"4791:38:0","tryCall":false,"typeDescriptions":{"typeIdentifier":"t_tuple$__$","typeString":"tuple()"}},"id":549,"nodeType":"ExpressionStatement","src":"4791:38:0"},{"assignments":[552],"declarations":[{"constant":false,"id":552,"mutability":"mutable","name":"y","nameLocation":"4846:1:0","nodeType":"VariableDeclaration","scope":608,"src":"4839:8:0","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_contract$_FooBar_$719","typeString":"contract FooBar"},"typeName":{"id":551,"nodeType":"UserDefinedTypeName","pathNode":{"id":550,"name":"FooBar","nodeType":"IdentifierPath","referencedDeclaration":719,"src":"4839:6:0"},"referencedDeclaration":719,"src":"4839:6:0","typeDescriptions":{"typeIdentifier":"t_contract$_FooBar_$719","typeString":"contract FooBar"}},"visibility":"internal"}],"id":566,"initialValue":{"arguments":[{"hexValue":"31323334","id":564,"isConstant":false,"isLValue":false,"isPure":true,"kind":"number","lValueRequested":false,"nodeType":"Literal","src":"4889:4:0","typeDescriptions":{"typeIdentifier":"t_rational_1234_by_1","typeString":"int_const 1234"},"value":"1234"}],"expression":{"argumentTypes":[{"typeIdentifier":"t_rational_1234_by_1","typeString":"int_const 1234"}],"expression":{"argumentTypes":[{"typeIdentifier":"t_rational_1234_by_1","typeString":"int_const 1234"}],"id":555,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"nodeType":"NewExpression","src":"4850:10:0","typeDescriptions":{"typeIdentifier":"t_function_creation_nonpayable$_t_uint256_$returns$_t_contract$_FooBar_$719_$","typeString":"function (uint256) returns (contract FooBar)"},"typeName":{"id":554,"nodeType":"UserDefinedTypeName","pathNode":{"id":553,"name":"FooBar","nodeType":"IdentifierPath","referencedDeclaration":719,"src":"4854:6:0"},"referencedDeclaration":719,"src":"4854:6:0","typeDescriptions":{"typeIdentifier":"t_contract$_FooBar_$719","typeString":"contract FooBar"}}},"id":563,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"names":["salt"],"nodeType":"FunctionCallOptions","options":[{"arguments":[{"arguments":[{"hexValue":"3432","id":560,"isConstant":false,"isLValue":false,"isPure":true,"kind":"number","lValueRequested":false,"nodeType":"Literal","src":"4883:2:0","typeDescriptions":{"typeIdentifier":"t_rational_42_by_1","typeString":"int_const 42"},"value":"42"}],"expression":{"argumentTypes":[{"typeIdentifier":"t_rational_42_by_1","typeString":"int_const 42"}],"id":559,"isConstant":false,"isLValue":false,"isPure":true,"lValueRequested":false,"nodeType":"ElementaryTypeNameExpression","src":"4875:7:0","typeDescriptions":{"typeIdentifier":"t_type$_t_uint256_$","typeString":"type(uint256)"},"typeName":{"id":558,"name":"uint256","nodeType":"ElementaryTypeName","src":"4875:7:0","typeDescriptions":{}}},"id":561,"isConstant":false,"isLValue":false,"isPure":true,"kind":"typeConversion","lValueRequested":false,"names":[],"nodeType":"FunctionCall","src":"4875:11:0","tryCall":false,"typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}}],"expression":{"argumentTypes":[{"typeIdentifier":"t_uint256","typeString":"uint256"}],"id":557,"isConstant":false,"isLValue":false,"isPure":true,"lValueRequested":false,"nodeType":"ElementaryTypeNameExpression","src":"4867:7:0","typeDescriptions":{"typeIdentifier":"t_type$_t_bytes32_$","typeString":"type(bytes32)"},"typeName":{"id":556,"name":"bytes32","nodeType":"ElementaryTypeName","src":"4867:7:0","typeDescriptions":{}}},"id":562,"isConstant":false,"isLValue":false,"isPure":true,"kind":"typeConversion","lValueRequested":false,"names":[],"nodeType":"FunctionCall","src":"4867:20:0","tryCall":false,"typeDescriptions":{"typeIdentifier":"t_bytes32","typeString":"bytes32"}}],"src":"4850:38:0","typeDescriptions":{"typeIdentifier":"t_function_creation_nonpayable$_t_uint256_$returns$_t_contract$_FooBar_$719_$salt","typeString":"function (uint256) returns (contract FooBar)"}},"id":565,"isConstant":false,"isLValue":false,"isPure":false,"kind":"functionCall","lValueRequested":false,"names":[],"nodeType":"FunctionCall","src":"4850:44:0","tryCall":false,"typeDescriptions":{"typeIdentifier":"t_contract$_FooBar_$719","typeString":"contract FooBar"}},"nodeType":"VariableDeclarationStatement","src":"4839:55:0"},{"expression":{"arguments":[{"commonType":{"typeIdentifier":"t_uint256","typeString":"uint256"},"id":572,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"leftExpression":{"arguments":[],"expression":{"argumentTypes":[],"expression":{"id":568,"name":"y","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":552,"src":"4912:1:0","typeDescriptions":{"typeIdentifier":"t_contract$_FooBar_$719","typeString":"contract FooBar"}},"id":569,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"memberName":"foo","nodeType":"MemberAccess","referencedDeclaration":708,"src":"4912:5:0","typeDescriptions":{"typeIdentifier":"t_function_external_view$__$returns$_t_uint256_$","typeString":"function () view external returns (uint256)"}},"id":570,"isConstant":false,"isLValue":false,"isPure":false,"kind":"functionCall","lValueRequested":false,"names":[],"nodeType":"FunctionCall","src":"4912:7:0","tryCall":false,"typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"nodeType":"BinaryOperation","operator":"==","rightExpression":{"hexValue":"31323334","id":571,"isConstant":false,"isLValue":false,"isPure":true,"kind":"number","lValueRequested":false,"nodeType":"Literal","src":"4923:4:0","typeDescriptions":{"typeIdentifier":"t_rational_1234_by_1","typeString":"int_const 1234"},"value":"1234"},"src":"4912:15:0","typeDescriptions":{"typeIdentifier":"t_bool","typeString":"bool"}}],"expression":{"argumentTypes":[{"typeIdentifier":"t_bool","typeString":"bool"}],"id":567,"name":"require","nodeType":"Identifier","overloadedDeclarations":[-18,-18],"referencedDeclaration":-18,"src":"4904:7:0","typeDescriptions":{"typeIdentifier":"t_function_require_pure$_t_bool_$returns$__$","typeString":"function (bool) pure"}},"id":573,"isConstant":false,"isLValue":false,"isPure":false,"kind":"functionCall","lValueRequested":false,"names":[],"nodeType":"FunctionCall","src":"4904:24:0","tryCall":false,"typeDescriptions":{"typeIdentifier":"t_tuple$__$","typeString":"tuple()"}},"id":574,"nodeType":"ExpressionStatement","src":"4904:24:0"},{"expression":{"arguments":[{"hexValue":"646f6e6521","id":578,"isConstant":false,"isLValue":false,"isPure":true,"kind":"string","lValueRequested":false,"nodeType":"Literal","src":"4950:7:0","typeDescriptions":{"typeIdentifier":"t_stringliteral_080382d5c9e9e7c5e3d1d33f5e7422740375955180fadff167d8130e0c35f3fc","typeString":"literal_string \"done!\""},"value":"done!"}],"expression":{"argumentTypes":[{"typeIdentifier":"t_stringliteral_080382d5c9e9e7c5e3d1d33f5e7422740375955180fadff167d8130e0c35f3fc","typeString":"literal_string \"done!\""}],"expression":{"id":575,"name":"console","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":192,"src":"4938:7:0","typeDescriptions":{"typeIdentifier":"t_type$_t_contract$_console_$192_$","typeString":"type(library console)"}},"id":577,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"memberName":"log","nodeType":"MemberAccess","referencedDeclaration":120,"src":"4938:11:0","typeDescriptions":{"typeIdentifier":"t_function_internal_pure$_t_string_memory_ptr_$returns$__$","typeString":"function (string memory) pure"}},"id":579,"isConstant":false,"isLValue":false,"isPure":false,"kind":"functionCall","lValueRequested":false,"names":[],"nodeType":"FunctionCall","src":"4938:20:0","tryCall":false,"typeDescriptions":{"typeIdentifier":"t_tuple$__$","typeString":"tuple()"}},"id":580,"nodeType":"ExpressionStatement","src":"4938:20:0"},{"expression":{"arguments":[],"expression":{"argumentTypes":[],"expression":{"id":581,"name":"vm","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":213,"src":"5042:2:0","typeDescriptions":{"typeIdentifier":"t_contract$_Vm_$55","typeString":"contract Vm"}},"id":583,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"memberName":"broadcast","nodeType":"MemberAccess","referencedDeclaration":38,"src":"5042:12:0","typeDescriptions":{"typeIdentifier":"t_function_external_nonpayable$__$returns$__$","typeString":"function () external"}},"id":584,"isConstant":false,"isLValue":false,"isPure":false,"kind":"functionCall","lValueRequested":false,"names":[],"nodeType":"FunctionCall","src":"5042:14:0","tryCall":false,"typeDescriptions":{"typeIdentifier":"t_tuple$__$","typeString":"tuple()"}},"id":585,"nodeType":"ExpressionStatement","src":"5042:14:0"},{"expression":{"arguments":[{"hexValue":"31323334","id":589,"isConstant":false,"isLValue":false,"isPure":true,"kind":"number","lValueRequested":false,"nodeType":"Literal","src":"5077:4:0","typeDescriptions":{"typeIdentifier":"t_rational_1234_by_1","typeString":"int_const 1234"},"value":"1234"}],"expression":{"argumentTypes":[{"typeIdentifier":"t_rational_1234_by_1","typeString":"int_const 1234"}],"id":588,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"nodeType":"NewExpression","src":"5066:10:0","typeDescriptions":{"typeIdentifier":"t_function_creation_nonpayable$_t_uint256_$returns$_t_contract$_FooBar_$719_$","typeString":"function (uint256) returns (contract FooBar)"},"typeName":{"id":587,"nodeType":"UserDefinedTypeName","pathNode":{"id":586,"name":"FooBar","nodeType":"IdentifierPath","referencedDeclaration":719,"src":"5070:6:0"},"referencedDeclaration":719,"src":"5070:6:0","typeDescriptions":{"typeIdentifier":"t_contract$_FooBar_$719","typeString":"contract FooBar"}}},"id":590,"isConstant":false,"isLValue":false,"isPure":false,"kind":"functionCall","lValueRequested":false,"names":[],"nodeType":"FunctionCall","src":"5066:16:0","tryCall":false,"typeDescriptions":{"typeIdentifier":"t_contract$_FooBar_$719","typeString":"contract FooBar"}},"id":591,"nodeType":"ExpressionStatement","src":"5066:16:0"},{"expression":{"arguments":[{"hexValue":"6e6f6e636520656e64","id":595,"isConstant":false,"isLValue":false,"isPure":true,"kind":"string","lValueRequested":false,"nodeType":"Literal","src":"5105:11:0","typeDescriptions":{"typeIdentifier":"t_stringliteral_fa629e6661ad2a2bdb09cf9a3a276ce0d722482ae5c2887650751be0938847e8","typeString":"literal_string \"nonce end\""},"value":"nonce end"},{"arguments":[{"arguments":[{"arguments":[{"id":602,"name":"this","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":-28,"src":"5146:4:0","typeDescriptions":{"typeIdentifier":"t_contract$_ScriptExample_$706","typeString":"contract ScriptExample"}}],"expression":{"argumentTypes":[{"typeIdentifier":"t_contract$_ScriptExample_$706","typeString":"contract ScriptExample"}],"id":601,"isConstant":false,"isLValue":false,"isPure":true,"lValueRequested":false,"nodeType":"ElementaryTypeNameExpression","src":"5138:7:0","typeDescriptions":{"typeIdentifier":"t_type$_t_address_$","typeString":"type(address)"},"typeName":{"id":600,"name":"address","nodeType":"ElementaryTypeName","src":"5138:7:0","typeDescriptions":{}}},"id":603,"isConstant":false,"isLValue":false,"isPure":false,"kind":"typeConversion","lValueRequested":false,"names":[],"nodeType":"FunctionCall","src":"5138:13:0","tryCall":false,"typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"}}],"expression":{"argumentTypes":[{"typeIdentifier":"t_address","typeString":"address"}],"expression":{"id":598,"name":"vm","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":213,"src":"5126:2:0","typeDescriptions":{"typeIdentifier":"t_contract$_Vm_$55","typeString":"contract Vm"}},"id":599,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"memberName":"getNonce","nodeType":"MemberAccess","referencedDeclaration":17,"src":"5126:11:0","typeDescriptions":{"typeIdentifier":"t_function_external_view$_t_address_$returns$_t_uint64_$","typeString":"function (address) view external returns (uint64)"}},"id":604,"isConstant":false,"isLValue":false,"isPure":false,"kind":"functionCall","lValueRequested":false,"names":[],"nodeType":"FunctionCall","src":"5126:26:0","tryCall":false,"typeDescriptions":{"typeIdentifier":"t_uint64","typeString":"uint64"}}],"expression":{"argumentTypes":[{"typeIdentifier":"t_uint64","typeString":"uint64"}],"id":597,"isConstant":false,"isLValue":false,"isPure":true,"lValueRequested":false,"nodeType":"ElementaryTypeNameExpression","src":"5118:7:0","typeDescriptions":{"typeIdentifier":"t_type$_t_uint256_$","typeString":"type(uint256)"},"typeName":{"id":596,"name":"uint256","nodeType":"ElementaryTypeName","src":"5118:7:0","typeDescriptions":{}}},"id":605,"isConstant":false,"isLValue":false,"isPure":false,"kind":"typeConversion","lValueRequested":false,"names":[],"nodeType":"FunctionCall","src":"5118:35:0","tryCall":false,"typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}}],"expression":{"argumentTypes":[{"typeIdentifier":"t_stringliteral_fa629e6661ad2a2bdb09cf9a3a276ce0d722482ae5c2887650751be0938847e8","typeString":"literal_string \"nonce end\""},{"typeIdentifier":"t_uint256","typeString":"uint256"}],"expression":{"id":592,"name":"console","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":192,"src":"5093:7:0","typeDescriptions":{"typeIdentifier":"t_type$_t_contract$_console_$192_$","typeString":"type(library console)"}},"id":594,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"memberName":"log","nodeType":"MemberAccess","referencedDeclaration":154,"src":"5093:11:0","typeDescriptions":{"typeIdentifier":"t_function_internal_pure$_t_string_memory_ptr_$_t_uint256_$returns$__$","typeString":"function (string memory,uint256) pure"}},"id":606,"isConstant":false,"isLValue":false,"isPure":false,"kind":"functionCall","lValueRequested":false,"names":[],"nodeType":"FunctionCall","src":"5093:61:0","tryCall":false,"typeDescriptions":{"typeIdentifier":"t_tuple$__$","typeString":"tuple()"}},"id":607,"nodeType":"ExpressionStatement","src":"5093:61:0"}]},"documentation":{"id":379,"nodeType":"StructuredDocumentation","src":"3842:56:0","text":"@notice example function, to test vm.broadcast with."},"functionSelector":"bef03abc","implemented":true,"kind":"function","modifiers":[],"name":"runBroadcast","nameLocation":"3912:12:0","parameters":{"id":380,"nodeType":"ParameterList","parameters":[],"src":"3924:2:0"},"returnParameters":{"id":381,"nodeType":"ParameterList","parameters":[],"src":"3934:0:0"},"scope":706,"stateMutability":"nonpayable","virtual":false,"visibility":"public"},{"id":633,"nodeType":"FunctionDefinition","src":"5256:143:0","nodes":[],"body":{"id":632,"nodeType":"Block","src":"5305:94:0","nodes":[],"statements":[{"expression":{"arguments":[{"id":618,"name":"_v","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":612,"src":"5327:2:0","typeDescriptions":{"typeIdentifier":"t_string_calldata_ptr","typeString":"string calldata"}}],"expression":{"argumentTypes":[{"typeIdentifier":"t_string_calldata_ptr","typeString":"string calldata"}],"expression":{"id":615,"name":"console","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":192,"src":"5315:7:0","typeDescriptions":{"typeIdentifier":"t_type$_t_contract$_console_$192_$","typeString":"type(library console)"}},"id":617,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"memberName":"log","nodeType":"MemberAccess","referencedDeclaration":120,"src":"5315:11:0","typeDescriptions":{"typeIdentifier":"t_function_internal_pure$_t_string_memory_ptr_$returns$__$","typeString":"function (string memory) pure"}},"id":619,"isConstant":false,"isLValue":false,"isPure":false,"kind":"functionCall","lValueRequested":false,"names":[],"nodeType":"FunctionCall","src":"5315:15:0","tryCall":false,"typeDescriptions":{"typeIdentifier":"t_tuple$__$","typeString":"tuple()"}},"id":620,"nodeType":"ExpressionStatement","src":"5315:15:0"},{"expression":{"arguments":[{"hexValue":"68656c6c6f206d73672e73656e646572","id":624,"isConstant":false,"isLValue":false,"isPure":true,"kind":"string","lValueRequested":false,"nodeType":"Literal","src":"5352:18:0","typeDescriptions":{"typeIdentifier":"t_stringliteral_b3cc13bc51228b2c4c4334d82a4772908254dc0e1c512893dd16208ef13efb8e","typeString":"literal_string \"hello msg.sender\""},"value":"hello msg.sender"},{"arguments":[{"expression":{"id":627,"name":"msg","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":-15,"src":"5380:3:0","typeDescriptions":{"typeIdentifier":"t_magic_message","typeString":"msg"}},"id":628,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"memberName":"sender","nodeType":"MemberAccess","src":"5380:10:0","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"}}],"expression":{"argumentTypes":[{"typeIdentifier":"t_address","typeString":"address"}],"id":626,"isConstant":false,"isLValue":false,"isPure":true,"lValueRequested":false,"nodeType":"ElementaryTypeNameExpression","src":"5372:7:0","typeDescriptions":{"typeIdentifier":"t_type$_t_address_$","typeString":"type(address)"},"typeName":{"id":625,"name":"address","nodeType":"ElementaryTypeName","src":"5372:7:0","typeDescriptions":{}}},"id":629,"isConstant":false,"isLValue":false,"isPure":false,"kind":"typeConversion","lValueRequested":false,"names":[],"nodeType":"FunctionCall","src":"5372:19:0","tryCall":false,"typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"}}],"expression":{"argumentTypes":[{"typeIdentifier":"t_stringliteral_b3cc13bc51228b2c4c4334d82a4772908254dc0e1c512893dd16208ef13efb8e","typeString":"literal_string \"hello msg.sender\""},{"typeIdentifier":"t_address","typeString":"address"}],"expression":{"id":621,"name":"console","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":192,"src":"5340:7:0","typeDescriptions":{"typeIdentifier":"t_type$_t_contract$_console_$192_$","typeString":"type(library console)"}},"id":623,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"memberName":"log","nodeType":"MemberAccess","referencedDeclaration":171,"src":"5340:11:0","typeDescriptions":{"typeIdentifier":"t_function_internal_pure$_t_string_memory_ptr_$_t_address_$returns$__$","typeString":"function (string memory,address) pure"}},"id":630,"isConstant":false,"isLValue":false,"isPure":false,"kind":"functionCall","lValueRequested":false,"names":[],"nodeType":"FunctionCall","src":"5340:52:0","tryCall":false,"typeDescriptions":{"typeIdentifier":"t_tuple$__$","typeString":"tuple()"}},"id":631,"nodeType":"ExpressionStatement","src":"5340:52:0"}]},"documentation":{"id":610,"nodeType":"StructuredDocumentation","src":"5167:84:0","text":"@notice example external function, to force a CALL, and test vm.startPrank with."},"functionSelector":"a777d0dc","implemented":true,"kind":"function","modifiers":[],"name":"hello","nameLocation":"5265:5:0","parameters":{"id":613,"nodeType":"ParameterList","parameters":[{"constant":false,"id":612,"mutability":"mutable","name":"_v","nameLocation":"5287:2:0","nodeType":"VariableDeclaration","scope":633,"src":"5271:18:0","stateVariable":false,"storageLocation":"calldata","typeDescriptions":{"typeIdentifier":"t_string_calldata_ptr","typeString":"string"},"typeName":{"id":611,"name":"string","nodeType":"ElementaryTypeName","src":"5271:6:0","typeDescriptions":{"typeIdentifier":"t_string_storage_ptr","typeString":"string"}},"visibility":"internal"}],"src":"5270:20:0"},"returnParameters":{"id":614,"nodeType":"ParameterList","parameters":[],"src":"5305:0:0"},"scope":706,"stateMutability":"view","virtual":false,"visibility":"external"},{"id":648,"nodeType":"FunctionDefinition","src":"5405:95:0","nodes":[],"body":{"id":647,"nodeType":"Block","src":"5449:51:0","nodes":[],"statements":[{"expression":{"id":639,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"nodeType":"UnaryOperation","operator":"++","prefix":false,"src":"5459:9:0","subExpression":{"id":638,"name":"counter","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":215,"src":"5459:7:0","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"id":640,"nodeType":"ExpressionStatement","src":"5459:9:0"},{"expression":{"arguments":[{"id":644,"name":"_v","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":635,"src":"5490:2:0","typeDescriptions":{"typeIdentifier":"t_string_calldata_ptr","typeString":"string calldata"}}],"expression":{"argumentTypes":[{"typeIdentifier":"t_string_calldata_ptr","typeString":"string calldata"}],"expression":{"id":641,"name":"console","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":192,"src":"5478:7:0","typeDescriptions":{"typeIdentifier":"t_type$_t_contract$_console_$192_$","typeString":"type(library console)"}},"id":643,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"memberName":"log","nodeType":"MemberAccess","referencedDeclaration":120,"src":"5478:11:0","typeDescriptions":{"typeIdentifier":"t_function_internal_pure$_t_string_memory_ptr_$returns$__$","typeString":"function (string memory) pure"}},"id":645,"isConstant":false,"isLValue":false,"isPure":false,"kind":"functionCall","lValueRequested":false,"names":[],"nodeType":"FunctionCall","src":"5478:15:0","tryCall":false,"typeDescriptions":{"typeIdentifier":"t_tuple$__$","typeString":"tuple()"}},"id":646,"nodeType":"ExpressionStatement","src":"5478:15:0"}]},"functionSelector":"7e79255d","implemented":true,"kind":"function","modifiers":[],"name":"call1","nameLocation":"5414:5:0","parameters":{"id":636,"nodeType":"ParameterList","parameters":[{"constant":false,"id":635,"mutability":"mutable","name":"_v","nameLocation":"5436:2:0","nodeType":"VariableDeclaration","scope":648,"src":"5420:18:0","stateVariable":false,"storageLocation":"calldata","typeDescriptions":{"typeIdentifier":"t_string_calldata_ptr","typeString":"string"},"typeName":{"id":634,"name":"string","nodeType":"ElementaryTypeName","src":"5420:6:0","typeDescriptions":{"typeIdentifier":"t_string_storage_ptr","typeString":"string"}},"visibility":"internal"}],"src":"5419:20:0"},"returnParameters":{"id":637,"nodeType":"ParameterList","parameters":[],"src":"5449:0:0"},"scope":706,"stateMutability":"nonpayable","virtual":false,"visibility":"external"},{"id":663,"nodeType":"FunctionDefinition","src":"5506:95:0","nodes":[],"body":{"id":662,"nodeType":"Block","src":"5550:51:0","nodes":[],"statements":[{"expression":{"id":654,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"nodeType":"UnaryOperation","operator":"++","prefix":false,"src":"5560:9:0","subExpression":{"id":653,"name":"counter","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":215,"src":"5560:7:0","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"id":655,"nodeType":"ExpressionStatement","src":"5560:9:0"},{"expression":{"arguments":[{"id":659,"name":"_v","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":650,"src":"5591:2:0","typeDescriptions":{"typeIdentifier":"t_string_calldata_ptr","typeString":"string calldata"}}],"expression":{"argumentTypes":[{"typeIdentifier":"t_string_calldata_ptr","typeString":"string calldata"}],"expression":{"id":656,"name":"console","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":192,"src":"5579:7:0","typeDescriptions":{"typeIdentifier":"t_type$_t_contract$_console_$192_$","typeString":"type(library console)"}},"id":658,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"memberName":"log","nodeType":"MemberAccess","referencedDeclaration":120,"src":"5579:11:0","typeDescriptions":{"typeIdentifier":"t_function_internal_pure$_t_string_memory_ptr_$returns$__$","typeString":"function (string memory) pure"}},"id":660,"isConstant":false,"isLValue":false,"isPure":false,"kind":"functionCall","lValueRequested":false,"names":[],"nodeType":"FunctionCall","src":"5579:15:0","tryCall":false,"typeDescriptions":{"typeIdentifier":"t_tuple$__$","typeString":"tuple()"}},"id":661,"nodeType":"ExpressionStatement","src":"5579:15:0"}]},"functionSelector":"8d3ef7ca","implemented":true,"kind":"function","modifiers":[],"name":"call2","nameLocation":"5515:5:0","parameters":{"id":651,"nodeType":"ParameterList","parameters":[{"constant":false,"id":650,"mutability":"mutable","name":"_v","nameLocation":"5537:2:0","nodeType":"VariableDeclaration","scope":663,"src":"5521:18:0","stateVariable":false,"storageLocation":"calldata","typeDescriptions":{"typeIdentifier":"t_string_calldata_ptr","typeString":"string"},"typeName":{"id":649,"name":"string","nodeType":"ElementaryTypeName","src":"5521:6:0","typeDescriptions":{"typeIdentifier":"t_string_storage_ptr","typeString":"string"}},"visibility":"internal"}],"src":"5520:20:0"},"returnParameters":{"id":652,"nodeType":"ParameterList","parameters":[],"src":"5550:0:0"},"scope":706,"stateMutability":"nonpayable","virtual":false,"visibility":"external"},{"id":678,"nodeType":"FunctionDefinition","src":"5607:98:0","nodes":[],"body":{"id":677,"nodeType":"Block","src":"5653:52:0","nodes":[],"statements":[{"expression":{"id":669,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"nodeType":"UnaryOperation","operator":"++","prefix":false,"src":"5663:9:0","subExpression":{"id":668,"name":"counter","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":215,"src":"5663:7:0","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"id":670,"nodeType":"ExpressionStatement","src":"5663:9:0"},{"expression":{"arguments":[{"id":674,"name":"_v","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":665,"src":"5695:2:0","typeDescriptions":{"typeIdentifier":"t_string_calldata_ptr","typeString":"string calldata"}}],"expression":{"argumentTypes":[{"typeIdentifier":"t_string_calldata_ptr","typeString":"string calldata"}],"expression":{"id":671,"name":"this","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":-28,"src":"5682:4:0","typeDescriptions":{"typeIdentifier":"t_contract$_ScriptExample_$706","typeString":"contract ScriptExample"}},"id":673,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"memberName":"nested2","nodeType":"MemberAccess","referencedDeclaration":693,"src":"5682:12:0","typeDescriptions":{"typeIdentifier":"t_function_external_nonpayable$_t_string_memory_ptr_$returns$__$","typeString":"function (string memory) external"}},"id":675,"isConstant":false,"isLValue":false,"isPure":false,"kind":"functionCall","lValueRequested":false,"names":[],"nodeType":"FunctionCall","src":"5682:16:0","tryCall":false,"typeDescriptions":{"typeIdentifier":"t_tuple$__$","typeString":"tuple()"}},"id":676,"nodeType":"ExpressionStatement","src":"5682:16:0"}]},"functionSelector":"a76ccdfa","implemented":true,"kind":"function","modifiers":[],"name":"nested1","nameLocation":"5616:7:0","parameters":{"id":666,"nodeType":"ParameterList","parameters":[{"constant":false,"id":665,"mutability":"mutable","name":"_v","nameLocation":"5640:2:0","nodeType":"VariableDeclaration","scope":678,"src":"5624:18:0","stateVariable":false,"storageLocation":"calldata","typeDescriptions":{"typeIdentifier":"t_string_calldata_ptr","typeString":"string"},"typeName":{"id":664,"name":"string","nodeType":"ElementaryTypeName","src":"5624:6:0","typeDescriptions":{"typeIdentifier":"t_string_storage_ptr","typeString":"string"}},"visibility":"internal"}],"src":"5623:20:0"},"returnParameters":{"id":667,"nodeType":"ParameterList","parameters":[],"src":"5653:0:0"},"scope":706,"stateMutability":"nonpayable","virtual":false,"visibility":"external"},{"id":693,"nodeType":"FunctionDefinition","src":"5711:97:0","nodes":[],"body":{"id":692,"nodeType":"Block","src":"5757:51:0","nodes":[],"statements":[{"expression":{"id":684,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"nodeType":"UnaryOperation","operator":"++","prefix":false,"src":"5767:9:0","subExpression":{"id":683,"name":"counter","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":215,"src":"5767:7:0","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"id":685,"nodeType":"ExpressionStatement","src":"5767:9:0"},{"expression":{"arguments":[{"id":689,"name":"_v","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":680,"src":"5798:2:0","typeDescriptions":{"typeIdentifier":"t_string_calldata_ptr","typeString":"string calldata"}}],"expression":{"argumentTypes":[{"typeIdentifier":"t_string_calldata_ptr","typeString":"string calldata"}],"expression":{"id":686,"name":"console","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":192,"src":"5786:7:0","typeDescriptions":{"typeIdentifier":"t_type$_t_contract$_console_$192_$","typeString":"type(library console)"}},"id":688,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"memberName":"log","nodeType":"MemberAccess","referencedDeclaration":120,"src":"5786:11:0","typeDescriptions":{"typeIdentifier":"t_function_internal_pure$_t_string_memory_ptr_$returns$__$","typeString":"function (string memory) pure"}},"id":690,"isConstant":false,"isLValue":false,"isPure":false,"kind":"functionCall","lValueRequested":false,"names":[],"nodeType":"FunctionCall","src":"5786:15:0","tryCall":false,"typeDescriptions":{"typeIdentifier":"t_tuple$__$","typeString":"tuple()"}},"id":691,"nodeType":"ExpressionStatement","src":"5786:15:0"}]},"functionSelector":"dbf1282f","implemented":true,"kind":"function","modifiers":[],"name":"nested2","nameLocation":"5720:7:0","parameters":{"id":681,"nodeType":"ParameterList","parameters":[{"constant":false,"id":680,"mutability":"mutable","name":"_v","nameLocation":"5744:2:0","nodeType":"VariableDeclaration","scope":693,"src":"5728:18:0","stateVariable":false,"storageLocation":"calldata","typeDescriptions":{"typeIdentifier":"t_string_calldata_ptr","typeString":"string"},"typeName":{"id":679,"name":"string","nodeType":"ElementaryTypeName","src":"5728:6:0","typeDescriptions":{"typeIdentifier":"t_string_storage_ptr","typeString":"string"}},"visibility":"internal"}],"src":"5727:20:0"},"returnParameters":{"id":682,"nodeType":"ParameterList","parameters":[],"src":"5757:0:0"},"scope":706,"stateMutability":"nonpayable","virtual":false,"visibility":"external"},{"id":705,"nodeType":"FunctionDefinition","src":"5814:84:0","nodes":[],"body":{"id":704,"nodeType":"Block","src":"5866:32:0","nodes":[],"statements":[{"expression":{"arguments":[{"id":701,"name":"_v","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":695,"src":"5888:2:0","typeDescriptions":{"typeIdentifier":"t_string_calldata_ptr","typeString":"string calldata"}}],"expression":{"argumentTypes":[{"typeIdentifier":"t_string_calldata_ptr","typeString":"string calldata"}],"expression":{"id":698,"name":"console","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":192,"src":"5876:7:0","typeDescriptions":{"typeIdentifier":"t_type$_t_contract$_console_$192_$","typeString":"type(library console)"}},"id":700,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"memberName":"log","nodeType":"MemberAccess","referencedDeclaration":120,"src":"5876:11:0","typeDescriptions":{"typeIdentifier":"t_function_internal_pure$_t_string_memory_ptr_$returns$__$","typeString":"function (string memory) pure"}},"id":702,"isConstant":false,"isLValue":false,"isPure":false,"kind":"functionCall","lValueRequested":false,"names":[],"nodeType":"FunctionCall","src":"5876:15:0","tryCall":false,"typeDescriptions":{"typeIdentifier":"t_tuple$__$","typeString":"tuple()"}},"id":703,"nodeType":"ExpressionStatement","src":"5876:15:0"}]},"functionSelector":"7f8b915c","implemented":true,"kind":"function","modifiers":[],"name":"callPure","nameLocation":"5823:8:0","parameters":{"id":696,"nodeType":"ParameterList","parameters":[{"constant":false,"id":695,"mutability":"mutable","name":"_v","nameLocation":"5848:2:0","nodeType":"VariableDeclaration","scope":705,"src":"5832:18:0","stateVariable":false,"storageLocation":"calldata","typeDescriptions":{"typeIdentifier":"t_string_calldata_ptr","typeString":"string"},"typeName":{"id":694,"name":"string","nodeType":"ElementaryTypeName","src":"5832:6:0","typeDescriptions":{"typeIdentifier":"t_string_storage_ptr","typeString":"string"}},"visibility":"internal"}],"src":"5831:20:0"},"returnParameters":{"id":697,"nodeType":"ParameterList","parameters":[],"src":"5866:0:0"},"scope":706,"stateMutability":"pure","virtual":false,"visibility":"external"}],"abstract":false,"baseContracts":[],"canonicalName":"ScriptExample","contractDependencies":[719],"contractKind":"contract","documentation":{"id":193,"nodeType":"StructuredDocumentation","src":"2415:126:0","text":"@title ScriptExample\n @notice ScriptExample is an example script. The Go forge script code tests that it can run this."},"fullyImplemented":true,"linearizedBaseContracts":[706],"name":"ScriptExample","nameLocation":"2550:13:0","scope":720,"usedErrors":[]},{"id":719,"nodeType":"ContractDefinition","src":"5902:96:0","nodes":[{"id":708,"nodeType":"VariableDeclaration","src":"5924:18:0","nodes":[],"constant":false,"functionSelector":"c2985578","mutability":"mutable","name":"foo","nameLocation":"5939:3:0","scope":719,"stateVariable":true,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"},"typeName":{"id":707,"name":"uint256","nodeType":"ElementaryTypeName","src":"5924:7:0","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"visibility":"public"},{"id":718,"nodeType":"FunctionDefinition","src":"5949:47:0","nodes":[],"body":{"id":717,"nodeType":"Block","src":"5972:24:0","nodes":[],"statements":[{"expression":{"id":715,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"leftHandSide":{"id":713,"name":"foo","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":708,"src":"5982:3:0","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"nodeType":"Assignment","operator":"=","rightHandSide":{"id":714,"name":"v","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":710,"src":"5988:1:0","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"src":"5982:7:0","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"id":716,"nodeType":"ExpressionStatement","src":"5982:7:0"}]},"implemented":true,"kind":"constructor","modifiers":[],"name":"","nameLocation":"-1:-1:-1","parameters":{"id":711,"nodeType":"ParameterList","parameters":[{"constant":false,"id":710,"mutability":"mutable","name":"v","nameLocation":"5969:1:0","nodeType":"VariableDeclaration","scope":718,"src":"5961:9:0","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"},"typeName":{"id":709,"name":"uint256","nodeType":"ElementaryTypeName","src":"5961:7:0","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"visibility":"internal"}],"src":"5960:11:0"},"returnParameters":{"id":712,"nodeType":"ParameterList","parameters":[],"src":"5972:0:0"},"scope":719,"stateMutability":"nonpayable","virtual":false,"visibility":"public"}],"abstract":false,"baseContracts":[],"canonicalName":"FooBar","contractDependencies":[],"contractKind":"contract","fullyImplemented":true,"linearizedBaseContracts":[719],"name":"FooBar","nameLocation":"5911:6:0","scope":720,"usedErrors":[]}],"license":"MIT"},"id":0} \ No newline at end of file diff --git a/op-chain-ops/script/testdata/test-artifacts/ScriptExample.s.sol/console.json b/op-chain-ops/script/testdata/test-artifacts/ScriptExample.s.sol/console.json new file mode 100644 index 000000000000..390e798a4701 --- /dev/null +++ b/op-chain-ops/script/testdata/test-artifacts/ScriptExample.s.sol/console.json @@ -0,0 +1 @@ +{"abi":[],"bytecode":{"object":"0x602d6037600b82828239805160001a607314602a57634e487b7160e01b600052600060045260246000fd5b30600052607381538281f3fe73000000000000000000000000000000000000000030146080604052600080fdfea164736f6c634300080f000a","sourceMap":"791:1622:0:-:0;;;;;;;;;;;;;;;-1:-1:-1;;;791:1622:0;;;;;;;;;;;;;;;;;","linkReferences":{}},"deployedBytecode":{"object":"0x73000000000000000000000000000000000000000030146080604052600080fdfea164736f6c634300080f000a","sourceMap":"791:1622:0:-:0;;;;;;;;","linkReferences":{}},"methodIdentifiers":{},"rawMetadata":"{\"compiler\":{\"version\":\"0.8.15+commit.e14f2714\"},\"language\":\"Solidity\",\"output\":{\"abi\":[],\"devdoc\":{\"kind\":\"dev\",\"methods\":{},\"version\":1},\"userdoc\":{\"kind\":\"user\",\"methods\":{},\"version\":1}},\"settings\":{\"compilationTarget\":{\"scripts/ScriptExample.s.sol\":\"console\"},\"evmVersion\":\"london\",\"libraries\":{},\"metadata\":{\"bytecodeHash\":\"none\"},\"optimizer\":{\"enabled\":true,\"runs\":999999},\"remappings\":[]},\"sources\":{\"scripts/ScriptExample.s.sol\":{\"keccak256\":\"0x8d1dfa41908e7ccc3a498a2a2aa51c5275bedbb904ce32d08f8598e36f896d8d\",\"license\":\"MIT\",\"urls\":[\"bzz-raw://5117bb7158363cae8b9dc0508d2852692fd36172f1c699ff680afbb5acebe1f3\",\"dweb:/ipfs/QmQdahJ8SPKfJ4yea5Ge9qaj5qh1TxVffhHvaWytBaL95h\"]}},\"version\":1}","metadata":{"compiler":{"version":"0.8.15+commit.e14f2714"},"language":"Solidity","output":{"abi":[],"devdoc":{"kind":"dev","methods":{},"version":1},"userdoc":{"kind":"user","methods":{},"version":1}},"settings":{"remappings":[],"optimizer":{"enabled":true,"runs":999999},"metadata":{"bytecodeHash":"none"},"compilationTarget":{"scripts/ScriptExample.s.sol":"console"},"evmVersion":"london","libraries":{}},"sources":{"scripts/ScriptExample.s.sol":{"keccak256":"0x8d1dfa41908e7ccc3a498a2a2aa51c5275bedbb904ce32d08f8598e36f896d8d","urls":["bzz-raw://5117bb7158363cae8b9dc0508d2852692fd36172f1c699ff680afbb5acebe1f3","dweb:/ipfs/QmQdahJ8SPKfJ4yea5Ge9qaj5qh1TxVffhHvaWytBaL95h"],"license":"MIT"}},"version":1},"storageLayout":{"storage":[],"types":{}},"userdoc":{"version":1,"kind":"user"},"devdoc":{"version":1,"kind":"dev"},"ast":{"absolutePath":"scripts/ScriptExample.s.sol","id":720,"exportedSymbols":{"FooBar":[719],"ScriptExample":[706],"Vm":[55],"console":[192]},"nodeType":"SourceUnit","src":"32:5967:0","nodes":[{"id":1,"nodeType":"PragmaDirective","src":"32:23:0","nodes":[],"literals":["solidity","0.8",".15"]},{"id":55,"nodeType":"ContractDefinition","src":"120:616:0","nodes":[{"id":10,"nodeType":"FunctionDefinition","src":"139:91:0","nodes":[],"functionSelector":"4777f3cf","implemented":false,"kind":"function","modifiers":[],"name":"envOr","nameLocation":"148:5:0","parameters":{"id":6,"nodeType":"ParameterList","parameters":[{"constant":false,"id":3,"mutability":"mutable","name":"name","nameLocation":"170:4:0","nodeType":"VariableDeclaration","scope":10,"src":"154:20:0","stateVariable":false,"storageLocation":"calldata","typeDescriptions":{"typeIdentifier":"t_string_calldata_ptr","typeString":"string"},"typeName":{"id":2,"name":"string","nodeType":"ElementaryTypeName","src":"154:6:0","typeDescriptions":{"typeIdentifier":"t_string_storage_ptr","typeString":"string"}},"visibility":"internal"},{"constant":false,"id":5,"mutability":"mutable","name":"defaultValue","nameLocation":"181:12:0","nodeType":"VariableDeclaration","scope":10,"src":"176:17:0","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_bool","typeString":"bool"},"typeName":{"id":4,"name":"bool","nodeType":"ElementaryTypeName","src":"176:4:0","typeDescriptions":{"typeIdentifier":"t_bool","typeString":"bool"}},"visibility":"internal"}],"src":"153:41:0"},"returnParameters":{"id":9,"nodeType":"ParameterList","parameters":[{"constant":false,"id":8,"mutability":"mutable","name":"value","nameLocation":"223:5:0","nodeType":"VariableDeclaration","scope":10,"src":"218:10:0","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_bool","typeString":"bool"},"typeName":{"id":7,"name":"bool","nodeType":"ElementaryTypeName","src":"218:4:0","typeDescriptions":{"typeIdentifier":"t_bool","typeString":"bool"}},"visibility":"internal"}],"src":"217:12:0"},"scope":55,"stateMutability":"view","virtual":false,"visibility":"external"},{"id":17,"nodeType":"FunctionDefinition","src":"235:72:0","nodes":[],"functionSelector":"2d0335ab","implemented":false,"kind":"function","modifiers":[],"name":"getNonce","nameLocation":"244:8:0","parameters":{"id":13,"nodeType":"ParameterList","parameters":[{"constant":false,"id":12,"mutability":"mutable","name":"account","nameLocation":"261:7:0","nodeType":"VariableDeclaration","scope":17,"src":"253:15:0","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"},"typeName":{"id":11,"name":"address","nodeType":"ElementaryTypeName","src":"253:7:0","stateMutability":"nonpayable","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"}},"visibility":"internal"}],"src":"252:17:0"},"returnParameters":{"id":16,"nodeType":"ParameterList","parameters":[{"constant":false,"id":15,"mutability":"mutable","name":"nonce","nameLocation":"300:5:0","nodeType":"VariableDeclaration","scope":17,"src":"293:12:0","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_uint64","typeString":"uint64"},"typeName":{"id":14,"name":"uint64","nodeType":"ElementaryTypeName","src":"293:6:0","typeDescriptions":{"typeIdentifier":"t_uint64","typeString":"uint64"}},"visibility":"internal"}],"src":"292:14:0"},"scope":55,"stateMutability":"view","virtual":false,"visibility":"external"},{"id":27,"nodeType":"FunctionDefinition","src":"312:111:0","nodes":[],"functionSelector":"213e4198","implemented":false,"kind":"function","modifiers":[],"name":"parseJsonKeys","nameLocation":"321:13:0","parameters":{"id":22,"nodeType":"ParameterList","parameters":[{"constant":false,"id":19,"mutability":"mutable","name":"json","nameLocation":"351:4:0","nodeType":"VariableDeclaration","scope":27,"src":"335:20:0","stateVariable":false,"storageLocation":"calldata","typeDescriptions":{"typeIdentifier":"t_string_calldata_ptr","typeString":"string"},"typeName":{"id":18,"name":"string","nodeType":"ElementaryTypeName","src":"335:6:0","typeDescriptions":{"typeIdentifier":"t_string_storage_ptr","typeString":"string"}},"visibility":"internal"},{"constant":false,"id":21,"mutability":"mutable","name":"key","nameLocation":"373:3:0","nodeType":"VariableDeclaration","scope":27,"src":"357:19:0","stateVariable":false,"storageLocation":"calldata","typeDescriptions":{"typeIdentifier":"t_string_calldata_ptr","typeString":"string"},"typeName":{"id":20,"name":"string","nodeType":"ElementaryTypeName","src":"357:6:0","typeDescriptions":{"typeIdentifier":"t_string_storage_ptr","typeString":"string"}},"visibility":"internal"}],"src":"334:43:0"},"returnParameters":{"id":26,"nodeType":"ParameterList","parameters":[{"constant":false,"id":25,"mutability":"mutable","name":"keys","nameLocation":"417:4:0","nodeType":"VariableDeclaration","scope":27,"src":"401:20:0","stateVariable":false,"storageLocation":"memory","typeDescriptions":{"typeIdentifier":"t_array$_t_string_memory_ptr_$dyn_memory_ptr","typeString":"string[]"},"typeName":{"baseType":{"id":23,"name":"string","nodeType":"ElementaryTypeName","src":"401:6:0","typeDescriptions":{"typeIdentifier":"t_string_storage_ptr","typeString":"string"}},"id":24,"nodeType":"ArrayTypeName","src":"401:8:0","typeDescriptions":{"typeIdentifier":"t_array$_t_string_storage_$dyn_storage_ptr","typeString":"string[]"}},"visibility":"internal"}],"src":"400:22:0"},"scope":55,"stateMutability":"pure","virtual":false,"visibility":"external"},{"id":32,"nodeType":"FunctionDefinition","src":"428:48:0","nodes":[],"functionSelector":"06447d56","implemented":false,"kind":"function","modifiers":[],"name":"startPrank","nameLocation":"437:10:0","parameters":{"id":30,"nodeType":"ParameterList","parameters":[{"constant":false,"id":29,"mutability":"mutable","name":"msgSender","nameLocation":"456:9:0","nodeType":"VariableDeclaration","scope":32,"src":"448:17:0","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"},"typeName":{"id":28,"name":"address","nodeType":"ElementaryTypeName","src":"448:7:0","stateMutability":"nonpayable","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"}},"visibility":"internal"}],"src":"447:19:0"},"returnParameters":{"id":31,"nodeType":"ParameterList","parameters":[],"src":"475:0:0"},"scope":55,"stateMutability":"nonpayable","virtual":false,"visibility":"external"},{"id":35,"nodeType":"FunctionDefinition","src":"481:30:0","nodes":[],"functionSelector":"90c5013b","implemented":false,"kind":"function","modifiers":[],"name":"stopPrank","nameLocation":"490:9:0","parameters":{"id":33,"nodeType":"ParameterList","parameters":[],"src":"499:2:0"},"returnParameters":{"id":34,"nodeType":"ParameterList","parameters":[],"src":"510:0:0"},"scope":55,"stateMutability":"nonpayable","virtual":false,"visibility":"external"},{"id":38,"nodeType":"FunctionDefinition","src":"516:30:0","nodes":[],"functionSelector":"afc98040","implemented":false,"kind":"function","modifiers":[],"name":"broadcast","nameLocation":"525:9:0","parameters":{"id":36,"nodeType":"ParameterList","parameters":[],"src":"534:2:0"},"returnParameters":{"id":37,"nodeType":"ParameterList","parameters":[],"src":"545:0:0"},"scope":55,"stateMutability":"nonpayable","virtual":false,"visibility":"external"},{"id":43,"nodeType":"FunctionDefinition","src":"551:47:0","nodes":[],"functionSelector":"e6962cdb","implemented":false,"kind":"function","modifiers":[],"name":"broadcast","nameLocation":"560:9:0","parameters":{"id":41,"nodeType":"ParameterList","parameters":[{"constant":false,"id":40,"mutability":"mutable","name":"msgSender","nameLocation":"578:9:0","nodeType":"VariableDeclaration","scope":43,"src":"570:17:0","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"},"typeName":{"id":39,"name":"address","nodeType":"ElementaryTypeName","src":"570:7:0","stateMutability":"nonpayable","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"}},"visibility":"internal"}],"src":"569:19:0"},"returnParameters":{"id":42,"nodeType":"ParameterList","parameters":[],"src":"597:0:0"},"scope":55,"stateMutability":"nonpayable","virtual":false,"visibility":"external"},{"id":48,"nodeType":"FunctionDefinition","src":"603:52:0","nodes":[],"functionSelector":"7fec2a8d","implemented":false,"kind":"function","modifiers":[],"name":"startBroadcast","nameLocation":"612:14:0","parameters":{"id":46,"nodeType":"ParameterList","parameters":[{"constant":false,"id":45,"mutability":"mutable","name":"msgSender","nameLocation":"635:9:0","nodeType":"VariableDeclaration","scope":48,"src":"627:17:0","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"},"typeName":{"id":44,"name":"address","nodeType":"ElementaryTypeName","src":"627:7:0","stateMutability":"nonpayable","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"}},"visibility":"internal"}],"src":"626:19:0"},"returnParameters":{"id":47,"nodeType":"ParameterList","parameters":[],"src":"654:0:0"},"scope":55,"stateMutability":"nonpayable","virtual":false,"visibility":"external"},{"id":51,"nodeType":"FunctionDefinition","src":"660:35:0","nodes":[],"functionSelector":"7fb5297f","implemented":false,"kind":"function","modifiers":[],"name":"startBroadcast","nameLocation":"669:14:0","parameters":{"id":49,"nodeType":"ParameterList","parameters":[],"src":"683:2:0"},"returnParameters":{"id":50,"nodeType":"ParameterList","parameters":[],"src":"694:0:0"},"scope":55,"stateMutability":"nonpayable","virtual":false,"visibility":"external"},{"id":54,"nodeType":"FunctionDefinition","src":"700:34:0","nodes":[],"functionSelector":"76eadd36","implemented":false,"kind":"function","modifiers":[],"name":"stopBroadcast","nameLocation":"709:13:0","parameters":{"id":52,"nodeType":"ParameterList","parameters":[],"src":"722:2:0"},"returnParameters":{"id":53,"nodeType":"ParameterList","parameters":[],"src":"733:0:0"},"scope":55,"stateMutability":"nonpayable","virtual":false,"visibility":"external"}],"abstract":false,"baseContracts":[],"canonicalName":"Vm","contractDependencies":[],"contractKind":"interface","fullyImplemented":false,"linearizedBaseContracts":[55],"name":"Vm","nameLocation":"130:2:0","scope":720,"usedErrors":[]},{"id":192,"nodeType":"ContractDefinition","src":"791:1622:0","nodes":[{"id":61,"nodeType":"VariableDeclaration","src":"813:86:0","nodes":[],"constant":true,"mutability":"constant","name":"CONSOLE_ADDRESS","nameLocation":"830:15:0","scope":192,"stateVariable":true,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"},"typeName":{"id":56,"name":"address","nodeType":"ElementaryTypeName","src":"813:7:0","stateMutability":"nonpayable","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"}},"value":{"arguments":[{"hexValue":"307830303030303030303030303030303030303036333646366537333646366336353265366336663637","id":59,"isConstant":false,"isLValue":false,"isPure":true,"kind":"number","lValueRequested":false,"nodeType":"Literal","src":"856:42:0","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"},"value":"0x000000000000000000636F6e736F6c652e6c6f67"}],"expression":{"argumentTypes":[{"typeIdentifier":"t_address","typeString":"address"}],"id":58,"isConstant":false,"isLValue":false,"isPure":true,"lValueRequested":false,"nodeType":"ElementaryTypeNameExpression","src":"848:7:0","typeDescriptions":{"typeIdentifier":"t_type$_t_address_$","typeString":"type(address)"},"typeName":{"id":57,"name":"address","nodeType":"ElementaryTypeName","src":"848:7:0","typeDescriptions":{}}},"id":60,"isConstant":false,"isLValue":false,"isPure":true,"kind":"typeConversion","lValueRequested":false,"names":[],"nodeType":"FunctionCall","src":"848:51:0","tryCall":false,"typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"}},"visibility":"internal"},{"id":78,"nodeType":"FunctionDefinition","src":"906:221:0","nodes":[],"body":{"id":77,"nodeType":"Block","src":"1065:62:0","nodes":[],"statements":[{"AST":{"nodeType":"YulBlock","src":"1084:37:0","statements":[{"nodeType":"YulAssignment","src":"1098:13:0","value":{"name":"fnIn","nodeType":"YulIdentifier","src":"1107:4:0"},"variableNames":[{"name":"fnOut","nodeType":"YulIdentifier","src":"1098:5:0"}]}]},"evmVersion":"london","externalReferences":[{"declaration":67,"isOffset":false,"isSlot":false,"src":"1107:4:0","valueSize":1},{"declaration":74,"isOffset":false,"isSlot":false,"src":"1098:5:0","valueSize":1}],"id":76,"nodeType":"InlineAssembly","src":"1075:46:0"}]},"implemented":true,"kind":"function","modifiers":[],"name":"_castLogPayloadViewToPure","nameLocation":"915:25:0","parameters":{"id":68,"nodeType":"ParameterList","parameters":[{"constant":false,"id":67,"mutability":"mutable","name":"fnIn","nameLocation":"987:4:0","nodeType":"VariableDeclaration","scope":78,"src":"950:41:0","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_function_internal_view$_t_bytes_memory_ptr_$returns$__$","typeString":"function (bytes) view"},"typeName":{"id":66,"nodeType":"FunctionTypeName","parameterTypes":{"id":64,"nodeType":"ParameterList","parameters":[{"constant":false,"id":63,"mutability":"mutable","name":"","nameLocation":"-1:-1:-1","nodeType":"VariableDeclaration","scope":66,"src":"959:12:0","stateVariable":false,"storageLocation":"memory","typeDescriptions":{"typeIdentifier":"t_bytes_memory_ptr","typeString":"bytes"},"typeName":{"id":62,"name":"bytes","nodeType":"ElementaryTypeName","src":"959:5:0","typeDescriptions":{"typeIdentifier":"t_bytes_storage_ptr","typeString":"bytes"}},"visibility":"internal"}],"src":"958:14:0"},"returnParameterTypes":{"id":65,"nodeType":"ParameterList","parameters":[],"src":"987:0:0"},"src":"950:41:0","stateMutability":"view","typeDescriptions":{"typeIdentifier":"t_function_internal_view$_t_bytes_memory_ptr_$returns$__$","typeString":"function (bytes) view"},"visibility":"internal"},"visibility":"internal"}],"src":"940:57:0"},"returnParameters":{"id":75,"nodeType":"ParameterList","parameters":[{"constant":false,"id":74,"mutability":"mutable","name":"fnOut","nameLocation":"1058:5:0","nodeType":"VariableDeclaration","scope":78,"src":"1021:42:0","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_function_internal_pure$_t_bytes_memory_ptr_$returns$__$","typeString":"function (bytes) pure"},"typeName":{"id":73,"nodeType":"FunctionTypeName","parameterTypes":{"id":71,"nodeType":"ParameterList","parameters":[{"constant":false,"id":70,"mutability":"mutable","name":"","nameLocation":"-1:-1:-1","nodeType":"VariableDeclaration","scope":73,"src":"1030:12:0","stateVariable":false,"storageLocation":"memory","typeDescriptions":{"typeIdentifier":"t_bytes_memory_ptr","typeString":"bytes"},"typeName":{"id":69,"name":"bytes","nodeType":"ElementaryTypeName","src":"1030:5:0","typeDescriptions":{"typeIdentifier":"t_bytes_storage_ptr","typeString":"bytes"}},"visibility":"internal"}],"src":"1029:14:0"},"returnParameterTypes":{"id":72,"nodeType":"ParameterList","parameters":[],"src":"1058:0:0"},"src":"1021:42:0","stateMutability":"pure","typeDescriptions":{"typeIdentifier":"t_function_internal_pure$_t_bytes_memory_ptr_$returns$__$","typeString":"function (bytes) pure"},"visibility":"internal"},"visibility":"internal"}],"src":"1020:44:0"},"scope":192,"stateMutability":"pure","virtual":false,"visibility":"internal"},{"id":90,"nodeType":"FunctionDefinition","src":"1133:133:0","nodes":[],"body":{"id":89,"nodeType":"Block","src":"1194:72:0","nodes":[],"statements":[{"expression":{"arguments":[{"id":86,"name":"payload","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":80,"src":"1251:7:0","typeDescriptions":{"typeIdentifier":"t_bytes_memory_ptr","typeString":"bytes memory"}}],"expression":{"argumentTypes":[{"typeIdentifier":"t_bytes_memory_ptr","typeString":"bytes memory"}],"arguments":[{"id":84,"name":"_sendLogPayloadView","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":106,"src":"1230:19:0","typeDescriptions":{"typeIdentifier":"t_function_internal_view$_t_bytes_memory_ptr_$returns$__$","typeString":"function (bytes memory) view"}}],"expression":{"argumentTypes":[{"typeIdentifier":"t_function_internal_view$_t_bytes_memory_ptr_$returns$__$","typeString":"function (bytes memory) view"}],"id":83,"name":"_castLogPayloadViewToPure","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":78,"src":"1204:25:0","typeDescriptions":{"typeIdentifier":"t_function_internal_pure$_t_function_internal_view$_t_bytes_memory_ptr_$returns$__$_$returns$_t_function_internal_pure$_t_bytes_memory_ptr_$returns$__$_$","typeString":"function (function (bytes memory) view) pure returns (function (bytes memory) pure)"}},"id":85,"isConstant":false,"isLValue":false,"isPure":false,"kind":"functionCall","lValueRequested":false,"names":[],"nodeType":"FunctionCall","src":"1204:46:0","tryCall":false,"typeDescriptions":{"typeIdentifier":"t_function_internal_pure$_t_bytes_memory_ptr_$returns$__$","typeString":"function (bytes memory) pure"}},"id":87,"isConstant":false,"isLValue":false,"isPure":false,"kind":"functionCall","lValueRequested":false,"names":[],"nodeType":"FunctionCall","src":"1204:55:0","tryCall":false,"typeDescriptions":{"typeIdentifier":"t_tuple$__$","typeString":"tuple()"}},"id":88,"nodeType":"ExpressionStatement","src":"1204:55:0"}]},"implemented":true,"kind":"function","modifiers":[],"name":"_sendLogPayload","nameLocation":"1142:15:0","parameters":{"id":81,"nodeType":"ParameterList","parameters":[{"constant":false,"id":80,"mutability":"mutable","name":"payload","nameLocation":"1171:7:0","nodeType":"VariableDeclaration","scope":90,"src":"1158:20:0","stateVariable":false,"storageLocation":"memory","typeDescriptions":{"typeIdentifier":"t_bytes_memory_ptr","typeString":"bytes"},"typeName":{"id":79,"name":"bytes","nodeType":"ElementaryTypeName","src":"1158:5:0","typeDescriptions":{"typeIdentifier":"t_bytes_storage_ptr","typeString":"bytes"}},"visibility":"internal"}],"src":"1157:22:0"},"returnParameters":{"id":82,"nodeType":"ParameterList","parameters":[],"src":"1194:0:0"},"scope":192,"stateMutability":"pure","virtual":false,"visibility":"internal"},{"id":106,"nodeType":"FunctionDefinition","src":"1272:380:0","nodes":[],"body":{"id":105,"nodeType":"Block","src":"1336:316:0","nodes":[],"statements":[{"assignments":[96],"declarations":[{"constant":false,"id":96,"mutability":"mutable","name":"payloadLength","nameLocation":"1354:13:0","nodeType":"VariableDeclaration","scope":105,"src":"1346:21:0","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"},"typeName":{"id":95,"name":"uint256","nodeType":"ElementaryTypeName","src":"1346:7:0","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"visibility":"internal"}],"id":99,"initialValue":{"expression":{"id":97,"name":"payload","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":92,"src":"1370:7:0","typeDescriptions":{"typeIdentifier":"t_bytes_memory_ptr","typeString":"bytes memory"}},"id":98,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"memberName":"length","nodeType":"MemberAccess","src":"1370:14:0","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"nodeType":"VariableDeclarationStatement","src":"1346:38:0"},{"assignments":[101],"declarations":[{"constant":false,"id":101,"mutability":"mutable","name":"consoleAddress","nameLocation":"1402:14:0","nodeType":"VariableDeclaration","scope":105,"src":"1394:22:0","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"},"typeName":{"id":100,"name":"address","nodeType":"ElementaryTypeName","src":"1394:7:0","stateMutability":"nonpayable","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"}},"visibility":"internal"}],"id":103,"initialValue":{"id":102,"name":"CONSOLE_ADDRESS","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":61,"src":"1419:15:0","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"}},"nodeType":"VariableDeclarationStatement","src":"1394:40:0"},{"AST":{"nodeType":"YulBlock","src":"1496:150:0","statements":[{"nodeType":"YulVariableDeclaration","src":"1510:36:0","value":{"arguments":[{"name":"payload","nodeType":"YulIdentifier","src":"1534:7:0"},{"kind":"number","nodeType":"YulLiteral","src":"1543:2:0","type":"","value":"32"}],"functionName":{"name":"add","nodeType":"YulIdentifier","src":"1530:3:0"},"nodeType":"YulFunctionCall","src":"1530:16:0"},"variables":[{"name":"payloadStart","nodeType":"YulTypedName","src":"1514:12:0","type":""}]},{"nodeType":"YulVariableDeclaration","src":"1559:77:0","value":{"arguments":[{"arguments":[],"functionName":{"name":"gas","nodeType":"YulIdentifier","src":"1579:3:0"},"nodeType":"YulFunctionCall","src":"1579:5:0"},{"name":"consoleAddress","nodeType":"YulIdentifier","src":"1586:14:0"},{"name":"payloadStart","nodeType":"YulIdentifier","src":"1602:12:0"},{"name":"payloadLength","nodeType":"YulIdentifier","src":"1616:13:0"},{"kind":"number","nodeType":"YulLiteral","src":"1631:1:0","type":"","value":"0"},{"kind":"number","nodeType":"YulLiteral","src":"1634:1:0","type":"","value":"0"}],"functionName":{"name":"staticcall","nodeType":"YulIdentifier","src":"1568:10:0"},"nodeType":"YulFunctionCall","src":"1568:68:0"},"variables":[{"name":"r","nodeType":"YulTypedName","src":"1563:1:0","type":""}]}]},"documentation":"@solidity memory-safe-assembly","evmVersion":"london","externalReferences":[{"declaration":101,"isOffset":false,"isSlot":false,"src":"1586:14:0","valueSize":1},{"declaration":92,"isOffset":false,"isSlot":false,"src":"1534:7:0","valueSize":1},{"declaration":96,"isOffset":false,"isSlot":false,"src":"1616:13:0","valueSize":1}],"id":104,"nodeType":"InlineAssembly","src":"1487:159:0"}]},"implemented":true,"kind":"function","modifiers":[],"name":"_sendLogPayloadView","nameLocation":"1281:19:0","parameters":{"id":93,"nodeType":"ParameterList","parameters":[{"constant":false,"id":92,"mutability":"mutable","name":"payload","nameLocation":"1314:7:0","nodeType":"VariableDeclaration","scope":106,"src":"1301:20:0","stateVariable":false,"storageLocation":"memory","typeDescriptions":{"typeIdentifier":"t_bytes_memory_ptr","typeString":"bytes"},"typeName":{"id":91,"name":"bytes","nodeType":"ElementaryTypeName","src":"1301:5:0","typeDescriptions":{"typeIdentifier":"t_bytes_storage_ptr","typeString":"bytes"}},"visibility":"internal"}],"src":"1300:22:0"},"returnParameters":{"id":94,"nodeType":"ParameterList","parameters":[],"src":"1336:0:0"},"scope":192,"stateMutability":"view","virtual":false,"visibility":"private"},{"id":120,"nodeType":"FunctionDefinition","src":"1658:121:0","nodes":[],"body":{"id":119,"nodeType":"Block","src":"1703:76:0","nodes":[],"statements":[{"expression":{"arguments":[{"arguments":[{"hexValue":"6c6f6728737472696e6729","id":114,"isConstant":false,"isLValue":false,"isPure":true,"kind":"string","lValueRequested":false,"nodeType":"Literal","src":"1753:13:0","typeDescriptions":{"typeIdentifier":"t_stringliteral_41304facd9323d75b11bcdd609cb38effffdb05710f7caf0e9b16c6d9d709f50","typeString":"literal_string \"log(string)\""},"value":"log(string)"},{"id":115,"name":"p0","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":108,"src":"1768:2:0","typeDescriptions":{"typeIdentifier":"t_string_memory_ptr","typeString":"string memory"}}],"expression":{"argumentTypes":[{"typeIdentifier":"t_stringliteral_41304facd9323d75b11bcdd609cb38effffdb05710f7caf0e9b16c6d9d709f50","typeString":"literal_string \"log(string)\""},{"typeIdentifier":"t_string_memory_ptr","typeString":"string memory"}],"expression":{"id":112,"name":"abi","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":-1,"src":"1729:3:0","typeDescriptions":{"typeIdentifier":"t_magic_abi","typeString":"abi"}},"id":113,"isConstant":false,"isLValue":false,"isPure":true,"lValueRequested":false,"memberName":"encodeWithSignature","nodeType":"MemberAccess","src":"1729:23:0","typeDescriptions":{"typeIdentifier":"t_function_abiencodewithsignature_pure$_t_string_memory_ptr_$returns$_t_bytes_memory_ptr_$","typeString":"function (string memory) pure returns (bytes memory)"}},"id":116,"isConstant":false,"isLValue":false,"isPure":false,"kind":"functionCall","lValueRequested":false,"names":[],"nodeType":"FunctionCall","src":"1729:42:0","tryCall":false,"typeDescriptions":{"typeIdentifier":"t_bytes_memory_ptr","typeString":"bytes memory"}}],"expression":{"argumentTypes":[{"typeIdentifier":"t_bytes_memory_ptr","typeString":"bytes memory"}],"id":111,"name":"_sendLogPayload","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":90,"src":"1713:15:0","typeDescriptions":{"typeIdentifier":"t_function_internal_pure$_t_bytes_memory_ptr_$returns$__$","typeString":"function (bytes memory) pure"}},"id":117,"isConstant":false,"isLValue":false,"isPure":false,"kind":"functionCall","lValueRequested":false,"names":[],"nodeType":"FunctionCall","src":"1713:59:0","tryCall":false,"typeDescriptions":{"typeIdentifier":"t_tuple$__$","typeString":"tuple()"}},"id":118,"nodeType":"ExpressionStatement","src":"1713:59:0"}]},"implemented":true,"kind":"function","modifiers":[],"name":"log","nameLocation":"1667:3:0","parameters":{"id":109,"nodeType":"ParameterList","parameters":[{"constant":false,"id":108,"mutability":"mutable","name":"p0","nameLocation":"1685:2:0","nodeType":"VariableDeclaration","scope":120,"src":"1671:16:0","stateVariable":false,"storageLocation":"memory","typeDescriptions":{"typeIdentifier":"t_string_memory_ptr","typeString":"string"},"typeName":{"id":107,"name":"string","nodeType":"ElementaryTypeName","src":"1671:6:0","typeDescriptions":{"typeIdentifier":"t_string_storage_ptr","typeString":"string"}},"visibility":"internal"}],"src":"1670:18:0"},"returnParameters":{"id":110,"nodeType":"ParameterList","parameters":[],"src":"1703:0:0"},"scope":192,"stateMutability":"pure","virtual":false,"visibility":"internal"},{"id":137,"nodeType":"FunctionDefinition","src":"1785:139:0","nodes":[],"body":{"id":136,"nodeType":"Block","src":"1839:85:0","nodes":[],"statements":[{"expression":{"arguments":[{"arguments":[{"hexValue":"6c6f6728737472696e672c626f6f6c29","id":130,"isConstant":false,"isLValue":false,"isPure":true,"kind":"string","lValueRequested":false,"nodeType":"Literal","src":"1889:18:0","typeDescriptions":{"typeIdentifier":"t_stringliteral_c3b556354c088fbb43886eb83c2a04bc7089663f964d22be308197a236f5b870","typeString":"literal_string \"log(string,bool)\""},"value":"log(string,bool)"},{"id":131,"name":"p0","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":122,"src":"1909:2:0","typeDescriptions":{"typeIdentifier":"t_string_memory_ptr","typeString":"string memory"}},{"id":132,"name":"p1","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":124,"src":"1913:2:0","typeDescriptions":{"typeIdentifier":"t_bool","typeString":"bool"}}],"expression":{"argumentTypes":[{"typeIdentifier":"t_stringliteral_c3b556354c088fbb43886eb83c2a04bc7089663f964d22be308197a236f5b870","typeString":"literal_string \"log(string,bool)\""},{"typeIdentifier":"t_string_memory_ptr","typeString":"string memory"},{"typeIdentifier":"t_bool","typeString":"bool"}],"expression":{"id":128,"name":"abi","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":-1,"src":"1865:3:0","typeDescriptions":{"typeIdentifier":"t_magic_abi","typeString":"abi"}},"id":129,"isConstant":false,"isLValue":false,"isPure":true,"lValueRequested":false,"memberName":"encodeWithSignature","nodeType":"MemberAccess","src":"1865:23:0","typeDescriptions":{"typeIdentifier":"t_function_abiencodewithsignature_pure$_t_string_memory_ptr_$returns$_t_bytes_memory_ptr_$","typeString":"function (string memory) pure returns (bytes memory)"}},"id":133,"isConstant":false,"isLValue":false,"isPure":false,"kind":"functionCall","lValueRequested":false,"names":[],"nodeType":"FunctionCall","src":"1865:51:0","tryCall":false,"typeDescriptions":{"typeIdentifier":"t_bytes_memory_ptr","typeString":"bytes memory"}}],"expression":{"argumentTypes":[{"typeIdentifier":"t_bytes_memory_ptr","typeString":"bytes memory"}],"id":127,"name":"_sendLogPayload","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":90,"src":"1849:15:0","typeDescriptions":{"typeIdentifier":"t_function_internal_pure$_t_bytes_memory_ptr_$returns$__$","typeString":"function (bytes memory) pure"}},"id":134,"isConstant":false,"isLValue":false,"isPure":false,"kind":"functionCall","lValueRequested":false,"names":[],"nodeType":"FunctionCall","src":"1849:68:0","tryCall":false,"typeDescriptions":{"typeIdentifier":"t_tuple$__$","typeString":"tuple()"}},"id":135,"nodeType":"ExpressionStatement","src":"1849:68:0"}]},"implemented":true,"kind":"function","modifiers":[],"name":"log","nameLocation":"1794:3:0","parameters":{"id":125,"nodeType":"ParameterList","parameters":[{"constant":false,"id":122,"mutability":"mutable","name":"p0","nameLocation":"1812:2:0","nodeType":"VariableDeclaration","scope":137,"src":"1798:16:0","stateVariable":false,"storageLocation":"memory","typeDescriptions":{"typeIdentifier":"t_string_memory_ptr","typeString":"string"},"typeName":{"id":121,"name":"string","nodeType":"ElementaryTypeName","src":"1798:6:0","typeDescriptions":{"typeIdentifier":"t_string_storage_ptr","typeString":"string"}},"visibility":"internal"},{"constant":false,"id":124,"mutability":"mutable","name":"p1","nameLocation":"1821:2:0","nodeType":"VariableDeclaration","scope":137,"src":"1816:7:0","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_bool","typeString":"bool"},"typeName":{"id":123,"name":"bool","nodeType":"ElementaryTypeName","src":"1816:4:0","typeDescriptions":{"typeIdentifier":"t_bool","typeString":"bool"}},"visibility":"internal"}],"src":"1797:27:0"},"returnParameters":{"id":126,"nodeType":"ParameterList","parameters":[],"src":"1839:0:0"},"scope":192,"stateMutability":"pure","virtual":false,"visibility":"internal"},{"id":154,"nodeType":"FunctionDefinition","src":"1930:145:0","nodes":[],"body":{"id":153,"nodeType":"Block","src":"1987:88:0","nodes":[],"statements":[{"expression":{"arguments":[{"arguments":[{"hexValue":"6c6f6728737472696e672c75696e7432353629","id":147,"isConstant":false,"isLValue":false,"isPure":true,"kind":"string","lValueRequested":false,"nodeType":"Literal","src":"2037:21:0","typeDescriptions":{"typeIdentifier":"t_stringliteral_b60e72ccf6d57ab53eb84d7e94a9545806ed7f93c4d5673f11a64f03471e584e","typeString":"literal_string \"log(string,uint256)\""},"value":"log(string,uint256)"},{"id":148,"name":"p0","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":139,"src":"2060:2:0","typeDescriptions":{"typeIdentifier":"t_string_memory_ptr","typeString":"string memory"}},{"id":149,"name":"p1","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":141,"src":"2064:2:0","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}}],"expression":{"argumentTypes":[{"typeIdentifier":"t_stringliteral_b60e72ccf6d57ab53eb84d7e94a9545806ed7f93c4d5673f11a64f03471e584e","typeString":"literal_string \"log(string,uint256)\""},{"typeIdentifier":"t_string_memory_ptr","typeString":"string memory"},{"typeIdentifier":"t_uint256","typeString":"uint256"}],"expression":{"id":145,"name":"abi","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":-1,"src":"2013:3:0","typeDescriptions":{"typeIdentifier":"t_magic_abi","typeString":"abi"}},"id":146,"isConstant":false,"isLValue":false,"isPure":true,"lValueRequested":false,"memberName":"encodeWithSignature","nodeType":"MemberAccess","src":"2013:23:0","typeDescriptions":{"typeIdentifier":"t_function_abiencodewithsignature_pure$_t_string_memory_ptr_$returns$_t_bytes_memory_ptr_$","typeString":"function (string memory) pure returns (bytes memory)"}},"id":150,"isConstant":false,"isLValue":false,"isPure":false,"kind":"functionCall","lValueRequested":false,"names":[],"nodeType":"FunctionCall","src":"2013:54:0","tryCall":false,"typeDescriptions":{"typeIdentifier":"t_bytes_memory_ptr","typeString":"bytes memory"}}],"expression":{"argumentTypes":[{"typeIdentifier":"t_bytes_memory_ptr","typeString":"bytes memory"}],"id":144,"name":"_sendLogPayload","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":90,"src":"1997:15:0","typeDescriptions":{"typeIdentifier":"t_function_internal_pure$_t_bytes_memory_ptr_$returns$__$","typeString":"function (bytes memory) pure"}},"id":151,"isConstant":false,"isLValue":false,"isPure":false,"kind":"functionCall","lValueRequested":false,"names":[],"nodeType":"FunctionCall","src":"1997:71:0","tryCall":false,"typeDescriptions":{"typeIdentifier":"t_tuple$__$","typeString":"tuple()"}},"id":152,"nodeType":"ExpressionStatement","src":"1997:71:0"}]},"implemented":true,"kind":"function","modifiers":[],"name":"log","nameLocation":"1939:3:0","parameters":{"id":142,"nodeType":"ParameterList","parameters":[{"constant":false,"id":139,"mutability":"mutable","name":"p0","nameLocation":"1957:2:0","nodeType":"VariableDeclaration","scope":154,"src":"1943:16:0","stateVariable":false,"storageLocation":"memory","typeDescriptions":{"typeIdentifier":"t_string_memory_ptr","typeString":"string"},"typeName":{"id":138,"name":"string","nodeType":"ElementaryTypeName","src":"1943:6:0","typeDescriptions":{"typeIdentifier":"t_string_storage_ptr","typeString":"string"}},"visibility":"internal"},{"constant":false,"id":141,"mutability":"mutable","name":"p1","nameLocation":"1969:2:0","nodeType":"VariableDeclaration","scope":154,"src":"1961:10:0","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"},"typeName":{"id":140,"name":"uint256","nodeType":"ElementaryTypeName","src":"1961:7:0","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"visibility":"internal"}],"src":"1942:30:0"},"returnParameters":{"id":143,"nodeType":"ParameterList","parameters":[],"src":"1987:0:0"},"scope":192,"stateMutability":"pure","virtual":false,"visibility":"internal"},{"id":171,"nodeType":"FunctionDefinition","src":"2081:145:0","nodes":[],"body":{"id":170,"nodeType":"Block","src":"2138:88:0","nodes":[],"statements":[{"expression":{"arguments":[{"arguments":[{"hexValue":"6c6f6728737472696e672c6164647265737329","id":164,"isConstant":false,"isLValue":false,"isPure":true,"kind":"string","lValueRequested":false,"nodeType":"Literal","src":"2188:21:0","typeDescriptions":{"typeIdentifier":"t_stringliteral_319af333460570a1937bf195dd33445c0d0951c59127da6f1f038b9fdce3fd72","typeString":"literal_string \"log(string,address)\""},"value":"log(string,address)"},{"id":165,"name":"p0","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":156,"src":"2211:2:0","typeDescriptions":{"typeIdentifier":"t_string_memory_ptr","typeString":"string memory"}},{"id":166,"name":"p1","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":158,"src":"2215:2:0","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"}}],"expression":{"argumentTypes":[{"typeIdentifier":"t_stringliteral_319af333460570a1937bf195dd33445c0d0951c59127da6f1f038b9fdce3fd72","typeString":"literal_string \"log(string,address)\""},{"typeIdentifier":"t_string_memory_ptr","typeString":"string memory"},{"typeIdentifier":"t_address","typeString":"address"}],"expression":{"id":162,"name":"abi","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":-1,"src":"2164:3:0","typeDescriptions":{"typeIdentifier":"t_magic_abi","typeString":"abi"}},"id":163,"isConstant":false,"isLValue":false,"isPure":true,"lValueRequested":false,"memberName":"encodeWithSignature","nodeType":"MemberAccess","src":"2164:23:0","typeDescriptions":{"typeIdentifier":"t_function_abiencodewithsignature_pure$_t_string_memory_ptr_$returns$_t_bytes_memory_ptr_$","typeString":"function (string memory) pure returns (bytes memory)"}},"id":167,"isConstant":false,"isLValue":false,"isPure":false,"kind":"functionCall","lValueRequested":false,"names":[],"nodeType":"FunctionCall","src":"2164:54:0","tryCall":false,"typeDescriptions":{"typeIdentifier":"t_bytes_memory_ptr","typeString":"bytes memory"}}],"expression":{"argumentTypes":[{"typeIdentifier":"t_bytes_memory_ptr","typeString":"bytes memory"}],"id":161,"name":"_sendLogPayload","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":90,"src":"2148:15:0","typeDescriptions":{"typeIdentifier":"t_function_internal_pure$_t_bytes_memory_ptr_$returns$__$","typeString":"function (bytes memory) pure"}},"id":168,"isConstant":false,"isLValue":false,"isPure":false,"kind":"functionCall","lValueRequested":false,"names":[],"nodeType":"FunctionCall","src":"2148:71:0","tryCall":false,"typeDescriptions":{"typeIdentifier":"t_tuple$__$","typeString":"tuple()"}},"id":169,"nodeType":"ExpressionStatement","src":"2148:71:0"}]},"implemented":true,"kind":"function","modifiers":[],"name":"log","nameLocation":"2090:3:0","parameters":{"id":159,"nodeType":"ParameterList","parameters":[{"constant":false,"id":156,"mutability":"mutable","name":"p0","nameLocation":"2108:2:0","nodeType":"VariableDeclaration","scope":171,"src":"2094:16:0","stateVariable":false,"storageLocation":"memory","typeDescriptions":{"typeIdentifier":"t_string_memory_ptr","typeString":"string"},"typeName":{"id":155,"name":"string","nodeType":"ElementaryTypeName","src":"2094:6:0","typeDescriptions":{"typeIdentifier":"t_string_storage_ptr","typeString":"string"}},"visibility":"internal"},{"constant":false,"id":158,"mutability":"mutable","name":"p1","nameLocation":"2120:2:0","nodeType":"VariableDeclaration","scope":171,"src":"2112:10:0","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"},"typeName":{"id":157,"name":"address","nodeType":"ElementaryTypeName","src":"2112:7:0","stateMutability":"nonpayable","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"}},"visibility":"internal"}],"src":"2093:30:0"},"returnParameters":{"id":160,"nodeType":"ParameterList","parameters":[],"src":"2138:0:0"},"scope":192,"stateMutability":"pure","virtual":false,"visibility":"internal"},{"id":191,"nodeType":"FunctionDefinition","src":"2232:179:0","nodes":[],"body":{"id":190,"nodeType":"Block","src":"2313:98:0","nodes":[],"statements":[{"expression":{"arguments":[{"arguments":[{"hexValue":"6c6f6728737472696e672c737472696e672c737472696e6729","id":183,"isConstant":false,"isLValue":false,"isPure":true,"kind":"string","lValueRequested":false,"nodeType":"Literal","src":"2363:27:0","typeDescriptions":{"typeIdentifier":"t_stringliteral_2ced7cef693312206c21f0e92e3b54e2e16bf33db5eec350c78866822c665e1f","typeString":"literal_string \"log(string,string,string)\""},"value":"log(string,string,string)"},{"id":184,"name":"p0","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":173,"src":"2392:2:0","typeDescriptions":{"typeIdentifier":"t_string_memory_ptr","typeString":"string memory"}},{"id":185,"name":"p1","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":175,"src":"2396:2:0","typeDescriptions":{"typeIdentifier":"t_string_memory_ptr","typeString":"string memory"}},{"id":186,"name":"p2","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":177,"src":"2400:2:0","typeDescriptions":{"typeIdentifier":"t_string_memory_ptr","typeString":"string memory"}}],"expression":{"argumentTypes":[{"typeIdentifier":"t_stringliteral_2ced7cef693312206c21f0e92e3b54e2e16bf33db5eec350c78866822c665e1f","typeString":"literal_string \"log(string,string,string)\""},{"typeIdentifier":"t_string_memory_ptr","typeString":"string memory"},{"typeIdentifier":"t_string_memory_ptr","typeString":"string memory"},{"typeIdentifier":"t_string_memory_ptr","typeString":"string memory"}],"expression":{"id":181,"name":"abi","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":-1,"src":"2339:3:0","typeDescriptions":{"typeIdentifier":"t_magic_abi","typeString":"abi"}},"id":182,"isConstant":false,"isLValue":false,"isPure":true,"lValueRequested":false,"memberName":"encodeWithSignature","nodeType":"MemberAccess","src":"2339:23:0","typeDescriptions":{"typeIdentifier":"t_function_abiencodewithsignature_pure$_t_string_memory_ptr_$returns$_t_bytes_memory_ptr_$","typeString":"function (string memory) pure returns (bytes memory)"}},"id":187,"isConstant":false,"isLValue":false,"isPure":false,"kind":"functionCall","lValueRequested":false,"names":[],"nodeType":"FunctionCall","src":"2339:64:0","tryCall":false,"typeDescriptions":{"typeIdentifier":"t_bytes_memory_ptr","typeString":"bytes memory"}}],"expression":{"argumentTypes":[{"typeIdentifier":"t_bytes_memory_ptr","typeString":"bytes memory"}],"id":180,"name":"_sendLogPayload","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":90,"src":"2323:15:0","typeDescriptions":{"typeIdentifier":"t_function_internal_pure$_t_bytes_memory_ptr_$returns$__$","typeString":"function (bytes memory) pure"}},"id":188,"isConstant":false,"isLValue":false,"isPure":false,"kind":"functionCall","lValueRequested":false,"names":[],"nodeType":"FunctionCall","src":"2323:81:0","tryCall":false,"typeDescriptions":{"typeIdentifier":"t_tuple$__$","typeString":"tuple()"}},"id":189,"nodeType":"ExpressionStatement","src":"2323:81:0"}]},"implemented":true,"kind":"function","modifiers":[],"name":"log","nameLocation":"2241:3:0","parameters":{"id":178,"nodeType":"ParameterList","parameters":[{"constant":false,"id":173,"mutability":"mutable","name":"p0","nameLocation":"2259:2:0","nodeType":"VariableDeclaration","scope":191,"src":"2245:16:0","stateVariable":false,"storageLocation":"memory","typeDescriptions":{"typeIdentifier":"t_string_memory_ptr","typeString":"string"},"typeName":{"id":172,"name":"string","nodeType":"ElementaryTypeName","src":"2245:6:0","typeDescriptions":{"typeIdentifier":"t_string_storage_ptr","typeString":"string"}},"visibility":"internal"},{"constant":false,"id":175,"mutability":"mutable","name":"p1","nameLocation":"2277:2:0","nodeType":"VariableDeclaration","scope":191,"src":"2263:16:0","stateVariable":false,"storageLocation":"memory","typeDescriptions":{"typeIdentifier":"t_string_memory_ptr","typeString":"string"},"typeName":{"id":174,"name":"string","nodeType":"ElementaryTypeName","src":"2263:6:0","typeDescriptions":{"typeIdentifier":"t_string_storage_ptr","typeString":"string"}},"visibility":"internal"},{"constant":false,"id":177,"mutability":"mutable","name":"p2","nameLocation":"2295:2:0","nodeType":"VariableDeclaration","scope":191,"src":"2281:16:0","stateVariable":false,"storageLocation":"memory","typeDescriptions":{"typeIdentifier":"t_string_memory_ptr","typeString":"string"},"typeName":{"id":176,"name":"string","nodeType":"ElementaryTypeName","src":"2281:6:0","typeDescriptions":{"typeIdentifier":"t_string_storage_ptr","typeString":"string"}},"visibility":"internal"}],"src":"2244:54:0"},"returnParameters":{"id":179,"nodeType":"ParameterList","parameters":[],"src":"2313:0:0"},"scope":192,"stateMutability":"pure","virtual":false,"visibility":"internal"}],"abstract":false,"baseContracts":[],"canonicalName":"console","contractDependencies":[],"contractKind":"library","fullyImplemented":true,"linearizedBaseContracts":[192],"name":"console","nameLocation":"799:7:0","scope":720,"usedErrors":[]},{"id":706,"nodeType":"ContractDefinition","src":"2541:3359:0","nodes":[{"id":207,"nodeType":"VariableDeclaration","src":"2571:94:0","nodes":[],"constant":true,"mutability":"constant","name":"VM_ADDRESS","nameLocation":"2597:10:0","scope":706,"stateVariable":true,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"},"typeName":{"id":194,"name":"address","nodeType":"ElementaryTypeName","src":"2571:7:0","stateMutability":"nonpayable","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"}},"value":{"arguments":[{"arguments":[{"arguments":[{"arguments":[{"hexValue":"6865766d20636865617420636f6465","id":202,"isConstant":false,"isLValue":false,"isPure":true,"kind":"string","lValueRequested":false,"nodeType":"Literal","src":"2644:17:0","typeDescriptions":{"typeIdentifier":"t_stringliteral_885cb69240a935d632d79c317109709ecfa91a80626ff3989d68f67f5b1dd12d","typeString":"literal_string \"hevm cheat code\""},"value":"hevm cheat code"}],"expression":{"argumentTypes":[{"typeIdentifier":"t_stringliteral_885cb69240a935d632d79c317109709ecfa91a80626ff3989d68f67f5b1dd12d","typeString":"literal_string \"hevm cheat code\""}],"id":201,"name":"keccak256","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":-8,"src":"2634:9:0","typeDescriptions":{"typeIdentifier":"t_function_keccak256_pure$_t_bytes_memory_ptr_$returns$_t_bytes32_$","typeString":"function (bytes memory) pure returns (bytes32)"}},"id":203,"isConstant":false,"isLValue":false,"isPure":true,"kind":"functionCall","lValueRequested":false,"names":[],"nodeType":"FunctionCall","src":"2634:28:0","tryCall":false,"typeDescriptions":{"typeIdentifier":"t_bytes32","typeString":"bytes32"}}],"expression":{"argumentTypes":[{"typeIdentifier":"t_bytes32","typeString":"bytes32"}],"id":200,"isConstant":false,"isLValue":false,"isPure":true,"lValueRequested":false,"nodeType":"ElementaryTypeNameExpression","src":"2626:7:0","typeDescriptions":{"typeIdentifier":"t_type$_t_uint256_$","typeString":"type(uint256)"},"typeName":{"id":199,"name":"uint256","nodeType":"ElementaryTypeName","src":"2626:7:0","typeDescriptions":{}}},"id":204,"isConstant":false,"isLValue":false,"isPure":true,"kind":"typeConversion","lValueRequested":false,"names":[],"nodeType":"FunctionCall","src":"2626:37:0","tryCall":false,"typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}}],"expression":{"argumentTypes":[{"typeIdentifier":"t_uint256","typeString":"uint256"}],"id":198,"isConstant":false,"isLValue":false,"isPure":true,"lValueRequested":false,"nodeType":"ElementaryTypeNameExpression","src":"2618:7:0","typeDescriptions":{"typeIdentifier":"t_type$_t_uint160_$","typeString":"type(uint160)"},"typeName":{"id":197,"name":"uint160","nodeType":"ElementaryTypeName","src":"2618:7:0","typeDescriptions":{}}},"id":205,"isConstant":false,"isLValue":false,"isPure":true,"kind":"typeConversion","lValueRequested":false,"names":[],"nodeType":"FunctionCall","src":"2618:46:0","tryCall":false,"typeDescriptions":{"typeIdentifier":"t_uint160","typeString":"uint160"}}],"expression":{"argumentTypes":[{"typeIdentifier":"t_uint160","typeString":"uint160"}],"id":196,"isConstant":false,"isLValue":false,"isPure":true,"lValueRequested":false,"nodeType":"ElementaryTypeNameExpression","src":"2610:7:0","typeDescriptions":{"typeIdentifier":"t_type$_t_address_$","typeString":"type(address)"},"typeName":{"id":195,"name":"address","nodeType":"ElementaryTypeName","src":"2610:7:0","typeDescriptions":{}}},"id":206,"isConstant":false,"isLValue":false,"isPure":true,"kind":"typeConversion","lValueRequested":false,"names":[],"nodeType":"FunctionCall","src":"2610:55:0","tryCall":false,"typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"}},"visibility":"internal"},{"id":213,"nodeType":"VariableDeclaration","src":"2671:40:0","nodes":[],"constant":true,"mutability":"constant","name":"vm","nameLocation":"2692:2:0","scope":706,"stateVariable":true,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_contract$_Vm_$55","typeString":"contract Vm"},"typeName":{"id":209,"nodeType":"UserDefinedTypeName","pathNode":{"id":208,"name":"Vm","nodeType":"IdentifierPath","referencedDeclaration":55,"src":"2671:2:0"},"referencedDeclaration":55,"src":"2671:2:0","typeDescriptions":{"typeIdentifier":"t_contract$_Vm_$55","typeString":"contract Vm"}},"value":{"arguments":[{"id":211,"name":"VM_ADDRESS","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":207,"src":"2700:10:0","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"}}],"expression":{"argumentTypes":[{"typeIdentifier":"t_address","typeString":"address"}],"id":210,"name":"Vm","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":55,"src":"2697:2:0","typeDescriptions":{"typeIdentifier":"t_type$_t_contract$_Vm_$55_$","typeString":"type(contract Vm)"}},"id":212,"isConstant":false,"isLValue":false,"isPure":true,"kind":"typeConversion","lValueRequested":false,"names":[],"nodeType":"FunctionCall","src":"2697:14:0","tryCall":false,"typeDescriptions":{"typeIdentifier":"t_contract$_Vm_$55","typeString":"contract Vm"}},"visibility":"internal"},{"id":215,"nodeType":"VariableDeclaration","src":"2775:22:0","nodes":[],"constant":false,"functionSelector":"61bc221a","mutability":"mutable","name":"counter","nameLocation":"2790:7:0","scope":706,"stateVariable":true,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"},"typeName":{"id":214,"name":"uint256","nodeType":"ElementaryTypeName","src":"2775:7:0","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"visibility":"public"},{"id":378,"nodeType":"FunctionDefinition","src":"2887:949:0","nodes":[],"body":{"id":377,"nodeType":"Block","src":"2909:927:0","nodes":[],"statements":[{"assignments":[220],"declarations":[{"constant":false,"id":220,"mutability":"mutable","name":"x","nameLocation":"2924:1:0","nodeType":"VariableDeclaration","scope":377,"src":"2919:6:0","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_bool","typeString":"bool"},"typeName":{"id":219,"name":"bool","nodeType":"ElementaryTypeName","src":"2919:4:0","typeDescriptions":{"typeIdentifier":"t_bool","typeString":"bool"}},"visibility":"internal"}],"id":226,"initialValue":{"arguments":[{"hexValue":"4558414d504c455f424f4f4c","id":223,"isConstant":false,"isLValue":false,"isPure":true,"kind":"string","lValueRequested":false,"nodeType":"Literal","src":"2937:14:0","typeDescriptions":{"typeIdentifier":"t_stringliteral_a634dae177a0e138ae7aaa2afae347412e148992e88c7aabd33ee71be146cb7f","typeString":"literal_string \"EXAMPLE_BOOL\""},"value":"EXAMPLE_BOOL"},{"hexValue":"66616c7365","id":224,"isConstant":false,"isLValue":false,"isPure":true,"kind":"bool","lValueRequested":false,"nodeType":"Literal","src":"2953:5:0","typeDescriptions":{"typeIdentifier":"t_bool","typeString":"bool"},"value":"false"}],"expression":{"argumentTypes":[{"typeIdentifier":"t_stringliteral_a634dae177a0e138ae7aaa2afae347412e148992e88c7aabd33ee71be146cb7f","typeString":"literal_string \"EXAMPLE_BOOL\""},{"typeIdentifier":"t_bool","typeString":"bool"}],"expression":{"id":221,"name":"vm","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":213,"src":"2928:2:0","typeDescriptions":{"typeIdentifier":"t_contract$_Vm_$55","typeString":"contract Vm"}},"id":222,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"memberName":"envOr","nodeType":"MemberAccess","referencedDeclaration":10,"src":"2928:8:0","typeDescriptions":{"typeIdentifier":"t_function_external_view$_t_string_memory_ptr_$_t_bool_$returns$_t_bool_$","typeString":"function (string memory,bool) view external returns (bool)"}},"id":225,"isConstant":false,"isLValue":false,"isPure":false,"kind":"functionCall","lValueRequested":false,"names":[],"nodeType":"FunctionCall","src":"2928:31:0","tryCall":false,"typeDescriptions":{"typeIdentifier":"t_bool","typeString":"bool"}},"nodeType":"VariableDeclarationStatement","src":"2919:40:0"},{"expression":{"arguments":[{"hexValue":"626f6f6c2076616c75652066726f6d20656e76","id":230,"isConstant":false,"isLValue":false,"isPure":true,"kind":"string","lValueRequested":false,"nodeType":"Literal","src":"2981:21:0","typeDescriptions":{"typeIdentifier":"t_stringliteral_5a607d0b5a1295325aa8901721d78ba402601bba6f62cebdd5235dd0204a590b","typeString":"literal_string \"bool value from env\""},"value":"bool value from env"},{"id":231,"name":"x","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":220,"src":"3004:1:0","typeDescriptions":{"typeIdentifier":"t_bool","typeString":"bool"}}],"expression":{"argumentTypes":[{"typeIdentifier":"t_stringliteral_5a607d0b5a1295325aa8901721d78ba402601bba6f62cebdd5235dd0204a590b","typeString":"literal_string \"bool value from env\""},{"typeIdentifier":"t_bool","typeString":"bool"}],"expression":{"id":227,"name":"console","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":192,"src":"2969:7:0","typeDescriptions":{"typeIdentifier":"t_type$_t_contract$_console_$192_$","typeString":"type(library console)"}},"id":229,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"memberName":"log","nodeType":"MemberAccess","referencedDeclaration":137,"src":"2969:11:0","typeDescriptions":{"typeIdentifier":"t_function_internal_pure$_t_string_memory_ptr_$_t_bool_$returns$__$","typeString":"function (string memory,bool) pure"}},"id":232,"isConstant":false,"isLValue":false,"isPure":false,"kind":"functionCall","lValueRequested":false,"names":[],"nodeType":"FunctionCall","src":"2969:37:0","tryCall":false,"typeDescriptions":{"typeIdentifier":"t_tuple$__$","typeString":"tuple()"}},"id":233,"nodeType":"ExpressionStatement","src":"2969:37:0"},{"expression":{"arguments":[{"hexValue":"636f6e74726163742061646472","id":237,"isConstant":false,"isLValue":false,"isPure":true,"kind":"string","lValueRequested":false,"nodeType":"Literal","src":"3029:15:0","typeDescriptions":{"typeIdentifier":"t_stringliteral_fa50728770d00fe8f6a0592f3565bbfaf063ee4077f1f5bbc003d091d33cd0c4","typeString":"literal_string \"contract addr\""},"value":"contract addr"},{"arguments":[{"id":240,"name":"this","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":-28,"src":"3054:4:0","typeDescriptions":{"typeIdentifier":"t_contract$_ScriptExample_$706","typeString":"contract ScriptExample"}}],"expression":{"argumentTypes":[{"typeIdentifier":"t_contract$_ScriptExample_$706","typeString":"contract ScriptExample"}],"id":239,"isConstant":false,"isLValue":false,"isPure":true,"lValueRequested":false,"nodeType":"ElementaryTypeNameExpression","src":"3046:7:0","typeDescriptions":{"typeIdentifier":"t_type$_t_address_$","typeString":"type(address)"},"typeName":{"id":238,"name":"address","nodeType":"ElementaryTypeName","src":"3046:7:0","typeDescriptions":{}}},"id":241,"isConstant":false,"isLValue":false,"isPure":false,"kind":"typeConversion","lValueRequested":false,"names":[],"nodeType":"FunctionCall","src":"3046:13:0","tryCall":false,"typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"}}],"expression":{"argumentTypes":[{"typeIdentifier":"t_stringliteral_fa50728770d00fe8f6a0592f3565bbfaf063ee4077f1f5bbc003d091d33cd0c4","typeString":"literal_string \"contract addr\""},{"typeIdentifier":"t_address","typeString":"address"}],"expression":{"id":234,"name":"console","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":192,"src":"3017:7:0","typeDescriptions":{"typeIdentifier":"t_type$_t_contract$_console_$192_$","typeString":"type(library console)"}},"id":236,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"memberName":"log","nodeType":"MemberAccess","referencedDeclaration":171,"src":"3017:11:0","typeDescriptions":{"typeIdentifier":"t_function_internal_pure$_t_string_memory_ptr_$_t_address_$returns$__$","typeString":"function (string memory,address) pure"}},"id":242,"isConstant":false,"isLValue":false,"isPure":false,"kind":"functionCall","lValueRequested":false,"names":[],"nodeType":"FunctionCall","src":"3017:43:0","tryCall":false,"typeDescriptions":{"typeIdentifier":"t_tuple$__$","typeString":"tuple()"}},"id":243,"nodeType":"ExpressionStatement","src":"3017:43:0"},{"expression":{"arguments":[{"hexValue":"636f6e7472616374206e6f6e6365","id":247,"isConstant":false,"isLValue":false,"isPure":true,"kind":"string","lValueRequested":false,"nodeType":"Literal","src":"3082:16:0","typeDescriptions":{"typeIdentifier":"t_stringliteral_3a23091615a5de8c0a35ffd8857a37e2c4e0b72f3ef8a34d6caf65efcd562e2f","typeString":"literal_string \"contract nonce\""},"value":"contract nonce"},{"arguments":[{"arguments":[{"id":252,"name":"this","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":-28,"src":"3120:4:0","typeDescriptions":{"typeIdentifier":"t_contract$_ScriptExample_$706","typeString":"contract ScriptExample"}}],"expression":{"argumentTypes":[{"typeIdentifier":"t_contract$_ScriptExample_$706","typeString":"contract ScriptExample"}],"id":251,"isConstant":false,"isLValue":false,"isPure":true,"lValueRequested":false,"nodeType":"ElementaryTypeNameExpression","src":"3112:7:0","typeDescriptions":{"typeIdentifier":"t_type$_t_address_$","typeString":"type(address)"},"typeName":{"id":250,"name":"address","nodeType":"ElementaryTypeName","src":"3112:7:0","typeDescriptions":{}}},"id":253,"isConstant":false,"isLValue":false,"isPure":false,"kind":"typeConversion","lValueRequested":false,"names":[],"nodeType":"FunctionCall","src":"3112:13:0","tryCall":false,"typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"}}],"expression":{"argumentTypes":[{"typeIdentifier":"t_address","typeString":"address"}],"expression":{"id":248,"name":"vm","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":213,"src":"3100:2:0","typeDescriptions":{"typeIdentifier":"t_contract$_Vm_$55","typeString":"contract Vm"}},"id":249,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"memberName":"getNonce","nodeType":"MemberAccess","referencedDeclaration":17,"src":"3100:11:0","typeDescriptions":{"typeIdentifier":"t_function_external_view$_t_address_$returns$_t_uint64_$","typeString":"function (address) view external returns (uint64)"}},"id":254,"isConstant":false,"isLValue":false,"isPure":false,"kind":"functionCall","lValueRequested":false,"names":[],"nodeType":"FunctionCall","src":"3100:26:0","tryCall":false,"typeDescriptions":{"typeIdentifier":"t_uint64","typeString":"uint64"}}],"expression":{"argumentTypes":[{"typeIdentifier":"t_stringliteral_3a23091615a5de8c0a35ffd8857a37e2c4e0b72f3ef8a34d6caf65efcd562e2f","typeString":"literal_string \"contract nonce\""},{"typeIdentifier":"t_uint64","typeString":"uint64"}],"expression":{"id":244,"name":"console","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":192,"src":"3070:7:0","typeDescriptions":{"typeIdentifier":"t_type$_t_contract$_console_$192_$","typeString":"type(library console)"}},"id":246,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"memberName":"log","nodeType":"MemberAccess","referencedDeclaration":154,"src":"3070:11:0","typeDescriptions":{"typeIdentifier":"t_function_internal_pure$_t_string_memory_ptr_$_t_uint256_$returns$__$","typeString":"function (string memory,uint256) pure"}},"id":255,"isConstant":false,"isLValue":false,"isPure":false,"kind":"functionCall","lValueRequested":false,"names":[],"nodeType":"FunctionCall","src":"3070:57:0","tryCall":false,"typeDescriptions":{"typeIdentifier":"t_tuple$__$","typeString":"tuple()"}},"id":256,"nodeType":"ExpressionStatement","src":"3070:57:0"},{"expression":{"arguments":[{"hexValue":"73656e6465722061646472","id":260,"isConstant":false,"isLValue":false,"isPure":true,"kind":"string","lValueRequested":false,"nodeType":"Literal","src":"3149:13:0","typeDescriptions":{"typeIdentifier":"t_stringliteral_8125ca2decf812b25b65606ff16dad37cb198ff0433485a7926e50feafacfc35","typeString":"literal_string \"sender addr\""},"value":"sender addr"},{"arguments":[{"expression":{"id":263,"name":"msg","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":-15,"src":"3172:3:0","typeDescriptions":{"typeIdentifier":"t_magic_message","typeString":"msg"}},"id":264,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"memberName":"sender","nodeType":"MemberAccess","src":"3172:10:0","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"}}],"expression":{"argumentTypes":[{"typeIdentifier":"t_address","typeString":"address"}],"id":262,"isConstant":false,"isLValue":false,"isPure":true,"lValueRequested":false,"nodeType":"ElementaryTypeNameExpression","src":"3164:7:0","typeDescriptions":{"typeIdentifier":"t_type$_t_address_$","typeString":"type(address)"},"typeName":{"id":261,"name":"address","nodeType":"ElementaryTypeName","src":"3164:7:0","typeDescriptions":{}}},"id":265,"isConstant":false,"isLValue":false,"isPure":false,"kind":"typeConversion","lValueRequested":false,"names":[],"nodeType":"FunctionCall","src":"3164:19:0","tryCall":false,"typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"}}],"expression":{"argumentTypes":[{"typeIdentifier":"t_stringliteral_8125ca2decf812b25b65606ff16dad37cb198ff0433485a7926e50feafacfc35","typeString":"literal_string \"sender addr\""},{"typeIdentifier":"t_address","typeString":"address"}],"expression":{"id":257,"name":"console","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":192,"src":"3137:7:0","typeDescriptions":{"typeIdentifier":"t_type$_t_contract$_console_$192_$","typeString":"type(library console)"}},"id":259,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"memberName":"log","nodeType":"MemberAccess","referencedDeclaration":171,"src":"3137:11:0","typeDescriptions":{"typeIdentifier":"t_function_internal_pure$_t_string_memory_ptr_$_t_address_$returns$__$","typeString":"function (string memory,address) pure"}},"id":266,"isConstant":false,"isLValue":false,"isPure":false,"kind":"functionCall","lValueRequested":false,"names":[],"nodeType":"FunctionCall","src":"3137:47:0","tryCall":false,"typeDescriptions":{"typeIdentifier":"t_tuple$__$","typeString":"tuple()"}},"id":267,"nodeType":"ExpressionStatement","src":"3137:47:0"},{"expression":{"arguments":[{"hexValue":"73656e646572206e6f6e6365","id":271,"isConstant":false,"isLValue":false,"isPure":true,"kind":"string","lValueRequested":false,"nodeType":"Literal","src":"3206:14:0","typeDescriptions":{"typeIdentifier":"t_stringliteral_db7deb43f2f9e0404016de53b7e64c4976b54149581f7534daae2551e8cf4e40","typeString":"literal_string \"sender nonce\""},"value":"sender nonce"},{"arguments":[{"arguments":[{"expression":{"id":276,"name":"msg","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":-15,"src":"3242:3:0","typeDescriptions":{"typeIdentifier":"t_magic_message","typeString":"msg"}},"id":277,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"memberName":"sender","nodeType":"MemberAccess","src":"3242:10:0","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"}}],"expression":{"argumentTypes":[{"typeIdentifier":"t_address","typeString":"address"}],"id":275,"isConstant":false,"isLValue":false,"isPure":true,"lValueRequested":false,"nodeType":"ElementaryTypeNameExpression","src":"3234:7:0","typeDescriptions":{"typeIdentifier":"t_type$_t_address_$","typeString":"type(address)"},"typeName":{"id":274,"name":"address","nodeType":"ElementaryTypeName","src":"3234:7:0","typeDescriptions":{}}},"id":278,"isConstant":false,"isLValue":false,"isPure":false,"kind":"typeConversion","lValueRequested":false,"names":[],"nodeType":"FunctionCall","src":"3234:19:0","tryCall":false,"typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"}}],"expression":{"argumentTypes":[{"typeIdentifier":"t_address","typeString":"address"}],"expression":{"id":272,"name":"vm","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":213,"src":"3222:2:0","typeDescriptions":{"typeIdentifier":"t_contract$_Vm_$55","typeString":"contract Vm"}},"id":273,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"memberName":"getNonce","nodeType":"MemberAccess","referencedDeclaration":17,"src":"3222:11:0","typeDescriptions":{"typeIdentifier":"t_function_external_view$_t_address_$returns$_t_uint64_$","typeString":"function (address) view external returns (uint64)"}},"id":279,"isConstant":false,"isLValue":false,"isPure":false,"kind":"functionCall","lValueRequested":false,"names":[],"nodeType":"FunctionCall","src":"3222:32:0","tryCall":false,"typeDescriptions":{"typeIdentifier":"t_uint64","typeString":"uint64"}}],"expression":{"argumentTypes":[{"typeIdentifier":"t_stringliteral_db7deb43f2f9e0404016de53b7e64c4976b54149581f7534daae2551e8cf4e40","typeString":"literal_string \"sender nonce\""},{"typeIdentifier":"t_uint64","typeString":"uint64"}],"expression":{"id":268,"name":"console","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":192,"src":"3194:7:0","typeDescriptions":{"typeIdentifier":"t_type$_t_contract$_console_$192_$","typeString":"type(library console)"}},"id":270,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"memberName":"log","nodeType":"MemberAccess","referencedDeclaration":154,"src":"3194:11:0","typeDescriptions":{"typeIdentifier":"t_function_internal_pure$_t_string_memory_ptr_$_t_uint256_$returns$__$","typeString":"function (string memory,uint256) pure"}},"id":280,"isConstant":false,"isLValue":false,"isPure":false,"kind":"functionCall","lValueRequested":false,"names":[],"nodeType":"FunctionCall","src":"3194:61:0","tryCall":false,"typeDescriptions":{"typeIdentifier":"t_tuple$__$","typeString":"tuple()"}},"id":281,"nodeType":"ExpressionStatement","src":"3194:61:0"},{"assignments":[283],"declarations":[{"constant":false,"id":283,"mutability":"mutable","name":"json","nameLocation":"3280:4:0","nodeType":"VariableDeclaration","scope":377,"src":"3266:18:0","stateVariable":false,"storageLocation":"memory","typeDescriptions":{"typeIdentifier":"t_string_memory_ptr","typeString":"string"},"typeName":{"id":282,"name":"string","nodeType":"ElementaryTypeName","src":"3266:6:0","typeDescriptions":{"typeIdentifier":"t_string_storage_ptr","typeString":"string"}},"visibility":"internal"}],"id":285,"initialValue":{"hexValue":"7b22726f6f745f6b6579223a205b7b2261223a20312c202262223a20327d5d7d","id":284,"isConstant":false,"isLValue":false,"isPure":true,"kind":"string","lValueRequested":false,"nodeType":"Literal","src":"3287:34:0","typeDescriptions":{"typeIdentifier":"t_stringliteral_e95522e99766888d0261f55bd1eae5e3f3e26eaf009a16e2433eafaf0a4ecdf2","typeString":"literal_string \"{\"root_key\": [{\"a\": 1, \"b\": 2}]}\""},"value":"{\"root_key\": [{\"a\": 1, \"b\": 2}]}"},"nodeType":"VariableDeclarationStatement","src":"3266:55:0"},{"assignments":[290],"declarations":[{"constant":false,"id":290,"mutability":"mutable","name":"keys","nameLocation":"3347:4:0","nodeType":"VariableDeclaration","scope":377,"src":"3331:20:0","stateVariable":false,"storageLocation":"memory","typeDescriptions":{"typeIdentifier":"t_array$_t_string_memory_ptr_$dyn_memory_ptr","typeString":"string[]"},"typeName":{"baseType":{"id":288,"name":"string","nodeType":"ElementaryTypeName","src":"3331:6:0","typeDescriptions":{"typeIdentifier":"t_string_storage_ptr","typeString":"string"}},"id":289,"nodeType":"ArrayTypeName","src":"3331:8:0","typeDescriptions":{"typeIdentifier":"t_array$_t_string_storage_$dyn_storage_ptr","typeString":"string[]"}},"visibility":"internal"}],"id":296,"initialValue":{"arguments":[{"id":293,"name":"json","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":283,"src":"3371:4:0","typeDescriptions":{"typeIdentifier":"t_string_memory_ptr","typeString":"string memory"}},{"hexValue":"2e726f6f745f6b65795b305d","id":294,"isConstant":false,"isLValue":false,"isPure":true,"kind":"string","lValueRequested":false,"nodeType":"Literal","src":"3377:14:0","typeDescriptions":{"typeIdentifier":"t_stringliteral_d82f67100edb80050915e1ec4b565c9a8319a22efb1075e1298b7bb60101d266","typeString":"literal_string \".root_key[0]\""},"value":".root_key[0]"}],"expression":{"argumentTypes":[{"typeIdentifier":"t_string_memory_ptr","typeString":"string memory"},{"typeIdentifier":"t_stringliteral_d82f67100edb80050915e1ec4b565c9a8319a22efb1075e1298b7bb60101d266","typeString":"literal_string \".root_key[0]\""}],"expression":{"id":291,"name":"vm","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":213,"src":"3354:2:0","typeDescriptions":{"typeIdentifier":"t_contract$_Vm_$55","typeString":"contract Vm"}},"id":292,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"memberName":"parseJsonKeys","nodeType":"MemberAccess","referencedDeclaration":27,"src":"3354:16:0","typeDescriptions":{"typeIdentifier":"t_function_external_pure$_t_string_memory_ptr_$_t_string_memory_ptr_$returns$_t_array$_t_string_memory_ptr_$dyn_memory_ptr_$","typeString":"function (string memory,string memory) pure external returns (string memory[] memory)"}},"id":295,"isConstant":false,"isLValue":false,"isPure":false,"kind":"functionCall","lValueRequested":false,"names":[],"nodeType":"FunctionCall","src":"3354:38:0","tryCall":false,"typeDescriptions":{"typeIdentifier":"t_array$_t_string_memory_ptr_$dyn_memory_ptr","typeString":"string memory[] memory"}},"nodeType":"VariableDeclarationStatement","src":"3331:61:0"},{"expression":{"arguments":[{"hexValue":"6b657973","id":300,"isConstant":false,"isLValue":false,"isPure":true,"kind":"string","lValueRequested":false,"nodeType":"Literal","src":"3414:6:0","typeDescriptions":{"typeIdentifier":"t_stringliteral_f29790a80c4ce5f42f59892f424f9c92856c6b656c3378e2cf305b260c6f4195","typeString":"literal_string \"keys\""},"value":"keys"},{"baseExpression":{"id":301,"name":"keys","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":290,"src":"3422:4:0","typeDescriptions":{"typeIdentifier":"t_array$_t_string_memory_ptr_$dyn_memory_ptr","typeString":"string memory[] memory"}},"id":303,"indexExpression":{"hexValue":"30","id":302,"isConstant":false,"isLValue":false,"isPure":true,"kind":"number","lValueRequested":false,"nodeType":"Literal","src":"3427:1:0","typeDescriptions":{"typeIdentifier":"t_rational_0_by_1","typeString":"int_const 0"},"value":"0"},"isConstant":false,"isLValue":true,"isPure":false,"lValueRequested":false,"nodeType":"IndexAccess","src":"3422:7:0","typeDescriptions":{"typeIdentifier":"t_string_memory_ptr","typeString":"string memory"}},{"baseExpression":{"id":304,"name":"keys","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":290,"src":"3431:4:0","typeDescriptions":{"typeIdentifier":"t_array$_t_string_memory_ptr_$dyn_memory_ptr","typeString":"string memory[] memory"}},"id":306,"indexExpression":{"hexValue":"31","id":305,"isConstant":false,"isLValue":false,"isPure":true,"kind":"number","lValueRequested":false,"nodeType":"Literal","src":"3436:1:0","typeDescriptions":{"typeIdentifier":"t_rational_1_by_1","typeString":"int_const 1"},"value":"1"},"isConstant":false,"isLValue":true,"isPure":false,"lValueRequested":false,"nodeType":"IndexAccess","src":"3431:7:0","typeDescriptions":{"typeIdentifier":"t_string_memory_ptr","typeString":"string memory"}}],"expression":{"argumentTypes":[{"typeIdentifier":"t_stringliteral_f29790a80c4ce5f42f59892f424f9c92856c6b656c3378e2cf305b260c6f4195","typeString":"literal_string \"keys\""},{"typeIdentifier":"t_string_memory_ptr","typeString":"string memory"},{"typeIdentifier":"t_string_memory_ptr","typeString":"string memory"}],"expression":{"id":297,"name":"console","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":192,"src":"3402:7:0","typeDescriptions":{"typeIdentifier":"t_type$_t_contract$_console_$192_$","typeString":"type(library console)"}},"id":299,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"memberName":"log","nodeType":"MemberAccess","referencedDeclaration":191,"src":"3402:11:0","typeDescriptions":{"typeIdentifier":"t_function_internal_pure$_t_string_memory_ptr_$_t_string_memory_ptr_$_t_string_memory_ptr_$returns$__$","typeString":"function (string memory,string memory,string memory) pure"}},"id":307,"isConstant":false,"isLValue":false,"isPure":false,"kind":"functionCall","lValueRequested":false,"names":[],"nodeType":"FunctionCall","src":"3402:37:0","tryCall":false,"typeDescriptions":{"typeIdentifier":"t_tuple$__$","typeString":"tuple()"}},"id":308,"nodeType":"ExpressionStatement","src":"3402:37:0"},{"expression":{"arguments":[{"hexValue":"66726f6d206f726967696e616c","id":312,"isConstant":false,"isLValue":false,"isPure":true,"kind":"string","lValueRequested":false,"nodeType":"Literal","src":"3461:15:0","typeDescriptions":{"typeIdentifier":"t_stringliteral_77928970c8757d110f3c23e003246f49e0de890480ba9717ba659b2f56f316b2","typeString":"literal_string \"from original\""},"value":"from original"}],"expression":{"argumentTypes":[{"typeIdentifier":"t_stringliteral_77928970c8757d110f3c23e003246f49e0de890480ba9717ba659b2f56f316b2","typeString":"literal_string \"from original\""}],"expression":{"id":309,"name":"this","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":-28,"src":"3450:4:0","typeDescriptions":{"typeIdentifier":"t_contract$_ScriptExample_$706","typeString":"contract ScriptExample"}},"id":311,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"memberName":"hello","nodeType":"MemberAccess","referencedDeclaration":633,"src":"3450:10:0","typeDescriptions":{"typeIdentifier":"t_function_external_view$_t_string_memory_ptr_$returns$__$","typeString":"function (string memory) view external"}},"id":313,"isConstant":false,"isLValue":false,"isPure":false,"kind":"functionCall","lValueRequested":false,"names":[],"nodeType":"FunctionCall","src":"3450:27:0","tryCall":false,"typeDescriptions":{"typeIdentifier":"t_tuple$__$","typeString":"tuple()"}},"id":314,"nodeType":"ExpressionStatement","src":"3450:27:0"},{"expression":{"arguments":[{"arguments":[{"arguments":[{"hexValue":"30783432","id":322,"isConstant":false,"isLValue":false,"isPure":true,"kind":"number","lValueRequested":false,"nodeType":"Literal","src":"3517:4:0","typeDescriptions":{"typeIdentifier":"t_rational_66_by_1","typeString":"int_const 66"},"value":"0x42"}],"expression":{"argumentTypes":[{"typeIdentifier":"t_rational_66_by_1","typeString":"int_const 66"}],"id":321,"isConstant":false,"isLValue":false,"isPure":true,"lValueRequested":false,"nodeType":"ElementaryTypeNameExpression","src":"3509:7:0","typeDescriptions":{"typeIdentifier":"t_type$_t_uint160_$","typeString":"type(uint160)"},"typeName":{"id":320,"name":"uint160","nodeType":"ElementaryTypeName","src":"3509:7:0","typeDescriptions":{}}},"id":323,"isConstant":false,"isLValue":false,"isPure":true,"kind":"typeConversion","lValueRequested":false,"names":[],"nodeType":"FunctionCall","src":"3509:13:0","tryCall":false,"typeDescriptions":{"typeIdentifier":"t_uint160","typeString":"uint160"}}],"expression":{"argumentTypes":[{"typeIdentifier":"t_uint160","typeString":"uint160"}],"id":319,"isConstant":false,"isLValue":false,"isPure":true,"lValueRequested":false,"nodeType":"ElementaryTypeNameExpression","src":"3501:7:0","typeDescriptions":{"typeIdentifier":"t_type$_t_address_$","typeString":"type(address)"},"typeName":{"id":318,"name":"address","nodeType":"ElementaryTypeName","src":"3501:7:0","typeDescriptions":{}}},"id":324,"isConstant":false,"isLValue":false,"isPure":true,"kind":"typeConversion","lValueRequested":false,"names":[],"nodeType":"FunctionCall","src":"3501:22:0","tryCall":false,"typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"}}],"expression":{"argumentTypes":[{"typeIdentifier":"t_address","typeString":"address"}],"expression":{"id":315,"name":"vm","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":213,"src":"3487:2:0","typeDescriptions":{"typeIdentifier":"t_contract$_Vm_$55","typeString":"contract Vm"}},"id":317,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"memberName":"startPrank","nodeType":"MemberAccess","referencedDeclaration":32,"src":"3487:13:0","typeDescriptions":{"typeIdentifier":"t_function_external_nonpayable$_t_address_$returns$__$","typeString":"function (address) external"}},"id":325,"isConstant":false,"isLValue":false,"isPure":false,"kind":"functionCall","lValueRequested":false,"names":[],"nodeType":"FunctionCall","src":"3487:37:0","tryCall":false,"typeDescriptions":{"typeIdentifier":"t_tuple$__$","typeString":"tuple()"}},"id":326,"nodeType":"ExpressionStatement","src":"3487:37:0"},{"expression":{"arguments":[{"hexValue":"66726f6d207072616e6b2031","id":330,"isConstant":false,"isLValue":false,"isPure":true,"kind":"string","lValueRequested":false,"nodeType":"Literal","src":"3545:14:0","typeDescriptions":{"typeIdentifier":"t_stringliteral_42b34abfe37a8b0add910cda7b4a379e6538fa7a1dcafce47a02bd38f6c88e2a","typeString":"literal_string \"from prank 1\""},"value":"from prank 1"}],"expression":{"argumentTypes":[{"typeIdentifier":"t_stringliteral_42b34abfe37a8b0add910cda7b4a379e6538fa7a1dcafce47a02bd38f6c88e2a","typeString":"literal_string \"from prank 1\""}],"expression":{"id":327,"name":"this","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":-28,"src":"3534:4:0","typeDescriptions":{"typeIdentifier":"t_contract$_ScriptExample_$706","typeString":"contract ScriptExample"}},"id":329,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"memberName":"hello","nodeType":"MemberAccess","referencedDeclaration":633,"src":"3534:10:0","typeDescriptions":{"typeIdentifier":"t_function_external_view$_t_string_memory_ptr_$returns$__$","typeString":"function (string memory) view external"}},"id":331,"isConstant":false,"isLValue":false,"isPure":false,"kind":"functionCall","lValueRequested":false,"names":[],"nodeType":"FunctionCall","src":"3534:26:0","tryCall":false,"typeDescriptions":{"typeIdentifier":"t_tuple$__$","typeString":"tuple()"}},"id":332,"nodeType":"ExpressionStatement","src":"3534:26:0"},{"expression":{"arguments":[{"hexValue":"706172656e742073636f7065206d73672e73656e646572","id":336,"isConstant":false,"isLValue":false,"isPure":true,"kind":"string","lValueRequested":false,"nodeType":"Literal","src":"3582:25:0","typeDescriptions":{"typeIdentifier":"t_stringliteral_83ec9246154d8845de47aafc5c2865c9985d2efe84472c27283879f2fbf5cc94","typeString":"literal_string \"parent scope msg.sender\""},"value":"parent scope msg.sender"},{"arguments":[{"expression":{"id":339,"name":"msg","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":-15,"src":"3617:3:0","typeDescriptions":{"typeIdentifier":"t_magic_message","typeString":"msg"}},"id":340,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"memberName":"sender","nodeType":"MemberAccess","src":"3617:10:0","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"}}],"expression":{"argumentTypes":[{"typeIdentifier":"t_address","typeString":"address"}],"id":338,"isConstant":false,"isLValue":false,"isPure":true,"lValueRequested":false,"nodeType":"ElementaryTypeNameExpression","src":"3609:7:0","typeDescriptions":{"typeIdentifier":"t_type$_t_address_$","typeString":"type(address)"},"typeName":{"id":337,"name":"address","nodeType":"ElementaryTypeName","src":"3609:7:0","typeDescriptions":{}}},"id":341,"isConstant":false,"isLValue":false,"isPure":false,"kind":"typeConversion","lValueRequested":false,"names":[],"nodeType":"FunctionCall","src":"3609:19:0","tryCall":false,"typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"}}],"expression":{"argumentTypes":[{"typeIdentifier":"t_stringliteral_83ec9246154d8845de47aafc5c2865c9985d2efe84472c27283879f2fbf5cc94","typeString":"literal_string \"parent scope msg.sender\""},{"typeIdentifier":"t_address","typeString":"address"}],"expression":{"id":333,"name":"console","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":192,"src":"3570:7:0","typeDescriptions":{"typeIdentifier":"t_type$_t_contract$_console_$192_$","typeString":"type(library console)"}},"id":335,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"memberName":"log","nodeType":"MemberAccess","referencedDeclaration":171,"src":"3570:11:0","typeDescriptions":{"typeIdentifier":"t_function_internal_pure$_t_string_memory_ptr_$_t_address_$returns$__$","typeString":"function (string memory,address) pure"}},"id":342,"isConstant":false,"isLValue":false,"isPure":false,"kind":"functionCall","lValueRequested":false,"names":[],"nodeType":"FunctionCall","src":"3570:59:0","tryCall":false,"typeDescriptions":{"typeIdentifier":"t_tuple$__$","typeString":"tuple()"}},"id":343,"nodeType":"ExpressionStatement","src":"3570:59:0"},{"expression":{"arguments":[{"hexValue":"706172656e742073636f706520636f6e74726163742e61646472","id":347,"isConstant":false,"isLValue":false,"isPure":true,"kind":"string","lValueRequested":false,"nodeType":"Literal","src":"3651:28:0","typeDescriptions":{"typeIdentifier":"t_stringliteral_97df66250e0b2b48f0ec8d0e01eb1b8ca012d95f1572895622aa1ea433e5570f","typeString":"literal_string \"parent scope contract.addr\""},"value":"parent scope contract.addr"},{"arguments":[{"id":350,"name":"this","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":-28,"src":"3689:4:0","typeDescriptions":{"typeIdentifier":"t_contract$_ScriptExample_$706","typeString":"contract ScriptExample"}}],"expression":{"argumentTypes":[{"typeIdentifier":"t_contract$_ScriptExample_$706","typeString":"contract ScriptExample"}],"id":349,"isConstant":false,"isLValue":false,"isPure":true,"lValueRequested":false,"nodeType":"ElementaryTypeNameExpression","src":"3681:7:0","typeDescriptions":{"typeIdentifier":"t_type$_t_address_$","typeString":"type(address)"},"typeName":{"id":348,"name":"address","nodeType":"ElementaryTypeName","src":"3681:7:0","typeDescriptions":{}}},"id":351,"isConstant":false,"isLValue":false,"isPure":false,"kind":"typeConversion","lValueRequested":false,"names":[],"nodeType":"FunctionCall","src":"3681:13:0","tryCall":false,"typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"}}],"expression":{"argumentTypes":[{"typeIdentifier":"t_stringliteral_97df66250e0b2b48f0ec8d0e01eb1b8ca012d95f1572895622aa1ea433e5570f","typeString":"literal_string \"parent scope contract.addr\""},{"typeIdentifier":"t_address","typeString":"address"}],"expression":{"id":344,"name":"console","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":192,"src":"3639:7:0","typeDescriptions":{"typeIdentifier":"t_type$_t_contract$_console_$192_$","typeString":"type(library console)"}},"id":346,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"memberName":"log","nodeType":"MemberAccess","referencedDeclaration":171,"src":"3639:11:0","typeDescriptions":{"typeIdentifier":"t_function_internal_pure$_t_string_memory_ptr_$_t_address_$returns$__$","typeString":"function (string memory,address) pure"}},"id":352,"isConstant":false,"isLValue":false,"isPure":false,"kind":"functionCall","lValueRequested":false,"names":[],"nodeType":"FunctionCall","src":"3639:56:0","tryCall":false,"typeDescriptions":{"typeIdentifier":"t_tuple$__$","typeString":"tuple()"}},"id":353,"nodeType":"ExpressionStatement","src":"3639:56:0"},{"expression":{"arguments":[{"hexValue":"66726f6d207072616e6b2032","id":357,"isConstant":false,"isLValue":false,"isPure":true,"kind":"string","lValueRequested":false,"nodeType":"Literal","src":"3716:14:0","typeDescriptions":{"typeIdentifier":"t_stringliteral_a38a34f8cad750a79aa097a92971f8f405b51ee9d53d25c5b14fc129ba3684bb","typeString":"literal_string \"from prank 2\""},"value":"from prank 2"}],"expression":{"argumentTypes":[{"typeIdentifier":"t_stringliteral_a38a34f8cad750a79aa097a92971f8f405b51ee9d53d25c5b14fc129ba3684bb","typeString":"literal_string \"from prank 2\""}],"expression":{"id":354,"name":"this","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":-28,"src":"3705:4:0","typeDescriptions":{"typeIdentifier":"t_contract$_ScriptExample_$706","typeString":"contract ScriptExample"}},"id":356,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"memberName":"hello","nodeType":"MemberAccess","referencedDeclaration":633,"src":"3705:10:0","typeDescriptions":{"typeIdentifier":"t_function_external_view$_t_string_memory_ptr_$returns$__$","typeString":"function (string memory) view external"}},"id":358,"isConstant":false,"isLValue":false,"isPure":false,"kind":"functionCall","lValueRequested":false,"names":[],"nodeType":"FunctionCall","src":"3705:26:0","tryCall":false,"typeDescriptions":{"typeIdentifier":"t_tuple$__$","typeString":"tuple()"}},"id":359,"nodeType":"ExpressionStatement","src":"3705:26:0"},{"expression":{"arguments":[],"expression":{"argumentTypes":[],"expression":{"id":360,"name":"vm","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":213,"src":"3741:2:0","typeDescriptions":{"typeIdentifier":"t_contract$_Vm_$55","typeString":"contract Vm"}},"id":362,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"memberName":"stopPrank","nodeType":"MemberAccess","referencedDeclaration":35,"src":"3741:12:0","typeDescriptions":{"typeIdentifier":"t_function_external_nonpayable$__$returns$__$","typeString":"function () external"}},"id":363,"isConstant":false,"isLValue":false,"isPure":false,"kind":"functionCall","lValueRequested":false,"names":[],"nodeType":"FunctionCall","src":"3741:14:0","tryCall":false,"typeDescriptions":{"typeIdentifier":"t_tuple$__$","typeString":"tuple()"}},"id":364,"nodeType":"ExpressionStatement","src":"3741:14:0"},{"expression":{"arguments":[{"hexValue":"66726f6d206f726967696e616c20616761696e","id":368,"isConstant":false,"isLValue":false,"isPure":true,"kind":"string","lValueRequested":false,"nodeType":"Literal","src":"3776:21:0","typeDescriptions":{"typeIdentifier":"t_stringliteral_0c805c6579e20a9c4c8e11aeab23330910a9f2da629191dc119d1730e8ed6860","typeString":"literal_string \"from original again\""},"value":"from original again"}],"expression":{"argumentTypes":[{"typeIdentifier":"t_stringliteral_0c805c6579e20a9c4c8e11aeab23330910a9f2da629191dc119d1730e8ed6860","typeString":"literal_string \"from original again\""}],"expression":{"id":365,"name":"this","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":-28,"src":"3765:4:0","typeDescriptions":{"typeIdentifier":"t_contract$_ScriptExample_$706","typeString":"contract ScriptExample"}},"id":367,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"memberName":"hello","nodeType":"MemberAccess","referencedDeclaration":633,"src":"3765:10:0","typeDescriptions":{"typeIdentifier":"t_function_external_view$_t_string_memory_ptr_$returns$__$","typeString":"function (string memory) view external"}},"id":369,"isConstant":false,"isLValue":false,"isPure":false,"kind":"functionCall","lValueRequested":false,"names":[],"nodeType":"FunctionCall","src":"3765:33:0","tryCall":false,"typeDescriptions":{"typeIdentifier":"t_tuple$__$","typeString":"tuple()"}},"id":370,"nodeType":"ExpressionStatement","src":"3765:33:0"},{"expression":{"arguments":[{"hexValue":"646f6e6521","id":374,"isConstant":false,"isLValue":false,"isPure":true,"kind":"string","lValueRequested":false,"nodeType":"Literal","src":"3821:7:0","typeDescriptions":{"typeIdentifier":"t_stringliteral_080382d5c9e9e7c5e3d1d33f5e7422740375955180fadff167d8130e0c35f3fc","typeString":"literal_string \"done!\""},"value":"done!"}],"expression":{"argumentTypes":[{"typeIdentifier":"t_stringliteral_080382d5c9e9e7c5e3d1d33f5e7422740375955180fadff167d8130e0c35f3fc","typeString":"literal_string \"done!\""}],"expression":{"id":371,"name":"console","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":192,"src":"3809:7:0","typeDescriptions":{"typeIdentifier":"t_type$_t_contract$_console_$192_$","typeString":"type(library console)"}},"id":373,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"memberName":"log","nodeType":"MemberAccess","referencedDeclaration":120,"src":"3809:11:0","typeDescriptions":{"typeIdentifier":"t_function_internal_pure$_t_string_memory_ptr_$returns$__$","typeString":"function (string memory) pure"}},"id":375,"isConstant":false,"isLValue":false,"isPure":false,"kind":"functionCall","lValueRequested":false,"names":[],"nodeType":"FunctionCall","src":"3809:20:0","tryCall":false,"typeDescriptions":{"typeIdentifier":"t_tuple$__$","typeString":"tuple()"}},"id":376,"nodeType":"ExpressionStatement","src":"3809:20:0"}]},"documentation":{"id":216,"nodeType":"StructuredDocumentation","src":"2804:78:0","text":"@notice example function, runs through basic cheat-codes and console logs."},"functionSelector":"c0406226","implemented":true,"kind":"function","modifiers":[],"name":"run","nameLocation":"2896:3:0","parameters":{"id":217,"nodeType":"ParameterList","parameters":[],"src":"2899:2:0"},"returnParameters":{"id":218,"nodeType":"ParameterList","parameters":[],"src":"2909:0:0"},"scope":706,"stateMutability":"nonpayable","virtual":false,"visibility":"public"},{"id":609,"nodeType":"FunctionDefinition","src":"3903:1258:0","nodes":[],"body":{"id":608,"nodeType":"Block","src":"3934:1227:0","nodes":[],"statements":[{"expression":{"arguments":[{"hexValue":"6e6f6e6365207374617274","id":385,"isConstant":false,"isLValue":false,"isPure":true,"kind":"string","lValueRequested":false,"nodeType":"Literal","src":"3956:13:0","typeDescriptions":{"typeIdentifier":"t_stringliteral_71efc69b9a13b6bc1e9a14d766ff01c79022262c6daa6532fb5dfb14f8511a20","typeString":"literal_string \"nonce start\""},"value":"nonce start"},{"arguments":[{"arguments":[{"arguments":[{"id":392,"name":"this","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":-28,"src":"3999:4:0","typeDescriptions":{"typeIdentifier":"t_contract$_ScriptExample_$706","typeString":"contract ScriptExample"}}],"expression":{"argumentTypes":[{"typeIdentifier":"t_contract$_ScriptExample_$706","typeString":"contract ScriptExample"}],"id":391,"isConstant":false,"isLValue":false,"isPure":true,"lValueRequested":false,"nodeType":"ElementaryTypeNameExpression","src":"3991:7:0","typeDescriptions":{"typeIdentifier":"t_type$_t_address_$","typeString":"type(address)"},"typeName":{"id":390,"name":"address","nodeType":"ElementaryTypeName","src":"3991:7:0","typeDescriptions":{}}},"id":393,"isConstant":false,"isLValue":false,"isPure":false,"kind":"typeConversion","lValueRequested":false,"names":[],"nodeType":"FunctionCall","src":"3991:13:0","tryCall":false,"typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"}}],"expression":{"argumentTypes":[{"typeIdentifier":"t_address","typeString":"address"}],"expression":{"id":388,"name":"vm","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":213,"src":"3979:2:0","typeDescriptions":{"typeIdentifier":"t_contract$_Vm_$55","typeString":"contract Vm"}},"id":389,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"memberName":"getNonce","nodeType":"MemberAccess","referencedDeclaration":17,"src":"3979:11:0","typeDescriptions":{"typeIdentifier":"t_function_external_view$_t_address_$returns$_t_uint64_$","typeString":"function (address) view external returns (uint64)"}},"id":394,"isConstant":false,"isLValue":false,"isPure":false,"kind":"functionCall","lValueRequested":false,"names":[],"nodeType":"FunctionCall","src":"3979:26:0","tryCall":false,"typeDescriptions":{"typeIdentifier":"t_uint64","typeString":"uint64"}}],"expression":{"argumentTypes":[{"typeIdentifier":"t_uint64","typeString":"uint64"}],"id":387,"isConstant":false,"isLValue":false,"isPure":true,"lValueRequested":false,"nodeType":"ElementaryTypeNameExpression","src":"3971:7:0","typeDescriptions":{"typeIdentifier":"t_type$_t_uint256_$","typeString":"type(uint256)"},"typeName":{"id":386,"name":"uint256","nodeType":"ElementaryTypeName","src":"3971:7:0","typeDescriptions":{}}},"id":395,"isConstant":false,"isLValue":false,"isPure":false,"kind":"typeConversion","lValueRequested":false,"names":[],"nodeType":"FunctionCall","src":"3971:35:0","tryCall":false,"typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}}],"expression":{"argumentTypes":[{"typeIdentifier":"t_stringliteral_71efc69b9a13b6bc1e9a14d766ff01c79022262c6daa6532fb5dfb14f8511a20","typeString":"literal_string \"nonce start\""},{"typeIdentifier":"t_uint256","typeString":"uint256"}],"expression":{"id":382,"name":"console","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":192,"src":"3944:7:0","typeDescriptions":{"typeIdentifier":"t_type$_t_contract$_console_$192_$","typeString":"type(library console)"}},"id":384,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"memberName":"log","nodeType":"MemberAccess","referencedDeclaration":154,"src":"3944:11:0","typeDescriptions":{"typeIdentifier":"t_function_internal_pure$_t_string_memory_ptr_$_t_uint256_$returns$__$","typeString":"function (string memory,uint256) pure"}},"id":396,"isConstant":false,"isLValue":false,"isPure":false,"kind":"functionCall","lValueRequested":false,"names":[],"nodeType":"FunctionCall","src":"3944:63:0","tryCall":false,"typeDescriptions":{"typeIdentifier":"t_tuple$__$","typeString":"tuple()"}},"id":397,"nodeType":"ExpressionStatement","src":"3944:63:0"},{"expression":{"arguments":[{"hexValue":"74657374696e672073696e676c65","id":401,"isConstant":false,"isLValue":false,"isPure":true,"kind":"string","lValueRequested":false,"nodeType":"Literal","src":"4030:16:0","typeDescriptions":{"typeIdentifier":"t_stringliteral_b75103528423218e7569082dad569ed0d2ce7c0ac770c0812b220e2d369fe474","typeString":"literal_string \"testing single\""},"value":"testing single"}],"expression":{"argumentTypes":[{"typeIdentifier":"t_stringliteral_b75103528423218e7569082dad569ed0d2ce7c0ac770c0812b220e2d369fe474","typeString":"literal_string \"testing single\""}],"expression":{"id":398,"name":"console","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":192,"src":"4018:7:0","typeDescriptions":{"typeIdentifier":"t_type$_t_contract$_console_$192_$","typeString":"type(library console)"}},"id":400,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"memberName":"log","nodeType":"MemberAccess","referencedDeclaration":120,"src":"4018:11:0","typeDescriptions":{"typeIdentifier":"t_function_internal_pure$_t_string_memory_ptr_$returns$__$","typeString":"function (string memory) pure"}},"id":402,"isConstant":false,"isLValue":false,"isPure":false,"kind":"functionCall","lValueRequested":false,"names":[],"nodeType":"FunctionCall","src":"4018:29:0","tryCall":false,"typeDescriptions":{"typeIdentifier":"t_tuple$__$","typeString":"tuple()"}},"id":403,"nodeType":"ExpressionStatement","src":"4018:29:0"},{"expression":{"arguments":[],"expression":{"argumentTypes":[],"expression":{"id":404,"name":"vm","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":213,"src":"4057:2:0","typeDescriptions":{"typeIdentifier":"t_contract$_Vm_$55","typeString":"contract Vm"}},"id":406,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"memberName":"broadcast","nodeType":"MemberAccess","referencedDeclaration":38,"src":"4057:12:0","typeDescriptions":{"typeIdentifier":"t_function_external_nonpayable$__$returns$__$","typeString":"function () external"}},"id":407,"isConstant":false,"isLValue":false,"isPure":false,"kind":"functionCall","lValueRequested":false,"names":[],"nodeType":"FunctionCall","src":"4057:14:0","tryCall":false,"typeDescriptions":{"typeIdentifier":"t_tuple$__$","typeString":"tuple()"}},"id":408,"nodeType":"ExpressionStatement","src":"4057:14:0"},{"expression":{"arguments":[{"hexValue":"73696e676c655f63616c6c31","id":412,"isConstant":false,"isLValue":false,"isPure":true,"kind":"string","lValueRequested":false,"nodeType":"Literal","src":"4092:14:0","typeDescriptions":{"typeIdentifier":"t_stringliteral_5e1cad6d7a968cfacf2731373e1248ffb11f4886bced66a02a6de1a67ac8f777","typeString":"literal_string \"single_call1\""},"value":"single_call1"}],"expression":{"argumentTypes":[{"typeIdentifier":"t_stringliteral_5e1cad6d7a968cfacf2731373e1248ffb11f4886bced66a02a6de1a67ac8f777","typeString":"literal_string \"single_call1\""}],"expression":{"id":409,"name":"this","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":-28,"src":"4081:4:0","typeDescriptions":{"typeIdentifier":"t_contract$_ScriptExample_$706","typeString":"contract ScriptExample"}},"id":411,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"memberName":"call1","nodeType":"MemberAccess","referencedDeclaration":648,"src":"4081:10:0","typeDescriptions":{"typeIdentifier":"t_function_external_nonpayable$_t_string_memory_ptr_$returns$__$","typeString":"function (string memory) external"}},"id":413,"isConstant":false,"isLValue":false,"isPure":false,"kind":"functionCall","lValueRequested":false,"names":[],"nodeType":"FunctionCall","src":"4081:26:0","tryCall":false,"typeDescriptions":{"typeIdentifier":"t_tuple$__$","typeString":"tuple()"}},"id":414,"nodeType":"ExpressionStatement","src":"4081:26:0"},{"expression":{"arguments":[{"hexValue":"73696e676c655f63616c6c32","id":418,"isConstant":false,"isLValue":false,"isPure":true,"kind":"string","lValueRequested":false,"nodeType":"Literal","src":"4128:14:0","typeDescriptions":{"typeIdentifier":"t_stringliteral_b37ddaf5d00ad9e6371de3fb71b91eef731fae1e86b768666380f7d44e1ada25","typeString":"literal_string \"single_call2\""},"value":"single_call2"}],"expression":{"argumentTypes":[{"typeIdentifier":"t_stringliteral_b37ddaf5d00ad9e6371de3fb71b91eef731fae1e86b768666380f7d44e1ada25","typeString":"literal_string \"single_call2\""}],"expression":{"id":415,"name":"this","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":-28,"src":"4117:4:0","typeDescriptions":{"typeIdentifier":"t_contract$_ScriptExample_$706","typeString":"contract ScriptExample"}},"id":417,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"memberName":"call2","nodeType":"MemberAccess","referencedDeclaration":663,"src":"4117:10:0","typeDescriptions":{"typeIdentifier":"t_function_external_nonpayable$_t_string_memory_ptr_$returns$__$","typeString":"function (string memory) external"}},"id":419,"isConstant":false,"isLValue":false,"isPure":false,"kind":"functionCall","lValueRequested":false,"names":[],"nodeType":"FunctionCall","src":"4117:26:0","tryCall":false,"typeDescriptions":{"typeIdentifier":"t_tuple$__$","typeString":"tuple()"}},"id":420,"nodeType":"ExpressionStatement","src":"4117:26:0"},{"expression":{"arguments":[{"hexValue":"74657374696e672073746172742f73746f70","id":424,"isConstant":false,"isLValue":false,"isPure":true,"kind":"string","lValueRequested":false,"nodeType":"Literal","src":"4166:20:0","typeDescriptions":{"typeIdentifier":"t_stringliteral_778e886e3a1c3c5096aca76228832105f3f9269f362effd0e8ce3737787cb784","typeString":"literal_string \"testing start/stop\""},"value":"testing start/stop"}],"expression":{"argumentTypes":[{"typeIdentifier":"t_stringliteral_778e886e3a1c3c5096aca76228832105f3f9269f362effd0e8ce3737787cb784","typeString":"literal_string \"testing start/stop\""}],"expression":{"id":421,"name":"console","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":192,"src":"4154:7:0","typeDescriptions":{"typeIdentifier":"t_type$_t_contract$_console_$192_$","typeString":"type(library console)"}},"id":423,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"memberName":"log","nodeType":"MemberAccess","referencedDeclaration":120,"src":"4154:11:0","typeDescriptions":{"typeIdentifier":"t_function_internal_pure$_t_string_memory_ptr_$returns$__$","typeString":"function (string memory) pure"}},"id":425,"isConstant":false,"isLValue":false,"isPure":false,"kind":"functionCall","lValueRequested":false,"names":[],"nodeType":"FunctionCall","src":"4154:33:0","tryCall":false,"typeDescriptions":{"typeIdentifier":"t_tuple$__$","typeString":"tuple()"}},"id":426,"nodeType":"ExpressionStatement","src":"4154:33:0"},{"expression":{"arguments":[{"arguments":[{"arguments":[{"hexValue":"3078633066666565","id":434,"isConstant":false,"isLValue":false,"isPure":true,"kind":"number","lValueRequested":false,"nodeType":"Literal","src":"4231:8:0","typeDescriptions":{"typeIdentifier":"t_rational_12648430_by_1","typeString":"int_const 12648430"},"value":"0xc0ffee"}],"expression":{"argumentTypes":[{"typeIdentifier":"t_rational_12648430_by_1","typeString":"int_const 12648430"}],"id":433,"isConstant":false,"isLValue":false,"isPure":true,"lValueRequested":false,"nodeType":"ElementaryTypeNameExpression","src":"4223:7:0","typeDescriptions":{"typeIdentifier":"t_type$_t_uint160_$","typeString":"type(uint160)"},"typeName":{"id":432,"name":"uint160","nodeType":"ElementaryTypeName","src":"4223:7:0","typeDescriptions":{}}},"id":435,"isConstant":false,"isLValue":false,"isPure":true,"kind":"typeConversion","lValueRequested":false,"names":[],"nodeType":"FunctionCall","src":"4223:17:0","tryCall":false,"typeDescriptions":{"typeIdentifier":"t_uint160","typeString":"uint160"}}],"expression":{"argumentTypes":[{"typeIdentifier":"t_uint160","typeString":"uint160"}],"id":431,"isConstant":false,"isLValue":false,"isPure":true,"lValueRequested":false,"nodeType":"ElementaryTypeNameExpression","src":"4215:7:0","typeDescriptions":{"typeIdentifier":"t_type$_t_address_$","typeString":"type(address)"},"typeName":{"id":430,"name":"address","nodeType":"ElementaryTypeName","src":"4215:7:0","typeDescriptions":{}}},"id":436,"isConstant":false,"isLValue":false,"isPure":true,"kind":"typeConversion","lValueRequested":false,"names":[],"nodeType":"FunctionCall","src":"4215:26:0","tryCall":false,"typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"}}],"expression":{"argumentTypes":[{"typeIdentifier":"t_address","typeString":"address"}],"expression":{"id":427,"name":"vm","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":213,"src":"4197:2:0","typeDescriptions":{"typeIdentifier":"t_contract$_Vm_$55","typeString":"contract Vm"}},"id":429,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"memberName":"startBroadcast","nodeType":"MemberAccess","referencedDeclaration":48,"src":"4197:17:0","typeDescriptions":{"typeIdentifier":"t_function_external_nonpayable$_t_address_$returns$__$","typeString":"function (address) external"}},"id":437,"isConstant":false,"isLValue":false,"isPure":false,"kind":"functionCall","lValueRequested":false,"names":[],"nodeType":"FunctionCall","src":"4197:45:0","tryCall":false,"typeDescriptions":{"typeIdentifier":"t_tuple$__$","typeString":"tuple()"}},"id":438,"nodeType":"ExpressionStatement","src":"4197:45:0"},{"expression":{"arguments":[{"hexValue":"737461727473746f705f63616c6c31","id":442,"isConstant":false,"isLValue":false,"isPure":true,"kind":"string","lValueRequested":false,"nodeType":"Literal","src":"4263:17:0","typeDescriptions":{"typeIdentifier":"t_stringliteral_2fc2682edf10ed478ee3b9a190f6b1c88bb492b300935ce44545a1613cf8f041","typeString":"literal_string \"startstop_call1\""},"value":"startstop_call1"}],"expression":{"argumentTypes":[{"typeIdentifier":"t_stringliteral_2fc2682edf10ed478ee3b9a190f6b1c88bb492b300935ce44545a1613cf8f041","typeString":"literal_string \"startstop_call1\""}],"expression":{"id":439,"name":"this","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":-28,"src":"4252:4:0","typeDescriptions":{"typeIdentifier":"t_contract$_ScriptExample_$706","typeString":"contract ScriptExample"}},"id":441,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"memberName":"call1","nodeType":"MemberAccess","referencedDeclaration":648,"src":"4252:10:0","typeDescriptions":{"typeIdentifier":"t_function_external_nonpayable$_t_string_memory_ptr_$returns$__$","typeString":"function (string memory) external"}},"id":443,"isConstant":false,"isLValue":false,"isPure":false,"kind":"functionCall","lValueRequested":false,"names":[],"nodeType":"FunctionCall","src":"4252:29:0","tryCall":false,"typeDescriptions":{"typeIdentifier":"t_tuple$__$","typeString":"tuple()"}},"id":444,"nodeType":"ExpressionStatement","src":"4252:29:0"},{"expression":{"arguments":[{"hexValue":"737461727473746f705f63616c6c32","id":448,"isConstant":false,"isLValue":false,"isPure":true,"kind":"string","lValueRequested":false,"nodeType":"Literal","src":"4302:17:0","typeDescriptions":{"typeIdentifier":"t_stringliteral_1a6fd77f04b28bf45d6d0e2dd4c65c0bbfeba174f849e43bb67ebca1c019cda4","typeString":"literal_string \"startstop_call2\""},"value":"startstop_call2"}],"expression":{"argumentTypes":[{"typeIdentifier":"t_stringliteral_1a6fd77f04b28bf45d6d0e2dd4c65c0bbfeba174f849e43bb67ebca1c019cda4","typeString":"literal_string \"startstop_call2\""}],"expression":{"id":445,"name":"this","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":-28,"src":"4291:4:0","typeDescriptions":{"typeIdentifier":"t_contract$_ScriptExample_$706","typeString":"contract ScriptExample"}},"id":447,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"memberName":"call2","nodeType":"MemberAccess","referencedDeclaration":663,"src":"4291:10:0","typeDescriptions":{"typeIdentifier":"t_function_external_nonpayable$_t_string_memory_ptr_$returns$__$","typeString":"function (string memory) external"}},"id":449,"isConstant":false,"isLValue":false,"isPure":false,"kind":"functionCall","lValueRequested":false,"names":[],"nodeType":"FunctionCall","src":"4291:29:0","tryCall":false,"typeDescriptions":{"typeIdentifier":"t_tuple$__$","typeString":"tuple()"}},"id":450,"nodeType":"ExpressionStatement","src":"4291:29:0"},{"expression":{"arguments":[{"hexValue":"737461727473746f705f70757265","id":454,"isConstant":false,"isLValue":false,"isPure":true,"kind":"string","lValueRequested":false,"nodeType":"Literal","src":"4344:16:0","typeDescriptions":{"typeIdentifier":"t_stringliteral_b6e9eb1efd186b1d92b54da45026aa97a178e6eaffdf9dbf9f666fc751fb0ff9","typeString":"literal_string \"startstop_pure\""},"value":"startstop_pure"}],"expression":{"argumentTypes":[{"typeIdentifier":"t_stringliteral_b6e9eb1efd186b1d92b54da45026aa97a178e6eaffdf9dbf9f666fc751fb0ff9","typeString":"literal_string \"startstop_pure\""}],"expression":{"id":451,"name":"this","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":-28,"src":"4330:4:0","typeDescriptions":{"typeIdentifier":"t_contract$_ScriptExample_$706","typeString":"contract ScriptExample"}},"id":453,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"memberName":"callPure","nodeType":"MemberAccess","referencedDeclaration":705,"src":"4330:13:0","typeDescriptions":{"typeIdentifier":"t_function_external_pure$_t_string_memory_ptr_$returns$__$","typeString":"function (string memory) pure external"}},"id":455,"isConstant":false,"isLValue":false,"isPure":false,"kind":"functionCall","lValueRequested":false,"names":[],"nodeType":"FunctionCall","src":"4330:31:0","tryCall":false,"typeDescriptions":{"typeIdentifier":"t_tuple$__$","typeString":"tuple()"}},"id":456,"nodeType":"ExpressionStatement","src":"4330:31:0"},{"expression":{"arguments":[],"expression":{"argumentTypes":[],"expression":{"id":457,"name":"vm","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":213,"src":"4371:2:0","typeDescriptions":{"typeIdentifier":"t_contract$_Vm_$55","typeString":"contract Vm"}},"id":459,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"memberName":"stopBroadcast","nodeType":"MemberAccess","referencedDeclaration":54,"src":"4371:16:0","typeDescriptions":{"typeIdentifier":"t_function_external_nonpayable$__$returns$__$","typeString":"function () external"}},"id":460,"isConstant":false,"isLValue":false,"isPure":false,"kind":"functionCall","lValueRequested":false,"names":[],"nodeType":"FunctionCall","src":"4371:18:0","tryCall":false,"typeDescriptions":{"typeIdentifier":"t_tuple$__$","typeString":"tuple()"}},"id":461,"nodeType":"ExpressionStatement","src":"4371:18:0"},{"expression":{"arguments":[{"hexValue":"737461727473746f705f63616c6c33","id":465,"isConstant":false,"isLValue":false,"isPure":true,"kind":"string","lValueRequested":false,"nodeType":"Literal","src":"4410:17:0","typeDescriptions":{"typeIdentifier":"t_stringliteral_8eb502bfdc4adda22bd960aa2ae13ce4c0ed8cc3b3791ed65e321a38cdd36f72","typeString":"literal_string \"startstop_call3\""},"value":"startstop_call3"}],"expression":{"argumentTypes":[{"typeIdentifier":"t_stringliteral_8eb502bfdc4adda22bd960aa2ae13ce4c0ed8cc3b3791ed65e321a38cdd36f72","typeString":"literal_string \"startstop_call3\""}],"expression":{"id":462,"name":"this","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":-28,"src":"4399:4:0","typeDescriptions":{"typeIdentifier":"t_contract$_ScriptExample_$706","typeString":"contract ScriptExample"}},"id":464,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"memberName":"call1","nodeType":"MemberAccess","referencedDeclaration":648,"src":"4399:10:0","typeDescriptions":{"typeIdentifier":"t_function_external_nonpayable$_t_string_memory_ptr_$returns$__$","typeString":"function (string memory) external"}},"id":466,"isConstant":false,"isLValue":false,"isPure":false,"kind":"functionCall","lValueRequested":false,"names":[],"nodeType":"FunctionCall","src":"4399:29:0","tryCall":false,"typeDescriptions":{"typeIdentifier":"t_tuple$__$","typeString":"tuple()"}},"id":467,"nodeType":"ExpressionStatement","src":"4399:29:0"},{"expression":{"arguments":[{"hexValue":"74657374696e67206e6573746564","id":471,"isConstant":false,"isLValue":false,"isPure":true,"kind":"string","lValueRequested":false,"nodeType":"Literal","src":"4451:16:0","typeDescriptions":{"typeIdentifier":"t_stringliteral_f92f19f7a5b5b9ce341188bf4e15925f184cdb5ac135c4846ced718f259dbde5","typeString":"literal_string \"testing nested\""},"value":"testing nested"}],"expression":{"argumentTypes":[{"typeIdentifier":"t_stringliteral_f92f19f7a5b5b9ce341188bf4e15925f184cdb5ac135c4846ced718f259dbde5","typeString":"literal_string \"testing nested\""}],"expression":{"id":468,"name":"console","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":192,"src":"4439:7:0","typeDescriptions":{"typeIdentifier":"t_type$_t_contract$_console_$192_$","typeString":"type(library console)"}},"id":470,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"memberName":"log","nodeType":"MemberAccess","referencedDeclaration":120,"src":"4439:11:0","typeDescriptions":{"typeIdentifier":"t_function_internal_pure$_t_string_memory_ptr_$returns$__$","typeString":"function (string memory) pure"}},"id":472,"isConstant":false,"isLValue":false,"isPure":false,"kind":"functionCall","lValueRequested":false,"names":[],"nodeType":"FunctionCall","src":"4439:29:0","tryCall":false,"typeDescriptions":{"typeIdentifier":"t_tuple$__$","typeString":"tuple()"}},"id":473,"nodeType":"ExpressionStatement","src":"4439:29:0"},{"expression":{"arguments":[{"arguments":[{"arguments":[{"hexValue":"307831323334","id":481,"isConstant":false,"isLValue":false,"isPure":true,"kind":"number","lValueRequested":false,"nodeType":"Literal","src":"4512:6:0","typeDescriptions":{"typeIdentifier":"t_rational_4660_by_1","typeString":"int_const 4660"},"value":"0x1234"}],"expression":{"argumentTypes":[{"typeIdentifier":"t_rational_4660_by_1","typeString":"int_const 4660"}],"id":480,"isConstant":false,"isLValue":false,"isPure":true,"lValueRequested":false,"nodeType":"ElementaryTypeNameExpression","src":"4504:7:0","typeDescriptions":{"typeIdentifier":"t_type$_t_uint160_$","typeString":"type(uint160)"},"typeName":{"id":479,"name":"uint160","nodeType":"ElementaryTypeName","src":"4504:7:0","typeDescriptions":{}}},"id":482,"isConstant":false,"isLValue":false,"isPure":true,"kind":"typeConversion","lValueRequested":false,"names":[],"nodeType":"FunctionCall","src":"4504:15:0","tryCall":false,"typeDescriptions":{"typeIdentifier":"t_uint160","typeString":"uint160"}}],"expression":{"argumentTypes":[{"typeIdentifier":"t_uint160","typeString":"uint160"}],"id":478,"isConstant":false,"isLValue":false,"isPure":true,"lValueRequested":false,"nodeType":"ElementaryTypeNameExpression","src":"4496:7:0","typeDescriptions":{"typeIdentifier":"t_type$_t_address_$","typeString":"type(address)"},"typeName":{"id":477,"name":"address","nodeType":"ElementaryTypeName","src":"4496:7:0","typeDescriptions":{}}},"id":483,"isConstant":false,"isLValue":false,"isPure":true,"kind":"typeConversion","lValueRequested":false,"names":[],"nodeType":"FunctionCall","src":"4496:24:0","tryCall":false,"typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"}}],"expression":{"argumentTypes":[{"typeIdentifier":"t_address","typeString":"address"}],"expression":{"id":474,"name":"vm","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":213,"src":"4478:2:0","typeDescriptions":{"typeIdentifier":"t_contract$_Vm_$55","typeString":"contract Vm"}},"id":476,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"memberName":"startBroadcast","nodeType":"MemberAccess","referencedDeclaration":48,"src":"4478:17:0","typeDescriptions":{"typeIdentifier":"t_function_external_nonpayable$_t_address_$returns$__$","typeString":"function (address) external"}},"id":484,"isConstant":false,"isLValue":false,"isPure":false,"kind":"functionCall","lValueRequested":false,"names":[],"nodeType":"FunctionCall","src":"4478:43:0","tryCall":false,"typeDescriptions":{"typeIdentifier":"t_tuple$__$","typeString":"tuple()"}},"id":485,"nodeType":"ExpressionStatement","src":"4478:43:0"},{"expression":{"arguments":[{"hexValue":"6e6573746564","id":489,"isConstant":false,"isLValue":false,"isPure":true,"kind":"string","lValueRequested":false,"nodeType":"Literal","src":"4544:8:0","typeDescriptions":{"typeIdentifier":"t_stringliteral_4d5b14044d78fbf0c9dd8b9c49e35f09ee5a6f5b1b3b8117b5d0e15c8dd2cb09","typeString":"literal_string \"nested\""},"value":"nested"}],"expression":{"argumentTypes":[{"typeIdentifier":"t_stringliteral_4d5b14044d78fbf0c9dd8b9c49e35f09ee5a6f5b1b3b8117b5d0e15c8dd2cb09","typeString":"literal_string \"nested\""}],"expression":{"id":486,"name":"this","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":-28,"src":"4531:4:0","typeDescriptions":{"typeIdentifier":"t_contract$_ScriptExample_$706","typeString":"contract ScriptExample"}},"id":488,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"memberName":"nested1","nodeType":"MemberAccess","referencedDeclaration":678,"src":"4531:12:0","typeDescriptions":{"typeIdentifier":"t_function_external_nonpayable$_t_string_memory_ptr_$returns$__$","typeString":"function (string memory) external"}},"id":490,"isConstant":false,"isLValue":false,"isPure":false,"kind":"functionCall","lValueRequested":false,"names":[],"nodeType":"FunctionCall","src":"4531:22:0","tryCall":false,"typeDescriptions":{"typeIdentifier":"t_tuple$__$","typeString":"tuple()"}},"id":491,"nodeType":"ExpressionStatement","src":"4531:22:0"},{"expression":{"arguments":[],"expression":{"argumentTypes":[],"expression":{"id":492,"name":"vm","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":213,"src":"4563:2:0","typeDescriptions":{"typeIdentifier":"t_contract$_Vm_$55","typeString":"contract Vm"}},"id":494,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"memberName":"stopBroadcast","nodeType":"MemberAccess","referencedDeclaration":54,"src":"4563:16:0","typeDescriptions":{"typeIdentifier":"t_function_external_nonpayable$__$returns$__$","typeString":"function () external"}},"id":495,"isConstant":false,"isLValue":false,"isPure":false,"kind":"functionCall","lValueRequested":false,"names":[],"nodeType":"FunctionCall","src":"4563:18:0","tryCall":false,"typeDescriptions":{"typeIdentifier":"t_tuple$__$","typeString":"tuple()"}},"id":496,"nodeType":"ExpressionStatement","src":"4563:18:0"},{"expression":{"arguments":[{"hexValue":"636f6e7472616374206465706c6f796d656e74","id":500,"isConstant":false,"isLValue":false,"isPure":true,"kind":"string","lValueRequested":false,"nodeType":"Literal","src":"4604:21:0","typeDescriptions":{"typeIdentifier":"t_stringliteral_aaf9be86adf9b6872d87eed3526f7c55f3c5d61f4e4dd6d55ef2fcbb8ad0bd57","typeString":"literal_string \"contract deployment\""},"value":"contract deployment"}],"expression":{"argumentTypes":[{"typeIdentifier":"t_stringliteral_aaf9be86adf9b6872d87eed3526f7c55f3c5d61f4e4dd6d55ef2fcbb8ad0bd57","typeString":"literal_string \"contract deployment\""}],"expression":{"id":497,"name":"console","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":192,"src":"4592:7:0","typeDescriptions":{"typeIdentifier":"t_type$_t_contract$_console_$192_$","typeString":"type(library console)"}},"id":499,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"memberName":"log","nodeType":"MemberAccess","referencedDeclaration":120,"src":"4592:11:0","typeDescriptions":{"typeIdentifier":"t_function_internal_pure$_t_string_memory_ptr_$returns$__$","typeString":"function (string memory) pure"}},"id":501,"isConstant":false,"isLValue":false,"isPure":false,"kind":"functionCall","lValueRequested":false,"names":[],"nodeType":"FunctionCall","src":"4592:34:0","tryCall":false,"typeDescriptions":{"typeIdentifier":"t_tuple$__$","typeString":"tuple()"}},"id":502,"nodeType":"ExpressionStatement","src":"4592:34:0"},{"expression":{"arguments":[{"arguments":[{"arguments":[{"hexValue":"3078313233343536","id":510,"isConstant":false,"isLValue":false,"isPure":true,"kind":"number","lValueRequested":false,"nodeType":"Literal","src":"4665:8:0","typeDescriptions":{"typeIdentifier":"t_rational_1193046_by_1","typeString":"int_const 1193046"},"value":"0x123456"}],"expression":{"argumentTypes":[{"typeIdentifier":"t_rational_1193046_by_1","typeString":"int_const 1193046"}],"id":509,"isConstant":false,"isLValue":false,"isPure":true,"lValueRequested":false,"nodeType":"ElementaryTypeNameExpression","src":"4657:7:0","typeDescriptions":{"typeIdentifier":"t_type$_t_uint160_$","typeString":"type(uint160)"},"typeName":{"id":508,"name":"uint160","nodeType":"ElementaryTypeName","src":"4657:7:0","typeDescriptions":{}}},"id":511,"isConstant":false,"isLValue":false,"isPure":true,"kind":"typeConversion","lValueRequested":false,"names":[],"nodeType":"FunctionCall","src":"4657:17:0","tryCall":false,"typeDescriptions":{"typeIdentifier":"t_uint160","typeString":"uint160"}}],"expression":{"argumentTypes":[{"typeIdentifier":"t_uint160","typeString":"uint160"}],"id":507,"isConstant":false,"isLValue":false,"isPure":true,"lValueRequested":false,"nodeType":"ElementaryTypeNameExpression","src":"4649:7:0","typeDescriptions":{"typeIdentifier":"t_type$_t_address_$","typeString":"type(address)"},"typeName":{"id":506,"name":"address","nodeType":"ElementaryTypeName","src":"4649:7:0","typeDescriptions":{}}},"id":512,"isConstant":false,"isLValue":false,"isPure":true,"kind":"typeConversion","lValueRequested":false,"names":[],"nodeType":"FunctionCall","src":"4649:26:0","tryCall":false,"typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"}}],"expression":{"argumentTypes":[{"typeIdentifier":"t_address","typeString":"address"}],"expression":{"id":503,"name":"vm","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":213,"src":"4636:2:0","typeDescriptions":{"typeIdentifier":"t_contract$_Vm_$55","typeString":"contract Vm"}},"id":505,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"memberName":"broadcast","nodeType":"MemberAccess","referencedDeclaration":43,"src":"4636:12:0","typeDescriptions":{"typeIdentifier":"t_function_external_nonpayable$_t_address_$returns$__$","typeString":"function (address) external"}},"id":513,"isConstant":false,"isLValue":false,"isPure":false,"kind":"functionCall","lValueRequested":false,"names":[],"nodeType":"FunctionCall","src":"4636:40:0","tryCall":false,"typeDescriptions":{"typeIdentifier":"t_tuple$__$","typeString":"tuple()"}},"id":514,"nodeType":"ExpressionStatement","src":"4636:40:0"},{"assignments":[517],"declarations":[{"constant":false,"id":517,"mutability":"mutable","name":"x","nameLocation":"4693:1:0","nodeType":"VariableDeclaration","scope":608,"src":"4686:8:0","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_contract$_FooBar_$719","typeString":"contract FooBar"},"typeName":{"id":516,"nodeType":"UserDefinedTypeName","pathNode":{"id":515,"name":"FooBar","nodeType":"IdentifierPath","referencedDeclaration":719,"src":"4686:6:0"},"referencedDeclaration":719,"src":"4686:6:0","typeDescriptions":{"typeIdentifier":"t_contract$_FooBar_$719","typeString":"contract FooBar"}},"visibility":"internal"}],"id":523,"initialValue":{"arguments":[{"hexValue":"31323334","id":521,"isConstant":false,"isLValue":false,"isPure":true,"kind":"number","lValueRequested":false,"nodeType":"Literal","src":"4708:4:0","typeDescriptions":{"typeIdentifier":"t_rational_1234_by_1","typeString":"int_const 1234"},"value":"1234"}],"expression":{"argumentTypes":[{"typeIdentifier":"t_rational_1234_by_1","typeString":"int_const 1234"}],"id":520,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"nodeType":"NewExpression","src":"4697:10:0","typeDescriptions":{"typeIdentifier":"t_function_creation_nonpayable$_t_uint256_$returns$_t_contract$_FooBar_$719_$","typeString":"function (uint256) returns (contract FooBar)"},"typeName":{"id":519,"nodeType":"UserDefinedTypeName","pathNode":{"id":518,"name":"FooBar","nodeType":"IdentifierPath","referencedDeclaration":719,"src":"4701:6:0"},"referencedDeclaration":719,"src":"4701:6:0","typeDescriptions":{"typeIdentifier":"t_contract$_FooBar_$719","typeString":"contract FooBar"}}},"id":522,"isConstant":false,"isLValue":false,"isPure":false,"kind":"functionCall","lValueRequested":false,"names":[],"nodeType":"FunctionCall","src":"4697:16:0","tryCall":false,"typeDescriptions":{"typeIdentifier":"t_contract$_FooBar_$719","typeString":"contract FooBar"}},"nodeType":"VariableDeclarationStatement","src":"4686:27:0"},{"expression":{"arguments":[{"commonType":{"typeIdentifier":"t_uint256","typeString":"uint256"},"id":529,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"leftExpression":{"arguments":[],"expression":{"argumentTypes":[],"expression":{"id":525,"name":"x","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":517,"src":"4731:1:0","typeDescriptions":{"typeIdentifier":"t_contract$_FooBar_$719","typeString":"contract FooBar"}},"id":526,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"memberName":"foo","nodeType":"MemberAccess","referencedDeclaration":708,"src":"4731:5:0","typeDescriptions":{"typeIdentifier":"t_function_external_view$__$returns$_t_uint256_$","typeString":"function () view external returns (uint256)"}},"id":527,"isConstant":false,"isLValue":false,"isPure":false,"kind":"functionCall","lValueRequested":false,"names":[],"nodeType":"FunctionCall","src":"4731:7:0","tryCall":false,"typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"nodeType":"BinaryOperation","operator":"==","rightExpression":{"hexValue":"31323334","id":528,"isConstant":false,"isLValue":false,"isPure":true,"kind":"number","lValueRequested":false,"nodeType":"Literal","src":"4742:4:0","typeDescriptions":{"typeIdentifier":"t_rational_1234_by_1","typeString":"int_const 1234"},"value":"1234"},"src":"4731:15:0","typeDescriptions":{"typeIdentifier":"t_bool","typeString":"bool"}}],"expression":{"argumentTypes":[{"typeIdentifier":"t_bool","typeString":"bool"}],"id":524,"name":"require","nodeType":"Identifier","overloadedDeclarations":[-18,-18],"referencedDeclaration":-18,"src":"4723:7:0","typeDescriptions":{"typeIdentifier":"t_function_require_pure$_t_bool_$returns$__$","typeString":"function (bool) pure"}},"id":530,"isConstant":false,"isLValue":false,"isPure":false,"kind":"functionCall","lValueRequested":false,"names":[],"nodeType":"FunctionCall","src":"4723:24:0","tryCall":false,"typeDescriptions":{"typeIdentifier":"t_tuple$__$","typeString":"tuple()"}},"id":531,"nodeType":"ExpressionStatement","src":"4723:24:0"},{"expression":{"arguments":[{"hexValue":"6372656174652032","id":535,"isConstant":false,"isLValue":false,"isPure":true,"kind":"string","lValueRequested":false,"nodeType":"Literal","src":"4770:10:0","typeDescriptions":{"typeIdentifier":"t_stringliteral_4411d6d4ffcd00382a95255a63761e69de9810e1236042a5c64948a7b6c04daa","typeString":"literal_string \"create 2\""},"value":"create 2"}],"expression":{"argumentTypes":[{"typeIdentifier":"t_stringliteral_4411d6d4ffcd00382a95255a63761e69de9810e1236042a5c64948a7b6c04daa","typeString":"literal_string \"create 2\""}],"expression":{"id":532,"name":"console","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":192,"src":"4758:7:0","typeDescriptions":{"typeIdentifier":"t_type$_t_contract$_console_$192_$","typeString":"type(library console)"}},"id":534,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"memberName":"log","nodeType":"MemberAccess","referencedDeclaration":120,"src":"4758:11:0","typeDescriptions":{"typeIdentifier":"t_function_internal_pure$_t_string_memory_ptr_$returns$__$","typeString":"function (string memory) pure"}},"id":536,"isConstant":false,"isLValue":false,"isPure":false,"kind":"functionCall","lValueRequested":false,"names":[],"nodeType":"FunctionCall","src":"4758:23:0","tryCall":false,"typeDescriptions":{"typeIdentifier":"t_tuple$__$","typeString":"tuple()"}},"id":537,"nodeType":"ExpressionStatement","src":"4758:23:0"},{"expression":{"arguments":[{"arguments":[{"arguments":[{"hexValue":"307863616665","id":545,"isConstant":false,"isLValue":false,"isPure":true,"kind":"number","lValueRequested":false,"nodeType":"Literal","src":"4820:6:0","typeDescriptions":{"typeIdentifier":"t_rational_51966_by_1","typeString":"int_const 51966"},"value":"0xcafe"}],"expression":{"argumentTypes":[{"typeIdentifier":"t_rational_51966_by_1","typeString":"int_const 51966"}],"id":544,"isConstant":false,"isLValue":false,"isPure":true,"lValueRequested":false,"nodeType":"ElementaryTypeNameExpression","src":"4812:7:0","typeDescriptions":{"typeIdentifier":"t_type$_t_uint160_$","typeString":"type(uint160)"},"typeName":{"id":543,"name":"uint160","nodeType":"ElementaryTypeName","src":"4812:7:0","typeDescriptions":{}}},"id":546,"isConstant":false,"isLValue":false,"isPure":true,"kind":"typeConversion","lValueRequested":false,"names":[],"nodeType":"FunctionCall","src":"4812:15:0","tryCall":false,"typeDescriptions":{"typeIdentifier":"t_uint160","typeString":"uint160"}}],"expression":{"argumentTypes":[{"typeIdentifier":"t_uint160","typeString":"uint160"}],"id":542,"isConstant":false,"isLValue":false,"isPure":true,"lValueRequested":false,"nodeType":"ElementaryTypeNameExpression","src":"4804:7:0","typeDescriptions":{"typeIdentifier":"t_type$_t_address_$","typeString":"type(address)"},"typeName":{"id":541,"name":"address","nodeType":"ElementaryTypeName","src":"4804:7:0","typeDescriptions":{}}},"id":547,"isConstant":false,"isLValue":false,"isPure":true,"kind":"typeConversion","lValueRequested":false,"names":[],"nodeType":"FunctionCall","src":"4804:24:0","tryCall":false,"typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"}}],"expression":{"argumentTypes":[{"typeIdentifier":"t_address","typeString":"address"}],"expression":{"id":538,"name":"vm","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":213,"src":"4791:2:0","typeDescriptions":{"typeIdentifier":"t_contract$_Vm_$55","typeString":"contract Vm"}},"id":540,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"memberName":"broadcast","nodeType":"MemberAccess","referencedDeclaration":43,"src":"4791:12:0","typeDescriptions":{"typeIdentifier":"t_function_external_nonpayable$_t_address_$returns$__$","typeString":"function (address) external"}},"id":548,"isConstant":false,"isLValue":false,"isPure":false,"kind":"functionCall","lValueRequested":false,"names":[],"nodeType":"FunctionCall","src":"4791:38:0","tryCall":false,"typeDescriptions":{"typeIdentifier":"t_tuple$__$","typeString":"tuple()"}},"id":549,"nodeType":"ExpressionStatement","src":"4791:38:0"},{"assignments":[552],"declarations":[{"constant":false,"id":552,"mutability":"mutable","name":"y","nameLocation":"4846:1:0","nodeType":"VariableDeclaration","scope":608,"src":"4839:8:0","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_contract$_FooBar_$719","typeString":"contract FooBar"},"typeName":{"id":551,"nodeType":"UserDefinedTypeName","pathNode":{"id":550,"name":"FooBar","nodeType":"IdentifierPath","referencedDeclaration":719,"src":"4839:6:0"},"referencedDeclaration":719,"src":"4839:6:0","typeDescriptions":{"typeIdentifier":"t_contract$_FooBar_$719","typeString":"contract FooBar"}},"visibility":"internal"}],"id":566,"initialValue":{"arguments":[{"hexValue":"31323334","id":564,"isConstant":false,"isLValue":false,"isPure":true,"kind":"number","lValueRequested":false,"nodeType":"Literal","src":"4889:4:0","typeDescriptions":{"typeIdentifier":"t_rational_1234_by_1","typeString":"int_const 1234"},"value":"1234"}],"expression":{"argumentTypes":[{"typeIdentifier":"t_rational_1234_by_1","typeString":"int_const 1234"}],"expression":{"argumentTypes":[{"typeIdentifier":"t_rational_1234_by_1","typeString":"int_const 1234"}],"id":555,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"nodeType":"NewExpression","src":"4850:10:0","typeDescriptions":{"typeIdentifier":"t_function_creation_nonpayable$_t_uint256_$returns$_t_contract$_FooBar_$719_$","typeString":"function (uint256) returns (contract FooBar)"},"typeName":{"id":554,"nodeType":"UserDefinedTypeName","pathNode":{"id":553,"name":"FooBar","nodeType":"IdentifierPath","referencedDeclaration":719,"src":"4854:6:0"},"referencedDeclaration":719,"src":"4854:6:0","typeDescriptions":{"typeIdentifier":"t_contract$_FooBar_$719","typeString":"contract FooBar"}}},"id":563,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"names":["salt"],"nodeType":"FunctionCallOptions","options":[{"arguments":[{"arguments":[{"hexValue":"3432","id":560,"isConstant":false,"isLValue":false,"isPure":true,"kind":"number","lValueRequested":false,"nodeType":"Literal","src":"4883:2:0","typeDescriptions":{"typeIdentifier":"t_rational_42_by_1","typeString":"int_const 42"},"value":"42"}],"expression":{"argumentTypes":[{"typeIdentifier":"t_rational_42_by_1","typeString":"int_const 42"}],"id":559,"isConstant":false,"isLValue":false,"isPure":true,"lValueRequested":false,"nodeType":"ElementaryTypeNameExpression","src":"4875:7:0","typeDescriptions":{"typeIdentifier":"t_type$_t_uint256_$","typeString":"type(uint256)"},"typeName":{"id":558,"name":"uint256","nodeType":"ElementaryTypeName","src":"4875:7:0","typeDescriptions":{}}},"id":561,"isConstant":false,"isLValue":false,"isPure":true,"kind":"typeConversion","lValueRequested":false,"names":[],"nodeType":"FunctionCall","src":"4875:11:0","tryCall":false,"typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}}],"expression":{"argumentTypes":[{"typeIdentifier":"t_uint256","typeString":"uint256"}],"id":557,"isConstant":false,"isLValue":false,"isPure":true,"lValueRequested":false,"nodeType":"ElementaryTypeNameExpression","src":"4867:7:0","typeDescriptions":{"typeIdentifier":"t_type$_t_bytes32_$","typeString":"type(bytes32)"},"typeName":{"id":556,"name":"bytes32","nodeType":"ElementaryTypeName","src":"4867:7:0","typeDescriptions":{}}},"id":562,"isConstant":false,"isLValue":false,"isPure":true,"kind":"typeConversion","lValueRequested":false,"names":[],"nodeType":"FunctionCall","src":"4867:20:0","tryCall":false,"typeDescriptions":{"typeIdentifier":"t_bytes32","typeString":"bytes32"}}],"src":"4850:38:0","typeDescriptions":{"typeIdentifier":"t_function_creation_nonpayable$_t_uint256_$returns$_t_contract$_FooBar_$719_$salt","typeString":"function (uint256) returns (contract FooBar)"}},"id":565,"isConstant":false,"isLValue":false,"isPure":false,"kind":"functionCall","lValueRequested":false,"names":[],"nodeType":"FunctionCall","src":"4850:44:0","tryCall":false,"typeDescriptions":{"typeIdentifier":"t_contract$_FooBar_$719","typeString":"contract FooBar"}},"nodeType":"VariableDeclarationStatement","src":"4839:55:0"},{"expression":{"arguments":[{"commonType":{"typeIdentifier":"t_uint256","typeString":"uint256"},"id":572,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"leftExpression":{"arguments":[],"expression":{"argumentTypes":[],"expression":{"id":568,"name":"y","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":552,"src":"4912:1:0","typeDescriptions":{"typeIdentifier":"t_contract$_FooBar_$719","typeString":"contract FooBar"}},"id":569,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"memberName":"foo","nodeType":"MemberAccess","referencedDeclaration":708,"src":"4912:5:0","typeDescriptions":{"typeIdentifier":"t_function_external_view$__$returns$_t_uint256_$","typeString":"function () view external returns (uint256)"}},"id":570,"isConstant":false,"isLValue":false,"isPure":false,"kind":"functionCall","lValueRequested":false,"names":[],"nodeType":"FunctionCall","src":"4912:7:0","tryCall":false,"typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"nodeType":"BinaryOperation","operator":"==","rightExpression":{"hexValue":"31323334","id":571,"isConstant":false,"isLValue":false,"isPure":true,"kind":"number","lValueRequested":false,"nodeType":"Literal","src":"4923:4:0","typeDescriptions":{"typeIdentifier":"t_rational_1234_by_1","typeString":"int_const 1234"},"value":"1234"},"src":"4912:15:0","typeDescriptions":{"typeIdentifier":"t_bool","typeString":"bool"}}],"expression":{"argumentTypes":[{"typeIdentifier":"t_bool","typeString":"bool"}],"id":567,"name":"require","nodeType":"Identifier","overloadedDeclarations":[-18,-18],"referencedDeclaration":-18,"src":"4904:7:0","typeDescriptions":{"typeIdentifier":"t_function_require_pure$_t_bool_$returns$__$","typeString":"function (bool) pure"}},"id":573,"isConstant":false,"isLValue":false,"isPure":false,"kind":"functionCall","lValueRequested":false,"names":[],"nodeType":"FunctionCall","src":"4904:24:0","tryCall":false,"typeDescriptions":{"typeIdentifier":"t_tuple$__$","typeString":"tuple()"}},"id":574,"nodeType":"ExpressionStatement","src":"4904:24:0"},{"expression":{"arguments":[{"hexValue":"646f6e6521","id":578,"isConstant":false,"isLValue":false,"isPure":true,"kind":"string","lValueRequested":false,"nodeType":"Literal","src":"4950:7:0","typeDescriptions":{"typeIdentifier":"t_stringliteral_080382d5c9e9e7c5e3d1d33f5e7422740375955180fadff167d8130e0c35f3fc","typeString":"literal_string \"done!\""},"value":"done!"}],"expression":{"argumentTypes":[{"typeIdentifier":"t_stringliteral_080382d5c9e9e7c5e3d1d33f5e7422740375955180fadff167d8130e0c35f3fc","typeString":"literal_string \"done!\""}],"expression":{"id":575,"name":"console","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":192,"src":"4938:7:0","typeDescriptions":{"typeIdentifier":"t_type$_t_contract$_console_$192_$","typeString":"type(library console)"}},"id":577,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"memberName":"log","nodeType":"MemberAccess","referencedDeclaration":120,"src":"4938:11:0","typeDescriptions":{"typeIdentifier":"t_function_internal_pure$_t_string_memory_ptr_$returns$__$","typeString":"function (string memory) pure"}},"id":579,"isConstant":false,"isLValue":false,"isPure":false,"kind":"functionCall","lValueRequested":false,"names":[],"nodeType":"FunctionCall","src":"4938:20:0","tryCall":false,"typeDescriptions":{"typeIdentifier":"t_tuple$__$","typeString":"tuple()"}},"id":580,"nodeType":"ExpressionStatement","src":"4938:20:0"},{"expression":{"arguments":[],"expression":{"argumentTypes":[],"expression":{"id":581,"name":"vm","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":213,"src":"5042:2:0","typeDescriptions":{"typeIdentifier":"t_contract$_Vm_$55","typeString":"contract Vm"}},"id":583,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"memberName":"broadcast","nodeType":"MemberAccess","referencedDeclaration":38,"src":"5042:12:0","typeDescriptions":{"typeIdentifier":"t_function_external_nonpayable$__$returns$__$","typeString":"function () external"}},"id":584,"isConstant":false,"isLValue":false,"isPure":false,"kind":"functionCall","lValueRequested":false,"names":[],"nodeType":"FunctionCall","src":"5042:14:0","tryCall":false,"typeDescriptions":{"typeIdentifier":"t_tuple$__$","typeString":"tuple()"}},"id":585,"nodeType":"ExpressionStatement","src":"5042:14:0"},{"expression":{"arguments":[{"hexValue":"31323334","id":589,"isConstant":false,"isLValue":false,"isPure":true,"kind":"number","lValueRequested":false,"nodeType":"Literal","src":"5077:4:0","typeDescriptions":{"typeIdentifier":"t_rational_1234_by_1","typeString":"int_const 1234"},"value":"1234"}],"expression":{"argumentTypes":[{"typeIdentifier":"t_rational_1234_by_1","typeString":"int_const 1234"}],"id":588,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"nodeType":"NewExpression","src":"5066:10:0","typeDescriptions":{"typeIdentifier":"t_function_creation_nonpayable$_t_uint256_$returns$_t_contract$_FooBar_$719_$","typeString":"function (uint256) returns (contract FooBar)"},"typeName":{"id":587,"nodeType":"UserDefinedTypeName","pathNode":{"id":586,"name":"FooBar","nodeType":"IdentifierPath","referencedDeclaration":719,"src":"5070:6:0"},"referencedDeclaration":719,"src":"5070:6:0","typeDescriptions":{"typeIdentifier":"t_contract$_FooBar_$719","typeString":"contract FooBar"}}},"id":590,"isConstant":false,"isLValue":false,"isPure":false,"kind":"functionCall","lValueRequested":false,"names":[],"nodeType":"FunctionCall","src":"5066:16:0","tryCall":false,"typeDescriptions":{"typeIdentifier":"t_contract$_FooBar_$719","typeString":"contract FooBar"}},"id":591,"nodeType":"ExpressionStatement","src":"5066:16:0"},{"expression":{"arguments":[{"hexValue":"6e6f6e636520656e64","id":595,"isConstant":false,"isLValue":false,"isPure":true,"kind":"string","lValueRequested":false,"nodeType":"Literal","src":"5105:11:0","typeDescriptions":{"typeIdentifier":"t_stringliteral_fa629e6661ad2a2bdb09cf9a3a276ce0d722482ae5c2887650751be0938847e8","typeString":"literal_string \"nonce end\""},"value":"nonce end"},{"arguments":[{"arguments":[{"arguments":[{"id":602,"name":"this","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":-28,"src":"5146:4:0","typeDescriptions":{"typeIdentifier":"t_contract$_ScriptExample_$706","typeString":"contract ScriptExample"}}],"expression":{"argumentTypes":[{"typeIdentifier":"t_contract$_ScriptExample_$706","typeString":"contract ScriptExample"}],"id":601,"isConstant":false,"isLValue":false,"isPure":true,"lValueRequested":false,"nodeType":"ElementaryTypeNameExpression","src":"5138:7:0","typeDescriptions":{"typeIdentifier":"t_type$_t_address_$","typeString":"type(address)"},"typeName":{"id":600,"name":"address","nodeType":"ElementaryTypeName","src":"5138:7:0","typeDescriptions":{}}},"id":603,"isConstant":false,"isLValue":false,"isPure":false,"kind":"typeConversion","lValueRequested":false,"names":[],"nodeType":"FunctionCall","src":"5138:13:0","tryCall":false,"typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"}}],"expression":{"argumentTypes":[{"typeIdentifier":"t_address","typeString":"address"}],"expression":{"id":598,"name":"vm","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":213,"src":"5126:2:0","typeDescriptions":{"typeIdentifier":"t_contract$_Vm_$55","typeString":"contract Vm"}},"id":599,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"memberName":"getNonce","nodeType":"MemberAccess","referencedDeclaration":17,"src":"5126:11:0","typeDescriptions":{"typeIdentifier":"t_function_external_view$_t_address_$returns$_t_uint64_$","typeString":"function (address) view external returns (uint64)"}},"id":604,"isConstant":false,"isLValue":false,"isPure":false,"kind":"functionCall","lValueRequested":false,"names":[],"nodeType":"FunctionCall","src":"5126:26:0","tryCall":false,"typeDescriptions":{"typeIdentifier":"t_uint64","typeString":"uint64"}}],"expression":{"argumentTypes":[{"typeIdentifier":"t_uint64","typeString":"uint64"}],"id":597,"isConstant":false,"isLValue":false,"isPure":true,"lValueRequested":false,"nodeType":"ElementaryTypeNameExpression","src":"5118:7:0","typeDescriptions":{"typeIdentifier":"t_type$_t_uint256_$","typeString":"type(uint256)"},"typeName":{"id":596,"name":"uint256","nodeType":"ElementaryTypeName","src":"5118:7:0","typeDescriptions":{}}},"id":605,"isConstant":false,"isLValue":false,"isPure":false,"kind":"typeConversion","lValueRequested":false,"names":[],"nodeType":"FunctionCall","src":"5118:35:0","tryCall":false,"typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}}],"expression":{"argumentTypes":[{"typeIdentifier":"t_stringliteral_fa629e6661ad2a2bdb09cf9a3a276ce0d722482ae5c2887650751be0938847e8","typeString":"literal_string \"nonce end\""},{"typeIdentifier":"t_uint256","typeString":"uint256"}],"expression":{"id":592,"name":"console","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":192,"src":"5093:7:0","typeDescriptions":{"typeIdentifier":"t_type$_t_contract$_console_$192_$","typeString":"type(library console)"}},"id":594,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"memberName":"log","nodeType":"MemberAccess","referencedDeclaration":154,"src":"5093:11:0","typeDescriptions":{"typeIdentifier":"t_function_internal_pure$_t_string_memory_ptr_$_t_uint256_$returns$__$","typeString":"function (string memory,uint256) pure"}},"id":606,"isConstant":false,"isLValue":false,"isPure":false,"kind":"functionCall","lValueRequested":false,"names":[],"nodeType":"FunctionCall","src":"5093:61:0","tryCall":false,"typeDescriptions":{"typeIdentifier":"t_tuple$__$","typeString":"tuple()"}},"id":607,"nodeType":"ExpressionStatement","src":"5093:61:0"}]},"documentation":{"id":379,"nodeType":"StructuredDocumentation","src":"3842:56:0","text":"@notice example function, to test vm.broadcast with."},"functionSelector":"bef03abc","implemented":true,"kind":"function","modifiers":[],"name":"runBroadcast","nameLocation":"3912:12:0","parameters":{"id":380,"nodeType":"ParameterList","parameters":[],"src":"3924:2:0"},"returnParameters":{"id":381,"nodeType":"ParameterList","parameters":[],"src":"3934:0:0"},"scope":706,"stateMutability":"nonpayable","virtual":false,"visibility":"public"},{"id":633,"nodeType":"FunctionDefinition","src":"5256:143:0","nodes":[],"body":{"id":632,"nodeType":"Block","src":"5305:94:0","nodes":[],"statements":[{"expression":{"arguments":[{"id":618,"name":"_v","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":612,"src":"5327:2:0","typeDescriptions":{"typeIdentifier":"t_string_calldata_ptr","typeString":"string calldata"}}],"expression":{"argumentTypes":[{"typeIdentifier":"t_string_calldata_ptr","typeString":"string calldata"}],"expression":{"id":615,"name":"console","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":192,"src":"5315:7:0","typeDescriptions":{"typeIdentifier":"t_type$_t_contract$_console_$192_$","typeString":"type(library console)"}},"id":617,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"memberName":"log","nodeType":"MemberAccess","referencedDeclaration":120,"src":"5315:11:0","typeDescriptions":{"typeIdentifier":"t_function_internal_pure$_t_string_memory_ptr_$returns$__$","typeString":"function (string memory) pure"}},"id":619,"isConstant":false,"isLValue":false,"isPure":false,"kind":"functionCall","lValueRequested":false,"names":[],"nodeType":"FunctionCall","src":"5315:15:0","tryCall":false,"typeDescriptions":{"typeIdentifier":"t_tuple$__$","typeString":"tuple()"}},"id":620,"nodeType":"ExpressionStatement","src":"5315:15:0"},{"expression":{"arguments":[{"hexValue":"68656c6c6f206d73672e73656e646572","id":624,"isConstant":false,"isLValue":false,"isPure":true,"kind":"string","lValueRequested":false,"nodeType":"Literal","src":"5352:18:0","typeDescriptions":{"typeIdentifier":"t_stringliteral_b3cc13bc51228b2c4c4334d82a4772908254dc0e1c512893dd16208ef13efb8e","typeString":"literal_string \"hello msg.sender\""},"value":"hello msg.sender"},{"arguments":[{"expression":{"id":627,"name":"msg","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":-15,"src":"5380:3:0","typeDescriptions":{"typeIdentifier":"t_magic_message","typeString":"msg"}},"id":628,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"memberName":"sender","nodeType":"MemberAccess","src":"5380:10:0","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"}}],"expression":{"argumentTypes":[{"typeIdentifier":"t_address","typeString":"address"}],"id":626,"isConstant":false,"isLValue":false,"isPure":true,"lValueRequested":false,"nodeType":"ElementaryTypeNameExpression","src":"5372:7:0","typeDescriptions":{"typeIdentifier":"t_type$_t_address_$","typeString":"type(address)"},"typeName":{"id":625,"name":"address","nodeType":"ElementaryTypeName","src":"5372:7:0","typeDescriptions":{}}},"id":629,"isConstant":false,"isLValue":false,"isPure":false,"kind":"typeConversion","lValueRequested":false,"names":[],"nodeType":"FunctionCall","src":"5372:19:0","tryCall":false,"typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"}}],"expression":{"argumentTypes":[{"typeIdentifier":"t_stringliteral_b3cc13bc51228b2c4c4334d82a4772908254dc0e1c512893dd16208ef13efb8e","typeString":"literal_string \"hello msg.sender\""},{"typeIdentifier":"t_address","typeString":"address"}],"expression":{"id":621,"name":"console","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":192,"src":"5340:7:0","typeDescriptions":{"typeIdentifier":"t_type$_t_contract$_console_$192_$","typeString":"type(library console)"}},"id":623,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"memberName":"log","nodeType":"MemberAccess","referencedDeclaration":171,"src":"5340:11:0","typeDescriptions":{"typeIdentifier":"t_function_internal_pure$_t_string_memory_ptr_$_t_address_$returns$__$","typeString":"function (string memory,address) pure"}},"id":630,"isConstant":false,"isLValue":false,"isPure":false,"kind":"functionCall","lValueRequested":false,"names":[],"nodeType":"FunctionCall","src":"5340:52:0","tryCall":false,"typeDescriptions":{"typeIdentifier":"t_tuple$__$","typeString":"tuple()"}},"id":631,"nodeType":"ExpressionStatement","src":"5340:52:0"}]},"documentation":{"id":610,"nodeType":"StructuredDocumentation","src":"5167:84:0","text":"@notice example external function, to force a CALL, and test vm.startPrank with."},"functionSelector":"a777d0dc","implemented":true,"kind":"function","modifiers":[],"name":"hello","nameLocation":"5265:5:0","parameters":{"id":613,"nodeType":"ParameterList","parameters":[{"constant":false,"id":612,"mutability":"mutable","name":"_v","nameLocation":"5287:2:0","nodeType":"VariableDeclaration","scope":633,"src":"5271:18:0","stateVariable":false,"storageLocation":"calldata","typeDescriptions":{"typeIdentifier":"t_string_calldata_ptr","typeString":"string"},"typeName":{"id":611,"name":"string","nodeType":"ElementaryTypeName","src":"5271:6:0","typeDescriptions":{"typeIdentifier":"t_string_storage_ptr","typeString":"string"}},"visibility":"internal"}],"src":"5270:20:0"},"returnParameters":{"id":614,"nodeType":"ParameterList","parameters":[],"src":"5305:0:0"},"scope":706,"stateMutability":"view","virtual":false,"visibility":"external"},{"id":648,"nodeType":"FunctionDefinition","src":"5405:95:0","nodes":[],"body":{"id":647,"nodeType":"Block","src":"5449:51:0","nodes":[],"statements":[{"expression":{"id":639,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"nodeType":"UnaryOperation","operator":"++","prefix":false,"src":"5459:9:0","subExpression":{"id":638,"name":"counter","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":215,"src":"5459:7:0","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"id":640,"nodeType":"ExpressionStatement","src":"5459:9:0"},{"expression":{"arguments":[{"id":644,"name":"_v","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":635,"src":"5490:2:0","typeDescriptions":{"typeIdentifier":"t_string_calldata_ptr","typeString":"string calldata"}}],"expression":{"argumentTypes":[{"typeIdentifier":"t_string_calldata_ptr","typeString":"string calldata"}],"expression":{"id":641,"name":"console","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":192,"src":"5478:7:0","typeDescriptions":{"typeIdentifier":"t_type$_t_contract$_console_$192_$","typeString":"type(library console)"}},"id":643,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"memberName":"log","nodeType":"MemberAccess","referencedDeclaration":120,"src":"5478:11:0","typeDescriptions":{"typeIdentifier":"t_function_internal_pure$_t_string_memory_ptr_$returns$__$","typeString":"function (string memory) pure"}},"id":645,"isConstant":false,"isLValue":false,"isPure":false,"kind":"functionCall","lValueRequested":false,"names":[],"nodeType":"FunctionCall","src":"5478:15:0","tryCall":false,"typeDescriptions":{"typeIdentifier":"t_tuple$__$","typeString":"tuple()"}},"id":646,"nodeType":"ExpressionStatement","src":"5478:15:0"}]},"functionSelector":"7e79255d","implemented":true,"kind":"function","modifiers":[],"name":"call1","nameLocation":"5414:5:0","parameters":{"id":636,"nodeType":"ParameterList","parameters":[{"constant":false,"id":635,"mutability":"mutable","name":"_v","nameLocation":"5436:2:0","nodeType":"VariableDeclaration","scope":648,"src":"5420:18:0","stateVariable":false,"storageLocation":"calldata","typeDescriptions":{"typeIdentifier":"t_string_calldata_ptr","typeString":"string"},"typeName":{"id":634,"name":"string","nodeType":"ElementaryTypeName","src":"5420:6:0","typeDescriptions":{"typeIdentifier":"t_string_storage_ptr","typeString":"string"}},"visibility":"internal"}],"src":"5419:20:0"},"returnParameters":{"id":637,"nodeType":"ParameterList","parameters":[],"src":"5449:0:0"},"scope":706,"stateMutability":"nonpayable","virtual":false,"visibility":"external"},{"id":663,"nodeType":"FunctionDefinition","src":"5506:95:0","nodes":[],"body":{"id":662,"nodeType":"Block","src":"5550:51:0","nodes":[],"statements":[{"expression":{"id":654,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"nodeType":"UnaryOperation","operator":"++","prefix":false,"src":"5560:9:0","subExpression":{"id":653,"name":"counter","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":215,"src":"5560:7:0","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"id":655,"nodeType":"ExpressionStatement","src":"5560:9:0"},{"expression":{"arguments":[{"id":659,"name":"_v","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":650,"src":"5591:2:0","typeDescriptions":{"typeIdentifier":"t_string_calldata_ptr","typeString":"string calldata"}}],"expression":{"argumentTypes":[{"typeIdentifier":"t_string_calldata_ptr","typeString":"string calldata"}],"expression":{"id":656,"name":"console","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":192,"src":"5579:7:0","typeDescriptions":{"typeIdentifier":"t_type$_t_contract$_console_$192_$","typeString":"type(library console)"}},"id":658,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"memberName":"log","nodeType":"MemberAccess","referencedDeclaration":120,"src":"5579:11:0","typeDescriptions":{"typeIdentifier":"t_function_internal_pure$_t_string_memory_ptr_$returns$__$","typeString":"function (string memory) pure"}},"id":660,"isConstant":false,"isLValue":false,"isPure":false,"kind":"functionCall","lValueRequested":false,"names":[],"nodeType":"FunctionCall","src":"5579:15:0","tryCall":false,"typeDescriptions":{"typeIdentifier":"t_tuple$__$","typeString":"tuple()"}},"id":661,"nodeType":"ExpressionStatement","src":"5579:15:0"}]},"functionSelector":"8d3ef7ca","implemented":true,"kind":"function","modifiers":[],"name":"call2","nameLocation":"5515:5:0","parameters":{"id":651,"nodeType":"ParameterList","parameters":[{"constant":false,"id":650,"mutability":"mutable","name":"_v","nameLocation":"5537:2:0","nodeType":"VariableDeclaration","scope":663,"src":"5521:18:0","stateVariable":false,"storageLocation":"calldata","typeDescriptions":{"typeIdentifier":"t_string_calldata_ptr","typeString":"string"},"typeName":{"id":649,"name":"string","nodeType":"ElementaryTypeName","src":"5521:6:0","typeDescriptions":{"typeIdentifier":"t_string_storage_ptr","typeString":"string"}},"visibility":"internal"}],"src":"5520:20:0"},"returnParameters":{"id":652,"nodeType":"ParameterList","parameters":[],"src":"5550:0:0"},"scope":706,"stateMutability":"nonpayable","virtual":false,"visibility":"external"},{"id":678,"nodeType":"FunctionDefinition","src":"5607:98:0","nodes":[],"body":{"id":677,"nodeType":"Block","src":"5653:52:0","nodes":[],"statements":[{"expression":{"id":669,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"nodeType":"UnaryOperation","operator":"++","prefix":false,"src":"5663:9:0","subExpression":{"id":668,"name":"counter","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":215,"src":"5663:7:0","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"id":670,"nodeType":"ExpressionStatement","src":"5663:9:0"},{"expression":{"arguments":[{"id":674,"name":"_v","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":665,"src":"5695:2:0","typeDescriptions":{"typeIdentifier":"t_string_calldata_ptr","typeString":"string calldata"}}],"expression":{"argumentTypes":[{"typeIdentifier":"t_string_calldata_ptr","typeString":"string calldata"}],"expression":{"id":671,"name":"this","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":-28,"src":"5682:4:0","typeDescriptions":{"typeIdentifier":"t_contract$_ScriptExample_$706","typeString":"contract ScriptExample"}},"id":673,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"memberName":"nested2","nodeType":"MemberAccess","referencedDeclaration":693,"src":"5682:12:0","typeDescriptions":{"typeIdentifier":"t_function_external_nonpayable$_t_string_memory_ptr_$returns$__$","typeString":"function (string memory) external"}},"id":675,"isConstant":false,"isLValue":false,"isPure":false,"kind":"functionCall","lValueRequested":false,"names":[],"nodeType":"FunctionCall","src":"5682:16:0","tryCall":false,"typeDescriptions":{"typeIdentifier":"t_tuple$__$","typeString":"tuple()"}},"id":676,"nodeType":"ExpressionStatement","src":"5682:16:0"}]},"functionSelector":"a76ccdfa","implemented":true,"kind":"function","modifiers":[],"name":"nested1","nameLocation":"5616:7:0","parameters":{"id":666,"nodeType":"ParameterList","parameters":[{"constant":false,"id":665,"mutability":"mutable","name":"_v","nameLocation":"5640:2:0","nodeType":"VariableDeclaration","scope":678,"src":"5624:18:0","stateVariable":false,"storageLocation":"calldata","typeDescriptions":{"typeIdentifier":"t_string_calldata_ptr","typeString":"string"},"typeName":{"id":664,"name":"string","nodeType":"ElementaryTypeName","src":"5624:6:0","typeDescriptions":{"typeIdentifier":"t_string_storage_ptr","typeString":"string"}},"visibility":"internal"}],"src":"5623:20:0"},"returnParameters":{"id":667,"nodeType":"ParameterList","parameters":[],"src":"5653:0:0"},"scope":706,"stateMutability":"nonpayable","virtual":false,"visibility":"external"},{"id":693,"nodeType":"FunctionDefinition","src":"5711:97:0","nodes":[],"body":{"id":692,"nodeType":"Block","src":"5757:51:0","nodes":[],"statements":[{"expression":{"id":684,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"nodeType":"UnaryOperation","operator":"++","prefix":false,"src":"5767:9:0","subExpression":{"id":683,"name":"counter","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":215,"src":"5767:7:0","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"id":685,"nodeType":"ExpressionStatement","src":"5767:9:0"},{"expression":{"arguments":[{"id":689,"name":"_v","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":680,"src":"5798:2:0","typeDescriptions":{"typeIdentifier":"t_string_calldata_ptr","typeString":"string calldata"}}],"expression":{"argumentTypes":[{"typeIdentifier":"t_string_calldata_ptr","typeString":"string calldata"}],"expression":{"id":686,"name":"console","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":192,"src":"5786:7:0","typeDescriptions":{"typeIdentifier":"t_type$_t_contract$_console_$192_$","typeString":"type(library console)"}},"id":688,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"memberName":"log","nodeType":"MemberAccess","referencedDeclaration":120,"src":"5786:11:0","typeDescriptions":{"typeIdentifier":"t_function_internal_pure$_t_string_memory_ptr_$returns$__$","typeString":"function (string memory) pure"}},"id":690,"isConstant":false,"isLValue":false,"isPure":false,"kind":"functionCall","lValueRequested":false,"names":[],"nodeType":"FunctionCall","src":"5786:15:0","tryCall":false,"typeDescriptions":{"typeIdentifier":"t_tuple$__$","typeString":"tuple()"}},"id":691,"nodeType":"ExpressionStatement","src":"5786:15:0"}]},"functionSelector":"dbf1282f","implemented":true,"kind":"function","modifiers":[],"name":"nested2","nameLocation":"5720:7:0","parameters":{"id":681,"nodeType":"ParameterList","parameters":[{"constant":false,"id":680,"mutability":"mutable","name":"_v","nameLocation":"5744:2:0","nodeType":"VariableDeclaration","scope":693,"src":"5728:18:0","stateVariable":false,"storageLocation":"calldata","typeDescriptions":{"typeIdentifier":"t_string_calldata_ptr","typeString":"string"},"typeName":{"id":679,"name":"string","nodeType":"ElementaryTypeName","src":"5728:6:0","typeDescriptions":{"typeIdentifier":"t_string_storage_ptr","typeString":"string"}},"visibility":"internal"}],"src":"5727:20:0"},"returnParameters":{"id":682,"nodeType":"ParameterList","parameters":[],"src":"5757:0:0"},"scope":706,"stateMutability":"nonpayable","virtual":false,"visibility":"external"},{"id":705,"nodeType":"FunctionDefinition","src":"5814:84:0","nodes":[],"body":{"id":704,"nodeType":"Block","src":"5866:32:0","nodes":[],"statements":[{"expression":{"arguments":[{"id":701,"name":"_v","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":695,"src":"5888:2:0","typeDescriptions":{"typeIdentifier":"t_string_calldata_ptr","typeString":"string calldata"}}],"expression":{"argumentTypes":[{"typeIdentifier":"t_string_calldata_ptr","typeString":"string calldata"}],"expression":{"id":698,"name":"console","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":192,"src":"5876:7:0","typeDescriptions":{"typeIdentifier":"t_type$_t_contract$_console_$192_$","typeString":"type(library console)"}},"id":700,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"memberName":"log","nodeType":"MemberAccess","referencedDeclaration":120,"src":"5876:11:0","typeDescriptions":{"typeIdentifier":"t_function_internal_pure$_t_string_memory_ptr_$returns$__$","typeString":"function (string memory) pure"}},"id":702,"isConstant":false,"isLValue":false,"isPure":false,"kind":"functionCall","lValueRequested":false,"names":[],"nodeType":"FunctionCall","src":"5876:15:0","tryCall":false,"typeDescriptions":{"typeIdentifier":"t_tuple$__$","typeString":"tuple()"}},"id":703,"nodeType":"ExpressionStatement","src":"5876:15:0"}]},"functionSelector":"7f8b915c","implemented":true,"kind":"function","modifiers":[],"name":"callPure","nameLocation":"5823:8:0","parameters":{"id":696,"nodeType":"ParameterList","parameters":[{"constant":false,"id":695,"mutability":"mutable","name":"_v","nameLocation":"5848:2:0","nodeType":"VariableDeclaration","scope":705,"src":"5832:18:0","stateVariable":false,"storageLocation":"calldata","typeDescriptions":{"typeIdentifier":"t_string_calldata_ptr","typeString":"string"},"typeName":{"id":694,"name":"string","nodeType":"ElementaryTypeName","src":"5832:6:0","typeDescriptions":{"typeIdentifier":"t_string_storage_ptr","typeString":"string"}},"visibility":"internal"}],"src":"5831:20:0"},"returnParameters":{"id":697,"nodeType":"ParameterList","parameters":[],"src":"5866:0:0"},"scope":706,"stateMutability":"pure","virtual":false,"visibility":"external"}],"abstract":false,"baseContracts":[],"canonicalName":"ScriptExample","contractDependencies":[719],"contractKind":"contract","documentation":{"id":193,"nodeType":"StructuredDocumentation","src":"2415:126:0","text":"@title ScriptExample\n @notice ScriptExample is an example script. The Go forge script code tests that it can run this."},"fullyImplemented":true,"linearizedBaseContracts":[706],"name":"ScriptExample","nameLocation":"2550:13:0","scope":720,"usedErrors":[]},{"id":719,"nodeType":"ContractDefinition","src":"5902:96:0","nodes":[{"id":708,"nodeType":"VariableDeclaration","src":"5924:18:0","nodes":[],"constant":false,"functionSelector":"c2985578","mutability":"mutable","name":"foo","nameLocation":"5939:3:0","scope":719,"stateVariable":true,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"},"typeName":{"id":707,"name":"uint256","nodeType":"ElementaryTypeName","src":"5924:7:0","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"visibility":"public"},{"id":718,"nodeType":"FunctionDefinition","src":"5949:47:0","nodes":[],"body":{"id":717,"nodeType":"Block","src":"5972:24:0","nodes":[],"statements":[{"expression":{"id":715,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"leftHandSide":{"id":713,"name":"foo","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":708,"src":"5982:3:0","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"nodeType":"Assignment","operator":"=","rightHandSide":{"id":714,"name":"v","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":710,"src":"5988:1:0","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"src":"5982:7:0","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"id":716,"nodeType":"ExpressionStatement","src":"5982:7:0"}]},"implemented":true,"kind":"constructor","modifiers":[],"name":"","nameLocation":"-1:-1:-1","parameters":{"id":711,"nodeType":"ParameterList","parameters":[{"constant":false,"id":710,"mutability":"mutable","name":"v","nameLocation":"5969:1:0","nodeType":"VariableDeclaration","scope":718,"src":"5961:9:0","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"},"typeName":{"id":709,"name":"uint256","nodeType":"ElementaryTypeName","src":"5961:7:0","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"visibility":"internal"}],"src":"5960:11:0"},"returnParameters":{"id":712,"nodeType":"ParameterList","parameters":[],"src":"5972:0:0"},"scope":719,"stateMutability":"nonpayable","virtual":false,"visibility":"public"}],"abstract":false,"baseContracts":[],"canonicalName":"FooBar","contractDependencies":[],"contractKind":"contract","fullyImplemented":true,"linearizedBaseContracts":[719],"name":"FooBar","nameLocation":"5911:6:0","scope":720,"usedErrors":[]}],"license":"MIT"},"id":0} \ No newline at end of file diff --git a/op-chain-ops/script/with.go b/op-chain-ops/script/with.go new file mode 100644 index 000000000000..00560d5a6b6e --- /dev/null +++ b/op-chain-ops/script/with.go @@ -0,0 +1,76 @@ +package script + +import ( + "fmt" + + "github.com/ethereum/go-ethereum/accounts/abi" + "github.com/ethereum/go-ethereum/common" + "github.com/ethereum/go-ethereum/crypto" +) + +func checkABI(abiData *abi.ABI, methodSignature string) bool { + for _, m := range abiData.Methods { + if m.Sig == methodSignature { + return true + } + } + return false +} + +// WithScript deploys a script contract, at a create-address based on the ScriptDeployer. +// The returned cleanup function wipes the script account again (but not the storage). +func WithScript[B any](h *Host, name string, contract string) (b *B, cleanup func(), err error) { + // load contract artifact + artifact, err := h.af.ReadArtifact(name, contract) + if err != nil { + return nil, nil, fmt.Errorf("could not load script artifact: %w", err) + } + + deployer := ScriptDeployer + deployNonce := h.state.GetNonce(deployer) + // compute address of script contract to be deployed + addr := crypto.CreateAddress(deployer, deployNonce) + + // init bindings (with ABI check) + bindings, err := MakeBindings[B](h.ScriptBackendFn(addr), func(abiDef string) bool { + return checkABI(&artifact.ABI, abiDef) + }) + if err != nil { + return nil, nil, fmt.Errorf("failed to make bindings: %w", err) + } + + // Scripts can be very large + h.EnforceMaxCodeSize(false) + defer h.EnforceMaxCodeSize(true) + // deploy the script contract + deployedAddr, err := h.Create(deployer, artifact.Bytecode.Object) + if err != nil { + return nil, nil, fmt.Errorf("failed to deploy script: %w", err) + } + if deployedAddr != addr { + return nil, nil, fmt.Errorf("deployed to unexpected address %s, expected %s", deployedAddr, addr) + } + h.RememberArtifact(addr, artifact, contract) + h.Label(addr, contract) + return bindings, func() { + h.Wipe(addr) + }, nil +} + +// WithPrecompileAtAddress turns a struct into a precompile, +// and inserts it as override at the given address in the host. +// A cleanup function is returned, to remove the precompile override again. +func WithPrecompileAtAddress[E any](h *Host, addr common.Address, elem E, opts ...PrecompileOption[E]) (cleanup func(), err error) { + if h.HasPrecompileOverride(addr) { + return nil, fmt.Errorf("already have existing precompile override at %s", addr) + } + precompile, err := NewPrecompile[E](elem, opts...) + if err != nil { + return nil, fmt.Errorf("failed to construct precompile: %w", err) + } + h.SetPrecompile(addr, precompile) + h.Label(addr, fmt.Sprintf("%T", precompile.Precompile)) + return func() { + h.SetPrecompile(addr, nil) + }, nil +} diff --git a/op-chain-ops/srcmap/solutil.go b/op-chain-ops/srcmap/solutil.go index 01b1add4bc29..6d1aa4c64a3e 100644 --- a/op-chain-ops/srcmap/solutil.go +++ b/op-chain-ops/srcmap/solutil.go @@ -3,12 +3,12 @@ package srcmap import ( "fmt" "io" - "math/big" - "os" + "io/fs" "strconv" "strings" "github.com/ethereum/go-ethereum/common" + "github.com/ethereum/go-ethereum/core/tracing" "github.com/ethereum/go-ethereum/core/vm" ) @@ -70,84 +70,117 @@ func parseInstrMapping(last InstrMapping, v string) (InstrMapping, error) { return out, err } +func loadLineColData(srcFs fs.FS, srcPath string) ([]LineCol, error) { + dat, err := fs.ReadFile(srcFs, srcPath) + if err != nil { + return nil, fmt.Errorf("failed to read source %q: %w", srcPath, err) + } + datStr := string(dat) + out := make([]LineCol, len(datStr)) + line := uint32(1) + lastLinePos := uint32(0) + for i, b := range datStr { // iterate the utf8 or the bytes? + col := uint32(i) - lastLinePos + out[i] = LineCol{Line: line, Col: col} + if b == '\n' { + lastLinePos = uint32(i) + line += 1 + } + } + return out, nil +} + +type SourceID uint64 + +func (id *SourceID) UnmarshalText(data []byte) error { + v, err := strconv.ParseUint(string(data), 10, 64) + if err != nil { + return err + } + *id = SourceID(v) + return nil +} + +// SourceMap is a util to map solidity deployed-bytecode positions +// to source-file, line and column position data. +// It is best used in combination with foundry.SourceMapFS to load the source-map. +// The source-map functionality is tested as part of the FS. type SourceMap struct { - // source names - Sources []string + srcFs fs.FS + srcIDToPath map[SourceID]string // per source, source offset -> line/col - PosData [][]LineCol + // This data is lazy-loaded. + PosData map[SourceID][]LineCol // per bytecode byte, byte index -> instr Instr []InstrMapping } -func (s *SourceMap) Info(pc uint64) (source string, line uint32, col uint32) { +// Info translates a program-counter (execution position in the EVM bytecode) +// into the source-code location that is being executed. +// This location is the source file-path, the line number, and column number. +// This may return an error, as the source-file is lazy-loaded to calculate the position data. +func (s *SourceMap) Info(pc uint64) (source string, line uint32, col uint32, err error) { + if pc >= uint64(len(s.Instr)) { + source = "invalid" + return + } instr := s.Instr[pc] - if instr.F < 0 { - return "generated", 0, 0 + if instr.F < 0 || instr == (InstrMapping{}) { + return "generated", 0, 0, nil } - if instr.F >= int32(len(s.Sources)) { + id := SourceID(instr.F) + if _, ok := s.srcIDToPath[id]; !ok { source = "unknown" return } - source = s.Sources[instr.F] + source = s.srcIDToPath[id] if instr.S < 0 { return } - if s.PosData[instr.F] == nil { // when the source file is known to be unavailable - return + posData, ok := s.PosData[id] + if !ok { + data, loadErr := loadLineColData(s.srcFs, source) + if loadErr != nil { + return source, 0, 0, loadErr + } + s.PosData[id] = data + posData = data } - if int(instr.S) >= len(s.PosData[instr.F]) { // possibly invalid / truncated source mapping + if int(instr.S) >= len(posData) { // possibly invalid / truncated source mapping return } - lc := s.PosData[instr.F][instr.S] + lc := posData[instr.S] line = lc.Line col = lc.Col return } +// FormattedInfo is a convenience method to run Info, and turn it into a formatted string. +// Any error is turned into a string also, to make this simple to plug into logging. func (s *SourceMap) FormattedInfo(pc uint64) string { - f, l, c := s.Info(pc) + f, l, c, err := s.Info(pc) + if err != nil { + return "srcmap err:" + err.Error() + } return fmt.Sprintf("%s:%d:%d", f, l, c) } // ParseSourceMap parses a solidity sourcemap: mapping bytecode indices to source references. // See https://docs.soliditylang.org/en/latest/internals/source_mappings.html // -// Sources is the list of source files, which will be read from the filesystem -// to transform token numbers into line/column numbers. -// The sources are as referenced in the source-map by index. -// Not all sources are necessary, some indices may be unknown. -func ParseSourceMap(sources []string, bytecode []byte, sourceMap string) (*SourceMap, error) { +// The srcIDToPath is the mapping of source files, which will be read from the filesystem +// to transform token numbers into line/column numbers. Source-files are lazy-loaded when needed. +// +// The source identifier mapping can be loaded through a foundry.SourceMapFS, +// also including a convenience util to load a source-map from an artifact. +func ParseSourceMap(srcFs fs.FS, srcIDToPath map[SourceID]string, bytecode []byte, sourceMap string) (*SourceMap, error) { instructions := strings.Split(sourceMap, ";") srcMap := &SourceMap{ - Sources: sources, - PosData: make([][]LineCol, 0, len(sources)), - Instr: make([]InstrMapping, 0, len(bytecode)), - } - // map source code position byte offsets to line/column pairs - for i, s := range sources { - if strings.HasPrefix(s, "~") { - srcMap.PosData = append(srcMap.PosData, nil) - continue - } - dat, err := os.ReadFile(s) - if err != nil { - return nil, fmt.Errorf("failed to read source %d %q: %w", i, s, err) - } - datStr := string(dat) - - out := make([]LineCol, len(datStr)) - line := uint32(1) - lastLinePos := uint32(0) - for i, b := range datStr { // iterate the utf8 or the bytes? - col := uint32(i) - lastLinePos - out[i] = LineCol{Line: line, Col: col} - if b == '\n' { - lastLinePos = uint32(i) - line += 1 - } - } - srcMap.PosData = append(srcMap.PosData, out) + srcFs: srcFs, + srcIDToPath: srcIDToPath, + PosData: make(map[SourceID][]LineCol), + Instr: make([]InstrMapping, 0, len(bytecode)), } instIndex := 0 @@ -169,6 +202,7 @@ func ParseSourceMap(sources []string, bytecode []byte, sourceMap string) (*Sourc } else { instMapping = instructions[instIndex] } + // the last instruction is used to de-dup data with in the source-map encoding. m, err := parseInstrMapping(lastInstr, instMapping) if err != nil { return nil, fmt.Errorf("failed to parse instr element in source map: %w", err) @@ -177,6 +211,7 @@ func ParseSourceMap(sources []string, bytecode []byte, sourceMap string) (*Sourc for j := 0; j < instLen; j++ { srcMap.Instr = append(srcMap.Instr, m) } + lastInstr = m i += instLen instIndex += 1 } @@ -192,56 +227,51 @@ type SourceMapTracer struct { out io.Writer } -func (s *SourceMapTracer) CaptureTxStart(gasLimit uint64) {} - -func (s *SourceMapTracer) CaptureTxEnd(restGas uint64) {} - -func (s *SourceMapTracer) CaptureStart(env *vm.EVM, from common.Address, to common.Address, create bool, input []byte, gas uint64, value *big.Int) { -} - -func (s *SourceMapTracer) CaptureEnd(output []byte, gasUsed uint64, err error) {} - -func (s *SourceMapTracer) CaptureEnter(typ vm.OpCode, from common.Address, to common.Address, input []byte, gas uint64, value *big.Int) { -} - -func (s *SourceMapTracer) CaptureExit(output []byte, gasUsed uint64, err error) {} - -func (s *SourceMapTracer) info(codeAddr *common.Address, pc uint64) string { - info := "non-contract" - if codeAddr != nil { - srcMap, ok := s.srcMaps[*codeAddr] - if ok { - info = srcMap.FormattedInfo(pc) - } else { - info = "unknown-contract" - } +func (s *SourceMapTracer) info(codeAddr common.Address, pc uint64) string { + info := "unknown-contract" + srcMap, ok := s.srcMaps[codeAddr] + if ok { + info = srcMap.FormattedInfo(pc) } return info } -func (s *SourceMapTracer) CaptureState(pc uint64, op vm.OpCode, gas, cost uint64, scope *vm.ScopeContext, rData []byte, depth int, err error) { +func (s *SourceMapTracer) OnOpCode(pc uint64, opcode byte, gas, cost uint64, scope tracing.OpContext, rData []byte, depth int, err error) { + op := vm.OpCode(opcode) if op.IsPush() { - start := uint64(op) - uint64(vm.PUSH1) + 1 - end := pc + 1 + start - val := scope.Contract.Code[pc+1 : end] - fmt.Fprintf(s.out, "%-40s : pc %x opcode %s (%x)\n", s.info(scope.Contract.CodeAddr, pc), pc, op.String(), val) + var val []byte + sc, ok := scope.(*vm.ScopeContext) + if ok { + start := pc + 1 + end := uint64(op) - uint64(vm.PUSH1) + 1 + val = sc.Contract.Code[start : start+end] + } else { + val = []byte("N/A") + } + fmt.Fprintf(s.out, "%-40s : pc %x opcode %s (%x)\n", s.info(scope.Address(), pc), pc, op.String(), val) return } - fmt.Fprintf(s.out, "%-40s : pc %x opcode %s\n", s.info(scope.Contract.CodeAddr, pc), pc, op.String()) + fmt.Fprintf(s.out, "%-40s : pc %x opcode %s\n", s.info(scope.Address(), pc), pc, op.String()) } -func (s *SourceMapTracer) CaptureFault(pc uint64, op vm.OpCode, gas, cost uint64, scope *vm.ScopeContext, depth int, err error) { - fmt.Fprintf(s.out, "%-40s: pc %x opcode %s FAULT %v\n", s.info(scope.Contract.CodeAddr, pc), pc, op.String(), err) +func (s *SourceMapTracer) OnFault(pc uint64, opcode byte, gas, cost uint64, scope tracing.OpContext, depth int, err error) { + op := vm.OpCode(opcode) + fmt.Fprintf(s.out, "%-40s: pc %x opcode %s FAULT %v\n", s.info(scope.Address(), pc), pc, op.String(), err) fmt.Println("----") - fmt.Fprintf(s.out, "calldata: %x\n", scope.Contract.Input) + fmt.Fprintf(s.out, "calldata: %x\n", scope.CallInput()) fmt.Println("----") - fmt.Fprintf(s.out, "memory: %x\n", scope.Memory.Data()) + fmt.Fprintf(s.out, "memory: %x\n", scope.MemoryData()) fmt.Println("----") fmt.Fprintf(s.out, "stack:\n") - stack := scope.Stack.Data() + stack := scope.StackData() for i := range stack { fmt.Fprintf(s.out, "%3d: %x\n", -i, stack[len(stack)-1-i].Bytes32()) } } -var _ vm.EVMLogger = (*SourceMapTracer)(nil) +func (s *SourceMapTracer) Hooks() *tracing.Hooks { + return &tracing.Hooks{ + OnOpcode: s.OnOpCode, + OnFault: s.OnFault, + } +} diff --git a/op-chain-ops/srcmap/solutil_test.go b/op-chain-ops/srcmap/solutil_test.go deleted file mode 100644 index e607d7e4ddc9..000000000000 --- a/op-chain-ops/srcmap/solutil_test.go +++ /dev/null @@ -1,29 +0,0 @@ -package srcmap - -import ( - "testing" -) - -func TestSourcemap(t *testing.T) { - t.Skip("TODO(clabby): This test is disabled until source IDs have been added to foundry artifacts.") - - // contractsDir := "../../packages/contracts-bedrock" - // sources := []string{path.Join(contractsDir, "src/cannon/MIPS.sol")} - // for i, source := range sources { - // sources[i] = path.Join(contractsDir, source) - // } - // - // deployedByteCode := hexutil.MustDecode(bindings.MIPSDeployedBin) - // srcMap, err := ParseSourceMap( - // sources, - // deployedByteCode, - // bindings.MIPSDeployedSourceMap) - // require.NoError(t, err) - // - // for i := 0; i < len(deployedByteCode); i++ { - // info := srcMap.FormattedInfo(uint64(i)) - // if strings.HasPrefix(info, "unknown") { - // t.Fatalf("unexpected info: %q", info) - // } - // } -} diff --git a/op-chain-ops/upgrades/bindings/isemver.go b/op-chain-ops/upgrades/bindings/isemver.go deleted file mode 100644 index 66a940654d05..000000000000 --- a/op-chain-ops/upgrades/bindings/isemver.go +++ /dev/null @@ -1,211 +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 -) - -// 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-chain-ops/upgrades/bindings/l1crossdomainmessenger.go b/op-chain-ops/upgrades/bindings/l1crossdomainmessenger.go deleted file mode 100644 index 7f0d35fc5ce5..000000000000 --- a/op-chain-ops/upgrades/bindings/l1crossdomainmessenger.go +++ /dev/null @@ -1,1609 +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 -) - -// 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 deleted file mode 100644 index 4e847b8de95d..000000000000 --- a/op-chain-ops/upgrades/bindings/l1erc721bridge.go +++ /dev/null @@ -1,976 +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 -) - -// 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 deleted file mode 100644 index bbdbcd0bb9c5..000000000000 --- a/op-chain-ops/upgrades/bindings/l1standardbridge.go +++ /dev/null @@ -1,2198 +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 -) - -// 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 deleted file mode 100644 index b6a5b649b4d9..000000000000 --- a/op-chain-ops/upgrades/bindings/l2outputoracle.go +++ /dev/null @@ -1,1351 +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 -) - -// 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 deleted file mode 100644 index 35db648e678e..000000000000 --- a/op-chain-ops/upgrades/bindings/optimismmintableerc20factory.go +++ /dev/null @@ -1,798 +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 -) - -// 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 deleted file mode 100644 index 55907ecff109..000000000000 --- a/op-chain-ops/upgrades/bindings/optimismportal.go +++ /dev/null @@ -1,1411 +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 -) - -// 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 deleted file mode 100644 index 942c71c3000c..000000000000 --- a/op-chain-ops/upgrades/bindings/proxyadmin.go +++ /dev/null @@ -1,760 +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 -) - -// 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 deleted file mode 100644 index c1d45928b476..000000000000 --- a/op-chain-ops/upgrades/bindings/storagesetter.go +++ /dev/null @@ -1,446 +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 -) - -// 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-chain-ops/upgrades/bindings/systemconfig.go b/op-chain-ops/upgrades/bindings/systemconfig.go deleted file mode 100644 index c8de0bad583e..000000000000 --- a/op-chain-ops/upgrades/bindings/systemconfig.go +++ /dev/null @@ -1,1785 +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 -) - -// 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\":\"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 - -// 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) -} - -// 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) -} - -// 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) -} - -// 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 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,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 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,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 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,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) -} - -// 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) -} - -// 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) -} - -// SetResourceConfig is a paid mutator transaction binding the contract method 0xc71973f6. -// -// Solidity: function setResourceConfig((uint32,uint8,uint8,uint32,uint32,uint128) _config) returns() -func (_SystemConfig *SystemConfigTransactor) SetResourceConfig(opts *bind.TransactOpts, _config ResourceMeteringResourceConfig) (*types.Transaction, error) { - return _SystemConfig.contract.Transact(opts, "setResourceConfig", _config) -} - -// SetResourceConfig is a paid mutator transaction binding the contract method 0xc71973f6. -// -// Solidity: function setResourceConfig((uint32,uint8,uint8,uint32,uint32,uint128) _config) returns() -func (_SystemConfig *SystemConfigSession) SetResourceConfig(_config ResourceMeteringResourceConfig) (*types.Transaction, error) { - return _SystemConfig.Contract.SetResourceConfig(&_SystemConfig.TransactOpts, _config) -} - -// SetResourceConfig is a paid mutator transaction binding the contract method 0xc71973f6. -// -// Solidity: function setResourceConfig((uint32,uint8,uint8,uint32,uint32,uint128) _config) returns() -func (_SystemConfig *SystemConfigTransactorSession) SetResourceConfig(_config ResourceMeteringResourceConfig) (*types.Transaction, error) { - return _SystemConfig.Contract.SetResourceConfig(&_SystemConfig.TransactOpts, _config) -} - -// 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-chain-ops/upgrades/check.go b/op-chain-ops/upgrades/check.go deleted file mode 100644 index c773df18d5d6..000000000000 --- a/op-chain-ops/upgrades/check.go +++ /dev/null @@ -1,138 +0,0 @@ -package upgrades - -import ( - "context" - "fmt" - "strings" - - "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 { - if err := CheckVersionedContract(ctx, list.L1CrossDomainMessenger, backend); err != nil { - return fmt.Errorf("L1CrossDomainMessenger: %w", err) - } - if err := CheckVersionedContract(ctx, list.L1ERC721Bridge, backend); err != nil { - return fmt.Errorf("L1ERC721Bridge: %w", err) - } - if err := CheckVersionedContract(ctx, list.L1StandardBridge, backend); err != nil { - return fmt.Errorf("L1StandardBridge: %w", err) - } - if err := CheckVersionedContract(ctx, list.L2OutputOracle, backend); err != nil { - return fmt.Errorf("L2OutputOracle: %w", err) - } - if err := CheckVersionedContract(ctx, list.OptimismMintableERC20Factory, backend); err != nil { - return fmt.Errorf("OptimismMintableERC20Factory: %w", err) - } - if err := CheckVersionedContract(ctx, list.OptimismPortal, backend); err != nil { - return fmt.Errorf("OptimismPortal: %w", err) - } - if err := CheckVersionedContract(ctx, list.SystemConfig, backend); err != nil { - return fmt.Errorf("SystemConfig: %w", err) - } - return nil -} - -// CheckVersionedContract will check that the version of the deployed contract matches -// the artifact in the superchain registry. -func CheckVersionedContract(ctx context.Context, contract superchain.VersionedContract, backend bind.ContractBackend) error { - addr := common.Address(contract.Address) - code, err := backend.CodeAt(ctx, addr, nil) - if err != nil { - return err - } - if len(code) == 0 { - return fmt.Errorf("no code at %s", addr) - } - version, err := getVersion(ctx, addr, backend) - if err != nil { - return err - } - if !cmpVersion(version, contract.Version) { - return fmt.Errorf("version mismatch: expected %s, got %s", contract.Version, version) - } - return nil -} - -// getContractVersions will fetch the versions of all of the contracts. -func GetContractVersions(ctx context.Context, addresses *superchain.AddressList, chainConfig *superchain.ChainConfig, backend bind.ContractBackend) (superchain.ContractVersions, error) { - var versions superchain.ContractVersions - var err error - - versions.L1CrossDomainMessenger, err = getVersion(ctx, common.Address(addresses.L1CrossDomainMessengerProxy), backend) - if err != nil { - return versions, fmt.Errorf("L1CrossDomainMessenger: %w", err) - } - versions.L1ERC721Bridge, err = getVersion(ctx, common.Address(addresses.L1ERC721BridgeProxy), backend) - if err != nil { - return versions, fmt.Errorf("L1ERC721Bridge: %w", err) - } - versions.L1StandardBridge, err = getVersion(ctx, common.Address(addresses.L1StandardBridgeProxy), backend) - if err != nil { - return versions, fmt.Errorf("L1StandardBridge: %w", err) - } - versions.L2OutputOracle, err = getVersion(ctx, common.Address(addresses.L2OutputOracleProxy), backend) - if err != nil { - return versions, fmt.Errorf("L2OutputOracle: %w", err) - } - versions.OptimismMintableERC20Factory, err = getVersion(ctx, common.Address(addresses.OptimismMintableERC20FactoryProxy), backend) - if err != nil { - return versions, fmt.Errorf("OptimismMintableERC20Factory: %w", err) - } - versions.OptimismPortal, err = getVersion(ctx, common.Address(addresses.OptimismPortalProxy), backend) - if err != nil { - return versions, fmt.Errorf("OptimismPortal: %w", err) - } - versions.SystemConfig, err = getVersion(ctx, common.Address(addresses.SystemConfigProxy), backend) - if err != nil { - return versions, fmt.Errorf("SystemConfig: %w", err) - } - return versions, err -} - -// getVersion will get the version of a contract at a given address. -func getVersion(ctx context.Context, addr common.Address, backend bind.ContractBackend) (string, error) { - isemver, err := bindings.NewISemver(addr, backend) - if err != nil { - return "", fmt.Errorf("%s: %w", addr, err) - } - version, err := isemver.Version(&bind.CallOpts{ - Context: ctx, - }) - if err != nil { - return "", fmt.Errorf("%s: %w", addr, err) - } - return version, nil -} - -// cmpVersion will compare 2 semver strings, accounting for -// lack of "v" prefix. -func cmpVersion(v1, v2 string) bool { - if !strings.HasPrefix(v1, "v") { - v1 = "v" + v1 - } - if !strings.HasPrefix(v2, "v") { - v2 = "v" + v2 - } - return v1 == v2 -} diff --git a/op-chain-ops/upgrades/doc.go b/op-chain-ops/upgrades/doc.go deleted file mode 100644 index 571c450e2e10..000000000000 --- a/op-chain-ops/upgrades/doc.go +++ /dev/null @@ -1,7 +0,0 @@ -// 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 deleted file mode 100644 index 2f5e638113be..000000000000 --- a/op-chain-ops/upgrades/l1.go +++ /dev/null @@ -1,781 +0,0 @@ -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-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" -) - -const ( - // upgradeAndCall represents the signature of the upgradeAndCall function - // on the ProxyAdmin contract. - upgradeAndCall = "upgradeAndCall(address,address,bytes)" - - method = "setBytes32" -) - -var ( - // storageSetterAddr represents the address of the StorageSetter contract. - storageSetterAddr = common.HexToAddress("0xd81f43eDBCAcb4c29a9bA38a13Ee5d79278270cC") -) - -// 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, 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, superchainConfig, backend); err != nil { - return fmt.Errorf("upgrading L1ERC721Bridge: %w", err) - } - 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, superchainConfig, backend); err != nil { - return fmt.Errorf("upgrading L2OutputOracle: %w", err) - } - 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, superchainConfig, backend); err != nil { - return fmt.Errorf("upgrading OptimismPortal: %w", err) - } - 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, superchainConfig *superchain.Superchain, backend bind.ContractBackend) error { - proxyAdminABI, err := bindings.ProxyAdminMetaData.GetAbi() - if err != nil { - return err - } - - // 2 Step Upgrade - { - storageSetterABI, err := bindings.StorageSetterMetaData.GetAbi() - if err != nil { - return err - } - - input := []bindings.StorageSetterSlot{ - // https://github.com/ethereum-optimism/optimism/blob/86a96023ffd04d119296dff095d02fff79fa15de/packages/contracts-bedrock/.storage-layout#L11-L13 - { - Key: common.Hash{}, - Value: common.Hash{}, - }, - } - - calldata, err := storageSetterABI.Pack(method, input) - if err != nil { - return err - } - args := []any{ - common.Address(list.L1CrossDomainMessengerProxy), - storageSetterAddr, - calldata, - } - proxyAdmin := common.Address(list.ProxyAdmin) - if err := batch.AddCall(proxyAdmin, common.Big0, upgradeAndCall, args, proxyAdminABI); err != nil { - return err - } - } - - l1CrossDomainMessengerABI, err := bindings.L1CrossDomainMessengerMetaData.GetAbi() - if err != nil { - return err - } - - l1CrossDomainMessenger, err := bindings.NewL1CrossDomainMessengerCaller(common.Address(list.L1CrossDomainMessengerProxy), backend) - if err != nil { - return err - } - optimismPortal, err := l1CrossDomainMessenger.PORTAL(&bind.CallOpts{}) - if err != nil { - return err - } - otherMessenger, err := l1CrossDomainMessenger.OTHERMESSENGER(&bind.CallOpts{}) - if err != nil { - return err - } - - if optimismPortal != common.Address(list.OptimismPortalProxy) { - return fmt.Errorf("Portal address doesn't match config") - } - - if otherMessenger != predeploys.L2CrossDomainMessengerAddr { - return fmt.Errorf("OtherMessenger address doesn't match config") - } - - calldata, err := l1CrossDomainMessengerABI.Pack("initialize", common.Address(*superchainConfig.Config.SuperchainConfigAddr), optimismPortal) - if err != nil { - return err - } - - args := []any{ - common.Address(list.L1CrossDomainMessengerProxy), - common.Address(implementations.L1CrossDomainMessenger.Address), - calldata, - } - - proxyAdmin := common.Address(list.ProxyAdmin) - if err := batch.AddCall(proxyAdmin, common.Big0, upgradeAndCall, args, proxyAdminABI); err != nil { - return err - } - - return nil -} - -// 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, superchainConfig *superchain.Superchain, backend bind.ContractBackend) error { - proxyAdminABI, err := bindings.ProxyAdminMetaData.GetAbi() - if err != nil { - return err - } - - // 2 Step Upgrade - { - storageSetterABI, err := bindings.StorageSetterMetaData.GetAbi() - if err != nil { - return err - } - - input := []bindings.StorageSetterSlot{ - // https://github.com/ethereum-optimism/optimism/blob/86a96023ffd04d119296dff095d02fff79fa15de/packages/contracts-bedrock/.storage-layout#L100-L102 - { - Key: common.Hash{}, - Value: common.Hash{}, - }, - } - - calldata, err := storageSetterABI.Pack(method, input) - if err != nil { - return fmt.Errorf("setBytes32: %w", err) - } - args := []any{ - common.Address(list.L1ERC721BridgeProxy), - storageSetterAddr, - calldata, - } - proxyAdmin := common.Address(list.ProxyAdmin) - if err := batch.AddCall(proxyAdmin, common.Big0, upgradeAndCall, args, proxyAdminABI); err != nil { - return err - } - } - - l1ERC721BridgeABI, err := bindings.L1ERC721BridgeMetaData.GetAbi() - if err != nil { - return err - } - - l1ERC721Bridge, err := bindings.NewL1ERC721BridgeCaller(common.Address(list.L1ERC721BridgeProxy), backend) - if err != nil { - return err - } - messenger, err := l1ERC721Bridge.Messenger(&bind.CallOpts{}) - if err != nil { - return err - } - otherBridge, err := l1ERC721Bridge.OtherBridge(&bind.CallOpts{}) - if err != nil { - return err - } - - if messenger != common.Address(list.L1CrossDomainMessengerProxy) { - return fmt.Errorf("Messenger address doesn't match config") - } - - if otherBridge != predeploys.L2ERC721BridgeAddr { - return fmt.Errorf("OtherBridge address doesn't match config") - } - - calldata, err := l1ERC721BridgeABI.Pack("initialize", messenger, common.Address(*(superchainConfig.Config.SuperchainConfigAddr))) - if err != nil { - return err - } - - args := []any{ - common.Address(list.L1ERC721BridgeProxy), - common.Address(implementations.L1ERC721Bridge.Address), - calldata, - } - - proxyAdmin := common.Address(list.ProxyAdmin) - if err := batch.AddCall(proxyAdmin, common.Big0, upgradeAndCall, args, proxyAdminABI); err != nil { - return err - } - - return nil -} - -// 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, superchainConfig *superchain.Superchain, backend bind.ContractBackend) error { - proxyAdminABI, err := bindings.ProxyAdminMetaData.GetAbi() - if err != nil { - return err - } - - // 2 Step Upgrade - { - storageSetterABI, err := bindings.StorageSetterMetaData.GetAbi() - if err != nil { - return err - } - - input := []bindings.StorageSetterSlot{ - // https://github.com/ethereum-optimism/optimism/blob/86a96023ffd04d119296dff095d02fff79fa15de/packages/contracts-bedrock/.storage-layout#L36-L37 - { - Key: common.Hash{}, - Value: common.Hash{}, - }, - } - - calldata, err := storageSetterABI.Pack(method, input) - if err != nil { - return err - } - args := []any{ - common.Address(list.L1StandardBridgeProxy), - storageSetterAddr, - calldata, - } - proxyAdmin := common.Address(list.ProxyAdmin) - if err := batch.AddCall(proxyAdmin, common.Big0, upgradeAndCall, args, proxyAdminABI); err != nil { - return err - } - } - - l1StandardBridgeABI, err := bindings.L1StandardBridgeMetaData.GetAbi() - if err != nil { - return err - } - - l1StandardBridge, err := bindings.NewL1StandardBridgeCaller(common.Address(list.L1StandardBridgeProxy), backend) - if err != nil { - return err - } - - messenger, err := l1StandardBridge.MESSENGER(&bind.CallOpts{}) - if err != nil { - return err - } - - otherBridge, err := l1StandardBridge.OTHERBRIDGE(&bind.CallOpts{}) - if err != nil { - return err - } - - if messenger != common.Address(list.L1CrossDomainMessengerProxy) { - return fmt.Errorf("Messenger address doesn't match config") - } - - if otherBridge != predeploys.L2StandardBridgeAddr { - return fmt.Errorf("OtherBridge address doesn't match config") - } - - calldata, err := l1StandardBridgeABI.Pack("initialize", messenger, common.Address(*(superchainConfig.Config.SuperchainConfigAddr))) - if err != nil { - return err - } - - args := []any{ - common.Address(list.L1StandardBridgeProxy), - common.Address(implementations.L1StandardBridge.Address), - calldata, - } - - proxyAdmin := common.Address(list.ProxyAdmin) - if err := batch.AddCall(proxyAdmin, common.Big0, upgradeAndCall, args, proxyAdminABI); err != nil { - return err - } - - return nil -} - -// 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, superchainConfig *superchain.Superchain, backend bind.ContractBackend) error { - proxyAdminABI, err := bindings.ProxyAdminMetaData.GetAbi() - if err != nil { - return err - } - - // 2 Step Upgrade - { - storageSetterABI, err := bindings.StorageSetterMetaData.GetAbi() - if err != nil { - return err - } - - input := []bindings.StorageSetterSlot{ - // https://github.com/ethereum-optimism/optimism/blob/86a96023ffd04d119296dff095d02fff79fa15de/packages/contracts-bedrock/.storage-layout#L50-L51 - { - Key: common.Hash{}, - Value: common.Hash{}, - }, - } - - calldata, err := storageSetterABI.Pack(method, input) - if err != nil { - return err - } - args := []any{ - common.Address(list.L2OutputOracleProxy), - storageSetterAddr, - calldata, - } - proxyAdmin := common.Address(list.ProxyAdmin) - if err := batch.AddCall(proxyAdmin, common.Big0, upgradeAndCall, args, proxyAdminABI); err != nil { - return err - } - } - - l2OutputOracleABI, err := bindings.L2OutputOracleMetaData.GetAbi() - if err != nil { - return err - } - - l2OutputOracle, err := bindings.NewL2OutputOracleCaller(common.Address(list.L2OutputOracleProxy), backend) - if err != nil { - return err - } - - l2OutputOracleSubmissionInterval, err := l2OutputOracle.SUBMISSIONINTERVAL(&bind.CallOpts{}) - if err != nil { - return err - } - - l2BlockTime, err := l2OutputOracle.L2BLOCKTIME(&bind.CallOpts{}) - if err != nil { - return err - } - - l2OutputOracleStartingBlockNumber, err := l2OutputOracle.StartingBlockNumber(&bind.CallOpts{}) - if err != nil { - return err - } - - l2OutputOracleStartingTimestamp, err := l2OutputOracle.StartingTimestamp(&bind.CallOpts{}) - if err != nil { - return err - } - - l2OutputOracleProposer, err := l2OutputOracle.PROPOSER(&bind.CallOpts{}) - if err != nil { - return err - } - - l2OutputOracleChallenger, err := l2OutputOracle.CHALLENGER(&bind.CallOpts{}) - if err != nil { - return err - } - - finalizationPeriodSeconds, err := l2OutputOracle.FINALIZATIONPERIODSECONDS(&bind.CallOpts{}) - if err != nil { - return err - } - - if config != nil { - if l2OutputOracleSubmissionInterval.Uint64() != config.L2OutputOracleSubmissionInterval { - return fmt.Errorf("L2OutputOracleSubmissionInterval address doesn't match config") - } - - if l2BlockTime.Uint64() != config.L2BlockTime { - return fmt.Errorf("L2BlockTime address doesn't match config") - } - - if l2OutputOracleStartingBlockNumber.Uint64() != config.L2OutputOracleStartingBlockNumber { - return fmt.Errorf("L2OutputOracleStartingBlockNumber address doesn't match config") - } - - if config.L2OutputOracleStartingTimestamp < 0 { - return fmt.Errorf("L2OutputOracleStartingTimestamp must be concrete") - } - - if int(l2OutputOracleStartingTimestamp.Int64()) != config.L2OutputOracleStartingTimestamp { - return fmt.Errorf("L2OutputOracleStartingTimestamp address doesn't match config") - } - - if l2OutputOracleProposer != config.L2OutputOracleProposer { - return fmt.Errorf("L2OutputOracleProposer address doesn't match config") - } - - if l2OutputOracleChallenger != config.L2OutputOracleChallenger { - return fmt.Errorf("L2OutputOracleChallenger address doesn't match config") - } - - if finalizationPeriodSeconds.Uint64() != config.FinalizationPeriodSeconds { - return fmt.Errorf("FinalizationPeriodSeconds address doesn't match config") - } - } - - calldata, err := l2OutputOracleABI.Pack( - "initialize", - l2OutputOracleSubmissionInterval, - l2BlockTime, - l2OutputOracleStartingBlockNumber, - l2OutputOracleStartingTimestamp, - l2OutputOracleProposer, - l2OutputOracleChallenger, - finalizationPeriodSeconds, - ) - if err != nil { - return err - } - - args := []any{ - common.Address(list.L2OutputOracleProxy), - common.Address(implementations.L2OutputOracle.Address), - calldata, - } - - proxyAdmin := common.Address(list.ProxyAdmin) - if err := batch.AddCall(proxyAdmin, common.Big0, upgradeAndCall, args, proxyAdminABI); err != nil { - return err - } - - return nil -} - -// 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, superchainConfig *superchain.Superchain, backend bind.ContractBackend) error { - proxyAdminABI, err := bindings.ProxyAdminMetaData.GetAbi() - if err != nil { - return err - } - - // 2 Step Upgrade - { - storageSetterABI, err := bindings.StorageSetterMetaData.GetAbi() - if err != nil { - return err - } - - input := []bindings.StorageSetterSlot{ - // https://github.com/ethereum-optimism/optimism/blob/86a96023ffd04d119296dff095d02fff79fa15de/packages/contracts-bedrock/.storage-layout#L287-L289 - { - Key: common.Hash{}, - Value: common.Hash{}, - }, - } - - calldata, err := storageSetterABI.Pack(method, input) - if err != nil { - return err - } - args := []any{ - common.Address(list.OptimismMintableERC20FactoryProxy), - storageSetterAddr, - calldata, - } - proxyAdmin := common.Address(list.ProxyAdmin) - if err := batch.AddCall(proxyAdmin, common.Big0, upgradeAndCall, args, proxyAdminABI); err != nil { - return err - } - } - - optimismMintableERC20FactoryABI, err := bindings.OptimismMintableERC20FactoryMetaData.GetAbi() - if err != nil { - return err - } - - optimismMintableERC20Factory, err := bindings.NewOptimismMintableERC20FactoryCaller(common.Address(list.OptimismMintableERC20FactoryProxy), backend) - if err != nil { - return err - } - - bridge, err := optimismMintableERC20Factory.BRIDGE(&bind.CallOpts{}) - if err != nil { - return err - } - - if bridge != common.Address(list.L1StandardBridgeProxy) { - return fmt.Errorf("Bridge address doesn't match config") - } - - calldata, err := optimismMintableERC20FactoryABI.Pack("initialize", bridge) - if err != nil { - return err - } - - args := []any{ - common.Address(list.OptimismMintableERC20FactoryProxy), - common.Address(implementations.OptimismMintableERC20Factory.Address), - calldata, - } - - proxyAdmin := common.Address(list.ProxyAdmin) - if err := batch.AddCall(proxyAdmin, common.Big0, upgradeAndCall, args, proxyAdminABI); err != nil { - return err - } - - return nil -} - -// 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, superchainConfig *superchain.Superchain, backend bind.ContractBackend) error { - proxyAdminABI, err := bindings.ProxyAdminMetaData.GetAbi() - if err != nil { - return err - } - - // 2 Step Upgrade - { - storageSetterABI, err := bindings.StorageSetterMetaData.GetAbi() - if err != nil { - return err - } - - input := []bindings.StorageSetterSlot{ - // https://github.com/ethereum-optimism/optimism/blob/86a96023ffd04d119296dff095d02fff79fa15de/packages/contracts-bedrock/.storage-layout#L64-L65 - { - Key: common.Hash{}, - Value: common.Hash{}, - }, - } - - calldata, err := storageSetterABI.Pack(method, input) - if err != nil { - return err - } - args := []any{ - common.Address(list.OptimismPortalProxy), - storageSetterAddr, - calldata, - } - proxyAdmin := common.Address(list.ProxyAdmin) - if err := batch.AddCall(proxyAdmin, common.Big0, upgradeAndCall, args, proxyAdminABI); err != nil { - return err - } - } - - optimismPortalABI, err := bindings.OptimismPortalMetaData.GetAbi() - if err != nil { - return err - } - - optimismPortal, err := bindings.NewOptimismPortalCaller(common.Address(list.OptimismPortalProxy), backend) - if err != nil { - return err - } - l2OutputOracle, err := optimismPortal.L2Oracle(&bind.CallOpts{}) - if err != nil { - return err - } - systemConfig, err := optimismPortal.SystemConfig(&bind.CallOpts{}) - if err != nil { - return err - } - - if l2OutputOracle != common.Address(list.L2OutputOracleProxy) { - return fmt.Errorf("L2OutputOracle address doesn't match config") - } - - if systemConfig != common.Address(list.SystemConfigProxy) { - return fmt.Errorf("SystemConfig address doesn't match config") - } - - calldata, err := optimismPortalABI.Pack("initialize", l2OutputOracle, systemConfig, common.Address(*superchainConfig.Config.SuperchainConfigAddr)) - if err != nil { - return err - } - - args := []any{ - common.Address(list.OptimismPortalProxy), - common.Address(implementations.OptimismPortal.Address), - calldata, - } - - proxyAdmin := common.Address(list.ProxyAdmin) - if err := batch.AddCall(proxyAdmin, common.Big0, upgradeAndCall, args, proxyAdminABI); err != nil { - return err - } - - return nil -} - -// 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, superchainConfig *superchain.Superchain, backend bind.ContractBackend) error { - proxyAdminABI, err := bindings.ProxyAdminMetaData.GetAbi() - if err != nil { - return err - } - - // 2 Step Upgrade - { - storageSetterABI, err := bindings.StorageSetterMetaData.GetAbi() - if err != nil { - return err - } - - 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{ - // https://github.com/ethereum-optimism/optimism/blob/86a96023ffd04d119296dff095d02fff79fa15de/packages/contracts-bedrock/.storage-layout#L82-L83 - { - Key: common.Hash{}, - Value: common.Hash{}, - }, - // bytes32 public constant START_BLOCK_SLOT = bytes32(uint256(keccak256("systemconfig.startBlock")) - 1); - { - Key: common.HexToHash("0xa11ee3ab75b40e88a0105e935d17cd36c8faee0138320d776c411291bdbbb19f"), - Value: startBlock, - }, - } - - calldata, err := storageSetterABI.Pack(method, input) - if err != nil { - return err - } - args := []any{ - common.Address(list.SystemConfigProxy), - storageSetterAddr, - calldata, - } - proxyAdmin := common.Address(list.ProxyAdmin) - if err := batch.AddCall(proxyAdmin, common.Big0, upgradeAndCall, args, proxyAdminABI); err != nil { - return err - } - } - - systemConfigABI, err := bindings.SystemConfigMetaData.GetAbi() - if err != nil { - return err - } - - systemConfig, err := bindings.NewSystemConfigCaller(common.Address(list.SystemConfigProxy), backend) - if err != nil { - return err - } - - gasPriceOracleOverhead, err := systemConfig.Overhead(&bind.CallOpts{}) - if err != nil { - return err - } - - gasPriceOracleScalar, err := systemConfig.Scalar(&bind.CallOpts{}) - if err != nil { - return err - } - - batcherHash, err := systemConfig.BatcherHash(&bind.CallOpts{}) - if err != nil { - return err - } - - l2GenesisBlockGasLimit, err := systemConfig.GasLimit(&bind.CallOpts{}) - if err != nil { - return err - } - - p2pSequencerAddress, err := systemConfig.UnsafeBlockSigner(&bind.CallOpts{}) - if err != nil { - return err - } - - finalSystemOwner, err := systemConfig.Owner(&bind.CallOpts{}) - if err != nil { - return err - } - - 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{}) - if err != nil { - return err - } - - if resourceConfig.MaxResourceLimit != DefaultResourceConfig.MaxResourceLimit { - return fmt.Errorf("DefaultResourceConfig MaxResourceLimit doesn't match contract MaxResourceLimit") - } - if resourceConfig.ElasticityMultiplier != DefaultResourceConfig.ElasticityMultiplier { - return fmt.Errorf("DefaultResourceConfig ElasticityMultiplier doesn't match contract ElasticityMultiplier") - } - if resourceConfig.BaseFeeMaxChangeDenominator != DefaultResourceConfig.BaseFeeMaxChangeDenominator { - return fmt.Errorf("DefaultResourceConfig BaseFeeMaxChangeDenominator doesn't match contract BaseFeeMaxChangeDenominator") - } - if resourceConfig.MinimumBaseFee != DefaultResourceConfig.MinimumBaseFee { - return fmt.Errorf("DefaultResourceConfig MinimumBaseFee doesn't match contract MinimumBaseFee") - } - if resourceConfig.SystemTxMaxGas != DefaultResourceConfig.SystemTxMaxGas { - return fmt.Errorf("DefaultResourceConfig SystemTxMaxGas doesn't match contract SystemTxMaxGas") - } - 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, - gasPriceOracleOverhead, - gasPriceOracleScalar, - batcherHash, - l2GenesisBlockGasLimit, - p2pSequencerAddress, - DefaultResourceConfig, - chainConfig.BatchInboxAddr, - bindings.SystemConfigAddresses{ - L1CrossDomainMessenger: common.Address(list.L1CrossDomainMessengerProxy), - L1ERC721Bridge: common.Address(list.L1ERC721BridgeProxy), - L1StandardBridge: common.Address(list.L1StandardBridgeProxy), - DisputeGameFactory: common.Address{}, - OptimismPortal: common.Address(list.OptimismPortalProxy), - OptimismMintableERC20Factory: common.Address(list.OptimismMintableERC20FactoryProxy), - GasPayingToken: common.Address{}, - }, - ) - if err != nil { - return err - } - - args := []any{ - common.Address(list.SystemConfigProxy), - common.Address(implementations.SystemConfig.Address), - calldata, - } - - proxyAdmin := common.Address(list.ProxyAdmin) - if err := batch.AddCall(proxyAdmin, common.Big0, upgradeAndCall, args, proxyAdminABI); err != nil { - return err - } - - return nil -} diff --git a/op-challenger/Makefile b/op-challenger/Makefile index 2c663ac00f6c..1a7422a4c879 100644 --- a/op-challenger/Makefile +++ b/op-challenger/Makefile @@ -4,7 +4,8 @@ VERSION ?= v0.0.0 LDFLAGSSTRING +=-X main.GitCommit=$(GITCOMMIT) LDFLAGSSTRING +=-X main.GitDate=$(GITDATE) -LDFLAGSSTRING +=-X main.Version=$(VERSION) +LDFLAGSSTRING +=-X github.com/ethereum-optimism/optimism/op-challenger/version.Version=$(VERSION) +LDFLAGSSTRING +=-X github.com/ethereum-optimism/optimism/op-challenger/version.Meta=$(VERSION_META) LDFLAGS := -ldflags "$(LDFLAGSSTRING)" # Use the old Apple linker to workaround broken xcode - https://github.com/golang/go/issues/65169 @@ -13,7 +14,7 @@ ifeq ($(shell uname),Darwin) endif op-challenger: - env GO111MODULE=on GOOS=$(TARGETOS) GOARCH=$(TARGETARCH) go build -v $(LDFLAGS) -o ./bin/op-challenger ./cmd + env GO111MODULE=on GOOS=$(TARGETOS) GOARCH=$(TARGETARCH) CGO_ENABLED=0 go build -v $(LDFLAGS) -o ./bin/op-challenger ./cmd fuzz: go test $(FUZZLDFLAGS) -run NOTAREALTEST -v -fuzztime 10s -fuzz FuzzKeccak ./game/keccak/matrix diff --git a/op-challenger/README.md b/op-challenger/README.md index a8452ad768ec..1c652008ea11 100644 --- a/op-challenger/README.md +++ b/op-challenger/README.md @@ -67,7 +67,7 @@ used in production and are intended to provide convenient manual testing. ```shell ./bin/op-challenger create-game \ --l1-eth-rpc \ - --game-address \ + --game-factory-address \ --output-root \ --l2-block-num \ @@ -154,7 +154,7 @@ If the game is resolved successfully, the result is printed. ```shell ./bin/op-challenger list-games \ --l1-eth-rpc \ - --game-factory-address + --network ``` Prints the games created by the game factory along with their current status. @@ -165,7 +165,7 @@ Prints the games created by the game factory along with their current status. ### list-claims ```shell -./bin/op-challenger list-games \ +./bin/op-challenger list-claims \ --l1-eth-rpc \ --game-address ``` diff --git a/op-challenger/cmd/create_game.go b/op-challenger/cmd/create_game.go index 0ef1a83d8404..fdf3e9a4176e 100644 --- a/op-challenger/cmd/create_game.go +++ b/op-challenger/cmd/create_game.go @@ -4,10 +4,10 @@ import ( "context" "fmt" - "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/game/fault/types" "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" @@ -22,7 +22,7 @@ var ( Name: "trace-type", Usage: "Trace types to support.", EnvVars: opservice.PrefixEnvVar(flags.EnvVarPrefix, "TRACE_TYPE"), - Value: config.TraceTypeCannon.String(), + Value: types.TraceTypeCannon.String(), } OutputRootFlag = &cli.StringFlag{ Name: "output-root", @@ -41,7 +41,7 @@ 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, + contract, txMgr, err := NewContractWithTxMgr[*contracts.DisputeGameFactoryContract](ctx, flags.FactoryAddress, func(ctx context.Context, metricer contractMetrics.ContractMetricer, address common.Address, caller *batching.MultiCaller) (*contracts.DisputeGameFactoryContract, error) { return contracts.NewDisputeGameFactoryContract(metricer, address, caller), nil }) @@ -61,6 +61,7 @@ func CreateGame(ctx *cli.Context) error { func createGameFlags() []cli.Flag { cliFlags := []cli.Flag{ flags.L1EthRpcFlag, + flags.NetworkFlag, flags.FactoryAddressFlag, TraceTypeFlag, OutputRootFlag, @@ -75,6 +76,6 @@ var CreateGameCommand = &cli.Command{ Name: "create-game", Usage: "Creates a dispute game via the factory", Description: "Creates a dispute game via the factory", - Action: CreateGame, + Action: Interruptible(CreateGame), Flags: createGameFlags(), } diff --git a/op-challenger/cmd/credits.go b/op-challenger/cmd/credits.go new file mode 100644 index 000000000000..6c9aa3e5b914 --- /dev/null +++ b/op-challenger/cmd/credits.go @@ -0,0 +1,117 @@ +package main + +import ( + "context" + "fmt" + "math/big" + "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" + 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" + "golang.org/x/exp/maps" +) + +func ListCredits(ctx *cli.Context) error { + logger, err := setupLogging(ctx) + if err != nil { + return err + } + rpcUrl := ctx.String(flags.L1EthRpcFlag.Name) + if rpcUrl == "" { + return fmt.Errorf("missing %v", flags.L1EthRpcFlag.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, err := contracts.NewFaultDisputeGameContract(ctx.Context, metrics.NoopContractMetrics, gameAddr, caller) + if err != nil { + return err + } + return listCredits(ctx.Context, contract) +} + +func listCredits(ctx context.Context, game contracts.FaultDisputeGameContract) error { + claims, err := game.GetAllClaims(ctx, rpcblock.Latest) + if err != nil { + return fmt.Errorf("failed to load claims: %w", err) + } + metadata, err := game.GetGameMetadata(ctx, rpcblock.Latest) + if err != nil { + return fmt.Errorf("failed to load metadata: %w", err) + } + recipients := make(map[common.Address]bool) + for _, claim := range claims { + if claim.CounteredBy != (common.Address{}) { + recipients[claim.CounteredBy] = true + } + recipients[claim.Claimant] = true + } + if metadata.L2BlockNumberChallenger != (common.Address{}) { + recipients[metadata.L2BlockNumberChallenger] = true + } + + balance, withdrawalDelay, wethAddress, err := game.GetBalanceAndDelay(ctx, rpcblock.Latest) + if err != nil { + return fmt.Errorf("failed to get DelayedWETH info: %w", err) + } + claimants := maps.Keys(recipients) + withdrawals, err := game.GetWithdrawals(ctx, rpcblock.Latest, claimants...) + if err != nil { + return fmt.Errorf("failed to get withdrawals: %w", err) + } + lineFormat := "%-42v %12v %-19v\n" + info := fmt.Sprintf(lineFormat, "Claimant", "ETH", "Unlock Time") + for i, withdrawal := range withdrawals { + var amount string + if withdrawal.Amount.Cmp(big.NewInt(0)) == 0 { + amount = "-" + } else { + amount = fmt.Sprintf("%12.8f", eth.WeiToEther(withdrawal.Amount)) + } + var unlockTime string + if withdrawal.Timestamp.Cmp(big.NewInt(0)) == 0 { + unlockTime = "-" + } else { + unlockTime = time.Unix(withdrawal.Timestamp.Int64(), 0).Add(withdrawalDelay).Format(time.DateTime) + } + info += fmt.Sprintf(lineFormat, claimants[i], amount, unlockTime) + } + fmt.Printf("DelayedWETH Contract: %v • Total Balance (ETH): %12.8f • Delay: %v\n%v\n", + wethAddress, eth.WeiToEther(balance), withdrawalDelay, info) + return nil +} + +func listCreditsFlags() []cli.Flag { + cliFlags := []cli.Flag{ + flags.L1EthRpcFlag, + GameAddressFlag, + } + cliFlags = append(cliFlags, oplog.CLIFlags(flags.EnvVarPrefix)...) + return cliFlags +} + +var ListCreditsCommand = &cli.Command{ + Name: "list-credits", + Usage: "List the credits in a dispute game", + Description: "Lists the credits in a dispute game", + Action: Interruptible(ListCredits), + Flags: listCreditsFlags(), +} diff --git a/op-challenger/cmd/list_claims.go b/op-challenger/cmd/list_claims.go index 0aedddf93eb9..6d07454aa388 100644 --- a/op-challenger/cmd/list_claims.go +++ b/op-challenger/cmd/list_claims.go @@ -11,8 +11,10 @@ import ( "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" + gameTypes "github.com/ethereum-optimism/optimism/op-challenger/game/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" @@ -90,6 +92,14 @@ func listClaims(ctx context.Context, game contracts.FaultDisputeGameContract, ve return fmt.Errorf("failed to retrieve claims: %w", err) } + var resolutionTime time.Time + if status != gameTypes.GameStatusInProgress { + resolutionTime, err = game.GetResolvedAt(ctx, rpcblock.Latest) + if err != nil { + return fmt.Errorf("failed to retrieve resolved at: %w", err) + } + } + // 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 @@ -105,14 +115,14 @@ func listClaims(ctx context.Context, game contracts.FaultDisputeGameContract, ve valueFormat = "%-66v" } now := time.Now() - lineFormat := "%3v %-7v %6v %5v %14v " + valueFormat + " %-42v %-19v %10v %v\n" - info := fmt.Sprintf(lineFormat, "Idx", "Move", "Parent", "Depth", "Index", "Value", "Claimant", "Time", "Clock Used", "Resolution") + lineFormat := "%3v %-7v %6v %5v %14v " + valueFormat + " %-42v %12v %-19v %10v %v\n" + info := fmt.Sprintf(lineFormat, "Idx", "Move", "Parent", "Depth", "Trace", "Value", "Claimant", "Bond (ETH)", "Time", "Clock Used", "Resolution") for i, claim := range claims { pos := claim.Position 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 = "" + parent = "-" } else { parentClaim, err := gameState.GetParent(claim) if err != nil { @@ -154,15 +164,23 @@ func listClaims(ctx context.Context, game contracts.FaultDisputeGameContract, ve 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, timestamp, elapsed, countered) + i, move, parent, pos.Depth(), traceIdx, value, claim.Claimant, bond, timestamp, elapsed, countered) } - blockNumChallenger := "L2 Block: Unchallenged" + blockNumChallenger := "Unchallenged" if metadata.L2BlockNumberChallenged { - blockNumChallenger = "L2 Block: ❌ " + metadata.L2BlockNumberChallenger.Hex() + blockNumChallenger = "❌ " + metadata.L2BlockNumberChallenger.Hex() + } + statusStr := status.String() + if status != gameTypes.GameStatusInProgress { + statusStr = fmt.Sprintf("%v • Resolution Time: %v", statusStr, resolutionTime.Format(time.DateTime)) } - 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) + fmt.Printf("Status: %v • L2 Blocks: %v to %v (%v) • Split Depth: %v • Max Depth: %v • Claim Count: %v\n%v\n", + statusStr, l2StartBlockNum, l2BlockNum, blockNumChallenger, splitDepth, maxDepth, len(claims), info) return nil } @@ -180,6 +198,6 @@ var ListClaimsCommand = &cli.Command{ Name: "list-claims", Usage: "List the claims in a dispute game", Description: "Lists the claims in a dispute game", - Action: ListClaims, + Action: Interruptible(ListClaims), Flags: listClaimsFlags(), } diff --git a/op-challenger/cmd/list_games.go b/op-challenger/cmd/list_games.go index c718002fb771..0e0ce1880a8e 100644 --- a/op-challenger/cmd/list_games.go +++ b/op-challenger/cmd/list_games.go @@ -49,7 +49,7 @@ func ListGames(ctx *cli.Context) error { if rpcUrl == "" { return fmt.Errorf("missing %v", flags.L1EthRpcFlag.Name) } - factoryAddr, err := opservice.ParseAddress(ctx.String(flags.FactoryAddressFlag.Name)) + factoryAddr, err := flags.FactoryAddress(ctx) if err != nil { return err } @@ -171,6 +171,7 @@ func listGamesFlags() []cli.Flag { SortByFlag, SortOrderFlag, flags.L1EthRpcFlag, + flags.NetworkFlag, flags.FactoryAddressFlag, flags.GameWindowFlag, } @@ -182,6 +183,6 @@ var ListGamesCommand = &cli.Command{ Name: "list-games", Usage: "List the games created by a dispute game factory", Description: "Lists the games created by a dispute game factory", - Action: ListGames, + Action: Interruptible(ListGames), Flags: listGamesFlags(), } diff --git a/op-challenger/cmd/main.go b/op-challenger/cmd/main.go index 1d64ed42460b..dda1fa641757 100644 --- a/op-challenger/cmd/main.go +++ b/op-challenger/cmd/main.go @@ -15,8 +15,8 @@ import ( "github.com/ethereum-optimism/optimism/op-challenger/version" opservice "github.com/ethereum-optimism/optimism/op-service" "github.com/ethereum-optimism/optimism/op-service/cliapp" + "github.com/ethereum-optimism/optimism/op-service/ctxinterrupt" oplog "github.com/ethereum-optimism/optimism/op-service/log" - "github.com/ethereum-optimism/optimism/op-service/opio" ) var ( @@ -29,7 +29,7 @@ var VersionWithMeta = opservice.FormatVersion(version.Version, GitCommit, GitDat func main() { args := os.Args - ctx := opio.WithInterruptBlocker(context.Background()) + ctx := ctxinterrupt.WithSignalWaiterMain(context.Background()) 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 { @@ -51,10 +51,12 @@ func run(ctx context.Context, args []string, action ConfiguredLifecycle) error { app.Commands = []*cli.Command{ ListGamesCommand, ListClaimsCommand, + ListCreditsCommand, CreateGameCommand, MoveCommand, ResolveCommand, ResolveClaimCommand, + RunTraceCommand, } app.Action = cliapp.LifecycleCmd(func(ctx *cli.Context, close context.CancelCauseFunc) (cliapp.Lifecycle, error) { logger, err := setupLogging(ctx) diff --git a/op-challenger/cmd/main_test.go b/op-challenger/cmd/main_test.go index fdd2cfa1dc9c..529711bbf660 100644 --- a/op-challenger/cmd/main_test.go +++ b/op-challenger/cmd/main_test.go @@ -7,12 +7,14 @@ import ( "testing" "time" + "github.com/ethereum-optimism/superchain-registry/superchain" "github.com/stretchr/testify/require" "github.com/ethereum/go-ethereum/common" "github.com/ethereum/go-ethereum/log" "github.com/ethereum-optimism/optimism/op-challenger/config" + "github.com/ethereum-optimism/optimism/op-challenger/game/fault/types" "github.com/ethereum-optimism/optimism/op-service/cliapp" "github.com/ethereum-optimism/optimism/op-service/txmgr" ) @@ -37,13 +39,13 @@ var ( func TestLogLevel(t *testing.T) { t.Run("RejectInvalid", func(t *testing.T) { - verifyArgsInvalid(t, "unknown level: foo", addRequiredArgs(config.TraceTypeAlphabet, "--log.level=foo")) + verifyArgsInvalid(t, "unknown level: foo", addRequiredArgs(types.TraceTypeAlphabet, "--log.level=foo")) }) for _, lvl := range []string{"trace", "debug", "info", "error", "crit"} { lvl := lvl t.Run("AcceptValid_"+lvl, func(t *testing.T) { - logger, _, err := dryRunWithArgs(addRequiredArgs(config.TraceTypeAlphabet, "--log.level", lvl)) + logger, _, err := dryRunWithArgs(addRequiredArgs(types.TraceTypeAlphabet, "--log.level", lvl)) require.NoError(t, err) require.NotNil(t, logger) }) @@ -51,24 +53,24 @@ func TestLogLevel(t *testing.T) { } func TestDefaultCLIOptionsMatchDefaultConfig(t *testing.T) { - cfg := configForArgs(t, addRequiredArgs(config.TraceTypeAlphabet)) - defaultCfg := config.NewConfig(common.HexToAddress(gameFactoryAddressValue), l1EthRpc, l1Beacon, rollupRpc, l2EthRpc, datadir, config.TraceTypeAlphabet) + cfg := configForArgs(t, addRequiredArgs(types.TraceTypeAlphabet)) + defaultCfg := config.NewConfig(common.HexToAddress(gameFactoryAddressValue), l1EthRpc, l1Beacon, rollupRpc, l2EthRpc, datadir, types.TraceTypeAlphabet) require.Equal(t, defaultCfg, cfg) } func TestDefaultConfigIsValid(t *testing.T) { - cfg := config.NewConfig(common.HexToAddress(gameFactoryAddressValue), l1EthRpc, l1Beacon, rollupRpc, l2EthRpc, datadir, config.TraceTypeAlphabet) + cfg := config.NewConfig(common.HexToAddress(gameFactoryAddressValue), l1EthRpc, l1Beacon, rollupRpc, l2EthRpc, datadir, types.TraceTypeAlphabet) require.NoError(t, cfg.Check()) } func TestL1ETHRPCAddress(t *testing.T) { t.Run("Required", func(t *testing.T) { - verifyArgsInvalid(t, "flag l1-eth-rpc is required", addRequiredArgsExcept(config.TraceTypeAlphabet, "--l1-eth-rpc")) + verifyArgsInvalid(t, "flag l1-eth-rpc is required", addRequiredArgsExcept(types.TraceTypeAlphabet, "--l1-eth-rpc")) }) t.Run("Valid", func(t *testing.T) { url := "http://example.com:8888" - cfg := configForArgs(t, addRequiredArgsExcept(config.TraceTypeAlphabet, "--l1-eth-rpc", "--l1-eth-rpc="+url)) + cfg := configForArgs(t, addRequiredArgsExcept(types.TraceTypeAlphabet, "--l1-eth-rpc", "--l1-eth-rpc="+url)) require.Equal(t, url, cfg.L1EthRpc) require.Equal(t, url, cfg.TxMgrConfig.L1RPCURL) }) @@ -76,116 +78,134 @@ func TestL1ETHRPCAddress(t *testing.T) { func TestL1Beacon(t *testing.T) { t.Run("Required", func(t *testing.T) { - verifyArgsInvalid(t, "flag l1-beacon is required", addRequiredArgsExcept(config.TraceTypeAlphabet, "--l1-beacon")) + verifyArgsInvalid(t, "flag l1-beacon is required", addRequiredArgsExcept(types.TraceTypeAlphabet, "--l1-beacon")) }) t.Run("Valid", func(t *testing.T) { url := "http://example.com:8888" - cfg := configForArgs(t, addRequiredArgsExcept(config.TraceTypeAlphabet, "--l1-beacon", "--l1-beacon="+url)) + cfg := configForArgs(t, addRequiredArgsExcept(types.TraceTypeAlphabet, "--l1-beacon", "--l1-beacon="+url)) require.Equal(t, url, cfg.L1Beacon) }) } func TestTraceType(t *testing.T) { t.Run("Default", func(t *testing.T) { - expectedDefault := config.TraceTypeCannon + expectedDefault := types.TraceTypeCannon cfg := configForArgs(t, addRequiredArgsExcept(expectedDefault, "--trace-type")) - require.Equal(t, []config.TraceType{expectedDefault}, cfg.TraceTypes) + require.Equal(t, []types.TraceType{expectedDefault}, cfg.TraceTypes) }) - for _, traceType := range config.TraceTypes { + for _, traceType := range types.TraceTypes { traceType := traceType t.Run("Valid_"+traceType.String(), func(t *testing.T) { cfg := configForArgs(t, addRequiredArgs(traceType)) - require.Equal(t, []config.TraceType{traceType}, cfg.TraceTypes) + require.Equal(t, []types.TraceType{traceType}, cfg.TraceTypes) }) } t.Run("Invalid", func(t *testing.T) { - verifyArgsInvalid(t, "unknown trace type: \"foo\"", addRequiredArgsExcept(config.TraceTypeAlphabet, "--trace-type", "--trace-type=foo")) + verifyArgsInvalid(t, "unknown trace type: \"foo\"", addRequiredArgsExcept(types.TraceTypeAlphabet, "--trace-type", "--trace-type=foo")) }) } func TestMultipleTraceTypes(t *testing.T) { t.Run("WithAllOptions", func(t *testing.T) { - argsMap := requiredArgs(config.TraceTypeCannon) + argsMap := requiredArgs(types.TraceTypeCannon) // 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()) + "--trace-type", types.TraceTypeAlphabet.String()) args = append(args, - "--trace-type", config.TraceTypePermissioned.String()) + "--trace-type", types.TraceTypePermissioned.String()) args = append(args, - "--trace-type", config.TraceTypeAsterisc.String()) + "--trace-type", types.TraceTypeAsterisc.String()) cfg := configForArgs(t, args) - require.Equal(t, []config.TraceType{config.TraceTypeCannon, config.TraceTypeAlphabet, config.TraceTypePermissioned, config.TraceTypeAsterisc}, cfg.TraceTypes) + require.Equal(t, []types.TraceType{types.TraceTypeCannon, types.TraceTypeAlphabet, types.TraceTypePermissioned, types.TraceTypeAsterisc}, cfg.TraceTypes) }) t.Run("WithSomeOptions", func(t *testing.T) { - argsMap := requiredArgs(config.TraceTypeCannon) + argsMap := requiredArgs(types.TraceTypeCannon) args := toArgList(argsMap) // Add extra trace types (cannon is already specified) args = append(args, - "--trace-type", config.TraceTypeAlphabet.String()) + "--trace-type", types.TraceTypeAlphabet.String()) cfg := configForArgs(t, args) - require.Equal(t, []config.TraceType{config.TraceTypeCannon, config.TraceTypeAlphabet}, cfg.TraceTypes) + require.Equal(t, []types.TraceType{types.TraceTypeCannon, types.TraceTypeAlphabet}, cfg.TraceTypes) }) t.Run("SpecifySameOptionMultipleTimes", func(t *testing.T) { - argsMap := requiredArgs(config.TraceTypeCannon) + argsMap := requiredArgs(types.TraceTypeCannon) args := toArgList(argsMap) // Add cannon trace type again - args = append(args, "--trace-type", config.TraceTypeCannon.String()) + args = append(args, "--trace-type", types.TraceTypeCannon.String()) // We're fine with the same option being listed multiple times, just deduplicate them. cfg := configForArgs(t, args) - require.Equal(t, []config.TraceType{config.TraceTypeCannon}, cfg.TraceTypes) + require.Equal(t, []types.TraceType{types.TraceTypeCannon}, cfg.TraceTypes) }) } func TestGameFactoryAddress(t *testing.T) { - t.Run("Required", func(t *testing.T) { - verifyArgsInvalid(t, "flag game-factory-address is required", addRequiredArgsExcept(config.TraceTypeAlphabet, "--game-factory-address")) + t.Run("RequiredWhenNetworkNotSupplied", func(t *testing.T) { + verifyArgsInvalid(t, "flag game-factory-address or network is required", addRequiredArgsExcept(types.TraceTypeAlphabet, "--game-factory-address")) }) t.Run("Valid", func(t *testing.T) { addr := common.Address{0xbb, 0xcc, 0xdd} - cfg := configForArgs(t, addRequiredArgsExcept(config.TraceTypeAlphabet, "--game-factory-address", "--game-factory-address="+addr.Hex())) + cfg := configForArgs(t, addRequiredArgsExcept(types.TraceTypeAlphabet, "--game-factory-address", "--game-factory-address="+addr.Hex())) require.Equal(t, addr, cfg.GameFactoryAddress) }) t.Run("Invalid", func(t *testing.T) { - verifyArgsInvalid(t, "invalid address: foo", addRequiredArgsExcept(config.TraceTypeAlphabet, "--game-factory-address", "--game-factory-address=foo")) + verifyArgsInvalid(t, "invalid address: foo", addRequiredArgsExcept(types.TraceTypeAlphabet, "--game-factory-address", "--game-factory-address=foo")) + }) + + t.Run("OverridesNetwork", func(t *testing.T) { + addr := common.Address{0xbb, 0xcc, 0xdd} + cfg := configForArgs(t, addRequiredArgsExcept(types.TraceTypeAlphabet, "--game-factory-address", "--game-factory-address", addr.Hex(), "--network", "op-sepolia")) + require.Equal(t, addr, cfg.GameFactoryAddress) + }) +} + +func TestNetwork(t *testing.T) { + t.Run("Valid", func(t *testing.T) { + opSepoliaChainId := uint64(11155420) + cfg := configForArgs(t, addRequiredArgsExcept(types.TraceTypeAlphabet, "--game-factory-address", "--network=op-sepolia")) + require.EqualValues(t, superchain.Addresses[opSepoliaChainId].DisputeGameFactoryProxy, cfg.GameFactoryAddress) + }) + + t.Run("UnknownNetwork", func(t *testing.T) { + verifyArgsInvalid(t, "unknown chain: not-a-network", addRequiredArgsExcept(types.TraceTypeAlphabet, "--game-factory-address", "--network=not-a-network")) }) } func TestGameAllowlist(t *testing.T) { t.Run("Optional", func(t *testing.T) { - cfg := configForArgs(t, addRequiredArgsExcept(config.TraceTypeAlphabet, "--game-allowlist")) + cfg := configForArgs(t, addRequiredArgsExcept(types.TraceTypeAlphabet, "--game-allowlist")) require.NoError(t, cfg.Check()) }) t.Run("Valid", func(t *testing.T) { addr := common.Address{0xbb, 0xcc, 0xdd} - cfg := configForArgs(t, addRequiredArgsExcept(config.TraceTypeAlphabet, "--game-allowlist", "--game-allowlist="+addr.Hex())) + cfg := configForArgs(t, addRequiredArgsExcept(types.TraceTypeAlphabet, "--game-allowlist", "--game-allowlist="+addr.Hex())) require.Contains(t, cfg.GameAllowlist, addr) }) t.Run("Invalid", func(t *testing.T) { - verifyArgsInvalid(t, "invalid address: foo", addRequiredArgsExcept(config.TraceTypeAlphabet, "--game-allowlist", "--game-allowlist=foo")) + verifyArgsInvalid(t, "invalid address: foo", addRequiredArgsExcept(types.TraceTypeAlphabet, "--game-allowlist", "--game-allowlist=foo")) }) } func TestTxManagerFlagsSupported(t *testing.T) { // Not a comprehensive list of flags, just enough to sanity check the txmgr.CLIFlags were defined - cfg := configForArgs(t, addRequiredArgs(config.TraceTypeAlphabet, "--"+txmgr.NumConfirmationsFlagName, "7")) + cfg := configForArgs(t, addRequiredArgs(types.TraceTypeAlphabet, "--"+txmgr.NumConfirmationsFlagName, "7")) require.Equal(t, uint64(7), cfg.TxMgrConfig.NumConfirmations) } func TestMaxConcurrency(t *testing.T) { t.Run("Valid", func(t *testing.T) { expected := uint(345) - cfg := configForArgs(t, addRequiredArgs(config.TraceTypeAlphabet, "--max-concurrency", "345")) + cfg := configForArgs(t, addRequiredArgs(types.TraceTypeAlphabet, "--max-concurrency", "345")) require.Equal(t, expected, cfg.MaxConcurrency) }) @@ -193,26 +213,26 @@ func TestMaxConcurrency(t *testing.T) { verifyArgsInvalid( t, "invalid value \"abc\" for flag -max-concurrency", - addRequiredArgs(config.TraceTypeAlphabet, "--max-concurrency", "abc")) + addRequiredArgs(types.TraceTypeAlphabet, "--max-concurrency", "abc")) }) t.Run("Zero", func(t *testing.T) { verifyArgsInvalid( t, "max-concurrency must not be 0", - addRequiredArgs(config.TraceTypeAlphabet, "--max-concurrency", "0")) + addRequiredArgs(types.TraceTypeAlphabet, "--max-concurrency", "0")) }) } func TestMaxPendingTx(t *testing.T) { t.Run("Valid", func(t *testing.T) { expected := uint64(345) - cfg := configForArgs(t, addRequiredArgs(config.TraceTypeAlphabet, "--max-pending-tx", "345")) + cfg := configForArgs(t, addRequiredArgs(types.TraceTypeAlphabet, "--max-pending-tx", "345")) require.Equal(t, expected, cfg.MaxPendingTx) }) t.Run("Zero", func(t *testing.T) { - cfg := configForArgs(t, addRequiredArgs(config.TraceTypeAlphabet, "--max-pending-tx", "0")) + cfg := configForArgs(t, addRequiredArgs(types.TraceTypeAlphabet, "--max-pending-tx", "0")) require.Equal(t, uint64(0), cfg.MaxPendingTx) }) @@ -220,19 +240,19 @@ func TestMaxPendingTx(t *testing.T) { verifyArgsInvalid( t, "invalid value \"abc\" for flag -max-pending-tx", - addRequiredArgs(config.TraceTypeAlphabet, "--max-pending-tx", "abc")) + addRequiredArgs(types.TraceTypeAlphabet, "--max-pending-tx", "abc")) }) } func TestPollInterval(t *testing.T) { t.Run("UsesDefault", func(t *testing.T) { - cfg := configForArgs(t, addRequiredArgs(config.TraceTypeCannon)) + cfg := configForArgs(t, addRequiredArgs(types.TraceTypeCannon)) require.Equal(t, config.DefaultPollInterval, cfg.PollInterval) }) t.Run("Valid", func(t *testing.T) { expected := 100 * time.Second - cfg := configForArgs(t, addRequiredArgs(config.TraceTypeAlphabet, "--http-poll-interval", "100s")) + cfg := configForArgs(t, addRequiredArgs(types.TraceTypeAlphabet, "--http-poll-interval", "100s")) require.Equal(t, expected, cfg.PollInterval) }) @@ -240,70 +260,121 @@ func TestPollInterval(t *testing.T) { verifyArgsInvalid( t, "invalid value \"abc\" for flag -http-poll-interval", - addRequiredArgs(config.TraceTypeAlphabet, "--http-poll-interval", "abc")) + addRequiredArgs(types.TraceTypeAlphabet, "--http-poll-interval", "abc")) }) } -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")) - }) +func TestAsteriscOpProgramRequiredArgs(t *testing.T) { + traceType := types.TraceTypeAsterisc + t.Run(fmt.Sprintf("TestAsteriscServer-%v", traceType), func(t *testing.T) { + t.Run("NotRequiredForAlphabetTrace", func(t *testing.T) { + configForArgs(t, addRequiredArgsExcept(types.TraceTypeAlphabet, "--asterisc-server")) + }) - t.Run("Required", func(t *testing.T) { - verifyArgsInvalid(t, "flag asterisc-bin is required", addRequiredArgsExcept(traceType, "--asterisc-bin")) - }) + 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-bin", "--asterisc-bin=./asterisc")) - require.Equal(t, "./asterisc", cfg.AsteriscBin) - }) + t.Run("Valid", func(t *testing.T) { + cfg := configForArgs(t, addRequiredArgsExcept(traceType, "--asterisc-server", "--asterisc-server=./op-program")) + require.Equal(t, "./op-program", cfg.Asterisc.Server) + }) + }) + + t.Run(fmt.Sprintf("TestAsteriscAbsolutePrestate-%v", traceType), func(t *testing.T) { + t.Run("NotRequiredForAlphabetTrace", func(t *testing.T) { + configForArgs(t, addRequiredArgsExcept(types.TraceTypeAlphabet, "--asterisc-prestate")) }) - 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-prestates-url or asterisc-prestate is required", addRequiredArgsExcept(traceType, "--asterisc-prestate")) + }) - 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-prestate", "--asterisc-prestate=./pre.json")) + require.Equal(t, "./pre.json", cfg.AsteriscAbsolutePreState) + }) + }) - 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("TestAsteriscAbsolutePrestateBaseURL-%v", traceType), func(t *testing.T) { + t.Run("NotRequiredForAlphabetTrace", func(t *testing.T) { + configForArgs(t, addRequiredArgsExcept(types.TraceTypeAlphabet, "--asterisc-prestates-url")) }) - 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("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("Valid", func(t *testing.T) { - cfg := configForArgs(t, addRequiredArgsExcept(traceType, "--asterisc-prestate", "--asterisc-prestate=./pre.json")) - require.Equal(t, "./pre.json", cfg.AsteriscAbsolutePreState) - }) +func TestAsteriscKonaRequiredArgs(t *testing.T) { + traceType := types.TraceTypeAsteriscKona + t.Run(fmt.Sprintf("TestAsteriscServer-%v", traceType), func(t *testing.T) { + t.Run("NotRequiredForAlphabetTrace", func(t *testing.T) { + configForArgs(t, addRequiredArgsExcept(types.TraceTypeAlphabet, "--asterisc-kona-server")) + }) + + t.Run("Required", func(t *testing.T) { + verifyArgsInvalid(t, "flag asterisc-kona-server is required", addRequiredArgsExcept(traceType, "--asterisc-kona-server")) }) - t.Run(fmt.Sprintf("TestAsteriscAbsolutePrestateBaseURL-%v", traceType), func(t *testing.T) { + t.Run("Valid", func(t *testing.T) { + cfg := configForArgs(t, addRequiredArgsExcept(traceType, "--asterisc-kona-server", "--asterisc-kona-server=./kona-host")) + require.Equal(t, "./kona-host", cfg.AsteriscKona.Server) + }) + }) + + t.Run(fmt.Sprintf("TestAsteriscAbsolutePrestate-%v", traceType), func(t *testing.T) { + t.Run("NotRequiredForAlphabetTrace", func(t *testing.T) { + configForArgs(t, addRequiredArgsExcept(types.TraceTypeAlphabet, "--asterisc-kona-prestate")) + }) + + t.Run("Required", func(t *testing.T) { + verifyArgsInvalid(t, "flag asterisc-kona-prestates-url or asterisc-kona-prestate is required", addRequiredArgsExcept(traceType, "--asterisc-kona-prestate")) + }) + + t.Run("Valid", func(t *testing.T) { + cfg := configForArgs(t, addRequiredArgsExcept(traceType, "--asterisc-kona-prestate", "--asterisc-kona-prestate=./pre.json")) + require.Equal(t, "./pre.json", cfg.AsteriscKonaAbsolutePreState) + }) + }) + + t.Run(fmt.Sprintf("TestAsteriscAbsolutePrestateBaseURL-%v", traceType), func(t *testing.T) { + t.Run("NotRequiredForAlphabetTrace", func(t *testing.T) { + configForArgs(t, addRequiredArgsExcept(types.TraceTypeAlphabet, "--asterisc-kona-prestates-url")) + }) + + t.Run("Required", func(t *testing.T) { + verifyArgsInvalid(t, "flag asterisc-kona-prestates-url or asterisc-kona-prestate is required", addRequiredArgsExcept(traceType, "--asterisc-kona-prestate")) + }) + + t.Run("Valid", func(t *testing.T) { + cfg := configForArgs(t, addRequiredArgsExcept(traceType, "--asterisc-kona-prestates-url", "--asterisc-kona-prestates-url=http://localhost/bar")) + require.Equal(t, "http://localhost/bar", cfg.AsteriscKonaAbsolutePreStateBaseURL.String()) + }) + }) +} + +func TestAsteriscBaseRequiredArgs(t *testing.T) { + for _, traceType := range []types.TraceType{types.TraceTypeAsterisc, types.TraceTypeAsteriscKona} { + 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-prestates-url")) + configForArgs(t, addRequiredArgsExcept(types.TraceTypeAlphabet, "--asterisc-bin")) }) t.Run("Required", func(t *testing.T) { - verifyArgsInvalid(t, "flag asterisc-prestates-url or asterisc-prestate is required", addRequiredArgsExcept(traceType, "--asterisc-prestate")) + verifyArgsInvalid(t, "flag asterisc-bin is required", addRequiredArgsExcept(traceType, "--asterisc-bin")) }) 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()) + cfg := configForArgs(t, addRequiredArgsExcept(traceType, "--asterisc-bin", "--asterisc-bin=./asterisc")) + require.Equal(t, "./asterisc", cfg.Asterisc.VmBin) }) }) @@ -330,12 +401,12 @@ func TestAsteriscRequiredArgs(t *testing.T) { 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) + require.Equal(t, config.DefaultAsteriscSnapshotFreq, cfg.Asterisc.SnapshotFreq) }) t.Run("Valid", func(t *testing.T) { cfg := configForArgs(t, addRequiredArgs(traceType, "--asterisc-snapshot-freq=1234")) - require.Equal(t, uint(1234), cfg.AsteriscSnapshotFreq) + require.Equal(t, uint(1234), cfg.Asterisc.SnapshotFreq) }) t.Run("Invalid", func(t *testing.T) { @@ -347,12 +418,12 @@ func TestAsteriscRequiredArgs(t *testing.T) { 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) + require.Equal(t, config.DefaultAsteriscInfoFreq, cfg.Asterisc.InfoFreq) }) t.Run("Valid", func(t *testing.T) { cfg := configForArgs(t, addRequiredArgs(traceType, "--asterisc-info-freq=1234")) - require.Equal(t, uint(1234), cfg.AsteriscInfoFreq) + require.Equal(t, uint(1234), cfg.Asterisc.InfoFreq) }) t.Run("Invalid", func(t *testing.T) { @@ -364,19 +435,19 @@ func TestAsteriscRequiredArgs(t *testing.T) { 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", + "flag asterisc-network, 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", + "flag asterisc-network, 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", + "flag asterisc-network, 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) { + t.Run(fmt.Sprintf("TestMustNotSpecifyAsteriscNetworkAndRollup-%v", traceType), func(t *testing.T) { verifyArgsInvalid( t, "flag asterisc-network can not be used with asterisc-rollup-config and asterisc-l2-genesis", @@ -384,9 +455,22 @@ func TestAsteriscRequiredArgs(t *testing.T) { "--asterisc-network", asteriscNetwork, "--asterisc-rollup-config=rollup.json")) }) + t.Run(fmt.Sprintf("TestMustNotSpecifyNetworkAndRollup-%v", traceType), func(t *testing.T) { + args := requiredArgs(traceType) + delete(args, "--asterisc-network") + delete(args, "--game-factory-address") + args["--network"] = asteriscNetwork + args["--asterisc-rollup-config"] = "rollup.json" + args["--asterisc-l2-genesis"] = "gensis.json" + verifyArgsInvalid( + t, + "flag network can not be used with asterisc-rollup-config and asterisc-l2-genesis", + toArgList(args)) + }) + 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")) + configForArgs(t, addRequiredArgsExcept(types.TraceTypeAlphabet, "--asterisc-network")) }) t.Run("NotRequiredWhenRollupAndGenesIsSpecified", func(t *testing.T) { @@ -394,60 +478,74 @@ func TestAsteriscRequiredArgs(t *testing.T) { "--asterisc-rollup-config=rollup.json", "--asterisc-l2-genesis=genesis.json")) }) + t.Run("NotRequiredWhenNetworkSpecified", func(t *testing.T) { + args := requiredArgs(traceType) + delete(args, "--asterisc-network") + delete(args, "--game-factory-address") + args["--network"] = "op-sepolia" + cfg := configForArgs(t, toArgList(args)) + require.Equal(t, "op-sepolia", cfg.Asterisc.Network) + }) + + t.Run("MustNotSpecifyNetworkAndAsteriscNetwork", func(t *testing.T) { + verifyArgsInvalid(t, "flag asterisc-network can not be used with network", + addRequiredArgsExcept(traceType, "--game-factory-address", "--network", "op-sepolia")) + }) + t.Run("Valid", func(t *testing.T) { cfg := configForArgs(t, addRequiredArgsExcept(traceType, "--asterisc-network", "--asterisc-network", testNetwork)) - require.Equal(t, testNetwork, cfg.AsteriscNetwork) + require.Equal(t, testNetwork, cfg.Asterisc.Network) }) }) 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")) + configForArgs(t, addRequiredArgsExcept(types.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) + require.Equal(t, "rollup.json", cfg.Asterisc.RollupConfigPath) }) }) 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")) + configForArgs(t, addRequiredArgsExcept(types.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) + require.Equal(t, "genesis.json", cfg.Asterisc.L2GenesisPath) }) }) } } func TestAlphabetRequiredArgs(t *testing.T) { - t.Run(fmt.Sprintf("TestL2Rpc-%v", config.TraceTypeAlphabet), func(t *testing.T) { + t.Run(fmt.Sprintf("TestL2Rpc-%v", types.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")) + verifyArgsInvalid(t, "flag l2-eth-rpc is required", addRequiredArgsExcept(types.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))) + cfg := configForArgs(t, addRequiredArgsExcept(types.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)) + cfg := configForArgs(t, addRequiredArgs(types.TraceTypeAlphabet)) require.Equal(t, l2EthRpc, cfg.L2Rpc) }) }) } func TestCannonRequiredArgs(t *testing.T) { - for _, traceType := range []config.TraceType{config.TraceTypeCannon, config.TraceTypePermissioned} { + for _, traceType := range []types.TraceType{types.TraceTypeCannon, types.TraceTypePermissioned} { traceType := traceType t.Run(fmt.Sprintf("TestCannonBin-%v", traceType), func(t *testing.T) { t.Run("NotRequiredForAlphabetTrace", func(t *testing.T) { - configForArgs(t, addRequiredArgsExcept(config.TraceTypeAlphabet, "--cannon-bin")) + configForArgs(t, addRequiredArgsExcept(types.TraceTypeAlphabet, "--cannon-bin")) }) t.Run("Required", func(t *testing.T) { @@ -456,13 +554,13 @@ func TestCannonRequiredArgs(t *testing.T) { t.Run("Valid", func(t *testing.T) { cfg := configForArgs(t, addRequiredArgsExcept(traceType, "--cannon-bin", "--cannon-bin=./cannon")) - require.Equal(t, "./cannon", cfg.CannonBin) + require.Equal(t, "./cannon", cfg.Cannon.VmBin) }) }) t.Run(fmt.Sprintf("TestCannonServer-%v", traceType), func(t *testing.T) { t.Run("NotRequiredForAlphabetTrace", func(t *testing.T) { - configForArgs(t, addRequiredArgsExcept(config.TraceTypeAlphabet, "--cannon-server")) + configForArgs(t, addRequiredArgsExcept(types.TraceTypeAlphabet, "--cannon-server")) }) t.Run("Required", func(t *testing.T) { @@ -471,13 +569,13 @@ func TestCannonRequiredArgs(t *testing.T) { t.Run("Valid", func(t *testing.T) { cfg := configForArgs(t, addRequiredArgsExcept(traceType, "--cannon-server", "--cannon-server=./op-program")) - require.Equal(t, "./op-program", cfg.CannonServer) + require.Equal(t, "./op-program", cfg.Cannon.Server) }) }) t.Run(fmt.Sprintf("TestCannonAbsolutePrestate-%v", traceType), func(t *testing.T) { t.Run("NotRequiredForAlphabetTrace", func(t *testing.T) { - configForArgs(t, addRequiredArgsExcept(config.TraceTypeAlphabet, "--cannon-prestate")) + configForArgs(t, addRequiredArgsExcept(types.TraceTypeAlphabet, "--cannon-prestate")) }) t.Run("Required", func(t *testing.T) { @@ -492,7 +590,7 @@ func TestCannonRequiredArgs(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-prestates-url")) + configForArgs(t, addRequiredArgsExcept(types.TraceTypeAlphabet, "--cannon-prestates-url")) }) t.Run("Required", func(t *testing.T) { @@ -524,12 +622,12 @@ func TestCannonRequiredArgs(t *testing.T) { t.Run(fmt.Sprintf("TestCannonSnapshotFreq-%v", traceType), func(t *testing.T) { t.Run("UsesDefault", func(t *testing.T) { cfg := configForArgs(t, addRequiredArgs(traceType)) - require.Equal(t, config.DefaultCannonSnapshotFreq, cfg.CannonSnapshotFreq) + require.Equal(t, config.DefaultCannonSnapshotFreq, cfg.Cannon.SnapshotFreq) }) t.Run("Valid", func(t *testing.T) { cfg := configForArgs(t, addRequiredArgs(traceType, "--cannon-snapshot-freq=1234")) - require.Equal(t, uint(1234), cfg.CannonSnapshotFreq) + require.Equal(t, uint(1234), cfg.Cannon.SnapshotFreq) }) t.Run("Invalid", func(t *testing.T) { @@ -541,12 +639,12 @@ func TestCannonRequiredArgs(t *testing.T) { t.Run(fmt.Sprintf("TestCannonInfoFreq-%v", traceType), func(t *testing.T) { t.Run("UsesDefault", func(t *testing.T) { cfg := configForArgs(t, addRequiredArgs(traceType)) - require.Equal(t, config.DefaultCannonInfoFreq, cfg.CannonInfoFreq) + require.Equal(t, config.DefaultCannonInfoFreq, cfg.Cannon.InfoFreq) }) t.Run("Valid", func(t *testing.T) { cfg := configForArgs(t, addRequiredArgs(traceType, "--cannon-info-freq=1234")) - require.Equal(t, uint(1234), cfg.CannonInfoFreq) + require.Equal(t, uint(1234), cfg.Cannon.InfoFreq) }) t.Run("Invalid", func(t *testing.T) { @@ -558,19 +656,19 @@ func TestCannonRequiredArgs(t *testing.T) { t.Run(fmt.Sprintf("TestRequireEitherCannonNetworkOrRollupAndGenesis-%v", traceType), func(t *testing.T) { verifyArgsInvalid( t, - "flag cannon-network or cannon-rollup-config and cannon-l2-genesis is required", + "flag cannon-network, network or cannon-rollup-config and cannon-l2-genesis is required", addRequiredArgsExcept(traceType, "--cannon-network")) verifyArgsInvalid( t, - "flag cannon-network or cannon-rollup-config and cannon-l2-genesis is required", + "flag cannon-network, network or cannon-rollup-config and cannon-l2-genesis is required", addRequiredArgsExcept(traceType, "--cannon-network", "--cannon-rollup-config=rollup.json")) verifyArgsInvalid( t, - "flag cannon-network or cannon-rollup-config and cannon-l2-genesis is required", + "flag cannon-network, network or cannon-rollup-config and cannon-l2-genesis is required", addRequiredArgsExcept(traceType, "--cannon-network", "--cannon-l2-genesis=gensis.json")) }) - t.Run(fmt.Sprintf("TestMustNotSpecifyNetworkAndRollup-%v", traceType), func(t *testing.T) { + t.Run(fmt.Sprintf("TestMustNotSpecifyCannonNetworkAndRollup-%v", traceType), func(t *testing.T) { verifyArgsInvalid( t, "flag cannon-network can not be used with cannon-rollup-config and cannon-l2-genesis", @@ -578,9 +676,22 @@ func TestCannonRequiredArgs(t *testing.T) { "--cannon-network", cannonNetwork, "--cannon-rollup-config=rollup.json")) }) + t.Run(fmt.Sprintf("TestMustNotSpecifyNetworkAndRollup-%v", traceType), func(t *testing.T) { + args := requiredArgs(traceType) + delete(args, "--cannon-network") + delete(args, "--game-factory-address") + args["--network"] = cannonNetwork + args["--cannon-rollup-config"] = "rollup.json" + args["--cannon-l2-genesis"] = "gensis.json" + verifyArgsInvalid( + t, + "flag network can not be used with cannon-rollup-config and cannon-l2-genesis", + toArgList(args)) + }) + t.Run(fmt.Sprintf("TestCannonNetwork-%v", traceType), func(t *testing.T) { t.Run("NotRequiredForAlphabetTrace", func(t *testing.T) { - configForArgs(t, addRequiredArgsExcept(config.TraceTypeAlphabet, "--cannon-network")) + configForArgs(t, addRequiredArgsExcept(types.TraceTypeAlphabet, "--cannon-network")) }) t.Run("NotRequiredWhenRollupAndGenesIsSpecified", func(t *testing.T) { @@ -588,38 +699,52 @@ func TestCannonRequiredArgs(t *testing.T) { "--cannon-rollup-config=rollup.json", "--cannon-l2-genesis=genesis.json")) }) + t.Run("NotRequiredWhenNetworkSpecified", func(t *testing.T) { + args := requiredArgs(traceType) + delete(args, "--cannon-network") + delete(args, "--game-factory-address") + args["--network"] = "op-sepolia" + cfg := configForArgs(t, toArgList(args)) + require.Equal(t, "op-sepolia", cfg.Cannon.Network) + }) + + t.Run("MustNotSpecifyNetworkAndCannonNetwork", func(t *testing.T) { + verifyArgsInvalid(t, "flag cannon-network can not be used with network", + addRequiredArgsExcept(traceType, "--game-factory-address", "--network", "op-sepolia")) + }) + t.Run("Valid", func(t *testing.T) { cfg := configForArgs(t, addRequiredArgsExcept(traceType, "--cannon-network", "--cannon-network", testNetwork)) - require.Equal(t, testNetwork, cfg.CannonNetwork) + require.Equal(t, testNetwork, cfg.Cannon.Network) }) }) t.Run(fmt.Sprintf("TestCannonRollupConfig-%v", traceType), func(t *testing.T) { t.Run("NotRequiredForAlphabetTrace", func(t *testing.T) { - configForArgs(t, addRequiredArgsExcept(config.TraceTypeAlphabet, "--cannon-rollup-config")) + configForArgs(t, addRequiredArgsExcept(types.TraceTypeAlphabet, "--cannon-rollup-config")) }) t.Run("Valid", func(t *testing.T) { cfg := configForArgs(t, addRequiredArgsExcept(traceType, "--cannon-network", "--cannon-rollup-config=rollup.json", "--cannon-l2-genesis=genesis.json")) - require.Equal(t, "rollup.json", cfg.CannonRollupConfigPath) + require.Equal(t, "rollup.json", cfg.Cannon.RollupConfigPath) }) }) - t.Run(fmt.Sprintf("TestCannonL2qGenesis-%v", traceType), func(t *testing.T) { + t.Run(fmt.Sprintf("TestCannonL2Genesis-%v", traceType), func(t *testing.T) { t.Run("NotRequiredForAlphabetTrace", func(t *testing.T) { - configForArgs(t, addRequiredArgsExcept(config.TraceTypeAlphabet, "--cannon-l2-genesis")) + configForArgs(t, addRequiredArgsExcept(types.TraceTypeAlphabet, "--cannon-l2-genesis")) }) t.Run("Valid", func(t *testing.T) { cfg := configForArgs(t, addRequiredArgsExcept(traceType, "--cannon-network", "--cannon-rollup-config=rollup.json", "--cannon-l2-genesis=genesis.json")) - require.Equal(t, "genesis.json", cfg.CannonL2GenesisPath) + require.Equal(t, "genesis.json", cfg.Cannon.L2GenesisPath) }) }) } } func TestDataDir(t *testing.T) { - for _, traceType := range config.TraceTypes { + for _, traceType := range types.TraceTypes { traceType := traceType t.Run(fmt.Sprintf("RequiredFor-%v", traceType), func(t *testing.T) { @@ -628,13 +753,13 @@ func TestDataDir(t *testing.T) { } t.Run("Valid", func(t *testing.T) { - cfg := configForArgs(t, addRequiredArgsExcept(config.TraceTypeCannon, "--datadir", "--datadir=/foo/bar/cannon")) + cfg := configForArgs(t, addRequiredArgsExcept(types.TraceTypeCannon, "--datadir", "--datadir=/foo/bar/cannon")) require.Equal(t, "/foo/bar/cannon", cfg.Datadir) }) } func TestRollupRpc(t *testing.T) { - for _, traceType := range config.TraceTypes { + for _, traceType := range types.TraceTypes { traceType := traceType t.Run(fmt.Sprintf("RequiredFor-%v", traceType), func(t *testing.T) { @@ -643,59 +768,59 @@ func TestRollupRpc(t *testing.T) { } t.Run("Valid", func(t *testing.T) { - cfg := configForArgs(t, addRequiredArgs(config.TraceTypeCannon)) + cfg := configForArgs(t, addRequiredArgs(types.TraceTypeCannon)) require.Equal(t, rollupRpc, cfg.RollupRpc) }) } func TestGameWindow(t *testing.T) { t.Run("UsesDefault", func(t *testing.T) { - cfg := configForArgs(t, addRequiredArgs(config.TraceTypeAlphabet)) + cfg := configForArgs(t, addRequiredArgs(types.TraceTypeAlphabet)) require.Equal(t, config.DefaultGameWindow, cfg.GameWindow) }) t.Run("Valid", func(t *testing.T) { - cfg := configForArgs(t, addRequiredArgs(config.TraceTypeAlphabet, "--game-window=1m")) - require.Equal(t, time.Duration(time.Minute), cfg.GameWindow) + cfg := configForArgs(t, addRequiredArgs(types.TraceTypeAlphabet, "--game-window=1m")) + require.Equal(t, time.Minute, cfg.GameWindow) }) t.Run("ParsesDefault", func(t *testing.T) { - cfg := configForArgs(t, addRequiredArgs(config.TraceTypeAlphabet, "--game-window=360h")) + cfg := configForArgs(t, addRequiredArgs(types.TraceTypeAlphabet, "--game-window=672h")) require.Equal(t, config.DefaultGameWindow, cfg.GameWindow) }) } func TestUnsafeAllowInvalidPrestate(t *testing.T) { t.Run("DefaultsToFalse", func(t *testing.T) { - cfg := configForArgs(t, addRequiredArgsExcept(config.TraceTypeAlphabet, "--unsafe-allow-invalid-prestate")) + cfg := configForArgs(t, addRequiredArgsExcept(types.TraceTypeAlphabet, "--unsafe-allow-invalid-prestate")) require.False(t, cfg.AllowInvalidPrestate) }) t.Run("EnabledWithNoValue", func(t *testing.T) { - cfg := configForArgs(t, addRequiredArgs(config.TraceTypeCannon, "--unsafe-allow-invalid-prestate")) + cfg := configForArgs(t, addRequiredArgs(types.TraceTypeCannon, "--unsafe-allow-invalid-prestate")) require.True(t, cfg.AllowInvalidPrestate) }) t.Run("EnabledWithTrue", func(t *testing.T) { - cfg := configForArgs(t, addRequiredArgs(config.TraceTypeCannon, "--unsafe-allow-invalid-prestate=true")) + cfg := configForArgs(t, addRequiredArgs(types.TraceTypeCannon, "--unsafe-allow-invalid-prestate=true")) require.True(t, cfg.AllowInvalidPrestate) }) t.Run("DisabledWithFalse", func(t *testing.T) { - cfg := configForArgs(t, addRequiredArgs(config.TraceTypeCannon, "--unsafe-allow-invalid-prestate=false")) + cfg := configForArgs(t, addRequiredArgs(types.TraceTypeCannon, "--unsafe-allow-invalid-prestate=false")) require.False(t, cfg.AllowInvalidPrestate) }) } func TestAdditionalBondClaimants(t *testing.T) { t.Run("DefaultsToEmpty", func(t *testing.T) { - cfg := configForArgs(t, addRequiredArgsExcept(config.TraceTypeAlphabet, "--additional-bond-claimants")) + cfg := configForArgs(t, addRequiredArgsExcept(types.TraceTypeAlphabet, "--additional-bond-claimants")) require.Empty(t, cfg.AdditionalBondClaimants) }) t.Run("Valid-Single", func(t *testing.T) { claimant := common.Address{0xaa} - cfg := configForArgs(t, addRequiredArgs(config.TraceTypeAlphabet, "--additional-bond-claimants", claimant.Hex())) + cfg := configForArgs(t, addRequiredArgs(types.TraceTypeAlphabet, "--additional-bond-claimants", claimant.Hex())) require.Contains(t, cfg.AdditionalBondClaimants, claimant) require.Len(t, cfg.AdditionalBondClaimants, 1) }) @@ -704,7 +829,7 @@ func TestAdditionalBondClaimants(t *testing.T) { claimant1 := common.Address{0xaa} claimant2 := common.Address{0xbb} claimant3 := common.Address{0xcc} - cfg := configForArgs(t, addRequiredArgs(config.TraceTypeAlphabet, + cfg := configForArgs(t, addRequiredArgs(types.TraceTypeAlphabet, "--additional-bond-claimants", fmt.Sprintf("%v,%v,%v", claimant1.Hex(), claimant2.Hex(), claimant3.Hex()))) require.Contains(t, cfg.AdditionalBondClaimants, claimant1) require.Contains(t, cfg.AdditionalBondClaimants, claimant2) @@ -714,14 +839,14 @@ func TestAdditionalBondClaimants(t *testing.T) { t.Run("Invalid-Single", func(t *testing.T) { verifyArgsInvalid(t, "invalid additional claimant", - addRequiredArgs(config.TraceTypeAlphabet, "--additional-bond-claimants", "nope")) + addRequiredArgs(types.TraceTypeAlphabet, "--additional-bond-claimants", "nope")) }) t.Run("Invalid-Multiple", func(t *testing.T) { claimant1 := common.Address{0xaa} claimant2 := common.Address{0xbb} verifyArgsInvalid(t, "invalid additional claimant", - addRequiredArgs(config.TraceTypeAlphabet, "--additional-bond-claimants", fmt.Sprintf("%v,nope,%v", claimant1.Hex(), claimant2.Hex()))) + addRequiredArgs(types.TraceTypeAlphabet, "--additional-bond-claimants", fmt.Sprintf("%v,nope,%v", claimant1.Hex(), claimant2.Hex()))) }) } @@ -752,19 +877,19 @@ func dryRunWithArgs(cliArgs []string) (log.Logger, config.Config, error) { return logger, *cfg, err } -func addRequiredArgs(traceType config.TraceType, args ...string) []string { +func addRequiredArgs(traceType types.TraceType, args ...string) []string { req := requiredArgs(traceType) combined := toArgList(req) return append(combined, args...) } -func addRequiredArgsExcept(traceType config.TraceType, name string, optionalArgs ...string) []string { +func addRequiredArgsExcept(traceType types.TraceType, name string, optionalArgs ...string) []string { req := requiredArgs(traceType) delete(req, name) return append(toArgList(req), optionalArgs...) } -func requiredArgs(traceType config.TraceType) map[string]string { +func requiredArgs(traceType types.TraceType) map[string]string { args := map[string]string{ "--l1-eth-rpc": l1EthRpc, "--l1-beacon": l1Beacon, @@ -775,10 +900,12 @@ func requiredArgs(traceType config.TraceType) map[string]string { "--datadir": datadir, } switch traceType { - case config.TraceTypeCannon, config.TraceTypePermissioned: + case types.TraceTypeCannon, types.TraceTypePermissioned: addRequiredCannonArgs(args) - case config.TraceTypeAsterisc: + case types.TraceTypeAsterisc: addRequiredAsteriscArgs(args) + case types.TraceTypeAsteriscKona: + addRequiredAsteriscKonaArgs(args) } return args } @@ -799,6 +926,14 @@ func addRequiredAsteriscArgs(args map[string]string) { args["--l2-eth-rpc"] = l2EthRpc } +func addRequiredAsteriscKonaArgs(args map[string]string) { + args["--asterisc-network"] = asteriscNetwork + args["--asterisc-bin"] = asteriscBin + args["--asterisc-kona-server"] = asteriscServer + args["--asterisc-kona-prestate"] = asteriscPreState + args["--l2-eth-rpc"] = l2EthRpc +} + func toArgList(req map[string]string) []string { var combined []string for name, value := range req { diff --git a/op-challenger/cmd/move.go b/op-challenger/cmd/move.go index e7cf2587aa4f..cf460d691f3b 100644 --- a/op-challenger/cmd/move.go +++ b/op-challenger/cmd/move.go @@ -1,7 +1,6 @@ package main import ( - "context" "fmt" "github.com/ethereum-optimism/optimism/op-challenger/flags" @@ -46,7 +45,7 @@ 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, AddrFromFlag(GameAddressFlag.Name), contracts.NewFaultDisputeGameContract) if err != nil { return fmt.Errorf("failed to create dispute game bindings: %w", err) } @@ -70,7 +69,7 @@ func Move(ctx *cli.Context) error { return fmt.Errorf("either attack or defense flag must be set") } - rct, err := txMgr.Send(context.Background(), tx) + rct, err := txMgr.Send(ctx.Context, tx) if err != nil { return fmt.Errorf("failed to send tx: %w", err) } @@ -97,6 +96,6 @@ var MoveCommand = &cli.Command{ Name: "move", Usage: "Creates and sends a move transaction to the dispute game", Description: "Creates and sends a move transaction to the dispute game", - Action: Move, + Action: Interruptible(Move), Flags: moveFlags(), } diff --git a/op-challenger/cmd/resolve.go b/op-challenger/cmd/resolve.go index 0e5dfb8f3878..1e4ac214dfc6 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, AddrFromFlag(GameAddressFlag.Name), contracts.NewFaultDisputeGameContract) if err != nil { return fmt.Errorf("failed to create dispute game bindings: %w", err) } @@ -46,6 +46,6 @@ var ResolveCommand = &cli.Command{ Name: "resolve", Usage: "Resolves the specified dispute game if possible", Description: "Resolves the specified dispute game if possible", - Action: Resolve, + Action: Interruptible(Resolve), Flags: resolveFlags(), } diff --git a/op-challenger/cmd/resolve_claim.go b/op-challenger/cmd/resolve_claim.go index 103aa2c7a7d7..7e564123073d 100644 --- a/op-challenger/cmd/resolve_claim.go +++ b/op-challenger/cmd/resolve_claim.go @@ -26,7 +26,7 @@ func ResolveClaim(ctx *cli.Context) error { } idx := ctx.Uint64(ClaimIdxFlag.Name) - contract, txMgr, err := NewContractWithTxMgr[contracts.FaultDisputeGameContract](ctx, GameAddressFlag.Name, contracts.NewFaultDisputeGameContract) + contract, txMgr, err := NewContractWithTxMgr[contracts.FaultDisputeGameContract](ctx, AddrFromFlag(GameAddressFlag.Name), contracts.NewFaultDisputeGameContract) if err != nil { return fmt.Errorf("failed to create dispute game bindings: %w", err) } @@ -66,6 +66,6 @@ var ResolveClaimCommand = &cli.Command{ Name: "resolve-claim", Usage: "Resolves the specified claim if possible", Description: "Resolves the specified claim if possible", - Action: ResolveClaim, + Action: Interruptible(ResolveClaim), Flags: resolveClaimFlags(), } diff --git a/op-challenger/cmd/run_trace.go b/op-challenger/cmd/run_trace.go new file mode 100644 index 000000000000..c1d2261230f9 --- /dev/null +++ b/op-challenger/cmd/run_trace.go @@ -0,0 +1,85 @@ +package main + +import ( + "context" + "errors" + "fmt" + "net/url" + + "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/trace/vm" + "github.com/ethereum-optimism/optimism/op-challenger/runner" + opservice "github.com/ethereum-optimism/optimism/op-service" + "github.com/ethereum-optimism/optimism/op-service/cliapp" + "github.com/ethereum/go-ethereum/common" + "github.com/urfave/cli/v2" +) + +func RunTrace(ctx *cli.Context, _ context.CancelCauseFunc) (cliapp.Lifecycle, error) { + + logger, err := setupLogging(ctx) + if err != nil { + return nil, err + } + logger.Info("Starting trace runner", "version", VersionWithMeta) + + cfg, err := flags.NewConfigFromCLI(ctx, logger) + if err != nil { + return nil, err + } + if err := cfg.Check(); err != nil { + return nil, err + } + if err := checkMTCannonFlags(ctx, cfg); err != nil { + return nil, err + } + + var mtPrestate common.Hash + var mtPrestateURL *url.URL + if ctx.IsSet(addMTCannonPrestateFlag.Name) { + mtPrestate = common.HexToHash(ctx.String(addMTCannonPrestateFlag.Name)) + mtPrestateURL, err = url.Parse(ctx.String(addMTCannonPrestateURLFlag.Name)) + if err != nil { + return nil, fmt.Errorf("invalid mt-cannon prestate url (%v): %w", ctx.String(addMTCannonPrestateFlag.Name), err) + } + } + return runner.NewRunner(logger, cfg, mtPrestate, mtPrestateURL), nil +} + +func checkMTCannonFlags(ctx *cli.Context, cfg *config.Config) error { + if ctx.IsSet(addMTCannonPrestateFlag.Name) || ctx.IsSet(addMTCannonPrestateURLFlag.Name) { + if ctx.IsSet(addMTCannonPrestateFlag.Name) != ctx.IsSet(addMTCannonPrestateURLFlag.Name) { + return fmt.Errorf("both flag %v and %v must be set when running MT-Cannon traces", addMTCannonPrestateURLFlag.Name, addMTCannonPrestateFlag.Name) + } + if cfg.Cannon == (vm.Config{}) { + return errors.New("required Cannon vm configuration for mt-cannon traces is missing") + } + } + return nil +} + +func runTraceFlags() []cli.Flag { + return append(flags.Flags, addMTCannonPrestateFlag, addMTCannonPrestateURLFlag) +} + +var RunTraceCommand = &cli.Command{ + Name: "run-trace", + Usage: "Continuously runs the specified trace providers in a regular loop", + Description: "Runs trace providers against real chain data to confirm compatibility", + Action: cliapp.LifecycleCmd(RunTrace), + Flags: runTraceFlags(), +} + +var ( + addMTCannonPrestateFlag = &cli.StringFlag{ + Name: "add-mt-cannon-prestate", + Usage: "Use this prestate to run MT-Cannon compatibility tests", + EnvVars: opservice.PrefixEnvVar(flags.EnvVarPrefix, "ADD_MT_CANNON_PRESTATE"), + } + addMTCannonPrestateURLFlag = &cli.StringFlag{ + Name: "add-mt-cannon-prestate-url", + Usage: "Use this prestate URL to run MT-Cannon compatibility tests", + EnvVars: opservice.PrefixEnvVar(flags.EnvVarPrefix, "ADD_MT_CANNON_PRESTATE_URL"), + } +) diff --git a/op-challenger/cmd/utils.go b/op-challenger/cmd/utils.go index ad5d30a8d41d..82c35f7fa0f5 100644 --- a/op-challenger/cmd/utils.go +++ b/op-challenger/cmd/utils.go @@ -7,6 +7,7 @@ import ( "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/ctxinterrupt" "github.com/ethereum-optimism/optimism/op-service/dial" "github.com/ethereum-optimism/optimism/op-service/sources/batching" "github.com/ethereum-optimism/optimism/op-service/txmgr" @@ -17,15 +18,31 @@ import ( type ContractCreator[T any] func(context.Context, contractMetrics.ContractMetricer, common.Address, *batching.MultiCaller) (T, error) +func Interruptible(action cli.ActionFunc) cli.ActionFunc { + return func(ctx *cli.Context) error { + ctx.Context = ctxinterrupt.WithCancelOnInterrupt(ctx.Context) + return action(ctx) + } +} +func AddrFromFlag(flagName string) func(ctx *cli.Context) (common.Address, error) { + return func(ctx *cli.Context) (common.Address, error) { + gameAddr, err := opservice.ParseAddress(ctx.String(flagName)) + if err != nil { + return common.Address{}, err + } + return gameAddr, nil + } +} + // 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) { +func NewContractWithTxMgr[T any](ctx *cli.Context, getAddr func(ctx *cli.Context) (common.Address, error), creator ContractCreator[T]) (T, txmgr.TxManager, error) { var contract T caller, txMgr, err := newClientsFromCLI(ctx) if err != nil { return contract, nil, err } - created, err := newContractFromCLI(ctx, flagName, caller, creator) + created, err := newContractFromCLI(ctx, getAddr, caller, creator) if err != nil { return contract, nil, err } @@ -34,9 +51,9 @@ func NewContractWithTxMgr[T any](ctx *cli.Context, flagName string, creator Cont } // newContractFromCLI creates a new contract from the CLI context. -func newContractFromCLI[T any](ctx *cli.Context, flagName string, caller *batching.MultiCaller, creator ContractCreator[T]) (T, error) { +func newContractFromCLI[T any](ctx *cli.Context, getAddr func(ctx *cli.Context) (common.Address, error), caller *batching.MultiCaller, creator ContractCreator[T]) (T, error) { var contract T - gameAddr, err := opservice.ParseAddress(ctx.String(flagName)) + gameAddr, err := getAddr(ctx) if err != nil { return contract, err } @@ -74,5 +91,6 @@ func newClientsFromCLI(ctx *cli.Context) (*batching.MultiCaller, txmgr.TxManager return nil, nil, fmt.Errorf("failed to create the transaction manager: %w", err) } + logger.Info("Configured transaction manager", "sender", txMgr.From()) return caller, txMgr, nil } diff --git a/op-challenger/config/config.go b/op-challenger/config/config.go index 3fd2dea804cc..e8a245936f33 100644 --- a/op-challenger/config/config.go +++ b/op-challenger/config/config.go @@ -8,12 +8,13 @@ import ( "slices" "time" - "github.com/ethereum/go-ethereum/common" - + "github.com/ethereum-optimism/optimism/op-challenger/game/fault/trace/vm" + "github.com/ethereum-optimism/optimism/op-challenger/game/fault/types" "github.com/ethereum-optimism/optimism/op-node/chaincfg" opmetrics "github.com/ethereum-optimism/optimism/op-service/metrics" "github.com/ethereum-optimism/optimism/op-service/oppprof" "github.com/ethereum-optimism/optimism/op-service/txmgr" + "github.com/ethereum/go-ethereum/common" ) var ( @@ -50,44 +51,6 @@ var ( ErrAsteriscNetworkUnknown = errors.New("unknown asterisc network") ) -type TraceType string - -const ( - TraceTypeAlphabet TraceType = "alphabet" - TraceTypeCannon TraceType = "cannon" - TraceTypeAsterisc TraceType = "asterisc" - TraceTypePermissioned TraceType = "permissioned" -) - -var TraceTypes = []TraceType{TraceTypeAlphabet, TraceTypeCannon, TraceTypePermissioned, TraceTypeAsterisc} - -func (t TraceType) String() string { - return string(t) -} - -// Set implements the Set method required by the [cli.Generic] interface. -func (t *TraceType) Set(value string) error { - if !ValidTraceType(TraceType(value)) { - return fmt.Errorf("unknown trace type: %q", value) - } - *t = TraceType(value) - return nil -} - -func (t *TraceType) Clone() any { - cpy := *t - return &cpy -} - -func ValidTraceType(value TraceType) bool { - for _, t := range TraceTypes { - if t == value { - return true - } - } - return false -} - const ( DefaultPollInterval = time.Second * 12 DefaultCannonSnapshotFreq = uint(1_000_000_000) @@ -96,9 +59,10 @@ const ( 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 ) @@ -120,33 +84,24 @@ type Config struct { SelectiveClaimResolution bool // Whether to only resolve claims for the claimants in AdditionalBondClaimants union [TxSender.From()] - TraceTypes []TraceType // Type of traces supported + TraceTypes []types.TraceType // Type of traces supported 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 + Cannon vm.Config 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) + Asterisc vm.Config + 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 + AsteriscKona vm.Config + AsteriscKonaAbsolutePreState string // File to load the absolute pre-state for AsteriscKona traces from + AsteriscKonaAbsolutePreStateBaseURL *url.URL // Base URL to retrieve absolute pre-states for AsteriscKona traces from MaxPendingTx uint64 // Maximum number of pending transactions (0 == no limit) @@ -162,7 +117,7 @@ func NewConfig( l2RollupRpc string, l2EthRpc string, datadir string, - supportedTraceTypes ...TraceType, + supportedTraceTypes ...types.TraceType, ) Config { return Config{ L1EthRpc: l1EthRpc, @@ -183,15 +138,37 @@ func NewConfig( Datadir: datadir, - CannonSnapshotFreq: DefaultCannonSnapshotFreq, - CannonInfoFreq: DefaultCannonInfoFreq, - AsteriscSnapshotFreq: DefaultAsteriscSnapshotFreq, - AsteriscInfoFreq: DefaultAsteriscInfoFreq, - GameWindow: DefaultGameWindow, + Cannon: vm.Config{ + VmType: types.TraceTypeCannon, + L1: l1EthRpc, + L1Beacon: l1BeaconApi, + L2: l2EthRpc, + SnapshotFreq: DefaultCannonSnapshotFreq, + InfoFreq: DefaultCannonInfoFreq, + DebugInfo: true, + BinarySnapshots: true, + }, + Asterisc: vm.Config{ + VmType: types.TraceTypeAsterisc, + L1: l1EthRpc, + L1Beacon: l1BeaconApi, + L2: l2EthRpc, + SnapshotFreq: DefaultAsteriscSnapshotFreq, + InfoFreq: DefaultAsteriscInfoFreq, + }, + AsteriscKona: vm.Config{ + VmType: types.TraceTypeAsteriscKona, + L1: l1EthRpc, + L1Beacon: l1BeaconApi, + L2: l2EthRpc, + SnapshotFreq: DefaultAsteriscSnapshotFreq, + InfoFreq: DefaultAsteriscInfoFreq, + }, + GameWindow: DefaultGameWindow, } } -func (c Config) TraceTypeEnabled(t TraceType) bool { +func (c Config) TraceTypeEnabled(t types.TraceType) bool { return slices.Contains(c.TraceTypes, t) } @@ -220,29 +197,29 @@ func (c Config) Check() error { if c.MaxConcurrency == 0 { return ErrMaxConcurrencyZero } - if c.TraceTypeEnabled(TraceTypeCannon) || c.TraceTypeEnabled(TraceTypePermissioned) { - if c.CannonBin == "" { + if c.TraceTypeEnabled(types.TraceTypeCannon) || c.TraceTypeEnabled(types.TraceTypePermissioned) { + if c.Cannon.VmBin == "" { return ErrMissingCannonBin } - if c.CannonServer == "" { + if c.Cannon.Server == "" { return ErrMissingCannonServer } - if c.CannonNetwork == "" { - if c.CannonRollupConfigPath == "" { + if c.Cannon.Network == "" { + if c.Cannon.RollupConfigPath == "" { return ErrMissingCannonRollupConfig } - if c.CannonL2GenesisPath == "" { + if c.Cannon.L2GenesisPath == "" { return ErrMissingCannonL2Genesis } } else { - if c.CannonRollupConfigPath != "" { + if c.Cannon.RollupConfigPath != "" { return ErrCannonNetworkAndRollupConfig } - if c.CannonL2GenesisPath != "" { + if c.Cannon.L2GenesisPath != "" { return ErrCannonNetworkAndL2Genesis } - if ch := chaincfg.ChainByName(c.CannonNetwork); ch == nil { - return fmt.Errorf("%w: %v", ErrCannonNetworkUnknown, c.CannonNetwork) + if ch := chaincfg.ChainByName(c.Cannon.Network); ch == nil { + return fmt.Errorf("%w: %v", ErrCannonNetworkUnknown, c.Cannon.Network) } } if c.CannonAbsolutePreState == "" && c.CannonAbsolutePreStateBaseURL == nil { @@ -251,36 +228,36 @@ func (c Config) Check() error { if c.CannonAbsolutePreState != "" && c.CannonAbsolutePreStateBaseURL != nil { return ErrCannonAbsolutePreStateAndBaseURL } - if c.CannonSnapshotFreq == 0 { + if c.Cannon.SnapshotFreq == 0 { return ErrMissingCannonSnapshotFreq } - if c.CannonInfoFreq == 0 { + if c.Cannon.InfoFreq == 0 { return ErrMissingCannonInfoFreq } } - if c.TraceTypeEnabled(TraceTypeAsterisc) { - if c.AsteriscBin == "" { + if c.TraceTypeEnabled(types.TraceTypeAsterisc) { + if c.Asterisc.VmBin == "" { return ErrMissingAsteriscBin } - if c.AsteriscServer == "" { + if c.Asterisc.Server == "" { return ErrMissingAsteriscServer } - if c.AsteriscNetwork == "" { - if c.AsteriscRollupConfigPath == "" { + if c.Asterisc.Network == "" { + if c.Asterisc.RollupConfigPath == "" { return ErrMissingAsteriscRollupConfig } - if c.AsteriscL2GenesisPath == "" { + if c.Asterisc.L2GenesisPath == "" { return ErrMissingAsteriscL2Genesis } } else { - if c.AsteriscRollupConfigPath != "" { + if c.Asterisc.RollupConfigPath != "" { return ErrAsteriscNetworkAndRollupConfig } - if c.AsteriscL2GenesisPath != "" { + if c.Asterisc.L2GenesisPath != "" { return ErrAsteriscNetworkAndL2Genesis } - if ch := chaincfg.ChainByName(c.AsteriscNetwork); ch == nil { - return fmt.Errorf("%w: %v", ErrAsteriscNetworkUnknown, c.AsteriscNetwork) + if ch := chaincfg.ChainByName(c.Asterisc.Network); ch == nil { + return fmt.Errorf("%w: %v", ErrAsteriscNetworkUnknown, c.Asterisc.Network) } } if c.AsteriscAbsolutePreState == "" && c.AsteriscAbsolutePreStateBaseURL == nil { @@ -289,10 +266,10 @@ func (c Config) Check() error { if c.AsteriscAbsolutePreState != "" && c.AsteriscAbsolutePreStateBaseURL != nil { return ErrAsteriscAbsolutePreStateAndBaseURL } - if c.AsteriscSnapshotFreq == 0 { + if c.Asterisc.SnapshotFreq == 0 { return ErrMissingAsteriscSnapshotFreq } - if c.AsteriscInfoFreq == 0 { + if c.Asterisc.InfoFreq == 0 { return ErrMissingAsteriscInfoFreq } } diff --git a/op-challenger/config/config_test.go b/op-challenger/config/config_test.go index dc2949e41d20..4181fd069bed 100644 --- a/op-challenger/config/config_test.go +++ b/op-challenger/config/config_test.go @@ -9,52 +9,53 @@ import ( "github.com/ethereum/go-ethereum/common" "github.com/stretchr/testify/require" + "github.com/ethereum-optimism/optimism/op-challenger/game/fault/types" "github.com/ethereum-optimism/optimism/op-service/txmgr" ) 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" - 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/") + validL1EthRpc = "http://localhost:8545" + validL1BeaconUrl = "http://localhost:9000" + validGameFactoryAddress = common.Address{0x23} + validCannonBin = "./bin/cannon" + validCannonOpProgramBin = "./bin/op-program" + validCannonNetwork = "mainnet" + validCannonAbsolutePreState = "pre.json" + validCannonAbsolutePreStateBaseURL, _ = 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" + validAsteriscAbsolutePreState = "pre.json" + validAsteriscAbsolutePreStateBaseURL, _ = url.Parse("http://localhost/bar/") ) -var cannonTraceTypes = []TraceType{TraceTypeCannon, TraceTypePermissioned} -var asteriscTraceTypes = []TraceType{TraceTypeAsterisc} +var cannonTraceTypes = []types.TraceType{types.TraceTypeCannon, types.TraceTypePermissioned} +var asteriscTraceTypes = []types.TraceType{types.TraceTypeAsterisc} func applyValidConfigForCannon(cfg *Config) { - cfg.CannonBin = validCannonBin - cfg.CannonServer = validCannonOpProgramBin - cfg.CannonAbsolutePreStateBaseURL = validCannonAbsolutPreStateBaseURL - cfg.CannonNetwork = validCannonNetwork + cfg.Cannon.VmBin = validCannonBin + cfg.Cannon.Server = validCannonOpProgramBin + cfg.CannonAbsolutePreStateBaseURL = validCannonAbsolutePreStateBaseURL + cfg.Cannon.Network = validCannonNetwork } func applyValidConfigForAsterisc(cfg *Config) { - cfg.AsteriscBin = validAsteriscBin - cfg.AsteriscServer = validAsteriscOpProgramBin - cfg.AsteriscAbsolutePreStateBaseURL = validAsteriscAbsolutPreStateBaseURL - cfg.AsteriscNetwork = validAsteriscNetwork + cfg.Asterisc.VmBin = validAsteriscBin + cfg.Asterisc.Server = validAsteriscOpProgramBin + cfg.AsteriscAbsolutePreStateBaseURL = validAsteriscAbsolutePreStateBaseURL + cfg.Asterisc.Network = validAsteriscNetwork } -func validConfig(traceType TraceType) Config { +func validConfig(traceType types.TraceType) Config { cfg := NewConfig(validGameFactoryAddress, validL1EthRpc, validL1BeaconUrl, validRollupRpc, validL2Rpc, validDatadir, traceType) - if traceType == TraceTypeCannon || traceType == TraceTypePermissioned { + if traceType == types.TraceTypeCannon || traceType == types.TraceTypePermissioned { applyValidConfigForCannon(&cfg) } - if traceType == TraceTypeAsterisc { + if traceType == types.TraceTypeAsterisc { applyValidConfigForAsterisc(&cfg) } return cfg @@ -62,7 +63,7 @@ func validConfig(traceType TraceType) Config { // TestValidConfigIsValid checks that the config provided by validConfig is actually valid func TestValidConfigIsValid(t *testing.T) { - for _, traceType := range TraceTypes { + for _, traceType := range types.TraceTypes { traceType := traceType t.Run(traceType.String(), func(t *testing.T) { err := validConfig(traceType).Check() @@ -73,38 +74,38 @@ func TestValidConfigIsValid(t *testing.T) { func TestTxMgrConfig(t *testing.T) { t.Run("Invalid", func(t *testing.T) { - config := validConfig(TraceTypeCannon) + config := validConfig(types.TraceTypeCannon) config.TxMgrConfig = txmgr.CLIConfig{} require.Equal(t, config.Check().Error(), "must provide a L1 RPC url") }) } func TestL1EthRpcRequired(t *testing.T) { - config := validConfig(TraceTypeCannon) + config := validConfig(types.TraceTypeCannon) config.L1EthRpc = "" require.ErrorIs(t, config.Check(), ErrMissingL1EthRPC) } func TestL1BeaconRequired(t *testing.T) { - config := validConfig(TraceTypeCannon) + config := validConfig(types.TraceTypeCannon) config.L1Beacon = "" require.ErrorIs(t, config.Check(), ErrMissingL1Beacon) } func TestGameFactoryAddressRequired(t *testing.T) { - config := validConfig(TraceTypeCannon) + config := validConfig(types.TraceTypeCannon) config.GameFactoryAddress = common.Address{} require.ErrorIs(t, config.Check(), ErrMissingGameFactoryAddress) } func TestSelectiveClaimResolutionNotRequired(t *testing.T) { - config := validConfig(TraceTypeCannon) + config := validConfig(types.TraceTypeCannon) require.Equal(t, false, config.SelectiveClaimResolution) require.NoError(t, config.Check()) } func TestGameAllowlistNotRequired(t *testing.T) { - config := validConfig(TraceTypeCannon) + config := validConfig(types.TraceTypeCannon) config.GameAllowlist = []common.Address{} require.NoError(t, config.Check()) } @@ -115,13 +116,13 @@ func TestCannonRequiredArgs(t *testing.T) { t.Run(fmt.Sprintf("TestCannonBinRequired-%v", traceType), func(t *testing.T) { config := validConfig(traceType) - config.CannonBin = "" + config.Cannon.VmBin = "" require.ErrorIs(t, config.Check(), ErrMissingCannonBin) }) t.Run(fmt.Sprintf("TestCannonServerRequired-%v", traceType), func(t *testing.T) { config := validConfig(traceType) - config.CannonServer = "" + config.Cannon.Server = "" require.ErrorIs(t, config.Check(), ErrMissingCannonServer) }) @@ -134,7 +135,7 @@ func TestCannonRequiredArgs(t *testing.T) { t.Run(fmt.Sprintf("TestCannonAbsolutePreState-%v", traceType), func(t *testing.T) { config := validConfig(traceType) - config.CannonAbsolutePreState = validCannonAbsolutPreState + config.CannonAbsolutePreState = validCannonAbsolutePreState config.CannonAbsolutePreStateBaseURL = nil require.NoError(t, config.Check()) }) @@ -142,14 +143,14 @@ func TestCannonRequiredArgs(t *testing.T) { t.Run(fmt.Sprintf("TestCannonAbsolutePreStateBaseURL-%v", traceType), func(t *testing.T) { config := validConfig(traceType) config.CannonAbsolutePreState = "" - config.CannonAbsolutePreStateBaseURL = validCannonAbsolutPreStateBaseURL + config.CannonAbsolutePreStateBaseURL = validCannonAbsolutePreStateBaseURL 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 + config.CannonAbsolutePreState = validCannonAbsolutePreState + config.CannonAbsolutePreStateBaseURL = validCannonAbsolutePreStateBaseURL require.ErrorIs(t, config.Check(), ErrCannonAbsolutePreStateAndBaseURL) }) @@ -162,7 +163,7 @@ func TestCannonRequiredArgs(t *testing.T) { t.Run(fmt.Sprintf("TestCannonSnapshotFreq-%v", traceType), func(t *testing.T) { t.Run("MustNotBeZero", func(t *testing.T) { cfg := validConfig(traceType) - cfg.CannonSnapshotFreq = 0 + cfg.Cannon.SnapshotFreq = 0 require.ErrorIs(t, cfg.Check(), ErrMissingCannonSnapshotFreq) }) }) @@ -170,48 +171,53 @@ func TestCannonRequiredArgs(t *testing.T) { t.Run(fmt.Sprintf("TestCannonInfoFreq-%v", traceType), func(t *testing.T) { t.Run("MustNotBeZero", func(t *testing.T) { cfg := validConfig(traceType) - cfg.CannonInfoFreq = 0 + cfg.Cannon.InfoFreq = 0 require.ErrorIs(t, cfg.Check(), ErrMissingCannonInfoFreq) }) }) t.Run(fmt.Sprintf("TestCannonNetworkOrRollupConfigRequired-%v", traceType), func(t *testing.T) { cfg := validConfig(traceType) - cfg.CannonNetwork = "" - cfg.CannonRollupConfigPath = "" - cfg.CannonL2GenesisPath = "genesis.json" + cfg.Cannon.Network = "" + cfg.Cannon.RollupConfigPath = "" + cfg.Cannon.L2GenesisPath = "genesis.json" require.ErrorIs(t, cfg.Check(), ErrMissingCannonRollupConfig) }) t.Run(fmt.Sprintf("TestCannonNetworkOrL2GenesisRequired-%v", traceType), func(t *testing.T) { cfg := validConfig(traceType) - cfg.CannonNetwork = "" - cfg.CannonRollupConfigPath = "foo.json" - cfg.CannonL2GenesisPath = "" + cfg.Cannon.Network = "" + cfg.Cannon.RollupConfigPath = "foo.json" + cfg.Cannon.L2GenesisPath = "" require.ErrorIs(t, cfg.Check(), ErrMissingCannonL2Genesis) }) t.Run(fmt.Sprintf("TestMustNotSpecifyNetworkAndRollup-%v", traceType), func(t *testing.T) { cfg := validConfig(traceType) - cfg.CannonNetwork = validCannonNetwork - cfg.CannonRollupConfigPath = "foo.json" - cfg.CannonL2GenesisPath = "" + cfg.Cannon.Network = validCannonNetwork + cfg.Cannon.RollupConfigPath = "foo.json" + cfg.Cannon.L2GenesisPath = "" require.ErrorIs(t, cfg.Check(), ErrCannonNetworkAndRollupConfig) }) t.Run(fmt.Sprintf("TestMustNotSpecifyNetworkAndL2Genesis-%v", traceType), func(t *testing.T) { cfg := validConfig(traceType) - cfg.CannonNetwork = validCannonNetwork - cfg.CannonRollupConfigPath = "" - cfg.CannonL2GenesisPath = "foo.json" + cfg.Cannon.Network = validCannonNetwork + cfg.Cannon.RollupConfigPath = "" + cfg.Cannon.L2GenesisPath = "foo.json" require.ErrorIs(t, cfg.Check(), ErrCannonNetworkAndL2Genesis) }) t.Run(fmt.Sprintf("TestNetworkMustBeValid-%v", traceType), func(t *testing.T) { cfg := validConfig(traceType) - cfg.CannonNetwork = "unknown" + cfg.Cannon.Network = "unknown" require.ErrorIs(t, cfg.Check(), ErrCannonNetworkUnknown) }) + + t.Run(fmt.Sprintf("TestDebugInfoEnabled-%v", traceType), func(t *testing.T) { + cfg := validConfig(traceType) + require.True(t, cfg.Cannon.DebugInfo) + }) } } @@ -221,13 +227,13 @@ func TestAsteriscRequiredArgs(t *testing.T) { t.Run(fmt.Sprintf("TestAsteriscBinRequired-%v", traceType), func(t *testing.T) { config := validConfig(traceType) - config.AsteriscBin = "" + config.Asterisc.VmBin = "" require.ErrorIs(t, config.Check(), ErrMissingAsteriscBin) }) t.Run(fmt.Sprintf("TestAsteriscServerRequired-%v", traceType), func(t *testing.T) { config := validConfig(traceType) - config.AsteriscServer = "" + config.Asterisc.Server = "" require.ErrorIs(t, config.Check(), ErrMissingAsteriscServer) }) @@ -240,7 +246,7 @@ func TestAsteriscRequiredArgs(t *testing.T) { t.Run(fmt.Sprintf("TestAsteriscAbsolutePreState-%v", traceType), func(t *testing.T) { config := validConfig(traceType) - config.AsteriscAbsolutePreState = validAsteriscAbsolutPreState + config.AsteriscAbsolutePreState = validAsteriscAbsolutePreState config.AsteriscAbsolutePreStateBaseURL = nil require.NoError(t, config.Check()) }) @@ -248,14 +254,14 @@ func TestAsteriscRequiredArgs(t *testing.T) { t.Run(fmt.Sprintf("TestAsteriscAbsolutePreStateBaseURL-%v", traceType), func(t *testing.T) { config := validConfig(traceType) config.AsteriscAbsolutePreState = "" - config.AsteriscAbsolutePreStateBaseURL = validAsteriscAbsolutPreStateBaseURL + config.AsteriscAbsolutePreStateBaseURL = validAsteriscAbsolutePreStateBaseURL 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 + config.AsteriscAbsolutePreState = validAsteriscAbsolutePreState + config.AsteriscAbsolutePreStateBaseURL = validAsteriscAbsolutePreStateBaseURL require.ErrorIs(t, config.Check(), ErrAsteriscAbsolutePreStateAndBaseURL) }) @@ -268,7 +274,7 @@ func TestAsteriscRequiredArgs(t *testing.T) { t.Run(fmt.Sprintf("TestAsteriscSnapshotFreq-%v", traceType), func(t *testing.T) { t.Run("MustNotBeZero", func(t *testing.T) { cfg := validConfig(traceType) - cfg.AsteriscSnapshotFreq = 0 + cfg.Asterisc.SnapshotFreq = 0 require.ErrorIs(t, cfg.Check(), ErrMissingAsteriscSnapshotFreq) }) }) @@ -276,79 +282,84 @@ func TestAsteriscRequiredArgs(t *testing.T) { t.Run(fmt.Sprintf("TestAsteriscInfoFreq-%v", traceType), func(t *testing.T) { t.Run("MustNotBeZero", func(t *testing.T) { cfg := validConfig(traceType) - cfg.AsteriscInfoFreq = 0 + cfg.Asterisc.InfoFreq = 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" + cfg.Asterisc.Network = "" + cfg.Asterisc.RollupConfigPath = "" + cfg.Asterisc.L2GenesisPath = "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 = "" + cfg.Asterisc.Network = "" + cfg.Asterisc.RollupConfigPath = "foo.json" + cfg.Asterisc.L2GenesisPath = "" 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 = "" + cfg.Asterisc.Network = validAsteriscNetwork + cfg.Asterisc.RollupConfigPath = "foo.json" + cfg.Asterisc.L2GenesisPath = "" 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" + cfg.Asterisc.Network = validAsteriscNetwork + cfg.Asterisc.RollupConfigPath = "" + cfg.Asterisc.L2GenesisPath = "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" + cfg.Asterisc.Network = "unknown" require.ErrorIs(t, cfg.Check(), ErrAsteriscNetworkUnknown) }) + + t.Run(fmt.Sprintf("TestDebugInfoDisabled-%v", traceType), func(t *testing.T) { + cfg := validConfig(traceType) + require.False(t, cfg.Asterisc.DebugInfo) + }) } } func TestDatadirRequired(t *testing.T) { - config := validConfig(TraceTypeAlphabet) + config := validConfig(types.TraceTypeAlphabet) config.Datadir = "" require.ErrorIs(t, config.Check(), ErrMissingDatadir) } func TestMaxConcurrency(t *testing.T) { t.Run("Required", func(t *testing.T) { - config := validConfig(TraceTypeAlphabet) + config := validConfig(types.TraceTypeAlphabet) config.MaxConcurrency = 0 require.ErrorIs(t, config.Check(), ErrMaxConcurrencyZero) }) t.Run("DefaultToNumberOfCPUs", func(t *testing.T) { - config := validConfig(TraceTypeAlphabet) + config := validConfig(types.TraceTypeAlphabet) require.EqualValues(t, runtime.NumCPU(), config.MaxConcurrency) }) } func TestHttpPollInterval(t *testing.T) { t.Run("Default", func(t *testing.T) { - config := validConfig(TraceTypeAlphabet) + config := validConfig(types.TraceTypeAlphabet) require.EqualValues(t, DefaultPollInterval, config.PollInterval) }) } func TestRollupRpcRequired(t *testing.T) { - for _, traceType := range TraceTypes { + for _, traceType := range types.TraceTypes { traceType := traceType t.Run(traceType.String(), func(t *testing.T) { config := validConfig(traceType) @@ -359,8 +370,8 @@ func TestRollupRpcRequired(t *testing.T) { } func TestRequireConfigForMultipleTraceTypesForCannon(t *testing.T) { - cfg := validConfig(TraceTypeCannon) - cfg.TraceTypes = []TraceType{TraceTypeCannon, TraceTypeAlphabet} + cfg := validConfig(types.TraceTypeCannon) + cfg.TraceTypes = []types.TraceType{types.TraceTypeCannon, types.TraceTypeAlphabet} // Set all required options and check its valid cfg.RollupRpc = validRollupRpc require.NoError(t, cfg.Check()) @@ -369,7 +380,7 @@ func TestRequireConfigForMultipleTraceTypesForCannon(t *testing.T) { cfg.CannonAbsolutePreState = "" cfg.CannonAbsolutePreStateBaseURL = nil require.ErrorIs(t, cfg.Check(), ErrMissingCannonAbsolutePreState) - cfg.CannonAbsolutePreState = validCannonAbsolutPreState + cfg.CannonAbsolutePreState = validCannonAbsolutePreState // Require output cannon specific args cfg.RollupRpc = "" @@ -377,8 +388,8 @@ func TestRequireConfigForMultipleTraceTypesForCannon(t *testing.T) { } func TestRequireConfigForMultipleTraceTypesForAsterisc(t *testing.T) { - cfg := validConfig(TraceTypeAsterisc) - cfg.TraceTypes = []TraceType{TraceTypeAsterisc, TraceTypeAlphabet} + cfg := validConfig(types.TraceTypeAsterisc) + cfg.TraceTypes = []types.TraceType{types.TraceTypeAsterisc, types.TraceTypeAlphabet} // Set all required options and check its valid cfg.RollupRpc = validRollupRpc require.NoError(t, cfg.Check()) @@ -387,7 +398,7 @@ func TestRequireConfigForMultipleTraceTypesForAsterisc(t *testing.T) { cfg.AsteriscAbsolutePreState = "" cfg.AsteriscAbsolutePreStateBaseURL = nil require.ErrorIs(t, cfg.Check(), ErrMissingAsteriscAbsolutePreState) - cfg.AsteriscAbsolutePreState = validAsteriscAbsolutPreState + cfg.AsteriscAbsolutePreState = validAsteriscAbsolutePreState // Require output asterisc specific args cfg.RollupRpc = "" @@ -395,29 +406,29 @@ func TestRequireConfigForMultipleTraceTypesForAsterisc(t *testing.T) { } func TestRequireConfigForMultipleTraceTypesForCannonAndAsterisc(t *testing.T) { - cfg := validConfig(TraceTypeCannon) + cfg := validConfig(types.TraceTypeCannon) applyValidConfigForAsterisc(&cfg) - cfg.TraceTypes = []TraceType{TraceTypeCannon, TraceTypeAsterisc, TraceTypeAlphabet} + cfg.TraceTypes = []types.TraceType{types.TraceTypeCannon, types.TraceTypeAsterisc, types.TraceTypeAlphabet, types.TraceTypeFast} // Set all required options and check its valid cfg.RollupRpc = validRollupRpc require.NoError(t, cfg.Check()) // Require cannon specific args - cfg.CannonBin = "" + cfg.Cannon.VmBin = "" require.ErrorIs(t, cfg.Check(), ErrMissingCannonBin) - cfg.CannonBin = validCannonBin + cfg.Cannon.VmBin = validCannonBin // Require asterisc specific args cfg.AsteriscAbsolutePreState = "" cfg.AsteriscAbsolutePreStateBaseURL = nil require.ErrorIs(t, cfg.Check(), ErrMissingAsteriscAbsolutePreState) - cfg.AsteriscAbsolutePreState = validAsteriscAbsolutPreState + cfg.AsteriscAbsolutePreState = validAsteriscAbsolutePreState // Require cannon specific args - cfg.AsteriscServer = "" + cfg.Asterisc.Server = "" require.ErrorIs(t, cfg.Check(), ErrMissingAsteriscServer) - cfg.AsteriscServer = validAsteriscOpProgramBin + cfg.Asterisc.Server = 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 2ff53840623d..38e59d350cec 100644 --- a/op-challenger/flags/flags.go +++ b/op-challenger/flags/flags.go @@ -7,6 +7,10 @@ import ( "slices" "strings" + "github.com/ethereum-optimism/optimism/op-challenger/game/fault/trace/vm" + "github.com/ethereum-optimism/optimism/op-challenger/game/fault/types" + "github.com/ethereum-optimism/optimism/op-service/flags" + "github.com/ethereum-optimism/superchain-registry/superchain" "github.com/ethereum/go-ethereum/common" "github.com/ethereum/go-ethereum/log" "github.com/urfave/cli/v2" @@ -44,6 +48,7 @@ var ( Usage: "HTTP provider URL for the rollup node", EnvVars: prefixEnvVars("ROLLUP_RPC"), } + NetworkFlag = flags.CLINetworkFlag(EnvVarPrefix, "") FactoryAddressFlag = &cli.StringFlag{ Name: "game-factory-address", Usage: "Address of the fault game factory contract.", @@ -57,9 +62,9 @@ var ( } TraceTypeFlag = &cli.StringSliceFlag{ Name: "trace-type", - Usage: "The trace types to support. Valid options: " + openum.EnumString(config.TraceTypes), + Usage: "The trace types to support. Valid options: " + openum.EnumString(types.TraceTypes), EnvVars: prefixEnvVars("TRACE_TYPE"), - Value: cli.NewStringSlice(config.TraceTypeCannon.String()), + Value: cli.NewStringSlice(types.TraceTypeCannon.String()), } DatadirFlag = &cli.StringFlag{ Name: "datadir", @@ -96,11 +101,8 @@ var ( EnvVars: prefixEnvVars("ADDITIONAL_BOND_CLAIMANTS"), } CannonNetworkFlag = &cli.StringFlag{ - Name: "cannon-network", - Usage: fmt.Sprintf( - "Predefined network selection. Available networks: %s (cannon trace type only)", - strings.Join(chaincfg.AvailableNetworks(), ", "), - ), + Name: "cannon-network", + Usage: fmt.Sprintf("Deprecated: Use %v instead", flags.NetworkFlagName), EnvVars: prefixEnvVars("CANNON_NETWORK"), } CannonRollupConfigFlag = &cli.StringFlag{ @@ -152,11 +154,8 @@ var ( 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(), ", "), - ), + Name: "asterisc-network", + Usage: fmt.Sprintf("Deprecated: Use %v instead", flags.NetworkFlagName), EnvVars: prefixEnvVars("ASTERISC_NETWORK"), } AsteriscRollupConfigFlag = &cli.StringFlag{ @@ -179,17 +178,33 @@ var ( Usage: "Path to executable to use as pre-image oracle server when generating trace data (asterisc trace type only)", EnvVars: prefixEnvVars("ASTERISC_SERVER"), } + AsteriscKonaServerFlag = &cli.StringFlag{ + Name: "asterisc-kona-server", + Usage: "Path to kona executable to use as pre-image oracle server when generating trace data (asterisc-kona trace type only)", + EnvVars: prefixEnvVars("ASTERISC_KONA_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"), } + AsteriscKonaPreStateFlag = &cli.StringFlag{ + Name: "asterisc-kona-prestate", + Usage: "Path to absolute prestate to use when generating trace data (asterisc-kona trace type only)", + EnvVars: prefixEnvVars("ASTERISC_KONA_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"), } + AsteriscKonaPreStatesURLFlag = &cli.StringFlag{ + Name: "asterisc-kona-prestates-url", + Usage: "Base URL to absolute prestates to use when generating trace data. " + + "Prestates in this directory should be name as .json (asterisc-kona trace type only)", + EnvVars: prefixEnvVars("ASTERISC_KONA_PRESTATES_URL"), + } AsteriscSnapshotFreqFlag = &cli.UintFlag{ Name: "asterisc-snapshot-freq", Usage: "Frequency of asterisc snapshots to generate in VM steps (asterisc trace type only)", @@ -225,7 +240,6 @@ var ( // requiredFlags are checked by [CheckRequired] var requiredFlags = []cli.Flag{ L1EthRpcFlag, - FactoryAddressFlag, DatadirFlag, RollupRpcFlag, L1BeaconFlag, @@ -233,6 +247,8 @@ var requiredFlags = []cli.Flag{ // optionalFlags is a list of unchecked cli flags var optionalFlags = []cli.Flag{ + NetworkFlag, + FactoryAddressFlag, TraceTypeFlag, MaxConcurrencyFlag, L2EthRpcFlag, @@ -255,8 +271,11 @@ var optionalFlags = []cli.Flag{ AsteriscL2GenesisFlag, AsteriscBinFlag, AsteriscServerFlag, + AsteriscKonaServerFlag, AsteriscPreStateFlag, + AsteriscKonaPreStateFlag, AsteriscPreStatesURLFlag, + AsteriscKonaPreStatesURLFlag, AsteriscSnapshotFreqFlag, AsteriscInfoFreqFlag, GameWindowFlag, @@ -277,10 +296,19 @@ func init() { var Flags []cli.Flag func CheckCannonFlags(ctx *cli.Context) error { + if ctx.IsSet(CannonNetworkFlag.Name) && ctx.IsSet(flags.NetworkFlagName) { + return fmt.Errorf("flag %v can not be used with %v", CannonNetworkFlag.Name, flags.NetworkFlagName) + } if !ctx.IsSet(CannonNetworkFlag.Name) && + !ctx.IsSet(flags.NetworkFlagName) && !(ctx.IsSet(CannonRollupConfigFlag.Name) && ctx.IsSet(CannonL2GenesisFlag.Name)) { - return fmt.Errorf("flag %v or %v and %v is required", - CannonNetworkFlag.Name, CannonRollupConfigFlag.Name, CannonL2GenesisFlag.Name) + return fmt.Errorf("flag %v, %v or %v and %v is required", + CannonNetworkFlag.Name, flags.NetworkFlagName, CannonRollupConfigFlag.Name, CannonL2GenesisFlag.Name) + } + if ctx.IsSet(flags.NetworkFlagName) && + (ctx.IsSet(CannonRollupConfigFlag.Name) || ctx.IsSet(CannonL2GenesisFlag.Name)) { + return fmt.Errorf("flag %v can not be used with %v and %v", + flags.NetworkFlagName, CannonRollupConfigFlag.Name, CannonL2GenesisFlag.Name) } if ctx.IsSet(CannonNetworkFlag.Name) && (ctx.IsSet(CannonRollupConfigFlag.Name) || ctx.IsSet(CannonL2GenesisFlag.Name)) { @@ -299,11 +327,20 @@ func CheckCannonFlags(ctx *cli.Context) error { return nil } -func CheckAsteriscFlags(ctx *cli.Context) error { +func CheckAsteriscBaseFlags(ctx *cli.Context) error { + if ctx.IsSet(AsteriscNetworkFlag.Name) && ctx.IsSet(flags.NetworkFlagName) { + return fmt.Errorf("flag %v can not be used with %v", AsteriscNetworkFlag.Name, flags.NetworkFlagName) + } if !ctx.IsSet(AsteriscNetworkFlag.Name) && + !ctx.IsSet(flags.NetworkFlagName) && !(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) + return fmt.Errorf("flag %v, %v or %v and %v is required", + AsteriscNetworkFlag.Name, flags.NetworkFlagName, AsteriscRollupConfigFlag.Name, AsteriscL2GenesisFlag.Name) + } + if ctx.IsSet(flags.NetworkFlagName) && + (ctx.IsSet(AsteriscRollupConfigFlag.Name) || ctx.IsSet(AsteriscL2GenesisFlag.Name)) { + return fmt.Errorf("flag %v can not be used with %v and %v", + flags.NetworkFlagName, AsteriscRollupConfigFlag.Name, AsteriscL2GenesisFlag.Name) } if ctx.IsSet(AsteriscNetworkFlag.Name) && (ctx.IsSet(AsteriscRollupConfigFlag.Name) || ctx.IsSet(AsteriscL2GenesisFlag.Name)) { @@ -313,6 +350,13 @@ func CheckAsteriscFlags(ctx *cli.Context) error { if !ctx.IsSet(AsteriscBinFlag.Name) { return fmt.Errorf("flag %s is required", AsteriscBinFlag.Name) } + return nil +} + +func CheckAsteriscFlags(ctx *cli.Context) error { + if err := CheckAsteriscBaseFlags(ctx); err != nil { + return err + } if !ctx.IsSet(AsteriscServerFlag.Name) { return fmt.Errorf("flag %s is required", AsteriscServerFlag.Name) } @@ -322,7 +366,20 @@ func CheckAsteriscFlags(ctx *cli.Context) error { return nil } -func CheckRequired(ctx *cli.Context, traceTypes []config.TraceType) error { +func CheckAsteriscKonaFlags(ctx *cli.Context) error { + if err := CheckAsteriscBaseFlags(ctx); err != nil { + return err + } + if !ctx.IsSet(AsteriscKonaServerFlag.Name) { + return fmt.Errorf("flag %s is required", AsteriscKonaServerFlag.Name) + } + if !ctx.IsSet(AsteriscKonaPreStateFlag.Name) && !ctx.IsSet(AsteriscKonaPreStatesURLFlag.Name) { + return fmt.Errorf("flag %s or %s is required", AsteriscKonaPreStatesURLFlag.Name, AsteriscKonaPreStateFlag.Name) + } + return nil +} + +func CheckRequired(ctx *cli.Context, traceTypes []types.TraceType) error { for _, f := range requiredFlags { if !ctx.IsSet(f.Names()[0]) { return fmt.Errorf("flag %s is required", f.Names()[0]) @@ -334,26 +391,30 @@ func CheckRequired(ctx *cli.Context, traceTypes []config.TraceType) error { } for _, traceType := range traceTypes { switch traceType { - case config.TraceTypeCannon, config.TraceTypePermissioned: + case types.TraceTypeCannon, types.TraceTypePermissioned: if err := CheckCannonFlags(ctx); err != nil { return err } - case config.TraceTypeAsterisc: + case types.TraceTypeAsterisc: if err := CheckAsteriscFlags(ctx); err != nil { return err } - case config.TraceTypeAlphabet: + case types.TraceTypeAsteriscKona: + if err := CheckAsteriscKonaFlags(ctx); err != nil { + return err + } + case types.TraceTypeAlphabet, types.TraceTypeFast: default: - return fmt.Errorf("invalid trace type. must be one of %v", config.TraceTypes) + return fmt.Errorf("invalid trace type %v. must be one of %v", traceType, types.TraceTypes) } } return nil } -func parseTraceTypes(ctx *cli.Context) ([]config.TraceType, error) { - var traceTypes []config.TraceType +func parseTraceTypes(ctx *cli.Context) ([]types.TraceType, error) { + var traceTypes []types.TraceType for _, typeName := range ctx.StringSlice(TraceTypeFlag.Name) { - traceType := new(config.TraceType) + traceType := new(types.TraceType) if err := traceType.Set(typeName); err != nil { return nil, err } @@ -379,6 +440,37 @@ func getL2Rpc(ctx *cli.Context, logger log.Logger) (string, error) { return l2Rpc, nil } +func FactoryAddress(ctx *cli.Context) (common.Address, error) { + // Use FactoryAddressFlag in preference to Network. Allows overriding the default dispute game factory. + if ctx.IsSet(FactoryAddressFlag.Name) { + gameFactoryAddress, err := opservice.ParseAddress(ctx.String(FactoryAddressFlag.Name)) + if err != nil { + return common.Address{}, err + } + return gameFactoryAddress, nil + } + if ctx.IsSet(flags.NetworkFlagName) { + chainName := ctx.String(flags.NetworkFlagName) + chainCfg := chaincfg.ChainByName(chainName) + if chainCfg == nil { + var opts []string + for _, cfg := range superchain.OPChains { + opts = append(opts, cfg.Chain+"-"+cfg.Superchain) + } + return common.Address{}, fmt.Errorf("unknown chain: %v (Valid options: %v)", chainName, strings.Join(opts, ", ")) + } + addrs, ok := superchain.Addresses[chainCfg.ChainID] + if !ok { + return common.Address{}, fmt.Errorf("no addresses available for chain %v", chainName) + } + if addrs.DisputeGameFactoryProxy == (superchain.Address{}) { + return common.Address{}, fmt.Errorf("dispute factory proxy not available for chain %v", chainName) + } + return common.Address(addrs.DisputeGameFactoryProxy), nil + } + return common.Address{}, fmt.Errorf("flag %v or %v is required", FactoryAddressFlag.Name, flags.NetworkFlagName) +} + // NewConfigFromCLI parses the Config from the provided flags or environment variables. func NewConfigFromCLI(ctx *cli.Context, logger log.Logger) (*config.Config, error) { traceTypes, err := parseTraceTypes(ctx) @@ -388,7 +480,7 @@ func NewConfigFromCLI(ctx *cli.Context, logger log.Logger) (*config.Config, erro if err := CheckRequired(ctx, traceTypes); err != nil { return nil, err } - gameFactoryAddress, err := opservice.ParseAddress(ctx.String(FactoryAddressFlag.Name)) + gameFactoryAddress, err := FactoryAddress(ctx) if err != nil { return nil, err } @@ -437,47 +529,94 @@ func NewConfigFromCLI(ctx *cli.Context, logger log.Logger) (*config.Config, erro } asteriscPreStatesURL = parsed } + var asteriscKonaPreStatesURL *url.URL + if ctx.IsSet(AsteriscKonaPreStatesURLFlag.Name) { + parsed, err := url.Parse(ctx.String(AsteriscKonaPreStatesURLFlag.Name)) + if err != nil { + return nil, fmt.Errorf("invalid asterisc-kona pre states url (%v): %w", ctx.String(AsteriscKonaPreStatesURLFlag.Name), err) + } + asteriscKonaPreStatesURL = parsed + } l2Rpc, err := getL2Rpc(ctx, logger) if err != nil { return nil, err } + cannonNetwork := ctx.String(CannonNetworkFlag.Name) + if ctx.IsSet(flags.NetworkFlagName) { + cannonNetwork = ctx.String(flags.NetworkFlagName) + } + asteriscNetwork := ctx.String(AsteriscNetworkFlag.Name) + if ctx.IsSet(flags.NetworkFlagName) { + asteriscNetwork = ctx.String(flags.NetworkFlagName) + } + l1EthRpc := ctx.String(L1EthRpcFlag.Name) + l1Beacon := ctx.String(L1BeaconFlag.Name) 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, - 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), + L1EthRpc: l1EthRpc, + L1Beacon: l1Beacon, + 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), + Cannon: vm.Config{ + VmType: types.TraceTypeCannon, + L1: l1EthRpc, + L1Beacon: l1Beacon, + L2: l2Rpc, + VmBin: ctx.String(CannonBinFlag.Name), + Server: ctx.String(CannonServerFlag.Name), + Network: cannonNetwork, + RollupConfigPath: ctx.String(CannonRollupConfigFlag.Name), + L2GenesisPath: ctx.String(CannonL2GenesisFlag.Name), + SnapshotFreq: ctx.Uint(CannonSnapshotFreqFlag.Name), + InfoFreq: ctx.Uint(CannonInfoFreqFlag.Name), + DebugInfo: true, + BinarySnapshots: true, + }, + CannonAbsolutePreState: ctx.String(CannonPreStateFlag.Name), + CannonAbsolutePreStateBaseURL: cannonPrestatesURL, + Datadir: ctx.String(DatadirFlag.Name), + Asterisc: vm.Config{ + VmType: types.TraceTypeAsterisc, + L1: l1EthRpc, + L1Beacon: l1Beacon, + L2: l2Rpc, + VmBin: ctx.String(AsteriscBinFlag.Name), + Server: ctx.String(AsteriscServerFlag.Name), + Network: asteriscNetwork, + RollupConfigPath: ctx.String(AsteriscRollupConfigFlag.Name), + L2GenesisPath: ctx.String(AsteriscL2GenesisFlag.Name), + SnapshotFreq: ctx.Uint(AsteriscSnapshotFreqFlag.Name), + InfoFreq: ctx.Uint(AsteriscInfoFreqFlag.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), + AsteriscKona: vm.Config{ + VmType: types.TraceTypeAsteriscKona, + L1: l1EthRpc, + L1Beacon: l1Beacon, + L2: l2Rpc, + VmBin: ctx.String(AsteriscBinFlag.Name), + Server: ctx.String(AsteriscKonaServerFlag.Name), + Network: asteriscNetwork, + RollupConfigPath: ctx.String(AsteriscRollupConfigFlag.Name), + L2GenesisPath: ctx.String(AsteriscL2GenesisFlag.Name), + SnapshotFreq: ctx.Uint(AsteriscSnapshotFreqFlag.Name), + InfoFreq: ctx.Uint(AsteriscInfoFreqFlag.Name), + }, + AsteriscKonaAbsolutePreState: ctx.String(AsteriscKonaPreStateFlag.Name), + AsteriscKonaAbsolutePreStateBaseURL: asteriscKonaPreStatesURL, + TxMgrConfig: txMgrConfig, + MetricsConfig: metricsConfig, + PprofConfig: pprofConfig, + SelectiveClaimResolution: ctx.Bool(SelectiveClaimResolutionFlag.Name), + AllowInvalidPrestate: ctx.Bool(UnsafeAllowInvalidPrestate.Name), }, nil } diff --git a/op-challenger/game/fault/agent.go b/op-challenger/game/fault/agent.go index 46951d23e776..10b28426f4b0 100644 --- a/op-challenger/game/fault/agent.go +++ b/op-challenger/game/fault/agent.go @@ -155,6 +155,11 @@ func (a *Agent) tryResolve(ctx context.Context) bool { a.log.Error("Failed to resolve claims", "err", err) return false } + if a.selective { + // Never resolve games in selective mode as it won't unlock any bonds for us. + // Assume the game is still in progress or the player wouldn't have told us to act. + return false + } status, err := a.responder.CallResolve(ctx) if err != nil || status == gameTypes.GameStatusInProgress { return false diff --git a/op-challenger/game/fault/agent_test.go b/op-challenger/game/fault/agent_test.go index 415edcd9977c..62dc560263e9 100644 --- a/op-challenger/game/fault/agent_test.go +++ b/op-challenger/game/fault/agent_test.go @@ -4,6 +4,7 @@ import ( "context" "errors" "math/big" + "slices" "sync" "testing" "time" @@ -127,20 +128,27 @@ func TestAgent_SelectiveClaimResolution(t *testing.T) { }, } - for _, test := range tests { - test := test - t.Run(test.name, func(t *testing.T) { + for _, tCase := range tests { + tCase := tCase + t.Run(tCase.name, func(t *testing.T) { agent, claimLoader, responder := setupTestAgent(t) - agent.selective = test.selective - agent.claimants = test.claimants + agent.selective = tCase.selective + agent.claimants = tCase.claimants claimLoader.maxLoads = 1 - claimLoader.claims = test.claims - responder.callResolveStatus = test.callResolveStatus + if tCase.selective { + claimLoader.maxLoads = 0 + } + claimLoader.claims = tCase.claims + responder.callResolveStatus = tCase.callResolveStatus require.NoError(t, agent.Act(ctx)) - require.Equal(t, test.expectedResolveCount, responder.callResolveClaimCount, "should check if game is resolvable") - require.Equal(t, test.expectedResolveCount, responder.resolveClaimCount, "should check if game is resolvable") + require.Equal(t, tCase.expectedResolveCount, responder.callResolveClaimCount, "should check if game is resolvable") + require.Equal(t, tCase.expectedResolveCount, responder.resolveClaimCount, "should check if game is resolvable") + if tCase.selective { + require.Equal(t, 0, responder.callResolveCount, "should not resolve game in selective mode") + require.Equal(t, 0, responder.resolveCount, "should not resolve game in selective mode") + } }) } } @@ -230,6 +238,7 @@ type stubResponder struct { callResolveClaimCount int callResolveClaimErr error resolveClaimCount int + resolvedClaims []uint64 } func (s *stubResponder) CallResolve(_ context.Context) (gameTypes.GameStatus, error) { @@ -246,9 +255,12 @@ func (s *stubResponder) Resolve() error { return s.resolveErr } -func (s *stubResponder) CallResolveClaim(_ context.Context, _ uint64) error { +func (s *stubResponder) CallResolveClaim(_ context.Context, idx uint64) error { s.l.Lock() defer s.l.Unlock() + if slices.Contains(s.resolvedClaims, idx) { + return errors.New("already resolved") + } s.callResolveClaimCount++ return s.callResolveClaimErr } @@ -257,6 +269,7 @@ func (s *stubResponder) ResolveClaims(claims ...uint64) error { s.l.Lock() defer s.l.Unlock() s.resolveClaimCount += len(claims) + s.resolvedClaims = append(s.resolvedClaims, claims...) return nil } diff --git a/op-challenger/game/fault/contracts/abis/PreimageOracle-1.0.0.json b/op-challenger/game/fault/contracts/abis/PreimageOracle-1.0.0.json new file mode 100644 index 000000000000..5ba83bc0b514 --- /dev/null +++ b/op-challenger/game/fault/contracts/abis/PreimageOracle-1.0.0.json @@ -0,0 +1,901 @@ +[ + { + "inputs": [ + { + "internalType": "uint256", + "name": "_minProposalSize", + "type": "uint256" + }, + { + "internalType": "uint256", + "name": "_challengePeriod", + "type": "uint256" + } + ], + "stateMutability": "nonpayable", + "type": "constructor" + }, + { + "inputs": [], + "name": "KECCAK_TREE_DEPTH", + "outputs": [ + { + "internalType": "uint256", + "name": "", + "type": "uint256" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [], + "name": "MAX_LEAF_COUNT", + "outputs": [ + { + "internalType": "uint256", + "name": "", + "type": "uint256" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [], + "name": "MIN_BOND_SIZE", + "outputs": [ + { + "internalType": "uint256", + "name": "", + "type": "uint256" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "uint256", + "name": "_uuid", + "type": "uint256" + }, + { + "internalType": "uint256", + "name": "_inputStartBlock", + "type": "uint256" + }, + { + "internalType": "bytes", + "name": "_input", + "type": "bytes" + }, + { + "internalType": "bytes32[]", + "name": "_stateCommitments", + "type": "bytes32[]" + }, + { + "internalType": "bool", + "name": "_finalize", + "type": "bool" + } + ], + "name": "addLeavesLPP", + "outputs": [], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "address", + "name": "_claimant", + "type": "address" + }, + { + "internalType": "uint256", + "name": "_uuid", + "type": "uint256" + }, + { + "components": [ + { + "internalType": "bytes", + "name": "input", + "type": "bytes" + }, + { + "internalType": "uint256", + "name": "index", + "type": "uint256" + }, + { + "internalType": "bytes32", + "name": "stateCommitment", + "type": "bytes32" + } + ], + "internalType": "struct PreimageOracle.Leaf", + "name": "_postState", + "type": "tuple" + }, + { + "internalType": "bytes32[]", + "name": "_postStateProof", + "type": "bytes32[]" + } + ], + "name": "challengeFirstLPP", + "outputs": [], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "address", + "name": "_claimant", + "type": "address" + }, + { + "internalType": "uint256", + "name": "_uuid", + "type": "uint256" + }, + { + "components": [ + { + "internalType": "uint64[25]", + "name": "state", + "type": "uint64[25]" + } + ], + "internalType": "struct LibKeccak.StateMatrix", + "name": "_stateMatrix", + "type": "tuple" + }, + { + "components": [ + { + "internalType": "bytes", + "name": "input", + "type": "bytes" + }, + { + "internalType": "uint256", + "name": "index", + "type": "uint256" + }, + { + "internalType": "bytes32", + "name": "stateCommitment", + "type": "bytes32" + } + ], + "internalType": "struct PreimageOracle.Leaf", + "name": "_preState", + "type": "tuple" + }, + { + "internalType": "bytes32[]", + "name": "_preStateProof", + "type": "bytes32[]" + }, + { + "components": [ + { + "internalType": "bytes", + "name": "input", + "type": "bytes" + }, + { + "internalType": "uint256", + "name": "index", + "type": "uint256" + }, + { + "internalType": "bytes32", + "name": "stateCommitment", + "type": "bytes32" + } + ], + "internalType": "struct PreimageOracle.Leaf", + "name": "_postState", + "type": "tuple" + }, + { + "internalType": "bytes32[]", + "name": "_postStateProof", + "type": "bytes32[]" + } + ], + "name": "challengeLPP", + "outputs": [], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [], + "name": "challengePeriod", + "outputs": [ + { + "internalType": "uint256", + "name": "challengePeriod_", + "type": "uint256" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "address", + "name": "_owner", + "type": "address" + }, + { + "internalType": "uint256", + "name": "_uuid", + "type": "uint256" + } + ], + "name": "getTreeRootLPP", + "outputs": [ + { + "internalType": "bytes32", + "name": "treeRoot_", + "type": "bytes32" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "uint256", + "name": "_uuid", + "type": "uint256" + }, + { + "internalType": "uint32", + "name": "_partOffset", + "type": "uint32" + }, + { + "internalType": "uint32", + "name": "_claimedSize", + "type": "uint32" + } + ], + "name": "initLPP", + "outputs": [], + "stateMutability": "payable", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "uint256", + "name": "_z", + "type": "uint256" + }, + { + "internalType": "uint256", + "name": "_y", + "type": "uint256" + }, + { + "internalType": "bytes", + "name": "_commitment", + "type": "bytes" + }, + { + "internalType": "bytes", + "name": "_proof", + "type": "bytes" + }, + { + "internalType": "uint256", + "name": "_partOffset", + "type": "uint256" + } + ], + "name": "loadBlobPreimagePart", + "outputs": [], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "uint256", + "name": "_partOffset", + "type": "uint256" + }, + { + "internalType": "bytes", + "name": "_preimage", + "type": "bytes" + } + ], + "name": "loadKeccak256PreimagePart", + "outputs": [], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "uint256", + "name": "_ident", + "type": "uint256" + }, + { + "internalType": "bytes32", + "name": "_localContext", + "type": "bytes32" + }, + { + "internalType": "bytes32", + "name": "_word", + "type": "bytes32" + }, + { + "internalType": "uint256", + "name": "_size", + "type": "uint256" + }, + { + "internalType": "uint256", + "name": "_partOffset", + "type": "uint256" + } + ], + "name": "loadLocalData", + "outputs": [ + { + "internalType": "bytes32", + "name": "key_", + "type": "bytes32" + } + ], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "uint256", + "name": "_partOffset", + "type": "uint256" + }, + { + "internalType": "address", + "name": "_precompile", + "type": "address" + }, + { + "internalType": "bytes", + "name": "_input", + "type": "bytes" + } + ], + "name": "loadPrecompilePreimagePart", + "outputs": [], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "uint256", + "name": "_partOffset", + "type": "uint256" + }, + { + "internalType": "bytes", + "name": "_preimage", + "type": "bytes" + } + ], + "name": "loadSha256PreimagePart", + "outputs": [], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [], + "name": "minProposalSize", + "outputs": [ + { + "internalType": "uint256", + "name": "minProposalSize_", + "type": "uint256" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "bytes32", + "name": "", + "type": "bytes32" + } + ], + "name": "preimageLengths", + "outputs": [ + { + "internalType": "uint256", + "name": "", + "type": "uint256" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "bytes32", + "name": "", + "type": "bytes32" + }, + { + "internalType": "uint256", + "name": "", + "type": "uint256" + } + ], + "name": "preimagePartOk", + "outputs": [ + { + "internalType": "bool", + "name": "", + "type": "bool" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "bytes32", + "name": "", + "type": "bytes32" + }, + { + "internalType": "uint256", + "name": "", + "type": "uint256" + } + ], + "name": "preimageParts", + "outputs": [ + { + "internalType": "bytes32", + "name": "", + "type": "bytes32" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "address", + "name": "", + "type": "address" + }, + { + "internalType": "uint256", + "name": "", + "type": "uint256" + }, + { + "internalType": "uint256", + "name": "", + "type": "uint256" + } + ], + "name": "proposalBlocks", + "outputs": [ + { + "internalType": "uint64", + "name": "", + "type": "uint64" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "address", + "name": "_claimant", + "type": "address" + }, + { + "internalType": "uint256", + "name": "_uuid", + "type": "uint256" + } + ], + "name": "proposalBlocksLen", + "outputs": [ + { + "internalType": "uint256", + "name": "len_", + "type": "uint256" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "address", + "name": "", + "type": "address" + }, + { + "internalType": "uint256", + "name": "", + "type": "uint256" + } + ], + "name": "proposalBonds", + "outputs": [ + { + "internalType": "uint256", + "name": "", + "type": "uint256" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "address", + "name": "", + "type": "address" + }, + { + "internalType": "uint256", + "name": "", + "type": "uint256" + }, + { + "internalType": "uint256", + "name": "", + "type": "uint256" + } + ], + "name": "proposalBranches", + "outputs": [ + { + "internalType": "bytes32", + "name": "", + "type": "bytes32" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [], + "name": "proposalCount", + "outputs": [ + { + "internalType": "uint256", + "name": "count_", + "type": "uint256" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "address", + "name": "", + "type": "address" + }, + { + "internalType": "uint256", + "name": "", + "type": "uint256" + } + ], + "name": "proposalMetadata", + "outputs": [ + { + "internalType": "LPPMetaData", + "name": "", + "type": "bytes32" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "address", + "name": "", + "type": "address" + }, + { + "internalType": "uint256", + "name": "", + "type": "uint256" + } + ], + "name": "proposalParts", + "outputs": [ + { + "internalType": "bytes32", + "name": "", + "type": "bytes32" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "uint256", + "name": "", + "type": "uint256" + } + ], + "name": "proposals", + "outputs": [ + { + "internalType": "address", + "name": "claimant", + "type": "address" + }, + { + "internalType": "uint256", + "name": "uuid", + "type": "uint256" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "bytes32", + "name": "_key", + "type": "bytes32" + }, + { + "internalType": "uint256", + "name": "_offset", + "type": "uint256" + } + ], + "name": "readPreimage", + "outputs": [ + { + "internalType": "bytes32", + "name": "dat_", + "type": "bytes32" + }, + { + "internalType": "uint256", + "name": "datLen_", + "type": "uint256" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "address", + "name": "_claimant", + "type": "address" + }, + { + "internalType": "uint256", + "name": "_uuid", + "type": "uint256" + }, + { + "components": [ + { + "internalType": "uint64[25]", + "name": "state", + "type": "uint64[25]" + } + ], + "internalType": "struct LibKeccak.StateMatrix", + "name": "_stateMatrix", + "type": "tuple" + }, + { + "components": [ + { + "internalType": "bytes", + "name": "input", + "type": "bytes" + }, + { + "internalType": "uint256", + "name": "index", + "type": "uint256" + }, + { + "internalType": "bytes32", + "name": "stateCommitment", + "type": "bytes32" + } + ], + "internalType": "struct PreimageOracle.Leaf", + "name": "_preState", + "type": "tuple" + }, + { + "internalType": "bytes32[]", + "name": "_preStateProof", + "type": "bytes32[]" + }, + { + "components": [ + { + "internalType": "bytes", + "name": "input", + "type": "bytes" + }, + { + "internalType": "uint256", + "name": "index", + "type": "uint256" + }, + { + "internalType": "bytes32", + "name": "stateCommitment", + "type": "bytes32" + } + ], + "internalType": "struct PreimageOracle.Leaf", + "name": "_postState", + "type": "tuple" + }, + { + "internalType": "bytes32[]", + "name": "_postStateProof", + "type": "bytes32[]" + } + ], + "name": "squeezeLPP", + "outputs": [], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [], + "name": "version", + "outputs": [ + { + "internalType": "string", + "name": "", + "type": "string" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "uint256", + "name": "", + "type": "uint256" + } + ], + "name": "zeroHashes", + "outputs": [ + { + "internalType": "bytes32", + "name": "", + "type": "bytes32" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [], + "name": "ActiveProposal", + "type": "error" + }, + { + "inputs": [], + "name": "AlreadyFinalized", + "type": "error" + }, + { + "inputs": [], + "name": "BadProposal", + "type": "error" + }, + { + "inputs": [], + "name": "BondTransferFailed", + "type": "error" + }, + { + "inputs": [], + "name": "InsufficientBond", + "type": "error" + }, + { + "inputs": [], + "name": "InvalidInputSize", + "type": "error" + }, + { + "inputs": [], + "name": "InvalidPreimage", + "type": "error" + }, + { + "inputs": [], + "name": "InvalidProof", + "type": "error" + }, + { + "inputs": [], + "name": "NotEOA", + "type": "error" + }, + { + "inputs": [], + "name": "NotInitialized", + "type": "error" + }, + { + "inputs": [], + "name": "PartOffsetOOB", + "type": "error" + }, + { + "inputs": [], + "name": "PostStateMatches", + "type": "error" + }, + { + "inputs": [], + "name": "StatesNotContiguous", + "type": "error" + }, + { + "inputs": [], + "name": "TreeSizeOverflow", + "type": "error" + }, + { + "inputs": [], + "name": "WrongStartingBlock", + "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 index f093ecb3ff3b..c0c0c0bb0393 100644 --- a/op-challenger/game/fault/contracts/delayed_weth.go +++ b/op-challenger/game/fault/contracts/delayed_weth.go @@ -4,6 +4,7 @@ import ( "context" "fmt" "math/big" + "time" "github.com/ethereum-optimism/optimism/op-challenger/game/fault/contracts/metrics" "github.com/ethereum-optimism/optimism/op-service/sources/batching" @@ -14,6 +15,7 @@ import ( var ( methodWithdrawals = "withdrawals" + methodDelay = "delay" ) type DelayedWETHContract struct { @@ -36,6 +38,28 @@ func NewDelayedWETHContract(metrics metrics.ContractMetricer, addr common.Addres } } +func (d *DelayedWETHContract) Addr() common.Address { + return d.contract.Addr() +} + +// GetBalanceAndDelay returns the total amount of ETH controlled by this contract and the configured withdrawal delay. +func (d *DelayedWETHContract) GetBalanceAndDelay(ctx context.Context, block rpcblock.Block) (*big.Int, time.Duration, error) { + defer d.metrics.StartContractRequest("GetBalance")() + results, err := d.multiCaller.Call(ctx, block, + batching.NewBalanceCall(d.contract.Addr()), + d.contract.Call(methodDelay)) + if err != nil { + return nil, 0, fmt.Errorf("failed to retrieve game balance: %w", err) + } + balance := results[0].GetBigInt(0) + delaySeconds := results[1].GetBigInt(0) + if !delaySeconds.IsInt64() { + return nil, 0, fmt.Errorf("withdrawal delay too big for int64 %v", delaySeconds) + } + delay := time.Duration(delaySeconds.Int64()) * time.Second + return balance, delay, nil +} + // 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")() diff --git a/op-challenger/game/fault/contracts/delayed_weth_test.go b/op-challenger/game/fault/contracts/delayed_weth_test.go index 020189c031ae..cc771215fb83 100644 --- a/op-challenger/game/fault/contracts/delayed_weth_test.go +++ b/op-challenger/game/fault/contracts/delayed_weth_test.go @@ -4,6 +4,7 @@ import ( "context" "math/big" "testing" + "time" contractMetrics "github.com/ethereum-optimism/optimism/op-challenger/game/fault/contracts/metrics" "github.com/ethereum-optimism/optimism/op-service/sources/batching" @@ -24,8 +25,8 @@ func TestDelayedWeth_GetWithdrawals(t *testing.T) { addrs := []common.Address{{0x01}, {0x02}} expected := [][]*big.Int{ - []*big.Int{big.NewInt(123), big.NewInt(456)}, - []*big.Int{big.NewInt(123), big.NewInt(456)}, + {big.NewInt(123), big.NewInt(456)}, + {big.NewInt(123), big.NewInt(456)}, } for i, addr := range addrs { @@ -41,6 +42,22 @@ func TestDelayedWeth_GetWithdrawals(t *testing.T) { } } +func TestDelayedWeth_GetBalanceAndDelay(t *testing.T) { + stubRpc, weth := setupDelayedWethTest(t) + block := rpcblock.ByNumber(482) + balance := big.NewInt(23984) + delaySeconds := int64(2983294824) + delay := time.Duration(delaySeconds) * time.Second + + stubRpc.AddExpectedCall(batchingTest.NewGetBalanceCall(delayedWeth, block, balance)) + stubRpc.SetResponse(delayedWeth, methodDelay, block, nil, []interface{}{big.NewInt(delaySeconds)}) + + actualBalance, actualDelay, err := weth.GetBalanceAndDelay(context.Background(), block) + require.NoError(t, err) + require.Equal(t, balance, actualBalance) + require.Equal(t, delay, actualDelay) +} + func setupDelayedWethTest(t *testing.T) (*batchingTest.AbiBasedRpc, *DelayedWETHContract) { delayedWethAbi := snapshots.LoadDelayedWETHABI() stubRpc := batchingTest.NewAbiBasedRpc(t, delayedWeth, delayedWethAbi) diff --git a/op-challenger/game/fault/contracts/faultdisputegame.go b/op-challenger/game/fault/contracts/faultdisputegame.go index e48f06549dfb..6bee1961018e 100644 --- a/op-challenger/game/fault/contracts/faultdisputegame.go +++ b/op-challenger/game/fault/contracts/faultdisputegame.go @@ -7,7 +7,6 @@ import ( "fmt" "math" "math/big" - "strings" "time" "github.com/ethereum-optimism/optimism/op-challenger/game/fault/contracts/metrics" @@ -26,7 +25,6 @@ import ( var maxChildChecks = big.NewInt(512) var ( - methodVersion = "version" methodMaxClockDuration = "maxClockDuration" methodMaxGameDepth = "maxGameDepth" methodAbsolutePrestate = "absolutePrestate" @@ -35,6 +33,7 @@ var ( methodClaimCount = "claimDataLen" methodClaim = "claimData" methodL1Head = "l1Head" + methodResolvedAt = "resolvedAt" methodResolvedSubgames = "resolvedSubgames" methodResolve = "resolve" methodResolveClaim = "resolveClaim" @@ -83,14 +82,8 @@ type outputRootProof struct { 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. + var builder VersionedBuilder[FaultDisputeGameContract] + builder.AddVersion(0, 8, func() (FaultDisputeGameContract, error) { legacyAbi := mustParseAbi(faultDisputeGameAbi020) return &FaultDisputeGameContract080{ FaultDisputeGameContractLatest: FaultDisputeGameContractLatest{ @@ -99,8 +92,8 @@ func NewFaultDisputeGameContract(ctx context.Context, metrics metrics.ContractMe 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. + }) + builder.AddVersion(0, 18, func() (FaultDisputeGameContract, error) { legacyAbi := mustParseAbi(faultDisputeGameAbi0180) return &FaultDisputeGameContract0180{ FaultDisputeGameContractLatest: FaultDisputeGameContractLatest{ @@ -109,8 +102,18 @@ func NewFaultDisputeGameContract(ctx context.Context, metrics metrics.ContractMe contract: batching.NewBoundContract(legacyAbi, addr), }, }, nil - } else if strings.HasPrefix(version, "1.1.") { - // Detected an older version of contracts, use a compatibility shim. + }) + builder.AddVersion(1, 0, func() (FaultDisputeGameContract, error) { + legacyAbi := mustParseAbi(faultDisputeGameAbi0180) + return &FaultDisputeGameContract0180{ + FaultDisputeGameContractLatest: FaultDisputeGameContractLatest{ + metrics: metrics, + multiCaller: caller, + contract: batching.NewBoundContract(legacyAbi, addr), + }, + }, nil + }) + builder.AddVersion(1, 1, func() (FaultDisputeGameContract, error) { legacyAbi := mustParseAbi(faultDisputeGameAbi111) return &FaultDisputeGameContract111{ FaultDisputeGameContractLatest: FaultDisputeGameContractLatest{ @@ -119,13 +122,14 @@ func NewFaultDisputeGameContract(ctx context.Context, metrics metrics.ContractMe contract: batching.NewBoundContract(legacyAbi, addr), }, }, nil - } else { + }) + return builder.Build(ctx, caller, contractAbi, addr, func() (FaultDisputeGameContract, error) { return &FaultDisputeGameContractLatest{ metrics: metrics, multiCaller: caller, contract: batching.NewBoundContract(contractAbi, addr), }, nil - } + }) } func mustParseAbi(json []byte) *abi.ABI { @@ -136,21 +140,20 @@ func mustParseAbi(json []byte) *abi.ABI { return &loaded } -// GetBalance returns the total amount of ETH controlled by this contract. +// GetBalanceAndDelay 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 *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)) +func (f *FaultDisputeGameContractLatest) GetBalanceAndDelay(ctx context.Context, block rpcblock.Block) (*big.Int, time.Duration, common.Address, error) { + defer f.metrics.StartContractRequest("GetBalanceAndDelay")() + weth, err := f.getDelayedWETH(ctx, block) if err != nil { - return nil, common.Address{}, fmt.Errorf("failed to load weth address: %w", err) + return nil, 0, common.Address{}, fmt.Errorf("failed to get DelayedWETH contract: %w", err) } - wethAddr := result.GetAddress(0) - result, err = f.multiCaller.SingleCall(ctx, block, batching.NewBalanceCall(wethAddr)) + balance, delay, err := weth.GetBalanceAndDelay(ctx, block) if err != nil { - return nil, common.Address{}, fmt.Errorf("failed to retrieve game balance: %w", err) + return nil, 0, common.Address{}, fmt.Errorf("failed to get WETH balance and delay: %w", err) } - return result.GetBigInt(0), wethAddr, nil + return balance, delay, weth.Addr(), nil } // GetBlockRange returns the block numbers of the absolute pre-state block (typically genesis or the bedrock activation block) @@ -222,6 +225,16 @@ func (f *FaultDisputeGameContractLatest) GetGameMetadata(ctx context.Context, bl }, nil } +func (f *FaultDisputeGameContractLatest) GetResolvedAt(ctx context.Context, block rpcblock.Block) (time.Time, error) { + defer f.metrics.StartContractRequest("GetResolvedAt")() + result, err := f.multiCaller.SingleCall(ctx, block, f.contract.Call(methodResolvedAt)) + if err != nil { + return time.Time{}, fmt.Errorf("failed to retrieve resolution time: %w", err) + } + resolvedAt := time.Unix(int64(result.GetUint64(0)), 0) + return resolvedAt, nil +} + 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)) @@ -297,7 +310,7 @@ func (f *FaultDisputeGameContractLatest) ClaimCreditTx(ctx context.Context, reci 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 txmgr.TxCandidate{}, fmt.Errorf("%w: %w", ErrSimulationFailed, err) } return call.ToTxCandidate() } @@ -336,27 +349,27 @@ func (f *FaultDisputeGameContractLatest) addGlobalDataTx(ctx context.Context, da return oracle.AddGlobalDataTx(data) } -func (f *FaultDisputeGameContractLatest) GetWithdrawals(ctx context.Context, block rpcblock.Block, gameAddr common.Address, recipients ...common.Address) ([]*WithdrawalRequest, error) { +func (f *FaultDisputeGameContractLatest) GetWithdrawals(ctx context.Context, block rpcblock.Block, recipients ...common.Address) ([]*WithdrawalRequest, error) { defer f.metrics.StartContractRequest("GetWithdrawals")() - delayedWETH, err := f.getDelayedWETH(ctx) + delayedWETH, err := f.getDelayedWETH(ctx, block) if err != nil { return nil, err } - return delayedWETH.GetWithdrawals(ctx, block, gameAddr, recipients...) + return delayedWETH.GetWithdrawals(ctx, block, f.contract.Addr(), recipients...) } -func (f *FaultDisputeGameContractLatest) getDelayedWETH(ctx context.Context) (*DelayedWETHContract, error) { +func (f *FaultDisputeGameContractLatest) getDelayedWETH(ctx context.Context, block rpcblock.Block) (*DelayedWETHContract, error) { defer f.metrics.StartContractRequest("GetDelayedWETH")() - result, err := f.multiCaller.SingleCall(ctx, rpcblock.Latest, f.contract.Call(methodWETH)) + result, err := f.multiCaller.SingleCall(ctx, block, 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) { +func (f *FaultDisputeGameContractLatest) GetOracle(ctx context.Context) (PreimageOracleContract, error) { defer f.metrics.StartContractRequest("GetOracle")() - vm, err := f.vm(ctx) + vm, err := f.Vm(ctx) if err != nil { return nil, err } @@ -459,7 +472,7 @@ func (f *FaultDisputeGameContractLatest) IsResolved(ctx context.Context, block r return resolved, nil } -func (f *FaultDisputeGameContractLatest) vm(ctx context.Context) (*VMContract, error) { +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) @@ -593,9 +606,10 @@ func (f *FaultDisputeGameContractLatest) decodeClaim(result *batching.CallResult } type FaultDisputeGameContract interface { - GetBalance(ctx context.Context, block rpcblock.Block) (*big.Int, common.Address, error) + GetBalanceAndDelay(ctx context.Context, block rpcblock.Block) (*big.Int, time.Duration, common.Address, error) GetBlockRange(ctx context.Context) (prestateBlock uint64, poststateBlock uint64, retErr error) GetGameMetadata(ctx context.Context, block rpcblock.Block) (GameMetadata, error) + GetResolvedAt(ctx context.Context, block rpcblock.Block) (time.Time, 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) @@ -604,8 +618,8 @@ type FaultDisputeGameContract interface { 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) + GetWithdrawals(ctx context.Context, block rpcblock.Block, 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) @@ -624,4 +638,5 @@ type FaultDisputeGameContract interface { ResolveClaimTx(claimIdx uint64) (txmgr.TxCandidate, error) CallResolve(ctx context.Context) (gameTypes.GameStatus, error) ResolveTx() (txmgr.TxCandidate, error) + Vm(ctx context.Context) (*VMContract, error) } diff --git a/op-challenger/game/fault/contracts/faultdisputegame_test.go b/op-challenger/game/fault/contracts/faultdisputegame_test.go index 4ea7d9c3d0bf..cd02bde44a05 100644 --- a/op-challenger/game/fault/contracts/faultdisputegame_test.go +++ b/op-challenger/game/fault/contracts/faultdisputegame_test.go @@ -158,6 +158,15 @@ func TestSimpleGetters(t *testing.T) { return game.CallResolve(context.Background()) }, }, + { + methodAlias: "resolvedAt", + method: methodResolvedAt, + result: uint64(240402), + expected: time.Unix(240402, 0), + call: func(game FaultDisputeGameContract) (any, error) { + return game.GetResolvedAt(context.Background(), rpcblock.Latest) + }, + }, } for _, version := range versions { version := version @@ -327,14 +336,19 @@ func TestGetBalance(t *testing.T) { t.Run(version.version, func(t *testing.T) { wethAddr := common.Address{0x11, 0x55, 0x66} balance := big.NewInt(9995877) + delaySeconds := big.NewInt(429829) + delay := time.Duration(delaySeconds.Int64()) * time.Second block := rpcblock.ByNumber(424) stubRpc, game := setupFaultDisputeGameTest(t, version) stubRpc.SetResponse(fdgAddr, methodWETH, block, nil, []interface{}{wethAddr}) + stubRpc.AddContract(wethAddr, snapshots.LoadDelayedWETHABI()) + stubRpc.SetResponse(wethAddr, methodDelay, block, nil, []interface{}{delaySeconds}) stubRpc.AddExpectedCall(batchingTest.NewGetBalanceCall(wethAddr, block, balance)) - actualBalance, actualAddr, err := game.GetBalance(context.Background(), block) + actualBalance, actualDelay, actualAddr, err := game.GetBalanceAndDelay(context.Background(), block) require.NoError(t, err) require.Equal(t, wethAddr, actualAddr) + require.Equal(t, delay, actualDelay) require.Truef(t, balance.Cmp(actualBalance) == 0, "Expected balance %v but was %v", balance, actualBalance) }) } @@ -783,6 +797,7 @@ func setupFaultDisputeGameTest(t *testing.T, version contractVersion) (*batching caller := batching.NewMultiCaller(stubRpc, batching.DefaultBatchSize) stubRpc.SetResponse(fdgAddr, methodVersion, rpcblock.Latest, nil, []interface{}{version.version}) + stubRpc.SetResponse(oracleAddr, methodVersion, rpcblock.Latest, nil, []interface{}{oracleLatest}) 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 d67a4688c422..cad967d9ec77 100644 --- a/op-challenger/game/fault/contracts/gamefactory.go +++ b/op-challenger/game/fault/contracts/gamefactory.go @@ -7,6 +7,7 @@ import ( "math/big" "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/sources/batching" "github.com/ethereum-optimism/optimism/op-service/sources/batching/rpcblock" @@ -76,7 +77,7 @@ func (f *DisputeGameFactoryContract) GetGame(ctx context.Context, idx uint64, bl return f.decodeGame(idx, result), nil } -func (f *DisputeGameFactoryContract) GetGameImpl(ctx context.Context, gameType uint32) (common.Address, error) { +func (f *DisputeGameFactoryContract) GetGameImpl(ctx context.Context, gameType faultTypes.GameType) (common.Address, error) { defer f.metrics.StartContractRequest("GetGameImpl")() result, err := f.multiCaller.SingleCall(ctx, rpcblock.Latest, f.contract.Call(methodGameImpls, gameType)) if err != nil { diff --git a/op-challenger/game/fault/contracts/gamefactory_test.go b/op-challenger/game/fault/contracts/gamefactory_test.go index aa5af39b4fe4..e2e91e54c0c6 100644 --- a/op-challenger/game/fault/contracts/gamefactory_test.go +++ b/op-challenger/game/fault/contracts/gamefactory_test.go @@ -8,6 +8,7 @@ import ( "testing" "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/sources/batching" "github.com/ethereum-optimism/optimism/op-service/sources/batching/rpcblock" @@ -190,7 +191,7 @@ func TestGetGameFromParameters(t *testing.T) { func TestGetGameImpl(t *testing.T) { stubRpc, factory := setupDisputeGameFactoryTest(t) - gameType := uint32(3) + gameType := faultTypes.CannonGameType gameImplAddr := common.Address{0xaa} stubRpc.SetResponse( factoryAddr, @@ -198,7 +199,7 @@ func TestGetGameImpl(t *testing.T) { rpcblock.Latest, []interface{}{gameType}, []interface{}{gameImplAddr}) - actual, err := factory.GetGameImpl(context.Background(), gameType) + actual, err := factory.GetGameImpl(context.Background(), faultTypes.CannonGameType) require.NoError(t, err) require.Equal(t, gameImplAddr, actual) } diff --git a/op-challenger/game/fault/contracts/metrics/metrics.go b/op-challenger/game/fault/contracts/metrics/metrics.go index 9a47a0669517..60e8b67c1c07 100644 --- a/op-challenger/game/fault/contracts/metrics/metrics.go +++ b/op-challenger/game/fault/contracts/metrics/metrics.go @@ -4,7 +4,7 @@ import ( "github.com/prometheus/client_golang/prometheus" ) -const ConstractSubsystem = "contracts" +const ContractsSubsystem = "contracts" type EndTimer func() @@ -28,7 +28,7 @@ func MakeContractMetrics(ns string, factory Factory) *ContractMetrics { return &ContractMetrics{ ContractRequestsTotal: factory.NewCounterVec(prometheus.CounterOpts{ Namespace: ns, - Subsystem: ConstractSubsystem, + Subsystem: ContractsSubsystem, Name: "requests_total", Help: "Total requests to the contracts", }, []string{ @@ -36,7 +36,7 @@ func MakeContractMetrics(ns string, factory Factory) *ContractMetrics { }), ContractRequestDurationSeconds: factory.NewHistogramVec(prometheus.HistogramOpts{ Namespace: ns, - Subsystem: ConstractSubsystem, + Subsystem: ContractsSubsystem, Name: "requests_duration_seconds", Help: "Histogram of contract request durations", }, []string{ diff --git a/op-challenger/game/fault/contracts/oracle.go b/op-challenger/game/fault/contracts/oracle.go index be2520bef8b5..fdb28b003e47 100644 --- a/op-challenger/game/fault/contracts/oracle.go +++ b/op-challenger/game/fault/contracts/oracle.go @@ -60,8 +60,8 @@ type libKeccakStateMatrix struct { State [25]uint64 } -// PreimageOracleContract is a binding that works with contracts implementing the IPreimageOracle interface -type PreimageOracleContract struct { +// PreimageOracleContractLatest is a binding that works with contracts implementing the IPreimageOracle interface +type PreimageOracleContractLatest struct { addr common.Address multiCaller *batching.MultiCaller contract *batching.BoundContract @@ -83,21 +83,36 @@ func toPreimageOracleLeaf(l keccakTypes.Leaf) preimageOracleLeaf { } } -func NewPreimageOracleContract(addr common.Address, caller *batching.MultiCaller) *PreimageOracleContract { +func NewPreimageOracleContract(ctx context.Context, addr common.Address, caller *batching.MultiCaller) (PreimageOracleContract, error) { oracleAbi := snapshots.LoadPreimageOracleABI() - return &PreimageOracleContract{ - addr: addr, - multiCaller: caller, - contract: batching.NewBoundContract(oracleAbi, addr), - } + var builder VersionedBuilder[PreimageOracleContract] + builder.AddVersion(1, 0, func() (PreimageOracleContract, error) { + legacyAbi := mustParseAbi(preimageOracleAbi100) + return &PreimageOracleContract100{ + PreimageOracleContractLatest{ + addr: addr, + multiCaller: caller, + contract: batching.NewBoundContract(legacyAbi, addr), + }, + }, nil + }) + + return builder.Build(ctx, caller, oracleAbi, addr, func() (PreimageOracleContract, error) { + return &PreimageOracleContractLatest{ + addr: addr, + multiCaller: caller, + contract: batching.NewBoundContract(oracleAbi, addr), + }, nil + }) + } -func (c *PreimageOracleContract) Addr() common.Address { +func (c *PreimageOracleContractLatest) Addr() common.Address { return c.addr } -func (c *PreimageOracleContract) AddGlobalDataTx(data *types.PreimageOracleData) (txmgr.TxCandidate, error) { +func (c *PreimageOracleContractLatest) AddGlobalDataTx(data *types.PreimageOracleData) (txmgr.TxCandidate, error) { if len(data.OracleKey) == 0 { return txmgr.TxCandidate{}, ErrInvalidPreimageKey } @@ -121,6 +136,7 @@ func (c *PreimageOracleContract) AddGlobalDataTx(data *types.PreimageOracleData) call := c.contract.Call(methodLoadPrecompilePreimagePart, new(big.Int).SetUint64(uint64(data.OracleOffset)), data.GetPrecompileAddress(), + data.GetPrecompileRequiredGas(), data.GetPrecompileInput()) return call.ToTxCandidate() default: @@ -128,18 +144,27 @@ func (c *PreimageOracleContract) AddGlobalDataTx(data *types.PreimageOracleData) } } -func (c *PreimageOracleContract) InitLargePreimage(uuid *big.Int, partOffset uint32, claimedSize uint32) (txmgr.TxCandidate, error) { +func (c *PreimageOracleContractLatest) InitLargePreimage(uuid *big.Int, partOffset uint32, claimedSize uint32) (txmgr.TxCandidate, error) { + bond, err := c.GetMinBondLPP(context.Background()) + if err != nil { + return txmgr.TxCandidate{}, fmt.Errorf("failed to get min bond for large preimage proposal: %w", err) + } call := c.contract.Call(methodInitLPP, uuid, partOffset, claimedSize) - return call.ToTxCandidate() + candidate, err := call.ToTxCandidate() + if err != nil { + return txmgr.TxCandidate{}, fmt.Errorf("failed to create initLPP tx candidate: %w", err) + } + candidate.Value = bond + return candidate, nil } -func (c *PreimageOracleContract) AddLeaves(uuid *big.Int, startingBlockIndex *big.Int, input []byte, commitments []common.Hash, finalize bool) (txmgr.TxCandidate, error) { +func (c *PreimageOracleContractLatest) AddLeaves(uuid *big.Int, startingBlockIndex *big.Int, input []byte, commitments []common.Hash, finalize bool) (txmgr.TxCandidate, error) { call := c.contract.Call(methodAddLeavesLPP, uuid, startingBlockIndex, input, commitments, finalize) return call.ToTxCandidate() } // MinLargePreimageSize returns the minimum size of a large preimage. -func (c *PreimageOracleContract) MinLargePreimageSize(ctx context.Context) (uint64, error) { +func (c *PreimageOracleContractLatest) MinLargePreimageSize(ctx context.Context) (uint64, error) { result, err := c.multiCaller.SingleCall(ctx, rpcblock.Latest, c.contract.Call(methodMinProposalSize)) if err != nil { return 0, fmt.Errorf("failed to fetch min lpp size bytes: %w", err) @@ -148,7 +173,7 @@ func (c *PreimageOracleContract) MinLargePreimageSize(ctx context.Context) (uint } // ChallengePeriod returns the challenge period for large preimages. -func (c *PreimageOracleContract) ChallengePeriod(ctx context.Context) (uint64, error) { +func (c *PreimageOracleContractLatest) ChallengePeriod(ctx context.Context) (uint64, error) { if period := c.challengePeriod.Load(); period != 0 { return period, nil } @@ -161,7 +186,7 @@ func (c *PreimageOracleContract) ChallengePeriod(ctx context.Context) (uint64, e return period, nil } -func (c *PreimageOracleContract) CallSqueeze( +func (c *PreimageOracleContractLatest) CallSqueeze( ctx context.Context, claimant common.Address, uuid *big.Int, @@ -179,7 +204,7 @@ func (c *PreimageOracleContract) CallSqueeze( return nil } -func (c *PreimageOracleContract) Squeeze( +func (c *PreimageOracleContractLatest) Squeeze( claimant common.Address, uuid *big.Int, prestateMatrix keccakTypes.StateSnapshot, @@ -205,7 +230,7 @@ func abiEncodeSnapshot(packedState keccakTypes.StateSnapshot) libKeccakStateMatr return libKeccakStateMatrix{State: packedState} } -func (c *PreimageOracleContract) GetActivePreimages(ctx context.Context, blockHash common.Hash) ([]keccakTypes.LargePreimageMetaData, error) { +func (c *PreimageOracleContractLatest) GetActivePreimages(ctx context.Context, blockHash common.Hash) ([]keccakTypes.LargePreimageMetaData, error) { block := rpcblock.ByHash(blockHash) results, err := batching.ReadArray(ctx, c.multiCaller, block, c.contract.Call(methodProposalCount), func(i *big.Int) *batching.ContractCall { return c.contract.Call(methodProposals, i) @@ -222,7 +247,7 @@ func (c *PreimageOracleContract) GetActivePreimages(ctx context.Context, blockHa return c.GetProposalMetadata(ctx, block, idents...) } -func (c *PreimageOracleContract) GetProposalMetadata(ctx context.Context, block rpcblock.Block, idents ...keccakTypes.LargePreimageIdent) ([]keccakTypes.LargePreimageMetaData, error) { +func (c *PreimageOracleContractLatest) GetProposalMetadata(ctx context.Context, block rpcblock.Block, idents ...keccakTypes.LargePreimageIdent) ([]keccakTypes.LargePreimageMetaData, error) { var calls []batching.Call for _, ident := range idents { calls = append(calls, c.contract.Call(methodProposalMetadata, ident.Claimant, ident.UUID)) @@ -247,7 +272,7 @@ func (c *PreimageOracleContract) GetProposalMetadata(ctx context.Context, block return proposals, nil } -func (c *PreimageOracleContract) GetProposalTreeRoot(ctx context.Context, block rpcblock.Block, ident keccakTypes.LargePreimageIdent) (common.Hash, error) { +func (c *PreimageOracleContractLatest) GetProposalTreeRoot(ctx context.Context, block rpcblock.Block, ident keccakTypes.LargePreimageIdent) (common.Hash, error) { call := c.contract.Call(methodGetTreeRootLPP, ident.Claimant, ident.UUID) result, err := c.multiCaller.SingleCall(ctx, block, call) if err != nil { @@ -256,7 +281,7 @@ func (c *PreimageOracleContract) GetProposalTreeRoot(ctx context.Context, block return result.GetHash(0), nil } -func (c *PreimageOracleContract) GetInputDataBlocks(ctx context.Context, block rpcblock.Block, ident keccakTypes.LargePreimageIdent) ([]uint64, error) { +func (c *PreimageOracleContractLatest) GetInputDataBlocks(ctx context.Context, block rpcblock.Block, ident keccakTypes.LargePreimageIdent) ([]uint64, error) { results, err := batching.ReadArray(ctx, c.multiCaller, block, c.contract.Call(methodProposalBlocksLen, ident.Claimant, ident.UUID), func(i *big.Int) *batching.ContractCall { @@ -276,7 +301,7 @@ func (c *PreimageOracleContract) GetInputDataBlocks(ctx context.Context, block r // An [ErrInvalidAddLeavesCall] error is returned if the call is not a valid call to addLeavesLPP. // Otherwise, the uuid and input data is returned. The raw data supplied is returned so long as it can be parsed. // Specifically the length of the input data is not validated to ensure it is consistent with the number of commitments. -func (c *PreimageOracleContract) DecodeInputData(data []byte) (*big.Int, keccakTypes.InputData, error) { +func (c *PreimageOracleContractLatest) DecodeInputData(data []byte) (*big.Int, keccakTypes.InputData, error) { method, args, err := c.contract.DecodeCall(data) if errors.Is(err, batching.ErrUnknownMethod) { return nil, keccakTypes.InputData{}, ErrInvalidAddLeavesCall @@ -303,7 +328,7 @@ func (c *PreimageOracleContract) DecodeInputData(data []byte) (*big.Int, keccakT }, nil } -func (c *PreimageOracleContract) GlobalDataExists(ctx context.Context, data *types.PreimageOracleData) (bool, error) { +func (c *PreimageOracleContractLatest) GlobalDataExists(ctx context.Context, data *types.PreimageOracleData) (bool, error) { call := c.contract.Call(methodPreimagePartOk, common.Hash(data.OracleKey), new(big.Int).SetUint64(uint64(data.OracleOffset))) results, err := c.multiCaller.SingleCall(ctx, rpcblock.Latest, call) if err != nil { @@ -312,7 +337,7 @@ func (c *PreimageOracleContract) GlobalDataExists(ctx context.Context, data *typ return results.GetBool(0), nil } -func (c *PreimageOracleContract) ChallengeTx(ident keccakTypes.LargePreimageIdent, challenge keccakTypes.Challenge) (txmgr.TxCandidate, error) { +func (c *PreimageOracleContractLatest) ChallengeTx(ident keccakTypes.LargePreimageIdent, challenge keccakTypes.Challenge) (txmgr.TxCandidate, error) { var call *batching.ContractCall if challenge.Prestate == (keccakTypes.Leaf{}) { call = c.contract.Call( @@ -335,7 +360,7 @@ func (c *PreimageOracleContract) ChallengeTx(ident keccakTypes.LargePreimageIden return call.ToTxCandidate() } -func (c *PreimageOracleContract) GetMinBondLPP(ctx context.Context) (*big.Int, error) { +func (c *PreimageOracleContractLatest) GetMinBondLPP(ctx context.Context) (*big.Int, error) { if bondSize := c.minBondSizeLPP.Load(); bondSize != 0 { return big.NewInt(int64(bondSize)), nil } @@ -348,7 +373,7 @@ func (c *PreimageOracleContract) GetMinBondLPP(ctx context.Context) (*big.Int, e return period, nil } -func (c *PreimageOracleContract) decodePreimageIdent(result *batching.CallResult) keccakTypes.LargePreimageIdent { +func (c *PreimageOracleContractLatest) decodePreimageIdent(result *batching.CallResult) keccakTypes.LargePreimageIdent { return keccakTypes.LargePreimageIdent{ Claimant: result.GetAddress(0), UUID: result.GetBigInt(1), @@ -419,3 +444,39 @@ func (m *metadata) setCountered(value bool) { func (m *metadata) countered() bool { return binary.BigEndian.Uint64(m[24:32]) != 0 } + +type PreimageOracleContract interface { + Addr() common.Address + AddGlobalDataTx(data *types.PreimageOracleData) (txmgr.TxCandidate, error) + InitLargePreimage(uuid *big.Int, partOffset uint32, claimedSize uint32) (txmgr.TxCandidate, error) + AddLeaves(uuid *big.Int, startingBlockIndex *big.Int, input []byte, commitments []common.Hash, finalize bool) (txmgr.TxCandidate, error) + MinLargePreimageSize(ctx context.Context) (uint64, error) + ChallengePeriod(ctx context.Context) (uint64, error) + CallSqueeze( + ctx context.Context, + claimant common.Address, + uuid *big.Int, + prestateMatrix keccakTypes.StateSnapshot, + preState keccakTypes.Leaf, + preStateProof merkle.Proof, + postState keccakTypes.Leaf, + postStateProof merkle.Proof, + ) error + Squeeze( + claimant common.Address, + uuid *big.Int, + prestateMatrix keccakTypes.StateSnapshot, + preState keccakTypes.Leaf, + preStateProof merkle.Proof, + postState keccakTypes.Leaf, + postStateProof merkle.Proof, + ) (txmgr.TxCandidate, error) + GetActivePreimages(ctx context.Context, blockHash common.Hash) ([]keccakTypes.LargePreimageMetaData, error) + GetProposalMetadata(ctx context.Context, block rpcblock.Block, idents ...keccakTypes.LargePreimageIdent) ([]keccakTypes.LargePreimageMetaData, error) + GetProposalTreeRoot(ctx context.Context, block rpcblock.Block, ident keccakTypes.LargePreimageIdent) (common.Hash, error) + GetInputDataBlocks(ctx context.Context, block rpcblock.Block, ident keccakTypes.LargePreimageIdent) ([]uint64, error) + DecodeInputData(data []byte) (*big.Int, keccakTypes.InputData, error) + GlobalDataExists(ctx context.Context, data *types.PreimageOracleData) (bool, error) + ChallengeTx(ident keccakTypes.LargePreimageIdent, challenge keccakTypes.Challenge) (txmgr.TxCandidate, error) + GetMinBondLPP(ctx context.Context) (*big.Int, error) +} diff --git a/op-challenger/game/fault/contracts/oracle100.go b/op-challenger/game/fault/contracts/oracle100.go new file mode 100644 index 000000000000..beed7011d54f --- /dev/null +++ b/op-challenger/game/fault/contracts/oracle100.go @@ -0,0 +1,30 @@ +package contracts + +import ( + _ "embed" + "math/big" + + "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/txmgr" + "github.com/ethereum/go-ethereum/common" +) + +//go:embed abis/PreimageOracle-1.0.0.json +var preimageOracleAbi100 []byte + +type PreimageOracleContract100 struct { + PreimageOracleContractLatest +} + +func (c *PreimageOracleContract100) AddGlobalDataTx(data *types.PreimageOracleData) (txmgr.TxCandidate, error) { + if len(data.OracleKey) == 0 || preimage.KeyType(data.OracleKey[0]) != preimage.PrecompileKeyType { + return c.PreimageOracleContractLatest.AddGlobalDataTx(data) + } + inputs := data.GetPreimageWithoutSize() + call := c.contract.Call(methodLoadPrecompilePreimagePart, + new(big.Int).SetUint64(uint64(data.OracleOffset)), + common.BytesToAddress(inputs[0:20]), + inputs[20:]) + return call.ToTxCandidate() +} diff --git a/op-challenger/game/fault/contracts/oracle_test.go b/op-challenger/game/fault/contracts/oracle_test.go index 480d738bd478..9989d7beb482 100644 --- a/op-challenger/game/fault/contracts/oracle_test.go +++ b/op-challenger/game/fault/contracts/oracle_test.go @@ -17,269 +17,367 @@ import ( 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/accounts/abi" "github.com/ethereum/go-ethereum/common" "github.com/stretchr/testify/require" ) +const ( + oracle100 = "1.0.0" + oracleLatest = "1.1.0" +) + +var oracleVersions = []contractVersion{ + { + version: oracle100, + loadAbi: func() *abi.ABI { + return mustParseAbi(preimageOracleAbi100) + }, + }, + { + version: oracleLatest, + loadAbi: snapshots.LoadPreimageOracleABI, + }, +} + func TestPreimageOracleContract_AddGlobalDataTx(t *testing.T) { - t.Run("UnknownType", func(t *testing.T) { - _, oracle := setupPreimageOracleTest(t) - data := types.NewPreimageOracleData(common.Hash{0xcc}.Bytes(), make([]byte, 20), uint32(545)) - _, err := oracle.AddGlobalDataTx(data) - require.ErrorIs(t, err, ErrUnsupportedKeyType) - }) - - t.Run("Keccak256", func(t *testing.T) { - stubRpc, oracle := setupPreimageOracleTest(t) - data := types.NewPreimageOracleData(common.Hash{byte(preimage.Keccak256KeyType), 0xcc}.Bytes(), make([]byte, 20), uint32(545)) - stubRpc.SetResponse(oracleAddr, methodLoadKeccak256PreimagePart, rpcblock.Latest, []interface{}{ - new(big.Int).SetUint64(uint64(data.OracleOffset)), - data.GetPreimageWithoutSize(), - }, nil) - - tx, err := oracle.AddGlobalDataTx(data) - require.NoError(t, err) - stubRpc.VerifyTxCandidate(tx) - }) - - t.Run("Sha256", func(t *testing.T) { - stubRpc, oracle := setupPreimageOracleTest(t) - data := types.NewPreimageOracleData(common.Hash{byte(preimage.Sha256KeyType), 0xcc}.Bytes(), make([]byte, 20), uint32(545)) - stubRpc.SetResponse(oracleAddr, methodLoadSha256PreimagePart, rpcblock.Latest, []interface{}{ - new(big.Int).SetUint64(uint64(data.OracleOffset)), - data.GetPreimageWithoutSize(), - }, nil) - - tx, err := oracle.AddGlobalDataTx(data) - require.NoError(t, err) - stubRpc.VerifyTxCandidate(tx) - }) - - t.Run("Blob", func(t *testing.T) { - stubRpc, oracle := setupPreimageOracleTest(t) - fieldData := testutils.RandomData(rand.New(rand.NewSource(23)), 32) - data := types.NewPreimageOracleData(common.Hash{byte(preimage.BlobKeyType), 0xcc}.Bytes(), fieldData, uint32(545)) - stubRpc.SetResponse(oracleAddr, methodLoadBlobPreimagePart, rpcblock.Latest, []interface{}{ - new(big.Int).SetUint64(data.BlobFieldIndex), - new(big.Int).SetBytes(data.GetPreimageWithoutSize()), - data.BlobCommitment, - data.BlobProof, - new(big.Int).SetUint64(uint64(data.OracleOffset)), - }, nil) - - tx, err := oracle.AddGlobalDataTx(data) - require.NoError(t, err) - stubRpc.VerifyTxCandidate(tx) - }) - - t.Run("Precompile", func(t *testing.T) { - stubRpc, oracle := setupPreimageOracleTest(t) - input := testutils.RandomData(rand.New(rand.NewSource(23)), 200) - data := types.NewPreimageOracleData(common.Hash{byte(preimage.PrecompileKeyType), 0xcc}.Bytes(), input, uint32(545)) - stubRpc.SetResponse(oracleAddr, methodLoadPrecompilePreimagePart, rpcblock.Latest, []interface{}{ - new(big.Int).SetUint64(uint64(data.OracleOffset)), - data.GetPrecompileAddress(), - data.GetPrecompileInput(), - }, nil) - - tx, err := oracle.AddGlobalDataTx(data) - require.NoError(t, err) - stubRpc.VerifyTxCandidate(tx) - }) + for _, version := range oracleVersions { + version := version + t.Run(version.version, func(t *testing.T) { + + t.Run("UnknownType", func(t *testing.T) { + _, oracle := setupPreimageOracleTest(t, version) + data := types.NewPreimageOracleData(common.Hash{0xcc}.Bytes(), make([]byte, 20), uint32(545)) + _, err := oracle.AddGlobalDataTx(data) + require.ErrorIs(t, err, ErrUnsupportedKeyType) + }) + + t.Run("Keccak256", func(t *testing.T) { + stubRpc, oracle := setupPreimageOracleTest(t, version) + data := types.NewPreimageOracleData(common.Hash{byte(preimage.Keccak256KeyType), 0xcc}.Bytes(), make([]byte, 20), uint32(545)) + stubRpc.SetResponse(oracleAddr, methodLoadKeccak256PreimagePart, rpcblock.Latest, []interface{}{ + new(big.Int).SetUint64(uint64(data.OracleOffset)), + data.GetPreimageWithoutSize(), + }, nil) + + tx, err := oracle.AddGlobalDataTx(data) + require.NoError(t, err) + stubRpc.VerifyTxCandidate(tx) + }) + + t.Run("Sha256", func(t *testing.T) { + stubRpc, oracle := setupPreimageOracleTest(t, version) + data := types.NewPreimageOracleData(common.Hash{byte(preimage.Sha256KeyType), 0xcc}.Bytes(), make([]byte, 20), uint32(545)) + stubRpc.SetResponse(oracleAddr, methodLoadSha256PreimagePart, rpcblock.Latest, []interface{}{ + new(big.Int).SetUint64(uint64(data.OracleOffset)), + data.GetPreimageWithoutSize(), + }, nil) + + tx, err := oracle.AddGlobalDataTx(data) + require.NoError(t, err) + stubRpc.VerifyTxCandidate(tx) + }) + + t.Run("Blob", func(t *testing.T) { + stubRpc, oracle := setupPreimageOracleTest(t, version) + fieldData := testutils.RandomData(rand.New(rand.NewSource(23)), 32) + data := types.NewPreimageOracleData(common.Hash{byte(preimage.BlobKeyType), 0xcc}.Bytes(), fieldData, uint32(545)) + stubRpc.SetResponse(oracleAddr, methodLoadBlobPreimagePart, rpcblock.Latest, []interface{}{ + new(big.Int).SetUint64(data.BlobFieldIndex), + new(big.Int).SetBytes(data.GetPreimageWithoutSize()), + data.BlobCommitment, + data.BlobProof, + new(big.Int).SetUint64(uint64(data.OracleOffset)), + }, nil) + + tx, err := oracle.AddGlobalDataTx(data) + require.NoError(t, err) + stubRpc.VerifyTxCandidate(tx) + }) + + t.Run("Precompile", func(t *testing.T) { + stubRpc, oracle := setupPreimageOracleTest(t, version) + input := testutils.RandomData(rand.New(rand.NewSource(23)), 200) + data := types.NewPreimageOracleData(common.Hash{byte(preimage.PrecompileKeyType), 0xcc}.Bytes(), input, uint32(545)) + if version.Is(oracle100) { + keyData := data.GetPreimageWithoutSize() + stubRpc.SetResponse(oracleAddr, methodLoadPrecompilePreimagePart, rpcblock.Latest, []interface{}{ + new(big.Int).SetUint64(uint64(data.OracleOffset)), + common.BytesToAddress(keyData[0:20]), + keyData[20:], + }, nil) + } else { + stubRpc.SetResponse(oracleAddr, methodLoadPrecompilePreimagePart, rpcblock.Latest, []interface{}{ + new(big.Int).SetUint64(uint64(data.OracleOffset)), + data.GetPrecompileAddress(), + data.GetPrecompileRequiredGas(), + data.GetPrecompileInput(), + }, nil) + } + + tx, err := oracle.AddGlobalDataTx(data) + require.NoError(t, err) + stubRpc.VerifyTxCandidate(tx) + }) + }) + } } func TestPreimageOracleContract_ChallengePeriod(t *testing.T) { - stubRpc, oracle := setupPreimageOracleTest(t) - stubRpc.SetResponse(oracleAddr, methodChallengePeriod, rpcblock.Latest, - []interface{}{}, - []interface{}{big.NewInt(123)}, - ) - challengePeriod, err := oracle.ChallengePeriod(context.Background()) - require.NoError(t, err) - require.Equal(t, uint64(123), challengePeriod) - - // Should cache responses - stubRpc.ClearResponses() - challengePeriod, err = oracle.ChallengePeriod(context.Background()) - require.NoError(t, err) - require.Equal(t, uint64(123), challengePeriod) + for _, version := range oracleVersions { + version := version + t.Run(version.version, func(t *testing.T) { + + stubRpc, oracle := setupPreimageOracleTest(t, version) + stubRpc.SetResponse(oracleAddr, methodChallengePeriod, rpcblock.Latest, + []interface{}{}, + []interface{}{big.NewInt(123)}, + ) + challengePeriod, err := oracle.ChallengePeriod(context.Background()) + require.NoError(t, err) + require.Equal(t, uint64(123), challengePeriod) + + // Should cache responses + stubRpc.ClearResponses() + challengePeriod, err = oracle.ChallengePeriod(context.Background()) + require.NoError(t, err) + require.Equal(t, uint64(123), challengePeriod) + }) + } } func TestPreimageOracleContract_MinLargePreimageSize(t *testing.T) { - stubRpc, oracle := setupPreimageOracleTest(t) - stubRpc.SetResponse(oracleAddr, methodMinProposalSize, rpcblock.Latest, - []interface{}{}, - []interface{}{big.NewInt(123)}, - ) - minProposalSize, err := oracle.MinLargePreimageSize(context.Background()) - require.NoError(t, err) - require.Equal(t, uint64(123), minProposalSize) + for _, version := range oracleVersions { + version := version + t.Run(version.version, func(t *testing.T) { + + stubRpc, oracle := setupPreimageOracleTest(t, version) + stubRpc.SetResponse(oracleAddr, methodMinProposalSize, rpcblock.Latest, + []interface{}{}, + []interface{}{big.NewInt(123)}, + ) + minProposalSize, err := oracle.MinLargePreimageSize(context.Background()) + require.NoError(t, err) + require.Equal(t, uint64(123), minProposalSize) + }) + } } func TestPreimageOracleContract_MinBondSizeLPP(t *testing.T) { - stubRpc, oracle := setupPreimageOracleTest(t) - stubRpc.SetResponse(oracleAddr, methodMinBondSizeLPP, rpcblock.Latest, - []interface{}{}, - []interface{}{big.NewInt(123)}, - ) - minBond, err := oracle.GetMinBondLPP(context.Background()) - require.NoError(t, err) - require.Equal(t, big.NewInt(123), minBond) - - // Should cache responses - stubRpc.ClearResponses() - minBond, err = oracle.GetMinBondLPP(context.Background()) - require.NoError(t, err) - require.Equal(t, big.NewInt(123), minBond) + for _, version := range oracleVersions { + version := version + t.Run(version.version, func(t *testing.T) { + + stubRpc, oracle := setupPreimageOracleTest(t, version) + stubRpc.SetResponse(oracleAddr, methodMinBondSizeLPP, rpcblock.Latest, + []interface{}{}, + []interface{}{big.NewInt(123)}, + ) + minBond, err := oracle.GetMinBondLPP(context.Background()) + require.NoError(t, err) + require.Equal(t, big.NewInt(123), minBond) + + // Should cache responses + stubRpc.ClearResponses() + minBond, err = oracle.GetMinBondLPP(context.Background()) + require.NoError(t, err) + require.Equal(t, big.NewInt(123), minBond) + }) + } } func TestPreimageOracleContract_PreimageDataExists(t *testing.T) { - t.Run("exists", func(t *testing.T) { - stubRpc, oracle := setupPreimageOracleTest(t) - data := types.NewPreimageOracleData(common.Hash{0xcc}.Bytes(), make([]byte, 20), 545) - stubRpc.SetResponse(oracleAddr, methodPreimagePartOk, rpcblock.Latest, - []interface{}{common.Hash(data.OracleKey), new(big.Int).SetUint64(uint64(data.OracleOffset))}, - []interface{}{true}, - ) - exists, err := oracle.GlobalDataExists(context.Background(), data) - require.NoError(t, err) - require.True(t, exists) - }) - t.Run("does not exist", func(t *testing.T) { - stubRpc, oracle := setupPreimageOracleTest(t) - data := types.NewPreimageOracleData(common.Hash{0xcc}.Bytes(), make([]byte, 20), 545) - stubRpc.SetResponse(oracleAddr, methodPreimagePartOk, rpcblock.Latest, - []interface{}{common.Hash(data.OracleKey), new(big.Int).SetUint64(uint64(data.OracleOffset))}, - []interface{}{false}, - ) - exists, err := oracle.GlobalDataExists(context.Background(), data) - require.NoError(t, err) - require.False(t, exists) - }) + for _, version := range oracleVersions { + version := version + t.Run(version.version, func(t *testing.T) { + + t.Run("exists", func(t *testing.T) { + stubRpc, oracle := setupPreimageOracleTest(t, version) + data := types.NewPreimageOracleData(common.Hash{0xcc}.Bytes(), make([]byte, 20), 545) + stubRpc.SetResponse(oracleAddr, methodPreimagePartOk, rpcblock.Latest, + []interface{}{common.Hash(data.OracleKey), new(big.Int).SetUint64(uint64(data.OracleOffset))}, + []interface{}{true}, + ) + exists, err := oracle.GlobalDataExists(context.Background(), data) + require.NoError(t, err) + require.True(t, exists) + }) + t.Run("does not exist", func(t *testing.T) { + stubRpc, oracle := setupPreimageOracleTest(t, version) + data := types.NewPreimageOracleData(common.Hash{0xcc}.Bytes(), make([]byte, 20), 545) + stubRpc.SetResponse(oracleAddr, methodPreimagePartOk, rpcblock.Latest, + []interface{}{common.Hash(data.OracleKey), new(big.Int).SetUint64(uint64(data.OracleOffset))}, + []interface{}{false}, + ) + exists, err := oracle.GlobalDataExists(context.Background(), data) + require.NoError(t, err) + require.False(t, exists) + }) + }) + } } func TestPreimageOracleContract_InitLargePreimage(t *testing.T) { - stubRpc, oracle := setupPreimageOracleTest(t) - - uuid := big.NewInt(123) - partOffset := uint32(1) - claimedSize := uint32(2) - stubRpc.SetResponse(oracleAddr, methodInitLPP, rpcblock.Latest, []interface{}{ - uuid, - partOffset, - claimedSize, - }, nil) - - tx, err := oracle.InitLargePreimage(uuid, partOffset, claimedSize) - require.NoError(t, err) - stubRpc.VerifyTxCandidate(tx) + for _, version := range oracleVersions { + version := version + t.Run(version.version, func(t *testing.T) { + + stubRpc, oracle := setupPreimageOracleTest(t, version) + + uuid := big.NewInt(123) + partOffset := uint32(1) + claimedSize := uint32(2) + bond := big.NewInt(42984) + stubRpc.SetResponse(oracleAddr, methodMinBondSizeLPP, rpcblock.Latest, nil, []interface{}{bond}) + stubRpc.SetResponse(oracleAddr, methodInitLPP, rpcblock.Latest, []interface{}{ + uuid, + partOffset, + claimedSize, + }, nil) + + tx, err := oracle.InitLargePreimage(uuid, partOffset, claimedSize) + require.NoError(t, err) + stubRpc.VerifyTxCandidate(tx) + require.Truef(t, bond.Cmp(tx.Value) == 0, "Expected bond %v got %v", bond, tx.Value) + }) + } } func TestPreimageOracleContract_AddLeaves(t *testing.T) { - stubRpc, oracle := setupPreimageOracleTest(t) - - uuid := big.NewInt(123) - startingBlockIndex := big.NewInt(0) - input := []byte{0x12} - commitments := []common.Hash{{0x34}} - finalize := true - stubRpc.SetResponse(oracleAddr, methodAddLeavesLPP, rpcblock.Latest, []interface{}{ - uuid, - startingBlockIndex, - input, - commitments, - finalize, - }, nil) - - tx, err := oracle.AddLeaves(uuid, startingBlockIndex, input, commitments, finalize) - require.NoError(t, err) - stubRpc.VerifyTxCandidate(tx) + for _, version := range oracleVersions { + version := version + t.Run(version.version, func(t *testing.T) { + + stubRpc, oracle := setupPreimageOracleTest(t, version) + + uuid := big.NewInt(123) + startingBlockIndex := big.NewInt(0) + input := []byte{0x12} + commitments := []common.Hash{{0x34}} + finalize := true + stubRpc.SetResponse(oracleAddr, methodAddLeavesLPP, rpcblock.Latest, []interface{}{ + uuid, + startingBlockIndex, + input, + commitments, + finalize, + }, nil) + + tx, err := oracle.AddLeaves(uuid, startingBlockIndex, input, commitments, finalize) + require.NoError(t, err) + stubRpc.VerifyTxCandidate(tx) + }) + } } func TestPreimageOracleContract_Squeeze(t *testing.T) { - stubRpc, oracle := setupPreimageOracleTest(t) - - claimant := common.Address{0x12} - uuid := big.NewInt(123) - preStateMatrix := keccakTypes.StateSnapshot{0, 1, 2, 3, 4} - preState := keccakTypes.Leaf{ - Input: [keccakTypes.BlockSize]byte{0x12}, - Index: 123, - StateCommitment: common.Hash{0x34}, - } - preStateProof := merkle.Proof{{0x34}} - postState := keccakTypes.Leaf{ - Input: [keccakTypes.BlockSize]byte{0x34}, - Index: 456, - StateCommitment: common.Hash{0x56}, + for _, version := range oracleVersions { + version := version + t.Run(version.version, func(t *testing.T) { + + stubRpc, oracle := setupPreimageOracleTest(t, version) + + claimant := common.Address{0x12} + uuid := big.NewInt(123) + preStateMatrix := keccakTypes.StateSnapshot{0, 1, 2, 3, 4} + preState := keccakTypes.Leaf{ + Input: [keccakTypes.BlockSize]byte{0x12}, + Index: 123, + StateCommitment: common.Hash{0x34}, + } + preStateProof := merkle.Proof{{0x34}} + postState := keccakTypes.Leaf{ + Input: [keccakTypes.BlockSize]byte{0x34}, + Index: 456, + StateCommitment: common.Hash{0x56}, + } + postStateProof := merkle.Proof{{0x56}} + stubRpc.SetResponse(oracleAddr, methodSqueezeLPP, rpcblock.Latest, []interface{}{ + claimant, + uuid, + abiEncodeSnapshot(preStateMatrix), + toPreimageOracleLeaf(preState), + preStateProof, + toPreimageOracleLeaf(postState), + postStateProof, + }, nil) + + tx, err := oracle.Squeeze(claimant, uuid, preStateMatrix, preState, preStateProof, postState, postStateProof) + require.NoError(t, err) + stubRpc.VerifyTxCandidate(tx) + }) } - postStateProof := merkle.Proof{{0x56}} - stubRpc.SetResponse(oracleAddr, methodSqueezeLPP, rpcblock.Latest, []interface{}{ - claimant, - uuid, - abiEncodeSnapshot(preStateMatrix), - toPreimageOracleLeaf(preState), - preStateProof, - toPreimageOracleLeaf(postState), - postStateProof, - }, nil) - - tx, err := oracle.Squeeze(claimant, uuid, preStateMatrix, preState, preStateProof, postState, postStateProof) - require.NoError(t, err) - stubRpc.VerifyTxCandidate(tx) } func TestGetActivePreimages(t *testing.T) { - blockHash := common.Hash{0xaa} - _, oracle, proposals := setupPreimageOracleTestWithProposals(t, rpcblock.ByHash(blockHash)) - preimages, err := oracle.GetActivePreimages(context.Background(), blockHash) - require.NoError(t, err) - require.Equal(t, proposals, preimages) + for _, version := range oracleVersions { + version := version + t.Run(version.version, func(t *testing.T) { + + blockHash := common.Hash{0xaa} + _, oracle, proposals := setupPreimageOracleTestWithProposals(t, version, rpcblock.ByHash(blockHash)) + preimages, err := oracle.GetActivePreimages(context.Background(), blockHash) + require.NoError(t, err) + require.Equal(t, proposals, preimages) + }) + } } func TestGetProposalMetadata(t *testing.T) { - blockHash := common.Hash{0xaa} - block := rpcblock.ByHash(blockHash) - stubRpc, oracle, proposals := setupPreimageOracleTestWithProposals(t, block) - preimages, err := oracle.GetProposalMetadata( - context.Background(), - block, - proposals[0].LargePreimageIdent, - proposals[1].LargePreimageIdent, - proposals[2].LargePreimageIdent, - ) - require.NoError(t, err) - require.Equal(t, proposals, preimages) - - // Fetching a proposal that doesn't exist should return an empty metadata object. - ident := keccakTypes.LargePreimageIdent{Claimant: common.Address{0x12}, UUID: big.NewInt(123)} - meta := new(metadata) - stubRpc.SetResponse( - oracleAddr, - methodProposalMetadata, - block, - []interface{}{ident.Claimant, ident.UUID}, - []interface{}{meta}) - preimages, err = oracle.GetProposalMetadata(context.Background(), rpcblock.ByHash(blockHash), ident) - require.NoError(t, err) - require.Equal(t, []keccakTypes.LargePreimageMetaData{{LargePreimageIdent: ident}}, preimages) + for _, version := range oracleVersions { + version := version + t.Run(version.version, func(t *testing.T) { + + blockHash := common.Hash{0xaa} + block := rpcblock.ByHash(blockHash) + stubRpc, oracle, proposals := setupPreimageOracleTestWithProposals(t, version, block) + preimages, err := oracle.GetProposalMetadata( + context.Background(), + block, + proposals[0].LargePreimageIdent, + proposals[1].LargePreimageIdent, + proposals[2].LargePreimageIdent, + ) + require.NoError(t, err) + require.Equal(t, proposals, preimages) + + // Fetching a proposal that doesn't exist should return an empty metadata object. + ident := keccakTypes.LargePreimageIdent{Claimant: common.Address{0x12}, UUID: big.NewInt(123)} + meta := new(metadata) + stubRpc.SetResponse( + oracleAddr, + methodProposalMetadata, + block, + []interface{}{ident.Claimant, ident.UUID}, + []interface{}{meta}) + preimages, err = oracle.GetProposalMetadata(context.Background(), rpcblock.ByHash(blockHash), ident) + require.NoError(t, err) + require.Equal(t, []keccakTypes.LargePreimageMetaData{{LargePreimageIdent: ident}}, preimages) + }) + } } func TestGetProposalTreeRoot(t *testing.T) { - blockHash := common.Hash{0xaa} - expectedRoot := common.Hash{0xbb} - ident := keccakTypes.LargePreimageIdent{Claimant: common.Address{0x12}, UUID: big.NewInt(123)} - stubRpc, oracle := setupPreimageOracleTest(t) - stubRpc.SetResponse(oracleAddr, methodGetTreeRootLPP, rpcblock.ByHash(blockHash), - []interface{}{ident.Claimant, ident.UUID}, - []interface{}{expectedRoot}) - actualRoot, err := oracle.GetProposalTreeRoot(context.Background(), rpcblock.ByHash(blockHash), ident) - require.NoError(t, err) - require.Equal(t, expectedRoot, actualRoot) + for _, version := range oracleVersions { + version := version + t.Run(version.version, func(t *testing.T) { + + blockHash := common.Hash{0xaa} + expectedRoot := common.Hash{0xbb} + ident := keccakTypes.LargePreimageIdent{Claimant: common.Address{0x12}, UUID: big.NewInt(123)} + stubRpc, oracle := setupPreimageOracleTest(t, version) + stubRpc.SetResponse(oracleAddr, methodGetTreeRootLPP, rpcblock.ByHash(blockHash), + []interface{}{ident.Claimant, ident.UUID}, + []interface{}{expectedRoot}) + actualRoot, err := oracle.GetProposalTreeRoot(context.Background(), rpcblock.ByHash(blockHash), ident) + require.NoError(t, err) + require.Equal(t, expectedRoot, actualRoot) + }) + } } -func setupPreimageOracleTestWithProposals(t *testing.T, block rpcblock.Block) (*batchingTest.AbiBasedRpc, *PreimageOracleContract, []keccakTypes.LargePreimageMetaData) { - stubRpc, oracle := setupPreimageOracleTest(t) +func setupPreimageOracleTestWithProposals(t *testing.T, version contractVersion, block rpcblock.Block) (*batchingTest.AbiBasedRpc, PreimageOracleContract, []keccakTypes.LargePreimageMetaData) { + stubRpc, oracle := setupPreimageOracleTest(t, version) stubRpc.SetResponse( oracleAddr, methodProposalCount, @@ -354,11 +452,11 @@ func setupPreimageOracleTestWithProposals(t *testing.T, block rpcblock.Block) (* return stubRpc, oracle, proposals } -func setupPreimageOracleTest(t *testing.T) (*batchingTest.AbiBasedRpc, *PreimageOracleContract) { - oracleAbi := snapshots.LoadPreimageOracleABI() - - stubRpc := batchingTest.NewAbiBasedRpc(t, oracleAddr, oracleAbi) - oracleContract := NewPreimageOracleContract(oracleAddr, batching.NewMultiCaller(stubRpc, batching.DefaultBatchSize)) +func setupPreimageOracleTest(t *testing.T, version contractVersion) (*batchingTest.AbiBasedRpc, PreimageOracleContract) { + stubRpc := batchingTest.NewAbiBasedRpc(t, oracleAddr, version.loadAbi()) + stubRpc.SetResponse(oracleAddr, methodVersion, rpcblock.Latest, nil, []interface{}{version.version}) + oracleContract, err := NewPreimageOracleContract(context.Background(), oracleAddr, batching.NewMultiCaller(stubRpc, batching.DefaultBatchSize)) + require.NoError(t, err) return stubRpc, oracleContract } @@ -393,68 +491,93 @@ func TestMetadata(t *testing.T) { } for _, test := range tests { test := test - for _, value := range uint32Values { - value := value - t.Run(fmt.Sprintf("%v-%v", test.name, value), func(t *testing.T) { - meta := new(metadata) - require.Zero(t, test.getter(meta)) - test.setter(meta, value) - require.Equal(t, value, test.getter(meta)) + + for _, version := range oracleVersions { + version := version + t.Run(version.version, func(t *testing.T) { + + for _, value := range uint32Values { + value := value + t.Run(fmt.Sprintf("%v-%v", test.name, value), func(t *testing.T) { + meta := new(metadata) + require.Zero(t, test.getter(meta)) + test.setter(meta, value) + require.Equal(t, value, test.getter(meta)) + }) + } }) } } } func TestMetadata_Timestamp(t *testing.T) { - values := []uint64{0, 1, 2, 3252354, math.MaxUint32, math.MaxUint32 + 1, math.MaxUint64} - var meta metadata - require.Zero(t, meta.timestamp()) - for _, value := range values { - meta.setTimestamp(value) - require.Equal(t, value, meta.timestamp()) + for _, version := range oracleVersions { + version := version + t.Run(version.version, func(t *testing.T) { + + values := []uint64{0, 1, 2, 3252354, math.MaxUint32, math.MaxUint32 + 1, math.MaxUint64} + var meta metadata + require.Zero(t, meta.timestamp()) + for _, value := range values { + meta.setTimestamp(value) + require.Equal(t, value, meta.timestamp()) + } + }) } } func TestMetadata_Countered(t *testing.T) { - var meta metadata - require.False(t, meta.countered()) - meta.setCountered(true) - require.True(t, meta.countered()) - meta.setCountered(false) - require.False(t, meta.countered()) + for _, version := range oracleVersions { + version := version + t.Run(version.version, func(t *testing.T) { + + var meta metadata + require.False(t, meta.countered()) + meta.setCountered(true) + require.True(t, meta.countered()) + meta.setCountered(false) + require.False(t, meta.countered()) + }) + } } func TestGetInputDataBlocks(t *testing.T) { - stubRpc, oracle := setupPreimageOracleTest(t) - block := rpcblock.ByHash(common.Hash{0xaa}) + for _, version := range oracleVersions { + version := version + t.Run(version.version, func(t *testing.T) { - preimage := keccakTypes.LargePreimageIdent{ - Claimant: common.Address{0xbb}, - UUID: big.NewInt(2222), - } + stubRpc, oracle := setupPreimageOracleTest(t, version) + block := rpcblock.ByHash(common.Hash{0xaa}) - stubRpc.SetResponse( - oracleAddr, - methodProposalBlocksLen, - block, - []interface{}{preimage.Claimant, preimage.UUID}, - []interface{}{big.NewInt(3)}) + preimage := keccakTypes.LargePreimageIdent{ + Claimant: common.Address{0xbb}, + UUID: big.NewInt(2222), + } - blockNums := []uint64{10, 35, 67} + stubRpc.SetResponse( + oracleAddr, + methodProposalBlocksLen, + block, + []interface{}{preimage.Claimant, preimage.UUID}, + []interface{}{big.NewInt(3)}) + + blockNums := []uint64{10, 35, 67} + + for i, blockNum := range blockNums { + stubRpc.SetResponse( + oracleAddr, + methodProposalBlocks, + block, + []interface{}{preimage.Claimant, preimage.UUID, big.NewInt(int64(i))}, + []interface{}{blockNum}) + } - for i, blockNum := range blockNums { - stubRpc.SetResponse( - oracleAddr, - methodProposalBlocks, - block, - []interface{}{preimage.Claimant, preimage.UUID, big.NewInt(int64(i))}, - []interface{}{blockNum}) + actual, err := oracle.GetInputDataBlocks(context.Background(), block, preimage) + require.NoError(t, err) + require.Len(t, actual, 3) + require.Equal(t, blockNums, actual) + }) } - - actual, err := oracle.GetInputDataBlocks(context.Background(), block, preimage) - require.NoError(t, err) - require.Len(t, actual, 3) - require.Equal(t, blockNums, actual) } func TestDecodeInputData(t *testing.T) { @@ -469,7 +592,6 @@ func TestDecodeInputData(t *testing.T) { Claimant: common.Address{0xaa}, UUID: big.NewInt(1111), } - _, oracle := setupPreimageOracleTest(t) tests := []struct { name string @@ -550,106 +672,125 @@ func TestDecodeInputData(t *testing.T) { } for _, test := range tests { test := test - t.Run(test.name, func(t *testing.T) { - var input []byte - if len(test.input) > 0 { - input = test.input - } else { - input = toAddLeavesTxData(t, oracle, ident.UUID, test.inputData) - } - require.Equal(t, test.expectedTxData, common.Bytes2Hex(input), - "ABI has been changed. Add tests to ensure historic transactions can be parsed before updating expectedTxData") - uuid, leaves, err := oracle.DecodeInputData(input) - if test.expectedErr != nil { - require.ErrorIs(t, err, test.expectedErr) - } else { - require.NoError(t, err) - require.Equal(t, ident.UUID, uuid) - require.Equal(t, test.inputData, leaves) - } - }) + for _, version := range oracleVersions { + version := version + t.Run(version.version, func(t *testing.T) { + + t.Run(test.name, func(t *testing.T) { + _, oracle := setupPreimageOracleTest(t, version) + var input []byte + if len(test.input) > 0 { + input = test.input + } else { + input = toAddLeavesTxData(t, oracle, ident.UUID, test.inputData) + } + require.Equal(t, test.expectedTxData, common.Bytes2Hex(input), + "ABI has been changed. Add tests to ensure historic transactions can be parsed before updating expectedTxData") + uuid, leaves, err := oracle.DecodeInputData(input) + if test.expectedErr != nil { + require.ErrorIs(t, err, test.expectedErr) + } else { + require.NoError(t, err) + require.Equal(t, ident.UUID, uuid) + require.Equal(t, test.inputData, leaves) + } + }) + }) + } } } func TestChallenge_First(t *testing.T) { - stubRpc, oracle := setupPreimageOracleTest(t) + for _, version := range oracleVersions { + version := version + t.Run(version.version, func(t *testing.T) { - ident := keccakTypes.LargePreimageIdent{ - Claimant: common.Address{0xab}, - UUID: big.NewInt(4829), - } - challenge := keccakTypes.Challenge{ - StateMatrix: keccakTypes.StateSnapshot{1, 2, 3, 4, 5}, - Prestate: keccakTypes.Leaf{}, - Poststate: keccakTypes.Leaf{ - Input: [136]byte{5, 4, 3, 2, 1}, - Index: 0, - StateCommitment: common.Hash{0xbb}, - }, - PoststateProof: merkle.Proof{common.Hash{0x01}, common.Hash{0x02}}, + stubRpc, oracle := setupPreimageOracleTest(t, version) + + ident := keccakTypes.LargePreimageIdent{ + Claimant: common.Address{0xab}, + UUID: big.NewInt(4829), + } + challenge := keccakTypes.Challenge{ + StateMatrix: keccakTypes.StateSnapshot{1, 2, 3, 4, 5}, + Prestate: keccakTypes.Leaf{}, + Poststate: keccakTypes.Leaf{ + Input: [136]byte{5, 4, 3, 2, 1}, + Index: 0, + StateCommitment: common.Hash{0xbb}, + }, + PoststateProof: merkle.Proof{common.Hash{0x01}, common.Hash{0x02}}, + } + stubRpc.SetResponse(oracleAddr, methodChallengeFirstLPP, rpcblock.Latest, + []interface{}{ + ident.Claimant, ident.UUID, + preimageOracleLeaf{ + Input: challenge.Poststate.Input[:], + Index: new(big.Int).SetUint64(challenge.Poststate.Index), + StateCommitment: challenge.Poststate.StateCommitment, + }, + challenge.PoststateProof, + }, + nil) + tx, err := oracle.ChallengeTx(ident, challenge) + require.NoError(t, err) + stubRpc.VerifyTxCandidate(tx) + }) } - stubRpc.SetResponse(oracleAddr, methodChallengeFirstLPP, rpcblock.Latest, - []interface{}{ - ident.Claimant, ident.UUID, - preimageOracleLeaf{ - Input: challenge.Poststate.Input[:], - Index: new(big.Int).SetUint64(challenge.Poststate.Index), - StateCommitment: challenge.Poststate.StateCommitment, - }, - challenge.PoststateProof, - }, - nil) - tx, err := oracle.ChallengeTx(ident, challenge) - require.NoError(t, err) - stubRpc.VerifyTxCandidate(tx) } func TestChallenge_NotFirst(t *testing.T) { - stubRpc, oracle := setupPreimageOracleTest(t) + for _, version := range oracleVersions { + version := version + t.Run(version.version, func(t *testing.T) { - ident := keccakTypes.LargePreimageIdent{ - Claimant: common.Address{0xab}, - UUID: big.NewInt(4829), - } - challenge := keccakTypes.Challenge{ - StateMatrix: keccakTypes.StateSnapshot{1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, 21, 22, 23, 24, 25}, - Prestate: keccakTypes.Leaf{ - Input: [136]byte{9, 8, 7, 6, 5}, - Index: 3, - StateCommitment: common.Hash{0xcc}, - }, - PrestateProof: merkle.Proof{common.Hash{0x01}, common.Hash{0x02}}, - Poststate: keccakTypes.Leaf{ - Input: [136]byte{5, 4, 3, 2, 1}, - Index: 4, - StateCommitment: common.Hash{0xbb}, - }, - PoststateProof: merkle.Proof{common.Hash{0x03}, common.Hash{0x04}}, + stubRpc, oracle := setupPreimageOracleTest(t, version) + + ident := keccakTypes.LargePreimageIdent{ + Claimant: common.Address{0xab}, + UUID: big.NewInt(4829), + } + challenge := keccakTypes.Challenge{ + StateMatrix: keccakTypes.StateSnapshot{1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, 21, 22, 23, 24, 25}, + Prestate: keccakTypes.Leaf{ + Input: [136]byte{9, 8, 7, 6, 5}, + Index: 3, + StateCommitment: common.Hash{0xcc}, + }, + PrestateProof: merkle.Proof{common.Hash{0x01}, common.Hash{0x02}}, + Poststate: keccakTypes.Leaf{ + Input: [136]byte{5, 4, 3, 2, 1}, + Index: 4, + StateCommitment: common.Hash{0xbb}, + }, + PoststateProof: merkle.Proof{common.Hash{0x03}, common.Hash{0x04}}, + } + stubRpc.SetResponse(oracleAddr, methodChallengeLPP, rpcblock.Latest, + []interface{}{ + ident.Claimant, ident.UUID, + libKeccakStateMatrix{State: challenge.StateMatrix}, + preimageOracleLeaf{ + Input: challenge.Prestate.Input[:], + Index: new(big.Int).SetUint64(challenge.Prestate.Index), + StateCommitment: challenge.Prestate.StateCommitment, + }, + challenge.PrestateProof, + preimageOracleLeaf{ + Input: challenge.Poststate.Input[:], + Index: new(big.Int).SetUint64(challenge.Poststate.Index), + StateCommitment: challenge.Poststate.StateCommitment, + }, + challenge.PoststateProof, + }, + nil) + tx, err := oracle.ChallengeTx(ident, challenge) + require.NoError(t, err) + stubRpc.VerifyTxCandidate(tx) + }) } - stubRpc.SetResponse(oracleAddr, methodChallengeLPP, rpcblock.Latest, - []interface{}{ - ident.Claimant, ident.UUID, - libKeccakStateMatrix{State: challenge.StateMatrix}, - preimageOracleLeaf{ - Input: challenge.Prestate.Input[:], - Index: new(big.Int).SetUint64(challenge.Prestate.Index), - StateCommitment: challenge.Prestate.StateCommitment, - }, - challenge.PrestateProof, - preimageOracleLeaf{ - Input: challenge.Poststate.Input[:], - Index: new(big.Int).SetUint64(challenge.Poststate.Index), - StateCommitment: challenge.Poststate.StateCommitment, - }, - challenge.PoststateProof, - }, - nil) - tx, err := oracle.ChallengeTx(ident, challenge) - require.NoError(t, err) - stubRpc.VerifyTxCandidate(tx) } -func toAddLeavesTxData(t *testing.T, oracle *PreimageOracleContract, uuid *big.Int, inputData keccakTypes.InputData) []byte { +func toAddLeavesTxData(t *testing.T, oracle PreimageOracleContract, uuid *big.Int, inputData keccakTypes.InputData) []byte { tx, err := oracle.AddLeaves(uuid, big.NewInt(1), inputData.Input, inputData.Commitments, inputData.Finalize) require.NoError(t, err) return tx.TxData diff --git a/op-challenger/game/fault/contracts/versions.go b/op-challenger/game/fault/contracts/versions.go new file mode 100644 index 000000000000..0c974ed85d29 --- /dev/null +++ b/op-challenger/game/fault/contracts/versions.go @@ -0,0 +1,44 @@ +package contracts + +import ( + "context" + "fmt" + "strings" + + "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" + "github.com/ethereum/go-ethereum/common" +) + +var ( + methodVersion = "version" +) + +type version[C any] struct { + prefixes string + factory func() (C, error) +} + +type VersionedBuilder[C any] struct { + versions []version[C] +} + +func (v *VersionedBuilder[C]) AddVersion(major int, minor int, factory func() (C, error)) { + v.versions = append(v.versions, version[C]{fmt.Sprintf("%d.%d.", major, minor), factory}) +} + +func (v *VersionedBuilder[C]) Build(ctx context.Context, caller *batching.MultiCaller, contractAbi *abi.ABI, addr common.Address, defaultVersion func() (C, error)) (C, error) { + var nilC C + result, err := caller.SingleCall(ctx, rpcblock.Latest, batching.NewContractCall(contractAbi, addr, methodVersion)) + if err != nil { + return nilC, fmt.Errorf("failed to retrieve version of dispute game %v: %w", addr, err) + } + contractVersion := result.GetString(0) + for _, version := range v.versions { + if strings.HasPrefix(contractVersion, version.prefixes) { + return version.factory() + } + } + return defaultVersion() +} diff --git a/op-challenger/game/fault/contracts/versions_test.go b/op-challenger/game/fault/contracts/versions_test.go new file mode 100644 index 000000000000..93f54139caf9 --- /dev/null +++ b/op-challenger/game/fault/contracts/versions_test.go @@ -0,0 +1,49 @@ +package contracts + +import ( + "context" + "testing" + + "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/go-ethereum/common" + "github.com/stretchr/testify/require" +) + +var versionABI = `[{ + "inputs": [], + "name": "version", + "outputs": [ + { + "internalType": "string", + "name": "", + "type": "string" + } + ], + "stateMutability": "view", + "type": "function" + }]` + +func TestVersionedBuilder(t *testing.T) { + var builder VersionedBuilder[string] + builder.AddVersion(1, 1, func() (string, error) { return "v1.1", nil }) + builder.AddVersion(1, 2, func() (string, error) { return "v1.2", nil }) + + require.Equal(t, "v1.1", buildWithVersion(t, builder, "1.1.0")) + require.Equal(t, "v1.1", buildWithVersion(t, builder, "1.1.1")) + require.Equal(t, "v1.1", buildWithVersion(t, builder, "1.1.2")) + require.Equal(t, "default", buildWithVersion(t, builder, "1.10.0")) +} + +func buildWithVersion(t *testing.T, builder VersionedBuilder[string], version string) string { + addr := common.Address{0xaa} + contractABI := mustParseAbi(([]byte)(versionABI)) + stubRpc := batchingTest.NewAbiBasedRpc(t, addr, contractABI) + stubRpc.SetResponse(addr, methodVersion, rpcblock.Latest, nil, []interface{}{version}) + actual, err := builder.Build(context.Background(), batching.NewMultiCaller(stubRpc, batching.DefaultBatchSize), contractABI, addr, func() (string, error) { + return "default", nil + }) + require.NoError(t, err) + return actual +} diff --git a/op-challenger/game/fault/contracts/vm.go b/op-challenger/game/fault/contracts/vm.go index 1d1e22632cfe..1960fb414d46 100644 --- a/op-challenger/game/fault/contracts/vm.go +++ b/op-challenger/game/fault/contracts/vm.go @@ -29,10 +29,14 @@ func NewVMContract(addr common.Address, caller *batching.MultiCaller) *VMContrac } } -func (c *VMContract) Oracle(ctx context.Context) (*PreimageOracleContract, error) { +func (c *VMContract) Addr() common.Address { + return c.contract.Addr() +} + +func (c *VMContract) Oracle(ctx context.Context) (PreimageOracleContract, error) { results, err := c.multiCaller.SingleCall(ctx, rpcblock.Latest, c.contract.Call(methodOracle)) if err != nil { return nil, fmt.Errorf("failed to load oracle address: %w", err) } - return NewPreimageOracleContract(results.GetAddress(0), c.multiCaller), nil + return NewPreimageOracleContract(ctx, results.GetAddress(0), c.multiCaller) } diff --git a/op-challenger/game/fault/contracts/vm_test.go b/op-challenger/game/fault/contracts/vm_test.go index 4800fcead191..f0ed7ae1bb6c 100644 --- a/op-challenger/game/fault/contracts/vm_test.go +++ b/op-challenger/game/fault/contracts/vm_test.go @@ -21,6 +21,8 @@ func TestVMContract_Oracle(t *testing.T) { vmContract := NewVMContract(vmAddr, batching.NewMultiCaller(stubRpc, batching.DefaultBatchSize)) stubRpc.SetResponse(vmAddr, methodOracle, rpcblock.Latest, nil, []interface{}{oracleAddr}) + stubRpc.AddContract(oracleAddr, snapshots.LoadPreimageOracleABI()) + stubRpc.SetResponse(oracleAddr, methodVersion, rpcblock.Latest, nil, []interface{}{oracleLatest}) oracleContract, err := vmContract.Oracle(context.Background()) require.NoError(t, err) diff --git a/op-challenger/game/fault/player.go b/op-challenger/game/fault/player.go index 6bb061277460..5ab187707557 100644 --- a/op-challenger/game/fault/player.go +++ b/op-challenger/game/fault/player.go @@ -60,10 +60,14 @@ type GameContract interface { 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) + GetOracle(ctx context.Context) (contracts.PreimageOracleContract, error) GetL1Head(ctx context.Context) (common.Hash, error) } +var actNoop = func(ctx context.Context) error { + return nil +} + type resourceCreator func(ctx context.Context, logger log.Logger, gameDepth types.Depth, dir string) (types.TraceAccessor, error) func NewGamePlayer( @@ -98,9 +102,7 @@ func NewGamePlayer( prestateValidators: validators, status: status, // Act function does nothing because the game is already complete - act: func(ctx context.Context) error { - return nil - }, + act: actNoop, }, nil } @@ -195,6 +197,10 @@ func (g *GamePlayer) ProgressGame(ctx context.Context) gameTypes.GameStatus { } g.logGameStatus(ctx, status) g.status = status + if status != gameTypes.GameStatusInProgress { + // Release the agent as we will no longer need to act on this game. + g.act = actNoop + } return status } diff --git a/op-challenger/game/fault/player_test.go b/op-challenger/game/fault/player_test.go index 0c662ac63883..7c05525a8823 100644 --- a/op-challenger/game/fault/player_test.go +++ b/op-challenger/game/fault/player_test.go @@ -90,6 +90,11 @@ func TestDoNotActOnCompleteGame(t *testing.T) { fetched = game.ProgressGame(context.Background()) require.Equal(t, 1, gameState.callCount, "does not act after game is complete") require.Equal(t, status, fetched) + + // Should have replaced the act function with a noop so callCount doesn't update even when called directly + // This allows the agent resources to be GC'd + require.NoError(t, game.act(context.Background())) + require.Equal(t, 1, gameState.callCount) }) } } diff --git a/op-challenger/game/fault/preimages/large.go b/op-challenger/game/fault/preimages/large.go index da28fdcf16fd..fe311bdfb150 100644 --- a/op-challenger/game/fault/preimages/large.go +++ b/op-challenger/game/fault/preimages/large.go @@ -164,11 +164,6 @@ func (p *LargePreimageUploader) initLargePreimage(uuid *big.Int, partOffset uint if err != nil { return fmt.Errorf("failed to create pre-image oracle tx: %w", err) } - bond, err := p.contract.GetMinBondLPP(context.Background()) - if err != nil { - return fmt.Errorf("failed to get min bond for large preimage proposal: %w", err) - } - candidate.Value = bond if err := p.txSender.SendAndWaitSimple("init large preimage", candidate); err != nil { return fmt.Errorf("failed to populate pre-image oracle: %w", err) } diff --git a/op-challenger/game/fault/preimages/large_test.go b/op-challenger/game/fault/preimages/large_test.go index 1913e5a6a47d..3f4a78ddb348 100644 --- a/op-challenger/game/fault/preimages/large_test.go +++ b/op-challenger/game/fault/preimages/large_test.go @@ -169,7 +169,7 @@ func mockPreimageOracleData() *types.PreimageOracleData { for i := 0; i < keccakTypes.BlockSize; i++ { fullLeaf[i] = byte(i) } - oracleData := make([]byte, 5*MaxBlocksPerChunk) + oracleData := make([]byte, 0, 5*MaxBlocksPerChunk) for i := 0; i < 5*MaxBlocksPerChunk; i++ { oracleData = append(oracleData, fullLeaf...) } diff --git a/op-challenger/game/fault/register.go b/op-challenger/game/fault/register.go index f0c1f283ee76..08140164a17c 100644 --- a/op-challenger/game/fault/register.go +++ b/op-challenger/game/fault/register.go @@ -3,24 +3,17 @@ 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" + "github.com/ethereum-optimism/optimism/op-challenger/game/fault/trace/vm" 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" "github.com/ethereum/go-ethereum/ethclient" @@ -30,8 +23,8 @@ import ( type CloseFunc func() type Registry interface { - RegisterGameType(gameType uint32, creator scheduler.PlayerCreator) - RegisterBondContract(gameType uint32, creator claims.BondContractCreator) + RegisterGameType(gameType faultTypes.GameType, creator scheduler.PlayerCreator) + RegisterBondContract(gameType faultTypes.GameType, creator claims.BondContractCreator) } type OracleRegistry interface { @@ -73,299 +66,29 @@ func RegisterGameTypes( } syncValidator := newSyncStatusValidator(rollupClient) - if cfg.TraceTypeEnabled(config.TraceTypeCannon) { - 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) - } + var registerTasks []*RegisterTask + if cfg.TraceTypeEnabled(faultTypes.TraceTypeCannon) { + registerTasks = append(registerTasks, NewCannonRegisterTask(faultTypes.CannonGameType, cfg, m, vm.NewOpProgramServerExecutor())) } - if cfg.TraceTypeEnabled(config.TraceTypePermissioned) { - 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(faultTypes.TraceTypePermissioned) { + registerTasks = append(registerTasks, NewCannonRegisterTask(faultTypes.PermissionedGameType, cfg, m, vm.NewOpProgramServerExecutor())) } - 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(faultTypes.TraceTypeAsterisc) { + registerTasks = append(registerTasks, NewAsteriscRegisterTask(faultTypes.AsteriscGameType, cfg, m, vm.NewOpProgramServerExecutor())) } - if cfg.TraceTypeEnabled(config.TraceTypeAlphabet) { - 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) - } + if cfg.TraceTypeEnabled(faultTypes.TraceTypeAsteriscKona) { + registerTasks = append(registerTasks, NewAsteriscKonaRegisterTask(faultTypes.AsteriscKonaGameType, cfg, m, vm.NewKonaExecutor())) } - return l2Client.Close, nil -} - -func registerAlphabet( - registry Registry, - oracles OracleRegistry, - ctx context.Context, - systemClock clock.Clock, - l1Clock faultTypes.ClockReader, - logger log.Logger, - m metrics.Metricer, - syncValidator SyncValidator, - rollupClient RollupClient, - l2Client utils.L2HeaderSource, - txSender TxSender, - gameFactory *contracts.DisputeGameFactoryContract, - caller *batching.MultiCaller, - l1HeaderSource L1HeaderSource, - selective bool, - claimants []common.Address, -) error { - 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 contract: %w", 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, err - } - l1Head, 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) { - 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) - 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) + if cfg.TraceTypeEnabled(faultTypes.TraceTypeFast) { + registerTasks = append(registerTasks, NewAlphabetRegisterTask(faultTypes.FastGameType)) } - 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(ctx, m, game.Proxy, caller) - } - registry.RegisterBondContract(faultTypes.AlphabetGameType, contractCreator) - return nil -} - -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(ctx, m, implAddr, caller) - if err != nil { - return fmt.Errorf("failed to create fault dispute game contracts: %w", err) - } - oracle, err := contract.GetOracle(ctx) - if err != nil { - return fmt.Errorf("failed to load oracle address: %w", err) - } - oracles.RegisterOracle(oracle) - return nil -} - -func registerAsterisc( - 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.AsteriscAbsolutePreStateBaseURL != nil { - prestateSource = prestates.NewMultiPrestateProvider(cfg.AsteriscAbsolutePreStateBaseURL, filepath.Join(cfg.Datadir, "asterisc-prestates")) - } else { - prestateSource = prestates.NewSinglePrestateSource(cfg.AsteriscAbsolutePreState) + if cfg.TraceTypeEnabled(faultTypes.TraceTypeAlphabet) { + registerTasks = append(registerTasks, NewAlphabetRegisterTask(faultTypes.AlphabetGameType)) } - 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) + for _, task := range registerTasks { + if err := task.Register(ctx, registry, oracles, systemClock, l1Clock, logger, m, syncValidator, rollupClient, txSender, gameFactory, caller, l2Client, l1HeaderSource, selective, claimants); err != nil { + return nil, fmt.Errorf("failed to register %v game type: %w", task.gameType, err) } - return asterisc.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) - } - 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) { - accessor, err := outputs.NewOutputAsteriscTraceAccessor(logger, m, cfg, l2Client, prestateProvider, 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) - } - 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) { - accessor, err := outputs.NewOutputCannonTraceAccessor(logger, m, cfg, l2Client, prestateProvider, rollupClient, dir, l1HeadID, splitDepth, prestateBlock, poststateBlock) - if err != nil { - return nil, err - } - return accessor, nil - } - prestateValidator := NewPrestateValidator("cannon", contract.GetAbsolutePrestateHash, cannonPrestateProvider) - 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, 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 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) - } - l1Header, err := l1HeaderSource.HeaderByHash(ctx, l1Head) - if err != nil { - return eth.BlockID{}, fmt.Errorf("failed to load L1 header: %w", err) - } - return eth.HeaderBlockID(l1Header), nil + return l2Client.Close, nil } diff --git a/op-challenger/game/fault/register_task.go b/op-challenger/game/fault/register_task.go new file mode 100644 index 000000000000..3b438ad8eea2 --- /dev/null +++ b/op-challenger/game/fault/register_task.go @@ -0,0 +1,291 @@ +package fault + +import ( + "context" + "fmt" + "net/url" + "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" + "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" + "github.com/ethereum-optimism/optimism/op-challenger/game/fault/trace/vm" + faultTypes "github.com/ethereum-optimism/optimism/op-challenger/game/fault/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-optimism/optimism/op-service/sources/caching" + "github.com/ethereum/go-ethereum/common" + "github.com/ethereum/go-ethereum/log" +) + +type RegisterTask struct { + gameType faultTypes.GameType + + getPrestateProvider func(prestateHash common.Hash) (faultTypes.PrestateProvider, error) + newTraceAccessor func( + logger log.Logger, + m metrics.Metricer, + l2Client utils.L2HeaderSource, + prestateProvider faultTypes.PrestateProvider, + vmPrestateProvider faultTypes.PrestateProvider, + rollupClient outputs.OutputRollupClient, + dir string, + l1Head eth.BlockID, + splitDepth faultTypes.Depth, + prestateBlock uint64, + poststateBlock uint64) (*trace.Accessor, error) +} + +func NewCannonRegisterTask(gameType faultTypes.GameType, cfg *config.Config, m caching.Metrics, serverExecutor vm.OracleServerExecutor) *RegisterTask { + stateConverter := cannon.NewStateConverter() + return &RegisterTask{ + gameType: gameType, + getPrestateProvider: cachePrestates( + gameType, + stateConverter, + m, + cfg.CannonAbsolutePreStateBaseURL, + cfg.CannonAbsolutePreState, + filepath.Join(cfg.Datadir, "cannon-prestates"), + func(path string) faultTypes.PrestateProvider { + return vm.NewPrestateProvider(path, stateConverter) + }), + newTraceAccessor: func( + logger log.Logger, + m metrics.Metricer, + l2Client utils.L2HeaderSource, + prestateProvider faultTypes.PrestateProvider, + vmPrestateProvider faultTypes.PrestateProvider, + rollupClient outputs.OutputRollupClient, + dir string, + l1Head eth.BlockID, + splitDepth faultTypes.Depth, + prestateBlock uint64, + poststateBlock uint64) (*trace.Accessor, error) { + provider := vmPrestateProvider.(*vm.PrestateProvider) + return outputs.NewOutputCannonTraceAccessor(logger, m, cfg.Cannon, serverExecutor, l2Client, prestateProvider, provider.PrestatePath(), rollupClient, dir, l1Head, splitDepth, prestateBlock, poststateBlock) + }, + } +} + +func NewAsteriscRegisterTask(gameType faultTypes.GameType, cfg *config.Config, m caching.Metrics, serverExecutor vm.OracleServerExecutor) *RegisterTask { + stateConverter := asterisc.NewStateConverter() + return &RegisterTask{ + gameType: gameType, + getPrestateProvider: cachePrestates( + gameType, + stateConverter, + m, + cfg.AsteriscAbsolutePreStateBaseURL, + cfg.AsteriscAbsolutePreState, + filepath.Join(cfg.Datadir, "asterisc-prestates"), + func(path string) faultTypes.PrestateProvider { + return vm.NewPrestateProvider(path, stateConverter) + }), + newTraceAccessor: func( + logger log.Logger, + m metrics.Metricer, + l2Client utils.L2HeaderSource, + prestateProvider faultTypes.PrestateProvider, + vmPrestateProvider faultTypes.PrestateProvider, + rollupClient outputs.OutputRollupClient, + dir string, + l1Head eth.BlockID, + splitDepth faultTypes.Depth, + prestateBlock uint64, + poststateBlock uint64) (*trace.Accessor, error) { + provider := vmPrestateProvider.(*vm.PrestateProvider) + return outputs.NewOutputAsteriscTraceAccessor(logger, m, cfg.Asterisc, serverExecutor, l2Client, prestateProvider, provider.PrestatePath(), rollupClient, dir, l1Head, splitDepth, prestateBlock, poststateBlock) + }, + } +} + +func NewAsteriscKonaRegisterTask(gameType faultTypes.GameType, cfg *config.Config, m caching.Metrics, serverExecutor vm.OracleServerExecutor) *RegisterTask { + stateConverter := asterisc.NewStateConverter() + return &RegisterTask{ + gameType: gameType, + getPrestateProvider: cachePrestates( + gameType, + stateConverter, + m, + cfg.AsteriscKonaAbsolutePreStateBaseURL, + cfg.AsteriscKonaAbsolutePreState, + filepath.Join(cfg.Datadir, "asterisc-kona-prestates"), + func(path string) faultTypes.PrestateProvider { + return vm.NewPrestateProvider(path, stateConverter) + }), + newTraceAccessor: func( + logger log.Logger, + m metrics.Metricer, + l2Client utils.L2HeaderSource, + prestateProvider faultTypes.PrestateProvider, + vmPrestateProvider faultTypes.PrestateProvider, + rollupClient outputs.OutputRollupClient, + dir string, + l1Head eth.BlockID, + splitDepth faultTypes.Depth, + prestateBlock uint64, + poststateBlock uint64) (*trace.Accessor, error) { + provider := vmPrestateProvider.(*vm.PrestateProvider) + return outputs.NewOutputAsteriscTraceAccessor(logger, m, cfg.AsteriscKona, serverExecutor, l2Client, prestateProvider, provider.PrestatePath(), rollupClient, dir, l1Head, splitDepth, prestateBlock, poststateBlock) + }, + } +} + +func NewAlphabetRegisterTask(gameType faultTypes.GameType) *RegisterTask { + return &RegisterTask{ + gameType: gameType, + getPrestateProvider: func(_ common.Hash) (faultTypes.PrestateProvider, error) { + return alphabet.PrestateProvider, nil + }, + newTraceAccessor: func( + logger log.Logger, + m metrics.Metricer, + l2Client utils.L2HeaderSource, + prestateProvider faultTypes.PrestateProvider, + vmPrestateProvider faultTypes.PrestateProvider, + rollupClient outputs.OutputRollupClient, + dir string, + l1Head eth.BlockID, + splitDepth faultTypes.Depth, + prestateBlock uint64, + poststateBlock uint64) (*trace.Accessor, error) { + return outputs.NewOutputAlphabetTraceAccessor(logger, m, prestateProvider, rollupClient, l2Client, l1Head, splitDepth, prestateBlock, poststateBlock) + }, + } +} + +func cachePrestates( + gameType faultTypes.GameType, + stateConverter vm.StateConverter, + m caching.Metrics, + prestateBaseURL *url.URL, + preStatePath string, + prestateDir string, + newPrestateProvider func(path string) faultTypes.PrestateProvider, +) func(prestateHash common.Hash) (faultTypes.PrestateProvider, error) { + prestateSource := prestates.NewPrestateSource(prestateBaseURL, preStatePath, prestateDir, stateConverter) + 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 newPrestateProvider(prestatePath), nil + }) + return prestateProviderCache.GetOrCreate +} + +func (e *RegisterTask) Register( + ctx context.Context, + registry Registry, + oracles OracleRegistry, + systemClock clock.Clock, + l1Clock faultTypes.ClockReader, + logger log.Logger, + m metrics.Metricer, + syncValidator SyncValidator, + rollupClient outputs.OutputRollupClient, + txSender TxSender, + gameFactory *contracts.DisputeGameFactoryContract, + caller *batching.MultiCaller, + l2Client utils.L2HeaderSource, + l1HeaderSource L1HeaderSource, + selective bool, + claimants []common.Address) error { + + 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) + } + + vmPrestateProvider, err := e.getPrestateProvider(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) { + accessor, err := e.newTraceAccessor(logger, m, l2Client, prestateProvider, vmPrestateProvider, rollupClient, dir, l1HeadID, splitDepth, prestateBlock, poststateBlock) + if err != nil { + return nil, err + } + return accessor, nil + } + prestateValidator := NewPrestateValidator(e.gameType.String(), contract.GetAbsolutePrestateHash, vmPrestateProvider) + 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, m, oracles, gameFactory, caller, e.gameType) + if err != nil { + return err + } + registry.RegisterGameType(e.gameType, playerCreator) + + contractCreator := func(game types.GameMetadata) (claims.BondContract, error) { + return contracts.NewFaultDisputeGameContract(ctx, m, game.Proxy, caller) + } + registry.RegisterBondContract(e.gameType, contractCreator) + return nil +} + +func registerOracle(ctx context.Context, m metrics.Metricer, oracles OracleRegistry, gameFactory *contracts.DisputeGameFactoryContract, caller *batching.MultiCaller, gameType faultTypes.GameType) 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(ctx, m, implAddr, caller) + if err != nil { + return fmt.Errorf("failed to create fault dispute game contracts: %w", err) + } + oracle, err := contract.GetOracle(ctx) + if err != nil { + return fmt.Errorf("failed to load oracle address: %w", err) + } + oracles.RegisterOracle(oracle) + return nil +} + +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) + } + l1Header, err := l1HeaderSource.HeaderByHash(ctx, l1Head) + if err != nil { + return eth.BlockID{}, fmt.Errorf("failed to load L1 header: %w", err) + } + return eth.HeaderBlockID(l1Header), nil +} diff --git a/op-challenger/game/fault/trace/alphabet/prestate.go b/op-challenger/game/fault/trace/alphabet/prestate.go index 0820b689122e..73ead3c5191e 100644 --- a/op-challenger/game/fault/trace/alphabet/prestate.go +++ b/op-challenger/game/fault/trace/alphabet/prestate.go @@ -4,10 +4,11 @@ import ( "context" "math/big" - "github.com/ethereum-optimism/optimism/cannon/mipsevm" - "github.com/ethereum-optimism/optimism/op-challenger/game/fault/types" "github.com/ethereum/go-ethereum/common" "github.com/ethereum/go-ethereum/crypto" + + "github.com/ethereum-optimism/optimism/cannon/mipsevm" + "github.com/ethereum-optimism/optimism/op-challenger/game/fault/types" ) var absolutePrestate = common.FromHex("0000000000000000000000000000000000000000000000000000000000000060") diff --git a/op-challenger/game/fault/trace/alphabet/provider.go b/op-challenger/game/fault/trace/alphabet/provider.go index f14a8e94f48a..f8a61d83ec50 100644 --- a/op-challenger/game/fault/trace/alphabet/provider.go +++ b/op-challenger/game/fault/trace/alphabet/provider.go @@ -6,10 +6,9 @@ import ( "fmt" "math/big" - preimage "github.com/ethereum-optimism/optimism/op-preimage" - "github.com/ethereum-optimism/optimism/cannon/mipsevm" "github.com/ethereum-optimism/optimism/op-challenger/game/fault/types" + preimage "github.com/ethereum-optimism/optimism/op-preimage" "github.com/ethereum/go-ethereum/common" "github.com/ethereum/go-ethereum/crypto" diff --git a/op-challenger/game/fault/trace/asterisc/executor.go b/op-challenger/game/fault/trace/asterisc/executor.go deleted file mode 100644 index 4bfe3737a895..000000000000 --- a/op-challenger/game/fault/trace/asterisc/executor.go +++ /dev/null @@ -1,127 +0,0 @@ -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, 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: cfg.AsteriscAbsolutePreState, - 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 deleted file mode 100644 index 93e6a68fde8c..000000000000 --- a/op-challenger/game/fault/trace/asterisc/executor_test.go +++ /dev/null @@ -1,135 +0,0 @@ -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" - cfg.AsteriscAbsolutePreState = "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, 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 deleted file mode 100644 index 64165edabc5d..000000000000 --- a/op-challenger/game/fault/trace/asterisc/prestate.go +++ /dev/null @@ -1,41 +0,0 @@ -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 deleted file mode 100644 index 38bc6d360e7b..000000000000 --- a/op-challenger/game/fault/trace/asterisc/prestate_test.go +++ /dev/null @@ -1,59 +0,0 @@ -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 index 40fd1720abd3..2ea1b729709e 100644 --- a/op-challenger/game/fault/trace/asterisc/provider.go +++ b/op-challenger/game/fault/trace/asterisc/provider.go @@ -12,22 +12,15 @@ import ( "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/trace/vm" "github.com/ethereum-optimism/optimism/op-challenger/game/fault/types" "github.com/ethereum-optimism/optimism/op-program/host/kvstore" + kvtypes "github.com/ethereum-optimism/optimism/op-program/host/types" "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 @@ -35,6 +28,8 @@ type AsteriscTraceProvider struct { generator utils.ProofGenerator gameDepth types.Depth preimageLoader *utils.PreimageLoader + stateConverter vm.StateConverter + cfg vm.Config types.PrestateProvider @@ -43,15 +38,19 @@ type AsteriscTraceProvider struct { lastStep uint64 } -func NewTraceProvider(logger log.Logger, m AsteriscMetricer, cfg *config.Config, prestateProvider types.PrestateProvider, localInputs utils.LocalGameInputs, dir string, gameDepth types.Depth) *AsteriscTraceProvider { +func NewTraceProvider(logger log.Logger, m vm.Metricer, cfg vm.Config, vmCfg vm.OracleServerExecutor, prestateProvider types.PrestateProvider, asteriscPrestate string, localInputs utils.LocalGameInputs, dir string, gameDepth types.Depth) *AsteriscTraceProvider { return &AsteriscTraceProvider{ - logger: logger, - dir: dir, - prestate: cfg.AsteriscAbsolutePreState, - generator: NewExecutor(logger, m, cfg, localInputs), - gameDepth: gameDepth, - preimageLoader: utils.NewPreimageLoader(kvstore.NewDiskKV(utils.PreimageDir(dir)).Get), + logger: logger, + dir: dir, + prestate: asteriscPrestate, + generator: vm.NewExecutor(logger, m, cfg, vmCfg, asteriscPrestate, localInputs), + gameDepth: gameDepth, + preimageLoader: utils.NewPreimageLoader(func() (utils.PreimageSource, error) { + return kvstore.NewDiskKV(logger, vm.PreimageDir(dir), kvtypes.DataFormatFile) + }), PrestateProvider: prestateProvider, + stateConverter: NewStateConverter(), + cfg: cfg, } } @@ -116,7 +115,7 @@ func (p *AsteriscTraceProvider) loadProof(ctx context.Context, i uint64) (*utils 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 { @@ -126,31 +125,23 @@ func (p *AsteriscTraceProvider) loadProof(ctx context.Context, i uint64) (*utils 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() + proof, step, exited, err := p.stateConverter.ConvertStateToProof(vm.FinalStatePath(p.dir, p.cfg.BinarySnapshots)) 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) + if exited && step <= i { + p.logger.Warn("Requested proof was after the program exited", "proof", i, "last", 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 + p.lastStep = 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) + return nil, fmt.Errorf("expected proof not generated but final state was not exited, requested step %v, final state at step %v", i, step) } } } @@ -166,46 +157,42 @@ func (p *AsteriscTraceProvider) loadProof(ctx context.Context, i uint64) (*utils 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 { +func NewTraceProviderForTest(logger log.Logger, m vm.Metricer, 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, localInputs), - gameDepth: gameDepth, - preimageLoader: utils.NewPreimageLoader(kvstore.NewDiskKV(utils.PreimageDir(dir)).Get), + logger: logger, + dir: dir, + prestate: cfg.AsteriscAbsolutePreState, + generator: vm.NewExecutor(logger, m, cfg.Asterisc, vm.NewOpProgramServerExecutor(), cfg.AsteriscAbsolutePreState, localInputs), + gameDepth: gameDepth, + preimageLoader: utils.NewPreimageLoader(func() (utils.PreimageSource, error) { + return kvstore.NewDiskKV(logger, vm.PreimageDir(dir), kvtypes.DataFormatFile) + }), + stateConverter: NewStateConverter(), + cfg: cfg.Asterisc, } 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 { + if err := p.generator.(*vm.Executor).DoGenerateProof(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() + _, step, exited, err := p.stateConverter.ConvertStateToProof(vm.FinalStatePath(p.dir, p.cfg.BinarySnapshots)) 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 { + if 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 + return 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 index 950a5ad70375..ce80b3403dac 100644 --- a/op-challenger/game/fault/trace/asterisc/provider_test.go +++ b/op-challenger/game/fault/trace/asterisc/provider_test.go @@ -12,6 +12,7 @@ import ( "testing" "github.com/ethereum-optimism/optimism/op-challenger/game/fault/trace/utils" + "github.com/ethereum-optimism/optimism/op-challenger/game/fault/trace/vm" "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" @@ -205,12 +206,12 @@ 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) - proofFile := filepath.Join(dataDir, proofsDir, entry.Name()+".gz") + 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) } @@ -220,11 +221,12 @@ func setupTestData(t *testing.T) (string, string) { 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, + logger: testlog.Logger(t, log.LevelInfo), + dir: dataDir, + generator: generator, + prestate: filepath.Join(dataDir, prestate), + gameDepth: 63, + stateConverter: &StateConverter{}, }, generator } @@ -241,7 +243,7 @@ func (e *stubGenerator) GenerateProof(ctx context.Context, dir string, i uint64) 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) + proofFile = vm.FinalStatePath(dir, false) data, err = json.Marshal(e.finalState) if err != nil { return err @@ -249,7 +251,7 @@ func (e *stubGenerator) GenerateProof(ctx context.Context, dir string, i uint64) 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)) + proofFile = filepath.Join(dir, utils.ProofsDir, fmt.Sprintf("%d.json.gz", i)) data, err = json.Marshal(e.proof) if err != nil { return err diff --git a/op-challenger/game/fault/trace/asterisc/state.go b/op-challenger/game/fault/trace/asterisc/state.go deleted file mode 100644 index b766cda6f50c..000000000000 --- a/op-challenger/game/fault/trace/asterisc/state.go +++ /dev/null @@ -1,74 +0,0 @@ -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_converter.go b/op-challenger/game/fault/trace/asterisc/state_converter.go new file mode 100644 index 000000000000..29c9f8b2ea50 --- /dev/null +++ b/op-challenger/game/fault/trace/asterisc/state_converter.go @@ -0,0 +1,101 @@ +package asterisc + +import ( + "encoding/json" + "fmt" + "io" + + "github.com/ethereum/go-ethereum/common" + + "github.com/ethereum-optimism/optimism/cannon/mipsevm" + "github.com/ethereum-optimism/optimism/op-challenger/game/fault/trace/utils" + "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 common.Hash `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 +} + +type StateConverter struct { +} + +func NewStateConverter() *StateConverter { + return &StateConverter{} +} + +func (c *StateConverter) ConvertStateToProof(statePath string) (*utils.ProofData, uint64, bool, error) { + state, err := parseState(statePath) + if err != nil { + return nil, 0, false, fmt.Errorf("cannot read final state: %w", err) + } + // 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. + return &utils.ProofData{ + ClaimValue: state.StateHash, + StateData: state.Witness, + ProofData: []byte{}, + OracleKey: nil, + OracleValue: nil, + OracleOffset: 0, + }, state.Step, state.Exited, nil +} diff --git a/op-challenger/game/fault/trace/asterisc/state_test.go b/op-challenger/game/fault/trace/asterisc/state_converter_test.go similarity index 100% rename from op-challenger/game/fault/trace/asterisc/state_test.go rename to op-challenger/game/fault/trace/asterisc/state_converter_test.go diff --git a/op-challenger/game/fault/trace/asterisc/test_data/state.json b/op-challenger/game/fault/trace/asterisc/test_data/state.json index a1bf2e5b412e..00dfc2d666c8 100644 --- a/op-challenger/game/fault/trace/asterisc/test_data/state.json +++ b/op-challenger/game/fault/trace/asterisc/test_data/state.json @@ -3,38 +3,5 @@ "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 - ] + "stateHash": "0x03216fdc4a7bfd4c7160fa946d1bfe451d13ff32da496609fe18355282b910c6" } diff --git a/op-challenger/game/fault/trace/cannon/executor.go b/op-challenger/game/fault/trace/cannon/executor.go deleted file mode 100644 index 6bf5300c4c9a..000000000000 --- a/op-challenger/game/fault/trace/cannon/executor.go +++ /dev/null @@ -1,127 +0,0 @@ -package cannon - -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 CannonMetricer - l1 string - l1Beacon string - l2 string - inputs utils.LocalGameInputs - cannon 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 CannonMetricer, cfg *config.Config, inputs utils.LocalGameInputs) *Executor { - return &Executor{ - logger: logger, - metrics: m, - l1: cfg.L1EthRpc, - l1Beacon: cfg.L1Beacon, - l2: cfg.L2Rpc, - inputs: inputs, - cannon: cfg.CannonBin, - server: cfg.CannonServer, - network: cfg.CannonNetwork, - rollupConfig: cfg.CannonRollupConfigPath, - l2Genesis: cfg.CannonL2GenesisPath, - absolutePreState: cfg.CannonAbsolutePreState, - snapshotFreq: cfg.CannonSnapshotFreq, - infoFreq: cfg.CannonInfoFreq, - selectSnapshot: utils.FindStartingSnapshot, - cmdExecutor: utils.RunCmd, - } -} - -// GenerateProof executes cannon 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 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, 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, utils.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, extraCannonArgs...) - 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.cannon, "args", strings.Join(args, ", ")) - execStart := time.Now() - err = e.cmdExecutor(ctx, e.logger.New("proof", end), e.cannon, args...) - e.metrics.RecordCannonExecutionTime(time.Since(execStart).Seconds()) - return err -} diff --git a/op-challenger/game/fault/trace/cannon/executor_test.go b/op-challenger/game/fault/trace/cannon/executor_test.go deleted file mode 100644 index 8df1e9cc5c27..000000000000 --- a/op-challenger/game/fault/trace/cannon/executor_test.go +++ /dev/null @@ -1,227 +0,0 @@ -package cannon - -import ( - "context" - "fmt" - "math" - "math/big" - "os" - "path/filepath" - "testing" - "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" - "github.com/ethereum/go-ethereum/log" - "github.com/stretchr/testify/require" -) - -const execTestCannonPrestate = "/foo/pre.json" - -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.TraceTypeCannon) - cfg.L2Rpc = "http://localhost:9999" - cfg.CannonAbsolutePreState = "pre.json" - cfg.CannonBin = "./bin/cannon" - cfg.CannonServer = "./bin/op-program" - cfg.CannonSnapshotFreq = 500 - cfg.CannonInfoFreq = 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 := &cannonDurationMetrics{} - executor := NewExecutor(testlog.Logger(t, log.LevelInfo), m, &cfg, 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 cannon 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 cannon execution time") - return binary, subcommand, args - } - - t.Run("Network", func(t *testing.T) { - cfg.CannonNetwork = "mainnet" - cfg.CannonRollupConfigPath = "" - cfg.CannonL2GenesisPath = "" - binary, subcommand, args := captureExec(t, cfg, 150_000_000) - 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, 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.CannonServer]) - 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, 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") - - // 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.CannonNetwork = "" - cfg.CannonRollupConfigPath = "rollup.json" - cfg.CannonL2GenesisPath = "genesis.json" - _, _, args := captureExec(t, cfg, 150_000_000) - require.NotContains(t, args, "--network") - require.Equal(t, cfg.CannonRollupConfigPath, args["--rollup.config"]) - require.Equal(t, cfg.CannonL2GenesisPath, args["--l2.genesis"]) - }) - - t.Run("NoStopAtWhenProofIsMaxUInt", func(t *testing.T) { - cfg.CannonNetwork = "mainnet" - cfg.CannonRollupConfigPath = "rollup.json" - cfg.CannonL2GenesisPath = "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 cannon to execute until the program exits. - require.NotContains(t, args, "--stop-at") - }) -} - -func TestRunCmdLogsOutput(t *testing.T) { - bin := "/bin/echo" - if _, err := os.Stat(bin); err != nil { - t.Skip(bin, " not available", err) - } - ctx, cancel := context.WithTimeout(context.Background(), 10*time.Second) - defer cancel() - logger, logs := testlog.CaptureLogger(t, log.LevelInfo) - err := utils.RunCmd(ctx, logger, bin, "Hello World") - require.NoError(t, err) - levelFilter := testlog.NewLevelFilter(log.LevelInfo) - msgFilter := testlog.NewMessageFilter("Hello World") - require.NotNil(t, logs.FindLog(levelFilter, msgFilter)) -} - -func TestFindStartingSnapshot(t *testing.T) { - logger := testlog.Logger(t, log.LevelInfo) - - withSnapshots := func(t *testing.T, files ...string) string { - dir := t.TempDir() - for _, file := range files { - require.NoError(t, os.WriteFile(fmt.Sprintf("%v/%v", dir, file), nil, 0o644)) - } - return dir - } - - t.Run("UsePrestateWhenSnapshotsDirDoesNotExist", func(t *testing.T) { - dir := t.TempDir() - 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 := 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 := utils.FindStartingSnapshot(logger, dir, execTestCannonPrestate, 99) - require.NoError(t, err) - require.Equal(t, execTestCannonPrestate, snapshot) - - snapshot, err = utils.FindStartingSnapshot(logger, dir, execTestCannonPrestate, 100) - require.NoError(t, err) - require.Equal(t, execTestCannonPrestate, snapshot) - }) - - t.Run("UseClosestAvailableSnapshot", func(t *testing.T) { - dir := withSnapshots(t, "100.json.gz", "123.json.gz", "250.json.gz") - - snapshot, err := utils.FindStartingSnapshot(logger, dir, execTestCannonPrestate, 101) - require.NoError(t, err) - require.Equal(t, filepath.Join(dir, "100.json.gz"), snapshot) - - snapshot, err = utils.FindStartingSnapshot(logger, dir, execTestCannonPrestate, 123) - require.NoError(t, err) - require.Equal(t, filepath.Join(dir, "100.json.gz"), snapshot) - - snapshot, err = utils.FindStartingSnapshot(logger, dir, execTestCannonPrestate, 124) - require.NoError(t, err) - require.Equal(t, filepath.Join(dir, "123.json.gz"), snapshot) - - snapshot, err = utils.FindStartingSnapshot(logger, dir, execTestCannonPrestate, 256) - require.NoError(t, err) - require.Equal(t, filepath.Join(dir, "250.json.gz"), snapshot) - }) - - 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 := 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 := utils.FindStartingSnapshot(logger, dir, execTestCannonPrestate, 150) - require.NoError(t, err) - require.Equal(t, filepath.Join(dir, "100.json.gz"), snapshot) - }) -} - -type cannonDurationMetrics struct { - metrics.NoopMetricsImpl - executionTimeRecordCount int -} - -func (c *cannonDurationMetrics) RecordCannonExecutionTime(_ float64) { - c.executionTimeRecordCount++ -} diff --git a/op-challenger/game/fault/trace/cannon/prestate.go b/op-challenger/game/fault/trace/cannon/prestate.go deleted file mode 100644 index 67d7c55389c2..000000000000 --- a/op-challenger/game/fault/trace/cannon/prestate.go +++ /dev/null @@ -1,47 +0,0 @@ -package cannon - -import ( - "context" - "fmt" - - "github.com/ethereum/go-ethereum/common" - - "github.com/ethereum-optimism/optimism/cannon/mipsevm" - "github.com/ethereum-optimism/optimism/op-challenger/game/fault/types" -) - -var _ types.PrestateProvider = (*CannonPrestateProvider)(nil) - -type CannonPrestateProvider struct { - prestate string - - prestateCommitment common.Hash -} - -func NewPrestateProvider(prestate string) *CannonPrestateProvider { - return &CannonPrestateProvider{prestate: prestate} -} - -func (p *CannonPrestateProvider) 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 *CannonPrestateProvider) 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) - } - hash, err := mipsevm.StateWitness(state).StateHash() - if err != nil { - return common.Hash{}, fmt.Errorf("cannot hash absolute pre-state: %w", err) - } - p.prestateCommitment = hash - return hash, nil -} diff --git a/op-challenger/game/fault/trace/cannon/prestate_test.go b/op-challenger/game/fault/trace/cannon/prestate_test.go deleted file mode 100644 index 1297da54bd88..000000000000 --- a/op-challenger/game/fault/trace/cannon/prestate_test.go +++ /dev/null @@ -1,85 +0,0 @@ -package cannon - -import ( - "context" - "os" - "path/filepath" - "testing" - - "github.com/ethereum-optimism/optimism/cannon/mipsevm" - "github.com/ethereum/go-ethereum/common" - "github.com/stretchr/testify/require" -) - -func newCannonPrestateProvider(dataDir string, prestate string) *CannonPrestateProvider { - return &CannonPrestateProvider{ - prestate: filepath.Join(dataDir, prestate), - } -} - -func TestAbsolutePreStateCommitment(t *testing.T) { - dataDir := t.TempDir() - - prestate := "state.json" - - t.Run("StateUnavailable", func(t *testing.T) { - provider := newCannonPrestateProvider("/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 := newCannonPrestateProvider(dataDir, prestate) - _, err := provider.AbsolutePreStateCommitment(context.Background()) - require.ErrorContains(t, err, "invalid mipsevm state") - }) - - t.Run("ExpectedAbsolutePreState", func(t *testing.T) { - setupPreState(t, dataDir, "state.json") - provider := newCannonPrestateProvider(dataDir, prestate) - actual, err := provider.AbsolutePreStateCommitment(context.Background()) - require.NoError(t, err) - state := mipsevm.State{ - Memory: mipsevm.NewMemory(), - PreimageKey: common.HexToHash("cccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccc"), - PreimageOffset: 0, - PC: 0, - NextPC: 1, - LO: 0, - HI: 0, - Heap: 0, - ExitCode: 0, - Exited: false, - Step: 0, - Registers: [32]uint32{}, - } - expected, err := state.EncodeWitness().StateHash() - require.NoError(t, err) - require.Equal(t, expected, actual) - }) - - t.Run("CacheAbsolutePreState", func(t *testing.T) { - setupPreState(t, dataDir, prestate) - provider := newCannonPrestateProvider(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/cannon/provider.go b/op-challenger/game/fault/trace/cannon/provider.go index dca71d4e2ede..823f8c6d814b 100644 --- a/op-challenger/game/fault/trace/cannon/provider.go +++ b/op-challenger/game/fault/trace/cannon/provider.go @@ -10,22 +10,18 @@ import ( "os" "path/filepath" + kvtypes "github.com/ethereum-optimism/optimism/op-program/host/types" + "github.com/ethereum/go-ethereum/common" + "github.com/ethereum/go-ethereum/log" + "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/trace/vm" "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/common/hexutil" - "github.com/ethereum/go-ethereum/log" - - "github.com/ethereum-optimism/optimism/cannon/mipsevm" ) -type CannonMetricer interface { - RecordCannonExecutionTime(t float64) -} - type CannonTraceProvider struct { logger log.Logger dir string @@ -33,6 +29,8 @@ type CannonTraceProvider struct { generator utils.ProofGenerator gameDepth types.Depth preimageLoader *utils.PreimageLoader + stateConverter vm.StateConverter + cfg vm.Config types.PrestateProvider @@ -41,15 +39,19 @@ type CannonTraceProvider struct { lastStep uint64 } -func NewTraceProvider(logger log.Logger, m CannonMetricer, cfg *config.Config, prestateProvider types.PrestateProvider, localInputs utils.LocalGameInputs, dir string, gameDepth types.Depth) *CannonTraceProvider { +func NewTraceProvider(logger log.Logger, m vm.Metricer, cfg vm.Config, vmCfg vm.OracleServerExecutor, 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: utils.NewPreimageLoader(kvstore.NewDiskKV(utils.PreimageDir(dir)).Get), + logger: logger, + dir: dir, + prestate: prestate, + generator: vm.NewExecutor(logger, m, cfg, vmCfg, prestate, localInputs), + gameDepth: gameDepth, + preimageLoader: utils.NewPreimageLoader(func() (utils.PreimageSource, error) { + return kvstore.NewDiskKV(logger, vm.PreimageDir(dir), kvtypes.DataFormatFile) + }), PrestateProvider: prestateProvider, + stateConverter: &StateConverter{}, + cfg: cfg, } } @@ -123,37 +125,22 @@ func (p *CannonTraceProvider) loadProof(ctx context.Context, i uint64) (*utils.P // 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() + proof, stateStep, exited, err := p.stateConverter.ConvertStateToProof(vm.FinalStatePath(p.dir, p.cfg.BinarySnapshots)) if err != nil { - return nil, err + return nil, fmt.Errorf("cannot create proof from final state: %w", err) } - if state.Exited && state.Step <= i { - p.logger.Warn("Requested proof was after the program exited", "proof", i, "last", state.Step) + + if exited && stateStep <= i { + p.logger.Warn("Requested proof was after the program exited", "proof", i, "last", stateStep) // 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. - witness := state.EncodeWitness() - witnessHash, err := mipsevm.StateWitness(witness).StateHash() - if err != nil { - return nil, fmt.Errorf("cannot hash witness: %w", err) - } - proof := &utils.ProofData{ - ClaimValue: witnessHash, - StateData: hexutil.Bytes(witness), - ProofData: []byte{}, - OracleKey: nil, - OracleValue: nil, - OracleOffset: 0, - } + p.lastStep = stateStep - 1 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) + return nil, fmt.Errorf("expected proof not generated but final state was not exited, requested step %v, final state at step %v", i, stateStep) } } } @@ -169,46 +156,43 @@ func (p *CannonTraceProvider) loadProof(ctx context.Context, i uint64) (*utils.P return &proof, nil } -func (c *CannonTraceProvider) finalState() (*mipsevm.State, 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 -} - // CannonTraceProviderForTest is a CannonTraceProvider that can find the step referencing the preimage read // Only to be used for testing type CannonTraceProviderForTest struct { *CannonTraceProvider } -func NewTraceProviderForTest(logger log.Logger, m CannonMetricer, cfg *config.Config, localInputs utils.LocalGameInputs, dir string, gameDepth types.Depth) *CannonTraceProviderForTest { +func NewTraceProviderForTest(logger log.Logger, m vm.Metricer, 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), - gameDepth: gameDepth, - preimageLoader: utils.NewPreimageLoader(kvstore.NewDiskKV(utils.PreimageDir(dir)).Get), + logger: logger, + dir: dir, + prestate: cfg.CannonAbsolutePreState, + generator: vm.NewExecutor(logger, m, cfg.Cannon, vm.NewOpProgramServerExecutor(), cfg.CannonAbsolutePreState, localInputs), + gameDepth: gameDepth, + preimageLoader: utils.NewPreimageLoader(func() (utils.PreimageSource, error) { + return kvstore.NewDiskKV(logger, vm.PreimageDir(dir), kvtypes.DataFormatFile) + }), + stateConverter: NewStateConverter(), + cfg: cfg.Cannon, } return &CannonTraceProviderForTest{p} } 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 { + if err := p.generator.(*vm.Executor).DoGenerateProof(ctx, p.dir, start, math.MaxUint64, preimage()...); err != nil { return 0, fmt.Errorf("generate cannon trace (until preimage read): %w", err) } // Load the step from the state cannon finished with - state, err := p.finalState() + + _, step, exited, err := p.stateConverter.ConvertStateToProof(vm.FinalStatePath(p.dir, p.cfg.BinarySnapshots)) 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 { + if 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 + return step - 1, nil } diff --git a/op-challenger/game/fault/trace/cannon/provider_test.go b/op-challenger/game/fault/trace/cannon/provider_test.go index 388bd151991b..82edc5562623 100644 --- a/op-challenger/game/fault/trace/cannon/provider_test.go +++ b/op-challenger/game/fault/trace/cannon/provider_test.go @@ -11,14 +11,17 @@ import ( "path/filepath" "testing" - "github.com/ethereum-optimism/optimism/cannon/mipsevm" + "github.com/ethereum/go-ethereum/common" + "github.com/ethereum/go-ethereum/log" + "github.com/stretchr/testify/require" + + "github.com/ethereum-optimism/optimism/cannon/mipsevm/memory" + "github.com/ethereum-optimism/optimism/cannon/mipsevm/singlethreaded" "github.com/ethereum-optimism/optimism/op-challenger/game/fault/trace/utils" + "github.com/ethereum-optimism/optimism/op-challenger/game/fault/trace/vm" "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 @@ -48,16 +51,15 @@ func TestGet(t *testing.T) { t.Run("ProofAfterEndOfTrace", func(t *testing.T) { provider, generator := setupWithTestData(t, dataDir, prestate) - generator.finalState = &mipsevm.State{ - Memory: &mipsevm.Memory{}, + generator.finalState = &singlethreaded.State{ + Memory: &memory.Memory{}, Step: 10, Exited: true, } value, err := provider.Get(context.Background(), PositionFromTraceIndex(provider, big.NewInt(7000))) require.NoError(t, err) require.Contains(t, generator.generated, 7000, "should have tried to generate the proof") - stateHash, err := generator.finalState.EncodeWitness().StateHash() - require.NoError(t, err) + _, stateHash := generator.finalState.EncodeWitness() require.Equal(t, stateHash, value) }) @@ -105,8 +107,8 @@ func TestGetStepData(t *testing.T) { t.Run("GenerateProof", func(t *testing.T) { dataDir, prestate := setupTestData(t) provider, generator := setupWithTestData(t, dataDir, prestate) - generator.finalState = &mipsevm.State{ - Memory: &mipsevm.Memory{}, + generator.finalState = &singlethreaded.State{ + Memory: &memory.Memory{}, Step: 10, Exited: true, } @@ -131,8 +133,8 @@ func TestGetStepData(t *testing.T) { t.Run("ProofAfterEndOfTrace", func(t *testing.T) { dataDir, prestate := setupTestData(t) provider, generator := setupWithTestData(t, dataDir, prestate) - generator.finalState = &mipsevm.State{ - Memory: &mipsevm.Memory{}, + generator.finalState = &singlethreaded.State{ + Memory: &memory.Memory{}, Step: 10, Exited: true, } @@ -148,7 +150,7 @@ func TestGetStepData(t *testing.T) { require.NoError(t, err) require.Contains(t, generator.generated, 7000, "should have tried to generate the proof") - witness := generator.finalState.EncodeWitness() + witness, _ := generator.finalState.EncodeWitness() require.EqualValues(t, witness, preimage) require.Equal(t, []byte{}, proof) require.Nil(t, data) @@ -157,8 +159,8 @@ func TestGetStepData(t *testing.T) { t.Run("ReadLastStepFromDisk", func(t *testing.T) { dataDir, prestate := setupTestData(t) provider, initGenerator := setupWithTestData(t, dataDir, prestate) - initGenerator.finalState = &mipsevm.State{ - Memory: &mipsevm.Memory{}, + initGenerator.finalState = &singlethreaded.State{ + Memory: &memory.Memory{}, Step: 10, Exited: true, } @@ -175,8 +177,8 @@ func TestGetStepData(t *testing.T) { require.Contains(t, initGenerator.generated, 7000, "should have tried to generate the proof") provider, generator := setupWithTestData(t, dataDir, prestate) - generator.finalState = &mipsevm.State{ - Memory: &mipsevm.Memory{}, + generator.finalState = &singlethreaded.State{ + Memory: &memory.Memory{}, Step: 10, Exited: true, } @@ -189,7 +191,8 @@ func TestGetStepData(t *testing.T) { require.NoError(t, err) require.Empty(t, generator.generated, "should not have to generate the proof again") - require.EqualValues(t, initGenerator.finalState.EncodeWitness(), preimage) + encodedWitness, _ := initGenerator.finalState.EncodeWitness() + require.EqualValues(t, encodedWitness, preimage) require.Empty(t, proof) require.Nil(t, data) }) @@ -236,17 +239,18 @@ func setupTestData(t *testing.T) (string, string) { func setupWithTestData(t *testing.T, dataDir string, prestate string) (*CannonTraceProvider, *stubGenerator) { generator := &stubGenerator{} return &CannonTraceProvider{ - logger: testlog.Logger(t, log.LevelInfo), - dir: dataDir, - generator: generator, - prestate: filepath.Join(dataDir, prestate), - gameDepth: 63, + logger: testlog.Logger(t, log.LevelInfo), + dir: dataDir, + generator: generator, + prestate: filepath.Join(dataDir, prestate), + gameDepth: 63, + stateConverter: &StateConverter{}, }, generator } type stubGenerator struct { generated []int // Using int makes assertions easier - finalState *mipsevm.State + finalState *singlethreaded.State proof *utils.ProofData } @@ -257,7 +261,7 @@ func (e *stubGenerator) GenerateProof(ctx context.Context, dir string, i uint64) 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) + proofFile = vm.FinalStatePath(dir, false) data, err = json.Marshal(e.finalState) if err != nil { return err diff --git a/op-challenger/game/fault/trace/cannon/state.go b/op-challenger/game/fault/trace/cannon/state.go deleted file mode 100644 index db0c9c50a94c..000000000000 --- a/op-challenger/game/fault/trace/cannon/state.go +++ /dev/null @@ -1,27 +0,0 @@ -package cannon - -import ( - "encoding/json" - "fmt" - "io" - - "github.com/ethereum-optimism/optimism/cannon/mipsevm" - "github.com/ethereum-optimism/optimism/op-service/ioutil" -) - -func parseState(path string) (*mipsevm.State, 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) (*mipsevm.State, error) { - defer in.Close() - var state mipsevm.State - 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/state_converter.go b/op-challenger/game/fault/trace/cannon/state_converter.go new file mode 100644 index 000000000000..248676cc326e --- /dev/null +++ b/op-challenger/game/fault/trace/cannon/state_converter.go @@ -0,0 +1,38 @@ +package cannon + +import ( + "fmt" + + "github.com/ethereum-optimism/optimism/cannon/mipsevm" + "github.com/ethereum-optimism/optimism/cannon/mipsevm/versions" + "github.com/ethereum-optimism/optimism/op-challenger/game/fault/trace/utils" +) + +type StateConverter struct { +} + +func NewStateConverter() *StateConverter { + return &StateConverter{} +} + +func (c *StateConverter) ConvertStateToProof(statePath string) (*utils.ProofData, uint64, bool, error) { + state, err := parseState(statePath) + if err != nil { + return nil, 0, false, fmt.Errorf("cannot read final state: %w", err) + } + // 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. + witness, witnessHash := state.EncodeWitness() + return &utils.ProofData{ + ClaimValue: witnessHash, + StateData: witness, + ProofData: []byte{}, + OracleKey: nil, + OracleValue: nil, + OracleOffset: 0, + }, state.GetStep(), state.GetExited(), nil +} + +func parseState(path string) (mipsevm.FPVMState, error) { + return versions.LoadStateFromFile(path) +} diff --git a/op-challenger/game/fault/trace/cannon/state_converter_test.go b/op-challenger/game/fault/trace/cannon/state_converter_test.go new file mode 100644 index 000000000000..c0c0182529ff --- /dev/null +++ b/op-challenger/game/fault/trace/cannon/state_converter_test.go @@ -0,0 +1,96 @@ +package cannon + +import ( + _ "embed" + "path/filepath" + "testing" + + "github.com/ethereum-optimism/optimism/cannon/mipsevm" + "github.com/ethereum-optimism/optimism/cannon/mipsevm/multithreaded" + "github.com/ethereum-optimism/optimism/cannon/mipsevm/versions" + "github.com/ethereum-optimism/optimism/cannon/serialize" + "github.com/stretchr/testify/require" + + "github.com/ethereum-optimism/optimism/cannon/mipsevm/singlethreaded" +) + +func TestLoadState(t *testing.T) { + tests := []struct { + name string + creator func() mipsevm.FPVMState + supportsJSON bool + }{ + { + name: "singlethreaded", + creator: func() mipsevm.FPVMState { return singlethreaded.CreateInitialState(234, 82) }, + supportsJSON: true, + }, + { + name: "multithreaded", + creator: func() mipsevm.FPVMState { return multithreaded.CreateInitialState(982, 492) }, + supportsJSON: false, + }, + } + for _, test := range tests { + test := test + loadExpectedState := func(t *testing.T) *versions.VersionedState { + state, err := versions.NewFromState(test.creator()) + require.NoError(t, err) + return state + } + t.Run(test.name, func(t *testing.T) { + t.Run("Uncompressed", func(t *testing.T) { + if !test.supportsJSON { + t.Skip("JSON not supported by state version") + } + expected := loadExpectedState(t) + path := writeState(t, "state.json", expected) + + state, err := parseState(path) + require.NoError(t, err) + + require.Equal(t, expected, state) + }) + + t.Run("Gzipped", func(t *testing.T) { + if !test.supportsJSON { + t.Skip("JSON not supported by state version") + } + expected := loadExpectedState(t) + path := writeState(t, "state.json.gz", expected) + + state, err := parseState(path) + require.NoError(t, err) + + require.Equal(t, expected, state) + }) + + t.Run("Binary", func(t *testing.T) { + expected := loadExpectedState(t) + + path := writeState(t, "state.bin", expected) + + state, err := parseState(path) + require.NoError(t, err) + require.Equal(t, expected, state) + }) + + t.Run("BinaryGzip", func(t *testing.T) { + expected := loadExpectedState(t) + + path := writeState(t, "state.bin.gz", expected) + + state, err := parseState(path) + require.NoError(t, err) + require.Equal(t, expected, state) + }) + }) + } +} + +func writeState(t *testing.T, filename string, state *versions.VersionedState) string { + dir := t.TempDir() + path := filepath.Join(dir, filename) + require.NoError(t, serialize.Write(path, state, 0644)) + return path +} diff --git a/op-challenger/game/fault/trace/cannon/state_test.go b/op-challenger/game/fault/trace/cannon/state_test.go deleted file mode 100644 index b437d307c545..000000000000 --- a/op-challenger/game/fault/trace/cannon/state_test.go +++ /dev/null @@ -1,50 +0,0 @@ -package cannon - -import ( - "compress/gzip" - _ "embed" - "encoding/json" - "os" - "path/filepath" - "testing" - - "github.com/ethereum-optimism/optimism/cannon/mipsevm" - "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 mipsevm.State - 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 mipsevm.State - require.NoError(t, json.Unmarshal(testState, &expected)) - require.Equal(t, &expected, state) - }) -} diff --git a/op-challenger/game/fault/trace/cannon/test_data/invalid.json b/op-challenger/game/fault/trace/cannon/test_data/invalid.json deleted file mode 100644 index 06a76bf5b23d..000000000000 --- a/op-challenger/game/fault/trace/cannon/test_data/invalid.json +++ /dev/null @@ -1,3 +0,0 @@ -{ - "preimageKey": 1 -} diff --git a/op-challenger/game/fault/trace/cannon/test_data/state.json b/op-challenger/game/fault/trace/cannon/test_data/state.json deleted file mode 100644 index 30cd1ccdcf0c..000000000000 --- a/op-challenger/game/fault/trace/cannon/test_data/state.json +++ /dev/null @@ -1,14 +0,0 @@ -{ - "memory": [], - "preimageKey": "0xcccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccc", - "preimageOffset": 0, - "pc": 0, - "nextPC": 1, - "lo": 0, - "hi": 0, - "heap": 0, - "exit": 0, - "exited": false, - "step": 0, - "registers": [] -} diff --git a/op-challenger/game/fault/trace/outputs/output_asterisc.go b/op-challenger/game/fault/trace/outputs/output_asterisc.go index 45aa94a79469..82dac14f8453 100644 --- a/op-challenger/game/fault/trace/outputs/output_asterisc.go +++ b/op-challenger/game/fault/trace/outputs/output_asterisc.go @@ -5,12 +5,12 @@ import ( "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/trace/vm" "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,9 +21,11 @@ import ( func NewOutputAsteriscTraceAccessor( logger log.Logger, m metrics.Metricer, - cfg *config.Config, + cfg vm.Config, + vmCfg vm.OracleServerExecutor, l2Client utils.L2HeaderSource, prestateProvider types.PrestateProvider, + asteriscPrestate string, rollupClient OutputRollupClient, dir string, l1Head eth.BlockID, @@ -39,7 +41,7 @@ func NewOutputAsteriscTraceAccessor( if err != nil { return nil, fmt.Errorf("failed to fetch asterisc local inputs: %w", err) } - provider := asterisc.NewTraceProvider(logger, m, cfg, prestateProvider, localInputs, subdir, depth) + provider := asterisc.NewTraceProvider(logger, m.VmMetrics(cfg.VmType.String()), cfg, vmCfg, prestateProvider, asteriscPrestate, localInputs, subdir, depth) return provider, nil } diff --git a/op-challenger/game/fault/trace/outputs/output_cannon.go b/op-challenger/game/fault/trace/outputs/output_cannon.go index 47eff2818124..49b6631b5a7f 100644 --- a/op-challenger/game/fault/trace/outputs/output_cannon.go +++ b/op-challenger/game/fault/trace/outputs/output_cannon.go @@ -5,12 +5,12 @@ import ( "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/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/trace/vm" "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,9 +21,11 @@ import ( func NewOutputCannonTraceAccessor( logger log.Logger, m metrics.Metricer, - cfg *config.Config, + cfg vm.Config, + serverExecutor vm.OracleServerExecutor, l2Client utils.L2HeaderSource, prestateProvider types.PrestateProvider, + cannonPrestate string, rollupClient OutputRollupClient, dir string, l1Head eth.BlockID, @@ -39,7 +41,7 @@ func NewOutputCannonTraceAccessor( if err != nil { return nil, fmt.Errorf("failed to fetch cannon local inputs: %w", err) } - provider := cannon.NewTraceProvider(logger, m, cfg, prestateProvider, localInputs, subdir, depth) + provider := cannon.NewTraceProvider(logger, m.VmMetrics(cfg.VmType.String()), cfg, serverExecutor, prestateProvider, cannonPrestate, localInputs, subdir, depth) return provider, nil } diff --git a/op-challenger/game/fault/trace/prestates/multi.go b/op-challenger/game/fault/trace/prestates/multi.go index ccc22c6d5d4a..03abbbc56486 100644 --- a/op-challenger/game/fault/trace/prestates/multi.go +++ b/op-challenger/game/fault/trace/prestates/multi.go @@ -9,43 +9,64 @@ import ( "os" "path/filepath" + "github.com/ethereum-optimism/optimism/op-challenger/game/fault/trace/vm" "github.com/ethereum-optimism/optimism/op-service/ioutil" "github.com/ethereum/go-ethereum/common" ) var ( ErrPrestateUnavailable = errors.New("prestate unavailable") + + // supportedFileTypes lists, in preferred order, the prestate file types to attempt to download + supportedFileTypes = []string{".bin.gz", ".json.gz", ".json"} ) type MultiPrestateProvider struct { - baseUrl *url.URL - dataDir string + baseUrl *url.URL + dataDir string + stateConverter vm.StateConverter } -func NewMultiPrestateProvider(baseUrl *url.URL, dataDir string) *MultiPrestateProvider { +func NewMultiPrestateProvider(baseUrl *url.URL, dataDir string, stateConverter vm.StateConverter) *MultiPrestateProvider { return &MultiPrestateProvider{ - baseUrl: baseUrl, - dataDir: dataDir, + baseUrl: baseUrl, + dataDir: dataDir, + stateConverter: stateConverter, } } 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) + // First try to find a previously downloaded prestate + for _, fileType := range supportedFileTypes { + path := filepath.Join(m.dataDir, hash.Hex()+fileType) + if _, err := os.Stat(path); errors.Is(err, os.ErrNotExist) { + continue // File doesn't exist, try the next file type + } else if err != nil { + return "", fmt.Errorf("error checking for existing prestate %v in file %v: %w", hash, path, err) + } + return path, nil // Found an existing file so use it + } + + // Didn't find any available files, try to download one + var combinedErr error // Keep a track of each download attempt so we can report them if none work + for _, fileType := range supportedFileTypes { + path := filepath.Join(m.dataDir, hash.Hex()+fileType) + if err := m.fetchPrestate(hash, fileType, path); errors.Is(err, ErrPrestateUnavailable) { + combinedErr = errors.Join(combinedErr, err) + continue // Didn't find prestate in this format, try the next + } else if err != nil { + return "", fmt.Errorf("error downloading prestate %v to file %v: %w", hash, path, err) } - } else if err != nil { - return "", fmt.Errorf("error checking for existing prestate %v: %w", hash, err) + return path, nil // Successfully downloaded a prestate so use it } - return path, nil + return "", errors.Join(ErrPrestateUnavailable, combinedErr) } -func (m *MultiPrestateProvider) fetchPrestate(hash common.Hash, dest string) error { +func (m *MultiPrestateProvider) fetchPrestate(hash common.Hash, fileType string, 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") + prestateUrl := m.baseUrl.JoinPath(hash.Hex() + fileType) resp, err := http.Get(prestateUrl.String()) if err != nil { return fmt.Errorf("failed to fetch prestate from %v: %w", prestateUrl, err) @@ -54,7 +75,8 @@ func (m *MultiPrestateProvider) fetchPrestate(hash common.Hash, dest string) err if resp.StatusCode != http.StatusOK { return fmt.Errorf("%w from url %v: status %v", ErrPrestateUnavailable, prestateUrl, resp.StatusCode) } - out, err := ioutil.NewAtomicWriterCompressed(dest, 0o644) + tmpFile := dest + ".tmp" + fileType // Preserve the file type extension so state decoding is applied correctly + out, err := ioutil.NewAtomicWriter(tmpFile, 0o644) if err != nil { return fmt.Errorf("failed to open atomic writer for %v: %w", dest, err) } @@ -68,5 +90,15 @@ func (m *MultiPrestateProvider) fetchPrestate(hash common.Hash, dest string) err if err := out.Close(); err != nil { return fmt.Errorf("failed to close file %v: %w", dest, err) } + // Verify the prestate actually matches the expected hash before moving it into the final destination + proof, _, _, err := m.stateConverter.ConvertStateToProof(tmpFile) + if err != nil || proof.ClaimValue != hash { + // Treat invalid prestates as unavailable. Often servers return a 404 page with 200 status code + _ = os.Remove(tmpFile) // Best effort attempt to clean up the temporary file + return fmt.Errorf("invalid prestate from url: %v, ignoring: %w", prestateUrl, errors.Join(ErrPrestateUnavailable, err)) + } + if err := os.Rename(tmpFile, dest); err != nil { + return fmt.Errorf("failed to move temp file to final destination: %w", 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 index 2f825d98da4e..7b09b81bdc67 100644 --- a/op-challenger/game/fault/trace/prestates/multi_test.go +++ b/op-challenger/game/fault/trace/prestates/multi_test.go @@ -1,60 +1,67 @@ package prestates import ( + "errors" "io" "net/http" "net/http/httptest" "net/url" "os" "path/filepath" + "strings" "testing" + "github.com/ethereum-optimism/optimism/op-challenger/game/fault/trace/utils" "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)) + for _, ext := range supportedFileTypes { + t.Run(ext, func(t *testing.T) { + dir := t.TempDir() + server := prestateHTTPServer(ext) + defer server.Close() + hash := common.Hash{0xaa} + provider := NewMultiPrestateProvider(parseURL(t, server.URL), dir, &stubStateConverter{hash: hash}) + path, err := provider.PrestatePath(hash) + require.NoError(t, err) + in, err := os.Open(path) + require.NoError(t, err) + defer in.Close() + content, err := io.ReadAll(in) + require.NoError(t, err) + require.Equal(t, "/"+hash.Hex()+ext, 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)) + for _, ext := range supportedFileTypes { + t.Run(ext, func(t *testing.T) { + dir := t.TempDir() + dir = filepath.Join(dir, "test") + server := prestateHTTPServer(ext) + defer server.Close() + hash := common.Hash{0xaa} + provider := NewMultiPrestateProvider(parseURL(t, server.URL), dir, &stubStateConverter{hash: hash}) + path, err := provider.PrestatePath(hash) + require.NoError(t, err) + in, err := os.Open(path) + require.NoError(t, err) + defer in.Close() + content, err := io.ReadAll(in) + require.NoError(t, err) + require.Equal(t, "/"+hash.Hex()+ext, 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} + provider := NewMultiPrestateProvider(parseURL(t, "http://127.0.0.1:1"), dir, &stubStateConverter{hash: hash}) 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) @@ -72,16 +79,84 @@ func TestExistingPrestate(t *testing.T) { func TestMissingPrestate(t *testing.T) { dir := t.TempDir() + var requests []string server := httptest.NewServer(http.HandlerFunc(func(w http.ResponseWriter, r *http.Request) { + requests = append(requests, r.URL.Path) w.WriteHeader(404) })) defer server.Close() - provider := NewMultiPrestateProvider(parseURL(t, server.URL), dir) hash := common.Hash{0xaa} + provider := NewMultiPrestateProvider(parseURL(t, server.URL), dir, &stubStateConverter{hash: hash}) path, err := provider.PrestatePath(hash) require.ErrorIs(t, err, ErrPrestateUnavailable) _, err = os.Stat(path) require.ErrorIs(t, err, os.ErrNotExist) + expectedRequests := []string{ + "/" + hash.Hex() + ".bin.gz", + "/" + hash.Hex() + ".json.gz", + "/" + hash.Hex() + ".json", + } + require.Equal(t, expectedRequests, requests) +} + +func TestStorePrestateWithCorrectExtension(t *testing.T) { + extensions := []string{".bin.gz", ".json.gz", ".json"} + for _, ext := range extensions { + ext := ext + t.Run(ext, func(t *testing.T) { + dir := t.TempDir() + server := httptest.NewServer(http.HandlerFunc(func(w http.ResponseWriter, r *http.Request) { + if !strings.HasSuffix(r.URL.Path, ext) { + w.WriteHeader(404) + return + } + _, _ = w.Write([]byte("content")) + })) + defer server.Close() + hash := common.Hash{0xaa} + provider := NewMultiPrestateProvider(parseURL(t, server.URL), dir, &stubStateConverter{hash: hash}) + path, err := provider.PrestatePath(hash) + require.NoError(t, err) + require.Truef(t, strings.HasSuffix(path, ext), "Expected path %v to have extension %v", path, ext) + in, err := os.Open(path) + require.NoError(t, err) + defer in.Close() + content, err := io.ReadAll(in) + require.NoError(t, err) + require.Equal(t, "content", string(content)) + }) + } +} + +func TestDetectInvalidPrestate(t *testing.T) { + dir := t.TempDir() + server := httptest.NewServer(http.HandlerFunc(func(w http.ResponseWriter, r *http.Request) { + _, _ = w.Write([]byte("content")) + })) + defer server.Close() + hash := common.Hash{0xaa} + provider := NewMultiPrestateProvider(parseURL(t, server.URL), dir, &stubStateConverter{hash: hash, err: errors.New("boom")}) + _, err := provider.PrestatePath(hash) + require.ErrorIs(t, err, ErrPrestateUnavailable) + entries, err := os.ReadDir(dir) + require.NoError(t, err) + require.Empty(t, entries, "should not leave any files in temp dir") +} + +func TestDetectPrestateWithWrongHash(t *testing.T) { + dir := t.TempDir() + server := httptest.NewServer(http.HandlerFunc(func(w http.ResponseWriter, r *http.Request) { + _, _ = w.Write([]byte("content")) + })) + defer server.Close() + hash := common.Hash{0xaa} + actualHash := common.Hash{0xbb} + provider := NewMultiPrestateProvider(parseURL(t, server.URL), dir, &stubStateConverter{hash: actualHash}) + _, err := provider.PrestatePath(hash) + require.ErrorIs(t, err, ErrPrestateUnavailable) + entries, err := os.ReadDir(dir) + require.NoError(t, err) + require.Empty(t, entries, "should not leave any files in temp dir") } func parseURL(t *testing.T, str string) *url.URL { @@ -89,3 +164,26 @@ func parseURL(t *testing.T, str string) *url.URL { require.NoError(t, err) return parsed } + +func prestateHTTPServer(ext string) *httptest.Server { + return httptest.NewServer(http.HandlerFunc(func(w http.ResponseWriter, r *http.Request) { + if strings.HasSuffix(r.URL.Path, ext) { + _, _ = w.Write([]byte(r.URL.Path)) + } else { + w.WriteHeader(http.StatusNotFound) + } + })) +} + +type stubStateConverter struct { + err error + hash common.Hash +} + +func (s *stubStateConverter) ConvertStateToProof(path string) (*utils.ProofData, uint64, bool, error) { + // Return an error if we're given the wrong path + if _, err := os.Stat(path); err != nil { + return nil, 0, false, err + } + return &utils.ProofData{ClaimValue: s.hash}, 0, false, s.err +} diff --git a/op-challenger/game/fault/trace/prestates/source.go b/op-challenger/game/fault/trace/prestates/source.go new file mode 100644 index 000000000000..a4c9839ad1e5 --- /dev/null +++ b/op-challenger/game/fault/trace/prestates/source.go @@ -0,0 +1,15 @@ +package prestates + +import ( + "net/url" + + "github.com/ethereum-optimism/optimism/op-challenger/game/fault/trace/vm" +) + +func NewPrestateSource(baseURL *url.URL, path string, localDir string, stateConverter vm.StateConverter) PrestateSource { + if baseURL != nil { + return NewMultiPrestateProvider(baseURL, localDir, stateConverter) + } else { + return NewSinglePrestateSource(path) + } +} diff --git a/op-challenger/game/fault/trace/utils/executor.go b/op-challenger/game/fault/trace/utils/executor.go deleted file mode 100644 index f3c5feac8311..000000000000 --- a/op-challenger/game/fault/trace/utils/executor.go +++ /dev/null @@ -1,81 +0,0 @@ -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/utils/preimage.go b/op-challenger/game/fault/trace/utils/preimage.go index b13333a566f6..5b61a70adb9f 100644 --- a/op-challenger/game/fault/trace/utils/preimage.go +++ b/op-challenger/game/fault/trace/utils/preimage.go @@ -23,19 +23,23 @@ const ( ) var ( - ErrInvalidScalarValue = errors.New("invalid scalar value") ErrInvalidBlobKeyPreimage = errors.New("invalid blob key preimage") ) -type preimageSource func(key common.Hash) ([]byte, error) +type PreimageSource interface { + Get(key common.Hash) ([]byte, error) + Close() error +} + +type PreimageSourceCreator func() (PreimageSource, error) type PreimageLoader struct { - getPreimage preimageSource + makeSource PreimageSourceCreator } -func NewPreimageLoader(getPreimage preimageSource) *PreimageLoader { +func NewPreimageLoader(makeSource PreimageSourceCreator) *PreimageLoader { return &PreimageLoader{ - getPreimage: getPreimage, + makeSource: makeSource, } } @@ -57,7 +61,12 @@ func (l *PreimageLoader) loadBlobPreimage(proof *ProofData) (*types.PreimageOrac // 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() - inputs, err := l.getPreimage(inputsKey) + source, err := l.makeSource() + if err != nil { + return nil, fmt.Errorf("failed to open preimage store: %w", err) + } + defer source.Close() + inputs, err := source.Get(inputsKey) if err != nil { return nil, fmt.Errorf("failed to get key preimage: %w", err) } @@ -74,7 +83,7 @@ func (l *PreimageLoader) loadBlobPreimage(proof *ProofData) (*types.PreimageOrac for i := 0; i < params.BlobTxFieldElementsPerBlob; i++ { binary.BigEndian.PutUint64(fieldElemKey[72:], uint64(i)) key := preimage.BlobKey(crypto.Keccak256(fieldElemKey)).PreimageKey() - fieldElement, err := l.getPreimage(key) + fieldElement, err := source.Get(key) if err != nil { return nil, fmt.Errorf("failed to load field element %v with key %v: %w", i, common.Hash(key), err) } @@ -89,7 +98,8 @@ func (l *PreimageLoader) loadBlobPreimage(proof *ProofData) (*types.PreimageOrac // Compute the KZG proof for the required field element var point kzg4844.Point new(big.Int).SetUint64(requiredFieldElement).FillBytes(point[:]) - kzgProof, claim, err := kzg4844.ComputeProof(kzg4844.Blob(blob), point) + data := kzg4844.Blob(blob) + kzgProof, claim, err := kzg4844.ComputeProof(&data, point) if err != nil { return nil, fmt.Errorf("failed to compute kzg proof: %w", err) } @@ -104,7 +114,12 @@ func (l *PreimageLoader) loadBlobPreimage(proof *ProofData) (*types.PreimageOrac func (l *PreimageLoader) loadPrecompilePreimage(proof *ProofData) (*types.PreimageOracleData, error) { inputKey := preimage.Keccak256Key(proof.OracleKey).PreimageKey() - input, err := l.getPreimage(inputKey) + source, err := l.makeSource() + if err != nil { + return nil, fmt.Errorf("failed to open preimage store: %w", err) + } + defer source.Close() + input, err := source.Get(inputKey) if err != nil { return nil, fmt.Errorf("failed to get key preimage: %w", err) } diff --git a/op-challenger/game/fault/trace/utils/preimage_test.go b/op-challenger/game/fault/trace/utils/preimage_test.go index e2c9e87ede75..2b5552f28e0c 100644 --- a/op-challenger/game/fault/trace/utils/preimage_test.go +++ b/op-challenger/game/fault/trace/utils/preimage_test.go @@ -20,14 +20,20 @@ import ( ) func TestPreimageLoader_NoPreimage(t *testing.T) { - loader := NewPreimageLoader(kvstore.NewMemKV().Get) + kv := kvstore.NewMemKV() + loader := NewPreimageLoader(func() (PreimageSource, error) { + return kv, nil + }) actual, err := loader.LoadPreimage(&ProofData{}) require.NoError(t, err) require.Nil(t, actual) } func TestPreimageLoader_LocalPreimage(t *testing.T) { - loader := NewPreimageLoader(kvstore.NewMemKV().Get) + kv := kvstore.NewMemKV() + loader := NewPreimageLoader(func() (PreimageSource, error) { + return kv, nil + }) proof := &ProofData{ OracleKey: common.Hash{byte(preimage.LocalKeyType), 0xaa, 0xbb}.Bytes(), OracleValue: nil, @@ -48,7 +54,10 @@ 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) + kv := kvstore.NewMemKV() + loader := NewPreimageLoader(func() (PreimageSource, error) { + return kv, nil + }) proof := &ProofData{ OracleKey: common.Hash{byte(keyType), 0xaa, 0xbb}.Bytes(), OracleValue: []byte{1, 2, 3, 4, 5, 6}, @@ -63,15 +72,15 @@ func TestPreimageLoader_SimpleTypes(t *testing.T) { } func TestPreimageLoader_BlobPreimage(t *testing.T) { - blob := testBlob() - commitment, err := kzg4844.BlobToCommitment(kzg4844.Blob(blob)) + blob := kzg4844.Blob(testBlob()) + commitment, err := kzg4844.BlobToCommitment(&blob) require.NoError(t, err) fieldIndex := uint64(24) elementData := blob[fieldIndex<<5 : (fieldIndex+1)<<5] var point kzg4844.Point new(big.Int).SetUint64(fieldIndex).FillBytes(point[:]) - kzgProof, claim, err := kzg4844.ComputeProof(kzg4844.Blob(blob), point) + kzgProof, claim, err := kzg4844.ComputeProof(&blob, point) require.NoError(t, err) elementDataWithLengthPrefix := make([]byte, len(elementData)+lengthPrefixSize) binary.BigEndian.PutUint64(elementDataWithLengthPrefix[:lengthPrefixSize], uint64(len(elementData))) @@ -90,7 +99,9 @@ func TestPreimageLoader_BlobPreimage(t *testing.T) { t.Run("NoKeyPreimage", func(t *testing.T) { kv := kvstore.NewMemKV() - loader := NewPreimageLoader(kv.Get) + loader := NewPreimageLoader(func() (PreimageSource, error) { + return kv, nil + }) proof := &ProofData{ OracleKey: common.Hash{byte(preimage.BlobKeyType), 0xaf}.Bytes(), OracleValue: proof.OracleValue, @@ -102,7 +113,9 @@ func TestPreimageLoader_BlobPreimage(t *testing.T) { t.Run("InvalidKeyPreimage", func(t *testing.T) { kv := kvstore.NewMemKV() - loader := NewPreimageLoader(kv.Get) + loader := NewPreimageLoader(func() (PreimageSource, error) { + return kv, nil + }) proof := &ProofData{ OracleKey: common.Hash{byte(preimage.BlobKeyType), 0xad}.Bytes(), OracleValue: proof.OracleValue, @@ -115,7 +128,9 @@ func TestPreimageLoader_BlobPreimage(t *testing.T) { t.Run("MissingBlobs", func(t *testing.T) { kv := kvstore.NewMemKV() - loader := NewPreimageLoader(kv.Get) + loader := NewPreimageLoader(func() (PreimageSource, error) { + return kv, nil + }) proof := &ProofData{ OracleKey: common.Hash{byte(preimage.BlobKeyType), 0xae}.Bytes(), OracleValue: proof.OracleValue, @@ -128,8 +143,10 @@ func TestPreimageLoader_BlobPreimage(t *testing.T) { t.Run("Valid", func(t *testing.T) { kv := kvstore.NewMemKV() - loader := NewPreimageLoader(kv.Get) - storeBlob(t, kv, gokzg4844.KZGCommitment(commitment), blob) + loader := NewPreimageLoader(func() (PreimageSource, error) { + return kv, nil + }) + storeBlob(t, kv, gokzg4844.KZGCommitment(commitment), gokzg4844.Blob(blob)) actual, err := loader.LoadPreimage(proof) require.NoError(t, err) @@ -161,13 +178,17 @@ func TestPreimageLoader_PrecompilePreimage(t *testing.T) { t.Run("NoInputPreimage", func(t *testing.T) { kv := kvstore.NewMemKV() - loader := NewPreimageLoader(kv.Get) + loader := NewPreimageLoader(func() (PreimageSource, error) { + return kv, nil + }) _, 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(func() (PreimageSource, error) { + return kv, nil + }) 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/vm/executor.go b/op-challenger/game/fault/trace/vm/executor.go new file mode 100644 index 000000000000..9e2cd0d29e93 --- /dev/null +++ b/op-challenger/game/fault/trace/vm/executor.go @@ -0,0 +1,151 @@ +package vm + +import ( + "context" + "fmt" + "math" + "os" + "path/filepath" + "strconv" + "strings" + "time" + + "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/jsonutil" + "github.com/ethereum/go-ethereum/common/hexutil" + "github.com/ethereum/go-ethereum/log" +) + +const ( + debugFilename = "debug-info.json" +) + +type Metricer interface { + RecordExecutionTime(t time.Duration) + RecordMemoryUsed(memoryUsed uint64) +} + +type Config struct { + // VM Configuration + VmType types.TraceType + VmBin string // Path to the vm executable to run when generating trace data + SnapshotFreq uint // Frequency of snapshots to create when executing (in VM instructions) + InfoFreq uint // Frequency of progress log messages (in VM instructions) + DebugInfo bool // Whether to record debug info from the execution + BinarySnapshots bool // Whether to use binary snapshots instead of JSON + + // Host Configuration + L1 string + L1Beacon string + L2 string + Server string // Path to the executable that provides the pre-image oracle server + Network string + RollupConfigPath string + L2GenesisPath string +} + +type OracleServerExecutor interface { + OracleCommand(cfg Config, dataDir string, inputs utils.LocalGameInputs) ([]string, error) +} + +type Executor struct { + cfg Config + oracleServer OracleServerExecutor + logger log.Logger + metrics Metricer + absolutePreState string + inputs utils.LocalGameInputs + selectSnapshot SnapshotSelect + cmdExecutor CmdExecutor +} + +func NewExecutor(logger log.Logger, m Metricer, cfg Config, oracleServer OracleServerExecutor, prestate string, inputs utils.LocalGameInputs) *Executor { + return &Executor{ + cfg: cfg, + oracleServer: oracleServer, + logger: logger, + metrics: m, + inputs: inputs, + absolutePreState: prestate, + selectSnapshot: FindStartingSnapshot, + cmdExecutor: RunCmd, + } +} + +// GenerateProof executes vm 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.DoGenerateProof(ctx, dir, i, i) +} + +// DoGenerateProof executes vm from the specified starting trace index until the end trace index. +// The proof is stored at the specified directory. +func (e *Executor) DoGenerateProof(ctx context.Context, dir string, begin uint64, end uint64, extraVmArgs ...string) error { + snapshotDir := filepath.Join(dir, SnapsDir) + start, err := e.selectSnapshot(e.logger, snapshotDir, e.absolutePreState, begin, e.cfg.BinarySnapshots) + if err != nil { + return fmt.Errorf("find starting snapshot: %w", err) + } + proofDir := filepath.Join(dir, utils.ProofsDir) + dataDir := PreimageDir(dir) + lastGeneratedState := FinalStatePath(dir, e.cfg.BinarySnapshots) + args := []string{ + "run", + "--input", start, + "--output", lastGeneratedState, + "--meta", "", + "--info-at", "%" + strconv.FormatUint(uint64(e.cfg.InfoFreq), 10), + "--proof-at", "=" + strconv.FormatUint(end, 10), + "--proof-fmt", filepath.Join(proofDir, "%d.json.gz"), + "--snapshot-at", "%" + strconv.FormatUint(uint64(e.cfg.SnapshotFreq), 10), + } + if e.cfg.BinarySnapshots { + args = append(args, "--snapshot-fmt", filepath.Join(snapshotDir, "%d.bin.gz")) + } else { + args = append(args, "--snapshot-fmt", filepath.Join(snapshotDir, "%d.json.gz")) + } + if end < math.MaxUint64 { + args = append(args, "--stop-at", "="+strconv.FormatUint(end+1, 10)) + } + if e.cfg.DebugInfo { + args = append(args, "--debug-info", filepath.Join(dataDir, debugFilename)) + } + args = append(args, extraVmArgs...) + args = append(args, "--") + oracleArgs, err := e.oracleServer.OracleCommand(e.cfg, dataDir, e.inputs) + if err != nil { + return err + } + args = append(args, oracleArgs...) + + 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.cfg.VmBin, "args", strings.Join(args, ", ")) + execStart := time.Now() + err = e.cmdExecutor(ctx, e.logger.New("proof", end), e.cfg.VmBin, args...) + execTime := time.Since(execStart) + memoryUsed := "unknown" + e.metrics.RecordExecutionTime(execTime) + if e.cfg.DebugInfo && err == nil { + if info, err := jsonutil.LoadJSON[debugInfo](filepath.Join(dataDir, debugFilename)); err != nil { + e.logger.Warn("Failed to load debug metrics", "err", err) + } else { + e.metrics.RecordMemoryUsed(uint64(info.MemoryUsed)) + memoryUsed = fmt.Sprintf("%d", uint64(info.MemoryUsed)) + } + } + e.logger.Info("VM execution complete", "time", execTime, "memory", memoryUsed) + return err +} + +type debugInfo struct { + MemoryUsed hexutil.Uint64 `json:"memory_used"` +} diff --git a/op-challenger/game/fault/trace/vm/executor_test.go b/op-challenger/game/fault/trace/vm/executor_test.go new file mode 100644 index 000000000000..ff4a8ba7e1ab --- /dev/null +++ b/op-challenger/game/fault/trace/vm/executor_test.go @@ -0,0 +1,155 @@ +package vm + +import ( + "context" + "math" + "math/big" + "path/filepath" + "testing" + "time" + + "github.com/ethereum-optimism/optimism/op-challenger/game/fault/trace/utils" + "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{ + VmType: "test", + L1: "http://localhost:8888", + L1Beacon: "http://localhost:9000", + L2: "http://localhost:9999", + VmBin: "./bin/testvm", + Server: "./bin/testserver", + Network: "op-test", + SnapshotFreq: 500, + InfoFreq: 900, + } + prestate := "pre.json" + + 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, proofAt uint64) (string, string, map[string]string) { + m := &stubVmMetrics{} + executor := NewExecutor(testlog.Logger(t, log.LevelInfo), m, cfg, NewOpProgramServerExecutor(), prestate, inputs) + executor.selectSnapshot = func(logger log.Logger, dir string, absolutePreState string, i uint64, binary bool) (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 vm 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 vm execution time") + return binary, subcommand, args + } + + t.Run("Network", func(t *testing.T) { + cfg.Network = "mainnet" + cfg.RollupConfigPath = "" + cfg.L2GenesisPath = "" + binary, subcommand, args := captureExec(t, cfg, 150_000_000) + require.DirExists(t, filepath.Join(dir, PreimagesDir)) + require.DirExists(t, filepath.Join(dir, utils.ProofsDir)) + require.DirExists(t, filepath.Join(dir, SnapsDir)) + require.Equal(t, cfg.VmBin, 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, FinalStatePath(dir, cfg.BinarySnapshots), 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.Server]) + require.Equal(t, cfg.L1, args["--l1"]) + require.Equal(t, cfg.L1Beacon, args["--l1.beacon"]) + require.Equal(t, cfg.L2, args["--l2"]) + require.Equal(t, filepath.Join(dir, PreimagesDir), args["--datadir"]) + require.Equal(t, filepath.Join(dir, utils.ProofsDir, "%d.json.gz"), args["--proof-fmt"]) + require.Equal(t, filepath.Join(dir, SnapsDir, "%d.json.gz"), args["--snapshot-fmt"]) + require.Equal(t, cfg.Network, 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.Network = "" + cfg.RollupConfigPath = "rollup.json" + cfg.L2GenesisPath = "genesis.json" + _, _, args := captureExec(t, cfg, 150_000_000) + require.NotContains(t, args, "--network") + require.Equal(t, cfg.RollupConfigPath, args["--rollup.config"]) + require.Equal(t, cfg.L2GenesisPath, args["--l2.genesis"]) + }) + + t.Run("NoStopAtWhenProofIsMaxUInt", func(t *testing.T) { + cfg.Network = "mainnet" + cfg.RollupConfigPath = "rollup.json" + cfg.L2GenesisPath = "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") + }) + + t.Run("BinarySnapshots", func(t *testing.T) { + cfg.Network = "mainnet" + cfg.BinarySnapshots = true + _, _, args := captureExec(t, cfg, 100) + require.Equal(t, filepath.Join(dir, SnapsDir, "%d.bin.gz"), args["--snapshot-fmt"]) + }) + + t.Run("JsonSnapshots", func(t *testing.T) { + cfg.Network = "mainnet" + cfg.BinarySnapshots = false + _, _, args := captureExec(t, cfg, 100) + require.Equal(t, filepath.Join(dir, SnapsDir, "%d.json.gz"), args["--snapshot-fmt"]) + }) +} + +type stubVmMetrics struct { + executionTimeRecordCount int +} + +func (c *stubVmMetrics) RecordExecutionTime(_ time.Duration) { + c.executionTimeRecordCount++ +} + +func (c *stubVmMetrics) RecordMemoryUsed(_ uint64) { +} diff --git a/op-challenger/game/fault/trace/vm/iface.go b/op-challenger/game/fault/trace/vm/iface.go new file mode 100644 index 000000000000..188f19e0c8e2 --- /dev/null +++ b/op-challenger/game/fault/trace/vm/iface.go @@ -0,0 +1,9 @@ +package vm + +import "github.com/ethereum-optimism/optimism/op-challenger/game/fault/trace/utils" + +type StateConverter interface { + // ConvertStateToProof reads the state snapshot at the specified path and converts it to ProofData. + // Returns the proof data, the VM step the state is from and whether or not the VM had exited. + ConvertStateToProof(statePath string) (*utils.ProofData, uint64, bool, error) +} diff --git a/op-challenger/game/fault/trace/vm/kona_server_executor.go b/op-challenger/game/fault/trace/vm/kona_server_executor.go new file mode 100644 index 000000000000..a8be1c7bc562 --- /dev/null +++ b/op-challenger/game/fault/trace/vm/kona_server_executor.go @@ -0,0 +1,59 @@ +package vm + +import ( + "errors" + "strconv" + + "github.com/ethereum-optimism/optimism/op-challenger/game/fault/trace/utils" + "github.com/ethereum-optimism/optimism/op-node/chaincfg" +) + +type KonaExecutor struct { + nativeMode bool + clientBinPath string +} + +var _ OracleServerExecutor = (*KonaExecutor)(nil) + +func NewKonaExecutor() *KonaExecutor { + return &KonaExecutor{nativeMode: false} +} + +func NewNativeKonaExecutor(clientBinPath string) *KonaExecutor { + return &KonaExecutor{nativeMode: true, clientBinPath: clientBinPath} +} + +func (s *KonaExecutor) OracleCommand(cfg Config, dataDir string, inputs utils.LocalGameInputs) ([]string, error) { + args := []string{ + cfg.Server, + "--l1-node-address", cfg.L1, + "--l1-beacon-address", cfg.L1Beacon, + "--l2-node-address", cfg.L2, + "--l1-head", inputs.L1Head.Hex(), + "--l2-head", inputs.L2Head.Hex(), + "--l2-output-root", inputs.L2OutputRoot.Hex(), + "--l2-claim", inputs.L2Claim.Hex(), + "--l2-block-number", inputs.L2BlockNumber.Text(10), + "-v", + } + + if s.nativeMode { + args = append(args, "--exec", s.clientBinPath) + } else { + args = append(args, "--server") + args = append(args, "--data-dir", dataDir) + } + + if cfg.RollupConfigPath != "" { + args = append(args, "--rollup-config-path", cfg.RollupConfigPath) + } else { + if cfg.Network == "" { + return nil, errors.New("network is not defined") + } + + chainCfg := chaincfg.ChainByName(cfg.Network) + args = append(args, "--l2-chain-id", strconv.FormatUint(chainCfg.ChainID, 10)) + } + + return args, nil +} diff --git a/op-challenger/game/fault/trace/vm/kona_server_executor_test.go b/op-challenger/game/fault/trace/vm/kona_server_executor_test.go new file mode 100644 index 000000000000..ba690b5c0881 --- /dev/null +++ b/op-challenger/game/fault/trace/vm/kona_server_executor_test.go @@ -0,0 +1,45 @@ +package vm + +import ( + "math/big" + "slices" + "testing" + + "github.com/ethereum-optimism/optimism/op-challenger/game/fault/trace/utils" + "github.com/ethereum/go-ethereum/common" + "github.com/stretchr/testify/require" +) + +func TestKonaFillHostCommand(t *testing.T) { + dir := "mockdir" + cfg := Config{ + L1: "http://localhost:8888", + L1Beacon: "http://localhost:9000", + L2: "http://localhost:9999", + Server: "./bin/mockserver", + Network: "op-mainnet", + } + inputs := utils.LocalGameInputs{ + L1Head: common.Hash{0x11}, + L2Head: common.Hash{0x22}, + L2OutputRoot: common.Hash{0x33}, + L2Claim: common.Hash{0x44}, + L2BlockNumber: big.NewInt(3333), + } + vmConfig := NewKonaExecutor() + + args, err := vmConfig.OracleCommand(cfg, dir, inputs) + require.NoError(t, err) + + require.True(t, slices.Contains(args, "--server")) + require.True(t, slices.Contains(args, "--l1-node-address")) + require.True(t, slices.Contains(args, "--l1-beacon-address")) + require.True(t, slices.Contains(args, "--l2-node-address")) + require.True(t, slices.Contains(args, "--data-dir")) + require.True(t, slices.Contains(args, "--l2-chain-id")) + require.True(t, slices.Contains(args, "--l1-head")) + require.True(t, slices.Contains(args, "--l2-head")) + require.True(t, slices.Contains(args, "--l2-output-root")) + require.True(t, slices.Contains(args, "--l2-claim")) + require.True(t, slices.Contains(args, "--l2-block-number")) +} diff --git a/op-challenger/game/fault/trace/vm/op_program_server_executor.go b/op-challenger/game/fault/trace/vm/op_program_server_executor.go new file mode 100644 index 000000000000..11044307e9af --- /dev/null +++ b/op-challenger/game/fault/trace/vm/op_program_server_executor.go @@ -0,0 +1,39 @@ +package vm + +import ( + "github.com/ethereum-optimism/optimism/op-challenger/game/fault/trace/utils" +) + +type OpProgramServerExecutor struct { +} + +var _ OracleServerExecutor = (*OpProgramServerExecutor)(nil) + +func NewOpProgramServerExecutor() *OpProgramServerExecutor { + return &OpProgramServerExecutor{} +} + +func (s *OpProgramServerExecutor) OracleCommand(cfg Config, dataDir string, inputs utils.LocalGameInputs) ([]string, error) { + args := []string{ + cfg.Server, "--server", + "--l1", cfg.L1, + "--l1.beacon", cfg.L1Beacon, + "--l2", cfg.L2, + "--datadir", dataDir, + "--l1.head", inputs.L1Head.Hex(), + "--l2.head", inputs.L2Head.Hex(), + "--l2.outputroot", inputs.L2OutputRoot.Hex(), + "--l2.claim", inputs.L2Claim.Hex(), + "--l2.blocknumber", inputs.L2BlockNumber.Text(10), + } + if cfg.Network != "" { + args = append(args, "--network", cfg.Network) + } + if cfg.RollupConfigPath != "" { + args = append(args, "--rollup.config", cfg.RollupConfigPath) + } + if cfg.L2GenesisPath != "" { + args = append(args, "--l2.genesis", cfg.L2GenesisPath) + } + return args, nil +} diff --git a/op-challenger/game/fault/trace/vm/op_program_server_executor_test.go b/op-challenger/game/fault/trace/vm/op_program_server_executor_test.go new file mode 100644 index 000000000000..ff17209d6324 --- /dev/null +++ b/op-challenger/game/fault/trace/vm/op_program_server_executor_test.go @@ -0,0 +1,98 @@ +package vm + +import ( + "math/big" + "slices" + "testing" + + "github.com/ethereum-optimism/optimism/op-challenger/game/fault/trace/utils" + "github.com/ethereum/go-ethereum/common" + "github.com/stretchr/testify/require" +) + +func TestOpProgramFillHostCommand(t *testing.T) { + dir := "mockdir" + cfg := Config{ + L1: "http://localhost:8888", + L1Beacon: "http://localhost:9000", + L2: "http://localhost:9999", + Server: "./bin/mockserver", + } + inputs := utils.LocalGameInputs{ + L1Head: common.Hash{0x11}, + L2Head: common.Hash{0x22}, + L2OutputRoot: common.Hash{0x33}, + L2Claim: common.Hash{0x44}, + L2BlockNumber: big.NewInt(3333), + } + + validateStandard := func(t *testing.T, args []string) { + require.True(t, slices.Contains(args, "--server")) + require.True(t, slices.Contains(args, "--l1")) + require.True(t, slices.Contains(args, "--l1.beacon")) + require.True(t, slices.Contains(args, "--l2")) + require.True(t, slices.Contains(args, "--datadir")) + require.True(t, slices.Contains(args, "--l1.head")) + require.True(t, slices.Contains(args, "--l2.head")) + require.True(t, slices.Contains(args, "--l2.outputroot")) + require.True(t, slices.Contains(args, "--l2.claim")) + require.True(t, slices.Contains(args, "--l2.blocknumber")) + } + + t.Run("NoExtras", func(t *testing.T) { + vmConfig := NewOpProgramServerExecutor() + + args, err := vmConfig.OracleCommand(cfg, dir, inputs) + require.NoError(t, err) + + validateStandard(t, args) + }) + + t.Run("WithNetwork", func(t *testing.T) { + cfg.Network = "op-test" + vmConfig := NewOpProgramServerExecutor() + + args, err := vmConfig.OracleCommand(cfg, dir, inputs) + require.NoError(t, err) + + validateStandard(t, args) + require.True(t, slices.Contains(args, "--network")) + }) + + t.Run("WithRollupConfigPath", func(t *testing.T) { + cfg.RollupConfigPath = "rollup.config" + vmConfig := NewOpProgramServerExecutor() + + args, err := vmConfig.OracleCommand(cfg, dir, inputs) + require.NoError(t, err) + + validateStandard(t, args) + require.True(t, slices.Contains(args, "--rollup.config")) + }) + + t.Run("WithL2GenesisPath", func(t *testing.T) { + cfg.L2GenesisPath = "l2.genesis" + vmConfig := NewOpProgramServerExecutor() + + args, err := vmConfig.OracleCommand(cfg, dir, inputs) + require.NoError(t, err) + + validateStandard(t, args) + require.True(t, slices.Contains(args, "--l2.genesis")) + }) + + t.Run("WithAllExtras", func(t *testing.T) { + cfg.Network = "op-test" + cfg.RollupConfigPath = "rollup.config" + cfg.L2GenesisPath = "l2.genesis" + vmConfig := NewOpProgramServerExecutor() + + args, err := vmConfig.OracleCommand(cfg, dir, inputs) + require.NoError(t, err) + + validateStandard(t, args) + require.True(t, slices.Contains(args, "--network")) + require.True(t, slices.Contains(args, "--rollup.config")) + require.True(t, slices.Contains(args, "--l2.genesis")) + }) +} diff --git a/op-challenger/game/fault/trace/vm/prestate.go b/op-challenger/game/fault/trace/vm/prestate.go new file mode 100644 index 000000000000..bbb4a9437d9a --- /dev/null +++ b/op-challenger/game/fault/trace/vm/prestate.go @@ -0,0 +1,42 @@ +package vm + +import ( + "context" + "fmt" + + "github.com/ethereum/go-ethereum/common" + + "github.com/ethereum-optimism/optimism/op-challenger/game/fault/types" +) + +var _ types.PrestateProvider = (*PrestateProvider)(nil) + +type PrestateProvider struct { + prestate string + stateConverter StateConverter + + prestateCommitment common.Hash +} + +func NewPrestateProvider(prestate string, converter StateConverter) *PrestateProvider { + return &PrestateProvider{ + prestate: prestate, + stateConverter: converter, + } +} + +func (p *PrestateProvider) AbsolutePreStateCommitment(_ context.Context) (common.Hash, error) { + if p.prestateCommitment != (common.Hash{}) { + return p.prestateCommitment, nil + } + proof, _, _, err := p.stateConverter.ConvertStateToProof(p.prestate) + if err != nil { + return common.Hash{}, fmt.Errorf("cannot load absolute pre-state: %w", err) + } + p.prestateCommitment = proof.ClaimValue + return proof.ClaimValue, nil +} + +func (p *PrestateProvider) PrestatePath() string { + return p.prestate +} diff --git a/op-challenger/game/fault/trace/vm/prestate_test.go b/op-challenger/game/fault/trace/vm/prestate_test.go new file mode 100644 index 000000000000..69498e323c59 --- /dev/null +++ b/op-challenger/game/fault/trace/vm/prestate_test.go @@ -0,0 +1,63 @@ +package vm + +import ( + "context" + "errors" + "path/filepath" + "testing" + + "github.com/ethereum-optimism/optimism/op-challenger/game/fault/trace/utils" + "github.com/ethereum/go-ethereum/common" + "github.com/stretchr/testify/require" +) + +type stubConverter struct { + err error + hash common.Hash +} + +func (s *stubConverter) ConvertStateToProof(statePath string) (*utils.ProofData, uint64, bool, error) { + if s.err != nil { + return nil, 0, false, s.err + } + return &utils.ProofData{ + ClaimValue: s.hash, + }, 0, false, nil +} + +func newPrestateProvider(prestate common.Hash) *PrestateProvider { + return NewPrestateProvider("state.json", &stubConverter{hash: prestate}) +} + +func TestAbsolutePreStateCommitment(t *testing.T) { + prestate := common.Hash{0xaa, 0xbb} + + t.Run("StateUnavailable", func(t *testing.T) { + expectedErr := errors.New("kaboom") + provider := NewPrestateProvider("foo", &stubConverter{err: expectedErr}) + _, err := provider.AbsolutePreStateCommitment(context.Background()) + require.ErrorIs(t, err, expectedErr) + }) + + t.Run("ExpectedAbsolutePreState", func(t *testing.T) { + provider := newPrestateProvider(prestate) + actual, err := provider.AbsolutePreStateCommitment(context.Background()) + require.NoError(t, err) + require.Equal(t, prestate, actual) + }) + + t.Run("CacheAbsolutePreState", func(t *testing.T) { + converter := &stubConverter{hash: prestate} + provider := NewPrestateProvider(filepath.Join("state.json"), converter) + first, err := provider.AbsolutePreStateCommitment(context.Background()) + require.NoError(t, err) + + // Remove the prestate from disk + converter.err = errors.New("no soup for you") + + // Value should still be available from cache + cached, err := provider.AbsolutePreStateCommitment(context.Background()) + require.NoError(t, err) + require.Equal(t, first, cached) + }) +} diff --git a/op-challenger/game/fault/trace/vm/prestates.go b/op-challenger/game/fault/trace/vm/prestates.go new file mode 100644 index 000000000000..b54d86ed9cca --- /dev/null +++ b/op-challenger/game/fault/trace/vm/prestates.go @@ -0,0 +1,97 @@ +package vm + +import ( + "context" + "errors" + "fmt" + "os" + "os/exec" + "path/filepath" + "regexp" + "strconv" + + log2 "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, binary bool) (string, error) +type CmdExecutor func(ctx context.Context, l log.Logger, binary string, args ...string) error + +const ( + SnapsDir = "snapshots" + PreimagesDir = "preimages" + finalStateJson = "final.json.gz" + finalStateBinary = "final.bin.gz" +) + +func FinalStatePath(dir string, binarySnapshots bool) string { + filename := finalStateJson + if binarySnapshots { + filename = finalStateBinary + } + return filepath.Join(dir, filename) +} + +var snapshotJsonNameRegexp = regexp.MustCompile(`^[0-9]+\.json\.gz$`) +var snapshotBinaryNameRegexp = regexp.MustCompile(`^[0-9]+\.bin\.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 := log2.NewWriter(l, log.LevelInfo) + defer stdOut.Close() + // Keep stdErr at info level because FPVM uses stderr for progress messages + stdErr := log2.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, binarySnapshots bool) (string, error) { + suffix := ".json.gz" + nameRegexp := snapshotJsonNameRegexp + if binarySnapshots { + suffix = ".bin.gz" + nameRegexp = snapshotBinaryNameRegexp + } + // 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 !nameRegexp.MatchString(name) { + logger.Warn("Unexpected file in snapshots dir", "parent", snapDir, "child", entry.Name()) + continue + } + index, err := strconv.ParseUint(name[0:len(name)-len(suffix)], 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%v", snapDir, bestSnap, suffix) + + return startFrom, nil +} diff --git a/op-challenger/game/fault/types/types.go b/op-challenger/game/fault/types/types.go index fc81911effa9..46227668e928 100644 --- a/op-challenger/game/fault/types/types.go +++ b/op-challenger/game/fault/types/types.go @@ -2,7 +2,10 @@ package types import ( "context" + "encoding/binary" "errors" + "fmt" + "math" "math/big" "time" @@ -18,13 +21,100 @@ var ( ErrL2BlockNumberValid = errors.New("l2 block number is valid") ) +type GameType uint32 + const ( - CannonGameType uint32 = 0 - PermissionedGameType uint32 = 1 - AsteriscGameType uint32 = 2 - AlphabetGameType uint32 = 255 + CannonGameType GameType = 0 + PermissionedGameType GameType = 1 + AsteriscGameType GameType = 2 + AsteriscKonaGameType GameType = 3 + FastGameType GameType = 254 + AlphabetGameType GameType = 255 + UnknownGameType GameType = math.MaxUint32 ) +func (t GameType) MarshalText() ([]byte, error) { + return []byte(t.String()), nil +} + +func (t GameType) String() string { + switch t { + case CannonGameType: + return "cannon" + case PermissionedGameType: + return "permissioned" + case AsteriscGameType: + return "asterisc" + case AsteriscKonaGameType: + return "asterisc-kona" + case FastGameType: + return "fast" + case AlphabetGameType: + return "alphabet" + default: + return fmt.Sprintf("", t) + } +} + +type TraceType string + +const ( + TraceTypeAlphabet TraceType = "alphabet" + TraceTypeFast TraceType = "fast" + TraceTypeCannon TraceType = "cannon" + TraceTypeAsterisc TraceType = "asterisc" + TraceTypeAsteriscKona TraceType = "asterisc-kona" + TraceTypePermissioned TraceType = "permissioned" +) + +var TraceTypes = []TraceType{TraceTypeAlphabet, TraceTypeCannon, TraceTypePermissioned, TraceTypeAsterisc, TraceTypeAsteriscKona, TraceTypeFast} + +func (t TraceType) String() string { + return string(t) +} + +// Set implements the Set method required by the [cli.Generic] interface. +func (t *TraceType) Set(value string) error { + if !ValidTraceType(TraceType(value)) { + return fmt.Errorf("unknown trace type: %q", value) + } + *t = TraceType(value) + return nil +} + +func (t *TraceType) Clone() any { + cpy := *t + return &cpy +} + +func ValidTraceType(value TraceType) bool { + for _, t := range TraceTypes { + if t == value { + return true + } + } + return false +} + +func (t TraceType) GameType() GameType { + switch t { + case TraceTypeCannon: + return CannonGameType + case TraceTypePermissioned: + return PermissionedGameType + case TraceTypeAsterisc: + return AsteriscGameType + case TraceTypeAsteriscKona: + return AsteriscKonaGameType + case TraceTypeFast: + return FastGameType + case TraceTypeAlphabet: + return AlphabetGameType + default: + return UnknownGameType + } +} + type ClockReader interface { Now() time.Time } @@ -62,8 +152,12 @@ func (p *PreimageOracleData) GetPrecompileAddress() common.Address { return common.BytesToAddress(p.oracleData[8:28]) } +func (p *PreimageOracleData) GetPrecompileRequiredGas() uint64 { + return binary.BigEndian.Uint64(p.oracleData[28:36]) +} + func (p *PreimageOracleData) GetPrecompileInput() []byte { - return p.oracleData[28:] + return p.oracleData[36:] } // NewPreimageOracleData creates a new [PreimageOracleData] instance. diff --git a/op-challenger/game/fault/validator_test.go b/op-challenger/game/fault/validator_test.go index 6782e2651b46..5355722c5313 100644 --- a/op-challenger/game/fault/validator_test.go +++ b/op-challenger/game/fault/validator_test.go @@ -5,12 +5,13 @@ import ( "fmt" "testing" - "github.com/ethereum-optimism/optimism/cannon/mipsevm" - "github.com/ethereum-optimism/optimism/op-challenger/game/fault/types" - gameTypes "github.com/ethereum-optimism/optimism/op-challenger/game/types" "github.com/ethereum/go-ethereum/common" "github.com/ethereum/go-ethereum/crypto" "github.com/stretchr/testify/require" + + "github.com/ethereum-optimism/optimism/cannon/mipsevm" + "github.com/ethereum-optimism/optimism/op-challenger/game/fault/types" + gameTypes "github.com/ethereum-optimism/optimism/op-challenger/game/types" ) var ( diff --git a/op-challenger/game/keccak/fetcher/fetcher_test.go b/op-challenger/game/keccak/fetcher/fetcher_test.go index cedff735e9f9..2a976b3e6df0 100644 --- a/op-challenger/game/keccak/fetcher/fetcher_test.go +++ b/op-challenger/game/keccak/fetcher/fetcher_test.go @@ -437,7 +437,7 @@ func (s *stubL1Source) BlockByNumber(_ context.Context, number *big.Int) (*types if !ok { return nil, errors.New("not found") } - return (&types.Block{}).WithBody(txs, nil), nil + return (&types.Block{}).WithBody(types.Body{Transactions: txs}), nil } func (s *stubL1Source) TransactionReceipt(_ context.Context, txHash common.Hash) (*types.Receipt, error) { diff --git a/op-challenger/game/keccak/scheduler.go b/op-challenger/game/keccak/scheduler.go index e9d8cb583be4..233c2d218d31 100644 --- a/op-challenger/game/keccak/scheduler.go +++ b/op-challenger/game/keccak/scheduler.go @@ -21,8 +21,13 @@ type OracleSource interface { Oracles() []keccakTypes.LargePreimageOracle } +type Metrics interface { + RecordLargePreimageCount(count int) +} + type LargePreimageScheduler struct { log log.Logger + m Metrics cl faultTypes.ClockReader ch chan common.Hash oracles OracleSource @@ -33,11 +38,13 @@ type LargePreimageScheduler struct { func NewLargePreimageScheduler( logger log.Logger, + m Metrics, cl faultTypes.ClockReader, oracleSource OracleSource, challenger Challenger) *LargePreimageScheduler { return &LargePreimageScheduler{ log: logger, + m: m, cl: cl, ch: make(chan common.Hash, 1), oracles: oracleSource, @@ -94,6 +101,7 @@ func (s *LargePreimageScheduler) verifyOraclePreimages(ctx context.Context, orac if err != nil { return err } + s.m.RecordLargePreimageCount(len(preimages)) period, err := oracle.ChallengePeriod(ctx) if err != nil { return fmt.Errorf("failed to load challenge period: %w", err) diff --git a/op-challenger/game/keccak/scheduler_test.go b/op-challenger/game/keccak/scheduler_test.go index 067fc5d93065..30070becb82b 100644 --- a/op-challenger/game/keccak/scheduler_test.go +++ b/op-challenger/game/keccak/scheduler_test.go @@ -9,6 +9,7 @@ import ( "time" keccakTypes "github.com/ethereum-optimism/optimism/op-challenger/game/keccak/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-optimism/optimism/op-service/testlog" @@ -50,7 +51,7 @@ func TestScheduleNextCheck(t *testing.T) { } cl := clock.NewDeterministicClock(time.Unix(int64(currentTimestamp), 0)) challenger := &stubChallenger{} - scheduler := NewLargePreimageScheduler(logger, cl, OracleSourceArray{oracle}, challenger) + scheduler := NewLargePreimageScheduler(logger, metrics.NoopMetrics, cl, OracleSourceArray{oracle}, challenger) scheduler.Start(ctx) defer scheduler.Close() err := scheduler.Schedule(common.Hash{0xaa}, 3) diff --git a/op-challenger/game/monitor.go b/op-challenger/game/monitor.go index fe263a661692..dbdcc26ab81c 100644 --- a/op-challenger/game/monitor.go +++ b/op-challenger/game/monitor.go @@ -19,8 +19,6 @@ import ( "github.com/ethereum/go-ethereum/log" ) -type blockNumberFetcher func(ctx context.Context) (uint64, error) - // gameSource loads information about the games available to play type gameSource interface { GetGamesAtOrAfter(ctx context.Context, blockHash common.Hash, earliestTimestamp uint64) ([]types.GameMetadata, error) @@ -44,18 +42,17 @@ type claimer interface { } type gameMonitor struct { - logger log.Logger - clock RWClock - source gameSource - scheduler gameScheduler - preimages preimageScheduler - gameWindow time.Duration - claimer claimer - fetchBlockNumber blockNumberFetcher - allowedGames []common.Address - l1HeadsSub ethereum.Subscription - l1Source *headSource - runState sync.Mutex + logger log.Logger + clock RWClock + source gameSource + scheduler gameScheduler + preimages preimageScheduler + gameWindow time.Duration + claimer claimer + allowedGames []common.Address + l1HeadsSub ethereum.Subscription + l1Source *headSource + runState sync.Mutex } type MinimalSubscriber interface { @@ -78,21 +75,19 @@ func newGameMonitor( preimages preimageScheduler, gameWindow time.Duration, claimer claimer, - fetchBlockNumber blockNumberFetcher, allowedGames []common.Address, l1Source MinimalSubscriber, ) *gameMonitor { return &gameMonitor{ - logger: logger, - clock: cl, - scheduler: scheduler, - preimages: preimages, - source: source, - gameWindow: gameWindow, - claimer: claimer, - fetchBlockNumber: fetchBlockNumber, - allowedGames: allowedGames, - l1Source: &headSource{inner: l1Source}, + logger: logger, + clock: cl, + scheduler: scheduler, + preimages: preimages, + source: source, + gameWindow: gameWindow, + claimer: claimer, + allowedGames: allowedGames, + l1Source: &headSource{inner: l1Source}, } } diff --git a/op-challenger/game/monitor_test.go b/op-challenger/game/monitor_test.go index 7a3da241aa24..ff2871ed4efb 100644 --- a/op-challenger/game/monitor_test.go +++ b/op-challenger/game/monitor_test.go @@ -155,11 +155,6 @@ func setupMonitorTest( ) (*gameMonitor, *stubGameSource, *stubScheduler, *mockNewHeadSource, *stubPreimageScheduler, *mockScheduler) { logger := testlog.Logger(t, log.LevelDebug) source := &stubGameSource{} - i := uint64(1) - fetchBlockNum := func(ctx context.Context) (uint64, error) { - i++ - return i, nil - } sched := &stubScheduler{} preimages := &stubPreimageScheduler{} mockHeadSource := &mockNewHeadSource{} @@ -172,7 +167,6 @@ func setupMonitorTest( preimages, time.Duration(0), stubClaimer, - fetchBlockNum, allowedGames, mockHeadSource, ) diff --git a/op-challenger/game/registry/registry.go b/op-challenger/game/registry/registry.go index d6713a918ddc..3e016eb0d837 100644 --- a/op-challenger/game/registry/registry.go +++ b/op-challenger/game/registry/registry.go @@ -5,6 +5,7 @@ import ( "fmt" "github.com/ethereum-optimism/optimism/op-challenger/game/fault/claims" + faultTypes "github.com/ethereum-optimism/optimism/op-challenger/game/fault/types" "github.com/ethereum-optimism/optimism/op-challenger/game/scheduler" "github.com/ethereum-optimism/optimism/op-challenger/game/types" ) @@ -12,27 +13,27 @@ import ( var ErrUnsupportedGameType = errors.New("unsupported game type") type GameTypeRegistry struct { - types map[uint32]scheduler.PlayerCreator - bondCreators map[uint32]claims.BondContractCreator + types map[faultTypes.GameType]scheduler.PlayerCreator + bondCreators map[faultTypes.GameType]claims.BondContractCreator } func NewGameTypeRegistry() *GameTypeRegistry { return &GameTypeRegistry{ - types: make(map[uint32]scheduler.PlayerCreator), - bondCreators: make(map[uint32]claims.BondContractCreator), + types: make(map[faultTypes.GameType]scheduler.PlayerCreator), + bondCreators: make(map[faultTypes.GameType]claims.BondContractCreator), } } // RegisterGameType registers a scheduler.PlayerCreator to use for a specific game type. // Panics if the same game type is registered multiple times, since this indicates a significant programmer error. -func (r *GameTypeRegistry) RegisterGameType(gameType uint32, creator scheduler.PlayerCreator) { +func (r *GameTypeRegistry) RegisterGameType(gameType faultTypes.GameType, creator scheduler.PlayerCreator) { if _, ok := r.types[gameType]; ok { panic(fmt.Errorf("duplicate creator registered for game type: %v", gameType)) } r.types[gameType] = creator } -func (r *GameTypeRegistry) RegisterBondContract(gameType uint32, creator claims.BondContractCreator) { +func (r *GameTypeRegistry) RegisterBondContract(gameType faultTypes.GameType, creator claims.BondContractCreator) { if _, ok := r.bondCreators[gameType]; ok { panic(fmt.Errorf("duplicate bond contract registered for game type: %v", gameType)) } @@ -41,7 +42,7 @@ func (r *GameTypeRegistry) RegisterBondContract(gameType uint32, creator claims. // CreatePlayer creates a new game player for the given game, using the specified directory for persisting data. func (r *GameTypeRegistry) CreatePlayer(game types.GameMetadata, dir string) (scheduler.GamePlayer, error) { - creator, ok := r.types[game.GameType] + creator, ok := r.types[faultTypes.GameType(game.GameType)] if !ok { return nil, fmt.Errorf("%w: %v", ErrUnsupportedGameType, game.GameType) } @@ -49,7 +50,7 @@ func (r *GameTypeRegistry) CreatePlayer(game types.GameMetadata, dir string) (sc } func (r *GameTypeRegistry) CreateBondContract(game types.GameMetadata) (claims.BondContract, error) { - creator, ok := r.bondCreators[game.GameType] + creator, ok := r.bondCreators[faultTypes.GameType(game.GameType)] if !ok { return nil, fmt.Errorf("%w: %v", ErrUnsupportedGameType, game.GameType) } diff --git a/op-challenger/game/service.go b/op-challenger/game/service.go index 587de9a366ab..3aa0679d38c0 100644 --- a/op-challenger/game/service.go +++ b/op-challenger/game/service.go @@ -246,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.l1Clock, s.oracles, challenger) + s.preimages = keccak.NewLargePreimageScheduler(s.logger, s.metrics, s.l1Clock, s.oracles, challenger) return nil } func (s *Service) initMonitor(cfg *config.Config) { - s.monitor = newGameMonitor(s.logger, s.l1Clock, 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, cfg.GameAllowlist, s.pollClient) } func (s *Service) Start(ctx context.Context) error { @@ -281,6 +281,11 @@ func (s *Service) Stop(ctx context.Context) error { if s.monitor != nil { s.monitor.StopMonitoring() } + if s.claimer != nil { + if err := s.claimer.Close(); err != nil { + result = errors.Join(result, fmt.Errorf("failed to close claimer: %w", err)) + } + } if s.faultGamesCloser != nil { s.faultGamesCloser() } diff --git a/op-challenger/metrics/metrics.go b/op-challenger/metrics/metrics.go index 9253f26cc631..c6acc2b2f7bb 100644 --- a/op-challenger/metrics/metrics.go +++ b/op-challenger/metrics/metrics.go @@ -2,6 +2,7 @@ package metrics import ( "io" + "time" "github.com/ethereum-optimism/optimism/op-service/httputil" "github.com/ethereum-optimism/optimism/op-service/sources/caching" @@ -37,8 +38,6 @@ type Metricer interface { RecordGameStep() RecordGameMove() RecordGameL2Challenge() - RecordCannonExecutionTime(t float64) - RecordAsteriscExecutionTime(t float64) RecordClaimResolutionTime(t float64) RecordGameActTime(t float64) @@ -53,10 +52,16 @@ type Metricer interface { RecordGameUpdateScheduled() RecordGameUpdateCompleted() + RecordLargePreimageCount(count int) + IncActiveExecutors() DecActiveExecutors() IncIdleExecutors() DecIdleExecutors() + + // Record vm execution metrics + VmMetricer + VmMetrics(vmType string) *VmMetrics } // Metrics implementation must implement RegistryMetricer to allow the metrics server to work. @@ -81,6 +86,7 @@ type Metrics struct { preimageChallenged prometheus.Counter preimageChallengeFailed prometheus.Counter + preimageCount prometheus.Gauge highestActedL1Block prometheus.Gauge @@ -88,10 +94,10 @@ type Metrics struct { steps prometheus.Counter l2Challenges prometheus.Counter - claimResolutionTime prometheus.Histogram - gameActTime prometheus.Histogram - cannonExecutionTime prometheus.Histogram - asteriscExecutionTime prometheus.Histogram + claimResolutionTime prometheus.Histogram + gameActTime prometheus.Histogram + vmExecutionTime *prometheus.HistogramVec + vmMemoryUsed *prometheus.HistogramVec trackedGames prometheus.GaugeVec inflightGames prometheus.Gauge @@ -152,14 +158,6 @@ func NewMetrics() *Metrics { Name: "l2_challenges", Help: "Number of L2 challenges made by the challenge agent", }), - cannonExecutionTime: factory.NewHistogram(prometheus.HistogramOpts{ - Namespace: Namespace, - Name: "cannon_execution_time", - Help: "Time (in seconds) to execute cannon", - Buckets: append( - []float64{1.0, 10.0}, - prometheus.ExponentialBuckets(30.0, 2.0, 14)...), - }), claimResolutionTime: factory.NewHistogram(prometheus.HistogramOpts{ Namespace: Namespace, Name: "claim_resolution_time", @@ -174,14 +172,21 @@ func NewMetrics() *Metrics { []float64{1.0, 2.0, 5.0, 10.0}, prometheus.ExponentialBuckets(30.0, 2.0, 14)...), }), - asteriscExecutionTime: factory.NewHistogram(prometheus.HistogramOpts{ + vmExecutionTime: factory.NewHistogramVec(prometheus.HistogramOpts{ Namespace: Namespace, - Name: "asterisc_execution_time", - Help: "Time (in seconds) to execute asterisc", + Name: "vm_execution_time", + Help: "Time (in seconds) to execute the fault proof VM", Buckets: append( []float64{1.0, 10.0}, prometheus.ExponentialBuckets(30.0, 2.0, 14)...), - }), + }, []string{"vm"}), + vmMemoryUsed: factory.NewHistogramVec(prometheus.HistogramOpts{ + Namespace: Namespace, + Name: "vm_memory_used", + Help: "Memory used (in bytes) to execute the fault proof VM", + // 100MiB increments from 0 to 1.5GiB + Buckets: prometheus.LinearBuckets(0, 1024*1024*100, 15), + }, []string{"vm"}), bondClaimFailures: factory.NewCounter(prometheus.CounterOpts{ Namespace: Namespace, Name: "claim_failures", @@ -202,6 +207,11 @@ func NewMetrics() *Metrics { Name: "preimage_challenge_failed", Help: "Number of preimage challenges that failed", }), + preimageCount: factory.NewGauge(prometheus.GaugeOpts{ + Namespace: Namespace, + Name: "preimage_count", + Help: "Number of large preimage proposals being tracked by the challenger", + }), trackedGames: *factory.NewGaugeVec(prometheus.GaugeOpts{ Namespace: Namespace, Name: "tracked_games", @@ -270,6 +280,10 @@ func (m *Metrics) RecordPreimageChallengeFailed() { m.preimageChallengeFailed.Add(1) } +func (m *Metrics) RecordLargePreimageCount(count int) { + m.preimageCount.Set(float64(count)) +} + func (m *Metrics) RecordBondClaimFailed() { m.bondClaimFailures.Add(1) } @@ -278,12 +292,12 @@ func (m *Metrics) RecordBondClaimed(amount uint64) { m.bondsClaimed.Add(float64(amount)) } -func (m *Metrics) RecordCannonExecutionTime(t float64) { - m.cannonExecutionTime.Observe(t) +func (m *Metrics) RecordVmExecutionTime(vmType string, dur time.Duration) { + m.vmExecutionTime.WithLabelValues(vmType).Observe(dur.Seconds()) } -func (m *Metrics) RecordAsteriscExecutionTime(t float64) { - m.asteriscExecutionTime.Observe(t) +func (m *Metrics) RecordVmMemoryUsed(vmType string, memoryUsed uint64) { + m.vmMemoryUsed.WithLabelValues(vmType).Observe(float64(memoryUsed)) } func (m *Metrics) RecordClaimResolutionTime(t float64) { @@ -327,3 +341,7 @@ func (m *Metrics) RecordGameUpdateScheduled() { func (m *Metrics) RecordGameUpdateCompleted() { m.inflightGames.Sub(1) } + +func (m *Metrics) VmMetrics(vmType string) *VmMetrics { + return NewVmMetrics(m, vmType) +} diff --git a/op-challenger/metrics/noop.go b/op-challenger/metrics/noop.go index c238f03fcb73..84b5923a33d9 100644 --- a/op-challenger/metrics/noop.go +++ b/op-challenger/metrics/noop.go @@ -2,6 +2,7 @@ package metrics import ( "io" + "time" contractMetrics "github.com/ethereum-optimism/optimism/op-challenger/game/fault/contracts/metrics" "github.com/ethereum/go-ethereum/common" @@ -33,14 +34,15 @@ func (*NoopMetricsImpl) RecordActedL1Block(_ uint64) {} func (*NoopMetricsImpl) RecordPreimageChallenged() {} func (*NoopMetricsImpl) RecordPreimageChallengeFailed() {} +func (*NoopMetricsImpl) RecordLargePreimageCount(_ int) {} func (*NoopMetricsImpl) RecordBondClaimFailed() {} func (*NoopMetricsImpl) RecordBondClaimed(uint64) {} -func (*NoopMetricsImpl) RecordCannonExecutionTime(t float64) {} -func (*NoopMetricsImpl) RecordAsteriscExecutionTime(t float64) {} -func (*NoopMetricsImpl) RecordClaimResolutionTime(t float64) {} -func (*NoopMetricsImpl) RecordGameActTime(t float64) {} +func (*NoopMetricsImpl) RecordVmExecutionTime(_ string, _ time.Duration) {} +func (*NoopMetricsImpl) RecordVmMemoryUsed(_ string, _ uint64) {} +func (*NoopMetricsImpl) RecordClaimResolutionTime(t float64) {} +func (*NoopMetricsImpl) RecordGameActTime(t float64) {} func (*NoopMetricsImpl) RecordGamesStatus(inProgress, defenderWon, challengerWon int) {} @@ -54,3 +56,7 @@ func (*NoopMetricsImpl) DecIdleExecutors() {} func (*NoopMetricsImpl) CacheAdd(_ string, _ int, _ bool) {} func (*NoopMetricsImpl) CacheGet(_ string, _ bool) {} + +func (m *NoopMetricsImpl) VmMetrics(vmType string) *VmMetrics { + return NewVmMetrics(m, vmType) +} diff --git a/op-challenger/metrics/vm.go b/op-challenger/metrics/vm.go new file mode 100644 index 000000000000..70e9a363cb36 --- /dev/null +++ b/op-challenger/metrics/vm.go @@ -0,0 +1,28 @@ +package metrics + +import "time" + +type VmMetricer interface { + RecordVmExecutionTime(vmType string, t time.Duration) + RecordVmMemoryUsed(vmType string, memoryUsed uint64) +} + +type VmMetrics struct { + m VmMetricer + vmType string +} + +func NewVmMetrics(m VmMetricer, vmType string) *VmMetrics { + return &VmMetrics{ + m: m, + vmType: vmType, + } +} + +func (m *VmMetrics) RecordExecutionTime(dur time.Duration) { + m.m.RecordVmExecutionTime(m.vmType, dur) +} + +func (m *VmMetrics) RecordMemoryUsed(memoryUsed uint64) { + m.m.RecordVmMemoryUsed(m.vmType, memoryUsed) +} diff --git a/op-challenger/runner/factory.go b/op-challenger/runner/factory.go new file mode 100644 index 000000000000..898afdbbf1b7 --- /dev/null +++ b/op-challenger/runner/factory.go @@ -0,0 +1,95 @@ +package runner + +import ( + "errors" + "fmt" + "net/url" + "path/filepath" + + "github.com/ethereum-optimism/optimism/op-challenger/config" + "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/prestates" + "github.com/ethereum-optimism/optimism/op-challenger/game/fault/trace/utils" + "github.com/ethereum-optimism/optimism/op-challenger/game/fault/trace/vm" + "github.com/ethereum-optimism/optimism/op-challenger/game/fault/types" + "github.com/ethereum/go-ethereum/common" + "github.com/ethereum/go-ethereum/log" +) + +func createTraceProvider( + logger log.Logger, + m vm.Metricer, + cfg *config.Config, + prestateHash common.Hash, + traceType types.TraceType, + localInputs utils.LocalGameInputs, + dir string, +) (types.TraceProvider, error) { + switch traceType { + case types.TraceTypeCannon: + vmConfig := vm.NewOpProgramServerExecutor() + stateConverter := cannon.NewStateConverter() + prestate, err := getPrestate(prestateHash, cfg.CannonAbsolutePreStateBaseURL, cfg.CannonAbsolutePreState, dir, stateConverter) + if err != nil { + return nil, err + } + prestateProvider := vm.NewPrestateProvider(prestate, stateConverter) + return cannon.NewTraceProvider(logger, m, cfg.Cannon, vmConfig, prestateProvider, prestate, localInputs, dir, 42), nil + case types.TraceTypeAsterisc: + vmConfig := vm.NewOpProgramServerExecutor() + stateConverter := asterisc.NewStateConverter() + prestate, err := getPrestate(prestateHash, cfg.AsteriscAbsolutePreStateBaseURL, cfg.AsteriscAbsolutePreState, dir, stateConverter) + if err != nil { + return nil, err + } + prestateProvider := vm.NewPrestateProvider(prestate, stateConverter) + return asterisc.NewTraceProvider(logger, m, cfg.Asterisc, vmConfig, prestateProvider, prestate, localInputs, dir, 42), nil + case types.TraceTypeAsteriscKona: + vmConfig := vm.NewKonaExecutor() + stateConverter := asterisc.NewStateConverter() + prestate, err := getPrestate(prestateHash, cfg.AsteriscKonaAbsolutePreStateBaseURL, cfg.AsteriscKonaAbsolutePreState, dir, stateConverter) + if err != nil { + return nil, err + } + prestateProvider := vm.NewPrestateProvider(prestate, stateConverter) + return asterisc.NewTraceProvider(logger, m, cfg.AsteriscKona, vmConfig, prestateProvider, prestate, localInputs, dir, 42), nil + } + return nil, errors.New("invalid trace type") +} + +func createMTTraceProvider( + logger log.Logger, + m vm.Metricer, + vmConfig vm.Config, + prestateHash common.Hash, + absolutePrestateBaseURL *url.URL, + traceType types.TraceType, + localInputs utils.LocalGameInputs, + dir string, +) (types.TraceProvider, error) { + executor := vm.NewOpProgramServerExecutor() + stateConverter := cannon.NewStateConverter() + + prestateSource := prestates.NewMultiPrestateProvider(absolutePrestateBaseURL, filepath.Join(dir, "prestates"), cannon.NewStateConverter()) + prestatePath, err := prestateSource.PrestatePath(prestateHash) + if err != nil { + return nil, fmt.Errorf("failed to get prestate %v: %w", prestateHash, err) + } + prestateProvider := vm.NewPrestateProvider(prestatePath, stateConverter) + return cannon.NewTraceProvider(logger, m, vmConfig, executor, prestateProvider, prestatePath, localInputs, dir, 42), nil +} + +func getPrestate(prestateHash common.Hash, prestateBaseUrl *url.URL, prestatePath string, dataDir string, stateConverter vm.StateConverter) (string, error) { + prestateSource := prestates.NewPrestateSource( + prestateBaseUrl, + prestatePath, + filepath.Join(dataDir, "prestates"), + stateConverter) + + prestate, err := prestateSource.PrestatePath(prestateHash) + if err != nil { + return "", fmt.Errorf("failed to get prestate %v: %w", prestateHash, err) + } + return prestate, nil +} diff --git a/op-challenger/runner/metrics.go b/op-challenger/runner/metrics.go new file mode 100644 index 000000000000..1f347b62aa68 --- /dev/null +++ b/op-challenger/runner/metrics.go @@ -0,0 +1,112 @@ +package runner + +import ( + "time" + + contractMetrics "github.com/ethereum-optimism/optimism/op-challenger/game/fault/contracts/metrics" + opmetrics "github.com/ethereum-optimism/optimism/op-service/metrics" + "github.com/prometheus/client_golang/prometheus" +) + +const Namespace = "op_challenger_runner" + +type Metrics struct { + ns string + registry *prometheus.Registry + factory opmetrics.Factory + *contractMetrics.ContractMetrics + + vmExecutionTime *prometheus.HistogramVec + vmLastExecutionTime *prometheus.GaugeVec + vmMemoryUsed *prometheus.HistogramVec + vmLastMemoryUsed *prometheus.GaugeVec + successTotal *prometheus.CounterVec + failuresTotal *prometheus.CounterVec + invalidTotal *prometheus.CounterVec +} + +var _ Metricer = (*Metrics)(nil) + +// Metrics implementation must implement RegistryMetricer to allow the metrics server to work. +var _ opmetrics.RegistryMetricer = (*Metrics)(nil) + +func NewMetrics() *Metrics { + registry := opmetrics.NewRegistry() + factory := opmetrics.With(registry) + + return &Metrics{ + ns: Namespace, + registry: registry, + factory: factory, + + ContractMetrics: contractMetrics.MakeContractMetrics(Namespace, factory), + + vmExecutionTime: factory.NewHistogramVec(prometheus.HistogramOpts{ + Namespace: Namespace, + Name: "vm_execution_time", + Help: "Time (in seconds) to execute the fault proof VM", + Buckets: append( + []float64{1.0, 10.0}, + prometheus.ExponentialBuckets(30.0, 2.0, 14)...), + }, []string{"vm"}), + vmLastExecutionTime: factory.NewGaugeVec(prometheus.GaugeOpts{ + Namespace: Namespace, + Name: "vm_last_execution_time", + Help: "Time (in seconds) taken for the last execution of the fault proof VM", + }, []string{"vm"}), + vmMemoryUsed: factory.NewHistogramVec(prometheus.HistogramOpts{ + Namespace: Namespace, + Name: "vm_memory_used", + Help: "Memory used (in bytes) to execute the fault proof VM", + // 100MiB increments from 0 to 1.5GiB + Buckets: prometheus.LinearBuckets(0, 1024*1024*100, 15), + }, []string{"vm"}), + vmLastMemoryUsed: factory.NewGaugeVec(prometheus.GaugeOpts{ + Namespace: Namespace, + Name: "vm_last_memory_used", + Help: "Memory used (in bytes) for the last execution of the fault proof VM", + }, []string{"vm"}), + successTotal: factory.NewCounterVec(prometheus.CounterOpts{ + Namespace: Namespace, + Name: "success_total", + Help: "Number of VM executions that successfully verified the output root", + }, []string{"type"}), + failuresTotal: factory.NewCounterVec(prometheus.CounterOpts{ + Namespace: Namespace, + Name: "failures_total", + Help: "Number of failures to execute a VM", + }, []string{"type"}), + invalidTotal: factory.NewCounterVec(prometheus.CounterOpts{ + Namespace: Namespace, + Name: "invalid_total", + Help: "Number of runs that determined the output root was invalid", + }, []string{"type"}), + } +} + +func (m *Metrics) Registry() *prometheus.Registry { + return m.registry +} + +func (m *Metrics) RecordVmExecutionTime(vmType string, dur time.Duration) { + val := dur.Seconds() + m.vmExecutionTime.WithLabelValues(vmType).Observe(val) + m.vmLastExecutionTime.WithLabelValues(vmType).Set(val) +} + +func (m *Metrics) RecordVmMemoryUsed(vmType string, memoryUsed uint64) { + m.vmMemoryUsed.WithLabelValues(vmType).Observe(float64(memoryUsed)) + m.vmLastMemoryUsed.WithLabelValues(vmType).Set(float64(memoryUsed)) +} + +func (m *Metrics) RecordSuccess(vmType string) { + m.successTotal.WithLabelValues(vmType).Inc() +} + +func (m *Metrics) RecordFailure(vmType string) { + m.failuresTotal.WithLabelValues(vmType).Inc() +} + +func (m *Metrics) RecordInvalid(vmType string) { + m.invalidTotal.WithLabelValues(vmType).Inc() +} diff --git a/op-challenger/runner/runner.go b/op-challenger/runner/runner.go new file mode 100644 index 000000000000..61fc8180905f --- /dev/null +++ b/op-challenger/runner/runner.go @@ -0,0 +1,334 @@ +package runner + +import ( + "context" + "errors" + "fmt" + "math/big" + "net/url" + "os" + "path/filepath" + "sync" + "sync/atomic" + "time" + + "github.com/ethereum-optimism/optimism/cannon/mipsevm" + "github.com/ethereum-optimism/optimism/op-challenger/config" + "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/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/cliapp" + "github.com/ethereum-optimism/optimism/op-service/dial" + "github.com/ethereum-optimism/optimism/op-service/httputil" + opmetrics "github.com/ethereum-optimism/optimism/op-service/metrics" + "github.com/ethereum-optimism/optimism/op-service/sources" + "github.com/ethereum-optimism/optimism/op-service/sources/batching" + "github.com/ethereum/go-ethereum/common" + "github.com/ethereum/go-ethereum/log" +) + +const mtCannonType = "mt-cannon" + +var ( + ErrUnexpectedStatusCode = errors.New("unexpected status code") +) + +type Metricer interface { + contractMetrics.ContractMetricer + + RecordVmExecutionTime(vmType string, t time.Duration) + RecordVmMemoryUsed(vmType string, memoryUsed uint64) + RecordFailure(vmType string) + RecordInvalid(vmType string) + RecordSuccess(vmType string) +} + +type Runner struct { + log log.Logger + cfg *config.Config + addMTCannonPrestate common.Hash + addMTCannonPrestateURL *url.URL + m Metricer + + running atomic.Bool + ctx context.Context + cancel context.CancelFunc + wg sync.WaitGroup + metricsSrv *httputil.HTTPServer +} + +func NewRunner(logger log.Logger, cfg *config.Config, mtCannonPrestate common.Hash, mtCannonPrestateURL *url.URL) *Runner { + return &Runner{ + log: logger, + cfg: cfg, + addMTCannonPrestate: mtCannonPrestate, + addMTCannonPrestateURL: mtCannonPrestateURL, + m: NewMetrics(), + } +} + +func (r *Runner) Start(ctx context.Context) error { + if !r.running.CompareAndSwap(false, true) { + return errors.New("already started") + } + ctx, cancel := context.WithCancel(ctx) + r.ctx = ctx + r.cancel = cancel + if err := r.initMetricsServer(&r.cfg.MetricsConfig); err != nil { + return fmt.Errorf("failed to start metrics: %w", err) + } + + rollupClient, err := dial.DialRollupClientWithTimeout(ctx, 1*time.Minute, r.log, r.cfg.RollupRpc) + if err != nil { + return fmt.Errorf("failed to dial rollup client: %w", err) + } + + l1Client, err := dial.DialRPCClientWithTimeout(ctx, 1*time.Minute, r.log, r.cfg.L1EthRpc) + if err != nil { + return fmt.Errorf("failed to dial l1 client: %w", err) + } + caller := batching.NewMultiCaller(l1Client, batching.DefaultBatchSize) + + for _, traceType := range r.cfg.TraceTypes { + r.wg.Add(1) + go r.loop(ctx, traceType, rollupClient, caller) + } + + r.log.Info("Runners started") + return nil +} + +func (r *Runner) loop(ctx context.Context, traceType types.TraceType, client *sources.RollupClient, caller *batching.MultiCaller) { + defer r.wg.Done() + t := time.NewTicker(1 * time.Minute) + defer t.Stop() + for { + r.runAndRecordOnce(ctx, traceType, client, caller) + select { + case <-t.C: + case <-ctx.Done(): + return + } + } +} + +func (r *Runner) runAndRecordOnce(ctx context.Context, traceType types.TraceType, client *sources.RollupClient, caller *batching.MultiCaller) { + recordError := func(err error, traceType string, m Metricer, log log.Logger) { + if errors.Is(err, ErrUnexpectedStatusCode) { + log.Error("Incorrect status code", "type", traceType, "err", err) + m.RecordInvalid(traceType) + } else if err != nil { + log.Error("Failed to run", "type", traceType, "err", err) + m.RecordFailure(traceType) + } else { + log.Info("Successfully verified output root", "type", traceType) + m.RecordSuccess(traceType) + } + } + + prestateHash, err := r.getPrestateHash(ctx, traceType, caller) + if err != nil { + recordError(err, traceType.String(), r.m, r.log) + return + } + + localInputs, err := r.createGameInputs(ctx, client) + if err != nil { + recordError(err, traceType.String(), r.m, r.log) + return + } + + inputsLogger := r.log.New("l1", localInputs.L1Head, "l2", localInputs.L2Head, "l2Block", localInputs.L2BlockNumber, "claim", localInputs.L2Claim) + var wg sync.WaitGroup + wg.Add(1) + go func() { + defer wg.Done() + dir, err := r.prepDatadir(traceType.String()) + if err != nil { + recordError(err, traceType.String(), r.m, r.log) + return + } + err = r.runOnce(ctx, inputsLogger.With("type", traceType), traceType, prestateHash, localInputs, dir) + recordError(err, traceType.String(), r.m, r.log) + }() + + if traceType == types.TraceTypeCannon && r.addMTCannonPrestate != (common.Hash{}) && r.addMTCannonPrestateURL != nil { + wg.Add(1) + go func() { + defer wg.Done() + dir, err := r.prepDatadir(mtCannonType) + if err != nil { + recordError(err, mtCannonType, r.m, r.log) + return + } + logger := inputsLogger.With("type", mtCannonType) + err = r.runMTOnce(ctx, logger, localInputs, dir) + recordError(err, mtCannonType, r.m, r.log.With(mtCannonType, true)) + }() + } + wg.Wait() +} + +func (r *Runner) runOnce(ctx context.Context, logger log.Logger, traceType types.TraceType, prestateHash common.Hash, localInputs utils.LocalGameInputs, dir string) error { + provider, err := createTraceProvider(logger, metrics.NewVmMetrics(r.m, traceType.String()), r.cfg, prestateHash, traceType, localInputs, dir) + if err != nil { + return fmt.Errorf("failed to create trace provider: %w", err) + } + hash, err := provider.Get(ctx, types.RootPosition) + if err != nil { + return fmt.Errorf("failed to execute trace provider: %w", err) + } + if hash[0] != mipsevm.VMStatusValid { + return fmt.Errorf("%w: %v", ErrUnexpectedStatusCode, hash) + } + return nil +} + +func (r *Runner) runMTOnce(ctx context.Context, logger log.Logger, localInputs utils.LocalGameInputs, dir string) error { + provider, err := createMTTraceProvider(logger, metrics.NewVmMetrics(r.m, mtCannonType), r.cfg.Cannon, r.addMTCannonPrestate, r.addMTCannonPrestateURL, types.TraceTypeCannon, localInputs, dir) + if err != nil { + return fmt.Errorf("failed to create trace provider: %w", err) + } + hash, err := provider.Get(ctx, types.RootPosition) + if err != nil { + return fmt.Errorf("failed to execute trace provider: %w", err) + } + if hash[0] != mipsevm.VMStatusValid { + return fmt.Errorf("%w: %v", ErrUnexpectedStatusCode, hash) + } + return nil +} + +func (r *Runner) prepDatadir(traceType string) (string, error) { + dir := filepath.Join(r.cfg.Datadir, traceType) + if err := os.RemoveAll(dir); err != nil { + return "", fmt.Errorf("failed to remove old dir: %w", err) + } + if err := os.MkdirAll(dir, 0755); err != nil { + return "", fmt.Errorf("failed to create data dir (%v): %w", dir, err) + } + return dir, nil +} + +func (r *Runner) createGameInputs(ctx context.Context, client *sources.RollupClient) (utils.LocalGameInputs, error) { + status, err := client.SyncStatus(ctx) + if err != nil { + return utils.LocalGameInputs{}, fmt.Errorf("failed to get rollup sync status: %w", err) + } + + if status.FinalizedL2.Number == 0 { + return utils.LocalGameInputs{}, errors.New("safe head is 0") + } + l1Head := status.FinalizedL1 + if status.FinalizedL1.Number > status.CurrentL1.Number { + // Restrict the L1 head to a block that has actually be processed by op-node. + // This only matters if op-node is behind and hasn't processed all finalized L1 blocks yet. + l1Head = status.CurrentL1 + } + blockNumber, err := r.findL2BlockNumberToDispute(ctx, client, l1Head.Number, status.FinalizedL2.Number) + if err != nil { + return utils.LocalGameInputs{}, fmt.Errorf("failed to find l2 block number to dispute: %w", err) + } + claimOutput, err := client.OutputAtBlock(ctx, blockNumber) + if err != nil { + return utils.LocalGameInputs{}, fmt.Errorf("failed to get claim output: %w", err) + } + parentOutput, err := client.OutputAtBlock(ctx, blockNumber-1) + if err != nil { + return utils.LocalGameInputs{}, fmt.Errorf("failed to get claim output: %w", err) + } + localInputs := utils.LocalGameInputs{ + L1Head: l1Head.Hash, + L2Head: parentOutput.BlockRef.Hash, + L2OutputRoot: common.Hash(parentOutput.OutputRoot), + L2Claim: common.Hash(claimOutput.OutputRoot), + L2BlockNumber: new(big.Int).SetUint64(blockNumber), + } + return localInputs, nil +} + +func (r *Runner) findL2BlockNumberToDispute(ctx context.Context, client *sources.RollupClient, l1HeadNum uint64, l2BlockNum uint64) (uint64, error) { + // Try to find a L1 block prior to the batch that make l2BlockNum safe + // Limits how far back we search to 10 * 32 blocks + const skipSize = uint64(32) + for i := 0; i < 10; i++ { + if l1HeadNum < skipSize { + // Too close to genesis, give up and just use the original block + r.log.Info("Failed to find prior batch.") + return l2BlockNum, nil + } + l1HeadNum -= skipSize + priorSafeHead, err := client.SafeHeadAtL1Block(ctx, l1HeadNum) + if err != nil { + return 0, fmt.Errorf("failed to get prior safe head at L1 block %v: %w", l1HeadNum, err) + } + if priorSafeHead.SafeHead.Number < l2BlockNum { + // We walked back far enough to be before the batch that included l2BlockNum + // So use the first block after the prior safe head as the disputed block. + // It must be the first block in a batch. + return priorSafeHead.SafeHead.Number + 1, nil + } + } + r.log.Warn("Failed to find prior batch", "l2BlockNum", l2BlockNum, "earliestCheckL1Block", l1HeadNum) + return l2BlockNum, nil +} + +func (r *Runner) getPrestateHash(ctx context.Context, traceType types.TraceType, caller *batching.MultiCaller) (common.Hash, error) { + gameFactory := contracts.NewDisputeGameFactoryContract(r.m, r.cfg.GameFactoryAddress, caller) + gameImplAddr, err := gameFactory.GetGameImpl(ctx, traceType.GameType()) + if err != nil { + return common.Hash{}, fmt.Errorf("failed to load game impl: %w", err) + } + if gameImplAddr == (common.Address{}) { + return common.Hash{}, nil // No prestate is set, will only work if a single prestate is specified + } + gameImpl, err := contracts.NewFaultDisputeGameContract(ctx, r.m, gameImplAddr, caller) + if err != nil { + return common.Hash{}, fmt.Errorf("failed to create fault dispute game contract bindings for %v: %w", gameImplAddr, err) + } + prestateHash, err := gameImpl.GetAbsolutePrestateHash(ctx) + if err != nil { + return common.Hash{}, fmt.Errorf("failed to get absolute prestate hash for %v: %w", gameImplAddr, err) + } + return prestateHash, err +} + +func (r *Runner) Stop(ctx context.Context) error { + r.log.Info("Stopping") + if !r.running.CompareAndSwap(true, false) { + return errors.New("not started") + } + r.cancel() + r.wg.Wait() + + if r.metricsSrv != nil { + return r.metricsSrv.Stop(ctx) + } + return nil +} + +func (r *Runner) Stopped() bool { + return !r.running.Load() +} + +func (r *Runner) initMetricsServer(cfg *opmetrics.CLIConfig) error { + if !cfg.Enabled { + return nil + } + r.log.Debug("Starting metrics server", "addr", cfg.ListenAddr, "port", cfg.ListenPort) + m, ok := r.m.(opmetrics.RegistryMetricer) + if !ok { + return fmt.Errorf("metrics were enabled, but metricer %T does not expose registry for metrics-server", r.m) + } + metricsSrv, err := opmetrics.StartServer(m.Registry(), cfg.ListenAddr, cfg.ListenPort) + if err != nil { + return fmt.Errorf("failed to start metrics server: %w", err) + } + r.log.Info("started metrics server", "addr", metricsSrv.Addr()) + r.metricsSrv = metricsSrv + return nil +} + +var _ cliapp.Lifecycle = (*Runner)(nil) diff --git a/op-challenger/sender/sender_test.go b/op-challenger/sender/sender_test.go index e83f2416d93f..5169ae67192a 100644 --- a/op-challenger/sender/sender_test.go +++ b/op-challenger/sender/sender_test.go @@ -3,6 +3,7 @@ package sender import ( "context" "fmt" + "math/big" "sync" "testing" "time" @@ -12,6 +13,7 @@ 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/rpc" "github.com/stretchr/testify/require" "golang.org/x/exp/maps" ) @@ -127,6 +129,10 @@ func (s *stubTxMgr) Send(ctx context.Context, candidate txmgr.TxCandidate) (*typ return <-ch, nil } +func (s *stubTxMgr) SendAsync(ctx context.Context, candidate txmgr.TxCandidate, ch chan txmgr.SendResponse) { + panic("unimplemented") +} + func (s *stubTxMgr) recordTx(candidate txmgr.TxCandidate) chan *types.Receipt { s.m.Lock() defer s.m.Unlock() @@ -170,5 +176,13 @@ func (s *stubTxMgr) BlockNumber(_ context.Context) (uint64, error) { panic("unsupported") } +func (s *stubTxMgr) API() rpc.API { + panic("unimplemented") +} + func (s *stubTxMgr) Close() { } + +func (s *stubTxMgr) SuggestGasPriceCaps(context.Context) (*big.Int, *big.Int, *big.Int, error) { + panic("unimplemented") +} diff --git a/op-conductor/Makefile b/op-conductor/Makefile index 5021e5706af5..6360df3da0c8 100644 --- a/op-conductor/Makefile +++ b/op-conductor/Makefile @@ -8,7 +8,7 @@ LDFLAGSSTRING +=-X main.Version=$(VERSION) LDFLAGS := -ldflags "$(LDFLAGSSTRING)" op-conductor: - env GO111MODULE=on GOOS=$(TARGETOS) GOARCH=$(TARGETARCH) go build -v $(LDFLAGS) -o ./bin/op-conductor ./cmd + env GO111MODULE=on GOOS=$(TARGETOS) GOARCH=$(TARGETARCH) CGO_ENABLED=0 go build -v $(LDFLAGS) -o ./bin/op-conductor ./cmd clean: rm bin/op-conductor diff --git a/op-conductor/cmd/main.go b/op-conductor/cmd/main.go index 508ffe220df0..3497e85f7917 100644 --- a/op-conductor/cmd/main.go +++ b/op-conductor/cmd/main.go @@ -12,8 +12,8 @@ import ( "github.com/ethereum-optimism/optimism/op-conductor/flags" opservice "github.com/ethereum-optimism/optimism/op-service" "github.com/ethereum-optimism/optimism/op-service/cliapp" + "github.com/ethereum-optimism/optimism/op-service/ctxinterrupt" oplog "github.com/ethereum-optimism/optimism/op-service/log" - "github.com/ethereum-optimism/optimism/op-service/opio" ) var ( @@ -34,7 +34,7 @@ func main() { app.Action = cliapp.LifecycleCmd(OpConductorMain) app.Commands = []*cli.Command{} - ctx := opio.WithInterruptBlocker(context.Background()) + ctx := ctxinterrupt.WithSignalWaiterMain(context.Background()) err := app.RunContext(ctx, os.Args) if err != nil { log.Crit("Application failed", "message", err) diff --git a/op-conductor/conductor/config.go b/op-conductor/conductor/config.go index 2d356a6553e1..ca18de7d1a18 100644 --- a/op-conductor/conductor/config.go +++ b/op-conductor/conductor/config.go @@ -3,6 +3,7 @@ package conductor import ( "fmt" "math" + "time" "github.com/ethereum/go-ethereum/log" "github.com/pkg/errors" @@ -33,6 +34,15 @@ type Config struct { // RaftBootstrap is true if this node should bootstrap a new raft cluster. RaftBootstrap bool + // RaftSnapshotInterval is the interval to check if a snapshot should be taken. + RaftSnapshotInterval time.Duration + + // RaftSnapshotThreshold is the number of logs to trigger a snapshot. + RaftSnapshotThreshold uint64 + + // RaftTrailingLogs is the number of logs to keep after a snapshot. + RaftTrailingLogs uint64 + // NodeRPC is the HTTP provider URL for op-node. NodeRPC string @@ -107,14 +117,17 @@ func NewConfig(ctx *cli.Context, log log.Logger) (*Config, error) { } return &Config{ - ConsensusAddr: ctx.String(flags.ConsensusAddr.Name), - ConsensusPort: ctx.Int(flags.ConsensusPort.Name), - RaftBootstrap: ctx.Bool(flags.RaftBootstrap.Name), - RaftServerID: ctx.String(flags.RaftServerID.Name), - RaftStorageDir: ctx.String(flags.RaftStorageDir.Name), - NodeRPC: ctx.String(flags.NodeRPC.Name), - ExecutionRPC: ctx.String(flags.ExecutionRPC.Name), - Paused: ctx.Bool(flags.Paused.Name), + ConsensusAddr: ctx.String(flags.ConsensusAddr.Name), + ConsensusPort: ctx.Int(flags.ConsensusPort.Name), + RaftBootstrap: ctx.Bool(flags.RaftBootstrap.Name), + RaftServerID: ctx.String(flags.RaftServerID.Name), + RaftStorageDir: ctx.String(flags.RaftStorageDir.Name), + RaftSnapshotInterval: ctx.Duration(flags.RaftSnapshotInterval.Name), + RaftSnapshotThreshold: ctx.Uint64(flags.RaftSnapshotThreshold.Name), + RaftTrailingLogs: ctx.Uint64(flags.RaftTrailingLogs.Name), + NodeRPC: ctx.String(flags.NodeRPC.Name), + ExecutionRPC: ctx.String(flags.ExecutionRPC.Name), + Paused: ctx.Bool(flags.Paused.Name), HealthCheck: HealthCheckConfig{ Interval: ctx.Uint64(flags.HealthCheckInterval.Name), UnsafeInterval: ctx.Uint64(flags.HealthCheckUnsafeInterval.Name), diff --git a/op-conductor/conductor/service.go b/op-conductor/conductor/service.go index 9686d376b86d..d2eb4fe89d9d 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{}), @@ -67,6 +72,7 @@ func NewOpConductor( ctrl: ctrl, cons: cons, hmon: hmon, + retryBackoff: func() time.Duration { return time.Duration(rand.Intn(2000)) * time.Millisecond }, } oc.loopActionFn = oc.loopAction @@ -90,7 +96,6 @@ func NewOpConductor( } return nil, err } - oc.prevState = NewState(oc.leader.Load(), oc.healthy.Load(), oc.seqActive.Load()) return oc, nil } @@ -144,7 +149,17 @@ func (c *OpConductor) initConsensus(ctx context.Context) error { } serverAddr := fmt.Sprintf("%s:%d", c.cfg.ConsensusAddr, c.cfg.ConsensusPort) - cons, err := consensus.NewRaftConsensus(c.log, c.cfg.RaftServerID, serverAddr, c.cfg.RaftStorageDir, c.cfg.RaftBootstrap, &c.cfg.RollupCfg) + raftConsensusConfig := &consensus.RaftConsensusConfig{ + ServerID: c.cfg.RaftServerID, + ServerAddr: serverAddr, + StorageDir: c.cfg.RaftStorageDir, + Bootstrap: c.cfg.RaftBootstrap, + RollupCfg: &c.cfg.RollupCfg, + SnapshotInterval: c.cfg.RaftSnapshotInterval, + SnapshotThreshold: c.cfg.RaftSnapshotThreshold, + TrailingLogs: c.cfg.RaftTrailingLogs, + } + cons, err := consensus.NewRaftConsensus(c.log, raftConsensusConfig) if err != nil { return errors.Wrap(err, "failed to create raft consensus") } @@ -172,6 +187,7 @@ 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, @@ -245,6 +261,7 @@ type OpConductor struct { log log.Logger version string cfg *Config + metrics metrics.Metricer ctrl client.SequencerControl cons consensus.Consensus @@ -271,7 +288,10 @@ type OpConductor struct { shutdownCtx context.Context shutdownCancel context.CancelFunc - rpcServer *oprpc.Server + rpcServer *oprpc.Server + metricsServer *httputil.HTTPServer + + retryBackoff func() time.Duration } type state struct { @@ -301,7 +321,7 @@ var _ cliapp.Lifecycle = (*OpConductor)(nil) func (oc *OpConductor) Start(ctx context.Context) error { oc.log.Info("starting OpConductor") - if err := oc.hmon.Start(); err != nil { + if err := oc.hmon.Start(ctx); err != nil { return errors.Wrap(err, "failed to start health monitor") } @@ -310,10 +330,30 @@ 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") + // queue an action in case sequencer is not in the desired state. + oc.prevState = NewState(oc.leader.Load(), oc.healthy.Load(), oc.seqActive.Load()) + oc.queueAction() + return nil } @@ -350,6 +390,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() @@ -417,18 +463,18 @@ func (oc *OpConductor) LeaderWithID(_ context.Context) *consensus.ServerInfo { } // AddServerAsVoter adds a server as a voter to the cluster. -func (oc *OpConductor) AddServerAsVoter(_ context.Context, id string, addr string) error { - return oc.cons.AddVoter(id, addr) +func (oc *OpConductor) AddServerAsVoter(_ context.Context, id string, addr string, version uint64) error { + return oc.cons.AddVoter(id, addr, version) } // AddServerAsNonvoter adds a server as a non-voter to the cluster. non-voter will not participate in leader election. -func (oc *OpConductor) AddServerAsNonvoter(_ context.Context, id string, addr string) error { - return oc.cons.AddNonVoter(id, addr) +func (oc *OpConductor) AddServerAsNonvoter(_ context.Context, id string, addr string, version uint64) error { + return oc.cons.AddNonVoter(id, addr, version) } // RemoveServer removes a server from the cluster. -func (oc *OpConductor) RemoveServer(_ context.Context, id string) error { - return oc.cons.RemoveServer(id) +func (oc *OpConductor) RemoveServer(_ context.Context, id string, version uint64) error { + return oc.cons.RemoveServer(id, version) } // TransferLeader transfers leadership to another server. @@ -441,7 +487,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) } @@ -452,12 +498,12 @@ func (oc *OpConductor) SequencerHealthy(_ context.Context) bool { } // ClusterMembership returns current cluster's membership information. -func (oc *OpConductor) ClusterMembership(_ context.Context) ([]*consensus.ServerInfo, error) { +func (oc *OpConductor) ClusterMembership(_ context.Context) (*consensus.ClusterMembership, error) { 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() } @@ -465,12 +511,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()) } } @@ -522,12 +570,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 } @@ -559,11 +606,11 @@ func (oc *OpConductor) action() { // 1. current node is follower, active sequencer became unhealthy and started the leadership transfer process. // however if leadership transfer took longer than the time for health monitor to treat the node as unhealthy, // then basically the entire network is stalled and we need to start sequencing in this case. - if !oc.prevState.leader && !oc.prevState.active { - _, _, cerr := oc.compareUnsafeHead(oc.shutdownCtx) - if cerr == nil && !errors.Is(oc.hcerr, health.ErrSequencerConnectionDown) { - // if unsafe in consensus is the same as unsafe in op-node, then it is scenario #1 and we should start sequencer. - err = oc.startSequencer() + if !oc.prevState.leader && !oc.prevState.active && !errors.Is(oc.hcerr, health.ErrSequencerConnectionDown) { + err = oc.startSequencer() + if err != nil { + oc.log.Error("failed to start sequencer, transferring leadership instead", "server", oc.cons.ServerID(), "err", err) + } else { break } } @@ -610,16 +657,19 @@ 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, "status", status) - // randomly sleep for 0-200ms to avoid excessive retry - time.Sleep(time.Duration(rand.Intn(200)) * time.Millisecond) - oc.queueAction() + select { + case <-oc.shutdownCtx.Done(): + case <-time.After(oc.retryBackoff()): + oc.log.Error("failed to execute step, queueing another one to retry", "err", err, "status", status) + oc.queueAction() + } return } 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) } } @@ -628,6 +678,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 @@ -645,17 +696,33 @@ func (oc *OpConductor) transferLeader() error { } func (oc *OpConductor) stopSequencer() error { - oc.log.Info("stopping sequencer", "server", oc.cons.ServerID(), "leader", oc.leader.Load(), "healthy", oc.healthy.Load(), "active", oc.seqActive.Load()) - - _, err := oc.ctrl.StopSequencer(context.Background()) - if err != nil { + oc.log.Info( + "stopping sequencer", + "server", oc.cons.ServerID(), + "leader", oc.leader.Load(), + "healthy", oc.healthy.Load(), + "active", oc.seqActive.Load()) + + // Quoting (@zhwrd): StopSequencer is called after conductor loses leadership. In the event that + // the StopSequencer call fails, it actually has little real consequences because the sequencer + // cant produce a block and gossip / commit it to the raft log (requires leadership). Once + // conductor comes back up it will check its leader and sequencer state and attempt to stop the + // sequencer again. So it is "okay" to fail to stop a sequencer, the state will eventually be + // rectified and we won't have two active sequencers that are actually producing blocks. + // + // To that end we allow to cancel the StopSequencer call if we're shutting down. + latestHead, err := oc.ctrl.StopSequencer(oc.shutdownCtx) + if err == nil { + // None of the consensus state should have changed here so don't log it again. + oc.log.Info("stopped sequencer", "latestHead", latestHead) + } else { if strings.Contains(err.Error(), driver.ErrSequencerAlreadyStopped.Error()) { - oc.log.Warn("sequencer already stopped.", "err", err) + oc.log.Warn("sequencer already stopped", "err", err) } else { return errors.Wrap(err, "failed to stop sequencer") } } - + oc.metrics.RecordStopSequencer(err == nil) oc.seqActive.Store(false) return nil } @@ -667,18 +734,26 @@ func (oc *OpConductor) startSequencer() error { // If not, then we wait for the unsafe head to catch up or gossip it to op-node manually from op-conductor. 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 { - // tries to post the unsafe head to op-node when head is only 1 block behind (most likely due to gossip delay) - if innerErr := oc.ctrl.PostUnsafePayload(ctx, unsafeInCons); innerErr != nil { - oc.log.Error("failed to post unsafe head payload envelope to op-node", "err", innerErr) - } + 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 err := oc.ctrl.PostUnsafePayload(ctx, unsafeInCons); err != nil { + oc.log.Error("failed to post unsafe head payload envelope to op-node", "err", err) + return err } + } else if err != nil { return err } 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) @@ -686,15 +761,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) @@ -702,17 +781,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..49a05e902763 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" @@ -63,7 +64,7 @@ func mockConfig(t *testing.T) Config { BlockTime: 2, MaxSequencerDrift: 600, SeqWindowSize: 3600, - ChannelTimeout: 300, + ChannelTimeoutBedrock: 300, L1ChainID: big.NewInt(1), L2ChainID: big.NewInt(2), RegolithTime: &now, @@ -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,12 +116,13 @@ 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) + conductor.retryBackoff = func() time.Duration { return 0 } // disable retry backoff for tests s.conductor = conductor s.healthUpdateCh = make(chan error, 1) - s.hmon.EXPECT().Start().Return(nil) + s.hmon.EXPECT().Start(mock.Anything).Return(nil) s.conductor.healthUpdateCh = s.healthUpdateCh s.leaderUpdateCh = make(chan bool, 1) @@ -156,6 +160,7 @@ func (s *OpConductorTestSuite) enableSynchronization() { s.wg.Done() } s.startConductor() + s.executeAction() } func (s *OpConductorTestSuite) disableSynchronization() { @@ -289,7 +294,7 @@ func (s *OpConductorTestSuite) TestScenario1() { // unsafe in consensus is different than unsafe in node. mockPayload := ð.ExecutionPayloadEnvelope{ ExecutionPayload: ð.ExecutionPayload{ - BlockNumber: 2, + BlockNumber: 3, BlockHash: [32]byte{4, 5, 6}, }, } @@ -298,7 +303,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 +322,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 +394,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,9 +433,10 @@ 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) + s.ctrl.EXPECT().PostUnsafePayload(mock.Anything, mockPayload).Return(errors.New("simulated PostUnsafePayload failure")).Times(1) + s.ctrl.EXPECT().StartSequencer(mock.Anything, mockPayload.ExecutionPayload.BlockHash).Return(nil).Times(1) s.updateLeaderStatusAndExecuteAction(true) @@ -402,16 +444,14 @@ func (s *OpConductorTestSuite) TestScenario4() { s.True(s.conductor.leader.Load()) s.True(s.conductor.healthy.Load()) s.False(s.conductor.seqActive.Load()) - s.ctrl.AssertNotCalled(s.T(), "StartSequencer", mock.Anything, mock.Anything) + s.cons.AssertNumberOfCalls(s.T(), "LatestUnsafePayload", 1) s.ctrl.AssertNumberOfCalls(s.T(), "LatestUnsafeBlock", 1) s.ctrl.AssertNumberOfCalls(s.T(), "PostUnsafePayload", 1) - s.cons.AssertNumberOfCalls(s.T(), "LatestUnsafePayload", 1) + s.ctrl.AssertNotCalled(s.T(), "StartSequencer", mock.Anything, mock.Anything) - // 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().PostUnsafePayload(mock.Anything, mockPayload).Return(nil).Times(1) s.ctrl.EXPECT().StartSequencer(mock.Anything, mockBlockInfo.InfoHash).Return(nil).Times(1) s.executeAction() @@ -420,10 +460,10 @@ func (s *OpConductorTestSuite) TestScenario4() { s.True(s.conductor.leader.Load()) s.True(s.conductor.healthy.Load()) s.True(s.conductor.seqActive.Load()) + s.cons.AssertNumberOfCalls(s.T(), "LatestUnsafePayload", 2) s.ctrl.AssertNumberOfCalls(s.T(), "LatestUnsafeBlock", 2) - s.ctrl.AssertNumberOfCalls(s.T(), "PostUnsafePayload", 1) + s.ctrl.AssertNumberOfCalls(s.T(), "PostUnsafePayload", 2) s.ctrl.AssertNumberOfCalls(s.T(), "StartSequencer", 1) - s.cons.AssertNumberOfCalls(s.T(), "LatestUnsafePayload", 2) } // In this test, we have a follower that is healthy and not sequencing, we send a unhealthy update to it and expect it to stay as follower and not start sequencing. @@ -664,7 +704,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) @@ -678,8 +718,104 @@ func (s *OpConductorTestSuite) TestFailureAndRetry3() { healthy: false, active: false, }, s.conductor.prevState) - s.cons.AssertNumberOfCalls(s.T(), "LatestUnsafePayload", 2) - s.ctrl.AssertNumberOfCalls(s.T(), "LatestUnsafeBlock", 2) + s.cons.AssertNumberOfCalls(s.T(), "LatestUnsafePayload", 1) + s.ctrl.AssertNumberOfCalls(s.T(), "LatestUnsafeBlock", 1) + s.ctrl.AssertNumberOfCalls(s.T(), "StartSequencer", 1) + + s.log.Info("4. stay unhealthy for a bit while catching up") + s.updateHealthStatusAndExecuteAction(health.ErrSequencerNotHealthy) + + s.True(s.conductor.leader.Load()) + s.False(s.conductor.healthy.Load()) + s.True(s.conductor.seqActive.Load()) + s.Equal(&state{ + leader: true, + healthy: false, + active: false, + }, s.conductor.prevState) + + s.log.Info("5. become healthy again") + s.updateHealthStatusAndExecuteAction(nil) + + // need to use eventually here because starting from step 4, the loop is gonna queue an action and retry until it became healthy again. + // use eventually here avoids the situation where health update is consumed after the action is executed. + s.Eventually(func() bool { + res := s.conductor.leader.Load() == true && + s.conductor.healthy.Load() == true && + s.conductor.seqActive.Load() == true && + s.conductor.prevState.Equal(&state{ + leader: true, + healthy: true, + active: true, + }) + if !res { + s.executeAction() + } + return res + }, 2*time.Second, time.Millisecond) +} + +// This test is similar to TestFailureAndRetry3, but the consensus payload is one block ahead of the new leader's unsafe head. +// Then leadership transfer happened, and the follower became leader. We expect it to start sequencing and catch up eventually. +// 1. [follower, healthy, not sequencing] -- become unhealthy --> +// 2. [follower, unhealthy, not sequencing] -- gained leadership --> +// 3. [leader, unhealthy, not sequencing] -- start sequencing --> +// 4. [leader, unhealthy, sequencing] -> become healthy again --> +// 5. [leader, healthy, sequencing] +func (s *OpConductorTestSuite) TestFailureAndRetry4() { + s.enableSynchronization() + + // set initial state, healthy follower + s.conductor.leader.Store(false) + s.conductor.healthy.Store(true) + s.conductor.seqActive.Store(false) + s.conductor.prevState = &state{ + leader: false, + healthy: true, + active: false, + } + + s.log.Info("1. become unhealthy") + s.updateHealthStatusAndExecuteAction(health.ErrSequencerNotHealthy) + + s.False(s.conductor.leader.Load()) + s.False(s.conductor.healthy.Load()) + s.False(s.conductor.seqActive.Load()) + s.Equal(&state{ + leader: false, + healthy: false, + active: false, + }, s.conductor.prevState) + + s.log.Info("2 & 3. gained leadership, post unsafe payload and start sequencing") + mockPayload := ð.ExecutionPayloadEnvelope{ + ExecutionPayload: ð.ExecutionPayload{ + BlockNumber: 2, + BlockHash: [32]byte{4, 5, 6}, + }, + } + mockBlockInfo := &testutils.MockBlockInfo{ + InfoNum: 1, + InfoHash: [32]byte{1, 2, 3}, + } + s.cons.EXPECT().LatestUnsafePayload().Return(mockPayload, nil).Times(2) + s.ctrl.EXPECT().LatestUnsafeBlock(mock.Anything).Return(mockBlockInfo, nil).Times(2) + s.ctrl.EXPECT().PostUnsafePayload(mock.Anything, mockPayload).Return(nil).Times(1) + s.ctrl.EXPECT().StartSequencer(mock.Anything, mockPayload.ExecutionPayload.BlockHash).Return(nil).Times(1) + + s.updateLeaderStatusAndExecuteAction(true) + + s.True(s.conductor.leader.Load()) + s.False(s.conductor.healthy.Load()) + s.True(s.conductor.seqActive.Load()) + s.Equal(&state{ + leader: true, + healthy: false, + active: false, + }, s.conductor.prevState) + s.cons.AssertNumberOfCalls(s.T(), "LatestUnsafePayload", 1) + s.ctrl.AssertNumberOfCalls(s.T(), "LatestUnsafeBlock", 1) + s.ctrl.AssertNumberOfCalls(s.T(), "PostUnsafePayload", 1) s.ctrl.AssertNumberOfCalls(s.T(), "StartSequencer", 1) s.log.Info("4. stay unhealthy for a bit while catching up") @@ -715,6 +851,22 @@ func (s *OpConductorTestSuite) TestFailureAndRetry3() { }, 2*time.Second, 100*time.Millisecond) } +func (s *OpConductorTestSuite) TestConductorRestart() { + // set initial state + s.conductor.leader.Store(false) + s.conductor.healthy.Store(true) + s.conductor.seqActive.Store(true) + s.ctrl.EXPECT().StopSequencer(mock.Anything).Return(common.Hash{}, nil).Times(1) + + s.enableSynchronization() + + // expect to stay as follower, go to [follower, healthy, not sequencing] + s.False(s.conductor.leader.Load()) + s.True(s.conductor.healthy.Load()) + s.False(s.conductor.seqActive.Load()) + s.ctrl.AssertCalled(s.T(), "StopSequencer", mock.Anything) +} + func (s *OpConductorTestSuite) TestHandleInitError() { // This will cause an error in the init function, which should cause the conductor to stop successfully without issues. _, err := New(s.ctx, &s.cfg, s.log, s.version) diff --git a/op-conductor/consensus/iface.go b/op-conductor/consensus/iface.go index 7134eef5a273..69b9506c50b2 100644 --- a/op-conductor/consensus/iface.go +++ b/op-conductor/consensus/iface.go @@ -25,6 +25,12 @@ func (s ServerSuffrage) String() string { return "ServerSuffrage" } +// ClusterMembership defines a versioned list of servers in the cluster. +type ClusterMembership struct { + Servers []ServerInfo `json:"servers"` + Version uint64 `json:"version"` +} + // ServerInfo defines the server information. type ServerInfo struct { ID string `json:"id"` @@ -37,13 +43,17 @@ type ServerInfo struct { //go:generate mockery --name Consensus --output mocks/ --with-expecter=true type Consensus interface { // AddVoter adds a voting member into the cluster, voter is eligible to become leader. - AddVoter(id, addr string) error + // If version is non-zero, this will only be applied if the current cluster version matches the expected version. + AddVoter(id, addr string, version uint64) error // AddNonVoter adds a non-voting member into the cluster, non-voter is not eligible to become leader. - AddNonVoter(id, addr string) error + // If version is non-zero, this will only be applied if the current cluster version matches the expected version. + AddNonVoter(id, addr string, version uint64) error // DemoteVoter demotes a voting member into a non-voting member, if leader is being demoted, it will cause a new leader election. - DemoteVoter(id string) error + // If version is non-zero, this will only be applied if the current cluster version matches the expected version. + DemoteVoter(id string, version uint64) error // RemoveServer removes a member (both voter or non-voter) from the cluster, if leader is being removed, it will cause a new leader election. - RemoveServer(id string) error + // If version is non-zero, this will only be applied if the current cluster version matches the expected version. + RemoveServer(id string, version uint64) error // LeaderCh returns a channel that will be notified when leadership status changes (true = leader, false = follower) LeaderCh() <-chan bool // Leader returns if it is the leader of the cluster. @@ -56,13 +66,13 @@ type Consensus interface { TransferLeader() error // TransferLeaderTo triggers leadership transfer to a specific member in the cluster. TransferLeaderTo(id, addr string) error - // ClusterMembership returns the current cluster membership configuration. - ClusterMembership() ([]*ServerInfo, error) + // ClusterMembership returns the current cluster membership configuration and associated version. + ClusterMembership() (*ClusterMembership, 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..ca1397a690e1 100644 --- a/op-conductor/consensus/mocks/Consensus.go +++ b/op-conductor/consensus/mocks/Consensus.go @@ -22,17 +22,17 @@ func (_m *Consensus) EXPECT() *Consensus_Expecter { return &Consensus_Expecter{mock: &_m.Mock} } -// AddNonVoter provides a mock function with given fields: id, addr -func (_m *Consensus) AddNonVoter(id string, addr string) error { - ret := _m.Called(id, addr) +// AddNonVoter provides a mock function with given fields: id, addr, version +func (_m *Consensus) AddNonVoter(id string, addr string, version uint64) error { + ret := _m.Called(id, addr, version) if len(ret) == 0 { panic("no return value specified for AddNonVoter") } var r0 error - if rf, ok := ret.Get(0).(func(string, string) error); ok { - r0 = rf(id, addr) + if rf, ok := ret.Get(0).(func(string, string, uint64) error); ok { + r0 = rf(id, addr, version) } else { r0 = ret.Error(0) } @@ -48,13 +48,14 @@ type Consensus_AddNonVoter_Call struct { // AddNonVoter is a helper method to define mock.On call // - id string // - addr string -func (_e *Consensus_Expecter) AddNonVoter(id interface{}, addr interface{}) *Consensus_AddNonVoter_Call { - return &Consensus_AddNonVoter_Call{Call: _e.mock.On("AddNonVoter", id, addr)} +// - version uint64 +func (_e *Consensus_Expecter) AddNonVoter(id interface{}, addr interface{}, version interface{}) *Consensus_AddNonVoter_Call { + return &Consensus_AddNonVoter_Call{Call: _e.mock.On("AddNonVoter", id, addr, version)} } -func (_c *Consensus_AddNonVoter_Call) Run(run func(id string, addr string)) *Consensus_AddNonVoter_Call { +func (_c *Consensus_AddNonVoter_Call) Run(run func(id string, addr string, version uint64)) *Consensus_AddNonVoter_Call { _c.Call.Run(func(args mock.Arguments) { - run(args[0].(string), args[1].(string)) + run(args[0].(string), args[1].(string), args[2].(uint64)) }) return _c } @@ -64,22 +65,22 @@ func (_c *Consensus_AddNonVoter_Call) Return(_a0 error) *Consensus_AddNonVoter_C return _c } -func (_c *Consensus_AddNonVoter_Call) RunAndReturn(run func(string, string) error) *Consensus_AddNonVoter_Call { +func (_c *Consensus_AddNonVoter_Call) RunAndReturn(run func(string, string, uint64) error) *Consensus_AddNonVoter_Call { _c.Call.Return(run) return _c } -// AddVoter provides a mock function with given fields: id, addr -func (_m *Consensus) AddVoter(id string, addr string) error { - ret := _m.Called(id, addr) +// AddVoter provides a mock function with given fields: id, addr, version +func (_m *Consensus) AddVoter(id string, addr string, version uint64) error { + ret := _m.Called(id, addr, version) if len(ret) == 0 { panic("no return value specified for AddVoter") } var r0 error - if rf, ok := ret.Get(0).(func(string, string) error); ok { - r0 = rf(id, addr) + if rf, ok := ret.Get(0).(func(string, string, uint64) error); ok { + r0 = rf(id, addr, version) } else { r0 = ret.Error(0) } @@ -95,13 +96,14 @@ type Consensus_AddVoter_Call struct { // AddVoter is a helper method to define mock.On call // - id string // - addr string -func (_e *Consensus_Expecter) AddVoter(id interface{}, addr interface{}) *Consensus_AddVoter_Call { - return &Consensus_AddVoter_Call{Call: _e.mock.On("AddVoter", id, addr)} +// - version uint64 +func (_e *Consensus_Expecter) AddVoter(id interface{}, addr interface{}, version interface{}) *Consensus_AddVoter_Call { + return &Consensus_AddVoter_Call{Call: _e.mock.On("AddVoter", id, addr, version)} } -func (_c *Consensus_AddVoter_Call) Run(run func(id string, addr string)) *Consensus_AddVoter_Call { +func (_c *Consensus_AddVoter_Call) Run(run func(id string, addr string, version uint64)) *Consensus_AddVoter_Call { _c.Call.Run(func(args mock.Arguments) { - run(args[0].(string), args[1].(string)) + run(args[0].(string), args[1].(string), args[2].(uint64)) }) return _c } @@ -111,29 +113,29 @@ func (_c *Consensus_AddVoter_Call) Return(_a0 error) *Consensus_AddVoter_Call { return _c } -func (_c *Consensus_AddVoter_Call) RunAndReturn(run func(string, string) error) *Consensus_AddVoter_Call { +func (_c *Consensus_AddVoter_Call) RunAndReturn(run func(string, string, uint64) error) *Consensus_AddVoter_Call { _c.Call.Return(run) return _c } // ClusterMembership provides a mock function with given fields: -func (_m *Consensus) ClusterMembership() ([]*consensus.ServerInfo, error) { +func (_m *Consensus) ClusterMembership() (*consensus.ClusterMembership, error) { ret := _m.Called() if len(ret) == 0 { panic("no return value specified for ClusterMembership") } - var r0 []*consensus.ServerInfo + var r0 *consensus.ClusterMembership var r1 error - if rf, ok := ret.Get(0).(func() ([]*consensus.ServerInfo, error)); ok { + if rf, ok := ret.Get(0).(func() (*consensus.ClusterMembership, error)); ok { return rf() } - if rf, ok := ret.Get(0).(func() []*consensus.ServerInfo); ok { + if rf, ok := ret.Get(0).(func() *consensus.ClusterMembership); ok { r0 = rf() } else { if ret.Get(0) != nil { - r0 = ret.Get(0).([]*consensus.ServerInfo) + r0 = ret.Get(0).(*consensus.ClusterMembership) } } @@ -163,12 +165,12 @@ func (_c *Consensus_ClusterMembership_Call) Run(run func()) *Consensus_ClusterMe return _c } -func (_c *Consensus_ClusterMembership_Call) Return(_a0 []*consensus.ServerInfo, _a1 error) *Consensus_ClusterMembership_Call { +func (_c *Consensus_ClusterMembership_Call) Return(_a0 *consensus.ClusterMembership, _a1 error) *Consensus_ClusterMembership_Call { _c.Call.Return(_a0, _a1) return _c } -func (_c *Consensus_ClusterMembership_Call) RunAndReturn(run func() ([]*consensus.ServerInfo, error)) *Consensus_ClusterMembership_Call { +func (_c *Consensus_ClusterMembership_Call) RunAndReturn(run func() (*consensus.ClusterMembership, error)) *Consensus_ClusterMembership_Call { _c.Call.Return(run) return _c } @@ -219,17 +221,17 @@ func (_c *Consensus_CommitUnsafePayload_Call) RunAndReturn(run func(*eth.Executi return _c } -// DemoteVoter provides a mock function with given fields: id -func (_m *Consensus) DemoteVoter(id string) error { - ret := _m.Called(id) +// DemoteVoter provides a mock function with given fields: id, version +func (_m *Consensus) DemoteVoter(id string, version uint64) error { + ret := _m.Called(id, version) if len(ret) == 0 { panic("no return value specified for DemoteVoter") } var r0 error - if rf, ok := ret.Get(0).(func(string) error); ok { - r0 = rf(id) + if rf, ok := ret.Get(0).(func(string, uint64) error); ok { + r0 = rf(id, version) } else { r0 = ret.Error(0) } @@ -244,13 +246,14 @@ type Consensus_DemoteVoter_Call struct { // DemoteVoter is a helper method to define mock.On call // - id string -func (_e *Consensus_Expecter) DemoteVoter(id interface{}) *Consensus_DemoteVoter_Call { - return &Consensus_DemoteVoter_Call{Call: _e.mock.On("DemoteVoter", id)} +// - version uint64 +func (_e *Consensus_Expecter) DemoteVoter(id interface{}, version interface{}) *Consensus_DemoteVoter_Call { + return &Consensus_DemoteVoter_Call{Call: _e.mock.On("DemoteVoter", id, version)} } -func (_c *Consensus_DemoteVoter_Call) Run(run func(id string)) *Consensus_DemoteVoter_Call { +func (_c *Consensus_DemoteVoter_Call) Run(run func(id string, version uint64)) *Consensus_DemoteVoter_Call { _c.Call.Run(func(args mock.Arguments) { - run(args[0].(string)) + run(args[0].(string), args[1].(uint64)) }) return _c } @@ -260,13 +263,13 @@ func (_c *Consensus_DemoteVoter_Call) Return(_a0 error) *Consensus_DemoteVoter_C return _c } -func (_c *Consensus_DemoteVoter_Call) RunAndReturn(run func(string) error) *Consensus_DemoteVoter_Call { +func (_c *Consensus_DemoteVoter_Call) RunAndReturn(run func(string, uint64) error) *Consensus_DemoteVoter_Call { _c.Call.Return(run) return _c } // 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 +277,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 +289,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 +315,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 } @@ -451,17 +464,17 @@ func (_c *Consensus_LeaderWithID_Call) RunAndReturn(run func() *consensus.Server return _c } -// RemoveServer provides a mock function with given fields: id -func (_m *Consensus) RemoveServer(id string) error { - ret := _m.Called(id) +// RemoveServer provides a mock function with given fields: id, version +func (_m *Consensus) RemoveServer(id string, version uint64) error { + ret := _m.Called(id, version) if len(ret) == 0 { panic("no return value specified for RemoveServer") } var r0 error - if rf, ok := ret.Get(0).(func(string) error); ok { - r0 = rf(id) + if rf, ok := ret.Get(0).(func(string, uint64) error); ok { + r0 = rf(id, version) } else { r0 = ret.Error(0) } @@ -476,13 +489,14 @@ type Consensus_RemoveServer_Call struct { // RemoveServer is a helper method to define mock.On call // - id string -func (_e *Consensus_Expecter) RemoveServer(id interface{}) *Consensus_RemoveServer_Call { - return &Consensus_RemoveServer_Call{Call: _e.mock.On("RemoveServer", id)} +// - version uint64 +func (_e *Consensus_Expecter) RemoveServer(id interface{}, version interface{}) *Consensus_RemoveServer_Call { + return &Consensus_RemoveServer_Call{Call: _e.mock.On("RemoveServer", id, version)} } -func (_c *Consensus_RemoveServer_Call) Run(run func(id string)) *Consensus_RemoveServer_Call { +func (_c *Consensus_RemoveServer_Call) Run(run func(id string, version uint64)) *Consensus_RemoveServer_Call { _c.Call.Run(func(args mock.Arguments) { - run(args[0].(string)) + run(args[0].(string), args[1].(uint64)) }) return _c } @@ -492,7 +506,7 @@ func (_c *Consensus_RemoveServer_Call) Return(_a0 error) *Consensus_RemoveServer return _c } -func (_c *Consensus_RemoveServer_Call) RunAndReturn(run func(string) error) *Consensus_RemoveServer_Call { +func (_c *Consensus_RemoveServer_Call) RunAndReturn(run func(string, uint64) error) *Consensus_RemoveServer_Call { _c.Call.Return(run) return _c } diff --git a/op-conductor/consensus/raft.go b/op-conductor/consensus/raft.go index 37d9ac69d70a..f6acc0fb76f1 100644 --- a/op-conductor/consensus/raft.go +++ b/op-conductor/consensus/raft.go @@ -10,7 +10,7 @@ import ( "github.com/ethereum/go-ethereum/log" "github.com/hashicorp/raft" - boltdb "github.com/hashicorp/raft-boltdb" + boltdb "github.com/hashicorp/raft-boltdb/v2" "github.com/pkg/errors" "github.com/ethereum-optimism/optimism/op-node/rollup" @@ -32,12 +32,36 @@ type RaftConsensus struct { unsafeTracker *unsafeHeadTracker } +type RaftConsensusConfig struct { + ServerID string + ServerAddr string + StorageDir string + Bootstrap bool + RollupCfg *rollup.Config + SnapshotInterval time.Duration + SnapshotThreshold uint64 + TrailingLogs uint64 +} + +// checkTCPPortOpen attempts to connect to the specified address and returns an error if the connection fails. +func checkTCPPortOpen(address string) error { + conn, err := net.DialTimeout("tcp", address, 5*time.Second) + if err != nil { + return err + } + defer conn.Close() + return nil +} + // NewRaftConsensus creates a new RaftConsensus instance. -func NewRaftConsensus(log log.Logger, serverID, serverAddr, storageDir string, bootstrap bool, rollupCfg *rollup.Config) (*RaftConsensus, error) { +func NewRaftConsensus(log log.Logger, cfg *RaftConsensusConfig) (*RaftConsensus, error) { rc := raft.DefaultConfig() - rc.LocalID = raft.ServerID(serverID) + rc.SnapshotInterval = cfg.SnapshotInterval + rc.TrailingLogs = cfg.TrailingLogs + rc.SnapshotThreshold = cfg.SnapshotThreshold + rc.LocalID = raft.ServerID(cfg.ServerID) - baseDir := filepath.Join(storageDir, serverID) + baseDir := filepath.Join(cfg.StorageDir, cfg.ServerID) if _, err := os.Stat(baseDir); os.IsNotExist(err) { if err := os.MkdirAll(baseDir, 0o755); err != nil { return nil, fmt.Errorf("error creating storage dir: %w", err) @@ -62,7 +86,7 @@ func NewRaftConsensus(log log.Logger, serverID, serverAddr, storageDir string, b return nil, fmt.Errorf(`raft.NewFileSnapshotStore(%q): %w`, baseDir, err) } - addr, err := net.ResolveTCPAddr("tcp", serverAddr) + addr, err := net.ResolveTCPAddr("tcp", cfg.ServerAddr) if err != nil { return nil, errors.Wrap(err, "failed to resolve tcp address") } @@ -75,7 +99,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 { @@ -85,18 +109,18 @@ func NewRaftConsensus(log log.Logger, serverID, serverAddr, storageDir string, b // If bootstrap = true, start raft in bootstrap mode, this will allow the current node to elect itself as leader when there's no other participants // and allow other nodes to join the cluster. - if bootstrap { - cfg := raft.Configuration{ + if cfg.Bootstrap { + raftCfg := raft.Configuration{ Servers: []raft.Server{ { ID: rc.LocalID, - Address: raft.ServerAddress(serverAddr), + Address: raft.ServerAddress(cfg.ServerAddr), Suffrage: raft.Voter, }, }, } - f := r.BootstrapCluster(cfg) + f := r.BootstrapCluster(raftCfg) if err := f.Error(); err != nil { return nil, errors.Wrap(err, "failed to bootstrap raft cluster") } @@ -105,34 +129,51 @@ func NewRaftConsensus(log log.Logger, serverID, serverAddr, storageDir string, b return &RaftConsensus{ log: log, r: r, - serverID: raft.ServerID(serverID), + serverID: raft.ServerID(cfg.ServerID), unsafeTracker: fsm, - rollupCfg: rollupCfg, + rollupCfg: cfg.RollupCfg, }, nil } // AddNonVoter implements Consensus, it tries to add a non-voting member into the cluster. -func (rc *RaftConsensus) AddNonVoter(id string, addr string) error { - if err := rc.r.AddNonvoter(raft.ServerID(id), raft.ServerAddress(addr), 0, defaultTimeout).Error(); err != nil { - rc.log.Error("failed to add non-voter", "id", id, "addr", addr, "err", err) +func (rc *RaftConsensus) AddNonVoter(id string, addr string, version uint64) error { + if err := checkTCPPortOpen(addr); err != nil { + rc.log.Error("connection test to member addr failed", "id", id, "addr", addr, "err", err) + return err + } + if err := rc.r.AddNonvoter(raft.ServerID(id), raft.ServerAddress(addr), version, defaultTimeout).Error(); err != nil { + rc.log.Error("failed to add non-voter", "id", id, "addr", addr, "version", version, "err", err) return err } return nil } // AddVoter implements Consensus, it tries to add a voting member into the cluster. -func (rc *RaftConsensus) AddVoter(id string, addr string) error { - if err := rc.r.AddVoter(raft.ServerID(id), raft.ServerAddress(addr), 0, defaultTimeout).Error(); err != nil { - rc.log.Error("failed to add voter", "id", id, "addr", addr, "err", err) +func (rc *RaftConsensus) AddVoter(id string, addr string, version uint64) error { + if err := checkTCPPortOpen(addr); err != nil { + rc.log.Error("connection test to member addr failed", "id", id, "addr", addr, "err", err) + return err + } + if err := rc.r.AddVoter(raft.ServerID(id), raft.ServerAddress(addr), version, defaultTimeout).Error(); err != nil { + rc.log.Error("failed to add voter", "id", id, "addr", addr, "version", version, "err", err) return err } return nil } // DemoteVoter implements Consensus, it tries to demote a voting member into a non-voting member in the cluster. -func (rc *RaftConsensus) DemoteVoter(id string) error { - if err := rc.r.DemoteVoter(raft.ServerID(id), 0, defaultTimeout).Error(); err != nil { - rc.log.Error("failed to demote voter", "id", id, "err", err) +func (rc *RaftConsensus) DemoteVoter(id string, version uint64) error { + if err := rc.r.DemoteVoter(raft.ServerID(id), version, defaultTimeout).Error(); err != nil { + rc.log.Error("failed to demote voter", "id", id, "version", version, "err", err) + return err + } + return nil +} + +// RemoveServer implements Consensus, it tries to remove a member (both voter or non-voter) from the cluster, if leader is being removed, it will cause a new leader election. +func (rc *RaftConsensus) RemoveServer(id string, version uint64) error { + if err := rc.r.RemoveServer(raft.ServerID(id), version, defaultTimeout).Error(); err != nil { + rc.log.Error("failed to remove voter", "id", id, "version", version, "err", err) return err } return nil @@ -140,8 +181,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. @@ -159,15 +199,6 @@ func (rc *RaftConsensus) LeaderCh() <-chan bool { return rc.r.LeaderCh() } -// RemoveServer implements Consensus, it tries to remove a member (both voter or non-voter) from the cluster, if leader is being removed, it will cause a new leader election. -func (rc *RaftConsensus) RemoveServer(id string) error { - if err := rc.r.RemoveServer(raft.ServerID(id), 0, defaultTimeout).Error(); err != nil { - rc.log.Error("failed to remove voter", "id", id, "err", err) - return err - } - return nil -} - // ServerID implements Consensus, it returns the server ID of the current server. func (rc *RaftConsensus) ServerID() string { return string(rc.serverID) @@ -205,8 +236,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,30 +249,37 @@ 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. -func (rc *RaftConsensus) ClusterMembership() ([]*ServerInfo, error) { +func (rc *RaftConsensus) ClusterMembership() (*ClusterMembership, error) { var future raft.ConfigurationFuture if future = rc.r.GetConfiguration(); future.Error() != nil { return nil, future.Error() } - var servers []*ServerInfo + var servers []ServerInfo for _, srv := range future.Configuration().Servers { - servers = append(servers, &ServerInfo{ + servers = append(servers, ServerInfo{ ID: string(srv.ID), Addr: string(srv.Address), Suffrage: ServerSuffrage(srv.Suffrage), }) } - return servers, nil + return &ClusterMembership{ + Servers: servers, + Version: future.Index(), + }, nil } diff --git a/op-conductor/consensus/raft_fsm.go b/op-conductor/consensus/raft_fsm.go index 7333fb8f2a44..28c85c36d904 100644 --- a/op-conductor/consensus/raft_fsm.go +++ b/op-conductor/consensus/raft_fsm.go @@ -16,13 +16,20 @@ 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 { + if len(l.Data) == 0 { return fmt.Errorf("log data is nil or empty") } @@ -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..fbd9c7cb3bc8 100644 --- a/op-conductor/consensus/raft_test.go +++ b/op-conductor/consensus/raft_test.go @@ -18,9 +18,6 @@ import ( func TestCommitAndRead(t *testing.T) { log := testlog.Logger(t, log.LevelInfo) - serverID := "SequencerA" - serverAddr := "127.0.0.1:0" - bootstrap := true now := uint64(time.Now().Unix()) rollupCfg := &rollup.Config{ CanyonTime: &now, @@ -29,8 +26,18 @@ func TestCommitAndRead(t *testing.T) { if err := os.RemoveAll(storageDir); err != nil { t.Fatal(err) } + raftConsensusConfig := &RaftConsensusConfig{ + ServerID: "SequencerA", + ServerAddr: "127.0.0.1:0", + StorageDir: storageDir, + Bootstrap: true, + RollupCfg: rollupCfg, + SnapshotInterval: 120 * time.Second, + SnapshotThreshold: 10240, + TrailingLogs: 8192, + } - cons, err := NewRaftConsensus(log, serverID, serverAddr, storageDir, bootstrap, rollupCfg) + cons, err := NewRaftConsensus(log, raftConsensusConfig) require.NoError(t, err) // wait till it became leader @@ -70,6 +77,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 4870ba4a3ab0..249e8a676e07 100644 --- a/op-conductor/flags/flags.go +++ b/op-conductor/flags/flags.go @@ -2,6 +2,7 @@ package flags import ( "fmt" + "time" "github.com/urfave/cli/v2" @@ -44,6 +45,24 @@ var ( Usage: "Directory to store raft data", EnvVars: opservice.PrefixEnvVar(EnvVarPrefix, "RAFT_STORAGE_DIR"), } + RaftSnapshotInterval = &cli.DurationFlag{ + Name: "raft.snapshot-interval", + Usage: "The interval to check if a snapshot should be taken.", + EnvVars: opservice.PrefixEnvVar(EnvVarPrefix, "RAFT_SNAPSHOT_INTERVAL"), + Value: 120 * time.Second, + } + RaftSnapshotThreshold = &cli.Uint64Flag{ + Name: "raft.snapshot-threshold", + Usage: "Number of logs to trigger a snapshot", + EnvVars: opservice.PrefixEnvVar(EnvVarPrefix, "RAFT_SNAPSHOT_THRESHOLD"), + Value: 8192, + } + RaftTrailingLogs = &cli.Uint64Flag{ + Name: "raft.trailing-logs", + Usage: "Number of logs to keep after a snapshot", + EnvVars: opservice.PrefixEnvVar(EnvVarPrefix, "RAFT_TRAILING_LOGS"), + Value: 10240, + } NodeRPC = &cli.StringFlag{ Name: "node.rpc", Usage: "HTTP provider URL for op-node", @@ -113,6 +132,9 @@ var optionalFlags = []cli.Flag{ RaftBootstrap, HealthCheckSafeEnabled, HealthCheckSafeInterval, + RaftSnapshotInterval, + RaftSnapshotThreshold, + RaftTrailingLogs, } func init() { diff --git a/op-conductor/health/mocks/HealthMonitor.go b/op-conductor/health/mocks/HealthMonitor.go index de85b716f739..0cc61c62a9d4 100644 --- a/op-conductor/health/mocks/HealthMonitor.go +++ b/op-conductor/health/mocks/HealthMonitor.go @@ -2,7 +2,11 @@ package mocks -import mock "github.com/stretchr/testify/mock" +import ( + context "context" + + mock "github.com/stretchr/testify/mock" +) // HealthMonitor is an autogenerated mock type for the HealthMonitor type type HealthMonitor struct { @@ -17,17 +21,17 @@ func (_m *HealthMonitor) EXPECT() *HealthMonitor_Expecter { return &HealthMonitor_Expecter{mock: &_m.Mock} } -// Start provides a mock function with given fields: -func (_m *HealthMonitor) Start() error { - ret := _m.Called() +// Start provides a mock function with given fields: ctx +func (_m *HealthMonitor) Start(ctx context.Context) error { + ret := _m.Called(ctx) if len(ret) == 0 { panic("no return value specified for Start") } var r0 error - if rf, ok := ret.Get(0).(func() error); ok { - r0 = rf() + if rf, ok := ret.Get(0).(func(context.Context) error); ok { + r0 = rf(ctx) } else { r0 = ret.Error(0) } @@ -41,13 +45,14 @@ type HealthMonitor_Start_Call struct { } // Start is a helper method to define mock.On call -func (_e *HealthMonitor_Expecter) Start() *HealthMonitor_Start_Call { - return &HealthMonitor_Start_Call{Call: _e.mock.On("Start")} +// - ctx context.Context +func (_e *HealthMonitor_Expecter) Start(ctx interface{}) *HealthMonitor_Start_Call { + return &HealthMonitor_Start_Call{Call: _e.mock.On("Start", ctx)} } -func (_c *HealthMonitor_Start_Call) Run(run func()) *HealthMonitor_Start_Call { +func (_c *HealthMonitor_Start_Call) Run(run func(ctx context.Context)) *HealthMonitor_Start_Call { _c.Call.Run(func(args mock.Arguments) { - run() + run(args[0].(context.Context)) }) return _c } @@ -57,7 +62,7 @@ func (_c *HealthMonitor_Start_Call) Return(_a0 error) *HealthMonitor_Start_Call return _c } -func (_c *HealthMonitor_Start_Call) RunAndReturn(run func() error) *HealthMonitor_Start_Call { +func (_c *HealthMonitor_Start_Call) RunAndReturn(run func(context.Context) error) *HealthMonitor_Start_Call { _c.Call.Return(run) return _c } diff --git a/op-conductor/health/monitor.go b/op-conductor/health/monitor.go index cad9406168dd..d2b28ffab7d9 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" @@ -25,7 +26,7 @@ type HealthMonitor interface { // Subscribe returns a channel that will be notified for every health check. Subscribe() <-chan error // Start starts the health check. - Start() error + Start(ctx context.Context) error // Stop stops the health check. Stop() error } @@ -34,10 +35,10 @@ 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, safeEnabled bool, 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, - done: make(chan struct{}), + metrics: metrics, interval: interval, healthUpdateCh: make(chan error), rollupCfg: rollupCfg, @@ -53,9 +54,10 @@ 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 + cancel context.CancelFunc + wg sync.WaitGroup rollupCfg *rollup.Config unsafeInterval uint64 @@ -76,10 +78,13 @@ type SequencerHealthMonitor struct { var _ HealthMonitor = (*SequencerHealthMonitor)(nil) // Start implements HealthMonitor. -func (hm *SequencerHealthMonitor) Start() error { +func (hm *SequencerHealthMonitor) Start(ctx context.Context) error { + ctx, cancel := context.WithCancel(ctx) + hm.cancel = cancel + hm.log.Info("starting health monitor") hm.wg.Add(1) - go hm.loop() + go hm.loop(ctx) hm.log.Info("health monitor started") return nil @@ -88,7 +93,7 @@ func (hm *SequencerHealthMonitor) Start() error { // Stop implements HealthMonitor. func (hm *SequencerHealthMonitor) Stop() error { hm.log.Info("stopping health monitor") - close(hm.done) + hm.cancel() hm.wg.Wait() hm.log.Info("health monitor stopped") @@ -100,7 +105,7 @@ func (hm *SequencerHealthMonitor) Subscribe() <-chan error { return hm.healthUpdateCh } -func (hm *SequencerHealthMonitor) loop() { +func (hm *SequencerHealthMonitor) loop(ctx context.Context) { defer hm.wg.Done() duration := time.Duration(hm.interval) * time.Second @@ -109,10 +114,18 @@ func (hm *SequencerHealthMonitor) loop() { for { select { - case <-hm.done: + case <-ctx.Done(): return case <-ticker.C: - hm.healthUpdateCh <- hm.healthCheck() + err := hm.healthCheck(ctx) + hm.metrics.RecordHealthCheck(err == nil, err) + // Ensure that we exit cleanly if told to shutdown while still waiting to publish the health update + select { + case hm.healthUpdateCh <- err: + continue + case <-ctx.Done(): + return + } } } } @@ -122,8 +135,7 @@ func (hm *SequencerHealthMonitor) loop() { // 2. unsafe head is not too far behind now (measured by unsafeInterval) // 3. safe head is progressing every configured batch submission interval // 4. peer count is above the configured minimum -func (hm *SequencerHealthMonitor) healthCheck() error { - ctx := context.Background() +func (hm *SequencerHealthMonitor) healthCheck(ctx context.Context) error { status, err := hm.node.SyncStatus(ctx) if err != nil { hm.log.Error("health monitor failed to get sync status", "err", err) diff --git a/op-conductor/health/monitor_test.go b/op-conductor/health/monitor_test.go index e19d8cb1e0ca..1a38f7f3a79e 100644 --- a/op-conductor/health/monitor_test.go +++ b/op-conductor/health/monitor_test.go @@ -6,8 +6,10 @@ import ( "time" "github.com/ethereum/go-ethereum/log" + "github.com/stretchr/testify/mock" "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" @@ -52,12 +54,12 @@ func (s *HealthMonitorTestSuite) SetupMonitor( ps1 := &p2p.PeerStats{ Connected: healthyPeerCount, } - mockP2P.EXPECT().PeerStats(context.Background()).Return(ps1, nil) + mockP2P.EXPECT().PeerStats(mock.Anything).Return(ps1, nil) } monitor := &SequencerHealthMonitor{ log: s.log, - done: make(chan struct{}), interval: s.interval, + metrics: &metrics.NoopMetricsImpl{}, healthUpdateCh: make(chan error), rollupCfg: s.rollupCfg, unsafeInterval: unsafeInterval, @@ -68,7 +70,7 @@ func (s *HealthMonitorTestSuite) SetupMonitor( node: mockRollupClient, p2p: mockP2P, } - err := monitor.Start() + err := monitor.Start(context.Background()) s.NoError(err) return monitor } @@ -86,7 +88,7 @@ func (s *HealthMonitorTestSuite) TestUnhealthyLowPeerCount() { ps1 := &p2p.PeerStats{ Connected: unhealthyPeerCount, } - pc.EXPECT().PeerStats(context.Background()).Return(ps1, nil).Times(1) + pc.EXPECT().PeerStats(mock.Anything).Return(ps1, nil).Times(1) monitor := s.SetupMonitor(now, 60, 60, rc, pc) 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 9fbee544d489..b783e062c7a5 100644 --- a/op-conductor/rpc/api.go +++ b/op-conductor/rpc/api.go @@ -15,10 +15,16 @@ var ErrNotLeader = errors.New("refusing to proxy request to non-leader sequencer // API defines the interface for the op-conductor API. type API interface { + // OverrideLeader is used to override the leader status, this is only used to return true for Leader() & LeaderWithID() calls. + // It does not impact the actual raft consensus leadership status. It is supposed to be used when the cluster is unhealthy + // and the node is the only one up, to allow batcher to be able to connect to the node, so that it could download blocks from the manually started sequencer. + OverrideLeader(ctx context.Context) error // Pause pauses op-conductor. Pause(ctx context.Context) error // Resume resumes op-conductor. Resume(ctx context.Context) error + // Stop stops op-conductor. + Stop(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. @@ -32,22 +38,22 @@ type API interface { // LeaderWithID returns the current leader's server info. LeaderWithID(ctx context.Context) (*consensus.ServerInfo, error) // AddServerAsVoter adds a server as a voter to the cluster. - AddServerAsVoter(ctx context.Context, id string, addr string) error + AddServerAsVoter(ctx context.Context, id string, addr string, version uint64) error // AddServerAsNonvoter adds a server as a non-voter to the cluster. non-voter will not participate in leader election. - AddServerAsNonvoter(ctx context.Context, id string, addr string) error + AddServerAsNonvoter(ctx context.Context, id string, addr string, version uint64) error // RemoveServer removes a server from the cluster. - RemoveServer(ctx context.Context, id string) error + RemoveServer(ctx context.Context, id string, version uint64) error // TransferLeader transfers leadership to another server. TransferLeader(ctx context.Context) error // TransferLeaderToServer transfers leadership to a specific server. TransferLeaderToServer(ctx context.Context, id string, addr string) error // ClusterMembership returns the current cluster membership configuration. - ClusterMembership(ctx context.Context) ([]*consensus.ServerInfo, error) + ClusterMembership(ctx context.Context) (*consensus.ClusterMembership, error) // APIs called by op-node // 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 } diff --git a/op-conductor/rpc/backend.go b/op-conductor/rpc/backend.go index 96fab2c90d28..beed37512ed6 100644 --- a/op-conductor/rpc/backend.go +++ b/op-conductor/rpc/backend.go @@ -2,6 +2,7 @@ package rpc import ( "context" + "sync/atomic" "github.com/ethereum/go-ethereum/log" @@ -12,27 +13,28 @@ import ( type conductor interface { Pause(ctx context.Context) error Resume(ctx context.Context) error + Stop(ctx context.Context) error Paused() bool Stopped() bool SequencerHealthy(ctx context.Context) bool Leader(ctx context.Context) bool LeaderWithID(ctx context.Context) *consensus.ServerInfo - AddServerAsVoter(ctx context.Context, id string, addr string) error - AddServerAsNonvoter(ctx context.Context, id string, addr string) error - RemoveServer(ctx context.Context, id string) error + AddServerAsVoter(ctx context.Context, id string, addr string, version uint64) error + AddServerAsNonvoter(ctx context.Context, id string, addr string, version uint64) error + RemoveServer(ctx context.Context, id string, version uint64) error TransferLeader(ctx context.Context) error TransferLeaderToServer(ctx context.Context, id string, addr string) error CommitUnsafePayload(ctx context.Context, payload *eth.ExecutionPayloadEnvelope) error - ClusterMembership(ctx context.Context) ([]*consensus.ServerInfo, error) + ClusterMembership(ctx context.Context) (*consensus.ClusterMembership, error) } // APIBackend is the backend implementation of the API. // TODO: (https://github.com/ethereum-optimism/protocol-quest/issues/45) Add metrics tracer here. -// TODO: (https://github.com/ethereum-optimism/protocol-quest/issues/44) add tests after e2e setup. type APIBackend struct { - log log.Logger - con conductor + log log.Logger + con conductor + leaderOverride atomic.Bool } // NewAPIBackend creates a new APIBackend instance. @@ -45,6 +47,12 @@ func NewAPIBackend(log log.Logger, con conductor) *APIBackend { var _ API = (*APIBackend)(nil) +// OverrideLeader implements API. +func (api *APIBackend) OverrideLeader(ctx context.Context) error { + api.leaderOverride.Store(true) + return nil +} + // Paused implements API. func (api *APIBackend) Paused(ctx context.Context) (bool, error) { return api.con.Paused(), nil @@ -61,13 +69,18 @@ func (api *APIBackend) Active(_ context.Context) (bool, error) { } // AddServerAsNonvoter implements API. -func (api *APIBackend) AddServerAsNonvoter(ctx context.Context, id string, addr string) error { - return api.con.AddServerAsNonvoter(ctx, id, addr) +func (api *APIBackend) AddServerAsNonvoter(ctx context.Context, id string, addr string, version uint64) error { + return api.con.AddServerAsNonvoter(ctx, id, addr, version) } // AddServerAsVoter implements API. -func (api *APIBackend) AddServerAsVoter(ctx context.Context, id string, addr string) error { - return api.con.AddServerAsVoter(ctx, id, addr) +func (api *APIBackend) AddServerAsVoter(ctx context.Context, id string, addr string, version uint64) error { + return api.con.AddServerAsVoter(ctx, id, addr, version) +} + +// RemoveServer implements API. +func (api *APIBackend) RemoveServer(ctx context.Context, id string, version uint64) error { + return api.con.RemoveServer(ctx, id, version) } // CommitUnsafePayload implements API. @@ -77,11 +90,19 @@ func (api *APIBackend) CommitUnsafePayload(ctx context.Context, payload *eth.Exe // Leader implements API, returns true if current conductor is leader of the cluster. func (api *APIBackend) Leader(ctx context.Context) (bool, error) { - return api.con.Leader(ctx), nil + return api.leaderOverride.Load() || api.con.Leader(ctx), nil } // LeaderWithID implements API, returns the leader's server ID and address (not necessarily the current conductor). func (api *APIBackend) LeaderWithID(ctx context.Context) (*consensus.ServerInfo, error) { + if api.leaderOverride.Load() { + return &consensus.ServerInfo{ + ID: "N/A (Leader overridden)", + Addr: "N/A", + Suffrage: 0, + }, nil + } + return api.con.LeaderWithID(ctx), nil } @@ -90,16 +111,16 @@ func (api *APIBackend) Pause(ctx context.Context) error { return api.con.Pause(ctx) } -// RemoveServer implements API. -func (api *APIBackend) RemoveServer(ctx context.Context, id string) error { - return api.con.RemoveServer(ctx, id) -} - // Resume implements API. func (api *APIBackend) Resume(ctx context.Context) error { return api.con.Resume(ctx) } +// Stop implements API. +func (api *APIBackend) Stop(ctx context.Context) error { + return api.con.Stop(ctx) +} + // TransferLeader implements API. With Raft implementation, a successful call does not mean that leadership transfer is complete // It just means that leadership transfer is in progress (current leader has initiated a new leader election round and stepped down as leader) func (api *APIBackend) TransferLeader(ctx context.Context) error { @@ -118,6 +139,6 @@ func (api *APIBackend) SequencerHealthy(ctx context.Context) (bool, error) { } // ClusterMembership implements API. -func (api *APIBackend) ClusterMembership(ctx context.Context) ([]*consensus.ServerInfo, error) { +func (api *APIBackend) ClusterMembership(ctx context.Context) (*consensus.ClusterMembership, error) { return api.con.ClusterMembership(ctx) } diff --git a/op-conductor/rpc/client.go b/op-conductor/rpc/client.go index f8aac005cdd7..32f7388c6015 100644 --- a/op-conductor/rpc/client.go +++ b/op-conductor/rpc/client.go @@ -27,6 +27,11 @@ func prefixRPC(method string) string { return RPCNamespace + "_" + method } +// OverrideLeader implements API. +func (c *APIClient) OverrideLeader(ctx context.Context) error { + return c.c.CallContext(ctx, nil, prefixRPC("overrideLeader")) +} + // Paused implements API. func (c *APIClient) Paused(ctx context.Context) (bool, error) { var paused bool @@ -49,13 +54,18 @@ func (c *APIClient) Active(ctx context.Context) (bool, error) { } // AddServerAsNonvoter implements API. -func (c *APIClient) AddServerAsNonvoter(ctx context.Context, id string, addr string) error { - return c.c.CallContext(ctx, nil, prefixRPC("addServerAsNonvoter"), id, addr) +func (c *APIClient) AddServerAsNonvoter(ctx context.Context, id string, addr string, version uint64) error { + return c.c.CallContext(ctx, nil, prefixRPC("addServerAsNonvoter"), id, addr, version) } // AddServerAsVoter implements API. -func (c *APIClient) AddServerAsVoter(ctx context.Context, id string, addr string) error { - return c.c.CallContext(ctx, nil, prefixRPC("addServerAsVoter"), id, addr) +func (c *APIClient) AddServerAsVoter(ctx context.Context, id string, addr string, version uint64) error { + return c.c.CallContext(ctx, nil, prefixRPC("addServerAsVoter"), id, addr, version) +} + +// RemoveServer implements API. +func (c *APIClient) RemoveServer(ctx context.Context, id string, version uint64) error { + return c.c.CallContext(ctx, nil, prefixRPC("removeServer"), id, version) } // Close closes the underlying RPC client. @@ -87,16 +97,16 @@ func (c *APIClient) Pause(ctx context.Context) error { return c.c.CallContext(ctx, nil, prefixRPC("pause")) } -// RemoveServer implements API. -func (c *APIClient) RemoveServer(ctx context.Context, id string) error { - return c.c.CallContext(ctx, nil, prefixRPC("removeServer"), id) -} - // Resume implements API. func (c *APIClient) Resume(ctx context.Context) error { return c.c.CallContext(ctx, nil, prefixRPC("resume")) } +// Stop implements API. +func (c *APIClient) Stop(ctx context.Context) error { + return c.c.CallContext(ctx, nil, prefixRPC("stop")) +} + // TransferLeader implements API. func (c *APIClient) TransferLeader(ctx context.Context) error { return c.c.CallContext(ctx, nil, prefixRPC("transferLeader")) @@ -115,8 +125,8 @@ func (c *APIClient) SequencerHealthy(ctx context.Context) (bool, error) { } // ClusterMembership implements API. -func (c *APIClient) ClusterMembership(ctx context.Context) ([]*consensus.ServerInfo, error) { - var info []*consensus.ServerInfo - err := c.c.CallContext(ctx, &info, prefixRPC("clusterMembership")) - return info, err +func (c *APIClient) ClusterMembership(ctx context.Context) (*consensus.ClusterMembership, error) { + var clusterMembership consensus.ClusterMembership + err := c.c.CallContext(ctx, &clusterMembership, prefixRPC("clusterMembership")) + return &clusterMembership, err } diff --git a/op-dispute-mon/Makefile b/op-dispute-mon/Makefile index 479f20ae7555..d94a0fa95a96 100644 --- a/op-dispute-mon/Makefile +++ b/op-dispute-mon/Makefile @@ -4,11 +4,12 @@ VERSION ?= v0.0.0 LDFLAGSSTRING +=-X main.GitCommit=$(GITCOMMIT) LDFLAGSSTRING +=-X main.GitDate=$(GITDATE) -LDFLAGSSTRING +=-X main.Version=$(VERSION) +LDFLAGSSTRING +=-X github.com/ethereum-optimism/optimism/op-dispute-mon/version.Version=$(VERSION) +LDFLAGSSTRING +=-X github.com/ethereum-optimism/optimism/op-dispute-mon/version.Meta=$(VERSION_META) LDFLAGS := -ldflags "$(LDFLAGSSTRING)" op-dispute-mon: - env GO111MODULE=on GOOS=$(TARGETOS) GOARCH=$(TARGETARCH) go build -v $(LDFLAGS) -o ./bin/op-dispute-mon ./cmd + env GO111MODULE=on GOOS=$(TARGETOS) GOARCH=$(TARGETARCH) CGO_ENABLED=0 go build -v $(LDFLAGS) -o ./bin/op-dispute-mon ./cmd .PHONY: op-dispute-mon clean: diff --git a/op-dispute-mon/README.md b/op-dispute-mon/README.md index 0a2a847a29e0..faf06b066fe2 100644 --- a/op-dispute-mon/README.md +++ b/op-dispute-mon/README.md @@ -16,5 +16,14 @@ This will build the `op-dispute-mon` binary which can be run with ## Usage `op-dispute-mon` is configurable via command line flags and environment variables. The help menu -shows the available config options and can be accessed by running `./op-dispute-mon --help`. +shows the available config options and can be accessed by running `./bin/op-dispute-mon --help`. +```shell + +# Start the op-dispute-mon with predefined network and RPC endpoints +./bin/op-dispute-mon \ + --network \ + --l1-eth-rpc \ + --rollup-rpc + +``` diff --git a/op-dispute-mon/bindings/faultdisputegame.go b/op-dispute-mon/bindings/faultdisputegame.go deleted file mode 100644 index d43287d3da6a..000000000000 --- a/op-dispute-mon/bindings/faultdisputegame.go +++ /dev/null @@ -1,1877 +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: "[{\"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 deleted file mode 100644 index 3fb3ed0cd59a..000000000000 --- a/op-dispute-mon/bindings/optimismportal.go +++ /dev/null @@ -1,1478 +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 -) - -// 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/cmd/main.go b/op-dispute-mon/cmd/main.go index 4b2c1f46bd17..619fad23592e 100644 --- a/op-dispute-mon/cmd/main.go +++ b/op-dispute-mon/cmd/main.go @@ -14,8 +14,8 @@ import ( "github.com/ethereum-optimism/optimism/op-dispute-mon/version" opservice "github.com/ethereum-optimism/optimism/op-service" "github.com/ethereum-optimism/optimism/op-service/cliapp" + "github.com/ethereum-optimism/optimism/op-service/ctxinterrupt" oplog "github.com/ethereum-optimism/optimism/op-service/log" - "github.com/ethereum-optimism/optimism/op-service/opio" ) var ( @@ -28,7 +28,7 @@ var VersionWithMeta = opservice.FormatVersion(version.Version, GitCommit, GitDat func main() { args := os.Args - ctx := opio.WithInterruptBlocker(context.Background()) + ctx := ctxinterrupt.WithSignalWaiterMain(context.Background()) if err := run(ctx, args, monitor.Main); err != nil { log.Crit("Application failed", "err", err) } diff --git a/op-dispute-mon/cmd/main_test.go b/op-dispute-mon/cmd/main_test.go new file mode 100644 index 000000000000..b7cb4ca16aa1 --- /dev/null +++ b/op-dispute-mon/cmd/main_test.go @@ -0,0 +1,291 @@ +package main + +import ( + "context" + "errors" + "fmt" + "testing" + "time" + + "github.com/ethereum-optimism/optimism/op-dispute-mon/config" + "github.com/ethereum-optimism/optimism/op-service/cliapp" + "github.com/ethereum-optimism/superchain-registry/superchain" + "github.com/ethereum/go-ethereum/common" + "github.com/ethereum/go-ethereum/log" + "github.com/stretchr/testify/require" +) + +var ( + l1EthRpc = "http://example.com:8545" + rollupRpc = "http://example.com:8555" + gameFactoryAddressValue = "0xbb00000000000000000000000000000000000000" +) + +func TestLogLevel(t *testing.T) { + t.Run("RejectInvalid", func(t *testing.T) { + verifyArgsInvalid(t, "unknown level: foo", addRequiredArgs("--log.level=foo")) + }) + + for _, lvl := range []string{"trace", "debug", "info", "error", "crit"} { + lvl := lvl + t.Run("AcceptValid_"+lvl, func(t *testing.T) { + logger, _, err := dryRunWithArgs(addRequiredArgs("--log.level", lvl)) + require.NoError(t, err) + require.NotNil(t, logger) + }) + } +} + +func TestDefaultCLIOptionsMatchDefaultConfig(t *testing.T) { + cfg := configForArgs(t, addRequiredArgs()) + defaultCfg := config.NewConfig(common.HexToAddress(gameFactoryAddressValue), l1EthRpc, rollupRpc) + require.Equal(t, defaultCfg, cfg) +} + +func TestDefaultConfigIsValid(t *testing.T) { + cfg := config.NewConfig(common.HexToAddress(gameFactoryAddressValue), l1EthRpc, rollupRpc) + require.NoError(t, cfg.Check()) +} + +func TestL1EthRpc(t *testing.T) { + t.Run("Required", func(t *testing.T) { + verifyArgsInvalid(t, "flag l1-eth-rpc is required", addRequiredArgsExcept("--l1-eth-rpc")) + }) + + t.Run("Valid", func(t *testing.T) { + url := "http://example.com:9999" + cfg := configForArgs(t, addRequiredArgsExcept("--l1-eth-rpc", "--l1-eth-rpc", url)) + require.Equal(t, url, cfg.L1EthRpc) + }) +} + +func TestRollupRpc(t *testing.T) { + t.Run("Required", func(t *testing.T) { + verifyArgsInvalid(t, "flag rollup-rpc is required", addRequiredArgsExcept("--rollup-rpc")) + }) + + t.Run("Valid", func(t *testing.T) { + url := "http://example.com:9999" + cfg := configForArgs(t, addRequiredArgsExcept("--rollup-rpc", "--rollup-rpc", url)) + require.Equal(t, url, cfg.RollupRpc) + }) +} + +func TestGameFactoryAddress(t *testing.T) { + t.Run("RequiredIfNetworkNetSet", func(t *testing.T) { + verifyArgsInvalid(t, "flag game-factory-address or network is required", addRequiredArgsExcept("--game-factory-address")) + }) + + t.Run("Valid", func(t *testing.T) { + addr := common.Address{0x11, 0x22} + cfg := configForArgs(t, addRequiredArgsExcept("--game-factory-address", "--game-factory-address", addr.Hex())) + require.Equal(t, addr, cfg.GameFactoryAddress) + }) + + t.Run("Invalid", func(t *testing.T) { + verifyArgsInvalid(t, "invalid address: foo", addRequiredArgsExcept("--game-factory-address", "--game-factory-address", "foo")) + }) + + t.Run("OverridesNetwork", func(t *testing.T) { + addr := common.Address{0xbb, 0xcc, 0xdd} + cfg := configForArgs(t, addRequiredArgsExcept("--game-factory-address", "--game-factory-address", addr.Hex(), "--network", "op-sepolia")) + require.Equal(t, addr, cfg.GameFactoryAddress) + }) +} + +func TestNetwork(t *testing.T) { + t.Run("Valid", func(t *testing.T) { + opSepoliaChainId := uint64(11155420) + cfg := configForArgs(t, addRequiredArgsExcept("--game-factory-address", "--network=op-sepolia")) + require.EqualValues(t, superchain.Addresses[opSepoliaChainId].DisputeGameFactoryProxy, cfg.GameFactoryAddress) + }) + + t.Run("UnknownNetwork", func(t *testing.T) { + verifyArgsInvalid(t, "unknown chain: not-a-network", addRequiredArgsExcept("--game-factory-address", "--network=not-a-network")) + }) +} + +func TestHonestActors(t *testing.T) { + t.Run("NotRequired", func(t *testing.T) { + cfg := configForArgs(t, addRequiredArgs()) + require.Empty(t, cfg.HonestActors) + }) + + t.Run("SingleValue", func(t *testing.T) { + addr := common.Address{0xbb} + cfg := configForArgs(t, addRequiredArgs("--honest-actors", addr.Hex())) + require.Len(t, cfg.HonestActors, 1) + require.Contains(t, cfg.HonestActors, addr) + }) + + t.Run("MultiValue", func(t *testing.T) { + addr1 := common.Address{0xaa} + addr2 := common.Address{0xbb} + addr3 := common.Address{0xcc} + cfg := configForArgs(t, addRequiredArgs( + "--honest-actors", addr1.Hex(), + "--honest-actors", addr2.Hex(), + "--honest-actors", addr3.Hex(), + )) + require.Len(t, cfg.HonestActors, 3) + require.Contains(t, cfg.HonestActors, addr1) + require.Contains(t, cfg.HonestActors, addr2) + require.Contains(t, cfg.HonestActors, addr3) + }) + + t.Run("Invalid", func(t *testing.T) { + verifyArgsInvalid(t, + "invalid honest actor address: invalid address: 0xnope", + addRequiredArgs("-honest-actors", "0xnope")) + }) +} + +func TestMonitorInterval(t *testing.T) { + t.Run("UsesDefault", func(t *testing.T) { + cfg := configForArgs(t, addRequiredArgs()) + require.Equal(t, config.DefaultMonitorInterval, cfg.MonitorInterval) + }) + + t.Run("Valid", func(t *testing.T) { + expected := 100 * time.Second + cfg := configForArgs(t, addRequiredArgs("--monitor-interval", "100s")) + require.Equal(t, expected, cfg.MonitorInterval) + }) + + t.Run("Invalid", func(t *testing.T) { + verifyArgsInvalid( + t, + "invalid value \"abc\" for flag -monitor-interval", + addRequiredArgs("--monitor-interval", "abc")) + }) +} + +func TestGameWindow(t *testing.T) { + t.Run("UsesDefault", func(t *testing.T) { + cfg := configForArgs(t, addRequiredArgs()) + require.Equal(t, config.DefaultGameWindow, cfg.GameWindow) + }) + + t.Run("Valid", func(t *testing.T) { + cfg := configForArgs(t, addRequiredArgs("--game-window=1m")) + require.Equal(t, time.Minute, cfg.GameWindow) + }) + + t.Run("ParsesDefault", func(t *testing.T) { + cfg := configForArgs(t, addRequiredArgs("--game-window=672h")) + require.Equal(t, config.DefaultGameWindow, cfg.GameWindow) + }) +} + +func TestIgnoredGames(t *testing.T) { + t.Run("NotRequired", func(t *testing.T) { + cfg := configForArgs(t, addRequiredArgs()) + require.Empty(t, cfg.IgnoredGames) + }) + + t.Run("SingleValue", func(t *testing.T) { + addr := common.Address{0xbb} + cfg := configForArgs(t, addRequiredArgs("--ignored-games", addr.Hex())) + require.Len(t, cfg.IgnoredGames, 1) + require.Contains(t, cfg.IgnoredGames, addr) + }) + + t.Run("MultiValue", func(t *testing.T) { + addr1 := common.Address{0xaa} + addr2 := common.Address{0xbb} + addr3 := common.Address{0xcc} + cfg := configForArgs(t, addRequiredArgs( + "--ignored-games", addr1.Hex(), + "--ignored-games", addr2.Hex(), + "--ignored-games", addr3.Hex(), + )) + require.Len(t, cfg.IgnoredGames, 3) + require.Contains(t, cfg.IgnoredGames, addr1) + require.Contains(t, cfg.IgnoredGames, addr2) + require.Contains(t, cfg.IgnoredGames, addr3) + }) + + t.Run("Invalid", func(t *testing.T) { + verifyArgsInvalid(t, + "invalid ignored game address: invalid address: 0xnope", + addRequiredArgs("-ignored-games", "0xnope")) + }) +} + +func TestMaxConcurrency(t *testing.T) { + t.Run("Valid", func(t *testing.T) { + expected := uint(345) + cfg := configForArgs(t, addRequiredArgs("--max-concurrency", "345")) + require.Equal(t, expected, cfg.MaxConcurrency) + }) + + t.Run("Invalid", func(t *testing.T) { + verifyArgsInvalid( + t, + "invalid value \"abc\" for flag -max-concurrency", + addRequiredArgs("--max-concurrency", "abc")) + }) + + t.Run("Zero", func(t *testing.T) { + verifyArgsInvalid( + t, + "max-concurrency must not be 0", + addRequiredArgs("--max-concurrency", "0")) + }) +} + +func verifyArgsInvalid(t *testing.T, messageContains string, cliArgs []string) { + _, _, err := dryRunWithArgs(cliArgs) + require.ErrorContains(t, err, messageContains) +} + +func configForArgs(t *testing.T, cliArgs []string) config.Config { + _, cfg, err := dryRunWithArgs(cliArgs) + require.NoError(t, err) + return cfg +} + +func dryRunWithArgs(cliArgs []string) (log.Logger, config.Config, error) { + cfg := new(config.Config) + var logger log.Logger + fullArgs := append([]string{"op-dispute-mon"}, cliArgs...) + testErr := errors.New("dry-run") + err := run(context.Background(), fullArgs, func(ctx context.Context, log log.Logger, config *config.Config) (cliapp.Lifecycle, error) { + logger = log + cfg = config + return nil, testErr + }) + if errors.Is(err, testErr) { // expected error + err = nil + } + return logger, *cfg, err +} + +func addRequiredArgs(args ...string) []string { + req := requiredArgs() + combined := toArgList(req) + return append(combined, args...) +} + +func addRequiredArgsExcept(name string, optionalArgs ...string) []string { + req := requiredArgs() + delete(req, name) + return append(toArgList(req), optionalArgs...) +} + +func requiredArgs() map[string]string { + args := map[string]string{ + "--l1-eth-rpc": l1EthRpc, + "--rollup-rpc": rollupRpc, + "--game-factory-address": gameFactoryAddressValue, + } + return args +} + +func toArgList(req map[string]string) []string { + var combined []string + for name, value := range req { + combined = append(combined, fmt.Sprintf("%s=%s", name, value)) + } + return combined +} diff --git a/op-dispute-mon/config/config.go b/op-dispute-mon/config/config.go index 01a4b1221092..8329819d0025 100644 --- a/op-dispute-mon/config/config.go +++ b/op-dispute-mon/config/config.go @@ -20,9 +20,10 @@ var ( 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 @@ -48,12 +49,12 @@ type Config struct { PprofConfig oppprof.CLIConfig } -func NewConfig(gameFactoryAddress common.Address, l1EthRpc string) Config { +func NewConfig(gameFactoryAddress common.Address, l1EthRpc string, rollupRpc string) Config { return Config{ L1EthRpc: l1EthRpc, + RollupRpc: rollupRpc, GameFactoryAddress: gameFactoryAddress, - HonestActors: []common.Address{}, MonitorInterval: DefaultMonitorInterval, GameWindow: DefaultGameWindow, MaxConcurrency: DefaultMaxConcurrency, diff --git a/op-dispute-mon/config/config_test.go b/op-dispute-mon/config/config_test.go index 944f12918fe0..f199d8554a3a 100644 --- a/op-dispute-mon/config/config_test.go +++ b/op-dispute-mon/config/config_test.go @@ -15,9 +15,7 @@ var ( ) func validConfig() Config { - cfg := NewConfig(validGameFactoryAddress, validL1EthRpc) - cfg.RollupRpc = validRollupRpc - return cfg + return NewConfig(validGameFactoryAddress, validL1EthRpc, validRollupRpc) } func TestValidConfigIsValid(t *testing.T) { diff --git a/op-dispute-mon/flags/flags.go b/op-dispute-mon/flags/flags.go index 6e88260c0923..8772d34e4f3e 100644 --- a/op-dispute-mon/flags/flags.go +++ b/op-dispute-mon/flags/flags.go @@ -3,6 +3,8 @@ package flags import ( "fmt" + challengerFlags "github.com/ethereum-optimism/optimism/op-challenger/flags" + "github.com/ethereum-optimism/optimism/op-service/flags" "github.com/urfave/cli/v2" "github.com/ethereum-optimism/optimism/op-dispute-mon/config" @@ -28,22 +30,23 @@ var ( Usage: "HTTP provider URL for L1.", EnvVars: prefixEnvVars("L1_ETH_RPC"), } - FactoryAddressFlag = &cli.StringFlag{ + RollupRpcFlag = &cli.StringFlag{ + Name: "rollup-rpc", + Usage: "HTTP provider URL for the rollup node", + EnvVars: prefixEnvVars("ROLLUP_RPC"), + } + // Optional Flags + GameFactoryAddressFlag = &cli.StringFlag{ Name: "game-factory-address", Usage: "Address of the fault game factory contract.", EnvVars: prefixEnvVars("GAME_FACTORY_ADDRESS"), } - // Optional Flags + NetworkFlag = flags.CLINetworkFlag(envVarPrefix, "") 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", - EnvVars: prefixEnvVars("ROLLUP_RPC"), - } MonitorIntervalFlag = &cli.DurationFlag{ Name: "monitor-interval", Usage: "The interval at which the dispute monitor will check for new games to monitor.", @@ -73,12 +76,13 @@ var ( // requiredFlags are checked by [CheckRequired] var requiredFlags = []cli.Flag{ L1EthRpcFlag, - FactoryAddressFlag, + RollupRpcFlag, } // optionalFlags is a list of unchecked cli flags var optionalFlags = []cli.Flag{ - RollupRpcFlag, + GameFactoryAddressFlag, + NetworkFlag, HonestActorsFlag, MonitorIntervalFlag, GameWindowFlag, @@ -111,7 +115,7 @@ func NewConfigFromCLI(ctx *cli.Context) (*config.Config, error) { if err := CheckRequired(ctx); err != nil { return nil, err } - gameFactoryAddress, err := opservice.ParseAddress(ctx.String(FactoryAddressFlag.Name)) + gameFactoryAddress, err := challengerFlags.FactoryAddress(ctx) if err != nil { return nil, err } @@ -138,19 +142,24 @@ func NewConfigFromCLI(ctx *cli.Context) (*config.Config, error) { } } + maxConcurrency := ctx.Uint(MaxConcurrencyFlag.Name) + if maxConcurrency == 0 { + return nil, fmt.Errorf("%v must not be 0", MaxConcurrencyFlag.Name) + } + metricsConfig := opmetrics.ReadCLIConfig(ctx) pprofConfig := oppprof.ReadCLIConfig(ctx) return &config.Config{ L1EthRpc: ctx.String(L1EthRpcFlag.Name), GameFactoryAddress: gameFactoryAddress, + RollupRpc: ctx.String(RollupRpcFlag.Name), HonestActors: actors, - RollupRpc: ctx.String(RollupRpcFlag.Name), MonitorInterval: ctx.Duration(MonitorIntervalFlag.Name), GameWindow: ctx.Duration(GameWindowFlag.Name), IgnoredGames: ignoredGames, - MaxConcurrency: ctx.Uint(MaxConcurrencyFlag.Name), + MaxConcurrency: maxConcurrency, MetricsConfig: metricsConfig, PprofConfig: pprofConfig, diff --git a/op-dispute-mon/metrics/metrics.go b/op-dispute-mon/metrics/metrics.go index b1bc2f3bbe2f..b76c23c4ca26 100644 --- a/op-dispute-mon/metrics/metrics.go +++ b/op-dispute-mon/metrics/metrics.go @@ -4,6 +4,7 @@ import ( "fmt" "io" "math/big" + "strings" "time" contractMetrics "github.com/ethereum-optimism/optimism/op-challenger/game/fault/contracts/metrics" @@ -40,14 +41,14 @@ type CreditExpectation uint8 const ( // Max Duration reached - CreditBelowMaxDuration CreditExpectation = iota - CreditEqualMaxDuration - CreditAboveMaxDuration + CreditBelowWithdrawable CreditExpectation = iota + CreditEqualWithdrawable + CreditAboveWithdrawable // Max Duration not reached - CreditBelowNonMaxDuration - CreditEqualNonMaxDuration - CreditAboveNonMaxDuration + CreditBelowNonWithdrawable + CreditEqualNonWithdrawable + CreditAboveNonWithdrawable ) type GameAgreementStatus uint8 @@ -66,32 +67,76 @@ const ( DisagreeChallengerWins ) -type ClaimStatus uint8 +type ClaimStatus struct { + resolved bool + clockExpired bool + firstHalf bool + resolvable bool +} -const ( - // Claims where the game is in the first half - FirstHalfExpiredResolved ClaimStatus = iota - FirstHalfExpiredUnresolved - FirstHalfNotExpiredResolved - FirstHalfNotExpiredUnresolved - - // Claims where the game is in the second half - SecondHalfExpiredResolved - SecondHalfExpiredUnresolved - SecondHalfNotExpiredResolved - SecondHalfNotExpiredUnresolved -) +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, clockExpired, resolvable, 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 ZeroClaimStatuses() map[ClaimStatus]int { - return map[ClaimStatus]int{ - FirstHalfExpiredResolved: 0, - FirstHalfExpiredUnresolved: 0, - FirstHalfNotExpiredResolved: 0, - FirstHalfNotExpiredUnresolved: 0, - SecondHalfExpiredResolved: 0, - SecondHalfExpiredUnresolved: 0, - SecondHalfNotExpiredResolved: 0, - SecondHalfNotExpiredUnresolved: 0, +func NewClaimStatus(firstHalf, clockExpired, resolvable, resolved bool) ClaimStatus { + return ClaimStatus{ + firstHalf: firstHalf, + clockExpired: clockExpired, + resolvable: resolvable, + resolved: resolved, } } @@ -118,7 +163,9 @@ type Metricer interface { RecordCredit(expectation CreditExpectation, count int) - RecordClaims(status ClaimStatus, count int) + RecordHonestWithdrawableAmounts(map[common.Address]*big.Int) + + RecordClaims(statuses *ClaimStatuses) RecordWithdrawalRequests(delayedWeth common.Address, matches bool, count int) @@ -126,11 +173,13 @@ type Metricer interface { RecordGameAgreement(status GameAgreementStatus, count int) + RecordLatestValidProposalL2Block(latestValid uint64) + RecordLatestProposals(latestValid, latestInvalid uint64) RecordIgnoredGames(count int) - RecordBondCollateral(addr common.Address, required *big.Int, available *big.Int) + RecordBondCollateral(addr common.Address, required, available *big.Int) RecordL2Challenges(agreement bool, count int) @@ -163,15 +212,17 @@ type Metrics struct { info prometheus.GaugeVec up prometheus.Gauge - credits prometheus.GaugeVec + credits prometheus.GaugeVec + honestWithdrawableAmounts prometheus.GaugeVec lastOutputFetch prometheus.Gauge - gamesAgreement prometheus.GaugeVec - latestProposals prometheus.GaugeVec - ignoredGames prometheus.Gauge - failedGames prometheus.Gauge - l2Challenges prometheus.GaugeVec + gamesAgreement prometheus.GaugeVec + latestValidProposalL2Block prometheus.Gauge + latestProposals prometheus.GaugeVec + ignoredGames prometheus.Gauge + failedGames prometheus.Gauge + l2Challenges prometheus.GaugeVec requiredCollateral prometheus.GaugeVec availableCollateral prometheus.GaugeVec @@ -248,7 +299,14 @@ func NewMetrics() *Metrics { Help: "Cumulative credits", }, []string{ "credit", - "max_duration", + "withdrawable", + }), + honestWithdrawableAmounts: *factory.NewGaugeVec(prometheus.GaugeOpts{ + Namespace: Namespace, + Name: "honest_actor_pending_withdrawals", + Help: "Current amount of withdrawable ETH for an honest actor", + }, []string{ + "actor", }), claims: *factory.NewGaugeVec(prometheus.GaugeOpts{ Namespace: Namespace, @@ -258,6 +316,7 @@ func NewMetrics() *Metrics { "resolved", "clock", "game_time_period", + "resolvable", }), withdrawalRequests: *factory.NewGaugeVec(prometheus.GaugeOpts{ Namespace: Namespace, @@ -277,6 +336,11 @@ func NewMetrics() *Metrics { "result_correctness", "root_agreement", }), + latestValidProposalL2Block: factory.NewGauge(prometheus.GaugeOpts{ + Namespace: Namespace, + Name: "latest_valid_proposal_l2_block", + Help: "L2 block number proposed by the latest game with a valid root claim", + }), latestProposals: *factory.NewGaugeVec(prometheus.GaugeOpts{ Namespace: Namespace, Name: "latest_proposal", @@ -388,18 +452,18 @@ func (m *Metrics) RecordGameResolutionStatus(status ResolutionStatus, count int) 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"} + case CreditBelowWithdrawable: + return []string{"below", "withdrawable"} + case CreditEqualWithdrawable: + return []string{"expected", "withdrawable"} + case CreditAboveWithdrawable: + return []string{"above", "withdrawable"} + case CreditBelowNonWithdrawable: + return []string{"below", "non_withdrawable"} + case CreditEqualNonWithdrawable: + return []string{"expected", "non_withdrawable"} + case CreditAboveNonWithdrawable: + return []string{"above", "non_withdrawable"} default: panic(fmt.Errorf("unknown credit expectation: %v", expectation)) } @@ -407,30 +471,16 @@ func (m *Metrics) RecordCredit(expectation CreditExpectation, count int) { m.credits.WithLabelValues(asLabels(expectation)...).Set(float64(count)) } -func (m *Metrics) RecordClaims(status ClaimStatus, count int) { - asLabels := func(status ClaimStatus) []string { - switch status { - case FirstHalfExpiredResolved: - return []string{"resolved", "expired", "first_half"} - case FirstHalfExpiredUnresolved: - return []string{"unresolved", "expired", "first_half"} - case FirstHalfNotExpiredResolved: - return []string{"resolved", "not_expired", "first_half"} - case FirstHalfNotExpiredUnresolved: - return []string{"unresolved", "not_expired", "first_half"} - case SecondHalfExpiredResolved: - return []string{"resolved", "expired", "second_half"} - case SecondHalfExpiredUnresolved: - return []string{"unresolved", "expired", "second_half"} - case SecondHalfNotExpiredResolved: - return []string{"resolved", "not_expired", "second_half"} - case SecondHalfNotExpiredUnresolved: - return []string{"unresolved", "not_expired", "second_half"} - default: - panic(fmt.Errorf("unknown claim status: %v", status)) - } +func (m *Metrics) RecordHonestWithdrawableAmounts(amounts map[common.Address]*big.Int) { + for addr, amount := range amounts { + m.honestWithdrawableAmounts.WithLabelValues(addr.Hex()).Set(weiToEther(amount)) } - m.claims.WithLabelValues(asLabels(status)...).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) { @@ -453,6 +503,10 @@ func (m *Metrics) RecordGameAgreement(status GameAgreementStatus, count int) { m.gamesAgreement.WithLabelValues(labelValuesFor(status)...).Set(float64(count)) } +func (m *Metrics) RecordLatestValidProposalL2Block(latestValid uint64) { + m.latestValidProposalL2Block.Set(float64(latestValid)) +} + func (m *Metrics) RecordLatestProposals(latestValid, latestInvalid uint64) { m.latestProposals.WithLabelValues("agree").Set(float64(latestValid)) m.latestProposals.WithLabelValues("disagree").Set(float64(latestInvalid)) @@ -466,7 +520,7 @@ func (m *Metrics) RecordFailedGames(count int) { m.failedGames.Set(float64(count)) } -func (m *Metrics) RecordBondCollateral(addr common.Address, required *big.Int, available *big.Int) { +func (m *Metrics) RecordBondCollateral(addr common.Address, required, available *big.Int) { balanceLabel := "sufficient" zeroBalanceLabel := "insufficient" if required.Cmp(available) > 0 { @@ -496,7 +550,7 @@ const ( ) func labelValuesFor(status GameAgreementStatus) []string { - asStrings := func(status string, inProgress bool, correct bool, agree bool) []string { + asStrings := func(status string, inProgress, correct, agree bool) []string { inProgressStr := "in_progress" if !inProgress { inProgressStr = "complete" diff --git a/op-dispute-mon/metrics/noop.go b/op-dispute-mon/metrics/noop.go index 62ec80fab248..6b4982ff26ba 100644 --- a/op-dispute-mon/metrics/noop.go +++ b/op-dispute-mon/metrics/noop.go @@ -28,7 +28,9 @@ func (*NoopMetricsImpl) RecordGameResolutionStatus(_ ResolutionStatus, _ int) {} func (*NoopMetricsImpl) RecordCredit(_ CreditExpectation, _ int) {} -func (*NoopMetricsImpl) RecordClaims(_ ClaimStatus, _ int) {} +func (*NoopMetricsImpl) RecordHonestWithdrawableAmounts(map[common.Address]*big.Int) {} + +func (*NoopMetricsImpl) RecordClaims(_ *ClaimStatuses) {} func (*NoopMetricsImpl) RecordWithdrawalRequests(_ common.Address, _ bool, _ int) {} @@ -36,12 +38,14 @@ func (*NoopMetricsImpl) RecordOutputFetchTime(_ float64) {} func (*NoopMetricsImpl) RecordGameAgreement(_ GameAgreementStatus, _ int) {} -func (*NoopMetricsImpl) RecordLatestProposals(_ uint64, _ uint64) {} +func (*NoopMetricsImpl) RecordLatestValidProposalL2Block(_ uint64) {} + +func (*NoopMetricsImpl) RecordLatestProposals(_, _ uint64) {} func (*NoopMetricsImpl) RecordIgnoredGames(_ int) {} func (*NoopMetricsImpl) RecordFailedGames(_ int) {} -func (*NoopMetricsImpl) RecordBondCollateral(_ common.Address, _ *big.Int, _ *big.Int) {} +func (*NoopMetricsImpl) RecordBondCollateral(_ common.Address, _, _ *big.Int) {} func (*NoopMetricsImpl) RecordL2Challenges(_ bool, _ int) {} diff --git a/op-dispute-mon/mon/bonds/monitor.go b/op-dispute-mon/mon/bonds/monitor.go index e2c43b361be6..2ce23dc472e7 100644 --- a/op-dispute-mon/mon/bonds/monitor.go +++ b/op-dispute-mon/mon/bonds/monitor.go @@ -51,7 +51,7 @@ func (b *Bonds) checkCredits(games []*types.EnrichedGameData) { 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 + maxDurationReached := duration >= game.MaxClockDuration+uint64(game.WETHDelay.Seconds()) // Iterate over claims, filter out resolved ones and sum up expected credits per recipient expectedCredits := make(map[common.Address]*big.Int) @@ -95,32 +95,32 @@ func (b *Bonds) checkCredits(games []*types.EnrichedGameData) { 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, "gameAddr", game.Proxy, "duration", "reached") + creditMetrics[metrics.CreditAboveWithdrawable] += 1 + b.logger.Warn("Credit above expected amount", "recipient", recipient, "expected", expected, "actual", actual, "game", game.Proxy, "withdrawable", "withdrawable") } else if comparison == 0 { - creditMetrics[metrics.CreditEqualMaxDuration] += 1 + creditMetrics[metrics.CreditEqualWithdrawable] += 1 } else { - creditMetrics[metrics.CreditBelowMaxDuration] += 1 + creditMetrics[metrics.CreditBelowWithdrawable] += 1 } } else { if comparison > 0 { - creditMetrics[metrics.CreditAboveNonMaxDuration] += 1 - b.logger.Warn("Credit above expected amount", "recipient", recipient, "expected", expected, "actual", actual, "gameAddr", game.Proxy, "duration", "unreached") + creditMetrics[metrics.CreditAboveNonWithdrawable] += 1 + b.logger.Warn("Credit above expected amount", "recipient", recipient, "expected", expected, "actual", actual, "game", game.Proxy, "withdrawable", "non_withdrawable") } else if comparison == 0 { - creditMetrics[metrics.CreditEqualNonMaxDuration] += 1 + creditMetrics[metrics.CreditEqualNonWithdrawable] += 1 } else { - creditMetrics[metrics.CreditBelowNonMaxDuration] += 1 - b.logger.Warn("Credit withdrawn early", "recipient", recipient, "expected", expected, "actual", actual, "gameAddr", game.Proxy, "duration", "unreached") + creditMetrics[metrics.CreditBelowNonWithdrawable] += 1 + b.logger.Error("Credit withdrawn early", "recipient", recipient, "expected", expected, "actual", actual, "game", game.Proxy, "withdrawable", "non_withdrawable") } } } } - 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.CreditBelowWithdrawable, creditMetrics[metrics.CreditBelowWithdrawable]) + b.metrics.RecordCredit(metrics.CreditEqualWithdrawable, creditMetrics[metrics.CreditEqualWithdrawable]) + b.metrics.RecordCredit(metrics.CreditAboveWithdrawable, creditMetrics[metrics.CreditAboveWithdrawable]) - b.metrics.RecordCredit(metrics.CreditBelowNonMaxDuration, creditMetrics[metrics.CreditBelowNonMaxDuration]) - b.metrics.RecordCredit(metrics.CreditEqualNonMaxDuration, creditMetrics[metrics.CreditEqualNonMaxDuration]) - b.metrics.RecordCredit(metrics.CreditAboveNonMaxDuration, creditMetrics[metrics.CreditAboveNonMaxDuration]) + b.metrics.RecordCredit(metrics.CreditBelowNonWithdrawable, creditMetrics[metrics.CreditBelowNonWithdrawable]) + b.metrics.RecordCredit(metrics.CreditEqualNonWithdrawable, creditMetrics[metrics.CreditEqualNonWithdrawable]) + b.metrics.RecordCredit(metrics.CreditAboveNonWithdrawable, creditMetrics[metrics.CreditAboveNonWithdrawable]) } diff --git a/op-dispute-mon/mon/bonds/monitor_test.go b/op-dispute-mon/mon/bonds/monitor_test.go index d4863f4be95a..dbeddd74d9c7 100644 --- a/op-dispute-mon/mon/bonds/monitor_test.go +++ b/op-dispute-mon/mon/bonds/monitor_test.go @@ -61,14 +61,15 @@ func TestCheckBonds(t *testing.T) { } func TestCheckRecipientCredit(t *testing.T) { - addr1 := common.Address{0x1a} - addr2 := common.Address{0x2b} + addr1 := common.Address{0x11, 0xaa} + addr2 := common.Address{0x22, 0xbb} 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, + WETHDelay: 30 * time.Minute, GameMetadata: gameTypes.GameMetadata{ Proxy: common.Address{0x11}, Timestamp: uint64(frozen.Unix()), @@ -141,6 +142,7 @@ func TestCheckRecipientCredit(t *testing.T) { // Max duration has been reached game2 := &monTypes.EnrichedGameData{ MaxClockDuration: 5, + WETHDelay: 5 * time.Second, GameMetadata: gameTypes.GameMetadata{ Proxy: common.Address{0x22}, Timestamp: uint64(frozen.Unix()) - 11, @@ -215,6 +217,7 @@ func TestCheckRecipientCredit(t *testing.T) { // Game has not reached max duration game3 := &monTypes.EnrichedGameData{ MaxClockDuration: 50000, + WETHDelay: 10 * time.Hour, GameMetadata: gameTypes.GameMetadata{ Proxy: common.Address{0x33}, Timestamp: uint64(frozen.Unix()) - 11, @@ -268,8 +271,9 @@ func TestCheckRecipientCredit(t *testing.T) { // Game has not reached max duration game4 := &monTypes.EnrichedGameData{ MaxClockDuration: 10, + WETHDelay: 10 * time.Second, GameMetadata: gameTypes.GameMetadata{ - Proxy: common.Address{44}, + Proxy: common.Address{0x44}, Timestamp: uint64(frozen.Unix()) - 22, }, BlockNumberChallenged: true, @@ -325,46 +329,46 @@ func TestCheckRecipientCredit(t *testing.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) + require.Contains(t, m.credits, metrics.CreditBelowWithdrawable) + require.Contains(t, m.credits, metrics.CreditEqualWithdrawable) + require.Contains(t, m.credits, metrics.CreditAboveWithdrawable) + require.Contains(t, m.credits, metrics.CreditBelowNonWithdrawable) + require.Contains(t, m.credits, metrics.CreditEqualNonWithdrawable) + require.Contains(t, m.credits, metrics.CreditAboveNonWithdrawable) // 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") + require.Equal(t, 2, m.credits[metrics.CreditBelowWithdrawable], "CreditBelowWithdrawable") + require.Equal(t, 3, m.credits[metrics.CreditEqualWithdrawable], "CreditEqualWithdrawable") + require.Equal(t, 2, m.credits[metrics.CreditAboveWithdrawable], "CreditAboveWithdrawable") // 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") + require.Equal(t, 3, m.credits[metrics.CreditBelowNonWithdrawable], "CreditBelowNonWithdrawable") + require.Equal(t, 2, m.credits[metrics.CreditEqualNonWithdrawable], "CreditEqualNonWithdrawable") + require.Equal(t, 2, m.credits[metrics.CreditAboveNonWithdrawable], "CreditAboveNonWithdrawable") // 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.NewLevelFilter(log.LevelError), testlog.NewMessageFilter("Credit withdrawn early"), - testlog.NewAttributesFilter("gameAddr", game1.Proxy.Hex()), + testlog.NewAttributesFilter("game", game1.Proxy.Hex()), testlog.NewAttributesFilter("recipient", addr2.Hex()), - testlog.NewAttributesFilter("duration", "unreached"))) + testlog.NewAttributesFilter("withdrawable", "non_withdrawable"))) // addr3 is above expected require.NotNil(t, logs.FindLog( testlog.NewLevelFilter(log.LevelWarn), testlog.NewMessageFilter("Credit above expected amount"), - testlog.NewAttributesFilter("gameAddr", game1.Proxy.Hex()), + testlog.NewAttributesFilter("game", game1.Proxy.Hex()), testlog.NewAttributesFilter("recipient", addr3.Hex()), - testlog.NewAttributesFilter("duration", "unreached"))) + testlog.NewAttributesFilter("withdrawable", "non_withdrawable"))) // addr4 is below expected before max duration, so warn about early withdrawal require.NotNil(t, logs.FindLog( - testlog.NewLevelFilter(log.LevelWarn), + testlog.NewLevelFilter(log.LevelError), testlog.NewMessageFilter("Credit withdrawn early"), - testlog.NewAttributesFilter("gameAddr", game1.Proxy.Hex()), + testlog.NewAttributesFilter("game", game1.Proxy.Hex()), testlog.NewAttributesFilter("recipient", addr4.Hex()), - testlog.NewAttributesFilter("duration", "unreached"))) + testlog.NewAttributesFilter("withdrawable", "non_withdrawable"))) // Logs from game 2 // addr1 is below expected - no warning as withdrawals may now be possible @@ -373,40 +377,40 @@ func TestCheckRecipientCredit(t *testing.T) { require.NotNil(t, logs.FindLog( testlog.NewLevelFilter(log.LevelWarn), testlog.NewMessageFilter("Credit above expected amount"), - testlog.NewAttributesFilter("gameAddr", game2.Proxy.Hex()), + testlog.NewAttributesFilter("game", game2.Proxy.Hex()), testlog.NewAttributesFilter("recipient", addr3.Hex()), - testlog.NewAttributesFilter("duration", "reached"))) + testlog.NewAttributesFilter("withdrawable", "withdrawable"))) // 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.NewLevelFilter(log.LevelError), testlog.NewMessageFilter("Credit withdrawn early"), - testlog.NewAttributesFilter("gameAddr", game3.Proxy.Hex()), + testlog.NewAttributesFilter("game", game3.Proxy.Hex()), testlog.NewAttributesFilter("recipient", addr2.Hex()), - testlog.NewAttributesFilter("duration", "unreached"))) + testlog.NewAttributesFilter("withdrawable", "non_withdrawable"))) // 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("gameAddr", game3.Proxy.Hex()), + testlog.NewAttributesFilter("game", game3.Proxy.Hex()), testlog.NewAttributesFilter("recipient", addr4.Hex()), - testlog.NewAttributesFilter("duration", "unreached"))) + testlog.NewAttributesFilter("withdrawable", "non_withdrawable"))) // 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 + // addr1 is correct + // addr2 is below expected before max duration, no log 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("gameAddr", game4.Proxy.Hex()), + testlog.NewAttributesFilter("game", game4.Proxy.Hex()), testlog.NewAttributesFilter("recipient", addr4.Hex()), - testlog.NewAttributesFilter("duration", "reached"))) + testlog.NewAttributesFilter("withdrawable", "withdrawable"))) } func setupBondMetricsTest(t *testing.T) (*Bonds, *stubBondMetrics, *testlog.CapturingHandler) { diff --git a/op-dispute-mon/mon/claims.go b/op-dispute-mon/mon/claims.go index 0e7c868aaf24..4a5d99b61127 100644 --- a/op-dispute-mon/mon/claims.go +++ b/op-dispute-mon/mon/claims.go @@ -18,27 +18,23 @@ type RClock interface { } type ClaimMetrics interface { - RecordClaims(status metrics.ClaimStatus, count int) + 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 + honestActors types.HonestActors 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 NewClaimMonitor(logger log.Logger, clock RClock, honestActors types.HonestActors, metrics ClaimMetrics) *ClaimMonitor { + return &ClaimMonitor{logger, clock, honestActors, metrics} } func (c *ClaimMonitor) CheckClaims(games []*types.EnrichedGameData) { - claimStatus := metrics.ZeroClaimStatuses() + claimStatuses := &metrics.ClaimStatuses{} honest := make(map[common.Address]*metrics.HonestActorData) for actor := range c.honestActors { honest[actor] = &metrics.HonestActorData{ @@ -48,11 +44,9 @@ func (c *ClaimMonitor) CheckClaims(games []*types.EnrichedGameData) { } } for _, game := range games { - c.checkGameClaims(game, claimStatus, honest) - } - for status, count := range claimStatus { - c.metrics.RecordClaims(status, count) + c.checkGameClaims(game, claimStatuses, honest) } + c.metrics.RecordClaims(claimStatuses) for actor := range c.honestActors { c.metrics.RecordHonestActorClaims(actor, honest[actor]) } @@ -84,20 +78,25 @@ func (c *ClaimMonitor) checkUpdateHonestActorStats(proxy common.Address, claim * func (c *ClaimMonitor) checkGameClaims( game *types.EnrichedGameData, - claimStatus map[metrics.ClaimStatus]int, + claimStatuses *metrics.ClaimStatuses, honest map[common.Address]*metrics.HonestActorData, ) { // Check if the game is in the first half - duration := uint64(c.clock.Now().Unix()) - game.Timestamp + 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 - for _, claim := range game.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, "id", claim.ID(), "clock", duration) + 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 @@ -105,41 +104,30 @@ func (c *ClaimMonitor) checkGameClaims( if !claim.IsRoot() { parent = game.Claims[claim.ParentContractIndex].Claim } - accumulatedTime := faultTypes.ChessClock(c.clock.Now(), claim.Claim, parent) + 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 - if claim.Resolved { - if clockExpired { - if firstHalf { - claimStatus[metrics.FirstHalfExpiredResolved]++ - } else { - claimStatus[metrics.SecondHalfExpiredResolved]++ - } - } else { - if firstHalf { - claimStatus[metrics.FirstHalfNotExpiredResolved]++ - } else { - claimStatus[metrics.SecondHalfNotExpiredResolved]++ - } - } - } else { - if clockExpired { - // SAFETY: accumulatedTime must be larger than or equal to maxChessTime since clockExpired - overflow := accumulatedTime - maxChessTime - if overflow >= MaximumResolutionResponseBuffer { - c.logger.Warn("Claim unresolved after clock expiration", "game", game.Proxy, "claimContractIndex", claim.ContractIndex, "delay", overflow) - } - if firstHalf { - claimStatus[metrics.FirstHalfExpiredUnresolved]++ - } else { - claimStatus[metrics.SecondHalfExpiredUnresolved]++ - } - } else { - if firstHalf { - claimStatus[metrics.FirstHalfNotExpiredUnresolved]++ - } else { - claimStatus[metrics.SecondHalfNotExpiredUnresolved]++ - } + 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 index c4fbb27bba9c..3491eb1a779e 100644 --- a/op-dispute-mon/mon/claims_test.go +++ b/op-dispute-mon/mon/claims_test.go @@ -1,11 +1,13 @@ 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" @@ -19,39 +21,147 @@ 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) + monitor, cl, cMetrics, _ := newTestClaimMonitor(t) games := makeMultipleTestGames(uint64(cl.Now().Unix())) monitor.CheckClaims(games) - require.Equal(t, 2, cMetrics.calls[metrics.FirstHalfExpiredResolved]) - require.Equal(t, 1, cMetrics.calls[metrics.FirstHalfExpiredUnresolved]) - require.Equal(t, 1, cMetrics.calls[metrics.FirstHalfNotExpiredResolved]) - require.Equal(t, 1, cMetrics.calls[metrics.FirstHalfNotExpiredUnresolved]) + for status, count := range cMetrics.calls { + fmt.Printf("%v: %v \n", status, count) + } - require.Equal(t, 2, cMetrics.calls[metrics.SecondHalfExpiredResolved]) - require.Equal(t, 1, cMetrics.calls[metrics.SecondHalfExpiredUnresolved]) - require.Equal(t, 1, cMetrics.calls[metrics.SecondHalfNotExpiredResolved]) - require.Equal(t, 1, cMetrics.calls[metrics.SecondHalfNotExpiredUnresolved]) + // 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) + monitor, _, cMetrics, _ := newTestClaimMonitor(t) var games []*types.EnrichedGameData monitor.CheckClaims(games) - // Check we zero'd out any categories that didn't have games in them (otherwise they retain their previous value) - require.Contains(t, cMetrics.calls, metrics.FirstHalfExpiredResolved) - require.Contains(t, cMetrics.calls, metrics.FirstHalfExpiredUnresolved) - require.Contains(t, cMetrics.calls, metrics.FirstHalfNotExpiredResolved) - require.Contains(t, cMetrics.calls, metrics.FirstHalfNotExpiredUnresolved) - - require.Contains(t, cMetrics.calls, metrics.SecondHalfExpiredResolved) - require.Contains(t, cMetrics.calls, metrics.SecondHalfExpiredUnresolved) - require.Contains(t, cMetrics.calls, metrics.SecondHalfNotExpiredResolved) - require.Contains(t, cMetrics.calls, metrics.SecondHalfNotExpiredUnresolved) + // 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) + monitor, cl, cMetrics, _ := newTestClaimMonitor(t) games := makeMultipleTestGames(uint64(cl.Now().Unix())) monitor.CheckClaims(games) @@ -80,15 +190,16 @@ func TestClaimMonitor_CheckClaims(t *testing.T) { }) } -func newTestClaimMonitor(t *testing.T) (*ClaimMonitor, *clock.DeterministicClock, *stubClaimMetrics) { - logger := testlog.Logger(t, log.LvlInfo) +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{ + honestActors := types.NewHonestActors([]common.Address{ {0x01}, {0x02}, - } - return NewClaimMonitor(logger, cl, honestActors, metrics), cl, metrics + }) + monitor := NewClaimMonitor(logger, cl, honestActors, metrics) + return monitor, cl, metrics, handler } type stubClaimMetrics struct { @@ -96,11 +207,13 @@ type stubClaimMetrics struct { honest map[common.Address]metrics.HonestActorData } -func (s *stubClaimMetrics) RecordClaims(status metrics.ClaimStatus, count int) { +func (s *stubClaimMetrics) RecordClaims(statuses *metrics.ClaimStatuses) { if s.calls == nil { s.calls = make(map[metrics.ClaimStatus]int) } - s.calls[status] += count + statuses.ForEachStatus(func(status metrics.ClaimStatus, count int) { + s.calls[status] = count + }) } func (s *stubClaimMetrics) RecordHonestActorClaims(address common.Address, data *metrics.HonestActorData) { diff --git a/op-dispute-mon/mon/extract/balance_enricher.go b/op-dispute-mon/mon/extract/balance_enricher.go index 42cc5b8ccafe..2a005022f6df 100644 --- a/op-dispute-mon/mon/extract/balance_enricher.go +++ b/op-dispute-mon/mon/extract/balance_enricher.go @@ -4,6 +4,7 @@ import ( "context" "fmt" "math/big" + "time" monTypes "github.com/ethereum-optimism/optimism/op-dispute-mon/mon/types" "github.com/ethereum-optimism/optimism/op-service/sources/batching/rpcblock" @@ -13,7 +14,7 @@ import ( var _ Enricher = (*BalanceEnricher)(nil) type BalanceCaller interface { - GetBalance(context.Context, rpcblock.Block) (*big.Int, common.Address, error) + GetBalanceAndDelay(context.Context, rpcblock.Block) (*big.Int, time.Duration, common.Address, error) } type BalanceEnricher struct{} @@ -23,11 +24,12 @@ func NewBalanceEnricher() *BalanceEnricher { } func (b *BalanceEnricher) Enrich(ctx context.Context, block rpcblock.Block, caller GameCaller, game *monTypes.EnrichedGameData) error { - balance, holdingAddr, err := caller.GetBalance(ctx, block) + balance, delay, holdingAddr, err := caller.GetBalanceAndDelay(ctx, block) if err != nil { return fmt.Errorf("failed to fetch balance: %w", err) } game.ETHCollateral = balance game.WETHContract = holdingAddr + game.WETHDelay = delay return nil } diff --git a/op-dispute-mon/mon/extract/balance_enricher_test.go b/op-dispute-mon/mon/extract/balance_enricher_test.go index 28ce644d5f2f..34da68ef2959 100644 --- a/op-dispute-mon/mon/extract/balance_enricher_test.go +++ b/op-dispute-mon/mon/extract/balance_enricher_test.go @@ -5,6 +5,7 @@ import ( "errors" "math/big" "testing" + "time" "github.com/ethereum-optimism/optimism/op-dispute-mon/mon/types" "github.com/ethereum-optimism/optimism/op-service/sources/batching/rpcblock" @@ -23,11 +24,16 @@ func TestBalanceEnricher(t *testing.T) { t.Run("GetBalanceSuccess", func(t *testing.T) { enricher := NewBalanceEnricher() - caller := &mockGameCaller{balance: big.NewInt(84242), balanceAddr: common.Address{0xdd}} + caller := &mockGameCaller{ + balance: big.NewInt(84242), + delayDuration: 3 * time.Hour, + balanceAddr: common.Address{0xdd}, + } game := &types.EnrichedGameData{} err := enricher.Enrich(context.Background(), rpcblock.Latest, caller, game) require.NoError(t, err) require.Equal(t, game.WETHContract, caller.balanceAddr) require.Equal(t, game.ETHCollateral, caller.balance) + require.Equal(t, game.WETHDelay, caller.delayDuration) }) } diff --git a/op-dispute-mon/mon/extract/caller.go b/op-dispute-mon/mon/extract/caller.go index c353bc724b3d..03c130cd3dc8 100644 --- a/op-dispute-mon/mon/extract/caller.go +++ b/op-dispute-mon/mon/extract/caller.go @@ -24,7 +24,7 @@ type GameCallerMetrics interface { } type GameCaller interface { - GetWithdrawals(context.Context, rpcblock.Block, common.Address, ...common.Address) ([]*contracts.WithdrawalRequest, error) + GetWithdrawals(context.Context, rpcblock.Block, ...common.Address) ([]*contracts.WithdrawalRequest, error) GetGameMetadata(context.Context, rpcblock.Block) (contracts.GameMetadata, error) GetAllClaims(context.Context, rpcblock.Block) ([]faultTypes.Claim, error) BondCaller @@ -50,8 +50,12 @@ func (g *GameCallerCreator) CreateContract(ctx context.Context, game gameTypes.G if fdg, ok := g.cache.Get(game.Proxy); ok { return fdg, nil } - switch game.GameType { - case faultTypes.CannonGameType, faultTypes.PermissionedGameType, faultTypes.AsteriscGameType, faultTypes.AlphabetGameType: + switch faultTypes.GameType(game.GameType) { + case faultTypes.CannonGameType, + faultTypes.PermissionedGameType, + faultTypes.AsteriscGameType, + faultTypes.AlphabetGameType, + faultTypes.FastGameType: fdg, err := contracts.NewFaultDisputeGameContract(ctx, g.m, game.Proxy, g.caller) if err != nil { return nil, fmt.Errorf("failed to create fault dispute game contract: %w", err) diff --git a/op-dispute-mon/mon/extract/caller_test.go b/op-dispute-mon/mon/extract/caller_test.go index 9ac263155786..065f06c051ac 100644 --- a/op-dispute-mon/mon/extract/caller_test.go +++ b/op-dispute-mon/mon/extract/caller_test.go @@ -7,11 +7,11 @@ import ( 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-optimism/optimism/packages/contracts-bedrock/snapshots" "github.com/ethereum/go-ethereum/common" 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" @@ -29,15 +29,23 @@ func TestMetadataCreator_CreateContract(t *testing.T) { }{ { name: "validCannonGameType", - game: types.GameMetadata{GameType: faultTypes.CannonGameType, Proxy: fdgAddr}, + game: types.GameMetadata{GameType: uint32(faultTypes.CannonGameType), Proxy: fdgAddr}, + }, + { + name: "validPermissionedGameType", + game: types.GameMetadata{GameType: uint32(faultTypes.PermissionedGameType), Proxy: fdgAddr}, }, { name: "validAsteriscGameType", - game: types.GameMetadata{GameType: faultTypes.AsteriscGameType, Proxy: fdgAddr}, + game: types.GameMetadata{GameType: uint32(faultTypes.AsteriscGameType), Proxy: fdgAddr}, }, { name: "validAlphabetGameType", - game: types.GameMetadata{GameType: faultTypes.AlphabetGameType, Proxy: fdgAddr}, + game: types.GameMetadata{GameType: uint32(faultTypes.AlphabetGameType), Proxy: fdgAddr}, + }, + { + name: "validFastGameType", + game: types.GameMetadata{GameType: uint32(faultTypes.FastGameType), Proxy: fdgAddr}, }, { name: "InvalidGameType", @@ -68,8 +76,7 @@ func TestMetadataCreator_CreateContract(t *testing.T) { } func setupMetadataLoaderTest(t *testing.T) (*batching.MultiCaller, *mockCacheMetrics) { - fdgAbi, err := bindings.FaultDisputeGameMetaData.GetAbi() - require.NoError(t, err) + fdgAbi := snapshots.LoadFaultDisputeGameABI() stubRpc := batchingTest.NewAbiBasedRpc(t, fdgAddr, fdgAbi) caller := batching.NewMultiCaller(stubRpc, batching.DefaultBatchSize) stubRpc.SetResponse(fdgAddr, "version", rpcblock.Latest, nil, []interface{}{"0.18.0"}) diff --git a/op-dispute-mon/mon/extract/extractor_test.go b/op-dispute-mon/mon/extract/extractor_test.go index 311775610697..361aeb57420e 100644 --- a/op-dispute-mon/mon/extract/extractor_test.go +++ b/op-dispute-mon/mon/extract/extractor_test.go @@ -5,6 +5,7 @@ import ( "errors" "math/big" "testing" + "time" "github.com/ethereum-optimism/optimism/op-challenger/game/fault/contracts" monTypes "github.com/ethereum-optimism/optimism/op-dispute-mon/mon/types" @@ -226,6 +227,7 @@ type mockGameCaller struct { extraCredit []*big.Int balanceErr error balance *big.Int + delayDuration time.Duration balanceAddr common.Address withdrawalsCalls int withdrawalsErr error @@ -234,7 +236,7 @@ type mockGameCaller struct { resolved map[int]bool } -func (m *mockGameCaller) GetWithdrawals(_ context.Context, _ rpcblock.Block, _ common.Address, _ ...common.Address) ([]*contracts.WithdrawalRequest, error) { +func (m *mockGameCaller) GetWithdrawals(_ context.Context, _ rpcblock.Block, _ ...common.Address) ([]*contracts.WithdrawalRequest, error) { m.withdrawalsCalls++ if m.withdrawalsErr != nil { return nil, m.withdrawalsErr @@ -290,11 +292,11 @@ func (m *mockGameCaller) GetCredits(_ context.Context, _ rpcblock.Block, recipie return response, nil } -func (m *mockGameCaller) GetBalance(_ context.Context, _ rpcblock.Block) (*big.Int, common.Address, error) { +func (m *mockGameCaller) GetBalanceAndDelay(_ context.Context, _ rpcblock.Block) (*big.Int, time.Duration, common.Address, error) { if m.balanceErr != nil { - return nil, common.Address{}, m.balanceErr + return nil, 0, common.Address{}, m.balanceErr } - return m.balance, m.balanceAddr, nil + return m.balance, m.delayDuration, m.balanceAddr, nil } func (m *mockGameCaller) IsResolved(_ context.Context, _ rpcblock.Block, claims ...faultTypes.Claim) ([]bool, error) { diff --git a/op-dispute-mon/mon/extract/withdrawals_enricher.go b/op-dispute-mon/mon/extract/withdrawals_enricher.go index 23b1fe759a61..ea94adbfebb9 100644 --- a/op-dispute-mon/mon/extract/withdrawals_enricher.go +++ b/op-dispute-mon/mon/extract/withdrawals_enricher.go @@ -24,7 +24,7 @@ func NewWithdrawalsEnricher() *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...) + withdrawals, err := caller.GetWithdrawals(ctx, block, recipients...) if err != nil { return fmt.Errorf("failed to fetch withdrawals: %w", err) } diff --git a/op-dispute-mon/mon/forecast.go b/op-dispute-mon/mon/forecast.go index 7124b8d02b33..872abf89baf2 100644 --- a/op-dispute-mon/mon/forecast.go +++ b/op-dispute-mon/mon/forecast.go @@ -16,6 +16,7 @@ var ( type ForecastMetrics interface { RecordGameAgreement(status metrics.GameAgreementStatus, count int) + RecordLatestValidProposalL2Block(validL2Block uint64) RecordLatestProposals(validTimestamp, invalidTimestamp uint64) RecordIgnoredGames(count int) RecordFailedGames(count int) @@ -32,8 +33,9 @@ type forecastBatch struct { AgreeChallengerWins int DisagreeChallengerWins int - LatestInvalidProposal uint64 - LatestValidProposal uint64 + LatestValidProposalL2Block uint64 + LatestInvalidProposal uint64 + LatestValidProposal uint64 } type Forecast struct { @@ -69,6 +71,7 @@ func (f *Forecast) recordBatch(batch forecastBatch, ignoredCount, failedCount in f.metrics.RecordGameAgreement(metrics.AgreeDefenderAhead, batch.AgreeDefenderAhead) f.metrics.RecordGameAgreement(metrics.DisagreeDefenderAhead, batch.DisagreeDefenderAhead) + f.metrics.RecordLatestValidProposalL2Block(batch.LatestValidProposalL2Block) f.metrics.RecordLatestProposals(batch.LatestValidProposal, batch.LatestInvalidProposal) f.metrics.RecordIgnoredGames(ignoredCount) @@ -90,6 +93,9 @@ func (f *Forecast) forecastGame(game *monTypes.EnrichedGameData, metrics *foreca if metrics.LatestValidProposal < game.Timestamp { metrics.LatestValidProposal = game.Timestamp } + if metrics.LatestValidProposalL2Block < game.L2BlockNumber { + metrics.LatestValidProposalL2Block = game.L2BlockNumber + } } if game.Status != types.GameStatusInProgress { diff --git a/op-dispute-mon/mon/forecast_test.go b/op-dispute-mon/mon/forecast_test.go index dfae2d45a103..a7a76841153f 100644 --- a/op-dispute-mon/mon/forecast_test.go +++ b/op-dispute-mon/mon/forecast_test.go @@ -269,9 +269,10 @@ func TestForecast_Forecast_MultipleGames(t *testing.T) { games := make([]*monTypes.EnrichedGameData, 9) for i := range games { games[i] = &monTypes.EnrichedGameData{ - Status: gameStatus[i], - Claims: claims[i], - RootClaim: rootClaims[i], + Status: gameStatus[i], + Claims: claims[i], + RootClaim: rootClaims[i], + L2BlockNumber: uint64(i), GameMetadata: types.GameMetadata{ Timestamp: uint64(i), }, @@ -292,6 +293,7 @@ func TestForecast_Forecast_MultipleGames(t *testing.T) { require.Equal(t, expectedMetrics, m.gameAgreement) require.Equal(t, 3, m.ignoredGames) require.Equal(t, 4, m.contractCreationFails) + require.EqualValues(t, 8, m.latestValidProposalL2Block) require.EqualValues(t, 7, m.latestInvalidProposal) require.EqualValues(t, 8, m.latestValidProposal) } @@ -318,11 +320,12 @@ func zeroGameAgreement() map[metrics.GameAgreementStatus]int { } type mockForecastMetrics struct { - gameAgreement map[metrics.GameAgreementStatus]int - ignoredGames int - latestInvalidProposal uint64 - latestValidProposal uint64 - contractCreationFails int + gameAgreement map[metrics.GameAgreementStatus]int + ignoredGames int + latestValidProposalL2Block uint64 + latestInvalidProposal uint64 + latestValidProposal uint64 + contractCreationFails int } func (m *mockForecastMetrics) RecordFailedGames(count int) { @@ -333,6 +336,10 @@ func (m *mockForecastMetrics) RecordGameAgreement(status metrics.GameAgreementSt m.gameAgreement[status] = count } +func (m *mockForecastMetrics) RecordLatestValidProposalL2Block(valid uint64) { + m.latestValidProposalL2Block = valid +} + func (m *mockForecastMetrics) RecordLatestProposals(valid, invalid uint64) { m.latestValidProposal = valid m.latestInvalidProposal = invalid diff --git a/op-dispute-mon/mon/service.go b/op-dispute-mon/mon/service.go index f8df6132f095..8ce97b7b8dd9 100644 --- a/op-dispute-mon/mon/service.go +++ b/op-dispute-mon/mon/service.go @@ -8,6 +8,7 @@ import ( "sync/atomic" "github.com/ethereum-optimism/optimism/op-dispute-mon/mon/bonds" + "github.com/ethereum-optimism/optimism/op-dispute-mon/mon/types" "github.com/ethereum/go-ethereum/common" "github.com/ethereum/go-ethereum/ethclient" "github.com/ethereum/go-ethereum/log" @@ -28,9 +29,10 @@ import ( ) type Service struct { - logger log.Logger - metrics metrics.Metricer - monitor *gameMonitor + logger log.Logger + metrics metrics.Metricer + monitor *gameMonitor + honestActors types.HonestActors factoryContract *contracts.DisputeGameFactoryContract @@ -56,9 +58,10 @@ type Service struct { // NewService creates a new Service. func NewService(ctx context.Context, logger log.Logger, cfg *config.Config) (*Service, error) { s := &Service{ - cl: clock.SystemClock, - logger: logger, - metrics: metrics.NewMetrics(), + cl: clock.SystemClock, + logger: logger, + metrics: metrics.NewMetrics(), + honestActors: types.NewHonestActors(cfg.HonestActors), } if err := s.initFromConfig(ctx, cfg); err != nil { @@ -105,7 +108,7 @@ func (s *Service) initFromConfig(ctx context.Context, cfg *config.Config) error } func (s *Service) initClaimMonitor(cfg *config.Config) { - s.claims = NewClaimMonitor(s.logger, s.cl, cfg.HonestActors, s.metrics) + s.claims = NewClaimMonitor(s.logger, s.cl, s.honestActors, s.metrics) } func (s *Service) initResolutionMonitor() { @@ -113,7 +116,7 @@ func (s *Service) initResolutionMonitor() { } func (s *Service) initWithdrawalMonitor() { - s.withdrawals = NewWithdrawalMonitor(s.logger, s.metrics) + s.withdrawals = NewWithdrawalMonitor(s.logger, s.cl, s.metrics, s.honestActors) } func (s *Service) initGameCallerCreator() { diff --git a/op-dispute-mon/mon/types/honest_actors.go b/op-dispute-mon/mon/types/honest_actors.go new file mode 100644 index 000000000000..31398dfcbd82 --- /dev/null +++ b/op-dispute-mon/mon/types/honest_actors.go @@ -0,0 +1,17 @@ +package types + +import "github.com/ethereum/go-ethereum/common" + +type HonestActors map[common.Address]bool // Map for efficient lookup + +func NewHonestActors(honestActors []common.Address) HonestActors { + actors := make(map[common.Address]bool) + for _, actor := range honestActors { + actors[actor] = true + } + return actors +} + +func (h HonestActors) Contains(addr common.Address) bool { + return h[addr] +} diff --git a/op-dispute-mon/mon/types/types.go b/op-dispute-mon/mon/types/types.go index 21abe0fc19df..dff06dab90bf 100644 --- a/op-dispute-mon/mon/types/types.go +++ b/op-dispute-mon/mon/types/types.go @@ -2,6 +2,7 @@ package types import ( "math/big" + "time" "github.com/ethereum-optimism/optimism/op-challenger/game/fault/contracts" faultTypes "github.com/ethereum-optimism/optimism/op-challenger/game/fault/types" @@ -43,6 +44,9 @@ type EnrichedGameData struct { // The contract is potentially shared by multiple games. WETHContract common.Address + // WETHDelay is the delay applied before credits can be withdrawn. + WETHDelay time.Duration + // 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. diff --git a/op-dispute-mon/mon/withdrawals.go b/op-dispute-mon/mon/withdrawals.go index 5563b099afe5..1c7e9da2f9af 100644 --- a/op-dispute-mon/mon/withdrawals.go +++ b/op-dispute-mon/mon/withdrawals.go @@ -1,6 +1,9 @@ package mon import ( + "math/big" + "time" + "github.com/ethereum-optimism/optimism/op-dispute-mon/mon/types" "github.com/ethereum/go-ethereum/common" "github.com/ethereum/go-ethereum/log" @@ -8,25 +11,35 @@ import ( type WithdrawalMetrics interface { RecordWithdrawalRequests(delayedWeth common.Address, matches bool, count int) + RecordHonestWithdrawableAmounts(map[common.Address]*big.Int) } type WithdrawalMonitor struct { - logger log.Logger - metrics WithdrawalMetrics + logger log.Logger + clock RClock + metrics WithdrawalMetrics + honestActors types.HonestActors } -func NewWithdrawalMonitor(logger log.Logger, metrics WithdrawalMetrics) *WithdrawalMonitor { +func NewWithdrawalMonitor(logger log.Logger, clock RClock, metrics WithdrawalMetrics, honestActors types.HonestActors) *WithdrawalMonitor { return &WithdrawalMonitor{ - logger: logger, - metrics: metrics, + logger: logger, + clock: clock, + metrics: metrics, + honestActors: honestActors, } } func (w *WithdrawalMonitor) CheckWithdrawals(games []*types.EnrichedGameData) { + now := w.clock.Now() // Use a consistent time for all checks matching := make(map[common.Address]int) divergent := make(map[common.Address]int) + honestWithdrawableAmounts := make(map[common.Address]*big.Int) + for address := range w.honestActors { + honestWithdrawableAmounts[address] = big.NewInt(0) + } for _, game := range games { - matches, diverges := w.validateGameWithdrawals(game) + matches, diverges := w.validateGameWithdrawals(game, now, honestWithdrawableAmounts) matching[game.WETHContract] += matches divergent[game.WETHContract] += diverges } @@ -36,9 +49,10 @@ func (w *WithdrawalMonitor) CheckWithdrawals(games []*types.EnrichedGameData) { for contract, count := range divergent { w.metrics.RecordWithdrawalRequests(contract, false, count) } + w.metrics.RecordHonestWithdrawableAmounts(honestWithdrawableAmounts) } -func (w *WithdrawalMonitor) validateGameWithdrawals(game *types.EnrichedGameData) (int, int) { +func (w *WithdrawalMonitor) validateGameWithdrawals(game *types.EnrichedGameData, now time.Time, honestWithdrawableAmounts map[common.Address]*big.Int) (int, int) { matching := 0 divergent := 0 for recipient, withdrawalAmount := range game.WithdrawalRequests { @@ -48,6 +62,16 @@ func (w *WithdrawalMonitor) validateGameWithdrawals(game *types.EnrichedGameData 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) } + + if withdrawalAmount.Amount.Cmp(big.NewInt(0)) > 0 && w.honestActors.Contains(recipient) { + if time.Unix(withdrawalAmount.Timestamp.Int64(), 0).Add(game.WETHDelay).Before(now) { + // Credits are withdrawable + total := honestWithdrawableAmounts[recipient] + total = new(big.Int).Add(total, withdrawalAmount.Amount) + honestWithdrawableAmounts[recipient] = total + w.logger.Warn("Found unclaimed credit", "recipient", recipient, "game", game.Proxy, "amount", withdrawalAmount.Amount) + } + } } return matching, divergent } diff --git a/op-dispute-mon/mon/withdrawals_test.go b/op-dispute-mon/mon/withdrawals_test.go index f598ea38df97..ad17493adf65 100644 --- a/op-dispute-mon/mon/withdrawals_test.go +++ b/op-dispute-mon/mon/withdrawals_test.go @@ -3,9 +3,12 @@ package mon import ( "math/big" "testing" + "time" "github.com/ethereum-optimism/optimism/op-challenger/game/fault/contracts" + "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/clock" "github.com/ethereum-optimism/optimism/op-service/testlog" "github.com/ethereum/go-ethereum/common" "github.com/ethereum/go-ethereum/log" @@ -15,58 +18,76 @@ import ( var ( weth1 = common.Address{0x1a} weth2 = common.Address{0x2b} + + honestActor1 = common.Address{0x11, 0xaa} + honestActor2 = common.Address{0x22, 0xbb} + honestActor3 = common.Address{0x33, 0xcc} + dishonestActor4 = common.Address{0x44, 0xdd} + + nowUnix = int64(10_000) ) func makeGames() []*monTypes.EnrichedGameData { weth1Balance := big.NewInt(4200) weth2Balance := big.NewInt(6000) + game1 := &monTypes.EnrichedGameData{ + GameMetadata: types.GameMetadata{Proxy: common.Address{0x11, 0x11, 0x11}}, Credits: map[common.Address]*big.Int{ - common.Address{0x01}: big.NewInt(3), - common.Address{0x02}: big.NewInt(1), + honestActor1: big.NewInt(3), + honestActor2: 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)}, + honestActor1: {Amount: big.NewInt(3), Timestamp: big.NewInt(nowUnix - 101)}, // Claimable + honestActor2: {Amount: big.NewInt(1), Timestamp: big.NewInt(nowUnix - 99)}, // Not claimable }, WETHContract: weth1, ETHCollateral: weth1Balance, + WETHDelay: 100 * time.Second, } game2 := &monTypes.EnrichedGameData{ + GameMetadata: types.GameMetadata{Proxy: common.Address{0x22, 0x22, 0x22}}, Credits: map[common.Address]*big.Int{ - common.Address{0x01}: big.NewInt(46), - common.Address{0x02}: big.NewInt(1), + honestActor1: big.NewInt(46), + honestActor2: 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)}, + honestActor1: {Amount: big.NewInt(3), Timestamp: big.NewInt(nowUnix - 501)}, // Claimable + honestActor2: {Amount: big.NewInt(1), Timestamp: big.NewInt(nowUnix)}, // Not claimable }, WETHContract: weth2, ETHCollateral: weth2Balance, + WETHDelay: 500 * time.Second, } game3 := &monTypes.EnrichedGameData{ + GameMetadata: types.GameMetadata{Proxy: common.Address{0x33, 0x33, 0x33}}, Credits: map[common.Address]*big.Int{ - common.Address{0x03}: big.NewInt(2), - common.Address{0x04}: big.NewInt(4), + honestActor3: big.NewInt(2), + dishonestActor4: 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)}, + honestActor3: {Amount: big.NewInt(2), Timestamp: big.NewInt(nowUnix - 1)}, // Claimable + dishonestActor4: {Amount: big.NewInt(4), Timestamp: big.NewInt(nowUnix - 5)}, // Claimable }, WETHContract: weth2, ETHCollateral: weth2Balance, + WETHDelay: 0 * time.Second, } return []*monTypes.EnrichedGameData{game1, game2, game3} } func TestCheckWithdrawals(t *testing.T) { - logger := testlog.Logger(t, log.LvlInfo) + now := time.Unix(nowUnix, 0) + cl := clock.NewDeterministicClock(now) + logger, logs := testlog.CaptureLogger(t, log.LvlInfo) metrics := &stubWithdrawalsMetrics{ matching: make(map[common.Address]int), divergent: make(map[common.Address]int), } - withdrawals := NewWithdrawalMonitor(logger, metrics) - withdrawals.CheckWithdrawals(makeGames()) + honestActors := monTypes.NewHonestActors([]common.Address{honestActor1, honestActor2, honestActor3}) + withdrawals := NewWithdrawalMonitor(logger, cl, metrics, honestActors) + games := makeGames() + withdrawals.CheckWithdrawals(games) require.Equal(t, metrics.matchCalls, 2) require.Equal(t, metrics.divergeCalls, 2) @@ -80,13 +101,59 @@ func TestCheckWithdrawals(t *testing.T) { require.Equal(t, metrics.matching[weth2], 3) require.Equal(t, metrics.divergent[weth1], 0) require.Equal(t, metrics.divergent[weth2], 1) + + require.Len(t, metrics.honestWithdrawable, 3) + requireBigInt := func(name string, expected, actual *big.Int) { + require.Truef(t, expected.Cmp(actual) == 0, "Expected %v withdrawable to be %v but was %v", name, expected, actual) + } + requireBigInt("honest addr1", big.NewInt(6), metrics.honestWithdrawable[honestActor1]) + requireBigInt("honest addr2", big.NewInt(0), metrics.honestWithdrawable[honestActor2]) + requireBigInt("honest addr3", big.NewInt(2), metrics.honestWithdrawable[honestActor3]) + require.Nil(t, metrics.honestWithdrawable[dishonestActor4], "should only report withdrawable credits for honest actors") + + findUnclaimedCreditWarning := func(game common.Address, actor common.Address) *testlog.CapturedRecord { + return logs.FindLog( + testlog.NewLevelFilter(log.LevelWarn), + testlog.NewMessageFilter("Found unclaimed credit"), + testlog.NewAttributesFilter("game", game.Hex()), + testlog.NewAttributesFilter("recipient", actor.Hex())) + } + requireUnclaimedWarning := func(game common.Address, actor common.Address) { + require.NotNil(t, findUnclaimedCreditWarning(game, actor)) + } + noUnclaimedWarning := func(game common.Address, actor common.Address) { + require.Nil(t, findUnclaimedCreditWarning(game, actor)) + } + // Game 1, unclaimed for honestActor1 only + requireUnclaimedWarning(games[0].Proxy, honestActor1) + noUnclaimedWarning(games[0].Proxy, honestActor2) + noUnclaimedWarning(games[0].Proxy, honestActor3) + noUnclaimedWarning(games[0].Proxy, dishonestActor4) + + // Game 2, unclaimed for honestActor1 only + requireUnclaimedWarning(games[1].Proxy, honestActor1) + noUnclaimedWarning(games[1].Proxy, honestActor2) + noUnclaimedWarning(games[1].Proxy, honestActor3) + noUnclaimedWarning(games[1].Proxy, dishonestActor4) + + // Game 3, unclaimed for honestActor3 only + // dishonestActor4 has unclaimed credits but we don't track them + noUnclaimedWarning(games[2].Proxy, honestActor1) + noUnclaimedWarning(games[2].Proxy, honestActor2) + requireUnclaimedWarning(games[2].Proxy, honestActor3) + noUnclaimedWarning(games[2].Proxy, dishonestActor4) } type stubWithdrawalsMetrics struct { - matchCalls int - divergeCalls int - matching map[common.Address]int - divergent map[common.Address]int + matchCalls int + divergeCalls int + matching map[common.Address]int + divergent map[common.Address]int + honestWithdrawable map[common.Address]*big.Int +} + +func (s *stubWithdrawalsMetrics) RecordHonestWithdrawableAmounts(honestWithdrawable map[common.Address]*big.Int) { + s.honestWithdrawable = honestWithdrawable } func (s *stubWithdrawalsMetrics) RecordWithdrawalRequests(addr common.Address, matches bool, count int) { diff --git a/op-e2e/Makefile b/op-e2e/Makefile index 707227f14dac..f3f67f8050da 100644 --- a/op-e2e/Makefile +++ b/op-e2e/Makefile @@ -17,15 +17,15 @@ test-external-%: pre-test $(go_test) $(go_test_flags) --externalL2 ./external_$*/ test-ws: pre-test - $(go_test) $(go_test_flags) . ./e2eutils/... + $(go_test) $(go_test_flags) ./system/... ./e2eutils/... ./opgeth/... ./interop/... .PHONY: test-ws test-actions: pre-test - $(go_test) $(go_test_flags) ./actions + $(go_test) $(go_test_flags) ./actions/... .PHONY: test-actions test-http: pre-test - OP_E2E_USE_HTTP=true $(go_test) $(go_test_flags) . ./e2eutils/... + OP_E2E_USE_HTTP=true $(go_test) $(go_test_flags) ./system/... ./e2eutils/... ./opgeth/... ./interop/... .PHONY: test-http test-cannon: pre-test @@ -36,8 +36,13 @@ test-fault-proofs: pre-test $(go_test) $(go_test_flags) ./faultproofs .PHONY: test-faultproofs -cannon-prestate: +test-devnet: pre-test + $(go_test) $(go_test_flags) ./devnet +.PHONY: test-devnet + +cannon-prestates: make -C .. cannon-prestate + make -C .. cannon-prestate-mt .PHONY: cannon-prestate # We depend on the absolute pre-state generated by cannon to deploy the dispute game contracts. @@ -50,7 +55,7 @@ pre-test: pre-test-cannon pre-test-allocs pre-test-cannon: @if [ ! -e ../op-program/bin ]; then \ - make cannon-prestate; \ + make cannon-prestates; \ fi .PHONY: pre-test-cannon @@ -66,7 +71,7 @@ clean: .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 ./ + go test -run NOTAREALTEST -tags cgo_test -v -fuzztime 10s -fuzz FuzzFjordCostFunction ./opgeth + go test -run NOTAREALTEST -tags cgo_test -v -fuzztime 10s -fuzz FuzzFastLzGethSolidity ./opgeth + go test -run NOTAREALTEST -tags cgo_test -v -fuzztime 10s -fuzz FuzzFastLzCgo ./opgeth diff --git a/op-e2e/README.md b/op-e2e/README.md index 28fdb06dad1b..d6f096194224 100644 --- a/op-e2e/README.md +++ b/op-e2e/README.md @@ -29,6 +29,6 @@ make test-http ### Troubleshooting If you encounter errors: -* ensure you have the latest version of foundry installed: `pnpm update:foundry` +* ensure you have the latest version of foundry installed: `just update-foundry` * try deleting the `packages/contracts-bedrock/forge-artifacts` directory -* if the above step doesn't fix the error, try `pnpm clean` +* try `forge clean && rm -rf lib && forge install` within the `packages/contracts-bedrock` directory diff --git a/op-e2e/actions/altda/altda_test.go b/op-e2e/actions/altda/altda_test.go new file mode 100644 index 000000000000..ac122d9d999a --- /dev/null +++ b/op-e2e/actions/altda/altda_test.go @@ -0,0 +1,629 @@ +package altda + +import ( + "math/big" + "math/rand" + "testing" + + "github.com/ethereum-optimism/optimism/op-e2e/actions/helpers" + "github.com/stretchr/testify/require" + + "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/log" + + altda "github.com/ethereum-optimism/optimism/op-alt-da" + "github.com/ethereum-optimism/optimism/op-alt-da/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" + "github.com/ethereum-optimism/optimism/op-node/rollup/event" + "github.com/ethereum-optimism/optimism/op-node/rollup/sync" + "github.com/ethereum-optimism/optimism/op-service/sources" + "github.com/ethereum-optimism/optimism/op-service/testlog" +) + +// Devnet allocs should have alt-da mode enabled for these tests to pass + +// L2AltDA is a test harness for manipulating AltDA state. +type L2AltDA struct { + log log.Logger + storage *altda.DAErrFaker + daMgr *altda.DA + altDACfg altda.Config + contract *bindings.DataAvailabilityChallenge + batcher *helpers.L2Batcher + sequencer *helpers.L2Sequencer + engine *helpers.L2Engine + engCl *sources.EngineClient + sd *e2eutils.SetupData + dp *e2eutils.DeployParams + miner *helpers.L1Miner + alice *helpers.CrossLayerUser + lastComm []byte + lastCommBn uint64 +} + +type AltDAParam func(p *e2eutils.TestParams) + +func NewL2AltDA(t helpers.Testing, params ...AltDAParam) *L2AltDA { + p := &e2eutils.TestParams{ + MaxSequencerDrift: 40, + SequencerWindowSize: 12, + ChannelTimeout: 12, + L1BlockTime: 12, + UseAltDA: true, + } + for _, apply := range params { + apply(p) + } + log := testlog.Logger(t, log.LvlDebug) + + dp := e2eutils.MakeDeployParams(t, p) + sd := e2eutils.Setup(t, dp, helpers.DefaultAlloc) + + require.True(t, sd.RollupCfg.AltDAEnabled()) + + miner := helpers.NewL1Miner(t, log, sd.L1Cfg) + l1Client := miner.EthClient() + + jwtPath := e2eutils.WriteDefaultJWT(t) + engine := helpers.NewL2Engine(t, log, sd.L2Cfg, sd.RollupCfg.Genesis.L1, jwtPath) + engCl := engine.EngineClient(t, sd.RollupCfg) + + storage := &altda.DAErrFaker{Client: altda.NewMockDAClient(log)} + + l1F, err := sources.NewL1Client(miner.RPCClient(), log, nil, sources.L1ClientDefaultConfig(sd.RollupCfg, false, sources.RPCKindBasic)) + require.NoError(t, err) + + altDACfg, err := sd.RollupCfg.GetOPAltDAConfig() + require.NoError(t, err) + + daMgr := altda.NewAltDAWithStorage(log, altDACfg, storage, &altda.NoopMetrics{}) + + sequencer := helpers.NewL2Sequencer(t, log, l1F, miner.BlobStore(), daMgr, engCl, sd.RollupCfg, 0, nil) + miner.ActL1SetFeeRecipient(common.Address{'A'}) + sequencer.ActL2PipelineFull(t) + + batcher := helpers.NewL2Batcher(log, sd.RollupCfg, helpers.AltDABatcherCfg(dp, storage), sequencer.RollupClient(), l1Client, engine.EthClient(), engCl) + + addresses := e2eutils.CollectAddresses(sd, dp) + cl := engine.EthClient() + l2UserEnv := &helpers.BasicUserEnv[*helpers.L2Bindings]{ + EthCl: cl, + Signer: types.LatestSigner(sd.L2Cfg.Config), + AddressCorpora: addresses, + Bindings: helpers.NewL2Bindings(t, cl, engine.GethClient()), + } + alice := helpers.NewCrossLayerUser(log, dp.Secrets.Alice, rand.New(rand.NewSource(0xa57b))) + alice.L2.SetUserEnv(l2UserEnv) + + contract, err := bindings.NewDataAvailabilityChallenge(sd.RollupCfg.AltDAConfig.DAChallengeAddress, l1Client) + require.NoError(t, err) + + challengeWindow, err := contract.ChallengeWindow(nil) + require.NoError(t, err) + require.Equal(t, altDACfg.ChallengeWindow, challengeWindow.Uint64()) + + resolveWindow, err := contract.ResolveWindow(nil) + require.NoError(t, err) + require.Equal(t, altDACfg.ResolveWindow, resolveWindow.Uint64()) + + return &L2AltDA{ + log: log, + storage: storage, + daMgr: daMgr, + altDACfg: altDACfg, + contract: contract, + batcher: batcher, + sequencer: sequencer, + engine: engine, + engCl: engCl, + sd: sd, + dp: dp, + miner: miner, + alice: alice, + } +} + +func (a *L2AltDA) StorageClient() *altda.DAErrFaker { + return a.storage +} + +func (a *L2AltDA) NewVerifier(t helpers.Testing) *helpers.L2Verifier { + jwtPath := e2eutils.WriteDefaultJWT(t) + engine := helpers.NewL2Engine(t, a.log, a.sd.L2Cfg, a.sd.RollupCfg.Genesis.L1, jwtPath) + engCl := engine.EngineClient(t, a.sd.RollupCfg) + l1F, err := sources.NewL1Client(a.miner.RPCClient(), a.log, nil, sources.L1ClientDefaultConfig(a.sd.RollupCfg, false, sources.RPCKindBasic)) + require.NoError(t, err) + + daMgr := altda.NewAltDAWithStorage(a.log, a.altDACfg, a.storage, &altda.NoopMetrics{}) + + verifier := helpers.NewL2Verifier(t, a.log, l1F, a.miner.BlobStore(), daMgr, engCl, a.sd.RollupCfg, &sync.Config{}, safedb.Disabled, nil) + + return verifier +} + +func (a *L2AltDA) ActSequencerIncludeTx(t helpers.Testing) { + a.alice.L2.ActResetTxOpts(t) + a.alice.L2.ActSetTxToAddr(&a.dp.Addresses.Bob)(t) + a.alice.L2.ActMakeTx(t) + + a.sequencer.ActL2PipelineFull(t) + + a.sequencer.ActL2StartBlock(t) + a.engine.ActL2IncludeTx(a.alice.Address())(t) + a.sequencer.ActL2EndBlock(t) +} + +func (a *L2AltDA) ActNewL2Tx(t helpers.Testing) { + a.ActSequencerIncludeTx(t) + + a.batcher.ActL2BatchBuffer(t) + a.batcher.ActL2ChannelClose(t) + a.batcher.ActL2BatchSubmit(t, func(tx *types.DynamicFeeTx) { + // skip txdata version byte + a.lastComm = tx.Data[1:] + }) + + a.miner.ActL1StartBlock(12)(t) + a.miner.ActL1IncludeTx(a.dp.Addresses.Batcher)(t) + a.miner.ActL1EndBlock(t) + + a.lastCommBn = a.miner.L1Chain().CurrentBlock().Number.Uint64() +} + +func (a *L2AltDA) ActDeleteLastInput(t helpers.Testing) { + require.NoError(t, a.storage.Client.DeleteData(a.lastComm)) +} + +func (a *L2AltDA) ActChallengeLastInput(t helpers.Testing) { + a.ActChallengeInput(t, a.lastComm, a.lastCommBn) + + a.log.Info("challenged last input", "block", a.lastCommBn) +} + +func (a *L2AltDA) ActChallengeInput(t helpers.Testing, comm []byte, bn uint64) { + bondValue, err := a.contract.BondSize(&bind.CallOpts{}) + require.NoError(t, err) + + txOpts, err := bind.NewKeyedTransactorWithChainID(a.dp.Secrets.Alice, a.sd.L1Cfg.Config.ChainID) + require.NoError(t, err) + + txOpts.Value = bondValue + _, err = a.contract.Deposit(txOpts) + require.NoError(t, err) + + a.miner.ActL1StartBlock(12)(t) + a.miner.ActL1IncludeTx(a.alice.Address())(t) + a.miner.ActL1EndBlock(t) + + txOpts, err = bind.NewKeyedTransactorWithChainID(a.dp.Secrets.Alice, a.sd.L1Cfg.Config.ChainID) + require.NoError(t, err) + + _, err = a.contract.Challenge(txOpts, big.NewInt(int64(bn)), comm) + require.NoError(t, err) + + a.miner.ActL1StartBlock(12)(t) + a.miner.ActL1IncludeTx(a.alice.Address())(t) + a.miner.ActL1EndBlock(t) +} + +func (a *L2AltDA) ActExpireLastInput(t helpers.Testing) { + reorgWindow := a.altDACfg.ResolveWindow + a.altDACfg.ChallengeWindow + for a.miner.L1Chain().CurrentBlock().Number.Uint64() <= a.lastCommBn+reorgWindow { + a.miner.ActL1StartBlock(12)(t) + a.miner.ActL1EndBlock(t) + } +} + +func (a *L2AltDA) ActResolveInput(t helpers.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(bn)), comm, input) + require.NoError(t, err) + + a.miner.ActL1StartBlock(12)(t) + a.miner.ActL1IncludeTx(a.alice.Address())(t) + a.miner.ActL1EndBlock(t) +} + +func (a *L2AltDA) ActResolveLastChallenge(t helpers.Testing) { + // remove derivation byte prefix + input, err := a.storage.GetInput(t.Ctx(), altda.Keccak256Commitment(a.lastComm[1:])) + require.NoError(t, err) + + a.ActResolveInput(t, a.lastComm, input, a.lastCommBn) +} + +func (a *L2AltDA) ActL1Blocks(t helpers.Testing, n uint64) { + for i := uint64(0); i < n; i++ { + a.miner.ActL1StartBlock(12)(t) + a.miner.ActL1EndBlock(t) + } +} + +func (a *L2AltDA) GetLastTxBlock(t helpers.Testing) *types.Block { + rcpt := a.alice.L2.LastTxReceipt(t) + blk, err := a.engine.EthClient().BlockByHash(t.Ctx(), rcpt.BlockHash) + require.NoError(t, err) + return blk +} + +func (a *L2AltDA) ActL1Finalized(t helpers.Testing) { + latest := a.miner.L1Chain().CurrentBlock().Number.Uint64() + a.miner.ActL1Safe(t, latest) + a.miner.ActL1Finalize(t, latest) + a.sequencer.ActL1FinalizedSignal(t) +} + +// Commitment is challenged but never resolved, chain reorgs when challenge window expires. +func TestAltDA_ChallengeExpired(gt *testing.T) { + if !e2eutils.UseAltDA() { + gt.Skip("AltDA is not enabled") + } + + t := helpers.NewDefaultTesting(gt) + harness := NewL2AltDA(t) + + // generate enough initial l1 blocks to have a finalized head. + harness.ActL1Blocks(t, 5) + + // Include a new l2 transaction, submitting an input commitment to the l1. + harness.ActNewL2Tx(t) + + // Challenge the input commitment on the l1 challenge contract. + harness.ActChallengeLastInput(t) + + blk := harness.GetLastTxBlock(t) + + // catch up the sequencer derivation pipeline with the new l1 blocks. + harness.sequencer.ActL2PipelineFull(t) + + // create enough l1 blocks to expire the resolve window. + harness.ActExpireLastInput(t) + + // catch up the sequencer derivation pipeline with the new l1 blocks. + harness.sequencer.ActL2PipelineFull(t) + + // the L1 finalized signal should trigger altDA to finalize the engine queue. + harness.ActL1Finalized(t) + + // move one more block for engine controller to update. + harness.ActL1Blocks(t, 1) + harness.sequencer.ActL2PipelineFull(t) + + // get new block with same number to compare + newBlk, err := harness.engine.EthClient().BlockByNumber(t.Ctx(), blk.Number()) + require.NoError(t, err) + + // reorg happened even though data was available + require.NotEqual(t, blk.Hash(), newBlk.Hash()) + + // now delete the data from the storage service so it is not available at all + // to the verifier derivation pipeline. + harness.ActDeleteLastInput(t) + + syncStatus := harness.sequencer.SyncStatus() + + // verifier is able to sync with expired missing data + verifier := harness.NewVerifier(t) + verifier.ActL2PipelineFull(t) + verifier.ActL1FinalizedSignal(t) + + verifSyncStatus := verifier.SyncStatus() + + require.Equal(t, syncStatus.FinalizedL2, verifSyncStatus.FinalizedL2) +} + +// Commitment is challenged after sequencer derived the chain but data disappears. A verifier +// derivation pipeline stalls until the challenge is resolved and then resumes with data from the contract. +func TestAltDA_ChallengeResolved(gt *testing.T) { + if !e2eutils.UseAltDA() { + gt.Skip("AltDA is not enabled") + } + + t := helpers.NewDefaultTesting(gt) + harness := NewL2AltDA(t) + + // include a new l2 transaction, submitting an input commitment to the l1. + harness.ActNewL2Tx(t) + + // generate 3 l1 blocks. + harness.ActL1Blocks(t, 3) + + // challenge the input commitment for that l2 transaction on the l1 challenge contract. + harness.ActChallengeLastInput(t) + + // catch up sequencer derivation pipeline. + // this syncs the latest event within the AltDA manager. + harness.sequencer.ActL2PipelineFull(t) + + // resolve the challenge on the l1 challenge contract. + harness.ActResolveLastChallenge(t) + + // catch up the sequencer derivation pipeline with the new l1 blocks. + // this syncs the resolved status and input data within the AltDA manager. + harness.sequencer.ActL2PipelineFull(t) + + // finalize l1 + harness.ActL1Finalized(t) + + // delete the data from the storage service so it is not available at all + // to the verifier derivation pipeline. + harness.ActDeleteLastInput(t) + + syncStatus := harness.sequencer.SyncStatus() + + // new verifier is able to sync and resolve the input from calldata + verifier := harness.NewVerifier(t) + verifier.ActL2PipelineFull(t) + verifier.ActL1FinalizedSignal(t) + + verifSyncStatus := verifier.SyncStatus() + + require.Equal(t, syncStatus.SafeL2, verifSyncStatus.SafeL2) +} + +// DA storage service goes offline while sequencer keeps making blocks. When storage comes back online, it should be able to catch up. +func TestAltDA_StorageError(gt *testing.T) { + if !e2eutils.UseAltDA() { + gt.Skip("AltDA is not enabled") + } + + t := helpers.NewDefaultTesting(gt) + harness := NewL2AltDA(t) + + // include a new l2 transaction, submitting an input commitment to the l1. + harness.ActNewL2Tx(t) + + txBlk := harness.GetLastTxBlock(t) + + // mock a storage client error when trying to get the pre-image. + // this simulates the storage service going offline for example. + harness.storage.ActGetPreImageFail() + + // try to derive the l2 chain from the submitted inputs commitments. + // the storage call will fail the first time then succeed. + harness.sequencer.ActL2PipelineFull(t) + + // sequencer derivation was able to sync to latest l1 origin + syncStatus := harness.sequencer.SyncStatus() + require.Equal(t, uint64(1), syncStatus.SafeL2.Number) + require.Equal(t, txBlk.Hash(), syncStatus.SafeL2.Hash) +} + +// L1 chain reorgs a resolved challenge so it expires instead causing +// the l2 chain to reorg as well. +func TestAltDA_ChallengeReorg(gt *testing.T) { + if !e2eutils.UseAltDA() { + gt.Skip("AltDA is not enabled") + } + + t := helpers.NewDefaultTesting(gt) + harness := NewL2AltDA(t) + + // New L2 tx added to a batch and committed to L1 + harness.ActNewL2Tx(t) + + // add a buffer of L1 blocks + harness.ActL1Blocks(t, 3) + + // challenge the input commitment + harness.ActChallengeLastInput(t) + + // keep track of the block where the L2 tx was included + blk := harness.GetLastTxBlock(t) + + // progress derivation pipeline + harness.sequencer.ActL2PipelineFull(t) + + // resolve the challenge so pipeline can progress + harness.ActResolveLastChallenge(t) + + // derivation marks the challenge as resolve, chain is not impacted + harness.sequencer.ActL2PipelineFull(t) + + // Rewind the L1, essentially reorging the challenge resolution + harness.miner.ActL1RewindToParent(t) + + // Now the L1 chain advances without the challenge resolution + // so the challenge is expired. + harness.ActExpireLastInput(t) + + // derivation pipeline reorgs the commitment out of the chain + harness.sequencer.ActL2PipelineFull(t) + + newBlk, err := harness.engine.EthClient().BlockByNumber(t.Ctx(), blk.Number()) + require.NoError(t, err) + + // 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 TestAltDA_SequencerStalledMultiChallenges(gt *testing.T) { + if !e2eutils.UseAltDA() { + gt.Skip("AltDA is not enabled") + } + + t := helpers.NewDefaultTesting(gt) + a := NewL2AltDA(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(), altda.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(12)(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 + a.sequencer.ActL2EventsUntil(t, func(ev event.Event) bool { + x, ok := ev.(rollup.EngineTemporaryErrorEvent) + if ok { + require.ErrorContains(t, x.Err, "failed to fetch input data") + } + return ok + }, 100, false) + + // keep track of the second commitment + comm2 := a.lastComm + _, err = a.storage.GetInput(t.Ctx(), altda.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 altDA windows. +// based on l2_batcher_test.go L2Finalization +func TestAltDA_Finalization(gt *testing.T) { + if !e2eutils.UseAltDA() { + gt.Skip("AltDA is not enabled") + } + t := helpers.NewDefaultTesting(gt) + a := NewL2AltDA(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.altDACfg.ChallengeWindow) + + // advance derivation and finalize altDA via the L1 signal + a.sequencer.ActL2PipelineFull(t) + a.ActL1Finalized(t) + a.sequencer.ActL2PipelineFull(t) // finality event needs to be processed + + // 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/batcher/eip4844_test.go b/op-e2e/actions/batcher/eip4844_test.go new file mode 100644 index 000000000000..6d77a3961788 --- /dev/null +++ b/op-e2e/actions/batcher/eip4844_test.go @@ -0,0 +1,186 @@ +package batcher + +import ( + "testing" + + "github.com/ethereum-optimism/optimism/op-e2e/actions/helpers" + "github.com/stretchr/testify/require" + + "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" + + batcherFlags "github.com/ethereum-optimism/optimism/op-batcher/flags" + "github.com/ethereum-optimism/optimism/op-e2e/e2eutils" + "github.com/ethereum-optimism/optimism/op-node/rollup/sync" + "github.com/ethereum-optimism/optimism/op-service/testlog" +) + +func setupEIP4844Test(t helpers.Testing, log log.Logger) (*e2eutils.SetupData, *e2eutils.DeployParams, *helpers.L1Miner, *helpers.L2Sequencer, *helpers.L2Engine, *helpers.L2Verifier, *helpers.L2Engine) { + dp := e2eutils.MakeDeployParams(t, helpers.DefaultRollupTestParams) + genesisActivation := hexutil.Uint64(0) + dp.DeployConfig.L1CancunTimeOffset = &genesisActivation + dp.DeployConfig.L2GenesisCanyonTimeOffset = &genesisActivation + dp.DeployConfig.L2GenesisDeltaTimeOffset = &genesisActivation + dp.DeployConfig.L2GenesisEcotoneTimeOffset = &genesisActivation + + sd := e2eutils.Setup(t, dp, helpers.DefaultAlloc) + miner, seqEngine, sequencer := helpers.SetupSequencerTest(t, sd, log) + miner.ActL1SetFeeRecipient(common.Address{'A'}) + sequencer.ActL2PipelineFull(t) + verifEngine, verifier := helpers.SetupVerifier(t, sd, log, miner.L1Client(t, sd.RollupCfg), miner.BlobStore(), &sync.Config{}) + return sd, dp, miner, sequencer, seqEngine, verifier, verifEngine +} + +func setupBatcher(t helpers.Testing, log log.Logger, sd *e2eutils.SetupData, dp *e2eutils.DeployParams, miner *helpers.L1Miner, + sequencer *helpers.L2Sequencer, engine *helpers.L2Engine, daType batcherFlags.DataAvailabilityType, +) *helpers.L2Batcher { + return helpers.NewL2Batcher(log, sd.RollupCfg, &helpers.BatcherCfg{ + MinL1TxSize: 0, + MaxL1TxSize: 128_000, + BatcherKey: dp.Secrets.Batcher, + DataAvailabilityType: daType, + }, sequencer.RollupClient(), miner.EthClient(), engine.EthClient(), engine.EngineClient(t, sd.RollupCfg)) +} + +func TestEIP4844DataAvailability(gt *testing.T) { + t := helpers.NewDefaultTesting(gt) + + log := testlog.Logger(t, log.LevelDebug) + sd, dp, miner, sequencer, seqEngine, verifier, _ := setupEIP4844Test(t, log) + + batcher := setupBatcher(t, log, sd, dp, miner, sequencer, seqEngine, batcherFlags.BlobsType) + + sequencer.ActL2PipelineFull(t) + verifier.ActL2PipelineFull(t) + + // build empty L1 block + miner.ActEmptyBlock(t) + // finalize it, so the L1 geth blob pool doesn't log errors about missing finality + miner.ActL1SafeNext(t) + miner.ActL1FinalizeNext(t) + + // Create L2 blocks, and reference the L1 head as origin + sequencer.ActL1HeadSignal(t) + sequencer.ActBuildToL1Head(t) + + // submit all new L2 blocks + batcher.ActSubmitAll(t) + batchTx := batcher.LastSubmitted + require.Equal(t, uint8(types.BlobTxType), batchTx.Type(), "batch tx must be blob-tx") + + // new L1 block with L2 batch + miner.ActL1StartBlock(12)(t) + miner.ActL1IncludeTxByHash(batchTx.Hash())(t) + miner.ActL1EndBlock(t) + + // verifier picks up the L2 chain that was submitted + verifier.ActL1HeadSignal(t) + verifier.ActL2PipelineFull(t) + require.Equal(t, verifier.L2Safe(), sequencer.L2Unsafe(), "verifier syncs from sequencer via L1") + require.NotEqual(t, sequencer.L2Safe(), sequencer.L2Unsafe(), "sequencer has not processed L1 yet") +} + +func TestEIP4844MultiBlobs(gt *testing.T) { + t := helpers.NewDefaultTesting(gt) + + log := testlog.Logger(t, log.LevelDebug) + sd, dp, miner, sequencer, seqEngine, verifier, _ := setupEIP4844Test(t, log) + + batcher := setupBatcher(t, log, sd, dp, miner, sequencer, seqEngine, batcherFlags.BlobsType) + + sequencer.ActL2PipelineFull(t) + verifier.ActL2PipelineFull(t) + + // build empty L1 block + miner.ActEmptyBlock(t) + // finalize it, so the L1 geth blob pool doesn't log errors about missing finality + miner.ActL1SafeNext(t) + miner.ActL1FinalizeNext(t) + + // Create L2 blocks, and reference the L1 head as origin + sequencer.ActL1HeadSignal(t) + sequencer.ActBuildToL1Head(t) + + // submit all new L2 blocks + batcher.ActSubmitAllMultiBlobs(t, 6) + batchTx := batcher.LastSubmitted + require.Equal(t, uint8(types.BlobTxType), batchTx.Type(), "batch tx must be blob-tx") + require.Len(t, batchTx.BlobTxSidecar().Blobs, 6) + + // new L1 block with L2 batch + miner.ActL1StartBlock(12)(t) + miner.ActL1IncludeTxByHash(batchTx.Hash())(t) + miner.ActL1EndBlock(t) + + // verifier picks up the L2 chain that was submitted + verifier.ActL1HeadSignal(t) + verifier.ActL2PipelineFull(t) + require.Equal(t, verifier.L2Safe(), sequencer.L2Unsafe(), "verifier syncs from sequencer via L1") + require.NotEqual(t, sequencer.L2Safe(), sequencer.L2Unsafe(), "sequencer has not processed L1 yet") +} + +func TestEIP4844DataAvailabilitySwitch(gt *testing.T) { + t := helpers.NewDefaultTesting(gt) + + log := testlog.Logger(t, log.LevelDebug) + sd, dp, miner, sequencer, seqEngine, verifier, _ := setupEIP4844Test(t, log) + + oldBatcher := setupBatcher(t, log, sd, dp, miner, sequencer, seqEngine, batcherFlags.CalldataType) + + sequencer.ActL2PipelineFull(t) + verifier.ActL2PipelineFull(t) + + // build empty L1 block + miner.ActEmptyBlock(t) + // finalize it, so the L1 geth blob pool doesn't log errors about missing finality + miner.ActL1SafeNext(t) + miner.ActL1FinalizeNext(t) + + // Create L2 blocks, and reference the L1 head as origin + sequencer.ActL1HeadSignal(t) + sequencer.ActBuildToL1Head(t) + + // submit all new L2 blocks, with legacy calldata DA + oldBatcher.ActSubmitAll(t) + batchTx := oldBatcher.LastSubmitted + require.Equal(t, uint8(types.DynamicFeeTxType), batchTx.Type(), "batch tx must be eip1559 tx") + + // new L1 block with L2 batch + miner.ActL1StartBlock(12)(t) + miner.ActL1IncludeTxByHash(batchTx.Hash())(t) + miner.ActL1EndBlock(t) + + // verifier picks up the L2 chain that was submitted + verifier.ActL1HeadSignal(t) + verifier.ActL2PipelineFull(t) + require.Equal(t, verifier.L2Safe(), sequencer.L2Unsafe(), "verifier syncs from sequencer via L1") + require.NotEqual(t, sequencer.L2Safe(), sequencer.L2Unsafe(), "sequencer has not processed L1 yet") + + newBatcher := setupBatcher(t, log, sd, dp, miner, sequencer, seqEngine, batcherFlags.BlobsType) + + // build empty L1 block + miner.ActEmptyBlock(t) + + // Create L2 blocks, and reference the L1 head as origin + sequencer.ActL1HeadSignal(t) + sequencer.ActBuildToL1Head(t) + + // submit all new L2 blocks, now with Blobs DA! + newBatcher.ActSubmitAll(t) + batchTx = newBatcher.LastSubmitted + + // new L1 block with L2 batch + miner.ActL1StartBlock(12)(t) + miner.ActL1IncludeTxByHash(batchTx.Hash())(t) + miner.ActL1EndBlock(t) + + require.Equal(t, uint8(types.BlobTxType), batchTx.Type(), "batch tx must be blob-tx") + + // verifier picks up the L2 chain that was submitted + verifier.ActL1HeadSignal(t) + verifier.ActL2PipelineFull(t) + require.Equal(t, verifier.L2Safe(), sequencer.L2Unsafe(), "verifier syncs from sequencer via L1") + require.NotEqual(t, sequencer.L2Safe(), sequencer.L2Unsafe(), "sequencer has not processed L1 yet") +} diff --git a/op-e2e/actions/l2_batcher_test.go b/op-e2e/actions/batcher/l2_batcher_test.go similarity index 78% rename from op-e2e/actions/l2_batcher_test.go rename to op-e2e/actions/batcher/l2_batcher_test.go index 5d1d40925803..e0605f3fb121 100644 --- a/op-e2e/actions/l2_batcher_test.go +++ b/op-e2e/actions/batcher/l2_batcher_test.go @@ -1,4 +1,4 @@ -package actions +package batcher import ( "errors" @@ -6,7 +6,8 @@ import ( "math/rand" "testing" - "github.com/ethereum/go-ethereum/common" + actionsHelpers "github.com/ethereum-optimism/optimism/op-e2e/actions/helpers" + upgradesHelpers "github.com/ethereum-optimism/optimism/op-e2e/actions/upgrades/helpers" "github.com/ethereum/go-ethereum/common/hexutil" "github.com/ethereum/go-ethereum/core" "github.com/ethereum/go-ethereum/core/types" @@ -51,29 +52,8 @@ func TestL2BatcherBatchType(t *testing.T) { } } -// applyDeltaTimeOffset adjusts fork configuration to not conflict with the delta overrides -func applyDeltaTimeOffset(dp *e2eutils.DeployParams, deltaTimeOffset *hexutil.Uint64) { - dp.DeployConfig.L2GenesisDeltaTimeOffset = deltaTimeOffset - // configure Ecotone to not be before Delta accidentally - if dp.DeployConfig.L2GenesisEcotoneTimeOffset != nil { - if deltaTimeOffset == nil { - dp.DeployConfig.L2GenesisEcotoneTimeOffset = nil - } else if *dp.DeployConfig.L2GenesisEcotoneTimeOffset < *deltaTimeOffset { - dp.DeployConfig.L2GenesisEcotoneTimeOffset = deltaTimeOffset - } - } - // configure Fjord to not be before Delta accidentally - if dp.DeployConfig.L2GenesisFjordTimeOffset != nil { - if deltaTimeOffset == nil { - dp.DeployConfig.L2GenesisFjordTimeOffset = nil - } else if *dp.DeployConfig.L2GenesisFjordTimeOffset < *deltaTimeOffset { - dp.DeployConfig.L2GenesisFjordTimeOffset = deltaTimeOffset - } - } -} - func NormalBatcher(gt *testing.T, deltaTimeOffset *hexutil.Uint64) { - t := NewDefaultTesting(gt) + t := actionsHelpers.NewDefaultTesting(gt) p := &e2eutils.TestParams{ MaxSequencerDrift: 20, // larger than L1 block time we simulate in this test (12) SequencerWindowSize: 24, @@ -81,14 +61,14 @@ func NormalBatcher(gt *testing.T, deltaTimeOffset *hexutil.Uint64) { L1BlockTime: 12, } dp := e2eutils.MakeDeployParams(t, p) - applyDeltaTimeOffset(dp, deltaTimeOffset) - sd := e2eutils.Setup(t, dp, defaultAlloc) + upgradesHelpers.ApplyDeltaTimeOffset(dp, deltaTimeOffset) + sd := e2eutils.Setup(t, dp, actionsHelpers.DefaultAlloc) log := testlog.Logger(t, log.LevelDebug) - miner, seqEngine, sequencer := setupSequencerTest(t, sd, log) - verifEngine, verifier := setupVerifier(t, sd, log, miner.L1Client(t, sd.RollupCfg), miner.BlobStore(), &sync.Config{}) + miner, seqEngine, sequencer := actionsHelpers.SetupSequencerTest(t, sd, log) + verifEngine, verifier := actionsHelpers.SetupVerifier(t, sd, log, miner.L1Client(t, sd.RollupCfg), miner.BlobStore(), &sync.Config{}) rollupSeqCl := sequencer.RollupClient() - batcher := NewL2Batcher(log, sd.RollupCfg, DefaultBatcherCfg(dp), + batcher := actionsHelpers.NewL2Batcher(log, sd.RollupCfg, actionsHelpers.DefaultBatcherCfg(dp), rollupSeqCl, miner.EthClient(), seqEngine.EthClient(), seqEngine.EngineClient(t, sd.RollupCfg)) // Alice makes a L2 tx @@ -100,7 +80,7 @@ func NormalBatcher(gt *testing.T, deltaTimeOffset *hexutil.Uint64) { ChainID: sd.L2Cfg.Config.ChainID, Nonce: n, GasTipCap: big.NewInt(2 * params.GWei), - GasFeeCap: new(big.Int).Add(miner.l1Chain.CurrentBlock().BaseFee, big.NewInt(2*params.GWei)), + GasFeeCap: new(big.Int).Add(miner.L1Chain().CurrentBlock().BaseFee, big.NewInt(2*params.GWei)), Gas: params.TxGas, To: &dp.Addresses.Bob, Value: e2eutils.Ether(2), @@ -124,8 +104,8 @@ func NormalBatcher(gt *testing.T, deltaTimeOffset *hexutil.Uint64) { miner.ActL1StartBlock(12)(t) miner.ActL1IncludeTx(dp.Addresses.Batcher)(t) miner.ActL1EndBlock(t) - bl := miner.l1Chain.CurrentBlock() - log.Info("bl", "txs", len(miner.l1Chain.GetBlockByHash(bl.Hash()).Transactions())) + bl := miner.L1Chain().CurrentBlock() + log.Info("bl", "txs", len(miner.L1Chain().GetBlockByHash(bl.Hash()).Transactions())) // Now make enough L1 blocks that the verifier will have to derive a L2 block // It will also eagerly derive the block from the batcher @@ -148,12 +128,12 @@ func NormalBatcher(gt *testing.T, deltaTimeOffset *hexutil.Uint64) { } func L2Finalization(gt *testing.T, deltaTimeOffset *hexutil.Uint64) { - t := NewDefaultTesting(gt) - dp := e2eutils.MakeDeployParams(t, defaultRollupTestParams) - applyDeltaTimeOffset(dp, deltaTimeOffset) - sd := e2eutils.Setup(t, dp, defaultAlloc) + t := actionsHelpers.NewDefaultTesting(gt) + dp := e2eutils.MakeDeployParams(t, actionsHelpers.DefaultRollupTestParams) + upgradesHelpers.ApplyDeltaTimeOffset(dp, deltaTimeOffset) + sd := e2eutils.Setup(t, dp, actionsHelpers.DefaultAlloc) log := testlog.Logger(t, log.LevelDebug) - miner, engine, sequencer := setupSequencerTest(t, sd, log) + miner, engine, sequencer := actionsHelpers.SetupSequencerTest(t, sd, log) sequencer.ActL2PipelineFull(t) @@ -180,11 +160,12 @@ func L2Finalization(gt *testing.T, deltaTimeOffset *hexutil.Uint64) { sequencer.ActL2PipelineFull(t) sequencer.ActL1FinalizedSignal(t) sequencer.ActL1SafeSignal(t) + sequencer.ActL2PipelineFull(t) // ensure that the forkchoice changes have been applied to the engine require.Equal(t, uint64(2), sequencer.SyncStatus().SafeL1.Number) require.Equal(t, uint64(1), sequencer.SyncStatus().FinalizedL1.Number) require.Equal(t, uint64(0), sequencer.SyncStatus().FinalizedL2.Number, "L2 block has to be included on L1 before it can be finalized") - batcher := NewL2Batcher(log, sd.RollupCfg, DefaultBatcherCfg(dp), + batcher := actionsHelpers.NewL2Batcher(log, sd.RollupCfg, actionsHelpers.DefaultBatcherCfg(dp), sequencer.RollupClient(), miner.EthClient(), engine.EthClient(), engine.EngineClient(t, sd.RollupCfg)) heightToSubmit := sequencer.SyncStatus().UnsafeL2.Number @@ -227,6 +208,7 @@ func L2Finalization(gt *testing.T, deltaTimeOffset *hexutil.Uint64) { sequencer.ActL1FinalizedSignal(t) sequencer.ActL1SafeSignal(t) sequencer.ActL1HeadSignal(t) + sequencer.ActL2PipelineFull(t) // ensure that the forkchoice changes have been applied to the engine require.Equal(t, uint64(6), sequencer.SyncStatus().HeadL1.Number) require.Equal(t, uint64(4), sequencer.SyncStatus().SafeL1.Number) require.Equal(t, uint64(3), sequencer.SyncStatus().FinalizedL1.Number) @@ -239,25 +221,16 @@ func L2Finalization(gt *testing.T, deltaTimeOffset *hexutil.Uint64) { engBlock, err := engCl.L2BlockRefByLabel(t.Ctx(), eth.Finalized) require.NoError(t, err) require.Equal(t, heightToSubmit, engBlock.Number, "engine finalizes what rollup node finalizes") - - // Now try to finalize block 4, but with a bad/malicious alternative hash. - // If we get this false signal, we shouldn't finalize the L2 chain. - altBlock4 := sequencer.SyncStatus().SafeL1 - altBlock4.Hash = common.HexToHash("0xdead") - sequencer.derivation.Finalize(altBlock4) - sequencer.ActL2PipelineFull(t) - require.Equal(t, uint64(3), sequencer.SyncStatus().FinalizedL1.Number) - require.Equal(t, heightToSubmit, sequencer.SyncStatus().FinalizedL2.Number, "unknown/bad finalized L1 blocks are ignored") } // L2FinalizationWithSparseL1 tests that safe L2 blocks can be finalized even if we do not regularly get a L1 finalization signal func L2FinalizationWithSparseL1(gt *testing.T, deltaTimeOffset *hexutil.Uint64) { - t := NewDefaultTesting(gt) - dp := e2eutils.MakeDeployParams(t, defaultRollupTestParams) - applyDeltaTimeOffset(dp, deltaTimeOffset) - sd := e2eutils.Setup(t, dp, defaultAlloc) + t := actionsHelpers.NewDefaultTesting(gt) + dp := e2eutils.MakeDeployParams(t, actionsHelpers.DefaultRollupTestParams) + upgradesHelpers.ApplyDeltaTimeOffset(dp, deltaTimeOffset) + sd := e2eutils.Setup(t, dp, actionsHelpers.DefaultAlloc) log := testlog.Logger(t, log.LevelDebug) - miner, engine, sequencer := setupSequencerTest(t, sd, log) + miner, engine, sequencer := actionsHelpers.SetupSequencerTest(t, sd, log) sequencer.ActL2PipelineFull(t) @@ -268,7 +241,7 @@ func L2FinalizationWithSparseL1(gt *testing.T, deltaTimeOffset *hexutil.Uint64) startStatus := sequencer.SyncStatus() require.Less(t, startStatus.SafeL2.Number, startStatus.UnsafeL2.Number, "sequencer has unsafe L2 block") - batcher := NewL2Batcher(log, sd.RollupCfg, DefaultBatcherCfg(dp), + batcher := actionsHelpers.NewL2Batcher(log, sd.RollupCfg, actionsHelpers.DefaultBatcherCfg(dp), sequencer.RollupClient(), miner.EthClient(), engine.EthClient(), engine.EngineClient(t, sd.RollupCfg)) batcher.ActSubmitAll(t) @@ -308,29 +281,29 @@ func L2FinalizationWithSparseL1(gt *testing.T, deltaTimeOffset *hexutil.Uint64) // valid batches being submitted to the batch inbox. These batches should always be rejected // and the safe L2 head should remain unaltered. func GarbageBatch(gt *testing.T, deltaTimeOffset *hexutil.Uint64) { - t := NewDefaultTesting(gt) - p := defaultRollupTestParams + t := actionsHelpers.NewDefaultTesting(gt) + p := actionsHelpers.DefaultRollupTestParams dp := e2eutils.MakeDeployParams(t, p) - applyDeltaTimeOffset(dp, deltaTimeOffset) - for _, garbageKind := range GarbageKinds { - sd := e2eutils.Setup(t, dp, defaultAlloc) + upgradesHelpers.ApplyDeltaTimeOffset(dp, deltaTimeOffset) + for _, garbageKind := range actionsHelpers.GarbageKinds { + sd := e2eutils.Setup(t, dp, actionsHelpers.DefaultAlloc) log := testlog.Logger(t, log.LevelError) - miner, engine, sequencer := setupSequencerTest(t, sd, log) + miner, engine, sequencer := actionsHelpers.SetupSequencerTest(t, sd, log) - _, verifier := setupVerifier(t, sd, log, miner.L1Client(t, sd.RollupCfg), miner.BlobStore(), &sync.Config{}) + _, verifier := actionsHelpers.SetupVerifier(t, sd, log, miner.L1Client(t, sd.RollupCfg), miner.BlobStore(), &sync.Config{}) - batcherCfg := DefaultBatcherCfg(dp) + batcherCfg := actionsHelpers.DefaultBatcherCfg(dp) - if garbageKind == MALFORM_RLP || garbageKind == INVALID_COMPRESSION { + if garbageKind == actionsHelpers.MALFORM_RLP || garbageKind == actionsHelpers.INVALID_COMPRESSION { // If the garbage kind is `INVALID_COMPRESSION` or `MALFORM_RLP`, use the `actions` packages // modified `ChannelOut`. - batcherCfg.GarbageCfg = &GarbageChannelCfg{ - useInvalidCompression: garbageKind == INVALID_COMPRESSION, - malformRLP: garbageKind == MALFORM_RLP, + batcherCfg.GarbageCfg = &actionsHelpers.GarbageChannelCfg{ + UseInvalidCompression: garbageKind == actionsHelpers.INVALID_COMPRESSION, + MalformRLP: garbageKind == actionsHelpers.MALFORM_RLP, } } - batcher := NewL2Batcher(log, sd.RollupCfg, batcherCfg, sequencer.RollupClient(), miner.EthClient(), engine.EthClient(), engine.EngineClient(t, sd.RollupCfg)) + batcher := actionsHelpers.NewL2Batcher(log, sd.RollupCfg, batcherCfg, sequencer.RollupClient(), miner.EthClient(), engine.EthClient(), engine.EngineClient(t, sd.RollupCfg)) sequencer.ActL2PipelineFull(t) verifier.ActL2PipelineFull(t) @@ -384,7 +357,7 @@ func GarbageBatch(gt *testing.T, deltaTimeOffset *hexutil.Uint64) { } func ExtendedTimeWithoutL1Batches(gt *testing.T, deltaTimeOffset *hexutil.Uint64) { - t := NewDefaultTesting(gt) + t := actionsHelpers.NewDefaultTesting(gt) p := &e2eutils.TestParams{ MaxSequencerDrift: 20, // larger than L1 block time we simulate in this test (12) SequencerWindowSize: 24, @@ -392,14 +365,14 @@ func ExtendedTimeWithoutL1Batches(gt *testing.T, deltaTimeOffset *hexutil.Uint64 L1BlockTime: 12, } dp := e2eutils.MakeDeployParams(t, p) - applyDeltaTimeOffset(dp, deltaTimeOffset) - sd := e2eutils.Setup(t, dp, defaultAlloc) + upgradesHelpers.ApplyDeltaTimeOffset(dp, deltaTimeOffset) + sd := e2eutils.Setup(t, dp, actionsHelpers.DefaultAlloc) log := testlog.Logger(t, log.LevelError) - miner, engine, sequencer := setupSequencerTest(t, sd, log) + miner, engine, sequencer := actionsHelpers.SetupSequencerTest(t, sd, log) - _, verifier := setupVerifier(t, sd, log, miner.L1Client(t, sd.RollupCfg), miner.BlobStore(), &sync.Config{}) + _, verifier := actionsHelpers.SetupVerifier(t, sd, log, miner.L1Client(t, sd.RollupCfg), miner.BlobStore(), &sync.Config{}) - batcher := NewL2Batcher(log, sd.RollupCfg, DefaultBatcherCfg(dp), + batcher := actionsHelpers.NewL2Batcher(log, sd.RollupCfg, actionsHelpers.DefaultBatcherCfg(dp), sequencer.RollupClient(), miner.EthClient(), engine.EthClient(), engine.EngineClient(t, sd.RollupCfg)) sequencer.ActL2PipelineFull(t) @@ -440,7 +413,7 @@ func ExtendedTimeWithoutL1Batches(gt *testing.T, deltaTimeOffset *hexutil.Uint64 // This does not test the batcher code, but is really focused at testing the batcher utils // and channel-decoding verifier code in the derive package. func BigL2Txs(gt *testing.T, deltaTimeOffset *hexutil.Uint64) { - t := NewDefaultTesting(gt) + t := actionsHelpers.NewDefaultTesting(gt) p := &e2eutils.TestParams{ MaxSequencerDrift: 100, SequencerWindowSize: 1000, @@ -448,14 +421,14 @@ func BigL2Txs(gt *testing.T, deltaTimeOffset *hexutil.Uint64) { L1BlockTime: 12, } dp := e2eutils.MakeDeployParams(t, p) - applyDeltaTimeOffset(dp, deltaTimeOffset) - sd := e2eutils.Setup(t, dp, defaultAlloc) + upgradesHelpers.ApplyDeltaTimeOffset(dp, deltaTimeOffset) + sd := e2eutils.Setup(t, dp, actionsHelpers.DefaultAlloc) log := testlog.Logger(t, log.LevelInfo) - miner, engine, sequencer := setupSequencerTest(t, sd, log) + miner, engine, sequencer := actionsHelpers.SetupSequencerTest(t, sd, log) - _, verifier := setupVerifier(t, sd, log, miner.L1Client(t, sd.RollupCfg), miner.BlobStore(), &sync.Config{}) + _, verifier := actionsHelpers.SetupVerifier(t, sd, log, miner.L1Client(t, sd.RollupCfg), miner.BlobStore(), &sync.Config{}) - batcher := NewL2Batcher(log, sd.RollupCfg, &BatcherCfg{ + batcher := actionsHelpers.NewL2Batcher(log, sd.RollupCfg, &actionsHelpers.BatcherCfg{ MinL1TxSize: 0, MaxL1TxSize: 40_000, // try a small batch size, to force the data to be split between more frames BatcherKey: dp.Secrets.Batcher, @@ -486,7 +459,7 @@ func BigL2Txs(gt *testing.T, deltaTimeOffset *hexutil.Uint64) { } sequencer.ActL1HeadSignal(t) sequencer.ActL2StartBlock(t) - baseFee := engine.l2Chain.CurrentBlock().BaseFee // this will go quite high, since so many consecutive blocks are filled at capacity. + baseFee := engine.L2Chain().CurrentBlock().BaseFee // this will go quite high, since so many consecutive blocks are filled at capacity. // fill the block with large L2 txs from alice for n := aliceNonce; ; n++ { require.NoError(t, err) @@ -496,7 +469,7 @@ func BigL2Txs(gt *testing.T, deltaTimeOffset *hexutil.Uint64) { require.NoError(t, err) gas, err := core.IntrinsicGas(data, nil, false, true, true, false) require.NoError(t, err) - if gas > engine.engineApi.RemainingBlockGas() { + if gas > engine.EngineApi.RemainingBlockGas() { break } tx := types.MustSignNewTx(dp.Secrets.Alice, signer, &types.DynamicFeeTx{ @@ -513,12 +486,12 @@ func BigL2Txs(gt *testing.T, deltaTimeOffset *hexutil.Uint64) { engine.ActL2IncludeTx(dp.Addresses.Alice)(t) } sequencer.ActL2EndBlock(t) - for batcher.l2BufferedBlock.Number < sequencer.SyncStatus().UnsafeL2.Number { + 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.ErrCompressorFull) { - log.Info("flushing filled channel to batch txs", "id", batcher.l2ChannelOut.ID()) + log.Info("flushing filled channel to batch txs", "id", batcher.L2ChannelOut.ID()) batcher.ActL2ChannelClose(t) - for batcher.l2ChannelOut != nil { + for batcher.L2ChannelOut != nil { batcher.ActL2BatchSubmit(t, batcherTxOpts) } } @@ -526,16 +499,16 @@ func BigL2Txs(gt *testing.T, deltaTimeOffset *hexutil.Uint64) { } // if anything is left in the channel, submit it - if batcher.l2ChannelOut != nil { - log.Info("flushing trailing channel to batch txs", "id", batcher.l2ChannelOut.ID()) + if batcher.L2ChannelOut != nil { + log.Info("flushing trailing channel to batch txs", "id", batcher.L2ChannelOut.ID()) batcher.ActL2ChannelClose(t) - for batcher.l2ChannelOut != nil { + for batcher.L2ChannelOut != nil { batcher.ActL2BatchSubmit(t, batcherTxOpts) } } // build L1 blocks until we're out of txs - txs, _ := miner.eth.TxPool().ContentFrom(dp.Addresses.Batcher) + txs, _ := miner.Eth.TxPool().ContentFrom(dp.Addresses.Batcher) for { if len(txs) == 0 { break @@ -546,7 +519,7 @@ func BigL2Txs(gt *testing.T, deltaTimeOffset *hexutil.Uint64) { break } tx := txs[0] - if miner.l1GasPool.Gas() < tx.Gas() { // fill the L1 block with batcher txs until we run out of gas + if miner.L1GasPool.Gas() < tx.Gas() { // fill the L1 block with batcher txs until we run out of gas break } log.Info("including batcher tx", "nonce", tx.Nonce()) diff --git a/op-e2e/actions/dencun_fork_test.go b/op-e2e/actions/dencun_fork_test.go deleted file mode 100644 index 5e0f1706cb31..000000000000 --- a/op-e2e/actions/dencun_fork_test.go +++ /dev/null @@ -1,259 +0,0 @@ -package actions - -import ( - "context" - "testing" - - "github.com/stretchr/testify/require" - - "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/ethereum-optimism/optimism/op-e2e/e2eutils" - "github.com/ethereum-optimism/optimism/op-e2e/e2eutils/transactions" - "github.com/ethereum-optimism/optimism/op-service/testlog" -) - -func TestDencunL1ForkAfterGenesis(gt *testing.T) { - t := NewDefaultTesting(gt) - dp := e2eutils.MakeDeployParams(t, defaultRollupTestParams) - offset := hexutil.Uint64(24) - dp.DeployConfig.L1CancunTimeOffset = &offset - sd := e2eutils.Setup(t, dp, defaultAlloc) - log := testlog.Logger(t, log.LevelDebug) - _, _, miner, sequencer, _, verifier, _, batcher := setupReorgTestActors(t, dp, sd, log) - - l1Head := miner.l1Chain.CurrentBlock() - require.False(t, sd.L1Cfg.Config.IsCancun(l1Head.Number, l1Head.Time), "Cancun not active yet") - require.Nil(t, l1Head.ExcessBlobGas, "Cancun blob gas not in header") - - // start op-nodes - sequencer.ActL2PipelineFull(t) - verifier.ActL2PipelineFull(t) - - // build empty L1 blocks, crossing the fork boundary - miner.ActL1SetFeeRecipient(common.Address{'A', 0}) - miner.ActEmptyBlock(t) - miner.ActEmptyBlock(t) // Cancun activates here - miner.ActEmptyBlock(t) - // verify Cancun is active - l1Head = miner.l1Chain.CurrentBlock() - require.True(t, sd.L1Cfg.Config.IsCancun(l1Head.Number, l1Head.Time), "Cancun active") - require.NotNil(t, l1Head.ExcessBlobGas, "Cancun blob gas in header") - - // build L2 chain up to and including L2 blocks referencing Cancun L1 blocks - sequencer.ActL1HeadSignal(t) - sequencer.ActBuildToL1Head(t) - miner.ActL1StartBlock(12)(t) - batcher.ActSubmitAll(t) - miner.ActL1IncludeTx(batcher.batcherAddr)(t) - miner.ActL1EndBlock(t) - - // sync verifier - verifier.ActL1HeadSignal(t) - verifier.ActL2PipelineFull(t) - // verify verifier accepted Cancun L1 inputs - require.Equal(t, l1Head.Hash(), verifier.SyncStatus().SafeL2.L1Origin.Hash, "verifier synced L1 chain that includes Cancun headers") - require.Equal(t, sequencer.SyncStatus().UnsafeL2, verifier.SyncStatus().UnsafeL2, "verifier and sequencer agree") -} - -func TestDencunL1ForkAtGenesis(gt *testing.T) { - t := NewDefaultTesting(gt) - dp := e2eutils.MakeDeployParams(t, defaultRollupTestParams) - offset := hexutil.Uint64(0) - dp.DeployConfig.L1CancunTimeOffset = &offset - sd := e2eutils.Setup(t, dp, defaultAlloc) - log := testlog.Logger(t, log.LevelDebug) - _, _, miner, sequencer, _, verifier, _, batcher := setupReorgTestActors(t, dp, sd, log) - - l1Head := miner.l1Chain.CurrentBlock() - require.True(t, sd.L1Cfg.Config.IsCancun(l1Head.Number, l1Head.Time), "Cancun active at genesis") - require.NotNil(t, l1Head.ExcessBlobGas, "Cancun blob gas in header") - - // start op-nodes - sequencer.ActL2PipelineFull(t) - verifier.ActL2PipelineFull(t) - - // build empty L1 blocks - miner.ActL1SetFeeRecipient(common.Address{'A', 0}) - miner.ActEmptyBlock(t) - miner.ActEmptyBlock(t) - - // verify Cancun is still active - l1Head = miner.l1Chain.CurrentBlock() - require.True(t, sd.L1Cfg.Config.IsCancun(l1Head.Number, l1Head.Time), "Cancun active") - require.NotNil(t, l1Head.ExcessBlobGas, "Cancun blob gas in header") - - // build L2 chain - sequencer.ActL1HeadSignal(t) - sequencer.ActBuildToL1Head(t) - miner.ActL1StartBlock(12)(t) - batcher.ActSubmitAll(t) - miner.ActL1IncludeTx(batcher.batcherAddr)(t) - miner.ActL1EndBlock(t) - - // sync verifier - verifier.ActL1HeadSignal(t) - verifier.ActL2PipelineFull(t) - - // verify verifier accepted Cancun L1 inputs - require.Equal(t, l1Head.Hash(), verifier.SyncStatus().SafeL2.L1Origin.Hash, "verifier synced L1 chain that includes Cancun headers") - require.Equal(t, sequencer.SyncStatus().UnsafeL2, verifier.SyncStatus().UnsafeL2, "verifier and sequencer agree") -} - -func verifyPreEcotoneBlock(gt *testing.T, header *types.Header) { - require.Nil(gt, header.ParentBeaconRoot) - require.Nil(gt, header.ExcessBlobGas) - require.Nil(gt, header.BlobGasUsed) -} - -func verifyEcotoneBlock(gt *testing.T, header *types.Header) { - require.NotNil(gt, header.ParentBeaconRoot) - require.NotNil(gt, header.ExcessBlobGas) - require.Equal(gt, *header.ExcessBlobGas, uint64(0)) - require.NotNil(gt, header.BlobGasUsed) - require.Equal(gt, *header.BlobGasUsed, uint64(0)) -} - -func TestDencunL2ForkAfterGenesis(gt *testing.T) { - t := NewDefaultTesting(gt) - dp := e2eutils.MakeDeployParams(t, defaultRollupTestParams) - - cancunOffset := hexutil.Uint64(0) - dp.DeployConfig.L1CancunTimeOffset = &cancunOffset - // This test wil fork on the second block - offset := hexutil.Uint64(dp.DeployConfig.L2BlockTime * 2) - dp.DeployConfig.L2GenesisCanyonTimeOffset = &offset - dp.DeployConfig.L2GenesisDeltaTimeOffset = &offset - dp.DeployConfig.L2GenesisEcotoneTimeOffset = &offset - - sd := e2eutils.Setup(t, dp, defaultAlloc) - log := testlog.Logger(t, log.LevelDebug) - _, _, _, sequencer, engine, verifier, _, _ := setupReorgTestActors(t, dp, sd, log) - - // start op-nodes - sequencer.ActL2PipelineFull(t) - verifier.ActL2PipelineFull(t) - - // Genesis block is pre-ecotone - verifyPreEcotoneBlock(gt, engine.l2Chain.CurrentBlock()) - - // Block before fork block - sequencer.ActL2StartBlock(t) - sequencer.ActL2EndBlock(t) - verifyPreEcotoneBlock(gt, engine.l2Chain.CurrentBlock()) - - // Fork block is ecotone - sequencer.ActL2StartBlock(t) - sequencer.ActL2EndBlock(t) - verifyEcotoneBlock(gt, engine.l2Chain.CurrentBlock()) - - // Blocks post fork have Ecotone properties - sequencer.ActL2StartBlock(t) - sequencer.ActL2EndBlock(t) - verifyEcotoneBlock(gt, engine.l2Chain.CurrentBlock()) -} - -func TestDencunL2ForkAtGenesis(gt *testing.T) { - t := NewDefaultTesting(gt) - dp := e2eutils.MakeDeployParams(t, defaultRollupTestParams) - offset := hexutil.Uint64(0) - dp.DeployConfig.L2GenesisRegolithTimeOffset = &offset - dp.DeployConfig.L1CancunTimeOffset = &offset - dp.DeployConfig.L2GenesisCanyonTimeOffset = &offset - dp.DeployConfig.L2GenesisDeltaTimeOffset = &offset - dp.DeployConfig.L2GenesisEcotoneTimeOffset = &offset - - sd := e2eutils.Setup(t, dp, defaultAlloc) - log := testlog.Logger(t, log.LevelDebug) - _, _, _, sequencer, engine, verifier, _, _ := setupReorgTestActors(t, dp, sd, log) - - // start op-nodes - sequencer.ActL2PipelineFull(t) - verifier.ActL2PipelineFull(t) - - // Genesis block has ecotone properties - verifyEcotoneBlock(gt, engine.l2Chain.CurrentBlock()) - - // Blocks post fork have Ecotone properties - sequencer.ActL2StartBlock(t) - sequencer.ActL2EndBlock(t) - verifyEcotoneBlock(gt, engine.l2Chain.CurrentBlock()) -} - -func aliceSimpleBlobTx(t Testing, dp *e2eutils.DeployParams) *types.Transaction { - txData := transactions.CreateEmptyBlobTx(true, dp.DeployConfig.L2ChainID) - // Manual signer creation, so we can sign a blob tx on the chain, - // even though we have disabled cancun signer support in Ecotone. - signer := types.NewCancunSigner(txData.ChainID.ToBig()) - tx, err := types.SignNewTx(dp.Secrets.Alice, signer, txData) - require.NoError(t, err, "must sign tx") - return tx -} - -func newEngine(t Testing, sd *e2eutils.SetupData, log log.Logger) *L2Engine { - jwtPath := e2eutils.WriteDefaultJWT(t) - return NewL2Engine(t, log, sd.L2Cfg, sd.RollupCfg.Genesis.L1, jwtPath) -} - -// TestDencunBlobTxRPC tries to send a Blob tx to the L2 engine via RPC, it should not be accepted. -func TestDencunBlobTxRPC(gt *testing.T) { - t := NewDefaultTesting(gt) - dp := e2eutils.MakeDeployParams(t, defaultRollupTestParams) - offset := hexutil.Uint64(0) - dp.DeployConfig.L2GenesisRegolithTimeOffset = &offset - dp.DeployConfig.L2GenesisCanyonTimeOffset = &offset - dp.DeployConfig.L2GenesisDeltaTimeOffset = &offset - dp.DeployConfig.L2GenesisEcotoneTimeOffset = &offset - - sd := e2eutils.Setup(t, dp, defaultAlloc) - log := testlog.Logger(t, log.LevelDebug) - engine := newEngine(t, sd, log) - cl := engine.EthClient() - tx := aliceSimpleBlobTx(t, dp) - err := cl.SendTransaction(context.Background(), tx) - require.ErrorContains(t, err, "transaction type not supported") -} - -// TestDencunBlobTxInTxPool tries to insert a blob tx directly into the tx pool, it should not be accepted. -func TestDencunBlobTxInTxPool(gt *testing.T) { - t := NewDefaultTesting(gt) - dp := e2eutils.MakeDeployParams(t, defaultRollupTestParams) - offset := hexutil.Uint64(0) - dp.DeployConfig.L2GenesisRegolithTimeOffset = &offset - dp.DeployConfig.L2GenesisCanyonTimeOffset = &offset - dp.DeployConfig.L2GenesisDeltaTimeOffset = &offset - dp.DeployConfig.L2GenesisEcotoneTimeOffset = &offset - - sd := e2eutils.Setup(t, dp, defaultAlloc) - log := testlog.Logger(t, log.LevelDebug) - engine := newEngine(t, sd, log) - tx := aliceSimpleBlobTx(t, dp) - errs := engine.eth.TxPool().Add([]*types.Transaction{tx}, true, true) - require.ErrorContains(t, errs[0], "transaction type not supported") -} - -// TestDencunBlobTxInclusion tries to send a Blob tx to the L2 engine, it should not be accepted. -func TestDencunBlobTxInclusion(gt *testing.T) { - t := NewDefaultTesting(gt) - dp := e2eutils.MakeDeployParams(t, defaultRollupTestParams) - offset := hexutil.Uint64(0) - dp.DeployConfig.L2GenesisRegolithTimeOffset = &offset - dp.DeployConfig.L2GenesisCanyonTimeOffset = &offset - dp.DeployConfig.L2GenesisDeltaTimeOffset = &offset - dp.DeployConfig.L2GenesisEcotoneTimeOffset = &offset - - sd := e2eutils.Setup(t, dp, defaultAlloc) - log := testlog.Logger(t, log.LevelDebug) - - _, engine, sequencer := setupSequencerTest(t, sd, log) - sequencer.ActL2PipelineFull(t) - - tx := aliceSimpleBlobTx(t, dp) - - sequencer.ActL2StartBlock(t) - err := engine.engineApi.IncludeTx(tx, dp.Addresses.Alice) - require.ErrorContains(t, err, "invalid L2 block (tx 1): failed to apply transaction to L2 block (tx 1): transaction type not supported") -} diff --git a/op-e2e/actions/derivation/batch_queue_test.go b/op-e2e/actions/derivation/batch_queue_test.go new file mode 100644 index 000000000000..af5b7231b884 --- /dev/null +++ b/op-e2e/actions/derivation/batch_queue_test.go @@ -0,0 +1,102 @@ +package derivation + +import ( + "testing" + + altda "github.com/ethereum-optimism/optimism/op-alt-da" + batcherFlags "github.com/ethereum-optimism/optimism/op-batcher/flags" + "github.com/ethereum-optimism/optimism/op-e2e/actions/helpers" + upgradesHelpers "github.com/ethereum-optimism/optimism/op-e2e/actions/upgrades/helpers" + "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/derive" + "github.com/ethereum-optimism/optimism/op-node/rollup/sync" + "github.com/ethereum-optimism/optimism/op-service/sources" + "github.com/ethereum-optimism/optimism/op-service/testlog" + "github.com/ethereum/go-ethereum/log" + "github.com/stretchr/testify/require" +) + +// TestDeriveChainFromNearL1Genesis tests a corner case where when the derivation pipeline starts, the +// safe head has an L1 origin of block 1. The derivation then starts with pipeline origin of L1 genesis, +// just one block prior to the origin of the safe head. +// This is a regression test, previously the pipeline encountered got stuck in a reset loop with the error: +// buffered L1 chain epoch %s in batch queue does not match safe head origin %s +func TestDeriveChainFromNearL1Genesis(gt *testing.T) { + t := helpers.NewDefaultTesting(gt) + p := &e2eutils.TestParams{ + MaxSequencerDrift: 20, // larger than L1 block time we simulate in this test (12) + SequencerWindowSize: 24, + ChannelTimeout: 20, + L1BlockTime: 12, + } + dp := e2eutils.MakeDeployParams(t, p) + // do not activate Delta hardfork for verifier + upgradesHelpers.ApplyDeltaTimeOffset(dp, nil) + sd := e2eutils.Setup(t, dp, helpers.DefaultAlloc) + logger := testlog.Logger(t, log.LevelInfo) + miner, seqEngine, sequencer := helpers.SetupSequencerTest(t, sd, logger) + + miner.ActEmptyBlock(t) + require.EqualValues(gt, 1, miner.L1Chain().CurrentBlock().Number.Uint64()) + + ref, err := derive.L2BlockToBlockRef(sequencer.RollupCfg, seqEngine.L2Chain().Genesis()) + require.NoError(gt, err) + require.EqualValues(gt, 0, ref.L1Origin.Number) + + sequencer.ActL1HeadSignal(t) + sequencer.ActBuildToL1Head(t) + l2BlockNum := seqEngine.L2Chain().CurrentBlock().Number.Uint64() + ref, err = derive.L2BlockToBlockRef(sequencer.RollupCfg, seqEngine.L2Chain().GetBlockByNumber(l2BlockNum)) + require.NoError(gt, err) + require.EqualValues(gt, 1, ref.L1Origin.Number) + + miner.ActEmptyBlock(t) + + rollupSeqCl := sequencer.RollupClient() + // Force batcher to submit SingularBatches to L1. + batcher := helpers.NewL2Batcher(logger, sd.RollupCfg, &helpers.BatcherCfg{ + MinL1TxSize: 0, + MaxL1TxSize: 128_000, + BatcherKey: dp.Secrets.Batcher, + DataAvailabilityType: batcherFlags.CalldataType, + }, rollupSeqCl, miner.EthClient(), seqEngine.EthClient(), seqEngine.EngineClient(t, sd.RollupCfg)) + + batcher.ActSubmitAll(t) + require.EqualValues(gt, l2BlockNum, batcher.L2BufferedBlock.Number) + + // confirm batch on L1 + miner.ActL1StartBlock(12)(t) + miner.ActL1IncludeTx(dp.Addresses.Batcher)(t) + miner.ActL1EndBlock(t) + bl := miner.L1Chain().CurrentBlock() + logger.Info("Produced L1 block with batch", + "num", miner.L1Chain().CurrentBlock().Number.Uint64(), + "txs", len(miner.L1Chain().GetBlockByHash(bl.Hash()).Transactions())) + + // Process batches so safe head updates + sequencer.ActL1HeadSignal(t) + sequencer.ActL2PipelineFull(t) + require.EqualValues(gt, l2BlockNum, seqEngine.L2Chain().CurrentSafeBlock().Number.Uint64()) + + // Finalize L1 and process so L2 finalized updates + miner.ActL1Safe(t, miner.L1Chain().CurrentBlock().Number.Uint64()) + miner.ActL1Finalize(t, miner.L1Chain().CurrentBlock().Number.Uint64()) + sequencer.ActL1SafeSignal(t) + sequencer.ActL1FinalizedSignal(t) + sequencer.ActL2PipelineFull(t) + require.EqualValues(gt, l2BlockNum, seqEngine.L2Chain().CurrentFinalBlock().Number.Uint64()) + + // Create a new verifier using the existing engine so it already has the safe and finalized heads set. + // This is the same situation as if op-node restarted at this point. + l2Cl, err := sources.NewEngineClient(seqEngine.RPCClient(), logger, nil, sources.EngineClientDefaultConfig(sd.RollupCfg)) + require.NoError(gt, err) + verifier := helpers.NewL2Verifier(t, logger, miner.L1Client(t, sd.RollupCfg), miner.BlobStore(), altda.Disabled, + l2Cl, sequencer.RollupCfg, &sync.Config{}, safedb.Disabled, nil) + verifier.ActL2PipelineFull(t) // Should not get stuck in a reset loop forever + require.EqualValues(gt, l2BlockNum, seqEngine.L2Chain().CurrentSafeBlock().Number.Uint64()) + require.EqualValues(gt, l2BlockNum, seqEngine.L2Chain().CurrentFinalBlock().Number.Uint64()) + syncStatus := verifier.SyncStatus() + require.EqualValues(gt, l2BlockNum, syncStatus.SafeL2.Number) + require.EqualValues(gt, l2BlockNum, syncStatus.FinalizedL2.Number) +} diff --git a/op-e2e/actions/blocktime_test.go b/op-e2e/actions/derivation/blocktime_test.go similarity index 86% rename from op-e2e/actions/blocktime_test.go rename to op-e2e/actions/derivation/blocktime_test.go index 90a38be9a337..ec192d08ad78 100644 --- a/op-e2e/actions/blocktime_test.go +++ b/op-e2e/actions/derivation/blocktime_test.go @@ -1,9 +1,11 @@ -package actions +package derivation import ( "math/big" "testing" + actionsHelpers "github.com/ethereum-optimism/optimism/op-e2e/actions/helpers" + upgradesHelpers "github.com/ethereum-optimism/optimism/op-e2e/actions/upgrades/helpers" "github.com/ethereum-optimism/optimism/op-e2e/e2eutils" "github.com/ethereum-optimism/optimism/op-service/testlog" "github.com/ethereum/go-ethereum/common/hexutil" @@ -44,16 +46,16 @@ func TestBlockTimeBatchType(t *testing.T) { // window. // This is a regression test against the bug fixed in PR #4566 func BatchInLastPossibleBlocks(gt *testing.T, deltaTimeOffset *hexutil.Uint64) { - t := NewDefaultTesting(gt) - dp := e2eutils.MakeDeployParams(t, defaultRollupTestParams) - applyDeltaTimeOffset(dp, deltaTimeOffset) + t := actionsHelpers.NewDefaultTesting(gt) + dp := e2eutils.MakeDeployParams(t, actionsHelpers.DefaultRollupTestParams) + upgradesHelpers.ApplyDeltaTimeOffset(dp, deltaTimeOffset) dp.DeployConfig.SequencerWindowSize = 4 dp.DeployConfig.L2BlockTime = 2 - sd := e2eutils.Setup(t, dp, defaultAlloc) + sd := e2eutils.Setup(t, dp, actionsHelpers.DefaultAlloc) log := testlog.Logger(t, log.LevelDebug) - sd, _, miner, sequencer, sequencerEngine, _, _, batcher := setupReorgTestActors(t, dp, sd, log) + sd, _, miner, sequencer, sequencerEngine, _, _, batcher := actionsHelpers.SetupReorgTestActors(t, dp, sd, log) signer := types.LatestSigner(sd.L2Cfg.Config) cl := sequencerEngine.EthClient() @@ -63,7 +65,7 @@ func BatchInLastPossibleBlocks(gt *testing.T, deltaTimeOffset *hexutil.Uint64) { ChainID: sd.L2Cfg.Config.ChainID, Nonce: aliceNonce, GasTipCap: big.NewInt(2 * params.GWei), - GasFeeCap: new(big.Int).Add(miner.l1Chain.CurrentBlock().BaseFee, big.NewInt(2*params.GWei)), + GasFeeCap: new(big.Int).Add(miner.L1Chain().CurrentBlock().BaseFee, big.NewInt(2*params.GWei)), Gas: params.TxGas, To: &dp.Addresses.Bob, Value: e2eutils.Ether(2), @@ -78,7 +80,7 @@ func BatchInLastPossibleBlocks(gt *testing.T, deltaTimeOffset *hexutil.Uint64) { sequencer.ActL2EndBlock(t) } verifyChainStateOnSequencer := func(l1Number, unsafeHead, unsafeHeadOrigin, safeHead, safeHeadOrigin uint64) { - require.Equal(t, l1Number, miner.l1Chain.CurrentHeader().Number.Uint64()) + require.Equal(t, l1Number, miner.L1Chain().CurrentHeader().Number.Uint64()) require.Equal(t, unsafeHead, sequencer.L2Unsafe().Number) require.Equal(t, unsafeHeadOrigin, sequencer.L2Unsafe().L1Origin.Number) require.Equal(t, safeHead, sequencer.L2Safe().Number) @@ -155,27 +157,32 @@ func BatchInLastPossibleBlocks(gt *testing.T, deltaTimeOffset *hexutil.Uint64) { // At this point it can verify that the batches where properly generated. // Note: It batches submits when possible. func LargeL1Gaps(gt *testing.T, deltaTimeOffset *hexutil.Uint64) { - t := NewDefaultTesting(gt) - dp := e2eutils.MakeDeployParams(t, defaultRollupTestParams) + t := actionsHelpers.NewDefaultTesting(gt) + dp := e2eutils.MakeDeployParams(t, actionsHelpers.DefaultRollupTestParams) dp.DeployConfig.L1BlockTime = 4 dp.DeployConfig.L2BlockTime = 2 dp.DeployConfig.SequencerWindowSize = 4 dp.DeployConfig.MaxSequencerDrift = 32 - applyDeltaTimeOffset(dp, deltaTimeOffset) - sd := e2eutils.Setup(t, dp, defaultAlloc) + dp.DeployConfig.L2GenesisEcotoneTimeOffset = nil + dp.DeployConfig.L2GenesisFjordTimeOffset = nil + // TODO(client-pod#831): The Ecotone (and Fjord) activation blocks don't include user txs, + // so disabling these forks for now. + upgradesHelpers.ApplyDeltaTimeOffset(dp, deltaTimeOffset) + sd := e2eutils.Setup(t, dp, actionsHelpers.DefaultAlloc) log := testlog.Logger(t, log.LevelDebug) - sd, _, miner, sequencer, sequencerEngine, verifier, _, batcher := setupReorgTestActors(t, dp, sd, log) + sd, _, miner, sequencer, sequencerEngine, verifier, _, batcher := actionsHelpers.SetupReorgTestActors(t, dp, sd, log) signer := types.LatestSigner(sd.L2Cfg.Config) cl := sequencerEngine.EthClient() + aliceNonce := uint64(0) // manual nonce, avoid pending-tx nonce management, that causes flakes aliceTx := func() { tx := types.MustSignNewTx(dp.Secrets.Alice, signer, &types.DynamicFeeTx{ ChainID: sd.L2Cfg.Config.ChainID, Nonce: aliceNonce, GasTipCap: big.NewInt(2 * params.GWei), - GasFeeCap: new(big.Int).Add(miner.l1Chain.CurrentBlock().BaseFee, big.NewInt(2*params.GWei)), + GasFeeCap: new(big.Int).Add(miner.L1Chain().CurrentBlock().BaseFee, big.NewInt(2*params.GWei)), Gas: params.TxGas, To: &dp.Addresses.Bob, Value: e2eutils.Ether(2), @@ -191,7 +198,7 @@ func LargeL1Gaps(gt *testing.T, deltaTimeOffset *hexutil.Uint64) { } verifyChainStateOnSequencer := func(l1Number, unsafeHead, unsafeHeadOrigin, safeHead, safeHeadOrigin uint64) { - require.Equal(t, l1Number, miner.l1Chain.CurrentHeader().Number.Uint64()) + require.Equal(t, l1Number, miner.L1Chain().CurrentHeader().Number.Uint64()) require.Equal(t, unsafeHead, sequencer.L2Unsafe().Number) require.Equal(t, unsafeHeadOrigin, sequencer.L2Unsafe().L1Origin.Number) require.Equal(t, safeHead, sequencer.L2Safe().Number) @@ -199,7 +206,7 @@ func LargeL1Gaps(gt *testing.T, deltaTimeOffset *hexutil.Uint64) { } verifyChainStateOnVerifier := func(l1Number, unsafeHead, unsafeHeadOrigin, safeHead, safeHeadOrigin uint64) { - require.Equal(t, l1Number, miner.l1Chain.CurrentHeader().Number.Uint64()) + require.Equal(t, l1Number, miner.L1Chain().CurrentHeader().Number.Uint64()) require.Equal(t, unsafeHead, verifier.L2Unsafe().Number) require.Equal(t, unsafeHeadOrigin, verifier.L2Unsafe().L1Origin.Number) require.Equal(t, safeHead, verifier.L2Safe().Number) @@ -211,8 +218,8 @@ func LargeL1Gaps(gt *testing.T, deltaTimeOffset *hexutil.Uint64) { miner.ActL1EndBlock(t) sequencer.ActL1HeadSignal(t) sequencer.ActL2PipelineFull(t) - makeL2BlockWithAliceTx() - makeL2BlockWithAliceTx() + makeL2BlockWithAliceTx() // 1 + makeL2BlockWithAliceTx() // 2 for i := 0; i < 7; i++ { batcher.ActSubmitAll(t) @@ -223,7 +230,7 @@ func LargeL1Gaps(gt *testing.T, deltaTimeOffset *hexutil.Uint64) { sequencer.ActL2PipelineFull(t) makeL2BlockWithAliceTx() makeL2BlockWithAliceTx() - } + } // 14 + 2 = 16 n, err := cl.NonceAt(t.Ctx(), dp.Addresses.Alice, nil) require.NoError(t, err) diff --git a/op-e2e/actions/derivation/l2_verifier_test.go b/op-e2e/actions/derivation/l2_verifier_test.go new file mode 100644 index 000000000000..2f4fce628d53 --- /dev/null +++ b/op-e2e/actions/derivation/l2_verifier_test.go @@ -0,0 +1,78 @@ +package derivation + +import ( + "testing" + + "github.com/ethereum-optimism/optimism/op-e2e/actions/helpers" + "github.com/ethereum/go-ethereum/common" + "github.com/ethereum/go-ethereum/log" + "github.com/stretchr/testify/require" + + "github.com/ethereum-optimism/optimism/op-e2e/e2eutils" + "github.com/ethereum-optimism/optimism/op-service/testlog" +) + +func TestL2Verifier_SequenceWindow(gt *testing.T) { + t := helpers.NewDefaultTesting(gt) + p := &e2eutils.TestParams{ + MaxSequencerDrift: 10, + SequencerWindowSize: 24, + ChannelTimeout: 10, + L1BlockTime: 15, + } + dp := e2eutils.MakeDeployParams(t, p) + sd := e2eutils.Setup(t, dp, helpers.DefaultAlloc) + log := testlog.Logger(t, log.LevelDebug) + miner, engine, verifier := helpers.SetupVerifierOnlyTest(t, sd, log) + miner.ActL1SetFeeRecipient(common.Address{'A'}) + + // Make two sequence windows worth of empty L1 blocks. After we pass the first sequence window, the L2 chain should get blocks + for miner.L1Chain().CurrentBlock().Number.Uint64() < sd.RollupCfg.SeqWindowSize*2 { + miner.ActL1StartBlock(10)(t) + miner.ActL1EndBlock(t) + + verifier.ActL2PipelineFull(t) + + l1Head := miner.L1Chain().CurrentBlock().Number.Uint64() + expectedL1Origin := uint64(0) + // as soon as we complete the sequence window, we force-adopt the L1 origin + if l1Head >= sd.RollupCfg.SeqWindowSize { + expectedL1Origin = l1Head - sd.RollupCfg.SeqWindowSize + } + require.Equal(t, expectedL1Origin, verifier.SyncStatus().SafeL2.L1Origin.Number, "L1 origin is forced in, given enough L1 blocks pass by") + require.LessOrEqual(t, miner.L1Chain().GetBlockByNumber(expectedL1Origin).Time(), engine.L2Chain().CurrentBlock().Time, "L2 time higher than L1 origin time") + } + tip2N := verifier.SyncStatus() + + // Do a deep L1 reorg as deep as a sequence window, this should affect the safe L2 chain + miner.ActL1RewindDepth(sd.RollupCfg.SeqWindowSize)(t) + + // Without new L1 block, the L1 appears to not be synced, and the node shouldn't reorg + verifier.ActL2PipelineFull(t) + require.Equal(t, tip2N.SafeL2, verifier.SyncStatus().SafeL2, "still the same after verifier work") + + // Make a new empty L1 block with different data than there was before. + miner.ActL1SetFeeRecipient(common.Address{'B'}) + miner.ActL1StartBlock(10)(t) + miner.ActL1EndBlock(t) + reorgL1Block := miner.L1Chain().CurrentBlock() + + // Still no reorg, we need more L1 blocks first, before the reorged L1 block is forced in by sequence window + verifier.ActL2PipelineFull(t) + require.Equal(t, tip2N.SafeL2, verifier.SyncStatus().SafeL2) + + for miner.L1Chain().CurrentBlock().Number.Uint64() < sd.RollupCfg.SeqWindowSize*2 { + miner.ActL1StartBlock(10)(t) + miner.ActL1EndBlock(t) + } + + // workaround: in L1Traversal we only recognize the reorg once we see origin N+1, we don't reorg to shorter L1 chains + miner.ActL1StartBlock(10)(t) + miner.ActL1EndBlock(t) + + // Now it will reorg + verifier.ActL2PipelineFull(t) + + got := miner.L1Chain().GetBlockByHash(miner.L1Chain().GetBlockByHash(verifier.SyncStatus().SafeL2.L1Origin.Hash).Hash()) + require.Equal(t, reorgL1Block.Hash(), got.Hash(), "must have reorged L2 chain to the new L1 chain") +} diff --git a/op-e2e/actions/reorg_test.go b/op-e2e/actions/derivation/reorg_test.go similarity index 87% rename from op-e2e/actions/reorg_test.go rename to op-e2e/actions/derivation/reorg_test.go index 1b4edbaf9cfe..6551b314c1ea 100644 --- a/op-e2e/actions/reorg_test.go +++ b/op-e2e/actions/derivation/reorg_test.go @@ -1,4 +1,4 @@ -package actions +package derivation import ( "math/big" @@ -6,6 +6,8 @@ import ( "path" "testing" + actionsHelpers "github.com/ethereum-optimism/optimism/op-e2e/actions/helpers" + upgradesHelpers "github.com/ethereum-optimism/optimism/op-e2e/actions/upgrades/helpers" "github.com/ethereum/go-ethereum/common" "github.com/ethereum/go-ethereum/common/hexutil" "github.com/ethereum/go-ethereum/core/types" @@ -14,36 +16,14 @@ import ( "github.com/ethereum/go-ethereum/node" "github.com/stretchr/testify/require" + altda "github.com/ethereum-optimism/optimism/op-alt-da" "github.com/ethereum-optimism/optimism/op-e2e/e2eutils" - "github.com/ethereum-optimism/optimism/op-node/rollup/sync" - plasma "github.com/ethereum-optimism/optimism/op-plasma" "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" ) -func setupReorgTest(t Testing, config *e2eutils.TestParams, deltaTimeOffset *hexutil.Uint64) (*e2eutils.SetupData, *e2eutils.DeployParams, *L1Miner, *L2Sequencer, *L2Engine, *L2Verifier, *L2Engine, *L2Batcher) { - dp := e2eutils.MakeDeployParams(t, config) - dp.DeployConfig.L2GenesisDeltaTimeOffset = deltaTimeOffset - - sd := e2eutils.Setup(t, dp, defaultAlloc) - log := testlog.Logger(t, log.LevelDebug) - - return setupReorgTestActors(t, dp, sd, log) -} - -func setupReorgTestActors(t Testing, dp *e2eutils.DeployParams, sd *e2eutils.SetupData, log log.Logger) (*e2eutils.SetupData, *e2eutils.DeployParams, *L1Miner, *L2Sequencer, *L2Engine, *L2Verifier, *L2Engine, *L2Batcher) { - miner, seqEngine, sequencer := setupSequencerTest(t, sd, log) - miner.ActL1SetFeeRecipient(common.Address{'A'}) - sequencer.ActL2PipelineFull(t) - verifEngine, verifier := setupVerifier(t, sd, log, miner.L1Client(t, sd.RollupCfg), miner.BlobStore(), &sync.Config{}) - rollupSeqCl := sequencer.RollupClient() - batcher := NewL2Batcher(log, sd.RollupCfg, DefaultBatcherCfg(dp), - rollupSeqCl, miner.EthClient(), seqEngine.EthClient(), seqEngine.EngineClient(t, sd.RollupCfg)) - return sd, dp, miner, sequencer, seqEngine, verifier, verifEngine, batcher -} - // TestReorgBatchType run each reorg-related test case in singular batch mode and span batch mode. func TestReorgBatchType(t *testing.T) { tests := []struct { @@ -74,8 +54,8 @@ func TestReorgBatchType(t *testing.T) { } func ReorgOrphanBlock(gt *testing.T, deltaTimeOffset *hexutil.Uint64) { - t := NewDefaultTesting(gt) - sd, _, miner, sequencer, _, verifier, verifierEng, batcher := setupReorgTest(t, defaultRollupTestParams, deltaTimeOffset) + t := actionsHelpers.NewDefaultTesting(gt) + sd, _, miner, sequencer, _, verifier, verifierEng, batcher := actionsHelpers.SetupReorgTest(t, actionsHelpers.DefaultRollupTestParams, deltaTimeOffset) verifEngClient := verifierEng.EngineClient(t, sd.RollupCfg) sequencer.ActL2PipelineFull(t) @@ -94,7 +74,7 @@ func ReorgOrphanBlock(gt *testing.T, deltaTimeOffset *hexutil.Uint64) { // new L1 block with L2 batch miner.ActL1StartBlock(12)(t) miner.ActL1IncludeTx(sd.RollupCfg.Genesis.SystemConfig.BatcherAddr)(t) - batchTx := miner.l1Transactions[0] + batchTx := miner.L1Transactions[0] miner.ActL1EndBlock(t) // verifier picks up the L2 chain that was submitted @@ -123,7 +103,7 @@ func ReorgOrphanBlock(gt *testing.T, deltaTimeOffset *hexutil.Uint64) { miner.ActL1SetFeeRecipient(common.Address{'C'}) // note: the geth tx pool reorgLoop is too slow (responds to chain head events, but async), // and there's no way to manually trigger runReorg, so we re-insert it ourselves. - require.NoError(t, miner.eth.TxPool().Add([]*types.Transaction{batchTx}, true, true)[0]) + require.NoError(t, miner.Eth.TxPool().Add([]*types.Transaction{batchTx}, true, true)[0]) // need to re-insert previously included tx into the block miner.ActL1IncludeTx(sd.RollupCfg.Genesis.SystemConfig.BatcherAddr)(t) miner.ActL1EndBlock(t) @@ -142,18 +122,11 @@ func ReorgOrphanBlock(gt *testing.T, deltaTimeOffset *hexutil.Uint64) { } func ReorgFlipFlop(gt *testing.T, deltaTimeOffset *hexutil.Uint64) { - t := NewDefaultTesting(gt) - sd, _, miner, sequencer, _, verifier, verifierEng, batcher := setupReorgTest(t, defaultRollupTestParams, deltaTimeOffset) + t := actionsHelpers.NewDefaultTesting(gt) + sd, _, miner, sequencer, _, verifier, verifierEng, batcher := actionsHelpers.SetupReorgTest(t, actionsHelpers.DefaultRollupTestParams, deltaTimeOffset) minerCl := miner.L1Client(t, sd.RollupCfg) verifEngClient := verifierEng.EngineClient(t, sd.RollupCfg) checkVerifEngine := func() { - // TODO: geth preserves L2 chain with origin A1 after flip-flopping to B? - //ref, err := verifEngClient.L2BlockRefByLabel(t.Ctx(), eth.Unsafe) - //require.NoError(t, err) - //t.Logf("l2 unsafe head %s with origin %s", ref, ref.L1Origin) - //require.NotEqual(t, verifier.L2Unsafe().Hash, ref.ParentHash, "TODO off by one, engine syncs A0 after reorging back from B, while rollup node only inserts up to A0 (excl.)") - //require.Equal(t, verifier.L2Unsafe(), ref, "verifier safe head of engine matches rollup client") - ref, err := verifEngClient.L2BlockRefByLabel(t.Ctx(), eth.Safe) require.NoError(t, err) require.Equal(t, verifier.L2Safe(), ref, "verifier safe head of engine matches rollup client") @@ -179,7 +152,7 @@ func ReorgFlipFlop(gt *testing.T, deltaTimeOffset *hexutil.Uint64) { miner.ActL1SetFeeRecipient(common.Address{'A', 1}) miner.ActL1StartBlock(12)(t) miner.ActL1IncludeTx(sd.RollupCfg.Genesis.SystemConfig.BatcherAddr)(t) - batchTxA := miner.l1Transactions[0] + batchTxA := miner.L1Transactions[0] miner.ActL1EndBlock(t) // verifier picks up the L2 chain that was submitted @@ -202,7 +175,7 @@ func ReorgFlipFlop(gt *testing.T, deltaTimeOffset *hexutil.Uint64) { // re-include the batch tx that submitted L2 chain data that pointed to A0, in the new block B1 miner.ActL1SetFeeRecipient(common.Address{'B', 1}) miner.ActL1StartBlock(12)(t) - require.NoError(t, miner.eth.TxPool().Add([]*types.Transaction{batchTxA}, true, true)[0]) + require.NoError(t, miner.Eth.TxPool().Add([]*types.Transaction{batchTxA}, true, true)[0]) miner.ActL1IncludeTx(sd.RollupCfg.Genesis.SystemConfig.BatcherAddr)(t) miner.ActL1EndBlock(t) @@ -226,7 +199,7 @@ func ReorgFlipFlop(gt *testing.T, deltaTimeOffset *hexutil.Uint64) { // after delta hard fork require.Zero(t, verifier.L2Safe().Number, "safe head is at genesis block because span batch referenced reorged L1 chain is not accepted") require.Equal(t, verifier.L2Unsafe().ID(), sequencer.L2Unsafe().ParentID(), "head is at the highest unsafe block that references canonical L1 chain(genesis block)") - batcher.l2BufferedBlock = eth.L2BlockRef{} // must reset batcher to resubmit blocks included in the last batch + batcher.L2BufferedBlock = eth.L2BlockRef{} // must reset batcher to resubmit blocks included in the last batch } checkVerifEngine() @@ -267,7 +240,7 @@ func ReorgFlipFlop(gt *testing.T, deltaTimeOffset *hexutil.Uint64) { miner.ActL1SetFeeRecipient(common.Address{'A', 2}) miner.ActL1StartBlock(12)(t) - require.NoError(t, miner.eth.TxPool().Add([]*types.Transaction{batchTxA}, true, true)[0]) // replay chain A batches, but now in A2 instead of A1 + require.NoError(t, miner.Eth.TxPool().Add([]*types.Transaction{batchTxA}, true, true)[0]) // replay chain A batches, but now in A2 instead of A1 miner.ActL1IncludeTx(sd.RollupCfg.Genesis.SystemConfig.BatcherAddr)(t) miner.ActL1EndBlock(t) @@ -363,10 +336,10 @@ func ReorgFlipFlop(gt *testing.T, deltaTimeOffset *hexutil.Uint64) { // - Unsafe head is 62 // - Safe head is 42 func DeepReorg(gt *testing.T, deltaTimeOffset *hexutil.Uint64) { - t := NewDefaultTesting(gt) + t := actionsHelpers.NewDefaultTesting(gt) // Create actor and verification engine client - sd, dp, miner, sequencer, seqEngine, verifier, verifierEng, batcher := setupReorgTest(t, &e2eutils.TestParams{ + sd, dp, miner, sequencer, seqEngine, verifier, verifierEng, batcher := actionsHelpers.SetupReorgTest(t, &e2eutils.TestParams{ MaxSequencerDrift: 40, SequencerWindowSize: 20, ChannelTimeout: 120, @@ -384,13 +357,13 @@ func DeepReorg(gt *testing.T, deltaTimeOffset *hexutil.Uint64) { // Set up alice log := testlog.Logger(t, log.LevelDebug) addresses := e2eutils.CollectAddresses(sd, dp) - l2UserEnv := &BasicUserEnv[*L2Bindings]{ + l2UserEnv := &actionsHelpers.BasicUserEnv[*actionsHelpers.L2Bindings]{ EthCl: l2Client, Signer: types.LatestSigner(sd.L2Cfg.Config), AddressCorpora: addresses, - Bindings: NewL2Bindings(t, l2Client, seqEngine.GethClient()), + Bindings: actionsHelpers.NewL2Bindings(t, l2Client, seqEngine.GethClient()), } - alice := NewCrossLayerUser(log, dp.Secrets.Alice, rand.New(rand.NewSource(0xa57b))) + alice := actionsHelpers.NewCrossLayerUser(log, dp.Secrets.Alice, rand.New(rand.NewSource(0xa57b))) alice.L2.SetUserEnv(l2UserEnv) // Run one iteration of the L2 derivation pipeline @@ -404,7 +377,7 @@ func DeepReorg(gt *testing.T, deltaTimeOffset *hexutil.Uint64) { // Create a var to store the ref for the second to last block of the second sequencing window var blockA39 eth.L1BlockRef - var aliceL2TxBlock types.Block + var aliceL2TxBlock *types.Block // Mine enough empty blocks on L1 to reach two sequence windows. for i := uint64(0); i < sd.RollupCfg.SeqWindowSize*3; i++ { // At block #50, send a batch to L1 containing all L2 blocks built up to this point. @@ -455,7 +428,7 @@ func DeepReorg(gt *testing.T, deltaTimeOffset *hexutil.Uint64) { b0, err := l2Client.BlockByNumber(t.Ctx(), big.NewInt(int64(sequencer.L2Unsafe().Number))) require.NoError(t, err, "failed to fetch unsafe head of L2 after submitting alice's transaction") - aliceL2TxBlock = *b0 + aliceL2TxBlock = b0 } // Ask sequencer to handle new L1 head and build L2 blocks up to the L1 head @@ -579,6 +552,8 @@ func DeepReorg(gt *testing.T, deltaTimeOffset *hexutil.Uint64) { require.Equal(t, verifier.L2Safe(), verifier.L2Unsafe(), "L2 safe and unsafe head should be equal") checkVerifEngine() + require.NotNil(gt, aliceL2TxBlock) + // Ensure that the parent of the L2 block containing Alice's transaction still exists b0, err := l2Client.BlockByHash(t.Ctx(), aliceL2TxBlock.ParentHash()) require.NoError(t, err, "Parent of the L2 block containing Alice's transaction should still exist on L2") @@ -598,29 +573,29 @@ type rpcWrapper struct { // RestartOpGeth tests that the sequencer can restart its execution engine without rollup-node restart, // including recovering the finalized/safe state of L2 chain without reorging. func RestartOpGeth(gt *testing.T, deltaTimeOffset *hexutil.Uint64) { - t := NewDefaultTesting(gt) + t := actionsHelpers.NewDefaultTesting(gt) dbPath := path.Join(t.TempDir(), "testdb") dbOption := func(_ *ethconfig.Config, nodeCfg *node.Config) error { nodeCfg.DataDir = dbPath return nil } - dp := e2eutils.MakeDeployParams(t, defaultRollupTestParams) - dp.DeployConfig.L2GenesisDeltaTimeOffset = deltaTimeOffset - sd := e2eutils.Setup(t, dp, defaultAlloc) + dp := e2eutils.MakeDeployParams(t, actionsHelpers.DefaultRollupTestParams) + upgradesHelpers.ApplyDeltaTimeOffset(dp, deltaTimeOffset) + sd := e2eutils.Setup(t, dp, actionsHelpers.DefaultAlloc) log := testlog.Logger(t, log.LevelDebug) jwtPath := e2eutils.WriteDefaultJWT(t) // L1 - miner := NewL1Miner(t, log, sd.L1Cfg) + miner := actionsHelpers.NewL1Miner(t, log, sd.L1Cfg) l1F, err := sources.NewL1Client(miner.RPCClient(), log, nil, sources.L1ClientDefaultConfig(sd.RollupCfg, false, sources.RPCKindStandard)) require.NoError(t, err) // Sequencer - seqEng := NewL2Engine(t, log, sd.L2Cfg, sd.RollupCfg.Genesis.L1, jwtPath, dbOption) + seqEng := actionsHelpers.NewL2Engine(t, log, sd.L2Cfg, sd.RollupCfg.Genesis.L1, jwtPath, dbOption) engRpc := &rpcWrapper{seqEng.RPCClient()} l2Cl, err := sources.NewEngineClient(engRpc, log, nil, sources.EngineClientDefaultConfig(sd.RollupCfg)) require.NoError(t, err) - sequencer := NewL2Sequencer(t, log, l1F, miner.BlobStore(), plasma.Disabled, l2Cl, sd.RollupCfg, 0) + sequencer := actionsHelpers.NewL2Sequencer(t, log, l1F, miner.BlobStore(), altda.Disabled, l2Cl, sd.RollupCfg, 0, nil) - batcher := NewL2Batcher(log, sd.RollupCfg, DefaultBatcherCfg(dp), + batcher := actionsHelpers.NewL2Batcher(log, sd.RollupCfg, actionsHelpers.DefaultBatcherCfg(dp), sequencer.RollupClient(), miner.EthClient(), seqEng.EthClient(), seqEng.EngineClient(t, sd.RollupCfg)) // start @@ -669,7 +644,7 @@ func RestartOpGeth(gt *testing.T, deltaTimeOffset *hexutil.Uint64) { // close the sequencer engine require.NoError(t, seqEng.Close()) // and start a new one with same db path - seqEngNew := NewL2Engine(t, log, sd.L2Cfg, sd.RollupCfg.Genesis.L1, jwtPath, dbOption) + seqEngNew := actionsHelpers.NewL2Engine(t, log, sd.L2Cfg, sd.RollupCfg.Genesis.L1, jwtPath, dbOption) // swap in the new rpc. This is as close as we can get to reconnecting to a new in-memory rpc connection engRpc.RPC = seqEngNew.RPCClient() @@ -691,35 +666,35 @@ func RestartOpGeth(gt *testing.T, deltaTimeOffset *hexutil.Uint64) { // L2 block (compared to something already secured by the first sequencer): // the alt block is not synced by the verifier, in unsafe and safe sync modes. func ConflictingL2Blocks(gt *testing.T, deltaTimeOffset *hexutil.Uint64) { - t := NewDefaultTesting(gt) - dp := e2eutils.MakeDeployParams(t, defaultRollupTestParams) - dp.DeployConfig.L2GenesisDeltaTimeOffset = deltaTimeOffset - sd := e2eutils.Setup(t, dp, defaultAlloc) + t := actionsHelpers.NewDefaultTesting(gt) + dp := e2eutils.MakeDeployParams(t, actionsHelpers.DefaultRollupTestParams) + upgradesHelpers.ApplyDeltaTimeOffset(dp, deltaTimeOffset) + sd := e2eutils.Setup(t, dp, actionsHelpers.DefaultAlloc) log := testlog.Logger(t, log.LevelDebug) - sd, _, miner, sequencer, seqEng, verifier, _, batcher := setupReorgTestActors(t, dp, sd, log) + sd, _, miner, sequencer, seqEng, verifier, _, batcher := actionsHelpers.SetupReorgTestActors(t, dp, sd, log) // Extra setup: a full alternative sequencer, sequencer engine, and batcher jwtPath := e2eutils.WriteDefaultJWT(t) - altSeqEng := NewL2Engine(t, log, sd.L2Cfg, sd.RollupCfg.Genesis.L1, jwtPath) + altSeqEng := actionsHelpers.NewL2Engine(t, log, sd.L2Cfg, sd.RollupCfg.Genesis.L1, jwtPath) altSeqEngCl, err := sources.NewEngineClient(altSeqEng.RPCClient(), log, nil, sources.EngineClientDefaultConfig(sd.RollupCfg)) require.NoError(t, err) l1F, err := sources.NewL1Client(miner.RPCClient(), log, nil, sources.L1ClientDefaultConfig(sd.RollupCfg, false, sources.RPCKindStandard)) require.NoError(t, err) - altSequencer := NewL2Sequencer(t, log, l1F, miner.BlobStore(), plasma.Disabled, altSeqEngCl, sd.RollupCfg, 0) - altBatcher := NewL2Batcher(log, sd.RollupCfg, DefaultBatcherCfg(dp), + altSequencer := actionsHelpers.NewL2Sequencer(t, log, l1F, miner.BlobStore(), altda.Disabled, altSeqEngCl, sd.RollupCfg, 0, nil) + altBatcher := actionsHelpers.NewL2Batcher(log, sd.RollupCfg, actionsHelpers.DefaultBatcherCfg(dp), altSequencer.RollupClient(), miner.EthClient(), altSeqEng.EthClient(), altSeqEng.EngineClient(t, sd.RollupCfg)) // And set up user Alice, using the alternative sequencer endpoint l2Cl := altSeqEng.EthClient() addresses := e2eutils.CollectAddresses(sd, dp) - l2UserEnv := &BasicUserEnv[*L2Bindings]{ + l2UserEnv := &actionsHelpers.BasicUserEnv[*actionsHelpers.L2Bindings]{ EthCl: l2Cl, Signer: types.LatestSigner(sd.L2Cfg.Config), AddressCorpora: addresses, - Bindings: NewL2Bindings(t, l2Cl, altSeqEng.GethClient()), + Bindings: actionsHelpers.NewL2Bindings(t, l2Cl, altSeqEng.GethClient()), } - alice := NewCrossLayerUser(log, dp.Secrets.Alice, rand.New(rand.NewSource(1234))) + alice := actionsHelpers.NewCrossLayerUser(log, dp.Secrets.Alice, rand.New(rand.NewSource(1234))) alice.L2.SetUserEnv(l2UserEnv) sequencer.ActL2PipelineFull(t) @@ -761,13 +736,13 @@ func ConflictingL2Blocks(gt *testing.T, deltaTimeOffset *hexutil.Uint64) { altSeqEng.ActL2IncludeTx(alice.Address())(t) altSequencer.ActL2EndBlock(t) - conflictBlock := seqEng.l2Chain.GetBlockByNumber(altSequencer.L2Unsafe().Number) + conflictBlock := seqEng.L2Chain().GetBlockByNumber(altSequencer.L2Unsafe().Number) require.NotEqual(t, conflictBlock.Hash(), altSequencer.L2Unsafe().Hash, "alt sequencer has built a conflicting block") // give the unsafe block to the verifier, and see if it reorgs because of any unsafe inputs head, err := altSeqEngCl.PayloadByLabel(t.Ctx(), eth.Unsafe) require.NoError(t, err) - verifier.ActL2UnsafeGossipReceive(head) + verifier.ActL2UnsafeGossipReceive(head)(t) // make sure verifier has processed everything verifier.ActL2PipelineFull(t) @@ -781,7 +756,7 @@ func ConflictingL2Blocks(gt *testing.T, deltaTimeOffset *hexutil.Uint64) { miner.ActL1StartBlock(12)(t) miner.ActL1IncludeTx(sd.RollupCfg.Genesis.SystemConfig.BatcherAddr)(t) miner.ActL1EndBlock(t) - l1Number := miner.l1Chain.CurrentHeader().Number.Uint64() + l1Number := miner.L1Chain().CurrentHeader().Number.Uint64() // show latest L1 block with new batch data to verifier, and make it sync. verifier.ActL1HeadSignal(t) @@ -798,24 +773,24 @@ func ConflictingL2Blocks(gt *testing.T, deltaTimeOffset *hexutil.Uint64) { } func SyncAfterReorg(gt *testing.T, deltaTimeOffset *hexutil.Uint64) { - t := NewDefaultTesting(gt) + t := actionsHelpers.NewDefaultTesting(gt) testingParams := e2eutils.TestParams{ MaxSequencerDrift: 60, SequencerWindowSize: 4, ChannelTimeout: 2, L1BlockTime: 12, } - sd, dp, miner, sequencer, seqEngine, verifier, _, batcher := setupReorgTest(t, &testingParams, deltaTimeOffset) + sd, dp, miner, sequencer, seqEngine, verifier, _, batcher := actionsHelpers.SetupReorgTest(t, &testingParams, deltaTimeOffset) l2Client := seqEngine.EthClient() log := testlog.Logger(t, log.LevelDebug) addresses := e2eutils.CollectAddresses(sd, dp) - l2UserEnv := &BasicUserEnv[*L2Bindings]{ + l2UserEnv := &actionsHelpers.BasicUserEnv[*actionsHelpers.L2Bindings]{ EthCl: l2Client, Signer: types.LatestSigner(sd.L2Cfg.Config), AddressCorpora: addresses, - Bindings: NewL2Bindings(t, l2Client, seqEngine.GethClient()), + Bindings: actionsHelpers.NewL2Bindings(t, l2Client, seqEngine.GethClient()), } - alice := NewCrossLayerUser(log, dp.Secrets.Alice, rand.New(rand.NewSource(0xa57b))) + alice := actionsHelpers.NewCrossLayerUser(log, dp.Secrets.Alice, rand.New(rand.NewSource(0xa57b))) alice.L2.SetUserEnv(l2UserEnv) sequencer.ActL2PipelineFull(t) @@ -825,11 +800,11 @@ func SyncAfterReorg(gt *testing.T, deltaTimeOffset *hexutil.Uint64) { miner.ActL1SetFeeRecipient(common.Address{'A', 0}) miner.ActEmptyBlock(t) sequencer.ActL1HeadSignal(t) - for sequencer.engine.UnsafeL2Head().L1Origin.Number < sequencer.l1State.L1Head().Number { + for sequencer.L2Unsafe().L1Origin.Number < sequencer.SyncStatus().HeadL1.Number { // build L2 blocks until the L1 origin is the current L1 head(A0) sequencer.ActL2PipelineFull(t) sequencer.ActL2StartBlock(t) - if sequencer.engine.UnsafeL2Head().Number == 11 { + if sequencer.L2Unsafe().Number == 11 { // include a user tx at L2 block #12 to make a state transition alice.L2.ActResetTxOpts(t) alice.L2.ActSetTxToAddr(&dp.Addresses.Bob)(t) diff --git a/op-e2e/actions/system_config_test.go b/op-e2e/actions/derivation/system_config_test.go similarity index 85% rename from op-e2e/actions/system_config_test.go rename to op-e2e/actions/derivation/system_config_test.go index df634a2ef678..bb62001de4a2 100644 --- a/op-e2e/actions/system_config_test.go +++ b/op-e2e/actions/derivation/system_config_test.go @@ -1,10 +1,12 @@ -package actions +package derivation import ( "math/big" "math/rand" "testing" + actionsHelpers "github.com/ethereum-optimism/optimism/op-e2e/actions/helpers" + upgradesHelpers "github.com/ethereum-optimism/optimism/op-e2e/actions/upgrades/helpers" "github.com/ethereum/go-ethereum/accounts/abi/bind" "github.com/ethereum/go-ethereum/common" "github.com/ethereum/go-ethereum/common/hexutil" @@ -49,27 +51,27 @@ func TestSystemConfigBatchType(t *testing.T) { // BatcherKeyRotation tests that batcher A can operate, then be replaced with batcher B, then ignore old batcher A, // and that the change to batcher B is reverted properly upon reorg of L1. func BatcherKeyRotation(gt *testing.T, deltaTimeOffset *hexutil.Uint64) { - t := NewDefaultTesting(gt) + t := actionsHelpers.NewDefaultTesting(gt) - dp := e2eutils.MakeDeployParams(t, defaultRollupTestParams) + dp := e2eutils.MakeDeployParams(t, actionsHelpers.DefaultRollupTestParams) dp.DeployConfig.L2BlockTime = 2 - dp.DeployConfig.L2GenesisDeltaTimeOffset = deltaTimeOffset - sd := e2eutils.Setup(t, dp, defaultAlloc) + upgradesHelpers.ApplyDeltaTimeOffset(dp, deltaTimeOffset) + sd := e2eutils.Setup(t, dp, actionsHelpers.DefaultAlloc) log := testlog.Logger(t, log.LevelDebug) - miner, seqEngine, sequencer := setupSequencerTest(t, sd, log) + miner, seqEngine, sequencer := actionsHelpers.SetupSequencerTest(t, sd, log) miner.ActL1SetFeeRecipient(common.Address{'A'}) sequencer.ActL2PipelineFull(t) - _, verifier := setupVerifier(t, sd, log, miner.L1Client(t, sd.RollupCfg), miner.BlobStore(), &sync.Config{}) + _, verifier := actionsHelpers.SetupVerifier(t, sd, log, miner.L1Client(t, sd.RollupCfg), miner.BlobStore(), &sync.Config{}) rollupSeqCl := sequencer.RollupClient() // the default batcher - batcherA := NewL2Batcher(log, sd.RollupCfg, DefaultBatcherCfg(dp), + batcherA := actionsHelpers.NewL2Batcher(log, sd.RollupCfg, actionsHelpers.DefaultBatcherCfg(dp), rollupSeqCl, miner.EthClient(), seqEngine.EthClient(), seqEngine.EngineClient(t, sd.RollupCfg)) // a batcher with a new key - altCfg := *DefaultBatcherCfg(dp) + altCfg := *actionsHelpers.DefaultBatcherCfg(dp) altCfg.BatcherKey = dp.Secrets.Bob - batcherB := NewL2Batcher(log, sd.RollupCfg, &altCfg, + batcherB := actionsHelpers.NewL2Batcher(log, sd.RollupCfg, &altCfg, rollupSeqCl, miner.EthClient(), seqEngine.EthClient(), seqEngine.EngineClient(t, sd.RollupCfg)) sequencer.ActL2PipelineFull(t) @@ -114,7 +116,7 @@ func BatcherKeyRotation(gt *testing.T, deltaTimeOffset *hexutil.Uint64) { receipt, err := miner.EthClient().TransactionReceipt(t.Ctx(), tx.Hash()) require.NoError(t, err) - cfgChangeL1BlockNum := miner.l1Chain.CurrentBlock().Number.Uint64() + cfgChangeL1BlockNum := miner.L1Chain().CurrentBlock().Number.Uint64() require.Equal(t, cfgChangeL1BlockNum, receipt.BlockNumber.Uint64()) // sequence L2 blocks, and submit with new batcher @@ -225,17 +227,25 @@ func BatcherKeyRotation(gt *testing.T, deltaTimeOffset *hexutil.Uint64) { // GPOParamsChange tests that the GPO params can be updated to adjust fees of L2 transactions, // and that the L1 data fees to the L2 transaction are applied correctly before, during and after the GPO update in L2. func GPOParamsChange(gt *testing.T, deltaTimeOffset *hexutil.Uint64) { - t := NewDefaultTesting(gt) - dp := e2eutils.MakeDeployParams(t, defaultRollupTestParams) - dp.DeployConfig.L2GenesisDeltaTimeOffset = deltaTimeOffset - sd := e2eutils.Setup(t, dp, defaultAlloc) + t := actionsHelpers.NewDefaultTesting(gt) + dp := e2eutils.MakeDeployParams(t, actionsHelpers.DefaultRollupTestParams) + upgradesHelpers.ApplyDeltaTimeOffset(dp, deltaTimeOffset) + + // activating Delta only, not Ecotone and further: + // the GPO change assertions here all apply only for the Delta transition. + // Separate tests cover Ecotone GPO changes. + dp.DeployConfig.L2GenesisEcotoneTimeOffset = nil + dp.DeployConfig.L2GenesisFjordTimeOffset = nil + dp.DeployConfig.L2GenesisGraniteTimeOffset = nil + + sd := e2eutils.Setup(t, dp, actionsHelpers.DefaultAlloc) log := testlog.Logger(t, log.LevelDebug) - miner, seqEngine, sequencer := setupSequencerTest(t, sd, log) - batcher := NewL2Batcher(log, sd.RollupCfg, DefaultBatcherCfg(dp), + miner, seqEngine, sequencer := actionsHelpers.SetupSequencerTest(t, sd, log) + batcher := actionsHelpers.NewL2Batcher(log, sd.RollupCfg, actionsHelpers.DefaultBatcherCfg(dp), sequencer.RollupClient(), miner.EthClient(), seqEngine.EthClient(), seqEngine.EngineClient(t, sd.RollupCfg)) - alice := NewBasicUser[any](log, dp.Secrets.Alice, rand.New(rand.NewSource(1234))) - alice.SetUserEnv(&BasicUserEnv[any]{ + alice := actionsHelpers.NewBasicUser[any](log, dp.Secrets.Alice, rand.New(rand.NewSource(1234))) + alice.SetUserEnv(&actionsHelpers.BasicUserEnv[any]{ EthCl: seqEngine.EthClient(), Signer: types.LatestSigner(sd.L2Cfg.Config), }) @@ -246,7 +256,7 @@ func GPOParamsChange(gt *testing.T, deltaTimeOffset *hexutil.Uint64) { miner.ActEmptyBlock(t) sequencer.ActL1HeadSignal(t) sequencer.ActBuildToL1Head(t) - basefee := miner.l1Chain.CurrentBlock().BaseFee + basefee := miner.L1Chain().CurrentBlock().BaseFee // alice makes a L2 tx, sequencer includes it alice.ActResetTxOpts(t) @@ -291,7 +301,7 @@ func GPOParamsChange(gt *testing.T, deltaTimeOffset *hexutil.Uint64) { miner.ActL1StartBlock(12)(t) miner.ActL1IncludeTx(dp.Addresses.SysCfgOwner)(t) miner.ActL1EndBlock(t) - basefeeGPOUpdate := miner.l1Chain.CurrentBlock().BaseFee + basefeeGPOUpdate := miner.L1Chain().CurrentBlock().BaseFee // build empty L2 chain, up to but excluding the L2 block with the L1 origin that processes the GPO change sequencer.ActL1HeadSignal(t) @@ -328,7 +338,7 @@ func GPOParamsChange(gt *testing.T, deltaTimeOffset *hexutil.Uint64) { // build more L2 blocks, with new L1 origin miner.ActEmptyBlock(t) - basefee = miner.l1Chain.CurrentBlock().BaseFee + basefee = miner.L1Chain().CurrentBlock().BaseFee sequencer.ActL1HeadSignal(t) sequencer.ActBuildToL1Head(t) // and Alice makes a tx again @@ -352,13 +362,13 @@ func GPOParamsChange(gt *testing.T, deltaTimeOffset *hexutil.Uint64) { // and that the L2 changes the gas limit instantly at the exact block that adopts the L1 origin with // the gas limit change event. And checks if a verifier node can reproduce the same gas limit change. func GasLimitChange(gt *testing.T, deltaTimeOffset *hexutil.Uint64) { - t := NewDefaultTesting(gt) - dp := e2eutils.MakeDeployParams(t, defaultRollupTestParams) - dp.DeployConfig.L2GenesisDeltaTimeOffset = deltaTimeOffset - sd := e2eutils.Setup(t, dp, defaultAlloc) + t := actionsHelpers.NewDefaultTesting(gt) + dp := e2eutils.MakeDeployParams(t, actionsHelpers.DefaultRollupTestParams) + upgradesHelpers.ApplyDeltaTimeOffset(dp, deltaTimeOffset) + sd := e2eutils.Setup(t, dp, actionsHelpers.DefaultAlloc) log := testlog.Logger(t, log.LevelDebug) - miner, seqEngine, sequencer := setupSequencerTest(t, sd, log) - batcher := NewL2Batcher(log, sd.RollupCfg, DefaultBatcherCfg(dp), + miner, seqEngine, sequencer := actionsHelpers.SetupSequencerTest(t, sd, log) + batcher := actionsHelpers.NewL2Batcher(log, sd.RollupCfg, actionsHelpers.DefaultBatcherCfg(dp), sequencer.RollupClient(), miner.EthClient(), seqEngine.EthClient(), seqEngine.EngineClient(t, sd.RollupCfg)) sequencer.ActL2PipelineFull(t) @@ -366,7 +376,7 @@ func GasLimitChange(gt *testing.T, deltaTimeOffset *hexutil.Uint64) { sequencer.ActL1HeadSignal(t) sequencer.ActBuildToL1Head(t) - oldGasLimit := seqEngine.l2Chain.CurrentBlock().GasLimit + oldGasLimit := seqEngine.L2Chain().CurrentBlock().GasLimit require.Equal(t, oldGasLimit, uint64(dp.DeployConfig.L2GenesisBlockGasLimit)) // change gas limit on L1 to triple what it was @@ -388,12 +398,12 @@ func GasLimitChange(gt *testing.T, deltaTimeOffset *hexutil.Uint64) { sequencer.ActL1HeadSignal(t) sequencer.ActBuildToL1HeadExcl(t) - require.Equal(t, oldGasLimit, seqEngine.l2Chain.CurrentBlock().GasLimit) + require.Equal(t, oldGasLimit, seqEngine.L2Chain().CurrentBlock().GasLimit) require.Equal(t, uint64(1), sequencer.SyncStatus().UnsafeL2.L1Origin.Number) // now include the L1 block with the gaslimit change, and see if it changes as expected sequencer.ActBuildToL1Head(t) - require.Equal(t, oldGasLimit*3, seqEngine.l2Chain.CurrentBlock().GasLimit) + require.Equal(t, oldGasLimit*3, seqEngine.L2Chain().CurrentBlock().GasLimit) require.Equal(t, uint64(2), sequencer.SyncStatus().UnsafeL2.L1Origin.Number) // now submit all this to L1, and see if a verifier can sync and reproduce it @@ -402,7 +412,7 @@ func GasLimitChange(gt *testing.T, deltaTimeOffset *hexutil.Uint64) { miner.ActL1IncludeTx(dp.Addresses.Batcher)(t) miner.ActL1EndBlock(t) - _, verifier := setupVerifier(t, sd, log, miner.L1Client(t, sd.RollupCfg), miner.BlobStore(), &sync.Config{}) + _, verifier := actionsHelpers.SetupVerifier(t, sd, log, miner.L1Client(t, sd.RollupCfg), miner.BlobStore(), &sync.Config{}) verifier.ActL2PipelineFull(t) require.Equal(t, sequencer.L2Unsafe(), verifier.L2Safe(), "verifier stays in sync, even with gaslimit changes") diff --git a/op-e2e/actions/eip4844_test.go b/op-e2e/actions/eip4844_test.go deleted file mode 100644 index ddab21d48b47..000000000000 --- a/op-e2e/actions/eip4844_test.go +++ /dev/null @@ -1,185 +0,0 @@ -package actions - -import ( - "testing" - - "github.com/stretchr/testify/require" - - "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" - - batcherFlags "github.com/ethereum-optimism/optimism/op-batcher/flags" - "github.com/ethereum-optimism/optimism/op-e2e/e2eutils" - "github.com/ethereum-optimism/optimism/op-node/rollup/sync" - "github.com/ethereum-optimism/optimism/op-service/testlog" -) - -func setupEIP4844Test(t Testing, log log.Logger) (*e2eutils.SetupData, *e2eutils.DeployParams, *L1Miner, *L2Sequencer, *L2Engine, *L2Verifier, *L2Engine) { - dp := e2eutils.MakeDeployParams(t, defaultRollupTestParams) - genesisActivation := hexutil.Uint64(0) - dp.DeployConfig.L1CancunTimeOffset = &genesisActivation - dp.DeployConfig.L2GenesisCanyonTimeOffset = &genesisActivation - dp.DeployConfig.L2GenesisDeltaTimeOffset = &genesisActivation - dp.DeployConfig.L2GenesisEcotoneTimeOffset = &genesisActivation - - sd := e2eutils.Setup(t, dp, defaultAlloc) - miner, seqEngine, sequencer := setupSequencerTest(t, sd, log) - miner.ActL1SetFeeRecipient(common.Address{'A'}) - sequencer.ActL2PipelineFull(t) - verifEngine, verifier := setupVerifier(t, sd, log, miner.L1Client(t, sd.RollupCfg), miner.BlobStore(), &sync.Config{}) - return sd, dp, miner, sequencer, seqEngine, verifier, verifEngine -} - -func setupBatcher(t Testing, log log.Logger, sd *e2eutils.SetupData, dp *e2eutils.DeployParams, miner *L1Miner, - sequencer *L2Sequencer, engine *L2Engine, daType batcherFlags.DataAvailabilityType, -) *L2Batcher { - return NewL2Batcher(log, sd.RollupCfg, &BatcherCfg{ - MinL1TxSize: 0, - MaxL1TxSize: 128_000, - BatcherKey: dp.Secrets.Batcher, - DataAvailabilityType: daType, - }, sequencer.RollupClient(), miner.EthClient(), engine.EthClient(), engine.EngineClient(t, sd.RollupCfg)) -} - -func TestEIP4844DataAvailability(gt *testing.T) { - t := NewDefaultTesting(gt) - - log := testlog.Logger(t, log.LevelDebug) - sd, dp, miner, sequencer, seqEngine, verifier, _ := setupEIP4844Test(t, log) - - batcher := setupBatcher(t, log, sd, dp, miner, sequencer, seqEngine, batcherFlags.BlobsType) - - sequencer.ActL2PipelineFull(t) - verifier.ActL2PipelineFull(t) - - // build empty L1 block - miner.ActEmptyBlock(t) - // finalize it, so the L1 geth blob pool doesn't log errors about missing finality - miner.ActL1SafeNext(t) - miner.ActL1FinalizeNext(t) - - // Create L2 blocks, and reference the L1 head as origin - sequencer.ActL1HeadSignal(t) - sequencer.ActBuildToL1Head(t) - - // submit all new L2 blocks - batcher.ActSubmitAll(t) - batchTx := batcher.LastSubmitted - require.Equal(t, uint8(types.BlobTxType), batchTx.Type(), "batch tx must be blob-tx") - - // new L1 block with L2 batch - miner.ActL1StartBlock(12)(t) - miner.ActL1IncludeTxByHash(batchTx.Hash())(t) - miner.ActL1EndBlock(t) - - // verifier picks up the L2 chain that was submitted - verifier.ActL1HeadSignal(t) - verifier.ActL2PipelineFull(t) - require.Equal(t, verifier.L2Safe(), sequencer.L2Unsafe(), "verifier syncs from sequencer via L1") - require.NotEqual(t, sequencer.L2Safe(), sequencer.L2Unsafe(), "sequencer has not processed L1 yet") -} - -func TestEIP4844MultiBlobs(gt *testing.T) { - t := NewDefaultTesting(gt) - - log := testlog.Logger(t, log.LevelDebug) - sd, dp, miner, sequencer, seqEngine, verifier, _ := setupEIP4844Test(t, log) - - batcher := setupBatcher(t, log, sd, dp, miner, sequencer, seqEngine, batcherFlags.BlobsType) - - sequencer.ActL2PipelineFull(t) - verifier.ActL2PipelineFull(t) - - // build empty L1 block - miner.ActEmptyBlock(t) - // finalize it, so the L1 geth blob pool doesn't log errors about missing finality - miner.ActL1SafeNext(t) - miner.ActL1FinalizeNext(t) - - // Create L2 blocks, and reference the L1 head as origin - sequencer.ActL1HeadSignal(t) - sequencer.ActBuildToL1Head(t) - - // submit all new L2 blocks - batcher.ActSubmitAllMultiBlobs(t, 6) - batchTx := batcher.LastSubmitted - require.Equal(t, uint8(types.BlobTxType), batchTx.Type(), "batch tx must be blob-tx") - require.Len(t, batchTx.BlobTxSidecar().Blobs, 6) - - // new L1 block with L2 batch - miner.ActL1StartBlock(12)(t) - miner.ActL1IncludeTxByHash(batchTx.Hash())(t) - miner.ActL1EndBlock(t) - - // verifier picks up the L2 chain that was submitted - verifier.ActL1HeadSignal(t) - verifier.ActL2PipelineFull(t) - require.Equal(t, verifier.L2Safe(), sequencer.L2Unsafe(), "verifier syncs from sequencer via L1") - require.NotEqual(t, sequencer.L2Safe(), sequencer.L2Unsafe(), "sequencer has not processed L1 yet") -} - -func TestEIP4844DataAvailabilitySwitch(gt *testing.T) { - t := NewDefaultTesting(gt) - - log := testlog.Logger(t, log.LevelDebug) - sd, dp, miner, sequencer, seqEngine, verifier, _ := setupEIP4844Test(t, log) - - oldBatcher := setupBatcher(t, log, sd, dp, miner, sequencer, seqEngine, batcherFlags.CalldataType) - - sequencer.ActL2PipelineFull(t) - verifier.ActL2PipelineFull(t) - - // build empty L1 block - miner.ActEmptyBlock(t) - // finalize it, so the L1 geth blob pool doesn't log errors about missing finality - miner.ActL1SafeNext(t) - miner.ActL1FinalizeNext(t) - - // Create L2 blocks, and reference the L1 head as origin - sequencer.ActL1HeadSignal(t) - sequencer.ActBuildToL1Head(t) - - // submit all new L2 blocks, with legacy calldata DA - oldBatcher.ActSubmitAll(t) - batchTx := oldBatcher.LastSubmitted - require.Equal(t, uint8(types.DynamicFeeTxType), batchTx.Type(), "batch tx must be eip1559 tx") - - // new L1 block with L2 batch - miner.ActL1StartBlock(12)(t) - miner.ActL1IncludeTxByHash(batchTx.Hash())(t) - miner.ActL1EndBlock(t) - - // verifier picks up the L2 chain that was submitted - verifier.ActL1HeadSignal(t) - verifier.ActL2PipelineFull(t) - require.Equal(t, verifier.L2Safe(), sequencer.L2Unsafe(), "verifier syncs from sequencer via L1") - require.NotEqual(t, sequencer.L2Safe(), sequencer.L2Unsafe(), "sequencer has not processed L1 yet") - - newBatcher := setupBatcher(t, log, sd, dp, miner, sequencer, seqEngine, batcherFlags.BlobsType) - - // build empty L1 block - miner.ActEmptyBlock(t) - - // Create L2 blocks, and reference the L1 head as origin - sequencer.ActL1HeadSignal(t) - sequencer.ActBuildToL1Head(t) - - // submit all new L2 blocks, now with Blobs DA! - newBatcher.ActSubmitAll(t) - batchTx = newBatcher.LastSubmitted - - // new L1 block with L2 batch - miner.ActL1StartBlock(12)(t) - miner.ActL1IncludeTxByHash(batchTx.Hash())(t) - miner.ActL1EndBlock(t) - - require.Equal(t, uint8(types.BlobTxType), batchTx.Type(), "batch tx must be blob-tx") - - // verifier picks up the L2 chain that was submitted - verifier.ActL1HeadSignal(t) - verifier.ActL2PipelineFull(t) - require.Equal(t, verifier.L2Safe(), sequencer.L2Unsafe(), "verifier syncs from sequencer via L1") - require.NotEqual(t, sequencer.L2Safe(), sequencer.L2Unsafe(), "sequencer has not processed L1 yet") -} diff --git a/op-e2e/actions/action.go b/op-e2e/actions/helpers/action.go similarity index 99% rename from op-e2e/actions/action.go rename to op-e2e/actions/helpers/action.go index 551ab58d9632..3f8bba669242 100644 --- a/op-e2e/actions/action.go +++ b/op-e2e/actions/helpers/action.go @@ -1,4 +1,4 @@ -package actions +package helpers import ( "context" diff --git a/op-e2e/actions/garbage_channel_out.go b/op-e2e/actions/helpers/garbage_channel_out.go similarity index 91% rename from op-e2e/actions/garbage_channel_out.go rename to op-e2e/actions/helpers/garbage_channel_out.go index 0dad1438a991..6d813520a10a 100644 --- a/op-e2e/actions/garbage_channel_out.go +++ b/op-e2e/actions/helpers/garbage_channel_out.go @@ -1,4 +1,4 @@ -package actions +package helpers import ( "bytes" @@ -36,10 +36,29 @@ var GarbageKinds = []GarbageKind{ MALFORM_RLP, } +func (gk GarbageKind) String() string { + switch gk { + case STRIP_VERSION: + return "STRIP_VERSION" + case RANDOM: + return "RANDOM" + case TRUNCATE_END: + return "TRUNCATE_END" + case DIRTY_APPEND: + return "DIRTY_APPEND" + case INVALID_COMPRESSION: + return "INVALID_COMPRESSION" + case MALFORM_RLP: + return "MALFORM_RLP" + default: + return "UNKNOWN" + } +} + // GarbageChannelCfg is the configuration for a `GarbageChannelOut` type GarbageChannelCfg struct { - useInvalidCompression bool - malformRLP bool + UseInvalidCompression bool + MalformRLP bool } // Writer is the interface shared between `zlib.Writer` and `gzip.Writer` @@ -109,7 +128,7 @@ func NewGarbageChannelOut(cfg *GarbageChannelCfg) (*GarbageChannelOut, error) { // Optionally use zlib or gzip compression var compress Writer - if cfg.useInvalidCompression { + if cfg.UseInvalidCompression { compress, err = gzip.NewWriterLevel(&c.buf, gzip.BestCompression) } else { compress, err = zlib.NewWriterLevel(&c.buf, zlib.BestCompression) @@ -152,16 +171,19 @@ func (co *GarbageChannelOut) AddBlock(rollupCfg *rollup.Config, block *types.Blo if err := rlp.Encode(&buf, batch); err != nil { return err } - if co.cfg.malformRLP { + if co.cfg.MalformRLP { // Malform the RLP by incrementing the length prefix by 1. bufBytes := buf.Bytes() bufBytes[0] += 1 buf.Reset() buf.Write(bufBytes) } - if co.rlpLength+buf.Len() > rollup.SafeMaxRLPBytesPerChannel { + + chainSpec := rollup.NewChainSpec(rollupCfg) + maxRLPBytesPerChannel := chainSpec.MaxRLPBytesPerChannel(block.Time()) + if co.rlpLength+buf.Len() > int(maxRLPBytesPerChannel) { 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) + buf.Len(), co.rlpLength, maxRLPBytesPerChannel, derive.ErrTooManyRLPBytes) } co.rlpLength += buf.Len() diff --git a/op-e2e/actions/l1_miner.go b/op-e2e/actions/helpers/l1_miner.go similarity index 78% rename from op-e2e/actions/l1_miner.go rename to op-e2e/actions/helpers/l1_miner.go index adbaee77da90..5fe5c762d5c9 100644 --- a/op-e2e/actions/l1_miner.go +++ b/op-e2e/actions/helpers/l1_miner.go @@ -1,8 +1,9 @@ -package actions +package helpers import ( "math/big" + "github.com/ethereum-optimism/optimism/op-program/host/prefetcher" "github.com/stretchr/testify/require" "github.com/ethereum/go-ethereum/common" @@ -11,12 +12,12 @@ import ( "github.com/ethereum/go-ethereum/core" "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/crypto" "github.com/ethereum/go-ethereum/log" "github.com/ethereum/go-ethereum/trie" "github.com/ethereum-optimism/optimism/op-e2e/e2eutils" - "github.com/ethereum-optimism/optimism/op-node/rollup/derive" "github.com/ethereum-optimism/optimism/op-service/eth" ) @@ -32,9 +33,9 @@ type L1Miner struct { // L1 block building data l1BuildingHeader *types.Header // block header that we add txs to for block building l1BuildingState *state.StateDB // state used for block building - l1GasPool *core.GasPool // track gas used of ongoing building + L1GasPool *core.GasPool // track gas used of ongoing building pendingIndices map[common.Address]uint64 // per account, how many txs from the pool were already included in the block, since the pool is lagging behind block mining. - l1Transactions []*types.Transaction // collects txs that were successfully included into current block build + L1Transactions []*types.Transaction // collects txs that were successfully included into current block build l1Receipts []*types.Receipt // collect receipts of ongoing building l1Building bool l1TxFailed []*types.Transaction // log of failed transactions which could not be included @@ -51,7 +52,11 @@ func NewL1Miner(t Testing, log log.Logger, genesis *core.Genesis) *L1Miner { } } -func (s *L1Miner) BlobStore() derive.L1BlobsFetcher { +func (s *L1Miner) BlobSource() prefetcher.L1BlobSource { + return s.blobStore +} + +func (s *L1Miner) BlobStore() *e2eutils.BlobsStore { return s.blobStore } @@ -82,6 +87,7 @@ func (s *L1Miner) ActL1StartBlock(timeDelta uint64) Action { Extra: []byte("L1 was here"), MixDigest: common.Hash{}, // TODO: maybe randomize this (prev-randao value) } + if s.l1Cfg.Config.IsLondon(header.Number) { header.BaseFee = eip1559.CalcBaseFee(s.l1Cfg.Config, parent, header.Time) // At the transition, double the gas limit so the gas target is equal to the old gas limit. @@ -89,25 +95,40 @@ func (s *L1Miner) ActL1StartBlock(timeDelta uint64) Action { header.GasLimit = parent.GasLimit * s.l1Cfg.Config.ElasticityMultiplier() } } + if s.l1Cfg.Config.IsShanghai(header.Number, header.Time) { header.WithdrawalsHash = &types.EmptyWithdrawalsHash } + if s.l1Cfg.Config.IsCancun(header.Number, header.Time) { header.BlobGasUsed = new(uint64) header.ExcessBlobGas = new(uint64) root := crypto.Keccak256Hash([]byte("fake-beacon-block-root"), header.Number.Bytes()) header.ParentBeaconRoot = &root + + // Copied from op-program/client/l2/engineapi/block_processor.go + // TODO(client-pod#826) + // Unfortunately this is not part of any Geth environment setup, + // we just have to apply it, like how the Geth block-builder worker does. + context := core.NewEVMBlockContext(header, s.l1Chain, nil, s.l1Chain.Config(), statedb) + // NOTE: Unlikely to be needed for the beacon block root, but we setup any precompile overrides anyways for forwards-compatibility + var precompileOverrides vm.PrecompileOverrides + if vmConfig := s.l1Chain.GetVMConfig(); vmConfig != nil && vmConfig.PrecompileOverrides != nil { + precompileOverrides = vmConfig.PrecompileOverrides + } + vmenv := vm.NewEVM(context, vm.TxContext{}, statedb, s.l1Chain.Config(), vm.Config{PrecompileOverrides: precompileOverrides}) + core.ProcessBeaconBlockRoot(*header.ParentBeaconRoot, vmenv, statedb) } s.l1Building = true s.l1BuildingHeader = header s.l1BuildingState = statedb s.l1Receipts = make([]*types.Receipt, 0) - s.l1Transactions = make([]*types.Transaction, 0) + s.L1Transactions = make([]*types.Transaction, 0) s.pendingIndices = make(map[common.Address]uint64) s.l1BuildingBlobSidecars = make([]*types.BlobTxSidecar, 0) - s.l1GasPool = new(core.GasPool).AddGas(header.GasLimit) + s.L1GasPool = new(core.GasPool).AddGas(header.GasLimit) } } @@ -121,7 +142,7 @@ func (s *L1Miner) ActL1IncludeTx(from common.Address) Action { getPendingIndex := func(from common.Address) uint64 { return s.pendingIndices[from] } - tx := firstValidTx(t, from, getPendingIndex, s.eth.TxPool().ContentFrom, s.EthClient().NonceAt) + tx := firstValidTx(t, from, getPendingIndex, s.Eth.TxPool().ContentFrom, s.EthClient().NonceAt) s.IncludeTx(t, tx) s.pendingIndices[from] = s.pendingIndices[from] + 1 // won't retry the tx } @@ -134,7 +155,7 @@ func (s *L1Miner) ActL1IncludeTxByHash(txHash common.Hash) Action { t.InvalidAction("no tx inclusion when not building l1 block") return } - tx := s.eth.TxPool().Get(txHash) + tx := s.Eth.TxPool().Get(txHash) require.NotNil(t, tx, "cannot find tx %s", txHash) s.IncludeTx(t, tx) from, err := s.l1Signer.Sender(tx) @@ -150,19 +171,19 @@ func (s *L1Miner) IncludeTx(t Testing, tx *types.Transaction) { if tx.Gas() > s.l1BuildingHeader.GasLimit { t.Fatalf("tx consumes %d gas, more than available in L1 block %d", tx.Gas(), s.l1BuildingHeader.GasLimit) } - if tx.Gas() > uint64(*s.l1GasPool) { - t.InvalidAction("action takes too much gas: %d, only have %d", tx.Gas(), uint64(*s.l1GasPool)) + if tx.Gas() > uint64(*s.L1GasPool) { + t.InvalidAction("action takes too much gas: %d, only have %d", tx.Gas(), uint64(*s.L1GasPool)) return } - s.l1BuildingState.SetTxContext(tx.Hash(), len(s.l1Transactions)) + s.l1BuildingState.SetTxContext(tx.Hash(), len(s.L1Transactions)) receipt, err := core.ApplyTransaction(s.l1Cfg.Config, s.l1Chain, &s.l1BuildingHeader.Coinbase, - s.l1GasPool, s.l1BuildingState, s.l1BuildingHeader, tx.WithoutBlobTxSidecar(), &s.l1BuildingHeader.GasUsed, *s.l1Chain.GetVMConfig()) + s.L1GasPool, s.l1BuildingState, s.l1BuildingHeader, tx.WithoutBlobTxSidecar(), &s.l1BuildingHeader.GasUsed, *s.l1Chain.GetVMConfig()) if err != nil { s.l1TxFailed = append(s.l1TxFailed, tx) - t.Fatalf("failed to apply transaction to L1 block (tx %d): %v", len(s.l1Transactions), err) + t.Fatalf("failed to apply transaction to L1 block (tx %d): %v", len(s.L1Transactions), err) } s.l1Receipts = append(s.l1Receipts, receipt) - s.l1Transactions = append(s.l1Transactions, tx.WithoutBlobTxSidecar()) + s.L1Transactions = append(s.L1Transactions, tx.WithoutBlobTxSidecar()) if tx.Type() == types.BlobTxType { require.True(t, s.l1Cfg.Config.IsCancun(s.l1BuildingHeader.Number, s.l1BuildingHeader.Time), "L1 must be cancun to process blob tx") sidecar := tx.BlobTxSidecar() @@ -188,12 +209,15 @@ func (s *L1Miner) ActL1EndBlock(t Testing) { } s.l1Building = false - s.l1BuildingHeader.GasUsed = s.l1BuildingHeader.GasLimit - uint64(*s.l1GasPool) + s.l1BuildingHeader.GasUsed = s.l1BuildingHeader.GasLimit - uint64(*s.L1GasPool) s.l1BuildingHeader.Root = s.l1BuildingState.IntermediateRoot(s.l1Cfg.Config.IsEIP158(s.l1BuildingHeader.Number)) - block := types.NewBlock(s.l1BuildingHeader, s.l1Transactions, nil, s.l1Receipts, trie.NewStackTrie(nil)) + + var withdrawals []*types.Withdrawal if s.l1Cfg.Config.IsShanghai(s.l1BuildingHeader.Number, s.l1BuildingHeader.Time) { - block = block.WithWithdrawals(make([]*types.Withdrawal, 0)) + withdrawals = make([]*types.Withdrawal, 0) } + + block := types.NewBlock(s.l1BuildingHeader, &types.Body{Transactions: s.L1Transactions, Withdrawals: withdrawals}, s.l1Receipts, trie.NewStackTrie(nil)) if s.l1Cfg.Config.IsCancun(s.l1BuildingHeader.Number, s.l1BuildingHeader.Time) { parent := s.l1Chain.GetHeaderByHash(s.l1BuildingHeader.ParentHash) var ( @@ -220,7 +244,8 @@ func (s *L1Miner) ActL1EndBlock(t Testing) { for _, sidecar := range s.l1BuildingBlobSidecars { for i, h := range sidecar.BlobHashes() { blob := (*eth.Blob)(&sidecar.Blobs[i]) - s.blobStore.StoreBlob(block.Hash(), h, blob) + indexedHash := eth.IndexedBlobHash{Index: uint64(i), Hash: h} + s.blobStore.StoreBlob(block.Time(), indexedHash, blob) } } _, err = s.l1Chain.InsertChain(types.Blocks{block}) diff --git a/op-e2e/actions/l1_miner_test.go b/op-e2e/actions/helpers/l1_miner_test.go similarity index 94% rename from op-e2e/actions/l1_miner_test.go rename to op-e2e/actions/helpers/l1_miner_test.go index 10e4c0c5498c..b102dcaf84f0 100644 --- a/op-e2e/actions/l1_miner_test.go +++ b/op-e2e/actions/helpers/l1_miner_test.go @@ -1,4 +1,4 @@ -package actions +package helpers import ( "math/big" @@ -15,8 +15,8 @@ import ( func TestL1Miner_BuildBlock(gt *testing.T) { t := NewDefaultTesting(gt) - dp := e2eutils.MakeDeployParams(t, defaultRollupTestParams) - sd := e2eutils.Setup(t, dp, defaultAlloc) + dp := e2eutils.MakeDeployParams(t, DefaultRollupTestParams) + sd := e2eutils.Setup(t, dp, DefaultAlloc) log := testlog.Logger(t, log.LevelDebug) miner := NewL1Miner(t, log, sd.L1Cfg) t.Cleanup(func() { diff --git a/op-e2e/actions/l1_replica.go b/op-e2e/actions/helpers/l1_replica.go similarity index 91% rename from op-e2e/actions/l1_replica.go rename to op-e2e/actions/helpers/l1_replica.go index 92796ab60fb0..7b089a4f7fa9 100644 --- a/op-e2e/actions/l1_replica.go +++ b/op-e2e/actions/helpers/l1_replica.go @@ -1,9 +1,12 @@ -package actions +package helpers import ( "errors" + "github.com/stretchr/testify/require" + "github.com/ethereum/go-ethereum/core" + "github.com/ethereum/go-ethereum/core/rawdb" "github.com/ethereum/go-ethereum/core/txpool/blobpool" "github.com/ethereum/go-ethereum/core/types" "github.com/ethereum/go-ethereum/eth" @@ -14,7 +17,7 @@ import ( "github.com/ethereum/go-ethereum/log" "github.com/ethereum/go-ethereum/node" "github.com/ethereum/go-ethereum/p2p" - "github.com/stretchr/testify/require" + "github.com/ethereum/go-ethereum/rpc" "github.com/ethereum-optimism/optimism/op-node/rollup" "github.com/ethereum-optimism/optimism/op-service/client" @@ -35,7 +38,7 @@ type L1Replica struct { log log.Logger node *node.Node - eth *eth.Ethereum + Eth *eth.Ethereum // L1 evm / chain l1Chain *core.BlockChain @@ -43,7 +46,7 @@ type L1Replica struct { l1Cfg *core.Genesis l1Signer types.Signer - failL1RPC func() error // mock error + failL1RPC func(call []rpc.BatchElem) error // mock error } // NewL1Replica constructs a L1Replica starting at the given genesis. @@ -52,6 +55,8 @@ func NewL1Replica(t Testing, log log.Logger, genesis *core.Genesis) *L1Replica { NetworkId: genesis.Config.ChainID.Uint64(), Genesis: genesis, RollupDisableTxPoolGossip: true, + StateScheme: rawdb.HashScheme, + NoPruning: true, BlobPool: blobpool.Config{ Datadir: t.TempDir(), Datacap: blobpool.DefaultConfig.Datacap, @@ -62,6 +67,8 @@ func NewL1Replica(t Testing, log log.Logger, genesis *core.Genesis) *L1Replica { Name: "l1-geth", WSHost: "127.0.0.1", WSPort: 0, + HTTPHost: "127.0.0.1", + HTTPPort: 0, WSModules: []string{"debug", "admin", "eth", "txpool", "net", "rpc", "web3", "personal"}, HTTPModules: []string{"debug", "admin", "eth", "txpool", "net", "rpc", "web3", "personal"}, DataDir: "", // in-memory @@ -78,7 +85,6 @@ func NewL1Replica(t Testing, log log.Logger, genesis *core.Genesis) *L1Replica { backend, err := eth.New(n, ethCfg) require.NoError(t, err) - backend.Merger().FinalizePoS() n.RegisterAPIs(tracers.APIs(backend.APIBackend)) @@ -86,7 +92,7 @@ func NewL1Replica(t Testing, log log.Logger, genesis *core.Genesis) *L1Replica { return &L1Replica{ log: log, node: n, - eth: backend, + Eth: backend, l1Chain: backend.BlockChain(), l1Database: backend.ChainDb(), l1Cfg: genesis, @@ -152,18 +158,20 @@ func (s *L1Replica) CanonL1Chain() func(num uint64) *types.Block { // ActL1RPCFail makes the next L1 RPC request to this node fail func (s *L1Replica) ActL1RPCFail(t Testing) { - failed := false - s.failL1RPC = func() error { - if failed { - return nil - } - failed = true + s.failL1RPC = func(call []rpc.BatchElem) error { + s.failL1RPC = nil return errors.New("mock L1 RPC error") } } func (s *L1Replica) MockL1RPCErrors(fn func() error) { - s.failL1RPC = fn + s.failL1RPC = func(call []rpc.BatchElem) error { + return fn() + } +} + +func (s *L1Replica) HTTPEndpoint() string { + return s.node.HTTPEndpoint() } func (s *L1Replica) EthClient() *ethclient.Client { @@ -175,12 +183,11 @@ func (s *L1Replica) RPCClient() client.RPC { cl := s.node.Attach() return testutils.RPCErrFaker{ RPC: client.NewBaseRPCClient(cl), - ErrFn: func() error { - if s.failL1RPC != nil { - return s.failL1RPC() - } else { + ErrFn: func(call []rpc.BatchElem) error { + if s.failL1RPC == nil { return nil } + return s.failL1RPC(call) }, } } @@ -191,6 +198,10 @@ func (s *L1Replica) L1Client(t Testing, cfg *rollup.Config) *sources.L1Client { return l1F } +func (s *L1Replica) L1Chain() *core.BlockChain { + return s.l1Chain +} + func (s *L1Replica) UnsafeNum() uint64 { head := s.l1Chain.CurrentBlock() headNum := uint64(0) diff --git a/op-e2e/actions/l1_replica_test.go b/op-e2e/actions/helpers/l1_replica_test.go similarity index 84% rename from op-e2e/actions/l1_replica_test.go rename to op-e2e/actions/helpers/l1_replica_test.go index 727638255eb4..5bfe2212f59e 100644 --- a/op-e2e/actions/l1_replica_test.go +++ b/op-e2e/actions/helpers/l1_replica_test.go @@ -1,14 +1,15 @@ -package actions +package helpers import ( + "encoding/binary" "testing" - "github.com/ethereum/go-ethereum/common" "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/rawdb" "github.com/ethereum/go-ethereum/core/types" + "github.com/ethereum/go-ethereum/crypto" "github.com/ethereum/go-ethereum/log" "github.com/ethereum/go-ethereum/triedb" "github.com/ethereum/go-ethereum/triedb/hashdb" @@ -20,20 +21,11 @@ import ( "github.com/ethereum-optimism/optimism/op-service/testlog" ) -var defaultRollupTestParams = &e2eutils.TestParams{ - MaxSequencerDrift: 40, - SequencerWindowSize: 120, - ChannelTimeout: 120, - L1BlockTime: 15, -} - -var defaultAlloc = &e2eutils.AllocParams{PrefundTestUsers: true} - // Test if we can mock an RPC failure func TestL1Replica_ActL1RPCFail(gt *testing.T) { t := NewDefaultTesting(gt) - dp := e2eutils.MakeDeployParams(t, defaultRollupTestParams) - sd := e2eutils.Setup(t, dp, defaultAlloc) + dp := e2eutils.MakeDeployParams(t, DefaultRollupTestParams) + sd := e2eutils.Setup(t, dp, DefaultAlloc) log := testlog.Logger(t, log.LevelDebug) replica := NewL1Replica(t, log, sd.L1Cfg) t.Cleanup(func() { @@ -54,8 +46,9 @@ func TestL1Replica_ActL1RPCFail(gt *testing.T) { // Test if we can make the replica sync an artificial L1 chain, rewind it, and reorg it func TestL1Replica_ActL1Sync(gt *testing.T) { t := NewDefaultTesting(gt) - dp := e2eutils.MakeDeployParams(t, defaultRollupTestParams) - sd := e2eutils.Setup(t, dp, defaultAlloc) + dp := e2eutils.MakeDeployParams(t, DefaultRollupTestParams) + dp.DeployConfig.L1CancunTimeOffset = nil + sd := e2eutils.Setup(t, dp, DefaultAlloc) log := testlog.Logger(t, log.LevelDebug) genesisBlock := sd.L1Cfg.ToBlock() consensus := beacon.New(ethash.NewFaker()) @@ -63,13 +56,17 @@ func TestL1Replica_ActL1Sync(gt *testing.T) { 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) { - g.SetCoinbase(common.Address{'A'}) - }) + gen := func(s string) func(n int, g *core.BlockGen) { + return func(n int, g *core.BlockGen) { + root := crypto.Keccak256Hash([]byte(s), + binary.BigEndian.AppendUint64(nil, uint64(n))) + g.SetParentBeaconRoot(root) + } + } + + chainA, _ := core.GenerateChain(sd.L1Cfg.Config, genesisBlock, consensus, db, 10, gen("A")) chainA = append(append([]*types.Block{}, genesisBlock), chainA...) - chainB, _ := core.GenerateChain(sd.L1Cfg.Config, chainA[3], consensus, db, 10, func(n int, g *core.BlockGen) { - g.SetCoinbase(common.Address{'B'}) - }) + chainB, _ := core.GenerateChain(sd.L1Cfg.Config, chainA[3], consensus, db, 10, gen("B")) chainB = append(append([]*types.Block{}, chainA[:4]...), chainB...) require.NotEqual(t, chainA[9], chainB[9], "need different chains") canonL1 := func(blocks []*types.Block) func(num uint64) *types.Block { diff --git a/op-e2e/actions/l2_batcher.go b/op-e2e/actions/helpers/l2_batcher.go similarity index 79% rename from op-e2e/actions/l2_batcher.go rename to op-e2e/actions/helpers/l2_batcher.go index 310a6cade951..d9e6fe3dbec5 100644 --- a/op-e2e/actions/l2_batcher.go +++ b/op-e2e/actions/helpers/l2_batcher.go @@ -1,4 +1,4 @@ -package actions +package helpers import ( "bytes" @@ -19,13 +19,13 @@ import ( "github.com/ethereum/go-ethereum/log" "github.com/ethereum/go-ethereum/params" + altda "github.com/ethereum-optimism/optimism/op-alt-da" "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" "github.com/ethereum-optimism/optimism/op-node/rollup" "github.com/ethereum-optimism/optimism/op-node/rollup/derive" - plasma "github.com/ethereum-optimism/optimism/op-plasma" "github.com/ethereum-optimism/optimism/op-service/eth" "github.com/ethereum-optimism/optimism/op-service/txmgr" ) @@ -44,8 +44,8 @@ type L1TxAPI interface { SendTransaction(ctx context.Context, tx *types.Transaction) error } -type PlasmaInputSetter interface { - SetInput(ctx context.Context, img []byte) (plasma.CommitmentData, error) +type AltDAInputSetter interface { + SetInput(ctx context.Context, img []byte) (altda.CommitmentData, error) } type BatcherCfg struct { @@ -59,10 +59,10 @@ type BatcherCfg struct { ForceSubmitSingularBatch bool ForceSubmitSpanBatch bool - UsePlasma bool + UseAltDA bool DataAvailabilityType batcherFlags.DataAvailabilityType - PlasmaDA PlasmaInputSetter + AltDA AltDAInputSetter } func DefaultBatcherCfg(dp *e2eutils.DeployParams) *BatcherCfg { @@ -74,14 +74,14 @@ func DefaultBatcherCfg(dp *e2eutils.DeployParams) *BatcherCfg { } } -func PlasmaBatcherCfg(dp *e2eutils.DeployParams, plasmaDa PlasmaInputSetter) *BatcherCfg { +func AltDABatcherCfg(dp *e2eutils.DeployParams, altDA AltDAInputSetter) *BatcherCfg { return &BatcherCfg{ MinL1TxSize: 0, MaxL1TxSize: 128_000, BatcherKey: dp.Secrets.Batcher, DataAvailabilityType: batcherFlags.CalldataType, - PlasmaDA: plasmaDa, - UsePlasma: true, + AltDA: altDA, + UseAltDA: true, } } @@ -106,12 +106,12 @@ type L2Batcher struct { l1Signer types.Signer - l2ChannelOut ChannelOutIface + L2ChannelOut ChannelOutIface l2Submitting bool // when the channel out is being submitted, and not safe to write to without resetting - l2BufferedBlock eth.L2BlockRef + L2BufferedBlock eth.L2BlockRef l2SubmittedBlock eth.L2BlockRef l2BatcherCfg *BatcherCfg - batcherAddr common.Address + BatcherAddr common.Address LastSubmitted *types.Transaction } @@ -126,7 +126,7 @@ func NewL2Batcher(log log.Logger, rollupCfg *rollup.Config, batcherCfg *BatcherC engCl: engCl, l2BatcherCfg: batcherCfg, l1Signer: types.LatestSignerForChainID(rollupCfg.L1ChainID), - batcherAddr: crypto.PubkeyToAddress(batcherCfg.BatcherKey.PublicKey), + BatcherAddr: crypto.PubkeyToAddress(batcherCfg.BatcherKey.PublicKey), } } @@ -136,15 +136,25 @@ func (s *L2Batcher) SubmittingData() bool { return s.l2Submitting } +// Reset the batcher state, clearing any buffered data. +func (s *L2Batcher) Reset() { + s.L2ChannelOut = nil + s.l2Submitting = false + s.L2BufferedBlock = eth.L2BlockRef{} + s.l2SubmittedBlock = eth.L2BlockRef{} +} + // ActL2BatchBuffer adds the next L2 block to the batch buffer. // If the buffer is being submitted, the buffer is wiped. func (s *L2Batcher) ActL2BatchBuffer(t Testing) { require.NoError(t, s.Buffer(t), "failed to add block to channel") } -func (s *L2Batcher) Buffer(t Testing) error { +type BlockModifier = func(block *types.Block) + +func (s *L2Batcher) Buffer(t Testing, opts ...BlockModifier) error { if s.l2Submitting { // break ongoing submitting work if necessary - s.l2ChannelOut = nil + s.L2ChannelOut = nil s.l2Submitting = false } syncStatus, err := s.syncStatusAPI.SyncStatus(t.Ctx()) @@ -153,38 +163,45 @@ func (s *L2Batcher) Buffer(t Testing) error { if s.l2SubmittedBlock == (eth.L2BlockRef{}) { s.log.Info("Starting batch-submitter work at safe-head", "safe", syncStatus.SafeL2) s.l2SubmittedBlock = syncStatus.SafeL2 - s.l2BufferedBlock = syncStatus.SafeL2 - s.l2ChannelOut = nil + s.L2BufferedBlock = syncStatus.SafeL2 + s.L2ChannelOut = nil } // If it's lagging behind, catch it up. if s.l2SubmittedBlock.Number < syncStatus.SafeL2.Number { s.log.Warn("last submitted block lagged behind L2 safe head: batch submission will continue from the safe head now", "last", s.l2SubmittedBlock, "safe", syncStatus.SafeL2) s.l2SubmittedBlock = syncStatus.SafeL2 - s.l2BufferedBlock = syncStatus.SafeL2 - s.l2ChannelOut = nil + s.L2BufferedBlock = syncStatus.SafeL2 + s.L2ChannelOut = nil } // Add the next unsafe block to the channel - if s.l2BufferedBlock.Number >= syncStatus.UnsafeL2.Number { - if s.l2BufferedBlock.Number > syncStatus.UnsafeL2.Number || s.l2BufferedBlock.Hash != syncStatus.UnsafeL2.Hash { + if s.L2BufferedBlock.Number >= syncStatus.UnsafeL2.Number { + if s.L2BufferedBlock.Number > syncStatus.UnsafeL2.Number || s.L2BufferedBlock.Hash != syncStatus.UnsafeL2.Hash { s.log.Error("detected a reorg in L2 chain vs previous buffered information, resetting to safe head now", "safe_head", syncStatus.SafeL2) s.l2SubmittedBlock = syncStatus.SafeL2 - s.l2BufferedBlock = syncStatus.SafeL2 - s.l2ChannelOut = nil + s.L2BufferedBlock = syncStatus.SafeL2 + s.L2ChannelOut = nil } else { s.log.Info("nothing left to submit") return nil } } - block, err := s.l2.BlockByNumber(t.Ctx(), big.NewInt(int64(s.l2BufferedBlock.Number+1))) + + block, err := s.l2.BlockByNumber(t.Ctx(), big.NewInt(int64(s.L2BufferedBlock.Number+1))) require.NoError(t, err, "need l2 block %d from sync status", s.l2SubmittedBlock.Number+1) - if block.ParentHash() != s.l2BufferedBlock.Hash { + if block.ParentHash() != s.L2BufferedBlock.Hash { s.log.Error("detected a reorg in L2 chain vs previous submitted information, resetting to safe head now", "safe_head", syncStatus.SafeL2) s.l2SubmittedBlock = syncStatus.SafeL2 - s.l2BufferedBlock = syncStatus.SafeL2 - s.l2ChannelOut = nil + s.L2BufferedBlock = syncStatus.SafeL2 + s.L2ChannelOut = nil + } + + // Apply modifications to the block + for _, f := range opts { + f(block) } + // Create channel if we don't have one yet - if s.l2ChannelOut == nil { + if s.L2ChannelOut == nil { var ch ChannelOutIface if s.l2BatcherCfg.GarbageCfg != nil { ch, err = NewGarbageChannelOut(s.l2BatcherCfg.GarbageCfg) @@ -199,63 +216,71 @@ func (s *L2Batcher) Buffer(t Testing) error { if s.l2BatcherCfg.ForceSubmitSingularBatch && s.l2BatcherCfg.ForceSubmitSpanBatch { t.Fatalf("ForceSubmitSingularBatch and ForceSubmitSpanBatch cannot be set to true at the same time") } else { + chainSpec := rollup.NewChainSpec(s.rollupCfg) // 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) + ch, err = derive.NewSpanChannelOut(target, derive.Zlib, chainSpec) // use singular batches in all other cases } else { - ch, err = derive.NewSingularChannelOut(c) + ch, err = derive.NewSingularChannelOut(c, chainSpec) } } } require.NoError(t, err, "failed to create channel") - s.l2ChannelOut = ch + s.L2ChannelOut = ch } - if err := s.l2ChannelOut.AddBlock(s.rollupCfg, block); err != nil { + if err := s.L2ChannelOut.AddBlock(s.rollupCfg, block); err != nil { return err } ref, err := s.engCl.L2BlockRefByHash(t.Ctx(), block.Hash()) require.NoError(t, err, "failed to get L2BlockRef") - s.l2BufferedBlock = ref + s.L2BufferedBlock = ref return nil } func (s *L2Batcher) ActL2ChannelClose(t Testing) { // Don't run this action if there's no data to submit - if s.l2ChannelOut == nil { + if s.L2ChannelOut == nil { t.InvalidAction("need to buffer data first, cannot batch submit with empty buffer") return } - require.NoError(t, s.l2ChannelOut.Close(), "must close channel before submitting it") + require.NoError(t, s.L2ChannelOut.Close(), "must close channel before submitting it") } -// ActL2BatchSubmit constructs a batch tx from previous buffered L2 blocks, and submits it to L1 -func (s *L2Batcher) ActL2BatchSubmit(t Testing, txOpts ...func(tx *types.DynamicFeeTx)) { +func (s *L2Batcher) ReadNextOutputFrame(t Testing) []byte { // Don't run this action if there's no data to submit - if s.l2ChannelOut == nil { + if s.L2ChannelOut == nil { t.InvalidAction("need to buffer data first, cannot batch submit with empty buffer") - return + return nil } // Collect the output frame data := new(bytes.Buffer) data.WriteByte(derive.DerivationVersion0) // subtract one, to account for the version byte - if _, err := s.l2ChannelOut.OutputFrame(data, s.l2BatcherCfg.MaxL1TxSize-1); err == io.EOF { - s.l2ChannelOut = nil + if _, err := s.L2ChannelOut.OutputFrame(data, s.l2BatcherCfg.MaxL1TxSize-1); err == io.EOF { + s.L2ChannelOut = nil s.l2Submitting = false } else if err != nil { s.l2Submitting = false t.Fatalf("failed to output channel data to frame: %v", err) } - payload := data.Bytes() - if s.l2BatcherCfg.UsePlasma { - comm, err := s.l2BatcherCfg.PlasmaDA.SetInput(t.Ctx(), payload) - require.NoError(t, err, "failed to set input for plasma") + return data.Bytes() +} + +// ActL2BatchSubmit constructs a batch tx from previous buffered L2 blocks, and submits it to L1 +func (s *L2Batcher) ActL2BatchSubmit(t Testing, txOpts ...func(tx *types.DynamicFeeTx)) { + s.ActL2BatchSubmitRaw(t, s.ReadNextOutputFrame(t), txOpts...) +} + +func (s *L2Batcher) ActL2BatchSubmitRaw(t Testing, payload []byte, txOpts ...func(tx *types.DynamicFeeTx)) { + if s.l2BatcherCfg.UseAltDA { + comm, err := s.l2BatcherCfg.AltDA.SetInput(t.Ctx(), payload) + require.NoError(t, err, "failed to set input for altda") payload = comm.TxData() } - nonce, err := s.l1.PendingNonceAt(t.Ctx(), s.batcherAddr) + nonce, err := s.l1.PendingNonceAt(t.Ctx(), s.BatcherAddr) require.NoError(t, err, "need batcher nonce") gasTipCap := big.NewInt(2 * params.GWei) @@ -326,7 +351,7 @@ func (s *L2Batcher) ActL2BatchSubmitMultiBlob(t Testing, numBlobs int) { } // Don't run this action if there's no data to submit - if s.l2ChannelOut == nil { + if s.L2ChannelOut == nil { t.InvalidAction("need to buffer data first, cannot batch submit with empty buffer") return } @@ -343,12 +368,12 @@ func (s *L2Batcher) ActL2BatchSubmitMultiBlob(t Testing, numBlobs int) { // subtract one, to account for the version byte l = s.l2BatcherCfg.MaxL1TxSize - 1 } - if _, err := s.l2ChannelOut.OutputFrame(data, l); err == io.EOF { + if _, err := s.L2ChannelOut.OutputFrame(data, l); err == io.EOF { s.l2Submitting = false if i < numBlobs-1 { t.Fatalf("failed to fill up %d blobs, only filled %d", numBlobs, i+1) } - s.l2ChannelOut = nil + s.L2ChannelOut = nil } else if err != nil { s.l2Submitting = false t.Fatalf("failed to output channel data to frame: %v", err) @@ -358,7 +383,7 @@ func (s *L2Batcher) ActL2BatchSubmitMultiBlob(t Testing, numBlobs int) { require.NoError(t, blobs[i].FromData(data.Bytes()), "must turn data into blob") } - nonce, err := s.l1.PendingNonceAt(t.Ctx(), s.batcherAddr) + nonce, err := s.l1.PendingNonceAt(t.Ctx(), s.BatcherAddr) require.NoError(t, err, "need batcher nonce") gasTipCap := big.NewInt(2 * params.GWei) @@ -400,27 +425,14 @@ func (s *L2Batcher) ActL2BatchSubmitMultiBlob(t Testing, numBlobs int) { // batch inbox. This *should* cause the batch inbox to reject the blocks // encoded within the frame, even if the blocks themselves are valid. func (s *L2Batcher) ActL2BatchSubmitGarbage(t Testing, kind GarbageKind) { - // Don't run this action if there's no data to submit - if s.l2ChannelOut == nil { - t.InvalidAction("need to buffer data first, cannot batch submit with empty buffer") - return - } - - // Collect the output frame - data := new(bytes.Buffer) - data.WriteByte(derive.DerivationVersion0) - - // subtract one, to account for the version byte - if _, err := s.l2ChannelOut.OutputFrame(data, s.l2BatcherCfg.MaxL1TxSize-1); err == io.EOF { - s.l2ChannelOut = nil - s.l2Submitting = false - } else if err != nil { - s.l2Submitting = false - t.Fatalf("failed to output channel data to frame: %v", err) - } - - outputFrame := data.Bytes() + outputFrame := s.ReadNextOutputFrame(t) + s.ActL2BatchSubmitGarbageRaw(t, outputFrame, kind) +} +// ActL2BatchSubmitGarbageRaw constructs a malformed channel frame from `outputFrame` and submits it to the +// batch inbox. This *should* cause the batch inbox to reject the blocks +// encoded within the frame, even if the blocks themselves are valid. +func (s *L2Batcher) ActL2BatchSubmitGarbageRaw(t Testing, outputFrame []byte, kind GarbageKind) { // Malform the output frame switch kind { // Strip the derivation version byte from the output frame @@ -452,37 +464,13 @@ func (s *L2Batcher) ActL2BatchSubmitGarbage(t Testing, kind GarbageKind) { t.Fatalf("Unexpected garbage kind: %v", kind) } - nonce, err := s.l1.PendingNonceAt(t.Ctx(), s.batcherAddr) - require.NoError(t, err, "need batcher nonce") - - gasTipCap := big.NewInt(2 * params.GWei) - pendingHeader, err := s.l1.HeaderByNumber(t.Ctx(), big.NewInt(-1)) - require.NoError(t, err, "need l1 pending header for gas price estimation") - gasFeeCap := new(big.Int).Add(gasTipCap, new(big.Int).Mul(pendingHeader.BaseFee, big.NewInt(2))) - - rawTx := &types.DynamicFeeTx{ - ChainID: s.rollupCfg.L1ChainID, - Nonce: nonce, - To: &s.rollupCfg.BatchInboxAddress, - GasTipCap: gasTipCap, - GasFeeCap: gasFeeCap, - Data: outputFrame, - } - gas, err := core.IntrinsicGas(rawTx.Data, nil, false, true, true, false) - require.NoError(t, err, "need to compute intrinsic gas") - rawTx.Gas = gas - - tx, err := types.SignNewTx(s.l2BatcherCfg.BatcherKey, s.l1Signer, rawTx) - require.NoError(t, err, "need to sign tx") - - err = s.l1.SendTransaction(t.Ctx(), tx) - require.NoError(t, err, "need to send tx") + s.ActL2BatchSubmitRaw(t, outputFrame) } func (s *L2Batcher) ActBufferAll(t Testing) { stat, err := s.syncStatusAPI.SyncStatus(t.Ctx()) require.NoError(t, err) - for s.l2BufferedBlock.Number < stat.UnsafeL2.Number { + for s.L2BufferedBlock.Number < stat.UnsafeL2.Number { s.ActL2BatchBuffer(t) } } diff --git a/op-e2e/actions/l2_engine.go b/op-e2e/actions/helpers/l2_engine.go similarity index 84% rename from op-e2e/actions/l2_engine.go rename to op-e2e/actions/helpers/l2_engine.go index 910f487fb7c0..5839a20798d3 100644 --- a/op-e2e/actions/l2_engine.go +++ b/op-e2e/actions/helpers/l2_engine.go @@ -1,10 +1,11 @@ -package actions +package helpers import ( "errors" "github.com/ethereum-optimism/optimism/op-e2e/e2eutils" "github.com/ethereum-optimism/optimism/op-program/client/l2/engineapi" + "github.com/ethereum/go-ethereum/core/rawdb" "github.com/stretchr/testify/require" "github.com/ethereum/go-ethereum/common" @@ -34,7 +35,7 @@ type L2Engine struct { log log.Logger node *node.Node - eth *geth.Ethereum + Eth *geth.Ethereum rollupGenesis *rollup.Genesis @@ -42,9 +43,9 @@ type L2Engine struct { l2Chain *core.BlockChain l2Signer types.Signer - engineApi *engineapi.L2EngineAPI + EngineApi *engineapi.L2EngineAPI - failL2RPC error // mock error + FailL2RPC func(call []rpc.BatchElem) error // mock error } type EngineOption func(ethCfg *ethconfig.Config, nodeCfg *node.Config) error @@ -57,7 +58,7 @@ func NewL2Engine(t Testing, log log.Logger, genesis *core.Genesis, rollupGenesis eng := &L2Engine{ log: log, node: n, - eth: ethBackend, + Eth: ethBackend, rollupGenesis: &rollup.Genesis{ L1: rollupGenesisL1, L2: eth.BlockID{Hash: genesisBlock.Hash(), Number: genesisBlock.NumberU64()}, @@ -65,14 +66,14 @@ func NewL2Engine(t Testing, log log.Logger, genesis *core.Genesis, rollupGenesis }, l2Chain: chain, l2Signer: types.LatestSigner(genesis.Config), - engineApi: engineApi, + EngineApi: engineApi, } // register the custom engine API, so we can serve engine requests while having more control // over sequencing of individual txs. n.RegisterAPIs([]rpc.API{ { Namespace: "engine", - Service: eng.engineApi, + Service: eng.EngineApi, Authenticated: true, }, }) @@ -83,13 +84,17 @@ func NewL2Engine(t Testing, log log.Logger, genesis *core.Genesis, rollupGenesis func newBackend(t e2eutils.TestingBase, genesis *core.Genesis, jwtPath string, options []EngineOption) (*node.Node, *geth.Ethereum, *engineApiBackend) { ethCfg := ðconfig.Config{ - NetworkId: genesis.Config.ChainID.Uint64(), - Genesis: genesis, + NetworkId: genesis.Config.ChainID.Uint64(), + Genesis: genesis, + StateScheme: rawdb.HashScheme, + NoPruning: true, } nodeCfg := &node.Config{ Name: "l2-geth", WSHost: "127.0.0.1", WSPort: 0, + HTTPHost: "127.0.0.1", + HTTPPort: 0, AuthAddr: "127.0.0.1", AuthPort: 0, WSModules: []string{"debug", "admin", "eth", "txpool", "net", "rpc", "web3", "personal"}, @@ -132,6 +137,10 @@ func (e *engineApiBackend) Genesis() *core.Genesis { return e.genesis } +func (s *L2Engine) L2Chain() *core.BlockChain { + return s.l2Chain +} + func (s *L2Engine) Enode() *enode.Node { return s.node.Server().LocalNode().Node() } @@ -146,6 +155,10 @@ func (s *L2Engine) PeerCount() int { return s.node.Server().PeerCount() } +func (s *L2Engine) HTTPEndpoint() string { + return s.node.HTTPEndpoint() +} + func (s *L2Engine) EthClient() *ethclient.Client { cl := s.node.Attach() return ethclient.NewClient(cl) @@ -160,10 +173,11 @@ func (e *L2Engine) RPCClient() client.RPC { cl := e.node.Attach() return testutils.RPCErrFaker{ RPC: client.NewBaseRPCClient(cl), - ErrFn: func() error { - err := e.failL2RPC - e.failL2RPC = nil // reset back, only error once. - return err + ErrFn: func(call []rpc.BatchElem) error { + if e.FailL2RPC == nil { + return nil + } + return e.FailL2RPC(call) }, } } @@ -176,23 +190,26 @@ func (e *L2Engine) EngineClient(t Testing, cfg *rollup.Config) *sources.EngineCl // ActL2RPCFail makes the next L2 RPC request fail with given error func (e *L2Engine) ActL2RPCFail(t Testing, err error) { - if e.failL2RPC != nil { // already set to fail? + if e.FailL2RPC != nil { // already set to fail? t.InvalidAction("already set a mock L2 rpc error") return } - e.failL2RPC = err + e.FailL2RPC = func(call []rpc.BatchElem) error { + e.FailL2RPC = nil + return err + } } // ActL2IncludeTx includes the next transaction from the given address in the block that is being built func (e *L2Engine) ActL2IncludeTx(from common.Address) Action { return func(t Testing) { - if e.engineApi.ForcedEmpty() { + if e.EngineApi.ForcedEmpty() { e.log.Info("Skipping including a transaction because e.L2ForceEmpty is true") return } - tx := firstValidTx(t, from, e.engineApi.PendingIndices, e.eth.TxPool().ContentFrom, e.EthClient().NonceAt) - err := e.engineApi.IncludeTx(tx, from) + tx := firstValidTx(t, from, e.EngineApi.PendingIndices, e.Eth.TxPool().ContentFrom, e.EthClient().NonceAt) + err := e.EngineApi.IncludeTx(tx, from) if errors.Is(err, engineapi.ErrNotBuildingBlock) { t.InvalidAction(err.Error()) } else if errors.Is(err, engineapi.ErrUsesTooMuchGas) { diff --git a/op-e2e/actions/l2_engine_test.go b/op-e2e/actions/helpers/l2_engine_test.go similarity index 77% rename from op-e2e/actions/l2_engine_test.go rename to op-e2e/actions/helpers/l2_engine_test.go index 6a113e086940..d74595d31621 100644 --- a/op-e2e/actions/l2_engine_test.go +++ b/op-e2e/actions/helpers/l2_engine_test.go @@ -1,26 +1,28 @@ -package actions +package helpers import ( + "encoding/binary" "errors" "math/big" "testing" - "github.com/ethereum-optimism/optimism/op-program/client/l2/engineapi" - "github.com/ethereum-optimism/optimism/op-program/client/l2/engineapi/test" + "github.com/stretchr/testify/require" + "github.com/ethereum/go-ethereum/common" "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/rawdb" "github.com/ethereum/go-ethereum/core/types" + "github.com/ethereum/go-ethereum/crypto" + "github.com/ethereum/go-ethereum/log" "github.com/ethereum/go-ethereum/params" "github.com/ethereum/go-ethereum/triedb" "github.com/ethereum/go-ethereum/triedb/hashdb" - "github.com/stretchr/testify/require" - - "github.com/ethereum/go-ethereum/log" "github.com/ethereum-optimism/optimism/op-e2e/e2eutils" + "github.com/ethereum-optimism/optimism/op-program/client/l2/engineapi" + "github.com/ethereum-optimism/optimism/op-program/client/l2/engineapi/test" "github.com/ethereum-optimism/optimism/op-service/eth" "github.com/ethereum-optimism/optimism/op-service/sources" "github.com/ethereum-optimism/optimism/op-service/testlog" @@ -29,8 +31,8 @@ import ( func TestL2EngineAPI(gt *testing.T) { t := NewDefaultTesting(gt) jwtPath := e2eutils.WriteDefaultJWT(t) - dp := e2eutils.MakeDeployParams(t, defaultRollupTestParams) - sd := e2eutils.Setup(t, dp, defaultAlloc) + dp := e2eutils.MakeDeployParams(t, DefaultRollupTestParams) + sd := e2eutils.Setup(t, dp, DefaultAlloc) log := testlog.Logger(t, log.LevelDebug) genesisBlock := sd.L2Cfg.ToBlock() consensus := beacon.New(ethash.NewFaker()) @@ -44,57 +46,69 @@ func TestL2EngineAPI(gt *testing.T) { require.NoError(t, err) // build an empty block - chainA, _ := core.GenerateChain(sd.L2Cfg.Config, genesisBlock, consensus, db, 1, func(i int, gen *core.BlockGen) { + chainA, _ := core.GenerateChain(sd.L2Cfg.Config, genesisBlock, consensus, db, 1, func(n int, gen *core.BlockGen) { gen.SetCoinbase(common.Address{'A'}) + if sd.L2Cfg.Config.IsCancun(gen.Number(), gen.Timestamp()) { + root := crypto.Keccak256Hash([]byte("A"), binary.BigEndian.AppendUint64(nil, uint64(n))) + gen.SetParentBeaconRoot(root) + } }) - payloadA, err := eth.BlockAsPayload(chainA[0], sd.RollupCfg.CanyonTime) + + payloadA, err := eth.BlockAsPayloadEnv(chainA[0], sd.RollupCfg.CanyonTime) require.NoError(t, err) // apply the payload - status, err := l2Cl.NewPayload(t.Ctx(), payloadA, nil) + status, err := l2Cl.NewPayload(t.Ctx(), payloadA.ExecutionPayload, payloadA.ParentBeaconBlockRoot) require.NoError(t, err) - require.Equal(t, status.Status, eth.ExecutionValid) + require.Equal(t, eth.ExecutionValid, status.Status) require.Equal(t, genesisBlock.Hash(), engine.l2Chain.CurrentBlock().Hash(), "processed payloads are not immediately canonical") // recognize the payload as canonical fcRes, err := l2Cl.ForkchoiceUpdate(t.Ctx(), ð.ForkchoiceState{ - HeadBlockHash: payloadA.BlockHash, + HeadBlockHash: payloadA.ExecutionPayload.BlockHash, SafeBlockHash: genesisBlock.Hash(), FinalizedBlockHash: genesisBlock.Hash(), }, nil) require.NoError(t, err) + require.Equal(t, fcRes.PayloadStatus.Status, eth.ExecutionValid) - require.Equal(t, payloadA.BlockHash, engine.l2Chain.CurrentBlock().Hash(), "now payload A is canonical") + require.Equal(t, payloadA.ExecutionPayload.BlockHash, engine.l2Chain.CurrentBlock().Hash(), "now payload A is canonical") // build an alternative block - chainB, _ := core.GenerateChain(sd.L2Cfg.Config, genesisBlock, consensus, db, 1, func(i int, gen *core.BlockGen) { + chainB, _ := core.GenerateChain(sd.L2Cfg.Config, genesisBlock, consensus, db, 1, func(n int, gen *core.BlockGen) { gen.SetCoinbase(common.Address{'B'}) + if sd.L2Cfg.Config.IsCancun(gen.Number(), gen.Timestamp()) { + root := crypto.Keccak256Hash([]byte("A"), binary.BigEndian.AppendUint64(nil, uint64(n))) + gen.SetParentBeaconRoot(root) + } }) - payloadB, err := eth.BlockAsPayload(chainB[0], sd.RollupCfg.CanyonTime) + + payloadB, err := eth.BlockAsPayloadEnv(chainB[0], sd.RollupCfg.CanyonTime) require.NoError(t, err) // apply the payload - status, err = l2Cl.NewPayload(t.Ctx(), payloadB, nil) + status, err = l2Cl.NewPayload(t.Ctx(), payloadB.ExecutionPayload, payloadB.ParentBeaconBlockRoot) require.NoError(t, err) require.Equal(t, status.Status, eth.ExecutionValid) - require.Equal(t, payloadA.BlockHash, engine.l2Chain.CurrentBlock().Hash(), "processed payloads are not immediately canonical") + require.Equal(t, payloadA.ExecutionPayload.BlockHash, engine.l2Chain.CurrentBlock().Hash(), "processed payloads are not immediately canonical") // reorg block A in favor of block B fcRes, err = l2Cl.ForkchoiceUpdate(t.Ctx(), ð.ForkchoiceState{ - HeadBlockHash: payloadB.BlockHash, + HeadBlockHash: payloadB.ExecutionPayload.BlockHash, SafeBlockHash: genesisBlock.Hash(), FinalizedBlockHash: genesisBlock.Hash(), }, nil) require.NoError(t, err) require.Equal(t, fcRes.PayloadStatus.Status, eth.ExecutionValid) - require.Equal(t, payloadB.BlockHash, engine.l2Chain.CurrentBlock().Hash(), "now payload B is canonical") + require.Equal(t, payloadB.ExecutionPayload.BlockHash, engine.l2Chain.CurrentBlock().Hash(), "now payload B is canonical") + } func TestL2EngineAPIBlockBuilding(gt *testing.T) { t := NewDefaultTesting(gt) jwtPath := e2eutils.WriteDefaultJWT(t) - dp := e2eutils.MakeDeployParams(t, defaultRollupTestParams) - sd := e2eutils.Setup(t, dp, defaultAlloc) + dp := e2eutils.MakeDeployParams(t, DefaultRollupTestParams) + sd := e2eutils.Setup(t, dp, DefaultAlloc) log := testlog.Logger(t, log.LevelDebug) genesisBlock := sd.L2Cfg.ToBlock() db := rawdb.NewMemoryDatabase() @@ -133,6 +147,11 @@ func TestL2EngineAPIBlockBuilding(gt *testing.T) { w = &types.Withdrawals{} } + var parentBeaconBlockRoot *common.Hash + if sd.RollupCfg.IsEcotone(uint64(nextBlockTime)) { + parentBeaconBlockRoot = &common.Hash{} + } + // Now let's ask the engine to build a block fcRes, err := l2Cl.ForkchoiceUpdate(t.Ctx(), ð.ForkchoiceState{ HeadBlockHash: parent.Hash(), @@ -146,6 +165,7 @@ func TestL2EngineAPIBlockBuilding(gt *testing.T) { NoTxPool: false, GasLimit: (*eth.Uint64Quantity)(&sd.RollupCfg.Genesis.SystemConfig.GasLimit), Withdrawals: w, + ParentBeaconBlockRoot: parentBeaconBlockRoot, }) require.NoError(t, err) require.Equal(t, fcRes.PayloadStatus.Status, eth.ExecutionValid) @@ -161,7 +181,7 @@ func TestL2EngineAPIBlockBuilding(gt *testing.T) { require.Equal(t, parent.Hash(), payload.ParentHash, "block builds on parent block") // apply the payload - status, err := l2Cl.NewPayload(t.Ctx(), payload, nil) + status, err := l2Cl.NewPayload(t.Ctx(), payload, envelope.ParentBeaconBlockRoot) require.NoError(t, err) require.Equal(t, status.Status, eth.ExecutionValid) require.Equal(t, parent.Hash(), engine.l2Chain.CurrentBlock().Hash(), "processed payloads are not immediately canonical") @@ -188,8 +208,8 @@ func TestL2EngineAPIBlockBuilding(gt *testing.T) { func TestL2EngineAPIFail(gt *testing.T) { t := NewDefaultTesting(gt) jwtPath := e2eutils.WriteDefaultJWT(t) - dp := e2eutils.MakeDeployParams(t, defaultRollupTestParams) - sd := e2eutils.Setup(t, dp, defaultAlloc) + dp := e2eutils.MakeDeployParams(t, DefaultRollupTestParams) + sd := e2eutils.Setup(t, dp, DefaultAlloc) log := testlog.Logger(t, log.LevelDebug) engine := NewL2Engine(t, log, sd.L2Cfg, sd.RollupCfg.Genesis.L1, jwtPath) // mock an RPC failure @@ -208,8 +228,8 @@ func TestL2EngineAPIFail(gt *testing.T) { func TestEngineAPITests(t *testing.T) { test.RunEngineAPITests(t, func(t *testing.T) engineapi.EngineBackend { jwtPath := e2eutils.WriteDefaultJWT(t) - dp := e2eutils.MakeDeployParams(t, defaultRollupTestParams) - sd := e2eutils.Setup(t, dp, defaultAlloc) + dp := e2eutils.MakeDeployParams(t, DefaultRollupTestParams) + sd := e2eutils.Setup(t, dp, DefaultAlloc) n, _, apiBackend := newBackend(t, sd.L2Cfg, jwtPath, nil) err := n.Start() require.NoError(t, err) diff --git a/op-e2e/actions/l2_proposer.go b/op-e2e/actions/helpers/l2_proposer.go similarity index 88% rename from op-e2e/actions/l2_proposer.go rename to op-e2e/actions/helpers/l2_proposer.go index d5c1fe384ca5..f1a0c4d0d634 100644 --- a/op-e2e/actions/l2_proposer.go +++ b/op-e2e/actions/helpers/l2_proposer.go @@ -1,11 +1,13 @@ -package actions +package helpers import ( "context" "crypto/ecdsa" + "encoding/binary" "math/big" "time" + "github.com/ethereum-optimism/optimism/op-service/sources/batching" "github.com/ethereum/go-ethereum" "github.com/ethereum/go-ethereum/accounts/abi/bind" "github.com/ethereum/go-ethereum/common" @@ -15,6 +17,7 @@ import ( "github.com/ethereum/go-ethereum/ethclient" "github.com/ethereum/go-ethereum/log" "github.com/ethereum/go-ethereum/params" + "github.com/ethereum/go-ethereum/rpc" "github.com/stretchr/testify/require" "github.com/ethereum-optimism/optimism/op-e2e/bindings" @@ -31,6 +34,7 @@ type ProposerCfg struct { OutputOracleAddr *common.Address DisputeGameFactoryAddr *common.Address ProposalInterval time.Duration + ProposalRetryInterval time.Duration DisputeGameType uint32 ProposerKey *ecdsa.PrivateKey AllowNonFinalized bool @@ -65,6 +69,10 @@ func (f fakeTxMgr) Send(_ context.Context, _ txmgr.TxCandidate) (*types.Receipt, panic("unimplemented") } +func (f fakeTxMgr) SendAsync(ctx context.Context, candidate txmgr.TxCandidate, ch chan txmgr.SendResponse) { + panic("unimplemented") +} + func (f fakeTxMgr) Close() { } @@ -72,6 +80,14 @@ func (f fakeTxMgr) IsClosed() bool { return false } +func (f fakeTxMgr) API() rpc.API { + panic("unimplemented") +} + +func (f fakeTxMgr) SuggestGasPriceCaps(context.Context) (*big.Int, *big.Int, *big.Int, error) { + panic("unimplemented") +} + func NewL2Proposer(t Testing, log log.Logger, cfg *ProposerCfg, l1 *ethclient.Client, rollupCl *sources.RollupClient) *L2Proposer { proposerConfig := proposer.ProposerConfig{ PollInterval: time.Second, @@ -90,6 +106,7 @@ func NewL2Proposer(t Testing, log log.Logger, cfg *ProposerCfg, l1 *ethclient.Cl Cfg: proposerConfig, Txmgr: fakeTxMgr{from: crypto.PubkeyToAddress(cfg.ProposerKey.PublicKey)}, L1Client: l1, + Multicaller: batching.NewMultiCaller(l1.Client(), batching.DefaultBatchSize), RollupProvider: rollupProvider, } @@ -100,7 +117,7 @@ func NewL2Proposer(t Testing, log log.Logger, cfg *ProposerCfg, l1 *ethclient.Cl var l2OutputOracle *bindings.L2OutputOracleCaller var disputeGameFactory *bindings.DisputeGameFactoryCaller - if e2eutils.UseFPAC() { + if e2eutils.UseFaultProofs() { disputeGameFactory, err = bindings.NewDisputeGameFactoryCaller(*cfg.DisputeGameFactoryAddr, l1) require.NoError(t, err) } else { @@ -137,7 +154,7 @@ func (p *L2Proposer) sendTx(t Testing, data []byte) { require.NoError(t, err) var addr common.Address - if e2eutils.UseFPAC() { + if e2eutils.UseFaultProofs() { addr = *p.disputeGameFactoryAddr } else { addr = *p.l2OutputOracleAddr @@ -205,19 +222,13 @@ func toCallArg(msg ethereum.CallMsg) interface{} { } func (p *L2Proposer) fetchNextOutput(t Testing) (*eth.OutputResponse, bool, error) { - if e2eutils.UseFPAC() { - blockNumber, err := p.driver.FetchCurrentBlockNumber(t.Ctx()) - if err != nil { + if e2eutils.UseFaultProofs() { + output, shouldPropose, err := p.driver.FetchDGFOutput(t.Ctx()) + if err != nil || !shouldPropose { return nil, false, err } - - output, _, err := p.driver.FetchOutput(t.Ctx(), blockNumber) - if err != nil { - return nil, false, err - } - encodedBlockNumber := make([]byte, 32) - copy(encodedBlockNumber[32-len(blockNumber.Bytes()):], blockNumber.Bytes()) + binary.BigEndian.PutUint64(encodedBlockNumber[24:], output.BlockRef.Number) game, err := p.disputeGameFactory.Games(&bind.CallOpts{}, p.driver.Cfg.DisputeGameType, output.OutputRoot, encodedBlockNumber) if err != nil { return nil, false, err @@ -228,7 +239,7 @@ func (p *L2Proposer) fetchNextOutput(t Testing) (*eth.OutputResponse, bool, erro return output, true, nil } else { - return p.driver.FetchNextOutputInfo(t.Ctx()) + return p.driver.FetchL2OOOutput(t.Ctx()) } } @@ -247,9 +258,10 @@ func (p *L2Proposer) ActMakeProposalTx(t Testing) { } var txData []byte - if e2eutils.UseFPAC() { - txData, _, err = p.driver.ProposeL2OutputDGFTxData(output) + if e2eutils.UseFaultProofs() { + tx, err := p.driver.ProposeL2OutputDGFTxCandidate(context.Background(), output) require.NoError(t, err) + txData = tx.TxData } else { txData, err = p.driver.ProposeL2OutputTxData(output) require.NoError(t, err) diff --git a/op-e2e/actions/helpers/l2_sequencer.go b/op-e2e/actions/helpers/l2_sequencer.go new file mode 100644 index 000000000000..a7680fedb7cf --- /dev/null +++ b/op-e2e/actions/helpers/l2_sequencer.go @@ -0,0 +1,213 @@ +package helpers + +import ( + "context" + + "github.com/stretchr/testify/require" + "golang.org/x/time/rate" + + "github.com/ethereum/go-ethereum/log" + + "github.com/ethereum-optimism/optimism/op-node/metrics" + "github.com/ethereum-optimism/optimism/op-node/node" + "github.com/ethereum-optimism/optimism/op-node/node/safedb" + "github.com/ethereum-optimism/optimism/op-node/rollup" + "github.com/ethereum-optimism/optimism/op-node/rollup/async" + "github.com/ethereum-optimism/optimism/op-node/rollup/conductor" + "github.com/ethereum-optimism/optimism/op-node/rollup/confdepth" + "github.com/ethereum-optimism/optimism/op-node/rollup/derive" + "github.com/ethereum-optimism/optimism/op-node/rollup/driver" + "github.com/ethereum-optimism/optimism/op-node/rollup/engine" + "github.com/ethereum-optimism/optimism/op-node/rollup/event" + "github.com/ethereum-optimism/optimism/op-node/rollup/interop" + "github.com/ethereum-optimism/optimism/op-node/rollup/sequencing" + "github.com/ethereum-optimism/optimism/op-node/rollup/sync" + "github.com/ethereum-optimism/optimism/op-service/eth" +) + +// MockL1OriginSelector is a shim to override the origin as sequencer, so we can force it to stay on an older origin. +type MockL1OriginSelector struct { + actual *sequencing.L1OriginSelector + originOverride eth.L1BlockRef // override which origin gets picked +} + +func (m *MockL1OriginSelector) FindL1Origin(ctx context.Context, l2Head eth.L2BlockRef) (eth.L1BlockRef, error) { + if m.originOverride != (eth.L1BlockRef{}) { + return m.originOverride, nil + } + return m.actual.FindL1Origin(ctx, l2Head) +} + +// L2Sequencer is an actor that functions like a rollup node, +// without the full P2P/API/Node stack, but just the derivation state, and simplified driver with sequencing ability. +type L2Sequencer struct { + *L2Verifier + + sequencer *sequencing.Sequencer + + failL2GossipUnsafeBlock error // mock error + + mockL1OriginSelector *MockL1OriginSelector +} + +func NewL2Sequencer(t Testing, log log.Logger, l1 derive.L1Fetcher, blobSrc derive.L1BlobsFetcher, + altDASrc driver.AltDAIface, eng L2API, cfg *rollup.Config, seqConfDepth uint64, + interopBackend interop.InteropBackend) *L2Sequencer { + ver := NewL2Verifier(t, log, l1, blobSrc, altDASrc, eng, cfg, &sync.Config{}, safedb.Disabled, interopBackend) + attrBuilder := derive.NewFetchingAttributesBuilder(cfg, l1, eng) + seqConfDepthL1 := confdepth.NewConfDepth(seqConfDepth, ver.syncStatus.L1Head, l1) + l1OriginSelector := &MockL1OriginSelector{ + actual: sequencing.NewL1OriginSelector(log, cfg, seqConfDepthL1), + } + metr := metrics.NoopMetrics + seqStateListener := node.DisabledConfigPersistence{} + conduc := &conductor.NoOpConductor{} + asyncGossip := async.NoOpGossiper{} + seq := sequencing.NewSequencer(t.Ctx(), log, cfg, attrBuilder, l1OriginSelector, + seqStateListener, conduc, asyncGossip, metr, nil) + opts := event.DefaultRegisterOpts() + opts.Emitter = event.EmitterOpts{ + Limiting: true, + // TestSyncBatchType/DerivationWithFlakyL1RPC does *a lot* of quick retries + // TestL2BatcherBatchType/ExtendedTimeWithoutL1Batches as well. + Rate: rate.Limit(100_000), + Burst: 100_000, + OnLimited: func() { + log.Warn("Hitting events rate-limit. An events code-path may be hot-looping.") + t.Fatal("Tests must not hot-loop events") + }, + } + ver.eventSys.Register("sequencer", seq, opts) + require.NoError(t, seq.Init(t.Ctx(), true)) + return &L2Sequencer{ + L2Verifier: ver, + sequencer: seq, + mockL1OriginSelector: l1OriginSelector, + failL2GossipUnsafeBlock: nil, + } +} + +// ActL2StartBlock starts building of a new L2 block on top of the head +func (s *L2Sequencer) ActL2StartBlock(t Testing) { + if !s.L2PipelineIdle { + t.InvalidAction("cannot start L2 build when derivation is not idle") + return + } + if s.l2Building { + t.InvalidAction("already started building L2 block") + return + } + s.synchronousEvents.Emit(sequencing.SequencerActionEvent{}) + require.NoError(t, s.drainer.DrainUntil(event.Is[engine.BuildStartedEvent], false), + "failed to start block building") + + s.l2Building = true +} + +// ActL2EndBlock completes a new L2 block and applies it to the L2 chain as new canonical unsafe head +func (s *L2Sequencer) ActL2EndBlock(t Testing) { + if !s.l2Building { + t.InvalidAction("cannot end L2 block building when no block is being built") + return + } + s.l2Building = false + + s.synchronousEvents.Emit(sequencing.SequencerActionEvent{}) + require.NoError(t, s.drainer.DrainUntil(event.Is[engine.PayloadSuccessEvent], false), + "failed to complete block building") + + // After having built a L2 block, make sure to get an engine update processed. + // This will ensure the sync-status and such reflect the latest changes. + s.synchronousEvents.Emit(engine.TryUpdateEngineEvent{}) + s.synchronousEvents.Emit(engine.ForkchoiceRequestEvent{}) + require.NoError(t, s.drainer.DrainUntil(func(ev event.Event) bool { + x, ok := ev.(engine.ForkchoiceUpdateEvent) + return ok && x.UnsafeL2Head == s.engine.UnsafeL2Head() + }, false)) + require.Equal(t, s.engine.UnsafeL2Head(), s.syncStatus.SyncStatus().UnsafeL2, + "sync status must be accurate after block building") +} + +// ActL2KeepL1Origin makes the sequencer use the current L1 origin, even if the next origin is available. +func (s *L2Sequencer) ActL2KeepL1Origin(t Testing) { + parent := s.engine.UnsafeL2Head() + // force old origin, for testing purposes + oldOrigin, err := s.l1.L1BlockRefByHash(t.Ctx(), parent.L1Origin.Hash) + require.NoError(t, err, "failed to get current origin: %s", parent.L1Origin) + s.mockL1OriginSelector.originOverride = oldOrigin +} + +// ActBuildToL1Head builds empty blocks until (incl.) the L1 head becomes the L2 origin +func (s *L2Sequencer) ActBuildToL1Head(t Testing) { + for s.engine.UnsafeL2Head().L1Origin.Number < s.syncStatus.L1Head().Number { + s.ActL2PipelineFull(t) + s.ActL2StartBlock(t) + s.ActL2EndBlock(t) + } +} + +// ActBuildToL1HeadUnsafe builds empty blocks until (incl.) the L1 head becomes the L1 origin of the L2 head +func (s *L2Sequencer) ActBuildToL1HeadUnsafe(t Testing) { + for s.engine.UnsafeL2Head().L1Origin.Number < s.syncStatus.L1Head().Number { + // Note: the derivation pipeline does not run, we are just sequencing a block on top of the existing L2 chain. + s.ActL2StartBlock(t) + s.ActL2EndBlock(t) + } +} + +// ActBuildToL1HeadExcl builds empty blocks until (excl.) the L1 head becomes the L1 origin of the L2 head +func (s *L2Sequencer) ActBuildToL1HeadExcl(t Testing) { + for { + s.ActL2PipelineFull(t) + nextOrigin, err := s.mockL1OriginSelector.FindL1Origin(t.Ctx(), s.engine.UnsafeL2Head()) + require.NoError(t, err) + if nextOrigin.Number >= s.syncStatus.L1Head().Number { + break + } + s.ActL2StartBlock(t) + s.ActL2EndBlock(t) + } +} + +// ActBuildToL1HeadExclUnsafe builds empty blocks until (excl.) the L1 head becomes the L1 origin of the L2 head, without safe-head progression. +func (s *L2Sequencer) ActBuildToL1HeadExclUnsafe(t Testing) { + for { + // Note: the derivation pipeline does not run, we are just sequencing a block on top of the existing L2 chain. + nextOrigin, err := s.mockL1OriginSelector.FindL1Origin(t.Ctx(), s.engine.UnsafeL2Head()) + require.NoError(t, err) + if nextOrigin.Number >= s.syncStatus.L1Head().Number { + break + } + s.ActL2StartBlock(t) + s.ActL2EndBlock(t) + } +} + +func (s *L2Sequencer) ActBuildL2ToTime(t Testing, target uint64) { + for s.L2Unsafe().Time < target { + s.ActL2StartBlock(t) + s.ActL2EndBlock(t) + } +} + +func (s *L2Sequencer) ActBuildL2ToEcotone(t Testing) { + require.NotNil(t, s.RollupCfg.EcotoneTime, "cannot activate Ecotone when it is not scheduled") + for s.L2Unsafe().Time < *s.RollupCfg.EcotoneTime { + s.ActL2StartBlock(t) + 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) + } +} +func (s *L2Sequencer) ActBuildL2ToGranite(t Testing) { + require.NotNil(t, s.RollupCfg.GraniteTime, "cannot activate GraniteTime when it is not scheduled") + for s.L2Unsafe().Time < *s.RollupCfg.GraniteTime { + s.ActL2StartBlock(t) + s.ActL2EndBlock(t) + } +} diff --git a/op-e2e/actions/helpers/l2_verifier.go b/op-e2e/actions/helpers/l2_verifier.go new file mode 100644 index 000000000000..1594e1eb368c --- /dev/null +++ b/op-e2e/actions/helpers/l2_verifier.go @@ -0,0 +1,411 @@ +package helpers + +import ( + "context" + "errors" + "fmt" + "io" + + "github.com/stretchr/testify/require" + "golang.org/x/time/rate" + + "github.com/ethereum/go-ethereum/common" + "github.com/ethereum/go-ethereum/log" + gnode "github.com/ethereum/go-ethereum/node" + "github.com/ethereum/go-ethereum/rpc" + + "github.com/ethereum-optimism/optimism/op-node/node" + "github.com/ethereum-optimism/optimism/op-node/rollup" + "github.com/ethereum-optimism/optimism/op-node/rollup/attributes" + "github.com/ethereum-optimism/optimism/op-node/rollup/clsync" + "github.com/ethereum-optimism/optimism/op-node/rollup/derive" + "github.com/ethereum-optimism/optimism/op-node/rollup/driver" + "github.com/ethereum-optimism/optimism/op-node/rollup/engine" + "github.com/ethereum-optimism/optimism/op-node/rollup/event" + "github.com/ethereum-optimism/optimism/op-node/rollup/finality" + "github.com/ethereum-optimism/optimism/op-node/rollup/interop" + "github.com/ethereum-optimism/optimism/op-node/rollup/status" + "github.com/ethereum-optimism/optimism/op-node/rollup/sync" + "github.com/ethereum-optimism/optimism/op-service/client" + "github.com/ethereum-optimism/optimism/op-service/eth" + "github.com/ethereum-optimism/optimism/op-service/safego" + "github.com/ethereum-optimism/optimism/op-service/sources" + "github.com/ethereum-optimism/optimism/op-service/testutils" +) + +// L2Verifier is an actor that functions like a rollup node, +// without the full P2P/API/Node stack, but just the derivation state, and simplified driver. +type L2Verifier struct { + eventSys event.System + + log log.Logger + + Eng L2API + + syncStatus driver.SyncStatusTracker + + synchronousEvents event.Emitter + + drainer event.Drainer + + // L2 rollup + engine *engine.EngineController + derivationMetrics *testutils.TestDerivationMetrics + derivation *derive.DerivationPipeline + + safeHeadListener rollup.SafeHeadListener + syncCfg *sync.Config + + l1 derive.L1Fetcher + + L2PipelineIdle bool + l2Building bool + + RollupCfg *rollup.Config + + rpc *rpc.Server + + failRPC func(call []rpc.BatchElem) error // mock error + + // The L2Verifier actor is embedded in the L2Sequencer actor, + // but must not be copied for the deriver-functionality to modify the same state. + _ safego.NoCopy +} + +type L2API interface { + engine.Engine + L2BlockRefByNumber(ctx context.Context, num uint64) (eth.L2BlockRef, error) + InfoByHash(ctx context.Context, hash common.Hash) (eth.BlockInfo, error) + // GetProof returns a proof of the account, it may return a nil result without error if the address was not found. + GetProof(ctx context.Context, address common.Address, storage []common.Hash, blockTag string) (*eth.AccountResult, error) + OutputV0AtBlock(ctx context.Context, blockHash common.Hash) (*eth.OutputV0, error) +} + +type safeDB interface { + rollup.SafeHeadListener + node.SafeDBReader +} + +func NewL2Verifier(t Testing, log log.Logger, l1 derive.L1Fetcher, + blobsSrc derive.L1BlobsFetcher, altDASrc driver.AltDAIface, + eng L2API, cfg *rollup.Config, syncCfg *sync.Config, safeHeadListener safeDB, + interopBackend interop.InteropBackend, +) *L2Verifier { + ctx, cancel := context.WithCancel(context.Background()) + t.Cleanup(cancel) + + executor := event.NewGlobalSynchronous(ctx) + sys := event.NewSystem(log, executor) + t.Cleanup(sys.Stop) + opts := event.DefaultRegisterOpts() + opts.Emitter = event.EmitterOpts{ + Limiting: true, + // TestSyncBatchType/DerivationWithFlakyL1RPC does *a lot* of quick retries + // TestL2BatcherBatchType/ExtendedTimeWithoutL1Batches as well. + Rate: rate.Limit(100_000), + Burst: 100_000, + OnLimited: func() { + log.Warn("Hitting events rate-limit. An events code-path may be hot-looping.") + t.Fatal("Tests must not hot-loop events") + }, + } + + if interopBackend != nil { + sys.Register("interop", interop.NewInteropDeriver(log, cfg, ctx, interopBackend, eng), opts) + } + + metrics := &testutils.TestDerivationMetrics{} + ec := engine.NewEngineController(eng, log, metrics, cfg, syncCfg, + sys.Register("engine-controller", nil, opts)) + + sys.Register("engine-reset", + engine.NewEngineResetDeriver(ctx, log, cfg, l1, eng, syncCfg), opts) + + clSync := clsync.NewCLSync(log, cfg, metrics) + sys.Register("cl-sync", clSync, opts) + + var finalizer driver.Finalizer + if cfg.AltDAEnabled() { + finalizer = finality.NewAltDAFinalizer(ctx, log, cfg, l1, altDASrc) + } else { + finalizer = finality.NewFinalizer(ctx, log, cfg, l1) + } + sys.Register("finalizer", finalizer, opts) + + sys.Register("attributes-handler", + attributes.NewAttributesHandler(log, cfg, ctx, eng), opts) + + pipeline := derive.NewDerivationPipeline(log, cfg, l1, blobsSrc, altDASrc, eng, metrics) + sys.Register("pipeline", derive.NewPipelineDeriver(ctx, pipeline), opts) + + testActionEmitter := sys.Register("test-action", nil, opts) + + syncStatusTracker := status.NewStatusTracker(log, metrics) + sys.Register("status", syncStatusTracker, opts) + + sys.Register("sync", &driver.SyncDeriver{ + Derivation: pipeline, + SafeHeadNotifs: safeHeadListener, + CLSync: clSync, + Engine: ec, + SyncCfg: syncCfg, + Config: cfg, + L1: l1, + L2: eng, + Log: log, + Ctx: ctx, + Drain: executor.Drain, + }, opts) + + sys.Register("engine", engine.NewEngDeriver(log, ctx, cfg, metrics, ec), opts) + + rollupNode := &L2Verifier{ + eventSys: sys, + log: log, + Eng: eng, + engine: ec, + derivationMetrics: metrics, + derivation: pipeline, + safeHeadListener: safeHeadListener, + syncCfg: syncCfg, + drainer: executor, + l1: l1, + syncStatus: syncStatusTracker, + L2PipelineIdle: true, + l2Building: false, + RollupCfg: cfg, + rpc: rpc.NewServer(), + synchronousEvents: testActionEmitter, + } + sys.Register("verifier", rollupNode, opts) + + t.Cleanup(rollupNode.rpc.Stop) + + // setup RPC server for rollup node, hooked to the actor as backend + m := &testutils.TestRPCMetrics{} + backend := &l2VerifierBackend{verifier: rollupNode} + apis := []rpc.API{ + { + Namespace: "optimism", + Service: node.NewNodeAPI(cfg, eng, backend, safeHeadListener, log, m), + Public: true, + Authenticated: false, + }, + { + Namespace: "admin", + Version: "", + Service: node.NewAdminAPI(backend, m, log), + Public: true, // TODO: this field is deprecated. Do we even need this anymore? + Authenticated: false, + }, + } + require.NoError(t, gnode.RegisterApis(apis, nil, rollupNode.rpc), "failed to set up APIs") + return rollupNode +} + +type l2VerifierBackend struct { + verifier *L2Verifier +} + +func (s *l2VerifierBackend) BlockRefWithStatus(ctx context.Context, num uint64) (eth.L2BlockRef, *eth.SyncStatus, error) { + ref, err := s.verifier.Eng.L2BlockRefByNumber(ctx, num) + return ref, s.verifier.SyncStatus(), err +} + +func (s *l2VerifierBackend) SyncStatus(ctx context.Context) (*eth.SyncStatus, error) { + return s.verifier.SyncStatus(), nil +} + +func (s *l2VerifierBackend) ResetDerivationPipeline(ctx context.Context) error { + s.verifier.derivation.Reset() + return nil +} + +func (s *l2VerifierBackend) StartSequencer(ctx context.Context, blockHash common.Hash) error { + return nil +} + +func (s *l2VerifierBackend) StopSequencer(ctx context.Context) (common.Hash, error) { + return common.Hash{}, errors.New("stopping the L2Verifier sequencer is not supported") +} + +func (s *l2VerifierBackend) SequencerActive(ctx context.Context) (bool, error) { + return false, nil +} + +func (s *l2VerifierBackend) OverrideLeader(ctx context.Context) error { + return nil +} + +func (s *l2VerifierBackend) OnUnsafeL2Payload(ctx context.Context, envelope *eth.ExecutionPayloadEnvelope) error { + return nil +} + +func (s *L2Verifier) DerivationMetricsTracer() *testutils.TestDerivationMetrics { + return s.derivationMetrics +} + +func (s *L2Verifier) L2Finalized() eth.L2BlockRef { + return s.engine.Finalized() +} + +func (s *L2Verifier) L2Safe() eth.L2BlockRef { + return s.engine.SafeL2Head() +} + +func (s *L2Verifier) L2PendingSafe() eth.L2BlockRef { + return s.engine.PendingSafeL2Head() +} + +func (s *L2Verifier) L2Unsafe() eth.L2BlockRef { + return s.engine.UnsafeL2Head() +} + +func (s *L2Verifier) L2BackupUnsafe() eth.L2BlockRef { + return s.engine.BackupUnsafeL2Head() +} + +func (s *L2Verifier) SyncStatus() *eth.SyncStatus { + return s.syncStatus.SyncStatus() +} + +func (s *L2Verifier) RollupClient() *sources.RollupClient { + return sources.NewRollupClient(s.RPCClient()) +} + +func (s *L2Verifier) RPCClient() client.RPC { + cl := rpc.DialInProc(s.rpc) + return testutils.RPCErrFaker{ + RPC: client.NewBaseRPCClient(cl), + ErrFn: func(call []rpc.BatchElem) error { + if s.failRPC == nil { + return nil + } + return s.failRPC(call) + }, + } +} + +// ActRPCFail makes the next L2 RPC request fail +func (s *L2Verifier) ActRPCFail(t Testing) { + if s.failRPC != nil { // already set to fail? + t.InvalidAction("already set a mock rpc error") + return + } + s.failRPC = func(call []rpc.BatchElem) error { + s.failRPC = nil + return errors.New("mock RPC error") + } +} + +func (s *L2Verifier) ActL1HeadSignal(t Testing) { + head, err := s.l1.L1BlockRefByLabel(t.Ctx(), eth.Unsafe) + require.NoError(t, err) + s.synchronousEvents.Emit(status.L1UnsafeEvent{L1Unsafe: head}) + require.NoError(t, s.drainer.DrainUntil(func(ev event.Event) bool { + x, ok := ev.(status.L1UnsafeEvent) + return ok && x.L1Unsafe == head + }, false)) + require.Equal(t, head, s.syncStatus.SyncStatus().HeadL1) +} + +func (s *L2Verifier) ActL1SafeSignal(t Testing) { + safe, err := s.l1.L1BlockRefByLabel(t.Ctx(), eth.Safe) + require.NoError(t, err) + s.synchronousEvents.Emit(status.L1SafeEvent{L1Safe: safe}) + require.NoError(t, s.drainer.DrainUntil(func(ev event.Event) bool { + x, ok := ev.(status.L1SafeEvent) + return ok && x.L1Safe == safe + }, false)) + require.Equal(t, safe, s.syncStatus.SyncStatus().SafeL1) +} + +func (s *L2Verifier) ActL1FinalizedSignal(t Testing) { + finalized, err := s.l1.L1BlockRefByLabel(t.Ctx(), eth.Finalized) + require.NoError(t, err) + s.synchronousEvents.Emit(finality.FinalizeL1Event{FinalizedL1: finalized}) + require.NoError(t, s.drainer.DrainUntil(func(ev event.Event) bool { + x, ok := ev.(finality.FinalizeL1Event) + return ok && x.FinalizedL1 == finalized + }, false)) + require.Equal(t, finalized, s.syncStatus.SyncStatus().FinalizedL1) +} + +func (s *L2Verifier) ActInteropBackendCheck(t Testing) { + s.synchronousEvents.Emit(engine.CrossUpdateRequestEvent{ + CrossUnsafe: true, + CrossSafe: true, + }) +} + +func (s *L2Verifier) OnEvent(ev event.Event) bool { + switch x := ev.(type) { + case rollup.L1TemporaryErrorEvent: + s.log.Warn("L1 temporary error", "err", x.Err) + case rollup.EngineTemporaryErrorEvent: + s.log.Warn("Engine temporary error", "err", x.Err) + if errors.Is(x.Err, sync.WrongChainErr) { // action-tests don't back off on temporary errors. Avoid a bad genesis setup from looping. + panic(fmt.Errorf("genesis setup issue: %w", x.Err)) + } + case rollup.ResetEvent: + s.log.Warn("Derivation pipeline is being reset", "err", x.Err) + case rollup.CriticalErrorEvent: + panic(fmt.Errorf("derivation failed critically: %w", x.Err)) + case derive.DeriverIdleEvent: + s.L2PipelineIdle = true + case derive.PipelineStepEvent: + s.L2PipelineIdle = false + case driver.StepReqEvent: + s.synchronousEvents.Emit(driver.StepEvent{}) + default: + return false + } + return true +} + +func (s *L2Verifier) ActL2EventsUntilPending(t Testing, num uint64) { + s.ActL2EventsUntil(t, func(ev event.Event) bool { + x, ok := ev.(engine.PendingSafeUpdateEvent) + return ok && x.PendingSafe.Number == num + }, 1000, false) +} + +func (s *L2Verifier) ActL2EventsUntil(t Testing, fn func(ev event.Event) bool, max int, excl bool) { + t.Helper() + if s.l2Building { + t.InvalidAction("cannot derive new data while building L2 block") + return + } + for i := 0; i < max; i++ { + err := s.drainer.DrainUntil(fn, excl) + if err == nil { + return + } + if err == io.EOF { + s.synchronousEvents.Emit(driver.StepEvent{}) + } + } + t.Fatalf("event condition did not hit, ran maximum number of steps: %d", max) +} + +func (s *L2Verifier) ActL2PipelineFull(t Testing) { + s.synchronousEvents.Emit(driver.StepEvent{}) + require.NoError(t, s.drainer.Drain(), "complete all event processing triggered by deriver step") +} + +// ActL2UnsafeGossipReceive creates an action that can receive an unsafe execution payload, like gossipsub +func (s *L2Verifier) ActL2UnsafeGossipReceive(payload *eth.ExecutionPayloadEnvelope) Action { + return func(t Testing) { + s.synchronousEvents.Emit(clsync.ReceivedUnsafePayloadEvent{Envelope: payload}) + } +} + +// ActL2InsertUnsafePayload creates an action that can insert an unsafe execution payload +func (s *L2Verifier) ActL2InsertUnsafePayload(payload *eth.ExecutionPayloadEnvelope) Action { + return func(t Testing) { + ref, err := derive.PayloadToBlockRef(s.RollupCfg, payload.ExecutionPayload) + require.NoError(t, err) + err = s.engine.InsertUnsafePayload(t.Ctx(), payload, ref) + require.NoError(t, err) + } +} diff --git a/op-e2e/actions/helpers/setups.go b/op-e2e/actions/helpers/setups.go new file mode 100644 index 000000000000..26e19eae82a0 --- /dev/null +++ b/op-e2e/actions/helpers/setups.go @@ -0,0 +1,75 @@ +package helpers + +import ( + altda "github.com/ethereum-optimism/optimism/op-alt-da" + "github.com/ethereum-optimism/optimism/op-e2e/actions/upgrades/helpers" + "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" + "github.com/ethereum-optimism/optimism/op-service/sources" + "github.com/ethereum-optimism/optimism/op-service/testlog" + "github.com/ethereum/go-ethereum/common" + "github.com/ethereum/go-ethereum/common/hexutil" + "github.com/ethereum/go-ethereum/log" + "github.com/stretchr/testify/require" +) + +func SetupSequencerTest(t Testing, sd *e2eutils.SetupData, log log.Logger, opts ...SequencerOpt) (*L1Miner, *L2Engine, *L2Sequencer) { + jwtPath := e2eutils.WriteDefaultJWT(t) + cfg := DefaultSequencerConfig() + for _, opt := range opts { + opt(cfg) + } + + miner := NewL1Miner(t, log.New("role", "l1-miner"), sd.L1Cfg) + + l1F, err := sources.NewL1Client(miner.RPCClient(), log, nil, sources.L1ClientDefaultConfig(sd.RollupCfg, false, sources.RPCKindStandard)) + require.NoError(t, err) + engine := NewL2Engine(t, log.New("role", "sequencer-engine"), sd.L2Cfg, sd.RollupCfg.Genesis.L1, jwtPath, EngineWithP2P()) + l2Cl, err := sources.NewEngineClient(engine.RPCClient(), log, nil, sources.EngineClientDefaultConfig(sd.RollupCfg)) + require.NoError(t, err) + + sequencer := NewL2Sequencer(t, log.New("role", "sequencer"), l1F, miner.BlobStore(), altda.Disabled, l2Cl, sd.RollupCfg, 0, cfg.InteropBackend) + return miner, engine, sequencer +} + +func SetupVerifier(t Testing, sd *e2eutils.SetupData, log log.Logger, + l1F derive.L1Fetcher, blobSrc derive.L1BlobsFetcher, syncCfg *sync.Config, opts ...VerifierOpt) (*L2Engine, *L2Verifier) { + cfg := DefaultVerifierCfg() + for _, opt := range opts { + opt(cfg) + } + jwtPath := e2eutils.WriteDefaultJWT(t) + engine := NewL2Engine(t, log.New("role", "verifier-engine"), sd.L2Cfg, sd.RollupCfg.Genesis.L1, jwtPath, EngineWithP2P()) + engCl := engine.EngineClient(t, sd.RollupCfg) + verifier := NewL2Verifier(t, log.New("role", "verifier"), l1F, blobSrc, altda.Disabled, engCl, sd.RollupCfg, syncCfg, cfg.SafeHeadListener, cfg.InteropBackend) + return engine, verifier +} + +func SetupVerifierOnlyTest(t Testing, sd *e2eutils.SetupData, log log.Logger) (*L1Miner, *L2Engine, *L2Verifier) { + miner := NewL1Miner(t, log, sd.L1Cfg) + l1Cl := miner.L1Client(t, sd.RollupCfg) + engine, verifier := SetupVerifier(t, sd, log, l1Cl, miner.BlobStore(), &sync.Config{}) + return miner, engine, verifier +} + +func SetupReorgTest(t Testing, config *e2eutils.TestParams, deltaTimeOffset *hexutil.Uint64) (*e2eutils.SetupData, *e2eutils.DeployParams, *L1Miner, *L2Sequencer, *L2Engine, *L2Verifier, *L2Engine, *L2Batcher) { + dp := e2eutils.MakeDeployParams(t, config) + helpers.ApplyDeltaTimeOffset(dp, deltaTimeOffset) + + sd := e2eutils.Setup(t, dp, DefaultAlloc) + log := testlog.Logger(t, log.LevelDebug) + + return SetupReorgTestActors(t, dp, sd, log) +} + +func SetupReorgTestActors(t Testing, dp *e2eutils.DeployParams, sd *e2eutils.SetupData, log log.Logger) (*e2eutils.SetupData, *e2eutils.DeployParams, *L1Miner, *L2Sequencer, *L2Engine, *L2Verifier, *L2Engine, *L2Batcher) { + miner, seqEngine, sequencer := SetupSequencerTest(t, sd, log) + miner.ActL1SetFeeRecipient(common.Address{'A'}) + sequencer.ActL2PipelineFull(t) + verifEngine, verifier := SetupVerifier(t, sd, log, miner.L1Client(t, sd.RollupCfg), miner.BlobStore(), &sync.Config{}) + rollupSeqCl := sequencer.RollupClient() + batcher := NewL2Batcher(log, sd.RollupCfg, DefaultBatcherCfg(dp), + rollupSeqCl, miner.EthClient(), seqEngine.EthClient(), seqEngine.EngineClient(t, sd.RollupCfg)) + return sd, dp, miner, sequencer, seqEngine, verifier, verifEngine, batcher +} diff --git a/op-e2e/actions/helpers/tx_helper.go b/op-e2e/actions/helpers/tx_helper.go new file mode 100644 index 000000000000..8174563102c8 --- /dev/null +++ b/op-e2e/actions/helpers/tx_helper.go @@ -0,0 +1,49 @@ +package helpers + +import ( + "context" + "math/big" + "time" + + "github.com/ethereum-optimism/optimism/op-e2e/e2eutils/wait" + "github.com/ethereum/go-ethereum/common" + "github.com/ethereum/go-ethereum/core/types" + "github.com/stretchr/testify/require" +) + +// firstValidTx finds the first transaction that is valid for inclusion from the specified address. +// It uses a waiter and filtering of already included transactions to avoid race conditions with the async +// updates to the transaction pool. +func firstValidTx( + t Testing, + from common.Address, + pendingIndices func(common.Address) uint64, + contentFrom func(common.Address) ([]*types.Transaction, []*types.Transaction), + nonceAt func(context.Context, common.Address, *big.Int) (uint64, error), +) *types.Transaction { + var i uint64 + var txs []*types.Transaction + var q []*types.Transaction + // Wait for the tx to be in the pending tx queue + ctx, cancel := context.WithTimeout(context.Background(), 30*time.Second) + defer cancel() + err := wait.For(ctx, time.Second, func() (bool, error) { + i = pendingIndices(from) + txs, q = contentFrom(from) + // Remove any transactions that have already been included in the head block + // The tx pool only prunes included transactions async so they may still be in the list + nonce, err := nonceAt(ctx, from, nil) + if err != nil { + return false, err + } + for len(txs) > 0 && txs[0].Nonce() < nonce { + t.Logf("Removing already included transaction from list of length %v", len(txs)) + txs = txs[1:] + } + return uint64(len(txs)) > i, nil + }) + require.NoError(t, err, + "no pending txs from %s, and have %d unprocessable queued txs from this account: %w", from, len(q), err) + + return txs[i] +} diff --git a/op-e2e/actions/user.go b/op-e2e/actions/helpers/user.go similarity index 91% rename from op-e2e/actions/user.go rename to op-e2e/actions/helpers/user.go index 674a27fdcac2..2acd6ccaf8e7 100644 --- a/op-e2e/actions/user.go +++ b/op-e2e/actions/helpers/user.go @@ -1,6 +1,7 @@ -package actions +package helpers import ( + "context" "crypto/ecdsa" "errors" "fmt" @@ -8,6 +9,10 @@ import ( "math/rand" "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-e2e/e2eutils/wait" + "github.com/ethereum-optimism/optimism/op-service/sources/batching" "github.com/ethereum/go-ethereum" "github.com/ethereum/go-ethereum/accounts/abi/bind" "github.com/ethereum/go-ethereum/common" @@ -19,10 +24,10 @@ import ( "github.com/stretchr/testify/require" "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" + e2ehelpers "github.com/ethereum-optimism/optimism/op-e2e/system/helpers" "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" @@ -125,6 +130,10 @@ func (s *BasicUser[B]) SetUserEnv(env *BasicUserEnv[B]) { s.env = env } +func (s *BasicUser[B]) Signer() types.Signer { + return s.env.Signer +} + func (s *BasicUser[B]) signerFn(address common.Address, tx *types.Transaction) (*types.Transaction, error) { if address != s.address { return nil, bind.ErrNotAuthorized @@ -226,9 +235,7 @@ func (s *BasicUser[B]) LastTxReceipt(t Testing) *types.Receipt { return receipt } -// ActMakeTx makes a tx with the predetermined contents (see randomization and other actions) -// and sends it to the tx pool -func (s *BasicUser[B]) ActMakeTx(t Testing) { +func (s *BasicUser[B]) MakeTransaction(t Testing) *types.Transaction { gas, err := s.env.EthCl.EstimateGas(t.Ctx(), ethereum.CallMsg{ From: s.address, To: s.txToAddr, @@ -238,7 +245,7 @@ func (s *BasicUser[B]) ActMakeTx(t Testing) { Data: s.txCallData, }) require.NoError(t, err, "gas estimation should pass") - tx := types.MustSignNewTx(s.account, s.env.Signer, &types.DynamicFeeTx{ + return types.MustSignNewTx(s.account, s.env.Signer, &types.DynamicFeeTx{ To: s.txToAddr, GasFeeCap: s.txOpts.GasFeeCap, GasTipCap: s.txOpts.GasTipCap, @@ -248,7 +255,13 @@ func (s *BasicUser[B]) ActMakeTx(t Testing) { Gas: gas, Data: s.txCallData, }) - err = s.env.EthCl.SendTransaction(t.Ctx(), tx) +} + +// ActMakeTx makes a tx with the predetermined contents (see randomization and other actions) +// and sends it to the tx pool +func (s *BasicUser[B]) ActMakeTx(t Testing) { + tx := s.MakeTransaction(t) + err := s.env.EthCl.SendTransaction(t.Ctx(), tx) require.NoError(t, err, "must send tx") s.lastTxHash = tx.Hash() // reset the calldata @@ -414,7 +427,7 @@ func (s *CrossLayerUser) getLatestWithdrawalParams(t Testing) (*withdrawals.Prov var l2OutputBlockNr *big.Int var l2OutputBlock *types.Block - if e2eutils.UseFPAC() { + if e2eutils.UseFaultProofs() { latestGame, err := withdrawals.FindLatestGame(t.Ctx(), &s.L1.env.Bindings.DisputeGameFactory.DisputeGameFactoryCaller, &s.L1.env.Bindings.OptimismPortal2.OptimismPortal2Caller) require.NoError(t, err) l2OutputBlockNr = new(big.Int).SetBytes(latestGame.ExtraData[0:32]) @@ -431,7 +444,7 @@ func (s *CrossLayerUser) getLatestWithdrawalParams(t Testing) (*withdrawals.Prov return nil, fmt.Errorf("the latest L2 output is %d and is not past L2 block %d that includes the withdrawal yet, no withdrawal can be proved yet", l2OutputBlock.NumberU64(), l2WithdrawalBlock.NumberU64()) } - if !e2eutils.UseFPAC() { + if !e2eutils.UseFaultProofs() { finalizationPeriod, err := s.L1.env.Bindings.L2OutputOracle.FINALIZATIONPERIODSECONDS(&bind.CallOpts{}) require.NoError(t, err) l1Head, err := s.L1.env.EthCl.HeaderByNumber(t.Ctx(), nil) @@ -444,13 +457,13 @@ func (s *CrossLayerUser) getLatestWithdrawalParams(t Testing) (*withdrawals.Prov header, err := s.L2.env.EthCl.HeaderByNumber(t.Ctx(), l2OutputBlockNr) require.NoError(t, err) - params, err := e2e.ProveWithdrawalParameters(t.Ctx(), s.L2.env.Bindings.ProofClient, s.L2.env.EthCl, s.L2.env.EthCl, s.lastL2WithdrawalTxHash, header, &s.L1.env.Bindings.L2OutputOracle.L2OutputOracleCaller, &s.L1.env.Bindings.DisputeGameFactory.DisputeGameFactoryCaller, &s.L1.env.Bindings.OptimismPortal2.OptimismPortal2Caller) + params, err := e2ehelpers.ProveWithdrawalParameters(t.Ctx(), s.L2.env.Bindings.ProofClient, s.L2.env.EthCl, s.L2.env.EthCl, s.lastL2WithdrawalTxHash, header, &s.L1.env.Bindings.L2OutputOracle.L2OutputOracleCaller, &s.L1.env.Bindings.DisputeGameFactory.DisputeGameFactoryCaller, &s.L1.env.Bindings.OptimismPortal2.OptimismPortal2Caller) require.NoError(t, err) return ¶ms, nil } -func (s *CrossLayerUser) getDisputeGame(t Testing, params withdrawals.ProvenWithdrawalParameters) (*legacybindings.FaultDisputeGame, error) { +func (s *CrossLayerUser) getDisputeGame(t Testing, params withdrawals.ProvenWithdrawalParameters) (*legacybindings.FaultDisputeGame, common.Address, error) { wd := crossdomain.Withdrawal{ Nonce: params.Nonce, Sender: ¶ms.Sender, @@ -473,7 +486,7 @@ func (s *CrossLayerUser) getDisputeGame(t Testing, params withdrawals.ProvenWith proxy, err := legacybindings.NewFaultDisputeGame(game.DisputeGameProxy, s.L1.env.EthCl) require.Nil(t, err) - return proxy, nil + return proxy, game.DisputeGameProxy, nil } // ActCompleteWithdrawal creates a L1 proveWithdrawal tx for latest withdrawal. @@ -562,13 +575,21 @@ func (s *CrossLayerUser) ResolveClaim(t Testing, l2TxHash common.Hash) common.Ha return common.Hash{} } - game, err := s.getDisputeGame(t, *params) + game, gameAddr, err := s.getDisputeGame(t, *params) require.NoError(t, err) - expiry, err := game.MaxClockDuration(&bind.CallOpts{}) + caller := batching.NewMultiCaller(s.L1.env.EthCl.Client(), batching.DefaultBatchSize) + gameContract, err := contracts.NewFaultDisputeGameContract(context.Background(), metrics.NoopContractMetrics, gameAddr, caller) require.Nil(t, err) - time.Sleep(time.Duration(expiry) * time.Second) + timedCtx, cancel := context.WithTimeout(context.Background(), 30*time.Second) + defer cancel() + require.NoError(t, wait.For(timedCtx, time.Second, func() (bool, error) { + err := gameContract.CallResolveClaim(context.Background(), 0) + t.Logf("Could not resolve dispute game claim: %v", err) + return err == nil, nil + })) + resolveClaimTx, err := game.ResolveClaim(&s.L1.txOpts, common.Big0, common.Big0) require.Nil(t, err) @@ -592,7 +613,7 @@ func (s *CrossLayerUser) Resolve(t Testing, l2TxHash common.Hash) common.Hash { return common.Hash{} } - game, err := s.getDisputeGame(t, *params) + game, _, err := s.getDisputeGame(t, *params) require.NoError(t, err) resolveTx, err := game.Resolve(&s.L1.txOpts) diff --git a/op-e2e/actions/user_test.go b/op-e2e/actions/helpers/user_test.go similarity index 89% rename from op-e2e/actions/user_test.go rename to op-e2e/actions/helpers/user_test.go index b6f3f370ee27..8ee60aa680e3 100644 --- a/op-e2e/actions/user_test.go +++ b/op-e2e/actions/helpers/user_test.go @@ -1,4 +1,4 @@ -package actions +package helpers import ( "fmt" @@ -6,6 +6,8 @@ import ( "testing" "time" + bindingspreview "github.com/ethereum-optimism/optimism/op-node/bindings/preview" + "github.com/ethereum/go-ethereum/accounts/abi/bind" "github.com/ethereum/go-ethereum/common/hexutil" "github.com/ethereum/go-ethereum/core/types" "github.com/ethereum/go-ethereum/log" @@ -107,7 +109,7 @@ func TestCrossLayerUser(t *testing.T) { func runCrossLayerUserTest(gt *testing.T, test hardforkScheduledTest) { t := NewDefaultTesting(gt) - dp := e2eutils.MakeDeployParams(t, defaultRollupTestParams) + dp := e2eutils.MakeDeployParams(t, DefaultRollupTestParams) // This overwrites all deploy-config settings, // so even when the deploy-config defaults change, we test the right transitions. dp.DeployConfig.L2GenesisRegolithTimeOffset = test.regolithTime @@ -123,30 +125,36 @@ func runCrossLayerUserTest(gt *testing.T, test hardforkScheduledTest) { require.Zero(t, uint64(*test.ecotoneTime)%uint64(dp.DeployConfig.L2BlockTime), "ecotone fork must be aligned") } - sd := e2eutils.Setup(t, dp, defaultAlloc) + sd := e2eutils.Setup(t, dp, DefaultAlloc) log := testlog.Logger(t, log.LevelDebug) require.Equal(t, dp.Secrets.Addresses().Batcher, dp.DeployConfig.BatchSenderAddress) require.Equal(t, dp.Secrets.Addresses().Proposer, dp.DeployConfig.L2OutputOracleProposer) - miner, seqEngine, seq := setupSequencerTest(t, sd, log) + miner, seqEngine, seq := SetupSequencerTest(t, sd, log) batcher := NewL2Batcher(log, sd.RollupCfg, DefaultBatcherCfg(dp), seq.RollupClient(), miner.EthClient(), seqEngine.EthClient(), seqEngine.EngineClient(t, sd.RollupCfg)) var proposer *L2Proposer - if e2eutils.UseFPAC() { + if e2eutils.UseFaultProofs() { + optimismPortal2Contract, err := bindingspreview.NewOptimismPortal2(sd.DeploymentsL1.OptimismPortalProxy, miner.EthClient()) + require.NoError(t, err) + respectedGameType, err := optimismPortal2Contract.RespectedGameType(&bind.CallOpts{}) + require.NoError(t, err) proposer = NewL2Proposer(t, log, &ProposerCfg{ DisputeGameFactoryAddr: &sd.DeploymentsL1.DisputeGameFactoryProxy, ProposalInterval: 6 * time.Second, - DisputeGameType: 0, + ProposalRetryInterval: 3 * time.Second, + DisputeGameType: respectedGameType, ProposerKey: dp.Secrets.Proposer, AllowNonFinalized: true, }, miner.EthClient(), seq.RollupClient()) } else { proposer = NewL2Proposer(t, log, &ProposerCfg{ - OutputOracleAddr: &sd.DeploymentsL1.L2OutputOracleProxy, - ProposerKey: dp.Secrets.Proposer, - AllowNonFinalized: true, + OutputOracleAddr: &sd.DeploymentsL1.L2OutputOracleProxy, + ProposerKey: dp.Secrets.Proposer, + ProposalRetryInterval: 3 * time.Second, + AllowNonFinalized: true, }, miner.EthClient(), seq.RollupClient()) } @@ -191,7 +199,7 @@ func runCrossLayerUserTest(gt *testing.T, test hardforkScheduledTest) { require.NoError(t, err) require.True(t, infoTx.IsDepositTx()) // Should only be a system tx if regolith is not enabled - require.Equal(t, !seq.rollupCfg.IsRegolith(seq.L2Unsafe().Time), infoTx.IsSystemTx()) + require.Equal(t, !seq.RollupCfg.IsRegolith(seq.L2Unsafe().Time), infoTx.IsSystemTx()) // regular L2 tx, in new L2 block alice.L2.ActResetTxOpts(t) @@ -279,8 +287,8 @@ func runCrossLayerUserTest(gt *testing.T, test hardforkScheduledTest) { miner.ActL1StartBlock(13)(t) miner.ActL1EndBlock(t) - // If using FPAC we need to resolve the game - if e2eutils.UseFPAC() { + // If using fault proofs we need to resolve the game + if e2eutils.UseFaultProofs() { // Resolve the root claim alice.ActResolveClaim(t) miner.ActL1StartBlock(12)(t) @@ -312,5 +320,5 @@ func runCrossLayerUserTest(gt *testing.T, test hardforkScheduledTest) { require.NoError(t, err) require.True(t, infoTx.IsDepositTx()) // Should only be a system tx if regolith is not enabled - require.Equal(t, !seq.rollupCfg.IsRegolith(seq.L2Unsafe().Time), infoTx.IsSystemTx()) + require.Equal(t, !seq.RollupCfg.IsRegolith(seq.L2Unsafe().Time), infoTx.IsSystemTx()) } diff --git a/op-e2e/actions/helpers/utils.go b/op-e2e/actions/helpers/utils.go new file mode 100644 index 000000000000..f4f1b812cbaa --- /dev/null +++ b/op-e2e/actions/helpers/utils.go @@ -0,0 +1,79 @@ +package helpers + +import ( + "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/interop" + "github.com/ethereum/go-ethereum/crypto" + "github.com/ethereum/go-ethereum/eth/ethconfig" + "github.com/ethereum/go-ethereum/node" + "github.com/ethereum/go-ethereum/p2p" +) + +var DefaultRollupTestParams = &e2eutils.TestParams{ + MaxSequencerDrift: 40, + SequencerWindowSize: 120, + ChannelTimeout: 120, + L1BlockTime: 15, +} + +var DefaultAlloc = &e2eutils.AllocParams{PrefundTestUsers: true} + +type VerifierCfg struct { + SafeHeadListener safeDB + InteropBackend interop.InteropBackend +} + +type VerifierOpt func(opts *VerifierCfg) + +func WithSafeHeadListener(l safeDB) VerifierOpt { + return func(opts *VerifierCfg) { + opts.SafeHeadListener = l + } +} + +func WithInteropBackend(b interop.InteropBackend) VerifierOpt { + return func(opts *VerifierCfg) { + opts.InteropBackend = b + } +} + +func DefaultVerifierCfg() *VerifierCfg { + return &VerifierCfg{ + SafeHeadListener: safedb.Disabled, + } +} + +func EngineWithP2P() EngineOption { + return func(ethCfg *ethconfig.Config, nodeCfg *node.Config) error { + p2pKey, err := crypto.GenerateKey() + if err != nil { + return err + } + nodeCfg.P2P = p2p.Config{ + MaxPeers: 100, + NoDiscovery: true, + ListenAddr: "127.0.0.1:0", + PrivateKey: p2pKey, + } + return nil + } +} + +type SequencerCfg struct { + VerifierCfg +} + +func DefaultSequencerConfig() *SequencerCfg { + return &SequencerCfg{VerifierCfg: *DefaultVerifierCfg()} +} + +type SequencerOpt func(opts *SequencerCfg) + +func WithVerifierOpts(opts ...VerifierOpt) SequencerOpt { + return func(cfg *SequencerCfg) { + for _, opt := range opts { + opt(&cfg.VerifierCfg) + } + } +} diff --git a/op-e2e/actions/interop/interop_test.go b/op-e2e/actions/interop/interop_test.go new file mode 100644 index 000000000000..4015ffa29ce9 --- /dev/null +++ b/op-e2e/actions/interop/interop_test.go @@ -0,0 +1,124 @@ +package interop + +import ( + "testing" + + "github.com/ethereum-optimism/optimism/op-e2e/actions/helpers" + "github.com/stretchr/testify/require" + + "github.com/ethereum/go-ethereum/log" + + "github.com/ethereum-optimism/optimism/op-e2e/e2eutils" + "github.com/ethereum-optimism/optimism/op-node/rollup/interop" + "github.com/ethereum-optimism/optimism/op-node/rollup/sync" + "github.com/ethereum-optimism/optimism/op-service/testlog" + "github.com/ethereum-optimism/optimism/op-service/testutils" + "github.com/ethereum-optimism/optimism/op-supervisor/supervisor/types" +) + +var _ interop.InteropBackend = (*testutils.MockInteropBackend)(nil) + +func TestInteropVerifier(gt *testing.T) { + t := helpers.NewDefaultTesting(gt) + dp := e2eutils.MakeDeployParams(t, helpers.DefaultRollupTestParams) + sd := e2eutils.Setup(t, dp, helpers.DefaultAlloc) + // Temporary work-around: interop needs to be active, for cross-safety to not be instant. + // The state genesis in this test is pre-interop however. + sd.RollupCfg.InteropTime = new(uint64) + logger := testlog.Logger(t, log.LevelDebug) + seqMockBackend := &testutils.MockInteropBackend{} + l1Miner, seqEng, seq := helpers.SetupSequencerTest(t, sd, logger, + helpers.WithVerifierOpts(helpers.WithInteropBackend(seqMockBackend))) + + batcher := helpers.NewL2Batcher(logger, sd.RollupCfg, helpers.DefaultBatcherCfg(dp), + seq.RollupClient(), l1Miner.EthClient(), seqEng.EthClient(), seqEng.EngineClient(t, sd.RollupCfg)) + + verMockBackend := &testutils.MockInteropBackend{} + _, ver := helpers.SetupVerifier(t, sd, logger, + l1Miner.L1Client(t, sd.RollupCfg), l1Miner.BlobStore(), &sync.Config{}, + helpers.WithInteropBackend(verMockBackend)) + + seq.ActL2PipelineFull(t) + ver.ActL2PipelineFull(t) + + l2ChainID := types.ChainIDFromBig(sd.RollupCfg.L2ChainID) + seqMockBackend.ExpectCheckBlock(l2ChainID, 1, types.Unsafe, nil) + // create an unsafe L2 block + seq.ActL2StartBlock(t) + seq.ActL2EndBlock(t) + seq.ActL2PipelineFull(t) + seqMockBackend.AssertExpectations(t) + status := seq.SyncStatus() + require.Equal(t, uint64(1), status.UnsafeL2.Number) + require.Equal(t, uint64(0), status.CrossUnsafeL2.Number) + require.Equal(t, uint64(0), status.LocalSafeL2.Number) + require.Equal(t, uint64(0), status.SafeL2.Number) + + // promote it to cross-unsafe in the backend + // and see if the node picks up on it + seqMockBackend.ExpectCheckBlock(l2ChainID, 1, types.CrossUnsafe, nil) + seq.ActInteropBackendCheck(t) + seq.ActL2PipelineFull(t) + seqMockBackend.AssertExpectations(t) + status = seq.SyncStatus() + require.Equal(t, uint64(1), status.UnsafeL2.Number) + require.Equal(t, uint64(1), status.CrossUnsafeL2.Number, "cross unsafe now") + require.Equal(t, uint64(0), status.LocalSafeL2.Number) + require.Equal(t, uint64(0), status.SafeL2.Number) + + // submit all new L2 blocks + batcher.ActSubmitAll(t) + // new L1 block with L2 batch + l1Miner.ActL1StartBlock(12)(t) + l1Miner.ActL1IncludeTx(sd.RollupCfg.Genesis.SystemConfig.BatcherAddr)(t) + l1Miner.ActL1EndBlock(t) + + // Sync the L1 block, to verify the L2 block as local-safe. + seqMockBackend.ExpectCheckBlock(l2ChainID, 1, types.CrossUnsafe, nil) // not cross-safe yet + seq.ActL1HeadSignal(t) + seq.ActL2PipelineFull(t) + seqMockBackend.AssertExpectations(t) + + status = seq.SyncStatus() + require.Equal(t, uint64(1), status.UnsafeL2.Number) + require.Equal(t, uint64(1), status.CrossUnsafeL2.Number) + require.Equal(t, uint64(1), status.LocalSafeL2.Number, "local safe changed") + require.Equal(t, uint64(0), status.SafeL2.Number) + + // Now mark it as cross-safe + seqMockBackend.ExpectCheckBlock(l2ChainID, 1, types.CrossSafe, nil) + seq.ActInteropBackendCheck(t) + seq.ActL2PipelineFull(t) + seqMockBackend.AssertExpectations(t) + + status = seq.SyncStatus() + require.Equal(t, uint64(1), status.UnsafeL2.Number) + require.Equal(t, uint64(1), status.CrossUnsafeL2.Number) + require.Equal(t, uint64(1), status.LocalSafeL2.Number) + require.Equal(t, uint64(1), status.SafeL2.Number, "cross-safe reached") + require.Equal(t, uint64(0), status.FinalizedL2.Number) + + // The verifier might not see the L2 block that was just derived from L1 as cross-verified yet. + verMockBackend.ExpectCheckBlock(l2ChainID, 1, types.Unsafe, nil) // for the local unsafe check + verMockBackend.ExpectCheckBlock(l2ChainID, 1, types.Unsafe, nil) // for the local safe check + ver.ActL1HeadSignal(t) + ver.ActL2PipelineFull(t) + verMockBackend.AssertExpectations(t) + status = ver.SyncStatus() + require.Equal(t, uint64(1), status.UnsafeL2.Number, "synced the block") + require.Equal(t, uint64(0), status.CrossUnsafeL2.Number, "not cross-verified yet") + require.Equal(t, uint64(1), status.LocalSafeL2.Number, "derived from L1, thus local-safe") + require.Equal(t, uint64(0), status.SafeL2.Number, "not yet cross-safe") + require.Equal(t, uint64(0), status.FinalizedL2.Number) + + // signal that L1 finalized; the cross-safe block we have should get finalized too + l1Miner.ActL1SafeNext(t) + l1Miner.ActL1FinalizeNext(t) + seq.ActL1SafeSignal(t) + seq.ActL1FinalizedSignal(t) + seq.ActL2PipelineFull(t) + seqMockBackend.AssertExpectations(t) + + status = seq.SyncStatus() + require.Equal(t, uint64(1), status.FinalizedL2.Number, "finalized the block") +} diff --git a/op-e2e/actions/l2_sequencer.go b/op-e2e/actions/l2_sequencer.go deleted file mode 100644 index dfd4c80c4062..000000000000 --- a/op-e2e/actions/l2_sequencer.go +++ /dev/null @@ -1,184 +0,0 @@ -package actions - -import ( - "context" - "errors" - - "github.com/ethereum-optimism/optimism/op-node/node/safedb" - "github.com/ethereum/go-ethereum/log" - "github.com/stretchr/testify/require" - - "github.com/ethereum-optimism/optimism/op-node/metrics" - "github.com/ethereum-optimism/optimism/op-node/rollup" - "github.com/ethereum-optimism/optimism/op-node/rollup/async" - "github.com/ethereum-optimism/optimism/op-node/rollup/conductor" - "github.com/ethereum-optimism/optimism/op-node/rollup/derive" - "github.com/ethereum-optimism/optimism/op-node/rollup/driver" - "github.com/ethereum-optimism/optimism/op-node/rollup/sync" - "github.com/ethereum-optimism/optimism/op-service/eth" -) - -// MockL1OriginSelector is a shim to override the origin as sequencer, so we can force it to stay on an older origin. -type MockL1OriginSelector struct { - actual *driver.L1OriginSelector - originOverride eth.L1BlockRef // override which origin gets picked -} - -func (m *MockL1OriginSelector) FindL1Origin(ctx context.Context, l2Head eth.L2BlockRef) (eth.L1BlockRef, error) { - if m.originOverride != (eth.L1BlockRef{}) { - return m.originOverride, nil - } - return m.actual.FindL1Origin(ctx, l2Head) -} - -// L2Sequencer is an actor that functions like a rollup node, -// without the full P2P/API/Node stack, but just the derivation state, and simplified driver with sequencing ability. -type L2Sequencer struct { - L2Verifier - - sequencer *driver.Sequencer - - failL2GossipUnsafeBlock error // mock error - - mockL1OriginSelector *MockL1OriginSelector -} - -func NewL2Sequencer(t Testing, log log.Logger, l1 derive.L1Fetcher, blobSrc derive.L1BlobsFetcher, - plasmaSrc derive.PlasmaInputFetcher, eng L2API, cfg *rollup.Config, seqConfDepth uint64) *L2Sequencer { - ver := NewL2Verifier(t, log, l1, blobSrc, plasmaSrc, eng, cfg, &sync.Config{}, safedb.Disabled) - attrBuilder := derive.NewFetchingAttributesBuilder(cfg, l1, eng) - seqConfDepthL1 := driver.NewConfDepth(seqConfDepth, ver.l1State.L1Head, l1) - l1OriginSelector := &MockL1OriginSelector{ - actual: driver.NewL1OriginSelector(log, cfg, seqConfDepthL1), - } - return &L2Sequencer{ - L2Verifier: *ver, - sequencer: driver.NewSequencer(log, cfg, ver.engine, attrBuilder, l1OriginSelector, metrics.NoopMetrics), - mockL1OriginSelector: l1OriginSelector, - failL2GossipUnsafeBlock: nil, - } -} - -// ActL2StartBlock starts building of a new L2 block on top of the head -func (s *L2Sequencer) ActL2StartBlock(t Testing) { - s.ActL2StartBlockCheckErr(t, nil) -} - -func (s *L2Sequencer) ActL2StartBlockCheckErr(t Testing, checkErr error) { - if !s.l2PipelineIdle { - t.InvalidAction("cannot start L2 build when derivation is not idle") - return - } - if s.l2Building { - t.InvalidAction("already started building L2 block") - return - } - - err := s.sequencer.StartBuildingBlock(t.Ctx()) - if checkErr == nil { - require.NoError(t, err, "failed to start block building") - } else { - require.ErrorIs(t, err, checkErr, "expected typed error") - } - - if errors.Is(err, derive.ErrReset) { - s.derivation.Reset() - } - - if err == nil { - s.l2Building = true - } -} - -// ActL2EndBlock completes a new L2 block and applies it to the L2 chain as new canonical unsafe head -func (s *L2Sequencer) ActL2EndBlock(t Testing) { - if !s.l2Building { - t.InvalidAction("cannot end L2 block building when no block is being built") - return - } - s.l2Building = false - - _, err := s.sequencer.CompleteBuildingBlock(t.Ctx(), async.NoOpGossiper{}, &conductor.NoOpConductor{}) - // TODO: there may be legitimate temporary errors here, if we mock engine API RPC-failure. - // For advanced tests we can catch those and print a warning instead. - require.NoError(t, err) - - // TODO: action-test publishing of payload on p2p -} - -// ActL2KeepL1Origin makes the sequencer use the current L1 origin, even if the next origin is available. -func (s *L2Sequencer) ActL2KeepL1Origin(t Testing) { - parent := s.engine.UnsafeL2Head() - // force old origin, for testing purposes - oldOrigin, err := s.l1.L1BlockRefByHash(t.Ctx(), parent.L1Origin.Hash) - require.NoError(t, err, "failed to get current origin: %s", parent.L1Origin) - s.mockL1OriginSelector.originOverride = oldOrigin -} - -// ActBuildToL1Head builds empty blocks until (incl.) the L1 head becomes the L2 origin -func (s *L2Sequencer) ActBuildToL1Head(t Testing) { - for s.engine.UnsafeL2Head().L1Origin.Number < s.l1State.L1Head().Number { - s.ActL2PipelineFull(t) - s.ActL2StartBlock(t) - s.ActL2EndBlock(t) - } -} - -// ActBuildToL1HeadUnsafe builds empty blocks until (incl.) the L1 head becomes the L1 origin of the L2 head -func (s *L2Sequencer) ActBuildToL1HeadUnsafe(t Testing) { - for s.engine.UnsafeL2Head().L1Origin.Number < s.l1State.L1Head().Number { - // Note: the derivation pipeline does not run, we are just sequencing a block on top of the existing L2 chain. - s.ActL2StartBlock(t) - s.ActL2EndBlock(t) - } -} - -// ActBuildToL1HeadExcl builds empty blocks until (excl.) the L1 head becomes the L1 origin of the L2 head -func (s *L2Sequencer) ActBuildToL1HeadExcl(t Testing) { - for { - s.ActL2PipelineFull(t) - nextOrigin, err := s.mockL1OriginSelector.FindL1Origin(t.Ctx(), s.engine.UnsafeL2Head()) - require.NoError(t, err) - if nextOrigin.Number >= s.l1State.L1Head().Number { - break - } - s.ActL2StartBlock(t) - s.ActL2EndBlock(t) - } -} - -// ActBuildToL1HeadExclUnsafe builds empty blocks until (excl.) the L1 head becomes the L1 origin of the L2 head, without safe-head progression. -func (s *L2Sequencer) ActBuildToL1HeadExclUnsafe(t Testing) { - for { - // Note: the derivation pipeline does not run, we are just sequencing a block on top of the existing L2 chain. - nextOrigin, err := s.mockL1OriginSelector.FindL1Origin(t.Ctx(), s.engine.UnsafeL2Head()) - require.NoError(t, err) - if nextOrigin.Number >= s.l1State.L1Head().Number { - break - } - s.ActL2StartBlock(t) - s.ActL2EndBlock(t) - } -} - -func (s *L2Sequencer) ActBuildL2ToTime(t Testing, target uint64) { - for s.L2Unsafe().Time < target { - s.ActL2StartBlock(t) - s.ActL2EndBlock(t) - } -} - -func (s *L2Sequencer) ActBuildL2ToEcotone(t Testing) { - require.NotNil(t, s.rollupCfg.EcotoneTime, "cannot activate Ecotone when it is not scheduled") - for s.L2Unsafe().Time < *s.rollupCfg.EcotoneTime { - s.ActL2StartBlock(t) - 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 deleted file mode 100644 index 05fa0242d16a..000000000000 --- a/op-e2e/actions/l2_sequencer_test.go +++ /dev/null @@ -1,183 +0,0 @@ -package actions - -import ( - "math/big" - "testing" - - "github.com/ethereum/go-ethereum/core/types" - "github.com/ethereum/go-ethereum/crypto" - "github.com/ethereum/go-ethereum/eth/ethconfig" - "github.com/ethereum/go-ethereum/node" - "github.com/ethereum/go-ethereum/p2p" - "github.com/ethereum/go-ethereum/params" - - "github.com/ethereum/go-ethereum/common" - "github.com/ethereum/go-ethereum/log" - "github.com/stretchr/testify/require" - - "github.com/ethereum-optimism/optimism/op-e2e/e2eutils" - plasma "github.com/ethereum-optimism/optimism/op-plasma" - "github.com/ethereum-optimism/optimism/op-service/sources" - "github.com/ethereum-optimism/optimism/op-service/testlog" -) - -func EngineWithP2P() EngineOption { - return func(ethCfg *ethconfig.Config, nodeCfg *node.Config) error { - p2pKey, err := crypto.GenerateKey() - if err != nil { - return err - } - nodeCfg.P2P = p2p.Config{ - MaxPeers: 100, - NoDiscovery: true, - ListenAddr: "127.0.0.1:0", - PrivateKey: p2pKey, - } - return nil - } -} - -func setupSequencerTest(t Testing, sd *e2eutils.SetupData, log log.Logger) (*L1Miner, *L2Engine, *L2Sequencer) { - jwtPath := e2eutils.WriteDefaultJWT(t) - - miner := NewL1Miner(t, log, sd.L1Cfg) - - l1F, err := sources.NewL1Client(miner.RPCClient(), log, nil, sources.L1ClientDefaultConfig(sd.RollupCfg, false, sources.RPCKindStandard)) - require.NoError(t, err) - engine := NewL2Engine(t, log, sd.L2Cfg, sd.RollupCfg.Genesis.L1, jwtPath, EngineWithP2P()) - l2Cl, err := sources.NewEngineClient(engine.RPCClient(), log, nil, sources.EngineClientDefaultConfig(sd.RollupCfg)) - require.NoError(t, err) - - sequencer := NewL2Sequencer(t, log, l1F, miner.BlobStore(), plasma.Disabled, l2Cl, sd.RollupCfg, 0) - return miner, engine, sequencer -} - -func TestL2Sequencer_SequencerDrift(gt *testing.T) { - t := NewDefaultTesting(gt) - p := &e2eutils.TestParams{ - MaxSequencerDrift: 20, // larger than L1 block time we simulate in this test (12) - SequencerWindowSize: 24, - ChannelTimeout: 20, - L1BlockTime: 12, - } - dp := e2eutils.MakeDeployParams(t, p) - sd := e2eutils.Setup(t, dp, defaultAlloc) - log := testlog.Logger(t, log.LevelDebug) - miner, engine, sequencer := setupSequencerTest(t, sd, log) - miner.ActL1SetFeeRecipient(common.Address{'A'}) - - sequencer.ActL2PipelineFull(t) - - signer := types.LatestSigner(sd.L2Cfg.Config) - cl := engine.EthClient() - aliceTx := func() { - n, err := cl.PendingNonceAt(t.Ctx(), dp.Addresses.Alice) - require.NoError(t, err) - tx := types.MustSignNewTx(dp.Secrets.Alice, signer, &types.DynamicFeeTx{ - ChainID: sd.L2Cfg.Config.ChainID, - Nonce: n, - GasTipCap: big.NewInt(2 * params.GWei), - GasFeeCap: new(big.Int).Add(miner.l1Chain.CurrentBlock().BaseFee, big.NewInt(2*params.GWei)), - Gas: params.TxGas, - To: &dp.Addresses.Bob, - Value: e2eutils.Ether(2), - }) - require.NoError(gt, cl.SendTransaction(t.Ctx(), tx)) - } - makeL2BlockWithAliceTx := func() { - aliceTx() - sequencer.ActL2StartBlock(t) - engine.ActL2IncludeTx(dp.Addresses.Alice)(t) // include a test tx from alice - sequencer.ActL2EndBlock(t) - } - - // L1 makes a block - miner.ActL1StartBlock(12)(t) - miner.ActL1EndBlock(t) - sequencer.ActL1HeadSignal(t) - origin := miner.l1Chain.CurrentBlock() - - // L2 makes blocks to catch up - for sequencer.SyncStatus().UnsafeL2.Time+sd.RollupCfg.BlockTime < origin.Time { - makeL2BlockWithAliceTx() - require.Equal(t, uint64(0), sequencer.SyncStatus().UnsafeL2.L1Origin.Number, "no L1 origin change before time matches") - } - // Check that we adopted the origin as soon as we could (conf depth is 0) - makeL2BlockWithAliceTx() - require.Equal(t, uint64(1), sequencer.SyncStatus().UnsafeL2.L1Origin.Number, "L1 origin changes as soon as L2 time equals or exceeds L1 time") - - miner.ActL1StartBlock(12)(t) - miner.ActL1EndBlock(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.ChainSpec.MaxSequencerDrift(origin.Time) { - sequencer.ActL2KeepL1Origin(t) - makeL2BlockWithAliceTx() - require.Equal(t, uint64(1), sequencer.SyncStatus().UnsafeL2.L1Origin.Number, "expected to keep old L1 origin") - } - - // We passed the sequencer drift: we can still keep the old origin, but can't include any txs - sequencer.ActL2KeepL1Origin(t) - sequencer.ActL2StartBlock(t) - require.True(t, engine.engineApi.ForcedEmpty(), "engine should not be allowed to include anything after sequencer drift is surpassed") -} - -// TestL2Sequencer_SequencerOnlyReorg regression-tests a Goerli halt where the sequencer -// would build an unsafe L2 block with a L1 origin that then gets reorged out, -// while the verifier-codepath only ever sees the valid post-reorg L1 chain. -func TestL2Sequencer_SequencerOnlyReorg(gt *testing.T) { - t := NewDefaultTesting(gt) - dp := e2eutils.MakeDeployParams(t, defaultRollupTestParams) - sd := e2eutils.Setup(t, dp, defaultAlloc) - log := testlog.Logger(t, log.LevelDebug) - miner, _, sequencer := setupSequencerTest(t, sd, log) - - // Sequencer at first only recognizes the genesis as safe. - // The rest of the L1 chain will be incorporated as L1 origins into unsafe L2 blocks. - sequencer.ActL2PipelineFull(t) - - // build L1 block with coinbase A - miner.ActL1SetFeeRecipient(common.Address{'A'}) - miner.ActEmptyBlock(t) - - // sequencer builds L2 blocks, until (incl.) it creates a L2 block with a L1 origin that has A as coinbase address - sequencer.ActL1HeadSignal(t) - sequencer.ActBuildToL1HeadUnsafe(t) - - status := sequencer.SyncStatus() - require.Zero(t, status.SafeL2.L1Origin.Number, "no safe head progress") - require.Equal(t, status.HeadL1.Hash, status.UnsafeL2.L1Origin.Hash, "have head L1 origin") - // reorg out block with coinbase A, and make a block with coinbase B - miner.ActL1RewindToParent(t) - miner.ActL1SetFeeRecipient(common.Address{'B'}) - miner.ActEmptyBlock(t) - - // and a second block, for derivation to pick up on the new L1 chain - // (height is used as heuristic to not flip-flop between chains too frequently) - miner.ActEmptyBlock(t) - - // Make the sequencer aware of the new head, and try to sync it. - // Since the safe chain never incorporated the now reorged L1 block with coinbase A, - // it will sync the new L1 chain fine. - // No batches are submitted yet however, - // so it'll keep the L2 block with the old L1 origin, since no conflict is detected. - sequencer.ActL1HeadSignal(t) - sequencer.ActL2PipelineFull(t) - // Verifier should detect the inconsistency of the L1 origin and reset the pipeline to follow the reorg - newStatus := sequencer.SyncStatus() - require.Zero(t, newStatus.UnsafeL2.L1Origin.Number, "back to genesis block with good L1 origin, drop old unsafe L2 chain with bad L1 origins") - require.NotEqual(t, status.HeadL1.Hash, newStatus.HeadL1.Hash, "did see the new L1 head change") - require.Equal(t, newStatus.HeadL1.Hash, newStatus.CurrentL1.Hash, "did sync the new L1 head as verifier") - - // the block N+1 cannot build on the old N which still refers to the now orphaned L1 origin - require.Equal(t, status.UnsafeL2.L1Origin.Number, newStatus.HeadL1.Number-1, "seeing N+1 to attempt to build on N") - require.NotEqual(t, status.UnsafeL2.L1Origin.Hash, newStatus.HeadL1.ParentHash, "but N+1 cannot fit on N") - - // After hitting a reset error, it resets derivation, and drops the old L1 chain - sequencer.ActL2PipelineFull(t) - - // Can build new L2 blocks with good L1 origin - sequencer.ActBuildToL1HeadUnsafe(t) - require.Equal(t, newStatus.HeadL1.Hash, sequencer.SyncStatus().UnsafeL2.L1Origin.Hash, "build L2 chain with new correct L1 origins") -} diff --git a/op-e2e/actions/l2_verifier.go b/op-e2e/actions/l2_verifier.go deleted file mode 100644 index 9765343237a5..000000000000 --- a/op-e2e/actions/l2_verifier.go +++ /dev/null @@ -1,275 +0,0 @@ -package actions - -import ( - "context" - "errors" - "io" - - "github.com/ethereum/go-ethereum/common" - "github.com/ethereum/go-ethereum/log" - gnode "github.com/ethereum/go-ethereum/node" - "github.com/ethereum/go-ethereum/rpc" - "github.com/stretchr/testify/require" - - "github.com/ethereum-optimism/optimism/op-node/node" - "github.com/ethereum-optimism/optimism/op-node/rollup" - "github.com/ethereum-optimism/optimism/op-node/rollup/derive" - "github.com/ethereum-optimism/optimism/op-node/rollup/driver" - "github.com/ethereum-optimism/optimism/op-node/rollup/sync" - "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/testutils" -) - -// L2Verifier is an actor that functions like a rollup node, -// without the full P2P/API/Node stack, but just the derivation state, and simplified driver. -type L2Verifier struct { - log log.Logger - - eng interface { - derive.Engine - L2BlockRefByNumber(ctx context.Context, num uint64) (eth.L2BlockRef, error) - } - - // L2 rollup - engine *derive.EngineController - derivation *derive.DerivationPipeline - - l1 derive.L1Fetcher - l1State *driver.L1State - - l2PipelineIdle bool - l2Building bool - - rollupCfg *rollup.Config - - rpc *rpc.Server - - failRPC error // mock error -} - -type L2API interface { - derive.Engine - L2BlockRefByNumber(ctx context.Context, num uint64) (eth.L2BlockRef, error) - InfoByHash(ctx context.Context, hash common.Hash) (eth.BlockInfo, error) - // GetProof returns a proof of the account, it may return a nil result without error if the address was not found. - GetProof(ctx context.Context, address common.Address, storage []common.Hash, blockTag string) (*eth.AccountResult, error) - OutputV0AtBlock(ctx context.Context, blockHash common.Hash) (*eth.OutputV0, error) -} - -type safeDB interface { - derive.SafeHeadListener - node.SafeDBReader -} - -func NewL2Verifier(t Testing, log log.Logger, l1 derive.L1Fetcher, blobsSrc derive.L1BlobsFetcher, plasmaSrc derive.PlasmaInputFetcher, eng L2API, cfg *rollup.Config, syncCfg *sync.Config, safeHeadListener safeDB) *L2Verifier { - metrics := &testutils.TestDerivationMetrics{} - engine := derive.NewEngineController(eng, log, metrics, cfg, syncCfg.SyncMode, nil) - pipeline := derive.NewDerivationPipeline(log, cfg, l1, blobsSrc, plasmaSrc, eng, engine, metrics, syncCfg, safeHeadListener) - pipeline.Reset() - - rollupNode := &L2Verifier{ - log: log, - eng: eng, - engine: engine, - derivation: pipeline, - l1: l1, - l1State: driver.NewL1State(log, metrics), - l2PipelineIdle: true, - l2Building: false, - rollupCfg: cfg, - rpc: rpc.NewServer(), - } - t.Cleanup(rollupNode.rpc.Stop) - - // setup RPC server for rollup node, hooked to the actor as backend - m := &testutils.TestRPCMetrics{} - backend := &l2VerifierBackend{verifier: rollupNode} - apis := []rpc.API{ - { - Namespace: "optimism", - Service: node.NewNodeAPI(cfg, eng, backend, safeHeadListener, log, m), - Public: true, - Authenticated: false, - }, - { - Namespace: "admin", - Version: "", - Service: node.NewAdminAPI(backend, m, log), - Public: true, // TODO: this field is deprecated. Do we even need this anymore? - Authenticated: false, - }, - } - require.NoError(t, gnode.RegisterApis(apis, nil, rollupNode.rpc), "failed to set up APIs") - return rollupNode -} - -type l2VerifierBackend struct { - verifier *L2Verifier -} - -func (s *l2VerifierBackend) BlockRefWithStatus(ctx context.Context, num uint64) (eth.L2BlockRef, *eth.SyncStatus, error) { - ref, err := s.verifier.eng.L2BlockRefByNumber(ctx, num) - return ref, s.verifier.SyncStatus(), err -} - -func (s *l2VerifierBackend) SyncStatus(ctx context.Context) (*eth.SyncStatus, error) { - return s.verifier.SyncStatus(), nil -} - -func (s *l2VerifierBackend) ResetDerivationPipeline(ctx context.Context) error { - s.verifier.derivation.Reset() - return nil -} - -func (s *l2VerifierBackend) StartSequencer(ctx context.Context, blockHash common.Hash) error { - return nil -} - -func (s *l2VerifierBackend) StopSequencer(ctx context.Context) (common.Hash, error) { - return common.Hash{}, errors.New("stopping the L2Verifier sequencer is not supported") -} - -func (s *l2VerifierBackend) SequencerActive(ctx context.Context) (bool, error) { - return false, nil -} - -func (s *l2VerifierBackend) OnUnsafeL2Payload(ctx context.Context, envelope *eth.ExecutionPayloadEnvelope) error { - return nil -} - -func (s *L2Verifier) L2Finalized() eth.L2BlockRef { - return s.engine.Finalized() -} - -func (s *L2Verifier) L2Safe() eth.L2BlockRef { - return s.engine.SafeL2Head() -} - -func (s *L2Verifier) L2PendingSafe() eth.L2BlockRef { - return s.engine.PendingSafeL2Head() -} - -func (s *L2Verifier) L2Unsafe() eth.L2BlockRef { - return s.engine.UnsafeL2Head() -} - -func (s *L2Verifier) L2BackupUnsafe() eth.L2BlockRef { - return s.engine.BackupUnsafeL2Head() -} - -func (s *L2Verifier) SyncStatus() *eth.SyncStatus { - return ð.SyncStatus{ - CurrentL1: s.derivation.Origin(), - CurrentL1Finalized: s.derivation.FinalizedL1(), - HeadL1: s.l1State.L1Head(), - SafeL1: s.l1State.L1Safe(), - FinalizedL1: s.l1State.L1Finalized(), - UnsafeL2: s.L2Unsafe(), - SafeL2: s.L2Safe(), - FinalizedL2: s.L2Finalized(), - PendingSafeL2: s.L2PendingSafe(), - } -} - -func (s *L2Verifier) RollupClient() *sources.RollupClient { - return sources.NewRollupClient(s.RPCClient()) -} - -func (s *L2Verifier) RPCClient() client.RPC { - cl := rpc.DialInProc(s.rpc) - return testutils.RPCErrFaker{ - RPC: client.NewBaseRPCClient(cl), - ErrFn: func() error { - err := s.failRPC - s.failRPC = nil // reset back, only error once. - return err - }, - } -} - -// ActRPCFail makes the next L2 RPC request fail -func (s *L2Verifier) ActRPCFail(t Testing) { - if s.failRPC != nil { // already set to fail? - t.InvalidAction("already set a mock rpc error") - return - } - s.failRPC = errors.New("mock RPC error") -} - -func (s *L2Verifier) ActL1HeadSignal(t Testing) { - head, err := s.l1.L1BlockRefByLabel(t.Ctx(), eth.Unsafe) - require.NoError(t, err) - s.l1State.HandleNewL1HeadBlock(head) -} - -func (s *L2Verifier) ActL1SafeSignal(t Testing) { - safe, err := s.l1.L1BlockRefByLabel(t.Ctx(), eth.Safe) - require.NoError(t, err) - s.l1State.HandleNewL1SafeBlock(safe) -} - -func (s *L2Verifier) ActL1FinalizedSignal(t Testing) { - finalized, err := s.l1.L1BlockRefByLabel(t.Ctx(), eth.Finalized) - require.NoError(t, err) - s.l1State.HandleNewL1FinalizedBlock(finalized) - s.derivation.Finalize(finalized) -} - -// ActL2PipelineStep runs one iteration of the L2 derivation pipeline -func (s *L2Verifier) ActL2PipelineStep(t Testing) { - if s.l2Building { - t.InvalidAction("cannot derive new data while building L2 block") - return - } - - s.l2PipelineIdle = false - err := s.derivation.Step(t.Ctx()) - if err == io.EOF || (err != nil && errors.Is(err, derive.EngineELSyncing)) { - s.l2PipelineIdle = true - return - } else if err != nil && errors.Is(err, derive.NotEnoughData) { - return - } else if err != nil && errors.Is(err, derive.ErrReset) { - s.log.Warn("Derivation pipeline is reset", "err", err) - s.derivation.Reset() - return - } else if err != nil && errors.Is(err, derive.ErrTemporary) { - s.log.Warn("Derivation process temporary error", "err", err) - if errors.Is(err, sync.WrongChainErr) { // action-tests don't back off on temporary errors. Avoid a bad genesis setup from looping. - t.Fatalf("genesis setup issue: %v", err) - } - return - } else if err != nil && errors.Is(err, derive.ErrCritical) { - t.Fatalf("derivation failed critically: %v", err) - } else if err != nil { - t.Fatalf("derivation failed: %v", err) - } else { - return - } -} - -func (s *L2Verifier) ActL2PipelineFull(t Testing) { - s.l2PipelineIdle = false - for !s.l2PipelineIdle { - s.ActL2PipelineStep(t) - } -} - -// ActL2UnsafeGossipReceive creates an action that can receive an unsafe execution payload, like gossipsub -func (s *L2Verifier) ActL2UnsafeGossipReceive(payload *eth.ExecutionPayloadEnvelope) Action { - return func(t Testing) { - s.derivation.AddUnsafePayload(payload) - } -} - -// ActL2InsertUnsafePayload creates an action that can insert an unsafe execution payload -func (s *L2Verifier) ActL2InsertUnsafePayload(payload *eth.ExecutionPayloadEnvelope) Action { - return func(t Testing) { - ref, err := derive.PayloadToBlockRef(s.rollupCfg, payload.ExecutionPayload) - require.NoError(t, err) - err = s.engine.InsertUnsafePayload(t.Ctx(), payload, ref) - require.NoError(t, err) - } -} diff --git a/op-e2e/actions/l2_verifier_test.go b/op-e2e/actions/l2_verifier_test.go deleted file mode 100644 index 6fe70a3e6fb4..000000000000 --- a/op-e2e/actions/l2_verifier_test.go +++ /dev/null @@ -1,118 +0,0 @@ -package actions - -import ( - "testing" - - "github.com/ethereum-optimism/optimism/op-node/node/safedb" - plasma "github.com/ethereum-optimism/optimism/op-plasma" - "github.com/ethereum/go-ethereum/common" - "github.com/ethereum/go-ethereum/log" - "github.com/stretchr/testify/require" - - "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" - "github.com/ethereum-optimism/optimism/op-service/testlog" -) - -type verifierCfg struct { - safeHeadListener safeDB -} - -type VerifierOpt func(opts *verifierCfg) - -func WithSafeHeadListener(l safeDB) VerifierOpt { - return func(opts *verifierCfg) { - opts.safeHeadListener = l - } -} - -func defaultVerifierCfg() *verifierCfg { - return &verifierCfg{ - safeHeadListener: safedb.Disabled, - } -} - -func setupVerifier(t Testing, sd *e2eutils.SetupData, log log.Logger, l1F derive.L1Fetcher, blobSrc derive.L1BlobsFetcher, syncCfg *sync.Config, opts ...VerifierOpt) (*L2Engine, *L2Verifier) { - cfg := defaultVerifierCfg() - for _, opt := range opts { - opt(cfg) - } - jwtPath := e2eutils.WriteDefaultJWT(t) - engine := NewL2Engine(t, log, sd.L2Cfg, sd.RollupCfg.Genesis.L1, jwtPath, EngineWithP2P()) - engCl := engine.EngineClient(t, sd.RollupCfg) - verifier := NewL2Verifier(t, log, l1F, blobSrc, plasma.Disabled, engCl, sd.RollupCfg, syncCfg, cfg.safeHeadListener) - return engine, verifier -} - -func setupVerifierOnlyTest(t Testing, sd *e2eutils.SetupData, log log.Logger) (*L1Miner, *L2Engine, *L2Verifier) { - miner := NewL1Miner(t, log, sd.L1Cfg) - l1Cl := miner.L1Client(t, sd.RollupCfg) - engine, verifier := setupVerifier(t, sd, log, l1Cl, miner.BlobStore(), &sync.Config{}) - return miner, engine, verifier -} - -func TestL2Verifier_SequenceWindow(gt *testing.T) { - t := NewDefaultTesting(gt) - p := &e2eutils.TestParams{ - MaxSequencerDrift: 10, - SequencerWindowSize: 24, - ChannelTimeout: 10, - L1BlockTime: 15, - } - dp := e2eutils.MakeDeployParams(t, p) - sd := e2eutils.Setup(t, dp, defaultAlloc) - log := testlog.Logger(t, log.LevelDebug) - miner, engine, verifier := setupVerifierOnlyTest(t, sd, log) - miner.ActL1SetFeeRecipient(common.Address{'A'}) - - // Make two sequence windows worth of empty L1 blocks. After we pass the first sequence window, the L2 chain should get blocks - for miner.l1Chain.CurrentBlock().Number.Uint64() < sd.RollupCfg.SeqWindowSize*2 { - miner.ActL1StartBlock(10)(t) - miner.ActL1EndBlock(t) - - verifier.ActL2PipelineFull(t) - - l1Head := miner.l1Chain.CurrentBlock().Number.Uint64() - expectedL1Origin := uint64(0) - // as soon as we complete the sequence window, we force-adopt the L1 origin - if l1Head >= sd.RollupCfg.SeqWindowSize { - expectedL1Origin = l1Head - sd.RollupCfg.SeqWindowSize - } - require.Equal(t, expectedL1Origin, verifier.SyncStatus().SafeL2.L1Origin.Number, "L1 origin is forced in, given enough L1 blocks pass by") - require.LessOrEqual(t, miner.l1Chain.GetBlockByNumber(expectedL1Origin).Time(), engine.l2Chain.CurrentBlock().Time, "L2 time higher than L1 origin time") - } - tip2N := verifier.SyncStatus() - - // Do a deep L1 reorg as deep as a sequence window, this should affect the safe L2 chain - miner.ActL1RewindDepth(sd.RollupCfg.SeqWindowSize)(t) - - // Without new L1 block, the L1 appears to not be synced, and the node shouldn't reorg - verifier.ActL2PipelineFull(t) - require.Equal(t, tip2N.SafeL2, verifier.SyncStatus().SafeL2, "still the same after verifier work") - - // Make a new empty L1 block with different data than there was before. - miner.ActL1SetFeeRecipient(common.Address{'B'}) - miner.ActL1StartBlock(10)(t) - miner.ActL1EndBlock(t) - reorgL1Block := miner.l1Chain.CurrentBlock() - - // Still no reorg, we need more L1 blocks first, before the reorged L1 block is forced in by sequence window - verifier.ActL2PipelineFull(t) - require.Equal(t, tip2N.SafeL2, verifier.SyncStatus().SafeL2) - - for miner.l1Chain.CurrentBlock().Number.Uint64() < sd.RollupCfg.SeqWindowSize*2 { - miner.ActL1StartBlock(10)(t) - miner.ActL1EndBlock(t) - } - - // workaround: in L1Traversal we only recognize the reorg once we see origin N+1, we don't reorg to shorter L1 chains - miner.ActL1StartBlock(10)(t) - miner.ActL1EndBlock(t) - - // Now it will reorg - verifier.ActL2PipelineFull(t) - - got := miner.l1Chain.GetBlockByHash(miner.l1Chain.GetBlockByHash(verifier.SyncStatus().SafeL2.L1Origin.Hash).Hash()) - require.Equal(t, reorgL1Block.Hash(), got.Hash(), "must have reorged L2 chain to the new L1 chain") -} diff --git a/op-e2e/actions/plasma_test.go b/op-e2e/actions/plasma_test.go deleted file mode 100644 index 4307cab18677..000000000000 --- a/op-e2e/actions/plasma_test.go +++ /dev/null @@ -1,624 +0,0 @@ -package actions - -import ( - "math/big" - "math/rand" - "testing" - - "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-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" - "github.com/ethereum/go-ethereum/common" - "github.com/ethereum/go-ethereum/core/types" - "github.com/ethereum/go-ethereum/log" - "github.com/stretchr/testify/require" -) - -// Devnet allocs should have plasma mode enabled for these tests to pass - -// L2PlasmaDA is a test harness for manipulating plasma DA state. -type L2PlasmaDA struct { - log log.Logger - storage *plasma.DAErrFaker - daMgr *plasma.DA - plasmaCfg plasma.Config - contract *bindings.DataAvailabilityChallenge - batcher *L2Batcher - sequencer *L2Sequencer - engine *L2Engine - engCl *sources.EngineClient - sd *e2eutils.SetupData - dp *e2eutils.DeployParams - miner *L1Miner - alice *CrossLayerUser - lastComm []byte - lastCommBn uint64 -} - -type PlasmaParam func(p *e2eutils.TestParams) - -func NewL2PlasmaDA(t Testing, params ...PlasmaParam) *L2PlasmaDA { - p := &e2eutils.TestParams{ - MaxSequencerDrift: 40, - SequencerWindowSize: 120, - ChannelTimeout: 120, - L1BlockTime: 12, - UsePlasma: true, - } - for _, apply := range params { - apply(p) - } - log := testlog.Logger(t, log.LvlDebug) - - dp := e2eutils.MakeDeployParams(t, p) - sd := e2eutils.Setup(t, dp, defaultAlloc) - - require.True(t, sd.RollupCfg.PlasmaEnabled()) - - miner := NewL1Miner(t, log, sd.L1Cfg) - l1Client := miner.EthClient() - - jwtPath := e2eutils.WriteDefaultJWT(t) - engine := NewL2Engine(t, log, sd.L2Cfg, sd.RollupCfg.Genesis.L1, jwtPath) - engCl := engine.EngineClient(t, sd.RollupCfg) - - storage := &plasma.DAErrFaker{Client: plasma.NewMockDAClient(log)} - - l1F, err := sources.NewL1Client(miner.RPCClient(), log, nil, sources.L1ClientDefaultConfig(sd.RollupCfg, false, sources.RPCKindBasic)) - require.NoError(t, err) - - plasmaCfg, err := sd.RollupCfg.GetOPPlasmaConfig() - require.NoError(t, err) - - daMgr := plasma.NewPlasmaDAWithStorage(log, plasmaCfg, storage, &plasma.NoopMetrics{}) - - sequencer := NewL2Sequencer(t, log, l1F, nil, daMgr, engCl, sd.RollupCfg, 0) - miner.ActL1SetFeeRecipient(common.Address{'A'}) - sequencer.ActL2PipelineFull(t) - - batcher := NewL2Batcher(log, sd.RollupCfg, PlasmaBatcherCfg(dp, storage), sequencer.RollupClient(), l1Client, engine.EthClient(), engCl) - - addresses := e2eutils.CollectAddresses(sd, dp) - cl := engine.EthClient() - l2UserEnv := &BasicUserEnv[*L2Bindings]{ - EthCl: cl, - Signer: types.LatestSigner(sd.L2Cfg.Config), - AddressCorpora: addresses, - Bindings: NewL2Bindings(t, cl, engine.GethClient()), - } - alice := NewCrossLayerUser(log, dp.Secrets.Alice, rand.New(rand.NewSource(0xa57b))) - alice.L2.SetUserEnv(l2UserEnv) - - contract, err := bindings.NewDataAvailabilityChallenge(sd.RollupCfg.PlasmaConfig.DAChallengeAddress, l1Client) - require.NoError(t, err) - - challengeWindow, err := contract.ChallengeWindow(nil) - require.NoError(t, err) - require.Equal(t, plasmaCfg.ChallengeWindow, challengeWindow.Uint64()) - - resolveWindow, err := contract.ResolveWindow(nil) - require.NoError(t, err) - require.Equal(t, plasmaCfg.ResolveWindow, resolveWindow.Uint64()) - - return &L2PlasmaDA{ - log: log, - storage: storage, - daMgr: daMgr, - plasmaCfg: plasmaCfg, - contract: contract, - batcher: batcher, - sequencer: sequencer, - engine: engine, - engCl: engCl, - sd: sd, - dp: dp, - miner: miner, - alice: alice, - } -} - -func (a *L2PlasmaDA) StorageClient() *plasma.DAErrFaker { - return a.storage -} - -func (a *L2PlasmaDA) NewVerifier(t Testing) *L2Verifier { - jwtPath := e2eutils.WriteDefaultJWT(t) - engine := NewL2Engine(t, a.log, a.sd.L2Cfg, a.sd.RollupCfg.Genesis.L1, jwtPath) - engCl := engine.EngineClient(t, a.sd.RollupCfg) - l1F, err := sources.NewL1Client(a.miner.RPCClient(), a.log, nil, sources.L1ClientDefaultConfig(a.sd.RollupCfg, false, sources.RPCKindBasic)) - require.NoError(t, err) - - daMgr := plasma.NewPlasmaDAWithStorage(a.log, a.plasmaCfg, a.storage, &plasma.NoopMetrics{}) - - verifier := NewL2Verifier(t, a.log, l1F, nil, daMgr, engCl, a.sd.RollupCfg, &sync.Config{}, safedb.Disabled) - - return verifier -} - -func (a *L2PlasmaDA) ActSequencerIncludeTx(t Testing) { - a.alice.L2.ActResetTxOpts(t) - a.alice.L2.ActSetTxToAddr(&a.dp.Addresses.Bob)(t) - a.alice.L2.ActMakeTx(t) - - a.sequencer.ActL2PipelineFull(t) - - a.sequencer.ActL2StartBlock(t) - a.engine.ActL2IncludeTx(a.alice.Address())(t) - a.sequencer.ActL2EndBlock(t) -} - -func (a *L2PlasmaDA) ActNewL2Tx(t Testing) { - a.ActSequencerIncludeTx(t) - - a.batcher.ActL2BatchBuffer(t) - a.batcher.ActL2ChannelClose(t) - a.batcher.ActL2BatchSubmit(t, func(tx *types.DynamicFeeTx) { - // skip txdata version byte - a.lastComm = tx.Data[1:] - }) - - a.miner.ActL1StartBlock(12)(t) - a.miner.ActL1IncludeTx(a.dp.Addresses.Batcher)(t) - a.miner.ActL1EndBlock(t) - - a.lastCommBn = a.miner.l1Chain.CurrentBlock().Number.Uint64() -} - -func (a *L2PlasmaDA) ActDeleteLastInput(t Testing) { - require.NoError(t, a.storage.Client.DeleteData(a.lastComm)) -} - -func (a *L2PlasmaDA) ActChallengeLastInput(t Testing) { - a.ActChallengeInput(t, a.lastComm, a.lastCommBn) - - a.log.Info("challenged last input", "block", a.lastCommBn) -} - -func (a *L2PlasmaDA) ActChallengeInput(t Testing, comm []byte, bn uint64) { - bondValue, err := a.contract.BondSize(&bind.CallOpts{}) - require.NoError(t, err) - - txOpts, err := bind.NewKeyedTransactorWithChainID(a.dp.Secrets.Alice, a.sd.L1Cfg.Config.ChainID) - require.NoError(t, err) - - txOpts.Value = bondValue - _, err = a.contract.Deposit(txOpts) - require.NoError(t, err) - - a.miner.ActL1StartBlock(12)(t) - a.miner.ActL1IncludeTx(a.alice.Address())(t) - a.miner.ActL1EndBlock(t) - - txOpts, err = bind.NewKeyedTransactorWithChainID(a.dp.Secrets.Alice, a.sd.L1Cfg.Config.ChainID) - require.NoError(t, err) - - _, err = a.contract.Challenge(txOpts, big.NewInt(int64(bn)), comm) - require.NoError(t, err) - - a.miner.ActL1StartBlock(12)(t) - a.miner.ActL1IncludeTx(a.alice.Address())(t) - a.miner.ActL1EndBlock(t) -} - -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(12)(t) - a.miner.ActL1EndBlock(t) - } -} - -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(bn)), comm, input) - require.NoError(t, err) - - 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(12)(t) - a.miner.ActL1EndBlock(t) - } -} - -func (a *L2PlasmaDA) GetLastTxBlock(t Testing) *types.Block { - rcpt, err := a.engine.EthClient().TransactionReceipt(t.Ctx(), a.alice.L2.lastTxHash) - require.NoError(t, err) - blk, err := a.engine.EthClient().BlockByHash(t.Ctx(), rcpt.BlockHash) - require.NoError(t, err) - return blk -} - -func (a *L2PlasmaDA) ActL1Finalized(t Testing) { - latest := a.miner.l1Chain.CurrentBlock().Number.Uint64() - a.miner.ActL1Safe(t, latest) - a.miner.ActL1Finalize(t, latest) - a.sequencer.ActL1FinalizedSignal(t) -} - -// Commitment is challenged but never resolved, chain reorgs when challenge window expires. -func TestPlasma_ChallengeExpired(gt *testing.T) { - if !e2eutils.UsePlasma() { - gt.Skip("Plasma is not enabled") - } - - t := NewDefaultTesting(gt) - harness := NewL2PlasmaDA(t) - - // generate enough initial l1 blocks to have a finalized head. - harness.ActL1Blocks(t, 5) - - // Include a new l2 transaction, submitting an input commitment to the l1. - harness.ActNewL2Tx(t) - - // Challenge the input commitment on the l1 challenge contract. - harness.ActChallengeLastInput(t) - - blk := harness.GetLastTxBlock(t) - - // catch up the sequencer derivation pipeline with the new l1 blocks. - harness.sequencer.ActL2PipelineFull(t) - - // create enough l1 blocks to expire the resolve window. - harness.ActExpireLastInput(t) - - // catch up the sequencer derivation pipeline with the new l1 blocks. - harness.sequencer.ActL2PipelineFull(t) - - // the L1 finalized signal should trigger plasma to finalize the engine queue. - harness.ActL1Finalized(t) - - // move one more block for engine controller to update. - harness.ActL1Blocks(t, 1) - harness.sequencer.ActL2PipelineFull(t) - - // get new block with same number to compare - newBlk, err := harness.engine.EthClient().BlockByNumber(t.Ctx(), blk.Number()) - require.NoError(t, err) - - // reorg happened even though data was available - require.NotEqual(t, blk.Hash(), newBlk.Hash()) - - // now delete the data from the storage service so it is not available at all - // to the verifier derivation pipeline. - harness.ActDeleteLastInput(t) - - syncStatus := harness.sequencer.SyncStatus() - - // verifier is able to sync with expired missing data - verifier := harness.NewVerifier(t) - verifier.ActL2PipelineFull(t) - verifier.ActL1FinalizedSignal(t) - - verifSyncStatus := verifier.SyncStatus() - - require.Equal(t, syncStatus.FinalizedL2, verifSyncStatus.FinalizedL2) -} - -// Commitment is challenged after sequencer derived the chain but data disappears. A verifier -// derivation pipeline stalls until the challenge is resolved and then resumes with data from the contract. -func TestPlasma_ChallengeResolved(gt *testing.T) { - if !e2eutils.UsePlasma() { - gt.Skip("Plasma is not enabled") - } - - t := NewDefaultTesting(gt) - harness := NewL2PlasmaDA(t) - - // include a new l2 transaction, submitting an input commitment to the l1. - harness.ActNewL2Tx(t) - - // generate 3 l1 blocks. - harness.ActL1Blocks(t, 3) - - // challenge the input commitment for that l2 transaction on the l1 challenge contract. - harness.ActChallengeLastInput(t) - - // catch up sequencer derivation pipeline. - // this syncs the latest event within the AltDA manager. - harness.sequencer.ActL2PipelineFull(t) - - // resolve the challenge on the l1 challenge contract. - harness.ActResolveLastChallenge(t) - - // catch up the sequencer derivation pipeline with the new l1 blocks. - // this syncs the resolved status and input data within the AltDA manager. - harness.sequencer.ActL2PipelineFull(t) - - // finalize l1 - harness.ActL1Finalized(t) - - // delete the data from the storage service so it is not available at all - // to the verifier derivation pipeline. - harness.ActDeleteLastInput(t) - - syncStatus := harness.sequencer.SyncStatus() - - // new verifier is able to sync and resolve the input from calldata - verifier := harness.NewVerifier(t) - verifier.ActL2PipelineFull(t) - verifier.ActL1FinalizedSignal(t) - - verifSyncStatus := verifier.SyncStatus() - - require.Equal(t, syncStatus.SafeL2, verifSyncStatus.SafeL2) -} - -// DA storage service goes offline while sequencer keeps making blocks. When storage comes back online, it should be able to catch up. -func TestPlasma_StorageError(gt *testing.T) { - if !e2eutils.UsePlasma() { - gt.Skip("Plasma is not enabled") - } - - t := NewDefaultTesting(gt) - harness := NewL2PlasmaDA(t) - - // include a new l2 transaction, submitting an input commitment to the l1. - harness.ActNewL2Tx(t) - - txBlk := harness.GetLastTxBlock(t) - - // mock a storage client error when trying to get the pre-image. - // this simulates the storage service going offline for example. - harness.storage.ActGetPreImageFail() - - // try to derive the l2 chain from the submitted inputs commitments. - // the storage call will fail the first time then succeed. - harness.sequencer.ActL2PipelineFull(t) - - // sequencer derivation was able to sync to latest l1 origin - syncStatus := harness.sequencer.SyncStatus() - require.Equal(t, uint64(1), syncStatus.SafeL2.Number) - require.Equal(t, txBlk.Hash(), syncStatus.SafeL2.Hash) -} - -// L1 chain reorgs a resolved challenge so it expires instead causing -// the l2 chain to reorg as well. -func TestPlasma_ChallengeReorg(gt *testing.T) { - if !e2eutils.UsePlasma() { - gt.Skip("Plasma is not enabled") - } - - t := NewDefaultTesting(gt) - harness := NewL2PlasmaDA(t) - - // New L2 tx added to a batch and committed to L1 - harness.ActNewL2Tx(t) - - // add a buffer of L1 blocks - harness.ActL1Blocks(t, 3) - - // challenge the input commitment - harness.ActChallengeLastInput(t) - - // keep track of the block where the L2 tx was included - blk := harness.GetLastTxBlock(t) - - // progress derivation pipeline - harness.sequencer.ActL2PipelineFull(t) - - // resolve the challenge so pipeline can progress - harness.ActResolveLastChallenge(t) - - // derivation marks the challenge as resolve, chain is not impacted - harness.sequencer.ActL2PipelineFull(t) - - // Rewind the L1, essentially reorging the challenge resolution - harness.miner.ActL1RewindToParent(t) - - // Now the L1 chain advances without the challenge resolution - // so the challenge is expired. - harness.ActExpireLastInput(t) - - // derivation pipeline reorgs the commitment out of the chain - harness.sequencer.ActL2PipelineFull(t) - - newBlk, err := harness.engine.EthClient().BlockByNumber(t.Ctx(), blk.Number()) - require.NoError(t, err) - - // 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/proofs/bad_tx_in_batch_test.go b/op-e2e/actions/proofs/bad_tx_in_batch_test.go new file mode 100644 index 000000000000..f67e216f76cb --- /dev/null +++ b/op-e2e/actions/proofs/bad_tx_in_batch_test.go @@ -0,0 +1,174 @@ +package proofs + +import ( + "testing" + + actionsHelpers "github.com/ethereum-optimism/optimism/op-e2e/actions/helpers" + "github.com/ethereum-optimism/optimism/op-e2e/actions/proofs/helpers" + "github.com/ethereum-optimism/optimism/op-program/client/claim" + "github.com/ethereum/go-ethereum/common" + "github.com/ethereum/go-ethereum/core/types" + "github.com/stretchr/testify/require" +) + +func runBadTxInBatchTest(gt *testing.T, testCfg *helpers.TestCfg[any]) { + t := actionsHelpers.NewDefaultTesting(gt) + env := helpers.NewL2FaultProofEnv(t, testCfg, helpers.NewTestParams(), helpers.NewBatcherCfg()) + + // Build a block on L2 with 1 tx. + env.Alice.L2.ActResetTxOpts(t) + env.Alice.L2.ActSetTxToAddr(&env.Dp.Addresses.Bob) + env.Alice.L2.ActMakeTx(t) + + env.Sequencer.ActL2StartBlock(t) + env.Engine.ActL2IncludeTx(env.Alice.Address())(t) + env.Sequencer.ActL2EndBlock(t) + env.Alice.L2.ActCheckReceiptStatusOfLastTx(true)(t) + + // Instruct the batcher to submit a faulty channel, with an invalid tx. + err := env.Batcher.Buffer(t, func(block *types.Block) { + // Replace the tx with one that has a bad signature. + txs := block.Transactions() + newTx, err := txs[1].WithSignature(env.Alice.L2.Signer(), make([]byte, 65)) + txs[1] = newTx + require.NoError(t, err) + }) + require.NoError(t, err) + env.Batcher.ActL2ChannelClose(t) + env.Batcher.ActL2BatchSubmit(t) + + // Include the batcher transaction. + env.Miner.ActL1StartBlock(12)(t) + env.Miner.ActL1IncludeTxByHash(env.Batcher.LastSubmitted.Hash())(t) + env.Miner.ActL1EndBlock(t) + env.Miner.ActL1SafeNext(t) + + // Instruct the sequencer to derive the L2 chain from the data on L1 that the batcher just posted. + env.Sequencer.ActL1HeadSignal(t) + env.Sequencer.ActL2PipelineFull(t) + + // Ensure the safe head has not advanced - the batch is invalid. + l2SafeHead := env.Engine.L2Chain().CurrentSafeBlock() + require.Equal(t, uint64(0), l2SafeHead.Number.Uint64()) + + // Reset the batcher and submit a valid batch. + env.Batcher.Reset() + env.Batcher.ActSubmitAll(t) + env.Miner.ActL1StartBlock(12)(t) + env.Miner.ActL1IncludeTxByHash(env.Batcher.LastSubmitted.Hash())(t) + env.Miner.ActL1EndBlock(t) + env.Miner.ActL1SafeNext(t) + + // Instruct the sequencer to derive the L2 chain from the data on L1 that the batcher just posted. + env.Sequencer.ActL1HeadSignal(t) + env.Sequencer.ActL2PipelineFull(t) + + // Ensure the safe head has advanced. + l1Head := env.Miner.L1Chain().CurrentBlock() + l2SafeHead = env.Engine.L2Chain().CurrentSafeBlock() + require.Equal(t, uint64(2), l1Head.Number.Uint64()) + require.Equal(t, uint64(1), l2SafeHead.Number.Uint64()) + + env.RunFaultProofProgram(t, l2SafeHead.Number.Uint64(), testCfg.CheckResult, testCfg.InputParams...) +} + +func runBadTxInBatch_ResubmitBadFirstFrame_Test(gt *testing.T, testCfg *helpers.TestCfg[any]) { + t := actionsHelpers.NewDefaultTesting(gt) + env := helpers.NewL2FaultProofEnv(t, testCfg, helpers.NewTestParams(), helpers.NewBatcherCfg()) + + // Build 2 blocks on L2 with 1 tx each. + for i := 0; i < 2; i++ { + env.Alice.L2.ActResetTxOpts(t) + env.Alice.L2.ActSetTxToAddr(&env.Dp.Addresses.Bob) + env.Alice.L2.ActMakeTx(t) + + env.Sequencer.ActL2StartBlock(t) + env.Engine.ActL2IncludeTx(env.Alice.Address())(t) + env.Sequencer.ActL2EndBlock(t) + env.Alice.L2.ActCheckReceiptStatusOfLastTx(true)(t) + } + + // Instruct the batcher to submit a faulty channel, with an invalid tx in the second block + // within the span batch. + env.Batcher.ActL2BatchBuffer(t) + err := env.Batcher.Buffer(t, func(block *types.Block) { + // Replace the tx with one that has a bad signature. + txs := block.Transactions() + newTx, err := txs[1].WithSignature(env.Alice.L2.Signer(), make([]byte, 65)) + txs[1] = newTx + require.NoError(t, err) + }) + require.NoError(t, err) + env.Batcher.ActL2ChannelClose(t) + env.Batcher.ActL2BatchSubmit(t) + + // Include the batcher transaction. + env.Miner.ActL1StartBlock(12)(t) + env.Miner.ActL1IncludeTxByHash(env.Batcher.LastSubmitted.Hash())(t) + env.Miner.ActL1EndBlock(t) + env.Miner.ActL1SafeNext(t) + + // Instruct the sequencer to derive the L2 chain from the data on L1 that the batcher just posted. + env.Sequencer.ActL1HeadSignal(t) + env.Sequencer.ActL2PipelineFull(t) + + // Ensure the safe head has not advanced - the batch is invalid. + l2SafeHead := env.Engine.L2Chain().CurrentSafeBlock() + require.Equal(t, uint64(0), l2SafeHead.Number.Uint64()) + + // Reset the batcher and submit a valid batch. + env.Batcher.Reset() + env.Batcher.ActSubmitAll(t) + env.Miner.ActL1StartBlock(12)(t) + env.Miner.ActL1IncludeTxByHash(env.Batcher.LastSubmitted.Hash())(t) + env.Miner.ActL1EndBlock(t) + env.Miner.ActL1SafeNext(t) + + // Instruct the sequencer to derive the L2 chain from the data on L1 that the batcher just posted. + env.Sequencer.ActL1HeadSignal(t) + env.Sequencer.ActL2PipelineFull(t) + + // Ensure the safe head has advanced. + l1Head := env.Miner.L1Chain().CurrentBlock() + l2SafeHead = env.Engine.L2Chain().CurrentSafeBlock() + require.Equal(t, uint64(2), l1Head.Number.Uint64()) + require.Equal(t, uint64(2), l2SafeHead.Number.Uint64()) + + env.RunFaultProofProgram(t, l2SafeHead.Number.Uint64()-1, testCfg.CheckResult, testCfg.InputParams...) +} + +func Test_ProgramAction_BadTxInBatch(gt *testing.T) { + matrix := helpers.NewMatrix[any]() + defer matrix.Run(gt) + + matrix.AddTestCase( + "HonestClaim", + nil, + helpers.LatestForkOnly, + runBadTxInBatchTest, + helpers.ExpectNoError(), + ) + matrix.AddTestCase( + "JunkClaim", + nil, + helpers.LatestForkOnly, + runBadTxInBatchTest, + helpers.ExpectError(claim.ErrClaimNotValid), + helpers.WithL2Claim(common.HexToHash("0xdeadbeef")), + ) + matrix.AddTestCase( + "ResubmitBadFirstFrame-HonestClaim", + nil, + helpers.LatestForkOnly, + runBadTxInBatch_ResubmitBadFirstFrame_Test, + helpers.ExpectNoError(), + ) + matrix.AddTestCase( + "ResubmitBadFirstFrame-JunkClaim", + nil, + helpers.LatestForkOnly, + runBadTxInBatch_ResubmitBadFirstFrame_Test, + helpers.ExpectError(claim.ErrClaimNotValid), + helpers.WithL2Claim(common.HexToHash("0xdeadbeef")), + ) +} diff --git a/op-e2e/actions/proofs/channel_timeout_test.go b/op-e2e/actions/proofs/channel_timeout_test.go new file mode 100644 index 000000000000..09ff333922ab --- /dev/null +++ b/op-e2e/actions/proofs/channel_timeout_test.go @@ -0,0 +1,250 @@ +package proofs + +import ( + "testing" + + actionsHelpers "github.com/ethereum-optimism/optimism/op-e2e/actions/helpers" + "github.com/ethereum-optimism/optimism/op-e2e/actions/proofs/helpers" + "github.com/ethereum-optimism/optimism/op-program/client/claim" + "github.com/ethereum/go-ethereum/common" + "github.com/stretchr/testify/require" +) + +// Run a test that submits the first channel frame, times out the channel, and then resubmits the full channel. +func runChannelTimeoutTest(gt *testing.T, testCfg *helpers.TestCfg[any]) { + t := actionsHelpers.NewDefaultTesting(gt) + tp := helpers.NewTestParams() + env := helpers.NewL2FaultProofEnv(t, testCfg, tp, helpers.NewBatcherCfg()) + channelTimeout := env.Sd.ChainSpec.ChannelTimeout(0) + + var timedOutChannels uint + env.Sequencer.DerivationMetricsTracer().FnRecordChannelTimedOut = func() { + timedOutChannels++ + } + + const NumL2Blocks = 10 + + // Build NumL2Blocks empty blocks on L2 + for i := 0; i < NumL2Blocks; i++ { + env.Sequencer.ActL2StartBlock(t) + env.Sequencer.ActL2EndBlock(t) + } + + // Buffer the first half of L2 blocks in the batcher, and submit it. + for i := 0; i < NumL2Blocks/2; i++ { + env.Batcher.ActL2BatchBuffer(t) + } + firstFrame := env.Batcher.ReadNextOutputFrame(t) + env.Batcher.ActL2BatchSubmitRaw(t, firstFrame) + + // Include the batcher transaction. + env.Miner.ActL1StartBlock(12)(t) + env.Miner.ActL1IncludeTxByHash(env.Batcher.LastSubmitted.Hash())(t) + env.Miner.ActL1EndBlock(t) + + // Finalize the block with the first channel frame on L1. + env.Miner.ActL1SafeNext(t) + + // Instruct the sequencer to derive the L2 chain from the data on L1 that the batcher just posted. + env.Sequencer.ActL1HeadSignal(t) + env.Sequencer.ActL2PipelineFull(t) + + // Ensure that the safe head has not advanced - the channel is incomplete. + l2SafeHead := env.Engine.L2Chain().CurrentSafeBlock() + require.Equal(t, uint64(0), l2SafeHead.Number.Uint64()) + + // Time out the channel by mining `channelTimeout + 1` empty blocks on L1. + for i := uint64(0); i < channelTimeout+1; i++ { + env.Miner.ActEmptyBlock(t) + env.Miner.ActL1SafeNext(t) + } + + // Instruct the sequencer to derive the L2 chain - the channel should now be timed out. + env.Sequencer.ActL1HeadSignal(t) + env.Sequencer.ActL2PipelineFull(t) + + // Ensure the safe head has still not advanced. + l2SafeHead = env.Engine.L2Chain().CurrentSafeBlock() + require.Equal(t, uint64(0), l2SafeHead.Number.Uint64()) + + // Ensure that the channel was timed out. + require.EqualValues(t, 1, timedOutChannels) + + // Instruct the batcher to submit the blocks to L1 in a new channel, + // submitted across 2 transactions. + for i := 0; i < 2; i++ { + if i == 0 { + // Re-submit the first frame + env.Batcher.ActL2BatchSubmitRaw(t, firstFrame) + } else { + // Buffer half of the L2 chain's blocks. + for j := 0; j < NumL2Blocks/2; j++ { + env.Batcher.ActL2BatchBuffer(t) + } + env.Batcher.ActL2ChannelClose(t) + env.Batcher.ActL2BatchSubmit(t) + } + + env.Miner.ActL1StartBlock(12)(t) + env.Miner.ActL1IncludeTxByHash(env.Batcher.LastSubmitted.Hash())(t) + env.Miner.ActL1EndBlock(t) + + // Finalize the block with the frame data on L1. + env.Miner.ActL1SafeNext(t) + } + + // Instruct the sequencer to derive the L2 chain. + env.Sequencer.ActL1HeadSignal(t) + env.Sequencer.ActL2PipelineFull(t) + + // Ensure the safe head has still advanced to L2 block # NumL2Blocks. + l2SafeHead = env.Engine.L2Chain().CurrentSafeBlock() + require.EqualValues(t, NumL2Blocks, l2SafeHead.Number.Uint64()) + + // Run the FPP on L2 block # NumL2Blocks/2. + env.RunFaultProofProgram(t, NumL2Blocks/2, testCfg.CheckResult, testCfg.InputParams...) +} + +func runChannelTimeoutTest_CloseChannelLate(gt *testing.T, testCfg *helpers.TestCfg[any]) { + t := actionsHelpers.NewDefaultTesting(gt) + tp := helpers.NewTestParams() + env := helpers.NewL2FaultProofEnv(t, testCfg, tp, helpers.NewBatcherCfg()) + channelTimeout := env.Sd.ChainSpec.ChannelTimeout(0) + + var timedOutChannels uint + env.Sequencer.DerivationMetricsTracer().FnRecordChannelTimedOut = func() { + timedOutChannels++ + } + + const NumL2Blocks = 10 + + // Build NumL2Blocks empty blocks on L2 + for i := 0; i < NumL2Blocks; i++ { + env.Sequencer.ActL2StartBlock(t) + env.Sequencer.ActL2EndBlock(t) + } + + // Buffer the first half of L2 blocks in the batcher, and submit it. + for i := 0; i < NumL2Blocks/2; i++ { + env.Batcher.ActL2BatchBuffer(t) + } + firstFrame := env.Batcher.ReadNextOutputFrame(t) + env.Batcher.ActL2BatchSubmitRaw(t, firstFrame) + + // Instruct the batcher to submit the first channel frame to L1, and include the transaction. + env.Miner.ActL1StartBlock(12)(t) + env.Miner.ActL1IncludeTxByHash(env.Batcher.LastSubmitted.Hash())(t) + env.Miner.ActL1EndBlock(t) + + // Finalize the block with the first channel frame on L1. + env.Miner.ActL1SafeNext(t) + + // Instruct the sequencer to derive the L2 chain from the data on L1 that the batcher just posted. + env.Sequencer.ActL1HeadSignal(t) + env.Sequencer.ActL2PipelineFull(t) + + // Ensure that the safe head has not advanced - the channel is incomplete. + l2SafeHead := env.Engine.L2Chain().CurrentSafeBlock() + require.Equal(t, uint64(0), l2SafeHead.Number.Uint64()) + + // Time out the channel by mining `channelTimeout + 1` empty blocks on L1. + for i := uint64(0); i < channelTimeout+1; i++ { + env.Miner.ActEmptyBlock(t) + env.Miner.ActL1SafeNext(t) + } + + // Instruct the sequencer to derive the L2 chain. + env.Sequencer.ActL1HeadSignal(t) + env.Sequencer.ActL2PipelineFull(t) + + // Ensure the safe head has still not advanced. + l2SafeHead = env.Engine.L2Chain().CurrentSafeBlock() + require.Equal(t, uint64(0), l2SafeHead.Number.Uint64()) + + // Ensure that the channel was timed out. + require.EqualValues(t, 1, timedOutChannels) + + // Cache the second and final frame of the channel from the batcher, but do not submit it yet. + for i := 0; i < NumL2Blocks/2; i++ { + env.Batcher.ActL2BatchBuffer(t) + } + env.Batcher.ActL2ChannelClose(t) + finalFrame := env.Batcher.ReadNextOutputFrame(t) + + // Submit the final frame of the timed out channel, now that the channel has timed out. + env.Batcher.ActL2BatchSubmitRaw(t, finalFrame) + + // Instruct the batcher to submit the second channel frame to L1, and include the transaction. + env.Miner.ActL1StartBlock(12)(t) + env.Miner.ActL1IncludeTxByHash(env.Batcher.LastSubmitted.Hash())(t) + env.Miner.ActL1EndBlock(t) + + // Finalize the block with the second channel frame on L1. + env.Miner.ActL1SafeNext(t) + + // Instruct the sequencer to derive the L2 chain from the data on L1 that the batcher just posted. + env.Sequencer.ActL1HeadSignal(t) + env.Sequencer.ActL2PipelineFull(t) + + // Ensure the safe head has still not advanced. + l2SafeHead = env.Engine.L2Chain().CurrentSafeBlock() + require.Equal(t, uint64(0), l2SafeHead.Number.Uint64()) + + // Instruct the batcher to submit the blocks to L1 in a new channel. + for _, frame := range [][]byte{firstFrame, finalFrame} { + env.Batcher.ActL2BatchSubmitRaw(t, frame) + env.Miner.ActL1StartBlock(12)(t) + env.Miner.ActL1IncludeTxByHash(env.Batcher.LastSubmitted.Hash())(t) + env.Miner.ActL1EndBlock(t) + + // Finalize the block with the resubmitted channel frames on L1. + env.Miner.ActL1SafeNext(t) + } + + // Instruct the sequencer to derive the L2 chain. + env.Sequencer.ActL1HeadSignal(t) + env.Sequencer.ActL2PipelineFull(t) + + // Ensure the safe head has still advanced to L2 block # NumL2Blocks. + l2SafeHead = env.Engine.L2Chain().CurrentSafeBlock() + require.EqualValues(t, NumL2Blocks, l2SafeHead.Number.Uint64()) + + // Run the FPP on L2 block # NumL2Blocks/2. + env.RunFaultProofProgram(t, NumL2Blocks/2, testCfg.CheckResult, testCfg.InputParams...) +} + +func Test_ProgramAction_ChannelTimeout(gt *testing.T) { + matrix := helpers.NewMatrix[any]() + defer matrix.Run(gt) + + matrix.AddTestCase( + "HonestClaim", + nil, + helpers.LatestForkOnly, + runChannelTimeoutTest, + helpers.ExpectNoError(), + ) + matrix.AddTestCase( + "JunkClaim", + nil, + helpers.LatestForkOnly, + runChannelTimeoutTest, + helpers.ExpectError(claim.ErrClaimNotValid), + helpers.WithL2Claim(common.HexToHash("0xdeadbeef")), + ) + matrix.AddTestCase( + "CloseChannelLate-HonestClaim", + nil, + helpers.LatestForkOnly, + runChannelTimeoutTest_CloseChannelLate, + helpers.ExpectNoError(), + ) + matrix.AddTestCase( + "CloseChannelLate-JunkClaim", + nil, + helpers.LatestForkOnly, + runChannelTimeoutTest_CloseChannelLate, + helpers.ExpectError(claim.ErrClaimNotValid), + helpers.WithL2Claim(common.HexToHash("0xdeadbeef")), + ) +} diff --git a/op-e2e/actions/proofs/garbage_channel_test.go b/op-e2e/actions/proofs/garbage_channel_test.go new file mode 100644 index 000000000000..f112a1a71bda --- /dev/null +++ b/op-e2e/actions/proofs/garbage_channel_test.go @@ -0,0 +1,123 @@ +package proofs + +import ( + "fmt" + "testing" + + actionsHelpers "github.com/ethereum-optimism/optimism/op-e2e/actions/helpers" + "github.com/ethereum-optimism/optimism/op-e2e/actions/proofs/helpers" + "github.com/ethereum-optimism/optimism/op-e2e/e2eutils" + "github.com/ethereum-optimism/optimism/op-program/client/claim" + "github.com/ethereum/go-ethereum/common" + "github.com/stretchr/testify/require" +) + +// garbageKinds is a list of garbage kinds to test. We don't use `INVALID_COMPRESSION` and `MALFORM_RLP` because +// they submit malformed frames always, and this test models a valid channel with a single invalid frame in the +// middle. +var garbageKinds = []actionsHelpers.GarbageKind{ + actionsHelpers.STRIP_VERSION, + actionsHelpers.RANDOM, + actionsHelpers.TRUNCATE_END, + actionsHelpers.DIRTY_APPEND, +} + +// Run a test that submits garbage channel data in the middle of a channel. +// +// channel format ([]Frame): +// [f[0 - correct] f_x[1 - bad frame] f[1 - correct]] +func runGarbageChannelTest(gt *testing.T, testCfg *helpers.TestCfg[actionsHelpers.GarbageKind]) { + t := actionsHelpers.NewDefaultTesting(gt) + tp := helpers.NewTestParams(func(tp *e2eutils.TestParams) { + // Set the channel timeout to 10 blocks, 12x lower than the sequencing window. + tp.ChannelTimeout = 10 + }) + env := helpers.NewL2FaultProofEnv(t, testCfg, tp, helpers.NewBatcherCfg()) + + includeBatchTx := func(env *helpers.L2FaultProofEnv) { + // Instruct the batcher to submit the first channel frame to L1, and include the transaction. + env.Miner.ActL1StartBlock(12)(t) + env.Miner.ActL1IncludeTxByHash(env.Batcher.LastSubmitted.Hash())(t) + env.Miner.ActL1EndBlock(t) + + // Finalize the block with the first channel frame on L1. + env.Miner.ActL1SafeNext(t) + env.Miner.ActL1FinalizeNext(t) + + // Instruct the sequencer to derive the L2 chain from the data on L1 that the batcher just posted. + env.Sequencer.ActL1HeadSignal(t) + env.Sequencer.ActL2PipelineFull(t) + } + + const NumL2Blocks = 10 + + // Build NumL2Blocks empty blocks on L2 + for i := 0; i < NumL2Blocks; i++ { + env.Sequencer.ActL2StartBlock(t) + env.Sequencer.ActL2EndBlock(t) + } + + // Buffer the first half of L2 blocks in the batcher, and submit it. + for i := 0; i < NumL2Blocks/2; i++ { + env.Batcher.ActL2BatchBuffer(t) + } + env.Batcher.ActL2BatchSubmit(t) + + // Include the batcher transaction. + includeBatchTx(env) + + // Ensure that the safe head has not advanced - the channel is incomplete. + l2SafeHead := env.Engine.L2Chain().CurrentSafeBlock() + require.Equal(t, uint64(0), l2SafeHead.Number.Uint64()) + + // Buffer the second half of L2 blocks in the batcher. + for i := 0; i < NumL2Blocks/2; i++ { + env.Batcher.ActL2BatchBuffer(t) + } + env.Batcher.ActL2ChannelClose(t) + expectedSecondFrame := env.Batcher.ReadNextOutputFrame(t) + + // Submit a garbage frame, modified from the expected second frame. + env.Batcher.ActL2BatchSubmitGarbageRaw(t, expectedSecondFrame, testCfg.Custom) + // Include the garbage second frame tx + includeBatchTx(env) + + // Ensure that the safe head has not advanced - the channel is incomplete. + l2SafeHead = env.Engine.L2Chain().CurrentSafeBlock() + require.Equal(t, uint64(0), l2SafeHead.Number.Uint64()) + + // Submit the correct second frame. + env.Batcher.ActL2BatchSubmitRaw(t, expectedSecondFrame) + // Include the corract second frame tx. + includeBatchTx(env) + + // Ensure that the safe head has advanced - the channel is complete. + l2SafeHead = env.Engine.L2Chain().CurrentSafeBlock() + require.Equal(t, uint64(NumL2Blocks), l2SafeHead.Number.Uint64()) + + // Run the FPP on L2 block # NumL2Blocks. + env.RunFaultProofProgram(t, NumL2Blocks, testCfg.CheckResult, testCfg.InputParams...) +} + +func Test_ProgramAction_GarbageChannel(gt *testing.T) { + matrix := helpers.NewMatrix[actionsHelpers.GarbageKind]() + defer matrix.Run(gt) + + for _, garbageKind := range garbageKinds { + matrix.AddTestCase( + fmt.Sprintf("HonestClaim-%s", garbageKind.String()), + garbageKind, + helpers.LatestForkOnly, + runGarbageChannelTest, + helpers.ExpectNoError(), + ) + matrix.AddTestCase( + fmt.Sprintf("JunkClaim-%s", garbageKind.String()), + garbageKind, + helpers.LatestForkOnly, + runGarbageChannelTest, + helpers.ExpectError(claim.ErrClaimNotValid), + helpers.WithL2Claim(common.HexToHash("0xdeadbeef")), + ) + } +} diff --git a/op-e2e/actions/proofs/helpers/env.go b/op-e2e/actions/proofs/helpers/env.go new file mode 100644 index 000000000000..ca670acb228d --- /dev/null +++ b/op-e2e/actions/proofs/helpers/env.go @@ -0,0 +1,257 @@ +package helpers + +import ( + "context" + "math/rand" + + altda "github.com/ethereum-optimism/optimism/op-alt-da" + batcherFlags "github.com/ethereum-optimism/optimism/op-batcher/flags" + "github.com/ethereum-optimism/optimism/op-e2e/actions/helpers" + "github.com/ethereum-optimism/optimism/op-e2e/e2eutils" + "github.com/ethereum-optimism/optimism/op-e2e/e2eutils/fakebeacon" + "github.com/ethereum-optimism/optimism/op-program/host" + "github.com/ethereum-optimism/optimism/op-program/host/config" + "github.com/ethereum-optimism/optimism/op-program/host/kvstore" + "github.com/ethereum-optimism/optimism/op-program/host/prefetcher" + hostTypes "github.com/ethereum-optimism/optimism/op-program/host/types" + "github.com/ethereum-optimism/optimism/op-service/sources" + "github.com/ethereum-optimism/optimism/op-service/testlog" + "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/stretchr/testify/require" +) + +// L2FaultProofEnv is a test harness for a fault provable L2 chain. +type L2FaultProofEnv struct { + log log.Logger + Batcher *helpers.L2Batcher + Sequencer *helpers.L2Sequencer + Engine *helpers.L2Engine + engCl *sources.EngineClient + Sd *e2eutils.SetupData + Dp *e2eutils.DeployParams + Miner *helpers.L1Miner + Alice *helpers.CrossLayerUser + Bob *helpers.CrossLayerUser +} + +func NewL2FaultProofEnv[c any](t helpers.Testing, testCfg *TestCfg[c], tp *e2eutils.TestParams, batcherCfg *helpers.BatcherCfg) *L2FaultProofEnv { + log := testlog.Logger(t, log.LvlDebug) + dp := NewDeployParams(t, tp, func(dp *e2eutils.DeployParams) { + genesisBlock := hexutil.Uint64(0) + + // Enable cancun always + dp.DeployConfig.L1CancunTimeOffset = &genesisBlock + + // Enable L2 feature. + switch testCfg.Hardfork { + case Regolith: + dp.DeployConfig.L2GenesisRegolithTimeOffset = &genesisBlock + case Canyon: + dp.DeployConfig.L2GenesisCanyonTimeOffset = &genesisBlock + case Delta: + dp.DeployConfig.L2GenesisDeltaTimeOffset = &genesisBlock + case Ecotone: + dp.DeployConfig.L2GenesisEcotoneTimeOffset = &genesisBlock + case Fjord: + dp.DeployConfig.L2GenesisFjordTimeOffset = &genesisBlock + case Granite: + dp.DeployConfig.L2GenesisGraniteTimeOffset = &genesisBlock + } + }) + sd := e2eutils.Setup(t, dp, helpers.DefaultAlloc) + + jwtPath := e2eutils.WriteDefaultJWT(t) + cfg := &helpers.SequencerCfg{VerifierCfg: *helpers.DefaultVerifierCfg()} + + miner := helpers.NewL1Miner(t, log.New("role", "l1-miner"), sd.L1Cfg) + + l1Cl, err := sources.NewL1Client(miner.RPCClient(), log, nil, sources.L1ClientDefaultConfig(sd.RollupCfg, false, sources.RPCKindStandard)) + require.NoError(t, err) + engine := helpers.NewL2Engine(t, log.New("role", "sequencer-engine"), sd.L2Cfg, sd.RollupCfg.Genesis.L1, jwtPath, helpers.EngineWithP2P()) + l2EngineCl, err := sources.NewEngineClient(engine.RPCClient(), log, nil, sources.EngineClientDefaultConfig(sd.RollupCfg)) + require.NoError(t, err) + + sequencer := helpers.NewL2Sequencer(t, log.New("role", "sequencer"), l1Cl, miner.BlobStore(), altda.Disabled, l2EngineCl, sd.RollupCfg, 0, cfg.InteropBackend) + miner.ActL1SetFeeRecipient(common.Address{0xCA, 0xFE, 0xBA, 0xBE}) + sequencer.ActL2PipelineFull(t) + engCl := engine.EngineClient(t, sd.RollupCfg) + + // Set the batcher key to the secret key of the batcher + batcherCfg.BatcherKey = dp.Secrets.Batcher + batcher := helpers.NewL2Batcher(log, sd.RollupCfg, batcherCfg, sequencer.RollupClient(), miner.EthClient(), engine.EthClient(), engCl) + + addresses := e2eutils.CollectAddresses(sd, dp) + l1EthCl := miner.EthClient() + l2EthCl := engine.EthClient() + l1UserEnv := &helpers.BasicUserEnv[*helpers.L1Bindings]{ + EthCl: l1EthCl, + Signer: types.LatestSigner(sd.L1Cfg.Config), + AddressCorpora: addresses, + Bindings: helpers.NewL1Bindings(t, l1EthCl), + } + l2UserEnv := &helpers.BasicUserEnv[*helpers.L2Bindings]{ + EthCl: l2EthCl, + Signer: types.LatestSigner(sd.L2Cfg.Config), + AddressCorpora: addresses, + Bindings: helpers.NewL2Bindings(t, l2EthCl, engine.GethClient()), + } + alice := helpers.NewCrossLayerUser(log, dp.Secrets.Alice, rand.New(rand.NewSource(0xa57b))) + alice.L1.SetUserEnv(l1UserEnv) + alice.L2.SetUserEnv(l2UserEnv) + bob := helpers.NewCrossLayerUser(log, dp.Secrets.Bob, rand.New(rand.NewSource(0xbeef))) + bob.L1.SetUserEnv(l1UserEnv) + bob.L2.SetUserEnv(l2UserEnv) + + return &L2FaultProofEnv{ + log: log, + Batcher: batcher, + Sequencer: sequencer, + Engine: engine, + engCl: engCl, + Sd: sd, + Dp: dp, + Miner: miner, + Alice: alice, + Bob: bob, + } +} + +type FixtureInputParam func(f *FixtureInputs) + +type CheckResult func(helpers.Testing, error) + +func ExpectNoError() CheckResult { + return func(t helpers.Testing, err error) { + require.NoError(t, err, "fault proof program should have succeeded") + } +} + +func ExpectError(expectedErr error) CheckResult { + return func(t helpers.Testing, err error) { + require.ErrorIs(t, err, expectedErr, "fault proof program should have failed with expected error") + } +} + +func WithL2Claim(claim common.Hash) FixtureInputParam { + return func(f *FixtureInputs) { + f.L2Claim = claim + } +} + +func (env *L2FaultProofEnv) RunFaultProofProgram(t helpers.Testing, l2ClaimBlockNum uint64, checkResult CheckResult, fixtureInputParams ...FixtureInputParam) { + // Fetch the pre and post output roots for the fault proof. + preRoot, err := env.Sequencer.RollupClient().OutputAtBlock(t.Ctx(), l2ClaimBlockNum-1) + require.NoError(t, err) + claimRoot, err := env.Sequencer.RollupClient().OutputAtBlock(t.Ctx(), l2ClaimBlockNum) + require.NoError(t, err) + l1Head := env.Miner.L1Chain().CurrentBlock() + + fixtureInputs := &FixtureInputs{ + L2BlockNumber: l2ClaimBlockNum, + L2Claim: common.Hash(claimRoot.OutputRoot), + L2Head: preRoot.BlockRef.Hash, + L2OutputRoot: common.Hash(preRoot.OutputRoot), + L2ChainID: env.Sd.RollupCfg.L2ChainID.Uint64(), + L1Head: l1Head.Hash(), + } + for _, apply := range fixtureInputParams { + apply(fixtureInputs) + } + + // Run the fault proof program from the state transition from L2 block l2ClaimBlockNum - 1 -> l2ClaimBlockNum. + workDir := t.TempDir() + if IsKonaConfigured() { + fakeBeacon := fakebeacon.NewBeacon( + env.log, + env.Miner.BlobStore(), + env.Sd.L1Cfg.Timestamp, + 12, + ) + require.NoError(t, fakeBeacon.Start("127.0.0.1:0")) + defer fakeBeacon.Close() + + err = RunKonaNative(t, workDir, env, env.Miner.HTTPEndpoint(), fakeBeacon.BeaconAddr(), env.Engine.HTTPEndpoint(), *fixtureInputs) + checkResult(t, err) + } else { + programCfg := NewOpProgramCfg( + t, + env, + fixtureInputs, + ) + withInProcessPrefetcher := host.WithPrefetcher(func(ctx context.Context, logger log.Logger, kv kvstore.KV, cfg *config.Config) (host.Prefetcher, error) { + // Set up in-process L1 sources + l1Cl := env.Miner.L1Client(t, env.Sd.RollupCfg) + l1BlobFetcher := env.Miner.BlobSource() + + // Set up in-process L2 source + l2ClCfg := sources.L2ClientDefaultConfig(env.Sd.RollupCfg, true) + l2RPC := env.Engine.RPCClient() + l2Client, err := host.NewL2Client(l2RPC, env.log, nil, &host.L2ClientConfig{L2ClientConfig: l2ClCfg, L2Head: cfg.L2Head}) + require.NoError(t, err, "failed to create L2 client") + l2DebugCl := &host.L2Source{L2Client: l2Client, DebugClient: sources.NewDebugClient(l2RPC.CallContext)} + + return prefetcher.NewPrefetcher(logger, l1Cl, l1BlobFetcher, l2DebugCl, kv), nil + }) + err = host.FaultProofProgram(t.Ctx(), env.log, programCfg, withInProcessPrefetcher) + checkResult(t, err) + } + tryDumpTestFixture(t, err, t.Name(), env, *fixtureInputs, workDir) +} + +type TestParam func(p *e2eutils.TestParams) + +func NewTestParams(params ...TestParam) *e2eutils.TestParams { + dfault := helpers.DefaultRollupTestParams + for _, apply := range params { + apply(dfault) + } + return dfault +} + +type DeployParam func(p *e2eutils.DeployParams) + +func NewDeployParams(t helpers.Testing, tp *e2eutils.TestParams, params ...DeployParam) *e2eutils.DeployParams { + dfault := e2eutils.MakeDeployParams(t, tp) + for _, apply := range params { + apply(dfault) + } + return dfault +} + +type BatcherCfgParam func(c *helpers.BatcherCfg) + +func NewBatcherCfg(params ...BatcherCfgParam) *helpers.BatcherCfg { + dfault := &helpers.BatcherCfg{ + MinL1TxSize: 0, + MaxL1TxSize: 128_000, + DataAvailabilityType: batcherFlags.BlobsType, + } + for _, apply := range params { + apply(dfault) + } + return dfault +} + +type OpProgramCfgParam func(p *config.Config) + +func NewOpProgramCfg( + t helpers.Testing, + env *L2FaultProofEnv, + fi *FixtureInputs, + params ...OpProgramCfgParam, +) *config.Config { + dfault := config.NewConfig(env.Sd.RollupCfg, env.Sd.L2Cfg.Config, fi.L1Head, fi.L2Head, fi.L2OutputRoot, fi.L2Claim, fi.L2BlockNumber) + + if dumpFixtures { + dfault.DataDir = t.TempDir() + dfault.DataFormat = hostTypes.DataFormatPebble + } + + for _, apply := range params { + apply(dfault) + } + return dfault +} diff --git a/op-e2e/actions/proofs/helpers/fixture.go b/op-e2e/actions/proofs/helpers/fixture.go new file mode 100644 index 000000000000..892848470897 --- /dev/null +++ b/op-e2e/actions/proofs/helpers/fixture.go @@ -0,0 +1,135 @@ +package helpers + +import ( + "encoding/json" + "errors" + "io/fs" + "os" + "os/exec" + "path/filepath" + "regexp" + "strings" + + "github.com/ethereum-optimism/optimism/op-e2e/actions/helpers" + "github.com/ethereum-optimism/optimism/op-program/client/claim" + "github.com/ethereum/go-ethereum/common" + "github.com/naoina/toml" + "github.com/stretchr/testify/require" +) + +var ( + dumpFixtures = false + fixtureDir string +) + +func init() { + fixtureDir = os.Getenv("OP_E2E_FPP_FIXTURE_DIR") + if fixtureDir != "" { + dumpFixtures = true + } +} + +type TestFixture struct { + Name string `toml:"name"` + ExpectedStatus uint8 `toml:"expected-status"` + Inputs FixtureInputs `toml:"inputs"` +} + +type FixtureInputs struct { + L2BlockNumber uint64 `toml:"l2-block-number"` + L2Claim common.Hash `toml:"l2-claim"` + L2Head common.Hash `toml:"l2-head"` + L2OutputRoot common.Hash `toml:"l2-output-root"` + L2ChainID uint64 `toml:"l2-chain-id"` + L1Head common.Hash `toml:"l1-head"` +} + +// Dumps a `fp-tests` test fixture to disk if the `OP_E2E_FPP_FIXTURE_DIR` environment variable is set. +// +// [fp-tests]: https://github.com/ethereum-optimism/fp-tests +func tryDumpTestFixture( + t helpers.Testing, + result error, + name string, + env *L2FaultProofEnv, + inputs FixtureInputs, + workDir string, +) { + if !dumpFixtures { + return + } + + name = convertToKebabCase(name) + rollupCfg := env.Sd.RollupCfg + l2Genesis := env.Sd.L2Cfg + + var expectedStatus uint8 + if result == nil { + expectedStatus = 0 + } else if errors.Is(result, claim.ErrClaimNotValid) { + expectedStatus = 1 + } else { + expectedStatus = 2 + } + + fixture := TestFixture{ + Name: name, + ExpectedStatus: expectedStatus, + Inputs: inputs, + } + + fixturePath := filepath.Join(fixtureDir, name) + + err := os.MkdirAll(filepath.Join(fixturePath), fs.ModePerm) + require.NoError(t, err, "failed to create fixture dir") + + fixtureFilePath := filepath.Join(fixturePath, "fixture.toml") + serFixture, err := toml.Marshal(fixture) + require.NoError(t, err, "failed to serialize fixture") + require.NoError(t, os.WriteFile(fixtureFilePath, serFixture, fs.ModePerm), "failed to write fixture") + + genesisPath := filepath.Join(fixturePath, "genesis.json") + serGenesis, err := l2Genesis.MarshalJSON() + require.NoError(t, err, "failed to serialize genesis") + require.NoError(t, os.WriteFile(genesisPath, serGenesis, fs.ModePerm), "failed to write genesis") + + rollupPath := filepath.Join(fixturePath, "rollup.json") + serRollup, err := json.Marshal(rollupCfg) + require.NoError(t, err, "failed to serialize rollup") + require.NoError(t, os.WriteFile(rollupPath, serRollup, fs.ModePerm), "failed to write rollup") + + // Copy the witness database into the fixture directory. + cmd := exec.Command("cp", "-r", workDir, filepath.Join(fixturePath, "witness-db")) + require.NoError(t, cmd.Run(), "Failed to copy witness DB") + + // Compress the genesis file. + cmd = exec.Command("zstd", genesisPath) + _ = cmd.Run() + require.NoError(t, os.Remove(genesisPath), "Failed to remove uncompressed genesis file") + + // Compress the witness database. + cmd = exec.Command( + "tar", + "--zstd", + "-cf", + filepath.Join(fixturePath, "witness-db.tar.zst"), + filepath.Join(fixturePath, "witness-db"), + ) + cmd.Dir = filepath.Join(fixturePath) + require.NoError(t, cmd.Run(), "Failed to compress witness DB") + require.NoError(t, os.RemoveAll(filepath.Join(fixturePath, "witness-db")), "Failed to remove uncompressed witness DB") +} + +// Convert to lower kebab case for strings containing `/` +func convertToKebabCase(input string) string { + if !strings.Contains(input, "/") { + return input + } + + // Replace non-alphanumeric characters with underscores + re := regexp.MustCompile(`[^a-zA-Z0-9]+`) + snake := re.ReplaceAllString(input, "-") + + // Convert to lower case + return strings.ToLower(snake) +} diff --git a/op-e2e/actions/proofs/helpers/kona.go b/op-e2e/actions/proofs/helpers/kona.go new file mode 100644 index 000000000000..9d34a98dda01 --- /dev/null +++ b/op-e2e/actions/proofs/helpers/kona.go @@ -0,0 +1,78 @@ +package helpers + +import ( + "encoding/json" + "fmt" + "io/fs" + "math/big" + "os" + "os/exec" + "path/filepath" + + "github.com/ethereum-optimism/optimism/op-challenger/game/fault/trace/utils" + "github.com/ethereum-optimism/optimism/op-challenger/game/fault/trace/vm" + "github.com/ethereum-optimism/optimism/op-e2e/actions/helpers" + "github.com/ethereum-optimism/optimism/op-program/client/claim" + "github.com/stretchr/testify/require" +) + +var konaHostPath, konaClientPath string + +func init() { + konaHostPath = os.Getenv("KONA_HOST_PATH") + konaClientPath = os.Getenv("KONA_CLIENT_PATH") +} + +func IsKonaConfigured() bool { + return konaHostPath != "" && konaClientPath != "" +} + +func RunKonaNative( + t helpers.Testing, + workDir string, + env *L2FaultProofEnv, + l1Rpc string, + l1BeaconRpc string, + l2Rpc string, + fixtureInputs FixtureInputs, +) error { + // Write rollup config to tempdir. + rollupConfigPath := filepath.Join(workDir, "rollup.json") + ser, err := json.Marshal(env.Sd.RollupCfg) + require.NoError(t, err) + require.NoError(t, os.WriteFile(rollupConfigPath, ser, fs.ModePerm)) + + // Run the fault proof program from the state transition from L2 block L2Blocknumber - 1 -> L2BlockNumber. + vmCfg := vm.Config{ + L1: l1Rpc, + L1Beacon: l1BeaconRpc, + L2: l2Rpc, + RollupConfigPath: rollupConfigPath, + Server: konaHostPath, + } + inputs := utils.LocalGameInputs{ + L1Head: fixtureInputs.L1Head, + L2Head: fixtureInputs.L2Head, + L2OutputRoot: fixtureInputs.L2OutputRoot, + L2Claim: fixtureInputs.L2Claim, + L2BlockNumber: big.NewInt(int64(fixtureInputs.L2BlockNumber)), + } + hostCmd, err := vm.NewNativeKonaExecutor(konaClientPath).OracleCommand(vmCfg, workDir, inputs) + require.NoError(t, err) + + cmd := exec.Command(hostCmd[0], hostCmd[1:]...) + cmd.Dir = workDir + cmd.Stdout = os.Stdout + cmd.Stderr = os.Stdout + + status := cmd.Run() + switch status := status.(type) { + case *exec.ExitError: + if status.ExitCode() == 1 { + return claim.ErrClaimNotValid + } + return fmt.Errorf("kona exited with status %d", status.ExitCode()) + default: + return status + } +} diff --git a/op-e2e/actions/proofs/helpers/matrix.go b/op-e2e/actions/proofs/helpers/matrix.go new file mode 100644 index 000000000000..7f3e810e86b6 --- /dev/null +++ b/op-e2e/actions/proofs/helpers/matrix.go @@ -0,0 +1,97 @@ +package helpers + +import ( + "fmt" + "testing" +) + +type RunTest[cfg any] func(t *testing.T, testCfg *TestCfg[cfg]) + +type TestCfg[cfg any] struct { + Hardfork *Hardfork + CheckResult CheckResult + InputParams []FixtureInputParam + Custom cfg +} + +type TestCase[cfg any] struct { + Name string + Cfg cfg + ForkMatrix ForkMatrix + RunTest RunTest[cfg] + InputParams []FixtureInputParam + CheckResult CheckResult +} + +type TestMatrix[cfg any] struct { + CommonInputParams []FixtureInputParam + TestCases []TestCase[cfg] +} + +func (suite *TestMatrix[cfg]) Run(t *testing.T) { + for _, tc := range suite.TestCases { + for _, fork := range tc.ForkMatrix { + t.Run(fmt.Sprintf("%s-%s", tc.Name, fork.Name), func(t *testing.T) { + testCfg := &TestCfg[cfg]{ + Hardfork: fork, + CheckResult: tc.CheckResult, + InputParams: append(suite.CommonInputParams, tc.InputParams...), + Custom: tc.Cfg, + } + tc.RunTest(t, testCfg) + }) + } + } +} + +func NewMatrix[cfg any]() *TestMatrix[cfg] { + return &TestMatrix[cfg]{} +} + +func (ts *TestMatrix[cfg]) WithCommonInputParams(params ...FixtureInputParam) *TestMatrix[cfg] { + ts.CommonInputParams = params + return ts +} + +func (ts *TestMatrix[cfg]) AddTestCase( + name string, + testCfg cfg, + forkMatrix ForkMatrix, + runTest RunTest[cfg], + checkResult CheckResult, + inputParams ...FixtureInputParam, +) *TestMatrix[cfg] { + ts.TestCases = append(ts.TestCases, TestCase[cfg]{ + Name: name, + Cfg: testCfg, + ForkMatrix: forkMatrix, + RunTest: runTest, + InputParams: inputParams, + CheckResult: checkResult, + }) + return ts +} + +type Hardfork struct { + Name string + Precedence int +} + +type ForkMatrix = []*Hardfork + +// Hardfork definitions +var ( + Regolith = &Hardfork{Name: "Regolith", Precedence: 1} + Canyon = &Hardfork{Name: "Canyon", Precedence: 2} + Delta = &Hardfork{Name: "Delta", Precedence: 3} + Fjord = &Hardfork{Name: "Fjord", Precedence: 4} + Ecotone = &Hardfork{Name: "Ecotone", Precedence: 5} + Granite = &Hardfork{Name: "Granite", Precedence: 6} +) +var Hardforks = ForkMatrix{Regolith, Canyon, Delta, Fjord, Ecotone, Granite} + +var LatestForkOnly = ForkMatrix{Hardforks[len(Hardforks)-1]} + +func NewForkMatrix(forks ...*Hardfork) ForkMatrix { + return append(ForkMatrix{}, forks...) +} diff --git a/op-e2e/actions/proofs/l1_lookback_test.go b/op-e2e/actions/proofs/l1_lookback_test.go new file mode 100644 index 000000000000..b40635ac5509 --- /dev/null +++ b/op-e2e/actions/proofs/l1_lookback_test.go @@ -0,0 +1,161 @@ +package proofs + +import ( + "testing" + + actionsHelpers "github.com/ethereum-optimism/optimism/op-e2e/actions/helpers" + "github.com/ethereum-optimism/optimism/op-e2e/actions/proofs/helpers" + "github.com/ethereum-optimism/optimism/op-program/client/claim" + "github.com/ethereum/go-ethereum/common" + "github.com/ethereum/go-ethereum/core/types" + "github.com/stretchr/testify/require" +) + +func runL1LookbackTest(gt *testing.T, testCfg *helpers.TestCfg[any]) { + t := actionsHelpers.NewDefaultTesting(gt) + tp := helpers.NewTestParams() + env := helpers.NewL2FaultProofEnv(t, testCfg, tp, helpers.NewBatcherCfg()) + + const numL2Blocks = 8 + for i := 0; i < numL2Blocks; i++ { + // Create an empty L2 block. + env.Sequencer.ActL2StartBlock(t) + env.Sequencer.ActL2EndBlock(t) + + // Buffer the L2 block in the batcher. + env.Batcher.ActBufferAll(t) + if i == numL2Blocks-1 { + env.Batcher.ActL2ChannelClose(t) + } + env.Batcher.ActL2BatchSubmit(t) + + // Include the frame on L1. + env.Miner.ActL1StartBlock(12)(t) + env.Miner.ActL1IncludeTxByHash(env.Batcher.LastSubmitted.Hash())(t) + env.Miner.ActL1EndBlock(t) + env.Miner.ActL1SafeNext(t) + } + + // Instruct the sequencer to derive the L2 chain from the data on L1 that the batcher just posted. + env.Sequencer.ActL1HeadSignal(t) + env.Sequencer.ActL2PipelineFull(t) + + // Ensure that the safe head has advanced to `NumL2Blocks`. + l2SafeHead := env.Engine.L2Chain().CurrentSafeBlock() + require.EqualValues(t, numL2Blocks, l2SafeHead.Number.Uint64()) + + // Run the FPP on the configured L2 block. + env.RunFaultProofProgram(t, numL2Blocks/2, testCfg.CheckResult, testCfg.InputParams...) +} + +func runL1LookbackTest_ReopenChannel(gt *testing.T, testCfg *helpers.TestCfg[any]) { + t := actionsHelpers.NewDefaultTesting(gt) + tp := helpers.NewTestParams() + env := helpers.NewL2FaultProofEnv(t, testCfg, tp, helpers.NewBatcherCfg()) + + // Create an L2 block with 1 transaction. + env.Sequencer.ActL2StartBlock(t) + env.Alice.L2.ActResetTxOpts(t) + env.Alice.L2.ActSetTxToAddr(&env.Dp.Addresses.Bob) + env.Alice.L2.ActMakeTx(t) + env.Engine.ActL2IncludeTx(env.Alice.Address())(t) + env.Sequencer.ActL2EndBlock(t) + l2BlockBeforeDerive := env.Engine.L2Chain().CurrentBlock() + + // Buffer the L2 block in the batcher. + env.Batcher.ActL2BatchBuffer(t) + env.Batcher.ActL2BatchSubmit(t) + + // Include the frame on L1. + env.Miner.ActL1StartBlock(12)(t) + env.Miner.ActL1IncludeTxByHash(env.Batcher.LastSubmitted.Hash())(t) + env.Miner.ActL1EndBlock(t) + env.Miner.ActL1SafeNext(t) + + // Re-submit the first L2 block frame w/ different transaction data. + err := env.Batcher.Buffer(t, func(block *types.Block) { + env.Bob.L2.ActResetTxOpts(t) + env.Bob.L2.ActSetTxToAddr(&env.Dp.Addresses.Mallory) + tx := env.Bob.L2.MakeTransaction(t) + block.Transactions()[1] = tx + }) + require.NoError(t, err) + env.Batcher.ActL2BatchSubmit(t) + + // Include the duplicate frame on L1. + env.Miner.ActL1StartBlock(12)(t) + env.Miner.ActL1IncludeTxByHash(env.Batcher.LastSubmitted.Hash())(t) + env.Miner.ActL1EndBlock(t) + env.Miner.ActL1SafeNext(t) + + const numL2Blocks = 8 + for i := 1; i < numL2Blocks; i++ { + // Create an empty L2 block. + env.Sequencer.ActL2StartBlock(t) + env.Sequencer.ActL2EndBlock(t) + + // Buffer the L2 block in the batcher. + env.Batcher.ActBufferAll(t) + if i == numL2Blocks-1 { + env.Batcher.ActL2ChannelClose(t) + } + env.Batcher.ActL2BatchSubmit(t) + + // Include the frame on L1. + env.Miner.ActL1StartBlock(12)(t) + env.Miner.ActL1IncludeTxByHash(env.Batcher.LastSubmitted.Hash())(t) + env.Miner.ActL1EndBlock(t) + env.Miner.ActL1SafeNext(t) + } + + // Instruct the sequencer to derive the L2 chain from the data on L1 that the batcher just posted. + env.Sequencer.ActL1HeadSignal(t) + env.Sequencer.ActL2PipelineFull(t) + + // Ensure that the correct block was derived. + l2BlockAfterDerive := env.Engine.L2Chain().GetBlockByNumber(1) + require.EqualValues(t, l2BlockAfterDerive.Hash(), l2BlockBeforeDerive.Hash()) + + // Ensure that the safe head has advanced to `NumL2Blocks`. + l2SafeHead := env.Engine.L2Chain().CurrentSafeBlock() + require.EqualValues(t, numL2Blocks, l2SafeHead.Number.Uint64()) + + // Run the FPP on the configured L2 block. + env.RunFaultProofProgram(t, numL2Blocks/2, testCfg.CheckResult, testCfg.InputParams...) +} + +func Test_ProgramAction_L1Lookback(gt *testing.T) { + matrix := helpers.NewMatrix[any]() + defer matrix.Run(gt) + + matrix.AddTestCase( + "HonestClaim", + nil, + helpers.LatestForkOnly, + runL1LookbackTest, + helpers.ExpectNoError(), + ) + matrix.AddTestCase( + "JunkClaim", + nil, + helpers.LatestForkOnly, + runL1LookbackTest, + helpers.ExpectError(claim.ErrClaimNotValid), + helpers.WithL2Claim(common.HexToHash("0xdeadbeef")), + ) + matrix.AddTestCase( + "HonestClaim-ReopenChannel", + nil, + helpers.LatestForkOnly, + runL1LookbackTest_ReopenChannel, + helpers.ExpectNoError(), + ) + matrix.AddTestCase( + "JunkClaim-ReopenChannel", + nil, + helpers.LatestForkOnly, + runL1LookbackTest_ReopenChannel, + helpers.ExpectError(claim.ErrClaimNotValid), + helpers.WithL2Claim(common.HexToHash("0xdeadbeef")), + ) +} diff --git a/op-e2e/actions/proofs/sequence_window_expiry_test.go b/op-e2e/actions/proofs/sequence_window_expiry_test.go new file mode 100644 index 000000000000..3f5ca9562d4b --- /dev/null +++ b/op-e2e/actions/proofs/sequence_window_expiry_test.go @@ -0,0 +1,165 @@ +package proofs + +import ( + "testing" + + actionsHelpers "github.com/ethereum-optimism/optimism/op-e2e/actions/helpers" + "github.com/ethereum-optimism/optimism/op-e2e/actions/proofs/helpers" + "github.com/ethereum-optimism/optimism/op-program/client/claim" + "github.com/ethereum/go-ethereum/common" + "github.com/stretchr/testify/require" +) + +// Run a test that proves a deposit-only block generated due to sequence window expiry. +func runSequenceWindowExpireTest(gt *testing.T, testCfg *helpers.TestCfg[any]) { + t := actionsHelpers.NewDefaultTesting(gt) + tp := helpers.NewTestParams() + env := helpers.NewL2FaultProofEnv(t, testCfg, tp, helpers.NewBatcherCfg()) + + // Mine an empty block for gas estimation purposes. + env.Miner.ActEmptyBlock(t) + + // Expire the sequence window by building `SequenceWindow + 1` empty blocks on L1. + for i := 0; i < int(tp.SequencerWindowSize)+1; i++ { + env.Alice.L1.ActResetTxOpts(t) + env.Alice.ActDeposit(t) + + env.Miner.ActL1StartBlock(12)(t) + env.Miner.ActL1IncludeTx(env.Alice.Address())(t) + env.Miner.ActL1EndBlock(t) + + env.Miner.ActL1SafeNext(t) + env.Miner.ActL1FinalizeNext(t) + } + + // Ensure the safe head is still 0. + l2SafeHead := env.Engine.L2Chain().CurrentSafeBlock() + require.EqualValues(t, 0, l2SafeHead.Number.Uint64()) + + // Ask the sequencer to derive the deposit-only L2 chain. + env.Sequencer.ActL1HeadSignal(t) + env.Sequencer.ActL2PipelineFull(t) + + // Ensure the safe head advanced forcefully. + l2SafeHead = env.Engine.L2Chain().CurrentSafeBlock() + require.Greater(t, l2SafeHead.Number.Uint64(), uint64(0)) + + // Run the FPP on one of the auto-derived blocks. + env.RunFaultProofProgram(t, l2SafeHead.Number.Uint64()/2, testCfg.CheckResult, testCfg.InputParams...) +} + +// Runs a that proves a block in a chain where the batcher opens a channel, the sequence window expires, and then the +// batcher attempts to close the channel afterwards. +func runSequenceWindowExpire_ChannelCloseAfterWindowExpiry_Test(gt *testing.T, testCfg *helpers.TestCfg[any]) { + t := actionsHelpers.NewDefaultTesting(gt) + tp := helpers.NewTestParams() + env := helpers.NewL2FaultProofEnv(t, testCfg, tp, helpers.NewBatcherCfg()) + + // Mine 2 empty blocks on L2. + for i := 0; i < 2; i++ { + env.Sequencer.ActL2StartBlock(t) + env.Alice.L2.ActResetTxOpts(t) + env.Alice.L2.ActSetTxToAddr(&env.Dp.Addresses.Bob) + env.Alice.L2.ActMakeTx(t) + env.Engine.ActL2IncludeTx(env.Alice.Address())(t) + env.Sequencer.ActL2EndBlock(t) + } + + // Open the channel on L1. + env.Batcher.ActL2BatchBuffer(t) + env.Batcher.ActL2BatchSubmit(t) + env.Miner.ActL1StartBlock(12)(t) + env.Miner.ActL1IncludeTxByHash(env.Batcher.LastSubmitted.Hash())(t) + env.Miner.ActL1EndBlock(t) + + // Finalize the block with the first channel frame on L1. + env.Miner.ActL1SafeNext(t) + env.Miner.ActL1FinalizeNext(t) + + // Instruct the sequencer to derive the L2 chain from the data on L1 that the batcher just posted. + env.Sequencer.ActL1HeadSignal(t) + env.Sequencer.ActL2PipelineFull(t) + + // Ensure the safe head is still 0. + l2SafeHead := env.Engine.L2Chain().CurrentSafeBlock() + require.EqualValues(t, 0, l2SafeHead.Number.Uint64()) + + // Cache the next frame data before expiring the sequence window, but don't submit it yet. + env.Batcher.ActL2BatchBuffer(t) + env.Batcher.ActL2ChannelClose(t) + finalFrame := env.Batcher.ReadNextOutputFrame(t) + + // Expire the sequence window by building `SequenceWindow + 1` empty blocks on L1. + for i := 0; i < int(tp.SequencerWindowSize)+1; i++ { + env.Alice.L1.ActResetTxOpts(t) + env.Alice.ActDeposit(t) + + env.Miner.ActL1StartBlock(12)(t) + env.Miner.ActL1IncludeTx(env.Alice.Address())(t) + env.Miner.ActL1EndBlock(t) + + env.Miner.ActL1SafeNext(t) + env.Miner.ActL1FinalizeNext(t) + } + + // Instruct the batcher to closethe channel on L1, after the sequence window + channel timeout has elapsed. + env.Batcher.ActL2BatchSubmitRaw(t, finalFrame) + env.Miner.ActL1StartBlock(12)(t) + env.Miner.ActL1IncludeTxByHash(env.Batcher.LastSubmitted.Hash())(t) + env.Miner.ActL1EndBlock(t) + + // Finalize the block with the second channel frame on L1. + env.Miner.ActL1SafeNext(t) + env.Miner.ActL1FinalizeNext(t) + + // Ensure the safe head is still 0. + l2SafeHead = env.Engine.L2Chain().CurrentSafeBlock() + require.EqualValues(t, 0, l2SafeHead.Number.Uint64()) + + // Ask the sequencer to derive the deposit-only L2 chain. + env.Sequencer.ActL1HeadSignal(t) + env.Sequencer.ActL2PipelineFull(t) + + // Ensure the safe head advanced forcefully. + l2SafeHead = env.Engine.L2Chain().CurrentSafeBlock() + require.Greater(t, l2SafeHead.Number.Uint64(), uint64(0)) + + // Run the FPP on one of the auto-derived blocks. + env.RunFaultProofProgram(t, l2SafeHead.Number.Uint64()/2, testCfg.CheckResult, testCfg.InputParams...) +} + +func Test_ProgramAction_SequenceWindowExpired(gt *testing.T) { + matrix := helpers.NewMatrix[any]() + defer matrix.Run(gt) + + matrix.AddTestCase( + "HonestClaim", + nil, + helpers.LatestForkOnly, + runSequenceWindowExpireTest, + helpers.ExpectNoError(), + ) + matrix.AddTestCase( + "JunkClaim", + nil, + helpers.LatestForkOnly, + runSequenceWindowExpireTest, + helpers.ExpectError(claim.ErrClaimNotValid), + helpers.WithL2Claim(common.HexToHash("0xdeadbeef")), + ) + matrix.AddTestCase( + "ChannelCloseAfterWindowExpiry-HonestClaim", + nil, + helpers.LatestForkOnly, + runSequenceWindowExpire_ChannelCloseAfterWindowExpiry_Test, + helpers.ExpectNoError(), + ) + matrix.AddTestCase( + "ChannelCloseAfterWindowExpiry-JunkClaim", + nil, + helpers.LatestForkOnly, + runSequenceWindowExpire_ChannelCloseAfterWindowExpiry_Test, + helpers.ExpectError(claim.ErrClaimNotValid), + helpers.WithL2Claim(common.HexToHash("0xdeadbeef")), + ) +} diff --git a/op-e2e/actions/proofs/simple_program_test.go b/op-e2e/actions/proofs/simple_program_test.go new file mode 100644 index 000000000000..ab3218caf1e4 --- /dev/null +++ b/op-e2e/actions/proofs/simple_program_test.go @@ -0,0 +1,65 @@ +package proofs + +import ( + "testing" + + actionsHelpers "github.com/ethereum-optimism/optimism/op-e2e/actions/helpers" + "github.com/ethereum-optimism/optimism/op-e2e/actions/proofs/helpers" + "github.com/ethereum-optimism/optimism/op-program/client/claim" + "github.com/ethereum/go-ethereum/common" + "github.com/stretchr/testify/require" +) + +func runSimpleProgramTest(gt *testing.T, testCfg *helpers.TestCfg[any]) { + t := actionsHelpers.NewDefaultTesting(gt) + env := helpers.NewL2FaultProofEnv(t, testCfg, helpers.NewTestParams(), helpers.NewBatcherCfg()) + + // Build an empty block on L2 + env.Sequencer.ActL2StartBlock(t) + env.Sequencer.ActL2EndBlock(t) + + // Instruct the batcher to submit the block to L1, and include the transaction. + env.Batcher.ActSubmitAll(t) + env.Miner.ActL1StartBlock(12)(t) + env.Miner.ActL1IncludeTxByHash(env.Batcher.LastSubmitted.Hash())(t) + env.Miner.ActL1EndBlock(t) + + // Finalize the block with the batch on L1. + env.Miner.ActL1SafeNext(t) + env.Miner.ActL1FinalizeNext(t) + + // Instruct the sequencer to derive the L2 chain from the data on L1 that the batcher just posted. + env.Sequencer.ActL1HeadSignal(t) + env.Sequencer.ActL2PipelineFull(t) + + l1Head := env.Miner.L1Chain().CurrentBlock() + l2SafeHead := env.Engine.L2Chain().CurrentSafeBlock() + + // Ensure there is only 1 block on L1. + require.Equal(t, uint64(1), l1Head.Number.Uint64()) + // Ensure the block is marked as safe before we attempt to fault prove it. + require.Equal(t, uint64(1), l2SafeHead.Number.Uint64()) + + env.RunFaultProofProgram(t, l2SafeHead.Number.Uint64(), testCfg.CheckResult, testCfg.InputParams...) +} + +func Test_ProgramAction_SimpleEmptyChain(gt *testing.T) { + matrix := helpers.NewMatrix[any]() + defer matrix.Run(gt) + + matrix.AddTestCase( + "HonestClaim", + nil, + helpers.LatestForkOnly, + runSimpleProgramTest, + helpers.ExpectNoError(), + ) + matrix.AddTestCase( + "JunkClaim", + nil, + helpers.LatestForkOnly, + runSimpleProgramTest, + helpers.ExpectError(claim.ErrClaimNotValid), + helpers.WithL2Claim(common.HexToHash("0xdeadbeef")), + ) +} diff --git a/op-e2e/actions/l2_proposer_test.go b/op-e2e/actions/proposer/l2_proposer_test.go similarity index 79% rename from op-e2e/actions/l2_proposer_test.go rename to op-e2e/actions/proposer/l2_proposer_test.go index fe31c2fa6824..a75ece69b080 100644 --- a/op-e2e/actions/l2_proposer_test.go +++ b/op-e2e/actions/proposer/l2_proposer_test.go @@ -1,10 +1,12 @@ -package actions +package proposer import ( "math/big" "testing" "time" + actionsHelpers "github.com/ethereum-optimism/optimism/op-e2e/actions/helpers" + upgradesHelpers "github.com/ethereum-optimism/optimism/op-e2e/actions/upgrades/helpers" "github.com/ethereum/go-ethereum/accounts/abi/bind" "github.com/ethereum/go-ethereum/common" "github.com/ethereum/go-ethereum/common/hexutil" @@ -44,31 +46,37 @@ func TestProposerBatchType(t *testing.T) { } func RunProposerTest(gt *testing.T, deltaTimeOffset *hexutil.Uint64) { - t := NewDefaultTesting(gt) - dp := e2eutils.MakeDeployParams(t, defaultRollupTestParams) - dp.DeployConfig.L2GenesisDeltaTimeOffset = deltaTimeOffset - sd := e2eutils.Setup(t, dp, defaultAlloc) + t := actionsHelpers.NewDefaultTesting(gt) + dp := e2eutils.MakeDeployParams(t, actionsHelpers.DefaultRollupTestParams) + upgradesHelpers.ApplyDeltaTimeOffset(dp, deltaTimeOffset) + sd := e2eutils.Setup(t, dp, actionsHelpers.DefaultAlloc) log := testlog.Logger(t, log.LevelDebug) - miner, seqEngine, sequencer := setupSequencerTest(t, sd, log) + miner, seqEngine, sequencer := actionsHelpers.SetupSequencerTest(t, sd, log) rollupSeqCl := sequencer.RollupClient() - batcher := NewL2Batcher(log, sd.RollupCfg, DefaultBatcherCfg(dp), + batcher := actionsHelpers.NewL2Batcher(log, sd.RollupCfg, actionsHelpers.DefaultBatcherCfg(dp), rollupSeqCl, miner.EthClient(), seqEngine.EthClient(), seqEngine.EngineClient(t, sd.RollupCfg)) - var proposer *L2Proposer - if e2eutils.UseFPAC() { - proposer = NewL2Proposer(t, log, &ProposerCfg{ + var proposer *actionsHelpers.L2Proposer + if e2eutils.UseFaultProofs() { + optimismPortal2Contract, err := bindingspreview.NewOptimismPortal2(sd.DeploymentsL1.OptimismPortalProxy, miner.EthClient()) + require.NoError(t, err) + respectedGameType, err := optimismPortal2Contract.RespectedGameType(&bind.CallOpts{}) + require.NoError(t, err) + proposer = actionsHelpers.NewL2Proposer(t, log, &actionsHelpers.ProposerCfg{ DisputeGameFactoryAddr: &sd.DeploymentsL1.DisputeGameFactoryProxy, ProposalInterval: 6 * time.Second, - DisputeGameType: 0, + ProposalRetryInterval: 3 * time.Second, + DisputeGameType: respectedGameType, ProposerKey: dp.Secrets.Proposer, AllowNonFinalized: true, }, miner.EthClient(), rollupSeqCl) } else { - proposer = NewL2Proposer(t, log, &ProposerCfg{ - OutputOracleAddr: &sd.DeploymentsL1.L2OutputOracleProxy, - ProposerKey: dp.Secrets.Proposer, - AllowNonFinalized: false, + proposer = actionsHelpers.NewL2Proposer(t, log, &actionsHelpers.ProposerCfg{ + OutputOracleAddr: &sd.DeploymentsL1.L2OutputOracleProxy, + ProposerKey: dp.Secrets.Proposer, + ProposalRetryInterval: 3 * time.Second, + AllowNonFinalized: false, }, miner.EthClient(), rollupSeqCl) } @@ -92,6 +100,7 @@ func RunProposerTest(gt *testing.T, deltaTimeOffset *hexutil.Uint64) { sequencer.ActL2PipelineFull(t) sequencer.ActL1SafeSignal(t) sequencer.ActL1FinalizedSignal(t) + sequencer.ActL2PipelineFull(t) require.Equal(t, sequencer.SyncStatus().UnsafeL2, sequencer.SyncStatus().FinalizedL2) require.True(t, proposer.CanPropose(t)) @@ -109,7 +118,7 @@ func RunProposerTest(gt *testing.T, deltaTimeOffset *hexutil.Uint64) { } // check that L1 stored the expected output root - if e2eutils.UseFPAC() { + if e2eutils.UseFaultProofs() { optimismPortal2Contract, err := bindingspreview.NewOptimismPortal2(sd.DeploymentsL1.OptimismPortalProxy, miner.EthClient()) require.NoError(t, err) respectedGameType, err := optimismPortal2Contract.RespectedGameType(&bind.CallOpts{}) diff --git a/op-e2e/actions/safedb/helpers/setups.go b/op-e2e/actions/safedb/helpers/setups.go new file mode 100644 index 000000000000..fcc70f494a74 --- /dev/null +++ b/op-e2e/actions/safedb/helpers/setups.go @@ -0,0 +1,38 @@ +package helpers + +import ( + "github.com/ethereum-optimism/optimism/op-e2e/actions/helpers" + "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" + "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 SetupSafeDBTest(t helpers.Testing, config *e2eutils.TestParams) (*e2eutils.SetupData, *helpers.L1Miner, *helpers.L2Sequencer, *helpers.L2Verifier, *helpers.L2Engine, *helpers.L2Batcher) { + dp := e2eutils.MakeDeployParams(t, config) + + sd := e2eutils.Setup(t, dp, helpers.DefaultAlloc) + logger := testlog.Logger(t, log.LevelDebug) + + return SetupSafeDBTestActors(t, dp, sd, logger) +} + +func SetupSafeDBTestActors(t helpers.Testing, dp *e2eutils.DeployParams, sd *e2eutils.SetupData, log log.Logger) (*e2eutils.SetupData, *helpers.L1Miner, *helpers.L2Sequencer, *helpers.L2Verifier, *helpers.L2Engine, *helpers.L2Batcher) { + dir := t.TempDir() + db, err := safedb.NewSafeDB(log, dir) + require.NoError(t, err) + t.Cleanup(func() { + _ = db.Close() + }) + miner, seqEngine, sequencer := helpers.SetupSequencerTest(t, sd, log) + miner.ActL1SetFeeRecipient(common.Address{'A'}) + sequencer.ActL2PipelineFull(t) + verifEngine, verifier := helpers.SetupVerifier(t, sd, log, miner.L1Client(t, sd.RollupCfg), miner.BlobStore(), &sync.Config{}, helpers.WithSafeHeadListener(db)) + rollupSeqCl := sequencer.RollupClient() + batcher := helpers.NewL2Batcher(log, sd.RollupCfg, helpers.DefaultBatcherCfg(dp), + rollupSeqCl, miner.EthClient(), seqEngine.EthClient(), seqEngine.EngineClient(t, sd.RollupCfg)) + return sd, miner, sequencer, verifier, verifEngine, batcher +} diff --git a/op-e2e/actions/safedb/safedb_test.go b/op-e2e/actions/safedb/safedb_test.go new file mode 100644 index 000000000000..369825e46263 --- /dev/null +++ b/op-e2e/actions/safedb/safedb_test.go @@ -0,0 +1,111 @@ +package safedb + +import ( + "context" + "testing" + + actionsHelpers "github.com/ethereum-optimism/optimism/op-e2e/actions/helpers" + "github.com/ethereum-optimism/optimism/op-e2e/actions/safedb/helpers" + "github.com/ethereum-optimism/optimism/op-service/eth" + "github.com/ethereum/go-ethereum/common" + "github.com/ethereum/go-ethereum/core/types" + "github.com/stretchr/testify/require" +) + +func TestRecordSafeHeadUpdates(gt *testing.T) { + t := actionsHelpers.NewDefaultTesting(gt) + sd, miner, sequencer, verifier, verifierEng, batcher := helpers.SetupSafeDBTest(t, actionsHelpers.DefaultRollupTestParams) + verifEngClient := verifierEng.EngineClient(t, sd.RollupCfg) + + sequencer.ActL2PipelineFull(t) + verifier.ActL2PipelineFull(t) + + // build empty L1 block + miner.ActEmptyBlock(t) + + // Create L2 blocks, and reference the L1 head as origin + sequencer.ActL1HeadSignal(t) + sequencer.ActBuildToL1Head(t) + + // submit all new L2 blocks + batcher.ActSubmitAll(t) + + // new L1 block with L2 batch + miner.ActL1StartBlock(12)(t) + miner.ActL1IncludeTx(sd.RollupCfg.Genesis.SystemConfig.BatcherAddr)(t) + batchTx := miner.L1Transactions[0] + miner.ActL1EndBlock(t) + + // verifier picks up the L2 chain that was submitted + verifier.ActL1HeadSignal(t) + verifier.ActL2PipelineFull(t) + require.Equal(t, verifier.L2Safe(), sequencer.L2Unsafe(), "verifier syncs from sequencer via L1") + require.NotEqual(t, sequencer.L2Safe(), sequencer.L2Unsafe(), "sequencer has not processed L1 yet") + + // Verify the safe head is recorded + l1Head := miner.L1Chain().CurrentBlock() + firstSafeHeadUpdateL1Block := l1Head.Number.Uint64() + response, err := verifier.RollupClient().SafeHeadAtL1Block(context.Background(), firstSafeHeadUpdateL1Block) + require.NoError(t, err) + require.Equal(t, eth.HeaderBlockID(l1Head), response.L1Block) + require.Equal(t, verifier.L2Unsafe().ID(), response.SafeHead) + + // Should get the same result for anything after that L1 block too + response, err = verifier.RollupClient().SafeHeadAtL1Block(context.Background(), firstSafeHeadUpdateL1Block+1) + require.NoError(t, err) + require.Equal(t, eth.HeaderBlockID(l1Head), response.L1Block) + require.Equal(t, verifier.L2Unsafe().ID(), response.SafeHead) + + // Only genesis is safe at this point + response, err = verifier.RollupClient().SafeHeadAtL1Block(context.Background(), firstSafeHeadUpdateL1Block-1) + require.NoError(t, err) + require.Equal(t, eth.HeaderBlockID(miner.L1Chain().Genesis().Header()), response.L1Block) + require.Equal(t, sd.RollupCfg.Genesis.L2, response.SafeHead) + + // orphan the L1 block that included the batch tx, and build a new different L1 block + miner.ActL1RewindToParent(t) + miner.ActL1SetFeeRecipient(common.Address{'B'}) + miner.ActEmptyBlock(t) + miner.ActEmptyBlock(t) // needs to be a longer chain for reorg to be applied. + + // sync verifier again. The L1 reorg excluded the batch, so now the previous L2 chain should be unsafe again. + // However, the L2 chain can still be canonical later, since it did not reference the reorged L1 block + verifier.ActL1HeadSignal(t) + verifier.ActL2PipelineFull(t) + require.Equal(t, verifier.L2Safe(), sequencer.L2Safe(), "verifier rewinds safe when L1 reorgs out batch") + ref, err := verifEngClient.L2BlockRefByLabel(t.Ctx(), eth.Safe) + require.NoError(t, err) + require.Equal(t, verifier.L2Safe(), ref, "verifier engine matches rollup client") + + // The safe head has been reorged so the record should have been deleted, leaving us back with just genesis safe + response, err = verifier.RollupClient().SafeHeadAtL1Block(context.Background(), firstSafeHeadUpdateL1Block) + require.NoError(t, err) + require.Equal(t, eth.HeaderBlockID(miner.L1Chain().Genesis().Header()), response.L1Block) + require.Equal(t, sd.RollupCfg.Genesis.L2, response.SafeHead) + + // Now replay the batch tx in a new L1 block + miner.ActL1StartBlock(12)(t) + miner.ActL1SetFeeRecipient(common.Address{'C'}) + // note: the geth tx pool reorgLoop is too slow (responds to chain head events, but async), + // and there's no way to manually trigger runReorg, so we re-insert it ourselves. + require.NoError(t, miner.Eth.TxPool().Add([]*types.Transaction{batchTx}, true, true)[0]) + // need to re-insert previously included tx into the block + miner.ActL1IncludeTx(sd.RollupCfg.Genesis.SystemConfig.BatcherAddr)(t) + miner.ActL1EndBlock(t) + + // sync the verifier again: now it should be safe again + verifier.ActL1HeadSignal(t) + verifier.ActL2PipelineFull(t) + require.Equal(t, verifier.L2Safe(), sequencer.L2Unsafe(), "verifier syncs from sequencer via replayed batch on L1") + ref, err = verifEngClient.L2BlockRefByLabel(t.Ctx(), eth.Safe) + require.NoError(t, err) + require.Equal(t, verifier.L2Safe(), ref, "verifier engine matches rollup client") + + // Verify the safe head is recorded again + l1Head = miner.L1Chain().CurrentBlock() + firstSafeHeadUpdateL1Block = l1Head.Number.Uint64() + response, err = verifier.RollupClient().SafeHeadAtL1Block(context.Background(), firstSafeHeadUpdateL1Block) + require.NoError(t, err) + require.Equal(t, eth.HeaderBlockID(l1Head), response.L1Block) + require.Equal(t, verifier.L2Unsafe().ID(), response.SafeHead) +} diff --git a/op-e2e/actions/safedb_test.go b/op-e2e/actions/safedb_test.go deleted file mode 100644 index 9fd570fa79f5..000000000000 --- a/op-e2e/actions/safedb_test.go +++ /dev/null @@ -1,140 +0,0 @@ -package actions - -import ( - "context" - "testing" - - "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" - "github.com/ethereum-optimism/optimism/op-service/eth" - "github.com/ethereum-optimism/optimism/op-service/testlog" - "github.com/ethereum/go-ethereum/common" - "github.com/ethereum/go-ethereum/core/types" - "github.com/ethereum/go-ethereum/log" - "github.com/stretchr/testify/require" -) - -func TestRecordSafeHeadUpdates(gt *testing.T) { - t := NewDefaultTesting(gt) - sd, miner, sequencer, verifier, verifierEng, batcher := setupSafeDBTest(t, defaultRollupTestParams) - verifEngClient := verifierEng.EngineClient(t, sd.RollupCfg) - - sequencer.ActL2PipelineFull(t) - verifier.ActL2PipelineFull(t) - - // build empty L1 block - miner.ActEmptyBlock(t) - - // Create L2 blocks, and reference the L1 head as origin - sequencer.ActL1HeadSignal(t) - sequencer.ActBuildToL1Head(t) - - // submit all new L2 blocks - batcher.ActSubmitAll(t) - - // new L1 block with L2 batch - miner.ActL1StartBlock(12)(t) - miner.ActL1IncludeTx(sd.RollupCfg.Genesis.SystemConfig.BatcherAddr)(t) - batchTx := miner.l1Transactions[0] - miner.ActL1EndBlock(t) - - // verifier picks up the L2 chain that was submitted - verifier.ActL1HeadSignal(t) - verifier.ActL2PipelineFull(t) - require.Equal(t, verifier.L2Safe(), sequencer.L2Unsafe(), "verifier syncs from sequencer via L1") - require.NotEqual(t, sequencer.L2Safe(), sequencer.L2Unsafe(), "sequencer has not processed L1 yet") - - // Verify the safe head is recorded - l1Head := miner.l1Chain.CurrentBlock() - firstSafeHeadUpdateL1Block := l1Head.Number.Uint64() - response, err := verifier.RollupClient().SafeHeadAtL1Block(context.Background(), firstSafeHeadUpdateL1Block) - require.NoError(t, err) - require.Equal(t, eth.HeaderBlockID(l1Head), response.L1Block) - require.Equal(t, verifier.L2Unsafe().ID(), response.SafeHead) - - // Should get the same result for anything after that L1 block too - response, err = verifier.RollupClient().SafeHeadAtL1Block(context.Background(), firstSafeHeadUpdateL1Block+1) - require.NoError(t, err) - require.Equal(t, eth.HeaderBlockID(l1Head), response.L1Block) - require.Equal(t, verifier.L2Unsafe().ID(), response.SafeHead) - - // Only genesis is safe at this point - response, err = verifier.RollupClient().SafeHeadAtL1Block(context.Background(), firstSafeHeadUpdateL1Block-1) - require.NoError(t, err) - require.Equal(t, eth.HeaderBlockID(miner.l1Chain.Genesis().Header()), response.L1Block) - require.Equal(t, sd.RollupCfg.Genesis.L2, response.SafeHead) - - // orphan the L1 block that included the batch tx, and build a new different L1 block - miner.ActL1RewindToParent(t) - miner.ActL1SetFeeRecipient(common.Address{'B'}) - miner.ActEmptyBlock(t) - miner.ActEmptyBlock(t) // needs to be a longer chain for reorg to be applied. - - // sync verifier again. The L1 reorg excluded the batch, so now the previous L2 chain should be unsafe again. - // However, the L2 chain can still be canonical later, since it did not reference the reorged L1 block - verifier.ActL1HeadSignal(t) - verifier.ActL2PipelineFull(t) - require.Equal(t, verifier.L2Safe(), sequencer.L2Safe(), "verifier rewinds safe when L1 reorgs out batch") - ref, err := verifEngClient.L2BlockRefByLabel(t.Ctx(), eth.Safe) - require.NoError(t, err) - require.Equal(t, verifier.L2Safe(), ref, "verifier engine matches rollup client") - - // The safe head has been reorged so the record should have been deleted, leaving us back with just genesis safe - response, err = verifier.RollupClient().SafeHeadAtL1Block(context.Background(), firstSafeHeadUpdateL1Block) - require.NoError(t, err) - require.Equal(t, eth.HeaderBlockID(miner.l1Chain.Genesis().Header()), response.L1Block) - require.Equal(t, sd.RollupCfg.Genesis.L2, response.SafeHead) - - // Now replay the batch tx in a new L1 block - miner.ActL1StartBlock(12)(t) - miner.ActL1SetFeeRecipient(common.Address{'C'}) - // note: the geth tx pool reorgLoop is too slow (responds to chain head events, but async), - // and there's no way to manually trigger runReorg, so we re-insert it ourselves. - require.NoError(t, miner.eth.TxPool().Add([]*types.Transaction{batchTx}, true, true)[0]) - // need to re-insert previously included tx into the block - miner.ActL1IncludeTx(sd.RollupCfg.Genesis.SystemConfig.BatcherAddr)(t) - miner.ActL1EndBlock(t) - - // sync the verifier again: now it should be safe again - verifier.ActL1HeadSignal(t) - verifier.ActL2PipelineFull(t) - require.Equal(t, verifier.L2Safe(), sequencer.L2Unsafe(), "verifier syncs from sequencer via replayed batch on L1") - ref, err = verifEngClient.L2BlockRefByLabel(t.Ctx(), eth.Safe) - require.NoError(t, err) - require.Equal(t, verifier.L2Safe(), ref, "verifier engine matches rollup client") - - // Verify the safe head is recorded again - l1Head = miner.l1Chain.CurrentBlock() - firstSafeHeadUpdateL1Block = l1Head.Number.Uint64() - response, err = verifier.RollupClient().SafeHeadAtL1Block(context.Background(), firstSafeHeadUpdateL1Block) - require.NoError(t, err) - require.Equal(t, eth.HeaderBlockID(l1Head), response.L1Block) - require.Equal(t, verifier.L2Unsafe().ID(), response.SafeHead) -} - -func setupSafeDBTest(t Testing, config *e2eutils.TestParams) (*e2eutils.SetupData, *L1Miner, *L2Sequencer, *L2Verifier, *L2Engine, *L2Batcher) { - dp := e2eutils.MakeDeployParams(t, config) - - sd := e2eutils.Setup(t, dp, defaultAlloc) - logger := testlog.Logger(t, log.LevelDebug) - - return setupSafeDBTestActors(t, dp, sd, logger) -} - -func setupSafeDBTestActors(t Testing, dp *e2eutils.DeployParams, sd *e2eutils.SetupData, log log.Logger) (*e2eutils.SetupData, *L1Miner, *L2Sequencer, *L2Verifier, *L2Engine, *L2Batcher) { - dir := t.TempDir() - db, err := safedb.NewSafeDB(log, dir) - require.NoError(t, err) - t.Cleanup(func() { - _ = db.Close() - }) - miner, seqEngine, sequencer := setupSequencerTest(t, sd, log) - miner.ActL1SetFeeRecipient(common.Address{'A'}) - sequencer.ActL2PipelineFull(t) - verifEngine, verifier := setupVerifier(t, sd, log, miner.L1Client(t, sd.RollupCfg), miner.BlobStore(), &sync.Config{}, WithSafeHeadListener(db)) - rollupSeqCl := sequencer.RollupClient() - batcher := NewL2Batcher(log, sd.RollupCfg, DefaultBatcherCfg(dp), - rollupSeqCl, miner.EthClient(), seqEngine.EthClient(), seqEngine.EngineClient(t, sd.RollupCfg)) - return sd, miner, sequencer, verifier, verifEngine, batcher -} diff --git a/op-e2e/actions/sequencer/l2_sequencer_test.go b/op-e2e/actions/sequencer/l2_sequencer_test.go new file mode 100644 index 000000000000..5192c25d7afd --- /dev/null +++ b/op-e2e/actions/sequencer/l2_sequencer_test.go @@ -0,0 +1,155 @@ +package sequencer + +import ( + "math/big" + "testing" + + "github.com/ethereum-optimism/optimism/op-e2e/actions/helpers" + "github.com/ethereum/go-ethereum/core/types" + "github.com/ethereum/go-ethereum/params" + + "github.com/ethereum/go-ethereum/common" + "github.com/ethereum/go-ethereum/log" + "github.com/stretchr/testify/require" + + "github.com/ethereum-optimism/optimism/op-e2e/e2eutils" + "github.com/ethereum-optimism/optimism/op-service/testlog" +) + +func TestL2Sequencer_SequencerDrift(gt *testing.T) { + t := helpers.NewDefaultTesting(gt) + p := &e2eutils.TestParams{ + MaxSequencerDrift: 20, // larger than L1 block time we simulate in this test (12) + SequencerWindowSize: 24, + ChannelTimeout: 20, + L1BlockTime: 12, + } + dp := e2eutils.MakeDeployParams(t, p) + sd := e2eutils.Setup(t, dp, helpers.DefaultAlloc) + log := testlog.Logger(t, log.LevelDebug) + miner, engine, sequencer := helpers.SetupSequencerTest(t, sd, log) + miner.ActL1SetFeeRecipient(common.Address{'A'}) + + sequencer.ActL2PipelineFull(t) + + signer := types.LatestSigner(sd.L2Cfg.Config) + cl := engine.EthClient() + aliceTx := func() { + n, err := cl.PendingNonceAt(t.Ctx(), dp.Addresses.Alice) + require.NoError(t, err) + tx := types.MustSignNewTx(dp.Secrets.Alice, signer, &types.DynamicFeeTx{ + ChainID: sd.L2Cfg.Config.ChainID, + Nonce: n, + GasTipCap: big.NewInt(2 * params.GWei), + GasFeeCap: new(big.Int).Add(miner.L1Chain().CurrentBlock().BaseFee, big.NewInt(2*params.GWei)), + Gas: params.TxGas, + To: &dp.Addresses.Bob, + Value: e2eutils.Ether(2), + }) + require.NoError(gt, cl.SendTransaction(t.Ctx(), tx)) + } + makeL2BlockWithAliceTx := func() { + aliceTx() + sequencer.ActL2StartBlock(t) + engine.ActL2IncludeTx(dp.Addresses.Alice)(t) // include a test tx from alice + sequencer.ActL2EndBlock(t) + } + + // L1 makes a block + miner.ActL1StartBlock(12)(t) + miner.ActL1EndBlock(t) + sequencer.ActL1HeadSignal(t) + origin := miner.L1Chain().CurrentBlock() + + // L2 makes blocks to catch up + for sequencer.SyncStatus().UnsafeL2.Time+sd.RollupCfg.BlockTime < origin.Time { + makeL2BlockWithAliceTx() + require.Equal(t, uint64(0), sequencer.SyncStatus().UnsafeL2.L1Origin.Number, "no L1 origin change before time matches") + } + // Check that we adopted the origin as soon as we could (conf depth is 0) + makeL2BlockWithAliceTx() + require.Equal(t, uint64(1), sequencer.SyncStatus().UnsafeL2.L1Origin.Number, "L1 origin changes as soon as L2 time equals or exceeds L1 time") + + miner.ActL1StartBlock(12)(t) + miner.ActL1EndBlock(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.ChainSpec.MaxSequencerDrift(origin.Time) { + sequencer.ActL2KeepL1Origin(t) + makeL2BlockWithAliceTx() + require.Equal(t, uint64(1), sequencer.SyncStatus().UnsafeL2.L1Origin.Number, "expected to keep old L1 origin") + } + + // We passed the sequencer drift: we can still keep the old origin, but can't include any txs + sequencer.ActL2KeepL1Origin(t) + sequencer.ActL2StartBlock(t) + require.True(t, engine.EngineApi.ForcedEmpty(), "engine should not be allowed to include anything after sequencer drift is surpassed") +} + +// TestL2Sequencer_SequencerOnlyReorg regression-tests a Goerli halt where the sequencer +// would build an unsafe L2 block with a L1 origin that then gets reorged out, +// while the verifier-codepath only ever sees the valid post-reorg L1 chain. +func TestL2Sequencer_SequencerOnlyReorg(gt *testing.T) { + t := helpers.NewDefaultTesting(gt) + dp := e2eutils.MakeDeployParams(t, helpers.DefaultRollupTestParams) + sd := e2eutils.Setup(t, dp, helpers.DefaultAlloc) + log := testlog.Logger(t, log.LevelDebug) + miner, _, sequencer := helpers.SetupSequencerTest(t, sd, log) + + // Sequencer at first only recognizes the genesis as safe. + // The rest of the L1 chain will be incorporated as L1 origins into unsafe L2 blocks. + sequencer.ActL2PipelineFull(t) + + // build L1 block with coinbase A + miner.ActL1SetFeeRecipient(common.Address{'A'}) + miner.ActEmptyBlock(t) + + // sequencer builds L2 blocks, until (incl.) it creates a L2 block with a L1 origin that has A as coinbase address + sequencer.ActL1HeadSignal(t) + sequencer.ActBuildToL1HeadUnsafe(t) + + // If sequencer does not pick up on pre-reorg chain in derivation, + // then derivation won't see the difference in L1 chains, + // and not trigger a reorg if we traverse from 0 to the new chain later on + // (but would once it gets to consolidate unsafe head later). + sequencer.ActL2PipelineFull(t) + status := sequencer.SyncStatus() + require.Zero(t, status.SafeL2.L1Origin.Number, "no safe head progress") + require.Equal(t, status.HeadL1.Hash, status.UnsafeL2.L1Origin.Hash, "have head L1 origin") + require.NotZero(t, status.UnsafeL2.L1Origin.Number, "have head L1 origin") + // reorg out block with coinbase A, and make a block with coinbase B + miner.ActL1RewindToParent(t) + miner.ActL1SetFeeRecipient(common.Address{'B'}) + miner.ActEmptyBlock(t) + + // and a second block, for derivation to pick up on the new L1 chain + // (height is used as heuristic to not flip-flop between chains too frequently) + miner.ActEmptyBlock(t) + + // Make the sequencer aware of the new head, and try to sync it. + // Since the safe chain never incorporated the now reorged L1 block with coinbase A, + // it will sync the new L1 chain fine. + // No batches are submitted yet however, + // so it'll keep the L2 block with the old L1 origin, since no conflict is detected. + sequencer.ActL1HeadSignal(t) + + postReorgStatus := sequencer.SyncStatus() + require.Zero(t, postReorgStatus.SafeL2.L1Origin.Number, "no safe head progress") + require.NotEqual(t, postReorgStatus.HeadL1.Hash, postReorgStatus.UnsafeL2.L1Origin.Hash, "no longer have head L1 origin") + + sequencer.ActL2PipelineFull(t) + // Verifier should detect the inconsistency of the L1 origin and reset the pipeline to follow the reorg + newStatus := sequencer.SyncStatus() + require.Zero(t, newStatus.UnsafeL2.L1Origin.Number, "back to genesis block with good L1 origin, drop old unsafe L2 chain with bad L1 origins") + require.NotEqual(t, status.HeadL1.Hash, newStatus.HeadL1.Hash, "did see the new L1 head change") + require.Equal(t, newStatus.HeadL1.Hash, newStatus.CurrentL1.Hash, "did sync the new L1 head as verifier") + + // the block N+1 cannot build on the old N which still refers to the now orphaned L1 origin + require.Equal(t, status.UnsafeL2.L1Origin.Number, newStatus.HeadL1.Number-1, "seeing N+1 to attempt to build on N") + require.NotEqual(t, status.UnsafeL2.L1Origin.Hash, newStatus.HeadL1.ParentHash, "but N+1 cannot fit on N") + + // Can build new L2 blocks with good L1 origin + sequencer.ActBuildToL1HeadUnsafe(t) + require.Equal(t, newStatus.HeadL1.Hash, sequencer.SyncStatus().UnsafeL2.L1Origin.Hash, "build L2 chain with new correct L1 origins") +} diff --git a/op-e2e/actions/sync/sync_test.go b/op-e2e/actions/sync/sync_test.go new file mode 100644 index 000000000000..523b68517afb --- /dev/null +++ b/op-e2e/actions/sync/sync_test.go @@ -0,0 +1,1120 @@ +package sync + +import ( + "errors" + "math/big" + "math/rand" + "strings" + "testing" + "time" + + actionsHelpers "github.com/ethereum-optimism/optimism/op-e2e/actions/helpers" + upgradesHelpers "github.com/ethereum-optimism/optimism/op-e2e/actions/upgrades/helpers" + "github.com/stretchr/testify/require" + + "github.com/ethereum/go-ethereum" + gethengine "github.com/ethereum/go-ethereum/beacon/engine" + "github.com/ethereum/go-ethereum/common/hexutil" + "github.com/ethereum/go-ethereum/core" + "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" + + altda "github.com/ethereum-optimism/optimism/op-alt-da" + "github.com/ethereum-optimism/optimism/op-e2e/e2eutils" + "github.com/ethereum-optimism/optimism/op-node/rollup" + "github.com/ethereum-optimism/optimism/op-node/rollup/derive" + engine2 "github.com/ethereum-optimism/optimism/op-node/rollup/engine" + "github.com/ethereum-optimism/optimism/op-node/rollup/event" + "github.com/ethereum-optimism/optimism/op-node/rollup/sync" + "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-optimism/optimism/op-service/testutils" +) + +func newSpanChannelOut(t actionsHelpers.StatefulTesting, e e2eutils.SetupData) derive.ChannelOut { + channelOut, err := derive.NewSpanChannelOut(128_000, derive.Zlib, rollup.NewChainSpec(e.RollupCfg)) + 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 { + name string + f func(gt *testing.T, deltaTimeOffset *hexutil.Uint64) + }{ + {"DerivationWithFlakyL1RPC", DerivationWithFlakyL1RPC}, + {"FinalizeWhileSyncing", FinalizeWhileSyncing}, + } + for _, test := range tests { + test := test + t.Run(test.name+"_SingularBatch", func(t *testing.T) { + test.f(t, nil) + }) + } + + deltaTimeOffset := hexutil.Uint64(0) + for _, test := range tests { + test := test + t.Run(test.name+"_SpanBatch", func(t *testing.T) { + test.f(t, &deltaTimeOffset) + }) + } +} + +func DerivationWithFlakyL1RPC(gt *testing.T, deltaTimeOffset *hexutil.Uint64) { + t := actionsHelpers.NewDefaultTesting(gt) + dp := e2eutils.MakeDeployParams(t, actionsHelpers.DefaultRollupTestParams) + upgradesHelpers.ApplyDeltaTimeOffset(dp, deltaTimeOffset) + sd := e2eutils.Setup(t, dp, actionsHelpers.DefaultAlloc) + log := testlog.Logger(t, log.LevelError) // mute all the temporary derivation errors that we forcefully create + _, _, miner, sequencer, _, verifier, _, batcher := actionsHelpers.SetupReorgTestActors(t, dp, sd, log) + + rng := rand.New(rand.NewSource(1234)) + sequencer.ActL2PipelineFull(t) + verifier.ActL2PipelineFull(t) + + // build a L1 chain with 20 blocks and matching L2 chain and batches to test some derivation work + miner.ActEmptyBlock(t) + for i := 0; i < 20; i++ { + sequencer.ActL1HeadSignal(t) + sequencer.ActL2PipelineFull(t) + sequencer.ActBuildToL1Head(t) + batcher.ActSubmitAll(t) + miner.ActL1StartBlock(12)(t) + miner.ActL1IncludeTx(batcher.BatcherAddr)(t) + miner.ActL1EndBlock(t) + } + // Make verifier aware of head + verifier.ActL1HeadSignal(t) + + // Now make the L1 RPC very flaky: requests will randomly fail with 50% chance + miner.MockL1RPCErrors(func() error { + if rng.Intn(2) == 0 { + return errors.New("mock rpc error") + } + return nil + }) + + // And sync the verifier + verifier.ActL2PipelineFull(t) + // Verifier should be synced, even though it hit lots of temporary L1 RPC errors + require.Equal(t, sequencer.L2Unsafe(), verifier.L2Safe(), "verifier is synced") +} + +func FinalizeWhileSyncing(gt *testing.T, deltaTimeOffset *hexutil.Uint64) { + t := actionsHelpers.NewDefaultTesting(gt) + dp := e2eutils.MakeDeployParams(t, actionsHelpers.DefaultRollupTestParams) + upgradesHelpers.ApplyDeltaTimeOffset(dp, deltaTimeOffset) + sd := e2eutils.Setup(t, dp, actionsHelpers.DefaultAlloc) + log := testlog.Logger(t, log.LevelError) // mute all the temporary derivation errors that we forcefully create + _, _, miner, sequencer, _, verifier, _, batcher := actionsHelpers.SetupReorgTestActors(t, dp, sd, log) + + sequencer.ActL2PipelineFull(t) + verifier.ActL2PipelineFull(t) + + verifierStartStatus := verifier.SyncStatus() + + // Build an L1 chain with 64 + 1 blocks, containing batches of L2 chain. + // Enough to go past the finalityDelay of the engine queue, + // to make the verifier finalize while it syncs. + miner.ActEmptyBlock(t) + for i := 0; i < 64+1; i++ { + sequencer.ActL1HeadSignal(t) + sequencer.ActL2PipelineFull(t) + sequencer.ActBuildToL1Head(t) + batcher.ActSubmitAll(t) + miner.ActL1StartBlock(12)(t) + miner.ActL1IncludeTx(batcher.BatcherAddr)(t) + miner.ActL1EndBlock(t) + } + l1Head := miner.L1Chain().CurrentHeader() + // finalize all of L1 + miner.ActL1Safe(t, l1Head.Number.Uint64()) + miner.ActL1Finalize(t, l1Head.Number.Uint64()) + + // Now signal L1 finality to the verifier, while the verifier is not synced. + verifier.ActL1HeadSignal(t) + verifier.ActL1SafeSignal(t) + verifier.ActL1FinalizedSignal(t) + + // Now sync the verifier, without repeating the signal. + // While it's syncing, it should finalize on interval now, based on the future L1 finalized block it remembered. + verifier.ActL2PipelineFull(t) + + // Verify the verifier finalized something new + result := verifier.SyncStatus() + require.Less(t, verifierStartStatus.FinalizedL2.Number, result.FinalizedL2.Number, "verifier finalized L2 blocks during sync") +} + +// TestUnsafeSync tests that a verifier properly imports unsafe blocks via gossip. +func TestUnsafeSync(gt *testing.T) { + t := actionsHelpers.NewDefaultTesting(gt) + dp := e2eutils.MakeDeployParams(t, actionsHelpers.DefaultRollupTestParams) + sd := e2eutils.Setup(t, dp, actionsHelpers.DefaultAlloc) + log := testlog.Logger(t, log.LevelInfo) + + sd, _, _, sequencer, seqEng, verifier, _, _ := actionsHelpers.SetupReorgTestActors(t, dp, sd, log) + seqEngCl, err := sources.NewEngineClient(seqEng.RPCClient(), log, nil, sources.EngineClientDefaultConfig(sd.RollupCfg)) + require.NoError(t, err) + + sequencer.ActL2PipelineFull(t) + verifier.ActL2PipelineFull(t) + + for i := 0; i < 10; i++ { + // Build a L2 block + sequencer.ActL2StartBlock(t) + sequencer.ActL2EndBlock(t) + // Notify new L2 block to verifier by unsafe gossip + seqHead, err := seqEngCl.PayloadByLabel(t.Ctx(), eth.Unsafe) + require.NoError(t, err) + verifier.ActL2UnsafeGossipReceive(seqHead)(t) + // Handle unsafe payload + verifier.ActL2PipelineFull(t) + // Verifier must advance its unsafe head. + require.Equal(t, sequencer.L2Unsafe().Hash, verifier.L2Unsafe().Hash) + } +} + +func TestBackupUnsafe(gt *testing.T) { + t := actionsHelpers.NewDefaultTesting(gt) + dp := e2eutils.MakeDeployParams(t, actionsHelpers.DefaultRollupTestParams) + minTs := hexutil.Uint64(0) + // Activate Delta hardfork + upgradesHelpers.ApplyDeltaTimeOffset(dp, &minTs) + dp.DeployConfig.L2BlockTime = 2 + sd := e2eutils.Setup(t, dp, actionsHelpers.DefaultAlloc) + log := testlog.Logger(t, log.LvlInfo) + _, dp, miner, sequencer, seqEng, verifier, _, batcher := actionsHelpers.SetupReorgTestActors(t, dp, sd, log) + l2Cl := seqEng.EthClient() + seqEngCl, err := sources.NewEngineClient(seqEng.RPCClient(), log, nil, sources.EngineClientDefaultConfig(sd.RollupCfg)) + require.NoError(t, err) + + rng := rand.New(rand.NewSource(1234)) + signer := types.LatestSigner(sd.L2Cfg.Config) + + sequencer.ActL2PipelineFull(t) + verifier.ActL2PipelineFull(t) + + // Create block A1 ~ A5 + for i := 0; i < 5; i++ { + // Build a L2 block + sequencer.ActL2StartBlock(t) + sequencer.ActL2EndBlock(t) + + // Notify new L2 block to verifier by unsafe gossip + seqHead, err := seqEngCl.PayloadByLabel(t.Ctx(), eth.Unsafe) + require.NoError(t, err) + verifier.ActL2UnsafeGossipReceive(seqHead)(t) + } + + seqHead, err := seqEngCl.PayloadByLabel(t.Ctx(), eth.Unsafe) + require.NoError(t, err) + // eventually correct hash for A5 + targetUnsafeHeadHash := seqHead.ExecutionPayload.BlockHash + + // only advance unsafe head to A5 + require.Equal(t, sequencer.L2Unsafe().Number, uint64(5)) + require.Equal(t, sequencer.L2Safe().Number, uint64(0)) + + // Handle unsafe payload + verifier.ActL2PipelineFull(t) + // only advance unsafe head to A5 + require.Equal(t, verifier.L2Unsafe().Number, uint64(5)) + require.Equal(t, verifier.L2Safe().Number, uint64(0)) + + channelOut := newSpanChannelOut(t, *sd) + + for i := uint64(1); i <= sequencer.L2Unsafe().Number; i++ { + block, err := l2Cl.BlockByNumber(t.Ctx(), new(big.Int).SetUint64(i)) + require.NoError(t, err) + if i == 2 { + // Make block B2 as an valid block different with unsafe block + // Alice makes a L2 tx + n, err := l2Cl.PendingNonceAt(t.Ctx(), dp.Addresses.Alice) + require.NoError(t, err) + validTx := types.MustSignNewTx(dp.Secrets.Alice, signer, &types.DynamicFeeTx{ + ChainID: sd.L2Cfg.Config.ChainID, + Nonce: n, + GasTipCap: big.NewInt(2 * params.GWei), + GasFeeCap: new(big.Int).Add(miner.L1Chain().CurrentBlock().BaseFee, big.NewInt(2*params.GWei)), + Gas: params.TxGas, + To: &dp.Addresses.Bob, + Value: e2eutils.Ether(2), + }) + block = block.WithBody(types.Body{Transactions: []*types.Transaction{block.Transactions()[0], validTx}}) + } + if i == 3 { + // Make block B3 as an invalid block + invalidTx := testutils.RandomTx(rng, big.NewInt(100), signer) + block = block.WithBody(types.Body{Transactions: []*types.Transaction{block.Transactions()[0], invalidTx}}) + } + // Add A1, B2, B3, B4, B5 into the channel + err = channelOut.AddBlock(sd.RollupCfg, block) + require.NoError(t, err) + } + + // Submit span batch(A1, B2, invalid B3, B4, B5) + batcher.L2ChannelOut = channelOut + batcher.ActL2ChannelClose(t) + batcher.ActL2BatchSubmit(t) + + miner.ActL1StartBlock(12)(t) + miner.ActL1IncludeTx(dp.Addresses.Batcher)(t) + miner.ActL1EndBlock(t) + + // let sequencer process invalid span batch + sequencer.ActL1HeadSignal(t) + // before stepping, make sure backupUnsafe is empty + require.Equal(t, eth.L2BlockRef{}, sequencer.L2BackupUnsafe()) + // pendingSafe must not be advanced as well + require.Equal(t, sequencer.L2PendingSafe().Number, uint64(0)) + // Run until we consume A1 from batch + sequencer.ActL2EventsUntilPending(t, 1) + // A1 is valid original block so pendingSafe is advanced + require.Equal(t, sequencer.L2PendingSafe().Number, uint64(1)) + require.Equal(t, sequencer.L2Unsafe().Number, uint64(5)) + // backupUnsafe is still empty + require.Equal(t, eth.L2BlockRef{}, sequencer.L2BackupUnsafe()) + + // Process B2 + // Run until we consume B2 from batch + sequencer.ActL2EventsUntilPending(t, 2) + // B2 is valid different block, triggering unsafe chain reorg + require.Equal(t, sequencer.L2Unsafe().Number, uint64(2)) + // B2 is valid different block, triggering unsafe block backup + require.Equal(t, targetUnsafeHeadHash, sequencer.L2BackupUnsafe().Hash) + // B2 is valid different block, so pendingSafe is advanced + require.Equal(t, sequencer.L2PendingSafe().Number, uint64(2)) + // try to process invalid leftovers: B3, B4, B5 + sequencer.ActL2PipelineFull(t) + // backupUnsafe is used because A3 is invalid. Check backupUnsafe is emptied after used + require.Equal(t, eth.L2BlockRef{}, sequencer.L2BackupUnsafe()) + + // check pendingSafe is reset + require.Equal(t, sequencer.L2PendingSafe().Number, uint64(0)) + // check backupUnsafe is applied + require.Equal(t, sequencer.L2Unsafe().Hash, targetUnsafeHeadHash) + require.Equal(t, sequencer.L2Unsafe().Number, uint64(5)) + // safe head cannot be advanced because batch contained invalid blocks + require.Equal(t, sequencer.L2Safe().Number, uint64(0)) + + // let verifier process invalid span batch + verifier.ActL1HeadSignal(t) + verifier.ActL2PipelineFull(t) + + // safe head cannot be advanced, while unsafe head not changed + require.Equal(t, verifier.L2Unsafe().Number, uint64(5)) + require.Equal(t, verifier.L2Safe().Number, uint64(0)) + require.Equal(t, verifier.L2Unsafe().Hash, targetUnsafeHeadHash) + + // Build and submit a span batch with A1 ~ A5 + batcher.ActSubmitAll(t) + miner.ActL1StartBlock(12)(t) + miner.ActL1IncludeTx(dp.Addresses.Batcher)(t) + miner.ActL1EndBlock(t) + + // let sequencer process valid span batch + sequencer.ActL1HeadSignal(t) + sequencer.ActL2PipelineFull(t) + + // safe/unsafe head must be advanced + require.Equal(t, sequencer.L2Unsafe().Number, uint64(5)) + require.Equal(t, sequencer.L2Safe().Number, uint64(5)) + require.Equal(t, sequencer.L2Safe().Hash, targetUnsafeHeadHash) + // check backupUnsafe is emptied after consolidation + require.Equal(t, eth.L2BlockRef{}, sequencer.L2BackupUnsafe()) + + // let verifier process valid span batch + verifier.ActL1HeadSignal(t) + verifier.ActL2PipelineFull(t) + + // safe and unsafe head must be advanced + require.Equal(t, verifier.L2Unsafe().Number, uint64(5)) + require.Equal(t, verifier.L2Safe().Number, uint64(5)) + require.Equal(t, verifier.L2Safe().Hash, targetUnsafeHeadHash) + // check backupUnsafe is emptied after consolidation + require.Equal(t, eth.L2BlockRef{}, verifier.L2BackupUnsafe()) +} + +func TestBackupUnsafeReorgForkChoiceInputError(gt *testing.T) { + t := actionsHelpers.NewDefaultTesting(gt) + dp := e2eutils.MakeDeployParams(t, actionsHelpers.DefaultRollupTestParams) + minTs := hexutil.Uint64(0) + // Activate Delta hardfork + upgradesHelpers.ApplyDeltaTimeOffset(dp, &minTs) + dp.DeployConfig.L2BlockTime = 2 + sd := e2eutils.Setup(t, dp, actionsHelpers.DefaultAlloc) + log := testlog.Logger(t, log.LvlInfo) + _, dp, miner, sequencer, seqEng, verifier, _, batcher := actionsHelpers.SetupReorgTestActors(t, dp, sd, log) + l2Cl := seqEng.EthClient() + seqEngCl, err := sources.NewEngineClient(seqEng.RPCClient(), log, nil, sources.EngineClientDefaultConfig(sd.RollupCfg)) + require.NoError(t, err) + + rng := rand.New(rand.NewSource(1234)) + signer := types.LatestSigner(sd.L2Cfg.Config) + + sequencer.ActL2PipelineFull(t) + verifier.ActL2PipelineFull(t) + + // Create block A1 ~ A5 + for i := 0; i < 5; i++ { + // Build a L2 block + sequencer.ActL2StartBlock(t) + sequencer.ActL2EndBlock(t) + + // Notify new L2 block to verifier by unsafe gossip + seqHead, err := seqEngCl.PayloadByLabel(t.Ctx(), eth.Unsafe) + require.NoError(t, err) + verifier.ActL2UnsafeGossipReceive(seqHead)(t) + } + + seqHead, err := seqEngCl.PayloadByLabel(t.Ctx(), eth.Unsafe) + require.NoError(t, err) + // eventually correct hash for A5 + targetUnsafeHeadHash := seqHead.ExecutionPayload.BlockHash + + // only advance unsafe head to A5 + require.Equal(t, sequencer.L2Unsafe().Number, uint64(5)) + require.Equal(t, sequencer.L2Safe().Number, uint64(0)) + + // Handle unsafe payload + verifier.ActL2PipelineFull(t) + // only advance unsafe head to A5 + require.Equal(t, verifier.L2Unsafe().Number, uint64(5)) + require.Equal(t, verifier.L2Safe().Number, uint64(0)) + + channelOut := newSpanChannelOut(t, *sd) + + for i := uint64(1); i <= sequencer.L2Unsafe().Number; i++ { + block, err := l2Cl.BlockByNumber(t.Ctx(), new(big.Int).SetUint64(i)) + require.NoError(t, err) + if i == 2 { + // Make block B2 as an valid block different with unsafe block + // Alice makes a L2 tx + n, err := l2Cl.PendingNonceAt(t.Ctx(), dp.Addresses.Alice) + require.NoError(t, err) + validTx := types.MustSignNewTx(dp.Secrets.Alice, signer, &types.DynamicFeeTx{ + ChainID: sd.L2Cfg.Config.ChainID, + Nonce: n, + GasTipCap: big.NewInt(2 * params.GWei), + GasFeeCap: new(big.Int).Add(miner.L1Chain().CurrentBlock().BaseFee, big.NewInt(2*params.GWei)), + Gas: params.TxGas, + To: &dp.Addresses.Bob, + Value: e2eutils.Ether(2), + }) + block = block.WithBody(types.Body{Transactions: []*types.Transaction{block.Transactions()[0], validTx}}) + } + if i == 3 { + // Make block B3 as an invalid block + invalidTx := testutils.RandomTx(rng, big.NewInt(100), signer) + block = block.WithBody(types.Body{Transactions: []*types.Transaction{block.Transactions()[0], invalidTx}}) + } + // Add A1, B2, B3, B4, B5 into the channel + err = channelOut.AddBlock(sd.RollupCfg, block) + require.NoError(t, err) + } + + // Submit span batch(A1, B2, invalid B3, B4, B5) + batcher.L2ChannelOut = channelOut + batcher.ActL2ChannelClose(t) + batcher.ActL2BatchSubmit(t) + + miner.ActL1StartBlock(12)(t) + miner.ActL1IncludeTx(dp.Addresses.Batcher)(t) + miner.ActL1EndBlock(t) + + // let sequencer process invalid span batch + sequencer.ActL1HeadSignal(t) + // before stepping, make sure backupUnsafe is empty + require.Equal(t, eth.L2BlockRef{}, sequencer.L2BackupUnsafe()) + // pendingSafe must not be advanced as well + require.Equal(t, sequencer.L2PendingSafe().Number, uint64(0)) + // Run till we consumed A1 from batch + sequencer.ActL2EventsUntilPending(t, 1) + // A1 is valid original block so pendingSafe is advanced + require.Equal(t, sequencer.L2PendingSafe().Number, uint64(1)) + require.Equal(t, sequencer.L2Unsafe().Number, uint64(5)) + // backupUnsafe is still empty + require.Equal(t, eth.L2BlockRef{}, sequencer.L2BackupUnsafe()) + + // Process B2 + sequencer.ActL2EventsUntilPending(t, 2) + // B2 is valid different block, triggering unsafe chain reorg + require.Equal(t, sequencer.L2Unsafe().Number, uint64(2)) + // B2 is valid different block, triggering unsafe block backup + require.Equal(t, targetUnsafeHeadHash, sequencer.L2BackupUnsafe().Hash) + // B2 is valid different block, so pendingSafe is advanced + require.Equal(t, sequencer.L2PendingSafe().Number, uint64(2)) + + // B3 is invalid block + // NextAttributes is called + sequencer.ActL2EventsUntil(t, event.Is[engine2.BuildStartEvent], 100, true) + // mock forkChoiceUpdate error while restoring previous unsafe chain using backupUnsafe. + seqEng.ActL2RPCFail(t, eth.InputError{Inner: errors.New("mock L2 RPC error"), Code: eth.InvalidForkchoiceState}) + + // The backup-unsafe rewind is applied + + // try to process invalid leftovers: B4, B5 + sequencer.ActL2PipelineFull(t) + + // backupUnsafe is not used because forkChoiceUpdate returned an error. + // Check backupUnsafe is emptied. + require.Equal(t, eth.L2BlockRef{}, sequencer.L2BackupUnsafe()) + + // check pendingSafe is reset + require.Equal(t, sequencer.L2PendingSafe().Number, uint64(0)) + // unsafe head is not restored due to forkchoiceUpdate error in TryBackupUnsafeReorg + require.Equal(t, sequencer.L2Unsafe().Number, uint64(2)) + // safe head cannot be advanced because batch contained invalid blocks + require.Equal(t, sequencer.L2Safe().Number, uint64(0)) +} + +func TestBackupUnsafeReorgForkChoiceNotInputError(gt *testing.T) { + t := actionsHelpers.NewDefaultTesting(gt) + dp := e2eutils.MakeDeployParams(t, actionsHelpers.DefaultRollupTestParams) + minTs := hexutil.Uint64(0) + // Activate Delta hardfork + upgradesHelpers.ApplyDeltaTimeOffset(dp, &minTs) + dp.DeployConfig.L2BlockTime = 2 + sd := e2eutils.Setup(t, dp, actionsHelpers.DefaultAlloc) + log := testlog.Logger(t, log.LvlInfo) + _, dp, miner, sequencer, seqEng, verifier, _, batcher := actionsHelpers.SetupReorgTestActors(t, dp, sd, log) + l2Cl := seqEng.EthClient() + seqEngCl, err := sources.NewEngineClient(seqEng.RPCClient(), log, nil, sources.EngineClientDefaultConfig(sd.RollupCfg)) + require.NoError(t, err) + + rng := rand.New(rand.NewSource(1234)) + signer := types.LatestSigner(sd.L2Cfg.Config) + + sequencer.ActL2PipelineFull(t) + verifier.ActL2PipelineFull(t) + + // Create block A1 ~ A5 + for i := 0; i < 5; i++ { + // Build a L2 block + sequencer.ActL2StartBlock(t) + sequencer.ActL2EndBlock(t) + + // Notify new L2 block to verifier by unsafe gossip + seqHead, err := seqEngCl.PayloadByLabel(t.Ctx(), eth.Unsafe) + require.NoError(t, err) + verifier.ActL2UnsafeGossipReceive(seqHead)(t) + } + + seqHead, err := seqEngCl.PayloadByLabel(t.Ctx(), eth.Unsafe) + require.NoError(t, err) + // eventually correct hash for A5 + targetUnsafeHeadHash := seqHead.ExecutionPayload.BlockHash + + // only advance unsafe head to A5 + require.Equal(t, sequencer.L2Unsafe().Number, uint64(5)) + require.Equal(t, sequencer.L2Safe().Number, uint64(0)) + + // Handle unsafe payload + verifier.ActL2PipelineFull(t) + // only advance unsafe head to A5 + require.Equal(t, verifier.L2Unsafe().Number, uint64(5)) + require.Equal(t, verifier.L2Safe().Number, uint64(0)) + + channelOut := newSpanChannelOut(t, *sd) + + for i := uint64(1); i <= sequencer.L2Unsafe().Number; i++ { + block, err := l2Cl.BlockByNumber(t.Ctx(), new(big.Int).SetUint64(i)) + require.NoError(t, err) + if i == 2 { + // Make block B2 as an valid block different with unsafe block + // Alice makes a L2 tx + n, err := l2Cl.PendingNonceAt(t.Ctx(), dp.Addresses.Alice) + require.NoError(t, err) + validTx := types.MustSignNewTx(dp.Secrets.Alice, signer, &types.DynamicFeeTx{ + ChainID: sd.L2Cfg.Config.ChainID, + Nonce: n, + GasTipCap: big.NewInt(2 * params.GWei), + GasFeeCap: new(big.Int).Add(miner.L1Chain().CurrentBlock().BaseFee, big.NewInt(2*params.GWei)), + Gas: params.TxGas, + To: &dp.Addresses.Bob, + Value: e2eutils.Ether(2), + }) + block = block.WithBody(types.Body{Transactions: []*types.Transaction{block.Transactions()[0], validTx}}) + } + if i == 3 { + // Make block B3 as an invalid block + invalidTx := testutils.RandomTx(rng, big.NewInt(100), signer) + block = block.WithBody(types.Body{Transactions: []*types.Transaction{block.Transactions()[0], invalidTx}}) + } + // Add A1, B2, B3, B4, B5 into the channel + err = channelOut.AddBlock(sd.RollupCfg, block) + require.NoError(t, err) + } + + // Submit span batch(A1, B2, invalid B3, B4, B5) + batcher.L2ChannelOut = channelOut + batcher.ActL2ChannelClose(t) + batcher.ActL2BatchSubmit(t) + + miner.ActL1StartBlock(12)(t) + miner.ActL1IncludeTx(dp.Addresses.Batcher)(t) + miner.ActL1EndBlock(t) + + // let sequencer process invalid span batch + sequencer.ActL1HeadSignal(t) + // before stepping, make sure backupUnsafe is empty + require.Equal(t, eth.L2BlockRef{}, sequencer.L2BackupUnsafe()) + // pendingSafe must not be advanced as well + require.Equal(t, sequencer.L2PendingSafe().Number, uint64(0)) + // Preheat engine queue and consume A1 from batch + sequencer.ActL2EventsUntilPending(t, 1) + // A1 is valid original block so pendingSafe is advanced + require.Equal(t, sequencer.L2PendingSafe().Number, uint64(1)) + require.Equal(t, sequencer.L2Unsafe().Number, uint64(5)) + // backupUnsafe is still empty + require.Equal(t, eth.L2BlockRef{}, sequencer.L2BackupUnsafe()) + + // Process B2 + sequencer.ActL2EventsUntilPending(t, 2) + // B2 is valid different block, triggering unsafe chain reorg + require.Equal(t, sequencer.L2Unsafe().Number, uint64(2)) + // B2 is valid different block, triggering unsafe block backup + require.Equal(t, targetUnsafeHeadHash, sequencer.L2BackupUnsafe().Hash) + // B2 is valid different block, so pendingSafe is advanced + require.Equal(t, sequencer.L2PendingSafe().Number, uint64(2)) + + // B3 is invalid block + // wait till attributes processing (excl.) before mocking errors + sequencer.ActL2EventsUntil(t, event.Is[engine2.BuildStartEvent], 100, true) + + serverErrCnt := 2 + // mock forkChoiceUpdate failure while restoring previous unsafe chain using backupUnsafe. + seqEng.FailL2RPC = func(call []rpc.BatchElem) error { + for _, e := range call { + // There may be other calls, like payload-processing-cancellation + // based on previous invalid block, and processing of block attributes. + if strings.HasPrefix(e.Method, "engine_forkchoiceUpdated") && e.Args[1].(*eth.PayloadAttributes) == nil { + if serverErrCnt > 0 { + serverErrCnt -= 1 + return gethengine.GenericServerError + } else { + return nil + } + } + } + return nil + } + // cannot drain events until specific engine error, since SyncDeriver calls Drain internally still. + sequencer.ActL2PipelineFull(t) + + // now forkchoice succeeds + // try to process invalid leftovers: B4, B5 + sequencer.ActL2PipelineFull(t) + + // backupUnsafe is used because forkChoiceUpdate eventually succeeded. + // Check backupUnsafe is emptied. + require.Equal(t, eth.L2BlockRef{}, sequencer.L2BackupUnsafe()) + + // check pendingSafe is reset + require.Equal(t, sequencer.L2PendingSafe().Number, uint64(0)) + // check backupUnsafe is applied + require.Equal(t, sequencer.L2Unsafe().Hash, targetUnsafeHeadHash) + require.Equal(t, sequencer.L2Unsafe().Number, uint64(5)) + // safe head cannot be advanced because batch contained invalid blocks + require.Equal(t, sequencer.L2Safe().Number, uint64(0)) +} + +// builds l2 blocks within the specified range `from` - `to` +// and performs an EL sync between the sequencer and the verifier, +// then checks the validity of the payloads within a specified block range. +func PerformELSyncAndCheckPayloads(t actionsHelpers.Testing, miner *actionsHelpers.L1Miner, seqEng *actionsHelpers.L2Engine, sequencer *actionsHelpers.L2Sequencer, verEng *actionsHelpers.L2Engine, verifier *actionsHelpers.L2Verifier, seqEngCl *sources.EngineClient, from, to uint64) { + miner.ActEmptyBlock(t) + sequencer.ActL2PipelineFull(t) + + // Build L1 blocks on the sequencer + for i := from; i < to; i++ { + // Build a L2 block + sequencer.ActL2StartBlock(t) + sequencer.ActL2EndBlock(t) + } + + // Wait longer to peer. This tests flakes or takes a long time when the op-geth instances are not able to peer. + verEng.AddPeers(seqEng.Enode()) + + // Insert it on the verifier + seqHead, err := seqEngCl.PayloadByLabel(t.Ctx(), eth.Unsafe) + require.NoError(t, err) + seqStart, err := seqEngCl.PayloadByNumber(t.Ctx(), from) + require.NoError(t, err) + verifier.ActL2InsertUnsafePayload(seqHead)(t) + + require.Eventually(t, + func() bool { + return seqEng.PeerCount() > 0 && verEng.PeerCount() > 0 + }, + 120*time.Second, 1500*time.Millisecond, + "Sequencer & Verifier must peer with each other for snap sync to work", + ) + + // Expect snap sync to download & execute the entire chain + // Verify this by checking that the verifier has the correct value for block 1 + require.Eventually(t, + func() bool { + block, err := verifier.Eng.L2BlockRefByNumber(t.Ctx(), from) + if err != nil { + return false + } + return seqStart.ExecutionPayload.BlockHash == block.Hash + }, + 60*time.Second, 1500*time.Millisecond, + "verifier did not snap sync", + ) +} + +// verifies that a specific block number on the L2 engine has the expected label. +func VerifyBlock(t actionsHelpers.Testing, engine actionsHelpers.L2API, number uint64, label eth.BlockLabel) { + id, err := engine.L2BlockRefByLabel(t.Ctx(), label) + require.NoError(t, err) + require.Equal(t, number, id.Number) +} + +// submits batch at a specified block number +func BatchSubmitBlock(t actionsHelpers.Testing, miner *actionsHelpers.L1Miner, sequencer *actionsHelpers.L2Sequencer, verifier *actionsHelpers.L2Verifier, batcher *actionsHelpers.L2Batcher, dp *e2eutils.DeployParams, number uint64) { + sequencer.ActL2StartBlock(t) + sequencer.ActL2EndBlock(t) + batcher.ActSubmitAll(t) + miner.ActL1StartBlock(number)(t) + miner.ActL1IncludeTx(dp.Addresses.Batcher)(t) + miner.ActL1EndBlock(t) + sequencer.ActL2PipelineFull(t) + verifier.ActL2PipelineFull(t) +} + +// TestELSync tests that a verifier will have the EL import the full chain from the sequencer +// when passed a single unsafe block. op-geth can either snap sync or full sync here. +func TestELSync(gt *testing.T) { + t := actionsHelpers.NewDefaultTesting(gt) + dp := e2eutils.MakeDeployParams(t, actionsHelpers.DefaultRollupTestParams) + sd := e2eutils.Setup(t, dp, actionsHelpers.DefaultAlloc) + log := testlog.Logger(t, log.LevelInfo) + + miner, seqEng, sequencer := actionsHelpers.SetupSequencerTest(t, sd, log) + // Enable engine P2P sync + verEng, verifier := actionsHelpers.SetupVerifier(t, sd, log, miner.L1Client(t, sd.RollupCfg), miner.BlobStore(), &sync.Config{SyncMode: sync.ELSync}) + + seqEngCl, err := sources.NewEngineClient(seqEng.RPCClient(), log, nil, sources.EngineClientDefaultConfig(sd.RollupCfg)) + require.NoError(t, err) + + PerformELSyncAndCheckPayloads(t, miner, seqEng, sequencer, verEng, verifier, seqEngCl, 0, 10) +} + +func PrepareELSyncedNode(t actionsHelpers.Testing, miner *actionsHelpers.L1Miner, sequencer *actionsHelpers.L2Sequencer, seqEng *actionsHelpers.L2Engine, verifier *actionsHelpers.L2Verifier, verEng *actionsHelpers.L2Engine, seqEngCl *sources.EngineClient, batcher *actionsHelpers.L2Batcher, dp *e2eutils.DeployParams) { + PerformELSyncAndCheckPayloads(t, miner, seqEng, sequencer, verEng, verifier, seqEngCl, 0, 10) + + // Despite downloading the blocks, it has not finished finalizing + _, err := verifier.Eng.L2BlockRefByLabel(t.Ctx(), "safe") + require.ErrorIs(t, err, ethereum.NotFound) + + // Insert a block on the verifier to end snap sync + sequencer.ActL2StartBlock(t) + sequencer.ActL2EndBlock(t) + seqHead, err := seqEngCl.PayloadByLabel(t.Ctx(), eth.Unsafe) + require.NoError(t, err) + verifier.ActL2InsertUnsafePayload(seqHead)(t) + + // Check that safe + finalized are there + VerifyBlock(t, verifier.Eng, 11, eth.Safe) + VerifyBlock(t, verifier.Eng, 11, eth.Finalized) + + // Batch submit everything + BatchSubmitBlock(t, miner, sequencer, verifier, batcher, dp, 12) + + // Verify that the batch submitted blocks are there now + VerifyBlock(t, sequencer.Eng, 12, eth.Safe) + VerifyBlock(t, verifier.Eng, 12, eth.Safe) +} + +// TestELSyncTransitionstoCL tests that a verifier which starts with EL sync can switch back to a proper CL sync. +// It takes a sequencer & verifier through the following: +// 1. Build 10 unsafe blocks on the sequencer +// 2. Snap sync those blocks to the verifier +// 3. Build & insert 1 unsafe block from the sequencer to the verifier to end snap sync +// 4. Batch submit everything +// 5. Build 10 more unsafe blocks on the sequencer +// 6. Gossip in the highest block to the verifier. **Expect that it does not snap sync** +// 7. Then gossip the rest of the blocks to the verifier. Once this is complete it should pick up all of the unsafe blocks. +// Prior to this PR, the test would fail at this point. +// 8. Create 1 more block & batch submit everything & assert that the verifier picked up those blocks +func TestELSyncTransitionstoCL(gt *testing.T) { + t := actionsHelpers.NewDefaultTesting(gt) + dp := e2eutils.MakeDeployParams(t, actionsHelpers.DefaultRollupTestParams) + sd := e2eutils.Setup(t, dp, actionsHelpers.DefaultAlloc) + logger := testlog.Logger(t, log.LevelInfo) + + captureLog, captureLogHandler := testlog.CaptureLogger(t, log.LevelInfo) + + miner, seqEng, sequencer := actionsHelpers.SetupSequencerTest(t, sd, logger) + batcher := actionsHelpers.NewL2Batcher(logger, sd.RollupCfg, actionsHelpers.DefaultBatcherCfg(dp), sequencer.RollupClient(), miner.EthClient(), seqEng.EthClient(), seqEng.EngineClient(t, sd.RollupCfg)) + // Enable engine P2P sync + verEng, verifier := actionsHelpers.SetupVerifier(t, sd, captureLog, miner.L1Client(t, sd.RollupCfg), miner.BlobStore(), &sync.Config{SyncMode: sync.ELSync}) + + seqEngCl, err := sources.NewEngineClient(seqEng.RPCClient(), logger, nil, sources.EngineClientDefaultConfig(sd.RollupCfg)) + require.NoError(t, err) + + PrepareELSyncedNode(t, miner, sequencer, seqEng, verifier, verEng, seqEngCl, batcher, dp) + + // Build another 10 L1 blocks on the sequencer + for i := 0; i < 10; i++ { + // Build a L2 block + sequencer.ActL2StartBlock(t) + sequencer.ActL2EndBlock(t) + } + + // Now pass payloads to the derivation pipeline + // This is a little hacky that we have to manually switch between InsertBlock + // and UnsafeGossipReceive in the tests + seqHead, err := seqEngCl.PayloadByLabel(t.Ctx(), eth.Unsafe) + require.NoError(t, err) + verifier.ActL2UnsafeGossipReceive(seqHead)(t) + verifier.ActL2PipelineFull(t) + // Verify that the derivation pipeline did not request a sync to the new head. This is the core of the test, but a little fragile. + record := captureLogHandler.FindLog(testlog.NewMessageFilter("Forkchoice requested sync to new head"), testlog.NewAttributesFilter("number", "22")) + require.Nil(t, record, "The verifier should not request to sync to block number 22 because it is in CL mode, not EL mode at this point.") + + for i := 13; i < 23; i++ { + seqHead, err = seqEngCl.PayloadByNumber(t.Ctx(), uint64(i)) + require.NoError(t, err) + verifier.ActL2UnsafeGossipReceive(seqHead)(t) + } + verifier.ActL2PipelineFull(t) + + // Verify that the unsafe blocks are there now + // This was failing prior to PR 9661 because op-node would attempt to immediately insert blocks into the EL inside the engine queue. op-geth + // would not be able to fetch the second range of blocks & it would wipe out the unsafe payloads queue because op-node thought that it had a + // higher unsafe block but op-geth did not. + VerifyBlock(t, verifier.Eng, 22, eth.Unsafe) + + // Create 1 more block & batch submit everything + BatchSubmitBlock(t, miner, sequencer, verifier, batcher, dp, 12) + + // Verify that the batch submitted blocks are there now + VerifyBlock(t, sequencer.Eng, 23, eth.Safe) + VerifyBlock(t, verifier.Eng, 23, eth.Safe) +} + +func TestELSyncTransitionsToCLSyncAfterNodeRestart(gt *testing.T) { + t := actionsHelpers.NewDefaultTesting(gt) + dp := e2eutils.MakeDeployParams(t, actionsHelpers.DefaultRollupTestParams) + sd := e2eutils.Setup(t, dp, actionsHelpers.DefaultAlloc) + logger := testlog.Logger(t, log.LevelInfo) + + captureLog, captureLogHandler := testlog.CaptureLogger(t, log.LevelInfo) + + miner, seqEng, sequencer := actionsHelpers.SetupSequencerTest(t, sd, logger) + batcher := actionsHelpers.NewL2Batcher(logger, sd.RollupCfg, actionsHelpers.DefaultBatcherCfg(dp), sequencer.RollupClient(), miner.EthClient(), seqEng.EthClient(), seqEng.EngineClient(t, sd.RollupCfg)) + // Enable engine P2P sync + verEng, verifier := actionsHelpers.SetupVerifier(t, sd, captureLog, miner.L1Client(t, sd.RollupCfg), miner.BlobStore(), &sync.Config{SyncMode: sync.ELSync}) + + seqEngCl, err := sources.NewEngineClient(seqEng.RPCClient(), logger, nil, sources.EngineClientDefaultConfig(sd.RollupCfg)) + require.NoError(t, err) + + PrepareELSyncedNode(t, miner, sequencer, seqEng, verifier, verEng, seqEngCl, batcher, dp) + + // Create a new verifier which is essentially a new op-node with the sync mode of ELSync and default geth engine kind. + verifier = actionsHelpers.NewL2Verifier(t, captureLog, miner.L1Client(t, sd.RollupCfg), miner.BlobStore(), altda.Disabled, verifier.Eng, sd.RollupCfg, &sync.Config{SyncMode: sync.ELSync}, actionsHelpers.DefaultVerifierCfg().SafeHeadListener, nil) + + // Build another 10 L1 blocks on the sequencer + for i := 0; i < 10; i++ { + // Build a L2 block + sequencer.ActL2StartBlock(t) + sequencer.ActL2EndBlock(t) + } + + // Insert new block to the engine and kick off a CL sync + seqHead, err := seqEngCl.PayloadByLabel(t.Ctx(), eth.Unsafe) + require.NoError(t, err) + verifier.ActL2InsertUnsafePayload(seqHead)(t) + + // Verify that the derivation pipeline did not request a sync to the new head. This is the core of the test, but a little fragile. + record := captureLogHandler.FindLog(testlog.NewMessageFilter("Forkchoice requested sync to new head"), testlog.NewAttributesFilter("number", "22")) + require.Nil(t, record, "The verifier should not request to sync to block number 22 because it is in CL mode, not EL mode at this point.") + + // Verify that op-node has skipped ELSync and started CL sync because geth has finalized block from ELSync. + record = captureLogHandler.FindLog(testlog.NewMessageFilter("Skipping EL sync and going straight to CL sync because there is a finalized block")) + require.NotNil(t, record, "The verifier should skip EL Sync at this point.") +} + +func TestForcedELSyncCLAfterNodeRestart(gt *testing.T) { + t := actionsHelpers.NewDefaultTesting(gt) + dp := e2eutils.MakeDeployParams(t, actionsHelpers.DefaultRollupTestParams) + sd := e2eutils.Setup(t, dp, actionsHelpers.DefaultAlloc) + logger := testlog.Logger(t, log.LevelInfo) + + captureLog, captureLogHandler := testlog.CaptureLogger(t, log.LevelInfo) + + miner, seqEng, sequencer := actionsHelpers.SetupSequencerTest(t, sd, logger) + batcher := actionsHelpers.NewL2Batcher(logger, sd.RollupCfg, actionsHelpers.DefaultBatcherCfg(dp), sequencer.RollupClient(), miner.EthClient(), seqEng.EthClient(), seqEng.EngineClient(t, sd.RollupCfg)) + // Enable engine P2P sync + verEng, verifier := actionsHelpers.SetupVerifier(t, sd, captureLog, miner.L1Client(t, sd.RollupCfg), miner.BlobStore(), &sync.Config{SyncMode: sync.ELSync}) + + seqEngCl, err := sources.NewEngineClient(seqEng.RPCClient(), logger, nil, sources.EngineClientDefaultConfig(sd.RollupCfg)) + require.NoError(t, err) + + PrepareELSyncedNode(t, miner, sequencer, seqEng, verifier, verEng, seqEngCl, batcher, dp) + + // Create a new verifier which is essentially a new op-node with the sync mode of ELSync and erigon engine kind. + verifier2 := actionsHelpers.NewL2Verifier(t, captureLog, miner.L1Client(t, sd.RollupCfg), miner.BlobStore(), altda.Disabled, verifier.Eng, sd.RollupCfg, &sync.Config{SyncMode: sync.ELSync, SupportsPostFinalizationELSync: true}, actionsHelpers.DefaultVerifierCfg().SafeHeadListener, nil) + + // Build another 10 L1 blocks on the sequencer + for i := 0; i < 10; i++ { + // Build a L2 block + sequencer.ActL2StartBlock(t) + sequencer.ActL2EndBlock(t) + } + + // Insert it on the verifier and kick off EL sync. + // Syncing doesn't actually work in test, + // but we can validate the engine is starting EL sync through p2p + seqHead, err := seqEngCl.PayloadByLabel(t.Ctx(), eth.Unsafe) + require.NoError(t, err) + verifier2.ActL2InsertUnsafePayload(seqHead)(t) + + // Verify that the derivation pipeline did not request a sync to the new head. This is the core of the test, but a little fragile. + record := captureLogHandler.FindLog(testlog.NewMessageFilter("Forkchoice requested sync to new head"), testlog.NewAttributesFilter("number", "22")) + require.NotNil(t, record, "The verifier should request to sync to block number 22 in EL mode") + + // Verify that op-node is starting ELSync. + record = captureLogHandler.FindLog(testlog.NewMessageFilter("Skipping EL sync and going straight to CL sync because there is a finalized block")) + require.Nil(t, record, "The verifier should start EL Sync when l2.engineKind is not geth") + record = captureLogHandler.FindLog(testlog.NewMessageFilter("Starting EL sync")) + require.NotNil(t, record, "The verifier should start EL Sync when l2.engineKind is not geth") +} + +func TestInvalidPayloadInSpanBatch(gt *testing.T) { + t := actionsHelpers.NewDefaultTesting(gt) + dp := e2eutils.MakeDeployParams(t, actionsHelpers.DefaultRollupTestParams) + minTs := hexutil.Uint64(0) + // Activate Delta hardfork + upgradesHelpers.ApplyDeltaTimeOffset(dp, &minTs) + dp.DeployConfig.L2BlockTime = 2 + sd := e2eutils.Setup(t, dp, actionsHelpers.DefaultAlloc) + log := testlog.Logger(t, log.LevelInfo) + _, _, miner, sequencer, seqEng, verifier, _, batcher := actionsHelpers.SetupReorgTestActors(t, dp, sd, log) + l2Cl := seqEng.EthClient() + rng := rand.New(rand.NewSource(1234)) + signer := types.LatestSigner(sd.L2Cfg.Config) + + sequencer.ActL2PipelineFull(t) + verifier.ActL2PipelineFull(t) + + channelOut := newSpanChannelOut(t, *sd) + + // Create block A1 ~ A12 for L1 block #0 ~ #2 + miner.ActEmptyBlock(t) + miner.ActEmptyBlock(t) + sequencer.ActL1HeadSignal(t) + sequencer.ActBuildToL1HeadUnsafe(t) + + for i := uint64(1); i <= sequencer.L2Unsafe().Number; i++ { + block, err := l2Cl.BlockByNumber(t.Ctx(), new(big.Int).SetUint64(i)) + require.NoError(t, err) + if i == 8 { + // Make block A8 as an invalid block + invalidTx := testutils.RandomTx(rng, big.NewInt(100), signer) + block = block.WithBody(types.Body{Transactions: []*types.Transaction{block.Transactions()[0], invalidTx}}) + } + // Add A1 ~ A12 into the channel + err = channelOut.AddBlock(sd.RollupCfg, block) + require.NoError(t, err) + } + + // Submit span batch(A1, ..., A7, invalid A8, A9, ..., A12) + batcher.L2ChannelOut = channelOut + batcher.ActL2ChannelClose(t) + batcher.ActL2BatchSubmit(t) + + miner.ActL1StartBlock(12)(t) + miner.ActL1IncludeTx(dp.Addresses.Batcher)(t) + miner.ActL1EndBlock(t) + miner.ActL1SafeNext(t) + miner.ActL1FinalizeNext(t) + + // After the verifier processed the span batch, only unsafe head should be advanced to A7. + // Safe head is not updated because the span batch is not fully processed. + verifier.ActL1HeadSignal(t) + verifier.ActL2PipelineFull(t) + require.Equal(t, verifier.L2Unsafe().Number, uint64(7)) + require.Equal(t, verifier.L2Safe().Number, uint64(0)) + + channelOut = newSpanChannelOut(t, *sd) + + for i := uint64(1); i <= sequencer.L2Unsafe().Number; i++ { + block, err := l2Cl.BlockByNumber(t.Ctx(), new(big.Int).SetUint64(i)) + require.NoError(t, err) + if i == 1 { + // Create valid TX + aliceNonce, err := seqEng.EthClient().PendingNonceAt(t.Ctx(), dp.Addresses.Alice) + require.NoError(t, err) + data := make([]byte, rand.Intn(100)) + gas, err := core.IntrinsicGas(data, nil, false, true, true, false) + require.NoError(t, err) + baseFee := seqEng.L2Chain().CurrentBlock().BaseFee + tx := types.MustSignNewTx(dp.Secrets.Alice, signer, &types.DynamicFeeTx{ + ChainID: sd.L2Cfg.Config.ChainID, + Nonce: aliceNonce, + GasTipCap: big.NewInt(2 * params.GWei), + GasFeeCap: new(big.Int).Add(new(big.Int).Mul(baseFee, big.NewInt(2)), big.NewInt(2*params.GWei)), + Gas: gas, + To: &dp.Addresses.Bob, + Value: big.NewInt(0), + Data: data, + }) + // Create valid new block B1 at the same height as A1 + block = block.WithBody(types.Body{Transactions: []*types.Transaction{block.Transactions()[0], tx}}) + } + // Add B1, A2 ~ A12 into the channel + err = channelOut.AddBlock(sd.RollupCfg, block) + require.NoError(t, err) + } + // Submit span batch(B1, A2, ... A12) + batcher.L2ChannelOut = channelOut + batcher.ActL2ChannelClose(t) + batcher.ActL2BatchSubmit(t) + + miner.ActL1StartBlock(12)(t) + miner.ActL1IncludeTx(dp.Addresses.Batcher)(t) + miner.ActL1EndBlock(t) + miner.ActL1SafeNext(t) + miner.ActL1FinalizeNext(t) + + verifier.ActL1HeadSignal(t) + verifier.ActL2PipelineFull(t) + + // verifier should advance its unsafe and safe head to the height of A12. + require.Equal(t, verifier.L2Unsafe().Number, uint64(12)) + require.Equal(t, verifier.L2Safe().Number, uint64(12)) +} + +func TestSpanBatchAtomicity_Consolidation(gt *testing.T) { + t := actionsHelpers.NewDefaultTesting(gt) + dp := e2eutils.MakeDeployParams(t, actionsHelpers.DefaultRollupTestParams) + minTs := hexutil.Uint64(0) + // Activate Delta hardfork + upgradesHelpers.ApplyDeltaTimeOffset(dp, &minTs) + dp.DeployConfig.L2BlockTime = 2 + sd := e2eutils.Setup(t, dp, actionsHelpers.DefaultAlloc) + log := testlog.Logger(t, log.LevelInfo) + _, _, miner, sequencer, seqEng, verifier, _, batcher := actionsHelpers.SetupReorgTestActors(t, dp, sd, log) + seqEngCl, err := sources.NewEngineClient(seqEng.RPCClient(), log, nil, sources.EngineClientDefaultConfig(sd.RollupCfg)) + require.NoError(t, err) + + targetHeadNumber := uint64(6) // L1 block time / L2 block time + + sequencer.ActL2PipelineFull(t) + verifier.ActL2PipelineFull(t) + + // Create 6 blocks + miner.ActEmptyBlock(t) + sequencer.ActL1HeadSignal(t) + sequencer.ActBuildToL1HeadUnsafe(t) + require.Equal(t, sequencer.L2Unsafe().Number, targetHeadNumber) + + // Gossip unsafe blocks to the verifier + for i := uint64(1); i <= sequencer.L2Unsafe().Number; i++ { + seqHead, err := seqEngCl.PayloadByNumber(t.Ctx(), i) + require.NoError(t, err) + verifier.ActL2UnsafeGossipReceive(seqHead)(t) + } + verifier.ActL2PipelineFull(t) + + // Check if the verifier's unsafe sync is done + require.Equal(t, sequencer.L2Unsafe().Hash, verifier.L2Unsafe().Hash) + + // Build and submit a span batch with 6 blocks + batcher.ActSubmitAll(t) + miner.ActL1StartBlock(12)(t) + miner.ActL1IncludeTx(dp.Addresses.Batcher)(t) + miner.ActL1EndBlock(t) + + // Start verifier safe sync + verifier.ActL1HeadSignal(t) + verifier.L2PipelineIdle = false + for !verifier.L2PipelineIdle { + // wait for next pending block + verifier.ActL2EventsUntil(t, func(ev event.Event) bool { + if event.Is[engine2.SafeDerivedEvent](ev) { // safe updates should only happen once the pending-safe reaches the target. + t.Fatal("unexpected next safe update") + } + return event.Any(event.Is[engine2.PendingSafeUpdateEvent], event.Is[derive.DeriverIdleEvent])(ev) + }, 1000, false) + if verifier.L2PendingSafe().Number < targetHeadNumber { + // If the span batch is not fully processed, the safe head must not advance. + require.Equal(t, verifier.L2Safe().Number, uint64(0)) + } else { + // Make sure we do the post-processing of what safety updates might happen + // after the pending-safe event, before the next pending-safe event. + verifier.ActL2EventsUntil(t, event.Is[engine2.PendingSafeUpdateEvent], 100, true) + // Once the span batch is fully processed, the safe head must advance to the end of span batch. + require.Equal(t, verifier.L2Safe().Number, targetHeadNumber) + require.Equal(t, verifier.L2Safe(), verifier.L2PendingSafe()) + } + // The unsafe head must not be changed + require.Equal(t, verifier.L2Unsafe(), sequencer.L2Unsafe()) + } +} + +func TestSpanBatchAtomicity_ForceAdvance(gt *testing.T) { + t := actionsHelpers.NewDefaultTesting(gt) + dp := e2eutils.MakeDeployParams(t, actionsHelpers.DefaultRollupTestParams) + minTs := hexutil.Uint64(0) + // Activate Delta hardfork + upgradesHelpers.ApplyDeltaTimeOffset(dp, &minTs) + dp.DeployConfig.L2BlockTime = 2 + sd := e2eutils.Setup(t, dp, actionsHelpers.DefaultAlloc) + log := testlog.Logger(t, log.LevelInfo) + _, _, miner, sequencer, _, verifier, _, batcher := actionsHelpers.SetupReorgTestActors(t, dp, sd, log) + + targetHeadNumber := uint64(6) // L1 block time / L2 block time + + sequencer.ActL2PipelineFull(t) + verifier.ActL2PipelineFull(t) + require.Equal(t, verifier.L2Unsafe().Number, uint64(0)) + + // Create 6 blocks + miner.ActEmptyBlock(t) + sequencer.ActL1HeadSignal(t) + sequencer.ActBuildToL1HeadUnsafe(t) + require.Equal(t, sequencer.L2Unsafe().Number, targetHeadNumber) + + // Build and submit a span batch with 6 blocks + batcher.ActSubmitAll(t) + miner.ActL1StartBlock(12)(t) + miner.ActL1IncludeTx(dp.Addresses.Batcher)(t) + miner.ActL1EndBlock(t) + + // Start verifier safe sync + verifier.ActL1HeadSignal(t) + verifier.L2PipelineIdle = false + for !verifier.L2PipelineIdle { + // wait for next pending block + verifier.ActL2EventsUntil(t, func(ev event.Event) bool { + if event.Is[engine2.SafeDerivedEvent](ev) { // safe updates should only happen once the pending-safe reaches the target. + t.Fatal("unexpected next safe update") + } + return event.Any(event.Is[engine2.PendingSafeUpdateEvent], event.Is[derive.DeriverIdleEvent])(ev) + }, 1000, false) + if verifier.L2PendingSafe().Number < targetHeadNumber { + // If the span batch is not fully processed, the safe head must not advance. + require.Equal(t, verifier.L2Safe().Number, uint64(0)) + } else { + // Make sure we do the post-processing of what safety updates might happen + // after the pending-safe event, before the next pending-safe event. + verifier.ActL2EventsUntil(t, event.Is[engine2.PendingSafeUpdateEvent], 100, true) + // Once the span batch is fully processed, the safe head must advance to the end of span batch. + require.Equal(t, verifier.L2Safe().Number, targetHeadNumber) + require.Equal(t, verifier.L2Safe(), verifier.L2PendingSafe()) + } + // The unsafe head and the pending safe head must be the same + require.Equal(t, verifier.L2Unsafe(), verifier.L2PendingSafe()) + } +} diff --git a/op-e2e/actions/sync_test.go b/op-e2e/actions/sync_test.go deleted file mode 100644 index e7521bdd8c94..000000000000 --- a/op-e2e/actions/sync_test.go +++ /dev/null @@ -1,1042 +0,0 @@ -package actions - -import ( - "errors" - "math/big" - "math/rand" - "testing" - "time" - - "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" - "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-optimism/optimism/op-service/testutils" - - "github.com/ethereum/go-ethereum" - "github.com/ethereum/go-ethereum/beacon/engine" - "github.com/ethereum/go-ethereum/common/hexutil" - "github.com/ethereum/go-ethereum/core" - "github.com/ethereum/go-ethereum/core/types" - "github.com/ethereum/go-ethereum/log" - "github.com/ethereum/go-ethereum/params" - "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 { - name string - f func(gt *testing.T, deltaTimeOffset *hexutil.Uint64) - }{ - {"DerivationWithFlakyL1RPC", DerivationWithFlakyL1RPC}, - {"FinalizeWhileSyncing", FinalizeWhileSyncing}, - } - for _, test := range tests { - test := test - t.Run(test.name+"_SingularBatch", func(t *testing.T) { - test.f(t, nil) - }) - } - - deltaTimeOffset := hexutil.Uint64(0) - for _, test := range tests { - test := test - t.Run(test.name+"_SpanBatch", func(t *testing.T) { - test.f(t, &deltaTimeOffset) - }) - } -} - -func DerivationWithFlakyL1RPC(gt *testing.T, deltaTimeOffset *hexutil.Uint64) { - t := NewDefaultTesting(gt) - dp := e2eutils.MakeDeployParams(t, defaultRollupTestParams) - dp.DeployConfig.L2GenesisDeltaTimeOffset = deltaTimeOffset - sd := e2eutils.Setup(t, dp, defaultAlloc) - log := testlog.Logger(t, log.LevelError) // mute all the temporary derivation errors that we forcefully create - _, _, miner, sequencer, _, verifier, _, batcher := setupReorgTestActors(t, dp, sd, log) - - rng := rand.New(rand.NewSource(1234)) - sequencer.ActL2PipelineFull(t) - verifier.ActL2PipelineFull(t) - - // build a L1 chain with 20 blocks and matching L2 chain and batches to test some derivation work - miner.ActEmptyBlock(t) - for i := 0; i < 20; i++ { - sequencer.ActL1HeadSignal(t) - sequencer.ActL2PipelineFull(t) - sequencer.ActBuildToL1Head(t) - batcher.ActSubmitAll(t) - miner.ActL1StartBlock(12)(t) - miner.ActL1IncludeTx(batcher.batcherAddr)(t) - miner.ActL1EndBlock(t) - } - // Make verifier aware of head - verifier.ActL1HeadSignal(t) - - // Now make the L1 RPC very flaky: requests will randomly fail with 50% chance - miner.MockL1RPCErrors(func() error { - if rng.Intn(2) == 0 { - return errors.New("mock rpc error") - } - return nil - }) - - // And sync the verifier - verifier.ActL2PipelineFull(t) - // Verifier should be synced, even though it hit lots of temporary L1 RPC errors - require.Equal(t, sequencer.L2Unsafe(), verifier.L2Safe(), "verifier is synced") -} - -func FinalizeWhileSyncing(gt *testing.T, deltaTimeOffset *hexutil.Uint64) { - t := NewDefaultTesting(gt) - dp := e2eutils.MakeDeployParams(t, defaultRollupTestParams) - dp.DeployConfig.L2GenesisDeltaTimeOffset = deltaTimeOffset - sd := e2eutils.Setup(t, dp, defaultAlloc) - log := testlog.Logger(t, log.LevelError) // mute all the temporary derivation errors that we forcefully create - _, _, miner, sequencer, _, verifier, _, batcher := setupReorgTestActors(t, dp, sd, log) - - sequencer.ActL2PipelineFull(t) - verifier.ActL2PipelineFull(t) - - verifierStartStatus := verifier.SyncStatus() - - // Build an L1 chain with 64 + 1 blocks, containing batches of L2 chain. - // Enough to go past the finalityDelay of the engine queue, - // to make the verifier finalize while it syncs. - miner.ActEmptyBlock(t) - for i := 0; i < 64+1; i++ { - sequencer.ActL1HeadSignal(t) - sequencer.ActL2PipelineFull(t) - sequencer.ActBuildToL1Head(t) - batcher.ActSubmitAll(t) - miner.ActL1StartBlock(12)(t) - miner.ActL1IncludeTx(batcher.batcherAddr)(t) - miner.ActL1EndBlock(t) - } - l1Head := miner.l1Chain.CurrentHeader() - // finalize all of L1 - miner.ActL1Safe(t, l1Head.Number.Uint64()) - miner.ActL1Finalize(t, l1Head.Number.Uint64()) - - // Now signal L1 finality to the verifier, while the verifier is not synced. - verifier.ActL1HeadSignal(t) - verifier.ActL1SafeSignal(t) - verifier.ActL1FinalizedSignal(t) - - // Now sync the verifier, without repeating the signal. - // While it's syncing, it should finalize on interval now, based on the future L1 finalized block it remembered. - verifier.ActL2PipelineFull(t) - - // Verify the verifier finalized something new - require.Less(t, verifierStartStatus.FinalizedL2.Number, verifier.SyncStatus().FinalizedL2.Number, "verifier finalized L2 blocks during sync") -} - -// TestUnsafeSync tests that a verifier properly imports unsafe blocks via gossip. -func TestUnsafeSync(gt *testing.T) { - t := NewDefaultTesting(gt) - dp := e2eutils.MakeDeployParams(t, defaultRollupTestParams) - sd := e2eutils.Setup(t, dp, defaultAlloc) - log := testlog.Logger(t, log.LevelInfo) - - sd, _, _, sequencer, seqEng, verifier, _, _ := setupReorgTestActors(t, dp, sd, log) - seqEngCl, err := sources.NewEngineClient(seqEng.RPCClient(), log, nil, sources.EngineClientDefaultConfig(sd.RollupCfg)) - require.NoError(t, err) - - sequencer.ActL2PipelineFull(t) - verifier.ActL2PipelineFull(t) - - for i := 0; i < 10; i++ { - // Build a L2 block - sequencer.ActL2StartBlock(t) - sequencer.ActL2EndBlock(t) - // Notify new L2 block to verifier by unsafe gossip - seqHead, err := seqEngCl.PayloadByLabel(t.Ctx(), eth.Unsafe) - require.NoError(t, err) - verifier.ActL2UnsafeGossipReceive(seqHead)(t) - // Handle unsafe payload - verifier.ActL2PipelineFull(t) - // Verifier must advance its unsafe head. - require.Equal(t, sequencer.L2Unsafe().Hash, verifier.L2Unsafe().Hash) - } -} - -func TestBackupUnsafe(gt *testing.T) { - t := NewDefaultTesting(gt) - dp := e2eutils.MakeDeployParams(t, defaultRollupTestParams) - minTs := hexutil.Uint64(0) - // Activate Delta hardfork - dp.DeployConfig.L2GenesisDeltaTimeOffset = &minTs - dp.DeployConfig.L2BlockTime = 2 - sd := e2eutils.Setup(t, dp, defaultAlloc) - log := testlog.Logger(t, log.LvlInfo) - _, dp, miner, sequencer, seqEng, verifier, _, batcher := setupReorgTestActors(t, dp, sd, log) - l2Cl := seqEng.EthClient() - seqEngCl, err := sources.NewEngineClient(seqEng.RPCClient(), log, nil, sources.EngineClientDefaultConfig(sd.RollupCfg)) - require.NoError(t, err) - - rng := rand.New(rand.NewSource(1234)) - signer := types.LatestSigner(sd.L2Cfg.Config) - - sequencer.ActL2PipelineFull(t) - verifier.ActL2PipelineFull(t) - - // Create block A1 ~ A5 - for i := 0; i < 5; i++ { - // Build a L2 block - sequencer.ActL2StartBlock(t) - sequencer.ActL2EndBlock(t) - - // Notify new L2 block to verifier by unsafe gossip - seqHead, err := seqEngCl.PayloadByLabel(t.Ctx(), eth.Unsafe) - require.NoError(t, err) - verifier.ActL2UnsafeGossipReceive(seqHead)(t) - } - - seqHead, err := seqEngCl.PayloadByLabel(t.Ctx(), eth.Unsafe) - require.NoError(t, err) - // eventually correct hash for A5 - targetUnsafeHeadHash := seqHead.ExecutionPayload.BlockHash - - // only advance unsafe head to A5 - require.Equal(t, sequencer.L2Unsafe().Number, uint64(5)) - require.Equal(t, sequencer.L2Safe().Number, uint64(0)) - - // Handle unsafe payload - verifier.ActL2PipelineFull(t) - // only advance unsafe head to A5 - require.Equal(t, verifier.L2Unsafe().Number, uint64(5)) - require.Equal(t, verifier.L2Safe().Number, uint64(0)) - - channelOut := newSpanChannelOut(t, *sd) - - for i := uint64(1); i <= sequencer.L2Unsafe().Number; i++ { - block, err := l2Cl.BlockByNumber(t.Ctx(), new(big.Int).SetUint64(i)) - require.NoError(t, err) - if i == 2 { - // Make block B2 as an valid block different with unsafe block - // Alice makes a L2 tx - n, err := l2Cl.PendingNonceAt(t.Ctx(), dp.Addresses.Alice) - require.NoError(t, err) - validTx := types.MustSignNewTx(dp.Secrets.Alice, signer, &types.DynamicFeeTx{ - ChainID: sd.L2Cfg.Config.ChainID, - Nonce: n, - GasTipCap: big.NewInt(2 * params.GWei), - GasFeeCap: new(big.Int).Add(miner.l1Chain.CurrentBlock().BaseFee, big.NewInt(2*params.GWei)), - Gas: params.TxGas, - To: &dp.Addresses.Bob, - Value: e2eutils.Ether(2), - }) - block = block.WithBody([]*types.Transaction{block.Transactions()[0], validTx}, []*types.Header{}) - } - if i == 3 { - // Make block B3 as an invalid block - invalidTx := testutils.RandomTx(rng, big.NewInt(100), signer) - 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) - require.NoError(t, err) - } - - // Submit span batch(A1, B2, invalid B3, B4, B5) - batcher.l2ChannelOut = channelOut - batcher.ActL2ChannelClose(t) - batcher.ActL2BatchSubmit(t) - - miner.ActL1StartBlock(12)(t) - miner.ActL1IncludeTx(dp.Addresses.Batcher)(t) - miner.ActL1EndBlock(t) - - // let sequencer process invalid span batch - sequencer.ActL1HeadSignal(t) - // before stepping, make sure backupUnsafe is empty - require.Equal(t, eth.L2BlockRef{}, sequencer.L2BackupUnsafe()) - // pendingSafe must not be advanced as well - require.Equal(t, sequencer.L2PendingSafe().Number, uint64(0)) - // Preheat engine queue and consume A1 from batch - for i := 0; i < 4; i++ { - sequencer.ActL2PipelineStep(t) - } - // A1 is valid original block so pendingSafe is advanced - require.Equal(t, sequencer.L2PendingSafe().Number, uint64(1)) - require.Equal(t, sequencer.L2Unsafe().Number, uint64(5)) - // backupUnsafe is still empty - require.Equal(t, eth.L2BlockRef{}, sequencer.L2BackupUnsafe()) - - // Process B2 - sequencer.ActL2PipelineStep(t) - sequencer.ActL2PipelineStep(t) - // B2 is valid different block, triggering unsafe chain reorg - require.Equal(t, sequencer.L2Unsafe().Number, uint64(2)) - // B2 is valid different block, triggering unsafe block backup - require.Equal(t, targetUnsafeHeadHash, sequencer.L2BackupUnsafe().Hash) - // B2 is valid different block, so pendingSafe is advanced - require.Equal(t, sequencer.L2PendingSafe().Number, uint64(2)) - // try to process invalid leftovers: B3, B4, B5 - sequencer.ActL2PipelineFull(t) - // backupUnsafe is used because A3 is invalid. Check backupUnsafe is emptied after used - require.Equal(t, eth.L2BlockRef{}, sequencer.L2BackupUnsafe()) - - // check pendingSafe is reset - require.Equal(t, sequencer.L2PendingSafe().Number, uint64(0)) - // check backupUnsafe is applied - require.Equal(t, sequencer.L2Unsafe().Hash, targetUnsafeHeadHash) - require.Equal(t, sequencer.L2Unsafe().Number, uint64(5)) - // safe head cannot be advanced because batch contained invalid blocks - require.Equal(t, sequencer.L2Safe().Number, uint64(0)) - - // let verifier process invalid span batch - verifier.ActL1HeadSignal(t) - verifier.ActL2PipelineFull(t) - - // safe head cannot be advanced, while unsafe head not changed - require.Equal(t, verifier.L2Unsafe().Number, uint64(5)) - require.Equal(t, verifier.L2Safe().Number, uint64(0)) - require.Equal(t, verifier.L2Unsafe().Hash, targetUnsafeHeadHash) - - // Build and submit a span batch with A1 ~ A5 - batcher.ActSubmitAll(t) - miner.ActL1StartBlock(12)(t) - miner.ActL1IncludeTx(dp.Addresses.Batcher)(t) - miner.ActL1EndBlock(t) - - // let sequencer process valid span batch - sequencer.ActL1HeadSignal(t) - sequencer.ActL2PipelineFull(t) - - // safe/unsafe head must be advanced - require.Equal(t, sequencer.L2Unsafe().Number, uint64(5)) - require.Equal(t, sequencer.L2Safe().Number, uint64(5)) - require.Equal(t, sequencer.L2Safe().Hash, targetUnsafeHeadHash) - // check backupUnsafe is emptied after consolidation - require.Equal(t, eth.L2BlockRef{}, sequencer.L2BackupUnsafe()) - - // let verifier process valid span batch - verifier.ActL1HeadSignal(t) - verifier.ActL2PipelineFull(t) - - // safe and unsafe head must be advanced - require.Equal(t, verifier.L2Unsafe().Number, uint64(5)) - require.Equal(t, verifier.L2Safe().Number, uint64(5)) - require.Equal(t, verifier.L2Safe().Hash, targetUnsafeHeadHash) - // check backupUnsafe is emptied after consolidation - require.Equal(t, eth.L2BlockRef{}, verifier.L2BackupUnsafe()) -} - -func TestBackupUnsafeReorgForkChoiceInputError(gt *testing.T) { - t := NewDefaultTesting(gt) - dp := e2eutils.MakeDeployParams(t, defaultRollupTestParams) - minTs := hexutil.Uint64(0) - // Activate Delta hardfork - dp.DeployConfig.L2GenesisDeltaTimeOffset = &minTs - dp.DeployConfig.L2BlockTime = 2 - sd := e2eutils.Setup(t, dp, defaultAlloc) - log := testlog.Logger(t, log.LvlInfo) - _, dp, miner, sequencer, seqEng, verifier, _, batcher := setupReorgTestActors(t, dp, sd, log) - l2Cl := seqEng.EthClient() - seqEngCl, err := sources.NewEngineClient(seqEng.RPCClient(), log, nil, sources.EngineClientDefaultConfig(sd.RollupCfg)) - require.NoError(t, err) - - rng := rand.New(rand.NewSource(1234)) - signer := types.LatestSigner(sd.L2Cfg.Config) - - sequencer.ActL2PipelineFull(t) - verifier.ActL2PipelineFull(t) - - // Create block A1 ~ A5 - for i := 0; i < 5; i++ { - // Build a L2 block - sequencer.ActL2StartBlock(t) - sequencer.ActL2EndBlock(t) - - // Notify new L2 block to verifier by unsafe gossip - seqHead, err := seqEngCl.PayloadByLabel(t.Ctx(), eth.Unsafe) - require.NoError(t, err) - verifier.ActL2UnsafeGossipReceive(seqHead)(t) - } - - seqHead, err := seqEngCl.PayloadByLabel(t.Ctx(), eth.Unsafe) - require.NoError(t, err) - // eventually correct hash for A5 - targetUnsafeHeadHash := seqHead.ExecutionPayload.BlockHash - - // only advance unsafe head to A5 - require.Equal(t, sequencer.L2Unsafe().Number, uint64(5)) - require.Equal(t, sequencer.L2Safe().Number, uint64(0)) - - // Handle unsafe payload - verifier.ActL2PipelineFull(t) - // only advance unsafe head to A5 - require.Equal(t, verifier.L2Unsafe().Number, uint64(5)) - require.Equal(t, verifier.L2Safe().Number, uint64(0)) - - channelOut := newSpanChannelOut(t, *sd) - - for i := uint64(1); i <= sequencer.L2Unsafe().Number; i++ { - block, err := l2Cl.BlockByNumber(t.Ctx(), new(big.Int).SetUint64(i)) - require.NoError(t, err) - if i == 2 { - // Make block B2 as an valid block different with unsafe block - // Alice makes a L2 tx - n, err := l2Cl.PendingNonceAt(t.Ctx(), dp.Addresses.Alice) - require.NoError(t, err) - validTx := types.MustSignNewTx(dp.Secrets.Alice, signer, &types.DynamicFeeTx{ - ChainID: sd.L2Cfg.Config.ChainID, - Nonce: n, - GasTipCap: big.NewInt(2 * params.GWei), - GasFeeCap: new(big.Int).Add(miner.l1Chain.CurrentBlock().BaseFee, big.NewInt(2*params.GWei)), - Gas: params.TxGas, - To: &dp.Addresses.Bob, - Value: e2eutils.Ether(2), - }) - block = block.WithBody([]*types.Transaction{block.Transactions()[0], validTx}, []*types.Header{}) - } - if i == 3 { - // Make block B3 as an invalid block - invalidTx := testutils.RandomTx(rng, big.NewInt(100), signer) - 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) - require.NoError(t, err) - } - - // Submit span batch(A1, B2, invalid B3, B4, B5) - batcher.l2ChannelOut = channelOut - batcher.ActL2ChannelClose(t) - batcher.ActL2BatchSubmit(t) - - miner.ActL1StartBlock(12)(t) - miner.ActL1IncludeTx(dp.Addresses.Batcher)(t) - miner.ActL1EndBlock(t) - - // let sequencer process invalid span batch - sequencer.ActL1HeadSignal(t) - // before stepping, make sure backupUnsafe is empty - require.Equal(t, eth.L2BlockRef{}, sequencer.L2BackupUnsafe()) - // pendingSafe must not be advanced as well - require.Equal(t, sequencer.L2PendingSafe().Number, uint64(0)) - // Preheat engine queue and consume A1 from batch - for i := 0; i < 4; i++ { - sequencer.ActL2PipelineStep(t) - } - // A1 is valid original block so pendingSafe is advanced - require.Equal(t, sequencer.L2PendingSafe().Number, uint64(1)) - require.Equal(t, sequencer.L2Unsafe().Number, uint64(5)) - // backupUnsafe is still empty - require.Equal(t, eth.L2BlockRef{}, sequencer.L2BackupUnsafe()) - - // Process B2 - sequencer.ActL2PipelineStep(t) - sequencer.ActL2PipelineStep(t) - // B2 is valid different block, triggering unsafe chain reorg - require.Equal(t, sequencer.L2Unsafe().Number, uint64(2)) - // B2 is valid different block, triggering unsafe block backup - require.Equal(t, targetUnsafeHeadHash, sequencer.L2BackupUnsafe().Hash) - // B2 is valid different block, so pendingSafe is advanced - require.Equal(t, sequencer.L2PendingSafe().Number, uint64(2)) - - // B3 is invalid block - // NextAttributes is called - sequencer.ActL2PipelineStep(t) - // forceNextSafeAttributes is called - sequencer.ActL2PipelineStep(t) - // mock forkChoiceUpdate error while restoring previous unsafe chain using backupUnsafe. - seqEng.ActL2RPCFail(t, eth.InputError{Inner: errors.New("mock L2 RPC error"), Code: eth.InvalidForkchoiceState}) - - // TryBackupUnsafeReorg is called - sequencer.ActL2PipelineStep(t) - - // try to process invalid leftovers: B4, B5 - sequencer.ActL2PipelineFull(t) - - // backupUnsafe is not used because forkChoiceUpdate returned an error. - // Check backupUnsafe is emptied. - require.Equal(t, eth.L2BlockRef{}, sequencer.L2BackupUnsafe()) - - // check pendingSafe is reset - require.Equal(t, sequencer.L2PendingSafe().Number, uint64(0)) - // unsafe head is not restored due to forkchoiceUpdate error in TryBackupUnsafeReorg - require.Equal(t, sequencer.L2Unsafe().Number, uint64(2)) - // safe head cannot be advanced because batch contained invalid blocks - require.Equal(t, sequencer.L2Safe().Number, uint64(0)) -} - -func TestBackupUnsafeReorgForkChoiceNotInputError(gt *testing.T) { - t := NewDefaultTesting(gt) - dp := e2eutils.MakeDeployParams(t, defaultRollupTestParams) - minTs := hexutil.Uint64(0) - // Activate Delta hardfork - dp.DeployConfig.L2GenesisDeltaTimeOffset = &minTs - dp.DeployConfig.L2BlockTime = 2 - sd := e2eutils.Setup(t, dp, defaultAlloc) - log := testlog.Logger(t, log.LvlInfo) - _, dp, miner, sequencer, seqEng, verifier, _, batcher := setupReorgTestActors(t, dp, sd, log) - l2Cl := seqEng.EthClient() - seqEngCl, err := sources.NewEngineClient(seqEng.RPCClient(), log, nil, sources.EngineClientDefaultConfig(sd.RollupCfg)) - require.NoError(t, err) - - rng := rand.New(rand.NewSource(1234)) - signer := types.LatestSigner(sd.L2Cfg.Config) - - sequencer.ActL2PipelineFull(t) - verifier.ActL2PipelineFull(t) - - // Create block A1 ~ A5 - for i := 0; i < 5; i++ { - // Build a L2 block - sequencer.ActL2StartBlock(t) - sequencer.ActL2EndBlock(t) - - // Notify new L2 block to verifier by unsafe gossip - seqHead, err := seqEngCl.PayloadByLabel(t.Ctx(), eth.Unsafe) - require.NoError(t, err) - verifier.ActL2UnsafeGossipReceive(seqHead)(t) - } - - seqHead, err := seqEngCl.PayloadByLabel(t.Ctx(), eth.Unsafe) - require.NoError(t, err) - // eventually correct hash for A5 - targetUnsafeHeadHash := seqHead.ExecutionPayload.BlockHash - - // only advance unsafe head to A5 - require.Equal(t, sequencer.L2Unsafe().Number, uint64(5)) - require.Equal(t, sequencer.L2Safe().Number, uint64(0)) - - // Handle unsafe payload - verifier.ActL2PipelineFull(t) - // only advance unsafe head to A5 - require.Equal(t, verifier.L2Unsafe().Number, uint64(5)) - require.Equal(t, verifier.L2Safe().Number, uint64(0)) - - channelOut := newSpanChannelOut(t, *sd) - - for i := uint64(1); i <= sequencer.L2Unsafe().Number; i++ { - block, err := l2Cl.BlockByNumber(t.Ctx(), new(big.Int).SetUint64(i)) - require.NoError(t, err) - if i == 2 { - // Make block B2 as an valid block different with unsafe block - // Alice makes a L2 tx - n, err := l2Cl.PendingNonceAt(t.Ctx(), dp.Addresses.Alice) - require.NoError(t, err) - validTx := types.MustSignNewTx(dp.Secrets.Alice, signer, &types.DynamicFeeTx{ - ChainID: sd.L2Cfg.Config.ChainID, - Nonce: n, - GasTipCap: big.NewInt(2 * params.GWei), - GasFeeCap: new(big.Int).Add(miner.l1Chain.CurrentBlock().BaseFee, big.NewInt(2*params.GWei)), - Gas: params.TxGas, - To: &dp.Addresses.Bob, - Value: e2eutils.Ether(2), - }) - block = block.WithBody([]*types.Transaction{block.Transactions()[0], validTx}, []*types.Header{}) - } - if i == 3 { - // Make block B3 as an invalid block - invalidTx := testutils.RandomTx(rng, big.NewInt(100), signer) - 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) - require.NoError(t, err) - } - - // Submit span batch(A1, B2, invalid B3, B4, B5) - batcher.l2ChannelOut = channelOut - batcher.ActL2ChannelClose(t) - batcher.ActL2BatchSubmit(t) - - miner.ActL1StartBlock(12)(t) - miner.ActL1IncludeTx(dp.Addresses.Batcher)(t) - miner.ActL1EndBlock(t) - - // let sequencer process invalid span batch - sequencer.ActL1HeadSignal(t) - // before stepping, make sure backupUnsafe is empty - require.Equal(t, eth.L2BlockRef{}, sequencer.L2BackupUnsafe()) - // pendingSafe must not be advanced as well - require.Equal(t, sequencer.L2PendingSafe().Number, uint64(0)) - // Preheat engine queue and consume A1 from batch - for i := 0; i < 4; i++ { - sequencer.ActL2PipelineStep(t) - } - // A1 is valid original block so pendingSafe is advanced - require.Equal(t, sequencer.L2PendingSafe().Number, uint64(1)) - require.Equal(t, sequencer.L2Unsafe().Number, uint64(5)) - // backupUnsafe is still empty - require.Equal(t, eth.L2BlockRef{}, sequencer.L2BackupUnsafe()) - - // Process B2 - sequencer.ActL2PipelineStep(t) - sequencer.ActL2PipelineStep(t) - // B2 is valid different block, triggering unsafe chain reorg - require.Equal(t, sequencer.L2Unsafe().Number, uint64(2)) - // B2 is valid different block, triggering unsafe block backup - require.Equal(t, targetUnsafeHeadHash, sequencer.L2BackupUnsafe().Hash) - // B2 is valid different block, so pendingSafe is advanced - require.Equal(t, sequencer.L2PendingSafe().Number, uint64(2)) - - // B3 is invalid block - // NextAttributes is called - sequencer.ActL2PipelineStep(t) - // forceNextSafeAttributes is called - sequencer.ActL2PipelineStep(t) - - serverErrCnt := 2 - for i := 0; i < serverErrCnt; i++ { - // mock forkChoiceUpdate failure while restoring previous unsafe chain using backupUnsafe. - seqEng.ActL2RPCFail(t, engine.GenericServerError) - // TryBackupUnsafeReorg is called - forkChoiceUpdate returns GenericServerError so retry - sequencer.ActL2PipelineStep(t) - // backupUnsafeHead not emptied yet - require.Equal(t, targetUnsafeHeadHash, sequencer.L2BackupUnsafe().Hash) - } - // now forkchoice succeeds - // try to process invalid leftovers: B4, B5 - sequencer.ActL2PipelineFull(t) - - // backupUnsafe is used because forkChoiceUpdate eventually succeeded. - // Check backupUnsafe is emptied. - require.Equal(t, eth.L2BlockRef{}, sequencer.L2BackupUnsafe()) - - // check pendingSafe is reset - require.Equal(t, sequencer.L2PendingSafe().Number, uint64(0)) - // check backupUnsafe is applied - require.Equal(t, sequencer.L2Unsafe().Hash, targetUnsafeHeadHash) - require.Equal(t, sequencer.L2Unsafe().Number, uint64(5)) - // safe head cannot be advanced because batch contained invalid blocks - require.Equal(t, sequencer.L2Safe().Number, uint64(0)) -} - -// TestELSync tests that a verifier will have the EL import the full chain from the sequencer -// when passed a single unsafe block. op-geth can either snap sync or full sync here. -func TestELSync(gt *testing.T) { - t := NewDefaultTesting(gt) - dp := e2eutils.MakeDeployParams(t, defaultRollupTestParams) - sd := e2eutils.Setup(t, dp, defaultAlloc) - log := testlog.Logger(t, log.LevelInfo) - - miner, seqEng, sequencer := setupSequencerTest(t, sd, log) - // Enable engine P2P sync - verEng, verifier := setupVerifier(t, sd, log, miner.L1Client(t, sd.RollupCfg), miner.BlobStore(), &sync.Config{SyncMode: sync.ELSync}) - - seqEngCl, err := sources.NewEngineClient(seqEng.RPCClient(), log, nil, sources.EngineClientDefaultConfig(sd.RollupCfg)) - require.NoError(t, err) - - sequencer.ActL2PipelineFull(t) - - // Build 10 L1 blocks on the sequencer - for i := 0; i < 10; i++ { - // Build a L2 block - sequencer.ActL2StartBlock(t) - sequencer.ActL2EndBlock(t) - } - - // Wait longer to peer. This tests flakes or takes a long time when the op-geth instances are not able to peer. - verEng.AddPeers(seqEng.Enode()) - - // Insert it on the verifier - seqHead, err := seqEngCl.PayloadByLabel(t.Ctx(), eth.Unsafe) - require.NoError(t, err) - seqStart, err := seqEngCl.PayloadByNumber(t.Ctx(), 1) - require.NoError(t, err) - verifier.ActL2InsertUnsafePayload(seqHead)(t) - - require.Eventually(t, - func() bool { - return seqEng.PeerCount() > 0 && verEng.PeerCount() > 0 - }, - 120*time.Second, 1500*time.Millisecond, - "Sequencer & Verifier must peer with each other for snap sync to work", - ) - - // Expect snap sync to download & execute the entire chain - // Verify this by checking that the verifier has the correct value for block 1 - require.Eventually(t, - func() bool { - block, err := verifier.eng.L2BlockRefByNumber(t.Ctx(), 1) - if err != nil { - return false - } - return seqStart.ExecutionPayload.BlockHash == block.Hash - }, - 60*time.Second, 1500*time.Millisecond, - "verifier did not snap sync", - ) -} - -// TestELSyncTransitionstoCL tests that a verifier which starts with EL sync can switch back to a proper CL sync. -// It takes a sequencer & verifier through the following: -// 1. Build 10 unsafe blocks on the sequencer -// 2. Snap sync those blocks to the verifier -// 3. Build & insert 1 unsafe block from the sequencer to the verifier to end snap sync -// 4. Batch submit everything -// 5. Build 10 more unsafe blocks on the sequencer -// 6. Gossip in the highest block to the verifier. **Expect that it does not snap sync** -// 7. Then gossip the rest of the blocks to the verifier. Once this is complete it should pick up all of the unsafe blocks. -// Prior to this PR, the test would fail at this point. -// 8. Create 1 more block & batch submit everything & assert that the verifier picked up those blocks -func TestELSyncTransitionstoCL(gt *testing.T) { - t := NewDefaultTesting(gt) - dp := e2eutils.MakeDeployParams(t, defaultRollupTestParams) - sd := e2eutils.Setup(t, dp, defaultAlloc) - logger := testlog.Logger(t, log.LevelInfo) - - captureLog, captureLogHandler := testlog.CaptureLogger(t, log.LevelInfo) - - miner, seqEng, sequencer := setupSequencerTest(t, sd, logger) - batcher := NewL2Batcher(logger, sd.RollupCfg, DefaultBatcherCfg(dp), sequencer.RollupClient(), miner.EthClient(), seqEng.EthClient(), seqEng.EngineClient(t, sd.RollupCfg)) - // Enable engine P2P sync - verEng, verifier := setupVerifier(t, sd, captureLog, miner.L1Client(t, sd.RollupCfg), miner.BlobStore(), &sync.Config{SyncMode: sync.ELSync}) - - seqEngCl, err := sources.NewEngineClient(seqEng.RPCClient(), logger, nil, sources.EngineClientDefaultConfig(sd.RollupCfg)) - require.NoError(t, err) - - miner.ActEmptyBlock(t) - sequencer.ActL2PipelineFull(t) - - // Build 10 L1 blocks on the sequencer - for i := 0; i < 10; i++ { - // Build a L2 block - sequencer.ActL2StartBlock(t) - sequencer.ActL2EndBlock(t) - } - - // Wait longer to peer. This tests flakes or takes a long time when the op-geth instances are not able to peer. - verEng.AddPeers(seqEng.Enode()) - - // Insert it on the verifier - seqHead, err := seqEngCl.PayloadByLabel(t.Ctx(), eth.Unsafe) - require.NoError(t, err) - seqStart, err := seqEngCl.PayloadByNumber(t.Ctx(), 1) - require.NoError(t, err) - verifier.ActL2InsertUnsafePayload(seqHead)(t) - - require.Eventually(t, - func() bool { - return seqEng.PeerCount() > 0 && verEng.PeerCount() > 0 - }, - 120*time.Second, 1500*time.Millisecond, - "Sequencer & Verifier must peer with each other for snap sync to work", - ) - - // Expect snap sync to download & execute the entire chain - // Verify this by checking that the verifier has the correct value for block 1 - require.Eventually(t, - func() bool { - block, err := verifier.eng.L2BlockRefByNumber(t.Ctx(), 1) - if err != nil { - return false - } - return seqStart.ExecutionPayload.BlockHash == block.Hash - }, - 60*time.Second, 1500*time.Millisecond, - "verifier did not snap sync", - ) - // Despite downloading the blocks, it has not finished finalizing - _, err = verifier.eng.L2BlockRefByLabel(t.Ctx(), "safe") - require.ErrorIs(t, err, ethereum.NotFound) - - // Insert a block on the verifier to end snap sync - sequencer.ActL2StartBlock(t) - sequencer.ActL2EndBlock(t) - seqHead, err = seqEngCl.PayloadByLabel(t.Ctx(), eth.Unsafe) - require.NoError(t, err) - verifier.ActL2InsertUnsafePayload(seqHead)(t) - - // Check that safe + finalized are there - id, err := verifier.eng.L2BlockRefByLabel(t.Ctx(), eth.Safe) - require.Equal(t, uint64(11), id.Number) - require.NoError(t, err) - id, err = verifier.eng.L2BlockRefByLabel(t.Ctx(), eth.Finalized) - require.Equal(t, uint64(11), id.Number) - require.NoError(t, err) - - // Batch submit everything - sequencer.ActL2StartBlock(t) - sequencer.ActL2EndBlock(t) - batcher.ActSubmitAll(t) - miner.ActL1StartBlock(12)(t) - miner.ActL1IncludeTx(dp.Addresses.Batcher)(t) - miner.ActL1EndBlock(t) - sequencer.ActL2PipelineFull(t) - verifier.ActL2PipelineFull(t) - - // Verify that the batch submitted blocks are there now - id, err = sequencer.eng.L2BlockRefByLabel(t.Ctx(), eth.Safe) - require.NoError(t, err) - require.Equal(t, uint64(12), id.Number) - id, err = verifier.eng.L2BlockRefByLabel(t.Ctx(), eth.Safe) - require.NoError(t, err) - require.Equal(t, uint64(12), id.Number) - - // Build another 10 L1 blocks on the sequencer - for i := 0; i < 10; i++ { - // Build a L2 block - sequencer.ActL2StartBlock(t) - sequencer.ActL2EndBlock(t) - } - - // Now pass payloads to the derivation pipeline - // This is a little hacky that we have to manually switch between InsertBlock - // and UnsafeGossipReceive in the tests - seqHead, err = seqEngCl.PayloadByLabel(t.Ctx(), eth.Unsafe) - require.NoError(t, err) - verifier.ActL2UnsafeGossipReceive(seqHead)(t) - verifier.ActL2PipelineFull(t) - // Verify that the derivation pipeline did not request a sync to the new head. This is the core of the test, but a little fragile. - record := captureLogHandler.FindLog(testlog.NewMessageFilter("Forkchoice requested sync to new head"), testlog.NewAttributesFilter("number", "22")) - require.Nil(t, record, "The verifier should not request to sync to block number 22 because it is in CL mode, not EL mode at this point.") - - for i := 13; i < 23; i++ { - seqHead, err = seqEngCl.PayloadByNumber(t.Ctx(), uint64(i)) - require.NoError(t, err) - verifier.ActL2UnsafeGossipReceive(seqHead)(t) - } - verifier.ActL2PipelineFull(t) - - // Verify that the unsafe blocks are there now - // This was failing prior to PR 9661 because op-node would attempt to immediately insert blocks into the EL inside the engine queue. op-geth - // would not be able to fetch the second range of blocks & it would wipe out the unsafe payloads queue because op-node thought that it had a - // higher unsafe block but op-geth did not. - id, err = verifier.eng.L2BlockRefByLabel(t.Ctx(), eth.Unsafe) - require.NoError(t, err) - require.Equal(t, uint64(22), id.Number) - - // Create 1 more block & batch submit everything - sequencer.ActL2StartBlock(t) - sequencer.ActL2EndBlock(t) - batcher.ActSubmitAll(t) - miner.ActL1StartBlock(12)(t) - miner.ActL1IncludeTx(dp.Addresses.Batcher)(t) - miner.ActL1EndBlock(t) - sequencer.ActL2PipelineFull(t) - verifier.ActL2PipelineFull(t) - - // Verify that the batch submitted blocks are there now - id, err = sequencer.eng.L2BlockRefByLabel(t.Ctx(), eth.Safe) - require.NoError(t, err) - require.Equal(t, uint64(23), id.Number) - id, err = verifier.eng.L2BlockRefByLabel(t.Ctx(), eth.Safe) - require.NoError(t, err) - require.Equal(t, uint64(23), id.Number) -} - -func TestInvalidPayloadInSpanBatch(gt *testing.T) { - t := NewDefaultTesting(gt) - dp := e2eutils.MakeDeployParams(t, defaultRollupTestParams) - minTs := hexutil.Uint64(0) - // Activate Delta hardfork - dp.DeployConfig.L2GenesisDeltaTimeOffset = &minTs - dp.DeployConfig.L2BlockTime = 2 - sd := e2eutils.Setup(t, dp, defaultAlloc) - log := testlog.Logger(t, log.LevelInfo) - _, _, miner, sequencer, seqEng, verifier, _, batcher := setupReorgTestActors(t, dp, sd, log) - l2Cl := seqEng.EthClient() - rng := rand.New(rand.NewSource(1234)) - signer := types.LatestSigner(sd.L2Cfg.Config) - - sequencer.ActL2PipelineFull(t) - verifier.ActL2PipelineFull(t) - - channelOut := newSpanChannelOut(t, *sd) - - // Create block A1 ~ A12 for L1 block #0 ~ #2 - miner.ActEmptyBlock(t) - miner.ActEmptyBlock(t) - sequencer.ActL1HeadSignal(t) - sequencer.ActBuildToL1HeadUnsafe(t) - - for i := uint64(1); i <= sequencer.L2Unsafe().Number; i++ { - block, err := l2Cl.BlockByNumber(t.Ctx(), new(big.Int).SetUint64(i)) - require.NoError(t, err) - if i == 8 { - // Make block A8 as an invalid block - invalidTx := testutils.RandomTx(rng, big.NewInt(100), signer) - block = block.WithBody([]*types.Transaction{block.Transactions()[0], invalidTx}, []*types.Header{}) - } - // Add A1 ~ A12 into the channel - err = channelOut.AddBlock(sd.RollupCfg, block) - require.NoError(t, err) - } - - // Submit span batch(A1, ..., A7, invalid A8, A9, ..., A12) - batcher.l2ChannelOut = channelOut - batcher.ActL2ChannelClose(t) - batcher.ActL2BatchSubmit(t) - - miner.ActL1StartBlock(12)(t) - miner.ActL1IncludeTx(dp.Addresses.Batcher)(t) - miner.ActL1EndBlock(t) - miner.ActL1SafeNext(t) - miner.ActL1FinalizeNext(t) - - // After the verifier processed the span batch, only unsafe head should be advanced to A7. - // Safe head is not updated because the span batch is not fully processed. - verifier.ActL1HeadSignal(t) - verifier.ActL2PipelineFull(t) - require.Equal(t, verifier.L2Unsafe().Number, uint64(7)) - require.Equal(t, verifier.L2Safe().Number, uint64(0)) - - channelOut = newSpanChannelOut(t, *sd) - - for i := uint64(1); i <= sequencer.L2Unsafe().Number; i++ { - block, err := l2Cl.BlockByNumber(t.Ctx(), new(big.Int).SetUint64(i)) - require.NoError(t, err) - if i == 1 { - // Create valid TX - aliceNonce, err := seqEng.EthClient().PendingNonceAt(t.Ctx(), dp.Addresses.Alice) - require.NoError(t, err) - data := make([]byte, rand.Intn(100)) - gas, err := core.IntrinsicGas(data, nil, false, true, true, false) - require.NoError(t, err) - baseFee := seqEng.l2Chain.CurrentBlock().BaseFee - tx := types.MustSignNewTx(dp.Secrets.Alice, signer, &types.DynamicFeeTx{ - ChainID: sd.L2Cfg.Config.ChainID, - Nonce: aliceNonce, - GasTipCap: big.NewInt(2 * params.GWei), - GasFeeCap: new(big.Int).Add(new(big.Int).Mul(baseFee, big.NewInt(2)), big.NewInt(2*params.GWei)), - Gas: gas, - To: &dp.Addresses.Bob, - Value: big.NewInt(0), - Data: data, - }) - // Create valid new block B1 at the same height as A1 - block = block.WithBody([]*types.Transaction{block.Transactions()[0], tx}, []*types.Header{}) - } - // Add B1, A2 ~ A12 into the channel - err = channelOut.AddBlock(sd.RollupCfg, block) - require.NoError(t, err) - } - // Submit span batch(B1, A2, ... A12) - batcher.l2ChannelOut = channelOut - batcher.ActL2ChannelClose(t) - batcher.ActL2BatchSubmit(t) - - miner.ActL1StartBlock(12)(t) - miner.ActL1IncludeTx(dp.Addresses.Batcher)(t) - miner.ActL1EndBlock(t) - miner.ActL1SafeNext(t) - miner.ActL1FinalizeNext(t) - - verifier.ActL1HeadSignal(t) - verifier.ActL2PipelineFull(t) - - // verifier should advance its unsafe and safe head to the height of A12. - require.Equal(t, verifier.L2Unsafe().Number, uint64(12)) - require.Equal(t, verifier.L2Safe().Number, uint64(12)) -} - -func TestSpanBatchAtomicity_Consolidation(gt *testing.T) { - t := NewDefaultTesting(gt) - dp := e2eutils.MakeDeployParams(t, defaultRollupTestParams) - minTs := hexutil.Uint64(0) - // Activate Delta hardfork - dp.DeployConfig.L2GenesisDeltaTimeOffset = &minTs - dp.DeployConfig.L2BlockTime = 2 - sd := e2eutils.Setup(t, dp, defaultAlloc) - log := testlog.Logger(t, log.LevelInfo) - _, _, miner, sequencer, seqEng, verifier, _, batcher := setupReorgTestActors(t, dp, sd, log) - seqEngCl, err := sources.NewEngineClient(seqEng.RPCClient(), log, nil, sources.EngineClientDefaultConfig(sd.RollupCfg)) - require.NoError(t, err) - - targetHeadNumber := uint64(6) // L1 block time / L2 block time - - sequencer.ActL2PipelineFull(t) - verifier.ActL2PipelineFull(t) - - // Create 6 blocks - miner.ActEmptyBlock(t) - sequencer.ActL1HeadSignal(t) - sequencer.ActBuildToL1HeadUnsafe(t) - require.Equal(t, sequencer.L2Unsafe().Number, targetHeadNumber) - - // Gossip unsafe blocks to the verifier - for i := uint64(1); i <= sequencer.L2Unsafe().Number; i++ { - seqHead, err := seqEngCl.PayloadByNumber(t.Ctx(), i) - require.NoError(t, err) - verifier.ActL2UnsafeGossipReceive(seqHead)(t) - } - verifier.ActL2PipelineFull(t) - - // Check if the verifier's unsafe sync is done - require.Equal(t, sequencer.L2Unsafe().Hash, verifier.L2Unsafe().Hash) - - // Build and submit a span batch with 6 blocks - batcher.ActSubmitAll(t) - miner.ActL1StartBlock(12)(t) - miner.ActL1IncludeTx(dp.Addresses.Batcher)(t) - miner.ActL1EndBlock(t) - - // Start verifier safe sync - verifier.ActL1HeadSignal(t) - verifier.l2PipelineIdle = false - for !verifier.l2PipelineIdle { - verifier.ActL2PipelineStep(t) - if verifier.L2PendingSafe().Number < targetHeadNumber { - // If the span batch is not fully processed, the safe head must not advance. - require.Equal(t, verifier.L2Safe().Number, uint64(0)) - } else { - // Once the span batch is fully processed, the safe head must advance to the end of span batch. - require.Equal(t, verifier.L2Safe().Number, targetHeadNumber) - require.Equal(t, verifier.L2Safe(), verifier.L2PendingSafe()) - } - // The unsafe head must not be changed - require.Equal(t, verifier.L2Unsafe(), sequencer.L2Unsafe()) - } -} - -func TestSpanBatchAtomicity_ForceAdvance(gt *testing.T) { - t := NewDefaultTesting(gt) - dp := e2eutils.MakeDeployParams(t, defaultRollupTestParams) - minTs := hexutil.Uint64(0) - // Activate Delta hardfork - dp.DeployConfig.L2GenesisDeltaTimeOffset = &minTs - dp.DeployConfig.L2BlockTime = 2 - sd := e2eutils.Setup(t, dp, defaultAlloc) - log := testlog.Logger(t, log.LevelInfo) - _, _, miner, sequencer, _, verifier, _, batcher := setupReorgTestActors(t, dp, sd, log) - - targetHeadNumber := uint64(6) // L1 block time / L2 block time - - sequencer.ActL2PipelineFull(t) - verifier.ActL2PipelineFull(t) - require.Equal(t, verifier.L2Unsafe().Number, uint64(0)) - - // Create 6 blocks - miner.ActEmptyBlock(t) - sequencer.ActL1HeadSignal(t) - sequencer.ActBuildToL1HeadUnsafe(t) - require.Equal(t, sequencer.L2Unsafe().Number, targetHeadNumber) - - // Build and submit a span batch with 6 blocks - batcher.ActSubmitAll(t) - miner.ActL1StartBlock(12)(t) - miner.ActL1IncludeTx(dp.Addresses.Batcher)(t) - miner.ActL1EndBlock(t) - - // Start verifier safe sync - verifier.ActL1HeadSignal(t) - verifier.l2PipelineIdle = false - for !verifier.l2PipelineIdle { - verifier.ActL2PipelineStep(t) - if verifier.L2PendingSafe().Number < targetHeadNumber { - // If the span batch is not fully processed, the safe head must not advance. - require.Equal(t, verifier.L2Safe().Number, uint64(0)) - } else { - // Once the span batch is fully processed, the safe head must advance to the end of span batch. - require.Equal(t, verifier.L2Safe().Number, targetHeadNumber) - require.Equal(t, verifier.L2Safe(), verifier.L2PendingSafe()) - } - // The unsafe head and the pending safe head must be the same - require.Equal(t, verifier.L2Unsafe(), verifier.L2PendingSafe()) - } -} diff --git a/op-e2e/actions/tx_helper.go b/op-e2e/actions/tx_helper.go deleted file mode 100644 index e63c1a224822..000000000000 --- a/op-e2e/actions/tx_helper.go +++ /dev/null @@ -1,49 +0,0 @@ -package actions - -import ( - "context" - "math/big" - "time" - - "github.com/ethereum-optimism/optimism/op-e2e/e2eutils/wait" - "github.com/ethereum/go-ethereum/common" - "github.com/ethereum/go-ethereum/core/types" - "github.com/stretchr/testify/require" -) - -// firstValidTx finds the first transaction that is valid for inclusion from the specified address. -// It uses a waiter and filtering of already included transactions to avoid race conditions with the async -// updates to the transaction pool. -func firstValidTx( - t Testing, - from common.Address, - pendingIndices func(common.Address) uint64, - contentFrom func(common.Address) ([]*types.Transaction, []*types.Transaction), - nonceAt func(context.Context, common.Address, *big.Int) (uint64, error), -) *types.Transaction { - var i uint64 - var txs []*types.Transaction - var q []*types.Transaction - // Wait for the tx to be in the pending tx queue - ctx, cancel := context.WithTimeout(context.Background(), 30*time.Second) - defer cancel() - err := wait.For(ctx, time.Second, func() (bool, error) { - i = pendingIndices(from) - txs, q = contentFrom(from) - // Remove any transactions that have already been included in the head block - // The tx pool only prunes included transactions async so they may still be in the list - nonce, err := nonceAt(ctx, from, nil) - if err != nil { - return false, err - } - for len(txs) > 0 && txs[0].Nonce() < nonce { - t.Logf("Removing already included transaction from list of length %v", len(txs)) - txs = txs[1:] - } - return uint64(len(txs)) > i, nil - }) - require.NoError(t, err, - "no pending txs from %s, and have %d unprocessable queued txs from this account: %w", from, len(q), err) - - return txs[i] -} diff --git a/op-e2e/actions/upgrades/dencun_fork_test.go b/op-e2e/actions/upgrades/dencun_fork_test.go new file mode 100644 index 000000000000..a9e3eb2cc256 --- /dev/null +++ b/op-e2e/actions/upgrades/dencun_fork_test.go @@ -0,0 +1,238 @@ +package upgrades + +import ( + "context" + "testing" + + "github.com/ethereum-optimism/optimism/op-e2e/actions/helpers" + "github.com/stretchr/testify/require" + + "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/ethereum-optimism/optimism/op-e2e/e2eutils" + "github.com/ethereum-optimism/optimism/op-e2e/e2eutils/transactions" + "github.com/ethereum-optimism/optimism/op-service/testlog" +) + +func TestDencunL1ForkAfterGenesis(gt *testing.T) { + t := helpers.NewDefaultTesting(gt) + dp := e2eutils.MakeDeployParams(t, helpers.DefaultRollupTestParams) + offset := hexutil.Uint64(24) + dp.DeployConfig.L1CancunTimeOffset = &offset + sd := e2eutils.Setup(t, dp, helpers.DefaultAlloc) + log := testlog.Logger(t, log.LevelDebug) + _, _, miner, sequencer, _, verifier, _, batcher := helpers.SetupReorgTestActors(t, dp, sd, log) + + l1Head := miner.L1Chain().CurrentBlock() + require.False(t, sd.L1Cfg.Config.IsCancun(l1Head.Number, l1Head.Time), "Cancun not active yet") + require.Nil(t, l1Head.ExcessBlobGas, "Cancun blob gas not in header") + + // start op-nodes + sequencer.ActL2PipelineFull(t) + verifier.ActL2PipelineFull(t) + + // build empty L1 blocks, crossing the fork boundary + miner.ActL1SetFeeRecipient(common.Address{'A', 0}) + miner.ActEmptyBlock(t) + miner.ActEmptyBlock(t) // Cancun activates here + miner.ActEmptyBlock(t) + // verify Cancun is active + l1Head = miner.L1Chain().CurrentBlock() + require.True(t, sd.L1Cfg.Config.IsCancun(l1Head.Number, l1Head.Time), "Cancun active") + require.NotNil(t, l1Head.ExcessBlobGas, "Cancun blob gas in header") + + // build L2 chain up to and including L2 blocks referencing Cancun L1 blocks + sequencer.ActL1HeadSignal(t) + sequencer.ActBuildToL1Head(t) + miner.ActL1StartBlock(12)(t) + batcher.ActSubmitAll(t) + miner.ActL1IncludeTx(batcher.BatcherAddr)(t) + miner.ActL1EndBlock(t) + + // sync verifier + verifier.ActL1HeadSignal(t) + verifier.ActL2PipelineFull(t) + // verify verifier accepted Cancun L1 inputs + require.Equal(t, l1Head.Hash(), verifier.SyncStatus().SafeL2.L1Origin.Hash, "verifier synced L1 chain that includes Cancun headers") + require.Equal(t, sequencer.SyncStatus().UnsafeL2, verifier.SyncStatus().UnsafeL2, "verifier and sequencer agree") +} + +func TestDencunL1ForkAtGenesis(gt *testing.T) { + t := helpers.NewDefaultTesting(gt) + dp := e2eutils.MakeDeployParams(t, helpers.DefaultRollupTestParams) + require.Zero(t, *dp.DeployConfig.L1CancunTimeOffset) + sd := e2eutils.Setup(t, dp, helpers.DefaultAlloc) + log := testlog.Logger(t, log.LevelDebug) + _, _, miner, sequencer, _, verifier, _, batcher := helpers.SetupReorgTestActors(t, dp, sd, log) + + l1Head := miner.L1Chain().CurrentBlock() + require.True(t, sd.L1Cfg.Config.IsCancun(l1Head.Number, l1Head.Time), "Cancun active at genesis") + require.NotNil(t, l1Head.ExcessBlobGas, "Cancun blob gas in header") + + // start op-nodes + sequencer.ActL2PipelineFull(t) + verifier.ActL2PipelineFull(t) + + // build empty L1 blocks + miner.ActL1SetFeeRecipient(common.Address{'A', 0}) + miner.ActEmptyBlock(t) + miner.ActEmptyBlock(t) + + // verify Cancun is still active + l1Head = miner.L1Chain().CurrentBlock() + require.True(t, sd.L1Cfg.Config.IsCancun(l1Head.Number, l1Head.Time), "Cancun active") + require.NotNil(t, l1Head.ExcessBlobGas, "Cancun blob gas in header") + + // build L2 chain + sequencer.ActL1HeadSignal(t) + sequencer.ActBuildToL1Head(t) + miner.ActL1StartBlock(12)(t) + batcher.ActSubmitAll(t) + miner.ActL1IncludeTx(batcher.BatcherAddr)(t) + miner.ActL1EndBlock(t) + + // sync verifier + verifier.ActL1HeadSignal(t) + verifier.ActL2PipelineFull(t) + + // verify verifier accepted Cancun L1 inputs + require.Equal(t, l1Head.Hash(), verifier.SyncStatus().SafeL2.L1Origin.Hash, "verifier synced L1 chain that includes Cancun headers") + require.Equal(t, sequencer.SyncStatus().UnsafeL2, verifier.SyncStatus().UnsafeL2, "verifier and sequencer agree") +} + +func verifyPreEcotoneBlock(gt *testing.T, header *types.Header) { + require.Nil(gt, header.ParentBeaconRoot) + require.Nil(gt, header.ExcessBlobGas) + require.Nil(gt, header.BlobGasUsed) +} + +func verifyEcotoneBlock(gt *testing.T, header *types.Header) { + require.NotNil(gt, header.ParentBeaconRoot) + require.NotNil(gt, header.ExcessBlobGas) + require.Equal(gt, *header.ExcessBlobGas, uint64(0)) + require.NotNil(gt, header.BlobGasUsed) + require.Equal(gt, *header.BlobGasUsed, uint64(0)) +} + +func TestDencunL2ForkAfterGenesis(gt *testing.T) { + t := helpers.NewDefaultTesting(gt) + dp := e2eutils.MakeDeployParams(t, helpers.DefaultRollupTestParams) + require.Zero(t, *dp.DeployConfig.L1CancunTimeOffset) + // This test wil fork on the second block + offset := hexutil.Uint64(dp.DeployConfig.L2BlockTime * 2) + dp.DeployConfig.L2GenesisEcotoneTimeOffset = &offset + dp.DeployConfig.L2GenesisFjordTimeOffset = nil + dp.DeployConfig.L2GenesisGraniteTimeOffset = nil + // New forks have to be added here, after changing the default deploy config! + + sd := e2eutils.Setup(t, dp, helpers.DefaultAlloc) + log := testlog.Logger(t, log.LevelDebug) + _, _, _, sequencer, engine, verifier, _, _ := helpers.SetupReorgTestActors(t, dp, sd, log) + + // start op-nodes + sequencer.ActL2PipelineFull(t) + verifier.ActL2PipelineFull(t) + + // Genesis block is pre-ecotone + verifyPreEcotoneBlock(gt, engine.L2Chain().CurrentBlock()) + + // Block before fork block + sequencer.ActL2StartBlock(t) + sequencer.ActL2EndBlock(t) + verifyPreEcotoneBlock(gt, engine.L2Chain().CurrentBlock()) + + // Fork block is ecotone + sequencer.ActL2StartBlock(t) + sequencer.ActL2EndBlock(t) + verifyEcotoneBlock(gt, engine.L2Chain().CurrentBlock()) + + // Blocks post fork have Ecotone properties + sequencer.ActL2StartBlock(t) + sequencer.ActL2EndBlock(t) + verifyEcotoneBlock(gt, engine.L2Chain().CurrentBlock()) +} + +func TestDencunL2ForkAtGenesis(gt *testing.T) { + t := helpers.NewDefaultTesting(gt) + dp := e2eutils.MakeDeployParams(t, helpers.DefaultRollupTestParams) + require.Zero(t, *dp.DeployConfig.L2GenesisEcotoneTimeOffset) + + sd := e2eutils.Setup(t, dp, helpers.DefaultAlloc) + log := testlog.Logger(t, log.LevelDebug) + _, _, _, sequencer, engine, verifier, _, _ := helpers.SetupReorgTestActors(t, dp, sd, log) + + // start op-nodes + sequencer.ActL2PipelineFull(t) + verifier.ActL2PipelineFull(t) + + // Genesis block has ecotone properties + verifyEcotoneBlock(gt, engine.L2Chain().CurrentBlock()) + + // Blocks post fork have Ecotone properties + sequencer.ActL2StartBlock(t) + sequencer.ActL2EndBlock(t) + verifyEcotoneBlock(gt, engine.L2Chain().CurrentBlock()) +} + +func aliceSimpleBlobTx(t helpers.Testing, dp *e2eutils.DeployParams) *types.Transaction { + txData := transactions.CreateEmptyBlobTx(true, dp.DeployConfig.L2ChainID) + // Manual signer creation, so we can sign a blob tx on the chain, + // even though we have disabled cancun signer support in Ecotone. + signer := types.NewCancunSigner(txData.ChainID.ToBig()) + tx, err := types.SignNewTx(dp.Secrets.Alice, signer, txData) + require.NoError(t, err, "must sign tx") + return tx +} + +func newEngine(t helpers.Testing, sd *e2eutils.SetupData, log log.Logger) *helpers.L2Engine { + jwtPath := e2eutils.WriteDefaultJWT(t) + return helpers.NewL2Engine(t, log, sd.L2Cfg, sd.RollupCfg.Genesis.L1, jwtPath) +} + +// TestDencunBlobTxRPC tries to send a Blob tx to the L2 engine via RPC, it should not be accepted. +func TestDencunBlobTxRPC(gt *testing.T) { + t := helpers.NewDefaultTesting(gt) + dp := e2eutils.MakeDeployParams(t, helpers.DefaultRollupTestParams) + + sd := e2eutils.Setup(t, dp, helpers.DefaultAlloc) + log := testlog.Logger(t, log.LevelDebug) + engine := newEngine(t, sd, log) + cl := engine.EthClient() + tx := aliceSimpleBlobTx(t, dp) + err := cl.SendTransaction(context.Background(), tx) + require.ErrorContains(t, err, "transaction type not supported") +} + +// TestDencunBlobTxInTxPool tries to insert a blob tx directly into the tx pool, it should not be accepted. +func TestDencunBlobTxInTxPool(gt *testing.T) { + t := helpers.NewDefaultTesting(gt) + dp := e2eutils.MakeDeployParams(t, helpers.DefaultRollupTestParams) + + sd := e2eutils.Setup(t, dp, helpers.DefaultAlloc) + log := testlog.Logger(t, log.LevelDebug) + engine := newEngine(t, sd, log) + tx := aliceSimpleBlobTx(t, dp) + errs := engine.Eth.TxPool().Add([]*types.Transaction{tx}, true, true) + require.ErrorContains(t, errs[0], "transaction type not supported") +} + +// TestDencunBlobTxInclusion tries to send a Blob tx to the L2 engine, it should not be accepted. +func TestDencunBlobTxInclusion(gt *testing.T) { + t := helpers.NewDefaultTesting(gt) + dp := e2eutils.MakeDeployParams(t, helpers.DefaultRollupTestParams) + + sd := e2eutils.Setup(t, dp, helpers.DefaultAlloc) + log := testlog.Logger(t, log.LevelDebug) + + _, engine, sequencer := helpers.SetupSequencerTest(t, sd, log) + sequencer.ActL2PipelineFull(t) + + tx := aliceSimpleBlobTx(t, dp) + + sequencer.ActL2StartBlock(t) + err := engine.EngineApi.IncludeTx(tx, dp.Addresses.Alice) + require.ErrorContains(t, err, "invalid L2 block (tx 1): failed to apply transaction to L2 block (tx 1): transaction type not supported") +} diff --git a/op-e2e/actions/ecotone_fork_test.go b/op-e2e/actions/upgrades/ecotone_fork_test.go similarity index 91% rename from op-e2e/actions/ecotone_fork_test.go rename to op-e2e/actions/upgrades/ecotone_fork_test.go index b8154f49882b..c4135266e162 100644 --- a/op-e2e/actions/ecotone_fork_test.go +++ b/op-e2e/actions/upgrades/ecotone_fork_test.go @@ -1,10 +1,11 @@ -package actions +package upgrades import ( "context" "math/big" "testing" + "github.com/ethereum-optimism/optimism/op-e2e/actions/helpers" "github.com/stretchr/testify/require" "github.com/ethereum/go-ethereum/common" @@ -30,7 +31,7 @@ var ( // verifyCodeHashMatches checks that the has of the code at the given address matches the expected code-hash. // It also sanity-checks that the code is not empty: we should never deploy empty contract codes. // Returns the contract code -func verifyCodeHashMatches(t Testing, client *ethclient.Client, address common.Address, expectedCodeHash common.Hash) []byte { +func verifyCodeHashMatches(t helpers.Testing, client *ethclient.Client, address common.Address, expectedCodeHash common.Hash) []byte { code, err := client.CodeAt(context.Background(), address, nil) require.NoError(t, err) require.NotEmpty(t, code) @@ -40,23 +41,22 @@ func verifyCodeHashMatches(t Testing, client *ethclient.Client, address common.A } func TestEcotoneNetworkUpgradeTransactions(gt *testing.T) { - t := NewDefaultTesting(gt) - dp := e2eutils.MakeDeployParams(t, defaultRollupTestParams) - genesisBlock := hexutil.Uint64(0) + t := helpers.NewDefaultTesting(gt) + dp := e2eutils.MakeDeployParams(t, helpers.DefaultRollupTestParams) ecotoneOffset := hexutil.Uint64(4) - dp.DeployConfig.L1CancunTimeOffset = &genesisBlock // can be removed once Cancun on L1 is the default + log := testlog.Logger(t, log.LevelDebug) + require.Zero(t, *dp.DeployConfig.L1CancunTimeOffset) // Activate all forks at genesis, and schedule Ecotone the block after - dp.DeployConfig.L2GenesisRegolithTimeOffset = &genesisBlock - dp.DeployConfig.L2GenesisCanyonTimeOffset = &genesisBlock - dp.DeployConfig.L2GenesisDeltaTimeOffset = &genesisBlock dp.DeployConfig.L2GenesisEcotoneTimeOffset = &ecotoneOffset - require.NoError(t, dp.DeployConfig.Check(), "must have valid config") + dp.DeployConfig.L2GenesisFjordTimeOffset = nil + dp.DeployConfig.L2GenesisGraniteTimeOffset = nil + // New forks have to be added here... + require.NoError(t, dp.DeployConfig.Check(log), "must have valid config") - sd := e2eutils.Setup(t, dp, defaultAlloc) - log := testlog.Logger(t, log.LevelDebug) - _, _, miner, sequencer, engine, verifier, _, _ := setupReorgTestActors(t, dp, sd, log) + sd := e2eutils.Setup(t, dp, helpers.DefaultAlloc) + _, _, miner, sequencer, engine, verifier, _, _ := helpers.SetupReorgTestActors(t, dp, sd, log) ethCl := engine.EthClient() // build a single block to move away from the genesis with 0-values in L1Block contract @@ -239,8 +239,8 @@ func TestEcotoneNetworkUpgradeTransactions(gt *testing.T) { // TestEcotoneBeforeL1 tests that the L2 Ecotone fork can activate before L1 Dencun does func TestEcotoneBeforeL1(gt *testing.T) { - t := NewDefaultTesting(gt) - dp := e2eutils.MakeDeployParams(t, defaultRollupTestParams) + t := helpers.NewDefaultTesting(gt) + dp := e2eutils.MakeDeployParams(t, helpers.DefaultRollupTestParams) offset := hexutil.Uint64(0) farOffset := hexutil.Uint64(10000) dp.DeployConfig.L2GenesisRegolithTimeOffset = &offset @@ -249,19 +249,19 @@ func TestEcotoneBeforeL1(gt *testing.T) { dp.DeployConfig.L2GenesisDeltaTimeOffset = &offset dp.DeployConfig.L2GenesisEcotoneTimeOffset = &offset - sd := e2eutils.Setup(t, dp, defaultAlloc) + sd := e2eutils.Setup(t, dp, helpers.DefaultAlloc) log := testlog.Logger(t, log.LevelDebug) - _, _, _, sequencer, engine, verifier, _, _ := setupReorgTestActors(t, dp, sd, log) + _, _, _, sequencer, engine, verifier, _, _ := helpers.SetupReorgTestActors(t, dp, sd, log) // start op-nodes sequencer.ActL2PipelineFull(t) verifier.ActL2PipelineFull(t) // Genesis block has ecotone properties - verifyEcotoneBlock(gt, engine.l2Chain.CurrentBlock()) + verifyEcotoneBlock(gt, engine.L2Chain().CurrentBlock()) // Blocks post fork have Ecotone properties sequencer.ActL2StartBlock(t) sequencer.ActL2EndBlock(t) - verifyEcotoneBlock(gt, engine.l2Chain.CurrentBlock()) + verifyEcotoneBlock(gt, engine.L2Chain().CurrentBlock()) } diff --git a/op-e2e/actions/fjord_fork_test.go b/op-e2e/actions/upgrades/fjord_fork_test.go similarity index 93% rename from op-e2e/actions/fjord_fork_test.go rename to op-e2e/actions/upgrades/fjord_fork_test.go index 0dee40e39d50..9444fcfcb7ae 100644 --- a/op-e2e/actions/fjord_fork_test.go +++ b/op-e2e/actions/upgrades/fjord_fork_test.go @@ -1,4 +1,4 @@ -package actions +package upgrades import ( "context" @@ -6,6 +6,7 @@ import ( "math/big" "testing" + "github.com/ethereum-optimism/optimism/op-e2e/actions/helpers" "github.com/ethereum-optimism/optimism/op-service/predeploys" "github.com/ethereum/go-ethereum/accounts/abi/bind" "github.com/ethereum/go-ethereum/common" @@ -29,11 +30,13 @@ var ( ) func TestFjordNetworkUpgradeTransactions(gt *testing.T) { - t := NewDefaultTesting(gt) - dp := e2eutils.MakeDeployParams(t, defaultRollupTestParams) + t := helpers.NewDefaultTesting(gt) + dp := e2eutils.MakeDeployParams(t, helpers.DefaultRollupTestParams) genesisBlock := hexutil.Uint64(0) fjordOffset := hexutil.Uint64(2) + log := testlog.Logger(t, log.LvlDebug) + 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 @@ -42,11 +45,10 @@ func TestFjordNetworkUpgradeTransactions(gt *testing.T) { dp.DeployConfig.L2GenesisDeltaTimeOffset = &genesisBlock dp.DeployConfig.L2GenesisEcotoneTimeOffset = &genesisBlock dp.DeployConfig.L2GenesisFjordTimeOffset = &fjordOffset - require.NoError(t, dp.DeployConfig.Check(), "must have valid config") + require.NoError(t, dp.DeployConfig.Check(log), "must have valid config") - sd := e2eutils.Setup(t, dp, defaultAlloc) - log := testlog.Logger(t, log.LvlDebug) - _, _, _, sequencer, engine, verifier, _, _ := setupReorgTestActors(t, dp, sd, log) + sd := e2eutils.Setup(t, dp, helpers.DefaultAlloc) + _, _, _, sequencer, engine, verifier, _, _ := helpers.SetupReorgTestActors(t, dp, sd, log) ethCl := engine.EthClient() // start op-nodes diff --git a/op-e2e/actions/upgrades/helpers/config.go b/op-e2e/actions/upgrades/helpers/config.go new file mode 100644 index 000000000000..a936d86250a0 --- /dev/null +++ b/op-e2e/actions/upgrades/helpers/config.go @@ -0,0 +1,27 @@ +package helpers + +import ( + "github.com/ethereum-optimism/optimism/op-e2e/e2eutils" + "github.com/ethereum/go-ethereum/common/hexutil" +) + +// ApplyDeltaTimeOffset adjusts fork configuration to not conflict with the delta overrides +func ApplyDeltaTimeOffset(dp *e2eutils.DeployParams, deltaTimeOffset *hexutil.Uint64) { + dp.DeployConfig.L2GenesisDeltaTimeOffset = deltaTimeOffset + // configure Ecotone to not be before Delta accidentally + if dp.DeployConfig.L2GenesisEcotoneTimeOffset != nil { + if deltaTimeOffset == nil { + dp.DeployConfig.L2GenesisEcotoneTimeOffset = nil + } else if *dp.DeployConfig.L2GenesisEcotoneTimeOffset < *deltaTimeOffset { + dp.DeployConfig.L2GenesisEcotoneTimeOffset = deltaTimeOffset + } + } + // configure Fjord to not be before Delta accidentally + if dp.DeployConfig.L2GenesisFjordTimeOffset != nil { + if deltaTimeOffset == nil { + dp.DeployConfig.L2GenesisFjordTimeOffset = nil + } else if *dp.DeployConfig.L2GenesisFjordTimeOffset < *deltaTimeOffset { + dp.DeployConfig.L2GenesisFjordTimeOffset = deltaTimeOffset + } + } +} diff --git a/op-e2e/actions/span_batch_test.go b/op-e2e/actions/upgrades/span_batch_test.go similarity index 81% rename from op-e2e/actions/span_batch_test.go rename to op-e2e/actions/upgrades/span_batch_test.go index 6ccb76a461bd..fc1707b158a0 100644 --- a/op-e2e/actions/span_batch_test.go +++ b/op-e2e/actions/upgrades/span_batch_test.go @@ -1,14 +1,17 @@ -package actions +package upgrades import ( "context" "crypto/ecdsa" crand "crypto/rand" "fmt" + "math/big" "math/rand" "testing" + actionsHelpers "github.com/ethereum-optimism/optimism/op-e2e/actions/helpers" + upgradesHelpers "github.com/ethereum-optimism/optimism/op-e2e/actions/upgrades/helpers" "github.com/stretchr/testify/require" "github.com/ethereum/go-ethereum" @@ -30,7 +33,7 @@ import ( // TestDropSpanBatchBeforeHardfork tests behavior of op-node before Delta hardfork. // op-node must drop SpanBatch before Delta hardfork. func TestDropSpanBatchBeforeHardfork(gt *testing.T) { - t := NewDefaultTesting(gt) + t := actionsHelpers.NewDefaultTesting(gt) p := &e2eutils.TestParams{ MaxSequencerDrift: 20, // larger than L1 block time we simulate in this test (12) SequencerWindowSize: 24, @@ -39,15 +42,15 @@ func TestDropSpanBatchBeforeHardfork(gt *testing.T) { } dp := e2eutils.MakeDeployParams(t, p) // do not activate Delta hardfork for verifier - dp.DeployConfig.L2GenesisDeltaTimeOffset = nil - sd := e2eutils.Setup(t, dp, defaultAlloc) + upgradesHelpers.ApplyDeltaTimeOffset(dp, nil) + sd := e2eutils.Setup(t, dp, actionsHelpers.DefaultAlloc) log := testlog.Logger(t, log.LevelError) - miner, seqEngine, sequencer := setupSequencerTest(t, sd, log) - verifEngine, verifier := setupVerifier(t, sd, log, miner.L1Client(t, sd.RollupCfg), miner.BlobStore(), &sync.Config{}) + miner, seqEngine, sequencer := actionsHelpers.SetupSequencerTest(t, sd, log) + verifEngine, verifier := actionsHelpers.SetupVerifier(t, sd, log, miner.L1Client(t, sd.RollupCfg), miner.BlobStore(), &sync.Config{}) rollupSeqCl := sequencer.RollupClient() // Force batcher to submit SpanBatches to L1. - batcher := NewL2Batcher(log, sd.RollupCfg, &BatcherCfg{ + batcher := actionsHelpers.NewL2Batcher(log, sd.RollupCfg, &actionsHelpers.BatcherCfg{ MinL1TxSize: 0, MaxL1TxSize: 128_000, BatcherKey: dp.Secrets.Batcher, @@ -64,7 +67,7 @@ func TestDropSpanBatchBeforeHardfork(gt *testing.T) { ChainID: sd.L2Cfg.Config.ChainID, Nonce: n, GasTipCap: big.NewInt(2 * params.GWei), - GasFeeCap: new(big.Int).Add(miner.l1Chain.CurrentBlock().BaseFee, big.NewInt(2*params.GWei)), + GasFeeCap: new(big.Int).Add(miner.L1Chain().CurrentBlock().BaseFee, big.NewInt(2*params.GWei)), Gas: params.TxGas, To: &dp.Addresses.Bob, Value: e2eutils.Ether(2), @@ -88,8 +91,8 @@ func TestDropSpanBatchBeforeHardfork(gt *testing.T) { miner.ActL1StartBlock(12)(t) miner.ActL1IncludeTx(dp.Addresses.Batcher)(t) miner.ActL1EndBlock(t) - bl := miner.l1Chain.CurrentBlock() - log.Info("bl", "txs", len(miner.l1Chain.GetBlockByHash(bl.Hash()).Transactions())) + bl := miner.L1Chain().CurrentBlock() + log.Info("bl", "txs", len(miner.L1Chain().GetBlockByHash(bl.Hash()).Transactions())) // Now make enough L1 blocks that the verifier will have to derive a L2 block // It will also eagerly derive the block from the batcher @@ -119,7 +122,7 @@ func TestDropSpanBatchBeforeHardfork(gt *testing.T) { // TestHardforkMiddleOfSpanBatch tests behavior of op-node Delta hardfork. // If Delta activation time is in the middle of time range of a SpanBatch, op-node must drop the batch. func TestHardforkMiddleOfSpanBatch(gt *testing.T) { - t := NewDefaultTesting(gt) + t := actionsHelpers.NewDefaultTesting(gt) p := &e2eutils.TestParams{ MaxSequencerDrift: 20, // larger than L1 block time we simulate in this test (12) SequencerWindowSize: 24, @@ -130,16 +133,21 @@ func TestHardforkMiddleOfSpanBatch(gt *testing.T) { // Activate HF in the middle of the first epoch deltaOffset := hexutil.Uint64(6) - dp.DeployConfig.L2GenesisDeltaTimeOffset = &deltaOffset - sd := e2eutils.Setup(t, dp, defaultAlloc) + upgradesHelpers.ApplyDeltaTimeOffset(dp, &deltaOffset) + // Applies to HF that goes into Delta. Otherwise we end up with more upgrade txs and things during this case. + dp.DeployConfig.L2GenesisEcotoneTimeOffset = nil + dp.DeployConfig.L2GenesisFjordTimeOffset = nil + dp.DeployConfig.L2GenesisGraniteTimeOffset = nil + + sd := e2eutils.Setup(t, dp, actionsHelpers.DefaultAlloc) log := testlog.Logger(t, log.LevelError) - miner, seqEngine, sequencer := setupSequencerTest(t, sd, log) - verifEngine, verifier := setupVerifier(t, sd, log, miner.L1Client(t, sd.RollupCfg), miner.BlobStore(), &sync.Config{}) + miner, seqEngine, sequencer := actionsHelpers.SetupSequencerTest(t, sd, log) + verifEngine, verifier := actionsHelpers.SetupVerifier(t, sd, log, miner.L1Client(t, sd.RollupCfg), miner.BlobStore(), &sync.Config{}) minerCl := miner.EthClient() rollupSeqCl := sequencer.RollupClient() // Force batcher to submit SpanBatches to L1. - batcher := NewL2Batcher(log, sd.RollupCfg, &BatcherCfg{ + batcher := actionsHelpers.NewL2Batcher(log, sd.RollupCfg, &actionsHelpers.BatcherCfg{ MinL1TxSize: 0, MaxL1TxSize: 128_000, BatcherKey: dp.Secrets.Batcher, @@ -156,7 +164,7 @@ func TestHardforkMiddleOfSpanBatch(gt *testing.T) { ChainID: sd.L2Cfg.Config.ChainID, Nonce: n, GasTipCap: big.NewInt(2 * params.GWei), - GasFeeCap: new(big.Int).Add(miner.l1Chain.CurrentBlock().BaseFee, big.NewInt(2*params.GWei)), + GasFeeCap: new(big.Int).Add(miner.L1Chain().CurrentBlock().BaseFee, big.NewInt(2*params.GWei)), Gas: params.TxGas, To: &dp.Addresses.Bob, Value: e2eutils.Ether(2), @@ -196,8 +204,8 @@ func TestHardforkMiddleOfSpanBatch(gt *testing.T) { miner.ActL1StartBlock(12)(t) miner.ActL1IncludeTx(dp.Addresses.Batcher)(t) miner.ActL1EndBlock(t) - bl := miner.l1Chain.CurrentBlock() - log.Info("bl", "txs", len(miner.l1Chain.GetBlockByHash(bl.Hash()).Transactions())) + bl := miner.L1Chain().CurrentBlock() + log.Info("bl", "txs", len(miner.L1Chain().GetBlockByHash(bl.Hash()).Transactions())) // Now make enough L1 blocks that the verifier will have to derive a L2 block // It will also eagerly derive the block from the batcher @@ -227,7 +235,7 @@ func TestHardforkMiddleOfSpanBatch(gt *testing.T) { // TestAcceptSingularBatchAfterHardfork tests behavior of op-node after Delta hardfork. // op-node must accept SingularBatch after Delta hardfork. func TestAcceptSingularBatchAfterHardfork(gt *testing.T) { - t := NewDefaultTesting(gt) + t := actionsHelpers.NewDefaultTesting(gt) p := &e2eutils.TestParams{ MaxSequencerDrift: 20, // larger than L1 block time we simulate in this test (12) SequencerWindowSize: 24, @@ -238,15 +246,15 @@ func TestAcceptSingularBatchAfterHardfork(gt *testing.T) { dp := e2eutils.MakeDeployParams(t, p) // activate Delta hardfork for verifier. - dp.DeployConfig.L2GenesisDeltaTimeOffset = &minTs - sd := e2eutils.Setup(t, dp, defaultAlloc) + upgradesHelpers.ApplyDeltaTimeOffset(dp, &minTs) + sd := e2eutils.Setup(t, dp, actionsHelpers.DefaultAlloc) log := testlog.Logger(t, log.LevelError) - miner, seqEngine, sequencer := setupSequencerTest(t, sd, log) - verifEngine, verifier := setupVerifier(t, sd, log, miner.L1Client(t, sd.RollupCfg), miner.BlobStore(), &sync.Config{}) + miner, seqEngine, sequencer := actionsHelpers.SetupSequencerTest(t, sd, log) + verifEngine, verifier := actionsHelpers.SetupVerifier(t, sd, log, miner.L1Client(t, sd.RollupCfg), miner.BlobStore(), &sync.Config{}) rollupSeqCl := sequencer.RollupClient() // Force batcher to submit SingularBatches to L1. - batcher := NewL2Batcher(log, sd.RollupCfg, &BatcherCfg{ + batcher := actionsHelpers.NewL2Batcher(log, sd.RollupCfg, &actionsHelpers.BatcherCfg{ MinL1TxSize: 0, MaxL1TxSize: 128_000, BatcherKey: dp.Secrets.Batcher, @@ -263,7 +271,7 @@ func TestAcceptSingularBatchAfterHardfork(gt *testing.T) { ChainID: sd.L2Cfg.Config.ChainID, Nonce: n, GasTipCap: big.NewInt(2 * params.GWei), - GasFeeCap: new(big.Int).Add(miner.l1Chain.CurrentBlock().BaseFee, big.NewInt(2*params.GWei)), + GasFeeCap: new(big.Int).Add(miner.L1Chain().CurrentBlock().BaseFee, big.NewInt(2*params.GWei)), Gas: params.TxGas, To: &dp.Addresses.Bob, Value: e2eutils.Ether(2), @@ -287,8 +295,8 @@ func TestAcceptSingularBatchAfterHardfork(gt *testing.T) { miner.ActL1StartBlock(12)(t) miner.ActL1IncludeTx(dp.Addresses.Batcher)(t) miner.ActL1EndBlock(t) - bl := miner.l1Chain.CurrentBlock() - log.Info("bl", "txs", len(miner.l1Chain.GetBlockByHash(bl.Hash()).Transactions())) + bl := miner.L1Chain().CurrentBlock() + log.Info("bl", "txs", len(miner.L1Chain().GetBlockByHash(bl.Hash()).Transactions())) // Now make enough L1 blocks that the verifier will have to derive a L2 block // It will also eagerly derive the block from the batcher @@ -313,7 +321,7 @@ func TestAcceptSingularBatchAfterHardfork(gt *testing.T) { // TestMixOfBatchesAfterHardfork tests behavior of op-node after Delta hardfork. // op-node must accept SingularBatch and SpanBatch in sequence. func TestMixOfBatchesAfterHardfork(gt *testing.T) { - t := NewDefaultTesting(gt) + t := actionsHelpers.NewDefaultTesting(gt) p := &e2eutils.TestParams{ MaxSequencerDrift: 20, // larger than L1 block time we simulate in this test (12) SequencerWindowSize: 24, @@ -324,11 +332,11 @@ func TestMixOfBatchesAfterHardfork(gt *testing.T) { dp := e2eutils.MakeDeployParams(t, p) // Activate Delta hardfork for verifier. - dp.DeployConfig.L2GenesisDeltaTimeOffset = &minTs - sd := e2eutils.Setup(t, dp, defaultAlloc) + upgradesHelpers.ApplyDeltaTimeOffset(dp, &minTs) + sd := e2eutils.Setup(t, dp, actionsHelpers.DefaultAlloc) log := testlog.Logger(t, log.LevelError) - miner, seqEngine, sequencer := setupSequencerTest(t, sd, log) - verifEngine, verifier := setupVerifier(t, sd, log, miner.L1Client(t, sd.RollupCfg), miner.BlobStore(), &sync.Config{}) + miner, seqEngine, sequencer := actionsHelpers.SetupSequencerTest(t, sd, log) + verifEngine, verifier := actionsHelpers.SetupVerifier(t, sd, log, miner.L1Client(t, sd.RollupCfg), miner.BlobStore(), &sync.Config{}) rollupSeqCl := sequencer.RollupClient() seqEngCl := seqEngine.EthClient() @@ -346,7 +354,7 @@ func TestMixOfBatchesAfterHardfork(gt *testing.T) { ChainID: sd.L2Cfg.Config.ChainID, Nonce: n, GasTipCap: big.NewInt(2 * params.GWei), - GasFeeCap: new(big.Int).Add(miner.l1Chain.CurrentBlock().BaseFee, big.NewInt(2*params.GWei)), + GasFeeCap: new(big.Int).Add(miner.L1Chain().CurrentBlock().BaseFee, big.NewInt(2*params.GWei)), Gas: params.TxGas, To: &dp.Addresses.Bob, Value: e2eutils.Ether(2), @@ -362,7 +370,7 @@ func TestMixOfBatchesAfterHardfork(gt *testing.T) { sequencer.ActBuildToL1Head(t) // Select batcher mode - batcherCfg := BatcherCfg{ + batcherCfg := actionsHelpers.BatcherCfg{ MinL1TxSize: 0, MaxL1TxSize: 128_000, BatcherKey: dp.Secrets.Batcher, @@ -370,7 +378,7 @@ func TestMixOfBatchesAfterHardfork(gt *testing.T) { ForceSubmitSingularBatch: i%2 == 1, // Submit SingularBatch for even numbered batches DataAvailabilityType: batcherFlags.CalldataType, } - batcher := NewL2Batcher(log, sd.RollupCfg, &batcherCfg, rollupSeqCl, miner.EthClient(), seqEngine.EthClient(), seqEngine.EngineClient(t, sd.RollupCfg)) + batcher := actionsHelpers.NewL2Batcher(log, sd.RollupCfg, &batcherCfg, rollupSeqCl, miner.EthClient(), seqEngine.EthClient(), seqEngine.EngineClient(t, sd.RollupCfg)) // Submit all new blocks batcher.ActSubmitAll(t) @@ -404,7 +412,7 @@ func TestMixOfBatchesAfterHardfork(gt *testing.T) { // TestSpanBatchEmptyChain tests derivation of empty chain using SpanBatch. func TestSpanBatchEmptyChain(gt *testing.T) { - t := NewDefaultTesting(gt) + t := actionsHelpers.NewDefaultTesting(gt) p := &e2eutils.TestParams{ MaxSequencerDrift: 20, SequencerWindowSize: 24, @@ -414,14 +422,14 @@ func TestSpanBatchEmptyChain(gt *testing.T) { dp := e2eutils.MakeDeployParams(t, p) minTs := hexutil.Uint64(0) // Activate Delta hardfork - dp.DeployConfig.L2GenesisDeltaTimeOffset = &minTs - sd := e2eutils.Setup(t, dp, defaultAlloc) + upgradesHelpers.ApplyDeltaTimeOffset(dp, &minTs) + sd := e2eutils.Setup(t, dp, actionsHelpers.DefaultAlloc) log := testlog.Logger(t, log.LevelError) - miner, seqEngine, sequencer := setupSequencerTest(t, sd, log) - _, verifier := setupVerifier(t, sd, log, miner.L1Client(t, sd.RollupCfg), miner.BlobStore(), &sync.Config{}) + miner, seqEngine, sequencer := actionsHelpers.SetupSequencerTest(t, sd, log) + _, verifier := actionsHelpers.SetupVerifier(t, sd, log, miner.L1Client(t, sd.RollupCfg), miner.BlobStore(), &sync.Config{}) rollupSeqCl := sequencer.RollupClient() - batcher := NewL2Batcher(log, sd.RollupCfg, DefaultBatcherCfg(dp), + batcher := actionsHelpers.NewL2Batcher(log, sd.RollupCfg, actionsHelpers.DefaultBatcherCfg(dp), rollupSeqCl, miner.EthClient(), seqEngine.EthClient(), seqEngine.EngineClient(t, sd.RollupCfg)) sequencer.ActL2PipelineFull(t) @@ -467,7 +475,7 @@ func TestSpanBatchEmptyChain(gt *testing.T) { // TestSpanBatchLowThroughputChain tests derivation of low-throughput chain using SpanBatch. func TestSpanBatchLowThroughputChain(gt *testing.T) { - t := NewDefaultTesting(gt) + t := actionsHelpers.NewDefaultTesting(gt) p := &e2eutils.TestParams{ MaxSequencerDrift: 20, SequencerWindowSize: 24, @@ -477,14 +485,14 @@ func TestSpanBatchLowThroughputChain(gt *testing.T) { dp := e2eutils.MakeDeployParams(t, p) minTs := hexutil.Uint64(0) // Activate Delta hardfork - dp.DeployConfig.L2GenesisDeltaTimeOffset = &minTs - sd := e2eutils.Setup(t, dp, defaultAlloc) + upgradesHelpers.ApplyDeltaTimeOffset(dp, &minTs) + sd := e2eutils.Setup(t, dp, actionsHelpers.DefaultAlloc) log := testlog.Logger(t, log.LevelError) - miner, seqEngine, sequencer := setupSequencerTest(t, sd, log) - _, verifier := setupVerifier(t, sd, log, miner.L1Client(t, sd.RollupCfg), miner.BlobStore(), &sync.Config{}) + miner, seqEngine, sequencer := actionsHelpers.SetupSequencerTest(t, sd, log) + _, verifier := actionsHelpers.SetupVerifier(t, sd, log, miner.L1Client(t, sd.RollupCfg), miner.BlobStore(), &sync.Config{}) rollupSeqCl := sequencer.RollupClient() - batcher := NewL2Batcher(log, sd.RollupCfg, DefaultBatcherCfg(dp), + batcher := actionsHelpers.NewL2Batcher(log, sd.RollupCfg, actionsHelpers.DefaultBatcherCfg(dp), rollupSeqCl, miner.EthClient(), seqEngine.EthClient(), seqEngine.EngineClient(t, sd.RollupCfg)) cl := seqEngine.EthClient() @@ -515,7 +523,7 @@ func TestSpanBatchLowThroughputChain(gt *testing.T) { totalTxCount := 0 // Make 600 L2 blocks (L1BlockTime / L2BlockTime * 50) including 1~3 txs for i := 0; i < 50; i++ { - for sequencer.engine.UnsafeL2Head().L1Origin.Number < sequencer.l1State.L1Head().Number { + for sequencer.L2Unsafe().L1Origin.Number < sequencer.SyncStatus().HeadL1.Number { sequencer.ActL2StartBlock(t) // fill the block with random number of L2 txs for j := 0; j < rand.Intn(3); j++ { @@ -526,7 +534,7 @@ func TestSpanBatchLowThroughputChain(gt *testing.T) { require.NoError(t, err) gas, err := core.IntrinsicGas(data, nil, false, true, true, false) require.NoError(t, err) - baseFee := seqEngine.l2Chain.CurrentBlock().BaseFee + baseFee := seqEngine.L2Chain().CurrentBlock().BaseFee nonce, err := cl.PendingNonceAt(t.Ctx(), addrs[userIdx]) require.NoError(t, err) tx := types.MustSignNewTx(privKeys[userIdx], signer, &types.DynamicFeeTx{ @@ -579,7 +587,7 @@ func TestSpanBatchLowThroughputChain(gt *testing.T) { } func TestBatchEquivalence(gt *testing.T) { - t := NewDefaultTesting(gt) + t := actionsHelpers.NewDefaultTesting(gt) log := testlog.Logger(t, log.LevelError) p := &e2eutils.TestParams{ @@ -591,8 +599,8 @@ func TestBatchEquivalence(gt *testing.T) { // Delta activated deploy config dp := e2eutils.MakeDeployParams(t, p) minTs := hexutil.Uint64(0) - dp.DeployConfig.L2GenesisDeltaTimeOffset = &minTs - sdDeltaActivated := e2eutils.Setup(t, dp, defaultAlloc) + upgradesHelpers.ApplyDeltaTimeOffset(dp, &minTs) + sdDeltaActivated := e2eutils.Setup(t, dp, actionsHelpers.DefaultAlloc) // Delta deactivated deploy config rcfg := *sdDeltaActivated.RollupCfg @@ -605,18 +613,18 @@ func TestBatchEquivalence(gt *testing.T) { } // Setup sequencer - miner, seqEngine, sequencer := setupSequencerTest(t, sdDeltaActivated, log) + miner, seqEngine, sequencer := actionsHelpers.SetupSequencerTest(t, sdDeltaActivated, log) rollupSeqCl := sequencer.RollupClient() seqEngCl := seqEngine.EthClient() // Setup Delta activated spanVerifier - _, spanVerifier := setupVerifier(t, sdDeltaActivated, log, miner.L1Client(t, sdDeltaActivated.RollupCfg), miner.BlobStore(), &sync.Config{}) + _, spanVerifier := actionsHelpers.SetupVerifier(t, sdDeltaActivated, log, miner.L1Client(t, sdDeltaActivated.RollupCfg), miner.BlobStore(), &sync.Config{}) // Setup Delta deactivated spanVerifier - _, singularVerifier := setupVerifier(t, sdDeltaDeactivated, log, miner.L1Client(t, sdDeltaDeactivated.RollupCfg), miner.BlobStore(), &sync.Config{}) + _, singularVerifier := actionsHelpers.SetupVerifier(t, sdDeltaDeactivated, log, miner.L1Client(t, sdDeltaDeactivated.RollupCfg), miner.BlobStore(), &sync.Config{}) // Setup SpanBatcher - spanBatcher := NewL2Batcher(log, sdDeltaActivated.RollupCfg, &BatcherCfg{ + spanBatcher := actionsHelpers.NewL2Batcher(log, sdDeltaActivated.RollupCfg, &actionsHelpers.BatcherCfg{ MinL1TxSize: 0, MaxL1TxSize: 128_000, BatcherKey: dp.Secrets.Batcher, @@ -625,7 +633,7 @@ func TestBatchEquivalence(gt *testing.T) { }, rollupSeqCl, miner.EthClient(), seqEngine.EthClient(), seqEngine.EngineClient(t, sdDeltaActivated.RollupCfg)) // Setup SingularBatcher - singularBatcher := NewL2Batcher(log, sdDeltaDeactivated.RollupCfg, &BatcherCfg{ + singularBatcher := actionsHelpers.NewL2Batcher(log, sdDeltaDeactivated.RollupCfg, &actionsHelpers.BatcherCfg{ MinL1TxSize: 0, MaxL1TxSize: 128_000, BatcherKey: dp.Secrets.Batcher, @@ -654,7 +662,7 @@ func TestBatchEquivalence(gt *testing.T) { sequencer.ActL2PipelineFull(t) totalTxCount := 0 // Build random blocks - for sequencer.engine.UnsafeL2Head().L1Origin.Number < sequencer.l1State.L1Head().Number { + for sequencer.L2Unsafe().L1Origin.Number < sequencer.SyncStatus().HeadL1.Number { sequencer.ActL2StartBlock(t) // fill the block with random number of L2 txs for j := 0; j < rand.Intn(3); j++ { @@ -665,7 +673,7 @@ func TestBatchEquivalence(gt *testing.T) { require.NoError(t, err) gas, err := core.IntrinsicGas(data, nil, false, true, true, false) require.NoError(t, err) - baseFee := seqEngine.l2Chain.CurrentBlock().BaseFee + baseFee := seqEngine.L2Chain().CurrentBlock().BaseFee nonce, err := seqEngCl.PendingNonceAt(t.Ctx(), addrs[userIdx]) require.NoError(t, err) tx := types.MustSignNewTx(privKeys[userIdx], signer, &types.DynamicFeeTx{ diff --git a/op-e2e/bindings/preimageoracle.go b/op-e2e/bindings/preimageoracle.go deleted file mode 100644 index 12e34f4a9a30..000000000000 --- a/op-e2e/bindings/preimageoracle.go +++ /dev/null @@ -1,1072 +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 -) - -// LibKeccakStateMatrix is an auto generated low-level Go binding around an user-defined struct. -type LibKeccakStateMatrix struct { - State [25]uint64 -} - -// PreimageOracleLeaf is an auto generated low-level Go binding around an user-defined struct. -type PreimageOracleLeaf struct { - Input []byte - Index *big.Int - StateCommitment [32]byte -} - -// 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: "0x60c06040523480156200001157600080fd5b50604051620039f9380380620039f98339810160408190526200003491620000f3565b60a0829052608081905260005b6200004f600160106200012e565b811015620000ea57600381601081106200006d576200006d62000148565b01546003826010811062000085576200008562000148565b0154604080516020810193909352820152606001604051602081830303815290604052805190602001206003826001620000c091906200015e565b60108110620000d357620000d362000148565b015580620000e18162000179565b91505062000041565b50505062000195565b600080604083850312156200010757600080fd5b505080516020909101519092909150565b634e487b7160e01b600052601160045260246000fd5b60008282101562000143576200014362000118565b500390565b634e487b7160e01b600052603260045260246000fd5b6000821982111562000174576200017462000118565b500190565b6000600182016200018e576200018e62000118565b5060010190565b60805160a051613830620001c9600039600081816105ae0152611d5101526000818161068e01526115b901526138306000f3fe6080604052600436106101cd5760003560e01c80638dc4be11116100f7578063dd24f9bf11610095578063ec5efcbc11610064578063ec5efcbc1461065f578063f3f480d91461067f578063faf37bc7146106b2578063fef2b4ed146106c557600080fd5b8063dd24f9bf1461059f578063ddcd58de146105d2578063e03110e11461060a578063e15926111461063f57600080fd5b8063b2e67ba8116100d1578063b2e67ba814610512578063b4801e611461054a578063d18534b51461056a578063da35c6641461058a57600080fd5b80638dc4be11146104835780639d53a648146104a35780639d7e8769146104f257600080fd5b806354fd4d501161016f5780637917de1d1161013e5780637917de1d146103bf5780637ac54767146103df5780638542cf50146103ff578063882856ef1461044a57600080fd5b806354fd4d50146102dd57806361238bde146103335780636551927b1461036b5780637051472e146103a357600080fd5b80632055b36b116101ab5780632055b36b146102735780633909af5c146102885780634d52b4c9146102a857806352f0f3ad146102bd57600080fd5b8063013cf08b146101d25780630359a5631461022357806304697c7814610251575b600080fd5b3480156101de57600080fd5b506101f26101ed366004612d2f565b6106f2565b6040805173ffffffffffffffffffffffffffffffffffffffff90931683526020830191909152015b60405180910390f35b34801561022f57600080fd5b5061024361023e366004612d71565b610737565b60405190815260200161021a565b34801561025d57600080fd5b5061027161026c366004612de4565b61086f565b005b34801561027f57600080fd5b50610243601081565b34801561029457600080fd5b506102716102a3366004613008565b6109a5565b3480156102b457600080fd5b50610243610bfc565b3480156102c957600080fd5b506102436102d83660046130f4565b610c17565b3480156102e957600080fd5b506103266040518060400160405280600581526020017f302e322e3000000000000000000000000000000000000000000000000000000081525081565b60405161021a919061315b565b34801561033f57600080fd5b5061024361034e3660046131ac565b600160209081526000928352604080842090915290825290205481565b34801561037757600080fd5b50610243610386366004612d71565b601560209081526000928352604080842090915290825290205481565b3480156103af57600080fd5b506102436703782dace9d9000081565b3480156103cb57600080fd5b506102716103da3660046131ce565b610cec565b3480156103eb57600080fd5b506102436103fa366004612d2f565b6111ef565b34801561040b57600080fd5b5061043a61041a3660046131ac565b600260209081526000928352604080842090915290825290205460ff1681565b604051901515815260200161021a565b34801561045657600080fd5b5061046a61046536600461326a565b611206565b60405167ffffffffffffffff909116815260200161021a565b34801561048f57600080fd5b5061027161049e36600461329d565b611260565b3480156104af57600080fd5b506102436104be366004612d71565b73ffffffffffffffffffffffffffffffffffffffff9091166000908152601860209081526040808320938352929052205490565b3480156104fe57600080fd5b5061027161050d3660046132e9565b61135b565b34801561051e57600080fd5b5061024361052d366004612d71565b601760209081526000928352604080842090915290825290205481565b34801561055657600080fd5b5061024361056536600461326a565b611512565b34801561057657600080fd5b50610271610585366004613008565b611544565b34801561059657600080fd5b50601354610243565b3480156105ab57600080fd5b507f0000000000000000000000000000000000000000000000000000000000000000610243565b3480156105de57600080fd5b506102436105ed366004612d71565b601660209081526000928352604080842090915290825290205481565b34801561061657600080fd5b5061062a6106253660046131ac565b611906565b6040805192835260208301919091520161021a565b34801561064b57600080fd5b5061027161065a36600461329d565b6119f7565b34801561066b57600080fd5b5061027161067a366004613375565b611aff565b34801561068b57600080fd5b507f0000000000000000000000000000000000000000000000000000000000000000610243565b6102716106c036600461340e565b611c85565b3480156106d157600080fd5b506102436106e0366004612d2f565b60006020819052908152604090205481565b6013818154811061070257600080fd5b60009182526020909120600290910201805460019091015473ffffffffffffffffffffffffffffffffffffffff909116915082565b73ffffffffffffffffffffffffffffffffffffffff82166000908152601560209081526040808320848452909152812054819061077a9060601c63ffffffff1690565b63ffffffff16905060005b6010811015610867578160011660010361080d5773ffffffffffffffffffffffffffffffffffffffff85166000908152601460209081526040808320878452909152902081601081106107da576107da61344a565b0154604080516020810192909252810184905260600160405160208183030381529060405280519060200120925061084e565b82600382601081106108215761082161344a565b01546040805160208101939093528201526060016040516020818303038152906040528051906020012092505b60019190911c908061085f816134a8565b915050610785565b505092915050565b600080600080608060146030823785878260140137601480870182207effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff167f06000000000000000000000000000000000000000000000000000000000000001794506000908190889084018b5afa94503d60010191506008820189106108fc5763fe2549876000526004601cfd5b60c082901b81526008018481533d6000600183013e88017ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff8015160008481526002602090815260408083208c8452825280832080547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0016600190811790915587845282528083209b83529a81528a82209290925593845283905296909120959095555050505050565b60006109b18a8a610737565b90506109d486868360208b01356109cf6109ca8d6134e0565b611ef0565b611f30565b80156109f257506109f283838360208801356109cf6109ca8a6134e0565b610a28576040517f09bde33900000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b866040013588604051602001610a3e91906135af565b6040516020818303038152906040528051906020012014610a8b576040517f1968a90200000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b836020013587602001356001610aa191906135ed565b14610ad8576040517f9a3b119900000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b610b2088610ae68680613605565b8080601f016020809104026020016040519081016040528093929190818152602001838380828437600092019190915250611f9192505050565b610b29886120ec565b836040013588604051602001610b3f91906135af565b6040516020818303038152906040528051906020012003610b8c576040517f9843145b00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b73ffffffffffffffffffffffffffffffffffffffff8a1660009081526015602090815260408083208c8452909152902080547fffffffffffffffffffffffffffffffffffffffffffffffff0000000000000000166001179055610bf08a8a33612894565b50505050505050505050565b6001610c0a6010600261378c565b610c149190613798565b81565b6000610c23868661294d565b9050610c308360086135ed565b821180610c3d5750602083115b15610c74576040517ffe25498700000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6000602081815260c085901b82526008959095528251828252600286526040808320858452875280832080547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff001660019081179091558484528752808320948352938652838220558181529384905292205592915050565b60608115610d0557610cfe86866129fa565b9050610d3f565b85858080601f0160208091040260200160405190810160405280939291908181526020018383808284376000920191909152509293505050505b3360009081526014602090815260408083208b845290915280822081516102008101928390529160109082845b815481526020019060010190808311610d6c57505050505090506000601560003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008b81526020019081526020016000205490506000610ded8260601c63ffffffff1690565b63ffffffff169050333214610e2e576040517fba092d1600000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b610e3e8260801c63ffffffff1690565b63ffffffff16600003610e7d576040517f87138d5c00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b610e878260c01c90565b67ffffffffffffffff1615610ec8576040517f475a253500000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b898114610f01576040517f60f95d5a00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b610f0e89898d8886612a73565b83516020850160888204881415608883061715610f33576307b1daf16000526004601cfd5b60405160c8810160405260005b83811015610fe3578083018051835260208101516020840152604081015160408401526060810151606084015260808101516080840152508460888301526088810460051b8b013560a883015260c882206001860195508560005b610200811015610fd8576001821615610fb85782818b0152610fd8565b8981015160009081526020938452604090209260019290921c9101610f9b565b505050608801610f40565b50505050600160106002610ff7919061378c565b6110019190613798565b81111561103a576040517f6229572300000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6110af61104d8360401c63ffffffff1690565b61105d9063ffffffff168a6135ed565b60401b7fffffffffffffffffffffffffffffffffffffffff00000000ffffffffffffffff606084901b167fffffffffffffffffffffffffffffffff0000000000000000ffffffffffffffff8516171790565b9150841561113c5777ffffffffffffffffffffffffffffffffffffffffffffffff82164260c01b1791506110e98260801c63ffffffff1690565b63ffffffff166110ff8360401c63ffffffff1690565b63ffffffff161461113c576040517f7b1dafd100000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b3360009081526014602090815260408083208e8452909152902061116290846010612ca5565b503360008181526018602090815260408083208f8452825280832080546001810182559084528284206004820401805460039092166008026101000a67ffffffffffffffff818102199093164390931602919091179055838352601582528083208f8452909152812084905560609190911b81523690601437366014016000a05050505050505050505050565b600381601081106111ff57600080fd5b0154905081565b6018602052826000526040600020602052816000526040600020818154811061122e57600080fd5b906000526020600020906004918282040191900660080292509250509054906101000a900467ffffffffffffffff1681565b60443560008060088301861061127e5763fe2549876000526004601cfd5b60c083901b60805260888386823786600882030151915060206000858360025afa9050806112ab57600080fd5b50600080517effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff167f0400000000000000000000000000000000000000000000000000000000000000178082526002602090815260408084208a8552825280842080547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff001660019081179091558385528252808420998452988152888320939093558152908190529490942055505050565b600080603087600037602060006030600060025afa806113835763f91129696000526004601cfd5b6000517effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff167f010000000000000000000000000000000000000000000000000000000000000017608081815260a08c905260c08b905260308a60e037603088609083013760008060c083600a5afa925082611405576309bde3396000526004601cfd5b6028861061141b5763fe2549876000526004601cfd5b6000602882015278200000000000000000000000000000000000000000000000008152600881018b905285810151935060308a8237603081019b909b52505060509098207effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff167f0500000000000000000000000000000000000000000000000000000000000000176000818152600260209081526040808320868452825280832080547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0016600190811790915584845282528083209583529481528482209a909a559081528089529190912096909655505050505050565b6014602052826000526040600020602052816000526040600020816010811061153a57600080fd5b0154925083915050565b73ffffffffffffffffffffffffffffffffffffffff891660009081526015602090815260408083208b845290915290205467ffffffffffffffff8116156115b7576040517fc334f06900000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b7f00000000000000000000000000000000000000000000000000000000000000006115e28260c01c90565b6115f69067ffffffffffffffff1642613798565b1161162d576040517f55d4cbf900000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b60006116398b8b610737565b905061165287878360208c01356109cf6109ca8e6134e0565b8015611670575061167084848360208901356109cf6109ca8b6134e0565b6116a6576040517f09bde33900000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b8760400135896040516020016116bc91906135af565b6040516020818303038152906040528051906020012014611709576040517f1968a90200000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b84602001358860200135600161171f91906135ed565b141580611751575060016117398360601c63ffffffff1690565b61174391906137af565b63ffffffff16856020013514155b15611788576040517f9a3b119900000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b61179689610ae68780613605565b61179f896120ec565b60006117aa8a612bc6565b7effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff167f020000000000000000000000000000000000000000000000000000000000000017905060006118018460a01c63ffffffff1690565b67ffffffffffffffff169050600160026000848152602001908152602001600020600083815260200190815260200160002060006101000a81548160ff021916908315150217905550601760008e73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008d815260200190815260200160002054600160008481526020019081526020016000206000838152602001908152602001600020819055506118d38460801c63ffffffff1690565b600083815260208190526040902063ffffffff9190911690556118f78d8d81612894565b50505050505050505050505050565b6000828152600260209081526040808320848452909152812054819060ff1661198f576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601460248201527f7072652d696d616765206d757374206578697374000000000000000000000000604482015260640160405180910390fd5b50600083815260208181526040909120546119ab8160086135ed565b6119b68560206135ed565b106119d457836119c78260086135ed565b6119d19190613798565b91505b506000938452600160209081526040808620948652939052919092205492909150565b604435600080600883018610611a155763fe2549876000526004601cfd5b60c083901b6080526088838682378087017ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff80151908490207effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff167f02000000000000000000000000000000000000000000000000000000000000001760008181526002602090815260408083208b8452825280832080547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0016600190811790915584845282528083209a83529981528982209390935590815290819052959095209190915550505050565b6000611b0b8686610737565b9050611b2483838360208801356109cf6109ca8a6134e0565b611b5a576040517f09bde33900000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b602084013515611b96576040517f9a3b119900000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b611b9e612ce3565b611bac81610ae68780613605565b611bb5816120ec565b846040013581604051602001611bcb91906135af565b6040516020818303038152906040528051906020012003611c18576040517f9843145b00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b73ffffffffffffffffffffffffffffffffffffffff87166000908152601560209081526040808320898452909152902080547fffffffffffffffffffffffffffffffffffffffffffffffff0000000000000000166001179055611c7c878733612894565b50505050505050565b6703782dace9d90000341015611cc7576040517fe92c469f00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b333214611d00576040517fba092d1600000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b611d0b8160086137d4565b63ffffffff168263ffffffff1610611d4f576040517ffe25498700000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b7f00000000000000000000000000000000000000000000000000000000000000008163ffffffff161015611daf576040517f7b1dafd100000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b336000818152601560209081526040808320878452825280832080547fffffffffffffffff0000000000000000ffffffffffffffffffffffffffffffff1660a09790971b7fffffffffffffffffffffffff00000000ffffffffffffffffffffffffffffffff169690961760809590951b949094179094558251808401845282815280850186815260138054600181018255908452915160029092027f66de8ffda797e3de9c05e8fc57b3bf0ec28a930d40b0d285d93c06501cf6a0908101805473ffffffffffffffffffffffffffffffffffffffff9094167fffffffffffffffffffffffff000000000000000000000000000000000000000090941693909317909255517f66de8ffda797e3de9c05e8fc57b3bf0ec28a930d40b0d285d93c06501cf6a0919091015590815260168352818120938152929091529020349055565b6000816000015182602001518360400151604051602001611f13939291906137fc565b604051602081830303815290604052805190602001209050919050565b60008160005b6010811015611f84578060051b880135600186831c1660018114611f695760008481526020839052604090209350611f7a565b600082815260208590526040902093505b5050600101611f36565b5090931495945050505050565b6088815114611f9f57600080fd5b6020810160208301612020565b8260031b8201518060001a8160011a60081b178160021a60101b8260031a60181b17178160041a60201b8260051a60281b178260061a60301b8360071a60381b171717905061201a81612005868560059190911b015190565b1867ffffffffffffffff16600586901b840152565b50505050565b61202c60008383611fac565b61203860018383611fac565b61204460028383611fac565b61205060038383611fac565b61205c60048383611fac565b61206860058383611fac565b61207460068383611fac565b61208060078383611fac565b61208c60088383611fac565b61209860098383611fac565b6120a4600a8383611fac565b6120b0600b8383611fac565b6120bc600c8383611fac565b6120c8600d8383611fac565b6120d4600e8383611fac565b6120e0600f8383611fac565b61201a60108383611fac565b6040805178010000000000008082800000000000808a8000000080008000602082015279808b00000000800000018000000080008081800000000000800991810191909152788a00000000000000880000000080008009000000008000000a60608201527b8000808b800000000000008b8000000000008089800000000000800360808201527f80000000000080028000000000000080000000000000800a800000008000000a60a08201527f800000008000808180000000000080800000000080000001800000008000800860c082015260009060e00160405160208183030381529060405290506020820160208201612774565b6102808101516101e082015161014083015160a0840151845118189118186102a082015161020083015161016084015160c0850151602086015118189118186102c083015161022084015161018085015160e0860151604087015118189118186102e08401516102408501516101a0860151610100870151606088015118189118186103008501516102608601516101c0870151610120880151608089015118189118188084603f1c61229f8660011b67ffffffffffffffff1690565b18188584603f1c6122ba8660011b67ffffffffffffffff1690565b18188584603f1c6122d58660011b67ffffffffffffffff1690565b181895508483603f1c6122f28560011b67ffffffffffffffff1690565b181894508387603f1c61230f8960011b67ffffffffffffffff1690565b60208b01518b51861867ffffffffffffffff168c5291189190911897508118600181901b603f9190911c18935060c08801518118601481901c602c9190911b1867ffffffffffffffff1660208901526101208801518718602c81901c60149190911b1867ffffffffffffffff1660c08901526102c08801518618600381901c603d9190911b1867ffffffffffffffff166101208901526101c08801518718601981901c60279190911b1867ffffffffffffffff166102c08901526102808801518218602e81901c60129190911b1867ffffffffffffffff166101c089015260408801518618600281901c603e9190911b1867ffffffffffffffff166102808901526101808801518618601581901c602b9190911b1867ffffffffffffffff1660408901526101a08801518518602781901c60199190911b1867ffffffffffffffff166101808901526102608801518718603881901c60089190911b1867ffffffffffffffff166101a08901526102e08801518518600881901c60389190911b1867ffffffffffffffff166102608901526101e08801518218601781901c60299190911b1867ffffffffffffffff166102e089015260808801518718602581901c601b9190911b1867ffffffffffffffff166101e08901526103008801518718603281901c600e9190911b1867ffffffffffffffff1660808901526102a08801518118603e81901c60029190911b1867ffffffffffffffff166103008901526101008801518518600981901c60379190911b1867ffffffffffffffff166102a08901526102008801518118601381901c602d9190911b1867ffffffffffffffff1661010089015260a08801518218601c81901c60249190911b1867ffffffffffffffff1661020089015260608801518518602481901c601c9190911b1867ffffffffffffffff1660a08901526102408801518518602b81901c60159190911b1867ffffffffffffffff1660608901526102208801518618603181901c600f9190911b1867ffffffffffffffff166102408901526101608801518118603681901c600a9190911b1867ffffffffffffffff166102208901525060e08701518518603a81901c60069190911b1867ffffffffffffffff166101608801526101408701518118603d81901c60039190911b1867ffffffffffffffff1660e0880152505067ffffffffffffffff81166101408601525b5050505050565b600582811b8201805160018501831b8401805160028701851b8601805160038901871b8801805160048b0190981b8901805167ffffffffffffffff861985168918811690995283198a16861889169096528819861683188816909352841986168818871690528419831684189095169052919391929190611c7c565b61270e600082612687565b612719600582612687565b612724600a82612687565b61272f600f82612687565b61273a601482612687565b50565b612746816121e2565b61274f81612703565b600383901b820151815160c09190911c9061201a90821867ffffffffffffffff168352565b6127806000828461273d565b61278c6001828461273d565b6127986002828461273d565b6127a46003828461273d565b6127b06004828461273d565b6127bc6005828461273d565b6127c86006828461273d565b6127d46007828461273d565b6127e06008828461273d565b6127ec6009828461273d565b6127f8600a828461273d565b612804600b828461273d565b612810600c828461273d565b61281c600d828461273d565b612828600e828461273d565b612834600f828461273d565b6128406010828461273d565b61284c6011828461273d565b6128586012828461273d565b6128646013828461273d565b6128706014828461273d565b61287c6015828461273d565b6128886016828461273d565b61201a6017828461273d565b73ffffffffffffffffffffffffffffffffffffffff83811660009081526016602090815260408083208684529091528082208054908390559051909284169083908381818185875af1925050503d806000811461290d576040519150601f19603f3d011682016040523d82523d6000602084013e612912565b606091505b5050905080612680576040517f83e6cc6b00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b7f01000000000000000000000000000000000000000000000000000000000000007effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff8316176129f3818360408051600093845233602052918152606090922091527effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff167f01000000000000000000000000000000000000000000000000000000000000001790565b9392505050565b6060604051905081602082018181018286833760888306808015612a435760888290038501848101848103803687375060806001820353506001845160001a1784538652612a5a565b608836843760018353608060878401536088850186525b5050505050601f19603f82510116810160405292915050565b6000612a858260a01c63ffffffff1690565b67ffffffffffffffff1690506000612aa38360801c63ffffffff1690565b63ffffffff1690506000612abd8460401c63ffffffff1690565b63ffffffff169050600883108015612ad3575080155b15612b075760c082901b6000908152883560085283513382526017602090815260408084208a855290915290912055612bbc565b60088310158015612b25575080612b1f600885613798565b93508310155b8015612b395750612b3687826135ed565b83105b15612bbc576000612b4a8285613798565b905087612b588260206135ed565b10158015612b64575085155b15612b9b576040517ffe25498700000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b3360009081526017602090815260408083208a845290915290209089013590555b5050505050505050565b6000612c49565b66ff00ff00ff00ff8160081c1667ff00ff00ff00ff00612bf78360081b67ffffffffffffffff1690565b1617905065ffff0000ffff8160101c1667ffff0000ffff0000612c248360101b67ffffffffffffffff1690565b1617905060008160201c612c428360201b67ffffffffffffffff1690565b1792915050565b60808201516020830190612c6190612bcd565b612bcd565b6040820151612c6f90612bcd565b60401b17612c87612c5c60018460059190911b015190565b825160809190911b90612c9990612bcd565b60c01b17179392505050565b8260108101928215612cd3579160200282015b82811115612cd3578251825591602001919060010190612cb8565b50612cdf929150612cfb565b5090565b6040518060200160405280612cf6612d10565b905290565b5b80821115612cdf5760008155600101612cfc565b6040518061032001604052806019906020820280368337509192915050565b600060208284031215612d4157600080fd5b5035919050565b803573ffffffffffffffffffffffffffffffffffffffff81168114612d6c57600080fd5b919050565b60008060408385031215612d8457600080fd5b612d8d83612d48565b946020939093013593505050565b60008083601f840112612dad57600080fd5b50813567ffffffffffffffff811115612dc557600080fd5b602083019150836020828501011115612ddd57600080fd5b9250929050565b60008060008060608587031215612dfa57600080fd5b84359350612e0a60208601612d48565b9250604085013567ffffffffffffffff811115612e2657600080fd5b612e3287828801612d9b565b95989497509550505050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b604051610320810167ffffffffffffffff81118282101715612e9157612e91612e3e565b60405290565b6040516060810167ffffffffffffffff81118282101715612e9157612e91612e3e565b604051601f82017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe016810167ffffffffffffffff81118282101715612f0157612f01612e3e565b604052919050565b6000610320808385031215612f1d57600080fd5b604051602080820167ffffffffffffffff8382108183111715612f4257612f42612e3e565b8160405283955087601f880112612f5857600080fd5b612f60612e6d565b9487019491508188861115612f7457600080fd5b875b86811015612f9c5780358381168114612f8f5760008081fd5b8452928401928401612f76565b50909352509295945050505050565b600060608284031215612fbd57600080fd5b50919050565b60008083601f840112612fd557600080fd5b50813567ffffffffffffffff811115612fed57600080fd5b6020830191508360208260051b8501011115612ddd57600080fd5b60008060008060008060008060006103e08a8c03121561302757600080fd5b6130308a612d48565b985060208a013597506130468b60408c01612f09565b96506103608a013567ffffffffffffffff8082111561306457600080fd5b6130708d838e01612fab565b97506103808c013591508082111561308757600080fd5b6130938d838e01612fc3565b90975095506103a08c01359150808211156130ad57600080fd5b6130b98d838e01612fab565b94506103c08c01359150808211156130d057600080fd5b506130dd8c828d01612fc3565b915080935050809150509295985092959850929598565b600080600080600060a0868803121561310c57600080fd5b505083359560208501359550604085013594606081013594506080013592509050565b60005b8381101561314a578181015183820152602001613132565b8381111561201a5750506000910152565b602081526000825180602084015261317a81604085016020870161312f565b601f017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0169190910160400192915050565b600080604083850312156131bf57600080fd5b50508035926020909101359150565b600080600080600080600060a0888a0312156131e957600080fd5b8735965060208801359550604088013567ffffffffffffffff8082111561320f57600080fd5b61321b8b838c01612d9b565b909750955060608a013591508082111561323457600080fd5b506132418a828b01612fc3565b9094509250506080880135801515811461325a57600080fd5b8091505092959891949750929550565b60008060006060848603121561327f57600080fd5b61328884612d48565b95602085013595506040909401359392505050565b6000806000604084860312156132b257600080fd5b83359250602084013567ffffffffffffffff8111156132d057600080fd5b6132dc86828701612d9b565b9497909650939450505050565b600080600080600080600060a0888a03121561330457600080fd5b8735965060208801359550604088013567ffffffffffffffff8082111561332a57600080fd5b6133368b838c01612d9b565b909750955060608a013591508082111561334f57600080fd5b5061335c8a828b01612d9b565b989b979a50959894979596608090950135949350505050565b60008060008060006080868803121561338d57600080fd5b61339686612d48565b945060208601359350604086013567ffffffffffffffff808211156133ba57600080fd5b6133c689838a01612fab565b945060608801359150808211156133dc57600080fd5b506133e988828901612fc3565b969995985093965092949392505050565b803563ffffffff81168114612d6c57600080fd5b60008060006060848603121561342357600080fd5b83359250613433602085016133fa565b9150613441604085016133fa565b90509250925092565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b60007fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff82036134d9576134d9613479565b5060010190565b6000606082360312156134f257600080fd5b6134fa612e97565b823567ffffffffffffffff8082111561351257600080fd5b9084019036601f83011261352557600080fd5b813560208282111561353957613539612e3e565b613569817fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0601f85011601612eba565b9250818352368183860101111561357f57600080fd5b81818501828501376000918301810191909152908352848101359083015250604092830135928101929092525090565b81516103208201908260005b60198110156135e457825167ffffffffffffffff168252602092830192909101906001016135bb565b50505092915050565b6000821982111561360057613600613479565b500190565b60008083357fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe184360301811261363a57600080fd5b83018035915067ffffffffffffffff82111561365557600080fd5b602001915036819003821315612ddd57600080fd5b600181815b808511156136c357817fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff048211156136a9576136a9613479565b808516156136b657918102915b93841c939080029061366f565b509250929050565b6000826136da57506001613786565b816136e757506000613786565b81600181146136fd576002811461370757613723565b6001915050613786565b60ff84111561371857613718613479565b50506001821b613786565b5060208310610133831016604e8410600b8410161715613746575081810a613786565b613750838361366a565b807fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0482111561378257613782613479565b0290505b92915050565b60006129f383836136cb565b6000828210156137aa576137aa613479565b500390565b600063ffffffff838116908316818110156137cc576137cc613479565b039392505050565b600063ffffffff8083168185168083038211156137f3576137f3613479565b01949350505050565b6000845161380e81846020890161312f565b9190910192835250602082015260400191905056fea164736f6c634300080f000a", -} - -// PreimageOracleABI is the input ABI used to generate the binding from. -// Deprecated: Use PreimageOracleMetaData.ABI instead. -var PreimageOracleABI = PreimageOracleMetaData.ABI - -// PreimageOracleBin is the compiled bytecode used for deploying new contracts. -// Deprecated: Use PreimageOracleMetaData.Bin instead. -var PreimageOracleBin = PreimageOracleMetaData.Bin - -// DeployPreimageOracle deploys a new Ethereum contract, binding an instance of PreimageOracle to it. -func DeployPreimageOracle(auth *bind.TransactOpts, backend bind.ContractBackend, _minProposalSize *big.Int, _challengePeriod *big.Int) (common.Address, *types.Transaction, *PreimageOracle, error) { - parsed, err := PreimageOracleMetaData.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(PreimageOracleBin), backend, _minProposalSize, _challengePeriod) - if err != nil { - return common.Address{}, nil, nil, err - } - return address, tx, &PreimageOracle{PreimageOracleCaller: PreimageOracleCaller{contract: contract}, PreimageOracleTransactor: PreimageOracleTransactor{contract: contract}, PreimageOracleFilterer: PreimageOracleFilterer{contract: contract}}, nil -} - -// PreimageOracle is an auto generated Go binding around an Ethereum contract. -type PreimageOracle struct { - PreimageOracleCaller // Read-only binding to the contract - PreimageOracleTransactor // Write-only binding to the contract - PreimageOracleFilterer // Log filterer for contract events -} - -// PreimageOracleCaller is an auto generated read-only Go binding around an Ethereum contract. -type PreimageOracleCaller struct { - contract *bind.BoundContract // Generic contract wrapper for the low level calls -} - -// PreimageOracleTransactor is an auto generated write-only Go binding around an Ethereum contract. -type PreimageOracleTransactor struct { - contract *bind.BoundContract // Generic contract wrapper for the low level calls -} - -// PreimageOracleFilterer is an auto generated log filtering Go binding around an Ethereum contract events. -type PreimageOracleFilterer struct { - contract *bind.BoundContract // Generic contract wrapper for the low level calls -} - -// PreimageOracleSession is an auto generated Go binding around an Ethereum contract, -// with pre-set call and transact options. -type PreimageOracleSession struct { - Contract *PreimageOracle // 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 -} - -// PreimageOracleCallerSession is an auto generated read-only Go binding around an Ethereum contract, -// with pre-set call options. -type PreimageOracleCallerSession struct { - Contract *PreimageOracleCaller // Generic contract caller binding to set the session for - CallOpts bind.CallOpts // Call options to use throughout this session -} - -// PreimageOracleTransactorSession is an auto generated write-only Go binding around an Ethereum contract, -// with pre-set transact options. -type PreimageOracleTransactorSession struct { - Contract *PreimageOracleTransactor // Generic contract transactor binding to set the session for - TransactOpts bind.TransactOpts // Transaction auth options to use throughout this session -} - -// PreimageOracleRaw is an auto generated low-level Go binding around an Ethereum contract. -type PreimageOracleRaw struct { - Contract *PreimageOracle // Generic contract binding to access the raw methods on -} - -// PreimageOracleCallerRaw is an auto generated low-level read-only Go binding around an Ethereum contract. -type PreimageOracleCallerRaw struct { - Contract *PreimageOracleCaller // Generic read-only contract binding to access the raw methods on -} - -// PreimageOracleTransactorRaw is an auto generated low-level write-only Go binding around an Ethereum contract. -type PreimageOracleTransactorRaw struct { - Contract *PreimageOracleTransactor // Generic write-only contract binding to access the raw methods on -} - -// NewPreimageOracle creates a new instance of PreimageOracle, bound to a specific deployed contract. -func NewPreimageOracle(address common.Address, backend bind.ContractBackend) (*PreimageOracle, error) { - contract, err := bindPreimageOracle(address, backend, backend, backend) - if err != nil { - return nil, err - } - return &PreimageOracle{PreimageOracleCaller: PreimageOracleCaller{contract: contract}, PreimageOracleTransactor: PreimageOracleTransactor{contract: contract}, PreimageOracleFilterer: PreimageOracleFilterer{contract: contract}}, nil -} - -// NewPreimageOracleCaller creates a new read-only instance of PreimageOracle, bound to a specific deployed contract. -func NewPreimageOracleCaller(address common.Address, caller bind.ContractCaller) (*PreimageOracleCaller, error) { - contract, err := bindPreimageOracle(address, caller, nil, nil) - if err != nil { - return nil, err - } - return &PreimageOracleCaller{contract: contract}, nil -} - -// NewPreimageOracleTransactor creates a new write-only instance of PreimageOracle, bound to a specific deployed contract. -func NewPreimageOracleTransactor(address common.Address, transactor bind.ContractTransactor) (*PreimageOracleTransactor, error) { - contract, err := bindPreimageOracle(address, nil, transactor, nil) - if err != nil { - return nil, err - } - return &PreimageOracleTransactor{contract: contract}, nil -} - -// NewPreimageOracleFilterer creates a new log filterer instance of PreimageOracle, bound to a specific deployed contract. -func NewPreimageOracleFilterer(address common.Address, filterer bind.ContractFilterer) (*PreimageOracleFilterer, error) { - contract, err := bindPreimageOracle(address, nil, nil, filterer) - if err != nil { - return nil, err - } - return &PreimageOracleFilterer{contract: contract}, nil -} - -// bindPreimageOracle binds a generic wrapper to an already deployed contract. -func bindPreimageOracle(address common.Address, caller bind.ContractCaller, transactor bind.ContractTransactor, filterer bind.ContractFilterer) (*bind.BoundContract, error) { - parsed, err := abi.JSON(strings.NewReader(PreimageOracleABI)) - 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 (_PreimageOracle *PreimageOracleRaw) Call(opts *bind.CallOpts, result *[]interface{}, method string, params ...interface{}) error { - return _PreimageOracle.Contract.PreimageOracleCaller.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 (_PreimageOracle *PreimageOracleRaw) Transfer(opts *bind.TransactOpts) (*types.Transaction, error) { - return _PreimageOracle.Contract.PreimageOracleTransactor.contract.Transfer(opts) -} - -// Transact invokes the (paid) contract method with params as input values. -func (_PreimageOracle *PreimageOracleRaw) Transact(opts *bind.TransactOpts, method string, params ...interface{}) (*types.Transaction, error) { - return _PreimageOracle.Contract.PreimageOracleTransactor.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 (_PreimageOracle *PreimageOracleCallerRaw) Call(opts *bind.CallOpts, result *[]interface{}, method string, params ...interface{}) error { - return _PreimageOracle.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 (_PreimageOracle *PreimageOracleTransactorRaw) Transfer(opts *bind.TransactOpts) (*types.Transaction, error) { - return _PreimageOracle.Contract.contract.Transfer(opts) -} - -// Transact invokes the (paid) contract method with params as input values. -func (_PreimageOracle *PreimageOracleTransactorRaw) Transact(opts *bind.TransactOpts, method string, params ...interface{}) (*types.Transaction, error) { - return _PreimageOracle.Contract.contract.Transact(opts, method, params...) -} - -// KECCAKTREEDEPTH is a free data retrieval call binding the contract method 0x2055b36b. -// -// Solidity: function KECCAK_TREE_DEPTH() view returns(uint256) -func (_PreimageOracle *PreimageOracleCaller) KECCAKTREEDEPTH(opts *bind.CallOpts) (*big.Int, error) { - var out []interface{} - err := _PreimageOracle.contract.Call(opts, &out, "KECCAK_TREE_DEPTH") - - if err != nil { - return *new(*big.Int), err - } - - out0 := *abi.ConvertType(out[0], new(*big.Int)).(**big.Int) - - return out0, err - -} - -// KECCAKTREEDEPTH is a free data retrieval call binding the contract method 0x2055b36b. -// -// Solidity: function KECCAK_TREE_DEPTH() view returns(uint256) -func (_PreimageOracle *PreimageOracleSession) KECCAKTREEDEPTH() (*big.Int, error) { - return _PreimageOracle.Contract.KECCAKTREEDEPTH(&_PreimageOracle.CallOpts) -} - -// KECCAKTREEDEPTH is a free data retrieval call binding the contract method 0x2055b36b. -// -// Solidity: function KECCAK_TREE_DEPTH() view returns(uint256) -func (_PreimageOracle *PreimageOracleCallerSession) KECCAKTREEDEPTH() (*big.Int, error) { - return _PreimageOracle.Contract.KECCAKTREEDEPTH(&_PreimageOracle.CallOpts) -} - -// MAXLEAFCOUNT is a free data retrieval call binding the contract method 0x4d52b4c9. -// -// Solidity: function MAX_LEAF_COUNT() view returns(uint256) -func (_PreimageOracle *PreimageOracleCaller) MAXLEAFCOUNT(opts *bind.CallOpts) (*big.Int, error) { - var out []interface{} - err := _PreimageOracle.contract.Call(opts, &out, "MAX_LEAF_COUNT") - - if err != nil { - return *new(*big.Int), err - } - - out0 := *abi.ConvertType(out[0], new(*big.Int)).(**big.Int) - - return out0, err - -} - -// MAXLEAFCOUNT is a free data retrieval call binding the contract method 0x4d52b4c9. -// -// Solidity: function MAX_LEAF_COUNT() view returns(uint256) -func (_PreimageOracle *PreimageOracleSession) MAXLEAFCOUNT() (*big.Int, error) { - return _PreimageOracle.Contract.MAXLEAFCOUNT(&_PreimageOracle.CallOpts) -} - -// MAXLEAFCOUNT is a free data retrieval call binding the contract method 0x4d52b4c9. -// -// Solidity: function MAX_LEAF_COUNT() view returns(uint256) -func (_PreimageOracle *PreimageOracleCallerSession) MAXLEAFCOUNT() (*big.Int, error) { - return _PreimageOracle.Contract.MAXLEAFCOUNT(&_PreimageOracle.CallOpts) -} - -// MINBONDSIZE is a free data retrieval call binding the contract method 0x7051472e. -// -// Solidity: function MIN_BOND_SIZE() view returns(uint256) -func (_PreimageOracle *PreimageOracleCaller) MINBONDSIZE(opts *bind.CallOpts) (*big.Int, error) { - var out []interface{} - err := _PreimageOracle.contract.Call(opts, &out, "MIN_BOND_SIZE") - - if err != nil { - return *new(*big.Int), err - } - - out0 := *abi.ConvertType(out[0], new(*big.Int)).(**big.Int) - - return out0, err - -} - -// MINBONDSIZE is a free data retrieval call binding the contract method 0x7051472e. -// -// Solidity: function MIN_BOND_SIZE() view returns(uint256) -func (_PreimageOracle *PreimageOracleSession) MINBONDSIZE() (*big.Int, error) { - return _PreimageOracle.Contract.MINBONDSIZE(&_PreimageOracle.CallOpts) -} - -// MINBONDSIZE is a free data retrieval call binding the contract method 0x7051472e. -// -// Solidity: function MIN_BOND_SIZE() view returns(uint256) -func (_PreimageOracle *PreimageOracleCallerSession) MINBONDSIZE() (*big.Int, error) { - return _PreimageOracle.Contract.MINBONDSIZE(&_PreimageOracle.CallOpts) -} - -// ChallengePeriod is a free data retrieval call binding the contract method 0xf3f480d9. -// -// Solidity: function challengePeriod() view returns(uint256 challengePeriod_) -func (_PreimageOracle *PreimageOracleCaller) ChallengePeriod(opts *bind.CallOpts) (*big.Int, error) { - var out []interface{} - err := _PreimageOracle.contract.Call(opts, &out, "challengePeriod") - - if err != nil { - return *new(*big.Int), err - } - - out0 := *abi.ConvertType(out[0], new(*big.Int)).(**big.Int) - - return out0, err - -} - -// ChallengePeriod is a free data retrieval call binding the contract method 0xf3f480d9. -// -// Solidity: function challengePeriod() view returns(uint256 challengePeriod_) -func (_PreimageOracle *PreimageOracleSession) ChallengePeriod() (*big.Int, error) { - return _PreimageOracle.Contract.ChallengePeriod(&_PreimageOracle.CallOpts) -} - -// ChallengePeriod is a free data retrieval call binding the contract method 0xf3f480d9. -// -// Solidity: function challengePeriod() view returns(uint256 challengePeriod_) -func (_PreimageOracle *PreimageOracleCallerSession) ChallengePeriod() (*big.Int, error) { - return _PreimageOracle.Contract.ChallengePeriod(&_PreimageOracle.CallOpts) -} - -// GetTreeRootLPP is a free data retrieval call binding the contract method 0x0359a563. -// -// Solidity: function getTreeRootLPP(address _owner, uint256 _uuid) view returns(bytes32 treeRoot_) -func (_PreimageOracle *PreimageOracleCaller) GetTreeRootLPP(opts *bind.CallOpts, _owner common.Address, _uuid *big.Int) ([32]byte, error) { - var out []interface{} - err := _PreimageOracle.contract.Call(opts, &out, "getTreeRootLPP", _owner, _uuid) - - if err != nil { - return *new([32]byte), err - } - - out0 := *abi.ConvertType(out[0], new([32]byte)).(*[32]byte) - - return out0, err - -} - -// GetTreeRootLPP is a free data retrieval call binding the contract method 0x0359a563. -// -// Solidity: function getTreeRootLPP(address _owner, uint256 _uuid) view returns(bytes32 treeRoot_) -func (_PreimageOracle *PreimageOracleSession) GetTreeRootLPP(_owner common.Address, _uuid *big.Int) ([32]byte, error) { - return _PreimageOracle.Contract.GetTreeRootLPP(&_PreimageOracle.CallOpts, _owner, _uuid) -} - -// GetTreeRootLPP is a free data retrieval call binding the contract method 0x0359a563. -// -// Solidity: function getTreeRootLPP(address _owner, uint256 _uuid) view returns(bytes32 treeRoot_) -func (_PreimageOracle *PreimageOracleCallerSession) GetTreeRootLPP(_owner common.Address, _uuid *big.Int) ([32]byte, error) { - return _PreimageOracle.Contract.GetTreeRootLPP(&_PreimageOracle.CallOpts, _owner, _uuid) -} - -// MinProposalSize is a free data retrieval call binding the contract method 0xdd24f9bf. -// -// Solidity: function minProposalSize() view returns(uint256 minProposalSize_) -func (_PreimageOracle *PreimageOracleCaller) MinProposalSize(opts *bind.CallOpts) (*big.Int, error) { - var out []interface{} - err := _PreimageOracle.contract.Call(opts, &out, "minProposalSize") - - if err != nil { - return *new(*big.Int), err - } - - out0 := *abi.ConvertType(out[0], new(*big.Int)).(**big.Int) - - return out0, err - -} - -// MinProposalSize is a free data retrieval call binding the contract method 0xdd24f9bf. -// -// Solidity: function minProposalSize() view returns(uint256 minProposalSize_) -func (_PreimageOracle *PreimageOracleSession) MinProposalSize() (*big.Int, error) { - return _PreimageOracle.Contract.MinProposalSize(&_PreimageOracle.CallOpts) -} - -// MinProposalSize is a free data retrieval call binding the contract method 0xdd24f9bf. -// -// Solidity: function minProposalSize() view returns(uint256 minProposalSize_) -func (_PreimageOracle *PreimageOracleCallerSession) MinProposalSize() (*big.Int, error) { - return _PreimageOracle.Contract.MinProposalSize(&_PreimageOracle.CallOpts) -} - -// PreimageLengths is a free data retrieval call binding the contract method 0xfef2b4ed. -// -// Solidity: function preimageLengths(bytes32 ) view returns(uint256) -func (_PreimageOracle *PreimageOracleCaller) PreimageLengths(opts *bind.CallOpts, arg0 [32]byte) (*big.Int, error) { - var out []interface{} - err := _PreimageOracle.contract.Call(opts, &out, "preimageLengths", arg0) - - if err != nil { - return *new(*big.Int), err - } - - out0 := *abi.ConvertType(out[0], new(*big.Int)).(**big.Int) - - return out0, err - -} - -// PreimageLengths is a free data retrieval call binding the contract method 0xfef2b4ed. -// -// Solidity: function preimageLengths(bytes32 ) view returns(uint256) -func (_PreimageOracle *PreimageOracleSession) PreimageLengths(arg0 [32]byte) (*big.Int, error) { - return _PreimageOracle.Contract.PreimageLengths(&_PreimageOracle.CallOpts, arg0) -} - -// PreimageLengths is a free data retrieval call binding the contract method 0xfef2b4ed. -// -// Solidity: function preimageLengths(bytes32 ) view returns(uint256) -func (_PreimageOracle *PreimageOracleCallerSession) PreimageLengths(arg0 [32]byte) (*big.Int, error) { - return _PreimageOracle.Contract.PreimageLengths(&_PreimageOracle.CallOpts, arg0) -} - -// PreimagePartOk is a free data retrieval call binding the contract method 0x8542cf50. -// -// Solidity: function preimagePartOk(bytes32 , uint256 ) view returns(bool) -func (_PreimageOracle *PreimageOracleCaller) PreimagePartOk(opts *bind.CallOpts, arg0 [32]byte, arg1 *big.Int) (bool, error) { - var out []interface{} - err := _PreimageOracle.contract.Call(opts, &out, "preimagePartOk", arg0, arg1) - - if err != nil { - return *new(bool), err - } - - out0 := *abi.ConvertType(out[0], new(bool)).(*bool) - - return out0, err - -} - -// PreimagePartOk is a free data retrieval call binding the contract method 0x8542cf50. -// -// Solidity: function preimagePartOk(bytes32 , uint256 ) view returns(bool) -func (_PreimageOracle *PreimageOracleSession) PreimagePartOk(arg0 [32]byte, arg1 *big.Int) (bool, error) { - return _PreimageOracle.Contract.PreimagePartOk(&_PreimageOracle.CallOpts, arg0, arg1) -} - -// PreimagePartOk is a free data retrieval call binding the contract method 0x8542cf50. -// -// Solidity: function preimagePartOk(bytes32 , uint256 ) view returns(bool) -func (_PreimageOracle *PreimageOracleCallerSession) PreimagePartOk(arg0 [32]byte, arg1 *big.Int) (bool, error) { - return _PreimageOracle.Contract.PreimagePartOk(&_PreimageOracle.CallOpts, arg0, arg1) -} - -// PreimageParts is a free data retrieval call binding the contract method 0x61238bde. -// -// Solidity: function preimageParts(bytes32 , uint256 ) view returns(bytes32) -func (_PreimageOracle *PreimageOracleCaller) PreimageParts(opts *bind.CallOpts, arg0 [32]byte, arg1 *big.Int) ([32]byte, error) { - var out []interface{} - err := _PreimageOracle.contract.Call(opts, &out, "preimageParts", arg0, arg1) - - if err != nil { - return *new([32]byte), err - } - - out0 := *abi.ConvertType(out[0], new([32]byte)).(*[32]byte) - - return out0, err - -} - -// PreimageParts is a free data retrieval call binding the contract method 0x61238bde. -// -// Solidity: function preimageParts(bytes32 , uint256 ) view returns(bytes32) -func (_PreimageOracle *PreimageOracleSession) PreimageParts(arg0 [32]byte, arg1 *big.Int) ([32]byte, error) { - return _PreimageOracle.Contract.PreimageParts(&_PreimageOracle.CallOpts, arg0, arg1) -} - -// PreimageParts is a free data retrieval call binding the contract method 0x61238bde. -// -// Solidity: function preimageParts(bytes32 , uint256 ) view returns(bytes32) -func (_PreimageOracle *PreimageOracleCallerSession) PreimageParts(arg0 [32]byte, arg1 *big.Int) ([32]byte, error) { - return _PreimageOracle.Contract.PreimageParts(&_PreimageOracle.CallOpts, arg0, arg1) -} - -// ProposalBlocks is a free data retrieval call binding the contract method 0x882856ef. -// -// Solidity: function proposalBlocks(address , uint256 , uint256 ) view returns(uint64) -func (_PreimageOracle *PreimageOracleCaller) ProposalBlocks(opts *bind.CallOpts, arg0 common.Address, arg1 *big.Int, arg2 *big.Int) (uint64, error) { - var out []interface{} - err := _PreimageOracle.contract.Call(opts, &out, "proposalBlocks", arg0, arg1, arg2) - - if err != nil { - return *new(uint64), err - } - - out0 := *abi.ConvertType(out[0], new(uint64)).(*uint64) - - return out0, err - -} - -// ProposalBlocks is a free data retrieval call binding the contract method 0x882856ef. -// -// Solidity: function proposalBlocks(address , uint256 , uint256 ) view returns(uint64) -func (_PreimageOracle *PreimageOracleSession) ProposalBlocks(arg0 common.Address, arg1 *big.Int, arg2 *big.Int) (uint64, error) { - return _PreimageOracle.Contract.ProposalBlocks(&_PreimageOracle.CallOpts, arg0, arg1, arg2) -} - -// ProposalBlocks is a free data retrieval call binding the contract method 0x882856ef. -// -// Solidity: function proposalBlocks(address , uint256 , uint256 ) view returns(uint64) -func (_PreimageOracle *PreimageOracleCallerSession) ProposalBlocks(arg0 common.Address, arg1 *big.Int, arg2 *big.Int) (uint64, error) { - return _PreimageOracle.Contract.ProposalBlocks(&_PreimageOracle.CallOpts, arg0, arg1, arg2) -} - -// ProposalBlocksLen is a free data retrieval call binding the contract method 0x9d53a648. -// -// Solidity: function proposalBlocksLen(address _claimant, uint256 _uuid) view returns(uint256 len_) -func (_PreimageOracle *PreimageOracleCaller) ProposalBlocksLen(opts *bind.CallOpts, _claimant common.Address, _uuid *big.Int) (*big.Int, error) { - var out []interface{} - err := _PreimageOracle.contract.Call(opts, &out, "proposalBlocksLen", _claimant, _uuid) - - if err != nil { - return *new(*big.Int), err - } - - out0 := *abi.ConvertType(out[0], new(*big.Int)).(**big.Int) - - return out0, err - -} - -// ProposalBlocksLen is a free data retrieval call binding the contract method 0x9d53a648. -// -// Solidity: function proposalBlocksLen(address _claimant, uint256 _uuid) view returns(uint256 len_) -func (_PreimageOracle *PreimageOracleSession) ProposalBlocksLen(_claimant common.Address, _uuid *big.Int) (*big.Int, error) { - return _PreimageOracle.Contract.ProposalBlocksLen(&_PreimageOracle.CallOpts, _claimant, _uuid) -} - -// ProposalBlocksLen is a free data retrieval call binding the contract method 0x9d53a648. -// -// Solidity: function proposalBlocksLen(address _claimant, uint256 _uuid) view returns(uint256 len_) -func (_PreimageOracle *PreimageOracleCallerSession) ProposalBlocksLen(_claimant common.Address, _uuid *big.Int) (*big.Int, error) { - return _PreimageOracle.Contract.ProposalBlocksLen(&_PreimageOracle.CallOpts, _claimant, _uuid) -} - -// ProposalBonds is a free data retrieval call binding the contract method 0xddcd58de. -// -// Solidity: function proposalBonds(address , uint256 ) view returns(uint256) -func (_PreimageOracle *PreimageOracleCaller) ProposalBonds(opts *bind.CallOpts, arg0 common.Address, arg1 *big.Int) (*big.Int, error) { - var out []interface{} - err := _PreimageOracle.contract.Call(opts, &out, "proposalBonds", arg0, arg1) - - if err != nil { - return *new(*big.Int), err - } - - out0 := *abi.ConvertType(out[0], new(*big.Int)).(**big.Int) - - return out0, err - -} - -// ProposalBonds is a free data retrieval call binding the contract method 0xddcd58de. -// -// Solidity: function proposalBonds(address , uint256 ) view returns(uint256) -func (_PreimageOracle *PreimageOracleSession) ProposalBonds(arg0 common.Address, arg1 *big.Int) (*big.Int, error) { - return _PreimageOracle.Contract.ProposalBonds(&_PreimageOracle.CallOpts, arg0, arg1) -} - -// ProposalBonds is a free data retrieval call binding the contract method 0xddcd58de. -// -// Solidity: function proposalBonds(address , uint256 ) view returns(uint256) -func (_PreimageOracle *PreimageOracleCallerSession) ProposalBonds(arg0 common.Address, arg1 *big.Int) (*big.Int, error) { - return _PreimageOracle.Contract.ProposalBonds(&_PreimageOracle.CallOpts, arg0, arg1) -} - -// ProposalBranches is a free data retrieval call binding the contract method 0xb4801e61. -// -// Solidity: function proposalBranches(address , uint256 , uint256 ) view returns(bytes32) -func (_PreimageOracle *PreimageOracleCaller) ProposalBranches(opts *bind.CallOpts, arg0 common.Address, arg1 *big.Int, arg2 *big.Int) ([32]byte, error) { - var out []interface{} - err := _PreimageOracle.contract.Call(opts, &out, "proposalBranches", arg0, arg1, arg2) - - if err != nil { - return *new([32]byte), err - } - - out0 := *abi.ConvertType(out[0], new([32]byte)).(*[32]byte) - - return out0, err - -} - -// ProposalBranches is a free data retrieval call binding the contract method 0xb4801e61. -// -// Solidity: function proposalBranches(address , uint256 , uint256 ) view returns(bytes32) -func (_PreimageOracle *PreimageOracleSession) ProposalBranches(arg0 common.Address, arg1 *big.Int, arg2 *big.Int) ([32]byte, error) { - return _PreimageOracle.Contract.ProposalBranches(&_PreimageOracle.CallOpts, arg0, arg1, arg2) -} - -// ProposalBranches is a free data retrieval call binding the contract method 0xb4801e61. -// -// Solidity: function proposalBranches(address , uint256 , uint256 ) view returns(bytes32) -func (_PreimageOracle *PreimageOracleCallerSession) ProposalBranches(arg0 common.Address, arg1 *big.Int, arg2 *big.Int) ([32]byte, error) { - return _PreimageOracle.Contract.ProposalBranches(&_PreimageOracle.CallOpts, arg0, arg1, arg2) -} - -// ProposalCount is a free data retrieval call binding the contract method 0xda35c664. -// -// Solidity: function proposalCount() view returns(uint256 count_) -func (_PreimageOracle *PreimageOracleCaller) ProposalCount(opts *bind.CallOpts) (*big.Int, error) { - var out []interface{} - err := _PreimageOracle.contract.Call(opts, &out, "proposalCount") - - if err != nil { - return *new(*big.Int), err - } - - out0 := *abi.ConvertType(out[0], new(*big.Int)).(**big.Int) - - return out0, err - -} - -// ProposalCount is a free data retrieval call binding the contract method 0xda35c664. -// -// Solidity: function proposalCount() view returns(uint256 count_) -func (_PreimageOracle *PreimageOracleSession) ProposalCount() (*big.Int, error) { - return _PreimageOracle.Contract.ProposalCount(&_PreimageOracle.CallOpts) -} - -// ProposalCount is a free data retrieval call binding the contract method 0xda35c664. -// -// Solidity: function proposalCount() view returns(uint256 count_) -func (_PreimageOracle *PreimageOracleCallerSession) ProposalCount() (*big.Int, error) { - return _PreimageOracle.Contract.ProposalCount(&_PreimageOracle.CallOpts) -} - -// ProposalMetadata is a free data retrieval call binding the contract method 0x6551927b. -// -// Solidity: function proposalMetadata(address , uint256 ) view returns(bytes32) -func (_PreimageOracle *PreimageOracleCaller) ProposalMetadata(opts *bind.CallOpts, arg0 common.Address, arg1 *big.Int) ([32]byte, error) { - var out []interface{} - err := _PreimageOracle.contract.Call(opts, &out, "proposalMetadata", arg0, arg1) - - if err != nil { - return *new([32]byte), err - } - - out0 := *abi.ConvertType(out[0], new([32]byte)).(*[32]byte) - - return out0, err - -} - -// ProposalMetadata is a free data retrieval call binding the contract method 0x6551927b. -// -// Solidity: function proposalMetadata(address , uint256 ) view returns(bytes32) -func (_PreimageOracle *PreimageOracleSession) ProposalMetadata(arg0 common.Address, arg1 *big.Int) ([32]byte, error) { - return _PreimageOracle.Contract.ProposalMetadata(&_PreimageOracle.CallOpts, arg0, arg1) -} - -// ProposalMetadata is a free data retrieval call binding the contract method 0x6551927b. -// -// Solidity: function proposalMetadata(address , uint256 ) view returns(bytes32) -func (_PreimageOracle *PreimageOracleCallerSession) ProposalMetadata(arg0 common.Address, arg1 *big.Int) ([32]byte, error) { - return _PreimageOracle.Contract.ProposalMetadata(&_PreimageOracle.CallOpts, arg0, arg1) -} - -// ProposalParts is a free data retrieval call binding the contract method 0xb2e67ba8. -// -// Solidity: function proposalParts(address , uint256 ) view returns(bytes32) -func (_PreimageOracle *PreimageOracleCaller) ProposalParts(opts *bind.CallOpts, arg0 common.Address, arg1 *big.Int) ([32]byte, error) { - var out []interface{} - err := _PreimageOracle.contract.Call(opts, &out, "proposalParts", arg0, arg1) - - if err != nil { - return *new([32]byte), err - } - - out0 := *abi.ConvertType(out[0], new([32]byte)).(*[32]byte) - - return out0, err - -} - -// ProposalParts is a free data retrieval call binding the contract method 0xb2e67ba8. -// -// Solidity: function proposalParts(address , uint256 ) view returns(bytes32) -func (_PreimageOracle *PreimageOracleSession) ProposalParts(arg0 common.Address, arg1 *big.Int) ([32]byte, error) { - return _PreimageOracle.Contract.ProposalParts(&_PreimageOracle.CallOpts, arg0, arg1) -} - -// ProposalParts is a free data retrieval call binding the contract method 0xb2e67ba8. -// -// Solidity: function proposalParts(address , uint256 ) view returns(bytes32) -func (_PreimageOracle *PreimageOracleCallerSession) ProposalParts(arg0 common.Address, arg1 *big.Int) ([32]byte, error) { - return _PreimageOracle.Contract.ProposalParts(&_PreimageOracle.CallOpts, arg0, arg1) -} - -// Proposals is a free data retrieval call binding the contract method 0x013cf08b. -// -// Solidity: function proposals(uint256 ) view returns(address claimant, uint256 uuid) -func (_PreimageOracle *PreimageOracleCaller) Proposals(opts *bind.CallOpts, arg0 *big.Int) (struct { - Claimant common.Address - Uuid *big.Int -}, error) { - var out []interface{} - err := _PreimageOracle.contract.Call(opts, &out, "proposals", arg0) - - outstruct := new(struct { - Claimant common.Address - Uuid *big.Int - }) - if err != nil { - return *outstruct, err - } - - outstruct.Claimant = *abi.ConvertType(out[0], new(common.Address)).(*common.Address) - outstruct.Uuid = *abi.ConvertType(out[1], new(*big.Int)).(**big.Int) - - return *outstruct, err - -} - -// Proposals is a free data retrieval call binding the contract method 0x013cf08b. -// -// Solidity: function proposals(uint256 ) view returns(address claimant, uint256 uuid) -func (_PreimageOracle *PreimageOracleSession) Proposals(arg0 *big.Int) (struct { - Claimant common.Address - Uuid *big.Int -}, error) { - return _PreimageOracle.Contract.Proposals(&_PreimageOracle.CallOpts, arg0) -} - -// Proposals is a free data retrieval call binding the contract method 0x013cf08b. -// -// Solidity: function proposals(uint256 ) view returns(address claimant, uint256 uuid) -func (_PreimageOracle *PreimageOracleCallerSession) Proposals(arg0 *big.Int) (struct { - Claimant common.Address - Uuid *big.Int -}, error) { - return _PreimageOracle.Contract.Proposals(&_PreimageOracle.CallOpts, arg0) -} - -// ReadPreimage is a free data retrieval call binding the contract method 0xe03110e1. -// -// Solidity: function readPreimage(bytes32 _key, uint256 _offset) view returns(bytes32 dat_, uint256 datLen_) -func (_PreimageOracle *PreimageOracleCaller) ReadPreimage(opts *bind.CallOpts, _key [32]byte, _offset *big.Int) (struct { - Dat [32]byte - DatLen *big.Int -}, error) { - var out []interface{} - err := _PreimageOracle.contract.Call(opts, &out, "readPreimage", _key, _offset) - - outstruct := new(struct { - Dat [32]byte - DatLen *big.Int - }) - if err != nil { - return *outstruct, err - } - - outstruct.Dat = *abi.ConvertType(out[0], new([32]byte)).(*[32]byte) - outstruct.DatLen = *abi.ConvertType(out[1], new(*big.Int)).(**big.Int) - - return *outstruct, err - -} - -// ReadPreimage is a free data retrieval call binding the contract method 0xe03110e1. -// -// Solidity: function readPreimage(bytes32 _key, uint256 _offset) view returns(bytes32 dat_, uint256 datLen_) -func (_PreimageOracle *PreimageOracleSession) ReadPreimage(_key [32]byte, _offset *big.Int) (struct { - Dat [32]byte - DatLen *big.Int -}, error) { - return _PreimageOracle.Contract.ReadPreimage(&_PreimageOracle.CallOpts, _key, _offset) -} - -// ReadPreimage is a free data retrieval call binding the contract method 0xe03110e1. -// -// Solidity: function readPreimage(bytes32 _key, uint256 _offset) view returns(bytes32 dat_, uint256 datLen_) -func (_PreimageOracle *PreimageOracleCallerSession) ReadPreimage(_key [32]byte, _offset *big.Int) (struct { - Dat [32]byte - DatLen *big.Int -}, error) { - return _PreimageOracle.Contract.ReadPreimage(&_PreimageOracle.CallOpts, _key, _offset) -} - -// Version is a free data retrieval call binding the contract method 0x54fd4d50. -// -// Solidity: function version() view returns(string) -func (_PreimageOracle *PreimageOracleCaller) Version(opts *bind.CallOpts) (string, error) { - var out []interface{} - err := _PreimageOracle.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 (_PreimageOracle *PreimageOracleSession) Version() (string, error) { - return _PreimageOracle.Contract.Version(&_PreimageOracle.CallOpts) -} - -// Version is a free data retrieval call binding the contract method 0x54fd4d50. -// -// Solidity: function version() view returns(string) -func (_PreimageOracle *PreimageOracleCallerSession) Version() (string, error) { - return _PreimageOracle.Contract.Version(&_PreimageOracle.CallOpts) -} - -// ZeroHashes is a free data retrieval call binding the contract method 0x7ac54767. -// -// Solidity: function zeroHashes(uint256 ) view returns(bytes32) -func (_PreimageOracle *PreimageOracleCaller) ZeroHashes(opts *bind.CallOpts, arg0 *big.Int) ([32]byte, error) { - var out []interface{} - err := _PreimageOracle.contract.Call(opts, &out, "zeroHashes", arg0) - - if err != nil { - return *new([32]byte), err - } - - out0 := *abi.ConvertType(out[0], new([32]byte)).(*[32]byte) - - return out0, err - -} - -// ZeroHashes is a free data retrieval call binding the contract method 0x7ac54767. -// -// Solidity: function zeroHashes(uint256 ) view returns(bytes32) -func (_PreimageOracle *PreimageOracleSession) ZeroHashes(arg0 *big.Int) ([32]byte, error) { - return _PreimageOracle.Contract.ZeroHashes(&_PreimageOracle.CallOpts, arg0) -} - -// ZeroHashes is a free data retrieval call binding the contract method 0x7ac54767. -// -// Solidity: function zeroHashes(uint256 ) view returns(bytes32) -func (_PreimageOracle *PreimageOracleCallerSession) ZeroHashes(arg0 *big.Int) ([32]byte, error) { - return _PreimageOracle.Contract.ZeroHashes(&_PreimageOracle.CallOpts, arg0) -} - -// AddLeavesLPP is a paid mutator transaction binding the contract method 0x7917de1d. -// -// Solidity: function addLeavesLPP(uint256 _uuid, uint256 _inputStartBlock, bytes _input, bytes32[] _stateCommitments, bool _finalize) returns() -func (_PreimageOracle *PreimageOracleTransactor) AddLeavesLPP(opts *bind.TransactOpts, _uuid *big.Int, _inputStartBlock *big.Int, _input []byte, _stateCommitments [][32]byte, _finalize bool) (*types.Transaction, error) { - return _PreimageOracle.contract.Transact(opts, "addLeavesLPP", _uuid, _inputStartBlock, _input, _stateCommitments, _finalize) -} - -// AddLeavesLPP is a paid mutator transaction binding the contract method 0x7917de1d. -// -// Solidity: function addLeavesLPP(uint256 _uuid, uint256 _inputStartBlock, bytes _input, bytes32[] _stateCommitments, bool _finalize) returns() -func (_PreimageOracle *PreimageOracleSession) AddLeavesLPP(_uuid *big.Int, _inputStartBlock *big.Int, _input []byte, _stateCommitments [][32]byte, _finalize bool) (*types.Transaction, error) { - return _PreimageOracle.Contract.AddLeavesLPP(&_PreimageOracle.TransactOpts, _uuid, _inputStartBlock, _input, _stateCommitments, _finalize) -} - -// AddLeavesLPP is a paid mutator transaction binding the contract method 0x7917de1d. -// -// Solidity: function addLeavesLPP(uint256 _uuid, uint256 _inputStartBlock, bytes _input, bytes32[] _stateCommitments, bool _finalize) returns() -func (_PreimageOracle *PreimageOracleTransactorSession) AddLeavesLPP(_uuid *big.Int, _inputStartBlock *big.Int, _input []byte, _stateCommitments [][32]byte, _finalize bool) (*types.Transaction, error) { - return _PreimageOracle.Contract.AddLeavesLPP(&_PreimageOracle.TransactOpts, _uuid, _inputStartBlock, _input, _stateCommitments, _finalize) -} - -// ChallengeFirstLPP is a paid mutator transaction binding the contract method 0xec5efcbc. -// -// Solidity: function challengeFirstLPP(address _claimant, uint256 _uuid, (bytes,uint256,bytes32) _postState, bytes32[] _postStateProof) returns() -func (_PreimageOracle *PreimageOracleTransactor) ChallengeFirstLPP(opts *bind.TransactOpts, _claimant common.Address, _uuid *big.Int, _postState PreimageOracleLeaf, _postStateProof [][32]byte) (*types.Transaction, error) { - return _PreimageOracle.contract.Transact(opts, "challengeFirstLPP", _claimant, _uuid, _postState, _postStateProof) -} - -// ChallengeFirstLPP is a paid mutator transaction binding the contract method 0xec5efcbc. -// -// Solidity: function challengeFirstLPP(address _claimant, uint256 _uuid, (bytes,uint256,bytes32) _postState, bytes32[] _postStateProof) returns() -func (_PreimageOracle *PreimageOracleSession) ChallengeFirstLPP(_claimant common.Address, _uuid *big.Int, _postState PreimageOracleLeaf, _postStateProof [][32]byte) (*types.Transaction, error) { - return _PreimageOracle.Contract.ChallengeFirstLPP(&_PreimageOracle.TransactOpts, _claimant, _uuid, _postState, _postStateProof) -} - -// ChallengeFirstLPP is a paid mutator transaction binding the contract method 0xec5efcbc. -// -// Solidity: function challengeFirstLPP(address _claimant, uint256 _uuid, (bytes,uint256,bytes32) _postState, bytes32[] _postStateProof) returns() -func (_PreimageOracle *PreimageOracleTransactorSession) ChallengeFirstLPP(_claimant common.Address, _uuid *big.Int, _postState PreimageOracleLeaf, _postStateProof [][32]byte) (*types.Transaction, error) { - return _PreimageOracle.Contract.ChallengeFirstLPP(&_PreimageOracle.TransactOpts, _claimant, _uuid, _postState, _postStateProof) -} - -// ChallengeLPP is a paid mutator transaction binding the contract method 0x3909af5c. -// -// Solidity: function challengeLPP(address _claimant, uint256 _uuid, (uint64[25]) _stateMatrix, (bytes,uint256,bytes32) _preState, bytes32[] _preStateProof, (bytes,uint256,bytes32) _postState, bytes32[] _postStateProof) returns() -func (_PreimageOracle *PreimageOracleTransactor) ChallengeLPP(opts *bind.TransactOpts, _claimant common.Address, _uuid *big.Int, _stateMatrix LibKeccakStateMatrix, _preState PreimageOracleLeaf, _preStateProof [][32]byte, _postState PreimageOracleLeaf, _postStateProof [][32]byte) (*types.Transaction, error) { - return _PreimageOracle.contract.Transact(opts, "challengeLPP", _claimant, _uuid, _stateMatrix, _preState, _preStateProof, _postState, _postStateProof) -} - -// ChallengeLPP is a paid mutator transaction binding the contract method 0x3909af5c. -// -// Solidity: function challengeLPP(address _claimant, uint256 _uuid, (uint64[25]) _stateMatrix, (bytes,uint256,bytes32) _preState, bytes32[] _preStateProof, (bytes,uint256,bytes32) _postState, bytes32[] _postStateProof) returns() -func (_PreimageOracle *PreimageOracleSession) ChallengeLPP(_claimant common.Address, _uuid *big.Int, _stateMatrix LibKeccakStateMatrix, _preState PreimageOracleLeaf, _preStateProof [][32]byte, _postState PreimageOracleLeaf, _postStateProof [][32]byte) (*types.Transaction, error) { - return _PreimageOracle.Contract.ChallengeLPP(&_PreimageOracle.TransactOpts, _claimant, _uuid, _stateMatrix, _preState, _preStateProof, _postState, _postStateProof) -} - -// ChallengeLPP is a paid mutator transaction binding the contract method 0x3909af5c. -// -// Solidity: function challengeLPP(address _claimant, uint256 _uuid, (uint64[25]) _stateMatrix, (bytes,uint256,bytes32) _preState, bytes32[] _preStateProof, (bytes,uint256,bytes32) _postState, bytes32[] _postStateProof) returns() -func (_PreimageOracle *PreimageOracleTransactorSession) ChallengeLPP(_claimant common.Address, _uuid *big.Int, _stateMatrix LibKeccakStateMatrix, _preState PreimageOracleLeaf, _preStateProof [][32]byte, _postState PreimageOracleLeaf, _postStateProof [][32]byte) (*types.Transaction, error) { - return _PreimageOracle.Contract.ChallengeLPP(&_PreimageOracle.TransactOpts, _claimant, _uuid, _stateMatrix, _preState, _preStateProof, _postState, _postStateProof) -} - -// InitLPP is a paid mutator transaction binding the contract method 0xfaf37bc7. -// -// Solidity: function initLPP(uint256 _uuid, uint32 _partOffset, uint32 _claimedSize) payable returns() -func (_PreimageOracle *PreimageOracleTransactor) InitLPP(opts *bind.TransactOpts, _uuid *big.Int, _partOffset uint32, _claimedSize uint32) (*types.Transaction, error) { - return _PreimageOracle.contract.Transact(opts, "initLPP", _uuid, _partOffset, _claimedSize) -} - -// InitLPP is a paid mutator transaction binding the contract method 0xfaf37bc7. -// -// Solidity: function initLPP(uint256 _uuid, uint32 _partOffset, uint32 _claimedSize) payable returns() -func (_PreimageOracle *PreimageOracleSession) InitLPP(_uuid *big.Int, _partOffset uint32, _claimedSize uint32) (*types.Transaction, error) { - return _PreimageOracle.Contract.InitLPP(&_PreimageOracle.TransactOpts, _uuid, _partOffset, _claimedSize) -} - -// InitLPP is a paid mutator transaction binding the contract method 0xfaf37bc7. -// -// Solidity: function initLPP(uint256 _uuid, uint32 _partOffset, uint32 _claimedSize) payable returns() -func (_PreimageOracle *PreimageOracleTransactorSession) InitLPP(_uuid *big.Int, _partOffset uint32, _claimedSize uint32) (*types.Transaction, error) { - return _PreimageOracle.Contract.InitLPP(&_PreimageOracle.TransactOpts, _uuid, _partOffset, _claimedSize) -} - -// LoadBlobPreimagePart is a paid mutator transaction binding the contract method 0x9d7e8769. -// -// Solidity: function loadBlobPreimagePart(uint256 _z, uint256 _y, bytes _commitment, bytes _proof, uint256 _partOffset) returns() -func (_PreimageOracle *PreimageOracleTransactor) LoadBlobPreimagePart(opts *bind.TransactOpts, _z *big.Int, _y *big.Int, _commitment []byte, _proof []byte, _partOffset *big.Int) (*types.Transaction, error) { - return _PreimageOracle.contract.Transact(opts, "loadBlobPreimagePart", _z, _y, _commitment, _proof, _partOffset) -} - -// LoadBlobPreimagePart is a paid mutator transaction binding the contract method 0x9d7e8769. -// -// Solidity: function loadBlobPreimagePart(uint256 _z, uint256 _y, bytes _commitment, bytes _proof, uint256 _partOffset) returns() -func (_PreimageOracle *PreimageOracleSession) LoadBlobPreimagePart(_z *big.Int, _y *big.Int, _commitment []byte, _proof []byte, _partOffset *big.Int) (*types.Transaction, error) { - return _PreimageOracle.Contract.LoadBlobPreimagePart(&_PreimageOracle.TransactOpts, _z, _y, _commitment, _proof, _partOffset) -} - -// LoadBlobPreimagePart is a paid mutator transaction binding the contract method 0x9d7e8769. -// -// Solidity: function loadBlobPreimagePart(uint256 _z, uint256 _y, bytes _commitment, bytes _proof, uint256 _partOffset) returns() -func (_PreimageOracle *PreimageOracleTransactorSession) LoadBlobPreimagePart(_z *big.Int, _y *big.Int, _commitment []byte, _proof []byte, _partOffset *big.Int) (*types.Transaction, error) { - return _PreimageOracle.Contract.LoadBlobPreimagePart(&_PreimageOracle.TransactOpts, _z, _y, _commitment, _proof, _partOffset) -} - -// LoadKeccak256PreimagePart is a paid mutator transaction binding the contract method 0xe1592611. -// -// Solidity: function loadKeccak256PreimagePart(uint256 _partOffset, bytes _preimage) returns() -func (_PreimageOracle *PreimageOracleTransactor) LoadKeccak256PreimagePart(opts *bind.TransactOpts, _partOffset *big.Int, _preimage []byte) (*types.Transaction, error) { - return _PreimageOracle.contract.Transact(opts, "loadKeccak256PreimagePart", _partOffset, _preimage) -} - -// LoadKeccak256PreimagePart is a paid mutator transaction binding the contract method 0xe1592611. -// -// Solidity: function loadKeccak256PreimagePart(uint256 _partOffset, bytes _preimage) returns() -func (_PreimageOracle *PreimageOracleSession) LoadKeccak256PreimagePart(_partOffset *big.Int, _preimage []byte) (*types.Transaction, error) { - return _PreimageOracle.Contract.LoadKeccak256PreimagePart(&_PreimageOracle.TransactOpts, _partOffset, _preimage) -} - -// LoadKeccak256PreimagePart is a paid mutator transaction binding the contract method 0xe1592611. -// -// Solidity: function loadKeccak256PreimagePart(uint256 _partOffset, bytes _preimage) returns() -func (_PreimageOracle *PreimageOracleTransactorSession) LoadKeccak256PreimagePart(_partOffset *big.Int, _preimage []byte) (*types.Transaction, error) { - return _PreimageOracle.Contract.LoadKeccak256PreimagePart(&_PreimageOracle.TransactOpts, _partOffset, _preimage) -} - -// LoadLocalData is a paid mutator transaction binding the contract method 0x52f0f3ad. -// -// Solidity: function loadLocalData(uint256 _ident, bytes32 _localContext, bytes32 _word, uint256 _size, uint256 _partOffset) returns(bytes32 key_) -func (_PreimageOracle *PreimageOracleTransactor) LoadLocalData(opts *bind.TransactOpts, _ident *big.Int, _localContext [32]byte, _word [32]byte, _size *big.Int, _partOffset *big.Int) (*types.Transaction, error) { - return _PreimageOracle.contract.Transact(opts, "loadLocalData", _ident, _localContext, _word, _size, _partOffset) -} - -// LoadLocalData is a paid mutator transaction binding the contract method 0x52f0f3ad. -// -// Solidity: function loadLocalData(uint256 _ident, bytes32 _localContext, bytes32 _word, uint256 _size, uint256 _partOffset) returns(bytes32 key_) -func (_PreimageOracle *PreimageOracleSession) LoadLocalData(_ident *big.Int, _localContext [32]byte, _word [32]byte, _size *big.Int, _partOffset *big.Int) (*types.Transaction, error) { - return _PreimageOracle.Contract.LoadLocalData(&_PreimageOracle.TransactOpts, _ident, _localContext, _word, _size, _partOffset) -} - -// LoadLocalData is a paid mutator transaction binding the contract method 0x52f0f3ad. -// -// Solidity: function loadLocalData(uint256 _ident, bytes32 _localContext, bytes32 _word, uint256 _size, uint256 _partOffset) returns(bytes32 key_) -func (_PreimageOracle *PreimageOracleTransactorSession) LoadLocalData(_ident *big.Int, _localContext [32]byte, _word [32]byte, _size *big.Int, _partOffset *big.Int) (*types.Transaction, error) { - return _PreimageOracle.Contract.LoadLocalData(&_PreimageOracle.TransactOpts, _ident, _localContext, _word, _size, _partOffset) -} - -// LoadPrecompilePreimagePart is a paid mutator transaction binding the contract method 0x04697c78. -// -// Solidity: function loadPrecompilePreimagePart(uint256 _partOffset, address _precompile, bytes _input) returns() -func (_PreimageOracle *PreimageOracleTransactor) LoadPrecompilePreimagePart(opts *bind.TransactOpts, _partOffset *big.Int, _precompile common.Address, _input []byte) (*types.Transaction, error) { - return _PreimageOracle.contract.Transact(opts, "loadPrecompilePreimagePart", _partOffset, _precompile, _input) -} - -// LoadPrecompilePreimagePart is a paid mutator transaction binding the contract method 0x04697c78. -// -// Solidity: function loadPrecompilePreimagePart(uint256 _partOffset, address _precompile, bytes _input) returns() -func (_PreimageOracle *PreimageOracleSession) LoadPrecompilePreimagePart(_partOffset *big.Int, _precompile common.Address, _input []byte) (*types.Transaction, error) { - return _PreimageOracle.Contract.LoadPrecompilePreimagePart(&_PreimageOracle.TransactOpts, _partOffset, _precompile, _input) -} - -// LoadPrecompilePreimagePart is a paid mutator transaction binding the contract method 0x04697c78. -// -// Solidity: function loadPrecompilePreimagePart(uint256 _partOffset, address _precompile, bytes _input) returns() -func (_PreimageOracle *PreimageOracleTransactorSession) LoadPrecompilePreimagePart(_partOffset *big.Int, _precompile common.Address, _input []byte) (*types.Transaction, error) { - return _PreimageOracle.Contract.LoadPrecompilePreimagePart(&_PreimageOracle.TransactOpts, _partOffset, _precompile, _input) -} - -// LoadSha256PreimagePart is a paid mutator transaction binding the contract method 0x8dc4be11. -// -// Solidity: function loadSha256PreimagePart(uint256 _partOffset, bytes _preimage) returns() -func (_PreimageOracle *PreimageOracleTransactor) LoadSha256PreimagePart(opts *bind.TransactOpts, _partOffset *big.Int, _preimage []byte) (*types.Transaction, error) { - return _PreimageOracle.contract.Transact(opts, "loadSha256PreimagePart", _partOffset, _preimage) -} - -// LoadSha256PreimagePart is a paid mutator transaction binding the contract method 0x8dc4be11. -// -// Solidity: function loadSha256PreimagePart(uint256 _partOffset, bytes _preimage) returns() -func (_PreimageOracle *PreimageOracleSession) LoadSha256PreimagePart(_partOffset *big.Int, _preimage []byte) (*types.Transaction, error) { - return _PreimageOracle.Contract.LoadSha256PreimagePart(&_PreimageOracle.TransactOpts, _partOffset, _preimage) -} - -// LoadSha256PreimagePart is a paid mutator transaction binding the contract method 0x8dc4be11. -// -// Solidity: function loadSha256PreimagePart(uint256 _partOffset, bytes _preimage) returns() -func (_PreimageOracle *PreimageOracleTransactorSession) LoadSha256PreimagePart(_partOffset *big.Int, _preimage []byte) (*types.Transaction, error) { - return _PreimageOracle.Contract.LoadSha256PreimagePart(&_PreimageOracle.TransactOpts, _partOffset, _preimage) -} - -// SqueezeLPP is a paid mutator transaction binding the contract method 0xd18534b5. -// -// Solidity: function squeezeLPP(address _claimant, uint256 _uuid, (uint64[25]) _stateMatrix, (bytes,uint256,bytes32) _preState, bytes32[] _preStateProof, (bytes,uint256,bytes32) _postState, bytes32[] _postStateProof) returns() -func (_PreimageOracle *PreimageOracleTransactor) SqueezeLPP(opts *bind.TransactOpts, _claimant common.Address, _uuid *big.Int, _stateMatrix LibKeccakStateMatrix, _preState PreimageOracleLeaf, _preStateProof [][32]byte, _postState PreimageOracleLeaf, _postStateProof [][32]byte) (*types.Transaction, error) { - return _PreimageOracle.contract.Transact(opts, "squeezeLPP", _claimant, _uuid, _stateMatrix, _preState, _preStateProof, _postState, _postStateProof) -} - -// SqueezeLPP is a paid mutator transaction binding the contract method 0xd18534b5. -// -// Solidity: function squeezeLPP(address _claimant, uint256 _uuid, (uint64[25]) _stateMatrix, (bytes,uint256,bytes32) _preState, bytes32[] _preStateProof, (bytes,uint256,bytes32) _postState, bytes32[] _postStateProof) returns() -func (_PreimageOracle *PreimageOracleSession) SqueezeLPP(_claimant common.Address, _uuid *big.Int, _stateMatrix LibKeccakStateMatrix, _preState PreimageOracleLeaf, _preStateProof [][32]byte, _postState PreimageOracleLeaf, _postStateProof [][32]byte) (*types.Transaction, error) { - return _PreimageOracle.Contract.SqueezeLPP(&_PreimageOracle.TransactOpts, _claimant, _uuid, _stateMatrix, _preState, _preStateProof, _postState, _postStateProof) -} - -// SqueezeLPP is a paid mutator transaction binding the contract method 0xd18534b5. -// -// Solidity: function squeezeLPP(address _claimant, uint256 _uuid, (uint64[25]) _stateMatrix, (bytes,uint256,bytes32) _preState, bytes32[] _preStateProof, (bytes,uint256,bytes32) _postState, bytes32[] _postStateProof) returns() -func (_PreimageOracle *PreimageOracleTransactorSession) SqueezeLPP(_claimant common.Address, _uuid *big.Int, _stateMatrix LibKeccakStateMatrix, _preState PreimageOracleLeaf, _preStateProof [][32]byte, _postState PreimageOracleLeaf, _postStateProof [][32]byte) (*types.Transaction, error) { - return _PreimageOracle.Contract.SqueezeLPP(&_PreimageOracle.TransactOpts, _claimant, _uuid, _stateMatrix, _preState, _preStateProof, _postState, _postStateProof) -} diff --git a/op-e2e/config/init.go b/op-e2e/config/init.go index 21034c04a7d4..526c7a96b389 100644 --- a/op-e2e/config/init.go +++ b/op-e2e/config/init.go @@ -5,16 +5,16 @@ import ( "errors" "flag" "fmt" + "log/slog" "os" "path/filepath" "testing" "time" - "golang.org/x/exp/slog" - "github.com/ethereum/go-ethereum/common/hexutil" "github.com/ethereum/go-ethereum/log" + "github.com/ethereum-optimism/optimism/op-chain-ops/foundry" "github.com/ethereum-optimism/optimism/op-chain-ops/genesis" "github.com/ethereum-optimism/optimism/op-e2e/external" op_service "github.com/ethereum-optimism/optimism/op-service" @@ -39,12 +39,12 @@ var ( // in end to end tests. // L1Allocs represents the L1 genesis block state. - L1Allocs *genesis.ForgeAllocs + L1Allocs *foundry.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 + l2Allocs map[genesis.L2AllocsMode]*foundry.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 @@ -107,22 +107,20 @@ func init() { return } - L1Allocs, err = genesis.LoadForgeAllocs(l1AllocsPath) + L1Allocs, err = foundry.LoadForgeAllocs(l1AllocsPath) if err != nil { panic(err) } - l2Allocs = make(map[genesis.L2AllocsMode]*genesis.ForgeAllocs) + l2Allocs = make(map[genesis.L2AllocsMode]*foundry.ForgeAllocs) mustL2Allocs := func(mode genesis.L2AllocsMode) { - name := "allocs-l2" - if mode != "" { - name += "-" + string(mode) - } - allocs, err := genesis.LoadForgeAllocs(filepath.Join(l2AllocsDir, name+".json")) + name := "allocs-l2-" + string(mode) + allocs, err := foundry.LoadForgeAllocs(filepath.Join(l2AllocsDir, name+".json")) if err != nil { panic(err) } l2Allocs[mode] = allocs } + mustL2Allocs(genesis.L2AllocsGranite) mustL2Allocs(genesis.L2AllocsFjord) mustL2Allocs(genesis.L2AllocsEcotone) mustL2Allocs(genesis.L2AllocsDelta) @@ -156,7 +154,7 @@ func init() { } } -func L2Allocs(mode genesis.L2AllocsMode) *genesis.ForgeAllocs { +func L2Allocs(mode genesis.L2AllocsMode) *foundry.ForgeAllocs { allocs, ok := l2Allocs[mode] if !ok { panic(fmt.Errorf("unknown L2 allocs mode: %q", mode)) diff --git a/op-e2e/custom_gas_token_test.go b/op-e2e/custom_gas_token_test.go deleted file mode 100644 index 2b22790dea8a..000000000000 --- a/op-e2e/custom_gas_token_test.go +++ /dev/null @@ -1,456 +0,0 @@ -package op_e2e - -import ( - "context" - "fmt" - "math/big" - "testing" - - "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/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) - - // 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) - } 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/devnet/devnet_test.go b/op-e2e/devnet/devnet_test.go new file mode 100644 index 000000000000..8bf7bd7665da --- /dev/null +++ b/op-e2e/devnet/devnet_test.go @@ -0,0 +1,51 @@ +package devnet + +import ( + "context" + "log/slog" + "testing" + "time" + + "github.com/stretchr/testify/assert" + "github.com/stretchr/testify/require" + + "github.com/ethereum-optimism/optimism/op-e2e/system/bridge" + "github.com/ethereum-optimism/optimism/op-service/testlog" +) + +func TestDevnet(t *testing.T) { + lgr := testlog.Logger(t, slog.LevelDebug) + ctx, done := context.WithTimeout(context.Background(), time.Minute) + defer done() + + sys, err := NewSystem(ctx, lgr) + require.NoError(t, err) + + t.Run("SyncFinalized", func(t *testing.T) { + // SyncFinalized can run in parallel to Withdrawals test, because propopser + // already posts unfinalized output roots in devnet mode. + t.Parallel() + testSyncFinalized(t, sys) + }) + t.Run("Withdrawal", func(t *testing.T) { + t.Parallel() + bridge.RunWithdrawalsTest(t, sys) + }) +} + +func testSyncFinalized(t *testing.T, sys *System) { + const timeout = 4 * time.Minute + ctx, done := context.WithTimeout(context.Background(), timeout) + defer done() + + require.EventuallyWithT(t, func(tc *assert.CollectT) { + ss, err := sys.Rollup.SyncStatus(ctx) + assert.NoError(tc, err) + if err != nil { + t.Log(err) + return + } + t.Logf("SyncStatus: %+v", ss) + assert.NotZero(tc, ss.FinalizedL2.Number) + }, timeout, 2*time.Second) +} diff --git a/op-e2e/devnet/setup.go b/op-e2e/devnet/setup.go new file mode 100644 index 000000000000..557caed0388b --- /dev/null +++ b/op-e2e/devnet/setup.go @@ -0,0 +1,105 @@ +package devnet + +import ( + "context" + "crypto/ecdsa" + "os" + "path/filepath" + + "github.com/ethereum-optimism/optimism/op-e2e/system/e2esys" + + "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" + op_service "github.com/ethereum-optimism/optimism/op-service" + "github.com/ethereum-optimism/optimism/op-service/dial" + "github.com/ethereum-optimism/optimism/op-service/sources" + + "github.com/ethereum/go-ethereum/ethclient" + "github.com/ethereum/go-ethereum/log" +) + +// TODO(#10968): read from docker-compose.yml +const ( + L1RPCURL = "http://127.0.0.1:8545" + L2RPCURL = "http://127.0.0.1:9545" + RollupURL = "http://127.0.0.1:7545" +) + +type System struct { + L1 *ethclient.Client + L2 *ethclient.Client + Rollup *sources.RollupClient + Cfg e2esys.SystemConfig +} + +func NewSystem(ctx context.Context, lgr log.Logger) (sys *System, err error) { + sys = new(System) + sys.L1, err = dial.DialEthClientWithTimeout(ctx, dial.DefaultDialTimeout, lgr, L1RPCURL) + if err != nil { + return nil, err + } + sys.L2, err = dial.DialEthClientWithTimeout(ctx, dial.DefaultDialTimeout, lgr, L2RPCURL) + if err != nil { + return nil, err + } + sys.Rollup, err = dial.DialRollupClientWithTimeout(ctx, dial.DefaultDialTimeout, lgr, RollupURL) + if err != nil { + return nil, err + } + + secrets, err := e2eutils.DefaultMnemonicConfig.Secrets() + if err != nil { + return nil, err + } + + // TODO(#10968): We need to re-read the deploy config because op-e2e/config.init() overwrites + // some deploy config variables. This will be fixed soon. + cwd, err := os.Getwd() + if err != nil { + return nil, err + } + root, err := op_service.FindMonorepoRoot(cwd) + if err != nil { + return nil, err + } + deployConfigPath := filepath.Join(root, "packages", "contracts-bedrock", "deploy-config", "devnetL1.json") + deployConfig, err := genesis.NewDeployConfig(deployConfigPath) + if err != nil { + return nil, err + } + + // Incomplete SystemConfig suffices for withdrawal test (only consumer right now) + sys.Cfg = e2esys.SystemConfig{ + DeployConfig: deployConfig, + L1Deployments: config.L1Deployments.Copy(), + Secrets: secrets, + } + return sys, nil +} + +func (s System) NodeClient(role string) *ethclient.Client { + switch role { + case e2esys.RoleL1: + return s.L1 + case e2esys.RoleSeq, e2esys.RoleVerif: + // we have only one L2 node + return s.L2 + default: + panic("devnet.System: unknown role: " + role) + } +} + +func (s System) RollupClient(string) *sources.RollupClient { + // we ignore role, have only one L2 rollup + return s.Rollup +} + +func (s System) Config() e2esys.SystemConfig { + return s.Cfg +} + +func (s System) TestAccount(idx int) *ecdsa.PrivateKey { + // first 12 indices are in use by the devnet + return s.Cfg.Secrets.AccountAtIdx(13 + idx) +} diff --git a/op-e2e/e2e.go b/op-e2e/e2e.go new file mode 100644 index 000000000000..ebcf5750e381 --- /dev/null +++ b/op-e2e/e2e.go @@ -0,0 +1,128 @@ +package op_e2e + +import ( + "crypto/md5" + "fmt" + "os" + "runtime" + "strconv" + "strings" + "testing" + + "github.com/ethereum-optimism/optimism/op-e2e/config" + "github.com/ethereum-optimism/optimism/op-e2e/e2eutils" +) + +func RunMain(m *testing.M) { + if config.ExternalL2Shim != "" { + fmt.Println("Running tests with external L2 process adapter at ", config.ExternalL2Shim) + // As these are integration tests which launch many other processes, the + // default parallelism makes the tests flaky. This change aims to + // reduce the flakiness of these tests. + maxProcs := runtime.NumCPU() / 4 + if maxProcs == 0 { + maxProcs = 1 + } + runtime.GOMAXPROCS(maxProcs) + } + + os.Exit(m.Run()) +} + +var enableParallelTesting bool = os.Getenv("OP_E2E_DISABLE_PARALLEL") != "true" + +func InitParallel(t e2eutils.TestingBase, args ...func(t e2eutils.TestingBase)) { + t.Helper() + if enableParallelTesting { + t.Parallel() + } + for _, arg := range args { + arg(t) + } + autoAllocateExecutor(t) +} + +// isSubTest determines if the test is a sub-test or top level test. +// It does this by checking if the test name contains / +// This is not a particularly great way check, but appears to be the only option currently. +func isSubTest(t e2eutils.TestingBase) bool { + return strings.Contains(t.Name(), "/") +} + +func autoAllocateExecutor(t e2eutils.TestingBase) { + if isSubTest(t) { + // Always run subtests, they only start on the same executor as their parent. + return + } + info := getExecutorInfo(t) + tName := t.Name() + tHash := md5.Sum([]byte(tName)) + executor := uint64(tHash[0]) % info.total + checkExecutor(t, info, executor) +} + +func UsesCannon(t e2eutils.TestingBase) { + if os.Getenv("OP_E2E_CANNON_ENABLED") == "false" { + t.Skip("Skipping cannon test") + } +} + +func SkipOnFaultProofs(t e2eutils.TestingBase) { + if e2eutils.UseFaultProofs() { + t.Skip("Skipping test for fault proofs") + } +} + +func SkipOnL2OO(t e2eutils.TestingBase) { + if e2eutils.UseL2OO() { + t.Skip("Skipping test for L2OO") + } +} + +type executorInfo struct { + total uint64 + idx uint64 + splitInUse bool +} + +func getExecutorInfo(t e2eutils.TestingBase) executorInfo { + var info executorInfo + envTotal := os.Getenv("CIRCLE_NODE_TOTAL") + envIdx := os.Getenv("CIRCLE_NODE_INDEX") + if envTotal == "" || envIdx == "" { + // Not using test splitting, so ignore assigned executor + t.Logf("Test splitting not in use.") + info.total = 1 + return info + } + total, err := strconv.ParseUint(envTotal, 10, 0) + if err != nil { + t.Fatalf("Could not parse CIRCLE_NODE_TOTAL env var %v: %v", envTotal, err) + } + idx, err := strconv.ParseUint(envIdx, 10, 0) + if err != nil { + t.Fatalf("Could not parse CIRCLE_NODE_INDEX env var %v: %v", envIdx, err) + } + + info.total = total + info.idx = idx + info.splitInUse = true + return info +} + +func checkExecutor(t e2eutils.TestingBase, info executorInfo, assignedIdx uint64) { + if !info.splitInUse { + t.Logf("Test splitting not in use.") + return + } + + if assignedIdx >= info.total && info.idx == info.total-1 { + t.Logf("Running test. Current executor (%v) is the last executor and assigned executor (%v) >= total executors (%v).", info.idx, assignedIdx, info.total) + return + } + if info.idx == assignedIdx { + t.Logf("Running test. Assigned executor (%v) matches current executor (%v) of total (%v)", assignedIdx, info.idx, info.total) + return + } + t.Skipf("Skipping test. Assigned executor %v, current executor %v of total %v", assignedIdx, info.idx, info.total) +} diff --git a/op-e2e/e2eutils/blobs.go b/op-e2e/e2eutils/blobs.go index 730aae1d94c5..791130470eda 100644 --- a/op-e2e/e2eutils/blobs.go +++ b/op-e2e/e2eutils/blobs.go @@ -5,7 +5,7 @@ import ( "fmt" "github.com/ethereum/go-ethereum" - "github.com/ethereum/go-ethereum/common" + "github.com/ethereum/go-ethereum/crypto/kzg4844" "github.com/ethereum-optimism/optimism/op-node/rollup/derive" "github.com/ethereum-optimism/optimism/op-service/eth" @@ -13,31 +13,31 @@ import ( // BlobsStore is a simple in-memory store of blobs, for testing purposes type BlobsStore struct { - // blockhash -> blob versioned hash -> blob - blobs map[common.Hash]map[common.Hash]*eth.Blob + // block timestamp -> blob versioned hash -> blob + blobs map[uint64]map[eth.IndexedBlobHash]*eth.Blob } func NewBlobStore() *BlobsStore { - return &BlobsStore{blobs: make(map[common.Hash]map[common.Hash]*eth.Blob)} + return &BlobsStore{blobs: make(map[uint64]map[eth.IndexedBlobHash]*eth.Blob)} } -func (store *BlobsStore) StoreBlob(blockHash common.Hash, versionedHash common.Hash, blob *eth.Blob) { - m, ok := store.blobs[blockHash] +func (store *BlobsStore) StoreBlob(blockTime uint64, indexedHash eth.IndexedBlobHash, blob *eth.Blob) { + m, ok := store.blobs[blockTime] if !ok { - m = make(map[common.Hash]*eth.Blob) - store.blobs[blockHash] = m + m = make(map[eth.IndexedBlobHash]*eth.Blob) + store.blobs[blockTime] = m } - m[versionedHash] = blob + m[indexedHash] = blob } func (store *BlobsStore) GetBlobs(ctx context.Context, ref eth.L1BlockRef, hashes []eth.IndexedBlobHash) ([]*eth.Blob, error) { out := make([]*eth.Blob, 0, len(hashes)) - m, ok := store.blobs[ref.Hash] + m, ok := store.blobs[ref.Time] if !ok { return nil, fmt.Errorf("no blobs known with given time: %w", ethereum.NotFound) } for _, h := range hashes { - b, ok := m[h.Hash] + b, ok := m[h] if !ok { return nil, fmt.Errorf("blob %d %s is not in store: %w", h.Index, h.Hash, ethereum.NotFound) } @@ -46,4 +46,66 @@ func (store *BlobsStore) GetBlobs(ctx context.Context, ref eth.L1BlockRef, hashe return out, nil } +func (store *BlobsStore) GetBlobSidecars(ctx context.Context, ref eth.L1BlockRef, hashes []eth.IndexedBlobHash) ([]*eth.BlobSidecar, error) { + out := make([]*eth.BlobSidecar, 0, len(hashes)) + m, ok := store.blobs[ref.Time] + if !ok { + return nil, fmt.Errorf("no blobs known with given time: %w", ethereum.NotFound) + } + for _, h := range hashes { + b, ok := m[h] + if !ok { + return nil, fmt.Errorf("blob %d %s is not in store: %w", h.Index, h.Hash, ethereum.NotFound) + } + if b == nil { + return nil, fmt.Errorf("blob %d %s is nil, cannot copy: %w", h.Index, h.Hash, ethereum.NotFound) + } + + commitment, err := kzg4844.BlobToCommitment(b.KZGBlob()) + if err != nil { + return nil, fmt.Errorf("failed to convert blob to commitment: %w", err) + } + proof, err := kzg4844.ComputeBlobProof(b.KZGBlob(), commitment) + if err != nil { + return nil, fmt.Errorf("failed to compute blob proof: %w", err) + } + out = append(out, ð.BlobSidecar{ + Index: eth.Uint64String(h.Index), + Blob: *b, + KZGCommitment: eth.Bytes48(commitment), + KZGProof: eth.Bytes48(proof), + }) + } + return out, nil +} + +func (store *BlobsStore) GetAllSidecars(ctx context.Context, l1Timestamp uint64) ([]*eth.BlobSidecar, error) { + m, ok := store.blobs[l1Timestamp] + if !ok { + return nil, fmt.Errorf("no blobs known with given time: %w", ethereum.NotFound) + } + out := make([]*eth.BlobSidecar, len(m)) + for h, b := range m { + if b == nil { + return nil, fmt.Errorf("blob %d %s is nil, cannot copy: %w", h.Index, h.Hash, ethereum.NotFound) + } + + commitment, err := kzg4844.BlobToCommitment(b.KZGBlob()) + if err != nil { + return nil, fmt.Errorf("failed to convert blob to commitment: %w", err) + } + proof, err := kzg4844.ComputeBlobProof(b.KZGBlob(), commitment) + if err != nil { + return nil, fmt.Errorf("failed to compute blob proof: %w", err) + } + out[h.Index] = ð.BlobSidecar{ + Index: eth.Uint64String(h.Index), + Blob: *b, + KZGCommitment: eth.Bytes48(commitment), + KZGProof: eth.Bytes48(proof), + } + } + return out, nil +} + var _ derive.L1BlobsFetcher = (*BlobsStore)(nil) diff --git a/op-e2e/e2eutils/challenger/helper.go b/op-e2e/e2eutils/challenger/helper.go index a01ef9ed616c..87a51d96a5f0 100644 --- a/op-e2e/e2eutils/challenger/helper.go +++ b/op-e2e/e2eutils/challenger/helper.go @@ -11,7 +11,8 @@ import ( "testing" "time" - "github.com/ethereum-optimism/optimism/op-service/metrics" + "github.com/ethereum-optimism/optimism/op-service/crypto" + "github.com/ethereum/go-ethereum/ethclient" "github.com/stretchr/testify/require" @@ -21,17 +22,20 @@ import ( challenger "github.com/ethereum-optimism/optimism/op-challenger" "github.com/ethereum-optimism/optimism/op-challenger/config" + "github.com/ethereum-optimism/optimism/op-challenger/game/fault/types" "github.com/ethereum-optimism/optimism/op-e2e/e2eutils" "github.com/ethereum-optimism/optimism/op-e2e/e2eutils/wait" "github.com/ethereum-optimism/optimism/op-node/rollup" "github.com/ethereum-optimism/optimism/op-service/cliapp" + "github.com/ethereum-optimism/optimism/op-service/endpoint" + "github.com/ethereum-optimism/optimism/op-service/metrics" "github.com/ethereum-optimism/optimism/op-service/testlog" ) type EndpointProvider interface { - NodeEndpoint(name string) string - RollupEndpoint(name string) string - L1BeaconEndpoint() string + NodeEndpoint(name string) endpoint.RPC + RollupEndpoint(name string) endpoint.RPC + L1BeaconEndpoint() endpoint.RestHTTP } type Helper struct { @@ -70,7 +74,7 @@ func WithGameAddress(addr common.Address) Option { func WithPrivKey(key *ecdsa.PrivateKey) Option { return func(c *config.Config) { - c.TxMgrConfig.PrivateKey = e2eutils.EncodePrivKeyToString(key) + c.TxMgrConfig.PrivateKey = crypto.EncodePrivKeyToString(key) } } @@ -102,34 +106,45 @@ func FindMonorepoRoot(t *testing.T) string { func applyCannonConfig(c *config.Config, t *testing.T, rollupCfg *rollup.Config, l2Genesis *core.Genesis) { require := require.New(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" - c.CannonSnapshotFreq = 10_000_000 + c.Cannon.VmBin = root + "cannon/bin/cannon" + c.Cannon.Server = root + "op-program/bin/op-program" + if e2eutils.UseMTCannon() { + t.Log("Using MT-Cannon absolute prestate") + c.CannonAbsolutePreState = root + "op-program/bin/prestate-mt.bin.gz" + } else { + c.CannonAbsolutePreState = root + "op-program/bin/prestate.json" + } + c.Cannon.SnapshotFreq = 10_000_000 genesisBytes, err := json.Marshal(l2Genesis) require.NoError(err, "marshall l2 genesis config") genesisFile := filepath.Join(c.Datadir, "l2-genesis.json") require.NoError(os.WriteFile(genesisFile, genesisBytes, 0o644)) - c.CannonL2GenesisPath = genesisFile + c.Cannon.L2GenesisPath = genesisFile rollupBytes, err := json.Marshal(rollupCfg) require.NoError(err, "marshall rollup config") rollupFile := filepath.Join(c.Datadir, "rollup.json") require.NoError(os.WriteFile(rollupFile, rollupBytes, 0o644)) - c.CannonRollupConfigPath = rollupFile + c.Cannon.RollupConfigPath = rollupFile } 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.TraceTypes = append(c.TraceTypes, types.TraceTypeCannon) applyCannonConfig(c, t, rollupCfg, l2Genesis) } } func WithAlphabet() Option { return func(c *config.Config) { - c.TraceTypes = append(c.TraceTypes, config.TraceTypeAlphabet) + c.TraceTypes = append(c.TraceTypes, types.TraceTypeAlphabet) + } +} + +func WithFastGames() Option { + return func(c *config.Config) { + c.TraceTypes = append(c.TraceTypes, types.TraceTypeFast) } } @@ -148,9 +163,9 @@ func NewChallenger(t *testing.T, ctx context.Context, sys EndpointProvider, name 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, sys.RollupEndpoint(l2NodeName), sys.NodeEndpoint(l2NodeName), t.TempDir()) + l1Endpoint := sys.NodeEndpoint("l1").RPC() + l1Beacon := sys.L1BeaconEndpoint().RestHTTP() + cfg := config.NewConfig(common.Address{}, l1Endpoint, l1Beacon, sys.RollupEndpoint(l2NodeName).RPC(), sys.NodeEndpoint(l2NodeName).RPC(), 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 @@ -171,12 +186,12 @@ func NewChallengerConfig(t *testing.T, sys EndpointProvider, l2NodeName string, require.NotEmpty(t, cfg.TxMgrConfig.PrivateKey, "Missing private key for TxMgrConfig") require.NoError(t, cfg.Check(), "op-challenger config should be valid") - if cfg.CannonBin != "" { - _, err := os.Stat(cfg.CannonBin) + if cfg.Cannon.VmBin != "" { + _, err := os.Stat(cfg.Cannon.VmBin) require.NoError(t, err, "cannon should be built. Make sure you've run make cannon-prestate") } - if cfg.CannonServer != "" { - _, err := os.Stat(cfg.CannonServer) + if cfg.Cannon.Server != "" { + _, err := os.Stat(cfg.Cannon.Server) require.NoError(t, err, "op-program should be built. Make sure you've run make cannon-prestate") } if cfg.CannonAbsolutePreState != "" { diff --git a/op-e2e/e2eutils/disputegame/claim_helper.go b/op-e2e/e2eutils/disputegame/claim_helper.go index 4eb9c420cc03..a3abf2b79e79 100644 --- a/op-e2e/e2eutils/disputegame/claim_helper.go +++ b/op-e2e/e2eutils/disputegame/claim_helper.go @@ -6,6 +6,7 @@ import ( "slices" "time" + "github.com/ethereum-optimism/optimism/cannon/mipsevm" "github.com/ethereum-optimism/optimism/op-challenger/game/fault/types" "github.com/ethereum-optimism/optimism/op-e2e/e2eutils/wait" "github.com/ethereum/go-ethereum/common" @@ -98,6 +99,10 @@ func (c *ClaimHelper) RequireCorrectOutputRoot(ctx context.Context) { c.require.Equalf(expected, c.claim, "Should have correct output root in claim %v and position %v", c.Index, c.Position) } +func (c *ClaimHelper) RequireInvalidStatusCode() { + c.require.Equal(byte(mipsevm.VMStatusInvalid), c.claim[0], "should have had invalid status code") +} + func (c *ClaimHelper) Attack(ctx context.Context, value common.Hash, opts ...MoveOpt) *ClaimHelper { c.game.Attack(ctx, c.Index, value, opts...) return c.WaitForCounterClaim(ctx) diff --git a/op-e2e/e2eutils/disputegame/helper.go b/op-e2e/e2eutils/disputegame/helper.go index 57f6908be65e..972314c4c762 100644 --- a/op-e2e/e2eutils/disputegame/helper.go +++ b/op-e2e/e2eutils/disputegame/helper.go @@ -2,6 +2,7 @@ package disputegame import ( "context" + "crypto/ecdsa" "encoding/binary" "math/big" "testing" @@ -18,6 +19,7 @@ import ( "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" + "github.com/ethereum-optimism/optimism/op-service/endpoint" "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" @@ -69,10 +71,10 @@ func WithFutureProposal() GameOpt { } type DisputeSystem interface { - L1BeaconEndpoint() string - NodeEndpoint(name string) string + L1BeaconEndpoint() endpoint.RestHTTP + NodeEndpoint(name string) endpoint.RPC NodeClient(name string) *ethclient.Client - RollupEndpoint(name string) string + RollupEndpoint(name string) endpoint.RPC RollupClient(name string) *sources.RollupClient L1Deployments() *genesis.L1Deployments @@ -88,6 +90,7 @@ type FactoryHelper struct { System DisputeSystem Client *ethclient.Client Opts *bind.TransactOpts + PrivKey *ecdsa.PrivateKey FactoryAddr common.Address Factory *bindings.DisputeGameFactory } @@ -97,7 +100,8 @@ 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(TestKey, chainID) + privKey := TestKey + opts, err := bind.NewKeyedTransactorWithChainID(privKey, chainID) require.NoError(err) l1Deployments := system.L1Deployments() @@ -111,6 +115,7 @@ func NewFactoryHelper(t *testing.T, ctx context.Context, system DisputeSystem) * System: system, Client: client, Opts: opts, + PrivKey: privKey, Factory: factory, FactoryAddr: factoryAddr, } @@ -120,15 +125,14 @@ 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) + caller := batching.NewMultiCaller(h.Client.Client(), batching.DefaultBatchSize) + game, err := contracts.NewFaultDisputeGameContract(ctx, metrics.NoopContractMetrics, gameAddr, caller) h.Require.NoError(err) - vmAddr, err := game.Vm(opts) + vm, err := game.Vm(ctx) h.Require.NoError(err) - vm, err := bindings.NewMIPSCaller(vmAddr, h.Client) + oracle, err := vm.Oracle(ctx) h.Require.NoError(err) - oracleAddr, err := vm.Oracle(opts) - h.Require.NoError(err) - return preimage.NewHelper(h.T, h.Opts, h.Client, oracleAddr) + return preimage.NewHelper(h.T, h.PrivKey, h.Client, oracle) } func NewGameCfg(opts ...GameOpt) *GameCfg { @@ -167,8 +171,6 @@ func (h *FactoryHelper) StartOutputCannonGame(ctx context.Context, l2Node string 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) @@ -182,7 +184,7 @@ func (h *FactoryHelper) StartOutputCannonGame(ctx context.Context, l2Node string provider := outputs.NewTraceProvider(logger, prestateProvider, rollupClient, l2Client, l1Head, splitDepth, prestateBlock, poststateBlock) return &OutputCannonGameHelper{ - OutputGameHelper: *NewOutputGameHelper(h.T, h.Require, h.Client, h.Opts, game, gameBindings, h.FactoryAddr, createdEvent.DisputeProxy, provider, h.System), + OutputGameHelper: *NewOutputGameHelper(h.T, h.Require, h.Client, h.Opts, h.PrivKey, game, h.FactoryAddr, createdEvent.DisputeProxy, provider, h.System), } } @@ -223,8 +225,6 @@ func (h *FactoryHelper) StartOutputAlphabetGame(ctx context.Context, l2Node stri 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) @@ -238,7 +238,7 @@ func (h *FactoryHelper) StartOutputAlphabetGame(ctx context.Context, l2Node stri provider := outputs.NewTraceProvider(logger, prestateProvider, rollupClient, l2Client, l1Head, splitDepth, prestateBlock, poststateBlock) return &OutputAlphabetGameHelper{ - OutputGameHelper: *NewOutputGameHelper(h.T, h.Require, h.Client, h.Opts, game, gameBindings, h.FactoryAddr, createdEvent.DisputeProxy, provider, h.System), + OutputGameHelper: *NewOutputGameHelper(h.T, h.Require, h.Client, h.Opts, h.PrivKey, game, h.FactoryAddr, createdEvent.DisputeProxy, provider, h.System), } } diff --git a/op-e2e/e2eutils/disputegame/output_cannon_helper.go b/op-e2e/e2eutils/disputegame/output_cannon_helper.go index f08feb1ee236..a4e017f9c980 100644 --- a/op-e2e/e2eutils/disputegame/output_cannon_helper.go +++ b/op-e2e/e2eutils/disputegame/output_cannon_helper.go @@ -14,16 +14,17 @@ import ( "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/trace/vm" "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/transactions" "github.com/ethereum-optimism/optimism/op-e2e/e2eutils/wait" 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" "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/log" ) @@ -46,23 +47,49 @@ func (g *OutputCannonGameHelper) StartChallenger(ctx context.Context, name strin return c } -func (g *OutputCannonGameHelper) CreateHonestActor(ctx context.Context, l2Node string, options ...challenger.Option) *OutputHonestHelper { - opts := g.defaultChallengerOptions() - opts = append(opts, options...) - cfg := challenger.NewChallengerConfig(g.T, g.System, l2Node, opts...) +type honestActorConfig struct { + prestateBlock uint64 + poststateBlock uint64 + challengerOpts []challenger.Option +} + +type HonestActorOpt func(cfg *honestActorConfig) + +func WithClaimedL2BlockNumber(num uint64) HonestActorOpt { + return func(cfg *honestActorConfig) { + cfg.poststateBlock = num + } +} + +func WithPrivKey(privKey *ecdsa.PrivateKey) HonestActorOpt { + return func(cfg *honestActorConfig) { + cfg.challengerOpts = append(cfg.challengerOpts, challenger.WithPrivKey(privKey)) + } +} +func (g *OutputCannonGameHelper) CreateHonestActor(ctx context.Context, l2Node string, options ...HonestActorOpt) *OutputHonestHelper { logger := testlog.Logger(g.T, log.LevelInfo).New("role", "HonestHelper", "game", g.Addr) l2Client := g.System.NodeClient(l2Node) - prestateBlock, poststateBlock, err := g.Game.GetBlockRange(ctx) + realPrestateBlock, realPostStateBlock, 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) - prestateProvider := outputs.NewPrestateProvider(rollupClient, prestateBlock) + actorCfg := &honestActorConfig{ + prestateBlock: realPrestateBlock, + poststateBlock: realPostStateBlock, + challengerOpts: g.defaultChallengerOptions(), + } + for _, option := range options { + option(actorCfg) + } + + cfg := challenger.NewChallengerConfig(g.T, g.System, l2Node, actorCfg.challengerOpts...) + dir := filepath.Join(cfg.Datadir, "honest") + prestateProvider := outputs.NewPrestateProvider(rollupClient, actorCfg.prestateBlock) l1Head := g.GetL1Head(ctx) accessor, err := outputs.NewOutputCannonTraceAccessor( - logger, metrics.NoopMetrics, cfg, l2Client, prestateProvider, rollupClient, dir, l1Head, splitDepth, prestateBlock, poststateBlock) + logger, metrics.NoopMetrics, cfg.Cannon, vm.NewOpProgramServerExecutor(), l2Client, prestateProvider, cfg.CannonAbsolutePreState, rollupClient, dir, l1Head, splitDepth, actorCfg.prestateBlock, actorCfg.poststateBlock) g.Require.NoError(err, "Failed to create output cannon trace accessor") return NewOutputHonestHelper(g.T, g.Require, &g.OutputGameHelper, g.Game, accessor) } @@ -127,7 +154,7 @@ func (g *OutputCannonGameHelper) ChallengeToPreimageLoad(ctx context.Context, ou if preloadPreimage { _, _, preimageData, err := provider.GetStepData(ctx, types.NewPosition(execDepth, big.NewInt(int64(targetTraceIndex)))) g.Require.NoError(err) - g.UploadPreimage(ctx, preimageData, challengerKey) + g.UploadPreimage(ctx, preimageData) g.WaitForPreimageInOracle(ctx, preimageData) } @@ -233,19 +260,14 @@ func (g *OutputCannonGameHelper) VerifyPreimage(ctx context.Context, outputRootC 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.GameBindings.AddLocalData(g.Opts, - oracleData.GetIdent(), - 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) + candidate, err := g.Game.UpdateOracleTx(ctx, uint64(outputRootClaim.Index), oracleData) + g.Require.NoError(err, "failed to get oracle") + transactions.RequireSendTx(g.T, ctx, g.Client, candidate, g.PrivKey) expectedPostState, err := provider.Get(ctx, pos) g.Require.NoError(err, "Failed to get expected post state") - callOpts := &bind.CallOpts{Context: ctx} - vmAddr, err := g.GameBindings.Vm(callOpts) + vm, err := g.Game.Vm(ctx) g.Require.NoError(err, "Failed to get VM address") abi, err := bindings.MIPSMetaData.GetAbi() @@ -253,7 +275,7 @@ func (g *OutputCannonGameHelper) VerifyPreimage(ctx context.Context, outputRootC caller := batching.NewMultiCaller(g.Client.Client(), batching.DefaultBatchSize) result, err := caller.SingleCall(ctx, rpcblock.Latest, &batching.ContractCall{ Abi: abi, - Addr: vmAddr, + Addr: vm.Addr(), Method: "step", Args: []interface{}{ prestate, proof, localContext, @@ -294,7 +316,7 @@ func (g *OutputCannonGameHelper) createCannonTraceProvider(ctx context.Context, 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 + return cannon.NewTraceProviderForTest(logger, metrics.NoopMetrics.VmMetrics(types.TraceTypeCannon.String()), cfg, localInputs, subdir, g.MaxDepth(ctx)-splitDepth-1), nil }) claims, err := g.Game.GetAllClaims(ctx, rpcblock.Latest) diff --git a/op-e2e/e2eutils/disputegame/output_game_helper.go b/op-e2e/e2eutils/disputegame/output_game_helper.go index 41143829a52e..b1d18392b258 100644 --- a/op-e2e/e2eutils/disputegame/output_game_helper.go +++ b/op-e2e/e2eutils/disputegame/output_game_helper.go @@ -5,6 +5,7 @@ import ( "crypto/ecdsa" "fmt" "math/big" + "strings" "testing" "time" @@ -14,9 +15,9 @@ import ( "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/transactions" "github.com/ethereum-optimism/optimism/op-e2e/e2eutils/wait" - preimage "github.com/ethereum-optimism/optimism/op-preimage" + "github.com/ethereum-optimism/optimism/op-service/errutil" "github.com/ethereum-optimism/optimism/op-service/eth" "github.com/ethereum-optimism/optimism/op-service/sources/batching/rpcblock" "github.com/ethereum/go-ethereum/accounts/abi/bind" @@ -33,23 +34,23 @@ type OutputGameHelper struct { Require *require.Assertions Client *ethclient.Client Opts *bind.TransactOpts + PrivKey *ecdsa.PrivateKey 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 { +func NewOutputGameHelper(t *testing.T, require *require.Assertions, client *ethclient.Client, opts *bind.TransactOpts, privKey *ecdsa.PrivateKey, + game contracts.FaultDisputeGameContract, factoryAddr common.Address, addr common.Address, correctOutputProvider *outputs.OutputTraceProvider, system DisputeSystem) *OutputGameHelper { return &OutputGameHelper{ T: t, Require: require, Client: client, Opts: opts, + PrivKey: privKey, Game: game, - GameBindings: gameBindings, FactoryAddr: factoryAddr, Addr: addr, CorrectOutputProvider: correctOutputProvider, @@ -203,22 +204,13 @@ func (g *OutputGameHelper) AvailableCredit(ctx context.Context, addr common.Addr } func (g *OutputGameHelper) CreditUnlockDuration(ctx context.Context) time.Duration { - 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") - float, _ := period.Float64() - return time.Duration(float) * time.Second + _, delay, _, err := g.Game.GetBalanceAndDelay(ctx, rpcblock.Latest) + g.Require.NoError(err, "Failed to get withdrawal delay") + return delay } func (g *OutputGameHelper) WethBalance(ctx context.Context, addr common.Address) *big.Int { - 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) + balance, _, _, err := g.Game.GetBalanceAndDelay(ctx, rpcblock.Latest) g.Require.NoError(err, "Failed to get WETH balance") return balance } @@ -363,10 +355,9 @@ 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.GameBindings.Resolve(g.Opts) - g.Require.NoError(err) - _, err = wait.ForReceiptOK(ctx, g.Client, tx.Hash()) + candidate, err := g.Game.ResolveTx() g.Require.NoError(err) + transactions.RequireSendTx(g.T, ctx, g.Client, candidate, g.PrivKey) } func (g *OutputGameHelper) Status(ctx context.Context) gameTypes.GameStatus { @@ -545,11 +536,10 @@ func (g *OutputGameHelper) Attack(ctx context.Context, claimIdx int64, claim com 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.GameBindings.Attack(transactOpts, claimData.Value, big.NewInt(claimIdx), claim) - }) + candidate, err := g.Game.AttackTx(ctx, claimData, claim) + g.Require.NoError(err, "Failed to create tx candidate") + _, _, err = transactions.SendTx(ctx, g.Client, candidate, g.PrivKey) if err != nil { if cfg.ignoreDupes && g.hasClaim(ctx, claimIdx, attackPos, claim) { return @@ -565,11 +555,10 @@ func (g *OutputGameHelper) Defend(ctx context.Context, claimIdx int64, claim com 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.GameBindings.Defend(transactOpts, claimData.Value, big.NewInt(claimIdx), claim) - }) + candidate, err := g.Game.DefendTx(ctx, claimData, claim) + g.Require.NoError(err, "Failed to create tx candidate") + _, _, err = transactions.SendTx(ctx, g.Client, candidate, g.PrivKey) if err != nil { if cfg.ignoreDupes && g.hasClaim(ctx, claimIdx, defendPos, claim) { return @@ -588,45 +577,26 @@ func (g *OutputGameHelper) hasClaim(ctx context.Context, parentIdx int64, pos ty return false } -func (g *OutputGameHelper) sendMove(ctx context.Context, send func() (*gethtypes.Transaction, error)) error { - tx, err := send() - if err != nil { - return fmt.Errorf("transaction did not send: %w", err) - } - _, 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.GameBindings.GetRequiredBond(&bind.CallOpts{Context: ctx}, pos) - g.Require.NoError(err, "Failed to get required bond") - bOpts.Value = bond - return &bOpts -} - -type ErrWithData interface { - ErrorData() 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) { +func (g *OutputGameHelper) StepFails(ctx context.Context, claimIdx int64, isAttack bool, stateData []byte, proof []byte) { 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()") + candidate, err := g.Game.StepTx(uint64(claimIdx), isAttack, stateData, proof) + g.Require.NoError(err, "Failed to create tx candidate") + _, _, err = transactions.SendTx(ctx, g.Client, candidate, g.PrivKey, transactions.WithReceiptFail()) + err = errutil.TryAddRevertReason(err) + g.Require.Error(err, "Transaction should fail") + validStepErr := "0xfb4e40dd" + invalidPrestateErr := "0x696550ff" + if !strings.Contains(err.Error(), validStepErr) && !strings.Contains(err.Error(), invalidPrestateErr) { + g.Require.Failf("Revert reason should be abi encoded ValidStep() or InvalidPrestate() but was: %v", err.Error()) + } } // ResolveClaim resolves a single subgame func (g *OutputGameHelper) ResolveClaim(ctx context.Context, claimIdx int64) { - 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") + candidate, err := g.Game.ResolveClaimTx(uint64(claimIdx)) + g.Require.NoError(err, "Failed to create resolve claim candidate tx") + transactions.RequireSendTx(g.T, ctx, g.Client, candidate, g.PrivKey) } // ChallengePeriod returns the challenge period fetched from the PreimageOracle contract. @@ -682,28 +652,14 @@ func (g *OutputGameHelper) WaitForPreimageInOracle(ctx context.Context, data *ty 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) { oracle := g.oracle(ctx) - 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, - 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()) - } - g.Require.NoError(err, "Failed to load preimage part") - _, err = wait.ForReceiptOK(ctx, g.Client, tx.Hash()) - g.Require.NoError(err) + tx, err := oracle.AddGlobalDataTx(data) + g.Require.NoError(err, "Failed to create preimage upload tx") + transactions.RequireSendTx(g.T, ctx, g.Client, tx, g.PrivKey) } -func (g *OutputGameHelper) oracle(ctx context.Context) *contracts.PreimageOracleContract { +func (g *OutputGameHelper) oracle(ctx context.Context) contracts.PreimageOracleContract { oracle, err := g.Game.GetOracle(ctx) g.Require.NoError(err, "Failed to create oracle contract") return oracle diff --git a/op-e2e/e2eutils/disputegame/output_honest_helper.go b/op-e2e/e2eutils/disputegame/output_honest_helper.go index e2de7c4ec743..917b05912d56 100644 --- a/op-e2e/e2eutils/disputegame/output_honest_helper.go +++ b/op-e2e/e2eutils/disputegame/output_honest_helper.go @@ -7,6 +7,7 @@ import ( "github.com/ethereum-optimism/optimism/op-challenger/game/fault/contracts" "github.com/ethereum-optimism/optimism/op-challenger/game/fault/types" + "github.com/ethereum-optimism/optimism/op-e2e/e2eutils/transactions" "github.com/ethereum-optimism/optimism/op-service/sources/batching/rpcblock" "github.com/stretchr/testify/require" ) @@ -99,9 +100,14 @@ func (h *OutputHonestHelper) StepFails(ctx context.Context, claimIdx int64, isAt // 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, game, claim, pos) + prestate, proofData, preimage, err := h.correctTrace.GetStepData(ctx, game, claim, pos) h.require.NoError(err, "Get step data") - h.game.StepFails(claimIdx, isAttack, prestate, proofData) + if preimage != nil { + tx, err := h.game.Game.UpdateOracleTx(ctx, uint64(claimIdx), preimage) + h.require.NoError(err) + transactions.RequireSendTx(h.t, ctx, h.game.Client, tx, h.game.PrivKey) + } + h.game.StepFails(ctx, claimIdx, isAttack, prestate, proofData) } func (h *OutputHonestHelper) loadState(ctx context.Context, claimIdx int64) (types.Game, types.Claim) { diff --git a/op-e2e/e2eutils/disputegame/preimage/preimage_helper.go b/op-e2e/e2eutils/disputegame/preimage/preimage_helper.go index ad043d3e37a9..62287c8ff135 100644 --- a/op-e2e/e2eutils/disputegame/preimage/preimage_helper.go +++ b/op-e2e/e2eutils/disputegame/preimage/preimage_helper.go @@ -3,6 +3,7 @@ package preimage import ( "bytes" "context" + "crypto/ecdsa" "errors" "io" "math/big" @@ -15,13 +16,12 @@ import ( "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/transactions" "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" "github.com/ethereum-optimism/optimism/op-service/testutils" - "github.com/ethereum/go-ethereum/accounts/abi/bind" "github.com/ethereum/go-ethereum/common" + "github.com/ethereum/go-ethereum/crypto" "github.com/ethereum/go-ethereum/ethclient" "github.com/stretchr/testify/require" ) @@ -29,28 +29,21 @@ import ( const MinPreimageSize = 10000 type Helper struct { - t *testing.T - require *require.Assertions - client *ethclient.Client - opts *bind.TransactOpts - oracleBindings *bindings.PreimageOracle - oracle *contracts.PreimageOracleContract - uuidProvider atomic.Int64 + t *testing.T + require *require.Assertions + client *ethclient.Client + privKey *ecdsa.PrivateKey + oracle contracts.PreimageOracleContract + uuidProvider atomic.Int64 } -func NewHelper(t *testing.T, opts *bind.TransactOpts, client *ethclient.Client, addr common.Address) *Helper { - require := require.New(t) - oracleBindings, err := bindings.NewPreimageOracle(addr, client) - require.NoError(err) - - oracle := contracts.NewPreimageOracleContract(addr, batching.NewMultiCaller(client.Client(), batching.DefaultBatchSize)) +func NewHelper(t *testing.T, privKey *ecdsa.PrivateKey, client *ethclient.Client, oracle contracts.PreimageOracleContract) *Helper { return &Helper{ - t: t, - require: require, - client: client, - opts: opts, - oracleBindings: oracleBindings, - oracle: oracle, + t: t, + require: require.New(t), + client: client, + privKey: privKey, + oracle: oracle, } } @@ -82,14 +75,9 @@ func (h *Helper) UploadLargePreimage(ctx context.Context, dataSize int, modifier data := testutils.RandomData(rand.New(rand.NewSource(1234)), dataSize) s := matrix.NewStateMatrix() uuid := big.NewInt(h.uuidProvider.Add(1)) - bondValue, err := h.oracleBindings.MINBONDSIZE(&bind.CallOpts{}) - h.require.NoError(err) - h.opts.Value = bondValue - tx, err := h.oracleBindings.InitLPP(h.opts, uuid, 32, uint32(len(data))) - h.require.NoError(err) - _, err = wait.ForReceiptOK(ctx, h.client, tx.Hash()) + candidate, err := h.oracle.InitLargePreimage(uuid, 32, uint32(len(data))) h.require.NoError(err) - h.opts.Value = big.NewInt(0) + transactions.RequireSendTx(h.t, ctx, h.client, candidate, h.privKey) startBlock := big.NewInt(0) totalBlocks := len(data) / types.BlockSize @@ -102,15 +90,10 @@ func (h *Helper) UploadLargePreimage(ctx context.Context, dataSize int, modifier for _, modifier := range modifiers { modifier(startBlock.Uint64(), &inputData) } - commitments := make([][32]byte, len(inputData.Commitments)) - for i, commitment := range inputData.Commitments { - commitments[i] = commitment - } - h.t.Logf("Uploading %v parts of preimage %v starting at block %v of about %v Finalize: %v", len(commitments), uuid.Uint64(), startBlock.Uint64(), totalBlocks, inputData.Finalize) - tx, err := h.oracleBindings.AddLeavesLPP(h.opts, uuid, startBlock, inputData.Input, commitments, inputData.Finalize) - h.require.NoError(err) - _, err = wait.ForReceiptOK(ctx, h.client, tx.Hash()) + h.t.Logf("Uploading %v parts of preimage %v starting at block %v of about %v Finalize: %v", len(inputData.Commitments), uuid.Uint64(), startBlock.Uint64(), totalBlocks, inputData.Finalize) + tx, err := h.oracle.AddLeaves(uuid, startBlock, inputData.Input, inputData.Commitments, inputData.Finalize) h.require.NoError(err) + transactions.RequireSendTx(h.t, ctx, h.client, tx, h.privKey) startBlock = new(big.Int).Add(startBlock, big.NewInt(int64(len(inputData.Commitments)))) if inputData.Finalize { break @@ -118,7 +101,7 @@ func (h *Helper) UploadLargePreimage(ctx context.Context, dataSize int, modifier } return types.LargePreimageIdent{ - Claimant: h.opts.From, + Claimant: crypto.PubkeyToAddress(h.privKey.PublicKey), UUID: uuid, } } diff --git a/op-e2e/e2eutils/fakebeacon/blobs.go b/op-e2e/e2eutils/fakebeacon/blobs.go index 6be65bbb3521..a96042bc7add 100644 --- a/op-e2e/e2eutils/fakebeacon/blobs.go +++ b/op-e2e/e2eutils/fakebeacon/blobs.go @@ -1,23 +1,24 @@ package fakebeacon import ( + "context" "encoding/binary" "encoding/json" "errors" "fmt" - "io/fs" "net" "net/http" - "os" - "path/filepath" "strconv" "strings" "sync" "time" + "github.com/ethereum-optimism/optimism/op-e2e/e2eutils" "github.com/ethereum-optimism/optimism/op-service/eth" "github.com/ethereum/go-ethereum" "github.com/ethereum/go-ethereum/beacon/engine" + "github.com/ethereum/go-ethereum/common/hexutil" + "github.com/ethereum/go-ethereum/crypto/kzg4844" "github.com/ethereum/go-ethereum/log" ) @@ -27,8 +28,8 @@ import ( type FakeBeacon struct { log log.Logger - // directory to store blob contents in after the blobs are persisted in a block - blobsDir string + // in-memory blob store + blobStore *e2eutils.BlobsStore blobsLock sync.Mutex beaconSrv *http.Server @@ -38,10 +39,10 @@ type FakeBeacon struct { blockTime uint64 } -func NewBeacon(log log.Logger, blobsDir string, genesisTime uint64, blockTime uint64) *FakeBeacon { +func NewBeacon(log log.Logger, blobStore *e2eutils.BlobsStore, genesisTime uint64, blockTime uint64) *FakeBeacon { return &FakeBeacon{ log: log, - blobsDir: blobsDir, + blobStore: blobStore, genesisTime: genesisTime, blockTime: blockTime, } @@ -158,20 +159,23 @@ func (f *FakeBeacon) Start(addr string) error { } func (f *FakeBeacon) StoreBlobsBundle(slot uint64, bundle *engine.BlobsBundleV1) error { - data, err := json.Marshal(bundle) - if err != nil { - return fmt.Errorf("failed to encode blobs bundle of slot %d: %w", slot, err) - } - f.blobsLock.Lock() defer f.blobsLock.Unlock() - bundlePath := fmt.Sprintf("blobs_bundle_%d.json", slot) - if err := os.MkdirAll(f.blobsDir, 0755); err != nil { - return fmt.Errorf("failed to create dir for blob storage: %w", err) - } - err = os.WriteFile(filepath.Join(f.blobsDir, bundlePath), data, 0755) - if err != nil { - return fmt.Errorf("failed to write blobs bundle of slot %d: %w", slot, err) + + // Solve for the slot timestamp. + // slot = (timestamp - genesis) / slot_time + // timestamp = slot * slot_time + genesis + slotTimestamp := slot*f.blockTime + f.genesisTime + + for i, b := range bundle.Blobs { + f.blobStore.StoreBlob( + slotTimestamp, + eth.IndexedBlobHash{ + Index: uint64(i), + Hash: eth.KZGToVersionedHash(kzg4844.Commitment(bundle.Commitments[i])), + }, + (*eth.Blob)(b[:]), + ) } return nil } @@ -179,19 +183,30 @@ func (f *FakeBeacon) StoreBlobsBundle(slot uint64, bundle *engine.BlobsBundleV1) func (f *FakeBeacon) LoadBlobsBundle(slot uint64) (*engine.BlobsBundleV1, error) { f.blobsLock.Lock() defer f.blobsLock.Unlock() - bundlePath := fmt.Sprintf("blobs_bundle_%d.json", slot) - data, err := os.ReadFile(filepath.Join(f.blobsDir, bundlePath)) + + // Solve for the slot timestamp. + // slot = (timestamp - genesis) / slot_time + // timestamp = slot * slot_time + genesis + slotTimestamp := slot*f.blockTime + f.genesisTime + + // Load blobs from the store + blobs, err := f.blobStore.GetAllSidecars(context.Background(), slotTimestamp) if err != nil { - if errors.Is(err, fs.ErrNotExist) { - return nil, fmt.Errorf("no blobs bundle found for slot %d (%q): %w", slot, bundlePath, ethereum.NotFound) - } else { - return nil, fmt.Errorf("failed to read blobs bundle of slot %d (%q): %w", slot, bundlePath, err) - } + return nil, fmt.Errorf("failed to load blobs from store: %w", err) } - var out engine.BlobsBundleV1 - if err := json.Unmarshal(data, &out); err != nil { - return nil, fmt.Errorf("failed to decode blobs bundle of slot %d (%q): %w", slot, bundlePath, err) + + // Convert blobs to the bundle + out := engine.BlobsBundleV1{ + Commitments: make([]hexutil.Bytes, len(blobs)), + Proofs: make([]hexutil.Bytes, len(blobs)), + Blobs: make([]hexutil.Bytes, len(blobs)), + } + for _, b := range blobs { + out.Commitments[b.Index] = hexutil.Bytes(b.KZGCommitment[:]) + out.Proofs[b.Index] = hexutil.Bytes(b.KZGProof[:]) + out.Blobs[b.Index] = hexutil.Bytes(b.Blob[:]) } + return &out, nil } diff --git a/op-e2e/e2eutils/geth/fakepos.go b/op-e2e/e2eutils/geth/fakepos.go index b46f2dc59f9c..109147198147 100644 --- a/op-e2e/e2eutils/geth/fakepos.go +++ b/op-e2e/e2eutils/geth/fakepos.go @@ -138,35 +138,42 @@ func (f *fakePoS) Start() error { tim.Stop() return nil } - envelope, err := f.engineAPI.GetPayloadV3(*res.PayloadID) + var envelope *engine.ExecutionPayloadEnvelope + if isCancun { + envelope, err = f.engineAPI.GetPayloadV3(*res.PayloadID) + } else { + envelope, err = f.engineAPI.GetPayloadV2(*res.PayloadID) + } if err != nil { f.log.Error("failed to finish building L1 block", "err", err) continue } blobHashes := make([]common.Hash, 0) // must be non-nil even when empty, due to geth engine API checks - for _, commitment := range envelope.BlobsBundle.Commitments { - if len(commitment) != 48 { - f.log.Error("got malformed kzg commitment from engine", "commitment", commitment) - break + if envelope.BlobsBundle != nil { + for _, commitment := range envelope.BlobsBundle.Commitments { + if len(commitment) != 48 { + f.log.Error("got malformed kzg commitment from engine", "commitment", commitment) + break + } + blobHashes = append(blobHashes, opeth.KZGToVersionedHash(*(*[48]byte)(commitment))) } - blobHashes = append(blobHashes, opeth.KZGToVersionedHash(*(*[48]byte)(commitment))) - } - if len(blobHashes) != len(envelope.BlobsBundle.Commitments) { - f.log.Error("invalid or incomplete blob data", "collected", len(blobHashes), "engine", len(envelope.BlobsBundle.Commitments)) - continue - } - if isCancun { - if _, err := f.engineAPI.NewPayloadV3(*envelope.ExecutionPayload, blobHashes, &parentBeaconBlockRoot); err != nil { - f.log.Error("failed to insert built L1 block", "err", err) + if len(blobHashes) != len(envelope.BlobsBundle.Commitments) { + f.log.Error("invalid or incomplete blob data", "collected", len(blobHashes), "engine", len(envelope.BlobsBundle.Commitments)) continue } + } + + if isCancun { + _, err = f.engineAPI.NewPayloadV3(*envelope.ExecutionPayload, blobHashes, &parentBeaconBlockRoot) } else { - if _, err := f.engineAPI.NewPayloadV2(*envelope.ExecutionPayload); err != nil { - f.log.Error("failed to insert built L1 block", "err", err) - continue - } + _, err = f.engineAPI.NewPayloadV2(*envelope.ExecutionPayload) } + if err != nil { + f.log.Error("failed to insert built L1 block", "err", err) + continue + } + if envelope.BlobsBundle != nil { slot := (envelope.ExecutionPayload.Timestamp - f.eth.BlockChain().Genesis().Time()) / f.blockTime if f.beacon == nil { diff --git a/op-e2e/e2eutils/geth/geth.go b/op-e2e/e2eutils/geth/geth.go index fc8660acf943..de5b12b77d3c 100644 --- a/op-e2e/e2eutils/geth/geth.go +++ b/op-e2e/e2eutils/geth/geth.go @@ -2,12 +2,12 @@ package geth import ( "fmt" - "math/big" + "time" - "github.com/ethereum-optimism/optimism/op-service/clock" "github.com/ethereum/go-ethereum/cmd/utils" "github.com/ethereum/go-ethereum/common" "github.com/ethereum/go-ethereum/core" + "github.com/ethereum/go-ethereum/core/rawdb" "github.com/ethereum/go-ethereum/core/txpool/blobpool" "github.com/ethereum/go-ethereum/eth" "github.com/ethereum/go-ethereum/eth/catalyst" @@ -20,17 +20,28 @@ import ( // Force-load the tracer engines to trigger registration _ "github.com/ethereum/go-ethereum/eth/tracers/js" _ "github.com/ethereum/go-ethereum/eth/tracers/native" + + "github.com/ethereum-optimism/optimism/op-service/clock" ) -func InitL1(chainID uint64, blockTime uint64, genesis *core.Genesis, c clock.Clock, blobPoolDir string, beaconSrv Beacon, opts ...GethOption) (*node.Node, *eth.Ethereum, error) { +func InitL1(blockTime uint64, finalizedDistance uint64, genesis *core.Genesis, c clock.Clock, blobPoolDir string, beaconSrv Beacon, opts ...GethOption) (*GethInstance, error) { ethConfig := ðconfig.Config{ - NetworkId: chainID, + NetworkId: genesis.Config.ChainID.Uint64(), Genesis: genesis, BlobPool: blobpool.Config{ Datadir: blobPoolDir, Datacap: blobpool.DefaultConfig.Datacap, PriceBump: blobpool.DefaultConfig.PriceBump, }, + StateScheme: rawdb.HashScheme, + Miner: miner.Config{ + PendingFeeRecipient: common.Address{}, + ExtraData: nil, + GasCeil: 0, + GasPrice: nil, + // enough to build blocks within 1 second, but high enough to avoid unnecessary test CPU cycles. + Recommit: time.Millisecond * 400, + }, } nodeConfig := &node.Config{ Name: "l1-geth", @@ -42,27 +53,24 @@ func InitL1(chainID uint64, blockTime uint64, genesis *core.Genesis, c clock.Clo HTTPModules: []string{"debug", "admin", "eth", "txpool", "net", "rpc", "web3", "personal", "engine"}, } - l1Node, l1Eth, err := createGethNode(false, nodeConfig, ethConfig, opts...) + gethInstance, err := createGethNode(false, nodeConfig, ethConfig, opts...) if err != nil { - return nil, nil, err + return nil, err } - // Activate merge - l1Eth.Merger().FinalizePoS() // Instead of running a whole beacon node, we run this fake-proof-of-stake sidecar that sequences L1 blocks using the Engine API. - l1Node.RegisterLifecycle(&fakePoS{ - clock: c, - eth: l1Eth, - log: log.Root(), // geth logger is global anyway. Would be nice to replace with a local logger though. - blockTime: blockTime, - // for testing purposes we make it really fast, otherwise we don't see it finalize in short tests - finalizedDistance: 8, + gethInstance.Node.RegisterLifecycle(&fakePoS{ + clock: c, + eth: gethInstance.Backend, + log: log.Root(), // geth logger is global anyway. Would be nice to replace with a local logger though. + blockTime: blockTime, + finalizedDistance: finalizedDistance, safeDistance: 4, - engineAPI: catalyst.NewConsensusAPI(l1Eth), + engineAPI: catalyst.NewConsensusAPI(gethInstance.Backend), beacon: beaconSrv, }) - return l1Node, l1Eth, nil + return gethInstance, nil } func defaultNodeConfig(name string, jwtPath string) *node.Config { @@ -83,18 +91,18 @@ func defaultNodeConfig(name string, jwtPath string) *node.Config { type GethOption func(ethCfg *ethconfig.Config, nodeCfg *node.Config) error // InitL2 inits a L2 geth node. -func InitL2(name string, l2ChainID *big.Int, genesis *core.Genesis, jwtPath string, opts ...GethOption) (*node.Node, *eth.Ethereum, error) { +func InitL2(name string, genesis *core.Genesis, jwtPath string, opts ...GethOption) (*GethInstance, error) { ethConfig := ðconfig.Config{ - NetworkId: l2ChainID.Uint64(), - Genesis: genesis, + NetworkId: genesis.Config.ChainID.Uint64(), + Genesis: genesis, + StateScheme: rawdb.HashScheme, Miner: miner.Config{ - Etherbase: common.Address{}, - ExtraData: nil, - GasFloor: 0, - GasCeil: 0, - GasPrice: nil, - Recommit: 0, - NewPayloadTimeout: 0, + PendingFeeRecipient: common.Address{}, + ExtraData: nil, + GasCeil: 0, + GasPrice: nil, + // enough to build blocks within 1 second, but high enough to avoid unnecessary test CPU cycles. + Recommit: time.Millisecond * 400, }, } nodeConfig := defaultNodeConfig(fmt.Sprintf("l2-geth-%v", name), jwtPath) @@ -105,23 +113,24 @@ func InitL2(name string, l2ChainID *big.Int, genesis *core.Genesis, jwtPath stri // The private keys are added to the keystore and are unlocked. // If the node is l2, catalyst is enabled. // The node should be started and then closed when done. -func createGethNode(l2 bool, nodeCfg *node.Config, ethCfg *ethconfig.Config, opts ...GethOption) (*node.Node, *eth.Ethereum, error) { +func createGethNode(l2 bool, nodeCfg *node.Config, ethCfg *ethconfig.Config, opts ...GethOption) (*GethInstance, error) { for i, opt := range opts { if err := opt(ethCfg, nodeCfg); err != nil { - return nil, nil, fmt.Errorf("failed to apply geth option %d: %w", i, err) + return nil, fmt.Errorf("failed to apply geth option %d: %w", i, err) } } + ethCfg.StateScheme = rawdb.HashScheme ethCfg.NoPruning = true // force everything to be an archive node n, err := node.New(nodeCfg) if err != nil { n.Close() - return nil, nil, err + return nil, err } backend, err := eth.New(n, ethCfg) if err != nil { n.Close() - return nil, nil, err + return nil, err } @@ -135,8 +144,11 @@ func createGethNode(l2 bool, nodeCfg *node.Config, ethCfg *ethconfig.Config, opt if l2 { if err := catalyst.Register(n, backend); err != nil { n.Close() - return nil, nil, err + return nil, err } } - return n, backend, nil + return &GethInstance{ + Backend: backend, + Node: n, + }, nil } diff --git a/op-e2e/e2eutils/geth/instance.go b/op-e2e/e2eutils/geth/instance.go new file mode 100644 index 000000000000..cf731ea1945d --- /dev/null +++ b/op-e2e/e2eutils/geth/instance.go @@ -0,0 +1,43 @@ +package geth + +import ( + "github.com/ethereum/go-ethereum/eth" + "github.com/ethereum/go-ethereum/node" + + "github.com/ethereum-optimism/optimism/op-e2e/e2eutils/services" + "github.com/ethereum-optimism/optimism/op-service/endpoint" +) + +type GethInstance struct { + Backend *eth.Ethereum + Node *node.Node +} + +var _ services.EthInstance = (*GethInstance)(nil) + +func (gi *GethInstance) UserRPC() endpoint.RPC { + fallback := endpoint.WsOrHttpRPC{ + WsURL: gi.Node.WSEndpoint(), + HttpURL: gi.Node.HTTPEndpoint(), + } + srv, err := gi.Node.RPCHandler() + if err != nil { + return fallback + } + return &endpoint.ServerRPC{ + Fallback: fallback, + Server: srv, + } +} + +func (gi *GethInstance) AuthRPC() endpoint.RPC { + // TODO: can we rely on the in-process RPC server to support the auth namespaces? + return endpoint.WsOrHttpRPC{ + WsURL: gi.Node.WSAuthEndpoint(), + HttpURL: gi.Node.HTTPAuthEndpoint(), + } +} + +func (gi *GethInstance) Close() error { + return gi.Node.Close() +} diff --git a/op-e2e/e2eutils/geth/wait.go b/op-e2e/e2eutils/geth/wait.go index 823d40a52ab7..267e589f021c 100644 --- a/op-e2e/e2eutils/geth/wait.go +++ b/op-e2e/e2eutils/geth/wait.go @@ -132,6 +132,11 @@ func waitForBlockTag(number *big.Int, client *ethclient.Client, timeout time.Dur case <-ticker.C: block, err := client.BlockByNumber(ctx, tagBigInt) if err != nil { + // If block is not found (e.g. upon startup of chain, when there is no "finalized block" yet) + // then it may be found later. Keep wait loop running. + if strings.Contains(err.Error(), "block not found") { + continue + } return nil, err } if block != nil && block.NumberU64() >= number.Uint64() { diff --git a/op-e2e/e2eutils/opnode/opnode.go b/op-e2e/e2eutils/opnode/opnode.go new file mode 100644 index 000000000000..b21e62e62b36 --- /dev/null +++ b/op-e2e/e2eutils/opnode/opnode.go @@ -0,0 +1,65 @@ +package opnode + +import ( + "context" + + "github.com/ethereum/go-ethereum/log" + + "github.com/ethereum-optimism/optimism/op-e2e/e2eutils/services" + "github.com/ethereum-optimism/optimism/op-node/metrics" + rollupNode "github.com/ethereum-optimism/optimism/op-node/node" + "github.com/ethereum-optimism/optimism/op-node/p2p" + "github.com/ethereum-optimism/optimism/op-service/cliapp" + "github.com/ethereum-optimism/optimism/op-service/endpoint" +) + +type Opnode struct { + node *rollupNode.OpNode +} + +func (o *Opnode) UserRPC() endpoint.RPC { + return endpoint.HttpURL(o.node.HTTPEndpoint()) +} + +func (o *Opnode) Stop(ctx context.Context) error { + return o.node.Stop(ctx) +} + +func (o *Opnode) Stopped() bool { + return o.node.Stopped() +} + +func (o *Opnode) RuntimeConfig() rollupNode.ReadonlyRuntimeConfig { + return o.node.RuntimeConfig() +} + +func (o *Opnode) P2P() p2p.Node { + return o.node.P2P() +} + +var _ services.RollupNode = (*Opnode)(nil) + +func NewOpnode(l log.Logger, c *rollupNode.Config, errFn func(error)) (*Opnode, error) { + var cycle cliapp.Lifecycle + c.Cancel = func(errCause error) { + l.Warn("node requested early shutdown!", "err", errCause) + go func() { + postCtx, postCancel := context.WithCancel(context.Background()) + postCancel() // don't allow the stopping to continue for longer than needed + if err := cycle.Stop(postCtx); err != nil { + errFn(err) + } + l.Warn("closed op-node!") + }() + } + node, err := rollupNode.New(context.Background(), c, l, "", metrics.NewMetrics("")) + if err != nil { + return nil, err + } + cycle = node + err = node.Start(context.Background()) + if err != nil { + return nil, err + } + return &Opnode{node: node}, nil +} diff --git a/op-e2e/e2eutils/opnode/tracer.go b/op-e2e/e2eutils/opnode/tracer.go new file mode 100644 index 000000000000..33a23b775ce5 --- /dev/null +++ b/op-e2e/e2eutils/opnode/tracer.go @@ -0,0 +1,36 @@ +package opnode + +import ( + "context" + + "github.com/libp2p/go-libp2p/core/peer" + + "github.com/ethereum-optimism/optimism/op-node/node" + "github.com/ethereum-optimism/optimism/op-service/eth" +) + +type FnTracer struct { + OnNewL1HeadFn func(ctx context.Context, sig eth.L1BlockRef) + OnUnsafeL2PayloadFn func(ctx context.Context, from peer.ID, payload *eth.ExecutionPayloadEnvelope) + OnPublishL2PayloadFn func(ctx context.Context, payload *eth.ExecutionPayloadEnvelope) +} + +func (n *FnTracer) OnNewL1Head(ctx context.Context, sig eth.L1BlockRef) { + if n.OnNewL1HeadFn != nil { + n.OnNewL1HeadFn(ctx, sig) + } +} + +func (n *FnTracer) OnUnsafeL2Payload(ctx context.Context, from peer.ID, payload *eth.ExecutionPayloadEnvelope) { + if n.OnUnsafeL2PayloadFn != nil { + n.OnUnsafeL2PayloadFn(ctx, from, payload) + } +} + +func (n *FnTracer) OnPublishL2Payload(ctx context.Context, payload *eth.ExecutionPayloadEnvelope) { + if n.OnPublishL2PayloadFn != nil { + n.OnPublishL2PayloadFn(ctx, payload) + } +} + +var _ node.Tracer = (*FnTracer)(nil) diff --git a/op-e2e/e2eutils/secrets.go b/op-e2e/e2eutils/secrets.go index a4b7d0550c09..cd4c91e1e09e 100644 --- a/op-e2e/e2eutils/secrets.go +++ b/op-e2e/e2eutils/secrets.go @@ -3,14 +3,16 @@ package e2eutils import ( "crypto/ecdsa" "fmt" + "strconv" hdwallet "github.com/ethereum-optimism/go-ethereum-hdwallet" "github.com/ethereum/go-ethereum/accounts" "github.com/ethereum/go-ethereum/common" - "github.com/ethereum/go-ethereum/common/hexutil" "github.com/ethereum/go-ethereum/crypto" ) +const defaultHDPathPrefix = "m/44'/60'/0'/0/" + // DefaultMnemonicConfig is the default mnemonic used in testing. // We prefer a mnemonic rather than direct private keys to make it easier // to export all testing keys in external tooling for use during debugging. @@ -131,18 +133,6 @@ type Secrets struct { Wallet *hdwallet.Wallet } -// EncodePrivKey encodes the given private key in 32 bytes -func EncodePrivKey(priv *ecdsa.PrivateKey) hexutil.Bytes { - privkey := make([]byte, 32) - blob := priv.D.Bytes() - copy(privkey[32-len(blob):], blob) - return privkey -} - -func EncodePrivKeyToString(priv *ecdsa.PrivateKey) string { - return hexutil.Encode(EncodePrivKey(priv)) -} - // Addresses computes the ethereum address of each account, // which can then be kept around for fast precomputed address access. func (s *Secrets) Addresses() *Addresses { @@ -189,3 +179,14 @@ func (a *Addresses) All() []common.Address { a.Mallory, } } + +func (s *Secrets) AccountAtIdx(idx int) *ecdsa.PrivateKey { + account := accounts.Account{URL: accounts.URL{ + Path: defaultHDPathPrefix + strconv.Itoa(idx), + }} + pk, err := s.Wallet.PrivateKey(account) + if err != nil { + panic(err) + } + return pk +} diff --git a/op-e2e/e2eutils/services/services.go b/op-e2e/e2eutils/services/services.go new file mode 100644 index 000000000000..80026f66843c --- /dev/null +++ b/op-e2e/e2eutils/services/services.go @@ -0,0 +1,25 @@ +package services + +import ( + "context" + + rollupNode "github.com/ethereum-optimism/optimism/op-node/node" + "github.com/ethereum-optimism/optimism/op-node/p2p" + "github.com/ethereum-optimism/optimism/op-service/endpoint" +) + +// EthInstance is either an in process Geth or external process exposing its +// endpoints over the network +type EthInstance interface { + UserRPC() endpoint.RPC + AuthRPC() endpoint.RPC + Close() error +} + +type RollupNode interface { + UserRPC() endpoint.RPC + Stop(ctx context.Context) error + Stopped() bool + RuntimeConfig() rollupNode.ReadonlyRuntimeConfig + P2P() p2p.Node +} diff --git a/op-e2e/e2eutils/setup.go b/op-e2e/e2eutils/setup.go index 56fc1fdb1abb..52dd6ec2d3ae 100644 --- a/op-e2e/e2eutils/setup.go +++ b/op-e2e/e2eutils/setup.go @@ -10,9 +10,11 @@ import ( "github.com/ethereum/go-ethereum/common/hexutil" "github.com/ethereum/go-ethereum/core" "github.com/ethereum/go-ethereum/core/types" + "github.com/ethereum/go-ethereum/log" "github.com/stretchr/testify/require" + altda "github.com/ethereum-optimism/optimism/op-alt-da" "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" @@ -45,7 +47,7 @@ type TestParams struct { SequencerWindowSize uint64 ChannelTimeout uint64 L1BlockTime uint64 - UsePlasma bool + UseAltDA bool } func MakeDeployParams(t require.TestingT, tp *TestParams) *DeployParams { @@ -57,12 +59,13 @@ func MakeDeployParams(t require.TestingT, tp *TestParams) *DeployParams { deployConfig := config.DeployConfig.Copy() deployConfig.MaxSequencerDrift = tp.MaxSequencerDrift deployConfig.SequencerWindowSize = tp.SequencerWindowSize - deployConfig.ChannelTimeout = tp.ChannelTimeout + deployConfig.ChannelTimeoutBedrock = tp.ChannelTimeout deployConfig.L1BlockTime = tp.L1BlockTime - deployConfig.UsePlasma = tp.UsePlasma + deployConfig.UseAltDA = tp.UseAltDA ApplyDeployConfigForks(deployConfig) - require.NoError(t, deployConfig.Check()) + logger := log.NewLogger(log.DiscardHandler()) + require.NoError(t, deployConfig.Check(logger)) require.Equal(t, addresses.Batcher, deployConfig.BatchSenderAddress) require.Equal(t, addresses.Proposer, deployConfig.L2OutputOracleProposer) require.Equal(t, addresses.SequencerP2P, deployConfig.P2PSequencerAddress) @@ -104,7 +107,8 @@ func Ether(v uint64) *big.Int { func Setup(t require.TestingT, deployParams *DeployParams, alloc *AllocParams) *SetupData { deployConf := deployParams.DeployConfig.Copy() deployConf.L1GenesisBlockTimestamp = hexutil.Uint64(time.Now().Unix()) - require.NoError(t, deployConf.Check()) + logger := log.NewLogger(log.DiscardHandler()) + require.NoError(t, deployConf.Check(logger)) l1Deployments := config.L1Deployments.Copy() require.NoError(t, l1Deployments.Check(deployConf)) @@ -130,7 +134,7 @@ func Setup(t require.TestingT, deployParams *DeployParams, alloc *AllocParams) * allocsMode = genesis.L2AllocsEcotone } l2Allocs := config.L2Allocs(allocsMode) - l2Genesis, err := genesis.BuildL2Genesis(deployConf, l2Allocs, l1Block) + l2Genesis, err := genesis.BuildL2Genesis(deployConf, l2Allocs, l1Block.Header()) require.NoError(t, err, "failed to create l2 genesis") if alloc.PrefundTestUsers { for _, addr := range deployParams.Addresses.All() { @@ -143,12 +147,13 @@ func Setup(t require.TestingT, deployParams *DeployParams, alloc *AllocParams) * l2Genesis.Alloc[addr] = val } - var plasma *rollup.PlasmaConfig - if deployConf.UsePlasma { - plasma = &rollup.PlasmaConfig{ + var pcfg *rollup.AltDAConfig + if deployConf.UseAltDA { + pcfg = &rollup.AltDAConfig{ DAChallengeAddress: l1Deployments.DataAvailabilityChallengeProxy, DAChallengeWindow: deployConf.DAChallengeWindow, DAResolveWindow: deployConf.DAResolveWindow, + CommitmentType: altda.KeccakCommitmentString, } } @@ -168,7 +173,7 @@ func Setup(t require.TestingT, deployParams *DeployParams, alloc *AllocParams) * BlockTime: deployConf.L2BlockTime, MaxSequencerDrift: deployConf.MaxSequencerDrift, SeqWindowSize: deployConf.SequencerWindowSize, - ChannelTimeout: deployConf.ChannelTimeout, + ChannelTimeoutBedrock: deployConf.ChannelTimeoutBedrock, L1ChainID: new(big.Int).SetUint64(deployConf.L1ChainID), L2ChainID: new(big.Int).SetUint64(deployConf.L2ChainID), BatchInboxAddress: deployConf.BatchInboxAddress, @@ -179,8 +184,9 @@ func Setup(t require.TestingT, deployParams *DeployParams, alloc *AllocParams) * DeltaTime: deployConf.DeltaTime(uint64(deployConf.L1GenesisBlockTimestamp)), EcotoneTime: deployConf.EcotoneTime(uint64(deployConf.L1GenesisBlockTimestamp)), FjordTime: deployConf.FjordTime(uint64(deployConf.L1GenesisBlockTimestamp)), + GraniteTime: deployConf.GraniteTime(uint64(deployConf.L1GenesisBlockTimestamp)), InteropTime: deployConf.InteropTime(uint64(deployConf.L1GenesisBlockTimestamp)), - PlasmaConfig: plasma, + AltDAConfig: pcfg, } require.NoError(t, rollupCfg.Check()) @@ -209,7 +215,8 @@ func SystemConfigFromDeployConfig(deployConfig *genesis.DeployConfig) eth.System } func ApplyDeployConfigForks(deployConfig *genesis.DeployConfig) { - isFjord := os.Getenv("OP_E2E_USE_FJORD") == "true" + isGranite := os.Getenv("OP_E2E_USE_GRANITE") == "true" + isFjord := isGranite || os.Getenv("OP_E2E_USE_FJORD") == "true" isEcotone := isFjord || os.Getenv("OP_E2E_USE_ECOTONE") == "true" isDelta := isEcotone || os.Getenv("OP_E2E_USE_DELTA") == "true" if isDelta { @@ -221,15 +228,29 @@ func ApplyDeployConfigForks(deployConfig *genesis.DeployConfig) { if isFjord { deployConfig.L2GenesisFjordTimeOffset = new(hexutil.Uint64) } + if isGranite { + deployConfig.L2GenesisGraniteTimeOffset = new(hexutil.Uint64) + } // Canyon and lower is activated by default deployConfig.L2GenesisCanyonTimeOffset = new(hexutil.Uint64) deployConfig.L2GenesisRegolithTimeOffset = new(hexutil.Uint64) } -func UseFPAC() bool { - return os.Getenv("OP_E2E_USE_FPAC") == "true" +func UseFaultProofs() bool { + return !UseL2OO() +} + +func UseL2OO() bool { + return (os.Getenv("OP_E2E_USE_L2OO") == "true" || + os.Getenv("DEVNET_L2OO") == "true") +} + +func UseAltDA() bool { + return (os.Getenv("OP_E2E_USE_ALTDA") == "true" || + os.Getenv("DEVNET_ALTDA") == "true") } -func UsePlasma() bool { - return os.Getenv("OP_E2E_USE_PLASMA") == "true" +func UseMTCannon() bool { + return (os.Getenv("OP_E2E_USE_MT_CANNON") == "true" || + os.Getenv("USE_MT_CANNON") == "true") } diff --git a/op-e2e/e2eutils/setuputils/utils.go b/op-e2e/e2eutils/setuputils/utils.go new file mode 100644 index 000000000000..12f6bca83f42 --- /dev/null +++ b/op-e2e/e2eutils/setuputils/utils.go @@ -0,0 +1,32 @@ +package setuputils + +import ( + "crypto/ecdsa" + "time" + + "github.com/ethereum-optimism/optimism/op-service/crypto" + + "github.com/ethereum/go-ethereum/common/hexutil" + + "github.com/ethereum-optimism/optimism/op-service/endpoint" + "github.com/ethereum-optimism/optimism/op-service/txmgr" +) + +func hexPriv(in *ecdsa.PrivateKey) string { + b := crypto.EncodePrivKey(in) + return hexutil.Encode(b) +} + +func NewTxMgrConfig(l1Addr endpoint.RPC, privKey *ecdsa.PrivateKey) txmgr.CLIConfig { + return txmgr.CLIConfig{ + L1RPCURL: l1Addr.RPC(), + PrivateKey: hexPriv(privKey), + NumConfirmations: 1, + SafeAbortNonceTooLowCount: 3, + FeeLimitMultiplier: 5, + ResubmissionTimeout: 3 * time.Second, + ReceiptQueryInterval: 50 * time.Millisecond, + NetworkTimeout: 2 * time.Second, + TxNotInMempoolTimeout: 2 * time.Minute, + } +} diff --git a/op-e2e/e2eutils/transactions/blobs.go b/op-e2e/e2eutils/transactions/blobs.go index 980c357a1b68..e176ca7c91b2 100644 --- a/op-e2e/e2eutils/transactions/blobs.go +++ b/op-e2e/e2eutils/transactions/blobs.go @@ -8,14 +8,14 @@ import ( ) var ( - emptyBlob kzg4844.Blob + emptyBlob *kzg4844.Blob emptyBlobCommit kzg4844.Commitment emptyBlobProof kzg4844.Proof ) func init() { var err error - emptyBlob = kzg4844.Blob{} + emptyBlob = &kzg4844.Blob{} emptyBlobCommit, err = kzg4844.BlobToCommitment(emptyBlob) if err != nil { panic("failed to create empty blob commitment: " + err.Error()) @@ -30,7 +30,7 @@ func init() { // https://github.com/ethereum/go-ethereum/commit/2a6beb6a39d7cb3c5906dd4465d65da6efcc73cd func CreateEmptyBlobTx(withSidecar bool, chainID uint64) *types.BlobTx { sidecar := &types.BlobTxSidecar{ - Blobs: []kzg4844.Blob{emptyBlob}, + Blobs: []kzg4844.Blob{*emptyBlob}, Commitments: []kzg4844.Commitment{emptyBlobCommit}, Proofs: []kzg4844.Proof{emptyBlobProof}, } diff --git a/op-e2e/e2eutils/transactions/count.go b/op-e2e/e2eutils/transactions/count.go new file mode 100644 index 000000000000..0f4d41fe0478 --- /dev/null +++ b/op-e2e/e2eutils/transactions/count.go @@ -0,0 +1,21 @@ +package transactions + +import ( + "github.com/ethereum/go-ethereum/common" + "github.com/ethereum/go-ethereum/core/types" +) + +func TransactionsBySender(block *types.Block, sender common.Address) (int64, error) { + txCount := int64(0) + for _, tx := range block.Transactions() { + signer := types.NewCancunSigner(tx.ChainId()) + txSender, err := types.Sender(signer, tx) + if err != nil { + return 0, err + } + if txSender == sender { + txCount++ + } + } + return txCount, nil +} diff --git a/op-e2e/e2eutils/transactions/send.go b/op-e2e/e2eutils/transactions/send.go new file mode 100644 index 000000000000..a5f3f83ba1b4 --- /dev/null +++ b/op-e2e/e2eutils/transactions/send.go @@ -0,0 +1,111 @@ +package transactions + +import ( + "context" + "crypto/ecdsa" + "fmt" + "math/big" + "testing" + + "github.com/ethereum-optimism/optimism/op-e2e/e2eutils/wait" + "github.com/ethereum-optimism/optimism/op-service/errutil" + "github.com/ethereum-optimism/optimism/op-service/txmgr" + "github.com/ethereum/go-ethereum" + "github.com/ethereum/go-ethereum/core/types" + "github.com/ethereum/go-ethereum/crypto" + "github.com/ethereum/go-ethereum/ethclient" + "github.com/ethereum/go-ethereum/params" + "github.com/stretchr/testify/require" +) + +type SendTxOpt func(cfg *sendTxCfg) + +type sendTxCfg struct { + receiptStatus uint64 + ignoreReceiptStatus bool +} + +func makeSendTxCfg(opts ...SendTxOpt) *sendTxCfg { + cfg := &sendTxCfg{ + receiptStatus: types.ReceiptStatusSuccessful, + } + for _, opt := range opts { + opt(cfg) + } + return cfg +} + +func WithReceiptFail() SendTxOpt { + return func(cfg *sendTxCfg) { + cfg.receiptStatus = types.ReceiptStatusFailed + } +} + +func WithReceiptStatusIgnore() SendTxOpt { + return func(cfg *sendTxCfg) { + cfg.ignoreReceiptStatus = true + } +} + +func RequireSendTx(t *testing.T, ctx context.Context, client *ethclient.Client, candidate txmgr.TxCandidate, privKey *ecdsa.PrivateKey, opts ...SendTxOpt) (*types.Transaction, *types.Receipt) { + tx, rcpt, err := SendTx(ctx, client, candidate, privKey, opts...) + require.NoError(t, err, "Failed to send transaction") + return tx, rcpt +} + +func SendTx(ctx context.Context, client *ethclient.Client, candidate txmgr.TxCandidate, privKey *ecdsa.PrivateKey, opts ...SendTxOpt) (*types.Transaction, *types.Receipt, error) { + cfg := makeSendTxCfg(opts...) + from := crypto.PubkeyToAddress(privKey.PublicKey) + chainID, err := client.ChainID(ctx) + if err != nil { + return nil, nil, fmt.Errorf("failed to get chain ID: %w", err) + } + nonce, err := client.PendingNonceAt(ctx, from) + if err != nil { + return nil, nil, fmt.Errorf("failed to get next nonce: %w", err) + } + + latestBlock, err := client.HeaderByNumber(ctx, nil) + if err != nil { + return nil, nil, fmt.Errorf("failed to get latest block: %w", err) + } + gasFeeCap := new(big.Int).Mul(latestBlock.BaseFee, big.NewInt(3)) + gasTipCap := big.NewInt(1 * params.GWei) + if gasFeeCap.Cmp(gasTipCap) < 0 { + // gasTipCap can't be higher than gasFeeCap + // Since there's a minimum gasTipCap to be accepted, increase the gasFeeCap. Extra will be refunded anyway. + gasFeeCap = gasTipCap + } + msg := ethereum.CallMsg{ + From: from, + To: candidate.To, + Value: candidate.Value, + GasTipCap: gasTipCap, + GasFeeCap: gasFeeCap, + Data: candidate.TxData, + } + gas, err := client.EstimateGas(ctx, msg) + if err != nil { + return nil, nil, fmt.Errorf("failed to estimate gas: %w", errutil.TryAddRevertReason(err)) + } + + tx := types.MustSignNewTx(privKey, types.LatestSignerForChainID(chainID), &types.DynamicFeeTx{ + ChainID: chainID, + Nonce: nonce, + To: candidate.To, + Value: candidate.Value, + GasTipCap: gasTipCap, + GasFeeCap: gasFeeCap, + Data: candidate.TxData, + Gas: gas, + }) + err = client.SendTransaction(ctx, tx) + if err != nil { + return nil, nil, fmt.Errorf("failed to send transaction (tx: %s): %w", tx.Hash(), errutil.TryAddRevertReason(err)) + } + receipt, err := wait.ForReceiptMaybe(ctx, client, tx.Hash(), cfg.receiptStatus, cfg.ignoreReceiptStatus) + if err != nil { + return tx, receipt, fmt.Errorf("failed to find OK receipt (tx: %s): %w", tx.Hash(), err) + } + return tx, receipt, nil +} diff --git a/op-e2e/e2eutils/wait/blocks.go b/op-e2e/e2eutils/wait/blocks.go index 9617c71a69b3..26ac97d9b9c5 100644 --- a/op-e2e/e2eutils/wait/blocks.go +++ b/op-e2e/e2eutils/wait/blocks.go @@ -4,6 +4,7 @@ import ( "context" "fmt" "math/big" + "strings" "time" "github.com/ethereum/go-ethereum/core/types" @@ -97,9 +98,19 @@ func ForSafeBlock(ctx context.Context, rollupClient *sources.RollupClient, n uin func ForNextSafeBlock(ctx context.Context, client BlockCaller) (*types.Block, error) { safeBlockNumber := big.NewInt(rpc.SafeBlockNumber.Int64()) - current, err := client.BlockByNumber(ctx, safeBlockNumber) - if err != nil { - return nil, err + var current *types.Block + var err error + for { + current, err = client.BlockByNumber(ctx, safeBlockNumber) + if err != nil { + // If block is not found (e.g. upon startup of chain, when there is no "safe block" yet) + // then it may be found later. Keep wait loop running. + if strings.Contains(err.Error(), "block not found") { + continue + } + return nil, err + } + break } // Long timeout so we don't have to care what the block time is. If the test passes this will complete early anyway. @@ -112,6 +123,11 @@ func ForNextSafeBlock(ctx context.Context, client BlockCaller) (*types.Block, er default: next, err := client.BlockByNumber(ctx, safeBlockNumber) if err != nil { + // If block is not found (e.g. upon startup of chain, when there is no "safe block" yet) + // then it may be found later. Keep wait loop running. + if strings.Contains(err.Error(), "block not found") { + continue + } return nil, err } if next.NumberU64() > current.NumberU64() { diff --git a/op-e2e/e2eutils/wait/waits.go b/op-e2e/e2eutils/wait/waits.go index c19db934fff4..3c0e29466cea 100644 --- a/op-e2e/e2eutils/wait/waits.go +++ b/op-e2e/e2eutils/wait/waits.go @@ -33,14 +33,19 @@ func ForBalanceChange(ctx context.Context, client *ethclient.Client, address com } func ForReceiptOK(ctx context.Context, client *ethclient.Client, hash common.Hash) (*types.Receipt, error) { - return ForReceipt(ctx, client, hash, types.ReceiptStatusSuccessful) + return ForReceiptMaybe(ctx, client, hash, types.ReceiptStatusSuccessful, false) } func ForReceiptFail(ctx context.Context, client *ethclient.Client, hash common.Hash) (*types.Receipt, error) { - return ForReceipt(ctx, client, hash, types.ReceiptStatusFailed) + return ForReceiptMaybe(ctx, client, hash, types.ReceiptStatusFailed, false) } func ForReceipt(ctx context.Context, client *ethclient.Client, hash common.Hash, status uint64) (*types.Receipt, error) { + return ForReceiptMaybe(ctx, client, hash, status, false) +} + +// ForReceiptMaybe waits for the receipt, but may be configured to ignore the status +func ForReceiptMaybe(ctx context.Context, client *ethclient.Client, hash common.Hash, status uint64, statusIgnore bool) (*types.Receipt, error) { ctx, cancel := context.WithTimeout(ctx, 2*time.Minute) defer cancel() ticker := time.NewTicker(100 * time.Millisecond) @@ -50,7 +55,7 @@ func ForReceipt(ctx context.Context, client *ethclient.Client, hash common.Hash, 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() + return nil, fmt.Errorf("timed out waiting for tx %s: %w: %w", hash, err, ctx.Err()) case <-ticker.C: continue } @@ -59,38 +64,61 @@ func ForReceipt(ctx context.Context, client *ethclient.Client, hash common.Hash, continue } if err != nil { - return nil, fmt.Errorf("failed to get receipt: %w", err) + return nil, fmt.Errorf("failed to get receipt for tx %s: %w", hash, err) } - if receipt.Status != status { - printDebugTrace(ctx, client, hash) - return receipt, fmt.Errorf("expected status %d, but got %d", status, receipt.Status) + if !statusIgnore && receipt.Status != status { + trace, err := DebugTraceTx(ctx, client, hash) + if err != nil { + // still return receipt if trace couldn't be obtained + return receipt, fmt.Errorf("unexpected receipt status %d, error tracing tx: %w", receipt.Status, err) + } + return receipt, &ReceiptStatusError{Status: receipt.Status, TxTrace: trace} } return receipt, nil } } -type jsonRawString string +type ( + ReceiptStatusError struct { + Status uint64 + TxTrace *TxTrace + } + + CallTrace struct { + From common.Address `json:"from"` + Gas hexutil.Uint64 `json:"gas"` + GasUsed hexutil.Uint64 `json:"gasUsed"` + To common.Address `json:"to"` + Input hexutil.Bytes `json:"input"` + Output hexutil.Bytes `json:"output"` + Error string `json:"error"` + Value hexutil.U256 `json:"value"` + Type string `json:"type"` + } + + TxTrace struct { + CallTrace + Calls []CallTrace `json:"calls"` + } +) -func (s *jsonRawString) UnmarshalJSON(input []byte) error { - str := jsonRawString(input) - *s = str - return nil +func (rse *ReceiptStatusError) Error() string { + return fmt.Sprintf("unexpected receipt status %d (tx trace: %+v)", rse.Status, rse.TxTrace) } -// printDebugTrace logs debug_traceTransaction output to aid in debugging unexpected receipt statuses -func printDebugTrace(ctx context.Context, client *ethclient.Client, txHash common.Hash) { - var trace jsonRawString +// DebugTraceTx logs debug_traceTransaction output to aid in debugging unexpected receipt statuses +func DebugTraceTx(ctx context.Context, client *ethclient.Client, txHash common.Hash) (*TxTrace, error) { + trace := new(TxTrace) options := map[string]any{ "enableReturnData": true, "tracer": "callTracer", "tracerConfig": map[string]any{}, } - err := client.Client().CallContext(ctx, &trace, "debug_traceTransaction", hexutil.Bytes(txHash.Bytes()), options) + err := client.Client().CallContext(ctx, trace, "debug_traceTransaction", hexutil.Bytes(txHash.Bytes()), options) if err != nil { - fmt.Printf("TxTrace unavailable: %v\n", err) - return + return nil, fmt.Errorf("calling debug_traceTransaction: %w", err) } - fmt.Printf("TxTrace: %v\n", trace) + return trace, nil } func For(ctx context.Context, rate time.Duration, cb func() (bool, error)) error { diff --git a/op-e2e/eip4844_test.go b/op-e2e/eip4844_test.go deleted file mode 100644 index 5b5cc1d5308e..000000000000 --- a/op-e2e/eip4844_test.go +++ /dev/null @@ -1,195 +0,0 @@ -package op_e2e - -import ( - "context" - "math/big" - "math/rand" - "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/core/types" - "github.com/ethereum/go-ethereum/log" - "github.com/ethereum/go-ethereum/rpc" - - batcherFlags "github.com/ethereum-optimism/optimism/op-batcher/flags" - gethutils "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/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/sources" - "github.com/ethereum-optimism/optimism/op-service/testlog" - "github.com/ethereum-optimism/optimism/op-service/testutils" -) - -// TestSystem4844E2E runs the SystemE2E test with 4844 enabled on L1, -// and active on the rollup in the op-batcher and verifier. -func TestSystem4844E2E(t *testing.T) { - t.Run("single-blob", func(t *testing.T) { testSystem4844E2E(t, false) }) - t.Run("multi-blob", func(t *testing.T) { testSystem4844E2E(t, true) }) -} - -func testSystem4844E2E(t *testing.T, multiBlob bool) { - InitParallel(t) - - cfg := DefaultSystemConfig(t) - cfg.DataAvailabilityType = batcherFlags.BlobsType - const maxBlobs = 6 - var maxL1TxSize int - if multiBlob { - cfg.BatcherTargetNumFrames = 6 - cfg.BatcherUseMaxTxSizeForBlobs = true - // leads to 6 blobs for an L2 block with a user tx with 400 random bytes - // while all other L2 blocks take 1 blob (deposit tx) - maxL1TxSize = derive.FrameV0OverHeadSize + 100 - cfg.BatcherMaxL1TxSizeBytes = uint64(maxL1TxSize) - } - - genesisActivation := hexutil.Uint64(0) - cfg.DeployConfig.L1CancunTimeOffset = &genesisActivation - cfg.DeployConfig.L2GenesisDeltaTimeOffset = &genesisActivation - cfg.DeployConfig.L2GenesisEcotoneTimeOffset = &genesisActivation - - sys, err := cfg.Start(t) - 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) - - l1Client := sys.Clients["l1"] - l2Seq := sys.Clients["sequencer"] - l2Verif := sys.Clients["verifier"] - - // Transactor Account - ethPrivKey := cfg.Secrets.Alice - - // 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") - - // 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} - // put some random data in the tx to make it fill up 6 blobs (multi-blob case) - opts.Data = testutils.RandomData(rand.New(rand.NewSource(420)), 400) - 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) - // basic check that version endpoint works - seqVersion, err := rollupClient.Version(context.Background()) - require.NoError(t, err) - require.NotEqual(t, "", seqVersion) - - // 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 - 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") - - // find L1 block that contained the blob(s) batch tx - tip, err := l1Client.HeaderByNumber(context.Background(), nil) - require.NoError(t, err) - var blobTx *types.Transaction - blobBlock, err := gethutils.FindBlock(l1Client, int(tip.Number.Int64()), 0, 5*time.Second, - func(b *types.Block) (bool, error) { - for _, tx := range b.Transactions() { - if tx.Type() != types.BlobTxType { - continue - } - // expect to find at least one tx with multiple blobs in multi-blob case - if !multiBlob || len(tx.BlobHashes()) > 1 { - blobTx = tx - return true, nil - } - } - return false, nil - }) - require.NoError(t, err) - - numBlobs := len(blobTx.BlobHashes()) - if !multiBlob { - require.NotZero(t, numBlobs, "single-blob: expected to find L1 blob tx") - } else { - require.Equal(t, maxBlobs, numBlobs, "multi-blob: expected to find L1 blob tx with 6 blobs") - // blob tx should have filled up all but last blob - bcl := sys.L1BeaconHTTPClient() - hashes := toIndexedBlobHashes(blobTx.BlobHashes()...) - sidecars, err := bcl.BeaconBlobSideCars(context.Background(), false, sys.L1Slot(blobBlock.Time()), hashes) - require.NoError(t, err) - require.Len(t, sidecars.Data, maxBlobs) - for i := 0; i < maxBlobs-1; i++ { - data, err := sidecars.Data[i].Blob.ToData() - require.NoError(t, err) - require.Len(t, data, maxL1TxSize) - } - // last blob should only be partially filled - data, err := sidecars.Data[maxBlobs-1].Blob.ToData() - require.NoError(t, err) - require.Less(t, len(data), maxL1TxSize) - } -} - -func toIndexedBlobHashes(hs ...common.Hash) []eth.IndexedBlobHash { - hashes := make([]eth.IndexedBlobHash, 0, len(hs)) - for i, hash := range hs { - hashes = append(hashes, eth.IndexedBlobHash{Index: uint64(i), Hash: hash}) - } - return hashes -} diff --git a/op-e2e/external_geth/main.go b/op-e2e/external_geth/main.go index dc965131f94e..c8921b9b3ece 100644 --- a/op-e2e/external_geth/main.go +++ b/op-e2e/external_geth/main.go @@ -5,6 +5,7 @@ import ( "errors" "flag" "fmt" + "io" "os" "os/exec" "os/signal" @@ -72,7 +73,8 @@ func run(configPath string) error { fmt.Printf("================== op-geth shim awaiting termination ==========================\n") sigs := make(chan os.Signal, 1) - signal.Notify(sigs, syscall.SIGINT, syscall.SIGTERM) + defer signal.Stop(sigs) + signal.Notify(sigs, os.Interrupt, syscall.SIGTERM) select { case <-sigs: @@ -110,6 +112,7 @@ func initialize(binPath string, config external.Config) error { cmd := exec.Command( binPath, "--datadir", config.DataDir, + "--state.scheme=hash", "init", config.GenesisPath, ) return cmd.Run() @@ -145,6 +148,7 @@ func execute(binPath string, config external.Config) (*gethSession, error) { "--ws.port", "0", "--ws.api", "debug,eth,txpool,net,engine", "--syncmode=full", + "--state.scheme=hash", "--nodiscover", "--port", "0", "--maxpeers", "0", @@ -176,7 +180,9 @@ func execute(binPath string, config external.Config) (*gethSession, error) { } var authString string var port int - fmt.Fscanf(sess.Err, "%d %s", &port, &authString) + if _, err := fmt.Fscanf(sess.Err, "%d %s", &port, &authString); err != nil && !errors.Is(err, io.EOF) { + return nil, fmt.Errorf("error while reading auth string: %w", err) + } switch authString { case "auth=true": enginePort = port diff --git a/op-e2e/external_geth/main_test.go b/op-e2e/external_geth/main_test.go index f51cd474850c..b971057e0cc2 100644 --- a/op-e2e/external_geth/main_test.go +++ b/op-e2e/external_geth/main_test.go @@ -9,9 +9,12 @@ import ( "testing" "time" - e2e "github.com/ethereum-optimism/optimism/op-e2e" - "github.com/ethereum-optimism/optimism/op-e2e/config" + "github.com/ethereum-optimism/optimism/op-e2e/system/e2esys" + "github.com/stretchr/testify/require" + + "github.com/ethereum-optimism/optimism/op-e2e/config" + "github.com/ethereum-optimism/optimism/op-service/endpoint" ) func TestShim(t *testing.T) { @@ -35,19 +38,19 @@ func TestShim(t *testing.T) { config.EthNodeVerbosity = config.LegacyLevelDebug - ec := (&e2e.ExternalRunner{ + ec := (&e2esys.ExternalRunner{ Name: "TestShim", BinPath: shimPath, }).Run(t) t.Cleanup(func() { _ = ec.Close() }) - for _, endpoint := range []string{ - ec.HTTPEndpoint(), - ec.HTTPAuthEndpoint(), - ec.WSEndpoint(), - ec.WSAuthEndpoint(), + for _, rpcEndpoint := range []string{ + ec.UserRPC().(endpoint.HttpRPC).HttpRPC(), + ec.AuthRPC().(endpoint.HttpRPC).HttpRPC(), + ec.UserRPC().(endpoint.WsRPC).WsRPC(), + ec.AuthRPC().(endpoint.WsRPC).WsRPC(), } { - plainURL, err := url.ParseRequestURI(endpoint) + plainURL, err := url.ParseRequestURI(rpcEndpoint) require.NoError(t, err) _, err = net.DialTimeout("tcp", plainURL.Host, time.Second) require.NoError(t, err, "could not connect to HTTP port") diff --git a/op-e2e/fastlz/fastlz.go b/op-e2e/fastlz/fastlz.go index fc0a43cf3af7..1cb56ce1cda3 100644 --- a/op-e2e/fastlz/fastlz.go +++ b/op-e2e/fastlz/fastlz.go @@ -1,3 +1,6 @@ +//go:build cgo_test +// +build cgo_test + package fastlz // #include diff --git a/op-e2e/faultproofs/bigCodeCreateInput.data b/op-e2e/faultproofs/bigCodeCreateInput.data new file mode 100644 index 000000000000..44891a39e07f --- /dev/null +++ b/op-e2e/faultproofs/bigCodeCreateInput.data @@ -0,0 +1 @@ +0x6080604052348015600f57600080fd5b50615fdd8061001f6000396000f3fe608060405234801561001057600080fd5b506004361061002b5760003560e01c8063dbd8cd6314610030575b600080fd5b61003861003a565b005b60405180615f800160405280615f4e815260200161005a615f4e91395056feaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa2646970667358221220b25c21f2147000f10799a57b6475538b627899e60949e1142a24c6c19e21af7364736f6c63430008190033 diff --git a/op-e2e/faultproofs/cannon_benchmark_test.go b/op-e2e/faultproofs/cannon_benchmark_test.go new file mode 100644 index 000000000000..7171d1211764 --- /dev/null +++ b/op-e2e/faultproofs/cannon_benchmark_test.go @@ -0,0 +1,193 @@ +package faultproofs + +import ( + "context" + "crypto/ecdsa" + "encoding/json" + "math/big" + "os" + "path" + "sync" + "testing" + "time" + + op_e2e "github.com/ethereum-optimism/optimism/op-e2e" + "github.com/ethereum-optimism/optimism/op-e2e/system/e2esys" + + "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/pkg/errors" + "github.com/stretchr/testify/require" + + "github.com/ethereum-optimism/optimism/cannon/mipsevm" + "github.com/ethereum-optimism/optimism/op-challenger/game/fault/trace/utils" + "github.com/ethereum-optimism/optimism/op-e2e/bindings" + "github.com/ethereum-optimism/optimism/op-e2e/e2eutils/wait" + "github.com/ethereum-optimism/optimism/op-service/predeploys" + "github.com/ethereum-optimism/optimism/op-service/testlog" +) + +func TestBenchmarkCannon_FPP(t *testing.T) { + t.Skip("TODO(client-pod#906): Compare total witness size for assertions against pages allocated by the VM") + + op_e2e.InitParallel(t, op_e2e.UsesCannon) + ctx := context.Background() + cfg := e2esys.DefaultSystemConfig(t) + // We don't need a verifier - just the sequencer is enough + delete(cfg.Nodes, "verifier") + // Use a small sequencer window size to avoid test timeout while waiting for empty blocks + // But not too small to ensure that our claim and subsequent state change is published + cfg.DeployConfig.SequencerWindowSize = 16 + minTs := hexutil.Uint64(0) + cfg.DeployConfig.L2GenesisDeltaTimeOffset = &minTs + cfg.DeployConfig.L2GenesisEcotoneTimeOffset = &minTs + + sys, err := cfg.Start(t) + require.Nil(t, err, "Error starting up system") + + 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) + + l1Client := sys.NodeClient("l1") + l2Seq := sys.NodeClient("sequencer") + rollupClient := sys.RollupClient("sequencer") + require.NoError(t, wait.ForUnsafeBlock(ctx, rollupClient, 1)) + + // Agreed state: 200 Big Contracts deployed at max size - total codesize is 5.90 MB + // In Fault Proof: Perform multicalls calling each Big Contract + // - induces 200 oracle.CodeByHash preimage loads + // Assertion: Under 2000 pages requested by the program (i.e. max ~8 MB). Assumes derivation overhead; block finalization, etc, requires < 1 MB of program memory. + + const numCreates = 200 + newContracts := createBigContracts(ctx, t, cfg, l2Seq, cfg.Secrets.Alice, numCreates) + receipt := callBigContracts(ctx, t, cfg, l2Seq, cfg.Secrets.Alice, newContracts) + + t.Log("Capture the latest L2 head that preceedes contract creations as agreed starting point") + agreedBlock, err := l2Seq.BlockByNumber(ctx, new(big.Int).Sub(receipt.BlockNumber, big.NewInt(1))) + require.NoError(t, err) + agreedL2Output, err := rollupClient.OutputAtBlock(ctx, agreedBlock.NumberU64()) + require.NoError(t, err, "could not retrieve l2 agreed block") + l2Head := agreedL2Output.BlockRef.Hash + l2OutputRoot := agreedL2Output.OutputRoot + + t.Log("Determine L2 claim") + l2ClaimBlockNumber := receipt.BlockNumber + l2Output, err := rollupClient.OutputAtBlock(ctx, l2ClaimBlockNumber.Uint64()) + require.NoError(t, err, "could not get expected output") + l2Claim := l2Output.OutputRoot + + t.Log("Determine L1 head that includes all batches required for L2 claim block") + require.NoError(t, wait.ForSafeBlock(ctx, rollupClient, l2ClaimBlockNumber.Uint64())) + l1HeadBlock, err := l1Client.BlockByNumber(ctx, nil) + require.NoError(t, err, "get l1 head block") + l1Head := l1HeadBlock.Hash() + + inputs := utils.LocalGameInputs{ + L1Head: l1Head, + L2Head: l2Head, + L2Claim: common.Hash(l2Claim), + L2OutputRoot: common.Hash(l2OutputRoot), + L2BlockNumber: l2ClaimBlockNumber, + } + debugfile := path.Join(t.TempDir(), "debug.json") + runCannon(t, ctx, sys, inputs, "--debug-info", debugfile) + data, err := os.ReadFile(debugfile) + require.NoError(t, err) + var debuginfo mipsevm.DebugInfo + require.NoError(t, json.Unmarshal(data, &debuginfo)) + t.Logf("Debug info: %#v", debuginfo) + // TODO(client-pod#906): Use maximum witness size for assertions against pages allocated by the VM +} + +func createBigContracts(ctx context.Context, t *testing.T, cfg e2esys.SystemConfig, client *ethclient.Client, key *ecdsa.PrivateKey, numContracts int) []common.Address { + /* + contract Big { + bytes constant foo = hex"<24.4 KB of random data>"; + function ekans() external { foo; } + } + */ + createInputHex, err := os.ReadFile("bigCodeCreateInput.data") + createInput := common.FromHex(string(createInputHex[2:])) + require.NoError(t, err) + + nonce, err := client.NonceAt(ctx, crypto.PubkeyToAddress(key.PublicKey), nil) + require.NoError(t, err) + + type result struct { + addr common.Address + err error + } + + var wg sync.WaitGroup + wg.Add(numContracts) + results := make(chan result, numContracts) + for i := 0; i < numContracts; i++ { + tx := types.MustSignNewTx(key, types.LatestSignerForChainID(cfg.L2ChainIDBig()), &types.DynamicFeeTx{ + ChainID: cfg.L2ChainIDBig(), + Nonce: nonce + uint64(i), + To: nil, + GasTipCap: big.NewInt(10), + GasFeeCap: big.NewInt(200), + Gas: 10_000_000, + Data: createInput, + }) + go func() { + defer wg.Done() + ctx, cancel := context.WithTimeout(ctx, 120*time.Second) + defer cancel() + err := client.SendTransaction(ctx, tx) + if err != nil { + results <- result{err: errors.Wrap(err, "Sending L2 tx")} + return + } + receipt, err := wait.ForReceiptOK(ctx, client, tx.Hash()) + if err != nil { + results <- result{err: errors.Wrap(err, "Waiting for receipt")} + return + } + results <- result{addr: receipt.ContractAddress, err: nil} + }() + } + wg.Wait() + close(results) + + var addrs []common.Address + for r := range results { + require.NoError(t, r.err) + addrs = append(addrs, r.addr) + } + return addrs +} + +func callBigContracts(ctx context.Context, t *testing.T, cfg e2esys.SystemConfig, client *ethclient.Client, key *ecdsa.PrivateKey, addrs []common.Address) *types.Receipt { + multicall3, err := bindings.NewMultiCall3(predeploys.MultiCall3Addr, client) + require.NoError(t, err) + + chainID, err := client.ChainID(ctx) + require.NoError(t, err) + opts, err := bind.NewKeyedTransactorWithChainID(key, chainID) + require.NoError(t, err) + + var calls []bindings.Multicall3Call3Value + calldata := crypto.Keccak256([]byte("ekans()"))[:4] + for _, addr := range addrs { + calls = append(calls, bindings.Multicall3Call3Value{ + Target: addr, + CallData: calldata, + Value: new(big.Int), + }) + } + opts.GasLimit = 20_000_000 + tx, err := multicall3.Aggregate3Value(opts, calls) + require.NoError(t, err) + + receipt, err := wait.ForReceiptOK(ctx, client, tx.Hash()) + require.NoError(t, err) + t.Logf("Initiated %d calls to the Big Contract. gas used: %d", len(addrs), receipt.GasUsed) + return receipt +} diff --git a/op-e2e/faultproofs/challenge_preimage_test.go b/op-e2e/faultproofs/challenge_preimage_test.go index 226f85c825c1..3bed79ad068e 100644 --- a/op-e2e/faultproofs/challenge_preimage_test.go +++ b/op-e2e/faultproofs/challenge_preimage_test.go @@ -5,6 +5,7 @@ import ( "testing" 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" "github.com/ethereum-optimism/optimism/op-e2e/e2eutils/disputegame/preimage" diff --git a/op-e2e/faultproofs/multi_test.go b/op-e2e/faultproofs/multi_test.go index 8073c3e7596b..83b475d60e0d 100644 --- a/op-e2e/faultproofs/multi_test.go +++ b/op-e2e/faultproofs/multi_test.go @@ -5,6 +5,7 @@ import ( "testing" 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" "github.com/ethereum/go-ethereum/common" diff --git a/op-e2e/faultproofs/output_alphabet_test.go b/op-e2e/faultproofs/output_alphabet_test.go index 3e46c732edb3..9255214ff39b 100644 --- a/op-e2e/faultproofs/output_alphabet_test.go +++ b/op-e2e/faultproofs/output_alphabet_test.go @@ -6,8 +6,9 @@ import ( "testing" "time" - "github.com/ethereum-optimism/optimism/op-challenger/game/types" op_e2e "github.com/ethereum-optimism/optimism/op-e2e" + + "github.com/ethereum-optimism/optimism/op-challenger/game/types" "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/wait" diff --git a/op-e2e/faultproofs/output_cannon_test.go b/op-e2e/faultproofs/output_cannon_test.go index 11a9e9ecdbfb..d0abbac7338c 100644 --- a/op-e2e/faultproofs/output_cannon_test.go +++ b/op-e2e/faultproofs/output_cannon_test.go @@ -3,19 +3,18 @@ package faultproofs import ( "context" "fmt" - "math/big" "testing" + op_e2e "github.com/ethereum-optimism/optimism/op-e2e" + "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" "github.com/ethereum-optimism/optimism/op-e2e/e2eutils/disputegame/preimage" "github.com/ethereum-optimism/optimism/op-e2e/e2eutils/wait" "github.com/ethereum/go-ethereum/common" - "github.com/ethereum/go-ethereum/rpc" "github.com/stretchr/testify/require" ) @@ -196,7 +195,7 @@ func TestOutputCannonDefendStep(t *testing.T) { game.StartChallenger(ctx, "Challenger", challenger.WithPrivKey(sys.Cfg.Secrets.Alice)) - correctTrace := game.CreateHonestActor(ctx, "sequencer", challenger.WithPrivKey(sys.Cfg.Secrets.Mallory)) + correctTrace := game.CreateHonestActor(ctx, "sequencer", disputegame.WithPrivKey(sys.Cfg.Secrets.Mallory)) maxDepth := game.MaxDepth(ctx) game.DefendClaim(ctx, outputRootClaim, func(claim *disputegame.ClaimHelper) *disputegame.ClaimHelper { @@ -312,7 +311,7 @@ func TestOutputCannonStepWithKZGPointEvaluation(t *testing.T) { // NOTE: Flake prevention // Ensure that the L1 origin including the point eval tx isn't on the genesis epoch. - safeBlock, err := sys.Clients["sequencer"].BlockByNumber(ctx, big.NewInt(int64(rpc.SafeBlockNumber))) + safeBlock, err := wait.ForNextSafeBlock(ctx, sys.NodeClient("sequencer")) require.NoError(t, err) require.NoError(t, wait.ForSafeBlock(ctx, sys.RollupClient("sequencer"), safeBlock.NumberU64()+3)) @@ -412,7 +411,7 @@ func TestOutputCannonProposedOutputRootValid(t *testing.T) { disputeGameFactory := disputegame.NewFactoryHelper(t, ctx, sys) game := disputeGameFactory.StartOutputCannonGameWithCorrectRoot(ctx, "sequencer", 1) - correctTrace := game.CreateHonestActor(ctx, "sequencer", challenger.WithPrivKey(sys.Cfg.Secrets.Mallory)) + correctTrace := game.CreateHonestActor(ctx, "sequencer", disputegame.WithPrivKey(sys.Cfg.Secrets.Mallory)) game.StartChallenger(ctx, "Challenger", challenger.WithPrivKey(sys.Cfg.Secrets.Alice)) @@ -447,7 +446,7 @@ func TestOutputCannonPoisonedPostState(t *testing.T) { disputeGameFactory := disputegame.NewFactoryHelper(t, ctx, sys) // Root claim is dishonest game := disputeGameFactory.StartOutputCannonGame(ctx, "sequencer", 1, common.Hash{0xaa}) - correctTrace := game.CreateHonestActor(ctx, "sequencer", challenger.WithPrivKey(sys.Cfg.Secrets.Alice)) + correctTrace := game.CreateHonestActor(ctx, "sequencer", disputegame.WithPrivKey(sys.Cfg.Secrets.Alice)) // Honest first attack at "honest" level claim := correctTrace.AttackClaim(ctx, game.RootClaim(ctx)) @@ -511,7 +510,7 @@ func TestDisputeOutputRootBeyondProposedBlock_ValidOutputRoot(t *testing.T) { disputeGameFactory := disputegame.NewFactoryHelper(t, ctx, sys) // Root claim is dishonest game := disputeGameFactory.StartOutputCannonGameWithCorrectRoot(ctx, "sequencer", 1) - correctTrace := game.CreateHonestActor(ctx, "sequencer", challenger.WithPrivKey(sys.Cfg.Secrets.Alice)) + correctTrace := game.CreateHonestActor(ctx, "sequencer", disputegame.WithPrivKey(sys.Cfg.Secrets.Alice)) // Start the honest challenger game.StartChallenger(ctx, "Honest", challenger.WithPrivKey(sys.Cfg.Secrets.Bob)) @@ -561,7 +560,7 @@ func TestDisputeOutputRootBeyondProposedBlock_InvalidOutputRoot(t *testing.T) { disputeGameFactory := disputegame.NewFactoryHelper(t, ctx, sys) // Root claim is dishonest game := disputeGameFactory.StartOutputCannonGame(ctx, "sequencer", 1, common.Hash{0xaa}) - correctTrace := game.CreateHonestActor(ctx, "sequencer", challenger.WithPrivKey(sys.Cfg.Secrets.Alice)) + correctTrace := game.CreateHonestActor(ctx, "sequencer", disputegame.WithPrivKey(sys.Cfg.Secrets.Alice)) // Start the honest challenger game.StartChallenger(ctx, "Honest", challenger.WithPrivKey(sys.Cfg.Secrets.Bob)) @@ -612,7 +611,7 @@ func TestDisputeOutputRoot_ChangeClaimedOutputRoot(t *testing.T) { disputeGameFactory := disputegame.NewFactoryHelper(t, ctx, sys) // Root claim is dishonest game := disputeGameFactory.StartOutputCannonGame(ctx, "sequencer", 1, common.Hash{0xaa}) - correctTrace := game.CreateHonestActor(ctx, "sequencer", challenger.WithPrivKey(sys.Cfg.Secrets.Alice)) + correctTrace := game.CreateHonestActor(ctx, "sequencer", disputegame.WithPrivKey(sys.Cfg.Secrets.Alice)) // Start the honest challenger game.StartChallenger(ctx, "Honest", challenger.WithPrivKey(sys.Cfg.Secrets.Bob)) @@ -702,7 +701,7 @@ func TestInvalidateUnsafeProposal(t *testing.T) { // Root claim is _dishonest_ because the required data is not available on L1 game := disputeGameFactory.StartOutputCannonGameWithCorrectRoot(ctx, "sequencer", blockNum, disputegame.WithUnsafeProposal()) - correctTrace := game.CreateHonestActor(ctx, "sequencer", challenger.WithPrivKey(sys.Cfg.Secrets.Alice)) + correctTrace := game.CreateHonestActor(ctx, "sequencer", disputegame.WithPrivKey(sys.Cfg.Secrets.Alice)) // Start the honest challenger game.StartChallenger(ctx, "Challenger", challenger.WithPrivKey(sys.Cfg.Secrets.Bob)) @@ -764,7 +763,7 @@ func TestInvalidateProposalForFutureBlock(t *testing.T) { // Root claim is _dishonest_ because the required data is not available on L1 game := disputeGameFactory.StartOutputCannonGame(ctx, "sequencer", farFutureBlockNum, common.Hash{0xaa}, disputegame.WithFutureProposal()) - correctTrace := game.CreateHonestActor(ctx, "sequencer", challenger.WithPrivKey(sys.Cfg.Secrets.Alice)) + correctTrace := game.CreateHonestActor(ctx, "sequencer", disputegame.WithPrivKey(sys.Cfg.Secrets.Alice)) // Start the honest challenger game.StartChallenger(ctx, "Honest", challenger.WithPrivKey(sys.Cfg.Secrets.Bob)) @@ -817,3 +816,140 @@ func TestInvalidateCorrectProposalFutureBlock(t *testing.T) { game.WaitForGameStatus(ctx, gameTypes.GameStatusChallengerWon) game.LogGameData(ctx) } + +func TestOutputCannonHonestSafeTraceExtension_ValidRoot(t *testing.T) { + op_e2e.InitParallel(t, op_e2e.UsesCannon) + + ctx := context.Background() + sys, l1Client := StartFaultDisputeSystem(t) + t.Cleanup(sys.Close) + + // Wait for there to be there are safe L2 blocks past the claimed safe head that have data available on L1 within + // the commitment stored in the dispute game. + safeHeadNum := uint64(3) + require.NoError(t, wait.ForSafeBlock(ctx, sys.RollupClient("sequencer"), safeHeadNum)) + + // Create a dispute game with an honest claim + disputeGameFactory := disputegame.NewFactoryHelper(t, ctx, sys) + game := disputeGameFactory.StartOutputCannonGameWithCorrectRoot(ctx, "sequencer", safeHeadNum-1) + require.NotNil(t, game) + + // Create a correct trace actor with an honest trace extending to L2 block #4 + correctTrace := game.CreateHonestActor(ctx, "sequencer", disputegame.WithPrivKey(sys.Cfg.Secrets.Mallory)) + + // Create a correct trace actor with an honest trace extending to L2 block #5 + // Notably, L2 block #5 is a valid block within the safe chain, and the data required to reproduce it + // will be committed to within the L1 head of the dispute game. + correctTracePlus1 := game.CreateHonestActor(ctx, "sequencer", + disputegame.WithPrivKey(sys.Cfg.Secrets.Mallory), + disputegame.WithClaimedL2BlockNumber(safeHeadNum)) + + // Start the honest challenger. They will defend the root claim. + game.StartChallenger(ctx, "Challenger", challenger.WithPrivKey(sys.Cfg.Secrets.Alice)) + + claim := game.RootClaim(ctx) + game.ChallengeClaim(ctx, claim, func(parent *disputegame.ClaimHelper) *disputegame.ClaimHelper { + // Have to disagree with the root claim - we're trying to invalidate a valid output root + if parent.IsRootClaim() { + return parent.Attack(ctx, common.Hash{0xdd}) + } + return correctTracePlus1.CounterClaim(ctx, parent) + }, func(parentClaimIdx int64) { + correctTrace.StepFails(ctx, parentClaimIdx, true) + correctTrace.StepFails(ctx, parentClaimIdx, false) + correctTracePlus1.StepFails(ctx, parentClaimIdx, true) + correctTracePlus1.StepFails(ctx, parentClaimIdx, false) + }) + game.LogGameData(ctx) + + // Time travel past when the game will be resolvable. + sys.TimeTravelClock.AdvanceTime(game.MaxClockDuration(ctx)) + require.NoError(t, wait.ForNextBlock(ctx, l1Client)) + + game.WaitForInactivity(ctx, 10, true) + game.LogGameData(ctx) + require.EqualValues(t, gameTypes.GameStatusDefenderWon, game.Status(ctx)) +} + +func TestOutputCannonHonestSafeTraceExtension_InvalidRoot(t *testing.T) { + op_e2e.InitParallel(t, op_e2e.UsesCannon) + + ctx := context.Background() + sys, l1Client := StartFaultDisputeSystem(t) + t.Cleanup(sys.Close) + + // Wait for there to be there are safe L2 blocks past the claimed safe head that have data available on L1 within + // the commitment stored in the dispute game. + safeHeadNum := uint64(2) + require.NoError(t, wait.ForSafeBlock(ctx, sys.RollupClient("sequencer"), safeHeadNum)) + + // Create a dispute game with a dishonest claim @ L2 block #4 + disputeGameFactory := disputegame.NewFactoryHelper(t, ctx, sys) + game := disputeGameFactory.StartOutputCannonGame(ctx, "sequencer", safeHeadNum-1, common.Hash{0xCA, 0xFE}) + require.NotNil(t, game) + + // Create a correct trace actor with an honest trace extending to L2 block #5 + // Notably, L2 block #5 is a valid block within the safe chain, and the data required to reproduce it + // will be committed to within the L1 head of the dispute game. + correctTracePlus1 := game.CreateHonestActor(ctx, "sequencer", + disputegame.WithPrivKey(sys.Cfg.Secrets.Mallory), + disputegame.WithClaimedL2BlockNumber(safeHeadNum)) + + // Start the honest challenger. They will challenge the root claim. + game.StartChallenger(ctx, "Challenger", challenger.WithPrivKey(sys.Cfg.Secrets.Alice)) + + claim := game.RootClaim(ctx) + game.DefendClaim(ctx, claim, func(parent *disputegame.ClaimHelper) *disputegame.ClaimHelper { + return correctTracePlus1.CounterClaim(ctx, parent) + }) + + // Time travel past when the game will be resolvable. + sys.TimeTravelClock.AdvanceTime(game.MaxClockDuration(ctx)) + require.NoError(t, wait.ForNextBlock(ctx, l1Client)) + + game.WaitForInactivity(ctx, 10, true) + game.LogGameData(ctx) + require.EqualValues(t, gameTypes.GameStatusChallengerWon, game.Status(ctx)) +} + +func TestAgreeFirstBlockWithOriginOf1(t *testing.T) { + op_e2e.InitParallel(t, op_e2e.UsesCannon) + + ctx := context.Background() + sys, _ := StartFaultDisputeSystem(t) + t.Cleanup(sys.Close) + + rollupClient := sys.RollupClient("sequencer") + blockNum := uint64(0) + limit := uint64(100) + for ; blockNum <= limit; blockNum++ { + require.NoError(t, wait.ForBlock(ctx, sys.NodeClient("sequencer"), blockNum)) + output, err := rollupClient.OutputAtBlock(ctx, blockNum) + require.NoError(t, err) + if output.BlockRef.L1Origin.Number == 1 { + break + } + } + require.Less(t, blockNum, limit) + + // Create a dispute game with a dishonest claim @ L2 block #4 + disputeGameFactory := disputegame.NewFactoryHelper(t, ctx, sys) + // Make the agreed block the first one with L1 origin of block 1 so the claim is blockNum+1 + game := disputeGameFactory.StartOutputCannonGame(ctx, "sequencer", blockNum+1, common.Hash{0xCA, 0xFE}) + require.NotNil(t, game) + outputRootClaim := game.DisputeLastBlock(ctx) + game.LogGameData(ctx) + + honestChallenger := game.StartChallenger(ctx, "HonestActor", 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. + outputRootClaim = outputRootClaim.WaitForCounterClaim(ctx) + game.LogGameData(ctx) + + // Should claim output root is invalid, but actually panics. + outputRootClaim.RequireInvalidStatusCode() + // 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. + require.NoError(t, honestChallenger.Close()) +} diff --git a/op-e2e/faultproofs/precompile_test.go b/op-e2e/faultproofs/precompile_test.go index 183d560e614f..aebe6a8fd1a9 100644 --- a/op-e2e/faultproofs/precompile_test.go +++ b/op-e2e/faultproofs/precompile_test.go @@ -2,43 +2,47 @@ package faultproofs import ( "context" - "encoding/json" - "fmt" "math" + "math/big" "path/filepath" "testing" - "github.com/ethereum-optimism/optimism/cannon/mipsevm" + op_e2e "github.com/ethereum-optimism/optimism/op-e2e" + "github.com/ethereum-optimism/optimism/op-e2e/system/e2esys" + "github.com/ethereum-optimism/optimism/op-e2e/system/helpers" + + "github.com/ethereum-optimism/optimism/cannon/mipsevm/versions" + "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/ethereum/go-ethereum/params" + "github.com/stretchr/testify/require" + "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/game/fault/trace/vm" "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" + "github.com/ethereum-optimism/optimism/op-e2e/e2eutils/disputegame" "github.com/ethereum-optimism/optimism/op-e2e/e2eutils/wait" - "github.com/ethereum-optimism/optimism/op-service/client" - "github.com/ethereum-optimism/optimism/op-service/ioutil" - "github.com/ethereum-optimism/optimism/op-service/sources" "github.com/ethereum-optimism/optimism/op-service/testlog" - "github.com/ethereum/go-ethereum/common" - "github.com/ethereum/go-ethereum/common/hexutil" - "github.com/ethereum/go-ethereum/log" - "github.com/ethereum/go-ethereum/rpc" - "github.com/stretchr/testify/require" ) func TestPrecompiles(t *testing.T) { op_e2e.InitParallel(t, op_e2e.UsesCannon) // precompile test vectors copied from go-ethereum tests := []struct { - name string - address common.Address - input []byte + name string + address common.Address + input []byte + accelerated bool }{ { - name: "ecrecover", - address: common.BytesToAddress([]byte{0x01}), - input: common.FromHex("18c547e4f7b0f325ad1e56f57e26c745b09a3e503d86e00e5255ff7f715d3d1c000000000000000000000000000000000000000000000000000000000000001c73b1693892219d736caba55bdb67216e485557ea6b6af75f37096c9aa6a5a75feeb940b1d03b21e36b0e47e79769f095fe2ab855bd91e3a38756b7d75a9c4549"), + name: "ecrecover", + address: common.BytesToAddress([]byte{0x01}), + input: common.FromHex("18c547e4f7b0f325ad1e56f57e26c745b09a3e503d86e00e5255ff7f715d3d1c000000000000000000000000000000000000000000000000000000000000001c73b1693892219d736caba55bdb67216e485557ea6b6af75f37096c9aa6a5a75feeb940b1d03b21e36b0e47e79769f095fe2ab855bd91e3a38756b7d75a9c4549"), + accelerated: true, }, { name: "sha256", @@ -51,9 +55,10 @@ func TestPrecompiles(t *testing.T) { input: common.FromHex("68656c6c6f20776f726c64"), }, { - name: "bn256Pairing", - address: common.BytesToAddress([]byte{0x08}), - input: common.FromHex("1c76476f4def4bb94541d57ebba1193381ffa7aa76ada664dd31c16024c43f593034dd2920f673e204fee2811c678745fc819b55d3e9d294e45c9b03a76aef41209dd15ebff5d46c4bd888e51a93cf99a7329636c63514396b4a452003a35bf704bf11ca01483bfa8b34b43561848d28905960114c8ac04049af4b6315a416782bb8324af6cfc93537a2ad1a445cfd0ca2a71acd7ac41fadbf933c2a51be344d120a2a4cf30c1bf9845f20c6fe39e07ea2cce61f0c9bb048165fe5e4de877550111e129f1cf1097710d41c4ac70fcdfa5ba2023c6ff1cbeac322de49d1b6df7c2032c61a830e3c17286de9462bf242fca2883585b93870a73853face6a6bf411198e9393920d483a7260bfb731fb5d25f1aa493335a9e71297e485b7aef312c21800deef121f1e76426a00665e5c4479674322d4f75edadd46debd5cd992f6ed090689d0585ff075ec9e99ad690c3395bc4b313370b38ef355acdadcd122975b12c85ea5db8c6deb4aab71808dcb408fe3d1e7690c43d37b4ce6cc0166fa7daa"), + name: "bn256Pairing", + address: common.BytesToAddress([]byte{0x08}), + input: common.FromHex("1c76476f4def4bb94541d57ebba1193381ffa7aa76ada664dd31c16024c43f593034dd2920f673e204fee2811c678745fc819b55d3e9d294e45c9b03a76aef41209dd15ebff5d46c4bd888e51a93cf99a7329636c63514396b4a452003a35bf704bf11ca01483bfa8b34b43561848d28905960114c8ac04049af4b6315a416782bb8324af6cfc93537a2ad1a445cfd0ca2a71acd7ac41fadbf933c2a51be344d120a2a4cf30c1bf9845f20c6fe39e07ea2cce61f0c9bb048165fe5e4de877550111e129f1cf1097710d41c4ac70fcdfa5ba2023c6ff1cbeac322de49d1b6df7c2032c61a830e3c17286de9462bf242fca2883585b93870a73853face6a6bf411198e9393920d483a7260bfb731fb5d25f1aa493335a9e71297e485b7aef312c21800deef121f1e76426a00665e5c4479674322d4f75edadd46debd5cd992f6ed090689d0585ff075ec9e99ad690c3395bc4b313370b38ef355acdadcd122975b12c85ea5db8c6deb4aab71808dcb408fe3d1e7690c43d37b4ce6cc0166fa7daa"), + accelerated: true, }, { name: "blake2F", @@ -61,9 +66,10 @@ func TestPrecompiles(t *testing.T) { input: common.FromHex("0000000048c9bdf267e6096a3ba7ca8485ae67bb2bf894fe72f36e3cf1361d5f3af54fa5d182e6ad7f520e511f6c3e2b8c68059b6bbd41fbabd9831f79217e1319cde05b61626300000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000300000000000000000000000000000001"), }, { - name: "kzgPointEvaluation", - address: common.BytesToAddress([]byte{0x0a}), - input: common.FromHex("01e798154708fe7789429634053cbf9f99b619f9f084048927333fce637f549b564c0a11a0f704f4fc3e8acfe0f8245f0ad1347b378fbf96e206da11a5d3630624d25032e67a7e6a4910df5834b8fe70e6bcfeeac0352434196bdf4b2485d5a18f59a8d2a1a625a17f3fea0fe5eb8c896db3764f3185481bc22f91b4aaffcca25f26936857bc3a7c2539ea8ec3a952b7873033e038326e87ed3e1276fd140253fa08e9fc25fb2d9a98527fc22a2c9612fbeafdad446cbc7bcdbdcd780af2c16a"), + name: "kzgPointEvaluation", + address: common.BytesToAddress([]byte{0x0a}), + input: common.FromHex("01e798154708fe7789429634053cbf9f99b619f9f084048927333fce637f549b564c0a11a0f704f4fc3e8acfe0f8245f0ad1347b378fbf96e206da11a5d3630624d25032e67a7e6a4910df5834b8fe70e6bcfeeac0352434196bdf4b2485d5a18f59a8d2a1a625a17f3fea0fe5eb8c896db3764f3185481bc22f91b4aaffcca25f26936857bc3a7c2539ea8ec3a952b7873033e038326e87ed3e1276fd140253fa08e9fc25fb2d9a98527fc22a2c9612fbeafdad446cbc7bcdbdcd780af2c16a"), + accelerated: true, }, } for _, test := range tests { @@ -71,29 +77,23 @@ func TestPrecompiles(t *testing.T) { t.Run(test.name, func(t *testing.T) { op_e2e.InitParallel(t, op_e2e.UsesCannon) ctx := context.Background() - cfg := op_e2e.DefaultSystemConfig(t) + genesisTime := hexutil.Uint64(0) + cfg := e2esys.EcotoneSystemConfig(t, &genesisTime) // We don't need a verifier - just the sequencer is enough delete(cfg.Nodes, "verifier") // Use a small sequencer window size to avoid test timeout while waiting for empty blocks // But not too small to ensure that our claim and subsequent state change is published cfg.DeployConfig.SequencerWindowSize = 16 - minTs := hexutil.Uint64(0) - cfg.DeployConfig.L2GenesisDeltaTimeOffset = &minTs - cfg.DeployConfig.L2GenesisEcotoneTimeOffset = &minTs sys, err := cfg.Start(t) 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) - l1Client := sys.Clients["l1"] - l2Seq := sys.Clients["sequencer"] - rollupRPCClient, err := rpc.DialContext(context.Background(), sys.RollupNodes["sequencer"].HTTPEndpoint()) - require.Nil(t, err) - rollupClient := sources.NewRollupClient(client.NewBaseRPCClient(rollupRPCClient)) - + l1Client := sys.NodeClient("l1") + l2Seq := sys.NodeClient("sequencer") + rollupClient := sys.RollupClient("sequencer") aliceKey := cfg.Secrets.Alice t.Log("Capture current L2 head as agreed starting point") @@ -104,7 +104,7 @@ func TestPrecompiles(t *testing.T) { l2Head := agreedL2Output.BlockRef.Hash l2OutputRoot := agreedL2Output.OutputRoot - receipt := op_e2e.SendL2Tx(t, cfg, l2Seq, aliceKey, func(opts *op_e2e.TxOpts) { + receipt := helpers.SendL2Tx(t, cfg, l2Seq, aliceKey, func(opts *helpers.TxOpts) { opts.Gas = 1_000_000 opts.ToAddr = &test.address opts.Nonce = 0 @@ -130,16 +130,126 @@ func TestPrecompiles(t *testing.T) { L2OutputRoot: common.Hash(l2OutputRoot), L2BlockNumber: l2ClaimBlockNumber, } - runCannon(t, ctx, sys, inputs, "sequencer") + runCannon(t, ctx, sys, inputs) + }) + + t.Run("DisputePrecompile-"+test.name, func(t *testing.T) { + op_e2e.InitParallel(t, op_e2e.UsesCannon) + if !test.accelerated { + t.Skipf("%v is not accelerated so no preimgae to upload", test.name) + } + ctx := context.Background() + sys, _ := StartFaultDisputeSystem(t, WithBlobBatches()) + + l2Seq := sys.NodeClient("sequencer") + aliceKey := sys.Cfg.Secrets.Alice + receipt := helpers.SendL2Tx(t, sys.Cfg, l2Seq, aliceKey, func(opts *helpers.TxOpts) { + opts.Gas = 1_000_000 + opts.ToAddr = &test.address + opts.Nonce = 0 + opts.Data = test.input + }) + + disputeGameFactory := disputegame.NewFactoryHelper(t, ctx, sys) + game := disputeGameFactory.StartOutputCannonGame(ctx, "sequencer", receipt.BlockNumber.Uint64(), common.Hash{0x01, 0xaa}) + require.NotNil(t, game) + outputRootClaim := game.DisputeLastBlock(ctx) + game.LogGameData(ctx) + + honestChallenger := game.StartChallenger(ctx, "HonestActor", 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. + outputRootClaim = outputRootClaim.WaitForCounterClaim(ctx) + + // 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, utils.FirstPreimageLoadOfType("precompile"), 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. + require.NoError(t, honestChallenger.Close()) }) } } -func runCannon(t *testing.T, ctx context.Context, sys *op_e2e.System, inputs utils.LocalGameInputs, l2Node string) { - l1Endpoint := sys.NodeEndpoint("l1") - l1Beacon := sys.L1BeaconEndpoint() - rollupEndpoint := sys.RollupEndpoint("sequencer") - l2Endpoint := sys.NodeEndpoint("sequencer") +func TestGranitePrecompiles(t *testing.T) { + op_e2e.InitParallel(t, op_e2e.UsesCannon) + ctx := context.Background() + genesisTime := hexutil.Uint64(0) + cfg := e2esys.GraniteSystemConfig(t, &genesisTime) + // We don't need a verifier - just the sequencer is enough + delete(cfg.Nodes, "verifier") + // Use a small sequencer window size to avoid test timeout while waiting for empty blocks + // But not too small to ensure that our claim and subsequent state change is published + cfg.DeployConfig.SequencerWindowSize = 16 + + sys, err := cfg.Start(t) + require.Nil(t, err, "Error starting up system") + + 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) + + l1Client := sys.NodeClient("l1") + l2Seq := sys.NodeClient("sequencer") + rollupClient := sys.RollupClient("sequencer") + aliceKey := cfg.Secrets.Alice + + t.Log("Capture current L2 head as agreed starting point") + latestBlock, err := l2Seq.BlockByNumber(ctx, nil) + require.NoError(t, err) + agreedL2Output, err := rollupClient.OutputAtBlock(ctx, latestBlock.NumberU64()) + require.NoError(t, err, "could not retrieve l2 agreed block") + l2Head := agreedL2Output.BlockRef.Hash + l2OutputRoot := agreedL2Output.OutputRoot + + precompile := common.BytesToAddress([]byte{0x08}) + input := make([]byte, 113_000) + tx := types.MustSignNewTx(aliceKey, types.LatestSignerForChainID(cfg.L2ChainIDBig()), &types.DynamicFeeTx{ + ChainID: cfg.L2ChainIDBig(), + Nonce: 0, + GasTipCap: big.NewInt(1 * params.GWei), + GasFeeCap: big.NewInt(10 * params.GWei), + Gas: 25_000_000, + To: &precompile, + Value: big.NewInt(0), + Data: input, + }) + err = l2Seq.SendTransaction(ctx, tx) + require.NoError(t, err, "Should send bn256Pairing transaction") + // Expect a successful receipt to retrieve the EVM call trace so we can inspect the revert reason + receipt, err := wait.ForReceiptMaybe(ctx, l2Seq, tx.Hash(), types.ReceiptStatusSuccessful, false) + require.NotNil(t, err) + require.Contains(t, err.Error(), "bad elliptic curve pairing input size") + + t.Logf("Transaction hash %v", tx.Hash()) + t.Log("Determine L2 claim") + l2ClaimBlockNumber := receipt.BlockNumber + l2Output, err := rollupClient.OutputAtBlock(ctx, l2ClaimBlockNumber.Uint64()) + require.NoError(t, err, "could not get expected output") + l2Claim := l2Output.OutputRoot + + t.Log("Determine L1 head that includes all batches required for L2 claim block") + require.NoError(t, wait.ForSafeBlock(ctx, rollupClient, l2ClaimBlockNumber.Uint64())) + l1HeadBlock, err := l1Client.BlockByNumber(ctx, nil) + require.NoError(t, err, "get l1 head block") + l1Head := l1HeadBlock.Hash() + + inputs := utils.LocalGameInputs{ + L1Head: l1Head, + L2Head: l2Head, + L2Claim: common.Hash(l2Claim), + L2OutputRoot: common.Hash(l2OutputRoot), + L2BlockNumber: l2ClaimBlockNumber, + } + runCannon(t, ctx, sys, inputs) +} + +func runCannon(t *testing.T, ctx context.Context, sys *e2esys.System, inputs utils.LocalGameInputs, extraVmArgs ...string) { + l1Endpoint := sys.NodeEndpoint("l1").RPC() + l1Beacon := sys.L1BeaconEndpoint().RestHTTP() + rollupEndpoint := sys.RollupEndpoint("sequencer").RPC() + l2Endpoint := sys.NodeEndpoint("sequencer").RPC() cannonOpts := challenger.WithCannon(t, sys.RollupCfg(), sys.L2Genesis()) dir := t.TempDir() proofsDir := filepath.Join(dir, "cannon-proofs") @@ -147,27 +257,15 @@ func runCannon(t *testing.T, ctx context.Context, sys *op_e2e.System, inputs uti cannonOpts(&cfg) logger := testlog.Logger(t, log.LevelInfo).New("role", "cannon") - executor := cannon.NewExecutor(logger, metrics.NoopMetrics, &cfg, inputs) + executor := vm.NewExecutor(logger, metrics.NoopMetrics.VmMetrics("cannon"), cfg.Cannon, vm.NewOpProgramServerExecutor(), cfg.CannonAbsolutePreState, inputs) t.Log("Running cannon") - err := executor.GenerateProof(ctx, proofsDir, math.MaxUint) + err := executor.DoGenerateProof(ctx, proofsDir, math.MaxUint, math.MaxUint, extraVmArgs...) require.NoError(t, err, "failed to generate proof") - state, err := parseState(filepath.Join(proofsDir, "final.json.gz")) + state, err := versions.LoadStateFromFile(vm.FinalStatePath(proofsDir, cfg.Cannon.BinarySnapshots)) require.NoError(t, err, "failed to parse state") - t.Logf("Completed in %d steps", state.Step) -} - -func parseState(path string) (*mipsevm.State, error) { - file, err := ioutil.OpenDecompressed(path) - if err != nil { - return nil, fmt.Errorf("cannot open state file (%v): %w", path, err) - } - defer file.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) - } - return &state, nil + require.True(t, state.GetExited(), "cannon did not exit") + require.Zero(t, state.GetExitCode(), "cannon failed with exit code %d", state.GetExitCode()) + t.Logf("Completed in %d steps", state.GetStep()) } diff --git a/op-e2e/faultproofs/preimages_test.go b/op-e2e/faultproofs/preimages_test.go index 03acf824daf3..8536fe578a5f 100644 --- a/op-e2e/faultproofs/preimages_test.go +++ b/op-e2e/faultproofs/preimages_test.go @@ -6,6 +6,7 @@ import ( "testing" op_e2e "github.com/ethereum-optimism/optimism/op-e2e" + "github.com/ethereum-optimism/optimism/op-e2e/e2eutils/disputegame" preimage "github.com/ethereum-optimism/optimism/op-preimage" "github.com/ethereum-optimism/optimism/op-program/client" diff --git a/op-e2e/faultproofs/util.go b/op-e2e/faultproofs/util.go index 025f9be80385..5beebafd88a6 100644 --- a/op-e2e/faultproofs/util.go +++ b/op-e2e/faultproofs/util.go @@ -4,8 +4,10 @@ import ( "crypto/ecdsa" "testing" + "github.com/ethereum-optimism/optimism/op-e2e/system/e2esys" + "github.com/ethereum-optimism/optimism/op-e2e/system/helpers" + batcherFlags "github.com/ethereum-optimism/optimism/op-batcher/flags" - op_e2e "github.com/ethereum-optimism/optimism/op-e2e" "github.com/ethereum/go-ethereum/common" "github.com/ethereum/go-ethereum/common/hexutil" "github.com/ethereum/go-ethereum/core/types" @@ -13,16 +15,16 @@ import ( "github.com/stretchr/testify/require" ) -type faultDisputeConfigOpts func(cfg *op_e2e.SystemConfig) +type faultDisputeConfigOpts func(cfg *e2esys.SystemConfig) func WithBatcherStopped() faultDisputeConfigOpts { - return func(cfg *op_e2e.SystemConfig) { + return func(cfg *e2esys.SystemConfig) { cfg.DisableBatcher = true } } func WithBlobBatches() faultDisputeConfigOpts { - return func(cfg *op_e2e.SystemConfig) { + return func(cfg *e2esys.SystemConfig) { cfg.DataAvailabilityType = batcherFlags.BlobsType genesisActivation := hexutil.Uint64(0) @@ -33,7 +35,7 @@ func WithBlobBatches() faultDisputeConfigOpts { } func WithEcotone() faultDisputeConfigOpts { - return func(cfg *op_e2e.SystemConfig) { + return func(cfg *e2esys.SystemConfig) { genesisActivation := hexutil.Uint64(0) cfg.DeployConfig.L1CancunTimeOffset = &genesisActivation cfg.DeployConfig.L2GenesisDeltaTimeOffset = &genesisActivation @@ -42,30 +44,30 @@ func WithEcotone() faultDisputeConfigOpts { } func WithSequencerWindowSize(size uint64) faultDisputeConfigOpts { - return func(cfg *op_e2e.SystemConfig) { + return func(cfg *e2esys.SystemConfig) { cfg.DeployConfig.SequencerWindowSize = size } } -func StartFaultDisputeSystem(t *testing.T, opts ...faultDisputeConfigOpts) (*op_e2e.System, *ethclient.Client) { - cfg := op_e2e.DefaultSystemConfig(t) +func StartFaultDisputeSystem(t *testing.T, opts ...faultDisputeConfigOpts) (*e2esys.System, *ethclient.Client) { + cfg := e2esys.DefaultSystemConfig(t) delete(cfg.Nodes, "verifier") 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 + // Disable proposer creating fast games automatically - required games are manually created + cfg.DisableProposer = true for _, opt := range opts { opt(&cfg) } sys, err := cfg.Start(t) require.Nil(t, err, "Error starting up system") - return sys, sys.Clients["l1"] + return sys, sys.NodeClient("l1") } -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) { +func SendKZGPointEvaluationTx(t *testing.T, sys *e2esys.System, l2Node string, privateKey *ecdsa.PrivateKey) *types.Receipt { + return helpers.SendL2Tx(t, sys.Cfg, sys.NodeClient(l2Node), privateKey, func(opts *helpers.TxOpts) { precompile := common.BytesToAddress([]byte{0x0a}) opts.Gas = 100_000 opts.ToAddr = &precompile diff --git a/op-e2e/helper.go b/op-e2e/helper.go deleted file mode 100644 index e9e53deac8b1..000000000000 --- a/op-e2e/helper.go +++ /dev/null @@ -1,108 +0,0 @@ -package op_e2e - -import ( - "crypto/md5" - "os" - "strconv" - "strings" - - "github.com/ethereum-optimism/optimism/op-e2e/e2eutils" -) - -var enableParallelTesting bool = os.Getenv("OP_E2E_DISABLE_PARALLEL") != "true" - -func InitParallel(t e2eutils.TestingBase, args ...func(t e2eutils.TestingBase)) { - t.Helper() - if enableParallelTesting { - t.Parallel() - } - for _, arg := range args { - arg(t) - } - autoAllocateExecutor(t) -} - -// isSubTest determines if the test is a sub-test or top level test. -// It does this by checking if the test name contains / -// This is not a particularly great way check, but appears to be the only option currently. -func isSubTest(t e2eutils.TestingBase) bool { - return strings.Contains(t.Name(), "/") -} - -func autoAllocateExecutor(t e2eutils.TestingBase) { - if isSubTest(t) { - // Always run subtests, they only start on the same executor as their parent. - return - } - info := getExecutorInfo(t) - tName := t.Name() - tHash := md5.Sum([]byte(tName)) - executor := uint64(tHash[0]) % info.total - checkExecutor(t, info, executor) -} - -func UsesCannon(t e2eutils.TestingBase) { - if os.Getenv("OP_E2E_CANNON_ENABLED") == "false" { - t.Skip("Skipping cannon test") - } -} - -func SkipOnFPAC(t e2eutils.TestingBase) { - if e2eutils.UseFPAC() { - t.Skip("Skipping test for FPAC") - } -} - -func SkipOnNotFPAC(t e2eutils.TestingBase) { - if !e2eutils.UseFPAC() { - t.Skip("Skipping test for non-FPAC") - } -} - -type executorInfo struct { - total uint64 - idx uint64 - splitInUse bool -} - -func getExecutorInfo(t e2eutils.TestingBase) executorInfo { - var info executorInfo - envTotal := os.Getenv("CIRCLE_NODE_TOTAL") - envIdx := os.Getenv("CIRCLE_NODE_INDEX") - if envTotal == "" || envIdx == "" { - // Not using test splitting, so ignore assigned executor - t.Logf("Test splitting not in use.") - info.total = 1 - return info - } - total, err := strconv.ParseUint(envTotal, 10, 0) - if err != nil { - t.Fatalf("Could not parse CIRCLE_NODE_TOTAL env var %v: %v", envTotal, err) - } - idx, err := strconv.ParseUint(envIdx, 10, 0) - if err != nil { - t.Fatalf("Could not parse CIRCLE_NODE_INDEX env var %v: %v", envIdx, err) - } - - info.total = total - info.idx = idx - info.splitInUse = true - return info -} - -func checkExecutor(t e2eutils.TestingBase, info executorInfo, assignedIdx uint64) { - if !info.splitInUse { - t.Logf("Test splitting not in use.") - return - } - - if assignedIdx >= info.total && info.idx == info.total-1 { - t.Logf("Running test. Current executor (%v) is the last executor and assigned executor (%v) >= total executors (%v).", info.idx, assignedIdx, info.total) - return - } - if info.idx == assignedIdx { - t.Logf("Running test. Assigned executor (%v) matches current executor (%v) of total (%v)", assignedIdx, info.idx, info.total) - return - } - t.Skipf("Skipping test. Assigned executor %v, current executor %v of total %v", assignedIdx, info.idx, info.total) -} diff --git a/op-e2e/interop/contracts/emit.go b/op-e2e/interop/contracts/emit.go new file mode 100644 index 000000000000..ceae2412659b --- /dev/null +++ b/op-e2e/interop/contracts/emit.go @@ -0,0 +1,368 @@ +// Code generated - DO NOT EDIT. +// This file is a generated binding and any manual changes will be lost. + +package emit + +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 + _ = abi.ConvertType +) + +// EmitMetaData contains all meta data concerning the Emit contract. +var EmitMetaData = &bind.MetaData{ + ABI: "[{\"type\":\"function\",\"name\":\"emitData\",\"inputs\":[{\"name\":\"_data\",\"type\":\"bytes\",\"internalType\":\"bytes\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"event\",\"name\":\"DataEmitted\",\"inputs\":[{\"name\":\"_data\",\"type\":\"bytes\",\"indexed\":true,\"internalType\":\"bytes\"}],\"anonymous\":false}]", + Bin: "0x6080604052348015600e575f80fd5b5060ff8061001b5f395ff3fe6080604052348015600e575f80fd5b50600436106026575f3560e01c8063d836083e14602a575b5f80fd5b60396035366004607c565b603b565b005b8181604051604992919060e3565b604051908190038120907fe00bbfe6f6f8f1bbed2da38e3f5a139c6f9da594ab248a3cf8b44fc73627772c905f90a25050565b5f8060208385031215608c575f80fd5b823567ffffffffffffffff8082111560a2575f80fd5b818501915085601f83011260b4575f80fd5b81358181111560c1575f80fd5b86602082850101111560d1575f80fd5b60209290920196919550909350505050565b818382375f910190815291905056fea164736f6c6343000819000a", +} + +// EmitABI is the input ABI used to generate the binding from. +// Deprecated: Use EmitMetaData.ABI instead. +var EmitABI = EmitMetaData.ABI + +// EmitBin is the compiled bytecode used for deploying new contracts. +// Deprecated: Use EmitMetaData.Bin instead. +var EmitBin = EmitMetaData.Bin + +// DeployEmit deploys a new Ethereum contract, binding an instance of Emit to it. +func DeployEmit(auth *bind.TransactOpts, backend bind.ContractBackend) (common.Address, *types.Transaction, *Emit, error) { + parsed, err := EmitMetaData.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(EmitBin), backend) + if err != nil { + return common.Address{}, nil, nil, err + } + return address, tx, &Emit{EmitCaller: EmitCaller{contract: contract}, EmitTransactor: EmitTransactor{contract: contract}, EmitFilterer: EmitFilterer{contract: contract}}, nil +} + +// Emit is an auto generated Go binding around an Ethereum contract. +type Emit struct { + EmitCaller // Read-only binding to the contract + EmitTransactor // Write-only binding to the contract + EmitFilterer // Log filterer for contract events +} + +// EmitCaller is an auto generated read-only Go binding around an Ethereum contract. +type EmitCaller struct { + contract *bind.BoundContract // Generic contract wrapper for the low level calls +} + +// EmitTransactor is an auto generated write-only Go binding around an Ethereum contract. +type EmitTransactor struct { + contract *bind.BoundContract // Generic contract wrapper for the low level calls +} + +// EmitFilterer is an auto generated log filtering Go binding around an Ethereum contract events. +type EmitFilterer struct { + contract *bind.BoundContract // Generic contract wrapper for the low level calls +} + +// EmitSession is an auto generated Go binding around an Ethereum contract, +// with pre-set call and transact options. +type EmitSession struct { + Contract *Emit // 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 +} + +// EmitCallerSession is an auto generated read-only Go binding around an Ethereum contract, +// with pre-set call options. +type EmitCallerSession struct { + Contract *EmitCaller // Generic contract caller binding to set the session for + CallOpts bind.CallOpts // Call options to use throughout this session +} + +// EmitTransactorSession is an auto generated write-only Go binding around an Ethereum contract, +// with pre-set transact options. +type EmitTransactorSession struct { + Contract *EmitTransactor // Generic contract transactor binding to set the session for + TransactOpts bind.TransactOpts // Transaction auth options to use throughout this session +} + +// EmitRaw is an auto generated low-level Go binding around an Ethereum contract. +type EmitRaw struct { + Contract *Emit // Generic contract binding to access the raw methods on +} + +// EmitCallerRaw is an auto generated low-level read-only Go binding around an Ethereum contract. +type EmitCallerRaw struct { + Contract *EmitCaller // Generic read-only contract binding to access the raw methods on +} + +// EmitTransactorRaw is an auto generated low-level write-only Go binding around an Ethereum contract. +type EmitTransactorRaw struct { + Contract *EmitTransactor // Generic write-only contract binding to access the raw methods on +} + +// NewEmit creates a new instance of Emit, bound to a specific deployed contract. +func NewEmit(address common.Address, backend bind.ContractBackend) (*Emit, error) { + contract, err := bindEmit(address, backend, backend, backend) + if err != nil { + return nil, err + } + return &Emit{EmitCaller: EmitCaller{contract: contract}, EmitTransactor: EmitTransactor{contract: contract}, EmitFilterer: EmitFilterer{contract: contract}}, nil +} + +// NewEmitCaller creates a new read-only instance of Emit, bound to a specific deployed contract. +func NewEmitCaller(address common.Address, caller bind.ContractCaller) (*EmitCaller, error) { + contract, err := bindEmit(address, caller, nil, nil) + if err != nil { + return nil, err + } + return &EmitCaller{contract: contract}, nil +} + +// NewEmitTransactor creates a new write-only instance of Emit, bound to a specific deployed contract. +func NewEmitTransactor(address common.Address, transactor bind.ContractTransactor) (*EmitTransactor, error) { + contract, err := bindEmit(address, nil, transactor, nil) + if err != nil { + return nil, err + } + return &EmitTransactor{contract: contract}, nil +} + +// NewEmitFilterer creates a new log filterer instance of Emit, bound to a specific deployed contract. +func NewEmitFilterer(address common.Address, filterer bind.ContractFilterer) (*EmitFilterer, error) { + contract, err := bindEmit(address, nil, nil, filterer) + if err != nil { + return nil, err + } + return &EmitFilterer{contract: contract}, nil +} + +// bindEmit binds a generic wrapper to an already deployed contract. +func bindEmit(address common.Address, caller bind.ContractCaller, transactor bind.ContractTransactor, filterer bind.ContractFilterer) (*bind.BoundContract, error) { + parsed, err := EmitMetaData.GetAbi() + 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 (_Emit *EmitRaw) Call(opts *bind.CallOpts, result *[]interface{}, method string, params ...interface{}) error { + return _Emit.Contract.EmitCaller.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 (_Emit *EmitRaw) Transfer(opts *bind.TransactOpts) (*types.Transaction, error) { + return _Emit.Contract.EmitTransactor.contract.Transfer(opts) +} + +// Transact invokes the (paid) contract method with params as input values. +func (_Emit *EmitRaw) Transact(opts *bind.TransactOpts, method string, params ...interface{}) (*types.Transaction, error) { + return _Emit.Contract.EmitTransactor.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 (_Emit *EmitCallerRaw) Call(opts *bind.CallOpts, result *[]interface{}, method string, params ...interface{}) error { + return _Emit.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 (_Emit *EmitTransactorRaw) Transfer(opts *bind.TransactOpts) (*types.Transaction, error) { + return _Emit.Contract.contract.Transfer(opts) +} + +// Transact invokes the (paid) contract method with params as input values. +func (_Emit *EmitTransactorRaw) Transact(opts *bind.TransactOpts, method string, params ...interface{}) (*types.Transaction, error) { + return _Emit.Contract.contract.Transact(opts, method, params...) +} + +// EmitData is a paid mutator transaction binding the contract method 0xd836083e. +// +// Solidity: function emitData(bytes _data) returns() +func (_Emit *EmitTransactor) EmitData(opts *bind.TransactOpts, _data []byte) (*types.Transaction, error) { + return _Emit.contract.Transact(opts, "emitData", _data) +} + +// EmitData is a paid mutator transaction binding the contract method 0xd836083e. +// +// Solidity: function emitData(bytes _data) returns() +func (_Emit *EmitSession) EmitData(_data []byte) (*types.Transaction, error) { + return _Emit.Contract.EmitData(&_Emit.TransactOpts, _data) +} + +// EmitData is a paid mutator transaction binding the contract method 0xd836083e. +// +// Solidity: function emitData(bytes _data) returns() +func (_Emit *EmitTransactorSession) EmitData(_data []byte) (*types.Transaction, error) { + return _Emit.Contract.EmitData(&_Emit.TransactOpts, _data) +} + +// EmitDataEmittedIterator is returned from FilterDataEmitted and is used to iterate over the raw logs and unpacked data for DataEmitted events raised by the Emit contract. +type EmitDataEmittedIterator struct { + Event *EmitDataEmitted // 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 *EmitDataEmittedIterator) 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(EmitDataEmitted) + 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(EmitDataEmitted) + 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 *EmitDataEmittedIterator) Error() error { + return it.fail +} + +// Close terminates the iteration process, releasing any pending underlying +// resources. +func (it *EmitDataEmittedIterator) Close() error { + it.sub.Unsubscribe() + return nil +} + +// EmitDataEmitted represents a DataEmitted event raised by the Emit contract. +type EmitDataEmitted struct { + Data common.Hash + Raw types.Log // Blockchain specific contextual infos +} + +// FilterDataEmitted is a free log retrieval operation binding the contract event 0xe00bbfe6f6f8f1bbed2da38e3f5a139c6f9da594ab248a3cf8b44fc73627772c. +// +// Solidity: event DataEmitted(bytes indexed _data) +func (_Emit *EmitFilterer) FilterDataEmitted(opts *bind.FilterOpts, _data [][]byte) (*EmitDataEmittedIterator, error) { + + var _dataRule []interface{} + for _, _dataItem := range _data { + _dataRule = append(_dataRule, _dataItem) + } + + logs, sub, err := _Emit.contract.FilterLogs(opts, "DataEmitted", _dataRule) + if err != nil { + return nil, err + } + return &EmitDataEmittedIterator{contract: _Emit.contract, event: "DataEmitted", logs: logs, sub: sub}, nil +} + +// WatchDataEmitted is a free log subscription operation binding the contract event 0xe00bbfe6f6f8f1bbed2da38e3f5a139c6f9da594ab248a3cf8b44fc73627772c. +// +// Solidity: event DataEmitted(bytes indexed _data) +func (_Emit *EmitFilterer) WatchDataEmitted(opts *bind.WatchOpts, sink chan<- *EmitDataEmitted, _data [][]byte) (event.Subscription, error) { + + var _dataRule []interface{} + for _, _dataItem := range _data { + _dataRule = append(_dataRule, _dataItem) + } + + logs, sub, err := _Emit.contract.WatchLogs(opts, "DataEmitted", _dataRule) + 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(EmitDataEmitted) + if err := _Emit.contract.UnpackLog(event, "DataEmitted", 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 +} + +// ParseDataEmitted is a log parse operation binding the contract event 0xe00bbfe6f6f8f1bbed2da38e3f5a139c6f9da594ab248a3cf8b44fc73627772c. +// +// Solidity: event DataEmitted(bytes indexed _data) +func (_Emit *EmitFilterer) ParseDataEmitted(log types.Log) (*EmitDataEmitted, error) { + event := new(EmitDataEmitted) + if err := _Emit.contract.UnpackLog(event, "DataEmitted", log); err != nil { + return nil, err + } + event.Raw = log + return event, nil +} diff --git a/op-e2e/interop/contracts/foundry.toml b/op-e2e/interop/contracts/foundry.toml new file mode 100644 index 000000000000..587dba436380 --- /dev/null +++ b/op-e2e/interop/contracts/foundry.toml @@ -0,0 +1,31 @@ +################################################################ +# PROFILE: DEFAULT (Local) # +################################################################ + +[profile.default] + +# Compilation settings +src = 'src' +out = 'build' +script = 'scripts' +optimizer = true +optimizer_runs = 999999 +remappings = [] +extra_output = ['devdoc', 'userdoc', 'metadata', 'storageLayout'] +bytecode_hash = 'none' +build_info_path = 'artifacts/build-info' +ast = true +evm_version = "cancun" +# 5159 error code is selfdestruct error code +ignored_error_codes = ["transient-storage", "code-size", "init-code-size", 5159] + +# We set the gas limit to max int64 to avoid running out of gas during testing, since the default +# gas limit is 1B and some of our tests require more gas than that, such as `test_callWithMinGas_noLeakageLow_succeeds`. +# We use this gas limit since it was the default gas limit prior to https://github.com/foundry-rs/foundry/pull/8274. +# Due to toml-rs limitations, if you increase the gas limit above this value it must be a string. +gas_limit = 9223372036854775807 + +# Test / Script Runner Settings +ffi = false +fs_permissions = [] +libs = ["node_modules", "lib"] diff --git a/op-e2e/interop/contracts/generate.sh b/op-e2e/interop/contracts/generate.sh new file mode 100755 index 000000000000..bba960153ec6 --- /dev/null +++ b/op-e2e/interop/contracts/generate.sh @@ -0,0 +1,12 @@ +#!/bin/sh + +set -euo + +forge build + +cd build/emit.sol +cat EmitEvent.json | jq -r '.bytecode.object' > EmitEvent.bin +cat EmitEvent.json | jq '.abi' > EmitEvent.abi +cd ../.. + +abigen --abi ./build/emit.sol/EmitEvent.abi --bin ./build/emit.sol/EmitEvent.bin --pkg emit --out ./emit.go diff --git a/op-e2e/interop/contracts/src/emit.sol b/op-e2e/interop/contracts/src/emit.sol new file mode 100644 index 000000000000..5464bb7bbe6e --- /dev/null +++ b/op-e2e/interop/contracts/src/emit.sol @@ -0,0 +1,12 @@ +// SPDX-License-Identifier: MIT +pragma solidity ^0.8.15; + +contract EmitEvent { + // Define an event that logs the emitted data + event DataEmitted(bytes indexed _data); + + // Function that takes calldata and emits the data as an event + function emitData(bytes calldata _data) external { + emit DataEmitted(_data); + } +} diff --git a/op-e2e/interop/contracts/test-artifacts/emit.sol/EmitEvent.abi b/op-e2e/interop/contracts/test-artifacts/emit.sol/EmitEvent.abi new file mode 100644 index 000000000000..79170e79f968 --- /dev/null +++ b/op-e2e/interop/contracts/test-artifacts/emit.sol/EmitEvent.abi @@ -0,0 +1,28 @@ +[ + { + "type": "function", + "name": "emitData", + "inputs": [ + { + "name": "data", + "type": "bytes", + "internalType": "bytes" + } + ], + "outputs": [], + "stateMutability": "nonpayable" + }, + { + "type": "event", + "name": "DataEmitted", + "inputs": [ + { + "name": "data", + "type": "bytes", + "indexed": true, + "internalType": "bytes" + } + ], + "anonymous": false + } +] diff --git a/op-e2e/interop/contracts/test-artifacts/emit.sol/EmitEvent.bin b/op-e2e/interop/contracts/test-artifacts/emit.sol/EmitEvent.bin new file mode 100644 index 000000000000..f4c15ab05dca --- /dev/null +++ b/op-e2e/interop/contracts/test-artifacts/emit.sol/EmitEvent.bin @@ -0,0 +1 @@ +0x6080604052348015600e575f80fd5b5060ff8061001b5f395ff3fe6080604052348015600e575f80fd5b50600436106026575f3560e01c8063d836083e14602a575b5f80fd5b60396035366004607c565b603b565b005b8181604051604992919060e3565b604051908190038120907fe00bbfe6f6f8f1bbed2da38e3f5a139c6f9da594ab248a3cf8b44fc73627772c905f90a25050565b5f8060208385031215608c575f80fd5b823567ffffffffffffffff8082111560a2575f80fd5b818501915085601f83011260b4575f80fd5b81358181111560c1575f80fd5b86602082850101111560d1575f80fd5b60209290920196919550909350505050565b818382375f910190815291905056fea164736f6c6343000819000a diff --git a/op-e2e/interop/contracts/test-artifacts/emit.sol/EmitEvent.json b/op-e2e/interop/contracts/test-artifacts/emit.sol/EmitEvent.json new file mode 100644 index 000000000000..422f62ea7324 --- /dev/null +++ b/op-e2e/interop/contracts/test-artifacts/emit.sol/EmitEvent.json @@ -0,0 +1 @@ +{"abi":[{"type":"function","name":"emitData","inputs":[{"name":"data","type":"bytes","internalType":"bytes"}],"outputs":[],"stateMutability":"nonpayable"},{"type":"event","name":"DataEmitted","inputs":[{"name":"data","type":"bytes","indexed":true,"internalType":"bytes"}],"anonymous":false}],"bytecode":{"object":"0x6080604052348015600e575f80fd5b5060ff8061001b5f395ff3fe6080604052348015600e575f80fd5b50600436106026575f3560e01c8063d836083e14602a575b5f80fd5b60396035366004607c565b603b565b005b8181604051604992919060e3565b604051908190038120907fe00bbfe6f6f8f1bbed2da38e3f5a139c6f9da594ab248a3cf8b44fc73627772c905f90a25050565b5f8060208385031215608c575f80fd5b823567ffffffffffffffff8082111560a2575f80fd5b818501915085601f83011260b4575f80fd5b81358181111560c1575f80fd5b86602082850101111560d1575f80fd5b60209290920196919550909350505050565b818382375f910190815291905056fea164736f6c6343000819000a","sourceMap":"58:275:0:-:0;;;;;;;;;;;;;;;;;;;","linkReferences":{}},"deployedBytecode":{"object":"0x6080604052348015600e575f80fd5b50600436106026575f3560e01c8063d836083e14602a575b5f80fd5b60396035366004607c565b603b565b005b8181604051604992919060e3565b604051908190038120907fe00bbfe6f6f8f1bbed2da38e3f5a139c6f9da594ab248a3cf8b44fc73627772c905f90a25050565b5f8060208385031215608c575f80fd5b823567ffffffffffffffff8082111560a2575f80fd5b818501915085601f83011260b4575f80fd5b81358181111560c1575f80fd5b86602082850101111560d1575f80fd5b60209290920196919550909350505050565b818382375f910190815291905056fea164736f6c6343000819000a","sourceMap":"58:275:0:-:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;244:87;;;;;;:::i;:::-;;:::i;:::-;;;319:4;;307:17;;;;;;;:::i;:::-;;;;;;;;;;;;;;;244:87;;:::o;14:591:1:-;84:6;92;145:2;133:9;124:7;120:23;116:32;113:52;;;161:1;158;151:12;113:52;201:9;188:23;230:18;271:2;263:6;260:14;257:34;;;287:1;284;277:12;257:34;325:6;314:9;310:22;300:32;;370:7;363:4;359:2;355:13;351:27;341:55;;392:1;389;382:12;341:55;432:2;419:16;458:2;450:6;447:14;444:34;;;474:1;471;464:12;444:34;519:7;514:2;505:6;501:2;497:15;493:24;490:37;487:57;;;540:1;537;530:12;487:57;571:2;563:11;;;;;593:6;;-1:-1:-1;14:591:1;;-1:-1:-1;;;;14:591:1:o;610:271::-;793:6;785;780:3;767:33;749:3;819:16;;844:13;;;819:16;610:271;-1:-1:-1;610:271:1:o","linkReferences":{}},"methodIdentifiers":{"emitData(bytes)":"d836083e"},"rawMetadata":"{\"compiler\":{\"version\":\"0.8.25+commit.b61c2a91\"},\"language\":\"Solidity\",\"output\":{\"abi\":[{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"bytes\",\"name\":\"data\",\"type\":\"bytes\"}],\"name\":\"DataEmitted\",\"type\":\"event\"},{\"inputs\":[{\"internalType\":\"bytes\",\"name\":\"data\",\"type\":\"bytes\"}],\"name\":\"emitData\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"}],\"devdoc\":{\"kind\":\"dev\",\"methods\":{},\"version\":1},\"userdoc\":{\"kind\":\"user\",\"methods\":{},\"version\":1}},\"settings\":{\"compilationTarget\":{\"src/emit.sol\":\"EmitEvent\"},\"evmVersion\":\"cancun\",\"libraries\":{},\"metadata\":{\"bytecodeHash\":\"none\"},\"optimizer\":{\"enabled\":true,\"runs\":999999},\"remappings\":[]},\"sources\":{\"src/emit.sol\":{\"keccak256\":\"0xdee458d231a8b41e5ba097be7258a6da27501fafb2a6f865705953458aecafbf\",\"license\":\"MIT\",\"urls\":[\"bzz-raw://912d125138604114be66c8d044a39ef83861e6dc2d5fe3be32a1a4e014ea2763\",\"dweb:/ipfs/QmUx5NRsTXzujjwU1SXMSNp5Wjys3v5PDLuhdpoAyCy7nx\"]}},\"version\":1}","metadata":{"compiler":{"version":"0.8.25+commit.b61c2a91"},"language":"Solidity","output":{"abi":[{"inputs":[{"internalType":"bytes","name":"data","type":"bytes","indexed":true}],"type":"event","name":"DataEmitted","anonymous":false},{"inputs":[{"internalType":"bytes","name":"data","type":"bytes"}],"stateMutability":"nonpayable","type":"function","name":"emitData"}],"devdoc":{"kind":"dev","methods":{},"version":1},"userdoc":{"kind":"user","methods":{},"version":1}},"settings":{"remappings":[],"optimizer":{"enabled":true,"runs":999999},"metadata":{"bytecodeHash":"none"},"compilationTarget":{"src/emit.sol":"EmitEvent"},"evmVersion":"cancun","libraries":{}},"sources":{"src/emit.sol":{"keccak256":"0xdee458d231a8b41e5ba097be7258a6da27501fafb2a6f865705953458aecafbf","urls":["bzz-raw://912d125138604114be66c8d044a39ef83861e6dc2d5fe3be32a1a4e014ea2763","dweb:/ipfs/QmUx5NRsTXzujjwU1SXMSNp5Wjys3v5PDLuhdpoAyCy7nx"],"license":"MIT"}},"version":1},"storageLayout":{"storage":[],"types":{}},"userdoc":{"version":1,"kind":"user"},"devdoc":{"version":1,"kind":"dev"},"ast":{"absolutePath":"src/emit.sol","id":17,"exportedSymbols":{"EmitEvent":[16]},"nodeType":"SourceUnit","src":"32:302:0","nodes":[{"id":1,"nodeType":"PragmaDirective","src":"32:24:0","nodes":[],"literals":["solidity","^","0.8",".15"]},{"id":16,"nodeType":"ContractDefinition","src":"58:275:0","nodes":[{"id":5,"nodeType":"EventDefinition","src":"133:38:0","nodes":[],"anonymous":false,"eventSelector":"e00bbfe6f6f8f1bbed2da38e3f5a139c6f9da594ab248a3cf8b44fc73627772c","name":"DataEmitted","nameLocation":"139:11:0","parameters":{"id":4,"nodeType":"ParameterList","parameters":[{"constant":false,"id":3,"indexed":true,"mutability":"mutable","name":"data","nameLocation":"165:4:0","nodeType":"VariableDeclaration","scope":5,"src":"151:18:0","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_bytes_memory_ptr","typeString":"bytes"},"typeName":{"id":2,"name":"bytes","nodeType":"ElementaryTypeName","src":"151:5:0","typeDescriptions":{"typeIdentifier":"t_bytes_storage_ptr","typeString":"bytes"}},"visibility":"internal"}],"src":"150:20:0"}},{"id":15,"nodeType":"FunctionDefinition","src":"244:87:0","nodes":[],"body":{"id":14,"nodeType":"Block","src":"292:39:0","nodes":[],"statements":[{"eventCall":{"arguments":[{"id":11,"name":"data","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":7,"src":"319:4:0","typeDescriptions":{"typeIdentifier":"t_bytes_calldata_ptr","typeString":"bytes calldata"}}],"expression":{"argumentTypes":[{"typeIdentifier":"t_bytes_calldata_ptr","typeString":"bytes calldata"}],"id":10,"name":"DataEmitted","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":5,"src":"307:11:0","typeDescriptions":{"typeIdentifier":"t_function_event_nonpayable$_t_bytes_memory_ptr_$returns$__$","typeString":"function (bytes memory)"}},"id":12,"isConstant":false,"isLValue":false,"isPure":false,"kind":"functionCall","lValueRequested":false,"nameLocations":[],"names":[],"nodeType":"FunctionCall","src":"307:17:0","tryCall":false,"typeDescriptions":{"typeIdentifier":"t_tuple$__$","typeString":"tuple()"}},"id":13,"nodeType":"EmitStatement","src":"302:22:0"}]},"functionSelector":"d836083e","implemented":true,"kind":"function","modifiers":[],"name":"emitData","nameLocation":"253:8:0","parameters":{"id":8,"nodeType":"ParameterList","parameters":[{"constant":false,"id":7,"mutability":"mutable","name":"data","nameLocation":"277:4:0","nodeType":"VariableDeclaration","scope":15,"src":"262:19:0","stateVariable":false,"storageLocation":"calldata","typeDescriptions":{"typeIdentifier":"t_bytes_calldata_ptr","typeString":"bytes"},"typeName":{"id":6,"name":"bytes","nodeType":"ElementaryTypeName","src":"262:5:0","typeDescriptions":{"typeIdentifier":"t_bytes_storage_ptr","typeString":"bytes"}},"visibility":"internal"}],"src":"261:21:0"},"returnParameters":{"id":9,"nodeType":"ParameterList","parameters":[],"src":"292:0:0"},"scope":16,"stateMutability":"nonpayable","virtual":false,"visibility":"external"}],"abstract":false,"baseContracts":[],"canonicalName":"EmitEvent","contractDependencies":[],"contractKind":"contract","fullyImplemented":true,"linearizedBaseContracts":[16],"name":"EmitEvent","nameLocation":"67:9:0","scope":17,"usedErrors":[],"usedEvents":[5]}],"license":"MIT"},"id":0} \ No newline at end of file diff --git a/op-e2e/interop/interop_recipe_test.go b/op-e2e/interop/interop_recipe_test.go new file mode 100644 index 000000000000..05a2e056c39b --- /dev/null +++ b/op-e2e/interop/interop_recipe_test.go @@ -0,0 +1,44 @@ +package interop + +import ( + "encoding/json" + "os" + "testing" + + "github.com/stretchr/testify/require" + + "github.com/ethereum/go-ethereum/log" + + "github.com/ethereum-optimism/optimism/op-chain-ops/devkeys" + "github.com/ethereum-optimism/optimism/op-chain-ops/foundry" + "github.com/ethereum-optimism/optimism/op-chain-ops/interopgen" + "github.com/ethereum-optimism/optimism/op-service/testlog" +) + +func TestInteropDevRecipe(t *testing.T) { + rec := interopgen.InteropDevRecipe{ + L1ChainID: 900100, + L2ChainIDs: []uint64{900200, 900201}, + GenesisTimestamp: uint64(1234567), + } + hd, err := devkeys.NewMnemonicDevKeys(devkeys.TestMnemonic) + require.NoError(t, err) + worldCfg, err := rec.Build(hd) + require.NoError(t, err) + + logger := testlog.Logger(t, log.LevelDebug) + require.NoError(t, worldCfg.Check(logger)) + + fa := foundry.OpenArtifactsDir("../../packages/contracts-bedrock/forge-artifacts") + srcFS := foundry.NewSourceMapFS(os.DirFS("../../packages/contracts-bedrock")) + + worldDeployment, worldOutput, err := interopgen.Deploy(logger, fa, srcFS, worldCfg) + require.NoError(t, err) + enc := json.NewEncoder(os.Stdout) + enc.SetIndent(" ", " ") + require.NoError(t, enc.Encode(worldDeployment)) + logger.Info("L1 output", "accounts", len(worldOutput.L1.Genesis.Alloc)) + for id, l2Output := range worldOutput.L2s { + logger.Info("L2 output", "chain", &id, "accounts", len(l2Output.Genesis.Alloc)) + } +} diff --git a/op-e2e/interop/interop_test.go b/op-e2e/interop/interop_test.go new file mode 100644 index 000000000000..65265c22e7c2 --- /dev/null +++ b/op-e2e/interop/interop_test.go @@ -0,0 +1,100 @@ +package interop + +import ( + "context" + "fmt" + "math/big" + "testing" + "time" + + "github.com/stretchr/testify/require" + + "github.com/ethereum-optimism/optimism/op-chain-ops/interopgen" + "github.com/ethereum-optimism/optimism/op-e2e/system/helpers" +) + +// TestInteropTrivial tests a simple interop scenario +// Chains A and B exist, but no messages are sent between them +// and in fact no event-logs are emitted by either chain at all. +// A transaction is sent from Alice to Bob on Chain A. +// The balance of Bob on Chain A is checked before and after the tx. +// The balance of Bob on Chain B is checked after the tx. +func TestInteropTrivial(t *testing.T) { + recipe := interopgen.InteropDevRecipe{ + L1ChainID: 900100, + L2ChainIDs: []uint64{900200, 900201}, + GenesisTimestamp: uint64(time.Now().Unix() + 3), // start chain 3 seconds from now + } + worldResources := worldResourcePaths{ + foundryArtifacts: "../../packages/contracts-bedrock/forge-artifacts", + sourceMap: "../../packages/contracts-bedrock", + } + + // create a super system from the recipe + // and get the L2 IDs for use in the test + s2 := NewSuperSystem(t, &recipe, worldResources) + ids := s2.L2IDs() + + // chainA is the first L2 chain + chainA := ids[0] + // chainB is the second L2 chain + chainB := ids[1] + + // create two users on all L2 chains + s2.AddUser("Alice") + s2.AddUser("Bob") + + bobAddr := s2.Address(chainA, "Bob") + + // check the balance of Bob + clientA := s2.L2GethClient(chainA) + ctx, cancel := context.WithTimeout(context.Background(), 1*time.Second) + defer cancel() + bobBalance, err := clientA.BalanceAt(ctx, bobAddr, nil) + require.NoError(t, err) + expectedBalance, _ := big.NewInt(0).SetString("10000000000000000000000000", 10) + require.Equal(t, expectedBalance, bobBalance) + + // send a tx from Alice to Bob + s2.SendL2Tx( + chainA, + "Alice", + func(l2Opts *helpers.TxOpts) { + l2Opts.ToAddr = &bobAddr + l2Opts.Value = big.NewInt(1000000) + l2Opts.GasFeeCap = big.NewInt(1_000_000_000) + l2Opts.GasTipCap = big.NewInt(1_000_000_000) + }, + ) + + // check the balance of Bob after the tx + ctx, cancel = context.WithTimeout(context.Background(), 1*time.Second) + defer cancel() + bobBalance, err = clientA.BalanceAt(ctx, bobAddr, nil) + require.NoError(t, err) + expectedBalance, _ = big.NewInt(0).SetString("10000000000000000001000000", 10) + require.Equal(t, expectedBalance, bobBalance) + + // check that the balance of Bob on ChainB hasn't changed + bobAddrB := s2.Address(chainB, "Bob") + clientB := s2.L2GethClient(chainB) + ctx, cancel = context.WithTimeout(context.Background(), 1*time.Second) + defer cancel() + bobBalance, err = clientB.BalanceAt(ctx, bobAddrB, nil) + require.NoError(t, err) + expectedBalance, _ = big.NewInt(0).SetString("10000000000000000000000000", 10) + require.Equal(t, expectedBalance, bobBalance) + + s2.DeployEmitterContract(chainA, "Alice") + rec := s2.EmitData(chainA, "Alice", "0x1234567890abcdef") + + fmt.Println("Result of emitting event:", rec) + + s2.DeployEmitterContract(chainB, "Alice") + rec = s2.EmitData(chainB, "Alice", "0x1234567890abcdef") + + fmt.Println("Result of emitting event:", rec) + + time.Sleep(10 * time.Second) + +} diff --git a/op-e2e/interop/supersystem.go b/op-e2e/interop/supersystem.go new file mode 100644 index 000000000000..ffa91bef97f3 --- /dev/null +++ b/op-e2e/interop/supersystem.go @@ -0,0 +1,678 @@ +package interop + +import ( + "context" + "crypto/ecdsa" + "math/big" + "os" + "path" + "path/filepath" + "testing" + "time" + + emit "github.com/ethereum-optimism/optimism/op-e2e/interop/contracts" + "github.com/ethereum-optimism/optimism/op-e2e/system/helpers" + + "github.com/ethereum-optimism/optimism/op-e2e/e2eutils" + "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/types" + "github.com/ethereum/go-ethereum/crypto" + "github.com/ethereum/go-ethereum/ethclient" + "github.com/ethereum/go-ethereum/log" + "github.com/ethereum/go-ethereum/rpc" + + bss "github.com/ethereum-optimism/optimism/op-batcher/batcher" + batcherFlags "github.com/ethereum-optimism/optimism/op-batcher/flags" + "github.com/ethereum-optimism/optimism/op-chain-ops/devkeys" + "github.com/ethereum-optimism/optimism/op-chain-ops/foundry" + "github.com/ethereum-optimism/optimism/op-chain-ops/interopgen" + "github.com/ethereum-optimism/optimism/op-e2e/e2eutils/fakebeacon" + "github.com/ethereum-optimism/optimism/op-e2e/e2eutils/geth" + "github.com/ethereum-optimism/optimism/op-e2e/e2eutils/opnode" + "github.com/ethereum-optimism/optimism/op-e2e/e2eutils/services" + "github.com/ethereum-optimism/optimism/op-e2e/e2eutils/setuputils" + "github.com/ethereum-optimism/optimism/op-node/node" + "github.com/ethereum-optimism/optimism/op-node/p2p" + "github.com/ethereum-optimism/optimism/op-node/rollup/derive" + "github.com/ethereum-optimism/optimism/op-node/rollup/driver" + "github.com/ethereum-optimism/optimism/op-node/rollup/sync" + l2os "github.com/ethereum-optimism/optimism/op-proposer/proposer" + "github.com/ethereum-optimism/optimism/op-service/client" + "github.com/ethereum-optimism/optimism/op-service/clock" + "github.com/ethereum-optimism/optimism/op-service/dial" + "github.com/ethereum-optimism/optimism/op-service/endpoint" + oplog "github.com/ethereum-optimism/optimism/op-service/log" + "github.com/ethereum-optimism/optimism/op-service/metrics" + "github.com/ethereum-optimism/optimism/op-service/oppprof" + 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" + supervisorConfig "github.com/ethereum-optimism/optimism/op-supervisor/config" + "github.com/ethereum-optimism/optimism/op-supervisor/supervisor" +) + +// SuperSystem is an interface for the system (collection of connected resources) +// it provides a way to get the resources for a network by network ID +// and provides a way to get the list of network IDs +// this is useful for testing multiple network backends, +// for example, interopE2ESystem is the default implementation, but a shim to +// kurtosis or another testing framework could be implemented +type SuperSystem interface { + // get the supervisor + Supervisor() *supervisor.SupervisorService + // get the supervisor client + SupervisorClient() *sources.SupervisorClient + // get the batcher for a network + Batcher(network string) *bss.BatcherService + // get the proposer for a network + Proposer(network string) *l2os.ProposerService + // get the opnode for a network + OpNode(network string) *opnode.Opnode + // get the geth instance for a network + L2Geth(network string) *geth.GethInstance + // get the L2 geth client for a network + L2GethClient(network string) *ethclient.Client + // get the secret for a network and role + L2OperatorKey(network string, role devkeys.ChainOperatorRole) ecdsa.PrivateKey + // get the list of network IDs + L2IDs() []string + // register a username to an account on all L2s + AddUser(username string) + // get the user key for a user on an L2 + UserKey(id, username string) ecdsa.PrivateKey + // send a transaction on an L2 on the given network, from the given user + SendL2Tx(network string, username string, applyTxOpts helpers.TxOptsFn) *types.Receipt + // get the address for a user on an L2 + Address(network string, username string) common.Address + // Deploy the Emitter Contract, which emits Event Logs + DeployEmitterContract(network string, username string) common.Address + // Use the Emitter Contract to emit an Event Log + EmitData(network string, username string, data string) *types.Receipt + // Access a contract on a network by name + Contract(network string, contractName string) interface{} +} + +// NewSuperSystem creates a new SuperSystem from a recipe. It creates an interopE2ESystem. +func NewSuperSystem(t *testing.T, recipe *interopgen.InteropDevRecipe, w worldResourcePaths) SuperSystem { + s2 := &interopE2ESystem{recipe: recipe} + s2.prepare(t, w) + return s2 +} + +// interopE2ESystem implements the SuperSystem interface +// it prepares network resources and provides access to them +// the functionality is broken down into smaller functions so that +// the system can be prepared iteratively if desired +type interopE2ESystem struct { + t *testing.T + recipe *interopgen.InteropDevRecipe + logger log.Logger + hdWallet *devkeys.MnemonicDevKeys + worldDeployment *interopgen.WorldDeployment + worldOutput *interopgen.WorldOutput + beacon *fakebeacon.FakeBeacon + l1 *geth.GethInstance + l2s map[string]l2Set + l2GethClients map[string]*ethclient.Client + supervisor *supervisor.SupervisorService + superClient *sources.SupervisorClient +} + +// l2Set is a set of resources for an L2 chain +type l2Set struct { + chainID *big.Int + opNode *opnode.Opnode + l2Geth *geth.GethInstance + proposer *l2os.ProposerService + batcher *bss.BatcherService + operatorKeys map[devkeys.ChainOperatorRole]ecdsa.PrivateKey + userKeys map[string]ecdsa.PrivateKey + contracts map[string]interface{} +} + +// prepareHDWallet creates a new HD wallet to derive keys from +func (s *interopE2ESystem) prepareHDWallet() *devkeys.MnemonicDevKeys { + hdWallet, err := devkeys.NewMnemonicDevKeys(devkeys.TestMnemonic) + require.NoError(s.t, err) + return hdWallet +} + +type worldResourcePaths struct { + foundryArtifacts string + sourceMap string +} + +// prepareWorld creates the world configuration from the recipe and deploys it +func (s *interopE2ESystem) prepareWorld(w worldResourcePaths) (*interopgen.WorldDeployment, *interopgen.WorldOutput) { + // Build the world configuration from the recipe and the HD wallet + worldCfg, err := s.recipe.Build(s.hdWallet) + require.NoError(s.t, err) + + // create a logger for the world configuration + logger := s.logger.New("role", "world") + require.NoError(s.t, worldCfg.Check(logger)) + + // create the foundry artifacts and source map + foundryArtifacts := foundry.OpenArtifactsDir(w.foundryArtifacts) + sourceMap := foundry.NewSourceMapFS(os.DirFS(w.sourceMap)) + + // deploy the world, using the logger, foundry artifacts, source map, and world configuration + worldDeployment, worldOutput, err := interopgen.Deploy(logger, foundryArtifacts, sourceMap, worldCfg) + require.NoError(s.t, err) + + return worldDeployment, worldOutput +} + +// prepareL1 creates the L1 chain resources +func (s *interopE2ESystem) prepareL1() (*fakebeacon.FakeBeacon, *geth.GethInstance) { + // Create a fake Beacon node to hold on to blobs created by the L1 miner, and to serve them to L2 + genesisTimestampL1 := s.worldOutput.L1.Genesis.Timestamp + blockTimeL1 := uint64(6) + blobPath := s.t.TempDir() + bcn := fakebeacon.NewBeacon(s.logger.New("role", "l1_cl"), + e2eutils.NewBlobStore(), genesisTimestampL1, blockTimeL1) + s.t.Cleanup(func() { + _ = bcn.Close() + }) + require.NoError(s.t, bcn.Start("127.0.0.1:0")) + beaconApiAddr := bcn.BeaconAddr() + require.NotEmpty(s.t, beaconApiAddr, "beacon API listener must be up") + + l1FinalizedDistance := uint64(3) + l1Clock := clock.SystemClock + // Start the L1 chain + l1Geth, err := geth.InitL1( + blockTimeL1, + l1FinalizedDistance, + s.worldOutput.L1.Genesis, + l1Clock, + filepath.Join(blobPath, "l1_el"), + bcn) + + require.NoError(s.t, err) + require.NoError(s.t, l1Geth.Node.Start()) + s.t.Cleanup(func() { + _ = l1Geth.Close() + }) + return bcn, l1Geth +} + +// newOperatorKeysForL2 creates the operator keys for an L2 chain +// it uses an L2Output to determine the chain ID and configuration, +// and then makes a key for each operator role [SequencerP2PRole, ProposerRole, BatcherRole] +func (s *interopE2ESystem) newOperatorKeysForL2(l2Out *interopgen.L2Output) map[devkeys.ChainOperatorRole]ecdsa.PrivateKey { + // Create operatorKeys for the L2 chain actors + operatorKeys := map[devkeys.ChainOperatorRole]ecdsa.PrivateKey{} + // create the sequencer P2P secret + seqP2PSecret, err := s.hdWallet.Secret(devkeys.ChainOperatorKey{ + ChainID: l2Out.Genesis.Config.ChainID, + Role: devkeys.SequencerP2PRole, + }) + require.NoError(s.t, err) + operatorKeys[devkeys.SequencerP2PRole] = *seqP2PSecret + // create the proposer secret + proposerSecret, err := s.hdWallet.Secret(devkeys.ChainOperatorKey{ + ChainID: l2Out.Genesis.Config.ChainID, + Role: devkeys.ProposerRole, + }) + require.NoError(s.t, err) + operatorKeys[devkeys.ProposerRole] = *proposerSecret + // create the batcher secret + batcherSecret, err := s.hdWallet.Secret(devkeys.ChainOperatorKey{ + ChainID: l2Out.Genesis.Config.ChainID, + Role: devkeys.BatcherRole, + }) + require.NoError(s.t, err) + operatorKeys[devkeys.BatcherRole] = *batcherSecret + return operatorKeys +} + +// newGethForL2 creates a new Geth instance for an L2 chain +func (s *interopE2ESystem) newGethForL2(id string, l2Out *interopgen.L2Output) *geth.GethInstance { + jwtPath := writeDefaultJWT(s.t) + name := "l2-" + id + l2Geth, err := geth.InitL2(name, l2Out.Genesis, jwtPath) + require.NoError(s.t, err) + require.NoError(s.t, l2Geth.Node.Start()) + s.t.Cleanup(func() { + _ = l2Geth.Close() + }) + return l2Geth +} + +// newNodeForL2 creates a new Opnode for an L2 chain +func (s *interopE2ESystem) newNodeForL2( + id string, + l2Out *interopgen.L2Output, + operatorKeys map[devkeys.ChainOperatorRole]ecdsa.PrivateKey, + l2Geth *geth.GethInstance, +) *opnode.Opnode { + logger := s.logger.New("role", "op-node-"+id) + p2pKey := operatorKeys[devkeys.SequencerP2PRole] + nodeCfg := &node.Config{ + L1: &node.PreparedL1Endpoint{ + Client: client.NewBaseRPCClient(endpoint.DialRPC( + endpoint.PreferAnyRPC, + s.l1.UserRPC(), + mustDial(s.t, logger))), + TrustRPC: false, + RPCProviderKind: sources.RPCKindDebugGeth, + }, + L2: &node.L2EndpointConfig{ + L2EngineAddr: l2Geth.AuthRPC().RPC(), + L2EngineJWTSecret: testingJWTSecret, + }, + Beacon: &node.L1BeaconEndpointConfig{ + BeaconAddr: s.beacon.BeaconAddr(), + }, + Driver: driver.Config{ + SequencerEnabled: true, + }, + Rollup: *l2Out.RollupCfg, + P2PSigner: &p2p.PreparedSigner{ + Signer: p2p.NewLocalSigner(&p2pKey)}, + RPC: node.RPCConfig{ + ListenAddr: "127.0.0.1", + ListenPort: 0, + EnableAdmin: true, + }, + Supervisor: &node.SupervisorEndpointConfig{ + SupervisorAddr: s.supervisor.RPC(), + }, + P2P: nil, // disabled P2P setup for now + L1EpochPollInterval: time.Second * 2, + RuntimeConfigReloadInterval: 0, + Tracer: nil, + Sync: sync.Config{ + SyncMode: sync.CLSync, + SkipSyncStartCheck: false, + SupportsPostFinalizationELSync: false, + }, + ConfigPersistence: node.DisabledConfigPersistence{}, + } + opNode, err := opnode.NewOpnode(logger.New("service", "op-node"), + nodeCfg, func(err error) { + s.t.Error(err) + }) + require.NoError(s.t, err) + s.t.Cleanup(func() { + ctx, cancel := context.WithCancel(context.Background()) + cancel() // force-quit + _ = opNode.Stop(ctx) + }) + return opNode +} + +// newProposerForL2 creates a new Proposer for an L2 chain +// it is currently unused, as the generated world does not have a DisputeGameFactoryProxy +// TODO(#11888): name this function "newProposerForL2" and use it in the prepareL2s function when the DisputeGameFactoryProxy is available +func (s *interopE2ESystem) _( + id string, + operatorKeys map[devkeys.ChainOperatorRole]ecdsa.PrivateKey, + opNode *opnode.Opnode, +) *l2os.ProposerService { + proposerSecret := operatorKeys[devkeys.ProposerRole] + logger := s.logger.New("role", "proposer"+id) + proposerCLIConfig := &l2os.CLIConfig{ + L1EthRpc: s.l1.UserRPC().RPC(), + RollupRpc: opNode.UserRPC().RPC(), + DGFAddress: s.worldDeployment.L2s[id].DisputeGameFactoryProxy.Hex(), + ProposalInterval: 6 * time.Second, + DisputeGameType: 254, // Fast game type + PollInterval: 500 * time.Millisecond, + TxMgrConfig: setuputils.NewTxMgrConfig(s.l1.UserRPC(), &proposerSecret), + AllowNonFinalized: false, + LogConfig: oplog.CLIConfig{ + Level: log.LvlInfo, + Format: oplog.FormatText, + }, + } + proposer, err := l2os.ProposerServiceFromCLIConfig( + context.Background(), + "0.0.1", + proposerCLIConfig, + logger.New("service", "proposer")) + require.NoError(s.t, err, "must start proposer") + require.NoError(s.t, proposer.Start(context.Background())) + s.t.Cleanup(func() { + ctx, cancel := context.WithCancel(context.Background()) + cancel() // force-quit + _ = proposer.Stop(ctx) + }) + return proposer +} + +// newBatcherForL2 creates a new Batcher for an L2 chain +func (s *interopE2ESystem) newBatcherForL2( + id string, + operatorKeys map[devkeys.ChainOperatorRole]ecdsa.PrivateKey, + l2Geth *geth.GethInstance, + opNode *opnode.Opnode, +) *bss.BatcherService { + batcherSecret := operatorKeys[devkeys.BatcherRole] + logger := s.logger.New("role", "batcher"+id) + batcherCLIConfig := &bss.CLIConfig{ + L1EthRpc: s.l1.UserRPC().RPC(), + L2EthRpc: l2Geth.UserRPC().RPC(), + RollupRpc: opNode.UserRPC().RPC(), + MaxPendingTransactions: 1, + MaxChannelDuration: 1, + MaxL1TxSize: 120_000, + TestUseMaxTxSizeForBlobs: false, + TargetNumFrames: 1, + ApproxComprRatio: 0.4, + SubSafetyMargin: 4, + PollInterval: 50 * time.Millisecond, + TxMgrConfig: setuputils.NewTxMgrConfig(s.l1.UserRPC(), &batcherSecret), + LogConfig: oplog.CLIConfig{ + Level: log.LevelInfo, + Format: oplog.FormatText, + }, + Stopped: false, + BatchType: derive.SpanBatchType, + MaxBlocksPerSpanBatch: 10, + DataAvailabilityType: batcherFlags.CalldataType, + CompressionAlgo: derive.Brotli, + } + batcher, err := bss.BatcherServiceFromCLIConfig( + context.Background(), "0.0.1", batcherCLIConfig, + logger.New("service", "batcher")) + require.NoError(s.t, err) + require.NoError(s.t, batcher.Start(context.Background())) + s.t.Cleanup(func() { + ctx, cancel := context.WithCancel(context.Background()) + cancel() // force-quit + _ = batcher.Stop(ctx) + }) + return batcher +} + +// newL2 creates a new L2, starting with the L2Output from the world configuration +// and iterating through the resources needed for the L2. +// it returns a l2Set with the resources for the L2 +func (s *interopE2ESystem) newL2(id string, l2Out *interopgen.L2Output) l2Set { + operatorKeys := s.newOperatorKeysForL2(l2Out) + l2Geth := s.newGethForL2(id, l2Out) + opNode := s.newNodeForL2(id, l2Out, operatorKeys, l2Geth) + // TODO(#11886): proposer does not work with the generated world as there is no DisputeGameFactoryProxy + //proposer := s.newProposerForL2(id, operatorKeys, opNode) + batcher := s.newBatcherForL2(id, operatorKeys, l2Geth, opNode) + + return l2Set{ + chainID: l2Out.Genesis.Config.ChainID, + opNode: opNode, + l2Geth: l2Geth, + proposer: nil, + batcher: batcher, + operatorKeys: operatorKeys, + userKeys: make(map[string]ecdsa.PrivateKey), + contracts: make(map[string]interface{}), + } +} + +// prepareSupervisor creates a new supervisor for the system +func (s *interopE2ESystem) prepareSupervisor() *supervisor.SupervisorService { + // Be verbose with op-supervisor, it's in early test phase + logger := testlog.Logger(s.t, log.LevelDebug).New("role", "supervisor") + cfg := supervisorConfig.Config{ + MetricsConfig: metrics.CLIConfig{ + Enabled: false, + }, + PprofConfig: oppprof.CLIConfig{ + ListenEnabled: false, + }, + LogConfig: oplog.CLIConfig{ + Level: log.LevelDebug, + Format: oplog.FormatText, + }, + RPC: oprpc.CLIConfig{ + ListenAddr: "127.0.0.1", + ListenPort: 0, + EnableAdmin: true, + }, + L2RPCs: []string{}, + Datadir: path.Join(s.t.TempDir(), "supervisor"), + } + for id := range s.l2s { + cfg.L2RPCs = append(cfg.L2RPCs, s.l2s[id].l2Geth.UserRPC().RPC()) + } + // Create the supervisor with the configuration + super, err := supervisor.SupervisorFromConfig(context.Background(), &cfg, logger) + require.NoError(s.t, err) + // Start the supervisor + err = super.Start(context.Background()) + require.NoError(s.t, err) + s.t.Cleanup(func() { + ctx, cancel := context.WithCancel(context.Background()) + cancel() // force-quit + _ = super.Stop(ctx) + }) + return super +} + +// SupervisorClient returns the supervisor client for the system, creating it if it doesn't exist +func (s *interopE2ESystem) SupervisorClient() *sources.SupervisorClient { + if s.superClient != nil { + return s.superClient + } + cl, err := client.NewRPC(context.Background(), s.logger, s.supervisor.RPC()) + require.NoError(s.t, err, "failed to dial supervisor RPC") + superClient := sources.NewSupervisorClient(cl) + s.superClient = superClient + return superClient +} + +// prepare sets up the system for testing +// components are built iteratively, so that they can be reused or modified +// their creation can't be safely skipped or reordered at this time +func (s *interopE2ESystem) prepare(t *testing.T, w worldResourcePaths) { + s.t = t + s.logger = testlog.Logger(s.t, log.LevelInfo) + s.hdWallet = s.prepareHDWallet() + s.worldDeployment, s.worldOutput = s.prepareWorld(w) + + // the supervisor and client are created first so that the L2s can use the supervisor + s.supervisor = s.prepareSupervisor() + + s.beacon, s.l1 = s.prepareL1() + s.l2s = s.prepareL2s() + + // add the L2 RPCs to the supervisor now that the L2s are created + ctx := context.Background() + for _, l2 := range s.l2s { + err := s.SupervisorClient().AddL2RPC(ctx, l2.l2Geth.UserRPC().RPC()) + require.NoError(s.t, err, "failed to add L2 RPC to supervisor", "error", err) + } +} + +// AddUser adds a user to the system by creating a user key for each L2. +// each user key is stored in the L2's userKeys map. +// because all user maps start empty, a users index should be the same for all L2s, +// but if in the future these maps can diverge, the indexes for username would also diverge +// NOTE: The first 20 accounts are implicitly funded by the Recipe's World Deployment +// see: op-chain-ops/interopgen/recipe.go +// TODO(#11887): make the funded account quantity specified in the recipe so SuperSystems can know which accounts are funded +func (s *interopE2ESystem) AddUser(username string) { + for id, l2 := range s.l2s { + bigID, _ := big.NewInt(0).SetString(id, 10) + userSecret, _ := s.hdWallet.Secret( + devkeys.ChainUserKey{ + ChainID: bigID, + Index: uint64(len(l2.userKeys)), + }, + ) + l2.userKeys[username] = *userSecret + } +} + +// UserKey returns the user key for a user on an L2 +func (s *interopE2ESystem) UserKey(id, username string) ecdsa.PrivateKey { + return s.l2s[id].userKeys[username] +} + +// Address returns the address for a user on an L2 +func (s *interopE2ESystem) Address(id, username string) common.Address { + secret := s.UserKey(id, username) + require.NotNil(s.t, secret, "no secret found for user %s", username) + return crypto.PubkeyToAddress(secret.PublicKey) +} + +// prepareL2s creates the L2s for the system, returning a map of L2s +func (s *interopE2ESystem) prepareL2s() map[string]l2Set { + l2s := make(map[string]l2Set) + for id, l2Out := range s.worldOutput.L2s { + l2s[id] = s.newL2(id, l2Out) + } + return l2s +} + +func (s *interopE2ESystem) L2GethClient(id string) *ethclient.Client { + // guard: check if the client already exists and return it in that case + nodeClient, ok := s.l2GethClients[id] + if ok { + return nodeClient + } + // create a new client for the L2 from the L2's geth instance + var ethClient services.EthInstance = s.L2Geth(id) + rpcEndpoint := ethClient.UserRPC() + rpcCl := endpoint.DialRPC( + endpoint.PreferAnyRPC, + rpcEndpoint, + func(v string) *rpc.Client { + logger := testlog.Logger(s.t, log.LevelInfo).New("node", id) + cl, err := dial.DialRPCClientWithTimeout(context.Background(), 30*time.Second, logger, v) + require.NoError(s.t, err, "failed to dial eth node instance %s", id) + return cl + }) + nodeClient = ethclient.NewClient(rpcCl) + // register the client so it can be reused + s.addL2GethClient(id, nodeClient) + return nodeClient +} + +func (sys *interopE2ESystem) addL2GethClient(name string, client *ethclient.Client) { + if sys.l2GethClients == nil { + sys.l2GethClients = make(map[string]*ethclient.Client) + } + sys.l2GethClients[name] = client +} + +// getter functions for L1 entities +func (s *interopE2ESystem) Supervisor() *supervisor.SupervisorService { + return s.supervisor +} + +// gettter functions for the individual L2s +func (s *interopE2ESystem) Batcher(id string) *bss.BatcherService { + return s.l2s[id].batcher +} +func (s *interopE2ESystem) Proposer(id string) *l2os.ProposerService { + return s.l2s[id].proposer +} +func (s *interopE2ESystem) OpNode(id string) *opnode.Opnode { + return s.l2s[id].opNode +} +func (s *interopE2ESystem) L2Geth(id string) *geth.GethInstance { + return s.l2s[id].l2Geth +} +func (s *interopE2ESystem) L2OperatorKey(id string, role devkeys.ChainOperatorRole) ecdsa.PrivateKey { + return s.l2s[id].operatorKeys[role] +} + +// L2IDs returns the list of L2 IDs, which are the keys of the L2s map +func (s *interopE2ESystem) L2IDs() []string { + ids := make([]string, 0, len(s.l2s)) + for id := range s.l2s { + ids = append(ids, id) + } + return ids +} + +// SendL2Tx sends an L2 transaction to the L2 with the given ID. +// it acts as a wrapper around op-e2e.SendL2TxWithID +// and uses the L2's chain ID, username key, and geth client. +func (s *interopE2ESystem) SendL2Tx( + id string, + sender string, + applyTxOpts helpers.TxOptsFn, +) *types.Receipt { + senderSecret := s.UserKey(id, sender) + require.NotNil(s.t, senderSecret, "no secret found for sender %s", sender) + nonce, err := s.L2GethClient(id).PendingNonceAt(context.Background(), crypto.PubkeyToAddress(senderSecret.PublicKey)) + require.NoError(s.t, err, "failed to get nonce") + newApply := func(opts *helpers.TxOpts) { + applyTxOpts(opts) + opts.Nonce = nonce + } + return helpers.SendL2TxWithID( + s.t, + s.l2s[id].chainID, + s.L2GethClient(id), + &senderSecret, + newApply) +} + +func (s *interopE2ESystem) DeployEmitterContract( + id string, + sender string, +) common.Address { + secret := s.UserKey(id, sender) + auth, err := bind.NewKeyedTransactorWithChainID(&secret, s.l2s[id].chainID) + require.NoError(s.t, err) + auth.GasLimit = uint64(3000000) + auth.GasPrice = big.NewInt(20000000000) + address, _, _, err := emit.DeployEmit(auth, s.L2GethClient(id)) + require.NoError(s.t, err) + contract, err := emit.NewEmit(address, s.L2GethClient(id)) + require.NoError(s.t, err) + s.l2s[id].contracts["emitter"] = contract + return address +} + +func (s *interopE2ESystem) EmitData( + id string, + sender string, + data string, +) *types.Receipt { + secret := s.UserKey(id, sender) + auth, err := bind.NewKeyedTransactorWithChainID(&secret, s.l2s[id].chainID) + + require.NoError(s.t, err) + + auth.GasLimit = uint64(3000000) + auth.GasPrice = big.NewInt(20000000000) + + contract := s.Contract(id, "emitter").(*emit.Emit) + tx, err := contract.EmitTransactor.EmitData(auth, []byte(data)) + require.NoError(s.t, err) + receipt, err := bind.WaitMined(context.Background(), s.L2GethClient(id), tx) + require.NoError(s.t, err) + return receipt +} + +func (s *interopE2ESystem) Contract(id string, name string) interface{} { + return s.l2s[id].contracts[name] +} + +func mustDial(t *testing.T, logger log.Logger) func(v string) *rpc.Client { + return func(v string) *rpc.Client { + cl, err := dial.DialRPCClientWithTimeout(context.Background(), 30*time.Second, logger, v) + require.NoError(t, err, "failed to dial") + return cl + } +} + +var testingJWTSecret = [32]byte{123} + +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 { + t.Fatalf("failed to prepare jwt file for geth: %v", err) + } + return jwtPath +} diff --git a/op-e2e/l2_gossip_test.go b/op-e2e/l2_gossip_test.go deleted file mode 100644 index b20107ca587c..000000000000 --- a/op-e2e/l2_gossip_test.go +++ /dev/null @@ -1,32 +0,0 @@ -package op_e2e - -import ( - "testing" - - "github.com/ethereum-optimism/optimism/op-e2e/e2eutils/geth" - "github.com/ethereum/go-ethereum/common" - "github.com/stretchr/testify/require" -) - -func TestTxGossip(t *testing.T) { - InitParallel(t) - cfg := DefaultSystemConfig(t) - gethOpts := []geth.GethOption{ - geth.WithP2P(), - } - cfg.GethOptions["sequencer"] = append(cfg.GethOptions["sequencer"], gethOpts...) - cfg.GethOptions["verifier"] = append(cfg.GethOptions["verifier"], gethOpts...) - sys, err := cfg.Start(t) - require.NoError(t, err, "Start system") - - seqClient := sys.Clients["sequencer"] - verifClient := sys.Clients["verifier"] - geth.ConnectP2P(t, seqClient, verifClient) - - // Send a transaction to the verifier and it should be gossiped to the sequencer and included in a block. - SendL2Tx(t, cfg, verifClient, cfg.Secrets.Alice, func(opts *TxOpts) { - opts.ToAddr = &common.Address{0xaa} - opts.Value = common.Big1 - opts.VerifyOnClients(seqClient, verifClient) - }) -} diff --git a/op-e2e/fastlz_test.go b/op-e2e/opgeth/fastlz_test.go similarity index 98% rename from op-e2e/fastlz_test.go rename to op-e2e/opgeth/fastlz_test.go index 26a2d80119c5..3b910d41f816 100644 --- a/op-e2e/fastlz_test.go +++ b/op-e2e/opgeth/fastlz_test.go @@ -1,4 +1,7 @@ -package op_e2e +//go:build cgo_test +// +build cgo_test + +package opgeth import ( "context" @@ -10,6 +13,7 @@ import ( "github.com/ethereum-optimism/optimism/op-e2e/bindings" "github.com/ethereum-optimism/optimism/op-e2e/fastlz" + "github.com/ethereum-optimism/optimism/op-e2e/system/e2esys" "github.com/ethereum-optimism/optimism/op-service/predeploys" "github.com/ethereum/go-ethereum" "github.com/ethereum/go-ethereum/accounts/abi/bind" @@ -76,7 +80,7 @@ func FuzzFjordCostFunction(f *testing.F) { f.Add(seed) } - cfg := DefaultSystemConfig(f) + cfg := e2esys.DefaultSystemConfig(f) s := hexutil.Uint64(0) cfg.DeployConfig.L2GenesisCanyonTimeOffset = &s cfg.DeployConfig.L2GenesisDeltaTimeOffset = &s diff --git a/op-e2e/op_geth.go b/op-e2e/opgeth/op_geth.go similarity index 83% rename from op-e2e/op_geth.go rename to op-e2e/opgeth/op_geth.go index 8bb3e8fb6465..7ee9587631dd 100644 --- a/op-e2e/op_geth.go +++ b/op-e2e/opgeth/op_geth.go @@ -1,17 +1,19 @@ -package op_e2e +package opgeth import ( "context" "errors" "fmt" - "math/big" "reflect" "testing" + "github.com/ethereum-optimism/optimism/op-e2e/system/e2esys" + "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" "github.com/ethereum-optimism/optimism/op-e2e/e2eutils/geth" + "github.com/ethereum-optimism/optimism/op-e2e/e2eutils/services" "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" @@ -39,7 +41,7 @@ var ( // OpGeth is an actor that functions as a l2 op-geth node // It provides useful functions for advancing and querying the chain type OpGeth struct { - node EthInstance + node services.EthInstance l2Engine *sources.EngineClient L2Client *ethclient.Client SystemConfig eth.SystemConfig @@ -51,27 +53,31 @@ type OpGeth struct { lgr log.Logger } -func NewOpGeth(t testing.TB, ctx context.Context, cfg *SystemConfig) (*OpGeth, error) { +func NewOpGeth(t testing.TB, ctx context.Context, cfg *e2esys.SystemConfig) (*OpGeth, error) { logger := testlog.Logger(t, log.LevelCrit) l1Genesis, err := genesis.BuildL1DeveloperGenesis(cfg.DeployConfig, config.L1Allocs, config.L1Deployments) - require.Nil(t, err) + require.NoError(t, err) l1Block := l1Genesis.ToBlock() var allocsMode genesis.L2AllocsMode allocsMode = genesis.L2AllocsDelta - if fjordTime := cfg.DeployConfig.FjordTime(l1Block.Time()); fjordTime != nil && *fjordTime <= 0 { + if graniteTime := cfg.DeployConfig.GraniteTime(l1Block.Time()); graniteTime != nil && *graniteTime <= 0 { + allocsMode = genesis.L2AllocsGranite + } else 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) + + l2Genesis, err := genesis.BuildL2Genesis(cfg.DeployConfig, l2Allocs, l1Block.Header()) + require.NoError(t, err) if cfg.UseSoulGasToken { l2Genesis.Config.Optimism.UseSoulGasToken = true l2Genesis.Config.Optimism.IsSoulBackedByNative = cfg.IsSoulBackedByNative } + l2GenesisBlock := l2Genesis.ToBlock() rollupGenesis := rollup.Genesis{ @@ -87,17 +93,18 @@ func NewOpGeth(t testing.TB, ctx context.Context, cfg *SystemConfig) (*OpGeth, e SystemConfig: e2eutils.SystemConfigFromDeployConfig(cfg.DeployConfig), } - var node EthInstance + var node services.EthInstance if cfg.ExternalL2Shim == "" { - gethNode, _, err := geth.InitL2("l2", big.NewInt(int64(cfg.DeployConfig.L2ChainID)), l2Genesis, cfg.JWTFilePath) - require.Nil(t, err) - require.Nil(t, gethNode.Start()) + gethNode, err := geth.InitL2("l2", l2Genesis, cfg.JWTFilePath) + require.NoError(t, err) + require.NoError(t, gethNode.Node.Start()) node = gethNode } else { if cfg.UseSoulGasToken { return nil, fmt.Errorf("SoulGasToken not supported for ExternalL2") } - externalNode := (&ExternalRunner{ + + externalNode := (&e2esys.ExternalRunner{ Name: "l2", BinPath: cfg.ExternalL2Shim, Genesis: l2Genesis, @@ -107,11 +114,11 @@ func NewOpGeth(t testing.TB, ctx context.Context, cfg *SystemConfig) (*OpGeth, e } auth := rpc.WithHTTPAuth(gn.NewJWTAuth(cfg.JWTSecret)) - l2Node, err := client.NewRPC(ctx, logger, node.WSAuthEndpoint(), client.WithGethRPCOptions(auth)) + l2Node, err := client.NewRPC(ctx, logger, node.AuthRPC().RPC(), client.WithGethRPCOptions(auth)) require.NoError(t, err) // Finally create the engine client - rollupCfg, err := cfg.DeployConfig.RollupConfig(l1Block, l2GenesisBlock.Hash(), l2GenesisBlock.NumberU64()) + rollupCfg, err := cfg.DeployConfig.RollupConfig(l1Block.Header(), l2GenesisBlock.Hash(), l2GenesisBlock.NumberU64()) require.NoError(t, err) rollupCfg.Genesis = rollupGenesis l2Engine, err := sources.NewEngineClient( @@ -120,14 +127,14 @@ func NewOpGeth(t testing.TB, ctx context.Context, cfg *SystemConfig) (*OpGeth, e nil, sources.EngineClientDefaultConfig(rollupCfg), ) - require.Nil(t, err) + require.NoError(t, err) - l2Client, err := ethclient.Dial(selectEndpoint(node)) - require.Nil(t, err) + l2Client, err := ethclient.Dial(node.UserRPC().RPC()) + require.NoError(t, err) genesisPayload, err := eth.BlockAsPayload(l2GenesisBlock, cfg.DeployConfig.CanyonTime(l2GenesisBlock.Time())) - require.Nil(t, err) + require.NoError(t, err) return &OpGeth{ node: node, L2Client: l2Client, @@ -158,14 +165,14 @@ func (d *OpGeth) AddL2Block(ctx context.Context, txs ...*types.Transaction) (*et } res, err := d.StartBlockBuilding(ctx, attrs) if err != nil { - return nil, err + return nil, fmt.Errorf("start block building: %w", err) } envelope, err := d.l2Engine.GetPayload(ctx, eth.PayloadInfo{ID: *res.PayloadID, Timestamp: uint64(attrs.Timestamp)}) payload := envelope.ExecutionPayload if err != nil { - return nil, err + return nil, fmt.Errorf("get payload: %w", err) } if !reflect.DeepEqual(payload.Transactions, attrs.Transactions) { return nil, errors.New("required transactions were not included") @@ -173,7 +180,7 @@ func (d *OpGeth) AddL2Block(ctx context.Context, txs ...*types.Transaction) (*et status, err := d.l2Engine.NewPayload(ctx, payload, envelope.ParentBeaconBlockRoot) if err != nil { - return nil, err + return nil, fmt.Errorf("new payload: %w", err) } if status.Status != eth.ExecutionValid { return nil, fmt.Errorf("%w: %s", ErrNewPayloadNotValid, status.Status) @@ -185,7 +192,7 @@ func (d *OpGeth) AddL2Block(ctx context.Context, txs ...*types.Transaction) (*et } res, err = d.l2Engine.ForkchoiceUpdate(ctx, &fc, nil) if err != nil { - return nil, err + return nil, fmt.Errorf("forkchoice update: %w", err) } if res.PayloadStatus.Status != eth.ExecutionValid { return nil, fmt.Errorf("%w: %s", ErrForkChoiceUpdatedNotValid, res.PayloadStatus.Status) @@ -242,6 +249,10 @@ func (d *OpGeth) CreatePayloadAttributes(txs ...*types.Transaction) (*eth.Payloa var parentBeaconBlockRoot *common.Hash if d.L2ChainConfig.IsEcotone(uint64(timestamp)) { parentBeaconBlockRoot = d.L1Head.ParentBeaconRoot() + // In case L1 hasn't activated Dencun yet. + if parentBeaconBlockRoot == nil { + parentBeaconBlockRoot = &(common.Hash{}) + } } attrs := eth.PayloadAttributes{ diff --git a/op-e2e/op_geth_test.go b/op-e2e/opgeth/op_geth_test.go similarity index 89% rename from op-e2e/op_geth_test.go rename to op-e2e/opgeth/op_geth_test.go index 543c6cc945ad..04bfe238d719 100644 --- a/op-e2e/op_geth_test.go +++ b/op-e2e/opgeth/op_geth_test.go @@ -1,4 +1,4 @@ -package op_e2e +package opgeth import ( "context" @@ -7,6 +7,10 @@ import ( "testing" "time" + op_e2e "github.com/ethereum-optimism/optimism/op-e2e" + + "github.com/ethereum-optimism/optimism/op-e2e/system/e2esys" + "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" @@ -33,8 +37,8 @@ var ( // 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) + op_e2e.InitParallel(t) + cfg := e2esys.DefaultSystemConfig(t) ctx, cancel := context.WithTimeout(context.Background(), 60*time.Second) defer cancel() opGeth, err := NewOpGeth(t, ctx, &cfg) @@ -56,11 +60,10 @@ func TestMissingGasLimit(t *testing.T) { // TestTxGasSameAsBlockGasLimit tests that op-geth rejects transactions that attempt to use the full block gas limit. // The L1 Info deposit always takes gas so the effective gas limit is lower than the full block gas limit. func TestTxGasSameAsBlockGasLimit(t *testing.T) { - InitParallel(t) - cfg := DefaultSystemConfig(t) + op_e2e.InitParallel(t) + cfg := e2esys.DefaultSystemConfig(t) sys, err := cfg.Start(t) require.Nil(t, err, "Error starting up system") - defer sys.Close() ethPrivKey := sys.Cfg.Secrets.Alice tx := types.MustSignNewTx(ethPrivKey, types.LatestSignerForChainID(cfg.L2ChainIDBig()), &types.DynamicFeeTx{ @@ -69,17 +72,16 @@ func TestTxGasSameAsBlockGasLimit(t *testing.T) { }) ctx, cancel := context.WithTimeout(context.Background(), 30*time.Second) defer cancel() - l2Seq := sys.Clients["sequencer"] + l2Seq := sys.NodeClient("sequencer") err = l2Seq.SendTransaction(ctx, tx) require.ErrorContains(t, err, txpool.ErrGasLimit.Error()) - } // TestInvalidDepositInFCU runs an invalid deposit through a FCU/GetPayload/NewPayload/FCU set of calls. // This tests that deposits must always allow the block to be built even if they are invalid. func TestInvalidDepositInFCU(t *testing.T) { - InitParallel(t) - cfg := DefaultSystemConfig(t) + op_e2e.InitParallel(t) + cfg := e2esys.DefaultSystemConfig(t) ctx, cancel := context.WithTimeout(context.Background(), 60*time.Second) defer cancel() opGeth, err := NewOpGeth(t, ctx, &cfg) @@ -118,8 +120,8 @@ func TestInvalidDepositInFCU(t *testing.T) { // and asserts that the pending block is set to match the latest block at every stage, // for stability and tx-privacy. func TestGethOnlyPendingBlockIsLatest(t *testing.T) { - InitParallel(t) - cfg := DefaultSystemConfig(t) + op_e2e.InitParallel(t) + cfg := e2esys.DefaultSystemConfig(t) cfg.DeployConfig.FundDevAccounts = true ctx, cancel := context.WithTimeout(context.Background(), 60*time.Second) defer cancel() @@ -128,7 +130,7 @@ func TestGethOnlyPendingBlockIsLatest(t *testing.T) { defer opGeth.Close() checkPending := func(stage string, number uint64) { - // TODO(CLI-4044): pending-block ID change + // TODO: pending-block ID change pendingBlock, err := opGeth.L2Client.BlockByNumber(ctx, big.NewInt(-1)) require.NoError(t, err, "failed to fetch pending block at stage "+stage) require.Equal(t, number, pendingBlock.NumberU64(), "pending block must have expected number") @@ -244,11 +246,10 @@ func TestPreregolith(t *testing.T) { for _, test := range tests { test := test t.Run("GasUsed_"+test.name, func(t *testing.T) { - InitParallel(t) + op_e2e.InitParallel(t) // Setup an L2 EE and create a client connection to the engine. // We also need to setup a L1 Genesis to create the rollup genesis. - cfg := DefaultSystemConfig(t) - cfg.DeployConfig.L2GenesisRegolithTimeOffset = test.regolithTime + cfg := e2esys.RegolithSystemConfig(t, test.regolithTime) ctx, cancel := context.WithTimeout(context.Background(), 60*time.Second) defer cancel() @@ -293,11 +294,10 @@ func TestPreregolith(t *testing.T) { }) t.Run("DepositNonce_"+test.name, func(t *testing.T) { - InitParallel(t) + op_e2e.InitParallel(t) // Setup an L2 EE and create a client connection to the engine. // We also need to setup a L1 Genesis to create the rollup genesis. - cfg := DefaultSystemConfig(t) - cfg.DeployConfig.L2GenesisRegolithTimeOffset = test.regolithTime + cfg := e2esys.RegolithSystemConfig(t, test.regolithTime) ctx, cancel := context.WithTimeout(context.Background(), 60*time.Second) defer cancel() @@ -352,9 +352,8 @@ func TestPreregolith(t *testing.T) { }) t.Run("UnusedGasConsumed_"+test.name, func(t *testing.T) { - InitParallel(t) - cfg := DefaultSystemConfig(t) - cfg.DeployConfig.L2GenesisRegolithTimeOffset = test.regolithTime + op_e2e.InitParallel(t) + cfg := e2esys.RegolithSystemConfig(t, test.regolithTime) ctx, cancel := context.WithTimeout(context.Background(), 60*time.Second) defer cancel() @@ -394,9 +393,8 @@ func TestPreregolith(t *testing.T) { }) t.Run("AllowSystemTx_"+test.name, func(t *testing.T) { - InitParallel(t) - cfg := DefaultSystemConfig(t) - cfg.DeployConfig.L2GenesisRegolithTimeOffset = test.regolithTime + op_e2e.InitParallel(t) + cfg := e2esys.RegolithSystemConfig(t, test.regolithTime) ctx, cancel := context.WithTimeout(context.Background(), 60*time.Second) defer cancel() @@ -420,10 +418,10 @@ func TestRegolith(t *testing.T) { tests := []struct { name string regolithTime hexutil.Uint64 - activateRegolith func(ctx context.Context, opGeth *OpGeth) + activateRegolith func(ctx context.Context, t *testing.T, opGeth *OpGeth) }{ - {name: "ActivateAtGenesis", regolithTime: 0, activateRegolith: func(ctx context.Context, opGeth *OpGeth) {}}, - {name: "ActivateAfterGenesis", regolithTime: 2, activateRegolith: func(ctx context.Context, opGeth *OpGeth) { + {name: "ActivateAtGenesis", regolithTime: 0, activateRegolith: func(ctx context.Context, t *testing.T, opGeth *OpGeth) {}}, + {name: "ActivateAfterGenesis", regolithTime: 2, activateRegolith: func(ctx context.Context, t *testing.T, opGeth *OpGeth) { _, err := opGeth.AddL2Block(ctx) require.NoError(t, err) }}, @@ -431,11 +429,10 @@ func TestRegolith(t *testing.T) { for _, test := range tests { test := test t.Run("GasUsedIsAccurate_"+test.name, func(t *testing.T) { - InitParallel(t) + op_e2e.InitParallel(t) // Setup an L2 EE and create a client connection to the engine. // We also need to setup a L1 Genesis to create the rollup genesis. - cfg := DefaultSystemConfig(t) - cfg.DeployConfig.L2GenesisRegolithTimeOffset = &test.regolithTime + cfg := e2esys.RegolithSystemConfig(t, &test.regolithTime) ctx, cancel := context.WithTimeout(context.Background(), 60*time.Second) defer cancel() @@ -444,7 +441,7 @@ func TestRegolith(t *testing.T) { require.NoError(t, err) defer opGeth.Close() - test.activateRegolith(ctx, opGeth) + test.activateRegolith(ctx, t, opGeth) fromAddr := cfg.Secrets.Addresses().Alice @@ -483,11 +480,10 @@ func TestRegolith(t *testing.T) { }) t.Run("DepositNonceCorrect_"+test.name, func(t *testing.T) { - InitParallel(t) + op_e2e.InitParallel(t) // Setup an L2 EE and create a client connection to the engine. // We also need to setup a L1 Genesis to create the rollup genesis. - cfg := DefaultSystemConfig(t) - cfg.DeployConfig.L2GenesisRegolithTimeOffset = &test.regolithTime + cfg := e2esys.RegolithSystemConfig(t, &test.regolithTime) ctx, cancel := context.WithTimeout(context.Background(), 60*time.Second) defer cancel() @@ -496,7 +492,7 @@ func TestRegolith(t *testing.T) { require.NoError(t, err) defer opGeth.Close() - test.activateRegolith(ctx, opGeth) + test.activateRegolith(ctx, t, opGeth) fromAddr := cfg.Secrets.Addresses().Alice // Include a tx just to ensure Alice's nonce isn't 0 @@ -545,9 +541,8 @@ func TestRegolith(t *testing.T) { }) t.Run("ReturnUnusedGasToPool_"+test.name, func(t *testing.T) { - InitParallel(t) - cfg := DefaultSystemConfig(t) - cfg.DeployConfig.L2GenesisRegolithTimeOffset = &test.regolithTime + op_e2e.InitParallel(t) + cfg := e2esys.RegolithSystemConfig(t, &test.regolithTime) ctx, cancel := context.WithTimeout(context.Background(), 60*time.Second) defer cancel() @@ -556,7 +551,7 @@ func TestRegolith(t *testing.T) { require.NoError(t, err) defer opGeth.Close() - test.activateRegolith(ctx, opGeth) + test.activateRegolith(ctx, t, opGeth) fromAddr := cfg.Secrets.Addresses().Alice @@ -588,9 +583,8 @@ func TestRegolith(t *testing.T) { }) t.Run("RejectSystemTx_"+test.name, func(t *testing.T) { - InitParallel(t) - cfg := DefaultSystemConfig(t) - cfg.DeployConfig.L2GenesisRegolithTimeOffset = &test.regolithTime + op_e2e.InitParallel(t) + cfg := e2esys.RegolithSystemConfig(t, &test.regolithTime) ctx, cancel := context.WithTimeout(context.Background(), 60*time.Second) defer cancel() @@ -599,7 +593,7 @@ func TestRegolith(t *testing.T) { require.NoError(t, err) defer opGeth.Close() - test.activateRegolith(ctx, opGeth) + test.activateRegolith(ctx, t, opGeth) rollupCfg := rollup.Config{} systemTx, err := derive.L1InfoDeposit(&rollupCfg, opGeth.SystemConfig, 1, opGeth.L1Head, 0) @@ -611,7 +605,7 @@ func TestRegolith(t *testing.T) { }) t.Run("IncludeGasRefunds_"+test.name, func(t *testing.T) { - InitParallel(t) + op_e2e.InitParallel(t) // Simple constructor that is prefixed to the actual contract code // Results in the contract code being returned as the code for the new contract deployPrefixSize := byte(16) @@ -649,8 +643,7 @@ func TestRegolith(t *testing.T) { deployData := append(deployPrefix, sstoreContract...) - cfg := DefaultSystemConfig(t) - cfg.DeployConfig.L2GenesisRegolithTimeOffset = &test.regolithTime + cfg := e2esys.RegolithSystemConfig(t, &test.regolithTime) ctx, cancel := context.WithTimeout(context.Background(), 60*time.Second) defer cancel() @@ -659,7 +652,7 @@ func TestRegolith(t *testing.T) { require.NoError(t, err) defer opGeth.Close() - test.activateRegolith(ctx, opGeth) + test.activateRegolith(ctx, t, opGeth) fromAddr := cfg.Secrets.Addresses().Alice storeContractAddr := crypto.CreateAddress(fromAddr, 0) @@ -747,9 +740,8 @@ func TestPreCanyon(t *testing.T) { test := test t.Run(fmt.Sprintf("ReturnsNilWithdrawals_%s", test.name), func(t *testing.T) { - InitParallel(t) - cfg := DefaultSystemConfig(t) - cfg.DeployConfig.L2GenesisCanyonTimeOffset = test.canyonTime + op_e2e.InitParallel(t) + cfg := e2esys.CanyonSystemConfig(t, test.canyonTime) ctx, cancel := context.WithTimeout(context.Background(), 60*time.Second) defer cancel() @@ -768,9 +760,8 @@ func TestPreCanyon(t *testing.T) { }) t.Run(fmt.Sprintf("RejectPushZeroTx_%s", test.name), func(t *testing.T) { - InitParallel(t) - cfg := DefaultSystemConfig(t) - cfg.DeployConfig.L2GenesisCanyonTimeOffset = test.canyonTime + op_e2e.InitParallel(t) + cfg := e2esys.CanyonSystemConfig(t, test.canyonTime) ctx, cancel := context.WithTimeout(context.Background(), 60*time.Second) defer cancel() @@ -803,10 +794,10 @@ func TestCanyon(t *testing.T) { tests := []struct { name string canyonTime hexutil.Uint64 - activateCanyon func(ctx context.Context, opGeth *OpGeth) + activateCanyon func(ctx context.Context, t *testing.T, opGeth *OpGeth) }{ - {name: "ActivateAtGenesis", canyonTime: 0, activateCanyon: func(ctx context.Context, opGeth *OpGeth) {}}, - {name: "ActivateAfterGenesis", canyonTime: 2, activateCanyon: func(ctx context.Context, opGeth *OpGeth) { + {name: "ActivateAtGenesis", canyonTime: 0, activateCanyon: func(ctx context.Context, t *testing.T, opGeth *OpGeth) {}}, + {name: "ActivateAfterGenesis", canyonTime: 2, activateCanyon: func(ctx context.Context, t *testing.T, opGeth *OpGeth) { // Adding this block advances us to the fork time. _, err := opGeth.AddL2Block(ctx) require.NoError(t, err) @@ -815,12 +806,8 @@ func TestCanyon(t *testing.T) { for _, test := range tests { test := test t.Run(fmt.Sprintf("ReturnsEmptyWithdrawals_%s", test.name), func(t *testing.T) { - InitParallel(t) - cfg := DefaultSystemConfig(t) - s := hexutil.Uint64(0) - cfg.DeployConfig.L2GenesisRegolithTimeOffset = &s - cfg.DeployConfig.L2GenesisCanyonTimeOffset = &test.canyonTime - cfg.DeployConfig.L2GenesisEcotoneTimeOffset = nil + op_e2e.InitParallel(t) + cfg := e2esys.CanyonSystemConfig(t, &test.canyonTime) ctx, cancel := context.WithTimeout(context.Background(), 60*time.Second) defer cancel() @@ -829,7 +816,7 @@ func TestCanyon(t *testing.T) { require.NoError(t, err) defer opGeth.Close() - test.activateCanyon(ctx, opGeth) + test.activateCanyon(ctx, t, opGeth) b, err := opGeth.AddL2Block(ctx) require.NoError(t, err) @@ -841,10 +828,8 @@ func TestCanyon(t *testing.T) { }) t.Run(fmt.Sprintf("AcceptsPushZeroTxn_%s", test.name), func(t *testing.T) { - InitParallel(t) - cfg := DefaultSystemConfig(t) - cfg.DeployConfig.L2GenesisCanyonTimeOffset = &test.canyonTime - cfg.DeployConfig.L2GenesisEcotoneTimeOffset = nil + op_e2e.InitParallel(t) + cfg := e2esys.CanyonSystemConfig(t, &test.canyonTime) ctx, cancel := context.WithTimeout(context.Background(), 60*time.Second) defer cancel() @@ -853,6 +838,8 @@ func TestCanyon(t *testing.T) { require.NoError(t, err) defer opGeth.Close() + test.activateCanyon(ctx, t, opGeth) + pushZeroContractCreateTxn := types.NewTx(&types.DepositTx{ From: cfg.Secrets.Addresses().Alice, Value: big.NewInt(params.Ether), @@ -887,9 +874,8 @@ func TestPreEcotone(t *testing.T) { test := test t.Run(fmt.Sprintf("NilParentBeaconRoot_%s", test.name), func(t *testing.T) { - InitParallel(t) - cfg := DefaultSystemConfig(t) - cfg.DeployConfig.L2GenesisCanyonTimeOffset = test.ecotoneTime + op_e2e.InitParallel(t) + cfg := e2esys.EcotoneSystemConfig(t, test.ecotoneTime) ctx, cancel := context.WithTimeout(context.Background(), 60*time.Second) defer cancel() @@ -907,10 +893,9 @@ func TestPreEcotone(t *testing.T) { assert.Nil(t, l2Block.Header().ParentBeaconRoot) }) - t.Run(fmt.Sprintf("RejectTstoreTxn%s", test.name), func(t *testing.T) { - InitParallel(t) - cfg := DefaultSystemConfig(t) - cfg.DeployConfig.L2GenesisCanyonTimeOffset = test.ecotoneTime + t.Run(fmt.Sprintf("RejectTstoreTxn_%s", test.name), func(t *testing.T) { + op_e2e.InitParallel(t) + cfg := e2esys.EcotoneSystemConfig(t, test.ecotoneTime) ctx, cancel := context.WithTimeout(context.Background(), 60*time.Second) defer cancel() @@ -945,10 +930,10 @@ func TestEcotone(t *testing.T) { tests := []struct { name string ecotoneTime hexutil.Uint64 - activateEcotone func(ctx context.Context, opGeth *OpGeth) + activateEcotone func(ctx context.Context, t *testing.T, opGeth *OpGeth) }{ - {name: "ActivateAtGenesis", ecotoneTime: 0, activateEcotone: func(ctx context.Context, opGeth *OpGeth) {}}, - {name: "ActivateAfterGenesis", ecotoneTime: 2, activateEcotone: func(ctx context.Context, opGeth *OpGeth) { + {name: "ActivateAtGenesis", ecotoneTime: 0, activateEcotone: func(ctx context.Context, t *testing.T, opGeth *OpGeth) {}}, + {name: "ActivateAfterGenesis", ecotoneTime: 2, activateEcotone: func(ctx context.Context, t *testing.T, opGeth *OpGeth) { // Adding this block advances us to the fork time. _, err := opGeth.AddL2Block(ctx) require.NoError(t, err) @@ -957,12 +942,8 @@ func TestEcotone(t *testing.T) { for _, test := range tests { test := test t.Run(fmt.Sprintf("HashParentBeaconBlockRoot_%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 = &test.ecotoneTime + op_e2e.InitParallel(t) + cfg := e2esys.EcotoneSystemConfig(t, &test.ecotoneTime) ctx, cancel := context.WithTimeout(context.Background(), 60*time.Second) defer cancel() @@ -971,7 +952,7 @@ func TestEcotone(t *testing.T) { require.NoError(t, err) defer opGeth.Close() - test.activateEcotone(ctx, opGeth) + test.activateEcotone(ctx, t, opGeth) b, err := opGeth.AddL2Block(ctx) require.NoError(t, err) @@ -984,13 +965,9 @@ func TestEcotone(t *testing.T) { assert.Equal(t, l2Block.Header().ParentBeaconRoot, opGeth.L1Head.ParentBeaconRoot()) }) - t.Run(fmt.Sprintf("TstoreTxn%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 = &test.ecotoneTime + t.Run(fmt.Sprintf("TstoreTxn_%s", test.name), func(t *testing.T) { + op_e2e.InitParallel(t) + cfg := e2esys.EcotoneSystemConfig(t, &test.ecotoneTime) ctx, cancel := context.WithTimeout(context.Background(), 60*time.Second) defer cancel() @@ -999,6 +976,8 @@ func TestEcotone(t *testing.T) { require.NoError(t, err) defer opGeth.Close() + test.activateEcotone(ctx, t, opGeth) + tstoreTxn := types.NewTx(&types.DepositTx{ From: cfg.Secrets.Addresses().Alice, Value: big.NewInt(params.Ether), @@ -1027,8 +1006,8 @@ func TestEcotone(t *testing.T) { func TestSoulGasToken(t *testing.T) { t.Run("no SoulGasToken", func(t *testing.T) { - InitParallel(t) - cfg := DefaultSystemConfigForSoulGasToken(t, true, true) + op_e2e.InitParallel(t) + cfg := e2esys.DefaultSystemConfigForSoulGasToken(t, true, true) ctx, cancel := context.WithTimeout(context.Background(), 60*time.Second) defer cancel() @@ -1060,8 +1039,8 @@ func TestSoulGasToken(t *testing.T) { require.True(t, balanceBefore.Cmp(balanceAfter) > 0) }) t.Run("have SoulGasToken but not enough", func(t *testing.T) { - InitParallel(t) - cfg := DefaultSystemConfigForSoulGasToken(t, true, true) + op_e2e.InitParallel(t) + cfg := e2esys.DefaultSystemConfigForSoulGasToken(t, true, true) ctx, cancel := context.WithTimeout(context.Background(), 60*time.Second) defer cancel() @@ -1113,8 +1092,8 @@ func TestSoulGasToken(t *testing.T) { require.True(t, balanceAfter.Cmp(balanceBefore) < 0) }) t.Run("have SoulGasToken and enough", func(t *testing.T) { - InitParallel(t) - cfg := DefaultSystemConfigForSoulGasToken(t, true, true) + op_e2e.InitParallel(t) + cfg := e2esys.DefaultSystemConfigForSoulGasToken(t, true, true) ctx, cancel := context.WithTimeout(context.Background(), 60*time.Second) defer cancel() @@ -1180,13 +1159,8 @@ func TestPreFjord(t *testing.T) { 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 + op_e2e.InitParallel(t) + cfg := e2esys.FjordSystemConfig(t, test.fjordTime) ctx, cancel := context.WithTimeout(context.Background(), 60*time.Second) defer cancel() @@ -1220,10 +1194,10 @@ func TestFjord(t *testing.T) { tests := []struct { name string fjordTime hexutil.Uint64 - activateFjord func(ctx context.Context, opGeth *OpGeth) + activateFjord func(ctx context.Context, t *testing.T, opGeth *OpGeth) }{ - {name: "ActivateAtGenesis", fjordTime: 0, activateFjord: func(ctx context.Context, opGeth *OpGeth) {}}, - {name: "ActivateAfterGenesis", fjordTime: 2, activateFjord: func(ctx context.Context, opGeth *OpGeth) { + {name: "ActivateAtGenesis", fjordTime: 0, activateFjord: func(ctx context.Context, t *testing.T, opGeth *OpGeth) {}}, + {name: "ActivateAfterGenesis", fjordTime: 2, activateFjord: func(ctx context.Context, t *testing.T, opGeth *OpGeth) { // Adding this block advances us to the fork time. _, err := opGeth.AddL2Block(ctx) require.NoError(t, err) @@ -1233,13 +1207,8 @@ func TestFjord(t *testing.T) { 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 + op_e2e.InitParallel(t) + cfg := e2esys.FjordSystemConfig(t, &test.fjordTime) ctx, cancel := context.WithTimeout(context.Background(), 60*time.Second) defer cancel() @@ -1248,7 +1217,7 @@ func TestFjord(t *testing.T) { require.NoError(t, err) defer opGeth.Close() - test.activateFjord(ctx, opGeth) + test.activateFjord(ctx, t, opGeth) // valid request returns one response, err := opGeth.L2Client.CallContract(ctx, ethereum.CallMsg{ diff --git a/op-e2e/sequencer_failover_test.go b/op-e2e/sequencer_failover_test.go deleted file mode 100644 index 6d98dc2af973..000000000000 --- a/op-e2e/sequencer_failover_test.go +++ /dev/null @@ -1,174 +0,0 @@ -package op_e2e - -import ( - "context" - "sort" - "testing" - - "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) { - _, conductors, cleanup := setupSequencerFailoverTest(t) - defer cleanup() - - require.Equal(t, 3, len(conductors), "Expected 3 conductors") - for _, con := range conductors { - require.NotNil(t, con, "Expected conductor to be non-nil") - } -} - -// [Category: conductor rpc] -// In this test, we test all rpcs exposed by conductor. -func TestSequencerFailover_ConductorRPC(t *testing.T) { - ctx := context.Background() - sys, conductors, cleanup := setupSequencerFailoverTest(t) - defer cleanup() - - // SequencerHealthy, Leader, AddServerAsVoter are used in setup already. - - // Test ClusterMembership - t.Log("Testing ClusterMembership") - c1 := conductors[Sequencer1Name] - c2 := conductors[Sequencer2Name] - c3 := conductors[Sequencer3Name] - membership, err := c1.client.ClusterMembership(ctx) - require.NoError(t, err) - require.Equal(t, 3, len(membership), "Expected 3 members in cluster") - ids := make([]string, 0) - for _, member := range membership { - ids = append(ids, member.ID) - require.Equal(t, consensus.Voter, member.Suffrage, "Expected all members to be voters") - } - sort.Strings(ids) - require.Equal(t, []string{Sequencer1Name, Sequencer2Name, Sequencer3Name}, ids, "Expected all sequencers to be in cluster") - - // Test Active & Pause & Resume - t.Log("Testing Active & Pause & Resume") - active, err := c1.client.Active(ctx) - require.NoError(t, err) - require.True(t, active, "Expected conductor to be active") - - err = c1.client.Pause(ctx) - require.NoError(t, err) - active, err = c1.client.Active(ctx) - require.NoError(t, err) - require.False(t, active, "Expected conductor to be paused") - - err = c1.client.Resume(ctx) - require.NoError(t, err) - active, err = c1.client.Active(ctx) - require.NoError(t, err) - require.True(t, active, "Expected conductor to be active") - - t.Log("Testing LeaderWithID") - leader1, err := c1.client.LeaderWithID(ctx) - require.NoError(t, err) - leader2, err := c2.client.LeaderWithID(ctx) - require.NoError(t, err) - leader3, err := c3.client.LeaderWithID(ctx) - require.NoError(t, err) - require.Equal(t, leader1.ID, leader2.ID, "Expected leader ID to be the same") - require.Equal(t, leader1.ID, leader3.ID, "Expected leader ID to be the same") - - t.Log("Testing TransferLeader") - lid, leader := findLeader(t, conductors) - err = leader.client.TransferLeader(ctx) - require.NoError(t, err, "Expected leader to transfer leadership to another node") - _ = waitForLeadershipChange(t, leader, lid, conductors, sys) - - // old leader now became follower, we're trying to transfer leadership directly back to it. - t.Log("Testing TransferLeaderToServer") - fid, follower := lid, leader - lid, leader = findLeader(t, conductors) - err = leader.client.TransferLeaderToServer(ctx, fid, follower.ConsensusEndpoint()) - require.NoError(t, err, "Expected leader to transfer leadership to follower") - newID := waitForLeadershipChange(t, leader, lid, conductors, sys) - require.Equal(t, fid, newID, "Expected leader to transfer to %s", fid) - - leader = follower - - // 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, 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") - membership, err = leader.client.ClusterMembership(ctx) - require.NoError(t, err) - require.Equal(t, 4, len(membership), "Expected 4 members in cluster") - require.Equal(t, consensus.Nonvoter, membership[3].Suffrage, "Expected last member to be non-voter") - - t.Log("Testing RemoveServer, call remove on follower, expected to fail") - lid, leader = findLeader(t, conductors) - fid, follower = findFollower(t, conductors) - err = follower.client.RemoveServer(ctx, lid) - require.ErrorContains(t, err, "node is not the leader", "Expected follower to fail to remove leader") - membership, err = c1.client.ClusterMembership(ctx) - require.NoError(t, err) - require.Equal(t, 4, len(membership), "Expected 4 members in cluster") - - t.Log("Testing RemoveServer, call remove on leader, expect non-voter to be removed") - err = leader.client.RemoveServer(ctx, VerifierName) - require.NoError(t, err, "Expected leader to remove non-voter") - membership, err = c1.client.ClusterMembership(ctx) - require.NoError(t, err) - require.Equal(t, 3, len(membership), "Expected 2 members in cluster after removal") - require.NotContains(t, membership, VerifierName, "Expected follower to be removed from cluster") - - t.Log("Testing RemoveServer, call remove on leader, expect voter to be removed") - err = leader.client.RemoveServer(ctx, fid) - require.NoError(t, err, "Expected leader to remove follower") - membership, err = c1.client.ClusterMembership(ctx) - require.NoError(t, err) - require.Equal(t, 2, len(membership), "Expected 2 members in cluster after removal") - require.NotContains(t, membership, fid, "Expected follower to be removed from cluster") -} - -// [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, cleanup := setupSequencerFailoverTest(t) - defer cleanup() - - ctx := context.Background() - leaderId, leader := findLeader(t, conductors) - err := sys.RollupNodes[leaderId].Stop(ctx) // Stop the current leader sequencer - require.NoError(t, err) - - // The leadership change should occur with no errors - newID := waitForLeadershipChange(t, leader, leaderId, conductors, sys) - require.NotEqual(t, leaderId, newID, "Expected leader to change") - - // Confirm the new leader is different from the old leader - newLeaderId, _ := findLeader(t, conductors) - require.NotEqual(t, leaderId, newLeaderId, "Expected leader to change") - - // Check that the sequencer is healthy - require.True(t, healthy(t, ctx, conductors[newLeaderId])) - - // Check if the new leader is sequencing - active, err := sys.RollupClient(newLeaderId).SequencerActive(ctx) - require.NoError(t, err) - require.True(t, active, "Expected new leader to be sequencing") -} diff --git a/op-e2e/setup.go b/op-e2e/setup.go deleted file mode 100644 index f3f826136b70..000000000000 --- a/op-e2e/setup.go +++ /dev/null @@ -1,984 +0,0 @@ -package op_e2e - -import ( - "context" - "crypto/ecdsa" - "crypto/rand" - "errors" - "fmt" - "math/big" - "net" - "os" - "path" - "sort" - "strings" - "sync/atomic" - "testing" - "time" - - "github.com/ethereum-optimism/optimism/op-e2e/e2eutils/batcher" - ds "github.com/ipfs/go-datastore" - dsSync "github.com/ipfs/go-datastore/sync" - ic "github.com/libp2p/go-libp2p/core/crypto" - "github.com/libp2p/go-libp2p/core/host" - "github.com/libp2p/go-libp2p/core/peer" - "github.com/libp2p/go-libp2p/core/peerstore" - "github.com/libp2p/go-libp2p/p2p/host/peerstore/pstoremem" - mocknet "github.com/libp2p/go-libp2p/p2p/net/mock" - ma "github.com/multiformats/go-multiaddr" - "github.com/stretchr/testify/require" - - "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" - "github.com/ethereum/go-ethereum/node" - "github.com/ethereum/go-ethereum/params" - "github.com/ethereum/go-ethereum/rpc" - - bss "github.com/ethereum-optimism/optimism/op-batcher/batcher" - batcherFlags "github.com/ethereum-optimism/optimism/op-batcher/flags" - "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" - "github.com/ethereum-optimism/optimism/op-e2e/e2eutils/fakebeacon" - "github.com/ethereum-optimism/optimism/op-e2e/e2eutils/geth" - "github.com/ethereum-optimism/optimism/op-node/chaincfg" - "github.com/ethereum-optimism/optimism/op-node/metrics" - rollupNode "github.com/ethereum-optimism/optimism/op-node/node" - "github.com/ethereum-optimism/optimism/op-node/p2p" - "github.com/ethereum-optimism/optimism/op-node/p2p/store" - "github.com/ethereum-optimism/optimism/op-node/rollup" - "github.com/ethereum-optimism/optimism/op-node/rollup/derive" - "github.com/ethereum-optimism/optimism/op-node/rollup/driver" - "github.com/ethereum-optimism/optimism/op-node/rollup/sync" - l2os "github.com/ethereum-optimism/optimism/op-proposer/proposer" - "github.com/ethereum-optimism/optimism/op-service/cliapp" - "github.com/ethereum-optimism/optimism/op-service/client" - "github.com/ethereum-optimism/optimism/op-service/clock" - "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" -) - -var testingJWTSecret = [32]byte{123} - -func newTxMgrConfig(l1Addr string, privKey *ecdsa.PrivateKey) txmgr.CLIConfig { - return txmgr.CLIConfig{ - L1RPCURL: l1Addr, - PrivateKey: hexPriv(privKey), - NumConfirmations: 1, - SafeAbortNonceTooLowCount: 3, - FeeLimitMultiplier: 5, - ResubmissionTimeout: 3 * time.Second, - ReceiptQueryInterval: 50 * time.Millisecond, - NetworkTimeout: 2 * time.Second, - TxNotInMempoolTimeout: 2 * time.Minute, - } -} - -func DefaultSystemConfigForSoulGasToken(t *testing.T, enable, isBackedByNative bool) SystemConfig { - config := DefaultSystemConfig(t) - config.UseSoulGasToken = enable - config.IsSoulBackedByNative = isBackedByNative - return config -} - -func DefaultSystemConfig(t testing.TB) SystemConfig { - config.ExternalL2TestParms.SkipIfNecessary(t) - - secrets, err := e2eutils.DefaultMnemonicConfig.Secrets() - require.NoError(t, err) - deployConfig := config.DeployConfig.Copy() - deployConfig.L1GenesisBlockTimestamp = hexutil.Uint64(time.Now().Unix()) - e2eutils.ApplyDeployConfigForks(deployConfig) - require.NoError(t, deployConfig.Check(), "Deploy config is invalid, do you need to run make devnet-allocs?") - l1Deployments := config.L1Deployments.Copy() - require.NoError(t, l1Deployments.Check(deployConfig)) - - require.Equal(t, secrets.Addresses().Batcher, deployConfig.BatchSenderAddress) - require.Equal(t, secrets.Addresses().SequencerP2P, deployConfig.P2PSequencerAddress) - require.Equal(t, secrets.Addresses().Proposer, deployConfig.L2OutputOracleProposer) - - // Tests depend on premine being filled with secrets addresses - premine := make(map[common.Address]*big.Int) - for _, addr := range secrets.Addresses().All() { - premine[addr] = new(big.Int).Mul(big.NewInt(1000), big.NewInt(params.Ether)) - } - - return SystemConfig{ - Secrets: secrets, - Premine: premine, - DeployConfig: deployConfig, - L1Deployments: config.L1Deployments, - L1InfoPredeployAddress: predeploys.L1BlockAddr, - JWTFilePath: writeDefaultJWT(t), - JWTSecret: testingJWTSecret, - BlobsPath: t.TempDir(), - Nodes: map[string]*rollupNode.Config{ - "sequencer": { - Driver: driver.Config{ - VerifierConfDepth: 0, - SequencerConfDepth: 0, - SequencerEnabled: true, - }, - // Submitter PrivKey is set in system start for rollup nodes where sequencer = true - RPC: rollupNode.RPCConfig{ - ListenAddr: "127.0.0.1", - ListenPort: 0, - EnableAdmin: true, - }, - L1EpochPollInterval: time.Second * 2, - RuntimeConfigReloadInterval: time.Minute * 10, - ConfigPersistence: &rollupNode.DisabledConfigPersistence{}, - Sync: sync.Config{SyncMode: sync.CLSync}, - }, - "verifier": { - Driver: driver.Config{ - VerifierConfDepth: 0, - SequencerConfDepth: 0, - SequencerEnabled: false, - }, - L1EpochPollInterval: time.Second * 4, - RuntimeConfigReloadInterval: time.Minute * 10, - ConfigPersistence: &rollupNode.DisabledConfigPersistence{}, - Sync: sync.Config{SyncMode: sync.CLSync}, - }, - }, - Loggers: map[string]log.Logger{ - "verifier": testlog.Logger(t, log.LevelInfo).New("role", "verifier"), - "sequencer": testlog.Logger(t, log.LevelInfo).New("role", "sequencer"), - "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, - DataAvailabilityType: batcherFlags.CalldataType, - MaxPendingTransactions: 1, - BatcherTargetNumFrames: 1, - } -} - -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 { - t.Fatalf("failed to prepare jwt file for geth: %v", err) - } - return jwtPath -} - -type DepositContractConfig struct { - L2Oracle common.Address - FinalizationPeriod *big.Int -} - -type SystemConfig struct { - Secrets *e2eutils.Secrets - L1InfoPredeployAddress common.Address - - DeployConfig *genesis.DeployConfig - L1Deployments *genesis.L1Deployments - - JWTFilePath string - JWTSecret [32]byte - - BlobsPath string - - Premine map[common.Address]*big.Int - Nodes map[string]*rollupNode.Config // Per node config. Don't use populate rollup.Config - Loggers map[string]log.Logger - GethOptions map[string][]geth.GethOption - ProposerLogger log.Logger - BatcherLogger log.Logger - - ExternalL2Shim string - - // map of outbound connections to other nodes. Node names prefixed with "~" are unconnected but linked. - // A nil map disables P2P completely. - // Any node name not in the topology will not have p2p enabled. - P2PTopology map[string][]string - - // Enables req-resp sync in the P2P nodes - P2PReqRespSync bool - - // If the proposer can make proposals for L2 blocks derived from L1 blocks which are not finalized on L1 yet. - NonFinalizedProposals bool - - // Explicitly disable batcher, for tests that rely on unsafe L2 payloads - DisableBatcher bool - - // Configure data-availability type that is used by the batcher. - DataAvailabilityType batcherFlags.DataAvailabilityType - - // 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 int - - // whether to actually use BatcherMaxL1TxSizeBytes for blobs, insteaf of max blob size - BatcherUseMaxTxSizeForBlobs bool - - // SupportL1TimeTravel determines if the L1 node supports quickly skipping forward in time - SupportL1TimeTravel bool - - // MaxPendingTransactions determines how many transactions the batcher will try to send - // concurrently. 0 means unlimited. - MaxPendingTransactions uint64 - - UseSoulGasToken bool - IsSoulBackedByNative bool -} - -type GethInstance struct { - Backend *geth_eth.Ethereum - Node *node.Node -} - -func (gi *GethInstance) HTTPEndpoint() string { - return gi.Node.HTTPEndpoint() -} - -func (gi *GethInstance) WSEndpoint() string { - return gi.Node.WSEndpoint() -} - -func (gi *GethInstance) WSAuthEndpoint() string { - return gi.Node.WSAuthEndpoint() -} - -func (gi *GethInstance) HTTPAuthEndpoint() string { - return gi.Node.HTTPAuthEndpoint() -} - -func (gi *GethInstance) Close() error { - return gi.Node.Close() -} - -// EthInstance is either an in process Geth or external process exposing its -// endpoints over the network -type EthInstance interface { - HTTPEndpoint() string - WSEndpoint() string - HTTPAuthEndpoint() string - WSAuthEndpoint() string - Close() error -} - -type System struct { - Cfg SystemConfig - - RollupConfig *rollup.Config - - L2GenesisCfg *core.Genesis - - // Connections to running nodes - EthInstances map[string]EthInstance - Clients map[string]*ethclient.Client - RawClients map[string]*rpc.Client - RollupNodes map[string]*rollupNode.OpNode - L2OutputSubmitter *l2os.ProposerService - BatchSubmitter *bss.BatcherService - Mocknet mocknet.Mocknet - - L1BeaconAPIAddr string - - // TimeTravelClock is nil unless SystemConfig.SupportL1TimeTravel was set to true - // It provides access to the clock instance used by the L1 node. Calling TimeTravelClock.AdvanceBy - // allows tests to quickly time travel L1 into the future. - // Note that this time travel may occur in a single block, creating a very large difference in the Time - // on sequential blocks. - TimeTravelClock *clock.AdvancingClock - - t *testing.T - closed atomic.Bool - - // rollupClients caches the lazily created RollupClient instances so they can be reused and closed - rollupClients map[string]*sources.RollupClient -} - -// AdvanceTime advances the system clock by the given duration. -// If the [System.TimeTravelClock] is nil, this is a no-op. -func (sys *System) AdvanceTime(d time.Duration) { - if sys.TimeTravelClock != nil { - sys.TimeTravelClock.AdvanceTime(d) - } -} - -func (sys *System) L1BeaconEndpoint() string { - return sys.L1BeaconAPIAddr -} - -func (sys *System) L1BeaconHTTPClient() *sources.BeaconHTTPClient { - logger := testlog.Logger(sys.t, log.LevelInfo).New("component", "beaconClient") - return sources.NewBeaconHTTPClient(client.NewBasicHTTPClient(sys.L1BeaconEndpoint(), logger)) -} - -func (sys *System) NodeEndpoint(name string) string { - return selectEndpoint(sys.EthInstances[name]) -} - -func (sys *System) NodeClient(name string) *ethclient.Client { - return sys.Clients[name] -} - -func (sys *System) RollupEndpoint(name string) string { - return sys.RollupNodes[name].HTTPEndpoint() -} - -func (sys *System) RollupClient(name string) *sources.RollupClient { - client, ok := sys.rollupClients[name] - if ok { - return client - } - logger := testlog.Logger(sys.t, log.LevelInfo).New("rollupClient", name) - endpoint := sys.RollupEndpoint(name) - client, err := dial.DialRollupClientWithTimeout(context.Background(), 30*time.Second, logger, endpoint) - require.NoErrorf(sys.t, err, "Failed to dial rollup client %v", name) - sys.rollupClients[name] = client - return client -} - -func (sys *System) L1Deployments() *genesis.L1Deployments { - return sys.Cfg.L1Deployments -} - -func (sys *System) RollupCfg() *rollup.Config { - return sys.RollupConfig -} - -func (sys *System) L2Genesis() *core.Genesis { - return sys.L2GenesisCfg -} - -func (sys *System) L1Slot(l1Timestamp uint64) uint64 { - return (l1Timestamp - uint64(sys.Cfg.DeployConfig.L1GenesisBlockTimestamp)) / - sys.Cfg.DeployConfig.L1BlockTime -} - -func (sys *System) Close() { - if !sys.closed.CompareAndSwap(false, true) { - // Already closed. - return - } - postCtx, postCancel := context.WithCancel(context.Background()) - postCancel() // immediate shutdown, no allowance for idling - - var combinedErr error - if sys.L2OutputSubmitter != nil { - if err := sys.L2OutputSubmitter.Kill(); err != nil && !errors.Is(err, l2os.ErrAlreadyStopped) { - combinedErr = errors.Join(combinedErr, fmt.Errorf("stop L2OutputSubmitter: %w", err)) - } - } - if sys.BatchSubmitter != nil { - if err := sys.BatchSubmitter.Kill(); err != nil && !errors.Is(err, bss.ErrAlreadyStopped) { - combinedErr = errors.Join(combinedErr, fmt.Errorf("stop BatchSubmitter: %w", err)) - } - } - - for name, node := range sys.RollupNodes { - if err := node.Stop(postCtx); err != nil && !errors.Is(err, rollupNode.ErrAlreadyClosed) { - combinedErr = errors.Join(combinedErr, fmt.Errorf("stop rollup node %v: %w", name, err)) - } - } - for name, ei := range sys.EthInstances { - if err := ei.Close(); err != nil && !errors.Is(err, node.ErrNodeStopped) { - combinedErr = errors.Join(combinedErr, fmt.Errorf("stop EthInstance %v: %w", name, err)) - } - } - for _, client := range sys.rollupClients { - client.Close() - } - if sys.Mocknet != nil { - if err := sys.Mocknet.Close(); err != nil { - combinedErr = errors.Join(combinedErr, fmt.Errorf("stop Mocknet: %w", err)) - } - } - require.NoError(sys.t, combinedErr, "Failed to stop system") -} - -type systemConfigHook func(sCfg *SystemConfig, s *System) - -type SystemConfigOption struct { - key string - role string - action systemConfigHook -} - -type SystemConfigOptions struct { - opts map[string]systemConfigHook -} - -func NewSystemConfigOptions(_opts []SystemConfigOption) (SystemConfigOptions, error) { - opts := make(map[string]systemConfigHook) - for _, opt := range _opts { - if _, ok := opts[opt.key+":"+opt.role]; ok { - return SystemConfigOptions{}, fmt.Errorf("duplicate option for key %s and role %s", opt.key, opt.role) - } - opts[opt.key+":"+opt.role] = opt.action - } - - return SystemConfigOptions{ - opts: opts, - }, nil -} - -func (s *SystemConfigOptions) Get(key, role string) (systemConfigHook, bool) { - v, ok := s.opts[key+":"+role] - return v, ok -} - -func (cfg SystemConfig) Start(t *testing.T, _opts ...SystemConfigOption) (*System, error) { - opts, err := NewSystemConfigOptions(_opts) - if err != nil { - return nil, err - } - - sys := &System{ - t: t, - Cfg: cfg, - EthInstances: make(map[string]EthInstance), - Clients: make(map[string]*ethclient.Client), - RawClients: make(map[string]*rpc.Client), - RollupNodes: make(map[string]*rollupNode.OpNode), - rollupClients: make(map[string]*sources.RollupClient), - } - // Automatically stop the system at the end of the test - t.Cleanup(sys.Close) - - c := clock.SystemClock - if cfg.SupportL1TimeTravel { - sys.TimeTravelClock = clock.NewAdvancingClock(100 * time.Millisecond) - c = sys.TimeTravelClock - } - - if err := cfg.DeployConfig.Check(); err != nil { - return nil, err - } - - l1Genesis, err := genesis.BuildL1DeveloperGenesis(cfg.DeployConfig, config.L1Allocs, config.L1Deployments) - if err != nil { - return nil, err - } - - for addr, amount := range cfg.Premine { - if existing, ok := l1Genesis.Alloc[addr]; ok { - l1Genesis.Alloc[addr] = types.Account{ - Code: existing.Code, - Storage: existing.Storage, - Balance: amount, - Nonce: existing.Nonce, - } - } else { - l1Genesis.Alloc[addr] = types.Account{ - Balance: amount, - Nonce: 0, - } - } - } - - l1Block := l1Genesis.ToBlock() - 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] = types.Account{ - Code: existing.Code, - Storage: existing.Storage, - Balance: amount, - Nonce: existing.Nonce, - } - } else { - l2Genesis.Alloc[addr] = types.Account{ - Balance: amount, - Nonce: 0, - } - } - } - - makeRollupConfig := func() rollup.Config { - return rollup.Config{ - Genesis: rollup.Genesis{ - L1: eth.BlockID{ - Hash: l1Block.Hash(), - Number: 0, - }, - L2: eth.BlockID{ - Hash: l2Genesis.ToBlock().Hash(), - Number: 0, - }, - L2Time: uint64(cfg.DeployConfig.L1GenesisBlockTimestamp), - SystemConfig: e2eutils.SystemConfigFromDeployConfig(cfg.DeployConfig), - }, - BlockTime: cfg.DeployConfig.L2BlockTime, - MaxSequencerDrift: cfg.DeployConfig.MaxSequencerDrift, - SeqWindowSize: cfg.DeployConfig.SequencerWindowSize, - ChannelTimeout: cfg.DeployConfig.ChannelTimeout, - L1ChainID: cfg.L1ChainIDBig(), - L2ChainID: cfg.L2ChainIDBig(), - BatchInboxAddress: cfg.DeployConfig.BatchInboxAddress, - DepositContractAddress: cfg.DeployConfig.OptimismPortalProxy, - L1SystemConfigAddress: cfg.DeployConfig.SystemConfigProxy, - RegolithTime: cfg.DeployConfig.RegolithTime(uint64(cfg.DeployConfig.L1GenesisBlockTimestamp)), - CanyonTime: cfg.DeployConfig.CanyonTime(uint64(cfg.DeployConfig.L1GenesisBlockTimestamp)), - DeltaTime: cfg.DeployConfig.DeltaTime(uint64(cfg.DeployConfig.L1GenesisBlockTimestamp)), - EcotoneTime: cfg.DeployConfig.EcotoneTime(uint64(cfg.DeployConfig.L1GenesisBlockTimestamp)), - FjordTime: cfg.DeployConfig.FjordTime(uint64(cfg.DeployConfig.L1GenesisBlockTimestamp)), - InteropTime: cfg.DeployConfig.InteropTime(uint64(cfg.DeployConfig.L1GenesisBlockTimestamp)), - ProtocolVersionsAddress: cfg.L1Deployments.ProtocolVersionsProxy, - } - } - defaultConfig := makeRollupConfig() - if err := defaultConfig.Check(); err != nil { - return nil, err - } - sys.RollupConfig = &defaultConfig - - // Create a fake Beacon node to hold on to blobs created by the L1 miner, and to serve them to L2 - bcn := fakebeacon.NewBeacon(testlog.Logger(t, log.LevelInfo).New("role", "l1_cl"), - path.Join(cfg.BlobsPath, "l1_cl"), l1Genesis.Timestamp, cfg.DeployConfig.L1BlockTime) - t.Cleanup(func() { - _ = bcn.Close() - }) - require.NoError(t, bcn.Start("127.0.0.1:0")) - beaconApiAddr := bcn.BeaconAddr() - require.NotEmpty(t, beaconApiAddr, "beacon API listener must be up") - sys.L1BeaconAPIAddr = beaconApiAddr - - // Initialize nodes - l1Node, l1Backend, err := geth.InitL1(cfg.DeployConfig.L1ChainID, cfg.DeployConfig.L1BlockTime, l1Genesis, c, - path.Join(cfg.BlobsPath, "l1_el"), bcn, cfg.GethOptions["l1"]...) - if err != nil { - return nil, err - } - sys.EthInstances["l1"] = &GethInstance{ - Backend: l1Backend, - Node: l1Node, - } - err = l1Node.Start() - if err != nil { - return nil, err - } - - for name := range cfg.Nodes { - var ethClient EthInstance - if cfg.ExternalL2Shim == "" { - node, backend, err := geth.InitL2(name, big.NewInt(int64(cfg.DeployConfig.L2ChainID)), l2Genesis, cfg.JWTFilePath, cfg.GethOptions[name]...) - if err != nil { - return nil, err - } - gethInst := &GethInstance{ - Backend: backend, - Node: node, - } - err = gethInst.Node.Start() - if err != nil { - return nil, err - } - ethClient = gethInst - } else { - if len(cfg.GethOptions[name]) > 0 { - t.Skip("External L2 nodes do not support configuration through GethOptions") - } - ethClient = (&ExternalRunner{ - Name: name, - BinPath: cfg.ExternalL2Shim, - Genesis: l2Genesis, - JWTPath: cfg.JWTFilePath, - }).Run(t) - } - sys.EthInstances[name] = ethClient - } - - // Configure connections to L1 and L2 for rollup nodes. - // TODO: refactor testing to allow use of in-process rpc connections instead - // of only websockets (which are required for external eth client tests). - for name, nodeCfg := range cfg.Nodes { - configureL1(nodeCfg, sys.EthInstances["l1"]) - configureL2(nodeCfg, sys.EthInstances[name], cfg.JWTSecret) - if sys.RollupConfig.EcotoneTime != nil { - nodeCfg.Beacon = &rollupNode.L1BeaconEndpointConfig{BeaconAddr: sys.L1BeaconAPIAddr} - } - } - - // Geth Clients - ctx, cancel := context.WithTimeout(context.Background(), 2*time.Second) - defer cancel() - l1Srv, err := l1Node.RPCHandler() - if err != nil { - return nil, err - } - rawL1Client := rpc.DialInProc(l1Srv) - l1Client := ethclient.NewClient(rawL1Client) - sys.Clients["l1"] = l1Client - sys.RawClients["l1"] = rawL1Client - for name, ethInst := range sys.EthInstances { - rawClient, err := rpc.DialContext(ctx, ethInst.WSEndpoint()) - if err != nil { - return nil, err - } - client := ethclient.NewClient(rawClient) - sys.RawClients[name] = rawClient - sys.Clients[name] = client - } - - _, err = geth.WaitForBlock(big.NewInt(2), l1Client, 6*time.Second*time.Duration(cfg.DeployConfig.L1BlockTime)) - if err != nil { - return nil, fmt.Errorf("waiting for blocks: %w", err) - } - - sys.Mocknet = mocknet.New() - - p2pNodes := make(map[string]*p2p.Prepared) - if cfg.P2PTopology != nil { - // create the peer if it doesn't exist yet. - initHostMaybe := func(name string) (*p2p.Prepared, error) { - if p, ok := p2pNodes[name]; ok { - return p, nil - } - h, err := sys.newMockNetPeer() - if err != nil { - return nil, fmt.Errorf("failed to init p2p host for node %s", name) - } - h.Network() - _, ok := cfg.Nodes[name] - if !ok { - return nil, fmt.Errorf("node %s from p2p topology not found in actual nodes map", name) - } - // TODO we can enable discv5 in the testnodes to test discovery of new peers. - // Would need to mock though, and the discv5 implementation does not provide nice mocks here. - p := &p2p.Prepared{ - HostP2P: h, - LocalNode: nil, - UDPv5: nil, - EnableReqRespSync: cfg.P2PReqRespSync, - } - p2pNodes[name] = p - return p, nil - } - for k, vs := range cfg.P2PTopology { - peerA, err := initHostMaybe(k) - if err != nil { - return nil, fmt.Errorf("failed to setup mocknet peer %s", k) - } - for _, v := range vs { - v = strings.TrimPrefix(v, "~") - peerB, err := initHostMaybe(v) - if err != nil { - return nil, fmt.Errorf("failed to setup mocknet peer %s (peer of %s)", v, k) - } - if _, err := sys.Mocknet.LinkPeers(peerA.HostP2P.ID(), peerB.HostP2P.ID()); err != nil { - return nil, fmt.Errorf("failed to setup mocknet link between %s and %s", k, v) - } - // connect the peers after starting the full rollup node - } - } - } - - // Don't log state snapshots in test output - snapLog := log.NewLogger(log.DiscardHandler()) - - // Rollup nodes - - // Ensure we are looping through the nodes in alphabetical order - ks := make([]string, 0, len(cfg.Nodes)) - for k := range cfg.Nodes { - ks = append(ks, k) - } - // Sort strings in ascending alphabetical order - sort.Strings(ks) - - for _, name := range ks { - nodeConfig := cfg.Nodes[name] - c := *nodeConfig // copy - c.Rollup = makeRollupConfig() - if err := c.LoadPersisted(cfg.Loggers[name]); err != nil { - return nil, err - } - - if p, ok := p2pNodes[name]; ok { - c.P2P = p - - if c.Driver.SequencerEnabled && c.P2PSigner == nil { - c.P2PSigner = &p2p.PreparedSigner{Signer: p2p.NewLocalSigner(cfg.Secrets.SequencerP2P)} - } - } - - c.Rollup.LogDescription(cfg.Loggers[name], chaincfg.L2ChainIDToNetworkDisplayName) - l := cfg.Loggers[name] - var cycle cliapp.Lifecycle - c.Cancel = func(errCause error) { - l.Warn("node requested early shutdown!", "err", errCause) - go func() { - postCtx, postCancel := context.WithCancel(context.Background()) - postCancel() // don't allow the stopping to continue for longer than needed - if err := cycle.Stop(postCtx); err != nil { - t.Error(err) - } - l.Warn("closed op-node!") - }() - } - node, err := rollupNode.New(context.Background(), &c, l, snapLog, "", metrics.NewMetrics("")) - if err != nil { - return nil, err - } - cycle = node - err = node.Start(context.Background()) - if err != nil { - return nil, err - } - sys.RollupNodes[name] = node - - if action, ok := opts.Get("afterRollupNodeStart", name); ok { - action(&cfg, sys) - } - } - - if cfg.P2PTopology != nil { - // We only set up the connections after starting the actual nodes, - // so GossipSub and other p2p protocols can be started before the connections go live. - // This way protocol negotiation happens correctly. - for k, vs := range cfg.P2PTopology { - peerA := p2pNodes[k] - for _, v := range vs { - unconnected := strings.HasPrefix(v, "~") - if unconnected { - v = v[1:] - } - if !unconnected { - peerB := p2pNodes[v] - if _, err := sys.Mocknet.ConnectPeers(peerA.HostP2P.ID(), peerB.HostP2P.ID()); err != nil { - return nil, fmt.Errorf("failed to setup mocknet connection between %s and %s", k, v) - } - } - } - } - } - - // Don't start batch submitter and proposer if there's no sequencer. - if sys.RollupNodes["sequencer"] == nil { - return sys, nil - } - - // L2Output Submitter - var proposerCLIConfig *l2os.CLIConfig - if e2eutils.UseFPAC() { - proposerCLIConfig = &l2os.CLIConfig{ - L1EthRpc: sys.EthInstances["l1"].WSEndpoint(), - RollupRpc: sys.RollupNodes["sequencer"].HTTPEndpoint(), - DGFAddress: config.L1Deployments.DisputeGameFactoryProxy.Hex(), - ProposalInterval: 6 * time.Second, - DisputeGameType: 0, - PollInterval: 50 * time.Millisecond, - TxMgrConfig: newTxMgrConfig(sys.EthInstances["l1"].WSEndpoint(), cfg.Secrets.Proposer), - AllowNonFinalized: cfg.NonFinalizedProposals, - LogConfig: oplog.CLIConfig{ - Level: log.LvlInfo, - Format: oplog.FormatText, - }, - } - } else { - proposerCLIConfig = &l2os.CLIConfig{ - L1EthRpc: sys.EthInstances["l1"].WSEndpoint(), - RollupRpc: sys.RollupNodes["sequencer"].HTTPEndpoint(), - L2OOAddress: config.L1Deployments.L2OutputOracleProxy.Hex(), - PollInterval: 50 * time.Millisecond, - TxMgrConfig: newTxMgrConfig(sys.EthInstances["l1"].WSEndpoint(), cfg.Secrets.Proposer), - AllowNonFinalized: cfg.NonFinalizedProposals, - LogConfig: oplog.CLIConfig{ - Level: log.LvlInfo, - Format: oplog.FormatText, - }, - } - } - proposer, err := l2os.ProposerServiceFromCLIConfig(context.Background(), "0.0.1", proposerCLIConfig, sys.Cfg.Loggers["proposer"]) - if err != nil { - return nil, fmt.Errorf("unable to setup l2 output submitter: %w", err) - } - if err := proposer.Start(context.Background()); err != nil { - return nil, fmt.Errorf("unable to start l2 output submitter: %w", err) - } - sys.L2OutputSubmitter = proposer - - var batchType uint = derive.SingularBatchType - if cfg.DeployConfig.L2GenesisDeltaTimeOffset != nil && *cfg.DeployConfig.L2GenesisDeltaTimeOffset == hexutil.Uint64(0) { - batchType = derive.SpanBatchType - } - // batcher defaults if unset - batcherMaxL1TxSizeBytes := cfg.BatcherMaxL1TxSizeBytes - if batcherMaxL1TxSizeBytes == 0 { - 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(), - RollupRpc: sys.RollupNodes["sequencer"].HTTPEndpoint(), - MaxPendingTransactions: cfg.MaxPendingTransactions, - MaxChannelDuration: 1, - MaxL1TxSize: batcherMaxL1TxSizeBytes, - TestUseMaxTxSizeForBlobs: cfg.BatcherUseMaxTxSizeForBlobs, - 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, - }, - 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"]) - if err != nil { - return nil, fmt.Errorf("failed to setup batch submitter: %w", err) - } - if err := batcher.Start(context.Background()); err != nil { - return nil, errors.Join(fmt.Errorf("failed to start batch submitter: %w", err), batcher.Stop(context.Background())) - } - sys.BatchSubmitter = batcher - - return sys, nil -} - -// IP6 range that gets blackholed (in case our traffic ever makes it out onto -// the internet). -var blackholeIP6 = net.ParseIP("100::") - -// mocknet doesn't allow us to add a peerstore without fully creating the peer ourselves -func (sys *System) newMockNetPeer() (host.Host, error) { - sk, _, err := ic.GenerateECDSAKeyPair(rand.Reader) - if err != nil { - return nil, err - } - id, err := peer.IDFromPrivateKey(sk) - if err != nil { - return nil, err - } - suffix := id - if len(id) > 8 { - suffix = id[len(id)-8:] - } - ip := append(net.IP{}, blackholeIP6...) - copy(ip[net.IPv6len-len(suffix):], suffix) - a, err := ma.NewMultiaddr(fmt.Sprintf("/ip6/%s/tcp/4242", ip)) - if err != nil { - return nil, fmt.Errorf("failed to create test multiaddr: %w", err) - } - p, err := peer.IDFromPublicKey(sk.GetPublic()) - if err != nil { - return nil, err - } - - ps, err := pstoremem.NewPeerstore() - if err != nil { - return nil, err - } - ps.AddAddr(p, a, peerstore.PermanentAddrTTL) - _ = ps.AddPrivKey(p, sk) - _ = ps.AddPubKey(p, sk.GetPublic()) - - ds := dsSync.MutexWrap(ds.NewMapDatastore()) - eps, err := store.NewExtendedPeerstore(context.Background(), log.Root(), clock.SystemClock, ps, ds, 24*time.Hour) - if err != nil { - return nil, err - } - return sys.Mocknet.AddPeerWithPeerstore(p, eps) -} - -func (sys *System) BatcherHelper() *batcher.Helper { - return batcher.NewHelper(sys.t, sys.Cfg.Secrets.Batcher, sys.RollupConfig, sys.NodeClient("l1")) -} - -func UseHTTP() bool { - return os.Getenv("OP_E2E_USE_HTTP") == "true" -} - -func selectEndpoint(node EthInstance) string { - if UseHTTP() { - log.Info("using HTTP client") - return node.HTTPEndpoint() - } - return node.WSEndpoint() -} - -func configureL1(rollupNodeCfg *rollupNode.Config, l1Node EthInstance) { - l1EndpointConfig := selectEndpoint(l1Node) - rollupNodeCfg.L1 = &rollupNode.L1EndpointConfig{ - L1NodeAddr: l1EndpointConfig, - L1TrustRPC: false, - L1RPCKind: sources.RPCKindStandard, - RateLimit: 0, - BatchSize: 20, - HttpPollInterval: time.Millisecond * 100, - MaxConcurrency: 10, - } -} - -type WSOrHTTPEndpoint interface { - WSAuthEndpoint() string - HTTPAuthEndpoint() string -} - -func configureL2(rollupNodeCfg *rollupNode.Config, l2Node WSOrHTTPEndpoint, jwtSecret [32]byte) { - l2EndpointConfig := l2Node.WSAuthEndpoint() - if UseHTTP() { - l2EndpointConfig = l2Node.HTTPAuthEndpoint() - } - - rollupNodeCfg.L2 = &rollupNode.L2EndpointConfig{ - L2EngineAddr: l2EndpointConfig, - L2EngineJWTSecret: jwtSecret, - } -} - -func (cfg SystemConfig) L1ChainIDBig() *big.Int { - return new(big.Int).SetUint64(cfg.DeployConfig.L1ChainID) -} - -func (cfg SystemConfig) L2ChainIDBig() *big.Int { - return new(big.Int).SetUint64(cfg.DeployConfig.L2ChainID) -} - -func hexPriv(in *ecdsa.PrivateKey) string { - b := e2eutils.EncodePrivKey(in) - return hexutil.Encode(b) -} diff --git a/op-e2e/system/altda/altda_test.go b/op-e2e/system/altda/altda_test.go new file mode 100644 index 000000000000..9a9546328c02 --- /dev/null +++ b/op-e2e/system/altda/altda_test.go @@ -0,0 +1,11 @@ +package altda + +import ( + "testing" + + op_e2e "github.com/ethereum-optimism/optimism/op-e2e" +) + +func TestMain(m *testing.M) { + op_e2e.RunMain(m) +} diff --git a/op-e2e/system/altda/concurrent_test.go b/op-e2e/system/altda/concurrent_test.go new file mode 100644 index 000000000000..4d6835b1fc55 --- /dev/null +++ b/op-e2e/system/altda/concurrent_test.go @@ -0,0 +1,77 @@ +package altda + +import ( + "context" + "math/big" + "testing" + "time" + + op_e2e "github.com/ethereum-optimism/optimism/op-e2e" + + "github.com/ethereum-optimism/optimism/op-batcher/flags" + "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/system/e2esys" + "github.com/ethereum-optimism/optimism/op-node/rollup/derive" + "github.com/stretchr/testify/require" +) + +func TestBatcherConcurrentAltDARequests(t *testing.T) { + op_e2e.InitParallel(t) + + numL1TxsExpected := int64(10) + + cfg := e2esys.DefaultSystemConfig(t) + cfg.DeployConfig.UseAltDA = true + cfg.BatcherMaxPendingTransactions = 0 // no limit on parallel txs + // ensures that batcher txs are as small as possible + cfg.BatcherMaxL1TxSizeBytes = derive.FrameV0OverHeadSize + 1 /*version bytes*/ + 1 + cfg.BatcherBatchType = 0 + cfg.DataAvailabilityType = flags.CalldataType + cfg.BatcherMaxConcurrentDARequest = uint64(numL1TxsExpected) + + // disable batcher because we start it manually below + cfg.DisableBatcher = true + sys, err := cfg.Start(t) + require.NoError(t, err, "Error starting up system") + defer sys.Close() + + // make every request take 5 seconds, such that only concurrent requests will be able to make progress fast enough + sys.FakeAltDAServer.SetPutRequestLatency(5 * time.Second) + + l1Client := sys.NodeClient("l1") + l2Seq := sys.NodeClient("sequencer") + + // we wait for numL1TxsExpected L2 blocks to have been produced, just to make sure the sequencer is working properly + _, err = geth.WaitForBlock(big.NewInt(numL1TxsExpected), l2Seq, time.Duration(cfg.DeployConfig.L2BlockTime*uint64(numL1TxsExpected))*time.Second) + require.NoError(t, err, "Waiting for L2 blocks") + ctx, cancel := context.WithTimeout(context.Background(), 5*time.Second) + defer cancel() + startingL1BlockNum, err := l1Client.BlockNumber(ctx) + require.NoError(t, err) + + // start batch submission + driver := sys.BatchSubmitter.TestDriver() + err = driver.StartBatchSubmitting() + require.NoError(t, err) + + totalBatcherTxsCount := int64(0) + // wait for up to 5 L1 blocks, expecting 10 L2 batcher txs in them. + // usually only 3 is required, but it's possible additional L1 blocks will be created + // before the batcher starts, so we wait additional blocks. + for i := int64(0); i < 5; i++ { + block, err := geth.WaitForBlock(big.NewInt(int64(startingL1BlockNum)+i), l1Client, time.Duration(cfg.DeployConfig.L1BlockTime*2)*time.Second) + require.NoError(t, err, "Waiting for l1 blocks") + // there are possibly other services (proposer/challenger) in the background sending txs + // so we only count the batcher txs + batcherTxCount, err := transactions.TransactionsBySender(block, cfg.DeployConfig.BatchSenderAddress) + require.NoError(t, err) + totalBatcherTxsCount += int64(batcherTxCount) + + if totalBatcherTxsCount >= numL1TxsExpected { + return + } + } + + t.Fatal("Expected at least 10 transactions from the batcher") +} diff --git a/op-e2e/bridge_test.go b/op-e2e/system/bridge/bridge_test.go similarity index 92% rename from op-e2e/bridge_test.go rename to op-e2e/system/bridge/bridge_test.go index 539088fe6751..655cf612c9ad 100644 --- a/op-e2e/bridge_test.go +++ b/op-e2e/system/bridge/bridge_test.go @@ -1,4 +1,4 @@ -package op_e2e +package bridge import ( "context" @@ -6,6 +6,10 @@ import ( "math/big" "testing" + op_e2e "github.com/ethereum-optimism/optimism/op-e2e" + + "github.com/ethereum-optimism/optimism/op-e2e/system/e2esys" + "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" @@ -20,22 +24,25 @@ import ( "github.com/stretchr/testify/require" ) +func TestMain(m *testing.M) { + op_e2e.RunMain(m) +} + // TestERC20BridgeDeposits tests the the L1StandardBridge bridge ERC20 // functionality. func TestERC20BridgeDeposits(t *testing.T) { - InitParallel(t) + op_e2e.InitParallel(t) - cfg := DefaultSystemConfig(t) + cfg := e2esys.DefaultSystemConfig(t) sys, err := cfg.Start(t) 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) - l1Client := sys.Clients["l1"] - l2Client := sys.Clients["sequencer"] + l1Client := sys.NodeClient("l1") + l2Client := sys.NodeClient("sequencer") opts, err := bind.NewKeyedTransactorWithChainID(sys.Cfg.Secrets.Alice, cfg.L1ChainIDBig()) require.Nil(t, err) diff --git a/op-e2e/deposit_test.go b/op-e2e/system/bridge/deposit_test.go similarity index 81% rename from op-e2e/deposit_test.go rename to op-e2e/system/bridge/deposit_test.go index 15377060f555..d01e9b3f3be9 100644 --- a/op-e2e/deposit_test.go +++ b/op-e2e/system/bridge/deposit_test.go @@ -1,4 +1,4 @@ -package op_e2e +package bridge import ( "context" @@ -6,6 +6,11 @@ import ( "testing" "time" + op_e2e "github.com/ethereum-optimism/optimism/op-e2e" + + "github.com/ethereum-optimism/optimism/op-e2e/system/e2esys" + "github.com/ethereum-optimism/optimism/op-e2e/system/helpers" + "github.com/ethereum-optimism/optimism/op-e2e/e2eutils/wait" "github.com/ethereum/go-ethereum/accounts/abi/bind" @@ -16,26 +21,25 @@ import ( ) func TestMintOnRevertedDeposit(t *testing.T) { - InitParallel(t) - cfg := DefaultSystemConfig(t) + op_e2e.InitParallel(t) + cfg := e2esys.DefaultSystemConfig(t) delete(cfg.Nodes, "verifier") sys, err := cfg.Start(t) - require.Nil(t, err, "Error starting up system") - defer sys.Close() + require.NoError(t, err, "Error starting up system") - l1Client := sys.Clients["l1"] - l2Verif := sys.Clients["sequencer"] + l1Client := sys.NodeClient("l1") + l2Verif := sys.NodeClient("sequencer") // create signer aliceKey := cfg.Secrets.Alice opts, err := bind.NewKeyedTransactorWithChainID(aliceKey, cfg.L1ChainIDBig()) - require.Nil(t, err) + require.NoError(t, err) fromAddr := opts.From ctx, cancel := context.WithTimeout(context.Background(), 1*time.Second) startBalance, err := l2Verif.BalanceAt(ctx, fromAddr, nil) cancel() - require.Nil(t, err) + require.NoError(t, err) ctx, cancel = context.WithTimeout(context.Background(), 1*time.Second) startNonce, err := l2Verif.NonceAt(ctx, fromAddr, nil) @@ -45,7 +49,7 @@ func TestMintOnRevertedDeposit(t *testing.T) { toAddr := common.Address{0xff, 0xff} mintAmount := big.NewInt(9_000_000) opts.Value = mintAmount - SendDepositTx(t, cfg, l1Client, l2Verif, opts, func(l2Opts *DepositTxOpts) { + helpers.SendDepositTx(t, cfg, l1Client, l2Verif, opts, func(l2Opts *helpers.DepositTxOpts) { l2Opts.ToAddr = toAddr // trigger a revert by transferring more than we have available l2Opts.Value = new(big.Int).Mul(common.Big2, startBalance) @@ -56,7 +60,7 @@ func TestMintOnRevertedDeposit(t *testing.T) { ctx, cancel = context.WithTimeout(context.Background(), 15*time.Second) endBalance, err := wait.ForBalanceChange(ctx, l2Verif, fromAddr, startBalance) cancel() - require.Nil(t, err) + require.NoError(t, err) ctx, cancel = context.WithTimeout(context.Background(), 1*time.Second) toAddrBalance, err := l2Verif.BalanceAt(ctx, toAddr, nil) @@ -76,19 +80,18 @@ func TestMintOnRevertedDeposit(t *testing.T) { } func TestDepositTxCreateContract(t *testing.T) { - InitParallel(t) - cfg := DefaultSystemConfig(t) + op_e2e.InitParallel(t) + cfg := e2esys.DefaultSystemConfig(t) delete(cfg.Nodes, "verifier") sys, err := cfg.Start(t) - require.Nil(t, err, "Error starting up system") - defer sys.Close() + require.NoError(t, err, "Error starting up system") - l1Client := sys.Clients["l1"] - l2Client := sys.Clients["sequencer"] + l1Client := sys.NodeClient("l1") + l2Client := sys.NodeClient("sequencer") opts, err := bind.NewKeyedTransactorWithChainID(cfg.Secrets.Alice, cfg.L1ChainIDBig()) - require.Nil(t, err) + require.NoError(t, err) // Simple constructor that is prefixed to the actual contract code // Results in the contract code being returned as the code for the new contract @@ -127,7 +130,7 @@ func TestDepositTxCreateContract(t *testing.T) { deployData := append(deployPrefix, sstoreContract...) - l2Receipt := SendDepositTx(t, cfg, l1Client, l2Client, opts, func(l2Opts *DepositTxOpts) { + l2Receipt := helpers.SendDepositTx(t, cfg, l1Client, l2Client, opts, func(l2Opts *helpers.DepositTxOpts) { l2Opts.Data = deployData l2Opts.Value = common.Big0 l2Opts.IsCreation = true diff --git a/op-e2e/system/bridge/rpc_test.go b/op-e2e/system/bridge/rpc_test.go new file mode 100644 index 000000000000..74a243ac2a93 --- /dev/null +++ b/op-e2e/system/bridge/rpc_test.go @@ -0,0 +1,55 @@ +package bridge + +import ( + "context" + "math/big" + "testing" + "time" + + op_e2e "github.com/ethereum-optimism/optimism/op-e2e" + + "github.com/ethereum-optimism/optimism/op-e2e/system/e2esys" + "github.com/ethereum/go-ethereum/common" + "github.com/ethereum/go-ethereum/core/types" + "github.com/ethereum/go-ethereum/crypto" + "github.com/stretchr/testify/require" +) + +// TestL2SequencerRPCDepositTx checks that the L2 sequencer will not accept DepositTx type transactions. +// The acceptance of these transactions would allow for arbitrary minting of ETH in L2. +func TestL2SequencerRPCDepositTx(t *testing.T) { + op_e2e.InitParallel(t) + + // Create our system configuration for L1/L2 and start it + cfg := e2esys.DefaultSystemConfig(t) + sys, err := cfg.Start(t) + require.Nil(t, err, "Error starting up system") + + // Obtain our sequencer, verifier, and transactor keypair. + l2Seq := sys.NodeClient("sequencer") + l2Verif := sys.NodeClient("verifier") + txSigningKey := sys.Cfg.Secrets.Alice + require.Nil(t, err) + + // Create a deposit tx to send over RPC. + tx := types.NewTx(&types.DepositTx{ + SourceHash: common.Hash{}, + From: crypto.PubkeyToAddress(txSigningKey.PublicKey), + To: &common.Address{0xff, 0xff}, + Mint: big.NewInt(1000), + Value: big.NewInt(1000), + Gas: 0, + IsSystemTransaction: false, + Data: nil, + }) + + ctx, cancel := context.WithTimeout(context.Background(), 5*time.Second) + err = l2Seq.SendTransaction(ctx, tx) + cancel() + require.Error(t, err, "a DepositTx was accepted by L2 sequencer over RPC when it should not have been.") + + ctx, cancel = context.WithTimeout(context.Background(), 5*time.Second) + err = l2Verif.SendTransaction(ctx, tx) + cancel() + require.Error(t, err, "a DepositTx was accepted by L2 verifier over RPC when it should not have been.") +} diff --git a/op-e2e/system/bridge/validity_test.go b/op-e2e/system/bridge/validity_test.go new file mode 100644 index 000000000000..d79919015951 --- /dev/null +++ b/op-e2e/system/bridge/validity_test.go @@ -0,0 +1,611 @@ +package bridge + +import ( + "bytes" + "context" + "crypto/ecdsa" + "fmt" + "math/big" + "math/rand" + "testing" + "time" + + op_e2e "github.com/ethereum-optimism/optimism/op-e2e" + + "github.com/ethereum-optimism/optimism/op-e2e/system/e2esys" + "github.com/ethereum-optimism/optimism/op-e2e/system/helpers" + + "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/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/bind" + "github.com/ethereum/go-ethereum/common" + "github.com/ethereum/go-ethereum/core/types" + "github.com/ethereum/go-ethereum/crypto" + "github.com/ethereum/go-ethereum/ethclient" + "github.com/ethereum/go-ethereum/ethclient/gethclient" + "github.com/ethereum/go-ethereum/params" + "github.com/ethereum/go-ethereum/rpc" + fuzz "github.com/google/gofuzz" + "github.com/stretchr/testify/require" +) + +// TestAccount defines an account generated by startConfigWithTestAccounts +type TestAccount struct { + HDPath string + Key *ecdsa.PrivateKey + Addr common.Address + L1Opts *bind.TransactOpts + L2Opts *bind.TransactOpts +} + +// startConfigWithTestAccounts takes a SystemConfig, generates additional accounts, adds them to the config, so they +// are funded on startup, starts the system, and imports the keys into the keystore, and obtains transaction opts for +// each account. +func startConfigWithTestAccounts(t *testing.T, cfg *e2esys.SystemConfig, accountsToGenerate int) (*e2esys.System, []*TestAccount, error) { + // Create our test accounts and add them to the pre-mine cfg. + testAccounts := make([]*TestAccount, 0) + var err error + for i := 0; i < accountsToGenerate; i++ { + // Create our test account and add it to our list + testAccount := &TestAccount{ + HDPath: fmt.Sprintf("m/44'/60'/0'/0/%d", 1000+i), // offset by 1000 to avoid collisions. + Key: nil, + L1Opts: nil, + L2Opts: nil, + } + testAccounts = append(testAccounts, testAccount) + + // Obtain our generated private key + testAccount.Key, err = cfg.Secrets.Wallet.PrivateKey(accounts.Account{ + URL: accounts.URL{ + Path: testAccount.HDPath, + }, + }) + if err != nil { + return nil, nil, err + } + testAccount.Addr = crypto.PubkeyToAddress(testAccount.Key.PublicKey) + + // Obtain the transaction options for contract bindings for this account. + testAccount.L1Opts, err = bind.NewKeyedTransactorWithChainID(testAccount.Key, cfg.L1ChainIDBig()) + if err != nil { + return nil, nil, err + } + testAccount.L2Opts, err = bind.NewKeyedTransactorWithChainID(testAccount.Key, cfg.L2ChainIDBig()) + if err != nil { + return nil, nil, err + } + + // Fund the test account in our config + cfg.Premine[testAccount.Addr] = big.NewInt(params.Ether) + cfg.Premine[testAccount.Addr] = cfg.Premine[testAccount.Addr].Mul(cfg.Premine[testAccount.Addr], big.NewInt(1_000_000)) + + } + + // Start our system + sys, err := cfg.Start(t) + if err != nil { + return sys, nil, err + } + + // Return our results. + return sys, testAccounts, err +} + +// TestMixedDepositValidity makes a number of deposit transactions, some which will succeed in transferring value, +// while others do not. It ensures that the expected nonces/balances match after several interactions. +func TestMixedDepositValidity(t *testing.T) { + op_e2e.InitParallel(t) + // Define how many deposit txs we'll make. Each deposit mints a fixed amount and transfers up to 1/3 of the user's + // balance. As such, this number cannot be too high or else the test will always fail due to lack of balance in L1. + const depositTxCount = 15 + + // Define how many accounts we'll use to deposit funds + const accountUsedToDeposit = 5 + + // Create our system configuration, funding all accounts we created for L1/L2, and start it + cfg := e2esys.DefaultSystemConfig(t) + sys, testAccounts, err := startConfigWithTestAccounts(t, &cfg, accountUsedToDeposit) + require.Nil(t, err, "Error starting up system") + + // Obtain our sequencer, verifier, and transactor keypair. + l1Client := sys.NodeClient("l1") + l2Seq := sys.NodeClient("sequencer") + l2Verif := sys.NodeClient("verifier") + require.NoError(t, err) + + // Define our L1 transaction timeout duration. + txTimeoutDuration := 10 * time.Duration(cfg.DeployConfig.L1BlockTime) * time.Second + + // Create a struct used to track our transactors and their transactions sent. + type TestAccountState struct { + Account *TestAccount + ExpectedL1Balance *big.Int + ExpectedL2Balance *big.Int + StartingL1Nonce uint64 + ExpectedL1Nonce uint64 + StartingL2Nonce uint64 + ExpectedL2Nonce uint64 + } + + // Create the state objects for every test account we'll track changes for. + transactors := make([]*TestAccountState, 0) + for i := 0; i < len(testAccounts); i++ { + // Obtain our account + testAccount := testAccounts[i] + + // Obtain the transactor's starting nonce on L1. + ctx, cancel := context.WithTimeout(context.Background(), txTimeoutDuration) + startL1Nonce, err := l1Client.NonceAt(ctx, testAccount.L1Opts.From, nil) + cancel() + require.NoError(t, err) + + // Obtain the transactor's starting balance on L2. + ctx, cancel = context.WithTimeout(context.Background(), txTimeoutDuration) + startL2Balance, err := l2Verif.BalanceAt(ctx, testAccount.L2Opts.From, nil) + cancel() + require.NoError(t, err) + + // Obtain the transactor's starting nonce on L2. + ctx, cancel = context.WithTimeout(context.Background(), txTimeoutDuration) + startL2Nonce, err := l2Verif.NonceAt(ctx, testAccount.L2Opts.From, nil) + cancel() + require.NoError(t, err) + + // Add our transactor to our list + transactors = append(transactors, &TestAccountState{ + Account: testAccount, + ExpectedL2Balance: startL2Balance, + ExpectedL1Nonce: startL1Nonce, + ExpectedL2Nonce: startL2Nonce, + }) + } + + // Create our random provider + randomProvider := rand.New(rand.NewSource(1452)) + + // Now we create a number of deposits from each transactor + for i := 0; i < depositTxCount; i++ { + // Determine if this deposit should succeed in transferring value (not minting) + validTransfer := randomProvider.Int()%2 == 0 + + // Determine the transactor to use + transactorIndex := randomProvider.Int() % len(transactors) + transactor := transactors[transactorIndex] + + // Determine the transactor to receive the deposit + receiverIndex := randomProvider.Int() % len(transactors) + receiver := transactors[receiverIndex] + toAddr := receiver.Account.L2Opts.From + + // Create our L1 deposit transaction and send it. + mintAmount := big.NewInt(randomProvider.Int63() % 9_000_000) + transactor.Account.L1Opts.Value = mintAmount + var transferValue *big.Int + if validTransfer { + transferValue = new(big.Int).Div(transactor.ExpectedL2Balance, common.Big3) // send 1/3 our balance which should succeed. + } else { + transferValue = new(big.Int).Mul(common.Big2, transactor.ExpectedL2Balance) // trigger a revert by trying to transfer our current balance * 2 + } + helpers.SendDepositTx(t, cfg, l1Client, l2Verif, transactor.Account.L1Opts, func(l2Opts *helpers.DepositTxOpts) { + l2Opts.GasLimit = 100_000 + l2Opts.IsCreation = false + l2Opts.Data = nil + l2Opts.ToAddr = toAddr + l2Opts.Value = transferValue + if validTransfer { + l2Opts.ExpectedStatus = types.ReceiptStatusSuccessful + } else { + l2Opts.ExpectedStatus = types.ReceiptStatusFailed + } + }) + + // Update our expected balances. + if validTransfer && transactor != receiver { + // Transactor balances changes by minted minus transferred value. + transactor.ExpectedL2Balance = new(big.Int).Add(transactor.ExpectedL2Balance, new(big.Int).Sub(mintAmount, transferValue)) + // Receiver balance changes by transferred value. + receiver.ExpectedL2Balance = new(big.Int).Add(receiver.ExpectedL2Balance, transferValue) + } else { + // If the transfer failed, minting should've still succeeded but the balance shouldn't have transferred + // to the recipient. + transactor.ExpectedL2Balance = new(big.Int).Add(transactor.ExpectedL2Balance, mintAmount) + } + transactor.ExpectedL1Nonce = transactor.ExpectedL1Nonce + 1 + transactor.ExpectedL2Nonce = transactor.ExpectedL2Nonce + 1 + } + + // At the end, assert our account balance/nonce states. + for _, transactor := range transactors { + // Obtain the L1 account nonce + ctx, cancel := context.WithTimeout(context.Background(), txTimeoutDuration) + endL1Nonce, err := l1Client.NonceAt(ctx, transactor.Account.L1Opts.From, nil) + cancel() + require.NoError(t, err) + + // Obtain the L2 sequencer account balance + ctx, cancel = context.WithTimeout(context.Background(), txTimeoutDuration) + endL2SeqBalance, err := l2Seq.BalanceAt(ctx, transactor.Account.L2Opts.From, nil) + cancel() + require.NoError(t, err) + + // Obtain the L2 sequencer account nonce + ctx, cancel = context.WithTimeout(context.Background(), txTimeoutDuration) + endL2SeqNonce, err := l2Seq.NonceAt(ctx, transactor.Account.L2Opts.From, nil) + cancel() + require.NoError(t, err) + + // Obtain the L2 verifier account balance + ctx, cancel = context.WithTimeout(context.Background(), txTimeoutDuration) + endL2VerifBalance, err := l2Verif.BalanceAt(ctx, transactor.Account.L2Opts.From, nil) + cancel() + require.NoError(t, err) + + // Obtain the L2 verifier account nonce + ctx, cancel = context.WithTimeout(context.Background(), txTimeoutDuration) + endL2VerifNonce, err := l2Verif.NonceAt(ctx, transactor.Account.L2Opts.From, nil) + cancel() + require.NoError(t, err) + + require.Equal(t, transactor.ExpectedL1Nonce, endL1Nonce, "Unexpected L1 nonce for transactor") + require.Equal(t, transactor.ExpectedL2Nonce, endL2SeqNonce, "Unexpected L2 sequencer nonce for transactor") + require.Equal(t, transactor.ExpectedL2Balance, endL2SeqBalance, "Unexpected L2 sequencer balance for transactor") + require.Equal(t, transactor.ExpectedL2Nonce, endL2VerifNonce, "Unexpected L2 verifier nonce for transactor") + require.Equal(t, transactor.ExpectedL2Balance, endL2VerifBalance, "Unexpected L2 verifier balance for transactor") + } +} + +// TestMixedWithdrawalValidity makes a number of withdrawal transactions and ensures ones with modified parameters are +// rejected while unmodified ones are accepted. This runs test cases in different systems. +func TestMixedWithdrawalValidity(t *testing.T) { + op_e2e.InitParallel(t) + + // There are 7 different fields we try modifying to cause a failure, plus one "good" test result we test. + for i := 0; i <= 8; i++ { + i := i // avoid loop var capture + t.Run(fmt.Sprintf("withdrawal test#%d", i+1), func(t *testing.T) { + ctx, bgCancel := context.WithCancel(context.Background()) + defer bgCancel() + + op_e2e.InitParallel(t) + + // Create our system configuration, funding all accounts we created for L1/L2, and start it + cfg := e2esys.DefaultSystemConfig(t) + cfg.Nodes["sequencer"].SafeDBPath = t.TempDir() + cfg.DeployConfig.L2BlockTime = 2 + require.LessOrEqual(t, cfg.DeployConfig.FinalizationPeriodSeconds, uint64(6)) + require.Equal(t, cfg.DeployConfig.FundDevAccounts, true) + sys, err := cfg.Start(t) + require.NoError(t, err, "error starting up system") + + // Obtain our sequencer, verifier, and transactor keypair. + l1Client := sys.NodeClient("l1") + l2Seq := sys.NodeClient("sequencer") + l2Verif := sys.NodeClient("verifier") + require.NoError(t, err) + + systemConfig, err := legacybindings.NewSystemConfigCaller(cfg.L1Deployments.SystemConfigProxy, l1Client) + require.NoError(t, err) + unsafeBlockSigner, err := systemConfig.UnsafeBlockSigner(nil) + require.NoError(t, err) + require.Equal(t, cfg.DeployConfig.P2PSequencerAddress, unsafeBlockSigner) + + // The batcher has balance on L1 + batcherBalance, err := l1Client.BalanceAt(context.Background(), cfg.DeployConfig.BatchSenderAddress, nil) + require.NoError(t, err) + require.NotEqual(t, batcherBalance, big.NewInt(0)) + + // The proposer has balance on L1 + proposerBalance, err := l1Client.BalanceAt(context.Background(), cfg.DeployConfig.L2OutputOracleProposer, nil) + require.NoError(t, err) + require.NotEqual(t, proposerBalance, big.NewInt(0)) + + // Define our L1 transaction timeout duration. + txTimeoutDuration := 10 * time.Duration(cfg.DeployConfig.L1BlockTime) * time.Second + + // Bind to the deposit contract + depositContract, err := bindings.NewOptimismPortal(cfg.L1Deployments.OptimismPortalProxy, l1Client) + _ = depositContract + require.NoError(t, err) + + l2OutputOracle, err := bindings.NewL2OutputOracleCaller(cfg.L1Deployments.L2OutputOracleProxy, l1Client) + require.NoError(t, err) + + finalizationPeriod, err := l2OutputOracle.FINALIZATIONPERIODSECONDS(nil) + require.NoError(t, err) + require.Equal(t, cfg.DeployConfig.FinalizationPeriodSeconds, finalizationPeriod.Uint64()) + + disputeGameFactory, err := bindings.NewDisputeGameFactoryCaller(cfg.L1Deployments.DisputeGameFactoryProxy, l1Client) + require.NoError(t, err) + + optimismPortal2, err := bindingspreview.NewOptimismPortal2Caller(cfg.L1Deployments.OptimismPortalProxy, l1Client) + require.NoError(t, err) + + // Create a struct used to track our transactors and their transactions sent. + type TestAccountState struct { + Account *TestAccount + ExpectedL1Balance *big.Int + ExpectedL2Balance *big.Int + ExpectedL1Nonce uint64 + ExpectedL2Nonce uint64 + } + + // Create a test account state for our transactor. + transactor := &TestAccountState{ + Account: &TestAccount{ + HDPath: e2eutils.DefaultMnemonicConfig.Alice, + Key: cfg.Secrets.Alice, + L1Opts: nil, + L2Opts: nil, + }, + ExpectedL1Balance: nil, + ExpectedL2Balance: nil, + ExpectedL1Nonce: 0, + ExpectedL2Nonce: 0, + } + transactor.Account.L1Opts, err = bind.NewKeyedTransactorWithChainID(transactor.Account.Key, cfg.L1ChainIDBig()) + require.NoError(t, err) + transactor.Account.L2Opts, err = bind.NewKeyedTransactorWithChainID(transactor.Account.Key, cfg.L2ChainIDBig()) + require.NoError(t, err) + + // Obtain the transactor's starting balance on L1. + txCtx, txCancel := context.WithTimeout(context.Background(), txTimeoutDuration) + transactor.ExpectedL1Balance, err = l1Client.BalanceAt(txCtx, transactor.Account.L1Opts.From, nil) + txCancel() + require.NoError(t, err) + + // Obtain the transactor's starting balance on L2. + txCtx, txCancel = context.WithTimeout(context.Background(), txTimeoutDuration) + transactor.ExpectedL2Balance, err = l2Verif.BalanceAt(txCtx, transactor.Account.L2Opts.From, nil) + txCancel() + require.NoError(t, err) + + // Bind to the L2-L1 message passer + l2l1MessagePasser, err := bindings.NewL2ToL1MessagePasser(predeploys.L2ToL1MessagePasserAddr, l2Seq) + require.NoError(t, err, "error binding to message passer on L2") + + // Create our fuzzer wrapper to generate complex values (despite this not being a fuzz test, this is still a useful + // provider to fill complex data structures). + typeProvider := fuzz.NewWithSeed(time.Now().Unix()).NilChance(0).MaxDepth(10000).NumElements(0, 0x100) + fuzzerutils.AddFuzzerFunctions(typeProvider) + + // Now we create a number of withdrawals from each transactor + + // Determine the address our request will come from + fromAddr := crypto.PubkeyToAddress(transactor.Account.Key.PublicKey) + fromBalance, err := l2Verif.BalanceAt(context.Background(), fromAddr, nil) + require.NoError(t, err) + require.Greaterf(t, fromBalance.Uint64(), uint64(700_000_000_000), "insufficient balance for %s", fromAddr) + + // Initiate Withdrawal + withdrawAmount := big.NewInt(500_000_000_000) + transactor.Account.L2Opts.Value = withdrawAmount + tx, err := l2l1MessagePasser.InitiateWithdrawal(transactor.Account.L2Opts, fromAddr, big.NewInt(21000), nil) + require.Nil(t, err, "sending initiate withdraw tx") + + t.Logf("Waiting for tx %s to be in sequencer", tx.Hash().Hex()) + receiptSeq, err := wait.ForReceiptOK(ctx, l2Seq, tx.Hash()) + require.Nil(t, err, "withdrawal initiated on L2 sequencer") + + verifierTip, err := l2Verif.BlockByNumber(context.Background(), nil) + require.Nil(t, err) + + t.Logf("Waiting for tx %s to be in verifier. Verifier tip is %s:%d. Included in sequencer in block %s:%d", tx.Hash().Hex(), verifierTip.Hash().Hex(), verifierTip.NumberU64(), receiptSeq.BlockHash.Hex(), receiptSeq.BlockNumber) + receipt, err := wait.ForReceiptOK(ctx, l2Verif, tx.Hash()) + require.Nilf(t, err, "withdrawal tx %s not found in verifier. included in block %s:%d", tx.Hash().Hex(), receiptSeq.BlockHash.Hex(), receiptSeq.BlockNumber) + + // Obtain the header for the block containing the transaction (used to calculate gas fees) + txCtx, txCancel = context.WithTimeout(context.Background(), txTimeoutDuration) + header, err := l2Verif.HeaderByNumber(txCtx, receipt.BlockNumber) + txCancel() + require.Nil(t, err) + + // Calculate gas fees for the withdrawal in L2 to later adjust our balance. + withdrawalL2GasFee := helpers.CalcGasFees(receipt.GasUsed, tx.GasTipCap(), tx.GasFeeCap(), header.BaseFee) + + // Adjust our expected L2 balance (should've decreased by withdraw amount + fees) + transactor.ExpectedL2Balance = new(big.Int).Sub(transactor.ExpectedL2Balance, withdrawAmount) + transactor.ExpectedL2Balance = new(big.Int).Sub(transactor.ExpectedL2Balance, withdrawalL2GasFee) + transactor.ExpectedL2Balance = new(big.Int).Sub(transactor.ExpectedL2Balance, receipt.L1Fee) + transactor.ExpectedL2Nonce = transactor.ExpectedL2Nonce + 1 + + // Wait for the finalization period, then we can finalize this withdrawal. + require.NotEqual(t, cfg.L1Deployments.L2OutputOracleProxy, common.Address{}) + var blockNumber uint64 + if e2eutils.UseFaultProofs() { + blockNumber, err = wait.ForGamePublished(ctx, l1Client, cfg.L1Deployments.OptimismPortalProxy, cfg.L1Deployments.DisputeGameFactoryProxy, receipt.BlockNumber) + } else { + blockNumber, err = wait.ForOutputRootPublished(ctx, l1Client, cfg.L1Deployments.L2OutputOracleProxy, receipt.BlockNumber) + } + require.Nil(t, err) + + header, err = l2Verif.HeaderByNumber(ctx, new(big.Int).SetUint64(blockNumber)) + require.Nil(t, err) + + rpcClient, err := rpc.Dial(sys.EthInstances["verifier"].UserRPC().RPC()) + require.Nil(t, err) + proofCl := gethclient.New(rpcClient) + receiptCl := ethclient.NewClient(rpcClient) + blockCl := ethclient.NewClient(rpcClient) + + // Now create the withdrawal + params, err := helpers.ProveWithdrawalParameters(context.Background(), proofCl, receiptCl, blockCl, tx.Hash(), header, l2OutputOracle, disputeGameFactory, optimismPortal2) + require.Nil(t, err) + + // Obtain our withdrawal parameters + withdrawal := crossdomain.Withdrawal{ + Nonce: params.Nonce, + Sender: ¶ms.Sender, + Target: ¶ms.Target, + Value: params.Value, + GasLimit: params.GasLimit, + Data: params.Data, + } + withdrawalTransaction := withdrawal.WithdrawalTransaction() + l2OutputIndexParam := params.L2OutputIndex + outputRootProofParam := params.OutputRootProof + withdrawalProofParam := params.WithdrawalProof + + // Determine if this will be a bad withdrawal. + badWithdrawal := i < 8 + if badWithdrawal { + // Select a field to overwrite depending on which test case this is. + fieldIndex := i + + // We ensure that each field changes to something different. + if fieldIndex == 0 { + originalValue := new(big.Int).Set(withdrawalTransaction.Nonce) + for originalValue.Cmp(withdrawalTransaction.Nonce) == 0 { + typeProvider.Fuzz(&withdrawalTransaction.Nonce) + } + } else if fieldIndex == 1 { + originalValue := withdrawalTransaction.Sender + for originalValue == withdrawalTransaction.Sender { + typeProvider.Fuzz(&withdrawalTransaction.Sender) + } + } else if fieldIndex == 2 { + originalValue := withdrawalTransaction.Target + for originalValue == withdrawalTransaction.Target { + typeProvider.Fuzz(&withdrawalTransaction.Target) + } + } else if fieldIndex == 3 { + originalValue := new(big.Int).Set(withdrawalTransaction.Value) + for originalValue.Cmp(withdrawalTransaction.Value) == 0 { + typeProvider.Fuzz(&withdrawalTransaction.Value) + } + } else if fieldIndex == 4 { + originalValue := new(big.Int).Set(withdrawalTransaction.GasLimit) + for originalValue.Cmp(withdrawalTransaction.GasLimit) == 0 { + typeProvider.Fuzz(&withdrawalTransaction.GasLimit) + } + } else if fieldIndex == 5 { + originalValue := new(big.Int).Set(l2OutputIndexParam) + for originalValue.Cmp(l2OutputIndexParam) == 0 { + typeProvider.Fuzz(&l2OutputIndexParam) + } + } else if fieldIndex == 6 { + // TODO: this is a large structure that is unlikely to ever produce the same value, however we should + // verify that we actually generated different values. + typeProvider.Fuzz(&outputRootProofParam) + } else if fieldIndex == 7 { + typeProvider.Fuzz(&withdrawalProofParam) + originalValue := make([][]byte, len(withdrawalProofParam)) + for i := 0; i < len(withdrawalProofParam); i++ { + originalValue[i] = make([]byte, len(withdrawalProofParam[i])) + copy(originalValue[i], withdrawalProofParam[i]) + for bytes.Equal(originalValue[i], withdrawalProofParam[i]) { + typeProvider.Fuzz(&withdrawalProofParam[i]) + } + } + + } + } + + // Prove withdrawal. This checks the proof so we only finalize if this succeeds + tx, err = depositContract.ProveWithdrawalTransaction( + transactor.Account.L1Opts, + withdrawalTransaction, + l2OutputIndexParam, + outputRootProofParam, + withdrawalProofParam, + ) + + // If we had a bad withdrawal, we don't update some expected value and skip to processing the next + // withdrawal. Otherwise, if it was valid, this should've succeeded so we proceed with updating our expected + // values and asserting no errors occurred. + if badWithdrawal { + require.Error(t, err) + } else { + require.NoError(t, err) + + if e2eutils.UseFaultProofs() { + // Start a challenger to resolve claims and games once the clock expires + factoryHelper := disputegame.NewFactoryHelper(t, ctx, sys) + factoryHelper.StartChallenger(ctx, "Challenger", + challenger.WithFastGames(), + challenger.WithPrivKey(sys.Cfg.Secrets.Mallory)) + } + receipt, err = wait.ForReceiptOK(ctx, l1Client, tx.Hash()) + require.NoError(t, err, "finalize withdrawal") + + // Verify balance after withdrawal + header, err = l1Client.HeaderByNumber(ctx, receipt.BlockNumber) + require.NoError(t, err) + + // Ensure that withdrawal - gas fees are added to the L1 balance + // Fun fact, the fee is greater than the withdrawal amount + withdrawalL1GasFee := helpers.CalcGasFees(receipt.GasUsed, tx.GasTipCap(), tx.GasFeeCap(), header.BaseFee) + transactor.ExpectedL1Balance = new(big.Int).Add(transactor.ExpectedL2Balance, withdrawAmount) + transactor.ExpectedL1Balance = new(big.Int).Sub(transactor.ExpectedL2Balance, withdrawalL1GasFee) + transactor.ExpectedL1Nonce++ + + // Ensure that our withdrawal was proved successfully + _, err := wait.ForReceiptOK(ctx, l1Client, tx.Hash()) + require.NoError(t, err, "prove withdrawal") + + // Wait for finalization and then create the Finalized Withdrawal Transaction + ctx, withdrawalCancel := context.WithTimeout(context.Background(), 60*time.Duration(cfg.DeployConfig.L1BlockTime)*time.Second) + defer withdrawalCancel() + if e2eutils.UseFaultProofs() { + 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) + require.NoError(t, err) + } + + // Finalize withdrawal + _, err = depositContract.FinalizeWithdrawalTransaction( + transactor.Account.L1Opts, + withdrawalTransaction, + ) + require.NoError(t, err) + } + + // At the end, assert our account balance/nonce states. + + // Obtain the L2 sequencer account balance + endL1Balance, err := l1Client.BalanceAt(ctx, transactor.Account.L1Opts.From, nil) + require.NoError(t, err) + + // Obtain the L1 account nonce + endL1Nonce, err := l1Client.NonceAt(ctx, transactor.Account.L1Opts.From, nil) + require.NoError(t, err) + + // Obtain the L2 sequencer account balance + endL2SeqBalance, err := l2Seq.BalanceAt(ctx, transactor.Account.L1Opts.From, nil) + require.NoError(t, err) + + // Obtain the L2 sequencer account nonce + endL2SeqNonce, err := l2Seq.NonceAt(ctx, transactor.Account.L1Opts.From, nil) + require.NoError(t, err) + + // Obtain the L2 verifier account balance + endL2VerifBalance, err := l2Verif.BalanceAt(ctx, transactor.Account.L1Opts.From, nil) + require.NoError(t, err) + + // Obtain the L2 verifier account nonce + endL2VerifNonce, err := l2Verif.NonceAt(ctx, transactor.Account.L1Opts.From, nil) + require.NoError(t, err) + + // TODO: Check L1 balance as well here. We avoided this due to time constraints as it seems L1 fees + // were off slightly. + _ = endL1Balance + // require.Equal(t, transactor.ExpectedL1Balance, endL1Balance, "Unexpected L1 balance for transactor") + require.Equal(t, transactor.ExpectedL1Nonce, endL1Nonce, "Unexpected L1 nonce for transactor") + require.Equal(t, transactor.ExpectedL2Nonce, endL2SeqNonce, "Unexpected L2 sequencer nonce for transactor") + require.Equal(t, transactor.ExpectedL2Balance, endL2SeqBalance, "Unexpected L2 sequencer balance for transactor") + require.Equal(t, transactor.ExpectedL2Nonce, endL2VerifNonce, "Unexpected L2 verifier nonce for transactor") + require.Equal(t, transactor.ExpectedL2Balance, endL2VerifBalance, "Unexpected L2 verifier balance for transactor") + }) + } +} diff --git a/op-e2e/system/bridge/withdrawal.go b/op-e2e/system/bridge/withdrawal.go new file mode 100644 index 000000000000..29864db02dbf --- /dev/null +++ b/op-e2e/system/bridge/withdrawal.go @@ -0,0 +1,140 @@ +package bridge + +import ( + "context" + "crypto/ecdsa" + "math/big" + "testing" + "time" + + "github.com/ethereum-optimism/optimism/op-e2e/system/e2esys" + "github.com/ethereum-optimism/optimism/op-e2e/system/helpers" + + "github.com/ethereum/go-ethereum/accounts/abi/bind" + "github.com/ethereum/go-ethereum/common" + "github.com/ethereum/go-ethereum/crypto" + "github.com/ethereum/go-ethereum/ethclient" + + "github.com/stretchr/testify/require" + + "github.com/ethereum-optimism/optimism/op-e2e/e2eutils" + "github.com/ethereum-optimism/optimism/op-e2e/e2eutils/wait" + "github.com/ethereum-optimism/optimism/op-service/sources" +) + +type CommonSystem interface { + NodeClient(role string) *ethclient.Client + RollupClient(role string) *sources.RollupClient + Config() e2esys.SystemConfig + TestAccount(int) *ecdsa.PrivateKey +} + +// TestWithdrawals checks that a deposit and then withdrawal execution succeeds. It verifies the +// balance changes on L1 and L2 and has to include gas fees in the balance checks. +// It does not check that the withdrawal can be executed prior to the end of the finality period. +func RunWithdrawalsTest(t *testing.T, sys CommonSystem) { + t.Logf("WithdrawalsTest: running with FP == %t", e2eutils.UseFaultProofs()) + cfg := sys.Config() + + l1Client := sys.NodeClient(e2esys.RoleL1) + l2Seq := sys.NodeClient(e2esys.RoleSeq) + l2Verif := sys.NodeClient(e2esys.RoleVerif) + + // Transactor Account + ethPrivKey := sys.TestAccount(0) + fromAddr := crypto.PubkeyToAddress(ethPrivKey.PublicKey) + + // Create L1 signer + opts, err := bind.NewKeyedTransactorWithChainID(ethPrivKey, cfg.L1ChainIDBig()) + require.NoError(t, err) + + // Start L2 balance + ctx, cancel := context.WithTimeout(context.Background(), 30*time.Second) + defer cancel() + startBalanceBeforeDeposit, err := l2Verif.BalanceAt(ctx, fromAddr, nil) + require.NoError(t, err) + + // Send deposit tx + mintAmount := big.NewInt(1_000_000_000_000) + opts.Value = mintAmount + t.Logf("WithdrawalsTest: depositing %v with L2 start balance %v...", mintAmount, startBalanceBeforeDeposit) + helpers.SendDepositTx(t, cfg, l1Client, l2Verif, opts, func(l2Opts *helpers.DepositTxOpts) { + l2Opts.Value = common.Big0 + }) + t.Log("WithdrawalsTest: waiting for balance change...") + + // Confirm L2 balance + ctx, cancel = context.WithTimeout(context.Background(), 30*time.Second) + defer cancel() + endBalanceAfterDeposit, err := wait.ForBalanceChange(ctx, l2Verif, fromAddr, startBalanceBeforeDeposit) + require.NoError(t, err) + + diff := new(big.Int) + diff = diff.Sub(endBalanceAfterDeposit, startBalanceBeforeDeposit) + require.Equal(t, mintAmount, diff, "Did not get expected balance change after mint") + + // Start L2 balance for withdrawal + ctx, cancel = context.WithTimeout(context.Background(), 30*time.Second) + defer cancel() + startBalanceBeforeWithdrawal, err := l2Seq.BalanceAt(ctx, fromAddr, nil) + require.NoError(t, err) + + withdrawAmount := big.NewInt(500_000_000_000) + t.Logf("WithdrawalsTest: sending L2 withdrawal for %v...", withdrawAmount) + tx, receipt := helpers.SendWithdrawal(t, cfg, l2Seq, ethPrivKey, func(opts *helpers.WithdrawalTxOpts) { + opts.Value = withdrawAmount + opts.VerifyOnClients(l2Verif) + }) + + // Verify L2 balance after withdrawal + ctx, cancel = context.WithTimeout(context.Background(), 30*time.Second) + defer cancel() + header, err := l2Verif.HeaderByNumber(ctx, receipt.BlockNumber) + require.NoError(t, err) + + ctx, cancel = context.WithTimeout(context.Background(), 30*time.Second) + defer cancel() + t.Log("WithdrawalsTest: waiting for L2 balance change...") + endBalanceAfterWithdrawal, err := wait.ForBalanceChange(ctx, l2Seq, fromAddr, startBalanceBeforeWithdrawal) + require.NoError(t, err) + + // Take fee into account + diff = new(big.Int).Sub(startBalanceBeforeWithdrawal, endBalanceAfterWithdrawal) + fees := helpers.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 balance on L1 + ctx, cancel = context.WithTimeout(context.Background(), 30*time.Second) + defer cancel() + startBalanceBeforeFinalize, err := l1Client.BalanceAt(ctx, fromAddr, nil) + require.NoError(t, err) + + t.Log("WithdrawalsTest: ProveAndFinalizeWithdrawal...") + proveReceipt, finalizeReceipt, resolveClaimReceipt, resolveReceipt := helpers.ProveAndFinalizeWithdrawal(t, cfg, sys, e2esys.RoleVerif, ethPrivKey, receipt) + + // Verify balance after withdrawal + ctx, cancel = context.WithTimeout(context.Background(), 30*time.Second) + defer cancel() + t.Log("WithdrawalsTest: waiting for L1 balance change...") + endBalanceAfterFinalize, err := wait.ForBalanceChange(ctx, l1Client, fromAddr, startBalanceBeforeFinalize) + require.NoError(t, err) + t.Logf("WithdrawalsTest: L1 balance changed from %v to %v", startBalanceBeforeFinalize, endBalanceAfterFinalize) + + // Ensure that withdrawal - gas fees are added to the L1 balance + // Fun fact, the fee is greater than the withdrawal amount + // NOTE: The gas fees include *both* the ProveWithdrawalTransaction and FinalizeWithdrawalTransaction transactions. + diff = new(big.Int).Sub(endBalanceAfterFinalize, startBalanceBeforeFinalize) + 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.UseFaultProofs() { + 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) + } + withdrawAmount = withdrawAmount.Sub(withdrawAmount, fees) + require.Equal(t, withdrawAmount, diff) +} diff --git a/op-e2e/system/bridge/withdrawal_test.go b/op-e2e/system/bridge/withdrawal_test.go new file mode 100644 index 000000000000..9f37240cbdbe --- /dev/null +++ b/op-e2e/system/bridge/withdrawal_test.go @@ -0,0 +1,26 @@ +package bridge + +import ( + "testing" + + op_e2e "github.com/ethereum-optimism/optimism/op-e2e" + + "github.com/ethereum-optimism/optimism/op-e2e/system/e2esys" + "github.com/stretchr/testify/require" +) + +// TestWithdrawals checks that a deposit and then withdrawal execution succeeds. It verifies the +// balance changes on L1 and L2 and has to include gas fees in the balance checks. +// It does not check that the withdrawal can be executed prior to the end of the finality period. +func TestWithdrawals(t *testing.T) { + op_e2e.InitParallel(t) + + cfg := e2esys.DefaultSystemConfig(t) + cfg.DeployConfig.FinalizationPeriodSeconds = 2 // 2s finalization period + cfg.L1FinalizedDistance = 2 // Finalize quick, don't make the proposer wait too long + + sys, err := cfg.Start(t) + require.NoError(t, err, "Error starting up system") + + RunWithdrawalsTest(t, sys) +} diff --git a/op-e2e/system/conductor/conductor_test.go b/op-e2e/system/conductor/conductor_test.go new file mode 100644 index 000000000000..ec4175807f8c --- /dev/null +++ b/op-e2e/system/conductor/conductor_test.go @@ -0,0 +1,11 @@ +package conductor + +import ( + "testing" + + op_e2e "github.com/ethereum-optimism/optimism/op-e2e" +) + +func TestMain(m *testing.M) { + op_e2e.RunMain(m) +} diff --git a/op-e2e/sequencer_failover_setup.go b/op-e2e/system/conductor/sequencer_failover_setup.go similarity index 86% rename from op-e2e/sequencer_failover_setup.go rename to op-e2e/system/conductor/sequencer_failover_setup.go index 5ef5635f467d..ea515ecc1e64 100644 --- a/op-e2e/sequencer_failover_setup.go +++ b/op-e2e/system/conductor/sequencer_failover_setup.go @@ -1,4 +1,4 @@ -package op_e2e +package conductor import ( "context" @@ -9,7 +9,11 @@ import ( "testing" "time" + op_e2e "github.com/ethereum-optimism/optimism/op-e2e" + + "github.com/ethereum-optimism/optimism/op-e2e/system/e2esys" "github.com/ethereum/go-ethereum/common/hexutil" + "github.com/ethereum/go-ethereum/log" "github.com/ethereum/go-ethereum/rpc" "github.com/stretchr/testify/require" @@ -17,7 +21,9 @@ import ( bss "github.com/ethereum-optimism/optimism/op-batcher/batcher" batcherFlags "github.com/ethereum-optimism/optimism/op-batcher/flags" con "github.com/ethereum-optimism/optimism/op-conductor/conductor" + "github.com/ethereum-optimism/optimism/op-conductor/consensus" conrpc "github.com/ethereum-optimism/optimism/op-conductor/rpc" + "github.com/ethereum-optimism/optimism/op-e2e/e2eutils/setuputils" "github.com/ethereum-optimism/optimism/op-e2e/e2eutils/wait" rollupNode "github.com/ethereum-optimism/optimism/op-node/node" "github.com/ethereum-optimism/optimism/op-node/rollup" @@ -59,11 +65,11 @@ func (c *conductor) RPCEndpoint() string { return fmt.Sprintf("http://%s:%d", localhost, c.rpcPort) } -func setupSequencerFailoverTest(t *testing.T) (*System, map[string]*conductor, func()) { - InitParallel(t) +func setupSequencerFailoverTest(t *testing.T) (*e2esys.System, map[string]*conductor, func()) { + op_e2e.InitParallel(t) ctx := context.Background() - sys, conductors, err := retry.Do2(ctx, maxSetupRetries, retryStrategy, func() (*System, map[string]*conductor, error) { + sys, conductors, err := retry.Do2(ctx, maxSetupRetries, retryStrategy, func() (*e2esys.System, map[string]*conductor, error) { return setupHAInfra(t, ctx) }) require.NoError(t, err, "Expected to successfully setup sequencers and conductors after retry") @@ -74,15 +80,15 @@ func setupSequencerFailoverTest(t *testing.T) (*System, map[string]*conductor, f c3 := conductors[Sequencer3Name] require.NoError(t, waitForLeadership(t, c1)) - require.NoError(t, c1.client.AddServerAsVoter(ctx, Sequencer2Name, c2.ConsensusEndpoint())) - require.NoError(t, c1.client.AddServerAsVoter(ctx, Sequencer3Name, c3.ConsensusEndpoint())) + require.NoError(t, c1.client.AddServerAsVoter(ctx, Sequencer2Name, c2.ConsensusEndpoint(), 0)) + require.NoError(t, c1.client.AddServerAsVoter(ctx, Sequencer3Name, c3.ConsensusEndpoint(), 0)) require.True(t, leader(t, ctx, c1)) require.False(t, leader(t, ctx, c2)) require.False(t, leader(t, ctx, c3)) // start sequencing on leader lid, _ := findLeader(t, conductors) - unsafeHead, err := sys.Clients[lid].BlockByNumber(ctx, nil) + unsafeHead, err := sys.NodeClient(lid).BlockByNumber(ctx, nil) require.NoError(t, err) require.Equal(t, uint64(0), unsafeHead.NumberU64()) require.NoError(t, sys.RollupClient(lid).StartSequencer(ctx, unsafeHead.Hash())) @@ -93,9 +99,9 @@ func setupSequencerFailoverTest(t *testing.T) (*System, map[string]*conductor, f // weirdly, batcher does not submit a batch until unsafe block 9. // It became normal after that and submits a batch every L1 block (2s) per configuration. // Since our health monitor checks on safe head progression, wait for batcher to become normal before proceeding. - _, err = wait.ForNextSafeBlock(ctx, sys.Clients[Sequencer1Name]) + _, err = wait.ForNextSafeBlock(ctx, sys.NodeClient(Sequencer1Name)) require.NoError(t, err) - _, err = wait.ForNextSafeBlock(ctx, sys.Clients[Sequencer1Name]) + _, err = wait.ForNextSafeBlock(ctx, sys.NodeClient(Sequencer1Name)) require.NoError(t, err) // make sure conductor reports all sequencers as healthy, this means they're syncing correctly. @@ -137,10 +143,10 @@ func setupSequencerFailoverTest(t *testing.T) (*System, map[string]*conductor, f } } -func setupHAInfra(t *testing.T, ctx context.Context) (*System, map[string]*conductor, error) { +func setupHAInfra(t *testing.T, ctx context.Context) (*e2esys.System, map[string]*conductor, error) { startTime := time.Now() - var sys *System + var sys *e2esys.System var conductors map[string]*conductor var err error @@ -189,8 +195,8 @@ func setupHAInfra(t *testing.T, ctx context.Context) (*System, map[string]*condu } for _, cfg := range conductorCfgs { cfg := cfg - nodePRC := sys.RollupNodes[cfg.name].HTTPEndpoint() - engineRPC := sys.EthInstances[cfg.name].HTTPEndpoint() + nodePRC := sys.RollupNodes[cfg.name].UserRPC().RPC() + engineRPC := sys.EthInstances[cfg.name].UserRPC().RPC() 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 } @@ -208,14 +214,17 @@ func setupConductor( ) (*conductor, error) { consensusPort := findAvailablePort(t) cfg := con.Config{ - ConsensusAddr: localhost, - ConsensusPort: consensusPort, - RaftServerID: serverID, - RaftStorageDir: dir, - RaftBootstrap: bootstrap, - NodeRPC: nodeRPC, - ExecutionRPC: engineRPC, - Paused: true, + ConsensusAddr: localhost, + ConsensusPort: consensusPort, + RaftServerID: serverID, + RaftStorageDir: dir, + RaftBootstrap: bootstrap, + RaftSnapshotInterval: 120 * time.Second, + RaftSnapshotThreshold: 8192, + RaftTrailingLogs: 10240, + NodeRPC: nodeRPC, + ExecutionRPC: engineRPC, + Paused: true, HealthCheck: con.HealthCheckConfig{ Interval: 1, // per test setup, l2 block time is 1s. MinPeerCount: 2, // per test setup, each sequencer has 2 peers @@ -252,6 +261,7 @@ func setupConductor( if err != nil { return nil, err } + t.Cleanup(rawClient.Close) client := conrpc.NewAPIClient(rawClient) return &conductor{ @@ -262,7 +272,7 @@ func setupConductor( }, nil } -func setupBatcher(t *testing.T, sys *System, conductors map[string]*conductor) { +func setupBatcher(t *testing.T, sys *e2esys.System, conductors map[string]*conductor) { // enable active sequencer follow mode. // in sequencer HA, all batcher / proposer requests will be proxied by conductor so that we can make sure // that requests are always handled by leader. @@ -277,7 +287,7 @@ func setupBatcher(t *testing.T, sys *System, conductors map[string]*conductor) { conductors[Sequencer3Name].RPCEndpoint(), }, ",") batcherCLIConfig := &bss.CLIConfig{ - L1EthRpc: sys.EthInstances["l1"].WSEndpoint(), + L1EthRpc: sys.EthInstances["l1"].UserRPC().RPC(), L2EthRpc: l2EthRpc, RollupRpc: rollupRpc, MaxPendingTransactions: 0, @@ -287,7 +297,7 @@ func setupBatcher(t *testing.T, sys *System, conductors map[string]*conductor) { ApproxComprRatio: 0.4, SubSafetyMargin: 4, PollInterval: 1 * time.Second, - TxMgrConfig: newTxMgrConfig(sys.EthInstances["l1"].WSEndpoint(), sys.Cfg.Secrets.Batcher), + TxMgrConfig: setuputils.NewTxMgrConfig(sys.EthInstances["l1"].UserRPC(), sys.Cfg.Secrets.Batcher), LogConfig: oplog.CLIConfig{ Level: log.LevelDebug, Format: oplog.FormatText, @@ -306,8 +316,8 @@ func setupBatcher(t *testing.T, sys *System, conductors map[string]*conductor) { sys.BatchSubmitter = batcher } -func sequencerFailoverSystemConfig(t *testing.T, ports map[string]int) SystemConfig { - cfg := DefaultSystemConfig(t) +func sequencerFailoverSystemConfig(t *testing.T, ports map[string]int) e2esys.SystemConfig { + cfg := e2esys.EcotoneSystemConfig(t, new(hexutil.Uint64)) delete(cfg.Nodes, "sequencer") cfg.Nodes[Sequencer1Name] = sequencerCfg(ports[Sequencer1Name]) cfg.Nodes[Sequencer2Name] = sequencerCfg(ports[Sequencer2Name]) @@ -324,9 +334,6 @@ func sequencerFailoverSystemConfig(t *testing.T, ports map[string]int) SystemCon Sequencer3Name: {VerifierName, Sequencer1Name}, VerifierName: {Sequencer1Name, Sequencer2Name}, } - offset := hexutil.Uint64(0) - cfg.DeployConfig.L2GenesisDeltaTimeOffset = &offset - cfg.DeployConfig.L2GenesisEcotoneTimeOffset = &offset return cfg } @@ -356,30 +363,32 @@ func sequencerCfg(rpcPort int) *rollupNode.Config { } func waitForLeadership(t *testing.T, c *conductor) error { + ctx, cancel := context.WithTimeout(context.Background(), 30*time.Second) + defer cancel() + condition := func() (bool, error) { - isLeader, err := c.client.Leader(context.Background()) + isLeader, err := c.client.Leader(ctx) if err != nil { return false, err } return isLeader, nil } - ctx, cancel := context.WithTimeout(context.Background(), 30*time.Second) - defer cancel() return wait.For(ctx, 1*time.Second, condition) } -func waitForLeadershipChange(t *testing.T, prev *conductor, prevID string, conductors map[string]*conductor, sys *System) string { +func waitForLeadershipChange(t *testing.T, prev *conductor, prevID string, conductors map[string]*conductor, sys *e2esys.System) string { + ctx, cancel := context.WithTimeout(context.Background(), 30*time.Second) + defer cancel() + condition := func() (bool, error) { - isLeader, err := prev.client.Leader(context.Background()) + isLeader, err := prev.client.Leader(ctx) if err != nil { return false, err } return !isLeader, nil } - ctx, cancel := context.WithTimeout(context.Background(), 30*time.Second) - defer cancel() err := wait.For(ctx, 1*time.Second, condition) require.NoError(t, err) @@ -394,16 +403,17 @@ func waitForLeadershipChange(t *testing.T, prev *conductor, prevID string, condu } func waitForSequencerStatusChange(t *testing.T, rollupClient *sources.RollupClient, active bool) error { + ctx, cancel := context.WithTimeout(context.Background(), 30*time.Second) + defer cancel() + condition := func() (bool, error) { - isActive, err := rollupClient.SequencerActive(context.Background()) + isActive, err := rollupClient.SequencerActive(ctx) if err != nil { return false, err } return isActive == active, nil } - ctx, cancel := context.WithTimeout(context.Background(), 30*time.Second) - defer cancel() return wait.For(ctx, 1*time.Second, condition) } @@ -481,10 +491,12 @@ func findFollower(t *testing.T, conductors map[string]*conductor) (string, *cond return "", nil } -func ensureOnlyOneLeader(t *testing.T, sys *System, conductors map[string]*conductor) { +func ensureOnlyOneLeader(t *testing.T, sys *e2esys.System, conductors map[string]*conductor) { + ctx, cancel := context.WithTimeout(context.Background(), 30*time.Second) + defer cancel() + condition := func() (bool, error) { leaders := 0 - ctx := context.Background() for name, con := range conductors { leader, err := con.client.Leader(ctx) if err != nil { @@ -501,8 +513,13 @@ func ensureOnlyOneLeader(t *testing.T, sys *System, conductors map[string]*condu } return leaders == 1, nil } - - ctx, cancel := context.WithTimeout(context.Background(), 30*time.Second) - defer cancel() require.NoError(t, wait.For(ctx, 1*time.Second, condition)) } + +func memberIDs(membership *consensus.ClusterMembership) []string { + ids := make([]string, 0, len(membership.Servers)) + for _, member := range membership.Servers { + ids = append(ids, member.ID) + } + return ids +} diff --git a/op-e2e/system/conductor/sequencer_failover_test.go b/op-e2e/system/conductor/sequencer_failover_test.go new file mode 100644 index 000000000000..1b49b989654f --- /dev/null +++ b/op-e2e/system/conductor/sequencer_failover_test.go @@ -0,0 +1,240 @@ +package conductor + +import ( + "context" + "sort" + "testing" + + "github.com/ethereum/go-ethereum/common" + "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) { + _, conductors, cleanup := setupSequencerFailoverTest(t) + defer cleanup() + + require.Equal(t, 3, len(conductors), "Expected 3 conductors") + for _, con := range conductors { + require.NotNil(t, con, "Expected conductor to be non-nil") + } +} + +// [Category: conductor rpc] +// In this test, we test all rpcs exposed by conductor. +func TestSequencerFailover_ConductorRPC(t *testing.T) { + ctx := context.Background() + sys, conductors, cleanup := setupSequencerFailoverTest(t) + defer cleanup() + + // SequencerHealthy, Leader, AddServerAsVoter are used in setup already. + + // Test ClusterMembership + t.Log("Testing ClusterMembership") + c1 := conductors[Sequencer1Name] + c2 := conductors[Sequencer2Name] + c3 := conductors[Sequencer3Name] + membership, err := c1.client.ClusterMembership(ctx) + require.NoError(t, err) + require.Equal(t, 3, len(membership.Servers), "Expected 3 members in cluster") + ids := make([]string, 0) + for _, member := range membership.Servers { + ids = append(ids, member.ID) + require.Equal(t, consensus.Voter, member.Suffrage, "Expected all members to be voters") + } + sort.Strings(ids) + require.Equal(t, []string{Sequencer1Name, Sequencer2Name, Sequencer3Name}, ids, "Expected all sequencers to be in cluster") + + // Test Active & Pause & Resume & Stop + t.Log("Testing Active & Pause & Resume") + active, err := c1.client.Active(ctx) + require.NoError(t, err) + require.True(t, active, "Expected conductor to be active") + + err = c1.client.Pause(ctx) + require.NoError(t, err) + active, err = c1.client.Active(ctx) + require.NoError(t, err) + require.False(t, active, "Expected conductor to be paused") + + err = c1.client.Resume(ctx) + require.NoError(t, err) + active, err = c1.client.Active(ctx) + require.NoError(t, err) + require.True(t, active, "Expected conductor to be active") + + t.Log("Testing LeaderWithID") + leader1, err := c1.client.LeaderWithID(ctx) + require.NoError(t, err) + leader2, err := c2.client.LeaderWithID(ctx) + require.NoError(t, err) + leader3, err := c3.client.LeaderWithID(ctx) + require.NoError(t, err) + require.Equal(t, leader1.ID, leader2.ID, "Expected leader ID to be the same") + require.Equal(t, leader1.ID, leader3.ID, "Expected leader ID to be the same") + + t.Log("Testing TransferLeader") + lid, leader := findLeader(t, conductors) + err = leader.client.TransferLeader(ctx) + require.NoError(t, err, "Expected leader to transfer leadership to another node") + _ = waitForLeadershipChange(t, leader, lid, conductors, sys) + + // old leader now became follower, we're trying to transfer leadership directly back to it. + t.Log("Testing TransferLeaderToServer") + fid, follower := lid, leader + lid, leader = findLeader(t, conductors) + err = leader.client.TransferLeaderToServer(ctx, fid, follower.ConsensusEndpoint()) + require.NoError(t, err, "Expected leader to transfer leadership to follower") + newID := waitForLeadershipChange(t, leader, lid, conductors, sys) + require.Equal(t, fid, newID, "Expected leader to transfer to %s", fid) + + leader = follower + + // 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, err := retry.Do[*conductor](ctx, maxSetupRetries, retryStrategy, func() (*conductor, error) { + return setupConductor( + t, VerifierName, t.TempDir(), + sys.RollupEndpoint(Sequencer3Name).RPC(), + sys.NodeEndpoint(Sequencer3Name).RPC(), + findAvailablePort(t), + false, + *sys.RollupConfig, + ) + }) + require.NoError(t, err) + defer func() { + err = nonvoter.service.Stop(ctx) + require.NoError(t, err) + }() + + membership, err = leader.client.ClusterMembership(ctx) + require.NoError(t, err) + + err = leader.client.AddServerAsNonvoter(ctx, VerifierName, nonvoter.ConsensusEndpoint(), membership.Version-1) + require.ErrorContains(t, err, "configuration changed since", "Expected leader to fail to add nonvoter due to version mismatch") + membership, err = leader.client.ClusterMembership(ctx) + require.NoError(t, err) + require.Equal(t, 3, len(membership.Servers), "Expected 3 members in cluster") + + err = leader.client.AddServerAsNonvoter(ctx, VerifierName, nonvoter.ConsensusEndpoint(), 0) + require.NoError(t, err, "Expected leader to add non-voter") + membership, err = leader.client.ClusterMembership(ctx) + require.NoError(t, err) + require.Equal(t, 4, len(membership.Servers), "Expected 4 members in cluster") + require.Equal(t, consensus.Nonvoter, membership.Servers[3].Suffrage, "Expected last member to be non-voter") + + t.Log("Testing RemoveServer, call remove on follower, expected to fail") + lid, leader = findLeader(t, conductors) + fid, follower = findFollower(t, conductors) + err = follower.client.RemoveServer(ctx, lid, membership.Version) + require.ErrorContains(t, err, "node is not the leader", "Expected follower to fail to remove leader") + membership, err = c1.client.ClusterMembership(ctx) + require.NoError(t, err) + require.Equal(t, 4, len(membership.Servers), "Expected 4 members in cluster") + + t.Log("Testing RemoveServer, call remove on leader, expect non-voter to be removed") + err = leader.client.RemoveServer(ctx, VerifierName, membership.Version) + require.NoError(t, err, "Expected leader to remove non-voter") + membership, err = c1.client.ClusterMembership(ctx) + require.NoError(t, err) + require.Equal(t, 3, len(membership.Servers), "Expected 2 members in cluster after removal") + require.NotContains(t, memberIDs(membership), VerifierName, "Expected follower to be removed from cluster") + + t.Log("Testing RemoveServer, call remove on leader with incorrect version, expect voter not to be removed") + err = leader.client.RemoveServer(ctx, fid, membership.Version-1) + require.ErrorContains(t, err, "configuration changed since", "Expected leader to fail to remove follower due to version mismatch") + membership, err = c1.client.ClusterMembership(ctx) + require.NoError(t, err) + require.Equal(t, 3, len(membership.Servers), "Expected 3 members in cluster after failed removal") + require.Contains(t, memberIDs(membership), fid, "Expected follower to not be removed from cluster") + + t.Log("Testing RemoveServer, call remove on leader, expect voter to be removed") + err = leader.client.RemoveServer(ctx, fid, membership.Version) + require.NoError(t, err, "Expected leader to remove follower") + membership, err = c1.client.ClusterMembership(ctx) + require.NoError(t, err) + require.Equal(t, 2, len(membership.Servers), "Expected 2 members in cluster after removal") + require.NotContains(t, memberIDs(membership), fid, "Expected follower to be removed from cluster") + + // Testing the stop api + t.Log("Testing Stop API") + err = c1.client.Stop(ctx) + require.NoError(t, err) + _, err = c1.client.Stopped(ctx) + require.Error(t, err, "Expected no connection to the conductor since it's stopped") +} + +// [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, cleanup := setupSequencerFailoverTest(t) + defer cleanup() + + ctx := context.Background() + leaderId, leader := findLeader(t, conductors) + err := sys.RollupNodes[leaderId].Stop(ctx) // Stop the current leader sequencer + require.NoError(t, err) + + // The leadership change should occur with no errors + newID := waitForLeadershipChange(t, leader, leaderId, conductors, sys) + require.NotEqual(t, leaderId, newID, "Expected leader to change") + + // Confirm the new leader is different from the old leader + newLeaderId, _ := findLeader(t, conductors) + require.NotEqual(t, leaderId, newLeaderId, "Expected leader to change") + + // Check that the sequencer is healthy + require.True(t, healthy(t, ctx, conductors[newLeaderId])) + + // Check if the new leader is sequencing + active, err := sys.RollupClient(newLeaderId).SequencerActive(ctx) + require.NoError(t, err) + require.True(t, active, "Expected new leader to be sequencing") +} + +// [Category: Disaster Recovery] +// Test that sequencer can successfully be started with the overrideLeader flag set to true. +func TestSequencerFailover_DisasterRecovery_OverrideLeader(t *testing.T) { + sys, conductors, cleanup := setupSequencerFailoverTest(t) + defer cleanup() + + // randomly stop 2 nodes in the cluster to simulate a disaster. + ctx := context.Background() + err := conductors[Sequencer1Name].service.Stop(ctx) + require.NoError(t, err) + err = conductors[Sequencer2Name].service.Stop(ctx) + require.NoError(t, err) + + require.False(t, conductors[Sequencer3Name].service.Leader(ctx), "Expected sequencer to not be the leader") + active, err := sys.RollupClient(Sequencer3Name).SequencerActive(ctx) + require.NoError(t, err) + require.False(t, active, "Expected sequencer to be inactive") + + // Start sequencer without the overrideLeader flag set to true, should fail + err = sys.RollupClient(Sequencer3Name).StartSequencer(ctx, common.Hash{1, 2, 3}) + require.ErrorContains(t, err, "sequencer is not the leader, aborting", "Expected sequencer to fail to start") + + // Start sequencer with the overrideLeader flag set to true, should succeed + err = sys.RollupClient(Sequencer3Name).OverrideLeader(ctx) + require.NoError(t, err) + blk, err := sys.NodeClient(Sequencer3Name).BlockByNumber(ctx, nil) + require.NoError(t, err) + err = sys.RollupClient(Sequencer3Name).StartSequencer(ctx, blk.Hash()) + require.NoError(t, err) + + active, err = sys.RollupClient(Sequencer3Name).SequencerActive(ctx) + require.NoError(t, err) + require.True(t, active, "Expected sequencer to be active") + + err = conductors[Sequencer3Name].client.OverrideLeader(ctx) + require.NoError(t, err) + leader, err := conductors[Sequencer3Name].client.Leader(ctx) + require.NoError(t, err) + require.True(t, leader, "Expected conductor to return leader true after override") +} diff --git a/op-e2e/system_adminrpc_test.go b/op-e2e/system/conductor/system_adminrpc_test.go similarity index 82% rename from op-e2e/system_adminrpc_test.go rename to op-e2e/system/conductor/system_adminrpc_test.go index e7c0af673b84..5501ece79fff 100644 --- a/op-e2e/system_adminrpc_test.go +++ b/op-e2e/system/conductor/system_adminrpc_test.go @@ -1,4 +1,4 @@ -package op_e2e +package conductor import ( "context" @@ -6,6 +6,11 @@ import ( "testing" "time" + op_e2e "github.com/ethereum-optimism/optimism/op-e2e" + + "github.com/ethereum-optimism/optimism/op-e2e/system/e2esys" + "github.com/ethereum/go-ethereum/ethclient" + "github.com/ethereum/go-ethereum/common" "github.com/ethereum/go-ethereum/rpc" "github.com/stretchr/testify/require" @@ -18,19 +23,15 @@ import ( ) func TestStopStartSequencer(t *testing.T) { - InitParallel(t) + op_e2e.InitParallel(t) - cfg := DefaultSystemConfig(t) + cfg := e2esys.DefaultSystemConfig(t) sys, err := cfg.Start(t) require.Nil(t, err, "Error starting up system") - defer sys.Close() - l2Seq := sys.Clients["sequencer"] - rollupNode := sys.RollupNodes["sequencer"] + l2Seq := sys.NodeClient("sequencer") - nodeRPC, err := rpc.DialContext(context.Background(), rollupNode.HTTPEndpoint()) - require.Nil(t, err, "Error dialing node") - rollupClient := sources.NewRollupClient(client.NewBaseRPCClient(nodeRPC)) + rollupClient := sys.RollupClient("sequencer") ctx, cancel := context.WithTimeout(context.Background(), 5*time.Second) defer cancel() @@ -78,24 +79,31 @@ func TestStopStartSequencer(t *testing.T) { ) } +func latestBlock(t *testing.T, client *ethclient.Client) uint64 { + ctx, cancel := context.WithTimeout(context.Background(), 30*time.Second) + defer cancel() + blockAfter, err := client.BlockNumber(ctx) + require.Nil(t, err, "Error getting latest block") + return blockAfter +} + func TestPersistSequencerStateWhenChanged(t *testing.T) { - InitParallel(t) + op_e2e.InitParallel(t) ctx := context.Background() dir := t.TempDir() stateFile := dir + "/state.json" - cfg := DefaultSystemConfig(t) + cfg := e2esys.DefaultSystemConfig(t) // We don't need a verifier - just the sequencer is enough delete(cfg.Nodes, "verifier") cfg.Nodes["sequencer"].ConfigPersistence = node.NewConfigPersistence(stateFile) sys, err := cfg.Start(t) require.NoError(t, err) - defer sys.Close() assertPersistedSequencerState(t, stateFile, node.StateStarted) - rollupRPCClient, err := rpc.DialContext(ctx, sys.RollupNodes["sequencer"].HTTPEndpoint()) + rollupRPCClient, err := rpc.DialContext(ctx, sys.RollupNodes["sequencer"].UserRPC().RPC()) require.Nil(t, err) rollupClient := sources.NewRollupClient(client.NewBaseRPCClient(rollupRPCClient)) @@ -109,7 +117,7 @@ func TestPersistSequencerStateWhenChanged(t *testing.T) { } func TestLoadSequencerStateOnStarted_Stopped(t *testing.T) { - InitParallel(t) + op_e2e.InitParallel(t) ctx := context.Background() dir := t.TempDir() stateFile := dir + "/state.json" @@ -118,7 +126,7 @@ func TestLoadSequencerStateOnStarted_Stopped(t *testing.T) { configReader := node.NewConfigPersistence(stateFile) require.NoError(t, configReader.SequencerStopped()) - cfg := DefaultSystemConfig(t) + cfg := e2esys.DefaultSystemConfig(t) // We don't need a verifier - just the sequencer is enough delete(cfg.Nodes, "verifier") seqCfg := cfg.Nodes["sequencer"] @@ -126,9 +134,8 @@ func TestLoadSequencerStateOnStarted_Stopped(t *testing.T) { sys, err := cfg.Start(t) require.NoError(t, err) - defer sys.Close() - rollupRPCClient, err := rpc.DialContext(ctx, sys.RollupNodes["sequencer"].HTTPEndpoint()) + rollupRPCClient, err := rpc.DialContext(ctx, sys.RollupNodes["sequencer"].UserRPC().RPC()) require.Nil(t, err) rollupClient := sources.NewRollupClient(client.NewBaseRPCClient(rollupRPCClient)) @@ -142,7 +149,7 @@ func TestLoadSequencerStateOnStarted_Stopped(t *testing.T) { } func TestLoadSequencerStateOnStarted_Started(t *testing.T) { - InitParallel(t) + op_e2e.InitParallel(t) ctx := context.Background() dir := t.TempDir() stateFile := dir + "/state.json" @@ -151,7 +158,7 @@ func TestLoadSequencerStateOnStarted_Started(t *testing.T) { configReader := node.NewConfigPersistence(stateFile) require.NoError(t, configReader.SequencerStarted()) - cfg := DefaultSystemConfig(t) + cfg := e2esys.DefaultSystemConfig(t) // We don't need a verifier - just the sequencer is enough delete(cfg.Nodes, "verifier") seqCfg := cfg.Nodes["sequencer"] @@ -160,9 +167,8 @@ func TestLoadSequencerStateOnStarted_Started(t *testing.T) { sys, err := cfg.Start(t) require.NoError(t, err) - defer sys.Close() - rollupRPCClient, err := rpc.DialContext(ctx, sys.RollupNodes["sequencer"].HTTPEndpoint()) + rollupRPCClient, err := rpc.DialContext(ctx, sys.RollupNodes["sequencer"].UserRPC().RPC()) require.Nil(t, err) rollupClient := sources.NewRollupClient(client.NewBaseRPCClient(rollupRPCClient)) @@ -176,19 +182,18 @@ func TestLoadSequencerStateOnStarted_Started(t *testing.T) { } func TestPostUnsafePayload(t *testing.T) { - InitParallel(t) + op_e2e.InitParallel(t) ctx := context.Background() - cfg := DefaultSystemConfig(t) + cfg := e2esys.DefaultSystemConfig(t) cfg.Nodes["verifier"].RPC.EnableAdmin = true cfg.DisableBatcher = true sys, err := cfg.Start(t) require.NoError(t, err) - defer sys.Close() - l2Seq := sys.Clients["sequencer"] - l2Ver := sys.Clients["verifier"] + l2Seq := sys.NodeClient("sequencer") + l2Ver := sys.NodeClient("verifier") rollupClient := sys.RollupClient("verifier") require.NoError(t, wait.ForBlock(ctx, l2Seq, 2), "Chain did not advance after starting sequencer") @@ -198,19 +203,19 @@ func TestPostUnsafePayload(t *testing.T) { blockNumberOne, err := l2Seq.BlockByNumber(ctx, big.NewInt(1)) require.NoError(t, err) - payload, err := eth.BlockAsPayload(blockNumberOne, sys.RollupConfig.CanyonTime) + payloadEnv, err := eth.BlockAsPayloadEnv(blockNumberOne, sys.RollupConfig.CanyonTime) require.NoError(t, err) - err = rollupClient.PostUnsafePayload(ctx, ð.ExecutionPayloadEnvelope{ExecutionPayload: payload}) + err = rollupClient.PostUnsafePayload(ctx, payloadEnv) require.NoError(t, err) require.NoError(t, wait.ForUnsafeBlock(ctx, rollupClient, 1), "Chain did not advance after posting payload") // Test validation blockNumberTwo, err := l2Seq.BlockByNumber(ctx, big.NewInt(2)) require.NoError(t, err) - payload, err = eth.BlockAsPayload(blockNumberTwo, sys.RollupConfig.CanyonTime) + payloadEnv, err = eth.BlockAsPayloadEnv(blockNumberTwo, sys.RollupConfig.CanyonTime) require.NoError(t, err) - payload.BlockHash = common.Hash{0xaa} - err = rollupClient.PostUnsafePayload(ctx, ð.ExecutionPayloadEnvelope{ExecutionPayload: payload}) + payloadEnv.ExecutionPayload.BlockHash = common.Hash{0xaa} + err = rollupClient.PostUnsafePayload(ctx, payloadEnv) require.ErrorContains(t, err, "payload has bad block hash") } diff --git a/op-e2e/system/contracts/artifactsfs_test.go b/op-e2e/system/contracts/artifactsfs_test.go new file mode 100644 index 000000000000..a52680a0b2d1 --- /dev/null +++ b/op-e2e/system/contracts/artifactsfs_test.go @@ -0,0 +1,46 @@ +package contracts + +import ( + "errors" + "testing" + + op_e2e "github.com/ethereum-optimism/optimism/op-e2e" + + "github.com/stretchr/testify/require" + + "github.com/ethereum/go-ethereum/log" + + "github.com/ethereum-optimism/optimism/op-chain-ops/foundry" + "github.com/ethereum-optimism/optimism/op-service/testlog" +) + +func TestArtifacts(t *testing.T) { + op_e2e.InitParallel(t) + logger := testlog.Logger(t, log.LevelWarn) // lower this log level to get verbose test dump of all artifacts + af := foundry.OpenArtifactsDir("../../../packages/contracts-bedrock/forge-artifacts") + artifacts, err := af.ListArtifacts() + require.NoError(t, err) + require.NotEmpty(t, artifacts) + for _, name := range artifacts { + contracts, err := af.ListContracts(name) + require.NoError(t, err, "failed to list %s", name) + require.NotEmpty(t, contracts) + for _, contract := range contracts { + artifact, err := af.ReadArtifact(name, contract) + if err != nil { + if errors.Is(err, foundry.ErrLinkingUnsupported) { + logger.Info("linking not supported", "name", name, "contract", contract, "err", err) + continue + } + require.NoError(t, err, "failed to read artifact %s / %s", name, contract) + } + logger.Info("artifact", + "name", name, + "contract", contract, + "compiler", artifact.Metadata.Compiler.Version, + "sources", len(artifact.Metadata.Sources), + "evmVersion", artifact.Metadata.Settings.EVMVersion, + ) + } + } +} diff --git a/op-e2e/system/contracts/contracts_test.go b/op-e2e/system/contracts/contracts_test.go new file mode 100644 index 000000000000..da4a081a90ca --- /dev/null +++ b/op-e2e/system/contracts/contracts_test.go @@ -0,0 +1,11 @@ +package contracts + +import ( + "testing" + + op_e2e "github.com/ethereum-optimism/optimism/op-e2e" +) + +func TestMain(m *testing.M) { + op_e2e.RunMain(m) +} diff --git a/op-e2e/brotli_batcher_test.go b/op-e2e/system/da/brotli_batcher_test.go similarity index 82% rename from op-e2e/brotli_batcher_test.go rename to op-e2e/system/da/brotli_batcher_test.go index 97211c471ba0..b44bd5af1623 100644 --- a/op-e2e/brotli_batcher_test.go +++ b/op-e2e/system/da/brotli_batcher_test.go @@ -1,4 +1,4 @@ -package op_e2e +package da import ( "context" @@ -7,25 +7,26 @@ import ( "testing" "time" + op_e2e "github.com/ethereum-optimism/optimism/op-e2e" + + "github.com/ethereum-optimism/optimism/op-e2e/system/e2esys" + "github.com/ethereum-optimism/optimism/op-e2e/system/helpers" + "github.com/stretchr/testify/require" + 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/testlog" "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"] +func setupAliceAccount(t *testing.T, cfg e2esys.SystemConfig, sys *e2esys.System, ethPrivKey *ecdsa.PrivateKey) { + l1Client := sys.NodeClient("l1") + l2Verif := sys.NodeClient("verifier") // Send Transaction & wait for success fromAddr := cfg.Secrets.Addresses().Alice @@ -41,7 +42,7 @@ func setupAliceAccount(t *testing.T, cfg SystemConfig, sys *System, ethPrivKey * require.NoError(t, err) mintAmount := big.NewInt(1_000_000_000_000) opts.Value = mintAmount - SendDepositTx(t, cfg, l1Client, l2Verif, opts, func(l2Opts *DepositTxOpts) {}) + helpers.SendDepositTx(t, cfg, l1Client, l2Verif, opts, func(l2Opts *helpers.DepositTxOpts) {}) // Confirm balance ctx, cancel = context.WithTimeout(context.Background(), 15*time.Second) @@ -54,9 +55,9 @@ func setupAliceAccount(t *testing.T, cfg SystemConfig, sys *System, ethPrivKey * } func TestBrotliBatcherFjord(t *testing.T) { - InitParallel(t) + op_e2e.InitParallel(t) - cfg := DefaultSystemConfig(t) + cfg := e2esys.DefaultSystemConfig(t) cfg.DataAvailabilityType = batcherFlags.BlobsType genesisActivation := hexutil.Uint64(0) @@ -66,22 +67,21 @@ func TestBrotliBatcherFjord(t *testing.T) { cfg.DeployConfig.L2GenesisFjordTimeOffset = &genesisActivation // set up batcher to use brotli - sys, err := cfg.Start(t, SystemConfigOption{"compressionAlgo", "brotli", nil}) + sys, err := cfg.Start(t, e2esys.SystemConfigOption{Key: "compressionAlgo", Role: "brotli", Action: 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"] + l2Seq := sys.NodeClient("sequencer") + l2Verif := sys.NodeClient("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) { + receipt := helpers.SendL2Tx(t, cfg, l2Seq, ethPrivKey, func(opts *helpers.TxOpts) { opts.Value = big.NewInt(1_000_000_000) opts.Nonce = 1 // Already have deposit opts.ToAddr = &common.Address{0xff, 0xff} @@ -101,9 +101,7 @@ func TestBrotliBatcherFjord(t *testing.T) { 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)) + rollupClient := sys.RollupClient("sequencer") // basic check that sync status works seqStatus, err := rollupClient.SyncStatus(context.Background()) require.NoError(t, err) diff --git a/op-e2e/system/da/da_test.go b/op-e2e/system/da/da_test.go new file mode 100644 index 000000000000..ae5606e8df53 --- /dev/null +++ b/op-e2e/system/da/da_test.go @@ -0,0 +1,11 @@ +package da + +import ( + "testing" + + op_e2e "github.com/ethereum-optimism/optimism/op-e2e" +) + +func TestMain(m *testing.M) { + op_e2e.RunMain(m) +} diff --git a/op-e2e/system/da/dencun_test.go b/op-e2e/system/da/dencun_test.go new file mode 100644 index 000000000000..4bdaee540c00 --- /dev/null +++ b/op-e2e/system/da/dencun_test.go @@ -0,0 +1,53 @@ +package da + +import ( + "context" + "testing" + "time" + + op_e2e "github.com/ethereum-optimism/optimism/op-e2e" + + "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-e2e/system/e2esys" + "github.com/ethereum/go-ethereum/common/hexutil" + "github.com/ethereum/go-ethereum/core/types" + "github.com/stretchr/testify/require" +) + +// TestSystemE2EDencunAtGenesis tests if L2 finalizes when blobs are present on L1 +func TestSystemE2EDencunAtGenesisWithBlobs(t *testing.T) { + op_e2e.InitParallel(t) + + ctx, cancel := context.WithCancel(context.Background()) + defer cancel() + + cfg := e2esys.DefaultSystemConfig(t) + cfg.DeployConfig.L1CancunTimeOffset = new(hexutil.Uint64) + + sys, err := cfg.Start(t) + require.Nil(t, err, "Error starting up system") + + // send a blob-containing txn on l1 + ethPrivKey := sys.Cfg.Secrets.Alice + txData := transactions.CreateEmptyBlobTx(true, sys.Cfg.L1ChainIDBig().Uint64()) + tx := types.MustSignNewTx(ethPrivKey, types.LatestSignerForChainID(cfg.L1ChainIDBig()), txData) + // send blob-containing txn + sendCtx, sendCancel := context.WithTimeout(context.Background(), 15*time.Second) + defer sendCancel() + + l1Client := sys.NodeClient("l1") + err = l1Client.SendTransaction(sendCtx, tx) + require.NoError(t, err, "Sending L1 empty blob tx") + // Wait for transaction on L1 + blockContainsBlob, err := wait.ForReceiptOK(ctx, l1Client, tx.Hash()) + require.Nil(t, err, "Waiting for blob tx on L1") + // end sending blob-containing txns on l1 + l2Client := sys.NodeClient("sequencer") + 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 = geth.WaitForBlockToBeSafe(finalizedBlock.Header().Number, l2Client, finalizationTimeout) + require.Nil(t, err, "Waiting for safety of L2 block") +} diff --git a/op-e2e/system/da/eip4844_test.go b/op-e2e/system/da/eip4844_test.go new file mode 100644 index 000000000000..332da11f9d6f --- /dev/null +++ b/op-e2e/system/da/eip4844_test.go @@ -0,0 +1,332 @@ +package da + +import ( + "context" + "math/big" + "math/rand" + "testing" + "time" + + op_e2e "github.com/ethereum-optimism/optimism/op-e2e" + + "github.com/ethereum-optimism/optimism/op-e2e/system/e2esys" + "github.com/ethereum-optimism/optimism/op-e2e/system/helpers" + + "github.com/stretchr/testify/assert" + "github.com/stretchr/testify/require" + + batcherFlags "github.com/ethereum-optimism/optimism/op-batcher/flags" + "github.com/ethereum-optimism/optimism/op-e2e/bindings" + gethutils "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/rollup/derive" + "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/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/core/types" + "github.com/ethereum/go-ethereum/log" + "github.com/ethereum/go-ethereum/params" +) + +// TestSystem4844E2E runs the SystemE2E test with 4844 enabled on L1, and active on the rollup in +// the op-batcher and verifier. It submits a txpool-blocking transaction before running +// each test to ensure the batcher is able to clear it. +func TestSystem4844E2E(t *testing.T) { + t.Run("calldata", func(t *testing.T) { testSystem4844E2E(t, false, batcherFlags.CalldataType) }) + t.Run("single-blob", func(t *testing.T) { testSystem4844E2E(t, false, batcherFlags.BlobsType) }) + t.Run("multi-blob", func(t *testing.T) { testSystem4844E2E(t, true, batcherFlags.BlobsType) }) +} + +func testSystem4844E2E(t *testing.T, multiBlob bool, daType batcherFlags.DataAvailabilityType) { + op_e2e.InitParallel(t) + + cfg := e2esys.EcotoneSystemConfig(t, new(hexutil.Uint64)) + cfg.DataAvailabilityType = daType + cfg.BatcherBatchType = derive.SpanBatchType + cfg.DeployConfig.L1GenesisBlockBaseFeePerGas = (*hexutil.Big)(big.NewInt(7000)) + + const maxBlobs = 6 + var maxL1TxSize int + if multiBlob { + cfg.BatcherTargetNumFrames = 6 + cfg.BatcherUseMaxTxSizeForBlobs = true + // leads to 6 blobs for an L2 block with a user tx with 400 random bytes + // while all other L2 blocks take 1 blob (deposit tx) + maxL1TxSize = derive.FrameV0OverHeadSize + 100 + cfg.BatcherMaxL1TxSizeBytes = uint64(maxL1TxSize) + } + + // For each test we intentionally block the batcher by submitting an incompatible tx type up + // front. This lets us test the ability for the batcher to clear out the incompatible + // transaction. The hook used here makes sure we make the jamming call before batch submission + // is started, as is required by the function. + var jamChan chan error + jamCtx, jamCancel := context.WithTimeout(context.Background(), 20*time.Second) + action := e2esys.SystemConfigOption{ + Key: "beforeBatcherStart", + Action: func(cfg *e2esys.SystemConfig, s *e2esys.System) { + driver := s.BatchSubmitter.TestDriver() + err := driver.JamTxPool(jamCtx) + require.NoError(t, err) + jamChan = make(chan error) + go func() { + jamChan <- driver.WaitOnJammingTx(jamCtx) + }() + }, + } + defer func() { + if jamChan != nil { // only check if we actually got to a successful batcher start + jamCancel() + require.NoError(t, <-jamChan, "jam tx error") + } + }() + + sys, err := cfg.Start(t, action) + require.NoError(t, err, "Error starting up system") + + 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) + + l1Client := sys.NodeClient("l1") + l2Seq := sys.NodeClient("sequencer") + l2Verif := sys.NodeClient("verifier") + + // Transactor Account + ethPrivKey := cfg.Secrets.Alice + + // Send Transaction & wait for success + fromAddr := cfg.Secrets.Addresses().Alice + log.Info("alice", "addr", fromAddr) + + ctx, cancel := context.WithTimeout(context.Background(), 20*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 + helpers.SendDepositTx(t, cfg, l1Client, l2Verif, opts, func(l2Opts *helpers.DepositTxOpts) {}) + + // Confirm balance + ctx2, cancel2 := context.WithTimeout(context.Background(), 20*time.Second) + defer cancel2() + endBalance, err := wait.ForBalanceChange(ctx2, 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") + + // Submit TX to L2 sequencer node + receipt := helpers.SendL2Tx(t, cfg, l2Seq, ethPrivKey, func(opts *helpers.TxOpts) { + opts.Value = big.NewInt(1_000_000_000) + opts.Nonce = 1 // Already have deposit + opts.ToAddr = &common.Address{0xff, 0xff} + // put some random data in the tx to make it fill up 6 blobs (multi-blob case) + opts.Data = testutils.RandomData(rand.New(rand.NewSource(420)), 400) + 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") + + rollupClient := sys.RollupClient("sequencer") + // basic check that sync status works + seqStatus, err := rollupClient.SyncStatus(context.Background()) + require.NoError(t, err) + require.LessOrEqual(t, seqBlock.NumberU64(), seqStatus.UnsafeL2.Number) + // basic check that version endpoint works + seqVersion, err := rollupClient.Version(context.Background()) + require.NoError(t, err) + require.NotEqual(t, "", seqVersion) + + // quick check that the batch submitter works + require.EventuallyWithT(t, func(ct *assert.CollectT) { + // wait for chain to be marked as "safe" (i.e. confirm batch-submission works) + stat, err := rollupClient.SyncStatus(context.Background()) + require.NoError(ct, err) + require.GreaterOrEqual(ct, 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 + 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") + + // find L1 block that contained the blob(s) batch tx + tip, err := l1Client.HeaderByNumber(context.Background(), nil) + require.NoError(t, err) + var blobTx *types.Transaction + blobBlock, err := gethutils.FindBlock(l1Client, int(tip.Number.Int64()), 0, 5*time.Second, + func(b *types.Block) (bool, error) { + for _, tx := range b.Transactions() { + if tx.To().Cmp(cfg.DeployConfig.BatchInboxAddress) != 0 { + continue + } + switch daType { + case batcherFlags.CalldataType: + if len(tx.BlobHashes()) == 0 { + return true, nil + } + case batcherFlags.BlobsType: + if len(tx.BlobHashes()) == 0 { + continue + } + if !multiBlob || len(tx.BlobHashes()) > 1 { + blobTx = tx + return true, nil + } + } + } + return false, nil + }) + require.NoError(t, err) + + if daType == batcherFlags.CalldataType { + return + } + // make sure blobs are as expected + numBlobs := len(blobTx.BlobHashes()) + if !multiBlob { + require.NotZero(t, numBlobs, "single-blob: expected to find L1 blob tx") + } else { + require.Equal(t, maxBlobs, numBlobs, "multi-blob: expected to find L1 blob tx with 6 blobs") + // blob tx should have filled up all but last blob + bcl := sys.L1BeaconHTTPClient() + hashes := toIndexedBlobHashes(blobTx.BlobHashes()...) + sidecars, err := bcl.BeaconBlobSideCars(context.Background(), false, sys.L1Slot(blobBlock.Time()), hashes) + require.NoError(t, err) + require.Len(t, sidecars.Data, maxBlobs) + for i := 0; i < maxBlobs-1; i++ { + data, err := sidecars.Data[i].Blob.ToData() + require.NoError(t, err) + require.Len(t, data, maxL1TxSize) + } + // last blob should only be partially filled + data, err := sidecars.Data[maxBlobs-1].Blob.ToData() + require.NoError(t, err) + require.Less(t, len(data), maxL1TxSize) + } +} + +func toIndexedBlobHashes(hs ...common.Hash) []eth.IndexedBlobHash { + hashes := make([]eth.IndexedBlobHash, 0, len(hs)) + for i, hash := range hs { + hashes = append(hashes, eth.IndexedBlobHash{Index: uint64(i), Hash: hash}) + } + return hashes +} + +// TestBatcherAutoDA tests that the batcher with Auto data availability type +// correctly chooses the cheaper Ethereum-DA type (calldata or blobs). +// The L1 chain is set up with a genesis block that has an excess blob gas that leads +// to a slightly higher blob base fee than 16x the regular base fee. +// So in the first few L1 blocks, calldata will be cheaper than blobs. +// We then send a couple of expensive Deposit transactions, which drives up the +// gas price. The L1 blob gas limit is set to a low value to speed up this process. +func TestBatcherAutoDA(t *testing.T) { + op_e2e.InitParallel(t) + + cfg := e2esys.EcotoneSystemConfig(t, new(hexutil.Uint64)) + cfg.DataAvailabilityType = batcherFlags.AutoType + // We set the genesis fee values and block gas limit such that calldata txs are initially cheaper, + // but then drive up the base fee over the coming L1 blocks such that blobs become cheaper again. + cfg.DeployConfig.L1GenesisBlockBaseFeePerGas = (*hexutil.Big)(big.NewInt(7500)) + // 100 blob targets leads to 130_393 starting blob base fee, which is ~ 16 * 8_150 + cfg.DeployConfig.L1GenesisBlockExcessBlobGas = (*hexutil.Uint64)(u64Ptr(100 * params.BlobTxTargetBlobGasPerBlock)) + cfg.DeployConfig.L1GenesisBlockBlobGasUsed = (*hexutil.Uint64)(u64Ptr(0)) + cfg.DeployConfig.L1GenesisBlockGasLimit = 2_500_000 // low block gas limit to drive up gas price more quickly + t.Logf("L1BlockTime: %d, L2BlockTime: %d", cfg.DeployConfig.L1BlockTime, cfg.DeployConfig.L2BlockTime) + + cfg.BatcherTargetNumFrames = 6 + + sys, err := cfg.Start(t) + require.NoError(t, err, "Error starting up system") + + 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) + + l1Client := sys.NodeClient("l1") + + ctx, cancel := context.WithTimeout(context.Background(), 30*time.Second) + defer cancel() + + ethPrivKey := cfg.Secrets.Alice + fromAddr := cfg.Secrets.Addresses().Alice + + // Send deposit transactions in a loop to drive up L1 base fee + depAmount := big.NewInt(1_000_000_000_000) + const numDeps = 3 + txs := make([]*types.Transaction, 0, numDeps) + t.Logf("Sending %d deposits...", numDeps) + for i := int64(0); i < numDeps; i++ { + opts, err := bind.NewKeyedTransactorWithChainID(ethPrivKey, cfg.L1ChainIDBig()) + require.NoError(t, err) + opts.Value = depAmount + opts.Nonce = big.NewInt(i) + depositContract, err := bindings.NewOptimismPortal(cfg.L1Deployments.OptimismPortalProxy, l1Client) + require.NoError(t, err) + + tx, err := transactions.PadGasEstimate(opts, 2, func(opts *bind.TransactOpts) (*types.Transaction, error) { + return depositContract.DepositTransaction(opts, fromAddr, depAmount, 1_000_000, false, nil) + }) + require.NoErrorf(t, err, "failed to send deposit tx[%d]", i) + t.Logf("Deposit submitted[%d]: tx hash: %v", i, tx.Hash()) + txs = append(txs, tx) + } + require.Len(t, txs, numDeps) + + requireEventualBatcherTxType := func(txType uint8, timeout time.Duration, strict bool) { + var foundOtherTxType bool + require.Eventually(t, func() bool { + b, err := l1Client.BlockByNumber(ctx, nil) + require.NoError(t, err) + for _, tx := range b.Transactions() { + if tx.To().Cmp(cfg.DeployConfig.BatchInboxAddress) != 0 { + continue + } + if typ := tx.Type(); typ == txType { + return true + } else if strict { + foundOtherTxType = true + } + } + return false + }, timeout, time.Second, "expected batcher tx type didn't arrive") + require.False(t, foundOtherTxType, "unexpected batcher tx type found") + } + // At this point, we didn't wait on any blocks yet, so we can check that + // the first batcher tx used calldata. + requireEventualBatcherTxType(types.DynamicFeeTxType, 8*time.Second, true) + + t.Logf("Confirming %d deposits on L1...", numDeps) + for i, tx := range txs { + rec, err := wait.ForReceiptOK(ctx, l1Client, tx.Hash()) + require.NoErrorf(t, err, "Waiting for deposit[%d] tx on L1", i) + t.Logf("Deposit confirmed[%d]: L1 block num: %v, gas used: %d", i, rec.BlockNumber, rec.GasUsed) + } + + // Now wait for batcher to have switched to blob txs. + requireEventualBatcherTxType(types.BlobTxType, 8*time.Second, false) +} + +func u64Ptr(v uint64) *uint64 { + return &v +} diff --git a/op-e2e/l1_beacon_client_test.go b/op-e2e/system/da/l1_beacon_client_test.go similarity index 79% rename from op-e2e/l1_beacon_client_test.go rename to op-e2e/system/da/l1_beacon_client_test.go index 93094d4884e7..68698a5e3187 100644 --- a/op-e2e/l1_beacon_client_test.go +++ b/op-e2e/system/da/l1_beacon_client_test.go @@ -1,9 +1,12 @@ -package op_e2e +package da import ( "context" "testing" + op_e2e "github.com/ethereum-optimism/optimism/op-e2e" + + "github.com/ethereum-optimism/optimism/op-e2e/e2eutils" "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" @@ -15,11 +18,12 @@ import ( ) func TestGetVersion(t *testing.T) { - InitParallel(t) + op_e2e.InitParallel(t) l := testlog.Logger(t, log.LevelInfo) - beaconApi := fakebeacon.NewBeacon(l, t.TempDir(), uint64(0), uint64(0)) + blobStore := e2eutils.NewBlobStore() + beaconApi := fakebeacon.NewBeacon(l, blobStore, uint64(0), uint64(0)) t.Cleanup(func() { _ = beaconApi.Close() }) @@ -34,11 +38,12 @@ func TestGetVersion(t *testing.T) { } func Test404NotFound(t *testing.T) { - InitParallel(t) + op_e2e.InitParallel(t) l := testlog.Logger(t, log.LevelInfo) - beaconApi := fakebeacon.NewBeacon(l, t.TempDir(), uint64(0), uint64(12)) + blobStore := e2eutils.NewBlobStore() + beaconApi := fakebeacon.NewBeacon(l, blobStore, uint64(0), uint64(12)) t.Cleanup(func() { _ = beaconApi.Close() }) diff --git a/op-e2e/system/da/multi_test.go b/op-e2e/system/da/multi_test.go new file mode 100644 index 000000000000..8272930da765 --- /dev/null +++ b/op-e2e/system/da/multi_test.go @@ -0,0 +1,64 @@ +package da + +import ( + "context" + "math/big" + "testing" + "time" + + op_e2e "github.com/ethereum-optimism/optimism/op-e2e" + + "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/system/e2esys" + "github.com/ethereum-optimism/optimism/op-node/rollup/derive" + "github.com/stretchr/testify/require" +) + +func TestBatcherMultiTx(t *testing.T) { + op_e2e.InitParallel(t) + + cfg := e2esys.DefaultSystemConfig(t) + cfg.BatcherMaxPendingTransactions = 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.NoError(t, err, "Error starting up system") + + l1Client := sys.NodeClient("l1") + l2Seq := sys.NodeClient("sequencer") + + _, err = geth.WaitForBlock(big.NewInt(10), l2Seq, time.Duration(cfg.DeployConfig.L2BlockTime*15)*time.Second) + require.NoError(t, err, "Waiting for L2 blocks") + + ctx, cancel := context.WithTimeout(context.Background(), 5*time.Second) + defer cancel() + l1Number, err := l1Client.BlockNumber(ctx) + require.NoError(t, err) + + // start batch submission + driver := sys.BatchSubmitter.TestDriver() + err = driver.StartBatchSubmitting() + require.NoError(t, err) + + totalBatcherTxsCount := int64(0) + // wait for up to 5 L1 blocks, usually only 3 is required, but it's + // possible additional L1 blocks will be created before the batcher starts, + // so we wait additional blocks. + for i := int64(0); i < 5; i++ { + block, err := geth.WaitForBlock(big.NewInt(int64(l1Number)+i), l1Client, time.Duration(cfg.DeployConfig.L1BlockTime*2)*time.Second) + require.NoError(t, err, "Waiting for l1 blocks") + // there are possibly other services (proposer/challenger) in the background sending txs + // so we only count the batcher txs + batcherTxCount, err := transactions.TransactionsBySender(block, cfg.DeployConfig.BatchSenderAddress) + require.NoError(t, err) + totalBatcherTxsCount += int64(batcherTxCount) + + if totalBatcherTxsCount >= 10 { + return + } + } + + t.Fatal("Expected at least 10 transactions from the batcher") +} diff --git a/op-e2e/system/da/startstop_test.go b/op-e2e/system/da/startstop_test.go new file mode 100644 index 000000000000..c15c1c039438 --- /dev/null +++ b/op-e2e/system/da/startstop_test.go @@ -0,0 +1,131 @@ +package da + +import ( + "context" + "math/big" + "testing" + "time" + + op_e2e "github.com/ethereum-optimism/optimism/op-e2e" + + "github.com/ethereum-optimism/optimism/op-e2e/e2eutils/geth" + "github.com/ethereum-optimism/optimism/op-e2e/e2eutils/wait" + "github.com/ethereum-optimism/optimism/op-e2e/system/e2esys" + "github.com/ethereum-optimism/optimism/op-e2e/system/helpers" + "github.com/ethereum-optimism/optimism/op-node/rollup/derive" + "github.com/ethereum/go-ethereum/common" + "github.com/ethereum/go-ethereum/core/types" + "github.com/stretchr/testify/require" +) + +// TestSystemBatchType run each system e2e test case in singular batch mode and span batch mode. +// If the test case tests batch submission and advancing safe head, it should be tested in both singular and span batch mode. +func TestSystemBatchType(t *testing.T) { + tests := []struct { + name string + f func(*testing.T, func(*e2esys.SystemConfig)) + }{ + {"StopStartBatcher", StopStartBatcher}, + } + for _, test := range tests { + test := test + t.Run(test.name+"_SingularBatch", func(t *testing.T) { + test.f(t, func(sc *e2esys.SystemConfig) { + sc.BatcherBatchType = derive.SingularBatchType + }) + }) + t.Run(test.name+"_SpanBatch", func(t *testing.T) { + test.f(t, func(sc *e2esys.SystemConfig) { + sc.BatcherBatchType = derive.SpanBatchType + }) + }) + t.Run(test.name+"_SpanBatchMaxBlocks", func(t *testing.T) { + test.f(t, func(sc *e2esys.SystemConfig) { + sc.BatcherBatchType = derive.SpanBatchType + sc.BatcherMaxBlocksPerSpanBatch = 2 + }) + }) + } +} + +func StopStartBatcher(t *testing.T, cfgMod func(*e2esys.SystemConfig)) { + op_e2e.InitParallel(t) + + cfg := e2esys.DefaultSystemConfig(t) + cfgMod(&cfg) + sys, err := cfg.Start(t) + require.NoError(t, err, "Error starting up system") + + rollupClient := sys.RollupClient("verifier") + + l2Seq := sys.NodeClient("sequencer") + l2Verif := sys.NodeClient("verifier") + + // retrieve the initial sync status + seqStatus, err := rollupClient.SyncStatus(context.Background()) + require.NoError(t, err) + + nonce := uint64(0) + sendTx := func() *types.Receipt { + // Submit TX to L2 sequencer node + receipt := helpers.SendL2Tx(t, cfg, l2Seq, cfg.Secrets.Alice, func(opts *helpers.TxOpts) { + opts.ToAddr = &common.Address{0xff, 0xff} + opts.Value = big.NewInt(1_000_000_000) + opts.Nonce = nonce + }) + nonce++ + return receipt + } + // send a transaction + receipt := sendTx() + + // wait until the block the tx was first included in shows up in the safe chain on the verifier + safeBlockInclusionDuration := time.Duration(6*cfg.DeployConfig.L1BlockTime) * time.Second + _, err = geth.WaitForBlock(receipt.BlockNumber, l2Verif, safeBlockInclusionDuration) + require.NoError(t, err, "Waiting for block on verifier") + require.NoError(t, wait.ForProcessingFullBatch(context.Background(), rollupClient)) + + // ensure the safe chain advances + newSeqStatus, err := rollupClient.SyncStatus(context.Background()) + require.NoError(t, err) + require.Greater(t, newSeqStatus.SafeL2.Number, seqStatus.SafeL2.Number, "Safe chain did not advance") + + driver := sys.BatchSubmitter.TestDriver() + // stop the batch submission + err = driver.StopBatchSubmitting(context.Background()) + require.NoError(t, err) + + // wait for any old safe blocks being submitted / derived + time.Sleep(safeBlockInclusionDuration) + + // get the initial sync status + seqStatus, err = rollupClient.SyncStatus(context.Background()) + require.NoError(t, err) + + // send another tx + sendTx() + time.Sleep(safeBlockInclusionDuration) + + // ensure that the safe chain does not advance while the batcher is stopped + newSeqStatus, err = rollupClient.SyncStatus(context.Background()) + require.NoError(t, err) + require.Equal(t, newSeqStatus.SafeL2.Number, seqStatus.SafeL2.Number, "Safe chain advanced while batcher was stopped") + + // start the batch submission + err = driver.StartBatchSubmitting() + require.NoError(t, err) + time.Sleep(safeBlockInclusionDuration) + + // send a third tx + receipt = sendTx() + + // wait until the block the tx was first included in shows up in the safe chain on the verifier + _, err = geth.WaitForBlock(receipt.BlockNumber, l2Verif, safeBlockInclusionDuration) + require.NoError(t, err, "Waiting for block on verifier") + require.NoError(t, wait.ForProcessingFullBatch(context.Background(), rollupClient)) + + // ensure that the safe chain advances after restarting the batcher + newSeqStatus, err = rollupClient.SyncStatus(context.Background()) + require.NoError(t, err) + require.Greater(t, newSeqStatus.SafeL2.Number, seqStatus.SafeL2.Number, "Safe chain did not advance after batcher was restarted") +} diff --git a/op-e2e/external.go b/op-e2e/system/e2esys/external.go similarity index 89% rename from op-e2e/external.go rename to op-e2e/system/e2esys/external.go index e59874393941..cfdc4fcb88cc 100644 --- a/op-e2e/external.go +++ b/op-e2e/system/e2esys/external.go @@ -1,4 +1,4 @@ -package op_e2e +package e2esys import ( "encoding/json" @@ -12,6 +12,7 @@ import ( "github.com/ethereum-optimism/optimism/op-e2e/config" "github.com/ethereum-optimism/optimism/op-e2e/external" + "github.com/ethereum-optimism/optimism/op-service/endpoint" "github.com/ethereum/go-ethereum/common" "github.com/ethereum/go-ethereum/core" "github.com/ethereum/go-ethereum/core/types" @@ -34,20 +35,18 @@ type ExternalEthClient struct { Endpoints external.Endpoints } -func (eec *ExternalEthClient) HTTPEndpoint() string { - return eec.Endpoints.HTTPEndpoint -} - -func (eec *ExternalEthClient) WSEndpoint() string { - return eec.Endpoints.WSEndpoint -} - -func (eec *ExternalEthClient) HTTPAuthEndpoint() string { - return eec.Endpoints.HTTPAuthEndpoint +func (eec *ExternalEthClient) UserRPC() endpoint.RPC { + return endpoint.WsOrHttpRPC{ + WsURL: eec.Endpoints.WSEndpoint, + HttpURL: eec.Endpoints.HTTPEndpoint, + } } -func (eec *ExternalEthClient) WSAuthEndpoint() string { - return eec.Endpoints.WSAuthEndpoint +func (eec *ExternalEthClient) AuthRPC() endpoint.RPC { + return endpoint.WsOrHttpRPC{ + WsURL: eec.Endpoints.WSAuthEndpoint, + HttpURL: eec.Endpoints.HTTPAuthEndpoint, + } } func (eec *ExternalEthClient) Close() error { diff --git a/op-e2e/system/e2esys/setup.go b/op-e2e/system/e2esys/setup.go new file mode 100644 index 000000000000..84d1ab982b51 --- /dev/null +++ b/op-e2e/system/e2esys/setup.go @@ -0,0 +1,1049 @@ +package e2esys + +import ( + "context" + "crypto/ecdsa" + "crypto/rand" + "errors" + "fmt" + "math/big" + "net" + "os" + "path" + "sort" + "strings" + "sync/atomic" + "testing" + "time" + + "github.com/stretchr/testify/require" + "golang.org/x/exp/maps" + + ds "github.com/ipfs/go-datastore" + dsSync "github.com/ipfs/go-datastore/sync" + ic "github.com/libp2p/go-libp2p/core/crypto" + "github.com/libp2p/go-libp2p/core/host" + "github.com/libp2p/go-libp2p/core/peer" + "github.com/libp2p/go-libp2p/core/peerstore" + "github.com/libp2p/go-libp2p/p2p/host/peerstore/pstoremem" + mocknet "github.com/libp2p/go-libp2p/p2p/net/mock" + ma "github.com/multiformats/go-multiaddr" + + "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/ethereum/go-ethereum/eth/ethconfig" + "github.com/ethereum/go-ethereum/ethclient" + "github.com/ethereum/go-ethereum/log" + "github.com/ethereum/go-ethereum/node" + "github.com/ethereum/go-ethereum/params" + "github.com/ethereum/go-ethereum/rpc" + + altda "github.com/ethereum-optimism/optimism/op-alt-da" + bss "github.com/ethereum-optimism/optimism/op-batcher/batcher" + batcherFlags "github.com/ethereum-optimism/optimism/op-batcher/flags" + "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" + "github.com/ethereum-optimism/optimism/op-e2e/e2eutils/batcher" + "github.com/ethereum-optimism/optimism/op-e2e/e2eutils/fakebeacon" + "github.com/ethereum-optimism/optimism/op-e2e/e2eutils/geth" + "github.com/ethereum-optimism/optimism/op-e2e/e2eutils/opnode" + "github.com/ethereum-optimism/optimism/op-e2e/e2eutils/services" + "github.com/ethereum-optimism/optimism/op-e2e/e2eutils/setuputils" + "github.com/ethereum-optimism/optimism/op-node/chaincfg" + rollupNode "github.com/ethereum-optimism/optimism/op-node/node" + "github.com/ethereum-optimism/optimism/op-node/p2p" + "github.com/ethereum-optimism/optimism/op-node/p2p/store" + "github.com/ethereum-optimism/optimism/op-node/rollup" + "github.com/ethereum-optimism/optimism/op-node/rollup/derive" + "github.com/ethereum-optimism/optimism/op-node/rollup/driver" + "github.com/ethereum-optimism/optimism/op-node/rollup/sync" + l2os "github.com/ethereum-optimism/optimism/op-proposer/proposer" + "github.com/ethereum-optimism/optimism/op-service/client" + "github.com/ethereum-optimism/optimism/op-service/clock" + "github.com/ethereum-optimism/optimism/op-service/dial" + "github.com/ethereum-optimism/optimism/op-service/endpoint" + "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" +) + +const ( + RoleSeq = "sequencer" + RoleVerif = "verifier" + RoleL1 = "l1" +) + +var ( + testingJWTSecret = [32]byte{123} + genesisTime = hexutil.Uint64(0) +) + +func DefaultSystemConfigForSoulGasToken(t *testing.T, enable, isBackedByNative bool) SystemConfig { + config := DefaultSystemConfig(t) + config.UseSoulGasToken = enable + config.IsSoulBackedByNative = isBackedByNative + return config +} + +func DefaultSystemConfig(t testing.TB) SystemConfig { + config.ExternalL2TestParms.SkipIfNecessary(t) + + secrets, err := e2eutils.DefaultMnemonicConfig.Secrets() + require.NoError(t, err) + deployConfig := config.DeployConfig.Copy() + deployConfig.L1GenesisBlockTimestamp = hexutil.Uint64(time.Now().Unix()) + e2eutils.ApplyDeployConfigForks(deployConfig) + require.NoError(t, deployConfig.Check(testlog.Logger(t, log.LevelInfo)), + "Deploy config is invalid, do you need to run make devnet-allocs?") + l1Deployments := config.L1Deployments.Copy() + require.NoError(t, l1Deployments.Check(deployConfig)) + + require.Equal(t, secrets.Addresses().Batcher, deployConfig.BatchSenderAddress) + require.Equal(t, secrets.Addresses().SequencerP2P, deployConfig.P2PSequencerAddress) + require.Equal(t, secrets.Addresses().Proposer, deployConfig.L2OutputOracleProposer) + + // Tests depend on premine being filled with secrets addresses + premine := make(map[common.Address]*big.Int) + for _, addr := range secrets.Addresses().All() { + premine[addr] = new(big.Int).Mul(big.NewInt(1000), big.NewInt(params.Ether)) + } + + return SystemConfig{ + Secrets: secrets, + Premine: premine, + DeployConfig: deployConfig, + L1Deployments: l1Deployments, + L1InfoPredeployAddress: predeploys.L1BlockAddr, + JWTFilePath: writeDefaultJWT(t), + JWTSecret: testingJWTSecret, + L1FinalizedDistance: 8, // Short, for faster tests. + BlobsPath: t.TempDir(), + Nodes: map[string]*rollupNode.Config{ + RoleSeq: { + Driver: driver.Config{ + VerifierConfDepth: 0, + SequencerConfDepth: 0, + SequencerEnabled: true, + }, + // Submitter PrivKey is set in system start for rollup nodes where sequencer = true + RPC: rollupNode.RPCConfig{ + ListenAddr: "127.0.0.1", + ListenPort: 0, + EnableAdmin: true, + }, + L1EpochPollInterval: time.Second * 2, + RuntimeConfigReloadInterval: time.Minute * 10, + ConfigPersistence: &rollupNode.DisabledConfigPersistence{}, + Sync: sync.Config{SyncMode: sync.CLSync}, + }, + RoleVerif: { + Driver: driver.Config{ + VerifierConfDepth: 0, + SequencerConfDepth: 0, + SequencerEnabled: false, + }, + RPC: rollupNode.RPCConfig{ + ListenAddr: "127.0.0.1", + ListenPort: 0, + EnableAdmin: true, + }, + L1EpochPollInterval: time.Second * 4, + RuntimeConfigReloadInterval: time.Minute * 10, + ConfigPersistence: &rollupNode.DisabledConfigPersistence{}, + Sync: sync.Config{SyncMode: sync.CLSync}, + }, + }, + Loggers: map[string]log.Logger{ + RoleVerif: testlog.Logger(t, log.LevelInfo).New("role", RoleVerif), + RoleSeq: testlog.Logger(t, log.LevelInfo).New("role", RoleSeq), + "batcher": testlog.Logger(t, log.LevelInfo).New("role", "batcher"), + "proposer": testlog.Logger(t, log.LevelInfo).New("role", "proposer"), + "da-server": testlog.Logger(t, log.LevelInfo).New("role", "da-server"), + }, + GethOptions: map[string][]geth.GethOption{}, + P2PTopology: nil, // no P2P connectivity by default + NonFinalizedProposals: false, + ExternalL2Shim: config.ExternalL2Shim, + DataAvailabilityType: batcherFlags.CalldataType, + BatcherMaxPendingTransactions: 1, + BatcherTargetNumFrames: 1, + } +} + +func RegolithSystemConfig(t *testing.T, regolithTimeOffset *hexutil.Uint64) SystemConfig { + cfg := DefaultSystemConfig(t) + cfg.DeployConfig.L2GenesisRegolithTimeOffset = regolithTimeOffset + cfg.DeployConfig.L2GenesisCanyonTimeOffset = nil + cfg.DeployConfig.L2GenesisDeltaTimeOffset = nil + cfg.DeployConfig.L2GenesisEcotoneTimeOffset = nil + cfg.DeployConfig.L2GenesisFjordTimeOffset = nil + cfg.DeployConfig.L2GenesisGraniteTimeOffset = nil + // ADD NEW FORKS HERE! + return cfg +} + +func CanyonSystemConfig(t *testing.T, canyonTimeOffset *hexutil.Uint64) SystemConfig { + cfg := RegolithSystemConfig(t, &genesisTime) + cfg.DeployConfig.L2GenesisCanyonTimeOffset = canyonTimeOffset + return cfg +} + +func DeltaSystemConfig(t *testing.T, deltaTimeOffset *hexutil.Uint64) SystemConfig { + cfg := CanyonSystemConfig(t, &genesisTime) + cfg.DeployConfig.L2GenesisDeltaTimeOffset = deltaTimeOffset + return cfg +} + +func EcotoneSystemConfig(t *testing.T, ecotoneTimeOffset *hexutil.Uint64) SystemConfig { + cfg := DeltaSystemConfig(t, &genesisTime) + // from Ecotone onwards, activate L1 Cancun at genesis + cfg.DeployConfig.L1CancunTimeOffset = &genesisTime + cfg.DeployConfig.L2GenesisEcotoneTimeOffset = ecotoneTimeOffset + return cfg +} + +func FjordSystemConfig(t *testing.T, fjordTimeOffset *hexutil.Uint64) SystemConfig { + cfg := EcotoneSystemConfig(t, &genesisTime) + cfg.DeployConfig.L2GenesisFjordTimeOffset = fjordTimeOffset + return cfg +} + +func GraniteSystemConfig(t *testing.T, graniteTimeOffset *hexutil.Uint64) SystemConfig { + cfg := FjordSystemConfig(t, &genesisTime) + cfg.DeployConfig.L2GenesisGraniteTimeOffset = graniteTimeOffset + return cfg +} + +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 { + t.Fatalf("failed to prepare jwt file for geth: %v", err) + } + return jwtPath +} + +type DepositContractConfig struct { + L2Oracle common.Address + FinalizationPeriod *big.Int +} + +type SystemConfig struct { + Secrets *e2eutils.Secrets + L1InfoPredeployAddress common.Address + + DeployConfig *genesis.DeployConfig + L1Deployments *genesis.L1Deployments + + JWTFilePath string + JWTSecret [32]byte + + BlobsPath string + + // L1FinalizedDistance is the distance from the L1 head that L1 blocks will be artificially finalized on. + L1FinalizedDistance uint64 + + Premine map[common.Address]*big.Int + Nodes map[string]*rollupNode.Config // Per node config. Don't use populate rollup.Config + Loggers map[string]log.Logger + GethOptions map[string][]geth.GethOption + ProposerLogger log.Logger + BatcherLogger log.Logger + + ExternalL2Shim string + + // map of outbound connections to other nodes. Node names prefixed with "~" are unconnected but linked. + // A nil map disables P2P completely. + // Any node name not in the topology will not have p2p enabled. + P2PTopology map[string][]string + + // Enables req-resp sync in the P2P nodes + P2PReqRespSync bool + + // If the proposer can make proposals for L2 blocks derived from L1 blocks which are not finalized on L1 yet. + NonFinalizedProposals bool + + // Explicitly disable proposer, for tests that don't want dispute games automatically created + DisableProposer bool + + // Explicitly disable batcher, for tests that rely on unsafe L2 payloads + DisableBatcher bool + + // Explicitly disable setting `RollupSequencerHTTP` to forward txs from sentry nodes + DisableTxForwarder bool + + // Configure data-availability type that is used by the batcher. + DataAvailabilityType batcherFlags.DataAvailabilityType + + // 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 int + + // whether to actually use BatcherMaxL1TxSizeBytes for blobs, insteaf of max blob size + BatcherUseMaxTxSizeForBlobs bool + + // Singular (0) or span batches (1) + BatcherBatchType uint + + // If >0, limits the number of blocks per span batch + BatcherMaxBlocksPerSpanBatch int + + // BatcherMaxPendingTransactions determines how many transactions the batcher will try to send + // concurrently. 0 means unlimited. + BatcherMaxPendingTransactions uint64 + + // BatcherMaxConcurrentDARequest determines how many DAserver requests the batcher is allowed to + // make concurrently. 0 means unlimited. + BatcherMaxConcurrentDARequest uint64 + + // SupportL1TimeTravel determines if the L1 node supports quickly skipping forward in time + SupportL1TimeTravel bool + + UseSoulGasToken bool + IsSoulBackedByNative bool +} + +type System struct { + Cfg SystemConfig + + RollupConfig *rollup.Config + + L2GenesisCfg *core.Genesis + + // Connections to running nodes + EthInstances map[string]services.EthInstance + RollupNodes map[string]services.RollupNode + L2OutputSubmitter *l2os.ProposerService + BatchSubmitter *bss.BatcherService + Mocknet mocknet.Mocknet + FakeAltDAServer *altda.FakeDAServer + + L1BeaconAPIAddr endpoint.RestHTTP + + // TimeTravelClock is nil unless SystemConfig.SupportL1TimeTravel was set to true + // It provides access to the clock instance used by the L1 node. Calling TimeTravelClock.AdvanceBy + // allows tests to quickly time travel L1 into the future. + // Note that this time travel may occur in a single block, creating a very large difference in the Time + // on sequential blocks. + TimeTravelClock *clock.AdvancingClock + + t *testing.T + closed atomic.Bool + + // rollupClients caches the lazily created RollupClient + // instances so they can be reused and closed + rollupClients map[string]*sources.RollupClient + + // clients caches lazily created L1/L2 ethclient.Client + // instances so they can be reused and closed + clients map[string]*ethclient.Client +} + +func (sys *System) Config() SystemConfig { return sys.Cfg } + +// AdvanceTime advances the system clock by the given duration. +// If the [System.TimeTravelClock] is nil, this is a no-op. +func (sys *System) AdvanceTime(d time.Duration) { + if sys.TimeTravelClock != nil { + sys.TimeTravelClock.AdvanceTime(d) + } +} + +func (sys *System) L1BeaconEndpoint() endpoint.RestHTTP { + return sys.L1BeaconAPIAddr +} + +func (sys *System) L1BeaconHTTPClient() *sources.BeaconHTTPClient { + logger := testlog.Logger(sys.t, log.LevelInfo).New("component", "beaconClient") + return sources.NewBeaconHTTPClient(client.NewBasicHTTPClient(sys.L1BeaconEndpoint().RestHTTP(), logger)) +} + +func (sys *System) NodeEndpoint(name string) endpoint.RPC { + ethInst, ok := sys.EthInstances[name] + if !ok { + sys.t.Fatalf("unknown eth instance: %s", name) + } + return ethInst.UserRPC() +} + +func (sys *System) RollupEndpoint(name string) endpoint.RPC { + rNode, ok := sys.RollupNodes[name] + if !ok { + sys.t.Fatalf("unknown rollup node instance: %s", name) + } + return rNode.UserRPC() +} + +func (sys *System) L1Deployments() *genesis.L1Deployments { + return sys.Cfg.L1Deployments +} + +func (sys *System) RollupCfg() *rollup.Config { + return sys.RollupConfig +} + +func (sys *System) L2Genesis() *core.Genesis { + return sys.L2GenesisCfg +} + +func (sys *System) L1Slot(l1Timestamp uint64) uint64 { + return (l1Timestamp - uint64(sys.Cfg.DeployConfig.L1GenesisBlockTimestamp)) / + sys.Cfg.DeployConfig.L1BlockTime +} + +func (sys *System) Close() { + sys.t.Log("CLOSING") + if !sys.closed.CompareAndSwap(false, true) { + // Already closed. + return + } + postCtx, postCancel := context.WithCancel(context.Background()) + postCancel() // immediate shutdown, no allowance for idling + + var combinedErr error + if sys.L2OutputSubmitter != nil { + if err := sys.L2OutputSubmitter.Kill(); err != nil && !errors.Is(err, l2os.ErrAlreadyStopped) { + combinedErr = errors.Join(combinedErr, fmt.Errorf("stop L2OutputSubmitter: %w", err)) + } + } + if sys.BatchSubmitter != nil { + if err := sys.BatchSubmitter.Kill(); err != nil && !errors.Is(err, bss.ErrAlreadyStopped) { + combinedErr = errors.Join(combinedErr, fmt.Errorf("stop BatchSubmitter: %w", err)) + } + } + + for name, node := range sys.RollupNodes { + if err := node.Stop(postCtx); err != nil && !errors.Is(err, rollupNode.ErrAlreadyClosed) && !errors.Is(err, postCtx.Err()) { + combinedErr = errors.Join(combinedErr, fmt.Errorf("stop rollup node %v: %w", name, err)) + } + } + for name, ei := range sys.EthInstances { + if err := ei.Close(); err != nil && !errors.Is(err, node.ErrNodeStopped) { + combinedErr = errors.Join(combinedErr, fmt.Errorf("stop EthInstance %v: %w", name, err)) + } + } + for _, client := range sys.clients { + client.Close() + } + for _, client := range sys.rollupClients { + client.Close() + } + if sys.Mocknet != nil { + if err := sys.Mocknet.Close(); err != nil { + combinedErr = errors.Join(combinedErr, fmt.Errorf("stop Mocknet: %w", err)) + } + } + require.NoError(sys.t, combinedErr, "Failed to stop system") +} + +type SystemConfigHook func(sCfg *SystemConfig, s *System) + +type SystemConfigOption struct { + Key string + Role string + Action SystemConfigHook +} + +type SystemConfigOptions struct { + opts map[string]SystemConfigHook +} + +func NewSystemConfigOptions(_opts []SystemConfigOption) (SystemConfigOptions, error) { + opts := make(map[string]SystemConfigHook) + for _, opt := range _opts { + if _, ok := opts[opt.Key+":"+opt.Role]; ok { + return SystemConfigOptions{}, fmt.Errorf("duplicate option for key %s and role %s", opt.Key, opt.Role) + } + opts[opt.Key+":"+opt.Role] = opt.Action + } + + return SystemConfigOptions{ + opts: opts, + }, nil +} + +func (s *SystemConfigOptions) Get(key, role string) (SystemConfigHook, bool) { + v, ok := s.opts[key+":"+role] + return v, ok +} + +func (cfg SystemConfig) Start(t *testing.T, _opts ...SystemConfigOption) (*System, error) { + opts, err := NewSystemConfigOptions(_opts) + if err != nil { + return nil, err + } + + sys := &System{ + t: t, + Cfg: cfg, + EthInstances: make(map[string]services.EthInstance), + RollupNodes: make(map[string]services.RollupNode), + clients: make(map[string]*ethclient.Client), + rollupClients: make(map[string]*sources.RollupClient), + } + // Automatically stop the system at the end of the test + t.Cleanup(sys.Close) + + c := clock.SystemClock + if cfg.SupportL1TimeTravel { + sys.TimeTravelClock = clock.NewAdvancingClock(100 * time.Millisecond) + c = sys.TimeTravelClock + } + + if err := cfg.DeployConfig.Check(testlog.Logger(t, log.LevelInfo)); err != nil { + return nil, err + } + + l1Genesis, err := genesis.BuildL1DeveloperGenesis(cfg.DeployConfig, config.L1Allocs, config.L1Deployments) + if err != nil { + return nil, err + } + + for addr, amount := range cfg.Premine { + if existing, ok := l1Genesis.Alloc[addr]; ok { + l1Genesis.Alloc[addr] = types.Account{ + Code: existing.Code, + Storage: existing.Storage, + Balance: amount, + Nonce: existing.Nonce, + } + } else { + l1Genesis.Alloc[addr] = types.Account{ + Balance: amount, + Nonce: 0, + } + } + } + + l1Block := l1Genesis.ToBlock() + allocsMode := cfg.DeployConfig.AllocMode(l1Block.Time()) + + t.Log("Generating L2 genesis", "l2_allocs_mode", string(allocsMode)) + l2Allocs := config.L2Allocs(allocsMode) + l2Genesis, err := genesis.BuildL2Genesis(cfg.DeployConfig, l2Allocs, l1Block.Header()) + 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] = types.Account{ + Code: existing.Code, + Storage: existing.Storage, + Balance: amount, + Nonce: existing.Nonce, + } + } else { + l2Genesis.Alloc[addr] = types.Account{ + Balance: amount, + Nonce: 0, + } + } + } + + var rollupAltDAConfig *rollup.AltDAConfig + if cfg.DeployConfig.UseAltDA { + rollupAltDAConfig = &rollup.AltDAConfig{ + DAChallengeAddress: cfg.L1Deployments.DataAvailabilityChallengeProxy, + DAChallengeWindow: cfg.DeployConfig.DAChallengeWindow, + DAResolveWindow: cfg.DeployConfig.DAResolveWindow, + CommitmentType: altda.GenericCommitmentString, + } + } + + makeRollupConfig := func() rollup.Config { + return rollup.Config{ + Genesis: rollup.Genesis{ + L1: eth.BlockID{ + Hash: l1Block.Hash(), + Number: 0, + }, + L2: eth.BlockID{ + Hash: l2Genesis.ToBlock().Hash(), + Number: 0, + }, + L2Time: uint64(cfg.DeployConfig.L1GenesisBlockTimestamp), + SystemConfig: e2eutils.SystemConfigFromDeployConfig(cfg.DeployConfig), + }, + BlockTime: cfg.DeployConfig.L2BlockTime, + MaxSequencerDrift: cfg.DeployConfig.MaxSequencerDrift, + SeqWindowSize: cfg.DeployConfig.SequencerWindowSize, + ChannelTimeoutBedrock: cfg.DeployConfig.ChannelTimeoutBedrock, + L1ChainID: cfg.L1ChainIDBig(), + L2ChainID: cfg.L2ChainIDBig(), + BatchInboxAddress: cfg.DeployConfig.BatchInboxAddress, + DepositContractAddress: cfg.DeployConfig.OptimismPortalProxy, + L1SystemConfigAddress: cfg.DeployConfig.SystemConfigProxy, + RegolithTime: cfg.DeployConfig.RegolithTime(uint64(cfg.DeployConfig.L1GenesisBlockTimestamp)), + CanyonTime: cfg.DeployConfig.CanyonTime(uint64(cfg.DeployConfig.L1GenesisBlockTimestamp)), + DeltaTime: cfg.DeployConfig.DeltaTime(uint64(cfg.DeployConfig.L1GenesisBlockTimestamp)), + EcotoneTime: cfg.DeployConfig.EcotoneTime(uint64(cfg.DeployConfig.L1GenesisBlockTimestamp)), + FjordTime: cfg.DeployConfig.FjordTime(uint64(cfg.DeployConfig.L1GenesisBlockTimestamp)), + GraniteTime: cfg.DeployConfig.GraniteTime(uint64(cfg.DeployConfig.L1GenesisBlockTimestamp)), + InteropTime: cfg.DeployConfig.InteropTime(uint64(cfg.DeployConfig.L1GenesisBlockTimestamp)), + ProtocolVersionsAddress: cfg.L1Deployments.ProtocolVersionsProxy, + AltDAConfig: rollupAltDAConfig, + } + } + defaultConfig := makeRollupConfig() + if err := defaultConfig.Check(); err != nil { + return nil, err + } + sys.RollupConfig = &defaultConfig + + // Create a fake Beacon node to hold on to blobs created by the L1 miner, and to serve them to L2 + bcn := fakebeacon.NewBeacon(testlog.Logger(t, log.LevelInfo).New("role", "l1_cl"), + e2eutils.NewBlobStore(), l1Genesis.Timestamp, cfg.DeployConfig.L1BlockTime) + t.Cleanup(func() { + _ = bcn.Close() + }) + require.NoError(t, bcn.Start("127.0.0.1:0")) + beaconApiAddr := bcn.BeaconAddr() + require.NotEmpty(t, beaconApiAddr, "beacon API listener must be up") + sys.L1BeaconAPIAddr = endpoint.RestHTTPURL(beaconApiAddr) + + // Initialize nodes + l1Geth, err := geth.InitL1( + cfg.DeployConfig.L1BlockTime, cfg.L1FinalizedDistance, l1Genesis, c, + path.Join(cfg.BlobsPath, "l1_el"), bcn, cfg.GethOptions[RoleL1]...) + if err != nil { + return nil, err + } + sys.EthInstances[RoleL1] = l1Geth + err = l1Geth.Node.Start() + if err != nil { + return nil, err + } + + // Ordered such that the Sequencer is initialized first. Setup this way so that + // the `RollupSequencerHTTP` GethOption can be supplied to any sentry nodes. + l2Nodes := []string{RoleSeq} + for name := range cfg.Nodes { + if name == RoleSeq { + continue + } + l2Nodes = append(l2Nodes, name) + } + + for _, name := range l2Nodes { + var ethClient services.EthInstance + if cfg.ExternalL2Shim == "" { + if name != RoleSeq && !cfg.DisableTxForwarder { + cfg.GethOptions[name] = append(cfg.GethOptions[name], func(ethCfg *ethconfig.Config, nodeCfg *node.Config) error { + ethCfg.RollupSequencerHTTP = sys.EthInstances[RoleSeq].UserRPC().RPC() + return nil + }) + } + + l2Geth, err := geth.InitL2(name, l2Genesis, cfg.JWTFilePath, cfg.GethOptions[name]...) + if err != nil { + return nil, err + } + if err := l2Geth.Node.Start(); err != nil { + return nil, err + } + + ethClient = l2Geth + } else { + if len(cfg.GethOptions[name]) > 0 { + t.Skip("External L2 nodes do not support configuration through GethOptions") + } + + if name != RoleSeq && !cfg.DisableTxForwarder { + cfg.Loggers[name].Warn("External L2 nodes do not support `RollupSequencerHTTP` configuration. No tx forwarding support.") + } + + ethClient = (&ExternalRunner{ + Name: name, + BinPath: cfg.ExternalL2Shim, + Genesis: l2Genesis, + JWTPath: cfg.JWTFilePath, + }).Run(t) + } + + sys.EthInstances[name] = ethClient + } + + // Configure connections to L1 and L2 for rollup nodes. + // TODO: refactor testing to allow use of in-process rpc connections instead + // of only websockets (which are required for external eth client tests). + for name, nodeCfg := range cfg.Nodes { + ConfigureL1(nodeCfg, sys.EthInstances[RoleL1], sys.L1BeaconEndpoint()) + ConfigureL2(nodeCfg, sys.EthInstances[name], cfg.JWTSecret) + } + + l1Client := sys.NodeClient(RoleL1) + _, err = geth.WaitForBlock(big.NewInt(2), l1Client, 6*time.Second*time.Duration(cfg.DeployConfig.L1BlockTime)) + if err != nil { + return nil, fmt.Errorf("waiting for blocks: %w", err) + } + + sys.Mocknet = mocknet.New() + + p2pNodes := make(map[string]*p2p.Prepared) + if cfg.P2PTopology != nil { + // create the peer if it doesn't exist yet. + initHostMaybe := func(name string) (*p2p.Prepared, error) { + if p, ok := p2pNodes[name]; ok { + return p, nil + } + h, err := sys.NewMockNetPeer() + if err != nil { + return nil, fmt.Errorf("failed to init p2p host for node %s", name) + } + h.Network() + _, ok := cfg.Nodes[name] + if !ok { + return nil, fmt.Errorf("node %s from p2p topology not found in actual nodes map", name) + } + // TODO we can enable discv5 in the testnodes to test discovery of new peers. + // Would need to mock though, and the discv5 implementation does not provide nice mocks here. + p := &p2p.Prepared{ + HostP2P: h, + LocalNode: nil, + UDPv5: nil, + EnableReqRespSync: cfg.P2PReqRespSync, + } + p2pNodes[name] = p + return p, nil + } + for k, vs := range cfg.P2PTopology { + peerA, err := initHostMaybe(k) + if err != nil { + return nil, fmt.Errorf("failed to setup mocknet peer %s", k) + } + for _, v := range vs { + v = strings.TrimPrefix(v, "~") + peerB, err := initHostMaybe(v) + if err != nil { + return nil, fmt.Errorf("failed to setup mocknet peer %s (peer of %s)", v, k) + } + if _, err := sys.Mocknet.LinkPeers(peerA.HostP2P.ID(), peerB.HostP2P.ID()); err != nil { + return nil, fmt.Errorf("failed to setup mocknet link between %s and %s", k, v) + } + // connect the peers after starting the full rollup node + } + } + } + + // Rollup nodes + + // Ensure we are looping through the nodes in alphabetical order + ks := maps.Keys(cfg.Nodes) + // Sort strings in ascending alphabetical order + sort.Strings(ks) + + for _, name := range ks { + nodeConfig := cfg.Nodes[name] + c := *nodeConfig // copy + c.Rollup = makeRollupConfig() + if err := c.LoadPersisted(cfg.Loggers[name]); err != nil { + return nil, err + } + + if p, ok := p2pNodes[name]; ok { + c.P2P = p + + if c.Driver.SequencerEnabled && c.P2PSigner == nil { + c.P2PSigner = &p2p.PreparedSigner{Signer: p2p.NewLocalSigner(cfg.Secrets.SequencerP2P)} + } + } + + c.Rollup.LogDescription(cfg.Loggers[name], chaincfg.L2ChainIDToNetworkDisplayName) + l := cfg.Loggers[name] + + n, err := opnode.NewOpnode(l, &c, func(err error) { + t.Error(err) + }) + require.NoError(t, err) + + sys.RollupNodes[name] = n + + if action, ok := opts.Get("afterRollupNodeStart", name); ok { + action(&cfg, sys) + } + } + + if cfg.P2PTopology != nil { + // We only set up the connections after starting the actual nodes, + // so GossipSub and other p2p protocols can be started before the connections go live. + // This way protocol negotiation happens correctly. + for k, vs := range cfg.P2PTopology { + peerA := p2pNodes[k] + for _, v := range vs { + unconnected := strings.HasPrefix(v, "~") + if unconnected { + v = v[1:] + } + if !unconnected { + peerB := p2pNodes[v] + if _, err := sys.Mocknet.ConnectPeers(peerA.HostP2P.ID(), peerB.HostP2P.ID()); err != nil { + return nil, fmt.Errorf("failed to setup mocknet connection between %s and %s", k, v) + } + } + } + } + } + + // Don't start batch submitter and proposer if there's no sequencer. + if sys.RollupNodes[RoleSeq] == nil { + return sys, nil + } + + // L2Output Submitter + var proposerCLIConfig *l2os.CLIConfig + if e2eutils.UseFaultProofs() { + proposerCLIConfig = &l2os.CLIConfig{ + L1EthRpc: sys.EthInstances[RoleL1].UserRPC().RPC(), + RollupRpc: sys.RollupNodes[RoleSeq].UserRPC().RPC(), + DGFAddress: config.L1Deployments.DisputeGameFactoryProxy.Hex(), + ProposalInterval: 6 * time.Second, + DisputeGameType: 254, // Fast game type + PollInterval: 500 * time.Millisecond, + TxMgrConfig: setuputils.NewTxMgrConfig(sys.EthInstances[RoleL1].UserRPC(), cfg.Secrets.Proposer), + AllowNonFinalized: cfg.NonFinalizedProposals, + LogConfig: oplog.CLIConfig{ + Level: log.LvlInfo, + Format: oplog.FormatText, + }, + } + } else { + proposerCLIConfig = &l2os.CLIConfig{ + L1EthRpc: sys.EthInstances[RoleL1].UserRPC().RPC(), + RollupRpc: sys.RollupNodes[RoleSeq].UserRPC().RPC(), + L2OOAddress: config.L1Deployments.L2OutputOracleProxy.Hex(), + PollInterval: 500 * time.Millisecond, + TxMgrConfig: setuputils.NewTxMgrConfig(sys.EthInstances[RoleL1].UserRPC(), cfg.Secrets.Proposer), + AllowNonFinalized: cfg.NonFinalizedProposals, + LogConfig: oplog.CLIConfig{ + Level: log.LvlInfo, + Format: oplog.FormatText, + }, + } + } + proposer, err := l2os.ProposerServiceFromCLIConfig(context.Background(), "0.0.1", proposerCLIConfig, sys.Cfg.Loggers["proposer"]) + if err != nil { + return nil, fmt.Errorf("unable to setup l2 output submitter: %w", err) + } + if !cfg.DisableProposer { + if err := proposer.Start(context.Background()); err != nil { + return nil, fmt.Errorf("unable to start l2 output submitter: %w", err) + } + } + sys.L2OutputSubmitter = proposer + + // batcher defaults if unset + batcherMaxL1TxSizeBytes := cfg.BatcherMaxL1TxSizeBytes + if batcherMaxL1TxSizeBytes == 0 { + 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 + } + + var batcherAltDACLIConfig altda.CLIConfig + if cfg.DeployConfig.UseAltDA { + fakeAltDAServer := altda.NewFakeDAServer("127.0.0.1", 0, sys.Cfg.Loggers["da-server"]) + if err := fakeAltDAServer.Start(); err != nil { + return nil, fmt.Errorf("failed to start fake altDA server: %w", err) + } + sys.FakeAltDAServer = fakeAltDAServer + + batcherAltDACLIConfig = altda.CLIConfig{ + Enabled: cfg.DeployConfig.UseAltDA, + DAServerURL: fakeAltDAServer.HttpEndpoint(), + VerifyOnRead: true, + GenericDA: true, + MaxConcurrentRequests: cfg.BatcherMaxConcurrentDARequest, + } + } + batcherCLIConfig := &bss.CLIConfig{ + L1EthRpc: sys.EthInstances[RoleL1].UserRPC().RPC(), + L2EthRpc: sys.EthInstances[RoleSeq].UserRPC().RPC(), + RollupRpc: sys.RollupNodes[RoleSeq].UserRPC().RPC(), + MaxPendingTransactions: cfg.BatcherMaxPendingTransactions, + MaxChannelDuration: 1, + MaxL1TxSize: batcherMaxL1TxSizeBytes, + TestUseMaxTxSizeForBlobs: cfg.BatcherUseMaxTxSizeForBlobs, + TargetNumFrames: int(batcherTargetNumFrames), + ApproxComprRatio: 0.4, + SubSafetyMargin: 4, + PollInterval: 50 * time.Millisecond, + TxMgrConfig: setuputils.NewTxMgrConfig(sys.EthInstances[RoleL1].UserRPC(), cfg.Secrets.Batcher), + LogConfig: oplog.CLIConfig{ + Level: log.LevelInfo, + Format: oplog.FormatText, + }, + Stopped: sys.Cfg.DisableBatcher, // Batch submitter may be enabled later + BatchType: cfg.BatcherBatchType, + MaxBlocksPerSpanBatch: cfg.BatcherMaxBlocksPerSpanBatch, + DataAvailabilityType: sys.Cfg.DataAvailabilityType, + CompressionAlgo: compressionAlgo, + AltDA: batcherAltDACLIConfig, + } + // Batch Submitter + batcher, err := bss.BatcherServiceFromCLIConfig(context.Background(), "0.0.1", batcherCLIConfig, sys.Cfg.Loggers["batcher"]) + if err != nil { + return nil, fmt.Errorf("failed to setup batch submitter: %w", err) + } + sys.BatchSubmitter = batcher + if action, ok := opts.Get("beforeBatcherStart", ""); ok { + action(&cfg, sys) + } + if err := batcher.Start(context.Background()); err != nil { + return nil, errors.Join(fmt.Errorf("failed to start batch submitter: %w", err), batcher.Stop(context.Background())) + } + return sys, nil +} + +// IP6 range that gets blackholed (in case our traffic ever makes it out onto +// the internet). +var blackholeIP6 = net.ParseIP("100::") + +// mocknet doesn't allow us to add a peerstore without fully creating the peer ourselves +func (sys *System) NewMockNetPeer() (host.Host, error) { + sk, _, err := ic.GenerateECDSAKeyPair(rand.Reader) + if err != nil { + return nil, err + } + id, err := peer.IDFromPrivateKey(sk) + if err != nil { + return nil, err + } + suffix := id + if len(id) > 8 { + suffix = id[len(id)-8:] + } + ip := append(net.IP{}, blackholeIP6...) + copy(ip[net.IPv6len-len(suffix):], suffix) + a, err := ma.NewMultiaddr(fmt.Sprintf("/ip6/%s/tcp/4242", ip)) + if err != nil { + return nil, fmt.Errorf("failed to create test multiaddr: %w", err) + } + p, err := peer.IDFromPublicKey(sk.GetPublic()) + if err != nil { + return nil, err + } + + ps, err := pstoremem.NewPeerstore() + if err != nil { + return nil, err + } + ps.AddAddr(p, a, peerstore.PermanentAddrTTL) + _ = ps.AddPrivKey(p, sk) + _ = ps.AddPubKey(p, sk.GetPublic()) + + ds := dsSync.MutexWrap(ds.NewMapDatastore()) + eps, err := store.NewExtendedPeerstore(context.Background(), log.Root(), clock.SystemClock, ps, ds, 24*time.Hour) + if err != nil { + return nil, err + } + return sys.Mocknet.AddPeerWithPeerstore(p, eps) +} + +func (sys *System) BatcherHelper() *batcher.Helper { + return batcher.NewHelper(sys.t, sys.Cfg.Secrets.Batcher, sys.RollupConfig, sys.NodeClient(RoleL1)) +} + +func (sys *System) TestAccount(idx int) *ecdsa.PrivateKey { + switch idx { + case 0: + return sys.Cfg.Secrets.Alice + case 1: + return sys.Cfg.Secrets.Bob + case 2: + return sys.Cfg.Secrets.Mallory + default: + panic(fmt.Sprintf("System: no test account for index %d", idx)) + } +} + +func ConfigureL1(rollupNodeCfg *rollupNode.Config, l1Node services.EthInstance, beaconEndpoint endpoint.RestHTTP) { + rollupNodeCfg.L1 = &rollupNode.L1EndpointConfig{ + L1NodeAddr: endpoint.SelectRPC(EnvRPCPreference(), l1Node.UserRPC()), + L1TrustRPC: false, + L1RPCKind: sources.RPCKindStandard, + RateLimit: 0, + BatchSize: 20, + HttpPollInterval: time.Millisecond * 100, + MaxConcurrency: 10, + } + rollupNodeCfg.Beacon = &rollupNode.L1BeaconEndpointConfig{ + BeaconAddr: beaconEndpoint.RestHTTP(), + } +} + +func ConfigureL2(rollupNodeCfg *rollupNode.Config, l2Node services.EthInstance, jwtSecret [32]byte) { + rollupNodeCfg.L2 = &rollupNode.L2EndpointConfig{ + L2EngineAddr: endpoint.SelectRPC(EnvRPCPreference(), l2Node.AuthRPC()), + L2EngineJWTSecret: jwtSecret, + } +} + +func (cfg SystemConfig) L1ChainIDBig() *big.Int { + return new(big.Int).SetUint64(cfg.DeployConfig.L1ChainID) +} + +func (cfg SystemConfig) L2ChainIDBig() *big.Int { + return new(big.Int).SetUint64(cfg.DeployConfig.L2ChainID) +} + +func (sys *System) RollupClient(name string) *sources.RollupClient { + rollupClient, ok := sys.rollupClients[name] + if ok { + return rollupClient + } + rpcClient := endpoint.DialRPC(endpoint.PreferAnyRPC, sys.RollupEndpoint(name), func(v string) *rpc.Client { + logger := testlog.Logger(sys.t, log.LevelInfo).New("rollupClient", name) + cl, err := dial.DialRPCClientWithTimeout(context.Background(), 30*time.Second, logger, v) + require.NoError(sys.t, err, "failed to dial rollup instance %s", name) + return cl + }) + rollupClient = sources.NewRollupClient(client.NewBaseRPCClient(rpcClient)) + sys.rollupClients[name] = rollupClient + return rollupClient +} + +func (sys *System) NodeClient(name string) *ethclient.Client { + nodeClient, ok := sys.clients[name] + if ok { + return nodeClient + } + rpcCl := endpoint.DialRPC(endpoint.PreferAnyRPC, sys.NodeEndpoint(name), func(v string) *rpc.Client { + logger := testlog.Logger(sys.t, log.LevelInfo).New("node", name) + cl, err := dial.DialRPCClientWithTimeout(context.Background(), 30*time.Second, logger, v) + require.NoError(sys.t, err, "failed to dial eth node instance %s", name) + return cl + }) + nodeClient = ethclient.NewClient(rpcCl) + sys.clients[name] = nodeClient + return nodeClient +} + +// EnvRPCPreference reads the type of RPC that should be used. +// Some E2E tests are forced to run with HTTP, +// since HTTP does not support subscriptions, which thus could affect functionality. +// The alternative E2E tests are labeled "ws", but really just any transport here is the same. +func EnvRPCPreference() endpoint.RPCPreference { + // L1 is a legacy exception; the System setup itself depends on RPC subscriptions. + if os.Getenv("OP_E2E_USE_HTTP") == "true" { + return endpoint.PreferHttpRPC + } + return endpoint.PreferAnyRPC +} diff --git a/op-e2e/system/fees/fees_test.go b/op-e2e/system/fees/fees_test.go new file mode 100644 index 000000000000..61590313cbc4 --- /dev/null +++ b/op-e2e/system/fees/fees_test.go @@ -0,0 +1,266 @@ +package fees + +import ( + "context" + "math/big" + "testing" + "time" + + op_e2e "github.com/ethereum-optimism/optimism/op-e2e" + + "github.com/ethereum-optimism/optimism/op-e2e/bindings" + "github.com/ethereum-optimism/optimism/op-e2e/e2eutils/geth" + "github.com/ethereum-optimism/optimism/op-e2e/system/e2esys" + "github.com/ethereum-optimism/optimism/op-e2e/system/helpers" + "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/ethclient" + "github.com/ethereum/go-ethereum/params" + "github.com/ethereum/go-ethereum/rpc" + "github.com/stretchr/testify/require" +) + +func TestMain(m *testing.M) { + op_e2e.RunMain(m) +} + +type stateGetterAdapter struct { + ctx context.Context + t *testing.T + client *ethclient.Client + blockNum *big.Int +} + +func (sga *stateGetterAdapter) GetState(addr common.Address, key common.Hash) common.Hash { + sga.t.Helper() + val, err := sga.client.StorageAt(sga.ctx, addr, key, sga.blockNum) + require.NoError(sga.t, err) + var res common.Hash + copy(res[:], val) + return res +} + +// TestFees checks that L1/L2 fees are handled. +func TestFees(t *testing.T) { + t.Run("pre-regolith", func(t *testing.T) { + op_e2e.InitParallel(t) + cfg := e2esys.RegolithSystemConfig(t, nil) + cfg.DeployConfig.L1GenesisBlockBaseFeePerGas = (*hexutil.Big)(big.NewInt(7)) + + testFees(t, cfg) + }) + t.Run("regolith", func(t *testing.T) { + op_e2e.InitParallel(t) + cfg := e2esys.RegolithSystemConfig(t, new(hexutil.Uint64)) + cfg.DeployConfig.L1GenesisBlockBaseFeePerGas = (*hexutil.Big)(big.NewInt(7)) + + testFees(t, cfg) + }) + t.Run("ecotone", func(t *testing.T) { + op_e2e.InitParallel(t) + cfg := e2esys.EcotoneSystemConfig(t, new(hexutil.Uint64)) + cfg.DeployConfig.L1GenesisBlockBaseFeePerGas = (*hexutil.Big)(big.NewInt(7)) + + testFees(t, cfg) + }) + t.Run("fjord", func(t *testing.T) { + op_e2e.InitParallel(t) + cfg := e2esys.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 e2esys.SystemConfig) { + sys, err := cfg.Start(t) + require.Nil(t, err, "Error starting up system") + + l2Seq := sys.NodeClient("sequencer") + l2Verif := sys.NodeClient("verifier") + l1 := sys.NodeClient("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{ + ctx: context.Background(), + t: t, + client: l2Seq, + } + + l1CostFn := types.NewL1CostFunc(config, sga) + + // Transactor Account + ethPrivKey := cfg.Secrets.Alice + fromAddr := crypto.PubkeyToAddress(ethPrivKey.PublicKey) + + require.NotEqual(t, cfg.DeployConfig.L2OutputOracleProposer, fromAddr) + require.NotEqual(t, cfg.DeployConfig.BatchSenderAddress, fromAddr) + + // Find gaspriceoracle contract + gpoContract, err := bindings.NewGasPriceOracle(predeploys.GasPriceOracleAddr, l2Seq) + require.Nil(t, err) + + if !sys.RollupConfig.IsEcotone(sys.L2GenesisCfg.Timestamp) { + overhead, err := gpoContract.Overhead(&bind.CallOpts{}) + require.Nil(t, err, "reading gpo overhead") + require.Equal(t, overhead.Uint64(), cfg.DeployConfig.GasPriceOracleOverhead, "wrong gpo overhead") + + scalar, err := gpoContract.Scalar(&bind.CallOpts{}) + require.Nil(t, err, "reading 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") + _, err = gpoContract.Scalar(&bind.CallOpts{}) + require.ErrorContains(t, err, "deprecated") + } + + decimals, err := gpoContract.Decimals(&bind.CallOpts{}) + require.Nil(t, err, "reading gpo decimals") + + require.Equal(t, decimals.Uint64(), uint64(6), "wrong gpo decimals") + + // BaseFee Recipient + baseFeeRecipientStartBalance, err := l2Seq.BalanceAt(context.Background(), predeploys.BaseFeeVaultAddr, big.NewInt(rpc.EarliestBlockNumber.Int64())) + require.Nil(t, err) + + // L1Fee Recipient + l1FeeRecipientStartBalance, err := l2Seq.BalanceAt(context.Background(), predeploys.L1FeeVaultAddr, big.NewInt(rpc.EarliestBlockNumber.Int64())) + require.Nil(t, err) + + sequencerFeeVaultStartBalance, err := l2Seq.BalanceAt(context.Background(), predeploys.SequencerFeeVaultAddr, big.NewInt(rpc.EarliestBlockNumber.Int64())) + require.Nil(t, err) + + genesisBlock, err := l2Seq.BlockByNumber(context.Background(), big.NewInt(rpc.EarliestBlockNumber.Int64())) + require.NoError(t, err) + + coinbaseStartBalance, err := l2Seq.BalanceAt(context.Background(), genesisBlock.Coinbase(), big.NewInt(rpc.EarliestBlockNumber.Int64())) + require.NoError(t, err) + + // Simple transfer from signer to random account + startBalance, err := l2Seq.BalanceAt(context.Background(), fromAddr, big.NewInt(rpc.EarliestBlockNumber.Int64())) + require.Nil(t, err) + require.Greater(t, startBalance.Uint64(), big.NewInt(params.Ether).Uint64()) + + transferAmount := big.NewInt(params.Ether) + gasTip := big.NewInt(10) + receipt := helpers.SendL2Tx(t, cfg, l2Seq, ethPrivKey, func(opts *helpers.TxOpts) { + opts.ToAddr = &common.Address{0xff, 0xff} + opts.Value = transferAmount + opts.GasTipCap = gasTip + opts.Gas = 21000 + opts.GasFeeCap = big.NewInt(200) + opts.VerifyOnClients(l2Verif) + }) + + require.Equal(t, receipt.Status, types.ReceiptStatusSuccessful) + + header, err := l2Seq.HeaderByNumber(context.Background(), receipt.BlockNumber) + require.Nil(t, err) + + coinbaseEndBalance, err := l2Seq.BalanceAt(context.Background(), header.Coinbase, header.Number) + require.Nil(t, err) + + endBalance, err := l2Seq.BalanceAt(context.Background(), fromAddr, header.Number) + require.Nil(t, err) + + baseFeeRecipientEndBalance, err := l2Seq.BalanceAt(context.Background(), predeploys.BaseFeeVaultAddr, header.Number) + require.Nil(t, err) + + l1Header, err := l1.HeaderByNumber(context.Background(), nil) + require.Nil(t, err) + + l1FeeRecipientEndBalance, err := l2Seq.BalanceAt(context.Background(), predeploys.L1FeeVaultAddr, header.Number) + require.Nil(t, err) + + sequencerFeeVaultEndBalance, err := l2Seq.BalanceAt(context.Background(), predeploys.SequencerFeeVaultAddr, header.Number) + require.Nil(t, err) + + // Diff fee recipient + coinbase balances + baseFeeRecipientDiff := new(big.Int).Sub(baseFeeRecipientEndBalance, baseFeeRecipientStartBalance) + l1FeeRecipientDiff := new(big.Int).Sub(l1FeeRecipientEndBalance, l1FeeRecipientStartBalance) + sequencerFeeVaultDiff := new(big.Int).Sub(sequencerFeeVaultEndBalance, sequencerFeeVaultStartBalance) + coinbaseDiff := new(big.Int).Sub(coinbaseEndBalance, coinbaseStartBalance) + + // Tally L2 Fee + l2Fee := gasTip.Mul(gasTip, new(big.Int).SetUint64(receipt.GasUsed)) + require.Equal(t, sequencerFeeVaultDiff, coinbaseDiff, "coinbase is always sequencer fee vault") + require.Equal(t, l2Fee, coinbaseDiff, "l2 fee mismatch") + require.Equal(t, l2Fee, sequencerFeeVaultDiff) + + // Tally BaseFee + baseFee := new(big.Int).Mul(header.BaseFee, new(big.Int).SetUint64(receipt.GasUsed)) + require.Equal(t, baseFee, baseFeeRecipientDiff, "base fee mismatch") + + // Tally L1 Fee + tx, _, err := l2Seq.TransactionByHash(context.Background(), receipt.TxHash) + require.NoError(t, err, "Should be able to get transaction") + bytes, err := tx.MarshalBinary() + require.Nil(t, err) + + l1Fee := l1CostFn(tx.RollupCostData(), header.Time) + require.Equalf(t, l1Fee, l1FeeRecipientDiff, "L1 fee mismatch: start balance %v, end balance %v", l1FeeRecipientStartBalance, l1FeeRecipientEndBalance) + + gpoEcotone, err := gpoContract.IsEcotone(nil) + 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.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 + // in our case we already include that, so we subtract it, to do a 1:1 comparison + adjustedGPOFee = new(big.Int).Sub(gpoL1Fee, new(big.Int).Mul(artificialGPOOverhead, l1BaseFee)) + } + require.Equal(t, l1Fee, adjustedGPOFee, "GPO reports L1 fee mismatch") + + require.Equal(t, receipt.L1Fee, l1Fee, "l1 fee in receipt is correct") + if !sys.RollupConfig.IsEcotone(header.Time) { // FeeScalar receipt attribute is removed as of Ecotone + require.Equal(t, + new(big.Float).Mul( + new(big.Float).SetInt(l1Header.BaseFee), + new(big.Float).Mul(new(big.Float).SetInt(receipt.L1GasUsed), receipt.FeeScalar), + ), + new(big.Float).SetInt(receipt.L1Fee), "fee field in receipt matches gas used times scalar times base fee") + } + + // Calculate total fee + baseFeeRecipientDiff.Add(baseFeeRecipientDiff, coinbaseDiff) + totalFee := new(big.Int).Add(baseFeeRecipientDiff, l1FeeRecipientDiff) + balanceDiff := new(big.Int).Sub(startBalance, endBalance) + balanceDiff.Sub(balanceDiff, transferAmount) + require.Equal(t, balanceDiff, totalFee, "balances should add up") +} diff --git a/op-e2e/system/fees/gaspriceoracle_test.go b/op-e2e/system/fees/gaspriceoracle_test.go new file mode 100644 index 000000000000..58a679fa86f0 --- /dev/null +++ b/op-e2e/system/fees/gaspriceoracle_test.go @@ -0,0 +1,102 @@ +package fees + +import ( + "context" + "math" + "testing" + "time" + + op_e2e "github.com/ethereum-optimism/optimism/op-e2e" + + legacybindings "github.com/ethereum-optimism/optimism/op-e2e/bindings" + "github.com/ethereum-optimism/optimism/op-e2e/e2eutils/geth" + "github.com/ethereum-optimism/optimism/op-e2e/e2eutils/wait" + "github.com/ethereum-optimism/optimism/op-e2e/system/e2esys" + "github.com/ethereum-optimism/optimism/op-service/eth" + "github.com/ethereum-optimism/optimism/op-service/predeploys" + "github.com/ethereum/go-ethereum/accounts/abi/bind" + "github.com/stretchr/testify/require" +) + +// TestGasPriceOracleFeeUpdates checks that the gas price oracle cannot be locked by mis-configuring parameters. +func TestGasPriceOracleFeeUpdates(t *testing.T) { + op_e2e.InitParallel(t) + + ctx, ctxCancel := context.WithCancel(context.Background()) + defer ctxCancel() + + maxScalars := eth.EcotoneScalars{ + BaseFeeScalar: math.MaxUint32, + BlobBaseFeeScalar: math.MaxUint32, + } + var cancel context.CancelFunc + + // Create our system configuration for L1/L2 and start it + cfg := e2esys.DefaultSystemConfig(t) + sys, err := cfg.Start(t) + require.NoError(t, err, "Error starting up system") + + // Obtain our sequencer, verifier, and transactor keypair. + l1Client := sys.NodeClient("l1") + l2Seq := sys.NodeClient("sequencer") + // l2Verif := sys.NodeClient("verifier") + ethPrivKey := cfg.Secrets.SysCfgOwner + + // Bind to the SystemConfig & GasPriceOracle contracts + sysconfig, err := legacybindings.NewSystemConfig(cfg.L1Deployments.SystemConfigProxy, l1Client) + require.NoError(t, err) + gpoContract, err := legacybindings.NewGasPriceOracleCaller(predeploys.GasPriceOracleAddr, l2Seq) + require.NoError(t, err) + + // Obtain our signer. + opts, err := bind.NewKeyedTransactorWithChainID(ethPrivKey, cfg.L1ChainIDBig()) + require.NoError(t, err) + + // Define our L1 transaction timeout duration. + txTimeoutDuration := 10 * time.Duration(cfg.DeployConfig.L1BlockTime) * time.Second + + // Update the gas config, wait for it to show up on L2, & verify that it was set as intended + opts.Context, cancel = context.WithTimeout(ctx, txTimeoutDuration) + tx, err := sysconfig.SetGasConfigEcotone(opts, maxScalars.BaseFeeScalar, maxScalars.BlobBaseFeeScalar) + cancel() + require.NoError(t, err, "SetGasConfigEcotone update tx") + + receipt, err := wait.ForReceiptOK(ctx, l1Client, tx.Hash()) + require.NoError(t, err, "Waiting for sysconfig set gas config update tx") + + _, err = geth.WaitForL1OriginOnL2(sys.RollupConfig, receipt.BlockNumber.Uint64(), l2Seq, txTimeoutDuration) + require.NoError(t, err, "waiting for L2 block to include the sysconfig update") + + baseFeeScalar, err := gpoContract.BaseFeeScalar(&bind.CallOpts{}) + require.NoError(t, err, "reading base fee scalar") + require.Equal(t, baseFeeScalar, maxScalars.BaseFeeScalar) + + blobBaseFeeScalar, err := gpoContract.BlobBaseFeeScalar(&bind.CallOpts{}) + require.NoError(t, err, "reading blob base fee scalar") + require.Equal(t, blobBaseFeeScalar, maxScalars.BlobBaseFeeScalar) + + // Now modify the scalar value & ensure that the gas params can be modified + normalScalars := eth.EcotoneScalars{ + BaseFeeScalar: 1e6, + BlobBaseFeeScalar: 1e6, + } + + opts.Context, cancel = context.WithTimeout(context.Background(), txTimeoutDuration) + tx, err = sysconfig.SetGasConfigEcotone(opts, normalScalars.BaseFeeScalar, normalScalars.BlobBaseFeeScalar) + cancel() + require.NoError(t, err, "SetGasConfigEcotone update tx") + + receipt, err = wait.ForReceiptOK(ctx, l1Client, tx.Hash()) + require.NoError(t, err, "Waiting for sysconfig set gas config update tx") + + _, err = geth.WaitForL1OriginOnL2(sys.RollupConfig, receipt.BlockNumber.Uint64(), l2Seq, txTimeoutDuration) + require.NoError(t, err, "waiting for L2 block to include the sysconfig update") + + baseFeeScalar, err = gpoContract.BaseFeeScalar(&bind.CallOpts{}) + require.NoError(t, err, "reading base fee scalar") + require.Equal(t, baseFeeScalar, normalScalars.BaseFeeScalar) + + blobBaseFeeScalar, err = gpoContract.BlobBaseFeeScalar(&bind.CallOpts{}) + require.NoError(t, err, "reading blob base fee scalar") + require.Equal(t, blobBaseFeeScalar, normalScalars.BlobBaseFeeScalar) +} diff --git a/op-e2e/system/fees/l1info_test.go b/op-e2e/system/fees/l1info_test.go new file mode 100644 index 000000000000..2fdd3f70747a --- /dev/null +++ b/op-e2e/system/fees/l1info_test.go @@ -0,0 +1,205 @@ +package fees + +import ( + "context" + "fmt" + "math/big" + "testing" + "time" + + op_e2e "github.com/ethereum-optimism/optimism/op-e2e" + + "github.com/ethereum-optimism/optimism/op-e2e/bindings" + "github.com/ethereum-optimism/optimism/op-e2e/e2eutils/geth" + "github.com/ethereum-optimism/optimism/op-e2e/system/e2esys" + "github.com/ethereum-optimism/optimism/op-node/rollup/derive" + "github.com/ethereum-optimism/optimism/op-service/eth" + "github.com/ethereum/go-ethereum/accounts/abi/bind" + "github.com/ethereum/go-ethereum/common" + "github.com/ethereum/go-ethereum/consensus/misc/eip4844" + "github.com/ethereum/go-ethereum/core/types" + "github.com/ethereum/go-ethereum/ethclient" + "github.com/stretchr/testify/require" +) + +func L1InfoFromState(ctx context.Context, contract *bindings.L1Block, l2Number *big.Int, ecotone bool) (*derive.L1BlockInfo, error) { + var err error + out := &derive.L1BlockInfo{} + opts := bind.CallOpts{ + BlockNumber: l2Number, + Context: ctx, + } + + out.Number, err = contract.Number(&opts) + if err != nil { + return nil, fmt.Errorf("failed to get number: %w", err) + } + + out.Time, err = contract.Timestamp(&opts) + if err != nil { + return nil, fmt.Errorf("failed to get timestamp: %w", err) + } + + out.BaseFee, err = contract.Basefee(&opts) + if err != nil { + return nil, fmt.Errorf("failed to get base fee: %w", err) + } + + blockHashBytes, err := contract.Hash(&opts) + if err != nil { + return nil, fmt.Errorf("failed to get block hash: %w", err) + } + out.BlockHash = common.BytesToHash(blockHashBytes[:]) + + out.SequenceNumber, err = contract.SequenceNumber(&opts) + if err != nil { + return nil, fmt.Errorf("failed to get sequence number: %w", err) + } + + if !ecotone { + overhead, err := contract.L1FeeOverhead(&opts) + if err != nil { + return nil, fmt.Errorf("failed to get l1 fee overhead: %w", err) + } + out.L1FeeOverhead = eth.Bytes32(common.BigToHash(overhead)) + + scalar, err := contract.L1FeeScalar(&opts) + if err != nil { + return nil, fmt.Errorf("failed to get l1 fee scalar: %w", err) + } + out.L1FeeScalar = eth.Bytes32(common.BigToHash(scalar)) + } + + batcherHash, err := contract.BatcherHash(&opts) + if err != nil { + return nil, fmt.Errorf("failed to get batch sender: %w", err) + } + out.BatcherAddr = common.BytesToAddress(batcherHash[:]) + + if ecotone { + blobBaseFeeScalar, err := contract.BlobBaseFeeScalar(&opts) + if err != nil { + return nil, fmt.Errorf("failed to get blob basefee scalar: %w", err) + } + out.BlobBaseFeeScalar = blobBaseFeeScalar + + baseFeeScalar, err := contract.BaseFeeScalar(&opts) + if err != nil { + return nil, fmt.Errorf("failed to get basefee scalar: %w", err) + } + out.BaseFeeScalar = baseFeeScalar + + blobBaseFee, err := contract.BlobBaseFee(&opts) + if err != nil { + return nil, fmt.Errorf("failed to get blob basefee: %w", err) + } + out.BlobBaseFee = blobBaseFee + } + + return out, nil +} + +func TestL1InfoContract(t *testing.T) { + op_e2e.InitParallel(t) + + cfg := e2esys.DefaultSystemConfig(t) + + sys, err := cfg.Start(t) + require.Nil(t, err, "Error starting up system") + + l1Client := sys.NodeClient("l1") + l2Seq := sys.NodeClient("sequencer") + l2Verif := sys.NodeClient("verifier") + + endVerifBlockNumber := big.NewInt(4) + endSeqBlockNumber := big.NewInt(6) + endVerifBlock, err := geth.WaitForBlock(endVerifBlockNumber, l2Verif, time.Minute) + require.Nil(t, err) + endSeqBlock, err := geth.WaitForBlock(endSeqBlockNumber, l2Seq, time.Minute) + require.Nil(t, err) + + seqL1Info, err := bindings.NewL1Block(cfg.L1InfoPredeployAddress, l2Seq) + require.Nil(t, err) + + verifL1Info, err := bindings.NewL1Block(cfg.L1InfoPredeployAddress, l2Verif) + require.Nil(t, err) + + ctx, cancel := context.WithTimeout(context.Background(), 2*time.Minute) + defer cancel() + + fillInfoLists := func(start *types.Block, contract *bindings.L1Block, client *ethclient.Client) ([]*derive.L1BlockInfo, []*derive.L1BlockInfo) { + var txList, stateList []*derive.L1BlockInfo + for b := start; ; { + var infoFromTx *derive.L1BlockInfo + infoFromTx, err := derive.L1BlockInfoFromBytes(sys.RollupConfig, b.Time(), b.Transactions()[0].Data()) + require.NoError(t, err) + txList = append(txList, infoFromTx) + + ecotone := sys.RollupConfig.IsEcotone(b.Time()) && !sys.RollupConfig.IsEcotoneActivationBlock(b.Time()) + infoFromState, err := L1InfoFromState(ctx, contract, b.Number(), ecotone) + require.Nil(t, err) + stateList = append(stateList, infoFromState) + + // Genesis L2 block contains no L1 Deposit TX + if b.NumberU64() == 1 { + return txList, stateList + } + b, err = client.BlockByHash(ctx, b.ParentHash()) + require.Nil(t, err) + } + } + + l1InfosFromSequencerTransactions, l1InfosFromSequencerState := fillInfoLists(endSeqBlock, seqL1Info, l2Seq) + l1InfosFromVerifierTransactions, l1InfosFromVerifierState := fillInfoLists(endVerifBlock, verifL1Info, l2Verif) + + l1blocks := make(map[common.Hash]*derive.L1BlockInfo) + maxL1Hash := l1InfosFromSequencerTransactions[0].BlockHash + for h := maxL1Hash; ; { + b, err := l1Client.BlockByHash(ctx, h) + require.Nil(t, err) + + l1blocks[h] = &derive.L1BlockInfo{ + Number: b.NumberU64(), + Time: b.Time(), + BaseFee: b.BaseFee(), + BlockHash: h, + SequenceNumber: 0, // ignored, will be overwritten + BatcherAddr: sys.RollupConfig.Genesis.SystemConfig.BatcherAddr, + } + if sys.RollupConfig.IsEcotone(b.Time()) && !sys.RollupConfig.IsEcotoneActivationBlock(b.Time()) { + scalars, err := sys.RollupConfig.Genesis.SystemConfig.EcotoneScalars() + require.NoError(t, err) + l1blocks[h].BlobBaseFeeScalar = scalars.BlobBaseFeeScalar + l1blocks[h].BaseFeeScalar = scalars.BaseFeeScalar + if excess := b.ExcessBlobGas(); excess != nil { + l1blocks[h].BlobBaseFee = eip4844.CalcBlobFee(*excess) + } else { + l1blocks[h].BlobBaseFee = big.NewInt(1) + } + } else { + l1blocks[h].L1FeeOverhead = sys.RollupConfig.Genesis.SystemConfig.Overhead + l1blocks[h].L1FeeScalar = sys.RollupConfig.Genesis.SystemConfig.Scalar + } + + h = b.ParentHash() + if b.NumberU64() == 0 { + break + } + } + + checkInfoList := func(name string, list []*derive.L1BlockInfo) { + for _, info := range list { + if expected, ok := l1blocks[info.BlockHash]; ok { + expected.SequenceNumber = info.SequenceNumber // the seq nr is not part of the L1 info we know in advance, so we ignore it. + require.Equal(t, expected, info) + } else { + t.Fatalf("Did not find block hash for L1 Info: %v in test %s", info, name) + } + } + } + + checkInfoList("On sequencer with tx", l1InfosFromSequencerTransactions) + checkInfoList("On sequencer with state", l1InfosFromSequencerState) + checkInfoList("On verifier with tx", l1InfosFromVerifierTransactions) + checkInfoList("On verifier with state", l1InfosFromVerifierState) +} diff --git a/op-e2e/check_scripts_test.go b/op-e2e/system/fjord/check_scripts_test.go similarity index 78% rename from op-e2e/check_scripts_test.go rename to op-e2e/system/fjord/check_scripts_test.go index 28cdcca3ab8c..b6115dbd7e0b 100644 --- a/op-e2e/check_scripts_test.go +++ b/op-e2e/system/fjord/check_scripts_test.go @@ -1,9 +1,13 @@ -package op_e2e +package fjord import ( "context" "testing" + op_e2e "github.com/ethereum-optimism/optimism/op-e2e" + + "github.com/ethereum-optimism/optimism/op-e2e/system/e2esys" + "github.com/ethereum/go-ethereum/common/hexutil" "github.com/ethereum/go-ethereum/log" @@ -16,16 +20,8 @@ import ( // 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) + op_e2e.InitParallel(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 @@ -45,16 +41,25 @@ func TestCheckFjordScript(t *testing.T) { for _, tt := range tests { t.Run(tt.name, func(t *testing.T) { - InitParallel(t) + op_e2e.InitParallel(t) + + log := testlog.Logger(t, log.LevelInfo) + + cfg := e2esys.DefaultSystemConfig(t) + cfg.DeployConfig.L1CancunTimeOffset = &genesisActivation + cfg.DeployConfig.L2GenesisRegolithTimeOffset = &genesisActivation + cfg.DeployConfig.L2GenesisCanyonTimeOffset = &genesisActivation + cfg.DeployConfig.L2GenesisDeltaTimeOffset = &genesisActivation + cfg.DeployConfig.L2GenesisEcotoneTimeOffset = &genesisActivation + 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"], + L2: sys.NodeClient("sequencer"), Key: sys.Cfg.Secrets.Alice, Addr: sys.Cfg.Secrets.Addresses().Alice, } diff --git a/op-e2e/system/fjord/fjord_test.go b/op-e2e/system/fjord/fjord_test.go new file mode 100644 index 000000000000..09e2ca47ddd5 --- /dev/null +++ b/op-e2e/system/fjord/fjord_test.go @@ -0,0 +1,11 @@ +package fjord + +import ( + "testing" + + op_e2e "github.com/ethereum-optimism/optimism/op-e2e" +) + +func TestMain(m *testing.M) { + op_e2e.RunMain(m) +} diff --git a/op-e2e/system/gastoken/gastoken_test.go b/op-e2e/system/gastoken/gastoken_test.go new file mode 100644 index 000000000000..445f672743cf --- /dev/null +++ b/op-e2e/system/gastoken/gastoken_test.go @@ -0,0 +1,608 @@ +package gastoken + +import ( + "context" + "fmt" + "math/big" + "testing" + "time" + + op_e2e "github.com/ethereum-optimism/optimism/op-e2e" + + "github.com/ethereum-optimism/optimism/op-e2e/system/e2esys" + "github.com/ethereum-optimism/optimism/op-e2e/system/helpers" + + "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 TestMain(m *testing.M) { + op_e2e.RunMain(m) +} + +func TestCustomGasToken(t *testing.T) { + op_e2e.InitParallel(t, op_e2e.SkipOnFaultProofs) // Custom Gas Token feature is not yet compatible with fault proofs + + cfg := e2esys.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") + + l1Client := sys.NodeClient("l1") + l2Client := sys.NodeClient("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.NodeClient("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 := helpers.SendWithdrawal(t, cfg, l2Seq, cfg.Secrets.Alice, func(opts *helpers.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 := helpers.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 := helpers.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.UseFaultProofs() { + 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) + } + + // checkFeeWithdrawal ensures that the FeeVault can be withdrawn from + checkFeeWithdrawal := func(t *testing.T, enabled bool) { + feeVault, err := bindings.NewSequencerFeeVault(predeploys.SequencerFeeVaultAddr, l2Client) + require.NoError(t, err) + + // Alice will be sending transactions + aliceOpts, err := bind.NewKeyedTransactorWithChainID(cfg.Secrets.Alice, cfg.L2ChainIDBig()) + require.NoError(t, err) + + // Get the recipient of the funds + recipient, err := feeVault.RECIPIENT(&bind.CallOpts{}) + require.NoError(t, err) + + // This test depends on the withdrawal network being L1 which is represented + // by 0 in the enum. + withdrawalNetwork, err := feeVault.WITHDRAWALNETWORK(&bind.CallOpts{}) + require.NoError(t, err) + require.Equal(t, withdrawalNetwork, uint8(0)) + + // Get the balance of the recipient on L1 + var recipientBalanceBefore *big.Int + if enabled { + recipientBalanceBefore, err = weth9.BalanceOf(&bind.CallOpts{}, recipient) + } else { + recipientBalanceBefore, err = l1Client.BalanceAt(context.Background(), recipient, nil) + } + require.NoError(t, err) + + // Get the min withdrawal amount for the FeeVault + amount, err := feeVault.MINWITHDRAWALAMOUNT(&bind.CallOpts{}) + require.NoError(t, err) + + l1opts, err := bind.NewKeyedTransactorWithChainID(cfg.Secrets.Alice, cfg.L1ChainIDBig()) + require.NoError(t, err) + + optimismPortal, err := bindings.NewOptimismPortal(cfg.L1Deployments.OptimismPortalProxy, l1Client) + require.NoError(t, err) + + depositAmount := new(big.Int).Mul(amount, big.NewInt(14)) + l1opts.Value = depositAmount + + var receipt *types.Receipt + + // Alice deposits funds + if enabled { + // approve + transferFrom flow + // Cannot use `transfer` because of the tracking of balance in the OptimismPortal + dep, err := weth9.Deposit(l1opts) + waitForTx(t, dep, err, l1Client) + + l1opts.Value = nil + tx, err := weth9.Approve(l1opts, cfg.L1Deployments.OptimismPortalProxy, depositAmount) + waitForTx(t, tx, err, l1Client) + + require.NoError(t, err) + deposit, err := optimismPortal.DepositERC20Transaction(l1opts, cfg.Secrets.Addresses().Alice, depositAmount, depositAmount, 500_000, false, []byte{}) + waitForTx(t, deposit, err, l1Client) + + receipt, err = wait.ForReceiptOK(context.Background(), l1Client, deposit.Hash()) + require.NoError(t, err) + } else { + // send ether to the portal directly, alice already has funds on L2 + tx, err := optimismPortal.DepositTransaction(l1opts, cfg.Secrets.Addresses().Alice, depositAmount, 500_000, false, []byte{}) + waitForTx(t, tx, err, l1Client) + + 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) + + // Get Alice's balance on L2 + aliceBalance, err := l2Client.BalanceAt(context.Background(), cfg.Secrets.Addresses().Alice, nil) + require.NoError(t, err) + require.GreaterOrEqual(t, aliceBalance.Uint64(), amount.Uint64()) + + // Send funds to the FeeVault so its balance is above the min withdrawal amount + aliceOpts.Value = amount + feeVaultTx, err := feeVault.Receive(aliceOpts) + waitForTx(t, feeVaultTx, err, l2Client) + + // Ensure that the balance of the vault is large enough to withdraw + vaultBalance, err := l2Client.BalanceAt(context.Background(), predeploys.SequencerFeeVaultAddr, nil) + require.NoError(t, err) + require.GreaterOrEqual(t, vaultBalance.Uint64(), amount.Uint64()) + + // Ensure there is code at the vault address + code, err := l2Client.CodeAt(context.Background(), predeploys.SequencerFeeVaultAddr, nil) + require.NoError(t, err) + require.NotEmpty(t, code) + + // Poke the fee vault to withdraw + l2Opts, err := bind.NewKeyedTransactorWithChainID(cfg.Secrets.Bob, cfg.L2ChainIDBig()) + require.NoError(t, err) + withdrawalTx, err := feeVault.Withdraw(l2Opts) + waitForTx(t, withdrawalTx, err, l2Client) + + // Get the receipt and the amount withdrawn + receipt, err = l2Client.TransactionReceipt(context.Background(), withdrawalTx.Hash()) + require.NoError(t, err) + + inclusionHeight := receipt.BlockNumber.Uint64() + it, err := feeVault.FilterWithdrawal(&bind.FilterOpts{ + Start: inclusionHeight, + End: &inclusionHeight, + }) + require.NoError(t, err) + require.True(t, it.Next()) + + withdrawnAmount := it.Event.Value + + // Finalize the withdrawal + proveReceipt, finalizeReceipt, resolveClaimReceipt, resolveReceipt := helpers.ProveAndFinalizeWithdrawal(t, cfg, sys, "verifier", cfg.Secrets.Alice, receipt) + require.Equal(t, types.ReceiptStatusSuccessful, proveReceipt.Status) + require.Equal(t, types.ReceiptStatusSuccessful, finalizeReceipt.Status) + if e2eutils.UseFaultProofs() { + require.Equal(t, types.ReceiptStatusSuccessful, resolveClaimReceipt.Status) + require.Equal(t, types.ReceiptStatusSuccessful, resolveReceipt.Status) + } + + // Assert that the recipient's balance did increase + var recipientBalanceAfter *big.Int + if enabled { + recipientBalanceAfter, err = weth9.BalanceOf(&bind.CallOpts{}, recipient) + } else { + recipientBalanceAfter, err = l1Client.BalanceAt(context.Background(), recipient, nil) + } + require.NoError(t, err) + + require.Equal(t, recipientBalanceAfter, new(big.Int).Add(recipientBalanceBefore, withdrawnAmount)) + } + + 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) + checkFeeWithdrawal(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) + checkFeeWithdrawal(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 e2esys.SystemConfig, sys *e2esys.System, cgtAddress common.Address) { + l1Client := sys.NodeClient("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.NodeClient("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/system/helpers/tx_helper.go b/op-e2e/system/helpers/tx_helper.go new file mode 100644 index 000000000000..f5cb11aa8a1d --- /dev/null +++ b/op-e2e/system/helpers/tx_helper.go @@ -0,0 +1,166 @@ +package helpers + +import ( + "context" + "crypto/ecdsa" + "math/big" + "testing" + "time" + + "github.com/ethereum-optimism/optimism/op-e2e/system/e2esys" + + "github.com/ethereum-optimism/optimism/op-e2e/e2eutils/wait" + + "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" + "github.com/ethereum/go-ethereum/common" + "github.com/ethereum/go-ethereum/core/types" + "github.com/ethereum/go-ethereum/ethclient" + "github.com/stretchr/testify/require" +) + +// SendDepositTx creates and sends a deposit transaction. +// The L1 transaction, including sender, is configured by the l1Opts param. +// The L2 transaction options can be configured by modifying the DepositTxOps value supplied to applyL2Opts +// Will verify that the transaction is included with the expected status on L1 and L2 +// Returns the receipt of the L2 transaction +func SendDepositTx(t *testing.T, cfg e2esys.SystemConfig, l1Client *ethclient.Client, l2Client *ethclient.Client, l1Opts *bind.TransactOpts, applyL2Opts DepositTxOptsFn) *types.Receipt { + l2Opts := defaultDepositTxOpts(l1Opts) + applyL2Opts(l2Opts) + + // Find deposit contract + depositContract, err := bindings.NewOptimismPortal(cfg.L1Deployments.OptimismPortalProxy, l1Client) + require.NoError(t, err) + + // Finally send TX + // Add 10% padding for the L1 gas limit because the estimation process can be affected by the 1559 style cost scale + // for buying L2 gas in the portal contracts. + tx, err := transactions.PadGasEstimate(l1Opts, 1.1, func(opts *bind.TransactOpts) (*types.Transaction, error) { + return depositContract.DepositTransaction(opts, l2Opts.ToAddr, l2Opts.Value, l2Opts.GasLimit, l2Opts.IsCreation, l2Opts.Data) + }) + require.NoError(t, err, "with deposit tx") + t.Logf("SendDepositTx: transaction sent: %v", tx.Hash()) + + // Wait for transaction on L1 + ctx, cancel := context.WithCancel(context.Background()) + defer cancel() + l1Receipt, err := wait.ForReceiptOK(ctx, l1Client, tx.Hash()) + require.NoError(t, err, "Waiting for deposit tx on L1") + t.Logf("SendDepositTx: included on L1") + + // Wait for transaction to be included on L2 + reconstructedDep, err := derive.UnmarshalDepositLogEvent(l1Receipt.Logs[0]) + require.NoError(t, err, "Could not reconstruct L2 Deposit") + tx = types.NewTx(reconstructedDep) + l2Receipt, err := wait.ForReceipt(ctx, l2Client, tx.Hash(), l2Opts.ExpectedStatus) + require.NoError(t, err, "Waiting for deposit tx on L2") + t.Logf("SendDepositTx: arrived on L2") + return l2Receipt +} + +type DepositTxOptsFn func(l2Opts *DepositTxOpts) + +type DepositTxOpts struct { + ToAddr common.Address + Value *big.Int + GasLimit uint64 + IsCreation bool + Data []byte + ExpectedStatus uint64 +} + +func defaultDepositTxOpts(opts *bind.TransactOpts) *DepositTxOpts { + return &DepositTxOpts{ + ToAddr: opts.From, + Value: opts.Value, + GasLimit: 1_000_000, + IsCreation: false, + Data: nil, + ExpectedStatus: types.ReceiptStatusSuccessful, + } +} + +// SendL2Tx creates and sends a transaction. +// The supplied privKey is used to specify the account to send from and the transaction is sent to the supplied l2Client +// Transaction options and expected status can be configured in the applyTxOpts function by modifying the supplied TxOpts +// Will verify that the transaction is included with the expected status on l2Client and any clients added to TxOpts.VerifyClients +func SendL2TxWithID(t *testing.T, chainID *big.Int, l2Client *ethclient.Client, privKey *ecdsa.PrivateKey, applyTxOpts TxOptsFn) *types.Receipt { + opts := defaultTxOpts() + applyTxOpts(opts) + tx := types.MustSignNewTx(privKey, types.LatestSignerForChainID(chainID), &types.DynamicFeeTx{ + ChainID: chainID, + Nonce: opts.Nonce, // Already have deposit + To: opts.ToAddr, + Value: opts.Value, + GasTipCap: opts.GasTipCap, + GasFeeCap: opts.GasFeeCap, + Gas: opts.Gas, + Data: opts.Data, + }) + ctx, cancel := context.WithTimeout(context.Background(), 30*time.Second) + defer cancel() + err := l2Client.SendTransaction(ctx, tx) + require.NoError(t, err, "Sending L2 tx") + + receipt, err := wait.ForReceiptOK(ctx, l2Client, tx.Hash()) + require.NoError(t, err, "Waiting for L2 tx") + require.Equal(t, opts.ExpectedStatus, receipt.Status, "TX should have expected status") + + for i, client := range opts.VerifyClients { + t.Logf("Waiting for tx %v on verification client %d", tx.Hash(), i) + receiptVerif, err := wait.ForReceiptOK(ctx, client, tx.Hash()) + require.NoErrorf(t, err, "Waiting for L2 tx on verification client %d", i) + require.Equalf(t, receipt, receiptVerif, "Receipts should be the same on sequencer and verification client %d", i) + } + return receipt +} + +func SendL2Tx(t *testing.T, cfg e2esys.SystemConfig, l2Client *ethclient.Client, privKey *ecdsa.PrivateKey, applyTxOpts TxOptsFn) *types.Receipt { + return SendL2TxWithID(t, cfg.L2ChainIDBig(), l2Client, privKey, applyTxOpts) +} + +type TxOptsFn func(opts *TxOpts) + +type TxOpts struct { + ToAddr *common.Address + Nonce uint64 + Value *big.Int + Gas uint64 + GasTipCap *big.Int + GasFeeCap *big.Int + Data []byte + ExpectedStatus uint64 + VerifyClients []*ethclient.Client +} + +// VerifyOnClients adds additional l2 clients that should sync the block the tx is included in +// Checks that the receipt received from these clients is equal to the receipt received from the sequencer +func (o *TxOpts) VerifyOnClients(clients ...*ethclient.Client) { + o.VerifyClients = append(o.VerifyClients, clients...) +} + +func defaultTxOpts() *TxOpts { + return &TxOpts{ + ToAddr: nil, + Nonce: 0, + Value: common.Big0, + GasTipCap: big.NewInt(10), + GasFeeCap: big.NewInt(200), + Gas: 21_000, + Data: nil, + ExpectedStatus: types.ReceiptStatusSuccessful, + } +} + +// CalcGasFees determines the actual cost of the transaction given a specific base fee +// This does not include the L1 data fee charged from L2 transactions. +func CalcGasFees(gasUsed uint64, gasTipCap *big.Int, gasFeeCap *big.Int, baseFee *big.Int) *big.Int { + x := new(big.Int).Add(gasTipCap, baseFee) + // If tip + basefee > gas fee cap, clamp it to the gas fee cap + if x.Cmp(gasFeeCap) > 0 { + x = gasFeeCap + } + return x.Mul(x, new(big.Int).SetUint64(gasUsed)) +} diff --git a/op-e2e/system/helpers/withdrawal_helper.go b/op-e2e/system/helpers/withdrawal_helper.go new file mode 100644 index 000000000000..b7d11a63060c --- /dev/null +++ b/op-e2e/system/helpers/withdrawal_helper.go @@ -0,0 +1,273 @@ +package helpers + +import ( + "context" + "crypto/ecdsa" + "errors" + "math/big" + "testing" + "time" + + "github.com/ethereum-optimism/optimism/op-e2e/system/e2esys" + + "github.com/ethereum-optimism/optimism/op-chain-ops/crossdomain" + "github.com/ethereum-optimism/optimism/op-challenger/game/fault/contracts" + "github.com/ethereum-optimism/optimism/op-challenger/game/fault/contracts/metrics" + gameTypes "github.com/ethereum-optimism/optimism/op-challenger/game/types" + + "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/transactions" + "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-optimism/optimism/op-service/sources/batching" + "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/ethclient" + "github.com/ethereum/go-ethereum/ethclient/gethclient" + "github.com/stretchr/testify/require" +) + +const SolErrClaimAlreadyResolved = "0xf1a94581" + +type ClientProvider interface { + NodeClient(name string) *ethclient.Client +} + +func SendWithdrawal(t *testing.T, cfg e2esys.SystemConfig, l2Client *ethclient.Client, privKey *ecdsa.PrivateKey, applyOpts WithdrawalTxOptsFn) (*types.Transaction, *types.Receipt) { + opts := defaultWithdrawalTxOpts() + applyOpts(opts) + + // Bind L2 Withdrawer Contract + l2withdrawer, err := bindings.NewL2ToL1MessagePasser(predeploys.L2ToL1MessagePasserAddr, l2Client) + require.Nil(t, err, "binding withdrawer on L2") + + // Initiate Withdrawal + l2opts, err := bind.NewKeyedTransactorWithChainID(privKey, cfg.L2ChainIDBig()) + require.Nil(t, err) + l2opts.Value = opts.Value + tx, err := l2withdrawer.InitiateWithdrawal(l2opts, l2opts.From, big.NewInt(int64(opts.Gas)), opts.Data) + require.Nil(t, err, "sending initiate withdraw tx") + + receipt, err := geth.WaitForTransaction(tx.Hash(), l2Client, 10*time.Duration(cfg.DeployConfig.L1BlockTime)*time.Second) + require.Nil(t, err, "withdrawal initiated on L2 sequencer") + require.Equal(t, opts.ExpectedStatus, receipt.Status, "transaction had incorrect status") + + for i, client := range opts.VerifyClients { + t.Logf("Waiting for tx %v on verification client %d", tx.Hash(), i) + receiptVerif, err := geth.WaitForTransaction(tx.Hash(), client, 10*time.Duration(cfg.DeployConfig.L2BlockTime)*time.Second) + require.Nilf(t, err, "Waiting for L2 tx on verification client %d", i) + require.Equalf(t, receipt, receiptVerif, "Receipts should be the same on sequencer and verification client %d", i) + } + return tx, receipt +} + +type WithdrawalTxOptsFn func(opts *WithdrawalTxOpts) + +type WithdrawalTxOpts struct { + ToAddr *common.Address + Nonce uint64 + Value *big.Int + Gas uint64 + Data []byte + ExpectedStatus uint64 + VerifyClients []*ethclient.Client +} + +// VerifyOnClients adds additional l2 clients that should sync the block the tx is included in +// Checks that the receipt received from these clients is equal to the receipt received from the sequencer +func (o *WithdrawalTxOpts) VerifyOnClients(clients ...*ethclient.Client) { + o.VerifyClients = append(o.VerifyClients, clients...) +} + +func defaultWithdrawalTxOpts() *WithdrawalTxOpts { + return &WithdrawalTxOpts{ + ToAddr: nil, + Nonce: 0, + Value: common.Big0, + Gas: 21_000, + Data: nil, + ExpectedStatus: types.ReceiptStatusSuccessful, + } +} + +func ProveAndFinalizeWithdrawal(t *testing.T, cfg e2esys.SystemConfig, clients ClientProvider, l2NodeName string, ethPrivKey *ecdsa.PrivateKey, l2WithdrawalReceipt *types.Receipt) (*types.Receipt, *types.Receipt, *types.Receipt, *types.Receipt) { + params, proveReceipt := ProveWithdrawal(t, cfg, clients, l2NodeName, ethPrivKey, l2WithdrawalReceipt) + finalizeReceipt, resolveClaimReceipt, resolveReceipt := FinalizeWithdrawal(t, cfg, clients.NodeClient("l1"), ethPrivKey, proveReceipt, params) + return proveReceipt, finalizeReceipt, resolveClaimReceipt, resolveReceipt +} + +func ProveWithdrawal(t *testing.T, cfg e2esys.SystemConfig, clients ClientProvider, l2NodeName string, ethPrivKey *ecdsa.PrivateKey, l2WithdrawalReceipt *types.Receipt) (withdrawals.ProvenWithdrawalParameters, *types.Receipt) { + // Get l2BlockNumber for proof generation + ctx, cancel := context.WithTimeout(context.Background(), 40*time.Duration(cfg.DeployConfig.L1BlockTime)*time.Second) + defer cancel() + + l1Client := clients.NodeClient(e2esys.RoleL1) + var blockNumber uint64 + var err error + if e2eutils.UseFaultProofs() { + blockNumber, err = wait.ForGamePublished(ctx, l1Client, config.L1Deployments.OptimismPortalProxy, config.L1Deployments.DisputeGameFactoryProxy, l2WithdrawalReceipt.BlockNumber) + require.NoError(t, err) + } else { + blockNumber, err = wait.ForOutputRootPublished(ctx, l1Client, config.L1Deployments.L2OutputOracleProxy, l2WithdrawalReceipt.BlockNumber) + require.NoError(t, err) + } + + receiptCl := clients.NodeClient(l2NodeName) + blockCl := clients.NodeClient(l2NodeName) + proofCl := gethclient.New(receiptCl.Client()) + + ctx, cancel = context.WithTimeout(context.Background(), 30*time.Second) + defer cancel() + // Get the latest header + header, err := receiptCl.HeaderByNumber(ctx, new(big.Int).SetUint64(blockNumber)) + require.NoError(t, err) + + oracle, err := bindings.NewL2OutputOracleCaller(config.L1Deployments.L2OutputOracleProxy, l1Client) + require.NoError(t, err) + + factory, err := bindings.NewDisputeGameFactoryCaller(config.L1Deployments.DisputeGameFactoryProxy, l1Client) + require.NoError(t, err) + + portal2, err := bindingspreview.NewOptimismPortal2Caller(config.L1Deployments.OptimismPortalProxy, l1Client) + require.NoError(t, err) + + params, err := ProveWithdrawalParameters(context.Background(), proofCl, receiptCl, blockCl, l2WithdrawalReceipt.TxHash, header, oracle, factory, portal2) + require.NoError(t, err) + + portal, err := bindings.NewOptimismPortal(config.L1Deployments.OptimismPortalProxy, l1Client) + require.NoError(t, err) + + opts, err := bind.NewKeyedTransactorWithChainID(ethPrivKey, cfg.L1ChainIDBig()) + require.NoError(t, err) + + // Prove withdrawal + tx, err := portal.ProveWithdrawalTransaction( + opts, + bindings.TypesWithdrawalTransaction{ + Nonce: params.Nonce, + Sender: params.Sender, + Target: params.Target, + Value: params.Value, + GasLimit: params.GasLimit, + Data: params.Data, + }, + params.L2OutputIndex, + params.OutputRootProof, + params.WithdrawalProof, + ) + require.NoError(t, err) + + // Ensure that our withdrawal was proved successfully + proveReceipt, err := geth.WaitForTransaction(tx.Hash(), l1Client, 3*time.Duration(cfg.DeployConfig.L1BlockTime)*time.Second) + require.NoError(t, err, "prove withdrawal") + require.Equal(t, types.ReceiptStatusSuccessful, proveReceipt.Status) + return params, proveReceipt +} + +func ProveWithdrawalParameters(ctx context.Context, proofCl withdrawals.ProofClient, l2ReceiptCl withdrawals.ReceiptClient, l2BlockCl withdrawals.BlockClient, txHash common.Hash, header *types.Header, l2OutputOracleContract *bindings.L2OutputOracleCaller, disputeGameFactoryContract *bindings.DisputeGameFactoryCaller, optimismPortal2Contract *bindingspreview.OptimismPortal2Caller) (withdrawals.ProvenWithdrawalParameters, error) { + if e2eutils.UseFaultProofs() { + return withdrawals.ProveWithdrawalParametersFaultProofs(ctx, proofCl, l2ReceiptCl, l2BlockCl, txHash, disputeGameFactoryContract, optimismPortal2Contract) + } else { + return withdrawals.ProveWithdrawalParameters(ctx, proofCl, l2ReceiptCl, l2BlockCl, txHash, header, l2OutputOracleContract) + } +} + +func FinalizeWithdrawal(t *testing.T, cfg e2esys.SystemConfig, l1Client *ethclient.Client, privKey *ecdsa.PrivateKey, withdrawalProofReceipt *types.Receipt, params withdrawals.ProvenWithdrawalParameters) (*types.Receipt, *types.Receipt, *types.Receipt) { + // Wait for finalization and then create the Finalized Withdrawal Transaction + ctx, cancel := context.WithTimeout(context.Background(), 30*time.Duration(cfg.DeployConfig.L1BlockTime)*time.Second) + defer cancel() + + wd := crossdomain.Withdrawal{ + Nonce: params.Nonce, + Sender: ¶ms.Sender, + Target: ¶ms.Target, + Value: params.Value, + GasLimit: params.GasLimit, + Data: params.Data, + } + + opts, err := bind.NewKeyedTransactorWithChainID(privKey, cfg.L1ChainIDBig()) + require.NoError(t, err) + + var resolveClaimReceipt *types.Receipt + var resolveReceipt *types.Receipt + if e2eutils.UseFaultProofs() { + portal2, err := bindingspreview.NewOptimismPortal2(config.L1Deployments.OptimismPortalProxy, l1Client) + require.NoError(t, err) + + wdHash, err := wd.Hash() + require.NoError(t, err) + + game, err := portal2.ProvenWithdrawals(&bind.CallOpts{}, wdHash, opts.From) + require.NoError(t, err) + require.NotNil(t, game, "withdrawal should be proven") + + caller := batching.NewMultiCaller(l1Client.Client(), batching.DefaultBatchSize) + gameContract, err := contracts.NewFaultDisputeGameContract(context.Background(), metrics.NoopContractMetrics, game.DisputeGameProxy, caller) + require.NoError(t, err) + + timedCtx, cancel := context.WithTimeout(context.Background(), 30*time.Second) + defer cancel() + require.NoError(t, wait.For(timedCtx, time.Second, func() (bool, error) { + err := gameContract.CallResolveClaim(context.Background(), 0) + if err != nil { + t.Logf("Could not resolve dispute game claim: %v", err) + } + return err == nil, nil + })) + + t.Log("FinalizeWithdrawal: resolveClaim...") + tx, err := gameContract.ResolveClaimTx(0) + require.NoError(t, err, "create resolveClaim tx") + _, resolveClaimReceipt, err = transactions.SendTx(ctx, l1Client, tx, privKey) + var rsErr *wait.ReceiptStatusError + if errors.As(err, &rsErr) && rsErr.TxTrace.Output.String() == SolErrClaimAlreadyResolved { + t.Logf("resolveClaim failed (tx: %s) because claim got already resolved", resolveClaimReceipt.TxHash) + } else { + require.NoError(t, err) + } + + t.Log("FinalizeWithdrawal: resolve...") + tx, err = gameContract.ResolveTx() + require.NoError(t, err, "create resolve tx") + _, resolveReceipt = transactions.RequireSendTx(t, ctx, l1Client, tx, privKey, transactions.WithReceiptStatusIgnore()) + if resolveReceipt.Status == types.ReceiptStatusFailed { + t.Logf("resolve failed (tx: %s)! But game may have resolved already. Checking now...", resolveReceipt.TxHash) + // it may have failed because someone else front-ran this by calling `resolve()` first. + status, err := gameContract.GetStatus(ctx) + require.NoError(t, err) + require.Equal(t, gameTypes.GameStatusDefenderWon, status, "game must have resolved with defender won") + t.Logf("resolve was not needed, the game was already resolved") + } + } + + if e2eutils.UseFaultProofs() { + t.Log("FinalizeWithdrawal: waiting for successful withdrawal check...") + err := wait.ForWithdrawalCheck(ctx, l1Client, wd, config.L1Deployments.OptimismPortalProxy, opts.From) + require.NoError(t, err) + } else { + t.Log("FinalizeWithdrawal: waiting for finalization...") + err := wait.ForFinalizationPeriod(ctx, l1Client, withdrawalProofReceipt.BlockNumber, config.L1Deployments.L2OutputOracleProxy) + require.NoError(t, err) + } + + portal, err := bindings.NewOptimismPortal(config.L1Deployments.OptimismPortalProxy, l1Client) + require.NoError(t, err) + + // Finalize withdrawal + t.Log("FinalizeWithdrawal: finalizing withdrawal...") + tx, err := portal.FinalizeWithdrawalTransaction(opts, wd.WithdrawalTransaction()) + require.NoError(t, err) + + // Ensure that our withdrawal was finalized successfully + finalizeReceipt, err := wait.ForReceiptOK(ctx, l1Client, tx.Hash()) + require.NoError(t, err, "finalize withdrawal") + require.Equal(t, types.ReceiptStatusSuccessful, finalizeReceipt.Status) + return finalizeReceipt, resolveClaimReceipt, resolveReceipt +} diff --git a/op-e2e/system/p2p/gossip_test.go b/op-e2e/system/p2p/gossip_test.go new file mode 100644 index 000000000000..6958bdffcf4f --- /dev/null +++ b/op-e2e/system/p2p/gossip_test.go @@ -0,0 +1,203 @@ +package p2p + +import ( + "context" + "math/big" + "slices" + "testing" + "time" + + op_e2e "github.com/ethereum-optimism/optimism/op-e2e" + + "github.com/ethereum-optimism/optimism/op-e2e/e2eutils/opnode" + "github.com/ethereum-optimism/optimism/op-e2e/system/e2esys" + "github.com/ethereum-optimism/optimism/op-e2e/system/helpers" + rollupNode "github.com/ethereum-optimism/optimism/op-node/node" + "github.com/ethereum-optimism/optimism/op-node/p2p" + "github.com/ethereum-optimism/optimism/op-node/rollup/driver" + "github.com/ethereum-optimism/optimism/op-service/eth" + "github.com/ethereum-optimism/optimism/op-service/retry" + "github.com/ethereum-optimism/optimism/op-service/testlog" + "github.com/ethereum/go-ethereum/common" + "github.com/ethereum/go-ethereum/log" + "github.com/libp2p/go-libp2p/core/peer" + "github.com/stretchr/testify/require" +) + +// TestSystemMockP2P sets up a L1 Geth node, a rollup node, and a L2 geth node and then confirms that +// the nodes can sync L2 blocks before they are confirmed on L1. +func TestSystemMockP2P(t *testing.T) { + op_e2e.InitParallel(t) + + cfg := e2esys.DefaultSystemConfig(t) + // Disable batcher, so we don't sync from L1 & set a large sequence window so we only have unsafe blocks + cfg.DisableBatcher = true + cfg.DeployConfig.SequencerWindowSize = 100_000 + cfg.DeployConfig.MaxSequencerDrift = 100_000 + // disable at the start, so we don't miss any gossiped blocks. + cfg.Nodes["sequencer"].Driver.SequencerStopped = true + + // connect the nodes + cfg.P2PTopology = map[string][]string{ + "verifier": {"sequencer"}, + } + + var published, received []common.Hash + seqTracer, verifTracer := new(opnode.FnTracer), new(opnode.FnTracer) + seqTracer.OnPublishL2PayloadFn = func(ctx context.Context, payload *eth.ExecutionPayloadEnvelope) { + published = append(published, payload.ExecutionPayload.BlockHash) + } + verifTracer.OnUnsafeL2PayloadFn = func(ctx context.Context, from peer.ID, payload *eth.ExecutionPayloadEnvelope) { + received = append(received, payload.ExecutionPayload.BlockHash) + } + cfg.Nodes["sequencer"].Tracer = seqTracer + cfg.Nodes["verifier"].Tracer = verifTracer + + sys, err := cfg.Start(t) + require.Nil(t, err, "Error starting up system") + + // Enable the sequencer now that everyone is ready to receive payloads. + rollupClient := sys.RollupClient("sequencer") + + verifierPeerID := sys.RollupNodes["verifier"].P2P().Host().ID() + check := func() bool { + sequencerBlocksTopicPeers := sys.RollupNodes["sequencer"].P2P().GossipOut().AllBlockTopicsPeers() + return slices.Contains[[]peer.ID](sequencerBlocksTopicPeers, verifierPeerID) + } + + // poll to see if the verifier node is connected & meshed on gossip. + // Without this verifier, we shouldn't start sending blocks around, or we'll miss them and fail the test. + backOffStrategy := retry.Exponential() + for i := 0; i < 10; i++ { + if check() { + break + } + time.Sleep(backOffStrategy.Duration(i)) + } + require.True(t, check(), "verifier must be meshed with sequencer for gossip test to proceed") + + require.NoError(t, rollupClient.StartSequencer(context.Background(), sys.L2GenesisCfg.ToBlock().Hash())) + + l2Seq := sys.NodeClient("sequencer") + l2Verif := sys.NodeClient("verifier") + + // Transactor Account + ethPrivKey := cfg.Secrets.Alice + + // Submit TX to L2 sequencer node + receiptSeq := helpers.SendL2Tx(t, cfg, l2Seq, ethPrivKey, func(opts *helpers.TxOpts) { + opts.ToAddr = &common.Address{0xff, 0xff} + opts.Value = big.NewInt(1_000_000_000) + + // Wait until the block it was first included in shows up in the safe chain on the verifier + opts.VerifyOnClients(l2Verif) + }) + + // Verify that everything that was received was published + require.GreaterOrEqual(t, len(published), len(received)) + require.Subset(t, published, received) + + // Verify that the tx was received via p2p + require.Contains(t, received, receiptSeq.BlockHash) +} + +// TestSystemDenseTopology sets up a dense p2p topology with 3 verifier nodes and 1 sequencer node. +func TestSystemDenseTopology(t *testing.T) { + t.Skip("Skipping dense topology test to avoid flakiness. @refcell address in p2p scoring pr.") + + op_e2e.InitParallel(t) + + cfg := e2esys.DefaultSystemConfig(t) + // slow down L1 blocks so we can see the L2 blocks arrive well before the L1 blocks do. + // Keep the seq window small so the L2 chain is started quick + cfg.DeployConfig.L1BlockTime = 10 + + // Append additional nodes to the system to construct a dense p2p network + cfg.Nodes["verifier2"] = &rollupNode.Config{ + Driver: driver.Config{ + VerifierConfDepth: 0, + SequencerConfDepth: 0, + SequencerEnabled: false, + }, + L1EpochPollInterval: time.Second * 4, + } + cfg.Nodes["verifier3"] = &rollupNode.Config{ + Driver: driver.Config{ + VerifierConfDepth: 0, + SequencerConfDepth: 0, + SequencerEnabled: false, + }, + L1EpochPollInterval: time.Second * 4, + } + cfg.Loggers["verifier2"] = testlog.Logger(t, log.LevelInfo).New("role", "verifier") + cfg.Loggers["verifier3"] = testlog.Logger(t, log.LevelInfo).New("role", "verifier") + + // connect the nodes + cfg.P2PTopology = map[string][]string{ + "verifier": {"sequencer", "verifier2", "verifier3"}, + "verifier2": {"sequencer", "verifier", "verifier3"}, + "verifier3": {"sequencer", "verifier", "verifier2"}, + } + + // Set peer scoring for each node, but without banning + for _, node := range cfg.Nodes { + params, err := p2p.GetScoringParams("light", &node.Rollup) + require.NoError(t, err) + node.P2P = &p2p.Config{ + ScoringParams: params, + BanningEnabled: false, + } + } + + var published, received1, received2, received3 []common.Hash + seqTracer, verifTracer, verifTracer2, verifTracer3 := new(opnode.FnTracer), new(opnode.FnTracer), new(opnode.FnTracer), new(opnode.FnTracer) + seqTracer.OnPublishL2PayloadFn = func(ctx context.Context, payload *eth.ExecutionPayloadEnvelope) { + published = append(published, payload.ExecutionPayload.BlockHash) + } + verifTracer.OnUnsafeL2PayloadFn = func(ctx context.Context, from peer.ID, payload *eth.ExecutionPayloadEnvelope) { + received1 = append(received1, payload.ExecutionPayload.BlockHash) + } + verifTracer2.OnUnsafeL2PayloadFn = func(ctx context.Context, from peer.ID, payload *eth.ExecutionPayloadEnvelope) { + received2 = append(received2, payload.ExecutionPayload.BlockHash) + } + verifTracer3.OnUnsafeL2PayloadFn = func(ctx context.Context, from peer.ID, payload *eth.ExecutionPayloadEnvelope) { + received3 = append(received3, payload.ExecutionPayload.BlockHash) + } + cfg.Nodes["sequencer"].Tracer = seqTracer + cfg.Nodes["verifier"].Tracer = verifTracer + cfg.Nodes["verifier2"].Tracer = verifTracer2 + cfg.Nodes["verifier3"].Tracer = verifTracer3 + + sys, err := cfg.Start(t) + require.Nil(t, err, "Error starting up system") + + l2Seq := sys.NodeClient("sequencer") + l2Verif := sys.NodeClient("verifier") + l2Verif2 := sys.NodeClient("verifier2") + l2Verif3 := sys.NodeClient("verifier3") + + // Transactor Account + ethPrivKey := cfg.Secrets.Alice + + // Submit TX to L2 sequencer node + receiptSeq := helpers.SendL2Tx(t, cfg, l2Seq, ethPrivKey, func(opts *helpers.TxOpts) { + opts.ToAddr = &common.Address{0xff, 0xff} + opts.Value = big.NewInt(1_000_000_000) + + // Wait until the block it was first included in shows up in the safe chain on the verifiers + opts.VerifyOnClients(l2Verif, l2Verif2, l2Verif3) + }) + + // Verify that everything that was received was published + require.GreaterOrEqual(t, len(published), len(received1)) + require.GreaterOrEqual(t, len(published), len(received2)) + require.GreaterOrEqual(t, len(published), len(received3)) + require.ElementsMatch(t, published, received1[:len(published)]) + require.ElementsMatch(t, published, received2[:len(published)]) + require.ElementsMatch(t, published, received3[:len(published)]) + + // Verify that the tx was received via p2p + require.Contains(t, received1, receiptSeq.BlockHash) + require.Contains(t, received2, receiptSeq.BlockHash) + require.Contains(t, received3, receiptSeq.BlockHash) +} diff --git a/op-e2e/system/p2p/p2p_test.go b/op-e2e/system/p2p/p2p_test.go new file mode 100644 index 000000000000..e7aa7b0b9b73 --- /dev/null +++ b/op-e2e/system/p2p/p2p_test.go @@ -0,0 +1,11 @@ +package p2p + +import ( + "testing" + + op_e2e "github.com/ethereum-optimism/optimism/op-e2e" +) + +func TestMain(m *testing.M) { + op_e2e.RunMain(m) +} diff --git a/op-e2e/system/p2p/reqresp_test.go b/op-e2e/system/p2p/reqresp_test.go new file mode 100644 index 000000000000..d3245d8fd257 --- /dev/null +++ b/op-e2e/system/p2p/reqresp_test.go @@ -0,0 +1,168 @@ +package p2p + +import ( + "context" + "math/big" + "testing" + "time" + + op_e2e "github.com/ethereum-optimism/optimism/op-e2e" + + "github.com/ethereum-optimism/optimism/op-e2e/e2eutils/geth" + "github.com/ethereum-optimism/optimism/op-e2e/e2eutils/opnode" + "github.com/ethereum-optimism/optimism/op-e2e/e2eutils/wait" + "github.com/ethereum-optimism/optimism/op-e2e/system/e2esys" + "github.com/ethereum-optimism/optimism/op-e2e/system/helpers" + "github.com/ethereum-optimism/optimism/op-node/metrics" + rollupNode "github.com/ethereum-optimism/optimism/op-node/node" + "github.com/ethereum-optimism/optimism/op-node/p2p" + "github.com/ethereum-optimism/optimism/op-node/rollup/driver" + "github.com/ethereum-optimism/optimism/op-service/endpoint" + "github.com/ethereum-optimism/optimism/op-service/eth" + "github.com/ethereum-optimism/optimism/op-service/oppprof" + "github.com/ethereum-optimism/optimism/op-service/testlog" + "github.com/ethereum/go-ethereum/common" + "github.com/ethereum/go-ethereum/ethclient" + "github.com/ethereum/go-ethereum/log" + "github.com/libp2p/go-libp2p/core/peer" + "github.com/stretchr/testify/require" +) + +func TestSystemP2PAltSync(t *testing.T) { + ctx, cancel := context.WithCancel(context.Background()) + defer cancel() + + op_e2e.InitParallel(t) + + cfg := e2esys.DefaultSystemConfig(t) + + // remove default verifier node + delete(cfg.Nodes, "verifier") + // Add more verifier nodes + cfg.Nodes["alice"] = &rollupNode.Config{ + Driver: driver.Config{ + VerifierConfDepth: 0, + SequencerConfDepth: 0, + SequencerEnabled: false, + }, + L1EpochPollInterval: time.Second * 4, + } + cfg.Nodes["bob"] = &rollupNode.Config{ + Driver: driver.Config{ + VerifierConfDepth: 0, + SequencerConfDepth: 0, + SequencerEnabled: false, + }, + L1EpochPollInterval: time.Second * 4, + } + cfg.Loggers["alice"] = testlog.Logger(t, log.LevelInfo).New("role", "alice") + cfg.Loggers["bob"] = testlog.Logger(t, log.LevelInfo).New("role", "bob") + + // connect the nodes + cfg.P2PTopology = map[string][]string{ + "sequencer": {"alice", "bob"}, + "alice": {"sequencer", "bob"}, + "bob": {"alice", "sequencer"}, + } + // Enable the P2P req-resp based sync + cfg.P2PReqRespSync = true + + // Disable batcher, so there will not be any L1 data to sync from + cfg.DisableBatcher = true + + var published []string + seqTracer := new(opnode.FnTracer) + // The sequencer still publishes the blocks to the tracer, even if they do not reach the network due to disabled P2P + seqTracer.OnPublishL2PayloadFn = func(ctx context.Context, payload *eth.ExecutionPayloadEnvelope) { + published = append(published, payload.ExecutionPayload.ID().String()) + } + // Blocks are now received via the RPC based alt-sync method + cfg.Nodes["sequencer"].Tracer = seqTracer + + sys, err := cfg.Start(t) + require.Nil(t, err, "Error starting up system") + + l2Seq := sys.NodeClient("sequencer") + + // Transactor Account + ethPrivKey := cfg.Secrets.Alice + + // Submit a TX to L2 sequencer node + receiptSeq := helpers.SendL2Tx(t, cfg, l2Seq, ethPrivKey, func(opts *helpers.TxOpts) { + opts.ToAddr = &common.Address{0xff, 0xff} + opts.Value = big.NewInt(1_000_000_000) + }) + + // Gossip is able to respond to IWANT messages for the duration of heartbeat_time * message_window = 0.5 * 12 = 6 + // Wait till we pass that, and then we'll have missed some blocks that cannot be retrieved in any way from gossip + time.Sleep(time.Second * 10) + + // set up our syncer node, connect it to alice/bob + cfg.Loggers["syncer"] = testlog.Logger(t, log.LevelInfo).New("role", "syncer") + + // Create a peer, and hook up alice and bob + h, err := sys.NewMockNetPeer() + require.NoError(t, err) + _, err = sys.Mocknet.LinkPeers(sys.RollupNodes["alice"].P2P().Host().ID(), h.ID()) + require.NoError(t, err) + _, err = sys.Mocknet.LinkPeers(sys.RollupNodes["bob"].P2P().Host().ID(), h.ID()) + require.NoError(t, err) + + // Configure the new rollup node that'll be syncing + var syncedPayloads []string + syncNodeCfg := &rollupNode.Config{ + Driver: driver.Config{VerifierConfDepth: 0}, + Rollup: *sys.RollupConfig, + P2PSigner: nil, + RPC: rollupNode.RPCConfig{ + ListenAddr: "127.0.0.1", + ListenPort: 0, + EnableAdmin: true, + }, + P2P: &p2p.Prepared{HostP2P: h, EnableReqRespSync: true}, + Metrics: rollupNode.MetricsConfig{Enabled: false}, // no metrics server + Pprof: oppprof.CLIConfig{}, + L1EpochPollInterval: time.Second * 10, + Tracer: &opnode.FnTracer{ + OnUnsafeL2PayloadFn: func(ctx context.Context, from peer.ID, payload *eth.ExecutionPayloadEnvelope) { + syncedPayloads = append(syncedPayloads, payload.ExecutionPayload.ID().String()) + }, + }, + } + e2esys.ConfigureL1(syncNodeCfg, sys.EthInstances["l1"], sys.L1BeaconEndpoint()) + syncerL2Engine, err := geth.InitL2("syncer", sys.L2GenesisCfg, cfg.JWTFilePath) + require.NoError(t, err) + require.NoError(t, syncerL2Engine.Node.Start()) + + e2esys.ConfigureL2(syncNodeCfg, syncerL2Engine, cfg.JWTSecret) + + syncerNode, err := rollupNode.New(ctx, syncNodeCfg, cfg.Loggers["syncer"], "", metrics.NewMetrics("")) + require.NoError(t, err) + err = syncerNode.Start(ctx) + require.NoError(t, err) + defer func() { + require.NoError(t, syncerNode.Stop(ctx)) + }() + + // connect alice and bob to our new syncer node + _, err = sys.Mocknet.ConnectPeers(sys.RollupNodes["alice"].P2P().Host().ID(), syncerNode.P2P().Host().ID()) + require.NoError(t, err) + _, err = sys.Mocknet.ConnectPeers(sys.RollupNodes["bob"].P2P().Host().ID(), syncerNode.P2P().Host().ID()) + require.NoError(t, err) + + rpc := syncerL2Engine.UserRPC().(endpoint.ClientRPC).ClientRPC() + l2Verif := ethclient.NewClient(rpc) + + // It may take a while to sync, but eventually we should see the sequenced data show up + receiptVerif, err := wait.ForReceiptOK(ctx, l2Verif, receiptSeq.TxHash) + require.Nil(t, err, "Waiting for L2 tx on verifier") + + require.Equal(t, receiptSeq, receiptVerif) + + // Verify that the tx was received via P2P sync + require.Contains(t, syncedPayloads, eth.BlockID{Hash: receiptVerif.BlockHash, Number: receiptVerif.BlockNumber.Uint64()}.String()) + + // Verify that everything that was received was published + require.GreaterOrEqual(t, len(published), len(syncedPayloads)) + require.Subset(t, published, syncedPayloads) +} diff --git a/op-e2e/system/p2p/txpool_test.go b/op-e2e/system/p2p/txpool_test.go new file mode 100644 index 000000000000..dde89ecdefb1 --- /dev/null +++ b/op-e2e/system/p2p/txpool_test.go @@ -0,0 +1,43 @@ +package p2p + +import ( + "math/big" + "testing" + "time" + + op_e2e "github.com/ethereum-optimism/optimism/op-e2e" + + "github.com/ethereum-optimism/optimism/op-e2e/system/e2esys" + "github.com/ethereum-optimism/optimism/op-e2e/system/helpers" + + "github.com/ethereum-optimism/optimism/op-e2e/e2eutils/geth" + "github.com/ethereum/go-ethereum/common" + "github.com/stretchr/testify/require" +) + +func TestTxGossip(t *testing.T) { + op_e2e.InitParallel(t) + cfg := e2esys.DefaultSystemConfig(t) + gethOpts := []geth.GethOption{ + geth.WithP2P(), + } + cfg.GethOptions["sequencer"] = append(cfg.GethOptions["sequencer"], gethOpts...) + cfg.GethOptions["verifier"] = append(cfg.GethOptions["verifier"], gethOpts...) + sys, err := cfg.Start(t) + require.NoError(t, err, "Start system") + + seqClient := sys.NodeClient("sequencer") + verifClient := sys.NodeClient("verifier") + geth.ConnectP2P(t, seqClient, verifClient) + + // This prevents the below tx-sending from flaking in CI + _, err = geth.WaitForBlock(big.NewInt(10), verifClient, time.Minute) + require.NoError(t, err) + + // Send a transaction to the verifier and it should be gossiped to the sequencer and included in a block. + helpers.SendL2Tx(t, cfg, verifClient, cfg.Secrets.Alice, func(opts *helpers.TxOpts) { + opts.ToAddr = &common.Address{0xaa} + opts.Value = common.Big1 + opts.VerifyOnClients(seqClient, verifClient) + }) +} diff --git a/op-e2e/build_helper.go b/op-e2e/system/proofs/build_helper.go similarity index 86% rename from op-e2e/build_helper.go rename to op-e2e/system/proofs/build_helper.go index b84240135c68..42201279867b 100644 --- a/op-e2e/build_helper.go +++ b/op-e2e/system/proofs/build_helper.go @@ -1,4 +1,4 @@ -package op_e2e +package proofs import ( "context" @@ -16,11 +16,11 @@ func BuildOpProgramClient(t *testing.T) string { ctx, cancel := context.WithTimeout(context.Background(), 2*time.Minute) defer cancel() cmd := exec.CommandContext(ctx, "make", "op-program-client") - cmd.Dir = "../op-program" + cmd.Dir = "../../../op-program" var out strings.Builder cmd.Stdout = &out cmd.Stderr = &out require.NoErrorf(t, cmd.Run(), "Failed to build op-program-client: %v", &out) t.Log("Built op-program-client successfully") - return "../op-program/bin/op-program-client" + return "../../../op-program/bin/op-program-client" } diff --git a/op-e2e/system/proofs/proofs_test.go b/op-e2e/system/proofs/proofs_test.go new file mode 100644 index 000000000000..6fff52bd465f --- /dev/null +++ b/op-e2e/system/proofs/proofs_test.go @@ -0,0 +1,11 @@ +package proofs + +import ( + "testing" + + op_e2e "github.com/ethereum-optimism/optimism/op-e2e" +) + +func TestMain(m *testing.M) { + op_e2e.RunMain(m) +} diff --git a/op-e2e/system/proofs/proposer_fp_test.go b/op-e2e/system/proofs/proposer_fp_test.go new file mode 100644 index 000000000000..4916d9d521a0 --- /dev/null +++ b/op-e2e/system/proofs/proposer_fp_test.go @@ -0,0 +1,77 @@ +package proofs + +import ( + "context" + "math/big" + "testing" + "time" + + op_e2e "github.com/ethereum-optimism/optimism/op-e2e" + + "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-e2e/bindings" + "github.com/ethereum-optimism/optimism/op-e2e/e2eutils/geth" + "github.com/ethereum-optimism/optimism/op-e2e/system/e2esys" + "github.com/ethereum-optimism/optimism/op-service/sources/batching" + "github.com/ethereum/go-ethereum/accounts/abi/bind" + "github.com/ethereum/go-ethereum/common" + "github.com/stretchr/testify/require" +) + +func TestL2OutputSubmitterFaultProofs(t *testing.T) { + op_e2e.InitParallel(t, op_e2e.SkipOnL2OO) + + cfg := e2esys.DefaultSystemConfig(t) + cfg.NonFinalizedProposals = true // speed up the time till we see output proposals + + sys, err := cfg.Start(t) + require.Nil(t, err, "Error starting up system") + + l1Client := sys.NodeClient("l1") + + rollupClient := sys.RollupClient("sequencer") + + disputeGameFactory, err := bindings.NewDisputeGameFactoryCaller(cfg.L1Deployments.DisputeGameFactoryProxy, l1Client) + require.Nil(t, err) + + initialGameCount, err := disputeGameFactory.GameCount(&bind.CallOpts{}) + require.Nil(t, err) + + l2Verif := sys.NodeClient("verifier") + _, err = geth.WaitForBlock(big.NewInt(6), l2Verif, 10*time.Duration(cfg.DeployConfig.L2BlockTime)*time.Second) + require.Nil(t, err) + + timeoutCh := time.After(15 * time.Second) + ticker := time.NewTicker(1 * time.Second) + defer ticker.Stop() + for { + latestGameCount, err := disputeGameFactory.GameCount(&bind.CallOpts{}) + require.Nil(t, err) + + if latestGameCount.Cmp(initialGameCount) > 0 { + caller := batching.NewMultiCaller(l1Client.Client(), batching.DefaultBatchSize) + committedL2Output, err := disputeGameFactory.GameAtIndex(&bind.CallOpts{}, new(big.Int).Sub(latestGameCount, common.Big1)) + require.Nil(t, err) + proxy, err := contracts.NewFaultDisputeGameContract(context.Background(), metrics.NoopContractMetrics, committedL2Output.Proxy, caller) + require.Nil(t, err) + claim, err := proxy.GetClaim(context.Background(), 0) + require.Nil(t, err) + + ctx, cancel := context.WithTimeout(context.Background(), 30*time.Second) + defer cancel() + _, gameBlockNumber, err := proxy.GetBlockRange(ctx) + require.Nil(t, err) + l2Output, err := rollupClient.OutputAtBlock(ctx, gameBlockNumber) + require.Nil(t, err) + require.EqualValues(t, l2Output.OutputRoot, claim.Value) + break + } + + select { + case <-timeoutCh: + t.Fatalf("State root oracle not updated") + case <-ticker.C: + } + } +} diff --git a/op-e2e/system/proofs/proposer_l2oo_test.go b/op-e2e/system/proofs/proposer_l2oo_test.go new file mode 100644 index 000000000000..3b737e0971b5 --- /dev/null +++ b/op-e2e/system/proofs/proposer_l2oo_test.go @@ -0,0 +1,82 @@ +package proofs + +import ( + "context" + "math/big" + "testing" + "time" + + op_e2e "github.com/ethereum-optimism/optimism/op-e2e" + + "github.com/ethereum-optimism/optimism/op-e2e/bindings" + "github.com/ethereum-optimism/optimism/op-e2e/e2eutils/geth" + "github.com/ethereum-optimism/optimism/op-e2e/system/e2esys" + "github.com/ethereum/go-ethereum/accounts/abi/bind" + "github.com/stretchr/testify/require" +) + +func TestL2OutputSubmitter(t *testing.T) { + op_e2e.InitParallel(t, op_e2e.SkipOnFaultProofs) + + cfg := e2esys.DefaultSystemConfig(t) + cfg.NonFinalizedProposals = true // speed up the time till we see output proposals + + sys, err := cfg.Start(t) + require.Nil(t, err, "Error starting up system") + + l1Client := sys.NodeClient("l1") + + rollupClient := sys.RollupClient("sequencer") + + // OutputOracle is already deployed + l2OutputOracle, err := bindings.NewL2OutputOracleCaller(cfg.L1Deployments.L2OutputOracleProxy, l1Client) + require.Nil(t, err) + + initialOutputBlockNumber, err := l2OutputOracle.LatestBlockNumber(&bind.CallOpts{}) + require.Nil(t, err) + + // Wait until the second output submission from L2. The output submitter submits outputs from the + // unsafe portion of the chain which gets reorged on startup. The sequencer has an out of date view + // when it creates it's first block and uses and old L1 Origin. It then does not submit a batch + // for that block and subsequently reorgs to match what the verifier derives when running the + // reconcillation process. + l2Verif := sys.NodeClient("verifier") + _, err = geth.WaitForBlock(big.NewInt(6), l2Verif, 10*time.Duration(cfg.DeployConfig.L2BlockTime)*time.Second) + require.Nil(t, err) + + // Wait for batch submitter to update L2 output oracle. + timeoutCh := time.After(15 * time.Second) + ticker := time.NewTicker(1 * time.Second) + defer ticker.Stop() + for { + l2ooBlockNumber, err := l2OutputOracle.LatestBlockNumber(&bind.CallOpts{}) + require.Nil(t, err) + + // Wait for the L2 output oracle to have been changed from the initial + // timestamp set in the contract constructor. + if l2ooBlockNumber.Cmp(initialOutputBlockNumber) > 0 { + // Retrieve the l2 output committed at this updated timestamp. + committedL2Output, err := l2OutputOracle.GetL2OutputAfter(&bind.CallOpts{}, l2ooBlockNumber) + require.NotEqual(t, [32]byte{}, committedL2Output.OutputRoot, "Empty L2 Output") + require.Nil(t, err) + + // Fetch the corresponding L2 block and assert the committed L2 + // output matches the block's state root. + // + // NOTE: This assertion will change once the L2 output format is + // finalized. + ctx, cancel := context.WithTimeout(context.Background(), 30*time.Second) + defer cancel() + l2Output, err := rollupClient.OutputAtBlock(ctx, l2ooBlockNumber.Uint64()) + require.Nil(t, err) + require.Equal(t, l2Output.OutputRoot[:], committedL2Output.OutputRoot[:]) + break + } + + select { + case <-timeoutCh: + t.Fatalf("State root oracle not updated") + case <-ticker.C: + } + } +} diff --git a/op-e2e/system_fpp_test.go b/op-e2e/system/proofs/system_fpp_test.go similarity index 80% rename from op-e2e/system_fpp_test.go rename to op-e2e/system/proofs/system_fpp_test.go index 4da5f75ca51c..8729f2c7055c 100644 --- a/op-e2e/system_fpp_test.go +++ b/op-e2e/system/proofs/system_fpp_test.go @@ -1,4 +1,4 @@ -package op_e2e +package proofs import ( "context" @@ -6,20 +6,26 @@ import ( "testing" "time" - "github.com/ethereum-optimism/optimism/op-chain-ops/genesis" - "github.com/ethereum-optimism/optimism/op-e2e/e2eutils/geth" - "github.com/ethereum-optimism/optimism/op-program/client/driver" - opp "github.com/ethereum-optimism/optimism/op-program/host" - oppconf "github.com/ethereum-optimism/optimism/op-program/host/config" - "github.com/ethereum-optimism/optimism/op-service/client" - "github.com/ethereum-optimism/optimism/op-service/sources" - "github.com/ethereum-optimism/optimism/op-service/testlog" + op_e2e "github.com/ethereum-optimism/optimism/op-e2e" + + "github.com/ethereum-optimism/optimism/op-e2e/system/e2esys" + "github.com/ethereum-optimism/optimism/op-e2e/system/helpers" + + "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/log" "github.com/ethereum/go-ethereum/rpc" - "github.com/stretchr/testify/require" + + "github.com/ethereum-optimism/optimism/op-chain-ops/genesis" + "github.com/ethereum-optimism/optimism/op-e2e/e2eutils/geth" + "github.com/ethereum-optimism/optimism/op-e2e/e2eutils/wait" + "github.com/ethereum-optimism/optimism/op-program/client/claim" + opp "github.com/ethereum-optimism/optimism/op-program/host" + oppconf "github.com/ethereum-optimism/optimism/op-program/host/config" + "github.com/ethereum-optimism/optimism/op-service/testlog" ) func TestVerifyL2OutputRoot(t *testing.T) { @@ -85,10 +91,10 @@ func applySpanBatchActivation(active bool, dp *genesis.DeployConfig) { // - update the state root via a tx // - run program func testVerifyL2OutputRootEmptyBlock(t *testing.T, detached bool, spanBatchActivated bool) { - InitParallel(t) + op_e2e.InitParallel(t) ctx := context.Background() - cfg := DefaultSystemConfig(t) + cfg := e2esys.DefaultSystemConfig(t) // We don't need a verifier - just the sequencer is enough delete(cfg.Nodes, "verifier") // Use a small sequencer window size to avoid test timeout while waiting for empty blocks @@ -98,32 +104,29 @@ func testVerifyL2OutputRootEmptyBlock(t *testing.T, detached bool, spanBatchActi sys, err := cfg.Start(t) 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) - l1Client := sys.Clients["l1"] - l2Seq := sys.Clients["sequencer"] - rollupRPCClient, err := rpc.DialContext(context.Background(), sys.RollupNodes["sequencer"].HTTPEndpoint()) - require.Nil(t, err) - rollupClient := sources.NewRollupClient(client.NewBaseRPCClient(rollupRPCClient)) + l1Client := sys.NodeClient("l1") + l2Seq := sys.NodeClient("sequencer") + rollupClient := sys.RollupClient("sequencer") // Avoids flaky test by avoiding reorgs at epoch 0 t.Log("Wait for safe head to advance once for setup") // Safe head doesn't exist at genesis. Wait for the first one before proceeding - require.NoError(t, waitForSafeHead(ctx, 1, rollupClient)) + require.NoError(t, wait.ForSafeBlock(ctx, rollupClient, 1)) ss, err := l2Seq.BlockByNumber(ctx, big.NewInt(int64(rpc.SafeBlockNumber))) require.NoError(t, err) - require.NoError(t, waitForSafeHead(ctx, ss.NumberU64()+cfg.DeployConfig.SequencerWindowSize+1, rollupClient)) + require.NoError(t, wait.ForSafeBlock(ctx, rollupClient, ss.NumberU64()+cfg.DeployConfig.SequencerWindowSize+1)) t.Log("Sending transactions to setup existing state, prior to challenged period") aliceKey := cfg.Secrets.Alice - receipt := SendL2Tx(t, cfg, l2Seq, aliceKey, func(opts *TxOpts) { + receipt := helpers.SendL2Tx(t, cfg, l2Seq, aliceKey, func(opts *helpers.TxOpts) { opts.ToAddr = &cfg.Secrets.Addresses().Bob opts.Value = big.NewInt(1_000) }) - require.NoError(t, waitForSafeHead(ctx, receipt.BlockNumber.Uint64(), rollupClient)) + require.NoError(t, wait.ForSafeBlock(ctx, rollupClient, receipt.BlockNumber.Uint64())) t.Logf("Capture current L2 head as agreed starting point. l2Head=%x l2BlockNumber=%v", receipt.BlockHash, receipt.BlockNumber) agreedL2Output, err := rollupClient.OutputAtBlock(ctx, receipt.BlockNumber.Uint64()) @@ -132,7 +135,8 @@ func testVerifyL2OutputRootEmptyBlock(t *testing.T, detached bool, spanBatchActi l2OutputRoot := agreedL2Output.OutputRoot t.Log("=====Stopping batch submitter=====") - err = sys.BatchSubmitter.Driver().StopBatchSubmitting(ctx) + driver := sys.BatchSubmitter.TestDriver() + err = driver.StopBatchSubmitting(ctx) require.NoError(t, err, "could not stop batch submitter") // Wait for the sequencer to catch up with the current L1 head so we know all submitted batches are processed @@ -148,7 +152,7 @@ func testVerifyL2OutputRootEmptyBlock(t *testing.T, detached bool, spanBatchActi // Wait for safe head to start advancing again when the sequencing window elapses, for at least three blocks t.Log("Wait for safe head to advance after sequencing window elapses") - require.NoError(t, waitForSafeHead(ctx, safeBlock.NumberU64()+3, rollupClient)) + require.NoError(t, wait.ForSafeBlock(ctx, rollupClient, safeBlock.NumberU64()+3)) // Use the 2nd empty block as our L2 claim block t.Log("Determine L2 claim") @@ -160,16 +164,16 @@ func testVerifyL2OutputRootEmptyBlock(t *testing.T, detached bool, spanBatchActi l2Claim := l2Output.OutputRoot t.Log("=====Restarting batch submitter=====") - err = sys.BatchSubmitter.Driver().StartBatchSubmitting() + err = driver.StartBatchSubmitting() require.NoError(t, err, "could not start batch submitter") t.Log("Add a transaction to the next batch after sequence of empty blocks") - receipt = SendL2Tx(t, cfg, l2Seq, aliceKey, func(opts *TxOpts) { + receipt = helpers.SendL2Tx(t, cfg, l2Seq, aliceKey, func(opts *helpers.TxOpts) { opts.ToAddr = &cfg.Secrets.Addresses().Bob opts.Value = big.NewInt(1_000) opts.Nonce = 1 }) - require.NoError(t, waitForSafeHead(ctx, receipt.BlockNumber.Uint64(), rollupClient)) + require.NoError(t, wait.ForSafeBlock(ctx, rollupClient, receipt.BlockNumber.Uint64())) t.Log("Determine L1 head that includes batch after sequence of empty blocks") l1HeadBlock, err := l1Client.BlockByNumber(ctx, nil) @@ -187,40 +191,38 @@ func testVerifyL2OutputRootEmptyBlock(t *testing.T, detached bool, spanBatchActi } func testVerifyL2OutputRoot(t *testing.T, detached bool, spanBatchActivated bool) { - InitParallel(t) + op_e2e.InitParallel(t) ctx := context.Background() - cfg := DefaultSystemConfig(t) + cfg := e2esys.DefaultSystemConfig(t) // We don't need a verifier - just the sequencer is enough delete(cfg.Nodes, "verifier") applySpanBatchActivation(spanBatchActivated, cfg.DeployConfig) sys, err := cfg.Start(t) 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) - l1Client := sys.Clients["l1"] - l2Seq := sys.Clients["sequencer"] - rollupRPCClient, err := rpc.DialContext(context.Background(), sys.RollupNodes["sequencer"].HTTPEndpoint()) - require.Nil(t, err) - rollupClient := sources.NewRollupClient(client.NewBaseRPCClient(rollupRPCClient)) + l1Client := sys.NodeClient("l1") + l2Seq := sys.NodeClient("sequencer") + + rollupClient := sys.RollupClient("sequencer") t.Log("Sending transactions to setup existing state, prior to challenged period") aliceKey := cfg.Secrets.Alice opts, err := bind.NewKeyedTransactorWithChainID(aliceKey, cfg.L1ChainIDBig()) require.Nil(t, err) - SendDepositTx(t, cfg, l1Client, l2Seq, opts, func(l2Opts *DepositTxOpts) { + helpers.SendDepositTx(t, cfg, l1Client, l2Seq, opts, func(l2Opts *helpers.DepositTxOpts) { l2Opts.Value = big.NewInt(100_000_000) }) - SendL2Tx(t, cfg, l2Seq, aliceKey, func(opts *TxOpts) { + helpers.SendL2Tx(t, cfg, l2Seq, aliceKey, func(opts *helpers.TxOpts) { opts.ToAddr = &cfg.Secrets.Addresses().Bob opts.Value = big.NewInt(1_000) opts.Nonce = 1 }) - SendWithdrawal(t, cfg, l2Seq, aliceKey, func(opts *WithdrawalTxOpts) { + helpers.SendWithdrawal(t, cfg, l2Seq, aliceKey, func(opts *helpers.WithdrawalTxOpts) { opts.Value = big.NewInt(500) opts.Nonce = 2 }) @@ -234,14 +236,14 @@ func testVerifyL2OutputRoot(t *testing.T, detached bool, spanBatchActivated bool l2OutputRoot := agreedL2Output.OutputRoot t.Log("Sending transactions to modify existing state, within challenged period") - SendDepositTx(t, cfg, l1Client, l2Seq, opts, func(l2Opts *DepositTxOpts) { + helpers.SendDepositTx(t, cfg, l1Client, l2Seq, opts, func(l2Opts *helpers.DepositTxOpts) { l2Opts.Value = big.NewInt(5_000) }) - SendL2Tx(t, cfg, l2Seq, cfg.Secrets.Bob, func(opts *TxOpts) { + helpers.SendL2Tx(t, cfg, l2Seq, cfg.Secrets.Bob, func(opts *helpers.TxOpts) { opts.ToAddr = &cfg.Secrets.Addresses().Alice opts.Value = big.NewInt(100) }) - SendWithdrawal(t, cfg, l2Seq, aliceKey, func(opts *WithdrawalTxOpts) { + helpers.SendWithdrawal(t, cfg, l2Seq, aliceKey, func(opts *helpers.WithdrawalTxOpts) { opts.Value = big.NewInt(100) opts.Nonce = 4 }) @@ -254,7 +256,7 @@ func testVerifyL2OutputRoot(t *testing.T, detached bool, spanBatchActivated bool l2Claim := l2Output.OutputRoot t.Log("Determine L1 head that includes all batches required for L2 claim block") - require.NoError(t, waitForSafeHead(ctx, l2ClaimBlockNumber, rollupClient)) + require.NoError(t, wait.ForSafeBlock(ctx, rollupClient, l2ClaimBlockNumber)) l1HeadBlock, err := l1Client.BlockByNumber(ctx, nil) require.NoError(t, err, "get l1 head block") l1Head := l1HeadBlock.Hash() @@ -279,11 +281,12 @@ type FaultProofProgramTestScenario struct { } // testFaultProofProgramScenario runs the fault proof program in several contexts, given a test scenario. -func testFaultProofProgramScenario(t *testing.T, ctx context.Context, sys *System, s *FaultProofProgramTestScenario) { +func testFaultProofProgramScenario(t *testing.T, ctx context.Context, sys *e2esys.System, s *FaultProofProgramTestScenario) { preimageDir := t.TempDir() fppConfig := oppconf.NewConfig(sys.RollupConfig, sys.L2GenesisCfg.Config, s.L1Head, s.L2Head, s.L2OutputRoot, common.Hash(s.L2Claim), s.L2ClaimBlockNumber) - fppConfig.L1URL = sys.NodeEndpoint("l1") - fppConfig.L2URL = sys.NodeEndpoint("sequencer") + fppConfig.L1URL = sys.NodeEndpoint("l1").RPC() + fppConfig.L2URL = sys.NodeEndpoint("sequencer").RPC() + fppConfig.L1BeaconURL = sys.L1BeaconEndpoint().RestHTTP() fppConfig.DataDir = preimageDir if s.Detached { // When running in detached mode we need to compile the client executable since it will be called directly. @@ -320,20 +323,6 @@ func testFaultProofProgramScenario(t *testing.T, ctx context.Context, sys *Syste if s.Detached { require.Error(t, err, "exit status 1") } else { - require.ErrorIs(t, err, driver.ErrClaimNotValid) - } -} - -func waitForSafeHead(ctx context.Context, safeBlockNum uint64, rollupClient *sources.RollupClient) error { - ctx, cancel := context.WithTimeout(ctx, 60*time.Second) - defer cancel() - for { - seqStatus, err := rollupClient.SyncStatus(ctx) - if err != nil { - return err - } - if seqStatus.SafeL2.Number >= safeBlockNum { - return nil - } + require.ErrorIs(t, err, claim.ErrClaimNotValid) } } diff --git a/op-e2e/system/runcfg/p2p_signer_test.go b/op-e2e/system/runcfg/p2p_signer_test.go new file mode 100644 index 000000000000..91ebfb941319 --- /dev/null +++ b/op-e2e/system/runcfg/p2p_signer_test.go @@ -0,0 +1,62 @@ +package runcfg + +import ( + "context" + "fmt" + "testing" + "time" + + op_e2e "github.com/ethereum-optimism/optimism/op-e2e" + + "github.com/ethereum-optimism/optimism/op-e2e/bindings" + "github.com/ethereum-optimism/optimism/op-e2e/e2eutils/wait" + "github.com/ethereum-optimism/optimism/op-e2e/system/e2esys" + "github.com/ethereum-optimism/optimism/op-service/retry" + "github.com/ethereum/go-ethereum/accounts/abi/bind" + "github.com/ethereum/go-ethereum/common" + "github.com/stretchr/testify/require" +) + +func TestRuntimeConfigReload(t *testing.T) { + op_e2e.InitParallel(t) + + cfg := e2esys.DefaultSystemConfig(t) + // to speed up the test, make it reload the config more often, and do not impose a long conf depth + cfg.Nodes["verifier"].RuntimeConfigReloadInterval = time.Second * 5 + cfg.Nodes["verifier"].Driver.VerifierConfDepth = 1 + + sys, err := cfg.Start(t) + require.Nil(t, err, "Error starting up system") + + initialRuntimeConfig := sys.RollupNodes["verifier"].RuntimeConfig() + + // close the EL node, since we want to block derivation, to solely rely on the reloading mechanism for updates. + sys.EthInstances["verifier"].Close() + + l1 := sys.NodeClient("l1") + + // Change the system-config via L1 + sysCfgContract, err := bindings.NewSystemConfig(cfg.L1Deployments.SystemConfigProxy, l1) + require.NoError(t, err) + newUnsafeBlocksSigner := common.Address{0x12, 0x23, 0x45} + require.NotEqual(t, initialRuntimeConfig.P2PSequencerAddress(), newUnsafeBlocksSigner, "changing to a different address") + opts, err := bind.NewKeyedTransactorWithChainID(cfg.Secrets.SysCfgOwner, cfg.L1ChainIDBig()) + require.Nil(t, err) + // the unsafe signer address is part of the runtime config + tx, err := sysCfgContract.SetUnsafeBlockSigner(opts, newUnsafeBlocksSigner) + require.NoError(t, err) + + // wait for the change to confirm + _, err = wait.ForReceiptOK(context.Background(), l1, tx.Hash()) + require.NoError(t, err) + + // wait for the address to change + _, err = retry.Do(context.Background(), 10, retry.Fixed(time.Second*10), func() (struct{}, error) { + v := sys.RollupNodes["verifier"].RuntimeConfig().P2PSequencerAddress() + if v == newUnsafeBlocksSigner { + return struct{}{}, nil + } + return struct{}{}, fmt.Errorf("no change yet, seeing %s but looking for %s", v, newUnsafeBlocksSigner) + }) + require.NoError(t, err) +} diff --git a/op-e2e/system/runcfg/protocol_versions_test.go b/op-e2e/system/runcfg/protocol_versions_test.go new file mode 100644 index 000000000000..14e056b04435 --- /dev/null +++ b/op-e2e/system/runcfg/protocol_versions_test.go @@ -0,0 +1,141 @@ +package runcfg + +import ( + "context" + "errors" + "fmt" + "math/big" + "testing" + "time" + + op_e2e "github.com/ethereum-optimism/optimism/op-e2e" + + "github.com/ethereum-optimism/optimism/op-e2e/bindings" + "github.com/ethereum-optimism/optimism/op-e2e/e2eutils/geth" + "github.com/ethereum-optimism/optimism/op-e2e/e2eutils/wait" + "github.com/ethereum-optimism/optimism/op-e2e/system/e2esys" + "github.com/ethereum-optimism/optimism/op-service/client" + "github.com/ethereum-optimism/optimism/op-service/endpoint" + "github.com/ethereum-optimism/optimism/op-service/retry" + "github.com/ethereum/go-ethereum/accounts/abi/bind" + "github.com/ethereum/go-ethereum/common" + "github.com/ethereum/go-ethereum/eth/ethconfig" + "github.com/ethereum/go-ethereum/node" + "github.com/ethereum/go-ethereum/params" + "github.com/stretchr/testify/require" +) + +func TestRecommendedProtocolVersionChange(t *testing.T) { + op_e2e.InitParallel(t) + + cfg := e2esys.DefaultSystemConfig(t) + require.NotEqual(t, common.Address{}, cfg.L1Deployments.ProtocolVersions, "need ProtocolVersions contract deployment") + // to speed up the test, make it reload the config more often, and do not impose a long conf depth + cfg.Nodes["verifier"].RuntimeConfigReloadInterval = time.Second * 5 + cfg.Nodes["verifier"].Driver.VerifierConfDepth = 1 + + sys, err := cfg.Start(t) + require.Nil(t, err, "Error starting up system") + + runtimeConfig := sys.RollupNodes["verifier"].RuntimeConfig() + + // Change the superchain-config via L1 + l1 := sys.NodeClient("l1") + + _, build, major, minor, patch, preRelease := params.OPStackSupport.Parse() + newRecommendedProtocolVersion := params.ProtocolVersionV0{Build: build, Major: major + 1, Minor: minor, Patch: patch, PreRelease: preRelease}.Encode() + require.NotEqual(t, runtimeConfig.RecommendedProtocolVersion(), newRecommendedProtocolVersion, "changing to a different protocol version") + + protVersions, err := bindings.NewProtocolVersions(cfg.L1Deployments.ProtocolVersionsProxy, l1) + require.NoError(t, err) + + // ProtocolVersions contract is owned by same key as SystemConfig in devnet + opts, err := bind.NewKeyedTransactorWithChainID(cfg.Secrets.SysCfgOwner, cfg.L1ChainIDBig()) + require.NoError(t, err) + + // Change recommended protocol version + tx, err := protVersions.SetRecommended(opts, new(big.Int).SetBytes(newRecommendedProtocolVersion[:])) + require.NoError(t, err) + + // wait for the change to confirm + _, err = wait.ForReceiptOK(context.Background(), l1, tx.Hash()) + require.NoError(t, err) + + // wait for the recommended protocol version to change + _, err = retry.Do(context.Background(), 10, retry.Fixed(time.Second*10), func() (struct{}, error) { + v := sys.RollupNodes["verifier"].RuntimeConfig().RecommendedProtocolVersion() + if v == newRecommendedProtocolVersion { + return struct{}{}, nil + } + return struct{}{}, fmt.Errorf("no change yet, seeing %s but looking for %s", v, newRecommendedProtocolVersion) + }) + require.NoError(t, err) +} + +func TestRequiredProtocolVersionChangeAndHalt(t *testing.T) { + op_e2e.InitParallel(t) + + cfg := e2esys.DefaultSystemConfig(t) + // to speed up the test, make it reload the config more often, and do not impose a long conf depth + cfg.Nodes["verifier"].RuntimeConfigReloadInterval = time.Second * 5 + cfg.Nodes["verifier"].Driver.VerifierConfDepth = 1 + // configure halt in verifier op-node + cfg.Nodes["verifier"].RollupHalt = "major" + // configure halt in verifier op-geth node + cfg.GethOptions["verifier"] = append(cfg.GethOptions["verifier"], []geth.GethOption{ + func(ethCfg *ethconfig.Config, nodeCfg *node.Config) error { + ethCfg.RollupHaltOnIncompatibleProtocolVersion = "major" + return nil + }, + }...) + + sys, err := cfg.Start(t) + require.Nil(t, err, "Error starting up system") + + runtimeConfig := sys.RollupNodes["verifier"].RuntimeConfig() + + // Change the superchain-config via L1 + l1 := sys.NodeClient("l1") + + _, build, major, minor, patch, preRelease := params.OPStackSupport.Parse() + newRequiredProtocolVersion := params.ProtocolVersionV0{Build: build, Major: major + 1, Minor: minor, Patch: patch, PreRelease: preRelease}.Encode() + require.NotEqual(t, runtimeConfig.RequiredProtocolVersion(), newRequiredProtocolVersion, "changing to a different protocol version") + + protVersions, err := bindings.NewProtocolVersions(cfg.L1Deployments.ProtocolVersionsProxy, l1) + require.NoError(t, err) + + // ProtocolVersions contract is owned by same key as SystemConfig in devnet + opts, err := bind.NewKeyedTransactorWithChainID(cfg.Secrets.SysCfgOwner, cfg.L1ChainIDBig()) + require.NoError(t, err) + + // Change required protocol version + tx, err := protVersions.SetRequired(opts, new(big.Int).SetBytes(newRequiredProtocolVersion[:])) + require.NoError(t, err) + + // wait for the change to confirm + _, err = wait.ForReceiptOK(context.Background(), l1, tx.Hash()) + require.NoError(t, err) + + // wait for the required protocol version to take effect by halting the verifier that opted in, and halting the op-geth node that opted in. + _, err = retry.Do(context.Background(), 10, retry.Fixed(time.Second*10), func() (struct{}, error) { + if !sys.RollupNodes["verifier"].Stopped() { + return struct{}{}, errors.New("verifier rollup node is not closed yet") + } + return struct{}{}, nil + }) + require.NoError(t, err) + t.Log("verified that op-node closed!") + // Checking if the engine is down is not trivial in op-e2e. + // In op-geth we have halting tests covering the Engine API, in op-e2e we instead check if the API stops. + _, err = retry.Do(context.Background(), 10, retry.Fixed(time.Second*10), func() (struct{}, error) { + ctx, cancel := context.WithTimeout(context.Background(), 10*time.Second) + defer cancel() + available := client.IsURLAvailable(ctx, sys.NodeEndpoint("verifier").(endpoint.HttpRPC).HttpRPC()) + if !available && ctx.Err() == nil { // waiting for client to stop responding to RPC requests (slow dials with timeout don't count) + return struct{}{}, nil + } + return struct{}{}, errors.New("verifier EL node is not closed yet") + }) + require.NoError(t, err) + t.Log("verified that op-geth closed!") +} diff --git a/op-e2e/system/runcfg/runcfg_test.go b/op-e2e/system/runcfg/runcfg_test.go new file mode 100644 index 000000000000..62cb75553816 --- /dev/null +++ b/op-e2e/system/runcfg/runcfg_test.go @@ -0,0 +1,11 @@ +package runcfg + +import ( + "testing" + + op_e2e "github.com/ethereum-optimism/optimism/op-e2e" +) + +func TestMain(m *testing.M) { + op_e2e.RunMain(m) +} diff --git a/op-e2e/system/verifier/basic_test.go b/op-e2e/system/verifier/basic_test.go new file mode 100644 index 000000000000..effe1f412146 --- /dev/null +++ b/op-e2e/system/verifier/basic_test.go @@ -0,0 +1,113 @@ +package verifier + +import ( + "context" + "math/big" + "testing" + "time" + + op_e2e "github.com/ethereum-optimism/optimism/op-e2e" + + "github.com/ethereum-optimism/optimism/op-e2e/e2eutils/wait" + "github.com/ethereum-optimism/optimism/op-e2e/system/e2esys" + "github.com/ethereum-optimism/optimism/op-e2e/system/helpers" + "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/common/hexutil" + "github.com/ethereum/go-ethereum/log" + "github.com/stretchr/testify/require" +) + +func TestSystemE2EDencunAtGenesis(t *testing.T) { + op_e2e.InitParallel(t) + + cfg := e2esys.DefaultSystemConfig(t) + cfg.DeployConfig.L1CancunTimeOffset = new(hexutil.Uint64) + + sys, err := cfg.Start(t) + require.Nil(t, err, "Error starting up system") + + runE2ESystemTest(t, sys) + head, err := sys.NodeClient("l1").BlockByNumber(context.Background(), big.NewInt(0)) + require.NoError(t, err) + require.NotNil(t, head.ExcessBlobGas(), "L1 is building dencun blocks since genesis") +} + +// TestSystemE2E sets up a L1 Geth node, a rollup node, and a L2 geth node and then confirms that L1 deposits are reflected on L2. +// All nodes are run in process (but are the full nodes, not mocked or stubbed). +func TestSystemE2E(t *testing.T) { + op_e2e.InitParallel(t) + + cfg := e2esys.DefaultSystemConfig(t) + + sys, err := cfg.Start(t) + require.Nil(t, err, "Error starting up system") + runE2ESystemTest(t, sys) + +} + +func runE2ESystemTest(t *testing.T, sys *e2esys.System) { + 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) + + l1Client := sys.NodeClient("l1") + l2Seq := sys.NodeClient("sequencer") + l2Verif := sys.NodeClient("verifier") + + // Transactor Account + ethPrivKey := sys.Cfg.Secrets.Alice + + // Send Transaction & wait for success + fromAddr := sys.Cfg.Secrets.Addresses().Alice + + ctx, cancel := context.WithTimeout(context.Background(), 15*time.Second) + defer cancel() + startBalance, err := l2Verif.BalanceAt(ctx, fromAddr, nil) + require.Nil(t, err) + + // Send deposit transaction + opts, err := bind.NewKeyedTransactorWithChainID(ethPrivKey, sys.Cfg.L1ChainIDBig()) + require.Nil(t, err) + mintAmount := big.NewInt(1_000_000_000_000) + opts.Value = mintAmount + helpers.SendDepositTx(t, sys.Cfg, l1Client, l2Verif, opts, func(l2Opts *helpers.DepositTxOpts) {}) + + // Confirm balance + ctx, cancel = context.WithTimeout(context.Background(), 15*time.Second) + defer cancel() + + endBalance, err := wait.ForBalanceChange(ctx, l2Verif, fromAddr, startBalance) + require.Nil(t, err) + + diff := new(big.Int) + diff = diff.Sub(endBalance, startBalance) + require.Equal(t, mintAmount, diff, "Did not get expected balance change") + + // Submit TX to L2 sequencer node + receipt := helpers.SendL2Tx(t, sys.Cfg, l2Seq, ethPrivKey, func(opts *helpers.TxOpts) { + opts.Value = big.NewInt(1_000_000_000) + opts.Nonce = 1 // Already have deposit + opts.ToAddr = &common.Address{0xff, 0xff} + opts.VerifyOnClients(l2Verif) + }) + + // Verify blocks match after batch submission on verifiers and sequencers + verifBlock, err := l2Verif.BlockByNumber(context.Background(), receipt.BlockNumber) + require.Nil(t, err) + seqBlock, err := l2Seq.BlockByNumber(context.Background(), receipt.BlockNumber) + require.Nil(t, err) + 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") + + rollupClient := sys.RollupClient("sequencer") + // basic check that sync status works + seqStatus, err := rollupClient.SyncStatus(context.Background()) + require.Nil(t, err) + require.LessOrEqual(t, seqBlock.NumberU64(), seqStatus.UnsafeL2.Number) + // basic check that version endpoint works + seqVersion, err := rollupClient.Version(context.Background()) + require.Nil(t, err) + require.NotEqual(t, "", seqVersion) +} diff --git a/op-e2e/system/verifier/confdepth_test.go b/op-e2e/system/verifier/confdepth_test.go new file mode 100644 index 000000000000..698496c68331 --- /dev/null +++ b/op-e2e/system/verifier/confdepth_test.go @@ -0,0 +1,61 @@ +package verifier + +import ( + "context" + "testing" + "time" + + op_e2e "github.com/ethereum-optimism/optimism/op-e2e" + + "github.com/ethereum-optimism/optimism/op-e2e/system/e2esys" + "github.com/ethereum-optimism/optimism/op-node/rollup/derive" + "github.com/ethereum-optimism/optimism/op-service/testlog" + "github.com/ethereum/go-ethereum/log" + "github.com/stretchr/testify/require" +) + +// TestConfirmationDepth runs the rollup with both sequencer and verifier not immediately processing the tip of the chain. +func TestConfirmationDepth(t *testing.T) { + op_e2e.InitParallel(t) + + cfg := e2esys.DefaultSystemConfig(t) + cfg.DeployConfig.SequencerWindowSize = 4 + cfg.DeployConfig.MaxSequencerDrift = 10 * cfg.DeployConfig.L1BlockTime + seqConfDepth := uint64(2) + verConfDepth := uint64(5) + cfg.Nodes["sequencer"].Driver.SequencerConfDepth = seqConfDepth + cfg.Nodes["sequencer"].Driver.VerifierConfDepth = 0 + cfg.Nodes["verifier"].Driver.VerifierConfDepth = verConfDepth + + sys, err := cfg.Start(t) + require.Nil(t, err, "Error starting up system") + + 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) + + l1Client := sys.NodeClient("l1") + l2Seq := sys.NodeClient("sequencer") + l2Verif := sys.NodeClient("verifier") + + // Wait enough time for the sequencer to submit a block with distance from L1 head, submit it, + // and for the slower verifier to read a full sequence window and cover confirmation depth for reading and some margin + <-time.After(time.Duration((cfg.DeployConfig.SequencerWindowSize+verConfDepth+3)*cfg.DeployConfig.L1BlockTime) * time.Second) + + // within a second, get both L1 and L2 verifier and sequencer block heads + ctx, cancel := context.WithTimeout(context.Background(), 30*time.Second) + defer cancel() + l1Head, err := l1Client.BlockByNumber(ctx, nil) + require.NoError(t, err) + l2SeqHead, err := l2Seq.BlockByNumber(ctx, nil) + require.NoError(t, err) + l2VerHead, err := l2Verif.BlockByNumber(ctx, nil) + require.NoError(t, err) + + seqInfo, err := derive.L1BlockInfoFromBytes(sys.RollupConfig, l2SeqHead.Time(), l2SeqHead.Transactions()[0].Data()) + require.NoError(t, err) + require.LessOrEqual(t, seqInfo.Number+seqConfDepth, l1Head.NumberU64(), "the seq L2 head block should have an origin older than the L1 head block by at least the sequencer conf depth") + + verInfo, err := derive.L1BlockInfoFromBytes(sys.RollupConfig, l2VerHead.Time(), l2VerHead.Transactions()[0].Data()) + require.NoError(t, err) + require.LessOrEqual(t, verInfo.Number+verConfDepth, l1Head.NumberU64(), "the ver L2 head block should have an origin older than the L1 head block by at least the verifier conf depth") +} diff --git a/op-e2e/system/verifier/finalize_test.go b/op-e2e/system/verifier/finalize_test.go new file mode 100644 index 000000000000..976d9a9077bf --- /dev/null +++ b/op-e2e/system/verifier/finalize_test.go @@ -0,0 +1,29 @@ +package verifier + +import ( + "math/big" + "testing" + "time" + + op_e2e "github.com/ethereum-optimism/optimism/op-e2e" + + "github.com/ethereum-optimism/optimism/op-e2e/e2eutils/geth" + "github.com/ethereum-optimism/optimism/op-e2e/system/e2esys" + "github.com/stretchr/testify/require" +) + +// TestFinalize tests if L2 finalizes after sufficient time after L1 finalizes +func TestFinalize(t *testing.T) { + op_e2e.InitParallel(t) + + cfg := e2esys.DefaultSystemConfig(t) + + sys, err := cfg.Start(t) + require.Nil(t, err, "Error starting up system") + + l2Seq := sys.NodeClient("sequencer") + + l2Finalized, err := geth.WaitForBlockToBeFinalized(big.NewInt(12), l2Seq, 1*time.Minute) + require.NoError(t, err, "must be able to fetch a finalized L2 block") + require.NotZerof(t, l2Finalized.NumberU64(), "must have finalized L2 block") +} diff --git a/op-e2e/system/verifier/legacy_pending_test.go b/op-e2e/system/verifier/legacy_pending_test.go new file mode 100644 index 000000000000..8a3afee5e091 --- /dev/null +++ b/op-e2e/system/verifier/legacy_pending_test.go @@ -0,0 +1,120 @@ +package verifier + +import ( + "context" + "math/big" + "testing" + "time" + + op_e2e "github.com/ethereum-optimism/optimism/op-e2e" + + "github.com/ethereum-optimism/optimism/op-e2e/e2eutils/geth" + "github.com/ethereum-optimism/optimism/op-e2e/system/e2esys" + "github.com/ethereum-optimism/optimism/op-service/testlog" + "github.com/ethereum/go-ethereum/core/types" + "github.com/ethereum/go-ethereum/eth/ethconfig" + "github.com/ethereum/go-ethereum/ethclient" + "github.com/ethereum/go-ethereum/log" + "github.com/ethereum/go-ethereum/node" + "github.com/ethereum/go-ethereum/rpc" + "github.com/stretchr/testify/require" +) + +// TestPendingGasLimit tests the configuration of the gas limit of the pending block, +// and if it does not conflict with the regular gas limit on the verifier or sequencer. +func TestPendingGasLimit(t *testing.T) { + op_e2e.InitParallel(t) + + cfg := e2esys.DefaultSystemConfig(t) + + // configure the L2 gas limit to be high, and the pending gas limits to be lower for resource saving. + cfg.DeployConfig.L2GenesisBlockGasLimit = 30_000_000 + cfg.GethOptions["sequencer"] = append(cfg.GethOptions["sequencer"], []geth.GethOption{ + func(ethCfg *ethconfig.Config, nodeCfg *node.Config) error { + ethCfg.Miner.GasCeil = 10_000_000 + ethCfg.Miner.RollupComputePendingBlock = true + return nil + }, + }...) + cfg.GethOptions["verifier"] = append(cfg.GethOptions["verifier"], []geth.GethOption{ + func(ethCfg *ethconfig.Config, nodeCfg *node.Config) error { + ethCfg.Miner.GasCeil = 9_000_000 + ethCfg.Miner.RollupComputePendingBlock = true + return nil + }, + }...) + + sys, err := cfg.Start(t) + require.Nil(t, err, "Error starting up system") + + 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) + + l2Verif := sys.NodeClient("verifier") + l2Seq := sys.NodeClient("sequencer") + + checkGasLimit := func(client *ethclient.Client, number *big.Int, expected uint64) *types.Header { + ctx, cancel := context.WithTimeout(context.Background(), 30*time.Second) + header, err := client.HeaderByNumber(ctx, number) + cancel() + require.NoError(t, err) + require.Equal(t, expected, header.GasLimit) + return header + } + + // check if the gaslimits are matching the expected values, + // and that the verifier/sequencer can use their locally configured gas limit for the pending block. + for { + checkGasLimit(l2Seq, big.NewInt(-1), 10_000_000) + checkGasLimit(l2Verif, big.NewInt(-1), 9_000_000) + checkGasLimit(l2Seq, nil, 30_000_000) + latestVerifHeader := checkGasLimit(l2Verif, nil, 30_000_000) + + // Stop once the verifier passes genesis: + // this implies we checked a new block from the sequencer, on both sequencer and verifier nodes. + if latestVerifHeader.Number.Uint64() > 0 { + break + } + time.Sleep(500 * time.Millisecond) + } +} + +// TestPendingBlockIsLatest tests that we serve the latest block as pending block +func TestPendingBlockIsLatest(t *testing.T) { + op_e2e.InitParallel(t) + + cfg := e2esys.DefaultSystemConfig(t) + sys, err := cfg.Start(t) + require.Nil(t, err, "Error starting up system") + + l2Seq := sys.NodeClient("sequencer") + + t.Run("block", func(t *testing.T) { + for i := 0; i < 10; i++ { + pending, err := l2Seq.BlockByNumber(context.Background(), big.NewInt(rpc.PendingBlockNumber.Int64())) + require.NoError(t, err) + latest, err := l2Seq.BlockByNumber(context.Background(), nil) + require.NoError(t, err) + if pending.NumberU64() == latest.NumberU64() { + require.Equal(t, pending.Hash(), latest.Hash(), "pending must exactly match latest block") + return + } + // re-try until we have the same number, as the requests are not an atomic bundle, and the sequencer may create a block. + } + t.Fatal("failed to get pending block with same number as latest block") + }) + t.Run("header", func(t *testing.T) { + for i := 0; i < 10; i++ { + pending, err := l2Seq.HeaderByNumber(context.Background(), big.NewInt(rpc.PendingBlockNumber.Int64())) + require.NoError(t, err) + latest, err := l2Seq.HeaderByNumber(context.Background(), nil) + require.NoError(t, err) + if pending.Number.Uint64() == latest.Number.Uint64() { + require.Equal(t, pending.Hash(), latest.Hash(), "pending must exactly match latest header") + return + } + // re-try until we have the same number, as the requests are not an atomic bundle, and the sequencer may create a block. + } + t.Fatal("failed to get pending header with same number as latest header") + }) +} diff --git a/op-e2e/system/verifier/sequencer_window_test.go b/op-e2e/system/verifier/sequencer_window_test.go new file mode 100644 index 000000000000..aa836402e99b --- /dev/null +++ b/op-e2e/system/verifier/sequencer_window_test.go @@ -0,0 +1,73 @@ +package verifier + +import ( + "context" + "math/big" + "testing" + "time" + + op_e2e "github.com/ethereum-optimism/optimism/op-e2e" + + "github.com/ethereum-optimism/optimism/op-e2e/e2eutils/geth" + "github.com/ethereum-optimism/optimism/op-e2e/e2eutils/wait" + "github.com/ethereum-optimism/optimism/op-e2e/system/e2esys" + "github.com/ethereum-optimism/optimism/op-e2e/system/helpers" + "github.com/ethereum/go-ethereum" + "github.com/ethereum/go-ethereum/common" + "github.com/stretchr/testify/require" +) + +func TestMissingBatchE2E(t *testing.T) { + op_e2e.InitParallel(t) + // Note this test zeroes the balance of the batch-submitter to make the batches unable to go into L1. + // The test logs may look scary, but this is expected: + // 'batcher unable to publish transaction role=batcher err="insufficient funds for gas * price + value"' + + cfg := e2esys.DefaultSystemConfig(t) + // small sequence window size so the test does not take as long + cfg.DeployConfig.SequencerWindowSize = 4 + + // Specifically set batch submitter balance to stop batches from being included + cfg.Premine[cfg.Secrets.Addresses().Batcher] = big.NewInt(0) + + sys, err := cfg.Start(t) + require.Nil(t, err, "Error starting up system") + + l2Seq := sys.NodeClient("sequencer") + l2Verif := sys.NodeClient("verifier") + + seqRollupClient := sys.RollupClient("sequencer") + + // Transactor Account + ethPrivKey := cfg.Secrets.Alice + + // Submit TX to L2 sequencer node + receipt := helpers.SendL2Tx(t, cfg, l2Seq, ethPrivKey, func(opts *helpers.TxOpts) { + opts.ToAddr = &common.Address{0xff, 0xff} + opts.Value = big.NewInt(1_000_000_000) + }) + + // Wait until the block it was first included in shows up in the safe chain on the verifier + _, err = geth.WaitForBlock(receipt.BlockNumber, l2Verif, time.Duration((sys.RollupConfig.SeqWindowSize+4)*cfg.DeployConfig.L1BlockTime)*time.Second) + require.Nil(t, err, "Waiting for block on verifier") + + // Assert that the transaction is not found on the verifier + ctx, cancel := context.WithTimeout(context.Background(), 30*time.Second) + defer cancel() + _, err = l2Verif.TransactionReceipt(ctx, receipt.TxHash) + require.Equal(t, ethereum.NotFound, err, "Found transaction in verifier when it should not have been included") + + // Wait a short time for the L2 reorg to occur on the sequencer as well. + err = wait.ForSafeBlock(ctx, seqRollupClient, receipt.BlockNumber.Uint64()) + require.Nil(t, err, "timeout waiting for L2 reorg on sequencer safe head") + + // Assert that the reconciliation process did an L2 reorg on the sequencer to remove the invalid block + ctx2, cancel := context.WithTimeout(context.Background(), 30*time.Second) + defer cancel() + block, err := l2Seq.BlockByNumber(ctx2, receipt.BlockNumber) + if err != nil { + require.Equal(t, "not found", err.Error(), "A not found error indicates the chain must have re-orged back before it") + } else { + require.NotEqual(t, block.Hash(), receipt.BlockHash, "L2 Sequencer did not reorg out transaction on it's safe chain") + } +} diff --git a/op-e2e/system/verifier/verifier_test.go b/op-e2e/system/verifier/verifier_test.go new file mode 100644 index 000000000000..33527b62da24 --- /dev/null +++ b/op-e2e/system/verifier/verifier_test.go @@ -0,0 +1,11 @@ +package verifier + +import ( + "testing" + + op_e2e "github.com/ethereum-optimism/optimism/op-e2e" +) + +func TestMain(m *testing.M) { + op_e2e.RunMain(m) +} diff --git a/op-e2e/system_test.go b/op-e2e/system_test.go deleted file mode 100644 index 4e2de3043615..000000000000 --- a/op-e2e/system_test.go +++ /dev/null @@ -1,1748 +0,0 @@ -package op_e2e - -import ( - "context" - "errors" - "fmt" - "math/big" - "os" - "runtime" - "slices" - "testing" - "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/consensus/misc/eip4844" - "github.com/ethereum/go-ethereum/core/types" - "github.com/ethereum/go-ethereum/crypto" - "github.com/ethereum/go-ethereum/eth/ethconfig" - "github.com/ethereum/go-ethereum/ethclient" - "github.com/ethereum/go-ethereum/log" - "github.com/ethereum/go-ethereum/node" - "github.com/ethereum/go-ethereum/params" - "github.com/ethereum/go-ethereum/rpc" - - "github.com/libp2p/go-libp2p/core/peer" - "github.com/stretchr/testify/require" - - "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/transactions" - "github.com/ethereum-optimism/optimism/op-e2e/e2eutils/wait" - "github.com/ethereum-optimism/optimism/op-node/metrics" - rollupNode "github.com/ethereum-optimism/optimism/op-node/node" - "github.com/ethereum-optimism/optimism/op-node/p2p" - "github.com/ethereum-optimism/optimism/op-node/rollup/derive" - "github.com/ethereum-optimism/optimism/op-node/rollup/driver" - "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" -) - -// TestSystemBatchType run each system e2e test case in singular batch mode and span batch mode. -// If the test case tests batch submission and advancing safe head, it should be tested in both singular and span batch mode. -func TestSystemBatchType(t *testing.T) { - tests := []struct { - name string - f func(gt *testing.T, deltaTimeOffset *hexutil.Uint64) - }{ - {"StopStartBatcher", StopStartBatcher}, - } - for _, test := range tests { - test := test - t.Run(test.name+"_SingularBatch", func(t *testing.T) { - test.f(t, nil) - }) - } - - deltaTimeOffset := hexutil.Uint64(0) - for _, test := range tests { - test := test - t.Run(test.name+"_SpanBatch", func(t *testing.T) { - test.f(t, &deltaTimeOffset) - }) - } -} - -func TestMain(m *testing.M) { - if config.ExternalL2Shim != "" { - fmt.Println("Running tests with external L2 process adapter at ", config.ExternalL2Shim) - // As these are integration tests which launch many other processes, the - // default parallelism makes the tests flaky. This change aims to - // reduce the flakiness of these tests. - maxProcs := runtime.NumCPU() / 4 - if maxProcs == 0 { - maxProcs = 1 - } - runtime.GOMAXPROCS(maxProcs) - } - - os.Exit(m.Run()) -} - -func TestL2OutputSubmitter(t *testing.T) { - InitParallel(t, SkipOnFPAC) - - cfg := DefaultSystemConfig(t) - cfg.NonFinalizedProposals = true // speed up the time till we see output proposals - - sys, err := cfg.Start(t) - require.Nil(t, err, "Error starting up system") - defer sys.Close() - - l1Client := sys.Clients["l1"] - - rollupRPCClient, err := rpc.DialContext(context.Background(), sys.RollupNodes["sequencer"].HTTPEndpoint()) - require.Nil(t, err) - rollupClient := sources.NewRollupClient(client.NewBaseRPCClient(rollupRPCClient)) - - // OutputOracle is already deployed - l2OutputOracle, err := bindings.NewL2OutputOracleCaller(cfg.L1Deployments.L2OutputOracleProxy, l1Client) - require.Nil(t, err) - - initialOutputBlockNumber, err := l2OutputOracle.LatestBlockNumber(&bind.CallOpts{}) - require.Nil(t, err) - - // Wait until the second output submission from L2. The output submitter submits outputs from the - // unsafe portion of the chain which gets reorged on startup. The sequencer has an out of date view - // when it creates it's first block and uses and old L1 Origin. It then does not submit a batch - // for that block and subsequently reorgs to match what the verifier derives when running the - // reconcillation process. - l2Verif := sys.Clients["verifier"] - _, err = geth.WaitForBlock(big.NewInt(6), l2Verif, 10*time.Duration(cfg.DeployConfig.L2BlockTime)*time.Second) - require.Nil(t, err) - - // Wait for batch submitter to update L2 output oracle. - timeoutCh := time.After(15 * time.Second) - ticker := time.NewTicker(1 * time.Second) - defer ticker.Stop() - for { - l2ooBlockNumber, err := l2OutputOracle.LatestBlockNumber(&bind.CallOpts{}) - require.Nil(t, err) - - // Wait for the L2 output oracle to have been changed from the initial - // timestamp set in the contract constructor. - if l2ooBlockNumber.Cmp(initialOutputBlockNumber) > 0 { - // Retrieve the l2 output committed at this updated timestamp. - committedL2Output, err := l2OutputOracle.GetL2OutputAfter(&bind.CallOpts{}, l2ooBlockNumber) - require.NotEqual(t, [32]byte{}, committedL2Output.OutputRoot, "Empty L2 Output") - require.Nil(t, err) - - // Fetch the corresponding L2 block and assert the committed L2 - // output matches the block's state root. - // - // NOTE: This assertion will change once the L2 output format is - // finalized. - ctx, cancel := context.WithTimeout(context.Background(), 30*time.Second) - defer cancel() - l2Output, err := rollupClient.OutputAtBlock(ctx, l2ooBlockNumber.Uint64()) - require.Nil(t, err) - require.Equal(t, l2Output.OutputRoot[:], committedL2Output.OutputRoot[:]) - break - } - - select { - case <-timeoutCh: - t.Fatalf("State root oracle not updated") - case <-ticker.C: - } - } -} - -func TestL2OutputSubmitterFPAC(t *testing.T) { - InitParallel(t, SkipOnNotFPAC) - - cfg := DefaultSystemConfig(t) - cfg.NonFinalizedProposals = true // speed up the time till we see output proposals - - sys, err := cfg.Start(t) - require.Nil(t, err, "Error starting up system") - defer sys.Close() - - l1Client := sys.Clients["l1"] - - rollupRPCClient, err := rpc.DialContext(context.Background(), sys.RollupNodes["sequencer"].HTTPEndpoint()) - require.Nil(t, err) - rollupClient := sources.NewRollupClient(client.NewBaseRPCClient(rollupRPCClient)) - - disputeGameFactory, err := bindings.NewDisputeGameFactoryCaller(cfg.L1Deployments.DisputeGameFactoryProxy, l1Client) - require.Nil(t, err) - - initialGameCount, err := disputeGameFactory.GameCount(&bind.CallOpts{}) - require.Nil(t, err) - - l2Verif := sys.Clients["verifier"] - _, err = geth.WaitForBlock(big.NewInt(6), l2Verif, 10*time.Duration(cfg.DeployConfig.L2BlockTime)*time.Second) - require.Nil(t, err) - - timeoutCh := time.After(15 * time.Second) - ticker := time.NewTicker(1 * time.Second) - defer ticker.Stop() - for { - latestGameCount, err := disputeGameFactory.GameCount(&bind.CallOpts{}) - require.Nil(t, err) - - if latestGameCount.Cmp(initialGameCount) > 0 { - committedL2Output, err := disputeGameFactory.GameAtIndex(&bind.CallOpts{}, new(big.Int).Sub(latestGameCount, common.Big1)) - require.Nil(t, err) - proxy, err := bindings.NewFaultDisputeGameCaller(committedL2Output.Proxy, l1Client) - require.Nil(t, err) - committedOutputRoot, err := proxy.RootClaim(&bind.CallOpts{}) - require.Nil(t, err) - - ctx, cancel := context.WithTimeout(context.Background(), 30*time.Second) - defer cancel() - extradata, err := proxy.ExtraData(&bind.CallOpts{}) - require.Nil(t, err) - gameBlockNumber := new(big.Int).SetBytes(extradata[0:32]) - l2Output, err := rollupClient.OutputAtBlock(ctx, gameBlockNumber.Uint64()) - require.Nil(t, err) - require.Equal(t, l2Output.OutputRoot[:], committedOutputRoot[:]) - break - } - - select { - case <-timeoutCh: - t.Fatalf("State root oracle not updated") - case <-ticker.C: - } - } -} - -func TestSystemE2EDencunAtGenesis(t *testing.T) { - InitParallel(t) - - cfg := DefaultSystemConfig(t) - genesisActivation := hexutil.Uint64(0) - cfg.DeployConfig.L1CancunTimeOffset = &genesisActivation - - sys, err := cfg.Start(t) - require.Nil(t, err, "Error starting up system") - defer sys.Close() - runE2ESystemTest(t, sys) - head, err := sys.Clients["l1"].BlockByNumber(context.Background(), big.NewInt(0)) - require.NoError(t, err) - require.NotNil(t, head.ExcessBlobGas(), "L1 is building dencun blocks since genesis") -} - -// TestSystemE2EDencunAtGenesis tests if L2 finalizes when blobs are present on L1 -func TestSystemE2EDencunAtGenesisWithBlobs(t *testing.T) { - ctx, cancel := context.WithCancel(context.Background()) - defer cancel() - - InitParallel(t) - - cfg := DefaultSystemConfig(t) - // cancun is on from genesis: - genesisActivation := hexutil.Uint64(0) - cfg.DeployConfig.L1CancunTimeOffset = &genesisActivation // i.e. turn cancun on at genesis time + 0 - - sys, err := cfg.Start(t) - require.Nil(t, err, "Error starting up system") - defer sys.Close() - - // send a blob-containing txn on l1 - ethPrivKey := sys.Cfg.Secrets.Alice - txData := transactions.CreateEmptyBlobTx(true, sys.Cfg.L1ChainIDBig().Uint64()) - tx := types.MustSignNewTx(ethPrivKey, types.LatestSignerForChainID(cfg.L1ChainIDBig()), txData) - // send blob-containing txn - sendCtx, sendCancel := context.WithTimeout(context.Background(), 15*time.Second) - defer sendCancel() - - l1Client := sys.Clients["l1"] - err = l1Client.SendTransaction(sendCtx, tx) - require.NoError(t, err, "Sending L1 empty blob tx") - // Wait for transaction on L1 - blockContainsBlob, err := wait.ForReceiptOK(ctx, l1Client, tx.Hash()) - require.Nil(t, err, "Waiting for blob tx on L1") - // end sending blob-containing txns on l1 - l2Client := sys.Clients["sequencer"] - 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 = geth.WaitForBlockToBeSafe(finalizedBlock.Header().Number, l2Client, finalizationTimeout) - require.Nil(t, err, "Waiting for safety of L2 block") -} - -// TestSystemE2E sets up a L1 Geth node, a rollup node, and a L2 geth node and then confirms that L1 deposits are reflected on L2. -// All nodes are run in process (but are the full nodes, not mocked or stubbed). -func TestSystemE2E(t *testing.T) { - InitParallel(t) - - cfg := DefaultSystemConfig(t) - - sys, err := cfg.Start(t) - require.Nil(t, err, "Error starting up system") - runE2ESystemTest(t, sys) - defer sys.Close() -} - -func runE2ESystemTest(t *testing.T, sys *System) { - 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) - - l1Client := sys.Clients["l1"] - l2Seq := sys.Clients["sequencer"] - l2Verif := sys.Clients["verifier"] - - // Transactor Account - ethPrivKey := sys.Cfg.Secrets.Alice - - // Send Transaction & wait for success - fromAddr := sys.Cfg.Secrets.Addresses().Alice - - ctx, cancel := context.WithTimeout(context.Background(), 15*time.Second) - defer cancel() - startBalance, err := l2Verif.BalanceAt(ctx, fromAddr, nil) - require.Nil(t, err) - - // Send deposit transaction - opts, err := bind.NewKeyedTransactorWithChainID(ethPrivKey, sys.Cfg.L1ChainIDBig()) - require.Nil(t, err) - mintAmount := big.NewInt(1_000_000_000_000) - opts.Value = mintAmount - SendDepositTx(t, sys.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.Nil(t, err) - - diff := new(big.Int) - diff = diff.Sub(endBalance, startBalance) - require.Equal(t, mintAmount, diff, "Did not get expected balance change") - - // Submit TX to L2 sequencer node - receipt := SendL2Tx(t, sys.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.VerifyOnClients(l2Verif) - }) - - // Verify blocks match after batch submission on verifiers and sequencers - verifBlock, err := l2Verif.BlockByNumber(context.Background(), receipt.BlockNumber) - require.Nil(t, err) - seqBlock, err := l2Seq.BlockByNumber(context.Background(), receipt.BlockNumber) - require.Nil(t, err) - 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.Nil(t, err) - rollupClient := sources.NewRollupClient(client.NewBaseRPCClient(rollupRPCClient)) - // basic check that sync status works - seqStatus, err := rollupClient.SyncStatus(context.Background()) - require.Nil(t, err) - require.LessOrEqual(t, seqBlock.NumberU64(), seqStatus.UnsafeL2.Number) - // basic check that version endpoint works - seqVersion, err := rollupClient.Version(context.Background()) - require.Nil(t, err) - require.NotEqual(t, "", seqVersion) -} - -// TestConfirmationDepth runs the rollup with both sequencer and verifier not immediately processing the tip of the chain. -func TestConfirmationDepth(t *testing.T) { - InitParallel(t) - - cfg := DefaultSystemConfig(t) - cfg.DeployConfig.SequencerWindowSize = 4 - cfg.DeployConfig.MaxSequencerDrift = 10 * cfg.DeployConfig.L1BlockTime - seqConfDepth := uint64(2) - verConfDepth := uint64(5) - cfg.Nodes["sequencer"].Driver.SequencerConfDepth = seqConfDepth - cfg.Nodes["sequencer"].Driver.VerifierConfDepth = 0 - cfg.Nodes["verifier"].Driver.VerifierConfDepth = verConfDepth - - sys, err := cfg.Start(t) - 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) - - l1Client := sys.Clients["l1"] - l2Seq := sys.Clients["sequencer"] - l2Verif := sys.Clients["verifier"] - - // Wait enough time for the sequencer to submit a block with distance from L1 head, submit it, - // and for the slower verifier to read a full sequence window and cover confirmation depth for reading and some margin - <-time.After(time.Duration((cfg.DeployConfig.SequencerWindowSize+verConfDepth+3)*cfg.DeployConfig.L1BlockTime) * time.Second) - - // within a second, get both L1 and L2 verifier and sequencer block heads - ctx, cancel := context.WithTimeout(context.Background(), 30*time.Second) - defer cancel() - l1Head, err := l1Client.BlockByNumber(ctx, nil) - require.NoError(t, err) - l2SeqHead, err := l2Seq.BlockByNumber(ctx, nil) - require.NoError(t, err) - l2VerHead, err := l2Verif.BlockByNumber(ctx, nil) - require.NoError(t, err) - - seqInfo, err := derive.L1BlockInfoFromBytes(sys.RollupConfig, l2SeqHead.Time(), l2SeqHead.Transactions()[0].Data()) - require.NoError(t, err) - require.LessOrEqual(t, seqInfo.Number+seqConfDepth, l1Head.NumberU64(), "the seq L2 head block should have an origin older than the L1 head block by at least the sequencer conf depth") - - verInfo, err := derive.L1BlockInfoFromBytes(sys.RollupConfig, l2VerHead.Time(), l2VerHead.Transactions()[0].Data()) - require.NoError(t, err) - require.LessOrEqual(t, verInfo.Number+verConfDepth, l1Head.NumberU64(), "the ver L2 head block should have an origin older than the L1 head block by at least the verifier conf depth") -} - -// TestPendingGasLimit tests the configuration of the gas limit of the pending block, -// and if it does not conflict with the regular gas limit on the verifier or sequencer. -func TestPendingGasLimit(t *testing.T) { - InitParallel(t) - - cfg := DefaultSystemConfig(t) - - // configure the L2 gas limit to be high, and the pending gas limits to be lower for resource saving. - cfg.DeployConfig.L2GenesisBlockGasLimit = 30_000_000 - cfg.GethOptions["sequencer"] = append(cfg.GethOptions["sequencer"], []geth.GethOption{ - func(ethCfg *ethconfig.Config, nodeCfg *node.Config) error { - ethCfg.Miner.GasCeil = 10_000_000 - ethCfg.Miner.RollupComputePendingBlock = true - return nil - }, - }...) - cfg.GethOptions["verifier"] = append(cfg.GethOptions["verifier"], []geth.GethOption{ - func(ethCfg *ethconfig.Config, nodeCfg *node.Config) error { - ethCfg.Miner.GasCeil = 9_000_000 - ethCfg.Miner.RollupComputePendingBlock = true - return nil - }, - }...) - - sys, err := cfg.Start(t) - 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) - - l2Verif := sys.Clients["verifier"] - l2Seq := sys.Clients["sequencer"] - - checkGasLimit := func(client *ethclient.Client, number *big.Int, expected uint64) *types.Header { - ctx, cancel := context.WithTimeout(context.Background(), 30*time.Second) - header, err := client.HeaderByNumber(ctx, number) - cancel() - require.NoError(t, err) - require.Equal(t, expected, header.GasLimit) - return header - } - - // check if the gaslimits are matching the expected values, - // and that the verifier/sequencer can use their locally configured gas limit for the pending block. - for { - checkGasLimit(l2Seq, big.NewInt(-1), 10_000_000) - checkGasLimit(l2Verif, big.NewInt(-1), 9_000_000) - checkGasLimit(l2Seq, nil, 30_000_000) - latestVerifHeader := checkGasLimit(l2Verif, nil, 30_000_000) - - // Stop once the verifier passes genesis: - // this implies we checked a new block from the sequencer, on both sequencer and verifier nodes. - if latestVerifHeader.Number.Uint64() > 0 { - break - } - time.Sleep(500 * time.Millisecond) - } -} - -// TestFinalize tests if L2 finalizes after sufficient time after L1 finalizes -func TestFinalize(t *testing.T) { - InitParallel(t) - - cfg := DefaultSystemConfig(t) - - sys, err := cfg.Start(t) - require.Nil(t, err, "Error starting up system") - defer sys.Close() - - l2Seq := sys.Clients["sequencer"] - - l2Finalized, err := geth.WaitForBlockToBeFinalized(big.NewInt(12), l2Seq, 1*time.Minute) - require.NoError(t, err, "must be able to fetch a finalized L2 block") - require.NotZerof(t, l2Finalized.NumberU64(), "must have finalized L2 block") -} - -func TestMissingBatchE2E(t *testing.T) { - InitParallel(t) - // Note this test zeroes the balance of the batch-submitter to make the batches unable to go into L1. - // The test logs may look scary, but this is expected: - // 'batcher unable to publish transaction role=batcher err="insufficient funds for gas * price + value"' - - cfg := DefaultSystemConfig(t) - // small sequence window size so the test does not take as long - cfg.DeployConfig.SequencerWindowSize = 4 - - // Specifically set batch submitter balance to stop batches from being included - cfg.Premine[cfg.Secrets.Addresses().Batcher] = big.NewInt(0) - - sys, err := cfg.Start(t) - require.Nil(t, err, "Error starting up system") - defer sys.Close() - - l2Seq := sys.Clients["sequencer"] - l2Verif := sys.Clients["verifier"] - seqRollupRPCClient, err := rpc.DialContext(context.Background(), sys.RollupNodes["sequencer"].HTTPEndpoint()) - require.Nil(t, err) - seqRollupClient := sources.NewRollupClient(client.NewBaseRPCClient(seqRollupRPCClient)) - - // Transactor Account - ethPrivKey := cfg.Secrets.Alice - - // Submit TX to L2 sequencer node - receipt := SendL2Tx(t, cfg, l2Seq, ethPrivKey, func(opts *TxOpts) { - opts.ToAddr = &common.Address{0xff, 0xff} - opts.Value = big.NewInt(1_000_000_000) - }) - - // Wait until the block it was first included in shows up in the safe chain on the verifier - _, err = geth.WaitForBlock(receipt.BlockNumber, l2Verif, time.Duration((sys.RollupConfig.SeqWindowSize+4)*cfg.DeployConfig.L1BlockTime)*time.Second) - require.Nil(t, err, "Waiting for block on verifier") - - // Assert that the transaction is not found on the verifier - ctx, cancel := context.WithTimeout(context.Background(), 30*time.Second) - defer cancel() - _, err = l2Verif.TransactionReceipt(ctx, receipt.TxHash) - require.Equal(t, ethereum.NotFound, err, "Found transaction in verifier when it should not have been included") - - // Wait a short time for the L2 reorg to occur on the sequencer as well. - err = waitForSafeHead(ctx, receipt.BlockNumber.Uint64(), seqRollupClient) - require.Nil(t, err, "timeout waiting for L2 reorg on sequencer safe head") - - // Assert that the reconciliation process did an L2 reorg on the sequencer to remove the invalid block - ctx2, cancel := context.WithTimeout(context.Background(), 30*time.Second) - defer cancel() - block, err := l2Seq.BlockByNumber(ctx2, receipt.BlockNumber) - if err != nil { - require.Equal(t, "not found", err.Error(), "A not found error indicates the chain must have re-orged back before it") - } else { - require.NotEqual(t, block.Hash(), receipt.BlockHash, "L2 Sequencer did not reorg out transaction on it's safe chain") - } -} - -func L1InfoFromState(ctx context.Context, contract *bindings.L1Block, l2Number *big.Int, ecotone bool) (*derive.L1BlockInfo, error) { - var err error - out := &derive.L1BlockInfo{} - opts := bind.CallOpts{ - BlockNumber: l2Number, - Context: ctx, - } - - out.Number, err = contract.Number(&opts) - if err != nil { - return nil, fmt.Errorf("failed to get number: %w", err) - } - - out.Time, err = contract.Timestamp(&opts) - if err != nil { - return nil, fmt.Errorf("failed to get timestamp: %w", err) - } - - out.BaseFee, err = contract.Basefee(&opts) - if err != nil { - return nil, fmt.Errorf("failed to get base fee: %w", err) - } - - blockHashBytes, err := contract.Hash(&opts) - if err != nil { - return nil, fmt.Errorf("failed to get block hash: %w", err) - } - out.BlockHash = common.BytesToHash(blockHashBytes[:]) - - out.SequenceNumber, err = contract.SequenceNumber(&opts) - if err != nil { - return nil, fmt.Errorf("failed to get sequence number: %w", err) - } - - if !ecotone { - overhead, err := contract.L1FeeOverhead(&opts) - if err != nil { - return nil, fmt.Errorf("failed to get l1 fee overhead: %w", err) - } - out.L1FeeOverhead = eth.Bytes32(common.BigToHash(overhead)) - - scalar, err := contract.L1FeeScalar(&opts) - if err != nil { - return nil, fmt.Errorf("failed to get l1 fee scalar: %w", err) - } - out.L1FeeScalar = eth.Bytes32(common.BigToHash(scalar)) - } - - batcherHash, err := contract.BatcherHash(&opts) - if err != nil { - return nil, fmt.Errorf("failed to get batch sender: %w", err) - } - out.BatcherAddr = common.BytesToAddress(batcherHash[:]) - - if ecotone { - blobBaseFeeScalar, err := contract.BlobBaseFeeScalar(&opts) - if err != nil { - return nil, fmt.Errorf("failed to get blob basefee scalar: %w", err) - } - out.BlobBaseFeeScalar = blobBaseFeeScalar - - baseFeeScalar, err := contract.BaseFeeScalar(&opts) - if err != nil { - return nil, fmt.Errorf("failed to get basefee scalar: %w", err) - } - out.BaseFeeScalar = baseFeeScalar - - blobBaseFee, err := contract.BlobBaseFee(&opts) - if err != nil { - return nil, fmt.Errorf("failed to get blob basefee: %w", err) - } - out.BlobBaseFee = blobBaseFee - } - - return out, nil -} - -// TestSystemMockP2P sets up a L1 Geth node, a rollup node, and a L2 geth node and then confirms that -// the nodes can sync L2 blocks before they are confirmed on L1. -func TestSystemMockP2P(t *testing.T) { - t.Skip("flaky in CI") // TODO(CLI-3859): Re-enable this test. - InitParallel(t) - - cfg := DefaultSystemConfig(t) - // Disable batcher, so we don't sync from L1 & set a large sequence window so we only have unsafe blocks - cfg.DisableBatcher = true - cfg.DeployConfig.SequencerWindowSize = 100_000 - cfg.DeployConfig.MaxSequencerDrift = 100_000 - // disable at the start, so we don't miss any gossiped blocks. - cfg.Nodes["sequencer"].Driver.SequencerStopped = true - - // connect the nodes - cfg.P2PTopology = map[string][]string{ - "verifier": {"sequencer"}, - } - - var published, received []common.Hash - seqTracer, verifTracer := new(FnTracer), new(FnTracer) - seqTracer.OnPublishL2PayloadFn = func(ctx context.Context, payload *eth.ExecutionPayloadEnvelope) { - published = append(published, payload.ExecutionPayload.BlockHash) - } - verifTracer.OnUnsafeL2PayloadFn = func(ctx context.Context, from peer.ID, payload *eth.ExecutionPayloadEnvelope) { - received = append(received, payload.ExecutionPayload.BlockHash) - } - cfg.Nodes["sequencer"].Tracer = seqTracer - cfg.Nodes["verifier"].Tracer = verifTracer - - sys, err := cfg.Start(t) - require.Nil(t, err, "Error starting up system") - defer sys.Close() - - // Enable the sequencer now that everyone is ready to receive payloads. - rollupRPCClient, err := rpc.DialContext(context.Background(), sys.RollupNodes["sequencer"].HTTPEndpoint()) - require.Nil(t, err) - - verifierPeerID := sys.RollupNodes["verifier"].P2P().Host().ID() - check := func() bool { - sequencerBlocksTopicPeers := sys.RollupNodes["sequencer"].P2P().GossipOut().AllBlockTopicsPeers() - return slices.Contains[[]peer.ID](sequencerBlocksTopicPeers, verifierPeerID) - } - - // poll to see if the verifier node is connected & meshed on gossip. - // Without this verifier, we shouldn't start sending blocks around, or we'll miss them and fail the test. - backOffStrategy := retry.Exponential() - for i := 0; i < 10; i++ { - if check() { - break - } - time.Sleep(backOffStrategy.Duration(i)) - } - require.True(t, check(), "verifier must be meshed with sequencer for gossip test to proceed") - - require.NoError(t, rollupRPCClient.Call(nil, "admin_startSequencer", sys.L2GenesisCfg.ToBlock().Hash())) - - l2Seq := sys.Clients["sequencer"] - l2Verif := sys.Clients["verifier"] - - // Transactor Account - ethPrivKey := cfg.Secrets.Alice - - // Submit TX to L2 sequencer node - receiptSeq := SendL2Tx(t, cfg, l2Seq, ethPrivKey, func(opts *TxOpts) { - opts.ToAddr = &common.Address{0xff, 0xff} - opts.Value = big.NewInt(1_000_000_000) - - // Wait until the block it was first included in shows up in the safe chain on the verifier - opts.VerifyOnClients(l2Verif) - }) - - // Verify that everything that was received was published - require.GreaterOrEqual(t, len(published), len(received)) - require.Subset(t, published, received) - - // Verify that the tx was received via p2p - require.Contains(t, received, receiptSeq.BlockHash) -} - -func TestSystemP2PAltSync(t *testing.T) { - ctx, cancel := context.WithCancel(context.Background()) - defer cancel() - - InitParallel(t) - - cfg := DefaultSystemConfig(t) - - // remove default verifier node - delete(cfg.Nodes, "verifier") - // Add more verifier nodes - cfg.Nodes["alice"] = &rollupNode.Config{ - Driver: driver.Config{ - VerifierConfDepth: 0, - SequencerConfDepth: 0, - SequencerEnabled: false, - }, - L1EpochPollInterval: time.Second * 4, - } - cfg.Nodes["bob"] = &rollupNode.Config{ - Driver: driver.Config{ - VerifierConfDepth: 0, - SequencerConfDepth: 0, - SequencerEnabled: false, - }, - L1EpochPollInterval: time.Second * 4, - } - cfg.Loggers["alice"] = testlog.Logger(t, log.LevelInfo).New("role", "alice") - cfg.Loggers["bob"] = testlog.Logger(t, log.LevelInfo).New("role", "bob") - - // connect the nodes - cfg.P2PTopology = map[string][]string{ - "sequencer": {"alice", "bob"}, - "alice": {"sequencer", "bob"}, - "bob": {"alice", "sequencer"}, - } - // Enable the P2P req-resp based sync - cfg.P2PReqRespSync = true - - // Disable batcher, so there will not be any L1 data to sync from - cfg.DisableBatcher = true - - var published []string - seqTracer := new(FnTracer) - // The sequencer still publishes the blocks to the tracer, even if they do not reach the network due to disabled P2P - seqTracer.OnPublishL2PayloadFn = func(ctx context.Context, payload *eth.ExecutionPayloadEnvelope) { - published = append(published, payload.ExecutionPayload.ID().String()) - } - // Blocks are now received via the RPC based alt-sync method - cfg.Nodes["sequencer"].Tracer = seqTracer - - sys, err := cfg.Start(t) - require.Nil(t, err, "Error starting up system") - defer sys.Close() - - l2Seq := sys.Clients["sequencer"] - - // Transactor Account - ethPrivKey := cfg.Secrets.Alice - - // Submit a TX to L2 sequencer node - receiptSeq := SendL2Tx(t, cfg, l2Seq, ethPrivKey, func(opts *TxOpts) { - opts.ToAddr = &common.Address{0xff, 0xff} - opts.Value = big.NewInt(1_000_000_000) - }) - - // Gossip is able to respond to IWANT messages for the duration of heartbeat_time * message_window = 0.5 * 12 = 6 - // Wait till we pass that, and then we'll have missed some blocks that cannot be retrieved in any way from gossip - time.Sleep(time.Second * 10) - - // set up our syncer node, connect it to alice/bob - cfg.Loggers["syncer"] = testlog.Logger(t, log.LevelInfo).New("role", "syncer") - snapLog := log.NewLogger(log.DiscardHandler()) - - // Create a peer, and hook up alice and bob - h, err := sys.newMockNetPeer() - require.NoError(t, err) - _, err = sys.Mocknet.LinkPeers(sys.RollupNodes["alice"].P2P().Host().ID(), h.ID()) - require.NoError(t, err) - _, err = sys.Mocknet.LinkPeers(sys.RollupNodes["bob"].P2P().Host().ID(), h.ID()) - require.NoError(t, err) - - // Configure the new rollup node that'll be syncing - var syncedPayloads []string - syncNodeCfg := &rollupNode.Config{ - Driver: driver.Config{VerifierConfDepth: 0}, - Rollup: *sys.RollupConfig, - P2PSigner: nil, - RPC: rollupNode.RPCConfig{ - ListenAddr: "127.0.0.1", - ListenPort: 0, - EnableAdmin: true, - }, - P2P: &p2p.Prepared{HostP2P: h, EnableReqRespSync: true}, - Metrics: rollupNode.MetricsConfig{Enabled: false}, // no metrics server - Pprof: oppprof.CLIConfig{}, - L1EpochPollInterval: time.Second * 10, - Tracer: &FnTracer{ - OnUnsafeL2PayloadFn: func(ctx context.Context, from peer.ID, payload *eth.ExecutionPayloadEnvelope) { - syncedPayloads = append(syncedPayloads, payload.ExecutionPayload.ID().String()) - }, - }, - } - configureL1(syncNodeCfg, sys.EthInstances["l1"]) - syncerL2Engine, _, err := geth.InitL2("syncer", big.NewInt(int64(cfg.DeployConfig.L2ChainID)), sys.L2GenesisCfg, cfg.JWTFilePath) - require.NoError(t, err) - require.NoError(t, syncerL2Engine.Start()) - - configureL2(syncNodeCfg, syncerL2Engine, cfg.JWTSecret) - - syncerNode, err := rollupNode.New(ctx, syncNodeCfg, cfg.Loggers["syncer"], snapLog, "", metrics.NewMetrics("")) - require.NoError(t, err) - err = syncerNode.Start(ctx) - require.NoError(t, err) - defer func() { - require.NoError(t, syncerNode.Stop(ctx)) - }() - - // connect alice and bob to our new syncer node - _, err = sys.Mocknet.ConnectPeers(sys.RollupNodes["alice"].P2P().Host().ID(), syncerNode.P2P().Host().ID()) - require.NoError(t, err) - _, err = sys.Mocknet.ConnectPeers(sys.RollupNodes["bob"].P2P().Host().ID(), syncerNode.P2P().Host().ID()) - require.NoError(t, err) - - rpc := syncerL2Engine.Attach() - l2Verif := ethclient.NewClient(rpc) - - // It may take a while to sync, but eventually we should see the sequenced data show up - receiptVerif, err := wait.ForReceiptOK(ctx, l2Verif, receiptSeq.TxHash) - require.Nil(t, err, "Waiting for L2 tx on verifier") - - require.Equal(t, receiptSeq, receiptVerif) - - // Verify that the tx was received via P2P sync - require.Contains(t, syncedPayloads, eth.BlockID{Hash: receiptVerif.BlockHash, Number: receiptVerif.BlockNumber.Uint64()}.String()) - - // Verify that everything that was received was published - require.GreaterOrEqual(t, len(published), len(syncedPayloads)) - require.Subset(t, published, syncedPayloads) -} - -// TestSystemDenseTopology sets up a dense p2p topology with 3 verifier nodes and 1 sequencer node. -func TestSystemDenseTopology(t *testing.T) { - t.Skip("Skipping dense topology test to avoid flakiness. @refcell address in p2p scoring pr.") - - InitParallel(t) - - cfg := DefaultSystemConfig(t) - // slow down L1 blocks so we can see the L2 blocks arrive well before the L1 blocks do. - // Keep the seq window small so the L2 chain is started quick - cfg.DeployConfig.L1BlockTime = 10 - - // Append additional nodes to the system to construct a dense p2p network - cfg.Nodes["verifier2"] = &rollupNode.Config{ - Driver: driver.Config{ - VerifierConfDepth: 0, - SequencerConfDepth: 0, - SequencerEnabled: false, - }, - L1EpochPollInterval: time.Second * 4, - } - cfg.Nodes["verifier3"] = &rollupNode.Config{ - Driver: driver.Config{ - VerifierConfDepth: 0, - SequencerConfDepth: 0, - SequencerEnabled: false, - }, - L1EpochPollInterval: time.Second * 4, - } - cfg.Loggers["verifier2"] = testlog.Logger(t, log.LevelInfo).New("role", "verifier") - cfg.Loggers["verifier3"] = testlog.Logger(t, log.LevelInfo).New("role", "verifier") - - // connect the nodes - cfg.P2PTopology = map[string][]string{ - "verifier": {"sequencer", "verifier2", "verifier3"}, - "verifier2": {"sequencer", "verifier", "verifier3"}, - "verifier3": {"sequencer", "verifier", "verifier2"}, - } - - // Set peer scoring for each node, but without banning - for _, node := range cfg.Nodes { - params, err := p2p.GetScoringParams("light", &node.Rollup) - require.NoError(t, err) - node.P2P = &p2p.Config{ - ScoringParams: params, - BanningEnabled: false, - } - } - - var published, received1, received2, received3 []common.Hash - seqTracer, verifTracer, verifTracer2, verifTracer3 := new(FnTracer), new(FnTracer), new(FnTracer), new(FnTracer) - seqTracer.OnPublishL2PayloadFn = func(ctx context.Context, payload *eth.ExecutionPayloadEnvelope) { - published = append(published, payload.ExecutionPayload.BlockHash) - } - verifTracer.OnUnsafeL2PayloadFn = func(ctx context.Context, from peer.ID, payload *eth.ExecutionPayloadEnvelope) { - received1 = append(received1, payload.ExecutionPayload.BlockHash) - } - verifTracer2.OnUnsafeL2PayloadFn = func(ctx context.Context, from peer.ID, payload *eth.ExecutionPayloadEnvelope) { - received2 = append(received2, payload.ExecutionPayload.BlockHash) - } - verifTracer3.OnUnsafeL2PayloadFn = func(ctx context.Context, from peer.ID, payload *eth.ExecutionPayloadEnvelope) { - received3 = append(received3, payload.ExecutionPayload.BlockHash) - } - cfg.Nodes["sequencer"].Tracer = seqTracer - cfg.Nodes["verifier"].Tracer = verifTracer - cfg.Nodes["verifier2"].Tracer = verifTracer2 - cfg.Nodes["verifier3"].Tracer = verifTracer3 - - sys, err := cfg.Start(t) - require.Nil(t, err, "Error starting up system") - defer sys.Close() - - l2Seq := sys.Clients["sequencer"] - l2Verif := sys.Clients["verifier"] - l2Verif2 := sys.Clients["verifier2"] - l2Verif3 := sys.Clients["verifier3"] - - // Transactor Account - ethPrivKey := cfg.Secrets.Alice - - // Submit TX to L2 sequencer node - receiptSeq := SendL2Tx(t, cfg, l2Seq, ethPrivKey, func(opts *TxOpts) { - opts.ToAddr = &common.Address{0xff, 0xff} - opts.Value = big.NewInt(1_000_000_000) - - // Wait until the block it was first included in shows up in the safe chain on the verifiers - opts.VerifyOnClients(l2Verif, l2Verif2, l2Verif3) - }) - - // Verify that everything that was received was published - require.GreaterOrEqual(t, len(published), len(received1)) - require.GreaterOrEqual(t, len(published), len(received2)) - require.GreaterOrEqual(t, len(published), len(received3)) - require.ElementsMatch(t, published, received1[:len(published)]) - require.ElementsMatch(t, published, received2[:len(published)]) - require.ElementsMatch(t, published, received3[:len(published)]) - - // Verify that the tx was received via p2p - require.Contains(t, received1, receiptSeq.BlockHash) - require.Contains(t, received2, receiptSeq.BlockHash) - require.Contains(t, received3, receiptSeq.BlockHash) -} - -func TestL1InfoContract(t *testing.T) { - InitParallel(t) - - cfg := DefaultSystemConfig(t) - - sys, err := cfg.Start(t) - require.Nil(t, err, "Error starting up system") - defer sys.Close() - - l1Client := sys.Clients["l1"] - l2Seq := sys.Clients["sequencer"] - l2Verif := sys.Clients["verifier"] - - endVerifBlockNumber := big.NewInt(4) - endSeqBlockNumber := big.NewInt(6) - endVerifBlock, err := geth.WaitForBlock(endVerifBlockNumber, l2Verif, time.Minute) - require.Nil(t, err) - endSeqBlock, err := geth.WaitForBlock(endSeqBlockNumber, l2Seq, time.Minute) - require.Nil(t, err) - - seqL1Info, err := bindings.NewL1Block(cfg.L1InfoPredeployAddress, l2Seq) - require.Nil(t, err) - - verifL1Info, err := bindings.NewL1Block(cfg.L1InfoPredeployAddress, l2Verif) - require.Nil(t, err) - - ctx, cancel := context.WithTimeout(context.Background(), 2*time.Minute) - defer cancel() - - fillInfoLists := func(start *types.Block, contract *bindings.L1Block, client *ethclient.Client) ([]*derive.L1BlockInfo, []*derive.L1BlockInfo) { - var txList, stateList []*derive.L1BlockInfo - for b := start; ; { - var infoFromTx *derive.L1BlockInfo - infoFromTx, err := derive.L1BlockInfoFromBytes(sys.RollupConfig, b.Time(), b.Transactions()[0].Data()) - require.NoError(t, err) - txList = append(txList, infoFromTx) - - ecotone := sys.RollupConfig.IsEcotone(b.Time()) && !sys.RollupConfig.IsEcotoneActivationBlock(b.Time()) - infoFromState, err := L1InfoFromState(ctx, contract, b.Number(), ecotone) - require.Nil(t, err) - stateList = append(stateList, infoFromState) - - // Genesis L2 block contains no L1 Deposit TX - if b.NumberU64() == 1 { - return txList, stateList - } - b, err = client.BlockByHash(ctx, b.ParentHash()) - require.Nil(t, err) - } - } - - l1InfosFromSequencerTransactions, l1InfosFromSequencerState := fillInfoLists(endSeqBlock, seqL1Info, l2Seq) - l1InfosFromVerifierTransactions, l1InfosFromVerifierState := fillInfoLists(endVerifBlock, verifL1Info, l2Verif) - - l1blocks := make(map[common.Hash]*derive.L1BlockInfo) - maxL1Hash := l1InfosFromSequencerTransactions[0].BlockHash - for h := maxL1Hash; ; { - b, err := l1Client.BlockByHash(ctx, h) - require.Nil(t, err) - - l1blocks[h] = &derive.L1BlockInfo{ - Number: b.NumberU64(), - Time: b.Time(), - BaseFee: b.BaseFee(), - BlockHash: h, - SequenceNumber: 0, // ignored, will be overwritten - BatcherAddr: sys.RollupConfig.Genesis.SystemConfig.BatcherAddr, - } - if sys.RollupConfig.IsEcotone(b.Time()) && !sys.RollupConfig.IsEcotoneActivationBlock(b.Time()) { - scalars, err := sys.RollupConfig.Genesis.SystemConfig.EcotoneScalars() - require.NoError(t, err) - l1blocks[h].BlobBaseFeeScalar = scalars.BlobBaseFeeScalar - l1blocks[h].BaseFeeScalar = scalars.BaseFeeScalar - if excess := b.ExcessBlobGas(); excess != nil { - l1blocks[h].BlobBaseFee = eip4844.CalcBlobFee(*excess) - } else { - l1blocks[h].BlobBaseFee = big.NewInt(1) - } - } else { - l1blocks[h].L1FeeOverhead = sys.RollupConfig.Genesis.SystemConfig.Overhead - l1blocks[h].L1FeeScalar = sys.RollupConfig.Genesis.SystemConfig.Scalar - } - - h = b.ParentHash() - if b.NumberU64() == 0 { - break - } - } - - checkInfoList := func(name string, list []*derive.L1BlockInfo) { - for _, info := range list { - if expected, ok := l1blocks[info.BlockHash]; ok { - expected.SequenceNumber = info.SequenceNumber // the seq nr is not part of the L1 info we know in advance, so we ignore it. - require.Equal(t, expected, info) - } else { - t.Fatalf("Did not find block hash for L1 Info: %v in test %s", info, name) - } - } - } - - checkInfoList("On sequencer with tx", l1InfosFromSequencerTransactions) - checkInfoList("On sequencer with state", l1InfosFromSequencerState) - checkInfoList("On verifier with tx", l1InfosFromVerifierTransactions) - checkInfoList("On verifier with state", l1InfosFromVerifierState) -} - -// calcGasFees determines the actual cost of the transaction given a specific base fee -// This does not include the L1 data fee charged from L2 transactions. -func calcGasFees(gasUsed uint64, gasTipCap *big.Int, gasFeeCap *big.Int, baseFee *big.Int) *big.Int { - x := new(big.Int).Add(gasTipCap, baseFee) - // If tip + basefee > gas fee cap, clamp it to the gas fee cap - if x.Cmp(gasFeeCap) > 0 { - x = gasFeeCap - } - return x.Mul(x, new(big.Int).SetUint64(gasUsed)) -} - -// TestWithdrawals checks that a deposit and then withdrawal execution succeeds. It verifies the -// balance changes on L1 and L2 and has to include gas fees in the balance checks. -// It does not check that the withdrawal can be executed prior to the end of the finality period. -func TestWithdrawals(t *testing.T) { - InitParallel(t) - - cfg := DefaultSystemConfig(t) - cfg.DeployConfig.FinalizationPeriodSeconds = 2 // 2s finalization period - - sys, err := cfg.Start(t) - require.Nil(t, err, "Error starting up system") - defer sys.Close() - - l1Client := sys.Clients["l1"] - l2Seq := sys.Clients["sequencer"] - l2Verif := sys.Clients["verifier"] - - // Transactor Account - ethPrivKey := cfg.Secrets.Alice - fromAddr := crypto.PubkeyToAddress(ethPrivKey.PublicKey) - - // Create L1 signer - opts, err := bind.NewKeyedTransactorWithChainID(ethPrivKey, cfg.L1ChainIDBig()) - require.Nil(t, err) - - // Start L2 balance - ctx, cancel := context.WithTimeout(context.Background(), 30*time.Second) - defer cancel() - startBalanceBeforeDeposit, err := l2Verif.BalanceAt(ctx, fromAddr, nil) - require.Nil(t, err) - - // Send deposit tx - mintAmount := big.NewInt(1_000_000_000_000) - opts.Value = mintAmount - SendDepositTx(t, cfg, l1Client, l2Verif, opts, func(l2Opts *DepositTxOpts) { - l2Opts.Value = common.Big0 - }) - - // Confirm L2 balance - ctx, cancel = context.WithTimeout(context.Background(), 30*time.Second) - defer cancel() - endBalanceAfterDeposit, err := wait.ForBalanceChange(ctx, l2Verif, fromAddr, startBalanceBeforeDeposit) - require.Nil(t, err) - - diff := new(big.Int) - diff = diff.Sub(endBalanceAfterDeposit, startBalanceBeforeDeposit) - require.Equal(t, mintAmount, diff, "Did not get expected balance change after mint") - - // Start L2 balance for withdrawal - ctx, cancel = context.WithTimeout(context.Background(), 30*time.Second) - defer cancel() - startBalanceBeforeWithdrawal, err := l2Seq.BalanceAt(ctx, fromAddr, nil) - require.Nil(t, err) - - withdrawAmount := big.NewInt(500_000_000_000) - tx, receipt := SendWithdrawal(t, cfg, l2Seq, ethPrivKey, func(opts *WithdrawalTxOpts) { - opts.Value = withdrawAmount - opts.VerifyOnClients(l2Verif) - }) - - // Verify L2 balance after withdrawal - ctx, cancel = context.WithTimeout(context.Background(), 30*time.Second) - defer cancel() - header, err := l2Verif.HeaderByNumber(ctx, receipt.BlockNumber) - require.Nil(t, err) - - ctx, cancel = context.WithTimeout(context.Background(), 30*time.Second) - defer cancel() - endBalanceAfterWithdrawal, err := wait.ForBalanceChange(ctx, l2Seq, fromAddr, startBalanceBeforeWithdrawal) - require.Nil(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 balance on L1 - ctx, cancel = context.WithTimeout(context.Background(), 30*time.Second) - defer cancel() - startBalanceBeforeFinalize, err := l1Client.BalanceAt(ctx, fromAddr, nil) - require.Nil(t, err) - - proveReceipt, finalizeReceipt, resolveClaimReceipt, resolveReceipt := ProveAndFinalizeWithdrawal(t, cfg, sys, "verifier", ethPrivKey, receipt) - - // Verify balance after withdrawal - ctx, cancel = context.WithTimeout(context.Background(), 30*time.Second) - defer cancel() - endBalanceAfterFinalize, err := wait.ForBalanceChange(ctx, l1Client, fromAddr, startBalanceBeforeFinalize) - require.Nil(t, err) - - // Ensure that withdrawal - gas fees are added to the L1 balance - // Fun fact, the fee is greater than the withdrawal amount - // NOTE: The gas fees include *both* the ProveWithdrawalTransaction and FinalizeWithdrawalTransaction transactions. - diff = new(big.Int).Sub(endBalanceAfterFinalize, startBalanceBeforeFinalize) - 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) - } - withdrawAmount = withdrawAmount.Sub(withdrawAmount, fees) - require.Equal(t, withdrawAmount, diff) -} - -type stateGetterAdapter struct { - ctx context.Context - t *testing.T - client *ethclient.Client - blockNum *big.Int -} - -func (sga *stateGetterAdapter) GetState(addr common.Address, key common.Hash) common.Hash { - sga.t.Helper() - val, err := sga.client.StorageAt(sga.ctx, addr, key, sga.blockNum) - require.NoError(sga.t, err) - var res common.Hash - copy(res[:], val) - return res -} - -// TestFees checks that L1/L2 fees are handled. -func TestFees(t *testing.T) { - t.Run("pre-regolith", func(t *testing.T) { - InitParallel(t) - cfg := DefaultSystemConfig(t) - cfg.DeployConfig.L1GenesisBlockBaseFeePerGas = (*hexutil.Big)(big.NewInt(7)) - - cfg.DeployConfig.L2GenesisRegolithTimeOffset = nil - cfg.DeployConfig.L2GenesisCanyonTimeOffset = nil - cfg.DeployConfig.L2GenesisDeltaTimeOffset = nil - cfg.DeployConfig.L2GenesisEcotoneTimeOffset = nil - testFees(t, cfg) - }) - t.Run("regolith", 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 = nil - cfg.DeployConfig.L2GenesisDeltaTimeOffset = nil - cfg.DeployConfig.L2GenesisEcotoneTimeOffset = nil - testFees(t, cfg) - }) - t.Run("ecotone", 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) - 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) { - sys, err := cfg.Start(t) - require.Nil(t, err, "Error starting up system") - defer sys.Close() - - l2Seq := sys.Clients["sequencer"] - 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{ - ctx: context.Background(), - t: t, - client: l2Seq, - } - - l1CostFn := types.NewL1CostFunc(config, sga) - - // Transactor Account - ethPrivKey := cfg.Secrets.Alice - fromAddr := crypto.PubkeyToAddress(ethPrivKey.PublicKey) - - require.NotEqual(t, cfg.DeployConfig.L2OutputOracleProposer, fromAddr) - require.NotEqual(t, cfg.DeployConfig.BatchSenderAddress, fromAddr) - - // Find gaspriceoracle contract - gpoContract, err := bindings.NewGasPriceOracle(predeploys.GasPriceOracleAddr, l2Seq) - require.Nil(t, err) - - if !sys.RollupConfig.IsEcotone(sys.L2GenesisCfg.Timestamp) { - overhead, err := gpoContract.Overhead(&bind.CallOpts{}) - require.Nil(t, err, "reading gpo overhead") - require.Equal(t, overhead.Uint64(), cfg.DeployConfig.GasPriceOracleOverhead, "wrong gpo overhead") - - scalar, err := gpoContract.Scalar(&bind.CallOpts{}) - require.Nil(t, err, "reading 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") - _, err = gpoContract.Scalar(&bind.CallOpts{}) - require.ErrorContains(t, err, "deprecated") - } - - decimals, err := gpoContract.Decimals(&bind.CallOpts{}) - require.Nil(t, err, "reading gpo decimals") - - require.Equal(t, decimals.Uint64(), uint64(6), "wrong gpo decimals") - - // BaseFee Recipient - baseFeeRecipientStartBalance, err := l2Seq.BalanceAt(context.Background(), predeploys.BaseFeeVaultAddr, big.NewInt(rpc.EarliestBlockNumber.Int64())) - require.Nil(t, err) - - // L1Fee Recipient - l1FeeRecipientStartBalance, err := l2Seq.BalanceAt(context.Background(), predeploys.L1FeeVaultAddr, big.NewInt(rpc.EarliestBlockNumber.Int64())) - require.Nil(t, err) - - sequencerFeeVaultStartBalance, err := l2Seq.BalanceAt(context.Background(), predeploys.SequencerFeeVaultAddr, big.NewInt(rpc.EarliestBlockNumber.Int64())) - require.Nil(t, err) - - genesisBlock, err := l2Seq.BlockByNumber(context.Background(), big.NewInt(rpc.EarliestBlockNumber.Int64())) - require.NoError(t, err) - - coinbaseStartBalance, err := l2Seq.BalanceAt(context.Background(), genesisBlock.Coinbase(), big.NewInt(rpc.EarliestBlockNumber.Int64())) - require.NoError(t, err) - - // Simple transfer from signer to random account - startBalance, err := l2Seq.BalanceAt(context.Background(), fromAddr, big.NewInt(rpc.EarliestBlockNumber.Int64())) - require.Nil(t, err) - require.Greater(t, startBalance.Uint64(), big.NewInt(params.Ether).Uint64()) - - transferAmount := big.NewInt(params.Ether) - gasTip := big.NewInt(10) - receipt := SendL2Tx(t, cfg, l2Seq, ethPrivKey, func(opts *TxOpts) { - opts.ToAddr = &common.Address{0xff, 0xff} - opts.Value = transferAmount - opts.GasTipCap = gasTip - opts.Gas = 21000 - opts.GasFeeCap = big.NewInt(200) - opts.VerifyOnClients(l2Verif) - }) - - require.Equal(t, receipt.Status, types.ReceiptStatusSuccessful) - - header, err := l2Seq.HeaderByNumber(context.Background(), receipt.BlockNumber) - require.Nil(t, err) - - coinbaseEndBalance, err := l2Seq.BalanceAt(context.Background(), header.Coinbase, header.Number) - require.Nil(t, err) - - endBalance, err := l2Seq.BalanceAt(context.Background(), fromAddr, header.Number) - require.Nil(t, err) - - baseFeeRecipientEndBalance, err := l2Seq.BalanceAt(context.Background(), predeploys.BaseFeeVaultAddr, header.Number) - require.Nil(t, err) - - l1Header, err := l1.HeaderByNumber(context.Background(), nil) - require.Nil(t, err) - - l1FeeRecipientEndBalance, err := l2Seq.BalanceAt(context.Background(), predeploys.L1FeeVaultAddr, header.Number) - require.Nil(t, err) - - sequencerFeeVaultEndBalance, err := l2Seq.BalanceAt(context.Background(), predeploys.SequencerFeeVaultAddr, header.Number) - require.Nil(t, err) - - // Diff fee recipient + coinbase balances - baseFeeRecipientDiff := new(big.Int).Sub(baseFeeRecipientEndBalance, baseFeeRecipientStartBalance) - l1FeeRecipientDiff := new(big.Int).Sub(l1FeeRecipientEndBalance, l1FeeRecipientStartBalance) - sequencerFeeVaultDiff := new(big.Int).Sub(sequencerFeeVaultEndBalance, sequencerFeeVaultStartBalance) - coinbaseDiff := new(big.Int).Sub(coinbaseEndBalance, coinbaseStartBalance) - - // Tally L2 Fee - l2Fee := gasTip.Mul(gasTip, new(big.Int).SetUint64(receipt.GasUsed)) - require.Equal(t, sequencerFeeVaultDiff, coinbaseDiff, "coinbase is always sequencer fee vault") - require.Equal(t, l2Fee, coinbaseDiff, "l2 fee mismatch") - require.Equal(t, l2Fee, sequencerFeeVaultDiff) - - // Tally BaseFee - baseFee := new(big.Int).Mul(header.BaseFee, new(big.Int).SetUint64(receipt.GasUsed)) - require.Equal(t, baseFee, baseFeeRecipientDiff, "base fee fee mismatch") - - // Tally L1 Fee - tx, _, err := l2Seq.TransactionByHash(context.Background(), receipt.TxHash) - require.NoError(t, err, "Should be able to get transaction") - bytes, err := tx.MarshalBinary() - require.Nil(t, err) - - l1Fee := l1CostFn(tx.RollupCostData(), header.Time) - require.Equalf(t, l1Fee, l1FeeRecipientDiff, "L1 fee mismatch: start balance %v, end balance %v", l1FeeRecipientStartBalance, l1FeeRecipientEndBalance) - - gpoEcotone, err := gpoContract.IsEcotone(nil) - 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.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 - // in our case we already include that, so we subtract it, to do a 1:1 comparison - adjustedGPOFee = new(big.Int).Sub(gpoL1Fee, new(big.Int).Mul(artificialGPOOverhead, l1BaseFee)) - } - require.Equal(t, l1Fee, adjustedGPOFee, "GPO reports L1 fee mismatch") - - require.Equal(t, receipt.L1Fee, l1Fee, "l1 fee in receipt is correct") - if !sys.RollupConfig.IsEcotone(header.Time) { // FeeScalar receipt attribute is removed as of Ecotone - require.Equal(t, - new(big.Float).Mul( - new(big.Float).SetInt(l1Header.BaseFee), - new(big.Float).Mul(new(big.Float).SetInt(receipt.L1GasUsed), receipt.FeeScalar), - ), - new(big.Float).SetInt(receipt.L1Fee), "fee field in receipt matches gas used times scalar times base fee") - } - - // Calculate total fee - baseFeeRecipientDiff.Add(baseFeeRecipientDiff, coinbaseDiff) - totalFee := new(big.Int).Add(baseFeeRecipientDiff, l1FeeRecipientDiff) - balanceDiff := new(big.Int).Sub(startBalance, endBalance) - balanceDiff.Sub(balanceDiff, transferAmount) - require.Equal(t, balanceDiff, totalFee, "balances should add up") -} - -func StopStartBatcher(t *testing.T, deltaTimeOffset *hexutil.Uint64) { - InitParallel(t) - - cfg := DefaultSystemConfig(t) - cfg.DeployConfig.L2GenesisDeltaTimeOffset = deltaTimeOffset - sys, err := cfg.Start(t) - require.NoError(t, err, "Error starting up system") - defer sys.Close() - - rollupRPCClient, err := rpc.DialContext(context.Background(), sys.RollupNodes["verifier"].HTTPEndpoint()) - require.NoError(t, err) - rollupClient := sources.NewRollupClient(client.NewBaseRPCClient(rollupRPCClient)) - - l2Seq := sys.Clients["sequencer"] - l2Verif := sys.Clients["verifier"] - - // retrieve the initial sync status - seqStatus, err := rollupClient.SyncStatus(context.Background()) - require.NoError(t, err) - - nonce := uint64(0) - sendTx := func() *types.Receipt { - // Submit TX to L2 sequencer node - receipt := SendL2Tx(t, cfg, l2Seq, cfg.Secrets.Alice, func(opts *TxOpts) { - opts.ToAddr = &common.Address{0xff, 0xff} - opts.Value = big.NewInt(1_000_000_000) - opts.Nonce = nonce - }) - nonce++ - return receipt - } - // send a transaction - receipt := sendTx() - - // wait until the block the tx was first included in shows up in the safe chain on the verifier - safeBlockInclusionDuration := time.Duration(6*cfg.DeployConfig.L1BlockTime) * time.Second - _, err = geth.WaitForBlock(receipt.BlockNumber, l2Verif, safeBlockInclusionDuration) - require.NoError(t, err, "Waiting for block on verifier") - require.NoError(t, wait.ForProcessingFullBatch(context.Background(), rollupClient)) - - // ensure the safe chain advances - newSeqStatus, err := rollupClient.SyncStatus(context.Background()) - require.NoError(t, err) - require.Greater(t, newSeqStatus.SafeL2.Number, seqStatus.SafeL2.Number, "Safe chain did not advance") - - // stop the batch submission - err = sys.BatchSubmitter.Driver().StopBatchSubmitting(context.Background()) - require.NoError(t, err) - - // wait for any old safe blocks being submitted / derived - time.Sleep(safeBlockInclusionDuration) - - // get the initial sync status - seqStatus, err = rollupClient.SyncStatus(context.Background()) - require.NoError(t, err) - - // send another tx - sendTx() - time.Sleep(safeBlockInclusionDuration) - - // ensure that the safe chain does not advance while the batcher is stopped - newSeqStatus, err = rollupClient.SyncStatus(context.Background()) - require.NoError(t, err) - require.Equal(t, newSeqStatus.SafeL2.Number, seqStatus.SafeL2.Number, "Safe chain advanced while batcher was stopped") - - // start the batch submission - err = sys.BatchSubmitter.Driver().StartBatchSubmitting() - require.NoError(t, err) - time.Sleep(safeBlockInclusionDuration) - - // send a third tx - receipt = sendTx() - - // wait until the block the tx was first included in shows up in the safe chain on the verifier - _, err = geth.WaitForBlock(receipt.BlockNumber, l2Verif, safeBlockInclusionDuration) - require.NoError(t, err, "Waiting for block on verifier") - require.NoError(t, wait.ForProcessingFullBatch(context.Background(), rollupClient)) - - // ensure that the safe chain advances after restarting the batcher - newSeqStatus, err = rollupClient.SyncStatus(context.Background()) - require.NoError(t, err) - require.Greater(t, newSeqStatus.SafeL2.Number, seqStatus.SafeL2.Number, "Safe chain did not advance after batcher was restarted") -} - -func TestBatcherMultiTx(t *testing.T) { - InitParallel(t) - - cfg := DefaultSystemConfig(t) - 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.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.NoError(t, err, "Waiting for L2 blocks") - - ctx, cancel := context.WithTimeout(context.Background(), 30*time.Second) - defer cancel() - l1Number, err := l1Client.BlockNumber(ctx) - require.NoError(t, err) - - // start batch submission - err = sys.BatchSubmitter.Driver().StartBatchSubmitting() - require.NoError(t, err) - - totalTxCount := 0 - // wait for up to 10 L1 blocks, usually only 3 is required, but it's - // possible additional L1 blocks will be created before the batcher starts, - // 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.NoError(t, err, "Waiting for l1 blocks") - totalTxCount += len(block.Transactions()) - - if totalTxCount >= 10 { - return - } - } - - t.Fatal("Expected at least 10 transactions from the batcher") -} - -func latestBlock(t *testing.T, client *ethclient.Client) uint64 { - ctx, cancel := context.WithTimeout(context.Background(), 30*time.Second) - defer cancel() - blockAfter, err := client.BlockNumber(ctx) - require.Nil(t, err, "Error getting latest block") - return blockAfter -} - -// TestPendingBlockIsLatest tests that we serve the latest block as pending block -func TestPendingBlockIsLatest(t *testing.T) { - InitParallel(t) - - cfg := DefaultSystemConfig(t) - sys, err := cfg.Start(t) - require.Nil(t, err, "Error starting up system") - defer sys.Close() - l2Seq := sys.Clients["sequencer"] - - t.Run("block", func(t *testing.T) { - for i := 0; i < 10; i++ { - // TODO(CLI-4044): pending-block ID change - pending, err := l2Seq.BlockByNumber(context.Background(), big.NewInt(-1)) - require.NoError(t, err) - latest, err := l2Seq.BlockByNumber(context.Background(), nil) - require.NoError(t, err) - if pending.NumberU64() == latest.NumberU64() { - require.Equal(t, pending.Hash(), latest.Hash(), "pending must exactly match latest block") - return - } - // re-try until we have the same number, as the requests are not an atomic bundle, and the sequencer may create a block. - } - t.Fatal("failed to get pending block with same number as latest block") - }) - t.Run("header", func(t *testing.T) { - for i := 0; i < 10; i++ { - // TODO(CLI-4044): pending-block ID change - pending, err := l2Seq.HeaderByNumber(context.Background(), big.NewInt(-1)) - require.NoError(t, err) - latest, err := l2Seq.HeaderByNumber(context.Background(), nil) - require.NoError(t, err) - if pending.Number.Uint64() == latest.Number.Uint64() { - require.Equal(t, pending.Hash(), latest.Hash(), "pending must exactly match latest header") - return - } - // re-try until we have the same number, as the requests are not an atomic bundle, and the sequencer may create a block. - } - t.Fatal("failed to get pending header with same number as latest header") - }) -} - -func TestRuntimeConfigReload(t *testing.T) { - InitParallel(t) - - cfg := DefaultSystemConfig(t) - // to speed up the test, make it reload the config more often, and do not impose a long conf depth - cfg.Nodes["verifier"].RuntimeConfigReloadInterval = time.Second * 5 - cfg.Nodes["verifier"].Driver.VerifierConfDepth = 1 - - sys, err := cfg.Start(t) - require.Nil(t, err, "Error starting up system") - defer sys.Close() - initialRuntimeConfig := sys.RollupNodes["verifier"].RuntimeConfig() - - // close the EL node, since we want to block derivation, to solely rely on the reloading mechanism for updates. - sys.EthInstances["verifier"].Close() - - l1 := sys.Clients["l1"] - - // Change the system-config via L1 - sysCfgContract, err := bindings.NewSystemConfig(cfg.L1Deployments.SystemConfigProxy, l1) - require.NoError(t, err) - newUnsafeBlocksSigner := common.Address{0x12, 0x23, 0x45} - require.NotEqual(t, initialRuntimeConfig.P2PSequencerAddress(), newUnsafeBlocksSigner, "changing to a different address") - opts, err := bind.NewKeyedTransactorWithChainID(cfg.Secrets.SysCfgOwner, cfg.L1ChainIDBig()) - require.Nil(t, err) - // the unsafe signer address is part of the runtime config - tx, err := sysCfgContract.SetUnsafeBlockSigner(opts, newUnsafeBlocksSigner) - require.NoError(t, err) - - // wait for the change to confirm - _, err = wait.ForReceiptOK(context.Background(), l1, tx.Hash()) - require.NoError(t, err) - - // wait for the address to change - _, err = retry.Do(context.Background(), 10, retry.Fixed(time.Second*10), func() (struct{}, error) { - v := sys.RollupNodes["verifier"].RuntimeConfig().P2PSequencerAddress() - if v == newUnsafeBlocksSigner { - return struct{}{}, nil - } - return struct{}{}, fmt.Errorf("no change yet, seeing %s but looking for %s", v, newUnsafeBlocksSigner) - }) - require.NoError(t, err) -} - -func TestRecommendedProtocolVersionChange(t *testing.T) { - InitParallel(t) - - cfg := DefaultSystemConfig(t) - require.NotEqual(t, common.Address{}, cfg.L1Deployments.ProtocolVersions, "need ProtocolVersions contract deployment") - // to speed up the test, make it reload the config more often, and do not impose a long conf depth - cfg.Nodes["verifier"].RuntimeConfigReloadInterval = time.Second * 5 - cfg.Nodes["verifier"].Driver.VerifierConfDepth = 1 - - sys, err := cfg.Start(t) - require.Nil(t, err, "Error starting up system") - defer sys.Close() - runtimeConfig := sys.RollupNodes["verifier"].RuntimeConfig() - - // Change the superchain-config via L1 - l1 := sys.Clients["l1"] - - _, build, major, minor, patch, preRelease := params.OPStackSupport.Parse() - newRecommendedProtocolVersion := params.ProtocolVersionV0{Build: build, Major: major + 1, Minor: minor, Patch: patch, PreRelease: preRelease}.Encode() - require.NotEqual(t, runtimeConfig.RecommendedProtocolVersion(), newRecommendedProtocolVersion, "changing to a different protocol version") - - protVersions, err := bindings.NewProtocolVersions(cfg.L1Deployments.ProtocolVersionsProxy, l1) - require.NoError(t, err) - - // ProtocolVersions contract is owned by same key as SystemConfig in devnet - opts, err := bind.NewKeyedTransactorWithChainID(cfg.Secrets.SysCfgOwner, cfg.L1ChainIDBig()) - require.NoError(t, err) - - // Change recommended protocol version - tx, err := protVersions.SetRecommended(opts, new(big.Int).SetBytes(newRecommendedProtocolVersion[:])) - require.NoError(t, err) - - // wait for the change to confirm - _, err = wait.ForReceiptOK(context.Background(), l1, tx.Hash()) - require.NoError(t, err) - - // wait for the recommended protocol version to change - _, err = retry.Do(context.Background(), 10, retry.Fixed(time.Second*10), func() (struct{}, error) { - v := sys.RollupNodes["verifier"].RuntimeConfig().RecommendedProtocolVersion() - if v == newRecommendedProtocolVersion { - return struct{}{}, nil - } - return struct{}{}, fmt.Errorf("no change yet, seeing %s but looking for %s", v, newRecommendedProtocolVersion) - }) - require.NoError(t, err) -} - -func TestRequiredProtocolVersionChangeAndHalt(t *testing.T) { - InitParallel(t) - - cfg := DefaultSystemConfig(t) - // to speed up the test, make it reload the config more often, and do not impose a long conf depth - cfg.Nodes["verifier"].RuntimeConfigReloadInterval = time.Second * 5 - cfg.Nodes["verifier"].Driver.VerifierConfDepth = 1 - // configure halt in verifier op-node - cfg.Nodes["verifier"].RollupHalt = "major" - // configure halt in verifier op-geth node - cfg.GethOptions["verifier"] = append(cfg.GethOptions["verifier"], []geth.GethOption{ - func(ethCfg *ethconfig.Config, nodeCfg *node.Config) error { - ethCfg.RollupHaltOnIncompatibleProtocolVersion = "major" - return nil - }, - }...) - - sys, err := cfg.Start(t) - require.Nil(t, err, "Error starting up system") - defer sys.Close() - runtimeConfig := sys.RollupNodes["verifier"].RuntimeConfig() - - // Change the superchain-config via L1 - l1 := sys.Clients["l1"] - - _, build, major, minor, patch, preRelease := params.OPStackSupport.Parse() - newRequiredProtocolVersion := params.ProtocolVersionV0{Build: build, Major: major + 1, Minor: minor, Patch: patch, PreRelease: preRelease}.Encode() - require.NotEqual(t, runtimeConfig.RequiredProtocolVersion(), newRequiredProtocolVersion, "changing to a different protocol version") - - protVersions, err := bindings.NewProtocolVersions(cfg.L1Deployments.ProtocolVersionsProxy, l1) - require.NoError(t, err) - - // ProtocolVersions contract is owned by same key as SystemConfig in devnet - opts, err := bind.NewKeyedTransactorWithChainID(cfg.Secrets.SysCfgOwner, cfg.L1ChainIDBig()) - require.NoError(t, err) - - // Change required protocol version - tx, err := protVersions.SetRequired(opts, new(big.Int).SetBytes(newRequiredProtocolVersion[:])) - require.NoError(t, err) - - // wait for the change to confirm - _, err = wait.ForReceiptOK(context.Background(), l1, tx.Hash()) - require.NoError(t, err) - - // wait for the required protocol version to take effect by halting the verifier that opted in, and halting the op-geth node that opted in. - _, err = retry.Do(context.Background(), 10, retry.Fixed(time.Second*10), func() (struct{}, error) { - if !sys.RollupNodes["verifier"].Stopped() { - return struct{}{}, errors.New("verifier rollup node is not closed yet") - } - return struct{}{}, nil - }) - require.NoError(t, err) - t.Log("verified that op-node closed!") - // Checking if the engine is down is not trivial in op-e2e. - // In op-geth we have halting tests covering the Engine API, in op-e2e we instead check if the API stops. - _, err = retry.Do(context.Background(), 10, retry.Fixed(time.Second*10), func() (struct{}, error) { - ctx, cancel := context.WithTimeout(context.Background(), 30*time.Second) - _, err := sys.Clients["verifier"].ChainID(ctx) - cancel() - if err != nil && !errors.Is(err, ctx.Err()) { // waiting for client to stop responding to chainID requests - return struct{}{}, nil - } - return struct{}{}, errors.New("verifier rollup node is not closed yet") - }) - require.NoError(t, err) - t.Log("verified that op-geth closed!") -} diff --git a/op-e2e/system_tob_test.go b/op-e2e/system_tob_test.go deleted file mode 100644 index ba3e401fcd80..000000000000 --- a/op-e2e/system_tob_test.go +++ /dev/null @@ -1,739 +0,0 @@ -package op_e2e - -import ( - "bytes" - "context" - "crypto/ecdsa" - "fmt" - "math/big" - "math/rand" - "testing" - "time" - - "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" - "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/crypto" - "github.com/ethereum/go-ethereum/ethclient" - "github.com/ethereum/go-ethereum/ethclient/gethclient" - "github.com/ethereum/go-ethereum/params" - "github.com/ethereum/go-ethereum/rpc" - fuzz "github.com/google/gofuzz" - "github.com/stretchr/testify/require" -) - -// TestGasPriceOracleFeeUpdates checks that the gas price oracle cannot be locked by mis-configuring parameters. -func TestGasPriceOracleFeeUpdates(t *testing.T) { - ctx, ctxCancel := context.WithCancel(context.Background()) - defer ctxCancel() - - 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 := 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 - cfg := DefaultSystemConfig(t) - sys, err := cfg.Start(t) - require.Nil(t, err, "Error starting up system") - defer sys.Close() - - // Obtain our sequencer, verifier, and transactor keypair. - l1Client := sys.Clients["l1"] - l2Seq := sys.Clients["sequencer"] - // l2Verif := sys.Clients["verifier"] - ethPrivKey := cfg.Secrets.SysCfgOwner - - // Bind to the SystemConfig & GasPriceOracle contracts - sysconfig, err := legacybindings.NewSystemConfig(cfg.L1Deployments.SystemConfigProxy, l1Client) - require.Nil(t, err) - gpoContract, err := legacybindings.NewGasPriceOracleCaller(predeploys.GasPriceOracleAddr, l2Seq) - require.Nil(t, err) - - // Obtain our signer. - opts, err := bind.NewKeyedTransactorWithChainID(ethPrivKey, cfg.L1ChainIDBig()) - require.Nil(t, err) - - // Define our L1 transaction timeout duration. - txTimeoutDuration := 10 * time.Duration(cfg.DeployConfig.L1BlockTime) * time.Second - - // Update the gas config, wait for it to show up on L2, & verify that it was set as intended - opts.Context, cancel = context.WithTimeout(ctx, txTimeoutDuration) - tx, err := sysconfig.SetGasConfig(opts, overheadValue, scalarValue) - cancel() - require.Nil(t, err, "sending overhead update tx") - - receipt, err := wait.ForReceiptOK(ctx, l1Client, tx.Hash()) - require.Nil(t, err, "Waiting for sysconfig set gas config update tx") - - _, err = geth.WaitForL1OriginOnL2(sys.RollupConfig, receipt.BlockNumber.Uint64(), l2Seq, txTimeoutDuration) - require.NoError(t, err, "waiting for L2 block to include the sysconfig update") - - gpoOverhead, err := gpoContract.Overhead(&bind.CallOpts{}) - require.Nil(t, err, "reading gpo overhead") - gpoScalar, err := gpoContract.Scalar(&bind.CallOpts{}) - require.Nil(t, err, "reading gpo scalar") - - if gpoOverhead.Cmp(overheadValue) != 0 { - t.Errorf("overhead that was found (%v) is not what was set (%v)", gpoOverhead, overheadValue) - } - if gpoScalar.Cmp(scalarValue) != 0 { - t.Errorf("scalar that was found (%v) is not what was set (%v)", gpoScalar, scalarValue) - } - - // Now modify the scalar value & ensure that the gas params can be modified - scalarValue = big.NewInt(params.Ether) - - opts.Context, cancel = context.WithTimeout(context.Background(), txTimeoutDuration) - tx, err = sysconfig.SetGasConfig(opts, overheadValue, scalarValue) - cancel() - require.Nil(t, err, "sending overhead update tx") - - receipt, err = wait.ForReceiptOK(ctx, l1Client, tx.Hash()) - require.Nil(t, err, "Waiting for sysconfig set gas config update tx") - - _, err = geth.WaitForL1OriginOnL2(sys.RollupConfig, receipt.BlockNumber.Uint64(), l2Seq, txTimeoutDuration) - require.NoError(t, err, "waiting for L2 block to include the sysconfig update") - - gpoOverhead, err = gpoContract.Overhead(&bind.CallOpts{}) - require.Nil(t, err, "reading gpo overhead") - gpoScalar, err = gpoContract.Scalar(&bind.CallOpts{}) - require.Nil(t, err, "reading gpo scalar") - - if gpoOverhead.Cmp(overheadValue) != 0 { - t.Errorf("overhead that was found (%v) is not what was set (%v)", gpoOverhead, overheadValue) - } - if gpoScalar.Cmp(scalarValue) != 0 { - t.Errorf("scalar that was found (%v) is not what was set (%v)", gpoScalar, scalarValue) - } -} - -// TestL2SequencerRPCDepositTx checks that the L2 sequencer will not accept DepositTx type transactions. -// The acceptance of these transactions would allow for arbitrary minting of ETH in L2. -func TestL2SequencerRPCDepositTx(t *testing.T) { - InitParallel(t) - - // Create our system configuration for L1/L2 and start it - cfg := DefaultSystemConfig(t) - sys, err := cfg.Start(t) - require.Nil(t, err, "Error starting up system") - defer sys.Close() - - // Obtain our sequencer, verifier, and transactor keypair. - l2Seq := sys.Clients["sequencer"] - l2Verif := sys.Clients["verifier"] - txSigningKey := sys.Cfg.Secrets.Alice - require.Nil(t, err) - - // Create a deposit tx to send over RPC. - tx := types.NewTx(&types.DepositTx{ - SourceHash: common.Hash{}, - From: crypto.PubkeyToAddress(txSigningKey.PublicKey), - To: &common.Address{0xff, 0xff}, - Mint: big.NewInt(1000), - Value: big.NewInt(1000), - Gas: 0, - IsSystemTransaction: false, - Data: nil, - }) - - ctx, cancel := context.WithTimeout(context.Background(), 5*time.Second) - err = l2Seq.SendTransaction(ctx, tx) - cancel() - require.Error(t, err, "a DepositTx was accepted by L2 sequencer over RPC when it should not have been.") - - ctx, cancel = context.WithTimeout(context.Background(), 5*time.Second) - err = l2Verif.SendTransaction(ctx, tx) - cancel() - require.Error(t, err, "a DepositTx was accepted by L2 verifier over RPC when it should not have been.") -} - -// TestAccount defines an account generated by startConfigWithTestAccounts -type TestAccount struct { - HDPath string - Key *ecdsa.PrivateKey - Addr common.Address - L1Opts *bind.TransactOpts - L2Opts *bind.TransactOpts -} - -// startConfigWithTestAccounts takes a SystemConfig, generates additional accounts, adds them to the config, so they -// are funded on startup, starts the system, and imports the keys into the keystore, and obtains transaction opts for -// each account. -func startConfigWithTestAccounts(t *testing.T, cfg *SystemConfig, accountsToGenerate int) (*System, []*TestAccount, error) { - // Create our test accounts and add them to the pre-mine cfg. - testAccounts := make([]*TestAccount, 0) - var err error - for i := 0; i < accountsToGenerate; i++ { - // Create our test account and add it to our list - testAccount := &TestAccount{ - HDPath: fmt.Sprintf("m/44'/60'/0'/0/%d", 1000+i), // offset by 1000 to avoid collisions. - Key: nil, - L1Opts: nil, - L2Opts: nil, - } - testAccounts = append(testAccounts, testAccount) - - // Obtain our generated private key - testAccount.Key, err = cfg.Secrets.Wallet.PrivateKey(accounts.Account{ - URL: accounts.URL{ - Path: testAccount.HDPath, - }, - }) - if err != nil { - return nil, nil, err - } - testAccount.Addr = crypto.PubkeyToAddress(testAccount.Key.PublicKey) - - // Obtain the transaction options for contract bindings for this account. - testAccount.L1Opts, err = bind.NewKeyedTransactorWithChainID(testAccount.Key, cfg.L1ChainIDBig()) - if err != nil { - return nil, nil, err - } - testAccount.L2Opts, err = bind.NewKeyedTransactorWithChainID(testAccount.Key, cfg.L2ChainIDBig()) - if err != nil { - return nil, nil, err - } - - // Fund the test account in our config - cfg.Premine[testAccount.Addr] = big.NewInt(params.Ether) - cfg.Premine[testAccount.Addr] = cfg.Premine[testAccount.Addr].Mul(cfg.Premine[testAccount.Addr], big.NewInt(1_000_000)) - - } - - // Start our system - sys, err := cfg.Start(t) - if err != nil { - return sys, nil, err - } - - // Return our results. - return sys, testAccounts, err -} - -// TestMixedDepositValidity makes a number of deposit transactions, some which will succeed in transferring value, -// while others do not. It ensures that the expected nonces/balances match after several interactions. -func TestMixedDepositValidity(t *testing.T) { - InitParallel(t) - // Define how many deposit txs we'll make. Each deposit mints a fixed amount and transfers up to 1/3 of the user's - // balance. As such, this number cannot be too high or else the test will always fail due to lack of balance in L1. - const depositTxCount = 15 - - // Define how many accounts we'll use to deposit funds - const accountUsedToDeposit = 5 - - // Create our system configuration, funding all accounts we created for L1/L2, and start it - cfg := DefaultSystemConfig(t) - sys, testAccounts, err := startConfigWithTestAccounts(t, &cfg, accountUsedToDeposit) - require.Nil(t, err, "Error starting up system") - defer sys.Close() - - // Obtain our sequencer, verifier, and transactor keypair. - l1Client := sys.Clients["l1"] - l2Seq := sys.Clients["sequencer"] - l2Verif := sys.Clients["verifier"] - require.NoError(t, err) - - // Define our L1 transaction timeout duration. - txTimeoutDuration := 10 * time.Duration(cfg.DeployConfig.L1BlockTime) * time.Second - - // Create a struct used to track our transactors and their transactions sent. - type TestAccountState struct { - Account *TestAccount - ExpectedL1Balance *big.Int - ExpectedL2Balance *big.Int - StartingL1Nonce uint64 - ExpectedL1Nonce uint64 - StartingL2Nonce uint64 - ExpectedL2Nonce uint64 - } - - // Create the state objects for every test account we'll track changes for. - transactors := make([]*TestAccountState, 0) - for i := 0; i < len(testAccounts); i++ { - // Obtain our account - testAccount := testAccounts[i] - - // Obtain the transactor's starting nonce on L1. - ctx, cancel := context.WithTimeout(context.Background(), txTimeoutDuration) - startL1Nonce, err := l1Client.NonceAt(ctx, testAccount.L1Opts.From, nil) - cancel() - require.NoError(t, err) - - // Obtain the transactor's starting balance on L2. - ctx, cancel = context.WithTimeout(context.Background(), txTimeoutDuration) - startL2Balance, err := l2Verif.BalanceAt(ctx, testAccount.L2Opts.From, nil) - cancel() - require.NoError(t, err) - - // Obtain the transactor's starting nonce on L2. - ctx, cancel = context.WithTimeout(context.Background(), txTimeoutDuration) - startL2Nonce, err := l2Verif.NonceAt(ctx, testAccount.L2Opts.From, nil) - cancel() - require.NoError(t, err) - - // Add our transactor to our list - transactors = append(transactors, &TestAccountState{ - Account: testAccount, - ExpectedL2Balance: startL2Balance, - ExpectedL1Nonce: startL1Nonce, - ExpectedL2Nonce: startL2Nonce, - }) - } - - // Create our random provider - randomProvider := rand.New(rand.NewSource(1452)) - - // Now we create a number of deposits from each transactor - for i := 0; i < depositTxCount; i++ { - // Determine if this deposit should succeed in transferring value (not minting) - validTransfer := randomProvider.Int()%2 == 0 - - // Determine the transactor to use - transactorIndex := randomProvider.Int() % len(transactors) - transactor := transactors[transactorIndex] - - // Determine the transactor to receive the deposit - receiverIndex := randomProvider.Int() % len(transactors) - receiver := transactors[receiverIndex] - toAddr := receiver.Account.L2Opts.From - - // Create our L1 deposit transaction and send it. - mintAmount := big.NewInt(randomProvider.Int63() % 9_000_000) - transactor.Account.L1Opts.Value = mintAmount - var transferValue *big.Int - if validTransfer { - transferValue = new(big.Int).Div(transactor.ExpectedL2Balance, common.Big3) // send 1/3 our balance which should succeed. - } else { - transferValue = new(big.Int).Mul(common.Big2, transactor.ExpectedL2Balance) // trigger a revert by trying to transfer our current balance * 2 - } - SendDepositTx(t, cfg, l1Client, l2Verif, transactor.Account.L1Opts, func(l2Opts *DepositTxOpts) { - l2Opts.GasLimit = 100_000 - l2Opts.IsCreation = false - l2Opts.Data = nil - l2Opts.ToAddr = toAddr - l2Opts.Value = transferValue - if validTransfer { - l2Opts.ExpectedStatus = types.ReceiptStatusSuccessful - } else { - l2Opts.ExpectedStatus = types.ReceiptStatusFailed - } - }) - - // Update our expected balances. - if validTransfer && transactor != receiver { - // Transactor balances changes by minted minus transferred value. - transactor.ExpectedL2Balance = new(big.Int).Add(transactor.ExpectedL2Balance, new(big.Int).Sub(mintAmount, transferValue)) - // Receiver balance changes by transferred value. - receiver.ExpectedL2Balance = new(big.Int).Add(receiver.ExpectedL2Balance, transferValue) - } else { - // If the transfer failed, minting should've still succeeded but the balance shouldn't have transferred - // to the recipient. - transactor.ExpectedL2Balance = new(big.Int).Add(transactor.ExpectedL2Balance, mintAmount) - } - transactor.ExpectedL1Nonce = transactor.ExpectedL1Nonce + 1 - transactor.ExpectedL2Nonce = transactor.ExpectedL2Nonce + 1 - } - - // At the end, assert our account balance/nonce states. - for _, transactor := range transactors { - // Obtain the L1 account nonce - ctx, cancel := context.WithTimeout(context.Background(), txTimeoutDuration) - endL1Nonce, err := l1Client.NonceAt(ctx, transactor.Account.L1Opts.From, nil) - cancel() - require.NoError(t, err) - - // Obtain the L2 sequencer account balance - ctx, cancel = context.WithTimeout(context.Background(), txTimeoutDuration) - endL2SeqBalance, err := l2Seq.BalanceAt(ctx, transactor.Account.L2Opts.From, nil) - cancel() - require.NoError(t, err) - - // Obtain the L2 sequencer account nonce - ctx, cancel = context.WithTimeout(context.Background(), txTimeoutDuration) - endL2SeqNonce, err := l2Seq.NonceAt(ctx, transactor.Account.L2Opts.From, nil) - cancel() - require.NoError(t, err) - - // Obtain the L2 verifier account balance - ctx, cancel = context.WithTimeout(context.Background(), txTimeoutDuration) - endL2VerifBalance, err := l2Verif.BalanceAt(ctx, transactor.Account.L2Opts.From, nil) - cancel() - require.NoError(t, err) - - // Obtain the L2 verifier account nonce - ctx, cancel = context.WithTimeout(context.Background(), txTimeoutDuration) - endL2VerifNonce, err := l2Verif.NonceAt(ctx, transactor.Account.L2Opts.From, nil) - cancel() - require.NoError(t, err) - - require.Equal(t, transactor.ExpectedL1Nonce, endL1Nonce, "Unexpected L1 nonce for transactor") - require.Equal(t, transactor.ExpectedL2Nonce, endL2SeqNonce, "Unexpected L2 sequencer nonce for transactor") - require.Equal(t, transactor.ExpectedL2Balance, endL2SeqBalance, "Unexpected L2 sequencer balance for transactor") - require.Equal(t, transactor.ExpectedL2Nonce, endL2VerifNonce, "Unexpected L2 verifier nonce for transactor") - require.Equal(t, transactor.ExpectedL2Balance, endL2VerifBalance, "Unexpected L2 verifier balance for transactor") - } -} - -// TestMixedWithdrawalValidity makes a number of withdrawal transactions and ensures ones with modified parameters are -// rejected while unmodified ones are accepted. This runs test cases in different systems. -func TestMixedWithdrawalValidity(t *testing.T) { - InitParallel(t) - - // There are 7 different fields we try modifying to cause a failure, plus one "good" test result we test. - for i := 0; i <= 8; i++ { - i := i // avoid loop var capture - t.Run(fmt.Sprintf("withdrawal test#%d", i+1), func(t *testing.T) { - ctx, bgCancel := context.WithCancel(context.Background()) - defer bgCancel() - - InitParallel(t) - - // Create our system configuration, funding all accounts we created for L1/L2, and start it - cfg := DefaultSystemConfig(t) - cfg.Nodes["sequencer"].SafeDBPath = t.TempDir() - cfg.DeployConfig.L2BlockTime = 2 - require.LessOrEqual(t, cfg.DeployConfig.FinalizationPeriodSeconds, uint64(6)) - require.Equal(t, cfg.DeployConfig.FundDevAccounts, true) - sys, err := cfg.Start(t) - require.NoError(t, err, "error starting up system") - defer sys.Close() - - // Obtain our sequencer, verifier, and transactor keypair. - l1Client := sys.Clients["l1"] - l2Seq := sys.Clients["sequencer"] - l2Verif := sys.Clients["verifier"] - require.NoError(t, err) - - systemConfig, err := legacybindings.NewSystemConfigCaller(cfg.L1Deployments.SystemConfigProxy, l1Client) - require.NoError(t, err) - unsafeBlockSigner, err := systemConfig.UnsafeBlockSigner(nil) - require.NoError(t, err) - require.Equal(t, cfg.DeployConfig.P2PSequencerAddress, unsafeBlockSigner) - - // The batcher has balance on L1 - batcherBalance, err := l1Client.BalanceAt(context.Background(), cfg.DeployConfig.BatchSenderAddress, nil) - require.NoError(t, err) - require.NotEqual(t, batcherBalance, big.NewInt(0)) - - // The proposer has balance on L1 - proposerBalance, err := l1Client.BalanceAt(context.Background(), cfg.DeployConfig.L2OutputOracleProposer, nil) - require.NoError(t, err) - require.NotEqual(t, proposerBalance, big.NewInt(0)) - - // Define our L1 transaction timeout duration. - txTimeoutDuration := 10 * time.Duration(cfg.DeployConfig.L1BlockTime) * time.Second - - // Bind to the deposit contract - depositContract, err := bindings.NewOptimismPortal(cfg.L1Deployments.OptimismPortalProxy, l1Client) - _ = depositContract - require.NoError(t, err) - - l2OutputOracle, err := bindings.NewL2OutputOracleCaller(cfg.L1Deployments.L2OutputOracleProxy, l1Client) - require.NoError(t, err) - - finalizationPeriod, err := l2OutputOracle.FINALIZATIONPERIODSECONDS(nil) - require.NoError(t, err) - require.Equal(t, cfg.DeployConfig.FinalizationPeriodSeconds, finalizationPeriod.Uint64()) - - disputeGameFactory, err := bindings.NewDisputeGameFactoryCaller(cfg.L1Deployments.DisputeGameFactoryProxy, l1Client) - require.NoError(t, err) - - optimismPortal2, err := bindingspreview.NewOptimismPortal2Caller(cfg.L1Deployments.OptimismPortalProxy, l1Client) - require.NoError(t, err) - - // Create a struct used to track our transactors and their transactions sent. - type TestAccountState struct { - Account *TestAccount - ExpectedL1Balance *big.Int - ExpectedL2Balance *big.Int - ExpectedL1Nonce uint64 - ExpectedL2Nonce uint64 - } - - // Create a test account state for our transactor. - transactor := &TestAccountState{ - Account: &TestAccount{ - HDPath: e2eutils.DefaultMnemonicConfig.Alice, - Key: cfg.Secrets.Alice, - L1Opts: nil, - L2Opts: nil, - }, - ExpectedL1Balance: nil, - ExpectedL2Balance: nil, - ExpectedL1Nonce: 0, - ExpectedL2Nonce: 0, - } - transactor.Account.L1Opts, err = bind.NewKeyedTransactorWithChainID(transactor.Account.Key, cfg.L1ChainIDBig()) - require.NoError(t, err) - transactor.Account.L2Opts, err = bind.NewKeyedTransactorWithChainID(transactor.Account.Key, cfg.L2ChainIDBig()) - require.NoError(t, err) - - // Obtain the transactor's starting balance on L1. - txCtx, txCancel := context.WithTimeout(context.Background(), txTimeoutDuration) - transactor.ExpectedL1Balance, err = l1Client.BalanceAt(txCtx, transactor.Account.L1Opts.From, nil) - txCancel() - require.NoError(t, err) - - // Obtain the transactor's starting balance on L2. - txCtx, txCancel = context.WithTimeout(context.Background(), txTimeoutDuration) - transactor.ExpectedL2Balance, err = l2Verif.BalanceAt(txCtx, transactor.Account.L2Opts.From, nil) - txCancel() - require.NoError(t, err) - - // Bind to the L2-L1 message passer - l2l1MessagePasser, err := bindings.NewL2ToL1MessagePasser(predeploys.L2ToL1MessagePasserAddr, l2Seq) - require.NoError(t, err, "error binding to message passer on L2") - - // Create our fuzzer wrapper to generate complex values (despite this not being a fuzz test, this is still a useful - // provider to fill complex data structures). - typeProvider := fuzz.NewWithSeed(time.Now().Unix()).NilChance(0).MaxDepth(10000).NumElements(0, 0x100) - fuzzerutils.AddFuzzerFunctions(typeProvider) - - // Now we create a number of withdrawals from each transactor - - // Determine the address our request will come from - fromAddr := crypto.PubkeyToAddress(transactor.Account.Key.PublicKey) - fromBalance, err := l2Verif.BalanceAt(context.Background(), fromAddr, nil) - require.NoError(t, err) - require.Greaterf(t, fromBalance.Uint64(), uint64(700_000_000_000), "insufficient balance for %s", fromAddr) - - // Initiate Withdrawal - withdrawAmount := big.NewInt(500_000_000_000) - transactor.Account.L2Opts.Value = withdrawAmount - tx, err := l2l1MessagePasser.InitiateWithdrawal(transactor.Account.L2Opts, fromAddr, big.NewInt(21000), nil) - require.Nil(t, err, "sending initiate withdraw tx") - - t.Logf("Waiting for tx %s to be in sequencer", tx.Hash().Hex()) - receiptSeq, err := wait.ForReceiptOK(ctx, l2Seq, tx.Hash()) - require.Nil(t, err, "withdrawal initiated on L2 sequencer") - - verifierTip, err := l2Verif.BlockByNumber(context.Background(), nil) - require.Nil(t, err) - - t.Logf("Waiting for tx %s to be in verifier. Verifier tip is %s:%d. Included in sequencer in block %s:%d", tx.Hash().Hex(), verifierTip.Hash().Hex(), verifierTip.NumberU64(), receiptSeq.BlockHash.Hex(), receiptSeq.BlockNumber) - receipt, err := wait.ForReceiptOK(ctx, l2Verif, tx.Hash()) - require.Nilf(t, err, "withdrawal tx %s not found in verifier. included in block %s:%d", tx.Hash().Hex(), receiptSeq.BlockHash.Hex(), receiptSeq.BlockNumber) - - // Obtain the header for the block containing the transaction (used to calculate gas fees) - txCtx, txCancel = context.WithTimeout(context.Background(), txTimeoutDuration) - header, err := l2Verif.HeaderByNumber(txCtx, receipt.BlockNumber) - txCancel() - require.Nil(t, err) - - // Calculate gas fees for the withdrawal in L2 to later adjust our balance. - withdrawalL2GasFee := calcGasFees(receipt.GasUsed, tx.GasTipCap(), tx.GasFeeCap(), header.BaseFee) - - // Adjust our expected L2 balance (should've decreased by withdraw amount + fees) - transactor.ExpectedL2Balance = new(big.Int).Sub(transactor.ExpectedL2Balance, withdrawAmount) - transactor.ExpectedL2Balance = new(big.Int).Sub(transactor.ExpectedL2Balance, withdrawalL2GasFee) - transactor.ExpectedL2Balance = new(big.Int).Sub(transactor.ExpectedL2Balance, receipt.L1Fee) - transactor.ExpectedL2Nonce = transactor.ExpectedL2Nonce + 1 - - // Wait for the finalization period, then we can finalize this withdrawal. - require.NotEqual(t, cfg.L1Deployments.L2OutputOracleProxy, common.Address{}) - var blockNumber uint64 - if e2eutils.UseFPAC() { - blockNumber, err = wait.ForGamePublished(ctx, l1Client, cfg.L1Deployments.OptimismPortalProxy, cfg.L1Deployments.DisputeGameFactoryProxy, receipt.BlockNumber) - } else { - blockNumber, err = wait.ForOutputRootPublished(ctx, l1Client, cfg.L1Deployments.L2OutputOracleProxy, receipt.BlockNumber) - } - require.Nil(t, err) - - header, err = l2Verif.HeaderByNumber(ctx, new(big.Int).SetUint64(blockNumber)) - require.Nil(t, err) - - rpcClient, err := rpc.Dial(sys.EthInstances["verifier"].WSEndpoint()) - require.Nil(t, err) - proofCl := gethclient.New(rpcClient) - receiptCl := ethclient.NewClient(rpcClient) - blockCl := ethclient.NewClient(rpcClient) - - // Now create the withdrawal - params, err := ProveWithdrawalParameters(context.Background(), proofCl, receiptCl, blockCl, tx.Hash(), header, l2OutputOracle, disputeGameFactory, optimismPortal2) - require.Nil(t, err) - - // Obtain our withdrawal parameters - withdrawal := crossdomain.Withdrawal{ - Nonce: params.Nonce, - Sender: ¶ms.Sender, - Target: ¶ms.Target, - Value: params.Value, - GasLimit: params.GasLimit, - Data: params.Data, - } - withdrawalTransaction := withdrawal.WithdrawalTransaction() - l2OutputIndexParam := params.L2OutputIndex - outputRootProofParam := params.OutputRootProof - withdrawalProofParam := params.WithdrawalProof - - // Determine if this will be a bad withdrawal. - badWithdrawal := i < 8 - if badWithdrawal { - // Select a field to overwrite depending on which test case this is. - fieldIndex := i - - // We ensure that each field changes to something different. - if fieldIndex == 0 { - originalValue := new(big.Int).Set(withdrawalTransaction.Nonce) - for originalValue.Cmp(withdrawalTransaction.Nonce) == 0 { - typeProvider.Fuzz(&withdrawalTransaction.Nonce) - } - } else if fieldIndex == 1 { - originalValue := withdrawalTransaction.Sender - for originalValue == withdrawalTransaction.Sender { - typeProvider.Fuzz(&withdrawalTransaction.Sender) - } - } else if fieldIndex == 2 { - originalValue := withdrawalTransaction.Target - for originalValue == withdrawalTransaction.Target { - typeProvider.Fuzz(&withdrawalTransaction.Target) - } - } else if fieldIndex == 3 { - originalValue := new(big.Int).Set(withdrawalTransaction.Value) - for originalValue.Cmp(withdrawalTransaction.Value) == 0 { - typeProvider.Fuzz(&withdrawalTransaction.Value) - } - } else if fieldIndex == 4 { - originalValue := new(big.Int).Set(withdrawalTransaction.GasLimit) - for originalValue.Cmp(withdrawalTransaction.GasLimit) == 0 { - typeProvider.Fuzz(&withdrawalTransaction.GasLimit) - } - } else if fieldIndex == 5 { - originalValue := new(big.Int).Set(l2OutputIndexParam) - for originalValue.Cmp(l2OutputIndexParam) == 0 { - typeProvider.Fuzz(&l2OutputIndexParam) - } - } else if fieldIndex == 6 { - // TODO: this is a large structure that is unlikely to ever produce the same value, however we should - // verify that we actually generated different values. - typeProvider.Fuzz(&outputRootProofParam) - } else if fieldIndex == 7 { - typeProvider.Fuzz(&withdrawalProofParam) - originalValue := make([][]byte, len(withdrawalProofParam)) - for i := 0; i < len(withdrawalProofParam); i++ { - originalValue[i] = make([]byte, len(withdrawalProofParam[i])) - copy(originalValue[i], withdrawalProofParam[i]) - for bytes.Equal(originalValue[i], withdrawalProofParam[i]) { - typeProvider.Fuzz(&withdrawalProofParam[i]) - } - } - - } - } - - // Prove withdrawal. This checks the proof so we only finalize if this succeeds - tx, err = depositContract.ProveWithdrawalTransaction( - transactor.Account.L1Opts, - withdrawalTransaction, - l2OutputIndexParam, - outputRootProofParam, - withdrawalProofParam, - ) - - // If we had a bad withdrawal, we don't update some expected value and skip to processing the next - // withdrawal. Otherwise, if it was valid, this should've succeeded so we proceed with updating our expected - // values and asserting no errors occurred. - if badWithdrawal { - require.Error(t, err) - } else { - require.NoError(t, err) - - if e2eutils.UseFPAC() { - // 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), - challenger.WithPrivKey(sys.Cfg.Secrets.Mallory)) - } - receipt, err = wait.ForReceiptOK(ctx, l1Client, tx.Hash()) - require.NoError(t, err, "finalize withdrawal") - - // Verify balance after withdrawal - header, err = l1Client.HeaderByNumber(ctx, receipt.BlockNumber) - require.NoError(t, err) - - // Ensure that withdrawal - gas fees are added to the L1 balance - // Fun fact, the fee is greater than the withdrawal amount - withdrawalL1GasFee := calcGasFees(receipt.GasUsed, tx.GasTipCap(), tx.GasFeeCap(), header.BaseFee) - transactor.ExpectedL1Balance = new(big.Int).Add(transactor.ExpectedL2Balance, withdrawAmount) - transactor.ExpectedL1Balance = new(big.Int).Sub(transactor.ExpectedL2Balance, withdrawalL1GasFee) - transactor.ExpectedL1Nonce++ - - // Ensure that our withdrawal was proved successfully - _, err := wait.ForReceiptOK(ctx, l1Client, tx.Hash()) - require.NoError(t, err, "prove withdrawal") - - // Wait for finalization and then create the Finalized Withdrawal Transaction - 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, transactor.Account.L1Opts.From) - require.NoError(t, err) - } else { - err = wait.ForFinalizationPeriod(ctx, l1Client, header.Number, cfg.L1Deployments.L2OutputOracleProxy) - require.NoError(t, err) - } - - // Finalize withdrawal - _, err = depositContract.FinalizeWithdrawalTransaction( - transactor.Account.L1Opts, - withdrawalTransaction, - ) - require.NoError(t, err) - } - - // At the end, assert our account balance/nonce states. - - // Obtain the L2 sequencer account balance - endL1Balance, err := l1Client.BalanceAt(ctx, transactor.Account.L1Opts.From, nil) - require.NoError(t, err) - - // Obtain the L1 account nonce - endL1Nonce, err := l1Client.NonceAt(ctx, transactor.Account.L1Opts.From, nil) - require.NoError(t, err) - - // Obtain the L2 sequencer account balance - endL2SeqBalance, err := l2Seq.BalanceAt(ctx, transactor.Account.L1Opts.From, nil) - require.NoError(t, err) - - // Obtain the L2 sequencer account nonce - endL2SeqNonce, err := l2Seq.NonceAt(ctx, transactor.Account.L1Opts.From, nil) - require.NoError(t, err) - - // Obtain the L2 verifier account balance - endL2VerifBalance, err := l2Verif.BalanceAt(ctx, transactor.Account.L1Opts.From, nil) - require.NoError(t, err) - - // Obtain the L2 verifier account nonce - endL2VerifNonce, err := l2Verif.NonceAt(ctx, transactor.Account.L1Opts.From, nil) - require.NoError(t, err) - - // TODO: Check L1 balance as well here. We avoided this due to time constraints as it seems L1 fees - // were off slightly. - _ = endL1Balance - // require.Equal(t, transactor.ExpectedL1Balance, endL1Balance, "Unexpected L1 balance for transactor") - require.Equal(t, transactor.ExpectedL1Nonce, endL1Nonce, "Unexpected L1 nonce for transactor") - require.Equal(t, transactor.ExpectedL2Nonce, endL2SeqNonce, "Unexpected L2 sequencer nonce for transactor") - require.Equal(t, transactor.ExpectedL2Balance, endL2SeqBalance, "Unexpected L2 sequencer balance for transactor") - require.Equal(t, transactor.ExpectedL2Nonce, endL2VerifNonce, "Unexpected L2 verifier nonce for transactor") - require.Equal(t, transactor.ExpectedL2Balance, endL2VerifBalance, "Unexpected L2 verifier balance for transactor") - }) - } -} diff --git a/op-e2e/tracer.go b/op-e2e/tracer.go deleted file mode 100644 index 217c1762082a..000000000000 --- a/op-e2e/tracer.go +++ /dev/null @@ -1,36 +0,0 @@ -package op_e2e - -import ( - "context" - - "github.com/libp2p/go-libp2p/core/peer" - - "github.com/ethereum-optimism/optimism/op-node/node" - "github.com/ethereum-optimism/optimism/op-service/eth" -) - -type FnTracer struct { - OnNewL1HeadFn func(ctx context.Context, sig eth.L1BlockRef) - OnUnsafeL2PayloadFn func(ctx context.Context, from peer.ID, payload *eth.ExecutionPayloadEnvelope) - OnPublishL2PayloadFn func(ctx context.Context, payload *eth.ExecutionPayloadEnvelope) -} - -func (n *FnTracer) OnNewL1Head(ctx context.Context, sig eth.L1BlockRef) { - if n.OnNewL1HeadFn != nil { - n.OnNewL1HeadFn(ctx, sig) - } -} - -func (n *FnTracer) OnUnsafeL2Payload(ctx context.Context, from peer.ID, payload *eth.ExecutionPayloadEnvelope) { - if n.OnUnsafeL2PayloadFn != nil { - n.OnUnsafeL2PayloadFn(ctx, from, payload) - } -} - -func (n *FnTracer) OnPublishL2Payload(ctx context.Context, payload *eth.ExecutionPayloadEnvelope) { - if n.OnPublishL2PayloadFn != nil { - n.OnPublishL2PayloadFn(ctx, payload) - } -} - -var _ node.Tracer = (*FnTracer)(nil) diff --git a/op-e2e/tx_helper.go b/op-e2e/tx_helper.go deleted file mode 100644 index 0b91afbbb760..000000000000 --- a/op-e2e/tx_helper.go +++ /dev/null @@ -1,146 +0,0 @@ -package op_e2e - -import ( - "context" - "crypto/ecdsa" - "math/big" - "testing" - "time" - - "github.com/ethereum-optimism/optimism/op-e2e/e2eutils/wait" - - "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" - "github.com/ethereum/go-ethereum/common" - "github.com/ethereum/go-ethereum/core/types" - "github.com/ethereum/go-ethereum/ethclient" - "github.com/stretchr/testify/require" -) - -// SendDepositTx creates and sends a deposit transaction. -// The L1 transaction, including sender, is configured by the l1Opts param. -// The L2 transaction options can be configured by modifying the DepositTxOps value supplied to applyL2Opts -// Will verify that the transaction is included with the expected status on L1 and L2 -// Returns the receipt of the L2 transaction -func SendDepositTx(t *testing.T, cfg SystemConfig, l1Client *ethclient.Client, l2Client *ethclient.Client, l1Opts *bind.TransactOpts, applyL2Opts DepositTxOptsFn) *types.Receipt { - l2Opts := defaultDepositTxOpts(l1Opts) - applyL2Opts(l2Opts) - - // Find deposit contract - depositContract, err := bindings.NewOptimismPortal(cfg.L1Deployments.OptimismPortalProxy, l1Client) - require.Nil(t, err) - - // Finally send TX - // Add 10% padding for the L1 gas limit because the estimation process can be affected by the 1559 style cost scale - // for buying L2 gas in the portal contracts. - tx, err := transactions.PadGasEstimate(l1Opts, 1.1, func(opts *bind.TransactOpts) (*types.Transaction, error) { - return depositContract.DepositTransaction(opts, l2Opts.ToAddr, l2Opts.Value, l2Opts.GasLimit, l2Opts.IsCreation, l2Opts.Data) - }) - require.Nil(t, err, "with deposit tx") - - // Wait for transaction on L1 - ctx, cancel := context.WithCancel(context.Background()) - defer cancel() - l1Receipt, err := wait.ForReceiptOK(ctx, l1Client, tx.Hash()) - require.Nil(t, err, "Waiting for deposit tx on L1") - - // Wait for transaction to be included on L2 - reconstructedDep, err := derive.UnmarshalDepositLogEvent(l1Receipt.Logs[0]) - require.NoError(t, err, "Could not reconstruct L2 Deposit") - tx = types.NewTx(reconstructedDep) - l2Receipt, err := wait.ForReceipt(ctx, l2Client, tx.Hash(), l2Opts.ExpectedStatus) - require.NoError(t, err, "Waiting for deposit tx on L2") - return l2Receipt -} - -type DepositTxOptsFn func(l2Opts *DepositTxOpts) - -type DepositTxOpts struct { - ToAddr common.Address - Value *big.Int - GasLimit uint64 - IsCreation bool - Data []byte - ExpectedStatus uint64 -} - -func defaultDepositTxOpts(opts *bind.TransactOpts) *DepositTxOpts { - return &DepositTxOpts{ - ToAddr: opts.From, - Value: opts.Value, - GasLimit: 1_000_000, - IsCreation: false, - Data: nil, - ExpectedStatus: types.ReceiptStatusSuccessful, - } -} - -// SendL2Tx creates and sends a transaction. -// The supplied privKey is used to specify the account to send from and the transaction is sent to the supplied l2Client -// Transaction options and expected status can be configured in the applyTxOpts function by modifying the supplied TxOpts -// Will verify that the transaction is included with the expected status on l2Client and any clients added to TxOpts.VerifyClients -func SendL2Tx(t *testing.T, cfg SystemConfig, l2Client *ethclient.Client, privKey *ecdsa.PrivateKey, applyTxOpts TxOptsFn) *types.Receipt { - opts := defaultTxOpts() - applyTxOpts(opts) - tx := types.MustSignNewTx(privKey, types.LatestSignerForChainID(cfg.L2ChainIDBig()), &types.DynamicFeeTx{ - ChainID: cfg.L2ChainIDBig(), - Nonce: opts.Nonce, // Already have deposit - To: opts.ToAddr, - Value: opts.Value, - GasTipCap: opts.GasTipCap, - GasFeeCap: opts.GasFeeCap, - Gas: opts.Gas, - Data: opts.Data, - }) - ctx, cancel := context.WithTimeout(context.Background(), 30*time.Second) - defer cancel() - err := l2Client.SendTransaction(ctx, tx) - require.NoError(t, err, "Sending L2 tx") - - receipt, err := wait.ForReceiptOK(ctx, l2Client, tx.Hash()) - require.NoError(t, err, "Waiting for L2 tx") - require.Equal(t, opts.ExpectedStatus, receipt.Status, "TX should have expected status") - - for i, client := range opts.VerifyClients { - t.Logf("Waiting for tx %v on verification client %d", tx.Hash(), i) - receiptVerif, err := wait.ForReceiptOK(ctx, client, tx.Hash()) - require.NoErrorf(t, err, "Waiting for L2 tx on verification client %d", i) - require.Equalf(t, receipt, receiptVerif, "Receipts should be the same on sequencer and verification client %d", i) - } - return receipt -} - -type TxOptsFn func(opts *TxOpts) - -type TxOpts struct { - ToAddr *common.Address - Nonce uint64 - Value *big.Int - Gas uint64 - GasTipCap *big.Int - GasFeeCap *big.Int - Data []byte - ExpectedStatus uint64 - VerifyClients []*ethclient.Client -} - -// VerifyOnClients adds additional l2 clients that should sync the block the tx is included in -// Checks that the receipt received from these clients is equal to the receipt received from the sequencer -func (o *TxOpts) VerifyOnClients(clients ...*ethclient.Client) { - o.VerifyClients = append(o.VerifyClients, clients...) -} - -func defaultTxOpts() *TxOpts { - return &TxOpts{ - ToAddr: nil, - Nonce: 0, - Value: common.Big0, - GasTipCap: big.NewInt(10), - GasFeeCap: big.NewInt(200), - Gas: 21_000, - Data: nil, - ExpectedStatus: types.ReceiptStatusSuccessful, - } -} diff --git a/op-e2e/withdrawal_helper.go b/op-e2e/withdrawal_helper.go deleted file mode 100644 index 88c096af307c..000000000000 --- a/op-e2e/withdrawal_helper.go +++ /dev/null @@ -1,243 +0,0 @@ -package op_e2e - -import ( - "context" - "crypto/ecdsa" - "math/big" - "testing" - "time" - - "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" - "github.com/ethereum/go-ethereum/ethclient" - "github.com/ethereum/go-ethereum/ethclient/gethclient" - "github.com/stretchr/testify/require" -) - -type ClientProvider interface { - NodeClient(name string) *ethclient.Client -} - -func SendWithdrawal(t *testing.T, cfg SystemConfig, l2Client *ethclient.Client, privKey *ecdsa.PrivateKey, applyOpts WithdrawalTxOptsFn) (*types.Transaction, *types.Receipt) { - opts := defaultWithdrawalTxOpts() - applyOpts(opts) - - // Bind L2 Withdrawer Contract - l2withdrawer, err := bindings.NewL2ToL1MessagePasser(predeploys.L2ToL1MessagePasserAddr, l2Client) - require.Nil(t, err, "binding withdrawer on L2") - - // Initiate Withdrawal - l2opts, err := bind.NewKeyedTransactorWithChainID(privKey, cfg.L2ChainIDBig()) - require.Nil(t, err) - l2opts.Value = opts.Value - tx, err := l2withdrawer.InitiateWithdrawal(l2opts, l2opts.From, big.NewInt(int64(opts.Gas)), opts.Data) - require.Nil(t, err, "sending initiate withdraw tx") - - receipt, err := geth.WaitForTransaction(tx.Hash(), l2Client, 10*time.Duration(cfg.DeployConfig.L1BlockTime)*time.Second) - require.Nil(t, err, "withdrawal initiated on L2 sequencer") - require.Equal(t, opts.ExpectedStatus, receipt.Status, "transaction had incorrect status") - - for i, client := range opts.VerifyClients { - t.Logf("Waiting for tx %v on verification client %d", tx.Hash(), i) - receiptVerif, err := geth.WaitForTransaction(tx.Hash(), client, 10*time.Duration(cfg.DeployConfig.L2BlockTime)*time.Second) - require.Nilf(t, err, "Waiting for L2 tx on verification client %d", i) - require.Equalf(t, receipt, receiptVerif, "Receipts should be the same on sequencer and verification client %d", i) - } - return tx, receipt -} - -type WithdrawalTxOptsFn func(opts *WithdrawalTxOpts) - -type WithdrawalTxOpts struct { - ToAddr *common.Address - Nonce uint64 - Value *big.Int - Gas uint64 - Data []byte - ExpectedStatus uint64 - VerifyClients []*ethclient.Client -} - -// VerifyOnClients adds additional l2 clients that should sync the block the tx is included in -// Checks that the receipt received from these clients is equal to the receipt received from the sequencer -func (o *WithdrawalTxOpts) VerifyOnClients(clients ...*ethclient.Client) { - o.VerifyClients = append(o.VerifyClients, clients...) -} - -func defaultWithdrawalTxOpts() *WithdrawalTxOpts { - return &WithdrawalTxOpts{ - ToAddr: nil, - Nonce: 0, - Value: common.Big0, - Gas: 21_000, - Data: nil, - ExpectedStatus: types.ReceiptStatusSuccessful, - } -} - -func ProveAndFinalizeWithdrawal(t *testing.T, cfg SystemConfig, clients ClientProvider, l2NodeName string, ethPrivKey *ecdsa.PrivateKey, l2WithdrawalReceipt *types.Receipt) (*types.Receipt, *types.Receipt, *types.Receipt, *types.Receipt) { - params, proveReceipt := ProveWithdrawal(t, cfg, clients, l2NodeName, ethPrivKey, l2WithdrawalReceipt) - finalizeReceipt, resolveClaimReceipt, resolveReceipt := FinalizeWithdrawal(t, cfg, clients.NodeClient("l1"), ethPrivKey, proveReceipt, params) - return proveReceipt, finalizeReceipt, resolveClaimReceipt, resolveReceipt -} - -func ProveWithdrawal(t *testing.T, cfg SystemConfig, clients ClientProvider, l2NodeName string, ethPrivKey *ecdsa.PrivateKey, l2WithdrawalReceipt *types.Receipt) (withdrawals.ProvenWithdrawalParameters, *types.Receipt) { - // Get l2BlockNumber for proof generation - ctx, cancel := context.WithTimeout(context.Background(), 40*time.Duration(cfg.DeployConfig.L1BlockTime)*time.Second) - defer cancel() - - l1Client := clients.NodeClient("l1") - var blockNumber uint64 - var err error - if e2eutils.UseFPAC() { - blockNumber, err = wait.ForGamePublished(ctx, l1Client, config.L1Deployments.OptimismPortalProxy, config.L1Deployments.DisputeGameFactoryProxy, l2WithdrawalReceipt.BlockNumber) - require.Nil(t, err) - } else { - blockNumber, err = wait.ForOutputRootPublished(ctx, l1Client, config.L1Deployments.L2OutputOracleProxy, l2WithdrawalReceipt.BlockNumber) - require.Nil(t, err) - } - - receiptCl := clients.NodeClient(l2NodeName) - blockCl := clients.NodeClient(l2NodeName) - proofCl := gethclient.New(receiptCl.Client()) - - ctx, cancel = context.WithTimeout(context.Background(), 30*time.Second) - defer cancel() - // Get the latest header - header, err := receiptCl.HeaderByNumber(ctx, new(big.Int).SetUint64(blockNumber)) - require.Nil(t, err) - - oracle, err := bindings.NewL2OutputOracleCaller(config.L1Deployments.L2OutputOracleProxy, l1Client) - require.Nil(t, err) - - factory, err := bindings.NewDisputeGameFactoryCaller(config.L1Deployments.DisputeGameFactoryProxy, l1Client) - require.Nil(t, err) - - portal2, err := bindingspreview.NewOptimismPortal2Caller(config.L1Deployments.OptimismPortalProxy, l1Client) - require.Nil(t, err) - - params, err := ProveWithdrawalParameters(context.Background(), proofCl, receiptCl, blockCl, l2WithdrawalReceipt.TxHash, header, oracle, factory, portal2) - require.Nil(t, err) - - portal, err := bindings.NewOptimismPortal(config.L1Deployments.OptimismPortalProxy, l1Client) - require.Nil(t, err) - - opts, err := bind.NewKeyedTransactorWithChainID(ethPrivKey, cfg.L1ChainIDBig()) - require.Nil(t, err) - - // Prove withdrawal - tx, err := portal.ProveWithdrawalTransaction( - opts, - bindings.TypesWithdrawalTransaction{ - Nonce: params.Nonce, - Sender: params.Sender, - Target: params.Target, - Value: params.Value, - GasLimit: params.GasLimit, - Data: params.Data, - }, - params.L2OutputIndex, - params.OutputRootProof, - params.WithdrawalProof, - ) - require.Nil(t, err) - - // Ensure that our withdrawal was proved successfully - proveReceipt, err := geth.WaitForTransaction(tx.Hash(), l1Client, 3*time.Duration(cfg.DeployConfig.L1BlockTime)*time.Second) - require.Nil(t, err, "prove withdrawal") - require.Equal(t, types.ReceiptStatusSuccessful, proveReceipt.Status) - return params, proveReceipt -} - -func ProveWithdrawalParameters(ctx context.Context, proofCl withdrawals.ProofClient, l2ReceiptCl withdrawals.ReceiptClient, l2BlockCl withdrawals.BlockClient, txHash common.Hash, header *types.Header, l2OutputOracleContract *bindings.L2OutputOracleCaller, disputeGameFactoryContract *bindings.DisputeGameFactoryCaller, optimismPortal2Contract *bindingspreview.OptimismPortal2Caller) (withdrawals.ProvenWithdrawalParameters, error) { - if e2eutils.UseFPAC() { - return withdrawals.ProveWithdrawalParametersFPAC(ctx, proofCl, l2ReceiptCl, l2BlockCl, txHash, disputeGameFactoryContract, optimismPortal2Contract) - } else { - return withdrawals.ProveWithdrawalParameters(ctx, proofCl, l2ReceiptCl, l2BlockCl, txHash, header, l2OutputOracleContract) - } -} - -func FinalizeWithdrawal(t *testing.T, cfg SystemConfig, l1Client *ethclient.Client, privKey *ecdsa.PrivateKey, withdrawalProofReceipt *types.Receipt, params withdrawals.ProvenWithdrawalParameters) (*types.Receipt, *types.Receipt, *types.Receipt) { - // Wait for finalization and then create the Finalized Withdrawal Transaction - ctx, cancel := context.WithTimeout(context.Background(), 30*time.Duration(cfg.DeployConfig.L1BlockTime)*time.Second) - defer cancel() - - wd := crossdomain.Withdrawal{ - Nonce: params.Nonce, - Sender: ¶ms.Sender, - Target: ¶ms.Target, - Value: params.Value, - GasLimit: params.GasLimit, - Data: params.Data, - } - - opts, err := bind.NewKeyedTransactorWithChainID(privKey, cfg.L1ChainIDBig()) - require.Nil(t, err) - - var resolveClaimReceipt *types.Receipt - var resolveReceipt *types.Receipt - if e2eutils.UseFPAC() { - portal2, err := bindingspreview.NewOptimismPortal2(config.L1Deployments.OptimismPortalProxy, l1Client) - require.Nil(t, err) - - wdHash, err := wd.Hash() - require.Nil(t, err) - - game, err := portal2.ProvenWithdrawals(&bind.CallOpts{}, wdHash, opts.From) - require.Nil(t, err) - require.NotNil(t, game, "withdrawal should be proven") - - proxy, err := legacybindings.NewFaultDisputeGame(game.DisputeGameProxy, l1Client) - require.Nil(t, err) - - expiry, err := proxy.MaxClockDuration(&bind.CallOpts{}) - require.Nil(t, err) - - time.Sleep(time.Duration(expiry) * time.Second) - resolveClaimTx, err := proxy.ResolveClaim(opts, common.Big0, common.Big0) - require.Nil(t, err) - - resolveClaimReceipt, err = wait.ForReceiptOK(ctx, l1Client, resolveClaimTx.Hash()) - require.Nil(t, err, "resolve claim") - require.Equal(t, types.ReceiptStatusSuccessful, resolveClaimReceipt.Status) - - resolveTx, err := proxy.Resolve(opts) - require.Nil(t, err) - - resolveReceipt, err = wait.ForReceiptOK(ctx, l1Client, resolveTx.Hash()) - require.Nil(t, err, "resolve") - require.Equal(t, types.ReceiptStatusSuccessful, resolveReceipt.Status) - } - - if e2eutils.UseFPAC() { - 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) - require.Nil(t, err) - } - - portal, err := bindings.NewOptimismPortal(config.L1Deployments.OptimismPortalProxy, l1Client) - require.Nil(t, err) - - // Finalize withdrawal - tx, err := portal.FinalizeWithdrawalTransaction(opts, wd.WithdrawalTransaction()) - require.Nil(t, err) - - // Ensure that our withdrawal was finalized successfully - finalizeReceipt, err := wait.ForReceiptOK(ctx, l1Client, tx.Hash()) - require.Nil(t, err, "finalize withdrawal") - require.Equal(t, types.ReceiptStatusSuccessful, finalizeReceipt.Status) - return finalizeReceipt, resolveClaimReceipt, resolveReceipt -} diff --git a/op-heartbeat/Makefile b/op-heartbeat/Makefile deleted file mode 100644 index 95d57b25c040..000000000000 --- a/op-heartbeat/Makefile +++ /dev/null @@ -1,22 +0,0 @@ -GITCOMMIT ?= $(shell git rev-parse HEAD) -GITDATE ?= $(shell git show -s --format='%ct') -VERSION ?= v0.0.0 - -LDFLAGSSTRING +=-X main.GitCommit=$(GITCOMMIT) -LDFLAGSSTRING +=-X main.GitDate=$(GITDATE) -LDFLAGSSTRING +=-X main.Version=$(VERSION) -LDFLAGS := -ldflags "$(LDFLAGSSTRING)" - -op-heartbeat: - env GO111MODULE=on go build -v $(LDFLAGS) -o ./bin/op-heartbeat ./cmd - -clean: - rm bin/op-heartbeat - -test: - go test -v ./... - -.PHONY: \ - clean \ - op-heartbeat \ - test diff --git a/op-heartbeat/cmd/main.go b/op-heartbeat/cmd/main.go deleted file mode 100644 index 2e324661e8f7..000000000000 --- a/op-heartbeat/cmd/main.go +++ /dev/null @@ -1,34 +0,0 @@ -package main - -import ( - "os" - - heartbeat "github.com/ethereum-optimism/optimism/op-heartbeat" - "github.com/ethereum-optimism/optimism/op-heartbeat/flags" - 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" -) - -var ( - Version = "" - GitCommit = "" - GitDate = "" -) - -func main() { - oplog.SetupDefaults() - - app := cli.NewApp() - app.Flags = flags.Flags - app.Version = opservice.FormatVersion(Version, GitCommit, GitDate, "") - app.Name = "op-heartbeat" - app.Usage = "Heartbeat recorder" - app.Description = "Service that records opt-in heartbeats from op nodes" - app.Action = heartbeat.Main(app.Version) - err := app.Run(os.Args) - if err != nil { - log.Crit("Application failed", "message", err) - } -} diff --git a/op-heartbeat/config.go b/op-heartbeat/config.go deleted file mode 100644 index 6f78f4265fb9..000000000000 --- a/op-heartbeat/config.go +++ /dev/null @@ -1,48 +0,0 @@ -package op_heartbeat - -import ( - "errors" - - "github.com/ethereum-optimism/optimism/op-heartbeat/flags" - 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/urfave/cli/v2" -) - -type Config struct { - HTTPAddr string - HTTPPort int - - Log oplog.CLIConfig - - Metrics opmetrics.CLIConfig - - Pprof oppprof.CLIConfig -} - -func (c Config) Check() error { - if c.HTTPAddr == "" { - return errors.New("must specify a valid HTTP address") - } - if c.HTTPPort <= 0 { - return errors.New("must specify a valid HTTP port") - } - if err := c.Metrics.Check(); err != nil { - return err - } - if err := c.Pprof.Check(); err != nil { - return err - } - return nil -} - -func NewConfig(ctx *cli.Context) Config { - return Config{ - HTTPAddr: ctx.String(flags.HTTPAddrFlag.Name), - HTTPPort: ctx.Int(flags.HTTPPortFlag.Name), - Log: oplog.ReadCLIConfig(ctx), - Metrics: opmetrics.ReadCLIConfig(ctx), - Pprof: oppprof.ReadCLIConfig(ctx), - } -} diff --git a/op-heartbeat/flags/flags.go b/op-heartbeat/flags/flags.go deleted file mode 100644 index a5bd8123d687..000000000000 --- a/op-heartbeat/flags/flags.go +++ /dev/null @@ -1,46 +0,0 @@ -package flags - -import ( - 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" -) - -const envPrefix = "OP_HEARTBEAT" - -func prefixEnvVars(name string) []string { - return opservice.PrefixEnvVar(envPrefix, name) -} - -const ( - HTTPAddrFlagName = "http.addr" - HTTPPortFlagName = "http.port" -) - -var ( - HTTPAddrFlag = &cli.StringFlag{ - Name: HTTPAddrFlagName, - Usage: "Address the server should listen on", - Value: "0.0.0.0", - EnvVars: prefixEnvVars("HTTP_ADDR"), - } - HTTPPortFlag = &cli.IntFlag{ - Name: HTTPPortFlagName, - Usage: "Port the server should listen on", - Value: 8080, - EnvVars: prefixEnvVars("HTTP_PORT"), - } -) - -var Flags []cli.Flag - -func init() { - Flags = []cli.Flag{ - HTTPAddrFlag, - HTTPPortFlag, - } - - Flags = append(Flags, oplog.CLIFlags(envPrefix)...) - Flags = append(Flags, opmetrics.CLIFlags(envPrefix)...) -} diff --git a/op-heartbeat/metrics.go b/op-heartbeat/metrics.go deleted file mode 100644 index c45703d3a27e..000000000000 --- a/op-heartbeat/metrics.go +++ /dev/null @@ -1,118 +0,0 @@ -package op_heartbeat - -import ( - "fmt" - "strconv" - "sync/atomic" - "time" - - lru "github.com/hashicorp/golang-lru/v2" - "github.com/prometheus/client_golang/prometheus" - "github.com/prometheus/client_golang/prometheus/promauto" - - "github.com/ethereum-optimism/optimism/op-node/heartbeat" -) - -const ( - MetricsNamespace = "op_heartbeat" - MinHeartbeatInterval = 10*time.Minute - 10*time.Second - UsersCacheSize = 10_000 -) - -type Metrics interface { - RecordHeartbeat(payload heartbeat.Payload, ip string) - RecordVersion(version string) -} - -type metrics struct { - heartbeats *prometheus.CounterVec - version *prometheus.GaugeVec - sameIP *prometheus.HistogramVec - - // Groups heartbeats per unique IP, version and chain ID combination. - // string(IP ++ version ++ chainID) -> *heartbeatEntry - heartbeatUsers *lru.Cache[string, *heartbeatEntry] -} - -type heartbeatEntry struct { - // Count number of heartbeats per interval, atomically updated - Count uint64 - // Changes once per heartbeat interval - Time time.Time -} - -func NewMetrics(r *prometheus.Registry) Metrics { - lruCache, _ := lru.New[string, *heartbeatEntry](UsersCacheSize) - m := &metrics{ - heartbeats: promauto.With(r).NewCounterVec(prometheus.CounterOpts{ - Namespace: MetricsNamespace, - Name: "heartbeats", - Help: "Counts number of heartbeats by chain ID, version and filtered to unique IPs", - }, []string{ - "chain_id", - "version", - }), - version: promauto.With(r).NewGaugeVec(prometheus.GaugeOpts{ - Namespace: MetricsNamespace, - Name: "version", - Help: "version pseudo-metrics", - }, []string{ - "version", - }), - sameIP: promauto.With(r).NewHistogramVec(prometheus.HistogramOpts{ - Namespace: MetricsNamespace, - Name: "heartbeat_same_ip", - Buckets: []float64{1, 2, 4, 8, 16, 32, 64, 128}, - Help: "Histogram of events within same heartbeat interval per unique IP, by chain ID and version", - }, []string{ - "chain_id", - "version", - }), - heartbeatUsers: lruCache, - } - return m -} - -func (m *metrics) RecordHeartbeat(payload heartbeat.Payload, ip string) { - var chainID string - if AllowedChainIDs[payload.ChainID] { - chainID = strconv.FormatUint(payload.ChainID, 10) - } else { - chainID = "unknown" - } - var version string - if AllowedVersions[payload.Version] { - version = payload.Version - } else { - version = "unknown" - } - - key := fmt.Sprintf("%s;%s;%s", ip, version, chainID) - now := time.Now() - entry, ok, _ := m.heartbeatUsers.PeekOrAdd(key, &heartbeatEntry{Time: now, Count: 1}) - if !ok { - // if it's a new entry, observe it and exit. - m.sameIP.WithLabelValues(chainID, version).Observe(1) - m.heartbeats.WithLabelValues(chainID, version).Inc() - return - } - - if now.Sub(entry.Time) < MinHeartbeatInterval { - // if the span is still going, then add it up - atomic.AddUint64(&entry.Count, 1) - } else { - // if the span ended, then meter it, and reset it - m.sameIP.WithLabelValues(chainID, version).Observe(float64(atomic.LoadUint64(&entry.Count))) - entry.Time = now - atomic.StoreUint64(&entry.Count, 1) - - m.heartbeats.WithLabelValues(chainID, version).Inc() - } - - // always add, to keep LRU accurate - m.heartbeatUsers.Add(key, entry) -} - -func (m *metrics) RecordVersion(version string) { - m.version.WithLabelValues(version).Set(1) -} diff --git a/op-heartbeat/service.go b/op-heartbeat/service.go deleted file mode 100644 index 55305fde591a..000000000000 --- a/op-heartbeat/service.go +++ /dev/null @@ -1,175 +0,0 @@ -package op_heartbeat - -import ( - "context" - "encoding/json" - "errors" - "fmt" - "io" - "net" - "net/http" - "os" - "os/signal" - "strconv" - "strings" - "syscall" - "time" - - "github.com/urfave/cli/v2" - - "github.com/ethereum/go-ethereum/log" - - "github.com/ethereum-optimism/optimism/op-node/heartbeat" - "github.com/ethereum-optimism/optimism/op-service/httputil" - 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" -) - -const ( - HTTPMaxHeaderSize = 10 * 1024 - HTTPMaxBodySize = 1024 * 1024 -) - -func Main(version string) func(ctx *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.Log) - oplog.SetGlobalLogHandler(l.Handler()) - l.Info("starting heartbeat monitor", "version", version) - - srv, err := Start(cliCtx.Context, l, cfg, version) - if err != nil { - l.Crit("error starting application", "err", err) - } - - doneCh := make(chan os.Signal, 1) - signal.Notify(doneCh, []os.Signal{ - os.Interrupt, - os.Kill, - syscall.SIGTERM, - syscall.SIGQUIT, - }...) - <-doneCh - return srv.Stop(context.Background()) - } -} - -type HeartbeatService struct { - metrics, http *httputil.HTTPServer - pprofService *oppprof.Service -} - -func (hs *HeartbeatService) Stop(ctx context.Context) error { - var result error - if hs.pprofService != nil { - result = errors.Join(result, hs.pprofService.Stop(ctx)) - } - if hs.metrics != nil { - result = errors.Join(result, hs.metrics.Stop(ctx)) - } - if hs.http != nil { - result = errors.Join(result, hs.http.Stop(ctx)) - } - return result -} - -func Start(ctx context.Context, l log.Logger, cfg Config, version string) (*HeartbeatService, error) { - hs := &HeartbeatService{} - - registry := opmetrics.NewRegistry() - metricsCfg := cfg.Metrics - if metricsCfg.Enabled { - l.Debug("starting metrics server", "addr", metricsCfg.ListenAddr, "port", metricsCfg.ListenPort) - metricsSrv, err := opmetrics.StartServer(registry, metricsCfg.ListenAddr, metricsCfg.ListenPort) - if err != nil { - return nil, errors.Join(fmt.Errorf("failed to start metrics server: %w", err), hs.Stop(ctx)) - } - hs.metrics = metricsSrv - l.Info("started metrics server", "addr", metricsSrv.Addr()) - } - - pprofCfg := cfg.Pprof - hs.pprofService = oppprof.New( - pprofCfg.ListenEnabled, - pprofCfg.ListenAddr, - pprofCfg.ListenPort, - pprofCfg.ProfileType, - pprofCfg.ProfileDir, - pprofCfg.ProfileFilename, - ) - - if err := hs.pprofService.Start(); err != nil { - return nil, fmt.Errorf("failed to start pprof service: %w", err) - } - - metrics := NewMetrics(registry) - metrics.RecordVersion(version) - mux := http.NewServeMux() - mux.HandleFunc("/healthz", HealthzHandler) - mux.Handle("/", Handler(l, metrics)) - recorder := opmetrics.NewPromHTTPRecorder(registry, MetricsNamespace) - mw := opmetrics.NewHTTPRecordingMiddleware(recorder, mux) - - srv, err := httputil.StartHTTPServer( - net.JoinHostPort(cfg.HTTPAddr, strconv.Itoa(cfg.HTTPPort)), - mw, - httputil.WithTimeouts(httputil.HTTPTimeouts{ - ReadTimeout: 30 * time.Second, - ReadHeaderTimeout: 30 * time.Second, - WriteTimeout: 30 * time.Second, - IdleTimeout: time.Minute, - }), - httputil.WithMaxHeaderBytes(HTTPMaxHeaderSize)) - if err != nil { - return nil, errors.Join(fmt.Errorf("failed to start HTTP server: %w", err), hs.Stop(ctx)) - } - hs.http = srv - - return hs, nil -} - -func Handler(l log.Logger, metrics Metrics) http.HandlerFunc { - return func(w http.ResponseWriter, r *http.Request) { - ipStr := r.Header.Get("X-Forwarded-For") - // XFF can be a comma-separated list. Left-most is the original client. - if i := strings.Index(ipStr, ","); i >= 0 { - ipStr = ipStr[:i] - } - - innerL := l.New( - "ip", ipStr, - "user_agent", r.Header.Get("User-Agent"), - "remote_addr", r.RemoteAddr, - ) - - var payload heartbeat.Payload - dec := json.NewDecoder(io.LimitReader(r.Body, int64(HTTPMaxBodySize))) - if err := dec.Decode(&payload); err != nil { - innerL.Info("error decoding request payload", "err", err) - w.WriteHeader(400) - return - } - - innerL.Info( - "got heartbeat", - "version", payload.Version, - "meta", payload.Meta, - "moniker", payload.Moniker, - "peer_id", payload.PeerID, - "chain_id", payload.ChainID, - ) - - metrics.RecordHeartbeat(payload, ipStr) - - w.WriteHeader(204) - } -} - -func HealthzHandler(w http.ResponseWriter, r *http.Request) { - w.WriteHeader(204) -} diff --git a/op-heartbeat/service_test.go b/op-heartbeat/service_test.go deleted file mode 100644 index 3bc4279e9f83..000000000000 --- a/op-heartbeat/service_test.go +++ /dev/null @@ -1,139 +0,0 @@ -package op_heartbeat - -import ( - "bytes" - "context" - "encoding/json" - "fmt" - "io" - "net" - "net/http" - "testing" - - "github.com/ethereum/go-ethereum/log" - "github.com/stretchr/testify/require" - - "github.com/ethereum-optimism/optimism/op-node/heartbeat" - opmetrics "github.com/ethereum-optimism/optimism/op-service/metrics" -) - -func TestService(t *testing.T) { - httpPort := freePort(t) - metricsPort := freePort(t) - cfg := Config{ - HTTPAddr: "127.0.0.1", - HTTPPort: httpPort, - Metrics: opmetrics.CLIConfig{ - Enabled: true, - ListenAddr: "127.0.0.1", - ListenPort: metricsPort, - }, - } - - ctx, cancel := context.WithCancel(context.Background()) - srv, err := Start(ctx, log.New(), cfg, "foobar") - // Make sure that the service properly starts - require.NoError(t, err) - - defer cancel() - defer func() { - require.NoError(t, srv.Stop(ctx), "close heartbeat server") - }() - - tests := []struct { - name string - hbs []heartbeat.Payload - metric string - ip string - }{ - { - "no whitelisted version", - []heartbeat.Payload{{ - Version: "not_whitelisted", - Meta: "whatever", - Moniker: "whatever", - PeerID: "1X2398ug", - ChainID: 10, - }}, - `op_heartbeat_heartbeats{chain_id="10",version="unknown"} 1`, - "1.2.3.100", - }, - { - "no whitelisted chain", - []heartbeat.Payload{{ - Version: "v0.1.0-beta.1", - Meta: "whatever", - Moniker: "whatever", - PeerID: "1X2398ug", - ChainID: 999, - }}, - `op_heartbeat_heartbeats{chain_id="unknown",version="v0.1.0-beta.1"} 1`, - "1.2.3.101", - }, - { - "both whitelisted", - []heartbeat.Payload{{ - Version: "v0.1.0-beta.1", - Meta: "whatever", - Moniker: "whatever", - PeerID: "1X2398ug", - ChainID: 10, - }}, - `op_heartbeat_heartbeats{chain_id="10",version="v0.1.0-beta.1"} 1`, - "1.2.3.102", - }, - { - "spamming", - []heartbeat.Payload{ - { - Version: "v0.1.0-goerli-rehearsal.1", - Meta: "whatever", - Moniker: "alice", - PeerID: "1X2398ug", - ChainID: 10, - }, - { - Version: "v0.1.0-goerli-rehearsal.1", - Meta: "whatever", - Moniker: "bob", - PeerID: "1X2398ug", - ChainID: 10, - }, - }, - `op_heartbeat_heartbeat_same_ip_bucket{chain_id="10",version="v0.1.0-goerli-rehearsal.1",le="32"} 1`, - "1.2.3.103", - }, - } - for _, tt := range tests { - t.Run(tt.name, func(t *testing.T) { - for _, hb := range tt.hbs { - data, err := json.Marshal(hb) - require.NoError(t, err) - req, err := http.NewRequestWithContext(ctx, "POST", fmt.Sprintf("http://127.0.0.1:%d", httpPort), bytes.NewReader(data)) - require.NoError(t, err) - req.Header.Set("X-Forwarded-For", tt.ip) - res, err := http.DefaultClient.Do(req) - require.NoError(t, err) - res.Body.Close() - require.Equal(t, res.StatusCode, 204) - } - - metricsRes, err := http.Get(fmt.Sprintf("http://127.0.0.1:%d", metricsPort)) - require.NoError(t, err) - defer metricsRes.Body.Close() - require.NoError(t, err) - metricsBody, err := io.ReadAll(metricsRes.Body) - require.NoError(t, err) - require.Contains(t, string(metricsBody), tt.metric) - }) - } -} - -func freePort(t *testing.T) int { - addr, err := net.ResolveTCPAddr("tcp", "localhost:0") - require.NoError(t, err) - l, err := net.ListenTCP("tcp", addr) - require.NoError(t, err) - defer l.Close() - return l.Addr().(*net.TCPAddr).Port -} diff --git a/op-heartbeat/whitelists.go b/op-heartbeat/whitelists.go deleted file mode 100644 index 17605c7f688f..000000000000 --- a/op-heartbeat/whitelists.go +++ /dev/null @@ -1,20 +0,0 @@ -package op_heartbeat - -var AllowedChainIDs = map[uint64]bool{ - 420: true, - 902: true, - 10: true, -} - -var AllowedVersions = map[string]bool{ - "": true, - "v0.1.0-beta.1": true, - "v0.1.0-goerli-rehearsal.1": true, - "v0.10.9": true, - "v0.10.10": true, - "v0.10.11": true, - "v0.10.12": true, - "v0.10.13": true, - "v0.10.14": true, - "v0.11.0": true, -} diff --git a/op-node/Makefile b/op-node/Makefile index 509fc261d2f7..75b152b2d53e 100644 --- a/op-node/Makefile +++ b/op-node/Makefile @@ -26,7 +26,7 @@ ifeq ($(shell uname),Darwin) endif op-node: - env GO111MODULE=on GOOS=$(TARGETOS) GOARCH=$(TARGETARCH) go build -v $(LDFLAGS) -o ./bin/op-node ./cmd/main.go + env GO111MODULE=on GOOS=$(TARGETOS) GOARCH=$(TARGETARCH) CGO_ENABLED=0 go build -v $(LDFLAGS) -o ./bin/op-node ./cmd/main.go clean: rm bin/op-node @@ -52,8 +52,12 @@ fuzz: generate-mocks: go generate ./... +readme: + doctoc README.md + .PHONY: \ op-node \ clean \ test \ - fuzz + fuzz \ + readme diff --git a/op-node/README.md b/op-node/README.md index fa190535a452..cfc3793052f1 100644 --- a/op-node/README.md +++ b/op-node/README.md @@ -1,85 +1,105 @@ + + +**Table of Contents** *generated with [DocToc](https://github.com/thlorenz/doctoc)* + +- [op-node](#op-node) + - [Compiling](#compiling) + - [Testing](#testing) + - [Running](#running) + - [L2 Genesis Generation](#l2-genesis-generation) + - [L1 Devnet Genesis Generation](#l1-devnet-genesis-generation) + + + # op-node This is the reference implementation of the [rollup-node spec](https://github.com/ethereum-optimism/specs/blob/main/specs/protocol/rollup-node.md). +It can be thought of like the consensus layer client of an OP Stack chain where it must run with an OP Stack execution layer client +like [op-geth](https://github.com/ethereum-optimism/op-geth). ## Compiling Compile a binary: + ```shell -cd op-node -go build -o bin/op-node ./cmd +make op-node ``` ## Testing Run op-node unit tests: -```shell -cd op-node -go test ./... -``` -Run end-to-end tests: ```shell -cd op-e2e -go test ./... +make test ``` ## Running -Options can be reviewed with: +Configuration options can be reviewed with: ```shell ./bin/op-node --help ``` +[eth-json-rpc-spec]: https://ethereum.github.io/execution-apis/api-documentation + To start syncing the rollup: -Connect to at least one L1 RPC and L2 execution engine: +Connect to one L1 Execution Client that supports the [Ethereum JSON-RPC spec][eth-json-rpc-spec], +an L1 Consensus Client that supports the [Beacon Node API](https://ethereum.github.io/beacon-APIs) and +an OP Stack based Execution Client that supports the [Ethereum JSON-RPC spec][eth-json-rpc-spec]: -- L1: use any L1 node / RPC (websocket connection path may differ) -- L2: run the Optimism fork of geth: [`op-geth`](https://github.com/ethereum-optimism/op-geth) +- L1: use any L1 client, RPC, websocket, or IPC (connection config may differ) +- L2: use any OP Stack Execution Client like [`op-geth`](https://github.com/ethereum-optimism/op-geth) + +Note that websockets or IPC is preferred for event notifications to improve sync, http RPC works with adaptive polling. ```shell -# websockets or IPC preferred for event notifications to improve sync, http RPC works with adaptive polling. -op \ - --l1=ws://localhost:8546 --l2=ws//localhost:9001 \ +./bin/op-node \ + --l1=ws://localhost:8546 \ + --l1.beacon=http://localhost:4000 \ + --l2=ws://localhost:9001 \ --rollup.config=./path-to-network-config/rollup.json \ --rpc.addr=127.0.0.1 \ --rpc.port=7000 ``` -## Devnet Genesis Generation +## L2 Genesis Generation The `op-node` can generate geth compatible `genesis.json` files. These files can be used with `geth init` to initialize the `StateDB` with accounts, storage, code and balances. The L2 state must be initialized with predeploy contracts that exist in the state and act as system level contracts. The `op-node` can generate a genesis file with these predeploys configured correctly given -hardhat compilation artifacts, hardhat deployment artifacts, a L1 RPC URL -and a deployment config. +an L1 RPC URL, a deploy config, L2 genesis allocs and a L1 deployments artifact. + +The deploy config contains all of the config required to deploy the +system. Examples can be found in `packages/contracts-bedrock/deploy-config`. Each +deploy config file is a JSON file. The L2 allocs can be generated using a forge script +in the `contracts-bedrock` package and the L1 deployments are a JSON file that is the +output of doing a L1 contracts deployment. -The hardhat compilation artifacts are produced by `hardhat compile`. The native -hardhat compiler toolchain produces them by default and the -`@foundry-rs/hardhat` plugin can also produce them when using the foundry -compiler toolchain. They can usually be found in an `artifacts` directory. +Example usage: -The hardhat deployment artifacts are produced by running `hardhat deploy`. These -exist to make it easy to track deployments of smart contract systems over time. -They can usually be found in a `deployments` directory. +```bash +$ ./bin/op-node genesis l2 \ + --l1-rpc $ETH_RPC_URL \ + --deploy-config \ + --l2-allocs \ + --l1-deployments \ + --outfile.l2 \ + --outfile.rollup +``` -The deployment config contains all of the information required to deploy the -system. It can be found in `packages/contracts-bedrock/deploy-config`. Each -deploy config file can be JSON or TypeScript, although only JSON files are -supported by the `op-node`. The network name must match the name of the file -in the deploy config directory. +## L1 Devnet Genesis Generation -Example usage: +It is also possible to generate a devnet L1 `genesis.json` file. The L1 allocs can +be generated with the foundry L1 contracts deployment script if the extra parameter +`--sig 'runWithStateDump()` is added to the deployment command. ```bash -$ op-node genesis devnet-l2 \ - --artifacts $CONTRACTS_BEDROCK/artifacts \ - --network $NETWORK \ - --deployments $CONTRACTS_BEDROCK/deployments \ +$ ./bin/op-node genesis l1 \ --deploy-config $CONTRACTS_BEDROCK/deploy-config \ - --rpc-url http://localhost:8545 \ + --l1-deployments \ + --l1-allocs ``` diff --git a/op-node/benchmarks/batchbuilding_test.go b/op-node/benchmarks/batchbuilding_test.go index fc760deba271..57a5382d749b 100644 --- a/op-node/benchmarks/batchbuilding_test.go +++ b/op-node/benchmarks/batchbuilding_test.go @@ -8,6 +8,7 @@ import ( "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" "github.com/stretchr/testify/require" ) @@ -19,52 +20,83 @@ const ( 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, - }) +// compressorDetails is a helper struct to create compressors or supply the configuration for span batches +type compressorDetails struct { + name string + compressorFn func(compressor.Config) (derive.Compressor, error) + config compressor.Config +} - // 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}, - } +func (cd compressorDetails) String() string { + return fmt.Sprintf("%s-%s-%d", cd.name, cd.config.CompressionAlgo, cd.config.TargetOutputSize) +} +func (cd compressorDetails) Compressor() (derive.Compressor, error) { + return cd.compressorFn(cd.config) +} + +var ( // 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 -} + compAlgos = []derive.CompressionAlgo{ + derive.Zlib, + derive.Brotli, + derive.Brotli9, + derive.Brotli11, + } + + // compressors used in the benchmark + // they are all configured to Zlib compression, which may be overridden in the test cases + compressors = map[string]compressorDetails{ + "NonCompressor": { + name: "NonCompressor", + compressorFn: compressor.NewNonCompressor, + config: compressor.Config{ + TargetOutputSize: targetOutput_huge, + CompressionAlgo: derive.Zlib, + }, + }, + "RatioCompressor": { + name: "RatioCompressor", + compressorFn: compressor.NewRatioCompressor, + config: compressor.Config{ + TargetOutputSize: targetOutput_huge, + CompressionAlgo: derive.Zlib, + }, + }, + "ShadowCompressor": { + name: "ShadowCompressor", + compressorFn: compressor.NewShadowCompressor, + config: compressor.Config{ + TargetOutputSize: targetOutput_huge, + CompressionAlgo: derive.Zlib, + }, + }, + "RealShadowCompressor": { + name: "ShadowCompressor", + compressorFn: compressor.NewShadowCompressor, + config: compressor.Config{ + TargetOutputSize: targetOuput_real, + CompressionAlgo: derive.Zlib, + }, + }, + } +) // 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) +func channelOutByType(b *testing.B, batchType uint, cd compressorDetails) (derive.ChannelOut, error) { + rollupConfig := &rollup.Config{ + L2ChainID: big.NewInt(333), + } if batchType == derive.SingularBatchType { - return derive.NewSingularChannelOut(compressors[compKey].compressor) + compressor, err := cd.Compressor() + require.NoError(b, err) + return derive.NewSingularChannelOut(compressor, rollup.NewChainSpec(rollupConfig)) } if batchType == derive.SpanBatchType { - return derive.NewSpanChannelOut(0, chainID, compressors[compKey].targetOutput, algo) + return derive.NewSpanChannelOut(cd.config.TargetOutputSize, cd.config.CompressionAlgo, rollup.NewChainSpec(rollupConfig)) } return nil, fmt.Errorf("unsupported batch type: %d", batchType) } @@ -75,7 +107,7 @@ type BatchingBenchmarkTC struct { BatchType uint BatchCount int txPerBatch int - compKey string + cd compressorDetails } func (t BatchingBenchmarkTC) String() string { @@ -86,7 +118,7 @@ func (t BatchingBenchmarkTC) String() string { 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) + return fmt.Sprintf("BatchType=%s, txPerBatch=%d, BatchCount=%d, Compressor=%s", btype, t.txPerBatch, t.BatchCount, t.cd.String()) } // BenchmarkChannelOut benchmarks the performance of adding singular batches to a channel out @@ -97,6 +129,7 @@ func (t BatchingBenchmarkTC) String() string { // 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 + // they will be multiplied by various compressors type target struct{ bs, tpb int } targets := []target{ {10, 1}, @@ -107,12 +140,16 @@ func BenchmarkFinalBatchChannelOut(b *testing.B) { {100, 100}, } - // build a set of test cases for each batch type, compressor, and target-pair + // make test-cases for every batch type, compressor, compressorAlgo, 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 _, compDetails := range compressors { + for _, algo := range compAlgos { + for _, t := range targets { + cd := compDetails + cd.config.CompressionAlgo = algo + tests = append(tests, BatchingBenchmarkTC{bt, t.bs, t.tpb, cd}) + } } } } @@ -129,27 +166,24 @@ func BenchmarkFinalBatchChannelOut(b *testing.B) { // 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) + b.Run(tc.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() + cout, _ := channelOutByType(b, tc.BatchType, tc.cd) + // 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) + } + }) } } @@ -165,40 +199,50 @@ func BenchmarkIncremental(b *testing.B) { // 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"}, + {derive.SpanBatchType, 5, 1, compressorDetails{ + name: "RealThreshold", + config: compressor.Config{ + TargetOutputSize: targetOuput_real, + CompressionAlgo: derive.Zlib, + }, + }}, + {derive.SpanBatchType, 5, 1, compressorDetails{ + name: "RealThreshold", + config: compressor.Config{ + TargetOutputSize: targetOuput_real, + CompressionAlgo: derive.Brotli10, + }, + }}, } - 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 - } + for _, tc := range tcs { + cout, err := channelOutByType(b, tc.BatchType, tc.cd) + if err != nil { + b.Fatal(err) + } + done := false + for base := 0; !done; base += tc.BatchCount { + rangeName := fmt.Sprintf("Incremental %s: %d-%d", tc.String(), base, base+tc.BatchCount) + b.Run(rangeName, 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 } - }) - } + } + }) } } } @@ -224,42 +268,43 @@ func BenchmarkAllBatchesChannelOut(b *testing.B) { // 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 _, compDetails := range compressors { + for _, algo := range compAlgos { + for _, t := range targets { + cd := compDetails + cd.config.CompressionAlgo = algo + tests = append(tests, BatchingBenchmarkTC{bt, t.bs, t.tpb, cd}) + } } } } - 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) - } - } - }) + 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(), 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() + cout, _ := channelOutByType(b, tc.BatchType, tc.cd) + 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) + } + } + }) } } @@ -282,7 +327,7 @@ func BenchmarkGetRawSpanBatch(b *testing.B) { tests := []BatchingBenchmarkTC{} for _, t := range targets { - tests = append(tests, BatchingBenchmarkTC{derive.SpanBatchType, t.bs, t.tpb, "NonCompressor"}) + tests = append(tests, BatchingBenchmarkTC{derive.SpanBatchType, t.bs, t.tpb, compressors["NonCompressor"]}) } for _, tc := range tests { diff --git a/op-node/chaincfg/chains_test.go b/op-node/chaincfg/chains_test.go index 0b7355156c04..15f062c92607 100644 --- a/op-node/chaincfg/chains_test.go +++ b/op-node/chaincfg/chains_test.go @@ -55,7 +55,7 @@ var mainnetCfg = rollup.Config{ BlockTime: 2, MaxSequencerDrift: 600, SeqWindowSize: 3600, - ChannelTimeout: 300, + ChannelTimeoutBedrock: 300, L1ChainID: big.NewInt(1), L2ChainID: big.NewInt(10), BatchInboxAddress: common.HexToAddress("0xff00000000000000000000000000000000000010"), @@ -65,6 +65,8 @@ var mainnetCfg = rollup.Config{ CanyonTime: u64Ptr(1704992401), DeltaTime: u64Ptr(1708560000), EcotoneTime: u64Ptr(1710374401), + FjordTime: u64Ptr(1720627201), + GraniteTime: u64Ptr(1726070401), ProtocolVersionsAddress: common.HexToAddress("0x8062AbC286f5e7D9428a0Ccb9AbD71e50d93b935"), } @@ -89,7 +91,7 @@ var sepoliaCfg = rollup.Config{ BlockTime: 2, MaxSequencerDrift: 600, SeqWindowSize: 3600, - ChannelTimeout: 300, + ChannelTimeoutBedrock: 300, L1ChainID: big.NewInt(11155111), L2ChainID: big.NewInt(11155420), BatchInboxAddress: common.HexToAddress("0xff00000000000000000000000000000011155420"), @@ -100,6 +102,7 @@ var sepoliaCfg = rollup.Config{ DeltaTime: u64Ptr(1703203200), EcotoneTime: u64Ptr(1708534800), FjordTime: u64Ptr(1716998400), + GraniteTime: u64Ptr(1723478400), ProtocolVersionsAddress: common.HexToAddress("0x79ADD5713B383DAa0a138d3C4780C7A1804a8090"), } @@ -124,7 +127,7 @@ var sepoliaDev0Cfg = rollup.Config{ BlockTime: 2, MaxSequencerDrift: 600, SeqWindowSize: 3600, - ChannelTimeout: 300, + ChannelTimeoutBedrock: 300, L1ChainID: big.NewInt(11155111), L2ChainID: big.NewInt(11155421), BatchInboxAddress: common.HexToAddress("0xff00000000000000000000000000000011155421"), @@ -135,6 +138,7 @@ var sepoliaDev0Cfg = rollup.Config{ DeltaTime: u64Ptr(0), EcotoneTime: u64Ptr(1706634000), FjordTime: u64Ptr(1715961600), + GraniteTime: u64Ptr(1723046400), ProtocolVersionsAddress: common.HexToAddress("0x252CbE9517F731C618961D890D534183822dcC8d"), } diff --git a/op-node/cmd/batch_decoder/reassemble/reassemble.go b/op-node/cmd/batch_decoder/reassemble/reassemble.go index dc95262659fe..d8fc136b5043 100644 --- a/op-node/cmd/batch_decoder/reassemble/reassemble.go +++ b/op-node/cmd/batch_decoder/reassemble/reassemble.go @@ -25,7 +25,7 @@ type ChannelWithMetadata struct { Frames []FrameWithMetadata `json:"frames"` Batches []derive.Batch `json:"batches"` BatchTypes []int `json:"batch_types"` - ComprAlgos []derive.CompressionAlgo `json:"compr_alogs"` + ComprAlgos []derive.CompressionAlgo `json:"compr_algos"` } type FrameWithMetadata struct { @@ -72,7 +72,7 @@ func Channels(config Config, rollupCfg *rollup.Config) { framesByChannel[frame.Frame.ID] = append(framesByChannel[frame.Frame.ID], frame) } for id, frames := range framesByChannel { - ch := processFrames(config, rollupCfg, 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) @@ -90,7 +90,9 @@ func writeChannel(ch ChannelWithMetadata, filename string) error { return enc.Encode(ch) } -func processFrames(cfg Config, rollupCfg *rollup.Config, id derive.ChannelID, frames []FrameWithMetadata) ChannelWithMetadata { +// ProcessFrames processes the frames for a given channel and reads batches and other relevant metadata +// from the channel. Returns a ChannelWithMetadata struct containing all the relevant data. +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 @@ -101,7 +103,7 @@ func processFrames(cfg Config, rollupCfg *rollup.Config, id derive.ChannelID, fr invalidFrame = true break } - if err := ch.AddFrame(frame.Frame, eth.L1BlockRef{Number: frame.InclusionBlock}); err != nil { + if err := ch.AddFrame(frame.Frame, eth.L1BlockRef{Number: frame.InclusionBlock, Time: frame.Timestamp}); err != nil { fmt.Printf("Error adding to channel %v. Err: %v\n", id.String(), err) invalidFrame = true } diff --git a/op-node/cmd/genesis/cmd.go b/op-node/cmd/genesis/cmd.go index 6d3d687444a2..054f29310619 100644 --- a/op-node/cmd/genesis/cmd.go +++ b/op-node/cmd/genesis/cmd.go @@ -1,33 +1,28 @@ package genesis import ( - "context" - "encoding/json" "errors" "fmt" - "math/big" - "os" + "time" + "github.com/ethereum-optimism/optimism/op-service/ioutil" + "github.com/ethereum-optimism/optimism/op-service/retry" + "github.com/ethereum-optimism/optimism/op-service/sources/batching" "github.com/urfave/cli/v2" - "github.com/ethereum/go-ethereum/common" - "github.com/ethereum/go-ethereum/core/types" - "github.com/ethereum/go-ethereum/ethclient" - "github.com/ethereum/go-ethereum/log" - "github.com/ethereum/go-ethereum/rpc" - + "github.com/ethereum-optimism/optimism/op-chain-ops/foundry" "github.com/ethereum-optimism/optimism/op-chain-ops/genesis" "github.com/ethereum-optimism/optimism/op-service/jsonutil" + oplog "github.com/ethereum-optimism/optimism/op-service/log" + "github.com/ethereum/go-ethereum/core/types" + "github.com/ethereum/go-ethereum/ethclient" ) var ( l1RPCFlag = &cli.StringFlag{ - Name: "l1-rpc", - Usage: "RPC URL for an Ethereum L1 node. Cannot be used with --l1-starting-block", - } - l1StartingBlockFlag = &cli.PathFlag{ - Name: "l1-starting-block", - Usage: "Path to a JSON file containing the L1 starting block. Overrides the need for using an L1 RPC to fetch the block. Cannot be used with --l1-rpc", + Name: "l1-rpc", + Usage: "RPC URL for an Ethereum L1 node", + Required: true, } deployConfigFlag = &cli.PathFlag{ Name: "deploy-config", @@ -70,7 +65,6 @@ var ( l2Flags = []cli.Flag{ l1RPCFlag, - l1StartingBlockFlag, deployConfigFlag, l2AllocsFlag, l1DeploymentsFlag, @@ -85,14 +79,14 @@ var Subcommands = cli.Commands{ Usage: "Generates a L1 genesis state file", Flags: l1Flags, Action: func(ctx *cli.Context) error { - deployConfig := ctx.String("deploy-config") + deployConfig := ctx.String(deployConfigFlag.Name) config, err := genesis.NewDeployConfig(deployConfig) if err != nil { return err } var deployments *genesis.L1Deployments - if l1Deployments := ctx.String("l1-deployments"); l1Deployments != "" { + if l1Deployments := ctx.String(l1DeploymentsFlag.Name); l1Deployments != "" { deployments, err = genesis.NewL1Deployments(l1Deployments) if err != nil { return err @@ -103,7 +97,9 @@ var Subcommands = cli.Commands{ config.SetDeployments(deployments) } - if err := config.Check(); err != nil { + cfg := oplog.DefaultCLIConfig() + logger := oplog.NewLogger(ctx.App.Writer, cfg) + if err := config.Check(logger); err != nil { return fmt.Errorf("deploy config at %s invalid: %w", deployConfig, err) } @@ -112,9 +108,9 @@ var Subcommands = cli.Commands{ return fmt.Errorf("deploy config at %s invalid: %w", deployConfig, err) } - var dump *genesis.ForgeAllocs - if l1Allocs := ctx.String("l1-allocs"); l1Allocs != "" { - dump, err = genesis.LoadForgeAllocs(l1Allocs) + var dump *foundry.ForgeAllocs + if l1Allocs := ctx.String(l1AllocsFlag.Name); l1Allocs != "" { + dump, err = foundry.LoadForgeAllocs(l1Allocs) if err != nil { return err } @@ -125,7 +121,7 @@ var Subcommands = cli.Commands{ return err } - return jsonutil.WriteJSON(ctx.String("outfile.l1"), l1Genesis, 0o666) + return jsonutil.WriteJSON(l1Genesis, ioutil.ToStdOutOrFileOrNoop(ctx.String(outfileL1Flag.Name), 0o666)) }, }, { @@ -138,23 +134,18 @@ var Subcommands = cli.Commands{ "or it can be provided as a JSON file.", Flags: l2Flags, Action: func(ctx *cli.Context) error { - deployConfig := ctx.Path("deploy-config") - log.Info("Deploy config", "path", deployConfig) + cfg := oplog.DefaultCLIConfig() + logger := oplog.NewLogger(ctx.App.Writer, cfg) + + deployConfig := ctx.Path(deployConfigFlag.Name) + logger.Info("Deploy config", "path", deployConfig) config, err := genesis.NewDeployConfig(deployConfig) if err != nil { return err } - l1Deployments := ctx.Path("l1-deployments") - l1StartBlockPath := ctx.Path("l1-starting-block") - l1RPC := ctx.String("l1-rpc") - - if l1StartBlockPath == "" && l1RPC == "" { - return errors.New("must specify either --l1-starting-block or --l1-rpc") - } - if l1StartBlockPath != "" && l1RPC != "" { - return errors.New("cannot specify both --l1-starting-block and --l1-rpc") - } + l1Deployments := ctx.Path(l1DeploymentsFlag.Name) + l1RPC := ctx.String(l1RPCFlag.Name) deployments, err := genesis.NewL1Deployments(l1Deployments) if err != nil { @@ -162,16 +153,9 @@ var Subcommands = cli.Commands{ } config.SetDeployments(deployments) - var l1StartBlock *types.Block - if l1StartBlockPath != "" { - if l1StartBlock, err = readBlockJSON(l1StartBlockPath); err != nil { - return fmt.Errorf("cannot read L1 starting block at %s: %w", l1StartBlockPath, err) - } - } - - var l2Allocs *genesis.ForgeAllocs - if l2AllocsPath := ctx.String("l2-allocs"); l2AllocsPath != "" { - l2Allocs, err = genesis.LoadForgeAllocs(l2AllocsPath) + var l2Allocs *foundry.ForgeAllocs + if l2AllocsPath := ctx.String(l2AllocsFlag.Name); l2AllocsPath != "" { + l2Allocs, err = foundry.LoadForgeAllocs(l2AllocsPath) if err != nil { return err } @@ -179,53 +163,41 @@ var Subcommands = cli.Commands{ return errors.New("missing l2-allocs") } - if l1RPC != "" { - client, err := ethclient.Dial(l1RPC) - if err != nil { - return fmt.Errorf("cannot dial %s: %w", l1RPC, err) - } + // Retrieve SystemConfig.startBlock() + client, err := ethclient.Dial(l1RPC) + if err != nil { + return fmt.Errorf("cannot dial %s: %w", l1RPC, err) + } - if config.L1StartingBlockTag == nil { - l1StartBlock, err = client.BlockByNumber(context.Background(), nil) - if err != nil { - return fmt.Errorf("cannot fetch latest block: %w", err) - } - tag := rpc.BlockNumberOrHashWithHash(l1StartBlock.Hash(), true) - config.L1StartingBlockTag = (*genesis.MarshalableRPCBlockNumberOrHash)(&tag) - } else if config.L1StartingBlockTag.BlockHash != nil { - l1StartBlock, err = client.BlockByHash(context.Background(), *config.L1StartingBlockTag.BlockHash) - if err != nil { - return fmt.Errorf("cannot fetch block by hash: %w", err) - } - } else if config.L1StartingBlockTag.BlockNumber != nil { - l1StartBlock, err = client.BlockByNumber(context.Background(), big.NewInt(config.L1StartingBlockTag.BlockNumber.Int64())) - if err != nil { - return fmt.Errorf("cannot fetch block by number: %w", err) - } - } + caller := batching.NewMultiCaller(client.Client(), batching.DefaultBatchSize) + sysCfg := NewSystemConfigContract(caller, config.SystemConfigProxy) + startBlock, err := sysCfg.StartBlock(ctx.Context) + if err != nil { + return fmt.Errorf("failed to fetch startBlock from SystemConfig: %w", err) } - // Ensure that there is a starting L1 block - if l1StartBlock == nil { - return errors.New("no starting L1 block") + logger.Info("Using L1 Start Block", "number", startBlock) + // retry because local devnet can experience a race condition where L1 geth isn't ready yet + l1StartBlock, err := retry.Do(ctx.Context, 24, retry.Fixed(1*time.Second), func() (*types.Block, error) { return client.BlockByNumber(ctx.Context, startBlock) }) + if err != nil { + return fmt.Errorf("fetching start block by number: %w", err) } + logger.Info("Fetched L1 Start Block", "hash", l1StartBlock.Hash().Hex()) // Sanity check the config. Do this after filling in the L1StartingBlockTag // if it is not defined. - if err := config.Check(); err != nil { + if err := config.Check(logger); err != nil { return err } - log.Info("Using L1 Start Block", "number", l1StartBlock.Number(), "hash", l1StartBlock.Hash().Hex()) - // Build the L2 genesis block - l2Genesis, err := genesis.BuildL2Genesis(config, l2Allocs, l1StartBlock) + l2Genesis, err := genesis.BuildL2Genesis(config, l2Allocs, l1StartBlock.Header()) if err != nil { return fmt.Errorf("error creating l2 genesis: %w", err) } l2GenesisBlock := l2Genesis.ToBlock() - rollupConfig, err := config.RollupConfig(l1StartBlock, l2GenesisBlock.Hash(), l2GenesisBlock.Number().Uint64()) + rollupConfig, err := config.RollupConfig(l1StartBlock.Header(), l2GenesisBlock.Hash(), l2GenesisBlock.Number().Uint64()) if err != nil { return err } @@ -233,62 +205,10 @@ var Subcommands = cli.Commands{ return fmt.Errorf("generated rollup config does not pass validation: %w", err) } - if err := jsonutil.WriteJSON(ctx.String("outfile.l2"), l2Genesis, 0o666); err != nil { + if err := jsonutil.WriteJSON(l2Genesis, ioutil.ToAtomicFile(ctx.String(outfileL2Flag.Name), 0o666)); err != nil { return err } - return jsonutil.WriteJSON(ctx.String("outfile.rollup"), rollupConfig, 0o666) + return jsonutil.WriteJSON(rollupConfig, ioutil.ToAtomicFile(ctx.String(outfileRollupFlag.Name), 0o666)) }, }, } - -// rpcBlock represents the JSON serialization of a block from an Ethereum RPC. -type rpcBlock struct { - Hash common.Hash `json:"hash"` - Transactions []rpcTransaction `json:"transactions"` - UncleHashes []common.Hash `json:"uncles"` - Withdrawals []*types.Withdrawal `json:"withdrawals,omitempty"` -} - -// rpcTransaction represents the JSON serialization of a transaction from an Ethereum RPC. -type rpcTransaction struct { - tx *types.Transaction - txExtraInfo -} - -// txExtraInfo includes extra information about a transaction that is returned from -// and Ethereum RPC endpoint. -type txExtraInfo struct { - BlockNumber *string `json:"blockNumber,omitempty"` - BlockHash *common.Hash `json:"blockHash,omitempty"` - From *common.Address `json:"from,omitempty"` -} - -// readBlockJSON will read a JSON file from disk containing a serialized block. -// This logic can break if the block format changes but there is no modular way -// to turn a block into JSON in go-ethereum. -func readBlockJSON(path string) (*types.Block, error) { - raw, err := os.ReadFile(path) - if err != nil { - return nil, fmt.Errorf("block file at %s not found: %w", path, err) - } - - var header types.Header - if err := json.Unmarshal(raw, &header); err != nil { - return nil, fmt.Errorf("cannot unmarshal block: %w", err) - } - - var body rpcBlock - if err := json.Unmarshal(raw, &body); err != nil { - return nil, err - } - - if len(body.UncleHashes) > 0 { - return nil, fmt.Errorf("cannot unmarshal block with uncles") - } - - txs := make([]*types.Transaction, len(body.Transactions)) - for i, tx := range body.Transactions { - txs[i] = tx.tx - } - return types.NewBlockWithHeader(&header).WithBody(txs, nil).WithWithdrawals(body.Withdrawals), nil -} diff --git a/op-node/cmd/genesis/systemconfig.go b/op-node/cmd/genesis/systemconfig.go new file mode 100644 index 000000000000..c98c39934bf0 --- /dev/null +++ b/op-node/cmd/genesis/systemconfig.go @@ -0,0 +1,36 @@ +package genesis + +import ( + "context" + "fmt" + "math/big" + + "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 ( + methodStartBlock = "startBlock" +) + +type SystemConfigContract struct { + caller *batching.MultiCaller + contract *batching.BoundContract +} + +func NewSystemConfigContract(caller *batching.MultiCaller, addr common.Address) *SystemConfigContract { + return &SystemConfigContract{ + caller: caller, + contract: batching.NewBoundContract(snapshots.LoadSystemConfigABI(), addr), + } +} + +func (c *SystemConfigContract) StartBlock(ctx context.Context) (*big.Int, error) { + result, err := c.caller.SingleCall(ctx, rpcblock.Latest, c.contract.Call(methodStartBlock)) + if err != nil { + return nil, fmt.Errorf("failed to call startBlock: %w", err) + } + return result.GetBigInt(0), nil +} diff --git a/op-node/cmd/genesis/systemconfig_test.go b/op-node/cmd/genesis/systemconfig_test.go new file mode 100644 index 000000000000..c755602a37e3 --- /dev/null +++ b/op-node/cmd/genesis/systemconfig_test.go @@ -0,0 +1,28 @@ +package genesis + +import ( + "context" + "math/big" + "testing" + + "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 TestSystemConfigContract_StartBlock(t *testing.T) { + addr := common.Address{0xaa} + sysCfgAbi := snapshots.LoadSystemConfigABI() + stubRpc := batchingTest.NewAbiBasedRpc(t, addr, sysCfgAbi) + caller := batching.NewMultiCaller(stubRpc, batching.DefaultBatchSize) + sysCfg := NewSystemConfigContract(caller, addr) + expected := big.NewInt(56) + stubRpc.SetResponse(addr, methodStartBlock, rpcblock.Latest, nil, []interface{}{expected}) + + result, err := sysCfg.StartBlock(context.Background()) + require.NoError(t, err) + require.Truef(t, result.Cmp(expected) == 0, "expected %v, got %v", expected, result) +} diff --git a/op-node/cmd/main.go b/op-node/cmd/main.go index f0e0122ac95f..8f6688b51cbf 100644 --- a/op-node/cmd/main.go +++ b/op-node/cmd/main.go @@ -20,9 +20,9 @@ import ( "github.com/ethereum-optimism/optimism/op-node/version" opservice "github.com/ethereum-optimism/optimism/op-service" "github.com/ethereum-optimism/optimism/op-service/cliapp" + "github.com/ethereum-optimism/optimism/op-service/ctxinterrupt" oplog "github.com/ethereum-optimism/optimism/op-service/log" "github.com/ethereum-optimism/optimism/op-service/metrics/doc" - "github.com/ethereum-optimism/optimism/op-service/opio" ) var ( @@ -64,7 +64,7 @@ func main() { }, } - ctx := opio.WithInterruptBlocker(context.Background()) + ctx := ctxinterrupt.WithSignalWaiterMain(context.Background()) err := app.RunContext(ctx, os.Args) if err != nil { log.Crit("Application failed", "message", err) @@ -85,11 +85,6 @@ func RollupNodeMain(ctx *cli.Context, closeApp context.CancelCauseFunc) (cliapp. } cfg.Cancel = closeApp - snapshotLog, err := opnode.NewSnapshotLogger(ctx) - if err != nil { - return nil, fmt.Errorf("unable to create snapshot root logger: %w", err) - } - // Only pretty-print the banner if it is a terminal log. Other log it as key-value pairs. if logCfg.Format == "terminal" { log.Info("rollup config:\n" + cfg.Rollup.Description(chaincfg.L2ChainIDToNetworkDisplayName)) @@ -97,7 +92,7 @@ func RollupNodeMain(ctx *cli.Context, closeApp context.CancelCauseFunc) (cliapp. cfg.Rollup.LogDescription(log, chaincfg.L2ChainIDToNetworkDisplayName) } - n, err := node.New(ctx.Context, cfg, log, snapshotLog, VersionWithMeta, m) + n, err := node.New(ctx.Context, cfg, log, VersionWithMeta, m) if err != nil { return nil, fmt.Errorf("unable to create the rollup node: %w", err) } diff --git a/op-node/flags/flags.go b/op-node/flags/flags.go index d0fd4843c7a1..c38951b31505 100644 --- a/op-node/flags/flags.go +++ b/op-node/flags/flags.go @@ -6,8 +6,9 @@ import ( "github.com/urfave/cli/v2" + altda "github.com/ethereum-optimism/optimism/op-alt-da" + "github.com/ethereum-optimism/optimism/op-node/rollup/engine" "github.com/ethereum-optimism/optimism/op-node/rollup/sync" - plasma "github.com/ethereum-optimism/optimism/op-plasma" openum "github.com/ethereum-optimism/optimism/op-service/enum" opflags "github.com/ethereum-optimism/optimism/op-service/flags" oplog "github.com/ethereum-optimism/optimism/op-service/log" @@ -25,7 +26,7 @@ const ( SequencerCategory = "3. SEQUENCER" OperationsCategory = "4. LOGGING, METRICS, DEBUGGING, AND API" P2PCategory = "5. PEER-TO-PEER" - PlasmaCategory = "6. PLASMA (EXPERIMENTAL)" + AltDACategory = "6. ALT-DA (EXPERIMENTAL)" MiscCategory = "7. MISC" ) @@ -34,8 +35,12 @@ func init() { cli.VersionFlag.(*cli.BoolFlag).Category = MiscCategory } -func prefixEnvVars(name string) []string { - return []string{EnvVarPrefix + "_" + name} +func prefixEnvVars(names ...string) []string { + envs := make([]string, 0, len(names)) + for _, name := range names { + envs = append(envs, EnvVarPrefix+"_"+name) + } + return envs } var ( @@ -68,6 +73,13 @@ var ( EnvVars: prefixEnvVars("L1_BEACON"), Category: RollupCategory, } + SupervisorAddr = &cli.StringFlag{ + Name: "supervisor", + Usage: "RPC address of interop supervisor service for cross-chain safety verification." + + "Applies only to Interop-enabled networks.", + Hidden: true, // hidden for now during early testing. + EnvVars: prefixEnvVars("SUPERVISOR"), + } /* Optional Flags */ BeaconHeader = &cli.StringFlag{ Name: "l1.beacon-header", @@ -76,11 +88,11 @@ var ( EnvVars: prefixEnvVars("L1_BEACON_HEADER"), Category: L1RPCCategory, } - BeaconArchiverAddr = &cli.StringFlag{ - Name: "l1.beacon-archiver", - Usage: "Address of L1 Beacon-node compatible HTTP endpoint to use. This is used to fetch blobs that the --l1.beacon does not have (i.e expired blobs).", - Required: false, - EnvVars: prefixEnvVars("L1_BEACON_ARCHIVER"), + BeaconFallbackAddrs = &cli.StringSliceFlag{ + Name: "l1.beacon-fallbacks", + Aliases: []string{"l1.beacon-archiver"}, + Usage: "Addresses of L1 Beacon-API compatible HTTP fallback endpoints. Used to fetch blob sidecars not availalbe at the l1.beacon (e.g. expired blobs).", + EnvVars: prefixEnvVars("L1_BEACON_FALLBACKS", "L1_BEACON_ARCHIVER"), Category: L1RPCCategory, } BeaconCheckIgnore = &cli.BoolFlag{ @@ -152,13 +164,6 @@ var ( }(), Category: L1RPCCategory, } - L1RethDBPath = &cli.StringFlag{ - Name: "l1.rethdb", - Usage: "The L1 RethDB path, used to fetch receipts for L1 blocks. Only applicable when using the `reth_db` RPC kind with `l1.rpckind`.", - EnvVars: prefixEnvVars("L1_RETHDB"), - Hidden: true, - Category: L1RPCCategory, - } L1RPCMaxConcurrency = &cli.IntFlag{ Name: "l1.max-concurrency", Usage: "Maximum number of concurrent RPC requests to make to the L1 RPC provider.", @@ -187,6 +192,17 @@ var ( Value: time.Second * 12, Category: L1RPCCategory, } + L2EngineKind = &cli.GenericFlag{ + Name: "l2.enginekind", + Usage: "The kind of engine client, used to control the behavior of optimism in respect to different types of engine clients. Valid options: " + + openum.EnumString(engine.Kinds), + EnvVars: prefixEnvVars("L2_ENGINE_KIND"), + Value: func() *engine.Kind { + out := engine.Geth + return &out + }(), + Category: RollupCategory, + } VerifierL1Confs = &cli.Uint64Flag{ Name: "verifier.l1-confs", Usage: "Number of L1 blocks to keep distance from the L1 head before deriving L2 data from. Reorgs are supported, but may be slow to perform.", @@ -243,7 +259,7 @@ var ( MetricsAddrFlag = &cli.StringFlag{ Name: "metrics.addr", Usage: "Metrics listening address", - Value: "0.0.0.0", // TODO(CLI-4159): Switch to 127.0.0.1 + Value: "0.0.0.0", // TODO: Switch to 127.0.0.1 EnvVars: prefixEnvVars("METRICS_ADDR"), Category: OperationsCategory, } @@ -256,28 +272,31 @@ var ( } SnapshotLog = &cli.StringFlag{ Name: "snapshotlog.file", - Usage: "Path to the snapshot log file", + Usage: "Deprecated. This flag is ignored, but here for compatibility.", EnvVars: prefixEnvVars("SNAPSHOT_LOG"), Category: OperationsCategory, + Hidden: true, // non-critical function, removed, flag is no-op to avoid breaking setups. } HeartbeatEnabledFlag = &cli.BoolFlag{ Name: "heartbeat.enabled", - Usage: "Enables or disables heartbeating", + Usage: "Deprecated, no-op flag.", EnvVars: prefixEnvVars("HEARTBEAT_ENABLED"), Category: OperationsCategory, + Hidden: true, } HeartbeatMonikerFlag = &cli.StringFlag{ Name: "heartbeat.moniker", - Usage: "Sets a moniker for this node", + Usage: "Deprecated, no-op flag.", EnvVars: prefixEnvVars("HEARTBEAT_MONIKER"), Category: OperationsCategory, + Hidden: true, } HeartbeatURLFlag = &cli.StringFlag{ Name: "heartbeat.url", - Usage: "Sets the URL to heartbeat to", + Usage: "Deprecated, no-op flag.", EnvVars: prefixEnvVars("HEARTBEAT_URL"), - Value: "https://heartbeat.optimism.io", Category: OperationsCategory, + Hidden: true, } RollupHalt = &cli.StringFlag{ Name: "rollup.halt", @@ -368,9 +387,10 @@ var requiredFlags = []cli.Flag{ } var optionalFlags = []cli.Flag{ + SupervisorAddr, BeaconAddr, BeaconHeader, - BeaconArchiverAddr, + BeaconFallbackAddrs, BeaconCheckIgnore, BeaconFetchAllSidecars, SyncModeFlag, @@ -400,11 +420,11 @@ var optionalFlags = []cli.Flag{ HeartbeatURLFlag, RollupHalt, RollupLoadProtocolVersions, - L1RethDBPath, ConductorEnabledFlag, ConductorRpcFlag, ConductorRpcTimeoutFlag, SafeDBPath, + L2EngineKind, } var DeprecatedFlags = []cli.Flag{ @@ -426,7 +446,7 @@ func init() { optionalFlags = append(optionalFlags, oppprof.CLIFlagsWithCategory(EnvVarPrefix, OperationsCategory)...) optionalFlags = append(optionalFlags, DeprecatedFlags...) optionalFlags = append(optionalFlags, opflags.CLIFlags(EnvVarPrefix, RollupCategory)...) - optionalFlags = append(optionalFlags, plasma.CLIFlags(EnvVarPrefix, PlasmaCategory)...) + optionalFlags = append(optionalFlags, altda.CLIFlags(EnvVarPrefix, AltDACategory)...) Flags = append(requiredFlags, optionalFlags...) } diff --git a/op-node/flags/flags_test.go b/op-node/flags/flags_test.go index 90884bd32f30..26001d7f889f 100644 --- a/op-node/flags/flags_test.go +++ b/op-node/flags/flags_test.go @@ -61,7 +61,6 @@ func TestDeprecatedFlagsAreHidden(t *testing.T) { flagName := flag.Names()[0] t.Run(flagName, func(t *testing.T) { - visibleFlag, ok := flag.(interface { IsVisible() bool }) @@ -72,6 +71,11 @@ func TestDeprecatedFlagsAreHidden(t *testing.T) { } func TestHasEnvVar(t *testing.T) { + // known exceptions to the number of env vars + expEnvVars := map[string]int{ + BeaconFallbackAddrs.Name: 2, + } + for _, flag := range Flags { flag := flag flagName := flag.Names()[0] @@ -83,39 +87,44 @@ func TestHasEnvVar(t *testing.T) { envFlagGetter, ok := flag.(interface { GetEnvVars() []string }) - envFlags := envFlagGetter.GetEnvVars() require.True(t, ok, "must be able to cast the flag to an EnvVar interface") - require.Equal(t, 1, len(envFlags), "flags should have exactly one env var") + envFlags := envFlagGetter.GetEnvVars() + if numEnvVars, ok := expEnvVars[flagName]; ok { + require.Equalf(t, numEnvVars, len(envFlags), "flags should have %d env vars", numEnvVars) + } else { + require.Equal(t, 1, len(envFlags), "flags should have exactly one env var") + } }) } } func TestEnvVarFormat(t *testing.T) { + skippedFlags := []string{ + L1NodeAddr.Name, + L2EngineAddr.Name, + L2EngineJWTSecret.Name, + L1TrustRPC.Name, + L1RPCProviderKind.Name, + L2EngineKind.Name, + SnapshotLog.Name, + BackupL2UnsafeSyncRPC.Name, + BackupL2UnsafeSyncRPCTrustRPC.Name, + "p2p.scoring", + "p2p.ban.peers", + "p2p.ban.threshold", + "p2p.ban.duration", + "p2p.listen.tcp", + "p2p.listen.udp", + "p2p.useragent", + "p2p.gossip.mesh.lo", + "p2p.gossip.mesh.floodpublish", + "l2.engine-sync", + } + for _, flag := range Flags { flag := flag flagName := flag.Names()[0] - skippedFlags := []string{ - L1NodeAddr.Name, - L2EngineAddr.Name, - L2EngineJWTSecret.Name, - L1TrustRPC.Name, - L1RPCProviderKind.Name, - SnapshotLog.Name, - BackupL2UnsafeSyncRPC.Name, - BackupL2UnsafeSyncRPCTrustRPC.Name, - "p2p.scoring", - "p2p.ban.peers", - "p2p.ban.threshold", - "p2p.ban.duration", - "p2p.listen.tcp", - "p2p.listen.udp", - "p2p.useragent", - "p2p.gossip.mesh.lo", - "p2p.gossip.mesh.floodpublish", - "l2.engine-sync", - } - t.Run(flagName, func(t *testing.T) { if slices.Contains(skippedFlags, flagName) { t.Skipf("Skipping flag %v which is known to not have a standard flag name <-> env var conversion", flagName) @@ -126,9 +135,8 @@ func TestEnvVarFormat(t *testing.T) { envFlagGetter, ok := flag.(interface { GetEnvVars() []string }) - envFlags := envFlagGetter.GetEnvVars() require.True(t, ok, "must be able to cast the flag to an EnvVar interface") - require.Equal(t, 1, len(envFlags), "flags should have exactly one env var") + envFlags := envFlagGetter.GetEnvVars() expectedEnvVar := opservice.FlagNameToEnvVarName(flagName, "OP_NODE") require.Equal(t, expectedEnvVar, envFlags[0]) }) diff --git a/op-node/heartbeat/service.go b/op-node/heartbeat/service.go deleted file mode 100644 index fcb0b59fd8cd..000000000000 --- a/op-node/heartbeat/service.go +++ /dev/null @@ -1,77 +0,0 @@ -// Package heartbeat provides a service for sending heartbeats to a server. -package heartbeat - -import ( - "bytes" - "context" - "encoding/json" - "fmt" - "net/http" - "time" - - "github.com/ethereum/go-ethereum/log" -) - -// SendInterval determines the delay between requests. This must be larger than the MinHeartbeatInterval in the server. -const SendInterval = 10 * time.Minute - -type Payload struct { - Version string `json:"version"` - Meta string `json:"meta"` - Moniker string `json:"moniker"` - PeerID string `json:"peerID"` - ChainID uint64 `json:"chainID"` -} - -// Beat sends a heartbeat to the server at the given URL. It will send a heartbeat immediately, and then every SendInterval. -// Beat spawns a goroutine that will send heartbeats until the context is canceled. -func Beat( - ctx context.Context, - log log.Logger, - url string, - payload *Payload, -) error { - payloadJSON, err := json.Marshal(payload) - if err != nil { - return fmt.Errorf("telemetry crashed: %w", err) - } - - client := &http.Client{ - Timeout: 10 * time.Second, - } - - send := func() { - req, err := http.NewRequestWithContext(ctx, "POST", url, bytes.NewReader(payloadJSON)) - req.Header.Set("User-Agent", fmt.Sprintf("op-node/%s", payload.Version)) - req.Header.Set("Content-Type", "application/json") - if err != nil { - log.Error("error creating heartbeat HTTP request", "err", err) - return - } - res, err := client.Do(req) - if err != nil { - log.Warn("error sending heartbeat", "err", err) - return - } - res.Body.Close() - - if res.StatusCode < 200 || res.StatusCode > 204 { - log.Warn("heartbeat server returned non-200 status code", "status", res.StatusCode) - return - } - - log.Info("sent heartbeat") - } - - send() - tick := time.NewTicker(SendInterval) - defer tick.Stop() - for { - select { - case <-tick.C: - send() - case <-ctx.Done(): - return nil - } - } -} diff --git a/op-node/heartbeat/service_test.go b/op-node/heartbeat/service_test.go deleted file mode 100644 index 9aee553a55d6..000000000000 --- a/op-node/heartbeat/service_test.go +++ /dev/null @@ -1,58 +0,0 @@ -package heartbeat - -import ( - "context" - "io" - "net/http" - "net/http/httptest" - "testing" - "time" - - "github.com/stretchr/testify/require" - - "github.com/ethereum/go-ethereum/log" -) - -const expHeartbeat = `{ - "version": "v1.2.3", - "meta": "meta", - "moniker": "yeet", - "peerID": "1UiUfoobar", - "chainID": 1234 -}` - -func TestBeat(t *testing.T) { - ctx, cancel := context.WithTimeout(context.Background(), 15*time.Second) - defer cancel() - - reqCh := make(chan string, 2) - s := httptest.NewServer(http.HandlerFunc(func(w http.ResponseWriter, r *http.Request) { - w.WriteHeader(204) - body, err := io.ReadAll(r.Body) - require.NoError(t, err) - reqCh <- string(body) - r.Body.Close() - })) - defer s.Close() - - doneCh := make(chan struct{}) - go func() { - _ = Beat(ctx, log.Root(), s.URL, &Payload{ - Version: "v1.2.3", - Meta: "meta", - Moniker: "yeet", - PeerID: "1UiUfoobar", - ChainID: 1234, - }) - doneCh <- struct{}{} - }() - - select { - case hb := <-reqCh: - require.JSONEq(t, expHeartbeat, hb) - cancel() - <-doneCh - case <-ctx.Done(): - t.Fatalf("error: %v", ctx.Err()) - } -} diff --git a/op-node/metrics/metrics.go b/op-node/metrics/metrics.go index 321c811dabf8..88d8c4d0caa3 100644 --- a/op-node/metrics/metrics.go +++ b/op-node/metrics/metrics.go @@ -9,8 +9,8 @@ import ( "github.com/ethereum/go-ethereum/params" + altda "github.com/ethereum-optimism/optimism/op-alt-da" "github.com/ethereum-optimism/optimism/op-node/p2p/store" - plasma "github.com/ethereum-optimism/optimism/op-plasma" ophttp "github.com/ethereum-optimism/optimism/op-service/httputil" "github.com/ethereum-optimism/optimism/op-service/metrics" @@ -39,6 +39,9 @@ type Metricer interface { RecordSequencingError() RecordPublishingError() RecordDerivationError() + RecordEmittedEvent(eventName string, emitter string) + RecordProcessedEvent(eventName string, deriver string, duration time.Duration) + RecordEventsRateLimited() RecordReceivedUnsafePayload(payload *eth.ExecutionPayloadEnvelope) RecordRef(layer string, name string, num uint64, timestamp uint64, h common.Hash) RecordL1Ref(name string, ref eth.L1BlockRef) @@ -92,6 +95,18 @@ type Metrics struct { SequencingErrors *metrics.Event PublishingErrors *metrics.Event + EmittedEvents *prometheus.CounterVec + ProcessedEvents *prometheus.CounterVec + + // We don't use a histogram for observing time durations, + // as each vec entry (event-type, deriver type) is synchronous with other occurrences of the same entry key, + // so we can get a reasonably good understanding of execution by looking at the rate. + // Bucketing to detect outliers would be nice, but also increases the overhead by a lot, + // where we already track many event-type/deriver combinations. + EventsProcessTime *prometheus.CounterVec + + EventsRateLimited *metrics.Event + DerivedBatches metrics.EventVec P2PReqDurationSeconds *prometheus.HistogramVec @@ -120,7 +135,7 @@ type Metrics struct { TransactionsSequencedTotal prometheus.Counter - PlasmaMetrics plasma.Metricer + AltDAMetrics altda.Metricer // Channel Bank Metrics headChannelOpenedEvent *metrics.Event @@ -195,6 +210,32 @@ func NewMetrics(procName string) *Metrics { SequencingErrors: metrics.NewEvent(factory, ns, "", "sequencing_errors", "sequencing errors"), PublishingErrors: metrics.NewEvent(factory, ns, "", "publishing_errors", "p2p publishing errors"), + EmittedEvents: factory.NewCounterVec( + prometheus.CounterOpts{ + Namespace: ns, + Subsystem: "events", + Name: "emitted", + Help: "number of emitted events", + }, []string{"event_type", "emitter"}), + + ProcessedEvents: factory.NewCounterVec( + prometheus.CounterOpts{ + Namespace: ns, + Subsystem: "events", + Name: "processed", + Help: "number of processed events", + }, []string{"event_type", "deriver"}), + + EventsProcessTime: factory.NewCounterVec( + prometheus.CounterOpts{ + Namespace: ns, + Subsystem: "events", + Name: "process_time", + Help: "total duration in seconds of processed events", + }, []string{"event_type", "deriver"}), + + EventsRateLimited: metrics.NewEvent(factory, ns, "events", "rate_limited", "events rate limiter hits"), + DerivedBatches: metrics.NewEventVec(factory, ns, "", "derived_batches", "derived batches", []string{"type"}), SequencerInconsistentL1Origin: metrics.NewEvent(factory, ns, "", "sequencer_inconsistent_l1_origin", "events when the sequencer selects an inconsistent L1 origin"), @@ -384,7 +425,7 @@ func NewMetrics(procName string) *Metrics { "required", }), - PlasmaMetrics: plasma.MakeMetrics(ns, factory), + AltDAMetrics: altda.MakeMetrics(ns, factory), registry: registry, factory: factory, @@ -441,6 +482,21 @@ func (m *Metrics) RecordPublishingError() { m.PublishingErrors.Record() } +func (m *Metrics) RecordEmittedEvent(eventName string, emitter string) { + m.EmittedEvents.WithLabelValues(eventName, emitter).Inc() +} + +func (m *Metrics) RecordProcessedEvent(eventName string, deriver string, duration time.Duration) { + m.ProcessedEvents.WithLabelValues(eventName, deriver).Inc() + // We take the absolute value; if the clock was not monotonically increased between start and top, + // there still was a duration gap. And the Counter metrics-type would panic if the duration is negative. + m.EventsProcessTime.WithLabelValues(eventName, deriver).Add(float64(duration.Abs()) / float64(time.Second)) +} + +func (m *Metrics) RecordEventsRateLimited() { + m.EventsRateLimited.Record() +} + func (m *Metrics) RecordDerivationError() { m.DerivationErrors.Record() } @@ -642,6 +698,15 @@ func (n *noopMetricer) RecordPublishingError() { func (n *noopMetricer) RecordDerivationError() { } +func (n *noopMetricer) RecordEmittedEvent(eventName string, emitter string) { +} + +func (n *noopMetricer) RecordProcessedEvent(eventName string, deriver string, duration time.Duration) { +} + +func (n *noopMetricer) RecordEventsRateLimited() { +} + func (n *noopMetricer) RecordReceivedUnsafePayload(payload *eth.ExecutionPayloadEnvelope) { } diff --git a/op-node/node/api.go b/op-node/node/api.go index cb60d22d911b..a94e2477fe16 100644 --- a/op-node/node/api.go +++ b/op-node/node/api.go @@ -5,11 +5,11 @@ import ( "errors" "fmt" - "github.com/ethereum-optimism/optimism/op-node/node/safedb" "github.com/ethereum/go-ethereum/common" "github.com/ethereum/go-ethereum/common/hexutil" "github.com/ethereum/go-ethereum/log" + "github.com/ethereum-optimism/optimism/op-node/node/safedb" "github.com/ethereum-optimism/optimism/op-node/rollup" "github.com/ethereum-optimism/optimism/op-node/version" "github.com/ethereum-optimism/optimism/op-service/eth" @@ -33,6 +33,7 @@ type driverClient interface { StopSequencer(context.Context) (common.Hash, error) SequencerActive(context.Context) (bool, error) OnUnsafeL2Payload(ctx context.Context, payload *eth.ExecutionPayloadEnvelope) error + OverrideLeader(ctx context.Context) error } type SafeDBReader interface { @@ -77,7 +78,6 @@ func (n *adminAPI) SequencerActive(ctx context.Context) (bool, error) { // 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 { recordDur := n.M.RecordRPCServerRequest("admin_postUnsafePayload") defer recordDur() @@ -91,6 +91,13 @@ func (n *adminAPI) PostUnsafePayload(ctx context.Context, envelope *eth.Executio return n.dr.OnUnsafeL2Payload(ctx, envelope) } +// OverrideLeader disables sequencer conductor interactions and allow sequencer to run in non-HA mode during disaster recovery scenarios. +func (n *adminAPI) OverrideLeader(ctx context.Context) error { + recordDur := n.M.RecordRPCServerRequest("admin_overrideLeader") + defer recordDur() + return n.dr.OverrideLeader(ctx) +} + type nodeAPI struct { config *rollup.Config client l2EthClient diff --git a/op-node/node/client.go b/op-node/node/client.go index b6a7edbbad65..a561a7678d24 100644 --- a/op-node/node/client.go +++ b/op-node/node/client.go @@ -178,11 +178,11 @@ func (cfg *PreparedL1Endpoint) Check() error { } type L1BeaconEndpointConfig struct { - BeaconAddr string // Address of L1 User Beacon-API endpoint to use (beacon namespace required) - BeaconHeader string // Optional HTTP header for all requests to L1 Beacon - BeaconArchiverAddr string // Address of L1 User Beacon-API Archive endpoint to use for expired blobs (beacon namespace required) - BeaconCheckIgnore bool // When false, halt startup if the beacon version endpoint fails - BeaconFetchAllSidecars bool // Whether to fetch all blob sidecars and filter locally + BeaconAddr string // Address of L1 User Beacon-API endpoint to use (beacon namespace required) + BeaconHeader string // Optional HTTP header for all requests to L1 Beacon + BeaconFallbackAddrs []string // Addresses of L1 Beacon-API fallback endpoints (only for blob sidecars retrieval) + BeaconCheckIgnore bool // When false, halt startup if the beacon version endpoint fails + BeaconFetchAllSidecars bool // Whether to fetch all blob sidecars and filter locally } var _ L1BeaconEndpointSetup = (*L1BeaconEndpointConfig)(nil) @@ -197,11 +197,12 @@ func (cfg *L1BeaconEndpointConfig) Setup(ctx context.Context, log log.Logger) (c opts = append(opts, client.WithHeader(hdr)) } - a := client.NewBasicHTTPClient(cfg.BeaconAddr, log, opts...) - if cfg.BeaconArchiverAddr != "" { - b := client.NewBasicHTTPClient(cfg.BeaconArchiverAddr, log) + for _, addr := range cfg.BeaconFallbackAddrs { + b := client.NewBasicHTTPClient(addr, log) fb = append(fb, sources.NewBeaconHTTPClient(b)) } + + a := client.NewBasicHTTPClient(cfg.BeaconAddr, log, opts...) return sources.NewBeaconHTTPClient(a), fb, nil } @@ -229,3 +230,29 @@ func parseHTTPHeader(headerStr string) (http.Header, error) { h.Add(s[0], s[1]) return h, nil } + +type SupervisorEndpointSetup interface { + SupervisorClient(ctx context.Context, log log.Logger) (*sources.SupervisorClient, error) + Check() error +} + +type SupervisorEndpointConfig struct { + SupervisorAddr string +} + +var _ SupervisorEndpointSetup = (*SupervisorEndpointConfig)(nil) + +func (cfg *SupervisorEndpointConfig) Check() error { + if cfg.SupervisorAddr == "" { + return errors.New("supervisor RPC address is not set") + } + return nil +} + +func (cfg *SupervisorEndpointConfig) SupervisorClient(ctx context.Context, log log.Logger) (*sources.SupervisorClient, error) { + cl, err := client.NewRPC(ctx, log, cfg.SupervisorAddr, client.WithLazyDial()) + if err != nil { + return nil, fmt.Errorf("failed to create supervisor RPC: %w", err) + } + return sources.NewSupervisorClient(cl), nil +} diff --git a/op-node/node/client_test.go b/op-node/node/client_test.go index a5ab75fc5630..629b15687321 100644 --- a/op-node/node/client_test.go +++ b/op-node/node/client_test.go @@ -1,6 +1,7 @@ package node import ( + "context" "net/http" "testing" @@ -60,3 +61,32 @@ func TestParseHTTPHeader(t *testing.T) { }) } } + +func TestL1BeaconEndpointConfig_Setup(t *testing.T) { + for _, test := range []struct { + desc string + baa []string + len int + }{ + { + desc: "empty", + }, + { + desc: "one", + baa: []string{"http://foo.bar"}, + len: 1, + }, + { + desc: "three", + baa: []string{"http://foo.bar", "http://op.ti", "http://ba.se"}, + len: 3, + }, + } { + t.Run(test.desc, func(t *testing.T) { + cfg := L1BeaconEndpointConfig{BeaconFallbackAddrs: test.baa} + _, fb, err := cfg.Setup(context.Background(), nil) + require.NoError(t, err) + require.Len(t, fb, test.len) + }) + } +} diff --git a/op-node/node/conductor.go b/op-node/node/conductor.go index 938b9f28c5b1..20e0638dc686 100644 --- a/op-node/node/conductor.go +++ b/op-node/node/conductor.go @@ -3,16 +3,17 @@ package node import ( "context" "fmt" + "sync/atomic" "time" + "github.com/ethereum/go-ethereum/log" + + conductorRpc "github.com/ethereum-optimism/optimism/op-conductor/rpc" "github.com/ethereum-optimism/optimism/op-node/metrics" "github.com/ethereum-optimism/optimism/op-node/rollup/conductor" "github.com/ethereum-optimism/optimism/op-service/dial" "github.com/ethereum-optimism/optimism/op-service/eth" "github.com/ethereum-optimism/optimism/op-service/retry" - "github.com/ethereum/go-ethereum/log" - - conductorRpc "github.com/ethereum-optimism/optimism/op-conductor/rpc" ) // ConductorClient is a client for the op-conductor RPC service. @@ -21,13 +22,22 @@ type ConductorClient struct { metrics *metrics.Metrics log log.Logger apiClient *conductorRpc.APIClient + + // overrideLeader is used to override the leader check for disaster recovery purposes. + // During disaster situations where the cluster is unhealthy (no leader, only 1 or less nodes up), + // set this to true to allow the node to assume sequencing responsibilities without being the leader. + overrideLeader atomic.Bool } var _ conductor.SequencerConductor = &ConductorClient{} // NewConductorClient returns a new conductor client for the op-conductor RPC service. func NewConductorClient(cfg *Config, log log.Logger, metrics *metrics.Metrics) *ConductorClient { - return &ConductorClient{cfg: cfg, metrics: metrics, log: log} + return &ConductorClient{ + cfg: cfg, + metrics: metrics, + log: log, + } } // Initialize initializes the conductor client. @@ -45,6 +55,10 @@ func (c *ConductorClient) initialize() error { // Leader returns true if this node is the leader sequencer. func (c *ConductorClient) Leader(ctx context.Context) (bool, error) { + if c.overrideLeader.Load() { + return true, nil + } + if err := c.initialize(); err != nil { return false, err } @@ -62,6 +76,10 @@ func (c *ConductorClient) Leader(ctx context.Context) (bool, error) { // CommitUnsafePayload commits an unsafe payload to the conductor log. func (c *ConductorClient) CommitUnsafePayload(ctx context.Context, payload *eth.ExecutionPayloadEnvelope) error { + if c.overrideLeader.Load() { + return nil + } + if err := c.initialize(); err != nil { return err } @@ -78,6 +96,12 @@ func (c *ConductorClient) CommitUnsafePayload(ctx context.Context, payload *eth. return err } +// OverrideLeader implements conductor.SequencerConductor. +func (c *ConductorClient) OverrideLeader(ctx context.Context) error { + c.overrideLeader.Store(true) + return nil +} + func (c *ConductorClient) Close() { if c.apiClient == nil { return diff --git a/op-node/node/config.go b/op-node/node/config.go index 54e6b9fee7f0..6844ca81cc3f 100644 --- a/op-node/node/config.go +++ b/op-node/node/config.go @@ -8,13 +8,13 @@ import ( "strings" "time" + altda "github.com/ethereum-optimism/optimism/op-alt-da" "github.com/ethereum-optimism/optimism/op-node/flags" "github.com/ethereum-optimism/optimism/op-node/p2p" "github.com/ethereum-optimism/optimism/op-node/rollup" - "github.com/ethereum-optimism/optimism/op-node/rollup/derive" "github.com/ethereum-optimism/optimism/op-node/rollup/driver" + "github.com/ethereum-optimism/optimism/op-node/rollup/engine" "github.com/ethereum-optimism/optimism/op-node/rollup/sync" - plasma "github.com/ethereum-optimism/optimism/op-plasma" "github.com/ethereum-optimism/optimism/op-service/oppprof" "github.com/ethereum/go-ethereum/log" "github.com/ethstorage/da-server/pkg/da/client" @@ -27,6 +27,8 @@ type Config struct { Beacon L1BeaconEndpointSetup + Supervisor SupervisorEndpointSetup + Driver driver.Config Rollup rollup.Config @@ -58,8 +60,7 @@ type Config struct { RuntimeConfigReloadInterval time.Duration // Optional - Tracer Tracer - Heartbeat HeartbeatConfig + Tracer Tracer Sync sync.Config @@ -70,16 +71,13 @@ type Config struct { // Cancel to request a premature shutdown of the node itself, e.g. when halting. This may be nil. Cancel context.CancelCauseFunc - // [OPTIONAL] The reth DB path to read receipts from - RethDBPath string - // Conductor is used to determine this node is the leader sequencer. ConductorEnabled bool ConductorRpc string ConductorRpcTimeout time.Duration - // Plasma DA config - Plasma plasma.CLIConfig + // AltDA config + AltDA altda.CLIConfig // DACConfig for sequencer when l2 blob is enabled DACConfig *DACConfig @@ -99,7 +97,7 @@ type DACConfig struct { URLS []string } -func (dacConfig *DACConfig) Client() derive.DACClient { +func (dacConfig *DACConfig) Client() engine.DACClient { if dacConfig == nil || len(dacConfig.URLS) == 0 { return nil } @@ -134,12 +132,6 @@ func (m MetricsConfig) Check() error { return nil } -type HeartbeatConfig struct { - Enabled bool - Moniker string - URL string -} - func (cfg *Config) LoadPersisted(log log.Logger) error { if !cfg.Driver.SequencerEnabled { return nil @@ -168,12 +160,20 @@ func (cfg *Config) Check() error { } if cfg.Rollup.EcotoneTime != nil { if cfg.Beacon == nil { - return fmt.Errorf("the Ecotone upgrade is scheduled but no L1 Beacon API endpoint is configured") + return fmt.Errorf("the Ecotone upgrade is scheduled (timestamp = %d) but no L1 Beacon API endpoint is configured", *cfg.Rollup.EcotoneTime) } if err := cfg.Beacon.Check(); err != nil { return fmt.Errorf("misconfigured L1 Beacon API endpoint: %w", err) } } + if cfg.Rollup.InteropTime != nil { + if cfg.Supervisor == nil { + return fmt.Errorf("the Interop upgrade is scheduled (timestamp = %d) but no supervisor RPC endpoint is configured", *cfg.Rollup.InteropTime) + } + if err := cfg.Supervisor.Check(); err != nil { + return fmt.Errorf("misconfigured supervisor RPC endpoint: %w", err) + } + } if err := cfg.Rollup.Check(); err != nil { return fmt.Errorf("rollup config error: %w", err) } @@ -199,8 +199,11 @@ func (cfg *Config) Check() error { return fmt.Errorf("sequencer must be enabled when conductor is enabled") } } - if err := cfg.Plasma.Check(); err != nil { - return fmt.Errorf("plasma config error: %w", err) + if err := cfg.AltDA.Check(); err != nil { + return fmt.Errorf("altDA config error: %w", err) + } + if cfg.AltDA.Enabled { + log.Warn("Alt-DA Mode 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.") } if cfg.Driver.SequencerEnabled && cfg.Rollup.IsL2BlobTimeSet() && cfg.DACConfig == nil { return fmt.Errorf("dac.urls must be set for sequencer when l2 blob time is set") @@ -210,3 +213,7 @@ func (cfg *Config) Check() error { } return nil } + +func (cfg *Config) P2PEnabled() bool { + return cfg.P2P != nil && !cfg.P2P.Disabled() +} diff --git a/op-node/node/node.go b/op-node/node/node.go index a1b57755da07..7be4ac5a2291 100644 --- a/op-node/node/node.go +++ b/op-node/node/node.go @@ -8,27 +8,26 @@ import ( "sync/atomic" "time" - "github.com/ethereum-optimism/optimism/op-node/node/safedb" - "github.com/ethereum-optimism/optimism/op-node/rollup/derive" - plasma "github.com/ethereum-optimism/optimism/op-plasma" - "github.com/ethereum-optimism/optimism/op-service/httputil" - "github.com/hashicorp/go-multierror" "github.com/libp2p/go-libp2p/core/peer" "github.com/ethereum/go-ethereum" - "github.com/ethereum/go-ethereum/event" + gethevent "github.com/ethereum/go-ethereum/event" "github.com/ethereum/go-ethereum/log" - "github.com/ethereum-optimism/optimism/op-node/heartbeat" + altda "github.com/ethereum-optimism/optimism/op-alt-da" "github.com/ethereum-optimism/optimism/op-node/metrics" + "github.com/ethereum-optimism/optimism/op-node/node/safedb" "github.com/ethereum-optimism/optimism/op-node/p2p" + "github.com/ethereum-optimism/optimism/op-node/rollup" "github.com/ethereum-optimism/optimism/op-node/rollup/conductor" "github.com/ethereum-optimism/optimism/op-node/rollup/driver" + "github.com/ethereum-optimism/optimism/op-node/rollup/event" + "github.com/ethereum-optimism/optimism/op-node/rollup/sequencing" "github.com/ethereum-optimism/optimism/op-node/rollup/sync" - "github.com/ethereum-optimism/optimism/op-node/version" "github.com/ethereum-optimism/optimism/op-service/client" "github.com/ethereum-optimism/optimism/op-service/eth" + "github.com/ethereum-optimism/optimism/op-service/httputil" "github.com/ethereum-optimism/optimism/op-service/oppprof" "github.com/ethereum-optimism/optimism/op-service/retry" "github.com/ethereum-optimism/optimism/op-service/sources" @@ -37,12 +36,14 @@ import ( var ErrAlreadyClosed = errors.New("node is already closed") type closableSafeDB interface { - derive.SafeHeadListener + rollup.SafeHeadListener SafeDBReader io.Closer } type OpNode struct { + // Retain the config to test for active features rather than test for runtime state. + cfg *Config log log.Logger appVersion string metrics *metrics.Metrics @@ -51,6 +52,9 @@ type OpNode struct { l1SafeSub ethereum.Subscription // Subscription to get L1 safe blocks, a.k.a. justified data (polling) l1FinalizedSub ethereum.Subscription // Subscription to get L1 safe blocks, a.k.a. justified data (polling) + eventSys event.System + eventDrain event.Drainer + l1Source *sources.L1Client // L1 Client to fetch data from l2Driver *driver.Driver // L2 Engine to Sync l2Source *sources.EngineClient // L2 Execution Engine RPC bindings @@ -69,6 +73,8 @@ type OpNode struct { beacon *sources.L1BeaconClient + supervisor *sources.SupervisorClient + // some resources cannot be stopped directly, like the p2p gossipsub router (not our design), // and depend on this ctx to be closed. resourcesCtx context.Context @@ -90,12 +96,13 @@ var _ p2p.GossipIn = (*OpNode)(nil) // New creates a new OpNode instance. // The provided ctx argument is for the span of initialization only; // the node will immediately Stop(ctx) before finishing initialization if the context is canceled during initialization. -func New(ctx context.Context, cfg *Config, log log.Logger, snapshotLog log.Logger, appVersion string, m *metrics.Metrics) (*OpNode, error) { +func New(ctx context.Context, cfg *Config, log log.Logger, appVersion string, m *metrics.Metrics) (*OpNode, error) { if err := cfg.Check(); err != nil { return nil, err } n := &OpNode{ + cfg: cfg, log: log, appVersion: appVersion, metrics: m, @@ -105,7 +112,7 @@ func New(ctx context.Context, cfg *Config, log log.Logger, snapshotLog log.Logge // not a context leak, gossipsub is closed with a context. n.resourcesCtx, n.resourcesClose = context.WithCancel(context.Background()) - err := n.init(ctx, cfg, snapshotLog) + err := n.init(ctx, cfg) if err != nil { log.Error("Error initializing the rollup node", "err", err) // ensure we always close the node resources if we fail to initialize the node. @@ -117,18 +124,19 @@ func New(ctx context.Context, cfg *Config, log log.Logger, snapshotLog log.Logge return n, nil } -func (n *OpNode) init(ctx context.Context, cfg *Config, snapshotLog log.Logger) error { +func (n *OpNode) init(ctx context.Context, cfg *Config) error { n.log.Info("Initializing rollup node", "version", n.appVersion) if err := n.initTracer(ctx, cfg); err != nil { return fmt.Errorf("failed to init the trace: %w", err) } + n.initEventSystem() if err := n.initL1(ctx, cfg); err != nil { return fmt.Errorf("failed to init L1: %w", err) } if err := n.initL1BeaconAPI(ctx, cfg); err != nil { return err } - if err := n.initL2(ctx, cfg, snapshotLog); err != nil { + if err := n.initL2(ctx, cfg); err != nil { return fmt.Errorf("failed to init L2: %w", err) } if err := n.initRuntimeConfig(ctx, cfg); err != nil { // depends on L2, to signal initial runtime values to @@ -137,7 +145,7 @@ func (n *OpNode) init(ctx context.Context, cfg *Config, snapshotLog log.Logger) if err := n.initP2PSigner(ctx, cfg); err != nil { return fmt.Errorf("failed to init the P2P signer: %w", err) } - if err := n.initP2P(ctx, cfg); err != nil { + if err := n.initP2P(cfg); err != nil { return fmt.Errorf("failed to init the P2P stack: %w", err) } // Only expose the server at the end, ensuring all RPC backend components are initialized. @@ -149,13 +157,22 @@ func (n *OpNode) init(ctx context.Context, cfg *Config, snapshotLog log.Logger) } n.metrics.RecordInfo(n.appVersion) n.metrics.RecordUp() - n.initHeartbeat(cfg) if err := n.initPProf(cfg); err != nil { return fmt.Errorf("failed to init profiling: %w", err) } return nil } +func (n *OpNode) initEventSystem() { + // This executor will be configurable in the future, for parallel event processing + executor := event.NewGlobalSynchronous(n.resourcesCtx) + sys := event.NewSystem(n.log, executor) + sys.AddTracer(event.NewMetricsTracer(n.metrics)) + sys.Register("node", event.DeriverFunc(n.onEvent), event.DefaultRegisterOpts()) + n.eventSys = sys + n.eventDrain = executor +} + func (n *OpNode) initTracer(ctx context.Context, cfg *Config) error { if cfg.Tracer != nil { n.tracer = cfg.Tracer @@ -171,9 +188,6 @@ func (n *OpNode) initL1(ctx context.Context, cfg *Config) error { return fmt.Errorf("failed to get L1 RPC client: %w", err) } - // Set the RethDB path in the EthClientConfig, if there is one configured. - rpcCfg.EthClientConfig.RethDBPath = cfg.RethDBPath - n.l1Source, err = sources.NewL1Client( client.NewInstrumentedRPC(l1Node, &n.metrics.RPCMetrics.RPCClientMetrics), n.log, n.metrics.L1SourceCache, rpcCfg) if err != nil { @@ -185,7 +199,7 @@ func (n *OpNode) initL1(ctx context.Context, cfg *Config) error { } // Keep subscribed to the L1 heads, which keeps the L1 maintainer pointing to the best headers to sync - n.l1HeadsSub = event.ResubscribeErr(time.Second*10, func(ctx context.Context, err error) (event.Subscription, error) { + n.l1HeadsSub = gethevent.ResubscribeErr(time.Second*10, func(ctx context.Context, err error) (gethevent.Subscription, error) { if err != nil { n.log.Warn("resubscribing after failed L1 subscription", "err", err) } @@ -364,7 +378,7 @@ func (n *OpNode) initL1BeaconAPI(ctx context.Context, cfg *Config) error { } } -func (n *OpNode) initL2(ctx context.Context, cfg *Config, snapshotLog log.Logger) error { +func (n *OpNode) initL2(ctx context.Context, cfg *Config) error { rpcClient, rpcCfg, err := cfg.L2.Setup(ctx, n.log, &cfg.Rollup) if err != nil { return fmt.Errorf("failed to setup L2 execution-engine RPC client: %w", err) @@ -381,17 +395,25 @@ func (n *OpNode) initL2(ctx context.Context, cfg *Config, snapshotLog log.Logger return err } + if cfg.Rollup.InteropTime != nil { + cl, err := cfg.Supervisor.SupervisorClient(ctx, n.log) + if err != nil { + return fmt.Errorf("failed to setup supervisor RPC client: %w", err) + } + n.supervisor = cl + } + var sequencerConductor conductor.SequencerConductor = &conductor.NoOpConductor{} if cfg.ConductorEnabled { sequencerConductor = NewConductorClient(cfg, n.log, n.metrics) } - // if plasma is not explicitly activated in the node CLI, the config + any error will be ignored. - rpCfg, err := cfg.Rollup.GetOPPlasmaConfig() - if cfg.Plasma.Enabled && err != nil { - return fmt.Errorf("failed to get plasma config: %w", err) + // if altDA is not explicitly activated in the node CLI, the config + any error will be ignored. + rpCfg, err := cfg.Rollup.GetOPAltDAConfig() + if cfg.AltDA.Enabled && err != nil { + return fmt.Errorf("failed to get altDA config: %w", err) } - plasmaDA := plasma.NewPlasmaDA(n.log, cfg.Plasma, rpCfg, n.metrics.PlasmaMetrics) + altDA := altda.NewAltDA(n.log, cfg.AltDA, rpCfg, n.metrics.AltDAMetrics) if cfg.SafeDBPath != "" { n.log.Info("Safe head database enabled", "path", cfg.SafeDBPath) safeDB, err := safedb.NewSafeDB(n.log, cfg.SafeDBPath) @@ -402,8 +424,10 @@ func (n *OpNode) initL2(ctx context.Context, cfg *Config, snapshotLog log.Logger } else { n.safeDB = safedb.Disabled } + dacClient := cfg.DACConfig.Client() - n.l2Driver = driver.NewDriver(&cfg.Driver, &cfg.Rollup, n.l2Source, n.l1Source, n.beacon, n, n, n.log, snapshotLog, n.metrics, cfg.ConfigPersistence, n.safeDB, &cfg.Sync, sequencerConductor, plasmaDA, dacClient) + n.l2Driver = driver.NewDriver(n.eventSys, n.eventDrain, &cfg.Driver, &cfg.Rollup, n.l2Source, n.l1Source, + n.supervisor, n.beacon, n, n, n.log, n.metrics, cfg.ConfigPersistence, n.safeDB, &cfg.Sync, sequencerConductor, altDA, dacClient) return nil } @@ -412,7 +436,7 @@ func (n *OpNode) initRPCServer(cfg *Config) error { if err != nil { return err } - if n.p2pNode != nil { + if n.p2pEnabled() { server.EnableP2P(p2p.NewP2PAPIBackend(n.p2pNode, n.log, n.metrics)) } if cfg.RPC.EnableAdmin { @@ -442,32 +466,6 @@ func (n *OpNode) initMetricsServer(cfg *Config) error { return nil } -func (n *OpNode) initHeartbeat(cfg *Config) { - if !cfg.Heartbeat.Enabled { - return - } - var peerID string - if cfg.P2P.Disabled() { - peerID = "disabled" - } else { - peerID = n.P2P().Host().ID().String() - } - - payload := &heartbeat.Payload{ - Version: version.Version, - Meta: version.Meta, - Moniker: cfg.Heartbeat.Moniker, - PeerID: peerID, - ChainID: cfg.Rollup.L2ChainID.Uint64(), - } - - go func(url string) { - if err := heartbeat.Beat(n.resourcesCtx, n.log, url, payload); err != nil { - log.Error("heartbeat goroutine crashed", "err", err) - } - }(cfg.Heartbeat.URL) -} - func (n *OpNode) initPProf(cfg *Config) error { n.pprofService = oppprof.New( cfg.Pprof.ListenEnabled, @@ -485,14 +483,20 @@ func (n *OpNode) initPProf(cfg *Config) error { return nil } -func (n *OpNode) initP2P(ctx context.Context, cfg *Config) error { - if cfg.P2P != nil { - // TODO(protocol-quest/97): Use EL Sync instead of CL Alt sync for fetching missing blocks in the payload queue. - p2pNode, err := p2p.NewNodeP2P(n.resourcesCtx, &cfg.Rollup, n.log, cfg.P2P, n, n.l2Source, n.runCfg, n.metrics, false) - if err != nil || p2pNode == nil { - return err +func (n *OpNode) p2pEnabled() bool { + return n.cfg.P2PEnabled() +} + +func (n *OpNode) initP2P(cfg *Config) (err error) { + if n.p2pNode != nil { + panic("p2p node already initialized") + } + if n.p2pEnabled() { + // TODO(protocol-quest#97): Use EL Sync instead of CL Alt sync for fetching missing blocks in the payload queue. + n.p2pNode, err = p2p.NewNodeP2P(n.resourcesCtx, &cfg.Rollup, n.log, cfg.P2P, n, n.l2Source, n.runCfg, n.metrics, false) + if err != nil { + return } - n.p2pNode = p2pNode if n.p2pNode.Dv5Udp() != nil { go n.p2pNode.DiscoveryProcess(n.resourcesCtx, n.log, &cfg.Rollup, cfg.P2P.TargetPeers()) } @@ -500,15 +504,14 @@ func (n *OpNode) initP2P(ctx context.Context, cfg *Config) error { return nil } -func (n *OpNode) initP2PSigner(ctx context.Context, cfg *Config) error { +func (n *OpNode) initP2PSigner(ctx context.Context, cfg *Config) (err error) { // the p2p signer setup is optional if cfg.P2PSigner == nil { - return nil + return } // p2pSigner may still be nil, the signer setup may not create any signer, the signer is optional - var err error n.p2pSigner, err = cfg.P2PSigner.SetupSigner(ctx) - return err + return } func (n *OpNode) Start(ctx context.Context) error { @@ -522,6 +525,20 @@ func (n *OpNode) Start(ctx context.Context) error { return nil } +// onEvent handles broadcast events. +// The OpNode itself is a deriver to catch system-critical events. +// Other event-handling should be encapsulated into standalone derivers. +func (n *OpNode) onEvent(ev event.Event) bool { + switch x := ev.(type) { + case rollup.CriticalErrorEvent: + n.log.Error("Critical error", "err", x.Err) + n.cancel(fmt.Errorf("critical error: %w", x.Err)) + return true + default: + return false + } +} + func (n *OpNode) OnNewL1Head(ctx context.Context, sig eth.L1BlockRef) { n.tracer.OnNewL1Head(ctx, sig) @@ -564,7 +581,7 @@ func (n *OpNode) PublishL2Payload(ctx context.Context, envelope *eth.ExecutionPa n.tracer.OnPublishL2Payload(ctx, envelope) // publish to p2p, if we are running p2p at all - if n.p2pNode != nil { + if n.p2pEnabled() { payload := envelope.ExecutionPayload if n.p2pSigner == nil { return fmt.Errorf("node has no p2p signer, payload %s cannot be published", payload.ID()) @@ -578,13 +595,14 @@ func (n *OpNode) PublishL2Payload(ctx context.Context, envelope *eth.ExecutionPa func (n *OpNode) OnUnsafeL2Payload(ctx context.Context, from peer.ID, envelope *eth.ExecutionPayloadEnvelope) error { // ignore if it's from ourselves - if n.p2pNode != nil && from == n.p2pNode.Host().ID() { + if n.p2pEnabled() && from == n.p2pNode.Host().ID() { return nil } n.tracer.OnUnsafeL2Payload(ctx, from, envelope) - n.log.Info("Received signed execution payload from p2p", "id", envelope.ExecutionPayload.ID(), "peer", from) + n.log.Info("Received signed execution payload from p2p", "id", envelope.ExecutionPayload.ID(), "peer", from, + "txs", len(envelope.ExecutionPayload.Transactions)) // Pass on the event to the L2 Engine ctx, cancel := context.WithTimeout(ctx, time.Second*30) @@ -598,9 +616,13 @@ func (n *OpNode) OnUnsafeL2Payload(ctx context.Context, from peer.ID, envelope * } func (n *OpNode) RequestL2Range(ctx context.Context, start, end eth.L2BlockRef) error { - if n.p2pNode != nil && n.p2pNode.AltSyncEnabled() { + if n.p2pEnabled() && n.p2pNode.AltSyncEnabled() { if unixTimeStale(start.Time, 12*time.Hour) { - n.log.Debug("ignoring request to sync L2 range, timestamp is too old for p2p", "start", start, "end", end, "start_time", start.Time) + n.log.Debug( + "ignoring request to sync L2 range, timestamp is too old for p2p", + "start", start, + "end", end, + "start_time", start.Time) return nil } return n.p2pNode.RequestL2Range(ctx, start, end) @@ -636,10 +658,26 @@ func (n *OpNode) Stop(ctx context.Context) error { result = multierror.Append(result, fmt.Errorf("failed to close RPC server: %w", err)) } } + + // Stop sequencer and report last hash. l2Driver can be nil if we're cleaning up a failed init. + if n.l2Driver != nil { + latestHead, err := n.l2Driver.StopSequencer(ctx) + switch { + case errors.Is(err, sequencing.ErrSequencerNotEnabled): + case errors.Is(err, driver.ErrSequencerAlreadyStopped): + n.log.Info("stopping node: sequencer already stopped", "latestHead", latestHead) + case err == nil: + n.log.Info("stopped sequencer", "latestHead", latestHead) + default: + result = multierror.Append(result, fmt.Errorf("error stopping sequencer: %w", err)) + } + } if n.p2pNode != nil { if err := n.p2pNode.Close(); err != nil { result = multierror.Append(result, fmt.Errorf("failed to close p2p node: %w", err)) } + // Prevent further use of p2p. + n.p2pNode = nil } if n.p2pSigner != nil { if err := n.p2pSigner.Close(); err != nil { @@ -671,6 +709,10 @@ func (n *OpNode) Stop(ctx context.Context) error { } } + if n.eventSys != nil { + n.eventSys.Stop() + } + if n.safeDB != nil { if err := n.safeDB.Close(); err != nil { result = multierror.Append(result, fmt.Errorf("failed to close safe head db: %w", err)) @@ -687,6 +729,11 @@ func (n *OpNode) Stop(ctx context.Context) error { n.l2Source.Close() } + // close the supervisor RPC client + if n.supervisor != nil { + n.supervisor.Close() + } + // close L1 data source if n.l1Source != nil { n.l1Source.Close() diff --git a/op-node/node/server_test.go b/op-node/node/server_test.go index 587befd6de80..7063b3ed2807 100644 --- a/op-node/node/server_test.go +++ b/op-node/node/server_test.go @@ -283,6 +283,10 @@ func (c *mockDriverClient) OnUnsafeL2Payload(ctx context.Context, payload *eth.E return c.Mock.MethodCalled("OnUnsafeL2Payload").Get(0).(error) } +func (c *mockDriverClient) OverrideLeader(ctx context.Context) error { + return c.Mock.MethodCalled("OverrideLeader").Get(0).(error) +} + type mockSafeDBReader struct { mock.Mock } diff --git a/op-node/p2p/config.go b/op-node/p2p/config.go index da50bad70bf3..ee21ba20fc39 100644 --- a/op-node/p2p/config.go +++ b/op-node/p2p/config.go @@ -13,7 +13,7 @@ import ( "github.com/ethereum/go-ethereum/p2p/enode" "github.com/ethereum/go-ethereum/p2p/netutil" ds "github.com/ipfs/go-datastore" - "github.com/libp2p/go-libp2p" + libp2p "github.com/libp2p/go-libp2p" pubsub "github.com/libp2p/go-libp2p-pubsub" "github.com/libp2p/go-libp2p/core" "github.com/libp2p/go-libp2p/core/connmgr" @@ -48,6 +48,7 @@ type HostMetrics interface { // SetupP2P provides a host and discovery service for usage in the rollup node. type SetupP2P interface { Check() error + // Looks like this was started to prevent partially inited p2p. Disabled() bool // Host creates a libp2p host service. Returns nil, nil if p2p is disabled. Host(log log.Logger, reporter metrics.Reporter, metrics HostMetrics) (host.Host, error) @@ -176,6 +177,9 @@ const maxMeshParam = 1000 func (conf *Config) Check() error { if conf.DisableP2P { + if len(conf.StaticPeers) > 0 { + return errors.New("both --p2p.static and --p2p.disable are specified") + } return nil } if conf.Store == nil { diff --git a/op-node/p2p/discovery.go b/op-node/p2p/discovery.go index 93a66ca33184..54b13137bd87 100644 --- a/op-node/p2p/discovery.go +++ b/op-node/p2p/discovery.go @@ -368,7 +368,7 @@ func (n *NodeP2P) DiscoveryProcess(ctx context.Context, log log.Logger, cfg *rol } } // We add the addresses to the peerstore, and update the address TTL. - //After that we stop using the address, assuming it may not be valid anymore (until we rediscover the node) + // After that we stop using the address, assuming it may not be valid anymore (until we rediscover the node) pstore.AddAddrs(info.ID, info.Addrs, discoveredAddrTTL) _ = pstore.AddPubKey(info.ID, pub) @@ -411,7 +411,7 @@ func (n *NodeP2P) DiscoveryProcess(ctx context.Context, log log.Logger, cfg *rol continue } // skip peers that we were just connected to - if n.Host().Network().Connectedness(id) == network.CannotConnect { + if n.Host().Network().Connectedness(id) == network.Limited { continue } // schedule, if there is still space to schedule (this may block) diff --git a/op-node/p2p/gating/expiry.go b/op-node/p2p/gating/expiry.go index e6f1662b3597..b1d22ce87454 100644 --- a/op-node/p2p/gating/expiry.go +++ b/op-node/p2p/gating/expiry.go @@ -61,7 +61,7 @@ func (g *ExpiryConnectionGater) UnblockPeer(p peer.ID) error { func (g *ExpiryConnectionGater) peerBanExpiryCheck(p peer.ID) (allow bool) { // if the peer is blocked, check if it's time to unblock expiry, err := g.store.GetPeerBanExpiration(p) - if errors.Is(err, store.UnknownBanErr) { + if errors.Is(err, store.ErrUnknownBan) { return true // peer is allowed if it has not been banned } if err != nil { @@ -88,7 +88,7 @@ func (g *ExpiryConnectionGater) addrBanExpiryCheck(ma multiaddr.Multiaddr) (allo } // if just the IP is blocked, check if it's time to unblock expiry, err := g.store.GetIPBanExpiration(ip) - if errors.Is(err, store.UnknownBanErr) { + if errors.Is(err, store.ErrUnknownBan) { return true // IP is allowed if it has not been banned } if err != nil { diff --git a/op-node/p2p/gating/expiry_test.go b/op-node/p2p/gating/expiry_test.go index 453e1d3fe2cb..45b819aa0bf3 100644 --- a/op-node/p2p/gating/expiry_test.go +++ b/op-node/p2p/gating/expiry_test.go @@ -47,7 +47,7 @@ func TestExpiryConnectionGater_InterceptPeerDial(t *testing.T) { t.Run("unknown expiring ban", func(t *testing.T) { _, mockExpiryStore, mockGater, gater := expiryTestSetup(t) mockGater.EXPECT().InterceptPeerDial(mallory).Return(true) - mockExpiryStore.EXPECT().GetPeerBanExpiration(mallory).Return(time.Time{}, store.UnknownBanErr) + mockExpiryStore.EXPECT().GetPeerBanExpiration(mallory).Return(time.Time{}, store.ErrUnknownBan) allow := gater.InterceptPeerDial(mallory) require.True(t, allow) }) @@ -68,7 +68,7 @@ func TestExpiryConnectionGater_InterceptAddrDial(t *testing.T) { t.Run("expired IP ban", func(t *testing.T) { cl, mockExpiryStore, mockGater, gater := expiryTestSetup(t) mockGater.EXPECT().InterceptAddrDial(mallory, addr).Return(true) - mockExpiryStore.EXPECT().GetPeerBanExpiration(mallory).Return(time.Time{}, store.UnknownBanErr) + mockExpiryStore.EXPECT().GetPeerBanExpiration(mallory).Return(time.Time{}, store.ErrUnknownBan) mockExpiryStore.EXPECT().GetIPBanExpiration(ip.To4()).Return(cl.Now().Add(-time.Second), nil) mockExpiryStore.EXPECT().SetIPBanExpiration(ip.To4(), time.Time{}).Return(nil) allow := gater.InterceptAddrDial(mallory, addr) @@ -77,7 +77,7 @@ func TestExpiryConnectionGater_InterceptAddrDial(t *testing.T) { t.Run("active IP ban", func(t *testing.T) { cl, mockExpiryStore, mockGater, gater := expiryTestSetup(t) mockGater.EXPECT().InterceptAddrDial(mallory, addr).Return(true) - mockExpiryStore.EXPECT().GetPeerBanExpiration(mallory).Return(time.Time{}, store.UnknownBanErr) + mockExpiryStore.EXPECT().GetPeerBanExpiration(mallory).Return(time.Time{}, store.ErrUnknownBan) mockExpiryStore.EXPECT().GetIPBanExpiration(ip.To4()).Return(cl.Now().Add(time.Second), nil) allow := gater.InterceptAddrDial(mallory, addr) require.False(t, allow) @@ -85,8 +85,8 @@ func TestExpiryConnectionGater_InterceptAddrDial(t *testing.T) { t.Run("unknown IP ban expiry", func(t *testing.T) { _, mockExpiryStore, mockGater, gater := expiryTestSetup(t) mockGater.EXPECT().InterceptAddrDial(mallory, addr).Return(true) - mockExpiryStore.EXPECT().GetPeerBanExpiration(mallory).Return(time.Time{}, store.UnknownBanErr) - mockExpiryStore.EXPECT().GetIPBanExpiration(ip.To4()).Return(time.Time{}, store.UnknownBanErr) + mockExpiryStore.EXPECT().GetPeerBanExpiration(mallory).Return(time.Time{}, store.ErrUnknownBan) + mockExpiryStore.EXPECT().GetIPBanExpiration(ip.To4()).Return(time.Time{}, store.ErrUnknownBan) allow := gater.InterceptAddrDial(mallory, addr) require.True(t, allow) }) @@ -165,7 +165,7 @@ func TestExpiryConnectionGater_InterceptAccept(t *testing.T) { t.Run("unknown expiry", func(t *testing.T) { _, mockExpiryStore, mockGater, gater := expiryTestSetup(t) mockGater.EXPECT().InterceptAccept(mas).Return(true) - mockExpiryStore.EXPECT().GetIPBanExpiration(ip.To4()).Return(time.Time{}, store.UnknownBanErr) + mockExpiryStore.EXPECT().GetIPBanExpiration(ip.To4()).Return(time.Time{}, store.ErrUnknownBan) allow := gater.InterceptAccept(mas) require.True(t, allow) }) @@ -201,7 +201,7 @@ func TestExpiryConnectionGater_InterceptSecured(t *testing.T) { t.Run("unknown expiry", func(t *testing.T) { _, mockExpiryStore, mockGater, gater := expiryTestSetup(t) mockGater.EXPECT().InterceptSecured(network.DirInbound, mallory, mas).Return(true) - mockExpiryStore.EXPECT().GetPeerBanExpiration(mallory).Return(time.Time{}, store.UnknownBanErr) + mockExpiryStore.EXPECT().GetPeerBanExpiration(mallory).Return(time.Time{}, store.ErrUnknownBan) allow := gater.InterceptSecured(network.DirInbound, mallory, mas) require.True(t, allow) }) diff --git a/op-node/p2p/gossip.go b/op-node/p2p/gossip.go index a2f2443bb589..3efb5824f36d 100644 --- a/op-node/p2p/gossip.go +++ b/op-node/p2p/gossip.go @@ -103,8 +103,11 @@ func BuildMsgIdFn(cfg *rollup.Config) pubsub.MsgIdFunction { if err == nil && dLen <= maxGossipSize { res := msgBufPool.Get().(*[]byte) defer msgBufPool.Put(res) - if data, err = snappy.Decode((*res)[:0], pmsg.Data); err == nil { - *res = data // if we ended up growing the slice capacity, fine, keep the larger one. + if data, err = snappy.Decode((*res)[:cap(*res)], pmsg.Data); err == nil { + if cap(data) > cap(*res) { + // if we ended up growing the slice capacity, fine, keep the larger one. + *res = data[:cap(data)] + } valid = true } } @@ -274,12 +277,15 @@ func BuildBlocksValidator(log log.Logger, cfg *rollup.Config, runCfg GossipRunti res := msgBufPool.Get().(*[]byte) defer msgBufPool.Put(res) - data, err := snappy.Decode((*res)[:0], message.Data) + data, err := snappy.Decode((*res)[:cap(*res)], message.Data) if err != nil { log.Warn("invalid snappy compression", "err", err, "peer", id) return pubsub.ValidationReject } - *res = data // if we ended up growing the slice capacity, fine, keep the larger one. + // if we ended up growing the slice capacity, fine, keep the larger one. + if cap(data) > cap(*res) { + *res = data[:cap(data)] + } // message starts with compact-encoding secp256k1 encoded signature signatureBytes, payloadBytes := data[:65], data[65:] @@ -336,13 +342,13 @@ func BuildBlocksValidator(log log.Logger, cfg *rollup.Config, runCfg GossipRunti return pubsub.ValidationReject } - // [REJECT] if a V2 Block does not have withdrawals + // [REJECT] if a >= V2 Block does not have withdrawals if blockVersion.HasWithdrawals() && payload.Withdrawals == nil { log.Warn("payload is on v2/v3 topic, but does not have withdrawals", "bad_hash", payload.BlockHash.String()) return pubsub.ValidationReject } - // [REJECT] if a V2 Block has non-empty withdrawals + // [REJECT] if a >= V2 Block has non-empty withdrawals if blockVersion.HasWithdrawals() && len(*payload.Withdrawals) != 0 { log.Warn("payload is on v2/v3 topic, but has non-empty withdrawals", "bad_hash", payload.BlockHash.String(), "withdrawal_count", len(*payload.Withdrawals)) return pubsub.ValidationReject diff --git a/op-node/p2p/host.go b/op-node/p2p/host.go index 5e3fba21efca..4e8476267fa4 100644 --- a/op-node/p2p/host.go +++ b/op-node/p2p/host.go @@ -280,10 +280,13 @@ func (conf *Config) Host(log log.Logger, reporter metrics.Reporter, metrics Host } if conf.EnablePingService { - out.pinging = NewPingService(log, + out.pinging = NewPingService( + log, func(ctx context.Context, peerID peer.ID) <-chan ping.Result { return ping.Ping(ctx, h, peerID) - }, h.Network().Peers, clock.SystemClock) + }, + h.Network().Peers, + ) } out.initStaticPeers() diff --git a/op-node/p2p/host_test.go b/op-node/p2p/host_test.go index 3fcfb7714c26..2bab3239e55e 100644 --- a/op-node/p2p/host_test.go +++ b/op-node/p2p/host_test.go @@ -11,7 +11,7 @@ import ( ds "github.com/ipfs/go-datastore" "github.com/ipfs/go-datastore/sync" - "github.com/libp2p/go-libp2p" + libp2p "github.com/libp2p/go-libp2p" "github.com/libp2p/go-libp2p/core/crypto" "github.com/libp2p/go-libp2p/core/network" "github.com/libp2p/go-libp2p/core/peer" diff --git a/op-node/p2p/monitor/peer_monitor_test.go b/op-node/p2p/monitor/peer_monitor_test.go index 815e0531497c..ffca429b8a52 100644 --- a/op-node/p2p/monitor/peer_monitor_test.go +++ b/op-node/p2p/monitor/peer_monitor_test.go @@ -30,10 +30,15 @@ func TestPeriodicallyCheckNextPeer(t *testing.T) { // Each time a step is performed, it calls Done on the wait group so we can wait for it to be performed stepCh := make(chan struct{}, 10) monitor.bgTasks.Add(1) - var actionErr error + actionErr := make(chan error, 1) go monitor.background(func() error { stepCh <- struct{}{} - return actionErr + select { + case err := <-actionErr: + return err + default: + return nil + } }) defer monitor.Stop() // Wait for the step ticker to be started @@ -47,7 +52,7 @@ func TestPeriodicallyCheckNextPeer(t *testing.T) { } // Should continue executing periodically even after an error - actionErr = errors.New("boom") + actionErr <- errors.New("boom") for i := 0; i < 5; i++ { clock.AdvanceTime(checkInterval) waitForChan(t, stepCh, fmt.Sprintf("Did not perform step %v", i)) diff --git a/op-node/p2p/node.go b/op-node/p2p/node.go index 4c88556ddd9c..85da1686acd7 100644 --- a/op-node/p2p/node.go +++ b/op-node/p2p/node.go @@ -52,10 +52,23 @@ type NodeP2P struct { // NewNodeP2P creates a new p2p node, and returns a reference to it. If the p2p is disabled, it returns nil. // If metrics are configured, a bandwidth monitor will be spawned in a goroutine. -func NewNodeP2P(resourcesCtx context.Context, rollupCfg *rollup.Config, log log.Logger, setup SetupP2P, gossipIn GossipIn, l2Chain L2Chain, runCfg GossipRuntimeConfig, metrics metrics.Metricer, elSyncEnabled bool) (*NodeP2P, error) { +func NewNodeP2P( + resourcesCtx context.Context, + rollupCfg *rollup.Config, + log log.Logger, + setup SetupP2P, + gossipIn GossipIn, + l2Chain L2Chain, + runCfg GossipRuntimeConfig, + metrics metrics.Metricer, + elSyncEnabled bool, +) (*NodeP2P, error) { if setup == nil { return nil, errors.New("p2p node cannot be created without setup") } + if setup.Disabled() { + return nil, errors.New("SetupP2P.Disabled is true") + } var n NodeP2P if err := n.init(resourcesCtx, rollupCfg, log, setup, gossipIn, l2Chain, runCfg, metrics, elSyncEnabled); err != nil { closeErr := n.Close() @@ -65,12 +78,24 @@ func NewNodeP2P(resourcesCtx context.Context, rollupCfg *rollup.Config, log log. return nil, err } if n.host == nil { - return nil, nil + // See prior comment about n.host optionality: + // TODO: host is not optional, NodeP2P as a whole is. + panic("host is not optional if p2p is enabled") } return &n, nil } -func (n *NodeP2P) init(resourcesCtx context.Context, rollupCfg *rollup.Config, log log.Logger, setup SetupP2P, gossipIn GossipIn, l2Chain L2Chain, runCfg GossipRuntimeConfig, metrics metrics.Metricer, elSyncEnabled bool) error { +func (n *NodeP2P) init( + resourcesCtx context.Context, + rollupCfg *rollup.Config, + log log.Logger, + setup SetupP2P, + gossipIn GossipIn, + l2Chain L2Chain, + runCfg GossipRuntimeConfig, + metrics metrics.Metricer, + elSyncEnabled bool, +) error { bwc := p2pmetrics.NewBandwidthCounter() n.log = log @@ -85,86 +110,83 @@ func (n *NodeP2P) init(resourcesCtx context.Context, rollupCfg *rollup.Config, l return fmt.Errorf("failed to start p2p host: %w", err) } - // TODO(CLI-4016): host is not optional, NodeP2P as a whole is. This if statement is wrong - if n.host != nil { - // Enable extra features, if any. During testing we don't setup the most advanced host all the time. - if extra, ok := n.host.(ExtraHostFeatures); ok { - n.gater = extra.ConnectionGater() - n.connMgr = extra.ConnectionManager() - } - eps, ok := n.host.Peerstore().(store.ExtendedPeerstore) - if !ok { - return fmt.Errorf("cannot init without extended peerstore: %w", err) - } - n.store = eps - scoreParams := setup.PeerScoringParams() + // Enable extra features, if any. During testing we don't setup the most advanced host all the time. + if extra, ok := n.host.(ExtraHostFeatures); ok { + n.gater = extra.ConnectionGater() + n.connMgr = extra.ConnectionManager() + } + eps, ok := n.host.Peerstore().(store.ExtendedPeerstore) + if !ok { + return fmt.Errorf("cannot init without extended peerstore: %w", err) + } + n.store = eps + scoreParams := setup.PeerScoringParams() - if scoreParams != nil { - n.appScorer = newPeerApplicationScorer(resourcesCtx, log, clock.SystemClock, &scoreParams.ApplicationScoring, eps, n.host.Network().Peers) - } else { - n.appScorer = &NoopApplicationScorer{} - } - // Activate the P2P req-resp sync if enabled by feature-flag. - if setup.ReqRespSyncEnabled() && !elSyncEnabled { - n.syncCl = NewSyncClient(log, rollupCfg, n.host, gossipIn.OnUnsafeL2Payload, metrics, n.appScorer) - n.host.Network().Notify(&network.NotifyBundle{ - ConnectedF: func(nw network.Network, conn network.Conn) { - n.syncCl.AddPeer(conn.RemotePeer()) - }, - DisconnectedF: func(nw network.Network, conn network.Conn) { - // only when no connection is available, we can remove the peer - if nw.Connectedness(conn.RemotePeer()) == network.NotConnected { - n.syncCl.RemovePeer(conn.RemotePeer()) - } - }, - }) - n.syncCl.Start() - // the host may already be connected to peers, add them all to the sync client - for _, peerID := range n.host.Network().Peers() { - n.syncCl.AddPeer(peerID) - } - if l2Chain != nil { // Only enable serving side of req-resp sync if we have a data-source, to make minimal P2P testing easy - n.syncSrv = NewReqRespServer(rollupCfg, l2Chain, metrics) - // register the sync protocol with libp2p host - payloadByNumber := MakeStreamHandler(resourcesCtx, log.New("serve", "payloads_by_number"), n.syncSrv.HandleSyncRequest) - n.host.SetStreamHandler(PayloadByNumberProtocolID(rollupCfg.L2ChainID), payloadByNumber) - } + if scoreParams != nil { + n.appScorer = newPeerApplicationScorer(resourcesCtx, log, clock.SystemClock, &scoreParams.ApplicationScoring, eps, n.host.Network().Peers) + } else { + n.appScorer = &NoopApplicationScorer{} + } + // Activate the P2P req-resp sync if enabled by feature-flag. + if setup.ReqRespSyncEnabled() && !elSyncEnabled { + n.syncCl = NewSyncClient(log, rollupCfg, n.host, gossipIn.OnUnsafeL2Payload, metrics, n.appScorer) + n.host.Network().Notify(&network.NotifyBundle{ + ConnectedF: func(nw network.Network, conn network.Conn) { + n.syncCl.AddPeer(conn.RemotePeer()) + }, + DisconnectedF: func(nw network.Network, conn network.Conn) { + // only when no connection is available, we can remove the peer + if nw.Connectedness(conn.RemotePeer()) == network.NotConnected { + n.syncCl.RemovePeer(conn.RemotePeer()) + } + }, + }) + n.syncCl.Start() + // the host may already be connected to peers, add them all to the sync client + for _, peerID := range n.host.Network().Peers() { + n.syncCl.AddPeer(peerID) } - n.scorer = NewScorer(rollupCfg, eps, metrics, n.appScorer, log) - // notify of any new connections/streams/etc. - n.host.Network().Notify(NewNetworkNotifier(log, metrics)) - // note: the IDDelta functionality was removed from libP2P, and no longer needs to be explicitly disabled. - n.gs, err = NewGossipSub(resourcesCtx, n.host, rollupCfg, setup, n.scorer, metrics, log) - if err != nil { - return fmt.Errorf("failed to start gossipsub router: %w", err) + if l2Chain != nil { // Only enable serving side of req-resp sync if we have a data-source, to make minimal P2P testing easy + n.syncSrv = NewReqRespServer(rollupCfg, l2Chain, metrics) + // register the sync protocol with libp2p host + payloadByNumber := MakeStreamHandler(resourcesCtx, log.New("serve", "payloads_by_number"), n.syncSrv.HandleSyncRequest) + n.host.SetStreamHandler(PayloadByNumberProtocolID(rollupCfg.L2ChainID), payloadByNumber) } - n.gsOut, err = JoinGossip(n.host.ID(), n.gs, log, rollupCfg, runCfg, gossipIn) - if err != nil { - return fmt.Errorf("failed to join blocks gossip topic: %w", err) - } - log.Info("started p2p host", "addrs", n.host.Addrs(), "peerID", n.host.ID().String()) + } + n.scorer = NewScorer(rollupCfg, eps, metrics, n.appScorer, log) + // notify of any new connections/streams/etc. + n.host.Network().Notify(NewNetworkNotifier(log, metrics)) + // note: the IDDelta functionality was removed from libP2P, and no longer needs to be explicitly disabled. + n.gs, err = NewGossipSub(resourcesCtx, n.host, rollupCfg, setup, n.scorer, metrics, log) + if err != nil { + return fmt.Errorf("failed to start gossipsub router: %w", err) + } + n.gsOut, err = JoinGossip(n.host.ID(), n.gs, log, rollupCfg, runCfg, gossipIn) + if err != nil { + return fmt.Errorf("failed to join blocks gossip topic: %w", err) + } + log.Info("started p2p host", "addrs", n.host.Addrs(), "peerID", n.host.ID().String()) - tcpPort, err := FindActiveTCPPort(n.host) - if err != nil { - log.Warn("failed to find what TCP port p2p is binded to", "err", err) - } + tcpPort, err := FindActiveTCPPort(n.host) + if err != nil { + log.Warn("failed to find what TCP port p2p is binded to", "err", err) + } - // All nil if disabled. - n.dv5Local, n.dv5Udp, err = setup.Discovery(log.New("p2p", "discv5"), rollupCfg, tcpPort) - if err != nil { - return fmt.Errorf("failed to start discv5: %w", err) - } + // All nil if disabled. + n.dv5Local, n.dv5Udp, err = setup.Discovery(log.New("p2p", "discv5"), rollupCfg, tcpPort) + if err != nil { + return fmt.Errorf("failed to start discv5: %w", err) + } - if metrics != nil { - go metrics.RecordBandwidth(resourcesCtx, bwc) - } + if metrics != nil { + go metrics.RecordBandwidth(resourcesCtx, bwc) + } - if setup.BanPeers() { - n.peerMonitor = monitor.NewPeerMonitor(resourcesCtx, log, clock.SystemClock, n, setup.BanThreshold(), setup.BanDuration()) - n.peerMonitor.Start() - } - n.appScorer.start() + if setup.BanPeers() { + n.peerMonitor = monitor.NewPeerMonitor(resourcesCtx, log, clock.SystemClock, n, setup.BanThreshold(), setup.BanDuration()) + n.peerMonitor.Start() } + n.appScorer.start() return nil } diff --git a/op-node/p2p/pings.go b/op-node/p2p/pings.go index bae2630959f2..9d1c8f5d9ead 100644 --- a/op-node/p2p/pings.go +++ b/op-node/p2p/pings.go @@ -41,7 +41,21 @@ type PingService struct { wg sync.WaitGroup } -func NewPingService(log log.Logger, ping PingFn, peers PeersFn, clock clock.Clock) *PingService { +func NewPingService( + log log.Logger, + ping PingFn, + peers PeersFn, +) *PingService { + return newTracedPingService(log, ping, peers, clock.SystemClock, nil) +} + +func newTracedPingService( + log log.Logger, + ping PingFn, + peers PeersFn, + clock clock.Clock, + trace func(work string), +) *PingService { ctx, cancel := context.WithCancel(context.Background()) srv := &PingService{ ping: ping, @@ -50,6 +64,7 @@ func NewPingService(log log.Logger, ping PingFn, peers PeersFn, clock clock.Cloc clock: clock, ctx: ctx, cancel: cancel, + trace: trace, } srv.wg.Add(1) go srv.pingPeersBackground() diff --git a/op-node/p2p/pings_test.go b/op-node/p2p/pings_test.go index 75aa6fd93595..fce3ad6c0ffe 100644 --- a/op-node/p2p/pings_test.go +++ b/op-node/p2p/pings_test.go @@ -3,6 +3,7 @@ package p2p import ( "context" "errors" + "log/slog" "sync/atomic" "testing" "time" @@ -10,7 +11,6 @@ import ( "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" @@ -51,12 +51,10 @@ func TestPingService(t *testing.T) { return peers }) - srv := NewPingService(log, pingFn, peersFn, fakeClock) - trace := make(chan string) - srv.trace = func(work string) { + srv := newTracedPingService(log, pingFn, peersFn, fakeClock, func(work string) { trace <- work - } + }) // wait for ping service to get online require.Equal(t, "started", <-trace) diff --git a/op-node/p2p/store/iface.go b/op-node/p2p/store/iface.go index 5961481bf28a..a83b5ae06e43 100644 --- a/op-node/p2p/store/iface.go +++ b/op-node/p2p/store/iface.go @@ -102,13 +102,13 @@ type ScoreDiff interface { Apply(score *scoreRecord) } -var UnknownBanErr = errors.New("unknown ban") +var ErrUnknownBan = errors.New("unknown ban") type PeerBanStore interface { // SetPeerBanExpiration create the peer ban with expiration time. // If expiry == time.Time{} then the ban is deleted. SetPeerBanExpiration(id peer.ID, expiry time.Time) error - // GetPeerBanExpiration gets the peer ban expiration time, or UnknownBanErr error if none exists. + // GetPeerBanExpiration gets the peer ban expiration time, or ErrUnknownBan error if none exists. GetPeerBanExpiration(id peer.ID) (time.Time, error) } @@ -116,7 +116,7 @@ type IPBanStore interface { // SetIPBanExpiration create the IP ban with expiration time. // If expiry == time.Time{} then the ban is deleted. SetIPBanExpiration(ip net.IP, expiry time.Time) error - // GetIPBanExpiration gets the IP ban expiration time, or UnknownBanErr error if none exists. + // GetIPBanExpiration gets the IP ban expiration time, or ErrUnknownBan error if none exists. GetIPBanExpiration(ip net.IP) (time.Time, error) } diff --git a/op-node/p2p/store/ip_ban_book.go b/op-node/p2p/store/ip_ban_book.go index 475bf21a791c..8ba4d151cd58 100644 --- a/op-node/p2p/store/ip_ban_book.go +++ b/op-node/p2p/store/ip_ban_book.go @@ -4,6 +4,7 @@ import ( "context" "encoding/json" "net" + "sync" "time" "github.com/ethereum-optimism/optimism/op-service/clock" @@ -46,19 +47,16 @@ func (p ipBanUpdate) Apply(rec *ipBanRecord) { } type ipBanBook struct { + mu sync.RWMutex book *recordsBook[string, *ipBanRecord] } -func newIPBanRecord() *ipBanRecord { - return new(ipBanRecord) -} - func ipKey(ip string) ds.Key { return ds.NewKey(ip) } func newIPBanBook(ctx context.Context, logger log.Logger, clock clock.Clock, store ds.Batching) (*ipBanBook, error) { - book, err := newRecordsBook[string, *ipBanRecord](ctx, logger, clock, store, ipBanCacheSize, ipBanRecordExpiration, ipBanExpirationsBase, newIPBanRecord, ipKey) + book, err := newRecordsBook[string, *ipBanRecord](ctx, logger, clock, store, ipBanCacheSize, ipBanRecordExpiration, ipBanExpirationsBase, genNew, ipKey) if err != nil { return nil, err } @@ -70,9 +68,11 @@ func (d *ipBanBook) startGC() { } func (d *ipBanBook) GetIPBanExpiration(ip net.IP) (time.Time, error) { + d.mu.RLock() + defer d.mu.RUnlock() rec, err := d.book.getRecord(ip.To16().String()) - if err == UnknownRecordErr { - return time.Time{}, UnknownBanErr + if err == errUnknownRecord { + return time.Time{}, ErrUnknownBan } if err != nil { return time.Time{}, err @@ -81,10 +81,12 @@ func (d *ipBanBook) GetIPBanExpiration(ip net.IP) (time.Time, error) { } func (d *ipBanBook) SetIPBanExpiration(ip net.IP, expirationTime time.Time) error { + d.mu.Lock() + defer d.mu.Unlock() if expirationTime == (time.Time{}) { return d.book.deleteRecord(ip.To16().String()) } - _, err := d.book.SetRecord(ip.To16().String(), ipBanUpdate(expirationTime)) + _, err := d.book.setRecord(ip.To16().String(), ipBanUpdate(expirationTime)) return err } diff --git a/op-node/p2p/store/ip_ban_book_test.go b/op-node/p2p/store/ip_ban_book_test.go index 24d3574e0c93..d699c007eb5e 100644 --- a/op-node/p2p/store/ip_ban_book_test.go +++ b/op-node/p2p/store/ip_ban_book_test.go @@ -18,7 +18,7 @@ func TestGetUnknownIPBan(t *testing.T) { book := createMemoryIPBanBook(t) defer book.Close() exp, err := book.GetIPBanExpiration(net.IPv4(1, 2, 3, 4)) - require.Same(t, UnknownBanErr, err) + require.Same(t, ErrUnknownBan, err) require.Equal(t, time.Time{}, exp) } diff --git a/op-node/p2p/store/mdbook.go b/op-node/p2p/store/mdbook.go index 6c1362674956..eeac94d06c76 100644 --- a/op-node/p2p/store/mdbook.go +++ b/op-node/p2p/store/mdbook.go @@ -3,6 +3,7 @@ package store import ( "context" "encoding/json" + "sync" "sync/atomic" "time" @@ -47,6 +48,7 @@ func (m *metadataRecord) UnmarshalBinary(data []byte) error { } type metadataBook struct { + mu sync.RWMutex book *recordsBook[peer.ID, *metadataRecord] } @@ -55,7 +57,7 @@ func newMetadataRecord() *metadataRecord { } func newMetadataBook(ctx context.Context, logger log.Logger, clock clock.Clock, store ds.Batching) (*metadataBook, error) { - book, err := newRecordsBook[peer.ID, *metadataRecord](ctx, logger, clock, store, mdCacheSize, mdRecordExpiration, metadataBase, newMetadataRecord, peerIDKey) + book, err := newRecordsBook[peer.ID, *metadataRecord](ctx, logger, clock, store, mdCacheSize, mdRecordExpiration, metadataBase, genNew, peerIDKey) if err != nil { return nil, err } @@ -67,9 +69,11 @@ func (m *metadataBook) startGC() { } func (m *metadataBook) GetPeerMetadata(id peer.ID) (PeerMetadata, error) { + m.mu.RLock() + defer m.mu.RUnlock() record, err := m.book.getRecord(id) // If the record is not found, return an empty PeerMetadata - if err == UnknownRecordErr { + if err == errUnknownRecord { return PeerMetadata{}, nil } if err != nil { @@ -89,7 +93,9 @@ func (m *metadataBook) SetPeerMetadata(id peer.ID, md PeerMetadata) (PeerMetadat rec := newMetadataRecord() rec.PeerMetadata = md rec.SetLastUpdated(m.book.clock.Now()) - v, err := m.book.SetRecord(id, rec) + m.mu.Lock() + defer m.mu.Unlock() + v, err := m.book.setRecord(id, rec) return v.PeerMetadata, err } diff --git a/op-node/p2p/store/peer_ban_book.go b/op-node/p2p/store/peer_ban_book.go index 1e61f8c6eae9..cb61ef38f4e9 100644 --- a/op-node/p2p/store/peer_ban_book.go +++ b/op-node/p2p/store/peer_ban_book.go @@ -3,6 +3,7 @@ package store import ( "context" "encoding/json" + "sync" "time" "github.com/ethereum-optimism/optimism/op-service/clock" @@ -46,15 +47,12 @@ func (p peerBanUpdate) Apply(rec *peerBanRecord) { } type peerBanBook struct { + mu sync.RWMutex book *recordsBook[peer.ID, *peerBanRecord] } -func newPeerBanRecord() *peerBanRecord { - return new(peerBanRecord) -} - func newPeerBanBook(ctx context.Context, logger log.Logger, clock clock.Clock, store ds.Batching) (*peerBanBook, error) { - book, err := newRecordsBook[peer.ID, *peerBanRecord](ctx, logger, clock, store, peerBanCacheSize, peerBanRecordExpiration, peerBanExpirationsBase, newPeerBanRecord, peerIDKey) + book, err := newRecordsBook[peer.ID, *peerBanRecord](ctx, logger, clock, store, peerBanCacheSize, peerBanRecordExpiration, peerBanExpirationsBase, genNew, peerIDKey) if err != nil { return nil, err } @@ -66,9 +64,11 @@ func (d *peerBanBook) startGC() { } func (d *peerBanBook) GetPeerBanExpiration(id peer.ID) (time.Time, error) { + d.mu.RLock() + defer d.mu.RUnlock() rec, err := d.book.getRecord(id) - if err == UnknownRecordErr { - return time.Time{}, UnknownBanErr + if err == errUnknownRecord { + return time.Time{}, ErrUnknownBan } if err != nil { return time.Time{}, err @@ -77,10 +77,12 @@ func (d *peerBanBook) GetPeerBanExpiration(id peer.ID) (time.Time, error) { } func (d *peerBanBook) SetPeerBanExpiration(id peer.ID, expirationTime time.Time) error { + d.mu.Lock() + defer d.mu.Unlock() if expirationTime == (time.Time{}) { return d.book.deleteRecord(id) } - _, err := d.book.SetRecord(id, peerBanUpdate(expirationTime)) + _, err := d.book.setRecord(id, peerBanUpdate(expirationTime)) return err } diff --git a/op-node/p2p/store/peer_ban_book_test.go b/op-node/p2p/store/peer_ban_book_test.go index 580dea3a3e8e..f63206ff0076 100644 --- a/op-node/p2p/store/peer_ban_book_test.go +++ b/op-node/p2p/store/peer_ban_book_test.go @@ -17,7 +17,7 @@ func TestGetUnknownPeerBan(t *testing.T) { book := createMemoryPeerBanBook(t) defer book.Close() exp, err := book.GetPeerBanExpiration("a") - require.Same(t, UnknownBanErr, err) + require.Same(t, ErrUnknownBan, err) require.Equal(t, time.Time{}, exp) } diff --git a/op-node/p2p/store/records_book.go b/op-node/p2p/store/records_book.go index 9afac37abfbb..0c573df4d984 100644 --- a/op-node/p2p/store/records_book.go +++ b/op-node/p2p/store/records_book.go @@ -30,11 +30,15 @@ type recordDiff[V record] interface { Apply(v V) } -var UnknownRecordErr = errors.New("unknown record") +var errUnknownRecord = errors.New("unknown record") + +func genNew[T any]() *T { + return new(T) +} // recordsBook is a generic K-V store to embed in the extended-peerstore. // It prunes old entries to keep the store small. -// The recordsBook can be wrapped to customize typing more. +// The recordsBook can be wrapped to customize typing and introduce synchronization. type recordsBook[K ~string, V record] struct { ctx context.Context cancelFn context.CancelFunc @@ -47,7 +51,6 @@ type recordsBook[K ~string, V record] struct { dsBaseKey ds.Key dsEntryKey func(K) ds.Key recordExpiry time.Duration // pruning is disabled if this is 0 - sync.RWMutex } func newRecordsBook[K ~string, V record](ctx context.Context, logger log.Logger, clock clock.Clock, store ds.Batching, cacheSize int, recordExpiry time.Duration, @@ -80,36 +83,34 @@ func (d *recordsBook[K, V]) startGC() { startGc(d.ctx, d.log, d.clock, &d.bgTasks, d.prune) } -func (d *recordsBook[K, V]) GetRecord(key K) (V, error) { - d.RLock() - defer d.RUnlock() - rec, err := d.getRecord(key) - return rec, err -} - func (d *recordsBook[K, V]) dsKey(key K) ds.Key { return d.dsBaseKey.Child(d.dsEntryKey(key)) } func (d *recordsBook[K, V]) deleteRecord(key K) error { - d.cache.Remove(key) + // If access to this isn't synchronized, removing from the cache first can result in the stored + // item being cached again before it is deleted. err := d.store.Delete(d.ctx, d.dsKey(key)) + d.cache.Remove(key) if err == nil || errors.Is(err, ds.ErrNotFound) { return nil } return fmt.Errorf("failed to delete entry with key %v: %w", key, err) } +// You must read lock the recordsBook before calling this, and only unlock when you have extracted +// the values you want from the value of type V. There's no way to conveniently pass an extractor +// function parameterized on V here without breaking this out into a top-level function. func (d *recordsBook[K, V]) getRecord(key K) (v V, err error) { if val, ok := d.cache.Get(key); ok { if d.hasExpired(val) { - return v, UnknownRecordErr + return v, errUnknownRecord } return val, nil } data, err := d.store.Get(d.ctx, d.dsKey(key)) if errors.Is(err, ds.ErrNotFound) { - return v, UnknownRecordErr + return v, errUnknownRecord } else if err != nil { return v, fmt.Errorf("failed to load value of key %v: %w", key, err) } @@ -118,17 +119,18 @@ func (d *recordsBook[K, V]) getRecord(key K) (v V, err error) { return v, fmt.Errorf("invalid value for key %v: %w", key, err) } if d.hasExpired(v) { - return v, UnknownRecordErr + return v, errUnknownRecord } + // This is safe with a read lock as it's self-synchronized. d.cache.Add(key, v) return v, nil } -func (d *recordsBook[K, V]) SetRecord(key K, diff recordDiff[V]) (V, error) { - d.Lock() - defer d.Unlock() +// You should lock the records book before calling this, and unlock it when you copy any values out +// of the returned value. +func (d *recordsBook[K, V]) setRecord(key K, diff recordDiff[V]) (V, error) { rec, err := d.getRecord(key) - if err == UnknownRecordErr { // instantiate new record if it does not exist yet + if err == errUnknownRecord { // instantiate new record if it does not exist yet rec = d.newRecord() } else if err != nil { return d.newRecord(), err diff --git a/op-node/p2p/store/scorebook.go b/op-node/p2p/store/scorebook.go index 68043ef8a9e1..9a7c03d4b841 100644 --- a/op-node/p2p/store/scorebook.go +++ b/op-node/p2p/store/scorebook.go @@ -2,6 +2,7 @@ package store import ( "context" + "sync" "sync/atomic" "time" @@ -18,7 +19,8 @@ const ( var scoresBase = ds.NewKey("/peers/scores") -// LastUpdate requires atomic update operations. Use the helper functions SetLastUpdated and LastUpdated to modify and access this field. +// LastUpdate requires atomic update operations. Use the helper functions SetLastUpdated and +// LastUpdated to modify and access this field. type scoreRecord struct { LastUpdate int64 `json:"lastUpdate"` // unix timestamp in seconds PeerScores PeerScores `json:"peerScores"` @@ -46,19 +48,16 @@ func (s *scoreRecord) UnmarshalBinary(data []byte) error { } type scoreBook struct { + mu sync.RWMutex book *recordsBook[peer.ID, *scoreRecord] } -func newScoreRecord() *scoreRecord { - return new(scoreRecord) -} - func peerIDKey(id peer.ID) ds.Key { return ds.NewKey(base32.RawStdEncoding.EncodeToString([]byte(id))) } func newScoreBook(ctx context.Context, logger log.Logger, clock clock.Clock, store ds.Batching, retain time.Duration) (*scoreBook, error) { - book, err := newRecordsBook[peer.ID, *scoreRecord](ctx, logger, clock, store, scoreCacheSize, retain, scoresBase, newScoreRecord, peerIDKey) + book, err := newRecordsBook[peer.ID, *scoreRecord](ctx, logger, clock, store, scoreCacheSize, retain, scoresBase, genNew, peerIDKey) if err != nil { return nil, err } @@ -70,8 +69,10 @@ func (d *scoreBook) startGC() { } func (d *scoreBook) GetPeerScores(id peer.ID) (PeerScores, error) { + d.mu.RLock() + defer d.mu.RUnlock() record, err := d.book.getRecord(id) - if err == UnknownRecordErr { + if err == errUnknownRecord { return PeerScores{}, nil // return zeroed scores by default } if err != nil { @@ -89,7 +90,9 @@ func (d *scoreBook) GetPeerScore(id peer.ID) (float64, error) { } func (d *scoreBook) SetScore(id peer.ID, diff ScoreDiff) (PeerScores, error) { - v, err := d.book.SetRecord(id, diff) + d.mu.Lock() + defer d.mu.Unlock() + v, err := d.book.setRecord(id, diff) return v.PeerScores, err } diff --git a/op-node/p2p/sync.go b/op-node/p2p/sync.go index 7274c74bd2e0..c8777fe51f92 100644 --- a/op-node/p2p/sync.go +++ b/op-node/p2p/sync.go @@ -57,7 +57,7 @@ const ( // If the client hits a request error, it counts as a lot of rate-limit tokens for syncing from that peer: // we rather sync from other servers. We'll try again later, // and eventually kick the peer based on degraded scoring if it's really not serving us well. - // TODO(CLI-4009): Use a backoff rather than this mechanism. + // TODO: Use a backoff rather than this mechanism. clientErrRateCost = peerServerBlocksBurst ) @@ -68,6 +68,13 @@ const ( ResultCodeUnknownErr byte = 3 ) +var resultCodeString = []string{ + "success", + "not found", + "invalid request", + "unknown error", +} + func PayloadByNumberProtocolID(l2ChainID *big.Int) protocol.ID { return protocol.ID(fmt.Sprintf("/opstack/req/payload_by_number/%d/0", l2ChainID)) } @@ -303,7 +310,7 @@ func NewSyncClient(log log.Logger, cfg *rollup.Config, host HostNewStream, rcv r } // 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, + // TODO: 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. q, _ := simplelru.NewLRU[common.Hash, syncResult](100, c.onQuarantineEvict) c.quarantine = q @@ -630,7 +637,13 @@ func (s *SyncClient) peerLoop(ctx context.Context, id peer.ID) { type requestResultErr byte func (r requestResultErr) Error() string { - return fmt.Sprintf("peer failed to serve request with code %d", uint8(r)) + var errStr string + if ri := int(r); ri < len(resultCodeString) { + errStr = resultCodeString[ri] + } else { + errStr = "invalid code" + } + return fmt.Sprintf("peer failed to serve request with code %d: %s", uint8(r), errStr) } func (r requestResultErr) ResultCode() byte { @@ -820,7 +833,7 @@ func (srv *ReqRespServer) HandleSyncRequest(ctx context.Context, log log.Logger, log.Warn("failed to serve p2p sync request", "req", req, "err", err) if errors.Is(err, ethereum.NotFound) { resultCode = ResultCodeNotFoundErr - } else if errors.Is(err, invalidRequestErr) { + } else if errors.Is(err, errInvalidRequest) { resultCode = ResultCodeInvalidErr } else { resultCode = ResultCodeUnknownErr @@ -833,7 +846,7 @@ func (srv *ReqRespServer) HandleSyncRequest(ctx context.Context, log log.Logger, srv.metrics.ServerPayloadByNumberEvent(req, resultCode, time.Since(start)) } -var invalidRequestErr = errors.New("invalid request") +var errInvalidRequest = errors.New("invalid request") func (srv *ReqRespServer) handleSyncRequest(ctx context.Context, stream network.Stream) (uint64, error) { peerId := stream.Conn().RemotePeer() @@ -879,14 +892,14 @@ func (srv *ReqRespServer) handleSyncRequest(ctx context.Context, stream network. // Check the request is within the expected range of blocks if req < srv.cfg.Genesis.L2.Number { - return req, fmt.Errorf("cannot serve request for L2 block %d before genesis %d: %w", req, srv.cfg.Genesis.L2.Number, invalidRequestErr) + return req, fmt.Errorf("cannot serve request for L2 block %d before genesis %d: %w", req, srv.cfg.Genesis.L2.Number, errInvalidRequest) } max, err := srv.cfg.TargetBlockNumber(uint64(time.Now().Unix())) if err != nil { - return req, fmt.Errorf("cannot determine max target block number to verify request: %w", invalidRequestErr) + return req, fmt.Errorf("cannot determine max target block number to verify request: %w", errInvalidRequest) } if req > max { - return req, fmt.Errorf("cannot serve request for L2 block %d after max expected block (%v): %w", req, max, invalidRequestErr) + return req, fmt.Errorf("cannot serve request for L2 block %d after max expected block (%v): %w", req, max, errInvalidRequest) } envelope, err := srv.l2.PayloadByNumber(ctx, req) diff --git a/op-node/p2p/sync_test.go b/op-node/p2p/sync_test.go index 73c265311c33..7c0b3350df04 100644 --- a/op-node/p2p/sync_test.go +++ b/op-node/p2p/sync_test.go @@ -2,7 +2,9 @@ package p2p import ( "context" + "fmt" "math/big" + "strings" "sync" "testing" "time" @@ -378,7 +380,7 @@ func TestNetworkNotifyAddPeerAndRemovePeer(t *testing.T) { require.NoError(t, err, "failed to connect to peer B from peer A") require.Equal(t, hostA.Network().Connectedness(hostB.ID()), network.Connected) - //wait for async add process done + // wait for async add process done <-waitChan _, ok := syncCl.peers[hostB.ID()] require.True(t, ok, "peerB should exist in syncClient") @@ -386,10 +388,15 @@ func TestNetworkNotifyAddPeerAndRemovePeer(t *testing.T) { err = hostA.Network().ClosePeer(hostB.ID()) require.NoError(t, err, "close peer fail") - //wait for async removing process done + // wait for async removing process done <-waitChan + syncCl.peersLock.Lock() + // Technically this can't fail since SyncClient.RemovePeer also deletes from the + // SyncClient.peers, so unless that action is deferred to SyncClient.peerLoop it's not very + // interesting. _, peerBExist3 := syncCl.peers[hostB.ID()] - require.True(t, !peerBExist3, "peerB should not exist in syncClient") + syncCl.peersLock.Unlock() + require.False(t, peerBExist3, "peerB should not exist in syncClient") } func TestPanicGuard(t *testing.T) { @@ -400,5 +407,44 @@ func TestPanicGuard(t *testing.T) { err := panicGuard(mockPanickingFn)(context.Background(), peer.ID(""), 37) require.EqualError(t, err, "recovered from a panic: gotcha") }) +} +func TestRequestResultErr_Error(t *testing.T) { + for _, test := range []struct { + code byte + expStr string + }{ + { + code: 0, + expStr: "success", + }, + { + code: 1, + expStr: "not found", + }, + { + code: 2, + expStr: "invalid request", + }, + { + code: 3, + expStr: "unknown error", + }, + { + code: 4, + expStr: "invalid code", + }, + { + code: 0xff, + expStr: "invalid code", + }, + } { + t.Run(fmt.Sprintf("code %d", test.code), func(t *testing.T) { + err := requestResultErr(test.code) + errStr := err.Error() + if !strings.HasSuffix(errStr, test.expStr) { + t.Fatalf("unexpected error string %q, expted suffix %q", errStr, test.expStr) + } + }) + } } diff --git a/op-node/params/constants.go b/op-node/params/constants.go new file mode 100644 index 000000000000..7b83fa221549 --- /dev/null +++ b/op-node/params/constants.go @@ -0,0 +1,6 @@ +package params + +const ( + // Post-Granite constant: Number of L1 blocks between when a channel can be opened and when it must be closed by. + ChannelTimeoutGranite uint64 = 50 +) diff --git a/op-node/rollup/async/asyncgossiper.go b/op-node/rollup/async/asyncgossiper.go index 693024ff0223..969edc9987e9 100644 --- a/op-node/rollup/async/asyncgossiper.go +++ b/op-node/rollup/async/asyncgossiper.go @@ -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/attributes/attributes.go b/op-node/rollup/attributes/attributes.go new file mode 100644 index 000000000000..4ebb27050882 --- /dev/null +++ b/op-node/rollup/attributes/attributes.go @@ -0,0 +1,202 @@ +package attributes + +import ( + "context" + "errors" + "fmt" + "sync" + "time" + + "github.com/ethereum/go-ethereum" + "github.com/ethereum/go-ethereum/log" + + "github.com/ethereum-optimism/optimism/op-node/rollup" + "github.com/ethereum-optimism/optimism/op-node/rollup/derive" + "github.com/ethereum-optimism/optimism/op-node/rollup/engine" + "github.com/ethereum-optimism/optimism/op-node/rollup/event" + "github.com/ethereum-optimism/optimism/op-service/eth" +) + +type L2 interface { + PayloadByNumber(context.Context, uint64) (*eth.ExecutionPayloadEnvelope, error) +} + +type AttributesHandler struct { + log log.Logger + cfg *rollup.Config + + // when the rollup node shuts down, stop any in-flight sub-processes of the attributes-handler + ctx context.Context + + l2 L2 + + mu sync.Mutex + + emitter event.Emitter + + attributes *derive.AttributesWithParent + sentAttributes bool +} + +func NewAttributesHandler(log log.Logger, cfg *rollup.Config, ctx context.Context, l2 L2) *AttributesHandler { + return &AttributesHandler{ + log: log, + cfg: cfg, + ctx: ctx, + l2: l2, + attributes: nil, + } +} + +func (eq *AttributesHandler) AttachEmitter(em event.Emitter) { + eq.emitter = em +} + +func (eq *AttributesHandler) OnEvent(ev event.Event) bool { + // Events may be concurrent in the future. Prevent unsafe concurrent modifications to the attributes. + eq.mu.Lock() + defer eq.mu.Unlock() + + switch x := ev.(type) { + case engine.PendingSafeUpdateEvent: + eq.onPendingSafeUpdate(x) + case derive.DerivedAttributesEvent: + eq.attributes = x.Attributes + eq.emitter.Emit(derive.ConfirmReceivedAttributesEvent{}) + // to make sure we have a pre-state signal to process the attributes from + eq.emitter.Emit(engine.PendingSafeRequestEvent{}) + case rollup.ResetEvent: + eq.sentAttributes = false + eq.attributes = nil + case rollup.EngineTemporaryErrorEvent: + eq.sentAttributes = false + case engine.InvalidPayloadAttributesEvent: + if x.Attributes.DerivedFrom == (eth.L1BlockRef{}) { + return true // from sequencing + } + eq.sentAttributes = false + // If the engine signals that attributes are invalid, + // that should match our last applied attributes, which we should thus drop. + eq.attributes = nil + // Time to re-evaluate without attributes. + // (the pending-safe state will then be forwarded to our source of attributes). + eq.emitter.Emit(engine.PendingSafeRequestEvent{}) + case engine.PayloadSealExpiredErrorEvent: + if x.DerivedFrom == (eth.L1BlockRef{}) { + return true // from sequencing + } + eq.log.Warn("Block sealing job of derived attributes expired, job will be re-attempted.", + "build_id", x.Info.ID, "timestamp", x.Info.Timestamp, "err", x.Err) + // If the engine failed to seal temporarily, just allow to resubmit (triggered on next safe-head poke) + eq.sentAttributes = false + case engine.PayloadSealInvalidEvent: + if x.DerivedFrom == (eth.L1BlockRef{}) { + return true // from sequencing + } + eq.log.Warn("Cannot seal derived block attributes, input is invalid", + "build_id", x.Info.ID, "timestamp", x.Info.Timestamp, "err", x.Err) + eq.sentAttributes = false + eq.attributes = nil + eq.emitter.Emit(engine.PendingSafeRequestEvent{}) + default: + return false + } + return true +} + +// onPendingSafeUpdate applies the queued-up block attributes, if any, on top of the signaled pending state. +// The event is also used to clear the queued-up attributes, when successfully processed. +// On processing failure this may emit a temporary, reset, or critical error like other derivers. +func (eq *AttributesHandler) onPendingSafeUpdate(x engine.PendingSafeUpdateEvent) { + if x.Unsafe.Number < x.PendingSafe.Number { + // invalid chain state, reset to try and fix it + eq.emitter.Emit(rollup.ResetEvent{Err: fmt.Errorf("pending-safe label (%d) may not be ahead of unsafe head label (%d)", x.PendingSafe.Number, x.Unsafe.Number)}) + return + } + + if eq.attributes == nil { + eq.sentAttributes = false + // Request new attributes to be generated, only if we don't currently have attributes that have yet to be processed. + // It is safe to request the pipeline, the attributes-handler is the only user of it, + // and the pipeline will not generate another set of attributes until the last set is recognized. + eq.emitter.Emit(derive.PipelineStepEvent{PendingSafe: x.PendingSafe}) + return + } + + // Drop attributes if they don't apply on top of the pending safe head. + // This is expected after successful processing of these attributes. + if eq.attributes.Parent.Number != x.PendingSafe.Number { + eq.log.Debug("dropping stale attributes, requesting new ones", + "pending", x.PendingSafe, "attributes_parent", eq.attributes.Parent) + eq.attributes = nil + eq.sentAttributes = false + eq.emitter.Emit(derive.PipelineStepEvent{PendingSafe: x.PendingSafe}) + return + } + + if eq.sentAttributes { + eq.log.Warn("already sent the existing attributes") + return + } + + if eq.attributes.Parent != x.PendingSafe { + // If the attributes are supposed to follow the pending safe head, but don't build on the exact block, + // then there's some reorg inconsistency. Either bad attributes, or bad pending safe head. + // Trigger a reset, and the system can derive attributes on top of the pending safe head. + // Until the reset is complete we don't clear the attributes state, + // so we can re-emit the ResetEvent until the reset actually happens. + + eq.emitter.Emit(rollup.ResetEvent{Err: fmt.Errorf("pending safe head changed to %s with parent %s, conflicting with queued safe attributes on top of %s", + x.PendingSafe, x.PendingSafe.ParentID(), eq.attributes.Parent)}) + } else { + // if there already exists a block we can just consolidate it + if x.PendingSafe.Number < x.Unsafe.Number { + eq.consolidateNextSafeAttributes(eq.attributes, x.PendingSafe) + } else { + // append to tip otherwise + eq.sentAttributes = true + eq.emitter.Emit(engine.BuildStartEvent{Attributes: eq.attributes}) + } + } +} + +// consolidateNextSafeAttributes tries to match the next safe attributes against the existing unsafe chain, +// to avoid extra processing or unnecessary unwinding of the chain. +// However, if the attributes do not match, they will be forced to process the attributes. +func (eq *AttributesHandler) consolidateNextSafeAttributes(attributes *derive.AttributesWithParent, onto eth.L2BlockRef) { + ctx, cancel := context.WithTimeout(eq.ctx, time.Second*10) + defer cancel() + + envelope, err := eq.l2.PayloadByNumber(ctx, attributes.Parent.Number+1) + if err != nil { + if errors.Is(err, ethereum.NotFound) { + // engine may have restarted, or inconsistent safe head. We need to reset + eq.emitter.Emit(rollup.ResetEvent{Err: fmt.Errorf("expected engine was synced and had unsafe block to reconcile, but cannot find the block: %w", err)}) + return + } + eq.emitter.Emit(rollup.EngineTemporaryErrorEvent{Err: fmt.Errorf("failed to get existing unsafe payload to compare against derived attributes from L1: %w", err)}) + return + } + if err := AttributesMatchBlock(eq.cfg, attributes.Attributes, onto.Hash, envelope, eq.log); err != nil { + eq.log.Warn("L2 reorg: existing unsafe block does not match derived attributes from L1", + "err", err, "unsafe", envelope.ExecutionPayload.ID(), "pending_safe", onto) + + eq.sentAttributes = true + // geth cannot wind back a chain without reorging to a new, previously non-canonical, block + eq.emitter.Emit(engine.BuildStartEvent{Attributes: attributes}) + return + } else { + ref, err := derive.PayloadToBlockRef(eq.cfg, envelope.ExecutionPayload) + if err != nil { + eq.log.Error("Failed to compute block-ref from execution payload") + return + } + eq.emitter.Emit(engine.PromotePendingSafeEvent{ + Ref: ref, + Safe: attributes.IsLastInSpan, + DerivedFrom: attributes.DerivedFrom, + }) + } + + // unsafe head stays the same, we did not reorg the chain. +} diff --git a/op-node/rollup/attributes/attributes_test.go b/op-node/rollup/attributes/attributes_test.go new file mode 100644 index 000000000000..c3ed171ce92f --- /dev/null +++ b/op-node/rollup/attributes/attributes_test.go @@ -0,0 +1,400 @@ +package attributes + +import ( + "context" + "math/big" + "math/rand" // nosemgrep + "testing" + + "github.com/holiman/uint256" + "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/op-node/rollup" + "github.com/ethereum-optimism/optimism/op-node/rollup/derive" + "github.com/ethereum-optimism/optimism/op-node/rollup/engine" + "github.com/ethereum-optimism/optimism/op-service/eth" + "github.com/ethereum-optimism/optimism/op-service/testlog" + "github.com/ethereum-optimism/optimism/op-service/testutils" +) + +func TestAttributesHandler(t *testing.T) { + rng := rand.New(rand.NewSource(1234)) + refA := testutils.RandomBlockRef(rng) + + refB := eth.L1BlockRef{ + Hash: testutils.RandomHash(rng), + Number: refA.Number + 1, + ParentHash: refA.Hash, + Time: refA.Time + 12, + } + // Copy with different hash, as alternative where the alt-L2 block may come from + refBAlt := refB + refBAlt.Hash = testutils.RandomHash(rng) + + aL1Info := &testutils.MockBlockInfo{ + InfoParentHash: refA.ParentHash, + InfoNum: refA.Number, + InfoTime: refA.Time, + InfoHash: refA.Hash, + InfoBaseFee: big.NewInt(1), + InfoBlobBaseFee: big.NewInt(1), + InfoReceiptRoot: types.EmptyRootHash, + InfoRoot: testutils.RandomHash(rng), + InfoGasUsed: rng.Uint64(), + } + + refA0 := eth.L2BlockRef{ + Hash: testutils.RandomHash(rng), + Number: 0, + ParentHash: common.Hash{}, + Time: refA.Time, + L1Origin: refA.ID(), + SequenceNumber: 0, + } + refA0Alt := eth.L2BlockRef{ + Hash: testutils.RandomHash(rng), + Number: 0, + ParentHash: common.Hash{}, + Time: refA.Time, + L1Origin: refA.ID(), + SequenceNumber: 0, + } + + gasLimit := eth.Uint64Quantity(20_000_000) + cfg := &rollup.Config{ + Genesis: rollup.Genesis{ + L1: refA.ID(), + L2: refA0.ID(), + L2Time: refA0.Time, + SystemConfig: eth.SystemConfig{ + BatcherAddr: common.Address{42}, + Overhead: [32]byte{31: 123}, + Scalar: [32]byte{0: 0, 31: 42}, + GasLimit: 20_000_000, + }, + }, + BlockTime: 1, + SeqWindowSize: 2, + RegolithTime: new(uint64), + CanyonTime: new(uint64), + EcotoneTime: new(uint64), + } + + a1L1Info, err := derive.L1InfoDepositBytes(cfg, cfg.Genesis.SystemConfig, 1, aL1Info, refA0.Time+cfg.BlockTime) + require.NoError(t, err) + parentBeaconBlockRoot := testutils.RandomHash(rng) + payloadA1 := ð.ExecutionPayloadEnvelope{ExecutionPayload: ð.ExecutionPayload{ + ParentHash: refA0.Hash, + FeeRecipient: common.Address{}, + StateRoot: eth.Bytes32{}, + ReceiptsRoot: eth.Bytes32{}, + LogsBloom: eth.Bytes256{}, + PrevRandao: eth.Bytes32{}, + BlockNumber: eth.Uint64Quantity(refA0.Number + 1), + GasLimit: gasLimit, + GasUsed: 0, + Timestamp: eth.Uint64Quantity(refA0.Time + cfg.BlockTime), + ExtraData: nil, + BaseFeePerGas: eth.Uint256Quantity(*uint256.NewInt(7)), + BlockHash: common.Hash{}, + Transactions: []eth.Data{a1L1Info}, + }, ParentBeaconBlockRoot: &parentBeaconBlockRoot} + // fix up the block-hash + payloadA1.ExecutionPayload.BlockHash, _ = payloadA1.CheckBlockHash() + + attrA1 := &derive.AttributesWithParent{ + Attributes: ð.PayloadAttributes{ + Timestamp: payloadA1.ExecutionPayload.Timestamp, + PrevRandao: payloadA1.ExecutionPayload.PrevRandao, + SuggestedFeeRecipient: payloadA1.ExecutionPayload.FeeRecipient, + Withdrawals: payloadA1.ExecutionPayload.Withdrawals, + ParentBeaconBlockRoot: payloadA1.ParentBeaconBlockRoot, + Transactions: []eth.Data{a1L1Info}, + NoTxPool: false, + GasLimit: &payloadA1.ExecutionPayload.GasLimit, + }, + Parent: refA0, + IsLastInSpan: true, + DerivedFrom: refB, + } + refA1, err := derive.PayloadToBlockRef(cfg, payloadA1.ExecutionPayload) + require.NoError(t, err) + + payloadA1Alt := ð.ExecutionPayloadEnvelope{ExecutionPayload: ð.ExecutionPayload{ + ParentHash: refA0.Hash, + FeeRecipient: common.Address{0xde, 0xea}, // change of the alternative payload + StateRoot: eth.Bytes32{}, + ReceiptsRoot: eth.Bytes32{}, + LogsBloom: eth.Bytes256{}, + PrevRandao: eth.Bytes32{}, + BlockNumber: eth.Uint64Quantity(refA0.Number + 1), + GasLimit: gasLimit, + GasUsed: 0, + Timestamp: eth.Uint64Quantity(refA0.Time + cfg.BlockTime), + ExtraData: nil, + BaseFeePerGas: eth.Uint256Quantity(*uint256.NewInt(7)), + BlockHash: common.Hash{}, + Transactions: []eth.Data{a1L1Info}, + }, ParentBeaconBlockRoot: &parentBeaconBlockRoot} + // fix up the block-hash + payloadA1Alt.ExecutionPayload.BlockHash, _ = payloadA1Alt.CheckBlockHash() + + attrA1Alt := &derive.AttributesWithParent{ + Attributes: ð.PayloadAttributes{ + Timestamp: payloadA1Alt.ExecutionPayload.Timestamp, + PrevRandao: payloadA1Alt.ExecutionPayload.PrevRandao, + SuggestedFeeRecipient: payloadA1Alt.ExecutionPayload.FeeRecipient, + Withdrawals: payloadA1Alt.ExecutionPayload.Withdrawals, + ParentBeaconBlockRoot: payloadA1Alt.ParentBeaconBlockRoot, + Transactions: []eth.Data{a1L1Info}, + NoTxPool: false, + GasLimit: &payloadA1Alt.ExecutionPayload.GasLimit, + }, + Parent: refA0, + IsLastInSpan: true, + DerivedFrom: refBAlt, + } + + refA1Alt, err := derive.PayloadToBlockRef(cfg, payloadA1Alt.ExecutionPayload) + require.NoError(t, err) + + t.Run("drop invalid attributes", func(t *testing.T) { + logger := testlog.Logger(t, log.LevelInfo) + l2 := &testutils.MockL2Client{} + emitter := &testutils.MockEmitter{} + ah := NewAttributesHandler(logger, cfg, context.Background(), l2) + ah.AttachEmitter(emitter) + + emitter.ExpectOnce(derive.ConfirmReceivedAttributesEvent{}) + emitter.ExpectOnce(engine.PendingSafeRequestEvent{}) + ah.OnEvent(derive.DerivedAttributesEvent{ + Attributes: attrA1, + }) + emitter.AssertExpectations(t) + require.NotNil(t, ah.attributes, "queue the invalid attributes") + + emitter.ExpectOnce(engine.PendingSafeRequestEvent{}) + ah.OnEvent(engine.InvalidPayloadAttributesEvent{ + Attributes: attrA1, + }) + emitter.AssertExpectations(t) + require.Nil(t, ah.attributes, "drop the invalid attributes") + }) + t.Run("drop stale attributes", func(t *testing.T) { + logger := testlog.Logger(t, log.LevelInfo) + l2 := &testutils.MockL2Client{} + emitter := &testutils.MockEmitter{} + ah := NewAttributesHandler(logger, cfg, context.Background(), l2) + ah.AttachEmitter(emitter) + + emitter.ExpectOnce(derive.ConfirmReceivedAttributesEvent{}) + emitter.ExpectOnce(engine.PendingSafeRequestEvent{}) + ah.OnEvent(derive.DerivedAttributesEvent{ + Attributes: attrA1, + }) + emitter.AssertExpectations(t) + require.NotNil(t, ah.attributes) + // New attributes will have to get generated after processing the last ones + emitter.ExpectOnce(derive.PipelineStepEvent{PendingSafe: refA1Alt}) + ah.OnEvent(engine.PendingSafeUpdateEvent{ + PendingSafe: refA1Alt, + Unsafe: refA1Alt, + }) + l2.AssertExpectations(t) + emitter.AssertExpectations(t) + require.Nil(t, ah.attributes, "drop stale attributes") + }) + + t.Run("pending gets reorged", func(t *testing.T) { + logger := testlog.Logger(t, log.LevelInfo) + l2 := &testutils.MockL2Client{} + emitter := &testutils.MockEmitter{} + ah := NewAttributesHandler(logger, cfg, context.Background(), l2) + ah.AttachEmitter(emitter) + + emitter.ExpectOnce(derive.ConfirmReceivedAttributesEvent{}) + emitter.ExpectOnce(engine.PendingSafeRequestEvent{}) + ah.OnEvent(derive.DerivedAttributesEvent{ + Attributes: attrA1, + }) + emitter.AssertExpectations(t) + require.NotNil(t, ah.attributes) + + emitter.ExpectOnceType("ResetEvent") + ah.OnEvent(engine.PendingSafeUpdateEvent{ + PendingSafe: refA0Alt, + Unsafe: refA0Alt, + }) + l2.AssertExpectations(t) + emitter.AssertExpectations(t) + require.NotNil(t, ah.attributes, "detected reorg does not clear state, reset is required") + }) + + t.Run("pending older than unsafe", func(t *testing.T) { + t.Run("consolidation fails", func(t *testing.T) { + logger := testlog.Logger(t, log.LevelInfo) + l2 := &testutils.MockL2Client{} + emitter := &testutils.MockEmitter{} + ah := NewAttributesHandler(logger, cfg, context.Background(), l2) + ah.AttachEmitter(emitter) + + // attrA1Alt does not match block A1, so will cause force-reorg. + emitter.ExpectOnce(derive.ConfirmReceivedAttributesEvent{}) + emitter.ExpectOnce(engine.PendingSafeRequestEvent{}) + ah.OnEvent(derive.DerivedAttributesEvent{Attributes: attrA1Alt}) + emitter.AssertExpectations(t) + require.NotNil(t, ah.attributes, "queued up derived attributes") + + // Call during consolidation. + // The payloadA1 is going to get reorged out in favor of attrA1Alt (turns into payloadA1Alt) + l2.ExpectPayloadByNumber(refA1.Number, payloadA1, nil) + // fail consolidation, perform force reorg + emitter.ExpectOnce(engine.BuildStartEvent{Attributes: attrA1Alt}) + ah.OnEvent(engine.PendingSafeUpdateEvent{ + PendingSafe: refA0, + Unsafe: refA1, + }) + l2.AssertExpectations(t) + emitter.AssertExpectations(t) + require.NotNil(t, ah.attributes, "still have attributes, processing still unconfirmed") + + emitter.ExpectOnce(derive.PipelineStepEvent{PendingSafe: refA1Alt}) + // recognize reorg as complete + ah.OnEvent(engine.PendingSafeUpdateEvent{ + PendingSafe: refA1Alt, + Unsafe: refA1Alt, + }) + emitter.AssertExpectations(t) + require.Nil(t, ah.attributes, "drop when attributes are successful") + }) + t.Run("consolidation passes", func(t *testing.T) { + fn := func(t *testing.T, lastInSpan bool) { + logger := testlog.Logger(t, log.LevelInfo) + l2 := &testutils.MockL2Client{} + emitter := &testutils.MockEmitter{} + ah := NewAttributesHandler(logger, cfg, context.Background(), l2) + ah.AttachEmitter(emitter) + + attr := &derive.AttributesWithParent{ + Attributes: attrA1.Attributes, // attributes will match, passing consolidation + Parent: attrA1.Parent, + IsLastInSpan: lastInSpan, + DerivedFrom: refB, + } + emitter.ExpectOnce(derive.ConfirmReceivedAttributesEvent{}) + emitter.ExpectOnce(engine.PendingSafeRequestEvent{}) + ah.OnEvent(derive.DerivedAttributesEvent{Attributes: attr}) + emitter.AssertExpectations(t) + require.NotNil(t, ah.attributes, "queued up derived attributes") + + // Call during consolidation. + l2.ExpectPayloadByNumber(refA1.Number, payloadA1, nil) + + emitter.ExpectOnce(engine.PromotePendingSafeEvent{ + Ref: refA1, + Safe: lastInSpan, // last in span becomes safe instantaneously + DerivedFrom: refB, + }) + ah.OnEvent(engine.PendingSafeUpdateEvent{ + PendingSafe: refA0, + Unsafe: refA1, + }) + l2.AssertExpectations(t) + emitter.AssertExpectations(t) + require.NotNil(t, ah.attributes, "still have attributes, processing still unconfirmed") + + emitter.ExpectOnce(derive.PipelineStepEvent{PendingSafe: refA1}) + ah.OnEvent(engine.PendingSafeUpdateEvent{ + PendingSafe: refA1, + Unsafe: refA1, + }) + emitter.AssertExpectations(t) + require.Nil(t, ah.attributes, "drop when attributes are successful") + } + t.Run("is last span", func(t *testing.T) { + fn(t, true) + }) + + t.Run("is not last span", func(t *testing.T) { + fn(t, false) + }) + }) + }) + + t.Run("pending equals unsafe", func(t *testing.T) { + // no consolidation to do, just force next attributes on tip of chain + logger := testlog.Logger(t, log.LevelInfo) + l2 := &testutils.MockL2Client{} + emitter := &testutils.MockEmitter{} + ah := NewAttributesHandler(logger, cfg, context.Background(), l2) + ah.AttachEmitter(emitter) + + emitter.ExpectOnce(derive.ConfirmReceivedAttributesEvent{}) + emitter.ExpectOnce(engine.PendingSafeRequestEvent{}) + ah.OnEvent(derive.DerivedAttributesEvent{Attributes: attrA1Alt}) + emitter.AssertExpectations(t) + require.NotNil(t, ah.attributes, "queued up derived attributes") + + // sanity check test setup + require.True(t, attrA1Alt.IsLastInSpan, "must be last in span for attributes to become safe") + + // attrA1Alt will fit right on top of A0 + emitter.ExpectOnce(engine.BuildStartEvent{Attributes: attrA1Alt}) + ah.OnEvent(engine.PendingSafeUpdateEvent{ + PendingSafe: refA0, + Unsafe: refA0, + }) + l2.AssertExpectations(t) + emitter.AssertExpectations(t) + require.NotNil(t, ah.attributes) + + emitter.ExpectOnce(derive.PipelineStepEvent{PendingSafe: refA1Alt}) + ah.OnEvent(engine.PendingSafeUpdateEvent{ + PendingSafe: refA1Alt, + Unsafe: refA1Alt, + }) + emitter.AssertExpectations(t) + require.Nil(t, ah.attributes, "clear attributes after successful processing") + }) + + t.Run("pending ahead of unsafe", func(t *testing.T) { + // Legacy test case: if attributes fit on top of the pending safe block as expected, + // but if the unsafe block is older, then we can recover by resetting. + logger := testlog.Logger(t, log.LevelInfo) + l2 := &testutils.MockL2Client{} + emitter := &testutils.MockEmitter{} + ah := NewAttributesHandler(logger, cfg, context.Background(), l2) + ah.AttachEmitter(emitter) + + emitter.ExpectOnceType("ResetEvent") + ah.OnEvent(engine.PendingSafeUpdateEvent{ + PendingSafe: refA1, + Unsafe: refA0, + }) + emitter.AssertExpectations(t) + l2.AssertExpectations(t) + }) + + t.Run("no attributes", func(t *testing.T) { + logger := testlog.Logger(t, log.LevelInfo) + l2 := &testutils.MockL2Client{} + emitter := &testutils.MockEmitter{} + ah := NewAttributesHandler(logger, cfg, context.Background(), l2) + ah.AttachEmitter(emitter) + + // If there are no attributes, we expect the pipeline to be requested to generate attributes. + emitter.ExpectOnce(derive.PipelineStepEvent{PendingSafe: refA1}) + ah.OnEvent(engine.PendingSafeUpdateEvent{ + PendingSafe: refA1, + Unsafe: refA1, + }) + // no calls to L2 or emitter when there is nothing to process + l2.AssertExpectations(t) + emitter.AssertExpectations(t) + }) + +} diff --git a/op-node/rollup/derive/engine_consolidate.go b/op-node/rollup/attributes/engine_consolidate.go similarity index 94% rename from op-node/rollup/derive/engine_consolidate.go rename to op-node/rollup/attributes/engine_consolidate.go index 121a7403257a..3cd9e8931210 100644 --- a/op-node/rollup/derive/engine_consolidate.go +++ b/op-node/rollup/attributes/engine_consolidate.go @@ -1,4 +1,4 @@ -package derive +package attributes import ( "bytes" @@ -10,6 +10,7 @@ import ( "github.com/ethereum/go-ethereum/log" "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" ) @@ -60,6 +61,9 @@ func AttributesMatchBlock(rollupCfg *rollup.Config, attrs *eth.PayloadAttributes if err := checkParentBeaconBlockRootMatch(attrs.ParentBeaconBlockRoot, envelope.ParentBeaconBlockRoot); err != nil { return err } + if attrs.SuggestedFeeRecipient != block.FeeRecipient { + return fmt.Errorf("fee recipient data does not match, expected %s but got %s", block.FeeRecipient, attrs.SuggestedFeeRecipient) + } return nil } @@ -119,8 +123,8 @@ func logL1InfoTxns(rollupCfg *rollup.Config, l log.Logger, l2Number, l2Timestamp } // Then decode the ABI encoded parameters - safeInfo, errSafe := L1BlockInfoFromBytes(rollupCfg, l2Timestamp, safeTxValue.Data()) - unsafeInfo, errUnsafe := L1BlockInfoFromBytes(rollupCfg, l2Timestamp, unsafeTxValue.Data()) + safeInfo, errSafe := derive.L1BlockInfoFromBytes(rollupCfg, l2Timestamp, safeTxValue.Data()) + unsafeInfo, errUnsafe := derive.L1BlockInfoFromBytes(rollupCfg, l2Timestamp, unsafeTxValue.Data()) if errSafe != nil || errUnsafe != nil { l.Error("failed to umarshal l1 info", "errSafe", errSafe, "errUnsafe", errUnsafe) return diff --git a/op-node/rollup/derive/engine_consolidate_test.go b/op-node/rollup/attributes/engine_consolidate_test.go similarity index 92% rename from op-node/rollup/derive/engine_consolidate_test.go rename to op-node/rollup/attributes/engine_consolidate_test.go index 57b7970d3204..015e34f5d3d4 100644 --- a/op-node/rollup/derive/engine_consolidate_test.go +++ b/op-node/rollup/attributes/engine_consolidate_test.go @@ -1,19 +1,21 @@ -package derive +package attributes import ( - "math/rand" + "math/rand" // nosemgrep "testing" - "github.com/ethereum-optimism/optimism/op-node/rollup" - "github.com/ethereum-optimism/optimism/op-service/eth" + "github.com/ethereum/go-ethereum/log" + "github.com/stretchr/testify/require" - "github.com/ethereum-optimism/optimism/op-service/testlog" - "github.com/ethereum-optimism/optimism/op-service/testutils" "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/stretchr/testify/require" + + "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" ) var ( @@ -23,6 +25,7 @@ var ( validPrevRandao = eth.Bytes32(common.HexToHash("0x789")) validGasLimit = eth.Uint64Quantity(1000) validWithdrawals = types.Withdrawals{} + validFeeRecipient = predeploys.SequencerFeeVaultAddr ) type args struct { @@ -36,11 +39,12 @@ func ecotoneArgs() args { envelope: ð.ExecutionPayloadEnvelope{ ParentBeaconBlockRoot: &validParentBeaconRoot, ExecutionPayload: ð.ExecutionPayload{ - ParentHash: validParentHash, - Timestamp: validTimestamp, - PrevRandao: validPrevRandao, - GasLimit: validGasLimit, - Withdrawals: &validWithdrawals, + ParentHash: validParentHash, + Timestamp: validTimestamp, + PrevRandao: validPrevRandao, + GasLimit: validGasLimit, + Withdrawals: &validWithdrawals, + FeeRecipient: validFeeRecipient, }, }, attrs: ð.PayloadAttributes{ @@ -49,6 +53,7 @@ func ecotoneArgs() args { GasLimit: &validGasLimit, ParentBeaconBlockRoot: &validParentBeaconRoot, Withdrawals: &validWithdrawals, + SuggestedFeeRecipient: validFeeRecipient, }, parentHash: validParentHash, } @@ -133,6 +138,12 @@ func createMismatchedTimestamp() args { return args } +func createMismatchedFeeRecipient() args { + args := ecotoneArgs() + args.attrs.SuggestedFeeRecipient = common.Address{0xde, 0xad} + return args +} + func TestAttributesMatch(t *testing.T) { rollupCfg := &rollup.Config{} @@ -192,14 +203,18 @@ func TestAttributesMatch(t *testing.T) { shouldMatch: false, args: createMismatchedTimestamp(), }, + { + shouldMatch: false, + args: createMismatchedFeeRecipient(), + }, } - for _, test := range tests { + for i, test := range tests { err := AttributesMatchBlock(rollupCfg, test.args.attrs, test.args.parentHash, test.args.envelope, testlog.Logger(t, log.LevelInfo)) if test.shouldMatch { - require.NoError(t, err) + require.NoError(t, err, "fail %d", i) } else { - require.Error(t, err) + require.Error(t, err, "fail %d", i) } } } diff --git a/op-node/rollup/chain_spec.go b/op-node/rollup/chain_spec.go index 0eaedd2c1c1e..66d2e526d0d1 100644 --- a/op-node/rollup/chain_spec.go +++ b/op-node/rollup/chain_spec.go @@ -1,6 +1,9 @@ package rollup import ( + "math/big" + + "github.com/ethereum-optimism/optimism/op-node/params" "github.com/ethereum-optimism/optimism/op-service/eth" "github.com/ethereum/go-ethereum/log" ) @@ -20,11 +23,6 @@ const ( 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 @@ -40,6 +38,8 @@ const ( Delta ForkName = "delta" Ecotone ForkName = "ecotone" Fjord ForkName = "fjord" + Granite ForkName = "granite" + Holocene ForkName = "holocene" Interop ForkName = "interop" None ForkName = "none" ) @@ -50,7 +50,9 @@ var nextFork = map[ForkName]ForkName{ Canyon: Delta, Delta: Ecotone, Ecotone: Fjord, - Fjord: Interop, + Fjord: Granite, + Granite: Holocene, + Holocene: Interop, Interop: None, } @@ -63,6 +65,16 @@ func NewChainSpec(config *Config) *ChainSpec { return &ChainSpec{config: config} } +// L2ChainID returns the chain ID of the L2 chain. +func (s *ChainSpec) L2ChainID() *big.Int { + return s.config.L2ChainID +} + +// L2GenesisTime returns the genesis time of the L2 chain. +func (s *ChainSpec) L2GenesisTime() uint64 { + return s.config.Genesis.L2Time +} + // IsCanyon returns true if t >= canyon_time func (s *ChainSpec) IsCanyon(t uint64) bool { return s.config.IsCanyon(t) @@ -78,8 +90,11 @@ func (s *ChainSpec) MaxChannelBankSize(t uint64) uint64 { } // ChannelTimeout returns the channel timeout constant. -func (s *ChainSpec) ChannelTimeout() uint64 { - return s.config.ChannelTimeout +func (s *ChainSpec) ChannelTimeout(t uint64) uint64 { + if s.config.IsGranite(t) { + return params.ChannelTimeoutGranite + } + return s.config.ChannelTimeoutBedrock } // MaxRLPBytesPerChannel returns the maximum amount of bytes that will be read from @@ -130,6 +145,12 @@ func (s *ChainSpec) CheckForkActivation(log log.Logger, block eth.L2BlockRef) { if s.config.IsFjord(block.Time) { s.currentFork = Fjord } + if s.config.IsGranite(block.Time) { + s.currentFork = Granite + } + if s.config.IsHolocene(block.Time) { + s.currentFork = Holocene + } if s.config.IsInterop(block.Time) { s.currentFork = Interop } @@ -150,6 +171,10 @@ func (s *ChainSpec) CheckForkActivation(log log.Logger, block eth.L2BlockRef) { foundActivationBlock = s.config.IsEcotoneActivationBlock(block.Time) case Fjord: foundActivationBlock = s.config.IsFjordActivationBlock(block.Time) + case Granite: + foundActivationBlock = s.config.IsGraniteActivationBlock(block.Time) + case Holocene: + foundActivationBlock = s.config.IsHoloceneActivationBlock(block.Time) case Interop: foundActivationBlock = s.config.IsInteropActivationBlock(block.Time) } diff --git a/op-node/rollup/chain_spec_test.go b/op-node/rollup/chain_spec_test.go index b6547835cdba..e94f862f42d0 100644 --- a/op-node/rollup/chain_spec_test.go +++ b/op-node/rollup/chain_spec_test.go @@ -1,6 +1,7 @@ package rollup import ( + "log/slog" "math/big" "testing" @@ -8,7 +9,6 @@ import ( "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 { @@ -36,7 +36,7 @@ var testConfig = Config{ BlockTime: 2, MaxSequencerDrift: 600, SeqWindowSize: 3600, - ChannelTimeout: 300, + ChannelTimeoutBedrock: 300, L1ChainID: big.NewInt(1), L2ChainID: big.NewInt(10), RegolithTime: u64ptr(10), @@ -44,12 +44,13 @@ var testConfig = Config{ DeltaTime: u64ptr(30), EcotoneTime: u64ptr(40), FjordTime: u64ptr(50), + GraniteTime: u64ptr(60), InteropTime: nil, BatchInboxAddress: common.HexToAddress("0xff00000000000000000000000000000000000010"), DepositContractAddress: common.HexToAddress("0xbEb5Fc579115071764c7423A4f12eDde41f106Ed"), L1SystemConfigAddress: common.HexToAddress("0x229047fed2591dbec1eF1118d64F7aF3dB9EB290"), ProtocolVersionsAddress: common.HexToAddress("0x8062AbC286f5e7D9428a0Ccb9AbD71e50d93b935"), - PlasmaConfig: nil, + AltDAConfig: nil, } func TestChainSpec_CanyonForkActivation(t *testing.T) { @@ -170,10 +171,16 @@ func TestCheckForkActivation(t *testing.T) { expectedCurrentFork: Canyon, expectedLog: "Detected hardfork activation block", }, + { + name: "Granite activation", + block: eth.L2BlockRef{Time: 60, Number: 8, Hash: common.Hash{0x7}}, + expectedCurrentFork: Granite, + expectedLog: "Detected hardfork activation block", + }, { name: "No more hardforks", - block: eth.L2BlockRef{Time: 700, Number: 8, Hash: common.Hash{0x8}}, - expectedCurrentFork: Fjord, + block: eth.L2BlockRef{Time: 700, Number: 9, Hash: common.Hash{0x8}}, + expectedCurrentFork: Granite, expectedLog: "", }, } diff --git a/op-node/rollup/clsync/clsync.go b/op-node/rollup/clsync/clsync.go new file mode 100644 index 000000000000..64193b21b110 --- /dev/null +++ b/op-node/rollup/clsync/clsync.go @@ -0,0 +1,185 @@ +package clsync + +import ( + "sync" + + "github.com/ethereum/go-ethereum/log" + + "github.com/ethereum-optimism/optimism/op-node/rollup" + "github.com/ethereum-optimism/optimism/op-node/rollup/derive" + "github.com/ethereum-optimism/optimism/op-node/rollup/engine" + "github.com/ethereum-optimism/optimism/op-node/rollup/event" + "github.com/ethereum-optimism/optimism/op-service/eth" +) + +// Max memory used for buffering unsafe payloads +const maxUnsafePayloadsMemory = 500 * 1024 * 1024 + +type Metrics interface { + RecordUnsafePayloadsBuffer(length uint64, memSize uint64, next eth.BlockID) +} + +// CLSync holds on to a queue of received unsafe payloads, +// and tries to apply them to the tip of the chain when requested to. +type CLSync struct { + log log.Logger + cfg *rollup.Config + metrics Metrics + + emitter event.Emitter + + mu sync.Mutex + + unsafePayloads *PayloadsQueue // queue of unsafe payloads, ordered by ascending block number, may have gaps and duplicates +} + +func NewCLSync(log log.Logger, cfg *rollup.Config, metrics Metrics) *CLSync { + return &CLSync{ + log: log, + cfg: cfg, + metrics: metrics, + unsafePayloads: NewPayloadsQueue(log, maxUnsafePayloadsMemory, payloadMemSize), + } +} + +func (eq *CLSync) AttachEmitter(em event.Emitter) { + eq.emitter = em +} + +// LowestQueuedUnsafeBlock retrieves the first queued-up L2 unsafe payload, or a zeroed reference if there is none. +func (eq *CLSync) LowestQueuedUnsafeBlock() eth.L2BlockRef { + payload := eq.unsafePayloads.Peek() + if payload == nil { + return eth.L2BlockRef{} + } + ref, err := derive.PayloadToBlockRef(eq.cfg, payload.ExecutionPayload) + if err != nil { + return eth.L2BlockRef{} + } + return ref +} + +type ReceivedUnsafePayloadEvent struct { + Envelope *eth.ExecutionPayloadEnvelope +} + +func (ev ReceivedUnsafePayloadEvent) String() string { + return "received-unsafe-payload" +} + +func (eq *CLSync) OnEvent(ev event.Event) bool { + // Events may be concurrent in the future. Prevent unsafe concurrent modifications to the payloads queue. + eq.mu.Lock() + defer eq.mu.Unlock() + + switch x := ev.(type) { + case engine.PayloadInvalidEvent: + eq.onInvalidPayload(x) + case engine.ForkchoiceUpdateEvent: + eq.onForkchoiceUpdate(x) + case ReceivedUnsafePayloadEvent: + eq.onUnsafePayload(x) + default: + return false + } + return true +} + +// onInvalidPayload checks if the first next-up payload matches the invalid payload. +// If so, the payload is dropped, to give the next payloads a try. +func (eq *CLSync) onInvalidPayload(x engine.PayloadInvalidEvent) { + eq.log.Debug("CL sync received invalid-payload report", x.Envelope.ExecutionPayload.ID()) + + block := x.Envelope.ExecutionPayload + if peek := eq.unsafePayloads.Peek(); peek != nil && + block.BlockHash == peek.ExecutionPayload.BlockHash { + eq.log.Warn("Dropping invalid unsafe payload", + "hash", block.BlockHash, "number", uint64(block.BlockNumber), + "timestamp", uint64(block.Timestamp)) + eq.unsafePayloads.Pop() + } +} + +// onForkchoiceUpdate peeks at the next applicable unsafe payload, if any, +// to apply on top of the received forkchoice pre-state. +// The payload is held on to until the forkchoice changes (success case) or the payload is reported to be invalid. +func (eq *CLSync) onForkchoiceUpdate(x engine.ForkchoiceUpdateEvent) { + eq.log.Debug("CL sync received forkchoice update", + "unsafe", x.UnsafeL2Head, "safe", x.SafeL2Head, "finalized", x.FinalizedL2Head) + + for { + pop, abort := eq.fromQueue(x) + if abort { + return + } + if pop { + eq.unsafePayloads.Pop() + } else { + break + } + } + + firstEnvelope := eq.unsafePayloads.Peek() + + // We don't pop from the queue. If there is a temporary error then we can retry. + // Upon next forkchoice update or invalid-payload event we can remove it from the queue. + eq.emitter.Emit(engine.ProcessUnsafePayloadEvent{Envelope: firstEnvelope}) +} + +// fromQueue determines what to do with the tip of the payloads-queue, given the forkchoice pre-state. +// If abort, there is nothing to process (either due to empty queue, or unsuitable tip). +// If pop, the tip should be dropped, and processing can repeat from there. +// If not abort or pop, the tip is ready to process. +func (eq *CLSync) fromQueue(x engine.ForkchoiceUpdateEvent) (pop bool, abort bool) { + if eq.unsafePayloads.Len() == 0 { + return false, true + } + firstEnvelope := eq.unsafePayloads.Peek() + first := firstEnvelope.ExecutionPayload + + if first.BlockHash == x.UnsafeL2Head.Hash { + eq.log.Debug("successfully processed payload, removing it from the payloads queue now") + return true, false + } + + if uint64(first.BlockNumber) <= x.SafeL2Head.Number { + eq.log.Info("skipping unsafe payload, since it is older than safe head", "safe", x.SafeL2Head.ID(), "unsafe", x.UnsafeL2Head.ID(), "unsafe_payload", first.ID()) + return true, false + } + if uint64(first.BlockNumber) <= x.UnsafeL2Head.Number { + eq.log.Info("skipping unsafe payload, since it is older than unsafe head", "unsafe", x.UnsafeL2Head.ID(), "unsafe_payload", first.ID()) + return true, false + } + + // Ensure that the unsafe payload builds upon the current unsafe head + if first.ParentHash != x.UnsafeL2Head.Hash { + if uint64(first.BlockNumber) == x.UnsafeL2Head.Number+1 { + eq.log.Info("skipping unsafe payload, since it does not build onto the existing unsafe chain", "safe", x.SafeL2Head.ID(), "unsafe", x.UnsafeL2Head.ID(), "unsafe_payload", first.ID()) + return true, false + } + return false, true // rollup-node should try something different if it cannot process the first unsafe payload + } + + return false, false +} + +// AddUnsafePayload schedules an execution payload to be processed, ahead of deriving it from L1. +func (eq *CLSync) onUnsafePayload(x ReceivedUnsafePayloadEvent) { + eq.log.Debug("CL sync received payload", "payload", x.Envelope.ExecutionPayload.ID()) + envelope := x.Envelope + if envelope == nil { + eq.log.Warn("cannot add nil unsafe payload") + return + } + + if err := eq.unsafePayloads.Push(envelope); err != nil { + eq.log.Warn("Could not add unsafe payload", "id", envelope.ExecutionPayload.ID(), "timestamp", uint64(envelope.ExecutionPayload.Timestamp), "err", err) + return + } + p := eq.unsafePayloads.Peek() + eq.metrics.RecordUnsafePayloadsBuffer(uint64(eq.unsafePayloads.Len()), eq.unsafePayloads.MemSize(), p.ExecutionPayload.ID()) + eq.log.Trace("Next unsafe payload to process", "next", p.ExecutionPayload.ID(), "timestamp", uint64(p.ExecutionPayload.Timestamp)) + + // request forkchoice signal, so we can process the payload maybe + eq.emitter.Emit(engine.ForkchoiceRequestEvent{}) +} diff --git a/op-node/rollup/clsync/clsync_test.go b/op-node/rollup/clsync/clsync_test.go new file mode 100644 index 000000000000..944d2027caff --- /dev/null +++ b/op-node/rollup/clsync/clsync_test.go @@ -0,0 +1,385 @@ +package clsync + +import ( + "errors" + "math/big" + "math/rand" // nosemgrep + "testing" + + "github.com/holiman/uint256" + "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/op-node/rollup" + "github.com/ethereum-optimism/optimism/op-node/rollup/derive" + "github.com/ethereum-optimism/optimism/op-node/rollup/engine" + "github.com/ethereum-optimism/optimism/op-service/eth" + "github.com/ethereum-optimism/optimism/op-service/testlog" + "github.com/ethereum-optimism/optimism/op-service/testutils" +) + +func TestCLSync(t *testing.T) { + rng := rand.New(rand.NewSource(1234)) + + refA := testutils.RandomBlockRef(rng) + + aL1Info := &testutils.MockBlockInfo{ + InfoParentHash: refA.ParentHash, + InfoNum: refA.Number, + InfoTime: refA.Time, + InfoHash: refA.Hash, + InfoBaseFee: big.NewInt(1), + InfoBlobBaseFee: big.NewInt(1), + InfoReceiptRoot: types.EmptyRootHash, + InfoRoot: testutils.RandomHash(rng), + InfoGasUsed: rng.Uint64(), + } + + refA0 := eth.L2BlockRef{ + Hash: testutils.RandomHash(rng), + Number: 0, + ParentHash: common.Hash{}, + Time: refA.Time, + L1Origin: refA.ID(), + SequenceNumber: 0, + } + gasLimit := eth.Uint64Quantity(20_000_000) + cfg := &rollup.Config{ + Genesis: rollup.Genesis{ + L1: refA.ID(), + L2: refA0.ID(), + L2Time: refA0.Time, + SystemConfig: eth.SystemConfig{ + BatcherAddr: common.Address{42}, + Overhead: [32]byte{123}, + Scalar: [32]byte{42}, + GasLimit: 20_000_000, + }, + }, + BlockTime: 1, + SeqWindowSize: 2, + } + + refA1 := eth.L2BlockRef{ + Hash: testutils.RandomHash(rng), + Number: refA0.Number + 1, + ParentHash: refA0.Hash, + Time: refA0.Time + cfg.BlockTime, + L1Origin: refA.ID(), + SequenceNumber: 1, + } + + altRefA1 := refA1 + altRefA1.Hash = testutils.RandomHash(rng) + + refA2 := eth.L2BlockRef{ + Hash: testutils.RandomHash(rng), + Number: refA1.Number + 1, + ParentHash: refA1.Hash, + Time: refA1.Time + cfg.BlockTime, + L1Origin: refA.ID(), + SequenceNumber: 2, + } + + a1L1Info, err := derive.L1InfoDepositBytes(cfg, cfg.Genesis.SystemConfig, refA1.SequenceNumber, aL1Info, refA1.Time) + require.NoError(t, err) + payloadA1 := ð.ExecutionPayloadEnvelope{ExecutionPayload: ð.ExecutionPayload{ + ParentHash: refA1.ParentHash, + FeeRecipient: common.Address{}, + StateRoot: eth.Bytes32{}, + ReceiptsRoot: eth.Bytes32{}, + LogsBloom: eth.Bytes256{}, + PrevRandao: eth.Bytes32{}, + BlockNumber: eth.Uint64Quantity(refA1.Number), + GasLimit: gasLimit, + GasUsed: 0, + Timestamp: eth.Uint64Quantity(refA1.Time), + ExtraData: nil, + BaseFeePerGas: eth.Uint256Quantity(*uint256.NewInt(7)), + BlockHash: refA1.Hash, + Transactions: []eth.Data{a1L1Info}, + }} + a2L1Info, err := derive.L1InfoDepositBytes(cfg, cfg.Genesis.SystemConfig, refA2.SequenceNumber, aL1Info, refA2.Time) + require.NoError(t, err) + payloadA2 := ð.ExecutionPayloadEnvelope{ExecutionPayload: ð.ExecutionPayload{ + ParentHash: refA2.ParentHash, + FeeRecipient: common.Address{}, + StateRoot: eth.Bytes32{}, + ReceiptsRoot: eth.Bytes32{}, + LogsBloom: eth.Bytes256{}, + PrevRandao: eth.Bytes32{}, + BlockNumber: eth.Uint64Quantity(refA2.Number), + GasLimit: gasLimit, + GasUsed: 0, + Timestamp: eth.Uint64Quantity(refA2.Time), + ExtraData: nil, + BaseFeePerGas: eth.Uint256Quantity(*uint256.NewInt(7)), + BlockHash: refA2.Hash, + Transactions: []eth.Data{a2L1Info}, + }} + + metrics := &testutils.TestDerivationMetrics{} + + // When a previously received unsafe block is older than the tip of the chain, we want to drop it. + t.Run("drop old", func(t *testing.T) { + logger := testlog.Logger(t, log.LevelError) + + emitter := &testutils.MockEmitter{} + cl := NewCLSync(logger, cfg, metrics) + cl.AttachEmitter(emitter) + + emitter.ExpectOnce(engine.ForkchoiceRequestEvent{}) + cl.OnEvent(ReceivedUnsafePayloadEvent{Envelope: payloadA1}) + emitter.AssertExpectations(t) + + cl.OnEvent(engine.ForkchoiceUpdateEvent{ + UnsafeL2Head: refA2, + SafeL2Head: refA0, + FinalizedL2Head: refA0, + }) + emitter.AssertExpectations(t) // no new events expected to be emitted + + require.Nil(t, cl.unsafePayloads.Peek(), "pop because too old") + }) + + // When we already have the exact payload as tip, then no need to process it + t.Run("drop equal", func(t *testing.T) { + logger := testlog.Logger(t, log.LevelError) + + emitter := &testutils.MockEmitter{} + cl := NewCLSync(logger, cfg, metrics) + cl.AttachEmitter(emitter) + + emitter.ExpectOnce(engine.ForkchoiceRequestEvent{}) + cl.OnEvent(ReceivedUnsafePayloadEvent{Envelope: payloadA1}) + emitter.AssertExpectations(t) + + cl.OnEvent(engine.ForkchoiceUpdateEvent{ + UnsafeL2Head: refA1, + SafeL2Head: refA0, + FinalizedL2Head: refA0, + }) + emitter.AssertExpectations(t) // no new events expected to be emitted + + require.Nil(t, cl.unsafePayloads.Peek(), "pop because seen") + }) + + // When we have a different payload, at the same height, then we want to keep it. + // The unsafe chain consensus preserves the first-seen payload. + t.Run("ignore conflict", func(t *testing.T) { + logger := testlog.Logger(t, log.LevelError) + + emitter := &testutils.MockEmitter{} + cl := NewCLSync(logger, cfg, metrics) + cl.AttachEmitter(emitter) + + emitter.ExpectOnce(engine.ForkchoiceRequestEvent{}) + cl.OnEvent(ReceivedUnsafePayloadEvent{Envelope: payloadA1}) + emitter.AssertExpectations(t) + + cl.OnEvent(engine.ForkchoiceUpdateEvent{ + UnsafeL2Head: altRefA1, + SafeL2Head: refA0, + FinalizedL2Head: refA0, + }) + emitter.AssertExpectations(t) // no new events expected to be emitted + + require.Nil(t, cl.unsafePayloads.Peek(), "pop because alternative") + }) + + t.Run("ignore unsafe reorg", func(t *testing.T) { + logger := testlog.Logger(t, log.LevelError) + + emitter := &testutils.MockEmitter{} + cl := NewCLSync(logger, cfg, metrics) + cl.AttachEmitter(emitter) + + emitter.ExpectOnce(engine.ForkchoiceRequestEvent{}) + cl.OnEvent(ReceivedUnsafePayloadEvent{Envelope: payloadA2}) + emitter.AssertExpectations(t) + + cl.OnEvent(engine.ForkchoiceUpdateEvent{ + UnsafeL2Head: altRefA1, + SafeL2Head: refA0, + FinalizedL2Head: refA0, + }) + emitter.AssertExpectations(t) // no new events expected, since A2 does not fit onto altA1 + + require.Nil(t, cl.unsafePayloads.Peek(), "pop because not applicable") + }) + + t.Run("success", func(t *testing.T) { + logger := testlog.Logger(t, log.LevelError) + + emitter := &testutils.MockEmitter{} + cl := NewCLSync(logger, cfg, metrics) + cl.AttachEmitter(emitter) + emitter.AssertExpectations(t) // nothing to process yet + + require.Nil(t, cl.unsafePayloads.Peek(), "no payloads yet") + + emitter.ExpectOnce(engine.ForkchoiceRequestEvent{}) + cl.OnEvent(ReceivedUnsafePayloadEvent{Envelope: payloadA1}) + emitter.AssertExpectations(t) + + lowest := cl.LowestQueuedUnsafeBlock() + require.Equal(t, refA1, lowest, "expecting A1 next") + + // payload A1 should be possible to process on top of A0 + emitter.ExpectOnce(engine.ProcessUnsafePayloadEvent{Envelope: payloadA1}) + cl.OnEvent(engine.ForkchoiceUpdateEvent{ + UnsafeL2Head: refA0, + SafeL2Head: refA0, + FinalizedL2Head: refA0, + }) + emitter.AssertExpectations(t) + + // now pretend the payload was processed: we can drop A1 now + cl.OnEvent(engine.ForkchoiceUpdateEvent{ + UnsafeL2Head: refA1, + SafeL2Head: refA0, + FinalizedL2Head: refA0, + }) + require.Nil(t, cl.unsafePayloads.Peek(), "pop because applied") + + // repeat for A2 + emitter.ExpectOnce(engine.ForkchoiceRequestEvent{}) + cl.OnEvent(ReceivedUnsafePayloadEvent{Envelope: payloadA2}) + emitter.AssertExpectations(t) + + lowest = cl.LowestQueuedUnsafeBlock() + require.Equal(t, refA2, lowest, "expecting A2 next") + + emitter.ExpectOnce(engine.ProcessUnsafePayloadEvent{Envelope: payloadA2}) + cl.OnEvent(engine.ForkchoiceUpdateEvent{ + UnsafeL2Head: refA1, + SafeL2Head: refA0, + FinalizedL2Head: refA0, + }) + emitter.AssertExpectations(t) + + // now pretend the payload was processed: we can drop A2 now + cl.OnEvent(engine.ForkchoiceUpdateEvent{ + UnsafeL2Head: refA2, + SafeL2Head: refA0, + FinalizedL2Head: refA0, + }) + require.Nil(t, cl.unsafePayloads.Peek(), "pop because applied") + }) + + t.Run("double buffer", func(t *testing.T) { + logger := testlog.Logger(t, log.LevelError) + + emitter := &testutils.MockEmitter{} + cl := NewCLSync(logger, cfg, metrics) + cl.AttachEmitter(emitter) + + emitter.ExpectOnce(engine.ForkchoiceRequestEvent{}) + cl.OnEvent(ReceivedUnsafePayloadEvent{Envelope: payloadA1}) + emitter.AssertExpectations(t) + emitter.ExpectOnce(engine.ForkchoiceRequestEvent{}) + cl.OnEvent(ReceivedUnsafePayloadEvent{Envelope: payloadA2}) + emitter.AssertExpectations(t) + + lowest := cl.LowestQueuedUnsafeBlock() + require.Equal(t, refA1, lowest, "expecting A1 next") + + emitter.ExpectOnce(engine.ProcessUnsafePayloadEvent{Envelope: payloadA1}) + cl.OnEvent(engine.ForkchoiceUpdateEvent{ + UnsafeL2Head: refA0, + SafeL2Head: refA0, + FinalizedL2Head: refA0, + }) + emitter.AssertExpectations(t) + require.Equal(t, 2, cl.unsafePayloads.Len(), "still holding on to A1, and queued A2") + + // Now pretend the payload was processed: we can drop A1 now. + // The CL-sync will try to immediately continue with A2. + emitter.ExpectOnce(engine.ProcessUnsafePayloadEvent{Envelope: payloadA2}) + cl.OnEvent(engine.ForkchoiceUpdateEvent{ + UnsafeL2Head: refA1, + SafeL2Head: refA0, + FinalizedL2Head: refA0, + }) + emitter.AssertExpectations(t) + + // now pretend the payload was processed: we can drop A2 now + cl.OnEvent(engine.ForkchoiceUpdateEvent{ + UnsafeL2Head: refA2, + SafeL2Head: refA0, + FinalizedL2Head: refA0, + }) + require.Nil(t, cl.unsafePayloads.Peek(), "done") + }) + + t.Run("temporary error", func(t *testing.T) { + logger := testlog.Logger(t, log.LevelError) + + emitter := &testutils.MockEmitter{} + cl := NewCLSync(logger, cfg, metrics) + cl.AttachEmitter(emitter) + + emitter.ExpectOnce(engine.ForkchoiceRequestEvent{}) + cl.OnEvent(ReceivedUnsafePayloadEvent{Envelope: payloadA1}) + emitter.AssertExpectations(t) + + emitter.ExpectOnce(engine.ProcessUnsafePayloadEvent{Envelope: payloadA1}) + cl.OnEvent(engine.ForkchoiceUpdateEvent{ + UnsafeL2Head: refA0, + SafeL2Head: refA0, + FinalizedL2Head: refA0, + }) + emitter.AssertExpectations(t) + + // On temporary errors we don't need any feedback from the engine. + // We just hold on to what payloads there are in the queue. + require.NotNil(t, cl.unsafePayloads.Peek(), "no pop because temporary error") + + // Pretend we are still stuck on the same forkchoice. The CL-sync will retry sneding the payload. + emitter.ExpectOnce(engine.ProcessUnsafePayloadEvent{Envelope: payloadA1}) + cl.OnEvent(engine.ForkchoiceUpdateEvent{ + UnsafeL2Head: refA0, + SafeL2Head: refA0, + FinalizedL2Head: refA0, + }) + emitter.AssertExpectations(t) + require.NotNil(t, cl.unsafePayloads.Peek(), "no pop because retry still unconfirmed") + + // Now confirm we got the payload this time + cl.OnEvent(engine.ForkchoiceUpdateEvent{ + UnsafeL2Head: refA1, + SafeL2Head: refA0, + FinalizedL2Head: refA0, + }) + require.Nil(t, cl.unsafePayloads.Peek(), "pop because valid") + }) + + t.Run("invalid payload error", func(t *testing.T) { + logger := testlog.Logger(t, log.LevelError) + emitter := &testutils.MockEmitter{} + cl := NewCLSync(logger, cfg, metrics) + cl.AttachEmitter(emitter) + + // CLSync gets payload and requests engine state, to later determine if payload should be forwarded + emitter.ExpectOnce(engine.ForkchoiceRequestEvent{}) + cl.OnEvent(ReceivedUnsafePayloadEvent{Envelope: payloadA1}) + emitter.AssertExpectations(t) + + // Engine signals, CLSync sends the payload + emitter.ExpectOnce(engine.ProcessUnsafePayloadEvent{Envelope: payloadA1}) + cl.OnEvent(engine.ForkchoiceUpdateEvent{ + UnsafeL2Head: refA0, + SafeL2Head: refA0, + FinalizedL2Head: refA0, + }) + emitter.AssertExpectations(t) + + // Pretend the payload is bad. It should not be retried after this. + cl.OnEvent(engine.PayloadInvalidEvent{Envelope: payloadA1, Err: errors.New("test err")}) + emitter.AssertExpectations(t) + require.Nil(t, cl.unsafePayloads.Peek(), "pop because invalid") + }) +} diff --git a/op-node/rollup/derive/payloads_queue.go b/op-node/rollup/clsync/payloads_queue.go similarity index 99% rename from op-node/rollup/derive/payloads_queue.go rename to op-node/rollup/clsync/payloads_queue.go index 2ac554fb6d43..7061e00a99ac 100644 --- a/op-node/rollup/derive/payloads_queue.go +++ b/op-node/rollup/clsync/payloads_queue.go @@ -1,4 +1,4 @@ -package derive +package clsync import ( "container/heap" diff --git a/op-node/rollup/derive/payloads_queue_test.go b/op-node/rollup/clsync/payloads_queue_test.go similarity index 99% rename from op-node/rollup/derive/payloads_queue_test.go rename to op-node/rollup/clsync/payloads_queue_test.go index c5accbdeab11..58cef00ee775 100644 --- a/op-node/rollup/derive/payloads_queue_test.go +++ b/op-node/rollup/clsync/payloads_queue_test.go @@ -1,4 +1,4 @@ -package derive +package clsync import ( "container/heap" diff --git a/op-node/rollup/conductor/conductor.go b/op-node/rollup/conductor/conductor.go index 912b08cf071e..927d88035ccb 100644 --- a/op-node/rollup/conductor/conductor.go +++ b/op-node/rollup/conductor/conductor.go @@ -9,14 +9,21 @@ import ( // SequencerConductor is an interface for the driver to communicate with the sequencer conductor. // It is used to determine if the current node is the active sequencer, and to commit unsafe payloads to the conductor log. type SequencerConductor interface { + // Leader returns true if this node is the leader sequencer. Leader(ctx context.Context) (bool, error) + // CommitUnsafePayload commits an unsafe payload to the conductor FSM. CommitUnsafePayload(ctx context.Context, payload *eth.ExecutionPayloadEnvelope) error + // OverrideLeader forces current node to be considered leader and be able to start sequencing during disaster situations in HA mode. + OverrideLeader(ctx context.Context) error + // Close closes the conductor client. Close() } // NoOpConductor is a no-op conductor that assumes this node is the leader sequencer. type NoOpConductor struct{} +var _ SequencerConductor = &NoOpConductor{} + // Leader returns true if this node is the leader sequencer. NoOpConductor always returns true. func (c *NoOpConductor) Leader(ctx context.Context) (bool, error) { return true, nil @@ -27,5 +34,10 @@ func (c *NoOpConductor) CommitUnsafePayload(ctx context.Context, payload *eth.Ex return nil } +// OverrideLeader implements SequencerConductor. +func (c *NoOpConductor) OverrideLeader(ctx context.Context) error { + return nil +} + // Close closes the conductor client. func (c *NoOpConductor) Close() {} diff --git a/op-node/rollup/driver/conf_depth.go b/op-node/rollup/confdepth/conf_depth.go similarity index 88% rename from op-node/rollup/driver/conf_depth.go rename to op-node/rollup/confdepth/conf_depth.go index 194692bf39db..66b9534a7c25 100644 --- a/op-node/rollup/driver/conf_depth.go +++ b/op-node/rollup/confdepth/conf_depth.go @@ -1,4 +1,4 @@ -package driver +package confdepth import ( "context" @@ -28,9 +28,6 @@ func NewConfDepth(depth uint64, l1Head func() eth.L1BlockRef, fetcher derive.L1F // Any block numbers that are within confirmation depth of the L1 head are mocked to be "not found", // effectively hiding the uncertain part of the L1 chain. func (c *confDepth) L1BlockRefByNumber(ctx context.Context, num uint64) (eth.L1BlockRef, error) { - // 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 if l1Head is empty (as it is during the startup case before the l1State is initialized). l1Head := c.l1Head() if l1Head == (eth.L1BlockRef{}) { diff --git a/op-node/rollup/confdepth/conf_depth_test.go b/op-node/rollup/confdepth/conf_depth_test.go new file mode 100644 index 000000000000..2d717621aa5e --- /dev/null +++ b/op-node/rollup/confdepth/conf_depth_test.go @@ -0,0 +1,72 @@ +package confdepth + +import ( + "context" + "testing" + + "github.com/stretchr/testify/require" + + "github.com/ethereum/go-ethereum" + "github.com/ethereum/go-ethereum/common" + + "github.com/ethereum-optimism/optimism/op-service/eth" + "github.com/ethereum-optimism/optimism/op-service/testutils" +) + +type confTest struct { + name string + head uint64 + req uint64 + depth uint64 + pass bool +} + +func mockL1BlockRef(num uint64) eth.L1BlockRef { + return eth.L1BlockRef{Number: num, Hash: common.Hash{byte(num)}} +} + +func (ct *confTest) Run(t *testing.T) { + l1Fetcher := &testutils.MockL1Source{} + var l1Head eth.L1BlockRef + if ct.head != 0 { + l1Head = mockL1BlockRef(ct.head) + } + l1HeadGetter := func() eth.L1BlockRef { return l1Head } + + cd := NewConfDepth(ct.depth, l1HeadGetter, l1Fetcher) + if ct.pass { + // no calls to the l1Fetcher are made if the confirmation depth of the request is not met + l1Fetcher.ExpectL1BlockRefByNumber(ct.req, mockL1BlockRef(ct.req), nil) + } + out, err := cd.L1BlockRefByNumber(context.Background(), ct.req) + l1Fetcher.AssertExpectations(t) + if ct.pass { + require.NoError(t, err) + require.Equal(t, out, mockL1BlockRef(ct.req)) + } else { + require.Equal(t, ethereum.NotFound, err) + } +} + +func TestConfDepth(t *testing.T) { + // note: we're not testing overflows. + // If a request is large enough to overflow the conf depth check, it's not returning anything anyway. + testCases := []confTest{ + {name: "zero conf future", head: 4, req: 5, depth: 0, pass: true}, + {name: "zero conf present", head: 4, req: 4, depth: 0, pass: true}, + {name: "zero conf past", head: 4, req: 3, depth: 0, pass: true}, + {name: "one conf future", head: 4, req: 5, depth: 1, pass: false}, + {name: "one conf present", head: 4, req: 4, depth: 1, pass: false}, + {name: "one conf past", head: 4, req: 3, depth: 1, pass: true}, + {name: "two conf future", head: 4, req: 5, depth: 2, pass: false}, + {name: "two conf present", head: 4, req: 4, depth: 2, pass: false}, + {name: "two conf not like 1", head: 4, req: 3, depth: 2, pass: false}, + {name: "two conf pass", head: 4, req: 2, depth: 2, pass: true}, + {name: "easy pass", head: 100, req: 20, depth: 5, pass: true}, + {name: "genesis case", head: 0, req: 0, depth: 4, pass: true}, + {name: "no L1 state", req: 10, depth: 4, pass: true}, + } + for _, tc := range testCases { + t.Run(tc.name, tc.Run) + } +} diff --git a/op-node/rollup/derive/altda_data_source.go b/op-node/rollup/derive/altda_data_source.go new file mode 100644 index 000000000000..829d9399a4d2 --- /dev/null +++ b/op-node/rollup/derive/altda_data_source.go @@ -0,0 +1,103 @@ +package derive + +import ( + "context" + "errors" + "fmt" + + altda "github.com/ethereum-optimism/optimism/op-alt-da" + "github.com/ethereum-optimism/optimism/op-service/eth" + "github.com/ethereum/go-ethereum/log" +) + +// AltDADataSource is a data source that fetches inputs from a AltDA provider given +// their onchain commitments. Same as CalldataSource it will keep attempting to fetch. +type AltDADataSource struct { + log log.Logger + src DataIter + fetcher AltDAInputFetcher + l1 L1Fetcher + id eth.L1BlockRef + // keep track of a pending commitment so we can keep trying to fetch the input. + comm altda.CommitmentData +} + +func NewAltDADataSource(log log.Logger, src DataIter, l1 L1Fetcher, fetcher AltDAInputFetcher, id eth.L1BlockRef) *AltDADataSource { + return &AltDADataSource{ + log: log, + src: src, + fetcher: fetcher, + l1: l1, + id: id, + } +} + +func (s *AltDADataSource) Next(ctx context.Context) (eth.Data, error) { + // Process origin syncs the challenge contract events and updates the local challenge states + // before we can proceed to fetch the input data. This function can be called multiple times + // for the same origin and noop if the origin was already processed. It is also called if + // there is not commitment in the current origin. + if err := s.fetcher.AdvanceL1Origin(ctx, s.l1, s.id.ID()); err != nil { + if errors.Is(err, altda.ErrReorgRequired) { + return nil, NewResetError(errors.New("new expired challenge")) + } + return nil, NewTemporaryError(fmt.Errorf("failed to advance altDA L1 origin: %w", err)) + } + + if s.comm == nil { + // the l1 source returns the input commitment for the batch. + data, err := s.src.Next(ctx) + if err != nil { + return nil, err + } + + if len(data) == 0 { + return nil, NotEnoughData + } + // If the tx data type is not altDA, we forward it downstream to let the next + // steps validate and potentially parse it as L1 DA inputs. + if data[0] != altda.TxDataVersion1 { + return data, nil + } + + // validate batcher inbox data is a commitment. + // strip the transaction data version byte from the data before decoding. + comm, err := altda.DecodeCommitmentData(data[1:]) + if err != nil { + s.log.Warn("invalid commitment", "commitment", data, "err", err) + return nil, NotEnoughData + } + s.comm = comm + } + // use the commitment to fetch the input from the AltDA provider. + data, err := s.fetcher.GetInput(ctx, s.l1, s.comm, s.id) + // GetInput may call for a reorg if the pipeline is stalled and the AltDA manager + // continued syncing origins detached from the pipeline origin. + if errors.Is(err, altda.ErrReorgRequired) { + // challenge for a new previously derived commitment expired. + return nil, NewResetError(err) + } else if errors.Is(err, altda.ErrExpiredChallenge) { + // this commitment was challenged and the challenge expired. + s.log.Warn("challenge expired, skipping batch", "comm", s.comm) + s.comm = nil + // skip the input + return s.Next(ctx) + } else if errors.Is(err, altda.ErrMissingPastWindow) { + return nil, NewCriticalError(fmt.Errorf("data for comm %s not available: %w", s.comm, err)) + } else if errors.Is(err, altda.ErrPendingChallenge) { + // continue stepping without slowing down. + return nil, NotEnoughData + } else if err != nil { + // return temporary error so we can keep retrying. + return nil, NewTemporaryError(fmt.Errorf("failed to fetch input data with comm %s 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 s.comm.CommitmentType() == altda.Keccak256CommitmentType && len(data) > altda.MaxInputSize { + s.log.Warn("input data exceeds max size", "size", len(data), "max", altda.MaxInputSize) + s.comm = nil + return s.Next(ctx) + } + // reset the commitment so we can fetch the next one from the source at the next iteration. + s.comm = nil + return data, nil +} diff --git a/op-node/rollup/derive/altda_data_source_test.go b/op-node/rollup/derive/altda_data_source_test.go new file mode 100644 index 000000000000..5ce4a4447c50 --- /dev/null +++ b/op-node/rollup/derive/altda_data_source_test.go @@ -0,0 +1,542 @@ +package derive + +import ( + "context" + "io" + "math/big" + "math/rand" + "testing" + + altda "github.com/ethereum-optimism/optimism/op-alt-da" + "github.com/ethereum-optimism/optimism/op-node/rollup" + "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/common/hexutil" + "github.com/ethereum/go-ethereum/core/types" + "github.com/ethereum/go-ethereum/crypto" + "github.com/ethereum/go-ethereum/log" + "github.com/ethereum/go-ethereum/params" + "github.com/stretchr/testify/mock" + "github.com/stretchr/testify/require" +) + +type MockFinalitySignal struct { + mock.Mock +} + +func (m *MockFinalitySignal) OnFinalized(blockRef eth.L1BlockRef) { + m.MethodCalled("OnFinalized", blockRef) +} + +func (m *MockFinalitySignal) ExpectFinalized(blockRef eth.L1BlockRef) { + m.On("OnFinalized", blockRef).Once() +} + +// TestAltDADataSource verifies that commitments are correctly read from l1 and then +// forwarded to the AltDA to return the correct inputs in the iterator. +// First it generates some L1 refs containing a random number of commitments, challenges +// the first 4 commitments then generates enough blocks to expire the challenge. +// Then it simulates rederiving while verifying it does skip the expired input until the next +// challenge expires. +func TestAltDADataSource(t *testing.T) { + logger := testlog.Logger(t, log.LevelDebug) + ctx := context.Background() + + rng := rand.New(rand.NewSource(1234)) + + l1F := &testutils.MockL1Source{} + + storage := altda.NewMockDAClient(logger) + + pcfg := altda.Config{ + ChallengeWindow: 90, ResolveWindow: 90, + } + metrics := &altda.NoopMetrics{} + + daState := altda.NewState(logger, metrics, pcfg) + + da := altda.NewAltDAWithState(logger, pcfg, storage, metrics, daState) + + finalitySignal := &MockFinalitySignal{} + da.OnFinalizedHeadSignal(finalitySignal.OnFinalized) + + // Create rollup genesis and config + l1Time := uint64(2) + refA := testutils.RandomBlockRef(rng) + refA.Number = 1 + l1Refs := []eth.L1BlockRef{refA} + refA0 := eth.L2BlockRef{ + Hash: testutils.RandomHash(rng), + Number: 0, + ParentHash: common.Hash{}, + Time: refA.Time, + L1Origin: refA.ID(), + SequenceNumber: 0, + } + batcherPriv := testutils.RandomKey() + batcherAddr := crypto.PubkeyToAddress(batcherPriv.PublicKey) + batcherInbox := common.Address{42} + cfg := &rollup.Config{ + Genesis: rollup.Genesis{ + L1: refA.ID(), + L2: refA0.ID(), + L2Time: refA0.Time, + }, + BlockTime: 1, + SeqWindowSize: 20, + BatchInboxAddress: batcherInbox, + AltDAConfig: &rollup.AltDAConfig{ + DAChallengeWindow: pcfg.ChallengeWindow, + DAResolveWindow: pcfg.ResolveWindow, + CommitmentType: altda.KeccakCommitmentString, + }, + } + // keep track of random input data to validate against + var inputs [][]byte + var comms []altda.CommitmentData + var inclusionBlocks []eth.L1BlockRef + + signer := cfg.L1Signer() + + factory := NewDataSourceFactory(logger, cfg, l1F, nil, da) + + nc := 0 + firstChallengeExpirationBlock := uint64(95) + + for i := uint64(0); i <= pcfg.ChallengeWindow+pcfg.ResolveWindow; i++ { + parent := l1Refs[len(l1Refs)-1] + // create a new mock l1 ref + ref := eth.L1BlockRef{ + Hash: testutils.RandomHash(rng), + Number: parent.Number + 1, + ParentHash: parent.Hash, + Time: parent.Time + l1Time, + } + l1Refs = append(l1Refs, ref) + logger.Info("new l1 block", "ref", ref) + // called for each l1 block to sync challenges + l1F.ExpectFetchReceipts(ref.Hash, nil, types.Receipts{}, nil) + + // pick a random number of commitments to include in the l1 block + c := rng.Intn(4) + var txs []*types.Transaction + + for j := 0; j < c; j++ { + // mock input commitments in l1 transactions + input := testutils.RandomData(rng, 2000) + comm, _ := storage.SetInput(ctx, input) + // altDA tests are designed for keccak256 commitments, so we type assert here + kComm := comm.(altda.Keccak256Commitment) + inputs = append(inputs, input) + comms = append(comms, kComm) + inclusionBlocks = append(inclusionBlocks, ref) + + tx, err := types.SignNewTx(batcherPriv, signer, &types.DynamicFeeTx{ + ChainID: signer.ChainID(), + Nonce: 0, + GasTipCap: big.NewInt(2 * params.GWei), + GasFeeCap: big.NewInt(30 * params.GWei), + Gas: 100_000, + To: &batcherInbox, + Value: big.NewInt(int64(0)), + Data: comm.TxData(), + }) + require.NoError(t, err) + + txs = append(txs, tx) + + } + logger.Info("included commitments", "count", c) + l1F.ExpectInfoAndTxsByHash(ref.Hash, testutils.RandomBlockInfo(rng), txs, nil) + // called once per derivation + l1F.ExpectInfoAndTxsByHash(ref.Hash, testutils.RandomBlockInfo(rng), txs, nil) + + if ref.Number == 2 { + l1F.ExpectL1BlockRefByNumber(ref.Number, ref, nil) + finalitySignal.ExpectFinalized(ref) + } + + // challenge the first 4 commitments as soon as we have collected them all + if len(comms) >= 4 && nc < 7 { + // skip a block between each challenge transaction + if nc%2 == 0 { + daState.CreateChallenge(comms[nc/2], ref.ID(), inclusionBlocks[nc/2].Number) + logger.Info("setting active challenge", "comm", comms[nc/2]) + } + nc++ + } + + // create a new data source for each block + src, err := factory.OpenData(ctx, ref, batcherAddr) + require.NoError(t, err) + + // first challenge expires + if i == firstChallengeExpirationBlock { + _, err := src.Next(ctx) + require.ErrorIs(t, err, ErrReset) + break + } + + for j := 0; j < c; j++ { + data, err := src.Next(ctx) + // check that each commitment is resolved + require.NoError(t, err) + require.Equal(t, hexutil.Bytes(inputs[len(inputs)-(c-j)]), data) + } + // returns EOF once done + _, err = src.Next(ctx) + require.ErrorIs(t, err, io.EOF) + } + + logger.Info("pipeline reset ..................................") + + // start at 1 since first input should be skipped + nc = 1 + secondChallengeExpirationBlock := 98 + + for i := 1; i <= len(l1Refs)+2; i++ { + + var ref eth.L1BlockRef + // first we run through all the existing l1 blocks + if i < len(l1Refs) { + ref = l1Refs[i] + logger.Info("re deriving block", "ref", ref, "i", i) + + if i == len(l1Refs)-1 { + l1F.ExpectFetchReceipts(ref.Hash, nil, types.Receipts{}, nil) + } + // once past the l1 head, continue generating new l1 refs + } else { + parent := l1Refs[len(l1Refs)-1] + // create a new mock l1 ref + ref = eth.L1BlockRef{ + Hash: testutils.RandomHash(rng), + Number: parent.Number + 1, + ParentHash: parent.Hash, + Time: parent.Time + l1Time, + } + l1Refs = append(l1Refs, ref) + logger.Info("new l1 block", "ref", ref) + // called for each l1 block to sync challenges + l1F.ExpectFetchReceipts(ref.Hash, nil, types.Receipts{}, nil) + + // pick a random number of commitments to include in the l1 block + c := rng.Intn(4) + var txs []*types.Transaction + + for j := 0; j < c; j++ { + // mock input commitments in l1 transactions + input := testutils.RandomData(rng, 2000) + comm, _ := storage.SetInput(ctx, input) + // altDA tests are designed for keccak256 commitments, so we type assert here + kComm := comm.(altda.Keccak256Commitment) + inputs = append(inputs, input) + comms = append(comms, kComm) + + tx, err := types.SignNewTx(batcherPriv, signer, &types.DynamicFeeTx{ + ChainID: signer.ChainID(), + Nonce: 0, + GasTipCap: big.NewInt(2 * params.GWei), + GasFeeCap: big.NewInt(30 * params.GWei), + Gas: 100_000, + To: &batcherInbox, + Value: big.NewInt(int64(0)), + Data: comm.TxData(), + }) + require.NoError(t, err) + + txs = append(txs, tx) + + } + logger.Info("included commitments", "count", c) + l1F.ExpectInfoAndTxsByHash(ref.Hash, testutils.RandomBlockInfo(rng), txs, nil) + } + + // create a new data source for each block + src, err := factory.OpenData(ctx, ref, batcherAddr) + require.NoError(t, err) + + // next challenge expires + if i == secondChallengeExpirationBlock { + _, err := src.Next(ctx) + require.ErrorIs(t, err, ErrReset) + break + } + + for data, err := src.Next(ctx); err != io.EOF; data, err = src.Next(ctx) { + logger.Info("yielding data") + // check that each commitment is resolved + require.NoError(t, err) + require.Equal(t, hexutil.Bytes(inputs[nc]), data) + + nc++ + } + + } + + // finalize based on the second to last block, which will prune the commitment on block 2, and make it finalized + da.Finalize(l1Refs[len(l1Refs)-2]) + finalitySignal.AssertExpectations(t) +} + +// This tests makes sure the pipeline returns a temporary error if data is not found. +func TestAltDADataSourceStall(t *testing.T) { + logger := testlog.Logger(t, log.LevelDebug) + ctx := context.Background() + + rng := rand.New(rand.NewSource(1234)) + + l1F := &testutils.MockL1Source{} + + storage := altda.NewMockDAClient(logger) + + pcfg := altda.Config{ + ChallengeWindow: 90, ResolveWindow: 90, + } + + metrics := &altda.NoopMetrics{} + + daState := altda.NewState(logger, metrics, pcfg) + + da := altda.NewAltDAWithState(logger, pcfg, storage, metrics, daState) + + finalitySignal := &MockFinalitySignal{} + da.OnFinalizedHeadSignal(finalitySignal.OnFinalized) + + // Create rollup genesis and config + l1Time := uint64(2) + refA := testutils.RandomBlockRef(rng) + refA.Number = 1 + l1Refs := []eth.L1BlockRef{refA} + refA0 := eth.L2BlockRef{ + Hash: testutils.RandomHash(rng), + Number: 0, + ParentHash: common.Hash{}, + Time: refA.Time, + L1Origin: refA.ID(), + SequenceNumber: 0, + } + batcherPriv := testutils.RandomKey() + batcherAddr := crypto.PubkeyToAddress(batcherPriv.PublicKey) + batcherInbox := common.Address{42} + cfg := &rollup.Config{ + Genesis: rollup.Genesis{ + L1: refA.ID(), + L2: refA0.ID(), + L2Time: refA0.Time, + }, + BlockTime: 1, + SeqWindowSize: 20, + BatchInboxAddress: batcherInbox, + AltDAConfig: &rollup.AltDAConfig{ + DAChallengeWindow: pcfg.ChallengeWindow, + DAResolveWindow: pcfg.ResolveWindow, + CommitmentType: altda.KeccakCommitmentString, + }, + } + + signer := cfg.L1Signer() + + factory := NewDataSourceFactory(logger, cfg, l1F, nil, da) + + parent := l1Refs[0] + // create a new mock l1 ref + ref := eth.L1BlockRef{ + Hash: testutils.RandomHash(rng), + Number: parent.Number + 1, + ParentHash: parent.Hash, + Time: parent.Time + l1Time, + } + l1F.ExpectFetchReceipts(ref.Hash, nil, types.Receipts{}, nil) + // mock input commitments in l1 transactions + input := testutils.RandomData(rng, 2000) + comm, _ := storage.SetInput(ctx, input) + + tx, err := types.SignNewTx(batcherPriv, signer, &types.DynamicFeeTx{ + ChainID: signer.ChainID(), + Nonce: 0, + GasTipCap: big.NewInt(2 * params.GWei), + GasFeeCap: big.NewInt(30 * params.GWei), + Gas: 100_000, + To: &batcherInbox, + Value: big.NewInt(int64(0)), + Data: comm.TxData(), + }) + require.NoError(t, err) + + txs := []*types.Transaction{tx} + + l1F.ExpectInfoAndTxsByHash(ref.Hash, testutils.RandomBlockInfo(rng), txs, nil) + + // delete the input from the DA provider so it returns not found + require.NoError(t, storage.DeleteData(comm.Encode())) + + // next block is fetched to look ahead challenges but is not yet available + l1F.ExpectL1BlockRefByNumber(ref.Number+1, eth.L1BlockRef{}, ethereum.NotFound) + + src, err := factory.OpenData(ctx, ref, batcherAddr) + require.NoError(t, err) + + // data is not found so we return a temporary error + _, err = src.Next(ctx) + require.ErrorIs(t, err, ErrTemporary) + + // next block is available with no challenge events + nextRef := eth.L1BlockRef{ + Number: ref.Number + 1, + Hash: testutils.RandomHash(rng), + } + l1F.ExpectL1BlockRefByNumber(nextRef.Number, nextRef, nil) + l1F.ExpectFetchReceipts(nextRef.Hash, nil, types.Receipts{}, nil) + + // not enough data + _, err = src.Next(ctx) + require.ErrorIs(t, err, NotEnoughData) + + // create and resolve a challenge + daState.CreateChallenge(comm, ref.ID(), ref.Number) + // now challenge is resolved + err = daState.ResolveChallenge(comm, eth.BlockID{Number: ref.Number + 2}, ref.Number, input) + require.NoError(t, err) + + // derivation can resume + data, err := src.Next(ctx) + require.NoError(t, err) + require.Equal(t, hexutil.Bytes(input), data) + + l1F.AssertExpectations(t) +} + +// TestAltDADataSourceInvalidData tests that the pipeline skips invalid data and continues +// this includes invalid commitments and oversized inputs. +func TestAltDADataSourceInvalidData(t *testing.T) { + logger := testlog.Logger(t, log.LevelDebug) + ctx := context.Background() + + rng := rand.New(rand.NewSource(1234)) + + l1F := &testutils.MockL1Source{} + + storage := altda.NewMockDAClient(logger) + + pcfg := altda.Config{ + ChallengeWindow: 90, ResolveWindow: 90, + } + + da := altda.NewAltDAWithStorage(logger, pcfg, storage, &altda.NoopMetrics{}) + + // Create rollup genesis and config + l1Time := uint64(2) + refA := testutils.RandomBlockRef(rng) + refA.Number = 1 + l1Refs := []eth.L1BlockRef{refA} + refA0 := eth.L2BlockRef{ + Hash: testutils.RandomHash(rng), + Number: 0, + ParentHash: common.Hash{}, + Time: refA.Time, + L1Origin: refA.ID(), + SequenceNumber: 0, + } + batcherPriv := testutils.RandomKey() + batcherAddr := crypto.PubkeyToAddress(batcherPriv.PublicKey) + batcherInbox := common.Address{42} + cfg := &rollup.Config{ + Genesis: rollup.Genesis{ + L1: refA.ID(), + L2: refA0.ID(), + L2Time: refA0.Time, + }, + BlockTime: 1, + SeqWindowSize: 20, + BatchInboxAddress: batcherInbox, + AltDAConfig: &rollup.AltDAConfig{ + DAChallengeWindow: pcfg.ChallengeWindow, + DAResolveWindow: pcfg.ResolveWindow, + CommitmentType: altda.KeccakCommitmentString, + }, + } + + signer := cfg.L1Signer() + + factory := NewDataSourceFactory(logger, cfg, l1F, nil, da) + + parent := l1Refs[0] + // create a new mock l1 ref + ref := eth.L1BlockRef{ + Hash: testutils.RandomHash(rng), + Number: parent.Number + 1, + ParentHash: parent.Hash, + Time: parent.Time + l1Time, + } + l1F.ExpectFetchReceipts(ref.Hash, nil, types.Receipts{}, nil) + // mock input commitments in l1 transactions with an oversized input + input := testutils.RandomData(rng, altda.MaxInputSize+1) + comm, _ := storage.SetInput(ctx, input) + + tx1, err := types.SignNewTx(batcherPriv, signer, &types.DynamicFeeTx{ + ChainID: signer.ChainID(), + Nonce: 0, + GasTipCap: big.NewInt(2 * params.GWei), + GasFeeCap: big.NewInt(30 * params.GWei), + Gas: 100_000, + To: &batcherInbox, + Value: big.NewInt(int64(0)), + Data: comm.TxData(), + }) + require.NoError(t, err) + + // valid data + input2 := testutils.RandomData(rng, 2000) + comm2, _ := storage.SetInput(ctx, input2) + tx2, err := types.SignNewTx(batcherPriv, signer, &types.DynamicFeeTx{ + ChainID: signer.ChainID(), + Nonce: 0, + GasTipCap: big.NewInt(2 * params.GWei), + GasFeeCap: big.NewInt(30 * params.GWei), + Gas: 100_000, + To: &batcherInbox, + Value: big.NewInt(int64(0)), + Data: comm2.TxData(), + }) + require.NoError(t, err) + + // regular input instead of commitment + input3 := testutils.RandomData(rng, 32) + tx3, err := types.SignNewTx(batcherPriv, signer, &types.DynamicFeeTx{ + ChainID: signer.ChainID(), + Nonce: 0, + GasTipCap: big.NewInt(2 * params.GWei), + GasFeeCap: big.NewInt(30 * params.GWei), + Gas: 100_000, + To: &batcherInbox, + Value: big.NewInt(int64(0)), + Data: input3, + }) + require.NoError(t, err) + + txs := []*types.Transaction{tx1, tx2, tx3} + + l1F.ExpectInfoAndTxsByHash(ref.Hash, testutils.RandomBlockInfo(rng), txs, nil) + + src, err := factory.OpenData(ctx, ref, batcherAddr) + require.NoError(t, err) + + // oversized input is skipped and returns input2 directly + data, err := src.Next(ctx) + require.NoError(t, err) + require.Equal(t, hexutil.Bytes(input2), data) + + // regular input is passed through + data, err = src.Next(ctx) + require.NoError(t, err) + require.Equal(t, hexutil.Bytes(input3), data) + + _, err = src.Next(ctx) + require.ErrorIs(t, err, io.EOF) + + l1F.AssertExpectations(t) +} diff --git a/op-node/rollup/derive/attributes.go b/op-node/rollup/derive/attributes.go index c65198bcec73..cc38a31b9c54 100644 --- a/op-node/rollup/derive/attributes.go +++ b/op-node/rollup/derive/attributes.go @@ -121,9 +121,19 @@ func (ba *FetchingAttributesBuilder) PreparePayloadAttributes(ctx context.Contex return nil, NewCriticalError(fmt.Errorf("failed to create l1InfoTx: %w", err)) } - txs := make([]hexutil.Bytes, 0, 1+len(depositTxs)+len(upgradeTxs)) + var afterForceIncludeTxs []hexutil.Bytes + if ba.rollupCfg.IsInterop(nextL2Time) { + depositsCompleteTx, err := DepositsCompleteBytes(seqNumber, l1Info) + if err != nil { + return nil, NewCriticalError(fmt.Errorf("failed to create depositsCompleteTx: %w", err)) + } + afterForceIncludeTxs = append(afterForceIncludeTxs, depositsCompleteTx) + } + + txs := make([]hexutil.Bytes, 0, 1+len(depositTxs)+len(afterForceIncludeTxs)+len(upgradeTxs)) txs = append(txs, l1InfoTx) txs = append(txs, depositTxs...) + txs = append(txs, afterForceIncludeTxs...) txs = append(txs, upgradeTxs...) var withdrawals *types.Withdrawals diff --git a/op-node/rollup/derive/attributes_queue.go b/op-node/rollup/derive/attributes_queue.go index e923695a6cdf..c15079c6bfa9 100644 --- a/op-node/rollup/derive/attributes_queue.go +++ b/op-node/rollup/derive/attributes_queue.go @@ -12,7 +12,7 @@ import ( "github.com/ethereum-optimism/optimism/op-service/eth" ) -// The attributes queue sits in between the batch queue and the engine queue +// The attributes queue sits after the batch queue. // It transforms batches into payload attributes. The outputted payload // attributes cannot be buffered because each batch->attributes transformation // pulls in data about the current L2 safe head. @@ -27,6 +27,14 @@ type AttributesBuilder interface { PreparePayloadAttributes(ctx context.Context, l2Parent eth.L2BlockRef, epoch eth.BlockID) (attrs *eth.PayloadAttributes, err error) } +type AttributesWithParent struct { + Attributes *eth.PayloadAttributes + Parent eth.L2BlockRef + IsLastInSpan bool + + DerivedFrom eth.L1BlockRef +} + type AttributesQueue struct { log log.Logger config *rollup.Config @@ -65,7 +73,12 @@ func (aq *AttributesQueue) NextAttributes(ctx context.Context, parent eth.L2Bloc return nil, err } else { // Clear out the local state once we will succeed - attr := AttributesWithParent{attrs, parent, aq.isLastInSpan} + attr := AttributesWithParent{ + Attributes: attrs, + Parent: parent, + IsLastInSpan: aq.isLastInSpan, + DerivedFrom: aq.Origin(), + } aq.batch = nil aq.isLastInSpan = false return &attr, nil diff --git a/op-node/rollup/derive/attributes_test.go b/op-node/rollup/derive/attributes_test.go index 68c7c71aa1e1..64fcec556343 100644 --- a/op-node/rollup/derive/attributes_test.go +++ b/op-node/rollup/derive/attributes_test.go @@ -195,6 +195,98 @@ func TestPreparePayloadAttributes(t *testing.T) { require.Equal(t, l1InfoTx, []byte(attrs.Transactions[0])) require.True(t, attrs.NoTxPool) }) + t.Run("new origin with deposits on post-Isthmus", func(t *testing.T) { + rng := rand.New(rand.NewSource(1234)) + l1Fetcher := &testutils.MockL1Source{} + defer l1Fetcher.AssertExpectations(t) + l2Parent := testutils.RandomL2BlockRef(rng) + l1CfgFetcher := &testutils.MockL2Client{} + l1CfgFetcher.ExpectSystemConfigByL2Hash(l2Parent.Hash, testSysCfg, nil) + defer l1CfgFetcher.AssertExpectations(t) + + l1Info := testutils.RandomBlockInfo(rng) + l1Info.InfoParentHash = l2Parent.L1Origin.Hash + l1Info.InfoNum = l2Parent.L1Origin.Number + 1 // next origin, where deposits may be + + receipts, depositTxs, err := makeReceipts(rng, l1Info.InfoHash, cfg.DepositContractAddress, []receiptData{ + {goodReceipt: true, DepositLogs: []bool{true, false}}, + {goodReceipt: true, DepositLogs: []bool{true}}, + {goodReceipt: false, DepositLogs: []bool{true}}, + {goodReceipt: false, DepositLogs: []bool{false}}, + }) + require.NoError(t, err) + userDepositTxs, err := encodeDeposits(depositTxs) + require.NoError(t, err) + + // sets config to post-interop + cfg.ActivateAtGenesis(rollup.Interop) + + seqNumber := uint64(0) + epoch := l1Info.ID() + l1InfoTx, err := L1InfoDepositBytes(cfg, testSysCfg, seqNumber, l1Info, 0) + require.NoError(t, err) + depositsComplete, err := DepositsCompleteBytes(seqNumber, l1Info) + require.NoError(t, err) + + var l2Txs []eth.Data + l2Txs = append(l2Txs, l1InfoTx) + l2Txs = append(l2Txs, userDepositTxs...) + l2Txs = append(l2Txs, depositsComplete) + + l1Fetcher.ExpectFetchReceipts(epoch.Hash, l1Info, receipts, nil) + attrBuilder := NewFetchingAttributesBuilder(cfg, l1Fetcher, l1CfgFetcher) + attrs, err := attrBuilder.PreparePayloadAttributes(context.Background(), l2Parent, epoch) + require.NoError(t, err) + require.NotNil(t, attrs) + require.Equal(t, l2Parent.Time+cfg.BlockTime, uint64(attrs.Timestamp)) + require.Equal(t, eth.Bytes32(l1Info.InfoMixDigest), attrs.PrevRandao) + require.Equal(t, predeploys.SequencerFeeVaultAddr, attrs.SuggestedFeeRecipient) + require.Equal(t, len(l2Txs), len(attrs.Transactions), "Expected txs to equal l1 info tx + user deposit txs + DepositsComplete") + require.Equal(t, eth.Data(depositsComplete).String(), attrs.Transactions[len(l2Txs)-1].String()) + require.Equal(t, l2Txs, attrs.Transactions) + require.True(t, attrs.NoTxPool) + }) + + t.Run("same origin without deposits on post-Isthmus", func(t *testing.T) { + rng := rand.New(rand.NewSource(1234)) + l1Fetcher := &testutils.MockL1Source{} + defer l1Fetcher.AssertExpectations(t) + l2Parent := testutils.RandomL2BlockRef(rng) + l1CfgFetcher := &testutils.MockL2Client{} + l1CfgFetcher.ExpectSystemConfigByL2Hash(l2Parent.Hash, testSysCfg, nil) + defer l1CfgFetcher.AssertExpectations(t) + l1Info := testutils.RandomBlockInfo(rng) + l1Info.InfoHash = l2Parent.L1Origin.Hash + l1Info.InfoNum = l2Parent.L1Origin.Number // same origin again, so the sequence number is not reset + + // sets config to post-interop + cfg.ActivateAtGenesis(rollup.Interop) + + seqNumber := l2Parent.SequenceNumber + 1 + epoch := l1Info.ID() + l1InfoTx, err := L1InfoDepositBytes(cfg, testSysCfg, seqNumber, l1Info, 0) + require.NoError(t, err) + depositsComplete, err := DepositsCompleteBytes(seqNumber, l1Info) + require.NoError(t, err) + + var l2Txs []eth.Data + l2Txs = append(l2Txs, l1InfoTx) + l2Txs = append(l2Txs, depositsComplete) + + l1Fetcher.ExpectInfoByHash(epoch.Hash, l1Info, nil) + attrBuilder := NewFetchingAttributesBuilder(cfg, l1Fetcher, l1CfgFetcher) + attrs, err := attrBuilder.PreparePayloadAttributes(context.Background(), l2Parent, epoch) + require.NoError(t, err) + require.NotNil(t, attrs) + require.Equal(t, l2Parent.Time+cfg.BlockTime, uint64(attrs.Timestamp)) + require.Equal(t, eth.Bytes32(l1Info.InfoMixDigest), attrs.PrevRandao) + require.Equal(t, predeploys.SequencerFeeVaultAddr, attrs.SuggestedFeeRecipient) + require.Equal(t, len(l2Txs), len(attrs.Transactions), "Expected txs to equal l1 info tx + user deposit txs + DepositsComplete") + require.Equal(t, eth.Data(depositsComplete).String(), attrs.Transactions[len(l2Txs)-1].String()) + require.Equal(t, l2Txs, attrs.Transactions) + require.True(t, attrs.NoTxPool) + }) + // Test that the payload attributes builder changes the deposit format based on L2-time-based regolith activation t.Run("regolith", func(t *testing.T) { testCases := []struct { diff --git a/op-node/rollup/derive/batch_queue.go b/op-node/rollup/derive/batch_queue.go index 3dbfe20d305d..4ca49907c7de 100644 --- a/op-node/rollup/derive/batch_queue.go +++ b/op-node/rollup/derive/batch_queue.go @@ -109,21 +109,6 @@ func (bq *BatchQueue) NextBatch(ctx context.Context, parent eth.L2BlockRef) (*Si } } - // If the epoch is advanced, update bq.l1Blocks - // Advancing epoch must be done after the pipeline successfully apply the entire span batch to the chain. - // Because the span batch can be reverted during processing the batch, then we must preserve existing l1Blocks - // to verify the epochs of the next candidate batch. - if len(bq.l1Blocks) > 0 && parent.L1Origin.Number > bq.l1Blocks[0].Number { - for i, l1Block := range bq.l1Blocks { - if parent.L1Origin.Number == l1Block.Number { - bq.l1Blocks = bq.l1Blocks[i:] - bq.log.Debug("Advancing internal L1 blocks", "next_epoch", bq.l1Blocks[0].ID(), "next_epoch_time", bq.l1Blocks[0].Time) - break - } - } - // If we can't find the origin of parent block, we have to advance bq.origin. - } - // Note: We use the origin that we will have to determine if it's behind. This is important // because it's the future origin that gets saved into the l1Blocks array. // We always update the origin of this stage if it is not the same so after the update code @@ -146,6 +131,21 @@ func (bq *BatchQueue) NextBatch(ctx context.Context, parent eth.L2BlockRef) (*Si bq.log.Info("Advancing bq origin", "origin", bq.origin, "originBehind", originBehind) } + // If the epoch is advanced, update bq.l1Blocks + // Advancing epoch must be done after the pipeline successfully apply the entire span batch to the chain. + // Because the span batch can be reverted during processing the batch, then we must preserve existing l1Blocks + // to verify the epochs of the next candidate batch. + if len(bq.l1Blocks) > 0 && parent.L1Origin.Number > bq.l1Blocks[0].Number { + for i, l1Block := range bq.l1Blocks { + if parent.L1Origin.Number == l1Block.Number { + bq.l1Blocks = bq.l1Blocks[i:] + bq.log.Debug("Advancing internal L1 blocks", "next_epoch", bq.l1Blocks[0].ID(), "next_epoch_time", bq.l1Blocks[0].Time) + break + } + } + // If we can't find the origin of parent block, we have to advance bq.origin. + } + // Load more data into the batch queue outOfData := false if batch, err := bq.prev.NextBatch(ctx); err == io.EOF { diff --git a/op-node/rollup/derive/batch_queue_test.go b/op-node/rollup/derive/batch_queue_test.go index 6712ae15a680..f047f0a7d4fe 100644 --- a/op-node/rollup/derive/batch_queue_test.go +++ b/op-node/rollup/derive/batch_queue_test.go @@ -147,6 +147,7 @@ func TestBatchQueue(t *testing.T) { {"BatchQueueMissing", BatchQueueMissing}, {"BatchQueueAdvancedEpoch", BatchQueueAdvancedEpoch}, {"BatchQueueShuffle", BatchQueueShuffle}, + {"BatchQueueResetOneBlockBeforeOrigin", BatchQueueResetOneBlockBeforeOrigin}, } for _, test := range tests { test := test @@ -224,6 +225,67 @@ func BatchQueueNewOrigin(t *testing.T, batchType int) { require.Equal(t, l1[2], bq.origin) } +// BatchQueueResetOneBlockBeforeOrigin tests that the batch queue properly +// prunes the l1Block recorded as part of a reset when the starting origin +// is exactly one block prior to the safe head origin. +func BatchQueueResetOneBlockBeforeOrigin(t *testing.T, batchType int) { + log := testlog.Logger(t, log.LevelTrace) + l1 := L1Chain([]uint64{10, 15, 20, 25}) + safeHead := eth.L2BlockRef{ + Hash: mockHash(10, 2), + Number: 0, + ParentHash: common.Hash{}, + Time: 20, + L1Origin: l1[1].ID(), + SequenceNumber: 0, + } + cfg := &rollup.Config{ + Genesis: rollup.Genesis{ + L2Time: 10, + }, + BlockTime: 2, + MaxSequencerDrift: 600, + SeqWindowSize: 2, + DeltaTime: getDeltaTime(batchType), + } + + input := &fakeBatchQueueInput{ + batches: []Batch{nil}, + errors: []error{io.EOF}, + origin: l1[0], + } + + bq := NewBatchQueue(log, cfg, input, nil) + _ = bq.Reset(context.Background(), l1[0], eth.SystemConfig{}) + require.Equal(t, []eth.L1BlockRef{l1[0]}, bq.l1Blocks) + + // Prev Origin: 0; Safehead Origin: 1; Internal Origin: 0 + // Should return no data but keep the same origin + data, _, err := bq.NextBatch(context.Background(), safeHead) + require.Nil(t, data) + require.Equal(t, io.EOF, err) + require.Equal(t, []eth.L1BlockRef{l1[0]}, bq.l1Blocks) + require.Equal(t, l1[0], bq.origin) + + // Prev Origin: 1; Safehead Origin: 1; Internal Origin: 0 + // Should record new l1 origin in l1blocks, prune block 0 and advance internal origin + input.origin = l1[1] + data, _, err = bq.NextBatch(context.Background(), safeHead) + require.Nil(t, data) + require.Equalf(t, io.EOF, err, "expected io.EOF but got %v", err) + require.Equal(t, []eth.L1BlockRef{l1[1]}, bq.l1Blocks) + require.Equal(t, l1[1], bq.origin) + + // Prev Origin: 2; Safehead Origin: 1; Internal Origin: 1 + // Should add to l1Blocks + advance internal origin + input.origin = l1[2] + data, _, err = bq.NextBatch(context.Background(), safeHead) + require.Nil(t, data) + require.Equal(t, io.EOF, err) + require.Equal(t, []eth.L1BlockRef{l1[1], l1[2]}, bq.l1Blocks) + require.Equal(t, l1[2], bq.origin) +} + // BatchQueueEager adds a bunch of contiguous batches and asserts that // enough calls to `NextBatch` return all of those batches. func BatchQueueEager(t *testing.T, batchType int) { diff --git a/op-node/rollup/derive/batch_test.go b/op-node/rollup/derive/batch_test.go index 3dc554a59325..9e48f265d745 100644 --- a/op-node/rollup/derive/batch_test.go +++ b/op-node/rollup/derive/batch_test.go @@ -6,12 +6,11 @@ import ( "math/rand" "testing" - "github.com/stretchr/testify/require" - "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/rlp" + "github.com/stretchr/testify/require" "github.com/ethereum-optimism/optimism/op-node/rollup" "github.com/ethereum-optimism/optimism/op-service/eth" diff --git a/op-node/rollup/derive/batch_test_utils.go b/op-node/rollup/derive/batch_test_utils.go index 3b931cc4f03b..5783b5ec39bf 100644 --- a/op-node/rollup/derive/batch_test_utils.go +++ b/op-node/rollup/derive/batch_test_utils.go @@ -21,7 +21,7 @@ func RandomSingularBatch(rng *rand.Rand, txCount int, chainID *big.Int) *Singula if err != nil { panic("tx Marshal binary" + err.Error()) } - txsEncoded = append(txsEncoded, hexutil.Bytes(txEncoded)) + txsEncoded = append(txsEncoded, txEncoded) } return &SingularBatch{ ParentHash: testutils.RandomHash(rng), diff --git a/op-node/rollup/derive/blob_data_source.go b/op-node/rollup/derive/blob_data_source.go index 05bd5d326388..22d0bb348fbf 100644 --- a/op-node/rollup/derive/blob_data_source.go +++ b/op-node/rollup/derive/blob_data_source.go @@ -106,7 +106,7 @@ func (ds *BlobDataSource) open(ctx context.Context) ([]blobOrCalldata, error) { return nil, err } - data, hashes := dataAndHashesFromTxs(txs, &ds.dsCfg, ds.batcherAddr, txSucceeded) + data, hashes := dataAndHashesFromTxs(txs, &ds.dsCfg, ds.batcherAddr, ds.log, txSucceeded) if len(hashes) == 0 { // there are no blobs to fetch so we can return immediately @@ -135,13 +135,13 @@ func (ds *BlobDataSource) open(ctx context.Context) ([]blobOrCalldata, error) { // dataAndHashesFromTxs extracts calldata and datahashes from the input transactions and returns them. It // creates a placeholder blobOrCalldata element for each returned blob hash that must be populated // by fillBlobPointers after blob bodies are retrieved. -func dataAndHashesFromTxs(txs types.Transactions, config *DataSourceConfig, batcherAddr common.Address, txSucceeded map[common.Hash]bool) ([]blobOrCalldata, []eth.IndexedBlobHash) { +func dataAndHashesFromTxs(txs types.Transactions, config *DataSourceConfig, batcherAddr common.Address, logger log.Logger, txSucceeded map[common.Hash]bool) ([]blobOrCalldata, []eth.IndexedBlobHash) { data := []blobOrCalldata{} var hashes []eth.IndexedBlobHash blobIndex := 0 // index of each blob in the block's blob sidecar for _, tx := range txs { // skip any non-batcher transactions or failed transactions - if !(isValidBatchTx(tx, config.l1Signer, config.batchInboxAddress, batcherAddr) && txSucceeded[tx.Hash()]) { + if !(isValidBatchTx(tx, config.l1Signer, config.batchInboxAddress, batcherAddr, logger) && txSucceeded[tx.Hash()]) { blobIndex += len(tx.BlobHashes()) continue } diff --git a/op-node/rollup/derive/blob_data_source_test.go b/op-node/rollup/derive/blob_data_source_test.go index 2d4e8873c0ce..2c3b95376ce9 100644 --- a/op-node/rollup/derive/blob_data_source_test.go +++ b/op-node/rollup/derive/blob_data_source_test.go @@ -13,7 +13,9 @@ import ( "github.com/ethereum/go-ethereum/crypto" "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/log" ) func TestDataAndHashesFromTxs(t *testing.T) { @@ -23,6 +25,7 @@ func TestDataAndHashesFromTxs(t *testing.T) { publicKey, _ := privateKey.Public().(*ecdsa.PublicKey) batcherAddr := crypto.PubkeyToAddress(*publicKey) batchInboxAddr := testutils.RandomAddress(rng) + logger := testlog.Logger(t, log.LvlInfo) chainId := new(big.Int).SetUint64(rng.Uint64()) signer := types.NewCancunSigner(chainId) @@ -42,7 +45,7 @@ func TestDataAndHashesFromTxs(t *testing.T) { } calldataTx, _ := types.SignNewTx(privateKey, signer, txData) txs := types.Transactions{calldataTx} - data, blobHashes := dataAndHashesFromTxs(txs, &config, batcherAddr, map[common.Hash]bool{calldataTx.Hash(): true}) + data, blobHashes := dataAndHashesFromTxs(txs, &config, batcherAddr, logger, map[common.Hash]bool{calldataTx.Hash(): true}) require.Equal(t, 1, len(data)) require.Equal(t, 0, len(blobHashes)) @@ -57,14 +60,14 @@ func TestDataAndHashesFromTxs(t *testing.T) { } blobTx, _ := types.SignNewTx(privateKey, signer, blobTxData) txs = types.Transactions{blobTx} - data, blobHashes = dataAndHashesFromTxs(txs, &config, batcherAddr, map[common.Hash]bool{blobTx.Hash(): true}) + data, blobHashes = dataAndHashesFromTxs(txs, &config, batcherAddr, logger, map[common.Hash]bool{blobTx.Hash(): true}) require.Equal(t, 1, len(data)) require.Equal(t, 1, len(blobHashes)) require.Nil(t, data[0].calldata) // try again with both the blob & calldata transactions and make sure both are picked up txs = types.Transactions{blobTx, calldataTx} - data, blobHashes = dataAndHashesFromTxs(txs, &config, batcherAddr, map[common.Hash]bool{blobTx.Hash(): true, calldataTx.Hash(): true}) + data, blobHashes = dataAndHashesFromTxs(txs, &config, batcherAddr, logger, map[common.Hash]bool{blobTx.Hash(): true, calldataTx.Hash(): true}) require.Equal(t, 2, len(data)) require.Equal(t, 1, len(blobHashes)) require.NotNil(t, data[1].calldata) @@ -72,7 +75,7 @@ func TestDataAndHashesFromTxs(t *testing.T) { // make sure blob tx to the batch inbox is ignored if not signed by the batcher blobTx, _ = types.SignNewTx(testutils.RandomKey(), signer, blobTxData) txs = types.Transactions{blobTx} - data, blobHashes = dataAndHashesFromTxs(txs, &config, batcherAddr, map[common.Hash]bool{blobTx.Hash(): true}) + data, blobHashes = dataAndHashesFromTxs(txs, &config, batcherAddr, logger, map[common.Hash]bool{blobTx.Hash(): true}) require.Equal(t, 0, len(data)) require.Equal(t, 0, len(blobHashes)) @@ -81,7 +84,7 @@ func TestDataAndHashesFromTxs(t *testing.T) { blobTxData.To = testutils.RandomAddress(rng) blobTx, _ = types.SignNewTx(privateKey, signer, blobTxData) txs = types.Transactions{blobTx} - data, blobHashes = dataAndHashesFromTxs(txs, &config, batcherAddr, map[common.Hash]bool{blobTx.Hash(): true}) + data, blobHashes = dataAndHashesFromTxs(txs, &config, batcherAddr, logger, map[common.Hash]bool{blobTx.Hash(): true}) require.Equal(t, 0, len(data)) require.Equal(t, 0, len(blobHashes)) } diff --git a/op-node/rollup/derive/calldata_source.go b/op-node/rollup/derive/calldata_source.go index cfff6e80d903..e95a6d858b47 100644 --- a/op-node/rollup/derive/calldata_source.go +++ b/op-node/rollup/derive/calldata_source.go @@ -94,7 +94,7 @@ func (ds *CalldataSource) Next(ctx context.Context) (eth.Data, error) { func DataFromEVMTransactions(dsCfg DataSourceConfig, batcherAddr common.Address, txs types.Transactions, log log.Logger, txSucceeded map[common.Hash]bool) []eth.Data { out := []eth.Data{} for _, tx := range txs { - if isValidBatchTx(tx, dsCfg.l1Signer, dsCfg.batchInboxAddress, batcherAddr) && txSucceeded[tx.Hash()] { + if isValidBatchTx(tx, dsCfg.l1Signer, dsCfg.batchInboxAddress, batcherAddr, log) && txSucceeded[tx.Hash()] { out = append(out, tx.Data()) } } diff --git a/op-node/rollup/derive/channel_bank.go b/op-node/rollup/derive/channel_bank.go index 2a821bb868b1..b2efb0d3ce16 100644 --- a/op-node/rollup/derive/channel_bank.go +++ b/op-node/rollup/derive/channel_bank.go @@ -98,7 +98,7 @@ func (cb *ChannelBank) IngestFrame(f Frame) { } // check if the channel is not timed out - if currentCh.OpenBlockNumber()+cb.spec.ChannelTimeout() < origin.Number { + if currentCh.OpenBlockNumber()+cb.spec.ChannelTimeout(origin.Time) < 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.spec.ChannelTimeout() < cb.Origin().Number + timedOut := ch.OpenBlockNumber()+cb.spec.ChannelTimeout(cb.Origin().Time) < cb.Origin().Number if timedOut { cb.log.Info("channel timed out", "channel", first, "frames", len(ch.inputs)) cb.metrics.RecordChannelTimedOut() @@ -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.spec.ChannelTimeout() < cb.Origin().Number + timedOut := ch.OpenBlockNumber()+cb.spec.ChannelTimeout(cb.Origin().Time) < cb.Origin().Number if timedOut || !ch.IsReady() { return nil, io.EOF } diff --git a/op-node/rollup/derive/channel_bank_test.go b/op-node/rollup/derive/channel_bank_test.go index a4485834ece6..59c82c308f01 100644 --- a/op-node/rollup/derive/channel_bank_test.go +++ b/op-node/rollup/derive/channel_bank_test.go @@ -100,7 +100,7 @@ func TestChannelBankSimple(t *testing.T) { input.AddFrames("a:1:second") input.AddFrame(Frame{}, io.EOF) - cfg := &rollup.Config{ChannelTimeout: 10} + cfg := &rollup.Config{ChannelTimeoutBedrock: 10} cb := NewChannelBank(testlog.Logger(t, log.LevelCrit), cfg, input, nil, metrics.NoopMetrics) @@ -144,7 +144,7 @@ func TestChannelBankInterleavedPreCanyon(t *testing.T) { input.AddFrames("a:1:second") input.AddFrame(Frame{}, io.EOF) - cfg := &rollup.Config{ChannelTimeout: 10, CanyonTime: nil} + cfg := &rollup.Config{ChannelTimeoutBedrock: 10, CanyonTime: nil} cb := NewChannelBank(testlog.Logger(t, log.LevelCrit), cfg, input, nil, metrics.NoopMetrics) @@ -209,7 +209,7 @@ func TestChannelBankInterleaved(t *testing.T) { input.AddFrame(Frame{}, io.EOF) ct := uint64(0) - cfg := &rollup.Config{ChannelTimeout: 10, CanyonTime: &ct} + cfg := &rollup.Config{ChannelTimeoutBedrock: 10, CanyonTime: &ct} cb := NewChannelBank(testlog.Logger(t, log.LevelCrit), cfg, input, nil, metrics.NoopMetrics) @@ -269,7 +269,7 @@ func TestChannelBankDuplicates(t *testing.T) { input.AddFrames("a:1:second") input.AddFrame(Frame{}, io.EOF) - cfg := &rollup.Config{ChannelTimeout: 10} + cfg := &rollup.Config{ChannelTimeoutBedrock: 10} cb := NewChannelBank(testlog.Logger(t, log.LevelCrit), cfg, input, nil, metrics.NoopMetrics) diff --git a/op-node/rollup/derive/channel_out.go b/op-node/rollup/derive/channel_out.go index 2142796bab0e..2c9d6d3fcac8 100644 --- a/op-node/rollup/derive/channel_out.go +++ b/op-node/rollup/derive/channel_out.go @@ -74,18 +74,21 @@ type SingularChannelOut struct { compress Compressor closed bool + + chainSpec *rollup.ChainSpec } func (co *SingularChannelOut) ID() ChannelID { return co.id } -func NewSingularChannelOut(compress Compressor) (*SingularChannelOut, error) { +func NewSingularChannelOut(compress Compressor, chainSpec *rollup.ChainSpec) (*SingularChannelOut, error) { c := &SingularChannelOut{ id: ChannelID{}, frame: 0, rlpLength: 0, compress: compress, + chainSpec: chainSpec, } _, err := rand.Read(c.id[:]) if err != nil { @@ -139,9 +142,15 @@ func (co *SingularChannelOut) AddSingularBatch(batch *SingularBatch, _ uint64) e if err := rlp.Encode(&buf, NewBatchData(batch)); err != nil { return err } - if co.rlpLength+buf.Len() > rollup.SafeMaxRLPBytesPerChannel { + + // Fjord increases the max RLP bytes per channel. Activation of this change in the derivation pipeline + // is dependent on the timestamp of the L1 block that this channel got included in. So using the timestamp + // of the current batch guarantees that this channel will be included in an L1 block with a timestamp well after + // the Fjord activation. + maxRLPBytesPerChannel := co.chainSpec.MaxRLPBytesPerChannel(batch.Timestamp) + if co.rlpLength+buf.Len() > int(maxRLPBytesPerChannel) { 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) + buf.Len(), co.rlpLength, maxRLPBytesPerChannel, ErrTooManyRLPBytes) } co.rlpLength += buf.Len() diff --git a/op-node/rollup/derive/channel_out_test.go b/op-node/rollup/derive/channel_out_test.go index 9c5d038c9470..34aa58400fdd 100644 --- a/op-node/rollup/derive/channel_out_test.go +++ b/op-node/rollup/derive/channel_out_test.go @@ -5,6 +5,9 @@ import ( "io" "math/big" "math/rand" + "reflect" + "runtime" + "strconv" "testing" "github.com/ethereum/go-ethereum/common" @@ -13,9 +16,17 @@ import ( "github.com/stretchr/testify/require" "github.com/ethereum-optimism/optimism/op-node/rollup" + "github.com/ethereum-optimism/optimism/op-service/eth" ) -var rollupCfg rollup.Config +var rollupCfg = rollup.Config{ + Genesis: rollup.Genesis{ + L2Time: uint64(1723618465), + }, + BlockTime: 2, + L2ChainID: big.NewInt(420), + L1ChainID: big.NewInt(161), +} // basic implementation of the Compressor interface that does no compression type nonCompressor struct { @@ -36,21 +47,21 @@ func (s *nonCompressor) FullErr() error { // channelTypes allows tests to run against different channel types var channelTypes = []struct { - ChannelOut func(t *testing.T) ChannelOut + ChannelOut func(t *testing.T, rcfg *rollup.Config) ChannelOut Name string }{ { Name: "Singular", - ChannelOut: func(t *testing.T) ChannelOut { - cout, err := NewSingularChannelOut(&nonCompressor{}) + ChannelOut: func(t *testing.T, rcfg *rollup.Config) ChannelOut { + cout, err := NewSingularChannelOut(&nonCompressor{}, rollup.NewChainSpec(rcfg)) require.NoError(t, err) return cout }, }, { Name: "Span", - ChannelOut: func(t *testing.T) ChannelOut { - cout, err := NewSpanChannelOut(0, big.NewInt(0), 128_000, Zlib) + ChannelOut: func(t *testing.T, rcfg *rollup.Config) ChannelOut { + cout, err := NewSpanChannelOut(128_000, Zlib, rollup.NewChainSpec(rcfg)) require.NoError(t, err) return cout }, @@ -60,13 +71,14 @@ var channelTypes = []struct { func TestChannelOutAddBlock(t *testing.T) { for _, tcase := range channelTypes { t.Run(tcase.Name, func(t *testing.T) { - cout := tcase.ChannelOut(t) + cout := tcase.ChannelOut(t, &rollupCfg) header := &types.Header{Number: big.NewInt(1), Difficulty: big.NewInt(100)} block := types.NewBlockWithHeader(header).WithBody( - []*types.Transaction{ - types.NewTx(&types.DynamicFeeTx{}), + types.Body{ + Transactions: []*types.Transaction{ + types.NewTx(&types.DynamicFeeTx{}), + }, }, - nil, ) err := cout.AddBlock(&rollupCfg, block) require.Error(t, err) @@ -81,7 +93,7 @@ func TestChannelOutAddBlock(t *testing.T) { func TestOutputFrameSmallMaxSize(t *testing.T) { for _, tcase := range channelTypes { t.Run(tcase.Name, func(t *testing.T) { - cout := tcase.ChannelOut(t) + cout := tcase.ChannelOut(t, &rollupCfg) // Call OutputFrame with the range of small max size values that err var w bytes.Buffer for i := 0; i < FrameV0OverHeadSize; i++ { @@ -96,12 +108,11 @@ func TestOutputFrameSmallMaxSize(t *testing.T) { func TestOutputFrameNoEmptyLastFrame(t *testing.T) { for _, tcase := range channelTypes { t.Run(tcase.Name, func(t *testing.T) { - cout := tcase.ChannelOut(t) + cout := tcase.ChannelOut(t, &rollupCfg) rng := rand.New(rand.NewSource(0x543331)) - chainID := big.NewInt(0) txCount := 1 - singularBatch := RandomSingularBatch(rng, txCount, chainID) + singularBatch := RandomSingularBatch(rng, txCount, rollupCfg.L2ChainID) err := cout.AddSingularBatch(singularBatch, 0) var written uint64 @@ -203,7 +214,7 @@ func TestForceCloseTxData(t *testing.T) { for i, test := range tests { out, err := ForceCloseTxData(test.frames) if test.errors { - require.NotNil(t, err, "Should error on tc %v", i) + require.Error(t, err, "Should error on tc %v", i) require.Nil(t, out, "Should return no value in tc %v", i) } else { require.NoError(t, err, "Should not error on tc %v", i) @@ -218,42 +229,46 @@ func TestBlockToBatchValidity(t *testing.T) { require.ErrorContains(t, err, "has no transactions") } -func SpanChannelAndBatches(t *testing.T, target uint64, len int, algo CompressionAlgo) (*SpanChannelOut, []*SingularBatch) { +func SpanChannelAndBatches(t *testing.T, targetOutputSize uint64, numBatches int, algo CompressionAlgo, opts ...SpanChannelOutOption) (*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)) + chainID := rollupCfg.L2ChainID txCount := 1 - cout, err := NewSpanChannelOut(0, chainID, target, algo) + genesisTime := rollupCfg.Genesis.L2Time + cout, err := NewSpanChannelOut(targetOutputSize, algo, rollup.NewChainSpec(&rollupCfg), opts...) require.NoError(t, err) - batches := make([]*SingularBatch, len) + batches := make([]*SingularBatch, 0, numBatches) // adding the first batch should not cause an error - for i := 0; i < len; i++ { + for i := 0; i < numBatches; i++ { singularBatch := RandomSingularBatch(rng, txCount, chainID) - batches[i] = singularBatch + // use default 2 sec block time + singularBatch.Timestamp = genesisTime + 420_000 + rollupCfg.BlockTime*uint64(i) + batches = append(batches, 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}, + tests := []func(t *testing.T, algo CompressionAlgo){ + SpanChannelOutCompressionOnlyOneBatch, + SpanChannelOutCompressionUndo, + 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) + t.Run(funcName(test)+"_"+algo.String(), func(t *testing.T) { + test(t, algo) }) } } } +func funcName(fn any) string { + return runtime.FuncForPC(reflect.ValueOf(fn).Pointer()).Name() +} + // 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) { @@ -275,7 +290,7 @@ func SpanChannelOutCompressionOnlyOneBatch(t *testing.T, algo CompressionAlgo) { // 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) + cout, singularBatches := SpanChannelAndBatches(t, 1100, 2, algo) err := cout.AddSingularBatch(singularBatches[0], 0) require.NoError(t, err) @@ -300,7 +315,7 @@ func SpanChannelOutCompressionUndo(t *testing.T, algo CompressionAlgo) { // 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) + target := uint64(1100) cout, singularBatches := SpanChannelAndBatches(t, target, 1, algo) err := cout.AddSingularBatch(singularBatches[0], 0) @@ -324,3 +339,150 @@ func SpanChannelOutClose(t *testing.T, algo CompressionAlgo) { require.Greater(t, cout.compressor.Len(), 0) require.Equal(t, rlpLen, cout.activeRLP().Len()) } + +type maxBlocksTest struct { + outputSize uint64 + exactFull bool // whether the outputSize is exactly hit by the last batch + numBatches int // the last batch should cause the compressor to be full + maxBlocks int + expNumSpanBatches int + expLastNumBlocks int +} + +// This tests sets a max blocks per span batch and causes multiple span batches +// within a single channel. It then does a full round trip, encoding and decoding +// the channel, confirming that the expected batches were encoded. +func TestSpanChannelOut_MaxBlocksPerSpanBatch(t *testing.T) { + for i, tt := range []maxBlocksTest{ + { + outputSize: 10_751, + exactFull: true, + numBatches: 15, + maxBlocks: 4, + expNumSpanBatches: 4, + expLastNumBlocks: 3, + }, + { + outputSize: 11_000, + numBatches: 16, + maxBlocks: 4, + expNumSpanBatches: 4, + expLastNumBlocks: 3, + }, + { + outputSize: 11_154, + exactFull: true, + numBatches: 16, + maxBlocks: 4, + expNumSpanBatches: 4, + expLastNumBlocks: 4, + }, + { + outputSize: 11_500, + numBatches: 17, + maxBlocks: 4, + expNumSpanBatches: 4, + expLastNumBlocks: 4, + }, + { + outputSize: 11_801, + exactFull: true, + numBatches: 17, + maxBlocks: 4, + expNumSpanBatches: 5, + expLastNumBlocks: 1, + }, + { + outputSize: 12_000, + numBatches: 18, + maxBlocks: 4, + expNumSpanBatches: 5, + expLastNumBlocks: 1, + }, + } { + t.Run("test-"+strconv.Itoa(i), func(t *testing.T) { + testSpanChannelOut_MaxBlocksPerSpanBatch(t, tt) + }) + } +} + +func testSpanChannelOut_MaxBlocksPerSpanBatch(t *testing.T, tt maxBlocksTest) { + l1Origin := eth.L1BlockRef{Number: rollupCfg.Genesis.L1.Number + 42_000, Hash: common.Hash{0xde, 0xad, 0x42}} + l2SafeHead := eth.L2BlockRef{Number: rollupCfg.Genesis.L2Time + 40_000} + cout, bs := SpanChannelAndBatches(t, tt.outputSize, tt.numBatches, Brotli, WithMaxBlocksPerSpanBatch(tt.maxBlocks)) + for i, b := range bs { + b.EpochNum = rollup.Epoch(l1Origin.Number) + b.EpochHash = l1Origin.Hash + err := cout.AddSingularBatch(b, uint64(i)) + if i != tt.numBatches-1 || tt.exactFull { + require.NoErrorf(t, err, "iteration %d", i) + } else { + // adding last batch should not succeed, if not making compressor exactly full + require.ErrorIs(t, err, ErrCompressorFull) + t.Logf("full compressor length: %d", cout.compressor.Len()) + } + + } + require.ErrorIs(t, cout.FullErr(), ErrCompressorFull) + expSpanBatchBlocks := tt.expLastNumBlocks + if !tt.exactFull { + // if we didn't fill up exactly, we expect that one more block got + // added to the current span batch to detect that the compressor is full + expSpanBatchBlocks = tt.expLastNumBlocks%tt.maxBlocks + 1 + } + require.Equal(t, expSpanBatchBlocks, cout.spanBatch.GetBlockCount(), + "last block should still have been added to the span batch") + require.NoError(t, cout.Close()) + + // write cannel into a single frame + var frameBuf bytes.Buffer + fn, err := cout.OutputFrame(&frameBuf, tt.outputSize+FrameV0OverHeadSize) + require.Zero(t, fn) + require.ErrorIs(t, err, io.EOF) + + // now roundtrip to decode the batches + var frame Frame + require.NoError(t, frame.UnmarshalBinary(&frameBuf)) + require.True(t, frame.IsLast) + spec := rollup.NewChainSpec(&rollupCfg) + ch := NewChannel(frame.ID, l1Origin) + require.False(t, ch.IsReady()) + require.NoError(t, ch.AddFrame(frame, l1Origin)) + require.True(t, ch.IsReady()) + br, err := BatchReader(ch.Reader(), spec.MaxRLPBytesPerChannel(0), true) + require.NoError(t, err) + + sbs := make([]*SingularBatch, 0, tt.numBatches-1) + for i := 0; i < tt.expNumSpanBatches; i++ { + t.Logf("iteration %d", i) + expBlocks := tt.maxBlocks + if i == tt.expNumSpanBatches-1 { + // last span batch possibly contains less + expBlocks = tt.expLastNumBlocks + } + + bd, err := br() + require.NoError(t, err) + require.EqualValues(t, SpanBatchType, bd.GetBatchType()) + sb, err := DeriveSpanBatch(bd, rollupCfg.BlockTime, rollupCfg.Genesis.L2Time, cout.spanBatch.ChainID) + require.NoError(t, err) + require.Equal(t, expBlocks, sb.GetBlockCount()) + sbs0, err := sb.GetSingularBatches([]eth.L1BlockRef{l1Origin}, l2SafeHead) + require.NoError(t, err) + // last span batch contains one less + require.Len(t, sbs0, expBlocks) + sbs = append(sbs, sbs0...) + } + + // batch reader should be exhausted + _, err = br() + require.ErrorIs(t, err, io.EOF) + + for i, batch := range sbs { + batch0 := bs[i] + // clear the expected parent hash, as GetSingularBatches doesn't set these yet + // we still compare timestamps and txs, which is enough + batch0.ParentHash = (common.Hash{}) + require.Equalf(t, batch0, batch, "iteration %d", i) + } +} diff --git a/op-node/rollup/derive/channel_test.go b/op-node/rollup/derive/channel_test.go index e853d622aa04..a6594492837b 100644 --- a/op-node/rollup/derive/channel_test.go +++ b/op-node/rollup/derive/channel_test.go @@ -7,9 +7,9 @@ import ( "math/rand" "testing" - "github.com/DataDog/zstd" "github.com/andybalholm/brotli" "github.com/ethereum-optimism/optimism/op-service/eth" + "github.com/klauspost/compress/zstd" "github.com/stretchr/testify/require" ) @@ -143,8 +143,9 @@ func TestBatchReader(t *testing.T) { 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()) + writer, err := zstd.NewWriter(buf) + require.NoError(t, err) + _, err = writer.Write(encodedBatch.Bytes()) require.NoError(t, err) require.NoError(t, writer.Close()) } diff --git a/op-node/rollup/derive/check_l1.go b/op-node/rollup/derive/check_l1.go new file mode 100644 index 000000000000..52303592802a --- /dev/null +++ b/op-node/rollup/derive/check_l1.go @@ -0,0 +1,39 @@ +package derive + +import ( + "context" + "fmt" + + "github.com/ethereum-optimism/optimism/op-service/eth" +) + +type L1BlockRefByNumber interface { + L1BlockRefByNumber(context.Context, uint64) (eth.L1BlockRef, error) +} + +// VerifyNewL1Origin checks that the L2 unsafe head still has a L1 origin that is on the canonical chain. +// If the unsafe head origin is after the new L1 origin it is assumed to still be canonical. +// The check is only required when moving to a new L1 origin. +func VerifyNewL1Origin(ctx context.Context, unsafeOrigin eth.L1BlockRef, l1 L1BlockRefByNumber, newOrigin eth.L1BlockRef) error { + if newOrigin.Number == unsafeOrigin.Number && newOrigin != unsafeOrigin { + return NewResetError(fmt.Errorf("l1 origin was inconsistent with l2 unsafe head origin, need reset to resolve: l1 origin: %v; unsafe origin: %v", + newOrigin.ID(), unsafeOrigin)) + } + // Avoid requesting an older block by checking against the parent hash + if newOrigin.Number == unsafeOrigin.Number+1 && newOrigin.ParentHash != unsafeOrigin.Hash { + return NewResetError(fmt.Errorf("l2 unsafe head origin is no longer canonical, need reset to resolve: canonical hash: %v; unsafe origin hash: %v", + newOrigin.ParentHash, unsafeOrigin.Hash)) + } + if newOrigin.Number > unsafeOrigin.Number+1 { + // If unsafe origin is further behind new origin, check it's still on the canonical chain. + canonical, err := l1.L1BlockRefByNumber(ctx, unsafeOrigin.Number) + if err != nil { + return NewTemporaryError(fmt.Errorf("failed to fetch canonical L1 block at slot: %v; err: %w", unsafeOrigin.Number, err)) + } + if canonical != unsafeOrigin { + return NewResetError(fmt.Errorf("l2 unsafe head origin is no longer canonical, need reset to resolve: canonical: %v; unsafe origin: %v", + canonical, unsafeOrigin)) + } + } + return nil +} diff --git a/op-node/rollup/derive/check_l1_test.go b/op-node/rollup/derive/check_l1_test.go new file mode 100644 index 000000000000..e2180b381e76 --- /dev/null +++ b/op-node/rollup/derive/check_l1_test.go @@ -0,0 +1,78 @@ +package derive + +import ( + "context" + "errors" + "testing" + + "github.com/stretchr/testify/require" + + "github.com/ethereum/go-ethereum/common" + + "github.com/ethereum-optimism/optimism/op-service/eth" + "github.com/ethereum-optimism/optimism/op-service/testutils" +) + +func TestVerifyNewL1Origin(t *testing.T) { + t.Run("same height inconsistency", func(t *testing.T) { + l1F := &testutils.MockL1Source{} + defer l1F.AssertExpectations(t) + a := eth.L1BlockRef{Number: 123, Hash: common.Hash{0xa}} + b := eth.L1BlockRef{Number: 123, Hash: common.Hash{0xb}} + err := VerifyNewL1Origin(context.Background(), a, l1F, b) + require.ErrorIs(t, err, ErrReset, "different origin at same height, must be a reorg") + }) + t.Run("same height success", func(t *testing.T) { + l1F := &testutils.MockL1Source{} + defer l1F.AssertExpectations(t) + a := eth.L1BlockRef{Number: 123, Hash: common.Hash{0xa}} + b := eth.L1BlockRef{Number: 123, Hash: common.Hash{0xa}} + err := VerifyNewL1Origin(context.Background(), a, l1F, b) + require.NoError(t, err, "same origin") + }) + t.Run("parent-hash inconsistency", func(t *testing.T) { + l1F := &testutils.MockL1Source{} + defer l1F.AssertExpectations(t) + a := eth.L1BlockRef{Number: 123, Hash: common.Hash{0xa}} + b := eth.L1BlockRef{Number: 123 + 1, Hash: common.Hash{0xb}, ParentHash: common.Hash{42}} + err := VerifyNewL1Origin(context.Background(), a, l1F, b) + require.ErrorIs(t, err, ErrReset, "parent hash of new origin does not match") + }) + t.Run("parent-hash success", func(t *testing.T) { + l1F := &testutils.MockL1Source{} + defer l1F.AssertExpectations(t) + a := eth.L1BlockRef{Number: 123, Hash: common.Hash{0xa}} + b := eth.L1BlockRef{Number: 123 + 1, Hash: common.Hash{0xb}, ParentHash: common.Hash{0xa}} + err := VerifyNewL1Origin(context.Background(), a, l1F, b) + require.NoError(t, err, "expecting block b just after a") + }) + t.Run("failed canonical check", func(t *testing.T) { + l1F := &testutils.MockL1Source{} + defer l1F.AssertExpectations(t) + mockErr := errors.New("test error") + l1F.ExpectL1BlockRefByNumber(123, eth.L1BlockRef{}, mockErr) + a := eth.L1BlockRef{Number: 123, Hash: common.Hash{0xa}} + b := eth.L1BlockRef{Number: 123 + 2, Hash: common.Hash{0xb}} + err := VerifyNewL1Origin(context.Background(), a, l1F, b) + require.ErrorIs(t, err, ErrTemporary, "temporary fetching error") + require.ErrorIs(t, err, mockErr, "wraps the underlying error") + }) + t.Run("older not canonical", func(t *testing.T) { + l1F := &testutils.MockL1Source{} + defer l1F.AssertExpectations(t) + l1F.ExpectL1BlockRefByNumber(123, eth.L1BlockRef{Number: 123, Hash: common.Hash{42}}, nil) + a := eth.L1BlockRef{Number: 123, Hash: common.Hash{0xa}} + b := eth.L1BlockRef{Number: 123 + 2, Hash: common.Hash{0xb}} + err := VerifyNewL1Origin(context.Background(), a, l1F, b) + require.ErrorIs(t, err, ErrReset, "block A is no longer canonical, need to reset") + }) + t.Run("success older block", func(t *testing.T) { + l1F := &testutils.MockL1Source{} + defer l1F.AssertExpectations(t) + l1F.ExpectL1BlockRefByNumber(123, eth.L1BlockRef{Number: 123, Hash: common.Hash{0xa}}, nil) + a := eth.L1BlockRef{Number: 123, Hash: common.Hash{0xa}} + b := eth.L1BlockRef{Number: 123 + 2, Hash: common.Hash{0xb}} + err := VerifyNewL1Origin(context.Background(), a, l1F, b) + require.NoError(t, err, "block A is still canonical, can proceed") + }) +} diff --git a/op-node/rollup/derive/data_source.go b/op-node/rollup/derive/data_source.go index 6cb43a94165f..8d064a7cdb8c 100644 --- a/op-node/rollup/derive/data_source.go +++ b/op-node/rollup/derive/data_source.go @@ -8,8 +8,8 @@ import ( "github.com/ethereum/go-ethereum/core/types" "github.com/ethereum/go-ethereum/log" + altda "github.com/ethereum-optimism/optimism/op-alt-da" "github.com/ethereum-optimism/optimism/op-node/rollup" - plasma "github.com/ethereum-optimism/optimism/op-plasma" "github.com/ethereum-optimism/optimism/op-service/eth" ) @@ -26,50 +26,46 @@ type L1BlobsFetcher interface { GetBlobs(ctx context.Context, ref eth.L1BlockRef, hashes []eth.IndexedBlobHash) ([]*eth.Blob, error) } -type PlasmaInputFetcher interface { +type AltDAInputFetcher 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.CommitmentData, blockId eth.BlockID) (eth.Data, error) + GetInput(ctx context.Context, l1 altda.L1Fetcher, c altda.CommitmentData, blockId eth.L1BlockRef) (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 + AdvanceL1Origin(ctx context.Context, l1 altda.L1Fetcher, blockId eth.BlockID) error // Reset the challenge origin in case of L1 reorg Reset(ctx context.Context, base eth.L1BlockRef, baseCfg eth.SystemConfig) error - // Notify L1 finalized head so plasma finality is always behind L1 - Finalize(ref eth.L1BlockRef) - // Set the engine finalization signal callback - OnFinalizedHeadSignal(f plasma.HeadSignalFn) } // DataSourceFactory reads raw transactions from a given block & then filters for // batch submitter transactions. // This is not a stage in the pipeline, but a wrapper for another stage in the pipeline type DataSourceFactory struct { - log log.Logger - dsCfg DataSourceConfig - fetcher L1Fetcher - blobsFetcher L1BlobsFetcher - plasmaFetcher PlasmaInputFetcher - ecotoneTime *uint64 + log log.Logger + dsCfg DataSourceConfig + fetcher L1Fetcher + blobsFetcher L1BlobsFetcher + altDAFetcher AltDAInputFetcher + ecotoneTime *uint64 } -func NewDataSourceFactory(log log.Logger, cfg *rollup.Config, fetcher L1Fetcher, blobsFetcher L1BlobsFetcher, plasmaFetcher PlasmaInputFetcher) *DataSourceFactory { +func NewDataSourceFactory(log log.Logger, cfg *rollup.Config, fetcher L1Fetcher, blobsFetcher L1BlobsFetcher, altDAFetcher AltDAInputFetcher) *DataSourceFactory { config := DataSourceConfig{ l1Signer: cfg.L1Signer(), batchInboxAddress: cfg.BatchInboxAddress, - plasmaEnabled: cfg.PlasmaEnabled(), + altDAEnabled: cfg.AltDAEnabled(), } return &DataSourceFactory{ - log: log, - dsCfg: config, - fetcher: fetcher, - blobsFetcher: blobsFetcher, - plasmaFetcher: plasmaFetcher, - ecotoneTime: cfg.EcotoneTime, + log: log, + dsCfg: config, + fetcher: fetcher, + blobsFetcher: blobsFetcher, + altDAFetcher: altDAFetcher, + ecotoneTime: cfg.EcotoneTime, } } // OpenData returns the appropriate data source for the L1 block `ref`. func (ds *DataSourceFactory) OpenData(ctx context.Context, ref eth.L1BlockRef, batcherAddr common.Address) (DataIter, error) { - // Creates a data iterator from blob or calldata source so we can forward it to the plasma source + // Creates a data iterator from blob or calldata source so we can forward it to the altDA source // if enabled as it still requires an L1 data source for fetching input commmitments. var src DataIter if ds.ecotoneTime != nil && ref.Time >= *ds.ecotoneTime { @@ -80,9 +76,9 @@ func (ds *DataSourceFactory) OpenData(ctx context.Context, ref eth.L1BlockRef, b } else { src = NewCalldataSource(ctx, ds.log, ds.dsCfg, ds.fetcher, ref, batcherAddr) } - if ds.dsCfg.plasmaEnabled { - // plasma([calldata | blobdata](l1Ref)) -> data - return NewPlasmaDataSource(ds.log, src, ds.fetcher, ds.plasmaFetcher, ref.ID()), nil + if ds.dsCfg.altDAEnabled { + // altDA([calldata | blobdata](l1Ref)) -> data + return NewAltDADataSource(ds.log, src, ds.fetcher, ds.altDAFetcher, ref), nil } return src, nil } @@ -91,25 +87,25 @@ func (ds *DataSourceFactory) OpenData(ctx context.Context, ref eth.L1BlockRef, b type DataSourceConfig struct { l1Signer types.Signer batchInboxAddress common.Address - plasmaEnabled bool + altDAEnabled bool } // isValidBatchTx returns true if: // 1. the transaction has a To() address that matches the batch inbox address, and // 2. the transaction has a valid signature from the batcher address -func isValidBatchTx(tx *types.Transaction, l1Signer types.Signer, batchInboxAddr, batcherAddr common.Address) bool { +func isValidBatchTx(tx *types.Transaction, l1Signer types.Signer, batchInboxAddr, batcherAddr common.Address, logger log.Logger) bool { to := tx.To() if to == nil || *to != batchInboxAddr { return false } seqDataSubmitter, err := l1Signer.Sender(tx) // optimization: only derive sender if To is correct if err != nil { - log.Warn("tx in inbox with invalid signature", "hash", tx.Hash(), "err", err) + logger.Warn("tx in inbox with invalid signature", "hash", tx.Hash(), "err", err) return false } // some random L1 user might have sent a transaction to our batch inbox, ignore them if seqDataSubmitter != batcherAddr { - log.Warn("tx in inbox with unauthorized submitter", "addr", seqDataSubmitter, "hash", tx.Hash(), "err", err) + logger.Warn("tx in inbox with unauthorized submitter", "addr", seqDataSubmitter, "hash", tx.Hash(), "err", err) return false } return true diff --git a/op-node/rollup/derive/deposit_source.go b/op-node/rollup/derive/deposit_source.go index f7a9730ad026..8b4e49590e3c 100644 --- a/op-node/rollup/derive/deposit_source.go +++ b/op-node/rollup/derive/deposit_source.go @@ -13,9 +13,10 @@ type UserDepositSource struct { } const ( - UserDepositSourceDomain = 0 - L1InfoDepositSourceDomain = 1 - UpgradeDepositSourceDomain = 2 + UserDepositSourceDomain = 0 + L1InfoDepositSourceDomain = 1 + UpgradeDepositSourceDomain = 2 + AfterForceIncludeSourceDomain = 3 ) func (dep *UserDepositSource) SourceHash() common.Hash { @@ -63,3 +64,21 @@ func (dep *UpgradeDepositSource) SourceHash() common.Hash { copy(domainInput[32:], intentHash[:]) return crypto.Keccak256Hash(domainInput[:]) } + +// AfterForceIncludeSource identifies the DepositsComplete post-user-deposits deposit-transaction. +type AfterForceIncludeSource struct { + L1BlockHash common.Hash + SeqNumber uint64 // without this the Deposit tx would have the same tx hash for every time the L1 info repeats. +} + +func (dep *AfterForceIncludeSource) SourceHash() common.Hash { + var input [32 * 2]byte + copy(input[:32], dep.L1BlockHash[:]) + binary.BigEndian.PutUint64(input[32*2-8:], dep.SeqNumber) + depositIDHash := crypto.Keccak256Hash(input[:]) + + var domainInput [32 * 2]byte + binary.BigEndian.PutUint64(domainInput[32-8:32], AfterForceIncludeSourceDomain) + copy(domainInput[32:], depositIDHash[:]) + return crypto.Keccak256Hash(domainInput[:]) +} diff --git a/op-node/rollup/derive/deposit_source_test.go b/op-node/rollup/derive/deposit_source_test.go index 10fb7048a2a2..fb30e8918829 100644 --- a/op-node/rollup/derive/deposit_source_test.go +++ b/op-node/rollup/derive/deposit_source_test.go @@ -3,6 +3,7 @@ package derive import ( "testing" + "github.com/ethereum/go-ethereum/common" "github.com/stretchr/testify/assert" ) @@ -34,3 +35,33 @@ func TestEcotone4788ContractSourceHash(t *testing.T) { assert.Equal(t, expected, actual.Hex()) } + +// TestL1InfoDepositSource +// cast keccak $(cast concat-hex 0x0000000000000000000000000000000000000000000000000000000000000001 $(cast keccak $(cast concat-hex 0xc00e5d67c2755389aded7d8b151cbd5bcdf7ed275ad5e028b664880fc7581c77 0x0000000000000000000000000000000000000000000000000000000000000004))) +// # 0x0586c503340591999b8b38bc9834bb16aec7d5bc00eb5587ab139c9ddab81977 +func TestL1InfoDepositSource(t *testing.T) { + source := L1InfoDepositSource{ + L1BlockHash: common.HexToHash("0xc00e5d67c2755389aded7d8b151cbd5bcdf7ed275ad5e028b664880fc7581c77"), + SeqNumber: 4, + } + + actual := source.SourceHash() + expected := "0x0586c503340591999b8b38bc9834bb16aec7d5bc00eb5587ab139c9ddab81977" + + assert.Equal(t, expected, actual.Hex()) +} + +// TestAfterForceIncludeSourceHash +// cast keccak $(cast concat-hex 0x0000000000000000000000000000000000000000000000000000000000000003 $(cast keccak $(cast concat-hex 0xc00e5d67c2755389aded7d8b151cbd5bcdf7ed275ad5e028b664880fc7581c77 0x0000000000000000000000000000000000000000000000000000000000000004))) +// # 0x0d165c391384b29c29f655e3f32315755b8c1e4c1147d1824d1243420dda5ec3 +func TestAfterForceIncludeSource(t *testing.T) { + source := AfterForceIncludeSource{ + L1BlockHash: common.HexToHash("0xc00e5d67c2755389aded7d8b151cbd5bcdf7ed275ad5e028b664880fc7581c77"), + SeqNumber: 4, + } + + actual := source.SourceHash() + expected := "0x0d165c391384b29c29f655e3f32315755b8c1e4c1147d1824d1243420dda5ec3" + + assert.Equal(t, expected, actual.Hex()) +} diff --git a/op-node/rollup/derive/deriver.go b/op-node/rollup/derive/deriver.go new file mode 100644 index 000000000000..760891648524 --- /dev/null +++ b/op-node/rollup/derive/deriver.go @@ -0,0 +1,138 @@ +package derive + +import ( + "context" + "errors" + "io" + + "github.com/ethereum-optimism/optimism/op-node/rollup" + "github.com/ethereum-optimism/optimism/op-node/rollup/event" + "github.com/ethereum-optimism/optimism/op-service/eth" +) + +type DeriverIdleEvent struct { + Origin eth.L1BlockRef +} + +func (d DeriverIdleEvent) String() string { + return "derivation-idle" +} + +type DeriverL1StatusEvent struct { + Origin eth.L1BlockRef +} + +func (d DeriverL1StatusEvent) String() string { + return "deriver-l1-status" +} + +type DeriverMoreEvent struct{} + +func (d DeriverMoreEvent) String() string { + return "deriver-more" +} + +// ConfirmReceivedAttributesEvent signals that the derivation pipeline may generate new attributes. +// After emitting DerivedAttributesEvent, no new attributes will be generated until a confirmation of reception. +type ConfirmReceivedAttributesEvent struct{} + +func (d ConfirmReceivedAttributesEvent) String() string { + return "confirm-received-attributes" +} + +type ConfirmPipelineResetEvent struct{} + +func (d ConfirmPipelineResetEvent) String() string { + return "confirm-pipeline-reset" +} + +// DerivedAttributesEvent is emitted when new attributes are available to apply to the engine. +type DerivedAttributesEvent struct { + Attributes *AttributesWithParent +} + +func (ev DerivedAttributesEvent) String() string { + return "derived-attributes" +} + +type PipelineStepEvent struct { + PendingSafe eth.L2BlockRef +} + +func (ev PipelineStepEvent) String() string { + return "pipeline-step" +} + +type PipelineDeriver struct { + pipeline *DerivationPipeline + + ctx context.Context + + emitter event.Emitter + + needAttributesConfirmation bool +} + +func NewPipelineDeriver(ctx context.Context, pipeline *DerivationPipeline) *PipelineDeriver { + return &PipelineDeriver{ + pipeline: pipeline, + ctx: ctx, + } +} + +func (d *PipelineDeriver) AttachEmitter(em event.Emitter) { + d.emitter = em +} + +func (d *PipelineDeriver) OnEvent(ev event.Event) bool { + switch x := ev.(type) { + case rollup.ResetEvent: + d.pipeline.Reset() + case PipelineStepEvent: + // Don't generate attributes if there are already attributes in-flight + if d.needAttributesConfirmation { + d.pipeline.log.Debug("Previously sent attributes are unconfirmed to be received") + return true + } + d.pipeline.log.Trace("Derivation pipeline step", "onto_origin", d.pipeline.Origin()) + preOrigin := d.pipeline.Origin() + attrib, err := d.pipeline.Step(d.ctx, x.PendingSafe) + postOrigin := d.pipeline.Origin() + if preOrigin != postOrigin { + d.emitter.Emit(DeriverL1StatusEvent{Origin: postOrigin}) + } + if err == io.EOF { + d.pipeline.log.Debug("Derivation process went idle", "progress", d.pipeline.Origin(), "err", err) + d.emitter.Emit(DeriverIdleEvent{Origin: d.pipeline.Origin()}) + } else if err != nil && errors.Is(err, EngineELSyncing) { + d.pipeline.log.Debug("Derivation process went idle because the engine is syncing", "progress", d.pipeline.Origin(), "err", err) + d.emitter.Emit(DeriverIdleEvent{Origin: d.pipeline.Origin()}) + } else if err != nil && errors.Is(err, ErrReset) { + d.emitter.Emit(rollup.ResetEvent{Err: err}) + } else if err != nil && errors.Is(err, ErrTemporary) { + d.emitter.Emit(rollup.EngineTemporaryErrorEvent{Err: err}) + } else if err != nil && errors.Is(err, ErrCritical) { + d.emitter.Emit(rollup.CriticalErrorEvent{Err: err}) + } else if err != nil && errors.Is(err, NotEnoughData) { + // don't do a backoff for this error + d.emitter.Emit(DeriverMoreEvent{}) + } else if err != nil { + d.pipeline.log.Error("Derivation process error", "err", err) + d.emitter.Emit(rollup.EngineTemporaryErrorEvent{Err: err}) + } else { + if attrib != nil { + d.needAttributesConfirmation = true + d.emitter.Emit(DerivedAttributesEvent{Attributes: attrib}) + } else { + d.emitter.Emit(DeriverMoreEvent{}) // continue with the next step if we can + } + } + case ConfirmPipelineResetEvent: + d.pipeline.ConfirmEngineReset() + case ConfirmReceivedAttributesEvent: + d.needAttributesConfirmation = false + default: + return false + } + return true +} diff --git a/op-node/rollup/derive/engine_controller.go b/op-node/rollup/derive/engine_controller.go deleted file mode 100644 index 0e946c0d6c80..000000000000 --- a/op-node/rollup/derive/engine_controller.go +++ /dev/null @@ -1,477 +0,0 @@ -package derive - -import ( - "context" - "errors" - "fmt" - "time" - - "github.com/ethereum-optimism/optimism/op-node/rollup" - "github.com/ethereum-optimism/optimism/op-node/rollup/async" - "github.com/ethereum-optimism/optimism/op-node/rollup/conductor" - "github.com/ethereum-optimism/optimism/op-node/rollup/sync" - "github.com/ethereum-optimism/optimism/op-service/clock" - "github.com/ethereum-optimism/optimism/op-service/eth" - "github.com/ethereum/go-ethereum" - "github.com/ethereum/go-ethereum/common" - "github.com/ethereum/go-ethereum/log" -) - -type syncStatusEnum int - -const ( - syncStatusCL syncStatusEnum = iota - // We transition between the 4 EL states linearly. We spend the majority of the time in the second & fourth. - // We only want to EL sync if there is no finalized block & once we finish EL sync we need to mark the last block - // as finalized so we can switch to consolidation - // TODO(protocol-quest/91): We can restart EL sync & still consolidate if there finalized blocks on the execution client if the - // execution client is running in archive mode. In some cases we may want to switch back from CL to EL sync, but that is complicated. - syncStatusWillStartEL // First if we are directed to EL sync, check that nothing has been finalized yet - syncStatusStartedEL // Perform our EL sync - syncStatusFinishedELButNotFinalized // EL sync is done, but we need to mark the final sync block as finalized - syncStatusFinishedEL // EL sync is done & we should be performing consolidation -) - -var errNoFCUNeeded = errors.New("no FCU call was needed") - -var _ EngineControl = (*EngineController)(nil) -var _ LocalEngineControl = (*EngineController)(nil) - -type ExecEngine interface { - GetPayload(ctx context.Context, payloadInfo eth.PayloadInfo) (*eth.ExecutionPayloadEnvelope, error) - ForkchoiceUpdate(ctx context.Context, state *eth.ForkchoiceState, attr *eth.PayloadAttributes) (*eth.ForkchoiceUpdatedResult, error) - NewPayload(ctx context.Context, payload *eth.ExecutionPayload, parentBeaconBlockRoot *common.Hash) (*eth.PayloadStatusV1, error) - L2BlockRefByLabel(ctx context.Context, label eth.BlockLabel) (eth.L2BlockRef, error) -} - -type DACClient interface { - UploadBlobs(context.Context, *eth.ExecutionPayloadEnvelope) error -} - -type EngineController struct { - engine ExecEngine // Underlying execution engine RPC - log log.Logger - metrics Metrics - syncMode sync.Mode - syncStatus syncStatusEnum - chainSpec *rollup.ChainSpec - rollupCfg *rollup.Config - elStart time.Time - clock clock.Clock - - // Block Head State - unsafeHead eth.L2BlockRef - pendingSafeHead eth.L2BlockRef // L2 block processed from the middle of a span batch, but not marked as the safe block yet. - safeHead eth.L2BlockRef - finalizedHead eth.L2BlockRef - backupUnsafeHead eth.L2BlockRef - needFCUCall bool - // Track when the rollup node changes the forkchoice to restore previous - // known unsafe chain. e.g. Unsafe Reorg caused by Invalid span batch. - // This update does not retry except engine returns non-input error - // because engine may forgot backupUnsafeHead or backupUnsafeHead is not part - // of the chain. - needFCUCallForBackupUnsafeReorg bool - - // Building State - buildingOnto eth.L2BlockRef - buildingInfo eth.PayloadInfo - buildingSafe bool - safeAttrs *AttributesWithParent - - dacClient DACClient -} - -func NewEngineController(engine ExecEngine, log log.Logger, metrics Metrics, rollupCfg *rollup.Config, syncMode sync.Mode, dacClient DACClient) *EngineController { - syncStatus := syncStatusCL - if syncMode == sync.ELSync { - syncStatus = syncStatusWillStartEL - } - - return &EngineController{ - engine: engine, - log: log, - metrics: metrics, - chainSpec: rollup.NewChainSpec(rollupCfg), - rollupCfg: rollupCfg, - syncMode: syncMode, - syncStatus: syncStatus, - clock: clock.SystemClock, - dacClient: dacClient, - } -} - -// State Getters - -func (e *EngineController) UnsafeL2Head() eth.L2BlockRef { - return e.unsafeHead -} - -func (e *EngineController) PendingSafeL2Head() eth.L2BlockRef { - return e.pendingSafeHead -} - -func (e *EngineController) SafeL2Head() eth.L2BlockRef { - return e.safeHead -} - -func (e *EngineController) Finalized() eth.L2BlockRef { - return e.finalizedHead -} - -func (e *EngineController) BackupUnsafeL2Head() eth.L2BlockRef { - return e.backupUnsafeHead -} - -func (e *EngineController) BuildingPayload() (eth.L2BlockRef, eth.PayloadID, bool) { - return e.buildingOnto, e.buildingInfo.ID, e.buildingSafe -} - -func (e *EngineController) IsEngineSyncing() bool { - return e.syncStatus == syncStatusWillStartEL || e.syncStatus == syncStatusStartedEL || e.syncStatus == syncStatusFinishedELButNotFinalized -} - -// Setters - -// SetFinalizedHead implements LocalEngineControl. -func (e *EngineController) SetFinalizedHead(r eth.L2BlockRef) { - e.metrics.RecordL2Ref("l2_finalized", r) - e.finalizedHead = r - e.needFCUCall = true -} - -// SetPendingSafeL2Head implements LocalEngineControl. -func (e *EngineController) SetPendingSafeL2Head(r eth.L2BlockRef) { - e.metrics.RecordL2Ref("l2_pending_safe", r) - e.pendingSafeHead = r -} - -// SetSafeHead implements LocalEngineControl. -func (e *EngineController) SetSafeHead(r eth.L2BlockRef) { - e.metrics.RecordL2Ref("l2_safe", r) - e.safeHead = r - e.needFCUCall = true -} - -// SetUnsafeHead implements LocalEngineControl. -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. -func (e *EngineController) SetBackupUnsafeL2Head(r eth.L2BlockRef, triggerReorg bool) { - e.metrics.RecordL2Ref("l2_backup_unsafe", r) - e.backupUnsafeHead = r - e.needFCUCallForBackupUnsafeReorg = triggerReorg -} - -// Engine Methods - -func (e *EngineController) StartPayload(ctx context.Context, parent eth.L2BlockRef, attrs *AttributesWithParent, updateSafe bool) (errType BlockInsertionErrType, err error) { - if e.IsEngineSyncing() { - return BlockInsertTemporaryErr, fmt.Errorf("engine is in progess of p2p sync") - } - if e.buildingInfo != (eth.PayloadInfo{}) { - e.log.Warn("did not finish previous block building, starting new building now", "prev_onto", e.buildingOnto, "prev_payload_id", e.buildingInfo.ID, "new_onto", parent) - // TODO(8841): maybe worth it to force-cancel the old payload ID here. - } - fc := eth.ForkchoiceState{ - HeadBlockHash: parent.Hash, - SafeBlockHash: e.safeHead.Hash, - FinalizedBlockHash: e.finalizedHead.Hash, - } - - id, errTyp, err := startPayload(ctx, e.engine, fc, attrs.attributes) - if err != nil { - return errTyp, err - } - - e.buildingInfo = eth.PayloadInfo{ID: id, Timestamp: uint64(attrs.attributes.Timestamp)} - e.buildingSafe = updateSafe - e.buildingOnto = parent - if updateSafe { - e.safeAttrs = attrs - } - - return BlockInsertOK, nil -} - -func (e *EngineController) ConfirmPayload(ctx context.Context, agossip async.AsyncGossiper, sequencerConductor conductor.SequencerConductor) (out *eth.ExecutionPayloadEnvelope, errTyp BlockInsertionErrType, err error) { - // don't create a BlockInsertPrestateErr if we have a cached gossip payload - if e.buildingInfo == (eth.PayloadInfo{}) && agossip.Get() == nil { - return nil, BlockInsertPrestateErr, fmt.Errorf("cannot complete payload building: not currently building a payload") - } - if p := agossip.Get(); p != nil && e.buildingOnto == (eth.L2BlockRef{}) { - e.log.Warn("Found reusable payload from async gossiper, and no block was being built. Reusing payload.", - "hash", p.ExecutionPayload.BlockHash, - "number", uint64(p.ExecutionPayload.BlockNumber), - "parent", p.ExecutionPayload.ParentHash) - } else if e.buildingOnto.Hash != e.unsafeHead.Hash { // E.g. when safe-attributes consolidation fails, it will drop the existing work. - e.log.Warn("engine is building block that reorgs previous unsafe head", "onto", e.buildingOnto, "unsafe", e.unsafeHead) - } - fc := eth.ForkchoiceState{ - HeadBlockHash: common.Hash{}, // gets overridden - SafeBlockHash: e.safeHead.Hash, - FinalizedBlockHash: e.finalizedHead.Hash, - } - // Update the safe head if the payload is built with the last attributes in the batch. - updateSafe := e.buildingSafe && e.safeAttrs != nil && e.safeAttrs.isLastInSpan - envelope, errTyp, err := confirmPayload(ctx, e.log, e.engine, fc, e.buildingInfo, updateSafe, agossip, sequencerConductor, e.dacClient) - if err != nil { - return nil, errTyp, fmt.Errorf("failed to complete building on top of L2 chain %s, id: %s, error (%d): %w", e.buildingOnto, e.buildingInfo.ID, errTyp, err) - } - ref, err := PayloadToBlockRef(e.rollupCfg, envelope.ExecutionPayload) - if err != nil { - return nil, BlockInsertPayloadErr, NewResetError(fmt.Errorf("failed to decode L2 block ref from payload: %w", err)) - } - // Backup unsafeHead when new block is not built on original unsafe head. - if e.unsafeHead.Number >= ref.Number { - e.SetBackupUnsafeL2Head(e.unsafeHead, false) - } - e.unsafeHead = ref - - e.metrics.RecordL2Ref("l2_unsafe", ref) - if e.buildingSafe { - e.metrics.RecordL2Ref("l2_pending_safe", ref) - e.pendingSafeHead = ref - if updateSafe { - e.safeHead = ref - e.metrics.RecordL2Ref("l2_safe", ref) - // Remove backupUnsafeHead because this backup will be never used after consolidation. - e.SetBackupUnsafeL2Head(eth.L2BlockRef{}, false) - } - } - - e.resetBuildingState() - return envelope, BlockInsertOK, nil -} - -func (e *EngineController) CancelPayload(ctx context.Context, force bool) error { - if e.buildingInfo == (eth.PayloadInfo{}) { // only cancel if there is something to cancel. - return nil - } - // the building job gets wrapped up as soon as the payload is retrieved, there's no explicit cancel in the Engine API - e.log.Error("cancelling old block sealing job", "payload", e.buildingInfo.ID) - _, err := e.engine.GetPayload(ctx, e.buildingInfo) - if err != nil { - e.log.Error("failed to cancel block building job", "payload", e.buildingInfo.ID, "err", err) - if !force { - return err - } - } - e.resetBuildingState() - return nil -} - -func (e *EngineController) resetBuildingState() { - e.buildingInfo = eth.PayloadInfo{} - e.buildingOnto = eth.L2BlockRef{} - e.buildingSafe = false - e.safeAttrs = nil -} - -// Misc Setters only used by the engine queue - -// checkNewPayloadStatus checks returned status of engine_newPayloadV1 request for next unsafe payload. -// It returns true if the status is acceptable. -func (e *EngineController) checkNewPayloadStatus(status eth.ExecutePayloadStatus) bool { - if e.syncMode == sync.ELSync { - if status == eth.ExecutionValid && e.syncStatus == syncStatusStartedEL { - e.syncStatus = syncStatusFinishedELButNotFinalized - } - // Allow SYNCING and ACCEPTED if engine EL sync is enabled - return status == eth.ExecutionValid || status == eth.ExecutionSyncing || status == eth.ExecutionAccepted - } - return status == eth.ExecutionValid -} - -// checkForkchoiceUpdatedStatus checks returned status of engine_forkchoiceUpdatedV1 request for next unsafe payload. -// It returns true if the status is acceptable. -func (e *EngineController) checkForkchoiceUpdatedStatus(status eth.ExecutePayloadStatus) bool { - if e.syncMode == sync.ELSync { - if status == eth.ExecutionValid && e.syncStatus == syncStatusStartedEL { - e.syncStatus = syncStatusFinishedELButNotFinalized - } - // Allow SYNCING if engine P2P sync is enabled - return status == eth.ExecutionValid || status == eth.ExecutionSyncing - } - return status == eth.ExecutionValid -} - -// TryUpdateEngine attempts to update the engine with the current forkchoice state of the rollup node, -// this is a no-op if the nodes already agree on the forkchoice state. -func (e *EngineController) TryUpdateEngine(ctx context.Context) error { - if !e.needFCUCall { - return errNoFCUNeeded - } - if e.IsEngineSyncing() { - e.log.Warn("Attempting to update forkchoice state while EL syncing") - } - fc := eth.ForkchoiceState{ - HeadBlockHash: e.unsafeHead.Hash, - SafeBlockHash: e.safeHead.Hash, - FinalizedBlockHash: e.finalizedHead.Hash, - } - _, err := e.engine.ForkchoiceUpdate(ctx, &fc, nil) - if err != nil { - var inputErr eth.InputError - if errors.As(err, &inputErr) { - switch inputErr.Code { - case eth.InvalidForkchoiceState: - return NewResetError(fmt.Errorf("forkchoice update was inconsistent with engine, need reset to resolve: %w", inputErr.Unwrap())) - default: - return NewTemporaryError(fmt.Errorf("unexpected error code in forkchoice-updated response: %w", err)) - } - } else { - return NewTemporaryError(fmt.Errorf("failed to sync forkchoice with engine: %w", err)) - } - } - e.needFCUCall = false - return nil -} - -func (e *EngineController) InsertUnsafePayload(ctx context.Context, envelope *eth.ExecutionPayloadEnvelope, ref eth.L2BlockRef) error { - // 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) - 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() - } else if err == nil { - e.syncStatus = syncStatusFinishedEL - e.log.Info("Skipping EL sync and going straight to CL sync because there is a finalized block", "id", b.ID()) - return nil - } else { - return NewTemporaryError(fmt.Errorf("failed to fetch finalized head: %w", err)) - } - } - // Insert the payload & then call FCU - status, err := e.engine.NewPayload(ctx, envelope.ExecutionPayload, envelope.ParentBeaconBlockRoot) - if err != nil { - return NewTemporaryError(fmt.Errorf("failed to update insert payload: %w", err)) - } - if !e.checkNewPayloadStatus(status.Status) { - payload := envelope.ExecutionPayload - return NewTemporaryError(fmt.Errorf("cannot process unsafe payload: new - %v; parent: %v; err: %w", - payload.ID(), payload.ParentID(), eth.NewPayloadErr(payload, status))) - } - - // Mark the new payload as valid - fc := eth.ForkchoiceState{ - HeadBlockHash: envelope.ExecutionPayload.BlockHash, - SafeBlockHash: e.safeHead.Hash, - FinalizedBlockHash: e.finalizedHead.Hash, - } - if e.syncStatus == syncStatusFinishedELButNotFinalized { - fc.SafeBlockHash = envelope.ExecutionPayload.BlockHash - fc.FinalizedBlockHash = envelope.ExecutionPayload.BlockHash - e.SetSafeHead(ref) - e.SetFinalizedHead(ref) - } - fcRes, err := e.engine.ForkchoiceUpdate(ctx, &fc, nil) - if err != nil { - var inputErr eth.InputError - if errors.As(err, &inputErr) { - switch inputErr.Code { - case eth.InvalidForkchoiceState: - return NewResetError(fmt.Errorf("pre-unsafe-block forkchoice update was inconsistent with engine, need reset to resolve: %w", inputErr.Unwrap())) - default: - return NewTemporaryError(fmt.Errorf("unexpected error code in forkchoice-updated response: %w", err)) - } - } else { - return NewTemporaryError(fmt.Errorf("failed to update forkchoice to prepare for new unsafe payload: %w", err)) - } - } - if !e.checkForkchoiceUpdatedStatus(fcRes.PayloadStatus.Status) { - payload := envelope.ExecutionPayload - return NewTemporaryError(fmt.Errorf("cannot prepare unsafe chain for new payload: new - %v; parent: %v; err: %w", - payload.ID(), payload.ParentID(), eth.ForkchoiceUpdateErr(fcRes.PayloadStatus))) - } - e.SetUnsafeHead(ref) - e.needFCUCall = false - - if e.syncStatus == syncStatusFinishedELButNotFinalized { - e.log.Info("Finished EL sync", "sync_duration", e.clock.Since(e.elStart), "finalized_block", ref.ID().String()) - e.syncStatus = syncStatusFinishedEL - } - - return nil -} - -// shouldTryBackupUnsafeReorg checks reorging(restoring) unsafe head to backupUnsafeHead is needed. -// Returns boolean which decides to trigger FCU. -func (e *EngineController) shouldTryBackupUnsafeReorg() bool { - if !e.needFCUCallForBackupUnsafeReorg { - return false - } - // This method must be never called when EL sync. If EL sync is in progress, early return. - if e.IsEngineSyncing() { - e.log.Warn("Attempting to unsafe reorg using backupUnsafe while EL syncing") - return false - } - if e.BackupUnsafeL2Head() == (eth.L2BlockRef{}) { // sanity check backupUnsafeHead is there - e.log.Warn("Attempting to unsafe reorg using backupUnsafe even though it is empty") - e.SetBackupUnsafeL2Head(eth.L2BlockRef{}, false) - return false - } - return true -} - -// TryBackupUnsafeReorg attempts to reorg(restore) unsafe head to backupUnsafeHead. -// If succeeds, update current forkchoice state to the rollup node. -func (e *EngineController) TryBackupUnsafeReorg(ctx context.Context) (bool, error) { - if !e.shouldTryBackupUnsafeReorg() { - // Do not need to perform FCU. - return false, nil - } - // Only try FCU once because execution engine may forgot backupUnsafeHead - // or backupUnsafeHead is not part of the chain. - // Exception: Retry when forkChoiceUpdate returns non-input error. - e.needFCUCallForBackupUnsafeReorg = false - // Reorg unsafe chain. Safe/Finalized chain will not be updated. - e.log.Warn("trying to restore unsafe head", "backupUnsafe", e.backupUnsafeHead.ID(), "unsafe", e.unsafeHead.ID()) - fc := eth.ForkchoiceState{ - HeadBlockHash: e.backupUnsafeHead.Hash, - SafeBlockHash: e.safeHead.Hash, - FinalizedBlockHash: e.finalizedHead.Hash, - } - fcRes, err := e.engine.ForkchoiceUpdate(ctx, &fc, nil) - if err != nil { - var inputErr eth.InputError - if errors.As(err, &inputErr) { - e.SetBackupUnsafeL2Head(eth.L2BlockRef{}, false) - switch inputErr.Code { - case eth.InvalidForkchoiceState: - return true, NewResetError(fmt.Errorf("forkchoice update was inconsistent with engine, need reset to resolve: %w", inputErr.Unwrap())) - default: - return true, NewTemporaryError(fmt.Errorf("unexpected error code in forkchoice-updated response: %w", err)) - } - } else { - // Retry when forkChoiceUpdate returns non-input error. - // Do not reset backupUnsafeHead because it will be used again. - e.needFCUCallForBackupUnsafeReorg = true - return true, NewTemporaryError(fmt.Errorf("failed to sync forkchoice with engine: %w", err)) - } - } - if fcRes.PayloadStatus.Status == eth.ExecutionValid { - // Execution engine accepted the reorg. - e.log.Info("successfully reorged unsafe head using backupUnsafe", "unsafe", e.backupUnsafeHead.ID()) - e.SetUnsafeHead(e.BackupUnsafeL2Head()) - e.SetBackupUnsafeL2Head(eth.L2BlockRef{}, false) - return true, nil - } - e.SetBackupUnsafeL2Head(eth.L2BlockRef{}, false) - // Execution engine could not reorg back to previous unsafe head. - return true, NewTemporaryError(fmt.Errorf("cannot restore unsafe chain using backupUnsafe: err: %w", - eth.ForkchoiceUpdateErr(fcRes.PayloadStatus))) -} - -// ResetBuildingState implements LocalEngineControl. -func (e *EngineController) ResetBuildingState() { - e.resetBuildingState() -} diff --git a/op-node/rollup/derive/engine_queue.go b/op-node/rollup/derive/engine_queue.go deleted file mode 100644 index 848b3778472d..000000000000 --- a/op-node/rollup/derive/engine_queue.go +++ /dev/null @@ -1,770 +0,0 @@ -package derive - -import ( - "context" - "errors" - "fmt" - "io" - "time" - - "github.com/ethereum/go-ethereum" - "github.com/ethereum/go-ethereum/common" - "github.com/ethereum/go-ethereum/core/types" - "github.com/ethereum/go-ethereum/log" - - "github.com/ethereum-optimism/optimism/op-node/rollup" - "github.com/ethereum-optimism/optimism/op-node/rollup/async" - "github.com/ethereum-optimism/optimism/op-node/rollup/conductor" - "github.com/ethereum-optimism/optimism/op-node/rollup/sync" - "github.com/ethereum-optimism/optimism/op-service/eth" -) - -type AttributesWithParent struct { - attributes *eth.PayloadAttributes - parent eth.L2BlockRef - isLastInSpan bool -} - -func NewAttributesWithParent(attributes *eth.PayloadAttributes, parent eth.L2BlockRef, isLastInSpan bool) *AttributesWithParent { - return &AttributesWithParent{attributes, parent, isLastInSpan} -} - -func (a *AttributesWithParent) Attributes() *eth.PayloadAttributes { - return a.attributes -} - -type NextAttributesProvider interface { - Origin() eth.L1BlockRef - NextAttributes(context.Context, eth.L2BlockRef) (*AttributesWithParent, error) -} - -type L2Source interface { - PayloadByHash(context.Context, common.Hash) (*eth.ExecutionPayloadEnvelope, error) - PayloadByNumber(context.Context, uint64) (*eth.ExecutionPayloadEnvelope, error) - L2BlockRefByLabel(ctx context.Context, label eth.BlockLabel) (eth.L2BlockRef, error) - L2BlockRefByHash(ctx context.Context, l2Hash common.Hash) (eth.L2BlockRef, error) - L2BlockRefByNumber(ctx context.Context, num uint64) (eth.L2BlockRef, error) - SystemConfigL2Fetcher -} - -type Engine interface { - ExecEngine - L2Source -} - -// EngineState provides a read-only interface of the forkchoice state properties of the L2 Engine. -type EngineState interface { - Finalized() eth.L2BlockRef - UnsafeL2Head() eth.L2BlockRef - SafeL2Head() eth.L2BlockRef -} - -// EngineControl enables other components to build blocks with the Engine, -// while keeping the forkchoice state and payload-id management internal to -// avoid state inconsistencies between different users of the EngineControl. -type EngineControl interface { - EngineState - - // StartPayload requests the engine to start building a block with the given attributes. - // If updateSafe, the resulting block will be marked as a safe block. - StartPayload(ctx context.Context, parent eth.L2BlockRef, attrs *AttributesWithParent, updateSafe bool) (errType BlockInsertionErrType, err error) - // ConfirmPayload requests the engine to complete the current block. If no block is being built, or if it fails, an error is returned. - ConfirmPayload(ctx context.Context, agossip async.AsyncGossiper, sequencerConductor conductor.SequencerConductor) (out *eth.ExecutionPayloadEnvelope, errTyp BlockInsertionErrType, err error) - // CancelPayload requests the engine to stop building the current block without making it canonical. - // This is optional, as the engine expires building jobs that are left uncompleted, but can still save resources. - CancelPayload(ctx context.Context, force bool) error - // BuildingPayload indicates if a payload is being built, and onto which block it is being built, and whether or not it is a safe payload. - BuildingPayload() (onto eth.L2BlockRef, id eth.PayloadID, safe bool) -} - -type LocalEngineControl interface { - EngineControl - ResetBuildingState() - IsEngineSyncing() bool - TryUpdateEngine(ctx context.Context) error - TryBackupUnsafeReorg(ctx context.Context) (bool, error) - InsertUnsafePayload(ctx context.Context, payload *eth.ExecutionPayloadEnvelope, ref eth.L2BlockRef) error - - PendingSafeL2Head() eth.L2BlockRef - BackupUnsafeL2Head() eth.L2BlockRef - - SetUnsafeHead(eth.L2BlockRef) - SetSafeHead(eth.L2BlockRef) - SetFinalizedHead(eth.L2BlockRef) - SetPendingSafeL2Head(eth.L2BlockRef) - SetBackupUnsafeL2Head(block eth.L2BlockRef, triggerReorg bool) -} - -// SafeHeadListener is called when the safe head is updated. -// The safe head may advance by more than one block in a single update -// The l1Block specified is the first L1 block that includes sufficient information to derive the new safe head -type SafeHeadListener interface { - - // Enabled reports if this safe head listener is actively using the posted data. This allows the engine queue to - // optionally skip making calls that may be expensive to prepare. - // Callbacks may still be made if Enabled returns false but are not guaranteed. - Enabled() bool - - // SafeHeadUpdated indicates that the safe head has been updated in response to processing batch data - // The l1Block specified is the first L1 block containing all required batch data to derive newSafeHead - SafeHeadUpdated(newSafeHead eth.L2BlockRef, l1Block eth.BlockID) error - - // SafeHeadReset indicates that the derivation pipeline reset back to the specified safe head - // The L1 block that made the new safe head safe is unknown. - SafeHeadReset(resetSafeHead eth.L2BlockRef) error -} - -// Max memory used for buffering unsafe payloads -const maxUnsafePayloadsMemory = 500 * 1024 * 1024 - -// finalityLookback defines the amount of L1<>L2 relations to track for finalization purposes, one per L1 block. -// -// When L1 finalizes blocks, it finalizes finalityLookback blocks behind the L1 head. -// Non-finality may take longer, but when it does finalize again, it is within this range of the L1 head. -// Thus we only need to retain the L1<>L2 derivation relation data of this many L1 blocks. -// -// In the event of older finalization signals, misconfiguration, or insufficient L1<>L2 derivation relation data, -// then we may miss the opportunity to finalize more L2 blocks. -// This does not cause any divergence, it just causes lagging finalization status. -// -// The beacon chain on mainnet has 32 slots per epoch, -// and new finalization events happen at most 4 epochs behind the head. -// And then we add 1 to make pruning easier by leaving room for a new item without pruning the 32*4. -const finalityLookback = 4*32 + 1 - -// finalityDelay is the number of L1 blocks to traverse before trying to finalize L2 blocks again. -// We do not want to do this too often, since it requires fetching a L1 block by number, so no cache data. -const finalityDelay = 64 - -// calcFinalityLookback calculates the default finality lookback based on DA challenge window if plasma -// mode is activated or L1 finality lookback. -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.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 - } - } - return finalityLookback -} - -type FinalityData struct { - // The last L2 block that was fully derived and inserted into the L2 engine while processing this L1 block. - L2Block eth.L2BlockRef - // The L1 block this stage was at when inserting the L2 block. - // When this L1 block is finalized, the L2 chain up to this block can be fully reproduced from finalized L1 data. - L1Block eth.BlockID -} - -// EngineQueue queues up payload attributes to consolidate or process with the provided Engine -type EngineQueue struct { - log log.Logger - cfg *rollup.Config - - ec LocalEngineControl - - // finalizedL1 is the currently perceived finalized L1 block. - // This may be ahead of the current traversed origin when syncing. - finalizedL1 eth.L1BlockRef - - // triedFinalizeAt tracks at which origin we last tried to finalize during sync. - triedFinalizeAt eth.L1BlockRef - - // The queued-up attributes - safeAttributes *AttributesWithParent - unsafePayloads *PayloadsQueue // queue of unsafe payloads, ordered by ascending block number, may have gaps and duplicates - - // Tracks which L2 blocks where last derived from which L1 block. At most finalityLookback large. - finalityData []FinalityData - - engine L2Source - prev NextAttributesProvider - - origin eth.L1BlockRef // updated on resets, and whenever we read from the previous stage. - sysCfg eth.SystemConfig // only used for pipeline resets - - metrics Metrics - l1Fetcher L1Fetcher - - syncCfg *sync.Config - - safeHeadNotifs SafeHeadListener // notified when safe head is updated - lastNotifiedSafeHead eth.L2BlockRef -} - -// NewEngineQueue creates a new EngineQueue, which should be Reset(origin) before use. -func NewEngineQueue(log log.Logger, cfg *rollup.Config, l2Source L2Source, engine LocalEngineControl, metrics Metrics, prev NextAttributesProvider, l1Fetcher L1Fetcher, syncCfg *sync.Config, safeHeadNotifs SafeHeadListener) *EngineQueue { - return &EngineQueue{ - log: log, - cfg: cfg, - ec: engine, - engine: l2Source, - metrics: metrics, - finalityData: make([]FinalityData, 0, calcFinalityLookback(cfg)), - unsafePayloads: NewPayloadsQueue(log, maxUnsafePayloadsMemory, payloadMemSize), - prev: prev, - l1Fetcher: l1Fetcher, - syncCfg: syncCfg, - safeHeadNotifs: safeHeadNotifs, - } -} - -// Origin identifies the L1 chain (incl.) that included and/or produced all the safe L2 blocks. -func (eq *EngineQueue) Origin() eth.L1BlockRef { - return eq.origin -} - -func (eq *EngineQueue) SystemConfig() eth.SystemConfig { - return eq.sysCfg -} - -func (eq *EngineQueue) AddUnsafePayload(envelope *eth.ExecutionPayloadEnvelope) { - if envelope == nil { - eq.log.Warn("cannot add nil unsafe payload") - return - } - - if err := eq.unsafePayloads.Push(envelope); err != nil { - eq.log.Warn("Could not add unsafe payload", "id", envelope.ExecutionPayload.ID(), "timestamp", uint64(envelope.ExecutionPayload.Timestamp), "err", err) - return - } - p := eq.unsafePayloads.Peek() - eq.metrics.RecordUnsafePayloadsBuffer(uint64(eq.unsafePayloads.Len()), eq.unsafePayloads.MemSize(), p.ExecutionPayload.ID()) - eq.log.Trace("Next unsafe payload to process", "next", p.ExecutionPayload.ID(), "timestamp", uint64(p.ExecutionPayload.Timestamp)) -} - -func (eq *EngineQueue) Finalize(l1Origin eth.L1BlockRef) { - prevFinalizedL1 := eq.finalizedL1 - if l1Origin.Number < eq.finalizedL1.Number { - eq.log.Error("ignoring old L1 finalized block signal! Is the L1 provider corrupted?", "prev_finalized_l1", prevFinalizedL1, "signaled_finalized_l1", l1Origin) - return - } - - // remember the L1 finalization signal - eq.finalizedL1 = l1Origin - - // Sanity check: we only try to finalize L2 immediately, without fetching additional data, - // if we are on the same chain as the signal. - // If we are on a different chain, the signal will be ignored, - // and tryFinalizeL1Origin() will eventually detect that we are on the wrong chain, - // if not resetting due to reorg elsewhere already. - for _, fd := range eq.finalityData { - if fd.L1Block == l1Origin.ID() { - eq.tryFinalizeL2() - return - } - } - - eq.log.Info("received L1 finality signal, but missing data for immediate L2 finalization", "prev_finalized_l1", prevFinalizedL1, "signaled_finalized_l1", l1Origin) -} - -// FinalizedL1 identifies the L1 chain (incl.) that included and/or produced all the finalized L2 blocks. -// This may return a zeroed ID if no finalization signals have been seen yet. -func (eq *EngineQueue) FinalizedL1() eth.L1BlockRef { - return eq.finalizedL1 -} - -// LowestQueuedUnsafeBlock returns the block -func (eq *EngineQueue) LowestQueuedUnsafeBlock() eth.L2BlockRef { - payload := eq.unsafePayloads.Peek() - if payload == nil { - return eth.L2BlockRef{} - } - ref, err := PayloadToBlockRef(eq.cfg, payload.ExecutionPayload) - if err != nil { - return eth.L2BlockRef{} - } - return ref -} - -func (eq *EngineQueue) BackupUnsafeL2Head() eth.L2BlockRef { - return eq.ec.BackupUnsafeL2Head() -} - -// Determine if the engine is syncing to the target block -func (eq *EngineQueue) isEngineSyncing() bool { - return eq.ec.IsEngineSyncing() -} - -func (eq *EngineQueue) Step(ctx context.Context) error { - // If we don't need to call FCU to restore unsafeHead using backupUnsafe, keep going b/c - // this was a no-op(except correcting invalid state when backupUnsafe is empty but TryBackupUnsafeReorg called). - if fcuCalled, err := eq.ec.TryBackupUnsafeReorg(ctx); fcuCalled { - // If we needed to perform a network call, then we should yield even if we did not encounter an error. - return err - } - // If we don't need to call FCU, keep going b/c this was a no-op. If we needed to - // perform a network call, then we should yield even if we did not encounter an error. - if err := eq.ec.TryUpdateEngine(ctx); !errors.Is(err, errNoFCUNeeded) { - return err - } - // Trying unsafe payload should be done before safe attributes - // It allows the unsafe head can move forward while the long-range consolidation is in progress. - if eq.unsafePayloads.Len() > 0 { - if err := eq.tryNextUnsafePayload(ctx); err != io.EOF { - return err - } - // EOF error means we can't process the next unsafe payload. Then we should process next safe attributes. - } - if eq.isEngineSyncing() { - // The pipeline cannot move forwards if doing EL sync. - return EngineELSyncing - } - if eq.safeAttributes != nil { - return eq.tryNextSafeAttributes(ctx) - } - - 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 { - return err - } - eq.origin = newOrigin - // make sure we track the last L2 safe head for every new L1 block - if err := eq.postProcessSafeL2(); err != nil { - return err - } - // try to finalize the L2 blocks we have synced so far (no-op if L1 finality is behind) - if err := eq.tryFinalizePastL2Blocks(ctx); err != nil { - return err - } - if next, err := eq.prev.NextAttributes(ctx, eq.ec.PendingSafeL2Head()); err == io.EOF { - return io.EOF - } else if err != nil { - return err - } else { - eq.safeAttributes = next - eq.log.Debug("Adding next safe attributes", "safe_head", eq.ec.SafeL2Head(), - "pending_safe_head", eq.ec.PendingSafeL2Head(), "next", next) - return NotEnoughData - } -} - -// verifyNewL1Origin checks that the L2 unsafe head still has a L1 origin that is on the canonical chain. -// If the unsafe head origin is after the new L1 origin it is assumed to still be canonical. -// The check is only required when moving to a new L1 origin. -func (eq *EngineQueue) verifyNewL1Origin(ctx context.Context, newOrigin eth.L1BlockRef) error { - if newOrigin == eq.origin { - return nil - } - unsafeOrigin := eq.ec.UnsafeL2Head().L1Origin - if newOrigin.Number == unsafeOrigin.Number && newOrigin.ID() != unsafeOrigin { - return NewResetError(fmt.Errorf("l1 origin was inconsistent with l2 unsafe head origin, need reset to resolve: l1 origin: %v; unsafe origin: %v", - newOrigin.ID(), unsafeOrigin)) - } - // Avoid requesting an older block by checking against the parent hash - if newOrigin.Number == unsafeOrigin.Number+1 && newOrigin.ParentHash != unsafeOrigin.Hash { - return NewResetError(fmt.Errorf("l2 unsafe head origin is no longer canonical, need reset to resolve: canonical hash: %v; unsafe origin hash: %v", - newOrigin.ParentHash, unsafeOrigin.Hash)) - } - if newOrigin.Number > unsafeOrigin.Number+1 { - // If unsafe origin is further behind new origin, check it's still on the canonical chain. - canonical, err := eq.l1Fetcher.L1BlockRefByNumber(ctx, unsafeOrigin.Number) - if err != nil { - return NewTemporaryError(fmt.Errorf("failed to fetch canonical L1 block at slot: %v; err: %w", unsafeOrigin.Number, err)) - } - if canonical.ID() != unsafeOrigin { - eq.log.Error("Resetting due to origin mismatch") - return NewResetError(fmt.Errorf("l2 unsafe head origin is no longer canonical, need reset to resolve: canonical: %v; unsafe origin: %v", - canonical, unsafeOrigin)) - } - } - return nil -} - -func (eq *EngineQueue) tryFinalizePastL2Blocks(ctx context.Context) error { - if eq.finalizedL1 == (eth.L1BlockRef{}) { - return nil - } - - // If the L1 is finalized beyond the point we are traversing (e.g. during sync), - // then we should check if we can finalize this L1 block we are traversing. - // Otherwise, nothing to act on here, we will finalize later on a new finality signal matching the recent history. - if eq.finalizedL1.Number < eq.origin.Number { - return nil - } - - // If we recently tried finalizing, then don't try again just yet, but traverse more of L1 first. - if eq.triedFinalizeAt != (eth.L1BlockRef{}) && eq.origin.Number <= eq.triedFinalizeAt.Number+finalityDelay { - return nil - } - - eq.log.Info("processing L1 finality information", "l1_finalized", eq.finalizedL1, "l1_origin", eq.origin, "previous", eq.triedFinalizeAt) - - // Sanity check we are indeed on the finalizing chain, and not stuck on something else. - // We assume that the block-by-number query is consistent with the previously received finalized chain signal - ref, err := eq.l1Fetcher.L1BlockRefByNumber(ctx, eq.origin.Number) - if err != nil { - return NewTemporaryError(fmt.Errorf("failed to check if on finalizing L1 chain: %w", err)) - } - if ref.Hash != eq.origin.Hash { - return NewResetError(fmt.Errorf("need to reset, we are on %s, not on the finalizing L1 chain %s (towards %s)", eq.origin, ref, eq.finalizedL1)) - } - eq.tryFinalizeL2() - return nil -} - -// tryFinalizeL2 traverses the past L1 blocks, checks if any has been finalized, -// and then marks the latest fully derived L2 block from this as finalized, -// or defaults to the current finalized L2 block. -func (eq *EngineQueue) tryFinalizeL2() { - if eq.finalizedL1 == (eth.L1BlockRef{}) { - return // if no L1 information is finalized yet, then skip this - } - eq.triedFinalizeAt = eq.origin - // default to keep the same finalized block - finalizedL2 := eq.ec.Finalized() - // go through the latest inclusion data, and find the last L2 block that was derived from a finalized L1 block - for _, fd := range eq.finalityData { - if fd.L2Block.Number > finalizedL2.Number && fd.L1Block.Number <= eq.finalizedL1.Number { - finalizedL2 = fd.L2Block - } - } - eq.ec.SetFinalizedHead(finalizedL2) -} - -// postProcessSafeL2 buffers the L1 block the safe head was fully derived from, -// to finalize it once the L1 block, or later, finalizes. -func (eq *EngineQueue) postProcessSafeL2() error { - if err := eq.notifyNewSafeHead(eq.ec.SafeL2Head()); err != nil { - return err - } - // prune finality data if necessary - if uint64(len(eq.finalityData)) >= calcFinalityLookback(eq.cfg) { - eq.finalityData = append(eq.finalityData[:0], eq.finalityData[1:calcFinalityLookback(eq.cfg)]...) - } - // remember the last L2 block that we fully derived from the given finality data - if len(eq.finalityData) == 0 || eq.finalityData[len(eq.finalityData)-1].L1Block.Number < eq.origin.Number { - // append entry for new L1 block - eq.finalityData = append(eq.finalityData, FinalityData{ - L2Block: eq.ec.SafeL2Head(), - L1Block: eq.origin.ID(), - }) - last := &eq.finalityData[len(eq.finalityData)-1] - eq.log.Debug("extended finality-data", "last_l1", last.L1Block, "last_l2", last.L2Block) - } else { - // if it's a new L2 block that was derived from the same latest L1 block, then just update the entry - last := &eq.finalityData[len(eq.finalityData)-1] - if last.L2Block != eq.ec.SafeL2Head() { // avoid logging if there are no changes - last.L2Block = eq.ec.SafeL2Head() - eq.log.Debug("updated finality-data", "last_l1", last.L1Block, "last_l2", last.L2Block) - } - } - return nil -} - -// notifyNewSafeHead calls the safe head listener with the current safe head and l1 origin information. -func (eq *EngineQueue) notifyNewSafeHead(safeHead eth.L2BlockRef) error { - if eq.lastNotifiedSafeHead == safeHead { - // No change, no need to notify - return nil - } - if err := eq.safeHeadNotifs.SafeHeadUpdated(safeHead, eq.origin.ID()); err != nil { - // At this point our state is in a potentially inconsistent state as we've updated the safe head - // in the execution client but failed to post process it. Reset the pipeline so the safe head rolls back - // a little (it always rolls back at least 1 block) and then it will retry storing the entry - return NewResetError(fmt.Errorf("safe head notifications failed: %w", err)) - } - eq.lastNotifiedSafeHead = safeHead - return nil -} - -func (eq *EngineQueue) logSyncProgress(reason string) { - eq.log.Info("Sync progress", - "reason", reason, - "l2_finalized", eq.ec.Finalized(), - "l2_safe", eq.ec.SafeL2Head(), - "l2_pending_safe", eq.ec.PendingSafeL2Head(), - "l2_unsafe", eq.ec.UnsafeL2Head(), - "l2_backup_unsafe", eq.ec.BackupUnsafeL2Head(), - "l2_time", eq.ec.UnsafeL2Head().Time, - "l1_derived", eq.origin, - ) -} - -func (eq *EngineQueue) tryNextUnsafePayload(ctx context.Context) error { - firstEnvelope := eq.unsafePayloads.Peek() - 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", eq.ec.UnsafeL2Head().ID(), "unsafe_payload", first.ID()) - eq.unsafePayloads.Pop() - return nil - } - if uint64(first.BlockNumber) <= eq.ec.UnsafeL2Head().Number { - eq.log.Info("skipping unsafe payload, since it is older than unsafe head", "unsafe", eq.ec.UnsafeL2Head().ID(), "unsafe_payload", first.ID()) - eq.unsafePayloads.Pop() - return nil - } - - // 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", 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 - } - - ref, err := PayloadToBlockRef(eq.cfg, first) - if err != nil { - eq.log.Error("failed to decode L2 block ref from payload", "err", err) - eq.unsafePayloads.Pop() - return nil - } - - if err := eq.ec.InsertUnsafePayload(ctx, firstEnvelope, ref); errors.Is(err, ErrTemporary) { - eq.log.Debug("Temporary error while inserting unsafe payload", "hash", ref.Hash, "number", ref.Number, "timestamp", ref.Time, "l1Origin", ref.L1Origin) - return err - } else if err != nil { - eq.log.Warn("Dropping invalid unsafe payload", "hash", ref.Hash, "number", ref.Number, "timestamp", ref.Time, "l1Origin", ref.L1Origin) - eq.unsafePayloads.Pop() - return err - } - eq.unsafePayloads.Pop() - eq.log.Trace("Executed unsafe payload", "hash", ref.Hash, "number", ref.Number, "timestamp", ref.Time, "l1Origin", ref.L1Origin) - eq.logSyncProgress("unsafe payload from sequencer") - - return nil -} - -func (eq *EngineQueue) tryNextSafeAttributes(ctx context.Context) error { - if eq.safeAttributes == nil { // sanity check the attributes are there - return nil - } - // validate the safe attributes before processing them. The engine may have completed processing them through other means. - if eq.ec.PendingSafeL2Head() != eq.safeAttributes.parent { - // Previously the attribute's parent was the pending safe head. If the pending safe head advances so pending safe head's parent is the same as the - // attribute's parent then we need to cancel the attributes. - if eq.ec.PendingSafeL2Head().ParentHash == eq.safeAttributes.parent.Hash { - eq.log.Warn("queued safe attributes are stale, safehead progressed", - "pending_safe_head", eq.ec.PendingSafeL2Head(), "pending_safe_head_parent", eq.ec.PendingSafeL2Head().ParentID(), - "attributes_parent", eq.safeAttributes.parent) - eq.safeAttributes = nil - return nil - } - // If something other than a simple advance occurred, perform a full reset - return NewResetError(fmt.Errorf("pending safe head changed to %s with parent %s, conflicting with queued safe attributes on top of %s", - eq.ec.PendingSafeL2Head(), eq.ec.PendingSafeL2Head().ParentID(), eq.safeAttributes.parent)) - - } - if eq.ec.PendingSafeL2Head().Number < eq.ec.UnsafeL2Head().Number { - return eq.consolidateNextSafeAttributes(ctx) - } else if eq.ec.PendingSafeL2Head().Number == eq.ec.UnsafeL2Head().Number { - return eq.forceNextSafeAttributes(ctx) - } else { - // For some reason the unsafe head is behind the pending safe head. Log it, and correct it. - eq.log.Error("invalid sync state, unsafe head is behind pending safe head", "unsafe", eq.ec.UnsafeL2Head(), "pending_safe", eq.ec.PendingSafeL2Head()) - eq.ec.SetUnsafeHead(eq.ec.PendingSafeL2Head()) - return nil - } -} - -// consolidateNextSafeAttributes tries to match the next safe attributes against the existing unsafe chain, -// to avoid extra processing or unnecessary unwinding of the chain. -// However, if the attributes do not match, they will be forced with forceNextSafeAttributes. -func (eq *EngineQueue) consolidateNextSafeAttributes(ctx context.Context) error { - ctx, cancel := context.WithTimeout(ctx, time.Second*10) - defer cancel() - - envelope, err := eq.engine.PayloadByNumber(ctx, eq.ec.PendingSafeL2Head().Number+1) - if err != nil { - if errors.Is(err, ethereum.NotFound) { - // engine may have restarted, or inconsistent safe head. We need to reset - return NewResetError(fmt.Errorf("expected engine was synced and had unsafe block to reconcile, but cannot find the block: %w", err)) - } - return NewTemporaryError(fmt.Errorf("failed to get existing unsafe payload to compare against derived attributes from L1: %w", err)) - } - if err := AttributesMatchBlock(eq.cfg, eq.safeAttributes.attributes, eq.ec.PendingSafeL2Head().Hash, envelope, eq.log); err != nil { - eq.log.Warn("L2 reorg: existing unsafe block does not match derived attributes from L1", "err", err, "unsafe", eq.ec.UnsafeL2Head(), "pending_safe", eq.ec.PendingSafeL2Head(), "safe", eq.ec.SafeL2Head()) - // geth cannot wind back a chain without reorging to a new, previously non-canonical, block - return eq.forceNextSafeAttributes(ctx) - } - ref, err := PayloadToBlockRef(eq.cfg, envelope.ExecutionPayload) - if err != nil { - return NewResetError(fmt.Errorf("failed to decode L2 block ref from payload: %w", err)) - } - eq.ec.SetPendingSafeL2Head(ref) - if eq.safeAttributes.isLastInSpan { - eq.ec.SetSafeHead(ref) - if err := eq.postProcessSafeL2(); err != nil { - return err - } - } - // unsafe head stays the same, we did not reorg the chain. - eq.safeAttributes = nil - eq.logSyncProgress("reconciled with L1") - - return nil -} - -// forceNextSafeAttributes inserts the provided attributes, reorging away any conflicting unsafe chain. -func (eq *EngineQueue) forceNextSafeAttributes(ctx context.Context) error { - if eq.safeAttributes == nil { - return nil - } - attrs := eq.safeAttributes.attributes - lastInSpan := eq.safeAttributes.isLastInSpan - errType, err := eq.StartPayload(ctx, eq.ec.PendingSafeL2Head(), eq.safeAttributes, true) - if err == nil { - _, errType, err = eq.ec.ConfirmPayload(ctx, async.NoOpGossiper{}, &conductor.NoOpConductor{}) - } - if err != nil { - switch errType { - case BlockInsertTemporaryErr: - // RPC errors are recoverable, we can retry the buffered payload attributes later. - return NewTemporaryError(fmt.Errorf("temporarily cannot insert new safe block: %w", err)) - case BlockInsertPrestateErr: - _ = eq.CancelPayload(ctx, true) - return NewResetError(fmt.Errorf("need reset to resolve pre-state problem: %w", err)) - case BlockInsertPayloadErr: - _ = eq.CancelPayload(ctx, true) - eq.log.Warn("could not process payload derived from L1 data, dropping batch", "err", err) - // Count the number of deposits to see if the tx list is deposit only. - depositCount := 0 - for _, tx := range attrs.Transactions { - if len(tx) > 0 && tx[0] == types.DepositTxType { - depositCount += 1 - } - } - // Deposit transaction execution errors are suppressed in the execution engine, but if the - // block is somehow invalid, there is nothing we can do to recover & we should exit. - // TODO: Can this be triggered by an empty batch with invalid data (like parent hash or gas limit?) - if len(attrs.Transactions) == depositCount { - eq.log.Error("deposit only block was invalid", "parent", eq.safeAttributes.parent, "err", err) - return NewCriticalError(fmt.Errorf("failed to process block with only deposit transactions: %w", err)) - } - // drop the payload without inserting it - eq.safeAttributes = nil - // Revert the pending safe head to the safe head. - eq.ec.SetPendingSafeL2Head(eq.ec.SafeL2Head()) - // suppress the error b/c we want to retry with the next batch from the batch queue - // If there is no valid batch the node will eventually force a deposit only block. If - // the deposit only block fails, this will return the critical error above. - - // Try to restore to previous known unsafe chain. - eq.ec.SetBackupUnsafeL2Head(eq.ec.BackupUnsafeL2Head(), true) - - return nil - default: - return NewCriticalError(fmt.Errorf("unknown InsertHeadBlock error type %d: %w", errType, err)) - } - } - eq.safeAttributes = nil - eq.logSyncProgress("processed safe block derived from L1") - if lastInSpan { - if err := eq.postProcessSafeL2(); err != nil { - return err - } - } - - return nil -} - -func (eq *EngineQueue) StartPayload(ctx context.Context, parent eth.L2BlockRef, attrs *AttributesWithParent, updateSafe bool) (errType BlockInsertionErrType, err error) { - return eq.ec.StartPayload(ctx, parent, attrs, updateSafe) -} - -func (eq *EngineQueue) ConfirmPayload(ctx context.Context, agossip async.AsyncGossiper, sequencerConductor conductor.SequencerConductor) (out *eth.ExecutionPayloadEnvelope, errTyp BlockInsertionErrType, err error) { - return eq.ec.ConfirmPayload(ctx, agossip, sequencerConductor) -} - -func (eq *EngineQueue) CancelPayload(ctx context.Context, force bool) error { - return eq.ec.CancelPayload(ctx, force) -} - -func (eq *EngineQueue) BuildingPayload() (onto eth.L2BlockRef, id eth.PayloadID, safe bool) { - return eq.ec.BuildingPayload() -} - -// Reset walks the L2 chain backwards until it finds an L2 block whose L1 origin is canonical. -// The unsafe head is set to the head of the L2 chain, unless the existing safe head is not canonical. -func (eq *EngineQueue) Reset(ctx context.Context, _ eth.L1BlockRef, _ eth.SystemConfig) error { - result, err := sync.FindL2Heads(ctx, eq.cfg, eq.l1Fetcher, eq.engine, eq.log, eq.syncCfg) - if err != nil { - return NewTemporaryError(fmt.Errorf("failed to find the L2 Heads to start from: %w", err)) - } - finalized, safe, unsafe := result.Finalized, result.Safe, result.Unsafe - l1Origin, err := eq.l1Fetcher.L1BlockRefByHash(ctx, safe.L1Origin.Hash) - if err != nil { - return NewTemporaryError(fmt.Errorf("failed to fetch the new L1 progress: origin: %v; err: %w", safe.L1Origin, err)) - } - if safe.Time < l1Origin.Time { - return NewResetError(fmt.Errorf("cannot reset block derivation to start at L2 block %s with time %d older than its L1 origin %s with time %d, time invariant is broken", - safe, safe.Time, l1Origin, l1Origin.Time)) - } - - // Walk back L2 chain to find the L1 origin that is old enough to start buffering channel data from. - pipelineL2 := safe - for { - afterL2Genesis := pipelineL2.Number > eq.cfg.Genesis.L2.Number - afterL1Genesis := pipelineL2.L1Origin.Number > eq.cfg.Genesis.L1.Number - afterChannelTimeout := pipelineL2.L1Origin.Number+eq.cfg.ChannelTimeout > l1Origin.Number - if afterL2Genesis && afterL1Genesis && afterChannelTimeout { - parent, err := eq.engine.L2BlockRefByHash(ctx, pipelineL2.ParentHash) - if err != nil { - return NewResetError(fmt.Errorf("failed to fetch L2 parent block %s", pipelineL2.ParentID())) - } - pipelineL2 = parent - } else { - break - } - } - pipelineOrigin, err := eq.l1Fetcher.L1BlockRefByHash(ctx, pipelineL2.L1Origin.Hash) - if err != nil { - return NewTemporaryError(fmt.Errorf("failed to fetch the new L1 progress: origin: %s; err: %w", pipelineL2.L1Origin, err)) - } - l1Cfg, err := eq.engine.SystemConfigByL2Hash(ctx, pipelineL2.Hash) - if err != nil { - return NewTemporaryError(fmt.Errorf("failed to fetch L1 config of L2 block %s: %w", pipelineL2.ID(), err)) - } - eq.log.Debug("Reset engine queue", "safeHead", safe, "unsafe", unsafe, "safe_timestamp", safe.Time, "unsafe_timestamp", unsafe.Time, "l1Origin", l1Origin) - eq.ec.SetUnsafeHead(unsafe) - eq.ec.SetSafeHead(safe) - eq.ec.SetPendingSafeL2Head(safe) - eq.ec.SetFinalizedHead(finalized) - eq.ec.SetBackupUnsafeL2Head(eth.L2BlockRef{}, false) - eq.safeAttributes = nil - eq.ec.ResetBuildingState() - eq.finalityData = eq.finalityData[:0] - // note: finalizedL1 and triedFinalizeAt do not reset, since these do not change between reorgs. - // note: we do not clear the unsafe payloads queue; if the payloads are not applicable anymore the parent hash checks will clear out the old payloads. - eq.origin = pipelineOrigin - eq.sysCfg = l1Cfg - eq.lastNotifiedSafeHead = safe - if err := eq.safeHeadNotifs.SafeHeadReset(safe); err != nil { - return err - } - if eq.safeHeadNotifs.Enabled() && safe.Number == eq.cfg.Genesis.L2.Number && safe.Hash == eq.cfg.Genesis.L2.Hash { - // The rollup genesis block is always safe by definition. So if the pipeline resets this far back we know - // we will process all safe head updates and can record genesis as always safe from L1 genesis. - // Note that it is not safe to use cfg.Genesis.L1 here as it is the block immediately before the L2 genesis - // but the contracts may have been deployed earlier than that, allowing creating a dispute game - // with a L1 head prior to cfg.Genesis.L1 - l1Genesis, err := eq.l1Fetcher.L1BlockRefByNumber(ctx, 0) - if err != nil { - return fmt.Errorf("failed to retrieve L1 genesis: %w", err) - } - if err := eq.safeHeadNotifs.SafeHeadUpdated(safe, l1Genesis.ID()); err != nil { - return err - } - } - eq.logSyncProgress("reset derivation work") - return io.EOF -} - -// UnsafeL2SyncTarget retrieves the first queued-up L2 unsafe payload, or a zeroed reference if there is none. -func (eq *EngineQueue) UnsafeL2SyncTarget() eth.L2BlockRef { - if first := eq.unsafePayloads.Peek(); first != nil { - ref, err := PayloadToBlockRef(eq.cfg, first.ExecutionPayload) - if err != nil { - return eth.L2BlockRef{} - } - return ref - } else { - return eth.L2BlockRef{} - } -} diff --git a/op-node/rollup/derive/engine_queue_test.go b/op-node/rollup/derive/engine_queue_test.go deleted file mode 100644 index 479366d803a3..000000000000 --- a/op-node/rollup/derive/engine_queue_test.go +++ /dev/null @@ -1,1317 +0,0 @@ -package derive - -import ( - "context" - "fmt" - "io" - "math/big" - "math/rand" - "testing" - - "github.com/ethereum-optimism/optimism/op-node/node/safedb" - "github.com/holiman/uint256" - "github.com/stretchr/testify/require" - - "github.com/ethereum/go-ethereum/common" - "github.com/ethereum/go-ethereum/log" - - "github.com/ethereum-optimism/optimism/op-node/metrics" - "github.com/ethereum-optimism/optimism/op-node/rollup" - "github.com/ethereum-optimism/optimism/op-node/rollup/async" - "github.com/ethereum-optimism/optimism/op-node/rollup/conductor" - "github.com/ethereum-optimism/optimism/op-node/rollup/sync" - "github.com/ethereum-optimism/optimism/op-service/eth" - "github.com/ethereum-optimism/optimism/op-service/testlog" - "github.com/ethereum-optimism/optimism/op-service/testutils" -) - -type fakeAttributesQueue struct { - origin eth.L1BlockRef - attrs *eth.PayloadAttributes - islastInSpan bool -} - -func (f *fakeAttributesQueue) Origin() eth.L1BlockRef { - return f.origin -} - -func (f *fakeAttributesQueue) NextAttributes(_ context.Context, safeHead eth.L2BlockRef) (*AttributesWithParent, error) { - if f.attrs == nil { - return nil, io.EOF - } - return &AttributesWithParent{f.attrs, safeHead, f.islastInSpan}, nil -} - -var _ NextAttributesProvider = (*fakeAttributesQueue)(nil) - -func TestEngineQueue_Finalize(t *testing.T) { - logger := testlog.Logger(t, log.LevelInfo) - - rng := rand.New(rand.NewSource(1234)) - - l1Time := uint64(2) - refA := testutils.RandomBlockRef(rng) - - refB := eth.L1BlockRef{ - Hash: testutils.RandomHash(rng), - Number: refA.Number + 1, - ParentHash: refA.Hash, - Time: refA.Time + l1Time, - } - refC := eth.L1BlockRef{ - Hash: testutils.RandomHash(rng), - Number: refB.Number + 1, - ParentHash: refB.Hash, - Time: refB.Time + l1Time, - } - refD := eth.L1BlockRef{ - Hash: testutils.RandomHash(rng), - Number: refC.Number + 1, - ParentHash: refC.Hash, - Time: refC.Time + l1Time, - } - refE := eth.L1BlockRef{ - Hash: testutils.RandomHash(rng), - Number: refD.Number + 1, - ParentHash: refD.Hash, - Time: refD.Time + l1Time, - } - refF := eth.L1BlockRef{ - Hash: testutils.RandomHash(rng), - Number: refE.Number + 1, - ParentHash: refE.Hash, - Time: refE.Time + l1Time, - } - - refA0 := eth.L2BlockRef{ - Hash: testutils.RandomHash(rng), - Number: 0, - ParentHash: common.Hash{}, - Time: refA.Time, - L1Origin: refA.ID(), - SequenceNumber: 0, - } - cfg := &rollup.Config{ - Genesis: rollup.Genesis{ - L1: refA.ID(), - L2: refA0.ID(), - L2Time: refA0.Time, - }, - BlockTime: 1, - SeqWindowSize: 2, - } - refA1 := eth.L2BlockRef{ - Hash: testutils.RandomHash(rng), - Number: refA0.Number + 1, - ParentHash: refA0.Hash, - Time: refA0.Time + cfg.BlockTime, - L1Origin: refA.ID(), - SequenceNumber: 1, - } - refB0 := eth.L2BlockRef{ - Hash: testutils.RandomHash(rng), - Number: refA1.Number + 1, - ParentHash: refA1.Hash, - Time: refA1.Time + cfg.BlockTime, - L1Origin: refB.ID(), - SequenceNumber: 0, - } - refB1 := eth.L2BlockRef{ - Hash: testutils.RandomHash(rng), - Number: refB0.Number + 1, - ParentHash: refB0.Hash, - Time: refB0.Time + cfg.BlockTime, - L1Origin: refB.ID(), - SequenceNumber: 1, - } - refC0 := eth.L2BlockRef{ - Hash: testutils.RandomHash(rng), - Number: refB1.Number + 1, - ParentHash: refB1.Hash, - Time: refB1.Time + cfg.BlockTime, - L1Origin: refC.ID(), - SequenceNumber: 0, - } - refC1 := eth.L2BlockRef{ - Hash: testutils.RandomHash(rng), - Number: refC0.Number + 1, - ParentHash: refC0.Hash, - Time: refC0.Time + cfg.BlockTime, - L1Origin: refC.ID(), - SequenceNumber: 1, - } - refD0 := eth.L2BlockRef{ - Hash: testutils.RandomHash(rng), - Number: refC1.Number + 1, - ParentHash: refC1.Hash, - Time: refC1.Time + cfg.BlockTime, - L1Origin: refD.ID(), - SequenceNumber: 0, - } - refD1 := eth.L2BlockRef{ - Hash: testutils.RandomHash(rng), - Number: refD0.Number + 1, - ParentHash: refD0.Hash, - Time: refD0.Time + cfg.BlockTime, - L1Origin: refD.ID(), - SequenceNumber: 1, - } - refE0 := eth.L2BlockRef{ - Hash: testutils.RandomHash(rng), - Number: refD1.Number + 1, - ParentHash: refD1.Hash, - Time: refD1.Time + cfg.BlockTime, - L1Origin: refE.ID(), - SequenceNumber: 0, - } - refE1 := eth.L2BlockRef{ - Hash: testutils.RandomHash(rng), - Number: refE0.Number + 1, - ParentHash: refE0.Hash, - Time: refE0.Time + cfg.BlockTime, - L1Origin: refE.ID(), - SequenceNumber: 1, - } - refF0 := eth.L2BlockRef{ - Hash: testutils.RandomHash(rng), - Number: refE1.Number + 1, - ParentHash: refE1.Hash, - Time: refE1.Time + cfg.BlockTime, - L1Origin: refF.ID(), - SequenceNumber: 0, - } - refF1 := eth.L2BlockRef{ - Hash: testutils.RandomHash(rng), - Number: refF0.Number + 1, - ParentHash: refF0.Hash, - Time: refF0.Time + cfg.BlockTime, - L1Origin: refF.ID(), - SequenceNumber: 1, - } - t.Log("refA", refA.Hash) - t.Log("refB", refB.Hash) - t.Log("refC", refC.Hash) - t.Log("refD", refD.Hash) - t.Log("refE", refE.Hash) - t.Log("refF", refF.Hash) - t.Log("refA0", refA0.Hash) - t.Log("refA1", refA1.Hash) - t.Log("refB0", refB0.Hash) - t.Log("refB1", refB1.Hash) - t.Log("refC0", refC0.Hash) - t.Log("refC1", refC1.Hash) - t.Log("refD0", refD0.Hash) - t.Log("refD1", refD1.Hash) - t.Log("refE0", refE0.Hash) - t.Log("refE1", refE1.Hash) - t.Log("refF0", refF0.Hash) - t.Log("refF1", refF1.Hash) - - metrics := &testutils.TestDerivationMetrics{} - eng := &testutils.MockEngine{} - // we find the common point to initialize to by comparing the L1 origins in the L2 chain with the L1 chain - l1F := &testutils.MockL1Source{} - - eng.ExpectL2BlockRefByLabel(eth.Finalized, refA1, nil) - eng.ExpectL2BlockRefByLabel(eth.Safe, refE0, nil) - eng.ExpectL2BlockRefByLabel(eth.Unsafe, refF1, nil) - - // unsafe - l1F.ExpectL1BlockRefByNumber(refF.Number, refF, nil) - eng.ExpectL2BlockRefByHash(refF1.ParentHash, refF0, nil) - eng.ExpectL2BlockRefByHash(refF0.ParentHash, refE1, nil) - - // meet previous safe, counts 1/2 - l1F.ExpectL1BlockRefByHash(refE.Hash, refE, nil) - eng.ExpectL2BlockRefByHash(refE1.ParentHash, refE0, nil) - eng.ExpectL2BlockRefByHash(refE0.ParentHash, refD1, nil) - - // now full seq window, inclusive - l1F.ExpectL1BlockRefByHash(refD.Hash, refD, nil) - eng.ExpectL2BlockRefByHash(refD1.ParentHash, refD0, nil) - eng.ExpectL2BlockRefByHash(refD0.ParentHash, refC1, nil) - - // now one more L1 origin - l1F.ExpectL1BlockRefByHash(refC.Hash, refC, nil) - eng.ExpectL2BlockRefByHash(refC1.ParentHash, refC0, nil) - // parent of that origin will be considered safe - eng.ExpectL2BlockRefByHash(refC0.ParentHash, refB1, nil) - - // and we fetch the L1 origin of that as starting point for engine queue - l1F.ExpectL1BlockRefByHash(refB.Hash, refB, nil) - l1F.ExpectL1BlockRefByHash(refB.Hash, refB, nil) - - // and mock a L1 config for the last L2 block that references the L1 starting point - eng.ExpectSystemConfigByL2Hash(refB1.Hash, eth.SystemConfig{ - BatcherAddr: common.Address{42}, - Overhead: [32]byte{123}, - Scalar: [32]byte{42}, - GasLimit: 20_000_000, - }, nil) - - prev := &fakeAttributesQueue{} - - ec := NewEngineController(eng, logger, metrics, &rollup.Config{}, sync.CLSync, nil) - eq := NewEngineQueue(logger, cfg, eng, ec, metrics, prev, l1F, &sync.Config{}, safedb.Disabled) - require.ErrorIs(t, eq.Reset(context.Background(), eth.L1BlockRef{}, eth.SystemConfig{}), io.EOF) - - require.Equal(t, refB1, ec.SafeL2Head(), "L2 reset should go back to sequence window ago: blocks with origin E and D are not safe until we reconcile, C is extra, and B1 is the end we look for") - require.Equal(t, refB, eq.Origin(), "Expecting to be set back derivation L1 progress to B") - require.Equal(t, refA1, ec.Finalized(), "A1 is recognized as finalized before we run any steps") - - // now say C1 was included in D and became the new safe head - eq.origin = refD - prev.origin = refD - eq.ec.SetSafeHead(refC1) - require.NoError(t, eq.postProcessSafeL2()) - - // now say D0 was included in E and became the new safe head - eq.origin = refE - prev.origin = refE - eq.ec.SetSafeHead(refD0) - require.NoError(t, eq.postProcessSafeL2()) - - // let's finalize D (current L1), from which we fully derived C1 (it was safe head), but not D0 (included in E) - eq.Finalize(refD) - - require.Equal(t, refC1, ec.Finalized(), "C1 was included in finalized D, and should now be finalized") - - l1F.AssertExpectations(t) - eng.AssertExpectations(t) -} - -func TestEngineQueue_ResetWhenUnsafeOriginNotCanonical(t *testing.T) { - logger := testlog.Logger(t, log.LevelInfo) - - rng := rand.New(rand.NewSource(1234)) - - l1Time := uint64(2) - refA := testutils.RandomBlockRef(rng) - - refB := eth.L1BlockRef{ - Hash: testutils.RandomHash(rng), - Number: refA.Number + 1, - ParentHash: refA.Hash, - Time: refA.Time + l1Time, - } - refC := eth.L1BlockRef{ - Hash: testutils.RandomHash(rng), - Number: refB.Number + 1, - ParentHash: refB.Hash, - Time: refB.Time + l1Time, - } - refD := eth.L1BlockRef{ - Hash: testutils.RandomHash(rng), - Number: refC.Number + 1, - ParentHash: refC.Hash, - Time: refC.Time + l1Time, - } - refE := eth.L1BlockRef{ - Hash: testutils.RandomHash(rng), - Number: refD.Number + 1, - ParentHash: refD.Hash, - Time: refD.Time + l1Time, - } - refF := eth.L1BlockRef{ - Hash: testutils.RandomHash(rng), - Number: refE.Number + 1, - ParentHash: refE.Hash, - Time: refE.Time + l1Time, - } - - refA0 := eth.L2BlockRef{ - Hash: testutils.RandomHash(rng), - Number: 0, - ParentHash: common.Hash{}, - Time: refA.Time, - L1Origin: refA.ID(), - SequenceNumber: 0, - } - cfg := &rollup.Config{ - Genesis: rollup.Genesis{ - L1: refA.ID(), - L2: refA0.ID(), - L2Time: refA0.Time, - }, - BlockTime: 1, - SeqWindowSize: 2, - } - refA1 := eth.L2BlockRef{ - Hash: testutils.RandomHash(rng), - Number: refA0.Number + 1, - ParentHash: refA0.Hash, - Time: refA0.Time + cfg.BlockTime, - L1Origin: refA.ID(), - SequenceNumber: 1, - } - refB0 := eth.L2BlockRef{ - Hash: testutils.RandomHash(rng), - Number: refA1.Number + 1, - ParentHash: refA1.Hash, - Time: refA1.Time + cfg.BlockTime, - L1Origin: refB.ID(), - SequenceNumber: 0, - } - refB1 := eth.L2BlockRef{ - Hash: testutils.RandomHash(rng), - Number: refB0.Number + 1, - ParentHash: refB0.Hash, - Time: refB0.Time + cfg.BlockTime, - L1Origin: refB.ID(), - SequenceNumber: 1, - } - refC0 := eth.L2BlockRef{ - Hash: testutils.RandomHash(rng), - Number: refB1.Number + 1, - ParentHash: refB1.Hash, - Time: refB1.Time + cfg.BlockTime, - L1Origin: refC.ID(), - SequenceNumber: 0, - } - refC1 := eth.L2BlockRef{ - Hash: testutils.RandomHash(rng), - Number: refC0.Number + 1, - ParentHash: refC0.Hash, - Time: refC0.Time + cfg.BlockTime, - L1Origin: refC.ID(), - SequenceNumber: 1, - } - refD0 := eth.L2BlockRef{ - Hash: testutils.RandomHash(rng), - Number: refC1.Number + 1, - ParentHash: refC1.Hash, - Time: refC1.Time + cfg.BlockTime, - L1Origin: refD.ID(), - SequenceNumber: 0, - } - refD1 := eth.L2BlockRef{ - Hash: testutils.RandomHash(rng), - Number: refD0.Number + 1, - ParentHash: refD0.Hash, - Time: refD0.Time + cfg.BlockTime, - L1Origin: refD.ID(), - SequenceNumber: 1, - } - refE0 := eth.L2BlockRef{ - Hash: testutils.RandomHash(rng), - Number: refD1.Number + 1, - ParentHash: refD1.Hash, - Time: refD1.Time + cfg.BlockTime, - L1Origin: refE.ID(), - SequenceNumber: 0, - } - refE1 := eth.L2BlockRef{ - Hash: testutils.RandomHash(rng), - Number: refE0.Number + 1, - ParentHash: refE0.Hash, - Time: refE0.Time + cfg.BlockTime, - L1Origin: refE.ID(), - SequenceNumber: 1, - } - refF0 := eth.L2BlockRef{ - Hash: testutils.RandomHash(rng), - Number: refE1.Number + 1, - ParentHash: refE1.Hash, - Time: refE1.Time + cfg.BlockTime, - L1Origin: refF.ID(), - SequenceNumber: 0, - } - refF1 := eth.L2BlockRef{ - Hash: testutils.RandomHash(rng), - Number: refF0.Number + 1, - ParentHash: refF0.Hash, - Time: refF0.Time + cfg.BlockTime, - L1Origin: refF.ID(), - SequenceNumber: 1, - } - t.Log("refA", refA.Hash) - t.Log("refB", refB.Hash) - t.Log("refC", refC.Hash) - t.Log("refD", refD.Hash) - t.Log("refE", refE.Hash) - t.Log("refF", refF.Hash) - t.Log("refA0", refA0.Hash) - t.Log("refA1", refA1.Hash) - t.Log("refB0", refB0.Hash) - t.Log("refB1", refB1.Hash) - t.Log("refC0", refC0.Hash) - t.Log("refC1", refC1.Hash) - t.Log("refD0", refD0.Hash) - t.Log("refD1", refD1.Hash) - t.Log("refE0", refE0.Hash) - t.Log("refE1", refE1.Hash) - t.Log("refF0", refF0.Hash) - t.Log("refF1", refF1.Hash) - - metrics := &testutils.TestDerivationMetrics{} - eng := &testutils.MockEngine{} - // we find the common point to initialize to by comparing the L1 origins in the L2 chain with the L1 chain - l1F := &testutils.MockL1Source{} - - eng.ExpectL2BlockRefByLabel(eth.Finalized, refA1, nil) - eng.ExpectL2BlockRefByLabel(eth.Safe, refE0, nil) - eng.ExpectL2BlockRefByLabel(eth.Unsafe, refF1, nil) - - // unsafe - l1F.ExpectL1BlockRefByNumber(refF.Number, refF, nil) - eng.ExpectL2BlockRefByHash(refF1.ParentHash, refF0, nil) - eng.ExpectL2BlockRefByHash(refF0.ParentHash, refE1, nil) - - // meet previous safe, counts 1/2 - l1F.ExpectL1BlockRefByHash(refE.Hash, refE, nil) - eng.ExpectL2BlockRefByHash(refE1.ParentHash, refE0, nil) - eng.ExpectL2BlockRefByHash(refE0.ParentHash, refD1, nil) - - // now full seq window, inclusive - l1F.ExpectL1BlockRefByHash(refD.Hash, refD, nil) - eng.ExpectL2BlockRefByHash(refD1.ParentHash, refD0, nil) - eng.ExpectL2BlockRefByHash(refD0.ParentHash, refC1, nil) - - // now one more L1 origin - l1F.ExpectL1BlockRefByHash(refC.Hash, refC, nil) - eng.ExpectL2BlockRefByHash(refC1.ParentHash, refC0, nil) - // parent of that origin will be considered safe - eng.ExpectL2BlockRefByHash(refC0.ParentHash, refB1, nil) - - // and we fetch the L1 origin of that as starting point for engine queue - l1F.ExpectL1BlockRefByHash(refB.Hash, refB, nil) - l1F.ExpectL1BlockRefByHash(refB.Hash, refB, nil) - - // and mock a L1 config for the last L2 block that references the L1 starting point - eng.ExpectSystemConfigByL2Hash(refB1.Hash, eth.SystemConfig{ - BatcherAddr: common.Address{42}, - Overhead: [32]byte{123}, - Scalar: [32]byte{42}, - GasLimit: 20_000_000, - }, nil) - - prev := &fakeAttributesQueue{origin: refE} - - ec := NewEngineController(eng, logger, metrics, &rollup.Config{}, sync.CLSync, nil) - eq := NewEngineQueue(logger, cfg, eng, ec, metrics, prev, l1F, &sync.Config{}, safedb.Disabled) - require.ErrorIs(t, eq.Reset(context.Background(), eth.L1BlockRef{}, eth.SystemConfig{}), io.EOF) - - require.Equal(t, refB1, ec.SafeL2Head(), "L2 reset should go back to sequence window ago: blocks with origin E and D are not safe until we reconcile, C is extra, and B1 is the end we look for") - require.Equal(t, refB, eq.Origin(), "Expecting to be set back derivation L1 progress to B") - require.Equal(t, refA1, ec.Finalized(), "A1 is recognized as finalized before we run any steps") - - // First step after reset will do a fork choice update - eng.ExpectForkchoiceUpdate(ð.ForkchoiceState{ - HeadBlockHash: eq.ec.UnsafeL2Head().Hash, - SafeBlockHash: eq.ec.SafeL2Head().Hash, - FinalizedBlockHash: eq.ec.Finalized().Hash, - }, nil, ð.ForkchoiceUpdatedResult{PayloadStatus: eth.PayloadStatusV1{Status: eth.ExecutionValid}}, nil) - err := eq.Step(context.Background()) - require.NoError(t, err) - - require.Equal(t, refF.ID(), eq.ec.UnsafeL2Head().L1Origin, "should have refF as unsafe head origin") - - // L1 chain reorgs so new origin is at same slot as refF but on a different fork - prev.origin = eth.L1BlockRef{ - Hash: testutils.RandomHash(rng), - Number: refF.Number, - ParentHash: refE.Hash, - Time: refF.Time, - } - err = eq.Step(context.Background()) - require.ErrorIs(t, err, ErrReset, "should reset pipeline due to mismatched origin") - - l1F.AssertExpectations(t) - eng.AssertExpectations(t) -} - -func TestVerifyNewL1Origin(t *testing.T) { - logger := testlog.Logger(t, log.LevelInfo) - - rng := rand.New(rand.NewSource(1234)) - - l1Time := uint64(2) - refA := testutils.RandomBlockRef(rng) - - refB := eth.L1BlockRef{ - Hash: testutils.RandomHash(rng), - Number: refA.Number + 1, - ParentHash: refA.Hash, - Time: refA.Time + l1Time, - } - refC := eth.L1BlockRef{ - Hash: testutils.RandomHash(rng), - Number: refB.Number + 1, - ParentHash: refB.Hash, - Time: refB.Time + l1Time, - } - refD := eth.L1BlockRef{ - Hash: testutils.RandomHash(rng), - Number: refC.Number + 1, - ParentHash: refC.Hash, - Time: refC.Time + l1Time, - } - refE := eth.L1BlockRef{ - Hash: testutils.RandomHash(rng), - Number: refD.Number + 1, - ParentHash: refD.Hash, - Time: refD.Time + l1Time, - } - refF := eth.L1BlockRef{ - Hash: testutils.RandomHash(rng), - Number: refE.Number + 1, - ParentHash: refE.Hash, - Time: refE.Time + l1Time, - } - refG := eth.L1BlockRef{ - Hash: testutils.RandomHash(rng), - Number: refF.Number + 1, - ParentHash: refF.Hash, - Time: refF.Time + l1Time, - } - refH := eth.L1BlockRef{ - Hash: testutils.RandomHash(rng), - Number: refG.Number + 1, - ParentHash: refG.Hash, - Time: refG.Time + l1Time, - } - - refA0 := eth.L2BlockRef{ - Hash: testutils.RandomHash(rng), - Number: 0, - ParentHash: common.Hash{}, - Time: refA.Time, - L1Origin: refA.ID(), - SequenceNumber: 0, - } - cfg := &rollup.Config{ - Genesis: rollup.Genesis{ - L1: refA.ID(), - L2: refA0.ID(), - L2Time: refA0.Time, - }, - BlockTime: 1, - SeqWindowSize: 2, - } - refA1 := eth.L2BlockRef{ - Hash: testutils.RandomHash(rng), - Number: refA0.Number + 1, - ParentHash: refA0.Hash, - Time: refA0.Time + cfg.BlockTime, - L1Origin: refA.ID(), - SequenceNumber: 1, - } - refB0 := eth.L2BlockRef{ - Hash: testutils.RandomHash(rng), - Number: refA1.Number + 1, - ParentHash: refA1.Hash, - Time: refA1.Time + cfg.BlockTime, - L1Origin: refB.ID(), - SequenceNumber: 0, - } - refB1 := eth.L2BlockRef{ - Hash: testutils.RandomHash(rng), - Number: refB0.Number + 1, - ParentHash: refB0.Hash, - Time: refB0.Time + cfg.BlockTime, - L1Origin: refB.ID(), - SequenceNumber: 1, - } - refC0 := eth.L2BlockRef{ - Hash: testutils.RandomHash(rng), - Number: refB1.Number + 1, - ParentHash: refB1.Hash, - Time: refB1.Time + cfg.BlockTime, - L1Origin: refC.ID(), - SequenceNumber: 0, - } - refC1 := eth.L2BlockRef{ - Hash: testutils.RandomHash(rng), - Number: refC0.Number + 1, - ParentHash: refC0.Hash, - Time: refC0.Time + cfg.BlockTime, - L1Origin: refC.ID(), - SequenceNumber: 1, - } - refD0 := eth.L2BlockRef{ - Hash: testutils.RandomHash(rng), - Number: refC1.Number + 1, - ParentHash: refC1.Hash, - Time: refC1.Time + cfg.BlockTime, - L1Origin: refD.ID(), - SequenceNumber: 0, - } - refD1 := eth.L2BlockRef{ - Hash: testutils.RandomHash(rng), - Number: refD0.Number + 1, - ParentHash: refD0.Hash, - Time: refD0.Time + cfg.BlockTime, - L1Origin: refD.ID(), - SequenceNumber: 1, - } - refE0 := eth.L2BlockRef{ - Hash: testutils.RandomHash(rng), - Number: refD1.Number + 1, - ParentHash: refD1.Hash, - Time: refD1.Time + cfg.BlockTime, - L1Origin: refE.ID(), - SequenceNumber: 0, - } - refE1 := eth.L2BlockRef{ - Hash: testutils.RandomHash(rng), - Number: refE0.Number + 1, - ParentHash: refE0.Hash, - Time: refE0.Time + cfg.BlockTime, - L1Origin: refE.ID(), - SequenceNumber: 1, - } - refF0 := eth.L2BlockRef{ - Hash: testutils.RandomHash(rng), - Number: refE1.Number + 1, - ParentHash: refE1.Hash, - Time: refE1.Time + cfg.BlockTime, - L1Origin: refF.ID(), - SequenceNumber: 0, - } - refF1 := eth.L2BlockRef{ - Hash: testutils.RandomHash(rng), - Number: refF0.Number + 1, - ParentHash: refF0.Hash, - Time: refF0.Time + cfg.BlockTime, - L1Origin: refF.ID(), - SequenceNumber: 1, - } - t.Log("refA", refA.Hash) - t.Log("refB", refB.Hash) - t.Log("refC", refC.Hash) - t.Log("refD", refD.Hash) - t.Log("refE", refE.Hash) - t.Log("refF", refF.Hash) - t.Log("refG", refG.Hash) - t.Log("refH", refH.Hash) - t.Log("refA0", refA0.Hash) - t.Log("refA1", refA1.Hash) - t.Log("refB0", refB0.Hash) - t.Log("refB1", refB1.Hash) - t.Log("refC0", refC0.Hash) - t.Log("refC1", refC1.Hash) - t.Log("refD0", refD0.Hash) - t.Log("refD1", refD1.Hash) - t.Log("refE0", refE0.Hash) - t.Log("refE1", refE1.Hash) - t.Log("refF0", refF0.Hash) - t.Log("refF1", refF1.Hash) - - metrics := &testutils.TestDerivationMetrics{} - - tests := []struct { - name string - newOrigin eth.L1BlockRef - expectReset bool - expectedFetchBlocks map[uint64]eth.L1BlockRef - }{ - { - name: "L1OriginBeforeUnsafeOrigin", - newOrigin: refD, - expectReset: false, - }, - { - name: "Matching", - newOrigin: refF, - expectReset: false, - }, - { - name: "BlockNumberEqualDifferentHash", - newOrigin: eth.L1BlockRef{ - Hash: testutils.RandomHash(rng), - Number: refF.Number, - ParentHash: refE.Hash, - Time: refF.Time, - }, - expectReset: true, - }, - { - name: "UnsafeIsParent", - newOrigin: refG, - expectReset: false, - }, - { - name: "UnsafeIsParentNumberDifferentHash", - newOrigin: eth.L1BlockRef{ - Hash: testutils.RandomHash(rng), - Number: refG.Number, - ParentHash: testutils.RandomHash(rng), - Time: refG.Time, - }, - expectReset: true, - }, - { - name: "UnsafeIsOlderCanonical", - newOrigin: refH, - expectReset: false, - expectedFetchBlocks: map[uint64]eth.L1BlockRef{ - refF.Number: refF, - }, - }, - { - name: "UnsafeIsOlderNonCanonical", - newOrigin: eth.L1BlockRef{ - Hash: testutils.RandomHash(rng), - Number: refH.Number, - ParentHash: testutils.RandomHash(rng), - Time: refH.Time, - }, - expectReset: true, - expectedFetchBlocks: map[uint64]eth.L1BlockRef{ - // Second look up gets a different block in F's block number due to a reorg - refF.Number: { - Hash: testutils.RandomHash(rng), - Number: refF.Number, - ParentHash: refE.Hash, - Time: refF.Time, - }, - }, - }, - } - for _, test := range tests { - test := test - t.Run(test.name, func(t *testing.T) { - eng := &testutils.MockEngine{} - // we find the common point to initialize to by comparing the L1 origins in the L2 chain with the L1 chain - l1F := &testutils.MockL1Source{} - - eng.ExpectL2BlockRefByLabel(eth.Finalized, refA1, nil) - eng.ExpectL2BlockRefByLabel(eth.Safe, refE0, nil) - eng.ExpectL2BlockRefByLabel(eth.Unsafe, refF1, nil) - - // unsafe - l1F.ExpectL1BlockRefByNumber(refF.Number, refF, nil) - eng.ExpectL2BlockRefByHash(refF1.ParentHash, refF0, nil) - eng.ExpectL2BlockRefByHash(refF0.ParentHash, refE1, nil) - - for blockNum, block := range test.expectedFetchBlocks { - l1F.ExpectL1BlockRefByNumber(blockNum, block, nil) - } - - // meet previous safe, counts 1/2 - l1F.ExpectL1BlockRefByHash(refE.Hash, refE, nil) - eng.ExpectL2BlockRefByHash(refE1.ParentHash, refE0, nil) - eng.ExpectL2BlockRefByHash(refE0.ParentHash, refD1, nil) - - // now full seq window, inclusive - l1F.ExpectL1BlockRefByHash(refD.Hash, refD, nil) - eng.ExpectL2BlockRefByHash(refD1.ParentHash, refD0, nil) - eng.ExpectL2BlockRefByHash(refD0.ParentHash, refC1, nil) - - // now one more L1 origin - l1F.ExpectL1BlockRefByHash(refC.Hash, refC, nil) - eng.ExpectL2BlockRefByHash(refC1.ParentHash, refC0, nil) - // parent of that origin will be considered safe - eng.ExpectL2BlockRefByHash(refC0.ParentHash, refB1, nil) - - // and we fetch the L1 origin of that as starting point for engine queue - l1F.ExpectL1BlockRefByHash(refB.Hash, refB, nil) - l1F.ExpectL1BlockRefByHash(refB.Hash, refB, nil) - - // and mock a L1 config for the last L2 block that references the L1 starting point - eng.ExpectSystemConfigByL2Hash(refB1.Hash, eth.SystemConfig{ - BatcherAddr: common.Address{42}, - Overhead: [32]byte{123}, - Scalar: [32]byte{42}, - GasLimit: 20_000_000, - }, nil) - - prev := &fakeAttributesQueue{origin: refE} - ec := NewEngineController(eng, logger, metrics, &rollup.Config{}, sync.CLSync, nil) - eq := NewEngineQueue(logger, cfg, eng, ec, metrics, prev, l1F, &sync.Config{}, safedb.Disabled) - require.ErrorIs(t, eq.Reset(context.Background(), eth.L1BlockRef{}, eth.SystemConfig{}), io.EOF) - - require.Equal(t, refB1, ec.SafeL2Head(), "L2 reset should go back to sequence window ago: blocks with origin E and D are not safe until we reconcile, C is extra, and B1 is the end we look for") - require.Equal(t, refB, eq.Origin(), "Expecting to be set back derivation L1 progress to B") - require.Equal(t, refA1, ec.Finalized(), "A1 is recognized as finalized before we run any steps") - - // First step after reset will do a fork choice update - eng.ExpectForkchoiceUpdate(ð.ForkchoiceState{ - HeadBlockHash: eq.ec.UnsafeL2Head().Hash, - SafeBlockHash: eq.ec.SafeL2Head().Hash, - FinalizedBlockHash: eq.ec.Finalized().Hash, - }, nil, ð.ForkchoiceUpdatedResult{PayloadStatus: eth.PayloadStatusV1{Status: eth.ExecutionValid}}, nil) - err := eq.Step(context.Background()) - require.NoError(t, err) - - require.Equal(t, refF.ID(), eq.ec.UnsafeL2Head().L1Origin, "should have refF as unsafe head origin") - - // L1 chain reorgs so new origin is at same slot as refF but on a different fork - prev.origin = test.newOrigin - err = eq.Step(context.Background()) - if test.expectReset { - require.ErrorIs(t, err, ErrReset, "should reset pipeline due to mismatched origin") - } else { - require.ErrorIs(t, err, io.EOF, "should not reset pipeline") - } - - l1F.AssertExpectations(t) - eng.AssertExpectations(t) - }) - } -} - -func TestBlockBuildingRace(t *testing.T) { - logger := testlog.Logger(t, log.LevelInfo) - eng := &testutils.MockEngine{} - - rng := rand.New(rand.NewSource(1234)) - - refA := testutils.RandomBlockRef(rng) - refA0 := eth.L2BlockRef{ - Hash: testutils.RandomHash(rng), - Number: 0, - ParentHash: common.Hash{}, - Time: refA.Time, - L1Origin: refA.ID(), - SequenceNumber: 0, - } - cfg := &rollup.Config{ - Genesis: rollup.Genesis{ - L1: refA.ID(), - L2: refA0.ID(), - L2Time: refA0.Time, - SystemConfig: eth.SystemConfig{ - BatcherAddr: common.Address{42}, - Overhead: [32]byte{123}, - Scalar: [32]byte{42}, - GasLimit: 20_000_000, - }, - }, - BlockTime: 1, - SeqWindowSize: 2, - } - refA1 := eth.L2BlockRef{ - Hash: testutils.RandomHash(rng), - Number: refA0.Number + 1, - ParentHash: refA0.Hash, - Time: refA0.Time + cfg.BlockTime, - L1Origin: refA.ID(), - SequenceNumber: 1, - } - - l1F := &testutils.MockL1Source{} - - eng.ExpectL2BlockRefByLabel(eth.Finalized, refA0, nil) - eng.ExpectL2BlockRefByLabel(eth.Safe, refA0, nil) - eng.ExpectL2BlockRefByLabel(eth.Unsafe, refA0, nil) - l1F.ExpectL1BlockRefByNumber(refA.Number, refA, nil) - l1F.ExpectL1BlockRefByHash(refA.Hash, refA, nil) - l1F.ExpectL1BlockRefByHash(refA.Hash, refA, nil) - - eng.ExpectSystemConfigByL2Hash(refA0.Hash, cfg.Genesis.SystemConfig, nil) - - metrics := &testutils.TestDerivationMetrics{} - - gasLimit := eth.Uint64Quantity(20_000_000) - attrs := ð.PayloadAttributes{ - Timestamp: eth.Uint64Quantity(refA1.Time), - PrevRandao: eth.Bytes32{}, - SuggestedFeeRecipient: common.Address{}, - Transactions: nil, - NoTxPool: false, - GasLimit: &gasLimit, - } - - prev := &fakeAttributesQueue{origin: refA, attrs: attrs, islastInSpan: true} - ec := NewEngineController(eng, logger, metrics, &rollup.Config{}, sync.CLSync, nil) - eq := NewEngineQueue(logger, cfg, eng, ec, metrics, prev, l1F, &sync.Config{}, safedb.Disabled) - require.ErrorIs(t, eq.Reset(context.Background(), eth.L1BlockRef{}, eth.SystemConfig{}), io.EOF) - - id := eth.PayloadID{0xff} - - preFc := ð.ForkchoiceState{ - HeadBlockHash: refA0.Hash, - SafeBlockHash: refA0.Hash, - FinalizedBlockHash: refA0.Hash, - } - preFcRes := ð.ForkchoiceUpdatedResult{ - PayloadStatus: eth.PayloadStatusV1{ - Status: eth.ExecutionValid, - LatestValidHash: &refA0.Hash, - ValidationError: nil, - }, - PayloadID: &id, - } - - // Expect initial forkchoice update - eng.ExpectForkchoiceUpdate(preFc, nil, preFcRes, nil) - require.NoError(t, eq.Step(context.Background()), "clean forkchoice state after reset") - - // Expect initial building update, to process the attributes we queued up - eng.ExpectForkchoiceUpdate(preFc, attrs, preFcRes, nil) - // Don't let the payload be confirmed straight away - mockErr := fmt.Errorf("mock error") - eng.ExpectGetPayload(id, nil, mockErr) - // The job will be not be cancelled, the untyped error is a temporary error - - require.ErrorIs(t, eq.Step(context.Background()), NotEnoughData, "queue up attributes") - require.ErrorIs(t, eq.Step(context.Background()), mockErr, "expecting to fail to process attributes") - require.NotNil(t, eq.safeAttributes, "still have attributes") - - // Now allow the building to complete - a1InfoTx, err := L1InfoDepositBytes(cfg, cfg.Genesis.SystemConfig, refA1.SequenceNumber, &testutils.MockBlockInfo{ - InfoHash: refA.Hash, - InfoParentHash: refA.ParentHash, - InfoCoinbase: common.Address{}, - InfoRoot: common.Hash{}, - InfoNum: refA.Number, - InfoTime: refA.Time, - InfoMixDigest: [32]byte{}, - InfoBaseFee: big.NewInt(7), - InfoReceiptRoot: common.Hash{}, - InfoGasUsed: 0, - }, 0) - - require.NoError(t, err) - payloadA1 := ð.ExecutionPayload{ - ParentHash: refA1.ParentHash, - FeeRecipient: attrs.SuggestedFeeRecipient, - StateRoot: eth.Bytes32{}, - ReceiptsRoot: eth.Bytes32{}, - LogsBloom: eth.Bytes256{}, - PrevRandao: eth.Bytes32{}, - BlockNumber: eth.Uint64Quantity(refA1.Number), - GasLimit: gasLimit, - GasUsed: 0, - Timestamp: eth.Uint64Quantity(refA1.Time), - ExtraData: nil, - BaseFeePerGas: eth.Uint256Quantity(*uint256.NewInt(7)), - BlockHash: refA1.Hash, - Transactions: []eth.Data{ - a1InfoTx, - }, - } - envelope := ð.ExecutionPayloadEnvelope{ExecutionPayload: payloadA1} - eng.ExpectGetPayload(id, envelope, nil) - eng.ExpectNewPayload(payloadA1, nil, ð.PayloadStatusV1{ - Status: eth.ExecutionValid, - LatestValidHash: &refA1.Hash, - ValidationError: nil, - }, nil) - postFc := ð.ForkchoiceState{ - HeadBlockHash: refA1.Hash, - SafeBlockHash: refA1.Hash, - FinalizedBlockHash: refA0.Hash, - } - postFcRes := ð.ForkchoiceUpdatedResult{ - PayloadStatus: eth.PayloadStatusV1{ - Status: eth.ExecutionValid, - LatestValidHash: &refA1.Hash, - ValidationError: nil, - }, - PayloadID: &id, - } - eng.ExpectForkchoiceUpdate(postFc, nil, postFcRes, nil) - - // Now complete the job, as external user of the engine - _, _, err = eq.ConfirmPayload(context.Background(), async.NoOpGossiper{}, &conductor.NoOpConductor{}) - require.NoError(t, err) - require.Equal(t, refA1, ec.SafeL2Head(), "safe head should have changed") - - require.NoError(t, eq.Step(context.Background())) - require.Nil(t, eq.safeAttributes, "attributes should now be invalidated") - - l1F.AssertExpectations(t) - eng.AssertExpectations(t) -} - -func TestResetLoop(t *testing.T) { - logger := testlog.Logger(t, log.LevelInfo) - eng := &testutils.MockEngine{} - l1F := &testutils.MockL1Source{} - - rng := rand.New(rand.NewSource(1234)) - - refA := testutils.RandomBlockRef(rng) - refA0 := eth.L2BlockRef{ - Hash: testutils.RandomHash(rng), - Number: 0, - ParentHash: common.Hash{}, - Time: refA.Time, - L1Origin: refA.ID(), - SequenceNumber: 0, - } - gasLimit := eth.Uint64Quantity(20_000_000) - cfg := &rollup.Config{ - Genesis: rollup.Genesis{ - L1: refA.ID(), - L2: refA0.ID(), - L2Time: refA0.Time, - SystemConfig: eth.SystemConfig{ - BatcherAddr: common.Address{42}, - Overhead: [32]byte{123}, - Scalar: [32]byte{42}, - GasLimit: 20_000_000, - }, - }, - BlockTime: 1, - SeqWindowSize: 2, - } - refA1 := eth.L2BlockRef{ - Hash: testutils.RandomHash(rng), - Number: refA0.Number + 1, - ParentHash: refA0.Hash, - Time: refA0.Time + cfg.BlockTime, - L1Origin: refA.ID(), - SequenceNumber: 1, - } - refA2 := eth.L2BlockRef{ - Hash: testutils.RandomHash(rng), - Number: refA1.Number + 1, - ParentHash: refA1.Hash, - Time: refA1.Time + cfg.BlockTime, - L1Origin: refA.ID(), - SequenceNumber: 2, - } - - attrs := ð.PayloadAttributes{ - Timestamp: eth.Uint64Quantity(refA2.Time), - PrevRandao: eth.Bytes32{}, - SuggestedFeeRecipient: common.Address{}, - Transactions: nil, - NoTxPool: false, - GasLimit: &gasLimit, - } - - eng.ExpectL2BlockRefByLabel(eth.Finalized, refA0, nil) - eng.ExpectL2BlockRefByLabel(eth.Safe, refA1, nil) - eng.ExpectL2BlockRefByLabel(eth.Unsafe, refA2, nil) - eng.ExpectL2BlockRefByHash(refA1.Hash, refA1, nil) - eng.ExpectL2BlockRefByHash(refA0.Hash, refA0, nil) - eng.ExpectSystemConfigByL2Hash(refA0.Hash, cfg.Genesis.SystemConfig, nil) - l1F.ExpectL1BlockRefByNumber(refA.Number, refA, nil) - l1F.ExpectL1BlockRefByHash(refA.Hash, refA, nil) - l1F.ExpectL1BlockRefByHash(refA.Hash, refA, nil) - - prev := &fakeAttributesQueue{origin: refA, attrs: attrs, islastInSpan: true} - - ec := NewEngineController(eng, logger, metrics.NoopMetrics, &rollup.Config{}, sync.CLSync, nil) - eq := NewEngineQueue(logger, cfg, eng, ec, metrics.NoopMetrics, prev, l1F, &sync.Config{}, safedb.Disabled) - eq.ec.SetUnsafeHead(refA2) - eq.ec.SetSafeHead(refA1) - eq.ec.SetFinalizedHead(refA0) - - // Queue up the safe attributes - // Expect a FCU after during the first step - preFc := ð.ForkchoiceState{ - HeadBlockHash: refA2.Hash, - SafeBlockHash: refA1.Hash, - FinalizedBlockHash: refA0.Hash, - } - eng.ExpectForkchoiceUpdate(preFc, nil, nil, nil) - require.Nil(t, eq.safeAttributes) - require.ErrorIs(t, eq.Step(context.Background()), nil) - require.ErrorIs(t, eq.Step(context.Background()), NotEnoughData) - require.NotNil(t, eq.safeAttributes) - - // Perform the reset - require.ErrorIs(t, eq.Reset(context.Background(), eth.L1BlockRef{}, eth.SystemConfig{}), io.EOF) - - // Expect a FCU after the reset - postFc := ð.ForkchoiceState{ - HeadBlockHash: refA2.Hash, - SafeBlockHash: refA0.Hash, - FinalizedBlockHash: refA0.Hash, - } - eng.ExpectForkchoiceUpdate(postFc, nil, nil, nil) - require.NoError(t, eq.Step(context.Background()), "clean forkchoice state after reset") - - // Crux of the test. Should be in a valid state after the reset. - require.ErrorIs(t, eq.Step(context.Background()), NotEnoughData, "Should be able to step after a reset") - - l1F.AssertExpectations(t) - eng.AssertExpectations(t) -} - -func TestEngineQueue_StepPopOlderUnsafe(t *testing.T) { - logger := testlog.Logger(t, log.LevelInfo) - eng := &testutils.MockEngine{} - l1F := &testutils.MockL1Source{} - - rng := rand.New(rand.NewSource(1234)) - - refA := testutils.RandomBlockRef(rng) - refA0 := eth.L2BlockRef{ - Hash: testutils.RandomHash(rng), - Number: 0, - ParentHash: common.Hash{}, - Time: refA.Time, - L1Origin: refA.ID(), - SequenceNumber: 0, - } - gasLimit := eth.Uint64Quantity(20_000_000) - cfg := &rollup.Config{ - Genesis: rollup.Genesis{ - L1: refA.ID(), - L2: refA0.ID(), - L2Time: refA0.Time, - SystemConfig: eth.SystemConfig{ - BatcherAddr: common.Address{42}, - Overhead: [32]byte{123}, - Scalar: [32]byte{42}, - GasLimit: 20_000_000, - }, - }, - BlockTime: 1, - SeqWindowSize: 2, - } - - refA1 := eth.L2BlockRef{ - Hash: testutils.RandomHash(rng), - Number: refA0.Number + 1, - ParentHash: refA0.Hash, - Time: refA0.Time + cfg.BlockTime, - L1Origin: refA.ID(), - SequenceNumber: 1, - } - refA2 := eth.L2BlockRef{ - Hash: testutils.RandomHash(rng), - Number: refA1.Number + 1, - ParentHash: refA1.Hash, - Time: refA1.Time + cfg.BlockTime, - L1Origin: refA.ID(), - SequenceNumber: 2, - } - payloadA1 := ð.ExecutionPayloadEnvelope{ExecutionPayload: ð.ExecutionPayload{ - ParentHash: refA1.ParentHash, - FeeRecipient: common.Address{}, - StateRoot: eth.Bytes32{}, - ReceiptsRoot: eth.Bytes32{}, - LogsBloom: eth.Bytes256{}, - PrevRandao: eth.Bytes32{}, - BlockNumber: eth.Uint64Quantity(refA1.Number), - GasLimit: gasLimit, - GasUsed: 0, - Timestamp: eth.Uint64Quantity(refA1.Time), - ExtraData: nil, - BaseFeePerGas: eth.Uint256Quantity(*uint256.NewInt(7)), - BlockHash: refA1.Hash, - Transactions: []eth.Data{}, - }} - - prev := &fakeAttributesQueue{origin: refA} - - ec := NewEngineController(eng, logger, metrics.NoopMetrics, &rollup.Config{}, sync.CLSync, nil) - eq := NewEngineQueue(logger, cfg, eng, ec, metrics.NoopMetrics, prev, l1F, &sync.Config{}, safedb.Disabled) - eq.ec.SetUnsafeHead(refA2) - eq.ec.SetSafeHead(refA0) - eq.ec.SetFinalizedHead(refA0) - - eq.AddUnsafePayload(payloadA1) - - // First Step calls FCU - preFc := ð.ForkchoiceState{ - HeadBlockHash: refA2.Hash, - SafeBlockHash: refA0.Hash, - FinalizedBlockHash: refA0.Hash, - } - eng.ExpectForkchoiceUpdate(preFc, nil, nil, nil) - require.NoError(t, eq.Step(context.Background())) - - // Second Step pops the unsafe payload - require.NoError(t, eq.Step(context.Background())) - - require.Nil(t, eq.unsafePayloads.Peek(), "should pop the unsafe payload because it is too old") - fmt.Println(eq.unsafePayloads.Peek()) - - l1F.AssertExpectations(t) - eng.AssertExpectations(t) -} - -func TestPlasmaFinalityData(t *testing.T) { - logger := testlog.Logger(t, log.LevelInfo) - eng := &testutils.MockEngine{} - l1F := &testutils.MockL1Source{} - - rng := rand.New(rand.NewSource(1234)) - - refA := testutils.RandomBlockRef(rng) - refA0 := eth.L2BlockRef{ - Hash: testutils.RandomHash(rng), - Number: 0, - ParentHash: common.Hash{}, - Time: refA.Time, - L1Origin: refA.ID(), - SequenceNumber: 0, - } - - prev := &fakeAttributesQueue{origin: refA} - - cfg := &rollup.Config{ - Genesis: rollup.Genesis{ - L1: refA.ID(), - L2: refA0.ID(), - L2Time: refA0.Time, - SystemConfig: eth.SystemConfig{ - BatcherAddr: common.Address{42}, - Overhead: [32]byte{123}, - Scalar: [32]byte{42}, - GasLimit: 20_000_000, - }, - }, - BlockTime: 1, - SeqWindowSize: 2, - } - plasmaCfg := &rollup.PlasmaConfig{ - DAChallengeWindow: 90, - DAResolveWindow: 90, - } - // shoud return l1 finality if plasma is not enabled - require.Equal(t, uint64(finalityLookback), calcFinalityLookback(cfg)) - - cfg.PlasmaConfig = plasmaCfg - expFinalityLookback := 181 - require.Equal(t, uint64(expFinalityLookback), calcFinalityLookback(cfg)) - - refA1 := eth.L2BlockRef{ - Hash: testutils.RandomHash(rng), - Number: refA0.Number + 1, - ParentHash: refA0.Hash, - Time: refA0.Time + cfg.BlockTime, - L1Origin: refA.ID(), - SequenceNumber: 1, - } - - ec := NewEngineController(eng, logger, metrics.NoopMetrics, &rollup.Config{}, sync.CLSync, nil) - - eq := NewEngineQueue(logger, cfg, eng, ec, metrics.NoopMetrics, prev, l1F, &sync.Config{}, safedb.Disabled) - require.Equal(t, expFinalityLookback, cap(eq.finalityData)) - - l1parent := refA - l2parent := refA1 - - ec.SetSafeHead(l2parent) - require.NoError(t, eq.postProcessSafeL2()) - - // advance over 200 l1 origins each time incrementing new l2 safe heads - // and post processing. - for i := uint64(0); i < 200; i++ { - require.NoError(t, eq.postProcessSafeL2()) - - l1parent = eth.L1BlockRef{ - Hash: testutils.RandomHash(rng), - Number: l1parent.Number + 1, - ParentHash: l1parent.Hash, - Time: l1parent.Time + 12, - } - eq.origin = l1parent - - for j := uint64(0); i < cfg.SeqWindowSize; i++ { - l2parent = eth.L2BlockRef{ - Hash: testutils.RandomHash(rng), - Number: l2parent.Number + 1, - ParentHash: l2parent.Hash, - Time: l2parent.Time + cfg.BlockTime, - L1Origin: l1parent.ID(), - SequenceNumber: j, - } - ec.SetSafeHead(l2parent) - require.NoError(t, eq.postProcessSafeL2()) - } - } - - // finality data does not go over challenge + resolve windows + 1 capacity - // (prunes down to 180 then adds the extra 1 each time) - require.Equal(t, expFinalityLookback, len(eq.finalityData)) -} diff --git a/op-node/rollup/derive/engine_update.go b/op-node/rollup/derive/engine_update.go deleted file mode 100644 index 02f38ea3badc..000000000000 --- a/op-node/rollup/derive/engine_update.go +++ /dev/null @@ -1,215 +0,0 @@ -package derive - -import ( - "context" - "errors" - "fmt" - - "github.com/ethereum/go-ethereum/core/types" - "github.com/ethereum/go-ethereum/log" - - "github.com/ethereum-optimism/optimism/op-node/rollup/async" - "github.com/ethereum-optimism/optimism/op-node/rollup/conductor" - "github.com/ethereum-optimism/optimism/op-service/eth" -) - -// isDepositTx checks an opaqueTx to determine if it is a Deposit Transaction -// It has to return an error in the case the transaction is empty -func isDepositTx(opaqueTx eth.Data) (bool, error) { - if len(opaqueTx) == 0 { - return false, errors.New("empty transaction") - } - return opaqueTx[0] == types.DepositTxType, nil -} - -// lastDeposit finds the index of last deposit at the start of the transactions. -// It walks the transactions from the start until it finds a non-deposit tx. -// An error is returned if any looked at transaction cannot be decoded -func lastDeposit(txns []eth.Data) (int, error) { - var lastDeposit int - for i, tx := range txns { - deposit, err := isDepositTx(tx) - if err != nil { - return 0, fmt.Errorf("invalid transaction at idx %d", i) - } - if deposit { - lastDeposit = i - } else { - break - } - } - return lastDeposit, nil -} - -func sanityCheckPayload(payload *eth.ExecutionPayload) error { - // Sanity check payload before inserting it - if len(payload.Transactions) == 0 { - return errors.New("no transactions in returned payload") - } - if payload.Transactions[0][0] != types.DepositTxType { - return fmt.Errorf("first transaction was not deposit tx. Got %v", payload.Transactions[0][0]) - } - // Ensure that the deposits are first - lastDeposit, err := lastDeposit(payload.Transactions) - if err != nil { - return fmt.Errorf("failed to find last deposit: %w", err) - } - // Ensure no deposits after last deposit - for i := lastDeposit + 1; i < len(payload.Transactions); i++ { - tx := payload.Transactions[i] - deposit, err := isDepositTx(tx) - if err != nil { - return fmt.Errorf("failed to decode transaction idx %d: %w", i, err) - } - if deposit { - return fmt.Errorf("deposit tx (%d) after other tx in l2 block with prev deposit at idx %d", i, lastDeposit) - } - } - return nil -} - -type BlockInsertionErrType uint - -const ( - // BlockInsertOK indicates that the payload was successfully executed and appended to the canonical chain. - BlockInsertOK BlockInsertionErrType = iota - // BlockInsertTemporaryErr indicates that the insertion failed but may succeed at a later time without changes to the payload. - BlockInsertTemporaryErr - // BlockInsertPrestateErr indicates that the pre-state to insert the payload could not be prepared, e.g. due to missing chain data. - BlockInsertPrestateErr - // BlockInsertPayloadErr indicates that the payload was invalid and cannot become canonical. - BlockInsertPayloadErr -) - -// startPayload starts an execution payload building process in the provided Engine, with the given attributes. -// The severity of the error is distinguished to determine whether the same payload attributes may be re-attempted later. -func startPayload(ctx context.Context, eng ExecEngine, fc eth.ForkchoiceState, attrs *eth.PayloadAttributes) (id eth.PayloadID, errType BlockInsertionErrType, err error) { - fcRes, err := eng.ForkchoiceUpdate(ctx, &fc, attrs) - if err != nil { - var inputErr eth.InputError - if errors.As(err, &inputErr) { - switch inputErr.Code { - case eth.InvalidForkchoiceState: - return eth.PayloadID{}, BlockInsertPrestateErr, fmt.Errorf("pre-block-creation forkchoice update was inconsistent with engine, need reset to resolve: %w", inputErr.Unwrap()) - case eth.InvalidPayloadAttributes: - return eth.PayloadID{}, BlockInsertPayloadErr, fmt.Errorf("payload attributes are not valid, cannot build block: %w", inputErr.Unwrap()) - default: - return eth.PayloadID{}, BlockInsertPrestateErr, fmt.Errorf("unexpected error code in forkchoice-updated response: %w", err) - } - } else { - return eth.PayloadID{}, BlockInsertTemporaryErr, fmt.Errorf("failed to create new block via forkchoice: %w", err) - } - } - - switch fcRes.PayloadStatus.Status { - // TODO(proto): snap sync - specify explicit different error type if node is syncing - case eth.ExecutionInvalid, eth.ExecutionInvalidBlockHash: - return eth.PayloadID{}, BlockInsertPayloadErr, eth.ForkchoiceUpdateErr(fcRes.PayloadStatus) - case eth.ExecutionValid: - id := fcRes.PayloadID - if id == nil { - return eth.PayloadID{}, BlockInsertTemporaryErr, errors.New("nil id in forkchoice result when expecting a valid ID") - } - return *id, BlockInsertOK, nil - default: - return eth.PayloadID{}, BlockInsertTemporaryErr, eth.ForkchoiceUpdateErr(fcRes.PayloadStatus) - } -} - -// confirmPayload ends an execution payload building process in the provided Engine, and persists the payload as the canonical head. -// If updateSafe is true, then the payload will also be recognized as safe-head at the same time. -// The severity of the error is distinguished to determine whether the payload was valid and can become canonical. -func confirmPayload( - ctx context.Context, - log log.Logger, - eng ExecEngine, - fc eth.ForkchoiceState, - payloadInfo eth.PayloadInfo, - updateSafe bool, - agossip async.AsyncGossiper, - sequencerConductor conductor.SequencerConductor, - dacClient DACClient, -) (out *eth.ExecutionPayloadEnvelope, errTyp BlockInsertionErrType, err error) { - var envelope *eth.ExecutionPayloadEnvelope - // if the payload is available from the async gossiper, it means it was not yet imported, so we reuse it - if cached := agossip.Get(); cached != nil { - envelope = cached - // log a limited amount of information about the reused payload, more detailed logging happens later down - log.Debug("found uninserted payload from async gossiper, reusing it and bypassing engine", - "hash", envelope.ExecutionPayload.BlockHash, - "number", uint64(envelope.ExecutionPayload.BlockNumber), - "parent", envelope.ExecutionPayload.ParentHash, - "txs", len(envelope.ExecutionPayload.Transactions)) - } else { - envelope, err = eng.GetPayload(ctx, payloadInfo) - } - if err != nil { - // even if it is an input-error (unknown payload ID), it is temporary, since we will re-attempt the full payload building, not just the retrieval of the payload. - return nil, BlockInsertTemporaryErr, fmt.Errorf("failed to get execution payload: %w", err) - } - payload := envelope.ExecutionPayload - if err := sanityCheckPayload(payload); err != nil { - return nil, BlockInsertPayloadErr, err - } - if envelope.BlobsBundle != nil && len(envelope.BlobsBundle.Blobs) > 0 { - // When updateSafe, it must be deriving instead of sequencing. Deriving is based on onchain-data which doesn't contain L2 blob. - if updateSafe { - return nil, BlockInsertPayloadErr, fmt.Errorf("got blobs when updateSafe") - } - if dacClient != nil { - err = dacClient.UploadBlobs(ctx, envelope) - if err != nil { - return nil, BlockInsertTemporaryErr, fmt.Errorf("UploadBlobs failed: %w", err) - } - } - } - if err := sequencerConductor.CommitUnsafePayload(ctx, envelope); err != nil { - return nil, BlockInsertTemporaryErr, fmt.Errorf("failed to commit unsafe payload to conductor: %w", err) - } - // begin gossiping as soon as possible - // agossip.Clear() will be called later if an non-temporary error is found, or if the payload is successfully inserted - agossip.Gossip(envelope) - - status, err := eng.NewPayload(ctx, payload, envelope.ParentBeaconBlockRoot) - if err != nil { - return nil, BlockInsertTemporaryErr, fmt.Errorf("failed to insert execution payload: %w", err) - } - if status.Status == eth.ExecutionInvalid || status.Status == eth.ExecutionInvalidBlockHash { - agossip.Clear() - return nil, BlockInsertPayloadErr, eth.NewPayloadErr(payload, status) - } - if status.Status != eth.ExecutionValid { - return nil, BlockInsertTemporaryErr, eth.NewPayloadErr(payload, status) - } - - fc.HeadBlockHash = payload.BlockHash - if updateSafe { - fc.SafeBlockHash = payload.BlockHash - } - fcRes, err := eng.ForkchoiceUpdate(ctx, &fc, nil) - if err != nil { - var inputErr eth.InputError - if errors.As(err, &inputErr) { - switch inputErr.Code { - case eth.InvalidForkchoiceState: - // if we succeed to update the forkchoice pre-payload, but fail post-payload, then it is a payload error - agossip.Clear() - return nil, BlockInsertPayloadErr, fmt.Errorf("post-block-creation forkchoice update was inconsistent with engine, need reset to resolve: %w", inputErr.Unwrap()) - default: - agossip.Clear() - return nil, BlockInsertPrestateErr, fmt.Errorf("unexpected error code in forkchoice-updated response: %w", err) - } - } else { - return nil, BlockInsertTemporaryErr, fmt.Errorf("failed to make the new L2 block canonical via forkchoice: %w", err) - } - } - agossip.Clear() - if fcRes.PayloadStatus.Status != eth.ExecutionValid { - return nil, BlockInsertPayloadErr, eth.ForkchoiceUpdateErr(fcRes.PayloadStatus) - } - log.Info("inserted block", "hash", payload.BlockHash, "number", uint64(payload.BlockNumber), - "state_root", payload.StateRoot, "timestamp", uint64(payload.Timestamp), "parent", payload.ParentHash, - "prev_randao", payload.PrevRandao, "fee_recipient", payload.FeeRecipient, - "txs", len(payload.Transactions), "update_safe", updateSafe) - return envelope, BlockInsertOK, nil -} diff --git a/op-node/rollup/derive/fuzz_parsers_test.go b/op-node/rollup/derive/fuzz_parsers_test.go index 4054eb7f2370..4f76c4ac7420 100644 --- a/op-node/rollup/derive/fuzz_parsers_test.go +++ b/op-node/rollup/derive/fuzz_parsers_test.go @@ -5,6 +5,7 @@ import ( "math/big" "testing" + "github.com/ethereum/go-ethereum/core/tracing" "github.com/google/go-cmp/cmp" "github.com/holiman/uint256" "github.com/stretchr/testify/require" @@ -82,15 +83,26 @@ func FuzzL1InfoEcotoneRoundTrip(f *testing.F) { } enc, err := in.marshalBinaryEcotone() if err != nil { - t.Fatalf("Failed to marshal binary: %v", err) + t.Fatalf("Failed to marshal Ecotone binary: %v", err) } var out L1BlockInfo err = out.unmarshalBinaryEcotone(enc) if err != nil { - t.Fatalf("Failed to unmarshal binary: %v", err) + t.Fatalf("Failed to unmarshal Ecotone binary: %v", err) } if !cmp.Equal(in, out, cmp.Comparer(testutils.BigEqual)) { - t.Fatalf("The data did not round trip correctly. in: %v. out: %v", in, out) + t.Fatalf("The Ecotone data did not round trip correctly. in: %v. out: %v", in, out) + } + enc, err = in.marshalBinaryIsthmus() + if err != nil { + t.Fatalf("Failed to marshal Isthmus binary: %v", err) + } + err = out.unmarshalBinaryIsthmus(enc) + if err != nil { + t.Fatalf("Failed to unmarshal Isthmus binary: %v", err) + } + if !cmp.Equal(in, out, cmp.Comparer(testutils.BigEqual)) { + t.Fatalf("The Isthmus data did not round trip correctly. in: %v. out: %v", in, out) } }) @@ -234,7 +246,7 @@ func FuzzUnmarshallLogEvent(f *testing.F) { // 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}))) + state.SetBalance(from, uint256.MustFromBig(BytesToBigInt([]byte{0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff})), tracing.BalanceChangeUnspecified) _, addr, _, err := runtime.Create(common.FromHex(bindings.OptimismPortalMetaData.Bin), &runtime.Config{ Origin: from, State: state, diff --git a/op-node/rollup/derive/l1_block_info.go b/op-node/rollup/derive/l1_block_info.go index 93c529750ef9..43ea9b29bedc 100644 --- a/op-node/rollup/derive/l1_block_info.go +++ b/op-node/rollup/derive/l1_block_info.go @@ -20,16 +20,28 @@ import ( const ( L1InfoFuncBedrockSignature = "setL1BlockValues(uint64,uint64,uint256,bytes32,uint64,bytes32,uint256,uint256)" L1InfoFuncEcotoneSignature = "setL1BlockValuesEcotone()" + L1InfoFuncIsthmusSignature = "setL1BlockValuesIsthmus()" + DepositsCompleteSignature = "depositsComplete()" L1InfoArguments = 8 L1InfoBedrockLen = 4 + 32*L1InfoArguments L1InfoEcotoneLen = 4 + 32*5 // after Ecotone upgrade, args are packed into 5 32-byte slots + DepositsCompleteLen = 4 // only the selector + // DepositsCompleteGas allocates 21k gas for intrinsic tx costs, and + // an additional 15k to ensure that the DepositsComplete call does not run out of gas. + // GasBenchMark_L1BlockIsthmus_DepositsComplete:test_depositsComplete_benchmark() (gas: 7768) + // GasBenchMark_L1BlockIsthmus_DepositsComplete_Warm:test_depositsComplete_benchmark() (gas: 5768) + // see `test_depositsComplete_benchmark` at: `/packages/contracts-bedrock/test/BenchmarkTest.t.sol` + DepositsCompleteGas = uint64(21_000 + 15_000) ) var ( L1InfoFuncBedrockBytes4 = crypto.Keccak256([]byte(L1InfoFuncBedrockSignature))[:4] L1InfoFuncEcotoneBytes4 = crypto.Keccak256([]byte(L1InfoFuncEcotoneSignature))[:4] + L1InfoFuncIsthmusBytes4 = crypto.Keccak256([]byte(L1InfoFuncIsthmusSignature))[:4] + DepositsCompleteBytes4 = crypto.Keccak256([]byte(DepositsCompleteSignature))[:4] L1InfoDepositerAddress = common.HexToAddress("0xdeaddeaddeaddeaddeaddeaddeaddeaddead0001") L1BlockAddress = predeploys.L1BlockAddr + ErrInvalidFormat = errors.New("invalid ecotone l1 block info format") ) const ( @@ -45,7 +57,7 @@ type L1BlockInfo struct { // Not strictly a piece of L1 information. Represents the number of L2 blocks since the start of the epoch, // i.e. when the actual L1 info was first introduced. SequenceNumber uint64 - // BatcherHash version 0 is just the address with 0 padding to the left. + // BatcherAddr version 0 is just the address with 0 padding to the left. BatcherAddr common.Address L1FeeOverhead eth.Bytes32 // ignored after Ecotone upgrade @@ -143,7 +155,7 @@ func (info *L1BlockInfo) unmarshalBinaryBedrock(data []byte) error { return nil } -// Ecotone Binary Format +// Isthmus & Ecotone Binary Format // +---------+--------------------------+ // | Bytes | Field | // +---------+--------------------------+ @@ -160,8 +172,24 @@ func (info *L1BlockInfo) unmarshalBinaryBedrock(data []byte) error { // +---------+--------------------------+ func (info *L1BlockInfo) marshalBinaryEcotone() ([]byte, error) { - w := bytes.NewBuffer(make([]byte, 0, L1InfoEcotoneLen)) - if err := solabi.WriteSignature(w, L1InfoFuncEcotoneBytes4); err != nil { + out, err := marshalBinaryWithSignature(info, L1InfoFuncEcotoneBytes4) + if err != nil { + return nil, fmt.Errorf("failed to marshal Ecotone l1 block info: %w", err) + } + return out, nil +} + +func (info *L1BlockInfo) marshalBinaryIsthmus() ([]byte, error) { + out, err := marshalBinaryWithSignature(info, L1InfoFuncIsthmusBytes4) + if err != nil { + return nil, fmt.Errorf("failed to marshal Isthmus l1 block info: %w", err) + } + return out, nil +} + +func marshalBinaryWithSignature(info *L1BlockInfo, signature []byte) ([]byte, error) { + w := bytes.NewBuffer(make([]byte, 0, L1InfoEcotoneLen)) // Ecotone and Isthmus have the same length + if err := solabi.WriteSignature(w, signature); err != nil { return nil, err } if err := binary.Write(w, binary.BigEndian, info.BaseFeeScalar); err != nil { @@ -200,29 +228,37 @@ func (info *L1BlockInfo) marshalBinaryEcotone() ([]byte, error) { } func (info *L1BlockInfo) unmarshalBinaryEcotone(data []byte) error { + return unmarshalBinaryWithSignatureAndData(info, L1InfoFuncEcotoneBytes4, data) +} + +func (info *L1BlockInfo) unmarshalBinaryIsthmus(data []byte) error { + return unmarshalBinaryWithSignatureAndData(info, L1InfoFuncIsthmusBytes4, data) +} + +func unmarshalBinaryWithSignatureAndData(info *L1BlockInfo, signature []byte, data []byte) error { if len(data) != L1InfoEcotoneLen { return fmt.Errorf("data is unexpected length: %d", len(data)) } r := bytes.NewReader(data) var err error - if _, err := solabi.ReadAndValidateSignature(r, L1InfoFuncEcotoneBytes4); err != nil { + if _, err := solabi.ReadAndValidateSignature(r, signature); err != nil { return err } if err := binary.Read(r, binary.BigEndian, &info.BaseFeeScalar); err != nil { - return fmt.Errorf("invalid ecotone l1 block info format") + return ErrInvalidFormat } if err := binary.Read(r, binary.BigEndian, &info.BlobBaseFeeScalar); err != nil { - return fmt.Errorf("invalid ecotone l1 block info format") + return ErrInvalidFormat } if err := binary.Read(r, binary.BigEndian, &info.SequenceNumber); err != nil { - return fmt.Errorf("invalid ecotone l1 block info format") + return ErrInvalidFormat } if err := binary.Read(r, binary.BigEndian, &info.Time); err != nil { - return fmt.Errorf("invalid ecotone l1 block info format") + return ErrInvalidFormat } if err := binary.Read(r, binary.BigEndian, &info.Number); err != nil { - return fmt.Errorf("invalid ecotone l1 block info format") + return ErrInvalidFormat } if info.BaseFee, err = solabi.ReadUint256(r); err != nil { return err @@ -244,14 +280,28 @@ func (info *L1BlockInfo) unmarshalBinaryEcotone(data []byte) error { } // isEcotoneButNotFirstBlock returns whether the specified block is subject to the Ecotone upgrade, -// but is not the actiation block itself. -func isEcotoneButNotFirstBlock(rollupCfg *rollup.Config, l2BlockTime uint64) bool { - return rollupCfg.IsEcotone(l2BlockTime) && !rollupCfg.IsEcotoneActivationBlock(l2BlockTime) +// but is not the activation block itself. +func isEcotoneButNotFirstBlock(rollupCfg *rollup.Config, l2Timestamp uint64) bool { + return rollupCfg.IsEcotone(l2Timestamp) && !rollupCfg.IsEcotoneActivationBlock(l2Timestamp) +} + +// isInteropButNotFirstBlock returns whether the specified block is subject to the Isthmus upgrade, +// but is not the activation block itself. +func isInteropButNotFirstBlock(rollupCfg *rollup.Config, l2Timestamp uint64) bool { + // Since we use the pre-interop L1 tx one last time during the upgrade block, + // we must disallow the deposit-txs from using the CrossL2Inbox during this block. + // If the CrossL2Inbox does not exist yet, then it is safe, + // but we have to ensure that the spec and code puts any Interop upgrade-txs after the user deposits. + return rollupCfg.IsInterop(l2Timestamp) && !rollupCfg.IsInteropActivationBlock(l2Timestamp) } // L1BlockInfoFromBytes is the inverse of L1InfoDeposit, to see where the L2 chain is derived from func L1BlockInfoFromBytes(rollupCfg *rollup.Config, l2BlockTime uint64, data []byte) (*L1BlockInfo, error) { var info L1BlockInfo + // Important, this should be ordered from most recent to oldest + if isInteropButNotFirstBlock(rollupCfg, l2BlockTime) { + return &info, info.unmarshalBinaryIsthmus(data) + } if isEcotoneButNotFirstBlock(rollupCfg, l2BlockTime) { return &info, info.unmarshalBinaryEcotone(data) } @@ -260,7 +310,7 @@ func L1BlockInfoFromBytes(rollupCfg *rollup.Config, l2BlockTime uint64, data []b // L1InfoDeposit creates a L1 Info deposit transaction based on the L1 block, // and the L2 block-height difference with the start of the epoch. -func L1InfoDeposit(rollupCfg *rollup.Config, sysCfg eth.SystemConfig, seqNumber uint64, block eth.BlockInfo, l2BlockTime uint64) (*types.DepositTx, error) { +func L1InfoDeposit(rollupCfg *rollup.Config, sysCfg eth.SystemConfig, seqNumber uint64, block eth.BlockInfo, l2Timestamp uint64) (*types.DepositTx, error) { l1BlockInfo := L1BlockInfo{ Number: block.NumberU64(), Time: block.Time(), @@ -270,7 +320,7 @@ func L1InfoDeposit(rollupCfg *rollup.Config, sysCfg eth.SystemConfig, seqNumber BatcherAddr: sysCfg.BatcherAddr, } var data []byte - if isEcotoneButNotFirstBlock(rollupCfg, l2BlockTime) { + if isEcotoneButNotFirstBlock(rollupCfg, l2Timestamp) { l1BlockInfo.BlobBaseFee = block.BlobBaseFee() if l1BlockInfo.BlobBaseFee == nil { // The L2 spec states to use the MIN_BLOB_GASPRICE from EIP-4844 if not yet active on L1. @@ -282,11 +332,19 @@ func L1InfoDeposit(rollupCfg *rollup.Config, sysCfg eth.SystemConfig, seqNumber } 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) + if isInteropButNotFirstBlock(rollupCfg, l2Timestamp) { + out, err := l1BlockInfo.marshalBinaryIsthmus() + if err != nil { + return nil, fmt.Errorf("failed to marshal Isthmus l1 block info: %w", err) + } + data = out + } else { + out, err := l1BlockInfo.marshalBinaryEcotone() + if err != nil { + return nil, fmt.Errorf("failed to marshal Ecotone l1 block info: %w", err) + } + data = out } - data = out } else { l1BlockInfo.L1FeeOverhead = sysCfg.Overhead l1BlockInfo.L1FeeScalar = sysCfg.Scalar @@ -314,7 +372,7 @@ func L1InfoDeposit(rollupCfg *rollup.Config, sysCfg eth.SystemConfig, seqNumber Data: data, } // With the regolith fork we disable the IsSystemTx functionality, and allocate real gas - if rollupCfg.IsRegolith(l2BlockTime) { + if rollupCfg.IsRegolith(l2Timestamp) { out.IsSystemTransaction = false out.Gas = RegolithSystemTxGas } @@ -322,8 +380,8 @@ func L1InfoDeposit(rollupCfg *rollup.Config, sysCfg eth.SystemConfig, seqNumber } // L1InfoDepositBytes returns a serialized L1-info attributes transaction. -func L1InfoDepositBytes(rollupCfg *rollup.Config, sysCfg eth.SystemConfig, seqNumber uint64, l1Info eth.BlockInfo, l2BlockTime uint64) ([]byte, error) { - dep, err := L1InfoDeposit(rollupCfg, sysCfg, seqNumber, l1Info, l2BlockTime) +func L1InfoDepositBytes(rollupCfg *rollup.Config, sysCfg eth.SystemConfig, seqNumber uint64, l1Info eth.BlockInfo, l2Timestamp uint64) ([]byte, error) { + dep, err := L1InfoDeposit(rollupCfg, sysCfg, seqNumber, l1Info, l2Timestamp) if err != nil { return nil, fmt.Errorf("failed to create L1 info tx: %w", err) } @@ -334,3 +392,34 @@ func L1InfoDepositBytes(rollupCfg *rollup.Config, sysCfg eth.SystemConfig, seqNu } return opaqueL1Tx, nil } + +func DepositsCompleteDeposit(seqNumber uint64, block eth.BlockInfo) (*types.DepositTx, error) { + source := AfterForceIncludeSource{ + L1BlockHash: block.Hash(), + SeqNumber: seqNumber, + } + out := &types.DepositTx{ + SourceHash: source.SourceHash(), + From: L1InfoDepositerAddress, + To: &L1BlockAddress, + Mint: nil, + Value: big.NewInt(0), + Gas: DepositsCompleteGas, + IsSystemTransaction: false, + Data: DepositsCompleteBytes4, + } + return out, nil +} + +func DepositsCompleteBytes(seqNumber uint64, l1Info eth.BlockInfo) ([]byte, error) { + dep, err := DepositsCompleteDeposit(seqNumber, l1Info) + if err != nil { + return nil, fmt.Errorf("failed to create DepositsComplete tx: %w", err) + } + depositsCompleteTx := types.NewTx(dep) + opaqueDepositsCompleteTx, err := depositsCompleteTx.MarshalBinary() + if err != nil { + return nil, fmt.Errorf("failed to encode DepositsComplete tx: %w", err) + } + return opaqueDepositsCompleteTx, nil +} diff --git a/op-node/rollup/derive/l1_block_info_test.go b/op-node/rollup/derive/l1_block_info_test.go index e5c9253ce1c6..b98e8a7d4c63 100644 --- a/op-node/rollup/derive/l1_block_info_test.go +++ b/op-node/rollup/derive/l1_block_info_test.go @@ -10,6 +10,7 @@ import ( "github.com/stretchr/testify/require" "github.com/ethereum/go-ethereum/common" + "github.com/ethereum/go-ethereum/core/types" "github.com/ethereum-optimism/optimism/op-node/rollup" "github.com/ethereum-optimism/optimism/op-service/eth" @@ -109,10 +110,8 @@ func TestParseL1InfoDepositTxData(t *testing.T) { t.Run("regolith", func(t *testing.T) { rng := rand.New(rand.NewSource(1234)) info := testutils.MakeBlockInfo(nil)(rng) - zero := uint64(0) - rollupCfg := rollup.Config{ - RegolithTime: &zero, - } + rollupCfg := rollup.Config{} + rollupCfg.ActivateAtGenesis(rollup.Regolith) depTx, err := L1InfoDeposit(&rollupCfg, randomL1Cfg(rng, info), randomSeqNr(rng), info, 0) require.NoError(t, err) require.False(t, depTx.IsSystemTransaction) @@ -121,27 +120,24 @@ func TestParseL1InfoDepositTxData(t *testing.T) { t.Run("ecotone", func(t *testing.T) { rng := rand.New(rand.NewSource(1234)) info := testutils.MakeBlockInfo(nil)(rng) - zero := uint64(0) - rollupCfg := rollup.Config{ - RegolithTime: &zero, - EcotoneTime: &zero, - } - depTx, err := L1InfoDeposit(&rollupCfg, randomL1Cfg(rng, info), randomSeqNr(rng), info, 1) + rollupCfg := rollup.Config{BlockTime: 2, Genesis: rollup.Genesis{L2Time: 1000}} + rollupCfg.ActivateAtGenesis(rollup.Ecotone) + // run 1 block after ecotone transition + timestamp := rollupCfg.Genesis.L2Time + rollupCfg.BlockTime + depTx, err := L1InfoDeposit(&rollupCfg, randomL1Cfg(rng, info), randomSeqNr(rng), info, timestamp) require.NoError(t, err) require.False(t, depTx.IsSystemTransaction) require.Equal(t, depTx.Gas, uint64(RegolithSystemTxGas)) require.Equal(t, L1InfoEcotoneLen, len(depTx.Data)) }) - t.Run("first-block ecotone", func(t *testing.T) { + t.Run("activation-block ecotone", func(t *testing.T) { rng := rand.New(rand.NewSource(1234)) info := testutils.MakeBlockInfo(nil)(rng) - zero := uint64(2) - rollupCfg := rollup.Config{ - RegolithTime: &zero, - EcotoneTime: &zero, - BlockTime: 2, - } - depTx, err := L1InfoDeposit(&rollupCfg, randomL1Cfg(rng, info), randomSeqNr(rng), info, 2) + rollupCfg := rollup.Config{BlockTime: 2, Genesis: rollup.Genesis{L2Time: 1000}} + rollupCfg.ActivateAtGenesis(rollup.Delta) + ecotoneTime := rollupCfg.Genesis.L2Time + rollupCfg.BlockTime // activate ecotone just after genesis + rollupCfg.EcotoneTime = &ecotoneTime + depTx, err := L1InfoDeposit(&rollupCfg, randomL1Cfg(rng, info), randomSeqNr(rng), info, ecotoneTime) require.NoError(t, err) require.False(t, depTx.IsSystemTransaction) require.Equal(t, depTx.Gas, uint64(RegolithSystemTxGas)) @@ -150,16 +146,88 @@ func TestParseL1InfoDepositTxData(t *testing.T) { t.Run("genesis-block ecotone", func(t *testing.T) { rng := rand.New(rand.NewSource(1234)) info := testutils.MakeBlockInfo(nil)(rng) - zero := uint64(0) - rollupCfg := rollup.Config{ - RegolithTime: &zero, - EcotoneTime: &zero, - BlockTime: 2, - } - depTx, err := L1InfoDeposit(&rollupCfg, randomL1Cfg(rng, info), randomSeqNr(rng), info, 0) + rollupCfg := rollup.Config{BlockTime: 2, Genesis: rollup.Genesis{L2Time: 1000}} + rollupCfg.ActivateAtGenesis(rollup.Ecotone) + depTx, err := L1InfoDeposit(&rollupCfg, randomL1Cfg(rng, info), randomSeqNr(rng), info, rollupCfg.Genesis.L2Time) + require.NoError(t, err) + require.False(t, depTx.IsSystemTransaction) + require.Equal(t, depTx.Gas, uint64(RegolithSystemTxGas)) + require.Equal(t, L1InfoEcotoneLen, len(depTx.Data)) + }) + t.Run("isthmus", func(t *testing.T) { + rng := rand.New(rand.NewSource(1234)) + info := testutils.MakeBlockInfo(nil)(rng) + rollupCfg := rollup.Config{BlockTime: 2, Genesis: rollup.Genesis{L2Time: 1000}} + rollupCfg.ActivateAtGenesis(rollup.Interop) + // run 1 block after interop transition + timestamp := rollupCfg.Genesis.L2Time + rollupCfg.BlockTime + depTx, err := L1InfoDeposit(&rollupCfg, randomL1Cfg(rng, info), randomSeqNr(rng), info, timestamp) + require.NoError(t, err) + require.False(t, depTx.IsSystemTransaction) + require.Equal(t, depTx.Gas, uint64(RegolithSystemTxGas)) + require.Equal(t, L1InfoEcotoneLen, len(depTx.Data), "the length is same in isthmus") + require.Equal(t, L1InfoFuncIsthmusBytes4, depTx.Data[:4], "upgrade is active, need isthmus signature") + }) + t.Run("activation-block isthmus", func(t *testing.T) { + rng := rand.New(rand.NewSource(1234)) + info := testutils.MakeBlockInfo(nil)(rng) + rollupCfg := rollup.Config{BlockTime: 2, Genesis: rollup.Genesis{L2Time: 1000}} + rollupCfg.ActivateAtGenesis(rollup.Fjord) + isthmusTime := rollupCfg.Genesis.L2Time + rollupCfg.BlockTime // activate isthmus just after genesis + rollupCfg.InteropTime = &isthmusTime + depTx, err := L1InfoDeposit(&rollupCfg, randomL1Cfg(rng, info), randomSeqNr(rng), info, isthmusTime) + require.NoError(t, err) + require.False(t, depTx.IsSystemTransaction) + require.Equal(t, depTx.Gas, uint64(RegolithSystemTxGas)) + // Isthmus activates, but ecotone L1 info is still used at this upgrade block + require.Equal(t, L1InfoEcotoneLen, len(depTx.Data)) + require.Equal(t, L1InfoFuncEcotoneBytes4, depTx.Data[:4]) + }) + t.Run("genesis-block isthmus", func(t *testing.T) { + rng := rand.New(rand.NewSource(1234)) + info := testutils.MakeBlockInfo(nil)(rng) + rollupCfg := rollup.Config{BlockTime: 2, Genesis: rollup.Genesis{L2Time: 1000}} + rollupCfg.ActivateAtGenesis(rollup.Interop) + depTx, err := L1InfoDeposit(&rollupCfg, randomL1Cfg(rng, info), randomSeqNr(rng), info, rollupCfg.Genesis.L2Time) require.NoError(t, err) require.False(t, depTx.IsSystemTransaction) require.Equal(t, depTx.Gas, uint64(RegolithSystemTxGas)) require.Equal(t, L1InfoEcotoneLen, len(depTx.Data)) }) } + +func TestDepositsCompleteBytes(t *testing.T) { + randomSeqNr := func(rng *rand.Rand) uint64 { + return rng.Uint64() + } + t.Run("valid return bytes", func(t *testing.T) { + rng := rand.New(rand.NewSource(1234)) + info := testutils.MakeBlockInfo(nil)(rng) + depTxByes, err := DepositsCompleteBytes(randomSeqNr(rng), info) + require.NoError(t, err) + var depTx types.Transaction + require.NoError(t, depTx.UnmarshalBinary(depTxByes)) + require.Equal(t, uint8(types.DepositTxType), depTx.Type()) + require.Equal(t, depTx.Data(), DepositsCompleteBytes4) + require.Equal(t, DepositsCompleteLen, len(depTx.Data())) + require.Equal(t, DepositsCompleteGas, depTx.Gas()) + require.False(t, depTx.IsSystemTx()) + require.Equal(t, depTx.Value(), big.NewInt(0)) + signer := types.LatestSignerForChainID(depTx.ChainId()) + sender, err := signer.Sender(&depTx) + require.NoError(t, err) + require.Equal(t, L1InfoDepositerAddress, sender) + }) + t.Run("valid return Transaction", func(t *testing.T) { + rng := rand.New(rand.NewSource(1234)) + info := testutils.MakeBlockInfo(nil)(rng) + depTx, err := DepositsCompleteDeposit(randomSeqNr(rng), info) + require.NoError(t, err) + require.Equal(t, depTx.Data, DepositsCompleteBytes4) + require.Equal(t, DepositsCompleteLen, len(depTx.Data)) + require.Equal(t, DepositsCompleteGas, depTx.Gas) + require.False(t, depTx.IsSystemTransaction) + require.Equal(t, depTx.Value, big.NewInt(0)) + require.Equal(t, L1InfoDepositerAddress, depTx.From) + }) +} diff --git a/op-node/rollup/derive/params.go b/op-node/rollup/derive/params.go index 918bbf210c15..385c4087930b 100644 --- a/op-node/rollup/derive/params.go +++ b/op-node/rollup/derive/params.go @@ -5,7 +5,7 @@ import ( "errors" "fmt" - plasma "github.com/ethereum-optimism/optimism/op-plasma" + altda "github.com/ethereum-optimism/optimism/op-alt-da" ) // count the tagging info as 200 in terms of buffer size. @@ -21,8 +21,8 @@ func frameSize(frame Frame) uint64 { const DerivationVersion0 = 0 -// DerivationVersion1 is reserved for batcher transactions containing plasma commitments. -const DerivationVersion1 = plasma.TxDataVersion1 +// DerivationVersion1 is reserved for batcher transactions containing altDA commitments. +const DerivationVersion1 = altda.TxDataVersion1 // MaxSpanBatchElementCount is the maximum number of blocks, transactions in total, // or transaction per block allowed in a span batch. diff --git a/op-node/rollup/derive/pipeline.go b/op-node/rollup/derive/pipeline.go index 80726fcaa4af..e4eae7e20303 100644 --- a/op-node/rollup/derive/pipeline.go +++ b/op-node/rollup/derive/pipeline.go @@ -6,22 +6,23 @@ import ( "fmt" "io" + "github.com/ethereum/go-ethereum/common" "github.com/ethereum/go-ethereum/log" "github.com/ethereum-optimism/optimism/op-node/rollup" - "github.com/ethereum-optimism/optimism/op-node/rollup/sync" "github.com/ethereum-optimism/optimism/op-service/eth" ) type Metrics interface { RecordL1Ref(name string, ref eth.L1BlockRef) RecordL2Ref(name string, ref eth.L2BlockRef) - RecordUnsafePayloadsBuffer(length uint64, memSize uint64, next eth.BlockID) RecordChannelInputBytes(inputCompressedBytes int) RecordHeadChannelOpened() RecordChannelTimedOut() RecordFrame() RecordDerivedBatches(batchType string) + SetDerivationIdle(idle bool) + RecordPipelineReset() } type L1Fetcher interface { @@ -37,23 +38,23 @@ type ResettableStage interface { Reset(ctx context.Context, base eth.L1BlockRef, baseCfg eth.SystemConfig) error } -type EngineQueueStage interface { - LowestQueuedUnsafeBlock() eth.L2BlockRef - FinalizedL1() eth.L1BlockRef - Origin() eth.L1BlockRef - SystemConfig() eth.SystemConfig - - Finalize(l1Origin eth.L1BlockRef) - AddUnsafePayload(payload *eth.ExecutionPayloadEnvelope) - Step(context.Context) error +type L2Source interface { + PayloadByHash(context.Context, common.Hash) (*eth.ExecutionPayloadEnvelope, error) + PayloadByNumber(context.Context, uint64) (*eth.ExecutionPayloadEnvelope, error) + L2BlockRefByLabel(ctx context.Context, label eth.BlockLabel) (eth.L2BlockRef, error) + L2BlockRefByHash(ctx context.Context, l2Hash common.Hash) (eth.L2BlockRef, error) + L2BlockRefByNumber(ctx context.Context, num uint64) (eth.L2BlockRef, error) + SystemConfigL2Fetcher } -// DerivationPipeline is updated with new L1 data, and the Step() function can be iterated on to keep the L2 Engine in sync. +// DerivationPipeline is updated with new L1 data, and the Step() function can be iterated on to generate attributes type DerivationPipeline struct { log log.Logger rollupCfg *rollup.Config l1Fetcher L1Fetcher - plasma PlasmaInputFetcher + altDA AltDAInputFetcher + + l2 L2Source // Index of the stage that is currently being reset. // >= len(stages) if no additional resetting is required @@ -62,18 +63,25 @@ type DerivationPipeline struct { // Special stages to keep track of traversal *L1Traversal - eng EngineQueueStage + + attrib *AttributesQueue + + // L1 block that the next returned attributes are derived from, i.e. at the L2-end of the pipeline. + origin eth.L1BlockRef + resetL2Safe eth.L2BlockRef + resetSysConfig eth.SystemConfig + engineIsReset bool metrics Metrics } -// NewDerivationPipeline creates a derivation pipeline, which should be reset before use. - -func NewDerivationPipeline(log log.Logger, rollupCfg *rollup.Config, l1Fetcher L1Fetcher, l1Blobs L1BlobsFetcher, plasma PlasmaInputFetcher, l2Source L2Source, engine LocalEngineControl, metrics Metrics, syncCfg *sync.Config, safeHeadListener SafeHeadListener) *DerivationPipeline { +// NewDerivationPipeline creates a DerivationPipeline, to turn L1 data into L2 block-inputs. +func NewDerivationPipeline(log log.Logger, rollupCfg *rollup.Config, l1Fetcher L1Fetcher, l1Blobs L1BlobsFetcher, + altDA AltDAInputFetcher, l2Source L2Source, metrics Metrics) *DerivationPipeline { // Pull stages l1Traversal := NewL1Traversal(log, rollupCfg, l1Fetcher) - dataSrc := NewDataSourceFactory(log, rollupCfg, l1Fetcher, l1Blobs, plasma) // auxiliary stage for L1Retrieval + dataSrc := NewDataSourceFactory(log, rollupCfg, l1Fetcher, l1Blobs, altDA) // auxiliary stage for L1Retrieval l1Src := NewL1Retrieval(log, dataSrc, l1Traversal) frameQueue := NewFrameQueue(log, l1Src) bank := NewChannelBank(log, rollupCfg, frameQueue, l1Fetcher, metrics) @@ -82,73 +90,42 @@ func NewDerivationPipeline(log log.Logger, rollupCfg *rollup.Config, l1Fetcher L attrBuilder := NewFetchingAttributesBuilder(rollupCfg, l1Fetcher, l2Source) attributesQueue := NewAttributesQueue(log, rollupCfg, attrBuilder, batchQueue) - // Step stages - eng := NewEngineQueue(log, rollupCfg, l2Source, engine, metrics, attributesQueue, l1Fetcher, syncCfg, safeHeadListener) - - // Plasma takes control of the engine finalization signal only when usePlasma is enabled. - plasma.OnFinalizedHeadSignal(func(ref eth.L1BlockRef) { - eng.Finalize(ref) - }) - - // Reset from engine queue then up from L1 Traversal. The stages do not talk to each other during - // the reset, but after the engine queue, this is the order in which the stages could talk to each other. - // Note: The engine queue stage is the only reset that can fail. - stages := []ResettableStage{eng, l1Traversal, l1Src, plasma, frameQueue, bank, chInReader, batchQueue, attributesQueue} + // Reset from ResetEngine then up from L1 Traversal. The stages do not talk to each other during + // the ResetEngine, but after the ResetEngine, this is the order in which the stages could talk to each other. + // Note: The ResetEngine is the only reset that can fail. + stages := []ResettableStage{l1Traversal, l1Src, altDA, frameQueue, bank, chInReader, batchQueue, attributesQueue} return &DerivationPipeline{ log: log, rollupCfg: rollupCfg, l1Fetcher: l1Fetcher, - plasma: plasma, + altDA: altDA, resetting: 0, stages: stages, - eng: eng, metrics: metrics, traversal: l1Traversal, + attrib: attributesQueue, + l2: l2Source, } } -// EngineReady returns true if the engine is ready to be used. +// DerivationReady returns true if the derivation pipeline is ready to be used. // When it's being reset its state is inconsistent, and should not be used externally. -func (dp *DerivationPipeline) EngineReady() bool { - return dp.resetting > 0 +func (dp *DerivationPipeline) DerivationReady() bool { + return dp.engineIsReset && dp.resetting > 0 } func (dp *DerivationPipeline) Reset() { dp.resetting = 0 + dp.resetSysConfig = eth.SystemConfig{} + dp.resetL2Safe = eth.L2BlockRef{} + dp.engineIsReset = false } // Origin is the L1 block of the inner-most stage of the derivation pipeline, // i.e. the L1 chain up to and including this point included and/or produced all the safe L2 blocks. func (dp *DerivationPipeline) Origin() eth.L1BlockRef { - return dp.eng.Origin() -} - -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.PlasmaEnabled() { - dp.plasma.Finalize(l1Origin) - } else { - dp.eng.Finalize(l1Origin) - } -} - -// FinalizedL1 is the L1 finalization of the inner-most stage of the derivation pipeline, -// i.e. the L1 chain up to and including this point included and/or produced all the finalized L2 blocks. -func (dp *DerivationPipeline) FinalizedL1() eth.L1BlockRef { - return dp.eng.FinalizedL1() -} - -// AddUnsafePayload schedules an execution payload to be processed, ahead of deriving it from L1 -func (dp *DerivationPipeline) AddUnsafePayload(payload *eth.ExecutionPayloadEnvelope) { - dp.eng.AddUnsafePayload(payload) -} - -// LowestQueuedUnsafeBlock returns the lowest queued unsafe block. If the gap is filled from the unsafe head -// to this block, the EngineQueue will be able to apply the queued payloads. -func (dp *DerivationPipeline) LowestQueuedUnsafeBlock() eth.L2BlockRef { - return dp.eng.LowestQueuedUnsafeBlock() + return dp.origin } // Step tries to progress the buffer. @@ -157,31 +134,110 @@ func (dp *DerivationPipeline) LowestQueuedUnsafeBlock() eth.L2BlockRef { // Any other error is critical and the derivation pipeline should be reset. // An error is expected when the underlying source closes. // When Step returns nil, it should be called again, to continue the derivation process. -func (dp *DerivationPipeline) Step(ctx context.Context) error { +func (dp *DerivationPipeline) Step(ctx context.Context, pendingSafeHead eth.L2BlockRef) (outAttrib *AttributesWithParent, outErr error) { defer dp.metrics.RecordL1Ref("l1_derived", dp.Origin()) + dp.metrics.SetDerivationIdle(false) + defer func() { + if outErr == io.EOF || errors.Is(outErr, EngineELSyncing) { + dp.metrics.SetDerivationIdle(true) + } + }() + // if any stages need to be reset, do that first. if dp.resetting < len(dp.stages) { - if err := dp.stages[dp.resetting].Reset(ctx, dp.eng.Origin(), dp.eng.SystemConfig()); err == io.EOF { - dp.log.Debug("reset of stage completed", "stage", dp.resetting, "origin", dp.eng.Origin()) + if !dp.engineIsReset { + return nil, NewResetError(errors.New("cannot continue derivation until Engine has been reset")) + } + + // After the Engine has been reset to ensure it is derived from the canonical L1 chain, + // we still need to internally rewind the L1 traversal further, + // so we can read all the L2 data necessary for constructing the next batches that come after the safe head. + if pendingSafeHead != dp.resetL2Safe { + if err := dp.initialReset(ctx, pendingSafeHead); err != nil { + return nil, fmt.Errorf("failed initial reset work: %w", err) + } + } + + if err := dp.stages[dp.resetting].Reset(ctx, dp.origin, dp.resetSysConfig); err == io.EOF { + dp.log.Debug("reset of stage completed", "stage", dp.resetting, "origin", dp.origin) dp.resetting += 1 - return nil + return nil, nil } else if err != nil { - return fmt.Errorf("stage %d failed resetting: %w", dp.resetting, err) + return nil, fmt.Errorf("stage %d failed resetting: %w", dp.resetting, err) } else { - return nil + return nil, nil + } + } + + prevOrigin := dp.origin + newOrigin := dp.attrib.Origin() + if prevOrigin != newOrigin { + // Check if the L2 unsafe head origin is consistent with the new origin + if err := VerifyNewL1Origin(ctx, prevOrigin, dp.l1Fetcher, newOrigin); err != nil { + return nil, fmt.Errorf("failed to verify L1 origin transition: %w", err) } + dp.origin = newOrigin } - // Now step the engine queue. It will pull earlier data as needed. - if err := dp.eng.Step(ctx); err == io.EOF { + if attrib, err := dp.attrib.NextAttributes(ctx, pendingSafeHead); err == nil { + return attrib, nil + } else if err == io.EOF { // If every stage has returned io.EOF, try to advance the L1 Origin - return dp.traversal.AdvanceL1Block(ctx) + return nil, dp.traversal.AdvanceL1Block(ctx) } else if errors.Is(err, EngineELSyncing) { - return err - } else if err != nil { - return fmt.Errorf("engine stage failed: %w", err) + return nil, err } else { - return nil + return nil, fmt.Errorf("derivation failed: %w", err) + } +} + +// initialReset does the initial reset work of finding the L1 point to rewind back to +func (dp *DerivationPipeline) initialReset(ctx context.Context, resetL2Safe eth.L2BlockRef) error { + dp.log.Info("Rewinding derivation-pipeline L1 traversal to handle reset") + + dp.metrics.RecordPipelineReset() + spec := rollup.NewChainSpec(dp.rollupCfg) + + // Walk back L2 chain to find the L1 origin that is old enough to start buffering channel data from. + pipelineL2 := resetL2Safe + l1Origin := resetL2Safe.L1Origin + + pipelineOrigin, err := dp.l1Fetcher.L1BlockRefByHash(ctx, l1Origin.Hash) + if err != nil { + return NewTemporaryError(fmt.Errorf("failed to fetch the new L1 progress: origin: %s; err: %w", pipelineL2.L1Origin, err)) + } + + for { + afterL2Genesis := pipelineL2.Number > dp.rollupCfg.Genesis.L2.Number + afterL1Genesis := pipelineL2.L1Origin.Number > dp.rollupCfg.Genesis.L1.Number + afterChannelTimeout := pipelineL2.L1Origin.Number+spec.ChannelTimeout(pipelineOrigin.Time) > l1Origin.Number + if afterL2Genesis && afterL1Genesis && afterChannelTimeout { + parent, err := dp.l2.L2BlockRefByHash(ctx, pipelineL2.ParentHash) + if err != nil { + return NewResetError(fmt.Errorf("failed to fetch L2 parent block %s", pipelineL2.ParentID())) + } + pipelineL2 = parent + pipelineOrigin, err = dp.l1Fetcher.L1BlockRefByHash(ctx, pipelineL2.L1Origin.Hash) + if err != nil { + return NewTemporaryError(fmt.Errorf("failed to fetch the new L1 progress: origin: %s; err: %w", pipelineL2.L1Origin, err)) + } + } else { + break + } } + + sysCfg, err := dp.l2.SystemConfigByL2Hash(ctx, pipelineL2.Hash) + if err != nil { + return NewTemporaryError(fmt.Errorf("failed to fetch L1 config of L2 block %s: %w", pipelineL2.ID(), err)) + } + + dp.origin = pipelineOrigin + dp.resetSysConfig = sysCfg + dp.resetL2Safe = resetL2Safe + return nil +} + +func (dp *DerivationPipeline) ConfirmEngineReset() { + dp.engineIsReset = true } diff --git a/op-node/rollup/derive/pipeline_test.go b/op-node/rollup/derive/pipeline_test.go index a7639dc6295b..409b228a93db 100644 --- a/op-node/rollup/derive/pipeline_test.go +++ b/op-node/rollup/derive/pipeline_test.go @@ -2,8 +2,6 @@ package derive import "github.com/ethereum-optimism/optimism/op-service/testutils" -var _ Engine = (*testutils.MockEngine)(nil) - var _ L1Fetcher = (*testutils.MockL1Source)(nil) var _ Metrics = (*testutils.TestDerivationMetrics)(nil) diff --git a/op-node/rollup/derive/plasma_data_source.go b/op-node/rollup/derive/plasma_data_source.go deleted file mode 100644 index 3ad075c5febc..000000000000 --- a/op-node/rollup/derive/plasma_data_source.go +++ /dev/null @@ -1,103 +0,0 @@ -package derive - -import ( - "context" - "errors" - "fmt" - - plasma "github.com/ethereum-optimism/optimism/op-plasma" - "github.com/ethereum-optimism/optimism/op-service/eth" - "github.com/ethereum/go-ethereum/log" -) - -// PlasmaDataSource is a data source that fetches inputs from a plasma DA provider given -// their onchain commitments. Same as CalldataSource it will keep attempting to fetch. -type PlasmaDataSource struct { - log log.Logger - src DataIter - fetcher PlasmaInputFetcher - l1 L1Fetcher - id eth.BlockID - // keep track of a pending commitment so we can keep trying to fetch the input. - comm plasma.CommitmentData -} - -func NewPlasmaDataSource(log log.Logger, src DataIter, l1 L1Fetcher, fetcher PlasmaInputFetcher, id eth.BlockID) *PlasmaDataSource { - return &PlasmaDataSource{ - log: log, - src: src, - fetcher: fetcher, - l1: l1, - id: id, - } -} - -func (s *PlasmaDataSource) Next(ctx context.Context) (eth.Data, error) { - // Process origin syncs the challenge contract events and updates the local challenge states - // before we can proceed to fetch the input data. This function can be called multiple times - // for the same origin and noop if the origin was already processed. It is also called if - // there is not commitment in the current origin. - if err := s.fetcher.AdvanceL1Origin(ctx, s.l1, s.id); err != nil { - if errors.Is(err, plasma.ErrReorgRequired) { - return nil, NewResetError(fmt.Errorf("new expired challenge")) - } - return nil, NewTemporaryError(fmt.Errorf("failed to advance plasma L1 origin: %w", err)) - } - - if s.comm == nil { - // the l1 source returns the input commitment for the batch. - data, err := s.src.Next(ctx) - if err != nil { - return nil, err - } - - if len(data) == 0 { - return nil, NotEnoughData - } - // If the tx data type is not plasma, we forward it downstream to let the next - // steps validate and potentially parse it as L1 DA inputs. - if data[0] != plasma.TxDataVersion1 { - return data, nil - } - - // validate batcher inbox data is a commitment. - // 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 nil, NotEnoughData - } - s.comm = comm - } - // use the commitment to fetch the input from the plasma DA provider. - data, err := s.fetcher.GetInput(ctx, s.l1, s.comm, s.id) - // GetInput may call for a reorg if the pipeline is stalled and the plasma DA manager - // continued syncing origins detached from the pipeline origin. - if errors.Is(err, plasma.ErrReorgRequired) { - // challenge for a new previously derived commitment expired. - return nil, NewResetError(err) - } else if errors.Is(err, plasma.ErrExpiredChallenge) { - // this commitment was challenged and the challenge expired. - s.log.Warn("challenge expired, skipping batch", "comm", s.comm) - s.comm = nil - // skip the input - return s.Next(ctx) - } else if errors.Is(err, plasma.ErrMissingPastWindow) { - return nil, NewCriticalError(fmt.Errorf("data for comm %x not available: %w", s.comm, err)) - } else if errors.Is(err, plasma.ErrPendingChallenge) { - // continue stepping without slowing down. - return nil, NotEnoughData - } else if err != nil { - // return temporary error so we can keep retrying. - 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 { - s.log.Warn("input data exceeds max size", "size", len(data), "max", plasma.MaxInputSize) - s.comm = nil - return s.Next(ctx) - } - // reset the commitment so we can fetch the next one from the source at the next iteration. - s.comm = nil - return data, nil -} diff --git a/op-node/rollup/derive/plasma_data_source_test.go b/op-node/rollup/derive/plasma_data_source_test.go deleted file mode 100644 index b71b59067a3e..000000000000 --- a/op-node/rollup/derive/plasma_data_source_test.go +++ /dev/null @@ -1,536 +0,0 @@ -package derive - -import ( - "context" - "io" - "math/big" - "math/rand" - "testing" - - "github.com/ethereum-optimism/optimism/op-node/rollup" - plasma "github.com/ethereum-optimism/optimism/op-plasma" - "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/common/hexutil" - "github.com/ethereum/go-ethereum/core/types" - "github.com/ethereum/go-ethereum/crypto" - "github.com/ethereum/go-ethereum/log" - "github.com/ethereum/go-ethereum/params" - "github.com/stretchr/testify/mock" - "github.com/stretchr/testify/require" -) - -type MockFinalitySignal struct { - mock.Mock -} - -func (m *MockFinalitySignal) OnFinalized(blockRef eth.L1BlockRef) { - m.MethodCalled("OnFinalized", blockRef) -} - -func (m *MockFinalitySignal) ExpectFinalized(blockRef eth.L1BlockRef) { - m.On("OnFinalized", blockRef).Once() -} - -// TestPlasmaDataSource verifies that commitments are correctly read from l1 and then -// forwarded to the Plasma DA to return the correct inputs in the iterator. -// First it generates some L1 refs containing a random number of commitments, challenges -// the first 4 commitments then generates enough blocks to expire the challenge. -// Then it simulates rederiving while verifying it does skip the expired input until the next -// challenge expires. -func TestPlasmaDataSource(t *testing.T) { - logger := testlog.Logger(t, log.LevelDebug) - ctx := context.Background() - - rng := rand.New(rand.NewSource(1234)) - - l1F := &testutils.MockL1Source{} - - storage := plasma.NewMockDAClient(logger) - - pcfg := plasma.Config{ - ChallengeWindow: 90, ResolveWindow: 90, - } - metrics := &plasma.NoopMetrics{} - - daState := plasma.NewState(logger, metrics) - - da := plasma.NewPlasmaDAWithState(logger, pcfg, storage, metrics, daState) - - finalitySignal := &MockFinalitySignal{} - da.OnFinalizedHeadSignal(finalitySignal.OnFinalized) - - // Create rollup genesis and config - l1Time := uint64(2) - refA := testutils.RandomBlockRef(rng) - refA.Number = 1 - l1Refs := []eth.L1BlockRef{refA} - refA0 := eth.L2BlockRef{ - Hash: testutils.RandomHash(rng), - Number: 0, - ParentHash: common.Hash{}, - Time: refA.Time, - L1Origin: refA.ID(), - SequenceNumber: 0, - } - batcherPriv := testutils.RandomKey() - batcherAddr := crypto.PubkeyToAddress(batcherPriv.PublicKey) - batcherInbox := common.Address{42} - cfg := &rollup.Config{ - Genesis: rollup.Genesis{ - L1: refA.ID(), - L2: refA0.ID(), - L2Time: refA0.Time, - }, - BlockTime: 1, - SeqWindowSize: 20, - BatchInboxAddress: batcherInbox, - PlasmaConfig: &rollup.PlasmaConfig{ - DAChallengeWindow: pcfg.ChallengeWindow, - DAResolveWindow: pcfg.ResolveWindow, - }, - } - // keep track of random input data to validate against - var inputs [][]byte - var comms []plasma.CommitmentData - - signer := cfg.L1Signer() - - factory := NewDataSourceFactory(logger, cfg, l1F, nil, da) - - nc := 0 - firstChallengeExpirationBlock := uint64(95) - - for i := uint64(0); i <= pcfg.ChallengeWindow+pcfg.ResolveWindow; i++ { - parent := l1Refs[len(l1Refs)-1] - // create a new mock l1 ref - ref := eth.L1BlockRef{ - Hash: testutils.RandomHash(rng), - Number: parent.Number + 1, - ParentHash: parent.Hash, - Time: parent.Time + l1Time, - } - l1Refs = append(l1Refs, ref) - logger.Info("new l1 block", "ref", ref) - // called for each l1 block to sync challenges - l1F.ExpectFetchReceipts(ref.Hash, nil, types.Receipts{}, nil) - - // pick a random number of commitments to include in the l1 block - c := rng.Intn(4) - var txs []*types.Transaction - - for j := 0; j < c; j++ { - // 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, kComm) - - tx, err := types.SignNewTx(batcherPriv, signer, &types.DynamicFeeTx{ - ChainID: signer.ChainID(), - Nonce: 0, - GasTipCap: big.NewInt(2 * params.GWei), - GasFeeCap: big.NewInt(30 * params.GWei), - Gas: 100_000, - To: &batcherInbox, - Value: big.NewInt(int64(0)), - Data: comm.TxData(), - }) - require.NoError(t, err) - - txs = append(txs, tx) - - } - logger.Info("included commitments", "count", c) - l1F.ExpectInfoAndTxsByHash(ref.Hash, testutils.RandomBlockInfo(rng), txs, nil) - // called once per derivation - l1F.ExpectInfoAndTxsByHash(ref.Hash, testutils.RandomBlockInfo(rng), txs, nil) - - if ref.Number == 2 { - l1F.ExpectL1BlockRefByNumber(ref.Number, ref, nil) - finalitySignal.ExpectFinalized(ref) - } - - // challenge the first 4 commitments as soon as we have collected them all - if len(comms) >= 4 && nc < 7 { - // skip a block between each challenge transaction - if nc%2 == 0 { - daState.SetActiveChallenge(comms[nc/2].Encode(), ref.Number, pcfg.ResolveWindow) - logger.Info("setting active challenge", "comm", comms[nc/2]) - } - nc++ - } - - // create a new data source for each block - src, err := factory.OpenData(ctx, ref, batcherAddr) - require.NoError(t, err) - - // first challenge expires - if i == firstChallengeExpirationBlock { - _, err := src.Next(ctx) - require.ErrorIs(t, err, ErrReset) - break - } - - for j := 0; j < c; j++ { - data, err := src.Next(ctx) - // check that each commitment is resolved - require.NoError(t, err) - require.Equal(t, hexutil.Bytes(inputs[len(inputs)-(c-j)]), data) - } - // returns EOF once done - _, err = src.Next(ctx) - require.ErrorIs(t, err, io.EOF) - } - - logger.Info("pipeline reset ..................................") - - // start at 1 since first input should be skipped - nc = 1 - secondChallengeExpirationBlock := 98 - - for i := 1; i <= len(l1Refs)+2; i++ { - - var ref eth.L1BlockRef - // first we run through all the existing l1 blocks - if i < len(l1Refs) { - ref = l1Refs[i] - logger.Info("re deriving block", "ref", ref, "i", i) - - if i == len(l1Refs)-1 { - l1F.ExpectFetchReceipts(ref.Hash, nil, types.Receipts{}, nil) - } - // once past the l1 head, continue generating new l1 refs - } else { - parent := l1Refs[len(l1Refs)-1] - // create a new mock l1 ref - ref = eth.L1BlockRef{ - Hash: testutils.RandomHash(rng), - Number: parent.Number + 1, - ParentHash: parent.Hash, - Time: parent.Time + l1Time, - } - l1Refs = append(l1Refs, ref) - logger.Info("new l1 block", "ref", ref) - // called for each l1 block to sync challenges - l1F.ExpectFetchReceipts(ref.Hash, nil, types.Receipts{}, nil) - - // pick a random number of commitments to include in the l1 block - c := rng.Intn(4) - var txs []*types.Transaction - - for j := 0; j < c; j++ { - // 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, kComm) - - tx, err := types.SignNewTx(batcherPriv, signer, &types.DynamicFeeTx{ - ChainID: signer.ChainID(), - Nonce: 0, - GasTipCap: big.NewInt(2 * params.GWei), - GasFeeCap: big.NewInt(30 * params.GWei), - Gas: 100_000, - To: &batcherInbox, - Value: big.NewInt(int64(0)), - Data: comm.TxData(), - }) - require.NoError(t, err) - - txs = append(txs, tx) - - } - logger.Info("included commitments", "count", c) - l1F.ExpectInfoAndTxsByHash(ref.Hash, testutils.RandomBlockInfo(rng), txs, nil) - } - - // create a new data source for each block - src, err := factory.OpenData(ctx, ref, batcherAddr) - require.NoError(t, err) - - // next challenge expires - if i == secondChallengeExpirationBlock { - _, err := src.Next(ctx) - require.ErrorIs(t, err, ErrReset) - break - } - - for data, err := src.Next(ctx); err != io.EOF; data, err = src.Next(ctx) { - logger.Info("yielding data") - // check that each commitment is resolved - require.NoError(t, err) - require.Equal(t, hexutil.Bytes(inputs[nc]), data) - - nc++ - } - - } - - // trigger l1 finalization signal - da.Finalize(l1Refs[len(l1Refs)-32]) - - finalitySignal.AssertExpectations(t) - l1F.AssertExpectations(t) -} - -// This tests makes sure the pipeline returns a temporary error if data is not found. -func TestPlasmaDataSourceStall(t *testing.T) { - logger := testlog.Logger(t, log.LevelDebug) - ctx := context.Background() - - rng := rand.New(rand.NewSource(1234)) - - l1F := &testutils.MockL1Source{} - - storage := plasma.NewMockDAClient(logger) - - pcfg := plasma.Config{ - ChallengeWindow: 90, ResolveWindow: 90, - } - - metrics := &plasma.NoopMetrics{} - - daState := plasma.NewState(logger, metrics) - - da := plasma.NewPlasmaDAWithState(logger, pcfg, storage, metrics, daState) - - finalitySignal := &MockFinalitySignal{} - da.OnFinalizedHeadSignal(finalitySignal.OnFinalized) - - // Create rollup genesis and config - l1Time := uint64(2) - refA := testutils.RandomBlockRef(rng) - refA.Number = 1 - l1Refs := []eth.L1BlockRef{refA} - refA0 := eth.L2BlockRef{ - Hash: testutils.RandomHash(rng), - Number: 0, - ParentHash: common.Hash{}, - Time: refA.Time, - L1Origin: refA.ID(), - SequenceNumber: 0, - } - batcherPriv := testutils.RandomKey() - batcherAddr := crypto.PubkeyToAddress(batcherPriv.PublicKey) - batcherInbox := common.Address{42} - cfg := &rollup.Config{ - Genesis: rollup.Genesis{ - L1: refA.ID(), - L2: refA0.ID(), - L2Time: refA0.Time, - }, - BlockTime: 1, - SeqWindowSize: 20, - BatchInboxAddress: batcherInbox, - PlasmaConfig: &rollup.PlasmaConfig{ - DAChallengeWindow: pcfg.ChallengeWindow, - DAResolveWindow: pcfg.ResolveWindow, - }, - } - - signer := cfg.L1Signer() - - factory := NewDataSourceFactory(logger, cfg, l1F, nil, da) - - parent := l1Refs[0] - // create a new mock l1 ref - ref := eth.L1BlockRef{ - Hash: testutils.RandomHash(rng), - Number: parent.Number + 1, - ParentHash: parent.Hash, - Time: parent.Time + l1Time, - } - l1F.ExpectFetchReceipts(ref.Hash, nil, types.Receipts{}, nil) - // mock input commitments in l1 transactions - input := testutils.RandomData(rng, 2000) - comm, _ := storage.SetInput(ctx, input) - - tx, err := types.SignNewTx(batcherPriv, signer, &types.DynamicFeeTx{ - ChainID: signer.ChainID(), - Nonce: 0, - GasTipCap: big.NewInt(2 * params.GWei), - GasFeeCap: big.NewInt(30 * params.GWei), - Gas: 100_000, - To: &batcherInbox, - Value: big.NewInt(int64(0)), - Data: comm.TxData(), - }) - require.NoError(t, err) - - txs := []*types.Transaction{tx} - - l1F.ExpectInfoAndTxsByHash(ref.Hash, testutils.RandomBlockInfo(rng), txs, nil) - - // delete the input from the DA provider so it returns not found - require.NoError(t, storage.DeleteData(comm.Encode())) - - // next block is fetched to look ahead challenges but is not yet available - l1F.ExpectL1BlockRefByNumber(ref.Number+1, eth.L1BlockRef{}, ethereum.NotFound) - - src, err := factory.OpenData(ctx, ref, batcherAddr) - require.NoError(t, err) - - // data is not found so we return a temporary error - _, err = src.Next(ctx) - require.ErrorIs(t, err, ErrTemporary) - - // next block is available with no challenge events - nextRef := eth.L1BlockRef{ - Number: ref.Number + 1, - Hash: testutils.RandomHash(rng), - } - l1F.ExpectL1BlockRefByNumber(nextRef.Number, nextRef, nil) - l1F.ExpectFetchReceipts(nextRef.Hash, nil, types.Receipts{}, nil) - - // not enough data - _, err = src.Next(ctx) - require.ErrorIs(t, err, NotEnoughData) - - // now challenge is resolved - daState.SetResolvedChallenge(comm.Encode(), input, ref.Number+2) - - // derivation can resume - data, err := src.Next(ctx) - require.NoError(t, err) - require.Equal(t, hexutil.Bytes(input), data) - - l1F.AssertExpectations(t) -} - -// TestPlasmaDataSourceInvalidData tests that the pipeline skips invalid data and continues -// this includes invalid commitments and oversized inputs. -func TestPlasmaDataSourceInvalidData(t *testing.T) { - logger := testlog.Logger(t, log.LevelDebug) - ctx := context.Background() - - rng := rand.New(rand.NewSource(1234)) - - l1F := &testutils.MockL1Source{} - - storage := plasma.NewMockDAClient(logger) - - pcfg := plasma.Config{ - ChallengeWindow: 90, ResolveWindow: 90, - } - - da := plasma.NewPlasmaDAWithStorage(logger, pcfg, storage, &plasma.NoopMetrics{}) - - // Create rollup genesis and config - l1Time := uint64(2) - refA := testutils.RandomBlockRef(rng) - refA.Number = 1 - l1Refs := []eth.L1BlockRef{refA} - refA0 := eth.L2BlockRef{ - Hash: testutils.RandomHash(rng), - Number: 0, - ParentHash: common.Hash{}, - Time: refA.Time, - L1Origin: refA.ID(), - SequenceNumber: 0, - } - batcherPriv := testutils.RandomKey() - batcherAddr := crypto.PubkeyToAddress(batcherPriv.PublicKey) - batcherInbox := common.Address{42} - cfg := &rollup.Config{ - Genesis: rollup.Genesis{ - L1: refA.ID(), - L2: refA0.ID(), - L2Time: refA0.Time, - }, - BlockTime: 1, - SeqWindowSize: 20, - BatchInboxAddress: batcherInbox, - PlasmaConfig: &rollup.PlasmaConfig{ - DAChallengeWindow: pcfg.ChallengeWindow, - DAResolveWindow: pcfg.ResolveWindow, - }, - } - - signer := cfg.L1Signer() - - factory := NewDataSourceFactory(logger, cfg, l1F, nil, da) - - parent := l1Refs[0] - // create a new mock l1 ref - ref := eth.L1BlockRef{ - Hash: testutils.RandomHash(rng), - Number: parent.Number + 1, - ParentHash: parent.Hash, - Time: parent.Time + l1Time, - } - l1F.ExpectFetchReceipts(ref.Hash, nil, types.Receipts{}, nil) - // mock input commitments in l1 transactions with an oversized input - input := testutils.RandomData(rng, plasma.MaxInputSize+1) - comm, _ := storage.SetInput(ctx, input) - - tx1, err := types.SignNewTx(batcherPriv, signer, &types.DynamicFeeTx{ - ChainID: signer.ChainID(), - Nonce: 0, - GasTipCap: big.NewInt(2 * params.GWei), - GasFeeCap: big.NewInt(30 * params.GWei), - Gas: 100_000, - To: &batcherInbox, - Value: big.NewInt(int64(0)), - Data: comm.TxData(), - }) - require.NoError(t, err) - - // valid data - input2 := testutils.RandomData(rng, 2000) - comm2, _ := storage.SetInput(ctx, input2) - tx2, err := types.SignNewTx(batcherPriv, signer, &types.DynamicFeeTx{ - ChainID: signer.ChainID(), - Nonce: 0, - GasTipCap: big.NewInt(2 * params.GWei), - GasFeeCap: big.NewInt(30 * params.GWei), - Gas: 100_000, - To: &batcherInbox, - Value: big.NewInt(int64(0)), - Data: comm2.TxData(), - }) - require.NoError(t, err) - - // regular input instead of commitment - input3 := testutils.RandomData(rng, 32) - tx3, err := types.SignNewTx(batcherPriv, signer, &types.DynamicFeeTx{ - ChainID: signer.ChainID(), - Nonce: 0, - GasTipCap: big.NewInt(2 * params.GWei), - GasFeeCap: big.NewInt(30 * params.GWei), - Gas: 100_000, - To: &batcherInbox, - Value: big.NewInt(int64(0)), - Data: input3, - }) - require.NoError(t, err) - - txs := []*types.Transaction{tx1, tx2, tx3} - - l1F.ExpectInfoAndTxsByHash(ref.Hash, testutils.RandomBlockInfo(rng), txs, nil) - - src, err := factory.OpenData(ctx, ref, batcherAddr) - require.NoError(t, err) - - // oversized input is skipped and returns input2 directly - data, err := src.Next(ctx) - require.NoError(t, err) - require.Equal(t, hexutil.Bytes(input2), data) - - // regular input is passed through - data, err = src.Next(ctx) - require.NoError(t, err) - require.Equal(t, hexutil.Bytes(input3), data) - - _, err = src.Next(ctx) - require.ErrorIs(t, err, io.EOF) - - l1F.AssertExpectations(t) -} diff --git a/op-node/rollup/derive/singular_batch.go b/op-node/rollup/derive/singular_batch.go index fdb867efbe72..9993c351bf23 100644 --- a/op-node/rollup/derive/singular_batch.go +++ b/op-node/rollup/derive/singular_batch.go @@ -23,7 +23,7 @@ type SingularBatch struct { ParentHash common.Hash // parent L2 block hash EpochNum rollup.Epoch // aka l1 num EpochHash common.Hash // l1 block hash - Timestamp uint64 + Timestamp uint64 // l2 block timestamp Transactions []hexutil.Bytes } diff --git a/op-node/rollup/derive/span_batch.go b/op-node/rollup/derive/span_batch.go index aa95b3838a7b..664b2e269252 100644 --- a/op-node/rollup/derive/span_batch.go +++ b/op-node/rollup/derive/span_batch.go @@ -451,6 +451,14 @@ func (b *SpanBatch) GetTimestamp() uint64 { return b.Batches[0].Timestamp } +// TxCount returns the tx count for the batch +func (b *SpanBatch) TxCount() (count uint64) { + for _, txCount := range b.blockTxCounts { + count += txCount + } + return +} + // LogContext creates a new log context that contains information of the batch func (b *SpanBatch) LogContext(log log.Logger) log.Logger { if len(b.Batches) == 0 { @@ -464,6 +472,7 @@ func (b *SpanBatch) LogContext(log log.Logger) log.Logger { "start_epoch_number", b.GetStartEpochNum(), "end_epoch_number", b.GetBlockEpochNum(len(b.Batches)-1), "block_count", len(b.Batches), + "txs", b.TxCount(), ) } diff --git a/op-node/rollup/derive/span_batch_tx.go b/op-node/rollup/derive/span_batch_tx.go index 872c7190c72e..1e971ef55aa0 100644 --- a/op-node/rollup/derive/span_batch_tx.go +++ b/op-node/rollup/derive/span_batch_tx.go @@ -229,7 +229,7 @@ func (tx *spanBatchTx) convertToFullTx(nonce, gas uint64, to *common.Address, ch } // newSpanBatchTx converts types.Transaction to spanBatchTx -func newSpanBatchTx(tx types.Transaction) (*spanBatchTx, error) { +func newSpanBatchTx(tx *types.Transaction) (*spanBatchTx, error) { var inner spanBatchTxData switch tx.Type() { case types.LegacyTxType: diff --git a/op-node/rollup/derive/span_batch_tx_test.go b/op-node/rollup/derive/span_batch_tx_test.go index c846f65812b9..55a9101da5e7 100644 --- a/op-node/rollup/derive/span_batch_tx_test.go +++ b/op-node/rollup/derive/span_batch_tx_test.go @@ -39,7 +39,7 @@ func TestSpanBatchTxConvert(t *testing.T) { tx := testCase.mkTx(rng, signer) v, r, s := tx.RawSignatureValues() - sbtx, err := newSpanBatchTx(*tx) + sbtx, err := newSpanBatchTx(tx) require.NoError(t, err) tx2, err := sbtx.convertToFullTx(tx.Nonce(), tx.Gas(), tx.To(), chainID, v, r, s) @@ -77,7 +77,7 @@ func TestSpanBatchTxRoundTrip(t *testing.T) { for txIdx := 0; txIdx < testCase.trials; txIdx++ { tx := testCase.mkTx(rng, signer) - sbtx, err := newSpanBatchTx(*tx) + sbtx, err := newSpanBatchTx(tx) require.NoError(t, err) sbtxEncoded, err := sbtx.MarshalBinary() @@ -100,7 +100,7 @@ func (txData *spanBatchDummyTxData) txType() byte { return types.DepositTxType } func TestSpanBatchTxInvalidTxType(t *testing.T) { // span batch never contain deposit tx depositTx := types.NewTx(&types.DepositTx{}) - _, err := newSpanBatchTx(*depositTx) + _, err := newSpanBatchTx(depositTx) require.ErrorContains(t, err, "invalid tx type") var sbtx spanBatchTx diff --git a/op-node/rollup/derive/span_batch_txs.go b/op-node/rollup/derive/span_batch_txs.go index 59157ede44d8..6f7b59779cd8 100644 --- a/op-node/rollup/derive/span_batch_txs.go +++ b/op-node/rollup/derive/span_batch_txs.go @@ -428,7 +428,7 @@ func (sbtx *spanBatchTxs) AddTxs(txs [][]byte, chainID *big.Int) error { totalBlockTxCount := uint64(len(txs)) offset := sbtx.totalBlockTxCount for idx := 0; idx < int(totalBlockTxCount); idx++ { - var tx types.Transaction + tx := &types.Transaction{} if err := tx.UnmarshalBinary(txs[idx]); err != nil { return errors.New("failed to decode tx") } diff --git a/op-node/rollup/derive/span_channel_out.go b/op-node/rollup/derive/span_channel_out.go index 8e02b553781a..9950fe29c413 100644 --- a/op-node/rollup/derive/span_channel_out.go +++ b/op-node/rollup/derive/span_channel_out.go @@ -2,11 +2,9 @@ package derive import ( "bytes" - "crypto/rand" "fmt" "io" - "math/big" "github.com/ethereum/go-ethereum/core/types" "github.com/ethereum/go-ethereum/rlp" @@ -36,6 +34,17 @@ type SpanChannelOut struct { full error // spanBatch is the batch being built, which immutably holds genesis timestamp and chain ID, but otherwise can be reset spanBatch *SpanBatch + + // maxBlocksPerSpanBatch is an optional limit on the number of blocks per span batch. + // If non-zero, a new span batch will be started after the current span batch has + // reached this maximum. + maxBlocksPerSpanBatch int + + // sealedRLPBytes stores the sealed number of input RLP bytes. This is used when maxBlocksPerSpanBatch is non-zero + // to seal full span batches (that have reached the max block count) in the rlp slices. + sealedRLPBytes int + + chainSpec *rollup.ChainSpec } func (co *SpanChannelOut) ID() ChannelID { @@ -47,13 +56,22 @@ func (co *SpanChannelOut) setRandomID() error { return err } -func NewSpanChannelOut(genesisTimestamp uint64, chainID *big.Int, targetOutputSize uint64, compressionAlgo CompressionAlgo) (*SpanChannelOut, error) { +type SpanChannelOutOption func(co *SpanChannelOut) + +func WithMaxBlocksPerSpanBatch(maxBlock int) SpanChannelOutOption { + return func(co *SpanChannelOut) { + co.maxBlocksPerSpanBatch = maxBlock + } +} + +func NewSpanChannelOut(targetOutputSize uint64, compressionAlgo CompressionAlgo, chainSpec *rollup.ChainSpec, opts ...SpanChannelOutOption) (*SpanChannelOut, error) { c := &SpanChannelOut{ id: ChannelID{}, frame: 0, - spanBatch: NewSpanBatch(genesisTimestamp, chainID), + spanBatch: NewSpanBatch(chainSpec.L2GenesisTime(), chainSpec.L2ChainID()), rlp: [2]*bytes.Buffer{{}, {}}, target: targetOutputSize, + chainSpec: chainSpec, } var err error if err = c.setRandomID(); err != nil { @@ -64,6 +82,10 @@ func NewSpanChannelOut(genesisTimestamp uint64, chainID *big.Int, targetOutputSi return nil, err } + for _, opt := range opts { + opt(c) + } + return c, nil } @@ -71,15 +93,20 @@ func (co *SpanChannelOut) Reset() error { co.closed = false co.full = nil co.frame = 0 + co.sealedRLPBytes = 0 co.rlp[0].Reset() co.rlp[1].Reset() co.lastCompressedRLPSize = 0 co.compressor.Reset() - co.spanBatch = NewSpanBatch(co.spanBatch.GenesisTimestamp, co.spanBatch.ChainID) + co.resetSpanBatch() // setting the new randomID is the only part of the reset that can fail return co.setRandomID() } +func (co *SpanChannelOut) resetSpanBatch() { + co.spanBatch = NewSpanBatch(co.spanBatch.GenesisTimestamp, co.spanBatch.ChainID) +} + // activeRLP returns the active RLP buffer using the current rlpIndex func (co *SpanChannelOut) activeRLP() *bytes.Buffer { return co.rlp[co.rlpIndex] @@ -124,6 +151,7 @@ func (co *SpanChannelOut) AddSingularBatch(batch *SingularBatch, seqNum uint64) return err } + co.ensureOpenSpanBatch() // 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) @@ -134,23 +162,29 @@ func (co *SpanChannelOut) AddSingularBatch(batch *SingularBatch, seqNum uint64) return fmt.Errorf("failed to convert SpanBatch into RawSpanBatch: %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) + // switch to the other buffer and truncate it for new use + // (the RLP buffer which is being made inactive holds the RLP encoded span batch(es) + // just before the new batch was added) co.swapRLP() - co.activeRLP().Reset() - if err = rlp.Encode(co.activeRLP(), NewBatchData(rawSpanBatch)); err != nil { + active := co.activeRLP() + active.Truncate(co.sealedRLPBytes) + if err = rlp.Encode(active, NewBatchData(rawSpanBatch)); err != nil { return fmt.Errorf("failed to encode RawSpanBatch into bytes: %w", err) } - // check the RLP length against the max - if co.activeRLP().Len() > rollup.SafeMaxRLPBytesPerChannel { + // Fjord increases the max RLP bytes per channel. Activation of this change in the derivation pipeline + // is dependent on the timestamp of the L1 block that this channel got included in. So using the timestamp + // of the current batch guarantees that this channel will be included in an L1 block with a timestamp well after + // the Fjord activation. + maxRLPBytesPerChannel := co.chainSpec.MaxRLPBytesPerChannel(batch.Timestamp) + if active.Len() > int(maxRLPBytesPerChannel) { 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) + active.Len(), co.inactiveRLP().Len(), maxRLPBytesPerChannel, ErrTooManyRLPBytes) } // 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 + rlpGrowth := active.Len() - co.lastCompressedRLPSize if uint64(co.compressor.Len()+rlpGrowth) < co.target { return nil } @@ -159,20 +193,24 @@ func (co *SpanChannelOut) AddSingularBatch(batch *SingularBatch, seqNum uint64) 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 { + // if it's the first singular batch/block of the channel, it *must* fit in + if co.sealedRLPBytes == 0 && co.spanBatch.GetBlockCount() == 1 { + return nil + } + + // if we just perfectly filled up the channel, also return nil to retain block + if uint64(co.compressor.Len()) == co.target { 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 cerr := co.compress(); cerr != nil { + return cerr } // return the full error return err @@ -181,13 +219,36 @@ func (co *SpanChannelOut) AddSingularBatch(batch *SingularBatch, seqNum uint64) return nil } +func (co *SpanChannelOut) ensureOpenSpanBatch() { + if co.maxBlocksPerSpanBatch == 0 || co.spanBatch.GetBlockCount() < co.maxBlocksPerSpanBatch { + return + } + // we assume that the full span batch has been written to the last active rlp buffer + active, inactive := co.activeRLP(), co.inactiveRLP() + if inactive.Len() > active.Len() { + panic("inactive rlp unexpectedly larger") + } + co.sealedRLPBytes = active.Len() + // Copy active to inactive rlp buffer so both have the same sealed state + // and resetting by truncation works as intended. + inactive.Reset() + // err is guaranteed to always be nil + _, _ = inactive.Write(active.Bytes()) + co.resetSpanBatch() +} + // 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 { + // we write Bytes() of the active RLP to the compressor, so the active RLP's + // buffer is not advanced as a ReadWriter, making it possible to later use + // Truncate(). + rlpBytes := co.activeRLP().Bytes() + if _, err := co.compressor.Write(rlpBytes); err != nil { return err } + co.lastCompressedRLPSize = len(rlpBytes) if err := co.compressor.Close(); err != nil { return err } diff --git a/op-node/rollup/derive/test/random.go b/op-node/rollup/derive/test/random.go index 57ad0d8d9579..ba9600da8c82 100644 --- a/op-node/rollup/derive/test/random.go +++ b/op-node/rollup/derive/test/random.go @@ -16,7 +16,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, t time.Time) (*types.Block, []*types.Receipt) { - l1Block := types.NewBlock(testutils.RandomHeader(rng), nil, nil, nil, trie.NewStackTrie(nil)) + body := types.Body{} + l1Block := types.NewBlock(testutils.RandomHeader(rng), &body, nil, trie.NewStackTrie(nil)) rollupCfg := rollup.Config{} if testutils.RandomBool(rng) { t := uint64(0) @@ -45,5 +46,5 @@ func RandomL2BlockWithChainIdAndTime(rng *rand.Rand, txCount int, chainId *big.I for i := 0; i < txCount; i++ { txs = append(txs, testutils.RandomTx(rng, big.NewInt(int64(rng.Uint32())), signer)) } - return block.WithBody(txs, nil) + return block.WithBody(types.Body{Transactions: txs}) } diff --git a/op-node/rollup/driver/conf_depth_test.go b/op-node/rollup/driver/conf_depth_test.go deleted file mode 100644 index 1155cdd52f90..000000000000 --- a/op-node/rollup/driver/conf_depth_test.go +++ /dev/null @@ -1,68 +0,0 @@ -package driver - -import ( - "context" - "testing" - - "github.com/stretchr/testify/require" - - "github.com/ethereum/go-ethereum" - "github.com/ethereum/go-ethereum/common" - - "github.com/ethereum-optimism/optimism/op-service/eth" - "github.com/ethereum-optimism/optimism/op-service/testutils" -) - -var exHash = common.Hash{0xff} - -type confTest struct { - name string - head uint64 - hash common.Hash // hash of head block - req uint64 - depth uint64 - pass bool -} - -func (ct *confTest) Run(t *testing.T) { - l1Fetcher := &testutils.MockL1Source{} - l1Head := eth.L1BlockRef{Number: ct.head, Hash: ct.hash} - l1HeadGetter := func() eth.L1BlockRef { return l1Head } - - cd := NewConfDepth(ct.depth, l1HeadGetter, l1Fetcher) - if ct.pass { - // no calls to the l1Fetcher are made if the confirmation depth of the request is not met - l1Fetcher.ExpectL1BlockRefByNumber(ct.req, eth.L1BlockRef{Number: ct.req}, nil) - } - out, err := cd.L1BlockRefByNumber(context.Background(), ct.req) - l1Fetcher.AssertExpectations(t) - if ct.pass { - require.NoError(t, err) - require.Equal(t, out, eth.L1BlockRef{Number: ct.req}) - } else { - require.Equal(t, ethereum.NotFound, err) - } -} - -func TestConfDepth(t *testing.T) { - // note: we're not testing overflows. - // If a request is large enough to overflow the conf depth check, it's not returning anything anyway. - testCases := []confTest{ - {name: "zero conf future", head: 4, hash: exHash, req: 5, depth: 0, pass: true}, - {name: "zero conf present", head: 4, hash: exHash, req: 4, depth: 0, pass: true}, - {name: "zero conf past", head: 4, hash: exHash, req: 4, depth: 0, pass: true}, - {name: "one conf future", head: 4, hash: exHash, req: 5, depth: 1, pass: false}, - {name: "one conf present", head: 4, hash: exHash, req: 4, depth: 1, pass: false}, - {name: "one conf past", head: 4, hash: exHash, req: 3, depth: 1, pass: true}, - {name: "two conf future", head: 4, hash: exHash, req: 5, depth: 2, pass: false}, - {name: "two conf present", head: 4, hash: exHash, req: 4, depth: 2, pass: false}, - {name: "two conf not like 1", head: 4, hash: exHash, req: 3, depth: 2, pass: false}, - {name: "two conf pass", head: 4, hash: exHash, req: 2, depth: 2, pass: true}, - {name: "easy pass", head: 100, hash: exHash, req: 20, depth: 5, pass: true}, - {name: "genesis case", head: 0, hash: exHash, req: 0, depth: 4, pass: true}, - {name: "no L1 state", req: 10, depth: 4, pass: true}, - } - for _, tc := range testCases { - t.Run(tc.name, tc.Run) - } -} diff --git a/op-node/rollup/driver/driver.go b/op-node/rollup/driver/driver.go index 89db489c28de..f27c2c57f3e6 100644 --- a/op-node/rollup/driver/driver.go +++ b/op-node/rollup/driver/driver.go @@ -2,19 +2,34 @@ package driver import ( "context" - "time" "github.com/ethereum/go-ethereum/common" "github.com/ethereum/go-ethereum/log" + altda "github.com/ethereum-optimism/optimism/op-alt-da" "github.com/ethereum-optimism/optimism/op-node/rollup" "github.com/ethereum-optimism/optimism/op-node/rollup/async" + "github.com/ethereum-optimism/optimism/op-node/rollup/attributes" + "github.com/ethereum-optimism/optimism/op-node/rollup/clsync" "github.com/ethereum-optimism/optimism/op-node/rollup/conductor" + "github.com/ethereum-optimism/optimism/op-node/rollup/confdepth" "github.com/ethereum-optimism/optimism/op-node/rollup/derive" + "github.com/ethereum-optimism/optimism/op-node/rollup/engine" + "github.com/ethereum-optimism/optimism/op-node/rollup/event" + "github.com/ethereum-optimism/optimism/op-node/rollup/finality" + "github.com/ethereum-optimism/optimism/op-node/rollup/interop" + "github.com/ethereum-optimism/optimism/op-node/rollup/sequencing" + "github.com/ethereum-optimism/optimism/op-node/rollup/status" "github.com/ethereum-optimism/optimism/op-node/rollup/sync" "github.com/ethereum-optimism/optimism/op-service/eth" ) +// aliases to not disrupt op-conductor code +var ( + ErrSequencerAlreadyStarted = sequencing.ErrSequencerAlreadyStarted + ErrSequencerAlreadyStopped = sequencing.ErrSequencerAlreadyStopped +) + type Metrics interface { RecordPipelineReset() RecordPublishingError() @@ -37,9 +52,10 @@ type Metrics interface { RecordL1ReorgDepth(d uint64) - EngineMetrics + engine.Metrics L1FetcherMetrics - SequencerMetrics + event.Metrics + sequencing.Metrics } type L1Chain interface { @@ -48,7 +64,7 @@ type L1Chain interface { } type L2Chain interface { - derive.Engine + engine.Engine L2BlockRefByLabel(ctx context.Context, label eth.BlockLabel) (eth.L2BlockRef, error) L2BlockRefByHash(ctx context.Context, l2Hash common.Hash) (eth.L2BlockRef, error) L2BlockRefByNumber(ctx context.Context, num uint64) (eth.L2BlockRef, error) @@ -56,32 +72,53 @@ type L2Chain interface { type DerivationPipeline interface { Reset() - Step(ctx context.Context) error - AddUnsafePayload(payload *eth.ExecutionPayloadEnvelope) - Finalize(ref eth.L1BlockRef) - FinalizedL1() eth.L1BlockRef + Step(ctx context.Context, pendingSafeHead eth.L2BlockRef) (*derive.AttributesWithParent, error) Origin() eth.L1BlockRef - EngineReady() bool + DerivationReady() bool + ConfirmEngineReset() +} + +type EngineController interface { + engine.LocalEngineControl + IsEngineSyncing() bool + InsertUnsafePayload(ctx context.Context, payload *eth.ExecutionPayloadEnvelope, ref eth.L2BlockRef) error + TryUpdateEngine(ctx context.Context) error + TryBackupUnsafeReorg(ctx context.Context) (bool, error) +} + +type CLSync interface { LowestQueuedUnsafeBlock() eth.L2BlockRef } -type L1StateIface interface { - HandleNewL1HeadBlock(head eth.L1BlockRef) - HandleNewL1SafeBlock(safe eth.L1BlockRef) - HandleNewL1FinalizedBlock(finalized eth.L1BlockRef) +type AttributesHandler interface { + // HasAttributes returns if there are any block attributes to process. + // HasAttributes is for EngineQueue testing only, and can be removed when attribute processing is fully independent. + HasAttributes() bool + // SetAttributes overwrites the set of attributes. This may be nil, to clear what may be processed next. + SetAttributes(attributes *derive.AttributesWithParent) + // Proceed runs one attempt of processing attributes, if any. + // Proceed returns io.EOF if there are no attributes to process. + Proceed(ctx context.Context) error +} - L1Head() eth.L1BlockRef - L1Safe() eth.L1BlockRef - L1Finalized() eth.L1BlockRef +type Finalizer interface { + FinalizedL1() eth.L1BlockRef + event.Deriver +} + +type AltDAIface interface { + // Notify L1 finalized head so AltDA finality is always behind L1 + Finalize(ref eth.L1BlockRef) + // Set the engine finalization signal callback + OnFinalizedHeadSignal(f altda.HeadSignalFn) + + derive.AltDAInputFetcher } -type SequencerIface interface { - StartBuildingBlock(ctx context.Context) error - CompleteBuildingBlock(ctx context.Context, agossip async.AsyncGossiper, sequencerConductor conductor.SequencerConductor) (*eth.ExecutionPayloadEnvelope, error) - PlanNextSequencerAction() time.Duration - RunNextSequencerAction(ctx context.Context, agossip async.AsyncGossiper, sequencerConductor conductor.SequencerConductor) (*eth.ExecutionPayloadEnvelope, error) - BuildingOnto() eth.L2BlockRef - CancelBuildingBlock(ctx context.Context) +type SyncStatusTracker interface { + event.Deriver + SyncStatus() *eth.SyncStatus + L1Head() eth.L1BlockRef } type Network interface { @@ -113,65 +150,132 @@ type SequencerStateListener interface { SequencerStopped() error } -// NewDriver composes an events handler that tracks L1 state, triggers L2 derivation, and optionally sequences new L2 blocks. +type Drain interface { + Drain() error +} + +// NewDriver composes an events handler that tracks L1 state, triggers L2 Derivation, and optionally sequences new L2 blocks. func NewDriver( + sys event.Registry, + drain Drain, driverCfg *Config, cfg *rollup.Config, l2 L2Chain, l1 L1Chain, + supervisor interop.InteropBackend, // may be nil pre-interop. l1Blobs derive.L1BlobsFetcher, altSync AltSync, network Network, log log.Logger, - snapshotLog log.Logger, metrics Metrics, - sequencerStateListener SequencerStateListener, - safeHeadListener derive.SafeHeadListener, + sequencerStateListener sequencing.SequencerStateListener, + safeHeadListener rollup.SafeHeadListener, syncCfg *sync.Config, sequencerConductor conductor.SequencerConductor, - plasma derive.PlasmaInputFetcher, - dacClient derive.DACClient, + altDA AltDAIface, + dacClient engine.DACClient, ) *Driver { - l1 = NewMeteredL1Fetcher(l1, metrics) - l1State := NewL1State(log, metrics) - sequencerConfDepth := NewConfDepth(driverCfg.SequencerConfDepth, l1State.L1Head, l1) - findL1Origin := NewL1OriginSelector(log, cfg, sequencerConfDepth) - verifConfDepth := NewConfDepth(driverCfg.VerifierConfDepth, l1State.L1Head, l1) - engine := derive.NewEngineController(l2, log, metrics, cfg, syncCfg.SyncMode, dacClient) - derivationPipeline := derive.NewDerivationPipeline(log, cfg, verifConfDepth, l1Blobs, plasma, l2, engine, metrics, syncCfg, safeHeadListener) - attrBuilder := derive.NewFetchingAttributesBuilder(cfg, l1, l2) - meteredEngine := NewMeteredEngine(cfg, engine, metrics, log) // Only use the metered engine in the sequencer b/c it records sequencing metrics. - sequencer := NewSequencer(log, cfg, meteredEngine, attrBuilder, findL1Origin, metrics) driverCtx, driverCancel := context.WithCancel(context.Background()) - asyncGossiper := async.NewAsyncGossiper(driverCtx, network, log, metrics) - return &Driver{ - l1State: l1State, - derivation: derivationPipeline, - engineController: engine, - stateReq: make(chan chan struct{}), - forceReset: make(chan chan struct{}, 10), - startSequencer: make(chan hashAndErrorChannel, 10), - stopSequencer: make(chan chan hashAndError, 10), - sequencerActive: make(chan chan bool, 10), - sequencerNotifs: sequencerStateListener, - config: cfg, - syncCfg: syncCfg, - driverConfig: driverCfg, - driverCtx: driverCtx, - driverCancel: driverCancel, - log: log, - snapshotLog: snapshotLog, - l1: l1, - l2: l2, - sequencer: sequencer, - network: network, - metrics: metrics, - l1HeadSig: make(chan eth.L1BlockRef, 10), - l1SafeSig: make(chan eth.L1BlockRef, 10), - l1FinalizedSig: make(chan eth.L1BlockRef, 10), - unsafeL2Payloads: make(chan *eth.ExecutionPayloadEnvelope, 10), - altSync: altSync, - asyncGossiper: asyncGossiper, - sequencerConductor: sequencerConductor, + + opts := event.DefaultRegisterOpts() + + // If interop is scheduled we start the driver. + // It will then be ready to pick up verification work + // as soon as we reach the upgrade time (if the upgrade is not already active). + if cfg.InteropTime != nil { + interopDeriver := interop.NewInteropDeriver(log, cfg, driverCtx, supervisor, l2) + sys.Register("interop", interopDeriver, opts) } + + statusTracker := status.NewStatusTracker(log, metrics) + sys.Register("status", statusTracker, opts) + + l1Tracker := status.NewL1Tracker(l1) + sys.Register("l1-blocks", l1Tracker, opts) + + l1 = NewMeteredL1Fetcher(l1Tracker, metrics) + verifConfDepth := confdepth.NewConfDepth(driverCfg.VerifierConfDepth, statusTracker.L1Head, l1) + + ec := engine.NewEngineController(l2, log, metrics, cfg, syncCfg, + sys.Register("engine-controller", nil, opts)) + + sys.Register("engine-reset", + engine.NewEngineResetDeriver(driverCtx, log, cfg, l1, l2, syncCfg), opts) + + clSync := clsync.NewCLSync(log, cfg, metrics) // alt-sync still uses cl-sync state to determine what to sync to + sys.Register("cl-sync", clSync, opts) + + var finalizer Finalizer + if cfg.AltDAEnabled() { + finalizer = finality.NewAltDAFinalizer(driverCtx, log, cfg, l1, altDA) + } else { + finalizer = finality.NewFinalizer(driverCtx, log, cfg, l1) + } + sys.Register("finalizer", finalizer, opts) + + sys.Register("attributes-handler", + attributes.NewAttributesHandler(log, cfg, driverCtx, l2), opts) + + derivationPipeline := derive.NewDerivationPipeline(log, cfg, verifConfDepth, l1Blobs, altDA, l2, metrics) + + sys.Register("pipeline", + derive.NewPipelineDeriver(driverCtx, derivationPipeline), opts) + + syncDeriver := &SyncDeriver{ + Derivation: derivationPipeline, + SafeHeadNotifs: safeHeadListener, + CLSync: clSync, + Engine: ec, + SyncCfg: syncCfg, + Config: cfg, + L1: l1, + L2: l2, + Log: log, + Ctx: driverCtx, + Drain: drain.Drain, + } + sys.Register("sync", syncDeriver, opts) + + sys.Register("engine", engine.NewEngDeriver(log, driverCtx, cfg, metrics, ec), opts) + + schedDeriv := NewStepSchedulingDeriver(log) + sys.Register("step-scheduler", schedDeriv, opts) + + var sequencer sequencing.SequencerIface + if driverCfg.SequencerEnabled { + asyncGossiper := async.NewAsyncGossiper(driverCtx, network, log, metrics) + attrBuilder := derive.NewFetchingAttributesBuilder(cfg, l1, l2) + sequencerConfDepth := confdepth.NewConfDepth(driverCfg.SequencerConfDepth, statusTracker.L1Head, l1) + findL1Origin := sequencing.NewL1OriginSelector(log, cfg, sequencerConfDepth) + sequencer = sequencing.NewSequencer(driverCtx, log, cfg, attrBuilder, findL1Origin, + sequencerStateListener, sequencerConductor, asyncGossiper, metrics, dacClient) + sys.Register("sequencer", sequencer, opts) + } else { + sequencer = sequencing.DisabledSequencer{} + } + + driverEmitter := sys.Register("driver", nil, opts) + driver := &Driver{ + statusTracker: statusTracker, + SyncDeriver: syncDeriver, + sched: schedDeriv, + emitter: driverEmitter, + drain: drain.Drain, + stateReq: make(chan chan struct{}), + forceReset: make(chan chan struct{}, 10), + driverConfig: driverCfg, + driverCtx: driverCtx, + driverCancel: driverCancel, + log: log, + sequencer: sequencer, + network: network, + metrics: metrics, + l1HeadSig: make(chan eth.L1BlockRef, 10), + l1SafeSig: make(chan eth.L1BlockRef, 10), + l1FinalizedSig: make(chan eth.L1BlockRef, 10), + unsafeL2Payloads: make(chan *eth.ExecutionPayloadEnvelope, 10), + altSync: altSync, + } + + return driver } diff --git a/op-node/rollup/driver/l1_state.go b/op-node/rollup/driver/l1_state.go deleted file mode 100644 index aa8a85abd143..000000000000 --- a/op-node/rollup/driver/l1_state.go +++ /dev/null @@ -1,82 +0,0 @@ -package driver - -import ( - "github.com/ethereum/go-ethereum/log" - - "github.com/ethereum-optimism/optimism/op-service/eth" -) - -type L1Metrics interface { - RecordL1ReorgDepth(d uint64) - RecordL1Ref(name string, ref eth.L1BlockRef) -} - -// L1State tracks L1 head, safe and finalized blocks. It is not safe to write and read concurrently. -type L1State struct { - log log.Logger - metrics L1Metrics - - // Latest recorded head, safe block and finalized block of the L1 Chain, independent of derivation work - l1Head eth.L1BlockRef - l1Safe eth.L1BlockRef - l1Finalized eth.L1BlockRef -} - -func NewL1State(log log.Logger, metrics L1Metrics) *L1State { - return &L1State{ - log: log, - metrics: metrics, - } -} - -func (s *L1State) HandleNewL1HeadBlock(head eth.L1BlockRef) { - // We don't need to do anything if the head hasn't changed. - if s.l1Head == (eth.L1BlockRef{}) { - s.log.Info("Received first L1 head signal", "l1_head", head) - } else if s.l1Head.Hash == head.Hash { - s.log.Trace("Received L1 head signal that is the same as the current head", "l1_head", head) - } else if s.l1Head.Hash == head.ParentHash { - // We got a new L1 block whose parent hash is the same as the current L1 head. Means we're - // dealing with a linear extension (new block is the immediate child of the old one). - s.log.Debug("L1 head moved forward", "l1_head", head) - } else { - if s.l1Head.Number >= head.Number { - s.metrics.RecordL1ReorgDepth(s.l1Head.Number - head.Number) - } - // New L1 block is not the same as the current head or a single step linear extension. - // This could either be a long L1 extension, or a reorg, or we simply missed a head update. - s.log.Warn("L1 head signal indicates a possible L1 re-org", "old_l1_head", s.l1Head, "new_l1_head_parent", head.ParentHash, "new_l1_head", head) - } - s.metrics.RecordL1Ref("l1_head", head) - s.l1Head = head -} - -func (s *L1State) HandleNewL1SafeBlock(safe eth.L1BlockRef) { - s.log.Info("New L1 safe block", "l1_safe", safe) - s.metrics.RecordL1Ref("l1_safe", safe) - s.l1Safe = safe -} - -func (s *L1State) HandleNewL1FinalizedBlock(finalized eth.L1BlockRef) { - s.log.Info("New L1 finalized block", "l1_finalized", finalized) - s.metrics.RecordL1Ref("l1_finalized", finalized) - s.l1Finalized = finalized -} - -// L1Head returns either the stored L1 head or an empty block reference -// if the L1 Head has not been initialized yet. -func (s *L1State) L1Head() eth.L1BlockRef { - return s.l1Head -} - -// L1Safe returns either the stored L1 safe block or an empty block reference -// if the L1 safe block has not been initialized yet. -func (s *L1State) L1Safe() eth.L1BlockRef { - return s.l1Safe -} - -// L1Finalized returns either the stored L1 finalized block or an empty block reference -// if the L1 finalized block has not been initialized yet. -func (s *L1State) L1Finalized() eth.L1BlockRef { - return s.l1Finalized -} diff --git a/op-node/rollup/driver/metered_engine.go b/op-node/rollup/driver/metered_engine.go deleted file mode 100644 index 29f2c7e4c8a2..000000000000 --- a/op-node/rollup/driver/metered_engine.go +++ /dev/null @@ -1,96 +0,0 @@ -package driver - -import ( - "context" - "time" - - "github.com/ethereum/go-ethereum/log" - - "github.com/ethereum-optimism/optimism/op-node/rollup" - "github.com/ethereum-optimism/optimism/op-node/rollup/async" - "github.com/ethereum-optimism/optimism/op-node/rollup/conductor" - "github.com/ethereum-optimism/optimism/op-node/rollup/derive" - "github.com/ethereum-optimism/optimism/op-service/eth" -) - -type EngineMetrics interface { - RecordSequencingError() - CountSequencedTxs(count int) - - RecordSequencerBuildingDiffTime(duration time.Duration) - RecordSequencerSealingTime(duration time.Duration) -} - -// MeteredEngine wraps an EngineControl and adds metrics such as block building time diff and sealing time -type MeteredEngine struct { - inner derive.EngineControl - - cfg *rollup.Config - metrics EngineMetrics - log log.Logger - - buildingStartTime time.Time -} - -func NewMeteredEngine(cfg *rollup.Config, inner derive.EngineControl, metrics EngineMetrics, log log.Logger) *MeteredEngine { - return &MeteredEngine{ - inner: inner, - cfg: cfg, - metrics: metrics, - log: log, - } -} - -func (m *MeteredEngine) Finalized() eth.L2BlockRef { - return m.inner.Finalized() -} - -func (m *MeteredEngine) UnsafeL2Head() eth.L2BlockRef { - return m.inner.UnsafeL2Head() -} - -func (m *MeteredEngine) SafeL2Head() eth.L2BlockRef { - return m.inner.SafeL2Head() -} - -func (m *MeteredEngine) StartPayload(ctx context.Context, parent eth.L2BlockRef, attrs *derive.AttributesWithParent, updateSafe bool) (errType derive.BlockInsertionErrType, err error) { - m.buildingStartTime = time.Now() - errType, err = m.inner.StartPayload(ctx, parent, attrs, updateSafe) - if err != nil { - m.metrics.RecordSequencingError() - } - return errType, err -} - -func (m *MeteredEngine) ConfirmPayload(ctx context.Context, agossip async.AsyncGossiper, sequencerConductor conductor.SequencerConductor) (out *eth.ExecutionPayloadEnvelope, errTyp derive.BlockInsertionErrType, err error) { - sealingStart := time.Now() - // Actually execute the block and add it to the head of the chain. - payload, errType, err := m.inner.ConfirmPayload(ctx, agossip, sequencerConductor) - if err != nil { - m.metrics.RecordSequencingError() - return payload, errType, err - } - now := time.Now() - sealTime := now.Sub(sealingStart) - buildTime := now.Sub(m.buildingStartTime) - m.metrics.RecordSequencerSealingTime(sealTime) - m.metrics.RecordSequencerBuildingDiffTime(buildTime - time.Duration(m.cfg.BlockTime)*time.Second) - - txnCount := len(payload.ExecutionPayload.Transactions) - m.metrics.CountSequencedTxs(txnCount) - - ref := m.inner.UnsafeL2Head() - - m.log.Debug("Processed new L2 block", "l2_unsafe", ref, "l1_origin", ref.L1Origin, - "txs", txnCount, "time", ref.Time, "seal_time", sealTime, "build_time", buildTime) - - return payload, errType, err -} - -func (m *MeteredEngine) CancelPayload(ctx context.Context, force bool) error { - return m.inner.CancelPayload(ctx, force) -} - -func (m *MeteredEngine) BuildingPayload() (onto eth.L2BlockRef, id eth.PayloadID, safe bool) { - return m.inner.BuildingPayload() -} diff --git a/op-node/rollup/driver/sequencer.go b/op-node/rollup/driver/sequencer.go deleted file mode 100644 index b46db64b1a0e..000000000000 --- a/op-node/rollup/driver/sequencer.go +++ /dev/null @@ -1,273 +0,0 @@ -package driver - -import ( - "context" - "errors" - "fmt" - "time" - - "github.com/ethereum/go-ethereum/common" - "github.com/ethereum/go-ethereum/core/types" - "github.com/ethereum/go-ethereum/log" - - "github.com/ethereum-optimism/optimism/op-node/rollup" - "github.com/ethereum-optimism/optimism/op-node/rollup/async" - "github.com/ethereum-optimism/optimism/op-node/rollup/conductor" - "github.com/ethereum-optimism/optimism/op-node/rollup/derive" - "github.com/ethereum-optimism/optimism/op-service/eth" -) - -type Downloader interface { - InfoByHash(ctx context.Context, hash common.Hash) (eth.BlockInfo, error) - FetchReceipts(ctx context.Context, blockHash common.Hash) (eth.BlockInfo, types.Receipts, error) -} - -type L1OriginSelectorIface interface { - FindL1Origin(ctx context.Context, l2Head eth.L2BlockRef) (eth.L1BlockRef, error) -} - -type SequencerMetrics interface { - RecordSequencerInconsistentL1Origin(from eth.BlockID, to eth.BlockID) - RecordSequencerReset() -} - -// Sequencer implements the sequencing interface of the driver: it starts and completes block building jobs. -type Sequencer struct { - log log.Logger - rollupCfg *rollup.Config - spec *rollup.ChainSpec - - engine derive.EngineControl - - attrBuilder derive.AttributesBuilder - l1OriginSelector L1OriginSelectorIface - - metrics SequencerMetrics - - // timeNow enables sequencer testing to mock the time - timeNow func() time.Time - - nextAction time.Time -} - -func NewSequencer(log log.Logger, rollupCfg *rollup.Config, engine derive.EngineControl, attributesBuilder derive.AttributesBuilder, l1OriginSelector L1OriginSelectorIface, metrics SequencerMetrics) *Sequencer { - return &Sequencer{ - log: log, - rollupCfg: rollupCfg, - spec: rollup.NewChainSpec(rollupCfg), - engine: engine, - timeNow: time.Now, - attrBuilder: attributesBuilder, - l1OriginSelector: l1OriginSelector, - metrics: metrics, - } -} - -// StartBuildingBlock initiates a block building job on top of the given L2 head, safe and finalized blocks, and using the provided l1Origin. -func (d *Sequencer) StartBuildingBlock(ctx context.Context) error { - l2Head := d.engine.UnsafeL2Head() - - // Figure out which L1 origin block we're going to be building on top of. - l1Origin, err := d.l1OriginSelector.FindL1Origin(ctx, l2Head) - if err != nil { - d.log.Error("Error finding next L1 Origin", "err", err) - return err - } - - if !(l2Head.L1Origin.Hash == l1Origin.ParentHash || l2Head.L1Origin.Hash == l1Origin.Hash) { - d.metrics.RecordSequencerInconsistentL1Origin(l2Head.L1Origin, l1Origin.ID()) - return derive.NewResetError(fmt.Errorf("cannot build new L2 block with L1 origin %s (parent L1 %s) on current L2 head %s with L1 origin %s", l1Origin, l1Origin.ParentHash, l2Head, l2Head.L1Origin)) - } - - d.log.Info("creating new block", "parent", l2Head, "l1Origin", l1Origin) - - fetchCtx, cancel := context.WithTimeout(ctx, time.Second*20) - defer cancel() - - attrs, err := d.attrBuilder.PreparePayloadAttributes(fetchCtx, l2Head, l1Origin.ID()) - if err != nil { - return err - } - - // If our next L2 block timestamp is beyond the Sequencer drift threshold, then we must produce - // 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.spec.MaxSequencerDrift(l1Origin.Time) - - // For the Ecotone activation block we shouldn't include any sequencer transactions. - if d.rollupCfg.IsEcotoneActivationBlock(uint64(attrs.Timestamp)) { - attrs.NoTxPool = true - 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) - - // Start a payload building process. - withParent := derive.NewAttributesWithParent(attrs, l2Head, false) - errTyp, err := d.engine.StartPayload(ctx, l2Head, withParent, false) - if err != nil { - return fmt.Errorf("failed to start building on top of L2 chain %s, error (%d): %w", l2Head, errTyp, err) - } - return nil -} - -// CompleteBuildingBlock takes the current block that is being built, and asks the engine to complete the building, seal the block, and persist it as canonical. -// Warning: the safe and finalized L2 blocks as viewed during the initiation of the block building are reused for completion of the block building. -// The Execution engine should not change the safe and finalized blocks between start and completion of block building. -func (d *Sequencer) CompleteBuildingBlock(ctx context.Context, agossip async.AsyncGossiper, sequencerConductor conductor.SequencerConductor) (*eth.ExecutionPayloadEnvelope, error) { - envelope, errTyp, err := d.engine.ConfirmPayload(ctx, agossip, sequencerConductor) - if err != nil { - return nil, fmt.Errorf("failed to complete building block: error (%d): %w", errTyp, err) - } - return envelope, nil -} - -// CancelBuildingBlock cancels the current open block building job. -// This sequencer only maintains one block building job at a time. -func (d *Sequencer) CancelBuildingBlock(ctx context.Context) { - // force-cancel, we can always continue block building, and any error is logged by the engine state - _ = d.engine.CancelPayload(ctx, true) -} - -// 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 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) - } - - head := d.engine.UnsafeL2Head() - now := d.timeNow() - - // 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 { - return delay - } - - blockTime := time.Duration(d.rollupCfg.BlockTime) * time.Second - payloadTime := time.Unix(int64(head.Time+d.rollupCfg.BlockTime), 0) - remainingTime := payloadTime.Sub(now) - - // If we started building a block already, and if that work is still consistent, - // then we would like to finish it by sealing the block. - if buildingID != (eth.PayloadID{}) && buildingOnto.Hash == head.Hash { - // if we started building already, then we will schedule the sealing. - if remainingTime < sealingDuration { - return 0 // if there's not enough time for sealing, don't wait. - } else { - // finish with margin of sealing duration before payloadTime - return remainingTime - sealingDuration - } - } else { - // if we did not yet start building, then we will schedule the start. - if remainingTime > blockTime { - // if we have too much time, then wait before starting the build - return remainingTime - blockTime - } else { - // otherwise start instantly - return 0 - } - } -} - -// BuildingOnto returns the L2 head reference that the latest block is or was being built on top of. -func (d *Sequencer) BuildingOnto() eth.L2BlockRef { - ref, _, _ := d.engine.BuildingPayload() - return ref -} - -// RunNextSequencerAction starts new block building work, or seals existing work, -// and is best timed by first awaiting the delay returned by PlanNextSequencerAction. -// If a new block is successfully sealed, it will be returned for publishing, nil otherwise. -// -// Only critical errors are bubbled up, other errors are handled internally. -// Internally starting or sealing of a block may fail with a derivation-like error: -// - If it is a critical error, the error is bubbled up to the caller. -// - If it is a reset error, the ResettableEngineControl used to build blocks is requested to reset, and a backoff applies. -// No attempt is made at completing the block building. -// - If it is a temporary error, a backoff is applied to reattempt building later. -// - If it is any other error, a backoff is applied and building is cancelled. -// -// Upon L1 reorgs that are deep enough to affect the L1 origin selection, a reset-error may occur, -// to direct the engine to follow the new L1 chain before continuing to sequence blocks. -// It is up to the EngineControl implementation to handle conflicting build jobs of the derivation -// process (as verifier) and sequencing process. -// Generally it is expected that the latest call interrupts any ongoing work, -// and the derivation process does not interrupt in the happy case, -// since it can consolidate previously sequenced blocks by comparing sequenced inputs with derived inputs. -// If the derivation pipeline does force a conflicting block, then an ongoing sequencer task might still finish, -// but the derivation can continue to reset until the chain is correct. -// If the engine is currently building safe blocks, then that building is not interrupted, and sequencing is delayed. -func (d *Sequencer) RunNextSequencerAction(ctx context.Context, agossip async.AsyncGossiper, sequencerConductor conductor.SequencerConductor) (*eth.ExecutionPayloadEnvelope, error) { - // if the engine returns a non-empty payload, OR if the async gossiper already has a payload, we can CompleteBuildingBlock - if onto, buildingID, safe := d.engine.BuildingPayload(); buildingID != (eth.PayloadID{}) || agossip.Get() != nil { - if safe { - d.log.Warn("avoiding sequencing to not interrupt safe-head changes", "onto", onto, "onto_time", onto.Time) - // approximates the worst-case time it takes to build a block, to reattempt sequencing after. - d.nextAction = d.timeNow().Add(time.Second * time.Duration(d.rollupCfg.BlockTime)) - return nil, nil - } - envelope, err := d.CompleteBuildingBlock(ctx, agossip, sequencerConductor) - if err != nil { - if errors.Is(err, derive.ErrCritical) { - return nil, err // bubble up critical errors. - } else if errors.Is(err, derive.ErrReset) { - d.log.Error("sequencer failed to seal new block, requiring derivation reset", "err", err) - d.metrics.RecordSequencerReset() - d.nextAction = d.timeNow().Add(time.Second * time.Duration(d.rollupCfg.BlockTime)) // hold off from sequencing for a full block - d.CancelBuildingBlock(ctx) - return nil, err - } else if errors.Is(err, derive.ErrTemporary) { - d.log.Error("sequencer failed temporarily to seal new block", "err", err) - d.nextAction = d.timeNow().Add(time.Second) - // We don't explicitly cancel block building jobs upon temporary errors: we may still finish the block. - // Any unfinished block building work eventually times out, and will be cleaned up that way. - } else { - d.log.Error("sequencer failed to seal block with unclassified error", "err", err) - d.nextAction = d.timeNow().Add(time.Second) - d.CancelBuildingBlock(ctx) - } - return nil, nil - } else { - payload := envelope.ExecutionPayload - d.log.Info("sequencer successfully built a new block", "block", payload.ID(), "time", uint64(payload.Timestamp), "txs", len(payload.Transactions)) - return envelope, nil - } - } else { - err := d.StartBuildingBlock(ctx) - if err != nil { - if errors.Is(err, derive.ErrCritical) { - return nil, err - } else if errors.Is(err, derive.ErrReset) { - d.log.Error("sequencer failed to seal new block, requiring derivation reset", "err", err) - d.metrics.RecordSequencerReset() - d.nextAction = d.timeNow().Add(time.Second * time.Duration(d.rollupCfg.BlockTime)) // hold off from sequencing for a full block - return nil, err - } else if errors.Is(err, derive.ErrTemporary) { - d.log.Error("sequencer temporarily failed to start building new block", "err", err) - d.nextAction = d.timeNow().Add(time.Second) - } else { - d.log.Error("sequencer failed to start building new block with unclassified error", "err", err) - d.nextAction = d.timeNow().Add(time.Second) - } - } else { - parent, buildingID, _ := d.engine.BuildingPayload() // we should have a new payload ID now that we're building a block - d.log.Info("sequencer started building new block", "payload_id", buildingID, "l2_parent_block", parent, "l2_parent_block_time", parent.Time) - } - return nil, nil - } -} diff --git a/op-node/rollup/driver/sequencer_test.go b/op-node/rollup/driver/sequencer_test.go deleted file mode 100644 index 6edf0960f08a..000000000000 --- a/op-node/rollup/driver/sequencer_test.go +++ /dev/null @@ -1,380 +0,0 @@ -package driver - -import ( - "context" - crand "crypto/rand" - "encoding/binary" - "errors" - "fmt" - "math/big" - "math/rand" - "testing" - "time" - - "github.com/ethereum/go-ethereum/common" - "github.com/ethereum/go-ethereum/core/types" - "github.com/ethereum/go-ethereum/log" - "github.com/stretchr/testify/require" - - "github.com/ethereum-optimism/optimism/op-node/metrics" - "github.com/ethereum-optimism/optimism/op-node/rollup" - "github.com/ethereum-optimism/optimism/op-node/rollup/async" - "github.com/ethereum-optimism/optimism/op-node/rollup/conductor" - "github.com/ethereum-optimism/optimism/op-node/rollup/derive" - "github.com/ethereum-optimism/optimism/op-service/eth" - "github.com/ethereum-optimism/optimism/op-service/testlog" - "github.com/ethereum-optimism/optimism/op-service/testutils" -) - -var mockResetErr = fmt.Errorf("mock reset err: %w", derive.ErrReset) - -type FakeEngineControl struct { - finalized eth.L2BlockRef - safe eth.L2BlockRef - unsafe eth.L2BlockRef - - buildingOnto eth.L2BlockRef - buildingID eth.PayloadID - buildingSafe bool - - buildingAttrs *eth.PayloadAttributes - buildingStart time.Time - - cfg *rollup.Config - - timeNow func() time.Time - - makePayload func(onto eth.L2BlockRef, attrs *eth.PayloadAttributes) *eth.ExecutionPayload - - errTyp derive.BlockInsertionErrType - err error - - totalBuildingTime time.Duration - totalBuiltBlocks int - totalTxs int -} - -func (m *FakeEngineControl) avgBuildingTime() time.Duration { - return m.totalBuildingTime / time.Duration(m.totalBuiltBlocks) -} - -func (m *FakeEngineControl) avgTxsPerBlock() float64 { - return float64(m.totalTxs) / float64(m.totalBuiltBlocks) -} - -func (m *FakeEngineControl) StartPayload(ctx context.Context, parent eth.L2BlockRef, attrs *derive.AttributesWithParent, updateSafe bool) (errType derive.BlockInsertionErrType, err error) { - if m.err != nil { - return m.errTyp, m.err - } - m.buildingID = eth.PayloadID{} - _, _ = crand.Read(m.buildingID[:]) - m.buildingOnto = parent - m.buildingSafe = updateSafe - m.buildingAttrs = attrs.Attributes() - m.buildingStart = m.timeNow() - return derive.BlockInsertOK, nil -} - -func (m *FakeEngineControl) ConfirmPayload(ctx context.Context, agossip async.AsyncGossiper, sequencerConductor conductor.SequencerConductor) (out *eth.ExecutionPayloadEnvelope, errTyp derive.BlockInsertionErrType, err error) { - if m.err != nil { - return nil, m.errTyp, m.err - } - buildTime := m.timeNow().Sub(m.buildingStart) - m.totalBuildingTime += buildTime - m.totalBuiltBlocks += 1 - payload := m.makePayload(m.buildingOnto, m.buildingAttrs) - ref, err := derive.PayloadToBlockRef(m.cfg, payload) - if err != nil { - panic(err) - } - m.unsafe = ref - if m.buildingSafe { - m.safe = ref - } - - m.resetBuildingState() - m.totalTxs += len(payload.Transactions) - return ð.ExecutionPayloadEnvelope{ExecutionPayload: payload}, derive.BlockInsertOK, nil -} - -func (m *FakeEngineControl) CancelPayload(ctx context.Context, force bool) error { - if force { - m.resetBuildingState() - } - return m.err -} - -func (m *FakeEngineControl) BuildingPayload() (onto eth.L2BlockRef, id eth.PayloadID, safe bool) { - return m.buildingOnto, m.buildingID, m.buildingSafe -} - -func (m *FakeEngineControl) Finalized() eth.L2BlockRef { - return m.finalized -} - -func (m *FakeEngineControl) UnsafeL2Head() eth.L2BlockRef { - return m.unsafe -} - -func (m *FakeEngineControl) SafeL2Head() eth.L2BlockRef { - return m.safe -} - -func (m *FakeEngineControl) resetBuildingState() { - m.buildingID = eth.PayloadID{} - m.buildingOnto = eth.L2BlockRef{} - m.buildingSafe = false - m.buildingAttrs = nil -} - -var _ derive.EngineControl = (*FakeEngineControl)(nil) - -type testAttrBuilderFn func(ctx context.Context, l2Parent eth.L2BlockRef, epoch eth.BlockID) (attrs *eth.PayloadAttributes, err error) - -func (fn testAttrBuilderFn) PreparePayloadAttributes(ctx context.Context, l2Parent eth.L2BlockRef, epoch eth.BlockID) (attrs *eth.PayloadAttributes, err error) { - return fn(ctx, l2Parent, epoch) -} - -var _ derive.AttributesBuilder = (testAttrBuilderFn)(nil) - -type testOriginSelectorFn func(ctx context.Context, l2Head eth.L2BlockRef) (eth.L1BlockRef, error) - -func (fn testOriginSelectorFn) FindL1Origin(ctx context.Context, l2Head eth.L2BlockRef) (eth.L1BlockRef, error) { - return fn(ctx, l2Head) -} - -var _ L1OriginSelectorIface = (testOriginSelectorFn)(nil) - -// TestSequencerChaosMonkey runs the sequencer in a mocked adversarial environment with -// repeated random errors in dependencies and poor clock timing. -// At the end the health of the chain is checked to show that the sequencer kept the chain in shape. -func TestSequencerChaosMonkey(t *testing.T) { - mockL1Hash := func(num uint64) (out common.Hash) { - out[31] = 1 - binary.BigEndian.PutUint64(out[:], num) - return - } - mockL2Hash := func(num uint64) (out common.Hash) { - out[31] = 2 - binary.BigEndian.PutUint64(out[:], num) - return - } - mockL1ID := func(num uint64) eth.BlockID { - return eth.BlockID{Hash: mockL1Hash(num), Number: num} - } - mockL2ID := func(num uint64) eth.BlockID { - return eth.BlockID{Hash: mockL2Hash(num), Number: num} - } - - rng := rand.New(rand.NewSource(12345)) - - l1Time := uint64(100000) - - // mute errors. We expect a lot of the mocked errors to cause error-logs. We check chain health at the end of the test. - log := testlog.Logger(t, log.LevelCrit) - - cfg := &rollup.Config{ - Genesis: rollup.Genesis{ - L1: mockL1ID(100000), - L2: mockL2ID(200000), - L2Time: l1Time + 300, // L2 may start with a relative old L1 origin and will have to catch it up - SystemConfig: eth.SystemConfig{}, - }, - BlockTime: 2, - MaxSequencerDrift: 30, - } - // keep track of the L1 timestamps we mock because sometimes we only have the L1 hash/num handy - l1Times := map[eth.BlockID]uint64{cfg.Genesis.L1: l1Time} - - genesisL2 := eth.L2BlockRef{ - Hash: cfg.Genesis.L2.Hash, - Number: cfg.Genesis.L2.Number, - ParentHash: mockL2Hash(cfg.Genesis.L2.Number - 1), - Time: cfg.Genesis.L2Time, - L1Origin: cfg.Genesis.L1, - SequenceNumber: 0, - } - // initialize our engine state - engControl := &FakeEngineControl{ - finalized: genesisL2, - safe: genesisL2, - unsafe: genesisL2, - cfg: cfg, - } - - // start wallclock at 5 minutes after the current L2 head. The sequencer has some catching up to do! - clockTime := time.Unix(int64(engControl.unsafe.Time)+5*60, 0) - clockFn := func() time.Time { - return clockTime - } - engControl.timeNow = clockFn - - // mock payload building, we don't need to process any real txs. - engControl.makePayload = func(onto eth.L2BlockRef, attrs *eth.PayloadAttributes) *eth.ExecutionPayload { - txs := make([]eth.Data, 0) - txs = append(txs, attrs.Transactions...) // include deposits - if !attrs.NoTxPool { // if we are allowed to sequence from tx pool, mock some txs - n := rng.Intn(20) - for i := 0; i < n; i++ { - txs = append(txs, []byte(fmt.Sprintf("mock sequenced tx %d", i))) - } - } - return ð.ExecutionPayload{ - ParentHash: onto.Hash, - BlockNumber: eth.Uint64Quantity(onto.Number) + 1, - Timestamp: attrs.Timestamp, - BlockHash: mockL2Hash(onto.Number), - Transactions: txs, - } - } - - // We keep attribute building simple, we don't talk to a real execution engine in this test. - // Sometimes we fake an error in the attributes preparation. - var attrsErr error - attrBuilder := testAttrBuilderFn(func(ctx context.Context, l2Parent eth.L2BlockRef, epoch eth.BlockID) (attrs *eth.PayloadAttributes, err error) { - if attrsErr != nil { - return nil, attrsErr - } - seqNr := l2Parent.SequenceNumber + 1 - if epoch != l2Parent.L1Origin { - seqNr = 0 - } - l1Info := &testutils.MockBlockInfo{ - InfoHash: epoch.Hash, - InfoParentHash: mockL1Hash(epoch.Number - 1), - InfoCoinbase: common.Address{}, - InfoRoot: common.Hash{}, - InfoNum: epoch.Number, - InfoTime: l1Times[epoch], - InfoMixDigest: [32]byte{}, - InfoBaseFee: big.NewInt(1234), - InfoReceiptRoot: common.Hash{}, - } - infoDep, err := derive.L1InfoDepositBytes(cfg, cfg.Genesis.SystemConfig, seqNr, l1Info, 0) - require.NoError(t, err) - - testGasLimit := eth.Uint64Quantity(10_000_000) - return ð.PayloadAttributes{ - Timestamp: eth.Uint64Quantity(l2Parent.Time + cfg.BlockTime), - PrevRandao: eth.Bytes32{}, - SuggestedFeeRecipient: common.Address{}, - Transactions: []eth.Data{infoDep}, - NoTxPool: false, - GasLimit: &testGasLimit, - }, nil - }) - - maxL1BlockTimeGap := uint64(100) - // The origin selector just generates random L1 blocks based on RNG - var originErr error - originSelector := testOriginSelectorFn(func(ctx context.Context, l2Head eth.L2BlockRef) (eth.L1BlockRef, error) { - if originErr != nil { - return eth.L1BlockRef{}, originErr - } - origin := eth.L1BlockRef{ - Hash: mockL1Hash(l2Head.L1Origin.Number), - Number: l2Head.L1Origin.Number, - ParentHash: mockL1Hash(l2Head.L1Origin.Number), - Time: l1Times[l2Head.L1Origin], - } - // randomly make a L1 origin appear, if we can even select it - nextL2Time := l2Head.Time + cfg.BlockTime - if nextL2Time <= origin.Time { - return origin, nil - } - maxTimeIncrement := nextL2Time - origin.Time - if maxTimeIncrement > maxL1BlockTimeGap { - maxTimeIncrement = maxL1BlockTimeGap - } - if rng.Intn(10) == 0 { - nextOrigin := eth.L1BlockRef{ - Hash: mockL1Hash(origin.Number + 1), - Number: origin.Number + 1, - ParentHash: origin.Hash, - Time: origin.Time + 1 + uint64(rng.Int63n(int64(maxTimeIncrement))), - } - l1Times[nextOrigin.ID()] = nextOrigin.Time - return nextOrigin, nil - } else { - return origin, nil - } - }) - - seq := NewSequencer(log, cfg, engControl, attrBuilder, originSelector, metrics.NoopMetrics) - seq.timeNow = clockFn - - // try to build 1000 blocks, with 5x as many planning attempts, to handle errors and clock problems - desiredBlocks := 1000 - for i := 0; i < 5*desiredBlocks && engControl.totalBuiltBlocks < desiredBlocks; i++ { - delta := seq.PlanNextSequencerAction() - - x := rng.Float32() - if x < 0.01 { // 1%: mess a lot with the clock: simulate a hang of up to 30 seconds - if i < desiredBlocks/2 { // only in first 50% of blocks to let it heal, hangs take time - delta = time.Duration(rng.Float64() * float64(time.Second*30)) - } - } else if x < 0.1 { // 9%: mess with the timing, -50% to 50% off - delta = time.Duration((0.5 + rng.Float64()) * float64(delta)) - } else if x < 0.5 { - // 40%: mess slightly with the timing, -10% to 10% off - delta = time.Duration((0.9 + rng.Float64()*0.2) * float64(delta)) - } - clockTime = clockTime.Add(delta) - - // reset errors - originErr = nil - attrsErr = nil - if engControl.err != mockResetErr { // the mockResetErr requires the sequencer to Reset() to recover. - engControl.err = nil - } - engControl.errTyp = derive.BlockInsertOK - - // maybe make something maybe fail, or try a new L1 origin - switch rng.Intn(20) { // 9/20 = 45% chance to fail sequencer action (!!!) - case 0, 1: - originErr = errors.New("mock origin error") - case 2, 3: - attrsErr = errors.New("mock attributes error") - case 4, 5: - engControl.err = errors.New("mock temporary engine error") - engControl.errTyp = derive.BlockInsertTemporaryErr - case 6, 7: - engControl.err = errors.New("mock prestate engine error") - engControl.errTyp = derive.BlockInsertPrestateErr - case 8: - engControl.err = mockResetErr - default: - // no error - } - payload, err := seq.RunNextSequencerAction(context.Background(), async.NoOpGossiper{}, &conductor.NoOpConductor{}) - // RunNextSequencerAction passes ErrReset & ErrCritical through. - // Only suppress ErrReset, not ErrCritical - if !errors.Is(err, derive.ErrReset) { - require.NoError(t, err) - } - if payload != nil { - require.Equal(t, engControl.UnsafeL2Head().ID(), payload.ExecutionPayload.ID(), "head must stay in sync with emitted payloads") - var tx types.Transaction - require.NoError(t, tx.UnmarshalBinary(payload.ExecutionPayload.Transactions[0])) - info, err := derive.L1BlockInfoFromBytes(cfg, uint64(payload.ExecutionPayload.Timestamp), tx.Data()) - require.NoError(t, err) - require.GreaterOrEqual(t, uint64(payload.ExecutionPayload.Timestamp), info.Time, "ensure L2 time >= L1 time") - } - } - - // Now, even though: - // - the start state was behind the wallclock - // - the L1 origin was far behind the L2 - // - we made all components fail at random - // - messed with the clock - // the L2 chain was still built and stats are healthy on average! - l2Head := engControl.UnsafeL2Head() - t.Logf("avg build time: %s, clock timestamp: %d, L2 head time: %d, L1 origin time: %d, avg txs per block: %f", engControl.avgBuildingTime(), clockFn().Unix(), l2Head.Time, l1Times[l2Head.L1Origin], engControl.avgTxsPerBlock()) - require.Equal(t, engControl.totalBuiltBlocks, desiredBlocks, "persist through random errors and build the desired blocks") - require.Equal(t, l2Head.Time, cfg.Genesis.L2Time+uint64(desiredBlocks)*cfg.BlockTime, "reached desired L2 block timestamp") - require.GreaterOrEqual(t, l2Head.Time, l1Times[l2Head.L1Origin], "the L2 time >= the L1 time") - require.Less(t, l2Head.Time-l1Times[l2Head.L1Origin], uint64(100), "The L1 origin time is close to the L2 time") - require.Less(t, clockTime.Sub(time.Unix(int64(l2Head.Time), 0)).Abs(), 2*time.Second, "L2 time is accurate, within 2 seconds of wallclock") - require.Greater(t, engControl.avgBuildingTime(), time.Second, "With 2 second block time and 1 second error backoff and healthy-on-average errors, building time should at least be a second") - require.Greater(t, engControl.avgTxsPerBlock(), 3.0, "We expect at least 1 system tx per block, but with a mocked 0-10 txs we expect an higher avg") -} diff --git a/op-node/rollup/driver/state.go b/op-node/rollup/driver/state.go index c206204e03a0..2840cedcf423 100644 --- a/op-node/rollup/driver/state.go +++ b/op-node/rollup/driver/state.go @@ -1,12 +1,9 @@ package driver import ( - "bytes" "context" - "encoding/json" "errors" "fmt" - "io" gosync "sync" "time" @@ -14,35 +11,29 @@ import ( "github.com/ethereum/go-ethereum/log" "github.com/ethereum-optimism/optimism/op-node/rollup" - "github.com/ethereum-optimism/optimism/op-node/rollup/async" - "github.com/ethereum-optimism/optimism/op-node/rollup/conductor" + "github.com/ethereum-optimism/optimism/op-node/rollup/clsync" "github.com/ethereum-optimism/optimism/op-node/rollup/derive" + "github.com/ethereum-optimism/optimism/op-node/rollup/engine" + "github.com/ethereum-optimism/optimism/op-node/rollup/event" + "github.com/ethereum-optimism/optimism/op-node/rollup/finality" + "github.com/ethereum-optimism/optimism/op-node/rollup/sequencing" + "github.com/ethereum-optimism/optimism/op-node/rollup/status" "github.com/ethereum-optimism/optimism/op-node/rollup/sync" "github.com/ethereum-optimism/optimism/op-service/eth" - "github.com/ethereum-optimism/optimism/op-service/retry" -) - -var ( - ErrSequencerAlreadyStarted = errors.New("sequencer already running") - ErrSequencerAlreadyStopped = errors.New("sequencer not running") ) // Deprecated: use eth.SyncStatus instead. type SyncStatus = eth.SyncStatus -// sealingDuration defines the expected time it takes to seal the block -const sealingDuration = time.Millisecond * 50 - type Driver struct { - l1State L1StateIface + statusTracker SyncStatusTracker - // The derivation pipeline is reset whenever we reorg. - // The derivation pipeline determines the new l2Safe. - derivation DerivationPipeline + *SyncDeriver - // The engine controller is used by the sequencer & derivation components. - // We will also use it for EL sync in a future PR. - engineController *derive.EngineController + sched *StepSchedulingDeriver + + emitter event.Emitter + drain func() error // Requests to block the event loop for synchronous execution to avoid reading an inconsistent state stateReq chan chan struct{} @@ -51,33 +42,10 @@ type Driver struct { // It tells the caller that the reset occurred by closing the passed in channel. forceReset chan chan struct{} - // Upon receiving a hash in this channel, the sequencer is started at the given hash. - // It tells the caller that the sequencer started by closing the passed in channel (or returning an error). - startSequencer chan hashAndErrorChannel - - // Upon receiving a channel in this channel, the sequencer is stopped. - // It tells the caller that the sequencer stopped by returning the latest sequenced L2 block hash. - stopSequencer chan chan hashAndError - - // Upon receiving a channel in this channel, the current sequencer status is queried. - // It tells the caller the status by outputting a boolean to the provided channel: - // true when the sequencer is active, false when it is not. - sequencerActive chan chan bool - - // sequencerNotifs is notified when the sequencer is started or stopped - sequencerNotifs SequencerStateListener - - // Rollup config: rollup chain configuration - config *rollup.Config - - sequencerConductor conductor.SequencerConductor - - // Driver config: verifier and sequencer settings + // Driver config: verifier and sequencer settings. + // May not be modified after starting the Driver. driverConfig *Config - // Sync Mod Config - syncCfg *sync.Config - // L1 Signals: // // Not all L1 blocks, or all changes, have to be signalled: @@ -91,22 +59,15 @@ type Driver struct { // Interface to signal the L2 block range to sync. altSync AltSync - // async gossiper for payloads to be gossiped without - // blocking the event loop or waiting for insertion - asyncGossiper async.AsyncGossiper - // L2 Signals: unsafeL2Payloads chan *eth.ExecutionPayloadEnvelope - l1 L1Chain - l2 L2Chain - sequencer SequencerIface + sequencer sequencing.SequencerIface network Network // may be nil, network for is optional - metrics Metrics - log log.Logger - snapshotLog log.Logger + metrics Metrics + log log.Logger wg gosync.WaitGroup @@ -117,25 +78,17 @@ type Driver struct { // Start starts up the state loop. // The loop will have been started iff err is not nil. func (s *Driver) Start() error { - s.derivation.Reset() - - log.Info("Starting driver", "sequencerEnabled", s.driverConfig.SequencerEnabled, "sequencerStopped", s.driverConfig.SequencerStopped) + log.Info("Starting driver", "sequencerEnabled", s.driverConfig.SequencerEnabled, + "sequencerStopped", s.driverConfig.SequencerStopped) if s.driverConfig.SequencerEnabled { - // Notify the initial sequencer state - // This ensures persistence can write the state correctly and that the state file exists - var err error - if s.driverConfig.SequencerStopped { - err = s.sequencerNotifs.SequencerStopped() - } else { - err = s.sequencerNotifs.SequencerStarted() + if err := s.sequencer.SetMaxSafeLag(s.driverCtx, s.driverConfig.SequencerMaxSafeLag); err != nil { + return fmt.Errorf("failed to set sequencer max safe lag: %w", err) } - if err != nil { + if err := s.sequencer.Init(s.driverCtx, !s.driverConfig.SequencerStopped); err != nil { return fmt.Errorf("persist initial sequencer state: %w", err) } } - s.asyncGossiper.Start() - s.wg.Add(1) go s.eventLoop() @@ -145,8 +98,7 @@ func (s *Driver) Start() error { func (s *Driver) Close() error { s.driverCancel() s.wg.Wait() - s.asyncGossiper.Stop() - s.sequencerConductor.Close() + s.sequencer.Close() return nil } @@ -190,18 +142,6 @@ func (s *Driver) OnUnsafeL2Payload(ctx context.Context, envelope *eth.ExecutionP } } -func (s *Driver) logSyncProgress(reason string) { - s.log.Info("Sync progress", - "reason", reason, - "l2_finalized", s.engineController.Finalized(), - "l2_safe", s.engineController.SafeL2Head(), - "l2_pending_safe", s.engineController.PendingSafeL2Head(), - "l2_unsafe", s.engineController.UnsafeL2Head(), - "l2_time", s.engineController.UnsafeL2Head().Time, - "l1_derived", s.derivation.Origin(), - ) -} - // the eventLoop responds to L1 changes and internal timers to produce L2 blocks. func (s *Driver) eventLoop() { defer s.wg.Done() @@ -210,39 +150,9 @@ func (s *Driver) eventLoop() { defer s.driverCancel() - // stepReqCh is used to request that the driver attempts to step forward by one L1 block. - stepReqCh := make(chan struct{}, 1) - - // channel, nil by default (not firing), but used to schedule re-attempts with delay - var delayedStepReq <-chan time.Time - - // keep track of consecutive failed attempts, to adjust the backoff time accordingly - bOffStrategy := retry.Exponential() - stepAttempts := 0 - - // step requests a derivation step to be taken. Won't deadlock if the channel is full. - step := func() { - select { - case stepReqCh <- struct{}{}: - // Don't deadlock if the channel is already full - default: - } - } - // reqStep requests a derivation step nicely, with a delay if this is a reattempt, or not at all if we already scheduled a reattempt. reqStep := func() { - if stepAttempts > 0 { - // if this is not the first attempt, we re-schedule with a backoff, *without blocking other events* - if delayedStepReq == nil { - delay := bOffStrategy.Duration(stepAttempts) - s.log.Debug("scheduling re-attempt with delay", "attempts", stepAttempts, "delay", delay) - delayedStepReq = time.After(delay) - } else { - s.log.Debug("ignoring step request, already scheduled re-attempt after previous failure", "attempts", stepAttempts) - } - } else { - step() - } + s.emitter.Emit(StepReqEvent{}) } // We call reqStep right away to finish syncing to the tip of the chain if we're behind. @@ -252,73 +162,68 @@ func (s *Driver) eventLoop() { sequencerTimer := time.NewTimer(0) var sequencerCh <-chan time.Time + var prevTime time.Time + // planSequencerAction updates the sequencerTimer with the next action, if any. + // The sequencerCh is nil (indefinitely blocks on read) if no action needs to be performed, + // or set to the timer channel if there is an action scheduled. planSequencerAction := func() { - delay := s.sequencer.PlanNextSequencerAction() + nextAction, ok := s.sequencer.NextAction() + if !ok { + if sequencerCh != nil { + s.log.Info("Sequencer paused until new events") + } + sequencerCh = nil + return + } + // avoid unnecessary timer resets + if nextAction == prevTime { + return + } + prevTime = nextAction sequencerCh = sequencerTimer.C if len(sequencerCh) > 0 { // empty if not already drained before resetting <-sequencerCh } - sequencerTimer.Reset(delay) + delta := time.Until(nextAction) + s.log.Info("Scheduled sequencer action", "delta", delta) + sequencerTimer.Reset(delta) } // Create a ticker to check if there is a gap in the engine queue. Whenever // there is, we send requests to sync source to retrieve the missing payloads. - syncCheckInterval := time.Duration(s.config.BlockTime) * time.Second * 2 + syncCheckInterval := time.Duration(s.Config.BlockTime) * time.Second * 2 altSyncTicker := time.NewTicker(syncCheckInterval) defer altSyncTicker.Stop() - lastUnsafeL2 := s.engineController.UnsafeL2Head() + lastUnsafeL2 := s.Engine.UnsafeL2Head() for { if s.driverCtx.Err() != nil { // don't try to schedule/handle more work when we are closing. return } - // If we are sequencing, and the L1 state is ready, update the trigger for the next sequencer action. - // This may adjust at any time based on fork-choice changes or previous errors. - // And avoid sequencing if the derivation pipeline indicates the engine is not ready. - if s.driverConfig.SequencerEnabled && !s.driverConfig.SequencerStopped && - s.l1State.L1Head() != (eth.L1BlockRef{}) && s.derivation.EngineReady() { - if s.driverConfig.SequencerMaxSafeLag > 0 && s.engineController.SafeL2Head().Number+s.driverConfig.SequencerMaxSafeLag <= s.engineController.UnsafeL2Head().Number { - // If the safe head has fallen behind by a significant number of blocks, delay creating new blocks - // until the safe lag is below SequencerMaxSafeLag. - if sequencerCh != nil { - s.log.Warn( - "Delay creating new block since safe lag exceeds limit", - "safe_l2", s.engineController.SafeL2Head(), - "unsafe_l2", s.engineController.UnsafeL2Head(), - ) - sequencerCh = nil + if s.drain != nil { + // While event-processing is synchronous we have to drain + // (i.e. process all queued-up events) before creating any new events. + if err := s.drain(); err != nil { + if s.driverCtx.Err() != nil { + return } - } else if s.sequencer.BuildingOnto().ID() != s.engineController.UnsafeL2Head().ID() { - // If we are sequencing, and the L1 state is ready, update the trigger for the next sequencer action. - // This may adjust at any time based on fork-choice changes or previous errors. - // - // update sequencer time if the head changed - planSequencerAction() + s.log.Error("unexpected error from event-draining", "err", err) } - } else { - sequencerCh = nil } + planSequencerAction() + // If the engine is not ready, or if the L2 head is actively changing, then reset the alt-sync: // there is no need to request L2 blocks when we are syncing already. - if head := s.engineController.UnsafeL2Head(); head != lastUnsafeL2 || !s.derivation.EngineReady() { + if head := s.Engine.UnsafeL2Head(); head != lastUnsafeL2 || !s.Derivation.DerivationReady() { lastUnsafeL2 = head altSyncTicker.Reset(syncCheckInterval) } select { case <-sequencerCh: - // the payload publishing is handled by the async gossiper, which will begin gossiping as soon as available - // so, we don't need to receive the payload here - _, err := s.sequencer.RunNextSequencerAction(s.driverCtx, s.asyncGossiper, s.sequencerConductor) - if errors.Is(err, derive.ErrReset) { - s.derivation.Reset() - } else if err != nil { - s.log.Error("Sequencer critical error", "err", err) - return - } - planSequencerAction() // schedule the next sequencer action to keep the sequencing looping + s.Emitter.Emit(sequencing.SequencerActionEvent{}) case <-altSyncTicker.C: // Check if there is a gap in the current unsafe payload queue. ctx, cancel := context.WithTimeout(s.driverCtx, time.Second*2) @@ -328,128 +233,219 @@ func (s *Driver) eventLoop() { s.log.Warn("failed to check for unsafe L2 blocks to sync", "err", err) } case envelope := <-s.unsafeL2Payloads: - s.snapshot("New unsafe payload") // If we are doing CL sync or done with engine syncing, fallback to the unsafe payload queue & CL P2P sync. - if s.syncCfg.SyncMode == sync.CLSync || !s.engineController.IsEngineSyncing() { + if s.SyncCfg.SyncMode == sync.CLSync || !s.Engine.IsEngineSyncing() { s.log.Info("Optimistically queueing unsafe L2 execution payload", "id", envelope.ExecutionPayload.ID()) - s.derivation.AddUnsafePayload(envelope) + s.Emitter.Emit(clsync.ReceivedUnsafePayloadEvent{Envelope: envelope}) s.metrics.RecordReceivedUnsafePayload(envelope) reqStep() - } else if s.syncCfg.SyncMode == sync.ELSync { - ref, err := derive.PayloadToBlockRef(s.config, envelope.ExecutionPayload) + } else if s.SyncCfg.SyncMode == sync.ELSync { + ref, err := derive.PayloadToBlockRef(s.Config, envelope.ExecutionPayload) if err != nil { s.log.Info("Failed to turn execution payload into a block ref", "id", envelope.ExecutionPayload.ID(), "err", err) continue } - if ref.Number <= s.engineController.UnsafeL2Head().Number { + if ref.Number <= s.Engine.UnsafeL2Head().Number { continue } s.log.Info("Optimistically inserting unsafe L2 execution payload to drive EL sync", "id", envelope.ExecutionPayload.ID()) - if err := s.engineController.InsertUnsafePayload(s.driverCtx, envelope, ref); err != nil { + if err := s.Engine.InsertUnsafePayload(s.driverCtx, envelope, ref); err != nil { s.log.Warn("Failed to insert unsafe payload for EL sync", "id", envelope.ExecutionPayload.ID(), "err", err) } - s.logSyncProgress("unsafe payload from sequencer while in EL sync") } case newL1Head := <-s.l1HeadSig: - s.l1State.HandleNewL1HeadBlock(newL1Head) + s.Emitter.Emit(status.L1UnsafeEvent{L1Unsafe: newL1Head}) reqStep() // a new L1 head may mean we have the data to not get an EOF again. case newL1Safe := <-s.l1SafeSig: - s.l1State.HandleNewL1SafeBlock(newL1Safe) + s.Emitter.Emit(status.L1SafeEvent{L1Safe: newL1Safe}) // no step, justified L1 information does not do anything for L2 derivation or status case newL1Finalized := <-s.l1FinalizedSig: - s.l1State.HandleNewL1FinalizedBlock(newL1Finalized) - s.derivation.Finalize(newL1Finalized) + s.emitter.Emit(finality.FinalizeL1Event{FinalizedL1: newL1Finalized}) reqStep() // we may be able to mark more L2 data as finalized now - case <-delayedStepReq: - delayedStepReq = nil - step() - case <-stepReqCh: - // Don't start the derivation pipeline until we are done with EL sync - if s.engineController.IsEngineSyncing() { - continue - } - s.metrics.SetDerivationIdle(false) - s.log.Debug("Derivation process step", "onto_origin", s.derivation.Origin(), "attempts", stepAttempts) - err := s.derivation.Step(s.driverCtx) - stepAttempts += 1 // count as attempt by default. We reset to 0 if we are making healthy progress. - if err == io.EOF { - s.log.Debug("Derivation process went idle", "progress", s.derivation.Origin(), "err", err) - stepAttempts = 0 - s.metrics.SetDerivationIdle(true) - continue - } else if err != nil && errors.Is(err, derive.EngineELSyncing) { - s.log.Debug("Derivation process went idle because the engine is syncing", "progress", s.derivation.Origin(), "unsafe_head", s.engineController.UnsafeL2Head(), "err", err) - stepAttempts = 0 - s.metrics.SetDerivationIdle(true) - continue - } else if err != nil && errors.Is(err, derive.ErrReset) { - // If the pipeline corrupts, e.g. due to a reorg, simply reset it - s.log.Warn("Derivation pipeline is reset", "err", err) - s.derivation.Reset() - s.metrics.RecordPipelineReset() - continue - } else if err != nil && errors.Is(err, derive.ErrTemporary) { - s.log.Warn("Derivation process temporary error", "attempts", stepAttempts, "err", err) - reqStep() - continue - } else if err != nil && errors.Is(err, derive.ErrCritical) { - s.log.Error("Derivation process critical error", "err", err) - return - } else if err != nil && errors.Is(err, derive.NotEnoughData) { - stepAttempts = 0 // don't do a backoff for this error - reqStep() - continue - } else if err != nil { - s.log.Error("Derivation process error", "attempts", stepAttempts, "err", err) - reqStep() - continue - } else { - stepAttempts = 0 - reqStep() // continue with the next step if we can - } + case <-s.sched.NextDelayedStep(): + s.emitter.Emit(StepAttemptEvent{}) + case <-s.sched.NextStep(): + s.emitter.Emit(StepAttemptEvent{}) case respCh := <-s.stateReq: respCh <- struct{}{} case respCh := <-s.forceReset: s.log.Warn("Derivation pipeline is manually reset") - s.derivation.Reset() + s.Derivation.Reset() s.metrics.RecordPipelineReset() close(respCh) - case resp := <-s.startSequencer: - unsafeHead := s.engineController.UnsafeL2Head().Hash - if !s.driverConfig.SequencerStopped { - resp.err <- ErrSequencerAlreadyStarted - } else if !bytes.Equal(unsafeHead[:], resp.hash[:]) { - resp.err <- fmt.Errorf("block hash does not match: head %s, received %s", unsafeHead.String(), resp.hash.String()) - } else { - if err := s.sequencerNotifs.SequencerStarted(); err != nil { - resp.err <- fmt.Errorf("sequencer start notification: %w", err) - continue - } - s.log.Info("Sequencer has been started") - s.driverConfig.SequencerStopped = false - close(resp.err) - planSequencerAction() // resume sequencing + case <-s.driverCtx.Done(): + return + } + } +} + +type SyncDeriver struct { + // The derivation pipeline is reset whenever we reorg. + // The derivation pipeline determines the new l2Safe. + Derivation DerivationPipeline + + SafeHeadNotifs rollup.SafeHeadListener // notified when safe head is updated + + CLSync CLSync + + // The engine controller is used by the sequencer & Derivation components. + // We will also use it for EL sync in a future PR. + Engine EngineController + + // Sync Mod Config + SyncCfg *sync.Config + + Config *rollup.Config + + L1 L1Chain + L2 L2Chain + + Emitter event.Emitter + + Log log.Logger + + Ctx context.Context + + Drain func() error +} + +func (s *SyncDeriver) AttachEmitter(em event.Emitter) { + s.Emitter = em +} + +func (s *SyncDeriver) OnEvent(ev event.Event) bool { + switch x := ev.(type) { + case StepEvent: + s.SyncStep() + case rollup.ResetEvent: + s.onResetEvent(x) + case rollup.L1TemporaryErrorEvent: + s.Log.Warn("L1 temporary error", "err", x.Err) + s.Emitter.Emit(StepReqEvent{}) + case rollup.EngineTemporaryErrorEvent: + s.Log.Warn("Engine temporary error", "err", x.Err) + // Make sure that for any temporarily failed attributes we retry processing. + // This will be triggered by a step. After appropriate backoff. + s.Emitter.Emit(StepReqEvent{}) + case engine.EngineResetConfirmedEvent: + s.onEngineConfirmedReset(x) + case derive.DeriverIdleEvent: + // Once derivation is idle the system is healthy + // and we can wait for new inputs. No backoff necessary. + s.Emitter.Emit(ResetStepBackoffEvent{}) + case derive.DeriverMoreEvent: + // If there is more data to process, + // continue derivation quickly + s.Emitter.Emit(StepReqEvent{ResetBackoff: true}) + case engine.SafeDerivedEvent: + s.onSafeDerivedBlock(x) + default: + return false + } + return true +} + +func (s *SyncDeriver) onSafeDerivedBlock(x engine.SafeDerivedEvent) { + if s.SafeHeadNotifs != nil && s.SafeHeadNotifs.Enabled() { + if err := s.SafeHeadNotifs.SafeHeadUpdated(x.Safe, x.DerivedFrom.ID()); err != nil { + // At this point our state is in a potentially inconsistent state as we've updated the safe head + // in the execution client but failed to post process it. Reset the pipeline so the safe head rolls back + // a little (it always rolls back at least 1 block) and then it will retry storing the entry + s.Emitter.Emit(rollup.ResetEvent{Err: fmt.Errorf("safe head notifications failed: %w", err)}) + } + } +} + +func (s *SyncDeriver) onEngineConfirmedReset(x engine.EngineResetConfirmedEvent) { + // If the listener update fails, we return, + // and don't confirm the engine-reset with the derivation pipeline. + // The pipeline will re-trigger a reset as necessary. + if s.SafeHeadNotifs != nil { + if err := s.SafeHeadNotifs.SafeHeadReset(x.Safe); err != nil { + s.Log.Error("Failed to warn safe-head notifier of safe-head reset", "safe", x.Safe) + return + } + if s.SafeHeadNotifs.Enabled() && x.Safe.ID() == s.Config.Genesis.L2 { + // The rollup genesis block is always safe by definition. So if the pipeline resets this far back we know + // we will process all safe head updates and can record genesis as always safe from L1 genesis. + // Note that it is not safe to use cfg.Genesis.L1 here as it is the block immediately before the L2 genesis + // but the contracts may have been deployed earlier than that, allowing creating a dispute game + // with a L1 head prior to cfg.Genesis.L1 + l1Genesis, err := s.L1.L1BlockRefByNumber(s.Ctx, 0) + if err != nil { + s.Log.Error("Failed to retrieve L1 genesis, cannot notify genesis as safe block", "err", err) + return } - case respCh := <-s.stopSequencer: - if s.driverConfig.SequencerStopped { - respCh <- hashAndError{err: ErrSequencerAlreadyStopped} + if err := s.SafeHeadNotifs.SafeHeadUpdated(x.Safe, l1Genesis.ID()); err != nil { + s.Log.Error("Failed to notify safe-head listener of safe-head", "err", err) + return + } + } + } + s.Emitter.Emit(derive.ConfirmPipelineResetEvent{}) +} + +func (s *SyncDeriver) onResetEvent(x rollup.ResetEvent) { + // If the system corrupts, e.g. due to a reorg, simply reset it + s.Log.Warn("Deriver system is resetting", "err", x.Err) + s.Emitter.Emit(StepReqEvent{}) + s.Emitter.Emit(engine.ResetEngineRequestEvent{}) +} + +// SyncStep performs the sequence of encapsulated syncing steps. +// Warning: this sequence will be broken apart as outlined in op-node derivers design doc. +func (s *SyncDeriver) SyncStep() { + s.Log.Debug("Sync process step") + + drain := func() (ok bool) { + if err := s.Drain(); err != nil { + if errors.Is(err, context.Canceled) { + return false } else { - if err := s.sequencerNotifs.SequencerStopped(); err != nil { - respCh <- hashAndError{err: fmt.Errorf("sequencer start notification: %w", err)} - continue - } - s.log.Warn("Sequencer has been stopped") - s.driverConfig.SequencerStopped = true - // Cancel any inflight block building. If we don't cancel this, we can resume sequencing an old block - // even if we've received new unsafe heads in the interim, causing us to introduce a re-org. - s.sequencer.CancelBuildingBlock(s.driverCtx) - respCh <- hashAndError{hash: s.engineController.UnsafeL2Head().Hash} + s.Emitter.Emit(rollup.CriticalErrorEvent{ + Err: fmt.Errorf("unexpected error on SyncStep event Drain: %w", err)}) + return false } - case respCh := <-s.sequencerActive: - respCh <- !s.driverConfig.SequencerStopped - case <-s.driverCtx.Done(): - return } + return true + } + + if !drain() { + return + } + + s.Emitter.Emit(engine.TryBackupUnsafeReorgEvent{}) + if !drain() { + return + } + + s.Emitter.Emit(engine.TryUpdateEngineEvent{}) + if !drain() { + return + } + + if s.Engine.IsEngineSyncing() { + // The pipeline cannot move forwards if doing EL sync. + s.Log.Debug("Rollup driver is backing off because execution engine is syncing.", + "unsafe_head", s.Engine.UnsafeL2Head()) + s.Emitter.Emit(ResetStepBackoffEvent{}) + return + } + + // Any now processed forkchoice updates will trigger CL-sync payload processing, if any payload is queued up. + + // Since we don't force attributes to be processed at this point, + // we cannot safely directly trigger the derivation, as that may generate new attributes that + // conflict with what attributes have not been applied yet. + // Instead, we request the engine to repeat where its pending-safe head is at. + // Upon the pending-safe signal the attributes deriver can then ask the pipeline + // to generate new attributes, if no attributes are known already. + s.Emitter.Emit(engine.PendingSafeRequestEvent{}) + + // If interop is configured, we have to run the engine events, + // to ensure cross-L2 safety is continuously verified against the interop-backend. + if s.Config.InteropTime != nil { + s.Emitter.Emit(engine.CrossUpdateRequestEvent{}) } } @@ -472,106 +468,40 @@ func (s *Driver) ResetDerivationPipeline(ctx context.Context) error { } func (s *Driver) StartSequencer(ctx context.Context, blockHash common.Hash) error { - if !s.driverConfig.SequencerEnabled { - return errors.New("sequencer is not enabled") - } - if isLeader, err := s.sequencerConductor.Leader(ctx); err != nil { - return fmt.Errorf("sequencer leader check failed: %w", err) - } else if !isLeader { - return errors.New("sequencer is not the leader, aborting.") - } - h := hashAndErrorChannel{ - hash: blockHash, - err: make(chan error, 1), - } - select { - case <-ctx.Done(): - return ctx.Err() - case s.startSequencer <- h: - select { - case <-ctx.Done(): - return ctx.Err() - case e := <-h.err: - return e - } - } + return s.sequencer.Start(ctx, blockHash) } func (s *Driver) StopSequencer(ctx context.Context) (common.Hash, error) { - if !s.driverConfig.SequencerEnabled { - return common.Hash{}, errors.New("sequencer is not enabled") - } - respCh := make(chan hashAndError, 1) - select { - case <-ctx.Done(): - return common.Hash{}, ctx.Err() - case s.stopSequencer <- respCh: - select { - case <-ctx.Done(): - return common.Hash{}, ctx.Err() - case he := <-respCh: - return he.hash, he.err - } - } + return s.sequencer.Stop(ctx) } func (s *Driver) SequencerActive(ctx context.Context) (bool, error) { - if !s.driverConfig.SequencerEnabled { - return false, nil - } - respCh := make(chan bool, 1) - select { - case <-ctx.Done(): - return false, ctx.Err() - case s.sequencerActive <- respCh: - select { - case <-ctx.Done(): - return false, ctx.Err() - case active := <-respCh: - return active, nil - } - } + return s.sequencer.Active(), nil } -// syncStatus returns the current sync status, and should only be called synchronously with -// the driver event loop to avoid retrieval of an inconsistent status. -func (s *Driver) syncStatus() *eth.SyncStatus { - return ð.SyncStatus{ - CurrentL1: s.derivation.Origin(), - CurrentL1Finalized: s.derivation.FinalizedL1(), - HeadL1: s.l1State.L1Head(), - SafeL1: s.l1State.L1Safe(), - FinalizedL1: s.l1State.L1Finalized(), - UnsafeL2: s.engineController.UnsafeL2Head(), - SafeL2: s.engineController.SafeL2Head(), - FinalizedL2: s.engineController.Finalized(), - PendingSafeL2: s.engineController.PendingSafeL2Head(), - } +func (s *Driver) OverrideLeader(ctx context.Context) error { + return s.sequencer.OverrideLeader(ctx) } // SyncStatus blocks the driver event loop and captures the syncing status. -// If the event loop is too busy and the context expires, a context error is returned. func (s *Driver) SyncStatus(ctx context.Context) (*eth.SyncStatus, error) { - wait := make(chan struct{}) - select { - case s.stateReq <- wait: - resp := s.syncStatus() - <-wait - return resp, nil - case <-ctx.Done(): - return nil, ctx.Err() - } + return s.statusTracker.SyncStatus(), nil } // BlockRefWithStatus blocks the driver event loop and captures the syncing status, // along with an L2 block reference by number consistent with that same status. // If the event loop is too busy and the context expires, a context error is returned. func (s *Driver) BlockRefWithStatus(ctx context.Context, num uint64) (eth.L2BlockRef, *eth.SyncStatus, error) { + resp := s.statusTracker.SyncStatus() + if resp.FinalizedL2.Number >= num { // If finalized, we are certain it does not reorg, and don't have to lock. + ref, err := s.L2.L2BlockRefByNumber(ctx, num) + return ref, resp, err + } wait := make(chan struct{}) select { case s.stateReq <- wait: - resp := s.syncStatus() - ref, err := s.l2.L2BlockRefByNumber(ctx, num) + resp := s.statusTracker.SyncStatus() + ref, err := s.L2.L2BlockRefByNumber(ctx, num) <-wait return ref, resp, err case <-ctx.Done(): @@ -579,42 +509,12 @@ func (s *Driver) BlockRefWithStatus(ctx context.Context, num uint64) (eth.L2Bloc } } -// deferJSONString helps avoid a JSON-encoding performance hit if the snapshot logger does not run -type deferJSONString struct { - x any -} - -func (v deferJSONString) String() string { - out, _ := json.Marshal(v.x) - return string(out) -} - -func (s *Driver) snapshot(event string) { - s.snapshotLog.Info("Rollup State Snapshot", - "event", event, - "l1Head", deferJSONString{s.l1State.L1Head()}, - "l1Current", deferJSONString{s.derivation.Origin()}, - "l2Head", deferJSONString{s.engineController.UnsafeL2Head()}, - "l2Safe", deferJSONString{s.engineController.SafeL2Head()}, - "l2FinalizedHead", deferJSONString{s.engineController.Finalized()}) -} - -type hashAndError struct { - hash common.Hash - err error -} - -type hashAndErrorChannel struct { - hash common.Hash - err chan error -} - // checkForGapInUnsafeQueue checks if there is a gap in the unsafe queue and attempts to retrieve the missing payloads from an alt-sync method. // WARNING: This is only an outgoing signal, the blocks are not guaranteed to be retrieved. // Results are received through OnUnsafeL2Payload. func (s *Driver) checkForGapInUnsafeQueue(ctx context.Context) error { - start := s.engineController.UnsafeL2Head() - end := s.derivation.LowestQueuedUnsafeBlock() + start := s.Engine.UnsafeL2Head() + end := s.CLSync.LowestQueuedUnsafeBlock() // Check if we have missing blocks between the start and end. Request them if we do. if end == (eth.L2BlockRef{}) { s.log.Debug("requesting sync with open-end range", "start", start) diff --git a/op-node/rollup/driver/steps.go b/op-node/rollup/driver/steps.go new file mode 100644 index 000000000000..0afe95941249 --- /dev/null +++ b/op-node/rollup/driver/steps.go @@ -0,0 +1,148 @@ +package driver + +import ( + "time" + + "github.com/ethereum/go-ethereum/log" + + "github.com/ethereum-optimism/optimism/op-node/rollup/event" + "github.com/ethereum-optimism/optimism/op-service/retry" +) + +type ResetStepBackoffEvent struct { +} + +func (ev ResetStepBackoffEvent) String() string { + return "reset-step-backoff" +} + +type StepDelayedReqEvent struct { + Delay time.Duration +} + +func (ev StepDelayedReqEvent) String() string { + return "step-delayed-req" +} + +type StepReqEvent struct { + ResetBackoff bool +} + +func (ev StepReqEvent) String() string { + return "step-req" +} + +type StepAttemptEvent struct{} + +func (ev StepAttemptEvent) String() string { + return "step-attempt" +} + +type StepEvent struct{} + +func (ev StepEvent) String() string { + return "step" +} + +// StepSchedulingDeriver is a deriver that emits StepEvent events. +// The deriver can be requested to schedule a step with a StepReqEvent. +// +// It is then up to the caller to translate scheduling into StepAttemptEvent emissions, by waiting for +// NextStep or NextDelayedStep channels (nil if there is nothing to wait for, for channel-merging purposes). +// +// Upon StepAttemptEvent the scheduler will then emit a StepEvent, +// while maintaining backoff state, to not spam steps. +// +// Backoff can be reset by sending a request with StepReqEvent.ResetBackoff +// set to true, or by sending a ResetStepBackoffEvent. +type StepSchedulingDeriver struct { + + // keep track of consecutive failed attempts, to adjust the backoff time accordingly + stepAttempts int + bOffStrategy retry.Strategy + + // channel, nil by default (not firing), but used to schedule re-attempts with delay + delayedStepReq <-chan time.Time + + // stepReqCh is used to request that the driver attempts to step forward by one L1 block. + stepReqCh chan struct{} + + log log.Logger + + emitter event.Emitter +} + +func NewStepSchedulingDeriver(log log.Logger) *StepSchedulingDeriver { + return &StepSchedulingDeriver{ + stepAttempts: 0, + bOffStrategy: retry.Exponential(), + stepReqCh: make(chan struct{}, 1), + delayedStepReq: nil, + log: log, + } +} + +func (s *StepSchedulingDeriver) AttachEmitter(em event.Emitter) { + s.emitter = em +} + +// NextStep is a channel to await, and if triggered, +// the caller should emit a StepAttemptEvent to queue up a step while maintaining backoff. +func (s *StepSchedulingDeriver) NextStep() <-chan struct{} { + return s.stepReqCh +} + +// NextDelayedStep is a temporary channel to await, and if triggered, +// the caller should emit a StepAttemptEvent to queue up a step while maintaining backoff. +// The returned channel may be nil, if there is no requested step with delay scheduled. +func (s *StepSchedulingDeriver) NextDelayedStep() <-chan time.Time { + return s.delayedStepReq +} + +func (s *StepSchedulingDeriver) OnEvent(ev event.Event) bool { + step := func() { + s.delayedStepReq = nil + select { + case s.stepReqCh <- struct{}{}: + // Don't deadlock if the channel is already full + default: + } + } + + switch x := ev.(type) { + case StepDelayedReqEvent: + if s.delayedStepReq == nil { + s.delayedStepReq = time.After(x.Delay) + } + case StepReqEvent: + if x.ResetBackoff { + s.stepAttempts = 0 + } + if s.stepAttempts > 0 { + // if this is not the first attempt, we re-schedule with a backoff, *without blocking other events* + if s.delayedStepReq == nil { + delay := s.bOffStrategy.Duration(s.stepAttempts) + s.log.Debug("scheduling re-attempt with delay", "attempts", s.stepAttempts, "delay", delay) + s.delayedStepReq = time.After(delay) + } else { + s.log.Debug("ignoring step request, already scheduled re-attempt after previous failure", "attempts", s.stepAttempts) + } + } else { + step() + } + case StepAttemptEvent: + // clear the delayed-step channel + s.delayedStepReq = nil + if s.stepAttempts > 0 { + s.log.Debug("Running step retry", "attempts", s.stepAttempts) + } + // count as attempt by default. We reset to 0 if we are making healthy progress. + s.stepAttempts += 1 + s.emitter.Emit(StepEvent{}) + case ResetStepBackoffEvent: + s.stepAttempts = 0 + default: + return false + } + return true +} diff --git a/op-node/rollup/driver/steps_test.go b/op-node/rollup/driver/steps_test.go new file mode 100644 index 000000000000..7deac6636562 --- /dev/null +++ b/op-node/rollup/driver/steps_test.go @@ -0,0 +1,54 @@ +package driver + +import ( + "testing" + + "github.com/stretchr/testify/require" + + "github.com/ethereum/go-ethereum/log" + + "github.com/ethereum-optimism/optimism/op-node/rollup/event" + "github.com/ethereum-optimism/optimism/op-service/testlog" +) + +func TestStepSchedulingDeriver(t *testing.T) { + logger := testlog.Logger(t, log.LevelError) + var queued []event.Event + emitter := event.EmitterFunc(func(ev event.Event) { + queued = append(queued, ev) + }) + sched := NewStepSchedulingDeriver(logger) + sched.AttachEmitter(emitter) + require.Len(t, sched.NextStep(), 0, "start empty") + sched.OnEvent(StepReqEvent{}) + require.Len(t, sched.NextStep(), 1, "take request") + sched.OnEvent(StepReqEvent{}) + require.Len(t, sched.NextStep(), 1, "ignore duplicate request") + require.Empty(t, queued, "only scheduled so far, no step attempts yet") + <-sched.NextStep() + sched.OnEvent(StepAttemptEvent{}) + require.Equal(t, []event.Event{StepEvent{}}, queued, "got step event") + require.Nil(t, sched.NextDelayedStep(), "no delayed steps yet") + sched.OnEvent(StepReqEvent{}) + require.NotNil(t, sched.NextDelayedStep(), "2nd attempt before backoff reset causes delayed step to be scheduled") + sched.OnEvent(StepReqEvent{}) + require.NotNil(t, sched.NextDelayedStep(), "can continue to request attempts") + + sched.OnEvent(StepReqEvent{}) + require.Len(t, sched.NextStep(), 0, "no step requests accepted without delay if backoff is counting") + + sched.OnEvent(StepReqEvent{ResetBackoff: true}) + require.Len(t, sched.NextStep(), 1, "request accepted if backoff is reset") + <-sched.NextStep() + + sched.OnEvent(StepReqEvent{}) + require.Len(t, sched.NextStep(), 1, "no backoff, no attempt has been made yet") + <-sched.NextStep() + sched.OnEvent(StepAttemptEvent{}) + sched.OnEvent(StepReqEvent{}) + require.Len(t, sched.NextStep(), 0, "backoff again") + + sched.OnEvent(ResetStepBackoffEvent{}) + sched.OnEvent(StepReqEvent{}) + require.Len(t, sched.NextStep(), 1, "reset backoff accepted, was able to schedule non-delayed step") +} diff --git a/op-node/rollup/engine/build_cancel.go b/op-node/rollup/engine/build_cancel.go new file mode 100644 index 000000000000..7c9995c28e85 --- /dev/null +++ b/op-node/rollup/engine/build_cancel.go @@ -0,0 +1,34 @@ +package engine + +import ( + "context" + + "github.com/ethereum-optimism/optimism/op-node/rollup" + "github.com/ethereum-optimism/optimism/op-service/eth" +) + +type BuildCancelEvent struct { + Info eth.PayloadInfo + Force bool +} + +func (ev BuildCancelEvent) String() string { + return "build-cancel" +} + +func (eq *EngDeriver) onBuildCancel(ev BuildCancelEvent) { + ctx, cancel := context.WithTimeout(eq.ctx, buildCancelTimeout) + defer cancel() + // the building job gets wrapped up as soon as the payload is retrieved, there's no explicit cancel in the Engine API + eq.log.Warn("cancelling old block building job", "info", ev.Info) + _, err := eq.ec.engine.GetPayload(ctx, ev.Info) + if err != nil { + if x, ok := err.(eth.InputError); ok && x.Code == eth.UnknownPayload { //nolint:all + return // if unknown, then it did not need to be cancelled anymore. + } + eq.log.Error("failed to cancel block building job", "info", ev.Info, "err", err) + if !ev.Force { + eq.emitter.Emit(rollup.EngineTemporaryErrorEvent{Err: err}) + } + } +} diff --git a/op-node/rollup/engine/build_invalid.go b/op-node/rollup/engine/build_invalid.go new file mode 100644 index 000000000000..e684f2de2ead --- /dev/null +++ b/op-node/rollup/engine/build_invalid.go @@ -0,0 +1,63 @@ +package engine + +import ( + "fmt" + + "github.com/ethereum/go-ethereum/core/types" + + "github.com/ethereum-optimism/optimism/op-node/rollup" + "github.com/ethereum-optimism/optimism/op-node/rollup/derive" +) + +// BuildInvalidEvent is an internal engine event, to post-process upon invalid attributes. +// Not for temporary processing problems. +type BuildInvalidEvent struct { + Attributes *derive.AttributesWithParent + Err error +} + +func (ev BuildInvalidEvent) String() string { + return "build-invalid" +} + +// InvalidPayloadAttributesEvent is a signal to external derivers that the attributes were invalid. +type InvalidPayloadAttributesEvent struct { + Attributes *derive.AttributesWithParent + Err error +} + +func (ev InvalidPayloadAttributesEvent) String() string { + return "invalid-payload-attributes" +} + +func (eq *EngDeriver) onBuildInvalid(ev BuildInvalidEvent) { + eq.log.Warn("could not process payload attributes", "err", ev.Err) + + // Count the number of deposits to see if the tx list is deposit only. + depositCount := 0 + for _, tx := range ev.Attributes.Attributes.Transactions { + if len(tx) > 0 && tx[0] == types.DepositTxType { + depositCount += 1 + } + } + // Deposit transaction execution errors are suppressed in the execution engine, but if the + // block is somehow invalid, there is nothing we can do to recover & we should exit. + if len(ev.Attributes.Attributes.Transactions) == depositCount { + eq.log.Error("deposit only block was invalid", "parent", ev.Attributes.Parent, "err", ev.Err) + eq.emitter.Emit(rollup.CriticalErrorEvent{Err: fmt.Errorf("failed to process block with only deposit transactions: %w", ev.Err)}) + return + } + // Revert the pending safe head to the safe head. + eq.ec.SetPendingSafeL2Head(eq.ec.SafeL2Head()) + // suppress the error b/c we want to retry with the next batch from the batch queue + // If there is no valid batch the node will eventually force a deposit only block. If + // the deposit only block fails, this will return the critical error above. + + // Try to restore to previous known unsafe chain. + eq.ec.SetBackupUnsafeL2Head(eq.ec.BackupUnsafeL2Head(), true) + + // drop the payload without inserting it into the engine + + // Signal that we deemed the attributes as unfit + eq.emitter.Emit(InvalidPayloadAttributesEvent(ev)) +} diff --git a/op-node/rollup/engine/build_seal.go b/op-node/rollup/engine/build_seal.go new file mode 100644 index 000000000000..a5c72c74fdb7 --- /dev/null +++ b/op-node/rollup/engine/build_seal.go @@ -0,0 +1,121 @@ +package engine + +import ( + "context" + "fmt" + "time" + + "github.com/ethereum-optimism/optimism/op-node/rollup/derive" + "github.com/ethereum-optimism/optimism/op-service/eth" +) + +// PayloadSealInvalidEvent identifies a permanent in-consensus problem with the payload sealing. +type PayloadSealInvalidEvent struct { + Info eth.PayloadInfo + Err error + + IsLastInSpan bool + DerivedFrom eth.L1BlockRef +} + +func (ev PayloadSealInvalidEvent) String() string { + return "payload-seal-invalid" +} + +// PayloadSealExpiredErrorEvent identifies a form of failed payload-sealing that is not coupled +// to the attributes themselves, but rather the build-job process. +// The user should re-attempt by starting a new build process. The payload-sealing job should not be re-attempted, +// as it most likely expired, timed out, or referenced an otherwise invalidated block-building job identifier. +type PayloadSealExpiredErrorEvent struct { + Info eth.PayloadInfo + Err error + + IsLastInSpan bool + DerivedFrom eth.L1BlockRef +} + +func (ev PayloadSealExpiredErrorEvent) String() string { + return "payload-seal-expired-error" +} + +type BuildSealEvent struct { + Info eth.PayloadInfo + BuildStarted time.Time + // if payload should be promoted to safe (must also be pending safe, see DerivedFrom) + IsLastInSpan bool + // payload is promoted to pending-safe if non-zero + DerivedFrom eth.L1BlockRef +} + +func (ev BuildSealEvent) String() string { + return "build-seal" +} + +func (eq *EngDeriver) onBuildSeal(ev BuildSealEvent) { + ctx, cancel := context.WithTimeout(eq.ctx, buildSealTimeout) + defer cancel() + + sealingStart := time.Now() + envelope, err := eq.ec.engine.GetPayload(ctx, ev.Info) + if err != nil { + if x, ok := err.(eth.InputError); ok && x.Code == eth.UnknownPayload { //nolint:all + eq.log.Warn("Cannot seal block, payload ID is unknown", + "payloadID", ev.Info.ID, "payload_time", ev.Info.Timestamp, + "started_time", ev.BuildStarted) + } + // Although the engine will very likely not be able to continue from here with the same building job, + // we still call it "temporary", since the exact same payload-attributes have not been invalidated in-consensus. + // So the user (attributes-handler or sequencer) should be able to re-attempt the exact + // same attributes with a new block-building job from here to recover from this error. + // We name it "expired", as this generally identifies a timeout, unknown job, or otherwise invalidated work. + eq.emitter.Emit(PayloadSealExpiredErrorEvent{ + Info: ev.Info, + Err: fmt.Errorf("failed to seal execution payload (ID: %s): %w", ev.Info.ID, err), + IsLastInSpan: ev.IsLastInSpan, + DerivedFrom: ev.DerivedFrom, + }) + return + } + + if err := sanityCheckPayload(envelope.ExecutionPayload); err != nil { + eq.emitter.Emit(PayloadSealInvalidEvent{ + Info: ev.Info, + Err: fmt.Errorf("failed sanity-check of execution payload contents (ID: %s, blockhash: %s): %w", + ev.Info.ID, envelope.ExecutionPayload.BlockHash, err), + IsLastInSpan: ev.IsLastInSpan, + DerivedFrom: ev.DerivedFrom, + }) + return + } + + ref, err := derive.PayloadToBlockRef(eq.cfg, envelope.ExecutionPayload) + if err != nil { + eq.emitter.Emit(PayloadSealInvalidEvent{ + Info: ev.Info, + Err: fmt.Errorf("failed to decode L2 block ref from payload: %w", err), + IsLastInSpan: ev.IsLastInSpan, + DerivedFrom: ev.DerivedFrom, + }) + return + } + + now := time.Now() + sealTime := now.Sub(sealingStart) + buildTime := now.Sub(ev.BuildStarted) + eq.metrics.RecordSequencerSealingTime(sealTime) + eq.metrics.RecordSequencerBuildingDiffTime(buildTime - time.Duration(eq.cfg.BlockTime)*time.Second) + + txnCount := len(envelope.ExecutionPayload.Transactions) + eq.metrics.CountSequencedTxs(txnCount) + + eq.log.Debug("Processed new L2 block", "l2_unsafe", ref, "l1_origin", ref.L1Origin, + "txs", txnCount, "time", ref.Time, "seal_time", sealTime, "build_time", buildTime) + + eq.emitter.Emit(BuildSealedEvent{ + IsLastInSpan: ev.IsLastInSpan, + DerivedFrom: ev.DerivedFrom, + Info: ev.Info, + Envelope: envelope, + Ref: ref, + }) +} diff --git a/op-node/rollup/engine/build_sealed.go b/op-node/rollup/engine/build_sealed.go new file mode 100644 index 000000000000..d588d77b7f22 --- /dev/null +++ b/op-node/rollup/engine/build_sealed.go @@ -0,0 +1,34 @@ +package engine + +import ( + "github.com/ethereum-optimism/optimism/op-service/eth" +) + +// BuildSealedEvent is emitted by the engine when a payload finished building, +// but is not locally inserted as canonical block yet +type BuildSealedEvent struct { + // if payload should be promoted to safe (must also be pending safe, see DerivedFrom) + IsLastInSpan bool + // payload is promoted to pending-safe if non-zero + DerivedFrom eth.L1BlockRef + + Info eth.PayloadInfo + Envelope *eth.ExecutionPayloadEnvelope + Ref eth.L2BlockRef +} + +func (ev BuildSealedEvent) String() string { + return "build-sealed" +} + +func (eq *EngDeriver) onBuildSealed(ev BuildSealedEvent) { + // If a (pending) safe block, immediately process the block + if ev.DerivedFrom != (eth.L1BlockRef{}) { + eq.emitter.Emit(PayloadProcessEvent{ + IsLastInSpan: ev.IsLastInSpan, + DerivedFrom: ev.DerivedFrom, + Envelope: ev.Envelope, + Ref: ev.Ref, + }) + } +} diff --git a/op-node/rollup/engine/build_start.go b/op-node/rollup/engine/build_start.go new file mode 100644 index 000000000000..22c178d36cd0 --- /dev/null +++ b/op-node/rollup/engine/build_start.go @@ -0,0 +1,75 @@ +package engine + +import ( + "context" + "fmt" + "time" + + "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" +) + +type BuildStartEvent struct { + Attributes *derive.AttributesWithParent +} + +func (ev BuildStartEvent) String() string { + return "build-start" +} + +func (eq *EngDeriver) onBuildStart(ev BuildStartEvent) { + ctx, cancel := context.WithTimeout(eq.ctx, buildStartTimeout) + defer cancel() + + if ev.Attributes.DerivedFrom != (eth.L1BlockRef{}) && + eq.ec.PendingSafeL2Head().Hash != ev.Attributes.Parent.Hash { + // Warn about small reorgs, happens when pending safe head is getting rolled back + eq.log.Warn("block-attributes derived from L1 do not build on pending safe head, likely reorg", + "pending_safe", eq.ec.PendingSafeL2Head(), "attributes_parent", ev.Attributes.Parent) + } + + fcEvent := ForkchoiceUpdateEvent{ + UnsafeL2Head: ev.Attributes.Parent, + SafeL2Head: eq.ec.safeHead, + FinalizedL2Head: eq.ec.finalizedHead, + } + if fcEvent.UnsafeL2Head.Number < fcEvent.FinalizedL2Head.Number { + err := fmt.Errorf("invalid block-building pre-state, unsafe head %s is behind finalized head %s", fcEvent.UnsafeL2Head, fcEvent.FinalizedL2Head) + eq.emitter.Emit(rollup.CriticalErrorEvent{Err: err}) // make the node exit, things are very wrong. + return + } + fc := eth.ForkchoiceState{ + HeadBlockHash: fcEvent.UnsafeL2Head.Hash, + SafeBlockHash: fcEvent.SafeL2Head.Hash, + FinalizedBlockHash: fcEvent.FinalizedL2Head.Hash, + } + buildStartTime := time.Now() + id, errTyp, err := startPayload(ctx, eq.ec.engine, fc, ev.Attributes.Attributes) + if err != nil { + switch errTyp { + case BlockInsertTemporaryErr: + // RPC errors are recoverable, we can retry the buffered payload attributes later. + eq.emitter.Emit(rollup.EngineTemporaryErrorEvent{Err: fmt.Errorf("temporarily cannot insert new safe block: %w", err)}) + return + case BlockInsertPrestateErr: + eq.emitter.Emit(rollup.ResetEvent{Err: fmt.Errorf("need reset to resolve pre-state problem: %w", err)}) + return + case BlockInsertPayloadErr: + eq.emitter.Emit(BuildInvalidEvent{Attributes: ev.Attributes, Err: err}) + return + default: + eq.emitter.Emit(rollup.CriticalErrorEvent{Err: fmt.Errorf("unknown error type %d: %w", errTyp, err)}) + return + } + } + eq.emitter.Emit(fcEvent) + + eq.emitter.Emit(BuildStartedEvent{ + Info: eth.PayloadInfo{ID: id, Timestamp: uint64(ev.Attributes.Attributes.Timestamp)}, + BuildStarted: buildStartTime, + IsLastInSpan: ev.Attributes.IsLastInSpan, + DerivedFrom: ev.Attributes.DerivedFrom, + Parent: ev.Attributes.Parent, + }) +} diff --git a/op-node/rollup/engine/build_started.go b/op-node/rollup/engine/build_started.go new file mode 100644 index 000000000000..78b737d214c7 --- /dev/null +++ b/op-node/rollup/engine/build_started.go @@ -0,0 +1,36 @@ +package engine + +import ( + "time" + + "github.com/ethereum-optimism/optimism/op-service/eth" +) + +type BuildStartedEvent struct { + Info eth.PayloadInfo + + BuildStarted time.Time + + Parent eth.L2BlockRef + + // if payload should be promoted to safe (must also be pending safe, see DerivedFrom) + IsLastInSpan bool + // payload is promoted to pending-safe if non-zero + DerivedFrom eth.L1BlockRef +} + +func (ev BuildStartedEvent) String() string { + return "build-started" +} + +func (eq *EngDeriver) onBuildStarted(ev BuildStartedEvent) { + // If a (pending) safe block, immediately seal the block + if ev.DerivedFrom != (eth.L1BlockRef{}) { + eq.emitter.Emit(BuildSealEvent{ + Info: ev.Info, + BuildStarted: ev.BuildStarted, + IsLastInSpan: ev.IsLastInSpan, + DerivedFrom: ev.DerivedFrom, + }) + } +} diff --git a/op-node/rollup/engine/engine_controller.go b/op-node/rollup/engine/engine_controller.go new file mode 100644 index 000000000000..64fe944f140a --- /dev/null +++ b/op-node/rollup/engine/engine_controller.go @@ -0,0 +1,478 @@ +package engine + +import ( + "context" + "errors" + "fmt" + "time" + + "github.com/ethereum/go-ethereum" + "github.com/ethereum/go-ethereum/common" + "github.com/ethereum/go-ethereum/log" + + "github.com/ethereum-optimism/optimism/op-node/rollup" + "github.com/ethereum-optimism/optimism/op-node/rollup/derive" + "github.com/ethereum-optimism/optimism/op-node/rollup/event" + "github.com/ethereum-optimism/optimism/op-node/rollup/sync" + "github.com/ethereum-optimism/optimism/op-service/clock" + "github.com/ethereum-optimism/optimism/op-service/eth" +) + +type syncStatusEnum int + +const ( + syncStatusCL syncStatusEnum = iota + // We transition between the 4 EL states linearly. We spend the majority of the time in the second & fourth. + // We only want to EL sync if there is no finalized block & once we finish EL sync we need to mark the last block + // as finalized so we can switch to consolidation + // TODO(protocol-quest#91): We can restart EL sync & still consolidate if there finalized blocks on the execution client if the + // execution client is running in archive mode. In some cases we may want to switch back from CL to EL sync, but that is complicated. + syncStatusWillStartEL // First if we are directed to EL sync, check that nothing has been finalized yet + syncStatusStartedEL // Perform our EL sync + syncStatusFinishedELButNotFinalized // EL sync is done, but we need to mark the final sync block as finalized + syncStatusFinishedEL // EL sync is done & we should be performing consolidation +) + +var ErrNoFCUNeeded = errors.New("no FCU call was needed") + +type ExecEngine interface { + GetPayload(ctx context.Context, payloadInfo eth.PayloadInfo) (*eth.ExecutionPayloadEnvelope, error) + ForkchoiceUpdate(ctx context.Context, state *eth.ForkchoiceState, attr *eth.PayloadAttributes) (*eth.ForkchoiceUpdatedResult, error) + NewPayload(ctx context.Context, payload *eth.ExecutionPayload, parentBeaconBlockRoot *common.Hash) (*eth.PayloadStatusV1, error) + L2BlockRefByLabel(ctx context.Context, label eth.BlockLabel) (eth.L2BlockRef, error) +} + +type DACClient interface { + UploadBlobs(context.Context, *eth.ExecutionPayloadEnvelope) error +} + +type EngineController struct { + engine ExecEngine // Underlying execution engine RPC + log log.Logger + metrics derive.Metrics + syncCfg *sync.Config + syncStatus syncStatusEnum + chainSpec *rollup.ChainSpec + rollupCfg *rollup.Config + elStart time.Time + clock clock.Clock + + emitter event.Emitter + + // Block Head State + unsafeHead eth.L2BlockRef + // Cross-verified unsafeHead, always equal to unsafeHead pre-interop + crossUnsafeHead eth.L2BlockRef + // Pending localSafeHead + // L2 block processed from the middle of a span batch, + // but not marked as the safe block yet. + pendingSafeHead eth.L2BlockRef + // Derived from L1, and known to be a completed span-batch, + // but not cross-verified yet. + localSafeHead eth.L2BlockRef + // Derived from L1 and cross-verified to have cross-safe dependencies. + safeHead eth.L2BlockRef + // Derived from finalized L1 data, + // and cross-verified to only have finalized dependencies. + finalizedHead eth.L2BlockRef + // The unsafe head to roll back to, + // after the pendingSafeHead fails to become safe. + // This is changing in the Holocene fork. + backupUnsafeHead eth.L2BlockRef + + needFCUCall bool + // Track when the rollup node changes the forkchoice to restore previous + // known unsafe chain. e.g. Unsafe Reorg caused by Invalid span batch. + // This update does not retry except engine returns non-input error + // because engine may forgot backupUnsafeHead or backupUnsafeHead is not part + // of the chain. + needFCUCallForBackupUnsafeReorg bool +} + +func NewEngineController(engine ExecEngine, log log.Logger, metrics derive.Metrics, + rollupCfg *rollup.Config, syncCfg *sync.Config, emitter event.Emitter) *EngineController { + syncStatus := syncStatusCL + if syncCfg.SyncMode == sync.ELSync { + syncStatus = syncStatusWillStartEL + } + + return &EngineController{ + engine: engine, + log: log, + metrics: metrics, + chainSpec: rollup.NewChainSpec(rollupCfg), + rollupCfg: rollupCfg, + syncCfg: syncCfg, + syncStatus: syncStatus, + clock: clock.SystemClock, + emitter: emitter, + } +} + +// State Getters + +func (e *EngineController) UnsafeL2Head() eth.L2BlockRef { + return e.unsafeHead +} + +func (e *EngineController) CrossUnsafeL2Head() eth.L2BlockRef { + return e.crossUnsafeHead +} + +func (e *EngineController) PendingSafeL2Head() eth.L2BlockRef { + return e.pendingSafeHead +} + +func (e *EngineController) LocalSafeL2Head() eth.L2BlockRef { + return e.localSafeHead +} + +func (e *EngineController) SafeL2Head() eth.L2BlockRef { + return e.safeHead +} + +func (e *EngineController) Finalized() eth.L2BlockRef { + return e.finalizedHead +} + +func (e *EngineController) BackupUnsafeL2Head() eth.L2BlockRef { + return e.backupUnsafeHead +} + +func (e *EngineController) IsEngineSyncing() bool { + return e.syncStatus == syncStatusWillStartEL || e.syncStatus == syncStatusStartedEL || e.syncStatus == syncStatusFinishedELButNotFinalized +} + +// Setters + +// SetFinalizedHead implements LocalEngineControl. +func (e *EngineController) SetFinalizedHead(r eth.L2BlockRef) { + e.metrics.RecordL2Ref("l2_finalized", r) + e.finalizedHead = r + e.needFCUCall = true +} + +// SetPendingSafeL2Head implements LocalEngineControl. +func (e *EngineController) SetPendingSafeL2Head(r eth.L2BlockRef) { + e.metrics.RecordL2Ref("l2_pending_safe", r) + e.pendingSafeHead = r +} + +// SetLocalSafeHead sets the local-safe head. +func (e *EngineController) SetLocalSafeHead(r eth.L2BlockRef) { + e.metrics.RecordL2Ref("l2_local_safe", r) + e.localSafeHead = r +} + +// SetSafeHead sets the cross-safe head. +func (e *EngineController) SetSafeHead(r eth.L2BlockRef) { + e.metrics.RecordL2Ref("l2_safe", r) + e.safeHead = r + e.needFCUCall = true +} + +// SetUnsafeHead sets the local-unsafe head. +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) +} + +// SetCrossUnsafeHead the cross-unsafe head. +func (e *EngineController) SetCrossUnsafeHead(r eth.L2BlockRef) { + e.metrics.RecordL2Ref("l2_cross_unsafe", r) + e.crossUnsafeHead = r +} + +// SetBackupUnsafeL2Head implements LocalEngineControl. +func (e *EngineController) SetBackupUnsafeL2Head(r eth.L2BlockRef, triggerReorg bool) { + e.metrics.RecordL2Ref("l2_backup_unsafe", r) + e.backupUnsafeHead = r + e.needFCUCallForBackupUnsafeReorg = triggerReorg +} + +// logSyncProgressMaybe helps log forkchoice state-changes when applicable. +// First, the pre-state is registered. +// A callback is returned to then log the changes to the pre-state, if any. +func (e *EngineController) logSyncProgressMaybe() func() { + prevFinalized := e.finalizedHead + prevSafe := e.safeHead + prevPendingSafe := e.pendingSafeHead + prevUnsafe := e.unsafeHead + prevBackupUnsafe := e.backupUnsafeHead + return func() { + // if forkchoice still needs to be updated, then the last change was unsuccessful, thus no progress to log. + if e.needFCUCall || e.needFCUCallForBackupUnsafeReorg { + return + } + var reason string + if prevFinalized != e.finalizedHead { + reason = "finalized block" + } else if prevSafe != e.safeHead { + if prevSafe == prevUnsafe { + reason = "derived safe block from L1" + } else { + reason = "consolidated block with L1" + } + } else if prevUnsafe != e.unsafeHead { + reason = "new chain head block" + } else if prevPendingSafe != e.pendingSafeHead { + reason = "pending new safe block" + } else if prevBackupUnsafe != e.backupUnsafeHead { + reason = "new backup unsafe block" + } + if reason != "" { + e.log.Info("Sync progress", + "reason", reason, + "l2_finalized", e.finalizedHead, + "l2_safe", e.safeHead, + "l2_pending_safe", e.pendingSafeHead, + "l2_unsafe", e.unsafeHead, + "l2_backup_unsafe", e.backupUnsafeHead, + "l2_time", e.UnsafeL2Head().Time, + ) + } + } +} + +// Misc Setters only used by the engine queue + +// checkNewPayloadStatus checks returned status of engine_newPayloadV1 request for next unsafe payload. +// It returns true if the status is acceptable. +func (e *EngineController) checkNewPayloadStatus(status eth.ExecutePayloadStatus) bool { + if e.syncCfg.SyncMode == sync.ELSync { + if status == eth.ExecutionValid && e.syncStatus == syncStatusStartedEL { + e.syncStatus = syncStatusFinishedELButNotFinalized + } + // Allow SYNCING and ACCEPTED if engine EL sync is enabled + return status == eth.ExecutionValid || status == eth.ExecutionSyncing || status == eth.ExecutionAccepted + } + return status == eth.ExecutionValid +} + +// checkForkchoiceUpdatedStatus checks returned status of engine_forkchoiceUpdatedV1 request for next unsafe payload. +// It returns true if the status is acceptable. +func (e *EngineController) checkForkchoiceUpdatedStatus(status eth.ExecutePayloadStatus) bool { + if e.syncCfg.SyncMode == sync.ELSync { + if status == eth.ExecutionValid && e.syncStatus == syncStatusStartedEL { + e.syncStatus = syncStatusFinishedELButNotFinalized + } + // Allow SYNCING if engine P2P sync is enabled + return status == eth.ExecutionValid || status == eth.ExecutionSyncing + } + return status == eth.ExecutionValid +} + +// TryUpdateEngine attempts to update the engine with the current forkchoice state of the rollup node, +// this is a no-op if the nodes already agree on the forkchoice state. +func (e *EngineController) TryUpdateEngine(ctx context.Context) error { + if !e.needFCUCall { + return ErrNoFCUNeeded + } + if e.IsEngineSyncing() { + e.log.Warn("Attempting to update forkchoice state while EL syncing") + } + if e.unsafeHead.Number < e.finalizedHead.Number { + err := fmt.Errorf("invalid forkchoice state, unsafe head %s is behind finalized head %s", e.unsafeHead, e.finalizedHead) + e.emitter.Emit(rollup.CriticalErrorEvent{Err: err}) // make the node exit, things are very wrong. + return err + } + fc := eth.ForkchoiceState{ + HeadBlockHash: e.unsafeHead.Hash, + SafeBlockHash: e.safeHead.Hash, + FinalizedBlockHash: e.finalizedHead.Hash, + } + logFn := e.logSyncProgressMaybe() + defer logFn() + fcRes, err := e.engine.ForkchoiceUpdate(ctx, &fc, nil) + if err != nil { + var inputErr eth.InputError + if errors.As(err, &inputErr) { + switch inputErr.Code { + case eth.InvalidForkchoiceState: + return derive.NewResetError(fmt.Errorf("forkchoice update was inconsistent with engine, need reset to resolve: %w", inputErr.Unwrap())) + default: + return derive.NewTemporaryError(fmt.Errorf("unexpected error code in forkchoice-updated response: %w", err)) + } + } else { + return derive.NewTemporaryError(fmt.Errorf("failed to sync forkchoice with engine: %w", err)) + } + } + if fcRes.PayloadStatus.Status == eth.ExecutionValid { + e.emitter.Emit(ForkchoiceUpdateEvent{ + UnsafeL2Head: e.unsafeHead, + SafeL2Head: e.safeHead, + FinalizedL2Head: e.finalizedHead, + }) + } + if e.unsafeHead == e.safeHead && e.safeHead == e.pendingSafeHead { + // Remove backupUnsafeHead because this backup will be never used after consolidation. + e.SetBackupUnsafeL2Head(eth.L2BlockRef{}, false) + } + e.needFCUCall = false + return nil +} + +func (e *EngineController) InsertUnsafePayload(ctx context.Context, envelope *eth.ExecutionPayloadEnvelope, ref eth.L2BlockRef) error { + // 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) + rollupGenesisIsFinalized := b.Hash == e.rollupCfg.Genesis.L2.Hash + if errors.Is(err, ethereum.NotFound) || rollupGenesisIsFinalized || e.syncCfg.SupportsPostFinalizationELSync { + e.syncStatus = syncStatusStartedEL + e.log.Info("Starting EL sync") + e.elStart = e.clock.Now() + } else if err == nil { + e.syncStatus = syncStatusFinishedEL + e.log.Info("Skipping EL sync and going straight to CL sync because there is a finalized block", "id", b.ID()) + return nil + } else { + return derive.NewTemporaryError(fmt.Errorf("failed to fetch finalized head: %w", err)) + } + } + // Insert the payload & then call FCU + status, err := e.engine.NewPayload(ctx, envelope.ExecutionPayload, envelope.ParentBeaconBlockRoot) + if err != nil { + return derive.NewTemporaryError(fmt.Errorf("failed to update insert payload: %w", err)) + } + if status.Status == eth.ExecutionInvalid { + e.emitter.Emit(PayloadInvalidEvent{Envelope: envelope, Err: eth.NewPayloadErr(envelope.ExecutionPayload, status)}) + } + if !e.checkNewPayloadStatus(status.Status) { + payload := envelope.ExecutionPayload + return derive.NewTemporaryError(fmt.Errorf("cannot process unsafe payload: new - %v; parent: %v; err: %w", + payload.ID(), payload.ParentID(), eth.NewPayloadErr(payload, status))) + } + + // Mark the new payload as valid + fc := eth.ForkchoiceState{ + HeadBlockHash: envelope.ExecutionPayload.BlockHash, + SafeBlockHash: e.safeHead.Hash, + FinalizedBlockHash: e.finalizedHead.Hash, + } + if e.syncStatus == syncStatusFinishedELButNotFinalized { + fc.SafeBlockHash = envelope.ExecutionPayload.BlockHash + fc.FinalizedBlockHash = envelope.ExecutionPayload.BlockHash + e.SetUnsafeHead(ref) // ensure that the unsafe head stays ahead of safe/finalized labels. + e.emitter.Emit(UnsafeUpdateEvent{Ref: ref}) + e.SetLocalSafeHead(ref) + e.SetSafeHead(ref) + e.emitter.Emit(CrossSafeUpdateEvent{LocalSafe: ref, CrossSafe: ref}) + e.SetFinalizedHead(ref) + } + logFn := e.logSyncProgressMaybe() + defer logFn() + fcRes, err := e.engine.ForkchoiceUpdate(ctx, &fc, nil) + if err != nil { + var inputErr eth.InputError + if errors.As(err, &inputErr) { + switch inputErr.Code { + case eth.InvalidForkchoiceState: + return derive.NewResetError(fmt.Errorf("pre-unsafe-block forkchoice update was inconsistent with engine, need reset to resolve: %w", inputErr.Unwrap())) + default: + return derive.NewTemporaryError(fmt.Errorf("unexpected error code in forkchoice-updated response: %w", err)) + } + } else { + return derive.NewTemporaryError(fmt.Errorf("failed to update forkchoice to prepare for new unsafe payload: %w", err)) + } + } + if !e.checkForkchoiceUpdatedStatus(fcRes.PayloadStatus.Status) { + payload := envelope.ExecutionPayload + return derive.NewTemporaryError(fmt.Errorf("cannot prepare unsafe chain for new payload: new - %v; parent: %v; err: %w", + payload.ID(), payload.ParentID(), eth.ForkchoiceUpdateErr(fcRes.PayloadStatus))) + } + e.SetUnsafeHead(ref) + e.needFCUCall = false + e.emitter.Emit(UnsafeUpdateEvent{Ref: ref}) + + if e.syncStatus == syncStatusFinishedELButNotFinalized { + e.log.Info("Finished EL sync", "sync_duration", e.clock.Since(e.elStart), "finalized_block", ref.ID().String()) + e.syncStatus = syncStatusFinishedEL + } + + if fcRes.PayloadStatus.Status == eth.ExecutionValid { + e.emitter.Emit(ForkchoiceUpdateEvent{ + UnsafeL2Head: e.unsafeHead, + SafeL2Head: e.safeHead, + FinalizedL2Head: e.finalizedHead, + }) + } + + return nil +} + +// shouldTryBackupUnsafeReorg checks reorging(restoring) unsafe head to backupUnsafeHead is needed. +// Returns boolean which decides to trigger FCU. +func (e *EngineController) shouldTryBackupUnsafeReorg() bool { + if !e.needFCUCallForBackupUnsafeReorg { + return false + } + // This method must be never called when EL sync. If EL sync is in progress, early return. + if e.IsEngineSyncing() { + e.log.Warn("Attempting to unsafe reorg using backupUnsafe while EL syncing") + return false + } + if e.BackupUnsafeL2Head() == (eth.L2BlockRef{}) { // sanity check backupUnsafeHead is there + e.log.Warn("Attempting to unsafe reorg using backupUnsafe even though it is empty") + e.SetBackupUnsafeL2Head(eth.L2BlockRef{}, false) + return false + } + return true +} + +// TryBackupUnsafeReorg attempts to reorg(restore) unsafe head to backupUnsafeHead. +// If succeeds, update current forkchoice state to the rollup node. +func (e *EngineController) TryBackupUnsafeReorg(ctx context.Context) (bool, error) { + if !e.shouldTryBackupUnsafeReorg() { + // Do not need to perform FCU. + return false, nil + } + // Only try FCU once because execution engine may forgot backupUnsafeHead + // or backupUnsafeHead is not part of the chain. + // Exception: Retry when forkChoiceUpdate returns non-input error. + e.needFCUCallForBackupUnsafeReorg = false + // Reorg unsafe chain. Safe/Finalized chain will not be updated. + e.log.Warn("trying to restore unsafe head", "backupUnsafe", e.backupUnsafeHead.ID(), "unsafe", e.unsafeHead.ID()) + fc := eth.ForkchoiceState{ + HeadBlockHash: e.backupUnsafeHead.Hash, + SafeBlockHash: e.safeHead.Hash, + FinalizedBlockHash: e.finalizedHead.Hash, + } + logFn := e.logSyncProgressMaybe() + defer logFn() + fcRes, err := e.engine.ForkchoiceUpdate(ctx, &fc, nil) + if err != nil { + var inputErr eth.InputError + if errors.As(err, &inputErr) { + e.SetBackupUnsafeL2Head(eth.L2BlockRef{}, false) + switch inputErr.Code { + case eth.InvalidForkchoiceState: + return true, derive.NewResetError(fmt.Errorf("forkchoice update was inconsistent with engine, need reset to resolve: %w", inputErr.Unwrap())) + default: + return true, derive.NewTemporaryError(fmt.Errorf("unexpected error code in forkchoice-updated response: %w", err)) + } + } else { + // Retry when forkChoiceUpdate returns non-input error. + // Do not reset backupUnsafeHead because it will be used again. + e.needFCUCallForBackupUnsafeReorg = true + return true, derive.NewTemporaryError(fmt.Errorf("failed to sync forkchoice with engine: %w", err)) + } + } + if fcRes.PayloadStatus.Status == eth.ExecutionValid { + e.emitter.Emit(ForkchoiceUpdateEvent{ + UnsafeL2Head: e.backupUnsafeHead, + SafeL2Head: e.safeHead, + FinalizedL2Head: e.finalizedHead, + }) + // Execution engine accepted the reorg. + e.log.Info("successfully reorged unsafe head using backupUnsafe", "unsafe", e.backupUnsafeHead.ID()) + e.SetUnsafeHead(e.BackupUnsafeL2Head()) + e.SetBackupUnsafeL2Head(eth.L2BlockRef{}, false) + return true, nil + } + e.SetBackupUnsafeL2Head(eth.L2BlockRef{}, false) + // Execution engine could not reorg back to previous unsafe head. + return true, derive.NewTemporaryError(fmt.Errorf("cannot restore unsafe chain using backupUnsafe: err: %w", + eth.ForkchoiceUpdateErr(fcRes.PayloadStatus))) +} diff --git a/op-node/rollup/engine/engine_kind.go b/op-node/rollup/engine/engine_kind.go new file mode 100644 index 000000000000..aa218cd73d14 --- /dev/null +++ b/op-node/rollup/engine/engine_kind.go @@ -0,0 +1,54 @@ +package engine + +import "fmt" + +// Kind identifies the engine client's kind, used to control the behavior of optimism in different engine clients. +type Kind string + +const ( + Geth Kind = "geth" + Reth Kind = "reth" + Erigon Kind = "erigon" +) + +var Kinds = []Kind{ + Geth, + Reth, + Erigon, +} + +func (kind Kind) String() string { + return string(kind) +} + +func (kind *Kind) Set(value string) error { + if !ValidEngineKind(Kind(value)) { + return fmt.Errorf("unknown engine client kind: %q", value) + } + *kind = Kind(value) + return nil +} + +func (kind *Kind) Clone() any { + cpy := *kind + return &cpy +} + +func (kind Kind) SupportsPostFinalizationELSync() bool { + switch kind { + case Geth: + return false + case Erigon, Reth: + return true + } + return false +} + +func ValidEngineKind(value Kind) bool { + for _, k := range Kinds { + if k == value { + return true + } + } + return false +} diff --git a/op-node/rollup/engine/engine_reset.go b/op-node/rollup/engine/engine_reset.go new file mode 100644 index 000000000000..a3e901eb2619 --- /dev/null +++ b/op-node/rollup/engine/engine_reset.go @@ -0,0 +1,67 @@ +package engine + +import ( + "context" + "fmt" + + "github.com/ethereum/go-ethereum/log" + + "github.com/ethereum-optimism/optimism/op-node/rollup" + "github.com/ethereum-optimism/optimism/op-node/rollup/event" + "github.com/ethereum-optimism/optimism/op-node/rollup/sync" +) + +// ResetEngineRequestEvent requests the EngineResetDeriver to walk +// the L2 chain backwards until it finds a plausible unsafe head, +// and find an L2 safe block that is guaranteed to still be from the L1 chain. +type ResetEngineRequestEvent struct{} + +func (ev ResetEngineRequestEvent) String() string { + return "reset-engine-request" +} + +type EngineResetDeriver struct { + ctx context.Context + log log.Logger + cfg *rollup.Config + l1 sync.L1Chain + l2 sync.L2Chain + syncCfg *sync.Config + + emitter event.Emitter +} + +func NewEngineResetDeriver(ctx context.Context, log log.Logger, cfg *rollup.Config, + l1 sync.L1Chain, l2 sync.L2Chain, syncCfg *sync.Config) *EngineResetDeriver { + return &EngineResetDeriver{ + ctx: ctx, + log: log, + cfg: cfg, + l1: l1, + l2: l2, + syncCfg: syncCfg, + } +} + +func (d *EngineResetDeriver) AttachEmitter(em event.Emitter) { + d.emitter = em +} + +func (d *EngineResetDeriver) OnEvent(ev event.Event) bool { + switch ev.(type) { + case ResetEngineRequestEvent: + result, err := sync.FindL2Heads(d.ctx, d.cfg, d.l1, d.l2, d.log, d.syncCfg) + if err != nil { + d.emitter.Emit(rollup.ResetEvent{Err: fmt.Errorf("failed to find the L2 Heads to start from: %w", err)}) + return true + } + d.emitter.Emit(ForceEngineResetEvent{ + Unsafe: result.Unsafe, + Safe: result.Safe, + Finalized: result.Finalized, + }) + default: + return false + } + return true +} diff --git a/op-node/rollup/engine/engine_update.go b/op-node/rollup/engine/engine_update.go new file mode 100644 index 000000000000..c79dbdcd0f4d --- /dev/null +++ b/op-node/rollup/engine/engine_update.go @@ -0,0 +1,121 @@ +package engine + +import ( + "context" + "errors" + "fmt" + + "github.com/ethereum-optimism/optimism/op-service/eth" + "github.com/ethereum/go-ethereum/core/types" +) + +// isDepositTx checks an opaqueTx to determine if it is a Deposit Transaction +// It has to return an error in the case the transaction is empty +func isDepositTx(opaqueTx eth.Data) (bool, error) { + if len(opaqueTx) == 0 { + return false, errors.New("empty transaction") + } + return opaqueTx[0] == types.DepositTxType, nil +} + +// lastDeposit finds the index of last deposit at the start of the transactions. +// It walks the transactions from the start until it finds a non-deposit tx. +// An error is returned if any looked at transaction cannot be decoded +func lastDeposit(txns []eth.Data) (int, error) { + var lastDeposit int + for i, tx := range txns { + deposit, err := isDepositTx(tx) + if err != nil { + return 0, fmt.Errorf("invalid transaction at idx %d", i) + } + if deposit { + lastDeposit = i + } else { + break + } + } + return lastDeposit, nil +} + +func sanityCheckPayload(payload *eth.ExecutionPayload) error { + // Sanity check payload before inserting it + if len(payload.Transactions) == 0 { + return errors.New("no transactions in returned payload") + } + if payload.Transactions[0][0] != types.DepositTxType { + return fmt.Errorf("first transaction was not deposit tx. Got %v", payload.Transactions[0][0]) + } + // Ensure that the deposits are first + lastDeposit, err := lastDeposit(payload.Transactions) + if err != nil { + return fmt.Errorf("failed to find last deposit: %w", err) + } + // Ensure no deposits after last deposit + for i := lastDeposit + 1; i < len(payload.Transactions); i++ { + tx := payload.Transactions[i] + deposit, err := isDepositTx(tx) + if err != nil { + return fmt.Errorf("failed to decode transaction idx %d: %w", i, err) + } + if deposit { + return fmt.Errorf("deposit tx (%d) after other tx in l2 block with prev deposit at idx %d", i, lastDeposit) + } + } + return nil +} + +var ErrEngineSyncing = errors.New("engine is syncing") + +type BlockInsertionErrType uint + +const ( + // BlockInsertOK indicates that the payload was successfully executed and appended to the canonical chain. + BlockInsertOK BlockInsertionErrType = iota + // BlockInsertTemporaryErr indicates that the insertion failed but may succeed at a later time without changes to the payload. + BlockInsertTemporaryErr + // BlockInsertPrestateErr indicates that the pre-state to insert the payload could not be prepared, e.g. due to missing chain data. + BlockInsertPrestateErr + // BlockInsertPayloadErr indicates that the payload was invalid and cannot become canonical. + BlockInsertPayloadErr +) + +// startPayload starts an execution payload building process in the provided Engine, with the given attributes. +// The severity of the error is distinguished to determine whether the same payload attributes may be re-attempted later. +func startPayload(ctx context.Context, eng ExecEngine, fc eth.ForkchoiceState, attrs *eth.PayloadAttributes) (id eth.PayloadID, errType BlockInsertionErrType, err error) { + fcRes, err := eng.ForkchoiceUpdate(ctx, &fc, attrs) + if err != nil { + var inputErr eth.InputError + if errors.As(err, &inputErr) { + switch inputErr.Code { + case eth.InvalidForkchoiceState: + return eth.PayloadID{}, BlockInsertPrestateErr, fmt.Errorf("pre-block-creation forkchoice update was inconsistent with engine, need reset to resolve: %w", inputErr.Unwrap()) + case eth.InvalidPayloadAttributes: + return eth.PayloadID{}, BlockInsertPayloadErr, fmt.Errorf("payload attributes are not valid, cannot build block: %w", inputErr.Unwrap()) + default: + if inputErr.Code.IsEngineError() { + return eth.PayloadID{}, BlockInsertPrestateErr, fmt.Errorf("unexpected engine error code in forkchoice-updated response: %w", err) + } else { + return eth.PayloadID{}, BlockInsertTemporaryErr, fmt.Errorf("unexpected generic error code in forkchoice-updated response: %w", err) + } + } + } else { + return eth.PayloadID{}, BlockInsertTemporaryErr, fmt.Errorf("failed to create new block via forkchoice: %w", err) + } + } + + switch fcRes.PayloadStatus.Status { + // TODO: snap sync - specify explicit different error type if node is syncing + case eth.ExecutionInvalid, eth.ExecutionInvalidBlockHash: + return eth.PayloadID{}, BlockInsertPayloadErr, eth.ForkchoiceUpdateErr(fcRes.PayloadStatus) + case eth.ExecutionValid: + id := fcRes.PayloadID + if id == nil { + return eth.PayloadID{}, BlockInsertTemporaryErr, errors.New("nil id in forkchoice result when expecting a valid ID") + } + return *id, BlockInsertOK, nil + case eth.ExecutionSyncing: + return eth.PayloadID{}, BlockInsertTemporaryErr, ErrEngineSyncing + default: + return eth.PayloadID{}, BlockInsertTemporaryErr, eth.ForkchoiceUpdateErr(fcRes.PayloadStatus) + } +} diff --git a/op-node/rollup/engine/events.go b/op-node/rollup/engine/events.go new file mode 100644 index 000000000000..b5e010280ebc --- /dev/null +++ b/op-node/rollup/engine/events.go @@ -0,0 +1,480 @@ +package engine + +import ( + "context" + "errors" + "fmt" + "time" + + "github.com/ethereum/go-ethereum/log" + + "github.com/ethereum-optimism/optimism/op-node/rollup" + "github.com/ethereum-optimism/optimism/op-node/rollup/derive" + "github.com/ethereum-optimism/optimism/op-node/rollup/event" + "github.com/ethereum-optimism/optimism/op-service/eth" +) + +type Metrics interface { + CountSequencedTxs(count int) + + RecordSequencerBuildingDiffTime(duration time.Duration) + RecordSequencerSealingTime(duration time.Duration) +} + +// ForkchoiceRequestEvent signals to the engine that it should emit an artificial +// forkchoice-update event, to signal the latest forkchoice to other derivers. +// This helps decouple derivers from the actual engine state, +// while also not making the derivers wait for a forkchoice update at random. +type ForkchoiceRequestEvent struct { +} + +func (ev ForkchoiceRequestEvent) String() string { + return "forkchoice-request" +} + +type ForkchoiceUpdateEvent struct { + UnsafeL2Head, SafeL2Head, FinalizedL2Head eth.L2BlockRef +} + +func (ev ForkchoiceUpdateEvent) String() string { + return "forkchoice-update" +} + +// PromoteUnsafeEvent signals that the given block may now become a canonical unsafe block. +// This is pre-forkchoice update; the change may not be reflected yet in the EL. +// Note that the legacy pre-event-refactor code-path (processing P2P blocks) does fire this, +// but manually, duplicate with the newer events processing code-path. +// See EngineController.InsertUnsafePayload. +type PromoteUnsafeEvent struct { + Ref eth.L2BlockRef +} + +func (ev PromoteUnsafeEvent) String() string { + return "promote-unsafe" +} + +// RequestCrossUnsafeEvent signals that a CrossUnsafeUpdateEvent is needed. +type RequestCrossUnsafeEvent struct{} + +func (ev RequestCrossUnsafeEvent) String() string { + return "request-cross-unsafe" +} + +// UnsafeUpdateEvent signals that the given block is now considered safe. +// This is pre-forkchoice update; the change may not be reflected yet in the EL. +type UnsafeUpdateEvent struct { + Ref eth.L2BlockRef +} + +func (ev UnsafeUpdateEvent) String() string { + return "unsafe-update" +} + +// PromoteCrossUnsafeEvent signals that the given block may be promoted to cross-unsafe. +type PromoteCrossUnsafeEvent struct { + Ref eth.L2BlockRef +} + +func (ev PromoteCrossUnsafeEvent) String() string { + return "promote-cross-unsafe" +} + +// CrossUnsafeUpdateEvent signals that the given block is now considered cross-unsafe. +type CrossUnsafeUpdateEvent struct { + CrossUnsafe eth.L2BlockRef + LocalUnsafe eth.L2BlockRef +} + +func (ev CrossUnsafeUpdateEvent) String() string { + return "cross-unsafe-update" +} + +type PendingSafeUpdateEvent struct { + PendingSafe eth.L2BlockRef + Unsafe eth.L2BlockRef // tip, added to the signal, to determine if there are existing blocks to consolidate +} + +func (ev PendingSafeUpdateEvent) String() string { + return "pending-safe-update" +} + +// PromotePendingSafeEvent signals that a block can be marked as pending-safe, and/or safe. +type PromotePendingSafeEvent struct { + Ref eth.L2BlockRef + Safe bool + DerivedFrom eth.L1BlockRef +} + +func (ev PromotePendingSafeEvent) String() string { + return "promote-pending-safe" +} + +// PromoteLocalSafeEvent signals that a block can be promoted to local-safe. +type PromoteLocalSafeEvent struct { + Ref eth.L2BlockRef + DerivedFrom eth.L1BlockRef +} + +func (ev PromoteLocalSafeEvent) String() string { + return "promote-local-safe" +} + +// RequestCrossSafeEvent signals that a CrossSafeUpdate is needed. +type RequestCrossSafeEvent struct{} + +func (ev RequestCrossSafeEvent) String() string { + return "request-cross-safe-update" +} + +type CrossSafeUpdateEvent struct { + CrossSafe eth.L2BlockRef + LocalSafe eth.L2BlockRef +} + +func (ev CrossSafeUpdateEvent) String() string { + return "cross-safe-update" +} + +// LocalSafeUpdateEvent signals that a block is now considered to be local-safe. +type LocalSafeUpdateEvent struct { + Ref eth.L2BlockRef + DerivedFrom eth.L1BlockRef +} + +func (ev LocalSafeUpdateEvent) String() string { + return "local-safe-update" +} + +// PromoteSafeEvent signals that a block can be promoted to cross-safe. +type PromoteSafeEvent struct { + Ref eth.L2BlockRef + DerivedFrom eth.L1BlockRef +} + +func (ev PromoteSafeEvent) String() string { + return "promote-safe" +} + +// SafeDerivedEvent signals that a block was determined to be safe, and derived from the given L1 block. +// This is signaled upon successful processing of PromoteSafeEvent. +type SafeDerivedEvent struct { + Safe eth.L2BlockRef + DerivedFrom eth.L1BlockRef +} + +func (ev SafeDerivedEvent) String() string { + return "safe-derived" +} + +// ProcessAttributesEvent signals to immediately process the attributes. +type ProcessAttributesEvent struct { + Attributes *derive.AttributesWithParent +} + +func (ev ProcessAttributesEvent) String() string { + return "process-attributes" +} + +type PendingSafeRequestEvent struct { +} + +func (ev PendingSafeRequestEvent) String() string { + return "pending-safe-request" +} + +type ProcessUnsafePayloadEvent struct { + Envelope *eth.ExecutionPayloadEnvelope +} + +func (ev ProcessUnsafePayloadEvent) String() string { + return "process-unsafe-payload" +} + +type TryBackupUnsafeReorgEvent struct { +} + +func (ev TryBackupUnsafeReorgEvent) String() string { + return "try-backup-unsafe-reorg" +} + +type TryUpdateEngineEvent struct { +} + +func (ev TryUpdateEngineEvent) String() string { + return "try-update-engine" +} + +type ForceEngineResetEvent struct { + Unsafe, Safe, Finalized eth.L2BlockRef +} + +func (ev ForceEngineResetEvent) String() string { + return "force-engine-reset" +} + +type EngineResetConfirmedEvent struct { + Unsafe, Safe, Finalized eth.L2BlockRef +} + +func (ev EngineResetConfirmedEvent) String() string { + return "engine-reset-confirmed" +} + +// PromoteFinalizedEvent signals that a block can be marked as finalized. +type PromoteFinalizedEvent struct { + Ref eth.L2BlockRef +} + +func (ev PromoteFinalizedEvent) String() string { + return "promote-finalized" +} + +// CrossUpdateRequestEvent triggers update events to be emitted, repeating the current state. +type CrossUpdateRequestEvent struct { + CrossUnsafe bool + CrossSafe bool +} + +func (ev CrossUpdateRequestEvent) String() string { + return "cross-update-request" +} + +type EngDeriver struct { + metrics Metrics + + log log.Logger + cfg *rollup.Config + ec *EngineController + ctx context.Context + emitter event.Emitter +} + +var _ event.Deriver = (*EngDeriver)(nil) + +func NewEngDeriver(log log.Logger, ctx context.Context, cfg *rollup.Config, + metrics Metrics, ec *EngineController) *EngDeriver { + return &EngDeriver{ + log: log, + cfg: cfg, + ec: ec, + ctx: ctx, + metrics: metrics, + } +} + +func (d *EngDeriver) AttachEmitter(em event.Emitter) { + d.emitter = em +} + +func (d *EngDeriver) OnEvent(ev event.Event) bool { + switch x := ev.(type) { + case TryBackupUnsafeReorgEvent: + // If we don't need to call FCU to restore unsafeHead using backupUnsafe, keep going b/c + // this was a no-op(except correcting invalid state when backupUnsafe is empty but TryBackupUnsafeReorg called). + fcuCalled, err := d.ec.TryBackupUnsafeReorg(d.ctx) + // Dealing with legacy here: it used to skip over the error-handling if fcuCalled was false. + // But that combination is not actually a code-path in TryBackupUnsafeReorg. + // We should drop fcuCalled, and make the function emit events directly, + // once there are no more synchronous callers. + if !fcuCalled && err != nil { + d.log.Crit("unexpected TryBackupUnsafeReorg error after no FCU call", "err", err) + } + if err != nil { + // If we needed to perform a network call, then we should yield even if we did not encounter an error. + if errors.Is(err, derive.ErrReset) { + d.emitter.Emit(rollup.ResetEvent{Err: err}) + } else if errors.Is(err, derive.ErrTemporary) { + d.emitter.Emit(rollup.EngineTemporaryErrorEvent{Err: err}) + } else { + d.emitter.Emit(rollup.CriticalErrorEvent{Err: fmt.Errorf("unexpected TryBackupUnsafeReorg error type: %w", err)}) + } + } + case TryUpdateEngineEvent: + // If we don't need to call FCU, keep going b/c this was a no-op. If we needed to + // perform a network call, then we should yield even if we did not encounter an error. + if err := d.ec.TryUpdateEngine(d.ctx); err != nil && !errors.Is(err, ErrNoFCUNeeded) { + if errors.Is(err, derive.ErrReset) { + d.emitter.Emit(rollup.ResetEvent{Err: err}) + } else if errors.Is(err, derive.ErrTemporary) { + d.emitter.Emit(rollup.EngineTemporaryErrorEvent{Err: err}) + } else { + d.emitter.Emit(rollup.CriticalErrorEvent{Err: fmt.Errorf("unexpected TryUpdateEngine error type: %w", err)}) + } + } + case ProcessUnsafePayloadEvent: + ref, err := derive.PayloadToBlockRef(d.cfg, x.Envelope.ExecutionPayload) + if err != nil { + d.log.Error("failed to decode L2 block ref from payload", "err", err) + return true + } + if err := d.ec.InsertUnsafePayload(d.ctx, x.Envelope, ref); err != nil { + d.log.Info("failed to insert payload", "ref", ref, + "txs", len(x.Envelope.ExecutionPayload.Transactions), "err", err) + // yes, duplicate error-handling. After all derivers are interacting with the engine + // through events, we can drop the engine-controller interface: + // unify the events handler with the engine-controller, + // remove a lot of code, and not do this error translation. + if errors.Is(err, derive.ErrReset) { + d.emitter.Emit(rollup.ResetEvent{Err: err}) + } else if errors.Is(err, derive.ErrTemporary) { + d.emitter.Emit(rollup.EngineTemporaryErrorEvent{Err: err}) + } else { + d.emitter.Emit(rollup.CriticalErrorEvent{Err: fmt.Errorf("unexpected InsertUnsafePayload error type: %w", err)}) + } + } else { + d.log.Info("successfully processed payload", "ref", ref, "txs", len(x.Envelope.ExecutionPayload.Transactions)) + } + case ForkchoiceRequestEvent: + d.emitter.Emit(ForkchoiceUpdateEvent{ + UnsafeL2Head: d.ec.UnsafeL2Head(), + SafeL2Head: d.ec.SafeL2Head(), + FinalizedL2Head: d.ec.Finalized(), + }) + case ForceEngineResetEvent: + ForceEngineReset(d.ec, x) + + // Time to apply the changes to the underlying engine + d.emitter.Emit(TryUpdateEngineEvent{}) + + log.Debug("Reset of Engine is completed", + "safeHead", x.Safe, "unsafe", x.Unsafe, "safe_timestamp", x.Safe.Time, + "unsafe_timestamp", x.Unsafe.Time) + d.emitter.Emit(EngineResetConfirmedEvent(x)) + case PromoteUnsafeEvent: + // Backup unsafeHead when new block is not built on original unsafe head. + if d.ec.unsafeHead.Number >= x.Ref.Number { + d.ec.SetBackupUnsafeL2Head(d.ec.unsafeHead, false) + } + d.ec.SetUnsafeHead(x.Ref) + d.emitter.Emit(UnsafeUpdateEvent(x)) + case UnsafeUpdateEvent: + // pre-interop everything that is local-unsafe is also immediately cross-unsafe. + if !d.cfg.IsInterop(x.Ref.Time) { + d.emitter.Emit(PromoteCrossUnsafeEvent(x)) + } + // Try to apply the forkchoice changes + d.emitter.Emit(TryUpdateEngineEvent{}) + case PromoteCrossUnsafeEvent: + d.ec.SetCrossUnsafeHead(x.Ref) + d.emitter.Emit(CrossUnsafeUpdateEvent{ + CrossUnsafe: x.Ref, + LocalUnsafe: d.ec.UnsafeL2Head(), + }) + case RequestCrossUnsafeEvent: + d.emitter.Emit(CrossUnsafeUpdateEvent{ + CrossUnsafe: d.ec.CrossUnsafeL2Head(), + LocalUnsafe: d.ec.UnsafeL2Head(), + }) + case RequestCrossSafeEvent: + d.emitter.Emit(CrossSafeUpdateEvent{ + CrossSafe: d.ec.SafeL2Head(), + LocalSafe: d.ec.LocalSafeL2Head(), + }) + case PendingSafeRequestEvent: + d.emitter.Emit(PendingSafeUpdateEvent{ + PendingSafe: d.ec.PendingSafeL2Head(), + Unsafe: d.ec.UnsafeL2Head(), + }) + case PromotePendingSafeEvent: + // Only promote if not already stale. + // Resets/overwrites happen through engine-resets, not through promotion. + if x.Ref.Number > d.ec.PendingSafeL2Head().Number { + d.ec.SetPendingSafeL2Head(x.Ref) + d.emitter.Emit(PendingSafeUpdateEvent{ + PendingSafe: d.ec.PendingSafeL2Head(), + Unsafe: d.ec.UnsafeL2Head(), + }) + } + if x.Safe && x.Ref.Number > d.ec.LocalSafeL2Head().Number { + d.emitter.Emit(PromoteLocalSafeEvent{ + Ref: x.Ref, + DerivedFrom: x.DerivedFrom, + }) + } + case PromoteLocalSafeEvent: + d.ec.SetLocalSafeHead(x.Ref) + d.emitter.Emit(LocalSafeUpdateEvent(x)) + case LocalSafeUpdateEvent: + // pre-interop everything that is local-safe is also immediately cross-safe. + if !d.cfg.IsInterop(x.Ref.Time) { + d.emitter.Emit(PromoteSafeEvent(x)) + } + case PromoteSafeEvent: + d.ec.SetSafeHead(x.Ref) + // Finalizer can pick up this safe cross-block now + d.emitter.Emit(SafeDerivedEvent{Safe: x.Ref, DerivedFrom: x.DerivedFrom}) + d.emitter.Emit(CrossSafeUpdateEvent{ + CrossSafe: d.ec.SafeL2Head(), + LocalSafe: d.ec.LocalSafeL2Head(), + }) + // Try to apply the forkchoice changes + d.emitter.Emit(TryUpdateEngineEvent{}) + case PromoteFinalizedEvent: + if x.Ref.Number < d.ec.Finalized().Number { + d.log.Error("Cannot rewind finality,", "ref", x.Ref, "finalized", d.ec.Finalized()) + return true + } + if x.Ref.Number > d.ec.SafeL2Head().Number { + d.log.Error("Block must be safe before it can be finalized", "ref", x.Ref, "safe", d.ec.SafeL2Head()) + return true + } + d.ec.SetFinalizedHead(x.Ref) + // Try to apply the forkchoice changes + d.emitter.Emit(TryUpdateEngineEvent{}) + case CrossUpdateRequestEvent: + if x.CrossUnsafe { + d.emitter.Emit(CrossUnsafeUpdateEvent{ + CrossUnsafe: d.ec.CrossUnsafeL2Head(), + LocalUnsafe: d.ec.UnsafeL2Head(), + }) + } + if x.CrossSafe { + d.emitter.Emit(CrossSafeUpdateEvent{ + CrossSafe: d.ec.SafeL2Head(), + LocalSafe: d.ec.LocalSafeL2Head(), + }) + } + case BuildStartEvent: + d.onBuildStart(x) + case BuildStartedEvent: + d.onBuildStarted(x) + case BuildSealedEvent: + d.onBuildSealed(x) + case BuildSealEvent: + d.onBuildSeal(x) + case BuildInvalidEvent: + d.onBuildInvalid(x) + case BuildCancelEvent: + d.onBuildCancel(x) + case PayloadProcessEvent: + d.onPayloadProcess(x) + case PayloadSuccessEvent: + d.onPayloadSuccess(x) + case PayloadInvalidEvent: + d.onPayloadInvalid(x) + default: + return false + } + return true +} + +type ResetEngineControl interface { + SetUnsafeHead(eth.L2BlockRef) + SetSafeHead(eth.L2BlockRef) + SetFinalizedHead(eth.L2BlockRef) + SetLocalSafeHead(ref eth.L2BlockRef) + SetCrossUnsafeHead(ref eth.L2BlockRef) + SetBackupUnsafeL2Head(block eth.L2BlockRef, triggerReorg bool) + SetPendingSafeL2Head(eth.L2BlockRef) +} + +// ForceEngineReset is not to be used. The op-program needs it for now, until event processing is adopted there. +func ForceEngineReset(ec ResetEngineControl, x ForceEngineResetEvent) { + ec.SetUnsafeHead(x.Unsafe) + ec.SetLocalSafeHead(x.Safe) + ec.SetPendingSafeL2Head(x.Safe) + ec.SetFinalizedHead(x.Finalized) + ec.SetSafeHead(x.Safe) + ec.SetCrossUnsafeHead(x.Safe) + ec.SetBackupUnsafeL2Head(eth.L2BlockRef{}, false) +} diff --git a/op-node/rollup/engine/iface.go b/op-node/rollup/engine/iface.go new file mode 100644 index 000000000000..0989b125df79 --- /dev/null +++ b/op-node/rollup/engine/iface.go @@ -0,0 +1,32 @@ +package engine + +import ( + "github.com/ethereum-optimism/optimism/op-node/rollup/derive" + "github.com/ethereum-optimism/optimism/op-service/eth" +) + +// EngineState provides a read-only interface of the forkchoice state properties of the L2 Engine. +type EngineState interface { + Finalized() eth.L2BlockRef + UnsafeL2Head() eth.L2BlockRef + SafeL2Head() eth.L2BlockRef +} + +type Engine interface { + ExecEngine + derive.L2Source +} + +type LocalEngineState interface { + EngineState + + PendingSafeL2Head() eth.L2BlockRef + BackupUnsafeL2Head() eth.L2BlockRef +} + +type LocalEngineControl interface { + LocalEngineState + ResetEngineControl +} + +var _ LocalEngineControl = (*EngineController)(nil) diff --git a/op-node/rollup/engine/params.go b/op-node/rollup/engine/params.go new file mode 100644 index 000000000000..979b304cdb48 --- /dev/null +++ b/op-node/rollup/engine/params.go @@ -0,0 +1,10 @@ +package engine + +import "time" + +const ( + buildSealTimeout = time.Second * 10 + buildStartTimeout = time.Second * 10 + buildCancelTimeout = time.Second * 10 + payloadProcessTimeout = time.Second * 10 +) diff --git a/op-node/rollup/engine/payload_invalid.go b/op-node/rollup/engine/payload_invalid.go new file mode 100644 index 000000000000..464adabd3023 --- /dev/null +++ b/op-node/rollup/engine/payload_invalid.go @@ -0,0 +1,17 @@ +package engine + +import "github.com/ethereum-optimism/optimism/op-service/eth" + +type PayloadInvalidEvent struct { + Envelope *eth.ExecutionPayloadEnvelope + Err error +} + +func (ev PayloadInvalidEvent) String() string { + return "payload-invalid" +} + +func (eq *EngDeriver) onPayloadInvalid(ev PayloadInvalidEvent) { + eq.log.Warn("Payload was invalid", "block", ev.Envelope.ExecutionPayload.ID(), + "err", ev.Err, "timestamp", uint64(ev.Envelope.ExecutionPayload.Timestamp)) +} diff --git a/op-node/rollup/engine/payload_process.go b/op-node/rollup/engine/payload_process.go new file mode 100644 index 000000000000..4102287f3d23 --- /dev/null +++ b/op-node/rollup/engine/payload_process.go @@ -0,0 +1,50 @@ +package engine + +import ( + "context" + "fmt" + + "github.com/ethereum-optimism/optimism/op-node/rollup" + "github.com/ethereum-optimism/optimism/op-service/eth" +) + +type PayloadProcessEvent struct { + // if payload should be promoted to safe (must also be pending safe, see DerivedFrom) + IsLastInSpan bool + // payload is promoted to pending-safe if non-zero + DerivedFrom eth.L1BlockRef + + Envelope *eth.ExecutionPayloadEnvelope + Ref eth.L2BlockRef +} + +func (ev PayloadProcessEvent) String() string { + return "payload-process" +} + +func (eq *EngDeriver) onPayloadProcess(ev PayloadProcessEvent) { + ctx, cancel := context.WithTimeout(eq.ctx, payloadProcessTimeout) + defer cancel() + + status, err := eq.ec.engine.NewPayload(ctx, + ev.Envelope.ExecutionPayload, ev.Envelope.ParentBeaconBlockRoot) + if err != nil { + eq.emitter.Emit(rollup.EngineTemporaryErrorEvent{ + Err: fmt.Errorf("failed to insert execution payload: %w", err)}) + return + } + switch status.Status { + case eth.ExecutionInvalid, eth.ExecutionInvalidBlockHash: + eq.emitter.Emit(PayloadInvalidEvent{ + Envelope: ev.Envelope, + Err: eth.NewPayloadErr(ev.Envelope.ExecutionPayload, status)}) + return + case eth.ExecutionValid: + eq.emitter.Emit(PayloadSuccessEvent(ev)) + return + default: + eq.emitter.Emit(rollup.EngineTemporaryErrorEvent{ + Err: eth.NewPayloadErr(ev.Envelope.ExecutionPayload, status)}) + return + } +} diff --git a/op-node/rollup/engine/payload_success.go b/op-node/rollup/engine/payload_success.go new file mode 100644 index 000000000000..7bb4a38307e1 --- /dev/null +++ b/op-node/rollup/engine/payload_success.go @@ -0,0 +1,40 @@ +package engine + +import ( + "github.com/ethereum-optimism/optimism/op-service/eth" +) + +type PayloadSuccessEvent struct { + // if payload should be promoted to safe (must also be pending safe, see DerivedFrom) + IsLastInSpan bool + // payload is promoted to pending-safe if non-zero + DerivedFrom eth.L1BlockRef + + Envelope *eth.ExecutionPayloadEnvelope + Ref eth.L2BlockRef +} + +func (ev PayloadSuccessEvent) String() string { + return "payload-success" +} + +func (eq *EngDeriver) onPayloadSuccess(ev PayloadSuccessEvent) { + eq.emitter.Emit(PromoteUnsafeEvent{Ref: ev.Ref}) + + // If derived from L1, then it can be considered (pending) safe + if ev.DerivedFrom != (eth.L1BlockRef{}) { + eq.emitter.Emit(PromotePendingSafeEvent{ + Ref: ev.Ref, + Safe: ev.IsLastInSpan, + DerivedFrom: ev.DerivedFrom, + }) + } + + payload := ev.Envelope.ExecutionPayload + eq.log.Info("Inserted block", "hash", payload.BlockHash, "number", uint64(payload.BlockNumber), + "state_root", payload.StateRoot, "timestamp", uint64(payload.Timestamp), "parent", payload.ParentHash, + "prev_randao", payload.PrevRandao, "fee_recipient", payload.FeeRecipient, + "txs", len(payload.Transactions), "last_in_span", ev.IsLastInSpan, "derived_from", ev.DerivedFrom) + + eq.emitter.Emit(TryUpdateEngineEvent{}) +} diff --git a/op-node/rollup/event.go b/op-node/rollup/event.go new file mode 100644 index 000000000000..3d12c34a9f6b --- /dev/null +++ b/op-node/rollup/event.go @@ -0,0 +1,41 @@ +package rollup + +import "github.com/ethereum-optimism/optimism/op-node/rollup/event" + +// L1TemporaryErrorEvent identifies a temporary issue with the L1 data. +type L1TemporaryErrorEvent struct { + Err error +} + +var _ event.Event = L1TemporaryErrorEvent{} + +func (ev L1TemporaryErrorEvent) String() string { + return "l1-temporary-error" +} + +// EngineTemporaryErrorEvent identifies a temporary processing issue. +// It applies to both L1 and L2 data, often inter-related. +// This scope will be reduced over time, to only capture L2-engine specific temporary errors. +// See L1TemporaryErrorEvent for L1 related temporary errors. +type EngineTemporaryErrorEvent struct { + Err error +} + +var _ event.Event = EngineTemporaryErrorEvent{} + +func (ev EngineTemporaryErrorEvent) String() string { + return "engine-temporary-error" +} + +type ResetEvent struct { + Err error +} + +var _ event.Event = ResetEvent{} + +func (ev ResetEvent) String() string { + return "reset-event" +} + +// CriticalErrorEvent is an alias for event.CriticalErrorEvent +type CriticalErrorEvent = event.CriticalErrorEvent diff --git a/op-node/rollup/event/events.go b/op-node/rollup/event/events.go new file mode 100644 index 000000000000..6fed3859a64e --- /dev/null +++ b/op-node/rollup/event/events.go @@ -0,0 +1,87 @@ +package event + +import "github.com/ethereum/go-ethereum/log" + +type Event interface { + // String returns the name of the event. + // The name must be simple and identify the event type, not the event content. + // This name is used for metric-labeling. + String() string +} + +type Deriver interface { + OnEvent(ev Event) bool +} + +type Emitter interface { + Emit(ev Event) +} + +type Drainer interface { + // Drain processes all events. + Drain() error + // DrainUntil processes all events until a condition is hit. + // If excl, the event that matches the condition is not processed yet. + // If not excl, the event that matches is processed. + DrainUntil(fn func(ev Event) bool, excl bool) error +} + +type EmitterDrainer interface { + Emitter + Drainer +} + +type EmitterFunc func(ev Event) + +func (fn EmitterFunc) Emit(ev Event) { + fn(ev) +} + +// DeriverMux takes an event-signal as deriver, and synchronously fans it out to all contained Deriver ends. +// Technically this is a DeMux: single input to multi output. +type DeriverMux []Deriver + +func (s *DeriverMux) OnEvent(ev Event) bool { + out := false + for _, d := range *s { + out = d.OnEvent(ev) || out + } + return out +} + +var _ Deriver = (*DeriverMux)(nil) + +type DebugDeriver struct { + Log log.Logger +} + +func (d DebugDeriver) OnEvent(ev Event) { + d.Log.Debug("on-event", "event", ev) +} + +type NoopDeriver struct{} + +func (d NoopDeriver) OnEvent(ev Event) {} + +// DeriverFunc implements the Deriver interface as a function, +// similar to how the std-lib http HandlerFunc implements a Handler. +// This can be used for small in-place derivers, test helpers, etc. +type DeriverFunc func(ev Event) bool + +func (fn DeriverFunc) OnEvent(ev Event) bool { + return fn(ev) +} + +type NoopEmitter struct{} + +func (e NoopEmitter) Emit(ev Event) {} + +type CriticalErrorEvent struct { + Err error +} + +var _ Event = CriticalErrorEvent{} + +func (ev CriticalErrorEvent) String() string { + return "critical-error" +} diff --git a/op-node/rollup/event/events_test.go b/op-node/rollup/event/events_test.go new file mode 100644 index 000000000000..91ee22304b9e --- /dev/null +++ b/op-node/rollup/event/events_test.go @@ -0,0 +1,53 @@ +package event + +import ( + "fmt" + "testing" + + "github.com/stretchr/testify/require" +) + +type TestEvent struct{} + +func (ev TestEvent) String() string { + return "X" +} + +func TestDeriverMux_OnEvent(t *testing.T) { + result := "" + a := DeriverFunc(func(ev Event) bool { + result += fmt.Sprintf("A:%s\n", ev) + return true + }) + b := DeriverFunc(func(ev Event) bool { + result += fmt.Sprintf("B:%s\n", ev) + return true + }) + c := DeriverFunc(func(ev Event) bool { + result += fmt.Sprintf("C:%s\n", ev) + return true + }) + + x := DeriverMux{} + x.OnEvent(TestEvent{}) + require.Equal(t, "", result) + + x = DeriverMux{a} + x.OnEvent(TestEvent{}) + require.Equal(t, "A:X\n", result) + + result = "" + x = DeriverMux{a, a} + x.OnEvent(TestEvent{}) + require.Equal(t, "A:X\nA:X\n", result) + + result = "" + x = DeriverMux{a, b} + x.OnEvent(TestEvent{}) + require.Equal(t, "A:X\nB:X\n", result) + + result = "" + x = DeriverMux{a, b, c} + x.OnEvent(TestEvent{}) + require.Equal(t, "A:X\nB:X\nC:X\n", result) +} diff --git a/op-node/rollup/event/executor.go b/op-node/rollup/event/executor.go new file mode 100644 index 000000000000..7f686a5414a4 --- /dev/null +++ b/op-node/rollup/event/executor.go @@ -0,0 +1,19 @@ +package event + +type Executable interface { + RunEvent(ev AnnotatedEvent) +} + +// ExecutableFunc implements the Executable interface as a function, +// similar to how the std-lib http HandlerFunc implements a Handler. +// This can be used for small in-place executables, test helpers, etc. +type ExecutableFunc func(ev AnnotatedEvent) + +func (fn ExecutableFunc) RunEvent(ev AnnotatedEvent) { + fn(ev) +} + +type Executor interface { + Add(d Executable, opts *ExecutorOpts) (leaveExecutor func()) + Enqueue(ev AnnotatedEvent) error +} diff --git a/op-node/rollup/event/executor_global.go b/op-node/rollup/event/executor_global.go new file mode 100644 index 000000000000..07fcc01e8dd0 --- /dev/null +++ b/op-node/rollup/event/executor_global.go @@ -0,0 +1,163 @@ +package event + +import ( + "context" + "fmt" + "io" + "slices" + "sync" + "sync/atomic" +) + +// Don't queue up an endless number of events. +// At some point it's better to drop events and warn something is exploding the number of events. +const sanityEventLimit = 1000 + +type GlobalSyncExec struct { + eventsLock sync.Mutex + events []AnnotatedEvent + + handles []*globalHandle + handlesLock sync.RWMutex + + ctx context.Context +} + +var _ Executor = (*GlobalSyncExec)(nil) + +func NewGlobalSynchronous(ctx context.Context) *GlobalSyncExec { + return &GlobalSyncExec{ctx: ctx} +} + +func (gs *GlobalSyncExec) Add(d Executable, _ *ExecutorOpts) (leaveExecutor func()) { + gs.handlesLock.Lock() + defer gs.handlesLock.Unlock() + h := &globalHandle{d: d} + h.g.Store(gs) + gs.handles = append(gs.handles, h) + return h.leave +} + +func (gs *GlobalSyncExec) remove(h *globalHandle) { + gs.handlesLock.Lock() + defer gs.handlesLock.Unlock() + // Linear search to delete is fine, + // since we delete much less frequently than we process events with these. + for i, v := range gs.handles { + if v == h { + gs.handles = slices.Delete(gs.handles, i, i+1) + return + } + } +} + +func (gs *GlobalSyncExec) Enqueue(ev AnnotatedEvent) error { + gs.eventsLock.Lock() + defer gs.eventsLock.Unlock() + // sanity limit, never queue too many events + if len(gs.events) >= sanityEventLimit { + return fmt.Errorf("something is very wrong, queued up too many events! Dropping event %q", ev) + } + gs.events = append(gs.events, ev) + return nil +} + +func (gs *GlobalSyncExec) pop() AnnotatedEvent { + gs.eventsLock.Lock() + defer gs.eventsLock.Unlock() + + if len(gs.events) == 0 { + return AnnotatedEvent{} + } + + first := gs.events[0] + gs.events = gs.events[1:] + return first +} + +func (gs *GlobalSyncExec) processEvent(ev AnnotatedEvent) { + gs.handlesLock.RLock() // read lock, to allow Drain() to be called during event processing. + defer gs.handlesLock.RUnlock() + for _, h := range gs.handles { + h.onEvent(ev) + } +} + +func (gs *GlobalSyncExec) Drain() error { + for { + if gs.ctx.Err() != nil { + return gs.ctx.Err() + } + ev := gs.pop() + if ev.Event == nil { + return nil + } + // Note: event execution may call Drain(), that is allowed. + gs.processEvent(ev) + } +} + +func (gs *GlobalSyncExec) DrainUntil(fn func(ev Event) bool, excl bool) error { + // In order of operation: + // stopExcl: stop draining, and leave the event. + // no stopExcl, and no event: EOF, exhausted events before condition hit. + // no stopExcl, and event: process event. + // stopIncl: stop draining, after having processed the event first. + iter := func() (ev AnnotatedEvent, stopIncl bool, stopExcl bool) { + gs.eventsLock.Lock() + defer gs.eventsLock.Unlock() + + if len(gs.events) == 0 { + return AnnotatedEvent{}, false, false + } + + ev = gs.events[0] + stop := fn(ev.Event) + if excl && stop { + ev = AnnotatedEvent{} + stopExcl = true + } else { + gs.events = gs.events[1:] + } + if stop { + stopIncl = true + } + return + } + + for { + if gs.ctx.Err() != nil { + return gs.ctx.Err() + } + // includes popping of the event, so we can handle Drain() calls by onEvent() execution + ev, stopIncl, stopExcl := iter() + if stopExcl { + return nil + } + if ev.Event == nil { + return io.EOF + } + gs.processEvent(ev) + if stopIncl { + return nil + } + } +} + +type globalHandle struct { + g atomic.Pointer[GlobalSyncExec] + d Executable +} + +func (gh *globalHandle) onEvent(ev AnnotatedEvent) { + if gh.g.Load() == nil { // don't process more events while we are being removed + return + } + gh.d.RunEvent(ev) +} + +func (gh *globalHandle) leave() { + if old := gh.g.Swap(nil); old != nil { + old.remove(gh) + } +} diff --git a/op-node/rollup/event/executor_global_test.go b/op-node/rollup/event/executor_global_test.go new file mode 100644 index 000000000000..d3b41ae05406 --- /dev/null +++ b/op-node/rollup/event/executor_global_test.go @@ -0,0 +1,158 @@ +package event + +import ( + "context" + "testing" + + "github.com/stretchr/testify/require" + + "github.com/ethereum/go-ethereum/log" + + "github.com/ethereum-optimism/optimism/op-service/testlog" +) + +func TestGlobalExecutor(t *testing.T) { + count := 0 + ex := ExecutableFunc(func(ev AnnotatedEvent) { + count += 1 + }) + exec := NewGlobalSynchronous(context.Background()) + leave := exec.Add(ex, nil) + require.NoError(t, exec.Drain(), "can drain, even if empty") + + require.NoError(t, exec.Enqueue(AnnotatedEvent{Event: TestEvent{}})) + require.Equal(t, 0, count, "no processing yet, queued event") + require.NoError(t, exec.Drain()) + require.Equal(t, 1, count, "processed event") + + require.NoError(t, exec.Enqueue(AnnotatedEvent{Event: TestEvent{}})) + require.NoError(t, exec.Enqueue(AnnotatedEvent{Event: TestEvent{}})) + require.Equal(t, 1, count, "no processing yet, queued events") + require.NoError(t, exec.Drain()) + require.Equal(t, 3, count, "processed events") + + leave() + require.NoError(t, exec.Enqueue(AnnotatedEvent{Event: TestEvent{}})) + require.NotEqual(t, exec.Drain(), "after deriver leaves the executor can still drain events") + require.Equal(t, 3, count, "didn't process event after trigger close") +} + +func TestQueueSanityLimit(t *testing.T) { + count := 0 + ex := ExecutableFunc(func(ev AnnotatedEvent) { + count += 1 + }) + exec := NewGlobalSynchronous(context.Background()) + leave := exec.Add(ex, nil) + defer leave() + // emit 1 too many events + for i := 0; i < sanityEventLimit; i++ { + require.NoError(t, exec.Enqueue(AnnotatedEvent{Event: TestEvent{}})) + } + require.ErrorContains(t, exec.Enqueue(AnnotatedEvent{Event: TestEvent{}}), "too many events") + require.NoError(t, exec.Drain()) + require.Equal(t, sanityEventLimit, count, "processed all non-dropped events") + + require.NoError(t, exec.Enqueue(AnnotatedEvent{Event: TestEvent{}})) + require.NoError(t, exec.Drain()) + require.Equal(t, sanityEventLimit+1, count, "back to normal after drain") +} + +type CyclicEvent struct { + Count int +} + +func (ev CyclicEvent) String() string { + return "cyclic-event" +} + +func TestSynchronousCyclic(t *testing.T) { + logger := testlog.Logger(t, log.LevelError) + var exec *GlobalSyncExec + result := false + ex := ExecutableFunc(func(ev AnnotatedEvent) { + logger.Info("received event", "event", ev) + switch x := ev.Event.(type) { + case CyclicEvent: + if x.Count < 10 { + require.NoError(t, exec.Enqueue(AnnotatedEvent{Event: CyclicEvent{Count: x.Count + 1}})) + } else { + result = true + } + } + }) + exec = NewGlobalSynchronous(context.Background()) + leave := exec.Add(ex, nil) + defer leave() + require.NoError(t, exec.Enqueue(AnnotatedEvent{Event: CyclicEvent{Count: 0}})) + require.NoError(t, exec.Drain()) + require.True(t, result, "expecting event processing to fully recurse") +} + +func TestDrainCancel(t *testing.T) { + count := 0 + ctx, cancel := context.WithCancel(context.Background()) + ex := ExecutableFunc(func(ev AnnotatedEvent) { + count += 1 + cancel() + }) + exec := NewGlobalSynchronous(ctx) + leave := exec.Add(ex, nil) + defer leave() + + require.NoError(t, exec.Enqueue(AnnotatedEvent{Event: TestEvent{}})) + require.NoError(t, exec.Enqueue(AnnotatedEvent{Event: TestEvent{}})) + drainErr := exec.Drain() + require.NotNil(t, ctx.Err()) + require.ErrorIs(t, ctx.Err(), drainErr) + require.Equal(t, 1, count, "drain must be canceled before next event is processed") +} + +func TestDrainUntilCancel(t *testing.T) { + count := 0 + ctx, cancel := context.WithCancel(context.Background()) + ex := ExecutableFunc(func(ev AnnotatedEvent) { + count += 1 + if _, ok := ev.Event.(FooEvent); ok { + cancel() + } + }) + exec := NewGlobalSynchronous(ctx) + leave := exec.Add(ex, nil) + defer leave() + + require.NoError(t, exec.Enqueue(AnnotatedEvent{Event: TestEvent{}})) + require.NoError(t, exec.Enqueue(AnnotatedEvent{Event: FooEvent{}})) + require.NoError(t, exec.Enqueue(AnnotatedEvent{Event: TestEvent{}})) + drainErr := exec.DrainUntil(Is[FooEvent], false) + require.NoError(t, drainErr, "drained right until context started to matter") + require.Equal(t, 2, count, "drain must be stopped at Foo (incl)") + drainErr = exec.DrainUntil(Is[TestEvent], false) + require.NotNil(t, ctx.Err()) + require.NotNil(t, drainErr) + require.ErrorIs(t, ctx.Err(), drainErr) + require.Equal(t, 2, count, "drain must be canceled, not processed next TestEvent") +} + +func TestDrainUntilExcl(t *testing.T) { + count := 0 + ex := ExecutableFunc(func(ev AnnotatedEvent) { + count += 1 + }) + exec := NewGlobalSynchronous(context.Background()) + leave := exec.Add(ex, nil) + defer leave() + + require.NoError(t, exec.Enqueue(AnnotatedEvent{Event: TestEvent{}})) + require.NoError(t, exec.Enqueue(AnnotatedEvent{Event: FooEvent{}})) + require.NoError(t, exec.Enqueue(AnnotatedEvent{Event: TestEvent{}})) + require.NoError(t, exec.Enqueue(AnnotatedEvent{Event: TestEvent{}})) + require.NoError(t, exec.DrainUntil(Is[FooEvent], true)) + require.Equal(t, 1, count, "Foo must not be processed yet") + require.NoError(t, exec.DrainUntil(Is[FooEvent], true)) + require.Equal(t, 1, count, "Foo still not processed, excl on first element") + require.NoError(t, exec.DrainUntil(Is[FooEvent], false)) + require.Equal(t, 2, count, "Foo is processed, remainder is not, stop is inclusive now") + require.NoError(t, exec.Drain()) + require.Equal(t, 4, count, "Done") +} diff --git a/op-node/rollup/event/limiter.go b/op-node/rollup/event/limiter.go new file mode 100644 index 000000000000..f0efcf1d2d62 --- /dev/null +++ b/op-node/rollup/event/limiter.go @@ -0,0 +1,58 @@ +package event + +import ( + "context" + + "golang.org/x/time/rate" +) + +type Limiter[E Emitter] struct { + ctx context.Context + emitter E + rl *rate.Limiter + onLimited func() +} + +// NewLimiter returns an event rate-limiter. +// This can be used to prevent event loops from (accidentally) running too hot. +// The eventRate is the number of events per second. +// The eventBurst is the margin of events to eat into until the rate-limit kicks in. +// The onLimited function is optional, and will be called if an emitted event is getting rate-limited +func NewLimiter[E Emitter](ctx context.Context, em E, eventRate rate.Limit, eventBurst int, onLimited func()) *Limiter[E] { + return &Limiter[E]{ + ctx: ctx, + emitter: em, + rl: rate.NewLimiter(eventRate, eventBurst), + onLimited: onLimited, + } +} + +// Emit is thread-safe, multiple parallel derivers can safely emit events to it. +func (l *Limiter[E]) Emit(ev Event) { + if l.onLimited != nil && l.rl.Tokens() < 1.0 { + l.onLimited() + } + if err := l.rl.Wait(l.ctx); err != nil { + return // ctx error, safe to ignore. + } + l.emitter.Emit(ev) +} + +// LimiterDrainer is a variant of Limiter that supports event draining. +type LimiterDrainer Limiter[EmitterDrainer] + +func NewLimiterDrainer(ctx context.Context, em EmitterDrainer, eventRate rate.Limit, eventBurst int, onLimited func()) *LimiterDrainer { + return (*LimiterDrainer)(NewLimiter(ctx, em, eventRate, eventBurst, onLimited)) +} + +func (l *LimiterDrainer) Emit(ev Event) { + l.emitter.Emit(ev) +} + +func (l *LimiterDrainer) Drain() error { + return l.emitter.Drain() +} + +func (l *LimiterDrainer) DrainUntil(fn func(ev Event) bool, excl bool) error { + return l.emitter.DrainUntil(fn, excl) +} diff --git a/op-node/rollup/event/limiter_test.go b/op-node/rollup/event/limiter_test.go new file mode 100644 index 000000000000..764a8853f256 --- /dev/null +++ b/op-node/rollup/event/limiter_test.go @@ -0,0 +1,28 @@ +package event + +import ( + "context" + "testing" + + "github.com/stretchr/testify/require" + "golang.org/x/time/rate" +) + +func TestLimiter(t *testing.T) { + count := uint64(0) + em := EmitterFunc(func(ev Event) { + count += 1 + }) + hitRateLimitAt := uint64(0) + // Test that we are able to hit the specified rate limit, and no earlier + lim := NewLimiter(context.Background(), em, rate.Limit(10), 10, func() { + if hitRateLimitAt != 0 { + return + } + hitRateLimitAt = count + }) + for i := 0; i < 30; i++ { + lim.Emit(TestEvent{}) + } + require.LessOrEqual(t, uint64(10), hitRateLimitAt) +} diff --git a/op-node/rollup/event/metrics.go b/op-node/rollup/event/metrics.go new file mode 100644 index 000000000000..bf3dec4e0644 --- /dev/null +++ b/op-node/rollup/event/metrics.go @@ -0,0 +1,20 @@ +package event + +import "time" + +type Metrics interface { + RecordEmittedEvent(eventName string, emitter string) + RecordProcessedEvent(eventName string, deriver string, duration time.Duration) + RecordEventsRateLimited() +} + +type NoopMetrics struct { +} + +func (n NoopMetrics) RecordEmittedEvent(eventName string, emitter string) {} + +func (n NoopMetrics) RecordProcessedEvent(eventName string, deriver string, duration time.Duration) {} + +func (n NoopMetrics) RecordEventsRateLimited() {} + +var _ Metrics = NoopMetrics{} diff --git a/op-node/rollup/event/options.go b/op-node/rollup/event/options.go new file mode 100644 index 000000000000..eca5a132a800 --- /dev/null +++ b/op-node/rollup/event/options.go @@ -0,0 +1,47 @@ +package event + +import "golang.org/x/time/rate" + +type ExecutorOpts struct { + Capacity int // If there is a local buffer capacity +} + +type EmitterOpts struct { + Limiting bool + Rate rate.Limit + Burst int + OnLimited func() +} + +// RegisterOpts represents the set of parameters to configure a +// new deriver/emitter with that is registered with an event System. +// These options may be reused for multiple registrations. +type RegisterOpts struct { + Executor ExecutorOpts + Emitter EmitterOpts +} + +// 200 events may be buffered per deriver before back-pressure has to kick in +const eventsBuffer = 200 + +// 10,000 events per second is plenty. +// If we are going through more events, the driver needs to breathe, and warn the user of a potential issue. +const eventsLimit = rate.Limit(10_000) + +// 500 events of burst: the maximum amount of events to eat up +// past the rate limit before the rate limit becomes applicable. +const eventsBurst = 500 + +func DefaultRegisterOpts() *RegisterOpts { + return &RegisterOpts{ + Executor: ExecutorOpts{ + Capacity: eventsBuffer, + }, + Emitter: EmitterOpts{ + Limiting: true, + Rate: eventsLimit, + Burst: eventsBurst, + OnLimited: nil, + }, + } +} diff --git a/op-node/rollup/event/system.go b/op-node/rollup/event/system.go new file mode 100644 index 000000000000..566f28fdbe40 --- /dev/null +++ b/op-node/rollup/event/system.go @@ -0,0 +1,268 @@ +package event + +import ( + "context" + "fmt" + "slices" + "sync" + "sync/atomic" + "time" + + "github.com/ethereum/go-ethereum/log" +) + +type Registry interface { + // Register registers a named event-emitter, optionally processing events itself: + // deriver may be nil, not all registrants have to process events. + // A non-nil deriver may implement AttachEmitter to automatically attach the Emitter to it, + // before the deriver itself becomes executable. + Register(name string, deriver Deriver, opts *RegisterOpts) Emitter + // Unregister removes a named emitter, + // also removing it from the set of events-receiving derivers (if registered with non-nil deriver). + Unregister(name string) (old Emitter) +} + +type System interface { + Registry + // AddTracer registers a tracer to capture all event deriver/emitter work. It runs until RemoveTracer is called. + // Duplicate tracers are allowed. + AddTracer(t Tracer) + // RemoveTracer removes a tracer. This is a no-op if the tracer was not previously added. + // It will remove all added duplicates of the tracer. + RemoveTracer(t Tracer) + // Stop shuts down the System by un-registering all derivers/emitters. + Stop() +} + +type AttachEmitter interface { + AttachEmitter(em Emitter) +} + +type AnnotatedEvent struct { + Event Event + EmitContext uint64 // uniquely identifies the emission of the event, useful for debugging and creating diagrams +} + +// systemActor is a deriver and/or emitter, registered in System with a name. +// If deriving, the actor is added as Executable to the Executor of the System. +type systemActor struct { + name string + sys *Sys + + // To manage the execution peripherals, like rate-limiting, of this deriver + ctx context.Context + cancel context.CancelFunc + + deriv Deriver + leaveExecutor func() + + // 0 if event does not originate from Deriver-handling of another event + currentEvent uint64 +} + +// Emit is called by the end-user +func (r *systemActor) Emit(ev Event) { + if r.ctx.Err() != nil { + return + } + r.sys.emit(r.name, r.currentEvent, ev) +} + +// RunEvent is called by the events executor. +// While different things may execute in parallel, only one event is executed per entry at a time. +func (r *systemActor) RunEvent(ev AnnotatedEvent) { + if r.deriv == nil { + return + } + if r.ctx.Err() != nil { + return + } + if r.sys.abort.Load() && !Is[CriticalErrorEvent](ev.Event) { + // if aborting, and not the CriticalErrorEvent itself, then do not process the event + return + } + + prev := r.currentEvent + start := time.Now() + r.currentEvent = r.sys.recordDerivStart(r.name, ev, start) + effect := r.deriv.OnEvent(ev.Event) + elapsed := time.Since(start) + r.sys.recordDerivEnd(r.name, ev, r.currentEvent, start, elapsed, effect) + r.currentEvent = prev +} + +// Sys is the canonical implementation of System. +type Sys struct { + regs map[string]*systemActor + regsLock sync.Mutex + + log log.Logger + + executor Executor + + // used to generate a unique id for each event deriver processing call. + derivContext atomic.Uint64 + // used to generate a unique id for each event-emission. + emitContext atomic.Uint64 + + tracers []Tracer + tracersLock sync.RWMutex + + // if true, no events may be processed, except CriticalError itself + abort atomic.Bool +} + +func NewSystem(log log.Logger, ex Executor) *Sys { + return &Sys{ + regs: make(map[string]*systemActor), + executor: ex, + log: log, + } +} + +func (s *Sys) Register(name string, deriver Deriver, opts *RegisterOpts) Emitter { + s.regsLock.Lock() + defer s.regsLock.Unlock() + + if _, ok := s.regs[name]; ok { + panic(fmt.Errorf("a deriver/emitter with name %q already exists", name)) + } + + ctx, cancel := context.WithCancel(context.Background()) + r := &systemActor{ + name: name, + deriv: deriver, + sys: s, + ctx: ctx, + cancel: cancel, + } + s.regs[name] = r + var em Emitter = r + if opts.Emitter.Limiting { + limitedCallback := opts.Emitter.OnLimited + em = NewLimiter(ctx, r, opts.Emitter.Rate, opts.Emitter.Burst, func() { + r.sys.recordRateLimited(name, r.currentEvent) + if limitedCallback != nil { + limitedCallback() + } + }) + } + // If it can emit, attach an emitter to it + if attachTo, ok := deriver.(AttachEmitter); ok { + attachTo.AttachEmitter(em) + } + // If it can derive, add it to the executor (and only after attaching the emitter) + if deriver != nil { + r.leaveExecutor = s.executor.Add(r, &opts.Executor) + } + return em +} + +func (s *Sys) Unregister(name string) (previous Emitter) { + s.regsLock.Lock() + defer s.regsLock.Unlock() + return s.unregister(name) +} + +func (s *Sys) unregister(name string) (previous Emitter) { + r, ok := s.regs[name] + if !ok { + return nil + } + r.cancel() + // if this was registered as deriver with the executor, then leave the executor + if r.leaveExecutor != nil { + r.leaveExecutor() + } + delete(s.regs, name) + return r +} + +// Stop shuts down the system +// by unregistering all emitters/derivers, +// freeing up executor resources. +func (s *Sys) Stop() { + s.regsLock.Lock() + defer s.regsLock.Unlock() + for _, r := range s.regs { + s.unregister(r.name) + } +} + +func (s *Sys) AddTracer(t Tracer) { + s.tracersLock.Lock() + defer s.tracersLock.Unlock() + s.tracers = append(s.tracers, t) +} + +func (s *Sys) RemoveTracer(t Tracer) { + s.tracersLock.Lock() + defer s.tracersLock.Unlock() + // We are not removing tracers often enough to optimize the deletion; + // instead we prefer fast and simple tracer iteration during regular operation. + s.tracers = slices.DeleteFunc(s.tracers, func(v Tracer) bool { + return v == t + }) +} + +// recordDeriv records that the deriver by name [deriv] is processing event [ev]. +// This returns a unique integer (during lifetime of Sys), usable as ID to reference processing. +func (s *Sys) recordDerivStart(name string, ev AnnotatedEvent, startTime time.Time) uint64 { + derivContext := s.derivContext.Add(1) + + s.tracersLock.RLock() + defer s.tracersLock.RUnlock() + for _, t := range s.tracers { + t.OnDeriveStart(name, ev, derivContext, startTime) + } + + return derivContext +} + +func (s *Sys) recordDerivEnd(name string, ev AnnotatedEvent, derivContext uint64, startTime time.Time, duration time.Duration, effect bool) { + s.tracersLock.RLock() + defer s.tracersLock.RUnlock() + for _, t := range s.tracers { + t.OnDeriveEnd(name, ev, derivContext, startTime, duration, effect) + } +} + +func (s *Sys) recordRateLimited(name string, derivContext uint64) { + s.tracersLock.RLock() + defer s.tracersLock.RUnlock() + s.log.Warn("Event-system emitter component was rate-limited", "emitter", name) + for _, t := range s.tracers { + t.OnRateLimited(name, derivContext) + } +} + +func (s *Sys) recordEmit(name string, ev AnnotatedEvent, derivContext uint64, emitTime time.Time) { + s.tracersLock.RLock() + defer s.tracersLock.RUnlock() + for _, t := range s.tracers { + t.OnEmit(name, ev, derivContext, emitTime) + } +} + +// emit an event [ev] during the derivation of another event, referenced by derivContext. +// If the event was emitted not as part of deriver event execution, then the derivContext is 0. +// The name of the emitter is provided to further contextualize the event. +func (s *Sys) emit(name string, derivContext uint64, ev Event) { + emitContext := s.emitContext.Add(1) + annotated := AnnotatedEvent{Event: ev, EmitContext: emitContext} + + // As soon as anything emits a critical event, + // make the system aware, before the executor event schedules it for processing. + if Is[CriticalErrorEvent](ev) { + s.abort.Store(true) + } + + emitTime := time.Now() + s.recordEmit(name, annotated, derivContext, emitTime) + + err := s.executor.Enqueue(annotated) + if err != nil { + s.log.Error("Failed to enqueue event", "emitter", name, "event", ev, "context", derivContext) + return + } +} diff --git a/op-node/rollup/event/system_test.go b/op-node/rollup/event/system_test.go new file mode 100644 index 000000000000..749eb681a75c --- /dev/null +++ b/op-node/rollup/event/system_test.go @@ -0,0 +1,150 @@ +package event + +import ( + "context" + "errors" + "testing" + + "github.com/stretchr/testify/require" + + "github.com/ethereum/go-ethereum/log" + + "github.com/ethereum-optimism/optimism/op-service/testlog" +) + +func TestSysTracing(t *testing.T) { + logger := testlog.Logger(t, log.LevelError) + ex := NewGlobalSynchronous(context.Background()) + sys := NewSystem(logger, ex) + count := 0 + foo := DeriverFunc(func(ev Event) bool { + switch ev.(type) { + case TestEvent: + count += 1 + return true + } + return false + }) + lgr, logs := testlog.CaptureLogger(t, log.LevelDebug) + logTracer := NewLogTracer(lgr, log.LevelDebug) + sys.AddTracer(logTracer) + + em := sys.Register("foo", foo, DefaultRegisterOpts()) + em.Emit(TestEvent{}) + require.Equal(t, 0, count, "no event processing before synchronous executor explicitly drains") + require.NoError(t, ex.Drain()) + require.Equal(t, 1, count) + + hasDebugLevel := testlog.NewLevelFilter(log.LevelDebug) + require.NotNil(t, logs.FindLog(hasDebugLevel, + testlog.NewMessageContainsFilter("Emitting event"))) + require.NotNil(t, logs.FindLog(hasDebugLevel, + testlog.NewMessageContainsFilter("Processing event"))) + require.NotNil(t, logs.FindLog(hasDebugLevel, + testlog.NewMessageContainsFilter("Processed event"))) + em.Emit(FooEvent{}) + require.NoError(t, ex.Drain()) + require.Equal(t, 1, count, "foo does not count") + + em.Emit(TestEvent{}) + require.NoError(t, ex.Drain()) + require.Equal(t, 2, count) + + logs.Clear() + sys.RemoveTracer(logTracer) + em.Emit(TestEvent{}) + require.NoError(t, ex.Drain()) + require.Equal(t, 3, count) + require.Equal(t, 0, len(*logs.Logs), "no logs when tracer is not active anymore") +} + +func TestSystemBroadcast(t *testing.T) { + logger := testlog.Logger(t, log.LevelError) + ex := NewGlobalSynchronous(context.Background()) + sys := NewSystem(logger, ex) + fooCount := 0 + foo := DeriverFunc(func(ev Event) bool { + switch ev.(type) { + case TestEvent: + fooCount += 1 + case FooEvent: + fooCount += 1 + default: + return false + } + return true + }) + barCount := 0 + bar := DeriverFunc(func(ev Event) bool { + switch ev.(type) { + case TestEvent: + barCount += 1 + case BarEvent: + barCount += 1 + default: + return false + } + return true + }) + fooEm := sys.Register("foo", foo, DefaultRegisterOpts()) + fooEm.Emit(TestEvent{}) + barEm := sys.Register("bar", bar, DefaultRegisterOpts()) + barEm.Emit(TestEvent{}) + // events are broadcast to every deriver, regardless who sends them + require.NoError(t, ex.Drain()) + require.Equal(t, 2, fooCount) + require.Equal(t, 2, barCount) + // emit from bar, process in foo + barEm.Emit(FooEvent{}) + require.NoError(t, ex.Drain()) + require.Equal(t, 3, fooCount) + require.Equal(t, 2, barCount) + // emit from foo, process in bar + fooEm.Emit(BarEvent{}) + require.NoError(t, ex.Drain()) + require.Equal(t, 3, fooCount) + require.Equal(t, 3, barCount) +} + +func TestCriticalError(t *testing.T) { + logger := testlog.Logger(t, log.LevelError) + count := 0 + seenCrit := 0 + deriverFn := DeriverFunc(func(ev Event) bool { + switch ev.(type) { + case CriticalErrorEvent: + seenCrit += 1 + default: + count += 1 + } + return true + }) + exec := NewGlobalSynchronous(context.Background()) + sys := NewSystem(logger, exec) + emitterA := sys.Register("a", deriverFn, DefaultRegisterOpts()) + emitterB := sys.Register("b", deriverFn, DefaultRegisterOpts()) + + require.NoError(t, exec.Drain(), "can drain, even if empty") + emitterA.Emit(TestEvent{}) + require.Equal(t, 0, count, "no processing yet, queued event") + require.NoError(t, exec.Drain()) + require.Equal(t, 2, count, "both A and B processed the event") + + emitterA.Emit(TestEvent{}) + emitterB.Emit(TestEvent{}) + testErr := errors.New("test crit error") + emitterB.Emit(CriticalErrorEvent{Err: testErr}) + require.Equal(t, 2, count, "no processing yet, queued events") + require.Equal(t, 0, seenCrit, "critical error events are still scheduled like normal") + require.True(t, sys.abort.Load(), "we are aware of the crit") + require.NoError(t, exec.Drain()) + require.Equal(t, 2, count, "still no processing, since we hit a crit error, the events are ignored") + require.Equal(t, 2, seenCrit, "but everyone has seen the crit now") + + // We are able to stop the processing now + sys.Stop() + + emitterA.Emit(TestEvent{}) + require.NoError(t, exec.Drain(), "system is closed, no further event processing") + require.Equal(t, 2, count) +} diff --git a/op-node/rollup/event/tracer.go b/op-node/rollup/event/tracer.go new file mode 100644 index 000000000000..658aa094e229 --- /dev/null +++ b/op-node/rollup/event/tracer.go @@ -0,0 +1,12 @@ +package event + +import ( + "time" +) + +type Tracer interface { + OnDeriveStart(name string, ev AnnotatedEvent, derivContext uint64, startTime time.Time) + OnDeriveEnd(name string, ev AnnotatedEvent, derivContext uint64, startTime time.Time, duration time.Duration, effect bool) + OnRateLimited(name string, derivContext uint64) + OnEmit(name string, ev AnnotatedEvent, derivContext uint64, emitTime time.Time) +} diff --git a/op-node/rollup/event/tracer_log.go b/op-node/rollup/event/tracer_log.go new file mode 100644 index 000000000000..a699df2e29d6 --- /dev/null +++ b/op-node/rollup/event/tracer_log.go @@ -0,0 +1,40 @@ +package event + +import ( + "log/slog" + "time" + + "github.com/ethereum/go-ethereum/log" +) + +type LogTracer struct { + log log.Logger + lvl slog.Level +} + +var _ Tracer = (*LogTracer)(nil) + +func NewLogTracer(log log.Logger, lvl slog.Level) *LogTracer { + return &LogTracer{ + log: log, + lvl: lvl, + } +} + +func (lt *LogTracer) OnDeriveStart(name string, ev AnnotatedEvent, derivContext uint64, startTime time.Time) { + lt.log.Log(lt.lvl, "Processing event", "deriver", name, "event", ev.Event, + "emit_context", ev.EmitContext, "deriv_context", derivContext) +} + +func (lt *LogTracer) OnDeriveEnd(name string, ev AnnotatedEvent, derivContext uint64, startTime time.Time, duration time.Duration, effect bool) { + lt.log.Log(lt.lvl, "Processed event", "deriver", name, "duration", duration, + "event", ev.Event, "emit_context", ev.EmitContext, "deriv_context", derivContext, "effect", effect) +} + +func (lt *LogTracer) OnRateLimited(name string, derivContext uint64) { + lt.log.Log(lt.lvl, "Rate-limited event-emission", "emitter", name, "context", derivContext) +} + +func (lt *LogTracer) OnEmit(name string, ev AnnotatedEvent, derivContext uint64, emitTime time.Time) { + lt.log.Log(lt.lvl, "Emitting event", "emitter", name, "event", ev.Event, "emit_context", ev.EmitContext, "deriv_context", derivContext) +} diff --git a/op-node/rollup/event/tracer_metrics.go b/op-node/rollup/event/tracer_metrics.go new file mode 100644 index 000000000000..87894d224b6a --- /dev/null +++ b/op-node/rollup/event/tracer_metrics.go @@ -0,0 +1,31 @@ +package event + +import "time" + +type MetricsTracer struct { + metrics Metrics +} + +var _ Tracer = (*MetricsTracer)(nil) + +func NewMetricsTracer(m Metrics) *MetricsTracer { + return &MetricsTracer{metrics: m} +} + +func (mt *MetricsTracer) OnDeriveStart(name string, ev AnnotatedEvent, derivContext uint64, startTime time.Time) { +} + +func (mt *MetricsTracer) OnDeriveEnd(name string, ev AnnotatedEvent, derivContext uint64, startTime time.Time, duration time.Duration, effect bool) { + if !effect { // don't count events that were just pass-through and not of any effect + return + } + mt.metrics.RecordProcessedEvent(ev.Event.String(), name, duration) +} + +func (mt *MetricsTracer) OnRateLimited(name string, derivContext uint64) { + mt.metrics.RecordEventsRateLimited() +} + +func (mt *MetricsTracer) OnEmit(name string, ev AnnotatedEvent, derivContext uint64, emitTime time.Time) { + mt.metrics.RecordEmittedEvent(ev.Event.String(), name) +} diff --git a/op-node/rollup/event/tracer_sequence.go b/op-node/rollup/event/tracer_sequence.go new file mode 100644 index 000000000000..938c0460cdf7 --- /dev/null +++ b/op-node/rollup/event/tracer_sequence.go @@ -0,0 +1,86 @@ +package event + +import ( + "fmt" + "strings" +) + +type SequenceTracer struct { + StructTracer +} + +var _ Tracer = (*SequenceTracer)(nil) + +func NewSequenceTracer() *SequenceTracer { + return &SequenceTracer{} +} + +func (st *SequenceTracer) Output(showDurations bool) string { + st.l.Lock() + defer st.l.Unlock() + out := new(strings.Builder) + out.WriteString(` + + + + + Sequence trace + + +Sequence: +
+`)
+
+	// Docs: https://mermaid.js.org/syntax/sequenceDiagram.html
+	_, _ = fmt.Fprintln(out, "sequenceDiagram")
+	// make sure the System is always the left-most entry in the diagram
+	_, _ = fmt.Fprintln(out, "    participant System")
+	// other participants are implied by the following events
+
+	denyList := make(map[uint64]struct{})
+	for _, e := range st.Entries {
+		if e.Kind == TraceDeriveEnd && !e.DeriveEnd.Effect {
+			denyList[e.DerivContext] = struct{}{}
+		}
+	}
+	for _, e := range st.Entries {
+		// omit entries which just passed through but did not have any effective processing
+		if e.DerivContext != 0 {
+			if _, ok := denyList[e.DerivContext]; ok {
+				continue
+			}
+		}
+		switch e.Kind {
+		case TraceDeriveStart:
+			_, _ = fmt.Fprintf(out, "    %%%% deriver-start %d\n", e.DerivContext)
+			_, _ = fmt.Fprintf(out, "    System ->> %s: derive %s (%d)\n", e.Name, e.EventName, e.EmitContext)
+			_, _ = fmt.Fprintf(out, "    activate %s\n", e.Name)
+		case TraceDeriveEnd:
+			_, _ = fmt.Fprintf(out, "    deactivate %s\n", e.Name)
+			if showDurations {
+				_, _ = fmt.Fprintf(out, "    Note over %s: duration: %s\n", e.Name, strings.ReplaceAll(e.DeriveEnd.Duration.String(), "µ", "#181;"))
+			}
+			_, _ = fmt.Fprintf(out, "    %%%% deriver-end %d\n", e.DerivContext)
+		case TraceRateLimited:
+			_, _ = fmt.Fprintf(out, "    Note over %s: rate-limited\n", e.Name)
+		case TraceEmit:
+			_, _ = fmt.Fprintf(out, "    %%%% emit originates from %d\n", e.DerivContext)
+			_, _ = fmt.Fprintf(out, "    %s -->> System: emit %s (%d)\n", e.Name, e.EventName, e.EmitContext)
+			_, _ = fmt.Fprintln(out, "    activate System")
+			_, _ = fmt.Fprintln(out, "    deactivate System")
+		}
+	}
+
+	out.WriteString(`
+
+ + + + +`) + return out.String() +} diff --git a/op-node/rollup/event/tracer_struct.go b/op-node/rollup/event/tracer_struct.go new file mode 100644 index 000000000000..b3999153056b --- /dev/null +++ b/op-node/rollup/event/tracer_struct.go @@ -0,0 +1,101 @@ +package event + +import ( + "sync" + "time" +) + +type TraceEntryKind int + +const ( + TraceDeriveStart TraceEntryKind = iota + TraceDeriveEnd + TraceRateLimited + TraceEmit +) + +type TraceEntry struct { + Kind TraceEntryKind + + Name string + DerivContext uint64 + + // Not present if Kind == TraceRateLimited + EmitContext uint64 + // Not present if Kind == TraceRateLimited + EventName string + + // Set to deriver start-time if derive-start/end, or emit-time if emitted. Not set if Kind == TraceRateLimited + EventTime time.Time + + // Only present if Kind == TraceDeriveEnd + DeriveEnd struct { + Duration time.Duration + Effect bool + } +} + +type StructTracer struct { + l sync.Mutex + + Entries []TraceEntry +} + +var _ Tracer = (*StructTracer)(nil) + +func NewStructTracer() *StructTracer { + return &StructTracer{} +} + +func (st *StructTracer) OnDeriveStart(name string, ev AnnotatedEvent, derivContext uint64, startTime time.Time) { + st.l.Lock() + defer st.l.Unlock() + st.Entries = append(st.Entries, TraceEntry{ + Kind: TraceDeriveStart, + Name: name, + EventName: ev.Event.String(), + EmitContext: ev.EmitContext, + DerivContext: derivContext, + EventTime: startTime, + }) +} + +func (st *StructTracer) OnDeriveEnd(name string, ev AnnotatedEvent, derivContext uint64, startTime time.Time, duration time.Duration, effect bool) { + st.l.Lock() + defer st.l.Unlock() + st.Entries = append(st.Entries, TraceEntry{ + Kind: TraceDeriveEnd, + Name: name, + EventName: ev.Event.String(), + EmitContext: ev.EmitContext, + DerivContext: derivContext, + EventTime: startTime, + DeriveEnd: struct { + Duration time.Duration + Effect bool + }{Duration: duration, Effect: effect}, + }) +} + +func (st *StructTracer) OnRateLimited(name string, derivContext uint64) { + st.l.Lock() + defer st.l.Unlock() + st.Entries = append(st.Entries, TraceEntry{ + Kind: TraceRateLimited, + Name: name, + DerivContext: derivContext, + }) +} + +func (st *StructTracer) OnEmit(name string, ev AnnotatedEvent, derivContext uint64, emitTime time.Time) { + st.l.Lock() + defer st.l.Unlock() + st.Entries = append(st.Entries, TraceEntry{ + Kind: TraceEmit, + Name: name, + EventName: ev.Event.String(), + EmitContext: ev.EmitContext, + DerivContext: derivContext, + EventTime: emitTime, + }) +} diff --git a/op-node/rollup/event/tracer_timing.go b/op-node/rollup/event/tracer_timing.go new file mode 100644 index 000000000000..de20481a21b6 --- /dev/null +++ b/op-node/rollup/event/tracer_timing.go @@ -0,0 +1,237 @@ +package event + +import ( + "fmt" + "sort" + "strings" + "time" + + "golang.org/x/exp/maps" +) + +// TimingTracer generates an HTML output with an SVG that shows, +// per deriver, per event-type, bands for event-execution scaled by the execution time. +// This trace gives an idea of patterns between events and where execution-time is spent. +type TimingTracer struct { + StructTracer +} + +var _ Tracer = (*TimingTracer)(nil) + +func NewTimingTracer() *TimingTracer { + return &TimingTracer{} +} + +func (st *TimingTracer) Output() string { + st.l.Lock() + defer st.l.Unlock() + out := new(strings.Builder) + out.WriteString(` + + + + + Timing trace + + +`) + + var minTime, maxTime time.Time + denyList := make(map[uint64]struct{}) + for _, e := range st.Entries { + if e.Kind == TraceDeriveEnd && !e.DeriveEnd.Effect { + denyList[e.DerivContext] = struct{}{} + } + if e.EventTime != (time.Time{}) && (minTime == (time.Time{}) || minTime.After(e.EventTime)) { + minTime = e.EventTime + } + if e.EventTime != (time.Time{}) && (maxTime == (time.Time{}) || e.EventTime.After(maxTime)) { + maxTime = e.EventTime + } + } + + // Time spent on wallclock + realTime := maxTime.Sub(minTime) + + // Accumulate entries grouped by actor, and then by event-name. + byActor := make(map[string]map[string][]TraceEntry) + rows := 0 + for _, e := range st.Entries { + if e.Kind != TraceDeriveEnd && e.Kind != TraceEmit { + continue + } + // Omit entries which just passed through but did not have any effective processing + if e.DerivContext != 0 { + if _, ok := denyList[e.DerivContext]; ok { + continue + } + } + m, ok := byActor[e.Name] + if !ok { + m = make(map[string][]TraceEntry) + byActor[e.Name] = m + } + if len(m[e.EventName]) == 0 { + rows += 1 + } + m[e.EventName] = append(m[e.EventName], e) + } + // for tick marks + rows += 2 + + // warning: viewbox resolution bounds: 24-bit max resolution, and 8-bit sub-pixel resolution + leftOffset := float64(300) + width := float64(2000) + incrementY := float64(10) + + height := float64(rows) * incrementY + + // min-x, min-y, width, and height + _, _ = fmt.Fprintf(out, ` +`, + -leftOffset, 0.0, leftOffset+width, height, rows*10) + + drawText := func(x, y float64, txt string) { + _, _ = fmt.Fprintf(out, `%s +`, + x, y, txt) + } + drawBox := func(x, y float64, w, h float64, strokeColor string, color string) { + strokeTxt := "" + if strokeColor != "" { + strokeTxt = `stroke="` + strokeColor + `" stroke-width="0.5px"` + } + _, _ = fmt.Fprintf(out, ` +`, color, strokeTxt, x, y, w, h) + } + drawCircle := func(x, y float64, r float64, strokeColor string, color string) { + strokeTxt := "" + if strokeColor != "" { + strokeTxt = `stroke="` + strokeColor + `" stroke-width="0.5px"` + } + _, _ = fmt.Fprintf(out, ` +`, color, strokeTxt, x, y, r) + } + drawLine := func(x1, y1, x2, y2 float64, strokeWidth float64) { + _, _ = fmt.Fprintf(out, ` +`, strokeWidth, x1, y1, x2, y2) + } + + timeToX := func(v time.Time) float64 { + return width * float64(v.Sub(minTime)) / float64(realTime) + } + + durationToX := func(v time.Duration) float64 { + return width * float64(v) / float64(realTime) + } + + // sort the keys, to get deterministic diagram order + actors := maps.Keys(byActor) + sort.Strings(actors) + + offsetY := float64(0) + textX := -leftOffset + derivCoords := make(map[uint64]struct{ x, y float64 }) + emitCoords := make(map[uint64]struct{ x, y float64 }) + row := 0 + for _, actorName := range actors { + + m := byActor[actorName] + derived := maps.Keys(m) + sort.Strings(derived) + + for _, d := range derived { + if row%2 == 0 { + drawBox(-leftOffset/2, offsetY, width+leftOffset/2, incrementY, "", "#f4f4f4") + } + row += 1 + + drawLine(textX+leftOffset/2, offsetY, width, offsetY, 0.5) + drawText(textX+leftOffset/2, offsetY, d) + + entries := m[d] + + for _, e := range entries { + if e.Kind != TraceDeriveEnd && e.Kind != TraceEmit { + continue + } + x := timeToX(e.EventTime) + y := offsetY + if e.Kind == TraceDeriveEnd { + derivCoords[e.DerivContext] = struct{ x, y float64 }{x: x, y: y} + drawBox(x, y, durationToX(e.DeriveEnd.Duration), incrementY, "#aad", "#aad") + } + if e.Kind == TraceEmit { + emitCoords[e.EmitContext] = struct{ x, y float64 }{x: x, y: y} + // draw tiny point-centered circle to indicate event emission + r := incrementY / 4 + drawCircle(x, y+(incrementY/2), r, "#daa", "#daa") + } + } + offsetY += incrementY + } + } + + offsetY = float64(0) + for _, actorName := range actors { + subSectionH := incrementY * float64(len(byActor[actorName])) + drawText(textX+8.0, offsetY+subSectionH/2-incrementY/2, strings.ToUpper(actorName)) + drawLine(textX, offsetY, width, offsetY, 2) // horizontal separator line to group actors + offsetY += subSectionH + } + drawLine(textX, offsetY, width, offsetY, 2) // horizontal separator line to group actors + + // draw lines between event-emissions and event-execution + for _, actorName := range actors { + m := byActor[actorName] + derived := maps.Keys(m) + sort.Strings(derived) + for _, d := range derived { + entries := m[d] + for _, e := range entries { + if e.Kind == TraceDeriveEnd { + emitFrom, ok := emitCoords[e.EmitContext] + if !ok { + continue + } + derivTo := derivCoords[e.DerivContext] + drawLine(emitFrom.x, emitFrom.y+(incrementY/2), derivTo.x, derivTo.y+(incrementY/2), 0.5) + } + } + } + } + // draw tick marks + delta := realTime / 20 + minDelta := time.Millisecond * 10 + for { + if delta.Truncate(minDelta) == (delta + delta/3).Truncate(minDelta) { + delta = minDelta + break + } else { + minDelta *= 2 + } + } + minTime = minTime.UTC() + // Round up to nearest multiple of delta (assuming delta < 1s) + start := delta - (time.Duration(minTime.Nanosecond()) % delta) + for x := start; x < realTime; { + posX := durationToX(x) + drawLine(posX, offsetY, posX, offsetY+incrementY/4, 2) + drawText(posX-incrementY, offsetY+incrementY/4, minTime.Add(x).Format("15:04:05.000")) + x += delta + } + // main label <> content separator line + drawLine(0, 0, 0, height, 1) + + out.WriteString(` + + + +`) + return out.String() +} diff --git a/op-node/rollup/event/util.go b/op-node/rollup/event/util.go new file mode 100644 index 000000000000..5391d312d7ab --- /dev/null +++ b/op-node/rollup/event/util.go @@ -0,0 +1,19 @@ +package event + +// Is as helper function is syntax-sugar to do an Event type check as a boolean function +func Is[T Event](ev Event) bool { + _, ok := ev.(T) + return ok +} + +// Any as helper function combines different event conditions into a single function +func Any(fns ...func(ev Event) bool) func(ev Event) bool { + return func(ev Event) bool { + for _, fn := range fns { + if fn(ev) { + return true + } + } + return false + } +} diff --git a/op-node/rollup/event/util_test.go b/op-node/rollup/event/util_test.go new file mode 100644 index 000000000000..48f73c5c6c48 --- /dev/null +++ b/op-node/rollup/event/util_test.go @@ -0,0 +1,37 @@ +package event + +import ( + "testing" + + "github.com/stretchr/testify/require" +) + +type FooEvent struct{} + +func (ev FooEvent) String() string { + return "foo" +} + +type BarEvent struct{} + +func (ev BarEvent) String() string { + return "bar" +} + +func TestIs(t *testing.T) { + require.False(t, Is[TestEvent](FooEvent{})) + require.False(t, Is[TestEvent](BarEvent{})) + require.True(t, Is[FooEvent](FooEvent{})) + require.True(t, Is[BarEvent](BarEvent{})) +} + +func TestAny(t *testing.T) { + require.False(t, Any()(FooEvent{})) + require.False(t, Any(Is[BarEvent])(FooEvent{})) + require.True(t, Any(Is[FooEvent])(FooEvent{})) + require.False(t, Any(Is[TestEvent], Is[BarEvent])(FooEvent{})) + require.True(t, Any(Is[TestEvent], Is[BarEvent], Is[FooEvent])(FooEvent{})) + require.True(t, Any(Is[FooEvent], Is[BarEvent], Is[TestEvent])(FooEvent{})) + require.True(t, Any(Is[FooEvent], Is[FooEvent], Is[FooEvent])(FooEvent{})) + require.False(t, Any(Is[FooEvent], Is[FooEvent], Is[FooEvent])(BarEvent{})) +} diff --git a/op-node/rollup/finality/altda.go b/op-node/rollup/finality/altda.go new file mode 100644 index 000000000000..c60953cbab5c --- /dev/null +++ b/op-node/rollup/finality/altda.go @@ -0,0 +1,57 @@ +package finality + +import ( + "context" + + "github.com/ethereum/go-ethereum/log" + + altda "github.com/ethereum-optimism/optimism/op-alt-da" + "github.com/ethereum-optimism/optimism/op-node/rollup" + "github.com/ethereum-optimism/optimism/op-node/rollup/event" + "github.com/ethereum-optimism/optimism/op-service/eth" +) + +type AltDABackend interface { + // Finalize notifies the L1 finalized head so AltDA finality is always behind L1. + Finalize(ref eth.L1BlockRef) + // OnFinalizedHeadSignal sets the engine finalization signal callback. + OnFinalizedHeadSignal(f altda.HeadSignalFn) +} + +// AltDAFinalizer is a special type of Finalizer, wrapping a regular Finalizer, +// but overriding the finality signal handling: +// it proxies L1 finality signals to the AltDA backend, +// and relies on the backend to then signal when finality is really applicable. +type AltDAFinalizer struct { + *Finalizer + backend AltDABackend +} + +func NewAltDAFinalizer(ctx context.Context, log log.Logger, cfg *rollup.Config, + l1Fetcher FinalizerL1Interface, + backend AltDABackend) *AltDAFinalizer { + + inner := NewFinalizer(ctx, log, cfg, l1Fetcher) + + // In alt-da mode, the finalization signal is proxied through the AltDA manager. + // Finality signal will come from the DA contract or L1 finality whichever is last. + // The AltDA module will then call the inner.Finalize function when applicable. + backend.OnFinalizedHeadSignal(func(ref eth.L1BlockRef) { + inner.OnEvent(FinalizeL1Event{FinalizedL1: ref}) + }) + + return &AltDAFinalizer{ + Finalizer: inner, + backend: backend, + } +} + +func (fi *AltDAFinalizer) OnEvent(ev event.Event) bool { + switch x := ev.(type) { + case FinalizeL1Event: + fi.backend.Finalize(x.FinalizedL1) + return true + default: + return fi.Finalizer.OnEvent(ev) + } +} diff --git a/op-node/rollup/finality/altda_test.go b/op-node/rollup/finality/altda_test.go new file mode 100644 index 000000000000..e100cc892d31 --- /dev/null +++ b/op-node/rollup/finality/altda_test.go @@ -0,0 +1,191 @@ +package finality + +import ( + "context" + "math/rand" // nosemgrep + "testing" + + "github.com/stretchr/testify/require" + + "github.com/ethereum/go-ethereum/common" + "github.com/ethereum/go-ethereum/log" + + altda "github.com/ethereum-optimism/optimism/op-alt-da" + "github.com/ethereum-optimism/optimism/op-node/rollup" + "github.com/ethereum-optimism/optimism/op-node/rollup/derive" + "github.com/ethereum-optimism/optimism/op-node/rollup/engine" + "github.com/ethereum-optimism/optimism/op-node/rollup/event" + "github.com/ethereum-optimism/optimism/op-service/eth" + "github.com/ethereum-optimism/optimism/op-service/testlog" + "github.com/ethereum-optimism/optimism/op-service/testutils" +) + +type fakeAltDABackend struct { + altDAFn altda.HeadSignalFn + forwardTo altda.HeadSignalFn +} + +func (b *fakeAltDABackend) Finalize(ref eth.L1BlockRef) { + b.altDAFn(ref) +} + +func (b *fakeAltDABackend) OnFinalizedHeadSignal(f altda.HeadSignalFn) { + b.forwardTo = f +} + +var _ AltDABackend = (*fakeAltDABackend)(nil) + +func TestAltDAFinalityData(t *testing.T) { + logger := testlog.Logger(t, log.LevelInfo) + l1F := &testutils.MockL1Source{} + + rng := rand.New(rand.NewSource(1234)) + + refA := testutils.RandomBlockRef(rng) + refA0 := eth.L2BlockRef{ + Hash: testutils.RandomHash(rng), + Number: 0, + ParentHash: common.Hash{}, + Time: refA.Time, + L1Origin: refA.ID(), + SequenceNumber: 0, + } + + cfg := &rollup.Config{ + Genesis: rollup.Genesis{ + L1: refA.ID(), + L2: refA0.ID(), + L2Time: refA0.Time, + SystemConfig: eth.SystemConfig{ + BatcherAddr: common.Address{42}, + Overhead: [32]byte{123}, + Scalar: [32]byte{42}, + GasLimit: 20_000_000, + }, + }, + BlockTime: 1, + SeqWindowSize: 2, + } + altDACfg := &rollup.AltDAConfig{ + DAChallengeWindow: 90, + DAResolveWindow: 90, + } + // shoud return l1 finality if altda is not enabled + require.Equal(t, uint64(defaultFinalityLookback), calcFinalityLookback(cfg)) + + cfg.AltDAConfig = altDACfg + expFinalityLookback := 181 + require.Equal(t, uint64(expFinalityLookback), calcFinalityLookback(cfg)) + + refA1 := eth.L2BlockRef{ + Hash: testutils.RandomHash(rng), + Number: refA0.Number + 1, + ParentHash: refA0.Hash, + Time: refA0.Time + cfg.BlockTime, + L1Origin: refA.ID(), + SequenceNumber: 1, + } + + // Simulate altda finality by waiting for the finalized-inclusion + // of a commitment to turn into undisputed finalized data. + commitmentInclusionFinalized := eth.L1BlockRef{} + altDABackend := &fakeAltDABackend{ + altDAFn: func(ref eth.L1BlockRef) { + commitmentInclusionFinalized = ref + }, + forwardTo: nil, + } + + emitter := &testutils.MockEmitter{} + fi := NewAltDAFinalizer(context.Background(), logger, cfg, l1F, altDABackend) + fi.AttachEmitter(emitter) + require.NotNil(t, altDABackend.forwardTo, "altda backend must have access to underlying standard finalizer") + + require.Equal(t, expFinalityLookback, cap(fi.finalityData)) + + l1parent := refA + l2parent := refA1 + + // advance over 200 l1 origins each time incrementing new l2 safe heads + // and post processing. + for i := uint64(0); i < 200; i++ { + if i == 10 { // finalize a L1 commitment + fi.OnEvent(FinalizeL1Event{FinalizedL1: l1parent}) + emitter.AssertExpectations(t) // no events emitted upon L1 finality + require.Equal(t, l1parent, commitmentInclusionFinalized, "altda backend received L1 signal") + } + + previous := l1parent + l1parent = eth.L1BlockRef{ + Hash: testutils.RandomHash(rng), + Number: previous.Number + 1, + ParentHash: previous.Hash, + Time: previous.Time + 12, + } + + for j := uint64(0); j < 2; j++ { + l2parent = eth.L2BlockRef{ + Hash: testutils.RandomHash(rng), + Number: l2parent.Number + 1, + ParentHash: l2parent.Hash, + Time: l2parent.Time + cfg.BlockTime, + L1Origin: previous.ID(), // reference previous origin, not the block the batch was included in + SequenceNumber: j, + } + fi.OnEvent(engine.SafeDerivedEvent{Safe: l2parent, DerivedFrom: l1parent}) + emitter.AssertExpectations(t) + } + // might trigger finalization attempt, if expired finality delay + emitter.ExpectMaybeRun(func(ev event.Event) { + require.IsType(t, TryFinalizeEvent{}, ev) + }) + fi.OnEvent(derive.DeriverIdleEvent{}) + emitter.AssertExpectations(t) + // clear expectations + emitter.Mock.ExpectedCalls = nil + + // no L2 finalize event, as no L1 finality signal has been forwarded by altda backend yet + fi.OnEvent(TryFinalizeEvent{}) + emitter.AssertExpectations(t) + + // Pretend to be the altda backend, + // send the original finalization signal to the underlying finalizer, + // now that we are sure the commitment itself is not just finalized, + // but the referenced data cannot be disputed anymore. + altdaFinalization := commitmentInclusionFinalized.Number + cfg.AltDAConfig.DAChallengeWindow + if commitmentInclusionFinalized != (eth.L1BlockRef{}) && l1parent.Number == altdaFinalization { + // When the signal is forwarded, a finalization attempt will be scheduled + emitter.ExpectOnce(TryFinalizeEvent{}) + altDABackend.forwardTo(commitmentInclusionFinalized) + emitter.AssertExpectations(t) + require.Equal(t, commitmentInclusionFinalized, fi.finalizedL1, "finality signal now made its way in regular finalizer") + + // As soon as a finalization attempt is made, after the finality signal was triggered by altda backend, + // we should get an attempt to get a finalized L2 block. + // In this test the L1 origin of the simulated L2 blocks lags 1 behind the block the L2 block is included in on L1. + // So to check the L2 finality progress, we check if the next L1 block after the L1 origin + // of the safe block matches that of the finalized L1 block. + l1F.ExpectL1BlockRefByNumber(commitmentInclusionFinalized.Number, commitmentInclusionFinalized, nil) + l1F.ExpectL1BlockRefByNumber(commitmentInclusionFinalized.Number, commitmentInclusionFinalized, nil) + var finalizedL2 eth.L2BlockRef + emitter.ExpectOnceRun(func(ev event.Event) { + if x, ok := ev.(engine.PromoteFinalizedEvent); ok { + finalizedL2 = x.Ref + } else { + t.Fatalf("expected L2 finalization, but got: %s", ev) + } + }) + fi.OnEvent(TryFinalizeEvent{}) + l1F.AssertExpectations(t) + emitter.AssertExpectations(t) + require.Equal(t, commitmentInclusionFinalized.Number, finalizedL2.L1Origin.Number+1) + // Confirm finalization, so there will be no repeats of the PromoteFinalizedEvent + fi.OnEvent(engine.ForkchoiceUpdateEvent{FinalizedL2Head: finalizedL2}) + emitter.AssertExpectations(t) + } + } + + // finality data does not go over challenge + resolve windows + 1 capacity + // (prunes down to 180 then adds the extra 1 each time) + require.Equal(t, expFinalityLookback, len(fi.finalityData)) +} diff --git a/op-node/rollup/finality/finalizer.go b/op-node/rollup/finality/finalizer.go new file mode 100644 index 000000000000..046b94664e05 --- /dev/null +++ b/op-node/rollup/finality/finalizer.go @@ -0,0 +1,287 @@ +package finality + +import ( + "context" + "fmt" + "sync" + "time" + + "github.com/ethereum/go-ethereum/log" + + "github.com/ethereum-optimism/optimism/op-node/rollup" + "github.com/ethereum-optimism/optimism/op-node/rollup/derive" + "github.com/ethereum-optimism/optimism/op-node/rollup/engine" + "github.com/ethereum-optimism/optimism/op-node/rollup/event" + "github.com/ethereum-optimism/optimism/op-service/eth" +) + +// defaultFinalityLookback defines the amount of L1<>L2 relations to track for finalization purposes, one per L1 block. +// +// When L1 finalizes blocks, it finalizes finalityLookback blocks behind the L1 head. +// Non-finality may take longer, but when it does finalize again, it is within this range of the L1 head. +// Thus we only need to retain the L1<>L2 derivation relation data of this many L1 blocks. +// +// In the event of older finalization signals, misconfiguration, or insufficient L1<>L2 derivation relation data, +// then we may miss the opportunity to finalize more L2 blocks. +// This does not cause any divergence, it just causes lagging finalization status. +// +// The beacon chain on mainnet has 32 slots per epoch, +// and new finalization events happen at most 4 epochs behind the head. +// And then we add 1 to make pruning easier by leaving room for a new item without pruning the 32*4. +const defaultFinalityLookback = 4*32 + 1 + +// finalityDelay is the number of L1 blocks to traverse before trying to finalize L2 blocks again. +// We do not want to do this too often, since it requires fetching a L1 block by number, so no cache data. +const finalityDelay = 64 + +// calcFinalityLookback calculates the default finality lookback based on DA challenge window if altDA +// mode is activated or L1 finality lookback. +func calcFinalityLookback(cfg *rollup.Config) uint64 { + // in alt-da 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.AltDAEnabled() { + lkb := cfg.AltDAConfig.DAChallengeWindow + cfg.AltDAConfig.DAResolveWindow + 1 + // in the case only if the altDA windows are longer than the default finality lookback + if lkb > defaultFinalityLookback { + return lkb + } + } + return defaultFinalityLookback +} + +type FinalityData struct { + // The last L2 block that was fully derived and inserted into the L2 engine while processing this L1 block. + L2Block eth.L2BlockRef + // The L1 block this stage was at when inserting the L2 block. + // When this L1 block is finalized, the L2 chain up to this block can be fully reproduced from finalized L1 data. + L1Block eth.BlockID +} + +type FinalizerEngine interface { + Finalized() eth.L2BlockRef + SetFinalizedHead(eth.L2BlockRef) +} + +type FinalizerL1Interface interface { + L1BlockRefByNumber(context.Context, uint64) (eth.L1BlockRef, error) +} + +type Finalizer struct { + mu sync.Mutex + + log log.Logger + + ctx context.Context + + emitter event.Emitter + + // finalizedL1 is the currently perceived finalized L1 block. + // This may be ahead of the current traversed origin when syncing. + finalizedL1 eth.L1BlockRef + + // lastFinalizedL2 maintains how far we finalized, so we don't have to emit re-attempts. + lastFinalizedL2 eth.L2BlockRef + + // triedFinalizeAt tracks at which L1 block number we last tried to finalize during sync. + triedFinalizeAt uint64 + + // Tracks which L2 blocks where last derived from which L1 block. At most finalityLookback large. + finalityData []FinalityData + + // Maximum amount of L2 blocks to store in finalityData. + finalityLookback uint64 + + l1Fetcher FinalizerL1Interface +} + +func NewFinalizer(ctx context.Context, log log.Logger, cfg *rollup.Config, l1Fetcher FinalizerL1Interface) *Finalizer { + lookback := calcFinalityLookback(cfg) + return &Finalizer{ + ctx: ctx, + log: log, + finalizedL1: eth.L1BlockRef{}, + triedFinalizeAt: 0, + finalityData: make([]FinalityData, 0, lookback), + finalityLookback: lookback, + l1Fetcher: l1Fetcher, + } +} + +func (fi *Finalizer) AttachEmitter(em event.Emitter) { + fi.emitter = em +} + +// FinalizedL1 identifies the L1 chain (incl.) that included and/or produced all the finalized L2 blocks. +// This may return a zeroed ID if no finalization signals have been seen yet. +func (fi *Finalizer) FinalizedL1() (out eth.L1BlockRef) { + fi.mu.Lock() + defer fi.mu.Unlock() + out = fi.finalizedL1 + return +} + +type FinalizeL1Event struct { + FinalizedL1 eth.L1BlockRef +} + +func (ev FinalizeL1Event) String() string { + return "finalized-l1" +} + +type TryFinalizeEvent struct{} + +func (ev TryFinalizeEvent) String() string { + return "try-finalize" +} + +func (fi *Finalizer) OnEvent(ev event.Event) bool { + switch x := ev.(type) { + case FinalizeL1Event: + fi.onL1Finalized(x.FinalizedL1) + case engine.SafeDerivedEvent: + fi.onDerivedSafeBlock(x.Safe, x.DerivedFrom) + case derive.DeriverIdleEvent: + fi.onDerivationIdle(x.Origin) + case rollup.ResetEvent: + fi.onReset() + case TryFinalizeEvent: + fi.tryFinalize() + case engine.ForkchoiceUpdateEvent: + fi.lastFinalizedL2 = x.FinalizedL2Head + default: + return false + } + return true +} + +// onL1Finalized applies a L1 finality signal +func (fi *Finalizer) onL1Finalized(l1Origin eth.L1BlockRef) { + fi.mu.Lock() + defer fi.mu.Unlock() + prevFinalizedL1 := fi.finalizedL1 + if l1Origin.Number < fi.finalizedL1.Number { + fi.log.Error("ignoring old L1 finalized block signal! Is the L1 provider corrupted?", + "prev_finalized_l1", prevFinalizedL1, "signaled_finalized_l1", l1Origin) + return + } + + if fi.finalizedL1 != l1Origin { + // reset triedFinalizeAt, so we give finalization a shot with the new signal + fi.triedFinalizeAt = 0 + + // remember the L1 finalization signal + fi.finalizedL1 = l1Origin + } + + // when the L1 change we can suggest to try to finalize, as the pre-condition for L2 finality has now changed + fi.emitter.Emit(TryFinalizeEvent{}) +} + +// onDerivationIdle is called when the pipeline is exhausted of new data (i.e. no more L2 blocks to derive from). +// +// Since finality applies to all L2 blocks fully derived from the same block, +// it optimal to only check after the derivation from the L1 block has been exhausted. +// +// This will look at what has been buffered so far, +// sanity-check we are on the finalizing L1 chain, +// and finalize any L2 blocks that were fully derived from known finalized L1 blocks. +func (fi *Finalizer) onDerivationIdle(derivedFrom eth.L1BlockRef) { + fi.mu.Lock() + defer fi.mu.Unlock() + if fi.finalizedL1 == (eth.L1BlockRef{}) { + return // if no L1 information is finalized yet, then skip this + } + // If we recently tried finalizing, then don't try again just yet, but traverse more of L1 first. + if fi.triedFinalizeAt != 0 && derivedFrom.Number <= fi.triedFinalizeAt+finalityDelay { + return + } + fi.log.Debug("processing L1 finality information", "l1_finalized", fi.finalizedL1, "derived_from", derivedFrom, "previous", fi.triedFinalizeAt) + fi.triedFinalizeAt = derivedFrom.Number + fi.emitter.Emit(TryFinalizeEvent{}) +} + +func (fi *Finalizer) tryFinalize() { + fi.mu.Lock() + defer fi.mu.Unlock() + + // overwritten if we finalize + finalizedL2 := fi.lastFinalizedL2 // may be zeroed if nothing was finalized since startup. + var finalizedDerivedFrom eth.BlockID + // go through the latest inclusion data, and find the last L2 block that was derived from a finalized L1 block + for _, fd := range fi.finalityData { + if fd.L2Block.Number > finalizedL2.Number && fd.L1Block.Number <= fi.finalizedL1.Number { + finalizedL2 = fd.L2Block + finalizedDerivedFrom = fd.L1Block + // keep iterating, there may be later L2 blocks that can also be finalized + } + } + if finalizedDerivedFrom != (eth.BlockID{}) { + ctx, cancel := context.WithTimeout(fi.ctx, time.Second*10) + defer cancel() + // Sanity check the finality signal of L1. + // Even though the signal is trusted and we do the below check also, + // the signal itself has to be canonical to proceed. + // TODO(#10724): This check could be removed if the finality signal is fully trusted, and if tests were more flexible for this case. + signalRef, err := fi.l1Fetcher.L1BlockRefByNumber(ctx, fi.finalizedL1.Number) + if err != nil { + fi.emitter.Emit(rollup.L1TemporaryErrorEvent{Err: fmt.Errorf("failed to check if on finalizing L1 chain, could not fetch block %d: %w", fi.finalizedL1.Number, err)}) + return + } + if signalRef.Hash != fi.finalizedL1.Hash { + fi.emitter.Emit(rollup.ResetEvent{Err: fmt.Errorf("need to reset, we assumed %s is finalized, but canonical chain is %s", fi.finalizedL1, signalRef)}) + return + } + + // Sanity check we are indeed on the finalizing chain, and not stuck on something else. + // We assume that the block-by-number query is consistent with the previously received finalized chain signal + derivedRef, err := fi.l1Fetcher.L1BlockRefByNumber(ctx, finalizedDerivedFrom.Number) + if err != nil { + fi.emitter.Emit(rollup.L1TemporaryErrorEvent{Err: fmt.Errorf("failed to check if on finalizing L1 chain, could not fetch block %d: %w", finalizedDerivedFrom.Number, err)}) + return + } + if derivedRef.Hash != finalizedDerivedFrom.Hash { + fi.emitter.Emit(rollup.ResetEvent{Err: fmt.Errorf("need to reset, we are on %s, not on the finalizing L1 chain %s (towards %s)", + finalizedDerivedFrom, derivedRef, fi.finalizedL1)}) + return + } + fi.emitter.Emit(engine.PromoteFinalizedEvent{Ref: finalizedL2}) + } +} + +// onDerivedSafeBlock buffers the L1 block the safe head was fully derived from, +// to finalize it once the derived-from L1 block, or a later L1 block, finalizes. +func (fi *Finalizer) onDerivedSafeBlock(l2Safe eth.L2BlockRef, derivedFrom eth.L1BlockRef) { + fi.mu.Lock() + defer fi.mu.Unlock() + // remember the last L2 block that we fully derived from the given finality data + if len(fi.finalityData) == 0 || fi.finalityData[len(fi.finalityData)-1].L1Block.Number < derivedFrom.Number { + // prune finality data if necessary, before appending any data. + if uint64(len(fi.finalityData)) >= fi.finalityLookback { + fi.finalityData = append(fi.finalityData[:0], fi.finalityData[1:fi.finalityLookback]...) + } + // append entry for new L1 block + fi.finalityData = append(fi.finalityData, FinalityData{ + L2Block: l2Safe, + L1Block: derivedFrom.ID(), + }) + last := &fi.finalityData[len(fi.finalityData)-1] + fi.log.Debug("extended finality-data", "last_l1", last.L1Block, "last_l2", last.L2Block) + } else { + // if it's a new L2 block that was derived from the same latest L1 block, then just update the entry + last := &fi.finalityData[len(fi.finalityData)-1] + if last.L2Block != l2Safe { // avoid logging if there are no changes + last.L2Block = l2Safe + fi.log.Debug("updated finality-data", "last_l1", last.L1Block, "last_l2", last.L2Block) + } + } +} + +// onReset clears the recent history of safe-L2 blocks used for finalization, +// to avoid finalizing any reorged-out L2 blocks. +func (fi *Finalizer) onReset() { + fi.mu.Lock() + defer fi.mu.Unlock() + fi.finalityData = fi.finalityData[:0] + fi.triedFinalizeAt = 0 + // no need to reset finalizedL1, it's finalized after all +} diff --git a/op-node/rollup/finality/finalizer_test.go b/op-node/rollup/finality/finalizer_test.go new file mode 100644 index 000000000000..cdaf4006c0e0 --- /dev/null +++ b/op-node/rollup/finality/finalizer_test.go @@ -0,0 +1,475 @@ +package finality + +import ( + "context" + "errors" + "math/rand" // nosemgrep + "testing" + + "github.com/stretchr/testify/require" + + "github.com/ethereum/go-ethereum/common" + "github.com/ethereum/go-ethereum/log" + + "github.com/ethereum-optimism/optimism/op-node/rollup" + "github.com/ethereum-optimism/optimism/op-node/rollup/derive" + "github.com/ethereum-optimism/optimism/op-node/rollup/engine" + "github.com/ethereum-optimism/optimism/op-service/eth" + "github.com/ethereum-optimism/optimism/op-service/testlog" + "github.com/ethereum-optimism/optimism/op-service/testutils" +) + +func TestEngineQueue_Finalize(t *testing.T) { + rng := rand.New(rand.NewSource(1234)) + + l1Time := uint64(2) + refA := testutils.RandomBlockRef(rng) + + refB := eth.L1BlockRef{ + Hash: testutils.RandomHash(rng), + Number: refA.Number + 1, + ParentHash: refA.Hash, + Time: refA.Time + l1Time, + } + refC := eth.L1BlockRef{ + Hash: testutils.RandomHash(rng), + Number: refB.Number + 1, + ParentHash: refB.Hash, + Time: refB.Time + l1Time, + } + refD := eth.L1BlockRef{ + Hash: testutils.RandomHash(rng), + Number: refC.Number + 1, + ParentHash: refC.Hash, + Time: refC.Time + l1Time, + } + refE := eth.L1BlockRef{ + Hash: testutils.RandomHash(rng), + Number: refD.Number + 1, + ParentHash: refD.Hash, + Time: refD.Time + l1Time, + } + refF := eth.L1BlockRef{ + Hash: testutils.RandomHash(rng), + Number: refE.Number + 1, + ParentHash: refE.Hash, + Time: refE.Time + l1Time, + } + refG := eth.L1BlockRef{ + Hash: testutils.RandomHash(rng), + Number: refF.Number + 1, + ParentHash: refF.Hash, + Time: refF.Time + l1Time, + } + refH := eth.L1BlockRef{ + Hash: testutils.RandomHash(rng), + Number: refG.Number + 1, + ParentHash: refG.Hash, + Time: refG.Time + l1Time, + } + //refI := eth.L1BlockRef{ + // Hash: testutils.RandomHash(rng), + // Number: refH.Number + 1, + // ParentHash: refH.Hash, + // Time: refH.Time + l1Time, + //} + + refA0 := eth.L2BlockRef{ + Hash: testutils.RandomHash(rng), + Number: 0, + ParentHash: common.Hash{}, + Time: refA.Time, + L1Origin: refA.ID(), + SequenceNumber: 0, + } + cfg := &rollup.Config{ + Genesis: rollup.Genesis{ + L1: refA.ID(), + L2: refA0.ID(), + L2Time: refA0.Time, + }, + BlockTime: 1, + SeqWindowSize: 2, + } + refA1 := eth.L2BlockRef{ + Hash: testutils.RandomHash(rng), + Number: refA0.Number + 1, + ParentHash: refA0.Hash, + Time: refA0.Time + cfg.BlockTime, + L1Origin: refA.ID(), + SequenceNumber: 1, + } + refB0 := eth.L2BlockRef{ + Hash: testutils.RandomHash(rng), + Number: refA1.Number + 1, + ParentHash: refA1.Hash, + Time: refA1.Time + cfg.BlockTime, + L1Origin: refB.ID(), + SequenceNumber: 0, + } + refB1 := eth.L2BlockRef{ + Hash: testutils.RandomHash(rng), + Number: refB0.Number + 1, + ParentHash: refB0.Hash, + Time: refB0.Time + cfg.BlockTime, + L1Origin: refB.ID(), + SequenceNumber: 1, + } + refC0 := eth.L2BlockRef{ + Hash: testutils.RandomHash(rng), + Number: refB1.Number + 1, + ParentHash: refB1.Hash, + Time: refB1.Time + cfg.BlockTime, + L1Origin: refC.ID(), + SequenceNumber: 0, + } + refC1 := eth.L2BlockRef{ + Hash: testutils.RandomHash(rng), + Number: refC0.Number + 1, + ParentHash: refC0.Hash, + Time: refC0.Time + cfg.BlockTime, + L1Origin: refC.ID(), + SequenceNumber: 1, + } + refD0 := eth.L2BlockRef{ + Hash: testutils.RandomHash(rng), + Number: refC1.Number + 1, + ParentHash: refC1.Hash, + Time: refC1.Time + cfg.BlockTime, + L1Origin: refD.ID(), + SequenceNumber: 0, + } + refD1 := eth.L2BlockRef{ + Hash: testutils.RandomHash(rng), + Number: refD0.Number + 1, + ParentHash: refD0.Hash, + Time: refD0.Time + cfg.BlockTime, + L1Origin: refD.ID(), + SequenceNumber: 1, + } + refE0 := eth.L2BlockRef{ + Hash: testutils.RandomHash(rng), + Number: refD1.Number + 1, + ParentHash: refD1.Hash, + Time: refD1.Time + cfg.BlockTime, + L1Origin: refE.ID(), + SequenceNumber: 0, + } + refE1 := eth.L2BlockRef{ + Hash: testutils.RandomHash(rng), + Number: refE0.Number + 1, + ParentHash: refE0.Hash, + Time: refE0.Time + cfg.BlockTime, + L1Origin: refE.ID(), + SequenceNumber: 1, + } + refF0 := eth.L2BlockRef{ + Hash: testutils.RandomHash(rng), + Number: refE1.Number + 1, + ParentHash: refE1.Hash, + Time: refE1.Time + cfg.BlockTime, + L1Origin: refF.ID(), + SequenceNumber: 0, + } + refF1 := eth.L2BlockRef{ + Hash: testutils.RandomHash(rng), + Number: refF0.Number + 1, + ParentHash: refF0.Hash, + Time: refF0.Time + cfg.BlockTime, + L1Origin: refF.ID(), + SequenceNumber: 1, + } + _ = refF1 + + // We expect the L1 block that the finalized L2 data was derived from to be checked, + // to be sure it is part of the canonical chain, after the finalization signal. + t.Run("basic", func(t *testing.T) { + logger := testlog.Logger(t, log.LevelInfo) + l1F := &testutils.MockL1Source{} + defer l1F.AssertExpectations(t) + l1F.ExpectL1BlockRefByNumber(refD.Number, refD, nil) + l1F.ExpectL1BlockRefByNumber(refD.Number, refD, nil) + + emitter := &testutils.MockEmitter{} + fi := NewFinalizer(context.Background(), logger, &rollup.Config{}, l1F) + fi.AttachEmitter(emitter) + + // now say C1 was included in D and became the new safe head + fi.OnEvent(engine.SafeDerivedEvent{Safe: refC1, DerivedFrom: refD}) + fi.OnEvent(derive.DeriverIdleEvent{Origin: refD}) + emitter.AssertExpectations(t) + + // now say D0 was included in E and became the new safe head + fi.OnEvent(engine.SafeDerivedEvent{Safe: refD0, DerivedFrom: refE}) + fi.OnEvent(derive.DeriverIdleEvent{Origin: refE}) + emitter.AssertExpectations(t) + + // Let's finalize D from which we fully derived C1, but not D0 + // This will trigger an attempt of L2 finalization. + emitter.ExpectOnce(TryFinalizeEvent{}) + fi.OnEvent(FinalizeL1Event{FinalizedL1: refD}) + emitter.AssertExpectations(t) + + // C1 was included in finalized D, and should now be finalized + emitter.ExpectOnce(engine.PromoteFinalizedEvent{Ref: refC1}) + fi.OnEvent(TryFinalizeEvent{}) + emitter.AssertExpectations(t) + }) + + // Finality signal is received, but couldn't immediately be checked + t.Run("retry", func(t *testing.T) { + logger := testlog.Logger(t, log.LevelInfo) + l1F := &testutils.MockL1Source{} + defer l1F.AssertExpectations(t) + l1F.ExpectL1BlockRefByNumber(refD.Number, refD, errors.New("fake error")) + l1F.ExpectL1BlockRefByNumber(refD.Number, refD, nil) // to check finality signal + l1F.ExpectL1BlockRefByNumber(refD.Number, refD, nil) // to check what was derived from (same in this case) + + emitter := &testutils.MockEmitter{} + fi := NewFinalizer(context.Background(), logger, &rollup.Config{}, l1F) + fi.AttachEmitter(emitter) + + // now say C1 was included in D and became the new safe head + fi.OnEvent(engine.SafeDerivedEvent{Safe: refC1, DerivedFrom: refD}) + fi.OnEvent(derive.DeriverIdleEvent{Origin: refD}) + emitter.AssertExpectations(t) + + // now say D0 was included in E and became the new safe head + fi.OnEvent(engine.SafeDerivedEvent{Safe: refD0, DerivedFrom: refE}) + fi.OnEvent(derive.DeriverIdleEvent{Origin: refE}) + emitter.AssertExpectations(t) + + // let's finalize D from which we fully derived C1, but not D0 + emitter.ExpectOnce(TryFinalizeEvent{}) + fi.OnEvent(FinalizeL1Event{FinalizedL1: refD}) + emitter.AssertExpectations(t) + // C1 was included in finalized D, but finality could not be verified yet, due to temporary test error + emitter.ExpectOnceType("L1TemporaryErrorEvent") + fi.OnEvent(TryFinalizeEvent{}) + emitter.AssertExpectations(t) + + // upon the next signal we should schedule a finalization re-attempt + emitter.ExpectOnce(TryFinalizeEvent{}) + fi.OnEvent(derive.DeriverIdleEvent{Origin: refF}) + emitter.AssertExpectations(t) + + // C1 was included in finalized D, and should now be finalized, as check can succeed when revisited + emitter.ExpectOnce(engine.PromoteFinalizedEvent{Ref: refC1}) + fi.OnEvent(TryFinalizeEvent{}) + emitter.AssertExpectations(t) + }) + + // Test that finality progression can repeat a few times. + t.Run("repeat", func(t *testing.T) { + logger := testlog.Logger(t, log.LevelInfo) + l1F := &testutils.MockL1Source{} + defer l1F.AssertExpectations(t) + + emitter := &testutils.MockEmitter{} + fi := NewFinalizer(context.Background(), logger, &rollup.Config{}, l1F) + fi.AttachEmitter(emitter) + + fi.OnEvent(engine.SafeDerivedEvent{Safe: refC1, DerivedFrom: refD}) + fi.OnEvent(derive.DeriverIdleEvent{Origin: refD}) + emitter.AssertExpectations(t) + + fi.OnEvent(engine.SafeDerivedEvent{Safe: refD0, DerivedFrom: refE}) + fi.OnEvent(derive.DeriverIdleEvent{Origin: refE}) + emitter.AssertExpectations(t) + + // L1 finality signal will trigger L2 finality attempt + emitter.ExpectOnce(TryFinalizeEvent{}) + fi.OnEvent(FinalizeL1Event{FinalizedL1: refD}) + emitter.AssertExpectations(t) + + // C1 was included in D, and should be finalized now + emitter.ExpectOnce(engine.PromoteFinalizedEvent{Ref: refC1}) + l1F.ExpectL1BlockRefByNumber(refD.Number, refD, nil) + l1F.ExpectL1BlockRefByNumber(refD.Number, refD, nil) + fi.OnEvent(TryFinalizeEvent{}) + emitter.AssertExpectations(t) + l1F.AssertExpectations(t) + + // Another L1 finality event, trigger L2 finality attempt again + emitter.ExpectOnce(TryFinalizeEvent{}) + fi.OnEvent(FinalizeL1Event{FinalizedL1: refE}) + emitter.AssertExpectations(t) + + // D0 was included in E, and should be finalized now + emitter.ExpectOnce(engine.PromoteFinalizedEvent{Ref: refD0}) + l1F.ExpectL1BlockRefByNumber(refE.Number, refE, nil) + l1F.ExpectL1BlockRefByNumber(refE.Number, refE, nil) + fi.OnEvent(TryFinalizeEvent{}) + emitter.AssertExpectations(t) + l1F.AssertExpectations(t) + + // D0 is still there in the buffer, and may be finalized again, if it were not for the latest forkchoice update. + fi.OnEvent(engine.ForkchoiceUpdateEvent{FinalizedL2Head: refD0}) + emitter.AssertExpectations(t) // should trigger no events + + // we expect a finality attempt, since we have not idled on something yet + emitter.ExpectOnce(TryFinalizeEvent{}) + fi.OnEvent(derive.DeriverIdleEvent{Origin: refG}) + emitter.AssertExpectations(t) + + fi.OnEvent(engine.SafeDerivedEvent{Safe: refD1, DerivedFrom: refH}) + fi.OnEvent(engine.SafeDerivedEvent{Safe: refE0, DerivedFrom: refH}) + fi.OnEvent(engine.SafeDerivedEvent{Safe: refE1, DerivedFrom: refH}) + fi.OnEvent(engine.SafeDerivedEvent{Safe: refF0, DerivedFrom: refH}) + fi.OnEvent(engine.SafeDerivedEvent{Safe: refF1, DerivedFrom: refH}) + emitter.AssertExpectations(t) // above updates add data, but no attempt is made until idle or L1 signal + + // We recently finalized already, and there is no new L1 finality data + fi.OnEvent(derive.DeriverIdleEvent{Origin: refH}) + emitter.AssertExpectations(t) + + // D1-F1 were included in L1 blocks that have not been finalized yet. + // D0 is known to be finalized already. + fi.OnEvent(TryFinalizeEvent{}) + emitter.AssertExpectations(t) + + // Now L1 block H is actually finalized, and we can proceed with another attempt + emitter.ExpectOnce(TryFinalizeEvent{}) + fi.OnEvent(FinalizeL1Event{FinalizedL1: refH}) + emitter.AssertExpectations(t) + + // F1 should be finalized now, since it was included in H + emitter.ExpectOnce(engine.PromoteFinalizedEvent{Ref: refF1}) + l1F.ExpectL1BlockRefByNumber(refH.Number, refH, nil) + l1F.ExpectL1BlockRefByNumber(refH.Number, refH, nil) + fi.OnEvent(TryFinalizeEvent{}) + emitter.AssertExpectations(t) + l1F.AssertExpectations(t) + }) + + // In this test the finality signal is for a block more than + // 1 L1 block later than what the L2 data was included in. + t.Run("older-data", func(t *testing.T) { + logger := testlog.Logger(t, log.LevelInfo) + l1F := &testutils.MockL1Source{} + defer l1F.AssertExpectations(t) + l1F.ExpectL1BlockRefByNumber(refD.Number, refD, nil) // check the signal + l1F.ExpectL1BlockRefByNumber(refC.Number, refC, nil) // check what we derived the L2 block from + + emitter := &testutils.MockEmitter{} + fi := NewFinalizer(context.Background(), logger, &rollup.Config{}, l1F) + fi.AttachEmitter(emitter) + + // now say B1 was included in C and became the new safe head + fi.OnEvent(engine.SafeDerivedEvent{Safe: refB1, DerivedFrom: refC}) + fi.OnEvent(derive.DeriverIdleEvent{Origin: refC}) + emitter.AssertExpectations(t) + + // now say C0 was included in E and became the new safe head + fi.OnEvent(engine.SafeDerivedEvent{Safe: refC0, DerivedFrom: refE}) + fi.OnEvent(derive.DeriverIdleEvent{Origin: refE}) + emitter.AssertExpectations(t) + + // let's finalize D, from which we fully derived B1, but not C0 (referenced L1 origin in L2 block != inclusion of L2 block in L1 chain) + emitter.ExpectOnce(TryFinalizeEvent{}) + fi.OnEvent(FinalizeL1Event{FinalizedL1: refD}) + emitter.AssertExpectations(t) + + // B1 was included in finalized D, and should now be finalized + emitter.ExpectOnce(engine.PromoteFinalizedEvent{Ref: refB1}) + fi.OnEvent(TryFinalizeEvent{}) + emitter.AssertExpectations(t) + }) + + // Test that reorg race condition is handled. + t.Run("reorg-safe", func(t *testing.T) { + logger := testlog.Logger(t, log.LevelInfo) + l1F := &testutils.MockL1Source{} + defer l1F.AssertExpectations(t) + l1F.ExpectL1BlockRefByNumber(refF.Number, refF, nil) // check signal + l1F.ExpectL1BlockRefByNumber(refD.Number, refD, nil) // shows reorg to Finalize attempt + l1F.ExpectL1BlockRefByNumber(refF.Number, refF, nil) // check signal + l1F.ExpectL1BlockRefByNumber(refD.Number, refD, nil) // shows reorg to OnDerivationL1End attempt + l1F.ExpectL1BlockRefByNumber(refF.Number, refF, nil) // check signal + l1F.ExpectL1BlockRefByNumber(refE.Number, refE, nil) // post-reorg + + emitter := &testutils.MockEmitter{} + fi := NewFinalizer(context.Background(), logger, &rollup.Config{}, l1F) + fi.AttachEmitter(emitter) + + // now say B1 was included in C and became the new safe head + fi.OnEvent(engine.SafeDerivedEvent{Safe: refB1, DerivedFrom: refC}) + fi.OnEvent(derive.DeriverIdleEvent{Origin: refC}) + emitter.AssertExpectations(t) + + // temporary fork of the L1, and derived safe L2 blocks from. + refC0Alt := eth.L2BlockRef{ + Hash: testutils.RandomHash(rng), + Number: refB1.Number + 1, + ParentHash: refB1.Hash, + Time: refB1.Time + cfg.BlockTime, + L1Origin: refC.ID(), + SequenceNumber: 0, + } + refC1Alt := eth.L2BlockRef{ + Hash: testutils.RandomHash(rng), + Number: refC0Alt.Number + 1, + ParentHash: refC0Alt.Hash, + Time: refC0Alt.Time + cfg.BlockTime, + L1Origin: refC.ID(), + SequenceNumber: 1, + } + refDAlt := eth.L1BlockRef{ + Hash: testutils.RandomHash(rng), + Number: refC.Number + 1, + ParentHash: refC.Hash, + Time: refC.Time + l1Time, + } + fi.OnEvent(engine.SafeDerivedEvent{Safe: refC0Alt, DerivedFrom: refDAlt}) + fi.OnEvent(engine.SafeDerivedEvent{Safe: refC1Alt, DerivedFrom: refDAlt}) + + // We get an early finality signal for F, of the chain that did not include refC0Alt and refC1Alt, + // as L1 block F does not build on DAlt. + // The finality signal was for a new chain, while derivation is on an old stale chain. + // It should be detected that C0Alt and C1Alt cannot actually be finalized, + // even though they are older than the latest finality signal. + emitter.ExpectOnce(TryFinalizeEvent{}) + fi.OnEvent(FinalizeL1Event{FinalizedL1: refF}) + emitter.AssertExpectations(t) + // cannot verify refC0Alt and refC1Alt, and refB1 is older and not checked + emitter.ExpectOnceType("ResetEvent") + fi.OnEvent(TryFinalizeEvent{}) + emitter.AssertExpectations(t) // no change in finality + + // And process DAlt, still stuck on old chain. + + emitter.ExpectOnce(TryFinalizeEvent{}) + fi.OnEvent(derive.DeriverIdleEvent{Origin: refDAlt}) + emitter.AssertExpectations(t) + // no new finalized L2 blocks after early finality signal with stale chain + emitter.ExpectOnceType("ResetEvent") + fi.OnEvent(TryFinalizeEvent{}) + emitter.AssertExpectations(t) + // Now reset, because of the reset error + fi.OnEvent(rollup.ResetEvent{}) + require.Equal(t, refF, fi.FinalizedL1(), "remember the new finality signal for later however") + + // And process the canonical chain, with empty block D (no post-processing of canonical C0 blocks yet) + emitter.ExpectOnce(TryFinalizeEvent{}) + fi.OnEvent(derive.DeriverIdleEvent{Origin: refD}) + emitter.AssertExpectations(t) + fi.OnEvent(TryFinalizeEvent{}) + emitter.AssertExpectations(t) // no new finality + + // Include C0 in E + fi.OnEvent(engine.SafeDerivedEvent{Safe: refC0, DerivedFrom: refE}) + fi.OnEvent(derive.DeriverIdleEvent{Origin: refE}) + // Due to the "finalityDelay" we don't repeat finality checks shortly after one another, + // and don't expect a finality attempt. + emitter.AssertExpectations(t) + + // if we reset the attempt, then we can finalize however. + fi.triedFinalizeAt = 0 + emitter.ExpectOnce(TryFinalizeEvent{}) + fi.OnEvent(derive.DeriverIdleEvent{Origin: refE}) + emitter.AssertExpectations(t) + emitter.ExpectOnce(engine.PromoteFinalizedEvent{Ref: refC0}) + fi.OnEvent(TryFinalizeEvent{}) + emitter.AssertExpectations(t) + }) +} diff --git a/op-node/rollup/iface.go b/op-node/rollup/iface.go new file mode 100644 index 000000000000..f6cf0882de20 --- /dev/null +++ b/op-node/rollup/iface.go @@ -0,0 +1,22 @@ +package rollup + +import "github.com/ethereum-optimism/optimism/op-service/eth" + +// SafeHeadListener is called when the safe head is updated. +// The safe head may advance by more than one block in a single update +// The l1Block specified is the first L1 block that includes sufficient information to derive the new safe head +type SafeHeadListener interface { + + // Enabled reports if this safe head listener is actively using the posted data. This allows the engine queue to + // optionally skip making calls that may be expensive to prepare. + // Callbacks may still be made if Enabled returns false but are not guaranteed. + Enabled() bool + + // SafeHeadUpdated indicates that the safe head has been updated in response to processing batch data + // The l1Block specified is the first L1 block containing all required batch data to derive newSafeHead + SafeHeadUpdated(newSafeHead eth.L2BlockRef, l1Block eth.BlockID) error + + // SafeHeadReset indicates that the derivation pipeline reset back to the specified safe head + // The L1 block that made the new safe head safe is unknown. + SafeHeadReset(resetSafeHead eth.L2BlockRef) error +} diff --git a/op-node/rollup/interop/interop.go b/op-node/rollup/interop/interop.go new file mode 100644 index 000000000000..c6c170478f21 --- /dev/null +++ b/op-node/rollup/interop/interop.go @@ -0,0 +1,161 @@ +package interop + +import ( + "context" + "sync" + "time" + + "github.com/ethereum/go-ethereum/common" + "github.com/ethereum/go-ethereum/log" + + "github.com/ethereum-optimism/optimism/op-node/rollup" + "github.com/ethereum-optimism/optimism/op-node/rollup/engine" + "github.com/ethereum-optimism/optimism/op-node/rollup/event" + "github.com/ethereum-optimism/optimism/op-service/eth" + "github.com/ethereum-optimism/optimism/op-supervisor/supervisor/types" +) + +const checkBlockTimeout = time.Second * 10 + +type InteropBackend interface { + CheckBlock(ctx context.Context, + chainID types.ChainID, blockHash common.Hash, blockNumber uint64) (types.SafetyLevel, error) +} + +type L2Source interface { + L2BlockRefByNumber(context.Context, uint64) (eth.L2BlockRef, error) +} + +// InteropDeriver watches for update events (either real changes to block safety, +// or updates published upon request), checks if there is some local data to cross-verify, +// and then checks with the interop-backend, to try to promote to cross-verified safety. +type InteropDeriver struct { + log log.Logger + cfg *rollup.Config + + // we cache the chainID, + // to not continuously convert from the type in the rollup-config to this type. + chainID types.ChainID + + driverCtx context.Context + + // L2 blockhash -> derived from L1 block ref. + // Added to when a block is local-safe. + // Removed from when it is promoted to cross-safe. + derivedFrom map[common.Hash]eth.L1BlockRef + + backend InteropBackend + l2 L2Source + + emitter event.Emitter + + mu sync.Mutex +} + +var _ event.Deriver = (*InteropDeriver)(nil) +var _ event.AttachEmitter = (*InteropDeriver)(nil) + +func NewInteropDeriver(log log.Logger, cfg *rollup.Config, + driverCtx context.Context, backend InteropBackend, l2 L2Source) *InteropDeriver { + return &InteropDeriver{ + log: log, + cfg: cfg, + chainID: types.ChainIDFromBig(cfg.L2ChainID), + driverCtx: driverCtx, + derivedFrom: make(map[common.Hash]eth.L1BlockRef), + backend: backend, + l2: l2, + } +} + +func (d *InteropDeriver) AttachEmitter(em event.Emitter) { + d.emitter = em +} + +func (d *InteropDeriver) OnEvent(ev event.Event) bool { + d.mu.Lock() + defer d.mu.Unlock() + + switch x := ev.(type) { + case engine.UnsafeUpdateEvent: + d.emitter.Emit(engine.RequestCrossUnsafeEvent{}) + case engine.CrossUnsafeUpdateEvent: + if x.CrossUnsafe.Number >= x.LocalUnsafe.Number { + break // nothing left to promote + } + // Pre-interop the engine itself handles promotion to cross-unsafe. + // Check if the next block (still unsafe) can be promoted to cross-unsafe. + if !d.cfg.IsInterop(d.cfg.TimestampForBlock(x.CrossUnsafe.Number + 1)) { + return false + } + ctx, cancel := context.WithTimeout(d.driverCtx, checkBlockTimeout) + defer cancel() + candidate, err := d.l2.L2BlockRefByNumber(ctx, x.CrossUnsafe.Number+1) + if err != nil { + d.log.Warn("Failed to fetch next cross-unsafe candidate", "err", err) + break + } + blockSafety, err := d.backend.CheckBlock(ctx, d.chainID, candidate.Hash, candidate.Number) + if err != nil { + d.log.Warn("Failed to check interop safety of unsafe block", "err", err) + break + } + switch blockSafety { + case types.CrossUnsafe, types.CrossSafe, types.CrossFinalized: + // Hold off on promoting higher than cross-unsafe, + // this will happen once we verify it to be local-safe first. + d.emitter.Emit(engine.PromoteCrossUnsafeEvent{Ref: candidate}) + } + case engine.LocalSafeUpdateEvent: + d.derivedFrom[x.Ref.Hash] = x.DerivedFrom + d.emitter.Emit(engine.RequestCrossSafeEvent{}) + case engine.CrossSafeUpdateEvent: + if x.CrossSafe.Number >= x.LocalSafe.Number { + break // nothing left to promote + } + // Pre-interop the engine itself handles promotion to cross-safe. + // Check if the next block (not yet cross-safe) can be promoted to cross-safe. + if !d.cfg.IsInterop(d.cfg.TimestampForBlock(x.CrossSafe.Number + 1)) { + return false + } + ctx, cancel := context.WithTimeout(d.driverCtx, checkBlockTimeout) + defer cancel() + candidate, err := d.l2.L2BlockRefByNumber(ctx, x.CrossSafe.Number+1) + if err != nil { + d.log.Warn("Failed to fetch next cross-safe candidate", "err", err) + break + } + blockSafety, err := d.backend.CheckBlock(ctx, d.chainID, candidate.Hash, candidate.Number) + if err != nil { + d.log.Warn("Failed to check interop safety of local-safe block", "err", err) + break + } + derivedFrom, ok := d.derivedFrom[candidate.Hash] + if !ok { + break + } + switch blockSafety { + case types.CrossSafe: + // TODO(#11673): once we have interop reorg support, we need to clean stale blocks also. + delete(d.derivedFrom, candidate.Hash) + d.emitter.Emit(engine.PromoteSafeEvent{ + Ref: candidate, + DerivedFrom: derivedFrom, + }) + case types.Finalized: + // TODO(#11673): once we have interop reorg support, we need to clean stale blocks also. + delete(d.derivedFrom, candidate.Hash) + d.emitter.Emit(engine.PromoteSafeEvent{ + Ref: candidate, + DerivedFrom: derivedFrom, + }) + d.emitter.Emit(engine.PromoteFinalizedEvent{ + Ref: candidate, + }) + } + // no reorg support yet; the safe L2 head will finalize eventually, no exceptions + default: + return false + } + return true +} diff --git a/op-node/rollup/interop/interop_test.go b/op-node/rollup/interop/interop_test.go new file mode 100644 index 000000000000..62b71140770e --- /dev/null +++ b/op-node/rollup/interop/interop_test.go @@ -0,0 +1,136 @@ +package interop + +import ( + "context" + "math/big" + "math/rand" // nosemgrep + "testing" + + "github.com/stretchr/testify/require" + + "github.com/ethereum/go-ethereum/log" + + "github.com/ethereum-optimism/optimism/op-node/rollup" + "github.com/ethereum-optimism/optimism/op-node/rollup/engine" + "github.com/ethereum-optimism/optimism/op-service/testlog" + "github.com/ethereum-optimism/optimism/op-service/testutils" + supervisortypes "github.com/ethereum-optimism/optimism/op-supervisor/supervisor/types" +) + +func TestInteropDeriver(t *testing.T) { + logger := testlog.Logger(t, log.LevelInfo) + l2Source := &testutils.MockL2Client{} + emitter := &testutils.MockEmitter{} + interopBackend := &testutils.MockInteropBackend{} + cfg := &rollup.Config{ + InteropTime: new(uint64), + L2ChainID: big.NewInt(42), + } + chainID := supervisortypes.ChainIDFromBig(cfg.L2ChainID) + interopDeriver := NewInteropDeriver(logger, cfg, context.Background(), interopBackend, l2Source) + interopDeriver.AttachEmitter(emitter) + rng := rand.New(rand.NewSource(123)) + + t.Run("unsafe blocks trigger cross-unsafe check attempts", func(t *testing.T) { + emitter.ExpectOnce(engine.RequestCrossUnsafeEvent{}) + interopDeriver.OnEvent(engine.UnsafeUpdateEvent{ + Ref: testutils.RandomL2BlockRef(rng), + }) + emitter.AssertExpectations(t) + }) + t.Run("establish cross-unsafe", func(t *testing.T) { + crossUnsafe := testutils.RandomL2BlockRef(rng) + firstLocalUnsafe := testutils.NextRandomL2Ref(rng, 2, crossUnsafe, crossUnsafe.L1Origin) + lastLocalUnsafe := testutils.NextRandomL2Ref(rng, 2, firstLocalUnsafe, firstLocalUnsafe.L1Origin) + interopBackend.ExpectCheckBlock( + chainID, firstLocalUnsafe.Number, supervisortypes.CrossUnsafe, nil) + emitter.ExpectOnce(engine.PromoteCrossUnsafeEvent{ + Ref: firstLocalUnsafe, + }) + l2Source.ExpectL2BlockRefByNumber(firstLocalUnsafe.Number, firstLocalUnsafe, nil) + interopDeriver.OnEvent(engine.CrossUnsafeUpdateEvent{ + CrossUnsafe: crossUnsafe, + LocalUnsafe: lastLocalUnsafe, + }) + interopBackend.AssertExpectations(t) + emitter.AssertExpectations(t) + l2Source.AssertExpectations(t) + }) + t.Run("deny cross-unsafe", func(t *testing.T) { + crossUnsafe := testutils.RandomL2BlockRef(rng) + firstLocalUnsafe := testutils.NextRandomL2Ref(rng, 2, crossUnsafe, crossUnsafe.L1Origin) + lastLocalUnsafe := testutils.NextRandomL2Ref(rng, 2, firstLocalUnsafe, firstLocalUnsafe.L1Origin) + interopBackend.ExpectCheckBlock( + chainID, firstLocalUnsafe.Number, supervisortypes.Unsafe, nil) + l2Source.ExpectL2BlockRefByNumber(firstLocalUnsafe.Number, firstLocalUnsafe, nil) + interopDeriver.OnEvent(engine.CrossUnsafeUpdateEvent{ + CrossUnsafe: crossUnsafe, + LocalUnsafe: lastLocalUnsafe, + }) + interopBackend.AssertExpectations(t) + // no cross-unsafe promote event is expected + emitter.AssertExpectations(t) + l2Source.AssertExpectations(t) + }) + t.Run("register local-safe", func(t *testing.T) { + derivedFrom := testutils.RandomBlockRef(rng) + localSafe := testutils.RandomL2BlockRef(rng) + emitter.ExpectOnce(engine.RequestCrossSafeEvent{}) + interopDeriver.OnEvent(engine.LocalSafeUpdateEvent{ + Ref: localSafe, + DerivedFrom: derivedFrom, + }) + require.Contains(t, interopDeriver.derivedFrom, localSafe.Hash) + require.Equal(t, derivedFrom, interopDeriver.derivedFrom[localSafe.Hash]) + emitter.AssertExpectations(t) + }) + t.Run("establish cross-safe", func(t *testing.T) { + derivedFrom := testutils.RandomBlockRef(rng) + crossSafe := testutils.RandomL2BlockRef(rng) + firstLocalSafe := testutils.NextRandomL2Ref(rng, 2, crossSafe, crossSafe.L1Origin) + lastLocalSafe := testutils.NextRandomL2Ref(rng, 2, firstLocalSafe, firstLocalSafe.L1Origin) + emitter.ExpectOnce(engine.RequestCrossSafeEvent{}) + // The local safe block must be known, for the derived-from mapping to work + interopDeriver.OnEvent(engine.LocalSafeUpdateEvent{ + Ref: firstLocalSafe, + DerivedFrom: derivedFrom, + }) + interopBackend.ExpectCheckBlock( + chainID, firstLocalSafe.Number, supervisortypes.CrossSafe, nil) + emitter.ExpectOnce(engine.PromoteSafeEvent{ + Ref: firstLocalSafe, + DerivedFrom: derivedFrom, + }) + l2Source.ExpectL2BlockRefByNumber(firstLocalSafe.Number, firstLocalSafe, nil) + interopDeriver.OnEvent(engine.CrossSafeUpdateEvent{ + CrossSafe: crossSafe, + LocalSafe: lastLocalSafe, + }) + interopBackend.AssertExpectations(t) + emitter.AssertExpectations(t) + l2Source.AssertExpectations(t) + }) + t.Run("deny cross-safe", func(t *testing.T) { + derivedFrom := testutils.RandomBlockRef(rng) + crossSafe := testutils.RandomL2BlockRef(rng) + firstLocalSafe := testutils.NextRandomL2Ref(rng, 2, crossSafe, crossSafe.L1Origin) + lastLocalSafe := testutils.NextRandomL2Ref(rng, 2, firstLocalSafe, firstLocalSafe.L1Origin) + emitter.ExpectOnce(engine.RequestCrossSafeEvent{}) + // The local safe block must be known, for the derived-from mapping to work + interopDeriver.OnEvent(engine.LocalSafeUpdateEvent{ + Ref: firstLocalSafe, + DerivedFrom: derivedFrom, + }) + interopBackend.ExpectCheckBlock( + chainID, firstLocalSafe.Number, supervisortypes.Safe, nil) + l2Source.ExpectL2BlockRefByNumber(firstLocalSafe.Number, firstLocalSafe, nil) + interopDeriver.OnEvent(engine.CrossSafeUpdateEvent{ + CrossSafe: crossSafe, + LocalSafe: lastLocalSafe, + }) + interopBackend.AssertExpectations(t) + // no cross-safe promote event is expected + emitter.AssertExpectations(t) + l2Source.AssertExpectations(t) + }) +} diff --git a/op-node/rollup/sequencing/disabled.go b/op-node/rollup/sequencing/disabled.go new file mode 100644 index 000000000000..3634284ccd2f --- /dev/null +++ b/op-node/rollup/sequencing/disabled.go @@ -0,0 +1,51 @@ +package sequencing + +import ( + "context" + "errors" + "time" + + "github.com/ethereum/go-ethereum/common" + + "github.com/ethereum-optimism/optimism/op-node/rollup/event" +) + +var ErrSequencerNotEnabled = errors.New("sequencer is not enabled") + +type DisabledSequencer struct{} + +var _ SequencerIface = DisabledSequencer{} + +func (ds DisabledSequencer) OnEvent(ev event.Event) bool { + return false +} + +func (ds DisabledSequencer) NextAction() (t time.Time, ok bool) { + return time.Time{}, false +} + +func (ds DisabledSequencer) Active() bool { + return false +} + +func (ds DisabledSequencer) Init(ctx context.Context, active bool) error { + return ErrSequencerNotEnabled +} + +func (ds DisabledSequencer) Start(ctx context.Context, head common.Hash) error { + return ErrSequencerNotEnabled +} + +func (ds DisabledSequencer) Stop(ctx context.Context) (hash common.Hash, err error) { + return common.Hash{}, ErrSequencerNotEnabled +} + +func (ds DisabledSequencer) SetMaxSafeLag(ctx context.Context, v uint64) error { + return ErrSequencerNotEnabled +} + +func (ds DisabledSequencer) OverrideLeader(ctx context.Context) error { + return ErrSequencerNotEnabled +} + +func (ds DisabledSequencer) Close() {} diff --git a/op-node/rollup/sequencing/iface.go b/op-node/rollup/sequencing/iface.go new file mode 100644 index 000000000000..54e0c70719e0 --- /dev/null +++ b/op-node/rollup/sequencing/iface.go @@ -0,0 +1,23 @@ +package sequencing + +import ( + "context" + "time" + + "github.com/ethereum/go-ethereum/common" + + "github.com/ethereum-optimism/optimism/op-node/rollup/event" +) + +type SequencerIface interface { + event.Deriver + // NextAction returns when the sequencer needs to do the next change, and iff it should do so. + NextAction() (t time.Time, ok bool) + Active() bool + Init(ctx context.Context, active bool) error + Start(ctx context.Context, head common.Hash) error + Stop(ctx context.Context) (hash common.Hash, err error) + SetMaxSafeLag(ctx context.Context, v uint64) error + OverrideLeader(ctx context.Context) error + Close() +} diff --git a/op-node/rollup/driver/origin_selector.go b/op-node/rollup/sequencing/origin_selector.go similarity index 78% rename from op-node/rollup/driver/origin_selector.go rename to op-node/rollup/sequencing/origin_selector.go index ea4828980928..41bd64505415 100644 --- a/op-node/rollup/driver/origin_selector.go +++ b/op-node/rollup/sequencing/origin_selector.go @@ -1,9 +1,10 @@ -package driver +package sequencing import ( "context" "errors" "fmt" + "time" "github.com/ethereum/go-ethereum" "github.com/ethereum/go-ethereum/log" @@ -48,17 +49,29 @@ func (los *L1OriginSelector) FindL1Origin(ctx context.Context, l2Head eth.L2Bloc log := los.log.New("current", currentOrigin, "current_time", currentOrigin.Time, "l2_head", l2Head, "l2_head_time", l2Head.Time, "max_seq_drift", msd) + seqDrift := l2Head.Time + los.cfg.BlockTime - currentOrigin.Time + // 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+msd + pastSeqDrift := seqDrift > msd if pastSeqDrift { log.Warn("Next L2 block time is past the sequencer drift + current origin time") + seqDrift = msd } + // Calculate the maximum time we can spend attempting to fetch the next L1 origin block. + // Time spent fetching this information is time not spent building the next L2 block, so + // we generally prioritize keeping this value small, allowing for a nonzero failure rate. + // As the next L2 block time approaches the max sequencer drift, increase our tolerance for + // slower L1 fetches in order to avoid falling too far behind. + fetchTimeout := time.Second + (9*time.Second*time.Duration(seqDrift))/time.Duration(msd) + fetchCtx, cancel := context.WithTimeout(ctx, fetchTimeout) + defer cancel() + // Attempt to find the next L1 origin block, where the next origin is the immediate child of // the current origin block. // The L1 source can be shimmed to hide new L1 blocks and enforce a sequencer confirmation distance. - nextOrigin, err := los.l1.L1BlockRefByNumber(ctx, currentOrigin.Number+1) + nextOrigin, err := los.l1.L1BlockRefByNumber(fetchCtx, currentOrigin.Number+1) if err != nil { if pastSeqDrift { return eth.L1BlockRef{}, fmt.Errorf("cannot build next L2 block past current L1 origin %s by more than sequencer time drift, and failed to find next L1 origin: %w", currentOrigin, err) diff --git a/op-node/rollup/driver/origin_selector_test.go b/op-node/rollup/sequencing/origin_selector_test.go similarity index 96% rename from op-node/rollup/driver/origin_selector_test.go rename to op-node/rollup/sequencing/origin_selector_test.go index 55f67fce8be8..44461eac3077 100644 --- a/op-node/rollup/driver/origin_selector_test.go +++ b/op-node/rollup/sequencing/origin_selector_test.go @@ -1,10 +1,11 @@ -package driver +package sequencing import ( "context" "testing" "github.com/ethereum-optimism/optimism/op-node/rollup" + "github.com/ethereum-optimism/optimism/op-node/rollup/confdepth" "github.com/ethereum-optimism/optimism/op-service/eth" "github.com/ethereum-optimism/optimism/op-service/testlog" "github.com/ethereum-optimism/optimism/op-service/testutils" @@ -127,7 +128,7 @@ func TestOriginSelectorRespectsConfDepth(t *testing.T) { } l1.ExpectL1BlockRefByHash(a.Hash, a, nil) - confDepthL1 := NewConfDepth(10, func() eth.L1BlockRef { return b }, l1) + confDepthL1 := confdepth.NewConfDepth(10, func() eth.L1BlockRef { return b }, l1) s := NewL1OriginSelector(log, cfg, confDepthL1) next, err := s.FindL1Origin(context.Background(), l2Head) @@ -170,7 +171,7 @@ func TestOriginSelectorStrictConfDepth(t *testing.T) { } l1.ExpectL1BlockRefByHash(a.Hash, a, nil) - confDepthL1 := NewConfDepth(10, func() eth.L1BlockRef { return b }, l1) + confDepthL1 := confdepth.NewConfDepth(10, func() eth.L1BlockRef { return b }, l1) s := NewL1OriginSelector(log, cfg, confDepthL1) _, err := s.FindL1Origin(context.Background(), l2Head) @@ -304,7 +305,7 @@ func TestOriginSelectorHandlesLateL1Blocks(t *testing.T) { l1.ExpectL1BlockRefByNumber(b.Number, b, nil) l1Head := b - confDepthL1 := NewConfDepth(2, func() eth.L1BlockRef { return l1Head }, l1) + confDepthL1 := confdepth.NewConfDepth(2, func() eth.L1BlockRef { return l1Head }, l1) s := NewL1OriginSelector(log, cfg, confDepthL1) _, err := s.FindL1Origin(context.Background(), l2Head) diff --git a/op-node/rollup/sequencing/sequencer.go b/op-node/rollup/sequencing/sequencer.go new file mode 100644 index 000000000000..678e16bf8fa7 --- /dev/null +++ b/op-node/rollup/sequencing/sequencer.go @@ -0,0 +1,744 @@ +package sequencing + +import ( + "context" + "errors" + "fmt" + "sync/atomic" + "time" + + "github.com/protolambda/ctxlock" + + "github.com/ethereum/go-ethereum/common" + "github.com/ethereum/go-ethereum/log" + + "github.com/ethereum-optimism/optimism/op-node/rollup" + "github.com/ethereum-optimism/optimism/op-node/rollup/conductor" + "github.com/ethereum-optimism/optimism/op-node/rollup/derive" + "github.com/ethereum-optimism/optimism/op-node/rollup/engine" + "github.com/ethereum-optimism/optimism/op-node/rollup/event" + "github.com/ethereum-optimism/optimism/op-service/eth" +) + +// sealingDuration defines the expected time it takes to seal the block +const sealingDuration = time.Millisecond * 50 + +var ( + ErrSequencerAlreadyStarted = errors.New("sequencer already running") + ErrSequencerAlreadyStopped = errors.New("sequencer not running") +) + +type L1OriginSelectorIface interface { + FindL1Origin(ctx context.Context, l2Head eth.L2BlockRef) (eth.L1BlockRef, error) +} + +type Metrics interface { + RecordSequencerInconsistentL1Origin(from eth.BlockID, to eth.BlockID) + RecordSequencerReset() + RecordSequencingError() +} + +type SequencerStateListener interface { + SequencerStarted() error + SequencerStopped() error +} + +type AsyncGossiper interface { + Gossip(payload *eth.ExecutionPayloadEnvelope) + Get() *eth.ExecutionPayloadEnvelope + Clear() + Stop() + Start() +} + +// SequencerActionEvent triggers the sequencer to start/seal a block, if active and ready to act. +// This event is used to prioritize sequencer work over derivation work, +// by emitting it before e.g. a derivation-pipeline step. +// A future sequencer in an async world may manage its own execution. +type SequencerActionEvent struct { +} + +func (ev SequencerActionEvent) String() string { + return "sequencer-action" +} + +type BuildingState struct { + Onto eth.L2BlockRef + Info eth.PayloadInfo + + Started time.Time + + // Set once known + Ref eth.L2BlockRef +} + +// Sequencer implements the sequencing interface of the driver: it starts and completes block building jobs. +type Sequencer struct { + l ctxlock.Lock + + // closed when driver system closes, to interrupt any ongoing API calls etc. + ctx context.Context + + log log.Logger + rollupCfg *rollup.Config + spec *rollup.ChainSpec + + maxSafeLag atomic.Uint64 + + // active identifies whether the sequencer is running. + // This is an atomic value, so it can be read without locking the whole sequencer. + active atomic.Bool + + // listener for sequencer-state changes. Blocking, may error. + // May be used to ensure sequencer-state is accurately persisted. + listener SequencerStateListener + + conductor conductor.SequencerConductor + + asyncGossip AsyncGossiper + + emitter event.Emitter + + attrBuilder derive.AttributesBuilder + l1OriginSelector L1OriginSelectorIface + + metrics Metrics + + // timeNow enables sequencer testing to mock the time + timeNow func() time.Time + + // nextAction is when the next sequencing action should be performed + nextAction time.Time + nextActionOK bool + + latest BuildingState + latestSealed eth.L2BlockRef + latestHead eth.L2BlockRef + + latestHeadSet chan struct{} + + // toBlockRef converts a payload to a block-ref, and is only configurable for test-purposes + toBlockRef func(rollupCfg *rollup.Config, payload *eth.ExecutionPayload) (eth.L2BlockRef, error) + + dacClient engine.DACClient +} + +var _ SequencerIface = (*Sequencer)(nil) + +func NewSequencer(driverCtx context.Context, log log.Logger, rollupCfg *rollup.Config, + attributesBuilder derive.AttributesBuilder, + l1OriginSelector L1OriginSelectorIface, + listener SequencerStateListener, + conductor conductor.SequencerConductor, + asyncGossip AsyncGossiper, + metrics Metrics, + dacClient engine.DACClient) *Sequencer { + return &Sequencer{ + ctx: driverCtx, + log: log, + rollupCfg: rollupCfg, + spec: rollup.NewChainSpec(rollupCfg), + listener: listener, + conductor: conductor, + asyncGossip: asyncGossip, + attrBuilder: attributesBuilder, + l1OriginSelector: l1OriginSelector, + metrics: metrics, + timeNow: time.Now, + toBlockRef: derive.PayloadToBlockRef, + dacClient: dacClient, + } +} + +func (d *Sequencer) AttachEmitter(em event.Emitter) { + d.emitter = em +} + +func (d *Sequencer) OnEvent(ev event.Event) bool { + d.l.Lock() + defer d.l.Unlock() + + preTime := d.nextAction + preOk := d.nextActionOK + defer func() { + if d.nextActionOK != preOk || d.nextAction != preTime { + d.log.Debug("Sequencer action schedule changed", + "time", d.nextAction, "wait", d.nextAction.Sub(d.timeNow()), "ok", d.nextActionOK, "event", ev) + } + }() + + switch x := ev.(type) { + case engine.BuildStartedEvent: + d.onBuildStarted(x) + case engine.InvalidPayloadAttributesEvent: + d.onInvalidPayloadAttributes(x) + case engine.BuildSealedEvent: + d.onBuildSealed(x) + case engine.PayloadSealInvalidEvent: + d.onPayloadSealInvalid(x) + case engine.PayloadSealExpiredErrorEvent: + d.onPayloadSealExpiredError(x) + case engine.PayloadInvalidEvent: + d.onPayloadInvalid(x) + case engine.PayloadSuccessEvent: + d.onPayloadSuccess(x) + case SequencerActionEvent: + d.onSequencerAction(x) + case rollup.EngineTemporaryErrorEvent: + d.onEngineTemporaryError(x) + case rollup.ResetEvent: + d.onReset(x) + case engine.EngineResetConfirmedEvent: + d.onEngineResetConfirmedEvent(x) + case engine.ForkchoiceUpdateEvent: + d.onForkchoiceUpdate(x) + default: + return false + } + return true +} + +func (d *Sequencer) onBuildStarted(x engine.BuildStartedEvent) { + if x.DerivedFrom != (eth.L1BlockRef{}) { + // If we are adding new blocks onto the tip of the chain, derived from L1, + // then don't try to build on top of it immediately, as sequencer. + d.log.Warn("Detected new block-building from L1 derivation, avoiding sequencing for now.", + "build_job", x.Info.ID, "build_timestamp", x.Info.Timestamp, + "parent", x.Parent, "derived_from", x.DerivedFrom) + d.nextActionOK = false + return + } + if d.latest.Onto != x.Parent { + d.log.Warn("Canceling stale block-building job that was just started, as target to build onto has changed", + "stale", x.Parent, "new", d.latest.Onto, "job_id", x.Info.ID, "job_timestamp", x.Info.Timestamp) + d.emitter.Emit(engine.BuildCancelEvent{ + Info: x.Info, + Force: true, + }) + d.handleInvalid() + return + } + // if not a derived block, then it is work of the sequencer + d.log.Debug("Sequencer started building new block", + "payloadID", x.Info.ID, "parent", x.Parent, "parent_time", x.Parent.Time) + d.latest.Info = x.Info + d.latest.Started = x.BuildStarted + + d.nextActionOK = d.active.Load() + + // schedule sealing + now := d.timeNow() + payloadTime := time.Unix(int64(x.Parent.Time+d.rollupCfg.BlockTime), 0) + remainingTime := payloadTime.Sub(now) + if remainingTime < sealingDuration { + d.nextAction = now // if there's not enough time for sealing, don't wait. + } else { + // finish with margin of sealing duration before payloadTime + d.nextAction = payloadTime.Add(-sealingDuration) + } +} + +func (d *Sequencer) handleInvalid() { + d.metrics.RecordSequencingError() + d.latest = BuildingState{} + d.asyncGossip.Clear() + // upon error, retry after one block worth of time + blockTime := time.Duration(d.rollupCfg.BlockTime) * time.Second + d.nextAction = d.timeNow().Add(blockTime) + d.nextActionOK = d.active.Load() +} + +func (d *Sequencer) onInvalidPayloadAttributes(x engine.InvalidPayloadAttributesEvent) { + if x.Attributes.DerivedFrom != (eth.L1BlockRef{}) { + return // not our payload, should be ignored. + } + d.log.Error("Cannot sequence invalid payload attributes", + "attributes_parent", x.Attributes.Parent, + "timestamp", x.Attributes.Attributes.Timestamp, "err", x.Err) + + d.handleInvalid() +} + +func (d *Sequencer) onBuildSealed(x engine.BuildSealedEvent) { + if d.latest.Info != x.Info { + return // not our payload, should be ignored. + } + d.log.Info("Sequencer sealed block", "payloadID", x.Info.ID, + "block", x.Envelope.ExecutionPayload.ID(), + "parent", x.Envelope.ExecutionPayload.ParentID(), + "txs", len(x.Envelope.ExecutionPayload.Transactions), + "time", uint64(x.Envelope.ExecutionPayload.Timestamp)) + + { + envelope := x.Envelope + if envelope.BlobsBundle != nil && len(envelope.BlobsBundle.Blobs) > 0 { + // Deriving is based on onchain-data which doesn't contain L2 blob. + if x.DerivedFrom != (eth.L1BlockRef{}) { + d.emitter.Emit(rollup.EngineTemporaryErrorEvent{ + Err: fmt.Errorf("got blobs when deriving")}) + return + } + if d.dacClient != nil { + ctx, cancel := context.WithTimeout(d.ctx, time.Second*5) + defer cancel() + err := d.dacClient.UploadBlobs(ctx, envelope) + if err != nil { + d.emitter.Emit(rollup.EngineTemporaryErrorEvent{ + Err: fmt.Errorf("UploadBlobs failed: %w", err)}) + return + } + } + } + } + + // generous timeout, the conductor is important + ctx, cancel := context.WithTimeout(d.ctx, time.Second*30) + defer cancel() + if err := d.conductor.CommitUnsafePayload(ctx, x.Envelope); err != nil { + d.emitter.Emit(rollup.EngineTemporaryErrorEvent{ + Err: fmt.Errorf("failed to commit unsafe payload to conductor: %w", err)}) + return + } + + // begin gossiping as soon as possible + // asyncGossip.Clear() will be called later if an non-temporary error is found, + // or if the payload is successfully inserted + d.asyncGossip.Gossip(x.Envelope) + // Now after having gossiped the block, try to put it in our own canonical chain + d.emitter.Emit(engine.PayloadProcessEvent{ + IsLastInSpan: x.IsLastInSpan, + DerivedFrom: x.DerivedFrom, + Envelope: x.Envelope, + Ref: x.Ref, + }) + d.latest.Ref = x.Ref + d.latestSealed = x.Ref +} + +func (d *Sequencer) onPayloadSealInvalid(x engine.PayloadSealInvalidEvent) { + if d.latest.Info != x.Info { + return // not our payload, should be ignored. + } + d.log.Error("Sequencer could not seal block", + "payloadID", x.Info.ID, "timestamp", x.Info.Timestamp, "err", x.Err) + d.handleInvalid() +} + +func (d *Sequencer) onPayloadSealExpiredError(x engine.PayloadSealExpiredErrorEvent) { + if d.latest.Info != x.Info { + return // not our payload, should be ignored. + } + d.log.Error("Sequencer temporarily could not seal block", + "payloadID", x.Info.ID, "timestamp", x.Info.Timestamp, "err", x.Err) + // Restart building, this way we get a block we should be able to seal + // (smaller, since we adapt build time). + d.handleInvalid() +} + +func (d *Sequencer) onPayloadInvalid(x engine.PayloadInvalidEvent) { + if d.latest.Ref.Hash != x.Envelope.ExecutionPayload.BlockHash { + return // not a payload from the sequencer + } + d.log.Error("Sequencer could not insert payload", + "block", x.Envelope.ExecutionPayload.ID(), "err", x.Err) + d.handleInvalid() +} + +func (d *Sequencer) onPayloadSuccess(x engine.PayloadSuccessEvent) { + // d.latest as building state may already be empty, + // if the forkchoice update (that dropped the stale building job) was received before the payload-success. + if d.latest.Ref != (eth.L2BlockRef{}) && d.latest.Ref.Hash != x.Envelope.ExecutionPayload.BlockHash { + // Not a payload that was built by this sequencer. We can ignore it, and continue upon forkchoice update. + return + } + d.latest = BuildingState{} + d.log.Info("Sequencer inserted block", + "block", x.Ref, "parent", x.Envelope.ExecutionPayload.ParentID()) + // The payload was already published upon sealing. + // Now that we have processed it ourselves we don't need it anymore. + d.asyncGossip.Clear() +} + +func (d *Sequencer) onSequencerAction(x SequencerActionEvent) { + d.log.Debug("Sequencer action") + payload := d.asyncGossip.Get() + if payload != nil { + if d.latest.Info.ID == (eth.PayloadID{}) { + d.log.Warn("Found reusable payload from async gossiper, and no block was being built. Reusing payload.", + "hash", payload.ExecutionPayload.BlockHash, + "number", uint64(payload.ExecutionPayload.BlockNumber), + "parent", payload.ExecutionPayload.ParentHash) + } + ref, err := d.toBlockRef(d.rollupCfg, payload.ExecutionPayload) + if err != nil { + d.log.Error("Payload from async-gossip buffer could not be turned into block-ref", "err", err) + d.asyncGossip.Clear() // bad payload + return + } + d.log.Info("Resuming sequencing with previously async-gossip confirmed payload", + "payload", payload.ExecutionPayload.ID()) + // Payload is known, we must have resumed sequencer-actions after a temporary error, + // meaning that we have seen BuildSealedEvent already. + // We can retry processing to make it canonical. + d.emitter.Emit(engine.PayloadProcessEvent{ + IsLastInSpan: false, + DerivedFrom: eth.L1BlockRef{}, + Envelope: payload, + Ref: ref, + }) + d.latest.Ref = ref + } else { + if d.latest.Info != (eth.PayloadInfo{}) { + // We should not repeat the seal request. + d.nextActionOK = false + // No known payload for block building job, + // we have to retrieve it first. + d.emitter.Emit(engine.BuildSealEvent{ + Info: d.latest.Info, + BuildStarted: d.latest.Started, + IsLastInSpan: false, + DerivedFrom: eth.L1BlockRef{}, + }) + } else if d.latest == (BuildingState{}) { + // If we have not started building anything, start building. + d.startBuildingBlock() + } + } +} + +func (d *Sequencer) onEngineTemporaryError(x rollup.EngineTemporaryErrorEvent) { + if d.latest == (BuildingState{}) { + d.log.Debug("Engine reported temporary error, but sequencer is not using engine", "err", x.Err) + return + } + d.log.Error("Engine failed temporarily, backing off sequencer", "err", x.Err) + if errors.Is(x.Err, engine.ErrEngineSyncing) { // if it is syncing we can back off by more + d.nextAction = d.timeNow().Add(30 * time.Second) + } else { + d.nextAction = d.timeNow().Add(time.Second) + } + d.nextActionOK = d.active.Load() + // We don't explicitly cancel block building jobs upon temporary errors: we may still finish the block (if any). + // Any unfinished block building work eventually times out, and will be cleaned up that way. + // Note that this only applies to temporary errors upon starting a block-building job. + // If the engine errors upon sealing, an PayloadSealInvalidEvent will be get it to restart the attributes. + + // If we don't have an ID of a job to resume, then start over. + // (d.latest.Onto would be set if we emitted BuildStart already) + if d.latest.Info == (eth.PayloadInfo{}) { + d.latest = BuildingState{} + } +} + +func (d *Sequencer) onReset(x rollup.ResetEvent) { + d.log.Error("Sequencer encountered reset signal, aborting work", "err", x.Err) + d.metrics.RecordSequencerReset() + // try to cancel any ongoing payload building job + if d.latest.Info != (eth.PayloadInfo{}) { + d.emitter.Emit(engine.BuildCancelEvent{Info: d.latest.Info}) + } + d.latest = BuildingState{} + // no action to perform until we get a reset-confirmation + d.nextActionOK = false +} + +func (d *Sequencer) onEngineResetConfirmedEvent(x engine.EngineResetConfirmedEvent) { + d.nextActionOK = d.active.Load() + // Before sequencing we can wait a block, + // assuming the execution-engine just churned through some work for the reset. + // This will also prevent any potential reset-loop from running too hot. + d.nextAction = d.timeNow().Add(time.Second * time.Duration(d.rollupCfg.BlockTime)) + d.log.Info("Engine reset confirmed, sequencer may continue", "next", d.nextActionOK) +} + +func (d *Sequencer) onForkchoiceUpdate(x engine.ForkchoiceUpdateEvent) { + d.log.Debug("Sequencer is processing forkchoice update", "unsafe", x.UnsafeL2Head, "latest", d.latestHead) + + if !d.active.Load() { + d.setLatestHead(x.UnsafeL2Head) + return + } + // If the safe head has fallen behind by a significant number of blocks, delay creating new blocks + // until the safe lag is below SequencerMaxSafeLag. + if maxSafeLag := d.maxSafeLag.Load(); maxSafeLag > 0 && x.SafeL2Head.Number+maxSafeLag <= x.UnsafeL2Head.Number { + d.log.Warn("sequencer has fallen behind safe head by more than lag, stalling", + "head", x.UnsafeL2Head, "safe", x.SafeL2Head, "max_lag", maxSafeLag) + d.nextActionOK = false + } + // Drop stale block-building job if the chain has moved past it already. + if d.latest != (BuildingState{}) && d.latest.Onto.Number < x.UnsafeL2Head.Number { + d.log.Debug("Dropping stale/completed block-building job", + "state", d.latest.Onto, "unsafe_head", x.UnsafeL2Head) + // The cleared state will block further BuildStarted/BuildSealed responses from continuing the stale build job. + d.latest = BuildingState{} + } + if x.UnsafeL2Head.Number > d.latestHead.Number { + d.nextActionOK = true + now := d.timeNow() + blockTime := time.Duration(d.rollupCfg.BlockTime) * time.Second + payloadTime := time.Unix(int64(x.UnsafeL2Head.Time+d.rollupCfg.BlockTime), 0) + remainingTime := payloadTime.Sub(now) + if remainingTime > blockTime { + // if we have too much time, then wait before starting the build + d.nextAction = payloadTime.Add(-blockTime) + } else { + // otherwise start instantly + d.nextAction = now + } + } + d.setLatestHead(x.UnsafeL2Head) +} + +func (d *Sequencer) setLatestHead(head eth.L2BlockRef) { + d.latestHead = head + if d.latestHeadSet != nil { + close(d.latestHeadSet) + d.latestHeadSet = nil + } +} + +// StartBuildingBlock initiates a block building job on top of the given L2 head, safe and finalized blocks, and using the provided l1Origin. +func (d *Sequencer) startBuildingBlock() { + ctx := d.ctx + l2Head := d.latestHead + + // If we do not have data to know what to build on, then request a forkchoice update + if l2Head == (eth.L2BlockRef{}) { + d.emitter.Emit(engine.ForkchoiceRequestEvent{}) + return + } + // If we have already started trying to build on top of this block, we can avoid starting over again. + if d.latest.Onto == l2Head { + return + } + + // Figure out which L1 origin block we're going to be building on top of. + l1Origin, err := d.l1OriginSelector.FindL1Origin(ctx, l2Head) + if err != nil { + d.log.Error("Error finding next L1 Origin", "err", err) + d.emitter.Emit(rollup.L1TemporaryErrorEvent{Err: err}) + return + } + + if !(l2Head.L1Origin.Hash == l1Origin.ParentHash || l2Head.L1Origin.Hash == l1Origin.Hash) { + d.metrics.RecordSequencerInconsistentL1Origin(l2Head.L1Origin, l1Origin.ID()) + d.emitter.Emit(rollup.ResetEvent{Err: fmt.Errorf("cannot build new L2 block with L1 origin %s (parent L1 %s) on current L2 head %s with L1 origin %s", + l1Origin, l1Origin.ParentHash, l2Head, l2Head.L1Origin)}) + return + } + + d.log.Info("Started sequencing new block", "parent", l2Head, "l1Origin", l1Origin) + + fetchCtx, cancel := context.WithTimeout(ctx, time.Second*20) + defer cancel() + + attrs, err := d.attrBuilder.PreparePayloadAttributes(fetchCtx, l2Head, l1Origin.ID()) + if err != nil { + if errors.Is(err, derive.ErrTemporary) { + d.emitter.Emit(rollup.EngineTemporaryErrorEvent{Err: err}) + return + } else if errors.Is(err, derive.ErrReset) { + d.emitter.Emit(rollup.ResetEvent{Err: err}) + return + } else if errors.Is(err, derive.ErrCritical) { + d.emitter.Emit(rollup.CriticalErrorEvent{Err: err}) + return + } else { + d.emitter.Emit(rollup.CriticalErrorEvent{Err: fmt.Errorf("unexpected attributes-preparation error: %w", err)}) + return + } + } + + // If our next L2 block timestamp is beyond the Sequencer drift threshold, then we must produce + // 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.spec.MaxSequencerDrift(l1Origin.Time) + + // For the Ecotone activation block we shouldn't include any sequencer transactions. + if d.rollupCfg.IsEcotoneActivationBlock(uint64(attrs.Timestamp)) { + attrs.NoTxPool = true + 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") + } + + // For the Granite activation block we shouldn't include any sequencer transactions. + if d.rollupCfg.IsGraniteActivationBlock(uint64(attrs.Timestamp)) { + d.log.Info("Sequencing Granite 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) + + // Start a payload building process. + withParent := &derive.AttributesWithParent{ + Attributes: attrs, + Parent: l2Head, + IsLastInSpan: false, + DerivedFrom: eth.L1BlockRef{}, // zero, not going to be pending-safe / safe + } + + // Don't try to start building a block again, until we have heard back from this attempt + d.nextActionOK = false + + // Reset building state, and remember what we are building on. + // If we get a forkchoice update that conflicts, we will have to abort building. + d.latest = BuildingState{Onto: l2Head} + + d.emitter.Emit(engine.BuildStartEvent{ + Attributes: withParent, + }) +} + +func (d *Sequencer) NextAction() (t time.Time, ok bool) { + d.l.Lock() + defer d.l.Unlock() + return d.nextAction, d.nextActionOK +} + +func (d *Sequencer) Active() bool { + return d.active.Load() +} + +func (d *Sequencer) Start(ctx context.Context, head common.Hash) error { + // must be leading to activate + if isLeader, err := d.conductor.Leader(ctx); err != nil { + return fmt.Errorf("sequencer leader check failed: %w", err) + } else if !isLeader { + return errors.New("sequencer is not the leader, aborting") + } + + // Note: leader check happens before locking; this is how the Driver used to work, + // and prevents the event-processing of the sequencer from being stalled due to a potentially slow conductor call. + if err := d.l.LockCtx(ctx); err != nil { + return err + } + defer d.l.Unlock() + + if d.active.Load() { + return ErrSequencerAlreadyStarted + } + if d.latestHead == (eth.L2BlockRef{}) { + return fmt.Errorf("no prestate, cannot determine if sequencer start at %s is safe", head) + } + if head != d.latestHead.Hash { + return fmt.Errorf("block hash does not match: head %s, received %s", d.latestHead, head) + } + return d.forceStart() +} + +func (d *Sequencer) Init(ctx context.Context, active bool) error { + d.l.Lock() + defer d.l.Unlock() + + d.asyncGossip.Start() + + // The `latestHead` should be updated, so we can handle start-sequencer requests + d.emitter.Emit(engine.ForkchoiceRequestEvent{}) + + if active { + // TODO(#11121): should the conductor be checked on startup? + // The conductor was previously not being checked in this case, but that may be a bug. + return d.forceStart() + } else { + if err := d.listener.SequencerStopped(); err != nil { + return fmt.Errorf("failed to notify sequencer-state listener of initial stopped state: %w", err) + } + return nil + } +} + +// forceStart skips all the checks, and just starts the sequencer +func (d *Sequencer) forceStart() error { + if d.latestHead == (eth.L2BlockRef{}) { + // This happens if sequencing is activated on op-node startup. + // The op-conductor check and choice of sequencing with this pre-state already happened before op-node startup. + d.log.Info("Starting sequencing, without known pre-state") + d.asyncGossip.Clear() // if we are starting from an unknown pre-state, just clear gossip out of caution. + } else { + // This happens when we start sequencing on an already-running node. + d.log.Info("Starting sequencing on top of known pre-state", "head", d.latestHead) + if payload := d.asyncGossip.Get(); payload != nil && + payload.ExecutionPayload.BlockHash != d.latestHead.Hash { + d.log.Warn("Cleared old block from async-gossip buffer, sequencing pre-state is different", + "buffered", payload.ExecutionPayload.ID(), "prestate", d.latestHead) + d.asyncGossip.Clear() + } + } + + if err := d.listener.SequencerStarted(); err != nil { + return fmt.Errorf("failed to notify sequencer-state listener of start: %w", err) + } + // clear the building state; interrupting any existing sequencing job (there should never be one) + d.latest = BuildingState{} + d.nextActionOK = true + d.nextAction = d.timeNow() + d.active.Store(true) + d.log.Info("Sequencer has been started", "next action", d.nextAction) + return nil +} + +func (d *Sequencer) Stop(ctx context.Context) (common.Hash, error) { + if err := d.l.LockCtx(ctx); err != nil { + return common.Hash{}, err + } + + if !d.active.Load() { + d.l.Unlock() + return common.Hash{}, ErrSequencerAlreadyStopped + } + + // ensure latestHead has been updated to the latest sealed/gossiped block before stopping the sequencer + for d.latestHead.Hash != d.latestSealed.Hash { + latestHeadSet := make(chan struct{}) + d.latestHeadSet = latestHeadSet + d.l.Unlock() + select { + case <-ctx.Done(): + return common.Hash{}, ctx.Err() + case <-latestHeadSet: + } + if err := d.l.LockCtx(ctx); err != nil { + return common.Hash{}, err + } + } + defer d.l.Unlock() + + // Stop() may have been called twice, so check if we are active after reacquiring the lock + if !d.active.Load() { + return common.Hash{}, ErrSequencerAlreadyStopped + } + + if err := d.listener.SequencerStopped(); err != nil { + return common.Hash{}, fmt.Errorf("failed to notify sequencer-state listener of stop: %w", err) + } + + // Cancel any inflight block building. If we don't cancel this, we can resume sequencing an old block + // even if we've received new unsafe heads in the interim, causing us to introduce a re-org. + d.latest = BuildingState{} // By wiping this state we cannot continue from it later. + + d.nextActionOK = false + d.active.Store(false) + d.log.Info("Sequencer has been stopped") + return d.latestHead.Hash, nil +} + +func (d *Sequencer) SetMaxSafeLag(ctx context.Context, v uint64) error { + d.maxSafeLag.Store(v) + return nil +} + +func (d *Sequencer) OverrideLeader(ctx context.Context) error { + return d.conductor.OverrideLeader(ctx) +} + +func (d *Sequencer) Close() { + d.conductor.Close() + d.asyncGossip.Stop() +} diff --git a/op-node/rollup/sequencing/sequencer_chaos_test.go b/op-node/rollup/sequencing/sequencer_chaos_test.go new file mode 100644 index 000000000000..5d64ab101d7c --- /dev/null +++ b/op-node/rollup/sequencing/sequencer_chaos_test.go @@ -0,0 +1,388 @@ +package sequencing + +import ( + "context" + "encoding/binary" + "errors" + "fmt" + "io" + "math/rand" // nosemgrep + "testing" + "time" + + "github.com/stretchr/testify/require" + + "github.com/ethereum/go-ethereum/common" + "github.com/ethereum/go-ethereum/log" + + "github.com/ethereum-optimism/optimism/op-node/rollup" + "github.com/ethereum-optimism/optimism/op-node/rollup/derive" + "github.com/ethereum-optimism/optimism/op-node/rollup/engine" + "github.com/ethereum-optimism/optimism/op-node/rollup/event" + "github.com/ethereum-optimism/optimism/op-service/clock" + "github.com/ethereum-optimism/optimism/op-service/eth" + "github.com/ethereum-optimism/optimism/op-service/testlog" + "github.com/ethereum-optimism/optimism/op-service/testutils" +) + +// ChaoticEngine simulates what the Engine deriver would do, upon events from the sequencer. +// But does so with repeated errors and bad time delays. +// It is up to the sequencer code to recover from the errors and keep the +// onchain time accurate to the simulated offchain time. +type ChaoticEngine struct { + t *testing.T + + rng *rand.Rand + + emitter event.Emitter + + clock interface { + Now() time.Time + Set(t time.Time) + } + + deps *sequencerTestDeps + + currentPayloadInfo eth.PayloadInfo + currentAttributes *derive.AttributesWithParent + + unsafe, safe, finalized eth.L2BlockRef +} + +func (c *ChaoticEngine) clockRandomIncrement(minIncr, maxIncr time.Duration) { + require.LessOrEqual(c.t, minIncr, maxIncr, "sanity check time duration range") + incr := minIncr + time.Duration(c.rng.Int63n(int64(maxIncr-minIncr))) + c.clock.Set(c.clock.Now().Add(incr)) +} + +func (c *ChaoticEngine) OnEvent(ev event.Event) bool { + switch x := ev.(type) { + case engine.BuildStartEvent: + c.currentPayloadInfo = eth.PayloadInfo{} + // init new payload building ID + _, err := c.rng.Read(c.currentPayloadInfo.ID[:]) + require.NoError(c.t, err) + c.currentPayloadInfo.Timestamp = uint64(x.Attributes.Attributes.Timestamp) + + // Move forward time, to simulate time consumption + c.clockRandomIncrement(0, time.Millisecond*300) + if c.rng.Intn(10) == 0 { // 10% chance the block start is slow + c.clockRandomIncrement(0, time.Second*2) + } + + p := c.rng.Float32() + switch { + case p < 0.05: // 5% + c.emitter.Emit(engine.BuildInvalidEvent{ + Attributes: x.Attributes, + Err: errors.New("mock start invalid error"), + }) + case p < 0.07: // 2 % + c.emitter.Emit(rollup.ResetEvent{ + Err: errors.New("mock reset on start error"), + }) + case p < 0.12: // 5% + c.emitter.Emit(rollup.EngineTemporaryErrorEvent{ + Err: errors.New("mock temp start error"), + }) + default: + c.currentAttributes = x.Attributes + c.emitter.Emit(engine.BuildStartedEvent{ + Info: c.currentPayloadInfo, + BuildStarted: c.clock.Now(), + Parent: x.Attributes.Parent, + IsLastInSpan: false, + DerivedFrom: eth.L1BlockRef{}, + }) + } + case rollup.EngineTemporaryErrorEvent: + c.clockRandomIncrement(0, time.Millisecond*100) + c.currentPayloadInfo = eth.PayloadInfo{} + c.currentAttributes = nil + case rollup.ResetEvent: + // In real-world the reset may take even longer, + // but then there are also less random errors and delays thrown from the engine after. + // Here we keep the delay relatively small, to keep possible random diff between chain and wallclock smaller. + c.clockRandomIncrement(0, time.Second*4) + c.currentPayloadInfo = eth.PayloadInfo{} + c.currentAttributes = nil + c.emitter.Emit(engine.EngineResetConfirmedEvent{ + Unsafe: c.unsafe, + Safe: c.safe, + Finalized: c.finalized, + }) + case engine.BuildInvalidEvent: + // Engine translates the internal BuildInvalidEvent event + // to the external sequencer-handled InvalidPayloadAttributesEvent. + c.clockRandomIncrement(0, time.Millisecond*50) + c.currentPayloadInfo = eth.PayloadInfo{} + c.currentAttributes = nil + c.emitter.Emit(engine.InvalidPayloadAttributesEvent(x)) + case engine.BuildSealEvent: + // Move forward time, to simulate time consumption on sealing + c.clockRandomIncrement(0, time.Millisecond*300) + + if c.currentPayloadInfo == (eth.PayloadInfo{}) { + c.emitter.Emit(engine.PayloadSealExpiredErrorEvent{ + Info: x.Info, + Err: errors.New("job was cancelled"), + IsLastInSpan: false, + DerivedFrom: eth.L1BlockRef{}, + }) + return true + } + require.Equal(c.t, c.currentPayloadInfo, x.Info, "seal the current payload") + require.NotNil(c.t, c.currentAttributes, "must have started building") + + if c.rng.Intn(20) == 0 { // 5% chance of terribly slow block building hiccup + c.clockRandomIncrement(0, time.Second*3) + } + + p := c.rng.Float32() + switch { + case p < 0.03: // 3% + c.emitter.Emit(engine.PayloadSealInvalidEvent{ + Info: x.Info, + Err: errors.New("mock invalid seal"), + IsLastInSpan: x.IsLastInSpan, + DerivedFrom: x.DerivedFrom, + }) + case p < 0.08: // 5% + c.emitter.Emit(engine.PayloadSealExpiredErrorEvent{ + Info: x.Info, + Err: errors.New("mock temp engine error"), + IsLastInSpan: x.IsLastInSpan, + DerivedFrom: x.DerivedFrom, + }) + default: + payloadEnvelope := ð.ExecutionPayloadEnvelope{ + ParentBeaconBlockRoot: c.currentAttributes.Attributes.ParentBeaconBlockRoot, + ExecutionPayload: ð.ExecutionPayload{ + ParentHash: c.currentAttributes.Parent.Hash, + FeeRecipient: c.currentAttributes.Attributes.SuggestedFeeRecipient, + BlockNumber: eth.Uint64Quantity(c.currentAttributes.Parent.Number + 1), + BlockHash: testutils.RandomHash(c.rng), + Timestamp: c.currentAttributes.Attributes.Timestamp, + Transactions: c.currentAttributes.Attributes.Transactions, + // Not all attributes matter to sequencer. We can leave these nil. + }, + } + // We encode the L1 origin as block-ID in tx[0] for testing. + l1Origin := decodeID(c.currentAttributes.Attributes.Transactions[0]) + payloadRef := eth.L2BlockRef{ + Hash: payloadEnvelope.ExecutionPayload.BlockHash, + Number: uint64(payloadEnvelope.ExecutionPayload.BlockNumber), + ParentHash: payloadEnvelope.ExecutionPayload.ParentHash, + Time: uint64(payloadEnvelope.ExecutionPayload.Timestamp), + L1Origin: l1Origin, + SequenceNumber: 0, // ignored + } + c.emitter.Emit(engine.BuildSealedEvent{ + Info: x.Info, + Envelope: payloadEnvelope, + Ref: payloadRef, + IsLastInSpan: x.IsLastInSpan, + DerivedFrom: x.DerivedFrom, + }) + } + c.currentPayloadInfo = eth.PayloadInfo{} + c.currentAttributes = nil + case engine.BuildCancelEvent: + c.currentPayloadInfo = eth.PayloadInfo{} + c.currentAttributes = nil + case engine.ForkchoiceRequestEvent: + c.emitter.Emit(engine.ForkchoiceUpdateEvent{ + UnsafeL2Head: c.unsafe, + SafeL2Head: c.safe, + FinalizedL2Head: c.finalized, + }) + case engine.PayloadProcessEvent: + // Move forward time, to simulate time consumption + c.clockRandomIncrement(0, time.Millisecond*500) + + p := c.rng.Float32() + switch { + case p < 0.05: // 5% + c.emitter.Emit(rollup.EngineTemporaryErrorEvent{ + Err: errors.New("mock temp engine error"), + }) + case p < 0.08: // 3% + c.emitter.Emit(engine.PayloadInvalidEvent{ + Envelope: x.Envelope, + Err: errors.New("mock invalid payload"), + }) + default: + if p < 0.13 { // 5% chance it is an extra slow block + c.clockRandomIncrement(0, time.Second*3) + } + c.unsafe = x.Ref + c.emitter.Emit(engine.PayloadSuccessEvent(x)) + // With event delay, the engine would update and signal the new forkchoice. + c.emitter.Emit(engine.ForkchoiceRequestEvent{}) + } + default: + return false + } + return true +} + +func (c *ChaoticEngine) AttachEmitter(em event.Emitter) { + c.emitter = em +} + +var _ event.Deriver = (*ChaoticEngine)(nil) + +// TestSequencerChaos runs the sequencer with a simulated engine, +// mocking different kinds of errors and timing issues. +func TestSequencerChaos(t *testing.T) { + for i := int64(1); i < 100; i++ { + t.Run(fmt.Sprintf("simulation-%d", i), func(t *testing.T) { + testSequencerChaosWithSeed(t, i) + }) + } +} + +func testSequencerChaosWithSeed(t *testing.T, seed int64) { + // Lower the log level to inspect the mocked errors and event-traces. + logger := testlog.Logger(t, log.LevelCrit) + seq, deps := createSequencer(logger) + testClock := clock.NewSimpleClock() + testClock.SetTime(deps.cfg.Genesis.L2Time) + seq.timeNow = testClock.Now + emitter := &testutils.MockEmitter{} + seq.AttachEmitter(emitter) + ex := event.NewGlobalSynchronous(context.Background()) + sys := event.NewSystem(logger, ex) + sys.AddTracer(event.NewLogTracer(logger, log.LevelInfo)) + + opts := &event.RegisterOpts{ + Executor: event.ExecutorOpts{ + Capacity: 200, + }, + Emitter: event.EmitterOpts{ + Limiting: false, // We're rapidly simulating with fake clock, so don't rate-limit + }, + } + sys.Register("sequencer", seq, opts) + + rng := rand.New(rand.NewSource(seed)) + genesisRef := eth.L2BlockRef{ + Hash: deps.cfg.Genesis.L2.Hash, + Number: deps.cfg.Genesis.L2.Number, + ParentHash: common.Hash{}, + Time: deps.cfg.Genesis.L2Time, + L1Origin: deps.cfg.Genesis.L1, + SequenceNumber: 0, + } + var l1OriginSelectErr error + l1BlockHash := func(num uint64) (out common.Hash) { + out[0] = 1 + binary.BigEndian.PutUint64(out[32-8:], num) + return + } + deps.l1OriginSelector.l1OriginFn = func(l2Head eth.L2BlockRef) (eth.L1BlockRef, error) { + if l1OriginSelectErr != nil { + return eth.L1BlockRef{}, l1OriginSelectErr + } + if l2Head.Number == genesisRef.Number { + return eth.L1BlockRef{ + Hash: genesisRef.L1Origin.Hash, + Number: genesisRef.L1Origin.Number, + Time: genesisRef.Time, + ParentHash: common.Hash{}, + }, nil + } + origin := eth.L1BlockRef{ + Hash: l2Head.L1Origin.Hash, + Number: l2Head.L1Origin.Number, + ParentHash: l1BlockHash(l2Head.L1Origin.Number - 1), + Time: genesisRef.Time + (l2Head.L1Origin.Number-genesisRef.L1Origin.Number)*12, + } + // Handle sequencer time drift, by proceeding to the next L1 origin when we run out of valid time + if l2Head.Time+deps.cfg.BlockTime > origin.Time+deps.cfg.MaxSequencerDrift { + origin.Number += 1 + origin.ParentHash = origin.Hash + origin.Hash = l1BlockHash(origin.Number) + origin.Time += 12 + } + return origin, nil + } + eng := &ChaoticEngine{ + t: t, + rng: rng, + clock: testClock, + deps: deps, + finalized: genesisRef, + safe: genesisRef, + unsafe: genesisRef, + } + sys.Register("engine", eng, opts) + testEm := sys.Register("test", nil, opts) + + // Init sequencer, as active + require.NoError(t, seq.Init(context.Background(), true)) + require.NoError(t, ex.Drain(), "initial forkchoice update etc. completes") + + genesisTime := time.Unix(int64(deps.cfg.Genesis.L2Time), 0) + + i := 0 + // If we can't sequence 100 blocks in 1k simulation steps, something is wrong. + sanityCap := 1000 + targetBlocks := uint64(100) + // sequence a lot of blocks, against the chaos engine + for eng.unsafe.Number < deps.cfg.Genesis.L2.Number+targetBlocks && i < sanityCap { + simPast := eng.clock.Now().Sub(genesisTime) + onchainPast := time.Unix(int64(eng.unsafe.Time), 0).Sub(genesisTime) + logger.Info("Simulation step", "i", i, "sim_time", simPast, + "onchain_time", onchainPast, + "relative", simPast-onchainPast, "blocks", eng.unsafe.Number-deps.cfg.Genesis.L2.Number) + + eng.clockRandomIncrement(0, time.Millisecond*10) + + // Consume a random amount of events. Take a 10% chance to stop at an event without continuing draining (!!!). + // If using a synchronous executor it would be completely drained during regular operation, + // but once we use a parallel executor in the actual op-node Driver, + // then there may be unprocessed events before checking the next scheduled sequencing action. + // What makes this difficult for the sequencer is that it may decide to emit a sequencer-action, + // while previous emitted events are not processed yet. This helps identify bad state dependency assumptions. + drainErr := ex.DrainUntil(func(ev event.Event) bool { + return rng.Intn(10) == 0 + }, false) + + nextTime, ok := seq.NextAction() + if drainErr == io.EOF && !ok { + t.Fatalf("No action scheduled, but also no events to change inputs left") + } + if ok && testClock.Now().After(nextTime) { + testEm.Emit(SequencerActionEvent{}) + } else { + waitTime := nextTime.Sub(eng.clock.Now()) + if drainErr == io.EOF { + logger.Info("No events left, skipping forward to next sequencing action", "wait", waitTime) + // if no events are left, then we can deterministically skip forward to where we are ready + // to process sequencing actions again. With some noise, to not skip exactly to the perfect time. + eng.clockRandomIncrement(waitTime, waitTime+time.Millisecond*10) + } else { + logger.Info("Not sequencing time yet, processing more events first", "wait", waitTime) + } + } + + i += 1 + } + + blocksSinceGenesis := eng.unsafe.Number - deps.cfg.Genesis.L2.Number + if i >= sanityCap { + t.Fatalf("Sequenced %d blocks, ran out of simulation steps", blocksSinceGenesis) + } + require.Equal(t, targetBlocks, blocksSinceGenesis) + + now := testClock.Now() + timeSinceGenesis := now.Sub(genesisTime) + idealTimeSinceGenesis := time.Duration(blocksSinceGenesis*deps.cfg.BlockTime) * time.Second + diff := timeSinceGenesis - idealTimeSinceGenesis + // If timing keeps adjusting, even with many errors over time, it should stay close to target. + if diff.Abs() > time.Second*20 { + t.Fatalf("Failed to maintain target time. Spent %s, but target was %s", + timeSinceGenesis, idealTimeSinceGenesis) + } +} diff --git a/op-node/rollup/sequencing/sequencer_test.go b/op-node/rollup/sequencing/sequencer_test.go new file mode 100644 index 000000000000..94b8d8df17dc --- /dev/null +++ b/op-node/rollup/sequencing/sequencer_test.go @@ -0,0 +1,670 @@ +package sequencing + +import ( + "context" + "encoding/binary" + "math/rand" // nosemgrep + "testing" + "time" + + "github.com/stretchr/testify/require" + + "github.com/ethereum/go-ethereum/common" + "github.com/ethereum/go-ethereum/log" + + "github.com/ethereum-optimism/optimism/op-node/metrics" + "github.com/ethereum-optimism/optimism/op-node/rollup" + "github.com/ethereum-optimism/optimism/op-node/rollup/conductor" + "github.com/ethereum-optimism/optimism/op-node/rollup/derive" + "github.com/ethereum-optimism/optimism/op-node/rollup/engine" + "github.com/ethereum-optimism/optimism/op-node/rollup/event" + "github.com/ethereum-optimism/optimism/op-service/clock" + "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" +) + +type FakeAttributesBuilder struct { + cfg *rollup.Config + rng *rand.Rand +} + +// used to put the L1 origin into the data-tx, without all the deposit-tx complexity, for testing purposes. +func encodeID(id eth.BlockID) []byte { + var out [32 + 8]byte + copy(out[:32], id.Hash[:]) + binary.BigEndian.PutUint64(out[32:], id.Number) + return out[:] +} + +func decodeID(data []byte) eth.BlockID { + return eth.BlockID{ + Hash: common.Hash(data[:32]), + Number: binary.BigEndian.Uint64(data[32:]), + } +} + +func (m *FakeAttributesBuilder) PreparePayloadAttributes(ctx context.Context, + l2Parent eth.L2BlockRef, epoch eth.BlockID) (attrs *eth.PayloadAttributes, err error) { + gasLimit := eth.Uint64Quantity(30_000_000) + attrs = ð.PayloadAttributes{ + Timestamp: eth.Uint64Quantity(l2Parent.Time + m.cfg.BlockTime), + PrevRandao: eth.Bytes32(testutils.RandomHash(m.rng)), + SuggestedFeeRecipient: predeploys.SequencerFeeVaultAddr, + Withdrawals: nil, + ParentBeaconBlockRoot: nil, + Transactions: []eth.Data{encodeID(epoch)}, // simplified replacement for L1-info tx. + NoTxPool: false, + GasLimit: &gasLimit, + } + + if m.cfg.IsEcotone(uint64(attrs.Timestamp)) { + r := testutils.RandomHash(m.rng) + attrs.ParentBeaconBlockRoot = &r + } + return attrs, nil +} + +var _ derive.AttributesBuilder = (*FakeAttributesBuilder)(nil) + +type FakeL1OriginSelector struct { + request eth.L2BlockRef + l1OriginFn func(l2Head eth.L2BlockRef) (eth.L1BlockRef, error) +} + +func (f *FakeL1OriginSelector) FindL1Origin(ctx context.Context, l2Head eth.L2BlockRef) (eth.L1BlockRef, error) { + f.request = l2Head + return f.l1OriginFn(l2Head) +} + +var _ L1OriginSelectorIface = (*FakeL1OriginSelector)(nil) + +type BasicSequencerStateListener struct { + active bool +} + +func (b *BasicSequencerStateListener) SequencerStarted() error { + b.active = true + return nil +} + +func (b *BasicSequencerStateListener) SequencerStopped() error { + b.active = false + return nil +} + +var _ SequencerStateListener = (*BasicSequencerStateListener)(nil) + +// FakeConductor is a no-op conductor that assumes this node is the leader sequencer. +type FakeConductor struct { + closed bool + leader bool + committed *eth.ExecutionPayloadEnvelope +} + +var _ conductor.SequencerConductor = &FakeConductor{} + +func (c *FakeConductor) Leader(ctx context.Context) (bool, error) { + return c.leader, nil +} + +func (c *FakeConductor) CommitUnsafePayload(ctx context.Context, payload *eth.ExecutionPayloadEnvelope) error { + c.committed = payload + return nil +} + +func (c *FakeConductor) OverrideLeader(ctx context.Context) error { + c.leader = true + return nil +} + +func (c *FakeConductor) Close() { + c.closed = true +} + +type FakeAsyncGossip struct { + payload *eth.ExecutionPayloadEnvelope + started bool + stopped bool +} + +func (f *FakeAsyncGossip) Gossip(payload *eth.ExecutionPayloadEnvelope) { + f.payload = payload +} + +func (f *FakeAsyncGossip) Get() *eth.ExecutionPayloadEnvelope { + return f.payload +} + +func (f *FakeAsyncGossip) Clear() { + f.payload = nil +} + +func (f *FakeAsyncGossip) Stop() { + f.stopped = true +} + +func (f *FakeAsyncGossip) Start() { + f.started = true +} + +var _ AsyncGossiper = (*FakeAsyncGossip)(nil) + +// TestSequencer_StartStop runs through start/stop state back and forth to test state changes. +func TestSequencer_StartStop(t *testing.T) { + logger := testlog.Logger(t, log.LevelError) + seq, deps := createSequencer(logger) + emitter := &testutils.MockEmitter{} + seq.AttachEmitter(emitter) + + // Allow the sequencer to be the leader. + // This is checked, since we start sequencing later, after initialization. + // Also see issue #11121 for context: the conductor is checked by the infra, when initialized in active state. + deps.conductor.leader = true + + emitter.ExpectOnce(engine.ForkchoiceRequestEvent{}) + require.NoError(t, seq.Init(context.Background(), false)) + emitter.AssertExpectations(t) + require.False(t, deps.conductor.closed, "conductor is ready") + require.True(t, deps.asyncGossip.started, "async gossip is always started on initialization") + require.False(t, deps.seqState.active, "sequencer not active yet") + + // latest refs should all be empty + require.Equal(t, common.Hash{}, seq.latest.Ref.Hash) + require.Equal(t, common.Hash{}, seq.latestSealed.Hash) + require.Equal(t, common.Hash{}, seq.latestHead.Hash) + + // update the latestSealed + envelope := ð.ExecutionPayloadEnvelope{ + ExecutionPayload: ð.ExecutionPayload{}, + } + emitter.ExpectOnce(engine.PayloadProcessEvent{ + Envelope: envelope, + Ref: eth.L2BlockRef{Hash: common.Hash{0xaa}}, + }) + seq.OnEvent(engine.BuildSealedEvent{ + Envelope: envelope, + Ref: eth.L2BlockRef{Hash: common.Hash{0xaa}}, + }) + require.Equal(t, common.Hash{0xaa}, seq.latest.Ref.Hash) + require.Equal(t, common.Hash{0xaa}, seq.latestSealed.Hash) + require.Equal(t, common.Hash{}, seq.latestHead.Hash) + + // update latestHead + emitter.AssertExpectations(t) + seq.OnEvent(engine.ForkchoiceUpdateEvent{ + UnsafeL2Head: eth.L2BlockRef{Hash: common.Hash{0xaa}}, + SafeL2Head: eth.L2BlockRef{}, + FinalizedL2Head: eth.L2BlockRef{}, + }) + require.Equal(t, common.Hash{0xaa}, seq.latest.Ref.Hash) + require.Equal(t, common.Hash{0xaa}, seq.latestSealed.Hash) + require.Equal(t, common.Hash{0xaa}, seq.latestHead.Hash) + + require.False(t, seq.Active()) + // no action scheduled + _, ok := seq.NextAction() + require.False(t, ok) + + require.NoError(t, seq.Start(context.Background(), common.Hash{0xaa})) + require.True(t, seq.Active()) + require.True(t, deps.seqState.active, "sequencer signaled it is active") + + // sequencer is active now, it should schedule work + _, ok = seq.NextAction() + require.True(t, ok) + + // can't activate again before stopping + err := seq.Start(context.Background(), common.Hash{0xaa}) + require.ErrorIs(t, err, ErrSequencerAlreadyStarted) + + head, err := seq.Stop(context.Background()) + require.NoError(t, err) + require.Equal(t, head, common.Hash{0xaa}) + require.False(t, deps.seqState.active, "sequencer signaled it is no longer active") + + _, err = seq.Stop(context.Background()) + require.ErrorIs(t, err, ErrSequencerAlreadyStopped) + + // need to resume from the last head + err = seq.Start(context.Background(), common.Hash{0xbb}) + require.ErrorContains(t, err, "block hash does not match") + + // can start again from head that it left + err = seq.Start(context.Background(), head) + require.NoError(t, err) +} + +// TestSequencer_StaleBuild stops the sequencer after block-building, +// but before processing the block locally, +// and then continues it again, to check if the async-gossip gets cleared, +// instead of trying to re-insert the block. +func TestSequencer_StaleBuild(t *testing.T) { + logger := testlog.Logger(t, log.LevelError) + seq, deps := createSequencer(logger) + + testClock := clock.NewSimpleClock() + seq.timeNow = testClock.Now + testClock.SetTime(30000) + + emitter := &testutils.MockEmitter{} + seq.AttachEmitter(emitter) + deps.conductor.leader = true + + emitter.ExpectOnce(engine.ForkchoiceRequestEvent{}) + require.NoError(t, seq.Init(context.Background(), false)) + emitter.AssertExpectations(t) + require.False(t, deps.conductor.closed, "conductor is ready") + require.True(t, deps.asyncGossip.started, "async gossip is always started on initialization") + require.False(t, deps.seqState.active, "sequencer not active yet") + + head := eth.L2BlockRef{ + Hash: common.Hash{0x22}, + Number: 100, + L1Origin: eth.BlockID{ + Hash: common.Hash{0x11, 0xa}, + Number: 1000, + }, + Time: uint64(testClock.Now().Unix()), + } + seq.OnEvent(engine.ForkchoiceUpdateEvent{UnsafeL2Head: head}) + + require.NoError(t, seq.Start(context.Background(), head.Hash)) + require.True(t, seq.Active()) + require.True(t, deps.seqState.active, "sequencer signaled it is active") + + // sequencer is active now, wants to build. + _, ok := seq.NextAction() + require.True(t, ok) + + // pretend we progress to the next L1 origin, catching up with the L2 time + l1Origin := eth.L1BlockRef{ + Hash: common.Hash{0x11, 0xb}, + ParentHash: head.L1Origin.Hash, + Number: head.L1Origin.Number + 1, + Time: head.Time + 2, + } + deps.l1OriginSelector.l1OriginFn = func(l2Head eth.L2BlockRef) (eth.L1BlockRef, error) { + return l1Origin, nil + } + var sentAttributes *derive.AttributesWithParent + emitter.ExpectOnceRun(func(ev event.Event) { + x, ok := ev.(engine.BuildStartEvent) + require.True(t, ok) + require.Equal(t, head, x.Attributes.Parent) + require.Equal(t, head.Time+deps.cfg.BlockTime, uint64(x.Attributes.Attributes.Timestamp)) + require.Equal(t, eth.L1BlockRef{}, x.Attributes.DerivedFrom) + sentAttributes = x.Attributes + }) + seq.OnEvent(SequencerActionEvent{}) + emitter.AssertExpectations(t) + + // Now report the block was started + startedTime := time.Unix(int64(head.Time), 0).Add(time.Millisecond * 150) + testClock.Set(startedTime) + payloadInfo := eth.PayloadInfo{ + ID: eth.PayloadID{0x42}, + Timestamp: head.Time + deps.cfg.BlockTime, + } + seq.OnEvent(engine.BuildStartedEvent{ + Info: payloadInfo, + BuildStarted: startedTime, + Parent: head, + IsLastInSpan: false, + DerivedFrom: eth.L1BlockRef{}, + }) + + _, ok = seq.NextAction() + require.True(t, ok, "must be ready to seal the block now") + + emitter.ExpectOnce(engine.BuildSealEvent{ + Info: payloadInfo, + BuildStarted: startedTime, + IsLastInSpan: false, + DerivedFrom: eth.L1BlockRef{}, + }) + seq.OnEvent(SequencerActionEvent{}) + emitter.AssertExpectations(t) + + _, ok = seq.NextAction() + require.False(t, ok, "cannot act until sealing completes/fails") + + payloadEnvelope := ð.ExecutionPayloadEnvelope{ + ParentBeaconBlockRoot: sentAttributes.Attributes.ParentBeaconBlockRoot, + ExecutionPayload: ð.ExecutionPayload{ + ParentHash: head.Hash, + FeeRecipient: sentAttributes.Attributes.SuggestedFeeRecipient, + BlockNumber: eth.Uint64Quantity(sentAttributes.Parent.Number + 1), + BlockHash: common.Hash{0x12, 0x34}, + Timestamp: sentAttributes.Attributes.Timestamp, + Transactions: sentAttributes.Attributes.Transactions, + // Not all attributes matter to sequencer. We can leave these nil. + }, + } + payloadRef := eth.L2BlockRef{ + Hash: payloadEnvelope.ExecutionPayload.BlockHash, + Number: uint64(payloadEnvelope.ExecutionPayload.BlockNumber), + ParentHash: payloadEnvelope.ExecutionPayload.ParentHash, + Time: uint64(payloadEnvelope.ExecutionPayload.Timestamp), + L1Origin: l1Origin.ID(), + SequenceNumber: 0, + } + emitter.ExpectOnce(engine.PayloadProcessEvent{ + IsLastInSpan: false, + DerivedFrom: eth.L1BlockRef{}, + Envelope: payloadEnvelope, + Ref: payloadRef, + }) + // And report back the sealing result to the engine + seq.OnEvent(engine.BuildSealedEvent{ + IsLastInSpan: false, + DerivedFrom: eth.L1BlockRef{}, + Info: payloadInfo, + Envelope: payloadEnvelope, + Ref: payloadRef, + }) + // The sequencer should start processing the payload + emitter.AssertExpectations(t) + // But also optimistically give it to the conductor and the async gossip + require.Equal(t, payloadEnvelope, deps.conductor.committed, "must commit to conductor") + require.Equal(t, payloadEnvelope, deps.asyncGossip.payload, "must send to async gossip") + _, ok = seq.NextAction() + require.False(t, ok, "optimistically published, but not ready to sequence next, until local processing completes") + + // attempting to stop block building here should timeout, because the sealed block is different from the latestHead + ctx, cancel := context.WithTimeout(context.Background(), 1*time.Second) + defer cancel() + _, err := seq.Stop(ctx) + require.Error(t, err, "stop should have timed out") + require.ErrorIs(t, err, ctx.Err()) + + // reset latestSealed to the previous head + emitter.ExpectOnce(engine.PayloadProcessEvent{ + Envelope: payloadEnvelope, + Ref: head, + }) + seq.OnEvent(engine.BuildSealedEvent{ + Info: payloadInfo, + Envelope: payloadEnvelope, + Ref: head, + }) + emitter.AssertExpectations(t) + + // Now we stop the block building, + // before successful local processing of the committed block! + stopHead, err := seq.Stop(context.Background()) + require.NoError(t, err) + require.Equal(t, head.Hash, stopHead, "sequencer should not have accepted any new block yet") + require.False(t, deps.seqState.active, "sequencer signaled it is no longer active") + + // Async-gossip will try to publish this committed block + require.NotNil(t, deps.asyncGossip.payload, "still holding on to async-gossip block") + + // Now let's say another sequencer built a bunch of blocks, + // can we continue from there? We'll have to wipe the old in-flight block, + // if we continue on top of a chain that had it already included a while ago. + + // Signal the new chain we are building on + testClock.Set(testClock.Now().Add(time.Second * 100 * 2)) + + newL1Origin := eth.L1BlockRef{ + Hash: common.Hash{0x11, 0x11, 0x44}, + ParentHash: head.L1Origin.Hash, + Number: head.L1Origin.Number + 50, + Time: uint64(testClock.Now().Unix()), + } + newHead := eth.L2BlockRef{ + Hash: common.Hash{0x44}, + Number: head.Number + 100, + L1Origin: newL1Origin.ID(), + Time: uint64(testClock.Now().Unix()), + } + seq.OnEvent(engine.ForkchoiceUpdateEvent{UnsafeL2Head: newHead}) + + // Regression check: async-gossip is cleared upon sequencer un-pause. + // We could clear it earlier. But absolutely have to clear it upon Start(), + // to not continue from this older point. + require.NotNil(t, deps.asyncGossip.payload, "async-gossip still not cleared") + + // start sequencing on top of the new chain + require.NoError(t, seq.Start(context.Background(), newHead.Hash), "must continue from new block") + + // regression check: no stale async gossip is continued + require.Nil(t, deps.asyncGossip.payload, "async gossip should be cleared on Start") + + // Start building the block with the new L1 origin + deps.l1OriginSelector.l1OriginFn = func(l2Head eth.L2BlockRef) (eth.L1BlockRef, error) { + return newL1Origin, nil + } + // Sequencer action, assert we build on top of something new, + // and don't try to seal what was previously. + _, ok = seq.NextAction() + require.True(t, ok, "ready to sequence again") + // start, not seal, when continuing to sequence. + emitter.ExpectOnceRun(func(ev event.Event) { + buildEv, ok := ev.(engine.BuildStartEvent) + require.True(t, ok) + require.Equal(t, newHead, buildEv.Attributes.Parent, "build on the new L2 head") + }) + seq.OnEvent(SequencerActionEvent{}) + emitter.AssertExpectations(t) +} + +func TestSequencerBuild(t *testing.T) { + logger := testlog.Logger(t, log.LevelError) + seq, deps := createSequencer(logger) + testClock := clock.NewSimpleClock() + seq.timeNow = testClock.Now + testClock.SetTime(30000) + emitter := &testutils.MockEmitter{} + seq.AttachEmitter(emitter) + + // Init will request a forkchoice update + emitter.ExpectOnce(engine.ForkchoiceRequestEvent{}) + require.NoError(t, seq.Init(context.Background(), true)) + emitter.AssertExpectations(t) + require.True(t, seq.Active(), "started in active mode") + + // It will request a forkchoice update, it needs the head before being able to build on top of it + emitter.ExpectOnce(engine.ForkchoiceRequestEvent{}) + seq.OnEvent(SequencerActionEvent{}) + emitter.AssertExpectations(t) + + // Now send the forkchoice data, for the sequencer to learn what to build on top of. + head := eth.L2BlockRef{ + Hash: common.Hash{0x22}, + Number: 100, + L1Origin: eth.BlockID{ + Hash: common.Hash{0x11, 0xa}, + Number: 1000, + }, + Time: uint64(testClock.Now().Unix()), + } + seq.OnEvent(engine.ForkchoiceUpdateEvent{UnsafeL2Head: head}) + emitter.AssertExpectations(t) + + // pretend we progress to the next L1 origin, catching up with the L2 time + l1Origin := eth.L1BlockRef{ + Hash: common.Hash{0x11, 0xb}, + ParentHash: common.Hash{0x11, 0xa}, + Number: 1001, + Time: 29998, + } + deps.l1OriginSelector.l1OriginFn = func(l2Head eth.L2BlockRef) (eth.L1BlockRef, error) { + return l1Origin, nil + } + var sentAttributes *derive.AttributesWithParent + emitter.ExpectOnceRun(func(ev event.Event) { + x, ok := ev.(engine.BuildStartEvent) + require.True(t, ok) + require.Equal(t, head, x.Attributes.Parent) + require.Equal(t, head.Time+deps.cfg.BlockTime, uint64(x.Attributes.Attributes.Timestamp)) + require.Equal(t, eth.L1BlockRef{}, x.Attributes.DerivedFrom) + sentAttributes = x.Attributes + }) + seq.OnEvent(SequencerActionEvent{}) + emitter.AssertExpectations(t) + + // pretend we are already 150ms into the block-window when starting building + startedTime := time.Unix(int64(head.Time), 0).Add(time.Millisecond * 150) + testClock.Set(startedTime) + payloadInfo := eth.PayloadInfo{ + ID: eth.PayloadID{0x42}, + Timestamp: head.Time + deps.cfg.BlockTime, + } + seq.OnEvent(engine.BuildStartedEvent{ + Info: payloadInfo, + BuildStarted: startedTime, + Parent: head, + IsLastInSpan: false, + DerivedFrom: eth.L1BlockRef{}, + }) + // The sealing should now be scheduled as next action. + // We expect to seal just before the block-time boundary, leaving enough time for the sealing itself. + sealTargetTime, ok := seq.NextAction() + require.True(t, ok) + buildDuration := sealTargetTime.Sub(time.Unix(int64(head.Time), 0)) + require.Equal(t, (time.Duration(deps.cfg.BlockTime)*time.Second)-sealingDuration, buildDuration) + + // Now trigger the sequencer to start sealing + emitter.ExpectOnce(engine.BuildSealEvent{ + Info: payloadInfo, + BuildStarted: startedTime, + IsLastInSpan: false, + DerivedFrom: eth.L1BlockRef{}, + }) + seq.OnEvent(SequencerActionEvent{}) + emitter.AssertExpectations(t) + _, ok = seq.NextAction() + require.False(t, ok, "cannot act until sealing completes/fails") + + payloadEnvelope := ð.ExecutionPayloadEnvelope{ + ParentBeaconBlockRoot: sentAttributes.Attributes.ParentBeaconBlockRoot, + ExecutionPayload: ð.ExecutionPayload{ + ParentHash: head.Hash, + FeeRecipient: sentAttributes.Attributes.SuggestedFeeRecipient, + BlockNumber: eth.Uint64Quantity(sentAttributes.Parent.Number + 1), + BlockHash: common.Hash{0x12, 0x34}, + Timestamp: sentAttributes.Attributes.Timestamp, + Transactions: sentAttributes.Attributes.Transactions, + // Not all attributes matter to sequencer. We can leave these nil. + }, + } + payloadRef := eth.L2BlockRef{ + Hash: payloadEnvelope.ExecutionPayload.BlockHash, + Number: uint64(payloadEnvelope.ExecutionPayload.BlockNumber), + ParentHash: payloadEnvelope.ExecutionPayload.ParentHash, + Time: uint64(payloadEnvelope.ExecutionPayload.Timestamp), + L1Origin: l1Origin.ID(), + SequenceNumber: 0, + } + emitter.ExpectOnce(engine.PayloadProcessEvent{ + IsLastInSpan: false, + DerivedFrom: eth.L1BlockRef{}, + Envelope: payloadEnvelope, + Ref: payloadRef, + }) + // And report back the sealing result to the engine + seq.OnEvent(engine.BuildSealedEvent{ + IsLastInSpan: false, + DerivedFrom: eth.L1BlockRef{}, + Info: payloadInfo, + Envelope: payloadEnvelope, + Ref: payloadRef, + }) + // The sequencer should start processing the payload + emitter.AssertExpectations(t) + // But also optimistically give it to the conductor and the async gossip + require.Equal(t, payloadEnvelope, deps.conductor.committed, "must commit to conductor") + require.Equal(t, payloadEnvelope, deps.asyncGossip.payload, "must send to async gossip") + _, ok = seq.NextAction() + require.False(t, ok, "optimistically published, but not ready to sequence next, until local processing completes") + + // Mock that the processing was successful + seq.OnEvent(engine.PayloadSuccessEvent{ + IsLastInSpan: false, + DerivedFrom: eth.L1BlockRef{}, + Envelope: payloadEnvelope, + Ref: payloadRef, + }) + require.Nil(t, deps.asyncGossip.payload, "async gossip should have cleared,"+ + " after previous publishing and now having persisted the block ourselves") + _, ok = seq.NextAction() + require.False(t, ok, "published and processed, but not canonical yet. Cannot proceed until then.") + + // Once the forkchoice update identifies the processed block + // as canonical we can proceed to the next sequencer cycle iteration. + // Pretend we only completed processing the block 120 ms into the next block time window. + // (This is why we publish optimistically) + testClock.Set(time.Unix(int64(payloadRef.Time), 0).Add(time.Millisecond * 120)) + seq.OnEvent(engine.ForkchoiceUpdateEvent{ + UnsafeL2Head: payloadRef, + SafeL2Head: eth.L2BlockRef{}, + FinalizedL2Head: eth.L2BlockRef{}, + }) + nextTime, ok := seq.NextAction() + require.True(t, ok, "ready to build next block") + require.Equal(t, testClock.Now(), nextTime, "start asap on the next block") +} + +type sequencerTestDeps struct { + cfg *rollup.Config + attribBuilder *FakeAttributesBuilder + l1OriginSelector *FakeL1OriginSelector + seqState *BasicSequencerStateListener + conductor *FakeConductor + asyncGossip *FakeAsyncGossip +} + +func createSequencer(log log.Logger) (*Sequencer, *sequencerTestDeps) { + rng := rand.New(rand.NewSource(123)) + cfg := &rollup.Config{ + Genesis: rollup.Genesis{ + L1: eth.BlockID{ + Hash: testutils.RandomHash(rng), + Number: 3000000, + }, + L2: eth.BlockID{ + Hash: testutils.RandomHash(rng), + Number: 0, + }, + L2Time: 10000000, + SystemConfig: eth.SystemConfig{}, + }, + BlockTime: 2, + MaxSequencerDrift: 15 * 60, + RegolithTime: new(uint64), + CanyonTime: new(uint64), + DeltaTime: new(uint64), + EcotoneTime: new(uint64), + FjordTime: new(uint64), + } + deps := &sequencerTestDeps{ + cfg: cfg, + attribBuilder: &FakeAttributesBuilder{cfg: cfg, rng: rng}, + l1OriginSelector: &FakeL1OriginSelector{ + l1OriginFn: func(l2Head eth.L2BlockRef) (eth.L1BlockRef, error) { + panic("override this") + }, + }, + seqState: &BasicSequencerStateListener{}, + conductor: &FakeConductor{}, + asyncGossip: &FakeAsyncGossip{}, + } + seq := NewSequencer(context.Background(), log, cfg, deps.attribBuilder, + deps.l1OriginSelector, deps.seqState, deps.conductor, + deps.asyncGossip, metrics.NoopMetrics, nil) + // We create mock payloads, with the epoch-id as tx[0], rather than proper L1Block-info deposit tx. + seq.toBlockRef = func(rollupCfg *rollup.Config, payload *eth.ExecutionPayload) (eth.L2BlockRef, error) { + return eth.L2BlockRef{ + Hash: payload.BlockHash, + Number: uint64(payload.BlockNumber), + ParentHash: payload.ParentHash, + Time: uint64(payload.Timestamp), + L1Origin: decodeID(payload.Transactions[0]), + SequenceNumber: 0, + }, nil + } + return seq, deps +} diff --git a/op-node/rollup/status/l1_head_buffer.go b/op-node/rollup/status/l1_head_buffer.go new file mode 100644 index 000000000000..c38fa9bab4cb --- /dev/null +++ b/op-node/rollup/status/l1_head_buffer.go @@ -0,0 +1,55 @@ +package status + +import ( + "sync" + + "github.com/ethereum-optimism/optimism/op-service/eth" +) + +// l1HeadBuffer is a thread-safe cache for L1 block references, which contains a series blocks with a valid chain of parent hashes. +type l1HeadBuffer struct { + rb *ringbuffer[eth.L1BlockRef] + minBlockNumber uint64 + mu sync.RWMutex +} + +func newL1HeadBuffer(size int) *l1HeadBuffer { + return &l1HeadBuffer{rb: newRingBuffer[eth.L1BlockRef](size)} +} + +// Get returns the L1 block reference for the given block number, if it exists in the cache. +func (lhb *l1HeadBuffer) Get(num uint64) (eth.L1BlockRef, bool) { + lhb.mu.RLock() + defer lhb.mu.RUnlock() + + return lhb.get(num) +} + +func (lhb *l1HeadBuffer) get(num uint64) (eth.L1BlockRef, bool) { + return lhb.rb.Get(int(num - lhb.minBlockNumber)) +} + +// Insert inserts a new L1 block reference into the cache, and removes any entries that are invalidated by a reorg. +// If the parent hash of the new head doesn't match the hash of the previous head, all entries after the new head are removed +// as the chain cannot be validated. +func (lhb *l1HeadBuffer) Insert(l1Head eth.L1BlockRef) { + lhb.mu.Lock() + defer lhb.mu.Unlock() + + if ref, ok := lhb.get(l1Head.Number - 1); ok && ref.Hash == l1Head.ParentHash { + // Parent hash is found, so we can safely add the new head to the cache after the parent. + // Remove any L1 refs from the cache after or conflicting with the new head. + if ref, ok := lhb.rb.End(); ok && ref.Number >= l1Head.Number { + for ref, ok = lhb.rb.Pop(); ok && ref.Number > l1Head.Number; ref, ok = lhb.rb.Pop() { + } + } + } else { + // Parent not found or doesn't match, so invalidate the entire cache. + lhb.rb.Reset() + } + + lhb.rb.Push(l1Head) + + start, _ := lhb.rb.Start() + lhb.minBlockNumber = start.Number +} diff --git a/op-node/rollup/status/l1_tracker.go b/op-node/rollup/status/l1_tracker.go new file mode 100644 index 000000000000..e3183bf7aa7a --- /dev/null +++ b/op-node/rollup/status/l1_tracker.go @@ -0,0 +1,43 @@ +package status + +import ( + "context" + + "github.com/ethereum-optimism/optimism/op-node/rollup/derive" + "github.com/ethereum-optimism/optimism/op-node/rollup/event" + "github.com/ethereum-optimism/optimism/op-service/eth" +) + +// L1Tracker implements the L1Fetcher interface while proactively maintaining a reorg-aware cache +// of L1 block references by number. This handles the L1UnsafeEvent in order to populate the cache with +// the latest L1 block references. +type L1Tracker struct { + derive.L1Fetcher + cache *l1HeadBuffer +} + +func NewL1Tracker(inner derive.L1Fetcher) *L1Tracker { + return &L1Tracker{ + L1Fetcher: inner, + cache: newL1HeadBuffer(1000), + } +} + +func (st *L1Tracker) OnEvent(ev event.Event) bool { + switch x := ev.(type) { + case L1UnsafeEvent: + st.cache.Insert(x.L1Unsafe) + default: + return false + } + + return true +} + +func (l *L1Tracker) L1BlockRefByNumber(ctx context.Context, num uint64) (eth.L1BlockRef, error) { + if ref, ok := l.cache.Get(num); ok { + return ref, nil + } + + return l.L1Fetcher.L1BlockRefByNumber(ctx, num) +} diff --git a/op-node/rollup/status/l1_tracker_test.go b/op-node/rollup/status/l1_tracker_test.go new file mode 100644 index 000000000000..b7ba5e7f9f87 --- /dev/null +++ b/op-node/rollup/status/l1_tracker_test.go @@ -0,0 +1,288 @@ +package status + +import ( + "context" + "testing" + + "github.com/ethereum-optimism/optimism/op-service/eth" + "github.com/ethereum-optimism/optimism/op-service/testutils" + "github.com/ethereum/go-ethereum/common" + "github.com/stretchr/testify/require" +) + +func mockL1BlockRef(num uint64) eth.L1BlockRef { + return eth.L1BlockRef{Number: num, Hash: common.Hash{byte(num)}, ParentHash: common.Hash{byte(num - 1)}} +} + +func newL1HeadEvent(l1Tracker *L1Tracker, head eth.L1BlockRef) { + l1Tracker.OnEvent(L1UnsafeEvent{ + L1Unsafe: head, + }) +} + +func TestCachingHeadReorg(t *testing.T) { + ctx := context.Background() + l1Fetcher := &testutils.MockL1Source{} + l1Tracker := NewL1Tracker(l1Fetcher) + + // no blocks added to cache yet + l1Head := mockL1BlockRef(99) + l1Fetcher.ExpectL1BlockRefByNumber(99, l1Head, nil) + ret, err := l1Tracker.L1BlockRefByNumber(ctx, 99) + require.NoError(t, err) + require.Equal(t, l1Head, ret) + l1Fetcher.AssertExpectations(t) + + // from cache + l1Head = mockL1BlockRef(100) + newL1HeadEvent(l1Tracker, l1Head) + ret, err = l1Tracker.L1BlockRefByNumber(ctx, 100) + require.NoError(t, err) + require.Equal(t, l1Head, ret) + + // from cache + l1Head = mockL1BlockRef(101) + newL1HeadEvent(l1Tracker, l1Head) + ret, err = l1Tracker.L1BlockRefByNumber(ctx, 101) + require.NoError(t, err) + require.Equal(t, l1Head, ret) + + // from cache + l1Head = mockL1BlockRef(102) + newL1HeadEvent(l1Tracker, l1Head) + ret, err = l1Tracker.L1BlockRefByNumber(ctx, 102) + require.NoError(t, err) + require.Equal(t, l1Head, ret) + + // trigger a reorg of block 102 + l1Head = mockL1BlockRef(102) + l1Head.Hash = common.Hash{0xde, 0xad, 0xbe, 0xef} + newL1HeadEvent(l1Tracker, l1Head) + ret, err = l1Tracker.L1BlockRefByNumber(ctx, 102) + require.NoError(t, err) + require.Equal(t, l1Head, ret) + + // confirm that 101 is still in the cache + ret, err = l1Tracker.L1BlockRefByNumber(ctx, 101) + require.NoError(t, err) + require.Equal(t, mockL1BlockRef(101), ret) +} + +func TestCachingHeadRewind(t *testing.T) { + ctx := context.Background() + l1Fetcher := &testutils.MockL1Source{} + l1Tracker := NewL1Tracker(l1Fetcher) + + // no blocks added to cache yet + l1Head := mockL1BlockRef(99) + l1Fetcher.ExpectL1BlockRefByNumber(99, l1Head, nil) + ret, err := l1Tracker.L1BlockRefByNumber(ctx, 99) + require.NoError(t, err) + require.Equal(t, l1Head, ret) + l1Fetcher.AssertExpectations(t) + + // from cache + l1Head = mockL1BlockRef(100) + newL1HeadEvent(l1Tracker, l1Head) + ret, err = l1Tracker.L1BlockRefByNumber(ctx, 100) + require.NoError(t, err) + require.Equal(t, l1Head, ret) + + // from cache + l1Head = mockL1BlockRef(101) + newL1HeadEvent(l1Tracker, l1Head) + ret, err = l1Tracker.L1BlockRefByNumber(ctx, 101) + require.NoError(t, err) + require.Equal(t, l1Head, ret) + + // from cache + l1Head = mockL1BlockRef(102) + newL1HeadEvent(l1Tracker, l1Head) + ret, err = l1Tracker.L1BlockRefByNumber(ctx, 102) + require.NoError(t, err) + require.Equal(t, l1Head, ret) + + // 101 is the new head, invalidating 102 + l1Head = mockL1BlockRef(101) + newL1HeadEvent(l1Tracker, l1Head) + ret, err = l1Tracker.L1BlockRefByNumber(ctx, 101) + require.NoError(t, err) + require.Equal(t, l1Head, ret) + + // confirm that 102 is no longer in the cache + l1Head = mockL1BlockRef(102) + l1Fetcher.ExpectL1BlockRefByNumber(102, l1Head, nil) + ret, err = l1Tracker.L1BlockRefByNumber(ctx, 102) + require.NoError(t, err) + require.Equal(t, l1Head, ret) + l1Fetcher.AssertExpectations(t) + + // confirm that 101 is still in the cache + ret, err = l1Tracker.L1BlockRefByNumber(ctx, 101) + require.NoError(t, err) + require.Equal(t, mockL1BlockRef(101), ret) +} + +func TestCachingChainShorteningReorg(t *testing.T) { + ctx := context.Background() + l1Fetcher := &testutils.MockL1Source{} + l1Tracker := NewL1Tracker(l1Fetcher) + + // no blocks added to cache yet + l1Head := mockL1BlockRef(99) + l1Fetcher.ExpectL1BlockRefByNumber(99, l1Head, nil) + ret, err := l1Tracker.L1BlockRefByNumber(ctx, 99) + require.NoError(t, err) + require.Equal(t, l1Head, ret) + l1Fetcher.AssertExpectations(t) + + // from cache + l1Head = mockL1BlockRef(100) + newL1HeadEvent(l1Tracker, l1Head) + ret, err = l1Tracker.L1BlockRefByNumber(ctx, 100) + require.NoError(t, err) + require.Equal(t, l1Head, ret) + + // from cache + l1Head = mockL1BlockRef(101) + newL1HeadEvent(l1Tracker, l1Head) + ret, err = l1Tracker.L1BlockRefByNumber(ctx, 101) + require.NoError(t, err) + require.Equal(t, l1Head, ret) + + // from cache + l1Head = mockL1BlockRef(102) + newL1HeadEvent(l1Tracker, l1Head) + ret, err = l1Tracker.L1BlockRefByNumber(ctx, 102) + require.NoError(t, err) + require.Equal(t, l1Head, ret) + + // trigger a reorg of block 101, invalidating the following cache elements (102) + l1Head = mockL1BlockRef(101) + l1Head.Hash = common.Hash{0xde, 0xad, 0xbe, 0xef} + newL1HeadEvent(l1Tracker, l1Head) + ret, err = l1Tracker.L1BlockRefByNumber(ctx, 101) + require.NoError(t, err) + require.Equal(t, l1Head, ret) + + // confirm that 102 has been removed + l1Fetcher.ExpectL1BlockRefByNumber(102, mockL1BlockRef(102), nil) + ret, err = l1Tracker.L1BlockRefByNumber(ctx, 102) + require.NoError(t, err) + require.Equal(t, mockL1BlockRef(102), ret) + l1Fetcher.AssertExpectations(t) +} + +func TestCachingDeepReorg(t *testing.T) { + ctx := context.Background() + l1Fetcher := &testutils.MockL1Source{} + l1Tracker := NewL1Tracker(l1Fetcher) + + // from cache + l1Head := mockL1BlockRef(100) + newL1HeadEvent(l1Tracker, l1Head) + ret, err := l1Tracker.L1BlockRefByNumber(ctx, 100) + require.NoError(t, err) + require.Equal(t, l1Head, ret) + + // from cache + l1Head = mockL1BlockRef(101) + newL1HeadEvent(l1Tracker, l1Head) + ret, err = l1Tracker.L1BlockRefByNumber(ctx, 101) + require.NoError(t, err) + require.Equal(t, l1Head, ret) + + // from cache + l1Head = mockL1BlockRef(102) + newL1HeadEvent(l1Tracker, l1Head) + ret, err = l1Tracker.L1BlockRefByNumber(ctx, 102) + require.NoError(t, err) + require.Equal(t, l1Head, ret) + + // append a new block 102 based on a different 101, invalidating the entire cache + parentHash := common.Hash{0xde, 0xad, 0xbe, 0xef} + l1Head = mockL1BlockRef(102) + l1Head.ParentHash = parentHash + newL1HeadEvent(l1Tracker, l1Head) + ret, err = l1Tracker.L1BlockRefByNumber(ctx, 102) + require.NoError(t, err) + require.Equal(t, l1Head, ret) + + // confirm that the cache contains no 101 + l1Fetcher.ExpectL1BlockRefByNumber(101, mockL1BlockRef(101), nil) + ret, err = l1Tracker.L1BlockRefByNumber(ctx, 101) + require.NoError(t, err) + require.Equal(t, mockL1BlockRef(101), ret) + l1Fetcher.AssertExpectations(t) + + // confirm that the cache contains no 100 + l1Fetcher.ExpectL1BlockRefByNumber(100, mockL1BlockRef(100), nil) + ret, err = l1Tracker.L1BlockRefByNumber(ctx, 100) + require.NoError(t, err) + require.Equal(t, mockL1BlockRef(100), ret) + l1Fetcher.AssertExpectations(t) +} + +func TestCachingSkipAhead(t *testing.T) { + ctx := context.Background() + l1Fetcher := &testutils.MockL1Source{} + l1Tracker := NewL1Tracker(l1Fetcher) + + // from cache + l1Head := mockL1BlockRef(100) + newL1HeadEvent(l1Tracker, l1Head) + ret, err := l1Tracker.L1BlockRefByNumber(ctx, 100) + require.NoError(t, err) + require.Equal(t, l1Head, ret) + + // from cache + l1Head = mockL1BlockRef(101) + newL1HeadEvent(l1Tracker, l1Head) + ret, err = l1Tracker.L1BlockRefByNumber(ctx, 101) + require.NoError(t, err) + require.Equal(t, l1Head, ret) + + // head jumps ahead from 101->103, invalidating the entire cache + l1Head = mockL1BlockRef(103) + newL1HeadEvent(l1Tracker, l1Head) + ret, err = l1Tracker.L1BlockRefByNumber(ctx, 103) + require.NoError(t, err) + require.Equal(t, mockL1BlockRef(103), ret) + l1Fetcher.AssertExpectations(t) + + // confirm that the cache contains no 101 + l1Fetcher.ExpectL1BlockRefByNumber(101, mockL1BlockRef(101), nil) + ret, err = l1Tracker.L1BlockRefByNumber(ctx, 101) + require.NoError(t, err) + require.Equal(t, mockL1BlockRef(101), ret) + l1Fetcher.AssertExpectations(t) +} + +func TestCacheSizeEviction(t *testing.T) { + ctx := context.Background() + l1Fetcher := &testutils.MockL1Source{} + l1Tracker := NewL1Tracker(l1Fetcher) + + // insert 1000 elements into the cache + for idx := 1000; idx < 2000; idx++ { + l1Head := mockL1BlockRef(uint64(idx)) + newL1HeadEvent(l1Tracker, l1Head) + } + + // request each element from cache + for idx := 1000; idx < 2000; idx++ { + ret, err := l1Tracker.L1BlockRefByNumber(ctx, uint64(idx)) + require.NoError(t, err) + require.Equal(t, mockL1BlockRef(uint64(idx)), ret) + } + + // insert 1001st element, removing the first + l1Head := mockL1BlockRef(2000) + newL1HeadEvent(l1Tracker, l1Head) + + // request first element, which now requires a live fetch instead + l1Fetcher.ExpectL1BlockRefByNumber(1000, mockL1BlockRef(1000), nil) + ret, err := l1Tracker.L1BlockRefByNumber(ctx, 1000) + require.NoError(t, err) + require.Equal(t, mockL1BlockRef(1000), ret) +} diff --git a/op-node/rollup/status/ringbuffer.go b/op-node/rollup/status/ringbuffer.go new file mode 100644 index 000000000000..00b8233ac13d --- /dev/null +++ b/op-node/rollup/status/ringbuffer.go @@ -0,0 +1,67 @@ +package status + +// ringBuffer is a circular buffer that can be used to store a fixed number of +// elements. When the buffer is full, the oldest element is overwritten. +// This buffer implementation supports indexed access to elements, as well as +// access to the first and last elements. +type ringbuffer[T any] struct { + contents []T + start int + size int +} + +func newRingBuffer[T any](size int) *ringbuffer[T] { + return &ringbuffer[T]{ + contents: make([]T, size), + } +} + +func (rb *ringbuffer[T]) Len() int { + return rb.size +} + +func (rb *ringbuffer[T]) Get(idx int) (T, bool) { + if idx < 0 || idx >= rb.size { + var zero T + return zero, false + } + return rb.contents[(rb.start+idx)%len(rb.contents)], true +} + +func (rb *ringbuffer[T]) Start() (T, bool) { + if rb.size == 0 { + var zero T + return zero, false + } + return rb.contents[rb.start], true +} + +func (rb *ringbuffer[T]) End() (T, bool) { + if rb.size == 0 { + var zero T + return zero, false + } + return rb.contents[(rb.start+rb.size+len(rb.contents)-1)%len(rb.contents)], true +} + +func (rb *ringbuffer[T]) Push(val T) { + rb.contents[(rb.start+rb.size)%len(rb.contents)] = val + if rb.size == len(rb.contents) { + rb.start = (rb.start + 1) % len(rb.contents) + } else { + rb.size++ + } +} + +func (rb *ringbuffer[T]) Pop() (T, bool) { + end, ok := rb.End() + if ok { + rb.size-- + } + return end, ok +} + +func (rb *ringbuffer[T]) Reset() { + rb.start = 0 + rb.size = 0 +} diff --git a/op-node/rollup/status/status.go b/op-node/rollup/status/status.go new file mode 100644 index 000000000000..65121b1294aa --- /dev/null +++ b/op-node/rollup/status/status.go @@ -0,0 +1,143 @@ +package status + +import ( + "sync" + "sync/atomic" + + "github.com/ethereum/go-ethereum/log" + + "github.com/ethereum-optimism/optimism/op-node/rollup" + "github.com/ethereum-optimism/optimism/op-node/rollup/derive" + "github.com/ethereum-optimism/optimism/op-node/rollup/engine" + "github.com/ethereum-optimism/optimism/op-node/rollup/event" + "github.com/ethereum-optimism/optimism/op-node/rollup/finality" + "github.com/ethereum-optimism/optimism/op-service/eth" +) + +type L1UnsafeEvent struct { + L1Unsafe eth.L1BlockRef +} + +func (ev L1UnsafeEvent) String() string { + return "l1-unsafe" +} + +type L1SafeEvent struct { + L1Safe eth.L1BlockRef +} + +func (ev L1SafeEvent) String() string { + return "l1-safe" +} + +type Metrics interface { + RecordL1ReorgDepth(d uint64) + RecordL1Ref(name string, ref eth.L1BlockRef) +} + +type StatusTracker struct { + data eth.SyncStatus + + published atomic.Pointer[eth.SyncStatus] + + log log.Logger + + metrics Metrics + + mu sync.RWMutex +} + +func NewStatusTracker(log log.Logger, metrics Metrics) *StatusTracker { + st := &StatusTracker{ + log: log, + metrics: metrics, + } + st.data = eth.SyncStatus{} + st.published.Store(ð.SyncStatus{}) + return st +} + +func (st *StatusTracker) OnEvent(ev event.Event) bool { + st.mu.Lock() + defer st.mu.Unlock() + + switch x := ev.(type) { + case engine.ForkchoiceUpdateEvent: + st.data.UnsafeL2 = x.UnsafeL2Head + st.data.SafeL2 = x.SafeL2Head + st.data.FinalizedL2 = x.FinalizedL2Head + case engine.PendingSafeUpdateEvent: + st.data.UnsafeL2 = x.Unsafe + st.data.PendingSafeL2 = x.PendingSafe + case engine.CrossUnsafeUpdateEvent: + st.data.CrossUnsafeL2 = x.CrossUnsafe + st.data.UnsafeL2 = x.LocalUnsafe + case engine.LocalSafeUpdateEvent: + st.data.LocalSafeL2 = x.Ref + case engine.CrossSafeUpdateEvent: + st.data.SafeL2 = x.CrossSafe + st.data.LocalSafeL2 = x.LocalSafe + case derive.DeriverL1StatusEvent: + st.data.CurrentL1 = x.Origin + case L1UnsafeEvent: + st.metrics.RecordL1Ref("l1_head", x.L1Unsafe) + // We don't need to do anything if the head hasn't changed. + if st.data.HeadL1 == (eth.L1BlockRef{}) { + st.log.Info("Received first L1 head signal", "l1_head", x.L1Unsafe) + } else if st.data.HeadL1.Hash == x.L1Unsafe.Hash { + st.log.Trace("Received L1 head signal that is the same as the current head", "l1_head", x.L1Unsafe) + } else if st.data.HeadL1.Hash == x.L1Unsafe.ParentHash { + // We got a new L1 block whose parent hash is the same as the current L1 head. Means we're + // dealing with a linear extension (new block is the immediate child of the old one). + st.log.Debug("L1 head moved forward", "l1_head", x.L1Unsafe) + } else { + if st.data.HeadL1.Number >= x.L1Unsafe.Number { + st.metrics.RecordL1ReorgDepth(st.data.HeadL1.Number - x.L1Unsafe.Number) + } + // New L1 block is not the same as the current head or a single step linear extension. + // This could either be a long L1 extension, or a reorg, or we simply missed a head update. + st.log.Warn("L1 head signal indicates a possible L1 re-org", + "old_l1_head", st.data.HeadL1, "new_l1_head_parent", x.L1Unsafe.ParentHash, "new_l1_head", x.L1Unsafe) + } + st.data.HeadL1 = x.L1Unsafe + case L1SafeEvent: + st.log.Info("New L1 safe block", "l1_safe", x.L1Safe) + st.metrics.RecordL1Ref("l1_safe", x.L1Safe) + st.data.SafeL1 = x.L1Safe + case finality.FinalizeL1Event: + st.log.Info("New L1 finalized block", "l1_finalized", x.FinalizedL1) + st.metrics.RecordL1Ref("l1_finalized", x.FinalizedL1) + st.data.FinalizedL1 = x.FinalizedL1 + st.data.CurrentL1Finalized = x.FinalizedL1 + case rollup.ResetEvent: + st.data.UnsafeL2 = eth.L2BlockRef{} + st.data.SafeL2 = eth.L2BlockRef{} + st.data.CurrentL1 = eth.L1BlockRef{} + case engine.EngineResetConfirmedEvent: + st.data.UnsafeL2 = x.Unsafe + st.data.SafeL2 = x.Safe + st.data.FinalizedL2 = x.Finalized + default: // other events do not affect the sync status + return false + } + + // If anything changes, then copy the state to the published SyncStatus + // @dev: If this becomes a performance bottleneck during sync (because mem copies onto heap, and 1KB comparisons), + // we can rate-limit updates of the published data. + published := *st.published.Load() + if st.data != published { + published = st.data + st.published.Store(&published) + } + return true +} + +// SyncStatus is thread safe, and reads the latest view of L1 and L2 block labels +func (st *StatusTracker) SyncStatus() *eth.SyncStatus { + return st.published.Load() +} + +// L1Head is a helper function; the L1 head is closely monitored for confirmation-distance logic. +func (st *StatusTracker) L1Head() eth.L1BlockRef { + return st.SyncStatus().HeadL1 +} diff --git a/op-node/rollup/superchain.go b/op-node/rollup/superchain.go index 3cafdf91ace0..21a74323c05f 100644 --- a/op-node/rollup/superchain.go +++ b/op-node/rollup/superchain.go @@ -12,11 +12,7 @@ import ( "github.com/ethereum-optimism/superchain-registry/superchain" ) -var OPStackSupport = params.ProtocolVersionV0{Build: [8]byte{}, Major: 6, Minor: 0, Patch: 0, PreRelease: 0}.Encode() - -const ( - pgnSepolia = 58008 -) +var OPStackSupport = params.ProtocolVersionV0{Build: [8]byte{}, Major: 8, Minor: 0, Patch: 0, PreRelease: 0}.Encode() // LoadOPStackRollupConfig loads the rollup configuration of the requested chain ID from the superchain-registry. // Some chains may require a SystemConfigProvider to retrieve any values not part of the registry. @@ -48,12 +44,20 @@ func LoadOPStackRollupConfig(chainID uint64) (*Config, error) { return nil, fmt.Errorf("unable to retrieve deposit contract address") } - var plasma *PlasmaConfig - if chConfig.Plasma != nil { - plasma = &PlasmaConfig{ - DAChallengeAddress: common.Address(*chConfig.Plasma.DAChallengeAddress), - DAChallengeWindow: *chConfig.Plasma.DAChallengeWindow, - DAResolveWindow: *chConfig.Plasma.DAResolveWindow, + var altDA *AltDAConfig + if chConfig.AltDA != nil { + altDA = &AltDAConfig{} + if chConfig.AltDA.DAChallengeAddress != nil { + altDA.DAChallengeAddress = common.Address(*chConfig.AltDA.DAChallengeAddress) + } + if chConfig.AltDA.DAChallengeWindow != nil { + altDA.DAChallengeWindow = *chConfig.AltDA.DAChallengeWindow + } + if chConfig.AltDA.DAResolveWindow != nil { + altDA.DAResolveWindow = *chConfig.AltDA.DAResolveWindow + } + if chConfig.AltDA.DACommitmentType != nil { + altDA.CommitmentType = *chConfig.AltDA.DACommitmentType } } @@ -72,13 +76,13 @@ func LoadOPStackRollupConfig(chainID uint64) (*Config, error) { SystemConfig: genesisSysConfig, }, // The below chain parameters can be different per OP-Stack chain, - // but since none of the superchain chains differ, it's not represented in the superchain-registry yet. - // This restriction on superchain-chains may change in the future. - // Test/Alt configurations can still load custom rollup-configs when necessary. - BlockTime: 2, - MaxSequencerDrift: 600, - SeqWindowSize: 3600, - ChannelTimeout: 300, + // therefore they are read from the superchain-registry configs. + // Note: hardcoded values are not yet represented in the registry but should be + // soon, then will be read and set in the same fashion. + BlockTime: chConfig.BlockTime, + MaxSequencerDrift: chConfig.MaxSequencerDrift, + SeqWindowSize: chConfig.SequencerWindowSize, + ChannelTimeoutBedrock: 300, L1ChainID: new(big.Int).SetUint64(superChain.Config.L1.ChainID), L2ChainID: new(big.Int).SetUint64(chConfig.ChainID), RegolithTime: ®olithTime, @@ -86,18 +90,15 @@ func LoadOPStackRollupConfig(chainID uint64) (*Config, error) { DeltaTime: chConfig.DeltaTime, EcotoneTime: chConfig.EcotoneTime, FjordTime: chConfig.FjordTime, + GraniteTime: chConfig.GraniteTime, BatchInboxAddress: common.Address(chConfig.BatchInboxAddr), DepositContractAddress: common.Address(addrs.OptimismPortalProxy), L1SystemConfigAddress: common.Address(addrs.SystemConfigProxy), - PlasmaConfig: plasma, + AltDAConfig: altDA, } if superChain.Config.ProtocolVersionsAddr != nil { // Set optional protocol versions address cfg.ProtocolVersionsAddress = common.Address(*superChain.Config.ProtocolVersionsAddr) } - if chainID == pgnSepolia { - cfg.MaxSequencerDrift = 1000 - cfg.SeqWindowSize = 7200 - } return cfg, nil } diff --git a/op-node/rollup/sync/config.go b/op-node/rollup/sync/config.go index 965d7c127cc4..4e36092aaaf3 100644 --- a/op-node/rollup/sync/config.go +++ b/op-node/rollup/sync/config.go @@ -70,4 +70,6 @@ type Config struct { // Note: We probably need to detect the condition that snap sync has not complete when we do a restart prior to running sync-start if we are doing // snap sync with a genesis finalization data. SkipSyncStartCheck bool `json:"skip_sync_start_check"` + + SupportsPostFinalizationELSync bool `json:"supports_post_finalization_elsync"` } diff --git a/op-node/rollup/sync/start.go b/op-node/rollup/sync/start.go index f81985bc21c1..15a811bce57f 100644 --- a/op-node/rollup/sync/start.go +++ b/op-node/rollup/sync/start.go @@ -54,6 +54,13 @@ var TooDeepReorgErr = errors.New("reorg is too deep") const MaxReorgSeqWindows = 5 +// RecoverMinSeqWindows is the number of sequence windows +// between the unsafe head L1 origin, and the finalized block, while finality is still at genesis, +// that need to elapse to heuristically recover from a missing forkchoice state. +// Note that in healthy node circumstances finality should have been forced a long time ago, +// since blocks are force-inserted after a full sequence window. +const RecoverMinSeqWindows = 14 + type FindHeadsResult struct { Unsafe eth.L2BlockRef Safe eth.L2BlockRef @@ -114,6 +121,25 @@ func FindL2Heads(ctx context.Context, cfg *rollup.Config, l1 L1Chain, l2 L2Chain lgr.Info("Loaded current L2 heads", "unsafe", result.Unsafe, "safe", result.Safe, "finalized", result.Finalized, "unsafe_origin", result.Unsafe.L1Origin, "safe_origin", result.Safe.L1Origin) + // Check if the execution engine completed sync, but left the forkchoice finalized & safe heads at genesis. + // This is the equivalent of the "syncStatusFinishedELButNotFinalized" post-processing in the engine controller. + if result.Finalized.Hash == cfg.Genesis.L2.Hash && + result.Safe.Hash == cfg.Genesis.L2.Hash && + result.Unsafe.Number > cfg.Genesis.L2.Number && + result.Unsafe.L1Origin.Number > cfg.Genesis.L1.Number+(RecoverMinSeqWindows*cfg.SeqWindowSize) { + lgr.Warn("Attempting recovery from sync state without finality.", "head", result.Unsafe) + return &FindHeadsResult{Unsafe: result.Unsafe, Safe: result.Unsafe, Finalized: result.Unsafe}, nil + } + + // Check if the execution engine corrupted, and forkchoice is ahead of the remaining chain: + // in this case we must go back to the prior head, to reprocess the pruned finalized/safe data. + if result.Unsafe.Number < result.Finalized.Number || result.Unsafe.Number < result.Safe.Number { + lgr.Error("Unsafe head is behind known finalized/safe blocks, "+ + "execution-engine chain must have been rewound without forkchoice update. Attempting recovery now.", + "unsafe_head", result.Unsafe, "safe_head", result.Safe, "finalized_head", result.Finalized) + return &FindHeadsResult{Unsafe: result.Unsafe, Safe: result.Unsafe, Finalized: result.Unsafe}, nil + } + // Remember original unsafe block to determine reorg depth prevUnsafe := result.Unsafe @@ -188,6 +214,8 @@ func FindL2Heads(ctx context.Context, cfg *rollup.Config, l1 L1Chain, l2 L2Chain } if ahead { + // discard previous candidate + highestL2WithCanonicalL1Origin = eth.L2BlockRef{} // keep the unsafe head if we can't tell if its L1 origin is canonical or not yet. } else if l1Block.Hash == n.L1Origin.Hash { // if L2 matches canonical chain, even if unsafe, diff --git a/op-node/rollup/sync/start_test.go b/op-node/rollup/sync/start_test.go index 0c202543c5de..e2cfee7712cc 100644 --- a/op-node/rollup/sync/start_test.go +++ b/op-node/rollup/sync/start_test.go @@ -26,7 +26,7 @@ func (c *syncStartTestCase) generateFakeL2(t *testing.T) (*testutils.FakeChainSo log := testlog.Logger(t, log.LevelError) chain := testutils.NewFakeChainSource([]string{c.L1, c.NewL1}, []string{c.L2}, int(c.GenesisL1Num), log) chain.SetL2Head(len(c.L2) - 1) - genesis := testutils.FakeGenesis(c.GenesisL1, c.GenesisL2, int(c.GenesisL1Num)) + genesis := testutils.FakeGenesis(c.GenesisL1, c.GenesisL2, c.GenesisL1Num) chain.ReorgL1() for i := 0; i < len(c.NewL1)-1; i++ { chain.AdvanceL1() diff --git a/op-node/rollup/types.go b/op-node/rollup/types.go index 93a2abed9a4b..e1312d723f54 100644 --- a/op-node/rollup/types.go +++ b/op-node/rollup/types.go @@ -12,7 +12,7 @@ import ( "github.com/ethereum/go-ethereum/log" "github.com/ethereum/go-ethereum/params" - plasma "github.com/ethereum-optimism/optimism/op-plasma" + altda "github.com/ethereum-optimism/optimism/op-alt-da" "github.com/ethereum-optimism/optimism/op-service/eth" ) @@ -20,6 +20,7 @@ var ( ErrBlockTimeZero = errors.New("block time cannot be 0") ErrMissingChannelTimeout = errors.New("channel timeout must be set, this should cover at least a L1 block time") ErrInvalidSeqWindowSize = errors.New("sequencing window size must at least be 2") + ErrInvalidMaxSeqDrift = errors.New("maximum sequencer drift must be greater than 0") ErrMissingGenesisL1Hash = errors.New("genesis L1 hash cannot be empty") ErrMissingGenesisL2Hash = errors.New("genesis L2 hash cannot be empty") ErrGenesisHashesSame = errors.New("achievement get! rollup inception: L1 and L2 genesis cannot be the same") @@ -49,13 +50,15 @@ type Genesis struct { SystemConfig eth.SystemConfig `json:"system_config"` } -type PlasmaConfig struct { +type AltDAConfig struct { // L1 DataAvailabilityChallenge contract proxy address DAChallengeAddress common.Address `json:"da_challenge_contract_address,omitempty"` - // DA challenge window value set on the DAC contract. Used in plasma mode + // 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 alt-da 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 + // DA resolve window value set on the DAC contract. Used in alt-da mode // to compute when a challenge expires and trigger a reorg if needed. DAResolveWindow uint64 `json:"da_resolve_window"` } @@ -66,7 +69,7 @@ type Config struct { // Seconds per L2 block BlockTime uint64 `json:"block_time"` // Sequencer batches may not be more than MaxSequencerDrift seconds after - // the L1 timestamp of the sequencing window end. + // the L1 timestamp of their L1 origin time. // // 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. @@ -79,7 +82,7 @@ type Config struct { // 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. - ChannelTimeout uint64 `json:"channel_timeout"` + ChannelTimeoutBedrock uint64 `json:"channel_timeout"` // Required to verify L1 signatures L1ChainID *big.Int `json:"l1_chain_id"` // Required to identify the L2 network and create p2p signatures unique for this chain. @@ -107,6 +110,14 @@ type Config struct { // Active if FjordTime != nil && L2 block timestamp >= *FjordTime, inactive otherwise. FjordTime *uint64 `json:"fjord_time,omitempty"` + // GraniteTime sets the activation time of the Granite network upgrade. + // Active if GraniteTime != nil && L2 block timestamp >= *GraniteTime, inactive otherwise. + GraniteTime *uint64 `json:"granite_time,omitempty"` + + // HoloceneTime sets the activation time of the Holocene network upgrade. + // Active if HoloceneTime != nil && L2 block timestamp >= *HoloceneTime, inactive otherwise. + HoloceneTime *uint64 `json:"holocene_time,omitempty"` + // InteropTime sets the activation time for an experimental feature-set, activated like a hardfork. // Active if InteropTime != nil && L2 block timestamp >= *InteropTime, inactive otherwise. InteropTime *uint64 `json:"interop_time,omitempty"` @@ -124,22 +135,8 @@ 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 - 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. - 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. - LegacyDAResolveWindow uint64 `json:"da_resolve_window,omitempty"` - - // LegacyUsePlasma is activated when the chain is in plasma mode. - LegacyUsePlasma bool `json:"use_plasma,omitempty"` + // AltDAConfig. We are in the process of migrating to the AltDAConfig from these legacy top level values + AltDAConfig *AltDAConfig `json:"alt_da,omitempty"` L2BlobConfig *L2BlobConfig `json:"l2_blob_config,omitempty"` } @@ -150,7 +147,7 @@ type L2BlobConfig struct { // IsL2Blob returns whether l2 blob is enabled func (cfg *Config) IsL2Blob(parentTime uint64) bool { - return cfg.L2BlobConfig != nil && *cfg.L2BlobConfig.L2BlobTime <= parentTime + return cfg.IsL2BlobTimeSet() && *cfg.L2BlobConfig.L2BlobTime <= parentTime } // IsL2BlobTimeSet returns whether l2 blob activation time is set @@ -272,12 +269,15 @@ func (cfg *Config) Check() error { if cfg.BlockTime == 0 { return ErrBlockTimeZero } - if cfg.ChannelTimeout == 0 { + if cfg.ChannelTimeoutBedrock == 0 { return ErrMissingChannelTimeout } if cfg.SeqWindowSize < 2 { return ErrInvalidSeqWindowSize } + if cfg.MaxSequencerDrift == 0 { + return ErrInvalidMaxSeqDrift + } if cfg.Genesis.L1.Hash == (common.Hash{}) { return ErrMissingGenesisL1Hash } @@ -320,7 +320,7 @@ func (cfg *Config) Check() error { if cfg.L2ChainID.Sign() < 1 { return ErrL2ChainIDNotPositive } - if err := validatePlasmaConfig(cfg); err != nil { + if err := validateAltDAConfig(cfg); err != nil { return err } @@ -336,30 +336,27 @@ func (cfg *Config) Check() error { if err := checkFork(cfg.EcotoneTime, cfg.FjordTime, Ecotone, Fjord); err != nil { return err } + if err := checkFork(cfg.FjordTime, cfg.GraniteTime, Fjord, Granite); err != nil { + return err + } + if err := checkFork(cfg.GraniteTime, cfg.HoloceneTime, Granite, Holocene); err != nil { + return err + } return nil } -// validatePlasmaConfig checks the two approaches to configuring plasma mode. +// validateAltDAConfig checks the two approaches to configuring alt-da 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, +func validateAltDAConfig(cfg *Config) error { + if cfg.AltDAConfig != nil { + if !(cfg.AltDAConfig.CommitmentType == altda.KeccakCommitmentString || cfg.AltDAConfig.CommitmentType == altda.GenericCommitmentString) { + return fmt.Errorf("invalid commitment type: %v", cfg.AltDAConfig.CommitmentType) } - } 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.AltDAConfig.CommitmentType == altda.KeccakCommitmentString && cfg.AltDAConfig.DAChallengeAddress == (common.Address{}) { + return errors.New("Must set da_challenge_contract_address for keccak commitments") + } else if cfg.AltDAConfig.CommitmentType == altda.GenericCommitmentString && cfg.AltDAConfig.DAChallengeAddress != (common.Address{}) { + return errors.New("Must set empty da_challenge_contract_address for generic commitments") } } return nil @@ -411,12 +408,14 @@ 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) +// IsGranite returns true if the Granite hardfork is active at or past the given timestamp. +func (c *Config) IsGranite(timestamp uint64) bool { + return c.GraniteTime != nil && timestamp >= *c.GraniteTime +} + +// IsHolocene returns true if the Holocene hardfork is active at or past the given timestamp. +func (c *Config) IsHolocene(timestamp uint64) bool { + return c.HoloceneTime != nil && timestamp >= *c.HoloceneTime } // IsInterop returns true if the Interop hardfork is active at or past the given timestamp. @@ -450,12 +449,70 @@ func (c *Config) IsEcotoneActivationBlock(l2BlockTime uint64) bool { !c.IsEcotone(l2BlockTime-c.BlockTime) } +// 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) +} + +// IsGraniteActivationBlock returns whether the specified block is the first block subject to the +// Granite upgrade. +func (c *Config) IsGraniteActivationBlock(l2BlockTime uint64) bool { + return c.IsGranite(l2BlockTime) && + l2BlockTime >= c.BlockTime && + !c.IsGranite(l2BlockTime-c.BlockTime) +} + +// IsHoloceneActivationBlock returns whether the specified block is the first block subject to the +// Holocene upgrade. +func (c *Config) IsHoloceneActivationBlock(l2BlockTime uint64) bool { + return c.IsHolocene(l2BlockTime) && + l2BlockTime >= c.BlockTime && + !c.IsHolocene(l2BlockTime-c.BlockTime) +} + func (c *Config) IsInteropActivationBlock(l2BlockTime uint64) bool { return c.IsInterop(l2BlockTime) && l2BlockTime >= c.BlockTime && !c.IsInterop(l2BlockTime-c.BlockTime) } +func (c *Config) ActivateAtGenesis(hardfork ForkName) { + // IMPORTANT! ordered from newest to oldest + switch hardfork { + case Interop: + c.InteropTime = new(uint64) + fallthrough + case Holocene: + c.HoloceneTime = new(uint64) + fallthrough + case Granite: + c.GraniteTime = new(uint64) + fallthrough + case Fjord: + c.FjordTime = new(uint64) + fallthrough + case Ecotone: + c.EcotoneTime = new(uint64) + fallthrough + case Delta: + c.DeltaTime = new(uint64) + fallthrough + case Canyon: + c.CanyonTime = new(uint64) + fallthrough + case Regolith: + c.RegolithTime = new(uint64) + fallthrough + case Bedrock: + // default + case None: + break + } +} + // ForkchoiceUpdatedVersion returns the EngineAPIMethod suitable for the chain hard fork version. func (c *Config) ForkchoiceUpdatedVersion(attr *eth.PayloadAttributes) eth.EngineAPIMethod { if attr == nil { @@ -496,36 +553,38 @@ func (c *Config) GetPayloadVersion(timestamp uint64) eth.EngineAPIMethod { } } -// 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") +// GetOPAltDAConfig validates and returns the altDA config from the rollup config. +func (c *Config) GetOPAltDAConfig() (altda.Config, error) { + if c.AltDAConfig == nil { + return altda.Config{}, errors.New("no altDA config") } - if c.PlasmaConfig.DAChallengeAddress == (common.Address{}) { - return plasma.Config{}, errors.New("missing DAChallengeAddress") + if c.AltDAConfig.DAChallengeWindow == uint64(0) { + return altda.Config{}, errors.New("missing DAChallengeWindow") } - if c.PlasmaConfig.DAChallengeWindow == uint64(0) { - return plasma.Config{}, errors.New("missing DAChallengeWindow") + if c.AltDAConfig.DAResolveWindow == uint64(0) { + return altda.Config{}, errors.New("missing DAResolveWindow") } - if c.PlasmaConfig.DAResolveWindow == uint64(0) { - return plasma.Config{}, errors.New("missing DAResolveWindow") + t, err := altda.CommitmentTypeFromString(c.AltDAConfig.CommitmentType) + if err != nil { + return altda.Config{}, err } - return plasma.Config{ - DAChallengeContractAddress: c.PlasmaConfig.DAChallengeAddress, - ChallengeWindow: c.PlasmaConfig.DAChallengeWindow, - ResolveWindow: c.PlasmaConfig.DAResolveWindow, + return altda.Config{ + DAChallengeContractAddress: c.AltDAConfig.DAChallengeAddress, + ChallengeWindow: c.AltDAConfig.DAChallengeWindow, + ResolveWindow: c.AltDAConfig.DAResolveWindow, + CommitmentType: t, }, nil } -func (c *Config) PlasmaEnabled() bool { - return c.PlasmaConfig != nil +func (c *Config) AltDAEnabled() bool { + return c.AltDAConfig != 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. +// In alt-da mode longest possible window is challenge + resolve windows. func (c *Config) SyncLookback() uint64 { - if c.PlasmaEnabled() { - if win := (c.PlasmaConfig.DAChallengeWindow + c.PlasmaConfig.DAResolveWindow); win > c.SeqWindowSize { + if c.AltDAEnabled() { + if win := (c.AltDAConfig.DAChallengeWindow + c.AltDAConfig.DAResolveWindow); win > c.SeqWindowSize { return win } } @@ -563,9 +622,14 @@ func (c *Config) Description(l2Chains map[string]string) string { banner += fmt.Sprintf(" - Delta: %s\n", fmtForkTimeOrUnset(c.DeltaTime)) banner += fmt.Sprintf(" - Ecotone: %s\n", fmtForkTimeOrUnset(c.EcotoneTime)) banner += fmt.Sprintf(" - Fjord: %s\n", fmtForkTimeOrUnset(c.FjordTime)) + banner += fmt.Sprintf(" - Granite: %s\n", fmtForkTimeOrUnset(c.GraniteTime)) + banner += fmt.Sprintf(" - Holocene: %s\n", fmtForkTimeOrUnset(c.HoloceneTime)) 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.AltDAConfig != nil { + banner += fmt.Sprintf("Node supports Alt-DA Mode with CommitmentType %v\n", c.AltDAConfig.CommitmentType) + } return banner } @@ -585,6 +649,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(), @@ -593,7 +658,10 @@ func (c *Config) LogDescription(log log.Logger, l2Chains map[string]string) { "delta_time", fmtForkTimeOrUnset(c.DeltaTime), "ecotone_time", fmtForkTimeOrUnset(c.EcotoneTime), "fjord_time", fmtForkTimeOrUnset(c.FjordTime), + "granite_time", fmtForkTimeOrUnset(c.GraniteTime), + "holocene_time", fmtForkTimeOrUnset(c.HoloceneTime), "interop_time", fmtForkTimeOrUnset(c.InteropTime), + "alt_da", c.AltDAConfig != nil, ) } diff --git a/op-node/rollup/types_test.go b/op-node/rollup/types_test.go index 46d232a3ad06..61c620be7f13 100644 --- a/op-node/rollup/types_test.go +++ b/op-node/rollup/types_test.go @@ -42,7 +42,7 @@ func randConfig() *Config { BlockTime: 2, MaxSequencerDrift: 100, SeqWindowSize: 2, - ChannelTimeout: 123, + ChannelTimeoutBedrock: 123, L1ChainID: big.NewInt(900), L2ChainID: big.NewInt(901), BatchInboxAddress: randAddr(), @@ -232,6 +232,15 @@ func TestActivations(t *testing.T) { return c.IsFjord(t) }, }, + { + name: "Granite", + setUpgradeTime: func(t *uint64, c *Config) { + c.GraniteTime = t + }, + checkEnabled: func(t uint64, c *Config) bool { + return c.IsGranite(t) + }, + }, { name: "Interop", setUpgradeTime: func(t *uint64, c *Config) { @@ -366,8 +375,8 @@ func TestConfig_Check(t *testing.T) { expectedErr: ErrBlockTimeZero, }, { - name: "ChannelTimeoutZero", - modifier: func(cfg *Config) { cfg.ChannelTimeout = 0 }, + name: "ChannelTimeoutBedrockZero", + modifier: func(cfg *Config) { cfg.ChannelTimeoutBedrock = 0 }, expectedErr: ErrMissingChannelTimeout, }, { @@ -466,7 +475,7 @@ func TestConfig_Check(t *testing.T) { cfg := randConfig() test.modifier(cfg) err := cfg.Check() - assert.Same(t, err, test.expectedErr) + assert.ErrorIs(t, err, test.expectedErr) }) } diff --git a/op-node/service.go b/op-node/service.go index d4adee320708..14ff39aff160 100644 --- a/op-node/service.go +++ b/op-node/service.go @@ -9,8 +9,8 @@ import ( "os" "strings" + altda "github.com/ethereum-optimism/optimism/op-alt-da" "github.com/ethereum-optimism/optimism/op-node/chaincfg" - plasma "github.com/ethereum-optimism/optimism/op-plasma" "github.com/ethereum-optimism/optimism/op-service/oppprof" "github.com/ethereum-optimism/optimism/op-service/sources" "github.com/ethereum/go-ethereum/common" @@ -23,6 +23,7 @@ import ( p2pcli "github.com/ethereum-optimism/optimism/op-node/p2p/cli" "github.com/ethereum-optimism/optimism/op-node/rollup" "github.com/ethereum-optimism/optimism/op-node/rollup/driver" + "github.com/ethereum-optimism/optimism/op-node/rollup/engine" "github.com/ethereum-optimism/optimism/op-node/rollup/sync" opflags "github.com/ethereum-optimism/optimism/op-service/flags" ) @@ -74,12 +75,19 @@ func NewConfig(ctx *cli.Context, log log.Logger) (*node.Config, error) { haltOption = "" } + if ctx.IsSet(flags.HeartbeatEnabledFlag.Name) || + ctx.IsSet(flags.HeartbeatMonikerFlag.Name) || + ctx.IsSet(flags.HeartbeatURLFlag.Name) { + log.Warn("Heartbeat functionality is not supported anymore, CLI flags will be removed in following release.") + } + cfg := &node.Config{ - L1: l1Endpoint, - L2: l2Endpoint, - Rollup: *rollupConfig, - Driver: *driverConfig, - Beacon: NewBeaconEndpointConfig(ctx), + L1: l1Endpoint, + L2: l2Endpoint, + Rollup: *rollupConfig, + Driver: *driverConfig, + Beacon: NewBeaconEndpointConfig(ctx), + Supervisor: NewSupervisorEndpointConfig(ctx), RPC: node.RPCConfig{ ListenAddr: ctx.String(flags.RPCListenAddr.Name), ListenPort: ctx.Int(flags.RPCListenPort.Name), @@ -95,22 +103,16 @@ func NewConfig(ctx *cli.Context, log log.Logger) (*node.Config, error) { P2PSigner: p2pSignerSetup, L1EpochPollInterval: ctx.Duration(flags.L1EpochPollIntervalFlag.Name), RuntimeConfigReloadInterval: ctx.Duration(flags.RuntimeConfigReloadIntervalFlag.Name), - Heartbeat: node.HeartbeatConfig{ - Enabled: ctx.Bool(flags.HeartbeatEnabledFlag.Name), - Moniker: ctx.String(flags.HeartbeatMonikerFlag.Name), - URL: ctx.String(flags.HeartbeatURLFlag.Name), - }, - ConfigPersistence: configPersistence, - SafeDBPath: ctx.String(flags.SafeDBPath.Name), - Sync: *syncConfig, - RollupHalt: haltOption, - RethDBPath: ctx.String(flags.L1RethDBPath.Name), + ConfigPersistence: configPersistence, + SafeDBPath: ctx.String(flags.SafeDBPath.Name), + Sync: *syncConfig, + RollupHalt: haltOption, ConductorEnabled: ctx.Bool(flags.ConductorEnabledFlag.Name), ConductorRpc: ctx.String(flags.ConductorRpcFlag.Name), ConductorRpcTimeout: ctx.Duration(flags.ConductorRpcTimeoutFlag.Name), - Plasma: plasma.ReadCLIConfig(ctx), + AltDA: altda.ReadCLIConfig(ctx), DACConfig: node.ReadDACConfigFromCLI(ctx), } @@ -129,11 +131,17 @@ func NewConfig(ctx *cli.Context, log log.Logger) (*node.Config, error) { return cfg, nil } +func NewSupervisorEndpointConfig(ctx *cli.Context) node.SupervisorEndpointSetup { + return &node.SupervisorEndpointConfig{ + SupervisorAddr: ctx.String(flags.SupervisorAddr.Name), + } +} + func NewBeaconEndpointConfig(ctx *cli.Context) node.L1BeaconEndpointSetup { return &node.L1BeaconEndpointConfig{ BeaconAddr: ctx.String(flags.BeaconAddr.Name), BeaconHeader: ctx.String(flags.BeaconHeader.Name), - BeaconArchiverAddr: ctx.String(flags.BeaconArchiverAddr.Name), + BeaconFallbackAddrs: ctx.StringSlice(flags.BeaconFallbackAddrs.Name), BeaconCheckIgnore: ctx.Bool(flags.BeaconCheckIgnore.Name), BeaconFetchAllSidecars: ctx.Bool(flags.BeaconFetchAllSidecars.Name), } @@ -235,7 +243,9 @@ Conflicting configuration is deprecated, and will stop the op-node from starting defer file.Close() var rollupConfig rollup.Config - if err := json.NewDecoder(file).Decode(&rollupConfig); err != nil { + dec := json.NewDecoder(file) + dec.DisallowUnknownFields() + if err := dec.Decode(&rollupConfig); err != nil { return nil, fmt.Errorf("failed to decode rollup config: %w", err) } return &rollupConfig, nil @@ -254,25 +264,23 @@ func applyOverrides(ctx *cli.Context, rollupConfig *rollup.Config) { ecotone := ctx.Uint64(opflags.EcotoneOverrideFlagName) rollupConfig.EcotoneTime = &ecotone } -} - -func NewSnapshotLogger(ctx *cli.Context) (log.Logger, error) { - snapshotFile := ctx.String(flags.SnapshotLog.Name) - if snapshotFile == "" { - return log.NewLogger(log.DiscardHandler()), nil + if ctx.IsSet(opflags.FjordOverrideFlagName) { + fjord := ctx.Uint64(opflags.FjordOverrideFlagName) + rollupConfig.FjordTime = &fjord } - - sf, err := os.OpenFile(snapshotFile, os.O_CREATE|os.O_APPEND|os.O_WRONLY, 0644) - if err != nil { - return nil, err + if ctx.IsSet(opflags.GraniteOverrideFlagName) { + granite := ctx.Uint64(opflags.GraniteOverrideFlagName) + rollupConfig.GraniteTime = &granite + } + if ctx.IsSet(opflags.HoloceneOverrideFlagName) { + holocene := ctx.Uint64(opflags.HoloceneOverrideFlagName) + rollupConfig.HoloceneTime = &holocene } - handler := log.JSONHandler(sf) - return log.NewLogger(handler), nil } 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.") } @@ -280,9 +288,12 @@ func NewSyncConfig(ctx *cli.Context, log log.Logger) (*sync.Config, error) { if err != nil { return nil, err } + + engineKind := engine.Kind(ctx.String(flags.L2EngineKind.Name)) cfg := &sync.Config{ - SyncMode: mode, - SkipSyncStartCheck: ctx.Bool(flags.SkipSyncStartCheck.Name), + SyncMode: mode, + SkipSyncStartCheck: ctx.Bool(flags.SkipSyncStartCheck.Name), + SupportsPostFinalizationELSync: engineKind.SupportsPostFinalizationELSync(), } if ctx.Bool(flags.L2EngineSyncEnabled.Name) { cfg.SyncMode = sync.ELSync diff --git a/op-node/withdrawals/utils.go b/op-node/withdrawals/utils.go index f3b2067a33d6..6d1346ea2b4d 100644 --- a/op-node/withdrawals/utils.go +++ b/op-node/withdrawals/utils.go @@ -57,8 +57,8 @@ func ProveWithdrawalParameters(ctx context.Context, proofCl ProofClient, l2Recei return ProveWithdrawalParametersForBlock(ctx, proofCl, l2ReceiptCl, l2BlockCl, txHash, l2BlockNumber, l2OutputIndex) } -// ProveWithdrawalParametersFPAC calls ProveWithdrawalParametersForBlock with the most recent L2 output after the latest game. -func ProveWithdrawalParametersFPAC(ctx context.Context, proofCl ProofClient, l2ReceiptCl ReceiptClient, l2BlockCl BlockClient, txHash common.Hash, disputeGameFactoryContract *bindings.DisputeGameFactoryCaller, optimismPortal2Contract *bindingspreview.OptimismPortal2Caller) (ProvenWithdrawalParameters, error) { +// ProveWithdrawalParametersFaultProofs calls ProveWithdrawalParametersForBlock with the most recent L2 output after the latest game. +func ProveWithdrawalParametersFaultProofs(ctx context.Context, proofCl ProofClient, l2ReceiptCl ReceiptClient, l2BlockCl BlockClient, txHash common.Hash, disputeGameFactoryContract *bindings.DisputeGameFactoryCaller, optimismPortal2Contract *bindingspreview.OptimismPortal2Caller) (ProvenWithdrawalParameters, error) { latestGame, err := FindLatestGame(ctx, disputeGameFactoryContract, optimismPortal2Contract) if err != nil { return ProvenWithdrawalParameters{}, fmt.Errorf("failed to find latest game: %w", err) diff --git a/op-plasma/.gitignore b/op-plasma/.gitignore deleted file mode 100644 index ba077a4031ad..000000000000 --- a/op-plasma/.gitignore +++ /dev/null @@ -1 +0,0 @@ -bin diff --git a/op-plasma/Dockerfile.dockerignore b/op-plasma/Dockerfile.dockerignore deleted file mode 100644 index f7f3fc90af70..000000000000 --- a/op-plasma/Dockerfile.dockerignore +++ /dev/null @@ -1,7 +0,0 @@ -* - -!/op-bindings -!/op-service -!/op-plasma -!/go.mod -!/go.sum diff --git a/op-plasma/Makefile b/op-plasma/Makefile deleted file mode 100644 index 38b921f8d17f..000000000000 --- a/op-plasma/Makefile +++ /dev/null @@ -1,22 +0,0 @@ -GITCOMMIT ?= $(shell git rev-parse HEAD) -GITDATE ?= $(shell git show -s --format='%ct') -VERSION ?= v0.0.0 - -LDFLAGSSTRING +=-X main.GitCommit=$(GITCOMMIT) -LDFLAGSSTRING +=-X main.GitDate=$(GITDATE) -LDFLAGSSTRING +=-X main.Version=$(VERSION) -LDFLAGS := -ldflags "$(LDFLAGSSTRING)" - -da-server: - env GO111MODULE=on GOOS=$(TARGETOS) GOARCH=$(TARGETARCH) go build -v $(LDFLAGS) -o ./bin/da-server ./cmd/daserver - -clean: - rm bin/da-server - -test: - go test -v ./... - -.PHONY: \ - op-batcher \ - clean \ - test diff --git a/op-plasma/cli.go b/op-plasma/cli.go deleted file mode 100644 index 64b1dc33af92..000000000000 --- a/op-plasma/cli.go +++ /dev/null @@ -1,83 +0,0 @@ -package plasma - -import ( - "fmt" - "net/url" - - "github.com/urfave/cli/v2" -) - -const ( - EnabledFlagName = "plasma.enabled" - DaServerAddressFlagName = "plasma.da-server" - VerifyOnReadFlagName = "plasma.verify-on-read" - DaServiceFlag = "plasma.da-service" -) - -func plasmaEnv(envprefix, v string) []string { - return []string{envprefix + "_PLASMA_" + v} -} - -func CLIFlags(envPrefix string, category string) []cli.Flag { - return []cli.Flag{ - &cli.BoolFlag{ - Name: EnabledFlagName, - Usage: "Enable plasma mode", - Value: false, - EnvVars: plasmaEnv(envPrefix, "ENABLED"), - Category: category, - }, - &cli.StringFlag{ - Name: DaServerAddressFlagName, - Usage: "HTTP address of a DA Server", - EnvVars: plasmaEnv(envPrefix, "DA_SERVER"), - Category: category, - }, - &cli.BoolFlag{ - Name: VerifyOnReadFlagName, - Usage: "Verify input data matches the commitments from the DA storage service", - Value: true, - 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, - }, - } -} - -type CLIConfig struct { - Enabled bool - DAServerURL string - VerifyOnRead bool - GenericDA bool -} - -func (c CLIConfig) Check() error { - if c.Enabled { - if c.DAServerURL == "" { - return fmt.Errorf("DA server URL is required when plasma da is enabled") - } - if _, err := url.Parse(c.DAServerURL); err != nil { - return fmt.Errorf("DA server URL is invalid: %w", err) - } - } - return nil -} - -func (c CLIConfig) NewDAClient() *DAClient { - return &DAClient{url: c.DAServerURL, verify: c.VerifyOnRead, precompute: !c.GenericDA} -} - -func ReadCLIConfig(c *cli.Context) CLIConfig { - return 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 deleted file mode 100644 index 6d8ec315d747..000000000000 --- a/op-plasma/cmd/daserver/README.md +++ /dev/null @@ -1,31 +0,0 @@ -# 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 deleted file mode 100644 index 0b3378cb1525..000000000000 --- a/op-plasma/cmd/daserver/entrypoint.go +++ /dev/null @@ -1,61 +0,0 @@ -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) - - 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 deleted file mode 100644 index 0398fa8a2493..000000000000 --- a/op-plasma/cmd/daserver/file.go +++ /dev/null @@ -1,39 +0,0 @@ -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 deleted file mode 100644 index ee22d5587393..000000000000 --- a/op-plasma/cmd/daserver/flags.go +++ /dev/null @@ -1,148 +0,0 @@ -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" -) - -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"), - } - 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, -} - -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 -} - -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), - } -} - -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 deleted file mode 100644 index ba9f06a76117..000000000000 --- a/op-plasma/cmd/daserver/main.go +++ /dev/null @@ -1,35 +0,0 @@ -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/daclient_test.go b/op-plasma/daclient_test.go deleted file mode 100644 index c3ce4da6676b..000000000000 --- a/op-plasma/daclient_test.go +++ /dev/null @@ -1,162 +0,0 @@ -package plasma - -import ( - "context" - "fmt" - "math/rand" - "sync" - "testing" - - "github.com/ethereum-optimism/optimism/op-service/testlog" - "github.com/ethereum/go-ethereum/common" - "github.com/ethereum/go-ethereum/crypto" - "github.com/ethereum/go-ethereum/log" - "github.com/stretchr/testify/require" -) - -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() - - server := NewDAServer("127.0.0.1", 0, store, logger) - - require.NoError(t, server.Start()) - - cfg := CLIConfig{ - Enabled: true, - DAServerURL: fmt.Sprintf("http://%s", server.Endpoint()), - VerifyOnRead: 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, NewKeccak256Commitment(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"))) - - _, err = client.GetInput(ctx, comm) - require.ErrorIs(t, err, ErrCommitmentMismatch) - - // test not found error - 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) - - 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) - - // 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, NewGenericCommitment(input)) - require.Error(t, err) -} diff --git a/op-plasma/damgr.go b/op-plasma/damgr.go deleted file mode 100644 index c4eb0001f8d5..000000000000 --- a/op-plasma/damgr.go +++ /dev/null @@ -1,428 +0,0 @@ -package plasma - -import ( - "context" - "errors" - "fmt" - "io" - - "github.com/ethereum/go-ethereum/accounts/abi" - "github.com/ethereum/go-ethereum/common" - "github.com/ethereum/go-ethereum/core/types" - "github.com/ethereum/go-ethereum/crypto" - "github.com/ethereum/go-ethereum/log" - - "github.com/ethereum-optimism/optimism/op-plasma/bindings" - "github.com/ethereum-optimism/optimism/op-service/eth" -) - -// ErrPendingChallenge is returned when data is not available but can still be challenged/resolved -// so derivation should halt temporarily. -var ErrPendingChallenge = errors.New("not found, pending challenge") - -// ErrExpiredChallenge is returned when a challenge was not resolved and derivation should skip this input. -var ErrExpiredChallenge = errors.New("challenge expired") - -// ErrMissingPastWindow is returned when the input data is MIA and cannot be challenged. -// This is a protocol fatal error. -var ErrMissingPastWindow = errors.New("data missing past window") - -// ErrInvalidChallenge is returned when a challenge event does is decoded but does not -// relate to the actual chain commitments. -var ErrInvalidChallenge = errors.New("invalid challenge") - -// L1Fetcher is the required interface for syncing the DA challenge contract state. -type L1Fetcher interface { - InfoAndTxsByHash(ctx context.Context, hash common.Hash) (eth.BlockInfo, types.Transactions, error) - FetchReceipts(ctx context.Context, blockHash common.Hash) (eth.BlockInfo, types.Receipts, error) - L1BlockRefByNumber(context.Context, uint64) (eth.L1BlockRef, error) -} - -// DAStorage interface for calling the DA storage server. -type DAStorage interface { - 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. -type HeadSignalFn func(eth.L1BlockRef) - -// Config is the relevant subset of rollup config for plasma DA. -type Config struct { - // Required for filtering contract events - DAChallengeContractAddress common.Address - // 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. - ResolveWindow uint64 -} - -type DA struct { - log log.Logger - cfg Config - metrics Metricer - - storage DAStorage - - // the DA state keeps track of all the commitments and their challenge status. - state *State - - // the latest l1 block we synced challenge contract events from - origin eth.BlockID - // the latest recorded finalized head as per the challenge contract - finalizedHead eth.L1BlockRef - // the latest recorded finalized head as per the l1 finalization signal - l1FinalizedHead eth.L1BlockRef - // flag the reset function we are resetting because of an expired challenge - resetting bool - - finalizedHeadSignalFunc HeadSignalFn -} - -// NewPlasmaDA creates a new PlasmaDA instance with the given log and CLIConfig. -func NewPlasmaDA(log log.Logger, cli CLIConfig, cfg Config, metrics Metricer) *DA { - return NewPlasmaDAWithStorage(log, cfg, cli.NewDAClient(), metrics) -} - -// NewPlasmaDAWithStorage creates a new PlasmaDA instance with the given log and DAStorage interface. -func NewPlasmaDAWithStorage(log log.Logger, cfg Config, storage DAStorage, metrics Metricer) *DA { - return &DA{ - log: log, - cfg: cfg, - storage: storage, - metrics: metrics, - state: NewState(log, metrics), - } -} - -// 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{ - log: log, - cfg: cfg, - storage: storage, - metrics: metrics, - state: state, - } -} - -// OnFinalizedHeadSignal sets the callback function to be called when the finalized head is updated. -// This will signal to the engine queue that will set the proper L2 block as finalized. -func (d *DA) OnFinalizedHeadSignal(f HeadSignalFn) { - d.finalizedHeadSignalFunc = f -} - -// Finalize takes the L1 finality signal, compares the plasma finalized block and forwards the finality -// signal to the engine queue based on whichever is most behind. -func (d *DA) Finalize(l1Finalized eth.L1BlockRef) { - ref := d.finalizedHead - d.log.Info("received l1 finalized signal, forwarding to engine queue", "l1", l1Finalized, "plasma", ref) - // if the l1 finalized head is behind it is the finalized head - if l1Finalized.Number < d.finalizedHead.Number { - ref = l1Finalized - } - // prune finalized state - d.state.Prune(ref.Number) - - if d.finalizedHeadSignalFunc == nil { - d.log.Warn("finalized head signal function not set") - return - } - - // signal the engine queue - d.finalizedHeadSignalFunc(ref) -} - -// LookAhead increments the challenges origin and process the new block if it exists. -// It is used when the derivation pipeline stalls due to missing data and we need to continue -// syncing challenge events until the challenge is resolved or expires. -func (d *DA) LookAhead(ctx context.Context, l1 L1Fetcher) error { - blkRef, err := l1.L1BlockRefByNumber(ctx, d.origin.Number+1) - // temporary error, will do a backoff - if err != nil { - return err - } - return d.AdvanceL1Origin(ctx, l1, blkRef.ID()) -} - -// Reset the challenge event derivation origin in case of L1 reorg -func (d *DA) Reset(ctx context.Context, base eth.L1BlockRef, baseCfg eth.SystemConfig) error { - // resetting due to expired challenge, do not clear state. - // If the DA source returns ErrReset, the pipeline is forced to reset by the rollup driver. - // In that case the Reset function will be called immediately, BEFORE the pipeline can - // call any further stage to step. Thus the state will NOT be cleared if the reset originates - // from this stage of the pipeline. - if d.resetting { - d.resetting = false - } else { - // resetting due to L1 reorg, clear state - d.origin = base.ID() - d.state.Reset() - } - return io.EOF -} - -// 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 CommitmentData, blockId eth.BlockID) (eth.Data, error) { - // 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. - ch := d.state.GetOrTrackChallenge(comm.Encode(), blockId.Number, d.cfg.ChallengeWindow) - - // Fetch the input from the DA storage. - data, err := d.storage.GetInput(ctx, comm) - - // data is not found in storage but may be available if the challenge was resolved. - notFound := errors.Is(ErrNotFound, err) - - if err != nil && !notFound { - d.log.Error("failed to get preimage", "err", err) - // the storage client request failed for some other reason - // in which case derivation pipeline should be retried - return nil, err - } - - switch ch.challengeStatus { - case ChallengeActive: - if d.isExpired(ch.expiresAt) { - // this challenge has expired, this input must be skipped - return nil, ErrExpiredChallenge - } else if notFound { - // data is missing and a challenge is active, we must wait for the challenge to resolve - // hence we continue syncing new origins to sync the new challenge events. - if err := d.LookAhead(ctx, l1); err != nil { - return nil, err - } - return nil, ErrPendingChallenge - } - case ChallengeExpired: - // challenge was marked as expired, skip - return nil, ErrExpiredChallenge - case ChallengeResolved: - // challenge was resolved, data is available in storage, return directly - if !notFound { - return data, nil - } - // data not found in storage, return from challenge resolved input - resolvedInput, err := d.state.GetResolvedInput(comm.Encode()) - if err != nil { - return nil, err - } - return resolvedInput, nil - default: - if notFound { - if d.isExpired(ch.expiresAt) { - // we're past the challenge window and the data is not available - return nil, ErrMissingPastWindow - } else { - // continue syncing challenges hoping it eventually is challenged and resolved - if err := d.LookAhead(ctx, l1); err != nil { - return nil, err - } - return nil, ErrPendingChallenge - } - } - } - - return data, nil -} - -// isExpired returns whether the given expiration block number is lower or equal to the current head -func (d *DA) isExpired(bn uint64) bool { - return d.origin.Number >= bn -} - -// AdvanceL1Origin syncs any challenge events included in the l1 block, expires any active challenges -// after the new resolveWindow, computes and signals the new finalized head and sets the l1 block -// as the new head for tracking challenges. If forwards an error if any new challenge have expired to -// trigger a derivation reset. -func (d *DA) AdvanceL1Origin(ctx context.Context, l1 L1Fetcher, block eth.BlockID) error { - // do not repeat for the same origin - if block.Number <= d.origin.Number { - return nil - } - // sync challenges for the given block ID - if err := d.LoadChallengeEvents(ctx, l1, block); err != nil { - return err - } - // advance challenge window, computing the finalized head - bn, err := d.state.ExpireChallenges(block.Number) - if err != nil { - // warn the reset function not to clear the state - d.resetting = true - return err - } - - // finalized head signal is called only when the finalized head number increases - // and the l1 finalized head ahead of the DA finalized head. - if bn > d.finalizedHead.Number { - ref, err := l1.L1BlockRefByNumber(ctx, bn) - if err != nil { - return err - } - d.metrics.RecordChallengesHead("finalized", bn) - - // keep track of finalized had so it can be picked up by the - // l1 finalization signal - d.finalizedHead = ref - } - d.origin = block - d.metrics.RecordChallengesHead("latest", d.origin.Number) - - d.log.Info("processed plasma l1 origin", "origin", block, "next-finalized", bn, "finalized", d.finalizedHead.Number, "l1-finalize", d.l1FinalizedHead.Number) - return nil -} - -// LoadChallengeEvents fetches the l1 block receipts and updates the challenge status -func (d *DA) LoadChallengeEvents(ctx context.Context, l1 L1Fetcher, block eth.BlockID) error { - // filter any challenge event logs in the block - logs, err := d.fetchChallengeLogs(ctx, l1, block) - if err != nil { - return err - } - - for _, log := range logs { - i := log.TxIndex - status, comm, err := d.decodeChallengeStatus(log) - if err != nil { - d.log.Error("failed to decode challenge event", "block", block.Number, "tx", i, "log", log.Index, "err", err) - continue - } - switch status { - case ChallengeResolved: - // cached with input resolution call so not expensive - _, txs, err := l1.InfoAndTxsByHash(ctx, block.Hash) - if err != nil { - d.log.Error("failed to fetch l1 block", "block", block.Number, "err", err) - continue - } - // avoid panic in black swan case of faulty rpc - if uint(len(txs)) <= i { - d.log.Error("tx/receipt mismatch in InfoAndTxsByHash") - continue - } - // select the transaction corresponding to the receipt - tx := txs[i] - // txs and receipts must be in the same order - if tx.Hash() != log.TxHash { - 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 - } - d.log.Debug("challenge resolved", "block", block, "txIdx", i) - d.state.SetResolvedChallenge(comm.Encode(), input, log.BlockNumber) - case ChallengeActive: - d.log.Info("detected new active challenge", "block", block) - 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) - } - } - 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 - var logs []*types.Log - _, receipts, err := l1.FetchReceipts(ctx, block.Hash) - if err != nil { - return nil, err - } - d.log.Info("loading challenges", "epoch", block.Number, "numReceipts", len(receipts)) - for _, rec := range receipts { - // skip error logs - if rec.Status != types.ReceiptStatusSuccessful { - continue - } - for _, log := range rec.Logs { - if log.Address == d.cfg.DAChallengeContractAddress && len(log.Topics) > 0 && log.Topics[0] == ChallengeStatusEventABIHash { - logs = append(logs, log) - } - } - } - - return logs, nil -} - -// decodeChallengeStatus decodes and validates a challenge event from a transaction log, returning the associated commitment bytes. -func (d *DA) decodeChallengeStatus(log *types.Log) (ChallengeStatus, CommitmentData, error) { - event, err := DecodeChallengeStatusEvent(log) - if err != nil { - return 0, nil, err - } - 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() - // 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) - } - return ChallengeStatus(event.Status), comm, nil -} - -var ( - ChallengeStatusEventName = "ChallengeStatusChanged" - ChallengeStatusEventABI = "ChallengeStatusChanged(uint256,bytes,uint8)" - ChallengeStatusEventABIHash = crypto.Keccak256Hash([]byte(ChallengeStatusEventABI)) -) - -// DecodeChallengeStatusEvent decodes the challenge status event from the log data and the indexed challenged -// hash and block number from the topics. -func DecodeChallengeStatusEvent(log *types.Log) (*bindings.DataAvailabilityChallengeChallengeStatusChanged, error) { - // abi lazy loaded, cached after decoded once - dacAbi, err := bindings.DataAvailabilityChallengeMetaData.GetAbi() - if err != nil { - return nil, err - } - var event bindings.DataAvailabilityChallengeChallengeStatusChanged - err = dacAbi.UnpackIntoInterface(&event, ChallengeStatusEventName, log.Data) - if err != nil { - return nil, err - } - var indexed abi.Arguments - for _, arg := range dacAbi.Events[ChallengeStatusEventName].Inputs { - if arg.Indexed { - indexed = append(indexed, arg) - } - } - if err := abi.ParseTopics(&event, indexed, log.Topics[1:]); err != nil { - return nil, err - } - return &event, nil -} - -// DecodeResolvedInput decodes the preimage bytes from the tx input data. -func DecodeResolvedInput(data []byte) ([]byte, error) { - 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:]) - if err != nil { - return nil, err - } - rd, ok := args["resolveData"].([]byte) - if !ok || len(rd) == 0 { - return nil, fmt.Errorf("invalid resolve data") - } - return rd, nil -} diff --git a/op-plasma/damgr_test.go b/op-plasma/damgr_test.go deleted file mode 100644 index 5a37badc19ca..000000000000 --- a/op-plasma/damgr_test.go +++ /dev/null @@ -1,366 +0,0 @@ -package plasma - -import ( - "context" - "math/big" - "math/rand" - "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/ethereum/go-ethereum/core/types" - "github.com/ethereum/go-ethereum/log" - "github.com/stretchr/testify/mock" - "github.com/stretchr/testify/require" -) - -func RandomData(rng *rand.Rand, size int) []byte { - out := make([]byte, size) - rng.Read(out) - return out -} - -// TestDAChallengeState is a simple test with small values to verify the finalized head logic -func TestDAChallengeState(t *testing.T) { - logger := testlog.Logger(t, log.LvlDebug) - - rng := rand.New(rand.NewSource(1234)) - state := NewState(logger, &NoopMetrics{}) - - i := uint64(1) - - challengeWindow := uint64(6) - resolveWindow := uint64(6) - - // track commitments in the first 10 blocks - for ; i < 10; i++ { - // this is akin to stepping the derivation pipeline through a range a blocks each with a commitment - state.SetInputCommitment(RandomData(rng, 32), i, challengeWindow) - } - - // blocks are finalized after the challenge window expires - bn, err := state.ExpireChallenges(10) - require.NoError(t, err) - // finalized head = 10 - 6 = 4 - require.Equal(t, uint64(4), bn) - - // track the next commitment and mark it as challenged - c := RandomData(rng, 32) - // add input commitment at block i = 10 - state.SetInputCommitment(c, 10, challengeWindow) - // i+4 is the block at which it was challenged - state.SetActiveChallenge(c, 14, resolveWindow) - - for j := i + 1; j < 18; j++ { - // continue walking the pipeline through some more blocks with commitments - state.SetInputCommitment(RandomData(rng, 32), j, challengeWindow) - } - - // finalized l1 origin should not extend past the resolve window - bn, err = state.ExpireChallenges(18) - require.NoError(t, err) - // finalized is active_challenge_block - 1 = 10 - 1 and cannot move until the challenge expires - require.Equal(t, uint64(9), bn) - - // walk past the resolve window - for j := uint64(18); j < 22; j++ { - state.SetInputCommitment(RandomData(rng, 32), j, challengeWindow) - } - - // no more active challenges, the finalized head can catch up to the challenge window - bn, err = state.ExpireChallenges(22) - require.ErrorIs(t, err, ErrReorgRequired) - // finalized head is now 22 - 6 = 16 - require.Equal(t, uint64(16), bn) - - // cleanup state we don't need anymore - state.Prune(22) - // now if we expire the challenges again, it won't request a reorg again - bn, err = state.ExpireChallenges(22) - require.NoError(t, err) - // finalized head hasn't moved - require.Equal(t, uint64(16), bn) - - // add one more commitment and challenge it - c = RandomData(rng, 32) - state.SetInputCommitment(c, 22, challengeWindow) - // challenge 3 blocks after - state.SetActiveChallenge(c, 25, resolveWindow) - - // exceed the challenge window with more commitments - for j := uint64(23); j < 30; j++ { - state.SetInputCommitment(RandomData(rng, 32), j, challengeWindow) - } - - // finalized head should not extend past the resolve window - bn, err = state.ExpireChallenges(30) - require.NoError(t, err) - // finalized head is stuck waiting for resolve window - require.Equal(t, uint64(21), bn) - - input := RandomData(rng, 100) - // resolve the challenge - state.SetResolvedChallenge(c, input, 30) - - // finalized head catches up - bn, err = state.ExpireChallenges(31) - require.NoError(t, err) - // finalized head is now 31 - 6 = 25 - require.Equal(t, uint64(25), bn) - - // the resolved input is also stored - storedInput, err := state.GetResolvedInput(c) - require.NoError(t, err) - require.Equal(t, input, storedInput) -} - -// TestExpireChallenges expires challenges and prunes the state for longer windows -// with commitments every 6 blocks. -func TestExpireChallenges(t *testing.T) { - logger := testlog.Logger(t, log.LvlDebug) - - rng := rand.New(rand.NewSource(1234)) - state := NewState(logger, &NoopMetrics{}) - - comms := make(map[uint64][]byte) - - i := uint64(3713854) - - var finalized uint64 - - challengeWindow := uint64(90) - resolveWindow := uint64(90) - - // increment new commitments every 6 blocks - for ; i < 3713948; i += 6 { - comm := RandomData(rng, 32) - comms[i] = comm - logger.Info("set commitment", "block", i) - cm := state.GetOrTrackChallenge(comm, i, challengeWindow) - require.NotNil(t, cm) - - bn, err := state.ExpireChallenges(i) - logger.Info("expire challenges", "finalized head", bn, "err", err) - - // only update finalized head if it has moved - if bn > finalized { - finalized = bn - // prune unused state - state.Prune(bn) - } - } - - // activate a couple of subsequent challenges - state.SetActiveChallenge(comms[3713926], 3713948, resolveWindow) - - state.SetActiveChallenge(comms[3713932], 3713950, resolveWindow) - - // continue incrementing commitments - for ; i < 3714038; i += 6 { - comm := RandomData(rng, 32) - comms[i] = comm - logger.Info("set commitment", "block", i) - cm := state.GetOrTrackChallenge(comm, i, challengeWindow) - require.NotNil(t, cm) - - bn, err := state.ExpireChallenges(i) - logger.Info("expire challenges", "expired", bn, "err", err) - - if bn > finalized { - finalized = bn - state.Prune(bn) - } - - } - - // finalized head does not move as it expires previously seen blocks - bn, err := state.ExpireChallenges(3714034) - require.NoError(t, err) - require.Equal(t, uint64(3713920), bn) - - bn, err = state.ExpireChallenges(3714035) - require.NoError(t, err) - require.Equal(t, uint64(3713920), bn) - - bn, err = state.ExpireChallenges(3714036) - require.NoError(t, err) - require.Equal(t, uint64(3713920), bn) - - bn, err = state.ExpireChallenges(3714037) - require.NoError(t, err) - require.Equal(t, uint64(3713920), bn) - - // lastly we get to the resolve window and trigger a reorg - _, err = state.ExpireChallenges(3714038) - require.ErrorIs(t, err, ErrReorgRequired) - - // this is simulating a pipeline reset where it walks back challenge + resolve window - for i := uint64(3713854); i < 3714044; i += 6 { - cm := state.GetOrTrackChallenge(comms[i], i, challengeWindow) - require.NotNil(t, cm) - - // check that the challenge status was updated to expired - if i == 3713926 { - require.Equal(t, ChallengeExpired, cm.challengeStatus) - } - } - - bn, err = state.ExpireChallenges(3714038) - require.NoError(t, err) - - // finalized at last - 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 -} - -func (m *mockL1Fetcher) InfoAndTxsByHash(ctx context.Context, hash common.Hash) (eth.BlockInfo, types.Transactions, error) { - out := m.Mock.Called(hash) - return out.Get(0).(eth.BlockInfo), out.Get(1).(types.Transactions), out.Error(2) -} - -func (m *mockL1Fetcher) ExpectInfoAndTxsByHash(hash common.Hash, info eth.BlockInfo, transactions types.Transactions, err error) { - m.Mock.On("InfoAndTxsByHash", hash).Once().Return(info, transactions, err) -} - -func (m *mockL1Fetcher) FetchReceipts(ctx context.Context, blockHash common.Hash) (eth.BlockInfo, types.Receipts, error) { - out := m.Mock.Called(blockHash) - return *out.Get(0).(*eth.BlockInfo), out.Get(1).(types.Receipts), out.Error(2) -} - -func (m *mockL1Fetcher) ExpectFetchReceipts(hash common.Hash, info eth.BlockInfo, receipts types.Receipts, err error) { - m.Mock.On("FetchReceipts", hash).Once().Return(&info, receipts, err) -} - -func (m *mockL1Fetcher) L1BlockRefByNumber(ctx context.Context, num uint64) (eth.L1BlockRef, error) { - out := m.Mock.Called(num) - return out.Get(0).(eth.L1BlockRef), out.Error(1) -} - -func (m *mockL1Fetcher) ExpectL1BlockRefByNumber(num uint64, ref eth.L1BlockRef, err error) { - m.Mock.On("L1BlockRefByNumber", num).Once().Return(ref, err) -} - -func TestFilterInvalidBlockNumber(t *testing.T) { - logger := testlog.Logger(t, log.LevelDebug) - ctx := context.Background() - - l1F := &mockL1Fetcher{} - - storage := NewMockDAClient(logger) - - daddr := common.HexToAddress("0x978e3286eb805934215a88694d80b09aded68d90") - pcfg := Config{ - ChallengeWindow: 90, ResolveWindow: 90, DAChallengeContractAddress: daddr, - } - - bn := uint64(19) - bhash := common.HexToHash("0xd438144ffab918b1349e7cd06889c26800c26d8edc34d64f750e3e097166a09c") - - state := NewState(logger, &NoopMetrics{}) - - da := NewPlasmaDAWithState(logger, pcfg, storage, &NoopMetrics{}, state) - - receipts := types.Receipts{&types.Receipt{ - Type: 2, - Status: 1, - Logs: []*types.Log{ - { - BlockNumber: bn, - Address: daddr, - Topics: []common.Hash{ - common.HexToHash("0xa448afda7ea1e3a7a10fcab0c29fe9a9dd85791503bf0171f281521551c7ec05"), - }, - }, - { - BlockNumber: bn, - Address: daddr, - Topics: []common.Hash{ - common.HexToHash("0xc5d8c630ba2fdacb1db24c4599df78c7fb8cf97b5aecde34939597f6697bb1ad"), - common.HexToHash("0x000000000000000000000000000000000000000000000000000000000000000e"), - }, - Data: common.FromHex("0x00000000000000000000000000000000000000000000000000000000000000400000000000000000000000000000000000000000000000000000000000000001000000000000000000000000000000000000000000000000000000000000002100eed82c1026bdd0f23461dd6ca515ef677624e63e6fc0ff91e3672af8eddf579d00000000000000000000000000000000000000000000000000000000000000"), - }, - }, - BlockNumber: big.NewInt(int64(bn)), - }} - id := eth.BlockID{ - Number: bn, - Hash: bhash, - } - l1F.ExpectFetchReceipts(bhash, nil, receipts, nil) - - // 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) - - // 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 deleted file mode 100644 index c43bdbc53e92..000000000000 --- a/op-plasma/damock.go +++ /dev/null @@ -1,101 +0,0 @@ -package plasma - -import ( - "context" - "errors" - "io" - - "github.com/ethereum-optimism/optimism/op-service/eth" - "github.com/ethereum/go-ethereum/ethdb" - "github.com/ethereum/go-ethereum/ethdb/memorydb" - "github.com/ethereum/go-ethereum/log" -) - -// MockDAClient mocks a DA storage provider to avoid running an HTTP DA server -// in unit tests. -type MockDAClient struct { - CommitmentType CommitmentType - store ethdb.KeyValueStore - log log.Logger -} - -func NewMockDAClient(log log.Logger) *MockDAClient { - return &MockDAClient{ - CommitmentType: Keccak256CommitmentType, - store: memorydb.New(), - log: log, - } -} - -func (c *MockDAClient) GetInput(ctx context.Context, key CommitmentData) ([]byte, error) { - bytes, err := c.store.Get(key.Encode()) - if err != nil { - return nil, ErrNotFound - } - return bytes, nil -} - -func (c *MockDAClient) SetInput(ctx context.Context, data []byte) (CommitmentData, error) { - key := NewCommitmentData(c.CommitmentType, data) - return key, c.store.Put(key.Encode(), data) -} - -func (c *MockDAClient) DeleteData(key []byte) error { - return c.store.Delete(key) -} - -type DAErrFaker struct { - Client *MockDAClient - - getInputErr error - setInputErr error -} - -func (f *DAErrFaker) GetInput(ctx context.Context, key CommitmentData) ([]byte, error) { - if err := f.getInputErr; err != nil { - f.getInputErr = nil - return nil, err - } - return f.Client.GetInput(ctx, key) -} - -func (f *DAErrFaker) SetInput(ctx context.Context, data []byte) (CommitmentData, error) { - if err := f.setInputErr; err != nil { - f.setInputErr = nil - return nil, err - } - return f.Client.SetInput(ctx, data) -} - -func (f *DAErrFaker) ActGetPreImageFail() { - f.getInputErr = errors.New("get input failed") -} - -func (f *DAErrFaker) ActSetPreImageFail() { - f.setInputErr = errors.New("set input failed") -} - -var Disabled = &PlasmaDisabled{} - -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 CommitmentData, blockId eth.BlockID) (eth.Data, error) { - return nil, ErrNotEnabled -} - -func (d *PlasmaDisabled) Reset(ctx context.Context, base eth.L1BlockRef, baseCfg eth.SystemConfig) error { - return io.EOF -} - -func (d *PlasmaDisabled) Finalize(ref eth.L1BlockRef) { -} - -func (d *PlasmaDisabled) OnFinalizedHeadSignal(f HeadSignalFn) { -} - -func (d *PlasmaDisabled) AdvanceL1Origin(ctx context.Context, l1 L1Fetcher, blockId eth.BlockID) error { - return ErrNotEnabled -} diff --git a/op-plasma/dastate.go b/op-plasma/dastate.go deleted file mode 100644 index c6fee4800af9..000000000000 --- a/op-plasma/dastate.go +++ /dev/null @@ -1,228 +0,0 @@ -package plasma - -import ( - "container/heap" - "errors" - "fmt" - - "github.com/ethereum/go-ethereum/log" -) - -// ErrReorgRequired is returned when a commitment was derived but for which the challenge expired. -// This requires a reorg to rederive without the input even if the input was previously available. -var ErrReorgRequired = errors.New("reorg required") - -type ChallengeStatus uint8 - -const ( - ChallengeUninitialized ChallengeStatus = iota - ChallengeActive - ChallengeResolved - ChallengeExpired -) - -// Commitment keeps track of the onchain state of an input commitment. -type Commitment struct { - key []byte // the encoded commitment - input []byte // the input itself if it was resolved onchain - 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 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 -} - -func (c CommQueue) Swap(i, j int) { - c[i], c[j] = c[j], c[i] -} - -func (c *CommQueue) Push(x any) { - *c = append(*c, x.(*Commitment)) -} - -func (c *CommQueue) Pop() any { - old := *c - n := len(old) - item := old[n-1] - old[n-1] = nil // avoid memory leak - *c = old[0 : n-1] - return item -} - -// State tracks the commitment and their challenges in order of l1 inclusion. -type State struct { - 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{ - 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 - } - // 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 -// the commitment is not tracked as we don't want to track challenges for invalid commitments. -func (s *State) SetActiveChallenge(key []byte, challengedAt uint64, resolveWindow uint64) { - if c, ok := s.commsByKey[string(key)]; ok { - c.expiresAt = challengedAt + resolveWindow - c.challengeStatus = ChallengeActive - s.metrics.RecordActiveChallenge(c.blockNumber, challengedAt, key) - } -} - -// SetResolvedChallenge switches the state of a given commitment to resolved. Noop if -// the commitment is not tracked as we don't want to track challenges for invalid commitments. -// The input posted onchain is stored in the state for later retrieval. -func (s *State) SetResolvedChallenge(key []byte, input []byte, resolvedAt uint64) { - if c, ok := s.commsByKey[string(key)]; ok { - c.challengeStatus = ChallengeResolved - c.expiresAt = resolvedAt - c.input = input - s.metrics.RecordResolvedChallenge(key) - } -} - -// SetInputCommitment initializes a new commitment and adds it to the state. -// This is called when we see a commitment during derivation so we can refer to it later in -// challenges. -func (s *State) SetInputCommitment(key []byte, committedAt uint64, challengeWindow uint64) *Commitment { - c := &Commitment{ - key: key, - expiresAt: committedAt + challengeWindow, - blockNumber: committedAt, - canonical: true, - } - s.log.Debug("append commitment", "expiresAt", c.expiresAt, "blockNumber", c.blockNumber) - heap.Push(&s.activeComms, c) - s.commsByKey[string(key)] = c - - return c -} - -// GetOrTrackChallenge returns the commitment for the given key if it is already tracked, or -// 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) -} - -// GetResolvedInput returns the input bytes if the commitment was resolved onchain. -func (s *State) GetResolvedInput(key []byte) ([]byte, error) { - if c, ok := s.commsByKey[string(key)]; ok { - return c.input, nil - } - return nil, errors.New("commitment not found") -} - -// ExpireChallenges walks back from the oldest commitment to find the latest l1 origin -// for which input data can no longer be challenged. It also marks any active challenges -// 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) { - var err error - 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 - } - - // 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) - } - } - } - - 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 - } - 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)) - } -} - -// In case of L1 reorg, state should be cleared so we can sync all the challenge events -// from scratch. -func (s *State) Reset() { - s.activeComms = s.activeComms[:0] - s.expiredComms = s.expiredComms[:0] - s.finalized = 0 - clear(s.commsByKey) -} diff --git a/op-plasma/metrics.go b/op-plasma/metrics.go deleted file mode 100644 index 9843e91f3863..000000000000 --- a/op-plasma/metrics.go +++ /dev/null @@ -1,73 +0,0 @@ -package plasma - -import ( - "github.com/ethereum-optimism/optimism/op-service/metrics" - "github.com/prometheus/client_golang/prometheus" -) - -type Metricer interface { - RecordActiveChallenge(commBlock uint64, startBlock uint64, hash []byte) - RecordResolvedChallenge(hash []byte) - RecordExpiredChallenge(hash []byte) - RecordChallengesHead(name string, num uint64) - RecordStorageError() -} - -type Metrics struct { - ChallengesStatus *prometheus.GaugeVec - ChallengesHead *prometheus.GaugeVec - - StorageErrors *metrics.Event -} - -var _ Metricer = (*Metrics)(nil) - -func MakeMetrics(ns string, factory metrics.Factory) *Metrics { - return &Metrics{ - ChallengesStatus: factory.NewGaugeVec(prometheus.GaugeOpts{ - Namespace: ns, - Name: "challenges_status", - Help: "Gauge representing the status of challenges synced", - }, []string{"status"}), - ChallengesHead: factory.NewGaugeVec(prometheus.GaugeOpts{ - Namespace: ns, - Name: "challenges_head", - Help: "Gauge representing the l1 heads of challenges synced", - }, []string{"type"}), - StorageErrors: metrics.NewEvent(factory, ns, "", "storage_errors", "errors when fetching or uploading to storage service"), - } -} - -func (m *Metrics) RecordChallenge(status string) { - m.ChallengesStatus.WithLabelValues(status).Inc() -} - -// RecordActiveChallenge records when a commitment is challenged including the block where the commitment -// is included, the block where the commitment was challenged and the commitment hash. -func (m *Metrics) RecordActiveChallenge(commBlock uint64, startBlock uint64, hash []byte) { - m.RecordChallenge("active") -} - -func (m *Metrics) RecordResolvedChallenge(hash []byte) { - m.RecordChallenge("resolved") -} - -func (m *Metrics) RecordExpiredChallenge(hash []byte) { - m.RecordChallenge("expired") -} - -func (m *Metrics) RecordStorageError() { - m.StorageErrors.Record() -} - -func (m *Metrics) RecordChallengesHead(name string, num uint64) { - m.ChallengesHead.WithLabelValues(name).Set(float64(num)) -} - -type NoopMetrics struct{} - -func (m *NoopMetrics) RecordActiveChallenge(commBlock uint64, startBlock uint64, hash []byte) {} -func (m *NoopMetrics) RecordResolvedChallenge(hash []byte) {} -func (m *NoopMetrics) RecordExpiredChallenge(hash []byte) {} -func (m *NoopMetrics) RecordChallengesHead(name string, num uint64) {} -func (m *NoopMetrics) RecordStorageError() {} diff --git a/op-plasma/params.go b/op-plasma/params.go deleted file mode 100644 index 84672999e3c9..000000000000 --- a/op-plasma/params.go +++ /dev/null @@ -1,11 +0,0 @@ -package plasma - -// 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 - -// TxDataVersion1 is the version number for batcher transactions containing -// plasma commitments. It should not collide with DerivationVersion which is still -// used downstream when parsing the frames. -const TxDataVersion1 = 1 diff --git a/op-preimage/README.md b/op-preimage/README.md index 2543303a7d2f..584209ae3a8a 100644 --- a/op-preimage/README.md +++ b/op-preimage/README.md @@ -2,7 +2,7 @@ `op-preimage` offers simple Go bindings to interact as client or server over the Pre-image Oracle ABI. -Read more about the Preimage Oracle in the [specs](../specs/fault-proof.md). +Read more about the Preimage Oracle in the [specs](https://github.com/ethereum-optimism/specs/blob/main/specs/fault-proof/index.md#pre-image-oracle). See [op-program](../op-program) and [Cannon client examples](../cannon/example) for client-side usage. See [Cannon `mipsevm`](../cannon/mipsevm) for server-side usage. diff --git a/op-preimage/filechan.go b/op-preimage/filechan.go index 1b5f3e6286c9..3d844c58b6b5 100644 --- a/op-preimage/filechan.go +++ b/op-preimage/filechan.go @@ -1,8 +1,11 @@ package preimage import ( + "errors" + "fmt" "io" "os" + "syscall" ) // FileChannel is a unidirectional channel for file I/O @@ -41,10 +44,14 @@ func (rw *ReadWritePair) Writer() *os.File { } func (rw *ReadWritePair) Close() error { + var combinedErr error if err := rw.r.Close(); err != nil { - return err + combinedErr = errors.Join(fmt.Errorf("failed to close reader: %w", err)) } - return rw.w.Close() + if err := rw.w.Close(); err != nil { + combinedErr = errors.Join(fmt.Errorf("failed to close writer: %w", err)) + } + return combinedErr } // CreateBidirectionalChannel creates a pair of FileChannels that are connected to each other. @@ -68,14 +75,21 @@ const ( ) func ClientHinterChannel() *ReadWritePair { - r := os.NewFile(HClientRFd, "preimage-hint-read") - w := os.NewFile(HClientWFd, "preimage-hint-write") + r := newFileNonBlocking(HClientRFd, "preimage-hint-read") + w := newFileNonBlocking(HClientWFd, "preimage-hint-write") return NewReadWritePair(r, w) } // ClientPreimageChannel returns a FileChannel for the preimage oracle in a detached context func ClientPreimageChannel() *ReadWritePair { - r := os.NewFile(PClientRFd, "preimage-oracle-read") - w := os.NewFile(PClientWFd, "preimage-oracle-write") + r := newFileNonBlocking(PClientRFd, "preimage-oracle-read") + w := newFileNonBlocking(PClientWFd, "preimage-oracle-write") return NewReadWritePair(r, w) } + +func newFileNonBlocking(fd int, name string) *os.File { + // Try to enable non-blocking mode for IO so that read calls return when the file is closed + // This may not be possible on all systems so errors are ignored. + _ = syscall.SetNonblock(fd, true) + return os.NewFile(uintptr(fd), name) +} diff --git a/op-program/Dockerfile.repro b/op-program/Dockerfile.repro index 7d9dfc807240..12e52ec5b5a5 100644 --- a/op-program/Dockerfile.repro +++ b/op-program/Dockerfile.repro @@ -36,11 +36,15 @@ RUN --mount=type=cache,target=/root/.cache/go-build cd op-program && make op-pro # Run the op-program-client.elf binary directly through cannon's load-elf subcommand. RUN /app/cannon/bin/cannon load-elf --path /app/op-program/bin/op-program-client.elf --out /app/op-program/bin/prestate.json --meta "" +RUN /app/cannon/bin/cannon load-elf --type cannon-mt --path /app/op-program/bin/op-program-client.elf --out /app/op-program/bin/prestate-mt.bin.gz --meta "" # Generate the prestate proof containing the absolute pre-state hash. RUN /app/cannon/bin/cannon run --proof-at '=0' --stop-at '=1' --input /app/op-program/bin/prestate.json --meta "" --proof-fmt '/app/op-program/bin/%d.json' --output "" RUN mv /app/op-program/bin/0.json /app/op-program/bin/prestate-proof.json +RUN /app/cannon/bin/cannon run --proof-at '=0' --stop-at '=1' --input /app/op-program/bin/prestate-mt.bin.gz --meta "" --proof-fmt '/app/op-program/bin/%d-mt.json' --output "" +RUN mv /app/op-program/bin/0-mt.json /app/op-program/bin/prestate-proof-mt.json + # Exports files to the specified output location. # Writing files to host requires buildkit to be enabled. # e.g. `BUILDKIT=1 docker build ...` @@ -49,3 +53,5 @@ COPY --from=builder /app/op-program/bin/op-program . COPY --from=builder /app/op-program/bin/op-program-client.elf . COPY --from=builder /app/op-program/bin/prestate.json . COPY --from=builder /app/op-program/bin/prestate-proof.json . +COPY --from=builder /app/op-program/bin/prestate-mt.bin.gz . +COPY --from=builder /app/op-program/bin/prestate-proof-mt.json . diff --git a/op-program/Makefile b/op-program/Makefile index 509c4cf2e774..d8c134d9656a 100644 --- a/op-program/Makefile +++ b/op-program/Makefile @@ -4,13 +4,14 @@ VERSION ?= v0.0.0 LDFLAGSSTRING +=-X main.GitCommit=$(GITCOMMIT) LDFLAGSSTRING +=-X main.GitDate=$(GITDATE) -LDFLAGSSTRING +=-X github.com/ethereum-optimism/optimism/op-program/version.Meta=$(VERSION_META) # 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 +PC_LDFLAGSSTRING +=-X github.com/ethereum-optimism/optimism/op-program/version.Meta= 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) COMPAT_DIR := temp/compat @@ -20,23 +21,25 @@ op-program: \ op-program-client-mips op-program-host: - env GO111MODULE=on GOOS=$(TARGETOS) GOARCH=$(TARGETARCH) go build -v -ldflags "$(LDFLAGSSTRING)" -o ./bin/op-program ./host/cmd/main.go + env GO111MODULE=on GOOS=$(TARGETOS) GOARCH=$(TARGETARCH) CGO_ENABLED=0 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 "$(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 "$(LDFLAGSSTRING)" -o ./bin/op-program-client.elf ./client/cmd/main.go + env GO111MODULE=on GOOS=linux GOARCH=mips GOMIPS=softfloat go build -v -ldflags "$(PC_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 + env GO111MODULE=on GOOS=linux GOARCH=riscv64 go build -v -gcflags="all=-d=softfloat" -ldflags "$(PC_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:" + @echo "Cannon Absolute prestate hash: " @cat ./bin/prestate-proof.json | jq -r .pre + @echo "MT-Cannon Absolute prestate hash: " + @cat ./bin/prestate-proof-mt.json | jq -r .pre .PHONY: reproducible-prestate clean: @@ -63,7 +66,12 @@ capture-sepolia-ecotone: op-program-host op-program-client env GO111MODULE=on go run ./verify/sepolia/cmd/sepolia.go --l1 $$SEPOLIA_L1URL --l1.beacon $$SEPOLIA_BEACON_URL --l2 $$SEPOLIA_L2URL --datadir "$(COMPAT_DIR)/sepolia-ecotone" --l1.head "0x5d491a8c1e728a4e70720c09fefdaa083681a9421cd365af85220cf8bd4448a3" --l2.start "9205715" --l2.end "9205815" tar jcf "$(COMPAT_DIR)/sepolia-ecotone.tar.bz" -C "$(COMPAT_DIR)" sepolia-ecotone -capture-chain-test-data: capture-mainnet-genesis capture-sepolia-delta capture-sepolia-ecotone +capture-sepolia-fjord: op-program-host op-program-client + rm -rf "$(COMPAT_DIR)/sepolia-fjord" "$(COMPAT_DIR)/sepolia-fjord.tar.bz" + env GO111MODULE=on go run ./verify/sepolia/cmd/sepolia.go --l1 $$SEPOLIA_L1URL --l1.beacon $$SEPOLIA_BEACON_URL --l2 $$SEPOLIA_L2URL --datadir "$(COMPAT_DIR)/sepolia-fjord" --l1.head "0x93ba31bf89e54237af6e6564e69d328b2b5202adf643de4cb097431f74f4a6c1" --l2.start "15378256" --l2.end "15378356" + tar jcf "$(COMPAT_DIR)/sepolia-fjord.tar.bz" -C "$(COMPAT_DIR)" sepolia-fjord + +capture-chain-test-data: capture-mainnet-genesis capture-sepolia-delta capture-sepolia-ecotone capture-sepolia-fjord verify-sepolia-delta: op-program-host op-program-client ./scripts/run-compat.sh "sepolia-delta" @@ -74,6 +82,9 @@ verify-mainnet-genesis: op-program-host op-program-client verify-sepolia-ecotone: op-program-host op-program-client ./scripts/run-compat.sh "sepolia-ecotone" +verify-sepolia-fjord: op-program-host op-program-client + ./scripts/run-compat.sh "sepolia-fjord" + verify-compat: verify-sepolia-delta verify-sepolia-ecotone verify-mainnet-genesis .PHONY: \ diff --git a/op-program/client/claim/validate.go b/op-program/client/claim/validate.go new file mode 100644 index 000000000000..05655208c6e7 --- /dev/null +++ b/op-program/client/claim/validate.go @@ -0,0 +1,34 @@ +package claim + +import ( + "context" + "errors" + "fmt" + + "github.com/ethereum/go-ethereum/log" + + "github.com/ethereum-optimism/optimism/op-service/eth" +) + +var ErrClaimNotValid = errors.New("invalid claim") + +type L2Source interface { + L2BlockRefByLabel(ctx context.Context, label eth.BlockLabel) (eth.L2BlockRef, error) + L2OutputRoot(uint64) (eth.Bytes32, error) +} + +func ValidateClaim(log log.Logger, l2ClaimBlockNum uint64, claimedOutputRoot eth.Bytes32, src L2Source) error { + l2Head, err := src.L2BlockRefByLabel(context.Background(), eth.Safe) + if err != nil { + return fmt.Errorf("cannot retrieve safe head: %w", err) + } + outputRoot, err := src.L2OutputRoot(min(l2ClaimBlockNum, l2Head.Number)) + if err != nil { + return fmt.Errorf("calculate L2 output root: %w", err) + } + log.Info("Validating claim", "head", l2Head, "output", outputRoot, "claim", claimedOutputRoot) + if claimedOutputRoot != outputRoot { + return fmt.Errorf("%w: claim: %v actual: %v", ErrClaimNotValid, claimedOutputRoot, outputRoot) + } + return nil +} diff --git a/op-program/client/claim/validate_test.go b/op-program/client/claim/validate_test.go new file mode 100644 index 000000000000..c8a9b263eba5 --- /dev/null +++ b/op-program/client/claim/validate_test.go @@ -0,0 +1,113 @@ +package claim + +import ( + "context" + "errors" + "testing" + + "github.com/stretchr/testify/require" + + "github.com/ethereum/go-ethereum/log" + + "github.com/ethereum-optimism/optimism/op-service/eth" + "github.com/ethereum-optimism/optimism/op-service/testlog" +) + +type mockL2 struct { + safeL2 eth.L2BlockRef + safeL2Err error + + outputRoot eth.Bytes32 + outputRootErr error + + requestedOutputRoot uint64 +} + +func (m *mockL2) L2BlockRefByLabel(ctx context.Context, label eth.BlockLabel) (eth.L2BlockRef, error) { + if label != eth.Safe { + panic("unexpected usage") + } + if m.safeL2Err != nil { + return eth.L2BlockRef{}, m.safeL2Err + } + return m.safeL2, nil +} + +func (m *mockL2) L2OutputRoot(u uint64) (eth.Bytes32, error) { + m.requestedOutputRoot = u + if m.outputRootErr != nil { + return eth.Bytes32{}, m.outputRootErr + } + return m.outputRoot, nil +} + +var _ L2Source = (*mockL2)(nil) + +func TestValidateClaim(t *testing.T) { + t.Run("Valid", func(t *testing.T) { + expected := eth.Bytes32{0x11} + l2 := &mockL2{ + outputRoot: expected, + } + logger := testlog.Logger(t, log.LevelError) + err := ValidateClaim(logger, uint64(0), expected, l2) + require.NoError(t, err) + }) + + t.Run("Valid-PriorToSafeHead", func(t *testing.T) { + expected := eth.Bytes32{0x11} + l2 := &mockL2{ + outputRoot: expected, + safeL2: eth.L2BlockRef{ + Number: 10, + }, + } + logger := testlog.Logger(t, log.LevelError) + err := ValidateClaim(logger, uint64(20), expected, l2) + require.NoError(t, err) + require.Equal(t, uint64(10), l2.requestedOutputRoot) + }) + + t.Run("Invalid", func(t *testing.T) { + l2 := &mockL2{ + outputRoot: eth.Bytes32{0x22}, + } + logger := testlog.Logger(t, log.LevelError) + err := ValidateClaim(logger, uint64(0), eth.Bytes32{0x11}, l2) + require.ErrorIs(t, err, ErrClaimNotValid) + }) + + t.Run("Invalid-PriorToSafeHead", func(t *testing.T) { + l2 := &mockL2{ + outputRoot: eth.Bytes32{0x22}, + safeL2: eth.L2BlockRef{Number: 10}, + } + logger := testlog.Logger(t, log.LevelError) + err := ValidateClaim(logger, uint64(20), eth.Bytes32{0x55}, l2) + require.ErrorIs(t, err, ErrClaimNotValid) + require.Equal(t, uint64(10), l2.requestedOutputRoot) + }) + + t.Run("Error-safe-head", func(t *testing.T) { + expectedErr := errors.New("boom") + l2 := &mockL2{ + outputRoot: eth.Bytes32{0x11}, + safeL2: eth.L2BlockRef{Number: 10}, + safeL2Err: expectedErr, + } + logger := testlog.Logger(t, log.LevelError) + err := ValidateClaim(logger, uint64(0), eth.Bytes32{0x11}, l2) + require.ErrorIs(t, err, expectedErr) + }) + t.Run("Error-output-root", func(t *testing.T) { + expectedErr := errors.New("boom") + l2 := &mockL2{ + outputRoot: eth.Bytes32{0x11}, + outputRootErr: expectedErr, + safeL2: eth.L2BlockRef{Number: 10}, + } + logger := testlog.Logger(t, log.LevelError) + err := ValidateClaim(logger, uint64(0), eth.Bytes32{0x11}, l2) + require.ErrorIs(t, err, expectedErr) + }) +} diff --git a/op-program/client/driver/driver.go b/op-program/client/driver/driver.go index 056e9922b524..fc232c5fcd43 100644 --- a/op-program/client/driver/driver.go +++ b/op-program/client/driver/driver.go @@ -3,95 +3,92 @@ package driver import ( "context" "errors" - "fmt" - "io" + "github.com/ethereum/go-ethereum/log" + + altda "github.com/ethereum-optimism/optimism/op-alt-da" "github.com/ethereum-optimism/optimism/op-node/metrics" - "github.com/ethereum-optimism/optimism/op-node/node/safedb" "github.com/ethereum-optimism/optimism/op-node/rollup" "github.com/ethereum-optimism/optimism/op-node/rollup/derive" + "github.com/ethereum-optimism/optimism/op-node/rollup/engine" + "github.com/ethereum-optimism/optimism/op-node/rollup/event" "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/go-ethereum/log" ) -var ErrClaimNotValid = errors.New("invalid claim") - -type Derivation interface { - Step(ctx context.Context) error +type EndCondition interface { + Closing() bool + Result() error } -type EngineState interface { - SafeL2Head() eth.L2BlockRef -} +type Driver struct { + logger log.Logger -type L2Source interface { - derive.Engine - L2OutputRoot(uint64) (eth.Bytes32, error) -} + events []event.Event -type Driver struct { - logger log.Logger - pipeline Derivation - engine EngineState - l2OutputRoot func(uint64) (eth.Bytes32, error) - targetBlockNum uint64 + end EndCondition + deriver event.Deriver } -func NewDriver(logger log.Logger, cfg *rollup.Config, l1Source derive.L1Fetcher, l1BlobsSource derive.L1BlobsFetcher, l2Source L2Source, targetBlockNum uint64) *Driver { - engine := derive.NewEngineController(l2Source, logger, metrics.NoopMetrics, cfg, sync.CLSync, nil) - pipeline := derive.NewDerivationPipeline(logger, cfg, l1Source, l1BlobsSource, plasma.Disabled, l2Source, engine, metrics.NoopMetrics, &sync.Config{}, safedb.Disabled) - pipeline.Reset() - return &Driver{ +func NewDriver(logger log.Logger, cfg *rollup.Config, l1Source derive.L1Fetcher, + l1BlobsSource derive.L1BlobsFetcher, l2Source engine.Engine, targetBlockNum uint64) *Driver { + + d := &Driver{ + logger: logger, + } + + pipeline := derive.NewDerivationPipeline(logger, cfg, l1Source, l1BlobsSource, altda.Disabled, l2Source, metrics.NoopMetrics) + pipelineDeriver := derive.NewPipelineDeriver(context.Background(), pipeline) + pipelineDeriver.AttachEmitter(d) + + ec := engine.NewEngineController(l2Source, logger, metrics.NoopMetrics, cfg, &sync.Config{SyncMode: sync.CLSync}, d) + engineDeriv := engine.NewEngDeriver(logger, context.Background(), cfg, metrics.NoopMetrics, ec) + engineDeriv.AttachEmitter(d) + syncCfg := &sync.Config{SyncMode: sync.CLSync} + engResetDeriv := engine.NewEngineResetDeriver(context.Background(), logger, cfg, l1Source, l2Source, syncCfg) + engResetDeriv.AttachEmitter(d) + + prog := &ProgramDeriver{ logger: logger, - pipeline: pipeline, - engine: engine, - l2OutputRoot: l2Source.L2OutputRoot, + Emitter: d, + closing: false, + result: nil, targetBlockNum: targetBlockNum, } -} -// Step runs the next step of the derivation pipeline. -// Returns nil if there are further steps to be performed -// Returns io.EOF if the derivation completed successfully -// Returns a non-EOF error if the derivation failed -func (d *Driver) Step(ctx context.Context) error { - if err := d.pipeline.Step(ctx); errors.Is(err, io.EOF) { - d.logger.Info("Derivation complete: reached L1 head", "head", d.engine.SafeL2Head()) - return io.EOF - } else if errors.Is(err, derive.NotEnoughData) { - head := d.engine.SafeL2Head() - if head.Number >= d.targetBlockNum { - d.logger.Info("Derivation complete: reached L2 block", "head", head) - return io.EOF - } - d.logger.Debug("Data is lacking") - return nil - } else if errors.Is(err, derive.ErrTemporary) { - // While most temporary errors are due to requests for external data failing which can't happen, - // they may also be returned due to other events like channels timing out so need to be handled - d.logger.Warn("Temporary error in derivation", "err", err) - return nil - } else if err != nil { - return fmt.Errorf("pipeline err: %w", err) + d.deriver = &event.DeriverMux{ + prog, + engineDeriv, + pipelineDeriver, + engResetDeriv, } - return nil -} + d.end = prog -func (d *Driver) SafeHead() eth.L2BlockRef { - return d.engine.SafeL2Head() + return d } -func (d *Driver) ValidateClaim(l2ClaimBlockNum uint64, claimedOutputRoot eth.Bytes32) error { - l2Head := d.SafeHead() - outputRoot, err := d.l2OutputRoot(min(l2ClaimBlockNum, l2Head.Number)) - if err != nil { - return fmt.Errorf("calculate L2 output root: %w", err) +func (d *Driver) Emit(ev event.Event) { + if d.end.Closing() { + return } - d.logger.Info("Validating claim", "head", l2Head, "output", outputRoot, "claim", claimedOutputRoot) - if claimedOutputRoot != outputRoot { - return fmt.Errorf("%w: claim: %v actual: %v", ErrClaimNotValid, claimedOutputRoot, outputRoot) + d.events = append(d.events, ev) +} + +var ExhaustErr = errors.New("exhausted events before completing program") + +func (d *Driver) RunComplete() error { + // Initial reset + d.Emit(engine.ResetEngineRequestEvent{}) + + for !d.end.Closing() { + if len(d.events) == 0 { + return ExhaustErr + } + if len(d.events) > 10000 { // sanity check, in case of bugs. Better than going OOM. + return errors.New("way too many events queued up, something is wrong") + } + ev := d.events[0] + d.events = d.events[1:] + d.deriver.OnEvent(ev) } - return nil + return d.end.Result() } diff --git a/op-program/client/driver/driver_test.go b/op-program/client/driver/driver_test.go index 03cda64101ff..2f1249aff6a4 100644 --- a/op-program/client/driver/driver_test.go +++ b/op-program/client/driver/driver_test.go @@ -1,156 +1,111 @@ package driver import ( - "context" "errors" - "fmt" - "io" "testing" - "github.com/ethereum-optimism/optimism/op-node/rollup/derive" - "github.com/ethereum-optimism/optimism/op-service/eth" - "github.com/ethereum-optimism/optimism/op-service/testlog" - "github.com/ethereum/go-ethereum/log" "github.com/stretchr/testify/require" -) - -func TestDerivationComplete(t *testing.T) { - driver := createDriver(t, fmt.Errorf("derivation complete: %w", io.EOF)) - err := driver.Step(context.Background()) - require.ErrorIs(t, err, io.EOF) -} -func TestTemporaryError(t *testing.T) { - driver := createDriver(t, fmt.Errorf("whoopsie: %w", derive.ErrTemporary)) - err := driver.Step(context.Background()) - require.NoError(t, err, "should allow derivation to continue after temporary error") -} + "github.com/ethereum/go-ethereum/log" -func TestNotEnoughDataError(t *testing.T) { - driver := createDriver(t, fmt.Errorf("idk: %w", derive.NotEnoughData)) - err := driver.Step(context.Background()) - require.NoError(t, err) -} + "github.com/ethereum-optimism/optimism/op-node/rollup/event" + "github.com/ethereum-optimism/optimism/op-service/testlog" +) -func TestGenericError(t *testing.T) { - expected := errors.New("boom") - driver := createDriver(t, expected) - err := driver.Step(context.Background()) - require.ErrorIs(t, err, expected) +type fakeEnd struct { + closing bool + result error } -func TestTargetBlock(t *testing.T) { - t.Run("Reached", func(t *testing.T) { - driver := createDriverWithNextBlock(t, derive.NotEnoughData, 1000) - driver.targetBlockNum = 1000 - err := driver.Step(context.Background()) - require.ErrorIs(t, err, io.EOF) - }) - - t.Run("Exceeded", func(t *testing.T) { - driver := createDriverWithNextBlock(t, derive.NotEnoughData, 1000) - driver.targetBlockNum = 500 - err := driver.Step(context.Background()) - require.ErrorIs(t, err, io.EOF) - }) - - t.Run("NotYetReached", func(t *testing.T) { - driver := createDriverWithNextBlock(t, derive.NotEnoughData, 1000) - driver.targetBlockNum = 1001 - err := driver.Step(context.Background()) - // No error to indicate derivation should continue - require.NoError(t, err) - }) +func (d *fakeEnd) Closing() bool { + return d.closing } -func TestNoError(t *testing.T) { - driver := createDriver(t, nil) - err := driver.Step(context.Background()) - require.NoError(t, err) +func (d *fakeEnd) Result() error { + return d.result } -func TestValidateClaim(t *testing.T) { - t.Run("Valid", func(t *testing.T) { - driver := createDriver(t, io.EOF) - expected := eth.Bytes32{0x11} - driver.l2OutputRoot = func(_ uint64) (eth.Bytes32, error) { - return expected, nil +func TestDriver(t *testing.T) { + newTestDriver := func(t *testing.T, onEvent func(d *Driver, end *fakeEnd, ev event.Event)) *Driver { + logger := testlog.Logger(t, log.LevelInfo) + end := &fakeEnd{} + d := &Driver{ + logger: logger, + end: end, } - err := driver.ValidateClaim(uint64(0), expected) - require.NoError(t, err) - }) + d.deriver = event.DeriverFunc(func(ev event.Event) bool { + onEvent(d, end, ev) + return true + }) + return d + } - t.Run("Valid-PriorToSafeHead", func(t *testing.T) { - driver := createDriverWithNextBlock(t, io.EOF, 10) - expected := eth.Bytes32{0x11} - requestedOutputRoot := uint64(0) - driver.l2OutputRoot = func(blockNum uint64) (eth.Bytes32, error) { - requestedOutputRoot = blockNum - return expected, nil - } - err := driver.ValidateClaim(uint64(20), expected) - require.NoError(t, err) - require.Equal(t, uint64(10), requestedOutputRoot) + t.Run("insta complete", func(t *testing.T) { + d := newTestDriver(t, func(d *Driver, end *fakeEnd, ev event.Event) { + end.closing = true + }) + require.NoError(t, d.RunComplete()) }) - t.Run("Invalid", func(t *testing.T) { - driver := createDriver(t, io.EOF) - driver.l2OutputRoot = func(_ uint64) (eth.Bytes32, error) { - return eth.Bytes32{0x22}, nil - } - err := driver.ValidateClaim(uint64(0), eth.Bytes32{0x11}) - require.ErrorIs(t, err, ErrClaimNotValid) + t.Run("insta error", func(t *testing.T) { + mockErr := errors.New("mock error") + d := newTestDriver(t, func(d *Driver, end *fakeEnd, ev event.Event) { + end.closing = true + end.result = mockErr + }) + require.ErrorIs(t, mockErr, d.RunComplete()) }) - t.Run("Invalid-PriorToSafeHead", func(t *testing.T) { - driver := createDriverWithNextBlock(t, io.EOF, 10) - expected := eth.Bytes32{0x11} - requestedOutputRoot := uint64(0) - driver.l2OutputRoot = func(blockNum uint64) (eth.Bytes32, error) { - requestedOutputRoot = blockNum - return expected, nil - } - err := driver.ValidateClaim(uint64(20), eth.Bytes32{0x55}) - require.ErrorIs(t, err, ErrClaimNotValid) - require.Equal(t, uint64(10), requestedOutputRoot) + t.Run("success after a few events", func(t *testing.T) { + count := 0 + d := newTestDriver(t, func(d *Driver, end *fakeEnd, ev event.Event) { + if count > 3 { + end.closing = true + return + } + count += 1 + d.Emit(TestEvent{}) + }) + require.NoError(t, d.RunComplete()) }) - t.Run("Error", func(t *testing.T) { - driver := createDriver(t, io.EOF) - expectedErr := errors.New("boom") - driver.l2OutputRoot = func(_ uint64) (eth.Bytes32, error) { - return eth.Bytes32{}, expectedErr - } - err := driver.ValidateClaim(uint64(0), eth.Bytes32{0x11}) - require.ErrorIs(t, err, expectedErr) + t.Run("error after a few events", func(t *testing.T) { + count := 0 + mockErr := errors.New("mock error") + d := newTestDriver(t, func(d *Driver, end *fakeEnd, ev event.Event) { + if count > 3 { + end.closing = true + end.result = mockErr + return + } + count += 1 + d.Emit(TestEvent{}) + }) + require.ErrorIs(t, mockErr, d.RunComplete()) }) -} - -func createDriver(t *testing.T, derivationResult error) *Driver { - return createDriverWithNextBlock(t, derivationResult, 0) -} - -func createDriverWithNextBlock(t *testing.T, derivationResult error, nextBlockNum uint64) *Driver { - derivation := &stubDerivation{nextErr: derivationResult, nextBlockNum: nextBlockNum} - return &Driver{ - logger: testlog.Logger(t, log.LevelDebug), - pipeline: derivation, - engine: derivation, - targetBlockNum: 1_000_000, - } -} - -type stubDerivation struct { - nextErr error - nextBlockNum uint64 -} -func (s stubDerivation) Step(ctx context.Context) error { - return s.nextErr -} + t.Run("exhaust events", func(t *testing.T) { + count := 0 + d := newTestDriver(t, func(d *Driver, end *fakeEnd, ev event.Event) { + if count < 3 { // stop generating events after a while, without changing end condition + d.Emit(TestEvent{}) + } + count += 1 + }) + require.ErrorIs(t, ExhaustErr, d.RunComplete()) + }) -func (s stubDerivation) SafeL2Head() eth.L2BlockRef { - return eth.L2BlockRef{ - Number: s.nextBlockNum, - } + t.Run("queued events", func(t *testing.T) { + count := 0 + d := newTestDriver(t, func(d *Driver, end *fakeEnd, ev event.Event) { + if count < 3 { + d.Emit(TestEvent{}) + d.Emit(TestEvent{}) + } + count += 1 + }) + require.ErrorIs(t, ExhaustErr, d.RunComplete()) + // add 1 for initial event that RunComplete fires + require.Equal(t, 1+3*2, count, "must have queued up 2 events 3 times") + }) } diff --git a/op-program/client/driver/program.go b/op-program/client/driver/program.go new file mode 100644 index 000000000000..0ef36f8f6a47 --- /dev/null +++ b/op-program/client/driver/program.go @@ -0,0 +1,90 @@ +package driver + +import ( + "fmt" + + "github.com/ethereum/go-ethereum/log" + + "github.com/ethereum-optimism/optimism/op-node/rollup" + "github.com/ethereum-optimism/optimism/op-node/rollup/derive" + "github.com/ethereum-optimism/optimism/op-node/rollup/engine" + "github.com/ethereum-optimism/optimism/op-node/rollup/event" +) + +// ProgramDeriver expresses how engine and derivation events are +// translated and monitored to execute the pure L1 to L2 state transition. +// +// The ProgramDeriver stops at the target block number or with an error result. +type ProgramDeriver struct { + logger log.Logger + + Emitter event.Emitter + + closing bool + result error + targetBlockNum uint64 +} + +func (d *ProgramDeriver) Closing() bool { + return d.closing +} + +func (d *ProgramDeriver) Result() error { + return d.result +} + +func (d *ProgramDeriver) OnEvent(ev event.Event) bool { + switch x := ev.(type) { + case engine.EngineResetConfirmedEvent: + d.Emitter.Emit(derive.ConfirmPipelineResetEvent{}) + // After initial reset we can request the pending-safe block, + // where attributes will be generated on top of. + d.Emitter.Emit(engine.PendingSafeRequestEvent{}) + case engine.PendingSafeUpdateEvent: + d.Emitter.Emit(derive.PipelineStepEvent{PendingSafe: x.PendingSafe}) + case derive.DeriverMoreEvent: + d.Emitter.Emit(engine.PendingSafeRequestEvent{}) + case derive.DerivedAttributesEvent: + // Allow new attributes to be generated. + // We will process the current attributes synchronously, + // triggering a single PendingSafeUpdateEvent or InvalidPayloadAttributesEvent, + // to continue derivation from. + d.Emitter.Emit(derive.ConfirmReceivedAttributesEvent{}) + // No need to queue the attributes, since there is no unsafe chain to consolidate against, + // and no temporary-error retry to perform on block processing. + d.Emitter.Emit(engine.BuildStartEvent{Attributes: x.Attributes}) + case engine.InvalidPayloadAttributesEvent: + // If a set of attributes was invalid, then we drop the attributes, + // and continue with the next. + d.Emitter.Emit(engine.PendingSafeRequestEvent{}) + case engine.ForkchoiceUpdateEvent: + if x.SafeL2Head.Number >= d.targetBlockNum { + d.logger.Info("Derivation complete: reached L2 block", "head", x.SafeL2Head) + d.closing = true + } + case derive.DeriverIdleEvent: + // Not enough data to reach target + d.closing = true + d.logger.Info("Derivation complete: no further data to process") + case rollup.ResetEvent: + d.closing = true + d.result = fmt.Errorf("unexpected reset error: %w", x.Err) + case rollup.L1TemporaryErrorEvent: + d.closing = true + d.result = fmt.Errorf("unexpected L1 error: %w", x.Err) + case rollup.EngineTemporaryErrorEvent: + // (Legacy case): While most temporary errors are due to requests for external data failing which can't happen, + // they may also be returned due to other events like channels timing out so need to be handled + d.logger.Warn("Temporary error in derivation", "err", x.Err) + d.Emitter.Emit(engine.PendingSafeRequestEvent{}) + case rollup.CriticalErrorEvent: + d.closing = true + d.result = x.Err + default: + // Other events can be ignored safely. + // They are broadcast, but only consumed by the other derivers, + // or do not affect the state-transition. + return false + } + return true +} diff --git a/op-program/client/driver/program_test.go b/op-program/client/driver/program_test.go new file mode 100644 index 000000000000..4c9941d754b4 --- /dev/null +++ b/op-program/client/driver/program_test.go @@ -0,0 +1,161 @@ +package driver + +import ( + "errors" + "testing" + + "github.com/stretchr/testify/require" + + "github.com/ethereum/go-ethereum/log" + + "github.com/ethereum-optimism/optimism/op-node/rollup" + "github.com/ethereum-optimism/optimism/op-node/rollup/derive" + "github.com/ethereum-optimism/optimism/op-node/rollup/engine" + "github.com/ethereum-optimism/optimism/op-service/eth" + "github.com/ethereum-optimism/optimism/op-service/testlog" + "github.com/ethereum-optimism/optimism/op-service/testutils" +) + +func TestProgramDeriver(t *testing.T) { + newProgram := func(t *testing.T, target uint64) (*ProgramDeriver, *testutils.MockEmitter) { + m := &testutils.MockEmitter{} + logger := testlog.Logger(t, log.LevelInfo) + prog := &ProgramDeriver{ + logger: logger, + Emitter: m, + targetBlockNum: target, + } + return prog, m + } + // step 0 assumption: engine performs reset upon ResetEngineRequestEvent. + // step 1: engine completes reset + t.Run("engine reset confirmed", func(t *testing.T) { + p, m := newProgram(t, 1000) + m.ExpectOnce(derive.ConfirmPipelineResetEvent{}) + m.ExpectOnce(engine.PendingSafeRequestEvent{}) + p.OnEvent(engine.EngineResetConfirmedEvent{}) + m.AssertExpectations(t) + require.False(t, p.closing) + require.NoError(t, p.result) + require.False(t, p.closing) + require.NoError(t, p.result) + }) + // step 2: more derivation work, triggered when pending safe data is published + t.Run("pending safe update", func(t *testing.T) { + p, m := newProgram(t, 1000) + ref := eth.L2BlockRef{Number: 123} + m.ExpectOnce(derive.PipelineStepEvent{PendingSafe: ref}) + p.OnEvent(engine.PendingSafeUpdateEvent{PendingSafe: ref}) + m.AssertExpectations(t) + require.False(t, p.closing) + require.NoError(t, p.result) + }) + // step 3: if no attributes are generated, loop back to derive more. + t.Run("deriver more", func(t *testing.T) { + p, m := newProgram(t, 1000) + m.ExpectOnce(engine.PendingSafeRequestEvent{}) + p.OnEvent(derive.DeriverMoreEvent{}) + m.AssertExpectations(t) + require.False(t, p.closing) + require.NoError(t, p.result) + }) + // step 4: if attributes are derived, pass them to the engine. + t.Run("derived attributes", func(t *testing.T) { + p, m := newProgram(t, 1000) + attrib := &derive.AttributesWithParent{Parent: eth.L2BlockRef{Number: 123}} + m.ExpectOnce(derive.ConfirmReceivedAttributesEvent{}) + m.ExpectOnce(engine.BuildStartEvent{Attributes: attrib}) + p.OnEvent(derive.DerivedAttributesEvent{Attributes: attrib}) + m.AssertExpectations(t) + require.False(t, p.closing) + require.NoError(t, p.result) + }) + // step 5: if attributes were invalid, continue with derivation for new attributes. + t.Run("invalid payload", func(t *testing.T) { + p, m := newProgram(t, 1000) + m.ExpectOnce(engine.PendingSafeRequestEvent{}) + p.OnEvent(engine.InvalidPayloadAttributesEvent{Attributes: &derive.AttributesWithParent{}}) + m.AssertExpectations(t) + require.False(t, p.closing) + require.NoError(t, p.result) + }) + // step 6: if attributes were valid, we may have reached the target. + // Or back to step 2 (PendingSafeUpdateEvent) + t.Run("forkchoice update", func(t *testing.T) { + t.Run("surpassed", func(t *testing.T) { + p, m := newProgram(t, 42) + p.OnEvent(engine.ForkchoiceUpdateEvent{SafeL2Head: eth.L2BlockRef{Number: 42 + 1}}) + m.AssertExpectations(t) + require.True(t, p.closing) + require.NoError(t, p.result) + }) + t.Run("completed", func(t *testing.T) { + p, m := newProgram(t, 42) + p.OnEvent(engine.ForkchoiceUpdateEvent{SafeL2Head: eth.L2BlockRef{Number: 42}}) + m.AssertExpectations(t) + require.True(t, p.closing) + require.NoError(t, p.result) + }) + t.Run("incomplete", func(t *testing.T) { + p, m := newProgram(t, 42) + p.OnEvent(engine.ForkchoiceUpdateEvent{SafeL2Head: eth.L2BlockRef{Number: 42 - 1}}) + m.AssertExpectations(t) + require.False(t, p.closing) + require.NoError(t, p.result) + }) + }) + // on exhaustion of input data: stop without error + t.Run("deriver idle", func(t *testing.T) { + p, m := newProgram(t, 1000) + p.OnEvent(derive.DeriverIdleEvent{}) + m.AssertExpectations(t) + require.True(t, p.closing) + require.Nil(t, p.result) + }) + // on inconsistent chain data: stop with error + t.Run("reset event", func(t *testing.T) { + p, m := newProgram(t, 1000) + p.OnEvent(rollup.ResetEvent{Err: errors.New("reset test err")}) + m.AssertExpectations(t) + require.True(t, p.closing) + require.NotNil(t, p.result) + }) + // on L1 temporary error: stop with error + t.Run("L1 temporary error event", func(t *testing.T) { + p, m := newProgram(t, 1000) + p.OnEvent(rollup.L1TemporaryErrorEvent{Err: errors.New("temp test err")}) + m.AssertExpectations(t) + require.True(t, p.closing) + require.NotNil(t, p.result) + }) + // on engine temporary error: continue derivation (because legacy, not all connection related) + t.Run("engine temp error event", func(t *testing.T) { + p, m := newProgram(t, 1000) + m.ExpectOnce(engine.PendingSafeRequestEvent{}) + p.OnEvent(rollup.EngineTemporaryErrorEvent{Err: errors.New("temp test err")}) + m.AssertExpectations(t) + require.False(t, p.closing) + require.NoError(t, p.result) + }) + // on critical error: stop + t.Run("critical error event", func(t *testing.T) { + p, m := newProgram(t, 1000) + p.OnEvent(rollup.ResetEvent{Err: errors.New("crit test err")}) + m.AssertExpectations(t) + require.True(t, p.closing) + require.NotNil(t, p.result) + }) + t.Run("unknown event", func(t *testing.T) { + p, m := newProgram(t, 1000) + p.OnEvent(TestEvent{}) + m.AssertExpectations(t) + require.False(t, p.closing) + require.NoError(t, p.result) + }) +} + +type TestEvent struct{} + +func (ev TestEvent) String() string { + return "test-event" +} diff --git a/op-program/client/l1/cache.go b/op-program/client/l1/cache.go index 5541779f9755..ab8154195ec2 100644 --- a/op-program/client/l1/cache.go +++ b/op-program/client/l1/cache.go @@ -95,12 +95,12 @@ func (o *CachingOracle) GetBlob(ref eth.L1BlockRef, blobHash eth.IndexedBlobHash return blob } -func (o *CachingOracle) Precompile(address common.Address, input []byte) ([]byte, bool) { +func (o *CachingOracle) Precompile(address common.Address, input []byte, requiredGas uint64) ([]byte, bool) { cacheKey := crypto.Keccak256Hash(append(address.Bytes(), input...)) if val, ok := o.pcmps.Get(cacheKey); ok { return val.result, val.ok } - res, ok := o.oracle.Precompile(address, input) + res, ok := o.oracle.Precompile(address, input, requiredGas) o.pcmps.Add(cacheKey, precompileResult{res, ok}) return res, ok } diff --git a/op-program/client/l1/cache_test.go b/op-program/client/l1/cache_test.go index 1c6da3ddeeab..f47481b47a26 100644 --- a/op-program/client/l1/cache_test.go +++ b/op-program/client/l1/cache_test.go @@ -1,6 +1,7 @@ package l1 import ( + "encoding/binary" "math/rand" "testing" @@ -99,18 +100,21 @@ func TestCachingOracle_Precompile(t *testing.T) { oracle := NewCachingOracle(stub) input := []byte{0x01, 0x02, 0x03, 0x04} + requiredGas := uint64(100) output := []byte{0x0a, 0x0b, 0x0c, 0x0d} addr := common.Address{0x1} + key := crypto.Keccak256Hash(append(append(addr.Bytes(), binary.BigEndian.AppendUint64(nil, requiredGas)...), input...)) + // Initial call retrieves from the stub - stub.PcmpResults[crypto.Keccak256Hash(append(addr.Bytes(), input...))] = output - actualResult, actualStatus := oracle.Precompile(addr, input) + stub.PcmpResults[key] = output + actualResult, actualStatus := oracle.Precompile(addr, input, requiredGas) require.True(t, actualStatus) require.EqualValues(t, output, actualResult) // Later calls should retrieve from cache - delete(stub.PcmpResults, crypto.Keccak256Hash(append(addr.Bytes(), input...))) - actualResult, actualStatus = oracle.Precompile(addr, input) + delete(stub.PcmpResults, key) + actualResult, actualStatus = oracle.Precompile(addr, input, requiredGas) require.True(t, actualStatus) require.EqualValues(t, output, actualResult) } diff --git a/op-program/client/l1/hints.go b/op-program/client/l1/hints.go index 0a1ceabaa956..1fcb77d761e0 100644 --- a/op-program/client/l1/hints.go +++ b/op-program/client/l1/hints.go @@ -13,6 +13,7 @@ const ( HintL1Receipts = "l1-receipts" HintL1Blob = "l1-blob" HintL1Precompile = "l1-precompile" + HintL1PrecompileV2 = "l1-precompile-v2" ) type BlockHeaderHint common.Hash @@ -54,3 +55,11 @@ var _ preimage.Hint = PrecompileHint{} func (l PrecompileHint) Hint() string { return HintL1Precompile + " " + hexutil.Encode(l) } + +type PrecompileHintV2 []byte + +var _ preimage.Hint = PrecompileHintV2{} + +func (l PrecompileHintV2) Hint() string { + return HintL1PrecompileV2 + " " + hexutil.Encode(l) +} diff --git a/op-program/client/l1/oracle.go b/op-program/client/l1/oracle.go index 7bec829c8b6c..4168099f7c01 100644 --- a/op-program/client/l1/oracle.go +++ b/op-program/client/l1/oracle.go @@ -29,7 +29,7 @@ type Oracle interface { GetBlob(ref eth.L1BlockRef, blobHash eth.IndexedBlobHash) *eth.Blob // Precompile retrieves the result and success indicator of a precompile call for the given input. - Precompile(precompileAddress common.Address, input []byte) ([]byte, bool) + Precompile(precompileAddress common.Address, input []byte, requiredGas uint64) ([]byte, bool) } // PreimageOracle implements Oracle using by interfacing with the pure preimage.Oracle @@ -119,9 +119,10 @@ func (p *PreimageOracle) GetBlob(ref eth.L1BlockRef, blobHash eth.IndexedBlobHas return &blob } -func (p *PreimageOracle) Precompile(address common.Address, input []byte) ([]byte, bool) { - hintBytes := append(address.Bytes(), input...) - p.hint.Hint(PrecompileHint(hintBytes)) +func (p *PreimageOracle) Precompile(address common.Address, input []byte, requiredGas uint64) ([]byte, bool) { + hintBytes := append(address.Bytes(), binary.BigEndian.AppendUint64(nil, requiredGas)...) + hintBytes = append(hintBytes, input...) + p.hint.Hint(PrecompileHintV2(hintBytes)) key := preimage.PrecompileKey(crypto.Keccak256Hash(hintBytes)) result := p.oracle.Get(key) if len(result) == 0 { // must contain at least the status code diff --git a/op-program/client/l1/test/stub_oracle.go b/op-program/client/l1/test/stub_oracle.go index 6c154b04ef5a..c4579fbe5595 100644 --- a/op-program/client/l1/test/stub_oracle.go +++ b/op-program/client/l1/test/stub_oracle.go @@ -1,6 +1,7 @@ package test import ( + "encoding/binary" "testing" "github.com/ethereum-optimism/optimism/op-service/eth" @@ -75,8 +76,10 @@ func (o StubOracle) GetBlob(ref eth.L1BlockRef, blobHash eth.IndexedBlobHash) *e return blob } -func (o StubOracle) Precompile(addr common.Address, input []byte) ([]byte, bool) { - result, ok := o.PcmpResults[crypto.Keccak256Hash(append(addr.Bytes(), input...))] +func (o StubOracle) Precompile(addr common.Address, input []byte, requiredGas uint64) ([]byte, bool) { + arg := append(addr.Bytes(), binary.BigEndian.AppendUint64(nil, requiredGas)...) + arg = append(arg, input...) + result, ok := o.PcmpResults[crypto.Keccak256Hash(arg)] if !ok { o.t.Fatalf("unknown kzg point evaluation %x", input) } diff --git a/op-program/client/l2/db.go b/op-program/client/l2/db.go index 018b79ed9356..4f901ac9304e 100644 --- a/op-program/client/l2/db.go +++ b/op-program/client/l2/db.go @@ -13,9 +13,7 @@ import ( var codePrefixedKeyLength = common.HashLength + len(rawdb.CodePrefix) -var ( - ErrInvalidKeyLength = errors.New("pre-images must be identified by 32-byte hash keys") -) +var ErrInvalidKeyLength = errors.New("pre-images must be identified by 32-byte hash keys") type OracleKeyValueStore struct { db ethdb.KeyValueStore @@ -74,7 +72,7 @@ func (o *OracleKeyValueStore) Delete(key []byte) error { panic("not supported") } -func (o *OracleKeyValueStore) Stat(property string) (string, error) { +func (o *OracleKeyValueStore) Stat() (string, error) { panic("not supported") } @@ -85,7 +83,3 @@ func (o *OracleKeyValueStore) NewIterator(prefix []byte, start []byte) ethdb.Ite func (o *OracleKeyValueStore) Compact(start []byte, limit []byte) error { panic("not supported") } - -func (o *OracleKeyValueStore) NewSnapshot() (ethdb.Snapshot, error) { - panic("not supported") -} diff --git a/op-program/client/l2/db_test.go b/op-program/client/l2/db_test.go index 00b70c810d73..f214c527b1c2 100644 --- a/op-program/client/l2/db_test.go +++ b/op-program/client/l2/db_test.go @@ -10,6 +10,7 @@ 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/tracing" "github.com/ethereum/go-ethereum/core/types" "github.com/ethereum/go-ethereum/crypto" "github.com/ethereum/go-ethereum/ethdb" @@ -130,12 +131,13 @@ func TestUpdateState(t *testing.T) { statedb, err := state.New(genesisBlock.Root(), state.NewDatabase(rawdb.NewDatabase(db)), nil) require.NoError(t, err) - statedb.SetBalance(userAccount, uint256.NewInt(50)) + statedb.MakeSinglethreaded() + statedb.SetBalance(userAccount, uint256.NewInt(50), tracing.BalanceChangeUnspecified) 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, uint256.NewInt(60)) + statedb.SetBalance(unknownAccount, uint256.NewInt(60), tracing.BalanceChangeUnspecified) require.Equal(t, uint256.NewInt(60), statedb.GetBalance(unknownAccount)) statedb.SetCode(codeAccount, []byte{1}) require.Equal(t, []byte{1}, statedb.GetCode(codeAccount)) @@ -148,6 +150,7 @@ func TestUpdateState(t *testing.T) { statedb, err = state.New(newRoot, state.NewDatabase(rawdb.NewDatabase(db)), nil) require.NoError(t, err) + statedb.MakeSinglethreaded() require.Equal(t, uint256.NewInt(50), statedb.GetBalance(userAccount)) require.Equal(t, uint64(5), statedb.GetNonce(userAccount)) require.Equal(t, uint256.NewInt(60), statedb.GetBalance(unknownAccount)) diff --git a/op-program/client/l2/engine_backend.go b/op-program/client/l2/engine_backend.go index 3880056e3376..ea5195893625 100644 --- a/op-program/client/l2/engine_backend.go +++ b/op-program/client/l2/engine_backend.go @@ -67,7 +67,7 @@ func NewOracleBackedL2Chain(logger log.Logger, oracle Oracle, precompileOracle e blocks: make(map[common.Hash]*types.Block), db: NewOracleBackedDB(oracle), vmCfg: vm.Config{ - OptimismPrecompileOverrides: engineapi.CreatePrecompileOverrides(precompileOracle), + PrecompileOverrides: engineapi.CreatePrecompileOverrides(precompileOracle), }, }, nil } @@ -170,7 +170,12 @@ func (o *OracleBackedL2Chain) Engine() consensus.Engine { } func (o *OracleBackedL2Chain) StateAt(root common.Hash) (*state.StateDB, error) { - return state.New(root, state.NewDatabase(rawdb.NewDatabase(o.db)), nil) + stateDB, err := state.New(root, state.NewDatabase(rawdb.NewDatabase(o.db)), nil) + if err != nil { + return nil, err + } + stateDB.MakeSinglethreaded() + return stateDB, nil } func (o *OracleBackedL2Chain) InsertBlockWithoutSetHead(block *types.Block) error { diff --git a/op-program/client/l2/engine_backend_test.go b/op-program/client/l2/engine_backend_test.go index 2e6922e77148..427f256d0a45 100644 --- a/op-program/client/l2/engine_backend_test.go +++ b/op-program/client/l2/engine_backend_test.go @@ -1,6 +1,7 @@ package l2 import ( + "encoding/binary" "math/big" "testing" @@ -40,6 +41,12 @@ var ( blobPrecompileReturnValue = common.FromHex("000000000000000000000000000000000000000000000000000000000000100073eda753299d7d483339d80809a1d80553bda402fffe5bfeffffffff00000001") ) +var ( + ecRecoverRequiredGas uint64 = 3000 + bn256PairingRequiredGas uint64 = 113000 + kzgRequiredGas uint64 = 50_000 +) + func TestInitialState(t *testing.T) { blocks, chain := setupOracleBackedChain(t, 5) head := blocks[5] @@ -200,28 +207,32 @@ func TestGetHeaderByNumber(t *testing.T) { func TestPrecompileOracle(t *testing.T) { tests := []struct { - name string - input []byte - target common.Address - result []byte + name string + input []byte + target common.Address + requiredGas uint64 + result []byte }{ { - name: "EcRecover", - input: ecRecoverInputData, - target: common.BytesToAddress([]byte{0x1}), - result: ecRecoverReturnValue, + name: "EcRecover", + input: ecRecoverInputData, + target: common.BytesToAddress([]byte{0x1}), + requiredGas: ecRecoverRequiredGas, + result: ecRecoverReturnValue, }, { - name: "Bn256Pairing", - input: bn256PairingInputData, - target: common.BytesToAddress([]byte{0x8}), - result: bn256PairingReturnValue, + name: "Bn256Pairing", + input: bn256PairingInputData, + target: common.BytesToAddress([]byte{0x8}), + requiredGas: bn256PairingRequiredGas, + result: bn256PairingReturnValue, }, { - name: "KZGPointEvaluation", - input: kzgInputData, - target: common.BytesToAddress([]byte{0xa}), - result: blobPrecompileReturnValue, + name: "KZGPointEvaluation", + input: kzgInputData, + target: common.BytesToAddress([]byte{0xa}), + requiredGas: kzgRequiredGas, + result: blobPrecompileReturnValue, }, } @@ -234,9 +245,11 @@ func TestPrecompileOracle(t *testing.T) { chainCfg, blocks, oracle := setupOracle(t, blockCount, headBlockNumber, true) head := blocks[headBlockNumber].Hash() stubOutput := eth.OutputV0{BlockHash: head} - precompileOracle := new(l2test.StubPrecompileOracle) + precompileOracle := l2test.NewStubPrecompileOracle(t) + arg := append(test.target.Bytes(), binary.BigEndian.AppendUint64(nil, test.requiredGas)...) + arg = append(arg, test.input...) precompileOracle.Results = map[common.Hash]l2test.PrecompileResult{ - crypto.Keccak256Hash(append(test.target.Bytes(), test.input...)): {Result: test.result, Ok: true}, + crypto.Keccak256Hash(arg): {Result: test.result, Ok: true}, } chain, err := NewOracleBackedL2Chain(logger, oracle, precompileOracle, chainCfg, common.Hash(eth.OutputRoot(&stubOutput))) require.NoError(t, err) @@ -265,7 +278,7 @@ func setupOracleBackedChainWithLowerHead(t *testing.T, blockCount int, headBlock chainCfg, blocks, oracle := setupOracle(t, blockCount, headBlockNumber, false) head := blocks[headBlockNumber].Hash() stubOutput := eth.OutputV0{BlockHash: head} - precompileOracle := new(l2test.StubPrecompileOracle) + precompileOracle := l2test.NewStubPrecompileOracle(t) chain, err := NewOracleBackedL2Chain(logger, oracle, precompileOracle, chainCfg, common.Hash(eth.OutputRoot(&stubOutput))) require.NoError(t, err) return blocks, chain @@ -273,14 +286,22 @@ func setupOracleBackedChainWithLowerHead(t *testing.T, blockCount int, headBlock func setupOracle(t *testing.T, blockCount int, headBlockNumber int, enableEcotone bool) (*params.ChainConfig, []*types.Block, *l2test.StubBlockOracle) { deployConfig := &genesis.DeployConfig{ - L1ChainID: 900, - L2ChainID: 901, - L2BlockTime: 2, - FundDevAccounts: true, - L2GenesisBlockGasLimit: 30_000_000, - // Arbitrary non-zero difficulty in genesis. - // This is slightly weird for a chain starting post-merge but it happens so need to make sure it works - L2GenesisBlockDifficulty: (*hexutil.Big)(big.NewInt(100)), + L2InitializationConfig: genesis.L2InitializationConfig{ + DevDeployConfig: genesis.DevDeployConfig{ + FundDevAccounts: true, + }, + L2GenesisBlockDeployConfig: genesis.L2GenesisBlockDeployConfig{ + L2GenesisBlockGasLimit: 30_000_000, + // Arbitrary non-zero difficulty in genesis. + // This is slightly weird for a chain starting post-merge but it happens so need to make sure it works + L2GenesisBlockDifficulty: (*hexutil.Big)(big.NewInt(100)), + }, + L2CoreDeployConfig: genesis.L2CoreDeployConfig{ + L1ChainID: 900, + L2ChainID: 901, + L2BlockTime: 2, + }, + }, } if enableEcotone { ts := hexutil.Uint64(0) @@ -291,7 +312,7 @@ func setupOracle(t *testing.T, blockCount int, headBlockNumber int, enableEcoton } l1Genesis, err := genesis.NewL1Genesis(deployConfig) require.NoError(t, err) - l2Genesis, err := genesis.NewL2Genesis(deployConfig, l1Genesis.ToBlock()) + l2Genesis, err := genesis.NewL2Genesis(deployConfig, l1Genesis.ToBlock().Header()) require.NoError(t, err) l2Genesis.Alloc[fundedAddress] = types.Account{ diff --git a/op-program/client/l2/engine_test.go b/op-program/client/l2/engine_test.go index b96db24d0cc9..28c9f8006dce 100644 --- a/op-program/client/l2/engine_test.go +++ b/op-program/client/l2/engine_test.go @@ -5,9 +5,8 @@ import ( "math/big" "testing" - "github.com/ethereum-optimism/optimism/op-node/chaincfg" - "github.com/ethereum-optimism/optimism/op-node/rollup/derive" - "github.com/ethereum-optimism/optimism/op-service/eth" + "github.com/stretchr/testify/require" + "github.com/ethereum/go-ethereum/common" "github.com/ethereum/go-ethereum/consensus" "github.com/ethereum/go-ethereum/core/state" @@ -15,11 +14,15 @@ import ( "github.com/ethereum/go-ethereum/core/vm" "github.com/ethereum/go-ethereum/params" "github.com/ethereum/go-ethereum/trie" - "github.com/stretchr/testify/require" + + "github.com/ethereum-optimism/optimism/op-node/chaincfg" + "github.com/ethereum-optimism/optimism/op-node/rollup/derive" + "github.com/ethereum-optimism/optimism/op-node/rollup/engine" + "github.com/ethereum-optimism/optimism/op-service/eth" ) // Should implement derive.Engine -var _ derive.Engine = (*OracleEngine)(nil) +var _ engine.Engine = (*OracleEngine)(nil) func TestPayloadByHash(t *testing.T) { ctx := context.Background() @@ -176,7 +179,10 @@ func createL2Block(t *testing.T, number int) *types.Block { Number: big.NewInt(int64(number)), BaseFee: big.NewInt(7), } - return types.NewBlock(header, []*types.Transaction{types.NewTx(tx)}, nil, nil, trie.NewStackTrie(nil)) + body := &types.Body{ + Transactions: []*types.Transaction{types.NewTx(tx)}, + } + return types.NewBlock(header, body, nil, trie.NewStackTrie(nil)) } type stubEngineBackend struct { diff --git a/op-program/client/l2/engineapi/block_processor.go b/op-program/client/l2/engineapi/block_processor.go index d81212db206c..2e6cc5beade4 100644 --- a/op-program/client/l2/engineapi/block_processor.go +++ b/op-program/client/l2/engineapi/block_processor.go @@ -86,10 +86,10 @@ func NewBlockProcessorFromHeader(provider BlockDataProvider, h *types.Header) (* context := core.NewEVMBlockContext(header, provider, nil, provider.Config(), statedb) // NOTE: Unlikely to be needed for the beacon block root, but we setup any precompile overrides anyways for forwards-compatibility var precompileOverrides vm.PrecompileOverrides - if vmConfig := provider.GetVMConfig(); vmConfig != nil && vmConfig.OptimismPrecompileOverrides != nil { - precompileOverrides = vmConfig.OptimismPrecompileOverrides + if vmConfig := provider.GetVMConfig(); vmConfig != nil && vmConfig.PrecompileOverrides != nil { + precompileOverrides = vmConfig.PrecompileOverrides } - vmenv := vm.NewEVM(context, vm.TxContext{}, statedb, provider.Config(), vm.Config{OptimismPrecompileOverrides: precompileOverrides}) + vmenv := vm.NewEVM(context, vm.TxContext{}, statedb, provider.Config(), vm.Config{PrecompileOverrides: precompileOverrides}) core.ProcessBeaconBlockRoot(*header.ParentBeaconRoot, vmenv, statedb) } return &BlockProcessor{ @@ -124,7 +124,11 @@ func (b *BlockProcessor) AddTx(tx *types.Transaction) error { } func (b *BlockProcessor) Assemble() (*types.Block, error) { - return b.dataProvider.Engine().FinalizeAndAssemble(b.dataProvider, b.header, b.state, b.transactions, nil, b.receipts, nil) + body := types.Body{ + Transactions: b.transactions, + } + + return b.dataProvider.Engine().FinalizeAndAssemble(b.dataProvider, b.header, b.state, &body, b.receipts) } func (b *BlockProcessor) Commit() error { diff --git a/op-program/client/l2/engineapi/precompiles.go b/op-program/client/l2/engineapi/precompiles.go index 5ef77663d5bb..b8ada60dd70a 100644 --- a/op-program/client/l2/engineapi/precompiles.go +++ b/op-program/client/l2/engineapi/precompiles.go @@ -46,21 +46,24 @@ var ( // PrecompileOracle defines the high-level API used to retrieve the result of a precompile call // The caller is expected to validate the input to the precompile call type PrecompileOracle interface { - Precompile(address common.Address, input []byte) ([]byte, bool) + Precompile(address common.Address, input []byte, requiredGas uint64) ([]byte, bool) } func CreatePrecompileOverrides(precompileOracle PrecompileOracle) vm.PrecompileOverrides { - return func(rules params.Rules, orig vm.PrecompiledContract, address common.Address) (vm.PrecompiledContract, bool) { + return func(rules params.Rules, orig vm.PrecompiledContract, address common.Address) vm.PrecompiledContract { + if orig == nil { // Only override existing contracts. Never introduce a precompile that is not there. + return nil + } // NOTE: Ignoring chain rules for now. We assume that precompile behavior won't change for the foreseeable future switch address { case ecrecoverPrecompileAddress: - return &ecrecoverOracle{Orig: orig, Oracle: precompileOracle}, true + return &ecrecoverOracle{Orig: orig, Oracle: precompileOracle} case bn256PairingPrecompileAddress: - return &bn256PairingOracle{Orig: orig, Oracle: precompileOracle}, true + return &bn256PairingOracle{Orig: orig, Oracle: precompileOracle} case kzgPointEvaluationPrecompileAddress: - return &kzgPointEvaluationOracle{Orig: orig, Oracle: precompileOracle}, true + return &kzgPointEvaluationOracle{Orig: orig, Oracle: precompileOracle} default: - return nil, false + return orig } } } @@ -101,7 +104,7 @@ func (c *ecrecoverOracle) Run(input []byte) ([]byte, error) { // v needs to be at the end for libsecp256k1 // Modification note: below replaces the crypto.Ecrecover call - result, ok := c.Oracle.Precompile(ecrecoverPrecompileAddress, input) + result, ok := c.Oracle.Precompile(ecrecoverPrecompileAddress, input, c.RequiredGas(input)) if !ok { return nil, errors.New("invalid ecrecover input") } @@ -144,7 +147,7 @@ func (b *bn256PairingOracle) Run(input []byte) ([]byte, error) { } // Modification note: below replaces point verification and pairing checks // Assumes both L2 and the L1 oracle have an identical range of valid points - result, ok := b.Oracle.Precompile(bn256PairingPrecompileAddress, input) + result, ok := b.Oracle.Precompile(bn256PairingPrecompileAddress, input, b.RequiredGas(input)) if !ok { return nil, errors.New("invalid bn256Pairing check") } @@ -211,7 +214,7 @@ func (b *kzgPointEvaluationOracle) Run(input []byte) ([]byte, error) { copy(proof[:], input[144:]) // Modification note: below replaces the kzg4844.VerifyProof call - result, ok := b.Oracle.Precompile(kzgPointEvaluationPrecompileAddress, input) + result, ok := b.Oracle.Precompile(kzgPointEvaluationPrecompileAddress, input, b.RequiredGas(input)) if !ok { return nil, fmt.Errorf("%w: invalid KZG point evaluation", errBlobVerifyKZGProof) } diff --git a/op-program/client/l2/engineapi/test/l2_engine_api_tests.go b/op-program/client/l2/engineapi/test/l2_engine_api_tests.go index 1d8a9ff61ff7..4a78e258e780 100644 --- a/op-program/client/l2/engineapi/test/l2_engine_api_tests.go +++ b/op-program/client/l2/engineapi/test/l2_engine_api_tests.go @@ -2,18 +2,21 @@ package test import ( "context" + "math/big" "testing" + "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/go-ethereum/params" + "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/testlog" - "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/stretchr/testify/require" ) var gasLimit = eth.Uint64Quantity(30_000_000) @@ -109,7 +112,7 @@ func RunEngineAPITests(t *testing.T, createBackend func(t *testing.T) engineapi. payload := envelope.ExecutionPayload api.assert.Equal(genesis.Hash(), payload.ParentHash, "should have old block as parent") - api.newPayload(payload) + api.newPayload(envelope) api.forkChoiceUpdated(payload.BlockHash, genesis.Hash(), genesis.Hash()) api.assert.Equal(payload.BlockHash, api.headHash(), "should reorg to block built on old parent") }) @@ -138,13 +141,12 @@ func RunEngineAPITests(t *testing.T, createBackend func(t *testing.T) engineapi. // Build a valid block payloadID := api.startBlockBuilding(genesis, eth.Uint64Quantity(genesis.Time+2)) envelope := api.getPayload(payloadID) - newBlock := envelope.ExecutionPayload // But then make it invalid by changing the state root - newBlock.StateRoot = eth.Bytes32(genesis.TxHash) + envelope.ExecutionPayload.StateRoot = eth.Bytes32(genesis.TxHash) updateBlockHash(envelope) - r, err := api.engine.NewPayloadV2(api.ctx, newBlock) + r, err := api.callNewPayload(envelope) api.assert.NoError(err) api.assert.Equal(eth.ExecutionInvalid, r.Status) }) @@ -156,13 +158,12 @@ func RunEngineAPITests(t *testing.T, createBackend func(t *testing.T) engineapi. // Start with a valid time payloadID := api.startBlockBuilding(genesis, eth.Uint64Quantity(genesis.Time+1)) envelope := api.getPayload(payloadID) - newBlock := envelope.ExecutionPayload // Then make it invalid to check NewPayload rejects it - newBlock.Timestamp = eth.Uint64Quantity(genesis.Time) + envelope.ExecutionPayload.Timestamp = eth.Uint64Quantity(genesis.Time) updateBlockHash(envelope) - r, err := api.engine.NewPayloadV2(api.ctx, newBlock) + r, err := api.callNewPayload(envelope) api.assert.NoError(err) api.assert.Equal(eth.ExecutionInvalid, r.Status) }) @@ -174,13 +175,12 @@ func RunEngineAPITests(t *testing.T, createBackend func(t *testing.T) engineapi. // Start with a valid time payloadID := api.startBlockBuilding(genesis, eth.Uint64Quantity(genesis.Time+1)) envelope := api.getPayload(payloadID) - newBlock := envelope.ExecutionPayload // Then make it invalid to check NewPayload rejects it - newBlock.Timestamp = eth.Uint64Quantity(genesis.Time - 1) + envelope.ExecutionPayload.Timestamp = eth.Uint64Quantity(genesis.Time - 1) updateBlockHash(envelope) - r, err := api.engine.NewPayloadV2(api.ctx, newBlock) + r, err := api.callNewPayload(envelope) api.assert.NoError(err) api.assert.Equal(eth.ExecutionInvalid, r.Status) }) @@ -363,7 +363,7 @@ func (h *testHelper) addBlockWithParent(head *types.Header, timestamp eth.Uint64 h.assert.Equal(head.Hash(), block.ParentHash, "should have correct parent") h.assert.Len(block.Transactions, len(txs)) - h.newPayload(block) + h.newPayload(envelope) // Should not have changed the chain head yet h.assert.Equal(prevHead, h.backend.CurrentHeader()) @@ -395,25 +395,35 @@ func (h *testHelper) startBlockBuilding(head *types.Header, newBlockTimestamp et txData = append(txData, rlp) } - canyonTime := h.backend.Config().CanyonTime - var w *types.Withdrawals - if canyonTime != nil && *canyonTime <= uint64(newBlockTimestamp) { - w = &types.Withdrawals{} - } - - result, err := h.engine.ForkchoiceUpdatedV2(h.ctx, ð.ForkchoiceState{ - HeadBlockHash: head.Hash(), - SafeBlockHash: head.Hash(), - FinalizedBlockHash: head.Hash(), - }, ð.PayloadAttributes{ + attr := ð.PayloadAttributes{ Timestamp: newBlockTimestamp, PrevRandao: eth.Bytes32(head.MixDigest), SuggestedFeeRecipient: feeRecipient, Transactions: txData, NoTxPool: true, GasLimit: &gasLimit, - Withdrawals: w, - }) + } + n := new(big.Int).Add(head.Number, big.NewInt(1)) + if h.backend.Config().IsShanghai(n, uint64(newBlockTimestamp)) { + attr.Withdrawals = &types.Withdrawals{} + } + if h.backend.Config().IsCancun(n, uint64(newBlockTimestamp)) { + attr.ParentBeaconBlockRoot = &common.Hash{} + } + fcState := ð.ForkchoiceState{ + HeadBlockHash: head.Hash(), + SafeBlockHash: head.Hash(), + FinalizedBlockHash: head.Hash(), + } + var result *eth.ForkchoiceUpdatedResult + var err error + if h.backend.Config().IsCancun(n, uint64(newBlockTimestamp)) { + result, err = h.engine.ForkchoiceUpdatedV3(h.ctx, fcState, attr) + } else if h.backend.Config().IsShanghai(n, uint64(newBlockTimestamp)) { + result, err = h.engine.ForkchoiceUpdatedV2(h.ctx, fcState, attr) + } else { + result, err = h.engine.ForkchoiceUpdatedV1(h.ctx, fcState, attr) + } h.assert.NoError(err) h.assert.Equal(eth.ExecutionValid, result.PayloadStatus.Status) id := result.PayloadID @@ -423,16 +433,25 @@ func (h *testHelper) startBlockBuilding(head *types.Header, newBlockTimestamp et func (h *testHelper) getPayload(id *eth.PayloadID) *eth.ExecutionPayloadEnvelope { h.Log("getPayload", "id", id) - envelope, err := h.engine.GetPayloadV2(h.ctx, *id) + envelope, err := h.engine.GetPayloadV2(h.ctx, *id) // calls the same underlying function as V1 and V3 h.assert.NoError(err) h.assert.NotNil(envelope) h.assert.NotNil(envelope.ExecutionPayload) return envelope } -func (h *testHelper) newPayload(block *eth.ExecutionPayload) { - h.Log("newPayload", "hash", block.BlockHash) - r, err := h.engine.NewPayloadV2(h.ctx, block) +func (h *testHelper) callNewPayload(envelope *eth.ExecutionPayloadEnvelope) (*eth.PayloadStatusV1, error) { + n := new(big.Int).SetUint64(uint64(envelope.ExecutionPayload.BlockNumber)) + if h.backend.Config().IsCancun(n, uint64(envelope.ExecutionPayload.Timestamp)) { + return h.engine.NewPayloadV3(h.ctx, envelope.ExecutionPayload, []common.Hash{}, envelope.ParentBeaconBlockRoot) + } else { + return h.engine.NewPayloadV2(h.ctx, envelope.ExecutionPayload) + } +} + +func (h *testHelper) newPayload(envelope *eth.ExecutionPayloadEnvelope) { + h.Log("newPayload", "hash", envelope.ExecutionPayload.BlockHash) + r, err := h.callNewPayload(envelope) h.assert.NoError(err) h.assert.Equal(eth.ExecutionValid, r.Status) h.assert.Nil(r.ValidationError) diff --git a/op-program/client/l2/oracle.go b/op-program/client/l2/oracle.go index 6aa049e15992..0563079a830e 100644 --- a/op-program/client/l2/oracle.go +++ b/op-program/client/l2/oracle.go @@ -66,7 +66,7 @@ func (p *PreimageOracle) BlockByHash(blockHash common.Hash) *types.Block { header := p.headerByBlockHash(blockHash) txs := p.LoadTransactions(blockHash, header.TxHash) - return types.NewBlockWithHeader(header).WithBody(txs, nil) + return types.NewBlockWithHeader(header).WithBody(types.Body{Transactions: txs}) } func (p *PreimageOracle) LoadTransactions(blockHash common.Hash, txHash common.Hash) []*types.Transaction { diff --git a/op-program/client/l2/test/stub_oracle.go b/op-program/client/l2/test/stub_oracle.go index 95610b6119ad..3dbd6419c7ca 100644 --- a/op-program/client/l2/test/stub_oracle.go +++ b/op-program/client/l2/test/stub_oracle.go @@ -1,6 +1,7 @@ package test import ( + "encoding/binary" "testing" "github.com/ethereum-optimism/optimism/op-service/eth" @@ -130,15 +131,21 @@ type StubPrecompileOracle struct { Calls int } +func NewStubPrecompileOracle(t *testing.T) *StubPrecompileOracle { + return &StubPrecompileOracle{t: t, Results: make(map[common.Hash]PrecompileResult)} +} + type PrecompileResult struct { Result []byte Ok bool } -func (o *StubPrecompileOracle) Precompile(address common.Address, input []byte) ([]byte, bool) { - result, ok := o.Results[crypto.Keccak256Hash(append(address.Bytes(), input...))] +func (o *StubPrecompileOracle) Precompile(address common.Address, input []byte, requiredGas uint64) ([]byte, bool) { + arg := append(address.Bytes(), binary.BigEndian.AppendUint64(nil, requiredGas)...) + arg = append(arg, input...) + result, ok := o.Results[crypto.Keccak256Hash(arg)] if !ok { - o.t.Fatalf("no value for point evaluation %v", input) + o.t.Fatalf("no value for point evaluation %x required gas %v", input, requiredGas) } o.Calls++ return result.Result, result.Ok diff --git a/op-program/client/mpt/db.go b/op-program/client/mpt/db.go index fe9e234cf2df..f19052991289 100644 --- a/op-program/client/mpt/db.go +++ b/op-program/client/mpt/db.go @@ -31,7 +31,7 @@ func (p DB) Delete(key []byte) error { return nil } -func (p DB) Stat(property string) (string, error) { +func (p DB) Stat() (string, error) { panic("not supported") } @@ -51,10 +51,6 @@ func (p DB) Compact(start []byte, limit []byte) error { return nil // no-op } -func (p DB) NewSnapshot() (ethdb.Snapshot, error) { - panic("not supported") -} - func (p DB) Close() error { return nil } diff --git a/op-program/client/program.go b/op-program/client/program.go index a471941f2005..75d5fa93aa30 100644 --- a/op-program/client/program.go +++ b/op-program/client/program.go @@ -1,32 +1,30 @@ package client import ( - "context" "errors" "fmt" "io" "os" - "github.com/ethereum/go-ethereum/common" - "github.com/ethereum/go-ethereum/log" - "github.com/ethereum/go-ethereum/params" - "github.com/ethereum-optimism/optimism/op-node/rollup" preimage "github.com/ethereum-optimism/optimism/op-preimage" + "github.com/ethereum-optimism/optimism/op-program/client/claim" cldr "github.com/ethereum-optimism/optimism/op-program/client/driver" "github.com/ethereum-optimism/optimism/op-program/client/l1" "github.com/ethereum-optimism/optimism/op-program/client/l2" - oppio "github.com/ethereum-optimism/optimism/op-program/io" "github.com/ethereum-optimism/optimism/op-service/eth" + "github.com/ethereum/go-ethereum/common" + "github.com/ethereum/go-ethereum/log" + "github.com/ethereum/go-ethereum/params" ) // Main executes the client program in a detached context and exits the current process. // The client runtime environment must be preset before calling this function. func Main(logger log.Logger) { log.Info("Starting fault proof program client") - preimageOracle := CreatePreimageChannel() - preimageHinter := CreateHinterChannel() - if err := RunProgram(logger, preimageOracle, preimageHinter); errors.Is(err, cldr.ErrClaimNotValid) { + preimageOracle := preimage.ClientPreimageChannel() + preimageHinter := preimage.ClientHinterChannel() + if err := RunProgram(logger, preimageOracle, preimageHinter); errors.Is(err, claim.ErrClaimNotValid) { log.Error("Claim is invalid", "err", err) os.Exit(1) } else if err != nil { @@ -72,25 +70,8 @@ func runDerivation(logger log.Logger, cfg *rollup.Config, l2Cfg *params.ChainCon logger.Info("Starting derivation") d := cldr.NewDriver(logger, cfg, l1Source, l1BlobsSource, l2Source, l2ClaimBlockNum) - for { - if err = d.Step(context.Background()); errors.Is(err, io.EOF) { - break - } else if err != nil { - return err - } + if err := d.RunComplete(); err != nil { + return fmt.Errorf("failed to run program to completion: %w", err) } - return d.ValidateClaim(l2ClaimBlockNum, eth.Bytes32(l2Claim)) -} - -func CreateHinterChannel() oppio.FileChannel { - r := os.NewFile(HClientRFd, "preimage-hint-read") - w := os.NewFile(HClientWFd, "preimage-hint-write") - return oppio.NewReadWritePair(r, w) -} - -// CreatePreimageChannel returns a FileChannel for the preimage oracle in a detached context -func CreatePreimageChannel() oppio.FileChannel { - r := os.NewFile(PClientRFd, "preimage-oracle-read") - w := os.NewFile(PClientWFd, "preimage-oracle-write") - return oppio.NewReadWritePair(r, w) + return claim.ValidateClaim(logger, l2ClaimBlockNum, eth.Bytes32(l2Claim), l2Source) } diff --git a/op-program/host/cmd/main_test.go b/op-program/host/cmd/main_test.go index 0bff6513ffc5..6c91bf13365d 100644 --- a/op-program/host/cmd/main_test.go +++ b/op-program/host/cmd/main_test.go @@ -2,6 +2,7 @@ package main import ( "encoding/json" + "fmt" "os" "strconv" "testing" @@ -9,6 +10,7 @@ import ( "github.com/ethereum-optimism/optimism/op-node/chaincfg" "github.com/ethereum-optimism/optimism/op-program/chainconfig" "github.com/ethereum-optimism/optimism/op-program/host/config" + "github.com/ethereum-optimism/optimism/op-program/host/types" oplog "github.com/ethereum-optimism/optimism/op-service/log" "github.com/ethereum-optimism/optimism/op-service/sources" @@ -119,6 +121,20 @@ func TestDataDir(t *testing.T) { require.Equal(t, expected, cfg.DataDir) } +func TestDataFormat(t *testing.T) { + for _, format := range types.SupportedDataFormats { + format := format + t.Run(fmt.Sprintf("Valid-%v", format), func(t *testing.T) { + cfg := configForArgs(t, addRequiredArgs("--data.format", string(format))) + require.Equal(t, format, cfg.DataFormat) + }) + } + + t.Run("Invalid", func(t *testing.T) { + verifyArgsInvalid(t, "invalid data format: foo", addRequiredArgs("--data.format", "foo")) + }) +} + func TestL2(t *testing.T) { expected := "https://example.com:8545" cfg := configForArgs(t, addRequiredArgs("--l2", expected)) diff --git a/op-program/host/config/config.go b/op-program/host/config/config.go index 25f1a75724c9..c04f959a8b7d 100644 --- a/op-program/host/config/config.go +++ b/op-program/host/config/config.go @@ -5,8 +5,10 @@ import ( "errors" "fmt" "os" + "slices" "github.com/ethereum-optimism/optimism/op-node/chaincfg" + "github.com/ethereum-optimism/optimism/op-program/host/types" opnode "github.com/ethereum-optimism/optimism/op-node" "github.com/ethereum-optimism/optimism/op-node/rollup" @@ -30,6 +32,7 @@ var ( ErrInvalidL2ClaimBlock = errors.New("invalid l2 claim block number") ErrDataDirRequired = errors.New("datadir must be specified when in non-fetching mode") ErrNoExecInServerMode = errors.New("exec command must not be set when in server mode") + ErrInvalidDataFormat = errors.New("invalid data format") ) type Config struct { @@ -38,6 +41,9 @@ type Config struct { // If not set, an in-memory key-value store is used and fetching data must be enabled DataDir string + // DataFormat specifies the format to use for on-disk storage. Only applies when DataDir is set. + DataFormat types.DataFormat + // L1Head is the block hash of the L1 chain head block L1Head common.Hash L1URL string @@ -100,12 +106,14 @@ func (c *Config) Check() error { if c.ServerMode && c.ExecCmd != "" { return ErrNoExecInServerMode } + if c.DataDir != "" && !slices.Contains(types.SupportedDataFormats, c.DataFormat) { + return ErrInvalidDataFormat + } return nil } func (c *Config) FetchingEnabled() bool { - // TODO: Include Beacon URL once cancun is active on all chains we fault prove. - return c.L1URL != "" && c.L2URL != "" + return c.L1URL != "" && c.L2URL != "" && c.L1BeaconURL != "" } // NewConfig creates a Config with all optional values set to the CLI default value @@ -130,6 +138,7 @@ func NewConfig( L2ClaimBlockNumber: l2ClaimBlockNum, L1RPCKind: sources.RPCKindStandard, IsCustomChainConfig: isCustomConfig, + DataFormat: types.DataFormatDirectory, } } @@ -183,9 +192,14 @@ func NewConfigFromCLI(log log.Logger, ctx *cli.Context) (*Config, error) { if err != nil { return nil, fmt.Errorf("invalid genesis: %w", err) } + dbFormat := types.DataFormat(ctx.String(flags.DataFormat.Name)) + if !slices.Contains(types.SupportedDataFormats, dbFormat) { + return nil, fmt.Errorf("invalid %w: %v", ErrInvalidDataFormat, dbFormat) + } return &Config{ Rollup: rollupCfg, DataDir: ctx.String(flags.DataDir.Name), + DataFormat: dbFormat, L2URL: ctx.String(flags.L2NodeAddr.Name), L2ChainConfig: l2ChainConfig, L2Head: l2Head, diff --git a/op-program/host/config/config_test.go b/op-program/host/config/config_test.go index 7497b5db4bd9..e9cc54edd6a6 100644 --- a/op-program/host/config/config_test.go +++ b/op-program/host/config/config_test.go @@ -1,12 +1,14 @@ package config import ( + "fmt" "math/big" "testing" "github.com/ethereum-optimism/optimism/op-node/chaincfg" "github.com/ethereum-optimism/optimism/op-node/rollup" "github.com/ethereum-optimism/optimism/op-program/chainconfig" + "github.com/ethereum-optimism/optimism/op-program/host/types" "github.com/ethereum/go-ethereum/common" "github.com/ethereum/go-ethereum/params" "github.com/stretchr/testify/require" @@ -138,7 +140,8 @@ func TestFetchingEnabled(t *testing.T) { t.Run("FetchingEnabledWhenBothFetcherUrlsSpecified", func(t *testing.T) { cfg := validConfig() cfg.L1URL = "https://example.com:1234" - cfg.L2URL = "https://example.com:5678" + cfg.L1BeaconURL = "https://example.com:5678" + cfg.L2URL = "https://example.com:91011" require.True(t, cfg.FetchingEnabled(), "Should enable fetching when node URL supplied") }) } @@ -173,6 +176,22 @@ func TestIsCustomChainConfig(t *testing.T) { } +func TestDBFormat(t *testing.T) { + t.Run("invalid", func(t *testing.T) { + cfg := validConfig() + cfg.DataFormat = "foo" + require.ErrorIs(t, cfg.Check(), ErrInvalidDataFormat) + }) + for _, format := range types.SupportedDataFormats { + format := format + t.Run(fmt.Sprintf("%v", format), func(t *testing.T) { + cfg := validConfig() + cfg.DataFormat = format + require.NoError(t, cfg.Check()) + }) + } +} + func validConfig() *Config { cfg := NewConfig(validRollupConfig, validL2Genesis, validL1Head, validL2Head, validL2OutputRoot, validL2Claim, validL2ClaimBlockNum) cfg.DataDir = "/tmp/configTest" diff --git a/op-program/host/flags/flags.go b/op-program/host/flags/flags.go index 3356bbfda8a9..5eb633c7202f 100644 --- a/op-program/host/flags/flags.go +++ b/op-program/host/flags/flags.go @@ -4,6 +4,7 @@ import ( "fmt" "strings" + "github.com/ethereum-optimism/optimism/op-program/host/types" "github.com/urfave/cli/v2" "github.com/ethereum-optimism/optimism/op-node/chaincfg" @@ -35,6 +36,12 @@ var ( Usage: "Directory to use for preimage data storage. Default uses in-memory storage", EnvVars: prefixEnvVars("DATADIR"), } + DataFormat = &cli.StringFlag{ + Name: "data.format", + Usage: fmt.Sprintf("Format to use for preimage data storage. Available formats: %s", openum.EnumString(types.SupportedDataFormats)), + EnvVars: prefixEnvVars("DATA_FORMAT"), + Value: string(types.DataFormatDirectory), + } L2NodeAddr = &cli.StringFlag{ Name: "l2", Usage: "Address of L2 JSON-RPC endpoint to use (eth and debug namespace required)", @@ -122,6 +129,7 @@ var programFlags = []cli.Flag{ RollupConfig, Network, DataDir, + DataFormat, L2NodeAddr, L2GenesisPath, L1NodeAddr, diff --git a/op-program/host/host.go b/op-program/host/host.go index 2933d0be59b0..a60e451b972d 100644 --- a/op-program/host/host.go +++ b/op-program/host/host.go @@ -16,9 +16,9 @@ import ( "github.com/ethereum-optimism/optimism/op-program/host/flags" "github.com/ethereum-optimism/optimism/op-program/host/kvstore" "github.com/ethereum-optimism/optimism/op-program/host/prefetcher" - oppio "github.com/ethereum-optimism/optimism/op-program/io" opservice "github.com/ethereum-optimism/optimism/op-service" "github.com/ethereum-optimism/optimism/op-service/client" + "github.com/ethereum-optimism/optimism/op-service/ctxinterrupt" "github.com/ethereum-optimism/optimism/op-service/sources" "github.com/ethereum/go-ethereum/common" "github.com/ethereum/go-ethereum/log" @@ -29,6 +29,24 @@ type L2Source struct { *sources.DebugClient } +type Prefetcher interface { + Hint(hint string) error + GetPreimage(ctx context.Context, key common.Hash) ([]byte, error) +} +type PrefetcherCreator func(ctx context.Context, logger log.Logger, kv kvstore.KV, cfg *config.Config) (Prefetcher, error) + +type creatorsCfg struct { + prefetcher PrefetcherCreator +} + +type ProgramOpt func(c *creatorsCfg) + +func WithPrefetcher(creator PrefetcherCreator) ProgramOpt { + return func(c *creatorsCfg) { + c.prefetcher = creator + } +} + func Main(logger log.Logger, cfg *config.Config) error { if err := cfg.Check(); err != nil { return fmt.Errorf("invalid config: %w", err) @@ -36,11 +54,13 @@ func Main(logger log.Logger, cfg *config.Config) error { opservice.ValidateEnvVars(flags.EnvVarPrefix, flags.Flags, logger) cfg.Rollup.LogDescription(logger, chaincfg.L2ChainIDToNetworkDisplayName) - ctx := context.Background() + hostCtx, stop := ctxinterrupt.WithSignalWaiter(context.Background()) + defer stop() + ctx := ctxinterrupt.WithCancelOnInterrupt(hostCtx) if cfg.ServerMode { - preimageChan := cl.CreatePreimageChannel() - hinterChan := cl.CreateHinterChannel() - return PreimageServer(ctx, logger, cfg, preimageChan, hinterChan) + preimageChan := preimage.ClientPreimageChannel() + hinterChan := preimage.ClientHinterChannel() + return PreimageServer(ctx, logger, cfg, preimageChan, hinterChan, makeDefaultPrefetcher) } if err := FaultProofProgram(ctx, logger, cfg); err != nil { @@ -51,11 +71,17 @@ func Main(logger log.Logger, cfg *config.Config) error { } // FaultProofProgram is the programmatic entry-point for the fault proof program -func FaultProofProgram(ctx context.Context, logger log.Logger, cfg *config.Config) error { +func FaultProofProgram(ctx context.Context, logger log.Logger, cfg *config.Config, opts ...ProgramOpt) error { + creators := &creatorsCfg{ + prefetcher: makeDefaultPrefetcher, + } + for _, opt := range opts { + opt(creators) + } var ( serverErr chan error - pClientRW oppio.FileChannel - hClientRW oppio.FileChannel + pClientRW preimage.FileChannel + hClientRW preimage.FileChannel ) defer func() { if pClientRW != nil { @@ -73,13 +99,13 @@ func FaultProofProgram(ctx context.Context, logger log.Logger, cfg *config.Confi } }() // Setup client I/O for preimage oracle interaction - pClientRW, pHostRW, err := oppio.CreateBidirectionalChannel() + pClientRW, pHostRW, err := preimage.CreateBidirectionalChannel() if err != nil { return fmt.Errorf("failed to create preimage pipe: %w", err) } // Setup client I/O for hint comms - hClientRW, hHostRW, err := oppio.CreateBidirectionalChannel() + hClientRW, hHostRW, err := preimage.CreateBidirectionalChannel() if err != nil { return fmt.Errorf("failed to create hints pipe: %w", err) } @@ -88,7 +114,7 @@ func FaultProofProgram(ctx context.Context, logger log.Logger, cfg *config.Confi serverErr = make(chan error) go func() { defer close(serverErr) - serverErr <- PreimageServer(ctx, logger, cfg, pHostRW, hHostRW) + serverErr <- PreimageServer(ctx, logger, cfg, pHostRW, hHostRW, creators.prefetcher) }() var cmd *exec.Cmd @@ -120,9 +146,13 @@ func FaultProofProgram(ctx context.Context, logger log.Logger, cfg *config.Confi // This method will block until both the hinter and preimage handlers complete. // If either returns an error both handlers are stopped. // The supplied preimageChannel and hintChannel will be closed before this function returns. -func PreimageServer(ctx context.Context, logger log.Logger, cfg *config.Config, preimageChannel oppio.FileChannel, hintChannel oppio.FileChannel) error { +func PreimageServer(ctx context.Context, logger log.Logger, cfg *config.Config, preimageChannel preimage.FileChannel, hintChannel preimage.FileChannel, prefetcherCreator PrefetcherCreator) error { var serverDone chan error var hinterDone chan error + logger.Info("Starting preimage server") + var kv kvstore.KV + + // Close the preimage/hint channels, and then kv store once the server and hinter have exited. defer func() { preimageChannel.Close() hintChannel.Close() @@ -134,29 +164,35 @@ func PreimageServer(ctx context.Context, logger log.Logger, cfg *config.Config, // Wait for hinter to complete <-hinterDone } + + if kv != nil { + kv.Close() + } }() - logger.Info("Starting preimage server") - var kv kvstore.KV + if cfg.DataDir == "" { logger.Info("Using in-memory storage") kv = kvstore.NewMemKV() } else { - logger.Info("Creating disk storage", "datadir", cfg.DataDir) if err := os.MkdirAll(cfg.DataDir, 0755); err != nil { return fmt.Errorf("creating datadir: %w", err) } - kv = kvstore.NewDiskKV(cfg.DataDir) + store, err := kvstore.NewDiskKV(logger, cfg.DataDir, cfg.DataFormat) + if err != nil { + return fmt.Errorf("creating kvstore: %w", err) + } + kv = store } var ( getPreimage kvstore.PreimageSource hinter preimage.HintHandler ) - if cfg.FetchingEnabled() { - prefetch, err := makePrefetcher(ctx, logger, kv, cfg) - if err != nil { - return fmt.Errorf("failed to create prefetcher: %w", err) - } + prefetch, err := prefetcherCreator(ctx, logger, kv, cfg) + if err != nil { + return fmt.Errorf("failed to create prefetcher: %w", err) + } + if prefetch != nil { getPreimage = func(key common.Hash) ([]byte, error) { return prefetch.GetPreimage(ctx, key) } hinter = prefetch.Hint } else { @@ -179,10 +215,20 @@ func PreimageServer(ctx context.Context, logger log.Logger, cfg *config.Config, return err case err := <-hinterDone: return err + case <-ctx.Done(): + logger.Info("Shutting down") + if errors.Is(ctx.Err(), context.Canceled) { + // We were asked to shutdown by the context being cancelled so don't treat it as an error condition. + return nil + } + return ctx.Err() } } -func makePrefetcher(ctx context.Context, logger log.Logger, kv kvstore.KV, cfg *config.Config) (*prefetcher.Prefetcher, error) { +func makeDefaultPrefetcher(ctx context.Context, logger log.Logger, kv kvstore.KV, cfg *config.Config) (Prefetcher, error) { + if !cfg.FetchingEnabled() { + return nil, nil + } logger.Info("Connecting to L1 node", "l1", cfg.L1URL) l1RPC, err := client.NewRPC(ctx, logger, cfg.L1URL, client.WithDialBackoff(10)) if err != nil { diff --git a/op-program/host/host_test.go b/op-program/host/host_test.go index 2e7cc4d21646..c5d63e17ab34 100644 --- a/op-program/host/host_test.go +++ b/op-program/host/host_test.go @@ -13,7 +13,6 @@ import ( "github.com/ethereum-optimism/optimism/op-program/client/l1" "github.com/ethereum-optimism/optimism/op-program/host/config" "github.com/ethereum-optimism/optimism/op-program/host/kvstore" - "github.com/ethereum-optimism/optimism/op-program/io" "github.com/ethereum-optimism/optimism/op-service/testlog" "github.com/ethereum/go-ethereum/common" "github.com/ethereum/go-ethereum/log" @@ -29,16 +28,16 @@ func TestServerMode(t *testing.T) { cfg.DataDir = dir cfg.ServerMode = true - preimageServer, preimageClient, err := io.CreateBidirectionalChannel() + preimageServer, preimageClient, err := preimage.CreateBidirectionalChannel() require.NoError(t, err) defer preimageClient.Close() - hintServer, hintClient, err := io.CreateBidirectionalChannel() + hintServer, hintClient, err := preimage.CreateBidirectionalChannel() require.NoError(t, err) defer hintClient.Close() logger := testlog.Logger(t, log.LevelTrace) result := make(chan error) go func() { - result <- PreimageServer(context.Background(), logger, cfg, preimageServer, hintServer) + result <- PreimageServer(context.Background(), logger, cfg, preimageServer, hintServer, makeDefaultPrefetcher) }() pClient := preimage.NewOracleClient(preimageClient) diff --git a/op-program/host/kvstore/directory.go b/op-program/host/kvstore/directory.go new file mode 100644 index 000000000000..4176a6453d64 --- /dev/null +++ b/op-program/host/kvstore/directory.go @@ -0,0 +1,86 @@ +package kvstore + +import ( + "encoding/hex" + "errors" + "fmt" + "io" + "os" + "path" + "sync" + + "github.com/ethereum/go-ethereum/common" +) + +// directoryKV is a disk-backed key-value store, every key-value pair is a hex-encoded .txt file, with the value as content. +// directoryKV is safe for concurrent use with a single directoryKV instance. +// directoryKV is safe for concurrent use between different directoryKV instances of the same disk directory as long as the +// file system supports atomic renames. +type directoryKV struct { + sync.RWMutex + path string +} + +// newDirectoryKV creates a directoryKV that puts/gets pre-images as files in the given directory path. +// The path must exist, or subsequent Put/Get calls will error when it does not. +func newDirectoryKV(path string) *directoryKV { + return &directoryKV{path: path} +} + +// pathKey returns the file path for the given key. +// This is composed of the first characters of the non-0x-prefixed hex key as a directory, and the rest as the file name. +func (d *directoryKV) pathKey(k common.Hash) string { + key := k.String() + dir, name := key[2:6], key[6:] + return path.Join(d.path, dir, name+".txt") +} + +func (d *directoryKV) Put(k common.Hash, v []byte) error { + d.Lock() + defer d.Unlock() + f, err := openTempFile(d.path, k.String()+".txt.*") + if err != nil { + return fmt.Errorf("failed to open temp file for pre-image %s: %w", k, err) + } + defer os.Remove(f.Name()) // Clean up the temp file if it doesn't actually get moved into place + if _, err := f.Write([]byte(hex.EncodeToString(v))); err != nil { + _ = f.Close() + return fmt.Errorf("failed to write pre-image %s to disk: %w", k, err) + } + if err := f.Close(); err != nil { + return fmt.Errorf("failed to close temp pre-image %s file: %w", k, err) + } + + targetFile := d.pathKey(k) + if err := os.MkdirAll(path.Dir(targetFile), 0777); err != nil { + return fmt.Errorf("failed to create parent directory for pre-image %s: %w", f.Name(), err) + } + if err := os.Rename(f.Name(), targetFile); err != nil { + return fmt.Errorf("failed to move temp file %v to final destination %v: %w", f.Name(), targetFile, err) + } + return nil +} + +func (d *directoryKV) Get(k common.Hash) ([]byte, error) { + d.RLock() + defer d.RUnlock() + f, err := os.OpenFile(d.pathKey(k), os.O_RDONLY, filePermission) + if err != nil { + if errors.Is(err, os.ErrNotExist) { + return nil, ErrNotFound + } + return nil, fmt.Errorf("failed to open pre-image file %s: %w", k, err) + } + defer f.Close() // fine to ignore closing error here + dat, err := io.ReadAll(f) + if err != nil { + return nil, fmt.Errorf("failed to read pre-image from file %s: %w", k, err) + } + return hex.DecodeString(string(dat)) +} + +func (d *directoryKV) Close() error { + return nil +} + +var _ KV = (*directoryKV)(nil) diff --git a/op-program/host/kvstore/directory_test.go b/op-program/host/kvstore/directory_test.go new file mode 100644 index 000000000000..0a76f5843b53 --- /dev/null +++ b/op-program/host/kvstore/directory_test.go @@ -0,0 +1,28 @@ +package kvstore + +import ( + "path/filepath" + "testing" + + "github.com/ethereum/go-ethereum/crypto" + "github.com/stretchr/testify/require" +) + +func TestDirectoryKV(t *testing.T) { + tmp := t.TempDir() // automatically removed by testing cleanup + kv := newDirectoryKV(tmp) + t.Cleanup(func() { // Can't use defer because kvTest runs tests in parallel. + require.NoError(t, kv.Close()) + }) + kvTest(t, kv) +} + +func TestDirectoryKV_CreateMissingDirectory(t *testing.T) { + tmp := t.TempDir() + dir := filepath.Join(tmp, "data") + kv := newDirectoryKV(dir) + defer kv.Close() + val := []byte{1, 2, 3, 4} + key := crypto.Keccak256Hash(val) + require.NoError(t, kv.Put(key, val)) +} diff --git a/op-program/host/kvstore/disk.go b/op-program/host/kvstore/disk.go deleted file mode 100644 index 0f6bd19068ae..000000000000 --- a/op-program/host/kvstore/disk.go +++ /dev/null @@ -1,93 +0,0 @@ -package kvstore - -import ( - "encoding/hex" - "errors" - "fmt" - "io" - "os" - "path" - "sync" - - "github.com/ethereum/go-ethereum/common" -) - -// read/write mode for user/group/other, not executable. -const diskPermission = 0666 - -// DiskKV is a disk-backed key-value store, every key-value pair is a hex-encoded .txt file, with the value as content. -// DiskKV is safe for concurrent use with a single DiskKV instance. -// DiskKV is safe for concurrent use between different DiskKV instances of the same disk directory as long as the -// file system supports atomic renames. -type DiskKV struct { - sync.RWMutex - path string -} - -// NewDiskKV creates a DiskKV that puts/gets pre-images as files in the given directory path. -// The path must exist, or subsequent Put/Get calls will error when it does not. -func NewDiskKV(path string) *DiskKV { - return &DiskKV{path: path} -} - -func (d *DiskKV) pathKey(k common.Hash) string { - return path.Join(d.path, k.String()+".txt") -} - -func (d *DiskKV) Put(k common.Hash, v []byte) error { - d.Lock() - defer d.Unlock() - f, err := openTempFile(d.path, k.String()+".txt.*") - if err != nil { - return fmt.Errorf("failed to open temp file for pre-image %s: %w", k, err) - } - defer os.Remove(f.Name()) // Clean up the temp file if it doesn't actually get moved into place - if _, err := f.Write([]byte(hex.EncodeToString(v))); err != nil { - _ = f.Close() - return fmt.Errorf("failed to write pre-image %s to disk: %w", k, err) - } - if err := f.Close(); err != nil { - return fmt.Errorf("failed to close temp pre-image %s file: %w", k, err) - } - - targetFile := d.pathKey(k) - if err := os.Rename(f.Name(), targetFile); err != nil { - return fmt.Errorf("failed to move temp dir %v to final destination %v: %w", f.Name(), targetFile, err) - } - return nil -} - -func openTempFile(dir string, nameTemplate string) (*os.File, error) { - f, err := os.CreateTemp(dir, nameTemplate) - // Directory has been deleted out from underneath us. Recreate it. - if errors.Is(err, os.ErrNotExist) { - if mkdirErr := os.MkdirAll(dir, 0777); mkdirErr != nil { - return nil, errors.Join(fmt.Errorf("failed to create directory %v: %w", dir, mkdirErr), err) - } - f, err = os.CreateTemp(dir, nameTemplate) - } - if err != nil { - return nil, err - } - return f, nil -} - -func (d *DiskKV) Get(k common.Hash) ([]byte, error) { - d.RLock() - defer d.RUnlock() - f, err := os.OpenFile(d.pathKey(k), os.O_RDONLY, diskPermission) - if err != nil { - if errors.Is(err, os.ErrNotExist) { - return nil, ErrNotFound - } - return nil, fmt.Errorf("failed to open pre-image file %s: %w", k, err) - } - defer f.Close() // fine to ignore closing error here - dat, err := io.ReadAll(f) - if err != nil { - return nil, fmt.Errorf("failed to read pre-image from file %s: %w", k, err) - } - return hex.DecodeString(string(dat)) -} - -var _ KV = (*DiskKV)(nil) diff --git a/op-program/host/kvstore/disk_test.go b/op-program/host/kvstore/disk_test.go deleted file mode 100644 index 1ea0eaa2dfa8..000000000000 --- a/op-program/host/kvstore/disk_test.go +++ /dev/null @@ -1,24 +0,0 @@ -package kvstore - -import ( - "path/filepath" - "testing" - - "github.com/ethereum/go-ethereum/crypto" - "github.com/stretchr/testify/require" -) - -func TestDiskKV(t *testing.T) { - tmp := t.TempDir() // automatically removed by testing cleanup - kv := NewDiskKV(tmp) - kvTest(t, kv) -} - -func TestCreateMissingDirectory(t *testing.T) { - tmp := t.TempDir() - dir := filepath.Join(tmp, "data") - kv := NewDiskKV(dir) - val := []byte{1, 2, 3, 4} - key := crypto.Keccak256Hash(val) - require.NoError(t, kv.Put(key, val)) -} diff --git a/op-program/host/kvstore/file.go b/op-program/host/kvstore/file.go new file mode 100644 index 000000000000..9116f83df720 --- /dev/null +++ b/op-program/host/kvstore/file.go @@ -0,0 +1,97 @@ +package kvstore + +import ( + "encoding/hex" + "errors" + "fmt" + "io" + "os" + "path" + "sync" + + "github.com/ethereum/go-ethereum/common" +) + +// read/write mode for user/group/other, not executable. +const filePermission = 0666 + +// fileKV is a disk-backed key-value store, every key-value pair is a hex-encoded .txt file, with the value as content. +// fileKV is safe for concurrent use with a single fileKV instance. +// fileKV is safe for concurrent use between different fileKV instances of the same disk directory as long as the +// file system supports atomic renames. +type fileKV struct { + sync.RWMutex + path string +} + +// newFileKV creates a fileKV that puts/gets pre-images as files in the given directory path. +// The path must exist, or subsequent Put/Get calls will error when it does not. +func newFileKV(path string) *fileKV { + return &fileKV{path: path} +} + +func (d *fileKV) pathKey(k common.Hash) string { + return path.Join(d.path, k.String()+".txt") +} + +func (d *fileKV) Put(k common.Hash, v []byte) error { + d.Lock() + defer d.Unlock() + f, err := openTempFile(d.path, k.String()+".txt.*") + if err != nil { + return fmt.Errorf("failed to open temp file for pre-image %s: %w", k, err) + } + defer os.Remove(f.Name()) // Clean up the temp file if it doesn't actually get moved into place + if _, err := f.Write([]byte(hex.EncodeToString(v))); err != nil { + _ = f.Close() + return fmt.Errorf("failed to write pre-image %s to disk: %w", k, err) + } + if err := f.Close(); err != nil { + return fmt.Errorf("failed to close temp pre-image %s file: %w", k, err) + } + + targetFile := d.pathKey(k) + if err := os.Rename(f.Name(), targetFile); err != nil { + return fmt.Errorf("failed to move temp dir %v to final destination %v: %w", f.Name(), targetFile, err) + } + return nil +} + +func openTempFile(dir string, nameTemplate string) (*os.File, error) { + f, err := os.CreateTemp(dir, nameTemplate) + // Directory has been deleted out from underneath us. Recreate it. + if errors.Is(err, os.ErrNotExist) { + if mkdirErr := os.MkdirAll(dir, 0777); mkdirErr != nil { + return nil, errors.Join(fmt.Errorf("failed to create directory %v: %w", dir, mkdirErr), err) + } + f, err = os.CreateTemp(dir, nameTemplate) + } + if err != nil { + return nil, err + } + return f, nil +} + +func (d *fileKV) Get(k common.Hash) ([]byte, error) { + d.RLock() + defer d.RUnlock() + f, err := os.OpenFile(d.pathKey(k), os.O_RDONLY, filePermission) + if err != nil { + if errors.Is(err, os.ErrNotExist) { + return nil, ErrNotFound + } + return nil, fmt.Errorf("failed to open pre-image file %s: %w", k, err) + } + defer f.Close() // fine to ignore closing error here + dat, err := io.ReadAll(f) + if err != nil { + return nil, fmt.Errorf("failed to read pre-image from file %s: %w", k, err) + } + return hex.DecodeString(string(dat)) +} + +func (d *fileKV) Close() error { + return nil +} + +var _ KV = (*fileKV)(nil) diff --git a/op-program/host/kvstore/file_test.go b/op-program/host/kvstore/file_test.go new file mode 100644 index 000000000000..cb96039bc2ce --- /dev/null +++ b/op-program/host/kvstore/file_test.go @@ -0,0 +1,28 @@ +package kvstore + +import ( + "path/filepath" + "testing" + + "github.com/ethereum/go-ethereum/crypto" + "github.com/stretchr/testify/require" +) + +func TestFileKV(t *testing.T) { + tmp := t.TempDir() // automatically removed by testing cleanup + kv := newFileKV(tmp) + t.Cleanup(func() { // Can't use defer because kvTest runs tests in parallel. + require.NoError(t, kv.Close()) + }) + kvTest(t, kv) +} + +func TestFileKV_CreateMissingDirectory(t *testing.T) { + tmp := t.TempDir() + dir := filepath.Join(tmp, "data") + kv := newFileKV(dir) + defer kv.Close() + val := []byte{1, 2, 3, 4} + key := crypto.Keccak256Hash(val) + require.NoError(t, kv.Put(key, val)) +} diff --git a/op-program/host/kvstore/format.go b/op-program/host/kvstore/format.go new file mode 100644 index 000000000000..08cbc1b18c5d --- /dev/null +++ b/op-program/host/kvstore/format.go @@ -0,0 +1,69 @@ +package kvstore + +import ( + "errors" + "fmt" + "os" + "path/filepath" + "slices" + + "github.com/ethereum-optimism/optimism/op-program/host/types" + "github.com/ethereum/go-ethereum/log" +) + +const formatFilename = "kvformat" + +var ( + ErrFormatUnavailable = errors.New("format unavailable") + ErrUnsupportedFormat = errors.New("unsupported format") +) + +func recordKVFormat(dir string, format types.DataFormat) error { + return os.WriteFile(filepath.Join(dir, formatFilename), []byte(format), 0o644) +} + +func readKVFormat(dir string) (types.DataFormat, error) { + data, err := os.ReadFile(filepath.Join(dir, formatFilename)) + if errors.Is(err, os.ErrNotExist) { + return "", ErrFormatUnavailable + } else if err != nil { + return "", fmt.Errorf("failed to read kv format: %w", err) + } + format := types.DataFormat(data) + if !slices.Contains(types.SupportedDataFormats, format) { + return "", fmt.Errorf("%w: %s", ErrUnsupportedFormat, format) + } + return format, nil +} + +// NewDiskKV creates a new KV implementation. If the specified directly contains an existing KV store +// that has the format recorded, the recorded format is used ensuring compatibility with the existing data. +// If the directory does not contain existing data or doesn't have the format recorded, defaultFormat is used +// which may result in the existing data being unused. +// If the existing data records a format that is not supported, an error is returned. +// The format is automatically recorded if it wasn't previously stored. +func NewDiskKV(logger log.Logger, dir string, defaultFormat types.DataFormat) (KV, error) { + format, err := readKVFormat(dir) + if errors.Is(err, ErrFormatUnavailable) { + format = defaultFormat + logger.Info("Creating disk storage", "datadir", dir, "format", format) + if err := recordKVFormat(dir, format); err != nil { + return nil, fmt.Errorf("failed to record new kv store format: %w", err) + } + } else if err != nil { + return nil, err + } else { + logger.Info("Using existing disk storage", "datadir", dir, "format", format) + } + + switch format { + case types.DataFormatFile: + return newFileKV(dir), nil + case types.DataFormatDirectory: + return newDirectoryKV(dir), nil + case types.DataFormatPebble: + return newPebbleKV(dir), nil + default: + return nil, fmt.Errorf("invalid data format: %s", format) + } +} diff --git a/op-program/host/kvstore/format_test.go b/op-program/host/kvstore/format_test.go new file mode 100644 index 000000000000..8be0368bd09c --- /dev/null +++ b/op-program/host/kvstore/format_test.go @@ -0,0 +1,66 @@ +package kvstore + +import ( + "fmt" + "testing" + + "github.com/ethereum-optimism/optimism/op-program/host/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 TestRecordAndReadKVFormat(t *testing.T) { + for _, format := range types.SupportedDataFormats { + format := format + t.Run(string(format), func(t *testing.T) { + dir := t.TempDir() + require.NoError(t, recordKVFormat(dir, format)) + actual, err := readKVFormat(dir) + require.NoError(t, err) + require.Equal(t, format, actual) + }) + } + + t.Run("Unsupported", func(t *testing.T) { + dir := t.TempDir() + require.NoError(t, recordKVFormat(dir, "nope")) + _, err := readKVFormat(dir) + require.ErrorIs(t, err, ErrUnsupportedFormat) + }) + + t.Run("NotRecorded", func(t *testing.T) { + dir := t.TempDir() + _, err := readKVFormat(dir) + require.ErrorIs(t, err, ErrFormatUnavailable) + }) +} + +func TestNewDiskKV(t *testing.T) { + for _, existingFormat := range types.SupportedDataFormats { + existingFormat := existingFormat + + for _, specifiedFormat := range types.SupportedDataFormats { + specifiedFormat := specifiedFormat + t.Run(fmt.Sprintf("%v->%v", existingFormat, specifiedFormat), func(t *testing.T) { + dir := t.TempDir() + logger := testlog.Logger(t, log.LevelError) + hash := common.Hash{0xaa} + value := []byte{1, 2, 3, 4, 5, 6} + kv1, err := NewDiskKV(logger, dir, existingFormat) + require.NoError(t, err) + require.NoError(t, kv1.Put(hash, value)) + require.NoError(t, kv1.Close()) + + // Should use existing format + kv2, err := NewDiskKV(logger, dir, specifiedFormat) + require.NoError(t, err) + actual, err := kv2.Get(hash) + require.NoError(t, err) + require.Equal(t, value, actual) + require.NoError(t, kv2.Close()) + }) + } + } +} diff --git a/op-program/host/kvstore/kv.go b/op-program/host/kvstore/kv.go index e75dcd699d9f..054230950d0b 100644 --- a/op-program/host/kvstore/kv.go +++ b/op-program/host/kvstore/kv.go @@ -19,4 +19,7 @@ type KV interface { // It returns ErrNotFound when the pre-image cannot be found. // KV store implementations may return additional errors specific to the KV storage. Get(k common.Hash) ([]byte, error) + + // Closes the KV store. + Close() error } diff --git a/op-program/host/kvstore/mem.go b/op-program/host/kvstore/mem.go index 9af540e235fa..0c3b950b7e9c 100644 --- a/op-program/host/kvstore/mem.go +++ b/op-program/host/kvstore/mem.go @@ -37,3 +37,7 @@ func (m *MemKV) Get(k common.Hash) ([]byte, error) { } return slices.Clone(v), nil } + +func (m *MemKV) Close() error { + return nil +} diff --git a/op-program/host/kvstore/pebble.go b/op-program/host/kvstore/pebble.go new file mode 100644 index 000000000000..5bc7fcc9f23a --- /dev/null +++ b/op-program/host/kvstore/pebble.go @@ -0,0 +1,68 @@ +package kvstore + +import ( + "errors" + "fmt" + "runtime" + "sync" + + "github.com/cockroachdb/pebble" + "github.com/ethereum/go-ethereum/common" +) + +// pebbleKV is a disk-backed key-value store, with PebbleDB as the underlying DBMS. +// pebbleKV is safe for concurrent use with a single pebbleKV instance. +type pebbleKV struct { + sync.RWMutex + db *pebble.DB +} + +// newPebbleKV creates a pebbleKV that puts/gets pre-images as files in the given directory path. +// The path must exist, or subsequent Put/Get calls will error when it does not. +func newPebbleKV(path string) *pebbleKV { + opts := &pebble.Options{ + Cache: pebble.NewCache(int64(32 * 1024 * 1024)), + MaxConcurrentCompactions: runtime.NumCPU, + Levels: []pebble.LevelOptions{ + {Compression: pebble.SnappyCompression}, + }, + } + db, err := pebble.Open(path, opts) + if err != nil { + panic(fmt.Errorf("failed to open pebbledb at %s: %w", path, err)) + } + + return &pebbleKV{db: db} +} + +func (d *pebbleKV) Put(k common.Hash, v []byte) error { + d.Lock() + defer d.Unlock() + return d.db.Set(k.Bytes(), v, pebble.NoSync) +} + +func (d *pebbleKV) Get(k common.Hash) ([]byte, error) { + d.RLock() + defer d.RUnlock() + + dat, closer, err := d.db.Get(k.Bytes()) + if err != nil { + if errors.Is(err, pebble.ErrNotFound) { + return nil, ErrNotFound + } + return nil, err + } + ret := make([]byte, len(dat)) + copy(ret, dat) + closer.Close() + return ret, nil +} + +func (d *pebbleKV) Close() error { + d.Lock() + defer d.Unlock() + + return d.db.Close() +} + +var _ KV = (*pebbleKV)(nil) diff --git a/op-program/host/kvstore/pebble_test.go b/op-program/host/kvstore/pebble_test.go new file mode 100644 index 000000000000..e009d6797021 --- /dev/null +++ b/op-program/host/kvstore/pebble_test.go @@ -0,0 +1,28 @@ +package kvstore + +import ( + "path/filepath" + "testing" + + "github.com/ethereum/go-ethereum/crypto" + "github.com/stretchr/testify/require" +) + +func TestPebbleKV(t *testing.T) { + tmp := t.TempDir() // automatically removed by testing cleanup + kv := newPebbleKV(tmp) + t.Cleanup(func() { // Can't use defer because kvTest runs tests in parallel. + require.NoError(t, kv.Close()) + }) + kvTest(t, kv) +} + +func TestPebbleKV_CreateMissingDirectory(t *testing.T) { + tmp := t.TempDir() + dir := filepath.Join(tmp, "data") + kv := newPebbleKV(dir) + defer kv.Close() + val := []byte{1, 2, 3, 4} + key := crypto.Keccak256Hash(val) + require.NoError(t, kv.Put(key, val)) +} diff --git a/op-program/host/prefetcher/prefetcher.go b/op-program/host/prefetcher/prefetcher.go index babca2b2c859..cb5a52fa88ce 100644 --- a/op-program/host/prefetcher/prefetcher.go +++ b/op-program/host/prefetcher/prefetcher.go @@ -205,6 +205,36 @@ func (p *Prefetcher) prefetch(ctx context.Context, hint string) error { return err } return p.kvStore.Put(preimage.PrecompileKey(inputHash).PreimageKey(), result) + case l1.HintL1PrecompileV2: + if len(hintBytes) < 28 { + return fmt.Errorf("invalid precompile hint: %x", hint) + } + precompileAddress := common.BytesToAddress(hintBytes[:20]) + // requiredGas := hintBytes[20:28] - unused by the host. Since the client already validates gas requirements. + // The requiredGas is only used by the L1 PreimageOracle to enforce complete precompile execution. + + // For extra safety, avoid accelerating unexpected precompiles + if !slices.Contains(acceleratedPrecompiles, precompileAddress) { + return fmt.Errorf("unsupported precompile address: %s", precompileAddress) + } + // NOTE: We use the precompiled contracts from Cancun because it's the only set that contains the addresses of all accelerated precompiles + // We assume the precompile Run function behavior does not change across EVM upgrades. + // As such, we must not rely on upgrade-specific behavior such as precompile.RequiredGas. + precompile := getPrecompiledContract(precompileAddress) + + // KZG Point Evaluation precompile also verifies its input + result, err := precompile.Run(hintBytes[28:]) + if err == nil { + result = append(precompileSuccess[:], result...) + } else { + result = append(precompileFailure[:], result...) + } + inputHash := crypto.Keccak256Hash(hintBytes) + // Put the input preimage so it can be loaded later + if err := p.kvStore.Put(preimage.Keccak256Key(inputHash).PreimageKey(), hintBytes); err != nil { + return err + } + return p.kvStore.Put(preimage.PrecompileKey(inputHash).PreimageKey(), result) case l2.HintL2BlockHeader, l2.HintL2Transactions: if len(hintBytes) != 32 { return fmt.Errorf("invalid L2 header/tx hint: %x", hint) diff --git a/op-program/host/prefetcher/prefetcher_test.go b/op-program/host/prefetcher/prefetcher_test.go index 84cab6d7d7ea..2564f08eada9 100644 --- a/op-program/host/prefetcher/prefetcher_test.go +++ b/op-program/host/prefetcher/prefetcher_test.go @@ -4,6 +4,7 @@ import ( "context" "crypto/sha256" "encoding/binary" + "fmt" "math/rand" "testing" @@ -25,6 +26,11 @@ import ( "github.com/ethereum-optimism/optimism/op-service/testutils" ) +var ( + ecRecoverInput = common.FromHex("18c547e4f7b0f325ad1e56f57e26c745b09a3e503d86e00e5255ff7f715d3d1c000000000000000000000000000000000000000000000000000000000000001c73b1693892219d736caba55bdb67216e485557ea6b6af75f37096c9aa6a5a75feeb940b1d03b21e36b0e47e79769f095fe2ab855bd91e3a38756b7d75a9c4549") + kzgPointEvalInput = common.FromHex("01e798154708fe7789429634053cbf9f99b619f9f084048927333fce637f549b564c0a11a0f704f4fc3e8acfe0f8245f0ad1347b378fbf96e206da11a5d3630624d25032e67a7e6a4910df5834b8fe70e6bcfeeac0352434196bdf4b2485d5a18f59a8d2a1a625a17f3fea0fe5eb8c896db3764f3185481bc22f91b4aaffcca25f26936857bc3a7c2539ea8ec3a952b7873033e038326e87ed3e1276fd140253fa08e9fc25fb2d9a98527fc22a2c9612fbeafdad446cbc7bcdbdcd780af2c16a") +) + func TestNoHint(t *testing.T) { t.Run("NotFound", func(t *testing.T) { prefetcher, _, _, _, _ := createPrefetcher(t) @@ -221,9 +227,6 @@ func TestFetchL1Blob(t *testing.T) { } func TestFetchPrecompileResult(t *testing.T) { - ecRecoverInput := common.FromHex("18c547e4f7b0f325ad1e56f57e26c745b09a3e503d86e00e5255ff7f715d3d1c000000000000000000000000000000000000000000000000000000000000001c73b1693892219d736caba55bdb67216e485557ea6b6af75f37096c9aa6a5a75feeb940b1d03b21e36b0e47e79769f095fe2ab855bd91e3a38756b7d75a9c4549") - kzgPointEvalInput := common.FromHex("01e798154708fe7789429634053cbf9f99b619f9f084048927333fce637f549b564c0a11a0f704f4fc3e8acfe0f8245f0ad1347b378fbf96e206da11a5d3630624d25032e67a7e6a4910df5834b8fe70e6bcfeeac0352434196bdf4b2485d5a18f59a8d2a1a625a17f3fea0fe5eb8c896db3764f3185481bc22f91b4aaffcca25f26936857bc3a7c2539ea8ec3a952b7873033e038326e87ed3e1276fd140253fa08e9fc25fb2d9a98527fc22a2c9612fbeafdad446cbc7bcdbdcd780af2c16a") - failure := []byte{0} success := []byte{1} @@ -239,6 +242,18 @@ func TestFetchPrecompileResult(t *testing.T) { input: ecRecoverInput, result: append(success, common.FromHex("000000000000000000000000a94f5374fce5edbc8e2a8697c15331677e6ebf0b")...), }, + { + name: "KzgPointEvaluation-Valid", + addr: common.BytesToAddress([]byte{0xa}), + input: kzgPointEvalInput, + result: append(success, common.FromHex("000000000000000000000000000000000000000000000000000000000000100073eda753299d7d483339d80809a1d80553bda402fffe5bfeffffffff00000001")...), + }, + { + name: "KzgPointEvaluation-Invalid", + addr: common.BytesToAddress([]byte{0xa}), + input: []byte{0x0}, + result: failure, + }, { name: "Bn256Pairing-Valid", addr: common.BytesToAddress([]byte{0x8}), @@ -251,17 +266,88 @@ func TestFetchPrecompileResult(t *testing.T) { input: []byte{0x1}, result: failure, }, + } + for _, test := range tests { + test := test + t.Run(test.name, func(t *testing.T) { + prefetcher, _, _, _, _ := createPrefetcher(t) + oracle := newLegacyPrecompileOracle(asOracleFn(t, prefetcher), asHinter(t, prefetcher)) + + result, ok := oracle.Precompile(test.addr, test.input) + require.Equal(t, test.result[0] == 1, ok) + require.EqualValues(t, test.result[1:], result) + + key := crypto.Keccak256Hash(append(test.addr.Bytes(), test.input...)) + val, err := prefetcher.kvStore.Get(preimage.Keccak256Key(key).PreimageKey()) + require.NoError(t, err) + require.NotEmpty(t, val) + + val, err = prefetcher.kvStore.Get(preimage.PrecompileKey(key).PreimageKey()) + require.NoError(t, err) + require.EqualValues(t, test.result, val) + }) + } + + t.Run("Already Known", func(t *testing.T) { + input := []byte("test input") + addr := common.BytesToAddress([]byte{0x1}) + result := []byte{0x1} + prefetcher, _, _, _, kv := createPrefetcher(t) + err := kv.Put(preimage.PrecompileKey(crypto.Keccak256Hash(append(addr.Bytes(), input...))).PreimageKey(), append([]byte{1}, result...)) + require.NoError(t, err) + + oracle := newLegacyPrecompileOracle(asOracleFn(t, prefetcher), asHinter(t, prefetcher)) + actualResult, status := oracle.Precompile(addr, input) + require.EqualValues(t, result, actualResult) + require.True(t, status) + }) +} + +func TestFetchPrecompileResultV2(t *testing.T) { + failure := []byte{0} + success := []byte{1} + + tests := []struct { + name string + addr common.Address + input []byte + requiredGas uint64 + result []byte + }{ + { + name: "EcRecover-Valid", + addr: common.BytesToAddress([]byte{0x1}), + input: ecRecoverInput, + requiredGas: 3000, + result: append(success, common.FromHex("000000000000000000000000a94f5374fce5edbc8e2a8697c15331677e6ebf0b")...), + }, { - name: "KzgPointEvaluation-Valid", - addr: common.BytesToAddress([]byte{0xa}), - input: kzgPointEvalInput, - result: append(success, common.FromHex("000000000000000000000000000000000000000000000000000000000000100073eda753299d7d483339d80809a1d80553bda402fffe5bfeffffffff00000001")...), + name: "Bn256Pairing-Valid", + addr: common.BytesToAddress([]byte{0x8}), + input: []byte{}, // empty is valid + requiredGas: 6000, + result: append(success, common.FromHex("0000000000000000000000000000000000000000000000000000000000000001")...), }, { - name: "KzgPointEvaluation-Invalid", - addr: common.BytesToAddress([]byte{0xa}), - input: []byte{0x0}, - result: failure, + name: "Bn256Pairing-Invalid", + addr: common.BytesToAddress([]byte{0x8}), + input: []byte{0x1}, + requiredGas: 6000, + result: failure, + }, + { + name: "KzgPointEvaluation-Valid", + addr: common.BytesToAddress([]byte{0xa}), + input: kzgPointEvalInput, + requiredGas: 50_000, + result: append(success, common.FromHex("000000000000000000000000000000000000000000000000000000000000100073eda753299d7d483339d80809a1d80553bda402fffe5bfeffffffff00000001")...), + }, + { + name: "KzgPointEvaluation-Invalid", + addr: common.BytesToAddress([]byte{0xa}), + input: []byte{0x0}, + requiredGas: 50_000, + result: failure, }, } for _, test := range tests { @@ -270,11 +356,11 @@ func TestFetchPrecompileResult(t *testing.T) { prefetcher, _, _, _, _ := createPrefetcher(t) oracle := l1.NewPreimageOracle(asOracleFn(t, prefetcher), asHinter(t, prefetcher)) - result, ok := oracle.Precompile(test.addr, test.input) + result, ok := oracle.Precompile(test.addr, test.input, test.requiredGas) require.Equal(t, test.result[0] == 1, ok) require.EqualValues(t, test.result[1:], result) - key := crypto.Keccak256Hash(append(test.addr.Bytes(), test.input...)) + key := crypto.Keccak256Hash(append(append(test.addr.Bytes(), binary.BigEndian.AppendUint64(nil, test.requiredGas)...), test.input...)) val, err := prefetcher.kvStore.Get(preimage.Keccak256Key(key).PreimageKey()) require.NoError(t, err) require.NotEmpty(t, val) @@ -287,19 +373,35 @@ func TestFetchPrecompileResult(t *testing.T) { t.Run("Already Known", func(t *testing.T) { input := []byte("test input") + requiredGas := uint64(3000) addr := common.BytesToAddress([]byte{0x1}) result := []byte{0x1} prefetcher, _, _, _, kv := createPrefetcher(t) - err := kv.Put(preimage.PrecompileKey(crypto.Keccak256Hash(append(addr.Bytes(), input...))).PreimageKey(), append([]byte{1}, result...)) + keyArg := append(addr.Bytes(), binary.BigEndian.AppendUint64(nil, requiredGas)...) + keyArg = append(keyArg, input...) + err := kv.Put(preimage.PrecompileKey(crypto.Keccak256Hash(keyArg)).PreimageKey(), append([]byte{1}, result...)) require.NoError(t, err) oracle := l1.NewPreimageOracle(asOracleFn(t, prefetcher), asHinter(t, prefetcher)) - actualResult, status := oracle.Precompile(addr, input) + actualResult, status := oracle.Precompile(addr, input, requiredGas) require.EqualValues(t, actualResult, result) require.True(t, status) }) } +func TestUnsupportedPrecompile(t *testing.T) { + prefetcher, _, _, _, _ := createPrefetcher(t) + oracleFn := func(t *testing.T, prefetcher *Prefetcher) preimage.OracleFn { + return func(key preimage.Key) []byte { + _, err := prefetcher.GetPreimage(context.Background(), key.PreimageKey()) + require.ErrorContains(t, err, "unsupported precompile address") + return []byte{1} + } + } + oracle := newLegacyPrecompileOracle(oracleFn(t, prefetcher), asHinter(t, prefetcher)) + oracle.Precompile(common.HexToAddress("0xdead"), nil) +} + func TestRestrictedPrecompileContracts(t *testing.T) { for _, addr := range acceleratedPrecompiles { require.NotNil(t, getPrecompiledContract(addr)) @@ -596,3 +698,28 @@ func assertReceiptsEqual(t *testing.T, expectedRcpt types.Receipts, actualRcpt t require.Equal(t, expected, actual) } } + +// legacyOracleImpl is a wrapper around the new preimage.Oracle interface that uses the legacy preimage hint API. +// It's used to test backwards-compatibility with clients using legacy preimage hints. +type legacyPrecompileOracle struct { + oracle preimage.Oracle + hint preimage.Hinter +} + +func newLegacyPrecompileOracle(raw preimage.Oracle, hint preimage.Hinter) *legacyPrecompileOracle { + return &legacyPrecompileOracle{ + oracle: raw, + hint: hint, + } +} + +func (o *legacyPrecompileOracle) Precompile(address common.Address, input []byte) ([]byte, bool) { + hintBytes := append(address.Bytes(), input...) + o.hint.Hint(l1.PrecompileHint(hintBytes)) + key := preimage.PrecompileKey(crypto.Keccak256Hash(hintBytes)) + result := o.oracle.Get(key) + if len(result) == 0 { // must contain at least the status code + panic(fmt.Errorf("unexpected precompile oracle behavior, got result: %x", result)) + } + return result[1:], result[0] == 1 +} diff --git a/op-program/host/types/types.go b/op-program/host/types/types.go new file mode 100644 index 000000000000..7cb24b55f65d --- /dev/null +++ b/op-program/host/types/types.go @@ -0,0 +1,11 @@ +package types + +type DataFormat string + +const ( + DataFormatFile DataFormat = "file" + DataFormatDirectory DataFormat = "directory" + DataFormatPebble DataFormat = "pebble" +) + +var SupportedDataFormats = []DataFormat{DataFormatFile, DataFormatDirectory, DataFormatPebble} diff --git a/op-program/io/filechan.go b/op-program/io/filechan.go deleted file mode 100644 index 6edc9b5c84d3..000000000000 --- a/op-program/io/filechan.go +++ /dev/null @@ -1,59 +0,0 @@ -package io - -import ( - "errors" - "io" - "os" -) - -// FileChannel is a unidirectional channel for file I/O -type FileChannel interface { - io.ReadWriteCloser - // Reader returns the file that is used for reading. - Reader() *os.File - // Writer returns the file that is used for writing. - Writer() *os.File -} - -type ReadWritePair struct { - r *os.File - w *os.File -} - -// NewReadWritePair creates a new FileChannel that uses the given files -func NewReadWritePair(r *os.File, w *os.File) *ReadWritePair { - return &ReadWritePair{r: r, w: w} -} - -func (rw *ReadWritePair) Read(p []byte) (int, error) { - return rw.r.Read(p) -} - -func (rw *ReadWritePair) Write(p []byte) (int, error) { - return rw.w.Write(p) -} - -func (rw *ReadWritePair) Reader() *os.File { - return rw.r -} - -func (rw *ReadWritePair) Writer() *os.File { - return rw.w -} - -func (rw *ReadWritePair) Close() error { - return errors.Join(rw.r.Close(), rw.w.Close()) -} - -// CreateBidirectionalChannel creates a pair of FileChannels that are connected to each other. -func CreateBidirectionalChannel() (FileChannel, FileChannel, error) { - ar, bw, err := os.Pipe() - if err != nil { - return nil, nil, err - } - br, aw, err := os.Pipe() - if err != nil { - return nil, nil, err - } - return NewReadWritePair(ar, aw), NewReadWritePair(br, bw), nil -} diff --git a/op-program/scripts/build-prestates.sh b/op-program/scripts/build-prestates.sh new file mode 100755 index 000000000000..5394c7a135e0 --- /dev/null +++ b/op-program/scripts/build-prestates.sh @@ -0,0 +1,39 @@ +#!/bin/bash +set -euo pipefail +SCRIPTS_DIR=$(cd "$(dirname "${BASH_SOURCE[0]}")" && pwd) + +TMP_DIR=$(mktemp -d) +function cleanup() { + rm -rf "${TMP_DIR}" +} +trap cleanup EXIT +echo "Using temp dir: ${TMP_DIR}" +cd "${TMP_DIR}" + +# Need to check out a fresh copy of the monorepo so we can switch to specific tags without it also affecting the +# contents of this script (which is checked into the repo). +git clone https://github.com/ethereum-optimism/optimism --recurse-submodules + +STATES_DIR="${SCRIPTS_DIR}/../temp/states" +LOGS_DIR="${SCRIPTS_DIR}/../temp/logs" +REPO_DIR="${TMP_DIR}/optimism" +BIN_DIR="${REPO_DIR}/op-program/bin/" + +mkdir -p "${STATES_DIR}" "${LOGS_DIR}" + +cd "${REPO_DIR}" + +VERSIONS=$(git tag | grep 'op-program\/v') + +for VERSION in ${VERSIONS} +do + LOG_FILE="${LOGS_DIR}/build-$(echo "${VERSION}" | cut -c 12-).txt" + echo "Building Version: ${VERSION} Logs: ${LOG_FILE}" + git checkout "${VERSION}" > "${LOG_FILE}" 2>&1 + make reproducible-prestate >> "${LOG_FILE}" 2>&1 + HASH=$(cat "${BIN_DIR}/prestate-proof.json" | jq -r .pre) + cp "${BIN_DIR}/prestate.json" "${STATES_DIR}/${HASH}.json" + echo "Built ${VERSION}: ${HASH}" +done + +echo "All prestates successfully built and available in ${STATES_DIR}" diff --git a/op-program/scripts/run-compat.sh b/op-program/scripts/run-compat.sh index c01fb7d1af00..9849b8da8938 100755 --- a/op-program/scripts/run-compat.sh +++ b/op-program/scripts/run-compat.sh @@ -5,7 +5,7 @@ SCRIPTS_DIR=$(cd "$(dirname "${BASH_SOURCE[0]}")" && pwd) COMPAT_DIR="${SCRIPTS_DIR}/../temp/compat" TESTNAME="${1?Must specify compat file to run}" -BASEURL="${2:-https://github.com/ethereum-optimism/chain-test-data/releases/download/2024-03-14.3}" +BASEURL="${2:-https://github.com/ethereum-optimism/chain-test-data/releases/download/2024-09-01}" URL="${BASEURL}/${TESTNAME}.tar.bz" @@ -13,4 +13,4 @@ mkdir -p "${COMPAT_DIR}" curl --etag-save "${COMPAT_DIR}/${TESTNAME}-etag.txt" --etag-compare "${COMPAT_DIR}/${TESTNAME}-etag.txt" -L --fail -o "${COMPAT_DIR}/${TESTNAME}.tar.bz" "${URL}" tar jxf "${COMPAT_DIR}/${TESTNAME}.tar.bz" -C "${COMPAT_DIR}" # shellcheck disable=SC2046 -"${SCRIPTS_DIR}/../bin/op-program" $(cat "${COMPAT_DIR}/${TESTNAME}/args.txt") +"${SCRIPTS_DIR}/../bin/op-program" --data.format=pebble $(cat "${COMPAT_DIR}/${TESTNAME}/args.txt") diff --git a/op-proposer/Makefile b/op-proposer/Makefile index dff47b41d799..561d7d32f301 100644 --- a/op-proposer/Makefile +++ b/op-proposer/Makefile @@ -20,7 +20,7 @@ LDFLAGSSTRING +=-X main.Version=$(VERSION) LDFLAGS := -ldflags "$(LDFLAGSSTRING)" op-proposer: - env GO111MODULE=on GOOS=$(TARGETOS) GOARCH=$(TARGETARCH) go build -v $(LDFLAGS) -o ./bin/op-proposer ./cmd + env GO111MODULE=on GOOS=$(TARGETOS) GOARCH=$(TARGETARCH) CGO_ENABLED=0 go build -v $(LDFLAGS) -o ./bin/op-proposer ./cmd clean: rm bin/op-proposer diff --git a/op-proposer/bindings/disputegamefactory.go b/op-proposer/bindings/disputegamefactory.go deleted file mode 100644 index 1bfb6a73da2b..000000000000 --- a/op-proposer/bindings/disputegamefactory.go +++ /dev/null @@ -1,1404 +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 -) - -// 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/cmd/main.go b/op-proposer/cmd/main.go index bdfc730b4bf3..cbb21fb28516 100644 --- a/op-proposer/cmd/main.go +++ b/op-proposer/cmd/main.go @@ -1,8 +1,11 @@ package main import ( + "context" "os" + "github.com/ethereum-optimism/optimism/op-service/ctxinterrupt" + opservice "github.com/ethereum-optimism/optimism/op-service" "github.com/urfave/cli/v2" @@ -38,7 +41,8 @@ func main() { }, } - err := app.Run(os.Args) + ctx := ctxinterrupt.WithSignalWaiterMain(context.Background()) + err := app.RunContext(ctx, os.Args) if err != nil { log.Crit("Application failed", "message", err) } diff --git a/op-proposer/contracts/disputegamefactory.go b/op-proposer/contracts/disputegamefactory.go new file mode 100644 index 000000000000..d267c87dc28d --- /dev/null +++ b/op-proposer/contracts/disputegamefactory.go @@ -0,0 +1,147 @@ +package contracts + +import ( + "context" + "fmt" + "math/big" + "time" + + "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" +) + +const ( + methodGameCount = "gameCount" + methodGameAtIndex = "gameAtIndex" + methodInitBonds = "initBonds" + methodCreateGame = "create" + methodVersion = "version" + + methodClaim = "claimData" +) + +type gameMetadata struct { + GameType uint32 + Timestamp time.Time + Address common.Address + Proposer common.Address +} + +type DisputeGameFactory struct { + caller *batching.MultiCaller + contract *batching.BoundContract + gameABI *abi.ABI + networkTimeout time.Duration +} + +func NewDisputeGameFactory(addr common.Address, caller *batching.MultiCaller, networkTimeout time.Duration) *DisputeGameFactory { + factoryABI := snapshots.LoadDisputeGameFactoryABI() + gameABI := snapshots.LoadFaultDisputeGameABI() + return &DisputeGameFactory{ + caller: caller, + contract: batching.NewBoundContract(factoryABI, addr), + gameABI: gameABI, + networkTimeout: networkTimeout, + } +} + +func (f *DisputeGameFactory) Version(ctx context.Context) (string, error) { + cCtx, cancel := context.WithTimeout(ctx, f.networkTimeout) + defer cancel() + result, err := f.caller.SingleCall(cCtx, rpcblock.Latest, f.contract.Call(methodVersion)) + if err != nil { + return "", fmt.Errorf("failed to get version: %w", err) + } + return result.GetString(0), nil +} + +// HasProposedSince attempts to find a game with the specified game type created by the specified proposer after the +// given cut off time. If one is found, returns true and the time the game was created at. +// If no matching proposal is found, returns false, time.Time{}, nil +func (f *DisputeGameFactory) HasProposedSince(ctx context.Context, proposer common.Address, cutoff time.Time, gameType uint32) (bool, time.Time, error) { + gameCount, err := f.gameCount(ctx) + if err != nil { + return false, time.Time{}, fmt.Errorf("failed to get dispute game count: %w", err) + } + if gameCount == 0 { + return false, time.Time{}, nil + } + for idx := gameCount - 1; ; idx-- { + game, err := f.gameAtIndex(ctx, idx) + if err != nil { + return false, time.Time{}, fmt.Errorf("failed to get dispute game %d: %w", idx, err) + } + if game.Timestamp.Before(cutoff) { + // Reached a game that is before the expected cutoff, so we haven't found a suitable proposal + return false, time.Time{}, nil + } + if game.GameType == gameType && game.Proposer == proposer { + // Found a matching proposal + return true, game.Timestamp, nil + } + if idx == 0 { // Need to check here rather than in the for condition to avoid underflow + // Checked every game and didn't find a match + return false, time.Time{}, nil + } + } +} + +func (f *DisputeGameFactory) ProposalTx(ctx context.Context, gameType uint32, outputRoot common.Hash, l2BlockNum uint64) (txmgr.TxCandidate, error) { + cCtx, cancel := context.WithTimeout(ctx, f.networkTimeout) + defer cancel() + result, err := f.caller.SingleCall(cCtx, rpcblock.Latest, f.contract.Call(methodInitBonds, gameType)) + if err != nil { + return txmgr.TxCandidate{}, fmt.Errorf("failed to fetch init bond: %w", err) + } + initBond := result.GetBigInt(0) + call := f.contract.Call(methodCreateGame, gameType, outputRoot, common.BigToHash(big.NewInt(int64(l2BlockNum))).Bytes()) + candidate, err := call.ToTxCandidate() + if err != nil { + return txmgr.TxCandidate{}, err + } + candidate.Value = initBond + return candidate, err +} + +func (f *DisputeGameFactory) gameCount(ctx context.Context) (uint64, error) { + cCtx, cancel := context.WithTimeout(ctx, f.networkTimeout) + defer cancel() + result, err := f.caller.SingleCall(cCtx, rpcblock.Latest, f.contract.Call(methodGameCount)) + if err != nil { + return 0, fmt.Errorf("failed to load game count: %w", err) + } + return result.GetBigInt(0).Uint64(), nil +} + +func (f *DisputeGameFactory) gameAtIndex(ctx context.Context, idx uint64) (gameMetadata, error) { + cCtx, cancel := context.WithTimeout(ctx, f.networkTimeout) + defer cancel() + result, err := f.caller.SingleCall(cCtx, rpcblock.Latest, f.contract.Call(methodGameAtIndex, new(big.Int).SetUint64(idx))) + if err != nil { + return gameMetadata{}, fmt.Errorf("failed to load game %v: %w", idx, err) + } + gameType := result.GetUint32(0) + timestamp := result.GetUint64(1) + address := result.GetAddress(2) + + gameContract := batching.NewBoundContract(f.gameABI, address) + cCtx, cancel = context.WithTimeout(ctx, f.networkTimeout) + defer cancel() + result, err = f.caller.SingleCall(cCtx, rpcblock.Latest, gameContract.Call(methodClaim, big.NewInt(0))) + if err != nil { + return gameMetadata{}, fmt.Errorf("failed to load root claim of game %v: %w", idx, err) + } + // We don't need most of the claim data, only the claimant which is the game proposer + claimant := result.GetAddress(2) + + return gameMetadata{ + GameType: gameType, + Timestamp: time.Unix(int64(timestamp), 0), + Address: address, + Proposer: claimant, + }, nil +} diff --git a/op-proposer/contracts/disputegamefactory_test.go b/op-proposer/contracts/disputegamefactory_test.go new file mode 100644 index 000000000000..8344dcea11f1 --- /dev/null +++ b/op-proposer/contracts/disputegamefactory_test.go @@ -0,0 +1,226 @@ +package contracts + +import ( + "context" + "math" + "math/big" + "testing" + "time" + + "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 factoryAddr = common.Address{0xff, 0xff} +var proposerAddr = common.Address{0xaa, 0xbb} + +func TestHasProposedSince(t *testing.T) { + cutOffTime := time.Unix(1000, 0) + + t.Run("NoProposals", func(t *testing.T) { + stubRpc, factory := setupDisputeGameFactoryTest(t) + withClaims(stubRpc) + + proposed, proposalTime, err := factory.HasProposedSince(context.Background(), proposerAddr, cutOffTime, 0) + require.NoError(t, err) + require.False(t, proposed) + require.Equal(t, time.Time{}, proposalTime) + }) + + t.Run("NoMatchingProposal", func(t *testing.T) { + stubRpc, factory := setupDisputeGameFactoryTest(t) + withClaims( + stubRpc, + gameMetadata{ + GameType: 0, + Timestamp: time.Unix(1600, 0), + Address: common.Address{0x22}, + Proposer: common.Address{0xee}, // Wrong proposer + }, + gameMetadata{ + GameType: 1, // Wrong game type + Timestamp: time.Unix(1700, 0), + Address: common.Address{0x33}, + Proposer: proposerAddr, + }, + ) + + proposed, proposalTime, err := factory.HasProposedSince(context.Background(), proposerAddr, cutOffTime, 0) + require.NoError(t, err) + require.False(t, proposed) + require.Equal(t, time.Time{}, proposalTime) + }) + + t.Run("MatchingProposalBeforeCutOff", func(t *testing.T) { + stubRpc, factory := setupDisputeGameFactoryTest(t) + withClaims( + stubRpc, + gameMetadata{ + GameType: 0, + Timestamp: time.Unix(999, 0), + Address: common.Address{0x11}, + Proposer: proposerAddr, + }, + gameMetadata{ + GameType: 0, + Timestamp: time.Unix(1600, 0), + Address: common.Address{0x22}, + Proposer: common.Address{0xee}, // Wrong proposer + }, + gameMetadata{ + GameType: 1, // Wrong game type + Timestamp: time.Unix(1700, 0), + Address: common.Address{0x33}, + Proposer: proposerAddr, + }, + ) + + proposed, proposalTime, err := factory.HasProposedSince(context.Background(), proposerAddr, cutOffTime, 0) + require.NoError(t, err) + require.False(t, proposed) + require.Equal(t, time.Time{}, proposalTime) + }) + + t.Run("MatchingProposalAtCutOff", func(t *testing.T) { + stubRpc, factory := setupDisputeGameFactoryTest(t) + withClaims( + stubRpc, + gameMetadata{ + GameType: 0, + Timestamp: cutOffTime, + Address: common.Address{0x11}, + Proposer: proposerAddr, + }, + gameMetadata{ + GameType: 0, + Timestamp: time.Unix(1600, 0), + Address: common.Address{0x22}, + Proposer: common.Address{0xee}, // Wrong proposer + }, + gameMetadata{ + GameType: 1, // Wrong game type + Timestamp: time.Unix(1700, 0), + Address: common.Address{0x33}, + Proposer: proposerAddr, + }, + ) + + proposed, proposalTime, err := factory.HasProposedSince(context.Background(), proposerAddr, cutOffTime, 0) + require.NoError(t, err) + require.True(t, proposed) + require.Equal(t, cutOffTime, proposalTime) + }) + + t.Run("MatchingProposalAfterCutOff", func(t *testing.T) { + stubRpc, factory := setupDisputeGameFactoryTest(t) + expectedProposalTime := time.Unix(1100, 0) + withClaims( + stubRpc, + gameMetadata{ + GameType: 0, + Timestamp: expectedProposalTime, + Address: common.Address{0x11}, + Proposer: proposerAddr, + }, + gameMetadata{ + GameType: 0, + Timestamp: time.Unix(1600, 0), + Address: common.Address{0x22}, + Proposer: common.Address{0xee}, // Wrong proposer + }, + gameMetadata{ + GameType: 1, // Wrong game type + Timestamp: time.Unix(1700, 0), + Address: common.Address{0x33}, + Proposer: proposerAddr, + }, + ) + + proposed, proposalTime, err := factory.HasProposedSince(context.Background(), proposerAddr, cutOffTime, 0) + require.NoError(t, err) + require.True(t, proposed) + require.Equal(t, expectedProposalTime, proposalTime) + }) + + t.Run("MultipleMatchingProposalAfterCutOff", func(t *testing.T) { + stubRpc, factory := setupDisputeGameFactoryTest(t) + expectedProposalTime := time.Unix(1600, 0) + withClaims( + stubRpc, + gameMetadata{ + GameType: 0, + Timestamp: time.Unix(1400, 0), + Address: common.Address{0x11}, + Proposer: proposerAddr, + }, + gameMetadata{ + GameType: 0, + Timestamp: time.Unix(1500, 0), + Address: common.Address{0x22}, + Proposer: proposerAddr, + }, + gameMetadata{ + GameType: 0, + Timestamp: expectedProposalTime, + Address: common.Address{0x33}, + Proposer: proposerAddr, + }, + ) + + proposed, proposalTime, err := factory.HasProposedSince(context.Background(), proposerAddr, cutOffTime, 0) + require.NoError(t, err) + require.True(t, proposed) + // Should find the most recent proposal + require.Equal(t, expectedProposalTime, proposalTime) + }) +} + +func TestProposalTx(t *testing.T) { + stubRpc, factory := setupDisputeGameFactoryTest(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.ProposalTx(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 withClaims(stubRpc *batchingTest.AbiBasedRpc, games ...gameMetadata) { + gameAbi := snapshots.LoadFaultDisputeGameABI() + stubRpc.SetResponse(factoryAddr, methodGameCount, rpcblock.Latest, nil, []interface{}{big.NewInt(int64(len(games)))}) + for i, game := range games { + stubRpc.SetResponse(factoryAddr, methodGameAtIndex, rpcblock.Latest, []interface{}{big.NewInt(int64(i))}, []interface{}{ + game.GameType, + uint64(game.Timestamp.Unix()), + game.Address, + }) + stubRpc.AddContract(game.Address, gameAbi) + stubRpc.SetResponse(game.Address, methodClaim, rpcblock.Latest, []interface{}{big.NewInt(0)}, []interface{}{ + uint32(math.MaxUint32), // Parent address (none for root claim) + common.Address{}, // Countered by + game.Proposer, // Claimant + big.NewInt(1000), // Bond + common.Hash{0xdd}, // Claim + big.NewInt(1), // Position (gindex 1 for root position) + big.NewInt(100), // Clock + }) + } +} + +func setupDisputeGameFactoryTest(t *testing.T) (*batchingTest.AbiBasedRpc, *DisputeGameFactory) { + fdgAbi := snapshots.LoadDisputeGameFactoryABI() + + stubRpc := batchingTest.NewAbiBasedRpc(t, factoryAddr, fdgAbi) + caller := batching.NewMultiCaller(stubRpc, batching.DefaultBatchSize) + factory := NewDisputeGameFactory(factoryAddr, caller, time.Minute) + return stubRpc, factory +} diff --git a/op-proposer/flags/flags.go b/op-proposer/flags/flags.go index 4321e000fe2f..f00420454423 100644 --- a/op-proposer/flags/flags.go +++ b/op-proposer/flags/flags.go @@ -41,8 +41,8 @@ var ( } PollIntervalFlag = &cli.DurationFlag{ Name: "poll-interval", - Usage: "How frequently to poll L2 for new blocks", - Value: 6 * time.Second, + Usage: "How frequently to poll L2 for new blocks (legacy L2OO)", + Value: 12 * time.Second, EnvVars: prefixEnvVars("POLL_INTERVAL"), } AllowNonFinalizedFlag = &cli.BoolFlag{ diff --git a/op-proposer/proposer/abi_test.go b/op-proposer/proposer/abi_test.go index 47c2d8c11acc..21972dab91f7 100644 --- a/op-proposer/proposer/abi_test.go +++ b/op-proposer/proposer/abi_test.go @@ -11,7 +11,6 @@ import ( "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/types" "github.com/ethereum/go-ethereum/crypto" "github.com/ethereum/go-ethereum/params" @@ -46,23 +45,6 @@ func setupL2OutputOracle() (common.Address, *bind.TransactOpts, *backends.Simula return from, opts, backend, contract, nil } -// setupDisputeGameFactory deploys the DisputeGameFactory contract to a simulated backend -func setupDisputeGameFactory() (common.Address, *bind.TransactOpts, *backends.SimulatedBackend, *bindings.DisputeGameFactory, error) { - _, from, opts, backend, err := simulatedBackend() - if err != nil { - return common.Address{}, nil, nil, nil, err - } - - _, _, contract, err := bindings.DeployDisputeGameFactory( - opts, - backend, - ) - if err != nil { - return common.Address{}, nil, nil, nil, err - } - return from, opts, backend, contract, nil -} - // TestManualABIPacking ensure that the manual ABI packing is the same as going through the bound contract. // We don't use the contract to transact because it does not fit our transaction management scheme, but // we want to make sure that we don't incorrectly create the transaction data. @@ -92,28 +74,4 @@ func TestManualABIPacking(t *testing.T) { require.NoError(t, err) require.Equal(t, txData, tx.Data()) - - // DGF - _, opts, _, dgf, err := setupDisputeGameFactory() - require.NoError(t, err) - rng = rand.New(rand.NewSource(1234)) - - dgfAbi, err := bindings.DisputeGameFactoryMetaData.GetAbi() - require.NoError(t, err) - - output = testutils.RandomOutputResponse(rng) - - txData, err = proposeL2OutputDGFTxData(dgfAbi, uint32(0), output) - require.NoError(t, err) - - opts.GasLimit = 100_000 - dgfTx, err := dgf.Create( - opts, - uint32(0), - output.OutputRoot, - math.U256Bytes(new(big.Int).SetUint64(output.BlockRef.Number)), - ) - require.NoError(t, err) - - require.Equal(t, txData, dgfTx.Data()) } diff --git a/op-proposer/proposer/driver.go b/op-proposer/proposer/driver.go index 1278e863b1c7..09f5f03179e8 100644 --- a/op-proposer/proposer/driver.go +++ b/op-proposer/proposer/driver.go @@ -5,23 +5,22 @@ import ( "errors" "fmt" "math/big" - _ "net/http/pprof" "sync" "time" + "github.com/ethereum-optimism/optimism/op-proposer/bindings" + "github.com/ethereum-optimism/optimism/op-proposer/contracts" + "github.com/ethereum-optimism/optimism/op-proposer/metrics" + "github.com/ethereum-optimism/optimism/op-service/dial" + "github.com/ethereum-optimism/optimism/op-service/eth" + "github.com/ethereum-optimism/optimism/op-service/sources/batching" + "github.com/ethereum-optimism/optimism/op-service/txmgr" "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/common/math" "github.com/ethereum/go-ethereum/core/types" "github.com/ethereum/go-ethereum/log" - - "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" - "github.com/ethereum-optimism/optimism/op-service/txmgr" ) var ( @@ -40,17 +39,29 @@ type L1Client interface { CallContract(ctx context.Context, call ethereum.CallMsg, blockNumber *big.Int) ([]byte, error) } +type L2OOContract interface { + Version(*bind.CallOpts) (string, error) + NextBlockNumber(*bind.CallOpts) (*big.Int, error) +} + +type DGFContract interface { + Version(ctx context.Context) (string, error) + HasProposedSince(ctx context.Context, proposer common.Address, cutoff time.Time, gameType uint32) (bool, time.Time, error) + ProposalTx(ctx context.Context, gameType uint32, outputRoot common.Hash, l2BlockNum uint64) (txmgr.TxCandidate, error) +} + type RollupClient interface { SyncStatus(ctx context.Context) (*eth.SyncStatus, error) OutputAtBlock(ctx context.Context, blockNum uint64) (*eth.OutputResponse, error) } type DriverSetup struct { - Log log.Logger - Metr metrics.Metricer - Cfg ProposerConfig - Txmgr txmgr.TxManager - L1Client L1Client + Log log.Logger + Metr metrics.Metricer + Cfg ProposerConfig + Txmgr txmgr.TxManager + L1Client L1Client + Multicaller *batching.MultiCaller // RollupProvider's RollupClient() is used to retrieve output roots from RollupProvider dial.RollupProvider @@ -69,11 +80,10 @@ type L2OutputSubmitter struct { mutex sync.Mutex running bool - l2ooContract *bindings.L2OutputOracleCaller + l2ooContract L2OOContract l2ooABI *abi.ABI - dgfContract *bindings.DisputeGameFactoryCaller - dgfABI *abi.ABI + dgfContract DGFContract } // NewL2OutputSubmitter creates a new L2 Output Submitter @@ -131,27 +141,15 @@ func newL2OOSubmitter(ctx context.Context, cancel context.CancelFunc, setup Driv } func newDGFSubmitter(ctx context.Context, cancel context.CancelFunc, setup DriverSetup) (*L2OutputSubmitter, error) { - dgfCaller, err := bindings.NewDisputeGameFactoryCaller(*setup.Cfg.DisputeGameFactoryAddr, setup.L1Client) - if err != nil { - cancel() - return nil, fmt.Errorf("failed to create DGF at address %s: %w", setup.Cfg.DisputeGameFactoryAddr, err) - } + dgfCaller := contracts.NewDisputeGameFactory(*setup.Cfg.DisputeGameFactoryAddr, setup.Multicaller, setup.Cfg.NetworkTimeout) - cCtx, cCancel := context.WithTimeout(ctx, setup.Cfg.NetworkTimeout) - defer cCancel() - version, err := dgfCaller.Version(&bind.CallOpts{Context: cCtx}) + version, err := dgfCaller.Version(ctx) if err != nil { cancel() return nil, err } log.Info("Connected to DisputeGameFactory", "address", setup.Cfg.DisputeGameFactoryAddr, "version", version) - parsed, err := bindings.DisputeGameFactoryMetaData.GetAbi() - if err != nil { - cancel() - return nil, err - } - return &L2OutputSubmitter{ DriverSetup: setup, done: make(chan struct{}), @@ -159,7 +157,6 @@ func newDGFSubmitter(ctx context.Context, cancel context.CancelFunc, setup Drive cancel: cancel, dgfContract: dgfCaller, - dgfABI: parsed, }, nil } @@ -174,6 +171,13 @@ func (l *L2OutputSubmitter) StartL2OutputSubmitting() error { } l.running = true + if l.Cfg.WaitNodeSync { + err := l.waitNodeSync() + if err != nil { + return fmt.Errorf("error waiting for node sync: %w", err) + } + } + l.wg.Add(1) go l.loop() @@ -208,9 +212,12 @@ func (l *L2OutputSubmitter) StopL2OutputSubmitting() error { return nil } -// FetchNextOutputInfo gets the block number of the next proposal. -// It returns: the next block number, if the proposal should be made, error -func (l *L2OutputSubmitter) FetchNextOutputInfo(ctx context.Context) (*eth.OutputResponse, bool, error) { +// FetchL2OOOutput gets the next output proposal for the L2OO. +// It queries the L2OO for the earliest next block number that should be proposed. +// It returns the output to propose, and whether the proposal should be submitted at all. +// The passed context is expected to be a lifecycle context. A network timeout +// context will be derived from it. +func (l *L2OutputSubmitter) FetchL2OOOutput(ctx context.Context) (*eth.OutputResponse, bool, error) { if l.l2ooContract == nil { return nil, false, fmt.Errorf("L2OutputOracle contract not set, cannot fetch next output info") } @@ -221,11 +228,11 @@ func (l *L2OutputSubmitter) FetchNextOutputInfo(ctx context.Context) (*eth.Outpu From: l.Txmgr.From(), Context: cCtx, } - nextCheckpointBlock, err := l.l2ooContract.NextBlockNumber(callOpts) + nextCheckpointBlockBig, err := l.l2ooContract.NextBlockNumber(callOpts) if err != nil { - l.Log.Error("proposer unable to get next block number", "err", err) - return nil, false, err + return nil, false, fmt.Errorf("querying next block number: %w", err) } + nextCheckpointBlock := nextCheckpointBlockBig.Uint64() // Fetch the current L2 heads currentBlockNumber, err := l.FetchCurrentBlockNumber(ctx) if err != nil { @@ -233,73 +240,102 @@ func (l *L2OutputSubmitter) FetchNextOutputInfo(ctx context.Context) (*eth.Outpu } // Ensure that we do not submit a block in the future - if currentBlockNumber.Cmp(nextCheckpointBlock) < 0 { - l.Log.Debug("proposer submission interval has not elapsed", "currentBlockNumber", currentBlockNumber, "nextBlockNumber", nextCheckpointBlock) + if currentBlockNumber < nextCheckpointBlock { + l.Log.Debug("Proposer submission interval has not elapsed", "currentBlockNumber", currentBlockNumber, "nextBlockNumber", nextCheckpointBlock) return nil, false, nil } - return l.FetchOutput(ctx, nextCheckpointBlock) + output, err := l.FetchOutput(ctx, nextCheckpointBlock) + if err != nil { + return nil, false, fmt.Errorf("fetching output: %w", err) + } + + // Always propose if it's part of the Finalized L2 chain. Or if allowed, if it's part of the safe L2 chain. + if output.BlockRef.Number > output.Status.FinalizedL2.Number && (!l.Cfg.AllowNonFinalized || output.BlockRef.Number > output.Status.SafeL2.Number) { + l.Log.Debug("Not proposing yet, L2 block is not ready for proposal", + "l2_proposal", output.BlockRef, + "l2_safe", output.Status.SafeL2, + "l2_finalized", output.Status.FinalizedL2, + "allow_non_finalized", l.Cfg.AllowNonFinalized) + return output, false, nil + } + return output, true, nil +} + +// FetchDGFOutput queries the DGF for the latest game and infers whether it is time to make another proposal +// If necessary, it gets the next output proposal for the DGF, and returns it along with +// a boolean for whether the proposal should be submitted at all. +// The passed context is expected to be a lifecycle context. A network timeout +// context will be derived from it. +func (l *L2OutputSubmitter) FetchDGFOutput(ctx context.Context) (*eth.OutputResponse, bool, error) { + cutoff := time.Now().Add(-l.Cfg.ProposalInterval) + proposedRecently, proposalTime, err := l.dgfContract.HasProposedSince(ctx, l.Txmgr.From(), cutoff, l.Cfg.DisputeGameType) + if err != nil { + return nil, false, fmt.Errorf("could not check for recent proposal: %w", err) + } + + if proposedRecently { + l.Log.Debug("Duration since last game not past proposal interval", "duration", time.Since(proposalTime)) + return nil, false, nil + } + l.Log.Info("No proposals found for at least proposal interval, submitting proposal now", "proposalInterval", l.Cfg.ProposalInterval) + + // Fetch the current L2 heads + currentBlockNumber, err := l.FetchCurrentBlockNumber(ctx) + if err != nil { + return nil, false, fmt.Errorf("could not fetch current block number: %w", err) + } + + if currentBlockNumber == 0 { + l.Log.Info("Skipping proposal for genesis block") + return nil, false, nil + } + + output, err := l.FetchOutput(ctx, currentBlockNumber) + if err != nil { + return nil, false, fmt.Errorf("could not fetch output at current block number %d: %w", currentBlockNumber, err) + } + + return output, true, nil } // FetchCurrentBlockNumber gets the current block number from the [L2OutputSubmitter]'s [RollupClient]. If the `AllowNonFinalized` configuration // option is set, it will return the safe head block number, and if not, it will return the finalized head block number. -func (l *L2OutputSubmitter) FetchCurrentBlockNumber(ctx context.Context) (*big.Int, error) { - cCtx, cancel := context.WithTimeout(ctx, l.Cfg.NetworkTimeout) - defer cancel() - rollupClient, err := l.RollupProvider.RollupClient(cCtx) +func (l *L2OutputSubmitter) FetchCurrentBlockNumber(ctx context.Context) (uint64, error) { + rollupClient, err := l.RollupProvider.RollupClient(ctx) if err != nil { - l.Log.Error("proposer unable to get rollup client", "err", err) - return nil, err + return 0, fmt.Errorf("getting rollup client: %w", err) } - status, err := rollupClient.SyncStatus(cCtx) + + status, err := rollupClient.SyncStatus(ctx) if err != nil { - l.Log.Error("proposer unable to get sync status", "err", err) - return nil, err + return 0, fmt.Errorf("getting sync status: %w", err) } // Use either the finalized or safe head depending on the config. Finalized head is default & safer. - var currentBlockNumber *big.Int if l.Cfg.AllowNonFinalized { - currentBlockNumber = new(big.Int).SetUint64(status.SafeL2.Number) - } else { - currentBlockNumber = new(big.Int).SetUint64(status.FinalizedL2.Number) + return status.SafeL2.Number, nil } - return currentBlockNumber, nil + return status.FinalizedL2.Number, nil } -func (l *L2OutputSubmitter) FetchOutput(ctx context.Context, block *big.Int) (*eth.OutputResponse, bool, error) { - ctx, cancel := context.WithTimeout(ctx, l.Cfg.NetworkTimeout) - defer cancel() - +func (l *L2OutputSubmitter) FetchOutput(ctx context.Context, block uint64) (*eth.OutputResponse, error) { rollupClient, err := l.RollupProvider.RollupClient(ctx) if err != nil { - l.Log.Error("proposer unable to get rollup client", "err", err) - return nil, false, err + return nil, fmt.Errorf("getting rollup client: %w", err) } - output, err := rollupClient.OutputAtBlock(ctx, block.Uint64()) + + output, err := rollupClient.OutputAtBlock(ctx, block) if err != nil { - l.Log.Error("failed to fetch output at block", "block", block, "err", err) - return nil, false, err + return nil, fmt.Errorf("fetching output at block %d: %w", block, err) } if output.Version != supportedL2OutputVersion { - l.Log.Error("unsupported l2 output version", "output_version", output.Version, "supported_version", supportedL2OutputVersion) - return nil, false, errors.New("unsupported l2 output version") + return nil, fmt.Errorf("unsupported l2 output version: %v, supported: %v", output.Version, supportedL2OutputVersion) } - if output.BlockRef.Number != block.Uint64() { // sanity check, e.g. in case of bad RPC caching - l.Log.Error("invalid blockNumber", "next_block", block, "output_block", output.BlockRef.Number) - return nil, false, errors.New("invalid blockNumber") + if onum := output.BlockRef.Number; onum != block { // sanity check, e.g. in case of bad RPC caching + return nil, fmt.Errorf("output block number %d mismatches requested %d", output.BlockRef.Number, block) } - - // Always propose if it's part of the Finalized L2 chain. Or if allowed, if it's part of the safe L2 chain. - if output.BlockRef.Number > output.Status.FinalizedL2.Number && (!l.Cfg.AllowNonFinalized || output.BlockRef.Number > output.Status.SafeL2.Number) { - l.Log.Debug("not proposing yet, L2 block is not ready for proposal", - "l2_proposal", output.BlockRef, - "l2_safe", output.Status.SafeL2, - "l2_finalized", output.Status.FinalizedL2, - "allow_non_finalized", l.Cfg.AllowNonFinalized) - return nil, false, nil - } - return output, true, nil + return output, nil } // ProposeL2OutputTxData creates the transaction data for the ProposeL2Output function @@ -317,21 +353,10 @@ func proposeL2OutputTxData(abi *abi.ABI, output *eth.OutputResponse) ([]byte, er new(big.Int).SetUint64(output.Status.CurrentL1.Number)) } -func (l *L2OutputSubmitter) ProposeL2OutputDGFTxData(output *eth.OutputResponse) ([]byte, *big.Int, error) { - bond, err := l.dgfContract.InitBonds(&bind.CallOpts{}, l.Cfg.DisputeGameType) - if err != nil { - return nil, nil, err - } - data, err := proposeL2OutputDGFTxData(l.dgfABI, l.Cfg.DisputeGameType, output) - if err != nil { - return nil, nil, err - } - return data, bond, err -} - -// proposeL2OutputDGFTxData creates the transaction data for the DisputeGameFactory's `create` function -func proposeL2OutputDGFTxData(abi *abi.ABI, gameType uint32, output *eth.OutputResponse) ([]byte, error) { - return abi.Pack("create", gameType, output.OutputRoot, math.U256Bytes(new(big.Int).SetUint64(output.BlockRef.Number))) +func (l *L2OutputSubmitter) ProposeL2OutputDGFTxCandidate(ctx context.Context, output *eth.OutputResponse) (txmgr.TxCandidate, error) { + cCtx, cancel := context.WithTimeout(ctx, l.Cfg.NetworkTimeout) + defer cancel() + return l.dgfContract.ProposalTx(cCtx, l.Cfg.DisputeGameType, common.Hash(output.OutputRoot), output.BlockRef.Number) } // We wait until l1head advances beyond blocknum. This is used to make sure proposal tx won't @@ -348,7 +373,7 @@ func (l *L2OutputSubmitter) waitForL1Head(ctx context.Context, blockNum uint64) return err } for l1head <= blockNum { - l.Log.Debug("waiting for l1 head > l1blocknum1+1", "l1head", l1head, "l1blocknum", blockNum) + l.Log.Debug("Waiting for l1 head > l1blocknum1+1", "l1head", l1head, "l1blocknum", blockNum) select { case <-ticker.C: l1head, err = l.Txmgr.BlockNumber(ctx) @@ -369,18 +394,14 @@ func (l *L2OutputSubmitter) sendTransaction(ctx context.Context, output *eth.Out return err } + l.Log.Info("Proposing output root", "output", output.OutputRoot, "block", output.BlockRef) var receipt *types.Receipt if l.Cfg.DisputeGameFactoryAddr != nil { - data, bond, err := l.ProposeL2OutputDGFTxData(output) + candidate, err := l.ProposeL2OutputDGFTxCandidate(ctx, output) if err != nil { return err } - receipt, err = l.Txmgr.Send(ctx, txmgr.TxCandidate{ - TxData: data, - To: l.Cfg.DisputeGameFactoryAddr, - GasLimit: 0, - Value: bond, - }) + receipt, err = l.Txmgr.Send(ctx, candidate) if err != nil { return err } @@ -400,9 +421,9 @@ func (l *L2OutputSubmitter) sendTransaction(ctx context.Context, output *eth.Out } if receipt.Status == types.ReceiptStatusFailed { - l.Log.Error("proposer tx successfully published but reverted", "tx_hash", receipt.TxHash) + l.Log.Error("Proposer tx successfully published but reverted", "tx_hash", receipt.TxHash) } else { - l.Log.Info("proposer tx successfully published", + l.Log.Info("Proposer tx successfully published", "tx_hash", receipt.TxHash, "l1blocknum", output.Status.CurrentL1.Number, "l1blockhash", output.Status.CurrentL1.Hash) @@ -411,35 +432,60 @@ func (l *L2OutputSubmitter) sendTransaction(ctx context.Context, output *eth.Out } // loop is responsible for creating & submitting the next outputs +// The loop regularly polls the L2 chain to infer whether to make the next proposal. func (l *L2OutputSubmitter) loop() { defer l.wg.Done() + defer l.Log.Info("loop returning") ctx := l.ctx + ticker := time.NewTicker(l.Cfg.PollInterval) + defer ticker.Stop() + for { + select { + case <-ticker.C: + // prioritize quit signal + select { + case <-l.done: + return + default: + } - if l.Cfg.WaitNodeSync { - err := l.waitNodeSync() - if err != nil { - l.Log.Error("Error waiting for node sync", "err", err) + // A note on retrying: the outer ticker already runs on a short + // poll interval, which has a default value of 6 seconds. So no + // retry logic is needed around output fetching here. + var output *eth.OutputResponse + var shouldPropose bool + var err error + if l.dgfContract == nil { + output, shouldPropose, err = l.FetchL2OOOutput(ctx) + } else { + output, shouldPropose, err = l.FetchDGFOutput(ctx) + } + if err != nil { + l.Log.Warn("Error getting output", "err", err) + continue + } else if !shouldPropose { + // debug logging already in Fetch(DGF|L2OO)Output + continue + } + + l.proposeOutput(ctx, output) + case <-l.done: return } } - if l.dgfContract == nil { - l.loopL2OO(ctx) - } else { - l.loopDGF(ctx) - } } func (l *L2OutputSubmitter) waitNodeSync() error { - ctx, cancel := context.WithTimeout(l.ctx, l.Cfg.NetworkTimeout) + cCtx, cancel := context.WithTimeout(l.ctx, l.Cfg.NetworkTimeout) defer cancel() - l1head, err := l.Txmgr.BlockNumber(ctx) + l1head, err := l.Txmgr.BlockNumber(cCtx) if err != nil { return fmt.Errorf("failed to retrieve current L1 block number: %w", err) } - rollupClient, err := l.RollupProvider.RollupClient(ctx) + rollupClient, err := l.RollupProvider.RollupClient(l.ctx) if err != nil { return fmt.Errorf("failed to get rollup client: %w", err) } @@ -447,47 +493,6 @@ func (l *L2OutputSubmitter) waitNodeSync() error { 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() - for { - select { - case <-ticker.C: - output, shouldPropose, err := l.FetchNextOutputInfo(ctx) - if err != nil || !shouldPropose { - break - } - - l.proposeOutput(ctx, output) - case <-l.done: - return - } - } -} - -func (l *L2OutputSubmitter) loopDGF(ctx context.Context) { - ticker := time.NewTicker(l.Cfg.ProposalInterval) - defer ticker.Stop() - for { - select { - case <-ticker.C: - blockNumber, err := l.FetchCurrentBlockNumber(ctx) - if err != nil { - break - } - - output, shouldPropose, err := l.FetchOutput(ctx, blockNumber) - if err != nil || !shouldPropose { - break - } - - l.proposeOutput(ctx, output) - case <-l.done: - return - } - } -} - func (l *L2OutputSubmitter) proposeOutput(ctx context.Context, output *eth.OutputResponse) { cCtx, cancel := context.WithTimeout(ctx, 10*time.Minute) defer cancel() diff --git a/op-proposer/proposer/driver_test.go b/op-proposer/proposer/driver_test.go new file mode 100644 index 000000000000..8b192e7283b9 --- /dev/null +++ b/op-proposer/proposer/driver_test.go @@ -0,0 +1,181 @@ +package proposer + +import ( + "context" + "fmt" + "math/big" + "testing" + "time" + + "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" + "github.com/ethereum-optimism/optimism/op-service/testlog" + "github.com/ethereum-optimism/optimism/op-service/testutils" + "github.com/ethereum-optimism/optimism/op-service/txmgr" + txmgrmocks "github.com/ethereum-optimism/optimism/op-service/txmgr/mocks" + + "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/log" + "github.com/stretchr/testify/mock" + "github.com/stretchr/testify/require" +) + +type MockL2OOContract struct { + mock.Mock +} + +func (m *MockL2OOContract) Version(opts *bind.CallOpts) (string, error) { + args := m.Called(opts) + return args.String(0), args.Error(1) +} + +func (m *MockL2OOContract) NextBlockNumber(opts *bind.CallOpts) (*big.Int, error) { + args := m.Called(opts) + return args.Get(0).(*big.Int), args.Error(1) +} + +type StubDGFContract struct { + hasProposedCount int +} + +func (m *StubDGFContract) HasProposedSince(_ context.Context, _ common.Address, _ time.Time, _ uint32) (bool, time.Time, error) { + m.hasProposedCount++ + return false, time.Unix(1000, 0), nil +} + +func (m *StubDGFContract) ProposalTx(_ context.Context, _ uint32, _ common.Hash, _ uint64) (txmgr.TxCandidate, error) { + panic("not implemented") +} + +func (m *StubDGFContract) Version(_ context.Context) (string, error) { + panic("not implemented") +} + +type mockRollupEndpointProvider struct { + rollupClient *testutils.MockRollupClient + rollupClientErr error +} + +func newEndpointProvider() *mockRollupEndpointProvider { + return &mockRollupEndpointProvider{ + rollupClient: new(testutils.MockRollupClient), + } +} + +func (p *mockRollupEndpointProvider) RollupClient(context.Context) (dial.RollupClientInterface, error) { + return p.rollupClient, p.rollupClientErr +} + +func (p *mockRollupEndpointProvider) Close() {} + +func setup(t *testing.T, testName string) (*L2OutputSubmitter, *mockRollupEndpointProvider, *MockL2OOContract, *StubDGFContract, *txmgrmocks.TxManager, *testlog.CapturingHandler) { + ep := newEndpointProvider() + + l2OutputOracleAddr := common.HexToAddress("0x3F8A862E63E759a77DA22d384027D21BF096bA9E") + + proposerConfig := ProposerConfig{ + PollInterval: time.Microsecond, + ProposalInterval: time.Microsecond, + L2OutputOracleAddr: &l2OutputOracleAddr, + } + + txmgr := txmgrmocks.NewTxManager(t) + + lgr, logs := testlog.CaptureLogger(t, log.LevelDebug) + setup := DriverSetup{ + Log: lgr, + Metr: metrics.NoopMetrics, + Cfg: proposerConfig, + Txmgr: txmgr, + RollupProvider: ep, + } + + parsed, err := bindings.L2OutputOracleMetaData.GetAbi() + require.NoError(t, err) + + ctx, cancel := context.WithCancel(context.Background()) + + l2OutputSubmitter := L2OutputSubmitter{ + DriverSetup: setup, + done: make(chan struct{}), + l2ooABI: parsed, + ctx: ctx, + cancel: cancel, + } + var mockDGFContract *StubDGFContract + var mockL2OOContract *MockL2OOContract + if testName == "DGF" { + mockDGFContract = new(StubDGFContract) + l2OutputSubmitter.dgfContract = mockDGFContract + } else { + mockL2OOContract = new(MockL2OOContract) + l2OutputSubmitter.l2ooContract = mockL2OOContract + } + + txmgr.On("BlockNumber", mock.Anything).Return(uint64(100), nil).Once() + txmgr.On("Send", mock.Anything, mock.Anything). + Return(&types.Receipt{Status: uint64(1), TxHash: common.Hash{}}, nil). + Once(). + Run(func(_ mock.Arguments) { + // let loops return after first Send call + t.Log("Closing proposer.") + close(l2OutputSubmitter.done) + }) + + return &l2OutputSubmitter, ep, mockL2OOContract, mockDGFContract, txmgr, logs +} + +func TestL2OutputSubmitter_OutputRetry(t *testing.T) { + tests := []struct { + name string + }{ + {name: "L2OO"}, + {name: "DGF"}, + } + + proposerAddr := common.Address{0xab} + const numFails = 3 + for _, tt := range tests { + t.Run(tt.name, func(t *testing.T) { + ps, ep, l2ooContract, dgfContract, txmgr, logs := setup(t, tt.name) + + ep.rollupClient.On("SyncStatus").Return(ð.SyncStatus{FinalizedL2: eth.L2BlockRef{Number: 42}}, nil).Times(numFails + 1) + ep.rollupClient.ExpectOutputAtBlock(42, nil, fmt.Errorf("TEST: failed to fetch output")).Times(numFails) + ep.rollupClient.ExpectOutputAtBlock( + 42, + ð.OutputResponse{ + Version: supportedL2OutputVersion, + BlockRef: eth.L2BlockRef{Number: 42}, + Status: ð.SyncStatus{ + CurrentL1: eth.L1BlockRef{Hash: common.Hash{}}, + FinalizedL2: eth.L2BlockRef{Number: 42}, + }, + }, + nil, + ) + + txmgr.On("From").Return(proposerAddr).Times(numFails + 1) + + if tt.name == "L2OO" { + l2ooContract.On("NextBlockNumber", mock.AnythingOfType("*bind.CallOpts")).Return(big.NewInt(42), nil).Times(numFails + 1) + } + ps.wg.Add(1) + ps.loop() + + ep.rollupClient.AssertExpectations(t) + if tt.name == "L2OO" { + l2ooContract.AssertExpectations(t) + } else { + require.Equal(t, numFails+1, dgfContract.hasProposedCount) + } + + require.Len(t, logs.FindLogs(testlog.NewMessageContainsFilter("Error getting output")), numFails) + require.NotNil(t, logs.FindLog(testlog.NewMessageFilter("Proposer tx successfully published"))) + require.NotNil(t, logs.FindLog(testlog.NewMessageFilter("loop returning"))) + }) + } +} diff --git a/op-proposer/proposer/service.go b/op-proposer/proposer/service.go index 0e5012d1ab85..2cc7402911d8 100644 --- a/op-proposer/proposer/service.go +++ b/op-proposer/proposer/service.go @@ -18,6 +18,7 @@ import ( opmetrics "github.com/ethereum-optimism/optimism/op-service/metrics" "github.com/ethereum-optimism/optimism/op-service/oppprof" oprpc "github.com/ethereum-optimism/optimism/op-service/rpc" + "github.com/ethereum-optimism/optimism/op-service/sources/batching" "github.com/ethereum-optimism/optimism/op-service/txmgr" "github.com/ethereum/go-ethereum/common" @@ -186,19 +187,19 @@ func (ps *ProposerService) initPProf(cfg *CLIConfig) error { func (ps *ProposerService) initMetricsServer(cfg *CLIConfig) error { if !cfg.MetricsConfig.Enabled { - ps.Log.Info("metrics disabled") + ps.Log.Info("Metrics disabled") return nil } m, ok := ps.Metrics.(opmetrics.RegistryMetricer) if !ok { return fmt.Errorf("metrics were enabled, but metricer %T does not expose registry for metrics-server", ps.Metrics) } - ps.Log.Debug("starting metrics server", "addr", cfg.MetricsConfig.ListenAddr, "port", cfg.MetricsConfig.ListenPort) + ps.Log.Debug("Starting metrics server", "addr", cfg.MetricsConfig.ListenAddr, "port", cfg.MetricsConfig.ListenPort) metricsSrv, err := opmetrics.StartServer(m.Registry(), cfg.MetricsConfig.ListenAddr, cfg.MetricsConfig.ListenPort) if err != nil { return fmt.Errorf("failed to start metrics server: %w", err) } - ps.Log.Info("started metrics server", "addr", metricsSrv.Addr()) + ps.Log.Info("Started metrics server", "addr", metricsSrv.Addr()) ps.metricsSrv = metricsSrv return nil } @@ -230,6 +231,7 @@ func (ps *ProposerService) initDriver() error { Cfg: ps.ProposerConfig, Txmgr: ps.TxManager, L1Client: ps.L1Client, + Multicaller: batching.NewMultiCaller(ps.L1Client.Client(), batching.DefaultBatchSize), RollupProvider: ps.RollupProvider, }) if err != nil { @@ -249,6 +251,7 @@ func (ps *ProposerService) initRPCServer(cfg *CLIConfig) error { if cfg.RPCConfig.EnableAdmin { adminAPI := rpc.NewAdminAPI(ps.driver, ps.Metrics, ps.Log) server.AddAPI(rpc.GetAdminAPI(adminAPI)) + server.AddAPI(ps.TxManager.API()) ps.Log.Info("Admin RPC enabled") } ps.Log.Info("Starting JSON-RPC server") diff --git a/op-service/cliapp/lifecycle.go b/op-service/cliapp/lifecycle.go index 2154c025645d..a1f134979134 100644 --- a/op-service/cliapp/lifecycle.go +++ b/op-service/cliapp/lifecycle.go @@ -7,7 +7,7 @@ import ( "github.com/urfave/cli/v2" - "github.com/ethereum-optimism/optimism/op-service/opio" + "github.com/ethereum-optimism/optimism/op-service/ctxinterrupt" ) type Lifecycle interface { @@ -29,36 +29,26 @@ type Lifecycle interface { // a shutdown when the Stop context is not expired. type LifecycleAction func(ctx *cli.Context, close context.CancelCauseFunc) (Lifecycle, error) -var interruptErr = errors.New("interrupt signal") - // LifecycleCmd turns a LifecycleAction into an CLI action, -// by instrumenting it with CLI context and signal based termination. -// The signals are caught with the opio.BlockFn attached to the context, if any. -// If no block function is provided, it adds default interrupt handling. +// by instrumenting it with CLI context and signal based cancellation. +// The signals are caught with the ctxinterrupt.waiter attached to the context, or default +// interrupt signal handling if not already provided. // The app may continue to run post-processing until fully shutting down. // The user can force an early shut-down during post-processing by sending a second interruption signal. func LifecycleCmd(fn LifecycleAction) cli.ActionFunc { return func(ctx *cli.Context) error { - hostCtx := ctx.Context - blockOnInterrupt := opio.BlockerFromContext(hostCtx) - if blockOnInterrupt == nil { // add default interrupt blocker to context if none is set. - hostCtx = opio.WithInterruptBlocker(hostCtx) - blockOnInterrupt = opio.BlockerFromContext(hostCtx) - } - appCtx, appCancel := context.WithCancelCause(hostCtx) + hostCtx, stop := ctxinterrupt.WithSignalWaiter(ctx.Context) + defer stop() + appCtx, appCancel := context.WithCancelCause(ctxinterrupt.WithCancelOnInterrupt(hostCtx)) + // This is updated so the fn callback cli.Context uses the appCtx we just made. ctx.Context = appCtx - go func() { - blockOnInterrupt(appCtx) - appCancel(interruptErr) - }() - appLifecycle, err := fn(ctx, appCancel) if err != nil { // join errors to include context cause (nil errors are dropped) return errors.Join( fmt.Errorf("failed to setup: %w", err), - context.Cause(appCtx), + context.Cause(ctx.Context), ) } @@ -75,15 +65,10 @@ func LifecycleCmd(fn LifecycleAction) cli.ActionFunc { // Graceful stop context. // This allows the service to idle before shutdown, if halted. User may interrupt. - stopCtx, stopCancel := context.WithCancelCause(hostCtx) - go func() { - blockOnInterrupt(stopCtx) - stopCancel(interruptErr) - }() + stopCtx := ctxinterrupt.WithCancelOnInterrupt(hostCtx) // Execute graceful stop. stopErr := appLifecycle.Stop(stopCtx) - stopCancel(nil) // note: Stop implementation may choose to suppress a context error, // if it handles it well (e.g. stop idling after a halt). if stopErr != nil { diff --git a/op-service/cliapp/lifecycle_test.go b/op-service/cliapp/lifecycle_test.go index 4c421a35493e..d9ffd086ed73 100644 --- a/op-service/cliapp/lifecycle_test.go +++ b/op-service/cliapp/lifecycle_test.go @@ -9,9 +9,11 @@ import ( "github.com/stretchr/testify/require" "github.com/urfave/cli/v2" - "github.com/ethereum-optimism/optimism/op-service/opio" + "github.com/ethereum-optimism/optimism/op-service/ctxinterrupt" ) +var mockInterruptErr = errors.New("mock interrupt") + type fakeLifecycle struct { startCh, stopCh chan error stopped bool @@ -85,11 +87,14 @@ func TestLifecycleCmd(t *testing.T) { ctx, cancel := context.WithTimeout(context.Background(), time.Minute) // puppeteer system signal interrupts by hooking up the test signal channel as "blocker" for the app to use. - ctx = opio.WithBlocker(ctx, func(ctx context.Context) { + ctx = ctxinterrupt.WithWaiterFunc(ctx, func(ctx context.Context) (interrupt, ctxErr error) { select { case <-ctx.Done(): + ctxErr = context.Cause(ctx) case <-signalCh: + interrupt = mockInterruptErr } + return }) t.Cleanup(cancel) @@ -124,7 +129,7 @@ func TestLifecycleCmd(t *testing.T) { signalCh, _, _, _, resultCh, _ := appSetup(t) signalCh <- struct{}{} res := <-resultCh - require.ErrorIs(t, res, interruptErr) + require.ErrorIs(t, res, mockInterruptErr) require.ErrorContains(t, res, "failed to setup") }) t.Run("failed init", func(t *testing.T) { @@ -142,7 +147,7 @@ func TestLifecycleCmd(t *testing.T) { require.False(t, app.Stopped()) signalCh <- struct{}{} res := <-resultCh - require.ErrorIs(t, res, interruptErr) + require.ErrorIs(t, res, mockInterruptErr) require.ErrorContains(t, res, "failed to start") require.True(t, app.Stopped()) }) @@ -178,7 +183,7 @@ func TestLifecycleCmd(t *testing.T) { signalCh <- struct{}{} // start graceful shutdown signalCh <- struct{}{} // interrupt before the shutdown process is allowed to complete res := <-resultCh - require.ErrorIs(t, res, interruptErr) + require.ErrorIs(t, res, mockInterruptErr) require.ErrorContains(t, res, "failed to stop") require.True(t, app.Stopped()) // still fully closes, interrupts only accelerate shutdown where possible. }) diff --git a/op-service/client/dial_test.go b/op-service/client/dial_test.go index 2c33582dd20d..08163976f9f6 100644 --- a/op-service/client/dial_test.go +++ b/op-service/client/dial_test.go @@ -1,6 +1,7 @@ package client import ( + "context" "fmt" "net" "strings" @@ -19,38 +20,38 @@ func TestIsURLAvailableLocal(t *testing.T) { addr := fmt.Sprintf("http://localhost:%s", parts[1]) // True & False with ports - require.True(t, IsURLAvailable(addr)) - require.False(t, IsURLAvailable("http://localhost:0")) + require.True(t, IsURLAvailable(context.Background(), addr)) + require.False(t, IsURLAvailable(context.Background(), "http://localhost:0")) // Fail open if we don't recognize the scheme - require.True(t, IsURLAvailable("mailto://example.com")) + require.True(t, IsURLAvailable(context.Background(), "mailto://example.com")) } func TestIsURLAvailableNonLocal(t *testing.T) { - if !IsURLAvailable("http://example.com") { + if !IsURLAvailable(context.Background(), "http://example.com") { t.Skip("No internet connection found, skipping this test") } // True without ports. http & https - require.True(t, IsURLAvailable("http://example.com")) - require.True(t, IsURLAvailable("http://example.com/hello")) - require.True(t, IsURLAvailable("https://example.com")) - require.True(t, IsURLAvailable("https://example.com/hello")) + require.True(t, IsURLAvailable(context.Background(), "http://example.com")) + require.True(t, IsURLAvailable(context.Background(), "http://example.com/hello")) + require.True(t, IsURLAvailable(context.Background(), "https://example.com")) + require.True(t, IsURLAvailable(context.Background(), "https://example.com/hello")) // True without ports. ws & wss - require.True(t, IsURLAvailable("ws://example.com")) - require.True(t, IsURLAvailable("ws://example.com/hello")) - require.True(t, IsURLAvailable("wss://example.com")) - require.True(t, IsURLAvailable("wss://example.com/hello")) + require.True(t, IsURLAvailable(context.Background(), "ws://example.com")) + require.True(t, IsURLAvailable(context.Background(), "ws://example.com/hello")) + require.True(t, IsURLAvailable(context.Background(), "wss://example.com")) + require.True(t, IsURLAvailable(context.Background(), "wss://example.com/hello")) // False without ports - require.False(t, IsURLAvailable("http://fakedomainnamethatdoesnotexistandshouldneverexist.com")) - require.False(t, IsURLAvailable("http://fakedomainnamethatdoesnotexistandshouldneverexist.com/hello")) - require.False(t, IsURLAvailable("https://fakedomainnamethatdoesnotexistandshouldneverexist.com")) - require.False(t, IsURLAvailable("https://fakedomainnamethatdoesnotexistandshouldneverexist.com/hello")) - require.False(t, IsURLAvailable("ws://fakedomainnamethatdoesnotexistandshouldneverexist.com")) - require.False(t, IsURLAvailable("ws://fakedomainnamethatdoesnotexistandshouldneverexist.com/hello")) - require.False(t, IsURLAvailable("wss://fakedomainnamethatdoesnotexistandshouldneverexist.com")) - require.False(t, IsURLAvailable("wss://fakedomainnamethatdoesnotexistandshouldneverexist.com/hello")) + require.False(t, IsURLAvailable(context.Background(), "http://fakedomainnamethatdoesnotexistandshouldneverexist.com")) + require.False(t, IsURLAvailable(context.Background(), "http://fakedomainnamethatdoesnotexistandshouldneverexist.com/hello")) + require.False(t, IsURLAvailable(context.Background(), "https://fakedomainnamethatdoesnotexistandshouldneverexist.com")) + require.False(t, IsURLAvailable(context.Background(), "https://fakedomainnamethatdoesnotexistandshouldneverexist.com/hello")) + require.False(t, IsURLAvailable(context.Background(), "ws://fakedomainnamethatdoesnotexistandshouldneverexist.com")) + require.False(t, IsURLAvailable(context.Background(), "ws://fakedomainnamethatdoesnotexistandshouldneverexist.com/hello")) + require.False(t, IsURLAvailable(context.Background(), "wss://fakedomainnamethatdoesnotexistandshouldneverexist.com")) + require.False(t, IsURLAvailable(context.Background(), "wss://fakedomainnamethatdoesnotexistandshouldneverexist.com/hello")) } diff --git a/op-service/client/http_test.go b/op-service/client/http_test.go index 60fd9fd9873f..df84e48299c2 100644 --- a/op-service/client/http_test.go +++ b/op-service/client/http_test.go @@ -2,13 +2,12 @@ package client import ( "context" + "log/slog" "net/http" "net/http/httptest" "net/url" "testing" - "golang.org/x/exp/slog" - "github.com/ethereum-optimism/optimism/op-service/testlog" "github.com/stretchr/testify/require" ) diff --git a/op-service/client/lazy_dial.go b/op-service/client/lazy_dial.go new file mode 100644 index 000000000000..f5872778da9e --- /dev/null +++ b/op-service/client/lazy_dial.go @@ -0,0 +1,84 @@ +package client + +import ( + "context" + "errors" + "fmt" + "sync" + + "github.com/ethereum/go-ethereum" + "github.com/ethereum/go-ethereum/rpc" +) + +// LazyRPC defers connection attempts to the usage of the RPC. +// This allows a websocket connection to be established lazily. +// The underlying RPC should handle reconnects. +type LazyRPC struct { + // mutex to prevent more than one active dial attempt at a time. + mu sync.Mutex + // inner is the actual RPC client. + // It is initialized once. The underlying RPC handles reconnections. + inner RPC + // options to initialize `inner` with. + opts []rpc.ClientOption + endpoint string + // If we have not initialized `inner` yet, + // do not try to do so after closing the client. + closed bool +} + +var _ RPC = (*LazyRPC)(nil) + +func NewLazyRPC(endpoint string, opts ...rpc.ClientOption) *LazyRPC { + return &LazyRPC{ + opts: opts, + endpoint: endpoint, + } +} + +func (l *LazyRPC) dial(ctx context.Context) error { + l.mu.Lock() + defer l.mu.Unlock() + if l.inner != nil { + return nil + } + if l.closed { + return errors.New("cannot dial RPC, client was already closed") + } + underlying, err := rpc.DialOptions(ctx, l.endpoint, l.opts...) + if err != nil { + return fmt.Errorf("failed to dial: %w", err) + } + l.inner = &BaseRPCClient{c: underlying} + return nil +} + +func (l *LazyRPC) Close() { + l.mu.Lock() + defer l.mu.Unlock() + if l.inner != nil { + l.inner.Close() + } + l.closed = true +} + +func (l *LazyRPC) CallContext(ctx context.Context, result any, method string, args ...any) error { + if err := l.dial(ctx); err != nil { + return err + } + return l.inner.CallContext(ctx, result, method, args...) +} + +func (l *LazyRPC) BatchCallContext(ctx context.Context, b []rpc.BatchElem) error { + if err := l.dial(ctx); err != nil { + return err + } + return l.inner.BatchCallContext(ctx, b) +} + +func (l *LazyRPC) EthSubscribe(ctx context.Context, channel any, args ...any) (ethereum.Subscription, error) { + if err := l.dial(ctx); err != nil { + return nil, err + } + return l.inner.EthSubscribe(ctx, channel, args...) +} diff --git a/op-service/client/lazy_dial_test.go b/op-service/client/lazy_dial_test.go new file mode 100644 index 000000000000..79608dc2b236 --- /dev/null +++ b/op-service/client/lazy_dial_test.go @@ -0,0 +1,66 @@ +package client + +import ( + "context" + "net" + "net/http" + "testing" + "time" + + "github.com/stretchr/testify/require" + + "github.com/ethereum/go-ethereum/node" + "github.com/ethereum/go-ethereum/rpc" +) + +type mockServer struct { + count int +} + +func (m *mockServer) Count() { + m.count += 1 +} + +func TestLazyRPC(t *testing.T) { + listener, err := net.Listen("tcp", "127.0.0.1:0") + require.NoError(t, err) + defer listener.Close() + + addr := listener.Addr().String() + + cl := NewLazyRPC("ws://" + addr) + defer cl.Close() + + // At this point the connection is online, but the RPC is not. + // RPC request attempts should fail. + { + ctx, cancel := context.WithTimeout(context.Background(), time.Second*4) + attempt1Err := cl.CallContext(ctx, nil, "foo_count") + cancel() + require.ErrorContains(t, attempt1Err, "i/o timeout") + require.NotNil(t, ctx.Err()) + } + + // Now let's serve a websocket RPC + rpcSrv := rpc.NewServer() + defer rpcSrv.Stop() + wsHandler := rpcSrv.WebsocketHandler([]string{"*"}) + httpSrv := &http.Server{Handler: wsHandler} + defer httpSrv.Close() + + go func() { + _ = httpSrv.Serve(listener) // always non-nil, returned when server exits. + }() + + ms := &mockServer{} + require.NoError(t, node.RegisterApis([]rpc.API{{ + Namespace: "foo", + Service: ms, + }}, nil, rpcSrv)) + + // and see if the lazy-dial client can reach it + require.Equal(t, 0, ms.count) + attempt2Err := cl.CallContext(context.Background(), nil, "foo_count") + require.NoError(t, attempt2Err) + require.Equal(t, 1, ms.count) +} diff --git a/op-service/client/mocks/HTTP.go b/op-service/client/mocks/HTTP.go index 894d6a54bdc9..b0ffe5f373a5 100644 --- a/op-service/client/mocks/HTTP.go +++ b/op-service/client/mocks/HTTP.go @@ -94,4 +94,4 @@ func NewHTTP(t mockConstructorTestingTNewHTTP) *HTTP { t.Cleanup(func() { mock.AssertExpectations(t) }) return mock -} \ No newline at end of file +} diff --git a/op-service/client/rpc.go b/op-service/client/rpc.go index 78acce883203..f1452c57f0db 100644 --- a/op-service/client/rpc.go +++ b/op-service/client/rpc.go @@ -35,6 +35,7 @@ type rpcConfig struct { backoffAttempts int limit float64 burst int + lazy bool } type RPCOption func(cfg *rpcConfig) error @@ -74,6 +75,17 @@ func WithRateLimit(rateLimit float64, burst int) RPCOption { } } +// WithLazyDial makes the RPC client initialization defer the initial connection attempt, +// and defer to later RPC requests upon subsequent dial errors. +// Any dial-backoff option will be ignored if this option is used. +// This is implemented by wrapping the inner RPC client with a LazyRPC. +func WithLazyDial() RPCOption { + return func(cfg *rpcConfig) error { + cfg.lazy = true + return nil + } +} + // NewRPC returns the correct client.RPC instance for a given RPC url. func NewRPC(ctx context.Context, lgr log.Logger, addr string, opts ...RPCOption) (RPC, error) { var cfg rpcConfig @@ -87,13 +99,17 @@ func NewRPC(ctx context.Context, lgr log.Logger, addr string, opts ...RPCOption) cfg.backoffAttempts = 1 } - underlying, err := dialRPCClientWithBackoff(ctx, lgr, addr, cfg.backoffAttempts, cfg.gethRPCOptions...) - if err != nil { - return nil, err + var wrapped RPC + if cfg.lazy { + wrapped = NewLazyRPC(addr, cfg.gethRPCOptions...) + } else { + underlying, err := dialRPCClientWithBackoff(ctx, lgr, addr, cfg.backoffAttempts, cfg.gethRPCOptions...) + if err != nil { + return nil, err + } + wrapped = &BaseRPCClient{c: underlying} } - var wrapped RPC = &BaseRPCClient{c: underlying} - if cfg.limit != 0 { wrapped = NewRateLimitingClient(wrapped, rate.Limit(cfg.limit), cfg.burst) } @@ -113,7 +129,7 @@ func NewRPCWithClient(ctx context.Context, lgr log.Logger, addr string, underlyi func dialRPCClientWithBackoff(ctx context.Context, log log.Logger, addr string, attempts int, opts ...rpc.ClientOption) (*rpc.Client, error) { bOff := retry.Exponential() return retry.Do(ctx, attempts, bOff, func() (*rpc.Client, error) { - if !IsURLAvailable(addr) { + if !IsURLAvailable(ctx, addr) { log.Warn("failed to dial address, but may connect later", "addr", addr) return nil, fmt.Errorf("address unavailable (%s)", addr) } @@ -125,7 +141,7 @@ func dialRPCClientWithBackoff(ctx context.Context, log log.Logger, addr string, }) } -func IsURLAvailable(address string) bool { +func IsURLAvailable(ctx context.Context, address string) bool { u, err := url.Parse(address) if err != nil { return false @@ -142,7 +158,8 @@ func IsURLAvailable(address string) bool { return true } } - conn, err := net.DialTimeout("tcp", addr, 5*time.Second) + dialer := net.Dialer{Timeout: 5 * time.Second} + conn, err := dialer.DialContext(ctx, "tcp", addr) if err != nil { return false } diff --git a/op-service/clock/simple.go b/op-service/clock/simple.go index 1f685d180372..e764b2a0825d 100644 --- a/op-service/clock/simple.go +++ b/op-service/clock/simple.go @@ -6,7 +6,7 @@ import ( ) type SimpleClock struct { - unix atomic.Uint64 + v atomic.Pointer[time.Time] } func NewSimpleClock() *SimpleClock { @@ -14,9 +14,18 @@ func NewSimpleClock() *SimpleClock { } func (c *SimpleClock) SetTime(u uint64) { - c.unix.Store(u) + t := time.Unix(int64(u), 0) + c.v.Store(&t) +} + +func (c *SimpleClock) Set(v time.Time) { + c.v.Store(&v) } func (c *SimpleClock) Now() time.Time { - return time.Unix(int64(c.unix.Load()), 0) + v := c.v.Load() + if v == nil { + return time.Unix(0, 0) + } + return *v } diff --git a/op-service/clock/simple_test.go b/op-service/clock/simple_test.go index 3760f1033ceb..1576dd92d63d 100644 --- a/op-service/clock/simple_test.go +++ b/op-service/clock/simple_test.go @@ -1,7 +1,6 @@ package clock import ( - "sync/atomic" "testing" "time" @@ -11,10 +10,9 @@ import ( func TestSimpleClock_Now(t *testing.T) { c := NewSimpleClock() require.Equal(t, time.Unix(0, 0), c.Now()) - expectedTime := uint64(time.Now().Unix()) - c.unix = atomic.Uint64{} - c.unix.Store(expectedTime) - require.Equal(t, time.Unix(int64(expectedTime), 0), c.Now()) + expectedTime := time.Now() + c.v.Store(&expectedTime) + require.Equal(t, expectedTime, c.Now()) } func TestSimpleClock_SetTime(t *testing.T) { diff --git a/op-service/crypto/secrets.go b/op-service/crypto/secrets.go new file mode 100644 index 000000000000..410de63cb3ca --- /dev/null +++ b/op-service/crypto/secrets.go @@ -0,0 +1,19 @@ +package crypto + +import ( + "crypto/ecdsa" + + "github.com/ethereum/go-ethereum/common/hexutil" +) + +// EncodePrivKey encodes the given private key in 32 bytes +func EncodePrivKey(priv *ecdsa.PrivateKey) hexutil.Bytes { + privkey := make([]byte, 32) + blob := priv.D.Bytes() + copy(privkey[32-len(blob):], blob) + return privkey +} + +func EncodePrivKeyToString(priv *ecdsa.PrivateKey) string { + return hexutil.Encode(EncodePrivKey(priv)) +} diff --git a/op-service/crypto/signature.go b/op-service/crypto/signature.go index c0abd3ef2afd..a6a7c1cc0d1e 100644 --- a/op-service/crypto/signature.go +++ b/op-service/crypto/signature.go @@ -35,6 +35,12 @@ func PrivateKeySignerFn(key *ecdsa.PrivateKey, chainID *big.Int) bind.SignerFn { } } +func SignerFnFromBind(fn bind.SignerFn) SignerFn { + return func(_ context.Context, address common.Address, tx *types.Transaction) (*types.Transaction, error) { + return fn(address, tx) + } +} + // SignerFn is a generic transaction signing function. It may be a remote signer so it takes a context. // It also takes the address that should be used to sign the transaction with. type SignerFn func(context.Context, common.Address, *types.Transaction) (*types.Transaction, error) @@ -91,6 +97,9 @@ func SignerFactoryFromConfig(l log.Logger, privateKey, mnemonic, hdPath string, return nil, common.Address{}, fmt.Errorf("failed to parse the private key: %w", err) } } + // we force the curve to Geth's instance, because Geth does an equality check in the nocgo version: + // https://github.com/ethereum/go-ethereum/blob/723b1e36ad6a9e998f06f74cc8b11d51635c6402/crypto/signature_nocgo.go#L82 + privKey.PublicKey.Curve = crypto.S256() fromAddress = crypto.PubkeyToAddress(privKey.PublicKey) signer = func(chainID *big.Int) SignerFn { s := PrivateKeySignerFn(privKey, chainID) diff --git a/op-service/crypto/signature_test.go b/op-service/crypto/signature_test.go new file mode 100644 index 000000000000..1cd52165bf5b --- /dev/null +++ b/op-service/crypto/signature_test.go @@ -0,0 +1,56 @@ +package crypto + +import ( + "context" + "math/big" + "testing" + + "github.com/stretchr/testify/require" + + "github.com/ethereum-optimism/optimism/op-service/signer" + "github.com/ethereum-optimism/optimism/op-service/testlog" + + "github.com/ethereum/go-ethereum/common" + "github.com/ethereum/go-ethereum/core/types" + "github.com/ethereum/go-ethereum/log" +) + +// should be run with CGO_ENABLED=0 + +func TestSignerFactoryFromMnemonic(t *testing.T) { + mnemonic := "test test test test test test test test test test test junk" + hdPath := "m/44'/60'/0'/0/1" + testSigner(t, "", mnemonic, hdPath, signer.CLIConfig{}) +} + +func TestSignerFactoryFromKey(t *testing.T) { + priv := "59c6995e998f97a5a0044966f0945389dc9e86dae88c7a8412f4603b6b78690d" + testSigner(t, priv, "", "", signer.CLIConfig{}) +} + +func testSigner(t *testing.T, priv, mnemonic, hdPath string, cfg signer.CLIConfig) { + logger := testlog.Logger(t, log.LevelDebug) + + factoryFn, addr, err := SignerFactoryFromConfig(logger, priv, mnemonic, hdPath, cfg) + require.NoError(t, err) + expectedAddr := common.HexToAddress("0x70997970C51812dc3A010C7d01b50e0d17dc79C8") + require.Equal(t, expectedAddr, addr) + chainID := big.NewInt(10) + signerFn := factoryFn(chainID) // for chain ID 10 + tx := types.NewTx(&types.DynamicFeeTx{ + ChainID: chainID, + Nonce: 0, + GasTipCap: big.NewInt(1), + GasFeeCap: big.NewInt(1), + Gas: 21000, + To: nil, + Value: big.NewInt(0), + Data: []byte("test"), + }) + signedTx, err := signerFn(context.Background(), addr, tx) + require.NoError(t, err) + gethSigner := types.LatestSignerForChainID(chainID) + sender, err := gethSigner.Sender(signedTx) + require.NoError(t, err) + require.Equal(t, expectedAddr, sender) +} diff --git a/op-service/ctxinterrupt/context.go b/op-service/ctxinterrupt/context.go new file mode 100644 index 000000000000..d7e7446d0dc3 --- /dev/null +++ b/op-service/ctxinterrupt/context.go @@ -0,0 +1,29 @@ +package ctxinterrupt + +import ( + "context" +) + +// Newtyping empty struct prevents collision with other empty struct keys in the Context. +type interruptWaiterContextKeyType struct{} + +var waiterContextKey = interruptWaiterContextKeyType{} + +// WithInterruptWaiter overrides the interrupt waiter value, e.g. to insert a function that mocks +// interrupt signals for testing CLI shutdown without actual process signals. +func WithWaiterFunc(ctx context.Context, fn WaiterFunc) context.Context { + return withInterruptWaiter(ctx, fn) +} + +func withInterruptWaiter(ctx context.Context, value waiter) context.Context { + return context.WithValue(ctx, waiterContextKey, value) +} + +// contextInterruptWaiter returns a interruptWaiter that blocks on interrupts when called. +func contextInterruptWaiter(ctx context.Context) waiter { + v := ctx.Value(waiterContextKey) + if v == nil { + return nil + } + return v.(waiter) +} diff --git a/op-service/ctxinterrupt/context_test.go b/op-service/ctxinterrupt/context_test.go new file mode 100644 index 000000000000..c853a3c5f7c6 --- /dev/null +++ b/op-service/ctxinterrupt/context_test.go @@ -0,0 +1,19 @@ +package ctxinterrupt + +import ( + "context" + "testing" + + "github.com/stretchr/testify/require" +) + +func TestContextKeyIsUnique(t *testing.T) { + ass := require.New(t) + ctx := context.Background() + ass.Nil(ctx.Value(waiterContextKey)) + ctx = context.WithValue(ctx, waiterContextKey, 1) + ass.Equal(ctx.Value(waiterContextKey), 1) + ctx = context.WithValue(ctx, waiterContextKey, 2) + ass.Equal(ctx.Value(waiterContextKey), 2) + ass.Nil(ctx.Value(struct{}{})) +} diff --git a/op-service/ctxinterrupt/doc.go b/op-service/ctxinterrupt/doc.go new file mode 100644 index 000000000000..4846d544eba8 --- /dev/null +++ b/op-service/ctxinterrupt/doc.go @@ -0,0 +1,3 @@ +// Implements interrupts: events that normally signal intent to cancel a Context, but may be +// repeated to encourage closure of new Contexts used to clean up resources. +package ctxinterrupt diff --git a/op-service/ctxinterrupt/funcs.go b/op-service/ctxinterrupt/funcs.go new file mode 100644 index 000000000000..90ab19e19df1 --- /dev/null +++ b/op-service/ctxinterrupt/funcs.go @@ -0,0 +1,55 @@ +package ctxinterrupt + +import ( + "context" +) + +// Wait blocks until an interrupt is received, defaulting to interrupting on the default +// signals if no interrupt blocker is present in the Context. Returns nil if an interrupt occurs, +// else the Context error when it's done. +func Wait(ctx context.Context) error { + iw := contextInterruptWaiter(ctx) + if iw == nil { + catcher := newSignalWaiter() + defer catcher.Stop() + iw = catcher + } + return iw.waitForInterrupt(ctx).CtxError +} + +// WithSignalWaiter attaches an interrupt signal handler to the context which continues to receive +// signals after every wait, and also prevents the interrupt signals being handled before we're +// ready to wait for them. This helps functions wait on individual consecutive interrupts. +func WithSignalWaiter(ctx context.Context) (_ context.Context, stop func()) { + if ctx.Value(waiterContextKey) != nil { // already has an interrupt waiter + return ctx, func() {} + } + catcher := newSignalWaiter() + return withInterruptWaiter(ctx, catcher), catcher.Stop +} + +// WithSignalWaiterMain returns a Context with a signal interrupt blocker and leaks the destructor. Intended for use in +// main functions where we exit right after using the returned context anyway. +func WithSignalWaiterMain(ctx context.Context) context.Context { + ctx, _ = WithSignalWaiter(ctx) + return ctx +} + +// WithCancelOnInterrupt returns a Context that is cancelled when Wait returns on the waiter in ctx. +// If there's no waiter, the default interrupt signals are used: In this case the signal hooking is +// not stopped until the original ctx is cancelled. +func WithCancelOnInterrupt(ctx context.Context) context.Context { + interruptWaiter := contextInterruptWaiter(ctx) + ctx, cancel := context.WithCancelCause(ctx) + stop := func() {} + if interruptWaiter == nil { + catcher := newSignalWaiter() + stop = catcher.Stop + interruptWaiter = catcher + } + go func() { + defer stop() + cancel(interruptWaiter.waitForInterrupt(ctx).Cause()) + }() + return ctx +} diff --git a/op-service/ctxinterrupt/signal-waiter.go b/op-service/ctxinterrupt/signal-waiter.go new file mode 100644 index 000000000000..a37dde7a981b --- /dev/null +++ b/op-service/ctxinterrupt/signal-waiter.go @@ -0,0 +1,50 @@ +package ctxinterrupt + +import ( + "context" + "fmt" + "os" + "os/signal" + "syscall" +) + +// defaultSignals is a set of default interrupt signals. +var defaultSignals = []os.Signal{ + // Let's not catch SIGQUIT as it's expected to terminate with a stack trace in Go. os.Kill + // should not/cannot be caught on most systems. + os.Interrupt, + syscall.SIGTERM, +} + +type signalWaiter struct { + incoming chan os.Signal +} + +func newSignalWaiter() signalWaiter { + catcher := signalWaiter{ + // Buffer, in case we are slow to act on older signals, + // but still want to handle repeat-signals as special case (e.g. to force shutdown) + incoming: make(chan os.Signal, 10), + } + signal.Notify(catcher.incoming, defaultSignals...) + return catcher +} + +func (me signalWaiter) Stop() { + signal.Stop(me.incoming) +} + +// Block blocks until either an interrupt signal is received, or the context is cancelled. +// No error is returned on interrupt. +func (me signalWaiter) waitForInterrupt(ctx context.Context) waitResult { + select { + case signalValue, ok := <-me.incoming: + if !ok { + // Signal channels are not closed. + panic("signal channel closed") + } + return waitResult{Interrupt: fmt.Errorf("received interrupt signal %v", signalValue)} + case <-ctx.Done(): + return waitResult{CtxError: context.Cause(ctx)} + } +} diff --git a/op-service/ctxinterrupt/waiter.go b/op-service/ctxinterrupt/waiter.go new file mode 100644 index 000000000000..4e32a84b0a44 --- /dev/null +++ b/op-service/ctxinterrupt/waiter.go @@ -0,0 +1,38 @@ +package ctxinterrupt + +import ( + "context" + "fmt" +) + +// waiter describes a value that can wait for interrupts and context cancellation at the same time. +type waiter interface { + waitForInterrupt(ctx context.Context) waitResult +} + +// Waits for an interrupt or context cancellation. ctxErr should be the context.Cause of ctx when it +// is done. interrupt is only inspected if ctxErr is nil, and is not required to be set. +type WaiterFunc func(ctx context.Context) (interrupt, ctxErr error) + +func (me WaiterFunc) waitForInterrupt(ctx context.Context) (res waitResult) { + res.Interrupt, res.CtxError = me(ctx) + return +} + +// Either CtxError is not nil and is set to the context error cause, or the wait was interrupted. +type waitResult struct { + // Not required to be non-nil on an interrupt. + Interrupt error + // Maybe set this using context.Cause. + CtxError error +} + +func (me waitResult) Cause() error { + if me.CtxError != nil { + return me.CtxError + } + if me.Interrupt != nil { + return fmt.Errorf("interrupted: %w", me.Interrupt) + } + return nil +} diff --git a/op-service/dial/active_l2_provider.go b/op-service/dial/active_l2_provider.go index 5eb3fadbc050..7d20d2c129c6 100644 --- a/op-service/dial/active_l2_provider.go +++ b/op-service/dial/active_l2_provider.go @@ -6,12 +6,15 @@ import ( "fmt" "time" + "github.com/ethereum-optimism/optimism/op-service/client" + "github.com/ethereum-optimism/optimism/op-service/sources" + "github.com/ethereum/go-ethereum/ethclient" "github.com/ethereum/go-ethereum/log" ) const DefaultActiveSequencerFollowerCheckDuration = 2 * DefaultDialTimeout -type ethDialer func(ctx context.Context, timeout time.Duration, log log.Logger, url string) (EthClientInterface, error) +type ethDialer func(ctx context.Context, log log.Logger, url string) (EthClientInterface, error) // ActiveL2EndpointProvider is an interface for providing a RollupClient and l2 eth client // It manages the lifecycle of the RollupClient and eth client for callers @@ -33,15 +36,21 @@ func NewActiveL2EndpointProvider(ctx context.Context, networkTimeout time.Duration, logger log.Logger, ) (*ActiveL2EndpointProvider, error) { - ethDialer := func(ctx context.Context, timeout time.Duration, - log log.Logger, url string, - ) (EthClientInterface, error) { - return DialEthClientWithTimeout(ctx, timeout, log, url) + ethDialer := func(ctx context.Context, log log.Logger, url string) (EthClientInterface, error) { + rpcCl, err := dialRPCClient(ctx, log, url) + if err != nil { + return nil, err + } + + return ethclient.NewClient(rpcCl), nil } - rollupDialer := func(ctx context.Context, timeout time.Duration, - log log.Logger, url string, - ) (RollupClientInterface, error) { - return DialRollupClientWithTimeout(ctx, timeout, log, url) + rollupDialer := func(ctx context.Context, log log.Logger, url string) (RollupClientInterface, error) { + rpcCl, err := dialRPCClient(ctx, log, url) + if err != nil { + return nil, err + } + + return sources.NewRollupClient(client.NewBaseRPCClient(rpcCl)), nil } return newActiveL2EndpointProvider(ctx, ethUrls, rollupUrls, checkDuration, networkTimeout, logger, ethDialer, rollupDialer) } @@ -93,7 +102,7 @@ func (p *ActiveL2EndpointProvider) EthClient(ctx context.Context) (EthClientInte idx := p.rollupIndex ep := p.ethUrls[idx] log.Info("sequencer changed (or ethClient was nil due to startup), dialing new eth client", "new_index", idx, "new_url", ep) - ethClient, err := p.ethDialer(cctx, p.networkTimeout, p.log, ep) + ethClient, err := p.ethDialer(cctx, p.log, ep) if err != nil { return nil, fmt.Errorf("dialing eth client: %w", err) } diff --git a/op-service/dial/active_l2_provider_test.go b/op-service/dial/active_l2_provider_test.go index e9b532cc10bd..1533ab6849ff 100644 --- a/op-service/dial/active_l2_provider_test.go +++ b/op-service/dial/active_l2_provider_test.go @@ -2,6 +2,7 @@ package dial import ( "context" + "errors" "fmt" "testing" "time" @@ -43,7 +44,7 @@ func setupEndpointProviderTest(t *testing.T, numSequencers int) *endpointProvide // newActiveL2EndpointProvider constructs a new ActiveL2RollupProvider using the test harness setup. func (et *endpointProviderTest) newActiveL2RollupProvider(checkDuration time.Duration) (*ActiveL2RollupProvider, error) { - mockRollupDialer := func(ctx context.Context, timeout time.Duration, log log.Logger, url string) (RollupClientInterface, error) { + mockRollupDialer := func(ctx context.Context, log log.Logger, url string) (RollupClientInterface, error) { for i, client := range et.rollupClients { if url == fmt.Sprintf("rollup%d", i) { if !et.rollupDialOutcomes[i] { @@ -74,7 +75,7 @@ func (et *endpointProviderTest) newActiveL2RollupProvider(checkDuration time.Dur // newActiveL2EndpointProvider constructs a new ActiveL2EndpointProvider using the test harness setup. func (et *endpointProviderTest) newActiveL2EndpointProvider(checkDuration time.Duration) (*ActiveL2EndpointProvider, error) { - mockRollupDialer := func(ctx context.Context, timeout time.Duration, log log.Logger, url string) (RollupClientInterface, error) { + mockRollupDialer := func(ctx context.Context, log log.Logger, url string) (RollupClientInterface, error) { for i, client := range et.rollupClients { if url == fmt.Sprintf("rollup%d", i) { if !et.rollupDialOutcomes[i] { @@ -86,7 +87,7 @@ func (et *endpointProviderTest) newActiveL2EndpointProvider(checkDuration time.D return nil, fmt.Errorf("unknown test url: %s", url) } - mockEthDialer := func(ctx context.Context, timeout time.Duration, log log.Logger, url string) (EthClientInterface, error) { + mockEthDialer := func(ctx context.Context, log log.Logger, url string) (EthClientInterface, error) { for i, client := range et.ethClients { if url == fmt.Sprintf("eth%d", i) { if !et.ethDialOutcomes[i] { @@ -204,7 +205,7 @@ func TestRollupProvider_FailoverOnErroredSequencer(t *testing.T) { require.NoError(t, err) require.Same(t, primarySequencer, firstSequencerUsed) - primarySequencer.ExpectSequencerActive(true, fmt.Errorf("a test error")) // error-out after that + primarySequencer.ExpectSequencerActive(true, errors.New("a test error")) // error-out after that primarySequencer.MaybeClose() secondarySequencer.ExpectSequencerActive(true, nil) secondSequencerUsed, err := rollupProvider.RollupClient(context.Background()) @@ -231,7 +232,7 @@ func TestEndpointProvider_FailoverOnErroredSequencer(t *testing.T) { require.NoError(t, err) require.Same(t, primaryEthClient, firstSequencerUsed) - primarySequencer.ExpectSequencerActive(true, fmt.Errorf("a test error")) // error out after that + primarySequencer.ExpectSequencerActive(true, errors.New("a test error")) // error out after that primarySequencer.MaybeClose() primaryEthClient.MaybeClose() secondarySequencer.ExpectSequencerActive(true, nil) @@ -465,7 +466,7 @@ func TestRollupProvider_ConstructorErrorOnFirstSequencerOffline(t *testing.T) { ept := setupEndpointProviderTest(t, 2) // First sequencer is dead, second sequencer is active - ept.rollupClients[0].ExpectSequencerActive(false, fmt.Errorf("I am offline")) + ept.rollupClients[0].ExpectSequencerActive(false, errors.New("I am offline")) ept.rollupClients[0].MaybeClose() ept.rollupClients[1].ExpectSequencerActive(true, nil) @@ -482,7 +483,7 @@ func TestEndpointProvider_ConstructorErrorOnFirstSequencerOffline(t *testing.T) ept := setupEndpointProviderTest(t, 2) // First sequencer is dead, second sequencer is active - ept.rollupClients[0].ExpectSequencerActive(false, fmt.Errorf("I am offline")) + ept.rollupClients[0].ExpectSequencerActive(false, errors.New("I am offline")) ept.rollupClients[0].MaybeClose() ept.rollupClients[1].ExpectSequencerActive(true, nil) ept.rollupClients[1].ExpectSequencerActive(true, nil) // see comment in other tests about why we expect this twice @@ -533,7 +534,7 @@ func TestRollupProvider_FailOnAllErroredSequencers(t *testing.T) { // All sequencers are inactive for _, sequencer := range ept.rollupClients { - sequencer.ExpectSequencerActive(true, fmt.Errorf("a test error")) + sequencer.ExpectSequencerActive(true, errors.New("a test error")) sequencer.MaybeClose() } @@ -549,7 +550,7 @@ func TestEndpointProvider_FailOnAllErroredSequencers(t *testing.T) { // All sequencers are inactive for _, sequencer := range ept.rollupClients { - sequencer.ExpectSequencerActive(true, fmt.Errorf("a test error")) + sequencer.ExpectSequencerActive(true, errors.New("a test error")) sequencer.MaybeClose() } @@ -711,7 +712,7 @@ func TestRollupProvider_HandlesManyIndexClientMismatch(t *testing.T) { require.NoError(t, err) // primarySequencer goes down - seq0.ExpectSequencerActive(false, fmt.Errorf("I'm offline now")) + seq0.ExpectSequencerActive(false, errors.New("I'm offline now")) seq0.MaybeClose() ept.setRollupDialOutcome(0, false) // primarySequencer fails to dial // secondarySequencer is inactive, but online diff --git a/op-service/dial/active_rollup_provider.go b/op-service/dial/active_rollup_provider.go index 76f30b3da99a..c5c06d90525b 100644 --- a/op-service/dial/active_rollup_provider.go +++ b/op-service/dial/active_rollup_provider.go @@ -7,10 +7,12 @@ import ( "sync" "time" + "github.com/ethereum-optimism/optimism/op-service/client" + "github.com/ethereum-optimism/optimism/op-service/sources" "github.com/ethereum/go-ethereum/log" ) -type rollupDialer func(ctx context.Context, timeout time.Duration, log log.Logger, url string) (RollupClientInterface, error) +type rollupDialer func(ctx context.Context, log log.Logger, url string) (RollupClientInterface, error) // ActiveL2EndpointProvider is an interface for providing a RollupClient // It manages the lifecycle of the RollupClient for callers @@ -39,10 +41,14 @@ func NewActiveL2RollupProvider( networkTimeout time.Duration, logger log.Logger, ) (*ActiveL2RollupProvider, error) { - rollupDialer := func(ctx context.Context, timeout time.Duration, - log log.Logger, url string, + rollupDialer := func(ctx context.Context, log log.Logger, url string, ) (RollupClientInterface, error) { - return DialRollupClientWithTimeout(ctx, timeout, log, url) + rpcCl, err := dialRPCClient(ctx, log, url) + if err != nil { + return nil, err + } + + return sources.NewRollupClient(client.NewBaseRPCClient(rpcCl)), nil } return newActiveL2RollupProvider(ctx, rollupUrls, checkDuration, networkTimeout, logger, rollupDialer) } @@ -108,7 +114,7 @@ func (p *ActiveL2RollupProvider) findActiveEndpoints(ctx context.Context) error if offset != 0 || p.currentRollupClient == nil { if err := p.dialSequencer(ctx, idx); err != nil { errs = errors.Join(errs, err) - p.log.Warn("Error dialing next sequencer.", "err", err, "index", p.rollupIndex) + p.log.Warn("Error dialing next sequencer.", "err", err, "index", idx) continue } } @@ -150,7 +156,7 @@ func (p *ActiveL2RollupProvider) dialSequencer(ctx context.Context, idx int) err ep := p.rollupUrls[idx] p.log.Info("Dialing next sequencer.", "index", idx, "url", ep) - rollupClient, err := p.rollupDialer(cctx, p.networkTimeout, p.log, ep) + rollupClient, err := p.rollupDialer(cctx, p.log, ep) if err != nil { return fmt.Errorf("dialing rollup client: %w", err) } diff --git a/op-service/dial/dial.go b/op-service/dial/dial.go index 836b2b9bcbc3..4cf78f84fd21 100644 --- a/op-service/dial/dial.go +++ b/op-service/dial/dial.go @@ -60,14 +60,19 @@ func DialRPCClientWithTimeout(ctx context.Context, timeout time.Duration, log lo func dialRPCClientWithBackoff(ctx context.Context, log log.Logger, addr string) (*rpc.Client, error) { bOff := retry.Fixed(defaultRetryTime) return retry.Do(ctx, defaultRetryCount, bOff, func() (*rpc.Client, error) { - if !client.IsURLAvailable(addr) { - log.Warn("failed to dial address, but may connect later", "addr", addr) - return nil, fmt.Errorf("address unavailable (%s)", addr) - } - client, err := rpc.DialOptions(ctx, addr) - if err != nil { - return nil, fmt.Errorf("failed to dial address (%s): %w", addr, err) - } - return client, nil + return dialRPCClient(ctx, log, addr) }) } + +// Dials a JSON-RPC endpoint once. +func dialRPCClient(ctx context.Context, log log.Logger, addr string) (*rpc.Client, error) { + if !client.IsURLAvailable(ctx, addr) { + log.Warn("failed to dial address, but may connect later", "addr", addr) + return nil, fmt.Errorf("address unavailable (%s)", addr) + } + client, err := rpc.DialOptions(ctx, addr) + if err != nil { + return nil, fmt.Errorf("failed to dial address (%s): %w", addr, err) + } + return client, nil +} diff --git a/op-service/dial/rollup_sync.go b/op-service/dial/rollup_sync.go index 59f40488cab5..3f9a07f677d0 100644 --- a/op-service/dial/rollup_sync.go +++ b/op-service/dial/rollup_sync.go @@ -15,6 +15,9 @@ func WaitRollupSync( l1BlockTarget uint64, pollInterval time.Duration, ) error { + timer := time.NewTimer(pollInterval) + defer timer.Stop() + for { syncst, err := rollup.SyncStatus(ctx) if err != nil { @@ -29,12 +32,12 @@ func WaitRollupSync( } lgr.Info("rollup current L1 block still behind target, retrying") - timer := time.NewTimer(pollInterval) + + timer.Reset(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 index 1d3898e8fdb8..9ed3e2a39bdd 100644 --- a/op-service/dial/rollup_sync_test.go +++ b/op-service/dial/rollup_sync_test.go @@ -3,6 +3,7 @@ package dial import ( "context" "errors" + "log/slog" "testing" "time" @@ -10,7 +11,6 @@ import ( "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) { diff --git a/op-service/dial/static_l2_provider.go b/op-service/dial/static_l2_provider.go index 8d51f062b9af..5a3a5f7ef814 100644 --- a/op-service/dial/static_l2_provider.go +++ b/op-service/dial/static_l2_provider.go @@ -12,7 +12,9 @@ import ( // It does this by extending the RollupProvider interface to add the ability to get an EthClient type L2EndpointProvider interface { RollupProvider - // EthClient(ctx) returns the underlying ethclient pointing to the L2 execution node + // EthClient(ctx) returns the underlying ethclient pointing to the L2 execution node. + // Note: ctx should be a lifecycle context without an attached timeout as client selection may involve + // multiple network operations, specifically in the case of failover. EthClient(ctx context.Context) (EthClientInterface, error) } diff --git a/op-service/dial/static_rollup_provider.go b/op-service/dial/static_rollup_provider.go index a40bb667290a..754ba61dc9f8 100644 --- a/op-service/dial/static_rollup_provider.go +++ b/op-service/dial/static_rollup_provider.go @@ -10,7 +10,9 @@ import ( // RollupProvider is an interface for providing a RollupClient // It manages the lifecycle of the RollupClient for callers type RollupProvider interface { - // RollupClient(ctx) returns the underlying sources.RollupClient pointing to the L2 rollup consensus node + // RollupClient(ctx) returns the underlying sources.RollupClient pointing to the L2 rollup consensus node. + // Note: ctx should be a lifecycle context without an attached timeout as client selection may involve + // multiple network operations, specifically in the case of failover. RollupClient(ctx context.Context) (RollupClientInterface, error) // Close() closes the underlying client or clients Close() diff --git a/op-service/endpoint/rest.go b/op-service/endpoint/rest.go new file mode 100644 index 000000000000..1f6095459f0e --- /dev/null +++ b/op-service/endpoint/rest.go @@ -0,0 +1,17 @@ +package endpoint + +// RestHTTP is an interface for an endpoint to provide flexibility. +// By default the RestHTTP just returns an REST-ful HTTP endpoint string. +// But the RestHTTP can implement one or more extension interfaces, +// to provide alternative ways of establishing a connection, +// or even a fully initialized client binding. +type RestHTTP interface { + RestHTTP() string +} + +// RestHTTPURL is an HTTP endpoint URL string +type RestHTTPURL string + +func (url RestHTTPURL) RestHTTP() string { + return string(url) +} diff --git a/op-service/endpoint/rpc.go b/op-service/endpoint/rpc.go new file mode 100644 index 000000000000..79b2a477227a --- /dev/null +++ b/op-service/endpoint/rpc.go @@ -0,0 +1,138 @@ +package endpoint + +import ( + "github.com/ethereum/go-ethereum/rpc" +) + +// RPC is an interface for an endpoint to provide flexibility. +// By default the RPC just returns an RPC endpoint string. +// But the RPC can implement one or more extension interfaces, +// to provide alternative ways of establishing a connection, +// or even a fully initialized client binding. +type RPC interface { + RPC() string +} + +// WsRPC is an RPC extension interface, +// to explicitly provide the Websocket RPC option. +type WsRPC interface { + RPC + WsRPC() string +} + +// HttpRPC is an RPC extension interface, +// to explicitly provide the HTTP RPC option. +type HttpRPC interface { + RPC + HttpRPC() string +} + +// ClientRPC is an RPC extension interface, +// providing the option to attach in-process to a client, +// rather than dialing an endpoint. +type ClientRPC interface { + RPC + ClientRPC() *rpc.Client +} + +// HttpURL is an HTTP endpoint URL +type HttpURL string + +func (url HttpURL) RPC() string { + return string(url) +} + +func (url HttpURL) HttpRPC() string { + return string(url) +} + +// WsURL is a websocket endpoint URL +type WsURL string + +func (url WsURL) RPC() string { + return string(url) +} + +func (url WsURL) WsRPC() string { + return string(url) +} + +// WsOrHttpRPC provides optionality between +// a websocket RPC endpoint and a HTTP RPC endpoint. +// The default is the websocket endpoint. +type WsOrHttpRPC struct { + WsURL string + HttpURL string +} + +func (r WsOrHttpRPC) RPC() string { + return r.WsURL +} + +func (r WsOrHttpRPC) WsRPC() string { + return r.WsURL +} + +func (r WsOrHttpRPC) HttpRPC() string { + return r.HttpURL +} + +// ServerRPC is a very flexible RPC: it can attach in-process to a server, +// or select one of the fallback RPC methods. +type ServerRPC struct { + Fallback WsOrHttpRPC + Server *rpc.Server +} + +func (e *ServerRPC) RPC() string { + return e.Fallback.RPC() +} + +func (e *ServerRPC) WsRPC() string { + return e.Fallback.WsRPC() +} + +func (e *ServerRPC) HttpRPC() string { + return e.Fallback.HttpRPC() +} + +func (e *ServerRPC) ClientRPC() *rpc.Client { + return rpc.DialInProc(e.Server) +} + +type Dialer func(v string) *rpc.Client + +type RPCPreference int + +const ( + PreferAnyRPC RPCPreference = iota + PreferHttpRPC + PreferWSRPC +) + +// DialRPC navigates the RPC interface, +// to find the optimal version of the PRC to dial or attach to. +func DialRPC(preference RPCPreference, rpc RPC, dialer Dialer) *rpc.Client { + if v, ok := rpc.(HttpRPC); preference == PreferHttpRPC && ok { + return dialer(v.HttpRPC()) + } + if v, ok := rpc.(WsRPC); preference == PreferWSRPC && ok { + return dialer(v.WsRPC()) + } + if v, ok := rpc.(ClientRPC); ok { + return v.ClientRPC() + } + return dialer(rpc.RPC()) +} + +// SelectRPC selects an endpoint URL, based on preference. +// For more optimal dialing, use DialRPC. +func SelectRPC(preference RPCPreference, rpc RPC) string { + if v, ok := rpc.(HttpRPC); preference == PreferHttpRPC && ok { + return v.HttpRPC() + } + if v, ok := rpc.(WsRPC); preference == PreferWSRPC && ok { + return v.WsRPC() + } + return rpc.RPC() +} diff --git a/op-service/errutil/errors.go b/op-service/errutil/errors.go new file mode 100644 index 000000000000..f04ffe205ba1 --- /dev/null +++ b/op-service/errutil/errors.go @@ -0,0 +1,22 @@ +package errutil + +import ( + "errors" + "fmt" +) + +type errWithData interface { + ErrorData() interface{} +} + +// TryAddRevertReason attempts to extract the revert reason from geth RPC client errors and adds it to the error message. +// This is most useful when attempting to execute gas, as if the transaction reverts this will then show the reason. +func TryAddRevertReason(err error) error { + var errData errWithData + ok := errors.As(err, &errData) + if ok { + return fmt.Errorf("%w, reason: %v", err, errData.ErrorData()) + } else { + return err + } +} diff --git a/op-service/errutil/errors_test.go b/op-service/errutil/errors_test.go new file mode 100644 index 000000000000..77f2d1de8113 --- /dev/null +++ b/op-service/errutil/errors_test.go @@ -0,0 +1,32 @@ +package errutil + +import ( + "errors" + "testing" + + "github.com/stretchr/testify/require" +) + +func TestTryAddRevertReason(t *testing.T) { + t.Run("AddsReason", func(t *testing.T) { + err := stubError{} + result := TryAddRevertReason(err) + require.Contains(t, result.Error(), "kaboom") + }) + + t.Run("ReturnOriginalWhenNoErrorDataMethod", func(t *testing.T) { + err := errors.New("boom") + result := TryAddRevertReason(err) + require.Same(t, err, result) + }) +} + +type stubError struct{} + +func (s stubError) Error() string { + return "where's the" +} + +func (s stubError) ErrorData() interface{} { + return "kaboom" +} diff --git a/op-service/eth/address_test.go b/op-service/eth/address_test.go new file mode 100644 index 000000000000..290532244a73 --- /dev/null +++ b/op-service/eth/address_test.go @@ -0,0 +1,36 @@ +package eth + +import ( + "testing" + + "github.com/ethereum/go-ethereum/common" +) + +func TestAddressAsLeftPaddedHash(t *testing.T) { + // Test cases with different addresses + testCases := []struct { + name string + addr common.Address + expect common.Hash + }{ + { + name: "empty address", + addr: common.Address{}, + expect: common.HexToHash("0x0000000000000000000000000000000000000000"), + }, + { + name: "simple address", + addr: common.HexToAddress("0x1234567890AbCdEf1234567890AbCdEf"), + expect: common.HexToHash("0x000000000000000000000000000000001234567890abcdef1234567890abcdef"), + }, + } + + for _, tc := range testCases { + t.Run(tc.name, func(t *testing.T) { + output := AddressAsLeftPaddedHash(tc.addr) + if output != tc.expect { + t.Fatalf("Expected output %v for test case %s, got %v", tc.expect, tc.name, output) + } + }) + } +} 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 da871215da85..9e51c568634f 100644 --- a/op-service/eth/blob.go +++ b/op-service/eth/blob.go @@ -57,7 +57,7 @@ func (b *Blob) TerminalString() string { } func (b *Blob) ComputeKZGCommitment() (kzg4844.Commitment, error) { - return kzg4844.BlobToCommitment(*b.KZGBlob()) + return kzg4844.BlobToCommitment(b.KZGBlob()) } // KZGToVersionedHash computes the "blob hash" (a.k.a. versioned-hash) of a blob-commitment, as used in a blob-tx. @@ -70,7 +70,7 @@ func KZGToVersionedHash(commitment kzg4844.Commitment) (out common.Hash) { // VerifyBlobProof verifies that the given blob and proof corresponds to the given commitment, // returning error if the verification fails. func VerifyBlobProof(blob *Blob, commitment kzg4844.Commitment, proof kzg4844.Proof) error { - return kzg4844.VerifyBlobProof(*blob.KZGBlob(), commitment, proof) + return kzg4844.VerifyBlobProof(blob.KZGBlob(), commitment, proof) } // FromData encodes the given input data into this blob. The encoding scheme is as follows: diff --git a/op-service/eth/blobs_api_test.go b/op-service/eth/blobs_api_test.go index f7439ff75a9c..7c585cb7ac99 100644 --- a/op-service/eth/blobs_api_test.go +++ b/op-service/eth/blobs_api_test.go @@ -16,7 +16,7 @@ type dataJson struct { Data map[string]any `json:"data"` } -// TestAPIGenesisResponse tests that json unmarshaling a json response from a +// TestAPIGenesisResponse tests that json unmarshalling a json response from a // eth/v1/beacon/genesis beacon node call into a APIGenesisResponse object // fills all existing fields with the expected values, thereby confirming that // APIGenesisResponse is compatible with the current beacon node API. @@ -41,7 +41,7 @@ func TestAPIGenesisResponse(t *testing.T) { require.Equal(jsonMap.Data["genesis_time"].(string), string(genesisTime)) } -// TestAPIConfigResponse tests that json unmarshaling a json response from a +// TestAPIConfigResponse tests that json unmarshalling a json response from a // eth/v1/config/spec beacon node call into a APIConfigResponse object // fills all existing fields with the expected values, thereby confirming that // APIGenesisResponse is compatible with the current beacon node API. @@ -66,7 +66,7 @@ func TestAPIConfigResponse(t *testing.T) { require.Equal(jsonMap.Data["SECONDS_PER_SLOT"].(string), string(secPerSlot)) } -// TestAPIGetBlobSidecarsResponse tests that json unmarshaling a json response from a +// TestAPIGetBlobSidecarsResponse tests that json unmarshalling a json response from a // eth/v1/beacon/blob_sidecars/ beacon node call into a APIGetBlobSidecarsResponse object // fills all existing fields with the expected values, thereby confirming that // APIGenesisResponse is compatible with the current beacon node API. diff --git a/op-service/eth/ssz_test.go b/op-service/eth/ssz_test.go index fdaf866643a9..c08c5fa32040 100644 --- a/op-service/eth/ssz_test.go +++ b/op-service/eth/ssz_test.go @@ -40,6 +40,15 @@ func FuzzExecutionPayloadUnmarshal(f *testing.F) { }) } +func TestExecutionPayloadUnmarshalMaliciousData(t *testing.T) { + // Prior to https://github.com/ethereum-optimism/optimism/pull/10362 this causes a panic + // It should return an error and not panic + data := []byte("0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000\x00\x02\x00\x000000000000000000000000000000000000000000000000000000000000000000\x00\x02\x00\x000000") + var payload ExecutionPayload + err := payload.UnmarshalSSZ(BlockV2, uint32(len(data)), bytes.NewReader(data)) + require.Error(t, err) +} + // FuzzExecutionPayloadMarshalUnmarshal checks that our SSZ encoding>decoding round trips properly func FuzzExecutionPayloadMarshalUnmarshalV1(f *testing.F) { f.Fuzz(func(t *testing.T, data []byte, a, b, c, d uint64, extraData []byte, txs uint16, txsData []byte) { diff --git a/op-service/eth/status.go b/op-service/eth/status.go index 3baab5725f26..52e2e9c58cc4 100644 --- a/op-service/eth/status.go +++ b/op-service/eth/status.go @@ -1,18 +1,19 @@ package eth import ( + "errors" "fmt" ) func ForkchoiceUpdateErr(payloadStatus PayloadStatusV1) error { switch payloadStatus.Status { case ExecutionSyncing: - return fmt.Errorf("updated forkchoice, but node is syncing") + return errors.New("updated forkchoice, but node is syncing") case ExecutionAccepted, ExecutionInvalidTerminalBlock, ExecutionInvalidBlockHash: // ACCEPTED, INVALID_TERMINAL_BLOCK, INVALID_BLOCK_HASH are only for execution return fmt.Errorf("unexpected %s status, could not update forkchoice", payloadStatus.Status) case ExecutionInvalid: - return fmt.Errorf("cannot update forkchoice, block is invalid") + return errors.New("cannot update forkchoice, block is invalid") case ExecutionValid: return nil default: diff --git a/op-service/eth/sync_status.go b/op-service/eth/sync_status.go index d6ff393a61d7..f9db1f672b82 100644 --- a/op-service/eth/sync_status.go +++ b/op-service/eth/sync_status.go @@ -3,17 +3,14 @@ package eth // SyncStatus is a snapshot of the driver. // Values may be zeroed if not yet initialized. type SyncStatus struct { - // CurrentL1 is the L1 block that the derivation process is currently at in the inner-most stage. + // CurrentL1 is the L1 block that the derivation process is last idled at. // This may not be fully derived into L2 data yet. // The safe L2 blocks were produced/included fully from the L1 chain up to and including this L1 block. // If the node is synced, this matches the HeadL1, minus the verifier confirmation distance. CurrentL1 L1BlockRef `json:"current_l1"` - // CurrentL1Finalized is the L1 block that the derivation process is currently accepting as finalized - // in the inner-most stage, - // This may not be fully derived into L2 data yet. - // The finalized L2 blocks were produced/included fully from the L1 chain up to and including this L1 block. - // This may lag behind the FinalizedL1 when the FinalizedL1 could not yet be verified - // to be canonical w.r.t. the currently derived L2 chain. It may be zeroed if no block could be verified yet. + // CurrentL1Finalized is a legacy sync-status attribute. This is deprecated. + // A previous version of the L1 finalization-signal was updated only after the block was retrieved by number. + // This attribute just matches FinalizedL1 now. CurrentL1Finalized L1BlockRef `json:"current_l1_finalized"` // HeadL1 is the perceived head of the L1 chain, no confirmation distance. // The head is not guaranteed to build on the other L1 sync status fields, @@ -25,13 +22,20 @@ type SyncStatus struct { // pointing to block data that has not been submitted to L1 yet. // The sequencer is building this, and verifiers may also be ahead of the // SafeL2 block if they sync blocks via p2p or other offchain sources. + // This is considered to only be local-unsafe post-interop, see CrossUnsafe for cross-L2 guarantees. UnsafeL2 L2BlockRef `json:"unsafe_l2"` // SafeL2 points to the L2 block that was derived from the L1 chain. // This point may still reorg if the L1 chain reorgs. + // This is considered to be cross-safe post-interop, see LocalSafe to ignore cross-L2 guarantees. SafeL2 L2BlockRef `json:"safe_l2"` // FinalizedL2 points to the L2 block that was derived fully from // finalized L1 information, thus irreversible. FinalizedL2 L2BlockRef `json:"finalized_l2"` // PendingSafeL2 points to the L2 block processed from the batch, but not consolidated to the safe block yet. PendingSafeL2 L2BlockRef `json:"pending_safe_l2"` + // CrossUnsafeL2 is an unsafe L2 block, that has been verified to match cross-L2 dependencies. + // Pre-interop every unsafe L2 block is also cross-unsafe. + CrossUnsafeL2 L2BlockRef `json:"cross_unsafe_l2"` + // LocalSafeL2 is an L2 block derived from L1, not yet verified to have valid cross-L2 dependencies. + LocalSafeL2 L2BlockRef `json:"local_safe_l2"` } diff --git a/op-service/eth/transactions.go b/op-service/eth/transactions.go index d92f5a245646..836afa75e8af 100644 --- a/op-service/eth/transactions.go +++ b/op-service/eth/transactions.go @@ -50,14 +50,16 @@ 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. +// CheckRecentTxs checks the depth recent blocks for txs from the account with address addr +// and returns either: +// - blockNum containing the last tx and true if any was found +// - the oldest block checked and false if no nonce change was found func CheckRecentTxs( ctx context.Context, l1 L1Client, depth int, addr common.Address, -) (recentBlock uint64, found bool, err error) { +) (blockNum 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) @@ -69,25 +71,47 @@ func CheckRecentTxs( return 0, false, fmt.Errorf("failed to retrieve current nonce: %w", err) } - oldestBlock := new(big.Int) - oldestBlock.Sub(currentBlock, big.NewInt(int64(depth))) + oldestBlock := new(big.Int).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 { + // Most recent tx is older than the given depth 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) + // Use binary search to find the block where the nonce changed + low := oldestBlock.Uint64() + high := currentBlock.Uint64() + + for low < high { + mid := (low + high) / 2 + midNonce, err := l1.NonceAt(ctx, addr, new(big.Int).SetUint64(mid)) if err != nil { - return 0, false, fmt.Errorf("failed to retrieve nonce: %w", err) + return 0, false, fmt.Errorf("failed to retrieve nonce at block %d: %w", mid, err) + } + + if midNonce > currentNonce { + // Catch a reorg that causes inconsistent nonce + return CheckRecentTxs(ctx, l1, depth, addr) + } else if midNonce == currentNonce { + high = mid + } else { + // midNonce < currentNonce: check the next block to see if we've found the + // spot where the nonce transitions to the currentNonce + nextBlockNum := mid + 1 + nextBlockNonce, err := l1.NonceAt(ctx, addr, new(big.Int).SetUint64(nextBlockNum)) + if err != nil { + return 0, false, fmt.Errorf("failed to retrieve nonce at block %d: %w", mid, err) + } + + if nextBlockNonce == currentNonce { + return nextBlockNum, true, nil + } + low = mid + 1 } } - return currentBlock.Uint64() + 1, true, nil + return oldestBlock.Uint64(), false, nil } diff --git a/op-service/eth/transactions_test.go b/op-service/eth/transactions_test.go index 57470d977f17..b8278e0441ac 100644 --- a/op-service/eth/transactions_test.go +++ b/op-service/eth/transactions_test.go @@ -30,111 +30,98 @@ func (m *MockL1Client) HeaderByNumber(ctx context.Context, number *big.Int) (*ty func TestTransactions_checkRecentTxs(t *testing.T) { tests := []struct { - name string - currentBlock uint64 - blockConfirms uint64 - previousNonceBlock uint64 - expectedBlockNum uint64 - expectedFound bool + name string + currentBlock int64 + blockConfirms uint64 + expectedBlockNum uint64 + expectedFound bool + blocks map[int64][]uint64 // maps blockNum --> nonceVal (one for each stubbed call) }{ { - // 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, + name: "nonceDiff_lowerBound", + currentBlock: 500, + blockConfirms: 5, + expectedBlockNum: 496, + expectedFound: true, + blocks: map[int64][]uint64{ + 495: {5, 5}, + 496: {6, 6}, + 497: {6}, + 500: {6}, + }, }, { - // 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, + name: "nonceDiff_midRange", + currentBlock: 500, + blockConfirms: 5, + expectedBlockNum: 497, + expectedFound: true, + blocks: map[int64][]uint64{ + 495: {5}, + 496: {5}, + 497: {6, 6}, + 500: {6}, + }, }, { - // 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, + name: "nonceDiff_upperBound", + currentBlock: 500, + blockConfirms: 5, + expectedBlockNum: 500, + expectedFound: true, + blocks: map[int64][]uint64{ + 495: {5}, + 497: {5}, + 498: {5}, + 499: {5}, + 500: {6, 6}, + }, + }, + { + name: "nonce_unchanged", + currentBlock: 500, + blockConfirms: 5, + expectedBlockNum: 495, + expectedFound: false, + blocks: map[int64][]uint64{ + 495: {6}, + 500: {6}, + }, + }, + { + name: "reorg", + currentBlock: 500, + blockConfirms: 5, + expectedBlockNum: 496, + expectedFound: true, + blocks: map[int64][]uint64{ + 495: {5, 5, 5}, + 496: {7, 7, 7}, + 497: {6, 7}, + 500: {6, 7}, + }, }, } 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) - } + // Setup mock responses + l1Client.On("HeaderByNumber", ctx, (*big.Int)(nil)).Return(&types.Header{Number: big.NewInt(tt.currentBlock)}, nil) + for blockNum, block := range tt.blocks { + for _, nonce := range block { + l1Client.On("NonceAt", ctx, common.Address{}, big.NewInt(blockNum)).Return(nonce, nil).Once() } } 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) + require.Equal(t, tt.expectedBlockNum, blockNum) 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 70fd3fcf81e8..c4901754ba9e 100644 --- a/op-service/eth/types.go +++ b/op-service/eth/types.go @@ -20,10 +20,19 @@ import ( type ErrorCode int +func (c ErrorCode) IsEngineError() bool { + return -38100 < c && c <= -38000 +} + +// Engine error codes used to be -3200x, but were rebased to -3800x: +// https://github.com/ethereum/execution-apis/pull/214 const ( - UnknownPayload ErrorCode = -32001 // Payload does not exist / is not available. + InvalidParams ErrorCode = -32602 + UnknownPayload ErrorCode = -38001 // Payload does not exist / is not available. InvalidForkchoiceState ErrorCode = -38002 // Forkchoice state is invalid / inconsistent. InvalidPayloadAttributes ErrorCode = -38003 // Payload attributes are invalid / inconsistent. + TooLargeEngineRequest ErrorCode = -38004 // Unused, here for completeness, only used by engine_getPayloadBodiesByHashV1 + UnsupportedFork ErrorCode = -38005 // Unused, see issue #11130. ) var ErrBedrockScalarPaddingNotEmpty = errors.New("version 0 scalar value has non-empty padding") diff --git a/op-service/flags/flags.go b/op-service/flags/flags.go index 31ca3eb5bc6b..f8be269303b3 100644 --- a/op-service/flags/flags.go +++ b/op-service/flags/flags.go @@ -11,11 +11,14 @@ import ( ) const ( - RollupConfigFlagName = "rollup.config" - NetworkFlagName = "network" - CanyonOverrideFlagName = "override.canyon" - DeltaOverrideFlagName = "override.delta" - EcotoneOverrideFlagName = "override.ecotone" + RollupConfigFlagName = "rollup.config" + NetworkFlagName = "network" + CanyonOverrideFlagName = "override.canyon" + DeltaOverrideFlagName = "override.delta" + EcotoneOverrideFlagName = "override.ecotone" + FjordOverrideFlagName = "override.fjord" + GraniteOverrideFlagName = "override.granite" + HoloceneOverrideFlagName = "override.holocene" ) func CLIFlags(envPrefix string, category string) []cli.Flag { @@ -41,6 +44,27 @@ 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, + }, + &cli.Uint64Flag{ + Name: GraniteOverrideFlagName, + Usage: "Manually specify the Granite fork timestamp, overriding the bundled setting", + EnvVars: opservice.PrefixEnvVar(envPrefix, "OVERRIDE_GRANITE"), + Hidden: false, + Category: category, + }, + &cli.Uint64Flag{ + Name: HoloceneOverrideFlagName, + Usage: "Manually specify the Holocene fork timestamp, overriding the bundled setting", + EnvVars: opservice.PrefixEnvVar(envPrefix, "OVERRIDE_HOLOCENE"), + 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 7fc24d01900c..3cc38c1e6d97 100644 --- a/op-service/ioutil/atomic.go +++ b/op-service/ioutil/atomic.go @@ -17,6 +17,17 @@ type AtomicWriter struct { // 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) (*AtomicWriter, error) { + return newAtomicWriter(path, perm, true) +} + +// NewAtomicWriter creates a io.WriteCloser that performs an atomic write. +// 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 +func NewAtomicWriter(path string, perm os.FileMode) (*AtomicWriter, error) { + return newAtomicWriter(path, perm, false) +} + +func newAtomicWriter(path string, perm os.FileMode, compressByFileType bool) (*AtomicWriter, error) { f, err := os.CreateTemp(filepath.Dir(path), filepath.Base(path)) if err != nil { return nil, err @@ -25,10 +36,14 @@ func NewAtomicWriterCompressed(path string, perm os.FileMode) (*AtomicWriter, er _ = f.Close() return nil, err } + out := io.WriteCloser(f) + if compressByFileType { + out = CompressByFileType(path, f) + } return &AtomicWriter{ dest: path, temp: f.Name(), - out: CompressByFileType(path, f), + out: out, }, nil } diff --git a/op-service/ioutil/atomic_test.go b/op-service/ioutil/atomic_test.go index 46f2f19a5058..5d46911287a5 100644 --- a/op-service/ioutil/atomic_test.go +++ b/op-service/ioutil/atomic_test.go @@ -70,7 +70,7 @@ func TestAtomicWriter_AbortAfterClose(t *testing.T) { require.ErrorIs(t, f.Abort(), os.ErrClosed) } -func TestAtomicWriter_ApplyGzip(t *testing.T) { +func TestAtomicWriterCompressed_ApplyGzip(t *testing.T) { tests := []struct { name string filename string @@ -108,3 +108,37 @@ func TestAtomicWriter_ApplyGzip(t *testing.T) { }) } } + +func TestAtomicWriter_ApplyGzip(t *testing.T) { + tests := []struct { + name string + filename string + }{ + {"Uncompressed", "test.notgz"}, + {"Gzipped", "test.gz"}, + } + for _, test := range tests { + test := test + t.Run(test.name, func(t *testing.T) { + data := []byte{1, 2, 3, 4, 5, 6, 7, 8, 9, 0, 0, 0, 0, 0, 0, 0, 0} + dir := t.TempDir() + path := filepath.Join(dir, test.filename) + out, err := NewAtomicWriter(path, 0o644) + require.NoError(t, err) + defer out.Close() + _, err = out.Write(data) + require.NoError(t, err) + require.NoError(t, out.Close()) + + writtenData, err := os.ReadFile(path) + require.NoError(t, err) + require.Equal(t, data, writtenData, "should not have compressed data on disk") + + in, err := os.Open(path) + require.NoError(t, err) + readData, err := io.ReadAll(in) + require.NoError(t, err) + require.Equal(t, data, readData) + }) + } +} diff --git a/op-service/ioutil/gzip.go b/op-service/ioutil/gzip.go index 52fbb10cc4c1..65d848ad201f 100644 --- a/op-service/ioutil/gzip.go +++ b/op-service/ioutil/gzip.go @@ -12,23 +12,23 @@ import ( // OpenDecompressed opens a reader for the specified file and automatically gzip decompresses the content // if the filename ends with .gz func OpenDecompressed(path string) (io.ReadCloser, error) { - var r io.ReadCloser r, err := os.Open(path) if err != nil { return nil, err } if IsGzip(path) { - r, err = gzip.NewReader(r) + gr, err := gzip.NewReader(r) if err != nil { + r.Close() return nil, fmt.Errorf("failed to create gzip reader: %w", err) } + return NewWrappedReadCloser(gr, r), nil } return r, nil } // OpenCompressed opens a file for writing and automatically compresses the content if the filename ends with .gz func OpenCompressed(file string, flag int, perm os.FileMode) (io.WriteCloser, error) { - var out io.WriteCloser out, err := os.OpenFile(file, flag, perm) if err != nil { return nil, err @@ -70,7 +70,7 @@ func IsGzip(path string) bool { func CompressByFileType(file string, out io.WriteCloser) io.WriteCloser { if IsGzip(file) { - return gzip.NewWriter(out) + return NewWrappedWriteCloser(gzip.NewWriter(out), out) } return out } diff --git a/op-service/ioutil/streams.go b/op-service/ioutil/streams.go new file mode 100644 index 000000000000..91f122906db0 --- /dev/null +++ b/op-service/ioutil/streams.go @@ -0,0 +1,52 @@ +package ioutil + +import ( + "io" + "os" +) + +var ( + stdOutStream OutputTarget = func() (io.Writer, io.Closer, Aborter, error) { + return os.Stdout, &noopCloser{}, func() {}, nil + } +) + +type Aborter func() + +type OutputTarget func() (io.Writer, io.Closer, Aborter, error) + +func NoOutputStream() OutputTarget { + return func() (io.Writer, io.Closer, Aborter, error) { + return nil, nil, nil, nil + } +} + +func ToAtomicFile(path string, perm os.FileMode) OutputTarget { + return func() (io.Writer, io.Closer, Aborter, error) { + f, err := NewAtomicWriterCompressed(path, perm) + if err != nil { + return nil, nil, nil, err + } + return f, f, func() { _ = f.Abort() }, nil + } +} + +func ToStdOut() OutputTarget { + return stdOutStream +} + +func ToStdOutOrFileOrNoop(outputPath string, perm os.FileMode) OutputTarget { + if outputPath == "" { + return NoOutputStream() + } else if outputPath == "-" { + return ToStdOut() + } else { + return ToAtomicFile(outputPath, perm) + } +} + +type noopCloser struct{} + +func (c *noopCloser) Close() error { + return nil +} diff --git a/op-service/ioutil/streams_test.go b/op-service/ioutil/streams_test.go new file mode 100644 index 000000000000..cbbed7e62171 --- /dev/null +++ b/op-service/ioutil/streams_test.go @@ -0,0 +1,100 @@ +package ioutil + +import ( + "os" + "path/filepath" + "testing" + + "github.com/stretchr/testify/require" +) + +func TestNoOutputStream(t *testing.T) { + writer, closer, aborter, err := NoOutputStream()() + require.NoError(t, err) + require.Nil(t, writer) + require.Nil(t, closer) + require.Nil(t, aborter) +} + +func TestToStdOut(t *testing.T) { + writer, closer, aborter, err := ToStdOut()() + require.NoError(t, err) + require.Same(t, os.Stdout, writer) + + // Should not close StdOut + require.NoError(t, closer.Close()) + _, err = os.Stdout.WriteString("TestToStdOut After Close\n") + require.NoError(t, err) + + aborter() + _, err = os.Stdout.WriteString("TestToStdOut After Abort\n") + require.NoError(t, err) +} + +func TestToAtomicFile(t *testing.T) { + t.Run("Abort", func(t *testing.T) { + dir := t.TempDir() + path := filepath.Join(dir, "test.txt") + writer, closer, aborter, err := ToAtomicFile(path, 0o644)() + defer closer.Close() + require.NoError(t, err) + + expected := []byte("test") + _, err = writer.Write(expected) + require.NoError(t, err) + aborter() + + _, err = os.Stat(path) + require.ErrorIs(t, err, os.ErrNotExist, "Should not have written file") + }) + + t.Run("Close", func(t *testing.T) { + dir := t.TempDir() + path := filepath.Join(dir, "test.txt") + writer, closer, _, err := ToAtomicFile(path, 0o644)() + defer closer.Close() + require.NoError(t, err) + + expected := []byte("test") + _, err = writer.Write(expected) + require.NoError(t, err) + + _, err = os.Stat(path) + require.ErrorIs(t, err, os.ErrNotExist, "Target file should not exist prior to Close") + + require.NoError(t, closer.Close()) + actual, err := os.ReadFile(path) + require.NoError(t, err) + require.Equal(t, expected, actual) + }) +} + +func TestToStdOutOrFileOrNoop(t *testing.T) { + t.Run("EmptyOutputPath", func(t *testing.T) { + writer, _, _, err := ToStdOutOrFileOrNoop("", 0o644)() + require.NoError(t, err) + require.Nil(t, writer, "Should use no output stream") + }) + + t.Run("StdOut", func(t *testing.T) { + writer, _, _, err := ToStdOutOrFileOrNoop("-", 0o644)() + require.NoError(t, err) + require.Same(t, os.Stdout, writer, "Should use std out") + }) + + t.Run("File", func(t *testing.T) { + dir := t.TempDir() + path := filepath.Join(dir, "test.txt") + writer, closer, _, err := ToStdOutOrFileOrNoop(path, 0o644)() + defer closer.Close() + require.NoError(t, err) + + expected := []byte("test") + _, err = writer.Write(expected) + require.NoError(t, err) + require.NoError(t, closer.Close()) + actual, err := os.ReadFile(path) + require.NoError(t, err) + require.Equal(t, expected, actual) + }) +} diff --git a/op-service/ioutil/wrapped_closer.go b/op-service/ioutil/wrapped_closer.go new file mode 100644 index 000000000000..3440ca677cb2 --- /dev/null +++ b/op-service/ioutil/wrapped_closer.go @@ -0,0 +1,44 @@ +package ioutil + +import ( + "errors" + "io" +) + +// WrappedReadCloser is a struct that closes both the gzip.Reader and the underlying io.Closer. +type WrappedReadCloser struct { + io.ReadCloser + closer io.Closer +} + +// WrappedWriteCloser is a struct that closes both the gzip.Writer and the underlying io.Closer. +type WrappedWriteCloser struct { + io.WriteCloser + closer io.Closer +} + +// Close closes both the gzip.Reader and the underlying reader. +func (g *WrappedReadCloser) Close() error { + return errors.Join(g.ReadCloser.Close(), g.closer.Close()) +} + +// Close closes both the gzip.Writer and the underlying writer. +func (g *WrappedWriteCloser) Close() error { + return errors.Join(g.WriteCloser.Close(), g.closer.Close()) +} + +// NewWrappedReadCloser is a constructor function that initializes a WrappedReadCloser structure. +func NewWrappedReadCloser(r io.ReadCloser, c io.Closer) *WrappedReadCloser { + return &WrappedReadCloser{ + ReadCloser: r, + closer: c, + } +} + +// NewWrappedWriteCloser is a constructor function that initializes a WrappedWriteCloser structure. +func NewWrappedWriteCloser(r io.WriteCloser, c io.Closer) *WrappedWriteCloser { + return &WrappedWriteCloser{ + WriteCloser: r, + closer: c, + } +} diff --git a/op-service/jsonutil/json.go b/op-service/jsonutil/json.go index 9dd5db448246..5993138595b4 100644 --- a/op-service/jsonutil/json.go +++ b/op-service/jsonutil/json.go @@ -5,12 +5,106 @@ import ( "errors" "fmt" "io" - "os" + + "github.com/BurntSushi/toml" "github.com/ethereum-optimism/optimism/op-service/ioutil" ) +type Decoder interface { + Decode(v interface{}) error +} + +type DecoderFactory func(r io.Reader) Decoder + +type Encoder interface { + Encode(v interface{}) error +} + +type EncoderFactory func(w io.Writer) Encoder + +type jsonDecoder struct { + d *json.Decoder +} + +func newJSONDecoder(r io.Reader) Decoder { + return &jsonDecoder{ + d: json.NewDecoder(r), + } +} + +func (d *jsonDecoder) Decode(v interface{}) error { + if err := d.d.Decode(v); err != nil { + return fmt.Errorf("failed to decode JSON: %w", err) + } + if _, err := d.d.Token(); err != io.EOF { + return errors.New("unexpected trailing data") + } + return nil +} + +type tomlDecoder struct { + r io.Reader +} + +func newTOMLDecoder(r io.Reader) Decoder { + return &tomlDecoder{ + r: r, + } +} + +func (d *tomlDecoder) Decode(v interface{}) error { + if _, err := toml.NewDecoder(d.r).Decode(v); err != nil { + return fmt.Errorf("failed to decode TOML: %w", err) + } + return nil +} + +type jsonEncoder struct { + e *json.Encoder +} + +func newJSONEncoder(w io.Writer) Encoder { + e := json.NewEncoder(w) + e.SetIndent("", " ") + return &jsonEncoder{ + e: e, + } +} + +func (e *jsonEncoder) Encode(v interface{}) error { + if err := e.e.Encode(v); err != nil { + return fmt.Errorf("failed to encode JSON: %w", err) + } + return nil +} + +type tomlEncoder struct { + w io.Writer +} + +func newTOMLEncoder(w io.Writer) Encoder { + return &tomlEncoder{ + w: w, + } +} + +func (e *tomlEncoder) Encode(v interface{}) error { + if err := toml.NewEncoder(e.w).Encode(v); err != nil { + return fmt.Errorf("failed to encode TOML: %w", err) + } + return nil +} + func LoadJSON[X any](inputPath string) (*X, error) { + return load[X](inputPath, newJSONDecoder) +} + +func LoadTOML[X any](inputPath string) (*X, error) { + return load[X](inputPath, newTOMLDecoder) +} + +func load[X any](inputPath string, dec DecoderFactory) (*X, error) { if inputPath == "" { return nil, errors.New("no path specified") } @@ -21,47 +115,37 @@ func LoadJSON[X any](inputPath string) (*X, error) { } defer f.Close() var state X - decoder := json.NewDecoder(f) - if err := decoder.Decode(&state); err != nil { + if err := dec(f).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 } -func WriteJSON[X any](outputPath string, value X, perm os.FileMode) error { - if outputPath == "" { - return nil - } - var out io.Writer - finish := func() error { return nil } - if outputPath != "-" { - f, err := ioutil.NewAtomicWriterCompressed(outputPath, perm) - if err != nil { - return fmt.Errorf("failed to open output file: %w", err) - } - // Ensure we close the stream even if failures occur. - defer f.Close() - out = f - // Closing the file causes it to be renamed to the final destination - // so make sure we handle any errors it returns - finish = f.Close - } else { - out = os.Stdout - } - enc := json.NewEncoder(out) - enc.SetIndent("", " ") - if err := enc.Encode(value); err != nil { - return fmt.Errorf("failed to encode to JSON: %w", err) - } - _, err := out.Write([]byte{'\n'}) +func WriteJSON[X any](value X, target ioutil.OutputTarget) error { + return write(value, target, newJSONEncoder) +} + +func WriteTOML[X any](value X, target ioutil.OutputTarget) error { + return write(value, target, newTOMLEncoder) +} + +func write[X any](value X, target ioutil.OutputTarget, enc EncoderFactory) error { + out, closer, abort, err := target() + if err != nil { + return err + } + if out == nil { + return nil // No output stream selected so skip generating the content entirely + } + defer abort() + if err := enc(out).Encode(value); err != nil { + return fmt.Errorf("failed to encode: %w", err) + } + _, err = out.Write([]byte{'\n'}) if err != nil { return fmt.Errorf("failed to append new-line: %w", err) } - if err := finish(); err != nil { + if err := closer.Close(); err != nil { return fmt.Errorf("failed to finish write: %w", err) } return nil diff --git a/op-service/jsonutil/json_test.go b/op-service/jsonutil/json_test.go index 9a143d0c2579..36bda167491b 100644 --- a/op-service/jsonutil/json_test.go +++ b/op-service/jsonutil/json_test.go @@ -2,11 +2,11 @@ package jsonutil import ( "encoding/json" - "fmt" "os" "path/filepath" "testing" + "github.com/ethereum-optimism/optimism/op-service/ioutil" "github.com/stretchr/testify/require" ) @@ -14,7 +14,7 @@ func TestRoundTripJSON(t *testing.T) { dir := t.TempDir() file := filepath.Join(dir, "test.json") data := &jsonTestData{A: "yay", B: 3} - err := WriteJSON(file, data, 0o755) + err := WriteJSON(data, ioutil.ToAtomicFile(file, 0o755)) require.NoError(t, err) // Confirm the file is uncompressed @@ -33,7 +33,7 @@ func TestRoundTripJSONWithGzip(t *testing.T) { dir := t.TempDir() file := filepath.Join(dir, "test.json.gz") data := &jsonTestData{A: "yay", B: 3} - err := WriteJSON(file, data, 0o755) + err := WriteJSON(data, ioutil.ToAtomicFile(file, 0o755)) require.NoError(t, err) // Confirm the file isn't raw JSON @@ -87,14 +87,14 @@ func TestLoadJSONWithExtraDataAppended(t *testing.T) { require.NoError(t, err) // Write primary json payload + extra data to the file - err = WriteJSON(file, data, 0o755) + err = WriteJSON(data, ioutil.ToAtomicFile(file, 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.ErrorContains(t, err, "unexpected trailing data") require.Nil(t, result) }) } @@ -130,7 +130,7 @@ func TestLoadJSONWithTrailingWhitespace(t *testing.T) { data := &jsonTestData{A: "yay", B: 3} // Write primary json payload + extra data to the file - err := WriteJSON(file, data, 0o755) + err := WriteJSON(data, ioutil.ToAtomicFile(file, 0o755)) require.NoError(t, err) err = appendDataToFile(file, tc.extraData) require.NoError(t, err) diff --git a/op-service/log/cli.go b/op-service/log/cli.go index afac61483391..b51a48930b42 100644 --- a/op-service/log/cli.go +++ b/op-service/log/cli.go @@ -3,11 +3,11 @@ package log import ( "fmt" "io" + "log/slog" "os" "strings" "github.com/urfave/cli/v2" - "golang.org/x/exp/slog" "golang.org/x/term" "github.com/ethereum/go-ethereum/log" @@ -20,6 +20,7 @@ const ( LevelFlagName = "log.level" FormatFlagName = "log.format" ColorFlagName = "log.color" + PidFlagName = "log.pid" ) func CLIFlags(envPrefix string) []cli.Flag { @@ -51,6 +52,12 @@ func CLIFlagsWithCategory(envPrefix string, category string) []cli.Flag { EnvVars: opservice.PrefixEnvVar(envPrefix, "LOG_COLOR"), Category: category, }, + &cli.BoolFlag{ + Name: PidFlagName, + Usage: "Show pid in the log", + EnvVars: opservice.PrefixEnvVar(envPrefix, "LOG_PID"), + Category: category, + }, } } @@ -133,7 +140,7 @@ func FormatHandler(ft FormatType, color bool) func(io.Writer) slog.Handler { case FormatJSON: return log.JSONHandler case FormatText: - if term.IsTerminal(int(os.Stdout.Fd())) { + if color { return termColorHandler } else { return logfmtHandler @@ -187,6 +194,7 @@ type CLIConfig struct { Level slog.Level Color bool Format FormatType + Pid bool } // AppOut returns an io.Writer to write app output to, like logs. @@ -208,7 +216,11 @@ func NewLogHandler(wr io.Writer, cfg CLIConfig) slog.Handler { // The log handler of the logger is a LvlSetter, i.e. the log level can be changed as needed. func NewLogger(wr io.Writer, cfg CLIConfig) log.Logger { h := NewLogHandler(wr, cfg) - return log.NewLogger(h) + l := log.NewLogger(h) + if cfg.Pid { + l = l.With("pid", os.Getpid()) + } + return l } // SetGlobalLogHandler sets the log handles as the handler of the global default logger. @@ -237,5 +249,6 @@ func ReadCLIConfig(ctx *cli.Context) CLIConfig { if ctx.IsSet(ColorFlagName) { cfg.Color = ctx.Bool(ColorFlagName) } + cfg.Pid = ctx.Bool(PidFlagName) return cfg } diff --git a/op-service/log/dynamic.go b/op-service/log/dynamic.go index 72f23f505bbc..0259fb15b201 100644 --- a/op-service/log/dynamic.go +++ b/op-service/log/dynamic.go @@ -2,8 +2,7 @@ package log import ( "context" - - "golang.org/x/exp/slog" + "log/slog" ) type LvlSetter interface { diff --git a/op-service/log/dynamic_test.go b/op-service/log/dynamic_test.go index 3a992710b4d8..25076246364c 100644 --- a/op-service/log/dynamic_test.go +++ b/op-service/log/dynamic_test.go @@ -2,10 +2,10 @@ package log import ( "context" + "log/slog" "testing" "github.com/stretchr/testify/require" - "golang.org/x/exp/slog" "github.com/ethereum/go-ethereum/log" ) diff --git a/op-service/log/writer.go b/op-service/log/writer.go index 0a1731383068..e3c658d3a7b8 100644 --- a/op-service/log/writer.go +++ b/op-service/log/writer.go @@ -1,10 +1,9 @@ package log import ( + "log/slog" "sync" - "golang.org/x/exp/slog" - "github.com/ethereum/go-ethereum/log" ) diff --git a/op-service/log/writer_test.go b/op-service/log/writer_test.go index 2e9cf14b3a75..274a2aa2a3d0 100644 --- a/op-service/log/writer_test.go +++ b/op-service/log/writer_test.go @@ -2,10 +2,10 @@ package log_test import ( "io" + "log/slog" "testing" "github.com/stretchr/testify/require" - "golang.org/x/exp/slog" "github.com/ethereum/go-ethereum/log" diff --git a/op-service/metrics/balance.go b/op-service/metrics/balance.go index 8da012813268..4c11ef998967 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,25 +10,16 @@ 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 func LaunchBalanceMetrics(log log.Logger, r *prometheus.Registry, ns string, client *ethclient.Client, account common.Address) *clock.LoopFn { - balanceGuage := promauto.With(r).NewGauge(prometheus.GaugeOpts{ + balanceGauge := promauto.With(r).NewGauge(prometheus.GaugeOpts{ Namespace: ns, Name: "balance", Help: "balance (in ether) of account " + account.String(), @@ -42,8 +32,8 @@ 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) - balanceGuage.Set(bal) + bal := eth.WeiToEther(bigBal) + balanceGauge.Set(bal) }, func() error { log.Info("balance metrics shutting down") return nil diff --git a/op-service/metrics/cli.go b/op-service/metrics/cli.go index ac02e33bf0c6..d5c8151b889a 100644 --- a/op-service/metrics/cli.go +++ b/op-service/metrics/cli.go @@ -17,6 +17,8 @@ const ( defaultListenPort = 7300 ) +var ErrInvalidPort = errors.New("invalid metrics port") + func DefaultCLIConfig() CLIConfig { return CLIConfig{ Enabled: false, @@ -35,7 +37,7 @@ func CLIFlags(envPrefix string) []cli.Flag { &cli.StringFlag{ Name: ListenAddrFlagName, Usage: "Metrics listening address", - Value: defaultListenAddr, // TODO(CLI-4159): Switch to 127.0.0.1 + Value: defaultListenAddr, // TODO: Switch to 127.0.0.1 EnvVars: opservice.PrefixEnvVar(envPrefix, "METRICS_ADDR"), }, &cli.IntFlag{ @@ -59,7 +61,7 @@ func (m CLIConfig) Check() error { } if m.ListenPort < 0 || m.ListenPort > math.MaxUint16 { - return errors.New("invalid metrics port") + return ErrInvalidPort } return nil diff --git a/op-service/metrics/http.go b/op-service/metrics/http.go index 8640fe02a6f2..60609c563dca 100644 --- a/op-service/metrics/http.go +++ b/op-service/metrics/http.go @@ -65,7 +65,7 @@ var LatencyBuckets = []float64{.025, .05, .1, .25, .5, 1, 2.5, 5, 10, 25, 50, 10 func NewPromHTTPRecorder(r *prometheus.Registry, ns string) HTTPRecorder { return &PromHTTPRecorder{ - // TODO(INF-509): remove this in the future when services opted in to HTTPRequestLatency + // TODO: remove this in the future when services opted in to HTTPRequestLatency HTTPRequestDuration: promauto.With(r).NewHistogramVec(prometheus.HistogramOpts{ Namespace: ns, Name: "http_request_duration_ms", @@ -104,7 +104,7 @@ func NewPromHTTPRecorder(r *prometheus.Registry, ns string) HTTPRecorder { } func (p *PromHTTPRecorder) RecordHTTPRequestDuration(params *HTTPParams, dur time.Duration) { - // TODO(INF-509): remove this in the future when services opted in to new metric + // TODO: remove this in the future when services opted in to new metric p.HTTPRequestDuration.WithLabelValues(params.Method, strconv.Itoa(params.StatusCode)). Observe(float64(dur.Milliseconds())) diff --git a/op-service/opio/interrupts.go b/op-service/opio/interrupts.go deleted file mode 100644 index cd1b8485791d..000000000000 --- a/op-service/opio/interrupts.go +++ /dev/null @@ -1,114 +0,0 @@ -package opio - -import ( - "context" - "os" - "os/signal" - "syscall" -) - -// DefaultInterruptSignals is a set of default interrupt signals. -var DefaultInterruptSignals = []os.Signal{ - os.Interrupt, - os.Kill, - syscall.SIGTERM, - syscall.SIGQUIT, -} - -// BlockOnInterrupts blocks until a SIGTERM is received. -// Passing in signals will override the default signals. -func BlockOnInterrupts(signals ...os.Signal) { - if len(signals) == 0 { - signals = DefaultInterruptSignals - } - interruptChannel := make(chan os.Signal, 1) - signal.Notify(interruptChannel, signals...) - <-interruptChannel -} - -// BlockOnInterruptsContext blocks until a SIGTERM is received. -// Passing in signals will override the default signals. -// The function will stop blocking if the context is closed. -func BlockOnInterruptsContext(ctx context.Context, signals ...os.Signal) { - if len(signals) == 0 { - signals = DefaultInterruptSignals - } - interruptChannel := make(chan os.Signal, 1) - signal.Notify(interruptChannel, signals...) - select { - case <-interruptChannel: - case <-ctx.Done(): - signal.Stop(interruptChannel) - } -} - -type interruptContextKeyType struct{} - -var blockerContextKey = interruptContextKeyType{} - -type interruptCatcher struct { - incoming chan os.Signal -} - -// Block blocks until either an interrupt signal is received, or the context is cancelled. -// No error is returned on interrupt. -func (c *interruptCatcher) Block(ctx context.Context) { - select { - case <-c.incoming: - case <-ctx.Done(): - } -} - -// WithInterruptBlocker attaches an interrupt handler to the context, -// which continues to receive signals after every block. -// This helps functions block on individual consecutive interrupts. -func WithInterruptBlocker(ctx context.Context) context.Context { - if ctx.Value(blockerContextKey) != nil { // already has an interrupt handler - return ctx - } - catcher := &interruptCatcher{ - incoming: make(chan os.Signal, 10), - } - signal.Notify(catcher.incoming, DefaultInterruptSignals...) - - return context.WithValue(ctx, blockerContextKey, BlockFn(catcher.Block)) -} - -// WithBlocker overrides the interrupt blocker value, -// e.g. to insert a block-function for testing CLI shutdown without actual process signals. -func WithBlocker(ctx context.Context, fn BlockFn) context.Context { - return context.WithValue(ctx, blockerContextKey, fn) -} - -// BlockFn simply blocks until the implementation of the blocker interrupts it, or till the given context is cancelled. -type BlockFn func(ctx context.Context) - -// BlockerFromContext returns a BlockFn that blocks on interrupts when called. -func BlockerFromContext(ctx context.Context) BlockFn { - v := ctx.Value(blockerContextKey) - if v == nil { - return nil - } - return v.(BlockFn) -} - -// CancelOnInterrupt cancels the given context on interrupt. -// If a BlockFn is attached to the context, this is used as interrupt-blocking. -// If not, then the context blocks on a manually handled interrupt signal. -func CancelOnInterrupt(ctx context.Context) context.Context { - inner, cancel := context.WithCancel(ctx) - - blockOnInterrupt := BlockerFromContext(ctx) - if blockOnInterrupt == nil { - blockOnInterrupt = func(ctx context.Context) { - BlockOnInterruptsContext(ctx) // default signals - } - } - - go func() { - blockOnInterrupt(ctx) - cancel() - }() - - return inner -} diff --git a/op-service/oppprof/cli.go b/op-service/oppprof/cli.go index 710cbeaaf764..6c2c33a14711 100644 --- a/op-service/oppprof/cli.go +++ b/op-service/oppprof/cli.go @@ -22,6 +22,7 @@ const ( defaultListenPort = 6060 ) +var ErrInvalidPort = errors.New("invalid pprof port") var allowedProfileTypes = []profileType{"cpu", "heap", "goroutine", "threadcreate", "block", "mutex", "allocs"} type profileType string @@ -75,7 +76,7 @@ func CLIFlagsWithCategory(envPrefix string, category string) []cli.Flag { &cli.StringFlag{ Name: ListenAddrFlagName, Usage: "pprof listening address", - Value: defaultListenAddr, // TODO(CLI-4159): Switch to 127.0.0.1 + Value: defaultListenAddr, // TODO: Switch to 127.0.0.1 EnvVars: opservice.PrefixEnvVar(envPrefix, "PPROF_ADDR"), Category: category, }, @@ -122,7 +123,7 @@ func (m CLIConfig) Check() error { } if m.ListenPort < 0 || m.ListenPort > math.MaxUint16 { - return errors.New("invalid pprof port") + return ErrInvalidPort } return nil diff --git a/op-service/predeploys/addresses.go b/op-service/predeploys/addresses.go index b1469f5f4e9c..376db039b114 100644 --- a/op-service/predeploys/addresses.go +++ b/op-service/predeploys/addresses.go @@ -26,6 +26,10 @@ const ( SchemaRegistry = "0x4200000000000000000000000000000000000020" EAS = "0x4200000000000000000000000000000000000021" SoulGasToken = "0x4200000000000000000000000000000000000800" + CrossL2Inbox = "0x4200000000000000000000000000000000000022" + L2toL2CrossDomainMessenger = "0x4200000000000000000000000000000000000023" + SuperchainWETH = "0x4200000000000000000000000000000000000024" + ETHLiquidity = "0x4200000000000000000000000000000000000025" Create2Deployer = "0x13b0D85CcB8bf860b6b79AF3029fCA081AE9beF2" MultiCall3 = "0xcA11bde05977b3631167028862bE2a173976CA11" Safe_v130 = "0x69f4D1788e39c87893C980c06EdF4b7f686e2938" @@ -35,8 +39,10 @@ const ( DeterministicDeploymentProxy = "0x4e59b44847b379578588920cA78FbF26c0B4956C" MultiSend_v130 = "0x998739BFdAAdde7C933B942a68053933098f9EDa" Permit2 = "0x000000000022D473030F116dDEE9F6B43aC78BA3" - SenderCreator = "0x7fc98430eaedbb6070b35b39d798725049088348" - EntryPoint = "0x5FF137D4b0FDCD49DcA30c7CF57E578a026d2789" + SenderCreator_v060 = "0x7fc98430eaedbb6070b35b39d798725049088348" + EntryPoint_v060 = "0x5FF137D4b0FDCD49DcA30c7CF57E578a026d2789" + SenderCreator_v070 = "0xEFC2c1444eBCC4Db75e7613d20C6a62fF67A167C" + EntryPoint_v070 = "0x0000000071727De22E5E9d8BAf0edAc6f37da032" ) var ( @@ -60,6 +66,10 @@ var ( SchemaRegistryAddr = common.HexToAddress(SchemaRegistry) EASAddr = common.HexToAddress(EAS) SoulGasTokenAddr = common.HexToAddress(SoulGasToken) + CrossL2InboxAddr = common.HexToAddress(CrossL2Inbox) + L2toL2CrossDomainMessengerAddr = common.HexToAddress(L2toL2CrossDomainMessenger) + SuperchainWETHAddr = common.HexToAddress(SuperchainWETH) + ETHLiquidityAddr = common.HexToAddress(ETHLiquidity) Create2DeployerAddr = common.HexToAddress(Create2Deployer) MultiCall3Addr = common.HexToAddress(MultiCall3) Safe_v130Addr = common.HexToAddress(Safe_v130) @@ -69,8 +79,10 @@ var ( DeterministicDeploymentProxyAddr = common.HexToAddress(DeterministicDeploymentProxy) MultiSend_v130Addr = common.HexToAddress(MultiSend_v130) Permit2Addr = common.HexToAddress(Permit2) - SenderCreatorAddr = common.HexToAddress(SenderCreator) - EntryPointAddr = common.HexToAddress(EntryPoint) + SenderCreator_v060Addr = common.HexToAddress(SenderCreator_v060) + EntryPoint_v060Addr = common.HexToAddress(EntryPoint_v060) + SenderCreator_v070Addr = common.HexToAddress(SenderCreator_v070) + EntryPoint_v070Addr = common.HexToAddress(EntryPoint_v070) Predeploys = make(map[string]*Predeploy) PredeploysByAddress = make(map[common.Address]*Predeploy) @@ -87,6 +99,10 @@ func init() { Predeploys["L1BlockNumber"] = &Predeploy{Address: L1BlockNumberAddr} Predeploys["GasPriceOracle"] = &Predeploy{Address: GasPriceOracleAddr} Predeploys["L1Block"] = &Predeploy{Address: L1BlockAddr} + Predeploys["CrossL2Inbox"] = &Predeploy{Address: CrossL2InboxAddr} + Predeploys["L2toL2CrossDomainMessenger"] = &Predeploy{Address: L2toL2CrossDomainMessengerAddr} + Predeploys["SuperchainWETH"] = &Predeploy{Address: SuperchainWETHAddr} + Predeploys["ETHLiquidity"] = &Predeploy{Address: ETHLiquidityAddr} Predeploys["GovernanceToken"] = &Predeploy{ Address: GovernanceTokenAddr, ProxyDisabled: true, @@ -139,12 +155,20 @@ func init() { Address: Permit2Addr, ProxyDisabled: true, } - Predeploys["SenderCreator"] = &Predeploy{ - Address: SenderCreatorAddr, + Predeploys["SenderCreator_v060"] = &Predeploy{ + Address: SenderCreator_v060Addr, ProxyDisabled: true, } - Predeploys["EntryPoint"] = &Predeploy{ - Address: EntryPointAddr, + Predeploys["EntryPoint_v060"] = &Predeploy{ + Address: EntryPoint_v060Addr, + ProxyDisabled: true, + } + Predeploys["SenderCreator_v070"] = &Predeploy{ + Address: SenderCreator_v070Addr, + ProxyDisabled: true, + } + Predeploys["EntryPoint_v070"] = &Predeploy{ + Address: EntryPoint_v070Addr, ProxyDisabled: true, } diff --git a/op-service/predeploys/addresses_test.go b/op-service/predeploys/addresses_test.go index dfd820d5d143..05559360cb21 100644 --- a/op-service/predeploys/addresses_test.go +++ b/op-service/predeploys/addresses_test.go @@ -8,7 +8,7 @@ import ( ) 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. + // We test if the addresses in geth match those in op monorepo, to avoid an import-cycle: + // we import geth in the monorepo, and do not want to import op monorepo into geth. require.Equal(t, L1BlockAddr, types.L1BlockAddr) } diff --git a/op-service/predeploys/eip4788.go b/op-service/predeploys/eip4788.go index de934e9bced2..02af4640f315 100644 --- a/op-service/predeploys/eip4788.go +++ b/op-service/predeploys/eip4788.go @@ -13,4 +13,5 @@ var ( EIP4788ContractAddr = common.HexToAddress("0x000F3df6D732807Ef1319fB7B8bB8522d0Beac02") EIP4788ContractCode = common.FromHex("0x3373fffffffffffffffffffffffffffffffffffffffe14604d57602036146024575f5ffd5b5f35801560495762001fff810690815414603c575f5ffd5b62001fff01545f5260205ff35b5f5ffd5b62001fff42064281555f359062001fff015500") EIP4788ContractCodeHash = common.HexToHash("0xf57acd40259872606d76197ef052f3d35588dadf919ee1f0e3cb9b62d3f4b02c") + EIP4788ContractDeployer = common.HexToAddress("0x0B799C86a49DEeb90402691F1041aa3AF2d3C875") ) diff --git a/op-service/rethdb-reader/.gitignore b/op-service/rethdb-reader/.gitignore deleted file mode 100644 index 360eaff0efc3..000000000000 --- a/op-service/rethdb-reader/.gitignore +++ /dev/null @@ -1,8 +0,0 @@ -# Target -target/ - -# Bindings -rdb.h - -# Testdata DB -testdata/db diff --git a/op-service/rethdb-reader/Cargo.lock b/op-service/rethdb-reader/Cargo.lock deleted file mode 100644 index 5b4c003d5b0c..000000000000 --- a/op-service/rethdb-reader/Cargo.lock +++ /dev/null @@ -1,4916 +0,0 @@ -# This file is automatically @generated by Cargo. -# It is not intended for manual editing. -version = 3 - -[[package]] -name = "addr2line" -version = "0.21.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "8a30b2e23b9e17a9f90641c7ab1549cd9b44f296d3ccbf309d2863cfe398a0cb" -dependencies = [ - "gimli", -] - -[[package]] -name = "adler" -version = "1.0.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f26201604c87b1e01bd3d98f8d5d9a8fcbb815e8cedb41ffccbeb4bf593a35fe" - -[[package]] -name = "aead" -version = "0.4.3" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "0b613b8e1e3cf911a086f53f03bf286f52fd7a7258e4fa606f0ef220d39d8877" -dependencies = [ - "generic-array", -] - -[[package]] -name = "aes" -version = "0.7.5" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "9e8b47f52ea9bae42228d07ec09eb676433d7c4ed1ebdf0f1d1c29ed446f1ab8" -dependencies = [ - "cfg-if", - "cipher 0.3.0", - "cpufeatures", - "ctr 0.8.0", - "opaque-debug", -] - -[[package]] -name = "aes" -version = "0.8.4" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b169f7a6d4742236a0a00c541b845991d0ac43e546831af1249753ab4c3aa3a0" -dependencies = [ - "cfg-if", - "cipher 0.4.4", - "cpufeatures", -] - -[[package]] -name = "aes-gcm" -version = "0.9.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "bc3be92e19a7ef47457b8e6f90707e12b6ac5d20c6f3866584fa3be0787d839f" -dependencies = [ - "aead", - "aes 0.7.5", - "cipher 0.3.0", - "ctr 0.7.0", - "ghash", - "subtle", -] - -[[package]] -name = "ahash" -version = "0.8.10" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "8b79b82693f705137f8fb9b37871d99e4f9a7df12b917eed79c3d3954830a60b" -dependencies = [ - "cfg-if", - "once_cell", - "version_check", - "zerocopy", -] - -[[package]] -name = "aho-corasick" -version = "1.1.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b2969dcb958b36655471fc61f7e416fa76033bdd4bfed0678d8fee1e2d07a1f0" -dependencies = [ - "memchr", -] - -[[package]] -name = "allocator-api2" -version = "0.2.16" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "0942ffc6dcaadf03badf6e6a2d0228460359d5e34b57ccdc720b7382dfbd5ec5" - -[[package]] -name = "alloy-chains" -version = "0.1.13" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "fe92bd1fb0c96e938f9f2284618028e5f4dc3d719cac32631ed51e1b86a06895" -dependencies = [ - "alloy-rlp", - "arbitrary", - "num_enum", - "proptest", - "serde", - "strum", -] - -[[package]] -name = "alloy-eips" -version = "0.1.0" -source = "git+https://github.com/alloy-rs/alloy?rev=76c70fb#76c70fb9d44ace661bbf33408c2527e3874c964e" -dependencies = [ - "alloy-primitives", - "alloy-rlp", - "thiserror", -] - -[[package]] -name = "alloy-genesis" -version = "0.1.0" -source = "git+https://github.com/alloy-rs/alloy?rev=76c70fb#76c70fb9d44ace661bbf33408c2527e3874c964e" -dependencies = [ - "alloy-primitives", - "alloy-rpc-types", - "serde", -] - -[[package]] -name = "alloy-primitives" -version = "0.6.3" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ef197eb250c64962003cb08b90b17f0882c192f4a6f2f544809d424fd7cb0e7d" -dependencies = [ - "alloy-rlp", - "bytes", - "cfg-if", - "const-hex", - "derive_more", - "getrandom 0.2.12", - "hex-literal", - "itoa", - "k256", - "keccak-asm", - "proptest", - "rand 0.8.5", - "ruint", - "serde", - "tiny-keccak", -] - -[[package]] -name = "alloy-rlp" -version = "0.3.4" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "8d58d9f5da7b40e9bfff0b7e7816700be4019db97d4b6359fe7f94a9e22e42ac" -dependencies = [ - "alloy-rlp-derive", - "arrayvec", - "bytes", -] - -[[package]] -name = "alloy-rlp-derive" -version = "0.3.4" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "1a047897373be4bbb0224c1afdabca92648dc57a9c9ef6e7b0be3aff7a859c83" -dependencies = [ - "proc-macro2", - "quote", - "syn 2.0.52", -] - -[[package]] -name = "alloy-rpc-engine-types" -version = "0.1.0" -source = "git+https://github.com/alloy-rs/alloy?rev=76c70fb#76c70fb9d44ace661bbf33408c2527e3874c964e" -dependencies = [ - "alloy-primitives", - "alloy-rlp", - "alloy-rpc-types", - "jsonrpsee-types", - "serde", - "thiserror", -] - -[[package]] -name = "alloy-rpc-trace-types" -version = "0.1.0" -source = "git+https://github.com/alloy-rs/alloy?rev=76c70fb#76c70fb9d44ace661bbf33408c2527e3874c964e" -dependencies = [ - "alloy-primitives", - "alloy-rpc-types", - "serde", - "serde_json", -] - -[[package]] -name = "alloy-rpc-types" -version = "0.1.0" -source = "git+https://github.com/alloy-rs/alloy?rev=76c70fb#76c70fb9d44ace661bbf33408c2527e3874c964e" -dependencies = [ - "alloy-primitives", - "alloy-rlp", - "itertools 0.12.1", - "jsonrpsee-types", - "serde", - "serde_json", - "thiserror", -] - -[[package]] -name = "alloy-sol-macro" -version = "0.6.3" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "82e92100dee7fd1e44abbe0ef6607f18758cf0ad4e483f4c65ff5c8d85428a6d" -dependencies = [ - "const-hex", - "dunce", - "heck", - "indexmap 2.2.3", - "proc-macro-error", - "proc-macro2", - "quote", - "syn 2.0.52", - "syn-solidity", - "tiny-keccak", -] - -[[package]] -name = "alloy-sol-types" -version = "0.6.3" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "3e7c6a8c492b1d6a4f92a8fc6a13cf39473978dd7d459d7221969ce5a73d97cd" -dependencies = [ - "alloy-primitives", - "alloy-sol-macro", - "const-hex", - "serde", -] - -[[package]] -name = "alloy-trie" -version = "0.3.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "6b9e1498416f7e7f09af8061970e14936846b6271e153aa5ba539a22a7eb414d" -dependencies = [ - "alloy-primitives", - "alloy-rlp", - "derive_more", - "hashbrown 0.14.3", - "nybbles", - "serde", - "smallvec", - "tracing", -] - -[[package]] -name = "android-tzdata" -version = "0.1.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e999941b234f3131b00bc13c22d06e8c5ff726d1b6318ac7eb276997bbb4fef0" - -[[package]] -name = "android_system_properties" -version = "0.1.5" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "819e7219dbd41043ac279b19830f2efc897156490d7fd6ea916720117ee66311" -dependencies = [ - "libc", -] - -[[package]] -name = "anstream" -version = "0.6.13" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d96bd03f33fe50a863e394ee9718a706f988b9079b20c3784fb726e7678b62fb" -dependencies = [ - "anstyle", - "anstyle-parse", - "anstyle-query", - "anstyle-wincon", - "colorchoice", - "utf8parse", -] - -[[package]] -name = "anstyle" -version = "1.0.6" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "8901269c6307e8d93993578286ac0edf7f195079ffff5ebdeea6a59ffb7e36bc" - -[[package]] -name = "anstyle-parse" -version = "0.2.3" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c75ac65da39e5fe5ab759307499ddad880d724eed2f6ce5b5e8a26f4f387928c" -dependencies = [ - "utf8parse", -] - -[[package]] -name = "anstyle-query" -version = "1.0.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e28923312444cdd728e4738b3f9c9cac739500909bb3d3c94b43551b16517648" -dependencies = [ - "windows-sys 0.52.0", -] - -[[package]] -name = "anstyle-wincon" -version = "3.0.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "1cd54b81ec8d6180e24654d0b371ad22fc3dd083b6ff8ba325b72e00c87660a7" -dependencies = [ - "anstyle", - "windows-sys 0.52.0", -] - -[[package]] -name = "anyhow" -version = "1.0.80" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "5ad32ce52e4161730f7098c077cd2ed6229b5804ccf99e5366be1ab72a98b4e1" - -[[package]] -name = "aquamarine" -version = "0.5.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "21cc1548309245035eb18aa7f0967da6bc65587005170c56e6ef2788a4cf3f4e" -dependencies = [ - "include_dir", - "itertools 0.10.5", - "proc-macro-error", - "proc-macro2", - "quote", - "syn 2.0.52", -] - -[[package]] -name = "arbitrary" -version = "1.3.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "7d5a26814d8dcb93b0e5a0ff3c6d80a8843bafb21b39e8e18a6f05471870e110" - -[[package]] -name = "ark-ff" -version = "0.3.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "6b3235cc41ee7a12aaaf2c575a2ad7b46713a8a50bda2fc3b003a04845c05dd6" -dependencies = [ - "ark-ff-asm 0.3.0", - "ark-ff-macros 0.3.0", - "ark-serialize 0.3.0", - "ark-std 0.3.0", - "derivative", - "num-bigint", - "num-traits", - "paste", - "rustc_version 0.3.3", - "zeroize", -] - -[[package]] -name = "ark-ff" -version = "0.4.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ec847af850f44ad29048935519032c33da8aa03340876d351dfab5660d2966ba" -dependencies = [ - "ark-ff-asm 0.4.2", - "ark-ff-macros 0.4.2", - "ark-serialize 0.4.2", - "ark-std 0.4.0", - "derivative", - "digest 0.10.7", - "itertools 0.10.5", - "num-bigint", - "num-traits", - "paste", - "rustc_version 0.4.0", - "zeroize", -] - -[[package]] -name = "ark-ff-asm" -version = "0.3.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "db02d390bf6643fb404d3d22d31aee1c4bc4459600aef9113833d17e786c6e44" -dependencies = [ - "quote", - "syn 1.0.109", -] - -[[package]] -name = "ark-ff-asm" -version = "0.4.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "3ed4aa4fe255d0bc6d79373f7e31d2ea147bcf486cba1be5ba7ea85abdb92348" -dependencies = [ - "quote", - "syn 1.0.109", -] - -[[package]] -name = "ark-ff-macros" -version = "0.3.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "db2fd794a08ccb318058009eefdf15bcaaaaf6f8161eb3345f907222bac38b20" -dependencies = [ - "num-bigint", - "num-traits", - "quote", - "syn 1.0.109", -] - -[[package]] -name = "ark-ff-macros" -version = "0.4.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "7abe79b0e4288889c4574159ab790824d0033b9fdcb2a112a3182fac2e514565" -dependencies = [ - "num-bigint", - "num-traits", - "proc-macro2", - "quote", - "syn 1.0.109", -] - -[[package]] -name = "ark-serialize" -version = "0.3.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "1d6c2b318ee6e10f8c2853e73a83adc0ccb88995aa978d8a3408d492ab2ee671" -dependencies = [ - "ark-std 0.3.0", - "digest 0.9.0", -] - -[[package]] -name = "ark-serialize" -version = "0.4.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "adb7b85a02b83d2f22f89bd5cac66c9c89474240cb6207cb1efc16d098e822a5" -dependencies = [ - "ark-std 0.4.0", - "digest 0.10.7", - "num-bigint", -] - -[[package]] -name = "ark-std" -version = "0.3.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "1df2c09229cbc5a028b1d70e00fdb2acee28b1055dfb5ca73eea49c5a25c4e7c" -dependencies = [ - "num-traits", - "rand 0.8.5", -] - -[[package]] -name = "ark-std" -version = "0.4.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "94893f1e0c6eeab764ade8dc4c0db24caf4fe7cbbaafc0eba0a9030f447b5185" -dependencies = [ - "num-traits", - "rand 0.8.5", -] - -[[package]] -name = "arrayvec" -version = "0.7.4" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "96d30a06541fbafbc7f82ed10c06164cfbd2c401138f6addd8404629c4b16711" - -[[package]] -name = "async-trait" -version = "0.1.77" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c980ee35e870bd1a4d2c8294d4c04d0499e67bca1e4b5cefcc693c2fa00caea9" -dependencies = [ - "proc-macro2", - "quote", - "syn 2.0.52", -] - -[[package]] -name = "attohttpc" -version = "0.24.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "8d9a9bf8b79a749ee0b911b91b671cc2b6c670bdbc7e3dfd537576ddc94bb2a2" -dependencies = [ - "http", - "log", - "url", -] - -[[package]] -name = "aurora-engine-modexp" -version = "1.0.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "bfacad86e9e138fca0670949eb8ed4ffdf73a55bded8887efe0863cd1a3a6f70" -dependencies = [ - "hex", - "num", -] - -[[package]] -name = "auto_impl" -version = "1.2.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "3c87f3f15e7794432337fc718554eaa4dc8f04c9677a950ffe366f20a162ae42" -dependencies = [ - "proc-macro2", - "quote", - "syn 2.0.52", -] - -[[package]] -name = "autocfg" -version = "1.1.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d468802bab17cbc0cc575e9b053f41e72aa36bfa6b7f55e3529ffa43161b97fa" - -[[package]] -name = "backtrace" -version = "0.3.69" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "2089b7e3f35b9dd2d0ed921ead4f6d318c27680d4a5bd167b3ee120edb105837" -dependencies = [ - "addr2line", - "cc", - "cfg-if", - "libc", - "miniz_oxide", - "object", - "rustc-demangle", -] - -[[package]] -name = "base16ct" -version = "0.2.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "4c7f02d4ea65f2c1853089ffd8d2787bdbc63de2f0d29dedbcf8ccdfa0ccd4cf" - -[[package]] -name = "base64" -version = "0.21.7" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "9d297deb1925b89f2ccc13d7635fa0714f12c87adce1c75356b39ca9b7178567" - -[[package]] -name = "base64ct" -version = "1.6.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "8c3c1a368f70d6cf7302d78f8f7093da241fb8e8807c05cc9e51a125895a6d5b" - -[[package]] -name = "beef" -version = "0.5.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "3a8241f3ebb85c056b509d4327ad0358fbbba6ffb340bf388f26350aeda225b1" -dependencies = [ - "serde", -] - -[[package]] -name = "bincode" -version = "1.3.3" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b1f45e9417d87227c7a56d22e471c6206462cba514c7590c09aff4cf6d1ddcad" -dependencies = [ - "serde", -] - -[[package]] -name = "bindgen" -version = "0.69.4" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a00dc851838a2120612785d195287475a3ac45514741da670b735818822129a0" -dependencies = [ - "bitflags 2.4.2", - "cexpr", - "clang-sys", - "itertools 0.12.1", - "lazy_static", - "lazycell", - "proc-macro2", - "quote", - "regex", - "rustc-hash", - "shlex", - "syn 2.0.52", -] - -[[package]] -name = "binout" -version = "0.2.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b60b1af88a588fca5fe424ae7d735bc52814f80ff57614f57043cc4e2024f2ea" - -[[package]] -name = "bit-set" -version = "0.5.3" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "0700ddab506f33b20a03b13996eccd309a48e5ff77d0d95926aa0210fb4e95f1" -dependencies = [ - "bit-vec", -] - -[[package]] -name = "bit-vec" -version = "0.6.3" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "349f9b6a179ed607305526ca489b34ad0a41aed5f7980fa90eb03160b69598fb" - -[[package]] -name = "bitflags" -version = "1.3.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "bef38d45163c2f1dde094a7dfd33ccf595c92905c8f8f4fdc18d06fb1037718a" - -[[package]] -name = "bitflags" -version = "2.4.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ed570934406eb16438a4e976b1b4500774099c13b8cb96eec99f620f05090ddf" -dependencies = [ - "serde", -] - -[[package]] -name = "bitm" -version = "0.4.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "31b9ea263f0faf826a1c9de0e8bf8f32f5986c05f5e3abcf6bcde74616009586" -dependencies = [ - "dyn_size_of", -] - -[[package]] -name = "bitvec" -version = "1.0.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "1bc2832c24239b0141d5674bb9174f9d68a8b5b3f2753311927c172ca46f7e9c" -dependencies = [ - "funty", - "radium", - "serde", - "tap", - "wyz", -] - -[[package]] -name = "block-buffer" -version = "0.10.4" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "3078c7629b62d3f0439517fa394996acacc5cbc91c5a20d8c658e77abd503a71" -dependencies = [ - "generic-array", -] - -[[package]] -name = "block-padding" -version = "0.3.3" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a8894febbff9f758034a5b8e12d87918f56dfc64a8e1fe757d65e29041538d93" -dependencies = [ - "generic-array", -] - -[[package]] -name = "blst" -version = "0.3.11" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c94087b935a822949d3291a9989ad2b2051ea141eda0fd4e478a75f6aa3e604b" -dependencies = [ - "cc", - "glob", - "threadpool", - "zeroize", -] - -[[package]] -name = "bumpalo" -version = "3.15.3" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "8ea184aa71bb362a1157c896979544cc23974e08fd265f29ea96b59f0b4a555b" - -[[package]] -name = "byte-slice-cast" -version = "1.2.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c3ac9f8b63eca6fd385229b3675f6cc0dc5c8a5c8a54a59d4f52ffd670d87b0c" - -[[package]] -name = "byteorder" -version = "1.5.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "1fd0f2584146f6f2ef48085050886acf353beff7305ebd1ae69500e27c67f64b" - -[[package]] -name = "bytes" -version = "1.5.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a2bd12c1caf447e69cd4528f47f94d203fd2582878ecb9e9465484c4148a8223" -dependencies = [ - "serde", -] - -[[package]] -name = "c-kzg" -version = "0.4.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "94a4bc5367b6284358d2a6a6a1dc2d92ec4b86034561c3b9d3341909752fd848" -dependencies = [ - "blst", - "cc", - "glob", - "hex", - "libc", - "serde", -] - -[[package]] -name = "cc" -version = "1.0.83" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f1174fb0b6ec23863f8b971027804a42614e347eafb0a95bf0b12cdae21fc4d0" -dependencies = [ - "jobserver", - "libc", -] - -[[package]] -name = "cexpr" -version = "0.6.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "6fac387a98bb7c37292057cffc56d62ecb629900026402633ae9160df93a8766" -dependencies = [ - "nom", -] - -[[package]] -name = "cfg-if" -version = "1.0.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "baf1de4339761588bc0619e3cbc0120ee582ebb74b53b4efbf79117bd2da40fd" - -[[package]] -name = "chrono" -version = "0.4.34" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "5bc015644b92d5890fab7489e49d21f879d5c990186827d42ec511919404f38b" -dependencies = [ - "android-tzdata", - "iana-time-zone", - "js-sys", - "num-traits", - "serde", - "wasm-bindgen", - "windows-targets 0.52.4", -] - -[[package]] -name = "cipher" -version = "0.3.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "7ee52072ec15386f770805afd189a01c8841be8696bed250fa2f13c4c0d6dfb7" -dependencies = [ - "generic-array", -] - -[[package]] -name = "cipher" -version = "0.4.4" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "773f3b9af64447d2ce9850330c473515014aa235e6a783b02db81ff39e4a3dad" -dependencies = [ - "crypto-common", - "inout", -] - -[[package]] -name = "clang-sys" -version = "1.7.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "67523a3b4be3ce1989d607a828d036249522dd9c1c8de7f4dd2dae43a37369d1" -dependencies = [ - "glob", - "libc", - "libloading", -] - -[[package]] -name = "clap" -version = "4.5.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c918d541ef2913577a0f9566e9ce27cb35b6df072075769e0b26cb5a554520da" -dependencies = [ - "clap_builder", - "clap_derive", -] - -[[package]] -name = "clap_builder" -version = "4.5.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "9f3e7391dad68afb0c2ede1bf619f579a3dc9c2ec67f089baa397123a2f3d1eb" -dependencies = [ - "anstream", - "anstyle", - "clap_lex", - "strsim 0.11.0", -] - -[[package]] -name = "clap_derive" -version = "4.5.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "307bc0538d5f0f83b8248db3087aa92fe504e4691294d0c96c0eabc33f47ba47" -dependencies = [ - "heck", - "proc-macro2", - "quote", - "syn 2.0.52", -] - -[[package]] -name = "clap_lex" -version = "0.7.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "98cc8fbded0c607b7ba9dd60cd98df59af97e84d24e49c8557331cfc26d301ce" - -[[package]] -name = "codecs-derive" -version = "0.1.0-alpha.21" -source = "git+https://github.com/paradigmxyz/reth.git?rev=e0c220e#e0c220efef09dd5732e69d1da5c79bc52e0b5424" -dependencies = [ - "convert_case 0.6.0", - "parity-scale-codec", - "proc-macro2", - "quote", - "serde", - "syn 2.0.52", -] - -[[package]] -name = "colorchoice" -version = "1.0.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "acbf1af155f9b9ef647e42cdc158db4b64a1b61f743629225fde6f3e0be2a7c7" - -[[package]] -name = "const-hex" -version = "1.11.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "efbd12d49ab0eaf8193ba9175e45f56bbc2e4b27d57b8cfe62aa47942a46b9a9" -dependencies = [ - "cfg-if", - "cpufeatures", - "hex", - "proptest", - "serde", -] - -[[package]] -name = "const-oid" -version = "0.9.6" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c2459377285ad874054d797f3ccebf984978aa39129f6eafde5cdc8315b612f8" - -[[package]] -name = "convert_case" -version = "0.4.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "6245d59a3e82a7fc217c5828a6692dbc6dfb63a0c8c90495621f7b9d79704a0e" - -[[package]] -name = "convert_case" -version = "0.6.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ec182b0ca2f35d8fc196cf3404988fd8b8c739a4d270ff118a398feb0cbec1ca" -dependencies = [ - "unicode-segmentation", -] - -[[package]] -name = "core-foundation-sys" -version = "0.8.6" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "06ea2b9bc92be3c2baa9334a323ebca2d6f074ff852cd1d7b11064035cd3868f" - -[[package]] -name = "cpufeatures" -version = "0.2.12" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "53fe5e26ff1b7aef8bca9c6080520cfb8d9333c7568e1829cef191a9723e5504" -dependencies = [ - "libc", -] - -[[package]] -name = "crc" -version = "3.0.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "86ec7a15cbe22e59248fc7eadb1907dab5ba09372595da4d73dd805ed4417dfe" -dependencies = [ - "crc-catalog", -] - -[[package]] -name = "crc-catalog" -version = "2.4.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "19d374276b40fb8bbdee95aef7c7fa6b5316ec764510eb64b8dd0e2ed0d7e7f5" - -[[package]] -name = "crossbeam-channel" -version = "0.5.12" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ab3db02a9c5b5121e1e42fbdb1aeb65f5e02624cc58c43f2884c6ccac0b82f95" -dependencies = [ - "crossbeam-utils", -] - -[[package]] -name = "crossbeam-deque" -version = "0.8.5" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "613f8cc01fe9cf1a3eb3d7f488fd2fa8388403e97039e2f73692932e291a770d" -dependencies = [ - "crossbeam-epoch", - "crossbeam-utils", -] - -[[package]] -name = "crossbeam-epoch" -version = "0.9.18" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "5b82ac4a3c2ca9c3460964f020e1402edd5753411d7737aa39c3714ad1b5420e" -dependencies = [ - "crossbeam-utils", -] - -[[package]] -name = "crossbeam-utils" -version = "0.8.19" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "248e3bacc7dc6baa3b21e405ee045c3047101a49145e7e9eca583ab4c2ca5345" - -[[package]] -name = "crunchy" -version = "0.2.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "7a81dae078cea95a014a339291cec439d2f232ebe854a9d672b796c6afafa9b7" - -[[package]] -name = "crypto-bigint" -version = "0.5.5" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "0dc92fb57ca44df6db8059111ab3af99a63d5d0f8375d9972e319a379c6bab76" -dependencies = [ - "generic-array", - "rand_core 0.6.4", - "subtle", - "zeroize", -] - -[[package]] -name = "crypto-common" -version = "0.1.6" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "1bfb12502f3fc46cca1bb51ac28df9d618d813cdc3d2f25b9fe775a34af26bb3" -dependencies = [ - "generic-array", - "typenum", -] - -[[package]] -name = "ctr" -version = "0.7.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a232f92a03f37dd7d7dd2adc67166c77e9cd88de5b019b9a9eecfaeaf7bfd481" -dependencies = [ - "cipher 0.3.0", -] - -[[package]] -name = "ctr" -version = "0.8.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "049bb91fb4aaf0e3c7efa6cd5ef877dbbbd15b39dad06d9948de4ec8a75761ea" -dependencies = [ - "cipher 0.3.0", -] - -[[package]] -name = "ctr" -version = "0.9.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "0369ee1ad671834580515889b80f2ea915f23b8be8d0daa4bbaf2ac5c7590835" -dependencies = [ - "cipher 0.4.4", -] - -[[package]] -name = "cuckoofilter" -version = "0.5.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b810a8449931679f64cd7eef1bbd0fa315801b6d5d9cdc1ace2804d6529eee18" -dependencies = [ - "byteorder", - "fnv", - "rand 0.7.3", - "serde", - "serde_bytes", - "serde_derive", -] - -[[package]] -name = "curve25519-dalek" -version = "4.1.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "0a677b8922c94e01bdbb12126b0bc852f00447528dee1782229af9c720c3f348" -dependencies = [ - "cfg-if", - "cpufeatures", - "curve25519-dalek-derive", - "digest 0.10.7", - "fiat-crypto", - "platforms", - "rustc_version 0.4.0", - "subtle", - "zeroize", -] - -[[package]] -name = "curve25519-dalek-derive" -version = "0.1.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f46882e17999c6cc590af592290432be3bce0428cb0d5f8b6715e4dc7b383eb3" -dependencies = [ - "proc-macro2", - "quote", - "syn 2.0.52", -] - -[[package]] -name = "darling" -version = "0.10.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "0d706e75d87e35569db781a9b5e2416cff1236a47ed380831f959382ccd5f858" -dependencies = [ - "darling_core 0.10.2", - "darling_macro 0.10.2", -] - -[[package]] -name = "darling" -version = "0.20.8" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "54e36fcd13ed84ffdfda6f5be89b31287cbb80c439841fe69e04841435464391" -dependencies = [ - "darling_core 0.20.8", - "darling_macro 0.20.8", -] - -[[package]] -name = "darling_core" -version = "0.10.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f0c960ae2da4de88a91b2d920c2a7233b400bc33cb28453a2987822d8392519b" -dependencies = [ - "fnv", - "ident_case", - "proc-macro2", - "quote", - "strsim 0.9.3", - "syn 1.0.109", -] - -[[package]] -name = "darling_core" -version = "0.20.8" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "9c2cf1c23a687a1feeb728783b993c4e1ad83d99f351801977dd809b48d0a70f" -dependencies = [ - "fnv", - "ident_case", - "proc-macro2", - "quote", - "strsim 0.10.0", - "syn 2.0.52", -] - -[[package]] -name = "darling_macro" -version = "0.10.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d9b5a2f4ac4969822c62224815d069952656cadc7084fdca9751e6d959189b72" -dependencies = [ - "darling_core 0.10.2", - "quote", - "syn 1.0.109", -] - -[[package]] -name = "darling_macro" -version = "0.20.8" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a668eda54683121533a393014d8692171709ff57a7d61f187b6e782719f8933f" -dependencies = [ - "darling_core 0.20.8", - "quote", - "syn 2.0.52", -] - -[[package]] -name = "dashmap" -version = "5.5.3" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "978747c1d849a7d2ee5e8adc0159961c48fb7e5db2f06af6723b80123bb53856" -dependencies = [ - "cfg-if", - "hashbrown 0.14.3", - "lock_api", - "once_cell", - "parking_lot_core 0.9.9", -] - -[[package]] -name = "data-encoding" -version = "2.5.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "7e962a19be5cfc3f3bf6dd8f61eb50107f356ad6270fbb3ed41476571db78be5" - -[[package]] -name = "delay_map" -version = "0.3.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e4355c25cbf99edcb6b4a0e906f6bdc6956eda149e84455bea49696429b2f8e8" -dependencies = [ - "futures", - "tokio-util", -] - -[[package]] -name = "der" -version = "0.7.8" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "fffa369a668c8af7dbf8b5e56c9f744fbd399949ed171606040001947de40b1c" -dependencies = [ - "const-oid", - "zeroize", -] - -[[package]] -name = "deranged" -version = "0.3.11" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b42b6fa04a440b495c8b04d0e71b707c585f83cb9cb28cf8cd0d976c315e31b4" -dependencies = [ - "powerfmt", - "serde", -] - -[[package]] -name = "derivative" -version = "2.2.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "fcc3dd5e9e9c0b295d6e1e4d811fb6f157d5ffd784b8d202fc62eac8035a770b" -dependencies = [ - "proc-macro2", - "quote", - "syn 1.0.109", -] - -[[package]] -name = "derive_builder" -version = "0.9.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a2658621297f2cf68762a6f7dc0bb7e1ff2cfd6583daef8ee0fed6f7ec468ec0" -dependencies = [ - "darling 0.10.2", - "derive_builder_core", - "proc-macro2", - "quote", - "syn 1.0.109", -] - -[[package]] -name = "derive_builder_core" -version = "0.9.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "2791ea3e372c8495c0bc2033991d76b512cd799d07491fbd6890124db9458bef" -dependencies = [ - "darling 0.10.2", - "proc-macro2", - "quote", - "syn 1.0.109", -] - -[[package]] -name = "derive_more" -version = "0.99.17" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "4fb810d30a7c1953f91334de7244731fc3f3c10d7fe163338a35b9f640960321" -dependencies = [ - "convert_case 0.4.0", - "proc-macro2", - "quote", - "rustc_version 0.4.0", - "syn 1.0.109", -] - -[[package]] -name = "digest" -version = "0.9.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d3dd60d1080a57a05ab032377049e0591415d2b31afd7028356dbf3cc6dcb066" -dependencies = [ - "generic-array", -] - -[[package]] -name = "digest" -version = "0.10.7" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "9ed9a281f7bc9b7576e61468ba615a66a5c8cfdff42420a70aa82701a3b1e292" -dependencies = [ - "block-buffer", - "const-oid", - "crypto-common", - "subtle", -] - -[[package]] -name = "discv5" -version = "0.3.1" -source = "git+https://github.com/sigp/discv5?rev=f289bbd4c57d499bb1bdb393af3c249600a1c662#f289bbd4c57d499bb1bdb393af3c249600a1c662" -dependencies = [ - "aes 0.7.5", - "aes-gcm", - "arrayvec", - "delay_map", - "enr", - "fnv", - "futures", - "hashlink", - "hex", - "hkdf", - "lazy_static", - "lru", - "more-asserts", - "parking_lot 0.11.2", - "rand 0.8.5", - "rlp", - "smallvec", - "socket2 0.4.10", - "tokio", - "tracing", - "tracing-subscriber", - "uint", - "zeroize", -] - -[[package]] -name = "dns-lookup" -version = "1.0.8" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "53ecafc952c4528d9b51a458d1a8904b81783feff9fde08ab6ed2545ff396872" -dependencies = [ - "cfg-if", - "libc", - "socket2 0.4.10", - "winapi", -] - -[[package]] -name = "dunce" -version = "1.0.4" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "56ce8c6da7551ec6c462cbaf3bfbc75131ebbfa1c944aeaa9dab51ca1c5f0c3b" - -[[package]] -name = "dyn_size_of" -version = "0.4.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "33d4f78a40b1ec35bf8cafdaaf607ba2f773c366b0b3bda48937cacd7a8d5134" - -[[package]] -name = "ecdsa" -version = "0.16.9" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ee27f32b5c5292967d2d4a9d7f1e0b0aed2c15daded5a60300e4abb9d8020bca" -dependencies = [ - "der", - "digest 0.10.7", - "elliptic-curve", - "rfc6979", - "signature", - "spki", -] - -[[package]] -name = "ed25519" -version = "2.2.3" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "115531babc129696a58c64a4fef0a8bf9e9698629fb97e9e40767d235cfbcd53" -dependencies = [ - "pkcs8", - "signature", -] - -[[package]] -name = "ed25519-dalek" -version = "2.1.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "4a3daa8e81a3963a60642bcc1f90a670680bd4a77535faa384e9d1c79d620871" -dependencies = [ - "curve25519-dalek", - "ed25519", - "rand_core 0.6.4", - "serde", - "sha2", - "subtle", - "zeroize", -] - -[[package]] -name = "educe" -version = "0.4.23" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "0f0042ff8246a363dbe77d2ceedb073339e85a804b9a47636c6e016a9a32c05f" -dependencies = [ - "enum-ordinalize", - "proc-macro2", - "quote", - "syn 1.0.109", -] - -[[package]] -name = "either" -version = "1.10.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "11157ac094ffbdde99aa67b23417ebdd801842852b500e395a45a9c0aac03e4a" - -[[package]] -name = "elliptic-curve" -version = "0.13.8" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b5e6043086bf7973472e0c7dff2142ea0b680d30e18d9cc40f267efbf222bd47" -dependencies = [ - "base16ct", - "crypto-bigint", - "digest 0.10.7", - "ff", - "generic-array", - "group", - "pkcs8", - "rand_core 0.6.4", - "sec1", - "subtle", - "zeroize", -] - -[[package]] -name = "endian-type" -version = "0.1.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c34f04666d835ff5d62e058c3995147c06f42fe86ff053337632bca83e42702d" - -[[package]] -name = "enr" -version = "0.9.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "fe81b5c06ecfdbc71dd845216f225f53b62a10cb8a16c946836a3467f701d05b" -dependencies = [ - "base64", - "bytes", - "ed25519-dalek", - "hex", - "k256", - "log", - "rand 0.8.5", - "rlp", - "secp256k1 0.27.0", - "serde", - "sha3", - "zeroize", -] - -[[package]] -name = "enum-as-inner" -version = "0.3.4" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "570d109b813e904becc80d8d5da38376818a143348413f7149f1340fe04754d4" -dependencies = [ - "heck", - "proc-macro2", - "quote", - "syn 1.0.109", -] - -[[package]] -name = "enum-ordinalize" -version = "3.1.15" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "1bf1fa3f06bbff1ea5b1a9c7b14aa992a39657db60a2759457328d7e058f49ee" -dependencies = [ - "num-bigint", - "num-traits", - "proc-macro2", - "quote", - "syn 2.0.52", -] - -[[package]] -name = "enumn" -version = "0.1.13" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "6fd000fd6988e73bbe993ea3db9b1aa64906ab88766d654973924340c8cddb42" -dependencies = [ - "proc-macro2", - "quote", - "syn 2.0.52", -] - -[[package]] -name = "equivalent" -version = "1.0.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "5443807d6dff69373d433ab9ef5378ad8df50ca6298caf15de6e52e24aaf54d5" - -[[package]] -name = "errno" -version = "0.3.8" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a258e46cdc063eb8519c00b9fc845fc47bcfca4130e2f08e88665ceda8474245" -dependencies = [ - "libc", - "windows-sys 0.52.0", -] - -[[package]] -name = "eyre" -version = "0.6.12" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "7cd915d99f24784cdc19fd37ef22b97e3ff0ae756c7e492e9fbfe897d61e2aec" -dependencies = [ - "indenter", - "once_cell", -] - -[[package]] -name = "fastrand" -version = "2.0.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "25cbce373ec4653f1a01a31e8a5e5ec0c622dc27ff9c4e6606eefef5cbbed4a5" - -[[package]] -name = "fastrlp" -version = "0.3.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "139834ddba373bbdd213dffe02c8d110508dcf1726c2be27e8d1f7d7e1856418" -dependencies = [ - "arrayvec", - "auto_impl", - "bytes", -] - -[[package]] -name = "ff" -version = "0.13.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ded41244b729663b1e574f1b4fb731469f69f79c17667b5d776b16cda0479449" -dependencies = [ - "rand_core 0.6.4", - "subtle", -] - -[[package]] -name = "fiat-crypto" -version = "0.2.6" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "1676f435fc1dadde4d03e43f5d62b259e1ce5f40bd4ffb21db2b42ebe59c1382" - -[[package]] -name = "fixed-hash" -version = "0.8.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "835c052cb0c08c1acf6ffd71c022172e18723949c8282f2b9f27efbc51e64534" -dependencies = [ - "byteorder", - "rand 0.8.5", - "rustc-hex", - "static_assertions", -] - -[[package]] -name = "fnv" -version = "1.0.7" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "3f9eec918d3f24069decb9af1554cad7c880e2da24a9afd88aca000531ab82c1" - -[[package]] -name = "form_urlencoded" -version = "1.2.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e13624c2627564efccf4934284bdd98cbaa14e79b0b5a141218e507b3a823456" -dependencies = [ - "percent-encoding", -] - -[[package]] -name = "funty" -version = "2.0.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e6d5a32815ae3f33302d95fdcb2ce17862f8c65363dcfd29360480ba1001fc9c" - -[[package]] -name = "futures" -version = "0.3.30" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "645c6916888f6cb6350d2550b80fb63e734897a8498abe35cfb732b6487804b0" -dependencies = [ - "futures-channel", - "futures-core", - "futures-executor", - "futures-io", - "futures-sink", - "futures-task", - "futures-util", -] - -[[package]] -name = "futures-channel" -version = "0.3.30" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "eac8f7d7865dcb88bd4373ab671c8cf4508703796caa2b1985a9ca867b3fcb78" -dependencies = [ - "futures-core", - "futures-sink", -] - -[[package]] -name = "futures-core" -version = "0.3.30" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "dfc6580bb841c5a68e9ef15c77ccc837b40a7504914d52e47b8b0e9bbda25a1d" - -[[package]] -name = "futures-executor" -version = "0.3.30" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a576fc72ae164fca6b9db127eaa9a9dda0d61316034f33a0a0d4eda41f02b01d" -dependencies = [ - "futures-core", - "futures-task", - "futures-util", -] - -[[package]] -name = "futures-io" -version = "0.3.30" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a44623e20b9681a318efdd71c299b6b222ed6f231972bfe2f224ebad6311f0c1" - -[[package]] -name = "futures-macro" -version = "0.3.30" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "87750cf4b7a4c0625b1529e4c543c2182106e4dedc60a2a6455e00d212c489ac" -dependencies = [ - "proc-macro2", - "quote", - "syn 2.0.52", -] - -[[package]] -name = "futures-sink" -version = "0.3.30" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "9fb8e00e87438d937621c1c6269e53f536c14d3fbd6a042bb24879e57d474fb5" - -[[package]] -name = "futures-task" -version = "0.3.30" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "38d84fa142264698cdce1a9f9172cf383a0c82de1bddcf3092901442c4097004" - -[[package]] -name = "futures-util" -version = "0.3.30" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "3d6401deb83407ab3da39eba7e33987a73c3df0c82b4bb5813ee871c19c41d48" -dependencies = [ - "futures-channel", - "futures-core", - "futures-io", - "futures-macro", - "futures-sink", - "futures-task", - "memchr", - "pin-project-lite", - "pin-utils", - "slab", -] - -[[package]] -name = "generic-array" -version = "0.14.7" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "85649ca51fd72272d7821adaf274ad91c288277713d9c18820d8499a7ff69e9a" -dependencies = [ - "typenum", - "version_check", - "zeroize", -] - -[[package]] -name = "getrandom" -version = "0.1.16" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "8fc3cb4d91f53b50155bdcfd23f6a4c39ae1969c2ae85982b135750cccaf5fce" -dependencies = [ - "cfg-if", - "libc", - "wasi 0.9.0+wasi-snapshot-preview1", -] - -[[package]] -name = "getrandom" -version = "0.2.12" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "190092ea657667030ac6a35e305e62fc4dd69fd98ac98631e5d3a2b1575a12b5" -dependencies = [ - "cfg-if", - "libc", - "wasi 0.11.0+wasi-snapshot-preview1", -] - -[[package]] -name = "ghash" -version = "0.4.4" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "1583cc1656d7839fd3732b80cf4f38850336cdb9b8ded1cd399ca62958de3c99" -dependencies = [ - "opaque-debug", - "polyval", -] - -[[package]] -name = "gimli" -version = "0.28.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "4271d37baee1b8c7e4b708028c57d816cf9d2434acb33a549475f78c181f6253" - -[[package]] -name = "glob" -version = "0.3.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d2fabcfbdc87f4758337ca535fb41a6d701b65693ce38287d856d1674551ec9b" - -[[package]] -name = "group" -version = "0.13.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f0f9ef7462f7c099f518d754361858f86d8a07af53ba9af0fe635bbccb151a63" -dependencies = [ - "ff", - "rand_core 0.6.4", - "subtle", -] - -[[package]] -name = "h2" -version = "0.3.26" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "81fe527a889e1532da5c525686d96d4c2e74cdd345badf8dfef9f6b39dd5f5e8" -dependencies = [ - "bytes", - "fnv", - "futures-core", - "futures-sink", - "futures-util", - "http", - "indexmap 2.2.3", - "slab", - "tokio", - "tokio-util", - "tracing", -] - -[[package]] -name = "hashbrown" -version = "0.12.3" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "8a9ee70c43aaf417c914396645a0fa852624801b24ebb7ae78fe8272889ac888" - -[[package]] -name = "hashbrown" -version = "0.14.3" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "290f1a1d9242c78d09ce40a5e87e7554ee637af1351968159f4952f028f75604" -dependencies = [ - "ahash", - "allocator-api2", - "serde", -] - -[[package]] -name = "hashlink" -version = "0.8.4" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e8094feaf31ff591f651a2664fb9cfd92bba7a60ce3197265e9482ebe753c8f7" -dependencies = [ - "hashbrown 0.14.3", -] - -[[package]] -name = "heck" -version = "0.4.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "95505c38b4572b2d910cecb0281560f54b440a19336cbbcb27bf6ce6adc6f5a8" - -[[package]] -name = "hermit-abi" -version = "0.3.8" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "379dada1584ad501b383485dd706b8afb7a70fcbc7f4da7d780638a5a6124a60" - -[[package]] -name = "hex" -version = "0.4.3" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "7f24254aa9a54b5c858eaee2f5bccdb46aaf0e486a595ed5fd8f86ba55232a70" -dependencies = [ - "serde", -] - -[[package]] -name = "hex-literal" -version = "0.4.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "6fe2267d4ed49bc07b63801559be28c718ea06c4738b7a03c94df7386d2cde46" - -[[package]] -name = "hkdf" -version = "0.12.4" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "7b5f8eb2ad728638ea2c7d47a21db23b7b58a72ed6a38256b8a1849f15fbbdf7" -dependencies = [ - "hmac", -] - -[[package]] -name = "hmac" -version = "0.12.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "6c49c37c09c17a53d937dfbb742eb3a961d65a994e6bcdcf37e7399d0cc8ab5e" -dependencies = [ - "digest 0.10.7", -] - -[[package]] -name = "http" -version = "0.2.11" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "8947b1a6fad4393052c7ba1f4cd97bed3e953a95c79c92ad9b051a04611d9fbb" -dependencies = [ - "bytes", - "fnv", - "itoa", -] - -[[package]] -name = "http-body" -version = "0.4.6" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "7ceab25649e9960c0311ea418d17bee82c0dcec1bd053b5f9a66e265a693bed2" -dependencies = [ - "bytes", - "http", - "pin-project-lite", -] - -[[package]] -name = "httparse" -version = "1.8.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d897f394bad6a705d5f4104762e116a75639e470d80901eed05a860a95cb1904" - -[[package]] -name = "httpdate" -version = "1.0.3" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "df3b46402a9d5adb4c86a0cf463f42e19994e3ee891101b1841f30a545cb49a9" - -[[package]] -name = "hyper" -version = "0.14.28" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "bf96e135eb83a2a8ddf766e426a841d8ddd7449d5f00d34ea02b41d2f19eef80" -dependencies = [ - "bytes", - "futures-channel", - "futures-core", - "futures-util", - "h2", - "http", - "http-body", - "httparse", - "httpdate", - "itoa", - "pin-project-lite", - "socket2 0.4.10", - "tokio", - "tower-service", - "tracing", - "want", -] - -[[package]] -name = "hyper-system-resolver" -version = "0.5.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "6eea26c5d0b6ab9d72219f65000af310f042a740926f7b2fa3553e774036e2e7" -dependencies = [ - "derive_builder", - "dns-lookup", - "hyper", - "tokio", - "tower-service", - "tracing", -] - -[[package]] -name = "iana-time-zone" -version = "0.1.60" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e7ffbb5a1b541ea2561f8c41c087286cc091e21e556a4f09a8f6cbf17b69b141" -dependencies = [ - "android_system_properties", - "core-foundation-sys", - "iana-time-zone-haiku", - "js-sys", - "wasm-bindgen", - "windows-core", -] - -[[package]] -name = "iana-time-zone-haiku" -version = "0.1.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f31827a206f56af32e590ba56d5d2d085f558508192593743f16b2306495269f" -dependencies = [ - "cc", -] - -[[package]] -name = "ident_case" -version = "1.0.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b9e0384b61958566e926dc50660321d12159025e767c18e043daf26b70104c39" - -[[package]] -name = "idna" -version = "0.2.3" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "418a0a6fab821475f634efe3ccc45c013f742efe03d853e8d3355d5cb850ecf8" -dependencies = [ - "matches", - "unicode-bidi", - "unicode-normalization", -] - -[[package]] -name = "idna" -version = "0.5.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "634d9b1461af396cad843f47fdba5597a4f9e6ddd4bfb6ff5d85028c25cb12f6" -dependencies = [ - "unicode-bidi", - "unicode-normalization", -] - -[[package]] -name = "igd-next" -version = "0.14.3" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "064d90fec10d541084e7b39ead8875a5a80d9114a2b18791565253bae25f49e4" -dependencies = [ - "async-trait", - "attohttpc", - "bytes", - "futures", - "http", - "hyper", - "log", - "rand 0.8.5", - "tokio", - "url", - "xmltree", -] - -[[package]] -name = "impl-codec" -version = "0.6.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ba6a270039626615617f3f36d15fc827041df3b78c439da2cadfa47455a77f2f" -dependencies = [ - "parity-scale-codec", -] - -[[package]] -name = "impl-trait-for-tuples" -version = "0.2.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "11d7a9f6330b71fea57921c9b61c47ee6e84f72d394754eff6163ae67e7395eb" -dependencies = [ - "proc-macro2", - "quote", - "syn 1.0.109", -] - -[[package]] -name = "include_dir" -version = "0.7.3" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "18762faeff7122e89e0857b02f7ce6fcc0d101d5e9ad2ad7846cc01d61b7f19e" -dependencies = [ - "include_dir_macros", -] - -[[package]] -name = "include_dir_macros" -version = "0.7.3" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b139284b5cf57ecfa712bcc66950bb635b31aff41c188e8a4cfc758eca374a3f" -dependencies = [ - "proc-macro2", - "quote", -] - -[[package]] -name = "indenter" -version = "0.3.3" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ce23b50ad8242c51a442f3ff322d56b02f08852c77e4c0b4d3fd684abc89c683" - -[[package]] -name = "indexmap" -version = "1.9.3" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "bd070e393353796e801d209ad339e89596eb4c8d430d18ede6a1cced8fafbd99" -dependencies = [ - "autocfg", - "hashbrown 0.12.3", - "serde", -] - -[[package]] -name = "indexmap" -version = "2.2.3" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "233cf39063f058ea2caae4091bf4a3ef70a653afbc026f5c4a4135d114e3c177" -dependencies = [ - "equivalent", - "hashbrown 0.14.3", - "serde", -] - -[[package]] -name = "inout" -version = "0.1.3" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a0c10553d664a4d0bcff9f4215d0aac67a639cc68ef660840afe309b807bc9f5" -dependencies = [ - "block-padding", - "generic-array", -] - -[[package]] -name = "instant" -version = "0.1.12" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "7a5bbe824c507c5da5956355e86a746d82e0e1464f65d862cc5e71da70e94b2c" -dependencies = [ - "cfg-if", -] - -[[package]] -name = "ipnet" -version = "2.9.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "8f518f335dce6725a761382244631d86cf0ccb2863413590b31338feb467f9c3" - -[[package]] -name = "itertools" -version = "0.10.5" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b0fd2260e829bddf4cb6ea802289de2f86d6a7a690192fbe91b3f46e0f2c8473" -dependencies = [ - "either", -] - -[[package]] -name = "itertools" -version = "0.12.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ba291022dbbd398a455acf126c1e341954079855bc60dfdda641363bd6922569" -dependencies = [ - "either", -] - -[[package]] -name = "itoa" -version = "1.0.10" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b1a46d1a171d865aa5f83f92695765caa047a9b4cbae2cbf37dbd613a793fd4c" - -[[package]] -name = "jobserver" -version = "0.1.28" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ab46a6e9526ddef3ae7f787c06f0f2600639ba80ea3eade3d8e670a2230f51d6" -dependencies = [ - "libc", -] - -[[package]] -name = "js-sys" -version = "0.3.68" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "406cda4b368d531c842222cf9d2600a9a4acce8d29423695379c6868a143a9ee" -dependencies = [ - "wasm-bindgen", -] - -[[package]] -name = "jsonrpsee-types" -version = "0.20.3" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "5be0be325642e850ed0bdff426674d2e66b2b7117c9be23a7caef68a2902b7d9" -dependencies = [ - "anyhow", - "beef", - "serde", - "serde_json", - "thiserror", - "tracing", -] - -[[package]] -name = "k256" -version = "0.13.3" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "956ff9b67e26e1a6a866cb758f12c6f8746208489e3e4a4b5580802f2f0a587b" -dependencies = [ - "cfg-if", - "ecdsa", - "elliptic-curve", - "once_cell", - "sha2", - "signature", -] - -[[package]] -name = "keccak" -version = "0.1.5" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ecc2af9a1119c51f12a14607e783cb977bde58bc069ff0c3da1095e635d70654" -dependencies = [ - "cpufeatures", -] - -[[package]] -name = "keccak-asm" -version = "0.1.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "bb8515fff80ed850aea4a1595f2e519c003e2a00a82fe168ebf5269196caf444" -dependencies = [ - "digest 0.10.7", - "sha3-asm", -] - -[[package]] -name = "lazy_static" -version = "1.4.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e2abad23fbc42b3700f2f279844dc832adb2b2eb069b2df918f455c4e18cc646" -dependencies = [ - "spin", -] - -[[package]] -name = "lazycell" -version = "1.3.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "830d08ce1d1d941e6b30645f1a0eb5643013d835ce3779a5fc208261dbe10f55" - -[[package]] -name = "libc" -version = "0.2.153" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "9c198f91728a82281a64e1f4f9eeb25d82cb32a5de251c6bd1b5154d63a8e7bd" - -[[package]] -name = "libffi" -version = "3.2.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ce826c243048e3d5cec441799724de52e2d42f820468431fc3fceee2341871e2" -dependencies = [ - "libc", - "libffi-sys", -] - -[[package]] -name = "libffi-sys" -version = "2.3.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f36115160c57e8529781b4183c2bb51fdc1f6d6d1ed345591d84be7703befb3c" -dependencies = [ - "cc", -] - -[[package]] -name = "libloading" -version = "0.8.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c571b676ddfc9a8c12f1f3d3085a7b163966a8fd8098a90640953ce5f6170161" -dependencies = [ - "cfg-if", - "windows-sys 0.48.0", -] - -[[package]] -name = "libm" -version = "0.2.8" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "4ec2a862134d2a7d32d7983ddcdd1c4923530833c9f2ea1a44fc5fa473989058" - -[[package]] -name = "linked-hash-map" -version = "0.5.6" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "0717cef1bc8b636c6e1c1bbdefc09e6322da8a9321966e8928ef80d20f7f770f" - -[[package]] -name = "linked_hash_set" -version = "0.1.4" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "47186c6da4d81ca383c7c47c1bfc80f4b95f4720514d860a5407aaf4233f9588" -dependencies = [ - "linked-hash-map", -] - -[[package]] -name = "linux-raw-sys" -version = "0.4.13" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "01cda141df6706de531b6c46c3a33ecca755538219bd484262fa09410c13539c" - -[[package]] -name = "lock_api" -version = "0.4.11" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "3c168f8615b12bc01f9c17e2eb0cc07dcae1940121185446edc3744920e8ef45" -dependencies = [ - "autocfg", - "scopeguard", -] - -[[package]] -name = "log" -version = "0.4.20" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b5e6163cb8c49088c2c36f57875e58ccd8c87c7427f7fbd50ea6710b2f3f2e8f" - -[[package]] -name = "lru" -version = "0.12.3" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d3262e75e648fce39813cb56ac41f3c3e3f65217ebf3844d818d1f9398cfb0dc" -dependencies = [ - "hashbrown 0.14.3", -] - -[[package]] -name = "lz4_flex" -version = "0.11.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "912b45c753ff5f7f5208307e8ace7d2a2e30d024e26d3509f3dce546c044ce15" - -[[package]] -name = "matchers" -version = "0.1.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "8263075bb86c5a1b1427b5ae862e8889656f126e9f77c484496e8b47cf5c5558" -dependencies = [ - "regex-automata 0.1.10", -] - -[[package]] -name = "matches" -version = "0.1.10" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "2532096657941c2fea9c289d370a250971c689d4f143798ff67113ec042024a5" - -[[package]] -name = "memchr" -version = "2.7.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "523dc4f511e55ab87b694dc30d0f820d60906ef06413f93d4d7a1385599cc149" - -[[package]] -name = "memmap2" -version = "0.7.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f49388d20533534cd19360ad3d6a7dadc885944aa802ba3995040c5ec11288c6" -dependencies = [ - "libc", -] - -[[package]] -name = "metrics" -version = "0.21.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "fde3af1a009ed76a778cb84fdef9e7dbbdf5775ae3e4cc1f434a6a307f6f76c5" -dependencies = [ - "ahash", - "metrics-macros", - "portable-atomic", -] - -[[package]] -name = "metrics-macros" -version = "0.7.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "38b4faf00617defe497754acde3024865bc143d44a86799b24e191ecff91354f" -dependencies = [ - "proc-macro2", - "quote", - "syn 2.0.52", -] - -[[package]] -name = "minimal-lexical" -version = "0.2.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "68354c5c6bd36d73ff3feceb05efa59b6acb7626617f4962be322a825e61f79a" - -[[package]] -name = "miniz_oxide" -version = "0.7.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "9d811f3e15f28568be3407c8e7fdb6514c1cda3cb30683f15b6a1a1dc4ea14a7" -dependencies = [ - "adler", -] - -[[package]] -name = "mio" -version = "0.8.11" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a4a650543ca06a924e8b371db273b2756685faae30f8487da1b56505a8f78b0c" -dependencies = [ - "libc", - "wasi 0.11.0+wasi-snapshot-preview1", - "windows-sys 0.48.0", -] - -[[package]] -name = "modular-bitfield" -version = "0.11.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a53d79ba8304ac1c4f9eb3b9d281f21f7be9d4626f72ce7df4ad8fbde4f38a74" -dependencies = [ - "modular-bitfield-impl", - "static_assertions", -] - -[[package]] -name = "modular-bitfield-impl" -version = "0.11.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "5a7d5f7076603ebc68de2dc6a650ec331a062a13abaa346975be747bbfa4b789" -dependencies = [ - "proc-macro2", - "quote", - "syn 1.0.109", -] - -[[package]] -name = "more-asserts" -version = "0.3.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "1fafa6961cabd9c63bcd77a45d7e3b7f3b552b70417831fb0f56db717e72407e" - -[[package]] -name = "nibble_vec" -version = "0.1.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "77a5d83df9f36fe23f0c3648c6bbb8b0298bb5f1939c8f2704431371f4b84d43" -dependencies = [ - "smallvec", -] - -[[package]] -name = "nom" -version = "7.1.3" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d273983c5a657a70a3e8f2a01329822f3b8c8172b73826411a55751e404a0a4a" -dependencies = [ - "memchr", - "minimal-lexical", -] - -[[package]] -name = "nu-ansi-term" -version = "0.46.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "77a8165726e8236064dbb45459242600304b42a5ea24ee2948e18e023bf7ba84" -dependencies = [ - "overload", - "winapi", -] - -[[package]] -name = "num" -version = "0.4.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b05180d69e3da0e530ba2a1dae5110317e49e3b7f3d41be227dc5f92e49ee7af" -dependencies = [ - "num-bigint", - "num-complex", - "num-integer", - "num-iter", - "num-rational", - "num-traits", -] - -[[package]] -name = "num-bigint" -version = "0.4.4" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "608e7659b5c3d7cba262d894801b9ec9d00de989e8a82bd4bef91d08da45cdc0" -dependencies = [ - "autocfg", - "num-integer", - "num-traits", -] - -[[package]] -name = "num-complex" -version = "0.4.5" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "23c6602fda94a57c990fe0df199a035d83576b496aa29f4e634a8ac6004e68a6" -dependencies = [ - "num-traits", -] - -[[package]] -name = "num-conv" -version = "0.1.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "51d515d32fb182ee37cda2ccdcb92950d6a3c2893aa280e540671c2cd0f3b1d9" - -[[package]] -name = "num-integer" -version = "0.1.46" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "7969661fd2958a5cb096e56c8e1ad0444ac2bbcd0061bd28660485a44879858f" -dependencies = [ - "num-traits", -] - -[[package]] -name = "num-iter" -version = "0.1.44" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d869c01cc0c455284163fd0092f1f93835385ccab5a98a0dcc497b2f8bf055a9" -dependencies = [ - "autocfg", - "num-integer", - "num-traits", -] - -[[package]] -name = "num-rational" -version = "0.4.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "0638a1c9d0a3c0914158145bc76cff373a75a627e6ecbfb71cbe6f453a5a19b0" -dependencies = [ - "autocfg", - "num-bigint", - "num-integer", - "num-traits", -] - -[[package]] -name = "num-traits" -version = "0.2.18" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "da0df0e5185db44f69b44f26786fe401b6c293d1907744beaa7fa62b2e5a517a" -dependencies = [ - "autocfg", - "libm", -] - -[[package]] -name = "num_cpus" -version = "1.16.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "4161fcb6d602d4d2081af7c3a45852d875a03dd337a6bfdd6e06407b61342a43" -dependencies = [ - "hermit-abi", - "libc", -] - -[[package]] -name = "num_enum" -version = "0.7.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "02339744ee7253741199f897151b38e72257d13802d4ee837285cc2990a90845" -dependencies = [ - "num_enum_derive", -] - -[[package]] -name = "num_enum_derive" -version = "0.7.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "681030a937600a36906c185595136d26abfebb4aa9c65701cefcaf8578bb982b" -dependencies = [ - "proc-macro-crate 3.1.0", - "proc-macro2", - "quote", - "syn 2.0.52", -] - -[[package]] -name = "nybbles" -version = "0.2.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "95f06be0417d97f81fe4e5c86d7d01b392655a9cac9c19a848aa033e18937b23" -dependencies = [ - "alloy-rlp", - "const-hex", - "proptest", - "serde", - "smallvec", -] - -[[package]] -name = "object" -version = "0.32.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a6a622008b6e321afc04970976f62ee297fdbaa6f95318ca343e3eebb9648441" -dependencies = [ - "memchr", -] - -[[package]] -name = "once_cell" -version = "1.19.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "3fdb12b2476b595f9358c5161aa467c2438859caa136dec86c26fdd2efe17b92" - -[[package]] -name = "opaque-debug" -version = "0.3.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "624a8340c38c1b80fd549087862da4ba43e08858af025b236e509b6649fc13d5" - -[[package]] -name = "overload" -version = "0.1.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b15813163c1d831bf4a13c3610c05c0d03b39feb07f7e09fa234dac9b15aaf39" - -[[package]] -name = "page_size" -version = "0.6.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "30d5b2194ed13191c1999ae0704b7839fb18384fa22e49b57eeaa97d79ce40da" -dependencies = [ - "libc", - "winapi", -] - -[[package]] -name = "parity-scale-codec" -version = "3.6.9" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "881331e34fa842a2fb61cc2db9643a8fedc615e47cfcc52597d1af0db9a7e8fe" -dependencies = [ - "arrayvec", - "bitvec", - "byte-slice-cast", - "bytes", - "impl-trait-for-tuples", - "parity-scale-codec-derive", - "serde", -] - -[[package]] -name = "parity-scale-codec-derive" -version = "3.6.9" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "be30eaf4b0a9fba5336683b38de57bb86d179a35862ba6bfcf57625d006bde5b" -dependencies = [ - "proc-macro-crate 2.0.0", - "proc-macro2", - "quote", - "syn 1.0.109", -] - -[[package]] -name = "parking_lot" -version = "0.11.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "7d17b78036a60663b797adeaee46f5c9dfebb86948d1255007a1d6be0271ff99" -dependencies = [ - "instant", - "lock_api", - "parking_lot_core 0.8.6", -] - -[[package]] -name = "parking_lot" -version = "0.12.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "3742b2c103b9f06bc9fff0a37ff4912935851bee6d36f3c02bcc755bcfec228f" -dependencies = [ - "lock_api", - "parking_lot_core 0.9.9", -] - -[[package]] -name = "parking_lot_core" -version = "0.8.6" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "60a2cfe6f0ad2bfc16aefa463b497d5c7a5ecd44a23efa72aa342d90177356dc" -dependencies = [ - "cfg-if", - "instant", - "libc", - "redox_syscall 0.2.16", - "smallvec", - "winapi", -] - -[[package]] -name = "parking_lot_core" -version = "0.9.9" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "4c42a9226546d68acdd9c0a280d17ce19bfe27a46bf68784e4066115788d008e" -dependencies = [ - "cfg-if", - "libc", - "redox_syscall 0.4.1", - "smallvec", - "windows-targets 0.48.5", -] - -[[package]] -name = "paste" -version = "1.0.14" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "de3145af08024dea9fa9914f381a17b8fc6034dfb00f3a84013f7ff43f29ed4c" - -[[package]] -name = "percent-encoding" -version = "2.3.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e3148f5046208a5d56bcfc03053e3ca6334e51da8dfb19b6cdc8b306fae3283e" - -[[package]] -name = "pest" -version = "2.7.7" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "219c0dcc30b6a27553f9cc242972b67f75b60eb0db71f0b5462f38b058c41546" -dependencies = [ - "memchr", - "thiserror", - "ucd-trie", -] - -[[package]] -name = "ph" -version = "0.8.3" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "86b7b74d575d7c11fb653fae69688be5206cafc1ead33c01ce61ac7f36eae45b" -dependencies = [ - "binout", - "bitm", - "dyn_size_of", - "rayon", - "wyhash", -] - -[[package]] -name = "pin-project" -version = "1.1.4" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "0302c4a0442c456bd56f841aee5c3bfd17967563f6fadc9ceb9f9c23cf3807e0" -dependencies = [ - "pin-project-internal", -] - -[[package]] -name = "pin-project-internal" -version = "1.1.4" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "266c042b60c9c76b8d53061e52b2e0d1116abc57cefc8c5cd671619a56ac3690" -dependencies = [ - "proc-macro2", - "quote", - "syn 2.0.52", -] - -[[package]] -name = "pin-project-lite" -version = "0.2.13" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "8afb450f006bf6385ca15ef45d71d2288452bc3683ce2e2cacc0d18e4be60b58" - -[[package]] -name = "pin-utils" -version = "0.1.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "8b870d8c151b6f2fb93e84a13146138f05d02ed11c7e7c54f8826aaaf7c9f184" - -[[package]] -name = "pkcs8" -version = "0.10.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f950b2377845cebe5cf8b5165cb3cc1a5e0fa5cfa3e1f7f55707d8fd82e0a7b7" -dependencies = [ - "der", - "spki", -] - -[[package]] -name = "pkg-config" -version = "0.3.30" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d231b230927b5e4ad203db57bbcbee2802f6bce620b1e4a9024a07d94e2907ec" - -[[package]] -name = "platforms" -version = "3.3.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "626dec3cac7cc0e1577a2ec3fc496277ec2baa084bebad95bb6fdbfae235f84c" - -[[package]] -name = "polyval" -version = "0.5.3" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "8419d2b623c7c0896ff2d5d96e2cb4ede590fed28fcc34934f4c33c036e620a1" -dependencies = [ - "cfg-if", - "cpufeatures", - "opaque-debug", - "universal-hash", -] - -[[package]] -name = "portable-atomic" -version = "1.6.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "7170ef9988bc169ba16dd36a7fa041e5c4cbeb6a35b76d4c03daded371eae7c0" - -[[package]] -name = "powerfmt" -version = "0.2.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "439ee305def115ba05938db6eb1644ff94165c5ab5e9420d1c1bcedbba909391" - -[[package]] -name = "ppv-lite86" -version = "0.2.17" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "5b40af805b3121feab8a3c29f04d8ad262fa8e0561883e7653e024ae4479e6de" - -[[package]] -name = "primitive-types" -version = "0.12.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "0b34d9fd68ae0b74a41b21c03c2f62847aa0ffea044eee893b4c140b37e244e2" -dependencies = [ - "fixed-hash", - "impl-codec", - "uint", -] - -[[package]] -name = "proc-macro-crate" -version = "2.0.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "7e8366a6159044a37876a2b9817124296703c586a5c92e2c53751fa06d8d43e8" -dependencies = [ - "toml_edit 0.20.7", -] - -[[package]] -name = "proc-macro-crate" -version = "3.1.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "6d37c51ca738a55da99dc0c4a34860fd675453b8b36209178c2249bb13651284" -dependencies = [ - "toml_edit 0.21.1", -] - -[[package]] -name = "proc-macro-error" -version = "1.0.4" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "da25490ff9892aab3fcf7c36f08cfb902dd3e71ca0f9f9517bea02a73a5ce38c" -dependencies = [ - "proc-macro-error-attr", - "proc-macro2", - "quote", - "syn 1.0.109", - "version_check", -] - -[[package]] -name = "proc-macro-error-attr" -version = "1.0.4" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a1be40180e52ecc98ad80b184934baf3d0d29f979574e439af5a55274b35f869" -dependencies = [ - "proc-macro2", - "quote", - "version_check", -] - -[[package]] -name = "proc-macro2" -version = "1.0.78" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e2422ad645d89c99f8f3e6b88a9fdeca7fabeac836b1002371c4367c8f984aae" -dependencies = [ - "unicode-ident", -] - -[[package]] -name = "proptest" -version = "1.4.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "31b476131c3c86cb68032fdc5cb6d5a1045e3e42d96b69fa599fd77701e1f5bf" -dependencies = [ - "bit-set", - "bit-vec", - "bitflags 2.4.2", - "lazy_static", - "num-traits", - "rand 0.8.5", - "rand_chacha 0.3.1", - "rand_xorshift", - "regex-syntax 0.8.2", - "rusty-fork", - "tempfile", - "unarray", -] - -[[package]] -name = "public-ip" -version = "0.2.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "7b4c40db5262d93298c363a299f8bc1b3a956a78eecddba3bc0e58b76e2f419a" -dependencies = [ - "dns-lookup", - "futures-core", - "futures-util", - "http", - "hyper", - "hyper-system-resolver", - "pin-project-lite", - "thiserror", - "tokio", - "tracing", - "tracing-futures", - "trust-dns-client", - "trust-dns-proto", -] - -[[package]] -name = "quick-error" -version = "1.2.3" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a1d01941d82fa2ab50be1e79e6714289dd7cde78eba4c074bc5a4374f650dfe0" - -[[package]] -name = "quote" -version = "1.0.35" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "291ec9ab5efd934aaf503a6466c5d5251535d108ee747472c3977cc5acc868ef" -dependencies = [ - "proc-macro2", -] - -[[package]] -name = "radium" -version = "0.7.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "dc33ff2d4973d518d823d61aa239014831e521c75da58e3df4840d3f47749d09" - -[[package]] -name = "radix_trie" -version = "0.2.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c069c179fcdc6a2fe24d8d18305cf085fdbd4f922c041943e203685d6a1c58fd" -dependencies = [ - "endian-type", - "nibble_vec", -] - -[[package]] -name = "rand" -version = "0.7.3" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "6a6b1679d49b24bbfe0c803429aa1874472f50d9b363131f0e89fc356b544d03" -dependencies = [ - "getrandom 0.1.16", - "libc", - "rand_chacha 0.2.2", - "rand_core 0.5.1", - "rand_hc", -] - -[[package]] -name = "rand" -version = "0.8.5" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "34af8d1a0e25924bc5b7c43c079c942339d8f0a8b57c39049bef581b46327404" -dependencies = [ - "libc", - "rand_chacha 0.3.1", - "rand_core 0.6.4", -] - -[[package]] -name = "rand_chacha" -version = "0.2.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f4c8ed856279c9737206bf725bf36935d8666ead7aa69b52be55af369d193402" -dependencies = [ - "ppv-lite86", - "rand_core 0.5.1", -] - -[[package]] -name = "rand_chacha" -version = "0.3.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e6c10a63a0fa32252be49d21e7709d4d4baf8d231c2dbce1eaa8141b9b127d88" -dependencies = [ - "ppv-lite86", - "rand_core 0.6.4", -] - -[[package]] -name = "rand_core" -version = "0.5.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "90bde5296fc891b0cef12a6d03ddccc162ce7b2aff54160af9338f8d40df6d19" -dependencies = [ - "getrandom 0.1.16", -] - -[[package]] -name = "rand_core" -version = "0.6.4" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ec0be4795e2f6a28069bec0b5ff3e2ac9bafc99e6a9a7dc3547996c5c816922c" -dependencies = [ - "getrandom 0.2.12", -] - -[[package]] -name = "rand_hc" -version = "0.2.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ca3129af7b92a17112d59ad498c6f81eaf463253766b90396d39ea7a39d6613c" -dependencies = [ - "rand_core 0.5.1", -] - -[[package]] -name = "rand_xorshift" -version = "0.3.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d25bf25ec5ae4a3f1b92f929810509a2f53d7dca2f50b794ff57e3face536c8f" -dependencies = [ - "rand_core 0.6.4", -] - -[[package]] -name = "rayon" -version = "1.9.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e4963ed1bc86e4f3ee217022bd855b297cef07fb9eac5dfa1f788b220b49b3bd" -dependencies = [ - "either", - "rayon-core", -] - -[[package]] -name = "rayon-core" -version = "1.12.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "1465873a3dfdaa8ae7cb14b4383657caab0b3e8a0aa9ae8e04b044854c8dfce2" -dependencies = [ - "crossbeam-deque", - "crossbeam-utils", -] - -[[package]] -name = "redox_syscall" -version = "0.2.16" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "fb5a58c1855b4b6819d59012155603f0b22ad30cad752600aadfcb695265519a" -dependencies = [ - "bitflags 1.3.2", -] - -[[package]] -name = "redox_syscall" -version = "0.4.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "4722d768eff46b75989dd134e5c353f0d6296e5aaa3132e776cbdb56be7731aa" -dependencies = [ - "bitflags 1.3.2", -] - -[[package]] -name = "regex" -version = "1.10.3" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b62dbe01f0b06f9d8dc7d49e05a0785f153b00b2c227856282f671e0318c9b15" -dependencies = [ - "aho-corasick", - "memchr", - "regex-automata 0.4.5", - "regex-syntax 0.8.2", -] - -[[package]] -name = "regex-automata" -version = "0.1.10" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "6c230d73fb8d8c1b9c0b3135c5142a8acee3a0558fb8db5cf1cb65f8d7862132" -dependencies = [ - "regex-syntax 0.6.29", -] - -[[package]] -name = "regex-automata" -version = "0.4.5" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "5bb987efffd3c6d0d8f5f89510bb458559eab11e4f869acb20bf845e016259cd" -dependencies = [ - "aho-corasick", - "memchr", - "regex-syntax 0.8.2", -] - -[[package]] -name = "regex-syntax" -version = "0.6.29" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f162c6dd7b008981e4d40210aca20b4bd0f9b60ca9271061b07f78537722f2e1" - -[[package]] -name = "regex-syntax" -version = "0.8.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c08c74e62047bb2de4ff487b251e4a92e24f48745648451635cec7d591162d9f" - -[[package]] -name = "reth-blockchain-tree" -version = "0.1.0-alpha.21" -source = "git+https://github.com/paradigmxyz/reth.git?rev=e0c220e#e0c220efef09dd5732e69d1da5c79bc52e0b5424" -dependencies = [ - "aquamarine", - "linked_hash_set", - "lru", - "metrics", - "parking_lot 0.12.1", - "reth-db", - "reth-interfaces", - "reth-metrics", - "reth-primitives", - "reth-provider", - "reth-stages", - "reth-trie", - "tokio", - "tracing", -] - -[[package]] -name = "reth-codecs" -version = "0.1.0-alpha.21" -source = "git+https://github.com/paradigmxyz/reth.git?rev=e0c220e#e0c220efef09dd5732e69d1da5c79bc52e0b5424" -dependencies = [ - "alloy-primitives", - "bytes", - "codecs-derive", -] - -[[package]] -name = "reth-consensus-common" -version = "0.1.0-alpha.21" -source = "git+https://github.com/paradigmxyz/reth.git?rev=e0c220e#e0c220efef09dd5732e69d1da5c79bc52e0b5424" -dependencies = [ - "alloy-chains", - "cfg-if", - "reth-interfaces", - "reth-primitives", - "reth-provider", -] - -[[package]] -name = "reth-db" -version = "0.1.0-alpha.21" -source = "git+https://github.com/paradigmxyz/reth.git?rev=e0c220e#e0c220efef09dd5732e69d1da5c79bc52e0b5424" -dependencies = [ - "bytes", - "derive_more", - "eyre", - "metrics", - "modular-bitfield", - "once_cell", - "page_size", - "parity-scale-codec", - "parking_lot 0.12.1", - "paste", - "reth-codecs", - "reth-interfaces", - "reth-libmdbx", - "reth-metrics", - "reth-nippy-jar", - "reth-primitives", - "reth-tracing", - "rustc-hash", - "serde", - "strum", - "thiserror", -] - -[[package]] -name = "reth-discv4" -version = "0.1.0-alpha.21" -source = "git+https://github.com/paradigmxyz/reth.git?rev=e0c220e#e0c220efef09dd5732e69d1da5c79bc52e0b5424" -dependencies = [ - "alloy-rlp", - "discv5", - "enr", - "generic-array", - "parking_lot 0.12.1", - "reth-net-common", - "reth-net-nat", - "reth-primitives", - "rlp", - "secp256k1 0.27.0", - "serde", - "thiserror", - "tokio", - "tokio-stream", - "tracing", -] - -[[package]] -name = "reth-ecies" -version = "0.1.0-alpha.21" -source = "git+https://github.com/paradigmxyz/reth.git?rev=e0c220e#e0c220efef09dd5732e69d1da5c79bc52e0b5424" -dependencies = [ - "aes 0.8.4", - "alloy-rlp", - "block-padding", - "byteorder", - "cipher 0.4.4", - "ctr 0.9.2", - "digest 0.10.7", - "educe", - "futures", - "generic-array", - "hmac", - "pin-project", - "rand 0.8.5", - "reth-net-common", - "reth-primitives", - "secp256k1 0.27.0", - "sha2", - "sha3", - "thiserror", - "tokio", - "tokio-stream", - "tokio-util", - "tracing", - "typenum", -] - -[[package]] -name = "reth-eth-wire" -version = "0.1.0-alpha.21" -source = "git+https://github.com/paradigmxyz/reth.git?rev=e0c220e#e0c220efef09dd5732e69d1da5c79bc52e0b5424" -dependencies = [ - "alloy-chains", - "alloy-rlp", - "bytes", - "derive_more", - "futures", - "metrics", - "pin-project", - "reth-codecs", - "reth-discv4", - "reth-ecies", - "reth-metrics", - "reth-primitives", - "serde", - "snap", - "thiserror", - "tokio", - "tokio-stream", - "tokio-util", - "tracing", -] - -[[package]] -name = "reth-ethereum-forks" -version = "0.1.0-alpha.21" -source = "git+https://github.com/paradigmxyz/reth.git?rev=e0c220e#e0c220efef09dd5732e69d1da5c79bc52e0b5424" -dependencies = [ - "alloy-chains", - "alloy-primitives", - "alloy-rlp", - "crc", - "serde", - "thiserror", -] - -[[package]] -name = "reth-interfaces" -version = "0.1.0-alpha.21" -source = "git+https://github.com/paradigmxyz/reth.git?rev=e0c220e#e0c220efef09dd5732e69d1da5c79bc52e0b5424" -dependencies = [ - "auto_impl", - "futures", - "reth-eth-wire", - "reth-network-api", - "reth-nippy-jar", - "reth-primitives", - "reth-rpc-types", - "thiserror", - "tokio", - "tracing", -] - -[[package]] -name = "reth-libmdbx" -version = "0.1.0-alpha.21" -source = "git+https://github.com/paradigmxyz/reth.git?rev=e0c220e#e0c220efef09dd5732e69d1da5c79bc52e0b5424" -dependencies = [ - "bitflags 2.4.2", - "byteorder", - "dashmap", - "derive_more", - "indexmap 2.2.3", - "libc", - "libffi", - "parking_lot 0.12.1", - "reth-mdbx-sys", - "thiserror", - "tracing", -] - -[[package]] -name = "reth-mdbx-sys" -version = "0.1.0-alpha.21" -source = "git+https://github.com/paradigmxyz/reth.git?rev=e0c220e#e0c220efef09dd5732e69d1da5c79bc52e0b5424" -dependencies = [ - "bindgen", - "cc", - "libc", -] - -[[package]] -name = "reth-metrics" -version = "0.1.0-alpha.21" -source = "git+https://github.com/paradigmxyz/reth.git?rev=e0c220e#e0c220efef09dd5732e69d1da5c79bc52e0b5424" -dependencies = [ - "futures", - "metrics", - "reth-metrics-derive", - "tokio", - "tokio-util", -] - -[[package]] -name = "reth-metrics-derive" -version = "0.1.0-alpha.21" -source = "git+https://github.com/paradigmxyz/reth.git?rev=e0c220e#e0c220efef09dd5732e69d1da5c79bc52e0b5424" -dependencies = [ - "once_cell", - "proc-macro2", - "quote", - "regex", - "syn 2.0.52", -] - -[[package]] -name = "reth-net-common" -version = "0.1.0-alpha.21" -source = "git+https://github.com/paradigmxyz/reth.git?rev=e0c220e#e0c220efef09dd5732e69d1da5c79bc52e0b5424" -dependencies = [ - "pin-project", - "reth-primitives", - "tokio", -] - -[[package]] -name = "reth-net-nat" -version = "0.1.0-alpha.21" -source = "git+https://github.com/paradigmxyz/reth.git?rev=e0c220e#e0c220efef09dd5732e69d1da5c79bc52e0b5424" -dependencies = [ - "igd-next", - "pin-project-lite", - "public-ip", - "serde_with", - "thiserror", - "tokio", - "tracing", -] - -[[package]] -name = "reth-network-api" -version = "0.1.0-alpha.21" -source = "git+https://github.com/paradigmxyz/reth.git?rev=e0c220e#e0c220efef09dd5732e69d1da5c79bc52e0b5424" -dependencies = [ - "alloy-chains", - "async-trait", - "reth-discv4", - "reth-eth-wire", - "reth-primitives", - "reth-rpc-types", - "serde", - "thiserror", - "tokio", -] - -[[package]] -name = "reth-nippy-jar" -version = "0.1.0-alpha.21" -source = "git+https://github.com/paradigmxyz/reth.git?rev=e0c220e#e0c220efef09dd5732e69d1da5c79bc52e0b5424" -dependencies = [ - "anyhow", - "bincode", - "cuckoofilter", - "derive_more", - "lz4_flex", - "memmap2", - "ph", - "serde", - "sucds 0.8.1", - "thiserror", - "tracing", - "zstd", -] - -[[package]] -name = "reth-node-api" -version = "0.1.0-alpha.21" -source = "git+https://github.com/paradigmxyz/reth.git?rev=e0c220e#e0c220efef09dd5732e69d1da5c79bc52e0b5424" -dependencies = [ - "reth-primitives", - "reth-rpc-types", - "revm", - "revm-primitives", - "serde", - "thiserror", -] - -[[package]] -name = "reth-primitives" -version = "0.1.0-alpha.21" -source = "git+https://github.com/paradigmxyz/reth.git?rev=e0c220e#e0c220efef09dd5732e69d1da5c79bc52e0b5424" -dependencies = [ - "alloy-chains", - "alloy-eips", - "alloy-genesis", - "alloy-primitives", - "alloy-rlp", - "alloy-trie", - "byteorder", - "bytes", - "c-kzg", - "cfg-if", - "derive_more", - "itertools 0.12.1", - "modular-bitfield", - "num_enum", - "nybbles", - "once_cell", - "rayon", - "reth-codecs", - "reth-ethereum-forks", - "reth-rpc-types", - "revm", - "revm-primitives", - "secp256k1 0.27.0", - "serde", - "serde_json", - "sha2", - "strum", - "sucds 0.6.0", - "tempfile", - "thiserror", - "tracing", - "zstd", -] - -[[package]] -name = "reth-provider" -version = "0.1.0-alpha.21" -source = "git+https://github.com/paradigmxyz/reth.git?rev=e0c220e#e0c220efef09dd5732e69d1da5c79bc52e0b5424" -dependencies = [ - "auto_impl", - "dashmap", - "itertools 0.12.1", - "metrics", - "parking_lot 0.12.1", - "pin-project", - "rayon", - "reth-db", - "reth-interfaces", - "reth-metrics", - "reth-nippy-jar", - "reth-node-api", - "reth-primitives", - "reth-trie", - "revm", - "strum", - "tokio", - "tokio-stream", - "tracing", -] - -[[package]] -name = "reth-revm" -version = "0.1.0-alpha.21" -source = "git+https://github.com/paradigmxyz/reth.git?rev=e0c220e#e0c220efef09dd5732e69d1da5c79bc52e0b5424" -dependencies = [ - "reth-consensus-common", - "reth-interfaces", - "reth-node-api", - "reth-primitives", - "reth-provider", - "revm", - "revm-inspectors", - "tracing", -] - -[[package]] -name = "reth-rpc-types" -version = "0.1.0-alpha.21" -source = "git+https://github.com/paradigmxyz/reth.git?rev=e0c220e#e0c220efef09dd5732e69d1da5c79bc52e0b5424" -dependencies = [ - "alloy-primitives", - "alloy-rlp", - "alloy-rpc-engine-types", - "alloy-rpc-trace-types", - "alloy-rpc-types", - "bytes", - "itertools 0.12.1", - "jsonrpsee-types", - "secp256k1 0.27.0", - "serde", - "serde_json", - "serde_with", - "thiserror", - "url", -] - -[[package]] -name = "reth-stages" -version = "0.1.0-alpha.21" -source = "git+https://github.com/paradigmxyz/reth.git?rev=e0c220e#e0c220efef09dd5732e69d1da5c79bc52e0b5424" -dependencies = [ - "aquamarine", - "auto_impl", - "futures-util", - "itertools 0.12.1", - "metrics", - "num-traits", - "pin-project", - "rayon", - "reth-codecs", - "reth-db", - "reth-interfaces", - "reth-metrics", - "reth-primitives", - "reth-provider", - "reth-tokio-util", - "reth-trie", - "revm", - "serde", - "thiserror", - "tokio", - "tokio-stream", - "tracing", -] - -[[package]] -name = "reth-tokio-util" -version = "0.1.0-alpha.21" -source = "git+https://github.com/paradigmxyz/reth.git?rev=e0c220e#e0c220efef09dd5732e69d1da5c79bc52e0b5424" -dependencies = [ - "tokio", - "tokio-stream", -] - -[[package]] -name = "reth-tracing" -version = "0.1.0-alpha.21" -source = "git+https://github.com/paradigmxyz/reth.git?rev=e0c220e#e0c220efef09dd5732e69d1da5c79bc52e0b5424" -dependencies = [ - "clap", - "eyre", - "rolling-file", - "tracing", - "tracing-appender", - "tracing-journald", - "tracing-logfmt", - "tracing-subscriber", -] - -[[package]] -name = "reth-trie" -version = "0.1.0-alpha.21" -source = "git+https://github.com/paradigmxyz/reth.git?rev=e0c220e#e0c220efef09dd5732e69d1da5c79bc52e0b5424" -dependencies = [ - "alloy-chains", - "alloy-rlp", - "auto_impl", - "derive_more", - "reth-db", - "reth-interfaces", - "reth-primitives", - "revm", - "thiserror", - "tracing", -] - -[[package]] -name = "rethdb-reader" -version = "0.1.0" -dependencies = [ - "alloy-rlp", - "anyhow", - "reth-blockchain-tree", - "reth-db", - "reth-primitives", - "reth-provider", - "reth-revm", - "reth-rpc-types", - "serde", - "serde_json", -] - -[[package]] -name = "revm" -version = "6.1.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "1d35316fc02d99e42831356c71e882f5d385c77b78f64a44ae82f2f9a4b8b72f" -dependencies = [ - "auto_impl", - "cfg-if", - "revm-interpreter", - "revm-precompile", - "serde", - "serde_json", -] - -[[package]] -name = "revm-inspectors" -version = "0.1.0" -source = "git+https://github.com/paradigmxyz/evm-inspectors?rev=75a187b#75a187ba967a29b30af2e5e848073c755068da06" -dependencies = [ - "alloy-primitives", - "alloy-rpc-trace-types", - "alloy-rpc-types", - "alloy-sol-types", - "anstyle", - "colorchoice", - "revm", -] - -[[package]] -name = "revm-interpreter" -version = "3.1.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "8fa10c2dc1e8f4934bdc763a2c09371bcec29e50c22e55e3eb325ee0cba09064" -dependencies = [ - "revm-primitives", - "serde", -] - -[[package]] -name = "revm-precompile" -version = "4.1.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "db828d49d329560a70809d9d1fa0c74695edb49f50c5332db3eb24483076deac" -dependencies = [ - "aurora-engine-modexp", - "c-kzg", - "k256", - "once_cell", - "revm-primitives", - "ripemd", - "secp256k1 0.28.2", - "sha2", - "substrate-bn", -] - -[[package]] -name = "revm-primitives" -version = "2.1.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "fecd125aad58e135e2ca5771ed6e4e7b1f05fa3a64e0dfb9cc643b7a800a8435" -dependencies = [ - "alloy-primitives", - "auto_impl", - "bitflags 2.4.2", - "bitvec", - "c-kzg", - "cfg-if", - "derive_more", - "enumn", - "hashbrown 0.14.3", - "hex", - "once_cell", - "serde", -] - -[[package]] -name = "rfc6979" -version = "0.4.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f8dd2a808d456c4a54e300a23e9f5a67e122c3024119acbfd73e3bf664491cb2" -dependencies = [ - "hmac", - "subtle", -] - -[[package]] -name = "ripemd" -version = "0.1.3" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "bd124222d17ad93a644ed9d011a40f4fb64aa54275c08cc216524a9ea82fb09f" -dependencies = [ - "digest 0.10.7", -] - -[[package]] -name = "rlp" -version = "0.5.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "bb919243f34364b6bd2fc10ef797edbfa75f33c252e7998527479c6d6b47e1ec" -dependencies = [ - "bytes", - "rustc-hex", -] - -[[package]] -name = "rolling-file" -version = "0.2.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "8395b4f860856b740f20a296ea2cd4d823e81a2658cf05ef61be22916026a906" -dependencies = [ - "chrono", -] - -[[package]] -name = "ruint" -version = "1.12.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "49b1d9521f889713d1221270fdd63370feca7e5c71a18745343402fa86e4f04f" -dependencies = [ - "alloy-rlp", - "ark-ff 0.3.0", - "ark-ff 0.4.2", - "bytes", - "fastrlp", - "num-bigint", - "num-traits", - "parity-scale-codec", - "primitive-types", - "proptest", - "rand 0.8.5", - "rlp", - "ruint-macro", - "serde", - "valuable", - "zeroize", -] - -[[package]] -name = "ruint-macro" -version = "1.2.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f86854cf50259291520509879a5c294c3c9a4c334e9ff65071c51e42ef1e2343" - -[[package]] -name = "rustc-demangle" -version = "0.1.23" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d626bb9dae77e28219937af045c257c28bfd3f69333c512553507f5f9798cb76" - -[[package]] -name = "rustc-hash" -version = "1.1.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "08d43f7aa6b08d49f382cde6a7982047c3426db949b1424bc4b7ec9ae12c6ce2" - -[[package]] -name = "rustc-hex" -version = "2.1.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "3e75f6a532d0fd9f7f13144f392b6ad56a32696bfcd9c78f797f16bbb6f072d6" - -[[package]] -name = "rustc_version" -version = "0.3.3" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f0dfe2087c51c460008730de8b57e6a320782fbfb312e1f4d520e6c6fae155ee" -dependencies = [ - "semver 0.11.0", -] - -[[package]] -name = "rustc_version" -version = "0.4.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "bfa0f585226d2e68097d4f95d113b15b83a82e819ab25717ec0590d9584ef366" -dependencies = [ - "semver 1.0.22", -] - -[[package]] -name = "rustix" -version = "0.38.31" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "6ea3e1a662af26cd7a3ba09c0297a31af215563ecf42817c98df621387f4e949" -dependencies = [ - "bitflags 2.4.2", - "errno", - "libc", - "linux-raw-sys", - "windows-sys 0.52.0", -] - -[[package]] -name = "rustversion" -version = "1.0.14" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "7ffc183a10b4478d04cbbbfc96d0873219d962dd5accaff2ffbd4ceb7df837f4" - -[[package]] -name = "rusty-fork" -version = "0.3.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "cb3dcc6e454c328bb824492db107ab7c0ae8fcffe4ad210136ef014458c1bc4f" -dependencies = [ - "fnv", - "quick-error", - "tempfile", - "wait-timeout", -] - -[[package]] -name = "ryu" -version = "1.0.17" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e86697c916019a8588c99b5fac3cead74ec0b4b819707a682fd4d23fa0ce1ba1" - -[[package]] -name = "scopeguard" -version = "1.2.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "94143f37725109f92c262ed2cf5e59bce7498c01bcc1502d7b9afe439a4e9f49" - -[[package]] -name = "sec1" -version = "0.7.3" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d3e97a565f76233a6003f9f5c54be1d9c5bdfa3eccfb189469f11ec4901c47dc" -dependencies = [ - "base16ct", - "der", - "generic-array", - "pkcs8", - "subtle", - "zeroize", -] - -[[package]] -name = "secp256k1" -version = "0.27.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "25996b82292a7a57ed3508f052cfff8640d38d32018784acd714758b43da9c8f" -dependencies = [ - "rand 0.8.5", - "secp256k1-sys 0.8.1", - "serde", -] - -[[package]] -name = "secp256k1" -version = "0.28.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d24b59d129cdadea20aea4fb2352fa053712e5d713eee47d700cd4b2bc002f10" -dependencies = [ - "secp256k1-sys 0.9.2", -] - -[[package]] -name = "secp256k1-sys" -version = "0.8.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "70a129b9e9efbfb223753b9163c4ab3b13cff7fd9c7f010fbac25ab4099fa07e" -dependencies = [ - "cc", -] - -[[package]] -name = "secp256k1-sys" -version = "0.9.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e5d1746aae42c19d583c3c1a8c646bfad910498e2051c551a7f2e3c0c9fbb7eb" -dependencies = [ - "cc", -] - -[[package]] -name = "semver" -version = "0.11.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f301af10236f6df4160f7c3f04eec6dbc70ace82d23326abad5edee88801c6b6" -dependencies = [ - "semver-parser", -] - -[[package]] -name = "semver" -version = "1.0.22" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "92d43fe69e652f3df9bdc2b85b2854a0825b86e4fb76bc44d945137d053639ca" - -[[package]] -name = "semver-parser" -version = "0.10.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "00b0bef5b7f9e0df16536d3961cfb6e84331c065b4066afb39768d0e319411f7" -dependencies = [ - "pest", -] - -[[package]] -name = "serde" -version = "1.0.197" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "3fb1c873e1b9b056a4dc4c0c198b24c3ffa059243875552b2bd0933b1aee4ce2" -dependencies = [ - "serde_derive", -] - -[[package]] -name = "serde_bytes" -version = "0.11.14" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "8b8497c313fd43ab992087548117643f6fcd935cbf36f176ffda0aacf9591734" -dependencies = [ - "serde", -] - -[[package]] -name = "serde_derive" -version = "1.0.197" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "7eb0b34b42edc17f6b7cac84a52a1c5f0e1bb2227e997ca9011ea3dd34e8610b" -dependencies = [ - "proc-macro2", - "quote", - "syn 2.0.52", -] - -[[package]] -name = "serde_json" -version = "1.0.114" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c5f09b1bd632ef549eaa9f60a1f8de742bdbc698e6cee2095fc84dde5f549ae0" -dependencies = [ - "indexmap 2.2.3", - "itoa", - "ryu", - "serde", -] - -[[package]] -name = "serde_with" -version = "3.6.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "15d167997bd841ec232f5b2b8e0e26606df2e7caa4c31b95ea9ca52b200bd270" -dependencies = [ - "base64", - "chrono", - "hex", - "indexmap 1.9.3", - "indexmap 2.2.3", - "serde", - "serde_derive", - "serde_json", - "serde_with_macros", - "time", -] - -[[package]] -name = "serde_with_macros" -version = "3.6.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "865f9743393e638991566a8b7a479043c2c8da94a33e0a31f18214c9cae0a64d" -dependencies = [ - "darling 0.20.8", - "proc-macro2", - "quote", - "syn 2.0.52", -] - -[[package]] -name = "sha2" -version = "0.10.8" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "793db75ad2bcafc3ffa7c68b215fee268f537982cd901d132f89c6343f3a3dc8" -dependencies = [ - "cfg-if", - "cpufeatures", - "digest 0.10.7", -] - -[[package]] -name = "sha3" -version = "0.10.8" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "75872d278a8f37ef87fa0ddbda7802605cb18344497949862c0d4dcb291eba60" -dependencies = [ - "digest 0.10.7", - "keccak", -] - -[[package]] -name = "sha3-asm" -version = "0.1.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "bac61da6b35ad76b195eb4771210f947734321a8d81d7738e1580d953bc7a15e" -dependencies = [ - "cc", - "cfg-if", -] - -[[package]] -name = "sharded-slab" -version = "0.1.7" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f40ca3c46823713e0d4209592e8d6e826aa57e928f09752619fc696c499637f6" -dependencies = [ - "lazy_static", -] - -[[package]] -name = "shlex" -version = "1.3.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "0fda2ff0d084019ba4d7c6f371c95d8fd75ce3524c3cb8fb653a3023f6323e64" - -[[package]] -name = "signal-hook-registry" -version = "1.4.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d8229b473baa5980ac72ef434c4415e70c4b5e71b423043adb4ba059f89c99a1" -dependencies = [ - "libc", -] - -[[package]] -name = "signature" -version = "2.2.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "77549399552de45a898a580c1b41d445bf730df867cc44e6c0233bbc4b8329de" -dependencies = [ - "digest 0.10.7", - "rand_core 0.6.4", -] - -[[package]] -name = "slab" -version = "0.4.9" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "8f92a496fb766b417c996b9c5e57daf2f7ad3b0bebe1ccfca4856390e3d3bb67" -dependencies = [ - "autocfg", -] - -[[package]] -name = "smallvec" -version = "1.13.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e6ecd384b10a64542d77071bd64bd7b231f4ed5940fba55e98c3de13824cf3d7" -dependencies = [ - "serde", -] - -[[package]] -name = "snap" -version = "1.1.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "1b6b67fb9a61334225b5b790716f609cd58395f895b3fe8b328786812a40bc3b" - -[[package]] -name = "socket2" -version = "0.4.10" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "9f7916fc008ca5542385b89a3d3ce689953c143e9304a9bf8beec1de48994c0d" -dependencies = [ - "libc", - "winapi", -] - -[[package]] -name = "socket2" -version = "0.5.6" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "05ffd9c0a93b7543e062e759284fcf5f5e3b098501104bfbdde4d404db792871" -dependencies = [ - "libc", - "windows-sys 0.52.0", -] - -[[package]] -name = "spin" -version = "0.5.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "6e63cff320ae2c57904679ba7cb63280a3dc4613885beafb148ee7bf9aa9042d" - -[[package]] -name = "spki" -version = "0.7.3" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d91ed6c858b01f942cd56b37a94b3e0a1798290327d1236e4d9cf4eaca44d29d" -dependencies = [ - "base64ct", - "der", -] - -[[package]] -name = "static_assertions" -version = "1.1.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a2eb9349b6444b326872e140eb1cf5e7c522154d69e7a0ffb0fb81c06b37543f" - -[[package]] -name = "strsim" -version = "0.9.3" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "6446ced80d6c486436db5c078dde11a9f73d42b57fb273121e160b84f63d894c" - -[[package]] -name = "strsim" -version = "0.10.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "73473c0e59e6d5812c5dfe2a064a6444949f089e20eec9a2e5506596494e4623" - -[[package]] -name = "strsim" -version = "0.11.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "5ee073c9e4cd00e28217186dbe12796d692868f432bf2e97ee73bed0c56dfa01" - -[[package]] -name = "strum" -version = "0.26.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "723b93e8addf9aa965ebe2d11da6d7540fa2283fcea14b3371ff055f7ba13f5f" -dependencies = [ - "strum_macros", -] - -[[package]] -name = "strum_macros" -version = "0.26.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "7a3417fc93d76740d974a01654a09777cb500428cc874ca9f45edfe0c4d4cd18" -dependencies = [ - "heck", - "proc-macro2", - "quote", - "rustversion", - "syn 2.0.52", -] - -[[package]] -name = "substrate-bn" -version = "0.6.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "72b5bbfa79abbae15dd642ea8176a21a635ff3c00059961d1ea27ad04e5b441c" -dependencies = [ - "byteorder", - "crunchy", - "lazy_static", - "rand 0.8.5", - "rustc-hex", -] - -[[package]] -name = "subtle" -version = "2.5.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "81cdd64d312baedb58e21336b31bc043b77e01cc99033ce76ef539f78e965ebc" - -[[package]] -name = "sucds" -version = "0.6.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "64accd20141dfbef67ad83c51d588146cff7810616e1bda35a975be369059533" -dependencies = [ - "anyhow", -] - -[[package]] -name = "sucds" -version = "0.8.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d53d46182afe6ed822a94c54a532dc0d59691a8f49226bdc4596529ca864cdd6" -dependencies = [ - "anyhow", - "num-traits", -] - -[[package]] -name = "syn" -version = "1.0.109" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "72b64191b275b66ffe2469e8af2c1cfe3bafa67b529ead792a6d0160888b4237" -dependencies = [ - "proc-macro2", - "quote", - "unicode-ident", -] - -[[package]] -name = "syn" -version = "2.0.52" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b699d15b36d1f02c3e7c69f8ffef53de37aefae075d8488d4ba1a7788d574a07" -dependencies = [ - "proc-macro2", - "quote", - "unicode-ident", -] - -[[package]] -name = "syn-solidity" -version = "0.6.3" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e656cbcef8a77543b5accbd76f60f9e0bc4be364b0aba4263a6f313f8a355511" -dependencies = [ - "paste", - "proc-macro2", - "quote", - "syn 2.0.52", -] - -[[package]] -name = "tap" -version = "1.0.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "55937e1799185b12863d447f42597ed69d9928686b8d88a1df17376a097d8369" - -[[package]] -name = "tempfile" -version = "3.10.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "85b77fafb263dd9d05cbeac119526425676db3784113aa9295c88498cbf8bff1" -dependencies = [ - "cfg-if", - "fastrand", - "rustix", - "windows-sys 0.52.0", -] - -[[package]] -name = "thiserror" -version = "1.0.57" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "1e45bcbe8ed29775f228095caf2cd67af7a4ccf756ebff23a306bf3e8b47b24b" -dependencies = [ - "thiserror-impl", -] - -[[package]] -name = "thiserror-impl" -version = "1.0.57" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a953cb265bef375dae3de6663da4d3804eee9682ea80d8e2542529b73c531c81" -dependencies = [ - "proc-macro2", - "quote", - "syn 2.0.52", -] - -[[package]] -name = "thread_local" -version = "1.1.8" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "8b9ef9bad013ada3808854ceac7b46812a6465ba368859a37e2100283d2d719c" -dependencies = [ - "cfg-if", - "once_cell", -] - -[[package]] -name = "threadpool" -version = "1.8.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d050e60b33d41c19108b32cea32164033a9013fe3b46cbd4457559bfbf77afaa" -dependencies = [ - "num_cpus", -] - -[[package]] -name = "time" -version = "0.3.34" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c8248b6521bb14bc45b4067159b9b6ad792e2d6d754d6c41fb50e29fefe38749" -dependencies = [ - "deranged", - "itoa", - "num-conv", - "powerfmt", - "serde", - "time-core", - "time-macros", -] - -[[package]] -name = "time-core" -version = "0.1.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ef927ca75afb808a4d64dd374f00a2adf8d0fcff8e7b184af886c3c87ec4a3f3" - -[[package]] -name = "time-macros" -version = "0.2.17" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "7ba3a3ef41e6672a2f0f001392bb5dcd3ff0a9992d618ca761a11c3121547774" -dependencies = [ - "num-conv", - "time-core", -] - -[[package]] -name = "tiny-keccak" -version = "2.0.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "2c9d3793400a45f954c52e73d068316d76b6f4e36977e3fcebb13a2721e80237" -dependencies = [ - "crunchy", -] - -[[package]] -name = "tinyvec" -version = "1.6.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "87cc5ceb3875bb20c2890005a4e226a4651264a5c75edb2421b52861a0a0cb50" -dependencies = [ - "tinyvec_macros", -] - -[[package]] -name = "tinyvec_macros" -version = "0.1.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "1f3ccbac311fea05f86f61904b462b55fb3df8837a366dfc601a0161d0532f20" - -[[package]] -name = "tokio" -version = "1.36.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "61285f6515fa018fb2d1e46eb21223fff441ee8db5d0f1435e8ab4f5cdb80931" -dependencies = [ - "backtrace", - "bytes", - "libc", - "mio", - "num_cpus", - "parking_lot 0.12.1", - "pin-project-lite", - "signal-hook-registry", - "socket2 0.5.6", - "tokio-macros", - "windows-sys 0.48.0", -] - -[[package]] -name = "tokio-macros" -version = "2.2.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "5b8a1e28f2deaa14e508979454cb3a223b10b938b45af148bc0986de36f1923b" -dependencies = [ - "proc-macro2", - "quote", - "syn 2.0.52", -] - -[[package]] -name = "tokio-stream" -version = "0.1.14" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "397c988d37662c7dda6d2208364a706264bf3d6138b11d436cbac0ad38832842" -dependencies = [ - "futures-core", - "pin-project-lite", - "tokio", - "tokio-util", -] - -[[package]] -name = "tokio-util" -version = "0.7.10" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "5419f34732d9eb6ee4c3578b7989078579b7f039cbbb9ca2c4da015749371e15" -dependencies = [ - "bytes", - "futures-core", - "futures-sink", - "pin-project-lite", - "slab", - "tokio", - "tracing", -] - -[[package]] -name = "toml_datetime" -version = "0.6.5" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "3550f4e9685620ac18a50ed434eb3aec30db8ba93b0287467bca5826ea25baf1" - -[[package]] -name = "toml_edit" -version = "0.20.7" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "70f427fce4d84c72b5b732388bf4a9f4531b53f74e2887e3ecb2481f68f66d81" -dependencies = [ - "indexmap 2.2.3", - "toml_datetime", - "winnow", -] - -[[package]] -name = "toml_edit" -version = "0.21.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "6a8534fd7f78b5405e860340ad6575217ce99f38d4d5c8f2442cb5ecb50090e1" -dependencies = [ - "indexmap 2.2.3", - "toml_datetime", - "winnow", -] - -[[package]] -name = "tower-service" -version = "0.3.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b6bc1c9ce2b5135ac7f93c72918fc37feb872bdc6a5533a8b85eb4b86bfdae52" - -[[package]] -name = "tracing" -version = "0.1.40" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c3523ab5a71916ccf420eebdf5521fcef02141234bbc0b8a49f2fdc4544364ef" -dependencies = [ - "log", - "pin-project-lite", - "tracing-attributes", - "tracing-core", -] - -[[package]] -name = "tracing-appender" -version = "0.2.3" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "3566e8ce28cc0a3fe42519fc80e6b4c943cc4c8cef275620eb8dac2d3d4e06cf" -dependencies = [ - "crossbeam-channel", - "thiserror", - "time", - "tracing-subscriber", -] - -[[package]] -name = "tracing-attributes" -version = "0.1.27" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "34704c8d6ebcbc939824180af020566b01a7c01f80641264eba0999f6c2b6be7" -dependencies = [ - "proc-macro2", - "quote", - "syn 2.0.52", -] - -[[package]] -name = "tracing-core" -version = "0.1.32" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c06d3da6113f116aaee68e4d601191614c9053067f9ab7f6edbcb161237daa54" -dependencies = [ - "once_cell", - "valuable", -] - -[[package]] -name = "tracing-futures" -version = "0.2.5" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "97d095ae15e245a057c8e8451bab9b3ee1e1f68e9ba2b4fbc18d0ac5237835f2" -dependencies = [ - "futures", - "futures-task", - "pin-project", - "tracing", -] - -[[package]] -name = "tracing-journald" -version = "0.3.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ba316a74e8fc3c3896a850dba2375928a9fa171b085ecddfc7c054d39970f3fd" -dependencies = [ - "libc", - "tracing-core", - "tracing-subscriber", -] - -[[package]] -name = "tracing-log" -version = "0.2.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ee855f1f400bd0e5c02d150ae5de3840039a3f54b025156404e34c23c03f47c3" -dependencies = [ - "log", - "once_cell", - "tracing-core", -] - -[[package]] -name = "tracing-logfmt" -version = "0.3.3" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "84bab42e40ace4e4ff19c92023ee1dbc1510db60976828fbbdc6994852c7d065" -dependencies = [ - "time", - "tracing", - "tracing-core", - "tracing-subscriber", -] - -[[package]] -name = "tracing-serde" -version = "0.1.3" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "bc6b213177105856957181934e4920de57730fc69bf42c37ee5bb664d406d9e1" -dependencies = [ - "serde", - "tracing-core", -] - -[[package]] -name = "tracing-subscriber" -version = "0.3.18" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ad0f048c97dbd9faa9b7df56362b8ebcaa52adb06b498c050d2f4e32f90a7a8b" -dependencies = [ - "matchers", - "nu-ansi-term", - "once_cell", - "regex", - "serde", - "serde_json", - "sharded-slab", - "smallvec", - "thread_local", - "tracing", - "tracing-core", - "tracing-log", - "tracing-serde", -] - -[[package]] -name = "trust-dns-client" -version = "0.20.4" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "5b4ef9b9bde0559b78a4abb00339143750085f05e5a453efb7b8bef1061f09dc" -dependencies = [ - "cfg-if", - "data-encoding", - "futures-channel", - "futures-util", - "lazy_static", - "log", - "radix_trie", - "rand 0.8.5", - "thiserror", - "time", - "tokio", - "trust-dns-proto", -] - -[[package]] -name = "trust-dns-proto" -version = "0.20.4" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ca94d4e9feb6a181c690c4040d7a24ef34018d8313ac5044a61d21222ae24e31" -dependencies = [ - "async-trait", - "cfg-if", - "data-encoding", - "enum-as-inner", - "futures-channel", - "futures-io", - "futures-util", - "idna 0.2.3", - "ipnet", - "lazy_static", - "log", - "rand 0.8.5", - "smallvec", - "thiserror", - "tinyvec", - "tokio", - "url", -] - -[[package]] -name = "try-lock" -version = "0.2.5" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e421abadd41a4225275504ea4d6566923418b7f05506fbc9c0fe86ba7396114b" - -[[package]] -name = "typenum" -version = "1.17.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "42ff0bf0c66b8238c6f3b578df37d0b7848e55df8577b3f74f92a69acceeb825" - -[[package]] -name = "ucd-trie" -version = "0.1.6" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ed646292ffc8188ef8ea4d1e0e0150fb15a5c2e12ad9b8fc191ae7a8a7f3c4b9" - -[[package]] -name = "uint" -version = "0.9.5" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "76f64bba2c53b04fcab63c01a7d7427eadc821e3bc48c34dc9ba29c501164b52" -dependencies = [ - "byteorder", - "crunchy", - "hex", - "static_assertions", -] - -[[package]] -name = "unarray" -version = "0.1.4" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "eaea85b334db583fe3274d12b4cd1880032beab409c0d774be044d4480ab9a94" - -[[package]] -name = "unicode-bidi" -version = "0.3.15" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "08f95100a766bf4f8f28f90d77e0a5461bbdb219042e7679bebe79004fed8d75" - -[[package]] -name = "unicode-ident" -version = "1.0.12" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "3354b9ac3fae1ff6755cb6db53683adb661634f67557942dea4facebec0fee4b" - -[[package]] -name = "unicode-normalization" -version = "0.1.23" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a56d1686db2308d901306f92a263857ef59ea39678a5458e7cb17f01415101f5" -dependencies = [ - "tinyvec", -] - -[[package]] -name = "unicode-segmentation" -version = "1.11.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d4c87d22b6e3f4a18d4d40ef354e97c90fcb14dd91d7dc0aa9d8a1172ebf7202" - -[[package]] -name = "universal-hash" -version = "0.4.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "8326b2c654932e3e4f9196e69d08fdf7cfd718e1dc6f66b347e6024a0c961402" -dependencies = [ - "generic-array", - "subtle", -] - -[[package]] -name = "url" -version = "2.5.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "31e6302e3bb753d46e83516cae55ae196fc0c309407cf11ab35cc51a4c2a4633" -dependencies = [ - "form_urlencoded", - "idna 0.5.0", - "percent-encoding", -] - -[[package]] -name = "utf8parse" -version = "0.2.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "711b9620af191e0cdc7468a8d14e709c3dcdb115b36f838e601583af800a370a" - -[[package]] -name = "valuable" -version = "0.1.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "830b7e5d4d90034032940e4ace0d9a9a057e7a45cd94e6c007832e39edb82f6d" - -[[package]] -name = "version_check" -version = "0.9.4" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "49874b5167b65d7193b8aba1567f5c7d93d001cafc34600cee003eda787e483f" - -[[package]] -name = "wait-timeout" -version = "0.2.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "9f200f5b12eb75f8c1ed65abd4b2db8a6e1b138a20de009dacee265a2498f3f6" -dependencies = [ - "libc", -] - -[[package]] -name = "want" -version = "0.3.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "bfa7760aed19e106de2c7c0b581b509f2f25d3dacaf737cb82ac61bc6d760b0e" -dependencies = [ - "try-lock", -] - -[[package]] -name = "wasi" -version = "0.9.0+wasi-snapshot-preview1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "cccddf32554fecc6acb585f82a32a72e28b48f8c4c1883ddfeeeaa96f7d8e519" - -[[package]] -name = "wasi" -version = "0.11.0+wasi-snapshot-preview1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "9c8d87e72b64a3b4db28d11ce29237c246188f4f51057d65a7eab63b7987e423" - -[[package]] -name = "wasm-bindgen" -version = "0.2.91" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c1e124130aee3fb58c5bdd6b639a0509486b0338acaaae0c84a5124b0f588b7f" -dependencies = [ - "cfg-if", - "wasm-bindgen-macro", -] - -[[package]] -name = "wasm-bindgen-backend" -version = "0.2.91" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c9e7e1900c352b609c8488ad12639a311045f40a35491fb69ba8c12f758af70b" -dependencies = [ - "bumpalo", - "log", - "once_cell", - "proc-macro2", - "quote", - "syn 2.0.52", - "wasm-bindgen-shared", -] - -[[package]] -name = "wasm-bindgen-macro" -version = "0.2.91" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b30af9e2d358182b5c7449424f017eba305ed32a7010509ede96cdc4696c46ed" -dependencies = [ - "quote", - "wasm-bindgen-macro-support", -] - -[[package]] -name = "wasm-bindgen-macro-support" -version = "0.2.91" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "642f325be6301eb8107a83d12a8ac6c1e1c54345a7ef1a9261962dfefda09e66" -dependencies = [ - "proc-macro2", - "quote", - "syn 2.0.52", - "wasm-bindgen-backend", - "wasm-bindgen-shared", -] - -[[package]] -name = "wasm-bindgen-shared" -version = "0.2.91" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "4f186bd2dcf04330886ce82d6f33dd75a7bfcf69ecf5763b89fcde53b6ac9838" - -[[package]] -name = "winapi" -version = "0.3.9" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "5c839a674fcd7a98952e593242ea400abe93992746761e38641405d28b00f419" -dependencies = [ - "winapi-i686-pc-windows-gnu", - "winapi-x86_64-pc-windows-gnu", -] - -[[package]] -name = "winapi-i686-pc-windows-gnu" -version = "0.4.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ac3b87c63620426dd9b991e5ce0329eff545bccbbb34f3be09ff6fb6ab51b7b6" - -[[package]] -name = "winapi-x86_64-pc-windows-gnu" -version = "0.4.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "712e227841d057c1ee1cd2fb22fa7e5a5461ae8e48fa2ca79ec42cfc1931183f" - -[[package]] -name = "windows-core" -version = "0.52.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "33ab640c8d7e35bf8ba19b884ba838ceb4fba93a4e8c65a9059d08afcfc683d9" -dependencies = [ - "windows-targets 0.52.4", -] - -[[package]] -name = "windows-sys" -version = "0.48.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "677d2418bec65e3338edb076e806bc1ec15693c5d0104683f2efe857f61056a9" -dependencies = [ - "windows-targets 0.48.5", -] - -[[package]] -name = "windows-sys" -version = "0.52.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "282be5f36a8ce781fad8c8ae18fa3f9beff57ec1b52cb3de0789201425d9a33d" -dependencies = [ - "windows-targets 0.52.4", -] - -[[package]] -name = "windows-targets" -version = "0.48.5" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "9a2fa6e2155d7247be68c096456083145c183cbbbc2764150dda45a87197940c" -dependencies = [ - "windows_aarch64_gnullvm 0.48.5", - "windows_aarch64_msvc 0.48.5", - "windows_i686_gnu 0.48.5", - "windows_i686_msvc 0.48.5", - "windows_x86_64_gnu 0.48.5", - "windows_x86_64_gnullvm 0.48.5", - "windows_x86_64_msvc 0.48.5", -] - -[[package]] -name = "windows-targets" -version = "0.52.4" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "7dd37b7e5ab9018759f893a1952c9420d060016fc19a472b4bb20d1bdd694d1b" -dependencies = [ - "windows_aarch64_gnullvm 0.52.4", - "windows_aarch64_msvc 0.52.4", - "windows_i686_gnu 0.52.4", - "windows_i686_msvc 0.52.4", - "windows_x86_64_gnu 0.52.4", - "windows_x86_64_gnullvm 0.52.4", - "windows_x86_64_msvc 0.52.4", -] - -[[package]] -name = "windows_aarch64_gnullvm" -version = "0.48.5" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "2b38e32f0abccf9987a4e3079dfb67dcd799fb61361e53e2882c3cbaf0d905d8" - -[[package]] -name = "windows_aarch64_gnullvm" -version = "0.52.4" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "bcf46cf4c365c6f2d1cc93ce535f2c8b244591df96ceee75d8e83deb70a9cac9" - -[[package]] -name = "windows_aarch64_msvc" -version = "0.48.5" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "dc35310971f3b2dbbf3f0690a219f40e2d9afcf64f9ab7cc1be722937c26b4bc" - -[[package]] -name = "windows_aarch64_msvc" -version = "0.52.4" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "da9f259dd3bcf6990b55bffd094c4f7235817ba4ceebde8e6d11cd0c5633b675" - -[[package]] -name = "windows_i686_gnu" -version = "0.48.5" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a75915e7def60c94dcef72200b9a8e58e5091744960da64ec734a6c6e9b3743e" - -[[package]] -name = "windows_i686_gnu" -version = "0.52.4" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b474d8268f99e0995f25b9f095bc7434632601028cf86590aea5c8a5cb7801d3" - -[[package]] -name = "windows_i686_msvc" -version = "0.48.5" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "8f55c233f70c4b27f66c523580f78f1004e8b5a8b659e05a4eb49d4166cca406" - -[[package]] -name = "windows_i686_msvc" -version = "0.52.4" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "1515e9a29e5bed743cb4415a9ecf5dfca648ce85ee42e15873c3cd8610ff8e02" - -[[package]] -name = "windows_x86_64_gnu" -version = "0.48.5" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "53d40abd2583d23e4718fddf1ebec84dbff8381c07cae67ff7768bbf19c6718e" - -[[package]] -name = "windows_x86_64_gnu" -version = "0.52.4" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "5eee091590e89cc02ad514ffe3ead9eb6b660aedca2183455434b93546371a03" - -[[package]] -name = "windows_x86_64_gnullvm" -version = "0.48.5" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "0b7b52767868a23d5bab768e390dc5f5c55825b6d30b86c844ff2dc7414044cc" - -[[package]] -name = "windows_x86_64_gnullvm" -version = "0.52.4" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "77ca79f2451b49fa9e2af39f0747fe999fcda4f5e241b2898624dca97a1f2177" - -[[package]] -name = "windows_x86_64_msvc" -version = "0.48.5" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ed94fce61571a4006852b7389a063ab983c02eb1bb37b47f8272ce92d06d9538" - -[[package]] -name = "windows_x86_64_msvc" -version = "0.52.4" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "32b752e52a2da0ddfbdbcc6fceadfeede4c939ed16d13e648833a61dfb611ed8" - -[[package]] -name = "winnow" -version = "0.5.40" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f593a95398737aeed53e489c785df13f3618e41dbcd6718c6addbf1395aa6876" -dependencies = [ - "memchr", -] - -[[package]] -name = "wyhash" -version = "0.5.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "baf6e163c25e3fac820b4b453185ea2dea3b6a3e0a721d4d23d75bd33734c295" -dependencies = [ - "rand_core 0.6.4", -] - -[[package]] -name = "wyz" -version = "0.5.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "05f360fc0b24296329c78fda852a1e9ae82de9cf7b27dae4b7f62f118f77b9ed" -dependencies = [ - "tap", -] - -[[package]] -name = "xml-rs" -version = "0.8.19" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "0fcb9cbac069e033553e8bb871be2fbdffcab578eb25bd0f7c508cedc6dcd75a" - -[[package]] -name = "xmltree" -version = "0.10.3" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d7d8a75eaf6557bb84a65ace8609883db44a29951042ada9b393151532e41fcb" -dependencies = [ - "xml-rs", -] - -[[package]] -name = "zerocopy" -version = "0.7.32" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "74d4d3961e53fa4c9a25a8637fc2bfaf2595b3d3ae34875568a5cf64787716be" -dependencies = [ - "zerocopy-derive", -] - -[[package]] -name = "zerocopy-derive" -version = "0.7.32" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "9ce1b18ccd8e73a9321186f97e46f9f04b778851177567b1975109d26a08d2a6" -dependencies = [ - "proc-macro2", - "quote", - "syn 2.0.52", -] - -[[package]] -name = "zeroize" -version = "1.7.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "525b4ec142c6b68a2d10f01f7bbf6755599ca3f81ea53b8431b7dd348f5fdb2d" -dependencies = [ - "zeroize_derive", -] - -[[package]] -name = "zeroize_derive" -version = "1.4.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ce36e65b0d2999d2aafac989fb249189a141aee1f53c612c1f37d72631959f69" -dependencies = [ - "proc-macro2", - "quote", - "syn 2.0.52", -] - -[[package]] -name = "zstd" -version = "0.12.4" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "1a27595e173641171fc74a1232b7b1c7a7cb6e18222c11e9dfb9888fa424c53c" -dependencies = [ - "zstd-safe", -] - -[[package]] -name = "zstd-safe" -version = "6.0.6" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ee98ffd0b48ee95e6c5168188e44a54550b1564d9d530ee21d5f0eaed1069581" -dependencies = [ - "libc", - "zstd-sys", -] - -[[package]] -name = "zstd-sys" -version = "2.0.9+zstd.1.5.5" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "9e16efa8a874a0481a574084d34cc26fdb3b99627480f785888deb6386506656" -dependencies = [ - "cc", - "pkg-config", -] diff --git a/op-service/rethdb-reader/Cargo.toml b/op-service/rethdb-reader/Cargo.toml deleted file mode 100644 index 16bbc7325b7f..000000000000 --- a/op-service/rethdb-reader/Cargo.toml +++ /dev/null @@ -1,26 +0,0 @@ -[package] -name = "rethdb-reader" -description = "A simple library for reading data through Reth's DB abstractions." -version = "0.1.0" -edition = "2021" - -[lib] -name = "rethdbreader" -crate-type = ["cdylib"] - -[dependencies] -# reth -reth-primitives = { git = "https://github.com/paradigmxyz/reth.git", rev = "e0c220e" } -reth-provider = { git = "https://github.com/paradigmxyz/reth.git", rev = "e0c220e" } -reth-db = { git = "https://github.com/paradigmxyz/reth.git", rev = "e0c220e" } -reth-rpc-types = { git = "https://github.com/paradigmxyz/reth.git", rev = "e0c220e" } -reth-blockchain-tree = { git = "https://github.com/paradigmxyz/reth.git", rev = "e0c220e" } - -# misc -serde = "1.0.197" -serde_json = "1.0.114" -anyhow = "1.0.80" - -[dev-dependencies] -reth-revm = { git = "https://github.com/paradigmxyz/reth.git", rev = "e0c220e" } -alloy-rlp = "0.3.4" diff --git a/op-service/rethdb-reader/Makefile b/op-service/rethdb-reader/Makefile deleted file mode 100644 index 6e9037bdfe5b..000000000000 --- a/op-service/rethdb-reader/Makefile +++ /dev/null @@ -1,8 +0,0 @@ -.PHONY: testdata -testdata: - mkdir -p testdata - @echo "Fetching block RLP and receipts for block #18,663,292 from ethereum mainnet" - cast rpc debug_getRawBlock 0x11CC77C | jq -r | xxd -r -p > testdata/block.rlp - cast rpc debug_getRawReceipts 0x11CC77C | jq -r > testdata/receipts.json - @echo "Done. Generating testdata DB & testing integrity..." - cargo test diff --git a/op-service/rethdb-reader/README.md b/op-service/rethdb-reader/README.md deleted file mode 100644 index 9f760f978015..000000000000 --- a/op-service/rethdb-reader/README.md +++ /dev/null @@ -1,113 +0,0 @@ -# `rethdb-reader` - -A dylib to be accessed via FFI in `op-service`'s `sources` package for reading information -directly from the `reth` database. - -## Developing - -**Building** - -To build the dylib, you must first have the [Rust Toolchain][rust-toolchain] installed. - -```sh -cargo build --release -``` - -**Docs** - -Documentation is available via rustdoc. - -```sh -cargo doc --open -``` - -**Linting** - -```sh -cargo +nightly fmt -- && cargo +nightly clippy --all --all-features -- -D warnings -``` - -**Generating `testdata`** - -The testdata block and `reth` database can be generated by running the `testdata` make directive: - -```sh -ETH_RPC_URL="" make testdata -``` - -**Generating the C header** - -To generate the C header, first install `cbindgen` via `cargo install cbindgen --force`. Then, run the generation script: - -```sh -./headgen.sh -``` - -### C Header - -The C header below is generated by `cbindgen`, and it is the interface that consumers of the dylib use to call its exported -functions. Currently, the only exported functions pertain to reading fully hydrated block receipts from the database. - -```c -#include -#include -#include -#include - -/** - * A [ReceiptsResult] is a wrapper around a JSON string containing serialized [TransactionReceipt]s - * 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 ReceiptsResult { - uint32_t *data; - uintptr_t data_len; - 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. - */ -struct ReceiptsResult rdb_read_receipts(const uint8_t *block_hash, - uintptr_t block_hash_len, - const void *db_instance); - -/** - * Free a string that was allocated in Rust and passed to C. - * - * # Safety - * - 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/headgen.sh b/op-service/rethdb-reader/headgen.sh deleted file mode 100755 index e7f7daf676d4..000000000000 --- a/op-service/rethdb-reader/headgen.sh +++ /dev/null @@ -1,16 +0,0 @@ -#!/bin/bash - -set -e - -# Generate rdb.h -cbindgen --crate rethdb-reader --output rdb.h -l C - -# Process README.md to replace the content within the specified code block -awk ' - BEGIN { in_code_block=0; } - /^```c/ { in_code_block=1; print; next; } - /^```/ && in_code_block { in_code_block=0; while ((getline line < "rdb.h") > 0) print line; } - !in_code_block { print; } -' README.md > README.tmp && mv README.tmp README.md - -echo "Generated C header successfully" diff --git a/op-service/rethdb-reader/rustfmt.toml b/op-service/rethdb-reader/rustfmt.toml deleted file mode 100644 index 68c3c93033d4..000000000000 --- a/op-service/rethdb-reader/rustfmt.toml +++ /dev/null @@ -1,11 +0,0 @@ -reorder_imports = true -imports_granularity = "Crate" -use_small_heuristics = "Max" -comment_width = 100 -wrap_comments = true -binop_separator = "Back" -trailing_comma = "Vertical" -trailing_semicolon = false -use_field_init_shorthand = true -format_code_in_doc_comments = true -doc_comment_code_block_width = 100 diff --git a/op-service/rethdb-reader/src/db.rs b/op-service/rethdb-reader/src/db.rs deleted file mode 100644 index 8d1840fbdea0..000000000000 --- a/op-service/rethdb-reader/src/db.rs +++ /dev/null @@ -1,59 +0,0 @@ -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 deleted file mode 100644 index 4aa785608081..000000000000 --- a/op-service/rethdb-reader/src/lib.rs +++ /dev/null @@ -1,47 +0,0 @@ -#![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. -/// -/// # Safety -/// - All possible nil pointer dereferences are checked, and the function will return a failing -/// [ReceiptsResult] if any are found. -#[no_mangle] -pub unsafe extern "C" fn rdb_read_receipts( - block_hash: *const u8, - block_hash_len: usize, - db_instance: *const c_void, -) -> ReceiptsResult { - 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. -/// -/// # Safety -/// - All possible nil pointer dereferences are checked. -#[no_mangle] -pub unsafe extern "C" fn rdb_free_string(string: *mut c_char) { - // Convert the raw pointer back to a CString and let it go out of scope, - // which will deallocate the memory. - if !string.is_null() { - 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 deleted file mode 100644 index 0dea66689b5f..000000000000 --- a/op-service/rethdb-reader/src/receipts.rs +++ /dev/null @@ -1,334 +0,0 @@ -//! This module contains the logic for reading a block's fully hydrated receipts directly from the -//! [reth] database. - -use anyhow::{anyhow, Result}; -use reth_blockchain_tree::noop::NoopBlockchainTree; -use reth_db::DatabaseEnv; -use reth_primitives::{ - BlockHashOrNumber, Receipt, TransactionKind, TransactionMeta, TransactionSigned, U128, U256, - U64, -}; -use reth_provider::{providers::BlockchainProvider, BlockReader, ReceiptProvider}; -use reth_rpc_types::{Log, TransactionReceipt}; -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. -/// -/// # 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 ReceiptsResult { - data: *mut char, - data_len: usize, - error: bool, -} - -impl ReceiptsResult { - /// Constructs a successful [ReceiptsResult] from a JSON string. - pub fn success(data: *mut char, data_len: usize) -> Self { - Self { data, data_len, error: false } - } - - /// Constructs a failing [ReceiptsResult] with a null pointer to the data. - pub fn fail() -> Self { - Self { data: std::ptr::null_mut(), data_len: 0, error: true } - } -} - -/// 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. -#[inline(always)] -pub(crate) unsafe fn read_receipts_inner( - block_hash: *const u8, - block_hash_len: usize, - db_instance: *const c_void, -) -> Result { - // Convert the raw pointer and length back to a Rust slice - let block_hash: [u8; 32] = { - if block_hash.is_null() { - anyhow::bail!("block_hash pointer is null"); - } - std::slice::from_raw_parts(block_hash, block_hash_len) - } - .try_into()?; - - // Create a read-only BlockChainProvider - 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"))?; - let receipts = provider - .receipts_by_block(BlockHashOrNumber::Hash(block_hash.into()))? - .ok_or(anyhow!("Failed to fetch block receipts"))?; - - let block_number = block.number; - let base_fee = block.base_fee_per_gas; - let block_hash = block.hash_slow(); - let receipts = block - .body - .into_iter() - .zip(receipts.clone()) - .enumerate() - .map(|(idx, (tx, receipt))| { - let meta = TransactionMeta { - tx_hash: tx.hash, - index: idx as u64, - block_hash, - block_number, - base_fee, - excess_blob_gas: None, - }; - build_transaction_receipt_with_block_receipts(tx, meta, receipt, &receipts) - }) - .collect::>>() - .ok_or(anyhow!("Failed to build receipts"))?; - - // Convert the receipts to JSON for transport - let mut receipts_json = serde_json::to_string(&receipts)?; - - // Create a ReceiptsResult with a pointer to the json-ified receipts - let res = ReceiptsResult::success(receipts_json.as_mut_ptr() as *mut char, receipts_json.len()); - - // Forget the `receipts_json` string so that its memory isn't freed by the - // borrow checker at the end of this scope - std::mem::forget(receipts_json); // Prevent Rust from freeing the memory - - Ok(res) -} - -/// Builds a hydrated [TransactionReceipt] from information in the passed transaction, -/// receipt, and block receipts. -/// -/// Returns [None] if the transaction's sender could not be recovered from the signature. -#[inline(always)] -fn build_transaction_receipt_with_block_receipts( - tx: TransactionSigned, - meta: TransactionMeta, - receipt: Receipt, - all_receipts: &[Receipt], -) -> Option { - let transaction = tx.clone().into_ecrecovered()?; - - // get the previous transaction cumulative gas used - let gas_used = if meta.index == 0 { - receipt.cumulative_gas_used - } else { - let prev_tx_idx = (meta.index - 1) as usize; - all_receipts - .get(prev_tx_idx) - .map(|prev_receipt| receipt.cumulative_gas_used - prev_receipt.cumulative_gas_used) - .unwrap_or_default() - }; - - let mut res_receipt = TransactionReceipt { - transaction_hash: Some(meta.tx_hash), - transaction_index: U64::from(meta.index), - block_hash: Some(meta.block_hash), - block_number: Some(U256::from(meta.block_number)), - from: transaction.signer(), - to: None, - cumulative_gas_used: U256::from(receipt.cumulative_gas_used), - gas_used: Some(U256::from(gas_used)), - contract_address: None, - logs: Vec::with_capacity(receipt.logs.len()), - effective_gas_price: U128::from(transaction.effective_gas_price(meta.base_fee)), - transaction_type: tx.transaction.tx_type().into(), - // TODO pre-byzantium receipts have a post-transaction state root - state_root: None, - logs_bloom: receipt.bloom_slow(), - status_code: if receipt.success { Some(U64::from(1)) } else { Some(U64::from(0)) }, - - // EIP-4844 fields - blob_gas_price: None, - blob_gas_used: None, - - // Other: - other: Default::default(), - }; - - match tx.transaction.kind() { - TransactionKind::Create => { - res_receipt.contract_address = - Some(transaction.signer().create(tx.transaction.nonce())); - } - TransactionKind::Call(addr) => { - res_receipt.to = Some(*addr); - } - } - - // get number of logs in the block - let mut num_logs = 0; - for prev_receipt in all_receipts.iter().take(meta.index as usize) { - num_logs += prev_receipt.logs.len(); - } - - for (tx_log_idx, log) in receipt.logs.into_iter().enumerate() { - let rpclog = Log { - address: log.address, - topics: log.topics, - data: log.data, - block_hash: Some(meta.block_hash), - block_number: Some(U256::from(meta.block_number)), - transaction_hash: Some(meta.tx_hash), - transaction_index: Some(U256::from(meta.index)), - log_index: Some(U256::from(num_logs + tx_log_idx)), - removed: false, - }; - res_receipt.logs.push(rpclog); - } - - Some(res_receipt) -} - -#[cfg(test)] -mod test { - use super::*; - use alloy_rlp::Decodable; - use reth_db::{database::Database, mdbx::DatabaseArguments}; - use reth_primitives::{ - address, b256, bloom, hex, Address, Block, Bytes, ReceiptWithBloom, Receipts, - SealedBlockWithSenders, MAINNET, U8, - }; - use reth_provider::{BlockWriter, BundleStateWithReceipts, DatabaseProvider}; - use reth_revm::revm::db::BundleState; - use std::{ - ffi::{c_char, CString}, - fs::File, - path::Path, - }; - - #[inline] - fn dummy_block_with_receipts() -> Result<(Block, Vec)> { - // To generate testdata (block 18,663,292 on Ethereum Mainnet): - // 1. BLOCK RLP: `cast rpc debug_getRawBlock 0x11CC77C | jq -r | xxd -r -p > - // testdata/block.rlp` - // 2. RECEIPTS RLP: `cast rpc debug_getRawReceipts 0x11CC77C | jq -r > - // testdata/receipts.json` - let block_rlp = include_bytes!("../testdata/block.rlp"); - let block = Block::decode(&mut block_rlp.as_ref())?; - - let receipt_rlp: Vec> = serde_json::from_str(include_str!( - "../testdata/receipts.json" - )) - .map(|v: Vec| { - v.into_iter().map(|s| hex::decode(s)).collect::>, _>>() - })??; - let receipts = receipt_rlp - .iter() - .map(|r| ReceiptWithBloom::decode(&mut r.as_slice()).map(|r| r.receipt)) - .collect::, _>>()?; - - Ok((block, receipts)) - } - - #[inline] - fn open_receipts_testdata_db() -> Result<()> { - if File::open("testdata/db").is_ok() { - return Ok(()); - } - - // Open a RW handle to the MDBX database - let db = reth_db::init_db(Path::new("testdata/db"), DatabaseArguments::default()) - .map_err(|e| anyhow!(e))?; - let pr = DatabaseProvider::new_rw(db.tx_mut()?, MAINNET.clone()); - - // Grab the dummy block and receipts - let (mut block, receipts) = dummy_block_with_receipts()?; - - // Patch: The block's current state root expects the rest of the chain history to be in the - // DB; manually override it. Otherwise, the DatabaseProvider will fail to commit the - // block. - block.header.state_root = reth_primitives::constants::EMPTY_ROOT_HASH; - - // Fetch the block number and tx senders for bundle state creation. - let block_number = block.header.number; - let senders = block - .body - .iter() - .map(|tx| tx.recover_signer()) - .collect::>>() - .ok_or(anyhow!("Failed to recover signers"))?; - - // Commit the bundle state to the database - pr.append_blocks_with_state( - vec![SealedBlockWithSenders { block: block.seal_slow(), senders }], - BundleStateWithReceipts::new( - BundleState::default(), - Receipts::from_block_receipt(receipts), - block_number, - ), - Default::default(), - Default::default(), - None, - )?; - pr.commit()?; - - Ok(()) - } - - #[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, res.data).unwrap(); - - let receipts_data = - std::slice::from_raw_parts(receipts_res.data as *const u8, receipts_res.data_len); - let receipt = { - let mut receipts: Vec = - serde_json::from_slice(receipts_data).unwrap(); - receipts.remove(0) - }; - - // Check the first receipt in the block for validity - assert_eq!(receipt.transaction_type, U8::from(2)); - assert_eq!(receipt.status_code, Some(U64::from(1))); - assert_eq!(receipt.cumulative_gas_used, U256::from(115_316)); - assert_eq!(receipt.logs_bloom, bloom!("00200000000000000000000080001000000000000000000000000000000000000000000000000000000000000000100002000100080000000000000000000000000000000000000000000008000000200000000400000000000000000000000000000000000000000000000000000000000000000000000000000010000000000000000400000000000001000000000000000100000000080000004000000000000000000000000000000000000002000000000000000000000000000000000000000006000000000000000000000000000000000000001000000000000000000000200000000000000100000000020000000000000000000000000000000010")); - assert_eq!( - receipt.logs[0].address, - address!("c02aaa39b223fe8d0a0e5c4f27ead9083c756cc2") - ); - assert_eq!( - receipt.logs[0].topics[0], - b256!("ddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef") - ); - assert_eq!( - receipt.logs[0].topics[1], - b256!("00000000000000000000000000000000003b3cc22af3ae1eac0440bcee416b40") - ); - assert_eq!( - receipt.logs[0].data, - Bytes::from_static( - hex!("00000000000000000000000000000000000000000000000008a30cd230000000") - .as_slice() - ) - ); - assert_eq!(receipt.from, address!("41d3ab85aafed2ef9e644cb7d3bbca2fc4d8cac8")); - assert_eq!(receipt.to, Some(address!("00000000003b3cc22af3ae1eac0440bcee416b40"))); - assert_eq!( - receipt.transaction_hash, - Some(b256!("88b2d153a4e893ba91ac235325c44b1aa0c802fcb42657701e1a73e1c675f7ca")) - ); - - assert_eq!(receipt.block_number, Some(U256::from(18_663_292))); - assert_eq!(receipt.block_hash, Some(block_hash)); - assert_eq!(receipt.transaction_index, U64::from(0)); - - crate::rdb_free_string(receipts_res.data as *mut c_char); - } - } -} diff --git a/op-service/rethdb-reader/testdata/block.rlp b/op-service/rethdb-reader/testdata/block.rlp deleted file mode 100644 index 978ba6be01b4..000000000000 Binary files a/op-service/rethdb-reader/testdata/block.rlp and /dev/null differ diff --git a/op-service/rethdb-reader/testdata/receipts.json b/op-service/rethdb-reader/testdata/receipts.json deleted file mode 100644 index aef76b0c2eb8..000000000000 --- a/op-service/rethdb-reader/testdata/receipts.json +++ /dev/null @@ -1,12 +0,0 @@ -[ - "0xb903c202f903be018301c274b9010000200000000000000000000080001000000000000000000000000000000000000000000000000000000000000000100002000100080000000000000000000000000000000000000000000008000000200000000400000000000000000000000000000000000000000000000000000000000000000000000000000010000000000000000400000000000001000000000000000100000000080000004000000000000000000000000000000000000002000000000000000000000000000000000000000006000000000000000000000000000000000000001000000000000000000000200000000000000100000000020000000000000000000000000000000010f902b3f89b94c02aaa39b223fe8d0a0e5c4f27ead9083c756cc2f863a0ddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3efa000000000000000000000000000000000003b3cc22af3ae1eac0440bcee416b40a00000000000000000000000005c1694c8168668c11777909c79142dc9d992788fa000000000000000000000000000000000000000000000000008a30cd230000000f89b94d10bc8517059e51b625e1e57a60b348d552f685df863a0ddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3efa00000000000000000000000005c1694c8168668c11777909c79142dc9d992788fa000000000000000000000000000000000003b3cc22af3ae1eac0440bcee416b40a000000000000000000000000000000000000000000000000000007921e915b684f879945c1694c8168668c11777909c79142dc9d992788fe1a01c411e9a96e071241c2f21f7726b17ae89e3cab4c78be50e062b03a9fffbbad1b840000000000000000000000000000000000000000000000001129c9861392306df000000000000000000000000000000000000000000000000000e9d834abd9cdff8fc945c1694c8168668c11777909c79142dc9d992788ff863a0d78ad95fa46c994b6551d0da85fc275fe613ce37657fb8d5e3d130840159d822a000000000000000000000000000000000003b3cc22af3ae1eac0440bcee416b40a000000000000000000000000000000000003b3cc22af3ae1eac0440bcee416b40b88000000000000000000000000000000000000000000000000008a30cd2300000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000007921e915b684", - "0xb9043e02f9043a0183042135b9010000200000000000000000000080001000100000000000000000000000000000000000000000000000000000000000100002000000080000000000000000010000000000000000010000000008000000200000000400100000000000008000000000000000000000000000000000000000000000000000000000000010000000000000000400000000000001000000000000000101000000080000004000000000000000000000000000000000000002000000000000000000000000000000000000000002000000000000000000000000000000000000001000000000000000000000200000000000008000000000020000000000000000400000000000000010f9032ff87a94c02aaa39b223fe8d0a0e5c4f27ead9083c756cc2f842a0e1fffcc4923d04b559f4d29a8bfc6cda04eb5b0d3c460751c2402c5c5cc9109ca00000000000000000000000002ec705d306b51e486b1bc0d6ebee708e0661add1a00000000000000000000000000000000000000000000000000bd0c7ca01c48000f89b94c02aaa39b223fe8d0a0e5c4f27ead9083c756cc2f863a0ddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3efa00000000000000000000000002ec705d306b51e486b1bc0d6ebee708e0661add1a00000000000000000000000005c1694c8168668c11777909c79142dc9d992788fa00000000000000000000000000000000000000000000000000bd0c7ca01c48000f89b94d10bc8517059e51b625e1e57a60b348d552f685df863a0ddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3efa00000000000000000000000005c1694c8168668c11777909c79142dc9d992788fa00000000000000000000000001f3c8f19ab956457994de1d50eb0ae7d057f77f8a0000000000000000000000000000000000000000000000000000099e622c10336f879945c1694c8168668c11777909c79142dc9d992788fe1a01c411e9a96e071241c2f21f7726b17ae89e3cab4c78be50e062b03a9fffbbad1b8400000000000000000000000000000000000000000000000011e6d602b3ae786df000000000000000000000000000000000000000000000000000e039d27fc99a9f8fc945c1694c8168668c11777909c79142dc9d992788ff863a0d78ad95fa46c994b6551d0da85fc275fe613ce37657fb8d5e3d130840159d822a00000000000000000000000002ec705d306b51e486b1bc0d6ebee708e0661add1a00000000000000000000000001f3c8f19ab956457994de1d50eb0ae7d057f77f8b8800000000000000000000000000000000000000000000000000bd0c7ca01c4800000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000099e622c10336", - "0xb903c202f903be018305b26fb9010000200000000000000000000080001000000000000000000000000000000000000000000000000000000000000000100002000100080000000000000000000000000000000000000000000008000000200000000400000000000000000000000000000000000000000000000000000000000000000000000000000010000000000000000400000000000001000000000000000100000000080000004000000000000000000000000000000000000002000000000000000000000000000000000000000006000000000000000000000000000000000000001000000000000000000000200000000000000100000000020000000000000000000000000000000010f902b3f89b94d10bc8517059e51b625e1e57a60b348d552f685df863a0ddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3efa000000000000000000000000000000000003b3cc22af3ae1eac0440bcee416b40a00000000000000000000000005c1694c8168668c11777909c79142dc9d992788fa000000000000000000000000000000000000000000000000000007921e99216a0f89b94c02aaa39b223fe8d0a0e5c4f27ead9083c756cc2f863a0ddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3efa00000000000000000000000005c1694c8168668c11777909c79142dc9d992788fa000000000000000000000000000000000003b3cc22af3ae1eac0440bcee416b40a00000000000000000000000000000000000000000000000000953f38350000000f879945c1694c8168668c11777909c79142dc9d992788fe1a01c411e9a96e071241c2f21f7726b17ae89e3cab4c78be50e062b03a9fffbbad1b84000000000000000000000000000000000000000000000000115196ca7eae786df000000000000000000000000000000000000000000000000000e7cbf118eb049f8fc945c1694c8168668c11777909c79142dc9d992788ff863a0d78ad95fa46c994b6551d0da85fc275fe613ce37657fb8d5e3d130840159d822a000000000000000000000000000000000003b3cc22af3ae1eac0440bcee416b40a000000000000000000000000000000000003b3cc22af3ae1eac0440bcee416b40b880000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000007921e99216a00000000000000000000000000000000000000000000000000953f383500000000000000000000000000000000000000000000000000000000000000000000000", - "0xb90bdf02f90bdb01830b2215b9010000200000002000000000000080000000000000000000000001010000000004000000000000000000420000000000010002000000080020002000000000200800000000000000080800000008000000200090000000000000080000408040000000000000000000000008084000000000000000000000000010010050000800000800800000000000000000000000000000000000000000080000004000100000020100000000000000100080000004000000000000020000000000000000000000400002000000000000000000000000000000000000001000000000002000400012200000800000020404000000000000020000008000000000000000000010f90ad0f89b941111111254eeb25477b68fb85ed929f73a960582f842a0b9ed0243fdf00f0545c63a0af8850c090d86bb46682baec4bf3c496814fe4f02a000000000000000000000000058c1c6a484ef2d6b0f8d93b2dbeb72f3c3e9ceb5b8402511106c0eade4c289445ac7275a89e6e088cc2cb5e313a42712b2987c2fb8d30000000000000000000000000000000000000000000000000000000000000001f89b94dac17f958d2ee523a2206206994597c13d831ec7f863a0ddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3efa000000000000000000000000058c1c6a484ef2d6b0f8d93b2dbeb72f3c3e9ceb5a0000000000000000000000000d1742b3c4fbb096990c8950fa635aec75b30781aa000000000000000000000000000000000000000000000000000000002f0174a58f89b94fe67a4450907459c3e1fff623aa927dd4e28c67af863a0ddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3efa0000000000000000000000000a050f7adc241afa59ad5f343eaf4faf5f30a4cdba0000000000000000000000000d1742b3c4fbb096990c8950fa635aec75b30781aa000000000000000000000000000000000000000000000143c3719a34f04e020edf89b94dac17f958d2ee523a2206206994597c13d831ec7f863a0ddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3efa0000000000000000000000000d1742b3c4fbb096990c8950fa635aec75b30781aa000000000000000000000000006da0fd433c1a5d7a4faa01111c044910a184553a000000000000000000000000000000000000000000000000000000000da1b3bf5f89b94dac17f958d2ee523a2206206994597c13d831ec7f863a0ddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3efa0000000000000000000000000d1742b3c4fbb096990c8950fa635aec75b30781aa00000000000000000000000000d4a11d5eeaac28ec3f61d100daf4d40471f1852a00000000000000000000000000000000000000000000000000000000215fc0e63f89b94c02aaa39b223fe8d0a0e5c4f27ead9083c756cc2f863a0ddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3efa000000000000000000000000006da0fd433c1a5d7a4faa01111c044910a184553a0000000000000000000000000a050f7adc241afa59ad5f343eaf4faf5f30a4cdba00000000000000000000000000000000000000000000000001913572822ee731ff8799406da0fd433c1a5d7a4faa01111c044910a184553e1a01c411e9a96e071241c2f21f7726b17ae89e3cab4c78be50e062b03a9fffbbad1b8400000000000000000000000000000000000000000000000b3986c20be3ddb96f70000000000000000000000000000000000000000000000000000061647f821daf8fc9406da0fd433c1a5d7a4faa01111c044910a184553f863a0d78ad95fa46c994b6551d0da85fc275fe613ce37657fb8d5e3d130840159d822a0000000000000000000000000d1742b3c4fbb096990c8950fa635aec75b30781aa0000000000000000000000000a050f7adc241afa59ad5f343eaf4faf5f30a4cdbb880000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000da1b3bf50000000000000000000000000000000000000000000000001913572822ee731f0000000000000000000000000000000000000000000000000000000000000000f89b94c02aaa39b223fe8d0a0e5c4f27ead9083c756cc2f863a0ddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3efa00000000000000000000000000d4a11d5eeaac28ec3f61d100daf4d40471f1852a0000000000000000000000000a050f7adc241afa59ad5f343eaf4faf5f30a4cdba00000000000000000000000000000000000000000000000003d5ec06d1b711bcff879940d4a11d5eeaac28ec3f61d100daf4d40471f1852e1a01c411e9a96e071241c2f21f7726b17ae89e3cab4c78be50e062b03a9fffbbad1b8400000000000000000000000000000000000000000000004724d25b9c0c67a0c7800000000000000000000000000000000000000000000000000002694ca870b04f8fc940d4a11d5eeaac28ec3f61d100daf4d40471f1852f863a0d78ad95fa46c994b6551d0da85fc275fe613ce37657fb8d5e3d130840159d822a0000000000000000000000000d1742b3c4fbb096990c8950fa635aec75b30781aa0000000000000000000000000a050f7adc241afa59ad5f343eaf4faf5f30a4cdbb88000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000215fc0e630000000000000000000000000000000000000000000000003d5ec06d1b711bcf0000000000000000000000000000000000000000000000000000000000000000f9011c94a050f7adc241afa59ad5f343eaf4faf5f30a4cdbf863a0c42079f94a6350d7e6235f29174924f928cc2ac818eb64fed8004e115fbcca67a0000000000000000000000000d1742b3c4fbb096990c8950fa635aec75b30781aa0000000000000000000000000d1742b3c4fbb096990c8950fa635aec75b30781ab8a0000000000000000000000000000000000000000000000000567217953e5f8eeeffffffffffffffffffffffffffffffffffffffffffffebc3c8e65cb0fb1fdf13000000000000000000000000000000000000007b89284efd1b25e6f5f0dcbf2e000000000000000000000000000000000000000000000aa86d459fd0c59c2a59000000000000000000000000000000000000000000000000000000000001784ff89b94fe67a4450907459c3e1fff623aa927dd4e28c67af863a0ddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3efa0000000000000000000000000d1742b3c4fbb096990c8950fa635aec75b30781aa0000000000000000000000000a88800cd213da5ae406ce248380802bd53b47647a0000000000000000000000000000000000000000000001375a0d26e739f71f370f89b94fe67a4450907459c3e1fff623aa927dd4e28c67af863a08c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b925a0000000000000000000000000a88800cd213da5ae406ce248380802bd53b47647a00000000000000000000000001111111254eeb25477b68fb85ed929f73a960582a0000000000000000000000000000000000000000000001375a0d26e739f71f370f89b94fe67a4450907459c3e1fff623aa927dd4e28c67af863a08c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b925a0000000000000000000000000a88800cd213da5ae406ce248380802bd53b47647a00000000000000000000000001111111254eeb25477b68fb85ed929f73a960582a00000000000000000000000000000000000000000000000000000000000000000f89b94fe67a4450907459c3e1fff623aa927dd4e28c67af863a0ddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3efa0000000000000000000000000a88800cd213da5ae406ce248380802bd53b47647a000000000000000000000000058c1c6a484ef2d6b0f8d93b2dbeb72f3c3e9ceb5a0000000000000000000000000000000000000000000001375a0d26e739f71f370", - "0xb905cf02f905cb01830e0902b9010000200000008020000000000280004000000000000000000000000000000000000000200000000000000000200080000002000000080000000000000800000000000000000000000100000008040000200004000000000000000000008000004000000000000000000000000000000400240000000000000004000010000000000000000000000000000001010000000200000001000000080000004000000400002000000000004002020000000000000000000000000000002000000000000000000002000000000000000000000040000000000000001000000000000000000000200000000000000000000000000000000001000400400000000080010000f904c0f87a94c02aaa39b223fe8d0a0e5c4f27ead9083c756cc2f842a0e1fffcc4923d04b559f4d29a8bfc6cda04eb5b0d3c460751c2402c5c5cc9109ca0000000000000000000000000db5889e35e379ef0498aae126fc2cce1fbd23216a000000000000000000000000000000000000000000000000001617eb90b26c000f89b94c02aaa39b223fe8d0a0e5c4f27ead9083c756cc2f863a0ddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3efa0000000000000000000000000db5889e35e379ef0498aae126fc2cce1fbd23216a0000000000000000000000000e090e0518ea17607a01e9286522655808c3f8919a000000000000000000000000000000000000000000000000001617eb90b26c000f89b94f83e0399fd7ef1c9c1a3dbc0a4d586edc3c8d125f863a0ddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3efa0000000000000000000000000e090e0518ea17607a01e9286522655808c3f8919a0000000000000000000000000faa04b4d06297dca749c2ac7783211638de3e491a000000000000000000000000000000000000000000000019d0da576764721e7e7f87994e090e0518ea17607a01e9286522655808c3f8919e1a01c411e9a96e071241c2f21f7726b17ae89e3cab4c78be50e062b03a9fffbbad1b8400000000000000000000000000000000000000000000000001e6d6c84d2f7cd2b00000000000000000000000000000000000000000000220ae8d75c1df124f53df8fc94e090e0518ea17607a01e9286522655808c3f8919f863a0d78ad95fa46c994b6551d0da85fc275fe613ce37657fb8d5e3d130840159d822a0000000000000000000000000c6265979793435b496e28e61af1500c22c3ba277a0000000000000000000000000faa04b4d06297dca749c2ac7783211638de3e491b88000000000000000000000000000000000000000000000000001617eb90b26c0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000019d0da576764721e7e7f87994db5889e35e379ef0498aae126fc2cce1fbd23216e1a06cb8c9cbcedb37b7d125170f5d929dbbdb3203c8fd4d60356b496fa31f77fd00b8400000000000000000000000000000000000000000000000000001c4793ec69800000000000000000000000000000000000000000000000000000000000000008ef87994db5889e35e379ef0498aae126fc2cce1fbd23216e1a00c2a2f565c7774c59e49ef6b3c255329f4d254147e06e724d3a8569bb7bd21adb8400000000000000000000000000000000000000000000000000001c4793ec69800000000000000000000000000faa04b4d06297dca749c2ac7783211638de3e491f89994db5889e35e379ef0498aae126fc2cce1fbd23216e1a09f849d23f4955d98202378ea318f2b0c7533695d3c9fb2a3931f0f919fa8c420b86000000000000000000000000000000000000000000000000001617eb90b26c00000000000000000000000000000000000000000000000019d0da576764721e7e700000000000000000000000000000000000000000000019d0da576764721e7e7", - "0xf905cb0183105d5cb90100000000000180a0000004000000004000000000000001000000000000002200000000000000000000080200200000000002000000080020000000000800000000000000000000000900000008040000000000000000400000000000000000004000000000000000000000000000000400240000000000040000000010000804000000000000000000000080010000000000000000000000008000000000000480000000000000004002000000000000000000000000000000000000000000008000000002080000000000000000000000000000000000000000000002000000000000200000000000000000000000000000000000000000000000000000010000f904c0f89b94c02aaa39b223fe8d0a0e5c4f27ead9083c756cc2f863a0ddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3efa00000000000000000000000009e31efffe1e016f514f774f43d91a85ebbc11564a0000000000000000000000000db5889e35e379ef0498aae126fc2cce1fbd23216a00000000000000000000000000000000000000000000000000e803e90becaf29bf89b949dd5f5dae94633760b3125a7490ecb4571d09a42f863a0ddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3efa000000000000000000000000087033ad96757ecd730aa1652b1a7dabcc5ffb182a00000000000000000000000009e31efffe1e016f514f774f43d91a85ebbc11564a0000000000000000000000000000000000000000000acb37f48fe24c23d1833c6f9011c949e31efffe1e016f514f774f43d91a85ebbc11564f863a0c42079f94a6350d7e6235f29174924f928cc2ac818eb64fed8004e115fbcca67a0000000000000000000000000db5889e35e379ef0498aae126fc2cce1fbd23216a0000000000000000000000000db5889e35e379ef0498aae126fc2cce1fbd23216b8a0000000000000000000000000000000000000000000acb37f48fe24c23d1833c6fffffffffffffffffffffffffffffffffffffffffffffffff17fc16f41350d65000000000000000000000000000000000000000000049c65546ad3eed1521a58000000000000000000000000000000000000000000009404a8bb774136003dadfffffffffffffffffffffffffffffffffffffffffffffffffffffffffffd14eff87a94c02aaa39b223fe8d0a0e5c4f27ead9083c756cc2f842a07fcf532c15f0a6db0bd6d0e038bea71d30d808c7d98cb3bf7268a95bf5081b65a0000000000000000000000000db5889e35e379ef0498aae126fc2cce1fbd23216a00000000000000000000000000000000000000000000000000e803e90becaf29bf87994db5889e35e379ef0498aae126fc2cce1fbd23216e1a06cb8c9cbcedb37b7d125170f5d929dbbdb3203c8fd4d60356b496fa31f77fd00b84000000000000000000000000000000000000000000000000000128fac3e64dad00000000000000000000000000000000000000000000000000000000000000012f87994db5889e35e379ef0498aae126fc2cce1fbd23216e1a00c2a2f565c7774c59e49ef6b3c255329f4d254147e06e724d3a8569bb7bd21adb84000000000000000000000000000000000000000000000000000128fac3e64dad000000000000000000000000087033ad96757ecd730aa1652b1a7dabcc5ffb182f89994db5889e35e379ef0498aae126fc2cce1fbd23216e1a09f849d23f4955d98202378ea318f2b0c7533695d3c9fb2a3931f0f919fa8c420b860000000000000000000000000000000000000000000acb37f48fe24c23d1833c60000000000000000000000000000000000000000000000000e803e90becaf29b0000000000000000000000000000000000000000000000000e803e90becaf29bf85894db5889e35e379ef0498aae126fc2cce1fbd23216e1a0522881958b3c4a6fc0840ad3b7fb947b881edc28c004245a62541647422ade97a00000000000000000000000000000000000000000000000000e803e90becaf29b", - "0xb903e402f903e00183128fdcb9010000000000010000000000000000000000000000000000010000000000040000000000000000000000000008000000000002000000080020000000000000000000000000000000000808000008000000000000000000410000000000000000000000000000000000000000040000000000000000000000040000000010000800000000000000000000200000000000000000000000010000000000000000000000000000000000200000000000010000000000000000000000002000000008000000000002000000000000080000000000000000000000000000000002000000000000200000000000000010000000000000000000000000000000000000000000f902d5f89b94c02aaa39b223fe8d0a0e5c4f27ead9083c756cc2f863a0ddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3efa000000000000000000000000088e6a0c2ddd26feeb64f039a2c41296fcb3f5640a00000000000000000000000008e30dead12d19228cf9cdc984f237f0ad00df195a000000000000000000000000000000000000000000000000000b5762b8f483dbff89b94a0b86991c6218b36c1d19d4a2e9eb0ce3606eb48f863a0ddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3efa0000000000000000000000000f706190050f8c7d62021d5ba52871640ea9fd3fea000000000000000000000000088e6a0c2ddd26feeb64f039a2c41296fcb3f5640a0000000000000000000000000000000000000000000000000000000000629852ff9011c9488e6a0c2ddd26feeb64f039a2c41296fcb3f5640f863a0c42079f94a6350d7e6235f29174924f928cc2ac818eb64fed8004e115fbcca67a00000000000000000000000008e30dead12d19228cf9cdc984f237f0ad00df195a00000000000000000000000008e30dead12d19228cf9cdc984f237f0ad00df195b8a0000000000000000000000000000000000000000000000000000000000629852fffffffffffffffffffffffffffffffffffffffffffffffffff4a89d470b7c24100000000000000000000000000000000000056d8c2fe7c57e75b18c386394ff90000000000000000000000000000000000000000000000016397a5e7cf05707c0000000000000000000000000000000000000000000000000000000000030e04f87a94c02aaa39b223fe8d0a0e5c4f27ead9083c756cc2f842a07fcf532c15f0a6db0bd6d0e038bea71d30d808c7d98cb3bf7268a95bf5081b65a00000000000000000000000008e30dead12d19228cf9cdc984f237f0ad00df195a000000000000000000000000000000000000000000000000000b5762b8f483dbf", - "0xb901ab02f901a701831345f7b9010000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000800000000000000000200000000000000000000000004000000000008000000000000800000000000000000000000000000000000000000000000000000000000000000000000000000000000040000000000000000000000000000000000000000000000000000000000000020000000000000000000000000000000000000000080000000000000008000000000000000000000000000000000000000000000000100000000000000000000010000000000000000000000001000000000000000000000000000000000000f89df89b9496add417293a49e80f024734e96cfd8b355bcc14f863a08c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b925a0000000000000000000000000af56ec1d3a54e9d05fbe2bc158219a810890dc77a0000000000000000000000000000000000022d473030f116ddee9f6b43ac78ba3a0ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff", - "0xb9053d02f90539018315a059b9010000210000000000100000100080000000000000000000000080000000000000000000000000000000000000000000000002010000080000000000000000080000000020080000800000000008000000208000000000400000000000000020000000000000000000000000000000000000000000000000040000000010000000000040004000000000000000000000000000000000000000080000004000000000000000000000000000000000000000000400000000080000000000000008000000000002000000000000000000000000000400400000101000000002000202000000200000000000000000000001000000001000000000000000000000000400f9042ef8fd94000000000022d473030f116ddee9f6b43ac78ba3f884a0c6a377bfc4eb120024a8ac08eef205be16b817020812c73223e81d1bdb9708eca0000000000000000000000000af56ec1d3a54e9d05fbe2bc158219a810890dc77a000000000000000000000000096add417293a49e80f024734e96cfd8b355bcc14a00000000000000000000000003fc91a3afd70395cd496c647d5a6cc9d4b2b7fadb860000000000000000000000000ffffffffffffffffffffffffffffffffffffffff00000000000000000000000000000000000000000000000000000000658c27210000000000000000000000000000000000000000000000000000000000000000f89b9496add417293a49e80f024734e96cfd8b355bcc14f863a0ddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3efa0000000000000000000000000af56ec1d3a54e9d05fbe2bc158219a810890dc77a00000000000000000000000000bee64a7c035fa2f69b9a6cad5d761de038ecb02a000000000000000000000000000000000000000000000000c83b84b800fe98c96f89b94c02aaa39b223fe8d0a0e5c4f27ead9083c756cc2f863a0ddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3efa00000000000000000000000000bee64a7c035fa2f69b9a6cad5d761de038ecb02a00000000000000000000000003fc91a3afd70395cd496c647d5a6cc9d4b2b7fada000000000000000000000000000000000000000000000000001e7841cb75e9302f879940bee64a7c035fa2f69b9a6cad5d761de038ecb02e1a01c411e9a96e071241c2f21f7726b17ae89e3cab4c78be50e062b03a9fffbbad1b840000000000000000000000000000000000000000000004581511bfd43276c16b400000000000000000000000000000000000000000000000a99e131364ae486cff8fc940bee64a7c035fa2f69b9a6cad5d761de038ecb02f863a0d78ad95fa46c994b6551d0da85fc275fe613ce37657fb8d5e3d130840159d822a00000000000000000000000003fc91a3afd70395cd496c647d5a6cc9d4b2b7fada00000000000000000000000003fc91a3afd70395cd496c647d5a6cc9d4b2b7fadb88000000000000000000000000000000000000000000000000c83b84b800fe98c960000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000001e7841cb75e9302f87a94c02aaa39b223fe8d0a0e5c4f27ead9083c756cc2f842a07fcf532c15f0a6db0bd6d0e038bea71d30d808c7d98cb3bf7268a95bf5081b65a00000000000000000000000003fc91a3afd70395cd496c647d5a6cc9d4b2b7fada000000000000000000000000000000000000000000000000001e7841cb75e9302", - "0xb9010d02f90109018315f261b9010000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000c0" -] diff --git a/op-service/rpc/cli.go b/op-service/rpc/cli.go index 866dfd0336d7..ef957765e19f 100644 --- a/op-service/rpc/cli.go +++ b/op-service/rpc/cli.go @@ -14,12 +14,14 @@ const ( EnableAdminFlagName = "rpc.enable-admin" ) +var ErrInvalidPort = errors.New("invalid RPC port") + func CLIFlags(envPrefix string) []cli.Flag { return []cli.Flag{ &cli.StringFlag{ Name: ListenAddrFlagName, Usage: "rpc listening address", - Value: "0.0.0.0", // TODO(CLI-4159): Switch to 127.0.0.1 + Value: "0.0.0.0", // TODO: Switch to 127.0.0.1 EnvVars: opservice.PrefixEnvVar(envPrefix, "RPC_ADDR"), }, &cli.IntFlag{ @@ -52,7 +54,7 @@ func DefaultCLIConfig() CLIConfig { func (c CLIConfig) Check() error { if c.ListenPort < 0 || c.ListenPort > math.MaxUint16 { - return errors.New("invalid RPC port") + return ErrInvalidPort } return nil diff --git a/op-service/rpc/service.go b/op-service/rpc/service.go new file mode 100644 index 000000000000..8429d50d6116 --- /dev/null +++ b/op-service/rpc/service.go @@ -0,0 +1,45 @@ +package rpc + +import ( + "context" + "sync/atomic" + + "github.com/ethereum/go-ethereum/log" + + "github.com/ethereum-optimism/optimism/op-service/cliapp" +) + +var _ cliapp.Lifecycle = &Service{} + +type Service struct { + log log.Logger + srv *Server + stopped atomic.Bool +} + +func NewService(log log.Logger, srv *Server) *Service { + return &Service{log: log, srv: srv, stopped: atomic.Bool{}} +} + +func (s *Service) Start(_ context.Context) error { + s.log.Info("starting rpc server") + return s.srv.Start() +} + +func (s *Service) Stop(_ context.Context) error { + if s.stopped.Load() { + return nil + } + + s.log.Info("stopping rpc server") + err := s.srv.Stop() + if err == nil { + s.stopped.Store(true) + } + + return err +} + +func (s *Service) Stopped() bool { + return s.stopped.Load() +} diff --git a/op-service/safego/nocopy.go b/op-service/safego/nocopy.go new file mode 100644 index 000000000000..1b7e6e89f9cc --- /dev/null +++ b/op-service/safego/nocopy.go @@ -0,0 +1,29 @@ +package safego + +// NoCopy is a super simple safety util taken from the Go atomic lib. +// +// NoCopy may be added to structs which must not be copied +// after the first use. +// +// The NoCopy struct is empty, so should be a zero-cost util at runtime. +// +// See https://golang.org/issues/8005#issuecomment-190753527 +// for details. +// +// Note that it must not be embedded, due to the Lock and Unlock methods. +// +// Like: +// ``` +// +// type Example { +// V uint64 +// _ NoCopy +// } +// +// Then run: `go vet -copylocks .` +// ``` +type NoCopy struct{} + +// Lock is a no-op used by -copylocks checker from `go vet`. +func (*NoCopy) Lock() {} +func (*NoCopy) Unlock() {} diff --git a/op-service/solabi/util.go b/op-service/solabi/util.go index ce26aaf76c58..41c01106a323 100644 --- a/op-service/solabi/util.go +++ b/op-service/solabi/util.go @@ -69,7 +69,7 @@ func ReadUint64(r io.Reader) (uint64, error) { return n, fmt.Errorf("number padding was not empty: %x", readPadding[:]) } if err := binary.Read(r, binary.BigEndian, &n); err != nil { - return 0, fmt.Errorf("expected number length to be 8 bytes") + return 0, errors.New("expected number length to be 8 bytes") } return n, nil } diff --git a/op-service/sources/batching/batching.go b/op-service/sources/batching/batching.go index 0cf88f702704..50fd76da9452 100644 --- a/op-service/sources/batching/batching.go +++ b/op-service/sources/batching/batching.go @@ -2,6 +2,7 @@ package batching import ( "context" + "errors" "fmt" "io" "sync" @@ -176,7 +177,7 @@ func (ibc *IterativeBatchCall[K, V]) Result() ([]V, error) { ibc.resetLock.RLock() if atomic.LoadUint32(&ibc.completed) < uint32(len(ibc.requestsKeys)) { ibc.resetLock.RUnlock() - return nil, fmt.Errorf("results not available yet, Fetch more first") + return nil, errors.New("results not available yet, Fetch more first") } ibc.resetLock.RUnlock() return ibc.requestsValues, nil diff --git a/op-service/sources/batching/bound.go b/op-service/sources/batching/bound.go index 33e19c3dfbfa..75a2a3f12a03 100644 --- a/op-service/sources/batching/bound.go +++ b/op-service/sources/batching/bound.go @@ -43,11 +43,11 @@ func (b *BoundContract) DecodeCall(data []byte) (string, *CallResult, error) { method, err := b.abi.MethodById(data[:4]) if err != nil { // ABI doesn't return a nicely typed error so treat any failure to find the method as unknown - return "", nil, fmt.Errorf("%w: %v", ErrUnknownMethod, err.Error()) + return "", nil, fmt.Errorf("%w: %w", ErrUnknownMethod, err) } args, err := method.Inputs.Unpack(data[4:]) if err != nil { - return "", nil, fmt.Errorf("%w: %v", ErrInvalidCall, err.Error()) + return "", nil, fmt.Errorf("%w: %w", ErrInvalidCall, err) } return method.Name, &CallResult{args}, nil } @@ -58,7 +58,7 @@ func (b *BoundContract) DecodeEvent(log *types.Log) (string, *CallResult, error) } event, err := b.abi.EventByID(log.Topics[0]) if err != nil { - return "", nil, fmt.Errorf("%w: %v", ErrUnknownEvent, err.Error()) + return "", nil, fmt.Errorf("%w: %w", ErrUnknownEvent, err) } argsMap := make(map[string]interface{}) @@ -69,13 +69,13 @@ func (b *BoundContract) DecodeEvent(log *types.Log) (string, *CallResult, error) } } if err := abi.ParseTopicsIntoMap(argsMap, indexed, log.Topics[1:]); err != nil { - return "", nil, fmt.Errorf("%w indexed topics: %v", ErrInvalidEvent, err.Error()) + return "", nil, fmt.Errorf("%w indexed topics: %w", ErrInvalidEvent, err) } 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()) + return "", nil, fmt.Errorf("%w non-indexed topics: %w", ErrInvalidEvent, err) } } args := make([]interface{}, 0, len(event.Inputs)) diff --git a/op-service/sources/batching/test/abi_stub.go b/op-service/sources/batching/test/abi_stub.go index 3c834896a800..431c77c8dbd4 100644 --- a/op-service/sources/batching/test/abi_stub.go +++ b/op-service/sources/batching/test/abi_stub.go @@ -35,7 +35,7 @@ func (c *expectedCall) Matches(rpcMethod string, args ...interface{}) error { } callOpts, ok := args[0].(map[string]any) if !ok { - return fmt.Errorf("arg 0 is not a map[string]any") + return errors.New("arg 0 is not a map[string]any") } actualBlockRef := args[1] to, ok := callOpts["to"].(*common.Address) @@ -56,7 +56,7 @@ func (c *expectedCall) Matches(rpcMethod string, args ...interface{}) error { return fmt.Errorf("expected input to have at least 4 bytes but was %v", len(data)) } if !slices.Equal(c.abiMethod.ID, data[:4]) { - return fmt.Errorf("expected abi method ID %x but was %x", c.abiMethod.ID, data[:4]) + return fmt.Errorf("expected abi method ID %x but was %v", c.abiMethod.ID, data[:4]) } if !slices.Equal(c.packedArgs, data[4:]) { return fmt.Errorf("expected args %x but was %x", c.packedArgs, data[4:]) diff --git a/op-service/sources/batching/test/generic_stub.go b/op-service/sources/batching/test/generic_stub.go index c269eb100d6b..6b98fbe0c432 100644 --- a/op-service/sources/batching/test/generic_stub.go +++ b/op-service/sources/batching/test/generic_stub.go @@ -59,7 +59,7 @@ func (r *RpcStub) findExpectedCall(rpcMethod string, args ...interface{}) Expect if err := call.Matches(rpcMethod, args...); err == nil { return call } else { - matchResults += fmt.Sprintf("%v: %v", call, err) + matchResults += fmt.Sprintf("%v: %v\n", call, err) } } require.Failf(r.t, "No matching expected calls.", matchResults) diff --git a/op-service/sources/engine_client.go b/op-service/sources/engine_client.go index 6ac9793a9824..f28b1094f08a 100644 --- a/op-service/sources/engine_client.go +++ b/op-service/sources/engine_client.go @@ -100,7 +100,7 @@ func (s *EngineAPIClient) ForkchoiceUpdate(ctx context.Context, fc *eth.Forkchoi if rpcErr, ok := err.(rpc.Error); ok { code := eth.ErrorCode(rpcErr.ErrorCode()) switch code { - case eth.InvalidForkchoiceState, eth.InvalidPayloadAttributes: + case eth.InvalidParams, eth.InvalidForkchoiceState, eth.InvalidPayloadAttributes: return nil, eth.InputError{ Inner: err, Code: code, diff --git a/op-service/sources/eth_client.go b/op-service/sources/eth_client.go index faf10e7803a2..149a0c08abab 100644 --- a/op-service/sources/eth_client.go +++ b/op-service/sources/eth_client.go @@ -11,6 +11,7 @@ package sources import ( "context" + "errors" "fmt" "math/big" "time" @@ -62,11 +63,6 @@ type EthClientConfig struct { // till we re-attempt the user-preferred methods. // If this is 0 then the client does not fall back to less optimal but available methods. MethodResetDuration time.Duration - - // [OPTIONAL] The reth DB path to fetch receipts from. - // If it is specified, the rethdb receipts fetcher will be used - // and the RPC configuration parameters don't need to be set. - RethDBPath string } func (c *EthClientConfig) Check() error { @@ -82,15 +78,6 @@ func (c *EthClientConfig) Check() error { if c.PayloadsCacheSize < 0 { return fmt.Errorf("invalid payloads cache size: %d", c.PayloadsCacheSize) } - if c.RethDBPath != "" { - if buildRethdb { - // If the rethdb path is set, we use the rethdb receipts fetcher and skip creating - // an RCP receipts fetcher, so below rpc config parameters don't need to be checked. - return nil - } else { - return fmt.Errorf("rethdb path specified, but built without rethdb support") - } - } if c.MaxConcurrentRequests < 1 { return fmt.Errorf("expected at least 1 concurrent request, but max is %d", c.MaxConcurrentRequests) } @@ -136,9 +123,9 @@ func NewEthClient(client client.RPC, log log.Logger, metrics caching.Metrics, co } client = LimitRPC(client, config.MaxConcurrentRequests) - recProvider := newRecProviderFromConfig(client, log, metrics, config) + recProvider := newRPCRecProviderFromConfig(client, log, metrics, config) if recProvider.isInnerNil() { - return nil, fmt.Errorf("failed to open RethDB") + return nil, errors.New("failed to establish receipts provider") } return &EthClient{ client: client, diff --git a/op-service/sources/l1_beacon_client.go b/op-service/sources/l1_beacon_client.go index 95e0b4022307..a9a5ef7a05ad 100644 --- a/op-service/sources/l1_beacon_client.go +++ b/op-service/sources/l1_beacon_client.go @@ -179,8 +179,9 @@ func NewL1BeaconClient(cl BeaconClient, cfg L1BeaconClientConfig, fallbacks ...B cs := append([]BlobSideCarsFetcher{cl}, fallbacks...) return &L1BeaconClient{ cl: cl, - pool: NewClientPool[BlobSideCarsFetcher](cs...), - cfg: cfg} + pool: NewClientPool(cs...), + cfg: cfg, + } } type TimeToSlotFn func(timestamp uint64) (uint64, error) diff --git a/op-service/sources/l1_beacon_client_test.go b/op-service/sources/l1_beacon_client_test.go index ef4ede18c68d..086cb0f9dae4 100644 --- a/op-service/sources/l1_beacon_client_test.go +++ b/op-service/sources/l1_beacon_client_test.go @@ -25,8 +25,8 @@ func makeTestBlobSidecar(index uint64) (eth.IndexedBlobHash, *eth.BlobSidecar) { // make first byte of test blob match its index so we can easily verify if is returned in the // expected order blob[0] = byte(index) - commit, _ := kzg4844.BlobToCommitment(blob) - proof, _ := kzg4844.ComputeBlobProof(blob, commit) + commit, _ := kzg4844.BlobToCommitment(&blob) + proof, _ := kzg4844.ComputeBlobProof(&blob, commit) hash := eth.KZGToVersionedHash(commit) idh := eth.IndexedBlobHash{ diff --git a/op-service/sources/l1_client.go b/op-service/sources/l1_client.go index 3cda3a73304e..d67ce1c87abd 100644 --- a/op-service/sources/l1_client.go +++ b/op-service/sources/l1_client.go @@ -25,7 +25,11 @@ type L1ClientConfig struct { func L1ClientDefaultConfig(config *rollup.Config, trustRPC bool, kind RPCProviderKind) *L1ClientConfig { // Cache 3/2 worth of sequencing window of receipts and txs span := int(config.SeqWindowSize) * 3 / 2 - fullSpan := span + return L1ClientSimpleConfig(trustRPC, kind, span) +} + +func L1ClientSimpleConfig(trustRPC bool, kind RPCProviderKind, cacheSize int) *L1ClientConfig { + span := cacheSize if span > 1000 { // sanity cap. If a large sequencing window is configured, do not make the cache too large span = 1000 } @@ -44,7 +48,7 @@ func L1ClientDefaultConfig(config *rollup.Config, trustRPC bool, kind RPCProvide MethodResetDuration: time.Minute, }, // Not bounded by span, to cover find-sync-start range fully for speedy recovery after errors. - L1BlockRefsCacheSize: fullSpan, + L1BlockRefsCacheSize: cacheSize, } } diff --git a/op-service/sources/l2_client.go b/op-service/sources/l2_client.go index 304a94a0a292..078385d40510 100644 --- a/op-service/sources/l2_client.go +++ b/op-service/sources/l2_client.go @@ -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") || 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") || strings.Contains(err.Error(), "header not found") { err = ethereum.NotFound } // w%: wrap to preserve ethereum.NotFound case diff --git a/op-service/sources/limit_test.go b/op-service/sources/limit_test.go index ed59e0287ec1..5bea12046779 100644 --- a/op-service/sources/limit_test.go +++ b/op-service/sources/limit_test.go @@ -2,7 +2,7 @@ package sources import ( "context" - "fmt" + "errors" "net" "sync/atomic" "testing" @@ -97,10 +97,10 @@ func TestLimitClient(t *testing.T) { // None of the clients should return yet } - m.errC <- fmt.Errorf("fake-error") - m.errC <- fmt.Errorf("fake-error") + m.errC <- errors.New("fake-error") + m.errC <- errors.New("fake-error") require.Eventually(t, func() bool { return m.blockedCallers.Load() == 1 }, time.Second, 10*time.Millisecond) - m.errC <- fmt.Errorf("fake-error") + m.errC <- errors.New("fake-error") require.ErrorContains(t, <-errC1, "fake-error") require.ErrorContains(t, <-errC2, "fake-error") diff --git a/op-service/sources/reth_db.go b/op-service/sources/reth_db.go deleted file mode 100644 index aff8d491c0c6..000000000000 --- a/op-service/sources/reth_db.go +++ /dev/null @@ -1,125 +0,0 @@ -//go:build rethdb - -package sources - -import ( - "context" - "encoding/json" - "fmt" - "unsafe" - - "github.com/ethereum-optimism/optimism/op-service/client" - "github.com/ethereum-optimism/optimism/op-service/eth" - "github.com/ethereum-optimism/optimism/op-service/sources/caching" - "github.com/ethereum/go-ethereum/common" - "github.com/ethereum/go-ethereum/core/types" - "github.com/ethereum/go-ethereum/log" -) - -/* -#cgo LDFLAGS: -L../rethdb-reader/target/release -lrethdbreader -#include -#include -#include -#include - -typedef struct { - char* data; - size_t data_len; - bool error; -} ReceiptsResult; - -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(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.") - } - - // Convert the block hash to a C byte array and defer its deallocation - cBlockHash := C.CBytes(blockHash[:]) - defer C.free(cBlockHash) - - // 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)), db) - - if receiptsResult.error { - return nil, fmt.Errorf("Error fetching receipts from Reth Database.") - } - - // Free the memory allocated by the C code - defer C.rdb_free_string(receiptsResult.data) - - // Convert the returned JSON string to Go string and parse it - receiptsJSON := C.GoStringN(receiptsResult.data, C.int(receiptsResult.data_len)) - var receipts types.Receipts - if err := json.Unmarshal([]byte(receiptsJSON), &receipts); err != nil { - return nil, err - } - - 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 { - 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{ - 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.dbInstance, &hash) -} - -func NewCachingRethDBReceiptsFetcher(dbPath string, m caching.Metrics, cacheSize int) *CachingReceiptsProvider { - return NewCachingReceiptsProvider(NewRethDBReceiptsFetcher(dbPath), m, cacheSize) -} - -const buildRethdb = true - -func newRecProviderFromConfig(client client.RPC, log log.Logger, metrics caching.Metrics, config *EthClientConfig) *CachingReceiptsProvider { - if dbPath := config.RethDBPath; dbPath != "" { - return NewCachingRethDBReceiptsFetcher(dbPath, metrics, config.ReceiptsCacheSize) - } - return newRPCRecProviderFromConfig(client, log, metrics, config) -} diff --git a/op-service/sources/reth_db_stub.go b/op-service/sources/reth_db_stub.go deleted file mode 100644 index 2ddc9c545168..000000000000 --- a/op-service/sources/reth_db_stub.go +++ /dev/null @@ -1,15 +0,0 @@ -//go:build !rethdb - -package sources - -import ( - "github.com/ethereum-optimism/optimism/op-service/client" - "github.com/ethereum-optimism/optimism/op-service/sources/caching" - "github.com/ethereum/go-ethereum/log" -) - -const buildRethdb = false - -func newRecProviderFromConfig(client client.RPC, log log.Logger, metrics caching.Metrics, config *EthClientConfig) *CachingReceiptsProvider { - return newRPCRecProviderFromConfig(client, log, metrics, config) -} diff --git a/op-service/sources/reth_db_test.go b/op-service/sources/reth_db_test.go deleted file mode 100644 index d52042c439f2..000000000000 --- a/op-service/sources/reth_db_test.go +++ /dev/null @@ -1,45 +0,0 @@ -//go:build rethdb - -package sources - -import ( - "math/big" - "testing" - - "github.com/ethereum/go-ethereum/common" - "github.com/ethereum/go-ethereum/core/types" - "github.com/stretchr/testify/require" -) - -func TestRethDBReceiptsLoad(t *testing.T) { - t.Parallel() - - // ETH Mainnet block #18,663,292 - // - // https://etherscan.io/tx/0x88b2d153a4e893ba91ac235325c44b1aa0c802fcb42657701e1a73e1c675f7ca - // - // NOTE: The block hash differs from the live block due to a state root mismatch. In order to generate - // a testdata database with only this block in it, the state root of the block was modified. - // Old State Root: 0xaf81a692d228d56d35c80d65aeba59636b4671403054f6c57446c0e3e4d951c8 - // New State Root (Empty MPT): 0x56e81f171bcc55a6ff8345e692c0f86e5b48e01b996cadc001622fb5e363b421 - blockHash := common.HexToHash("0x6a229123d607c2232a8b0bdd36f90745945d05181018e64e60ff2b93ab6b52e5") - 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]) - require.Equal(t, receipt.Type, uint8(2)) - require.Equal(t, receipt.Status, uint64(1)) - require.Equal(t, receipt.CumulativeGasUsed, uint64(115_316)) - require.Equal(t, receipt.Bloom, types.BytesToBloom(common.FromHex("00200000000000000000000080001000000000000000000000000000000000000000000000000000000000000000100002000100080000000000000000000000000000000000000000000008000000200000000400000000000000000000000000000000000000000000000000000000000000000000000000000010000000000000000400000000000001000000000000000100000000080000004000000000000000000000000000000000000002000000000000000000000000000000000000000006000000000000000000000000000000000000001000000000000000000000200000000000000100000000020000000000000000000000000000000010"))) - require.Equal(t, receipt.Logs[0].Address, common.HexToAddress("c02aaa39b223fe8d0a0e5c4f27ead9083c756cc2")) - require.Equal(t, receipt.Logs[0].Topics[0], common.HexToHash("ddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef")) - require.Equal(t, receipt.Logs[0].Topics[1], common.HexToHash("00000000000000000000000000000000003b3cc22af3ae1eac0440bcee416b40")) - require.Equal(t, receipt.Logs[0].Data, common.FromHex("00000000000000000000000000000000000000000000000008a30cd230000000")) - require.Equal(t, receipt.TxHash, common.HexToHash("0x88b2d153a4e893ba91ac235325c44b1aa0c802fcb42657701e1a73e1c675f7ca")) - - require.Equal(t, receipt.BlockHash, blockHash) - require.Equal(t, receipt.BlockNumber, big.NewInt(18_663_292)) - require.Equal(t, receipt.TransactionIndex, uint(0)) -} diff --git a/op-service/sources/rollupclient.go b/op-service/sources/rollupclient.go index 96cd166732a9..acd0f84b3917 100644 --- a/op-service/sources/rollupclient.go +++ b/op-service/sources/rollupclient.go @@ -2,8 +2,7 @@ package sources import ( "context" - - "golang.org/x/exp/slog" + "log/slog" "github.com/ethereum/go-ethereum/common" "github.com/ethereum/go-ethereum/common/hexutil" @@ -71,6 +70,10 @@ func (r *RollupClient) PostUnsafePayload(ctx context.Context, payload *eth.Execu return r.rpc.CallContext(ctx, nil, "admin_postUnsafePayload", payload) } +func (r *RollupClient) OverrideLeader(ctx context.Context) error { + return r.rpc.CallContext(ctx, nil, "admin_overrideLeader") +} + func (r *RollupClient) SetLogLevel(ctx context.Context, lvl slog.Level) error { return r.rpc.CallContext(ctx, nil, "admin_setLogLevel", lvl.String()) } diff --git a/op-service/sources/supervisor_client.go b/op-service/sources/supervisor_client.go new file mode 100644 index 000000000000..db40e55ef472 --- /dev/null +++ b/op-service/sources/supervisor_client.go @@ -0,0 +1,84 @@ +package sources + +import ( + "context" + "fmt" + + "github.com/ethereum/go-ethereum/common" + "github.com/ethereum/go-ethereum/common/hexutil" + + "github.com/ethereum-optimism/optimism/op-service/client" + "github.com/ethereum-optimism/optimism/op-supervisor/supervisor/types" +) + +type SupervisorClient struct { + client client.RPC +} + +func NewSupervisorClient(client client.RPC) *SupervisorClient { + return &SupervisorClient{ + client: client, + } +} + +func (cl *SupervisorClient) Stop( + ctx context.Context, +) error { + var result error + err := cl.client.CallContext( + ctx, + &result, + "admin_stop") + if err != nil { + return fmt.Errorf("failed to stop Supervisor: %w", err) + } + return result +} + +func (cl *SupervisorClient) Start( + ctx context.Context, +) error { + var result error + err := cl.client.CallContext( + ctx, + &result, + "admin_start") + if err != nil { + return fmt.Errorf("failed to start Supervisor: %w", err) + } + return result +} + +func (cl *SupervisorClient) AddL2RPC( + ctx context.Context, + rpc string, +) error { + var result error + err := cl.client.CallContext( + ctx, + &result, + "admin_addL2RPC", + rpc) + if err != nil { + return fmt.Errorf("failed to Add L2 to Supervisor (rpc: %s): %w", rpc, err) + } + return result +} + +func (cl *SupervisorClient) CheckBlock(ctx context.Context, + chainID types.ChainID, blockHash common.Hash, blockNumber uint64) (types.SafetyLevel, error) { + var result types.SafetyLevel + err := cl.client.CallContext( + ctx, + &result, + "supervisor_checkBlock", + (*hexutil.U256)(&chainID), blockHash, hexutil.Uint64(blockNumber)) + if err != nil { + return types.Unsafe, fmt.Errorf("failed to check Block %s:%d (chain %s): %w", blockHash, blockNumber, chainID, err) + } + return result, nil +} + +func (cl *SupervisorClient) Close() { + cl.client.Close() +} diff --git a/op-service/sources/types.go b/op-service/sources/types.go index afb994bd7cc3..f337beb02058 100644 --- a/op-service/sources/types.go +++ b/op-service/sources/types.go @@ -1,6 +1,7 @@ package sources import ( + "errors" "fmt" "math/big" "strings" @@ -229,7 +230,7 @@ func (block *RPCBlock) verify() error { } if block.WithdrawalsRoot != nil { if block.Withdrawals == nil { - return fmt.Errorf("expected withdrawals") + return errors.New("expected withdrawals") } for i, w := range *block.Withdrawals { if w == nil { diff --git a/op-service/testlog/capturing.go b/op-service/testlog/capturing.go index 6e1edb09b504..444d71735591 100644 --- a/op-service/testlog/capturing.go +++ b/op-service/testlog/capturing.go @@ -2,23 +2,66 @@ package testlog import ( "context" + "log/slog" "strings" - "golang.org/x/exp/slog" - "github.com/ethereum/go-ethereum/log" ) +// CapturedAttributes forms a chain of inherited attributes, to traverse on captured log records. +type CapturedAttributes struct { + Parent *CapturedAttributes + Attributes []slog.Attr +} + +// Attrs calls f on each Attr in the [CapturedAttributes]. +// Iteration stops if f returns false. +func (r *CapturedAttributes) Attrs(f func(slog.Attr) bool) { + for _, a := range r.Attributes { + if !f(a) { + return + } + } + if r.Parent != nil { + r.Parent.Attrs(f) + } +} + +// CapturedRecord is a wrapped around a regular log-record, +// to preserve the inherited attributes context, without mutating the record or reordering attributes. +type CapturedRecord struct { + Parent *CapturedAttributes + *slog.Record +} + +// Attrs calls f on each Attr in the [CapturedRecord]. +// Iteration stops if f returns false. +func (r *CapturedRecord) Attrs(f func(slog.Attr) bool) { + searching := true + r.Record.Attrs(func(a slog.Attr) bool { + searching = f(a) + return searching + }) + if !searching { // if we found it already, then don't traverse the remainder + return + } + if r.Parent != nil { + r.Parent.Attrs(f) + } +} + // CapturingHandler provides a log handler that captures all log records and optionally forwards them to a delegate. // Note that it is not thread safe. type CapturingHandler struct { handler slog.Handler - Logs *[]*slog.Record // shared among derived CapturingHandlers + Logs *[]*CapturedRecord // shared among derived CapturingHandlers + // attrs are inherited log record attributes, from a logger that this CapturingHandler may be derived from + attrs *CapturedAttributes } func CaptureLogger(t Testing, level slog.Level) (_ log.Logger, ch *CapturingHandler) { return LoggerWithHandlerMod(t, level, func(h slog.Handler) slog.Handler { - ch = &CapturingHandler{handler: h, Logs: new([]*slog.Record)} + ch = &CapturingHandler{handler: h, Logs: new([]*CapturedRecord)} return ch }), ch } @@ -30,7 +73,10 @@ func (c *CapturingHandler) Enabled(context.Context, slog.Level) bool { } func (c *CapturingHandler) Handle(ctx context.Context, r slog.Record) error { - *c.Logs = append(*c.Logs, &r) + *c.Logs = append(*c.Logs, &CapturedRecord{ + Parent: c.attrs, + Record: &r, + }) if c.handler != nil && c.handler.Enabled(ctx, r.Level) { return c.handler.Handle(ctx, r) } @@ -38,10 +84,13 @@ func (c *CapturingHandler) Handle(ctx context.Context, r slog.Record) error { } func (c *CapturingHandler) WithAttrs(attrs []slog.Attr) slog.Handler { - // Note: additional attributes won't be visible for captured logs return &CapturingHandler{ handler: c.handler.WithAttrs(attrs), Logs: c.Logs, + attrs: &CapturedAttributes{ + Parent: c.attrs, + Attributes: attrs, + }, } } @@ -57,13 +106,13 @@ func (c *CapturingHandler) Clear() { } func NewLevelFilter(level slog.Level) LogFilter { - return func(r *slog.Record) bool { - return r.Level == level + return func(r *CapturedRecord) bool { + return r.Record.Level == level } } func NewAttributesFilter(key, value string) LogFilter { - return func(r *slog.Record) bool { + return func(r *CapturedRecord) bool { found := false r.Attrs(func(a slog.Attr) bool { if a.Key == key && a.Value.String() == value { @@ -77,7 +126,7 @@ func NewAttributesFilter(key, value string) LogFilter { } func NewAttributesContainsFilter(key, value string) LogFilter { - return func(r *slog.Record) bool { + return func(r *CapturedRecord) bool { found := false r.Attrs(func(a slog.Attr) bool { if a.Key == key && strings.Contains(a.Value.String(), value) { @@ -91,20 +140,20 @@ func NewAttributesContainsFilter(key, value string) LogFilter { } func NewMessageFilter(message string) LogFilter { - return func(r *slog.Record) bool { - return r.Message == message + return func(r *CapturedRecord) bool { + return r.Record.Message == message } } func NewMessageContainsFilter(message string) LogFilter { - return func(r *slog.Record) bool { - return strings.Contains(r.Message, message) + return func(r *CapturedRecord) bool { + return strings.Contains(r.Record.Message, message) } } -type LogFilter func(*slog.Record) bool +type LogFilter func(record *CapturedRecord) bool -func (c *CapturingHandler) FindLog(filters ...LogFilter) *HelperRecord { +func (c *CapturingHandler) FindLog(filters ...LogFilter) *CapturedRecord { for _, record := range *c.Logs { match := true for _, filter := range filters { @@ -114,14 +163,14 @@ func (c *CapturingHandler) FindLog(filters ...LogFilter) *HelperRecord { } } if match { - return &HelperRecord{record} + return record } } return nil } -func (c *CapturingHandler) FindLogs(filters ...LogFilter) []*HelperRecord { - var logs []*HelperRecord +func (c *CapturingHandler) FindLogs(filters ...LogFilter) []*CapturedRecord { + var logs []*CapturedRecord for _, record := range *c.Logs { match := true for _, filter := range filters { @@ -131,17 +180,13 @@ func (c *CapturingHandler) FindLogs(filters ...LogFilter) []*HelperRecord { } } if match { - logs = append(logs, &HelperRecord{record}) + logs = append(logs, record) } } return logs } -type HelperRecord struct { - *slog.Record -} - -func (h HelperRecord) AttrValue(name string) (v any) { +func (h *CapturedRecord) AttrValue(name string) (v any) { h.Attrs(func(a slog.Attr) bool { if a.Key == name { v = a.Value.Any() diff --git a/op-service/testlog/capturing_test.go b/op-service/testlog/capturing_test.go index 46f6fd175e08..04ac4a8eccdf 100644 --- a/op-service/testlog/capturing_test.go +++ b/op-service/testlog/capturing_test.go @@ -14,7 +14,7 @@ func TestCaptureLogger(t *testing.T) { lgr.Info(msg, "a", 1) msgFilter := testlog.NewMessageFilter(msg) rec := logs.FindLog(msgFilter) - require.Equal(t, msg, rec.Message) + require.Equal(t, msg, rec.Record.Message) require.EqualValues(t, 1, rec.AttrValue("a")) lgr.Debug("bug") @@ -52,9 +52,37 @@ func TestCaptureLoggerAttributesFilter(t *testing.T) { attrFilter := testlog.NewAttributesFilter("a", "random") rec := logs.FindLog(msgFilter, attrFilter) - require.Equal(t, msg, rec.Message) + require.Equal(t, msg, rec.Record.Message) require.EqualValues(t, "random", rec.AttrValue("a")) recs := logs.FindLogs(msgFilter, attrFilter) require.Len(t, recs, 1) } + +func TestCaptureLoggerNested(t *testing.T) { + lgrInner, logs := testlog.CaptureLogger(t, log.LevelInfo) + + lgrInner.Info("hi", "a", "test") + + lgrChildX := lgrInner.With("name", "childX") + lgrChildX.Info("hello", "b", "42") + + lgrChildY := lgrInner.With("name", "childY") + lgrChildY.Info("hola", "c", "7") + + lgrInner.Info("hello universe", "greeting", "from Inner") + + lgrChildX.Info("hello world", "greeting", "from X") + + require.Len(t, logs.FindLogs(testlog.NewAttributesFilter("name", "childX")), 2, "X logged twice") + require.Len(t, logs.FindLogs(testlog.NewAttributesFilter("name", "childY")), 1, "Y logged once") + + require.Len(t, logs.FindLogs( + testlog.NewAttributesContainsFilter("greeting", "from")), 2, "two greetings") + require.Len(t, logs.FindLogs( + testlog.NewAttributesContainsFilter("greeting", "from"), + testlog.NewAttributesFilter("name", "childX")), 1, "only one greeting from X") + + require.Len(t, logs.FindLogs( + testlog.NewAttributesFilter("a", "test")), 1, "root logger logged 'a' once") +} diff --git a/op-service/testlog/testlog.go b/op-service/testlog/testlog.go index 0ff544225599..fe7ede207cbc 100644 --- a/op-service/testlog/testlog.go +++ b/op-service/testlog/testlog.go @@ -21,14 +21,13 @@ import ( "bufio" "bytes" "context" + "log/slog" "os" "runtime" "strconv" "strings" "sync" - "golang.org/x/exp/slog" - "github.com/ethereum/go-ethereum/log" ) diff --git a/op-service/testutils/fake_chain.go b/op-service/testutils/fake_chain.go index 8110e37779f1..eca4de1160b6 100644 --- a/op-service/testutils/fake_chain.go +++ b/op-service/testutils/fake_chain.go @@ -14,9 +14,9 @@ import ( "github.com/ethereum-optimism/optimism/op-service/eth" ) -func FakeGenesis(l1 rune, l2 rune, l1GenesisNumber int) rollup.Genesis { +func FakeGenesis(l1 rune, l2 rune, l1GenesisNumber uint64) rollup.Genesis { return rollup.Genesis{ - L1: fakeID(l1, uint64(l1GenesisNumber)), + L1: fakeID(l1, l1GenesisNumber), L2: fakeID(l2, 0), } } diff --git a/op-service/testutils/kurtosisutil/kurtosis.go b/op-service/testutils/kurtosisutil/kurtosis.go new file mode 100644 index 000000000000..8be6c9b3f2c7 --- /dev/null +++ b/op-service/testutils/kurtosisutil/kurtosis.go @@ -0,0 +1,12 @@ +package kurtosisutil + +import ( + "os" + "testing" +) + +func Test(t *testing.T) { + if os.Getenv("ENABLE_KURTOSIS") == "" { + t.Skip("skipping Kurtosis test") + } +} diff --git a/op-service/testutils/kurtosisutil/runner.go b/op-service/testutils/kurtosisutil/runner.go new file mode 100644 index 000000000000..6440cedef681 --- /dev/null +++ b/op-service/testutils/kurtosisutil/runner.go @@ -0,0 +1,64 @@ +package kurtosisutil + +import ( + "context" + "fmt" + "testing" + "time" + + "github.com/ethereum/go-ethereum/log" + "github.com/kurtosis-tech/kurtosis/api/golang/core/lib/enclaves" + "github.com/kurtosis-tech/kurtosis/api/golang/core/lib/starlark_run_config" + "github.com/kurtosis-tech/kurtosis/api/golang/engine/lib/kurtosis_context" + "github.com/stretchr/testify/require" +) + +func StartEnclave(t *testing.T, ctx context.Context, lgr log.Logger, pkg string, params string) *enclaves.EnclaveContext { + kurtosisCtx, err := kurtosis_context.NewKurtosisContextFromLocalEngine() + require.NoError(t, err) + + enclaveID := fmt.Sprintf("kurtosis-%s", t.Name()) + enclaveCtx, err := kurtosisCtx.CreateEnclave(ctx, enclaveID) + require.NoError(t, err) + + t.Cleanup(func() { + ctx, cancel := context.WithTimeout(context.Background(), 10*time.Second) + defer cancel() + err = kurtosisCtx.DestroyEnclave(ctx, enclaveID) + if err != nil { + lgr.Error("Error destroying enclave", "err", err) + } + }) + + stream, _, err := enclaveCtx.RunStarlarkRemotePackage( + ctx, + pkg, + &starlark_run_config.StarlarkRunConfig{ + SerializedParams: params, + }, + ) + require.NoError(t, err) + + logKurtosisOutput := func(msg string) { + lgr.Info(fmt.Sprintf("[KURTOSIS] %s", msg)) + } + + for responseLine := range stream { + if responseLine.GetProgressInfo() != nil { + stepInfo := responseLine.GetProgressInfo().CurrentStepInfo + logKurtosisOutput(stepInfo[len(stepInfo)-1]) + } else if responseLine.GetInstruction() != nil { + logKurtosisOutput(responseLine.GetInstruction().Description) + } else if responseLine.GetError() != nil { + if responseLine.GetError().GetInterpretationError() != nil { + t.Fatalf("interpretation error: %s", responseLine.GetError().GetInterpretationError().String()) + } else if responseLine.GetError().GetValidationError() != nil { + t.Fatalf("validation error: %s", responseLine.GetError().GetValidationError().String()) + } else if responseLine.GetError().GetExecutionError() != nil { + t.Fatalf("execution error: %s", responseLine.GetError().GetExecutionError().String()) + } + } + } + + return enclaveCtx +} diff --git a/op-service/testutils/metrics.go b/op-service/testutils/metrics.go index 80b9332812dc..421d32f2109c 100644 --- a/op-service/testutils/metrics.go +++ b/op-service/testutils/metrics.go @@ -1,6 +1,8 @@ package testutils import ( + "time" + "github.com/ethereum-optimism/optimism/op-service/eth" ) @@ -12,6 +14,16 @@ type TestDerivationMetrics struct { FnRecordL2Ref func(name string, ref eth.L2BlockRef) FnRecordUnsafePayloads func(length uint64, memSize uint64, next eth.BlockID) FnRecordChannelInputBytes func(inputCompressedBytes int) + FnRecordChannelTimedOut func() +} + +func (t *TestDerivationMetrics) CountSequencedTxs(count int) { +} + +func (t *TestDerivationMetrics) RecordSequencerBuildingDiffTime(duration time.Duration) { +} + +func (t *TestDerivationMetrics) RecordSequencerSealingTime(duration time.Duration) { } func (t *TestDerivationMetrics) RecordL1ReorgDepth(d uint64) { @@ -48,6 +60,9 @@ func (t *TestDerivationMetrics) RecordHeadChannelOpened() { } func (t *TestDerivationMetrics) RecordChannelTimedOut() { + if t.FnRecordChannelTimedOut != nil { + t.FnRecordChannelTimedOut() + } } func (t *TestDerivationMetrics) RecordFrame() { @@ -67,3 +82,8 @@ func (n *TestRPCMetrics) RecordRPCClientRequest(method string) func(err error) { } func (n *TestRPCMetrics) RecordRPCClientResponse(method string, err error) {} + +func (t *TestDerivationMetrics) SetDerivationIdle(idle bool) {} + +func (t *TestDerivationMetrics) RecordPipelineReset() { +} diff --git a/op-service/testutils/mock_emitter.go b/op-service/testutils/mock_emitter.go new file mode 100644 index 000000000000..340f1832181d --- /dev/null +++ b/op-service/testutils/mock_emitter.go @@ -0,0 +1,40 @@ +package testutils + +import ( + "github.com/ethereum-optimism/optimism/op-node/rollup/event" + "github.com/stretchr/testify/mock" +) + +type MockEmitter struct { + mock.Mock +} + +func (m *MockEmitter) Emit(ev event.Event) { + m.Mock.MethodCalled("Emit", ev) +} + +func (m *MockEmitter) ExpectOnce(expected event.Event) { + m.Mock.On("Emit", expected).Once() +} + +func (m *MockEmitter) ExpectMaybeRun(fn func(ev event.Event)) { + m.Mock.On("Emit", mock.Anything).Maybe().Run(func(args mock.Arguments) { + fn(args.Get(0).(event.Event)) + }) +} + +func (m *MockEmitter) ExpectOnceType(typ string) { + m.Mock.On("Emit", mock.AnythingOfType(typ)).Once() +} + +func (m *MockEmitter) ExpectOnceRun(fn func(ev event.Event)) { + m.Mock.On("Emit", mock.Anything).Once().Run(func(args mock.Arguments) { + fn(args.Get(0).(event.Event)) + }) +} + +func (m *MockEmitter) AssertExpectations(t mock.TestingT) { + m.Mock.AssertExpectations(t) +} + +var _ event.Emitter = (*MockEmitter)(nil) diff --git a/op-service/testutils/mock_engine.go b/op-service/testutils/mock_engine.go index 99dadf534ec4..6fc6a078acdc 100644 --- a/op-service/testutils/mock_engine.go +++ b/op-service/testutils/mock_engine.go @@ -2,6 +2,7 @@ package testutils import ( "context" + "encoding/json" "github.com/ethereum/go-ethereum/common" @@ -22,19 +23,27 @@ func (m *MockEngine) ExpectGetPayload(payloadId eth.PayloadID, payload *eth.Exec } func (m *MockEngine) ForkchoiceUpdate(ctx context.Context, state *eth.ForkchoiceState, attr *eth.PayloadAttributes) (*eth.ForkchoiceUpdatedResult, error) { - out := m.Mock.Called(state, attr) + out := m.Mock.Called(mustJson(state), mustJson(attr)) return out.Get(0).(*eth.ForkchoiceUpdatedResult), out.Error(1) } func (m *MockEngine) ExpectForkchoiceUpdate(state *eth.ForkchoiceState, attr *eth.PayloadAttributes, result *eth.ForkchoiceUpdatedResult, err error) { - m.Mock.On("ForkchoiceUpdate", state, attr).Once().Return(result, err) + m.Mock.On("ForkchoiceUpdate", mustJson(state), mustJson(attr)).Once().Return(result, err) } func (m *MockEngine) NewPayload(ctx context.Context, payload *eth.ExecutionPayload, parentBeaconBlockRoot *common.Hash) (*eth.PayloadStatusV1, error) { - out := m.Mock.Called(payload, parentBeaconBlockRoot) + out := m.Mock.Called(mustJson(payload), mustJson(parentBeaconBlockRoot)) return out.Get(0).(*eth.PayloadStatusV1), out.Error(1) } func (m *MockEngine) ExpectNewPayload(payload *eth.ExecutionPayload, parentBeaconBlockRoot *common.Hash, result *eth.PayloadStatusV1, err error) { - m.Mock.On("NewPayload", payload, parentBeaconBlockRoot).Once().Return(result, err) + m.Mock.On("NewPayload", mustJson(payload), mustJson(parentBeaconBlockRoot)).Once().Return(result, err) +} + +func mustJson[E any](elem E) string { + data, err := json.MarshalIndent(elem, " ", " ") + if err != nil { + panic(err) + } + return string(data) } diff --git a/op-service/testutils/mock_interop_backend.go b/op-service/testutils/mock_interop_backend.go new file mode 100644 index 000000000000..970627ff750f --- /dev/null +++ b/op-service/testutils/mock_interop_backend.go @@ -0,0 +1,28 @@ +package testutils + +import ( + "context" + + "github.com/stretchr/testify/mock" + + "github.com/ethereum/go-ethereum/common" + + "github.com/ethereum-optimism/optimism/op-supervisor/supervisor/types" +) + +type MockInteropBackend struct { + Mock mock.Mock +} + +func (m *MockInteropBackend) ExpectCheckBlock(chainID types.ChainID, blockNumber uint64, safety types.SafetyLevel, err error) { + m.Mock.On("CheckBlock", chainID, blockNumber).Once().Return(safety, &err) +} + +func (m *MockInteropBackend) CheckBlock(ctx context.Context, chainID types.ChainID, blockHash common.Hash, blockNumber uint64) (types.SafetyLevel, error) { + result := m.Mock.MethodCalled("CheckBlock", chainID, blockNumber) + return result.Get(0).(types.SafetyLevel), *result.Get(1).(*error) +} + +func (m *MockInteropBackend) AssertExpectations(t mock.TestingT) { + m.Mock.AssertExpectations(t) +} diff --git a/op-service/testutils/mock_rollup_client.go b/op-service/testutils/mock_rollup_client.go index a7a42e878481..2ed6d54a00d0 100644 --- a/op-service/testutils/mock_rollup_client.go +++ b/op-service/testutils/mock_rollup_client.go @@ -18,8 +18,8 @@ func (m *MockRollupClient) OutputAtBlock(ctx context.Context, blockNum uint64) ( return out.Get(0).(*eth.OutputResponse), out.Error(1) } -func (m *MockRollupClient) ExpectOutputAtBlock(blockNum uint64, response *eth.OutputResponse, err error) { - m.Mock.On("OutputAtBlock", blockNum).Once().Return(response, err) +func (m *MockRollupClient) ExpectOutputAtBlock(blockNum uint64, response *eth.OutputResponse, err error) *mock.Call { + return m.Mock.On("OutputAtBlock", blockNum).Once().Return(response, err) } func (m *MockRollupClient) SyncStatus(ctx context.Context) (*eth.SyncStatus, error) { diff --git a/op-service/testutils/random.go b/op-service/testutils/random.go index 2fd9f8aa6e09..b30d5c179bc1 100644 --- a/op-service/testutils/random.go +++ b/op-service/testutils/random.go @@ -324,7 +324,10 @@ func RandomBlockPrependTxsWithTime(rng *rand.Rand, txCount int, t uint64, ptxs . } header.GasUsed = cumulativeGasUsed header.GasLimit = cumulativeGasUsed + uint64(rng.Int63n(int64(cumulativeGasUsed))) - block := types.NewBlock(header, txs, nil, receipts, trie.NewStackTrie(nil)) + body := types.Body{ + Transactions: txs, + } + block := types.NewBlock(header, &body, receipts, trie.NewStackTrie(nil)) logIndex := uint(0) for i, r := range receipts { r.BlockHash = block.Hash() diff --git a/op-service/testutils/rpc_err_faker.go b/op-service/testutils/rpc_err_faker.go index 980282c92490..e629e505df58 100644 --- a/op-service/testutils/rpc_err_faker.go +++ b/op-service/testutils/rpc_err_faker.go @@ -13,9 +13,9 @@ import ( type RPCErrFaker struct { // RPC to call when no ErrFn is set, or the ErrFn does not return an error RPC client.RPC - // ErrFn returns an error when the RPC needs to return error upon a call, batch call or subscription. + // ErrFn returns an error when the RPC needs to return error upon a call, batch call or subscription (nil input). // The RPC operates without fake errors if the ErrFn is nil, or returns nil. - ErrFn func() error + ErrFn func(call []rpc.BatchElem) error } func (r RPCErrFaker) Close() { @@ -24,7 +24,11 @@ func (r RPCErrFaker) Close() { func (r RPCErrFaker) CallContext(ctx context.Context, result any, method string, args ...any) error { if r.ErrFn != nil { - if err := r.ErrFn(); err != nil { + if err := r.ErrFn([]rpc.BatchElem{{ + Method: method, + Args: args, + Result: result, + }}); err != nil { return err } } @@ -33,7 +37,7 @@ func (r RPCErrFaker) CallContext(ctx context.Context, result any, method string, func (r RPCErrFaker) BatchCallContext(ctx context.Context, b []rpc.BatchElem) error { if r.ErrFn != nil { - if err := r.ErrFn(); err != nil { + if err := r.ErrFn(b); err != nil { return err } } @@ -42,7 +46,7 @@ func (r RPCErrFaker) BatchCallContext(ctx context.Context, b []rpc.BatchElem) er func (r RPCErrFaker) EthSubscribe(ctx context.Context, channel any, args ...any) (ethereum.Subscription, error) { if r.ErrFn != nil { - if err := r.ErrFn(); err != nil { + if err := r.ErrFn(nil); err != nil { return nil, err } } diff --git a/op-service/txmgr/cli.go b/op-service/txmgr/cli.go index af8a6e9cd616..fe65b6dd126e 100644 --- a/op-service/txmgr/cli.go +++ b/op-service/txmgr/cli.go @@ -5,6 +5,7 @@ import ( "errors" "fmt" "math/big" + "sync/atomic" "time" opservice "github.com/ethereum-optimism/optimism/op-service" @@ -14,6 +15,7 @@ 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/urfave/cli/v2" ) @@ -77,7 +79,7 @@ var ( MinBaseFeeGwei: 1.0, ResubmissionTimeout: 48 * time.Second, NetworkTimeout: 10 * time.Second, - TxSendTimeout: 0 * time.Second, + TxSendTimeout: 10 * time.Minute, TxNotInMempoolTimeout: 2 * time.Minute, ReceiptQueryInterval: 12 * time.Second, } @@ -94,6 +96,9 @@ var ( TxNotInMempoolTimeout: 1 * time.Minute, ReceiptQueryInterval: 12 * time.Second, } + + // geth enforces a 1 gwei minimum for blob tx fee + defaultMinBlobTxFee = big.NewInt(params.GWei) ) func CLIFlags(envPrefix string) []cli.Flag { @@ -286,23 +291,23 @@ func ReadCLIConfig(ctx *cli.Context) CLIConfig { } } -func NewConfig(cfg CLIConfig, l log.Logger) (Config, error) { +func NewConfig(cfg CLIConfig, l log.Logger) (*Config, error) { if err := cfg.Check(); err != nil { - return Config{}, fmt.Errorf("invalid config: %w", err) + return nil, fmt.Errorf("invalid config: %w", err) } ctx, cancel := context.WithTimeout(context.Background(), cfg.NetworkTimeout) defer cancel() l1, err := ethclient.DialContext(ctx, cfg.L1RPCURL) if err != nil { - return Config{}, fmt.Errorf("could not dial eth client: %w", err) + return nil, fmt.Errorf("could not dial eth client: %w", err) } ctx, cancel = context.WithTimeout(context.Background(), cfg.NetworkTimeout) defer cancel() chainID, err := l1.ChainID(ctx) if err != nil { - return Config{}, fmt.Errorf("could not dial fetch L1 chain ID: %w", err) + return nil, fmt.Errorf("could not dial fetch L1 chain ID: %w", err) } // Allow backwards compatible ways of specifying the HD path @@ -315,31 +320,26 @@ func NewConfig(cfg CLIConfig, l log.Logger) (Config, error) { signerFactory, from, err := opcrypto.SignerFactoryFromConfig(l, cfg.PrivateKey, cfg.Mnemonic, hdPath, cfg.SignerCLIConfig) if err != nil { - return Config{}, fmt.Errorf("could not init signer: %w", err) + return nil, fmt.Errorf("could not init signer: %w", err) } feeLimitThreshold, err := eth.GweiToWei(cfg.FeeLimitThresholdGwei) if err != nil { - return Config{}, fmt.Errorf("invalid fee limit threshold: %w", err) + return nil, fmt.Errorf("invalid fee limit threshold: %w", err) } minBaseFee, err := eth.GweiToWei(cfg.MinBaseFeeGwei) if err != nil { - return Config{}, fmt.Errorf("invalid min base fee: %w", err) + return nil, fmt.Errorf("invalid min base fee: %w", err) } minTipCap, err := eth.GweiToWei(cfg.MinTipCapGwei) if err != nil { - return Config{}, fmt.Errorf("invalid min tip cap: %w", err) + return nil, fmt.Errorf("invalid min tip cap: %w", err) } - return Config{ + res := Config{ Backend: l1, - ResubmissionTimeout: cfg.ResubmissionTimeout, - FeeLimitMultiplier: cfg.FeeLimitMultiplier, - FeeLimitThreshold: feeLimitThreshold, - MinBaseFee: minBaseFee, - MinTipCap: minTipCap, ChainID: chainID, TxSendTimeout: cfg.TxSendTimeout, TxNotInMempoolTimeout: cfg.TxNotInMempoolTimeout, @@ -349,7 +349,16 @@ func NewConfig(cfg CLIConfig, l log.Logger) (Config, error) { SafeAbortNonceTooLowCount: cfg.SafeAbortNonceTooLowCount, Signer: signerFactory(chainID), From: from, - }, nil + } + + res.ResubmissionTimeout.Store(int64(cfg.ResubmissionTimeout)) + res.FeeLimitThreshold.Store(feeLimitThreshold) + res.FeeLimitMultiplier.Store(cfg.FeeLimitMultiplier) + res.MinBaseFee.Store(minBaseFee) + res.MinTipCap.Store(minTipCap) + res.MinBlobTxFee.Store(defaultMinBlobTxFee) + + return &res, nil } // Config houses parameters for altering the behavior of a SimpleTxManager. @@ -359,21 +368,23 @@ type Config struct { // published transaction has been mined, the new tx with a bumped gas // price will be published. Only one publication at MaxGasPrice will be // attempted. - ResubmissionTimeout time.Duration + ResubmissionTimeout atomic.Int64 // The multiplier applied to fee suggestions to put a hard limit on fee increases. - FeeLimitMultiplier uint64 + FeeLimitMultiplier atomic.Uint64 // Minimum threshold (in Wei) at which the FeeLimitMultiplier takes effect. // On low-fee networks, like test networks, this allows for arbitrary fee bumps // below this threshold. - FeeLimitThreshold *big.Int + FeeLimitThreshold atomic.Pointer[big.Int] // Minimum base fee (in Wei) to assume when determining tx fees. - MinBaseFee *big.Int + MinBaseFee atomic.Pointer[big.Int] // Minimum tip cap (in Wei) to enforce when determining tx fees. - MinTipCap *big.Int + MinTipCap atomic.Pointer[big.Int] + + MinBlobTxFee atomic.Pointer[big.Int] // ChainID is the chain ID of the L1 chain. ChainID *big.Int @@ -390,7 +401,7 @@ type Config struct { // This is intended to be used for network requests that can be replayed. NetworkTimeout time.Duration - // RequireQueryInterval is the interval at which the tx manager will + // ReceiptQueryInterval is the interval at which the tx manager will // query the backend to check for confirmations after a tx at a // specific gas price has been published. ReceiptQueryInterval time.Duration @@ -409,7 +420,7 @@ type Config struct { From common.Address } -func (m Config) Check() error { +func (m *Config) Check() error { if m.Backend == nil { return errors.New("must provide the Backend") } @@ -419,14 +430,16 @@ func (m Config) Check() error { if m.NetworkTimeout == 0 { return errors.New("must provide NetworkTimeout") } - if m.FeeLimitMultiplier == 0 { + if m.FeeLimitMultiplier.Load() == 0 { return errors.New("must provide FeeLimitMultiplier") } - if m.MinBaseFee != nil && m.MinTipCap != nil && m.MinBaseFee.Cmp(m.MinTipCap) == -1 { + minBaseFee := m.MinBaseFee.Load() + minTipCap := m.MinTipCap.Load() + if minBaseFee != nil && minTipCap != nil && minBaseFee.Cmp(minTipCap) == -1 { return fmt.Errorf("minBaseFee smaller than minTipCap, have %v < %v", - m.MinBaseFee, m.MinTipCap) + minBaseFee, minTipCap) } - if m.ResubmissionTimeout == 0 { + if m.ResubmissionTimeout.Load() == 0 { return errors.New("must provide ResubmissionTimeout") } if m.ReceiptQueryInterval == 0 { diff --git a/op-service/txmgr/metrics/tx_metrics.go b/op-service/txmgr/metrics/tx_metrics.go index e3015e229830..fe013a0b8d07 100644 --- a/op-service/txmgr/metrics/tx_metrics.go +++ b/op-service/txmgr/metrics/tx_metrics.go @@ -24,11 +24,12 @@ type TxMetricer interface { } type TxMetrics struct { - TxL1GasFee prometheus.Gauge - txFees prometheus.Counter - TxGasBump prometheus.Gauge + txL1GasFee prometheus.Gauge + txFeesTotal prometheus.Counter + txGasBump prometheus.Gauge txFeeHistogram prometheus.Histogram - LatencyConfirmedTx prometheus.Gauge + txType prometheus.Gauge + latencyConfirmedTx prometheus.Gauge currentNonce prometheus.Gauge pendingTxs prometheus.Gauge txPublishError *prometheus.CounterVec @@ -55,18 +56,24 @@ var _ TxMetricer = (*TxMetrics)(nil) func MakeTxMetrics(ns string, factory metrics.Factory) TxMetrics { return TxMetrics{ - TxL1GasFee: factory.NewGauge(prometheus.GaugeOpts{ + txL1GasFee: factory.NewGauge(prometheus.GaugeOpts{ Namespace: ns, Name: "tx_fee_gwei", Help: "L1 gas fee for transactions in GWEI", Subsystem: "txmgr", }), - txFees: factory.NewCounter(prometheus.CounterOpts{ + txFeesTotal: factory.NewCounter(prometheus.CounterOpts{ Namespace: ns, Name: "tx_fee_gwei_total", Help: "Sum of fees spent for all transactions in GWEI", Subsystem: "txmgr", }), + txGasBump: factory.NewGauge(prometheus.GaugeOpts{ + Namespace: ns, + Name: "tx_gas_bump", + Help: "Number of times a transaction gas needed to be bumped before it got included", + Subsystem: "txmgr", + }), txFeeHistogram: factory.NewHistogram(prometheus.HistogramOpts{ Namespace: ns, Name: "tx_fee_histogram_gwei", @@ -74,13 +81,13 @@ func MakeTxMetrics(ns string, factory metrics.Factory) TxMetrics { Subsystem: "txmgr", Buckets: []float64{0.5, 1, 2, 5, 10, 20, 40, 60, 80, 100, 200, 400, 800, 1600}, }), - TxGasBump: factory.NewGauge(prometheus.GaugeOpts{ + txType: factory.NewGauge(prometheus.GaugeOpts{ Namespace: ns, - Name: "tx_gas_bump", - Help: "Number of times a transaction gas needed to be bumped before it got included", + Name: "tx_type", + Help: "Transaction type (receipt field uint8)", Subsystem: "txmgr", }), - LatencyConfirmedTx: factory.NewGauge(prometheus.GaugeOpts{ + latencyConfirmedTx: factory.NewGauge(prometheus.GaugeOpts{ Namespace: ns, Name: "tx_confirmed_latency_ms", Help: "Latency of a confirmed transaction in milliseconds", @@ -145,17 +152,18 @@ func (t *TxMetrics) RecordPendingTx(pending int64) { func (t *TxMetrics) TxConfirmed(receipt *types.Receipt) { fee := float64(receipt.EffectiveGasPrice.Uint64() * receipt.GasUsed / params.GWei) t.confirmEvent.Record(receiptStatusString(receipt)) - t.TxL1GasFee.Set(fee) - t.txFees.Add(fee) + t.txL1GasFee.Set(fee) + t.txFeesTotal.Add(fee) t.txFeeHistogram.Observe(fee) + t.txType.Set(float64(receipt.Type)) } func (t *TxMetrics) RecordGasBumpCount(times int) { - t.TxGasBump.Set(float64(times)) + t.txGasBump.Set(float64(times)) } func (t *TxMetrics) RecordTxConfirmationLatency(latency int64) { - t.LatencyConfirmedTx.Set(float64(latency)) + t.latencyConfirmedTx.Set(float64(latency)) } func (t *TxMetrics) TxPublished(errString string) { diff --git a/op-service/txmgr/mocks/TxManager.go b/op-service/txmgr/mocks/TxManager.go index a5c6f584537e..ec805b74d004 100644 --- a/op-service/txmgr/mocks/TxManager.go +++ b/op-service/txmgr/mocks/TxManager.go @@ -4,11 +4,14 @@ package mocks import ( context "context" + big "math/big" common "github.com/ethereum/go-ethereum/common" mock "github.com/stretchr/testify/mock" + rpc "github.com/ethereum/go-ethereum/rpc" + txmgr "github.com/ethereum-optimism/optimism/op-service/txmgr" types "github.com/ethereum/go-ethereum/core/types" @@ -19,6 +22,20 @@ type TxManager struct { mock.Mock } +// API provides a mock function with given fields: +func (_m *TxManager) API() rpc.API { + ret := _m.Called() + + var r0 rpc.API + if rf, ok := ret.Get(0).(func() rpc.API); ok { + r0 = rf() + } else { + r0 = ret.Get(0).(rpc.API) + } + + return r0 +} + // BlockNumber provides a mock function with given fields: ctx func (_m *TxManager) BlockNumber(ctx context.Context) (uint64, error) { ret := _m.Called(ctx) @@ -104,6 +121,55 @@ func (_m *TxManager) Send(ctx context.Context, candidate txmgr.TxCandidate) (*ty return r0, r1 } +// SendAsync provides a mock function with given fields: ctx, candidate, ch +func (_m *TxManager) SendAsync(ctx context.Context, candidate txmgr.TxCandidate, ch chan txmgr.SendResponse) { + _m.Called(ctx, candidate, ch) +} + +// SuggestGasPriceCaps provides a mock function with given fields: ctx +func (_m *TxManager) SuggestGasPriceCaps(ctx context.Context) (*big.Int, *big.Int, *big.Int, error) { + ret := _m.Called(ctx) + + var r0 *big.Int + var r1 *big.Int + var r2 *big.Int + var r3 error + if rf, ok := ret.Get(0).(func(context.Context) (*big.Int, *big.Int, *big.Int, error)); ok { + return rf(ctx) + } + if rf, ok := ret.Get(0).(func(context.Context) *big.Int); ok { + r0 = rf(ctx) + } else { + if ret.Get(0) != nil { + r0 = ret.Get(0).(*big.Int) + } + } + + if rf, ok := ret.Get(1).(func(context.Context) *big.Int); ok { + r1 = rf(ctx) + } else { + if ret.Get(1) != nil { + r1 = ret.Get(1).(*big.Int) + } + } + + if rf, ok := ret.Get(2).(func(context.Context) *big.Int); ok { + r2 = rf(ctx) + } else { + if ret.Get(2) != nil { + r2 = ret.Get(2).(*big.Int) + } + } + + if rf, ok := ret.Get(3).(func(context.Context) error); ok { + r3 = rf(ctx) + } else { + r3 = ret.Error(3) + } + + return r0, r1, r2, r3 +} + type mockConstructorTestingTNewTxManager interface { mock.TestingT Cleanup(func()) diff --git a/op-service/txmgr/queue.go b/op-service/txmgr/queue.go index cf83b00d5f8a..ee7a03ffa928 100644 --- a/op-service/txmgr/queue.go +++ b/op-service/txmgr/queue.go @@ -44,11 +44,11 @@ func NewQueue[T any](ctx context.Context, txMgr TxManager, maxPending uint64) *Q } // Wait waits for all pending txs to complete (or fail). -func (q *Queue[T]) Wait() { +func (q *Queue[T]) Wait() error { if q.group == nil { - return + return nil } - _ = q.group.Wait() + return q.group.Wait() } // Send will wait until the number of pending txs is below the max pending, diff --git a/op-service/txmgr/queue_test.go b/op-service/txmgr/queue_test.go index ee7a07b0ee05..549142c8592a 100644 --- a/op-service/txmgr/queue_test.go +++ b/op-service/txmgr/queue_test.go @@ -168,8 +168,8 @@ func TestQueue_Send(t *testing.T) { t.Parallel() conf := configWithNumConfs(1) - conf.ReceiptQueryInterval = 1 * time.Second // simulate a network send - conf.ResubmissionTimeout = 2 * time.Second // resubmit to detect errors + conf.ReceiptQueryInterval = 1 * time.Second // simulate a network send + conf.ResubmissionTimeout.Store(int64(2 * time.Second)) // resubmit to detect errors conf.SafeAbortNonceTooLowCount = 1 backend := newMockBackendWithNonce(newGasPricer(3)) mgr := &SimpleTxManager{ @@ -222,7 +222,7 @@ func TestQueue_Send(t *testing.T) { require.Equal(t, c.queued, queued, msg) } // wait for the queue to drain (all txs complete or failed) - queue.Wait() + _ = queue.Wait() duration := time.Since(start) // expect the execution time within a certain window now := time.Now() diff --git a/op-service/txmgr/rpc.go b/op-service/txmgr/rpc.go new file mode 100644 index 000000000000..7a93721efcda --- /dev/null +++ b/op-service/txmgr/rpc.go @@ -0,0 +1,54 @@ +package txmgr + +import ( + "context" + "math/big" + "time" + + "github.com/ethereum/go-ethereum/log" +) + +type SimpleTxmgrAPI struct { + mgr *SimpleTxManager + l log.Logger +} + +func (a *SimpleTxmgrAPI) GetMinBaseFee(_ context.Context) *big.Int { + return a.mgr.GetMinBaseFee() +} + +func (a *SimpleTxmgrAPI) SetMinBaseFee(_ context.Context, val *big.Int) { + a.mgr.SetMinBaseFee(val) +} + +func (a *SimpleTxmgrAPI) GetMinPriorityFee(_ context.Context) *big.Int { + return a.mgr.GetMinPriorityFee() +} + +func (a *SimpleTxmgrAPI) SetMinPriorityFee(_ context.Context, val *big.Int) { + a.mgr.SetMinPriorityFee(val) +} + +func (a *SimpleTxmgrAPI) GetMinBlobFee(_ context.Context) *big.Int { + return a.mgr.GetMinBlobFee() +} + +func (a *SimpleTxmgrAPI) SetMinBlobFee(_ context.Context, val *big.Int) { + a.mgr.SetMinBlobFee(val) +} + +func (a *SimpleTxmgrAPI) GetFeeThreshold(_ context.Context) *big.Int { + return a.mgr.GetFeeThreshold() +} + +func (a *SimpleTxmgrAPI) SetFeeThreshold(_ context.Context, val *big.Int) { + a.mgr.SetFeeThreshold(val) +} + +func (a *SimpleTxmgrAPI) GetBumpFeeRetryTime(_ context.Context) time.Duration { + return a.mgr.GetBumpFeeRetryTime() +} + +func (a *SimpleTxmgrAPI) SetBumpFeeRetryTime(_ context.Context, val time.Duration) { + a.mgr.SetBumpFeeRetryTime(val) +} diff --git a/op-service/txmgr/rpc_test.go b/op-service/txmgr/rpc_test.go new file mode 100644 index 000000000000..ed76d57cda1a --- /dev/null +++ b/op-service/txmgr/rpc_test.go @@ -0,0 +1,74 @@ +package txmgr + +import ( + "fmt" + "math/big" + "testing" + + oprpc "github.com/ethereum-optimism/optimism/op-service/rpc" + "github.com/ethereum/go-ethereum/rpc" + "github.com/stretchr/testify/require" +) + +func TestTxmgrRPC(t *testing.T) { + minBaseFeeInit := big.NewInt(1000) + minPriorityFeeInit := big.NewInt(2000) + minBlobFeeInit := big.NewInt(3000) + feeThresholdInit := big.NewInt(4000) + bumpFeeRetryTimeInit := int64(100) + + cfg := Config{} + cfg.MinBaseFee.Store(minBaseFeeInit) + cfg.MinTipCap.Store(minPriorityFeeInit) + cfg.MinBlobTxFee.Store(minBlobFeeInit) + cfg.FeeLimitThreshold.Store(feeThresholdInit) + cfg.ResubmissionTimeout.Store(bumpFeeRetryTimeInit) + + h := newTestHarnessWithConfig(t, &cfg) + + appVersion := "test" + server := oprpc.NewServer( + "127.0.0.1", + 0, + appVersion, + oprpc.WithAPIs([]rpc.API{ + h.mgr.API(), + }), + ) + require.NoError(t, server.Start()) + defer func() { + _ = server.Stop() + }() + + rpcClient, err := rpc.Dial(fmt.Sprintf("http://%s", server.Endpoint())) + require.NoError(t, err) + + type tcase struct { + rpcMethod string + initValue *big.Int + } + + cases := []tcase{ + {"MinBaseFee", minBaseFeeInit}, + {"MinPriorityFee", minPriorityFeeInit}, + {"MinBlobFee", minBlobFeeInit}, + {"FeeThreshold", feeThresholdInit}, + {"BumpFeeRetryTime", big.NewInt(bumpFeeRetryTimeInit)}, + } + + for _, tc := range cases { + t.Run("Get|Set"+tc.rpcMethod, func(t *testing.T) { + var res *big.Int + + require.NoError(t, rpcClient.Call(&res, "txmgr_get"+tc.rpcMethod)) + require.Equal(t, tc.initValue, res) + + newVal := new(big.Int) + newVal.Add(tc.initValue, big.NewInt(1)) + + require.NoError(t, rpcClient.Call(&res, "txmgr_set"+tc.rpcMethod, newVal)) + require.NoError(t, rpcClient.Call(&res, "txmgr_get"+tc.rpcMethod)) + require.Equal(t, newVal, res) + }) + } +} diff --git a/op-service/txmgr/send_state.go b/op-service/txmgr/send_state.go index 4066a0caa149..38e691fc78f8 100644 --- a/op-service/txmgr/send_state.go +++ b/op-service/txmgr/send_state.go @@ -7,16 +7,12 @@ import ( "github.com/ethereum/go-ethereum/common" "github.com/ethereum/go-ethereum/core" + "github.com/ethereum/go-ethereum/core/txpool" ) var ( - // Returned by CriticalError when there is an incompatible tx type already in the mempool. - // geth defines this error as txpool.ErrAlreadyReserved in v1.13.14 so we can remove this - // declaration once op-geth is updated to this version. - ErrAlreadyReserved = errors.New("address already reserved") - // Returned by CriticalError when the system is unable to get the tx into the mempool in the - // alloted time + // allotted time ErrMempoolDeadlineExpired = errors.New("failed to get tx into the mempool") ) @@ -41,6 +37,9 @@ type SendState struct { // Whether any attempt to send the tx resulted in ErrAlreadyReserved alreadyReserved bool + // Whether we should bump fees before trying to publish the tx again + bumpFees bool + // Miscellaneous tracking bumpCount int // number of times we have bumped the gas price } @@ -76,7 +75,7 @@ func (s *SendState) ProcessSendError(err error) { s.successFullPublishCount++ case errStringMatch(err, core.ErrNonceTooLow): s.nonceTooLowCount++ - case errStringMatch(err, ErrAlreadyReserved): + case errStringMatch(err, txpool.ErrAlreadyReserved): s.alreadyReserved = true } } @@ -124,12 +123,16 @@ func (s *SendState) CriticalError() error { case s.nonceTooLowCount >= s.safeAbortNonceTooLowCount: // we have exceeded the nonce too low count return core.ErrNonceTooLow + case s.successFullPublishCount == 0 && s.nonceTooLowCount > 0: + // A nonce too low error before successfully publishing any transaction means the tx will + // need a different nonce, which we can force by returning error. + return core.ErrNonceTooLow case s.successFullPublishCount == 0 && s.now().After(s.txInMempoolDeadline): - // unable to get the tx into the mempool in the alloted time + // unable to get the tx into the mempool in the allotted time return ErrMempoolDeadlineExpired case s.alreadyReserved: // incompatible tx type in mempool - return ErrAlreadyReserved + return txpool.ErrAlreadyReserved } return nil } diff --git a/op-service/txmgr/send_state_test.go b/op-service/txmgr/send_state_test.go index 20bfe155ed97..d48db5fd1514 100644 --- a/op-service/txmgr/send_state_test.go +++ b/op-service/txmgr/send_state_test.go @@ -58,11 +58,21 @@ func TestSendStateNoAbortAfterProcessOtherError(t *testing.T) { require.Nil(t, sendState.CriticalError()) } +// TestSendStateAbortSafelyAfterNonceTooLowButNoTxMined asserts that we will abort after the very +// first none-too-low error if a tx hasn't yet been published. +func TestSendStateAbortSafelyAfterNonceTooLowNoTxPublished(t *testing.T) { + sendState := newSendState() + + sendState.ProcessSendError(core.ErrNonceTooLow) + require.ErrorIs(t, sendState.CriticalError(), core.ErrNonceTooLow) +} + // TestSendStateAbortSafelyAfterNonceTooLowButNoTxMined asserts that we will // abort after the safe abort interval has elapsed if we haven't mined a tx. func TestSendStateAbortSafelyAfterNonceTooLowButNoTxMined(t *testing.T) { sendState := newSendState() + sendState.ProcessSendError(nil) sendState.ProcessSendError(core.ErrNonceTooLow) require.Nil(t, sendState.CriticalError()) sendState.ProcessSendError(core.ErrNonceTooLow) @@ -90,6 +100,7 @@ func TestSendStateMiningTxCancelsAbort(t *testing.T) { func TestSendStateReorgingTxResetsAbort(t *testing.T) { sendState := newSendState() + sendState.ProcessSendError(nil) sendState.ProcessSendError(core.ErrNonceTooLow) sendState.ProcessSendError(core.ErrNonceTooLow) sendState.TxMined(testHash) @@ -120,6 +131,7 @@ func TestSendStateNoAbortEvenIfNonceTooLowAfterTxMined(t *testing.T) { func TestSendStateSafeAbortIfNonceTooLowPersistsAfterUnmine(t *testing.T) { sendState := newSendState() + sendState.ProcessSendError(nil) sendState.TxMined(testHash) sendState.TxNotMined(testHash) sendState.ProcessSendError(core.ErrNonceTooLow) diff --git a/op-service/txmgr/test_txmgr.go b/op-service/txmgr/test_txmgr.go new file mode 100644 index 000000000000..9c4dc5e0f335 --- /dev/null +++ b/op-service/txmgr/test_txmgr.go @@ -0,0 +1,94 @@ +package txmgr + +import ( + "context" + "errors" + "math/big" + + "github.com/ethereum/go-ethereum/common" + "github.com/ethereum/go-ethereum/core/types" +) + +type TestTxManager struct { + *SimpleTxManager + ss *SendState + tx *types.Transaction +} + +// JamTxPool sends a transaction intended to get stuck in the txpool, and should be used ONLY for testing. +// It is non-blocking. See WaitOnJammingTx if you wish to wait on the transaction to clear. +func (m *TestTxManager) JamTxPool(ctx context.Context, candidate TxCandidate) error { + var err error + m.tx, err = m.makeStuckTx(ctx, candidate) + if err != nil { + return err + } + m.ss = NewSendState(m.cfg.SafeAbortNonceTooLowCount, m.cfg.TxNotInMempoolTimeout) + if err := m.backend.SendTransaction(ctx, m.tx); err != nil { + return err + } + return nil +} + +// WaitOnJammingTx can be called after JamTxPool in order to wait on the jam transaction clearing. +func (m *TestTxManager) WaitOnJammingTx(ctx context.Context) error { + if m.ss == nil { + return errors.New("WaitOnJammingTx called without first calling JamTxPool") + } + _, err := m.waitMined(ctx, m.tx, m.ss) + return err +} + +func (m *TestTxManager) makeStuckTx(ctx context.Context, candidate TxCandidate) (*types.Transaction, error) { + gasTipCap, _, blobBaseFee, err := m.SuggestGasPriceCaps(ctx) + if err != nil { + return nil, err + } + + // override with minimal fees to make sure tx gets stuck in the pool + gasFeeCap := big.NewInt(2) + gasTipCap.SetUint64(1) + + var sidecar *types.BlobTxSidecar + var blobHashes []common.Hash + if len(candidate.Blobs) > 0 { + if sidecar, blobHashes, err = MakeSidecar(candidate.Blobs); err != nil { + return nil, err + } + } + + nonce, err := m.backend.NonceAt(ctx, m.cfg.From, nil) + if err != nil { + return nil, err + } + + var txMessage types.TxData + if sidecar != nil { + blobFeeCap := m.calcBlobFeeCap(blobBaseFee) + message := &types.BlobTx{ + To: *candidate.To, + Data: candidate.TxData, + Gas: candidate.GasLimit, + BlobHashes: blobHashes, + Sidecar: sidecar, + Nonce: nonce, + } + if err := finishBlobTx(message, m.chainID, gasTipCap, gasFeeCap, blobFeeCap, candidate.Value); err != nil { + return nil, err + } + txMessage = message + } else { + txMessage = &types.DynamicFeeTx{ + ChainID: m.chainID, + To: candidate.To, + GasTipCap: gasTipCap, + GasFeeCap: gasFeeCap, + Value: candidate.Value, + Data: candidate.TxData, + Gas: candidate.GasLimit, + Nonce: nonce, + } + } + + return m.cfg.Signer(ctx, m.cfg.From, types.NewTx(txMessage)) +} diff --git a/op-service/txmgr/txmgr.go b/op-service/txmgr/txmgr.go index 89454d03dc26..89a5fc0e08ed 100644 --- a/op-service/txmgr/txmgr.go +++ b/op-service/txmgr/txmgr.go @@ -18,7 +18,7 @@ import ( "github.com/ethereum/go-ethereum/core/types" "github.com/ethereum/go-ethereum/crypto/kzg4844" "github.com/ethereum/go-ethereum/log" - "github.com/ethereum/go-ethereum/params" + "github.com/ethereum/go-ethereum/rpc" "github.com/holiman/uint256" "github.com/ethereum-optimism/optimism/op-service/eth" @@ -37,9 +37,6 @@ var ( priceBumpPercent = big.NewInt(100 + priceBump) blobPriceBumpPercent = big.NewInt(100 + blobPriceBump) - // geth enforces a 1 gwei minimum for blob tx fee - minBlobTxFee = big.NewInt(params.GWei) - oneHundred = big.NewInt(100) ninetyNine = big.NewInt(99) two = big.NewInt(2) @@ -48,6 +45,12 @@ var ( ErrClosed = errors.New("transaction manager is closed") ) +type SendResponse struct { + Receipt *types.Receipt + Nonce uint64 + Err error +} + // TxManager is an interface that allows callers to reliably publish txs, // bumping the gas price if needed, and obtain the receipt of the resulting tx. // @@ -55,8 +58,8 @@ var ( type TxManager interface { // Send is used to create & send a transaction. It will handle increasing // the gas price & ensuring that the transaction remains in the transaction pool. - // It can be stopped by cancelling the provided context; however, the transaction - // may be included on L1 even if the context is cancelled. + // It can be stopped by canceling the provided context; however, the transaction + // may be included on L1 even if the context is canceled. // // NOTE: Send can be called concurrently, the nonce will be managed internally. // @@ -65,6 +68,14 @@ type TxManager interface { // mempool and is in need of replacement or cancellation. Send(ctx context.Context, candidate TxCandidate) (*types.Receipt, error) + // SendAsync is used to create & send a transaction asynchronously. It has similar internal + // semantics to Send, however it returns a channel that will receive the result of the + // send operation once it completes. Transactions crafted synchronously - that is, nonce + // management and gas estimation happen prior to the method returning. This allows callers + // that rely on predictable nonces to send multiple transactions in parallel while preserving + // the order of nonce increments. + SendAsync(ctx context.Context, candidate TxCandidate, ch chan SendResponse) + // From returns the sending address associated with the instance of the transaction manager. // It is static for a single instance of a TxManager. From() common.Address @@ -72,9 +83,16 @@ type TxManager interface { // BlockNumber returns the most recent block number from the underlying network. BlockNumber(ctx context.Context) (uint64, error) + // API returns an rpc api interface which can be customized for each TxManager implementation + API() rpc.API + // Close the underlying connection Close() IsClosed() bool + + // SuggestGasPriceCaps suggests what the new tip, base fee, and blob base fee should be based on + // the current L1 conditions. `blobBaseFee` will be nil if 4844 is not yet active. + SuggestGasPriceCaps(ctx context.Context) (tipCap *big.Int, baseFee *big.Int, blobBaseFee *big.Int, err error) } // ETHBackend is the set of methods that the transaction manager uses to resubmit gas & determine @@ -95,7 +113,7 @@ type ETHBackend interface { SendTransaction(ctx context.Context, tx *types.Transaction) error // These functions are used to estimate what the base fee & priority fee should be set to. - // TODO(CLI-3318): Maybe need a generic interface to support different RPC providers + // TODO: Maybe need a generic interface to support different RPC providers HeaderByNumber(ctx context.Context, number *big.Int) (*types.Header, error) SuggestGasTipCap(ctx context.Context) (*big.Int, error) // NonceAt returns the account nonce of the given account. @@ -113,7 +131,8 @@ type ETHBackend interface { // SimpleTxManager is a implementation of TxManager that performs linear fee // bumping of a tx until it confirms. type SimpleTxManager struct { - cfg Config // embed the config directly + cfg *Config // embed the config directly + name string chainID *big.Int @@ -139,7 +158,7 @@ func NewSimpleTxManager(name string, l log.Logger, m metrics.TxMetricer, cfg CLI } // NewSimpleTxManager initializes a new SimpleTxManager with the passed Config. -func NewSimpleTxManagerFromConfig(name string, l log.Logger, m metrics.TxMetricer, conf Config) (*SimpleTxManager, error) { +func NewSimpleTxManagerFromConfig(name string, l log.Logger, m metrics.TxMetricer, conf *Config) (*SimpleTxManager, error) { if err := conf.Check(); err != nil { return nil, fmt.Errorf("invalid config: %w", err) } @@ -161,6 +180,16 @@ func (m *SimpleTxManager) BlockNumber(ctx context.Context) (uint64, error) { return m.backend.BlockNumber(ctx) } +func (m *SimpleTxManager) API() rpc.API { + return rpc.API{ + Namespace: "txmgr", + Service: &SimpleTxmgrAPI{ + mgr: m, + l: m.l, + }, + } +} + // Close closes the underlying connection, and sets the closed flag. // once closed, the tx manager will refuse to send any new transactions, and may abandon pending ones. func (m *SimpleTxManager) Close() { @@ -210,24 +239,83 @@ func (m *SimpleTxManager) Send(ctx context.Context, candidate TxCandidate) (*typ if m.closed.Load() { return nil, ErrClosed } + m.metr.RecordPendingTx(m.pending.Add(1)) - defer func() { - m.metr.RecordPendingTx(m.pending.Add(-1)) - }() - receipt, err := m.send(ctx, candidate) + defer m.metr.RecordPendingTx(m.pending.Add(-1)) + + var cancel context.CancelFunc + if m.cfg.TxSendTimeout == 0 { + ctx, cancel = context.WithCancel(ctx) + } else { + ctx, cancel = context.WithTimeout(ctx, m.cfg.TxSendTimeout) + } + defer cancel() + + tx, err := m.prepare(ctx, candidate) if err != nil { m.resetNonce() + return nil, err + } + receipt, err := m.sendTx(ctx, tx) + if err != nil { + m.resetNonce() + return nil, err } return receipt, err } -// send performs the actual transaction creation and sending. -func (m *SimpleTxManager) send(ctx context.Context, candidate TxCandidate) (*types.Receipt, error) { - if m.cfg.TxSendTimeout != 0 { - var cancel context.CancelFunc +func (m *SimpleTxManager) SendAsync(ctx context.Context, candidate TxCandidate, ch chan SendResponse) { + if cap(ch) == 0 { + panic("SendAsync: channel must be buffered") + } + + // refuse new requests if the tx manager is closed + if m.closed.Load() { + ch <- SendResponse{ + Receipt: nil, + Err: ErrClosed, + } + return + } + + m.metr.RecordPendingTx(m.pending.Add(1)) + + var cancel context.CancelFunc + if m.cfg.TxSendTimeout == 0 { + ctx, cancel = context.WithCancel(ctx) + } else { ctx, cancel = context.WithTimeout(ctx, m.cfg.TxSendTimeout) - defer cancel() } + + tx, err := m.prepare(ctx, candidate) + if err != nil { + m.resetNonce() + cancel() + m.metr.RecordPendingTx(m.pending.Add(-1)) + ch <- SendResponse{ + Receipt: nil, + Err: err, + } + return + } + + go func() { + defer m.metr.RecordPendingTx(m.pending.Add(-1)) + defer cancel() + receipt, err := m.sendTx(ctx, tx) + if err != nil { + m.resetNonce() + } + ch <- SendResponse{ + Receipt: receipt, + Nonce: tx.Nonce(), + Err: err, + } + }() +} + +// prepare prepares the transaction for sending. +func (m *SimpleTxManager) prepare(ctx context.Context, candidate TxCandidate) (*types.Transaction, error) { tx, err := retry.Do(ctx, 30, retry.Fixed(2*time.Second), func() (*types.Transaction, error) { if m.closed.Load() { return nil, ErrClosed @@ -241,7 +329,7 @@ func (m *SimpleTxManager) send(ctx context.Context, candidate TxCandidate) (*typ if err != nil { return nil, fmt.Errorf("failed to create the tx: %w", err) } - return m.sendTx(ctx, tx) + return tx, nil } // craftTx creates the signed transaction @@ -251,7 +339,7 @@ func (m *SimpleTxManager) send(ctx context.Context, candidate TxCandidate) (*typ // NOTE: Otherwise, the [SimpleTxManager] will query the specified backend for an estimate. func (m *SimpleTxManager) craftTx(ctx context.Context, candidate TxCandidate) (*types.Transaction, error) { m.l.Debug("crafting Transaction", "blobs", len(candidate.Blobs), "calldata_size", len(candidate.TxData)) - gasTipCap, baseFee, blobBaseFee, err := m.suggestGasPriceCaps(ctx) + gasTipCap, baseFee, blobBaseFee, err := m.SuggestGasPriceCaps(ctx) if err != nil { m.metr.RPCError() return nil, fmt.Errorf("failed to get gas price info: %w", err) @@ -296,9 +384,9 @@ func (m *SimpleTxManager) craftTx(ctx context.Context, candidate TxCandidate) (* var txMessage types.TxData if sidecar != nil { if blobBaseFee == nil { - return nil, fmt.Errorf("expected non-nil blobBaseFee") + return nil, errors.New("expected non-nil blobBaseFee") } - blobFeeCap := calcBlobFeeCap(blobBaseFee) + blobFeeCap := m.calcBlobFeeCap(blobBaseFee) message := &types.BlobTx{ To: *candidate.To, Data: candidate.TxData, @@ -324,14 +412,68 @@ func (m *SimpleTxManager) craftTx(ctx context.Context, candidate TxCandidate) (* return m.signWithNextNonce(ctx, txMessage) // signer sets the nonce field of the tx } +func (m *SimpleTxManager) GetMinBaseFee() *big.Int { + return m.cfg.MinBaseFee.Load() +} + +func (m *SimpleTxManager) SetMinBaseFee(val *big.Int) { + m.cfg.MinBaseFee.Store(val) + m.l.Info("txmgr config val changed: SetMinBaseFee", "newVal", val) +} + +func (m *SimpleTxManager) GetMinPriorityFee() *big.Int { + return m.cfg.MinTipCap.Load() +} + +func (m *SimpleTxManager) SetMinPriorityFee(val *big.Int) { + m.cfg.MinTipCap.Store(val) + m.l.Info("txmgr config val changed: SetMinPriorityFee", "newVal", val) +} + +func (m *SimpleTxManager) GetMinBlobFee() *big.Int { + return m.cfg.MinBlobTxFee.Load() +} + +func (m *SimpleTxManager) SetMinBlobFee(val *big.Int) { + m.cfg.MinBlobTxFee.Store(val) + m.l.Info("txmgr config val changed: SetMinBlobFee", "newVal", val) +} + +func (m *SimpleTxManager) GetFeeLimitMultiplier() uint64 { + return m.cfg.FeeLimitMultiplier.Load() +} + +func (m *SimpleTxManager) SetFeeLimitMultiplier(val uint64) { + m.cfg.FeeLimitMultiplier.Store(val) + m.l.Info("txmgr config val changed: SetFeeLimitMultiplier", "newVal", val) +} + +func (m *SimpleTxManager) GetFeeThreshold() *big.Int { + return m.cfg.FeeLimitThreshold.Load() +} + +func (m *SimpleTxManager) SetFeeThreshold(val *big.Int) { + m.cfg.FeeLimitThreshold.Store(val) + m.l.Info("txmgr config val changed: SetFeeThreshold", "newVal", val) +} + +func (m *SimpleTxManager) GetBumpFeeRetryTime() time.Duration { + return time.Duration(m.cfg.ResubmissionTimeout.Load()) +} + +func (m *SimpleTxManager) SetBumpFeeRetryTime(val time.Duration) { + m.cfg.ResubmissionTimeout.Store(int64(val)) + m.l.Info("txmgr config val changed: SetBumpFeeRetryTime", "newVal", val) +} + // 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 := make([]common.Hash, 0, len(blobs)) for i, blob := range blobs { - rawBlob := *blob.KZGBlob() - sidecar.Blobs = append(sidecar.Blobs, rawBlob) + rawBlob := blob.KZGBlob() + sidecar.Blobs = append(sidecar.Blobs, *rawBlob) commitment, err := kzg4844.BlobToCommitment(rawBlob) if err != nil { return nil, nil, fmt.Errorf("cannot compute KZG commitment of blob %d in tx candidate: %w", i, err) @@ -409,43 +551,33 @@ func (m *SimpleTxManager) sendTx(ctx context.Context, tx *types.Transaction) (*t sendState := NewSendState(m.cfg.SafeAbortNonceTooLowCount, m.cfg.TxNotInMempoolTimeout) receiptChan := make(chan *types.Receipt, 1) - publishAndWait := func(tx *types.Transaction, bumpFees bool) *types.Transaction { - wg.Add(1) - tx, published := m.publishTx(ctx, tx, sendState, bumpFees) - if published { - go func() { - defer wg.Done() - m.waitForTx(ctx, tx, sendState, receiptChan) - }() - } else { - wg.Done() - } - return tx - } - - // Immediately publish a transaction before starting the resubmission loop - tx = publishAndWait(tx, false) - - ticker := time.NewTicker(m.cfg.ResubmissionTimeout) + resubmissionTimeout := m.GetBumpFeeRetryTime() + ticker := time.NewTicker(resubmissionTimeout) defer ticker.Stop() for { + if !sendState.IsWaitingForConfirmation() { + if m.closed.Load() { + // the tx manager closed and no txs are waiting to be confirmed, give up + m.txLogger(tx, false).Warn("TxManager closed, aborting transaction submission") + return nil, ErrClosed + } + var published bool + if tx, published = m.publishTx(ctx, tx, sendState); published { + wg.Add(1) + go func() { + defer wg.Done() + m.waitForTx(ctx, tx, sendState, receiptChan) + }() + } + } if err := sendState.CriticalError(); err != nil { m.txLogger(tx, false).Warn("Aborting transaction submission", "err", err) return nil, fmt.Errorf("aborted tx send due to critical error: %w", err) } + select { case <-ticker.C: - // Don't resubmit a transaction if it has been mined, but we are waiting for the conf depth. - if sendState.IsWaitingForConfirmation() { - continue - } - // if the tx manager closed while we were waiting for the tx, give up - if m.closed.Load() { - m.txLogger(tx, false).Warn("TxManager closed, aborting transaction submission") - return nil, ErrClosed - } - tx = publishAndWait(tx, true) case <-ctx.Done(): return nil, ctx.Err() @@ -461,34 +593,34 @@ func (m *SimpleTxManager) sendTx(ctx context.Context, tx *types.Transaction) (*t // publishTx publishes the transaction to the transaction pool. If it receives any underpriced errors // it will bump the fees and retry. // Returns the latest fee bumped tx, and a boolean indicating whether the tx was sent or not -func (m *SimpleTxManager) publishTx(ctx context.Context, tx *types.Transaction, sendState *SendState, bumpFeesImmediately bool) (*types.Transaction, bool) { +func (m *SimpleTxManager) publishTx(ctx context.Context, tx *types.Transaction, sendState *SendState) (*types.Transaction, bool) { l := m.txLogger(tx, true) - l.Info("Publishing transaction") + l.Info("Publishing transaction", "tx", tx.Hash()) for { - // if the tx manager closed, give up without bumping fees or retrying - if m.closed.Load() { - l.Warn("TxManager closed, aborting transaction submission") - return tx, false - } - if bumpFeesImmediately { - newTx, err := m.increaseGasPrice(ctx, tx) - if err != nil { - l.Error("unable to increase gas", "err", err) + if sendState.bumpFees { + if newTx, err := m.increaseGasPrice(ctx, tx); err != nil { + l.Warn("unable to increase gas, will try to re-publish the tx", "err", err) m.metr.TxPublished("bump_failed") - return tx, false + // Even if we are unable to bump fees, we must still resubmit the transaction + // because a previously successfully published tx can get dropped from the + // mempool. If we don't try to resubmit it to either force a failure (eg. from + // nonce to low errors) or get it back into the mempool, we can end up waiting on + // it to get mined indefinitely. + } else { + if sendState.IsWaitingForConfirmation() { + // A previously published tx might get mined during the increaseGasPrice call + // above, in which case we can abort trying to replace it with a higher fee tx. + return tx, false + } + sendState.bumpCount++ + tx = newTx + l = m.txLogger(tx, true) + // Disable bumping fees again until the new transaction is successfully published, + // or we immediately get another underpriced error. + sendState.bumpFees = false } - tx = newTx - sendState.bumpCount++ - l = m.txLogger(tx, true) - } - bumpFeesImmediately = true // bump fees next loop - - if sendState.IsWaitingForConfirmation() { - // there is a chance the previous tx goes into "waiting for confirmation" state - // during the increaseGasPrice call; continue waiting rather than resubmit the tx - return tx, false } cCtx, cancel := context.WithTimeout(ctx, m.cfg.NetworkTimeout) @@ -498,12 +630,15 @@ func (m *SimpleTxManager) publishTx(ctx context.Context, tx *types.Transaction, if err == nil { m.metr.TxPublished("") - l.Info("Transaction successfully published") + l.Info("Transaction successfully published", "tx", tx.Hash()) + // Tx made it into the mempool, so we'll need a fee bump if we end up trying to replace + // it with another publish attempt. + sendState.bumpFees = true return tx, true } switch { - case errStringMatch(err, ErrAlreadyReserved): + case errStringMatch(err, txpool.ErrAlreadyReserved): // this can happen if, say, a blob transaction is stuck in the mempool and we try to // send a non-blob transaction (and vice-versa). l.Warn("txpool contains pending tx of incompatible type", "err", err) @@ -513,26 +648,33 @@ func (m *SimpleTxManager) publishTx(ctx context.Context, tx *types.Transaction, m.metr.TxPublished("nonce_too_low") case errStringMatch(err, context.Canceled): m.metr.RPCError() - l.Warn("transaction send cancelled", "err", err) - m.metr.TxPublished("context_cancelled") + l.Warn("transaction send canceled", "err", err) + m.metr.TxPublished("context_canceled") case errStringMatch(err, txpool.ErrAlreadyKnown): l.Warn("resubmitted already known transaction", "err", err) m.metr.TxPublished("tx_already_known") case errStringMatch(err, txpool.ErrReplaceUnderpriced): l.Warn("transaction replacement is underpriced", "err", err) m.metr.TxPublished("tx_replacement_underpriced") - continue // retry with fee bump + // retry tx with fee bump, unless we already just tried to bump them + if !sendState.bumpFees { + sendState.bumpFees = true + continue + } case errStringMatch(err, txpool.ErrUnderpriced): l.Warn("transaction is underpriced", "err", err) m.metr.TxPublished("tx_underpriced") - continue // retry with fee bump + // retry tx with fee bump, unless we already just tried to bump them + if !sendState.bumpFees { + sendState.bumpFees = true + continue + } default: m.metr.RPCError() l.Error("unable to publish transaction", "err", err) m.metr.TxPublished("unknown_error") } - // on non-underpriced error return immediately; will retry on next resubmission timeout return tx, false } } @@ -555,7 +697,7 @@ func (m *SimpleTxManager) waitForTx(ctx context.Context, tx *types.Transaction, } } -// waitMined waits for the transaction to be mined or for the context to be cancelled. +// waitMined waits for the transaction to be mined or for the context to be canceled. func (m *SimpleTxManager) waitMined(ctx context.Context, tx *types.Transaction, sendState *SendState) (*types.Receipt, error) { txHash := tx.Hash() queryTicker := time.NewTicker(m.cfg.ReceiptQueryInterval) @@ -639,7 +781,7 @@ func (m *SimpleTxManager) queryReceipt(ctx context.Context, txHash common.Hash, // multiple of the suggested values. func (m *SimpleTxManager) increaseGasPrice(ctx context.Context, tx *types.Transaction) (*types.Transaction, error) { m.txLogger(tx, true).Info("bumping gas price for transaction") - tip, baseFee, blobBaseFee, err := m.suggestGasPriceCaps(ctx) + tip, baseFee, blobBaseFee, err := m.SuggestGasPriceCaps(ctx) if err != nil { m.txLogger(tx, false).Warn("failed to get suggested gas tip and base fee", "err", err) return nil, err @@ -727,9 +869,9 @@ func (m *SimpleTxManager) increaseGasPrice(ctx context.Context, tx *types.Transa return signedTx, nil } -// suggestGasPriceCaps suggests what the new tip, base fee, and blob base fee should be based on -// the current L1 conditions. blobfee will be nil if 4844 is not yet active. -func (m *SimpleTxManager) suggestGasPriceCaps(ctx context.Context) (*big.Int, *big.Int, *big.Int, error) { +// SuggestGasPriceCaps suggests what the new tip, base fee, and blob base fee should be based on +// the current L1 conditions. `blobBaseFee` will be nil if 4844 is not yet active. +func (m *SimpleTxManager) SuggestGasPriceCaps(ctx context.Context) (*big.Int, *big.Int, *big.Int, error) { cCtx, cancel := context.WithTimeout(ctx, m.cfg.NetworkTimeout) defer cancel() tip, err := m.backend.SuggestGasTipCap(cCtx) @@ -754,13 +896,16 @@ func (m *SimpleTxManager) suggestGasPriceCaps(ctx context.Context) (*big.Int, *b m.metr.RecordTipCap(tip) // Enforce minimum base fee and tip cap - if minTipCap := m.cfg.MinTipCap; minTipCap != nil && tip.Cmp(minTipCap) == -1 { - m.l.Debug("Enforcing min tip cap", "minTipCap", m.cfg.MinTipCap, "origTipCap", tip) - tip = new(big.Int).Set(m.cfg.MinTipCap) + minTipCap := m.cfg.MinTipCap.Load() + minBaseFee := m.cfg.MinBaseFee.Load() + + if minTipCap != nil && tip.Cmp(minTipCap) == -1 { + m.l.Debug("Enforcing min tip cap", "minTipCap", minTipCap, "origTipCap", tip) + tip = new(big.Int).Set(minTipCap) } - if minBaseFee := m.cfg.MinBaseFee; minBaseFee != nil && baseFee.Cmp(minBaseFee) == -1 { - m.l.Debug("Enforcing min base fee", "minBaseFee", m.cfg.MinBaseFee, "origBaseFee", baseFee) - baseFee = new(big.Int).Set(m.cfg.MinBaseFee) + if minBaseFee != nil && baseFee.Cmp(minBaseFee) == -1 { + m.l.Debug("Enforcing min base fee", "minBaseFee", minBaseFee, "origBaseFee", baseFee) + baseFee = new(big.Int).Set(minBaseFee) } var blobFee *big.Int @@ -774,8 +919,10 @@ func (m *SimpleTxManager) suggestGasPriceCaps(ctx context.Context) (*big.Int, *b // checkLimits checks that the tip and baseFee have not increased by more than the configured multipliers // if FeeLimitThreshold is specified in config, any increase which stays under the threshold are allowed func (m *SimpleTxManager) checkLimits(tip, baseFee, bumpedTip, bumpedFee *big.Int) (errs error) { - threshold := m.cfg.FeeLimitThreshold - limit := big.NewInt(int64(m.cfg.FeeLimitMultiplier)) + threshold := m.cfg.FeeLimitThreshold.Load() + feeLimitMultiplier := m.cfg.FeeLimitMultiplier.Load() + + limit := big.NewInt(int64(feeLimitMultiplier)) maxTip := new(big.Int).Mul(tip, limit) maxFee := calcGasFeeCap(new(big.Int).Mul(baseFee, limit), maxTip) @@ -799,14 +946,17 @@ func (m *SimpleTxManager) checkLimits(tip, baseFee, bumpedTip, bumpedFee *big.In func (m *SimpleTxManager) checkBlobFeeLimits(blobBaseFee, bumpedBlobFee *big.Int) error { // If below threshold, don't apply multiplier limit. Note we use same threshold parameter here // used for non-blob fee limiting. - if thr := m.cfg.FeeLimitThreshold; thr != nil && thr.Cmp(bumpedBlobFee) == 1 { + feeLimitThreshold := m.cfg.FeeLimitThreshold.Load() + feeLimitMultiplier := m.cfg.FeeLimitMultiplier.Load() + + if feeLimitThreshold != nil && feeLimitThreshold.Cmp(bumpedBlobFee) == 1 { return nil } - maxBlobFee := new(big.Int).Mul(calcBlobFeeCap(blobBaseFee), big.NewInt(int64(m.cfg.FeeLimitMultiplier))) + maxBlobFee := new(big.Int).Mul(m.calcBlobFeeCap(blobBaseFee), big.NewInt(int64(feeLimitMultiplier))) if bumpedBlobFee.Cmp(maxBlobFee) > 0 { return fmt.Errorf( "bumped blob fee %v is over %dx multiple of the suggested value: %w", - bumpedBlobFee, m.cfg.FeeLimitMultiplier, ErrBlobFeeLimit) + bumpedBlobFee, feeLimitMultiplier, ErrBlobFeeLimit) } return nil } @@ -846,7 +996,7 @@ func updateFees(oldTip, oldFeeCap, newTip, newBaseFee *big.Int, isBlobTx bool, l return newTip, newFeeCap } else if newTip.Cmp(thresholdTip) >= 0 && newFeeCap.Cmp(thresholdFeeCap) < 0 { // Tip has gone up, but base fee is flat or down. - // TODO(CLI-3714): Do we need to recalculate the FC here? + // TODO: Do we need to recalculate the FC here? lgr.Debug("Using new tip and threshold feecap") return newTip, thresholdFeeCap } else if newTip.Cmp(thresholdTip) < 0 && newFeeCap.Cmp(thresholdFeeCap) >= 0 { @@ -856,7 +1006,7 @@ func updateFees(oldTip, oldFeeCap, newTip, newBaseFee *big.Int, isBlobTx bool, l return thresholdTip, calcGasFeeCap(newBaseFee, thresholdTip) } else { - // TODO(CLI-3713): Should we skip the bump in this case? + // TODO: Should we skip the bump in this case? lgr.Debug("Using threshold tip and threshold feecap") return thresholdTip, thresholdFeeCap } @@ -875,7 +1025,8 @@ func calcGasFeeCap(baseFee, gasTipCap *big.Int) *big.Int { // calcBlobFeeCap computes a suggested blob fee cap that is twice the current header's blob base fee // value, with a minimum value of minBlobTxFee. -func calcBlobFeeCap(blobBaseFee *big.Int) *big.Int { +func (m *SimpleTxManager) calcBlobFeeCap(blobBaseFee *big.Int) *big.Int { + minBlobTxFee := m.GetMinBlobFee() cap := new(big.Int).Mul(blobBaseFee, two) if cap.Cmp(minBlobTxFee) < 0 { cap.Set(minBlobTxFee) @@ -898,19 +1049,19 @@ func errStringMatch(err, target error) bool { func finishBlobTx(message *types.BlobTx, chainID, tip, fee, blobFee, value *big.Int) error { var o bool if message.ChainID, o = uint256.FromBig(chainID); o { - return fmt.Errorf("ChainID overflow") + return errors.New("ChainID overflow") } if message.GasTipCap, o = uint256.FromBig(tip); o { - return fmt.Errorf("GasTipCap overflow") + return errors.New("GasTipCap overflow") } if message.GasFeeCap, o = uint256.FromBig(fee); o { - return fmt.Errorf("GasFeeCap overflow") + return errors.New("GasFeeCap overflow") } if message.BlobFeeCap, o = uint256.FromBig(blobFee); o { - return fmt.Errorf("BlobFeeCap overflow") + return errors.New("BlobFeeCap overflow") } if message.Value, o = uint256.FromBig(value); o { - return fmt.Errorf("Value overflow") + return errors.New("Value overflow") } return nil } diff --git a/op-service/txmgr/txmgr_test.go b/op-service/txmgr/txmgr_test.go index 4a8cf1f26cf2..6bafa69464b6 100644 --- a/op-service/txmgr/txmgr_test.go +++ b/op-service/txmgr/txmgr_test.go @@ -17,6 +17,7 @@ import ( "github.com/ethereum/go-ethereum/common" "github.com/ethereum/go-ethereum/consensus/misc/eip4844" "github.com/ethereum/go-ethereum/core" + "github.com/ethereum/go-ethereum/core/txpool" "github.com/ethereum/go-ethereum/core/types" "github.com/ethereum/go-ethereum/crypto/kzg4844" "github.com/ethereum/go-ethereum/log" @@ -44,7 +45,7 @@ func testSendState() *SendState { // testHarness houses the necessary resources to test the SimpleTxManager. type testHarness struct { - cfg Config + cfg *Config mgr *SimpleTxManager backend *mockBackend gasPricer *gasPricer @@ -52,7 +53,7 @@ type testHarness struct { // newTestHarnessWithConfig initializes a testHarness with a specific // configuration. -func newTestHarnessWithConfig(t *testing.T, cfg Config) *testHarness { +func newTestHarnessWithConfig(t *testing.T, cfg *Config) *testHarness { g := newGasPricer(3) backend := newMockBackend(g) cfg.Backend = backend @@ -104,19 +105,23 @@ func (h testHarness) createBlobTxCandidate() TxCandidate { } } -func configWithNumConfs(numConfirmations uint64) Config { - return Config{ - ResubmissionTimeout: time.Second, +func configWithNumConfs(numConfirmations uint64) *Config { + cfg := Config{ ReceiptQueryInterval: 50 * time.Millisecond, NumConfirmations: numConfirmations, SafeAbortNonceTooLowCount: 3, - FeeLimitMultiplier: 5, TxNotInMempoolTimeout: 1 * time.Hour, Signer: func(ctx context.Context, from common.Address, tx *types.Transaction) (*types.Transaction, error) { return tx, nil }, From: common.Address{}, } + + cfg.ResubmissionTimeout.Store(int64(time.Second)) + cfg.FeeLimitMultiplier.Store(5) + cfg.MinBlobTxFee.Store(defaultMinBlobTxFee) + + return &cfg } type gasPricer struct { @@ -333,6 +338,27 @@ func (b *mockBackend) TransactionReceipt(ctx context.Context, txHash common.Hash func (b *mockBackend) Close() { } +type testSendVariantsFn func(ctx context.Context, h *testHarness, tx TxCandidate) (*types.Receipt, error) + +func testSendVariants(t *testing.T, testFn func(t *testing.T, send testSendVariantsFn)) { + t.Parallel() + + t.Run("Send", func(t *testing.T) { + testFn(t, func(ctx context.Context, h *testHarness, tx TxCandidate) (*types.Receipt, error) { + return h.mgr.Send(ctx, tx) + }) + }) + + t.Run("SendAsync", func(t *testing.T) { + testFn(t, func(ctx context.Context, h *testHarness, tx TxCandidate) (*types.Receipt, error) { + ch := make(chan SendResponse, 1) + h.mgr.SendAsync(ctx, tx, ch) + res := <-ch + return res.Receipt, res.Err + }) + }) +} + // TestTxMgrConfirmAtMinGasPrice asserts that Send returns the min gas price tx // if the tx is mined instantly. func TestTxMgrConfirmAtMinGasPrice(t *testing.T) { @@ -384,7 +410,7 @@ func TestTxMgrNeverConfirmCancel(t *testing.T) { } h.backend.setTxSender(sendTx) - ctx, cancel := context.WithTimeout(context.Background(), 10*time.Second) + ctx, cancel := context.WithTimeout(context.Background(), 5*time.Second) defer cancel() receipt, err := h.mgr.sendTx(ctx, tx) @@ -392,6 +418,37 @@ func TestTxMgrNeverConfirmCancel(t *testing.T) { require.Nil(t, receipt) } +// TestTxMgrTxSendTimeout tests that the TxSendTimeout is respected when trying to send a +// transaction, even if NetworkTimeout expires first. +func TestTxMgrTxSendTimeout(t *testing.T) { + testSendVariants(t, func(t *testing.T, send testSendVariantsFn) { + conf := configWithNumConfs(1) + conf.TxSendTimeout = 3 * time.Second + conf.NetworkTimeout = 1 * time.Second + + h := newTestHarnessWithConfig(t, conf) + + txCandidate := h.createTxCandidate() + sendCount := 0 + sendTx := func(ctx context.Context, tx *types.Transaction) error { + sendCount++ + <-ctx.Done() + return context.DeadlineExceeded + } + h.backend.setTxSender(sendTx) + + ctx, cancel := context.WithTimeout(context.Background(), time.Hour) + defer cancel() + + receipt, err := send(ctx, h, txCandidate) + require.ErrorIs(t, err, context.DeadlineExceeded) + // Because network timeout is much shorter than send timeout, we should see multiple send attempts + // before the overall send fails. + require.Greater(t, sendCount, 1) + require.Nil(t, receipt) + }) +} + // TestAlreadyReserved tests that AlreadyReserved error results in immediate abort of transaction // sending. func TestAlreadyReserved(t *testing.T) { @@ -399,14 +456,14 @@ func TestAlreadyReserved(t *testing.T) { h := newTestHarnessWithConfig(t, conf) sendTx := func(ctx context.Context, tx *types.Transaction) error { - return ErrAlreadyReserved + return txpool.ErrAlreadyReserved } h.backend.setTxSender(sendTx) _, err := h.mgr.Send(context.Background(), TxCandidate{ To: &common.Address{}, }) - require.ErrorIs(t, err, ErrAlreadyReserved) + require.ErrorIs(t, err, txpool.ErrAlreadyReserved) } // TestTxMgrConfirmsAtHigherGasPrice asserts that Send properly returns the max gas @@ -546,7 +603,7 @@ func TestTxMgr_CraftBlobTx(t *testing.T) { // Validate the gas tip cap and fee cap. require.Equal(t, gasTipCap, tx.GasTipCap()) require.Equal(t, gasFeeCap, tx.GasFeeCap()) - require.Equal(t, minBlobTxFee, tx.BlobGasFeeCap()) + require.Equal(t, defaultMinBlobTxFee, tx.BlobGasFeeCap()) // Validate the nonce was set correctly using the backend. require.Equal(t, uint64(startingNonce), tx.Nonce()) @@ -563,7 +620,7 @@ func TestTxMgr_CraftBlobTx(t *testing.T) { // verify the blobs for i := range sidecar.Blobs { - require.NoError(t, kzg4844.VerifyBlobProof(sidecar.Blobs[i], sidecar.Commitments[i], sidecar.Proofs[i])) + require.NoError(t, kzg4844.VerifyBlobProof(&sidecar.Blobs[i], sidecar.Commitments[i], sidecar.Proofs[i])) } b1 := eth.Blob(sidecar.Blobs[0]) d1, err := b1.ToData() @@ -612,7 +669,7 @@ func TestTxMgr_EstimateGasFails(t *testing.T) { lastNonce := tx.Nonce() // Mock gas estimation failure. - h.gasPricer.err = fmt.Errorf("execution error") + h.gasPricer.err = errors.New("execution error") _, err = h.mgr.craftTx(context.Background(), candidate) require.ErrorContains(t, err, "failed to estimate gas") @@ -629,7 +686,7 @@ func TestTxMgr_SigningFails(t *testing.T) { cfg := configWithNumConfs(1) cfg.Signer = func(ctx context.Context, from common.Address, tx *types.Transaction) (*types.Transaction, error) { if errorSigning { - return nil, fmt.Errorf("signer error") + return nil, errors.New("signer error") } else { return tx, nil } @@ -659,7 +716,7 @@ func TestTxMgr_SigningFails(t *testing.T) { // TestTxMgrOnlyOnePublicationSucceeds asserts that the tx manager will return a // receipt so long as at least one of the publications is able to succeed with a -// simulated rpc failure. +// simulated failure. func TestTxMgrOnlyOnePublicationSucceeds(t *testing.T) { t.Parallel() @@ -674,7 +731,7 @@ func TestTxMgrOnlyOnePublicationSucceeds(t *testing.T) { sendTx := func(ctx context.Context, tx *types.Transaction) error { // Fail all but the final attempt. if !h.gasPricer.shouldMine(tx.GasFeeCap()) { - return errRpcFailure + return txpool.ErrUnderpriced } txHash := tx.Hash() @@ -694,7 +751,7 @@ func TestTxMgrOnlyOnePublicationSucceeds(t *testing.T) { // TestTxMgrConfirmsMinGasPriceAfterBumping delays the mining of the initial tx // with the minimum gas price, and asserts that its receipt is returned even -// though if the gas price has been bumped in other goroutines. +// if the gas price has been bumped in other goroutines. func TestTxMgrConfirmsMinGasPriceAfterBumping(t *testing.T) { t.Parallel() @@ -726,6 +783,47 @@ func TestTxMgrConfirmsMinGasPriceAfterBumping(t *testing.T) { require.Equal(t, h.gasPricer.expGasFeeCap().Uint64(), receipt.GasUsed) } +// TestTxMgrRetriesUnbumpableTx tests that a tx whose fees cannot be bumped will still be +// re-published in case it had been dropped from the mempool. +func TestTxMgrRetriesUnbumpableTx(t *testing.T) { + t.Parallel() + + cfg := configWithNumConfs(1) + cfg.FeeLimitMultiplier.Store(1) // don't allow fees to be bumped over the suggested values + h := newTestHarnessWithConfig(t, cfg) + + // Make the fees unbumpable by starting with fees that will be WAY over the suggested values + gasTipCap, gasFeeCap, _ := h.gasPricer.feesForEpoch(100) + txToSend := types.NewTx(&types.DynamicFeeTx{ + GasTipCap: gasTipCap, + GasFeeCap: gasFeeCap, + }) + + sameTxPublishAttempts := 0 + sendTx := func(ctx context.Context, tx *types.Transaction) error { + // delay mining so several retries should be triggered + if tx.Hash().Cmp(txToSend.Hash()) == 0 { + sameTxPublishAttempts++ + } + if h.gasPricer.shouldMine(tx.GasFeeCap()) { + // delay mining to give it enough time for ~3 retries + time.AfterFunc(3*time.Second, func() { + txHash := tx.Hash() + h.backend.mine(&txHash, tx.GasFeeCap(), nil) + }) + } + return nil + } + h.backend.setTxSender(sendTx) + + ctx, cancel := context.WithTimeout(context.Background(), 10*time.Second) + defer cancel() + receipt, err := h.mgr.sendTx(ctx, txToSend) + require.NoError(t, err) + require.NotNil(t, receipt) + require.Greater(t, sameTxPublishAttempts, 1, "expected the original tx to be retried at least once") +} + // TestTxMgrDoesntAbortNonceTooLowAfterMiningTx func TestTxMgrDoesntAbortNonceTooLowAfterMiningTx(t *testing.T) { t.Parallel() @@ -791,21 +889,21 @@ func TestWaitMinedReturnsReceiptOnFirstSuccess(t *testing.T) { require.Equal(t, receipt.TxHash, txHash) } -// TestWaitMinedCanBeCanceled ensures that waitMined exits of the passed context +// TestWaitMinedCanBeCanceled ensures that waitMined exits if the passed context // is canceled before a receipt is found. func TestWaitMinedCanBeCanceled(t *testing.T) { t.Parallel() h := newTestHarness(t) - ctx, cancel := context.WithTimeout(context.Background(), 10*time.Second) + ctx, cancel := context.WithTimeout(context.Background(), 1*time.Second) defer cancel() // Create an unimined tx. tx := types.NewTx(&types.LegacyTx{}) receipt, err := h.mgr.waitMined(ctx, tx, NewSendState(10, time.Hour)) - require.Equal(t, err, context.DeadlineExceeded) + require.ErrorIs(t, err, context.DeadlineExceeded) require.Nil(t, receipt) } @@ -826,7 +924,7 @@ func TestWaitMinedMultipleConfs(t *testing.T) { h.backend.mine(&txHash, new(big.Int), nil) receipt, err := h.mgr.waitMined(ctx, tx, NewSendState(10, time.Hour)) - require.Equal(t, err, context.DeadlineExceeded) + require.ErrorIs(t, err, context.DeadlineExceeded) require.Nil(t, receipt) ctx, cancel = context.WithTimeout(context.Background(), time.Second) @@ -854,7 +952,11 @@ func TestManagerErrsOnZeroCLIConfs(t *testing.T) { func TestManagerErrsOnZeroConfs(t *testing.T) { t.Parallel() - _, err := NewSimpleTxManagerFromConfig("TEST", testlog.Logger(t, log.LevelCrit), &metrics.NoopTxMetrics{}, Config{}) + cfg := Config{ + NumConfirmations: 0, + } + + _, err := NewSimpleTxManagerFromConfig("TEST", testlog.Logger(t, log.LevelCrit), &metrics.NoopTxMetrics{}, &cfg) require.Error(t, err) } @@ -948,13 +1050,16 @@ func TestWaitMinedReturnsReceiptAfterFailure(t *testing.T) { var borkedBackend failingBackend + cfg := Config{ + ReceiptQueryInterval: 50 * time.Millisecond, + NumConfirmations: 1, + SafeAbortNonceTooLowCount: 3, + } + cfg.ResubmissionTimeout.Store(int64(time.Second)) + cfg.MinBlobTxFee.Store(defaultMinBlobTxFee) + mgr := &SimpleTxManager{ - cfg: Config{ - ResubmissionTimeout: time.Second, - ReceiptQueryInterval: 50 * time.Millisecond, - NumConfirmations: 1, - SafeAbortNonceTooLowCount: 3, - }, + cfg: &cfg, name: "TEST", backend: &borkedBackend, l: testlog.Logger(t, log.LevelCrit), @@ -981,18 +1086,21 @@ func doGasPriceIncrease(t *testing.T, txTipCap, txFeeCap, newTip, newBaseFee int returnSuccessHeader: true, } - mgr := &SimpleTxManager{ - cfg: Config{ - ResubmissionTimeout: time.Second, - ReceiptQueryInterval: 50 * time.Millisecond, - NumConfirmations: 1, - SafeAbortNonceTooLowCount: 3, - FeeLimitMultiplier: 5, - Signer: func(ctx context.Context, from common.Address, tx *types.Transaction) (*types.Transaction, error) { - return tx, nil - }, - From: common.Address{}, + cfg := Config{ + ReceiptQueryInterval: 50 * time.Millisecond, + NumConfirmations: 1, + SafeAbortNonceTooLowCount: 3, + Signer: func(ctx context.Context, from common.Address, tx *types.Transaction) (*types.Transaction, error) { + return tx, nil }, + From: common.Address{}, + } + cfg.ResubmissionTimeout.Store(int64(time.Second)) + cfg.FeeLimitMultiplier.Store(5) + cfg.MinBlobTxFee.Store(defaultMinBlobTxFee) + + mgr := &SimpleTxManager{ + cfg: &cfg, name: "TEST", backend: &borkedBackend, l: testlog.Logger(t, log.LevelCrit), @@ -1151,19 +1259,22 @@ func testIncreaseGasPriceLimit(t *testing.T, lt gasPriceLimitTest) { returnSuccessHeader: true, } - mgr := &SimpleTxManager{ - cfg: Config{ - ResubmissionTimeout: time.Second, - ReceiptQueryInterval: 50 * time.Millisecond, - NumConfirmations: 1, - SafeAbortNonceTooLowCount: 3, - FeeLimitMultiplier: 5, - FeeLimitThreshold: lt.thr, - Signer: func(ctx context.Context, from common.Address, tx *types.Transaction) (*types.Transaction, error) { - return tx, nil - }, - From: common.Address{}, + cfg := Config{ + ReceiptQueryInterval: 50 * time.Millisecond, + NumConfirmations: 1, + SafeAbortNonceTooLowCount: 3, + Signer: func(ctx context.Context, from common.Address, tx *types.Transaction) (*types.Transaction, error) { + return tx, nil }, + From: common.Address{}, + } + cfg.ResubmissionTimeout.Store(int64(time.Second)) + cfg.FeeLimitMultiplier.Store(5) + cfg.FeeLimitThreshold.Store(lt.thr) + cfg.MinBlobTxFee.Store(defaultMinBlobTxFee) + + mgr := &SimpleTxManager{ + cfg: &cfg, name: "TEST", backend: &borkedBackend, l: testlog.Logger(t, log.LevelCrit), @@ -1236,40 +1347,42 @@ func TestErrStringMatch(t *testing.T) { } func TestNonceReset(t *testing.T) { - conf := configWithNumConfs(1) - conf.SafeAbortNonceTooLowCount = 1 - h := newTestHarnessWithConfig(t, conf) - - index := -1 - var nonces []uint64 - sendTx := func(ctx context.Context, tx *types.Transaction) error { - index++ - nonces = append(nonces, tx.Nonce()) - // fail every 3rd tx - if index%3 == 0 { - return core.ErrNonceTooLow + testSendVariants(t, func(t *testing.T, send testSendVariantsFn) { + conf := configWithNumConfs(1) + conf.SafeAbortNonceTooLowCount = 1 + h := newTestHarnessWithConfig(t, conf) + + index := -1 + var nonces []uint64 + sendTx := func(ctx context.Context, tx *types.Transaction) error { + index++ + nonces = append(nonces, tx.Nonce()) + // fail every 3rd tx + if index%3 == 0 { + return core.ErrNonceTooLow + } + txHash := tx.Hash() + h.backend.mine(&txHash, tx.GasFeeCap(), nil) + return nil } - txHash := tx.Hash() - h.backend.mine(&txHash, tx.GasFeeCap(), nil) - return nil - } - h.backend.setTxSender(sendTx) + h.backend.setTxSender(sendTx) - ctx := context.Background() - for i := 0; i < 8; i++ { - _, err := h.mgr.Send(ctx, TxCandidate{ - To: &common.Address{}, - }) - // expect every 3rd tx to fail - if i%3 == 0 { - require.Error(t, err) - } else { - require.NoError(t, err) + ctx := context.Background() + for i := 0; i < 8; i++ { + _, err := send(ctx, h, TxCandidate{ + To: &common.Address{}, + }) + // expect every 3rd tx to fail + if i%3 == 0 { + require.Error(t, err) + } else { + require.NoError(t, err) + } } - } - // internal nonce tracking should be reset to startingNonce value every 3rd tx - require.Equal(t, []uint64{1, 1, 2, 3, 1, 2, 3, 1}, nonces) + // internal nonce tracking should be reset to startingNonce value every 3rd tx + require.Equal(t, []uint64{1, 1, 2, 3, 1, 2, 3, 1}, nonces) + }) } func TestMinFees(t *testing.T) { @@ -1317,11 +1430,11 @@ func TestMinFees(t *testing.T) { t.Run(tt.desc, func(t *testing.T) { require := require.New(t) conf := configWithNumConfs(1) - conf.MinBaseFee = tt.minBaseFee - conf.MinTipCap = tt.minTipCap + conf.MinBaseFee.Store(tt.minBaseFee) + conf.MinTipCap.Store(tt.minTipCap) h := newTestHarnessWithConfig(t, conf) - tip, baseFee, _, err := h.mgr.suggestGasPriceCaps(context.TODO()) + tip, baseFee, _, err := h.mgr.SuggestGasPriceCaps(context.TODO()) require.NoError(err) if tt.expectMinBaseFee { @@ -1341,115 +1454,118 @@ func TestMinFees(t *testing.T) { // TestClose ensures that the tx manager will refuse new work and cancel any in progress func TestClose(t *testing.T) { - conf := configWithNumConfs(1) - conf.SafeAbortNonceTooLowCount = 100 - h := newTestHarnessWithConfig(t, conf) - - sendingSignal := make(chan struct{}) - - // Ensure the manager is not closed - require.False(t, h.mgr.closed.Load()) - - // sendTx will fail until it is called a retry-number of times - called := 0 - const retries = 4 - sendTx := func(ctx context.Context, tx *types.Transaction) (err error) { - called += 1 - // sendingSignal is used when the tx begins to be sent - if called == 1 { - sendingSignal <- struct{}{} - } - if called%retries == 0 { - txHash := tx.Hash() - h.backend.mine(&txHash, tx.GasFeeCap(), big.NewInt(1)) - } else { - time.Sleep(10 * time.Millisecond) - err = core.ErrNonceTooLow + testSendVariants(t, func(t *testing.T, send testSendVariantsFn) { + conf := configWithNumConfs(1) + h := newTestHarnessWithConfig(t, conf) + + sendingSignal := make(chan struct{}) + + // Ensure the manager is not closed + require.False(t, h.mgr.closed.Load()) + + // sendTx will fail until it is called a retry-number of times + called := 0 + const retries = 4 + sendTx := func(ctx context.Context, tx *types.Transaction) (err error) { + called += 1 + // sendingSignal is used when the tx begins to be sent + if called == 1 { + sendingSignal <- struct{}{} + } + if called%retries == 0 { + txHash := tx.Hash() + h.backend.mine(&txHash, tx.GasFeeCap(), big.NewInt(1)) + } else { + time.Sleep(10 * time.Millisecond) + err = errRpcFailure + } + return } - return - } - h.backend.setTxSender(sendTx) - - // on the first call, we don't use the sending signal but we still need to drain it - go func() { - <-sendingSignal - }() - // demonstrate that a tx is sent, even when it must retry repeatedly - ctx := context.Background() - _, err := h.mgr.Send(ctx, TxCandidate{ - To: &common.Address{}, - }) - require.NoError(t, err) - require.Equal(t, retries, called) - called = 0 - // Ensure the manager is *still* not closed - require.False(t, h.mgr.closed.Load()) - - // on the second call, we close the manager while the tx is in progress by consuming the sending signal - go func() { - <-sendingSignal - h.mgr.Close() - }() - // demonstrate that a tx will cancel if it is in progress when the manager is closed - _, err = h.mgr.Send(ctx, TxCandidate{ - To: &common.Address{}, - }) - require.ErrorIs(t, ErrClosed, err) - // confirm that the tx was canceled before it retried to completion - require.Less(t, called, retries) - require.True(t, h.mgr.closed.Load()) - called = 0 - - // demonstrate that new calls to Send will also fail when the manager is closed - // there should be no need to capture the sending signal here because the manager is already closed and will return immediately - _, err = h.mgr.Send(ctx, TxCandidate{ - To: &common.Address{}, + h.backend.setTxSender(sendTx) + + // on the first call, we don't use the sending signal but we still need to drain it + go func() { + <-sendingSignal + }() + // demonstrate that a tx is sent, even when it must retry repeatedly + ctx := context.Background() + _, err := send(ctx, h, TxCandidate{ + To: &common.Address{}, + }) + require.NoError(t, err) + require.Equal(t, retries, called) + called = 0 + // Ensure the manager is *still* not closed + require.False(t, h.mgr.closed.Load()) + + // on the second call, we close the manager while the tx is in progress by consuming the sending signal + go func() { + <-sendingSignal + h.mgr.Close() + }() + // demonstrate that a tx will cancel if it is in progress when the manager is closed + _, err = send(ctx, h, TxCandidate{ + To: &common.Address{}, + }) + require.ErrorIs(t, err, ErrClosed) + // confirm that the tx was canceled before it retried to completion + require.Less(t, called, retries) + require.True(t, h.mgr.closed.Load()) + called = 0 + + // demonstrate that new calls to Send will also fail when the manager is closed + // there should be no need to capture the sending signal here because the manager is already closed and will return immediately + _, err = send(ctx, h, TxCandidate{ + To: &common.Address{}, + }) + require.ErrorIs(t, err, ErrClosed) + // confirm that the tx was canceled before it ever made it to the backend + require.Equal(t, 0, called) }) - require.ErrorIs(t, ErrClosed, err) - // confirm that the tx was canceled before it ever made it to the backend - require.Equal(t, 0, called) } // TestCloseWaitingForConfirmation ensures that the tx manager will wait for confirmation of a tx in flight, even when closed func TestCloseWaitingForConfirmation(t *testing.T) { - // two confirmations required so that we can mine and not yet be fully confirmed - conf := configWithNumConfs(2) - h := newTestHarnessWithConfig(t, conf) - - // sendDone is a signal that the tx has been sent from the sendTx function - sendDone := make(chan struct{}) - // closeDone is a signal that the txmanager has closed - closeDone := make(chan struct{}) - - sendTx := func(ctx context.Context, tx *types.Transaction) error { - txHash := tx.Hash() - h.backend.mine(&txHash, tx.GasFeeCap(), big.NewInt(1)) - close(sendDone) - return nil - } - h.backend.setTxSender(sendTx) + testSendVariants(t, func(t *testing.T, send testSendVariantsFn) { + // two confirmations required so that we can mine and not yet be fully confirmed + conf := configWithNumConfs(2) + h := newTestHarnessWithConfig(t, conf) - // this goroutine will close the manager when the tx sending is complete - // the transaction is not yet confirmed, so the manager will wait for confirmation - go func() { - <-sendDone - h.mgr.Close() - close(closeDone) - }() - - // this goroutine will complete confirmation of the tx when the manager is closed - // by forcing this to happen after close, we are able to observe a closing manager waiting for confirmation - go func() { - <-closeDone - h.backend.mine(nil, nil, big.NewInt(1)) - }() + // sendDone is a signal that the tx has been sent from the sendTx function + sendDone := make(chan struct{}) + // closeDone is a signal that the txmanager has closed + closeDone := make(chan struct{}) - ctx := context.Background() - _, err := h.mgr.Send(ctx, TxCandidate{ - To: &common.Address{}, + sendTx := func(ctx context.Context, tx *types.Transaction) error { + txHash := tx.Hash() + h.backend.mine(&txHash, tx.GasFeeCap(), big.NewInt(1)) + close(sendDone) + return nil + } + h.backend.setTxSender(sendTx) + + // this goroutine will close the manager when the tx sending is complete + // the transaction is not yet confirmed, so the manager will wait for confirmation + go func() { + <-sendDone + h.mgr.Close() + close(closeDone) + }() + + // this goroutine will complete confirmation of the tx when the manager is closed + // by forcing this to happen after close, we are able to observe a closing manager waiting for confirmation + go func() { + <-closeDone + h.backend.mine(nil, nil, big.NewInt(1)) + }() + + ctx := context.Background() + _, err := send(ctx, h, TxCandidate{ + To: &common.Address{}, + }) + require.True(t, h.mgr.closed.Load()) + require.NoError(t, err) }) - require.True(t, h.mgr.closed.Load()) - require.NoError(t, err) } func TestMakeSidecar(t *testing.T) { @@ -1472,3 +1588,12 @@ func TestMakeSidecar(t *testing.T) { require.Equal(t, hashes[i], eth.KZGToVersionedHash(commit)) } } + +func TestSendAsyncUnbufferedChan(t *testing.T) { + conf := configWithNumConfs(2) + h := newTestHarnessWithConfig(t, conf) + + require.Panics(t, func() { + h.mgr.SendAsync(context.Background(), TxCandidate{}, make(chan SendResponse)) + }) +} diff --git a/op-service/util.go b/op-service/util.go index 0a51147fd7d8..5c42d3de5dde 100644 --- a/op-service/util.go +++ b/op-service/util.go @@ -4,14 +4,16 @@ import ( "context" "errors" "fmt" + "math/big" "os" - "os/signal" "path/filepath" "reflect" + "strconv" "strings" - "syscall" "time" + "github.com/ethereum-optimism/optimism/op-service/ctxinterrupt" + "github.com/ethereum/go-ethereum/common" "github.com/ethereum/go-ethereum/log" "github.com/urfave/cli/v2" @@ -86,37 +88,27 @@ func ParseAddress(address string) (common.Address, error) { return common.Address{}, fmt.Errorf("invalid address: %v", address) } -// CloseAction runs the function in the background, until it finishes or until it is closed by the user with an interrupt. -func CloseAction(fn func(ctx context.Context, shutdown <-chan struct{}) error) error { - stopped := make(chan error, 1) - shutdown := make(chan struct{}, 1) - - ctx, cancel := context.WithCancel(context.Background()) +// CloseAction runs the function in the background, until it finishes or until it is closed by the +// user with an interrupt. +func CloseAction(ctx context.Context, fn func(ctx context.Context) error) error { + ctx, stop := ctxinterrupt.WithSignalWaiter(ctx) + defer stop() + finished := make(chan error, 1) go func() { - stopped <- fn(ctx, shutdown) + finished <- fn(ctx) }() - doneCh := make(chan os.Signal, 1) - signal.Notify(doneCh, []os.Signal{ - os.Interrupt, - os.Kill, - syscall.SIGTERM, - syscall.SIGQUIT, - }...) - select { - case <-doneCh: - cancel() - shutdown <- struct{}{} - + case <-ctx.Done(): + // Stop catching interrupts. + stop() select { - case err := <-stopped: + case err := <-finished: return err case <-time.After(time.Second * 10): return errors.New("command action is unresponsive for more than 10 seconds... shutting down") } - case err := <-stopped: - cancel() + case err := <-finished: return err } } @@ -140,5 +132,34 @@ func FindMonorepoRoot(startDir string) (string, error) { } dir = parentDir } - return "", fmt.Errorf("monorepo root not found") + return "", errors.New("monorepo root not found") +} + +// Parse256BitChainID parses a 256-bit chain ID from a string. Chain IDs +// can be defined as either an integer or a hex string. If the string +// starts with "0x", it is treated as a hex string, otherwise it is +// treated as an integer string. +func Parse256BitChainID(in string) (common.Hash, error) { + var chainIDBig *big.Int + if strings.HasPrefix(in, "0x") { + in = strings.TrimPrefix(in, "0x") + var ok bool + chainIDBig, ok = new(big.Int).SetString(in, 16) + if !ok { + return common.Hash{}, fmt.Errorf("failed to parse chain ID %s", in) + } + } else { + inUint, err := strconv.ParseUint(in, 10, 64) + if err != nil { + return common.Hash{}, fmt.Errorf("failed to parse chain ID %s: %w", in, err) + } + + chainIDBig = new(big.Int).SetUint64(inUint) + } + + if chainIDBig.BitLen() > 256 { + return common.Hash{}, fmt.Errorf("chain ID %s is too large", in) + } + + return common.BigToHash(chainIDBig), nil } diff --git a/op-service/util_test.go b/op-service/util_test.go index 12d28f3b3414..940bb7001fc8 100644 --- a/op-service/util_test.go +++ b/op-service/util_test.go @@ -3,6 +3,8 @@ package op_service import ( "testing" + "github.com/ethereum/go-ethereum/common" + "github.com/stretchr/testify/require" "github.com/urfave/cli/v2" ) @@ -30,3 +32,57 @@ func TestValidateEnvVars(t *testing.T) { invalids := validateEnvVars("OP_BATCHER", provided, defined) require.ElementsMatch(t, invalids, []string{"OP_BATCHER_FAKE=false"}) } + +func TestParse256BitChainID(t *testing.T) { + tests := []struct { + name string + input string + expected common.Hash + err bool + }{ + { + name: "valid int", + input: "12345", + expected: common.Hash{30: 0x30, 31: 0x39}, + err: false, + }, + { + name: "invalid hash", + input: common.Hash{0x00: 0xff}.String(), + expected: common.Hash{0x00: 0xff}, + err: false, + }, + { + name: "hash overflow", + input: "0xff0000000000000000000000000000000000000000000000000000000000000000", + err: true, + }, + { + name: "number overflow", + // (2^256 - 1) + 1 + input: "115792089237316195423570985008687907853269984665640564039457584007913129639936", + err: true, + }, + { + name: "invalid hex", + input: "0xnope", + err: true, + }, + { + name: "invalid number", + input: "nope", + err: true, + }, + } + for _, tt := range tests { + t.Run(tt.name, func(t *testing.T) { + res, err := Parse256BitChainID(tt.input) + if tt.err { + require.Error(t, err) + } else { + require.NoError(t, err) + require.Equal(t, tt.expected, res) + } + }) + } +} diff --git a/op-heartbeat/.gitignore b/op-supervisor/.gitignore similarity index 100% rename from op-heartbeat/.gitignore rename to op-supervisor/.gitignore diff --git a/op-supervisor/Makefile b/op-supervisor/Makefile new file mode 100644 index 000000000000..de4f2d9d2612 --- /dev/null +++ b/op-supervisor/Makefile @@ -0,0 +1,23 @@ +GITCOMMIT ?= $(shell git rev-parse HEAD) +GITDATE ?= $(shell git show -s --format='%ct') +VERSION ?= v0.0.0 + +LDFLAGSSTRING +=-X main.GitCommit=$(GITCOMMIT) +LDFLAGSSTRING +=-X main.GitDate=$(GITDATE) +LDFLAGSSTRING +=-X main.Version=$(VERSION) +LDFLAGSSTRING +=-X main.Meta=$(VERSION_META) +LDFLAGS := -ldflags "$(LDFLAGSSTRING)" + +op-supervisor: + env GO111MODULE=on GOOS=$(TARGETOS) GOARCH=$(TARGETARCH) CGO_ENABLED=0 go build -v $(LDFLAGS) -o ./bin/op-supervisor ./cmd + +clean: + rm bin/op-supervisor + +test: + go test -v ./... + +.PHONY: \ + op-supervisor \ + clean \ + test diff --git a/op-supervisor/cmd/main.go b/op-supervisor/cmd/main.go new file mode 100644 index 000000000000..8e306bf9009d --- /dev/null +++ b/op-supervisor/cmd/main.go @@ -0,0 +1,57 @@ +package main + +import ( + "context" + "os" + + "github.com/ethereum-optimism/optimism/op-supervisor/config" + "github.com/urfave/cli/v2" + + "github.com/ethereum/go-ethereum/log" + + opservice "github.com/ethereum-optimism/optimism/op-service" + "github.com/ethereum-optimism/optimism/op-service/cliapp" + "github.com/ethereum-optimism/optimism/op-service/ctxinterrupt" + oplog "github.com/ethereum-optimism/optimism/op-service/log" + "github.com/ethereum-optimism/optimism/op-service/metrics/doc" + "github.com/ethereum-optimism/optimism/op-supervisor/flags" + "github.com/ethereum-optimism/optimism/op-supervisor/metrics" + "github.com/ethereum-optimism/optimism/op-supervisor/supervisor" +) + +var ( + Version = "v0.0.1" + GitCommit = "" + GitDate = "" +) + +func main() { + ctx := ctxinterrupt.WithSignalWaiterMain(context.Background()) + err := run(ctx, os.Args, fromConfig) + if err != nil { + log.Crit("Application failed", "message", err) + } +} + +func run(ctx context.Context, args []string, fn supervisor.MainFn) error { + oplog.SetupDefaults() + + app := cli.NewApp() + app.Flags = cliapp.ProtectFlags(flags.Flags) + app.Version = opservice.FormatVersion(Version, GitCommit, GitDate, "") + app.Name = "op-supervisor" + app.Usage = "op-supervisor monitors cross-L2 interop messaging" + app.Description = "The op-supervisor monitors cross-L2 interop messaging by pre-fetching events and then resolving the cross-L2 dependencies to answer safety queries." + app.Action = cliapp.LifecycleCmd(supervisor.Main(app.Version, fn)) + app.Commands = []*cli.Command{ + { + Name: "doc", + Subcommands: doc.NewSubcommands(metrics.NewMetrics("default")), + }, + } + return app.RunContext(ctx, args) +} + +func fromConfig(ctx context.Context, cfg *config.Config, logger log.Logger) (cliapp.Lifecycle, error) { + return supervisor.SupervisorFromConfig(ctx, cfg, logger) +} diff --git a/op-supervisor/cmd/main_test.go b/op-supervisor/cmd/main_test.go new file mode 100644 index 000000000000..6a463a81275a --- /dev/null +++ b/op-supervisor/cmd/main_test.go @@ -0,0 +1,130 @@ +package main + +import ( + "context" + "errors" + "fmt" + "testing" + + "github.com/ethereum-optimism/optimism/op-supervisor/config" + "github.com/stretchr/testify/require" + + "github.com/ethereum/go-ethereum/log" + + "github.com/ethereum-optimism/optimism/op-service/cliapp" +) + +var ( + ValidL2RPCs = []string{"http;//localhost:8545"} + ValidDatadir = "./supervisor_test_datadir" +) + +func TestLogLevel(t *testing.T) { + t.Run("RejectInvalid", func(t *testing.T) { + verifyArgsInvalid(t, "unknown level: foo", addRequiredArgs("--log.level=foo")) + }) + + for _, lvl := range []string{"trace", "debug", "info", "error", "crit"} { + lvl := lvl + t.Run("AcceptValid_"+lvl, func(t *testing.T) { + logger, _, err := dryRunWithArgs(addRequiredArgs("--log.level", lvl)) + require.NoError(t, err) + require.NotNil(t, logger) + }) + } +} + +func TestDefaultCLIOptionsMatchDefaultConfig(t *testing.T) { + cfg := configForArgs(t, addRequiredArgs()) + defaultCfgTempl := config.NewConfig(ValidL2RPCs, ValidDatadir) + defaultCfg := *defaultCfgTempl + defaultCfg.Version = Version + require.Equal(t, defaultCfg, *cfg) +} + +func TestL2RPCs(t *testing.T) { + t.Run("Required", func(t *testing.T) { + verifyArgsInvalid(t, "flag l2-rpcs is required", addRequiredArgsExcept("--l2-rpcs")) + }) + + t.Run("Valid", func(t *testing.T) { + url1 := "http://example.com:1234" + url2 := "http://foobar.com:1234" + cfg := configForArgs(t, addRequiredArgsExcept("--l2-rpcs", "--l2-rpcs="+url1+","+url2)) + require.Equal(t, []string{url1, url2}, cfg.L2RPCs) + }) +} + +func TestDatadir(t *testing.T) { + t.Run("Required", func(t *testing.T) { + verifyArgsInvalid(t, "flag datadir is required", addRequiredArgsExcept("--datadir")) + }) + + t.Run("Valid", func(t *testing.T) { + dir := "foo" + cfg := configForArgs(t, addRequiredArgsExcept("--datadir", "--datadir", dir)) + require.Equal(t, dir, cfg.Datadir) + }) +} + +func TestMockRun(t *testing.T) { + t.Run("Valid", func(t *testing.T) { + cfg := configForArgs(t, addRequiredArgs("--mock-run")) + require.Equal(t, true, cfg.MockRun) + }) +} + +func verifyArgsInvalid(t *testing.T, messageContains string, cliArgs []string) { + _, _, err := dryRunWithArgs(cliArgs) + require.ErrorContains(t, err, messageContains) +} + +func configForArgs(t *testing.T, cliArgs []string) *config.Config { + _, cfg, err := dryRunWithArgs(cliArgs) + require.NoError(t, err) + return cfg +} + +func dryRunWithArgs(cliArgs []string) (log.Logger, *config.Config, error) { + cfg := new(config.Config) + var logger log.Logger + fullArgs := append([]string{"op-supervisor"}, cliArgs...) + testErr := errors.New("dry-run") + err := run(context.Background(), fullArgs, func(ctx context.Context, config *config.Config, log log.Logger) (cliapp.Lifecycle, error) { + logger = log + cfg = config + return nil, testErr + }) + if errors.Is(err, testErr) { // expected error + err = nil + } + return logger, cfg, err +} + +func addRequiredArgs(args ...string) []string { + req := requiredArgs() + combined := toArgList(req) + return append(combined, args...) +} + +func addRequiredArgsExcept(name string, optionalArgs ...string) []string { + req := requiredArgs() + delete(req, name) + return append(toArgList(req), optionalArgs...) +} + +func toArgList(req map[string]string) []string { + var combined []string + for name, value := range req { + combined = append(combined, fmt.Sprintf("%s=%s", name, value)) + } + return combined +} + +func requiredArgs() map[string]string { + args := map[string]string{ + "--l2-rpcs": ValidL2RPCs[0], + "--datadir": ValidDatadir, + } + return args +} diff --git a/op-supervisor/config/config.go b/op-supervisor/config/config.go new file mode 100644 index 000000000000..dbf723d55d3b --- /dev/null +++ b/op-supervisor/config/config.go @@ -0,0 +1,58 @@ +package config + +import ( + "errors" + + 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" + oprpc "github.com/ethereum-optimism/optimism/op-service/rpc" +) + +var ( + ErrMissingL2RPC = errors.New("must specify at least one L2 RPC") + ErrMissingDatadir = errors.New("must specify datadir") +) + +type Config struct { + Version string + + LogConfig oplog.CLIConfig + MetricsConfig opmetrics.CLIConfig + PprofConfig oppprof.CLIConfig + RPC oprpc.CLIConfig + + // MockRun runs the service with a mock backend + MockRun bool + + L2RPCs []string + Datadir string +} + +func (c *Config) Check() error { + var result error + result = errors.Join(result, c.MetricsConfig.Check()) + result = errors.Join(result, c.PprofConfig.Check()) + result = errors.Join(result, c.RPC.Check()) + if len(c.L2RPCs) == 0 { + result = errors.Join(result, ErrMissingL2RPC) + } + if c.Datadir == "" { + result = errors.Join(result, ErrMissingDatadir) + } + return result +} + +// NewConfig creates a new config using default values whenever possible. +// Required options with no suitable default are passed as parameters. +func NewConfig(l2RPCs []string, datadir string) *Config { + return &Config{ + LogConfig: oplog.DefaultCLIConfig(), + MetricsConfig: opmetrics.DefaultCLIConfig(), + PprofConfig: oppprof.DefaultCLIConfig(), + RPC: oprpc.DefaultCLIConfig(), + MockRun: false, + L2RPCs: l2RPCs, + Datadir: datadir, + } +} diff --git a/op-supervisor/config/config_test.go b/op-supervisor/config/config_test.go new file mode 100644 index 000000000000..ef84e4be81bd --- /dev/null +++ b/op-supervisor/config/config_test.go @@ -0,0 +1,52 @@ +package config + +import ( + "testing" + + "github.com/ethereum-optimism/optimism/op-service/metrics" + "github.com/ethereum-optimism/optimism/op-service/oppprof" + "github.com/ethereum-optimism/optimism/op-service/rpc" + "github.com/stretchr/testify/require" +) + +func TestDefaultConfigIsValid(t *testing.T) { + cfg := validConfig() + require.NoError(t, cfg.Check()) +} + +func TestRequireL2RPC(t *testing.T) { + cfg := validConfig() + cfg.L2RPCs = []string{} + require.ErrorIs(t, cfg.Check(), ErrMissingL2RPC) +} + +func TestRequireDatadir(t *testing.T) { + cfg := validConfig() + cfg.Datadir = "" + require.ErrorIs(t, cfg.Check(), ErrMissingDatadir) +} + +func TestValidateMetricsConfig(t *testing.T) { + cfg := validConfig() + cfg.MetricsConfig.Enabled = true + cfg.MetricsConfig.ListenPort = -1 + require.ErrorIs(t, cfg.Check(), metrics.ErrInvalidPort) +} + +func TestValidatePprofConfig(t *testing.T) { + cfg := validConfig() + cfg.PprofConfig.ListenEnabled = true + cfg.PprofConfig.ListenPort = -1 + require.ErrorIs(t, cfg.Check(), oppprof.ErrInvalidPort) +} + +func TestValidateRPCConfig(t *testing.T) { + cfg := validConfig() + cfg.RPC.ListenPort = -1 + require.ErrorIs(t, cfg.Check(), rpc.ErrInvalidPort) +} + +func validConfig() *Config { + // Should be valid using only the required arguments passed in via the constructor. + return NewConfig([]string{"http://localhost:8545"}, "./supervisor_config_testdir") +} diff --git a/op-supervisor/flags/flags.go b/op-supervisor/flags/flags.go new file mode 100644 index 000000000000..1759381694ac --- /dev/null +++ b/op-supervisor/flags/flags.go @@ -0,0 +1,83 @@ +package flags + +import ( + "fmt" + + "github.com/ethereum-optimism/optimism/op-supervisor/config" + "github.com/urfave/cli/v2" + + 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/ethereum-optimism/optimism/op-service/oppprof" + oprpc "github.com/ethereum-optimism/optimism/op-service/rpc" +) + +const EnvVarPrefix = "OP_SUPERVISOR" + +func prefixEnvVars(name string) []string { + return opservice.PrefixEnvVar(EnvVarPrefix, name) +} + +var ( + L2RPCsFlag = &cli.StringSliceFlag{ + Name: "l2-rpcs", + Usage: "L2 RPC sources.", + EnvVars: prefixEnvVars("L2_RPCS"), + } + DataDirFlag = &cli.PathFlag{ + Name: "datadir", + Usage: "Directory to store data generated as part of responding to games", + EnvVars: prefixEnvVars("DATADIR"), + } + MockRunFlag = &cli.BoolFlag{ + Name: "mock-run", + Usage: "Mock run, no actual backend used, just presenting the service", + EnvVars: prefixEnvVars("MOCK_RUN"), + Hidden: true, // this is for testing only + } +) + +var requiredFlags = []cli.Flag{ + L2RPCsFlag, + DataDirFlag, +} + +var optionalFlags = []cli.Flag{ + MockRunFlag, +} + +func init() { + optionalFlags = append(optionalFlags, oprpc.CLIFlags(EnvVarPrefix)...) + optionalFlags = append(optionalFlags, oplog.CLIFlags(EnvVarPrefix)...) + optionalFlags = append(optionalFlags, opmetrics.CLIFlags(EnvVarPrefix)...) + optionalFlags = append(optionalFlags, oppprof.CLIFlags(EnvVarPrefix)...) + + Flags = append(Flags, requiredFlags...) + Flags = append(Flags, optionalFlags...) +} + +// Flags contains the list of configuration options available to the binary. +var Flags []cli.Flag + +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 +} + +func ConfigFromCLI(ctx *cli.Context, version string) *config.Config { + return &config.Config{ + Version: version, + LogConfig: oplog.ReadCLIConfig(ctx), + MetricsConfig: opmetrics.ReadCLIConfig(ctx), + PprofConfig: oppprof.ReadCLIConfig(ctx), + RPC: oprpc.ReadCLIConfig(ctx), + MockRun: ctx.Bool(MockRunFlag.Name), + L2RPCs: ctx.StringSlice(L2RPCsFlag.Name), + Datadir: ctx.Path(DataDirFlag.Name), + } +} diff --git a/op-supervisor/flags/flags_test.go b/op-supervisor/flags/flags_test.go new file mode 100644 index 000000000000..504d9c8644da --- /dev/null +++ b/op-supervisor/flags/flags_test.go @@ -0,0 +1,89 @@ +package flags + +import ( + "strings" + "testing" + + "github.com/stretchr/testify/require" + "github.com/urfave/cli/v2" + + opservice "github.com/ethereum-optimism/optimism/op-service" +) + +// TestOptionalFlagsDontSetRequired asserts that all flags deemed optional set +// the Required field to false. +func TestOptionalFlagsDontSetRequired(t *testing.T) { + for _, flag := range optionalFlags { + reqFlag, ok := flag.(cli.RequiredFlag) + require.True(t, ok) + require.False(t, reqFlag.IsRequired()) + } +} + +// TestUniqueFlags asserts that all flag names are unique, to avoid accidental conflicts between the many flags. +func TestUniqueFlags(t *testing.T) { + seenCLI := make(map[string]struct{}) + for _, flag := range Flags { + for _, name := range flag.Names() { + if _, ok := seenCLI[name]; ok { + t.Errorf("duplicate flag %s", name) + continue + } + seenCLI[name] = struct{}{} + } + } +} + +// TestBetaFlags test that all flags starting with "beta." have "BETA_" in the env var, and vice versa. +func TestBetaFlags(t *testing.T) { + for _, flag := range Flags { + envFlag, ok := flag.(interface { + GetEnvVars() []string + }) + if !ok || len(envFlag.GetEnvVars()) == 0 { // skip flags without env-var support + continue + } + name := flag.Names()[0] + envName := envFlag.GetEnvVars()[0] + if strings.HasPrefix(name, "beta.") { + require.Contains(t, envName, "BETA_", "%q flag must contain BETA in env var to match \"beta.\" flag name", name) + } + if strings.Contains(envName, "BETA_") { + require.True(t, strings.HasPrefix(name, "beta."), "%q flag must start with \"beta.\" in flag name to match \"BETA_\" env var", name) + } + } +} + +func TestHasEnvVar(t *testing.T) { + for _, flag := range Flags { + flag := flag + flagName := flag.Names()[0] + + t.Run(flagName, func(t *testing.T) { + envFlagGetter, ok := flag.(interface { + GetEnvVars() []string + }) + envFlags := envFlagGetter.GetEnvVars() + require.True(t, ok, "must be able to cast the flag to an EnvVar interface") + require.Equal(t, 1, len(envFlags), "flags should have exactly one env var") + }) + } +} + +func TestEnvVarFormat(t *testing.T) { + for _, flag := range Flags { + flag := flag + flagName := flag.Names()[0] + + t.Run(flagName, func(t *testing.T) { + envFlagGetter, ok := flag.(interface { + GetEnvVars() []string + }) + envFlags := envFlagGetter.GetEnvVars() + require.True(t, ok, "must be able to cast the flag to an EnvVar interface") + require.Equal(t, 1, len(envFlags), "flags should have exactly one env var") + expectedEnvVar := opservice.FlagNameToEnvVarName(flagName, "OP_SUPERVISOR") + require.Equal(t, expectedEnvVar, envFlags[0]) + }) + } +} diff --git a/op-supervisor/metrics/metrics.go b/op-supervisor/metrics/metrics.go new file mode 100644 index 000000000000..e025d509ee28 --- /dev/null +++ b/op-supervisor/metrics/metrics.go @@ -0,0 +1,172 @@ +package metrics + +import ( + "github.com/ethereum-optimism/optimism/op-supervisor/supervisor/types" + "github.com/prometheus/client_golang/prometheus" + + opmetrics "github.com/ethereum-optimism/optimism/op-service/metrics" +) + +const Namespace = "op_supervisor" + +type Metricer interface { + RecordInfo(version string) + RecordUp() + + opmetrics.RPCMetricer + + CacheAdd(chainID types.ChainID, label string, cacheSize int, evicted bool) + CacheGet(chainID types.ChainID, label string, hit bool) + + RecordDBEntryCount(chainID types.ChainID, count int64) + RecordDBSearchEntriesRead(chainID types.ChainID, count int64) + + Document() []opmetrics.DocumentedMetric +} + +type Metrics struct { + ns string + registry *prometheus.Registry + factory opmetrics.Factory + + opmetrics.RPCMetrics + + CacheSizeVec *prometheus.GaugeVec + CacheGetVec *prometheus.CounterVec + CacheAddVec *prometheus.CounterVec + + DBEntryCountVec *prometheus.GaugeVec + DBSearchEntriesReadVec *prometheus.HistogramVec + + info prometheus.GaugeVec + up prometheus.Gauge +} + +var _ Metricer = (*Metrics)(nil) + +// implements the Registry getter, for metrics HTTP server to hook into +var _ opmetrics.RegistryMetricer = (*Metrics)(nil) + +func NewMetrics(procName string) *Metrics { + if procName == "" { + procName = "default" + } + ns := Namespace + "_" + procName + + registry := opmetrics.NewRegistry() + factory := opmetrics.With(registry) + + return &Metrics{ + ns: ns, + registry: registry, + factory: factory, + + RPCMetrics: opmetrics.MakeRPCMetrics(ns, factory), + + info: *factory.NewGaugeVec(prometheus.GaugeOpts{ + Namespace: ns, + Name: "info", + Help: "Pseudo-metric tracking version and config info", + }, []string{ + "version", + }), + up: factory.NewGauge(prometheus.GaugeOpts{ + Namespace: ns, + Name: "up", + Help: "1 if the op-supervisor has finished starting up", + }), + + CacheSizeVec: factory.NewGaugeVec(prometheus.GaugeOpts{ + Namespace: ns, + Name: "source_rpc_cache_size", + Help: "Source rpc cache cache size", + }, []string{ + "chain", + "type", + }), + CacheGetVec: factory.NewCounterVec(prometheus.CounterOpts{ + Namespace: ns, + Name: "source_rpc_cache_get", + Help: "Source rpc cache lookups, hitting or not", + }, []string{ + "chain", + "type", + "hit", + }), + CacheAddVec: factory.NewCounterVec(prometheus.CounterOpts{ + Namespace: ns, + Name: "source_rpc_cache_add", + Help: "Source rpc cache additions, evicting previous values or not", + }, []string{ + "chain", + "type", + "evicted", + }), + + DBEntryCountVec: factory.NewGaugeVec(prometheus.GaugeOpts{ + Namespace: ns, + Name: "logdb_entries_current", + Help: "Current number of entries in the log database by chain ID", + }, []string{ + "chain", + }), + DBSearchEntriesReadVec: factory.NewHistogramVec(prometheus.HistogramOpts{ + Namespace: ns, + Name: "logdb_search_entries_read", + Help: "Entries read per search of the log database", + Buckets: []float64{1, 2, 5, 10, 100, 200, 256}, + }, []string{ + "chain", + }), + } +} + +func (m *Metrics) Registry() *prometheus.Registry { + return m.registry +} + +func (m *Metrics) Document() []opmetrics.DocumentedMetric { + return m.factory.Document() +} + +// RecordInfo sets a pseudo-metric that contains versioning and config info for the op-supervisor. +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) +} + +func (m *Metrics) CacheAdd(chainID types.ChainID, label string, cacheSize int, evicted bool) { + chain := chainIDLabel(chainID) + m.CacheSizeVec.WithLabelValues(chain, label).Set(float64(cacheSize)) + if evicted { + m.CacheAddVec.WithLabelValues(chain, label, "true").Inc() + } else { + m.CacheAddVec.WithLabelValues(chain, label, "false").Inc() + } +} + +func (m *Metrics) CacheGet(chainID types.ChainID, label string, hit bool) { + chain := chainIDLabel(chainID) + if hit { + m.CacheGetVec.WithLabelValues(chain, label, "true").Inc() + } else { + m.CacheGetVec.WithLabelValues(chain, label, "false").Inc() + } +} + +func (m *Metrics) RecordDBEntryCount(chainID types.ChainID, count int64) { + m.DBEntryCountVec.WithLabelValues(chainIDLabel(chainID)).Set(float64(count)) +} + +func (m *Metrics) RecordDBSearchEntriesRead(chainID types.ChainID, count int64) { + m.DBSearchEntriesReadVec.WithLabelValues(chainIDLabel(chainID)).Observe(float64(count)) +} + +func chainIDLabel(chainID types.ChainID) string { + return chainID.String() +} diff --git a/op-supervisor/metrics/noop.go b/op-supervisor/metrics/noop.go new file mode 100644 index 000000000000..7fad61d4c15a --- /dev/null +++ b/op-supervisor/metrics/noop.go @@ -0,0 +1,23 @@ +package metrics + +import ( + opmetrics "github.com/ethereum-optimism/optimism/op-service/metrics" + "github.com/ethereum-optimism/optimism/op-supervisor/supervisor/types" +) + +type noopMetrics struct { + opmetrics.NoopRPCMetrics +} + +var NoopMetrics Metricer = new(noopMetrics) + +func (*noopMetrics) Document() []opmetrics.DocumentedMetric { return nil } + +func (*noopMetrics) RecordInfo(version string) {} +func (*noopMetrics) RecordUp() {} + +func (m *noopMetrics) CacheAdd(_ types.ChainID, _ string, _ int, _ bool) {} +func (m *noopMetrics) CacheGet(_ types.ChainID, _ string, _ bool) {} + +func (m *noopMetrics) RecordDBEntryCount(_ types.ChainID, _ int64) {} +func (m *noopMetrics) RecordDBSearchEntriesRead(_ types.ChainID, _ int64) {} diff --git a/op-supervisor/supervisor/backend/backend.go b/op-supervisor/supervisor/backend/backend.go new file mode 100644 index 000000000000..54b2f2eae20a --- /dev/null +++ b/op-supervisor/supervisor/backend/backend.go @@ -0,0 +1,264 @@ +package backend + +import ( + "context" + "errors" + "fmt" + "io" + "path/filepath" + "sync/atomic" + "time" + + "github.com/ethereum/go-ethereum/common" + "github.com/ethereum/go-ethereum/common/hexutil" + "github.com/ethereum/go-ethereum/log" + + "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-supervisor/config" + "github.com/ethereum-optimism/optimism/op-supervisor/supervisor/backend/db" + "github.com/ethereum-optimism/optimism/op-supervisor/supervisor/backend/db/heads" + "github.com/ethereum-optimism/optimism/op-supervisor/supervisor/backend/db/logs" + "github.com/ethereum-optimism/optimism/op-supervisor/supervisor/backend/source" + "github.com/ethereum-optimism/optimism/op-supervisor/supervisor/frontend" + "github.com/ethereum-optimism/optimism/op-supervisor/supervisor/types" +) + +type SupervisorBackend struct { + started atomic.Bool + logger log.Logger + m Metrics + dataDir string + + chainMonitors map[types.ChainID]*source.ChainMonitor + db *db.ChainsDB + + maintenanceCancel context.CancelFunc +} + +var _ frontend.Backend = (*SupervisorBackend)(nil) + +var _ io.Closer = (*SupervisorBackend)(nil) + +func NewSupervisorBackend(ctx context.Context, logger log.Logger, m Metrics, cfg *config.Config) (*SupervisorBackend, error) { + // attempt to prepare the data directory + if err := prepDataDir(cfg.Datadir); err != nil { + return nil, err + } + + // create the head tracker + headTracker, err := heads.NewHeadTracker(filepath.Join(cfg.Datadir, "heads.json")) + if err != nil { + return nil, fmt.Errorf("failed to load existing heads: %w", err) + } + + // create the chains db + db := db.NewChainsDB(map[types.ChainID]db.LogStorage{}, headTracker, logger) + + // create an empty map of chain monitors + chainMonitors := make(map[types.ChainID]*source.ChainMonitor, len(cfg.L2RPCs)) + + // create the supervisor backend + super := &SupervisorBackend{ + logger: logger, + m: m, + dataDir: cfg.Datadir, + chainMonitors: chainMonitors, + db: db, + } + + // from the RPC strings, have the supervisor backend create a chain monitor + // don't start the monitor yet, as we will start all monitors at once when Start is called + for _, rpc := range cfg.L2RPCs { + err := super.addFromRPC(ctx, logger, rpc, false) + if err != nil { + return nil, fmt.Errorf("failed to add chain monitor for rpc %v: %w", rpc, err) + } + } + return super, nil +} + +// addFromRPC adds a chain monitor to the supervisor backend from an rpc endpoint +// it does not expect to be called after the backend has been started +// it will start the monitor if shouldStart is true +func (su *SupervisorBackend) addFromRPC(ctx context.Context, logger log.Logger, rpc string, shouldStart bool) error { + // create the rpc client, which yields the chain id + rpcClient, chainID, err := createRpcClient(ctx, logger, rpc) + if err != nil { + return err + } + su.logger.Info("adding from rpc connection", "rpc", rpc, "chainID", chainID) + // create metrics and a logdb for the chain + cm := newChainMetrics(chainID, su.m) + path, err := prepLogDBPath(chainID, su.dataDir) + if err != nil { + return fmt.Errorf("failed to create datadir for chain %v: %w", chainID, err) + } + logDB, err := logs.NewFromFile(logger, cm, path, true) + if err != nil { + return fmt.Errorf("failed to create logdb for chain %v at %v: %w", chainID, path, err) + } + if su.chainMonitors[chainID] != nil { + return fmt.Errorf("chain monitor for chain %v already exists", chainID) + } + monitor, err := source.NewChainMonitor(ctx, logger, cm, chainID, rpc, rpcClient, su.db) + if err != nil { + return fmt.Errorf("failed to create monitor for rpc %v: %w", rpc, err) + } + // start the monitor if requested + if shouldStart { + if err := monitor.Start(); err != nil { + return fmt.Errorf("failed to start monitor for rpc %v: %w", rpc, err) + } + } + su.chainMonitors[chainID] = monitor + su.db.AddLogDB(chainID, logDB) + return nil +} + +func createRpcClient(ctx context.Context, logger log.Logger, rpc string) (client.RPC, types.ChainID, error) { + ethClient, err := dial.DialEthClientWithTimeout(ctx, 10*time.Second, logger, rpc) + if err != nil { + return nil, types.ChainID{}, fmt.Errorf("failed to connect to rpc %v: %w", rpc, err) + } + chainID, err := ethClient.ChainID(ctx) + if err != nil { + return nil, types.ChainID{}, fmt.Errorf("failed to load chain id for rpc %v: %w", rpc, err) + } + return client.NewBaseRPCClient(ethClient.Client()), types.ChainIDFromBig(chainID), nil +} + +func (su *SupervisorBackend) Start(ctx context.Context) error { + // ensure we only start once + if !su.started.CompareAndSwap(false, true) { + return errors.New("already started") + } + // initiate "ResumeFromLastSealedBlock" on the chains db, + // which rewinds the database to the last block that is guaranteed to have been fully recorded + if err := su.db.ResumeFromLastSealedBlock(); err != nil { + return fmt.Errorf("failed to resume chains db: %w", err) + } + // start chain monitors + for _, monitor := range su.chainMonitors { + if err := monitor.Start(); err != nil { + return fmt.Errorf("failed to start chain monitor: %w", err) + } + } + // start db maintenance loop + maintenanceCtx, cancel := context.WithCancel(context.Background()) + su.db.StartCrossHeadMaintenance(maintenanceCtx) + su.maintenanceCancel = cancel + return nil +} + +var errAlreadyStopped = errors.New("already stopped") + +func (su *SupervisorBackend) Stop(ctx context.Context) error { + if !su.started.CompareAndSwap(true, false) { + return errAlreadyStopped + } + // signal the maintenance loop to stop + su.maintenanceCancel() + // collect errors from stopping chain monitors + var errs error + for _, monitor := range su.chainMonitors { + if err := monitor.Stop(); err != nil { + errs = errors.Join(errs, fmt.Errorf("failed to stop chain monitor: %w", err)) + } + } + // close the database + if err := su.db.Close(); err != nil { + errs = errors.Join(errs, fmt.Errorf("failed to close database: %w", err)) + } + return errs +} + +func (su *SupervisorBackend) Close() error { + // TODO(protocol-quest#288): close logdb of all chains + return nil +} + +// AddL2RPC adds a new L2 chain to the supervisor backend +// it stops and restarts the backend to add the new chain +func (su *SupervisorBackend) AddL2RPC(ctx context.Context, rpc string) error { + // start the monitor immediately, as the backend is assumed to already be running + return su.addFromRPC(ctx, su.logger, rpc, true) +} + +func (su *SupervisorBackend) CheckMessage(identifier types.Identifier, payloadHash common.Hash) (types.SafetyLevel, error) { + chainID := identifier.ChainID + blockNum := identifier.BlockNumber + logIdx := identifier.LogIndex + i, err := su.db.Check(chainID, blockNum, uint32(logIdx), payloadHash) + if errors.Is(err, logs.ErrFuture) { + return types.Unsafe, nil + } + if errors.Is(err, logs.ErrConflict) { + return types.Invalid, nil + } + if err != nil { + return types.Invalid, fmt.Errorf("failed to check log: %w", err) + } + safest := types.CrossUnsafe + // at this point we have the log entry, and we can check if it is safe by various criteria + for _, checker := range []db.SafetyChecker{ + db.NewSafetyChecker(types.Unsafe, su.db), + db.NewSafetyChecker(types.Safe, su.db), + db.NewSafetyChecker(types.Finalized, su.db), + } { + if i <= checker.CrossHeadForChain(chainID) { + safest = checker.SafetyLevel() + } + } + return safest, nil +} + +func (su *SupervisorBackend) CheckMessages( + messages []types.Message, + minSafety types.SafetyLevel) error { + for _, msg := range messages { + safety, err := su.CheckMessage(msg.Identifier, msg.PayloadHash) + if err != nil { + return fmt.Errorf("failed to check message: %w", err) + } + if !safety.AtLeastAsSafe(minSafety) { + return fmt.Errorf("message %v (safety level: %v) does not meet the minimum safety %v", + msg.Identifier, + safety, + minSafety) + } + } + return nil +} + +// CheckBlock checks if the block is safe according to the safety level +// The block is considered safe if all logs in the block are safe +// this is decided by finding the last log in the block and +func (su *SupervisorBackend) CheckBlock(chainID *hexutil.U256, blockHash common.Hash, blockNumber hexutil.Uint64) (types.SafetyLevel, error) { + safest := types.CrossUnsafe + // find the last log index in the block + id := eth.BlockID{Hash: blockHash, Number: uint64(blockNumber)} + i, err := su.db.FindSealedBlock(types.ChainID(*chainID), id) + if errors.Is(err, logs.ErrFuture) { + return types.Unsafe, nil + } + if errors.Is(err, logs.ErrConflict) { + return types.Invalid, nil + } + if err != nil { + su.logger.Error("failed to scan block", "err", err) + return "", err + } + // at this point we have the extent of the block, and we can check if it is safe by various criteria + for _, checker := range []db.SafetyChecker{ + db.NewSafetyChecker(types.Unsafe, su.db), + db.NewSafetyChecker(types.Safe, su.db), + db.NewSafetyChecker(types.Finalized, su.db), + } { + if i <= checker.CrossHeadForChain(types.ChainID(*chainID)) { + safest = checker.SafetyLevel() + } + } + return safest, nil +} diff --git a/op-supervisor/supervisor/backend/chain_metrics.go b/op-supervisor/supervisor/backend/chain_metrics.go new file mode 100644 index 000000000000..e51dbabbd7a2 --- /dev/null +++ b/op-supervisor/supervisor/backend/chain_metrics.go @@ -0,0 +1,48 @@ +package backend + +import ( + "github.com/ethereum-optimism/optimism/op-service/sources/caching" + "github.com/ethereum-optimism/optimism/op-supervisor/supervisor/backend/db/logs" + "github.com/ethereum-optimism/optimism/op-supervisor/supervisor/types" +) + +type Metrics interface { + CacheAdd(chainID types.ChainID, label string, cacheSize int, evicted bool) + CacheGet(chainID types.ChainID, label string, hit bool) + + RecordDBEntryCount(chainID types.ChainID, count int64) + RecordDBSearchEntriesRead(chainID types.ChainID, count int64) +} + +// chainMetrics is an adapter between the metrics API expected by clients that assume there's only a single chain +// and the actual metrics implementation which requires a chain ID to identify the source chain. +type chainMetrics struct { + chainID types.ChainID + delegate Metrics +} + +func newChainMetrics(chainID types.ChainID, delegate Metrics) *chainMetrics { + return &chainMetrics{ + chainID: chainID, + delegate: delegate, + } +} + +func (c *chainMetrics) CacheAdd(label string, cacheSize int, evicted bool) { + c.delegate.CacheAdd(c.chainID, label, cacheSize, evicted) +} + +func (c *chainMetrics) CacheGet(label string, hit bool) { + c.delegate.CacheGet(c.chainID, label, hit) +} + +func (c *chainMetrics) RecordDBEntryCount(count int64) { + c.delegate.RecordDBEntryCount(c.chainID, count) +} + +func (c *chainMetrics) RecordDBSearchEntriesRead(count int64) { + c.delegate.RecordDBSearchEntriesRead(c.chainID, count) +} + +var _ caching.Metrics = (*chainMetrics)(nil) +var _ logs.Metrics = (*chainMetrics)(nil) diff --git a/op-supervisor/supervisor/backend/config.go b/op-supervisor/supervisor/backend/config.go new file mode 100644 index 000000000000..efe2f4463c91 --- /dev/null +++ b/op-supervisor/supervisor/backend/config.go @@ -0,0 +1,5 @@ +package backend + +type Config struct { + // TODO(protocol-quest#288): configure list of chains and their RPC endpoints / potential alternative data sources +} diff --git a/op-supervisor/supervisor/backend/db/db.go b/op-supervisor/supervisor/backend/db/db.go new file mode 100644 index 000000000000..184be4df76c1 --- /dev/null +++ b/op-supervisor/supervisor/backend/db/db.go @@ -0,0 +1,293 @@ +package db + +import ( + "context" + "errors" + "fmt" + "io" + "time" + + "github.com/ethereum/go-ethereum/common" + "github.com/ethereum/go-ethereum/log" + + "github.com/ethereum-optimism/optimism/op-service/eth" + "github.com/ethereum-optimism/optimism/op-supervisor/supervisor/backend/db/entrydb" + "github.com/ethereum-optimism/optimism/op-supervisor/supervisor/backend/db/heads" + "github.com/ethereum-optimism/optimism/op-supervisor/supervisor/backend/db/logs" + "github.com/ethereum-optimism/optimism/op-supervisor/supervisor/types" +) + +var ( + ErrUnknownChain = errors.New("unknown chain") +) + +type LogStorage interface { + io.Closer + + AddLog(logHash common.Hash, parentBlock eth.BlockID, + logIdx uint32, execMsg *types.ExecutingMessage) error + + SealBlock(parentHash common.Hash, block eth.BlockID, timestamp uint64) error + + Rewind(newHeadBlockNum uint64) error + + LatestSealedBlockNum() (n uint64, ok bool) + + // FindSealedBlock finds the requested block, to check if it exists, + // returning the next index after it where things continue from. + // returns ErrFuture if the block is too new to be able to tell + // returns ErrDifferent if the known block does not match + FindSealedBlock(block eth.BlockID) (nextEntry entrydb.EntryIdx, err error) + + IteratorStartingAt(i entrydb.EntryIdx) (logs.Iterator, error) + + // returns ErrConflict if the log does not match the canonical chain. + // returns ErrFuture if the log is out of reach. + // returns nil if the log is known and matches the canonical chain. + Contains(blockNum uint64, logIdx uint32, logHash common.Hash) (nextIndex entrydb.EntryIdx, err error) +} + +var _ LogStorage = (*logs.DB)(nil) + +type HeadsStorage interface { + Current() *heads.Heads + Apply(op heads.Operation) error +} + +// ChainsDB is a database that stores logs and heads for multiple chains. +// it implements the ChainsStorage interface. +type ChainsDB struct { + logDBs map[types.ChainID]LogStorage + heads HeadsStorage + maintenanceReady chan struct{} + logger log.Logger +} + +func NewChainsDB(logDBs map[types.ChainID]LogStorage, heads HeadsStorage, l log.Logger) *ChainsDB { + return &ChainsDB{ + logDBs: logDBs, + heads: heads, + logger: l, + maintenanceReady: make(chan struct{}, 1), + } +} + +func (db *ChainsDB) AddLogDB(chain types.ChainID, logDB LogStorage) { + if db.logDBs[chain] != nil { + log.Warn("overwriting existing logDB for chain", "chain", chain) + } + db.logDBs[chain] = logDB +} + +// ResumeFromLastSealedBlock prepares the chains db to resume recording events after a restart. +// It rewinds the database to the last block that is guaranteed to have been fully recorded to the database, +// to ensure it can resume recording from the first log of the next block. +func (db *ChainsDB) ResumeFromLastSealedBlock() error { + for chain, logStore := range db.logDBs { + headNum, ok := logStore.LatestSealedBlockNum() + if ok { + // db must be empty, nothing to rewind to + db.logger.Info("Resuming, but found no DB contents", "chain", chain) + continue + } + db.logger.Info("Resuming, starting from last sealed block", "head", headNum) + if err := logStore.Rewind(headNum); err != nil { + return fmt.Errorf("failed to rewind chain %s to sealed block %d", chain, headNum) + } + } + return nil +} + +// StartCrossHeadMaintenance starts a background process that maintains the cross-heads of the chains +// for now it does not prevent multiple instances of this process from running +func (db *ChainsDB) StartCrossHeadMaintenance(ctx context.Context) { + go func() { + db.logger.Info("cross-head maintenance loop started") + // run the maintenance loop every 1 seconds for now + ticker := time.NewTicker(time.Second * 1) + for { + select { + case <-ctx.Done(): + db.logger.Warn("context cancelled, stopping maintenance loop") + return + case <-ticker.C: + db.logger.Debug("regular maintenance requested") + db.RequestMaintenance() + case <-db.maintenanceReady: + db.logger.Debug("running maintenance") + if err := db.updateAllHeads(); err != nil { + db.logger.Error("failed to update cross-heads", "err", err) + } + } + } + }() +} + +// Check calls the underlying logDB to determine if the given log entry is safe with respect to the checker's criteria. +func (db *ChainsDB) Check(chain types.ChainID, blockNum uint64, logIdx uint32, logHash common.Hash) (entrydb.EntryIdx, error) { + logDB, ok := db.logDBs[chain] + if !ok { + return 0, fmt.Errorf("%w: %v", ErrUnknownChain, chain) + } + return logDB.Contains(blockNum, logIdx, logHash) +} + +// RequestMaintenance requests that the maintenance loop update the cross-heads +// it does not block if maintenance is already scheduled +func (db *ChainsDB) RequestMaintenance() { + select { + case db.maintenanceReady <- struct{}{}: + return + default: + return + } +} + +// updateAllHeads updates the cross-heads of all safety levels +// it is called by the maintenance loop +func (db *ChainsDB) updateAllHeads() error { + // create three safety checkers, one for each safety level + unsafeChecker := NewSafetyChecker(Unsafe, db) + safeChecker := NewSafetyChecker(Safe, db) + finalizedChecker := NewSafetyChecker(Finalized, db) + for _, checker := range []SafetyChecker{ + unsafeChecker, + safeChecker, + finalizedChecker} { + if err := db.UpdateCrossHeads(checker); err != nil { + return fmt.Errorf("failed to update cross-heads for safety level %v: %w", checker.Name(), err) + } + } + return nil +} + +// UpdateCrossHeadsForChain updates the cross-head for a single chain. +// the provided checker controls which heads are considered. +func (db *ChainsDB) UpdateCrossHeadsForChain(chainID types.ChainID, checker SafetyChecker) error { + // start with the xsafe head of the chain + xHead := checker.CrossHeadForChain(chainID) + // advance as far as the local head + localHead := checker.LocalHeadForChain(chainID) + // get an iterator for the last checkpoint behind the x-head + iter, err := db.logDBs[chainID].IteratorStartingAt(xHead) + if err != nil { + return fmt.Errorf("failed to rewind cross-safe head for chain %v: %w", chainID, err) + } + // track if we updated the cross-head + updated := false + // advance the logDB through all executing messages we can + // this loop will break: + // - when we reach the local head + // - when we reach a message that is not safe + // - if an error occurs + for { + if err := iter.NextExecMsg(); err == io.EOF { + break + } else if err != nil { + return fmt.Errorf("failed to read next executing message for chain %v: %w", chainID, err) + } + // if we would exceed the local head, then abort + if iter.NextIndex() > localHead { + xHead = localHead // clip to local head + updated = localHead != xHead + break + } + exec := iter.ExecMessage() + if exec == nil { + panic("expected executing message after traversing to one without error") + } + // use the checker to determine if this message is safe + safe := checker.Check( + types.ChainIDFromUInt64(uint64(exec.Chain)), + exec.BlockNum, + exec.LogIdx, + exec.Hash) + if !safe { + break + } + // if all is well, prepare the x-head update to this point + xHead = iter.NextIndex() + updated = true + } + // have the checker create an update to the x-head in question, and apply that update + err = db.heads.Apply(checker.Update(chainID, xHead)) + if err != nil { + return fmt.Errorf("failed to update cross-head for chain %v: %w", chainID, err) + } + // if any chain was updated, we can trigger a maintenance request + // this allows for the maintenance loop to handle cascading updates + // instead of waiting for the next scheduled update + if updated { + db.logger.Info("Promoting cross-head", "head", xHead, "safety-level", checker.SafetyLevel()) + db.RequestMaintenance() + } else { + db.logger.Info("No cross-head update", "head", xHead, "safety-level", checker.SafetyLevel()) + } + return nil +} + +// UpdateCrossHeads updates the cross-heads of all chains +// based on the provided SafetyChecker. The SafetyChecker is used to determine +// the safety of each log entry in the database, and the cross-head associated with it. +func (db *ChainsDB) UpdateCrossHeads(checker SafetyChecker) error { + for chainID := range db.logDBs { + err := db.UpdateCrossHeadsForChain(chainID, checker) + if err != nil { + return err + } + } + return nil +} + +func (db *ChainsDB) FindSealedBlock(chain types.ChainID, block eth.BlockID) (nextEntry entrydb.EntryIdx, err error) { + logDB, ok := db.logDBs[chain] + if !ok { + return 0, fmt.Errorf("%w: %v", ErrUnknownChain, chain) + } + return logDB.FindSealedBlock(block) +} + +// LatestBlockNum returns the latest fully-sealed block number that has been recorded to the logs db +// for the given chain. It does not contain safety guarantees. +// The block number might not be available (empty database, or non-existent chain). +func (db *ChainsDB) LatestBlockNum(chain types.ChainID) (num uint64, ok bool) { + logDB, knownChain := db.logDBs[chain] + if !knownChain { + return 0, false + } + return logDB.LatestSealedBlockNum() +} + +func (db *ChainsDB) SealBlock(chain types.ChainID, parentHash common.Hash, block eth.BlockID, timestamp uint64) error { + logDB, ok := db.logDBs[chain] + if !ok { + return fmt.Errorf("%w: %v", ErrUnknownChain, chain) + } + return logDB.SealBlock(parentHash, block, timestamp) +} + +func (db *ChainsDB) AddLog(chain types.ChainID, logHash common.Hash, parentBlock eth.BlockID, logIdx uint32, execMsg *types.ExecutingMessage) error { + logDB, ok := db.logDBs[chain] + if !ok { + return fmt.Errorf("%w: %v", ErrUnknownChain, chain) + } + return logDB.AddLog(logHash, parentBlock, logIdx, execMsg) +} + +func (db *ChainsDB) Rewind(chain types.ChainID, headBlockNum uint64) error { + logDB, ok := db.logDBs[chain] + if !ok { + return fmt.Errorf("%w: %v", ErrUnknownChain, chain) + } + return logDB.Rewind(headBlockNum) +} + +func (db *ChainsDB) Close() error { + var combined error + for id, logDB := range db.logDBs { + if err := logDB.Close(); err != nil { + combined = errors.Join(combined, fmt.Errorf("failed to close log db for chain %v: %w", id, err)) + } + } + return combined +} diff --git a/op-supervisor/supervisor/backend/db/db_test.go b/op-supervisor/supervisor/backend/db/db_test.go new file mode 100644 index 000000000000..e1da3c177b10 --- /dev/null +++ b/op-supervisor/supervisor/backend/db/db_test.go @@ -0,0 +1,449 @@ +package db + +import ( + "errors" + "io" + "math/rand" // nosemgrep + "testing" + + "github.com/stretchr/testify/require" + + "github.com/ethereum/go-ethereum/common" + "github.com/ethereum/go-ethereum/log" + + "github.com/ethereum-optimism/optimism/op-service/eth" + "github.com/ethereum-optimism/optimism/op-service/testlog" + "github.com/ethereum-optimism/optimism/op-supervisor/supervisor/backend/db/entrydb" + "github.com/ethereum-optimism/optimism/op-supervisor/supervisor/backend/db/heads" + "github.com/ethereum-optimism/optimism/op-supervisor/supervisor/backend/db/logs" + "github.com/ethereum-optimism/optimism/op-supervisor/supervisor/types" +) + +func TestChainsDB_AddLog(t *testing.T) { + t.Run("UnknownChain", func(t *testing.T) { + db := NewChainsDB(nil, &stubHeadStorage{}, testlog.Logger(t, log.LevelDebug)) + err := db.AddLog(types.ChainIDFromUInt64(2), common.Hash{}, eth.BlockID{}, 33, nil) + require.ErrorIs(t, err, ErrUnknownChain) + }) + + t.Run("KnownChain", func(t *testing.T) { + chainID := types.ChainIDFromUInt64(1) + logDB := &stubLogDB{} + db := NewChainsDB(map[types.ChainID]LogStorage{ + chainID: logDB, + }, &stubHeadStorage{}, testlog.Logger(t, log.LevelDebug)) + bl10 := eth.BlockID{Hash: common.Hash{0x10}, Number: 10} + err := db.SealBlock(chainID, common.Hash{0x9}, bl10, 1234) + require.NoError(t, err, err) + err = db.AddLog(chainID, common.Hash{}, bl10, 0, nil) + require.NoError(t, err, err) + require.Equal(t, 1, logDB.addLogCalls) + require.Equal(t, 1, logDB.sealBlockCalls) + }) +} + +func TestChainsDB_Rewind(t *testing.T) { + t.Run("UnknownChain", func(t *testing.T) { + db := NewChainsDB(nil, &stubHeadStorage{}, testlog.Logger(t, log.LevelDebug)) + err := db.Rewind(types.ChainIDFromUInt64(2), 42) + require.ErrorIs(t, err, ErrUnknownChain) + }) + + t.Run("KnownChain", func(t *testing.T) { + chainID := types.ChainIDFromUInt64(1) + logDB := &stubLogDB{} + db := NewChainsDB(map[types.ChainID]LogStorage{ + chainID: logDB, + }, &stubHeadStorage{}, + testlog.Logger(t, log.LevelDebug)) + err := db.Rewind(chainID, 23) + require.NoError(t, err, err) + require.EqualValues(t, 23, logDB.headBlockNum) + }) +} + +func TestChainsDB_UpdateCrossHeads(t *testing.T) { + // using a chainID of 1 for simplicity + chainID := types.ChainIDFromUInt64(1) + // get default stubbed components + logDB, checker, h := setupStubbedForUpdateHeads(chainID) + + checker.numSafe = 1 + xSafe := checker.crossHeadForChain + + // The ChainsDB is real, but uses only stubbed components + db := NewChainsDB( + map[types.ChainID]LogStorage{ + chainID: logDB}, + &stubHeadStorage{h}, + testlog.Logger(t, log.LevelDebug)) + + err := db.UpdateCrossHeads(checker) + require.NoError(t, err) + // found a safe executing message, and no new initiating messages + require.Equal(t, xSafe+1, checker.updated) +} + +func TestChainsDB_UpdateCrossHeadsBeyondLocal(t *testing.T) { + // using a chainID of 1 for simplicity + chainID := types.ChainIDFromUInt64(1) + // get default stubbed components + logDB, checker, h := setupStubbedForUpdateHeads(chainID) + // set the safety checker to pass 99 times, effectively allowing all messages to be safe + checker.numSafe = 99 + + startLocalSafe := checker.localHeadForChain + + // The ChainsDB is real, but uses only stubbed components + db := NewChainsDB( + map[types.ChainID]LogStorage{ + chainID: logDB}, + &stubHeadStorage{h}, + testlog.Logger(t, log.LevelDebug)) + + // Update cross-heads is expected to: + // 1. get a last checkpoint iterator from the logDB (stubbed to be at 15) + // 2. progress the iterator to repeatedly, as the safety check will pass 99 times. + // 3. exceed the local head, and update the cross-head to the local head (40) + err := db.UpdateCrossHeads(checker) + require.NoError(t, err) + require.Equal(t, startLocalSafe, checker.updated) +} + +func TestChainsDB_UpdateCrossHeadsEOF(t *testing.T) { + // using a chainID of 1 for simplicity + chainID := types.ChainIDFromUInt64(1) + // get default stubbed components + logDB, checker, h := setupStubbedForUpdateHeads(chainID) + // set the log DB to return an EOF error when trying to get the next executing message + // after processing 10 message (with more messages available to be safe) + logDB.nextLogs = logDB.nextLogs[:checker.crossHeadForChain+11] + // This is a legacy test, the local head is further than the DB content... + + checker.numSafe = 99 + + // The ChainsDB is real, but uses only stubbed components + db := NewChainsDB( + map[types.ChainID]LogStorage{ + chainID: logDB}, + &stubHeadStorage{h}, + testlog.Logger(t, log.LevelDebug)) + + // Update cross-heads is expected to: + // - process 10 logs as safe, 5 of which execute something + // - update cross-safe to what was there + err := db.UpdateCrossHeads(checker) + require.NoError(t, err) + require.Equal(t, checker.crossHeadForChain+11, checker.updated) +} + +func TestChainsDB_UpdateCrossHeadsError(t *testing.T) { + // using a chainID of 1 for simplicity + chainID := types.ChainIDFromUInt64(1) + // get default stubbed components + logDB, checker, h := setupStubbedForUpdateHeads(chainID) + // set the log DB to return an error when trying to get the next executing message + // after processing 3 messages as safe (with more messages available to be safe) + + executed := 0 + for i, e := range logDB.nextLogs { + if executed == 3 { + logDB.nextLogs[i].err = errors.New("some error") + } + if entrydb.EntryIdx(i) > checker.crossHeadForChain && e.execIdx >= 0 { + executed++ + } + } + + // everything is safe until error + checker.numSafe = 99 + + // The ChainsDB is real, but uses only stubbed components + db := NewChainsDB( + map[types.ChainID]LogStorage{ + chainID: logDB}, + &stubHeadStorage{h}, + testlog.Logger(t, log.LevelDebug)) + + // Update cross-heads is expected to: + // 1. get a last checkpoint iterator from the logDB (stubbed to be at 10) + // 2. fail during execution, even after processing 3 messages as safe + // 3. exit without updating, returning the error + err := db.UpdateCrossHeads(checker) + require.Error(t, err) + // the update was never set (aka 0-value) + require.Equal(t, entrydb.EntryIdx(0), checker.updated) +} + +// setupStubbedForUpdateHeads sets up stubbed components for testing the UpdateCrossHeads method +// it returns stubbed structs which are suitable for their interfaces, and can be modified before testing +// TODO: the variables at the top of this function should be configurable by the caller. +// this isn't an issue for now, as all tests can modify the stubbed components directly after calling this function. +// but readability and maintainability would be improved by making this function more configurable. +func setupStubbedForUpdateHeads(chainID types.ChainID) (*stubLogDB, *stubChecker, *heads.Heads) { + // the last known cross-safe head is at 20 + cross := entrydb.EntryIdx(20) + // the local head (the limit of the update) is at 40 + local := entrydb.EntryIdx(40) + // the number of executing messages to make available (this should be more than the number of safety checks performed) + numExecutingMessages := 30 + // number of safety checks that will pass before returning false + numSafe := 1 + + // set up stubbed logDB + logDB := &stubLogDB{} + + // set up stubbed executing messages that the ChainsDB can pass to the checker + logDB.executingMessages = []*types.ExecutingMessage{} + for i := 0; i < numExecutingMessages; i++ { + // executing messages are packed in groups of 3, with block numbers increasing by 1 + logDB.executingMessages = append(logDB.executingMessages, &types.ExecutingMessage{ + BlockNum: uint64(100 + int(i/3)), + LogIdx: uint32(i), + Hash: common.Hash{}, + }) + } + + rng := rand.New(rand.NewSource(123)) + blockNum := uint64(100) + logIndex := uint32(0) + executedCount := 0 + for i := entrydb.EntryIdx(0); i <= local; i++ { + var logHash common.Hash + rng.Read(logHash[:]) + + execIndex := -1 + // All the even messages have an executing message + if i%2 == 0 { + execIndex = rng.Intn(len(logDB.executingMessages)) + executedCount += 1 + } + var msgErr error + + logDB.nextLogs = append(logDB.nextLogs, nextLogResponse{ + blockNum: blockNum, + logIdx: logIndex, + evtHash: logHash, + err: msgErr, + execIdx: execIndex, + }) + } + + // set up stubbed checker + checker := &stubChecker{ + localHeadForChain: local, + crossHeadForChain: cross, + // the first safety check will return true, the second false + numSafe: numSafe, + } + + // set up stubbed heads with sample values + h := heads.NewHeads() + h.Chains[chainID] = heads.ChainHeads{} + + return logDB, checker, h +} + +type stubChecker struct { + localHeadForChain entrydb.EntryIdx + crossHeadForChain entrydb.EntryIdx + numSafe int + checkCalls int + updated entrydb.EntryIdx +} + +func (s *stubChecker) LocalHeadForChain(chainID types.ChainID) entrydb.EntryIdx { + return s.localHeadForChain +} + +func (s *stubChecker) Name() string { + return "stubChecker" +} + +func (s *stubChecker) CrossHeadForChain(chainID types.ChainID) entrydb.EntryIdx { + return s.crossHeadForChain +} + +// stubbed Check returns true for the first numSafe calls, and false thereafter +func (s *stubChecker) Check(chain types.ChainID, blockNum uint64, logIdx uint32, logHash common.Hash) bool { + if s.checkCalls >= s.numSafe { + return false + } + s.checkCalls++ + return true +} + +func (s *stubChecker) Update(chain types.ChainID, index entrydb.EntryIdx) heads.OperationFn { + s.updated = index + return func(heads *heads.Heads) error { + return nil + } +} + +func (s *stubChecker) SafetyLevel() types.SafetyLevel { + return types.CrossSafe +} + +type stubHeadStorage struct { + heads *heads.Heads +} + +func (s *stubHeadStorage) Apply(heads.Operation) error { + return nil +} + +func (s *stubHeadStorage) Current() *heads.Heads { + if s.heads == nil { + s.heads = heads.NewHeads() + } + return s.heads.Copy() +} + +type nextLogResponse struct { + blockNum uint64 + + logIdx uint32 + + evtHash common.Hash + + err error + + // -1 if not executing + execIdx int +} + +type stubIterator struct { + index entrydb.EntryIdx + + db *stubLogDB +} + +func (s *stubIterator) End() error { + return nil // only used for DB-loading. The stub is already loaded +} + +func (s *stubIterator) NextInitMsg() error { + s.index += 1 + if s.index >= entrydb.EntryIdx(len(s.db.nextLogs)) { + return io.EOF + } + e := s.db.nextLogs[s.index] + return e.err +} + +func (s *stubIterator) NextExecMsg() error { + for { + s.index += 1 + if s.index >= entrydb.EntryIdx(len(s.db.nextLogs)) { + return io.EOF + } + e := s.db.nextLogs[s.index] + if e.err != nil { + return e.err + } + if e.execIdx >= 0 { + return nil + } + } +} + +func (s *stubIterator) NextBlock() error { + panic("not yet supported") +} + +func (s *stubIterator) NextIndex() entrydb.EntryIdx { + return s.index + 1 +} + +func (s *stubIterator) SealedBlock() (hash common.Hash, num uint64, ok bool) { + panic("not yet supported") +} + +func (s *stubIterator) InitMessage() (hash common.Hash, logIndex uint32, ok bool) { + if s.index < 0 { + return common.Hash{}, 0, false + } + if s.index >= entrydb.EntryIdx(len(s.db.nextLogs)) { + return common.Hash{}, 0, false + } + e := s.db.nextLogs[s.index] + return e.evtHash, e.logIdx, true +} + +func (s *stubIterator) ExecMessage() *types.ExecutingMessage { + if s.index < 0 { + return nil + } + if s.index >= entrydb.EntryIdx(len(s.db.nextLogs)) { + return nil + } + e := s.db.nextLogs[s.index] + if e.execIdx < 0 { + return nil + } + return s.db.executingMessages[e.execIdx] +} + +var _ logs.Iterator = (*stubIterator)(nil) + +type stubLogDB struct { + addLogCalls int + sealBlockCalls int + headBlockNum uint64 + + executingMessages []*types.ExecutingMessage + nextLogs []nextLogResponse + + containsResponse containsResponse +} + +func (s *stubLogDB) AddLog(logHash common.Hash, parentBlock eth.BlockID, logIdx uint32, execMsg *types.ExecutingMessage) error { + s.addLogCalls++ + return nil +} + +func (s *stubLogDB) SealBlock(parentHash common.Hash, block eth.BlockID, timestamp uint64) error { + s.sealBlockCalls++ + return nil +} + +func (s *stubLogDB) LatestSealedBlockNum() (n uint64, ok bool) { + return s.headBlockNum, true +} + +func (s *stubLogDB) FindSealedBlock(block eth.BlockID) (nextEntry entrydb.EntryIdx, err error) { + panic("not implemented") +} + +func (s *stubLogDB) IteratorStartingAt(i entrydb.EntryIdx) (logs.Iterator, error) { + return &stubIterator{ + index: i - 1, + db: s, + }, nil +} + +var _ LogStorage = (*stubLogDB)(nil) + +type containsResponse struct { + index entrydb.EntryIdx + err error +} + +// stubbed Contains records the arguments passed to it +// it returns the response set in the struct, or an empty response +func (s *stubLogDB) Contains(blockNum uint64, logIdx uint32, logHash common.Hash) (nextIndex entrydb.EntryIdx, err error) { + return s.containsResponse.index, s.containsResponse.err +} + +func (s *stubLogDB) Rewind(newHeadBlockNum uint64) error { + s.headBlockNum = newHeadBlockNum + return nil +} + +func (s *stubLogDB) LatestBlockNum() uint64 { + return s.headBlockNum +} + +func (s *stubLogDB) Close() error { + return nil +} diff --git a/op-supervisor/supervisor/backend/db/entrydb/entry_db.go b/op-supervisor/supervisor/backend/db/entrydb/entry_db.go new file mode 100644 index 000000000000..a260d143ddb5 --- /dev/null +++ b/op-supervisor/supervisor/backend/db/entrydb/entry_db.go @@ -0,0 +1,200 @@ +package entrydb + +import ( + "errors" + "fmt" + "io" + "os" + + "github.com/ethereum/go-ethereum/log" +) + +const ( + EntrySize = 34 +) + +type EntryIdx int64 + +type Entry [EntrySize]byte + +func (entry Entry) Type() EntryType { + return EntryType(entry[0]) +} + +type EntryTypeFlag uint8 + +const ( + FlagSearchCheckpoint EntryTypeFlag = 1 << TypeSearchCheckpoint + FlagCanonicalHash EntryTypeFlag = 1 << TypeCanonicalHash + FlagInitiatingEvent EntryTypeFlag = 1 << TypeInitiatingEvent + FlagExecutingLink EntryTypeFlag = 1 << TypeExecutingLink + FlagExecutingCheck EntryTypeFlag = 1 << TypeExecutingCheck + FlagPadding EntryTypeFlag = 1 << TypePadding + // for additional padding + FlagPadding2 EntryTypeFlag = FlagPadding << 1 +) + +func (ex EntryTypeFlag) Any(v EntryTypeFlag) bool { + return ex&v != 0 +} + +func (ex *EntryTypeFlag) Add(v EntryTypeFlag) { + *ex = *ex | v +} + +func (ex *EntryTypeFlag) Remove(v EntryTypeFlag) { + *ex = *ex &^ v +} + +type EntryType uint8 + +const ( + TypeSearchCheckpoint EntryType = iota + TypeCanonicalHash + TypeInitiatingEvent + TypeExecutingLink + TypeExecutingCheck + TypePadding +) + +func (d EntryType) String() string { + switch d { + case TypeSearchCheckpoint: + return "searchCheckpoint" + case TypeCanonicalHash: + return "canonicalHash" + case TypeInitiatingEvent: + return "initiatingEvent" + case TypeExecutingLink: + return "executingLink" + case TypeExecutingCheck: + return "executingCheck" + case TypePadding: + return "padding" + default: + return fmt.Sprintf("unknown-%d", uint8(d)) + } +} + +// dataAccess defines a minimal API required to manipulate the actual stored data. +// It is a subset of the os.File API but could (theoretically) be satisfied by an in-memory implementation for testing. +type dataAccess interface { + io.ReaderAt + io.Writer + io.Closer + Truncate(size int64) error +} + +type EntryDB struct { + data dataAccess + lastEntryIdx EntryIdx + + cleanupFailedWrite bool +} + +// NewEntryDB creates an EntryDB. A new file will be created if the specified path does not exist, +// but parent directories will not be created. +// If the file exists it will be used as the existing data. +// Returns ErrRecoveryRequired if the existing file is not a valid entry db. A EntryDB is still returned but all +// operations will return ErrRecoveryRequired until the Recover method is called. +func NewEntryDB(logger log.Logger, path string) (*EntryDB, error) { + logger.Info("Opening entry database", "path", path) + file, err := os.OpenFile(path, os.O_RDWR|os.O_CREATE|os.O_APPEND, 0o644) + if err != nil { + return nil, fmt.Errorf("failed to open database at %v: %w", path, err) + } + info, err := file.Stat() + if err != nil { + return nil, fmt.Errorf("failed to stat database at %v: %w", path, err) + } + size := info.Size() / EntrySize + db := &EntryDB{ + data: file, + lastEntryIdx: EntryIdx(size - 1), + } + if size*EntrySize != info.Size() { + logger.Warn("File size is not a multiple of entry size. Truncating to last complete entry", "fileSize", size, "entrySize", EntrySize) + if err := db.recover(); err != nil { + return nil, fmt.Errorf("failed to recover database at %v: %w", path, err) + } + } + return db, nil +} + +func (e *EntryDB) Size() int64 { + return int64(e.lastEntryIdx) + 1 +} + +func (e *EntryDB) LastEntryIdx() EntryIdx { + return e.lastEntryIdx +} + +// Read an entry from the database by index. Returns io.EOF iff idx is after the last entry. +func (e *EntryDB) Read(idx EntryIdx) (Entry, error) { + if idx > e.lastEntryIdx { + return Entry{}, io.EOF + } + var out Entry + read, err := e.data.ReadAt(out[:], int64(idx)*EntrySize) + // Ignore io.EOF if we read the entire last entry as ReadAt may return io.EOF or nil when it reads the last byte + if err != nil && !(errors.Is(err, io.EOF) && read == EntrySize) { + return Entry{}, fmt.Errorf("failed to read entry %v: %w", idx, err) + } + return out, nil +} + +// Append entries to the database. +// The entries are combined in memory and passed to a single Write invocation. +// If the write fails, it will attempt to truncate any partially written data. +// Subsequent writes to this instance will fail until partially written data is truncated. +func (e *EntryDB) Append(entries ...Entry) error { + if e.cleanupFailedWrite { + // Try to rollback partially written data from a previous Append + if truncateErr := e.Truncate(e.lastEntryIdx); truncateErr != nil { + return fmt.Errorf("failed to recover from previous write error: %w", truncateErr) + } + } + data := make([]byte, 0, len(entries)*EntrySize) + for _, entry := range entries { + data = append(data, entry[:]...) + } + if n, err := e.data.Write(data); err != nil { + if n == 0 { + // Didn't write any data, so no recovery required + return err + } + // Try to rollback the partially written data + if truncateErr := e.Truncate(e.lastEntryIdx); truncateErr != nil { + // Failed to rollback, set a flag to attempt the clean up on the next write + e.cleanupFailedWrite = true + return errors.Join(err, fmt.Errorf("failed to remove partially written data: %w", truncateErr)) + } + // Successfully rolled back the changes, still report the failed write + return err + } + e.lastEntryIdx += EntryIdx(len(entries)) + return nil +} + +// Truncate the database so that the last retained entry is idx. Any entries after idx are deleted. +func (e *EntryDB) Truncate(idx EntryIdx) error { + if err := e.data.Truncate((int64(idx) + 1) * EntrySize); err != nil { + return fmt.Errorf("failed to truncate to entry %v: %w", idx, err) + } + // Update the lastEntryIdx cache + e.lastEntryIdx = idx + e.cleanupFailedWrite = false + return nil +} + +// recover an invalid database by truncating back to the last complete event. +func (e *EntryDB) recover() error { + if err := e.data.Truncate((e.Size()) * EntrySize); err != nil { + return fmt.Errorf("failed to truncate trailing partial entries: %w", err) + } + return nil +} + +func (e *EntryDB) Close() error { + return e.data.Close() +} diff --git a/op-supervisor/supervisor/backend/db/entrydb/entry_db_test.go b/op-supervisor/supervisor/backend/db/entrydb/entry_db_test.go new file mode 100644 index 000000000000..bc9a871bea26 --- /dev/null +++ b/op-supervisor/supervisor/backend/db/entrydb/entry_db_test.go @@ -0,0 +1,238 @@ +package entrydb + +import ( + "bytes" + "errors" + "io" + "os" + "path/filepath" + "testing" + + "github.com/ethereum-optimism/optimism/op-service/testlog" + "github.com/ethereum/go-ethereum/log" + "github.com/stretchr/testify/require" +) + +func TestReadWrite(t *testing.T) { + t.Run("BasicReadWrite", func(t *testing.T) { + db := createEntryDB(t) + require.EqualValues(t, 0, db.Size()) + require.NoError(t, db.Append(createEntry(1))) + require.EqualValues(t, 1, db.Size()) + require.NoError(t, db.Append(createEntry(2))) + require.EqualValues(t, 2, db.Size()) + require.NoError(t, db.Append(createEntry(3))) + require.EqualValues(t, 3, db.Size()) + require.NoError(t, db.Append(createEntry(4))) + require.EqualValues(t, 4, db.Size()) + + requireRead(t, db, 0, createEntry(1)) + requireRead(t, db, 1, createEntry(2)) + requireRead(t, db, 2, createEntry(3)) + requireRead(t, db, 3, createEntry(4)) + + // Check we can read out of order + requireRead(t, db, 1, createEntry(2)) + }) + + t.Run("ReadPastEndOfFileReturnsEOF", func(t *testing.T) { + db := createEntryDB(t) + _, err := db.Read(0) + require.ErrorIs(t, err, io.EOF) + }) + + t.Run("WriteMultiple", func(t *testing.T) { + db := createEntryDB(t) + require.NoError(t, db.Append(createEntry(1), createEntry(2), createEntry(3))) + require.EqualValues(t, 3, db.Size()) + requireRead(t, db, 0, createEntry(1)) + requireRead(t, db, 1, createEntry(2)) + requireRead(t, db, 2, createEntry(3)) + }) +} + +func TestTruncate(t *testing.T) { + t.Run("Partial", func(t *testing.T) { + db := createEntryDB(t) + require.NoError(t, db.Append(createEntry(1))) + require.NoError(t, db.Append(createEntry(2))) + require.NoError(t, db.Append(createEntry(3))) + require.NoError(t, db.Append(createEntry(4))) + require.NoError(t, db.Append(createEntry(5))) + require.EqualValues(t, 5, db.Size()) + + require.NoError(t, db.Truncate(3)) + require.EqualValues(t, 4, db.Size()) // 0, 1, 2 and 3 are preserved + requireRead(t, db, 0, createEntry(1)) + requireRead(t, db, 1, createEntry(2)) + requireRead(t, db, 2, createEntry(3)) + + // 4 and 5 have been removed + _, err := db.Read(4) + require.ErrorIs(t, err, io.EOF) + _, err = db.Read(5) + require.ErrorIs(t, err, io.EOF) + }) + + t.Run("Complete", func(t *testing.T) { + db := createEntryDB(t) + require.NoError(t, db.Append(createEntry(1))) + require.NoError(t, db.Append(createEntry(2))) + require.NoError(t, db.Append(createEntry(3))) + require.EqualValues(t, 3, db.Size()) + + require.NoError(t, db.Truncate(-1)) + require.EqualValues(t, 0, db.Size()) // All items are removed + _, err := db.Read(0) + require.ErrorIs(t, err, io.EOF) + }) + + t.Run("AppendAfterTruncate", func(t *testing.T) { + db := createEntryDB(t) + require.NoError(t, db.Append(createEntry(1))) + require.NoError(t, db.Append(createEntry(2))) + require.NoError(t, db.Append(createEntry(3))) + require.EqualValues(t, 3, db.Size()) + + require.NoError(t, db.Truncate(1)) + require.EqualValues(t, 2, db.Size()) + newEntry := createEntry(4) + require.NoError(t, db.Append(newEntry)) + entry, err := db.Read(2) + require.NoError(t, err) + require.Equal(t, newEntry, entry) + }) +} + +func TestTruncateTrailingPartialEntries(t *testing.T) { + logger := testlog.Logger(t, log.LvlInfo) + file := filepath.Join(t.TempDir(), "entries.db") + entry1 := createEntry(1) + entry2 := createEntry(2) + invalidData := make([]byte, len(entry1)+len(entry2)+4) + copy(invalidData, entry1[:]) + copy(invalidData[EntrySize:], entry2[:]) + invalidData[len(invalidData)-1] = 3 // Some invalid trailing data + require.NoError(t, os.WriteFile(file, invalidData, 0o644)) + db, err := NewEntryDB(logger, file) + require.NoError(t, err) + defer db.Close() + + // Should automatically truncate the file to remove trailing partial entries + require.EqualValues(t, 2, db.Size()) + stat, err := os.Stat(file) + require.NoError(t, err) + require.EqualValues(t, 2*EntrySize, stat.Size()) +} + +func TestWriteErrors(t *testing.T) { + expectedErr := errors.New("some error") + + t.Run("TruncatePartiallyWrittenData", func(t *testing.T) { + db, stubData := createEntryDBWithStubData() + stubData.writeErr = expectedErr + stubData.writeErrAfterBytes = 3 + err := db.Append(createEntry(1), createEntry(2)) + require.ErrorIs(t, err, expectedErr) + + require.EqualValues(t, 0, db.Size(), "should not consider entries written") + require.Len(t, stubData.data, 0, "should truncate written bytes") + }) + + t.Run("FailBeforeDataWritten", func(t *testing.T) { + db, stubData := createEntryDBWithStubData() + stubData.writeErr = expectedErr + stubData.writeErrAfterBytes = 0 + err := db.Append(createEntry(1), createEntry(2)) + require.ErrorIs(t, err, expectedErr) + + require.EqualValues(t, 0, db.Size(), "should not consider entries written") + require.Len(t, stubData.data, 0, "no data written") + }) + + t.Run("PartialWriteAndTruncateFails", func(t *testing.T) { + db, stubData := createEntryDBWithStubData() + stubData.writeErr = expectedErr + stubData.writeErrAfterBytes = EntrySize + 2 + stubData.truncateErr = errors.New("boom") + err := db.Append(createEntry(1), createEntry(2)) + require.ErrorIs(t, err, expectedErr) + + require.EqualValues(t, 0, db.Size(), "should not consider entries written") + require.Len(t, stubData.data, stubData.writeErrAfterBytes, "rollback failed") + + _, err = db.Read(0) + require.ErrorIs(t, err, io.EOF, "should not have first entry") + _, err = db.Read(1) + require.ErrorIs(t, err, io.EOF, "should not have second entry") + + // Should retry truncate on next write + stubData.writeErr = nil + stubData.truncateErr = nil + err = db.Append(createEntry(3)) + require.NoError(t, err) + actual, err := db.Read(0) + require.NoError(t, err) + require.Equal(t, createEntry(3), actual) + }) +} + +func requireRead(t *testing.T, db *EntryDB, idx EntryIdx, expected Entry) { + actual, err := db.Read(idx) + require.NoError(t, err) + require.Equal(t, expected, actual) +} + +func createEntry(i byte) Entry { + return Entry(bytes.Repeat([]byte{i}, EntrySize)) +} + +func createEntryDB(t *testing.T) *EntryDB { + logger := testlog.Logger(t, log.LvlInfo) + db, err := NewEntryDB(logger, filepath.Join(t.TempDir(), "entries.db")) + require.NoError(t, err) + t.Cleanup(func() { + require.NoError(t, db.Close()) + }) + return db +} + +func createEntryDBWithStubData() (*EntryDB, *stubDataAccess) { + stubData := &stubDataAccess{} + db := &EntryDB{data: stubData, lastEntryIdx: -1} + return db, stubData +} + +type stubDataAccess struct { + data []byte + writeErr error + writeErrAfterBytes int + truncateErr error +} + +func (s *stubDataAccess) ReadAt(p []byte, off int64) (n int, err error) { + return bytes.NewReader(s.data).ReadAt(p, off) +} + +func (s *stubDataAccess) Write(p []byte) (n int, err error) { + if s.writeErr != nil { + s.data = append(s.data, p[:s.writeErrAfterBytes]...) + return s.writeErrAfterBytes, s.writeErr + } + s.data = append(s.data, p...) + return len(p), nil +} + +func (s *stubDataAccess) Close() error { + return nil +} + +func (s *stubDataAccess) Truncate(size int64) error { + if s.truncateErr != nil { + return s.truncateErr + } + s.data = s.data[:size] + return nil +} + +var _ dataAccess = (*stubDataAccess)(nil) diff --git a/op-supervisor/supervisor/backend/db/heads/heads.go b/op-supervisor/supervisor/backend/db/heads/heads.go new file mode 100644 index 000000000000..7504806c0435 --- /dev/null +++ b/op-supervisor/supervisor/backend/db/heads/heads.go @@ -0,0 +1,70 @@ +package heads + +import ( + "encoding/json" + "errors" + "fmt" + "os" + "sync" + + "github.com/ethereum-optimism/optimism/op-service/ioutil" + "github.com/ethereum-optimism/optimism/op-service/jsonutil" +) + +// HeadTracker records the current chain head pointers for a single chain. +type HeadTracker struct { + rwLock sync.RWMutex + + path string + + current *Heads +} + +func NewHeadTracker(path string) (*HeadTracker, error) { + current := NewHeads() + if data, err := os.ReadFile(path); errors.Is(err, os.ErrNotExist) { + // No existing file, just use empty heads + } else if err != nil { + return nil, fmt.Errorf("failed to read existing heads from %v: %w", path, err) + } else { + if err := json.Unmarshal(data, current); err != nil { + return nil, fmt.Errorf("invalid existing heads file %v: %w", path, err) + } + } + return &HeadTracker{ + path: path, + current: current, + }, nil +} + +func (t *HeadTracker) Apply(op Operation) error { + t.rwLock.Lock() + defer t.rwLock.Unlock() + // Store a copy of the heads prior to changing so we can roll back if needed. + modified := t.current.Copy() + if err := op.Apply(modified); err != nil { + return fmt.Errorf("operation failed: %w", err) + } + if err := t.write(modified); err != nil { + return fmt.Errorf("failed to store updated heads: %w", err) + } + t.current = modified + return nil +} + +func (t *HeadTracker) Current() *Heads { + t.rwLock.RLock() + defer t.rwLock.RUnlock() + return t.current.Copy() +} + +func (t *HeadTracker) write(heads *Heads) error { + if err := jsonutil.WriteJSON(heads, ioutil.ToAtomicFile(t.path, 0o644)); err != nil { + return fmt.Errorf("failed to write new heads: %w", err) + } + return nil +} + +func (t *HeadTracker) Close() error { + return nil +} diff --git a/op-supervisor/supervisor/backend/db/heads/heads_test.go b/op-supervisor/supervisor/backend/db/heads/heads_test.go new file mode 100644 index 000000000000..0bcefdfb716b --- /dev/null +++ b/op-supervisor/supervisor/backend/db/heads/heads_test.go @@ -0,0 +1,101 @@ +package heads + +import ( + "errors" + "os" + "path/filepath" + "testing" + + "github.com/ethereum-optimism/optimism/op-supervisor/supervisor/types" + "github.com/stretchr/testify/require" +) + +func TestHeads_SaveAndReload(t *testing.T) { + dir := t.TempDir() + path := filepath.Join(dir, "heads.json") + chainA := types.ChainIDFromUInt64(3) + chainAHeads := ChainHeads{ + Unsafe: 1, + CrossUnsafe: 2, + LocalSafe: 3, + CrossSafe: 4, + LocalFinalized: 5, + CrossFinalized: 6, + } + chainB := types.ChainIDFromUInt64(5) + chainBHeads := ChainHeads{ + Unsafe: 11, + CrossUnsafe: 12, + LocalSafe: 13, + CrossSafe: 14, + LocalFinalized: 15, + CrossFinalized: 16, + } + + orig, err := NewHeadTracker(path) + require.NoError(t, err) + err = orig.Apply(OperationFn(func(heads *Heads) error { + heads.Put(chainA, chainAHeads) + heads.Put(chainB, chainBHeads) + return nil + })) + require.NoError(t, err) + require.Equal(t, orig.Current().Get(chainA), chainAHeads) + require.Equal(t, orig.Current().Get(chainB), chainBHeads) + + loaded, err := NewHeadTracker(path) + require.NoError(t, err) + require.EqualValues(t, loaded.Current(), orig.Current()) +} + +func TestHeads_NoChangesMadeIfOperationFails(t *testing.T) { + dir := t.TempDir() + path := filepath.Join(dir, "heads.json") + chainA := types.ChainIDFromUInt64(3) + chainAHeads := ChainHeads{ + Unsafe: 1, + CrossUnsafe: 2, + LocalSafe: 3, + CrossSafe: 4, + LocalFinalized: 5, + CrossFinalized: 6, + } + + orig, err := NewHeadTracker(path) + require.NoError(t, err) + boom := errors.New("boom") + err = orig.Apply(OperationFn(func(heads *Heads) error { + heads.Put(chainA, chainAHeads) + return boom + })) + require.ErrorIs(t, err, boom) + require.Equal(t, ChainHeads{}, orig.Current().Get(chainA)) + + // Should be able to load from disk too + loaded, err := NewHeadTracker(path) + require.NoError(t, err) + require.EqualValues(t, loaded.Current(), orig.Current()) +} + +func TestHeads_NoChangesMadeIfWriteFails(t *testing.T) { + dir := t.TempDir() + path := filepath.Join(dir, "invalid/heads.json") + chainA := types.ChainIDFromUInt64(3) + chainAHeads := ChainHeads{ + Unsafe: 1, + CrossUnsafe: 2, + LocalSafe: 3, + CrossSafe: 4, + LocalFinalized: 5, + CrossFinalized: 6, + } + + orig, err := NewHeadTracker(path) + require.NoError(t, err) + err = orig.Apply(OperationFn(func(heads *Heads) error { + heads.Put(chainA, chainAHeads) + return nil + })) + require.ErrorIs(t, err, os.ErrNotExist) + require.Equal(t, ChainHeads{}, orig.Current().Get(chainA)) +} diff --git a/op-supervisor/supervisor/backend/db/heads/types.go b/op-supervisor/supervisor/backend/db/heads/types.go new file mode 100644 index 000000000000..fb73dc464579 --- /dev/null +++ b/op-supervisor/supervisor/backend/db/heads/types.go @@ -0,0 +1,81 @@ +package heads + +import ( + "encoding/json" + + "github.com/ethereum-optimism/optimism/op-supervisor/supervisor/backend/db/entrydb" + "github.com/ethereum-optimism/optimism/op-supervisor/supervisor/types" + "github.com/ethereum/go-ethereum/common/hexutil" +) + +// ChainHeads provides the serialization format for the current chain heads. +// The values here could be block numbers or just the index of entries in the log db. +// If they're log db entries, we can't detect if things changed because of a reorg though (if the logdb write succeeded and head update failed). +// So we probably need to store actual block IDs here... but then we don't have the block hash for every block in the log db. +// Only jumping the head forward on checkpoint blocks doesn't work though... +type ChainHeads struct { + Unsafe entrydb.EntryIdx `json:"localUnsafe"` + CrossUnsafe entrydb.EntryIdx `json:"crossUnsafe"` + LocalSafe entrydb.EntryIdx `json:"localSafe"` + CrossSafe entrydb.EntryIdx `json:"crossSafe"` + LocalFinalized entrydb.EntryIdx `json:"localFinalized"` + CrossFinalized entrydb.EntryIdx `json:"crossFinalized"` +} + +type Heads struct { + Chains map[types.ChainID]ChainHeads +} + +func NewHeads() *Heads { + return &Heads{Chains: make(map[types.ChainID]ChainHeads)} +} + +func (h *Heads) Get(id types.ChainID) ChainHeads { + chain, ok := h.Chains[id] + if !ok { + return ChainHeads{} + } + return chain +} + +func (h *Heads) Put(id types.ChainID, head ChainHeads) { + h.Chains[id] = head +} + +func (h *Heads) Copy() *Heads { + c := &Heads{Chains: make(map[types.ChainID]ChainHeads)} + for id, heads := range h.Chains { + c.Chains[id] = heads + } + return c +} + +func (h Heads) MarshalJSON() ([]byte, error) { + data := make(map[hexutil.U256]ChainHeads) + for id, heads := range h.Chains { + data[hexutil.U256(id)] = heads + } + return json.Marshal(data) +} + +func (h *Heads) UnmarshalJSON(data []byte) error { + hexData := make(map[hexutil.U256]ChainHeads) + if err := json.Unmarshal(data, &hexData); err != nil { + return err + } + h.Chains = make(map[types.ChainID]ChainHeads) + for id, heads := range hexData { + h.Put(types.ChainID(id), heads) + } + return nil +} + +type Operation interface { + Apply(head *Heads) error +} + +type OperationFn func(heads *Heads) error + +func (f OperationFn) Apply(heads *Heads) error { + return f(heads) +} diff --git a/op-supervisor/supervisor/backend/db/heads/types_test.go b/op-supervisor/supervisor/backend/db/heads/types_test.go new file mode 100644 index 000000000000..bb79fc6fcd25 --- /dev/null +++ b/op-supervisor/supervisor/backend/db/heads/types_test.go @@ -0,0 +1,82 @@ +package heads + +import ( + "encoding/json" + "fmt" + "testing" + + "github.com/ethereum-optimism/optimism/op-supervisor/supervisor/types" + "github.com/stretchr/testify/require" +) + +func TestHeads(t *testing.T) { + t.Run("RoundTripViaJson", func(t *testing.T) { + heads := NewHeads() + heads.Put(types.ChainIDFromUInt64(3), ChainHeads{ + Unsafe: 10, + CrossUnsafe: 9, + LocalSafe: 8, + CrossSafe: 7, + LocalFinalized: 6, + CrossFinalized: 5, + }) + heads.Put(types.ChainIDFromUInt64(9), ChainHeads{ + Unsafe: 90, + CrossUnsafe: 80, + LocalSafe: 70, + CrossSafe: 60, + LocalFinalized: 50, + CrossFinalized: 40, + }) + heads.Put(types.ChainIDFromUInt64(4892497242424), ChainHeads{ + Unsafe: 1000, + CrossUnsafe: 900, + LocalSafe: 800, + CrossSafe: 700, + LocalFinalized: 600, + CrossFinalized: 400, + }) + + j, err := json.Marshal(heads) + require.NoError(t, err) + + fmt.Println(string(j)) + var result Heads + err = json.Unmarshal(j, &result) + require.NoError(t, err) + require.Equal(t, heads.Chains, result.Chains) + }) + + t.Run("Copy", func(t *testing.T) { + chainA := types.ChainIDFromUInt64(3) + chainB := types.ChainIDFromUInt64(4) + chainAOrigHeads := ChainHeads{ + Unsafe: 1, + } + chainAModifiedHeads1 := ChainHeads{ + Unsafe: 2, + } + chainAModifiedHeads2 := ChainHeads{ + Unsafe: 4, + } + chainBModifiedHeads := ChainHeads{ + Unsafe: 2, + } + + heads := NewHeads() + heads.Put(chainA, chainAOrigHeads) + + otherHeads := heads.Copy() + otherHeads.Put(chainA, chainAModifiedHeads1) + otherHeads.Put(chainB, chainBModifiedHeads) + + require.Equal(t, heads.Get(chainA), chainAOrigHeads) + require.Equal(t, heads.Get(chainB), ChainHeads{}) + + heads.Put(chainA, chainAModifiedHeads2) + require.Equal(t, heads.Get(chainA), chainAModifiedHeads2) + + require.Equal(t, otherHeads.Get(chainA), chainAModifiedHeads1) + require.Equal(t, otherHeads.Get(chainB), chainBModifiedHeads) + }) +} diff --git a/op-supervisor/supervisor/backend/db/logs/db.go b/op-supervisor/supervisor/backend/db/logs/db.go new file mode 100644 index 000000000000..61184318ece9 --- /dev/null +++ b/op-supervisor/supervisor/backend/db/logs/db.go @@ -0,0 +1,506 @@ +package logs + +import ( + "errors" + "fmt" + "io" + "sync" + + "github.com/ethereum/go-ethereum/common" + "github.com/ethereum/go-ethereum/common/hexutil" + "github.com/ethereum/go-ethereum/log" + + "github.com/ethereum-optimism/optimism/op-service/eth" + "github.com/ethereum-optimism/optimism/op-supervisor/supervisor/backend/db/entrydb" + "github.com/ethereum-optimism/optimism/op-supervisor/supervisor/types" +) + +const ( + searchCheckpointFrequency = 256 + eventFlagHasExecutingMessage = byte(1) +) + +var ( + // ErrLogOutOfOrder happens when you try to add a log to the DB, + // but it does not actually fit onto the latest data (by being too old or new). + ErrLogOutOfOrder = errors.New("log out of order") + // ErrDataCorruption happens when the underlying DB has some I/O issue + ErrDataCorruption = errors.New("data corruption") + // ErrSkipped happens when we try to retrieve data that is not available (pruned) + // It may also happen if we erroneously skip data, that was not considered a conflict, if the DB is corrupted. + ErrSkipped = errors.New("skipped data") + // ErrFuture happens when data is just not yet available + ErrFuture = errors.New("future data") + // ErrConflict happens when we know for sure that there is different canonical data + ErrConflict = errors.New("conflicting data") +) + +type Metrics interface { + RecordDBEntryCount(count int64) + RecordDBSearchEntriesRead(count int64) +} + +type EntryStore interface { + Size() int64 + LastEntryIdx() entrydb.EntryIdx + Read(idx entrydb.EntryIdx) (entrydb.Entry, error) + Append(entries ...entrydb.Entry) error + Truncate(idx entrydb.EntryIdx) error + Close() error +} + +// DB implements an append only database for log data and cross-chain dependencies. +// +// To keep the append-only format, reduce data size, and support reorg detection and registering of executing-messages: +// +// Use a fixed 24 bytes per entry. +// +// Data is an append-only log, that can be binary searched for any necessary event data. +type DB struct { + log log.Logger + m Metrics + store EntryStore + rwLock sync.RWMutex + + lastEntryContext logContext +} + +func NewFromFile(logger log.Logger, m Metrics, path string, trimToLastSealed bool) (*DB, error) { + store, err := entrydb.NewEntryDB(logger, path) + if err != nil { + return nil, fmt.Errorf("failed to open DB: %w", err) + } + return NewFromEntryStore(logger, m, store, trimToLastSealed) +} + +func NewFromEntryStore(logger log.Logger, m Metrics, store EntryStore, trimToLastSealed bool) (*DB, error) { + db := &DB{ + log: logger, + m: m, + store: store, + } + if err := db.init(trimToLastSealed); err != nil { + return nil, fmt.Errorf("failed to init database: %w", err) + } + return db, nil +} + +func (db *DB) lastEntryIdx() entrydb.EntryIdx { + return db.store.LastEntryIdx() +} + +func (db *DB) init(trimToLastSealed bool) error { + defer db.updateEntryCountMetric() // Always update the entry count metric after init completes + if trimToLastSealed { + if err := db.trimToLastSealed(); err != nil { + return fmt.Errorf("failed to trim invalid trailing entries: %w", err) + } + } + if db.lastEntryIdx() < 0 { + // Database is empty. + // Make a state that is ready to apply the genesis block on top of as first entry. + // This will infer into a checkpoint (half of the block seal here) + // and is then followed up with canonical-hash entry of genesis. + db.lastEntryContext = logContext{ + nextEntryIndex: 0, + blockHash: common.Hash{}, + blockNum: 0, + timestamp: 0, + logsSince: 0, + logHash: common.Hash{}, + execMsg: nil, + out: nil, + } + return nil + } + // start at the last checkpoint, + // and then apply any remaining changes on top, to hydrate the state. + lastCheckpoint := (db.lastEntryIdx() / searchCheckpointFrequency) * searchCheckpointFrequency + i := db.newIterator(lastCheckpoint) + i.current.need.Add(entrydb.FlagCanonicalHash) + if err := i.End(); err != nil { + return fmt.Errorf("failed to init from remaining trailing data: %w", err) + } + db.lastEntryContext = i.current + return nil +} + +func (db *DB) trimToLastSealed() error { + i := db.lastEntryIdx() + for ; i >= 0; i-- { + entry, err := db.store.Read(i) + if err != nil { + return fmt.Errorf("failed to read %v to check for trailing entries: %w", i, err) + } + if entry.Type() == entrydb.TypeCanonicalHash { + // only an executing hash, indicating a sealed block, is a valid point for restart + break + } + } + if i < db.lastEntryIdx() { + db.log.Warn("Truncating unexpected trailing entries", "prev", db.lastEntryIdx(), "new", i) + // trim such that the last entry is the canonical-hash we identified + return db.store.Truncate(i) + } + return nil +} + +func (db *DB) updateEntryCountMetric() { + db.m.RecordDBEntryCount(db.store.Size()) +} + +func (db *DB) IteratorStartingAt(i entrydb.EntryIdx) (Iterator, error) { + db.rwLock.RLock() + defer db.rwLock.RUnlock() + if i > db.lastEntryContext.nextEntryIndex { + return nil, ErrFuture + } + // TODO(#12031): Workaround while we not have IteratorStartingAt(heads.HeadPointer): + // scroll back from the index, to find block info. + idx := i + for ; idx >= 0; i-- { + entry, err := db.store.Read(idx) + if err != nil { + if errors.Is(err, io.EOF) { + continue // traverse to when we did have blocks + } + return nil, err + } + if entry.Type() == entrydb.TypeSearchCheckpoint { + break + } + if idx == 0 { + return nil, fmt.Errorf("empty DB, no block entry, cannot start at %d", i) + } + } + iter := db.newIterator(idx) + for iter.NextIndex() < i { + if _, err := iter.next(); err != nil { + return nil, errors.New("failed to process back up to the head pointer") + } + } + return iter, nil +} + +// FindSealedBlock finds the requested block, to check if it exists, +// returning the next index after it where things continue from. +// returns ErrFuture if the block is too new to be able to tell +// returns ErrDifferent if the known block does not match +func (db *DB) FindSealedBlock(block eth.BlockID) (nextEntry entrydb.EntryIdx, err error) { + db.rwLock.RLock() + defer db.rwLock.RUnlock() + iter, err := db.newIteratorAt(block.Number, 0) + if errors.Is(err, ErrFuture) { + return 0, fmt.Errorf("block %d is not known yet: %w", block.Number, ErrFuture) + } else if err != nil { + return 0, fmt.Errorf("failed to find sealed block %d: %w", block.Number, err) + } + h, _, ok := iter.SealedBlock() + if !ok { + panic("expected block") + } + if block.Hash != h { + return 0, fmt.Errorf("queried %s but got %s at number %d: %w", block.Hash, h, block.Number, ErrConflict) + } + return iter.NextIndex(), nil +} + +// LatestSealedBlockNum returns the block number of the block that was last sealed, +// or ok=false if there is no sealed block (i.e. empty DB) +func (db *DB) LatestSealedBlockNum() (n uint64, ok bool) { + db.rwLock.RLock() + defer db.rwLock.RUnlock() + if !db.lastEntryContext.hasCompleteBlock() { + if db.lastEntryContext.blockNum == 0 { + db.log.Debug("No DB contents yet") + } else { + db.log.Debug("New block is already in progress", "num", db.lastEntryContext.blockNum) + } + } + return db.lastEntryContext.blockNum, true +} + +// Get returns the hash of the log at the specified blockNum (of the sealed block) +// and logIdx (of the log after the block), or an error if the log is not found. +func (db *DB) Get(blockNum uint64, logIdx uint32) (common.Hash, error) { + db.rwLock.RLock() + defer db.rwLock.RUnlock() + hash, _, err := db.findLogInfo(blockNum, logIdx) + return hash, err +} + +// Contains returns no error iff the specified logHash is recorded in the specified blockNum and logIdx. +// If the log is out of reach, then ErrFuture is returned. +// If the log is determined to conflict with the canonical chain, then ErrConflict is returned. +// logIdx is the index of the log in the array of all logs in the block. +// This can be used to check the validity of cross-chain interop events. +func (db *DB) Contains(blockNum uint64, logIdx uint32, logHash common.Hash) (entrydb.EntryIdx, error) { + db.rwLock.RLock() + defer db.rwLock.RUnlock() + db.log.Trace("Checking for log", "blockNum", blockNum, "logIdx", logIdx, "hash", logHash) + + evtHash, iter, err := db.findLogInfo(blockNum, logIdx) + if err != nil { + return 0, err // may be ErrConflict if the block does not have as many logs + } + db.log.Trace("Found initiatingEvent", "blockNum", blockNum, "logIdx", logIdx, "hash", evtHash) + // Found the requested block and log index, check if the hash matches + if evtHash != logHash { + return 0, fmt.Errorf("payload hash mismatch: expected %s, got %s", logHash, evtHash) + } + return iter.NextIndex(), nil +} + +func (db *DB) findLogInfo(blockNum uint64, logIdx uint32) (common.Hash, Iterator, error) { + if blockNum == 0 { + return common.Hash{}, nil, ErrConflict // no logs in block 0 + } + // blockNum-1, such that we find a log that came after the parent num-1 was sealed. + // logIdx, such that all entries before logIdx can be skipped, but logIdx itself is still readable. + iter, err := db.newIteratorAt(blockNum-1, logIdx) + if errors.Is(err, ErrFuture) { + db.log.Trace("Could not find log yet", "blockNum", blockNum, "logIdx", logIdx) + return common.Hash{}, nil, err + } else if err != nil { + db.log.Error("Failed searching for log", "blockNum", blockNum, "logIdx", logIdx) + return common.Hash{}, nil, err + } + if err := iter.NextInitMsg(); err != nil { + return common.Hash{}, nil, fmt.Errorf("failed to read initiating message %d, on top of block %d: %w", logIdx, blockNum, err) + } + if _, x, ok := iter.SealedBlock(); !ok { + panic("expected block") + } else if x < blockNum-1 { + panic(fmt.Errorf("bug in newIteratorAt, expected to have found parent block %d but got %d", blockNum-1, x)) + } else if x > blockNum-1 { + return common.Hash{}, nil, fmt.Errorf("log does not exist, found next block already: %w", ErrConflict) + } + logHash, x, ok := iter.InitMessage() + if !ok { + panic("expected init message") + } else if x != logIdx { + panic(fmt.Errorf("bug in newIteratorAt, expected to have found log %d but got %d", logIdx, x)) + } + return logHash, iter, nil +} + +// newIteratorAt returns an iterator ready after the given sealed block number, +// and positioned such that the next log-read on the iterator return the log with logIndex, if any. +// It may return an ErrNotFound if the block number is unknown, +// or if there are just not that many seen log events after the block as requested. +func (db *DB) newIteratorAt(blockNum uint64, logIndex uint32) (*iterator, error) { + // find a checkpoint before or exactly when blockNum was sealed, + // and have processed up to but not including [logIndex] number of logs (i.e. all prior logs, if any). + searchCheckpointIndex, err := db.searchCheckpoint(blockNum, logIndex) + if errors.Is(err, io.EOF) { + // Did not find a checkpoint to start reading from so the log cannot be present. + return nil, ErrFuture + } else if err != nil { + return nil, err + } + // The iterator did not consume the checkpoint yet, it's positioned right at it. + // So we can call NextBlock() and get the checkpoint itself as first entry. + iter := db.newIterator(searchCheckpointIndex) + if err != nil { + return nil, err + } + iter.current.need.Add(entrydb.FlagCanonicalHash) + defer func() { + db.m.RecordDBSearchEntriesRead(iter.entriesRead) + }() + // First walk up to the block that we are sealed up to (incl.) + for { + if _, n, _ := iter.SealedBlock(); n == blockNum { // we may already have it exactly + break + } + if err := iter.NextBlock(); errors.Is(err, ErrFuture) { + db.log.Trace("ran out of data, could not find block", "nextIndex", iter.NextIndex(), "target", blockNum) + return nil, ErrFuture + } else if err != nil { + db.log.Error("failed to read next block", "nextIndex", iter.NextIndex(), "target", blockNum, "err", err) + return nil, err + } + h, num, ok := iter.SealedBlock() + if !ok { + panic("expected sealed block") + } + db.log.Trace("found sealed block", "num", num, "hash", h) + if num < blockNum { + continue + } + if num != blockNum { // block does not contain + return nil, fmt.Errorf("looking for %d, but already at %d: %w", blockNum, num, ErrConflict) + } + break + } + // Now walk up to the number of seen logs that we want to have processed. + // E.g. logIndex == 2, need to have processed index 0 and 1, + // so two logs before quiting (and not 3 to then quit after). + for iter.current.logsSince < logIndex { + if err := iter.NextInitMsg(); err == io.EOF { + return nil, ErrFuture + } else if err != nil { + return nil, err + } + _, num, ok := iter.SealedBlock() + if !ok { + panic("expected sealed block") + } + if num > blockNum { + // we overshot, the block did not contain as many seen log events as requested + return nil, ErrConflict + } + _, idx, ok := iter.InitMessage() + if !ok { + panic("expected initializing message") + } + if idx+1 < logIndex { + continue + } + if idx+1 == logIndex { + break // the NextInitMsg call will position the iterator at the re + } + return nil, fmt.Errorf("unexpected log-skip at block %d log %d", blockNum, idx) + } + return iter, nil +} + +// newIterator creates an iterator at the given index. +// None of the iterator attributes will be ready for reads, +// but the entry at the given index will be first read when using the iterator. +func (db *DB) newIterator(index entrydb.EntryIdx) *iterator { + return &iterator{ + db: db, + current: logContext{ + nextEntryIndex: index, + }, + } +} + +// searchCheckpoint performs a binary search of the searchCheckpoint entries +// to find the closest one with an equal or lower block number and equal or lower amount of seen logs. +// Returns the index of the searchCheckpoint to begin reading from or an error. +func (db *DB) searchCheckpoint(sealedBlockNum uint64, logsSince uint32) (entrydb.EntryIdx, error) { + n := (db.lastEntryIdx() / searchCheckpointFrequency) + 1 + // Define: x is the array of known checkpoints + // Invariant: x[i] <= target, x[j] > target. + i, j := entrydb.EntryIdx(0), n + for i+1 < j { // i is inclusive, j is exclusive. + // Get the checkpoint exactly in-between, + // bias towards a higher value if an even number of checkpoints. + // E.g. i=3 and j=4 would not run, since i + 1 < j + // E.g. i=3 and j=5 leaves checkpoints 3, 4, and we pick 4 as pivot + // E.g. i=3 and j=6 leaves checkpoints 3, 4, 5, and we pick 4 as pivot + // + // The following holds: i ≤ h < j + h := entrydb.EntryIdx((uint64(i) + uint64(j)) >> 1) + checkpoint, err := db.readSearchCheckpoint(h * searchCheckpointFrequency) + if err != nil { + return 0, fmt.Errorf("failed to read entry %v: %w", h, err) + } + if checkpoint.blockNum < sealedBlockNum || + (checkpoint.blockNum == sealedBlockNum && checkpoint.logsSince < logsSince) { + i = h + } else { + j = h + } + } + if i+1 != j { + panic("expected to have 1 checkpoint left") + } + result := i * searchCheckpointFrequency + checkpoint, err := db.readSearchCheckpoint(result) + if err != nil { + return 0, fmt.Errorf("failed to read final search checkpoint result: %w", err) + } + if checkpoint.blockNum > sealedBlockNum || + (checkpoint.blockNum == sealedBlockNum && checkpoint.logsSince > logsSince) { + return 0, fmt.Errorf("missing data, earliest search checkpoint is %d with %d logs, cannot find something before or at %d with %d logs: %w", + checkpoint.blockNum, checkpoint.logsSince, sealedBlockNum, logsSince, ErrSkipped) + } + return result, nil +} + +// debug util to log the last 10 entries of the chain +func (db *DB) debugTip() { + for x := 0; x < 10; x++ { + index := db.lastEntryIdx() - entrydb.EntryIdx(x) + if index < 0 { + continue + } + e, err := db.store.Read(index) + if err == nil { + db.log.Debug("tip", "index", index, "type", e.Type()) + } + } +} + +func (db *DB) flush() error { + for i, e := range db.lastEntryContext.out { + db.log.Trace("appending entry", "type", e.Type(), "entry", hexutil.Bytes(e[:]), + "next", int(db.lastEntryContext.nextEntryIndex)-len(db.lastEntryContext.out)+i) + } + if err := db.store.Append(db.lastEntryContext.out...); err != nil { + return fmt.Errorf("failed to append entries: %w", err) + } + db.lastEntryContext.out = db.lastEntryContext.out[:0] + db.updateEntryCountMetric() + return nil +} + +func (db *DB) SealBlock(parentHash common.Hash, block eth.BlockID, timestamp uint64) error { + db.rwLock.Lock() + defer db.rwLock.Unlock() + + if err := db.lastEntryContext.SealBlock(parentHash, block, timestamp); err != nil { + return fmt.Errorf("failed to seal block: %w", err) + } + db.log.Trace("Sealed block", "parent", parentHash, "block", block, "timestamp", timestamp) + return db.flush() +} + +func (db *DB) AddLog(logHash common.Hash, parentBlock eth.BlockID, logIdx uint32, execMsg *types.ExecutingMessage) error { + db.rwLock.Lock() + defer db.rwLock.Unlock() + + if err := db.lastEntryContext.ApplyLog(parentBlock, logIdx, logHash, execMsg); err != nil { + return fmt.Errorf("failed to apply log: %w", err) + } + db.log.Trace("Applied log", "parentBlock", parentBlock, "logIndex", logIdx, "logHash", logHash, "executing", execMsg != nil) + return db.flush() +} + +// Rewind the database to remove any blocks after headBlockNum +// The block at headBlockNum itself is not removed. +func (db *DB) Rewind(newHeadBlockNum uint64) error { + db.rwLock.Lock() + defer db.rwLock.Unlock() + // Even if the last fully-processed block matches headBlockNum, + // we might still have trailing log events to get rid of. + iter, err := db.newIteratorAt(newHeadBlockNum, 0) + if err != nil { + return err + } + // Truncate to contain idx+1 entries, since indices are 0 based, + // this deletes everything after idx + if err := db.store.Truncate(iter.NextIndex()); err != nil { + return fmt.Errorf("failed to truncate to block %v: %w", newHeadBlockNum, err) + } + // Use db.init() to find the log context for the new latest log entry + if err := db.init(true); err != nil { + return fmt.Errorf("failed to find new last entry context: %w", err) + } + return nil +} + +func (db *DB) readSearchCheckpoint(entryIdx entrydb.EntryIdx) (searchCheckpoint, error) { + data, err := db.store.Read(entryIdx) + if err != nil { + return searchCheckpoint{}, fmt.Errorf("failed to read entry %v: %w", entryIdx, err) + } + return newSearchCheckpointFromEntry(data) +} + +func (db *DB) Close() error { + return db.store.Close() +} diff --git a/op-supervisor/supervisor/backend/db/logs/db_invariants_test.go b/op-supervisor/supervisor/backend/db/logs/db_invariants_test.go new file mode 100644 index 000000000000..04c004f3d096 --- /dev/null +++ b/op-supervisor/supervisor/backend/db/logs/db_invariants_test.go @@ -0,0 +1,202 @@ +package logs + +import ( + "errors" + "fmt" + "io" + "os" + "testing" + + "github.com/ethereum-optimism/optimism/op-supervisor/supervisor/backend/db/entrydb" + "github.com/stretchr/testify/require" +) + +type statInvariant func(stat os.FileInfo, m *stubMetrics) error +type entryInvariant func(entryIdx int, entry entrydb.Entry, entries []entrydb.Entry, m *stubMetrics) error + +// checkDBInvariants reads the database log directly and asserts a set of invariants on the data. +func checkDBInvariants(t *testing.T, dbPath string, m *stubMetrics) { + stat, err := os.Stat(dbPath) + require.NoError(t, err) + + statInvariants := []statInvariant{ + invariantFileSizeMultipleOfEntrySize, + invariantFileSizeMatchesEntryCountMetric, + } + for _, invariant := range statInvariants { + require.NoError(t, invariant(stat, m)) + } + + // Read all entries as binary blobs + file, err := os.OpenFile(dbPath, os.O_RDONLY, 0o644) + require.NoError(t, err) + entries := make([]entrydb.Entry, stat.Size()/entrydb.EntrySize) + for i := range entries { + n, err := io.ReadFull(file, entries[i][:]) + require.NoErrorf(t, err, "failed to read entry %v", i) + require.EqualValuesf(t, entrydb.EntrySize, n, "read wrong length for entry %v", i) + } + + entryInvariants := []entryInvariant{ + invariantSearchCheckpointAtEverySearchCheckpointFrequency, + invariantCanonicalHashOrCheckpointAfterEverySearchCheckpoint, + invariantSearchCheckpointBeforeEveryCanonicalHash, + invariantExecLinkAfterInitEventWithFlagSet, + invariantExecLinkOnlyAfterInitiatingEventWithFlagSet, + invariantExecCheckAfterExecLink, + invariantExecCheckOnlyAfterExecLink, + } + for i, entry := range entries { + for _, invariant := range entryInvariants { + err := invariant(i, entry, entries, m) + if err != nil { + require.NoErrorf(t, err, "Invariant breached: \n%v", fmtEntries(entries)) + } + } + } +} + +func fmtEntries(entries []entrydb.Entry) string { + out := "" + for i, entry := range entries { + out += fmt.Sprintf("%v: %x\n", i, entry) + } + return out +} + +func invariantFileSizeMultipleOfEntrySize(stat os.FileInfo, _ *stubMetrics) error { + size := stat.Size() + if size%entrydb.EntrySize != 0 { + return fmt.Errorf("expected file size to be a multiple of entry size (%v) but was %v", entrydb.EntrySize, size) + } + return nil +} + +func invariantFileSizeMatchesEntryCountMetric(stat os.FileInfo, m *stubMetrics) error { + size := stat.Size() + if m.entryCount*entrydb.EntrySize != size { + return fmt.Errorf("expected file size to be entryCount (%v) * entrySize (%v) = %v but was %v", m.entryCount, entrydb.EntrySize, m.entryCount*entrydb.EntrySize, size) + } + return nil +} + +func invariantSearchCheckpointAtEverySearchCheckpointFrequency(entryIdx int, entry entrydb.Entry, entries []entrydb.Entry, m *stubMetrics) error { + if entryIdx%searchCheckpointFrequency == 0 && entry.Type() != entrydb.TypeSearchCheckpoint { + return fmt.Errorf("should have search checkpoints every %v entries but entry %v was %x", searchCheckpointFrequency, entryIdx, entry) + } + return nil +} + +func invariantCanonicalHashOrCheckpointAfterEverySearchCheckpoint(entryIdx int, entry entrydb.Entry, entries []entrydb.Entry, m *stubMetrics) error { + if entry.Type() != entrydb.TypeSearchCheckpoint { + return nil + } + if entryIdx+1 >= len(entries) { + return fmt.Errorf("expected canonical hash or checkpoint after search checkpoint at entry %v but no further entries found", entryIdx) + } + nextEntry := entries[entryIdx+1] + if nextEntry.Type() != entrydb.TypeCanonicalHash && nextEntry.Type() != entrydb.TypeSearchCheckpoint { + return fmt.Errorf("expected canonical hash or checkpoint after search checkpoint at entry %v but got %x", entryIdx, nextEntry) + } + return nil +} + +// invariantSearchCheckpointBeforeEveryCanonicalHash ensures we don't have extra canonical-hash entries +func invariantSearchCheckpointBeforeEveryCanonicalHash(entryIdx int, entry entrydb.Entry, entries []entrydb.Entry, m *stubMetrics) error { + if entry.Type() != entrydb.TypeCanonicalHash { + return nil + } + if entryIdx == 0 { + return fmt.Errorf("expected search checkpoint before canonical hash at entry %v but no previous entries present", entryIdx) + } + prevEntry := entries[entryIdx-1] + if prevEntry.Type() != entrydb.TypeSearchCheckpoint { + return fmt.Errorf("expected search checkpoint before canonical hash at entry %v but got %x", entryIdx, prevEntry) + } + return nil +} + +func invariantExecLinkAfterInitEventWithFlagSet(entryIdx int, entry entrydb.Entry, entries []entrydb.Entry, m *stubMetrics) error { + if entry.Type() != entrydb.TypeInitiatingEvent { + return nil + } + hasExecMessage := entry[1]&eventFlagHasExecutingMessage != 0 + if !hasExecMessage { + return nil + } + linkIdx := entryIdx + 1 + if linkIdx%searchCheckpointFrequency == 0 { + linkIdx += 2 // Skip over the search checkpoint and canonical hash events + } + if len(entries) <= linkIdx { + return fmt.Errorf("expected executing link after initiating event with exec msg flag set at entry %v but there were no more events", entryIdx) + } + if entries[linkIdx].Type() != entrydb.TypeExecutingLink { + return fmt.Errorf("expected executing link at idx %v after initiating event with exec msg flag set at entry %v but got type %v", linkIdx, entryIdx, entries[linkIdx][0]) + } + return nil +} + +func invariantExecLinkOnlyAfterInitiatingEventWithFlagSet(entryIdx int, entry entrydb.Entry, entries []entrydb.Entry, m *stubMetrics) error { + if entry.Type() != entrydb.TypeExecutingLink { + return nil + } + if entryIdx == 0 { + return errors.New("found executing link as first entry") + } + initIdx := entryIdx - 1 + if initIdx%searchCheckpointFrequency == 1 { + initIdx -= 2 // Skip the canonical hash and search checkpoint entries + } + if initIdx < 0 { + return fmt.Errorf("found executing link without a preceding initiating event at entry %v", entryIdx) + } + initEntry := entries[initIdx] + if initEntry.Type() != entrydb.TypeInitiatingEvent { + return fmt.Errorf("expected initiating event at entry %v prior to executing link at %v but got %x", initIdx, entryIdx, initEntry[0]) + } + flags := initEntry[1] + if flags&eventFlagHasExecutingMessage == 0 { + return fmt.Errorf("initiating event at %v prior to executing link at %v does not have flag set to indicate needing a executing event: %x", initIdx, entryIdx, initEntry) + } + return nil +} + +func invariantExecCheckAfterExecLink(entryIdx int, entry entrydb.Entry, entries []entrydb.Entry, m *stubMetrics) error { + if entry.Type() != entrydb.TypeExecutingLink { + return nil + } + checkIdx := entryIdx + 1 + if checkIdx%searchCheckpointFrequency == 0 { + checkIdx += 2 // Skip the search checkpoint and canonical hash entries + } + if checkIdx >= len(entries) { + return fmt.Errorf("expected executing link at %v to be followed by executing check at %v but ran out of entries", entryIdx, checkIdx) + } + checkEntry := entries[checkIdx] + if checkEntry.Type() != entrydb.TypeExecutingCheck { + return fmt.Errorf("expected executing link at %v to be followed by executing check at %v but got type %v", entryIdx, checkIdx, checkEntry[0]) + } + return nil +} + +func invariantExecCheckOnlyAfterExecLink(entryIdx int, entry entrydb.Entry, entries []entrydb.Entry, m *stubMetrics) error { + if entry.Type() != entrydb.TypeExecutingCheck { + return nil + } + if entryIdx == 0 { + return errors.New("found executing check as first entry") + } + linkIdx := entryIdx - 1 + if linkIdx%searchCheckpointFrequency == 1 { + linkIdx -= 2 // Skip the canonical hash and search checkpoint entries + } + if linkIdx < 0 { + return fmt.Errorf("found executing link without a preceding initiating event at entry %v", entryIdx) + } + linkEntry := entries[linkIdx] + if linkEntry.Type() != entrydb.TypeExecutingLink { + return fmt.Errorf("expected executing link at entry %v prior to executing check at %v but got %x", linkIdx, entryIdx, linkEntry[0]) + } + return nil +} diff --git a/op-supervisor/supervisor/backend/db/logs/db_test.go b/op-supervisor/supervisor/backend/db/logs/db_test.go new file mode 100644 index 000000000000..c89433c7b4fe --- /dev/null +++ b/op-supervisor/supervisor/backend/db/logs/db_test.go @@ -0,0 +1,1068 @@ +package logs + +import ( + "encoding/binary" + "io" + "io/fs" + "os" + "path/filepath" + "testing" + + "github.com/stretchr/testify/require" + + "github.com/ethereum/go-ethereum/common" + "github.com/ethereum/go-ethereum/crypto" + "github.com/ethereum/go-ethereum/log" + + "github.com/ethereum-optimism/optimism/op-service/eth" + "github.com/ethereum-optimism/optimism/op-service/testlog" + "github.com/ethereum-optimism/optimism/op-supervisor/supervisor/backend/db/entrydb" + "github.com/ethereum-optimism/optimism/op-supervisor/supervisor/types" +) + +func createHash(i int) common.Hash { + if i == -1 { // parent-hash of genesis is zero + return common.Hash{} + } + var data [9]byte + data[0] = 0xff + binary.BigEndian.PutUint64(data[1:], uint64(i)) + return crypto.Keccak256Hash(data[:]) +} + +func TestErrorOpeningDatabase(t *testing.T) { + dir := t.TempDir() + _, err := NewFromFile(testlog.Logger(t, log.LvlInfo), &stubMetrics{}, filepath.Join(dir, "missing-dir", "file.db"), false) + require.ErrorIs(t, err, os.ErrNotExist) +} + +func runDBTest(t *testing.T, setup func(t *testing.T, db *DB, m *stubMetrics), assert func(t *testing.T, db *DB, m *stubMetrics)) { + createDb := func(t *testing.T, dir string) (*DB, *stubMetrics, string) { + logger := testlog.Logger(t, log.LvlTrace) + path := filepath.Join(dir, "test.db") + m := &stubMetrics{} + db, err := NewFromFile(logger, m, path, false) + require.NoError(t, err, "Failed to create database") + t.Cleanup(func() { + err := db.Close() + if err != nil { + require.ErrorIs(t, err, fs.ErrClosed) + } + }) + return db, m, path + } + + t.Run("New", func(t *testing.T) { + db, m, _ := createDb(t, t.TempDir()) + setup(t, db, m) + assert(t, db, m) + }) + + t.Run("Existing", func(t *testing.T) { + dir := t.TempDir() + db, m, path := createDb(t, dir) + setup(t, db, m) + // Close and recreate the database + require.NoError(t, db.Close()) + checkDBInvariants(t, path, m) + + db2, m, path := createDb(t, dir) + assert(t, db2, m) + checkDBInvariants(t, path, m) + }) +} + +func TestEmptyDbDoesNotFindEntry(t *testing.T) { + runDBTest(t, + func(t *testing.T, db *DB, m *stubMetrics) {}, + func(t *testing.T, db *DB, m *stubMetrics) { + requireFuture(t, db, 1, 0, createHash(1)) + requireFuture(t, db, 1, 0, common.Hash{}) + }) +} + +func TestAddLog(t *testing.T) { + t.Run("BlockZero", func(t *testing.T) { + // There are no logs in the genesis block so recording an entry for block 0 should be rejected. + runDBTest(t, + func(t *testing.T, db *DB, m *stubMetrics) {}, + func(t *testing.T, db *DB, m *stubMetrics) { + genesis := eth.BlockID{Hash: createHash(15), Number: 0} + err := db.AddLog(createHash(1), genesis, 0, nil) + require.ErrorIs(t, err, ErrLogOutOfOrder) + }) + }) + + t.Run("FirstEntries", func(t *testing.T) { + runDBTest(t, + func(t *testing.T, db *DB, m *stubMetrics) { + genesis := eth.BlockID{Hash: createHash(15), Number: 15} + require.NoError(t, db.SealBlock(common.Hash{}, genesis, 5000), "seal genesis") + err := db.AddLog(createHash(1), genesis, 0, nil) + require.NoError(t, err, "first log after genesis") + require.NoError(t, db.SealBlock(genesis.Hash, eth.BlockID{Hash: createHash(16), Number: 16}, 5001)) + }, + func(t *testing.T, db *DB, m *stubMetrics) { + requireContains(t, db, 16, 0, createHash(1)) + }) + }) + + t.Run("MultipleEntriesFromSameBlock", func(t *testing.T) { + runDBTest(t, + func(t *testing.T, db *DB, m *stubMetrics) { + // create 15 empty blocks + for i := 0; i <= 15; i++ { + bl := eth.BlockID{Hash: createHash(i), Number: uint64(i)} + require.NoError(t, db.SealBlock(createHash(i-1), bl, 5000+uint64(i)), "seal blocks") + } + // Now apply 3 logs on top of that, contents for block 16 + bl15 := eth.BlockID{Hash: createHash(15), Number: 15} + err := db.AddLog(createHash(1), bl15, 0, nil) + require.NoError(t, err) + err = db.AddLog(createHash(2), bl15, 1, nil) + require.NoError(t, err) + err = db.AddLog(createHash(3), bl15, 2, nil) + require.NoError(t, err) + // Now seal block 16 + bl16 := eth.BlockID{Hash: createHash(16), Number: 16} + err = db.SealBlock(bl15.Hash, bl16, 5016) + require.NoError(t, err) + }, + func(t *testing.T, db *DB, m *stubMetrics) { + require.EqualValues(t, 16*2+3+2, m.entryCount, "empty blocks have logs") + requireContains(t, db, 16, 0, createHash(1)) + requireContains(t, db, 16, 1, createHash(2)) + requireContains(t, db, 16, 2, createHash(3)) + }) + }) + + t.Run("MultipleEntriesFromMultipleBlocks", func(t *testing.T) { + runDBTest(t, + func(t *testing.T, db *DB, m *stubMetrics) { + bl14 := eth.BlockID{Hash: createHash(14), Number: 14} + err := db.SealBlock(createHash(13), bl14, 5000) + require.NoError(t, err) + bl15 := eth.BlockID{Hash: createHash(15), Number: 15} + err = db.SealBlock(createHash(14), bl15, 5001) + require.NoError(t, err) + err = db.AddLog(createHash(1), bl15, 0, nil) + require.NoError(t, err) + err = db.AddLog(createHash(2), bl15, 1, nil) + require.NoError(t, err) + bl16 := eth.BlockID{Hash: createHash(16), Number: 16} + err = db.SealBlock(bl15.Hash, bl16, 5003) + require.NoError(t, err) + err = db.AddLog(createHash(3), bl16, 0, nil) + require.NoError(t, err) + err = db.AddLog(createHash(4), bl16, 1, nil) + require.NoError(t, err) + bl17 := eth.BlockID{Hash: createHash(17), Number: 17} + err = db.SealBlock(bl16.Hash, bl17, 5003) + require.NoError(t, err) + }, + func(t *testing.T, db *DB, m *stubMetrics) { + require.EqualValues(t, 2+2+1+1+2+1+1+2, m.entryCount, "should not output new searchCheckpoint for every block") + requireContains(t, db, 16, 0, createHash(1)) + requireContains(t, db, 16, 1, createHash(2)) + requireContains(t, db, 17, 0, createHash(3)) + requireContains(t, db, 17, 1, createHash(4)) + }) + }) + + t.Run("ErrorWhenBeforeCurrentBlock", func(t *testing.T) { + runDBTest(t, + func(t *testing.T, db *DB, m *stubMetrics) { + bl15 := eth.BlockID{Hash: createHash(15), Number: 15} + err := db.SealBlock(common.Hash{}, bl15, 5001) + require.NoError(t, err) + }, + func(t *testing.T, db *DB, m *stubMetrics) { + bl14 := eth.BlockID{Hash: createHash(14), Number: 14} + err := db.SealBlock(createHash(13), bl14, 5000) + require.ErrorIs(t, err, ErrConflict) + }) + }) + + t.Run("ErrorWhenBeforeCurrentBlockButAfterLastCheckpoint", func(t *testing.T) { + runDBTest(t, + func(t *testing.T, db *DB, m *stubMetrics) { + err := db.lastEntryContext.forceBlock(eth.BlockID{Hash: createHash(13), Number: 13}, 5000) + require.NoError(t, err) + err = db.SealBlock(createHash(13), eth.BlockID{Hash: createHash(14), Number: 14}, 5001) + require.NoError(t, err) + err = db.SealBlock(createHash(14), eth.BlockID{Hash: createHash(15), Number: 15}, 5002) + require.NoError(t, err) + }, + func(t *testing.T, db *DB, m *stubMetrics) { + onto := eth.BlockID{Hash: createHash(14), Number: 14} + err := db.AddLog(createHash(1), onto, 0, nil) + require.ErrorIs(t, err, ErrLogOutOfOrder, "cannot build logs on 14 when 15 is already sealed") + }) + }) + + t.Run("ErrorWhenBeforeCurrentLogEvent", func(t *testing.T) { + runDBTest(t, + func(t *testing.T, db *DB, m *stubMetrics) { + bl15 := eth.BlockID{Hash: createHash(15), Number: 15} + err := db.lastEntryContext.forceBlock(bl15, 5000) + require.NoError(t, err) + require.NoError(t, db.AddLog(createHash(1), bl15, 0, nil)) + require.NoError(t, db.AddLog(createHash(1), bl15, 1, nil)) + }, + func(t *testing.T, db *DB, m *stubMetrics) { + bl15 := eth.BlockID{Hash: createHash(15), Number: 15} + err := db.AddLog(createHash(1), bl15, 0, nil) + require.ErrorIs(t, err, ErrLogOutOfOrder, "already at log index 2") + }) + }) + + t.Run("ErrorWhenBeforeBlockSeal", func(t *testing.T) { + runDBTest(t, + func(t *testing.T, db *DB, m *stubMetrics) { + bl15 := eth.BlockID{Hash: createHash(15), Number: 15} + err := db.lastEntryContext.forceBlock(bl15, 5000) + require.NoError(t, err) + require.NoError(t, db.AddLog(createHash(1), bl15, 0, nil)) + require.NoError(t, db.AddLog(createHash(1), bl15, 1, nil)) + }, + func(t *testing.T, db *DB, m *stubMetrics) { + err := db.AddLog(createHash(1), eth.BlockID{Hash: createHash(16), Number: 16}, 0, nil) + require.ErrorIs(t, err, ErrLogOutOfOrder) + }) + }) + + t.Run("ErrorWhenAtCurrentLogEvent", func(t *testing.T) { + runDBTest(t, + func(t *testing.T, db *DB, m *stubMetrics) { + bl15 := eth.BlockID{Hash: createHash(15), Number: 15} + err := db.lastEntryContext.forceBlock(bl15, 5000) + require.NoError(t, err) + require.NoError(t, db.AddLog(createHash(1), bl15, 0, nil)) + require.NoError(t, db.AddLog(createHash(1), bl15, 1, nil)) + }, + func(t *testing.T, db *DB, m *stubMetrics) { + bl15 := eth.BlockID{Hash: createHash(15), Number: 15} + err := db.AddLog(createHash(1), bl15, 1, nil) + require.ErrorIs(t, err, ErrLogOutOfOrder, "already at log index 2") + }) + }) + + t.Run("ErrorWhenAtCurrentLogEventButAfterLastCheckpoint", func(t *testing.T) { + runDBTest(t, + func(t *testing.T, db *DB, m *stubMetrics) { + bl15 := eth.BlockID{Hash: createHash(15), Number: 15} + err := db.lastEntryContext.forceBlock(bl15, 5000) + require.NoError(t, err) + require.NoError(t, db.AddLog(createHash(1), bl15, 0, nil)) + require.NoError(t, db.AddLog(createHash(1), bl15, 1, nil)) + }, + func(t *testing.T, db *DB, m *stubMetrics) { + bl15 := eth.BlockID{Hash: createHash(16), Number: 16} + err := db.AddLog(createHash(1), bl15, 2, nil) + require.ErrorIs(t, err, ErrLogOutOfOrder) + }) + }) + + t.Run("ErrorWhenSkippingLogEvent", func(t *testing.T) { + runDBTest(t, + func(t *testing.T, db *DB, m *stubMetrics) { + bl15 := eth.BlockID{Hash: createHash(15), Number: 15} + err := db.lastEntryContext.forceBlock(bl15, 5000) + require.NoError(t, err) + require.NoError(t, db.AddLog(createHash(1), bl15, 0, nil)) + }, + func(t *testing.T, db *DB, m *stubMetrics) { + bl15 := eth.BlockID{Hash: createHash(15), Number: 15} + err := db.AddLog(createHash(1), bl15, 2, nil) + require.ErrorIs(t, err, ErrLogOutOfOrder) + }) + }) + + t.Run("ErrorWhenFirstLogIsNotLogIdxZero", func(t *testing.T) { + runDBTest(t, func(t *testing.T, db *DB, m *stubMetrics) { + bl15 := eth.BlockID{Hash: createHash(15), Number: 15} + err := db.lastEntryContext.forceBlock(bl15, 5000) + require.NoError(t, err) + }, + func(t *testing.T, db *DB, m *stubMetrics) { + bl15 := eth.BlockID{Hash: createHash(15), Number: 15} + err := db.AddLog(createHash(1), bl15, 5, nil) + require.ErrorIs(t, err, ErrLogOutOfOrder) + }) + }) + + t.Run("ErrorWhenFirstLogOfNewBlockIsNotLogIdxZero", func(t *testing.T) { + runDBTest(t, + func(t *testing.T, db *DB, m *stubMetrics) { + bl15 := eth.BlockID{Hash: createHash(15), Number: 15} + err := db.lastEntryContext.forceBlock(bl15, 5000) + require.NoError(t, err) + err = db.AddLog(createHash(1), bl15, 0, nil) + require.NoError(t, err) + }, + func(t *testing.T, db *DB, m *stubMetrics) { + bl15 := eth.BlockID{Hash: createHash(15), Number: 15} + err := db.AddLog(createHash(1), bl15, 1, nil) + require.NoError(t, err) + bl16 := eth.BlockID{Hash: createHash(16), Number: 16} + err = db.SealBlock(bl15.Hash, bl16, 5001) + require.NoError(t, err) + err = db.AddLog(createHash(1), bl16, 1, nil) + require.ErrorIs(t, err, ErrLogOutOfOrder) + }) + }) + + t.Run("MultipleSearchCheckpoints", func(t *testing.T) { + block0 := eth.BlockID{Hash: createHash(10), Number: 10} + block1 := eth.BlockID{Hash: createHash(11), Number: 11} + block2 := eth.BlockID{Hash: createHash(12), Number: 12} + block3 := eth.BlockID{Hash: createHash(13), Number: 13} + block4 := eth.BlockID{Hash: createHash(14), Number: 14} + // Ignoring seal-checkpoints in checkpoint counting comments here; + // First search-checkpoint is at entry idx 0 + // Block 1 logs don't reach the second search-checkpoint + block1LogCount := searchCheckpointFrequency - 10 + // Block 2 logs extend to just after the third search-checkpoint + block2LogCount := searchCheckpointFrequency + 16 + // Block 3 logs extend to immediately before the fourth search-checkpoint + block3LogCount := searchCheckpointFrequency - 19 + block4LogCount := 2 + runDBTest(t, + func(t *testing.T, db *DB, m *stubMetrics) { + // force in block 0 + require.NoError(t, db.lastEntryContext.forceBlock(block0, 3000)) + expectedIndex := entrydb.EntryIdx(2) + t.Logf("block 0 complete, at entry %d", db.lastEntryContext.NextIndex()) + require.Equal(t, expectedIndex, db.lastEntryContext.NextIndex()) + { // create block 1 + for i := 0; i < block1LogCount; i++ { + err := db.AddLog(createHash(i), block0, uint32(i), nil) + require.NoError(t, err) + } + err := db.SealBlock(block0.Hash, block1, 3001) // second seal-checkpoint + require.NoError(t, err) + } + expectedIndex += entrydb.EntryIdx(block1LogCount) + 2 + t.Logf("block 1 complete, at entry %d", db.lastEntryContext.NextIndex()) + require.Equal(t, expectedIndex, db.lastEntryContext.NextIndex(), "added logs and a seal checkpoint") + { // create block 2 + for i := 0; i < block2LogCount; i++ { + // two of these imply a search checkpoint, the second and third search-checkpoint + err := db.AddLog(createHash(i), block1, uint32(i), nil) + require.NoError(t, err) + } + err := db.SealBlock(block1.Hash, block2, 3002) // third seal-checkpoint + require.NoError(t, err) + } + expectedIndex += entrydb.EntryIdx(block2LogCount) + 2 + 2 + 2 + t.Logf("block 2 complete, at entry %d", db.lastEntryContext.NextIndex()) + require.Equal(t, expectedIndex, db.lastEntryContext.NextIndex(), "added logs, two search checkpoints, and a seal checkpoint") + { // create block 3 + for i := 0; i < block3LogCount; i++ { + err := db.AddLog(createHash(i), block2, uint32(i), nil) + require.NoError(t, err) + } + err := db.SealBlock(block2.Hash, block3, 3003) + require.NoError(t, err) + } + expectedIndex += entrydb.EntryIdx(block3LogCount) + 2 + t.Logf("block 3 complete, at entry %d", db.lastEntryContext.NextIndex()) + require.Equal(t, expectedIndex, db.lastEntryContext.NextIndex(), "added logs, and a seal checkpoint") + + // Verify that we're right before the fourth search-checkpoint will be written. + // entryCount is the number of entries, so given 0 based indexing is the index of the next entry + // the first checkpoint is at entry 0, the second at entry searchCheckpointFrequency etc + // so the fourth is at entry 3*searchCheckpointFrequency. + require.EqualValues(t, 3*searchCheckpointFrequency-1, m.entryCount) + { // create block 4 + for i := 0; i < block4LogCount; i++ { + // includes a fourth search checkpoint + err := db.AddLog(createHash(i), block3, uint32(i), nil) + require.NoError(t, err) + } + err := db.SealBlock(block3.Hash, block4, 3003) // fourth seal checkpoint + require.NoError(t, err) + } + expectedIndex += entrydb.EntryIdx(block4LogCount) + 2 + 2 + require.Equal(t, expectedIndex, db.lastEntryContext.NextIndex(), "added logs, a search checkpoint, and a seal checkpoint") + t.Logf("block 4 complete, at entry %d", db.lastEntryContext.NextIndex()) + }, + func(t *testing.T, db *DB, m *stubMetrics) { + // Check that we wrote additional search checkpoints and seal checkpoints + expectedCheckpointCount := 4 + 4 + expectedEntryCount := block1LogCount + block2LogCount + block3LogCount + block4LogCount + (2 * expectedCheckpointCount) + require.EqualValues(t, expectedEntryCount, m.entryCount) + // Check we can find all the logs. + for i := 0; i < block1LogCount; i++ { + requireContains(t, db, block1.Number, uint32(i), createHash(i)) + } + // Block 2 logs extend to just after the third checkpoint + for i := 0; i < block2LogCount; i++ { + requireContains(t, db, block2.Number, uint32(i), createHash(i)) + } + // Block 3 logs extend to immediately before the fourth checkpoint + for i := 0; i < block3LogCount; i++ { + requireContains(t, db, block3.Number, uint32(i), createHash(i)) + } + // Block 4 logs start immediately after the fourth checkpoint + for i := 0; i < block4LogCount; i++ { + requireContains(t, db, block4.Number, uint32(i), createHash(i)) + } + }) + }) +} + +func TestAddDependentLog(t *testing.T) { + execMsg := types.ExecutingMessage{ + Chain: 3, + BlockNum: 42894, + LogIdx: 42, + Timestamp: 8742482, + Hash: createHash(8844), + } + t.Run("FirstEntry", func(t *testing.T) { + runDBTest(t, + func(t *testing.T, db *DB, m *stubMetrics) { + bl15 := eth.BlockID{Hash: createHash(15), Number: 15} + require.NoError(t, db.lastEntryContext.forceBlock(bl15, 5000)) + err := db.AddLog(createHash(1), bl15, 0, &execMsg) + require.NoError(t, err) + }, + func(t *testing.T, db *DB, m *stubMetrics) { + requireContains(t, db, 16, 0, createHash(1), execMsg) + }) + }) + + t.Run("BlockSealSearchCheckpointOverlap", func(t *testing.T) { + runDBTest(t, + func(t *testing.T, db *DB, m *stubMetrics) { + bl15 := eth.BlockID{Hash: createHash(15), Number: 15} + require.NoError(t, db.lastEntryContext.forceBlock(bl15, 5000)) + for i := uint32(0); m.entryCount < searchCheckpointFrequency-1; i++ { + require.NoError(t, db.AddLog(createHash(9), bl15, i, nil)) + } + bl16 := eth.BlockID{Hash: createHash(16), Number: 16} + require.NoError(t, db.SealBlock(bl15.Hash, bl16, 5001)) + // added 3 entries: seal-checkpoint, then a search-checkpoint, then the canonical hash + require.Equal(t, m.entryCount, int64(searchCheckpointFrequency+2)) + err := db.AddLog(createHash(1), bl16, 0, &execMsg) + require.NoError(t, err) + }, + func(t *testing.T, db *DB, m *stubMetrics) { + requireContains(t, db, 16, 0, createHash(9)) + requireContains(t, db, 17, 0, createHash(1), execMsg) + }) + }) + + t.Run("AvoidCheckpointOverlapWithExecutingCheck", func(t *testing.T) { + runDBTest(t, + func(t *testing.T, db *DB, m *stubMetrics) { + bl15 := eth.BlockID{Hash: createHash(15), Number: 15} + require.NoError(t, db.lastEntryContext.forceBlock(bl15, 5000)) + // we add 256 - 2 (start) - 2 (init msg, exec link) = 252 entries + for i := uint32(0); i < 252; i++ { + require.NoError(t, db.AddLog(createHash(9), bl15, i, nil)) + } + // add an executing message + err := db.AddLog(createHash(1), bl15, 252, &execMsg) + require.NoError(t, err) + // 0,1: start + // 2..252+2: initiating logs without exec message + // 254 = inferred padding - 3 entries for exec msg would overlap with checkpoint + // 255 = inferred padding + // 256 = search checkpoint - what would be the exec check without padding + // 257 = canonical hash + // 258 = initiating message + // 259 = executing message link + // 260 = executing message check + require.Equal(t, int64(261), m.entryCount) + db.debugTip() + }, + func(t *testing.T, db *DB, m *stubMetrics) { + requireContains(t, db, 16, 251, createHash(9)) + requireContains(t, db, 16, 252, createHash(1), execMsg) + }) + }) + + t.Run("AvoidCheckpointOverlapWithExecutingLink", func(t *testing.T) { + runDBTest(t, + func(t *testing.T, db *DB, m *stubMetrics) { + bl15 := eth.BlockID{Hash: createHash(15), Number: 15} + require.NoError(t, db.lastEntryContext.forceBlock(bl15, 5000)) + // we add 256 - 2 (start) - 1 (init msg) = 253 entries + for i := uint32(0); i < 253; i++ { + require.NoError(t, db.AddLog(createHash(9), bl15, i, nil)) + } + // add an executing message + err := db.AddLog(createHash(1), bl15, 253, &execMsg) + require.NoError(t, err) + // 0,1: start + // 2..253+2: initiating logs without exec message + // 255 = inferred padding - 3 entries for exec msg would overlap with checkpoint + // 256 = search checkpoint - what would be the exec link without padding + // 257 = canonical hash + // 258 = initiating message + // 259 = executing message link + // 260 = executing message check + db.debugTip() + require.Equal(t, int64(261), m.entryCount) + }, + func(t *testing.T, db *DB, m *stubMetrics) { + requireContains(t, db, 16, 252, createHash(9)) + requireContains(t, db, 16, 253, createHash(1), execMsg) + }) + }) +} + +func TestContains(t *testing.T) { + runDBTest(t, + func(t *testing.T, db *DB, m *stubMetrics) { + bl50 := eth.BlockID{Hash: createHash(50), Number: 50} + require.NoError(t, db.lastEntryContext.forceBlock(bl50, 5000)) + require.NoError(t, db.AddLog(createHash(1), bl50, 0, nil)) + require.NoError(t, db.AddLog(createHash(3), bl50, 1, nil)) + require.NoError(t, db.AddLog(createHash(2), bl50, 2, nil)) + bl51 := eth.BlockID{Hash: createHash(51), Number: 51} + require.NoError(t, db.SealBlock(bl50.Hash, bl51, 5001)) + bl52 := eth.BlockID{Hash: createHash(52), Number: 52} + require.NoError(t, db.SealBlock(bl51.Hash, bl52, 5001)) + require.NoError(t, db.AddLog(createHash(1), bl52, 0, nil)) + require.NoError(t, db.AddLog(createHash(3), bl52, 1, nil)) + }, + func(t *testing.T, db *DB, m *stubMetrics) { + // Should find added logs + requireContains(t, db, 51, 0, createHash(1)) + requireContains(t, db, 51, 1, createHash(3)) + requireContains(t, db, 51, 2, createHash(2)) + requireContains(t, db, 53, 0, createHash(1)) + requireContains(t, db, 53, 1, createHash(3)) + + // 52 was sealed as empty + requireConflicts(t, db, 52, 0, createHash(1)) + + // 53 only contained 2 logs, not 3, and is not sealed yet + requireFuture(t, db, 53, 2, createHash(3)) + // 54 doesn't exist yet + requireFuture(t, db, 54, 0, createHash(3)) + + // 51 only contained 3 logs, not 4 + requireConflicts(t, db, 51, 3, createHash(2)) + }) +} + +func TestExecutes(t *testing.T) { + execMsg1 := types.ExecutingMessage{ + Chain: 33, + BlockNum: 22, + LogIdx: 99, + Timestamp: 948294, + Hash: createHash(332299), + } + execMsg2 := types.ExecutingMessage{ + Chain: 44, + BlockNum: 55, + LogIdx: 66, + Timestamp: 77777, + Hash: createHash(445566), + } + execMsg3 := types.ExecutingMessage{ + Chain: 77, + BlockNum: 88, + LogIdx: 89, + Timestamp: 6578567, + Hash: createHash(778889), + } + runDBTest(t, + func(t *testing.T, db *DB, m *stubMetrics) { + bl50 := eth.BlockID{Hash: createHash(50), Number: 50} + require.NoError(t, db.lastEntryContext.forceBlock(bl50, 500)) + require.NoError(t, db.AddLog(createHash(1), bl50, 0, nil)) + require.NoError(t, db.AddLog(createHash(3), bl50, 1, &execMsg1)) + require.NoError(t, db.AddLog(createHash(2), bl50, 2, nil)) + bl51 := eth.BlockID{Hash: createHash(51), Number: 51} + require.NoError(t, db.SealBlock(bl50.Hash, bl51, 5001)) + bl52 := eth.BlockID{Hash: createHash(52), Number: 52} + require.NoError(t, db.SealBlock(bl51.Hash, bl52, 5001)) + require.NoError(t, db.AddLog(createHash(1), bl52, 0, &execMsg2)) + require.NoError(t, db.AddLog(createHash(3), bl52, 1, &execMsg3)) + }, + func(t *testing.T, db *DB, m *stubMetrics) { + // Should find added logs + requireExecutingMessage(t, db, 51, 0, types.ExecutingMessage{}) + requireExecutingMessage(t, db, 51, 1, execMsg1) + requireExecutingMessage(t, db, 51, 2, types.ExecutingMessage{}) + requireExecutingMessage(t, db, 53, 0, execMsg2) + requireExecutingMessage(t, db, 53, 1, execMsg3) + + // 52 was sealed without logs + requireConflicts(t, db, 52, 0, createHash(1)) + + // 53 only contained 2 logs, not 3, and is not sealed yet + requireFuture(t, db, 53, 2, createHash(3)) + // 54 doesn't exist yet + requireFuture(t, db, 54, 0, createHash(3)) + + // 51 only contained 3 logs, not 4 + requireConflicts(t, db, 51, 3, createHash(2)) + }) +} + +func TestGetBlockInfo(t *testing.T) { + t.Run("ReturnsErrFutureWhenEmpty", func(t *testing.T) { + runDBTest(t, + func(t *testing.T, db *DB, m *stubMetrics) {}, + func(t *testing.T, db *DB, m *stubMetrics) { + bl10 := eth.BlockID{Hash: createHash(10), Number: 10} + _, err := db.FindSealedBlock(bl10) + require.ErrorIs(t, err, ErrFuture) + }) + }) + + t.Run("ReturnsErrFutureWhenRequestedBlockBeforeFirstSearchCheckpoint", func(t *testing.T) { + runDBTest(t, + func(t *testing.T, db *DB, m *stubMetrics) { + bl11 := eth.BlockID{Hash: createHash(11), Number: 11} + require.NoError(t, db.lastEntryContext.forceBlock(bl11, 500)) + err := db.AddLog(createHash(1), bl11, 0, nil) + require.NoError(t, err) + }, + func(t *testing.T, db *DB, m *stubMetrics) { + // if the DB starts at 11, then shouldn't find 10 + bl10 := eth.BlockID{Hash: createHash(10), Number: 10} + _, err := db.FindSealedBlock(bl10) + require.ErrorIs(t, err, ErrSkipped) + }) + }) + + t.Run("ReturnFirstBlockInfo", func(t *testing.T) { + block := eth.BlockID{Hash: createHash(11), Number: 11} + runDBTest(t, + func(t *testing.T, db *DB, m *stubMetrics) { + require.NoError(t, db.SealBlock(common.Hash{}, block, 500)) + }, + func(t *testing.T, db *DB, m *stubMetrics) { + index, err := db.FindSealedBlock(block) + require.NoError(t, err) + require.Equal(t, entrydb.EntryIdx(2), index, + "expecting to continue after search checkpoint that declared the block") + }) + }) +} + +func requireContains(t *testing.T, db *DB, blockNum uint64, logIdx uint32, logHash common.Hash, execMsg ...types.ExecutingMessage) { + require.LessOrEqual(t, len(execMsg), 1, "cannot have multiple executing messages for a single log") + m, ok := db.m.(*stubMetrics) + require.True(t, ok, "Did not get the expected metrics type") + _, err := db.Contains(blockNum, logIdx, logHash) + require.NoErrorf(t, err, "Error searching for log %v in block %v", logIdx, blockNum) + require.LessOrEqual(t, m.entriesReadForSearch, int64(searchCheckpointFrequency*2), "Should not need to read more than between two checkpoints") + require.NotZero(t, m.entriesReadForSearch, "Must read at least some entries to find the log") + + var expectedExecMsg types.ExecutingMessage + if len(execMsg) == 1 { + expectedExecMsg = execMsg[0] + } + requireExecutingMessage(t, db, blockNum, logIdx, expectedExecMsg) +} + +func requireConflicts(t *testing.T, db *DB, blockNum uint64, logIdx uint32, logHash common.Hash) { + m, ok := db.m.(*stubMetrics) + require.True(t, ok, "Did not get the expected metrics type") + _, err := db.Contains(blockNum, logIdx, logHash) + require.ErrorIs(t, err, ErrConflict, "canonical chain must not include this log") + require.LessOrEqual(t, m.entriesReadForSearch, int64(searchCheckpointFrequency*2), "Should not need to read more than between two checkpoints") +} + +func requireFuture(t *testing.T, db *DB, blockNum uint64, logIdx uint32, logHash common.Hash) { + m, ok := db.m.(*stubMetrics) + require.True(t, ok, "Did not get the expected metrics type") + _, err := db.Contains(blockNum, logIdx, logHash) + require.ErrorIs(t, err, ErrFuture, "canonical chain does not yet include this log") + require.LessOrEqual(t, m.entriesReadForSearch, int64(searchCheckpointFrequency*2), "Should not need to read more than between two checkpoints") +} + +func requireExecutingMessage(t *testing.T, db *DB, blockNum uint64, logIdx uint32, execMsg types.ExecutingMessage) { + m, ok := db.m.(*stubMetrics) + require.True(t, ok, "Did not get the expected metrics type") + _, iter, err := db.findLogInfo(blockNum, logIdx) + require.NoError(t, err, "Error when searching for executing message") + actualExecMsg := iter.ExecMessage() // non-nil if not just an initiating message, but also an executing message + if execMsg == (types.ExecutingMessage{}) { + require.Nil(t, actualExecMsg) + } else { + require.NotNil(t, actualExecMsg) + require.Equal(t, execMsg, *actualExecMsg, "Should return matching executing message") + } + require.LessOrEqual(t, m.entriesReadForSearch, int64(searchCheckpointFrequency*2), "Should not need to read more than between two checkpoints") + require.NotZero(t, m.entriesReadForSearch, "Must read at least some entries to find the log") +} + +func TestRecoverOnCreate(t *testing.T) { + createDb := func(t *testing.T, store *stubEntryStore) (*DB, *stubMetrics, error) { + logger := testlog.Logger(t, log.LvlInfo) + m := &stubMetrics{} + db, err := NewFromEntryStore(logger, m, store, true) + return db, m, err + } + + storeWithEvents := func(evts ...entrydb.Entry) *stubEntryStore { + store := &stubEntryStore{} + store.entries = append(store.entries, evts...) + return store + } + t.Run("NoTruncateWhenLastEntryIsLogWithNoExecMessageSealed", func(t *testing.T) { + store := storeWithEvents( + // seal 0, 1, 2, 3 + newSearchCheckpoint(0, 0, 100).encode(), + newCanonicalHash(createHash(300)).encode(), + newSearchCheckpoint(1, 0, 101).encode(), + newCanonicalHash(createHash(301)).encode(), + newSearchCheckpoint(2, 0, 102).encode(), + newCanonicalHash(createHash(302)).encode(), + newSearchCheckpoint(3, 0, 103).encode(), + newCanonicalHash(createHash(303)).encode(), + // open and seal 4 + newInitiatingEvent(createHash(1), false).encode(), + newSearchCheckpoint(4, 0, 104).encode(), + newCanonicalHash(createHash(304)).encode(), + ) + db, m, err := createDb(t, store) + require.NoError(t, err) + require.EqualValues(t, int64(4*2+3), m.entryCount) + requireContains(t, db, 4, 0, createHash(1)) + }) + + t.Run("NoTruncateWhenLastEntryIsExecutingCheckSealed", func(t *testing.T) { + execMsg := types.ExecutingMessage{ + Chain: 4, + BlockNum: 10, + LogIdx: 4, + Timestamp: 1288, + Hash: createHash(4), + } + linkEvt, err := newExecutingLink(execMsg) + require.NoError(t, err) + store := storeWithEvents( + newSearchCheckpoint(0, 0, 100).encode(), + newCanonicalHash(createHash(300)).encode(), + newSearchCheckpoint(1, 0, 101).encode(), + newCanonicalHash(createHash(301)).encode(), + newSearchCheckpoint(2, 0, 102).encode(), + newCanonicalHash(createHash(302)).encode(), + newInitiatingEvent(createHash(1111), true).encode(), + linkEvt.encode(), + newExecutingCheck(execMsg.Hash).encode(), + newSearchCheckpoint(3, 0, 103).encode(), + newCanonicalHash(createHash(303)).encode(), + ) + db, m, err := createDb(t, store) + require.NoError(t, err) + require.EqualValues(t, int64(3*2+5), m.entryCount) + requireContains(t, db, 3, 0, createHash(1111), execMsg) + }) + + t.Run("TruncateWhenLastEntrySearchCheckpoint", func(t *testing.T) { + // A checkpoint, without a canonical blockhash, is useless, and thus truncated. + store := storeWithEvents( + newSearchCheckpoint(0, 0, 100).encode()) + _, m, err := createDb(t, store) + require.NoError(t, err) + require.EqualValues(t, int64(0), m.entryCount) + }) + + t.Run("NoTruncateWhenLastEntryCanonicalHash", func(t *testing.T) { + // A completed seal is fine to have as last entry. + store := storeWithEvents( + newSearchCheckpoint(0, 0, 100).encode(), + newCanonicalHash(createHash(344)).encode(), + ) + _, m, err := createDb(t, store) + require.NoError(t, err) + require.EqualValues(t, int64(2), m.entryCount) + }) + + t.Run("TruncateWhenLastEntryInitEventWithExecMsg", func(t *testing.T) { + // An initiating event that claims an executing message, + // without said executing message, is dropped. + store := storeWithEvents( + newSearchCheckpoint(0, 0, 100).encode(), + newCanonicalHash(createHash(344)).encode(), + // both pruned because we go back to a seal + newInitiatingEvent(createHash(0), false).encode(), + newInitiatingEvent(createHash(1), true).encode(), + ) + _, m, err := createDb(t, store) + require.NoError(t, err) + require.EqualValues(t, int64(2), m.entryCount) + }) + + t.Run("NoTruncateWhenLastEntrySealed", func(t *testing.T) { + // An initiating event that claims an executing message, + // without said executing message, is dropped. + store := storeWithEvents( + newSearchCheckpoint(0, 0, 100).encode(), + newCanonicalHash(createHash(300)).encode(), + // pruned because we go back to a seal + newInitiatingEvent(createHash(0), false).encode(), + newSearchCheckpoint(1, 0, 100).encode(), + newCanonicalHash(createHash(301)).encode(), + ) + _, m, err := createDb(t, store) + require.NoError(t, err) + require.EqualValues(t, int64(5), m.entryCount) + }) + + t.Run("TruncateWhenLastEntryInitEventWithExecLink", func(t *testing.T) { + execMsg := types.ExecutingMessage{ + Chain: 4, + BlockNum: 10, + LogIdx: 4, + Timestamp: 1288, + Hash: createHash(4), + } + linkEvt, err := newExecutingLink(execMsg) + require.NoError(t, err) + store := storeWithEvents( + newSearchCheckpoint(3, 0, 100).encode(), + newCanonicalHash(createHash(344)).encode(), + newInitiatingEvent(createHash(1), true).encode(), + linkEvt.encode(), + ) + _, m, err := createDb(t, store) + require.NoError(t, err) + require.EqualValues(t, int64(2), m.entryCount) + }) +} + +func TestRewind(t *testing.T) { + t.Run("WhenEmpty", func(t *testing.T) { + runDBTest(t, func(t *testing.T, db *DB, m *stubMetrics) {}, + func(t *testing.T, db *DB, m *stubMetrics) { + require.ErrorIs(t, db.Rewind(100), ErrFuture) + // Genesis is a block to, not present in an empty DB + require.ErrorIs(t, db.Rewind(0), ErrFuture) + }) + }) + + t.Run("AfterLastBlock", func(t *testing.T) { + runDBTest(t, + func(t *testing.T, db *DB, m *stubMetrics) { + bl50 := eth.BlockID{Hash: createHash(50), Number: 50} + require.NoError(t, db.SealBlock(createHash(49), bl50, 500)) + require.NoError(t, db.AddLog(createHash(1), bl50, 0, nil)) + require.NoError(t, db.AddLog(createHash(2), bl50, 1, nil)) + bl51 := eth.BlockID{Hash: createHash(51), Number: 51} + require.NoError(t, db.SealBlock(bl50.Hash, bl51, 502)) + require.NoError(t, db.AddLog(createHash(3), bl51, 0, nil)) + bl52 := eth.BlockID{Hash: createHash(52), Number: 52} + require.NoError(t, db.SealBlock(bl51.Hash, bl52, 504)) + require.NoError(t, db.AddLog(createHash(4), bl52, 0, nil)) + // cannot rewind to a block that is not sealed yet + require.ErrorIs(t, db.Rewind(53), ErrFuture) + }, + func(t *testing.T, db *DB, m *stubMetrics) { + requireContains(t, db, 51, 0, createHash(1)) + requireContains(t, db, 51, 1, createHash(2)) + requireContains(t, db, 52, 0, createHash(3)) + // Still have the pending log of unsealed block if the rewind to unknown sealed block fails + requireContains(t, db, 53, 0, createHash(4)) + }) + }) + + t.Run("BeforeFirstBlock", func(t *testing.T) { + runDBTest(t, + func(t *testing.T, db *DB, m *stubMetrics) { + bl50 := eth.BlockID{Hash: createHash(50), Number: 50} + require.NoError(t, db.SealBlock(createHash(49), bl50, 500)) + require.NoError(t, db.AddLog(createHash(1), bl50, 0, nil)) + require.NoError(t, db.AddLog(createHash(2), bl50, 1, nil)) + // cannot go back to an unknown block + require.ErrorIs(t, db.Rewind(25), ErrSkipped) + }, + func(t *testing.T, db *DB, m *stubMetrics) { + requireContains(t, db, 51, 0, createHash(1)) + requireContains(t, db, 51, 0, createHash(1)) + }) + }) + + t.Run("AtFirstBlock", func(t *testing.T) { + runDBTest(t, + func(t *testing.T, db *DB, m *stubMetrics) { + bl50 := eth.BlockID{Hash: createHash(50), Number: 50} + require.NoError(t, db.SealBlock(createHash(49), bl50, 500)) + require.NoError(t, db.AddLog(createHash(1), bl50, 0, nil)) + require.NoError(t, db.AddLog(createHash(2), bl50, 1, nil)) + bl51 := eth.BlockID{Hash: createHash(51), Number: 51} + require.NoError(t, db.SealBlock(bl50.Hash, bl51, 502)) + require.NoError(t, db.AddLog(createHash(1), bl51, 0, nil)) + require.NoError(t, db.AddLog(createHash(2), bl51, 1, nil)) + bl52 := eth.BlockID{Hash: createHash(52), Number: 52} + require.NoError(t, db.SealBlock(bl51.Hash, bl52, 504)) + require.NoError(t, db.Rewind(51)) + }, + func(t *testing.T, db *DB, m *stubMetrics) { + requireContains(t, db, 51, 0, createHash(1)) + requireContains(t, db, 51, 1, createHash(2)) + requireFuture(t, db, 52, 0, createHash(1)) + requireFuture(t, db, 52, 1, createHash(2)) + }) + }) + + t.Run("AfterSecondCheckpoint", func(t *testing.T) { + runDBTest(t, + func(t *testing.T, db *DB, m *stubMetrics) { + bl50 := eth.BlockID{Hash: createHash(50), Number: 50} + require.NoError(t, db.SealBlock(createHash(49), bl50, 500)) + for i := uint32(0); m.entryCount < searchCheckpointFrequency; i++ { + require.NoError(t, db.AddLog(createHash(1), bl50, i, nil)) + } + // The checkpoint is added automatically, + // it will be there as soon as it reaches 255 with log events. + // Thus add 2 for the checkpoint. + require.EqualValues(t, searchCheckpointFrequency+2, m.entryCount) + bl51 := eth.BlockID{Hash: createHash(51), Number: 51} + require.NoError(t, db.SealBlock(bl50.Hash, bl51, 502)) + require.NoError(t, db.AddLog(createHash(1), bl51, 0, nil)) + require.EqualValues(t, searchCheckpointFrequency+2+3, m.entryCount, "Should have inserted new checkpoint and extra log") + require.NoError(t, db.AddLog(createHash(2), bl51, 1, nil)) + bl52 := eth.BlockID{Hash: createHash(52), Number: 52} + require.NoError(t, db.SealBlock(bl51.Hash, bl52, 504)) + require.NoError(t, db.Rewind(51)) + }, + func(t *testing.T, db *DB, m *stubMetrics) { + require.EqualValues(t, searchCheckpointFrequency+2+2, m.entryCount, "Should have deleted second checkpoint") + requireContains(t, db, 51, 0, createHash(1)) + requireContains(t, db, 51, 1, createHash(1)) + requireFuture(t, db, 52, 0, createHash(1)) + requireFuture(t, db, 52, 1, createHash(2)) + }) + }) + + t.Run("BetweenBlockEntries", func(t *testing.T) { + runDBTest(t, + func(t *testing.T, db *DB, m *stubMetrics) { + // create many blocks, and all the odd blocks get 2 logs + for i := uint32(0); i < 30; i++ { + bl := eth.BlockID{Hash: createHash(int(i)), Number: uint64(i)} + require.NoError(t, db.SealBlock(createHash(int(i)-1), bl, 500+uint64(i))) + if i%2 == 0 { + require.NoError(t, db.AddLog(createHash(1), bl, 0, nil)) + require.NoError(t, db.AddLog(createHash(2), bl, 1, nil)) + } + } + require.NoError(t, db.Rewind(15)) + }, + func(t *testing.T, db *DB, m *stubMetrics) { + requireContains(t, db, 15, 0, createHash(1)) + requireContains(t, db, 15, 1, createHash(2)) + requireFuture(t, db, 16, 0, createHash(1)) + requireFuture(t, db, 16, 1, createHash(2)) + }) + }) + + t.Run("AtLastEntry", func(t *testing.T) { + runDBTest(t, + func(t *testing.T, db *DB, m *stubMetrics) { + // create many blocks, and all the even blocks get 2 logs + for i := uint32(0); i <= 30; i++ { + bl := eth.BlockID{Hash: createHash(int(i)), Number: uint64(i)} + require.NoError(t, db.SealBlock(createHash(int(i)-1), bl, 500+uint64(i))) + if i%2 == 1 { + require.NoError(t, db.AddLog(createHash(1), bl, 0, nil)) + require.NoError(t, db.AddLog(createHash(2), bl, 1, nil)) + } + } + // We ended at 30, and sealed it, nothing left to prune + require.NoError(t, db.Rewind(30)) + }, + func(t *testing.T, db *DB, m *stubMetrics) { + requireContains(t, db, 20, 0, createHash(1)) + requireContains(t, db, 20, 1, createHash(2)) + // built on top of 29, these are in sealed block 30, still around + requireContains(t, db, 30, 0, createHash(1)) + requireContains(t, db, 30, 1, createHash(2)) + }) + }) + + t.Run("ReadDeletedBlocks", func(t *testing.T) { + runDBTest(t, + func(t *testing.T, db *DB, m *stubMetrics) { + // create many blocks, and all the odd blocks get 2 logs + for i := uint32(0); i < 30; i++ { + bl := eth.BlockID{Hash: createHash(int(i)), Number: uint64(i)} + require.NoError(t, db.SealBlock(createHash(int(i)-1), bl, 500+uint64(i))) + if i%2 == 0 { + require.NoError(t, db.AddLog(createHash(1), bl, 0, nil)) + require.NoError(t, db.AddLog(createHash(2), bl, 1, nil)) + } + } + require.NoError(t, db.Rewind(16)) + }, + func(t *testing.T, db *DB, m *stubMetrics) { + bl29 := eth.BlockID{Hash: createHash(29), Number: 29} + // 29 was deleted + err := db.AddLog(createHash(2), bl29, 1, nil) + require.ErrorIs(t, err, ErrLogOutOfOrder, "Cannot add log on removed block") + // 15 is older, we have up to 16 + bl15 := eth.BlockID{Hash: createHash(15), Number: 15} + // try to add a third log to 15 + err = db.AddLog(createHash(10), bl15, 2, nil) + require.ErrorIs(t, err, ErrLogOutOfOrder) + bl16 := eth.BlockID{Hash: createHash(16), Number: 16} + // try to add a log to 17, on top of 16 + err = db.AddLog(createHash(42), bl16, 0, nil) + require.NoError(t, err) + requireContains(t, db, 17, 0, createHash(42)) + }) + }) +} + +type stubMetrics struct { + entryCount int64 + entriesReadForSearch int64 +} + +func (s *stubMetrics) RecordDBEntryCount(count int64) { + s.entryCount = count +} + +func (s *stubMetrics) RecordDBSearchEntriesRead(count int64) { + s.entriesReadForSearch = count +} + +var _ Metrics = (*stubMetrics)(nil) + +type stubEntryStore struct { + entries []entrydb.Entry +} + +func (s *stubEntryStore) Size() int64 { + return int64(len(s.entries)) +} + +func (s *stubEntryStore) LastEntryIdx() entrydb.EntryIdx { + return entrydb.EntryIdx(s.Size() - 1) +} + +func (s *stubEntryStore) Read(idx entrydb.EntryIdx) (entrydb.Entry, error) { + if idx < entrydb.EntryIdx(len(s.entries)) { + return s.entries[idx], nil + } + return entrydb.Entry{}, io.EOF +} + +func (s *stubEntryStore) Append(entries ...entrydb.Entry) error { + s.entries = append(s.entries, entries...) + return nil +} + +func (s *stubEntryStore) Truncate(idx entrydb.EntryIdx) error { + s.entries = s.entries[:min(s.Size()-1, int64(idx+1))] + return nil +} + +func (s *stubEntryStore) Close() error { + return nil +} + +var _ EntryStore = (*stubEntryStore)(nil) diff --git a/op-supervisor/supervisor/backend/db/logs/entries.go b/op-supervisor/supervisor/backend/db/logs/entries.go new file mode 100644 index 000000000000..431adc99f465 --- /dev/null +++ b/op-supervisor/supervisor/backend/db/logs/entries.go @@ -0,0 +1,191 @@ +package logs + +import ( + "encoding/binary" + "fmt" + + "github.com/ethereum/go-ethereum/common" + + "github.com/ethereum-optimism/optimism/op-supervisor/supervisor/backend/db/entrydb" + "github.com/ethereum-optimism/optimism/op-supervisor/supervisor/types" +) + +// searchCheckpoint is both a checkpoint for searching, as well as a checkpoint for sealing blocks. +type searchCheckpoint struct { + blockNum uint64 + // seen logs *after* the seal of the mentioned block, i.e. not part of this block, but building on top of it. + // There is at least one checkpoint per L2 block with logsSince == 0, i.e. the exact block boundary. + logsSince uint32 + timestamp uint64 +} + +func newSearchCheckpoint(blockNum uint64, logsSince uint32, timestamp uint64) searchCheckpoint { + return searchCheckpoint{ + blockNum: blockNum, + logsSince: logsSince, + timestamp: timestamp, + } +} + +func newSearchCheckpointFromEntry(data entrydb.Entry) (searchCheckpoint, error) { + if data.Type() != entrydb.TypeSearchCheckpoint { + return searchCheckpoint{}, fmt.Errorf("%w: attempting to decode search checkpoint but was type %s", ErrDataCorruption, data.Type()) + } + return searchCheckpoint{ + blockNum: binary.LittleEndian.Uint64(data[1:9]), + logsSince: binary.LittleEndian.Uint32(data[9:13]), + timestamp: binary.LittleEndian.Uint64(data[13:21]), + }, nil +} + +// encode creates a checkpoint entry +// type 0: "search checkpoint" = 21 bytes +func (s searchCheckpoint) encode() entrydb.Entry { + var data entrydb.Entry + data[0] = uint8(entrydb.TypeSearchCheckpoint) + binary.LittleEndian.PutUint64(data[1:9], s.blockNum) + binary.LittleEndian.PutUint32(data[9:13], s.logsSince) + binary.LittleEndian.PutUint64(data[13:21], s.timestamp) + return data +} + +type canonicalHash struct { + hash common.Hash +} + +func newCanonicalHash(hash common.Hash) canonicalHash { + return canonicalHash{hash: hash} +} + +func newCanonicalHashFromEntry(data entrydb.Entry) (canonicalHash, error) { + if data.Type() != entrydb.TypeCanonicalHash { + return canonicalHash{}, fmt.Errorf("%w: attempting to decode canonical hash but was type %s", ErrDataCorruption, data.Type()) + } + return newCanonicalHash(common.Hash(data[1:33])), nil +} + +func (c canonicalHash) encode() entrydb.Entry { + var entry entrydb.Entry + entry[0] = uint8(entrydb.TypeCanonicalHash) + copy(entry[1:33], c.hash[:]) + return entry +} + +type initiatingEvent struct { + hasExecMsg bool + logHash common.Hash +} + +func newInitiatingEventFromEntry(data entrydb.Entry) (initiatingEvent, error) { + if data.Type() != entrydb.TypeInitiatingEvent { + return initiatingEvent{}, fmt.Errorf("%w: attempting to decode initiating event but was type %s", ErrDataCorruption, data.Type()) + } + flags := data[1] + return initiatingEvent{ + hasExecMsg: flags&eventFlagHasExecutingMessage != 0, + logHash: common.Hash(data[2:34]), + }, nil +} + +func newInitiatingEvent(logHash common.Hash, hasExecMsg bool) initiatingEvent { + return initiatingEvent{ + hasExecMsg: hasExecMsg, + logHash: logHash, + } +} + +// encode creates an initiating event entry +// type 2: "initiating event" = 22 bytes +func (i initiatingEvent) encode() entrydb.Entry { + var data entrydb.Entry + data[0] = uint8(entrydb.TypeInitiatingEvent) + flags := byte(0) + if i.hasExecMsg { + flags = flags | eventFlagHasExecutingMessage + } + data[1] = flags + copy(data[2:34], i.logHash[:]) + return data +} + +type executingLink struct { + chain uint32 + blockNum uint64 + logIdx uint32 + timestamp uint64 +} + +func newExecutingLink(msg types.ExecutingMessage) (executingLink, error) { + if msg.LogIdx > 1<<24 { + return executingLink{}, fmt.Errorf("log idx is too large (%v)", msg.LogIdx) + } + return executingLink{ + chain: msg.Chain, + blockNum: msg.BlockNum, + logIdx: msg.LogIdx, + timestamp: msg.Timestamp, + }, nil +} + +func newExecutingLinkFromEntry(data entrydb.Entry) (executingLink, error) { + if data.Type() != entrydb.TypeExecutingLink { + return executingLink{}, fmt.Errorf("%w: attempting to decode executing link but was type %s", ErrDataCorruption, data.Type()) + } + timestamp := binary.LittleEndian.Uint64(data[16:24]) + return executingLink{ + chain: binary.LittleEndian.Uint32(data[1:5]), + blockNum: binary.LittleEndian.Uint64(data[5:13]), + logIdx: uint32(data[13]) | uint32(data[14])<<8 | uint32(data[15])<<16, + timestamp: timestamp, + }, nil +} + +// encode creates an executing link entry +// type 3: "executing link" = 24 bytes +func (e executingLink) encode() entrydb.Entry { + var entry entrydb.Entry + entry[0] = uint8(entrydb.TypeExecutingLink) + binary.LittleEndian.PutUint32(entry[1:5], e.chain) + binary.LittleEndian.PutUint64(entry[5:13], e.blockNum) + + entry[13] = byte(e.logIdx) + entry[14] = byte(e.logIdx >> 8) + entry[15] = byte(e.logIdx >> 16) + + binary.LittleEndian.PutUint64(entry[16:24], e.timestamp) + return entry +} + +type executingCheck struct { + hash common.Hash +} + +func newExecutingCheck(hash common.Hash) executingCheck { + return executingCheck{hash: hash} +} + +func newExecutingCheckFromEntry(data entrydb.Entry) (executingCheck, error) { + if data.Type() != entrydb.TypeExecutingCheck { + return executingCheck{}, fmt.Errorf("%w: attempting to decode executing check but was type %s", ErrDataCorruption, data.Type()) + } + return newExecutingCheck(common.Hash(data[1:33])), nil +} + +// encode creates an executing check entry +// type 4: "executing check" = 33 bytes +func (e executingCheck) encode() entrydb.Entry { + var entry entrydb.Entry + entry[0] = uint8(entrydb.TypeExecutingCheck) + copy(entry[1:33], e.hash[:]) + return entry +} + +type paddingEntry struct{} + +// encoding of the padding entry +// type 5: "padding" = 34 bytes +func (e paddingEntry) encode() entrydb.Entry { + var entry entrydb.Entry + entry[0] = uint8(entrydb.TypePadding) + return entry +} diff --git a/op-supervisor/supervisor/backend/db/logs/iterator.go b/op-supervisor/supervisor/backend/db/logs/iterator.go new file mode 100644 index 000000000000..4b3bd1b65908 --- /dev/null +++ b/op-supervisor/supervisor/backend/db/logs/iterator.go @@ -0,0 +1,144 @@ +package logs + +import ( + "errors" + "fmt" + "io" + + "github.com/ethereum/go-ethereum/common" + + "github.com/ethereum-optimism/optimism/op-supervisor/supervisor/backend/db/entrydb" + "github.com/ethereum-optimism/optimism/op-supervisor/supervisor/types" +) + +type IteratorState interface { + NextIndex() entrydb.EntryIdx + SealedBlock() (hash common.Hash, num uint64, ok bool) + InitMessage() (hash common.Hash, logIndex uint32, ok bool) + ExecMessage() *types.ExecutingMessage +} + +type Iterator interface { + End() error + NextInitMsg() error + NextExecMsg() error + NextBlock() error + IteratorState +} + +type iterator struct { + db *DB + current logContext + entriesRead int64 +} + +// End traverses the iterator to the end of the DB. +// It does not return io.EOF or ErrFuture. +func (i *iterator) End() error { + for { + _, err := i.next() + if errors.Is(err, ErrFuture) { + return nil + } else if err != nil { + return err + } + } +} + +// NextInitMsg returns the next initiating message in the iterator. +// It scans forward until it finds and fully reads an initiating event, skipping any blocks. +func (i *iterator) NextInitMsg() error { + seenLog := false + for { + typ, err := i.next() + if err != nil { + return err + } + if typ == entrydb.TypeInitiatingEvent { + seenLog = true + } + if !i.current.hasCompleteBlock() { + continue // must know the block we're building on top of + } + if i.current.hasIncompleteLog() { + continue // didn't finish processing the log yet + } + if seenLog { + return nil + } + } +} + +// NextExecMsg returns the next executing message in the iterator. +// It scans forward until it finds and fully reads an initiating event, skipping any blocks. +// This does not stay at the executing message of the current initiating message, if there is any. +func (i *iterator) NextExecMsg() error { + for { + err := i.NextInitMsg() + if err != nil { + return err + } + if i.current.execMsg != nil { + return nil // found a new executing message! + } + } +} + +// NextBlock returns the next block in the iterator. +// It scans forward until it finds and fully reads a block, skipping any events. +func (i *iterator) NextBlock() error { + seenBlock := false + for { + typ, err := i.next() + if err != nil { + return err + } + if typ == entrydb.TypeSearchCheckpoint { + seenBlock = true + } + if !i.current.hasCompleteBlock() { + continue // need the full block content + } + if seenBlock { + return nil + } + } +} + +// Read and apply the next entry. +func (i *iterator) next() (entrydb.EntryType, error) { + index := i.current.nextEntryIndex + entry, err := i.db.store.Read(index) + if err != nil { + if errors.Is(err, io.EOF) { + return 0, ErrFuture + } + return 0, fmt.Errorf("failed to read entry %d: %w", index, err) + } + if err := i.current.ApplyEntry(entry); err != nil { + return entry.Type(), fmt.Errorf("failed to apply entry %d to iterator state: %w", index, err) + } + + i.entriesRead++ + return entry.Type(), nil +} + +func (i *iterator) NextIndex() entrydb.EntryIdx { + return i.current.NextIndex() +} + +// SealedBlock returns the sealed block that we are appending logs after, if any is available. +// I.e. the block is the parent block of the block containing the logs that are currently appending to it. +func (i *iterator) SealedBlock() (hash common.Hash, num uint64, ok bool) { + return i.current.SealedBlock() +} + +// InitMessage returns the current initiating message, if any is available. +func (i *iterator) InitMessage() (hash common.Hash, logIndex uint32, ok bool) { + return i.current.InitMessage() +} + +// ExecMessage returns the current executing message, if any is available. +func (i *iterator) ExecMessage() *types.ExecutingMessage { + return i.current.ExecMessage() +} diff --git a/op-supervisor/supervisor/backend/db/logs/state.go b/op-supervisor/supervisor/backend/db/logs/state.go new file mode 100644 index 000000000000..bb00762acc2e --- /dev/null +++ b/op-supervisor/supervisor/backend/db/logs/state.go @@ -0,0 +1,407 @@ +package logs + +import ( + "errors" + "fmt" + "io" + + "github.com/ethereum/go-ethereum/common" + + "github.com/ethereum-optimism/optimism/op-service/eth" + "github.com/ethereum-optimism/optimism/op-supervisor/supervisor/backend/db/entrydb" + "github.com/ethereum-optimism/optimism/op-supervisor/supervisor/types" +) + +// logContext is a buffer on top of the DB, +// where blocks and logs can be applied to. +// +// Rules: +// +// if entry_index % 256 == 0: must be type 0. For easy binary search. +// else if end_of_block: also type 0. +// else: +// after type 0: type 1 +// after type 1: type 2 iff any event and space, otherwise type 0 +// after type 2: type 3 iff executing, otherwise type 2 or 0 +// after type 3: type 4 +// after type 4: type 2 iff any event and space, otherwise type 0 +// after type 5: any +// +// Type 0 can repeat: seal the block, then start a search checkpoint, then a single canonical hash. +// Type 0 may also be used as padding: type 2 only starts when it will not be interrupted by a search checkpoint. +// +// Types ( = 1 byte): +// type 0: "checkpoint" = 21 bytes +// type 1: "canonical hash" = 33 bytes +// type 2: "initiating event" = 34 bytes +// type 3: "executing link" = 24 bytes +// type 4: "executing check" = 33 bytes +// type 5: "padding" = 34 bytes +// other types: future compat. E.g. for linking to L1, registering block-headers as a kind of initiating-event, tracking safe-head progression, etc. +// +// Right-pad each entry that is not 34 bytes. +// +// We insert a checkpoint for every search interval and block sealing event, +// and these may overlap as the same thing. +// Such seal has logsSince == 0, i.e. wrapping up the last block and starting a fresh list of logs. +// +// event-flags: each bit represents a boolean value, currently only two are defined +// * event-flags & 0x01 - true if the initiating event has an executing link that should follow. Allows detecting when the executing link failed to write. +// event-hash: H(origin, timestamp, payloadhash); enough to check identifier matches & payload matches. +type logContext struct { + // next entry index, including the contents of `out` + nextEntryIndex entrydb.EntryIdx + + // blockHash of the last sealed block. + // A block is not considered sealed until we know its block hash. + // While we process logs we keep the parent-block of said logs around as sealed block. + blockHash common.Hash + // blockNum of the last sealed block + blockNum uint64 + // timestamp of the last sealed block + timestamp uint64 + + // number of logs since the last sealed block + logsSince uint32 + + // payload-hash of the log-event that was last processed. (may not be fully processed, see doneLog) + logHash common.Hash + + // executing message that might exist for the current log event. + // Might be incomplete; if !logDone while we already processed the initiating event, + // then we know an executing message is still coming. + execMsg *types.ExecutingMessage + + need entrydb.EntryTypeFlag + + // buffer of entries not yet in the DB. + // This is generated as objects are applied. + // E.g. you can build multiple hypothetical blocks with log events on top of the state, + // before flushing the entries to a DB. + // However, no entries can be read from the DB while objects are being applied. + out []entrydb.Entry +} + +type EntryObj interface { + encode() entrydb.Entry +} + +func (l *logContext) NextIndex() entrydb.EntryIdx { + return l.nextEntryIndex +} + +// SealedBlock returns the block that we are building on top of, and if it is sealed. +func (l *logContext) SealedBlock() (hash common.Hash, num uint64, ok bool) { + if !l.hasCompleteBlock() { + return common.Hash{}, 0, false + } + return l.blockHash, l.blockNum, true +} + +func (l *logContext) hasCompleteBlock() bool { + return !l.need.Any(entrydb.FlagCanonicalHash) +} + +func (l *logContext) hasIncompleteLog() bool { + return l.need.Any(entrydb.FlagInitiatingEvent | entrydb.FlagExecutingLink | entrydb.FlagExecutingCheck) +} + +func (l *logContext) hasReadableLog() bool { + return l.logsSince > 0 && !l.hasIncompleteLog() +} + +// InitMessage returns the current initiating message, if any is available. +func (l *logContext) InitMessage() (hash common.Hash, logIndex uint32, ok bool) { + if !l.hasReadableLog() { + return common.Hash{}, 0, false + } + return l.logHash, l.logsSince - 1, true +} + +// ExecMessage returns the current executing message, if any is available. +func (l *logContext) ExecMessage() *types.ExecutingMessage { + if l.hasCompleteBlock() && l.hasReadableLog() && l.execMsg != nil { + return l.execMsg + } + return nil +} + +// ApplyEntry applies an entry on top of the current state. +func (l *logContext) ApplyEntry(entry entrydb.Entry) error { + // Wrap processEntry to add common useful error message info + err := l.processEntry(entry) + if err != nil { + return fmt.Errorf("failed to process type %s entry at idx %d (%x): %w", entry.Type().String(), l.nextEntryIndex, entry[:], err) + } + return nil +} + +// processEntry decodes and applies an entry to the state. +// Entries may not be applied if we are in the process of generating entries from objects. +// These outputs need to be flushed before inputs can be accepted. +func (l *logContext) processEntry(entry entrydb.Entry) error { + if len(l.out) != 0 { + panic("can only apply without appending if the state is still empty") + } + switch entry.Type() { + case entrydb.TypeSearchCheckpoint: + current, err := newSearchCheckpointFromEntry(entry) + if err != nil { + return err + } + l.blockNum = current.blockNum + l.blockHash = common.Hash{} + l.logsSince = current.logsSince // TODO this is bumping the logsSince? + l.timestamp = current.timestamp + l.need.Add(entrydb.FlagCanonicalHash) + // Log data after the block we are sealing remains to be seen + if l.logsSince == 0 { + l.logHash = common.Hash{} + l.execMsg = nil + } + case entrydb.TypeCanonicalHash: + if !l.need.Any(entrydb.FlagCanonicalHash) { + return errors.New("not ready for canonical hash entry, already sealed the last block") + } + canonHash, err := newCanonicalHashFromEntry(entry) + if err != nil { + return err + } + l.blockHash = canonHash.hash + l.need.Remove(entrydb.FlagCanonicalHash) + case entrydb.TypeInitiatingEvent: + if !l.hasCompleteBlock() { + return errors.New("did not complete block seal, cannot add log") + } + if l.hasIncompleteLog() { + return errors.New("cannot process log before last log completes") + } + evt, err := newInitiatingEventFromEntry(entry) + if err != nil { + return err + } + l.execMsg = nil // clear the old state + l.logHash = evt.logHash + if evt.hasExecMsg { + l.need.Add(entrydb.FlagExecutingLink | entrydb.FlagExecutingCheck) + } else { + l.logsSince += 1 + } + l.need.Remove(entrydb.FlagInitiatingEvent) + case entrydb.TypeExecutingLink: + if !l.need.Any(entrydb.FlagExecutingLink) { + return errors.New("unexpected executing-link") + } + link, err := newExecutingLinkFromEntry(entry) + if err != nil { + return err + } + l.execMsg = &types.ExecutingMessage{ + Chain: link.chain, + BlockNum: link.blockNum, + LogIdx: link.logIdx, + Timestamp: link.timestamp, + Hash: common.Hash{}, // not known yet + } + l.need.Remove(entrydb.FlagExecutingLink) + l.need.Add(entrydb.FlagExecutingCheck) + case entrydb.TypeExecutingCheck: + if l.need.Any(entrydb.FlagExecutingLink) { + return errors.New("need executing link to be applied before the check part") + } + if !l.need.Any(entrydb.FlagExecutingCheck) { + return errors.New("unexpected executing check") + } + link, err := newExecutingCheckFromEntry(entry) + if err != nil { + return err + } + l.execMsg.Hash = link.hash + l.need.Remove(entrydb.FlagExecutingCheck) + l.logsSince += 1 + case entrydb.TypePadding: + if l.need.Any(entrydb.FlagPadding) { + l.need.Remove(entrydb.FlagPadding) + } else { + l.need.Remove(entrydb.FlagPadding2) + } + default: + return fmt.Errorf("unknown entry type: %s", entry.Type()) + } + l.nextEntryIndex += 1 + return nil +} + +// appendEntry add the entry to the output-buffer, +// and registers it as last processed entry type, and increments the next entry-index. +func (l *logContext) appendEntry(obj EntryObj) { + entry := obj.encode() + l.out = append(l.out, entry) + l.nextEntryIndex += 1 +} + +// infer advances the logContext in cases where multiple entries are to be appended implicitly +// depending on the last type of entry, a new entry is appended, +// or when the searchCheckpoint should be inserted. +// This can be done repeatedly until there is no more implied data to extend. +func (l *logContext) infer() error { + // We force-insert a checkpoint whenever we hit the known fixed interval. + if l.nextEntryIndex%searchCheckpointFrequency == 0 { + l.need.Add(entrydb.FlagSearchCheckpoint) + } + if l.need.Any(entrydb.FlagSearchCheckpoint) { + l.appendEntry(newSearchCheckpoint(l.blockNum, l.logsSince, l.timestamp)) + l.need.Add(entrydb.FlagCanonicalHash) // always follow with a canonical hash + l.need.Remove(entrydb.FlagSearchCheckpoint) + return nil + } + if l.need.Any(entrydb.FlagCanonicalHash) { + l.appendEntry(newCanonicalHash(l.blockHash)) + l.need.Remove(entrydb.FlagCanonicalHash) + return nil + } + if l.need.Any(entrydb.FlagPadding) { + l.appendEntry(paddingEntry{}) + l.need.Remove(entrydb.FlagPadding) + return nil + } + if l.need.Any(entrydb.FlagPadding2) { + l.appendEntry(paddingEntry{}) + l.need.Remove(entrydb.FlagPadding2) + return nil + } + if l.need.Any(entrydb.FlagInitiatingEvent) { + // If we are running out of space for log-event data, + // write some checkpoints as padding, to pass the checkpoint. + if l.execMsg != nil { // takes 3 total. Need to avoid the checkpoint. + switch l.nextEntryIndex % searchCheckpointFrequency { + case searchCheckpointFrequency - 1: + l.need.Add(entrydb.FlagPadding) + return nil + case searchCheckpointFrequency - 2: + l.need.Add(entrydb.FlagPadding | entrydb.FlagPadding2) + return nil + } + } + evt := newInitiatingEvent(l.logHash, l.execMsg != nil) + l.appendEntry(evt) + l.need.Remove(entrydb.FlagInitiatingEvent) + if l.execMsg == nil { + l.logsSince += 1 + } + return nil + } + if l.need.Any(entrydb.FlagExecutingLink) { + link, err := newExecutingLink(*l.execMsg) + if err != nil { + return fmt.Errorf("failed to create executing link: %w", err) + } + l.appendEntry(link) + l.need.Remove(entrydb.FlagExecutingLink) + return nil + } + if l.need.Any(entrydb.FlagExecutingCheck) { + l.appendEntry(newExecutingCheck(l.execMsg.Hash)) + l.need.Remove(entrydb.FlagExecutingCheck) + l.logsSince += 1 + return nil + } + return io.EOF +} + +// inferFull advances the queued entries held by the log context repeatedly +// until no more implied entries can be added +func (l *logContext) inferFull() error { + for i := 0; i < 10; i++ { + err := l.infer() + if err == nil { + continue + } + if err == io.EOF { // wrapped io.EOF does not count. + return nil + } else { + return err + } + } + panic("hit sanity limit") +} + +// forceBlock force-overwrites the state, to match the given sealed block as starting point (excl) +func (l *logContext) forceBlock(upd eth.BlockID, timestamp uint64) error { + if l.nextEntryIndex != 0 { + return errors.New("can only bootstrap on top of an empty state") + } + l.blockHash = upd.Hash + l.blockNum = upd.Number + l.timestamp = timestamp + l.logsSince = 0 + l.execMsg = nil + l.logHash = common.Hash{} + l.need = 0 + l.out = nil + return l.inferFull() // apply to the state as much as possible +} + +// SealBlock applies a block header on top of the current state. +// This seals the state; no further logs of this block may be added with ApplyLog. +func (l *logContext) SealBlock(parent common.Hash, upd eth.BlockID, timestamp uint64) error { + // If we don't have any entries yet, allow any block to start things off + if l.nextEntryIndex != 0 { + if err := l.inferFull(); err != nil { // ensure we can start applying + return err + } + if l.blockHash != parent { + return fmt.Errorf("%w: cannot apply block %s (parent %s) on top of %s", ErrConflict, upd, parent, l.blockHash) + } + if l.blockHash != (common.Hash{}) && l.blockNum+1 != upd.Number { + return fmt.Errorf("%w: cannot apply block %d on top of %d", ErrConflict, upd.Number, l.blockNum) + } + if l.timestamp > timestamp { + return fmt.Errorf("%w: block timestamp %d must be equal or larger than current timestamp %d", ErrConflict, timestamp, l.timestamp) + } + } + l.blockHash = upd.Hash + l.blockNum = upd.Number + l.timestamp = timestamp + l.logsSince = 0 + l.execMsg = nil + l.logHash = common.Hash{} + l.need.Add(entrydb.FlagSearchCheckpoint) + return l.inferFull() // apply to the state as much as possible +} + +// ApplyLog applies a log on top of the current state. +// The parent-block that the log comes after must be applied with ApplyBlock first. +func (l *logContext) ApplyLog(parentBlock eth.BlockID, logIdx uint32, logHash common.Hash, execMsg *types.ExecutingMessage) error { + if parentBlock == (eth.BlockID{}) { + return fmt.Errorf("genesis does not have logs: %w", ErrLogOutOfOrder) + } + if err := l.inferFull(); err != nil { // ensure we can start applying + return err + } + if !l.hasCompleteBlock() { + if l.blockNum == 0 { + return fmt.Errorf("%w: should not have logs in block 0", ErrLogOutOfOrder) + } else { + return errors.New("cannot append log before last known block is sealed") + } + } + // check parent block + if l.blockHash != parentBlock.Hash { + return fmt.Errorf("%w: log builds on top of block %s, but have block %s", ErrLogOutOfOrder, parentBlock, l.blockHash) + } + if l.blockNum != parentBlock.Number { + return fmt.Errorf("%w: log builds on top of block %d, but have block %d", ErrLogOutOfOrder, parentBlock.Number, l.blockNum) + } + // check if log fits on top. The length so far == the index of the next log. + if logIdx != l.logsSince { + return fmt.Errorf("%w: expected event index %d, cannot append %d", ErrLogOutOfOrder, l.logsSince, logIdx) + } + l.logHash = logHash + l.execMsg = execMsg + l.need.Add(entrydb.FlagInitiatingEvent) + if execMsg != nil { + l.need.Add(entrydb.FlagExecutingLink | entrydb.FlagExecutingCheck) + } + return l.inferFull() // apply to the state as much as possible +} diff --git a/op-supervisor/supervisor/backend/db/safety_checkers.go b/op-supervisor/supervisor/backend/db/safety_checkers.go new file mode 100644 index 000000000000..916f26f6dead --- /dev/null +++ b/op-supervisor/supervisor/backend/db/safety_checkers.go @@ -0,0 +1,190 @@ +package db + +import ( + "errors" + + "github.com/ethereum/go-ethereum/common" + + "github.com/ethereum-optimism/optimism/op-supervisor/supervisor/backend/db/entrydb" + "github.com/ethereum-optimism/optimism/op-supervisor/supervisor/backend/db/heads" + "github.com/ethereum-optimism/optimism/op-supervisor/supervisor/backend/db/logs" + "github.com/ethereum-optimism/optimism/op-supervisor/supervisor/types" +) + +const ( + Unsafe = "unsafe" + Safe = "safe" + Finalized = "finalized" +) + +// SafetyChecker is an interface for checking the safety of a log entry +// and updating the local head for a chain. +type SafetyChecker interface { + LocalHeadForChain(chainID types.ChainID) entrydb.EntryIdx + CrossHeadForChain(chainID types.ChainID) entrydb.EntryIdx + Check(chain types.ChainID, blockNum uint64, logIdx uint32, logHash common.Hash) bool + Update(chain types.ChainID, index entrydb.EntryIdx) heads.OperationFn + Name() string + SafetyLevel() types.SafetyLevel +} + +// unsafeChecker is a SafetyChecker that uses the unsafe head as the view into the database +type unsafeChecker struct { + chainsDB *ChainsDB +} + +// safeChecker is a SafetyChecker that uses the safe head as the view into the database +type safeChecker struct { + chainsDB *ChainsDB +} + +// finalizedChecker is a SafetyChecker that uses the finalized head as the view into the database +type finalizedChecker struct { + chainsDB *ChainsDB +} + +// NewSafetyChecker creates a new SafetyChecker of the given type +func NewSafetyChecker(t types.SafetyLevel, chainsDB *ChainsDB) SafetyChecker { + switch t { + case Unsafe: + return &unsafeChecker{ + chainsDB: chainsDB, + } + case Safe: + return &safeChecker{ + chainsDB: chainsDB, + } + case Finalized: + return &finalizedChecker{ + chainsDB: chainsDB, + } + default: + panic("unknown safety checker type") + } +} + +// Name returns the safety checker type, using the same strings as the constants used in construction +func (c *unsafeChecker) Name() string { + return Unsafe +} + +func (c *safeChecker) Name() string { + return Safe +} + +func (c *finalizedChecker) Name() string { + return Finalized +} + +// LocalHeadForChain returns the local head for the given chain +// based on the type of SafetyChecker +func (c *unsafeChecker) LocalHeadForChain(chainID types.ChainID) entrydb.EntryIdx { + heads := c.chainsDB.heads.Current().Get(chainID) + return heads.Unsafe +} + +func (c *safeChecker) LocalHeadForChain(chainID types.ChainID) entrydb.EntryIdx { + heads := c.chainsDB.heads.Current().Get(chainID) + return heads.LocalSafe +} + +func (c *finalizedChecker) LocalHeadForChain(chainID types.ChainID) entrydb.EntryIdx { + heads := c.chainsDB.heads.Current().Get(chainID) + return heads.LocalFinalized +} + +// CrossHeadForChain returns the x-head for the given chain +// based on the type of SafetyChecker +func (c *unsafeChecker) CrossHeadForChain(chainID types.ChainID) entrydb.EntryIdx { + heads := c.chainsDB.heads.Current().Get(chainID) + return heads.CrossUnsafe +} + +func (c *safeChecker) CrossHeadForChain(chainID types.ChainID) entrydb.EntryIdx { + heads := c.chainsDB.heads.Current().Get(chainID) + return heads.CrossSafe +} + +func (c *finalizedChecker) CrossHeadForChain(chainID types.ChainID) entrydb.EntryIdx { + heads := c.chainsDB.heads.Current().Get(chainID) + return heads.CrossFinalized +} + +func (c *unsafeChecker) SafetyLevel() types.SafetyLevel { + return types.CrossUnsafe +} + +func (c *safeChecker) SafetyLevel() types.SafetyLevel { + return types.CrossSafe +} + +func (c *finalizedChecker) SafetyLevel() types.SafetyLevel { + return types.CrossFinalized +} + +// check checks if the log entry is safe, provided a local head for the chain +// it is used by the individual SafetyCheckers to determine if a log entry is safe +func check( + chainsDB *ChainsDB, + localHead entrydb.EntryIdx, + chain types.ChainID, + blockNum uint64, + logIdx uint32, + logHash common.Hash) bool { + + // for the Check to be valid, the log must: + // exist at the blockNum and logIdx + // have a hash that matches the provided hash (implicit in the Contains call), and + // be less than or equal to the local head for the chain + index, err := chainsDB.logDBs[chain].Contains(blockNum, logIdx, logHash) + if err != nil { + if errors.Is(err, logs.ErrFuture) { + return false // TODO(#12031) + } + if errors.Is(err, logs.ErrConflict) { + return false // TODO(#12031) + } + return false + } + return index <= localHead +} + +// Check checks if the log entry is safe, provided a local head for the chain +// it passes on the local head this checker is concerned with, along with its view of the database +func (c *unsafeChecker) Check(chain types.ChainID, blockNum uint64, logIdx uint32, logHash common.Hash) bool { + return check(c.chainsDB, c.LocalHeadForChain(chain), chain, blockNum, logIdx, logHash) +} +func (c *safeChecker) Check(chain types.ChainID, blockNum uint64, logIdx uint32, logHash common.Hash) bool { + return check(c.chainsDB, c.LocalHeadForChain(chain), chain, blockNum, logIdx, logHash) +} +func (c *finalizedChecker) Check(chain types.ChainID, blockNum uint64, logIdx uint32, logHash common.Hash) bool { + return check(c.chainsDB, c.LocalHeadForChain(chain), chain, blockNum, logIdx, logHash) +} + +// Update creates an Operation that updates the x-head for the chain, given an index to set it to +func (c *unsafeChecker) Update(chain types.ChainID, index entrydb.EntryIdx) heads.OperationFn { + return func(heads *heads.Heads) error { + chainHeads := heads.Get(chain) + chainHeads.CrossUnsafe = index + heads.Put(chain, chainHeads) + return nil + } +} + +func (c *safeChecker) Update(chain types.ChainID, index entrydb.EntryIdx) heads.OperationFn { + return func(heads *heads.Heads) error { + chainHeads := heads.Get(chain) + chainHeads.CrossSafe = index + heads.Put(chain, chainHeads) + return nil + } +} + +func (c *finalizedChecker) Update(chain types.ChainID, index entrydb.EntryIdx) heads.OperationFn { + return func(heads *heads.Heads) error { + chainHeads := heads.Get(chain) + chainHeads.CrossFinalized = index + heads.Put(chain, chainHeads) + return nil + } +} diff --git a/op-supervisor/supervisor/backend/db/safety_checkers_test.go b/op-supervisor/supervisor/backend/db/safety_checkers_test.go new file mode 100644 index 000000000000..c8fb4e34a757 --- /dev/null +++ b/op-supervisor/supervisor/backend/db/safety_checkers_test.go @@ -0,0 +1,213 @@ +package db + +import ( + "errors" + "testing" + + "github.com/stretchr/testify/require" + + "github.com/ethereum/go-ethereum/common" + "github.com/ethereum/go-ethereum/log" + + "github.com/ethereum-optimism/optimism/op-service/testlog" + "github.com/ethereum-optimism/optimism/op-supervisor/supervisor/backend/db/entrydb" + "github.com/ethereum-optimism/optimism/op-supervisor/supervisor/backend/db/heads" + "github.com/ethereum-optimism/optimism/op-supervisor/supervisor/backend/db/logs" + "github.com/ethereum-optimism/optimism/op-supervisor/supervisor/types" +) + +// TestHeadsForChain tests the heads for a chain, +// confirming the Unsafe, Safe and Finalized all return the correct head for the chain. +// and confirming that the chainID matters when finding the value +func TestHeadsForChain(t *testing.T) { + h := heads.NewHeads() + chainHeads := heads.ChainHeads{ + Unsafe: entrydb.EntryIdx(1), + CrossUnsafe: entrydb.EntryIdx(2), + LocalSafe: entrydb.EntryIdx(3), + CrossSafe: entrydb.EntryIdx(4), + LocalFinalized: entrydb.EntryIdx(5), + CrossFinalized: entrydb.EntryIdx(6), + } + h.Put(types.ChainIDFromUInt64(1), chainHeads) + chainsDB := NewChainsDB(nil, &stubHeadStorage{h}, testlog.Logger(t, log.LevelDebug)) + tcases := []struct { + name string + chainID types.ChainID + checkerType types.SafetyLevel + expectedLocal entrydb.EntryIdx + expectedCross entrydb.EntryIdx + }{ + { + "Unsafe Head", + types.ChainIDFromUInt64(1), + Unsafe, + entrydb.EntryIdx(1), + entrydb.EntryIdx(2), + }, + { + "Safe Head", + types.ChainIDFromUInt64(1), + Safe, + entrydb.EntryIdx(3), + entrydb.EntryIdx(4), + }, + { + "Finalized Head", + types.ChainIDFromUInt64(1), + Finalized, + entrydb.EntryIdx(5), + entrydb.EntryIdx(6), + }, + { + "Incorrect Chain", + types.ChainIDFromUInt64(100), + Safe, + entrydb.EntryIdx(0), + entrydb.EntryIdx(0), + }, + } + + for _, c := range tcases { + t.Run(c.name, func(t *testing.T) { + checker := NewSafetyChecker(c.checkerType, chainsDB) + localHead := checker.LocalHeadForChain(c.chainID) + crossHead := checker.CrossHeadForChain(c.chainID) + require.Equal(t, c.expectedLocal, localHead) + require.Equal(t, c.expectedCross, crossHead) + }) + } +} + +func TestCheck(t *testing.T) { + h := heads.NewHeads() + chainHeads := heads.ChainHeads{ + Unsafe: entrydb.EntryIdx(6), + CrossUnsafe: entrydb.EntryIdx(5), + LocalSafe: entrydb.EntryIdx(4), + CrossSafe: entrydb.EntryIdx(3), + LocalFinalized: entrydb.EntryIdx(2), + CrossFinalized: entrydb.EntryIdx(1), + } + h.Put(types.ChainIDFromUInt64(1), chainHeads) + + // the logStore contains just a single stubbed log DB + logDB := &stubLogDB{} + logsStore := map[types.ChainID]LogStorage{ + types.ChainIDFromUInt64(1): logDB, + } + + chainsDB := NewChainsDB(logsStore, &stubHeadStorage{h}, testlog.Logger(t, log.LevelDebug)) + + tcases := []struct { + name string + checkerType types.SafetyLevel + chainID types.ChainID + blockNum uint64 + logIdx uint32 + loghash common.Hash + containsResponse containsResponse + expected bool + }{ + { + // confirm that checking Unsafe uses the unsafe head, + // and that we can find logs even *at* the unsafe head index + "Unsafe Log at Head", + Unsafe, + types.ChainIDFromUInt64(1), + 1, + 1, + common.Hash{1, 2, 3}, + containsResponse{entrydb.EntryIdx(6), nil}, + true, + }, + { + // confirm that checking the Safe head works + "Safe Log", + Safe, + types.ChainIDFromUInt64(1), + 1, + 1, + common.Hash{1, 2, 3}, + containsResponse{entrydb.EntryIdx(3), nil}, + true, + }, + { + // confirm that checking the Finalized head works + "Finalized Log", + Finalized, + types.ChainIDFromUInt64(1), + 1, + 1, + common.Hash{1, 2, 3}, + containsResponse{entrydb.EntryIdx(1), nil}, + true, + }, + { + // confirm that when exists is false, we return false + "Does not Exist", + Safe, + types.ChainIDFromUInt64(1), + 1, + 1, + common.Hash{1, 2, 3}, + containsResponse{entrydb.EntryIdx(1), logs.ErrConflict}, + false, + }, + { + // confirm that when a head is out of range, we return false + "Unsafe Out of Range", + Unsafe, + types.ChainIDFromUInt64(1), + 1, + 1, + common.Hash{1, 2, 3}, + containsResponse{entrydb.EntryIdx(100), nil}, + false, + }, + { + // confirm that when a head is out of range, we return false + "Safe Out of Range", + Safe, + types.ChainIDFromUInt64(1), + 1, + 1, + common.Hash{1, 2, 3}, + containsResponse{entrydb.EntryIdx(5), nil}, + false, + }, + { + // confirm that when a head is out of range, we return false + "Finalized Out of Range", + Finalized, + types.ChainIDFromUInt64(1), + 1, + 1, + common.Hash{1, 2, 3}, + containsResponse{entrydb.EntryIdx(3), nil}, + false, + }, + { + // confirm that when Contains returns an error, we return false + "Error", + Safe, + types.ChainIDFromUInt64(1), + 1, + 1, + common.Hash{1, 2, 3}, + containsResponse{entrydb.EntryIdx(0), errors.New("error")}, + false, + }, + } + + for _, c := range tcases { + t.Run(c.name, func(t *testing.T) { + // rig the logStore to return the expected response + logDB.containsResponse = c.containsResponse + checker := NewSafetyChecker(c.checkerType, chainsDB) + r := checker.Check(c.chainID, c.blockNum, c.logIdx, c.loghash) + // confirm that the expected outcome is correct + require.Equal(t, c.expected, r) + }) + } +} diff --git a/op-supervisor/supervisor/backend/file_layout.go b/op-supervisor/supervisor/backend/file_layout.go new file mode 100644 index 000000000000..2a94266ef605 --- /dev/null +++ b/op-supervisor/supervisor/backend/file_layout.go @@ -0,0 +1,32 @@ +package backend + +import ( + "fmt" + "os" + "path/filepath" + + "github.com/ethereum-optimism/optimism/op-supervisor/supervisor/types" +) + +func prepLogDBPath(chainID types.ChainID, datadir string) (string, error) { + dir, err := prepChainDir(chainID, datadir) + if err != nil { + return "", err + } + return filepath.Join(dir, "log.db"), nil +} + +func prepChainDir(chainID types.ChainID, datadir string) (string, error) { + dir := filepath.Join(datadir, chainID.String()) + if err := os.MkdirAll(dir, 0755); err != nil { + return "", fmt.Errorf("failed to create chain directory %v: %w", dir, err) + } + return dir, nil +} + +func prepDataDir(datadir string) error { + if err := os.MkdirAll(datadir, 0755); err != nil { + return fmt.Errorf("failed to create data directory %v: %w", datadir, err) + } + return nil +} diff --git a/op-supervisor/supervisor/backend/file_layout_test.go b/op-supervisor/supervisor/backend/file_layout_test.go new file mode 100644 index 000000000000..ae06c3cd6ea4 --- /dev/null +++ b/op-supervisor/supervisor/backend/file_layout_test.go @@ -0,0 +1,30 @@ +package backend + +import ( + "math/big" + "os" + "path/filepath" + "testing" + + "github.com/ethereum-optimism/optimism/op-supervisor/supervisor/types" + "github.com/stretchr/testify/require" +) + +func TestLogDBPath(t *testing.T) { + base := t.TempDir() + chainIDStr := "42984928492928428424243444" + chainIDBig, ok := new(big.Int).SetString(chainIDStr, 10) + require.True(t, ok) + chainID := types.ChainIDFromBig(chainIDBig) + expected := filepath.Join(base, "subdir", chainIDStr, "log.db") + path, err := prepLogDBPath(chainID, filepath.Join(base, "subdir")) + require.NoError(t, err) + require.Equal(t, expected, path) + + // Check it still works when directories exist + require.NoError(t, os.WriteFile(path, []byte("test"), 0o644)) + + path, err = prepLogDBPath(chainID, filepath.Join(base, "subdir")) + require.NoError(t, err) + require.Equal(t, expected, path) +} diff --git a/op-supervisor/supervisor/backend/mock.go b/op-supervisor/supervisor/backend/mock.go new file mode 100644 index 000000000000..e62c7b950b7c --- /dev/null +++ b/op-supervisor/supervisor/backend/mock.go @@ -0,0 +1,60 @@ +package backend + +import ( + "context" + "errors" + "io" + "sync/atomic" + + "github.com/ethereum/go-ethereum/common" + "github.com/ethereum/go-ethereum/common/hexutil" + + "github.com/ethereum-optimism/optimism/op-supervisor/supervisor/frontend" + "github.com/ethereum-optimism/optimism/op-supervisor/supervisor/types" +) + +type MockBackend struct { + started atomic.Bool +} + +var _ frontend.Backend = (*MockBackend)(nil) + +var _ io.Closer = (*MockBackend)(nil) + +func NewMockBackend() *MockBackend { + return &MockBackend{} +} + +func (m *MockBackend) Start(ctx context.Context) error { + if !m.started.CompareAndSwap(false, true) { + return errors.New("already started") + } + return nil +} + +func (m *MockBackend) Stop(ctx context.Context) error { + if !m.started.CompareAndSwap(true, false) { + return errors.New("already stopped") + } + return nil +} + +func (m *MockBackend) AddL2RPC(ctx context.Context, rpc string) error { + return nil +} + +func (m *MockBackend) CheckMessage(identifier types.Identifier, payloadHash common.Hash) (types.SafetyLevel, error) { + return types.CrossUnsafe, nil +} + +func (m *MockBackend) CheckMessages(messages []types.Message, minSafety types.SafetyLevel) error { + return nil +} + +func (m *MockBackend) CheckBlock(chainID *hexutil.U256, blockHash common.Hash, blockNumber hexutil.Uint64) (types.SafetyLevel, error) { + return types.CrossUnsafe, nil +} + +func (m *MockBackend) Close() error { + return nil +} diff --git a/op-supervisor/supervisor/backend/source/chain.go b/op-supervisor/supervisor/backend/source/chain.go new file mode 100644 index 000000000000..c8fef89f8b83 --- /dev/null +++ b/op-supervisor/supervisor/backend/source/chain.go @@ -0,0 +1,89 @@ +package source + +import ( + "context" + "fmt" + "time" + + "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/sources/caching" + "github.com/ethereum-optimism/optimism/op-supervisor/supervisor/types" + "github.com/ethereum/go-ethereum/log" +) + +// TODO(optimism#11032) Make these configurable and a sensible default +const epochPollInterval = 30 * time.Second +const pollInterval = 2 * time.Second +const trustRpc = false +const rpcKind = sources.RPCKindStandard + +type Metrics interface { + caching.Metrics +} + +type Storage interface { + LogStorage + DatabaseRewinder + LatestBlockNum(chainID types.ChainID) (num uint64, ok bool) +} + +// ChainMonitor monitors a source L2 chain, retrieving the data required to populate the database and perform +// interop consolidation. It detects and notifies when reorgs occur. +type ChainMonitor struct { + log log.Logger + headMonitor *HeadMonitor +} + +func NewChainMonitor(ctx context.Context, logger log.Logger, m Metrics, chainID types.ChainID, rpc string, client client.RPC, store Storage) (*ChainMonitor, error) { + logger = logger.New("chainID", chainID) + cl, err := newClient(ctx, logger, m, rpc, client, pollInterval, trustRpc, rpcKind) + if err != nil { + return nil, err + } + + latest, ok := store.LatestBlockNum(chainID) + if !ok { + logger.Warn("") + } + + startingHead := eth.L1BlockRef{ + Number: latest, + } + + processLogs := newLogProcessor(chainID, store) + fetchReceipts := newLogFetcher(cl, processLogs) + unsafeBlockProcessor := NewChainProcessor(logger, cl, chainID, startingHead, fetchReceipts, store) + + unsafeProcessors := []HeadProcessor{unsafeBlockProcessor} + callback := newHeadUpdateProcessor(logger, unsafeProcessors, nil, nil) + headMonitor := NewHeadMonitor(logger, epochPollInterval, cl, callback) + + return &ChainMonitor{ + log: logger, + headMonitor: headMonitor, + }, nil +} + +func (c *ChainMonitor) Start() error { + c.log.Info("Started monitoring chain") + return c.headMonitor.Start() +} + +func (c *ChainMonitor) Stop() error { + return c.headMonitor.Stop() +} + +func newClient(ctx context.Context, logger log.Logger, m caching.Metrics, rpc string, rpcClient client.RPC, pollRate time.Duration, trustRPC bool, kind sources.RPCProviderKind) (*sources.L1Client, error) { + c, err := client.NewRPCWithClient(ctx, logger, rpc, rpcClient, pollRate) + if err != nil { + return nil, fmt.Errorf("failed to create new RPC client: %w", err) + } + + l1Client, err := sources.NewL1Client(c, logger, m, sources.L1ClientSimpleConfig(trustRPC, kind, 100)) + if err != nil { + return nil, fmt.Errorf("failed to connect client: %w", err) + } + return l1Client, nil +} diff --git a/op-supervisor/supervisor/backend/source/chain_processor.go b/op-supervisor/supervisor/backend/source/chain_processor.go new file mode 100644 index 000000000000..0a42da1556a0 --- /dev/null +++ b/op-supervisor/supervisor/backend/source/chain_processor.go @@ -0,0 +1,86 @@ +package source + +import ( + "context" + + "github.com/ethereum-optimism/optimism/op-service/eth" + "github.com/ethereum-optimism/optimism/op-supervisor/supervisor/types" + "github.com/ethereum/go-ethereum/log" +) + +type BlockByNumberSource interface { + L1BlockRefByNumber(ctx context.Context, number uint64) (eth.L1BlockRef, error) +} + +type BlockProcessor interface { + ProcessBlock(ctx context.Context, block eth.L1BlockRef) error +} + +type DatabaseRewinder interface { + Rewind(chain types.ChainID, headBlockNum uint64) error +} + +type BlockProcessorFn func(ctx context.Context, block eth.L1BlockRef) error + +func (fn BlockProcessorFn) ProcessBlock(ctx context.Context, block eth.L1BlockRef) error { + return fn(ctx, block) +} + +// ChainProcessor is a HeadProcessor that fills in any skipped blocks between head update events. +// It ensures that, absent reorgs, every block in the chain is processed even if some head advancements are skipped. +type ChainProcessor struct { + log log.Logger + client BlockByNumberSource + chain types.ChainID + lastBlock eth.L1BlockRef + processor BlockProcessor + rewinder DatabaseRewinder +} + +func NewChainProcessor(log log.Logger, client BlockByNumberSource, chain types.ChainID, startingHead eth.L1BlockRef, processor BlockProcessor, rewinder DatabaseRewinder) *ChainProcessor { + return &ChainProcessor{ + log: log, + client: client, + chain: chain, + lastBlock: startingHead, + processor: processor, + rewinder: rewinder, + } +} + +func (s *ChainProcessor) OnNewHead(ctx context.Context, head eth.L1BlockRef) { + s.log.Debug("Processing chain", "chain", s.chain, "head", head, "last", s.lastBlock) + if head.Number <= s.lastBlock.Number { + s.log.Info("head is not newer than last processed block", "head", head, "lastBlock", s.lastBlock) + return + } + for s.lastBlock.Number+1 < head.Number { + s.log.Debug("Filling in skipped block", "chain", s.chain, "lastBlock", s.lastBlock, "head", head) + blockNum := s.lastBlock.Number + 1 + nextBlock, err := s.client.L1BlockRefByNumber(ctx, blockNum) + if err != nil { + s.log.Error("Failed to fetch block info", "number", blockNum, "err", err) + return + } + if ok := s.processBlock(ctx, nextBlock); !ok { + return + } + } + + s.processBlock(ctx, head) +} + +func (s *ChainProcessor) processBlock(ctx context.Context, block eth.L1BlockRef) bool { + if err := s.processor.ProcessBlock(ctx, block); err != nil { + s.log.Error("Failed to process block", "block", block, "err", err) + // Try to rewind the database to the previous block to remove any logs from this block that were written + if err := s.rewinder.Rewind(s.chain, s.lastBlock.Number); err != nil { + // If any logs were written, our next attempt to write will fail and we'll retry this rewind. + // If no logs were written successfully then the rewind wouldn't have done anything anyway. + s.log.Error("Failed to rewind after error processing block", "block", block, "err", err) + } + return false // Don't update the last processed block so we will retry on next update + } + s.lastBlock = block + return true +} diff --git a/op-supervisor/supervisor/backend/source/chain_processor_test.go b/op-supervisor/supervisor/backend/source/chain_processor_test.go new file mode 100644 index 000000000000..6b26f7477c53 --- /dev/null +++ b/op-supervisor/supervisor/backend/source/chain_processor_test.go @@ -0,0 +1,187 @@ +package source + +import ( + "context" + "errors" + "fmt" + "testing" + + "github.com/ethereum-optimism/optimism/op-service/eth" + "github.com/ethereum-optimism/optimism/op-service/testlog" + "github.com/ethereum-optimism/optimism/op-supervisor/supervisor/types" + "github.com/ethereum/go-ethereum/common" + "github.com/ethereum/go-ethereum/log" + "github.com/stretchr/testify/require" +) + +var processorChainID = types.ChainIDFromUInt64(4) + +func TestUnsafeBlocksStage(t *testing.T) { + t.Run("IgnoreEventsAtOrPriorToStartingHead", func(t *testing.T) { + ctx := context.Background() + logger := testlog.Logger(t, log.LvlInfo) + client := &stubBlockByNumberSource{} + processor := &stubBlockProcessor{} + stage := NewChainProcessor(logger, client, processorChainID, eth.L1BlockRef{Number: 100}, processor, &stubRewinder{}) + stage.OnNewHead(ctx, eth.L1BlockRef{Number: 100}) + stage.OnNewHead(ctx, eth.L1BlockRef{Number: 99}) + + require.Empty(t, processor.processed) + require.Zero(t, client.calls) + }) + + t.Run("OutputNewHeadsWithNoMissedBlocks", func(t *testing.T) { + ctx := context.Background() + logger := testlog.Logger(t, log.LvlInfo) + client := &stubBlockByNumberSource{} + block0 := eth.L1BlockRef{Number: 100} + block1 := eth.L1BlockRef{Number: 101} + block2 := eth.L1BlockRef{Number: 102} + block3 := eth.L1BlockRef{Number: 103} + processor := &stubBlockProcessor{} + stage := NewChainProcessor(logger, client, processorChainID, block0, processor, &stubRewinder{}) + stage.OnNewHead(ctx, block1) + require.Equal(t, []eth.L1BlockRef{block1}, processor.processed) + stage.OnNewHead(ctx, block2) + require.Equal(t, []eth.L1BlockRef{block1, block2}, processor.processed) + stage.OnNewHead(ctx, block3) + require.Equal(t, []eth.L1BlockRef{block1, block2, block3}, processor.processed) + + require.Zero(t, client.calls, "should not need to request block info") + }) + + t.Run("IgnoreEventsAtOrPriorToPreviousHead", func(t *testing.T) { + ctx := context.Background() + logger := testlog.Logger(t, log.LvlInfo) + client := &stubBlockByNumberSource{} + block0 := eth.L1BlockRef{Number: 100} + block1 := eth.L1BlockRef{Number: 101} + processor := &stubBlockProcessor{} + stage := NewChainProcessor(logger, client, processorChainID, block0, processor, &stubRewinder{}) + stage.OnNewHead(ctx, block1) + require.NotEmpty(t, processor.processed) + require.Equal(t, []eth.L1BlockRef{block1}, processor.processed) + + stage.OnNewHead(ctx, block0) + stage.OnNewHead(ctx, block1) + require.Equal(t, []eth.L1BlockRef{block1}, processor.processed) + + require.Zero(t, client.calls, "should not need to request block info") + }) + + t.Run("OutputSkippedBlocks", func(t *testing.T) { + ctx := context.Background() + logger := testlog.Logger(t, log.LvlInfo) + client := &stubBlockByNumberSource{} + block0 := eth.L1BlockRef{Number: 100} + block3 := eth.L1BlockRef{Number: 103} + processor := &stubBlockProcessor{} + stage := NewChainProcessor(logger, client, processorChainID, block0, processor, &stubRewinder{}) + + stage.OnNewHead(ctx, block3) + require.Equal(t, []eth.L1BlockRef{makeBlockRef(101), makeBlockRef(102), block3}, processor.processed) + + require.Equal(t, 2, client.calls, "should only request the two missing blocks") + }) + + t.Run("DoNotUpdateLastBlockOnFetchError", func(t *testing.T) { + ctx := context.Background() + logger := testlog.Logger(t, log.LvlInfo) + client := &stubBlockByNumberSource{err: errors.New("boom")} + block0 := eth.L1BlockRef{Number: 100} + block3 := eth.L1BlockRef{Number: 103} + processor := &stubBlockProcessor{} + rewinder := &stubRewinder{} + stage := NewChainProcessor(logger, client, processorChainID, block0, processor, rewinder) + + stage.OnNewHead(ctx, block3) + require.Empty(t, processor.processed, "should not update any blocks because backfill failed") + + client.err = nil + stage.OnNewHead(ctx, block3) + require.Equal(t, []eth.L1BlockRef{makeBlockRef(101), makeBlockRef(102), block3}, processor.processed) + require.False(t, rewinder.rewindCalled, "should not rewind because no logs could have been written") + }) + + t.Run("DoNotUpdateLastBlockOnProcessorError", func(t *testing.T) { + ctx := context.Background() + logger := testlog.Logger(t, log.LvlInfo) + client := &stubBlockByNumberSource{} + block0 := eth.L1BlockRef{Number: 100} + block3 := eth.L1BlockRef{Number: 103} + processor := &stubBlockProcessor{err: errors.New("boom")} + rewinder := &stubRewinder{} + stage := NewChainProcessor(logger, client, processorChainID, block0, processor, rewinder) + + stage.OnNewHead(ctx, block3) + require.Equal(t, []eth.L1BlockRef{makeBlockRef(101)}, processor.processed, "Attempted to process block 101") + require.Equal(t, block0.Number, rewinder.rewoundTo, "should rewind to block before error") + + processor.err = nil + stage.OnNewHead(ctx, block3) + // Attempts to process block 101 again, then carries on + require.Equal(t, []eth.L1BlockRef{makeBlockRef(101), makeBlockRef(101), makeBlockRef(102), block3}, processor.processed) + }) + + t.Run("RewindWhenNewHeadProcessingFails", func(t *testing.T) { + ctx := context.Background() + logger := testlog.Logger(t, log.LvlInfo) + client := &stubBlockByNumberSource{} + block0 := eth.L1BlockRef{Number: 100} + block1 := eth.L1BlockRef{Number: 101} + processor := &stubBlockProcessor{err: errors.New("boom")} + rewinder := &stubRewinder{} + stage := NewChainProcessor(logger, client, processorChainID, block0, processor, rewinder) + + // No skipped blocks + stage.OnNewHead(ctx, block1) + require.Equal(t, []eth.L1BlockRef{block1}, processor.processed, "Attempted to process block 101") + require.Equal(t, block0.Number, rewinder.rewoundTo, "should rewind to block before error") + }) +} + +type stubBlockByNumberSource struct { + calls int + err error +} + +func (s *stubBlockByNumberSource) L1BlockRefByNumber(_ context.Context, number uint64) (eth.L1BlockRef, error) { + s.calls++ + if s.err != nil { + return eth.L1BlockRef{}, s.err + } + return makeBlockRef(number), nil +} + +type stubBlockProcessor struct { + processed []eth.L1BlockRef + err error +} + +func (s *stubBlockProcessor) ProcessBlock(_ context.Context, block eth.L1BlockRef) error { + s.processed = append(s.processed, block) + return s.err +} + +func makeBlockRef(number uint64) eth.L1BlockRef { + return eth.L1BlockRef{ + Number: number, + Hash: common.Hash{byte(number)}, + ParentHash: common.Hash{byte(number - 1)}, + Time: number * 1000, + } +} + +type stubRewinder struct { + rewoundTo uint64 + rewindCalled bool +} + +func (s *stubRewinder) Rewind(chainID types.ChainID, headBlockNum uint64) error { + if chainID != processorChainID { + return fmt.Errorf("chainID mismatch, expected %v but was %v", processorChainID, chainID) + } + s.rewoundTo = headBlockNum + s.rewindCalled = true + return nil +} diff --git a/op-supervisor/supervisor/backend/source/contracts/l2inbox.go b/op-supervisor/supervisor/backend/source/contracts/l2inbox.go new file mode 100644 index 000000000000..741c6ae3d865 --- /dev/null +++ b/op-supervisor/supervisor/backend/source/contracts/l2inbox.go @@ -0,0 +1,133 @@ +package contracts + +import ( + "bytes" + "errors" + "fmt" + "io" + "math/big" + + "github.com/ethereum-optimism/optimism/op-service/predeploys" + "github.com/ethereum-optimism/optimism/op-service/solabi" + "github.com/ethereum-optimism/optimism/op-service/sources/batching" + "github.com/ethereum-optimism/optimism/op-supervisor/supervisor/types" + "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/ethereum/go-ethereum/crypto" +) + +const ( + eventExecutingMessage = "ExecutingMessage" +) + +var ( + ErrEventNotFound = errors.New("event not found") +) + +type contractIdentifier struct { + // Origin represents the address that initiated the message + // it is used in combination with the MsgHash to uniquely identify a message + // and is hashed into the log hash, not stored directly. + Origin common.Address + LogIndex *big.Int + BlockNumber *big.Int + ChainId *big.Int + Timestamp *big.Int +} + +type CrossL2Inbox struct { + contract *batching.BoundContract +} + +func NewCrossL2Inbox() *CrossL2Inbox { + abi := snapshots.LoadCrossL2InboxABI() + return &CrossL2Inbox{ + contract: batching.NewBoundContract(abi, predeploys.CrossL2InboxAddr), + } +} + +func (i *CrossL2Inbox) DecodeExecutingMessageLog(l *ethTypes.Log) (types.ExecutingMessage, error) { + if l.Address != i.contract.Addr() { + return types.ExecutingMessage{}, fmt.Errorf("%w: log not from CrossL2Inbox", ErrEventNotFound) + } + // use DecodeEvent to check the name of the event + // but the actual decoding is done manually to extract the contract identifier + name, _, err := i.contract.DecodeEvent(l) + if errors.Is(err, batching.ErrUnknownEvent) { + return types.ExecutingMessage{}, fmt.Errorf("%w: %v", ErrEventNotFound, err.Error()) + } else if err != nil { + return types.ExecutingMessage{}, fmt.Errorf("failed to decode event: %w", err) + } + if name != eventExecutingMessage { + return types.ExecutingMessage{}, fmt.Errorf("%w: event %v not an ExecutingMessage event", ErrEventNotFound, name) + } + // the second topic is the hash of the payload (the first is the event ID) + msgHash := l.Topics[1] + // the first 32 bytes of the data are the msgHash, so we skip them + identifierBytes := bytes.NewReader(l.Data[32:]) + identifier, err := identifierFromBytes(identifierBytes) + if err != nil { + return types.ExecutingMessage{}, fmt.Errorf("failed to read contract identifier: %w", err) + } + chainID, err := types.ChainIDFromBig(identifier.ChainId).ToUInt32() + if err != nil { + return types.ExecutingMessage{}, fmt.Errorf("failed to convert chain ID %v to uint32: %w", identifier.ChainId, err) + } + hash := payloadHashToLogHash(msgHash, identifier.Origin) + return types.ExecutingMessage{ + Chain: chainID, + Hash: hash, + BlockNum: identifier.BlockNumber.Uint64(), + LogIdx: uint32(identifier.LogIndex.Uint64()), + Timestamp: identifier.Timestamp.Uint64(), + }, nil +} + +// identifierFromBytes reads a contract identifier from a byte stream. +// it follows the spec and matches the CrossL2Inbox.json definition, +// rather than relying on reflection, as that can be error-prone regarding struct ordering +func identifierFromBytes(identifierBytes io.Reader) (contractIdentifier, error) { + origin, err := solabi.ReadAddress(identifierBytes) + if err != nil { + return contractIdentifier{}, fmt.Errorf("failed to read origin address: %w", err) + } + originAddr := common.BytesToAddress(origin[:]) + blockNumber, err := solabi.ReadUint256(identifierBytes) + if err != nil { + return contractIdentifier{}, fmt.Errorf("failed to read block number: %w", err) + } + logIndex, err := solabi.ReadUint256(identifierBytes) + if err != nil { + return contractIdentifier{}, fmt.Errorf("failed to read log index: %w", err) + } + timestamp, err := solabi.ReadUint256(identifierBytes) + if err != nil { + return contractIdentifier{}, fmt.Errorf("failed to read timestamp: %w", err) + } + chainID, err := solabi.ReadUint256(identifierBytes) + if err != nil { + return contractIdentifier{}, fmt.Errorf("failed to read chain ID: %w", err) + } + return contractIdentifier{ + Origin: originAddr, + BlockNumber: blockNumber, + LogIndex: logIndex, + Timestamp: timestamp, + ChainId: chainID, + }, nil +} + +// payloadHashToLogHash converts the payload hash to the log hash +// it is the concatenation of the log's address and the hash of the log's payload, +// which is then hashed again. This is the hash that is stored in the log storage. +// The logHash can then be used to traverse from the executing message +// to the log the referenced initiating message. +// TODO: this function is duplicated between contracts and backend/source/log_processor.go +// to avoid a circular dependency. It should be reorganized to avoid this duplication. +func payloadHashToLogHash(payloadHash common.Hash, addr common.Address) common.Hash { + msg := make([]byte, 0, 2*common.HashLength) + msg = append(msg, addr.Bytes()...) + msg = append(msg, payloadHash.Bytes()...) + return crypto.Keccak256Hash(msg) +} diff --git a/op-supervisor/supervisor/backend/source/contracts/l2inbox_test.go b/op-supervisor/supervisor/backend/source/contracts/l2inbox_test.go new file mode 100644 index 000000000000..302b188e5cdf --- /dev/null +++ b/op-supervisor/supervisor/backend/source/contracts/l2inbox_test.go @@ -0,0 +1,75 @@ +package contracts + +import ( + "bytes" + "math/big" + "testing" + + "github.com/ethereum-optimism/optimism/op-service/predeploys" + "github.com/ethereum-optimism/optimism/op-service/sources/batching" + "github.com/ethereum-optimism/optimism/op-supervisor/supervisor/types" + "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/ethereum/go-ethereum/crypto" + "github.com/stretchr/testify/require" +) + +func TestDecodeExecutingMessageEvent(t *testing.T) { + inbox := NewCrossL2Inbox() + payload := bytes.Repeat([]byte{0xaa, 0xbb}, 50) + payloadHash := crypto.Keccak256Hash(payload) + expected := types.ExecutingMessage{ + Chain: 42424, + BlockNum: 12345, + LogIdx: 98, + Timestamp: 9578295, + } + contractIdent := contractIdentifier{ + Origin: common.Address{0xbb, 0xcc}, + ChainId: new(big.Int).SetUint64(uint64(expected.Chain)), + BlockNumber: new(big.Int).SetUint64(expected.BlockNum), + Timestamp: new(big.Int).SetUint64(expected.Timestamp), + LogIndex: new(big.Int).SetUint64(uint64(expected.LogIdx)), + } + expected.Hash = payloadHashToLogHash(payloadHash, contractIdent.Origin) + abi := snapshots.LoadCrossL2InboxABI() + validData, err := abi.Events[eventExecutingMessage].Inputs.Pack(payloadHash, contractIdent) + require.NoError(t, err) + createValidLog := func() *ethTypes.Log { + //protoHack := bytes.Repeat([]byte{0x00}, 32*5) + return ðTypes.Log{ + Address: predeploys.CrossL2InboxAddr, + Topics: []common.Hash{abi.Events[eventExecutingMessage].ID, payloadHash}, + Data: validData, + } + } + + t.Run("ParseValid", func(t *testing.T) { + l := createValidLog() + result, err := inbox.DecodeExecutingMessageLog(l) + require.NoError(t, err) + require.Equal(t, expected, result) + }) + + t.Run("IgnoreIncorrectContract", func(t *testing.T) { + l := createValidLog() + l.Address = common.Address{0xff} + _, err := inbox.DecodeExecutingMessageLog(l) + require.ErrorIs(t, err, ErrEventNotFound) + }) + + t.Run("IgnoreWrongEvent", func(t *testing.T) { + l := createValidLog() + l.Topics[0] = common.Hash{0xbb} + _, err := inbox.DecodeExecutingMessageLog(l) + require.ErrorIs(t, err, ErrEventNotFound) + }) + + t.Run("ErrorOnInvalidEvent", func(t *testing.T) { + l := createValidLog() + l.Data = []byte{0xbb, 0xcc} + _, err := inbox.DecodeExecutingMessageLog(l) + require.ErrorIs(t, err, batching.ErrInvalidEvent) + }) +} diff --git a/op-supervisor/supervisor/backend/source/fetch_logs.go b/op-supervisor/supervisor/backend/source/fetch_logs.go new file mode 100644 index 000000000000..880a9ddcda4d --- /dev/null +++ b/op-supervisor/supervisor/backend/source/fetch_logs.go @@ -0,0 +1,46 @@ +package source + +import ( + "context" + "fmt" + + "github.com/ethereum-optimism/optimism/op-service/eth" + "github.com/ethereum/go-ethereum/common" + "github.com/ethereum/go-ethereum/core/types" +) + +type LogSource interface { + FetchReceipts(ctx context.Context, blockHash common.Hash) (eth.BlockInfo, types.Receipts, error) +} + +type ReceiptProcessor interface { + ProcessLogs(ctx context.Context, block eth.L1BlockRef, rcpts types.Receipts) error +} + +type ReceiptProcessorFn func(ctx context.Context, block eth.L1BlockRef, rcpts types.Receipts) error + +func (r ReceiptProcessorFn) ProcessLogs(ctx context.Context, block eth.L1BlockRef, rcpts types.Receipts) error { + return r(ctx, block, rcpts) +} + +type logFetcher struct { + client LogSource + processor ReceiptProcessor +} + +func newLogFetcher(client LogSource, processor ReceiptProcessor) *logFetcher { + return &logFetcher{ + client: client, + processor: processor, + } +} + +var _ BlockProcessor = (*logFetcher)(nil) + +func (l *logFetcher) ProcessBlock(ctx context.Context, block eth.L1BlockRef) error { + _, rcpts, err := l.client.FetchReceipts(ctx, block.Hash) + if err != nil { + return fmt.Errorf("failed to fetch receipts for block %v: %w", block, err) + } + return l.processor.ProcessLogs(ctx, block, rcpts) +} diff --git a/op-supervisor/supervisor/backend/source/fetch_logs_test.go b/op-supervisor/supervisor/backend/source/fetch_logs_test.go new file mode 100644 index 000000000000..4e05f5530b72 --- /dev/null +++ b/op-supervisor/supervisor/backend/source/fetch_logs_test.go @@ -0,0 +1,77 @@ +package source + +import ( + "context" + "errors" + "testing" + + "github.com/ethereum-optimism/optimism/op-service/eth" + "github.com/ethereum/go-ethereum/common" + "github.com/ethereum/go-ethereum/core/types" + "github.com/stretchr/testify/require" +) + +func TestFetchLogs(t *testing.T) { + ctx := context.Background() + rcpts := types.Receipts{&types.Receipt{Type: 3}, &types.Receipt{Type: 4}} + + t.Run("Success", func(t *testing.T) { + client := &stubLogSource{ + rcpts: rcpts, + } + var processed []types.Receipts + processor := ReceiptProcessorFn(func(ctx context.Context, block eth.L1BlockRef, rcpts types.Receipts) error { + processed = append(processed, rcpts) + return nil + }) + fetcher := newLogFetcher(client, processor) + block := eth.L1BlockRef{Number: 11, Hash: common.Hash{0xaa}} + + err := fetcher.ProcessBlock(ctx, block) + require.NoError(t, err) + + require.Equal(t, []types.Receipts{rcpts}, processed) + }) + + t.Run("ReceiptFetcherError", func(t *testing.T) { + client := &stubLogSource{ + err: errors.New("boom"), + } + processor := ReceiptProcessorFn(func(ctx context.Context, block eth.L1BlockRef, rcpts types.Receipts) error { + t.Fatal("should not be called") + return nil + }) + fetcher := newLogFetcher(client, processor) + block := eth.L1BlockRef{Number: 11, Hash: common.Hash{0xaa}} + + err := fetcher.ProcessBlock(ctx, block) + require.ErrorIs(t, err, client.err) + }) + + t.Run("ProcessorError", func(t *testing.T) { + expectedErr := errors.New("boom") + client := &stubLogSource{ + rcpts: rcpts, + } + processor := ReceiptProcessorFn(func(ctx context.Context, block eth.L1BlockRef, rcpts types.Receipts) error { + return expectedErr + }) + fetcher := newLogFetcher(client, processor) + block := eth.L1BlockRef{Number: 11, Hash: common.Hash{0xaa}} + + err := fetcher.ProcessBlock(ctx, block) + require.ErrorIs(t, err, expectedErr) + }) +} + +type stubLogSource struct { + err error + rcpts types.Receipts +} + +func (s *stubLogSource) FetchReceipts(_ context.Context, _ common.Hash) (eth.BlockInfo, types.Receipts, error) { + if s.err != nil { + return nil, nil, s.err + } + return nil, s.rcpts, nil +} diff --git a/op-supervisor/supervisor/backend/source/head_monitor.go b/op-supervisor/supervisor/backend/source/head_monitor.go new file mode 100644 index 000000000000..f5c8896693fd --- /dev/null +++ b/op-supervisor/supervisor/backend/source/head_monitor.go @@ -0,0 +1,97 @@ +package source + +import ( + "context" + "errors" + "sync/atomic" + "time" + + "github.com/ethereum-optimism/optimism/op-service/eth" + ethereum "github.com/ethereum/go-ethereum" + "github.com/ethereum/go-ethereum/event" + "github.com/ethereum/go-ethereum/log" +) + +type HeadMonitorClient interface { + eth.NewHeadSource + eth.L1BlockRefsSource +} + +type HeadChangeCallback interface { + OnNewUnsafeHead(ctx context.Context, block eth.L1BlockRef) + OnNewSafeHead(ctx context.Context, block eth.L1BlockRef) + OnNewFinalizedHead(ctx context.Context, block eth.L1BlockRef) +} + +// HeadMonitor monitors an L2 chain and sends notifications when the unsafe, safe or finalized head changes. +// Head updates may be coalesced, allowing the head block to skip forward multiple blocks. +// Reorgs are not identified. +type HeadMonitor struct { + log log.Logger + epochPollInterval time.Duration + rpc HeadMonitorClient + callback HeadChangeCallback + + started atomic.Bool + headsSub event.Subscription + safeSub ethereum.Subscription + finalizedSub ethereum.Subscription +} + +func NewHeadMonitor(logger log.Logger, epochPollInterval time.Duration, rpc HeadMonitorClient, callback HeadChangeCallback) *HeadMonitor { + return &HeadMonitor{ + log: logger, + epochPollInterval: epochPollInterval, + rpc: rpc, + callback: callback, + } +} + +func (h *HeadMonitor) Start() error { + if !h.started.CompareAndSwap(false, true) { + return errors.New("already started") + } + + // Keep subscribed to the unsafe head, which changes frequently. + h.headsSub = event.ResubscribeErr(time.Second*10, func(ctx context.Context, err error) (event.Subscription, error) { + if err != nil { + h.log.Warn("Resubscribing after failed heads subscription", "err", err) + } + return eth.WatchHeadChanges(ctx, h.rpc, h.callback.OnNewUnsafeHead) + }) + go func() { + err, ok := <-h.headsSub.Err() + if !ok { + return + } + h.log.Error("Heads subscription error", "err", err) + }() + + // Poll for the safe block and finalized block, which only change once per epoch at most and may be delayed. + h.safeSub = eth.PollBlockChanges(h.log, h.rpc, h.callback.OnNewSafeHead, eth.Safe, + h.epochPollInterval, time.Second*10) + h.finalizedSub = eth.PollBlockChanges(h.log, h.rpc, h.callback.OnNewFinalizedHead, eth.Finalized, + h.epochPollInterval, time.Second*10) + h.log.Info("Chain head monitoring started") + return nil +} + +func (h *HeadMonitor) Stop() error { + if !h.started.CompareAndSwap(true, false) { + return errors.New("already stopped") + } + + // stop heads feed + if h.headsSub != nil { + h.headsSub.Unsubscribe() + } + // stop polling for safe-head changes + if h.safeSub != nil { + h.safeSub.Unsubscribe() + } + // stop polling for finalized-head changes + if h.finalizedSub != nil { + h.finalizedSub.Unsubscribe() + } + return nil +} diff --git a/op-supervisor/supervisor/backend/source/head_monitor_test.go b/op-supervisor/supervisor/backend/source/head_monitor_test.go new file mode 100644 index 000000000000..d13dff48d851 --- /dev/null +++ b/op-supervisor/supervisor/backend/source/head_monitor_test.go @@ -0,0 +1,243 @@ +package source + +import ( + "context" + "errors" + "fmt" + "math/rand" + "sync" + "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/ethereum/go-ethereum" + "github.com/ethereum/go-ethereum/common" + "github.com/ethereum/go-ethereum/core/types" + "github.com/ethereum/go-ethereum/log" + "github.com/stretchr/testify/require" +) + +const waitDuration = 10 * time.Second +const checkInterval = 10 * time.Millisecond + +func TestUnsafeHeadUpdates(t *testing.T) { + rng := rand.New(rand.NewSource(0x1337)) + header1 := testutils.RandomHeader(rng) + header2 := testutils.RandomHeader(rng) + + t.Run("NotifyOfNewHeads", func(t *testing.T) { + rpc, callback := startHeadMonitor(t) + + rpc.NewUnsafeHead(t, header1) + callback.RequireUnsafeHeaders(t, header1) + + rpc.NewUnsafeHead(t, header2) + callback.RequireUnsafeHeaders(t, header1, header2) + }) + + t.Run("ResubscribeOnError", func(t *testing.T) { + rpc, callback := startHeadMonitor(t) + + rpc.SubscriptionError(t) + + rpc.NewUnsafeHead(t, header1) + callback.RequireUnsafeHeaders(t, header1) + }) +} + +func TestSafeHeadUpdates(t *testing.T) { + rpc, callback := startHeadMonitor(t) + + head1 := eth.L1BlockRef{ + Hash: common.Hash{0xaa}, + Number: 1, + } + head2 := eth.L1BlockRef{ + Hash: common.Hash{0xbb}, + Number: 2, + } + + rpc.SetSafeHead(head1) + callback.RequireSafeHeaders(t, head1) + rpc.SetSafeHead(head2) + callback.RequireSafeHeaders(t, head1, head2) +} + +func TestFinalizedHeadUpdates(t *testing.T) { + rpc, callback := startHeadMonitor(t) + + head1 := eth.L1BlockRef{ + Hash: common.Hash{0xaa}, + Number: 1, + } + head2 := eth.L1BlockRef{ + Hash: common.Hash{0xbb}, + Number: 2, + } + + rpc.SetFinalizedHead(head1) + callback.RequireFinalizedHeaders(t, head1) + rpc.SetFinalizedHead(head2) + callback.RequireFinalizedHeaders(t, head1, head2) +} + +func startHeadMonitor(t *testing.T) (*stubRPC, *stubCallback) { + logger := testlog.Logger(t, log.LvlInfo) + rpc := &stubRPC{} + callback := &stubCallback{} + monitor := NewHeadMonitor(logger, 50*time.Millisecond, rpc, callback) + require.NoError(t, monitor.Start()) + t.Cleanup(func() { + require.NoError(t, monitor.Stop()) + }) + return rpc, callback +} + +type stubCallback struct { + sync.Mutex + unsafe []eth.L1BlockRef + safe []eth.L1BlockRef + finalized []eth.L1BlockRef +} + +func (s *stubCallback) RequireUnsafeHeaders(t *testing.T, heads ...*types.Header) { + expected := make([]eth.L1BlockRef, len(heads)) + for i, head := range heads { + expected[i] = eth.InfoToL1BlockRef(eth.HeaderBlockInfo(head)) + } + s.requireHeaders(t, func(s *stubCallback) []eth.L1BlockRef { return s.unsafe }, expected) +} + +func (s *stubCallback) RequireSafeHeaders(t *testing.T, expected ...eth.L1BlockRef) { + s.requireHeaders(t, func(s *stubCallback) []eth.L1BlockRef { return s.safe }, expected) +} + +func (s *stubCallback) RequireFinalizedHeaders(t *testing.T, expected ...eth.L1BlockRef) { + s.requireHeaders(t, func(s *stubCallback) []eth.L1BlockRef { return s.finalized }, expected) +} + +func (s *stubCallback) requireHeaders(t *testing.T, getter func(*stubCallback) []eth.L1BlockRef, expected []eth.L1BlockRef) { + require.Eventually(t, func() bool { + s.Lock() + defer s.Unlock() + return len(getter(s)) >= len(expected) + }, waitDuration, checkInterval) + s.Lock() + defer s.Unlock() + require.Equal(t, expected, getter(s)) +} + +func (s *stubCallback) OnNewUnsafeHead(ctx context.Context, block eth.L1BlockRef) { + s.Lock() + defer s.Unlock() + s.unsafe = append(s.unsafe, block) +} + +func (s *stubCallback) OnNewSafeHead(ctx context.Context, block eth.L1BlockRef) { + s.Lock() + defer s.Unlock() + s.safe = append(s.safe, block) +} + +func (s *stubCallback) OnNewFinalizedHead(ctx context.Context, block eth.L1BlockRef) { + s.Lock() + defer s.Unlock() + s.finalized = append(s.finalized, block) +} + +var _ HeadChangeCallback = (*stubCallback)(nil) + +type stubRPC struct { + sync.Mutex + sub *mockSubscription + + safeHead eth.L1BlockRef + finalizedHead eth.L1BlockRef +} + +func (s *stubRPC) SubscribeNewHead(_ context.Context, unsafeCh chan<- *types.Header) (ethereum.Subscription, error) { + s.Lock() + defer s.Unlock() + if s.sub != nil { + return nil, errors.New("already subscribed to unsafe heads") + } + errChan := make(chan error) + s.sub = &mockSubscription{errChan, unsafeCh, s} + return s.sub, nil +} + +func (s *stubRPC) SetSafeHead(head eth.L1BlockRef) { + s.Lock() + defer s.Unlock() + s.safeHead = head +} + +func (s *stubRPC) SetFinalizedHead(head eth.L1BlockRef) { + s.Lock() + defer s.Unlock() + s.finalizedHead = head +} + +func (s *stubRPC) L1BlockRefByLabel(ctx context.Context, label eth.BlockLabel) (eth.L1BlockRef, error) { + s.Lock() + defer s.Unlock() + switch label { + case eth.Safe: + if s.safeHead == (eth.L1BlockRef{}) { + return eth.L1BlockRef{}, errors.New("no unsafe head") + } + return s.safeHead, nil + case eth.Finalized: + if s.finalizedHead == (eth.L1BlockRef{}) { + return eth.L1BlockRef{}, errors.New("no finalized head") + } + return s.finalizedHead, nil + default: + return eth.L1BlockRef{}, fmt.Errorf("unknown label: %v", label) + } +} + +func (s *stubRPC) NewUnsafeHead(t *testing.T, header *types.Header) { + s.WaitForSub(t) + s.Lock() + defer s.Unlock() + require.NotNil(t, s.sub, "Attempting to publish a header with no subscription") + s.sub.headers <- header +} + +func (s *stubRPC) SubscriptionError(t *testing.T) { + s.WaitForSub(t) + s.Lock() + defer s.Unlock() + s.sub.errChan <- errors.New("subscription error") + s.sub = nil +} + +func (s *stubRPC) WaitForSub(t *testing.T) { + require.Eventually(t, func() bool { + s.Lock() + defer s.Unlock() + return s.sub != nil + }, waitDuration, checkInterval, "Head monitor did not subscribe to unsafe head") +} + +var _ HeadMonitorClient = (*stubRPC)(nil) + +type mockSubscription struct { + errChan chan error + headers chan<- *types.Header + rpc *stubRPC +} + +func (m *mockSubscription) Unsubscribe() { + fmt.Println("Unsubscribed") + m.rpc.Lock() + defer m.rpc.Unlock() + m.rpc.sub = nil +} + +func (m *mockSubscription) Err() <-chan error { + return m.errChan +} diff --git a/op-supervisor/supervisor/backend/source/head_processor.go b/op-supervisor/supervisor/backend/source/head_processor.go new file mode 100644 index 000000000000..ff97deadc543 --- /dev/null +++ b/op-supervisor/supervisor/backend/source/head_processor.go @@ -0,0 +1,55 @@ +package source + +import ( + "context" + + "github.com/ethereum-optimism/optimism/op-service/eth" + "github.com/ethereum/go-ethereum/log" +) + +type HeadProcessor interface { + OnNewHead(ctx context.Context, head eth.L1BlockRef) +} + +type HeadProcessorFn func(ctx context.Context, head eth.L1BlockRef) + +func (f HeadProcessorFn) OnNewHead(ctx context.Context, head eth.L1BlockRef) { + f(ctx, head) +} + +// headUpdateProcessor handles head update events and routes them to the appropriate handlers +type headUpdateProcessor struct { + log log.Logger + unsafeProcessors []HeadProcessor + safeProcessors []HeadProcessor + finalizedProcessors []HeadProcessor +} + +func newHeadUpdateProcessor(log log.Logger, unsafeProcessors []HeadProcessor, safeProcessors []HeadProcessor, finalizedProcessors []HeadProcessor) *headUpdateProcessor { + return &headUpdateProcessor{ + log: log, + unsafeProcessors: unsafeProcessors, + safeProcessors: safeProcessors, + finalizedProcessors: finalizedProcessors, + } +} + +func (n *headUpdateProcessor) OnNewUnsafeHead(ctx context.Context, block eth.L1BlockRef) { + n.log.Debug("New unsafe head", "block", block) + for _, processor := range n.unsafeProcessors { + processor.OnNewHead(ctx, block) + } +} + +func (n *headUpdateProcessor) OnNewSafeHead(ctx context.Context, block eth.L1BlockRef) { + n.log.Debug("New safe head", "block", block) + for _, processor := range n.safeProcessors { + processor.OnNewHead(ctx, block) + } +} +func (n *headUpdateProcessor) OnNewFinalizedHead(ctx context.Context, block eth.L1BlockRef) { + n.log.Debug("New finalized head", "block", block) + for _, processor := range n.finalizedProcessors { + processor.OnNewHead(ctx, block) + } +} diff --git a/op-supervisor/supervisor/backend/source/head_processor_test.go b/op-supervisor/supervisor/backend/source/head_processor_test.go new file mode 100644 index 000000000000..0ef375fe4524 --- /dev/null +++ b/op-supervisor/supervisor/backend/source/head_processor_test.go @@ -0,0 +1,56 @@ +package source + +import ( + "context" + "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/ethereum/go-ethereum/log" + "github.com/stretchr/testify/require" +) + +func TestHeadUpdateProcessor(t *testing.T) { + t.Run("NotifyUnsafeHeadProcessors", func(t *testing.T) { + logger := testlog.Logger(t, log.LvlInfo) + processed := make([]eth.L1BlockRef, 3) + makeProcessor := func(idx int) HeadProcessor { + return HeadProcessorFn(func(_ context.Context, head eth.L1BlockRef) { + processed[idx] = head + }) + } + headUpdates := newHeadUpdateProcessor(logger, []HeadProcessor{makeProcessor(0), makeProcessor(1), makeProcessor(2)}, nil, nil) + block := eth.L1BlockRef{Number: 110, Hash: common.Hash{0xaa}} + headUpdates.OnNewUnsafeHead(context.Background(), block) + require.Equal(t, []eth.L1BlockRef{block, block, block}, processed) + }) + + t.Run("NotifySafeHeadProcessors", func(t *testing.T) { + logger := testlog.Logger(t, log.LvlInfo) + processed := make([]eth.L1BlockRef, 3) + makeProcessor := func(idx int) HeadProcessor { + return HeadProcessorFn(func(_ context.Context, head eth.L1BlockRef) { + processed[idx] = head + }) + } + headUpdates := newHeadUpdateProcessor(logger, nil, []HeadProcessor{makeProcessor(0), makeProcessor(1), makeProcessor(2)}, nil) + block := eth.L1BlockRef{Number: 110, Hash: common.Hash{0xaa}} + headUpdates.OnNewSafeHead(context.Background(), block) + require.Equal(t, []eth.L1BlockRef{block, block, block}, processed) + }) + + t.Run("NotifyFinalizedHeadProcessors", func(t *testing.T) { + logger := testlog.Logger(t, log.LvlInfo) + processed := make([]eth.L1BlockRef, 3) + makeProcessor := func(idx int) HeadProcessor { + return HeadProcessorFn(func(_ context.Context, head eth.L1BlockRef) { + processed[idx] = head + }) + } + headUpdates := newHeadUpdateProcessor(logger, nil, nil, []HeadProcessor{makeProcessor(0), makeProcessor(1), makeProcessor(2)}) + block := eth.L1BlockRef{Number: 110, Hash: common.Hash{0xaa}} + headUpdates.OnNewFinalizedHead(context.Background(), block) + require.Equal(t, []eth.L1BlockRef{block, block, block}, processed) + }) +} diff --git a/op-supervisor/supervisor/backend/source/log_processor.go b/op-supervisor/supervisor/backend/source/log_processor.go new file mode 100644 index 000000000000..1c20f8c4530a --- /dev/null +++ b/op-supervisor/supervisor/backend/source/log_processor.go @@ -0,0 +1,101 @@ +package source + +import ( + "context" + "errors" + "fmt" + + "github.com/ethereum/go-ethereum/common" + ethTypes "github.com/ethereum/go-ethereum/core/types" + "github.com/ethereum/go-ethereum/crypto" + + "github.com/ethereum-optimism/optimism/op-service/eth" + "github.com/ethereum-optimism/optimism/op-supervisor/supervisor/backend/source/contracts" + "github.com/ethereum-optimism/optimism/op-supervisor/supervisor/types" +) + +type LogStorage interface { + SealBlock(chain types.ChainID, parentHash common.Hash, block eth.BlockID, timestamp uint64) error + AddLog(chain types.ChainID, logHash common.Hash, parentBlock eth.BlockID, logIdx uint32, execMsg *types.ExecutingMessage) error +} + +type EventDecoder interface { + DecodeExecutingMessageLog(log *ethTypes.Log) (types.ExecutingMessage, error) +} + +type logProcessor struct { + chain types.ChainID + logStore LogStorage + eventDecoder EventDecoder +} + +func newLogProcessor(chain types.ChainID, logStore LogStorage) *logProcessor { + return &logProcessor{ + chain: chain, + logStore: logStore, + eventDecoder: contracts.NewCrossL2Inbox(), + } +} + +// ProcessLogs processes logs from a block and stores them in the log storage +// for any logs that are related to executing messages, they are decoded and stored +func (p *logProcessor) ProcessLogs(_ context.Context, block eth.L1BlockRef, rcpts ethTypes.Receipts) error { + for _, rcpt := range rcpts { + for _, l := range rcpt.Logs { + // log hash represents the hash of *this* log as a potentially initiating message + logHash := logToLogHash(l) + var execMsg *types.ExecutingMessage + msg, err := p.eventDecoder.DecodeExecutingMessageLog(l) + if err != nil && !errors.Is(err, contracts.ErrEventNotFound) { + return fmt.Errorf("failed to decode executing message log: %w", err) + } else if err == nil { + // if the log is an executing message, store the message + execMsg = &msg + } + // executing messages have multiple entries in the database + // they should start with the initiating message and then include the execution + err = p.logStore.AddLog(p.chain, logHash, block.ParentID(), uint32(l.Index), execMsg) + if err != nil { + return fmt.Errorf("failed to add log %d from block %v: %w", l.Index, block.ID(), err) + } + } + } + if err := p.logStore.SealBlock(p.chain, block.ParentHash, block.ID(), block.Time); err != nil { + return fmt.Errorf("failed to seal block %s: %w", block.ID(), err) + } + return nil +} + +// logToLogHash transforms a log into a hash that represents the log. +// it is the concatenation of the log's address and the hash of the log's payload, +// which is then hashed again. This is the hash that is stored in the log storage. +// The address is hashed into the payload hash to save space in the log storage, +// and because they represent paired data. +func logToLogHash(l *ethTypes.Log) common.Hash { + payloadHash := crypto.Keccak256(logToMessagePayload(l)) + return payloadHashToLogHash(common.Hash(payloadHash), l.Address) +} + +// logToMessagePayload is the data that is hashed to get the logHash +// it is the concatenation of the log's topics and data +// the implementation is based on the interop messaging spec +func logToMessagePayload(l *ethTypes.Log) []byte { + msg := make([]byte, 0) + for _, topic := range l.Topics { + msg = append(msg, topic.Bytes()...) + } + msg = append(msg, l.Data...) + return msg +} + +// payloadHashToLogHash converts the payload hash to the log hash +// it is the concatenation of the log's address and the hash of the log's payload, +// which is then hashed. This is the hash that is stored in the log storage. +// The logHash can then be used to traverse from the executing message +// to the log the referenced initiating message. +func payloadHashToLogHash(payloadHash common.Hash, addr common.Address) common.Hash { + msg := make([]byte, 0, 2*common.HashLength) + msg = append(msg, addr.Bytes()...) + msg = append(msg, payloadHash.Bytes()...) + return crypto.Keccak256Hash(msg) +} diff --git a/op-supervisor/supervisor/backend/source/log_processor_test.go b/op-supervisor/supervisor/backend/source/log_processor_test.go new file mode 100644 index 000000000000..bd7aa7abc3d1 --- /dev/null +++ b/op-supervisor/supervisor/backend/source/log_processor_test.go @@ -0,0 +1,250 @@ +package source + +import ( + "context" + "fmt" + "testing" + + "github.com/ethereum-optimism/optimism/op-service/eth" + "github.com/ethereum-optimism/optimism/op-service/predeploys" + "github.com/ethereum-optimism/optimism/op-supervisor/supervisor/types" + "github.com/ethereum/go-ethereum/common" + ethTypes "github.com/ethereum/go-ethereum/core/types" + "github.com/stretchr/testify/require" +) + +var logProcessorChainID = types.ChainIDFromUInt64(4) + +func TestLogProcessor(t *testing.T) { + ctx := context.Background() + block1 := eth.L1BlockRef{ + ParentHash: common.Hash{0x42}, + Number: 100, + Hash: common.Hash{0x11}, + Time: 1111, + } + t.Run("NoOutputWhenLogsAreEmpty", func(t *testing.T) { + store := &stubLogStorage{} + processor := newLogProcessor(logProcessorChainID, store) + + err := processor.ProcessLogs(ctx, block1, ethTypes.Receipts{}) + require.NoError(t, err) + require.Empty(t, store.logs) + }) + + t.Run("OutputLogs", func(t *testing.T) { + rcpts := ethTypes.Receipts{ + { + Logs: []*ethTypes.Log{ + { + Address: common.Address{0x11}, + Topics: []common.Hash{{0xaa}}, + Data: []byte{0xbb}, + }, + { + Address: common.Address{0x22}, + Topics: []common.Hash{{0xcc}}, + Data: []byte{0xdd}, + }, + }, + }, + { + Logs: []*ethTypes.Log{ + { + Address: common.Address{0x33}, + Topics: []common.Hash{{0xee}}, + Data: []byte{0xff}, + }, + }, + }, + } + store := &stubLogStorage{} + processor := newLogProcessor(logProcessorChainID, store) + + err := processor.ProcessLogs(ctx, block1, rcpts) + require.NoError(t, err) + expectedLogs := []storedLog{ + { + parent: block1.ParentID(), + logIdx: 0, + logHash: logToLogHash(rcpts[0].Logs[0]), + execMsg: nil, + }, + { + parent: block1.ParentID(), + logIdx: 0, + logHash: logToLogHash(rcpts[0].Logs[1]), + execMsg: nil, + }, + { + parent: block1.ParentID(), + logIdx: 0, + logHash: logToLogHash(rcpts[1].Logs[0]), + execMsg: nil, + }, + } + require.Equal(t, expectedLogs, store.logs) + + expectedBlocks := []storedSeal{ + { + parent: block1.ParentHash, + block: block1.ID(), + timestamp: block1.Time, + }, + } + require.Equal(t, expectedBlocks, store.seals) + }) + + t.Run("IncludeExecutingMessage", func(t *testing.T) { + rcpts := ethTypes.Receipts{ + { + Logs: []*ethTypes.Log{ + { + Address: predeploys.CrossL2InboxAddr, + Topics: []common.Hash{}, + Data: []byte{0xff}, + }, + }, + }, + } + execMsg := types.ExecutingMessage{ + Chain: 4, + BlockNum: 6, + LogIdx: 8, + Timestamp: 10, + Hash: common.Hash{0xaa}, + } + store := &stubLogStorage{} + processor := newLogProcessor(types.ChainID{4}, store) + processor.eventDecoder = EventDecoderFn(func(l *ethTypes.Log) (types.ExecutingMessage, error) { + require.Equal(t, rcpts[0].Logs[0], l) + return execMsg, nil + }) + + err := processor.ProcessLogs(ctx, block1, rcpts) + require.NoError(t, err) + expected := []storedLog{ + { + parent: block1.ParentID(), + logIdx: 0, + logHash: logToLogHash(rcpts[0].Logs[0]), + execMsg: &execMsg, + }, + } + require.Equal(t, expected, store.logs) + + expectedBlocks := []storedSeal{ + { + parent: block1.ParentHash, + block: block1.ID(), + timestamp: block1.Time, + }, + } + require.Equal(t, expectedBlocks, store.seals) + }) +} + +func TestToLogHash(t *testing.T) { + mkLog := func() *ethTypes.Log { + return ðTypes.Log{ + Address: common.Address{0xaa, 0xbb}, + Topics: []common.Hash{ + {0xcc}, + {0xdd}, + }, + Data: []byte{0xee, 0xff, 0x00}, + BlockNumber: 12345, + TxHash: common.Hash{0x11, 0x22, 0x33}, + TxIndex: 4, + BlockHash: common.Hash{0x44, 0x55}, + Index: 8, + Removed: false, + } + } + relevantMods := []func(l *ethTypes.Log){ + func(l *ethTypes.Log) { l.Address = common.Address{0xab, 0xcd} }, + func(l *ethTypes.Log) { l.Topics = append(l.Topics, common.Hash{0x12, 0x34}) }, + func(l *ethTypes.Log) { l.Topics = l.Topics[:len(l.Topics)-1] }, + func(l *ethTypes.Log) { l.Topics[0] = common.Hash{0x12, 0x34} }, + func(l *ethTypes.Log) { l.Data = append(l.Data, 0x56) }, + func(l *ethTypes.Log) { l.Data = l.Data[:len(l.Data)-1] }, + func(l *ethTypes.Log) { l.Data[0] = 0x45 }, + } + irrelevantMods := []func(l *ethTypes.Log){ + func(l *ethTypes.Log) { l.BlockNumber = 987 }, + func(l *ethTypes.Log) { l.TxHash = common.Hash{0xab, 0xcd} }, + func(l *ethTypes.Log) { l.TxIndex = 99 }, + func(l *ethTypes.Log) { l.BlockHash = common.Hash{0xab, 0xcd} }, + func(l *ethTypes.Log) { l.Index = 98 }, + func(l *ethTypes.Log) { l.Removed = true }, + } + refHash := logToLogHash(mkLog()) + // The log hash is stored in the database so test that it matches the actual value. + // If this changes, compatibility with existing databases may be affected + expectedRefHash := common.HexToHash("0x4e1dc08fddeb273275f787762cdfe945cf47bb4e80a1fabbc7a825801e81b73f") + require.Equal(t, expectedRefHash, refHash, "reference hash changed, check that database compatibility is not broken") + + // Check that the hash is changed when any data it should include changes + for i, mod := range relevantMods { + l := mkLog() + mod(l) + hash := logToLogHash(l) + require.NotEqualf(t, refHash, hash, "expected relevant modification %v to affect the hash but it did not", i) + } + // Check that the hash is not changed when any data it should not include changes + for i, mod := range irrelevantMods { + l := mkLog() + mod(l) + hash := logToLogHash(l) + require.Equal(t, refHash, hash, "expected irrelevant modification %v to not affect the hash but it did", i) + } +} + +type stubLogStorage struct { + logs []storedLog + seals []storedSeal +} + +func (s *stubLogStorage) SealBlock(chainID types.ChainID, parentHash common.Hash, block eth.BlockID, timestamp uint64) error { + if logProcessorChainID != chainID { + return fmt.Errorf("chain id mismatch, expected %v but got %v", logProcessorChainID, chainID) + } + s.seals = append(s.seals, storedSeal{ + parent: parentHash, + block: block, + timestamp: timestamp, + }) + return nil +} + +func (s *stubLogStorage) AddLog(chainID types.ChainID, logHash common.Hash, parentBlock eth.BlockID, logIdx uint32, execMsg *types.ExecutingMessage) error { + if logProcessorChainID != chainID { + return fmt.Errorf("chain id mismatch, expected %v but got %v", logProcessorChainID, chainID) + } + s.logs = append(s.logs, storedLog{ + parent: parentBlock, + logIdx: logIdx, + logHash: logHash, + execMsg: execMsg, + }) + return nil +} + +type storedSeal struct { + parent common.Hash + block eth.BlockID + timestamp uint64 +} + +type storedLog struct { + parent eth.BlockID + logIdx uint32 + logHash common.Hash + execMsg *types.ExecutingMessage +} + +type EventDecoderFn func(*ethTypes.Log) (types.ExecutingMessage, error) + +func (f EventDecoderFn) DecodeExecutingMessageLog(log *ethTypes.Log) (types.ExecutingMessage, error) { + return f(log) +} diff --git a/op-supervisor/supervisor/entrypoint.go b/op-supervisor/supervisor/entrypoint.go new file mode 100644 index 000000000000..86befabb5da9 --- /dev/null +++ b/op-supervisor/supervisor/entrypoint.go @@ -0,0 +1,39 @@ +package supervisor + +import ( + "context" + "fmt" + + "github.com/ethereum-optimism/optimism/op-supervisor/config" + "github.com/urfave/cli/v2" + + "github.com/ethereum/go-ethereum/log" + + 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-supervisor/flags" +) + +type MainFn func(ctx context.Context, cfg *config.Config, logger log.Logger) (cliapp.Lifecycle, error) + +// Main is the entrypoint into the Supervisor. +// This method returns a cliapp.LifecycleAction, to create an op-service CLI-lifecycle-managed supervisor with. +func Main(version string, fn MainFn) cliapp.LifecycleAction { + return func(cliCtx *cli.Context, closeApp context.CancelCauseFunc) (cliapp.Lifecycle, error) { + if err := flags.CheckRequired(cliCtx); err != nil { + return nil, err + } + cfg := flags.ConfigFromCLI(cliCtx, version) + if err := cfg.Check(); err != nil { + return nil, fmt.Errorf("invalid CLI flags: %w", err) + } + + l := oplog.NewLogger(oplog.AppOut(cliCtx), cfg.LogConfig) + oplog.SetGlobalLogHandler(l.Handler()) + opservice.ValidateEnvVars(flags.EnvVarPrefix, flags.Flags, l) + + l.Info("Initializing Supervisor") + return fn(cliCtx.Context, cfg, l) + } +} diff --git a/op-supervisor/supervisor/frontend/frontend.go b/op-supervisor/supervisor/frontend/frontend.go new file mode 100644 index 000000000000..41fb84e511cd --- /dev/null +++ b/op-supervisor/supervisor/frontend/frontend.go @@ -0,0 +1,69 @@ +package frontend + +import ( + "context" + + "github.com/ethereum/go-ethereum/common" + "github.com/ethereum/go-ethereum/common/hexutil" + + "github.com/ethereum-optimism/optimism/op-supervisor/supervisor/types" +) + +type AdminBackend interface { + Start(ctx context.Context) error + Stop(ctx context.Context) error + AddL2RPC(ctx context.Context, rpc string) error +} + +type QueryBackend interface { + CheckMessage(identifier types.Identifier, payloadHash common.Hash) (types.SafetyLevel, error) + CheckMessages(messages []types.Message, minSafety types.SafetyLevel) error + CheckBlock(chainID *hexutil.U256, blockHash common.Hash, blockNumber hexutil.Uint64) (types.SafetyLevel, error) +} + +type Backend interface { + AdminBackend + QueryBackend +} + +type QueryFrontend struct { + Supervisor QueryBackend +} + +// CheckMessage checks the safety-level of an individual message. +// The payloadHash references the hash of the message-payload of the message. +func (q *QueryFrontend) CheckMessage(identifier types.Identifier, payloadHash common.Hash) (types.SafetyLevel, error) { + return q.Supervisor.CheckMessage(identifier, payloadHash) +} + +// CheckMessage checks the safety-level of a collection of messages, +// and returns if the minimum safety-level is met for all messages. +func (q *QueryFrontend) CheckMessages( + messages []types.Message, + minSafety types.SafetyLevel) error { + return q.Supervisor.CheckMessages(messages, minSafety) +} + +// CheckBlock checks the safety-level of an L2 block as a whole. +func (q *QueryFrontend) CheckBlock(chainID *hexutil.U256, blockHash common.Hash, blockNumber hexutil.Uint64) (types.SafetyLevel, error) { + return q.Supervisor.CheckBlock(chainID, blockHash, blockNumber) +} + +type AdminFrontend struct { + Supervisor Backend +} + +// Start starts the service, if it was previously stopped. +func (a *AdminFrontend) Start(ctx context.Context) error { + return a.Supervisor.Start(ctx) +} + +// Stop stops the service, if it was previously started. +func (a *AdminFrontend) Stop(ctx context.Context) error { + return a.Supervisor.Stop(ctx) +} + +// AddL2RPC adds a new L2 chain to the supervisor backend +func (a *AdminFrontend) AddL2RPC(ctx context.Context, rpc string) error { + return a.Supervisor.AddL2RPC(ctx, rpc) +} diff --git a/op-supervisor/supervisor/service.go b/op-supervisor/supervisor/service.go new file mode 100644 index 000000000000..47fcb3e9ec23 --- /dev/null +++ b/op-supervisor/supervisor/service.go @@ -0,0 +1,209 @@ +package supervisor + +import ( + "context" + "errors" + "fmt" + "io" + "sync/atomic" + + "github.com/ethereum-optimism/optimism/op-supervisor/config" + "github.com/ethereum/go-ethereum/log" + "github.com/ethereum/go-ethereum/rpc" + + "github.com/ethereum-optimism/optimism/op-service/cliapp" + "github.com/ethereum-optimism/optimism/op-service/httputil" + opmetrics "github.com/ethereum-optimism/optimism/op-service/metrics" + "github.com/ethereum-optimism/optimism/op-service/oppprof" + oprpc "github.com/ethereum-optimism/optimism/op-service/rpc" + "github.com/ethereum-optimism/optimism/op-supervisor/metrics" + "github.com/ethereum-optimism/optimism/op-supervisor/supervisor/backend" + "github.com/ethereum-optimism/optimism/op-supervisor/supervisor/frontend" +) + +type Backend interface { + frontend.Backend + io.Closer +} + +// SupervisorService implements the full-environment bells and whistles around the Supervisor. +// This includes the setup and teardown of metrics, pprof, admin RPC, regular RPC etc. +type SupervisorService struct { + closing atomic.Bool + + log log.Logger + + metrics metrics.Metricer + + backend Backend + + pprofService *oppprof.Service + metricsSrv *httputil.HTTPServer + rpcServer *oprpc.Server +} + +var _ cliapp.Lifecycle = (*SupervisorService)(nil) + +func SupervisorFromConfig(ctx context.Context, cfg *config.Config, logger log.Logger) (*SupervisorService, error) { + su := &SupervisorService{log: logger} + if err := su.initFromCLIConfig(ctx, cfg); err != nil { + return nil, errors.Join(err, su.Stop(ctx)) // try to clean up our failed initialization attempt + } + return su, nil +} + +func (su *SupervisorService) initFromCLIConfig(ctx context.Context, cfg *config.Config) error { + su.initMetrics(cfg) + if err := su.initPProf(cfg); err != nil { + return fmt.Errorf("failed to start PProf server: %w", err) + } + if err := su.initMetricsServer(cfg); err != nil { + return fmt.Errorf("failed to start Metrics server: %w", err) + } + if err := su.initBackend(ctx, cfg); err != nil { + return fmt.Errorf("failed to start backend: %w", err) + } + if err := su.initRPCServer(cfg); err != nil { + return fmt.Errorf("failed to start RPC server: %w", err) + } + return nil +} + +func (su *SupervisorService) initBackend(ctx context.Context, cfg *config.Config) error { + if cfg.MockRun { + su.backend = backend.NewMockBackend() + return nil + } + be, err := backend.NewSupervisorBackend(ctx, su.log, su.metrics, cfg) + if err != nil { + return fmt.Errorf("failed to create supervisor backend: %w", err) + } + su.backend = be + return nil +} + +func (su *SupervisorService) initMetrics(cfg *config.Config) { + if cfg.MetricsConfig.Enabled { + procName := "default" + su.metrics = metrics.NewMetrics(procName) + su.metrics.RecordInfo(cfg.Version) + } else { + su.metrics = metrics.NoopMetrics + } +} + +func (su *SupervisorService) initPProf(cfg *config.Config) error { + su.pprofService = oppprof.New( + cfg.PprofConfig.ListenEnabled, + cfg.PprofConfig.ListenAddr, + cfg.PprofConfig.ListenPort, + cfg.PprofConfig.ProfileType, + cfg.PprofConfig.ProfileDir, + cfg.PprofConfig.ProfileFilename, + ) + + if err := su.pprofService.Start(); err != nil { + return fmt.Errorf("failed to start pprof service: %w", err) + } + + return nil +} + +func (su *SupervisorService) initMetricsServer(cfg *config.Config) error { + if !cfg.MetricsConfig.Enabled { + su.log.Info("Metrics disabled") + return nil + } + m, ok := su.metrics.(opmetrics.RegistryMetricer) + if !ok { + return fmt.Errorf("metrics were enabled, but metricer %T does not expose registry for metrics-server", su.metrics) + } + su.log.Debug("Starting metrics server", "addr", cfg.MetricsConfig.ListenAddr, "port", cfg.MetricsConfig.ListenPort) + metricsSrv, err := opmetrics.StartServer(m.Registry(), cfg.MetricsConfig.ListenAddr, cfg.MetricsConfig.ListenPort) + if err != nil { + return fmt.Errorf("failed to start metrics server: %w", err) + } + su.log.Info("Started metrics server", "addr", metricsSrv.Addr()) + su.metricsSrv = metricsSrv + return nil +} + +func (su *SupervisorService) initRPCServer(cfg *config.Config) error { + server := oprpc.NewServer( + cfg.RPC.ListenAddr, + cfg.RPC.ListenPort, + cfg.Version, + oprpc.WithLogger(su.log), + //oprpc.WithHTTPRecorder(su.metrics), // TODO(protocol-quest#286) hook up metrics to RPC server + ) + if cfg.RPC.EnableAdmin { + su.log.Info("Admin RPC enabled") + server.AddAPI(rpc.API{ + Namespace: "admin", + Service: &frontend.AdminFrontend{Supervisor: su.backend}, + Authenticated: true, // TODO(protocol-quest#286): enforce auth on this or not? + }) + } + server.AddAPI(rpc.API{ + Namespace: "supervisor", + Service: &frontend.QueryFrontend{Supervisor: su.backend}, + Authenticated: false, + }) + su.rpcServer = server + return nil +} + +func (su *SupervisorService) Start(ctx context.Context) error { + su.log.Info("Starting JSON-RPC server") + if err := su.rpcServer.Start(); err != nil { + return fmt.Errorf("unable to start RPC server: %w", err) + } + + if err := su.backend.Start(ctx); err != nil { + return fmt.Errorf("unable to start backend: %w", err) + } + + su.metrics.RecordUp() + su.log.Info("JSON-RPC Server started", "endpoint", su.rpcServer.Endpoint()) + return nil +} + +func (su *SupervisorService) Stop(ctx context.Context) error { + if !su.closing.CompareAndSwap(false, true) { + return nil // already closing + } + su.log.Info("Stopping JSON-RPC server") + var result error + if su.rpcServer != nil { + if err := su.rpcServer.Stop(); err != nil { + result = errors.Join(result, fmt.Errorf("failed to stop RPC server: %w", err)) + } + } + if su.backend != nil { + if err := su.backend.Close(); err != nil { + result = errors.Join(result, fmt.Errorf("failed to close supervisor backend: %w", err)) + } + } + if su.pprofService != nil { + if err := su.pprofService.Stop(ctx); err != nil { + result = errors.Join(result, fmt.Errorf("failed to stop PProf server: %w", err)) + } + } + if su.metricsSrv != nil { + if err := su.metricsSrv.Stop(ctx); err != nil { + result = errors.Join(result, fmt.Errorf("failed to stop metrics server: %w", err)) + } + } + su.log.Info("JSON-RPC server stopped") + return result +} + +func (su *SupervisorService) Stopped() bool { + return su.closing.Load() +} + +func (su *SupervisorService) RPC() string { + // the RPC endpoint is assumed to be HTTP + // TODO(#11032): make this flexible for ws if the server supports it + return "http://" + su.rpcServer.Endpoint() +} diff --git a/op-supervisor/supervisor/service_test.go b/op-supervisor/supervisor/service_test.go new file mode 100644 index 000000000000..8cc4dcfa6678 --- /dev/null +++ b/op-supervisor/supervisor/service_test.go @@ -0,0 +1,73 @@ +package supervisor + +import ( + "context" + "testing" + "time" + + "github.com/ethereum-optimism/optimism/op-supervisor/config" + "github.com/holiman/uint256" + "github.com/stretchr/testify/require" + + "github.com/ethereum/go-ethereum/common" + "github.com/ethereum/go-ethereum/common/hexutil" + "github.com/ethereum/go-ethereum/log" + + "github.com/ethereum-optimism/optimism/op-service/dial" + 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" + oprpc "github.com/ethereum-optimism/optimism/op-service/rpc" + "github.com/ethereum-optimism/optimism/op-service/testlog" + "github.com/ethereum-optimism/optimism/op-supervisor/supervisor/types" +) + +func TestSupervisorService(t *testing.T) { + cfg := &config.Config{ + Version: "", + LogConfig: oplog.CLIConfig{ + Level: log.LevelError, + Color: false, + Format: oplog.FormatLogFmt, + }, + MetricsConfig: opmetrics.CLIConfig{ + Enabled: true, + ListenAddr: "127.0.0.1", + ListenPort: 0, // pick a port automatically + }, + PprofConfig: oppprof.CLIConfig{ + ListenEnabled: true, + ListenAddr: "127.0.0.1", + ListenPort: 0, // pick a port automatically + ProfileType: "", + ProfileDir: "", + ProfileFilename: "", + }, + RPC: oprpc.CLIConfig{ + ListenAddr: "127.0.0.1", + ListenPort: 0, // pick a port automatically + EnableAdmin: true, + }, + MockRun: true, + } + logger := testlog.Logger(t, log.LevelError) + supervisor, err := SupervisorFromConfig(context.Background(), cfg, logger) + require.NoError(t, err) + require.NoError(t, supervisor.Start(context.Background()), "start service") + // run some RPC tests against the service with the mock backend + { + endpoint := "http://" + supervisor.rpcServer.Endpoint() + t.Logf("dialing %s", endpoint) + cl, err := dial.DialRPCClientWithTimeout(context.Background(), time.Second*5, logger, endpoint) + require.NoError(t, err) + ctx, cancel := context.WithTimeout(context.Background(), time.Second*5) + var dest types.SafetyLevel + err = cl.CallContext(ctx, &dest, "supervisor_checkBlock", + (*hexutil.U256)(uint256.NewInt(1)), common.Hash{0xab}, hexutil.Uint64(123)) + cancel() + require.NoError(t, err) + require.Equal(t, types.CrossUnsafe, dest, "expecting mock to return cross-unsafe") + cl.Close() + } + require.NoError(t, supervisor.Stop(context.Background()), "stop service") +} diff --git a/op-supervisor/supervisor/types/types.go b/op-supervisor/supervisor/types/types.go new file mode 100644 index 000000000000..b035e26abcef --- /dev/null +++ b/op-supervisor/supervisor/types/types.go @@ -0,0 +1,149 @@ +package types + +import ( + "encoding/json" + "errors" + "fmt" + "math" + "math/big" + + "github.com/holiman/uint256" + + "github.com/ethereum/go-ethereum/common" + "github.com/ethereum/go-ethereum/common/hexutil" +) + +type ExecutingMessage struct { + Chain uint32 // same as ChainID for now, but will be indirect, i.e. translated to full ID, later + BlockNum uint64 + LogIdx uint32 + Timestamp uint64 + Hash common.Hash +} + +type Message struct { + Identifier Identifier `json:"identifier"` + PayloadHash common.Hash `json:"payloadHash"` +} + +type Identifier struct { + Origin common.Address + BlockNumber uint64 + LogIndex uint64 + Timestamp uint64 + ChainID ChainID // flat, not a pointer, to make Identifier safe as map key +} + +type identifierMarshaling struct { + Origin common.Address `json:"origin"` + BlockNumber hexutil.Uint64 `json:"blockNumber"` + LogIndex hexutil.Uint64 `json:"logIndex"` + Timestamp hexutil.Uint64 `json:"timestamp"` + ChainID hexutil.U256 `json:"chainID"` +} + +func (id Identifier) MarshalJSON() ([]byte, error) { + var enc identifierMarshaling + enc.Origin = id.Origin + enc.BlockNumber = hexutil.Uint64(id.BlockNumber) + enc.LogIndex = hexutil.Uint64(id.LogIndex) + enc.Timestamp = hexutil.Uint64(id.Timestamp) + enc.ChainID = (hexutil.U256)(id.ChainID) + return json.Marshal(&enc) +} + +func (id *Identifier) UnmarshalJSON(input []byte) error { + var dec identifierMarshaling + if err := json.Unmarshal(input, &dec); err != nil { + return err + } + id.Origin = dec.Origin + id.BlockNumber = uint64(dec.BlockNumber) + id.LogIndex = uint64(dec.LogIndex) + id.Timestamp = uint64(dec.Timestamp) + id.ChainID = (ChainID)(dec.ChainID) + return nil +} + +type SafetyLevel string + +func (lvl SafetyLevel) String() string { + return string(lvl) +} + +func (lvl SafetyLevel) Valid() bool { + switch lvl { + case Finalized, Safe, CrossUnsafe, Unsafe: + return true + default: + return false + } +} + +func (lvl SafetyLevel) MarshalText() ([]byte, error) { + return []byte(lvl), nil +} + +func (lvl *SafetyLevel) UnmarshalText(text []byte) error { + if lvl == nil { + return errors.New("cannot unmarshal into nil SafetyLevel") + } + x := SafetyLevel(text) + if !x.Valid() { + return fmt.Errorf("unrecognized safety level: %q", text) + } + *lvl = x + return nil +} + +// AtLeastAsSafe returns true if the receiver is at least as safe as the other SafetyLevel. +func (lvl *SafetyLevel) AtLeastAsSafe(min SafetyLevel) bool { + switch min { + case Invalid: + return true + case Unsafe: + return *lvl != Invalid + case Safe: + return *lvl == Safe || *lvl == Finalized + case Finalized: + return *lvl == Finalized + default: + return false + } +} + +const ( + CrossFinalized SafetyLevel = "cross-finalized" + Finalized SafetyLevel = "finalized" + CrossSafe SafetyLevel = "cross-safe" + Safe SafetyLevel = "safe" + CrossUnsafe SafetyLevel = "cross-unsafe" + Unsafe SafetyLevel = "unsafe" + Invalid SafetyLevel = "invalid" +) + +type ChainID uint256.Int + +func ChainIDFromBig(chainID *big.Int) ChainID { + return ChainID(*uint256.MustFromBig(chainID)) +} + +func ChainIDFromUInt64(i uint64) ChainID { + return ChainID(*uint256.NewInt(i)) +} + +func (id ChainID) String() string { + return ((*uint256.Int)(&id)).Dec() +} + +func (id ChainID) ToUInt32() (uint32, error) { + v := (*uint256.Int)(&id) + if !v.IsUint64() { + return 0, fmt.Errorf("ChainID too large for uint32: %v", id) + } + v64 := v.Uint64() + if v64 > math.MaxUint32 { + return 0, fmt.Errorf("ChainID too large for uint32: %v", id) + } + return uint32(v64), nil +} diff --git a/op-supervisor/supervisor/types/types_test.go b/op-supervisor/supervisor/types/types_test.go new file mode 100644 index 000000000000..50c856bdc794 --- /dev/null +++ b/op-supervisor/supervisor/types/types_test.go @@ -0,0 +1,61 @@ +package types + +import ( + "encoding/json" + "math" + "math/big" + "testing" + + "github.com/stretchr/testify/require" + + "github.com/ethereum/go-ethereum/common" + "github.com/holiman/uint256" +) + +func FuzzRoundtripIdentifierJSONMarshal(f *testing.F) { + f.Fuzz(func(t *testing.T, origin []byte, blockNumber uint64, logIndex uint64, timestamp uint64, chainID []byte) { + if len(chainID) > 32 { + chainID = chainID[:32] + } + + id := Identifier{ + Origin: common.BytesToAddress(origin), + BlockNumber: blockNumber, + LogIndex: logIndex, + Timestamp: timestamp, + ChainID: ChainIDFromBig(new(big.Int).SetBytes(chainID)), + } + + raw, err := json.Marshal(&id) + require.NoError(t, err) + + var dec Identifier + require.NoError(t, json.Unmarshal(raw, &dec)) + + require.Equal(t, id.Origin, dec.Origin) + require.Equal(t, id.BlockNumber, dec.BlockNumber) + require.Equal(t, id.LogIndex, dec.LogIndex) + require.Equal(t, id.Timestamp, dec.Timestamp) + require.Equal(t, id.ChainID, dec.ChainID) + }) +} + +func TestChainID_String(t *testing.T) { + tests := []struct { + input ChainID + expected string + }{ + {ChainIDFromUInt64(0), "0"}, + {ChainIDFromUInt64(1), "1"}, + {ChainIDFromUInt64(871975192374), "871975192374"}, + {ChainIDFromUInt64(math.MaxInt64), "9223372036854775807"}, + {ChainID(*uint256.NewInt(math.MaxUint64)), "18446744073709551615"}, + {ChainID(*uint256.MustFromDecimal("1844674407370955161618446744073709551616")), "1844674407370955161618446744073709551616"}, + } + for _, test := range tests { + test := test + t.Run(test.expected, func(t *testing.T) { + require.Equal(t, test.expected, test.input.String()) + }) + } +} diff --git a/op-ufm/.gitignore b/op-ufm/.gitignore deleted file mode 100644 index 47ea0d9c55d8..000000000000 --- a/op-ufm/.gitignore +++ /dev/null @@ -1,4 +0,0 @@ -bin -tls - -config.toml diff --git a/op-ufm/Dockerfile b/op-ufm/Dockerfile deleted file mode 100644 index 0a2644ec3bba..000000000000 --- a/op-ufm/Dockerfile +++ /dev/null @@ -1,30 +0,0 @@ -FROM golang:1.21.1-alpine3.18 as builder - -ARG GITCOMMIT=docker -ARG GITDATE=docker -ARG GITVERSION=docker - -RUN apk add make jq git gcc musl-dev linux-headers - -COPY ./op-ufm /app - -WORKDIR /app - -RUN make ufm - -FROM alpine:3.18 - -COPY --from=builder /app/entrypoint.sh /bin/entrypoint.sh -COPY --from=builder /app/bin/ufm /bin/ufm - -RUN apk update && \ - chmod +x /bin/entrypoint.sh - -RUN apk add ca-certificates jq curl bind-tools - -VOLUME /etc/ufm - -EXPOSE 8080 - -ENTRYPOINT ["/bin/entrypoint.sh"] -CMD ["/bin/ufm", "/etc/ufm/config.toml"] diff --git a/op-ufm/Makefile b/op-ufm/Makefile deleted file mode 100644 index 7dbd96f11dcf..000000000000 --- a/op-ufm/Makefile +++ /dev/null @@ -1,36 +0,0 @@ -LDFLAGSSTRING +=-X main.GitCommit=$(GITCOMMIT) -LDFLAGSSTRING +=-X main.GitDate=$(GITDATE) -LDFLAGSSTRING +=-X main.GitVersion=$(GITVERSION) -LDFLAGS := -ldflags "$(LDFLAGSSTRING)" - -ufm: - go build -v $(LDFLAGS) -o ./bin/ufm ./cmd/ufm -.PHONY: ufm - -fmt: - go mod tidy - gofmt -w . -.PHONY: fmt - -test: - go test -race -v ./... -.PHONY: test - -lint: - go vet ./... -.PHONY: lint - -tls: - kubectl get secrets op-ufm-client-tls -o yaml | yq '.data."tls.key"' | base64 --decode > tls/tls.key - kubectl get secrets op-ufm-client-tls -o yaml | yq '.data."tls.crt"' | base64 --decode > tls/tls.crt - kubectl get secrets op-ufm-client-tls -o yaml | yq '.data."ca.crt"' | base64 --decode > tls/ca.crt -.PHONY: tls - -mod-tidy: - # Below GOPRIVATE line allows mod-tidy to be run immediately after - # releasing new versions. This bypasses the Go modules proxy, which - # can take a while to index new versions. - # - # See https://proxy.golang.org/ for more info. - export GOPRIVATE="github.com/ethereum-optimism" && go mod tidy -.PHONY: mod-tidy diff --git a/op-ufm/README.md b/op-ufm/README.md index 235273a22fe9..08d1b4a6eca7 100644 --- a/op-ufm/README.md +++ b/op-ufm/README.md @@ -1,3 +1,6 @@ +# ⚠️ Important +This project has been moved to [ethereum-optimism/infra](https://github.com/ethereum-optimism/infra) + # OP User Facing Monitoring This project simulates a synthetic user interacting with a OP Stack chain. @@ -9,8 +12,8 @@ the health of the network by measuring end-to-end transaction latency. ## Metrics * Round-trip duration time to get transaction receipt (from creation timestamp) - -* First-seen duration time (from creation timestamp) + +* First-seen duration time (from creation timestamp) ## Usage diff --git a/op-ufm/cmd/ufm/main.go b/op-ufm/cmd/ufm/main.go deleted file mode 100644 index f4f753a40c85..000000000000 --- a/op-ufm/cmd/ufm/main.go +++ /dev/null @@ -1,84 +0,0 @@ -package main - -import ( - "context" - "encoding/json" - "fmt" - "os" - "os/signal" - "syscall" - - "golang.org/x/exp/slog" - - "github.com/ethereum/go-ethereum/log" - - oplog "github.com/ethereum-optimism/optimism/op-service/log" - "github.com/ethereum-optimism/optimism/op-ufm/pkg/config" - "github.com/ethereum-optimism/optimism/op-ufm/pkg/service" -) - -var ( - GitVersion = "" - GitCommit = "" - GitDate = "" -) - -func main() { - oplog.SetGlobalLogHandler(slog.NewJSONHandler( - os.Stdout, &slog.HandlerOptions{Level: slog.LevelInfo})) - - log.Info("initializing", - "version", GitVersion, - "commit", GitCommit, - "date", GitDate) - - if len(os.Args) < 2 { - log.Crit("must specify a config file on the command line") - } - cfg := initConfig(os.Args[1]) - - ctx := context.Background() - svc := service.New(cfg) - svc.Start(ctx) - - sig := make(chan os.Signal, 1) - signal.Notify(sig, syscall.SIGINT, syscall.SIGTERM) - recvSig := <-sig - log.Info("caught signal, shutting down", - "signal", recvSig) - - svc.Shutdown() -} - -func initConfig(cfgFile string) *config.Config { - cfg, err := config.New(cfgFile) - if err != nil { - log.Crit("error reading config file", - "file", cfgFile, - "err", err) - } - - // update log level from config - logLevel, err := oplog.LevelFromString(cfg.LogLevel) - if err != nil { - logLevel = log.LevelInfo - if cfg.LogLevel != "" { - log.Warn("invalid server.log_level", - "log_level", cfg.LogLevel) - } - } - oplog.SetGlobalLogHandler(slog.NewJSONHandler( - os.Stdout, &slog.HandlerOptions{Level: logLevel})) - - // readable parsed config - jsonCfg, _ := json.MarshalIndent(cfg, "", " ") - fmt.Printf("%s", string(jsonCfg)) - - err = cfg.Validate() - if err != nil { - log.Crit("invalid config", - "err", err) - } - - return cfg -} diff --git a/op-ufm/entrypoint.sh b/op-ufm/entrypoint.sh deleted file mode 100644 index ef83fa8e47d4..000000000000 --- a/op-ufm/entrypoint.sh +++ /dev/null @@ -1,6 +0,0 @@ -#!/bin/sh - -echo "Updating CA certificates." -update-ca-certificates -echo "Running CMD." -exec "$@" \ No newline at end of file diff --git a/op-ufm/example.config.toml b/op-ufm/example.config.toml deleted file mode 100644 index 13b62a3e410e..000000000000 --- a/op-ufm/example.config.toml +++ /dev/null @@ -1,83 +0,0 @@ -# Log level. -# Possible values: trace | debug | info | warn | error | crit -# Default: debug -log_level = "debug" - -[signer_service] -# URL to the signer service -url = "http://localhost:1234" -tls_ca_cert = "tls/ca.crt" -tls_cert = "tls/tls.crt" -tls_key = "tls/tls.key" - -[healthz] -# Whether or not to enable healthz endpoint -enabled = true -# Host for the healthz endpoint to listen on -host = "0.0.0.0" -# Port for the above. -port = "8080" - -[metrics] -# Whether or not to enable Prometheus metrics -enabled = true -# Host for the Prometheus metrics endpoint to listen on. -host = "0.0.0.0" -# Port for the above. -port = "9761" - -[wallets.default] -# OP Stack Chain ID -# see https://community.optimism.io/docs/useful-tools/networks/ -chain_id = 420 -# Signer method to use -# Possible values: signer | static -signer_method = "static" -# Address used to send transactions -address = "0x0000000000000000000000000000000000000000" -# For static signer method, the private key to use -private_key = "0000000000000000000000000000000000000000000000000000000000000000" -# Transaction value in wei -tx_value = 100000000000000 - -[providers.p1] -# URL to the RPC provider -url = "http://localhost:8551" -# Read only providers are only used to check for transactions -read_only = true -# Interval to poll the provider for expected transactions -read_interval = "10s" -# Interval to submit new transactions to the provider -send_interval = "30s" -# Interval between send transaction when we get "already known" txpool err -send_transaction_retry_interval = "100ms" -# Max time to retry -send_transaction_retry_timeout = "5s" -# Interval between each send transaction to the same network -send_transaction_cool_down = "30s" -# Interval between receipt retrieval -receipt_retrieval_interval = "500ms" -# Max time to check for receipt -receipt_retrieval_timeout = "2m" - -[providers.p2] -# Uncomment to disable this provider -# disabled=true -# URL to the RPC provider -url = "http://localhost:8552" -# Read only providers are only used to check for transactions -read_only = false -# Interval to poll the provider for expected transactions -read_interval = "10s" -# Interval to submit new transactions to the provider -send_interval = "30s" -# Interval between send transaction when we get "already known" txpool err -send_transaction_retry_interval = "100ms" -# Max time to retry -send_transaction_retry_timeout = "5s" -# Interval between each send transaction to the same network -send_transaction_cool_down = "30s" -# Interval between receipt retrieval -receipt_retrieval_interval = "500ms" -# Max time to check for receipt -receipt_retrieval_timeout = "2m" diff --git a/op-ufm/go.mod b/op-ufm/go.mod deleted file mode 100644 index 997a0c0e2a6c..000000000000 --- a/op-ufm/go.mod +++ /dev/null @@ -1,103 +0,0 @@ -module github.com/ethereum-optimism/optimism/op-ufm - -go 1.21 - -toolchain go1.21.6 - -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.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-20240112132812-db7319d0e0e3 -) - -require ( - cloud.google.com/go/compute v1.20.1 // indirect - cloud.google.com/go/compute/metadata v0.2.3 // indirect - cloud.google.com/go/iam v1.1.0 // indirect - 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/beorn7/perks v1.0.1 // indirect - github.com/bits-and-blooms/bitset v1.10.0 // indirect - github.com/btcsuite/btcd/btcec/v2 v2.2.0 // indirect - github.com/cespare/xxhash/v2 v2.2.0 // indirect - github.com/cockroachdb/errors v1.11.1 // indirect - github.com/cockroachdb/logtags v0.0.0-20230118201751-21c54148d20b // indirect - github.com/cockroachdb/pebble v0.0.0-20231018212520-f6cde3fc2fa4 // indirect - github.com/cockroachdb/redact v1.1.5 // indirect - github.com/cockroachdb/tokenbucket v0.0.0-20230807174530-cc333fc44b06 // indirect - github.com/consensys/bavard v0.1.13 // indirect - github.com/consensys/gnark-crypto v0.12.1 // indirect - github.com/cpuguy83/go-md2man/v2 v2.0.2 // indirect - 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.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.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 - github.com/golang/protobuf v1.5.3 // indirect - github.com/golang/snappy v0.0.5-0.20220116011046-fa5810519dcb // indirect - github.com/google/go-cmp v0.6.0 // indirect - 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.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.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 - github.com/mmcloughlin/addchain v0.4.0 // indirect - github.com/olekukonko/tablewriter v0.0.5 // indirect - github.com/prometheus/client_model v0.5.0 // indirect - github.com/prometheus/common v0.48.0 // indirect - github.com/prometheus/procfs v0.12.0 // indirect - github.com/rivo/uniseg v0.4.3 // indirect - github.com/rogpeppe/go-internal v1.10.0 // indirect - github.com/russross/blackfriday/v2 v2.1.0 // indirect - github.com/shirou/gopsutil v3.21.11+incompatible // indirect - github.com/supranational/blst v0.3.11 // indirect - github.com/syndtr/goleveldb v1.0.1-0.20220614013038-64ee5596c38a // indirect - github.com/tklauser/go-sysconf v0.3.12 // indirect - 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.3 // indirect - go.opencensus.io v0.24.0 // indirect - golang.org/x/crypto v0.23.0 // indirect - golang.org/x/mod v0.14.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.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.33.0 // indirect - gopkg.in/yaml.v3 v3.0.1 // indirect - rsc.io/tmplfunc v0.0.3 // indirect -) - -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 deleted file mode 100644 index d5fb1dd986fd..000000000000 --- a/op-ufm/go.sum +++ /dev/null @@ -1,459 +0,0 @@ -cloud.google.com/go v0.26.0/go.mod h1:aQUYkXzVsufM+DwF1aE+0xfcU+56JwCaLick0ClmMTw= -cloud.google.com/go v0.34.0/go.mod h1:aQUYkXzVsufM+DwF1aE+0xfcU+56JwCaLick0ClmMTw= -cloud.google.com/go v0.110.4 h1:1JYyxKMN9hd5dR2MYTPWkGUgcoxVVhg0LKNKEo0qvmk= -cloud.google.com/go v0.110.4/go.mod h1:+EYjdK8e5RME/VY/qLCAtuyALQ9q67dvuum8i+H5xsI= -cloud.google.com/go/compute v1.20.1 h1:6aKEtlUiwEpJzM001l0yFkpXmUVXaN8W+fbkb2AZNbg= -cloud.google.com/go/compute v1.20.1/go.mod h1:4tCnrn48xsqlwSAiLf1HXMQk8CONslYbdiEZc9FEIbM= -cloud.google.com/go/compute/metadata v0.2.3 h1:mg4jlk7mCAj6xXp9UJ4fjI9VUI5rubuGBW5aJ7UnBMY= -cloud.google.com/go/compute/metadata v0.2.3/go.mod h1:VAV5nSsACxMJvgaAuX6Pk2AawlZn8kiOGuCv6gTkwuA= -cloud.google.com/go/iam v1.1.0 h1:67gSqaPukx7O8WLLHMa0PNs3EBGd2eE4d+psbO/CO94= -cloud.google.com/go/iam v1.1.0/go.mod h1:nxdHjaKfCr7fNYx/HJMM8LgiMugmveWlkatear5gVyk= -cloud.google.com/go/kms v1.12.1 h1:xZmZuwy2cwzsocmKDOPu4BL7umg8QXagQx6fKVmf45U= -cloud.google.com/go/kms v1.12.1/go.mod h1:c9J991h5DTl+kg7gi3MYomh12YEENGrf48ee/N/2CDM= -github.com/BurntSushi/toml v0.3.1/go.mod h1:xHWCNGjB5oqiDr8zfno3MHue2Ht5sIBksp03qcyfWMU= -github.com/BurntSushi/toml v1.3.2 h1:o7IhLm0Msx3BaB+n3Ag7L8EVlByGnpq14C4YWiu/gL8= -github.com/BurntSushi/toml v1.3.2/go.mod h1:CxXYINrC8qIiEnFrOxCa7Jy5BFHlXnUU2pbicEuybxQ= -github.com/DataDog/zstd v1.5.2 h1:vUG4lAyuPCXO0TLbXvPv7EB7cNK1QV/luu55UHLrrn8= -github.com/DataDog/zstd v1.5.2/go.mod h1:g4AWEaM3yOg3HYfnJ3YIawPnVdXJh9QME85blwSAmyw= -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/VictoriaMetrics/fastcache v1.12.1 h1:i0mICQuojGDL3KblA7wUNlY5lOK6a4bwt3uRKnkZU40= -github.com/VictoriaMetrics/fastcache v1.12.1/go.mod h1:tX04vaqcNoQeGLD+ra5pU5sWkuxnzWhEzLwhP9w653o= -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/antihax/optional v1.0.0/go.mod h1:uupD/76wgC+ih3iEmQUL+0Ugr19nfwCT1kdvxnR2qWY= -github.com/beorn7/perks v1.0.1 h1:VlbKKnNfV8bJzeqoa4cOKqO6bYr3WgKZxO8Z16+hsOM= -github.com/beorn7/perks v1.0.1/go.mod h1:G2ZrVWU2WbWT9wwq4/hrbKbnv/1ERSJQ0ibhJ6rlkpw= -github.com/bits-and-blooms/bitset v1.10.0 h1:ePXTeiPEazB5+opbv5fr8umg2R/1NlzgDsyepwsSr88= -github.com/bits-and-blooms/bitset v1.10.0/go.mod h1:7hO7Gc7Pp1vODcmWvKMRA9BNmbv6a/7QIWpPxHddWR8= -github.com/btcsuite/btcd v0.24.0 h1:gL3uHE/IaFj6fcZSu03SvqPMSx7s/dPzfpG/atRwWdo= -github.com/btcsuite/btcd/btcec/v2 v2.2.0 h1:fzn1qaOt32TuLjFlkzYSsBC35Q3KUjT1SwPxiMSCF5k= -github.com/btcsuite/btcd/btcec/v2 v2.2.0/go.mod h1:U7MHm051Al6XmscBQ0BoNydpOTsFAn707034b5nY8zU= -github.com/btcsuite/btcd/chaincfg/chainhash v1.1.0 h1:59Kx4K6lzOW5w6nFlA0v5+lk/6sjybR934QNHSJZPTQ= -github.com/btcsuite/btcd/chaincfg/chainhash v1.1.0/go.mod h1:7SFka0XMvUgj3hfZtydOrQY2mwhPclbT2snogU7SQQc= -github.com/census-instrumentation/opencensus-proto v0.2.1/go.mod h1:f6KPmirojxKA12rnyqOA5BBL4O983OfeGPqjHWSTneU= -github.com/cespare/xxhash/v2 v2.1.1/go.mod h1:VGX0DQ3Q6kWi7AoAeZDth3/j3BFtOZR5XLFGgcrjCOs= -github.com/cespare/xxhash/v2 v2.2.0 h1:DC2CZ1Ep5Y4k3ZQ899DldepgrayRUGE6BBZ/cd9Cj44= -github.com/cespare/xxhash/v2 v2.2.0/go.mod h1:VGX0DQ3Q6kWi7AoAeZDth3/j3BFtOZR5XLFGgcrjCOs= -github.com/chzyer/logex v1.1.10/go.mod h1:+Ywpsq7O8HXn0nuIou7OrIPyXbp3wmkHB+jjWRnGsAI= -github.com/chzyer/readline v0.0.0-20180603132655-2972be24d48e/go.mod h1:nSuG5e5PlCu98SY8svDHJxuZscDgtXS6KTTbou5AhLI= -github.com/chzyer/test v0.0.0-20180213035817-a1ea475d72b1/go.mod h1:Q3SI9o4m/ZMnBNeIyt5eFwwo7qiLfzFZmjNmxjkiQlU= -github.com/client9/misspell v0.3.4/go.mod h1:qj6jICC3Q7zFZvVWo7KLAzC3yx5G7kyvSDkc90ppPyw= -github.com/cncf/udpa/go v0.0.0-20191209042840-269d4d468f6f/go.mod h1:M8M6+tZqaGXZJjfX53e64911xZQV5JYwmTeXPW+k8Sc= -github.com/cncf/udpa/go v0.0.0-20201120205902-5459f2c99403/go.mod h1:WmhPx2Nbnhtbo57+VJT5O0JRkEi1Wbu0z5j0R8u5Hbk= -github.com/cncf/udpa/go v0.0.0-20210930031921-04548b0d99d4/go.mod h1:6pvJx4me5XPnfI9Z40ddWsdw2W/uZgQLFXToKeRcDiI= -github.com/cncf/xds/go v0.0.0-20210805033703-aa0b78936158/go.mod h1:eXthEFrGJvWHgFFCl3hGmgk+/aYT6PnTQLykKQRLhEs= -github.com/cncf/xds/go v0.0.0-20210922020428-25de7278fc84/go.mod h1:eXthEFrGJvWHgFFCl3hGmgk+/aYT6PnTQLykKQRLhEs= -github.com/cncf/xds/go v0.0.0-20211011173535-cb28da3451f1/go.mod h1:eXthEFrGJvWHgFFCl3hGmgk+/aYT6PnTQLykKQRLhEs= -github.com/cockroachdb/datadriven v1.0.3-0.20230413201302-be42291fc80f h1:otljaYPt5hWxV3MUfO5dFPFiOXg9CyG5/kCfayTqsJ4= -github.com/cockroachdb/datadriven v1.0.3-0.20230413201302-be42291fc80f/go.mod h1:a9RdTaap04u637JoCzcUoIcDmvwSUtcUFtT/C3kJlTU= -github.com/cockroachdb/errors v1.11.1 h1:xSEW75zKaKCWzR3OfxXUxgrk/NtT4G1MiOv5lWZazG8= -github.com/cockroachdb/errors v1.11.1/go.mod h1:8MUxA3Gi6b25tYlFEBGLf+D8aISL+M4MIpiWMSNRfxw= -github.com/cockroachdb/logtags v0.0.0-20230118201751-21c54148d20b h1:r6VH0faHjZeQy818SGhaone5OnYfxFR/+AzdY3sf5aE= -github.com/cockroachdb/logtags v0.0.0-20230118201751-21c54148d20b/go.mod h1:Vz9DsVWQQhf3vs21MhPMZpMGSht7O/2vFW2xusFUVOs= -github.com/cockroachdb/pebble v0.0.0-20231018212520-f6cde3fc2fa4 h1:PuHFhOUMnD62r80dN+Ik5qco2drekgsUSVdcHsvllec= -github.com/cockroachdb/pebble v0.0.0-20231018212520-f6cde3fc2fa4/go.mod h1:sEHm5NOXxyiAoKWhoFxT8xMgd/f3RA6qUqQ1BXKrh2E= -github.com/cockroachdb/redact v1.1.5 h1:u1PMllDkdFfPWaNGMyLD1+so+aq3uUItthCFqzwPJ30= -github.com/cockroachdb/redact v1.1.5/go.mod h1:BVNblN9mBWFyMyqK1k3AAiSxhvhfK2oOZZ2lK+dpvRg= -github.com/cockroachdb/tokenbucket v0.0.0-20230807174530-cc333fc44b06 h1:zuQyyAKVxetITBuuhv3BI9cMrmStnpT18zmgmTxunpo= -github.com/cockroachdb/tokenbucket v0.0.0-20230807174530-cc333fc44b06/go.mod h1:7nc4anLGjupUW/PeY5qiNYsdNXj7zopG+eqsS7To5IQ= -github.com/consensys/bavard v0.1.13 h1:oLhMLOFGTLdlda/kma4VOJazblc7IM5y5QPd2A/YjhQ= -github.com/consensys/bavard v0.1.13/go.mod h1:9ItSMtA/dXMAiL7BG6bqW2m3NdSEObYWoH223nGHukI= -github.com/consensys/gnark-crypto v0.12.1 h1:lHH39WuuFgVHONRl3J0LRBtuYdQTumFSDtJF7HpyG8M= -github.com/consensys/gnark-crypto v0.12.1/go.mod h1:v2Gy7L/4ZRosZ7Ivs+9SfUDr0f5UlG+EM5t7MPHiLuY= -github.com/cpuguy83/go-md2man/v2 v2.0.2 h1:p1EgwI/C7NhT0JmVkwCD2ZBK8j4aeHQX2pMHHBfMQ6w= -github.com/cpuguy83/go-md2man/v2 v2.0.2/go.mod h1:tgQtvFlXSQOSOSIRvRPT7W67SCa46tRHOmNcaadrF8o= -github.com/crate-crypto/go-ipa v0.0.0-20231025140028-3c0104f4b233 h1:d28BXYi+wUpz1KBmiF9bWrjEMacUEREV6MBi2ODnrfQ= -github.com/crate-crypto/go-ipa v0.0.0-20231025140028-3c0104f4b233/go.mod h1:geZJZH3SzKCqnz5VT0q/DyIG/tvu/dZk+VIfXicupJs= -github.com/crate-crypto/go-kzg-4844 v0.7.0 h1:C0vgZRk4q4EZ/JgPfzuSoxdCq3C3mOZMBShovmncxvA= -github.com/crate-crypto/go-kzg-4844 v0.7.0/go.mod h1:1kMhvPgI0Ky3yIa+9lFySEBUBXkYxeOi8ZF1sYioxhc= -github.com/creack/pty v1.1.9/go.mod h1:oKZEueFk5CKHvIhNR5MUki03XCEU+Q6VDXinZuGJ33E= -github.com/davecgh/go-spew v1.1.0/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38= -github.com/davecgh/go-spew v1.1.1 h1:vj9j/u1bqnvCEfJOwUhtlOARqs3+rkHYY13jYWTU97c= -github.com/davecgh/go-spew v1.1.1/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38= -github.com/deckarep/golang-set/v2 v2.1.0 h1:g47V4Or+DUdzbs8FxCCmgb6VYd+ptPAngjM6dtGktsI= -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.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.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.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= -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= -github.com/gballet/go-libpcsclite v0.0.0-20191108122812-4678299bea08/go.mod h1:x7DCsMOv1taUwEWCzT4cmDeAkigA5/QCwUodaVOe8Ww= -github.com/gballet/go-verkle v0.1.1-0.20231031103413-a67434b50f46 h1:BAIP2GihuqhwdILrV+7GJel5lyPV3u1+PgzrWLc0TkE= -github.com/gballet/go-verkle v0.1.1-0.20231031103413-a67434b50f46/go.mod h1:QNpY22eby74jVhqH4WhDLDwxc/vqsern6pW+u2kbkpc= -github.com/getsentry/sentry-go v0.18.0 h1:MtBW5H9QgdcJabtZcuJG80BMOwaBpkRDZkxRkNC1sN0= -github.com/getsentry/sentry-go v0.18.0/go.mod h1:Kgon4Mby+FJ7ZWHFUAZgVaIa8sxHtnRJRLTXZr51aKQ= -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/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= -github.com/gogo/protobuf v1.3.2 h1:Ov1cvc58UF3b5XjBnZv7+opcTcQFZebYjWzi34vdm4Q= -github.com/gogo/protobuf v1.3.2/go.mod h1:P1XiOD3dCwIKUDQYPy72D8LYyHL2YPYrpS2s69NZV8Q= -github.com/golang-jwt/jwt/v4 v4.5.0 h1:7cYmW1XlMY7h7ii7UhUyChSgS5wUJEnm9uZVTGqOWzg= -github.com/golang-jwt/jwt/v4 v4.5.0/go.mod h1:m21LjoU+eqJr34lmDMbreY2eSTRJ1cv77w39/MY0Ch0= -github.com/golang/glog v0.0.0-20160126235308-23def4e6c14b/go.mod h1:SBH7ygxi8pfUlaOkMMuAQtPIUF8ecWP5IEl/CR7VP2Q= -github.com/golang/groupcache v0.0.0-20200121045136-8c9f03a8e57e/go.mod h1:cIg4eruTrX1D+g88fzRXU5OdNfaM+9IcxsU14FzY7Hc= -github.com/golang/groupcache v0.0.0-20210331224755-41bb18bfe9da h1:oI5xCqsCo564l8iNU+DwB5epxmsaqB+rhGL0m5jtYqE= -github.com/golang/groupcache v0.0.0-20210331224755-41bb18bfe9da/go.mod h1:cIg4eruTrX1D+g88fzRXU5OdNfaM+9IcxsU14FzY7Hc= -github.com/golang/mock v1.1.1/go.mod h1:oTYuIxOrZwtPieC+H1uAHpcLFnEyAGVDL/k47Jfbm0A= -github.com/golang/protobuf v1.2.0/go.mod h1:6lQm79b+lXiMfvg/cZm0SGofjICqVBUtrP5yJMmIC1U= -github.com/golang/protobuf v1.3.1/go.mod h1:6lQm79b+lXiMfvg/cZm0SGofjICqVBUtrP5yJMmIC1U= -github.com/golang/protobuf v1.3.2/go.mod h1:6lQm79b+lXiMfvg/cZm0SGofjICqVBUtrP5yJMmIC1U= -github.com/golang/protobuf v1.3.3/go.mod h1:vzj43D7+SQXF/4pzW/hwtAqwc6iTitCiVSaWz5lYuqw= -github.com/golang/protobuf v1.4.0-rc.1/go.mod h1:ceaxUfeHdC40wWswd/P6IGgMaK3YpKi5j83Wpe3EHw8= -github.com/golang/protobuf v1.4.0-rc.1.0.20200221234624-67d41d38c208/go.mod h1:xKAWHe0F5eneWXFV3EuXVDTCmh+JuBKY0li0aMyXATA= -github.com/golang/protobuf v1.4.0-rc.2/go.mod h1:LlEzMj4AhA7rCAGe4KMBDvJI+AwstrUpVNzEA03Pprs= -github.com/golang/protobuf v1.4.0-rc.4.0.20200313231945-b860323f09d0/go.mod h1:WU3c8KckQ9AFe+yFwt9sWVRKCVIyN9cPHBJSNnbL67w= -github.com/golang/protobuf v1.4.0/go.mod h1:jodUvKwWbYaEsadDk5Fwe5c77LiNKVO9IDvqG2KuDX0= -github.com/golang/protobuf v1.4.1/go.mod h1:U8fpvMrcmy5pZrNK1lt4xCsGvpyWQ/VVv6QDs8UjoX8= -github.com/golang/protobuf v1.4.2/go.mod h1:oDoupMAO8OvCJWAcko0GGGIgR6R6ocIYbsSw735rRwI= -github.com/golang/protobuf v1.4.3/go.mod h1:oDoupMAO8OvCJWAcko0GGGIgR6R6ocIYbsSw735rRwI= -github.com/golang/protobuf v1.5.0/go.mod h1:FsONVRAS9T7sI+LIUmWTfcYkHO4aIWwzhcaSAoJOfIk= -github.com/golang/protobuf v1.5.2/go.mod h1:XVQd3VNwM+JqD3oG2Ue2ip4fOMUkwXdXDdiuN0vRsmY= -github.com/golang/protobuf v1.5.3 h1:KhyjKVUg7Usr/dYsdSqoFveMYd5ko72D+zANwlG1mmg= -github.com/golang/protobuf v1.5.3/go.mod h1:XVQd3VNwM+JqD3oG2Ue2ip4fOMUkwXdXDdiuN0vRsmY= -github.com/golang/snappy v0.0.4/go.mod h1:/XxbfmMg8lxefKM7IXC3fBNl/7bRcc72aCRzEWrmP2Q= -github.com/golang/snappy v0.0.5-0.20220116011046-fa5810519dcb h1:PBC98N2aIaM3XXiurYmW7fx4GZkL8feAMVq7nEjURHk= -github.com/golang/snappy v0.0.5-0.20220116011046-fa5810519dcb/go.mod h1:/XxbfmMg8lxefKM7IXC3fBNl/7bRcc72aCRzEWrmP2Q= -github.com/google/go-cmp v0.2.0/go.mod h1:oXzfMopK8JAjlY9xF4vHSVASa0yLyX7SntLO5aqRK0M= -github.com/google/go-cmp v0.3.0/go.mod h1:8QqcDgzrUqlUb/G2PQTWiueGozuR1884gddMywk6iLU= -github.com/google/go-cmp v0.3.1/go.mod h1:8QqcDgzrUqlUb/G2PQTWiueGozuR1884gddMywk6iLU= -github.com/google/go-cmp v0.4.0/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/gNBxE= -github.com/google/go-cmp v0.5.0/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/gNBxE= -github.com/google/go-cmp v0.5.3/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/gNBxE= -github.com/google/go-cmp v0.5.5/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/gNBxE= -github.com/google/go-cmp v0.6.0 h1:ofyhxvXcZhMsU5ulbFiLKl/XBFqE1GSq7atu8tAmTRI= -github.com/google/go-cmp v0.6.0/go.mod h1:17dUlkBOakJ0+DkrSSNjCkIjxS6bF9zb3elmeNGIjoY= -github.com/google/pprof v0.0.0-20210407192527-94a9f03dee38/go.mod h1:kpwsk12EmLew5upagYY7GY0pfYCcupk39gWOCRROcvE= -github.com/google/s2a-go v0.1.4 h1:1kZ/sQM3srePvKs3tXAvQzo66XfcReoqFpIpIccE7Oc= -github.com/google/s2a-go v0.1.4/go.mod h1:Ej+mSEMGRnqRzjc7VtF+jdBwYG5fuJfiZ8ELkjEwM0A= -github.com/google/subcommands v1.2.0/go.mod h1:ZjhPrFU+Olkh9WazFPsl27BQ4UPiG37m3yTrtFlrHVk= -github.com/google/uuid v1.1.2/go.mod h1:TIyPZe4MgqvfeYDBFedMoGGpEw/LqOeaOT+nhxU+yHo= -github.com/google/uuid v1.6.0 h1:NIvaJDMOsjHA8n1jAhLSgzrAzy1Hgr+hNrb57e+94F0= -github.com/google/uuid v1.6.0/go.mod h1:TIyPZe4MgqvfeYDBFedMoGGpEw/LqOeaOT+nhxU+yHo= -github.com/googleapis/enterprise-certificate-proxy v0.2.5 h1:UR4rDjcgpgEnqpIEvkiqTYKBCKLNmlge2eVjoZfySzM= -github.com/googleapis/enterprise-certificate-proxy v0.2.5/go.mod h1:RxW0N9901Cko1VOCW3SXCpWP+mlIEkk2tP7jnHy9a3w= -github.com/googleapis/gax-go/v2 v2.12.0 h1:A+gCJKdRfqXkr+BIRGtZLibNXf0m1f9E4HG56etFpas= -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.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-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= -github.com/holiman/uint256 v1.2.4/go.mod h1:EOMSn4q6Nyt9P6efbI3bueV4e1b3dGlUCXeiRV4ng7E= -github.com/hpcloud/tail v1.0.0/go.mod h1:ab1qPbhIpdTxEkNHXyeSf5vhxWSCs/tWer42PpOxQnU= -github.com/huin/goupnp v1.3.0 h1:UvLUlWDNpoUdYzb2TCn+MuTWtcjXKSza2n6CBdQ0xXc= -github.com/huin/goupnp v1.3.0/go.mod h1:gnGPsThkYa7bFi/KWmEysQRf48l2dvR5bxr2OFckNX8= -github.com/ianlancetaylor/demangle v0.0.0-20200824232613-28f6c0f3b639/go.mod h1:aSSvb/t6k1mPoxDqO4vJh6VOCGPwU4O0C2/Eqndh1Sc= -github.com/jackpal/go-nat-pmp v1.0.2 h1:KzKSgb7qkJvOUTqYl9/Hg/me3pWgBmERKrTGD7BdWus= -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.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= -github.com/kr/text v0.2.0/go.mod h1:eLer722TekiGuMkidMxC/pM04lWEeraHUUmBw8l2grE= -github.com/kylelemons/godebug v1.1.0 h1:RPNrshWIDI6G2gRW9EHilWtl7Z6Sb1BR0xunSBf0SNc= -github.com/kylelemons/godebug v1.1.0/go.mod h1:9/0rRGxNHcop5bhtWyNeEfOS8JIWk580+fNqagV/RAw= -github.com/leanovate/gopter v0.2.9 h1:fQjYxZaynp97ozCzfOyOuAGOU4aU/z37zf/tOujFk7c= -github.com/leanovate/gopter v0.2.9/go.mod h1:U2L/78B+KVFIx2VmW6onHJQzXtFb+p5y3y2Sh+Jxxv8= -github.com/mattn/go-colorable v0.1.13 h1:fFA4WZxdEF4tXPZVKMLwD8oUnCTTo08duU7wxecdEvA= -github.com/mattn/go-colorable v0.1.13/go.mod h1:7S9/ev0klgBDR4GtXTXX8a3vIGJpMovkB8vQcUbaXHg= -github.com/mattn/go-isatty v0.0.20 h1:xfD0iDuEKnDkl03q4limB+vH+GxLEtL/jb4xVJSWWEY= -github.com/mattn/go-isatty v0.0.20/go.mod h1:W+V8PltTTMOvKvAeJH7IuucS94S2C6jfK/D7dTCTo3Y= -github.com/mattn/go-runewidth v0.0.9/go.mod h1:H031xJmbD/WCDINGzjvQ9THkh0rPKHF+m2gUSrubnMI= -github.com/mattn/go-runewidth v0.0.14 h1:+xnbZSEeDbOIg5/mE6JF0w6n9duR1l3/WmbinWVwUuU= -github.com/mattn/go-runewidth v0.0.14/go.mod h1:Jdepj2loyihRzMpdS35Xk/zdY8IAYHsh153qUoGf23w= -github.com/mitchellh/mapstructure v1.5.0 h1:jeMsZIYE/09sWLaz43PL7Gy6RuMjD2eJVyuac5Z2hdY= -github.com/mitchellh/mapstructure v1.5.0/go.mod h1:bFUtVrKA4DC2yAKiSyO/QUcy7e+RRV2QTWOzhPopBRo= -github.com/mitchellh/pointerstructure v1.2.1 h1:ZhBBeX8tSlRpu/FFhXH4RC4OJzFlqsQhoHZAz4x7TIw= -github.com/mitchellh/pointerstructure v1.2.1/go.mod h1:BRAsLI5zgXmw97Lf6s25bs8ohIXc3tViBH44KcwB2g4= -github.com/mmcloughlin/addchain v0.4.0 h1:SobOdjm2xLj1KkXN5/n0xTIWyZA2+s99UCY1iPfkHRY= -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/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= -github.com/onsi/ginkgo v1.12.1/go.mod h1:zj2OWP4+oCPe1qIXoGWkgMRwljMUYCdkwsT2108oapk= -github.com/onsi/ginkgo v1.16.4/go.mod h1:dX+/inL/fNMqNlz0e9LfyB9TswhZpCVdJM/Z6Vvnwo0= -github.com/onsi/ginkgo v1.16.5 h1:8xi0RTUf59SOSfEtZMvwTvXYMzG4gV23XVHOZiXNtnE= -github.com/onsi/ginkgo v1.16.5/go.mod h1:+E8gABHa3K6zRBolWtd+ROzc/U5bkGt0FwiG042wbpU= -github.com/onsi/ginkgo/v2 v2.1.3/go.mod h1:vw5CSIxN1JObi/U8gcbwft7ZxR2dgaR70JSE3/PpL4c= -github.com/onsi/gomega v1.7.1/go.mod h1:XdKZgCCFLUoM/7CFJVPcG8C1xQ1AJ0vpAezJrB7JYyY= -github.com/onsi/gomega v1.10.1/go.mod h1:iN09h71vgCQne3DLsj+A5owkum+a2tYe+TOCB1ybHNo= -github.com/onsi/gomega v1.17.0/go.mod h1:HnhC7FXeEQY45zxNK3PPoIUhzk/80Xly9PcubAlGdZY= -github.com/onsi/gomega v1.19.0/go.mod h1:LY+I3pBVzYsTBU1AnDwOSxaYi9WoWiqgwooUqq9yPro= -github.com/onsi/gomega v1.31.1 h1:KYppCUK+bUgAZwHOu7EXVBKyQA6ILvOESHkn/tgoqvo= -github.com/onsi/gomega v1.31.1/go.mod h1:y40C95dwAD1Nz36SsEnxvfFe8FFfNxzI5eJ0EYGyAy0= -github.com/pingcap/errors v0.11.4 h1:lFuQV/oaUMGcD2tqt+01ROSmJs75VG1ToEOkZIZ4nE4= -github.com/pingcap/errors v0.11.4/go.mod h1:Oi8TUi2kEtXXLMJk9l1cGmz20kV3TaQ0usTwv5KuLY8= -github.com/pkg/diff v0.0.0-20210226163009-20ebb0f2a09e/go.mod h1:pJLUxLENpZxwdsKMEsNbx1VGcRFpLqf3715MtcvvzbA= -github.com/pkg/errors v0.9.1 h1:FEBLx1zS214owpjy7qsBeixbURkuhQAwrK5UwLGTwt4= -github.com/pkg/errors v0.9.1/go.mod h1:bwawxfHBFNV+L2hUp1rHADufV3IMtnDRdf1r5NINEl0= -github.com/pmezard/go-difflib v1.0.0 h1:4DBwDE0NGyQoBHbLQYPwSUPoCMWR5BEzIk/f1lZbAQM= -github.com/pmezard/go-difflib v1.0.0/go.mod h1:iKH77koFhYxTK1pcRnkKkqfTogsbg7gZNVY4sRDYZ/4= -github.com/prometheus/client_golang v1.19.0 h1:ygXvpU1AoN1MhdzckN+PyD9QJOSD4x7kmXYlnfbA6JU= -github.com/prometheus/client_golang v1.19.0/go.mod h1:ZRM9uEAypZakd+q/x7+gmsvXdURP+DABIEIjnmDdp+k= -github.com/prometheus/client_model v0.0.0-20190812154241-14fe0d1b01d4/go.mod h1:xMI15A0UPsDsEKsMN9yxemIoYk6Tm2C1GtYGdfGttqA= -github.com/prometheus/client_model v0.5.0 h1:VQw1hfvPvk3Uv6Qf29VrPF32JB6rtbgI6cYPYQjL0Qw= -github.com/prometheus/client_model v0.5.0/go.mod h1:dTiFglRmd66nLR9Pv9f0mZi7B7fk5Pm3gvsjB5tr+kI= -github.com/prometheus/common v0.48.0 h1:QO8U2CdOzSn1BBsmXJXduaaW+dY/5QLjfB8svtSzKKE= -github.com/prometheus/common v0.48.0/go.mod h1:0/KsvlIEfPQCQ5I2iNSAWKPZziNCvRs5EC6ILDTlAPc= -github.com/prometheus/procfs v0.12.0 h1:jluTpSng7V9hY0O2R9DzzJHYb2xULk9VTR1V1R/k6Bo= -github.com/prometheus/procfs v0.12.0/go.mod h1:pcuDEFsWDnvcgNzo4EEweacyhjeA9Zk3cnaOZAZEfOo= -github.com/rivo/uniseg v0.2.0/go.mod h1:J6wj4VEh+S6ZtnVlnTBMWIodfgj8LQOQFoIToxlJtxc= -github.com/rivo/uniseg v0.4.3 h1:utMvzDsuh3suAEnhH0RdHmoPbU648o6CvXxTx4SBMOw= -github.com/rivo/uniseg v0.4.3/go.mod h1:FN3SvrM+Zdj16jyLfmOkMNblXMcoc8DfTHruCPUcx88= -github.com/rogpeppe/fastuuid v1.2.0/go.mod h1:jVj6XXZzXRy/MSR5jhDC/2q6DgLz+nrA6LYCDYWNEvQ= -github.com/rogpeppe/go-internal v1.9.0/go.mod h1:WtVeX8xhTBvf0smdhujwtBcq4Qrzq/fJaraNFVN+nFs= -github.com/rogpeppe/go-internal v1.10.0 h1:TMyTOH3F/DB16zRVcYyreMH6GnZZrwQVAoYjRBZyWFQ= -github.com/rogpeppe/go-internal v1.10.0/go.mod h1:UQnix2H7Ngw/k4C5ijL5+65zddjncjaFoBhdsK/akog= -github.com/rs/cors v1.9.0 h1:l9HGsTsHJcvW14Nk7J9KFz8bzeAWXn3CG6bgt7LsrAE= -github.com/rs/cors v1.9.0/go.mod h1:XyqrcTp5zjWr1wsJ8PIRZssZ8b/WMcMf71DJnit4EMU= -github.com/russross/blackfriday/v2 v2.1.0 h1:JIOH55/0cWyOuilr9/qlrm0BSXldqnqwMsf35Ld67mk= -github.com/russross/blackfriday/v2 v2.1.0/go.mod h1:+Rmxgy9KzJVeS9/2gXHxylqXiyQDYRxCVz55jmeOWTM= -github.com/shirou/gopsutil v3.21.11+incompatible h1:+1+c1VGhc88SSonWP6foOcLhvnKlUeu/erjjvaPEYiI= -github.com/shirou/gopsutil v3.21.11+incompatible/go.mod h1:5b4v6he4MtMOwMlS0TUMTu2PcXUg8+E1lC7eC3UO/RA= -github.com/status-im/keycard-go v0.2.0 h1:QDLFswOQu1r5jsycloeQh3bVU8n/NatHHaZobtDnDzA= -github.com/status-im/keycard-go v0.2.0/go.mod h1:wlp8ZLbsmrF6g6WjugPAx+IzoLrkdf9+mHxBEeo3Hbg= -github.com/stretchr/objx v0.1.0/go.mod h1:HFkY916IF+rwdDfMAkV7OtwuqBVzrE8GR6GFx+wExME= -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/testify v1.3.0/go.mod h1:M5WIy9Dh21IEIfnGCwXGc5bZfKNJtfHm1UVUgZn+9EI= -github.com/stretchr/testify v1.5.1/go.mod h1:5W2xD1RspED5o8YsWQXVCued0rvSQ+mT+I5cxcmMvtA= -github.com/stretchr/testify v1.7.0/go.mod h1:6Fq8oRcR53rry900zMqJjRRixrwX3KX962/h/Wwjteg= -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= -github.com/supranational/blst v0.3.11/go.mod h1:jZJtfjgudtNl4en1tzwPIV3KjUnQUvG3/j+w+fVonLw= -github.com/syndtr/goleveldb v1.0.1-0.20220614013038-64ee5596c38a h1:1ur3QoCqvE5fl+nylMaIr9PVV1w343YRDtsy+Rwu7XI= -github.com/syndtr/goleveldb v1.0.1-0.20220614013038-64ee5596c38a/go.mod h1:RRCYJbIwD5jmqPI9XoAFR0OcDxqUctll6zUj/+B4S48= -github.com/tklauser/go-sysconf v0.3.12 h1:0QaGUFOdQaIVdPgfITYzaTegZvdCjmYO52cSFAEVmqU= -github.com/tklauser/go-sysconf v0.3.12/go.mod h1:Ho14jnntGE1fpdOqQEEaiKRpvIavV0hSfmBq8nJbHYI= -github.com/tklauser/numcpus v0.6.1 h1:ng9scYS7az0Bk4OZLvrNXNSAO2Pxr1XXRAPyjhIx+Fk= -github.com/tklauser/numcpus v0.6.1/go.mod h1:1XfjsgE2zo8GVw7POkMbHENHzVg3GzmoZ9fESEdAacY= -github.com/tyler-smith/go-bip39 v1.1.0 h1:5eUemwrMargf3BSLRRCalXT93Ns6pQJIjYQN2nyfOP8= -github.com/tyler-smith/go-bip39 v1.1.0/go.mod h1:gUYDtqQw1JS3ZJ8UWVcGTGqqr6YIN3CWg+kkNaLt55U= -github.com/urfave/cli/v2 v2.27.1 h1:8xSQ6szndafKVRmfyeUMxkNUJQMjL1F2zmsZ+qHpfho= -github.com/urfave/cli/v2 v2.27.1/go.mod h1:8qnjx1vcq5s2/wpsqoZFndg2CE5tNFyrTvS6SinrnYQ= -github.com/xrash/smetrics v0.0.0-20201216005158-039620a65673 h1:bAn7/zixMGCfxrRTfdpNzjtPYqr8smhKouy9mxVdGPU= -github.com/xrash/smetrics v0.0.0-20201216005158-039620a65673/go.mod h1:N3UwUGtsrSj3ccvlPHLoLsHnpR27oXr4ZE984MbSER8= -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.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= -golang.org/x/crypto v0.0.0-20190308221718-c2843e01d9a2/go.mod h1:djNgcEr1/C05ACkg1iLfiJU5Ep61QUkGW8qpdssI0+w= -golang.org/x/crypto v0.0.0-20191011191535-87dc89f01550/go.mod h1:yigFU9vqHzYiE8UmvKecakEJjdnWj3jj499lnFckfCI= -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.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-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= -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.6.0-dev.0.20220419223038-86c51ed26bb4/go.mod h1:jJ57K6gSWd91VN4djpZkiMVwK6gcyfeH4XE8wZrZaV4= -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-20180724234803-3673e40ba225/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4= -golang.org/x/net v0.0.0-20180826012351-8a410e7b638d/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4= -golang.org/x/net v0.0.0-20180906233101-161cd47e91fd/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4= -golang.org/x/net v0.0.0-20190108225652-1e06a53dbb7e/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4= -golang.org/x/net v0.0.0-20190213061140-3a22650c66bd/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4= -golang.org/x/net v0.0.0-20190311183353-d8887717615a/go.mod h1:t9HGtf8HONx5eT2rtn7q6eTqICYqUVnKs3thJo3Qplg= -golang.org/x/net v0.0.0-20190404232315-eb5bcb51f2a3/go.mod h1:t9HGtf8HONx5eT2rtn7q6eTqICYqUVnKs3thJo3Qplg= -golang.org/x/net v0.0.0-20190603091049-60506f45cf65/go.mod h1:HSz+uSET+XFnRR8LxR5pz3Of3rY3CfYBVs4xY44aLks= -golang.org/x/net v0.0.0-20190620200207-3b0461eec859/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s= -golang.org/x/net v0.0.0-20200226121028-0de0cce0169b/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s= -golang.org/x/net v0.0.0-20200520004742-59133d7f0dd7/go.mod h1:qpuaurCH72eLCgpAm/N6yyVIVM9cpaDIP3A8BGJEC5A= -golang.org/x/net v0.0.0-20200822124328-c89045814202/go.mod h1:/O7V0waA8r7cgGh81Ro3o1hOxt32SMVPicZroKQ2sZA= -golang.org/x/net v0.0.0-20201021035429-f5854403a974/go.mod h1:sp8m0HH+o8qH0wwXwYZr8TS3Oi6o0r6Gce1SSxlDquU= -golang.org/x/net v0.0.0-20201110031124-69a78807bb2b/go.mod h1:sp8m0HH+o8qH0wwXwYZr8TS3Oi6o0r6Gce1SSxlDquU= -golang.org/x/net v0.0.0-20210226172049-e18ecbb05110/go.mod h1:m0MpNAwzfU5UDzcl9v0D8zg8gWTRqZa9RBIspLL5mdg= -golang.org/x/net v0.0.0-20210428140749-89ef3d95e781/go.mod h1:OJAsFXCWl8Ukc7SiCT/9KSuxbyM7479/AVlXFRxuMCk= -golang.org/x/net v0.0.0-20211112202133-69e39bad7dc2/go.mod h1:9nx3DQGgdP8bBQD5qxJ1jj9UTztislL4KSBs9R2vV5Y= -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.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= -golang.org/x/oauth2 v0.16.0/go.mod h1:hqZ+0LWXsiVoZpeld6jVt06P3adbS2Uu911W1SsJv2o= -golang.org/x/sync v0.0.0-20180314180146-1d60e4601c6f/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= -golang.org/x/sync v0.0.0-20181108010431-42b317875d0f/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= -golang.org/x/sync v0.0.0-20181221193216-37e7f081c4d4/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= -golang.org/x/sync v0.0.0-20190423024810-112230192c58/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= -golang.org/x/sync v0.0.0-20190911185100-cd5d95a43a6e/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= -golang.org/x/sync v0.0.0-20201020160332-67f06af15bc9/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.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-20180830151530-49385e6e1522/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= -golang.org/x/sys v0.0.0-20180909124046-d0be0721c37e/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= -golang.org/x/sys v0.0.0-20190215142949-d0b11bdaac8a/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= -golang.org/x/sys v0.0.0-20190412213103-97732733099d/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20190904154756-749cb33beabd/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20190916202348-b4ddaad3f8a3/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20191005200804-aed5e4c7ecf9/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20191120155948-bd437916bb0e/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20191204072324-ce4227a45e2e/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20200323222414-85ca7c5b95cd/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20200930185726-fdedc70b468f/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20201119102817-f84b799fce68/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20210112080510-489259a85091/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20210423082822-04245dca01da/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20210615035016-665e8c7367d1/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= -golang.org/x/sys v0.0.0-20211216021012-1d35b9e2eb4e/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= -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.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.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.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= -golang.org/x/tools v0.0.0-20190114222345-bf090417da8b/go.mod h1:n7NCudcB/nEzxVGmLbDWY5pfWTLqBcC2KZ6jyYvM4mQ= -golang.org/x/tools v0.0.0-20190226205152-f727befe758c/go.mod h1:9Yl7xja0Znq3iFh3HoIrodX9oNMXvdceNzlUR8zjMvY= -golang.org/x/tools v0.0.0-20190311212946-11955173bddd/go.mod h1:LCzVGOaR6xXOjkQ3onu1FJEFr0SW1gC7cKk1uF8kGRs= -golang.org/x/tools v0.0.0-20190524140312-2c0ae7006135/go.mod h1:RgjU9mgBXZiqYHBnxXauZ1Gv1EHHAz9KjViQ78xBX0Q= -golang.org/x/tools v0.0.0-20191119224855-298f0cb1881e/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo= -golang.org/x/tools v0.0.0-20200619180055-7c47624df98f/go.mod h1:EkVYQZoAsY45+roYkvgYkIh4xh/qjgUK9TdY2XT94GE= -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.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= -golang.org/x/xerrors v0.0.0-20200804184101-5ec99f83aff1/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0= -golang.org/x/xerrors v0.0.0-20220517211312-f3a8303e98df/go.mod h1:K8+ghG5WaK9qNqU5K3HdILfMLy1f3aNYFI/wnl100a8= -google.golang.org/api v0.132.0 h1:8t2/+qZ26kAOGSmOiHwVycqVaDg7q3JDILrNi/Z6rvc= -google.golang.org/api v0.132.0/go.mod h1:AeTBC6GpJnJSRJjktDcPX0QwtS8pGYZOV6MSuSCusw0= -google.golang.org/appengine v1.1.0/go.mod h1:EbEs0AVv82hx2wNQdGPgUI5lhzA/G0D9YwlJXL52JkM= -google.golang.org/appengine v1.4.0/go.mod h1:xpcJRLb0r/rnEns0DIKYYv+WjYCduHsrkT7/EB5XEv4= -google.golang.org/appengine v1.6.7 h1:FZR1q0exgwxzPzp/aF+VccGrSfxfPpkBqjIIEq3ru6c= -google.golang.org/appengine v1.6.7/go.mod h1:8WjMMxjGQR8xUklV/ARdw2HLXBOI7O7uCIDZVag1xfc= -google.golang.org/genproto v0.0.0-20180817151627-c66870c02cf8/go.mod h1:JiN7NxoALGmiZfu7CAH4rXhgtRTLTxftemlI0sWmxmc= -google.golang.org/genproto v0.0.0-20190819201941-24fa4b261c55/go.mod h1:DMBHOl98Agz4BDEuKkezgsaosCRResVns1a3J2ZsMNc= -google.golang.org/genproto v0.0.0-20200513103714-09dca8ec2884/go.mod h1:55QSHmfGQM9UVYDPBsyGGes0y52j32PQ3BqQfXhyH3c= -google.golang.org/genproto v0.0.0-20200526211855-cb27e3aa2013/go.mod h1:NbSheEEYHJ7i3ixzK3sjbqSGDJWnxyFXZblF3eUsNvo= -google.golang.org/genproto v0.0.0-20230706204954-ccb25ca9f130 h1:Au6te5hbKUV8pIYWHqOUZ1pva5qK/rwbIhoXEUB9Lu8= -google.golang.org/genproto v0.0.0-20230706204954-ccb25ca9f130/go.mod h1:O9kGHb51iE/nOGvQaDUuadVYqovW56s5emA88lQnj6Y= -google.golang.org/genproto/googleapis/api v0.0.0-20230706204954-ccb25ca9f130 h1:XVeBY8d/FaK4848myy41HBqnDwvxeV3zMZhwN1TvAMU= -google.golang.org/genproto/googleapis/api v0.0.0-20230706204954-ccb25ca9f130/go.mod h1:mPBs5jNgx2GuQGvFwUvVKqtn6HsUw9nP64BedgvqEsQ= -google.golang.org/genproto/googleapis/rpc v0.0.0-20230711160842-782d3b101e98 h1:bVf09lpb+OJbByTj913DRJioFFAjf/ZGxEz7MajTp2U= -google.golang.org/genproto/googleapis/rpc v0.0.0-20230711160842-782d3b101e98/go.mod h1:TUfxEVdsvPg18p6AslUXFoLdpED4oBnGwyqk3dV1XzM= -google.golang.org/grpc v1.19.0/go.mod h1:mqu4LbDTu4XGKhr4mRzUsmM4RtVoemTSY81AxZiDr8c= -google.golang.org/grpc v1.23.0/go.mod h1:Y5yQAOtifL1yxbo5wqy6BxZv8vAUGQwXBOALyacEbxg= -google.golang.org/grpc v1.25.1/go.mod h1:c3i+UQWmh7LiEpx4sFZnkU36qjEYZ0imhYfXVyQciAY= -google.golang.org/grpc v1.27.0/go.mod h1:qbnxyOmOxrQa7FizSgH+ReBfzJrCY1pSN7KXBS8abTk= -google.golang.org/grpc v1.33.1/go.mod h1:fr5YgcSWrqhRRxogOsw7RzIpsmvOZ6IcH4kBYTpR3n0= -google.golang.org/grpc v1.33.2/go.mod h1:JMHMWHQWaTccqQQlmk3MJZS+GWXOdAesneDmEnv2fbc= -google.golang.org/grpc v1.36.0/go.mod h1:qjiiYl8FncCW8feJPdyg3v6XW24KsRHe+dy9BAGRRjU= -google.golang.org/grpc v1.45.0/go.mod h1:lN7owxKUQEqMfSyQikvvk5tf/6zMPsrK+ONuO11+0rQ= -google.golang.org/grpc v1.56.3 h1:8I4C0Yq1EjstUzUJzpcRVbuYA2mODtEmpWiQoN/b2nc= -google.golang.org/grpc v1.56.3/go.mod h1:I9bI3vqKfayGqPUAwGdOSu7kt6oIJLixfffKrpXqQ9s= -google.golang.org/protobuf v0.0.0-20200109180630-ec00e32a8dfd/go.mod h1:DFci5gLYBciE7Vtevhsrf46CRTquxDuWsQurQQe4oz8= -google.golang.org/protobuf v0.0.0-20200221191635-4d8936d0db64/go.mod h1:kwYJMbMJ01Woi6D6+Kah6886xMZcty6N08ah7+eCXa0= -google.golang.org/protobuf v0.0.0-20200228230310-ab0ca4ff8a60/go.mod h1:cfTl7dwQJ+fmap5saPgwCLgHXTUD7jkjRqWcaiX5VyM= -google.golang.org/protobuf v1.20.1-0.20200309200217-e05f789c0967/go.mod h1:A+miEFZTKqfCUM6K7xSMQL9OKL/b6hQv+e19PK+JZNE= -google.golang.org/protobuf v1.21.0/go.mod h1:47Nbq4nVaFHyn7ilMalzfO3qCViNmqZ2kzikPIcrTAo= -google.golang.org/protobuf v1.22.0/go.mod h1:EGpADcykh3NcUnDUJcl1+ZksZNG86OlYog2l/sGQquU= -google.golang.org/protobuf v1.23.0/go.mod h1:EGpADcykh3NcUnDUJcl1+ZksZNG86OlYog2l/sGQquU= -google.golang.org/protobuf v1.23.1-0.20200526195155-81db48ad09cc/go.mod h1:EGpADcykh3NcUnDUJcl1+ZksZNG86OlYog2l/sGQquU= -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.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= -gopkg.in/fsnotify.v1 v1.4.7/go.mod h1:Tz8NjZHkW78fSQdbUxIjBTcgA1z1m8ZHf0WmKUhAMys= -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= -gopkg.in/tomb.v1 v1.0.0-20141024135613-dd632973f1e7/go.mod h1:dt/ZhP58zS4L8KSrWDmTeBkI65Dw0HsyUHuEVlX15mw= -gopkg.in/yaml.v2 v2.2.2/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI= -gopkg.in/yaml.v2 v2.2.3/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI= -gopkg.in/yaml.v2 v2.2.4/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI= -gopkg.in/yaml.v2 v2.3.0/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI= -gopkg.in/yaml.v2 v2.4.0 h1:D8xgwECY7CYvx+Y2n4sBz93Jn9JRvxdiyyo8CTfuKaY= -gopkg.in/yaml.v2 v2.4.0/go.mod h1:RDklbk79AGWmwhnvt/jBztapEOGDOx6ZbXqjP6csGnQ= -gopkg.in/yaml.v3 v3.0.0-20200313102051-9f266ea9e77c/go.mod h1:K4uyk7z7BCEPqu6E+C64Yfv1cQ7kz7rIZviUmN+EgEM= -gopkg.in/yaml.v3 v3.0.1 h1:fxVm/GzAzEWqLHuvctI91KS9hhNmmWOoWu0XTYJS7CA= -gopkg.in/yaml.v3 v3.0.1/go.mod h1:K4uyk7z7BCEPqu6E+C64Yfv1cQ7kz7rIZviUmN+EgEM= -honnef.co/go/tools v0.0.0-20190102054323-c2f93a96b099/go.mod h1:rf3lG4BRIbNafJWhAfAdb/ePZxsR/4RtNHQocxwk9r4= -honnef.co/go/tools v0.0.0-20190523083050-ea95bdfd59fc/go.mod h1:rf3lG4BRIbNafJWhAfAdb/ePZxsR/4RtNHQocxwk9r4= -rsc.io/tmplfunc v0.0.3 h1:53XFQh69AfOa8Tw0Jm7t+GV7KZhOi6jzsCzTtKbMvzU= -rsc.io/tmplfunc v0.0.3/go.mod h1:AG3sTPzElb1Io3Yg4voV9AGZJuleGAwaVRxL9M49PhA= diff --git a/op-ufm/pkg/config/config.go b/op-ufm/pkg/config/config.go deleted file mode 100644 index e0c80d67f731..000000000000 --- a/op-ufm/pkg/config/config.go +++ /dev/null @@ -1,171 +0,0 @@ -package config - -import ( - "math/big" - - "github.com/BurntSushi/toml" - "github.com/pkg/errors" -) - -type Config struct { - LogLevel string `toml:"log_level"` - - Signer SignerServiceConfig `toml:"signer_service"` - Metrics MetricsConfig `toml:"metrics"` - Healthz HealthzConfig `toml:"healthz"` - - Wallets map[string]*WalletConfig `toml:"wallets"` - Providers map[string]*ProviderConfig `toml:"providers"` -} - -type SignerServiceConfig struct { - URL string `toml:"url"` - TLSCaCert string `toml:"tls_ca_cert"` - TLSCert string `toml:"tls_cert"` - TLSKey string `toml:"tls_key"` -} - -type MetricsConfig struct { - Enabled bool `toml:"enabled"` - Debug bool `toml:"debug"` - Host string `toml:"host"` - Port string `toml:"port"` -} - -type HealthzConfig struct { - Enabled bool `toml:"enabled"` - Host string `toml:"host"` - Port string `toml:"port"` -} - -type WalletConfig struct { - ChainID big.Int `toml:"chain_id"` - - // signer | static - SignerMethod string `toml:"signer_method"` - Address string `toml:"address"` - // private key is used for static signing - PrivateKey string `toml:"private_key"` - - // transaction parameters - TxValue big.Int `toml:"tx_value"` -} - -type ProviderConfig struct { - Network string `toml:"network"` - URL string `toml:"url"` - - ReadOnly bool `toml:"read_only"` - ReadInterval TOMLDuration `toml:"read_interval"` - - SendInterval TOMLDuration `toml:"send_interval"` - SendTransactionRetryInterval TOMLDuration `toml:"send_transaction_retry_interval"` - SendTransactionRetryTimeout TOMLDuration `toml:"send_transaction_retry_timeout"` - SendTransactionCoolDown TOMLDuration `toml:"send_transaction_cool_down"` - ReceiptRetrievalInterval TOMLDuration `toml:"receipt_retrieval_interval"` - ReceiptRetrievalTimeout TOMLDuration `toml:"receipt_retrieval_timeout"` - - Wallet string `toml:"wallet"` -} - -func New(file string) (*Config, error) { - cfg := &Config{} - if _, err := toml.DecodeFile(file, cfg); err != nil { - return nil, err - } - return cfg, nil -} - -func (c *Config) Validate() error { - if c.Metrics.Enabled { - if c.Metrics.Host == "" || c.Metrics.Port == "" { - return errors.New("metrics is enabled but host or port are missing") - } - } - if c.Healthz.Enabled { - if c.Healthz.Host == "" || c.Healthz.Port == "" { - return errors.New("healthz is enabled but host or port are missing") - } - } - - if len(c.Wallets) == 0 { - return errors.New("at least one wallet must be set") - } - - if len(c.Providers) == 0 { - return errors.New("at least one provider must be set") - } - - for name, wallet := range c.Wallets { - if wallet.ChainID.BitLen() == 0 { - return errors.Errorf("wallet [%s] chain_id is missing", name) - } - if wallet.SignerMethod != "signer" && wallet.SignerMethod != "static" { - return errors.Errorf("wallet [%s] signer_method is invalid", name) - } - if wallet.SignerMethod == "signer" { - if c.Signer.URL == "" { - return errors.New("signer url is missing") - } - if c.Signer.TLSCaCert == "" { - return errors.New("signer tls_ca_cert is missing") - } - if c.Signer.TLSCert == "" { - return errors.New("signer tls_cert is missing") - } - if c.Signer.TLSKey == "" { - return errors.New("signer tls_key is missing") - } - } - if wallet.SignerMethod == "static" { - if wallet.PrivateKey == "" { - return errors.Errorf("wallet [%s] private_key is missing", name) - } - } - if wallet.Address == "" { - return errors.Errorf("wallet [%s] address is missing", name) - } - if wallet.TxValue.BitLen() == 0 { - return errors.Errorf("wallet [%s] tx_value is missing", name) - } - } - - for name, provider := range c.Providers { - if provider.URL == "" { - return errors.Errorf("provider [%s] url is missing", name) - } - if provider.ReadInterval == 0 { - return errors.Errorf("provider [%s] read_interval is missing", name) - } - if provider.SendInterval == 0 { - return errors.Errorf("provider [%s] send_interval is missing", name) - } - if provider.SendTransactionRetryInterval == 0 { - return errors.Errorf("provider [%s] send_transaction_retry_interval is missing", name) - } - if provider.SendTransactionRetryTimeout == 0 { - return errors.Errorf("provider [%s] send_transaction_retry_timeout is missing", name) - } - if provider.SendTransactionCoolDown == 0 { - return errors.Errorf("provider [%s] send_transaction_cool_down is missing", name) - } - if provider.ReceiptRetrievalInterval == 0 { - return errors.Errorf("provider [%s] receipt_retrieval_interval is missing", name) - } - if provider.ReceiptRetrievalTimeout == 0 { - return errors.Errorf("provider [%s] receipt_retrieval_timeout is missing", name) - } - if provider.Wallet == "" { - return errors.Errorf("provider [%s] wallet is missing", name) - } - if _, ok := c.Wallets[provider.Wallet]; !ok { - return errors.Errorf("provider [%s] has an invalid wallet [%s]", name, provider.Wallet) - } - } - - if c.LogLevel == "" { - c.LogLevel = "debug" - } - - return nil -} diff --git a/op-ufm/pkg/config/toml_duration.go b/op-ufm/pkg/config/toml_duration.go deleted file mode 100644 index 64fe368c57d7..000000000000 --- a/op-ufm/pkg/config/toml_duration.go +++ /dev/null @@ -1,15 +0,0 @@ -package config - -import "time" - -type TOMLDuration time.Duration - -func (t *TOMLDuration) UnmarshalText(b []byte) error { - d, err := time.ParseDuration(string(b)) - if err != nil { - return err - } - - *t = TOMLDuration(d) - return nil -} diff --git a/op-ufm/pkg/metrics/clients/eth.go b/op-ufm/pkg/metrics/clients/eth.go deleted file mode 100644 index 92d7c25599ea..000000000000 --- a/op-ufm/pkg/metrics/clients/eth.go +++ /dev/null @@ -1,123 +0,0 @@ -package clients - -import ( - "context" - "math/big" - "time" - - "github.com/ethereum-optimism/optimism/op-ufm/pkg/metrics" - "github.com/ethereum/go-ethereum" - "github.com/ethereum/go-ethereum/common" - "github.com/ethereum/go-ethereum/core" - "github.com/ethereum/go-ethereum/core/txpool" - "github.com/ethereum/go-ethereum/core/types" - "github.com/ethereum/go-ethereum/ethclient" -) - -type InstrumentedEthClient struct { - c *ethclient.Client - providerName string -} - -func Dial(providerName string, url string) (*InstrumentedEthClient, error) { - start := time.Now() - c, err := ethclient.Dial(url) - if err != nil { - metrics.RecordErrorDetails(providerName, "ethclient.Dial", err) - return nil, err - } - metrics.RecordRPCLatency(providerName, "ethclient", "Dial", time.Since(start)) - return &InstrumentedEthClient{c: c, providerName: providerName}, nil -} - -func (i *InstrumentedEthClient) TransactionByHash(ctx context.Context, hash common.Hash) (*types.Transaction, bool, error) { - start := time.Now() - tx, isPending, err := i.c.TransactionByHash(ctx, hash) - if err != nil { - if !i.ignorableErrors(err) { - metrics.RecordErrorDetails(i.providerName, "ethclient.TransactionByHash", err) - } - return nil, false, err - } - metrics.RecordRPCLatency(i.providerName, "ethclient", "TransactionByHash", time.Since(start)) - return tx, isPending, err -} - -func (i *InstrumentedEthClient) PendingNonceAt(ctx context.Context, address string) (uint64, error) { - start := time.Now() - nonce, err := i.c.PendingNonceAt(ctx, common.HexToAddress(address)) - if err != nil { - metrics.RecordErrorDetails(i.providerName, "ethclient.PendingNonceAt", err) - return 0, err - } - metrics.RecordRPCLatency(i.providerName, "ethclient", "PendingNonceAt", time.Since(start)) - return nonce, err -} - -func (i *InstrumentedEthClient) TransactionReceipt(ctx context.Context, txHash common.Hash) (*types.Receipt, error) { - start := time.Now() - receipt, err := i.c.TransactionReceipt(ctx, txHash) - if err != nil { - if !i.ignorableErrors(err) { - metrics.RecordErrorDetails(i.providerName, "ethclient.TransactionReceipt", err) - } - return nil, err - } - metrics.RecordRPCLatency(i.providerName, "ethclient", "TransactionReceipt", time.Since(start)) - return receipt, err -} - -func (i *InstrumentedEthClient) SendTransaction(ctx context.Context, tx *types.Transaction) error { - start := time.Now() - err := i.c.SendTransaction(ctx, tx) - if err != nil { - if !i.ignorableErrors(err) { - metrics.RecordErrorDetails(i.providerName, "ethclient.SendTransaction", err) - } - return err - } - metrics.RecordRPCLatency(i.providerName, "ethclient", "SendTransaction", time.Since(start)) - return err -} - -func (i *InstrumentedEthClient) EstimateGas(ctx context.Context, msg ethereum.CallMsg) (uint64, error) { - start := time.Now() - gas, err := i.c.EstimateGas(ctx, msg) - if err != nil { - metrics.RecordErrorDetails(i.providerName, "ethclient.EstimateGas", err) - return 0, err - } - metrics.RecordRPCLatency(i.providerName, "ethclient", "EstimateGas", time.Since(start)) - return gas, err -} - -func (i *InstrumentedEthClient) SuggestGasTipCap(ctx context.Context) (*big.Int, error) { - start := time.Now() - gasTipCap, err := i.c.SuggestGasTipCap(ctx) - if err != nil { - metrics.RecordErrorDetails(i.providerName, "ethclient.SuggestGasTipCap", err) - return nil, err - } - metrics.RecordRPCLatency(i.providerName, "ethclient", "SuggestGasTipCap", time.Since(start)) - return gasTipCap, err -} - -func (i *InstrumentedEthClient) HeaderByNumber(ctx context.Context, number *big.Int) (*types.Header, error) { - start := time.Now() - header, err := i.c.HeaderByNumber(ctx, number) - if err != nil { - metrics.RecordErrorDetails(i.providerName, "ethclient.HeaderByNumber", err) - return nil, err - } - metrics.RecordRPCLatency(i.providerName, "ethclient", "HeaderByNumber", time.Since(start)) - return header, err -} - -func (i *InstrumentedEthClient) ignorableErrors(err error) bool { - msg := err.Error() - // we dont use errors.Is because eth client actually uses errors.New, - // therefore creating an incomparable instance :( - return msg == ethereum.NotFound.Error() || - msg == txpool.ErrAlreadyKnown.Error() || - msg == core.ErrNonceTooLow.Error() -} diff --git a/op-ufm/pkg/metrics/clients/signer.go b/op-ufm/pkg/metrics/clients/signer.go deleted file mode 100644 index 6d0c413b7ed1..000000000000 --- a/op-ufm/pkg/metrics/clients/signer.go +++ /dev/null @@ -1,42 +0,0 @@ -package clients - -import ( - "context" - "math/big" - "time" - - "github.com/ethereum-optimism/optimism/op-ufm/pkg/metrics" - "github.com/ethereum/go-ethereum/common" - - signer "github.com/ethereum-optimism/optimism/op-service/signer" - optls "github.com/ethereum-optimism/optimism/op-service/tls" - "github.com/ethereum/go-ethereum/core/types" - "github.com/ethereum/go-ethereum/log" -) - -type InstrumentedSignerClient struct { - c *signer.SignerClient - providerName string -} - -func NewSignerClient(providerName string, logger log.Logger, endpoint string, tlsConfig optls.CLIConfig) (*InstrumentedSignerClient, error) { - start := time.Now() - c, err := signer.NewSignerClient(logger, endpoint, tlsConfig) - if err != nil { - metrics.RecordErrorDetails(providerName, "signer.NewSignerClient", err) - return nil, err - } - metrics.RecordRPCLatency(providerName, "signer", "NewSignerClient", time.Since(start)) - return &InstrumentedSignerClient{c: c, providerName: providerName}, nil -} - -func (i *InstrumentedSignerClient) SignTransaction(ctx context.Context, chainId *big.Int, from *common.Address, tx *types.Transaction) (*types.Transaction, error) { - start := time.Now() - tx, err := i.c.SignTransaction(ctx, chainId, *from, tx) - if err != nil { - metrics.RecordErrorDetails(i.providerName, "signer.SignTransaction", err) - return nil, err - } - metrics.RecordRPCLatency(i.providerName, "signer", "SignTransaction", time.Since(start)) - return tx, err -} diff --git a/op-ufm/pkg/metrics/metrics.go b/op-ufm/pkg/metrics/metrics.go deleted file mode 100644 index 6c8a64a89df2..000000000000 --- a/op-ufm/pkg/metrics/metrics.go +++ /dev/null @@ -1,166 +0,0 @@ -package metrics - -import ( - fmt "fmt" - "regexp" - "strings" - "time" - - "github.com/ethereum/go-ethereum/log" - "github.com/prometheus/client_golang/prometheus" - "github.com/prometheus/client_golang/prometheus/promauto" -) - -const ( - MetricsNamespace = "ufm" -) - -var ( - Debug bool - - errorsTotal = promauto.NewGaugeVec(prometheus.GaugeOpts{ - Namespace: MetricsNamespace, - Name: "errors_total", - Help: "Count of errors", - }, []string{ - "provider", - "error", - }) - - rpcLatency = promauto.NewGaugeVec(prometheus.GaugeOpts{ - Namespace: MetricsNamespace, - Name: "rpc_latency", - Help: "RPC latency per provider, client and method (ms)", - }, []string{ - "provider", - "client", - "method", - }) - - roundTripLatency = promauto.NewGaugeVec(prometheus.GaugeOpts{ - Namespace: MetricsNamespace, - Name: "roundtrip_latency", - Help: "Round trip latency per provider (ms)", - }, []string{ - "provider", - }) - - gasUsed = promauto.NewGaugeVec(prometheus.GaugeOpts{ - Namespace: MetricsNamespace, - Name: "gas_used", - Help: "Gas used per provider", - }, []string{ - "provider", - }) - - firstSeenLatency = promauto.NewGaugeVec(prometheus.GaugeOpts{ - Namespace: MetricsNamespace, - Name: "first_seen_latency", - Help: "First seen latency latency per provider (ms)", - }, []string{ - "provider_source", - "provider_seen", - }) - - providerToProviderLatency = promauto.NewGaugeVec(prometheus.GaugeOpts{ - Namespace: MetricsNamespace, - Name: "provider_to_provider_latency", - Help: "Provider to provider latency (ms)", - }, []string{ - "provider_source", - "provider_seen", - }) - - networkTransactionsInFlight = promauto.NewGaugeVec(prometheus.GaugeOpts{ - Namespace: MetricsNamespace, - Name: "transactions_inflight", - Help: "Transactions in flight, per network", - }, []string{ - "network", - }) -) - -var nonAlphanumericRegex = regexp.MustCompile(`[^a-zA-Z ]+`) - -func RecordError(provider string, errorLabel string) { - if Debug { - log.Debug("metric inc", - "m", "errors_total", - "provider", provider, - "error", errorLabel) - } - errorsTotal.WithLabelValues(provider, errorLabel).Inc() -} - -// RecordErrorDetails concats the error message to the label removing non-alpha chars -func RecordErrorDetails(provider string, label string, err error) { - errClean := nonAlphanumericRegex.ReplaceAllString(err.Error(), "") - errClean = strings.ReplaceAll(errClean, " ", "_") - errClean = strings.ReplaceAll(errClean, "__", "_") - label = fmt.Sprintf("%s.%s", label, errClean) - RecordError(provider, label) -} - -func RecordRPCLatency(provider string, client string, method string, latency time.Duration) { - if Debug { - log.Debug("metric set", - "m", "rpc_latency", - "provider", provider, - "client", client, - "method", method, - "latency", latency) - } - rpcLatency.WithLabelValues(provider, client, method).Set(float64(latency.Milliseconds())) -} - -func RecordRoundTripLatency(provider string, latency time.Duration) { - if Debug { - log.Debug("metric set", - "m", "roundtrip_latency", - "provider", provider, - "latency", latency) - } - roundTripLatency.WithLabelValues(provider).Set(float64(latency.Milliseconds())) -} - -func RecordGasUsed(provider string, val uint64) { - if Debug { - log.Debug("metric add", - "m", "gas_used", - "provider", provider, - "val", val) - } - gasUsed.WithLabelValues(provider).Set(float64(val)) -} - -func RecordFirstSeenLatency(providerSource string, providerSeen string, latency time.Duration) { - if Debug { - log.Debug("metric set", - "m", "first_seen_latency", - "provider_source", providerSource, - "provider_seen", providerSeen, - "latency", latency) - } - firstSeenLatency.WithLabelValues(providerSource, providerSeen).Set(float64(latency.Milliseconds())) -} - -func RecordProviderToProviderLatency(providerSource string, providerSeen string, latency time.Duration) { - if Debug { - log.Debug("metric set", - "m", "provider_to_provider_latency", - "provider_source", providerSource, - "provider_seen", providerSeen, - "latency", latency) - } - providerToProviderLatency.WithLabelValues(providerSource, providerSeen).Set(float64(latency.Milliseconds())) -} - -func RecordTransactionsInFlight(network string, count int) { - if Debug { - log.Debug("metric set", - "m", "transactions_inflight", - "network", network, - "count", count) - } - networkTransactionsInFlight.WithLabelValues(network).Set(float64(count)) -} diff --git a/op-ufm/pkg/provider/heartbeat.go b/op-ufm/pkg/provider/heartbeat.go deleted file mode 100644 index ddc6ed28069e..000000000000 --- a/op-ufm/pkg/provider/heartbeat.go +++ /dev/null @@ -1,104 +0,0 @@ -package provider - -import ( - "context" - "time" - - "github.com/ethereum-optimism/optimism/op-ufm/pkg/metrics" - "github.com/ethereum-optimism/optimism/op-ufm/pkg/metrics/clients" - - "github.com/ethereum/go-ethereum" - "github.com/ethereum/go-ethereum/log" - "github.com/pkg/errors" -) - -// Heartbeat polls for expected in-flight transactions -func (p *Provider) Heartbeat(ctx context.Context) { - log.Debug("heartbeat", - "provider", p.name, - "count", len(p.txPool.Transactions)) - - metrics.RecordTransactionsInFlight(p.config.Network, len(p.txPool.Transactions)) - - // let's exclude transactions already seen by this provider, or originated by it - expectedTransactions := make([]*TransactionState, 0, len(p.txPool.Transactions)) - alreadySeen := 0 - for _, st := range p.txPool.Transactions { - if st.ProviderSource == p.name { - continue - } - if _, exist := st.SeenBy[p.name]; exist { - alreadySeen++ - continue - } - expectedTransactions = append(expectedTransactions, st) - } - - if len(expectedTransactions) == 0 { - log.Debug("no expected txs", - "count", len(p.txPool.Transactions), - "provider", p.name, - "alreadySeen", alreadySeen) - return - } - - client, err := clients.Dial(p.name, p.config.URL) - if err != nil { - log.Error("cant dial to provider", - "provider", p.name, - "url", p.config.URL, - "err", err) - } - - log.Debug("checking in-flight tx", - "count", len(p.txPool.Transactions), - "provider", p.name, - "alreadySeen", alreadySeen) - for _, st := range expectedTransactions { - hash := st.Hash.Hex() - - _, isPending, err := client.TransactionByHash(ctx, st.Hash) - if err != nil && !errors.Is(err, ethereum.NotFound) { - log.Error("cant check transaction", - "provider", p.name, - "hash", hash, - "url", p.config.URL, - "err", err) - continue - } - - log.Debug("got transaction", - "provider", p.name, - "hash", hash, - "isPending", isPending) - - // mark transaction as seen by this provider - st.M.Lock() - latency := time.Since(st.SentAt) - if st.FirstSeen.IsZero() { - st.FirstSeen = time.Now() - metrics.RecordFirstSeenLatency(st.ProviderSource, p.name, latency) - log.Info("transaction first seen", - "hash", hash, - "firstSeenLatency", latency, - "providerSource", st.ProviderSource, - "providerSeen", p.name) - } - if _, exist := st.SeenBy[p.name]; !exist { - st.SeenBy[p.name] = time.Now() - metrics.RecordProviderToProviderLatency(st.ProviderSource, p.name, latency) - } - st.M.Unlock() - - // check if transaction have been seen by all providers - p.txPool.M.Lock() - if len(st.SeenBy) == p.txPool.Expected { - log.Debug("transaction seen by all", - "hash", hash, - "expected", p.txPool.Expected, - "seenBy", len(st.SeenBy)) - delete(p.txPool.Transactions, st.Hash.Hex()) - } - p.txPool.M.Unlock() - } -} diff --git a/op-ufm/pkg/provider/provider.go b/op-ufm/pkg/provider/provider.go deleted file mode 100644 index 31626e39c4c6..000000000000 --- a/op-ufm/pkg/provider/provider.go +++ /dev/null @@ -1,72 +0,0 @@ -package provider - -import ( - "context" - "time" - - "github.com/ethereum-optimism/optimism/op-ufm/pkg/config" -) - -type Provider struct { - name string - config *config.ProviderConfig - signerConfig *config.SignerServiceConfig - walletConfig *config.WalletConfig - txPool *NetworkTransactionPool - - cancelFunc context.CancelFunc -} - -func New(name string, cfg *config.ProviderConfig, - signerConfig *config.SignerServiceConfig, - walletConfig *config.WalletConfig, - txPool *NetworkTransactionPool) *Provider { - p := &Provider{ - name: name, - config: cfg, - signerConfig: signerConfig, - walletConfig: walletConfig, - txPool: txPool, - } - return p -} - -func (p *Provider) Start(ctx context.Context) { - providerCtx, cancelFunc := context.WithCancel(ctx) - p.cancelFunc = cancelFunc - - schedule(providerCtx, time.Duration(p.config.ReadInterval), p.Heartbeat) - if !p.config.ReadOnly { - schedule(providerCtx, time.Duration(p.config.SendInterval), p.RoundTrip) - } -} - -func (p *Provider) Shutdown() { - if p.cancelFunc != nil { - p.cancelFunc() - } -} - -func (p *Provider) Name() string { - return p.name -} - -func (p *Provider) URL() string { - return p.config.URL -} - -func schedule(ctx context.Context, interval time.Duration, handler func(ctx context.Context)) { - go func() { - for { - timer := time.NewTimer(interval) - handler(ctx) - - select { - case <-timer.C: - case <-ctx.Done(): - timer.Stop() - return - } - } - }() -} diff --git a/op-ufm/pkg/provider/roundtrip.go b/op-ufm/pkg/provider/roundtrip.go deleted file mode 100644 index 6de763cbcf38..000000000000 --- a/op-ufm/pkg/provider/roundtrip.go +++ /dev/null @@ -1,311 +0,0 @@ -package provider - -import ( - "context" - "math/big" - "time" - - "github.com/ethereum-optimism/optimism/op-ufm/pkg/metrics" - iclients "github.com/ethereum-optimism/optimism/op-ufm/pkg/metrics/clients" - "github.com/ethereum/go-ethereum/core" - - "github.com/ethereum-optimism/optimism/op-service/tls" - "github.com/ethereum/go-ethereum" - "github.com/ethereum/go-ethereum/common" - "github.com/ethereum/go-ethereum/core/txpool" - "github.com/ethereum/go-ethereum/crypto" - "github.com/pkg/errors" - - "github.com/ethereum/go-ethereum/core/types" - "github.com/ethereum/go-ethereum/log" -) - -// RoundTrip send a new transaction to measure round trip latency -func (p *Provider) RoundTrip(ctx context.Context) { - log.Debug("RoundTrip", - "provider", p.name) - - client, err := iclients.Dial(p.name, p.config.URL) - if err != nil { - log.Error("cant dial to provider", - "provider", p.name, - "url", p.config.URL, - "err", err) - return - } - - p.txPool.ExclusiveSend.Lock() - defer p.txPool.ExclusiveSend.Unlock() - - txHash := common.Hash{} - attempt := 0 - nonce := uint64(0) - - // used for timeout - firstAttemptAt := time.Now() - // used for actual round trip time (disregard retry time) - var roundTripStartedAt time.Time - for { - - // sleep until we get a clear to send - for { - coolDown := time.Duration(p.config.SendTransactionCoolDown) - time.Since(p.txPool.LastSend) - if coolDown > 0 { - time.Sleep(coolDown) - } else { - break - } - } - - from, tx, err := p.createTx(ctx, client, nonce) - if err != nil { - log.Error("cant create tx", - "provider", p.name, - "nonce", nonce, - "err", err) - return - } - nonce = tx.Nonce() - - signedTx, err := p.sign(ctx, from, tx) - if err != nil { - log.Error("cant sign tx", - "provider", p.name, - "tx", tx, - "err", err) - return - } - txHash = signedTx.Hash() - - roundTripStartedAt = time.Now() - err = client.SendTransaction(ctx, signedTx) - if err != nil { - if err.Error() == txpool.ErrAlreadyKnown.Error() || - err.Error() == txpool.ErrReplaceUnderpriced.Error() || - err.Error() == core.ErrNonceTooLow.Error() { - - log.Warn("cant send transaction (retryable)", - "provider", p.name, - "err", err, - "nonce", nonce) - - if time.Since(firstAttemptAt) >= time.Duration(p.config.SendTransactionRetryTimeout) { - log.Error("send transaction timed out (known already)", - "provider", p.name, - "hash", txHash.Hex(), - "nonce", nonce, - "elapsed", time.Since(firstAttemptAt), - "attempt", attempt) - metrics.RecordErrorDetails(p.name, "send.timeout", err) - return - } - - log.Warn("tx already known, incrementing nonce and trying again", - "provider", p.name, - "nonce", nonce) - time.Sleep(time.Duration(p.config.SendTransactionRetryInterval)) - - nonce++ - attempt++ - if attempt%10 == 0 { - log.Debug("retrying send transaction...", - "provider", p.name, - "attempt", attempt, - "nonce", nonce, - "elapsed", time.Since(firstAttemptAt)) - } - } else { - log.Error("cant send transaction", - "provider", p.name, - "nonce", nonce, - "err", err) - metrics.RecordErrorDetails(p.name, "ethclient.SendTransaction", err) - return - } - } else { - break - } - } - - log.Info("transaction sent", - "provider", p.name, - "hash", txHash.Hex(), - "nonce", nonce) - - // add to pool - sentAt := time.Now() - p.txPool.M.Lock() - p.txPool.Transactions[txHash.Hex()] = &TransactionState{ - Hash: txHash, - ProviderSource: p.name, - SentAt: sentAt, - SeenBy: make(map[string]time.Time), - } - p.txPool.LastSend = sentAt - p.txPool.M.Unlock() - - var receipt *types.Receipt - attempt = 0 - for receipt == nil { - if time.Since(sentAt) >= time.Duration(p.config.ReceiptRetrievalTimeout) { - log.Error("receipt retrieval timed out", - "provider", p.name, - "hash", txHash, - "nonce", nonce, - "elapsed", time.Since(sentAt)) - metrics.RecordErrorDetails(p.name, "receipt.timeout", err) - return - } - time.Sleep(time.Duration(p.config.ReceiptRetrievalInterval)) - if attempt%10 == 0 { - log.Debug("checking for receipt...", - "provider", p.name, - "hash", txHash, - "nonce", nonce, - "attempt", attempt, - "elapsed", time.Since(sentAt)) - } - receipt, err = client.TransactionReceipt(ctx, txHash) - if err != nil && !errors.Is(err, ethereum.NotFound) { - log.Error("cant get receipt for transaction", - "provider", p.name, - "hash", txHash.Hex(), - "nonce", nonce, - "err", err) - return - } - attempt++ - } - - roundTripLatency := time.Since(roundTripStartedAt) - - metrics.RecordRoundTripLatency(p.name, roundTripLatency) - metrics.RecordGasUsed(p.name, receipt.GasUsed) - - log.Info("got transaction receipt", - "hash", txHash.Hex(), - "nonce", nonce, - "roundTripLatency", roundTripLatency, - "provider", p.name, - "blockNumber", receipt.BlockNumber, - "blockHash", receipt.BlockHash, - "gasUsed", receipt.GasUsed) -} - -func (p *Provider) createTx(ctx context.Context, client *iclients.InstrumentedEthClient, nonce uint64) (*common.Address, *types.Transaction, error) { - var err error - if nonce == 0 { - nonce, err = client.PendingNonceAt(ctx, p.walletConfig.Address) - if err != nil { - log.Error("cant get nonce", - "provider", p.name, - "nonce", nonce, - "err", err) - return nil, nil, err - } - } - - gasTipCap, err := client.SuggestGasTipCap(ctx) - if err != nil { - log.Error("cant get gas tip cap", - "provider", p.name, - "err", err) - return nil, nil, err - } - - // adjust gas tip cap by 110% - const GasTipCapAdjustmentMultiplier = 110 - const GasTipCapAdjustmentDivisor = 100 - gasTipCap = new(big.Int).Mul(gasTipCap, big.NewInt(GasTipCapAdjustmentMultiplier)) - gasTipCap = new(big.Int).Div(gasTipCap, big.NewInt(GasTipCapAdjustmentDivisor)) - - head, err := client.HeaderByNumber(ctx, nil) - if err != nil { - log.Error("cant get base fee from head", - "provider", p.name, - "err", err) - return nil, nil, err - } - baseFee := head.BaseFee - - gasFeeCap := new(big.Int).Add( - gasTipCap, - new(big.Int).Mul(baseFee, big.NewInt(2))) - - addr := common.HexToAddress(p.walletConfig.Address) - var data []byte - dynamicTx := &types.DynamicFeeTx{ - ChainID: &p.walletConfig.ChainID, - Nonce: nonce, - GasFeeCap: gasFeeCap, - GasTipCap: gasTipCap, - To: &addr, - Value: &p.walletConfig.TxValue, - Data: data, - } - - gas, err := client.EstimateGas(ctx, ethereum.CallMsg{ - From: addr, - To: &addr, - GasFeeCap: gasFeeCap, - GasTipCap: gasTipCap, - Data: dynamicTx.Data, - Value: dynamicTx.Value, - }) - if err != nil { - log.Error("cant estimate gas", - "provider", p.name, - "err", err) - return nil, nil, err - } - dynamicTx.Gas = gas - tx := types.NewTx(dynamicTx) - - log.Info("tx created", - "provider", p.name, - "from", addr, - "to", dynamicTx.To, - "nonce", dynamicTx.Nonce, - "value", dynamicTx.Value, - "gas", dynamicTx.Gas, - "gasTipCap", dynamicTx.GasTipCap, - "gasFeeCap", dynamicTx.GasFeeCap, - ) - - return &addr, tx, nil -} - -func (p *Provider) sign(ctx context.Context, from *common.Address, tx *types.Transaction) (*types.Transaction, error) { - if p.walletConfig.SignerMethod == "static" { - log.Debug("using static signer") - privateKey, err := crypto.HexToECDSA(p.walletConfig.PrivateKey) - if err != nil { - log.Error("failed to parse private key", "err", err) - return nil, err - } - return types.SignTx(tx, types.LatestSignerForChainID(&p.walletConfig.ChainID), privateKey) - } else if p.walletConfig.SignerMethod == "signer" { - tlsConfig := tls.CLIConfig{ - TLSCaCert: p.signerConfig.TLSCaCert, - TLSCert: p.signerConfig.TLSCert, - TLSKey: p.signerConfig.TLSKey, - } - client, err := iclients.NewSignerClient(p.name, log.Root(), p.signerConfig.URL, tlsConfig) - if err != nil || client == nil { - log.Error("failed to create signer client", "err", err) - } - - if client == nil { - return nil, errors.New("could not initialize signer client") - } - - signedTx, err := client.SignTransaction(ctx, &p.walletConfig.ChainID, from, tx) - if err != nil { - return nil, err - } - - return signedTx, nil - } else { - return nil, errors.New("invalid signer method") - } -} diff --git a/op-ufm/pkg/provider/tx_pool.go b/op-ufm/pkg/provider/tx_pool.go deleted file mode 100644 index 2ea5f6a2efc3..000000000000 --- a/op-ufm/pkg/provider/tx_pool.go +++ /dev/null @@ -1,40 +0,0 @@ -package provider - -import ( - "sync" - "time" - - "github.com/ethereum/go-ethereum/common" -) - -// TransactionPool is used locally to share transactions between providers under the same pool -type TransactionPool map[string]*NetworkTransactionPool - -// NetworkTransactionPool is used locally to share transactions between providers under the same network -type NetworkTransactionPool struct { - M sync.Mutex - Transactions map[string]*TransactionState - Expected int - - // Last time a transaction was sent - LastSend time.Time - // Prevents concurrent transaction send - ExclusiveSend sync.Mutex -} - -type TransactionState struct { - // Transaction hash - Hash common.Hash - - // Mutex - M sync.Mutex - - SentAt time.Time - ProviderSource string - - FirstSeen time.Time - - // Map of providers that have seen this transaction, and when - // Once all providers have seen the transaction it is removed from the pool - SeenBy map[string]time.Time -} diff --git a/op-ufm/pkg/service/healthz_server.go b/op-ufm/pkg/service/healthz_server.go deleted file mode 100644 index aed24256ddb0..000000000000 --- a/op-ufm/pkg/service/healthz_server.go +++ /dev/null @@ -1,37 +0,0 @@ -package service - -import ( - "context" - "net/http" - - "github.com/gorilla/mux" - "github.com/rs/cors" -) - -type HealthzServer struct { - ctx context.Context - server *http.Server -} - -func (h *HealthzServer) Start(ctx context.Context, addr string) error { - hdlr := mux.NewRouter() - hdlr.HandleFunc("/healthz", h.Handle).Methods("GET") - c := cors.New(cors.Options{ - AllowedOrigins: []string{"*"}, - }) - server := &http.Server{ - Handler: c.Handler(hdlr), - Addr: addr, - } - h.server = server - h.ctx = ctx - return h.server.ListenAndServe() -} - -func (h *HealthzServer) Shutdown() error { - return h.server.Shutdown(h.ctx) -} - -func (h *HealthzServer) Handle(w http.ResponseWriter, r *http.Request) { - w.Write([]byte("OK")) -} diff --git a/op-ufm/pkg/service/metrics_server.go b/op-ufm/pkg/service/metrics_server.go deleted file mode 100644 index 4371d4873744..000000000000 --- a/op-ufm/pkg/service/metrics_server.go +++ /dev/null @@ -1,27 +0,0 @@ -package service - -import ( - "context" - "net/http" - - "github.com/prometheus/client_golang/prometheus/promhttp" -) - -type MetricsServer struct { - ctx context.Context - server *http.Server -} - -func (m *MetricsServer) Start(ctx context.Context, addr string) error { - server := &http.Server{ - Handler: promhttp.Handler(), - Addr: addr, - } - m.server = server - m.ctx = ctx - return m.server.ListenAndServe() -} - -func (m *MetricsServer) Shutdown() error { - return m.server.Shutdown(m.ctx) -} diff --git a/op-ufm/pkg/service/service.go b/op-ufm/pkg/service/service.go deleted file mode 100644 index 6580de8d8f23..000000000000 --- a/op-ufm/pkg/service/service.go +++ /dev/null @@ -1,107 +0,0 @@ -package service - -import ( - "context" - "net" - - "github.com/ethereum-optimism/optimism/op-ufm/pkg/config" - "github.com/ethereum-optimism/optimism/op-ufm/pkg/metrics" - "github.com/ethereum-optimism/optimism/op-ufm/pkg/provider" - - "github.com/ethereum/go-ethereum/log" -) - -type Service struct { - Config *config.Config - Healthz *HealthzServer - Metrics *MetricsServer - Providers map[string]*provider.Provider -} - -func New(cfg *config.Config) *Service { - s := &Service{ - Config: cfg, - Healthz: &HealthzServer{}, - Metrics: &MetricsServer{}, - Providers: make(map[string]*provider.Provider, len(cfg.Providers)), - } - return s -} - -func (s *Service) Start(ctx context.Context) { - log.Info("service starting") - if s.Config.Healthz.Enabled { - addr := net.JoinHostPort(s.Config.Healthz.Host, s.Config.Healthz.Port) - log.Info("starting healthz server", - "addr", addr) - go func() { - if err := s.Healthz.Start(ctx, addr); err != nil { - log.Error("error starting healthz server", - "err", err) - } - }() - } - - metrics.Debug = s.Config.Metrics.Debug - if s.Config.Metrics.Enabled { - addr := net.JoinHostPort(s.Config.Metrics.Host, s.Config.Metrics.Port) - log.Info("starting metrics server", - "addr", addr) - go func() { - if err := s.Metrics.Start(ctx, addr); err != nil { - log.Error("error starting metrics server", - "err", err) - } - }() - } - - // map networks to its providers - networks := make(map[string][]string) - for name, providerConfig := range s.Config.Providers { - networks[providerConfig.Network] = append(networks[providerConfig.Network], name) - } - - txpool := &provider.TransactionPool{} - for name, providers := range networks { - if len(providers) == 1 { - log.Warn("can't measure first seen for network, please another provider", - "network", name) - } - (*txpool)[name] = &provider.NetworkTransactionPool{} - (*txpool)[name].Transactions = make(map[string]*provider.TransactionState) - // set expected number of providers for this network - // -1 since we don't wait for acking from the same provider - (*txpool)[name].Expected = len(providers) - 1 - } - - for name, providerConfig := range s.Config.Providers { - s.Providers[name] = provider.New(name, - providerConfig, - &s.Config.Signer, - s.Config.Wallets[providerConfig.Wallet], - (*txpool)[providerConfig.Network]) - s.Providers[name].Start(ctx) - log.Info("provider started", - "provider", name) - } - - log.Info("service started") -} - -func (s *Service) Shutdown() { - log.Info("service shutting down") - if s.Config.Healthz.Enabled { - s.Healthz.Shutdown() - log.Info("healthz stopped") - } - if s.Config.Metrics.Enabled { - s.Metrics.Shutdown() - log.Info("metrics stopped") - } - for name, provider := range s.Providers { - provider.Shutdown() - log.Info("provider stopped", - "provider", name) - } - log.Info("service stopped") -} diff --git a/op-ufm/tools/kmstool/main.go b/op-ufm/tools/kmstool/main.go deleted file mode 100644 index 425e76147365..000000000000 --- a/op-ufm/tools/kmstool/main.go +++ /dev/null @@ -1,72 +0,0 @@ -package main - -import ( - "context" - "crypto/x509/pkix" - "encoding/asn1" - "encoding/pem" - "fmt" - "os" - - kms "cloud.google.com/go/kms/apiv1" - "cloud.google.com/go/kms/apiv1/kmspb" - "github.com/ethereum/go-ethereum/common" - "github.com/ethereum/go-ethereum/crypto" -) - -func main() { - println("kmstool - usage: kmstool ") - - if len(os.Args) < 2 { - panic("missing ") - } - - keyName := os.Args[1] - - ctx := context.Background() - client, err := kms.NewKeyManagementClient(ctx) - if err != nil { - panic(fmt.Errorf("failed to create kms client: %w", err)) - } - defer client.Close() - - addr, err := resolveAddr(ctx, client, keyName) - if err != nil { - panic(fmt.Errorf("failed to retrieve the key: %w", err)) - } - fmt.Printf("ethereum addr: %s", addr) - println() - println() -} - -func resolveAddr(ctx context.Context, client *kms.KeyManagementClient, keyName string) (common.Address, error) { - resp, err := client.GetPublicKey(ctx, &kmspb.GetPublicKeyRequest{Name: keyName}) - if err != nil { - return common.Address{}, fmt.Errorf("google kms public key %q lookup: %w", keyName, err) - } - keyPem := resp.Pem - - block, _ := pem.Decode([]byte(keyPem)) - if block == nil { - return common.Address{}, fmt.Errorf("google kms public key %q pem empty: %.130q", keyName, keyPem) - } - - var info struct { - AlgID pkix.AlgorithmIdentifier - Key asn1.BitString - } - _, err = asn1.Unmarshal(block.Bytes, &info) - if err != nil { - return common.Address{}, fmt.Errorf("google kms public key %q pem block %q: %v", keyName, block.Type, err) - } - - return pubKeyAddr(info.Key.Bytes), nil -} - -// PubKeyAddr returns the Ethereum address for the (uncompressed) key bytes. -func pubKeyAddr(bytes []byte) common.Address { - digest := crypto.Keccak256(bytes[1:]) - var addr common.Address - copy(addr[:], digest[12:]) - return addr -} diff --git a/op-wheel/cheat/cheat.go b/op-wheel/cheat/cheat.go index 61c8d74d09f3..26138dfc2875 100644 --- a/op-wheel/cheat/cheat.go +++ b/op-wheel/cheat/cheat.go @@ -10,6 +10,7 @@ import ( "path/filepath" "strings" + "github.com/ethereum/go-ethereum/core/tracing" "github.com/holiman/uint256" "github.com/ethereum/go-ethereum/common" @@ -337,7 +338,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, uint256.MustFromBig(amount)) + headState.SetBalance(addr, uint256.MustFromBig(amount), tracing.BalanceChangeUnspecified) return nil } } diff --git a/op-wheel/cmd/main.go b/op-wheel/cmd/main.go index 03d29c72c055..9da15270eda9 100644 --- a/op-wheel/cmd/main.go +++ b/op-wheel/cmd/main.go @@ -31,9 +31,9 @@ func main() { oplog.SetGlobalLogHandler(log.NewTerminalHandlerWithLevel(os.Stdout, lvl, true)) return nil } - app.Action = cli.ActionFunc(func(c *cli.Context) error { + app.Action = func(c *cli.Context) error { return errors.New("see 'cheat' and 'engine' subcommands and --help") - }) + } app.Writer = os.Stdout app.ErrWriter = os.Stderr app.Commands = []*cli.Command{ diff --git a/op-wheel/commands.go b/op-wheel/commands.go index 908e62275879..521578a34cb6 100644 --- a/op-wheel/commands.go +++ b/op-wheel/commands.go @@ -4,6 +4,7 @@ import ( "context" "encoding" "encoding/json" + "errors" "fmt" "io" "math/big" @@ -59,12 +60,16 @@ var ( Value: "http://localhost:8551/", EnvVars: prefixEnvVars("ENGINE"), } + EngineJWT = &cli.StringFlag{ + Name: "engine.jwt-secret", + Usage: "JWT secret used to authenticate Engine API communication with. Takes precedence over engine.jwt-secret-path.", + EnvVars: prefixEnvVars("ENGINE_JWT_SECRET"), + } EngineJWTPath = &cli.StringFlag{ - Name: "engine.jwt-secret", + Name: "engine.jwt-secret-path", Usage: "Path to JWT secret file used to authenticate Engine API communication with.", - Required: true, TakesFile: true, - EnvVars: prefixEnvVars("ENGINE_JWT_SECRET"), + EnvVars: prefixEnvVars("ENGINE_JWT_SECRET_PATH"), } EngineOpenEndpoint = &cli.StringFlag{ Name: "engine.open", @@ -116,7 +121,7 @@ var ( func withEngineFlags(flags ...cli.Flag) []cli.Flag { return append(append(flags, - EngineEndpoint, EngineJWTPath, EngineOpenEndpoint, EngineVersion), + EngineEndpoint, EngineJWT, EngineJWTPath, EngineOpenEndpoint, EngineVersion), oplog.CLIFlags(envVarPrefix)...) } @@ -177,16 +182,37 @@ func initLogger(ctx *cli.Context) log.Logger { } func initEngineRPC(ctx *cli.Context, lgr log.Logger) (client.RPC, error) { - jwtData, err := os.ReadFile(ctx.String(EngineJWTPath.Name)) + jwtString := ctx.String(EngineJWT.Name) // no IsSet check; allow empty value to be overridden + if jwtString == "" { + if ctx.IsSet(EngineJWTPath.Name) { + jwtData, err := os.ReadFile(ctx.String(EngineJWTPath.Name)) + if err != nil { + return nil, fmt.Errorf("failed to read jwt: %w", err) + } + jwtString = string(jwtData) + } else { + return nil, errors.New("neither JWT secret string nor path provided") + } + } + secret, err := parseJWTSecret(jwtString) if err != nil { - return nil, fmt.Errorf("failed to read jwt: %w", err) + return nil, err } - secret := common.HexToHash(strings.TrimSpace(string(jwtData))) endpoint := ctx.String(EngineEndpoint.Name) return client.NewRPC(ctx.Context, lgr, endpoint, client.WithGethRPCOptions(rpc.WithHTTPAuth(node.NewJWTAuth(secret)))) } +func parseJWTSecret(v string) (common.Hash, error) { + v = strings.TrimSpace(v) + v = "0x" + strings.TrimPrefix(v, "0x") // ensure prefix is there + var out common.Hash + if err := out.UnmarshalText([]byte(v)); err != nil { + return common.Hash{}, fmt.Errorf("failed to parse JWT secret: %w", err) + } + return out, nil +} + func initVersionProvider(ctx *cli.Context, lgr log.Logger) (sources.EngineVersionProvider, error) { // static configuration takes precedent, if set if ctx.IsSet(EngineVersion.Name) { @@ -229,6 +255,7 @@ func rollupFromGethConfig(cfg *params.ChainConfig) *rollup.Config { RegolithTime: cfg.RegolithTime, CanyonTime: cfg.CanyonTime, EcotoneTime: cfg.EcotoneTime, + GraniteTime: cfg.GraniteTime, InteropTime: cfg.InteropTime, } } @@ -477,7 +504,7 @@ var ( metricsCfg := opmetrics.ReadCLIConfig(ctx) - return opservice.CloseAction(func(ctx context.Context, shutdown <-chan struct{}) error { + return opservice.CloseAction(ctx.Context, func(ctx context.Context) error { registry := opmetrics.NewRegistry() metrics := engine.NewMetrics("wheel", registry) if metricsCfg.Enabled { @@ -492,7 +519,7 @@ var ( } }() } - return engine.Auto(ctx, metrics, client, l, shutdown, settings) + return engine.Auto(ctx, metrics, client, l, settings) }) }), } diff --git a/op-wheel/engine/engine.go b/op-wheel/engine/engine.go index f76fc753ac4b..8a00e212b3ca 100644 --- a/op-wheel/engine/engine.go +++ b/op-wheel/engine/engine.go @@ -44,7 +44,7 @@ func getBlock(ctx context.Context, client client.RPC, method string, tag string) if err != nil { return nil, err } - return types.NewBlockWithHeader(&bl.Header).WithBody(bl.Transactions, nil), nil + return types.NewBlockWithHeader(&bl.Header).WithBody(types.Body{Transactions: bl.Transactions}), nil } func getHeader(ctx context.Context, client client.RPC, method string, tag string) (*types.Header, error) { @@ -189,7 +189,13 @@ func newPayloadAttributes(evp sources.EngineVersionProvider, timestamp uint64, p return pa } -func Auto(ctx context.Context, metrics Metricer, client *sources.EngineAPIClient, log log.Logger, shutdown <-chan struct{}, settings *BlockBuildingSettings) error { +func Auto( + ctx context.Context, + metrics Metricer, + client *sources.EngineAPIClient, + log log.Logger, + settings *BlockBuildingSettings, +) error { ticker := time.NewTicker(time.Millisecond * 100) defer ticker.Stop() @@ -197,9 +203,6 @@ func Auto(ctx context.Context, metrics Metricer, client *sources.EngineAPIClient var buildErr error for { select { - case <-shutdown: - log.Info("shutting down") - return nil case <-ctx.Done(): log.Info("context closed", "err", ctx.Err()) return ctx.Err() @@ -405,10 +408,10 @@ func Rewind(ctx context.Context, lgr log.Logger, client *sources.EngineAPIClient // when rewinding, don't increase unsafe/finalized tags toSafe, toFinalized := toUnsafe, toUnsafe - if safe.Number.Uint64() < to { + if safe != nil && safe.Number.Uint64() < to { toSafe = eth.HeaderBlockID(safe) } - if finalized.Number.Uint64() < to { + if finalized != nil && finalized.Number.Uint64() < to { toFinalized = eth.HeaderBlockID(finalized) } diff --git a/ops-bedrock/Dockerfile.l1 b/ops-bedrock/Dockerfile.l1 deleted file mode 100644 index d3226b8db24e..000000000000 --- a/ops-bedrock/Dockerfile.l1 +++ /dev/null @@ -1,9 +0,0 @@ -FROM ethereum/client-go:v1.13.15 - -RUN apk add --no-cache jq bash - -COPY entrypoint-l1.sh /entrypoint.sh - -VOLUME ["/db"] - -ENTRYPOINT ["/bin/bash", "/entrypoint.sh"] diff --git a/ops-bedrock/Dockerfile.l2 b/ops-bedrock/Dockerfile.l2 deleted file mode 100644 index 976ab2749859..000000000000 --- a/ops-bedrock/Dockerfile.l2 +++ /dev/null @@ -1,9 +0,0 @@ -FROM us-docker.pkg.dev/oplabs-tools-artifacts/images/op-geth:optimism - -RUN apk add --no-cache jq - -COPY entrypoint-l2.sh /entrypoint.sh - -VOLUME ["/db"] - -ENTRYPOINT ["/bin/sh", "/entrypoint.sh"] diff --git a/ops-bedrock/beacon-data/Makefile b/ops-bedrock/beacon-data/Makefile new file mode 100644 index 000000000000..abdb7193763b --- /dev/null +++ b/ops-bedrock/beacon-data/Makefile @@ -0,0 +1,7 @@ + +data: + eth2-val-tools keystores --source-min=0 --source-max=64 \ + --source-mnemonic="test test test test test test test test test test test junk" --out-loc=data && \ + rm -rf data/lodestar-secrets data/nimbus-keys data/prysm data/teku-keys data/teku-secrets + + diff --git a/ops-bedrock/beacon-data/config.yaml b/ops-bedrock/beacon-data/config.yaml new file mode 100644 index 000000000000..0358aef31768 --- /dev/null +++ b/ops-bedrock/beacon-data/config.yaml @@ -0,0 +1,152 @@ +# Minimal config + +# Extends the minimal preset +PRESET_BASE: 'minimal' + +# Free-form short name of the network that this configuration applies to - known +# canonical network names include: +# * 'mainnet' - there can be only one +# * 'prater' - testnet +# Must match the regex: [a-z0-9\-] +CONFIG_NAME: 'minimal' + +# Transition +# --------------------------------------------------------------- +# 2**256-2**10 for testing minimal network +TERMINAL_TOTAL_DIFFICULTY: 115792089237316195423570985008687907853269984665640564039457584007913129638912 +# By default, don't use these params +TERMINAL_BLOCK_HASH: 0x0000000000000000000000000000000000000000000000000000000000000000 +TERMINAL_BLOCK_HASH_ACTIVATION_EPOCH: 18446744073709551615 + + + +# Genesis +# --------------------------------------------------------------- +# [customized] +MIN_GENESIS_ACTIVE_VALIDATOR_COUNT: 64 +# Jan 3, 2020 +MIN_GENESIS_TIME: 1578009600 +# Highest byte set to 0xFF, this is dev network +GENESIS_FORK_VERSION: 0x000000FF +# [customized] don't wait with genesis if we don't have to +GENESIS_DELAY: 0 + + +# Forking +# --------------------------------------------------------------- +# Values provided for illustrative purposes. +# Individual tests/testnets may set different values. + +# Altair +ALTAIR_FORK_VERSION: 0x01000001 +ALTAIR_FORK_EPOCH: 0 +# Bellatrix +BELLATRIX_FORK_VERSION: 0x02000001 +BELLATRIX_FORK_EPOCH: 0 +# Capella +CAPELLA_FORK_VERSION: 0x03000001 +CAPELLA_FORK_EPOCH: 0 +# DENEB +DENEB_FORK_VERSION: 0x04000001 +DENEB_FORK_EPOCH: 0 + +# EIP6110 +EIP6110_FORK_VERSION: 0x05000001 +EIP6110_FORK_EPOCH: 18446744073709551615 +# EIP7002 +EIP7002_FORK_VERSION: 0x05000001 +EIP7002_FORK_EPOCH: 18446744073709551615 +# WHISK +WHISK_FORK_VERSION: 0x06000001 +WHISK_FORK_EPOCH: 18446744073709551615 + + +# Time parameters +# --------------------------------------------------------------- +# [customized] Faster for testing purposes +SECONDS_PER_SLOT: 6 +# 14 (estimate from Eth1 mainnet) +SECONDS_PER_ETH1_BLOCK: 14 +# 2**8 (= 256) epochs +MIN_VALIDATOR_WITHDRAWABILITY_DELAY: 256 +# [customized] higher frequency of committee turnover and faster time to acceptable voluntary exit +SHARD_COMMITTEE_PERIOD: 64 +# [customized] process deposits more quickly, but insecure +ETH1_FOLLOW_DISTANCE: 16 + + +# Validator cycle +# --------------------------------------------------------------- +# 2**2 (= 4) +INACTIVITY_SCORE_BIAS: 4 +# 2**4 (= 16) +INACTIVITY_SCORE_RECOVERY_RATE: 16 +# 2**4 * 10**9 (= 16,000,000,000) Gwei +EJECTION_BALANCE: 16000000000 +# [customized] more easily demonstrate the difference between this value and the activation churn limit +MIN_PER_EPOCH_CHURN_LIMIT: 2 +# [customized] scale queue churn at much lower validator counts for testing +CHURN_LIMIT_QUOTIENT: 32 +# [New in Deneb:EIP7514] [customized] +MAX_PER_EPOCH_ACTIVATION_CHURN_LIMIT: 4 + + +# Fork choice +# --------------------------------------------------------------- +# 40% +PROPOSER_SCORE_BOOST: 40 +# 20% +REORG_HEAD_WEIGHT_THRESHOLD: 20 +# 160% +REORG_PARENT_WEIGHT_THRESHOLD: 160 +# `2` epochs +REORG_MAX_EPOCHS_SINCE_FINALIZATION: 2 + + +# Deposit contract +# --------------------------------------------------------------- +# Local Optimism monorepo devnet +DEPOSIT_CHAIN_ID: 900 +DEPOSIT_NETWORK_ID: 900 +# Configured on a per testnet basis +DEPOSIT_CONTRACT_ADDRESS: 0x1111111111111111111111111111111111111111 + + +# Networking +# --------------------------------------------------------------- +# `10 * 2**20` (= 10485760, 10 MiB) +GOSSIP_MAX_SIZE: 10485760 +# `2**10` (= 1024) +MAX_REQUEST_BLOCKS: 1024 +# `2**8` (= 256) +EPOCHS_PER_SUBNET_SUBSCRIPTION: 256 +# [customized] `MIN_VALIDATOR_WITHDRAWABILITY_DELAY + CHURN_LIMIT_QUOTIENT // 2` (= 272) +MIN_EPOCHS_FOR_BLOCK_REQUESTS: 272 +# `10 * 2**20` (=10485760, 10 MiB) +MAX_CHUNK_SIZE: 10485760 +# 5s +TTFB_TIMEOUT: 5 +# 10s +RESP_TIMEOUT: 10 +ATTESTATION_PROPAGATION_SLOT_RANGE: 32 +# 500ms +MAXIMUM_GOSSIP_CLOCK_DISPARITY: 500 +MESSAGE_DOMAIN_INVALID_SNAPPY: 0x00000000 +MESSAGE_DOMAIN_VALID_SNAPPY: 0x01000000 +# 2 subnets per node +SUBNETS_PER_NODE: 2 +# 2**8 (= 64) +ATTESTATION_SUBNET_COUNT: 64 +ATTESTATION_SUBNET_EXTRA_BITS: 0 +# ceillog2(ATTESTATION_SUBNET_COUNT) + ATTESTATION_SUBNET_EXTRA_BITS +ATTESTATION_SUBNET_PREFIX_BITS: 6 + +# Deneb +# `2**7` (=128) +MAX_REQUEST_BLOCKS_DENEB: 128 +# MAX_REQUEST_BLOCKS_DENEB * MAX_BLOBS_PER_BLOCK +MAX_REQUEST_BLOB_SIDECARS: 768 +# `2**12` (= 4096 epochs, ~18 days) +MIN_EPOCHS_FOR_BLOB_SIDECARS_REQUESTS: 4096 +# `6` +BLOB_SIDECAR_SUBNET_COUNT: 6 diff --git a/ops-bedrock/beacon-data/data/keys/0x82626f97b0fc009c2d2e098e2c3b21922c6525d314552674899953fbb1c4cb48d01966e80167f81b1a36e78e2a6362a9/voting-keystore.json b/ops-bedrock/beacon-data/data/keys/0x82626f97b0fc009c2d2e098e2c3b21922c6525d314552674899953fbb1c4cb48d01966e80167f81b1a36e78e2a6362a9/voting-keystore.json new file mode 100644 index 000000000000..4ca44a569cb3 --- /dev/null +++ b/ops-bedrock/beacon-data/data/keys/0x82626f97b0fc009c2d2e098e2c3b21922c6525d314552674899953fbb1c4cb48d01966e80167f81b1a36e78e2a6362a9/voting-keystore.json @@ -0,0 +1 @@ +{"crypto":{"kdf":{"function":"pbkdf2","params":{"dklen":32,"c":262144,"prf":"hmac-sha256","salt":"4fe22290246afebf4d2b064581ba0cec5853b0e8a1de24b5262e0c82fc265f8e"},"message":""},"checksum":{"function":"sha256","params":{},"message":"3449e5f82bd7470632dbc5d672c09dbe07b0d56e3afda32583c3a57000aebde4"},"cipher":{"function":"aes-128-ctr","params":{"iv":"fa773de4e25f34a4ffa61fcde5bbaa3b"},"message":"2422da8705b02af0124aebcbbc0ef713f051a96f3b0865ea830dd9817e0ff88d"}},"description":"0x82626f97b0fc009c2d2e098e2c3b21922c6525d314552674899953fbb1c4cb48d01966e80167f81b1a36e78e2a6362a9","pubkey":"82626f97b0fc009c2d2e098e2c3b21922c6525d314552674899953fbb1c4cb48d01966e80167f81b1a36e78e2a6362a9","path":"","uuid":"2ddc2811-ec6e-4214-8234-5570e66e063c","version":4} \ No newline at end of file diff --git a/ops-bedrock/beacon-data/data/keys/0x847cddf22fe1483b2808f08bb98586deba65165fab87d7c60f8081af495c3d9ba234ce61150840ac28d8833f721b08d4/voting-keystore.json b/ops-bedrock/beacon-data/data/keys/0x847cddf22fe1483b2808f08bb98586deba65165fab87d7c60f8081af495c3d9ba234ce61150840ac28d8833f721b08d4/voting-keystore.json new file mode 100644 index 000000000000..3001b1bb0f50 --- /dev/null +++ b/ops-bedrock/beacon-data/data/keys/0x847cddf22fe1483b2808f08bb98586deba65165fab87d7c60f8081af495c3d9ba234ce61150840ac28d8833f721b08d4/voting-keystore.json @@ -0,0 +1 @@ +{"crypto":{"kdf":{"function":"pbkdf2","params":{"dklen":32,"c":262144,"prf":"hmac-sha256","salt":"06180aad1e6bdce9976df02d9adde20075ec7f1dd0dfe5548931bcc7d20d521d"},"message":""},"checksum":{"function":"sha256","params":{},"message":"1325dcbf0ccf26036061b1023ea16e2a1dce44097cfc2d298b6f5494ffb9183f"},"cipher":{"function":"aes-128-ctr","params":{"iv":"be4f24aa47c00d28d80bbec4a8c10929"},"message":"d0fd7c50df094cbe66d3d4e79f3aa495c184a872846ca3cc1784d4a261de0a5a"}},"description":"0x847cddf22fe1483b2808f08bb98586deba65165fab87d7c60f8081af495c3d9ba234ce61150840ac28d8833f721b08d4","pubkey":"847cddf22fe1483b2808f08bb98586deba65165fab87d7c60f8081af495c3d9ba234ce61150840ac28d8833f721b08d4","path":"","uuid":"1ae91dc4-8908-47f3-bd86-ceb28a69b707","version":4} \ No newline at end of file diff --git a/ops-bedrock/beacon-data/data/keys/0x85242431f0f8a0e939f2e469d6d35473e72a9577bf81a5ae16b345cddf1c50eecc5c7520b9580d9717c166a9835664fd/voting-keystore.json b/ops-bedrock/beacon-data/data/keys/0x85242431f0f8a0e939f2e469d6d35473e72a9577bf81a5ae16b345cddf1c50eecc5c7520b9580d9717c166a9835664fd/voting-keystore.json new file mode 100644 index 000000000000..e0129948857e --- /dev/null +++ b/ops-bedrock/beacon-data/data/keys/0x85242431f0f8a0e939f2e469d6d35473e72a9577bf81a5ae16b345cddf1c50eecc5c7520b9580d9717c166a9835664fd/voting-keystore.json @@ -0,0 +1 @@ +{"crypto":{"kdf":{"function":"pbkdf2","params":{"dklen":32,"c":262144,"prf":"hmac-sha256","salt":"77011468ee55740bd05331195df734a376a29ba77211c8ba8dbf724909eb8a5a"},"message":""},"checksum":{"function":"sha256","params":{},"message":"27f2109b206b5125be011346f5ebb3e616a0be3e44e425a6a6caf34238f31138"},"cipher":{"function":"aes-128-ctr","params":{"iv":"2b695bf8e39b9537dd8033e3b63e4c83"},"message":"00f4282db1b0df65ed295da45007f98a99c969eb7c38574ecf6b271976091b56"}},"description":"0x85242431f0f8a0e939f2e469d6d35473e72a9577bf81a5ae16b345cddf1c50eecc5c7520b9580d9717c166a9835664fd","pubkey":"85242431f0f8a0e939f2e469d6d35473e72a9577bf81a5ae16b345cddf1c50eecc5c7520b9580d9717c166a9835664fd","path":"","uuid":"050c1327-b008-47d3-9b37-42eacbfc5b9c","version":4} \ No newline at end of file diff --git a/ops-bedrock/beacon-data/data/keys/0x858b74656127a05134b7614d5fba180e97739c99cf60a42498f1e9c7eda0a88a5fce2d8bc8df5010a5260f96db1b132b/voting-keystore.json b/ops-bedrock/beacon-data/data/keys/0x858b74656127a05134b7614d5fba180e97739c99cf60a42498f1e9c7eda0a88a5fce2d8bc8df5010a5260f96db1b132b/voting-keystore.json new file mode 100644 index 000000000000..c00c4814814f --- /dev/null +++ b/ops-bedrock/beacon-data/data/keys/0x858b74656127a05134b7614d5fba180e97739c99cf60a42498f1e9c7eda0a88a5fce2d8bc8df5010a5260f96db1b132b/voting-keystore.json @@ -0,0 +1 @@ +{"crypto":{"kdf":{"function":"pbkdf2","params":{"dklen":32,"c":262144,"prf":"hmac-sha256","salt":"54cedb59cb00dcfc39c9f5ac8b638b5dff308d05d1438e68ab08792dd772ec9b"},"message":""},"checksum":{"function":"sha256","params":{},"message":"ad761cb2c3be4af0b18eef64d92475e6bf1284c075655ccb4b88c55586b4f4f8"},"cipher":{"function":"aes-128-ctr","params":{"iv":"f1e1203891e238645723187c9aab77ac"},"message":"eed5dcee59a3bc823994e623080e732a6f157721a7e90bd477d3d07953b31f16"}},"description":"0x858b74656127a05134b7614d5fba180e97739c99cf60a42498f1e9c7eda0a88a5fce2d8bc8df5010a5260f96db1b132b","pubkey":"858b74656127a05134b7614d5fba180e97739c99cf60a42498f1e9c7eda0a88a5fce2d8bc8df5010a5260f96db1b132b","path":"","uuid":"dbca8e9d-38e8-4d19-8474-55d3d07fec91","version":4} \ No newline at end of file diff --git a/ops-bedrock/beacon-data/data/keys/0x85bc68a8c76d4f706648059fa2d3b387c86ee65082e5fc16713794c6c0f8277d37c72783abe1c47ad3de97bd33ef66a3/voting-keystore.json b/ops-bedrock/beacon-data/data/keys/0x85bc68a8c76d4f706648059fa2d3b387c86ee65082e5fc16713794c6c0f8277d37c72783abe1c47ad3de97bd33ef66a3/voting-keystore.json new file mode 100644 index 000000000000..842ebc9a120c --- /dev/null +++ b/ops-bedrock/beacon-data/data/keys/0x85bc68a8c76d4f706648059fa2d3b387c86ee65082e5fc16713794c6c0f8277d37c72783abe1c47ad3de97bd33ef66a3/voting-keystore.json @@ -0,0 +1 @@ +{"crypto":{"kdf":{"function":"pbkdf2","params":{"dklen":32,"c":262144,"prf":"hmac-sha256","salt":"7cfc984164311e96c91045c2d49463849002c86cef7986e051a5cb8afbb68fa8"},"message":""},"checksum":{"function":"sha256","params":{},"message":"cbe8a4b3e1f5344c1fa6fec5e850fea89771058a0cd3ebb0b28f7da8f7d4e7a2"},"cipher":{"function":"aes-128-ctr","params":{"iv":"d5b17e18c2bed62b9f194615cf4a3231"},"message":"dd17e6fb77023acb91da9e2b14507965483eebf872fa3f2f36e9e5f70db9c420"}},"description":"0x85bc68a8c76d4f706648059fa2d3b387c86ee65082e5fc16713794c6c0f8277d37c72783abe1c47ad3de97bd33ef66a3","pubkey":"85bc68a8c76d4f706648059fa2d3b387c86ee65082e5fc16713794c6c0f8277d37c72783abe1c47ad3de97bd33ef66a3","path":"","uuid":"c9e6d511-12f7-4224-9605-8fca49050258","version":4} \ No newline at end of file diff --git a/ops-bedrock/beacon-data/data/keys/0x87fa175dd34496aee3b88a482accaa19e271be98265981949c42769cd45b3d67afcc060167b2effc748ff15076b11b27/voting-keystore.json b/ops-bedrock/beacon-data/data/keys/0x87fa175dd34496aee3b88a482accaa19e271be98265981949c42769cd45b3d67afcc060167b2effc748ff15076b11b27/voting-keystore.json new file mode 100644 index 000000000000..1ad6d2af062b --- /dev/null +++ b/ops-bedrock/beacon-data/data/keys/0x87fa175dd34496aee3b88a482accaa19e271be98265981949c42769cd45b3d67afcc060167b2effc748ff15076b11b27/voting-keystore.json @@ -0,0 +1 @@ +{"crypto":{"kdf":{"function":"pbkdf2","params":{"dklen":32,"c":262144,"prf":"hmac-sha256","salt":"e1dfddfc5a0bdbf335e36be27de935ddae37958f41db8d13f030a9562808123d"},"message":""},"checksum":{"function":"sha256","params":{},"message":"cd1f66410107382e06ad4737a9656ba6559e36cd9ecb9a08eed38b11d5d527b7"},"cipher":{"function":"aes-128-ctr","params":{"iv":"08439739e786d101199cb9a91e4bafe4"},"message":"e7024da53ac7c391d822e4c5dc0c6444163500f96dcce3c909a065aeb4ee0cf8"}},"description":"0x87fa175dd34496aee3b88a482accaa19e271be98265981949c42769cd45b3d67afcc060167b2effc748ff15076b11b27","pubkey":"87fa175dd34496aee3b88a482accaa19e271be98265981949c42769cd45b3d67afcc060167b2effc748ff15076b11b27","path":"","uuid":"ce67d829-97ed-4565-bcc9-cdcd0115752c","version":4} \ No newline at end of file diff --git a/ops-bedrock/beacon-data/data/keys/0x88091d52b099523e2717d3a526f8a41a7ff20ca4e4b4d153ebafe6f9265e58f8aa45f1e415d598c758e684bcb376577b/voting-keystore.json b/ops-bedrock/beacon-data/data/keys/0x88091d52b099523e2717d3a526f8a41a7ff20ca4e4b4d153ebafe6f9265e58f8aa45f1e415d598c758e684bcb376577b/voting-keystore.json new file mode 100644 index 000000000000..294a7a40a583 --- /dev/null +++ b/ops-bedrock/beacon-data/data/keys/0x88091d52b099523e2717d3a526f8a41a7ff20ca4e4b4d153ebafe6f9265e58f8aa45f1e415d598c758e684bcb376577b/voting-keystore.json @@ -0,0 +1 @@ +{"crypto":{"kdf":{"function":"pbkdf2","params":{"dklen":32,"c":262144,"prf":"hmac-sha256","salt":"8c8cc5bf2d62552731455bd4fa1d427c83fedaf88f34c52dfef9e39a64099f33"},"message":""},"checksum":{"function":"sha256","params":{},"message":"074dcaa0d4f43211e157dbe3b0d18963be933a526f5ab85d3ec5c1915477e177"},"cipher":{"function":"aes-128-ctr","params":{"iv":"bee61a632899b0ea20288316c5ed1ad3"},"message":"45acc245b165d8de04cc2aac3055d0d04b5520d06b7a1cd640fe36b643256ba0"}},"description":"0x88091d52b099523e2717d3a526f8a41a7ff20ca4e4b4d153ebafe6f9265e58f8aa45f1e415d598c758e684bcb376577b","pubkey":"88091d52b099523e2717d3a526f8a41a7ff20ca4e4b4d153ebafe6f9265e58f8aa45f1e415d598c758e684bcb376577b","path":"","uuid":"2418cbcc-31c1-482f-b8b3-955f5d88687e","version":4} \ No newline at end of file diff --git a/ops-bedrock/beacon-data/data/keys/0x89929f3a811cf44f70d60ccaa4571dff9371c73f60b70b7a50f2cf816861daeb14499b112890a200963d82d324c2ee8f/voting-keystore.json b/ops-bedrock/beacon-data/data/keys/0x89929f3a811cf44f70d60ccaa4571dff9371c73f60b70b7a50f2cf816861daeb14499b112890a200963d82d324c2ee8f/voting-keystore.json new file mode 100644 index 000000000000..ac25a9651f77 --- /dev/null +++ b/ops-bedrock/beacon-data/data/keys/0x89929f3a811cf44f70d60ccaa4571dff9371c73f60b70b7a50f2cf816861daeb14499b112890a200963d82d324c2ee8f/voting-keystore.json @@ -0,0 +1 @@ +{"crypto":{"kdf":{"function":"pbkdf2","params":{"dklen":32,"c":262144,"prf":"hmac-sha256","salt":"0e9802773278a8a4cee4adf630d1a01197890197b8b6456688d6b83a8d296c67"},"message":""},"checksum":{"function":"sha256","params":{},"message":"d4659cb400189cef49de0513438d05a608048c99db179760247ac5f52d84a97a"},"cipher":{"function":"aes-128-ctr","params":{"iv":"8e368f7a2924750081e08dce6c7badaa"},"message":"0affd34ecca31e6ab1365c192f5cc6e99a8ca4530b6f7538f38f8fe6ec253669"}},"description":"0x89929f3a811cf44f70d60ccaa4571dff9371c73f60b70b7a50f2cf816861daeb14499b112890a200963d82d324c2ee8f","pubkey":"89929f3a811cf44f70d60ccaa4571dff9371c73f60b70b7a50f2cf816861daeb14499b112890a200963d82d324c2ee8f","path":"","uuid":"f45c0b95-9237-4182-86b5-5de17935c6ae","version":4} \ No newline at end of file diff --git a/ops-bedrock/beacon-data/data/keys/0x89931c9f649137fe9a6d59a455bcc695af861fa080fef0d598cc2ae66ed193939d12e72cf0a6f081ada36b4090f864cc/voting-keystore.json b/ops-bedrock/beacon-data/data/keys/0x89931c9f649137fe9a6d59a455bcc695af861fa080fef0d598cc2ae66ed193939d12e72cf0a6f081ada36b4090f864cc/voting-keystore.json new file mode 100644 index 000000000000..b11508684350 --- /dev/null +++ b/ops-bedrock/beacon-data/data/keys/0x89931c9f649137fe9a6d59a455bcc695af861fa080fef0d598cc2ae66ed193939d12e72cf0a6f081ada36b4090f864cc/voting-keystore.json @@ -0,0 +1 @@ +{"crypto":{"kdf":{"function":"pbkdf2","params":{"dklen":32,"c":262144,"prf":"hmac-sha256","salt":"2d6605e4a19941cff380f27c7ceee1ee8d7669eab81d7b295f37ec86d6941ab8"},"message":""},"checksum":{"function":"sha256","params":{},"message":"1cad7cbe0931181ed4422ff4ab07d44ebb5b0edf069b7e03dc1eeb1135a13b7a"},"cipher":{"function":"aes-128-ctr","params":{"iv":"50735b3a1543c2ef1957b9dcd1b84542"},"message":"c2cbe92c2949e2f54bc8663e6e220d1dd1855727092efef5f90c8cd1ade19a44"}},"description":"0x89931c9f649137fe9a6d59a455bcc695af861fa080fef0d598cc2ae66ed193939d12e72cf0a6f081ada36b4090f864cc","pubkey":"89931c9f649137fe9a6d59a455bcc695af861fa080fef0d598cc2ae66ed193939d12e72cf0a6f081ada36b4090f864cc","path":"","uuid":"c4eb26fd-6a56-4b34-9df2-3cff9b774ee7","version":4} \ No newline at end of file diff --git a/ops-bedrock/beacon-data/data/keys/0x89d3dbfe89713fa12d2735e2379da4391e22169e967cc93eac815fd4a5e4fd374b0a4e468a44ea6e1f6ca6072a6382c9/voting-keystore.json b/ops-bedrock/beacon-data/data/keys/0x89d3dbfe89713fa12d2735e2379da4391e22169e967cc93eac815fd4a5e4fd374b0a4e468a44ea6e1f6ca6072a6382c9/voting-keystore.json new file mode 100644 index 000000000000..953ae4162b4d --- /dev/null +++ b/ops-bedrock/beacon-data/data/keys/0x89d3dbfe89713fa12d2735e2379da4391e22169e967cc93eac815fd4a5e4fd374b0a4e468a44ea6e1f6ca6072a6382c9/voting-keystore.json @@ -0,0 +1 @@ +{"crypto":{"kdf":{"function":"pbkdf2","params":{"dklen":32,"c":262144,"prf":"hmac-sha256","salt":"72190c032943f3b38c89c40f965e860961c7809596a8b096603c2209ef4f3d86"},"message":""},"checksum":{"function":"sha256","params":{},"message":"b52524babdc2ba22be28f4bbdcbaf291bce03b992309bcc293445dacb6891568"},"cipher":{"function":"aes-128-ctr","params":{"iv":"19d8a4eb788154940787c4db97ceffbc"},"message":"5cf8bbf0f64e72efb0e833684f686aaa3826a707f826bb9703499c1172f8f5f1"}},"description":"0x89d3dbfe89713fa12d2735e2379da4391e22169e967cc93eac815fd4a5e4fd374b0a4e468a44ea6e1f6ca6072a6382c9","pubkey":"89d3dbfe89713fa12d2735e2379da4391e22169e967cc93eac815fd4a5e4fd374b0a4e468a44ea6e1f6ca6072a6382c9","path":"","uuid":"080ba40c-6c06-4166-b2f9-3055b1b62545","version":4} \ No newline at end of file diff --git a/ops-bedrock/beacon-data/data/keys/0x8b49344506042460fc40f4a60d64079e86a29e87cffe29ebd8908fd1803ca21f53c0665145291ea5e34b30a01dca7cb5/voting-keystore.json b/ops-bedrock/beacon-data/data/keys/0x8b49344506042460fc40f4a60d64079e86a29e87cffe29ebd8908fd1803ca21f53c0665145291ea5e34b30a01dca7cb5/voting-keystore.json new file mode 100644 index 000000000000..a9e98d90e6d5 --- /dev/null +++ b/ops-bedrock/beacon-data/data/keys/0x8b49344506042460fc40f4a60d64079e86a29e87cffe29ebd8908fd1803ca21f53c0665145291ea5e34b30a01dca7cb5/voting-keystore.json @@ -0,0 +1 @@ +{"crypto":{"kdf":{"function":"pbkdf2","params":{"dklen":32,"c":262144,"prf":"hmac-sha256","salt":"d9061f57053552a106af1f6b1e2cc680bd9a0f1e541ffe35b1c2bbfbdf19f2ac"},"message":""},"checksum":{"function":"sha256","params":{},"message":"d8644473e84b5901dac27867a860319a7b5fcbda53a8d29fdb62b72eee42d2ea"},"cipher":{"function":"aes-128-ctr","params":{"iv":"174b31bcb04bef8daf767dbe2af9f893"},"message":"1e5ac7573e2c130da11a72629f3ac6d6df2197b7d26b3fc79454a3f6caedad3d"}},"description":"0x8b49344506042460fc40f4a60d64079e86a29e87cffe29ebd8908fd1803ca21f53c0665145291ea5e34b30a01dca7cb5","pubkey":"8b49344506042460fc40f4a60d64079e86a29e87cffe29ebd8908fd1803ca21f53c0665145291ea5e34b30a01dca7cb5","path":"","uuid":"ef623e82-54de-478a-9674-551a85058d7b","version":4} \ No newline at end of file diff --git a/ops-bedrock/beacon-data/data/keys/0x8bf7c9c9972045c582b7363af44e93da26aef3c8fce81a0469d0c5f48199312f73953ce3c3547b91f543b5586a307c38/voting-keystore.json b/ops-bedrock/beacon-data/data/keys/0x8bf7c9c9972045c582b7363af44e93da26aef3c8fce81a0469d0c5f48199312f73953ce3c3547b91f543b5586a307c38/voting-keystore.json new file mode 100644 index 000000000000..c82f0b55e21f --- /dev/null +++ b/ops-bedrock/beacon-data/data/keys/0x8bf7c9c9972045c582b7363af44e93da26aef3c8fce81a0469d0c5f48199312f73953ce3c3547b91f543b5586a307c38/voting-keystore.json @@ -0,0 +1 @@ +{"crypto":{"kdf":{"function":"pbkdf2","params":{"dklen":32,"c":262144,"prf":"hmac-sha256","salt":"629bd00c15b1765ab966ce0e830ea460c154b6af60019d1bb6f43f8ddc2e59d8"},"message":""},"checksum":{"function":"sha256","params":{},"message":"c81efb48cfd3cf0ca9e2b92390aeaedd15bc9c564c91a3e2d9c5c8dcb6acf07e"},"cipher":{"function":"aes-128-ctr","params":{"iv":"4e856dfffbf6ea694561c5131de340a4"},"message":"395a327305309bad52cfbc71872a9a5a75eb05edb96a704103f96781bc3a3ec8"}},"description":"0x8bf7c9c9972045c582b7363af44e93da26aef3c8fce81a0469d0c5f48199312f73953ce3c3547b91f543b5586a307c38","pubkey":"8bf7c9c9972045c582b7363af44e93da26aef3c8fce81a0469d0c5f48199312f73953ce3c3547b91f543b5586a307c38","path":"","uuid":"8b3d5064-f084-4081-8520-c0283a216ff0","version":4} \ No newline at end of file diff --git a/ops-bedrock/beacon-data/data/keys/0x8c3d37929876321cfb221b3dca80feb1c38159ee83e01d1ad60fd16d9d2c78993a41643ec1e7af2d6a0ff8dfb05467ea/voting-keystore.json b/ops-bedrock/beacon-data/data/keys/0x8c3d37929876321cfb221b3dca80feb1c38159ee83e01d1ad60fd16d9d2c78993a41643ec1e7af2d6a0ff8dfb05467ea/voting-keystore.json new file mode 100644 index 000000000000..3e0b1748c340 --- /dev/null +++ b/ops-bedrock/beacon-data/data/keys/0x8c3d37929876321cfb221b3dca80feb1c38159ee83e01d1ad60fd16d9d2c78993a41643ec1e7af2d6a0ff8dfb05467ea/voting-keystore.json @@ -0,0 +1 @@ +{"crypto":{"kdf":{"function":"pbkdf2","params":{"dklen":32,"c":262144,"prf":"hmac-sha256","salt":"a60354a5e403eca8710791416ed9a1309e26751793d1bd47ff6d61ea293ad07a"},"message":""},"checksum":{"function":"sha256","params":{},"message":"de959d0a9c90df6238dfd8266f1323ea4f0ce9ace14c84382b9e4528b4115d0a"},"cipher":{"function":"aes-128-ctr","params":{"iv":"efe15ed40a2ddea66ecd98923f3793c4"},"message":"acac10231732aa1c0ac74d4e30c38f91a32b72667b965c21fe07a57d1929c52c"}},"description":"0x8c3d37929876321cfb221b3dca80feb1c38159ee83e01d1ad60fd16d9d2c78993a41643ec1e7af2d6a0ff8dfb05467ea","pubkey":"8c3d37929876321cfb221b3dca80feb1c38159ee83e01d1ad60fd16d9d2c78993a41643ec1e7af2d6a0ff8dfb05467ea","path":"","uuid":"92fe7abc-484b-483c-a5b6-2ecfedfc9c71","version":4} \ No newline at end of file diff --git a/ops-bedrock/beacon-data/data/keys/0x8ca1bccbe513b4503f8496b8468c42718972718feff4e3d5eec970f3c56ac0e2a8d4d59ad331db9cbea643ea775314bb/voting-keystore.json b/ops-bedrock/beacon-data/data/keys/0x8ca1bccbe513b4503f8496b8468c42718972718feff4e3d5eec970f3c56ac0e2a8d4d59ad331db9cbea643ea775314bb/voting-keystore.json new file mode 100644 index 000000000000..02f2774fe612 --- /dev/null +++ b/ops-bedrock/beacon-data/data/keys/0x8ca1bccbe513b4503f8496b8468c42718972718feff4e3d5eec970f3c56ac0e2a8d4d59ad331db9cbea643ea775314bb/voting-keystore.json @@ -0,0 +1 @@ +{"crypto":{"kdf":{"function":"pbkdf2","params":{"dklen":32,"c":262144,"prf":"hmac-sha256","salt":"673ce24491afd5e9437b17f9085a9d298b3c8ac0c572042aaae99d138a12a57c"},"message":""},"checksum":{"function":"sha256","params":{},"message":"5f4fa65b92c6d9b9318a2a008b5ae79ac9beeb8f63d8c59b952e7641c3e75398"},"cipher":{"function":"aes-128-ctr","params":{"iv":"2ce3ba046a2887cf460a3c93099f23f7"},"message":"49e8548c042626c21708d841b4b06e306ab0a3a87a249c99bd24a3c845ce3339"}},"description":"0x8ca1bccbe513b4503f8496b8468c42718972718feff4e3d5eec970f3c56ac0e2a8d4d59ad331db9cbea643ea775314bb","pubkey":"8ca1bccbe513b4503f8496b8468c42718972718feff4e3d5eec970f3c56ac0e2a8d4d59ad331db9cbea643ea775314bb","path":"","uuid":"83479ecc-3701-435b-bb6d-f6c49e06af30","version":4} \ No newline at end of file diff --git a/ops-bedrock/beacon-data/data/keys/0x8cf690a81a1eab3d0554acfc7087e0b9ad3dcd50b9612893f56bd1536b6865092f60e7cef0c81e2acf97f287f4d28d1d/voting-keystore.json b/ops-bedrock/beacon-data/data/keys/0x8cf690a81a1eab3d0554acfc7087e0b9ad3dcd50b9612893f56bd1536b6865092f60e7cef0c81e2acf97f287f4d28d1d/voting-keystore.json new file mode 100644 index 000000000000..5f6242f99fb1 --- /dev/null +++ b/ops-bedrock/beacon-data/data/keys/0x8cf690a81a1eab3d0554acfc7087e0b9ad3dcd50b9612893f56bd1536b6865092f60e7cef0c81e2acf97f287f4d28d1d/voting-keystore.json @@ -0,0 +1 @@ +{"crypto":{"kdf":{"function":"pbkdf2","params":{"dklen":32,"c":262144,"prf":"hmac-sha256","salt":"6f3978f97c3695b9a44dcee1a9331b369a3e37d9fa6038984fb38754df90154e"},"message":""},"checksum":{"function":"sha256","params":{},"message":"df5f6c2889fb29578447d24b1e0b0c3f1e0ae2367f9667c878b15a34a5a207a9"},"cipher":{"function":"aes-128-ctr","params":{"iv":"eebd02bcff009d19658ca8aa90cb73b3"},"message":"68a274683a15219a108a5b357fb511bacbda7d5829addcfd6b728c065fc0ca3e"}},"description":"0x8cf690a81a1eab3d0554acfc7087e0b9ad3dcd50b9612893f56bd1536b6865092f60e7cef0c81e2acf97f287f4d28d1d","pubkey":"8cf690a81a1eab3d0554acfc7087e0b9ad3dcd50b9612893f56bd1536b6865092f60e7cef0c81e2acf97f287f4d28d1d","path":"","uuid":"11b3e915-d74b-46b8-8729-7e037a7d325c","version":4} \ No newline at end of file diff --git a/ops-bedrock/beacon-data/data/keys/0x8dc5f6f45cc02e68b008e6035492c3c10835e9247899a5bccc559aa3158e581a71803401124d9fd4797476f33351b0d1/voting-keystore.json b/ops-bedrock/beacon-data/data/keys/0x8dc5f6f45cc02e68b008e6035492c3c10835e9247899a5bccc559aa3158e581a71803401124d9fd4797476f33351b0d1/voting-keystore.json new file mode 100644 index 000000000000..18ed841f0af1 --- /dev/null +++ b/ops-bedrock/beacon-data/data/keys/0x8dc5f6f45cc02e68b008e6035492c3c10835e9247899a5bccc559aa3158e581a71803401124d9fd4797476f33351b0d1/voting-keystore.json @@ -0,0 +1 @@ +{"crypto":{"kdf":{"function":"pbkdf2","params":{"dklen":32,"c":262144,"prf":"hmac-sha256","salt":"8ebedbef03a42b58d37ffc617c8bfdaa2ca5592b6e7a602f045cb35e2aa19457"},"message":""},"checksum":{"function":"sha256","params":{},"message":"1b89ea54dcd5dad917966c804a17fe9bc2bd4888fc6add9970872f6cb6fc5aea"},"cipher":{"function":"aes-128-ctr","params":{"iv":"537553ce87ba63a407f3913bffd9eeb7"},"message":"ce1ac2342a9cfdfa825ea0c0f376768b85f1f4d14fbcdba37ca2e7564739585e"}},"description":"0x8dc5f6f45cc02e68b008e6035492c3c10835e9247899a5bccc559aa3158e581a71803401124d9fd4797476f33351b0d1","pubkey":"8dc5f6f45cc02e68b008e6035492c3c10835e9247899a5bccc559aa3158e581a71803401124d9fd4797476f33351b0d1","path":"","uuid":"3a09f870-5895-46d4-8d8d-87310c620886","version":4} \ No newline at end of file diff --git a/ops-bedrock/beacon-data/data/keys/0x8df81a9e3c61ff1cba9f13c792f1c933131b6d155e8b552d673df44fad4530b68c4e86e9cd2e5cc93a3b806c6b00f4a6/voting-keystore.json b/ops-bedrock/beacon-data/data/keys/0x8df81a9e3c61ff1cba9f13c792f1c933131b6d155e8b552d673df44fad4530b68c4e86e9cd2e5cc93a3b806c6b00f4a6/voting-keystore.json new file mode 100644 index 000000000000..22fda269f191 --- /dev/null +++ b/ops-bedrock/beacon-data/data/keys/0x8df81a9e3c61ff1cba9f13c792f1c933131b6d155e8b552d673df44fad4530b68c4e86e9cd2e5cc93a3b806c6b00f4a6/voting-keystore.json @@ -0,0 +1 @@ +{"crypto":{"kdf":{"function":"pbkdf2","params":{"dklen":32,"c":262144,"prf":"hmac-sha256","salt":"3de45f779f795ff53f6c7718b404c8f94dfcb373380ecf04d65df3d41409f2f3"},"message":""},"checksum":{"function":"sha256","params":{},"message":"3a49323def5f3784bf242e5194aef5a3b78da1104097e85058dc6bc8f976c635"},"cipher":{"function":"aes-128-ctr","params":{"iv":"e9986e1e6ab0f66c8f1bb4993b442433"},"message":"075148d186136e7993c80ee509eb237b3f26383b3c9f058c5af215bbdac30f85"}},"description":"0x8df81a9e3c61ff1cba9f13c792f1c933131b6d155e8b552d673df44fad4530b68c4e86e9cd2e5cc93a3b806c6b00f4a6","pubkey":"8df81a9e3c61ff1cba9f13c792f1c933131b6d155e8b552d673df44fad4530b68c4e86e9cd2e5cc93a3b806c6b00f4a6","path":"","uuid":"22bf2efb-f763-4579-a9f1-63a8d6645b6b","version":4} \ No newline at end of file diff --git a/ops-bedrock/beacon-data/data/keys/0x8efdefbccd6479b9953a5ec6416e6d48201865968567379b213040dbf0be7efa00d66343c21a7e801d6bfd7403cfcfa7/voting-keystore.json b/ops-bedrock/beacon-data/data/keys/0x8efdefbccd6479b9953a5ec6416e6d48201865968567379b213040dbf0be7efa00d66343c21a7e801d6bfd7403cfcfa7/voting-keystore.json new file mode 100644 index 000000000000..b42f0e532460 --- /dev/null +++ b/ops-bedrock/beacon-data/data/keys/0x8efdefbccd6479b9953a5ec6416e6d48201865968567379b213040dbf0be7efa00d66343c21a7e801d6bfd7403cfcfa7/voting-keystore.json @@ -0,0 +1 @@ +{"crypto":{"kdf":{"function":"pbkdf2","params":{"dklen":32,"c":262144,"prf":"hmac-sha256","salt":"aae723ae4b7a14544e6cef9af34e47f403c8e3cda91012f4ae3fe296d9b424ec"},"message":""},"checksum":{"function":"sha256","params":{},"message":"9e02cc77ee983ffff4d9026764d87fe6d2d03d0f9f17b888db733becb5d65ce1"},"cipher":{"function":"aes-128-ctr","params":{"iv":"3dcdb98ce07ae531a919ee0cc3d2eda4"},"message":"915d9e88ad73131bb163eb309902ced191ba9dc8b828f5a9292c84979448f3f2"}},"description":"0x8efdefbccd6479b9953a5ec6416e6d48201865968567379b213040dbf0be7efa00d66343c21a7e801d6bfd7403cfcfa7","pubkey":"8efdefbccd6479b9953a5ec6416e6d48201865968567379b213040dbf0be7efa00d66343c21a7e801d6bfd7403cfcfa7","path":"","uuid":"fd4b5a8a-1b81-4d05-bfe8-d6a80a1ee4a2","version":4} \ No newline at end of file diff --git a/ops-bedrock/beacon-data/data/keys/0x8f1e06e20ac5dd13518bd6c5e19c0a00a9dac968a13167087d9f8199bcb2e93fcb53199f2400ab2f398958761d7c33e6/voting-keystore.json b/ops-bedrock/beacon-data/data/keys/0x8f1e06e20ac5dd13518bd6c5e19c0a00a9dac968a13167087d9f8199bcb2e93fcb53199f2400ab2f398958761d7c33e6/voting-keystore.json new file mode 100644 index 000000000000..0a190c35de12 --- /dev/null +++ b/ops-bedrock/beacon-data/data/keys/0x8f1e06e20ac5dd13518bd6c5e19c0a00a9dac968a13167087d9f8199bcb2e93fcb53199f2400ab2f398958761d7c33e6/voting-keystore.json @@ -0,0 +1 @@ +{"crypto":{"kdf":{"function":"pbkdf2","params":{"dklen":32,"c":262144,"prf":"hmac-sha256","salt":"7ba91e0cff869b1d3a5c64b04151e95cb8abd66a425972da1cf0bf2b8dbb92d5"},"message":""},"checksum":{"function":"sha256","params":{},"message":"d1a78a837a22d4e71e906d84c2b68b395a5c6908ab4a3fd48d5d8a8a700347ee"},"cipher":{"function":"aes-128-ctr","params":{"iv":"a5d85e94a3ddbf2e5b8cc39418756395"},"message":"392ae7850e8e58525b36ce98f0e7b5554a84e825f313d01fdee815a8f853972a"}},"description":"0x8f1e06e20ac5dd13518bd6c5e19c0a00a9dac968a13167087d9f8199bcb2e93fcb53199f2400ab2f398958761d7c33e6","pubkey":"8f1e06e20ac5dd13518bd6c5e19c0a00a9dac968a13167087d9f8199bcb2e93fcb53199f2400ab2f398958761d7c33e6","path":"","uuid":"97ac3679-1491-41af-9b96-87952764096e","version":4} \ No newline at end of file diff --git a/ops-bedrock/beacon-data/data/keys/0x91838562f203c048b60308d5dae4e845977b8bd946806886f91f23038df2759e9306efcb56f15d57498a68ee789bf5ce/voting-keystore.json b/ops-bedrock/beacon-data/data/keys/0x91838562f203c048b60308d5dae4e845977b8bd946806886f91f23038df2759e9306efcb56f15d57498a68ee789bf5ce/voting-keystore.json new file mode 100644 index 000000000000..a1a9111a1c37 --- /dev/null +++ b/ops-bedrock/beacon-data/data/keys/0x91838562f203c048b60308d5dae4e845977b8bd946806886f91f23038df2759e9306efcb56f15d57498a68ee789bf5ce/voting-keystore.json @@ -0,0 +1 @@ +{"crypto":{"kdf":{"function":"pbkdf2","params":{"dklen":32,"c":262144,"prf":"hmac-sha256","salt":"4354cdf8bc87f97cce3a829a881c5caa2b4f5dcf14dad9da87054f68c1eda2d7"},"message":""},"checksum":{"function":"sha256","params":{},"message":"b46463ee3a57475bfda5ef60c6941bfa6d5b51367a01f34ba01d39bd749557d5"},"cipher":{"function":"aes-128-ctr","params":{"iv":"e503a7c9ef8cce006c52d95d05620bb1"},"message":"8ef859792a742cb3e3b5d65621136e8a46da35e318a3b74a1676660f55dfaba0"}},"description":"0x91838562f203c048b60308d5dae4e845977b8bd946806886f91f23038df2759e9306efcb56f15d57498a68ee789bf5ce","pubkey":"91838562f203c048b60308d5dae4e845977b8bd946806886f91f23038df2759e9306efcb56f15d57498a68ee789bf5ce","path":"","uuid":"5f5698c5-3614-4235-ae1a-ae6462d284eb","version":4} \ No newline at end of file diff --git a/ops-bedrock/beacon-data/data/keys/0x935b301be1f67fc6a896b57309e546bfc1ae731a19b73777ca848fb81f4d8d7b9a5c1cf8ad54d5e1eda09f2095d848cb/voting-keystore.json b/ops-bedrock/beacon-data/data/keys/0x935b301be1f67fc6a896b57309e546bfc1ae731a19b73777ca848fb81f4d8d7b9a5c1cf8ad54d5e1eda09f2095d848cb/voting-keystore.json new file mode 100644 index 000000000000..b0e3cbebaefd --- /dev/null +++ b/ops-bedrock/beacon-data/data/keys/0x935b301be1f67fc6a896b57309e546bfc1ae731a19b73777ca848fb81f4d8d7b9a5c1cf8ad54d5e1eda09f2095d848cb/voting-keystore.json @@ -0,0 +1 @@ +{"crypto":{"kdf":{"function":"pbkdf2","params":{"dklen":32,"c":262144,"prf":"hmac-sha256","salt":"a8f84442380929bbfda32d1901d8650bf6ceefe638f6db72df9b71ad26eea435"},"message":""},"checksum":{"function":"sha256","params":{},"message":"287dac54dc72f49383964e19c59afc6188227503190e850f7359e908ba3d9768"},"cipher":{"function":"aes-128-ctr","params":{"iv":"28ab6100763fb19910281aa6ef94094a"},"message":"75c3ce9aeae28bd1e4998c5ab30b849bc27ba1aa42f3f744ecca2160cec2d5b1"}},"description":"0x935b301be1f67fc6a896b57309e546bfc1ae731a19b73777ca848fb81f4d8d7b9a5c1cf8ad54d5e1eda09f2095d848cb","pubkey":"935b301be1f67fc6a896b57309e546bfc1ae731a19b73777ca848fb81f4d8d7b9a5c1cf8ad54d5e1eda09f2095d848cb","path":"","uuid":"dea203e5-c65c-45c5-87d8-745d830fa6fd","version":4} \ No newline at end of file diff --git a/ops-bedrock/beacon-data/data/keys/0x9401d4c66e72e596e0072c27de5bcf3c99900011d36f01219b9e0dc54c852393378b4a0bd12084032c6f02de2dcf1296/voting-keystore.json b/ops-bedrock/beacon-data/data/keys/0x9401d4c66e72e596e0072c27de5bcf3c99900011d36f01219b9e0dc54c852393378b4a0bd12084032c6f02de2dcf1296/voting-keystore.json new file mode 100644 index 000000000000..0d80c760d46f --- /dev/null +++ b/ops-bedrock/beacon-data/data/keys/0x9401d4c66e72e596e0072c27de5bcf3c99900011d36f01219b9e0dc54c852393378b4a0bd12084032c6f02de2dcf1296/voting-keystore.json @@ -0,0 +1 @@ +{"crypto":{"kdf":{"function":"pbkdf2","params":{"dklen":32,"c":262144,"prf":"hmac-sha256","salt":"ef851439a0c6178adfc660dd065e8c64215881219cccb30823cb83390a1a1588"},"message":""},"checksum":{"function":"sha256","params":{},"message":"42b7dab9ceba32abfbc049d91b92260e3b533779256f064b0d9578d4e733cdb7"},"cipher":{"function":"aes-128-ctr","params":{"iv":"19230ce0c517121afffe1bb5a426dbf1"},"message":"6d0773c27a2e10d572b2f427844cdf36634fc1f1121fd8aa407a42fd4a139a53"}},"description":"0x9401d4c66e72e596e0072c27de5bcf3c99900011d36f01219b9e0dc54c852393378b4a0bd12084032c6f02de2dcf1296","pubkey":"9401d4c66e72e596e0072c27de5bcf3c99900011d36f01219b9e0dc54c852393378b4a0bd12084032c6f02de2dcf1296","path":"","uuid":"e1c50412-79b3-4d79-8e92-fae2757306e6","version":4} \ No newline at end of file diff --git a/ops-bedrock/beacon-data/data/keys/0x95123a9757f7295b4cdfeb8808d9d7de69761477db3a34aabe2cb4bffc466b65618b91a0e2f33c95d23d38665d68c506/voting-keystore.json b/ops-bedrock/beacon-data/data/keys/0x95123a9757f7295b4cdfeb8808d9d7de69761477db3a34aabe2cb4bffc466b65618b91a0e2f33c95d23d38665d68c506/voting-keystore.json new file mode 100644 index 000000000000..e2ec51a3f19f --- /dev/null +++ b/ops-bedrock/beacon-data/data/keys/0x95123a9757f7295b4cdfeb8808d9d7de69761477db3a34aabe2cb4bffc466b65618b91a0e2f33c95d23d38665d68c506/voting-keystore.json @@ -0,0 +1 @@ +{"crypto":{"kdf":{"function":"pbkdf2","params":{"dklen":32,"c":262144,"prf":"hmac-sha256","salt":"e59a7ef8b181001e35b5282723e71f27c343780c914d57c314beafc45331b388"},"message":""},"checksum":{"function":"sha256","params":{},"message":"1ce21ffa547ebd1dbe90689945a03d5d5082e4edcf1c13deebf9c9986e439769"},"cipher":{"function":"aes-128-ctr","params":{"iv":"48b433c468bf69c858bbc76b3eea5fec"},"message":"f58e232e3c4c83e3fa6d1f741360e0d1d885cf0e6d3f1177cb78619146026b87"}},"description":"0x95123a9757f7295b4cdfeb8808d9d7de69761477db3a34aabe2cb4bffc466b65618b91a0e2f33c95d23d38665d68c506","pubkey":"95123a9757f7295b4cdfeb8808d9d7de69761477db3a34aabe2cb4bffc466b65618b91a0e2f33c95d23d38665d68c506","path":"","uuid":"a0f2f507-9518-4e85-91be-bb4c82917392","version":4} \ No newline at end of file diff --git a/ops-bedrock/beacon-data/data/keys/0x95419a10ad9771dc7545637bc14e4eb7938e0bcc57a42000ddbb117750570fb5ce290679d326a0783e6c780be23df6d8/voting-keystore.json b/ops-bedrock/beacon-data/data/keys/0x95419a10ad9771dc7545637bc14e4eb7938e0bcc57a42000ddbb117750570fb5ce290679d326a0783e6c780be23df6d8/voting-keystore.json new file mode 100644 index 000000000000..7f7a3e1ca6db --- /dev/null +++ b/ops-bedrock/beacon-data/data/keys/0x95419a10ad9771dc7545637bc14e4eb7938e0bcc57a42000ddbb117750570fb5ce290679d326a0783e6c780be23df6d8/voting-keystore.json @@ -0,0 +1 @@ +{"crypto":{"kdf":{"function":"pbkdf2","params":{"dklen":32,"c":262144,"prf":"hmac-sha256","salt":"930f062874ddab4711655d01f1c0eff4d8d8f55acffd80fae3e89d46d65c6387"},"message":""},"checksum":{"function":"sha256","params":{},"message":"16ad2bae69677d8a44f26f76f3b0a5e8f66f6424b434bc5f126ed92a9c6c6e7b"},"cipher":{"function":"aes-128-ctr","params":{"iv":"a28281839d3932afca7707038fbca9c7"},"message":"626f90ad5587f17bcb5a847fb2090a847c269f8a453fbc774a8cd1ca6eac75bf"}},"description":"0x95419a10ad9771dc7545637bc14e4eb7938e0bcc57a42000ddbb117750570fb5ce290679d326a0783e6c780be23df6d8","pubkey":"95419a10ad9771dc7545637bc14e4eb7938e0bcc57a42000ddbb117750570fb5ce290679d326a0783e6c780be23df6d8","path":"","uuid":"ae2f5d56-3ead-4656-b0fc-a57720cc5258","version":4} \ No newline at end of file diff --git a/ops-bedrock/beacon-data/data/keys/0x958979725c3497149c8f1ed2e3f073a56207ff17218ba3fef7fbcc6e07bbd7b8fc528ff646a49e9c1a145ed27017ef4d/voting-keystore.json b/ops-bedrock/beacon-data/data/keys/0x958979725c3497149c8f1ed2e3f073a56207ff17218ba3fef7fbcc6e07bbd7b8fc528ff646a49e9c1a145ed27017ef4d/voting-keystore.json new file mode 100644 index 000000000000..d26ca4097a5b --- /dev/null +++ b/ops-bedrock/beacon-data/data/keys/0x958979725c3497149c8f1ed2e3f073a56207ff17218ba3fef7fbcc6e07bbd7b8fc528ff646a49e9c1a145ed27017ef4d/voting-keystore.json @@ -0,0 +1 @@ +{"crypto":{"kdf":{"function":"pbkdf2","params":{"dklen":32,"c":262144,"prf":"hmac-sha256","salt":"e325f6ae6ef00f6330bdbe27496d71fa63b6bb9086cbb12280a7f655f64b0000"},"message":""},"checksum":{"function":"sha256","params":{},"message":"38d3586ea8ef46a6bc16b8ee73b5397dd05bc8928e89daa85b9a00e0fc569cf2"},"cipher":{"function":"aes-128-ctr","params":{"iv":"bc4460ec9ed604f9695f6eadfd4c9c73"},"message":"41074ed5c32a30d18c2dabb69f95093add6a387892ad42d637d60b52b3942631"}},"description":"0x958979725c3497149c8f1ed2e3f073a56207ff17218ba3fef7fbcc6e07bbd7b8fc528ff646a49e9c1a145ed27017ef4d","pubkey":"958979725c3497149c8f1ed2e3f073a56207ff17218ba3fef7fbcc6e07bbd7b8fc528ff646a49e9c1a145ed27017ef4d","path":"","uuid":"e0a5cc41-7572-4338-88f4-19e466ff243b","version":4} \ No newline at end of file diff --git a/ops-bedrock/beacon-data/data/keys/0x961d5cb5deed3612dfbbbffccada34d5a940bcb9b8002452be08d3d69e69274a98854b140744d2640da797cbe910b1cd/voting-keystore.json b/ops-bedrock/beacon-data/data/keys/0x961d5cb5deed3612dfbbbffccada34d5a940bcb9b8002452be08d3d69e69274a98854b140744d2640da797cbe910b1cd/voting-keystore.json new file mode 100644 index 000000000000..1c600dae8be4 --- /dev/null +++ b/ops-bedrock/beacon-data/data/keys/0x961d5cb5deed3612dfbbbffccada34d5a940bcb9b8002452be08d3d69e69274a98854b140744d2640da797cbe910b1cd/voting-keystore.json @@ -0,0 +1 @@ +{"crypto":{"kdf":{"function":"pbkdf2","params":{"dklen":32,"c":262144,"prf":"hmac-sha256","salt":"688bfc5fd816a419b59aef97086abdee0b7600696b0f0a59ff618a80ac35c38b"},"message":""},"checksum":{"function":"sha256","params":{},"message":"125a53a325bf3e026ff7724446ac08d05402170e5eb13c7b06d89a694e4cd3ce"},"cipher":{"function":"aes-128-ctr","params":{"iv":"eb0438b60356d72aad02caa8997d715f"},"message":"6d52b787bbb3fafa8bbb0527d95677a777ca2e0c930bf7d402fe924e4c5d61be"}},"description":"0x961d5cb5deed3612dfbbbffccada34d5a940bcb9b8002452be08d3d69e69274a98854b140744d2640da797cbe910b1cd","pubkey":"961d5cb5deed3612dfbbbffccada34d5a940bcb9b8002452be08d3d69e69274a98854b140744d2640da797cbe910b1cd","path":"","uuid":"e58e48a0-5cc5-40f3-8688-f9320c02f052","version":4} \ No newline at end of file diff --git a/ops-bedrock/beacon-data/data/keys/0x980f54178ab1e2d21822e9cd7327acb170269e6215cc8151f5f9c74d3e9ed4fd8e2d5b03c0d5b187edf0b56b6d2fc2fc/voting-keystore.json b/ops-bedrock/beacon-data/data/keys/0x980f54178ab1e2d21822e9cd7327acb170269e6215cc8151f5f9c74d3e9ed4fd8e2d5b03c0d5b187edf0b56b6d2fc2fc/voting-keystore.json new file mode 100644 index 000000000000..86297ca3e67a --- /dev/null +++ b/ops-bedrock/beacon-data/data/keys/0x980f54178ab1e2d21822e9cd7327acb170269e6215cc8151f5f9c74d3e9ed4fd8e2d5b03c0d5b187edf0b56b6d2fc2fc/voting-keystore.json @@ -0,0 +1 @@ +{"crypto":{"kdf":{"function":"pbkdf2","params":{"dklen":32,"c":262144,"prf":"hmac-sha256","salt":"0b80daab3265d2c15fcc8e45fd7a69616eb8684441c1cb076feb6dc333616fef"},"message":""},"checksum":{"function":"sha256","params":{},"message":"b65c5e4f700c7e6b973e17f94eeec8b20ab45a709aae9351d937fc4f7370d006"},"cipher":{"function":"aes-128-ctr","params":{"iv":"7ce656fb9fbae5dc49f01edcdf1e34b1"},"message":"a2a0a0a02eb2c1495ce447dc253686b2e258f08e69179428b20704d8dfa48856"}},"description":"0x980f54178ab1e2d21822e9cd7327acb170269e6215cc8151f5f9c74d3e9ed4fd8e2d5b03c0d5b187edf0b56b6d2fc2fc","pubkey":"980f54178ab1e2d21822e9cd7327acb170269e6215cc8151f5f9c74d3e9ed4fd8e2d5b03c0d5b187edf0b56b6d2fc2fc","path":"","uuid":"505c518f-6566-4a6c-8137-1d5b011b7319","version":4} \ No newline at end of file diff --git a/ops-bedrock/beacon-data/data/keys/0x988085e2781db7997526af727a32b8660d4022251202f534ba6edda299d5b1fad5a706fe85cab523478abd5e10d68e51/voting-keystore.json b/ops-bedrock/beacon-data/data/keys/0x988085e2781db7997526af727a32b8660d4022251202f534ba6edda299d5b1fad5a706fe85cab523478abd5e10d68e51/voting-keystore.json new file mode 100644 index 000000000000..30596d4ceb35 --- /dev/null +++ b/ops-bedrock/beacon-data/data/keys/0x988085e2781db7997526af727a32b8660d4022251202f534ba6edda299d5b1fad5a706fe85cab523478abd5e10d68e51/voting-keystore.json @@ -0,0 +1 @@ +{"crypto":{"kdf":{"function":"pbkdf2","params":{"dklen":32,"c":262144,"prf":"hmac-sha256","salt":"1cc1dca6925ee63fd0abadc370f247724b076822045e258c006ccc06e54b2e1f"},"message":""},"checksum":{"function":"sha256","params":{},"message":"aca0e4e797a4f80eaa9dc9e325032ec114adde8038c9aeb546cb3c4b4f870e33"},"cipher":{"function":"aes-128-ctr","params":{"iv":"74f8171fab4462d8ad888af5bccfad15"},"message":"140c6c8ea776d0a5c06ed69fd5ec7b01e3271748aca57777939c5a8eeb0068df"}},"description":"0x988085e2781db7997526af727a32b8660d4022251202f534ba6edda299d5b1fad5a706fe85cab523478abd5e10d68e51","pubkey":"988085e2781db7997526af727a32b8660d4022251202f534ba6edda299d5b1fad5a706fe85cab523478abd5e10d68e51","path":"","uuid":"a33551a7-345c-4cad-ab82-f70cd7bc5a37","version":4} \ No newline at end of file diff --git a/ops-bedrock/beacon-data/data/keys/0x99729eb9833e428853a7444653824aac579864675d6c69c1fc79423f4aba0d51153a40f31c1082816ddb0cdce31bc6b2/voting-keystore.json b/ops-bedrock/beacon-data/data/keys/0x99729eb9833e428853a7444653824aac579864675d6c69c1fc79423f4aba0d51153a40f31c1082816ddb0cdce31bc6b2/voting-keystore.json new file mode 100644 index 000000000000..3812ac20dd2f --- /dev/null +++ b/ops-bedrock/beacon-data/data/keys/0x99729eb9833e428853a7444653824aac579864675d6c69c1fc79423f4aba0d51153a40f31c1082816ddb0cdce31bc6b2/voting-keystore.json @@ -0,0 +1 @@ +{"crypto":{"kdf":{"function":"pbkdf2","params":{"dklen":32,"c":262144,"prf":"hmac-sha256","salt":"753d70731e228de115f39ec8426e922d7204a33d9b5a90e6eeac90984a3c79dd"},"message":""},"checksum":{"function":"sha256","params":{},"message":"984c2be8c777cf3b8c213df38ecc5267a0d040e4f8e0a0c2bc3746f47ff08ee1"},"cipher":{"function":"aes-128-ctr","params":{"iv":"6cd8ab19991c7195cd5e6a9bb89efd5d"},"message":"77993e8bcf7f91f3b6d0554876d35995d8a0704a3e9e2cbf27d9fb7419f5b3a0"}},"description":"0x99729eb9833e428853a7444653824aac579864675d6c69c1fc79423f4aba0d51153a40f31c1082816ddb0cdce31bc6b2","pubkey":"99729eb9833e428853a7444653824aac579864675d6c69c1fc79423f4aba0d51153a40f31c1082816ddb0cdce31bc6b2","path":"","uuid":"ae79b2e2-27d6-4997-8547-8ae93d555e94","version":4} \ No newline at end of file diff --git a/ops-bedrock/beacon-data/data/keys/0x99804a3e664ba9d8b0a91fdb6127f2753932e41c6f62d1c26edd5f81a12f0eb7bdc9df0d58121436cabd07261f2bcdbd/voting-keystore.json b/ops-bedrock/beacon-data/data/keys/0x99804a3e664ba9d8b0a91fdb6127f2753932e41c6f62d1c26edd5f81a12f0eb7bdc9df0d58121436cabd07261f2bcdbd/voting-keystore.json new file mode 100644 index 000000000000..8ce46b885746 --- /dev/null +++ b/ops-bedrock/beacon-data/data/keys/0x99804a3e664ba9d8b0a91fdb6127f2753932e41c6f62d1c26edd5f81a12f0eb7bdc9df0d58121436cabd07261f2bcdbd/voting-keystore.json @@ -0,0 +1 @@ +{"crypto":{"kdf":{"function":"pbkdf2","params":{"dklen":32,"c":262144,"prf":"hmac-sha256","salt":"a99c0f1a8e0a389333e46331c4da736e9aa3a89f0b218e41c3ed895bfcfec11e"},"message":""},"checksum":{"function":"sha256","params":{},"message":"89ba5465e78b9751b0e7c2fe3b94fc2e5bc8167b683bec9c366f6fe1d6205fd9"},"cipher":{"function":"aes-128-ctr","params":{"iv":"60d12696eff428d2ae10e8ac95ee873d"},"message":"53ede6abe0479229ed5dce788d52ead0482d3be841b34114cb044a0ddb66990c"}},"description":"0x99804a3e664ba9d8b0a91fdb6127f2753932e41c6f62d1c26edd5f81a12f0eb7bdc9df0d58121436cabd07261f2bcdbd","pubkey":"99804a3e664ba9d8b0a91fdb6127f2753932e41c6f62d1c26edd5f81a12f0eb7bdc9df0d58121436cabd07261f2bcdbd","path":"","uuid":"53db7652-11a8-4fc8-bb6a-5454264b1267","version":4} \ No newline at end of file diff --git a/ops-bedrock/beacon-data/data/keys/0xa125a3659c269801fb2e00c8f38d6b6fbe91a85dc99691db008cf325ef4ca7443c6fbc8a9131acf885d6169f859b8b1c/voting-keystore.json b/ops-bedrock/beacon-data/data/keys/0xa125a3659c269801fb2e00c8f38d6b6fbe91a85dc99691db008cf325ef4ca7443c6fbc8a9131acf885d6169f859b8b1c/voting-keystore.json new file mode 100644 index 000000000000..2856d5c16d8e --- /dev/null +++ b/ops-bedrock/beacon-data/data/keys/0xa125a3659c269801fb2e00c8f38d6b6fbe91a85dc99691db008cf325ef4ca7443c6fbc8a9131acf885d6169f859b8b1c/voting-keystore.json @@ -0,0 +1 @@ +{"crypto":{"kdf":{"function":"pbkdf2","params":{"dklen":32,"c":262144,"prf":"hmac-sha256","salt":"4c91cede9e40f6316a2fbd4f0c329ec8b71bdf21a2fabb73739d2061e1cfb9af"},"message":""},"checksum":{"function":"sha256","params":{},"message":"e469aa28317dbe07393c196195bfe4e8d83eaedcf36124f9a8c8403333503539"},"cipher":{"function":"aes-128-ctr","params":{"iv":"a431b7b2ae3ab47166c1311394191ca9"},"message":"879da66d9feb64b577ff98ecfd26f03e7bfbee47f8b580b44e252e7e391c5fd7"}},"description":"0xa125a3659c269801fb2e00c8f38d6b6fbe91a85dc99691db008cf325ef4ca7443c6fbc8a9131acf885d6169f859b8b1c","pubkey":"a125a3659c269801fb2e00c8f38d6b6fbe91a85dc99691db008cf325ef4ca7443c6fbc8a9131acf885d6169f859b8b1c","path":"","uuid":"69afdc9c-849b-42f0-95f6-fb5ced622e77","version":4} \ No newline at end of file diff --git a/ops-bedrock/beacon-data/data/keys/0xa1ae1d14d16cf61a6ae0c9589a19a8f38e161f02dbd98c9f5400fc63689af3af2c146bcfb46f0d94469502947d19d6df/voting-keystore.json b/ops-bedrock/beacon-data/data/keys/0xa1ae1d14d16cf61a6ae0c9589a19a8f38e161f02dbd98c9f5400fc63689af3af2c146bcfb46f0d94469502947d19d6df/voting-keystore.json new file mode 100644 index 000000000000..26c0e3870a03 --- /dev/null +++ b/ops-bedrock/beacon-data/data/keys/0xa1ae1d14d16cf61a6ae0c9589a19a8f38e161f02dbd98c9f5400fc63689af3af2c146bcfb46f0d94469502947d19d6df/voting-keystore.json @@ -0,0 +1 @@ +{"crypto":{"kdf":{"function":"pbkdf2","params":{"dklen":32,"c":262144,"prf":"hmac-sha256","salt":"63e8b33d851627dd20c17a2edcb1d45e9de28330b4a9154f9ef288f9e7257df2"},"message":""},"checksum":{"function":"sha256","params":{},"message":"90af011259c8e0a1def459dc71a2f319a799a588f0b098eec4aa6e97205e4225"},"cipher":{"function":"aes-128-ctr","params":{"iv":"388d1e0f78ffd27fe60cc37be28238a2"},"message":"28bec7ca5d7ce57188668a511a12e90ad2dec556e1fbe9167674c115e45112bd"}},"description":"0xa1ae1d14d16cf61a6ae0c9589a19a8f38e161f02dbd98c9f5400fc63689af3af2c146bcfb46f0d94469502947d19d6df","pubkey":"a1ae1d14d16cf61a6ae0c9589a19a8f38e161f02dbd98c9f5400fc63689af3af2c146bcfb46f0d94469502947d19d6df","path":"","uuid":"fcd67356-2eec-4da7-b4f9-ad698d6ed177","version":4} \ No newline at end of file diff --git a/ops-bedrock/beacon-data/data/keys/0xa2794c3671f0520ffa1032dac4ef67b0a00a65255e522449bf8cabd775db13dd22871f64e710a09344739ef66c1f578f/voting-keystore.json b/ops-bedrock/beacon-data/data/keys/0xa2794c3671f0520ffa1032dac4ef67b0a00a65255e522449bf8cabd775db13dd22871f64e710a09344739ef66c1f578f/voting-keystore.json new file mode 100644 index 000000000000..4d611ddd213e --- /dev/null +++ b/ops-bedrock/beacon-data/data/keys/0xa2794c3671f0520ffa1032dac4ef67b0a00a65255e522449bf8cabd775db13dd22871f64e710a09344739ef66c1f578f/voting-keystore.json @@ -0,0 +1 @@ +{"crypto":{"kdf":{"function":"pbkdf2","params":{"dklen":32,"c":262144,"prf":"hmac-sha256","salt":"7021a99d82bc3946731ff2b0c352f56c1f462390adb68e8dbdf5ca039e68164a"},"message":""},"checksum":{"function":"sha256","params":{},"message":"59367ead91d74a1f7f6c4c7d694f8e21321adecbfd184d64739b2b6926933d6e"},"cipher":{"function":"aes-128-ctr","params":{"iv":"a9137d5732fde4f96bf093f2481e6f02"},"message":"ffdc02fdc62e3b81f45d76812d65edf560e853f0939b3fb5e7d7504416d078e6"}},"description":"0xa2794c3671f0520ffa1032dac4ef67b0a00a65255e522449bf8cabd775db13dd22871f64e710a09344739ef66c1f578f","pubkey":"a2794c3671f0520ffa1032dac4ef67b0a00a65255e522449bf8cabd775db13dd22871f64e710a09344739ef66c1f578f","path":"","uuid":"2acb6709-6271-49ac-99f7-fc5217445213","version":4} \ No newline at end of file diff --git a/ops-bedrock/beacon-data/data/keys/0xa2ab702302efc9f00d6f50b367de843c24ef708f609b20205b46771f6603dd005a271aaeb589c4fc50cdf137ac66ff1a/voting-keystore.json b/ops-bedrock/beacon-data/data/keys/0xa2ab702302efc9f00d6f50b367de843c24ef708f609b20205b46771f6603dd005a271aaeb589c4fc50cdf137ac66ff1a/voting-keystore.json new file mode 100644 index 000000000000..262b0fb12912 --- /dev/null +++ b/ops-bedrock/beacon-data/data/keys/0xa2ab702302efc9f00d6f50b367de843c24ef708f609b20205b46771f6603dd005a271aaeb589c4fc50cdf137ac66ff1a/voting-keystore.json @@ -0,0 +1 @@ +{"crypto":{"kdf":{"function":"pbkdf2","params":{"dklen":32,"c":262144,"prf":"hmac-sha256","salt":"0085434c922d5984a180cfb808df5ae84773db853a1a4759e9edaf8a4072f3c2"},"message":""},"checksum":{"function":"sha256","params":{},"message":"b08bd95d0a66f156db25dccb6e6d4f358254f28d17a47c85a256a97856c020e0"},"cipher":{"function":"aes-128-ctr","params":{"iv":"073bc2804d4eaa2868fb10340ca30a35"},"message":"6210086729e239f3ba0fe33f17f161d8cfcfe0a39db899f7f6b73eca26e9c086"}},"description":"0xa2ab702302efc9f00d6f50b367de843c24ef708f609b20205b46771f6603dd005a271aaeb589c4fc50cdf137ac66ff1a","pubkey":"a2ab702302efc9f00d6f50b367de843c24ef708f609b20205b46771f6603dd005a271aaeb589c4fc50cdf137ac66ff1a","path":"","uuid":"6e73dea6-67f5-42e3-9a21-71c4b3251b82","version":4} \ No newline at end of file diff --git a/ops-bedrock/beacon-data/data/keys/0xa39882700ed7f72fcdbac07081b7c0c912cb8647ed8494926e6c9c2fc1a7415c7c60e3afcc3d3278fe25b50b851c3ad5/voting-keystore.json b/ops-bedrock/beacon-data/data/keys/0xa39882700ed7f72fcdbac07081b7c0c912cb8647ed8494926e6c9c2fc1a7415c7c60e3afcc3d3278fe25b50b851c3ad5/voting-keystore.json new file mode 100644 index 000000000000..cc7252342cca --- /dev/null +++ b/ops-bedrock/beacon-data/data/keys/0xa39882700ed7f72fcdbac07081b7c0c912cb8647ed8494926e6c9c2fc1a7415c7c60e3afcc3d3278fe25b50b851c3ad5/voting-keystore.json @@ -0,0 +1 @@ +{"crypto":{"kdf":{"function":"pbkdf2","params":{"dklen":32,"c":262144,"prf":"hmac-sha256","salt":"425ab401e5a5478a0660b8b5b0656a078b7d1183fa270a9a07fcde0141802faf"},"message":""},"checksum":{"function":"sha256","params":{},"message":"04c06ee5d22c9542a88464cdf4ef0b284d4364c0a3c180cbe0d618c8287bbb2f"},"cipher":{"function":"aes-128-ctr","params":{"iv":"469a33505a89ea8ff25c52aa4ff5b4f7"},"message":"147811f37c99d5cdfe4d598e74974673aeb0e133f67c68c2c579dcf6f4fa5fee"}},"description":"0xa39882700ed7f72fcdbac07081b7c0c912cb8647ed8494926e6c9c2fc1a7415c7c60e3afcc3d3278fe25b50b851c3ad5","pubkey":"a39882700ed7f72fcdbac07081b7c0c912cb8647ed8494926e6c9c2fc1a7415c7c60e3afcc3d3278fe25b50b851c3ad5","path":"","uuid":"146bbdbf-b547-4709-9818-4619f72e88d0","version":4} \ No newline at end of file diff --git a/ops-bedrock/beacon-data/data/keys/0xa3ed99f5e10128dcfa3553c0875021d57da6578892e368d97d6ca4b5d1da961523bde2765e21d64eed8b9eec079f3ff2/voting-keystore.json b/ops-bedrock/beacon-data/data/keys/0xa3ed99f5e10128dcfa3553c0875021d57da6578892e368d97d6ca4b5d1da961523bde2765e21d64eed8b9eec079f3ff2/voting-keystore.json new file mode 100644 index 000000000000..f26f00681120 --- /dev/null +++ b/ops-bedrock/beacon-data/data/keys/0xa3ed99f5e10128dcfa3553c0875021d57da6578892e368d97d6ca4b5d1da961523bde2765e21d64eed8b9eec079f3ff2/voting-keystore.json @@ -0,0 +1 @@ +{"crypto":{"kdf":{"function":"pbkdf2","params":{"dklen":32,"c":262144,"prf":"hmac-sha256","salt":"891aee417983042a974cdda70323bf15b3d48a07c6a6a43cd616529bde447578"},"message":""},"checksum":{"function":"sha256","params":{},"message":"470112a9797aecdba96148e12d0e39efd8dc36a0ee426846292d0b5c65bb0054"},"cipher":{"function":"aes-128-ctr","params":{"iv":"d8af70eb6e71786a20b91d9e1143e5b5"},"message":"2280821079d1901cb21d595f9d8647c2f1f41d4367629ce702520060e7348d91"}},"description":"0xa3ed99f5e10128dcfa3553c0875021d57da6578892e368d97d6ca4b5d1da961523bde2765e21d64eed8b9eec079f3ff2","pubkey":"a3ed99f5e10128dcfa3553c0875021d57da6578892e368d97d6ca4b5d1da961523bde2765e21d64eed8b9eec079f3ff2","path":"","uuid":"1556556d-b333-408a-bec0-bbe011f86534","version":4} \ No newline at end of file diff --git a/ops-bedrock/beacon-data/data/keys/0xa459e9ad0870b24aeb95d53b437014dc5dd97bbe38d78b51797da732e26e70e47ae97eb6d16ace2b7b21961fe9c27904/voting-keystore.json b/ops-bedrock/beacon-data/data/keys/0xa459e9ad0870b24aeb95d53b437014dc5dd97bbe38d78b51797da732e26e70e47ae97eb6d16ace2b7b21961fe9c27904/voting-keystore.json new file mode 100644 index 000000000000..5b7f233e0d00 --- /dev/null +++ b/ops-bedrock/beacon-data/data/keys/0xa459e9ad0870b24aeb95d53b437014dc5dd97bbe38d78b51797da732e26e70e47ae97eb6d16ace2b7b21961fe9c27904/voting-keystore.json @@ -0,0 +1 @@ +{"crypto":{"kdf":{"function":"pbkdf2","params":{"dklen":32,"c":262144,"prf":"hmac-sha256","salt":"37ec58829b487dc8ac673f02da50013fab1d5d6835db51fc08769657a02d0091"},"message":""},"checksum":{"function":"sha256","params":{},"message":"cda3958a57d51e2e715de3c8c356cc1027a2ed59a17aba9faf74d29c435fa7ca"},"cipher":{"function":"aes-128-ctr","params":{"iv":"aa03f5a49949c042e7ac9aa2c14b6c23"},"message":"cb1f18956ec0b714aad516e2d980b8429b7030d2a1ed17a15029b8be99890ebf"}},"description":"0xa459e9ad0870b24aeb95d53b437014dc5dd97bbe38d78b51797da732e26e70e47ae97eb6d16ace2b7b21961fe9c27904","pubkey":"a459e9ad0870b24aeb95d53b437014dc5dd97bbe38d78b51797da732e26e70e47ae97eb6d16ace2b7b21961fe9c27904","path":"","uuid":"2f9c8c1f-f426-4301-99b1-f59e9e4bc3e8","version":4} \ No newline at end of file diff --git a/ops-bedrock/beacon-data/data/keys/0xa4662c910f9eda828898a0cddd61332aca5808be1efedb7aedae7978a0bc7f9d2a35baf97f913ca920c957c4e2b7a18c/voting-keystore.json b/ops-bedrock/beacon-data/data/keys/0xa4662c910f9eda828898a0cddd61332aca5808be1efedb7aedae7978a0bc7f9d2a35baf97f913ca920c957c4e2b7a18c/voting-keystore.json new file mode 100644 index 000000000000..3cadb3583c15 --- /dev/null +++ b/ops-bedrock/beacon-data/data/keys/0xa4662c910f9eda828898a0cddd61332aca5808be1efedb7aedae7978a0bc7f9d2a35baf97f913ca920c957c4e2b7a18c/voting-keystore.json @@ -0,0 +1 @@ +{"crypto":{"kdf":{"function":"pbkdf2","params":{"dklen":32,"c":262144,"prf":"hmac-sha256","salt":"ff1c4efb60282b87636843136084f6460d018510c67ac9df951319eb95051564"},"message":""},"checksum":{"function":"sha256","params":{},"message":"18536933d901c57b3b71d459f708fe2ff441b8a1039d017e36df05e82c5872d9"},"cipher":{"function":"aes-128-ctr","params":{"iv":"ed880a51dfeb7a5890ba8e3c70cf7761"},"message":"f80861b33bdd0b5782fdbfd1a0b1263a18420d354db3ebcf5026ba979b692c3b"}},"description":"0xa4662c910f9eda828898a0cddd61332aca5808be1efedb7aedae7978a0bc7f9d2a35baf97f913ca920c957c4e2b7a18c","pubkey":"a4662c910f9eda828898a0cddd61332aca5808be1efedb7aedae7978a0bc7f9d2a35baf97f913ca920c957c4e2b7a18c","path":"","uuid":"c183a2c4-1e92-496b-b3db-c0bfddb48788","version":4} \ No newline at end of file diff --git a/ops-bedrock/beacon-data/data/keys/0xa77a318dd834183c3e3b3921c94b1dbb8d1bb2c619e0c492a592c2de5a91e73b5c054bba52619355ed34012386a7aa1d/voting-keystore.json b/ops-bedrock/beacon-data/data/keys/0xa77a318dd834183c3e3b3921c94b1dbb8d1bb2c619e0c492a592c2de5a91e73b5c054bba52619355ed34012386a7aa1d/voting-keystore.json new file mode 100644 index 000000000000..d9ceb83077c7 --- /dev/null +++ b/ops-bedrock/beacon-data/data/keys/0xa77a318dd834183c3e3b3921c94b1dbb8d1bb2c619e0c492a592c2de5a91e73b5c054bba52619355ed34012386a7aa1d/voting-keystore.json @@ -0,0 +1 @@ +{"crypto":{"kdf":{"function":"pbkdf2","params":{"dklen":32,"c":262144,"prf":"hmac-sha256","salt":"b620fcfdbc893c53a9258cfeba99d0bae4c91d5fedfd524c0760b0ef81955fcb"},"message":""},"checksum":{"function":"sha256","params":{},"message":"5be9cf03728161cbf9b21fa068e6271ca43bc2f78c317a399266df7059a07f85"},"cipher":{"function":"aes-128-ctr","params":{"iv":"02303b2bf2f758d22d9972eec2c76c65"},"message":"94c15c0f66e86f134e1d5de55f0df1845639e0d16af9502f810e86c89aef1d5f"}},"description":"0xa77a318dd834183c3e3b3921c94b1dbb8d1bb2c619e0c492a592c2de5a91e73b5c054bba52619355ed34012386a7aa1d","pubkey":"a77a318dd834183c3e3b3921c94b1dbb8d1bb2c619e0c492a592c2de5a91e73b5c054bba52619355ed34012386a7aa1d","path":"","uuid":"8579d9bb-fa7c-4745-9c7f-83e278b1ec2b","version":4} \ No newline at end of file diff --git a/ops-bedrock/beacon-data/data/keys/0xa86404df6d392d2ba08e01a3a967bfd58f081f45bec4e68bf91302f1918870f80719e78a33fa95c520e929e0d58bf38c/voting-keystore.json b/ops-bedrock/beacon-data/data/keys/0xa86404df6d392d2ba08e01a3a967bfd58f081f45bec4e68bf91302f1918870f80719e78a33fa95c520e929e0d58bf38c/voting-keystore.json new file mode 100644 index 000000000000..f94ec514f59a --- /dev/null +++ b/ops-bedrock/beacon-data/data/keys/0xa86404df6d392d2ba08e01a3a967bfd58f081f45bec4e68bf91302f1918870f80719e78a33fa95c520e929e0d58bf38c/voting-keystore.json @@ -0,0 +1 @@ +{"crypto":{"kdf":{"function":"pbkdf2","params":{"dklen":32,"c":262144,"prf":"hmac-sha256","salt":"9126c985f9ee3ab128e78500a926e60669f67f54802705f662bb0a1f5740c233"},"message":""},"checksum":{"function":"sha256","params":{},"message":"51c35360d2f139904ea0f44a964b4d7f25c141de1c02376b7fcb7e5779081c4e"},"cipher":{"function":"aes-128-ctr","params":{"iv":"7de0ffb22a5cd001395f309b71f7538b"},"message":"487754759dfc5a284b348e044288a0908ca5c935706916c78bce755ad5cf94a8"}},"description":"0xa86404df6d392d2ba08e01a3a967bfd58f081f45bec4e68bf91302f1918870f80719e78a33fa95c520e929e0d58bf38c","pubkey":"a86404df6d392d2ba08e01a3a967bfd58f081f45bec4e68bf91302f1918870f80719e78a33fa95c520e929e0d58bf38c","path":"","uuid":"252dc4ff-21e1-4930-8c61-547fd903c716","version":4} \ No newline at end of file diff --git a/ops-bedrock/beacon-data/data/keys/0xa8a4c939ec0ee6ff6c58ace82cb82a603fd246defc10fdb37f6d66b5d1f2a1f9fa962547f87ec3aa611402f00bcec0a8/voting-keystore.json b/ops-bedrock/beacon-data/data/keys/0xa8a4c939ec0ee6ff6c58ace82cb82a603fd246defc10fdb37f6d66b5d1f2a1f9fa962547f87ec3aa611402f00bcec0a8/voting-keystore.json new file mode 100644 index 000000000000..190669999503 --- /dev/null +++ b/ops-bedrock/beacon-data/data/keys/0xa8a4c939ec0ee6ff6c58ace82cb82a603fd246defc10fdb37f6d66b5d1f2a1f9fa962547f87ec3aa611402f00bcec0a8/voting-keystore.json @@ -0,0 +1 @@ +{"crypto":{"kdf":{"function":"pbkdf2","params":{"dklen":32,"c":262144,"prf":"hmac-sha256","salt":"b0def3e91ec4fe4aca05b11da303cc0472be06b1b37bb04f1bf7d29e8cfb6675"},"message":""},"checksum":{"function":"sha256","params":{},"message":"b900dfdf5a139c495e17607c828e21eae187ec47b2b9d15e64e675772faa9f98"},"cipher":{"function":"aes-128-ctr","params":{"iv":"6adf8ac8e67682f32ff136d4229436de"},"message":"477e2ea41df26888050d30e470b1ac50869892b04b13b8efd036ca649152e790"}},"description":"0xa8a4c939ec0ee6ff6c58ace82cb82a603fd246defc10fdb37f6d66b5d1f2a1f9fa962547f87ec3aa611402f00bcec0a8","pubkey":"a8a4c939ec0ee6ff6c58ace82cb82a603fd246defc10fdb37f6d66b5d1f2a1f9fa962547f87ec3aa611402f00bcec0a8","path":"","uuid":"5782dbdf-d91a-4c96-894b-5d57457dcc84","version":4} \ No newline at end of file diff --git a/ops-bedrock/beacon-data/data/keys/0xa8b7eaa52875524b0b4716b56d2f377cb878ceb51b925c0a7fa4629f16b2a8161e28aed5c6446ff1889ab7473c86b6f3/voting-keystore.json b/ops-bedrock/beacon-data/data/keys/0xa8b7eaa52875524b0b4716b56d2f377cb878ceb51b925c0a7fa4629f16b2a8161e28aed5c6446ff1889ab7473c86b6f3/voting-keystore.json new file mode 100644 index 000000000000..ab0f7c1b4ddb --- /dev/null +++ b/ops-bedrock/beacon-data/data/keys/0xa8b7eaa52875524b0b4716b56d2f377cb878ceb51b925c0a7fa4629f16b2a8161e28aed5c6446ff1889ab7473c86b6f3/voting-keystore.json @@ -0,0 +1 @@ +{"crypto":{"kdf":{"function":"pbkdf2","params":{"dklen":32,"c":262144,"prf":"hmac-sha256","salt":"1f9025f171884d87f597274b409f55d899e9a7641ced4e5017505305e6437328"},"message":""},"checksum":{"function":"sha256","params":{},"message":"c4802211a62b4e0cd74267065dea7b4271e72102598804cf723bc8b95ac696e2"},"cipher":{"function":"aes-128-ctr","params":{"iv":"8b3ca528f1778b95100feadbc56c6fe1"},"message":"98e9efb3e8632377236d8584793020a7cc0af6b7765ad243de9dcaef7877949e"}},"description":"0xa8b7eaa52875524b0b4716b56d2f377cb878ceb51b925c0a7fa4629f16b2a8161e28aed5c6446ff1889ab7473c86b6f3","pubkey":"a8b7eaa52875524b0b4716b56d2f377cb878ceb51b925c0a7fa4629f16b2a8161e28aed5c6446ff1889ab7473c86b6f3","path":"","uuid":"ef4f908e-ee90-45ec-b717-68e77cc2f831","version":4} \ No newline at end of file diff --git a/ops-bedrock/beacon-data/data/keys/0xa90d4602211e30aa9f2d0fdb179bd113492028ca5e0da87871c18777fa8ecd3162a4085ddf7582f65803111715a22d01/voting-keystore.json b/ops-bedrock/beacon-data/data/keys/0xa90d4602211e30aa9f2d0fdb179bd113492028ca5e0da87871c18777fa8ecd3162a4085ddf7582f65803111715a22d01/voting-keystore.json new file mode 100644 index 000000000000..792f9cab55f3 --- /dev/null +++ b/ops-bedrock/beacon-data/data/keys/0xa90d4602211e30aa9f2d0fdb179bd113492028ca5e0da87871c18777fa8ecd3162a4085ddf7582f65803111715a22d01/voting-keystore.json @@ -0,0 +1 @@ +{"crypto":{"kdf":{"function":"pbkdf2","params":{"dklen":32,"c":262144,"prf":"hmac-sha256","salt":"847ff0062d2cd5094de172d71c0bdc9832101f1ee07800fb62a7cd55e91efc6c"},"message":""},"checksum":{"function":"sha256","params":{},"message":"389a2e456fdccf2e5ed889510a17994c7dab12cd69962474652905fcf80002f7"},"cipher":{"function":"aes-128-ctr","params":{"iv":"aab0815923a903318a92b73f7467f8d1"},"message":"9823d3cad661f6328673e1ce251fe452072f0cce1c01ace15eaa772d3714e409"}},"description":"0xa90d4602211e30aa9f2d0fdb179bd113492028ca5e0da87871c18777fa8ecd3162a4085ddf7582f65803111715a22d01","pubkey":"a90d4602211e30aa9f2d0fdb179bd113492028ca5e0da87871c18777fa8ecd3162a4085ddf7582f65803111715a22d01","path":"","uuid":"7aae888f-6c7e-45e4-8cbd-91422970b0d3","version":4} \ No newline at end of file diff --git a/ops-bedrock/beacon-data/data/keys/0xa960c5230b2348f3121d891aeabb2d3598893f7d32c675b6a4ef40a1331fe4b9010150dffd379e3216b3dcf0edb23259/voting-keystore.json b/ops-bedrock/beacon-data/data/keys/0xa960c5230b2348f3121d891aeabb2d3598893f7d32c675b6a4ef40a1331fe4b9010150dffd379e3216b3dcf0edb23259/voting-keystore.json new file mode 100644 index 000000000000..82440eb44cbf --- /dev/null +++ b/ops-bedrock/beacon-data/data/keys/0xa960c5230b2348f3121d891aeabb2d3598893f7d32c675b6a4ef40a1331fe4b9010150dffd379e3216b3dcf0edb23259/voting-keystore.json @@ -0,0 +1 @@ +{"crypto":{"kdf":{"function":"pbkdf2","params":{"dklen":32,"c":262144,"prf":"hmac-sha256","salt":"5fe9757abf49bbadcc35c1cf08e9484846149a3dabe51a43c537117a6eae31f5"},"message":""},"checksum":{"function":"sha256","params":{},"message":"83bcd6e426a7b4dccc3540c81b582a9be8c8267452270a15a6f5c6b6eab66769"},"cipher":{"function":"aes-128-ctr","params":{"iv":"f69a4d31d0e2c8637419e70eb98e63d3"},"message":"7579945e9a0f1e73a729f46a691922d3047fb1fbdcc3dbb9f49b03764fefd2a9"}},"description":"0xa960c5230b2348f3121d891aeabb2d3598893f7d32c675b6a4ef40a1331fe4b9010150dffd379e3216b3dcf0edb23259","pubkey":"a960c5230b2348f3121d891aeabb2d3598893f7d32c675b6a4ef40a1331fe4b9010150dffd379e3216b3dcf0edb23259","path":"","uuid":"c27373e5-c738-401c-9551-76682c2665b2","version":4} \ No newline at end of file diff --git a/ops-bedrock/beacon-data/data/keys/0xaacaf07d7ade408847d18ef8410f6da332ab0a370c337007e64ce98343369aac023e825f2b8e72e8ed34e2b064577a4b/voting-keystore.json b/ops-bedrock/beacon-data/data/keys/0xaacaf07d7ade408847d18ef8410f6da332ab0a370c337007e64ce98343369aac023e825f2b8e72e8ed34e2b064577a4b/voting-keystore.json new file mode 100644 index 000000000000..9d577a6469c3 --- /dev/null +++ b/ops-bedrock/beacon-data/data/keys/0xaacaf07d7ade408847d18ef8410f6da332ab0a370c337007e64ce98343369aac023e825f2b8e72e8ed34e2b064577a4b/voting-keystore.json @@ -0,0 +1 @@ +{"crypto":{"kdf":{"function":"pbkdf2","params":{"dklen":32,"c":262144,"prf":"hmac-sha256","salt":"ba21660ec1ce6e70318886da4525be863f49040d147f92fb6a2821f273ac828e"},"message":""},"checksum":{"function":"sha256","params":{},"message":"21d7b3a88c0e33e9a315138868bd744925eeb20f92f5019be7cbcaac3ee6f44b"},"cipher":{"function":"aes-128-ctr","params":{"iv":"d6254ab979c3117c47c5af3a59103440"},"message":"f50504dc23aa0d2db36f805ebb6bc50a49cb5d06a473a0e7ecfe822d76982578"}},"description":"0xaacaf07d7ade408847d18ef8410f6da332ab0a370c337007e64ce98343369aac023e825f2b8e72e8ed34e2b064577a4b","pubkey":"aacaf07d7ade408847d18ef8410f6da332ab0a370c337007e64ce98343369aac023e825f2b8e72e8ed34e2b064577a4b","path":"","uuid":"27670283-e5f4-4f29-a8bc-136fec31839e","version":4} \ No newline at end of file diff --git a/ops-bedrock/beacon-data/data/keys/0xab0b0a68c9ab8ef73338f8ee1bce7bdfb4fdd1020b4163bec31b952651141db4c8db7fc4b0c97cb8645ad2a58344c1c8/voting-keystore.json b/ops-bedrock/beacon-data/data/keys/0xab0b0a68c9ab8ef73338f8ee1bce7bdfb4fdd1020b4163bec31b952651141db4c8db7fc4b0c97cb8645ad2a58344c1c8/voting-keystore.json new file mode 100644 index 000000000000..3c7b7d49fc69 --- /dev/null +++ b/ops-bedrock/beacon-data/data/keys/0xab0b0a68c9ab8ef73338f8ee1bce7bdfb4fdd1020b4163bec31b952651141db4c8db7fc4b0c97cb8645ad2a58344c1c8/voting-keystore.json @@ -0,0 +1 @@ +{"crypto":{"kdf":{"function":"pbkdf2","params":{"dklen":32,"c":262144,"prf":"hmac-sha256","salt":"be554291d05cd0afb52d8537bf5616b49d0424009d1ca203830ba508725634c8"},"message":""},"checksum":{"function":"sha256","params":{},"message":"fb6ea8e5c528a41307f8a6e1303118766dd082c07ffa64d300e8e8edd0e30b85"},"cipher":{"function":"aes-128-ctr","params":{"iv":"a881e24cacbea534e7bcb65befbfdcdb"},"message":"d53e6b55bf042dbe8fbfa6fabcd028abfd2bc7bb16356e517a978b12002ea33c"}},"description":"0xab0b0a68c9ab8ef73338f8ee1bce7bdfb4fdd1020b4163bec31b952651141db4c8db7fc4b0c97cb8645ad2a58344c1c8","pubkey":"ab0b0a68c9ab8ef73338f8ee1bce7bdfb4fdd1020b4163bec31b952651141db4c8db7fc4b0c97cb8645ad2a58344c1c8","path":"","uuid":"7f5b50fc-7739-40c3-b0ff-b879d5533ecd","version":4} \ No newline at end of file diff --git a/ops-bedrock/beacon-data/data/keys/0xae23fb1b0c76e4fd9800c18945094932655fa3a6aea990392c08c16e9816b3637b3818f609bf774e7277aa9901f1140a/voting-keystore.json b/ops-bedrock/beacon-data/data/keys/0xae23fb1b0c76e4fd9800c18945094932655fa3a6aea990392c08c16e9816b3637b3818f609bf774e7277aa9901f1140a/voting-keystore.json new file mode 100644 index 000000000000..70ff5ef8e84a --- /dev/null +++ b/ops-bedrock/beacon-data/data/keys/0xae23fb1b0c76e4fd9800c18945094932655fa3a6aea990392c08c16e9816b3637b3818f609bf774e7277aa9901f1140a/voting-keystore.json @@ -0,0 +1 @@ +{"crypto":{"kdf":{"function":"pbkdf2","params":{"dklen":32,"c":262144,"prf":"hmac-sha256","salt":"cc86f1102953b50f239e50cd5d0508bf27d31f01723050c71053f4e68942b061"},"message":""},"checksum":{"function":"sha256","params":{},"message":"d444a4a2dd65f7ed26a595b1d4c05e45cddfc773981aba5246adbf8ad3c82a58"},"cipher":{"function":"aes-128-ctr","params":{"iv":"7756fd2a98414d9eee07550ca742af68"},"message":"108d3b282a3f0afe594743a75019cc41eafcda5f29d9e35a2356e9ff43c0e004"}},"description":"0xae23fb1b0c76e4fd9800c18945094932655fa3a6aea990392c08c16e9816b3637b3818f609bf774e7277aa9901f1140a","pubkey":"ae23fb1b0c76e4fd9800c18945094932655fa3a6aea990392c08c16e9816b3637b3818f609bf774e7277aa9901f1140a","path":"","uuid":"2c10b4f1-5d20-4378-bd31-e84961da09b3","version":4} \ No newline at end of file diff --git a/ops-bedrock/beacon-data/data/keys/0xae809a58eb62ac77b1a9c4b0ba4a3e3dc5024027de9f568cc91b66f1b7426feb4dfc61a5b8117c51c6a0c92f007a29ca/voting-keystore.json b/ops-bedrock/beacon-data/data/keys/0xae809a58eb62ac77b1a9c4b0ba4a3e3dc5024027de9f568cc91b66f1b7426feb4dfc61a5b8117c51c6a0c92f007a29ca/voting-keystore.json new file mode 100644 index 000000000000..16faa21029bc --- /dev/null +++ b/ops-bedrock/beacon-data/data/keys/0xae809a58eb62ac77b1a9c4b0ba4a3e3dc5024027de9f568cc91b66f1b7426feb4dfc61a5b8117c51c6a0c92f007a29ca/voting-keystore.json @@ -0,0 +1 @@ +{"crypto":{"kdf":{"function":"pbkdf2","params":{"dklen":32,"c":262144,"prf":"hmac-sha256","salt":"9a852ed9a9cc2911a4bb731219b6e1926eea780ff5918944949a855ef6ac2da3"},"message":""},"checksum":{"function":"sha256","params":{},"message":"d9a713c7c22d1e8a587e7f3ae62f436b2f91569e3bed454e72ddb0d642c5bda6"},"cipher":{"function":"aes-128-ctr","params":{"iv":"6b55b4251902cf6385d1d9c3d300271e"},"message":"f6bb3548d1f615b09b93caf991ab90dc502348fdc58f8f94b5fc8c0f00dfa980"}},"description":"0xae809a58eb62ac77b1a9c4b0ba4a3e3dc5024027de9f568cc91b66f1b7426feb4dfc61a5b8117c51c6a0c92f007a29ca","pubkey":"ae809a58eb62ac77b1a9c4b0ba4a3e3dc5024027de9f568cc91b66f1b7426feb4dfc61a5b8117c51c6a0c92f007a29ca","path":"","uuid":"50ed2d49-fd6f-4e32-99e5-05a357b451a6","version":4} \ No newline at end of file diff --git a/ops-bedrock/beacon-data/data/keys/0xaf88318ed207829fe806e3a78499a64d13b0cf033812d949cf0f0446bba2fc38fc50a311156c3439f11885b05a340f74/voting-keystore.json b/ops-bedrock/beacon-data/data/keys/0xaf88318ed207829fe806e3a78499a64d13b0cf033812d949cf0f0446bba2fc38fc50a311156c3439f11885b05a340f74/voting-keystore.json new file mode 100644 index 000000000000..a6c023eb47c0 --- /dev/null +++ b/ops-bedrock/beacon-data/data/keys/0xaf88318ed207829fe806e3a78499a64d13b0cf033812d949cf0f0446bba2fc38fc50a311156c3439f11885b05a340f74/voting-keystore.json @@ -0,0 +1 @@ +{"crypto":{"kdf":{"function":"pbkdf2","params":{"dklen":32,"c":262144,"prf":"hmac-sha256","salt":"69361a0225b597776b65529a5268695afdf7c4cd28e7f90909766904701036d5"},"message":""},"checksum":{"function":"sha256","params":{},"message":"084d097dcce0b0df53c6a1b20d3dbb93c9b11cef8822153c1fd4f9853ed06d43"},"cipher":{"function":"aes-128-ctr","params":{"iv":"be7718e336eb310145f16f834b1e2a0f"},"message":"adfbc37561cbe1aeb30ac4f3fa761ee51d8b11e5aa2abf656bf66bbe6322544a"}},"description":"0xaf88318ed207829fe806e3a78499a64d13b0cf033812d949cf0f0446bba2fc38fc50a311156c3439f11885b05a340f74","pubkey":"af88318ed207829fe806e3a78499a64d13b0cf033812d949cf0f0446bba2fc38fc50a311156c3439f11885b05a340f74","path":"","uuid":"f7cc37c5-0aca-4fa0-bd05-16bdcfe3f717","version":4} \ No newline at end of file diff --git a/ops-bedrock/beacon-data/data/keys/0xaff9f2432d328bba781aa2a6bac512a225d2a528cbe83eeb542c3e51defa5e6c4681955f2a5300f23b98e86aa64fb735/voting-keystore.json b/ops-bedrock/beacon-data/data/keys/0xaff9f2432d328bba781aa2a6bac512a225d2a528cbe83eeb542c3e51defa5e6c4681955f2a5300f23b98e86aa64fb735/voting-keystore.json new file mode 100644 index 000000000000..1dbb97e418f5 --- /dev/null +++ b/ops-bedrock/beacon-data/data/keys/0xaff9f2432d328bba781aa2a6bac512a225d2a528cbe83eeb542c3e51defa5e6c4681955f2a5300f23b98e86aa64fb735/voting-keystore.json @@ -0,0 +1 @@ +{"crypto":{"kdf":{"function":"pbkdf2","params":{"dklen":32,"c":262144,"prf":"hmac-sha256","salt":"f6775f8e221aa31b35a0c18b2c40f92eb0b38e8030d90db3015c1f1c58fc9556"},"message":""},"checksum":{"function":"sha256","params":{},"message":"15f2f960449114b53943779ba11638fb4901f34a2daa0fc2db86c38a67cceb88"},"cipher":{"function":"aes-128-ctr","params":{"iv":"e2f8295bbd79b81a9262fd9793592e0c"},"message":"c3ccdf3ae5d9521790484bf30927dd4df5538089769867937f59366a7cc7a516"}},"description":"0xaff9f2432d328bba781aa2a6bac512a225d2a528cbe83eeb542c3e51defa5e6c4681955f2a5300f23b98e86aa64fb735","pubkey":"aff9f2432d328bba781aa2a6bac512a225d2a528cbe83eeb542c3e51defa5e6c4681955f2a5300f23b98e86aa64fb735","path":"","uuid":"74842e8b-3c17-4e34-8301-c2da372a4f2c","version":4} \ No newline at end of file diff --git a/ops-bedrock/beacon-data/data/keys/0xb0591fe44b7eba93e4f088344d0b924bbe3c7ed9bfb42bf0193ea020f2c7eb8a53c8ebcb0d0f929201c399230005f3e7/voting-keystore.json b/ops-bedrock/beacon-data/data/keys/0xb0591fe44b7eba93e4f088344d0b924bbe3c7ed9bfb42bf0193ea020f2c7eb8a53c8ebcb0d0f929201c399230005f3e7/voting-keystore.json new file mode 100644 index 000000000000..d17752ddc799 --- /dev/null +++ b/ops-bedrock/beacon-data/data/keys/0xb0591fe44b7eba93e4f088344d0b924bbe3c7ed9bfb42bf0193ea020f2c7eb8a53c8ebcb0d0f929201c399230005f3e7/voting-keystore.json @@ -0,0 +1 @@ +{"crypto":{"kdf":{"function":"pbkdf2","params":{"dklen":32,"c":262144,"prf":"hmac-sha256","salt":"8018c4ef812975a38c1bcdfe1ea416788f3d75f2eed253dd66169a36cdccd980"},"message":""},"checksum":{"function":"sha256","params":{},"message":"f61b31ecb3442886834db3d876e6335040dd3aa79628710b7a71ace7b2a57bd3"},"cipher":{"function":"aes-128-ctr","params":{"iv":"ba502cb72793bbecf09bd2abd1f9eb91"},"message":"2ffd8d94499affce1a12fdb56f64dd4e121fa2e7785e64c434f07af939297825"}},"description":"0xb0591fe44b7eba93e4f088344d0b924bbe3c7ed9bfb42bf0193ea020f2c7eb8a53c8ebcb0d0f929201c399230005f3e7","pubkey":"b0591fe44b7eba93e4f088344d0b924bbe3c7ed9bfb42bf0193ea020f2c7eb8a53c8ebcb0d0f929201c399230005f3e7","path":"","uuid":"35466570-87e6-4fa6-9501-c51b237c3264","version":4} \ No newline at end of file diff --git a/ops-bedrock/beacon-data/data/keys/0xb154fd14f7e9c617a1845078cc17f838621b4cfc1279eb11bd11afa4d913f0230cf81feda1f2b0f7bd7eb7a26d51cd28/voting-keystore.json b/ops-bedrock/beacon-data/data/keys/0xb154fd14f7e9c617a1845078cc17f838621b4cfc1279eb11bd11afa4d913f0230cf81feda1f2b0f7bd7eb7a26d51cd28/voting-keystore.json new file mode 100644 index 000000000000..db40a48e9bd7 --- /dev/null +++ b/ops-bedrock/beacon-data/data/keys/0xb154fd14f7e9c617a1845078cc17f838621b4cfc1279eb11bd11afa4d913f0230cf81feda1f2b0f7bd7eb7a26d51cd28/voting-keystore.json @@ -0,0 +1 @@ +{"crypto":{"kdf":{"function":"pbkdf2","params":{"dklen":32,"c":262144,"prf":"hmac-sha256","salt":"9bdf0f8ada04db3009f371f03f9982b1226bf643c6bf061c0a5cfdff450abeae"},"message":""},"checksum":{"function":"sha256","params":{},"message":"dc5aae2966367d7df5db0142c6fd9d843728871020d3033f22fba235ffa5c002"},"cipher":{"function":"aes-128-ctr","params":{"iv":"b9261a9008e086c50b590b726d2cba12"},"message":"452be06e5336656fa83ed2ce330f6a0ac604e916603d05aade62d30bf3084e95"}},"description":"0xb154fd14f7e9c617a1845078cc17f838621b4cfc1279eb11bd11afa4d913f0230cf81feda1f2b0f7bd7eb7a26d51cd28","pubkey":"b154fd14f7e9c617a1845078cc17f838621b4cfc1279eb11bd11afa4d913f0230cf81feda1f2b0f7bd7eb7a26d51cd28","path":"","uuid":"40d4cb00-c0e0-481a-9260-352284d6931a","version":4} \ No newline at end of file diff --git a/ops-bedrock/beacon-data/data/keys/0xb178bccfd693edfb8d163a2050dfb251b2a4d5b4e4a7b3787354964159d9f4d0890a263601eeeff5c8a0663486b3fca8/voting-keystore.json b/ops-bedrock/beacon-data/data/keys/0xb178bccfd693edfb8d163a2050dfb251b2a4d5b4e4a7b3787354964159d9f4d0890a263601eeeff5c8a0663486b3fca8/voting-keystore.json new file mode 100644 index 000000000000..4dd1208a6fc9 --- /dev/null +++ b/ops-bedrock/beacon-data/data/keys/0xb178bccfd693edfb8d163a2050dfb251b2a4d5b4e4a7b3787354964159d9f4d0890a263601eeeff5c8a0663486b3fca8/voting-keystore.json @@ -0,0 +1 @@ +{"crypto":{"kdf":{"function":"pbkdf2","params":{"dklen":32,"c":262144,"prf":"hmac-sha256","salt":"b052e1293f780d4f59fdca1d5a04bfe955b7cc217f355d0d93fe68e3afa7da3d"},"message":""},"checksum":{"function":"sha256","params":{},"message":"8464b7a7202ce59cda9ba32bc7cbdf45bb2bf56ba2979cf17d0e0b2e1be91ca4"},"cipher":{"function":"aes-128-ctr","params":{"iv":"b88305786708e267a2b53d98bbb4b356"},"message":"c5a00ed0a845f9156c897bd17fd283ab3d49c3fe89b250a2879f54232fc650dd"}},"description":"0xb178bccfd693edfb8d163a2050dfb251b2a4d5b4e4a7b3787354964159d9f4d0890a263601eeeff5c8a0663486b3fca8","pubkey":"b178bccfd693edfb8d163a2050dfb251b2a4d5b4e4a7b3787354964159d9f4d0890a263601eeeff5c8a0663486b3fca8","path":"","uuid":"4294e300-689f-40c7-9163-c00f85a6bccb","version":4} \ No newline at end of file diff --git a/ops-bedrock/beacon-data/data/keys/0xb22df594adad3ae08c339d6e2079ec7b4c69cab5e8f5fb55680221ba40ffcd384844639a8775af10f3d02d10a5b18dab/voting-keystore.json b/ops-bedrock/beacon-data/data/keys/0xb22df594adad3ae08c339d6e2079ec7b4c69cab5e8f5fb55680221ba40ffcd384844639a8775af10f3d02d10a5b18dab/voting-keystore.json new file mode 100644 index 000000000000..3a323476e4df --- /dev/null +++ b/ops-bedrock/beacon-data/data/keys/0xb22df594adad3ae08c339d6e2079ec7b4c69cab5e8f5fb55680221ba40ffcd384844639a8775af10f3d02d10a5b18dab/voting-keystore.json @@ -0,0 +1 @@ +{"crypto":{"kdf":{"function":"pbkdf2","params":{"dklen":32,"c":262144,"prf":"hmac-sha256","salt":"2b68195855fe007ea47dbaf06854e0c013a5eacd92f0bb8de04b5e733c7bcf53"},"message":""},"checksum":{"function":"sha256","params":{},"message":"9db460ecd97d68516c6c8c95de3b584dcc638c59bc279c250ea33bb14e1f90e5"},"cipher":{"function":"aes-128-ctr","params":{"iv":"09a47646d984c74c0c5e3eeb4fa36cb0"},"message":"b73778ed355bcb1b96988cc50c5b298159e7aff6c2047bc0ce85c2bcab50c525"}},"description":"0xb22df594adad3ae08c339d6e2079ec7b4c69cab5e8f5fb55680221ba40ffcd384844639a8775af10f3d02d10a5b18dab","pubkey":"b22df594adad3ae08c339d6e2079ec7b4c69cab5e8f5fb55680221ba40ffcd384844639a8775af10f3d02d10a5b18dab","path":"","uuid":"44458937-3370-4fff-924f-1d45280dd915","version":4} \ No newline at end of file diff --git a/ops-bedrock/beacon-data/data/keys/0xb2c65e1c252c703d96a29edc5e4b6d22b905a560842a2cebe06842182e9bc783e7be6def84e8332173e120c8fdd633f1/voting-keystore.json b/ops-bedrock/beacon-data/data/keys/0xb2c65e1c252c703d96a29edc5e4b6d22b905a560842a2cebe06842182e9bc783e7be6def84e8332173e120c8fdd633f1/voting-keystore.json new file mode 100644 index 000000000000..252c1a4358ea --- /dev/null +++ b/ops-bedrock/beacon-data/data/keys/0xb2c65e1c252c703d96a29edc5e4b6d22b905a560842a2cebe06842182e9bc783e7be6def84e8332173e120c8fdd633f1/voting-keystore.json @@ -0,0 +1 @@ +{"crypto":{"kdf":{"function":"pbkdf2","params":{"dklen":32,"c":262144,"prf":"hmac-sha256","salt":"172f598c2094d101f495e0fb5810dd13cb6028426740841fbc40b1488d7a5e37"},"message":""},"checksum":{"function":"sha256","params":{},"message":"b6bca817fe232b3310f057c41c207f9c9cbcbfd3ba960d869ef0060ebb70f414"},"cipher":{"function":"aes-128-ctr","params":{"iv":"0ebe408ff1c454481b322a843a6b5e45"},"message":"7a05be68d7e6eb885c14c6d63335891c5bbe221080d9c2e4d392a40db8a990af"}},"description":"0xb2c65e1c252c703d96a29edc5e4b6d22b905a560842a2cebe06842182e9bc783e7be6def84e8332173e120c8fdd633f1","pubkey":"b2c65e1c252c703d96a29edc5e4b6d22b905a560842a2cebe06842182e9bc783e7be6def84e8332173e120c8fdd633f1","path":"","uuid":"8768f03f-8521-4590-8ab5-b48b535b9cce","version":4} \ No newline at end of file diff --git a/ops-bedrock/beacon-data/data/keys/0xb35142bcfe0b34acd33d38a42af340f3d4c033a5ded38b7cb186ca368c011d39cf82f782d810c6941e541b8df9041940/voting-keystore.json b/ops-bedrock/beacon-data/data/keys/0xb35142bcfe0b34acd33d38a42af340f3d4c033a5ded38b7cb186ca368c011d39cf82f782d810c6941e541b8df9041940/voting-keystore.json new file mode 100644 index 000000000000..3d63ff22cf68 --- /dev/null +++ b/ops-bedrock/beacon-data/data/keys/0xb35142bcfe0b34acd33d38a42af340f3d4c033a5ded38b7cb186ca368c011d39cf82f782d810c6941e541b8df9041940/voting-keystore.json @@ -0,0 +1 @@ +{"crypto":{"kdf":{"function":"pbkdf2","params":{"dklen":32,"c":262144,"prf":"hmac-sha256","salt":"3b38d4a0a1e98af0ecf09e5143977d555e67c1e442e8c97e4d886f533158a949"},"message":""},"checksum":{"function":"sha256","params":{},"message":"cc90c4fc06312d486af9344f0a984fb66c2d5e988debfc24c608c5a5869a5b47"},"cipher":{"function":"aes-128-ctr","params":{"iv":"1ff23925adda4503082fd3f3266fc0f7"},"message":"0ecb62eee6351b0048b75f55cb9ccf3a8db83f9a995869ef3e6d8ec9c49513de"}},"description":"0xb35142bcfe0b34acd33d38a42af340f3d4c033a5ded38b7cb186ca368c011d39cf82f782d810c6941e541b8df9041940","pubkey":"b35142bcfe0b34acd33d38a42af340f3d4c033a5ded38b7cb186ca368c011d39cf82f782d810c6941e541b8df9041940","path":"","uuid":"8c0d8f10-047f-4ea8-8f2f-00ca5b2163b9","version":4} \ No newline at end of file diff --git a/ops-bedrock/beacon-data/data/keys/0xb37774192885fd4974e3621e13020acb2208c2b25f0754d3ee5d606fe98da22f9dc64db33d9744422250f643594c0b2b/voting-keystore.json b/ops-bedrock/beacon-data/data/keys/0xb37774192885fd4974e3621e13020acb2208c2b25f0754d3ee5d606fe98da22f9dc64db33d9744422250f643594c0b2b/voting-keystore.json new file mode 100644 index 000000000000..beacfe7a15de --- /dev/null +++ b/ops-bedrock/beacon-data/data/keys/0xb37774192885fd4974e3621e13020acb2208c2b25f0754d3ee5d606fe98da22f9dc64db33d9744422250f643594c0b2b/voting-keystore.json @@ -0,0 +1 @@ +{"crypto":{"kdf":{"function":"pbkdf2","params":{"dklen":32,"c":262144,"prf":"hmac-sha256","salt":"7101309649b9a6f975535fe18e535f7d1670a3398ed1ca01ab267766d5e8972a"},"message":""},"checksum":{"function":"sha256","params":{},"message":"3d7b66005e008f50ceb2058c8cb671b5615e6c4d7d59fe41e5cb099ef1c5e78e"},"cipher":{"function":"aes-128-ctr","params":{"iv":"7e000b001c57805226c6f77b19abd454"},"message":"f7720aabec498d140fcb2af93d0a9f648c7350a2d258a6a79ae1dd177309b059"}},"description":"0xb37774192885fd4974e3621e13020acb2208c2b25f0754d3ee5d606fe98da22f9dc64db33d9744422250f643594c0b2b","pubkey":"b37774192885fd4974e3621e13020acb2208c2b25f0754d3ee5d606fe98da22f9dc64db33d9744422250f643594c0b2b","path":"","uuid":"c2ffefc5-8f61-47dc-8deb-99b66f6b0a04","version":4} \ No newline at end of file diff --git a/ops-bedrock/beacon-data/data/keys/0xb4a484c89a1f85c32773f80e915a1441d7e83db65e06382f5eb7660eee9ebff358fc1aa72a1d5b0df058247cd1ba3c00/voting-keystore.json b/ops-bedrock/beacon-data/data/keys/0xb4a484c89a1f85c32773f80e915a1441d7e83db65e06382f5eb7660eee9ebff358fc1aa72a1d5b0df058247cd1ba3c00/voting-keystore.json new file mode 100644 index 000000000000..9a8c46500934 --- /dev/null +++ b/ops-bedrock/beacon-data/data/keys/0xb4a484c89a1f85c32773f80e915a1441d7e83db65e06382f5eb7660eee9ebff358fc1aa72a1d5b0df058247cd1ba3c00/voting-keystore.json @@ -0,0 +1 @@ +{"crypto":{"kdf":{"function":"pbkdf2","params":{"dklen":32,"c":262144,"prf":"hmac-sha256","salt":"6e57641abffdb125c27390db562810ebeb25a639ccb42ff3af4513bcdd7d01c6"},"message":""},"checksum":{"function":"sha256","params":{},"message":"0c87786713fe9ba0fc5cb883c6c65be7e984652bcff8ac24a78c52d9411fba5e"},"cipher":{"function":"aes-128-ctr","params":{"iv":"bbe48b3eeb08fb07d61ae2644ffc697d"},"message":"a9c99159be91c880a1b3ffa597cb095ad8634cd39839a4d19c4723285c00fd0e"}},"description":"0xb4a484c89a1f85c32773f80e915a1441d7e83db65e06382f5eb7660eee9ebff358fc1aa72a1d5b0df058247cd1ba3c00","pubkey":"b4a484c89a1f85c32773f80e915a1441d7e83db65e06382f5eb7660eee9ebff358fc1aa72a1d5b0df058247cd1ba3c00","path":"","uuid":"6ce5f12f-61a5-4f8b-8deb-64f2f831a33c","version":4} \ No newline at end of file diff --git a/ops-bedrock/beacon-data/data/keys/0xb505fbc0beb4fef613b0720292aa7d74b59ee7ae38055f5b0358f26c52df26bfb1a0ac8d486f581e420cac39eaf18dda/voting-keystore.json b/ops-bedrock/beacon-data/data/keys/0xb505fbc0beb4fef613b0720292aa7d74b59ee7ae38055f5b0358f26c52df26bfb1a0ac8d486f581e420cac39eaf18dda/voting-keystore.json new file mode 100644 index 000000000000..db1e25fb89f8 --- /dev/null +++ b/ops-bedrock/beacon-data/data/keys/0xb505fbc0beb4fef613b0720292aa7d74b59ee7ae38055f5b0358f26c52df26bfb1a0ac8d486f581e420cac39eaf18dda/voting-keystore.json @@ -0,0 +1 @@ +{"crypto":{"kdf":{"function":"pbkdf2","params":{"dklen":32,"c":262144,"prf":"hmac-sha256","salt":"380b07e2564a8cac4fe2f9a8e70cd413fc7e2c0b6611a896f632c3d9d8d59083"},"message":""},"checksum":{"function":"sha256","params":{},"message":"3eae14dbf38f8c232e0e98d6a919a99902bf6db1c28a50d4f078fe480a7bcbef"},"cipher":{"function":"aes-128-ctr","params":{"iv":"135795b94e9176628938ea27b1448c18"},"message":"9437d23478c335383b15cd0f7ac97b5b8de1dd19e09ee8a124e4c8e010df2d79"}},"description":"0xb505fbc0beb4fef613b0720292aa7d74b59ee7ae38055f5b0358f26c52df26bfb1a0ac8d486f581e420cac39eaf18dda","pubkey":"b505fbc0beb4fef613b0720292aa7d74b59ee7ae38055f5b0358f26c52df26bfb1a0ac8d486f581e420cac39eaf18dda","path":"","uuid":"c89f01f9-cf26-4490-9f51-08be15bb5620","version":4} \ No newline at end of file diff --git a/ops-bedrock/beacon-data/data/keys/0xb563024394c9553c1123af15dce2630b60eaaafd74a1787ad9d65352df66090479d5b0798ba3792595089866d8ecdd5f/voting-keystore.json b/ops-bedrock/beacon-data/data/keys/0xb563024394c9553c1123af15dce2630b60eaaafd74a1787ad9d65352df66090479d5b0798ba3792595089866d8ecdd5f/voting-keystore.json new file mode 100644 index 000000000000..40db0bf99853 --- /dev/null +++ b/ops-bedrock/beacon-data/data/keys/0xb563024394c9553c1123af15dce2630b60eaaafd74a1787ad9d65352df66090479d5b0798ba3792595089866d8ecdd5f/voting-keystore.json @@ -0,0 +1 @@ +{"crypto":{"kdf":{"function":"pbkdf2","params":{"dklen":32,"c":262144,"prf":"hmac-sha256","salt":"b99cc319e921e81082003ad54946ffe63653781db688bb9474c95e65c19663e8"},"message":""},"checksum":{"function":"sha256","params":{},"message":"49f8ff6a33a6be497a08c1d6b5ad41efa56a60611a9240fcb7b0c7dbab18f7fa"},"cipher":{"function":"aes-128-ctr","params":{"iv":"93178e5594c35ce1986066839b32df23"},"message":"78a6553f90d44c6af77fc75fa2bbd5c3a3114c720139770eac2bd6206b31153c"}},"description":"0xb563024394c9553c1123af15dce2630b60eaaafd74a1787ad9d65352df66090479d5b0798ba3792595089866d8ecdd5f","pubkey":"b563024394c9553c1123af15dce2630b60eaaafd74a1787ad9d65352df66090479d5b0798ba3792595089866d8ecdd5f","path":"","uuid":"6b778f94-7d07-49c2-ad10-a334b5435346","version":4} \ No newline at end of file diff --git a/ops-bedrock/beacon-data/data/keys/0xb5889b85291f380a80e2cdf02fc62edf4041ef1fb0810b01ebbaacf917c0d54f4bc1454c6772b91baf695652cc9c3f85/voting-keystore.json b/ops-bedrock/beacon-data/data/keys/0xb5889b85291f380a80e2cdf02fc62edf4041ef1fb0810b01ebbaacf917c0d54f4bc1454c6772b91baf695652cc9c3f85/voting-keystore.json new file mode 100644 index 000000000000..184c8f2b0013 --- /dev/null +++ b/ops-bedrock/beacon-data/data/keys/0xb5889b85291f380a80e2cdf02fc62edf4041ef1fb0810b01ebbaacf917c0d54f4bc1454c6772b91baf695652cc9c3f85/voting-keystore.json @@ -0,0 +1 @@ +{"crypto":{"kdf":{"function":"pbkdf2","params":{"dklen":32,"c":262144,"prf":"hmac-sha256","salt":"d60da113c05ee0a915b564df12876a02d6e49e427159e9506fca3088eed85c00"},"message":""},"checksum":{"function":"sha256","params":{},"message":"7d042a0c26c8cae7258a6e4176238fbfd57e7cdf743de8f18b18db5a0aeed007"},"cipher":{"function":"aes-128-ctr","params":{"iv":"92e52ff15f7473736cedc21f09c3e497"},"message":"75243951e7fc1bd604f6047f2500d1a795be70b391594e6cc136189a5e571c48"}},"description":"0xb5889b85291f380a80e2cdf02fc62edf4041ef1fb0810b01ebbaacf917c0d54f4bc1454c6772b91baf695652cc9c3f85","pubkey":"b5889b85291f380a80e2cdf02fc62edf4041ef1fb0810b01ebbaacf917c0d54f4bc1454c6772b91baf695652cc9c3f85","path":"","uuid":"fc3e10e3-e3e0-4296-baec-94da9fa7b5b4","version":4} \ No newline at end of file diff --git a/ops-bedrock/beacon-data/data/keys/0xb7f682183f898daaf1b98f9e946c1ad58818fcf19d1922e867b8d54549d5551d39de3bba0b7d919e82b97f8dedbad03e/voting-keystore.json b/ops-bedrock/beacon-data/data/keys/0xb7f682183f898daaf1b98f9e946c1ad58818fcf19d1922e867b8d54549d5551d39de3bba0b7d919e82b97f8dedbad03e/voting-keystore.json new file mode 100644 index 000000000000..0d225d069cb5 --- /dev/null +++ b/ops-bedrock/beacon-data/data/keys/0xb7f682183f898daaf1b98f9e946c1ad58818fcf19d1922e867b8d54549d5551d39de3bba0b7d919e82b97f8dedbad03e/voting-keystore.json @@ -0,0 +1 @@ +{"crypto":{"kdf":{"function":"pbkdf2","params":{"dklen":32,"c":262144,"prf":"hmac-sha256","salt":"5a53739f02a96aef4902ebdf96bf1872b60125642e53d5a10f9552dba96af6be"},"message":""},"checksum":{"function":"sha256","params":{},"message":"992dabe558a5d2d454ca5c7488c6d78bce532876fd91d036cbf8804bfd63656f"},"cipher":{"function":"aes-128-ctr","params":{"iv":"faaf681ecba50dbfa1ba2877f67de2ed"},"message":"c6f0e4e0ef3c4544b5179473c8e92162994e803f390b63268d92eefec4a3bc18"}},"description":"0xb7f682183f898daaf1b98f9e946c1ad58818fcf19d1922e867b8d54549d5551d39de3bba0b7d919e82b97f8dedbad03e","pubkey":"b7f682183f898daaf1b98f9e946c1ad58818fcf19d1922e867b8d54549d5551d39de3bba0b7d919e82b97f8dedbad03e","path":"","uuid":"b1a41408-ce99-478c-956e-2dfcd4abe6f0","version":4} \ No newline at end of file diff --git a/ops-bedrock/beacon-data/data/keys/0xb88c17f529454d0305f27188d32f1aea28a82881d32a1e30e7b01c9aa53b9a9ea01a3706852b4c97c9eaa42e670e9382/voting-keystore.json b/ops-bedrock/beacon-data/data/keys/0xb88c17f529454d0305f27188d32f1aea28a82881d32a1e30e7b01c9aa53b9a9ea01a3706852b4c97c9eaa42e670e9382/voting-keystore.json new file mode 100644 index 000000000000..61a192d830f3 --- /dev/null +++ b/ops-bedrock/beacon-data/data/keys/0xb88c17f529454d0305f27188d32f1aea28a82881d32a1e30e7b01c9aa53b9a9ea01a3706852b4c97c9eaa42e670e9382/voting-keystore.json @@ -0,0 +1 @@ +{"crypto":{"kdf":{"function":"pbkdf2","params":{"dklen":32,"c":262144,"prf":"hmac-sha256","salt":"f28076ca0b7b9172797308a6f1026665241b9668f4147c98d00fc127b0b4c739"},"message":""},"checksum":{"function":"sha256","params":{},"message":"1c97cb02c1ef57e75dc29535db65f46f0b11f609fcbab7d5e1d3890e99ffd554"},"cipher":{"function":"aes-128-ctr","params":{"iv":"7bdedf2d5c2816367b802f911487a473"},"message":"7334bf6461da3a5b67649604d893c30f26978a061ba33560ec94596cee790bb0"}},"description":"0xb88c17f529454d0305f27188d32f1aea28a82881d32a1e30e7b01c9aa53b9a9ea01a3706852b4c97c9eaa42e670e9382","pubkey":"b88c17f529454d0305f27188d32f1aea28a82881d32a1e30e7b01c9aa53b9a9ea01a3706852b4c97c9eaa42e670e9382","path":"","uuid":"8c62e3c2-afc2-41d8-8823-d7db51423830","version":4} \ No newline at end of file diff --git a/ops-bedrock/beacon-data/data/keys/0xb88c4324866296a28c22416988207436ec2878ec617c048ce44da43e97381a0960df8b5c53bdcb2692341776b1ada34e/voting-keystore.json b/ops-bedrock/beacon-data/data/keys/0xb88c4324866296a28c22416988207436ec2878ec617c048ce44da43e97381a0960df8b5c53bdcb2692341776b1ada34e/voting-keystore.json new file mode 100644 index 000000000000..1cd1b964630e --- /dev/null +++ b/ops-bedrock/beacon-data/data/keys/0xb88c4324866296a28c22416988207436ec2878ec617c048ce44da43e97381a0960df8b5c53bdcb2692341776b1ada34e/voting-keystore.json @@ -0,0 +1 @@ +{"crypto":{"kdf":{"function":"pbkdf2","params":{"dklen":32,"c":262144,"prf":"hmac-sha256","salt":"a6bd1dc3b36b1d37c82a1c6f65b29f68cf85578107d9ffe3add770bb4217f801"},"message":""},"checksum":{"function":"sha256","params":{},"message":"7ea9c34421f3c8bfcfca5d65db944ddb577b77acf8df7d713b1bdf8aca8a58e2"},"cipher":{"function":"aes-128-ctr","params":{"iv":"aaea09d9d3f2a9cb40194ad80c4a98ba"},"message":"48c608dc58e469983dfbca9df33dc7ea856931a561cae1f8bd8a4a471e7f5ca5"}},"description":"0xb88c4324866296a28c22416988207436ec2878ec617c048ce44da43e97381a0960df8b5c53bdcb2692341776b1ada34e","pubkey":"b88c4324866296a28c22416988207436ec2878ec617c048ce44da43e97381a0960df8b5c53bdcb2692341776b1ada34e","path":"","uuid":"17fc3aca-5d4e-4af1-9d90-66508e4bccc3","version":4} \ No newline at end of file diff --git a/ops-bedrock/beacon-data/data/pubkeys.json b/ops-bedrock/beacon-data/data/pubkeys.json new file mode 100644 index 000000000000..1658350caf7e --- /dev/null +++ b/ops-bedrock/beacon-data/data/pubkeys.json @@ -0,0 +1 @@ +["0xa39882700ed7f72fcdbac07081b7c0c912cb8647ed8494926e6c9c2fc1a7415c7c60e3afcc3d3278fe25b50b851c3ad5","0x8efdefbccd6479b9953a5ec6416e6d48201865968567379b213040dbf0be7efa00d66343c21a7e801d6bfd7403cfcfa7","0xb7f682183f898daaf1b98f9e946c1ad58818fcf19d1922e867b8d54549d5551d39de3bba0b7d919e82b97f8dedbad03e","0xa8a4c939ec0ee6ff6c58ace82cb82a603fd246defc10fdb37f6d66b5d1f2a1f9fa962547f87ec3aa611402f00bcec0a8","0xaf88318ed207829fe806e3a78499a64d13b0cf033812d949cf0f0446bba2fc38fc50a311156c3439f11885b05a340f74","0xaacaf07d7ade408847d18ef8410f6da332ab0a370c337007e64ce98343369aac023e825f2b8e72e8ed34e2b064577a4b","0xae809a58eb62ac77b1a9c4b0ba4a3e3dc5024027de9f568cc91b66f1b7426feb4dfc61a5b8117c51c6a0c92f007a29ca","0x980f54178ab1e2d21822e9cd7327acb170269e6215cc8151f5f9c74d3e9ed4fd8e2d5b03c0d5b187edf0b56b6d2fc2fc","0xa86404df6d392d2ba08e01a3a967bfd58f081f45bec4e68bf91302f1918870f80719e78a33fa95c520e929e0d58bf38c","0xa2794c3671f0520ffa1032dac4ef67b0a00a65255e522449bf8cabd775db13dd22871f64e710a09344739ef66c1f578f","0x858b74656127a05134b7614d5fba180e97739c99cf60a42498f1e9c7eda0a88a5fce2d8bc8df5010a5260f96db1b132b","0xb4a484c89a1f85c32773f80e915a1441d7e83db65e06382f5eb7660eee9ebff358fc1aa72a1d5b0df058247cd1ba3c00","0xa90d4602211e30aa9f2d0fdb179bd113492028ca5e0da87871c18777fa8ecd3162a4085ddf7582f65803111715a22d01","0xb22df594adad3ae08c339d6e2079ec7b4c69cab5e8f5fb55680221ba40ffcd384844639a8775af10f3d02d10a5b18dab","0x89931c9f649137fe9a6d59a455bcc695af861fa080fef0d598cc2ae66ed193939d12e72cf0a6f081ada36b4090f864cc","0x88091d52b099523e2717d3a526f8a41a7ff20ca4e4b4d153ebafe6f9265e58f8aa45f1e415d598c758e684bcb376577b","0xa459e9ad0870b24aeb95d53b437014dc5dd97bbe38d78b51797da732e26e70e47ae97eb6d16ace2b7b21961fe9c27904","0xb88c4324866296a28c22416988207436ec2878ec617c048ce44da43e97381a0960df8b5c53bdcb2692341776b1ada34e","0x8bf7c9c9972045c582b7363af44e93da26aef3c8fce81a0469d0c5f48199312f73953ce3c3547b91f543b5586a307c38","0xae23fb1b0c76e4fd9800c18945094932655fa3a6aea990392c08c16e9816b3637b3818f609bf774e7277aa9901f1140a","0xa125a3659c269801fb2e00c8f38d6b6fbe91a85dc99691db008cf325ef4ca7443c6fbc8a9131acf885d6169f859b8b1c","0x847cddf22fe1483b2808f08bb98586deba65165fab87d7c60f8081af495c3d9ba234ce61150840ac28d8833f721b08d4","0x8dc5f6f45cc02e68b008e6035492c3c10835e9247899a5bccc559aa3158e581a71803401124d9fd4797476f33351b0d1","0xa77a318dd834183c3e3b3921c94b1dbb8d1bb2c619e0c492a592c2de5a91e73b5c054bba52619355ed34012386a7aa1d","0xb0591fe44b7eba93e4f088344d0b924bbe3c7ed9bfb42bf0193ea020f2c7eb8a53c8ebcb0d0f929201c399230005f3e7","0xb5889b85291f380a80e2cdf02fc62edf4041ef1fb0810b01ebbaacf917c0d54f4bc1454c6772b91baf695652cc9c3f85","0x935b301be1f67fc6a896b57309e546bfc1ae731a19b73777ca848fb81f4d8d7b9a5c1cf8ad54d5e1eda09f2095d848cb","0xb505fbc0beb4fef613b0720292aa7d74b59ee7ae38055f5b0358f26c52df26bfb1a0ac8d486f581e420cac39eaf18dda","0x961d5cb5deed3612dfbbbffccada34d5a940bcb9b8002452be08d3d69e69274a98854b140744d2640da797cbe910b1cd","0xa960c5230b2348f3121d891aeabb2d3598893f7d32c675b6a4ef40a1331fe4b9010150dffd379e3216b3dcf0edb23259","0xb37774192885fd4974e3621e13020acb2208c2b25f0754d3ee5d606fe98da22f9dc64db33d9744422250f643594c0b2b","0x85bc68a8c76d4f706648059fa2d3b387c86ee65082e5fc16713794c6c0f8277d37c72783abe1c47ad3de97bd33ef66a3","0xb563024394c9553c1123af15dce2630b60eaaafd74a1787ad9d65352df66090479d5b0798ba3792595089866d8ecdd5f","0x8f1e06e20ac5dd13518bd6c5e19c0a00a9dac968a13167087d9f8199bcb2e93fcb53199f2400ab2f398958761d7c33e6","0xa1ae1d14d16cf61a6ae0c9589a19a8f38e161f02dbd98c9f5400fc63689af3af2c146bcfb46f0d94469502947d19d6df","0x95419a10ad9771dc7545637bc14e4eb7938e0bcc57a42000ddbb117750570fb5ce290679d326a0783e6c780be23df6d8","0x89929f3a811cf44f70d60ccaa4571dff9371c73f60b70b7a50f2cf816861daeb14499b112890a200963d82d324c2ee8f","0x988085e2781db7997526af727a32b8660d4022251202f534ba6edda299d5b1fad5a706fe85cab523478abd5e10d68e51","0xa4662c910f9eda828898a0cddd61332aca5808be1efedb7aedae7978a0bc7f9d2a35baf97f913ca920c957c4e2b7a18c","0x9401d4c66e72e596e0072c27de5bcf3c99900011d36f01219b9e0dc54c852393378b4a0bd12084032c6f02de2dcf1296","0xb2c65e1c252c703d96a29edc5e4b6d22b905a560842a2cebe06842182e9bc783e7be6def84e8332173e120c8fdd633f1","0x82626f97b0fc009c2d2e098e2c3b21922c6525d314552674899953fbb1c4cb48d01966e80167f81b1a36e78e2a6362a9","0xb88c17f529454d0305f27188d32f1aea28a82881d32a1e30e7b01c9aa53b9a9ea01a3706852b4c97c9eaa42e670e9382","0xb178bccfd693edfb8d163a2050dfb251b2a4d5b4e4a7b3787354964159d9f4d0890a263601eeeff5c8a0663486b3fca8","0x95123a9757f7295b4cdfeb8808d9d7de69761477db3a34aabe2cb4bffc466b65618b91a0e2f33c95d23d38665d68c506","0x85242431f0f8a0e939f2e469d6d35473e72a9577bf81a5ae16b345cddf1c50eecc5c7520b9580d9717c166a9835664fd","0x8df81a9e3c61ff1cba9f13c792f1c933131b6d155e8b552d673df44fad4530b68c4e86e9cd2e5cc93a3b806c6b00f4a6","0x958979725c3497149c8f1ed2e3f073a56207ff17218ba3fef7fbcc6e07bbd7b8fc528ff646a49e9c1a145ed27017ef4d","0x8cf690a81a1eab3d0554acfc7087e0b9ad3dcd50b9612893f56bd1536b6865092f60e7cef0c81e2acf97f287f4d28d1d","0xa2ab702302efc9f00d6f50b367de843c24ef708f609b20205b46771f6603dd005a271aaeb589c4fc50cdf137ac66ff1a","0x91838562f203c048b60308d5dae4e845977b8bd946806886f91f23038df2759e9306efcb56f15d57498a68ee789bf5ce","0xb154fd14f7e9c617a1845078cc17f838621b4cfc1279eb11bd11afa4d913f0230cf81feda1f2b0f7bd7eb7a26d51cd28","0xa8b7eaa52875524b0b4716b56d2f377cb878ceb51b925c0a7fa4629f16b2a8161e28aed5c6446ff1889ab7473c86b6f3","0x89d3dbfe89713fa12d2735e2379da4391e22169e967cc93eac815fd4a5e4fd374b0a4e468a44ea6e1f6ca6072a6382c9","0x8c3d37929876321cfb221b3dca80feb1c38159ee83e01d1ad60fd16d9d2c78993a41643ec1e7af2d6a0ff8dfb05467ea","0xaff9f2432d328bba781aa2a6bac512a225d2a528cbe83eeb542c3e51defa5e6c4681955f2a5300f23b98e86aa64fb735","0x8b49344506042460fc40f4a60d64079e86a29e87cffe29ebd8908fd1803ca21f53c0665145291ea5e34b30a01dca7cb5","0xa3ed99f5e10128dcfa3553c0875021d57da6578892e368d97d6ca4b5d1da961523bde2765e21d64eed8b9eec079f3ff2","0xb35142bcfe0b34acd33d38a42af340f3d4c033a5ded38b7cb186ca368c011d39cf82f782d810c6941e541b8df9041940","0x8ca1bccbe513b4503f8496b8468c42718972718feff4e3d5eec970f3c56ac0e2a8d4d59ad331db9cbea643ea775314bb","0x99804a3e664ba9d8b0a91fdb6127f2753932e41c6f62d1c26edd5f81a12f0eb7bdc9df0d58121436cabd07261f2bcdbd","0x99729eb9833e428853a7444653824aac579864675d6c69c1fc79423f4aba0d51153a40f31c1082816ddb0cdce31bc6b2","0x87fa175dd34496aee3b88a482accaa19e271be98265981949c42769cd45b3d67afcc060167b2effc748ff15076b11b27","0xab0b0a68c9ab8ef73338f8ee1bce7bdfb4fdd1020b4163bec31b952651141db4c8db7fc4b0c97cb8645ad2a58344c1c8"] \ No newline at end of file diff --git a/ops-bedrock/beacon-data/data/secrets/0x82626f97b0fc009c2d2e098e2c3b21922c6525d314552674899953fbb1c4cb48d01966e80167f81b1a36e78e2a6362a9 b/ops-bedrock/beacon-data/data/secrets/0x82626f97b0fc009c2d2e098e2c3b21922c6525d314552674899953fbb1c4cb48d01966e80167f81b1a36e78e2a6362a9 new file mode 100644 index 000000000000..488967cd0508 --- /dev/null +++ b/ops-bedrock/beacon-data/data/secrets/0x82626f97b0fc009c2d2e098e2c3b21922c6525d314552674899953fbb1c4cb48d01966e80167f81b1a36e78e2a6362a9 @@ -0,0 +1 @@ +RWedmD9ymYgx42xq3acs0ZIKE0WmNn-_ov6k3R7Wy1Q= \ No newline at end of file diff --git a/ops-bedrock/beacon-data/data/secrets/0x847cddf22fe1483b2808f08bb98586deba65165fab87d7c60f8081af495c3d9ba234ce61150840ac28d8833f721b08d4 b/ops-bedrock/beacon-data/data/secrets/0x847cddf22fe1483b2808f08bb98586deba65165fab87d7c60f8081af495c3d9ba234ce61150840ac28d8833f721b08d4 new file mode 100644 index 000000000000..abfff12a9204 --- /dev/null +++ b/ops-bedrock/beacon-data/data/secrets/0x847cddf22fe1483b2808f08bb98586deba65165fab87d7c60f8081af495c3d9ba234ce61150840ac28d8833f721b08d4 @@ -0,0 +1 @@ +BBWYKt-cp94aMUH9eAoTjGLCNjTWRQXovxOQRcp121E= \ No newline at end of file diff --git a/ops-bedrock/beacon-data/data/secrets/0x85242431f0f8a0e939f2e469d6d35473e72a9577bf81a5ae16b345cddf1c50eecc5c7520b9580d9717c166a9835664fd b/ops-bedrock/beacon-data/data/secrets/0x85242431f0f8a0e939f2e469d6d35473e72a9577bf81a5ae16b345cddf1c50eecc5c7520b9580d9717c166a9835664fd new file mode 100644 index 000000000000..ea173188bd6d --- /dev/null +++ b/ops-bedrock/beacon-data/data/secrets/0x85242431f0f8a0e939f2e469d6d35473e72a9577bf81a5ae16b345cddf1c50eecc5c7520b9580d9717c166a9835664fd @@ -0,0 +1 @@ +ITzdIXkb3ZxOzrel2mcYuAs2SDnCZ1a0nR1Ic_zx0Aw= \ No newline at end of file diff --git a/ops-bedrock/beacon-data/data/secrets/0x858b74656127a05134b7614d5fba180e97739c99cf60a42498f1e9c7eda0a88a5fce2d8bc8df5010a5260f96db1b132b b/ops-bedrock/beacon-data/data/secrets/0x858b74656127a05134b7614d5fba180e97739c99cf60a42498f1e9c7eda0a88a5fce2d8bc8df5010a5260f96db1b132b new file mode 100644 index 000000000000..eb570db9befb --- /dev/null +++ b/ops-bedrock/beacon-data/data/secrets/0x858b74656127a05134b7614d5fba180e97739c99cf60a42498f1e9c7eda0a88a5fce2d8bc8df5010a5260f96db1b132b @@ -0,0 +1 @@ +bvWnGBs3lQGf4BAtrp5Iuiupv07h0iPPFjdplutSxsA= \ No newline at end of file diff --git a/ops-bedrock/beacon-data/data/secrets/0x85bc68a8c76d4f706648059fa2d3b387c86ee65082e5fc16713794c6c0f8277d37c72783abe1c47ad3de97bd33ef66a3 b/ops-bedrock/beacon-data/data/secrets/0x85bc68a8c76d4f706648059fa2d3b387c86ee65082e5fc16713794c6c0f8277d37c72783abe1c47ad3de97bd33ef66a3 new file mode 100644 index 000000000000..d40af61ccf6d --- /dev/null +++ b/ops-bedrock/beacon-data/data/secrets/0x85bc68a8c76d4f706648059fa2d3b387c86ee65082e5fc16713794c6c0f8277d37c72783abe1c47ad3de97bd33ef66a3 @@ -0,0 +1 @@ +cS4jmu5nYKVBHVohSqN1ETiLfQQ1xv1gyFMFYdTjwoA= \ No newline at end of file diff --git a/ops-bedrock/beacon-data/data/secrets/0x87fa175dd34496aee3b88a482accaa19e271be98265981949c42769cd45b3d67afcc060167b2effc748ff15076b11b27 b/ops-bedrock/beacon-data/data/secrets/0x87fa175dd34496aee3b88a482accaa19e271be98265981949c42769cd45b3d67afcc060167b2effc748ff15076b11b27 new file mode 100644 index 000000000000..771ba80fbe04 --- /dev/null +++ b/ops-bedrock/beacon-data/data/secrets/0x87fa175dd34496aee3b88a482accaa19e271be98265981949c42769cd45b3d67afcc060167b2effc748ff15076b11b27 @@ -0,0 +1 @@ +5RDrntwGa8Ww6pcpJArGw9jBWskh4JjsXiuW96HoJnE= \ No newline at end of file diff --git a/ops-bedrock/beacon-data/data/secrets/0x88091d52b099523e2717d3a526f8a41a7ff20ca4e4b4d153ebafe6f9265e58f8aa45f1e415d598c758e684bcb376577b b/ops-bedrock/beacon-data/data/secrets/0x88091d52b099523e2717d3a526f8a41a7ff20ca4e4b4d153ebafe6f9265e58f8aa45f1e415d598c758e684bcb376577b new file mode 100644 index 000000000000..b7a9d2966c48 --- /dev/null +++ b/ops-bedrock/beacon-data/data/secrets/0x88091d52b099523e2717d3a526f8a41a7ff20ca4e4b4d153ebafe6f9265e58f8aa45f1e415d598c758e684bcb376577b @@ -0,0 +1 @@ +sxZssLLNjSFWgCIHf96BuheAd0Faoa5A6vCPLmaO3lE= \ No newline at end of file diff --git a/ops-bedrock/beacon-data/data/secrets/0x89929f3a811cf44f70d60ccaa4571dff9371c73f60b70b7a50f2cf816861daeb14499b112890a200963d82d324c2ee8f b/ops-bedrock/beacon-data/data/secrets/0x89929f3a811cf44f70d60ccaa4571dff9371c73f60b70b7a50f2cf816861daeb14499b112890a200963d82d324c2ee8f new file mode 100644 index 000000000000..c26b47121e4e --- /dev/null +++ b/ops-bedrock/beacon-data/data/secrets/0x89929f3a811cf44f70d60ccaa4571dff9371c73f60b70b7a50f2cf816861daeb14499b112890a200963d82d324c2ee8f @@ -0,0 +1 @@ +Cb3xIltz1xEUBKHM3cLHjom2KLIzxuVppZYZFCOVPFo= \ No newline at end of file diff --git a/ops-bedrock/beacon-data/data/secrets/0x89931c9f649137fe9a6d59a455bcc695af861fa080fef0d598cc2ae66ed193939d12e72cf0a6f081ada36b4090f864cc b/ops-bedrock/beacon-data/data/secrets/0x89931c9f649137fe9a6d59a455bcc695af861fa080fef0d598cc2ae66ed193939d12e72cf0a6f081ada36b4090f864cc new file mode 100644 index 000000000000..daa8ee232485 --- /dev/null +++ b/ops-bedrock/beacon-data/data/secrets/0x89931c9f649137fe9a6d59a455bcc695af861fa080fef0d598cc2ae66ed193939d12e72cf0a6f081ada36b4090f864cc @@ -0,0 +1 @@ +cDIehrU9LbWJxAJrCCvdnbLBO84O2hbPBUpUGbTPVG4= \ No newline at end of file diff --git a/ops-bedrock/beacon-data/data/secrets/0x89d3dbfe89713fa12d2735e2379da4391e22169e967cc93eac815fd4a5e4fd374b0a4e468a44ea6e1f6ca6072a6382c9 b/ops-bedrock/beacon-data/data/secrets/0x89d3dbfe89713fa12d2735e2379da4391e22169e967cc93eac815fd4a5e4fd374b0a4e468a44ea6e1f6ca6072a6382c9 new file mode 100644 index 000000000000..4428585b6c23 --- /dev/null +++ b/ops-bedrock/beacon-data/data/secrets/0x89d3dbfe89713fa12d2735e2379da4391e22169e967cc93eac815fd4a5e4fd374b0a4e468a44ea6e1f6ca6072a6382c9 @@ -0,0 +1 @@ +rIVLQl8UiCnl9fQxH6HWU4qaz05GT9JlacgYdZmHO9E= \ No newline at end of file diff --git a/ops-bedrock/beacon-data/data/secrets/0x8b49344506042460fc40f4a60d64079e86a29e87cffe29ebd8908fd1803ca21f53c0665145291ea5e34b30a01dca7cb5 b/ops-bedrock/beacon-data/data/secrets/0x8b49344506042460fc40f4a60d64079e86a29e87cffe29ebd8908fd1803ca21f53c0665145291ea5e34b30a01dca7cb5 new file mode 100644 index 000000000000..57752047a3e0 --- /dev/null +++ b/ops-bedrock/beacon-data/data/secrets/0x8b49344506042460fc40f4a60d64079e86a29e87cffe29ebd8908fd1803ca21f53c0665145291ea5e34b30a01dca7cb5 @@ -0,0 +1 @@ +JGQYKE3we17Du-SKSLYOU3iZ02mI5TkGNIwlNEODOrM= \ No newline at end of file diff --git a/ops-bedrock/beacon-data/data/secrets/0x8bf7c9c9972045c582b7363af44e93da26aef3c8fce81a0469d0c5f48199312f73953ce3c3547b91f543b5586a307c38 b/ops-bedrock/beacon-data/data/secrets/0x8bf7c9c9972045c582b7363af44e93da26aef3c8fce81a0469d0c5f48199312f73953ce3c3547b91f543b5586a307c38 new file mode 100644 index 000000000000..d42664799198 --- /dev/null +++ b/ops-bedrock/beacon-data/data/secrets/0x8bf7c9c9972045c582b7363af44e93da26aef3c8fce81a0469d0c5f48199312f73953ce3c3547b91f543b5586a307c38 @@ -0,0 +1 @@ +5pRGymJxeKtsA3VTVPNMukRpc9AFyfwl0UKIUyILvow= \ No newline at end of file diff --git a/ops-bedrock/beacon-data/data/secrets/0x8c3d37929876321cfb221b3dca80feb1c38159ee83e01d1ad60fd16d9d2c78993a41643ec1e7af2d6a0ff8dfb05467ea b/ops-bedrock/beacon-data/data/secrets/0x8c3d37929876321cfb221b3dca80feb1c38159ee83e01d1ad60fd16d9d2c78993a41643ec1e7af2d6a0ff8dfb05467ea new file mode 100644 index 000000000000..8bd80ca0488b --- /dev/null +++ b/ops-bedrock/beacon-data/data/secrets/0x8c3d37929876321cfb221b3dca80feb1c38159ee83e01d1ad60fd16d9d2c78993a41643ec1e7af2d6a0ff8dfb05467ea @@ -0,0 +1 @@ +-j7XyeB6W1PCQRq421EirxwJUtItkPix191oekOWeaE= \ No newline at end of file diff --git a/ops-bedrock/beacon-data/data/secrets/0x8ca1bccbe513b4503f8496b8468c42718972718feff4e3d5eec970f3c56ac0e2a8d4d59ad331db9cbea643ea775314bb b/ops-bedrock/beacon-data/data/secrets/0x8ca1bccbe513b4503f8496b8468c42718972718feff4e3d5eec970f3c56ac0e2a8d4d59ad331db9cbea643ea775314bb new file mode 100644 index 000000000000..bafed88ed04d --- /dev/null +++ b/ops-bedrock/beacon-data/data/secrets/0x8ca1bccbe513b4503f8496b8468c42718972718feff4e3d5eec970f3c56ac0e2a8d4d59ad331db9cbea643ea775314bb @@ -0,0 +1 @@ +yUtc_Tf9RJIFgL6d9DUtwZXKQVMLT2ymAxDDriwpSQY= \ No newline at end of file diff --git a/ops-bedrock/beacon-data/data/secrets/0x8cf690a81a1eab3d0554acfc7087e0b9ad3dcd50b9612893f56bd1536b6865092f60e7cef0c81e2acf97f287f4d28d1d b/ops-bedrock/beacon-data/data/secrets/0x8cf690a81a1eab3d0554acfc7087e0b9ad3dcd50b9612893f56bd1536b6865092f60e7cef0c81e2acf97f287f4d28d1d new file mode 100644 index 000000000000..130af823f36c --- /dev/null +++ b/ops-bedrock/beacon-data/data/secrets/0x8cf690a81a1eab3d0554acfc7087e0b9ad3dcd50b9612893f56bd1536b6865092f60e7cef0c81e2acf97f287f4d28d1d @@ -0,0 +1 @@ +Z4tBZE4gG7lwsAJwHvr5Vy9C3FJX59oPG73VSshs6NQ= \ No newline at end of file diff --git a/ops-bedrock/beacon-data/data/secrets/0x8dc5f6f45cc02e68b008e6035492c3c10835e9247899a5bccc559aa3158e581a71803401124d9fd4797476f33351b0d1 b/ops-bedrock/beacon-data/data/secrets/0x8dc5f6f45cc02e68b008e6035492c3c10835e9247899a5bccc559aa3158e581a71803401124d9fd4797476f33351b0d1 new file mode 100644 index 000000000000..96e5f2433801 --- /dev/null +++ b/ops-bedrock/beacon-data/data/secrets/0x8dc5f6f45cc02e68b008e6035492c3c10835e9247899a5bccc559aa3158e581a71803401124d9fd4797476f33351b0d1 @@ -0,0 +1 @@ +Z9U9cdFh1H_gNaHkSS7ww3fCv3ChOwKO-xh2vw8VNzA= \ No newline at end of file diff --git a/ops-bedrock/beacon-data/data/secrets/0x8df81a9e3c61ff1cba9f13c792f1c933131b6d155e8b552d673df44fad4530b68c4e86e9cd2e5cc93a3b806c6b00f4a6 b/ops-bedrock/beacon-data/data/secrets/0x8df81a9e3c61ff1cba9f13c792f1c933131b6d155e8b552d673df44fad4530b68c4e86e9cd2e5cc93a3b806c6b00f4a6 new file mode 100644 index 000000000000..d166653a204d --- /dev/null +++ b/ops-bedrock/beacon-data/data/secrets/0x8df81a9e3c61ff1cba9f13c792f1c933131b6d155e8b552d673df44fad4530b68c4e86e9cd2e5cc93a3b806c6b00f4a6 @@ -0,0 +1 @@ +Bweo_x1-nnr_1sYEhUH9Od2_1IBy1mlTyooEHcH5yRQ= \ No newline at end of file diff --git a/ops-bedrock/beacon-data/data/secrets/0x8efdefbccd6479b9953a5ec6416e6d48201865968567379b213040dbf0be7efa00d66343c21a7e801d6bfd7403cfcfa7 b/ops-bedrock/beacon-data/data/secrets/0x8efdefbccd6479b9953a5ec6416e6d48201865968567379b213040dbf0be7efa00d66343c21a7e801d6bfd7403cfcfa7 new file mode 100644 index 000000000000..03a478b82c68 --- /dev/null +++ b/ops-bedrock/beacon-data/data/secrets/0x8efdefbccd6479b9953a5ec6416e6d48201865968567379b213040dbf0be7efa00d66343c21a7e801d6bfd7403cfcfa7 @@ -0,0 +1 @@ +RQaOXKZ0rZ2jDTqPN1Ng8WEUtquDuZmWQEOGs4jKeY4= \ No newline at end of file diff --git a/ops-bedrock/beacon-data/data/secrets/0x8f1e06e20ac5dd13518bd6c5e19c0a00a9dac968a13167087d9f8199bcb2e93fcb53199f2400ab2f398958761d7c33e6 b/ops-bedrock/beacon-data/data/secrets/0x8f1e06e20ac5dd13518bd6c5e19c0a00a9dac968a13167087d9f8199bcb2e93fcb53199f2400ab2f398958761d7c33e6 new file mode 100644 index 000000000000..917e5b0356b1 --- /dev/null +++ b/ops-bedrock/beacon-data/data/secrets/0x8f1e06e20ac5dd13518bd6c5e19c0a00a9dac968a13167087d9f8199bcb2e93fcb53199f2400ab2f398958761d7c33e6 @@ -0,0 +1 @@ +Vfak9I1BoJ9BCKUULvQFfugf9c722dxx5uk5uXBMH-g= \ No newline at end of file diff --git a/ops-bedrock/beacon-data/data/secrets/0x91838562f203c048b60308d5dae4e845977b8bd946806886f91f23038df2759e9306efcb56f15d57498a68ee789bf5ce b/ops-bedrock/beacon-data/data/secrets/0x91838562f203c048b60308d5dae4e845977b8bd946806886f91f23038df2759e9306efcb56f15d57498a68ee789bf5ce new file mode 100644 index 000000000000..6a815a4db6eb --- /dev/null +++ b/ops-bedrock/beacon-data/data/secrets/0x91838562f203c048b60308d5dae4e845977b8bd946806886f91f23038df2759e9306efcb56f15d57498a68ee789bf5ce @@ -0,0 +1 @@ +vy8RgLCzikAy3nKQhUUbO27YAtW1BqT6Z3MRqPTQmws= \ No newline at end of file diff --git a/ops-bedrock/beacon-data/data/secrets/0x935b301be1f67fc6a896b57309e546bfc1ae731a19b73777ca848fb81f4d8d7b9a5c1cf8ad54d5e1eda09f2095d848cb b/ops-bedrock/beacon-data/data/secrets/0x935b301be1f67fc6a896b57309e546bfc1ae731a19b73777ca848fb81f4d8d7b9a5c1cf8ad54d5e1eda09f2095d848cb new file mode 100644 index 000000000000..2b7cd0e2efbe --- /dev/null +++ b/ops-bedrock/beacon-data/data/secrets/0x935b301be1f67fc6a896b57309e546bfc1ae731a19b73777ca848fb81f4d8d7b9a5c1cf8ad54d5e1eda09f2095d848cb @@ -0,0 +1 @@ +_PWJMlYGcKn5T8b42FziRhvhe520fgx2s3GNWL1DQoQ= \ No newline at end of file diff --git a/ops-bedrock/beacon-data/data/secrets/0x9401d4c66e72e596e0072c27de5bcf3c99900011d36f01219b9e0dc54c852393378b4a0bd12084032c6f02de2dcf1296 b/ops-bedrock/beacon-data/data/secrets/0x9401d4c66e72e596e0072c27de5bcf3c99900011d36f01219b9e0dc54c852393378b4a0bd12084032c6f02de2dcf1296 new file mode 100644 index 000000000000..9dc7338a7d39 --- /dev/null +++ b/ops-bedrock/beacon-data/data/secrets/0x9401d4c66e72e596e0072c27de5bcf3c99900011d36f01219b9e0dc54c852393378b4a0bd12084032c6f02de2dcf1296 @@ -0,0 +1 @@ +1ANWEJBNoyR94bOQeU28v4gl_iNtYEl-EgzQG8JoQtQ= \ No newline at end of file diff --git a/ops-bedrock/beacon-data/data/secrets/0x95123a9757f7295b4cdfeb8808d9d7de69761477db3a34aabe2cb4bffc466b65618b91a0e2f33c95d23d38665d68c506 b/ops-bedrock/beacon-data/data/secrets/0x95123a9757f7295b4cdfeb8808d9d7de69761477db3a34aabe2cb4bffc466b65618b91a0e2f33c95d23d38665d68c506 new file mode 100644 index 000000000000..e763605ae285 --- /dev/null +++ b/ops-bedrock/beacon-data/data/secrets/0x95123a9757f7295b4cdfeb8808d9d7de69761477db3a34aabe2cb4bffc466b65618b91a0e2f33c95d23d38665d68c506 @@ -0,0 +1 @@ +brS21yoHqyEMytNgpW2e_MIQOpxGcN7cdQ48MIf-4N0= \ No newline at end of file diff --git a/ops-bedrock/beacon-data/data/secrets/0x95419a10ad9771dc7545637bc14e4eb7938e0bcc57a42000ddbb117750570fb5ce290679d326a0783e6c780be23df6d8 b/ops-bedrock/beacon-data/data/secrets/0x95419a10ad9771dc7545637bc14e4eb7938e0bcc57a42000ddbb117750570fb5ce290679d326a0783e6c780be23df6d8 new file mode 100644 index 000000000000..2563526c29c6 --- /dev/null +++ b/ops-bedrock/beacon-data/data/secrets/0x95419a10ad9771dc7545637bc14e4eb7938e0bcc57a42000ddbb117750570fb5ce290679d326a0783e6c780be23df6d8 @@ -0,0 +1 @@ +PrzdpjwQYrnzYgJwPprc9AoylECymkxVUTVLG2g2SAw= \ No newline at end of file diff --git a/ops-bedrock/beacon-data/data/secrets/0x958979725c3497149c8f1ed2e3f073a56207ff17218ba3fef7fbcc6e07bbd7b8fc528ff646a49e9c1a145ed27017ef4d b/ops-bedrock/beacon-data/data/secrets/0x958979725c3497149c8f1ed2e3f073a56207ff17218ba3fef7fbcc6e07bbd7b8fc528ff646a49e9c1a145ed27017ef4d new file mode 100644 index 000000000000..77982043b625 --- /dev/null +++ b/ops-bedrock/beacon-data/data/secrets/0x958979725c3497149c8f1ed2e3f073a56207ff17218ba3fef7fbcc6e07bbd7b8fc528ff646a49e9c1a145ed27017ef4d @@ -0,0 +1 @@ +cGcVDJz2PNu3UnYY5_M5scRMVnkUkvWE8-sdKiTJtJM= \ No newline at end of file diff --git a/ops-bedrock/beacon-data/data/secrets/0x961d5cb5deed3612dfbbbffccada34d5a940bcb9b8002452be08d3d69e69274a98854b140744d2640da797cbe910b1cd b/ops-bedrock/beacon-data/data/secrets/0x961d5cb5deed3612dfbbbffccada34d5a940bcb9b8002452be08d3d69e69274a98854b140744d2640da797cbe910b1cd new file mode 100644 index 000000000000..7500130ae3bd --- /dev/null +++ b/ops-bedrock/beacon-data/data/secrets/0x961d5cb5deed3612dfbbbffccada34d5a940bcb9b8002452be08d3d69e69274a98854b140744d2640da797cbe910b1cd @@ -0,0 +1 @@ +zzc78uaVD1Y_9h0pyhKwoihNsTNgndpT-tFboFpMlN4= \ No newline at end of file diff --git a/ops-bedrock/beacon-data/data/secrets/0x980f54178ab1e2d21822e9cd7327acb170269e6215cc8151f5f9c74d3e9ed4fd8e2d5b03c0d5b187edf0b56b6d2fc2fc b/ops-bedrock/beacon-data/data/secrets/0x980f54178ab1e2d21822e9cd7327acb170269e6215cc8151f5f9c74d3e9ed4fd8e2d5b03c0d5b187edf0b56b6d2fc2fc new file mode 100644 index 000000000000..95ce14066be6 --- /dev/null +++ b/ops-bedrock/beacon-data/data/secrets/0x980f54178ab1e2d21822e9cd7327acb170269e6215cc8151f5f9c74d3e9ed4fd8e2d5b03c0d5b187edf0b56b6d2fc2fc @@ -0,0 +1 @@ +op5z2JFp2GiqEJYZA6qrMxYFCTWsOy7XokdMobpvqV0= \ No newline at end of file diff --git a/ops-bedrock/beacon-data/data/secrets/0x988085e2781db7997526af727a32b8660d4022251202f534ba6edda299d5b1fad5a706fe85cab523478abd5e10d68e51 b/ops-bedrock/beacon-data/data/secrets/0x988085e2781db7997526af727a32b8660d4022251202f534ba6edda299d5b1fad5a706fe85cab523478abd5e10d68e51 new file mode 100644 index 000000000000..7fe7ec226a85 --- /dev/null +++ b/ops-bedrock/beacon-data/data/secrets/0x988085e2781db7997526af727a32b8660d4022251202f534ba6edda299d5b1fad5a706fe85cab523478abd5e10d68e51 @@ -0,0 +1 @@ +OscgoSUrY4KNPC-48Ms9AhHWUIuqgKuQVsL9HR-wj7A= \ No newline at end of file diff --git a/ops-bedrock/beacon-data/data/secrets/0x99729eb9833e428853a7444653824aac579864675d6c69c1fc79423f4aba0d51153a40f31c1082816ddb0cdce31bc6b2 b/ops-bedrock/beacon-data/data/secrets/0x99729eb9833e428853a7444653824aac579864675d6c69c1fc79423f4aba0d51153a40f31c1082816ddb0cdce31bc6b2 new file mode 100644 index 000000000000..6dc8527c2e8e --- /dev/null +++ b/ops-bedrock/beacon-data/data/secrets/0x99729eb9833e428853a7444653824aac579864675d6c69c1fc79423f4aba0d51153a40f31c1082816ddb0cdce31bc6b2 @@ -0,0 +1 @@ +gPQiOlJ6jDJ2_jX4fpD4ziP4O3YjGfUhnl8RyAvJ99s= \ No newline at end of file diff --git a/ops-bedrock/beacon-data/data/secrets/0x99804a3e664ba9d8b0a91fdb6127f2753932e41c6f62d1c26edd5f81a12f0eb7bdc9df0d58121436cabd07261f2bcdbd b/ops-bedrock/beacon-data/data/secrets/0x99804a3e664ba9d8b0a91fdb6127f2753932e41c6f62d1c26edd5f81a12f0eb7bdc9df0d58121436cabd07261f2bcdbd new file mode 100644 index 000000000000..1ddf3647367a --- /dev/null +++ b/ops-bedrock/beacon-data/data/secrets/0x99804a3e664ba9d8b0a91fdb6127f2753932e41c6f62d1c26edd5f81a12f0eb7bdc9df0d58121436cabd07261f2bcdbd @@ -0,0 +1 @@ +yqqDOEC22nOFINBYwTXTHDdKQd8pvsnaaoRKVvtsMwI= \ No newline at end of file diff --git a/ops-bedrock/beacon-data/data/secrets/0xa125a3659c269801fb2e00c8f38d6b6fbe91a85dc99691db008cf325ef4ca7443c6fbc8a9131acf885d6169f859b8b1c b/ops-bedrock/beacon-data/data/secrets/0xa125a3659c269801fb2e00c8f38d6b6fbe91a85dc99691db008cf325ef4ca7443c6fbc8a9131acf885d6169f859b8b1c new file mode 100644 index 000000000000..f66e8995e896 --- /dev/null +++ b/ops-bedrock/beacon-data/data/secrets/0xa125a3659c269801fb2e00c8f38d6b6fbe91a85dc99691db008cf325ef4ca7443c6fbc8a9131acf885d6169f859b8b1c @@ -0,0 +1 @@ +0KZZC07HwpdMV2iywCtTpdrThPxgCY9C0GEtns9WjIU= \ No newline at end of file diff --git a/ops-bedrock/beacon-data/data/secrets/0xa1ae1d14d16cf61a6ae0c9589a19a8f38e161f02dbd98c9f5400fc63689af3af2c146bcfb46f0d94469502947d19d6df b/ops-bedrock/beacon-data/data/secrets/0xa1ae1d14d16cf61a6ae0c9589a19a8f38e161f02dbd98c9f5400fc63689af3af2c146bcfb46f0d94469502947d19d6df new file mode 100644 index 000000000000..d127959a44fe --- /dev/null +++ b/ops-bedrock/beacon-data/data/secrets/0xa1ae1d14d16cf61a6ae0c9589a19a8f38e161f02dbd98c9f5400fc63689af3af2c146bcfb46f0d94469502947d19d6df @@ -0,0 +1 @@ +flXwcGdY6M0-qz_Ve88kl0kpPw7-F9YPx0vZS33P2XU= \ No newline at end of file diff --git a/ops-bedrock/beacon-data/data/secrets/0xa2794c3671f0520ffa1032dac4ef67b0a00a65255e522449bf8cabd775db13dd22871f64e710a09344739ef66c1f578f b/ops-bedrock/beacon-data/data/secrets/0xa2794c3671f0520ffa1032dac4ef67b0a00a65255e522449bf8cabd775db13dd22871f64e710a09344739ef66c1f578f new file mode 100644 index 000000000000..6148423e139b --- /dev/null +++ b/ops-bedrock/beacon-data/data/secrets/0xa2794c3671f0520ffa1032dac4ef67b0a00a65255e522449bf8cabd775db13dd22871f64e710a09344739ef66c1f578f @@ -0,0 +1 @@ +R1bOZ06CpjD8qNJlY7EFTv1yd04r2_vYuhcKZpap6s0= \ No newline at end of file diff --git a/ops-bedrock/beacon-data/data/secrets/0xa2ab702302efc9f00d6f50b367de843c24ef708f609b20205b46771f6603dd005a271aaeb589c4fc50cdf137ac66ff1a b/ops-bedrock/beacon-data/data/secrets/0xa2ab702302efc9f00d6f50b367de843c24ef708f609b20205b46771f6603dd005a271aaeb589c4fc50cdf137ac66ff1a new file mode 100644 index 000000000000..fe0290c0ae30 --- /dev/null +++ b/ops-bedrock/beacon-data/data/secrets/0xa2ab702302efc9f00d6f50b367de843c24ef708f609b20205b46771f6603dd005a271aaeb589c4fc50cdf137ac66ff1a @@ -0,0 +1 @@ +2esyRxUbnuVNUEf2EyCLAtPmtj_xmBK8nq86MIpwBoE= \ No newline at end of file diff --git a/ops-bedrock/beacon-data/data/secrets/0xa39882700ed7f72fcdbac07081b7c0c912cb8647ed8494926e6c9c2fc1a7415c7c60e3afcc3d3278fe25b50b851c3ad5 b/ops-bedrock/beacon-data/data/secrets/0xa39882700ed7f72fcdbac07081b7c0c912cb8647ed8494926e6c9c2fc1a7415c7c60e3afcc3d3278fe25b50b851c3ad5 new file mode 100644 index 000000000000..f0071d80d668 --- /dev/null +++ b/ops-bedrock/beacon-data/data/secrets/0xa39882700ed7f72fcdbac07081b7c0c912cb8647ed8494926e6c9c2fc1a7415c7c60e3afcc3d3278fe25b50b851c3ad5 @@ -0,0 +1 @@ +ntdVdK2dKeuVduL44lck-wbvuRnwynfKFIYi0q87j_k= \ No newline at end of file diff --git a/ops-bedrock/beacon-data/data/secrets/0xa3ed99f5e10128dcfa3553c0875021d57da6578892e368d97d6ca4b5d1da961523bde2765e21d64eed8b9eec079f3ff2 b/ops-bedrock/beacon-data/data/secrets/0xa3ed99f5e10128dcfa3553c0875021d57da6578892e368d97d6ca4b5d1da961523bde2765e21d64eed8b9eec079f3ff2 new file mode 100644 index 000000000000..5d89b2f7a866 --- /dev/null +++ b/ops-bedrock/beacon-data/data/secrets/0xa3ed99f5e10128dcfa3553c0875021d57da6578892e368d97d6ca4b5d1da961523bde2765e21d64eed8b9eec079f3ff2 @@ -0,0 +1 @@ +-0XfmvbcsOr7sYQHiJH7Dq4tqvTCk3Mxd1-t7q79KNw= \ No newline at end of file diff --git a/ops-bedrock/beacon-data/data/secrets/0xa459e9ad0870b24aeb95d53b437014dc5dd97bbe38d78b51797da732e26e70e47ae97eb6d16ace2b7b21961fe9c27904 b/ops-bedrock/beacon-data/data/secrets/0xa459e9ad0870b24aeb95d53b437014dc5dd97bbe38d78b51797da732e26e70e47ae97eb6d16ace2b7b21961fe9c27904 new file mode 100644 index 000000000000..0f24c1627ea1 --- /dev/null +++ b/ops-bedrock/beacon-data/data/secrets/0xa459e9ad0870b24aeb95d53b437014dc5dd97bbe38d78b51797da732e26e70e47ae97eb6d16ace2b7b21961fe9c27904 @@ -0,0 +1 @@ +f-qYBuAWPuuS3tEf_eikURXUv59iQmb2S5bOGoKyxcI= \ No newline at end of file diff --git a/ops-bedrock/beacon-data/data/secrets/0xa4662c910f9eda828898a0cddd61332aca5808be1efedb7aedae7978a0bc7f9d2a35baf97f913ca920c957c4e2b7a18c b/ops-bedrock/beacon-data/data/secrets/0xa4662c910f9eda828898a0cddd61332aca5808be1efedb7aedae7978a0bc7f9d2a35baf97f913ca920c957c4e2b7a18c new file mode 100644 index 000000000000..cbd08e8d1a77 --- /dev/null +++ b/ops-bedrock/beacon-data/data/secrets/0xa4662c910f9eda828898a0cddd61332aca5808be1efedb7aedae7978a0bc7f9d2a35baf97f913ca920c957c4e2b7a18c @@ -0,0 +1 @@ +miI875uDQL46Q2A8F48BW1mwSDVfMesq4aEMBxkQ4ms= \ No newline at end of file diff --git a/ops-bedrock/beacon-data/data/secrets/0xa77a318dd834183c3e3b3921c94b1dbb8d1bb2c619e0c492a592c2de5a91e73b5c054bba52619355ed34012386a7aa1d b/ops-bedrock/beacon-data/data/secrets/0xa77a318dd834183c3e3b3921c94b1dbb8d1bb2c619e0c492a592c2de5a91e73b5c054bba52619355ed34012386a7aa1d new file mode 100644 index 000000000000..c9c8688de6ea --- /dev/null +++ b/ops-bedrock/beacon-data/data/secrets/0xa77a318dd834183c3e3b3921c94b1dbb8d1bb2c619e0c492a592c2de5a91e73b5c054bba52619355ed34012386a7aa1d @@ -0,0 +1 @@ +byGWktlBqzReugYiyEMVr42z49WOVfGV7_5ezSSsy8s= \ No newline at end of file diff --git a/ops-bedrock/beacon-data/data/secrets/0xa86404df6d392d2ba08e01a3a967bfd58f081f45bec4e68bf91302f1918870f80719e78a33fa95c520e929e0d58bf38c b/ops-bedrock/beacon-data/data/secrets/0xa86404df6d392d2ba08e01a3a967bfd58f081f45bec4e68bf91302f1918870f80719e78a33fa95c520e929e0d58bf38c new file mode 100644 index 000000000000..06b3865decb6 --- /dev/null +++ b/ops-bedrock/beacon-data/data/secrets/0xa86404df6d392d2ba08e01a3a967bfd58f081f45bec4e68bf91302f1918870f80719e78a33fa95c520e929e0d58bf38c @@ -0,0 +1 @@ +l4QwrtnZE_4ew4wns6_5KH4nJ_47kDqMNzkfMM839Ac= \ No newline at end of file diff --git a/ops-bedrock/beacon-data/data/secrets/0xa8a4c939ec0ee6ff6c58ace82cb82a603fd246defc10fdb37f6d66b5d1f2a1f9fa962547f87ec3aa611402f00bcec0a8 b/ops-bedrock/beacon-data/data/secrets/0xa8a4c939ec0ee6ff6c58ace82cb82a603fd246defc10fdb37f6d66b5d1f2a1f9fa962547f87ec3aa611402f00bcec0a8 new file mode 100644 index 000000000000..f1fda3e7fb6f --- /dev/null +++ b/ops-bedrock/beacon-data/data/secrets/0xa8a4c939ec0ee6ff6c58ace82cb82a603fd246defc10fdb37f6d66b5d1f2a1f9fa962547f87ec3aa611402f00bcec0a8 @@ -0,0 +1 @@ +BYkrsQLk6jC1LH-w0xyQNGGpxw9B4JDE3pBsQ9A5Qrg= \ No newline at end of file diff --git a/ops-bedrock/beacon-data/data/secrets/0xa8b7eaa52875524b0b4716b56d2f377cb878ceb51b925c0a7fa4629f16b2a8161e28aed5c6446ff1889ab7473c86b6f3 b/ops-bedrock/beacon-data/data/secrets/0xa8b7eaa52875524b0b4716b56d2f377cb878ceb51b925c0a7fa4629f16b2a8161e28aed5c6446ff1889ab7473c86b6f3 new file mode 100644 index 000000000000..8193817f64d6 --- /dev/null +++ b/ops-bedrock/beacon-data/data/secrets/0xa8b7eaa52875524b0b4716b56d2f377cb878ceb51b925c0a7fa4629f16b2a8161e28aed5c6446ff1889ab7473c86b6f3 @@ -0,0 +1 @@ +vEwz4ltnGAHkgCWKZThTqFKi2fVCdt_0V0s5HBYKamY= \ No newline at end of file diff --git a/ops-bedrock/beacon-data/data/secrets/0xa90d4602211e30aa9f2d0fdb179bd113492028ca5e0da87871c18777fa8ecd3162a4085ddf7582f65803111715a22d01 b/ops-bedrock/beacon-data/data/secrets/0xa90d4602211e30aa9f2d0fdb179bd113492028ca5e0da87871c18777fa8ecd3162a4085ddf7582f65803111715a22d01 new file mode 100644 index 000000000000..f4df0df8734d --- /dev/null +++ b/ops-bedrock/beacon-data/data/secrets/0xa90d4602211e30aa9f2d0fdb179bd113492028ca5e0da87871c18777fa8ecd3162a4085ddf7582f65803111715a22d01 @@ -0,0 +1 @@ +_meXUuaHxq6Ofq1wZbhfkEzwLnfgjFNJXQW4px13a_s= \ No newline at end of file diff --git a/ops-bedrock/beacon-data/data/secrets/0xa960c5230b2348f3121d891aeabb2d3598893f7d32c675b6a4ef40a1331fe4b9010150dffd379e3216b3dcf0edb23259 b/ops-bedrock/beacon-data/data/secrets/0xa960c5230b2348f3121d891aeabb2d3598893f7d32c675b6a4ef40a1331fe4b9010150dffd379e3216b3dcf0edb23259 new file mode 100644 index 000000000000..a326ca4b2daf --- /dev/null +++ b/ops-bedrock/beacon-data/data/secrets/0xa960c5230b2348f3121d891aeabb2d3598893f7d32c675b6a4ef40a1331fe4b9010150dffd379e3216b3dcf0edb23259 @@ -0,0 +1 @@ +GB9wEoFiNI4R4qOIk0yTN5DDNoaYuoJl0TFZNexQNDo= \ No newline at end of file diff --git a/ops-bedrock/beacon-data/data/secrets/0xaacaf07d7ade408847d18ef8410f6da332ab0a370c337007e64ce98343369aac023e825f2b8e72e8ed34e2b064577a4b b/ops-bedrock/beacon-data/data/secrets/0xaacaf07d7ade408847d18ef8410f6da332ab0a370c337007e64ce98343369aac023e825f2b8e72e8ed34e2b064577a4b new file mode 100644 index 000000000000..2f149afd5f24 --- /dev/null +++ b/ops-bedrock/beacon-data/data/secrets/0xaacaf07d7ade408847d18ef8410f6da332ab0a370c337007e64ce98343369aac023e825f2b8e72e8ed34e2b064577a4b @@ -0,0 +1 @@ +FL2MGhnltWf6J-29MGdU0U4Jghl6XVgZwbsZ77eWoYg= \ No newline at end of file diff --git a/ops-bedrock/beacon-data/data/secrets/0xab0b0a68c9ab8ef73338f8ee1bce7bdfb4fdd1020b4163bec31b952651141db4c8db7fc4b0c97cb8645ad2a58344c1c8 b/ops-bedrock/beacon-data/data/secrets/0xab0b0a68c9ab8ef73338f8ee1bce7bdfb4fdd1020b4163bec31b952651141db4c8db7fc4b0c97cb8645ad2a58344c1c8 new file mode 100644 index 000000000000..f285832b57e2 --- /dev/null +++ b/ops-bedrock/beacon-data/data/secrets/0xab0b0a68c9ab8ef73338f8ee1bce7bdfb4fdd1020b4163bec31b952651141db4c8db7fc4b0c97cb8645ad2a58344c1c8 @@ -0,0 +1 @@ +rKgVmhGHVcJHGrLBZF10ppnCrST7QnwC6Oe7bqQbTLE= \ No newline at end of file diff --git a/ops-bedrock/beacon-data/data/secrets/0xae23fb1b0c76e4fd9800c18945094932655fa3a6aea990392c08c16e9816b3637b3818f609bf774e7277aa9901f1140a b/ops-bedrock/beacon-data/data/secrets/0xae23fb1b0c76e4fd9800c18945094932655fa3a6aea990392c08c16e9816b3637b3818f609bf774e7277aa9901f1140a new file mode 100644 index 000000000000..a5c8e9e7e7e2 --- /dev/null +++ b/ops-bedrock/beacon-data/data/secrets/0xae23fb1b0c76e4fd9800c18945094932655fa3a6aea990392c08c16e9816b3637b3818f609bf774e7277aa9901f1140a @@ -0,0 +1 @@ +MI9nErLMTV8R-coXFr0K25nL-hGCm8XNpEDioadrxTQ= \ No newline at end of file diff --git a/ops-bedrock/beacon-data/data/secrets/0xae809a58eb62ac77b1a9c4b0ba4a3e3dc5024027de9f568cc91b66f1b7426feb4dfc61a5b8117c51c6a0c92f007a29ca b/ops-bedrock/beacon-data/data/secrets/0xae809a58eb62ac77b1a9c4b0ba4a3e3dc5024027de9f568cc91b66f1b7426feb4dfc61a5b8117c51c6a0c92f007a29ca new file mode 100644 index 000000000000..d0253a4b3cef --- /dev/null +++ b/ops-bedrock/beacon-data/data/secrets/0xae809a58eb62ac77b1a9c4b0ba4a3e3dc5024027de9f568cc91b66f1b7426feb4dfc61a5b8117c51c6a0c92f007a29ca @@ -0,0 +1 @@ +zuRf7KXF4Yk5GGfy-tyzticmMWCwy0K6TpF6hGYRqy0= \ No newline at end of file diff --git a/ops-bedrock/beacon-data/data/secrets/0xaf88318ed207829fe806e3a78499a64d13b0cf033812d949cf0f0446bba2fc38fc50a311156c3439f11885b05a340f74 b/ops-bedrock/beacon-data/data/secrets/0xaf88318ed207829fe806e3a78499a64d13b0cf033812d949cf0f0446bba2fc38fc50a311156c3439f11885b05a340f74 new file mode 100644 index 000000000000..2780dd8f4f6b --- /dev/null +++ b/ops-bedrock/beacon-data/data/secrets/0xaf88318ed207829fe806e3a78499a64d13b0cf033812d949cf0f0446bba2fc38fc50a311156c3439f11885b05a340f74 @@ -0,0 +1 @@ +fT8Rl8ee50DPPJYX7xttDo3aMOP5gZ8yBLOMUbTK_4Q= \ No newline at end of file diff --git a/ops-bedrock/beacon-data/data/secrets/0xaff9f2432d328bba781aa2a6bac512a225d2a528cbe83eeb542c3e51defa5e6c4681955f2a5300f23b98e86aa64fb735 b/ops-bedrock/beacon-data/data/secrets/0xaff9f2432d328bba781aa2a6bac512a225d2a528cbe83eeb542c3e51defa5e6c4681955f2a5300f23b98e86aa64fb735 new file mode 100644 index 000000000000..93ada466b304 --- /dev/null +++ b/ops-bedrock/beacon-data/data/secrets/0xaff9f2432d328bba781aa2a6bac512a225d2a528cbe83eeb542c3e51defa5e6c4681955f2a5300f23b98e86aa64fb735 @@ -0,0 +1 @@ +1j2-LqM1w2vb9l1du2q6ncUG9Epnt-DwC7aLipCCvEo= \ No newline at end of file diff --git a/ops-bedrock/beacon-data/data/secrets/0xb0591fe44b7eba93e4f088344d0b924bbe3c7ed9bfb42bf0193ea020f2c7eb8a53c8ebcb0d0f929201c399230005f3e7 b/ops-bedrock/beacon-data/data/secrets/0xb0591fe44b7eba93e4f088344d0b924bbe3c7ed9bfb42bf0193ea020f2c7eb8a53c8ebcb0d0f929201c399230005f3e7 new file mode 100644 index 000000000000..a7bdaa9b5e5d --- /dev/null +++ b/ops-bedrock/beacon-data/data/secrets/0xb0591fe44b7eba93e4f088344d0b924bbe3c7ed9bfb42bf0193ea020f2c7eb8a53c8ebcb0d0f929201c399230005f3e7 @@ -0,0 +1 @@ +bMXA7xXx4gOy4Ex266drV5pR-SSrRWU-MMza7lktqqQ= \ No newline at end of file diff --git a/ops-bedrock/beacon-data/data/secrets/0xb154fd14f7e9c617a1845078cc17f838621b4cfc1279eb11bd11afa4d913f0230cf81feda1f2b0f7bd7eb7a26d51cd28 b/ops-bedrock/beacon-data/data/secrets/0xb154fd14f7e9c617a1845078cc17f838621b4cfc1279eb11bd11afa4d913f0230cf81feda1f2b0f7bd7eb7a26d51cd28 new file mode 100644 index 000000000000..1c34d9397199 --- /dev/null +++ b/ops-bedrock/beacon-data/data/secrets/0xb154fd14f7e9c617a1845078cc17f838621b4cfc1279eb11bd11afa4d913f0230cf81feda1f2b0f7bd7eb7a26d51cd28 @@ -0,0 +1 @@ +3LAwSJqeJ9QY27cTAuH_XhPePzeJmFIVqyaFKLgyFkc= \ No newline at end of file diff --git a/ops-bedrock/beacon-data/data/secrets/0xb178bccfd693edfb8d163a2050dfb251b2a4d5b4e4a7b3787354964159d9f4d0890a263601eeeff5c8a0663486b3fca8 b/ops-bedrock/beacon-data/data/secrets/0xb178bccfd693edfb8d163a2050dfb251b2a4d5b4e4a7b3787354964159d9f4d0890a263601eeeff5c8a0663486b3fca8 new file mode 100644 index 000000000000..8d7438e29852 --- /dev/null +++ b/ops-bedrock/beacon-data/data/secrets/0xb178bccfd693edfb8d163a2050dfb251b2a4d5b4e4a7b3787354964159d9f4d0890a263601eeeff5c8a0663486b3fca8 @@ -0,0 +1 @@ +B72U1aykRLxQQ45dxwiq9L2vwcIxHpN1T5N-ZL3Gqr4= \ No newline at end of file diff --git a/ops-bedrock/beacon-data/data/secrets/0xb22df594adad3ae08c339d6e2079ec7b4c69cab5e8f5fb55680221ba40ffcd384844639a8775af10f3d02d10a5b18dab b/ops-bedrock/beacon-data/data/secrets/0xb22df594adad3ae08c339d6e2079ec7b4c69cab5e8f5fb55680221ba40ffcd384844639a8775af10f3d02d10a5b18dab new file mode 100644 index 000000000000..38da9683e6cd --- /dev/null +++ b/ops-bedrock/beacon-data/data/secrets/0xb22df594adad3ae08c339d6e2079ec7b4c69cab5e8f5fb55680221ba40ffcd384844639a8775af10f3d02d10a5b18dab @@ -0,0 +1 @@ +j3UOZlEnSGPc4q4_m0ZFkoDrtX6AHChkBE6vhKNnhYk= \ No newline at end of file diff --git a/ops-bedrock/beacon-data/data/secrets/0xb2c65e1c252c703d96a29edc5e4b6d22b905a560842a2cebe06842182e9bc783e7be6def84e8332173e120c8fdd633f1 b/ops-bedrock/beacon-data/data/secrets/0xb2c65e1c252c703d96a29edc5e4b6d22b905a560842a2cebe06842182e9bc783e7be6def84e8332173e120c8fdd633f1 new file mode 100644 index 000000000000..0506d6560770 --- /dev/null +++ b/ops-bedrock/beacon-data/data/secrets/0xb2c65e1c252c703d96a29edc5e4b6d22b905a560842a2cebe06842182e9bc783e7be6def84e8332173e120c8fdd633f1 @@ -0,0 +1 @@ +4PQ_R5FBoV0tzIyx4D-sOCsZ3iWrD2xjRuBXvCWt1lU= \ No newline at end of file diff --git a/ops-bedrock/beacon-data/data/secrets/0xb35142bcfe0b34acd33d38a42af340f3d4c033a5ded38b7cb186ca368c011d39cf82f782d810c6941e541b8df9041940 b/ops-bedrock/beacon-data/data/secrets/0xb35142bcfe0b34acd33d38a42af340f3d4c033a5ded38b7cb186ca368c011d39cf82f782d810c6941e541b8df9041940 new file mode 100644 index 000000000000..7e8601dc76b7 --- /dev/null +++ b/ops-bedrock/beacon-data/data/secrets/0xb35142bcfe0b34acd33d38a42af340f3d4c033a5ded38b7cb186ca368c011d39cf82f782d810c6941e541b8df9041940 @@ -0,0 +1 @@ +i59p8v7824SrBsFwRQyLmpbiVLHc4KU2gNjvaUxWv_I= \ No newline at end of file diff --git a/ops-bedrock/beacon-data/data/secrets/0xb37774192885fd4974e3621e13020acb2208c2b25f0754d3ee5d606fe98da22f9dc64db33d9744422250f643594c0b2b b/ops-bedrock/beacon-data/data/secrets/0xb37774192885fd4974e3621e13020acb2208c2b25f0754d3ee5d606fe98da22f9dc64db33d9744422250f643594c0b2b new file mode 100644 index 000000000000..28702b13a31c --- /dev/null +++ b/ops-bedrock/beacon-data/data/secrets/0xb37774192885fd4974e3621e13020acb2208c2b25f0754d3ee5d606fe98da22f9dc64db33d9744422250f643594c0b2b @@ -0,0 +1 @@ +XZDpZ4HPq_jmYafIJ10-shDydlJNxA6_bgPBtCB1pUo= \ No newline at end of file diff --git a/ops-bedrock/beacon-data/data/secrets/0xb4a484c89a1f85c32773f80e915a1441d7e83db65e06382f5eb7660eee9ebff358fc1aa72a1d5b0df058247cd1ba3c00 b/ops-bedrock/beacon-data/data/secrets/0xb4a484c89a1f85c32773f80e915a1441d7e83db65e06382f5eb7660eee9ebff358fc1aa72a1d5b0df058247cd1ba3c00 new file mode 100644 index 000000000000..6c2d079e10b1 --- /dev/null +++ b/ops-bedrock/beacon-data/data/secrets/0xb4a484c89a1f85c32773f80e915a1441d7e83db65e06382f5eb7660eee9ebff358fc1aa72a1d5b0df058247cd1ba3c00 @@ -0,0 +1 @@ +41pIZ0_4ccnQclMertQ2TsMBgnaRTQAyzMsmip1F2fs= \ No newline at end of file diff --git a/ops-bedrock/beacon-data/data/secrets/0xb505fbc0beb4fef613b0720292aa7d74b59ee7ae38055f5b0358f26c52df26bfb1a0ac8d486f581e420cac39eaf18dda b/ops-bedrock/beacon-data/data/secrets/0xb505fbc0beb4fef613b0720292aa7d74b59ee7ae38055f5b0358f26c52df26bfb1a0ac8d486f581e420cac39eaf18dda new file mode 100644 index 000000000000..2a55d9d672e6 --- /dev/null +++ b/ops-bedrock/beacon-data/data/secrets/0xb505fbc0beb4fef613b0720292aa7d74b59ee7ae38055f5b0358f26c52df26bfb1a0ac8d486f581e420cac39eaf18dda @@ -0,0 +1 @@ +zm87nZ5kQoBKYxnr_MtVxSazC4A85L4OxA8KJVb3Jnw= \ No newline at end of file diff --git a/ops-bedrock/beacon-data/data/secrets/0xb563024394c9553c1123af15dce2630b60eaaafd74a1787ad9d65352df66090479d5b0798ba3792595089866d8ecdd5f b/ops-bedrock/beacon-data/data/secrets/0xb563024394c9553c1123af15dce2630b60eaaafd74a1787ad9d65352df66090479d5b0798ba3792595089866d8ecdd5f new file mode 100644 index 000000000000..64933d119c8b --- /dev/null +++ b/ops-bedrock/beacon-data/data/secrets/0xb563024394c9553c1123af15dce2630b60eaaafd74a1787ad9d65352df66090479d5b0798ba3792595089866d8ecdd5f @@ -0,0 +1 @@ +_u5rRvJo4NCzqdix9HtQQvhQUcAr6uGaiOUPzgnE8WI= \ No newline at end of file diff --git a/ops-bedrock/beacon-data/data/secrets/0xb5889b85291f380a80e2cdf02fc62edf4041ef1fb0810b01ebbaacf917c0d54f4bc1454c6772b91baf695652cc9c3f85 b/ops-bedrock/beacon-data/data/secrets/0xb5889b85291f380a80e2cdf02fc62edf4041ef1fb0810b01ebbaacf917c0d54f4bc1454c6772b91baf695652cc9c3f85 new file mode 100644 index 000000000000..9527c4f56bac --- /dev/null +++ b/ops-bedrock/beacon-data/data/secrets/0xb5889b85291f380a80e2cdf02fc62edf4041ef1fb0810b01ebbaacf917c0d54f4bc1454c6772b91baf695652cc9c3f85 @@ -0,0 +1 @@ +6u9TF9qhIeSul9hPG4CR1GRKan8oK8VrlcDsrWxNgYo= \ No newline at end of file diff --git a/ops-bedrock/beacon-data/data/secrets/0xb7f682183f898daaf1b98f9e946c1ad58818fcf19d1922e867b8d54549d5551d39de3bba0b7d919e82b97f8dedbad03e b/ops-bedrock/beacon-data/data/secrets/0xb7f682183f898daaf1b98f9e946c1ad58818fcf19d1922e867b8d54549d5551d39de3bba0b7d919e82b97f8dedbad03e new file mode 100644 index 000000000000..0e43568ba07c --- /dev/null +++ b/ops-bedrock/beacon-data/data/secrets/0xb7f682183f898daaf1b98f9e946c1ad58818fcf19d1922e867b8d54549d5551d39de3bba0b7d919e82b97f8dedbad03e @@ -0,0 +1 @@ +ZtENSvnL8wT_M7lEYwFFDXlPqTzvIzQ6B5RRmbbQm14= \ No newline at end of file diff --git a/ops-bedrock/beacon-data/data/secrets/0xb88c17f529454d0305f27188d32f1aea28a82881d32a1e30e7b01c9aa53b9a9ea01a3706852b4c97c9eaa42e670e9382 b/ops-bedrock/beacon-data/data/secrets/0xb88c17f529454d0305f27188d32f1aea28a82881d32a1e30e7b01c9aa53b9a9ea01a3706852b4c97c9eaa42e670e9382 new file mode 100644 index 000000000000..7c6ede7bb0a7 --- /dev/null +++ b/ops-bedrock/beacon-data/data/secrets/0xb88c17f529454d0305f27188d32f1aea28a82881d32a1e30e7b01c9aa53b9a9ea01a3706852b4c97c9eaa42e670e9382 @@ -0,0 +1 @@ +JaABpyFY9YCy6GJsxzaAG9s5bZHgQQPJSxjuzgxF6a0= \ No newline at end of file diff --git a/ops-bedrock/beacon-data/data/secrets/0xb88c4324866296a28c22416988207436ec2878ec617c048ce44da43e97381a0960df8b5c53bdcb2692341776b1ada34e b/ops-bedrock/beacon-data/data/secrets/0xb88c4324866296a28c22416988207436ec2878ec617c048ce44da43e97381a0960df8b5c53bdcb2692341776b1ada34e new file mode 100644 index 000000000000..9c59879687a4 --- /dev/null +++ b/ops-bedrock/beacon-data/data/secrets/0xb88c4324866296a28c22416988207436ec2878ec617c048ce44da43e97381a0960df8b5c53bdcb2692341776b1ada34e @@ -0,0 +1 @@ +tAsiasEmymS-k7fkjZFIxLdVk3W98JwgOF6D7MufMKI= \ No newline at end of file diff --git a/ops-bedrock/beacon-data/deposit_contract_block.txt b/ops-bedrock/beacon-data/deposit_contract_block.txt new file mode 100644 index 000000000000..573541ac9702 --- /dev/null +++ b/ops-bedrock/beacon-data/deposit_contract_block.txt @@ -0,0 +1 @@ +0 diff --git a/ops-bedrock/docker-compose.yml b/ops-bedrock/docker-compose.yml index 37a5b29ace33..1cc5626876bd 100644 --- a/ops-bedrock/docker-compose.yml +++ b/ops-bedrock/docker-compose.yml @@ -1,11 +1,11 @@ -version: '3.4' - # This Compose file is expected to be used with the devnet-up.sh script. # The volumes below mount the configs generated by the script into each # service. volumes: l1_data: + l1_bn_data: + l1_vc_data: l2_data: safedb_data: challenger_data: @@ -18,7 +18,7 @@ services: l1: build: context: . - dockerfile: Dockerfile.l1 + dockerfile: l1-geth.Dockerfile ports: - "8545:8545" - "8546:8546" @@ -26,31 +26,73 @@ services: volumes: - "l1_data:/db" - "${PWD}/../.devnet/genesis-l1.json:/genesis.json" - - "${PWD}/test-jwt-secret.txt:/config/test-jwt-secret.txt" + - "${PWD}/test-jwt-secret.txt:/config/jwt-secret.txt" environment: GETH_MINER_RECOMMIT: 100ms + l1-bn: + depends_on: + - l1 + build: + context: . + dockerfile: l1-lighthouse.Dockerfile + ports: + - "9000:9000" + - "5052:5052" + volumes: + - "l1_bn_data:/db" + - "${PWD}/test-jwt-secret.txt:/config/jwt-secret.txt" + - "${PWD}/beacon-data/config.yaml:/genesis/config.yaml" + - "${PWD}/beacon-data/deposit_contract_block.txt:/genesis/deposit_contract_block.txt" + - "${PWD}/../.devnet/genesis-l1.ssz:/genesis/genesis.ssz" + environment: + LH_EXECUTION_ENDPOINT: "http://l1:8551" + entrypoint: + - "/bin/sh" + - "/entrypoint-bn.sh" + + l1-vc: + depends_on: + - l1 + - l1-bn + build: + context: . + dockerfile: l1-lighthouse.Dockerfile + volumes: + - "l1_vc_data:/db" + - "${PWD}/beacon-data/data/keys:/validator_setup/validators" + - "${PWD}/beacon-data/data/secrets:/validator_setup/secrets" + - "${PWD}/beacon-data/config.yaml:/genesis/config.yaml" + - "${PWD}/beacon-data/deposit_contract_block.txt:/genesis/deposit_contract_block.txt" + - "${PWD}/../.devnet/genesis-l1.ssz:/genesis/genesis.ssz" + environment: + LH_BEACON_NODES: "http://l1-bn:5052/" + entrypoint: + - "/bin/sh" + - "/entrypoint-vc.sh" + l2: build: context: . - dockerfile: Dockerfile.l2 + dockerfile: l2-op-geth.Dockerfile ports: - "9545:8545" - "8060:6060" volumes: - "l2_data:/db" - "${PWD}/../.devnet/genesis-l2.json:/genesis.json" - - "${PWD}/test-jwt-secret.txt:/config/test-jwt-secret.txt" + - "${PWD}/test-jwt-secret.txt:/config/jwt-secret.txt" entrypoint: # pass the L2 specific flags by overriding the entry-point and adding extra arguments - "/bin/sh" - "/entrypoint.sh" - - "--authrpc.jwtsecret=/config/test-jwt-secret.txt" environment: GETH_MINER_RECOMMIT: 100ms op-node: depends_on: - l1 + - l1-bn + - l1-vc - l2 build: context: ../ @@ -60,8 +102,11 @@ services: command: > op-node --l1=ws://l1:8546 + --l1.beacon=http://l1-bn:5052 + --l1.epoch-poll-interval=12s + --l1.http-poll-interval=6s --l2=http://l2:8551 - --l2.jwt-secret=/config/test-jwt-secret.txt + --l2.jwt-secret=/config/jwt-secret.txt --sequencer.enabled --sequencer.l1-confs=0 --verifier.l1-confs=0 @@ -74,7 +119,6 @@ services: --p2p.listen.udp=9003 --p2p.scoring.peers=light --p2p.ban.peers=true - --snapshotlog.file=/op_log/snapshot.log --p2p.priv.path=/config/p2p-node-key.txt --metrics.enabled --metrics.addr=0.0.0.0 @@ -82,9 +126,9 @@ services: --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 + --altda.enabled=${ALTDA_ENABLED} + --altda.da-service=${ALTDA_SERVICE} + --altda.da-server=http://da-server:3100 ports: - "7545:8545" - "9003:9003" @@ -94,7 +138,7 @@ services: - "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" + - "${PWD}/test-jwt-secret.txt:/config/jwt-secret.txt" - "${PWD}/../.devnet/rollup.json:/rollup.json" - op_log:/op_log @@ -146,7 +190,7 @@ services: OP_BATCHER_L1_ETH_RPC: http://l1:8545 OP_BATCHER_L2_ETH_RPC: http://l2:8545 OP_BATCHER_ROLLUP_RPC: http://op-node:8545 - OP_BATCHER_MAX_CHANNEL_DURATION: 1 + OP_BATCHER_MAX_CHANNEL_DURATION: 2 OP_BATCHER_SUB_SAFETY_MARGIN: 4 # SWS is 15, ChannelTimeout is 40 OP_BATCHER_POLL_INTERVAL: 1s OP_BATCHER_NUM_CONFIRMATIONS: 1 @@ -155,14 +199,16 @@ services: OP_BATCHER_PPROF_ENABLED: "true" 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_BATCHER_BATCH_TYPE: 1 + OP_BATCHER_ALTDA_ENABLED: "${ALTDA_ENABLED}" + OP_BATCHER_ALTDA_DA_SERVICE: "${ALTDA_SERVICE}" + OP_BATCHER_ALTDA_DA_SERVER: "http://da-server:3100" + OP_BATCHER_DATA_AVAILABILITY_TYPE: "${DA_TYPE}" op-challenger: depends_on: - l1 + - l1-bn - l2 - op-node build: @@ -175,10 +221,9 @@ services: - "../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 - OP_CHALLENGER_L1_BEACON: "unset" + OP_CHALLENGER_L1_BEACON: http://l1-bn:5052 OP_CHALLENGER_ROLLUP_RPC: http://op-node:8545 - OP_CHALLENGER_TRACE_TYPE: cannon + OP_CHALLENGER_TRACE_TYPE: cannon,fast OP_CHALLENGER_GAME_FACTORY_ADDRESS: ${DGF_ADDRESS} # The devnet can't set the absolute prestate output root because the contracts are deployed in L1 genesis # before the L2 genesis is known. @@ -206,6 +251,7 @@ services: --addr=0.0.0.0 --port=3100 --log.level=debug + --generic-commitment="${ALTDA_GENERIC_DA}" ports: - "3100:3100" volumes: diff --git a/ops-bedrock/entrypoint-l1.sh b/ops-bedrock/entrypoint-l1.sh deleted file mode 100644 index 4d86e3fa5d14..000000000000 --- a/ops-bedrock/entrypoint-l1.sh +++ /dev/null @@ -1,72 +0,0 @@ -#!/bin/bash -set -exu - -VERBOSITY=${GETH_VERBOSITY:-3} -GETH_DATA_DIR=/db -GETH_CHAINDATA_DIR="$GETH_DATA_DIR/geth/chaindata" -GETH_KEYSTORE_DIR="$GETH_DATA_DIR/keystore" -GENESIS_FILE_PATH="${GENESIS_FILE_PATH:-/genesis.json}" -CHAIN_ID=$(cat "$GENESIS_FILE_PATH" | jq -r .config.chainId) -BLOCK_SIGNER_PRIVATE_KEY="ac0974bec39a17e36ba4a6b4d238ff944bacb478cbed5efcae784d7bf4f2ff80" -BLOCK_SIGNER_ADDRESS="0xf39Fd6e51aad88F6F4ce6aB8827279cffFb92266" -RPC_PORT="${RPC_PORT:-8545}" -WS_PORT="${WS_PORT:-8546}" - -if [ ! -d "$GETH_KEYSTORE_DIR" ]; then - echo "$GETH_KEYSTORE_DIR missing, running account import" - echo -n "pwd" > "$GETH_DATA_DIR"/password - echo -n "$BLOCK_SIGNER_PRIVATE_KEY" | sed 's/0x//' > "$GETH_DATA_DIR"/block-signer-key - geth account import \ - --datadir="$GETH_DATA_DIR" \ - --password="$GETH_DATA_DIR"/password \ - "$GETH_DATA_DIR"/block-signer-key -else - echo "$GETH_KEYSTORE_DIR exists." -fi - -if [ ! -d "$GETH_CHAINDATA_DIR" ]; then - echo "$GETH_CHAINDATA_DIR missing, running init" - echo "Initializing genesis." - geth --verbosity="$VERBOSITY" init \ - --datadir="$GETH_DATA_DIR" \ - "$GENESIS_FILE_PATH" -else - echo "$GETH_CHAINDATA_DIR exists." -fi - -# Warning: Archive mode is required, otherwise old trie nodes will be -# pruned within minutes of starting the devnet. - -exec geth \ - --datadir="$GETH_DATA_DIR" \ - --verbosity="$VERBOSITY" \ - --http \ - --http.corsdomain="*" \ - --http.vhosts="*" \ - --http.addr=0.0.0.0 \ - --http.port="$RPC_PORT" \ - --http.api=web3,debug,eth,txpool,net,engine \ - --ws \ - --ws.addr=0.0.0.0 \ - --ws.port="$WS_PORT" \ - --ws.origins="*" \ - --ws.api=debug,eth,txpool,net,engine \ - --syncmode=full \ - --nodiscover \ - --maxpeers=1 \ - --networkid="$CHAIN_ID" \ - --unlock="$BLOCK_SIGNER_ADDRESS" \ - --mine \ - --miner.etherbase="$BLOCK_SIGNER_ADDRESS" \ - --password="$GETH_DATA_DIR"/password \ - --allow-insecure-unlock \ - --rpc.allow-unprotected-txs \ - --authrpc.addr="0.0.0.0" \ - --authrpc.port="8551" \ - --authrpc.vhosts="*" \ - --authrpc.jwtsecret=/config/jwt-secret.txt \ - --gcmode=archive \ - --metrics \ - --metrics.addr=0.0.0.0 \ - --metrics.port=6060 \ - "$@" diff --git a/ops-bedrock/entrypoint-l2.sh b/ops-bedrock/entrypoint-l2.sh deleted file mode 100644 index 4325a75f50d0..000000000000 --- a/ops-bedrock/entrypoint-l2.sh +++ /dev/null @@ -1,52 +0,0 @@ -#!/bin/sh -set -exu - -VERBOSITY=${GETH_VERBOSITY:-3} -GETH_DATA_DIR=/db -GETH_CHAINDATA_DIR="$GETH_DATA_DIR/geth/chaindata" -GENESIS_FILE_PATH="${GENESIS_FILE_PATH:-/genesis.json}" -CHAIN_ID=$(cat "$GENESIS_FILE_PATH" | jq -r .config.chainId) -RPC_PORT="${RPC_PORT:-8545}" -WS_PORT="${WS_PORT:-8546}" - -if [ ! -d "$GETH_CHAINDATA_DIR" ]; then - echo "$GETH_CHAINDATA_DIR missing, running init" - echo "Initializing genesis." - geth --verbosity="$VERBOSITY" init \ - --datadir="$GETH_DATA_DIR" \ - "$GENESIS_FILE_PATH" -else - echo "$GETH_CHAINDATA_DIR exists." -fi - -# Warning: Archive mode is required, otherwise old trie nodes will be -# pruned within minutes of starting the devnet. - -exec geth \ - --datadir="$GETH_DATA_DIR" \ - --verbosity="$VERBOSITY" \ - --http \ - --http.corsdomain="*" \ - --http.vhosts="*" \ - --http.addr=0.0.0.0 \ - --http.port="$RPC_PORT" \ - --http.api=web3,debug,eth,txpool,net,engine \ - --ws \ - --ws.addr=0.0.0.0 \ - --ws.port="$WS_PORT" \ - --ws.origins="*" \ - --ws.api=debug,eth,txpool,net,engine \ - --syncmode=full \ - --nodiscover \ - --maxpeers=0 \ - --networkid="$CHAIN_ID" \ - --rpc.allow-unprotected-txs \ - --authrpc.addr="0.0.0.0" \ - --authrpc.port="8551" \ - --authrpc.vhosts="*" \ - --authrpc.jwtsecret=/config/jwt-secret.txt \ - --gcmode=archive \ - --metrics \ - --metrics.addr=0.0.0.0 \ - --metrics.port=6060 \ - "$@" diff --git a/ops-bedrock/l1-generate-beacon-genesis.sh b/ops-bedrock/l1-generate-beacon-genesis.sh new file mode 100644 index 000000000000..2fa3534659dd --- /dev/null +++ b/ops-bedrock/l1-generate-beacon-genesis.sh @@ -0,0 +1,19 @@ +#!/bin/sh + +set -eu + +echo "eth2-testnet-genesis path: $(which eth2-testnet-genesis)" + +eth2-testnet-genesis deneb \ + --config=./beacon-data/config.yaml \ + --preset-phase0=minimal \ + --preset-altair=minimal \ + --preset-bellatrix=minimal \ + --preset-capella=minimal \ + --preset-deneb=minimal \ + --eth1-config=../.devnet/genesis-l1.json \ + --state-output=../.devnet/genesis-l1.ssz \ + --tranches-dir=../.devnet/tranches \ + --mnemonics=mnemonics.yaml \ + --eth1-withdrawal-address=0xaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa \ + --eth1-match-genesis-time diff --git a/ops-bedrock/l1-geth-entrypoint.sh b/ops-bedrock/l1-geth-entrypoint.sh new file mode 100644 index 000000000000..b6cf5350dfbb --- /dev/null +++ b/ops-bedrock/l1-geth-entrypoint.sh @@ -0,0 +1,53 @@ +#!/bin/bash +set -exu + +VERBOSITY=${GETH_VERBOSITY:-3} +GETH_DATA_DIR=/db +GETH_CHAINDATA_DIR="$GETH_DATA_DIR/geth/chaindata" +GENESIS_FILE_PATH="${GENESIS_FILE_PATH:-/genesis.json}" + +RPC_PORT="${RPC_PORT:-8545}" +WS_PORT="${WS_PORT:-8546}" + +if [ ! -d "$GETH_CHAINDATA_DIR" ]; then + echo "$GETH_CHAINDATA_DIR missing, running init" + echo "Initializing genesis." + geth --verbosity="$VERBOSITY" init \ + --datadir="$GETH_DATA_DIR" \ + --state.scheme=hash \ + "$GENESIS_FILE_PATH" +else + echo "$GETH_CHAINDATA_DIR exists." +fi + +# Warning: Archive mode is required, otherwise old trie nodes will be +# pruned within minutes of starting the devnet. + +exec geth \ + --datadir="$GETH_DATA_DIR" \ + --verbosity="$VERBOSITY" \ + --http \ + --http.corsdomain="*" \ + --http.vhosts="*" \ + --http.addr=0.0.0.0 \ + --http.port="$RPC_PORT" \ + --http.api=web3,debug,eth,txpool,net,engine \ + --ws \ + --ws.addr=0.0.0.0 \ + --ws.port="$WS_PORT" \ + --ws.origins="*" \ + --ws.api=debug,eth,txpool,net,engine \ + --syncmode=full \ + --nodiscover \ + --maxpeers=1 \ + --rpc.allow-unprotected-txs \ + --authrpc.addr="0.0.0.0" \ + --authrpc.port="8551" \ + --authrpc.vhosts="*" \ + --authrpc.jwtsecret=/config/jwt-secret.txt \ + --gcmode=archive \ + --state.scheme=hash \ + --metrics \ + --metrics.addr=0.0.0.0 \ + --metrics.port=6060 \ + "$@" diff --git a/ops-bedrock/l1-geth.Dockerfile b/ops-bedrock/l1-geth.Dockerfile new file mode 100644 index 000000000000..90d1f69840f9 --- /dev/null +++ b/ops-bedrock/l1-geth.Dockerfile @@ -0,0 +1,9 @@ +FROM ethereum/client-go:v1.14.8 + +RUN apk add --no-cache jq bash + +COPY l1-geth-entrypoint.sh /entrypoint.sh + +VOLUME ["/db"] + +ENTRYPOINT ["/bin/bash", "/entrypoint.sh"] diff --git a/ops-bedrock/l1-lighthouse-bn-entrypoint.sh b/ops-bedrock/l1-lighthouse-bn-entrypoint.sh new file mode 100644 index 000000000000..8e13ce6d7e40 --- /dev/null +++ b/ops-bedrock/l1-lighthouse-bn-entrypoint.sh @@ -0,0 +1,25 @@ +#!/bin/bash +set -exu + +# --allow-insecure-genesis-sync is required since we start from genesis, and it may be an old genesis +exec /usr/local/bin/lighthouse \ + bn \ + --datadir="/db" \ + --disable-peer-scoring \ + --disable-packet-filter \ + --enable-private-discovery \ + --staking \ + --http \ + --http-address=0.0.0.0 \ + --http-port=5052 \ + --validator-monitor-auto \ + --http-allow-origin='*' \ + --listen-address=0.0.0.0 \ + --port=9000 \ + --target-peers=0 \ + --testnet-dir=/genesis \ + --execution-endpoint="${LH_EXECUTION_ENDPOINT}" \ + --execution-jwt=/config/jwt-secret.txt \ + --allow-insecure-genesis-sync \ + --debug-level=info \ + "$@" diff --git a/ops-bedrock/l1-lighthouse-vc-entrypoint.sh b/ops-bedrock/l1-lighthouse-vc-entrypoint.sh new file mode 100644 index 000000000000..929cdf8c7c9b --- /dev/null +++ b/ops-bedrock/l1-lighthouse-vc-entrypoint.sh @@ -0,0 +1,17 @@ +#!/bin/bash +set -exu + +# Copy the keys and secrets into place: +# We don't mount directly into place, to prevent the container from writing lock-files / slashing-db / etc. +# back into the host, which could affect future fresh devnet runs if not cleaned up. +cp -r /validator_setup/validators /db/validators +cp -r /validator_setup/secrets /db/secrets + +exec /usr/local/bin/lighthouse \ + vc \ + --datadir="/db" \ + --beacon-nodes="${LH_BEACON_NODES}" \ + --testnet-dir=/genesis \ + --init-slashing-protection \ + --suggested-fee-recipient="0xff00000000000000000000000000000000c0ffee" \ + "$@" diff --git a/ops-bedrock/l1-lighthouse.Dockerfile b/ops-bedrock/l1-lighthouse.Dockerfile new file mode 100644 index 000000000000..c6c9661f14bc --- /dev/null +++ b/ops-bedrock/l1-lighthouse.Dockerfile @@ -0,0 +1,6 @@ +FROM sigp/lighthouse:v5.2.1 + +COPY l1-lighthouse-bn-entrypoint.sh /entrypoint-bn.sh +COPY l1-lighthouse-vc-entrypoint.sh /entrypoint-vc.sh + +VOLUME ["/db"] diff --git a/ops-bedrock/l2-op-geth-entrypoint.sh b/ops-bedrock/l2-op-geth-entrypoint.sh new file mode 100644 index 000000000000..f760a87f1875 --- /dev/null +++ b/ops-bedrock/l2-op-geth-entrypoint.sh @@ -0,0 +1,54 @@ +#!/bin/sh +set -exu + +VERBOSITY=${GETH_VERBOSITY:-3} +GETH_DATA_DIR=/db +GETH_CHAINDATA_DIR="$GETH_DATA_DIR/geth/chaindata" +GENESIS_FILE_PATH="${GENESIS_FILE_PATH:-/genesis.json}" +CHAIN_ID=$(cat "$GENESIS_FILE_PATH" | jq -r .config.chainId) +RPC_PORT="${RPC_PORT:-8545}" +WS_PORT="${WS_PORT:-8546}" + +if [ ! -d "$GETH_CHAINDATA_DIR" ]; then + echo "$GETH_CHAINDATA_DIR missing, running init" + echo "Initializing genesis." + geth --verbosity="$VERBOSITY" init \ + --datadir="$GETH_DATA_DIR" \ + --state.scheme=hash \ + "$GENESIS_FILE_PATH" +else + echo "$GETH_CHAINDATA_DIR exists." +fi + +# Warning: Archive mode is required, otherwise old trie nodes will be +# pruned within minutes of starting the devnet. + +exec geth \ + --datadir="$GETH_DATA_DIR" \ + --verbosity="$VERBOSITY" \ + --http \ + --http.corsdomain="*" \ + --http.vhosts="*" \ + --http.addr=0.0.0.0 \ + --http.port="$RPC_PORT" \ + --http.api=web3,debug,eth,txpool,net,engine \ + --ws \ + --ws.addr=0.0.0.0 \ + --ws.port="$WS_PORT" \ + --ws.origins="*" \ + --ws.api=debug,eth,txpool,net,engine \ + --syncmode=full \ + --nodiscover \ + --maxpeers=0 \ + --networkid="$CHAIN_ID" \ + --rpc.allow-unprotected-txs \ + --authrpc.addr="0.0.0.0" \ + --authrpc.port="8551" \ + --authrpc.vhosts="*" \ + --authrpc.jwtsecret=/config/jwt-secret.txt \ + --gcmode=archive \ + --state.scheme=hash \ + --metrics \ + --metrics.addr=0.0.0.0 \ + --metrics.port=6060 \ + "$@" diff --git a/ops-bedrock/l2-op-geth.Dockerfile b/ops-bedrock/l2-op-geth.Dockerfile new file mode 100644 index 000000000000..c66bac56da81 --- /dev/null +++ b/ops-bedrock/l2-op-geth.Dockerfile @@ -0,0 +1,9 @@ +FROM us-docker.pkg.dev/oplabs-tools-artifacts/images/op-geth:optimism + +RUN apk add --no-cache jq + +COPY l2-op-geth-entrypoint.sh /entrypoint.sh + +VOLUME ["/db"] + +ENTRYPOINT ["/bin/sh", "/entrypoint.sh"] diff --git a/ops-bedrock/mnemonics.yaml b/ops-bedrock/mnemonics.yaml new file mode 100644 index 000000000000..f97b779ee784 --- /dev/null +++ b/ops-bedrock/mnemonics.yaml @@ -0,0 +1,3 @@ +# put our 64 test validators into the devnet genesis +- mnemonic: "test test test test test test test test test test test junk" + count: 64 diff --git a/ops/check-changed/main.py b/ops/check-changed/main.py index 8ce1a7bce9db..fbebff51da96 100644 --- a/ops/check-changed/main.py +++ b/ops/check-changed/main.py @@ -3,7 +3,6 @@ import re import subprocess import sys -import json from github import Github @@ -13,9 +12,6 @@ r'^package\.json', r'ops/check-changed/.*', ] -with open("../../nx.json") as file: - nx_json_data = json.load(file) -REBUILD_ALL_PATTERNS += nx_json_data["implicitDependencies"].keys() GO_PATTERNS = [ r'^go\.mod', diff --git a/ops/check-changed/requirements.txt b/ops/check-changed/requirements.txt index c58d1db7352b..1d0c88d77f2d 100644 --- a/ops/check-changed/requirements.txt +++ b/ops/check-changed/requirements.txt @@ -1,4 +1,4 @@ -certifi==2023.7.22 +certifi==2024.7.4 cffi==1.15.1 charset-normalizer==2.1.1 Deprecated==1.2.13 @@ -8,5 +8,5 @@ PyGithub==1.57 PyJWT==2.6.0 PyNaCl==1.5.0 requests==2.32.0 -urllib3==1.26.18 +urllib3==1.26.19 wrapt==1.14.1 diff --git a/ops/docker/Dockerfile.packages b/ops/docker/Dockerfile.packages index c61b533e1835..dbd496afc8af 100644 --- a/ops/docker/Dockerfile.packages +++ b/ops/docker/Dockerfile.packages @@ -1,131 +1,73 @@ -# This Dockerfile builds all the dependencies needed by the monorepo, and should -# be used to build any of the follow-on services -# - -# Stage 0 (named `manifests`) collects -# dependency manifest files (`package.json` and `pnpm-lock.yaml`) which are then -# used by stage 1 to install these dependencies -# development. The only reason we need a separate stage just for collecting the -# dependency manifests is that Docker's `COPY` command still does not allow -# copying based on a glob pattern (see this GitHub issue for more details -# https://github.com/moby/moby/issues/15858). Being able to copy only manifests -# into stage 1 (the `COPY --from=manifests` statement) is important to maximize -# Docker build cache hit rate. `alpine` is chosen as the base image for the -# first stage because it's the smallest image that have access to the `cp -# --parents -t` command (by installing the `coreutils` package). -FROM alpine:3.16 as manifests -RUN apk add coreutils - -WORKDIR /tmp -COPY pnpm-lock.yaml pnpm-workspace.yaml .nvmrc package.json .pnpmfile.cjs ./src/ -COPY packages src/packages/ -RUN mkdir manifests && \ - cd src && \ - # copy package.json recursively - find . -name 'package.json' | xargs cp --parents -t ../manifests/ && \ - # pnpm-lock.yaml - cp pnpm-lock.yaml ../manifests/ && \ - # pnpm-workspace.yaml - cp pnpm-workspace.yaml ../manifests/ && \ - # .nvmrc - 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 -# we use it rather than alpine because it's not much -# bigger and alpine is often missing packages for node applications -# alpine is not officially supported by node.js -FROM node:20.8.1-bullseye-slim as base +# We need to specify the platforms below, otherwise platforms other than +# linux/amd64 will be forced to rebuild the contracts every time this +# image is used. + +# This Dockerfile builds all the dependencies needed by the smart-contracts, excluding Go and Python. + +FROM --platform=linux/amd64 us-docker.pkg.dev/oplabs-tools-artifacts/images/ci-builder:latest as foundry + +FROM --platform=linux/amd64 debian:bookworm-20240812-slim as base # Base: install deps RUN apt-get update && apt-get install -y \ curl \ jq \ - python3 \ ca-certificates \ git \ - g++ \ make \ - gcc \ - musl-dev \ bash \ - # the following 4 deps are needed for node-hid - # which is a deep sub dependency of ethers to install - # correctly - pkg-config \ - libusb-1.0-0-dev \ - libudev-dev \ --no-install-recommends -COPY /ops/docker/oplabs.crt /usr/local/share/ca-certificates/oplabs.crt -RUN chmod 644 /usr/local/share/ca-certificates/oplabs.crt \ - && update-ca-certificates - -RUN npm install pnpm --global - +COPY --from=foundry /usr/local/bin/just /usr/local/bin/just COPY --from=foundry /usr/local/bin/forge /usr/local/bin/forge COPY --from=foundry /usr/local/bin/cast /usr/local/bin/cast WORKDIR /opt/optimism -# Copy manifest files into the image in -# preparation for `pnpm install`. -COPY --from=manifests /tmp/manifests ./ -COPY *.json ./ - -RUN pnpm install:ci - +COPY ./versions.json ./versions.json COPY ./packages ./packages - COPY .git/ ./.git COPY .gitmodules ./.gitmodules -RUN git submodule update --init --recursive -COPY --from=1password/op:2 /usr/local/bin/op /usr/local/bin/op +RUN git submodule update --init --recursive \ + && cd packages/contracts-bedrock \ + && just build \ + && echo $(git rev-parse HEAD) > .gitcommit -RUN pnpm build +FROM --platform=linux/amd64 debian:bookworm-20240812-slim as contracts-bedrock -ENTRYPOINT ["pnpm", "run"] - -FROM base as chain-mon -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/internal -CMD ["start:balance-mon"] +RUN apt-get update && apt-get install -y \ + curl \ + jq \ + ca-certificates \ + git \ + make \ + bash \ + --no-install-recommends -FROM base as drippie-mon -WORKDIR /opt/optimism/packages/chain-mon/contrib -CMD ["start:drippie-mon"] +COPY /ops/docker/oplabs.crt /usr/local/share/ca-certificates/oplabs.crt -from base as fault-mon -WORKDIR /opt/optimism/packages/chain-mon/ -CMD ["start:fault-mon"] +RUN chmod 644 /usr/local/share/ca-certificates/oplabs.crt \ + && update-ca-certificates -from base as multisig-mon -WORKDIR /opt/optimism/packages/internal/multisig-mon -CMD ["start:multisig-mon"] +COPY --from=foundry /usr/local/bin/just /usr/local/bin/just +COPY --from=foundry /usr/local/bin/forge /usr/local/bin/forge +COPY --from=foundry /usr/local/bin/cast /usr/local/bin/cast +COPY --from=foundry /usr/local/bin/svm /usr/local/bin/svm -FROM base as replica-mon -WORKDIR /opt/optimism/packages/chain-mon/contrib -CMD ["start:replica-mon"] +RUN svm install 0.8.25 && \ + svm install 0.8.15 && \ + svm install 0.8.19 && \ + svm install 0.8.26 -FROM base as wallet-mon -WORKDIR /opt/optimism/packages/chain-mon/contrib -CMD ["start:wallet-mon"] +# Not to be confused with OP, this is a OnePassword CLI tool. +COPY --from=1password/op:2 /usr/local/bin/op /usr/local/bin/op -FROM base as wd-mon -WORKDIR /opt/optimism/packages/chain-mon/ -CMD ["start:wd-mon"] +RUN mkdir -p /opt/optimism/packages/contracts-bedrock -FROM base as faultproof-wd-mon -WORKDIR /opt/optimism/packages/chain-mon/ -CMD ["start:faultproof-wd-mon"] +COPY --from=base /opt/optimism/packages/contracts-bedrock /opt/optimism/packages/contracts-bedrock +COPY --from=base /opt/optimism/versions.json /opt/optimism/versions.json -FROM base as contracts-bedrock WORKDIR /opt/optimism/packages/contracts-bedrock -CMD ["deploy"] + +CMD ["echo", "Override this command to use this image."] diff --git a/ops/docker/ci-builder/Dockerfile b/ops/docker/ci-builder/Dockerfile index 7d95ed9fdada..3c1956987b55 100644 --- a/ops/docker/ci-builder/Dockerfile +++ b/ops/docker/ci-builder/Dockerfile @@ -92,34 +92,25 @@ 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 -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 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; \ curl -fsSL https://download.docker.com/linux/debian/gpg | gpg --dearmor -o /etc/apt/keyrings/docker.gpg; \ chmod a+r /etc/apt/keyrings/docker.gpg; \ echo "deb [arch=$(dpkg --print-architecture) signed-by=/etc/apt/keyrings/docker.gpg] https://download.docker.com/linux/debian $(. /etc/os-release && echo "$VERSION_CODENAME") stable" | tee /etc/apt/sources.list.d/docker.list > /dev/null; \ apt-get update; \ - apt-get install -y nodejs docker-ce-cli; \ + apt-get install -y docker-ce-cli; \ ln -s /usr/local/go/bin/gofmt /usr/local/bin/gofmt; \ - npm i -g depcheck; \ pip install capstone pyelftools; \ curl -fLSs https://raw.githubusercontent.com/CircleCI-Public/circleci-cli/master/install.sh | bash; \ apt-get purge -y --auto-remove -o APT::AutoRemove::RecommendsImportant=false; \ rm -rf /var/lib/apt/lists/*; \ - rm -rf /root/.cache/pip; \ - rm -rf /root/.cache/npm; - -RUN npm i -g pnpm && npm i -g yarn@1 && pnpm --version && yarn --version + rm -rf /root/.cache/pip; -RUN svm install 0.5.17 && \ +RUN svm install 0.8.25 && \ svm install 0.8.15 && \ svm install 0.8.19 diff --git a/ops/docker/deployment-utils/Dockerfile b/ops/docker/deployment-utils/Dockerfile new file mode 100644 index 000000000000..c0f82e5a3405 --- /dev/null +++ b/ops/docker/deployment-utils/Dockerfile @@ -0,0 +1,35 @@ +FROM golang:1.23.1-bookworm AS go-base + +RUN go install github.com/tomwright/dasel/v2/cmd/dasel@master + +FROM debian:12.7-slim AS base + +SHELL ["/bin/bash", "-c"] + +ENV PATH=/root/.cargo/bin:/root/.foundry/bin:$PATH +ENV DEBIAN_FRONTEND=noninteractive +ENV SHELL=/bin/bash + +RUN apt-get update && apt-get install -y curl git jq build-essential + +RUN curl --proto '=https' --tlsv1.2 -sSf https://sh.rustup.rs > rustup.sh && \ + chmod +x ./rustup.sh && \ + sh rustup.sh -y + +RUN source $HOME/.profile && rustup update nightly +RUN curl -L https://foundry.paradigm.xyz | bash +RUN foundryup + +FROM debian:12.7-slim + +ENV PATH=/root/.cargo/bin:/root/.foundry/bin:$PATH +ENV DEBIAN_FRONTEND=noninteractive + +RUN apt-get update && apt-get install -y bash curl jq + +SHELL ["/bin/bash", "-c"] + +COPY --from=base /root/.foundry/bin/forge /usr/local/bin/forge +COPY --from=base /root/.foundry/bin/cast /usr/local/bin/cast +COPY --from=base /root/.foundry/bin/anvil /usr/local/bin/anvil +COPY --from=go-base /go/bin/dasel /usr/local/bin/dasel \ No newline at end of file diff --git a/ops/docker/deployment-utils/README.md b/ops/docker/deployment-utils/README.md new file mode 100644 index 000000000000..450af3423b11 --- /dev/null +++ b/ops/docker/deployment-utils/README.md @@ -0,0 +1,16 @@ +# deployment-utils + +This image provides a minimal set of Foundry and Bash tools for use with builder images like Kurtosis. It contains the +following packages: + +- The Foundry suite (`forge`, `cast`, `anvil`) +- [`Dasel`](https://github.com/TomWright/dasel), for TOML/YAML manipulation. +- `jq` for JSON manipulation. +- `curl`, for when you need to cURLs. +- A default `bash` shell. + +## Image Size + +According to `dive`, this image is 255MB in size including the base Debian image. Most of the additional size comes from +the tools themselves. I'd like to keep it this way. This image should not contain toolchains, libraries, etc. - it is +designed to run prebuilt software and manipulate configuration files. Use the CI builder for everything else. \ No newline at end of file diff --git a/ops/docker/op-stack-go/Dockerfile b/ops/docker/op-stack-go/Dockerfile index e5dc595ea094..a395968fd07a 100644 --- a/ops/docker/op-stack-go/Dockerfile +++ b/ops/docker/op-stack-go/Dockerfile @@ -4,15 +4,13 @@ # 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 +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 @@ -38,98 +36,93 @@ COPY . /app ARG GIT_COMMIT ARG GIT_DATE +ARG TARGETOS +ARG TARGETARCH + # 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 +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" +RUN --mount=type=cache,target=/go/pkg/mod --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 +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" +RUN --mount=type=cache,target=/go/pkg/mod --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 +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" +RUN --mount=type=cache,target=/go/pkg/mod --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 +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" +RUN --mount=type=cache,target=/go/pkg/mod --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 +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" +RUN --mount=type=cache,target=/go/pkg/mod --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 +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" +RUN --mount=type=cache,target=/go/pkg/mod --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 +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" +RUN --mount=type=cache,target=/go/pkg/mod --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 +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" +RUN --mount=type=cache,target=/go/pkg/mod --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 +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" +RUN --mount=type=cache,target=/go/pkg/mod --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 --platform=$BUILDPLATFORM builder AS da-server-builder +RUN --mount=type=cache,target=/go/pkg/mod --mount=type=cache,target=/root/.cache/go-build cd op-alt-da && make da-server \ + GOOS=$TARGETOS GOARCH=$TARGETARCH GITCOMMIT=$GIT_COMMIT GITDATE=$GIT_DATE -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=$BUILDPLATFORM builder AS op-supervisor-builder +ARG OP_SUPERVISOR_VERSION=v0.0.0 +RUN --mount=type=cache,target=/go/pkg/mod --mount=type=cache,target=/root/.cache/go-build cd op-supervisor && make op-supervisor \ + GOOS=$TARGETOS GOARCH=$TARGETARCH GITCOMMIT=$GIT_COMMIT GITDATE=$GIT_DATE VERSION="$OP_SUPERVISOR_VERSION" + +FROM --platform=$BUILDPLATFORM builder AS op-deployer-builder +ARG OP_NODE_VERSION=v0.0.0 +RUN --mount=type=cache,target=/go/pkg/mod --mount=type=cache,target=/root/.cache/go-build cd op-chain-ops && make op-deployer \ + GOOS=$TARGETOS GOARCH=$TARGETARCH GITCOMMIT=$GIT_COMMIT GITDATE=$GIT_DATE VERSION="$OP_DEPLOYER_VERSION" -FROM --platform=$TARGETPLATFORM $TARGET_BASE_IMAGE as cannon-target +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 +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 +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 +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 +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/ @@ -139,22 +132,30 @@ 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 +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 +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 +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 +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/ +FROM --platform=$TARGETPLATFORM $TARGET_BASE_IMAGE AS da-server-target +COPY --from=da-server-builder /app/op-alt-da/bin/da-server /usr/local/bin/ CMD ["da-server"] + +FROM --platform=$TARGETPLATFORM $TARGET_BASE_IMAGE AS op-supervisor-target +COPY --from=op-supervisor-builder /app/op-supervisor/bin/op-supervisor /usr/local/bin/ +CMD ["op-supervisor"] + +FROM --platform=$TARGETPLATFORM $TARGET_BASE_IMAGE AS op-deployer-target +COPY --from=op-deployer-builder /app/op-chain-ops/bin/op-deployer /usr/local/bin/ +CMD ["op-deployer"] \ No newline at end of file diff --git a/ops/docker/op-stack-go/Dockerfile.dockerignore b/ops/docker/op-stack-go/Dockerfile.dockerignore index 9512fe9fbc7c..1c0841df1f33 100644 --- a/ops/docker/op-stack-go/Dockerfile.dockerignore +++ b/ops/docker/op-stack-go/Dockerfile.dockerignore @@ -4,20 +4,19 @@ !/cannon !/op-batcher -!/op-bindings !/op-bootnode !/op-chain-ops !/op-challenger !/packages/contracts-bedrock/snapshots !/op-dispute-mon !/op-conductor -!/op-heartbeat !/op-node !/op-preimage !/op-program !/op-proposer !/op-service +!/op-supervisor !/op-wheel -!/op-plasma +!/op-alt-da !/go.mod !/go.sum diff --git a/ops/docker/proofs-tools/Dockerfile b/ops/docker/proofs-tools/Dockerfile new file mode 100644 index 000000000000..61f39c8af705 --- /dev/null +++ b/ops/docker/proofs-tools/Dockerfile @@ -0,0 +1,26 @@ +ARG GIT_COMMIT +ARG GIT_DATE + +ARG CHALLENGER_VERSION +ARG KONA_VERSION +ARG ASTERISC_VERSION + +FROM --platform=$BUILDPLATFORM us-docker.pkg.dev/oplabs-tools-artifacts/images/op-challenger:$CHALLENGER_VERSION AS challenger +FROM --platform=$BUILDPLATFORM ghcr.io/anton-rs/kona/kona-fpp-asterisc:$KONA_VERSION AS kona +FROM --platform=$BUILDPLATFORM ghcr.io/ethereum-optimism/asterisc/asterisc:$ASTERISC_VERSION AS asterisc + +FROM --platform=$BUILDPLATFORM ubuntu:22.04 AS proofs-tools +RUN apt-get update && apt-get install -y --no-install-recommends musl openssl ca-certificates +COPY --from=challenger /usr/local/bin/op-challenger /usr/local/bin/ +COPY --from=challenger /usr/local/bin/cannon /usr/local/bin/ +ENV OP_CHALLENGER_CANNON_BIN /usr/local/bin/cannon +COPY --from=challenger /usr/local/bin/op-program /usr/local/bin/ +ENV OP_CHALLENGER_CANNON_SERVER=/usr/local/bin/op-program + +COPY --from=kona /kona-host /usr/local/bin/ +ENV OP_CHALLENGER_ASTERISC_KONA_SERVER=/usr/local/bin/kona-host + +COPY --from=asterisc /usr/local/bin/asterisc /usr/local/bin/ +ENV OP_CHALLENGER_ASTERISC_BIN=/usr/local/bin/asterisc + +CMD /usr/local/bin/op-challenger diff --git a/ops/docker/proofs-tools/README.md b/ops/docker/proofs-tools/README.md new file mode 100644 index 000000000000..faa47f8d4ad3 --- /dev/null +++ b/ops/docker/proofs-tools/README.md @@ -0,0 +1,8 @@ +## Proofs Tools + +The proofs-tools docker image provides a collection of useful fault proofs related tools in a single docker image. +In particular it provides op-challenger with cannon, asterisc, op-program and kona-host ready to participate in +cannon, asterisc or asterisc-kona game types. + +The version of each tool used in the image is specified +in [docker-bake.hcl](https://github.com/ethereum-optimism/optimism/blob/develop/docker-bake.hcl). diff --git a/ops/scripts/ci-docker-tag-op-stack-release.sh b/ops/scripts/ci-docker-tag-op-stack-release.sh index b6c3cb6eb412..09ae8ad81df3 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|da-server|indexer|ufm-[a-z0-9\-]*|op-[a-z0-9\-]*)' || true) +IMAGE_NAME=$(echo "$GIT_TAG" | grep -Eow '^(ci-builder(-rust)?|da-server|proofs-tools|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/ci-versions.js b/ops/scripts/ci-versions.js deleted file mode 100644 index e0a565a2348e..000000000000 --- a/ops/scripts/ci-versions.js +++ /dev/null @@ -1,13 +0,0 @@ -const os = require('os') - -// this script unbundles the published packages output -// from changesets action to a key-value pair to be used -// with our publishing CI workflow -data = process.argv[2] -data = JSON.parse(data) - -for (const i of data) { - const name = i.name.replace("@eth-optimism/", "") - const version = i.version - process.stdout.write(`::set-output name=${name}::${version}` + os.EOL) -} diff --git a/ops/scripts/todo-checker.sh b/ops/scripts/todo-checker.sh index d90d97fc47c9..6b144ec200cf 100755 --- a/ops/scripts/todo-checker.sh +++ b/ops/scripts/todo-checker.sh @@ -5,6 +5,7 @@ set -uo pipefail # Flags FAIL_INVALID_FMT=false VERBOSE=false +CHECK_CLOSED=false # Github API access token (Optional - necessary for private repositories.) GH_API_TOKEN="${CI_TODO_CHECKER_PAT:-""}" @@ -36,6 +37,7 @@ NC='\033[0m' # No Color # # `--strict`: Toggle strict mode; Will fail if any TODOs are found that don't match the expected # `--verbose`: Toggle verbose mode; Will print out details about each TODO +# `--check-closed`: Check for closed issues and error out if found for arg in "$@"; do case $arg in --strict) @@ -46,6 +48,10 @@ for arg in "$@"; do VERBOSE=true shift ;; + --check-closed) + CHECK_CLOSED=true + shift + ;; esac done @@ -65,10 +71,10 @@ for todo in $todos; do # * TODO(repo#): (Default org "ethereum-optimism") # * TODO(org/repo#): # - # Check if it's just a number - if [[ $ISSUE_REFERENCE =~ ^[0-9]+$ ]]; then + # Check if it's just a number or a number with a leading # + if [[ $ISSUE_REFERENCE =~ ^[0-9]+$ ]] || [[ $ISSUE_REFERENCE =~ ^#([0-9]+)$ ]]; then REPO_FULL="$ORG/$REPO" - ISSUE_NUM="$ISSUE_REFERENCE" + ISSUE_NUM="${ISSUE_REFERENCE#\#}" # Remove leading # if present # Check for org_name/repo_name#number format elif [[ $ISSUE_REFERENCE =~ ^([^/]+)/([^#]+)#([0-9]+)$ ]]; then REPO_FULL="${BASH_REMATCH[1]}/${BASH_REMATCH[2]}" @@ -104,14 +110,16 @@ for todo in $todos; do # Check issue state STATE=$(echo "$RESPONSE" | jq -r .state) - if [[ "$STATE" == "closed" ]]; then + if [[ "$STATE" == "closed" ]] && $CHECK_CLOSED; then echo -e "${RED}[Error]:${NC} Issue #$ISSUE_NUM is closed. Please remove the TODO in ${GREEN}$FILE:$LINE_NUM${NC} referencing ${YELLOW}$ISSUE_REFERENCE${NC} (${CYAN}https://github.com/$GH_URL_PATH${NC})" exit 1 fi - ((OPEN_COUNT++)) - TITLE=$(echo "$RESPONSE" | jq -r .title) - OPEN_ISSUES+=("$REPO_FULL/issues/$ISSUE_NUM|$TITLE|$FILE:$LINE_NUM") + if [[ "$STATE" == "open" ]]; then + ((OPEN_COUNT++)) + TITLE=$(echo "$RESPONSE" | jq -r .title) + OPEN_ISSUES+=("$REPO_FULL/issues/$ISSUE_NUM|$TITLE|$FILE:$LINE_NUM") + fi done # Print summary diff --git a/ops/scripts/update-op-geth.py b/ops/scripts/update-op-geth.py index 3747b5852546..20aaec2349b6 100755 --- a/ops/scripts/update-op-geth.py +++ b/ops/scripts/update-op-geth.py @@ -1,7 +1,6 @@ #!/usr/bin/env python3 -import json import subprocess import os @@ -10,7 +9,7 @@ def main(): - for project in ('.', 'indexer'): + for project in ('.',): print(f'Updating {project}...') update_mod(project) diff --git a/ops/tag-service/tag-service.py b/ops/tag-service/tag-service.py index e27e081f5c64..9e18baf31aa7 100755 --- a/ops/tag-service/tag-service.py +++ b/ops/tag-service/tag-service.py @@ -3,7 +3,6 @@ import os import re import subprocess -import sys import click import semver @@ -12,18 +11,13 @@ MIN_VERSIONS = { 'ci-builder': '0.6.0', 'ci-builder-rust': '0.1.0', - 'chain-mon': '0.2.2', - 'indexer': '0.5.0', + 'da-server': '0.0.4', 'op-node': '0.10.14', 'op-batcher': '0.10.14', 'op-challenger': '0.0.4', 'op-program': '0.0.0', 'op-dispute-mon': '0.0.0', 'op-proposer': '0.10.14', - 'op-ufm': '0.1.0', - 'proxyd': '3.16.0', - 'op-heartbeat': '0.1.0', - 'ufm-metamask': '0.1.0', 'op-contracts': '1.0.0', 'op-conductor': '0.0.0', } diff --git a/ops/tag-service/tag-tool.py b/ops/tag-service/tag-tool.py index ef3b68ed6cd9..dedd3601fc8e 100644 --- a/ops/tag-service/tag-tool.py +++ b/ops/tag-service/tag-tool.py @@ -1,23 +1,16 @@ import argparse import subprocess -import re import semver SERVICES = [ 'ci-builder', 'ci-builder-rust', - 'chain-mon', - 'indexer', 'op-node', 'op-batcher', 'op-challenger', '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 @@ -93,4 +86,3 @@ def main(): if __name__ == "__main__": main() - diff --git a/package.json b/package.json deleted file mode 100644 index 472ac9d4df33..000000000000 --- a/package.json +++ /dev/null @@ -1,84 +0,0 @@ -{ - "name": "optimism", - "version": "1.0.0", - "author": "Optimism PBC", - "license": "MIT", - "private": true, - "engines": { - "node": ">=16", - "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.'", - "bindings": "nx bindings @eth-optimism/contracts-bedrock", - "build": "npx nx run-many --target=build", - "test": "npx nx run-many --target=test", - "issues": "./ops/scripts/todo-checker.sh", - "install:ci": "pnpm install --ignore-scripts --frozen-lockfile && pnpm rebuild nx", - "install:ci:offline": "pnpm install --ignore-scripts --offline --frozen-lockfile && pnpm rebuild nx", - "lint": "npx nx run-many --target=lint", - "test:coverage": "npx nx run-many --target=test:coverage", - "lint:ts:check": "npx nx run-many --target=lint:ts:check", - "lint:check": "npx nx run-many --target=lint:check", - "lint:fix": "npx nx run-many --target=lint:fix", - "lint:shellcheck": "find . -type f -name '*.sh' -not -path '*/node_modules/*' -not -path './packages/contracts-bedrock/lib/*' -not -path './packages/contracts-bedrock/kout*/*' -not -path './.husky/_/husky.sh' -exec sh -c 'echo \"Checking $1\"; shellcheck \"$1\"' _ {} \\;", - "preinstall": "npx only-allow pnpm", - "ready": "pnpm lint && pnpm test", - "prepare": "husky install", - "release": "npx nx run-many --target=build --skip-nx-cache && pnpm changeset publish", - "release:check": "changeset status --verbose --since=origin/main", - "release:publish": "pnpm install --frozen-lockfile && npx nx run-many --target=build && pnpm build && changeset publish", - "release:version": "changeset version && pnpm install --lockfile-only", - "install:foundry": "curl -L https://foundry.paradigm.xyz | bash && pnpm update:foundry", - "update:foundry": "bash ./ops/scripts/install-foundry.sh", - "check:foundry": "bash ./packages/contracts-bedrock/scripts/checks/check-foundry-install.sh", - "install:kontrol": "curl -L https://kframework.org/install | bash && pnpm update:kontrol", - "update:kontrol": "kup install kontrol --version v$(jq -r .kontrol < versions.json)", - "install:abigen": "go install github.com/ethereum/go-ethereum/cmd/abigen@$(jq -r .abigen < versions.json)", - "print:abigen": "abigen --version | sed -e 's/[^0-9]/ /g' -e 's/^ *//g' -e 's/ *$//g' -e 's/ /./g' -e 's/^/v/'", - "check:abigen": "[[ $(pnpm -s print:abigen) = $(cat versions.json | jq -r '.abigen') ]] && echo '✓ abigen versions match' || (echo '✗ abigen version mismatch. Run `pnpm upgrade:abigen` to upgrade.' && exit 1)", - "upgrade:abigen": "jq '.abigen = $v' --arg v $(pnpm -s print:abigen) <<<$(cat versions.json) > versions.json", - "install:slither": "pip3 install slither-analyzer==$(jq -r .slither < versions.json)", - "print:slither": "slither --version", - "check:slither": "[[ $(pnpm -s print:slither) = $(jq -r .slither < versions.json) ]] && echo '✓ slither versions match' || (echo '✗ slither version mismatch. Run `pnpm upgrade:slither` to upgrade.' && exit 1)", - "upgrade:slither": "jq '.slither = $v' --arg v $(pnpm -s print:slither) <<<$(cat versions.json) > versions.json" - }, - "devDependencies": { - "@babel/eslint-parser": "^7.23.10", - "@changesets/changelog-github": "^0.4.8", - "@types/chai": "^4.3.11", - "@types/chai-as-promised": "^7.1.8", - "@types/mocha": "^10.0.6", - "@types/node": "^20.11.17", - "@typescript-eslint/eslint-plugin": "^6.21.0", - "@typescript-eslint/parser": "^6.21.0", - "chai": "^4.3.10", - "depcheck": "^1.4.7", - "doctoc": "^2.2.0", - "eslint": "^8.56.0", - "eslint-config-prettier": "^9.1.0", - "eslint-config-standard": "^16.0.3", - "eslint-plugin-import": "^2.29.1", - "eslint-plugin-jsdoc": "^48.0.6", - "eslint-plugin-node": "^11.1.0", - "eslint-plugin-prefer-arrow": "^1.2.3", - "eslint-plugin-prettier": "^4.0.0", - "eslint-plugin-promise": "^5.1.0", - "eslint-plugin-react": "^7.24.0", - "eslint-plugin-unicorn": "^50.0.1", - "husky": "^9.0.10", - "lint-staged": "15.2.0", - "mocha": "^10.2.0", - "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.4.5", - "wait-on": "^7.2.0" - }, - "dependencies": { - "@changesets/cli": "^2.27.1" - } -} diff --git a/packages/chain-mon/.depcheckrc b/packages/chain-mon/.depcheckrc deleted file mode 100644 index 3a691b778839..000000000000 --- a/packages/chain-mon/.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/chain-mon/.env.example b/packages/chain-mon/.env.example deleted file mode 100644 index 0e10b0aaf530..000000000000 --- a/packages/chain-mon/.env.example +++ /dev/null @@ -1,95 +0,0 @@ -############################################################################### -# ↓ balance-mon ↓ # -############################################################################### - -# RPC pointing to network to monitor balances on -BALANCE_MON__RPC= - -# JSON array in the format [{ "address":
, "nickname": }, ... ] -BALANCE_MON__ACCOUNTS= - - -############################################################################### -# ↓ multisig-mon ↓ # -############################################################################### - -# RPC pointing to network to monitor safe nonces on -MULTISIG_MON__RPC= - -# JSON array in the format [{ "address":
, "nickname": }, ... ] -MULTISIG_MON__ACCOUNTS= - - -############################################################################### -# ↓ wallet-mon ↓ # -############################################################################### - -# RPC pointing to network to monitor -WALLET_MON__RPC= - -# The block number to start monitoring from -# Defaults to the first bedrock block if unset. -WALLET_MON__START_BLOCK_NUMBER= - -############################################################################### -# ↓ drippie-mon ↓ # -############################################################################### - -# RPC pointing to network where Drippie is deployed -DRIPPIE_MON__RPC= - -# Address of the Drippie contract -DRIPPIE_MON__DRIPPIE_ADDRESS= - -############################################################################### -# ↓ wd-mon ↓ # -############################################################################### - -# RPCs pointing to a base chain and Optimism chain -TWO_STEP_MONITOR__L1_RPC_PROVIDER= -TWO_STEP_MONITOR__L2_RPC_PROVIDER= - -# The block number to start monitoring from -TWO_STEP_MONITOR__START_BLOCK_NUMBER= - -############################################################################### -# ↓ fault-mon ↓ # -############################################################################### - -# --l1rpcprovider Provider for interacting with L1 (env: FAULT_DETECTOR__L1_RPC_PROVIDER) -FAULT_DETECTOR__L1_RPC_PROVIDER= -# --l2rpcprovider Provider for interacting with L2 (env: FAULT_DETECTOR__L2_RPC_PROVIDER) -FAULT_DETECTOR__L2_RPC_PROVIDER= -# --bedrock Whether or not the service is running against a Bedrock chain (env: FAULT_DETECTOR__BEDROCK) -BEDROCK=true - -############################################################################### -# ↓ initialized-upgraded-mon ↓ # -############################################################################### - -# RPC pointing to network to monitor -INITIALIZED_UPGRADED_MON__RPC= - -# The block number to start monitoring from -# Defaults to the first bedrock block if unset. -INITIALIZED_UPGRADED_MON__START_BLOCK_NUMBER= - -# JSON array in the format [{ "label": , "address":
}, ... ] -INITIALIZED_UPGRADED_MON__CONTRACTS= - -# Optional Params - -# --startbatchindex Batch index to start checking from. For bedrock chains, this is the L2 height to start from (env: FAULT_DETECTOR__START_BATCH_INDEX) -# FAULT_DETECTOR__START_BATCH_INDEX= -# --optimismportaladdress [Custom Bedrock Chains] Deployed OptimismPortal contract address. Used to retrieve necessary info for output verification (env: FAULT_DETECTOR__OPTIMISM_PORTAL_ADDRESS) -# FAULT_DETECTOR__OPTIMISM_PORTAL_ADDRESS= -# --statecommitmentchainaddress [Custom Legacy Chains] Deployed StateCommitmentChain contract address. Used to fetch necessary info for output verification. (env: FAULT_DETECTOR__STATE_COMMITMENT_CHAIN_ADDRESS) -# FAULT_DETECTOR__STATE_COMMITMENT_CHAIN_ADDRESS= -# --loopintervalms Loop interval in milliseconds, only applies if service is set to loop (env: FAULT_DETECTOR__LOOP_INTERVAL_MS) -# FAULT_DETECTOR__LOOP_INTERVAL_MS= -# --port Port for the app server (env: FAULT_DETECTOR__PORT) -# FAULT_DETECTOR__PORT= -# --hostname Hostname for the app server (env: FAULT_DETECTOR__HOSTNAME) -# FAULT_DETECTOR__HOSTNAME= -# --loglevel Log level (env: FAULT_DETECTOR__LOG_LEVEL) -# FAULT_DETECTOR__LOG_LEVEL= diff --git a/packages/chain-mon/.eslintrc.js b/packages/chain-mon/.eslintrc.js deleted file mode 100644 index bfd2057be80b..000000000000 --- a/packages/chain-mon/.eslintrc.js +++ /dev/null @@ -1,3 +0,0 @@ -module.exports = { - extends: '../../.eslintrc.js', -} diff --git a/packages/chain-mon/.lintstagedrc.yml b/packages/chain-mon/.lintstagedrc.yml deleted file mode 100644 index a3035a2299b2..000000000000 --- a/packages/chain-mon/.lintstagedrc.yml +++ /dev/null @@ -1,2 +0,0 @@ -"*.{ts,js}": - - eslint diff --git a/packages/chain-mon/.prettierrc.js b/packages/chain-mon/.prettierrc.js deleted file mode 100644 index 6b3fa8e2ce23..000000000000 --- a/packages/chain-mon/.prettierrc.js +++ /dev/null @@ -1,3 +0,0 @@ -module.exports = { - ...require('../../.prettierrc.js'), -}; \ No newline at end of file diff --git a/packages/chain-mon/CHANGELOG.md b/packages/chain-mon/CHANGELOG.md deleted file mode 100644 index bb0af76311f0..000000000000 --- a/packages/chain-mon/CHANGELOG.md +++ /dev/null @@ -1,596 +0,0 @@ -# @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 - -- Updated dependencies [[`3ccd12fe5c8c4c5a6acbf370d474ffa8db816562`](https://github.com/ethereum-optimism/optimism/commit/3ccd12fe5c8c4c5a6acbf370d474ffa8db816562)]: - - @eth-optimism/sdk@3.2.2 - -## 0.6.1 - -### Patch Changes - -- Updated dependencies [[`a1329f21f33ecafe409990964d3af7bf05a8a756`](https://github.com/ethereum-optimism/optimism/commit/a1329f21f33ecafe409990964d3af7bf05a8a756)]: - - @eth-optimism/sdk@3.2.1 - -## 0.6.0 - -### Minor 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)! - Updates wd-mon inside chain-mon to support FPAC. - -### Patch Changes - -- Updated dependencies [[`1ed50c44a5c4fb7244ede3b4c45ea7bbf144c1e5`](https://github.com/ethereum-optimism/optimism/commit/1ed50c44a5c4fb7244ede3b4c45ea7bbf144c1e5), [`d99d425a4f73fba19ffcf180deb0ef48ff3b9a6a`](https://github.com/ethereum-optimism/optimism/commit/d99d425a4f73fba19ffcf180deb0ef48ff3b9a6a), [`79effc52e8b82d15b5eda43acf540ac6c5f8d5d7`](https://github.com/ethereum-optimism/optimism/commit/79effc52e8b82d15b5eda43acf540ac6c5f8d5d7), [`73a748575e7c3d67c293814a12bf41eee216163c`](https://github.com/ethereum-optimism/optimism/commit/73a748575e7c3d67c293814a12bf41eee216163c), [`44a2d9cec5f3b309b723b3e4dd8d29b5b70f1cc8`](https://github.com/ethereum-optimism/optimism/commit/44a2d9cec5f3b309b723b3e4dd8d29b5b70f1cc8)]: - - @eth-optimism/common-ts@0.8.8 - - @eth-optimism/sdk@3.2.0 - - @eth-optimism/contracts-bedrock@0.17.1 - -## 0.5.7 - -### Patch Changes - -- Updated dependencies [[`18becd7e4`](https://github.com/ethereum-optimism/optimism/commit/18becd7e457577c105f6bc03597e069334cb7433)]: - - @eth-optimism/sdk@3.1.8 - -## 0.5.6 - -### Patch Changes - -- Updated dependencies [[`6ec80fd19`](https://github.com/ethereum-optimism/optimism/commit/6ec80fd19d9155b17a0873672fb095d323f6e8fb)]: - - @eth-optimism/sdk@3.1.7 - -## 0.5.5 - -### Patch Changes - -- [#8306](https://github.com/ethereum-optimism/optimism/pull/8306) [`dcb252917`](https://github.com/ethereum-optimism/optimism/commit/dcb25291768ec0f2386486619971d5cd66fbb409) Thanks [@protolambda](https://github.com/protolambda)! - Fixed bug with custom chains not being able to set a custom portal address - -## 0.5.4 - -### Patch Changes - -- Updated dependencies [[`dd0e46986`](https://github.com/ethereum-optimism/optimism/commit/dd0e46986f19dcceb304fc48f2bd410685ecd179)]: - - @eth-optimism/sdk@3.1.6 - -## 0.5.3 - -### Patch Changes - -- Updated dependencies [[`2534eabb5`](https://github.com/ethereum-optimism/optimism/commit/2534eabb50afe76f176407f83cc1f1c606e6de69)]: - - @eth-optimism/sdk@3.1.5 - -## 0.5.2 - -### Patch Changes - -- [#7824](https://github.com/ethereum-optimism/optimism/pull/7824) [`98eb885f5`](https://github.com/ethereum-optimism/optimism/commit/98eb885f5003ee5e6b9bbd532a42bba2ad39cb4b) Thanks [@roninjin10](https://github.com/roninjin10)! - Bump node version to LTS node 20.9.0 - -## 0.5.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 - -- Updated dependencies [[`ac90e16a7`](https://github.com/ethereum-optimism/optimism/commit/ac90e16a7f85c4f73661ae6023135c3d00421c1e)]: - - @eth-optimism/common-ts@0.8.7 - - @eth-optimism/contracts-bedrock@0.16.2 - - @eth-optimism/core-utils@0.13.1 - - @eth-optimism/sdk@3.1.4 - -## 0.5.0 - -### Minor Changes - -- [#7178](https://github.com/ethereum-optimism/optimism/pull/7178) [`85d1622df`](https://github.com/ethereum-optimism/optimism/commit/85d1622dfdc16f220f7df0be42ba8cbc5dea31c5) Thanks [@tynes](https://github.com/tynes)! - Use node.js v18 - -### Patch Changes - -- Updated dependencies [[`210b2c81d`](https://github.com/ethereum-optimism/optimism/commit/210b2c81dd383bad93480aa876b283d9a0c991c2), [`679207751`](https://github.com/ethereum-optimism/optimism/commit/6792077510fd76553c179d8b8d068262cda18db6), [`2440f5e7a`](https://github.com/ethereum-optimism/optimism/commit/2440f5e7ab6577f2d2e9c8b0c78c014290dde8e7)]: - - @eth-optimism/core-utils@0.13.0 - - @eth-optimism/sdk@3.1.3 - - @eth-optimism/contracts-bedrock@0.16.1 - - @eth-optimism/common-ts@0.8.6 - -## 0.4.4 - -### Patch Changes - -- Updated dependencies [[`9c3a03855`](https://github.com/ethereum-optimism/optimism/commit/9c3a03855dc982f0b4e1d664e83271883536632b), [`33eb63b10`](https://github.com/ethereum-optimism/optimism/commit/33eb63b10559a2267c814eda8129447c72940839)]: - - @eth-optimism/sdk@3.1.2 - - @eth-optimism/common-ts@0.8.5 - -## 0.4.3 - -### Patch Changes - -- [#6796](https://github.com/ethereum-optimism/optimism/pull/6796) [`a196c63ad`](https://github.com/ethereum-optimism/optimism/commit/a196c63ad67de04c4143e0ccd6fe4dc27fb2833b) Thanks [@roninjin10](https://github.com/roninjin10)! - Upgraded npm dependencies to latest - -- Updated dependencies [[`dfa309e34`](https://github.com/ethereum-optimism/optimism/commit/dfa309e3430ebc8790b932554dde120aafc4161e)]: - - @eth-optimism/core-utils@0.12.3 - - @eth-optimism/common-ts@0.8.4 - - @eth-optimism/sdk@3.1.1 - -## 0.4.2 - -### Patch Changes - -- [#6469](https://github.com/ethereum-optimism/optimism/pull/6469) [`0c769680e`](https://github.com/ethereum-optimism/optimism/commit/0c769680e44208c086deef2f9c03c37da2b536fe) Thanks [@maurelian](https://github.com/maurelian)! - Update language in fault-mon from batches to outputs - -## 0.4.1 - -### Patch Changes - -- [#6206](https://github.com/ethereum-optimism/optimism/pull/6206) [`3969730dc`](https://github.com/ethereum-optimism/optimism/commit/3969730dc938947a7105c27989e53d4b5cf788a9) Thanks [@tynes](https://github.com/tynes)! - Update import path for artifact - -- Updated dependencies [[`a666c4f20`](https://github.com/ethereum-optimism/optimism/commit/a666c4f2082253abbb68c0678e5a0a1ed0c00f4b), [`ff577455f`](https://github.com/ethereum-optimism/optimism/commit/ff577455f196b5f5b8a889339b845561ca6c538a), [`89ca741a6`](https://github.com/ethereum-optimism/optimism/commit/89ca741a63c5e07f9d691bb6f7a89f7718fc49ca), [`c11039060`](https://github.com/ethereum-optimism/optimism/commit/c11039060bc037a88916c2cba602687b6d69ad1a), [`72d184854`](https://github.com/ethereum-optimism/optimism/commit/72d184854ebad8b2025641f126ed76573b1f0ac3), [`77da6edc6`](https://github.com/ethereum-optimism/optimism/commit/77da6edc643e0b5e39f7b6bb41c3c7ead418a876), [`3f13fd0bb`](https://github.com/ethereum-optimism/optimism/commit/3f13fd0bbea051a4550f1df6def1a53a616aa6f6), [`639163253`](https://github.com/ethereum-optimism/optimism/commit/639163253a5e2128f1c21c446b68d358d38cbd30)]: - - @eth-optimism/sdk@3.1.0 - - @eth-optimism/contracts-bedrock@0.16.0 - - @eth-optimism/core-utils@0.12.2 - - @eth-optimism/common-ts@0.8.3 - -## 0.4.0 - -### Minor Changes - -- d6388be4a: Added a new service wallet-mon to identify unexpected transfers from key accounts - -### Patch Changes - -- 287d317d3: Fixed an issue with logging the wrong timestamp. -- Updated dependencies [8d7dcc70c] -- Updated dependencies [119754c2f] -- Updated dependencies [d6388be4a] -- Updated dependencies [af292562f] - - @eth-optimism/core-utils@0.12.1 - - @eth-optimism/sdk@3.0.0 - - @eth-optimism/contracts-bedrock@0.15.0 - - @eth-optimism/common-ts@0.8.2 - -## 0.3.1 - -### Patch Changes - -- a26c484af: Fixes a bug in the wd-mon service where a node connection failure event was not handled correctly -- Updated dependencies [2129dafa3] -- Updated dependencies [a1b7ff9e3] -- Updated dependencies [8133872ed] -- Updated dependencies [afc2ab8c9] -- Updated dependencies [188d1e930] -- Updated dependencies [5063a69fb] -- Updated dependencies [aa854bdd8] - - @eth-optimism/contracts-periphery@1.0.8 - - @eth-optimism/sdk@2.1.0 - -## 0.3.0 - -### Minor Changes - -- 1e7897c81: Introduces the balance-mon service to chain-mon. - -### Patch Changes - -- dbe5eb308: Empty patch release to re-release packages that failed to be released by a bug in the release process. -- Updated dependencies [be3315689] - - @eth-optimism/sdk@2.0.2 - -## 0.2.1 - -### Patch Changes - -- Updated dependencies [fecd42d67] -- Updated dependencies [66cafc00a] - - @eth-optimism/common-ts@0.8.1 - - @eth-optimism/sdk@2.0.1 - -## 0.2.0 - -### Minor Changes - -- 282bda091: Added a withdrawal monitoring service - -### Patch Changes - -- Updated dependencies [cb19e2f9c] - - @eth-optimism/sdk@2.0.0 - -## 0.1.3 - -### Patch Changes - -- @eth-optimism/sdk@1.10.4 - -## 0.1.2 - -### Patch Changes - -- @eth-optimism/sdk@1.10.3 - -## 0.1.1 - -### Patch Changes - -- 0515a7841: Added withdrawal monitoring to identify proven withdrawals not included in the L2ToL1MessagePasser's sentMessages mapping -- Updated dependencies [0e179781b] -- Updated dependencies [5372c9f5b] -- Updated dependencies [4ae94b412] - - @eth-optimism/common-ts@0.8.0 - - @eth-optimism/sdk@1.10.2 - -## 0.4.3 - -### Patch Changes - -- Updated dependencies [f04e5db2d] -- Updated dependencies [4c64a5811] - - @eth-optimism/common-ts@0.7.1 - - @eth-optimism/contracts-periphery@1.0.7 - - @eth-optimism/sdk@1.10.1 - -## 0.4.2 - -### Patch Changes - -- Updated dependencies [3f4b3c328] - - @eth-optimism/sdk@1.10.0 - -## 0.4.1 - -### Patch Changes - -- Updated dependencies [0222215f6] - - @eth-optimism/contracts-periphery@1.0.6 - - @eth-optimism/sdk@1.9.1 - -## 0.4.0 - -### Minor Changes - -- 9b2891852: Refactors BaseServiceV2 slightly, merges standard options with regular options - -### Patch 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. -- Updated dependencies [fe8f2afd0] -- Updated dependencies [e23f60f63] -- Updated dependencies [886fec5bb] -- Updated dependencies [596d51852] -- Updated dependencies [ab8ec365c] -- Updated dependencies [c12aeb2f9] -- Updated dependencies [a610b4f3b] -- Updated dependencies [55515ba14] -- Updated dependencies [ba8b94a60] -- Updated dependencies [9b2891852] -- Updated dependencies [d1f9098f9] -- Updated dependencies [c6c9c7dbf] -- Updated dependencies [bf5f9febd] -- Updated dependencies [ffcee1013] -- Updated dependencies [9a996a13c] -- Updated dependencies [09924e8ed] -- Updated dependencies [746ce5545] -- Updated dependencies [eceb0de1d] -- Updated dependencies [0e0546a11] - - @eth-optimism/contracts-periphery@1.0.5 - - @eth-optimism/common-ts@0.7.0 - - @eth-optimism/sdk@1.9.0 - -## 0.3.24 - -### Patch Changes - -- 1d3c749a2: Bumps the version of ts-node used -- Updated dependencies [1d3c749a2] -- Updated dependencies [767585b07] -- Updated dependencies [c975c9620] -- Updated dependencies [136ea1785] - - @eth-optimism/contracts-periphery@1.0.4 - - @eth-optimism/sdk@1.8.0 - - @eth-optimism/core-utils@0.12.0 - - @eth-optimism/common-ts@0.6.8 - -## 0.3.23 - -### Patch Changes - -- Updated dependencies [f49b71d50] -- Updated dependencies [1bfe79f20] - - @eth-optimism/contracts-periphery@1.0.3 - - @eth-optimism/sdk@1.7.0 - -## 0.3.22 - -### Patch Changes - -- 97b5f578c: Fixes how versions are imported for BaseServiceV2 services - - @eth-optimism/sdk@1.6.11 - -## 0.3.21 - -### Patch Changes - -- Updated dependencies [1e76cdb86] - - @eth-optimism/core-utils@0.11.0 - - @eth-optimism/common-ts@0.6.7 - - @eth-optimism/sdk@1.6.10 - -## 0.3.20 - -### Patch Changes - -- @eth-optimism/sdk@1.6.9 - -## 0.3.19 - -### Patch Changes - -- @eth-optimism/sdk@1.6.8 - -## 0.3.18 - -### Patch Changes - -- Updated dependencies [b40913b1] -- Updated dependencies [a5e715c3] -- Updated dependencies [e81a6ff5] -- Updated dependencies [a3242d4f] -- Updated dependencies [ffa5297e] - - @eth-optimism/sdk@1.6.7 - - @eth-optimism/contracts-periphery@1.0.2 - -## 0.3.17 - -### Patch Changes - -- Updated dependencies [02c457a5] -- Updated dependencies [ce7da914] -- Updated dependencies [d3fe9b6d] -- Updated dependencies [220ad4ef] -- Updated dependencies [5d86ff0e] - - @eth-optimism/contracts-periphery@1.0.1 - - @eth-optimism/common-ts@0.6.6 - - @eth-optimism/sdk@1.6.6 - -## 0.3.16 - -### Patch Changes - -- Updated dependencies [e2faaa8b] -- Updated dependencies [5c3f2b1f] -- Updated dependencies [3883f34b] - - @eth-optimism/sdk@1.6.5 - - @eth-optimism/contracts-periphery@1.0.0 - -## 0.3.15 - -### Patch Changes - -- 7215f4ce: Bump ethers to 5.7.0 globally -- 0ceff8b8: Drippie Spearbit audit fix for issue #25, reorder DripStatus enum for clarity -- Updated dependencies [7215f4ce] -- Updated dependencies [0ceff8b8] -- Updated dependencies [0ceff8b8] -- Updated dependencies [0ceff8b8] -- Updated dependencies [0ceff8b8] -- Updated dependencies [0ceff8b8] -- Updated dependencies [0ceff8b8] -- Updated dependencies [0ceff8b8] -- Updated dependencies [206f6033] -- Updated dependencies [0ceff8b8] -- Updated dependencies [0ceff8b8] -- Updated dependencies [0ceff8b8] -- Updated dependencies [d7679ca4] -- Updated dependencies [0ceff8b8] -- Updated dependencies [0ceff8b8] -- Updated dependencies [0ceff8b8] - - @eth-optimism/common-ts@0.6.5 - - @eth-optimism/contracts-periphery@0.2.4 - - @eth-optimism/core-utils@0.10.1 - - @eth-optimism/sdk@1.6.4 - -## 0.3.14 - -### Patch Changes - -- @eth-optimism/sdk@1.6.3 - -## 0.3.13 - -### Patch Changes - -- Updated dependencies [cfa81f88] - - @eth-optimism/sdk@1.6.2 - -## 0.3.12 - -### Patch Changes - -- Updated dependencies [f4bf4f52] -- Updated dependencies [b27d0fa7] -- Updated dependencies [dbfea116] - - @eth-optimism/contracts-periphery@0.2.3 - - @eth-optimism/sdk@1.6.1 - - @eth-optimism/core-utils@0.10.0 - - @eth-optimism/common-ts@0.6.4 - -## 0.3.11 - -### Patch Changes - -- Updated dependencies [ea371af2] -- Updated dependencies [3df66a9a] -- Updated dependencies [8323407f] -- Updated dependencies [3af9c7a9] -- Updated dependencies [aa2949ef] -- Updated dependencies [a1a73e64] -- Updated dependencies [f53c30b9] - - @eth-optimism/contracts-periphery@0.2.2 - - @eth-optimism/sdk@1.6.0 - -## 0.3.10 - -### Patch Changes - -- Updated dependencies [dcd715a6] - - @eth-optimism/sdk@1.5.0 - -## 0.3.9 - -### Patch Changes - -- Updated dependencies [0df744f6] -- Updated dependencies [8ae39154] -- Updated dependencies [f05ab6b6] -- Updated dependencies [dac4a9f0] - - @eth-optimism/core-utils@0.9.3 - - @eth-optimism/sdk@1.4.0 - - @eth-optimism/common-ts@0.6.3 - -## 0.3.8 - -### Patch Changes - -- Updated dependencies [0bf3b9b4] -- Updated dependencies [93d3bd41] -- Updated dependencies [680714c1] -- Updated dependencies [8d26459b] -- Updated dependencies [4477fe9f] -- Updated dependencies [29830750] -- Updated dependencies [bcfd1edc] -- Updated dependencies [0bf3b9b4] - - @eth-optimism/core-utils@0.9.2 - - @eth-optimism/contracts-periphery@0.2.1 - - @eth-optimism/sdk@1.3.1 - - @eth-optimism/common-ts@0.6.2 - -## 0.3.7 - -### Patch Changes - -- Updated dependencies [032f7214] - - @eth-optimism/sdk@1.3.0 - -## 0.3.6 - -### Patch Changes - -- Updated dependencies [95fc3fbf] -- Updated dependencies [019657db] -- Updated dependencies [6ff5c0a3] -- Updated dependencies [119f0e97] -- Updated dependencies [9c8b1f00] -- Updated dependencies [8a335b7b] -- Updated dependencies [f9fee446] -- Updated dependencies [89d01f2e] - - @eth-optimism/contracts-periphery@0.2.0 - - @eth-optimism/core-utils@0.9.1 - - @eth-optimism/sdk@1.2.1 - - @eth-optimism/common-ts@0.6.1 - -## 0.3.5 - -### Patch Changes - -- Updated dependencies [3799bb6f] - - @eth-optimism/contracts-periphery@0.1.5 - -## 0.3.4 - -### Patch Changes - -- Updated dependencies [977493bc] -- Updated dependencies [700dcbb0] -- Updated dependencies [3d1cb720] - - @eth-optimism/sdk@1.2.0 - - @eth-optimism/core-utils@0.9.0 - - @eth-optimism/common-ts@0.6.0 - -## 0.3.3 - -### Patch Changes - -- 7142175a: Fix release -- Updated dependencies [cb71fcde] -- Updated dependencies [10e41522] -- Updated dependencies [9aa8049c] - - @eth-optimism/common-ts@0.5.0 - - @eth-optimism/contracts-periphery@0.1.4 - -## 0.3.2 - -### Patch Changes - -- 29ff7462: Revert es target back to 2017 -- Updated dependencies [c201f3f1] -- Updated dependencies [da1633a3] -- Updated dependencies [61a30273] -- Updated dependencies [a320e744] -- Updated dependencies [29ff7462] -- Updated dependencies [604dd315] -- Updated dependencies [52b26878] - - @eth-optimism/common-ts@0.4.0 - - @eth-optimism/contracts-periphery@0.1.3 - - @eth-optimism/core-utils@0.8.7 - - @eth-optimism/sdk@1.1.9 - -## 0.3.1 - -### Patch Changes - -- Updated dependencies [9ba869a7] -- Updated dependencies [050859fd] - - @eth-optimism/common-ts@0.3.1 - -## 0.3.0 - -### Minor Changes - -- 84a8934c: BaseServiceV2 exposes service name and version as standard synthetic metric - -### Patch Changes - -- Updated dependencies [d9e39931] -- Updated dependencies [84a8934c] - - @eth-optimism/common-ts@0.3.0 - -## 0.2.0 - -### Minor Changes - -- 982cb980: Release drippie-mon - -### Patch Changes - -- Updated dependencies [e0b89fcd] -- Updated dependencies [982cb980] -- Updated dependencies [9142adc4] -- Updated dependencies [9ecbf3e5] - - @eth-optimism/contracts-periphery@0.1.2 - - @eth-optimism/common-ts@0.2.10 - - @eth-optimism/sdk@1.1.8 diff --git a/packages/chain-mon/LICENSE b/packages/chain-mon/LICENSE deleted file mode 100644 index 6a7da5218bb2..000000000000 --- a/packages/chain-mon/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/chain-mon/README.md b/packages/chain-mon/README.md deleted file mode 100644 index 2a7a74c72eb9..000000000000 --- a/packages/chain-mon/README.md +++ /dev/null @@ -1,30 +0,0 @@ -# @eth-optimism/chain-mon - -[![codecov](https://codecov.io/gh/ethereum-optimism/optimism/branch/develop/graph/badge.svg?token=0VTG7PG7YR&flag=chain-mon-tests)](https://codecov.io/gh/ethereum-optimism/optimism) - -`chain-mon` is a collection of chain monitoring services. - -## Installation - -Clone, install, and build the Optimism monorepo: - -``` -git clone https://github.com/ethereum-optimism/optimism.git -pnpm install -pnpm build -``` - -## Running a service - -Copy `.env.example` into a new file named `.env`, then set the environment variables listed there depending on the service you want to run. -Once your environment variables have been set, run via: - -``` -pnpm start: -``` - -For example, to run `drippie-mon`, execute: - -``` -pnpm start:drippie-mon -``` diff --git a/packages/chain-mon/contrib/drippie-mon/service.ts b/packages/chain-mon/contrib/drippie-mon/service.ts deleted file mode 100644 index 3fc70181872d..000000000000 --- a/packages/chain-mon/contrib/drippie-mon/service.ts +++ /dev/null @@ -1,193 +0,0 @@ -import { - BaseServiceV2, - StandardOptions, - Gauge, - Counter, - validators, -} from '@eth-optimism/common-ts' -import { Provider } from '@ethersproject/abstract-provider' -import { ethers } from 'ethers' -import * as DrippieArtifact from '@eth-optimism/contracts-bedrock/forge-artifacts/Drippie.sol/Drippie.json' - -import { version } from '../../package.json' - -type DrippieMonOptions = { - rpc: Provider - drippieAddress: string -} - -type DrippieMonMetrics = { - isExecutable: Gauge - executedDripCount: Gauge - unexpectedRpcErrors: Counter -} - -type DrippieMonState = { - drippie: ethers.Contract -} - -export class DrippieMonService extends BaseServiceV2< - DrippieMonOptions, - DrippieMonMetrics, - DrippieMonState -> { - constructor(options?: Partial) { - super({ - version, - name: 'drippie-mon', - loop: true, - options: { - loopIntervalMs: 60_000, - ...options, - }, - optionsSpec: { - rpc: { - validator: validators.provider, - desc: 'Provider for network where Drippie is deployed', - }, - drippieAddress: { - validator: validators.str, - desc: 'Address of Drippie contract', - public: true, - }, - }, - metricsSpec: { - isExecutable: { - type: Gauge, - desc: 'Whether or not the drip is currently executable', - labels: ['name'], - }, - executedDripCount: { - type: Gauge, - desc: 'Number of times a drip has been executed', - labels: ['name'], - }, - unexpectedRpcErrors: { - type: Counter, - desc: 'Number of unexpected RPC errors', - labels: ['section', 'name'], - }, - }, - }) - } - - protected async init(): Promise { - this.state.drippie = new ethers.Contract( - this.options.drippieAddress, - DrippieArtifact.abi, - this.options.rpc - ) - } - - protected async main(): Promise { - let dripCreatedEvents: ethers.Event[] - try { - dripCreatedEvents = await this.state.drippie.queryFilter( - this.state.drippie.filters.DripCreated() - ) - } catch (err) { - this.logger.info(`got unexpected RPC error`, { - section: 'creations', - name: 'NULL', - err, - }) - - this.metrics.unexpectedRpcErrors.inc({ - section: 'creations', - name: 'NULL', - }) - - return - } - - // Not the most efficient thing in the world. Will end up making one request for every drip - // created. We don't expect there to be many drips, so this is fine for now. We can also cache - // and skip any archived drips to cut down on a few requests. Worth keeping an eye on this to - // see if it's a bottleneck. - for (const event of dripCreatedEvents) { - const name = event.args.name - - let drip: any - try { - drip = await this.state.drippie.drips(name) - } catch (err) { - this.logger.info(`got unexpected RPC error`, { - section: 'drips', - name, - err, - }) - - this.metrics.unexpectedRpcErrors.inc({ - section: 'drips', - name, - }) - - continue - } - - this.logger.info(`getting drip executable status`, { - name, - count: drip.count.toNumber(), - }) - - this.metrics.executedDripCount.set( - { - name, - }, - drip.count.toNumber() - ) - - let executable: boolean - try { - // To avoid making unnecessary RPC requests, filter out any drips that we don't expect to - // be executable right now. Only active drips (status = 2) and drips that are due to be - // executed are expected to be executable (but might not be based on the dripcheck). - if ( - drip.status === 2 && - drip.last.toNumber() + drip.config.interval.toNumber() < - Date.now() / 1000 - ) { - executable = await this.state.drippie.executable(name) - } else { - executable = false - } - } catch (err) { - // All reverts include the string "Drippie:", so we can check for that. - if (err.message.includes('Drippie:')) { - // Not executable yet. - executable = false - } else { - this.logger.info(`got unexpected RPC error`, { - section: 'executable', - name, - err, - }) - - this.metrics.unexpectedRpcErrors.inc({ - section: 'executable', - name, - }) - - continue - } - } - - this.logger.info(`got drip executable status`, { - name, - executable, - }) - - this.metrics.isExecutable.set( - { - name, - }, - executable ? 1 : 0 - ) - } - } -} - -if (require.main === module) { - const service = new DrippieMonService() - service.run() -} diff --git a/packages/chain-mon/contrib/initialized-upgraded-mon/service.ts b/packages/chain-mon/contrib/initialized-upgraded-mon/service.ts deleted file mode 100644 index 32249797a35d..000000000000 --- a/packages/chain-mon/contrib/initialized-upgraded-mon/service.ts +++ /dev/null @@ -1,233 +0,0 @@ -import { - BaseServiceV2, - StandardOptions, - Gauge, - Counter, - validators, - waitForProvider, -} from '@eth-optimism/common-ts' -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 { version } from '../../package.json' - -const networks = { - 1: { - name: 'mainnet', - l1StartingBlockTag: mainnetConfig.l1StartingBlockTag, - }, - 10: { - name: 'op-mainnet', - l1StartingBlockTag: null, - }, - 11155111: { - name: 'sepolia', - l1StartingBlockTag: sepoliaConfig.l1StartingBlockTag, - }, - 11155420: { - name: 'op-sepolia', - l1StartingBlockTag: null, - }, - 420: { - name: 'op-goerli', - l1StartingBlockTag: null, - }, -} - -// keccak256("Initialized(uint8)") = 0x7f26b83ff96e1f2b6a682f133852f6798a09c465da95921460cefb3847402498 -const topic_initialized = - '0x7f26b83ff96e1f2b6a682f133852f6798a09c465da95921460cefb3847402498' - -// keccak256("Upgraded(address)") = 0xbc7cd75a20ee27fd9adebab32041f755214dbc6bffa90cc0225b39da2e5c2d3b -const topic_upgraded = - '0xbc7cd75a20ee27fd9adebab32041f755214dbc6bffa90cc0225b39da2e5c2d3b' - -type InitializedUpgradedMonOptions = { - rpc: Provider - startBlockNumber: number - contracts: string -} - -type InitializedUpgradedMonMetrics = { - initializedCalls: Counter - upgradedCalls: Counter - unexpectedRpcErrors: Counter -} - -type InitializedUpgradedMonState = { - chainId: number - highestUncheckedBlockNumber: number - contracts: Array<{ label: string; address: string }> -} - -export class InitializedUpgradedMonService extends BaseServiceV2< - InitializedUpgradedMonOptions, - InitializedUpgradedMonMetrics, - InitializedUpgradedMonState -> { - constructor( - options?: Partial - ) { - super({ - version, - name: 'initialized-upgraded-mon', - loop: true, - options: { - loopIntervalMs: 1000, - ...options, - }, - optionsSpec: { - rpc: { - validator: validators.provider, - desc: 'Provider for network to monitor balances on', - }, - startBlockNumber: { - validator: validators.num, - default: -1, - desc: 'L1 block number to start checking from', - public: true, - }, - contracts: { - validator: validators.str, - desc: 'JSON array of [{ label, address }] to monitor contracts for', - public: true, - }, - }, - metricsSpec: { - initializedCalls: { - type: Gauge, - desc: 'Successful transactions to tracked contracts emitting initialized event', - labels: ['label', 'address'], - }, - upgradedCalls: { - type: Gauge, - desc: 'Successful transactions to tracked contracts emitting upgraded event', - labels: ['label', 'address'], - }, - unexpectedRpcErrors: { - type: Counter, - desc: 'Number of unexpected RPC errors', - labels: ['section', 'name'], - }, - }, - }) - } - - protected async init(): Promise { - // Connect to L1. - await waitForProvider(this.options.rpc, { - logger: this.logger, - name: 'L1', - }) - - this.state.chainId = await getChainId(this.options.rpc) - - const l1StartingBlockTag = networks[this.state.chainId].l1StartingBlockTag - - if (this.options.startBlockNumber === -1) { - const block_number = - l1StartingBlockTag != null - ? (await this.options.rpc.getBlock(l1StartingBlockTag)).number - : 0 - this.state.highestUncheckedBlockNumber = block_number - } else { - this.state.highestUncheckedBlockNumber = this.options.startBlockNumber - } - - try { - this.state.contracts = JSON.parse(this.options.contracts) - } catch (e) { - throw new Error( - 'unable to start service because provided options is not valid json' - ) - } - } - - protected async main(): Promise { - if ( - (await this.options.rpc.getBlockNumber()) < - this.state.highestUncheckedBlockNumber - ) { - this.logger.info('Waiting for new blocks') - return - } - - const block = await this.options.rpc.getBlock( - this.state.highestUncheckedBlockNumber - ) - this.logger.info('Checking block', { - number: block.number, - }) - - const transactions: TransactionResponse[] = [] - for (const txHash of block.transactions) { - const t = await this.options.rpc.getTransaction(txHash) - transactions.push(t) - } - - for (const transaction of transactions) { - for (const contract of this.state.contracts) { - const to = - transaction.to != null ? transaction.to : transaction['creates'] - if (compareAddrs(contract.address, to)) { - try { - const transactionReceipt = await transaction.wait() - for (const log of transactionReceipt.logs) { - if (log.topics.includes(topic_initialized)) { - this.metrics.initializedCalls.inc({ - label: contract.label, - address: contract.address, - }) - this.logger.info('initialized event', { - label: contract.label, - address: contract.address, - }) - } else if (log.topics.includes(topic_upgraded)) { - this.metrics.upgradedCalls.inc({ - label: contract.label, - address: contract.address, - }) - this.logger.info('upgraded event', { - label: contract.label, - address: contract.address, - }) - } - } - } catch (err) { - // If error is due to transaction failing, ignore transaction - if ( - err.message.length >= 18 && - err.message.slice(0, 18) === 'transaction failed' - ) { - break - } - // Otherwise, we have an unexpected RPC error - this.logger.info(`got unexpected RPC error`, { - section: 'creations', - name: 'NULL', - err, - }) - - this.metrics.unexpectedRpcErrors.inc({ - section: 'creations', - name: 'NULL', - }) - - return - } - } - } - } - this.logger.info('Checked block', { - number: this.state.highestUncheckedBlockNumber, - }) - this.state.highestUncheckedBlockNumber++ - } -} - -if (require.main === module) { - const service = new InitializedUpgradedMonService() - service.run() -} diff --git a/packages/chain-mon/contrib/replica-mon/README.md b/packages/chain-mon/contrib/replica-mon/README.md deleted file mode 100644 index 5c2adb0b7430..000000000000 --- a/packages/chain-mon/contrib/replica-mon/README.md +++ /dev/null @@ -1,33 +0,0 @@ -# @eth-optimism/replica-healthcheck - -[![codecov](https://codecov.io/gh/ethereum-optimism/optimism/branch/develop/graph/badge.svg?token=0VTG7PG7YR&flag=replica-healthcheck-tests)](https://codecov.io/gh/ethereum-optimism/optimism) - -## What is this? - -`replica-healthcheck` is an express server to be run alongside a replica instance, to ensure that the replica is healthy. Currently, it exposes metrics on syncing stats and exits when the replica has a mismatched state root against the sequencer. - - -## Installation - -Clone, install, and build the Optimism monorepo: - -``` -git clone https://github.com/ethereum-optimism/optimism.git -pnpm install -pnpm build -``` - -## Running the service (manual) - -Copy `.env.example` into a new file named `.env`, then set the environment variables listed there. -You can view a list of all environment variables and descriptions for each via: - -``` -pnpm start:replica-mon --help -``` - -Once your environment variables have been set, run the healthcheck service via: - -``` -pnpm start:replica-mon -``` diff --git a/packages/chain-mon/contrib/replica-mon/index.ts b/packages/chain-mon/contrib/replica-mon/index.ts deleted file mode 100644 index caf7fffa1017..000000000000 --- a/packages/chain-mon/contrib/replica-mon/index.ts +++ /dev/null @@ -1 +0,0 @@ -export * from './service' diff --git a/packages/chain-mon/contrib/replica-mon/service.ts b/packages/chain-mon/contrib/replica-mon/service.ts deleted file mode 100644 index cf43717c6b99..000000000000 --- a/packages/chain-mon/contrib/replica-mon/service.ts +++ /dev/null @@ -1,213 +0,0 @@ -import { Provider, Block } from '@ethersproject/abstract-provider' -import { - BaseServiceV2, - StandardOptions, - Counter, - Gauge, - validators, -} from '@eth-optimism/common-ts' -import { sleep } from '@eth-optimism/core-utils' - -import { version } from '../../package.json' - -type HealthcheckOptions = { - referenceRpcProvider: Provider - targetRpcProvider: Provider - onDivergenceWaitMs?: number -} - -type HealthcheckMetrics = { - lastMatchingStateRootHeight: Gauge - isCurrentlyDiverged: Gauge - referenceHeight: Gauge - targetHeight: Gauge - heightDifference: Gauge - targetConnectionFailures: Counter - referenceConnectionFailures: Counter -} - -type HealthcheckState = {} - -export class HealthcheckService extends BaseServiceV2< - HealthcheckOptions, - HealthcheckMetrics, - HealthcheckState -> { - constructor(options?: Partial) { - super({ - version, - name: 'healthcheck', - options: { - loopIntervalMs: 5000, - ...options, - }, - optionsSpec: { - referenceRpcProvider: { - validator: validators.provider, - desc: 'Provider for interacting with L1', - }, - targetRpcProvider: { - validator: validators.provider, - desc: 'Provider for interacting with L2', - }, - onDivergenceWaitMs: { - validator: validators.num, - desc: 'Waiting time in ms per loop when divergence is detected', - default: 60_000, - public: true, - }, - }, - metricsSpec: { - lastMatchingStateRootHeight: { - type: Gauge, - desc: 'Highest matching state root between target and reference', - }, - isCurrentlyDiverged: { - type: Gauge, - desc: 'Whether or not the two nodes are currently diverged', - }, - referenceHeight: { - type: Gauge, - desc: 'Block height of the reference client', - }, - targetHeight: { - type: Gauge, - desc: 'Block height of the target client', - }, - heightDifference: { - type: Gauge, - desc: 'Difference in block heights between the two clients', - }, - targetConnectionFailures: { - type: Counter, - desc: 'Number of connection failures to the target client', - }, - referenceConnectionFailures: { - type: Counter, - desc: 'Number of connection failures to the reference client', - }, - }, - }) - } - - async main() { - // Get the latest block from the target client and check for connection failures. - let targetLatest: Block - try { - targetLatest = await this.options.targetRpcProvider.getBlock('latest') - } catch (err) { - if (err.message.includes('could not detect network')) { - this.logger.error('target client not connected') - this.metrics.targetConnectionFailures.inc() - return - } else { - throw err - } - } - - // Get the latest block from the reference client and check for connection failures. - let referenceLatest: Block - try { - referenceLatest = await this.options.referenceRpcProvider.getBlock( - 'latest' - ) - } catch (err) { - if (err.message.includes('could not detect network')) { - this.logger.error('reference client not connected') - this.metrics.referenceConnectionFailures.inc() - return - } else { - throw err - } - } - - // Later logic will depend on the height difference. - const heightDiff = Math.abs(referenceLatest.number - targetLatest.number) - const minBlock = Math.min(targetLatest.number, referenceLatest.number) - - // Update these metrics first so they'll refresh no matter what. - this.metrics.targetHeight.set(targetLatest.number) - this.metrics.referenceHeight.set(referenceLatest.number) - this.metrics.heightDifference.set(heightDiff) - - this.logger.info(`latest block heights`, { - targetHeight: targetLatest.number, - referenceHeight: referenceLatest.number, - heightDifference: heightDiff, - minBlockNumber: minBlock, - }) - - const reference = await this.options.referenceRpcProvider.getBlock(minBlock) - if (!reference) { - // This is ok, but we should log it and restart the loop. - this.logger.info(`reference block was not found`, { - blockNumber: reference.number, - }) - return - } - - const target = await this.options.targetRpcProvider.getBlock(minBlock) - if (!target) { - // This is ok, but we should log it and restart the loop. - this.logger.info(`target block was not found`, { - blockNumber: target.number, - }) - return - } - - // We used to use state roots here, but block hashes are even more reliable because they will - // catch discrepancies in blocks that may not impact the state. For example, if clients have - // blocks with two different timestamps, the state root will only diverge if the timestamp is - // actually used during the transaction(s) within the block. - if (reference.hash !== target.hash) { - this.logger.error(`reference client has different hash for block`, { - blockNumber: target.number, - referenceHash: reference.hash, - targetHash: target.hash, - }) - - // The main loop polls for "latest" so aren't checking every block. We need to use a binary - // search to find the first block where a mismatch occurred. - this.logger.info(`beginning binary search to find first mismatched block`) - - let start = 0 - let end = target.number - while (start !== end) { - const mid = Math.floor((start + end) / 2) - this.logger.info(`checking block`, { blockNumber: mid }) - const blockA = await this.options.referenceRpcProvider.getBlock(mid) - const blockB = await this.options.targetRpcProvider.getBlock(mid) - - if (blockA.hash === blockB.hash) { - start = mid + 1 - } else { - end = mid - } - } - - this.logger.info(`found first mismatched block`, { blockNumber: end }) - this.metrics.lastMatchingStateRootHeight.set(end) - this.metrics.isCurrentlyDiverged.set(1) - - // Old version of the service would exit here, but we want to keep looping just in case the - // the system recovers later. This is better than exiting because it means we don't have to - // restart the entire service. Running these checks once per minute will not trigger too many - // requests, so this should be fine. - await sleep(this.options.onDivergenceWaitMs) - return - } - - this.logger.info(`blocks are matching`, { - blockNumber: target.number, - }) - - // Update latest matching state root height and reset the diverged metric in case it was set. - this.metrics.lastMatchingStateRootHeight.set(target.number) - this.metrics.isCurrentlyDiverged.set(0) - } -} - -if (require.main === module) { - const service = new HealthcheckService() - service.run() -} diff --git a/packages/chain-mon/contrib/wallet-mon/service.ts b/packages/chain-mon/contrib/wallet-mon/service.ts deleted file mode 100644 index 6aa97394e8d8..000000000000 --- a/packages/chain-mon/contrib/wallet-mon/service.ts +++ /dev/null @@ -1,181 +0,0 @@ -import { - BaseServiceV2, - StandardOptions, - Gauge, - Counter, - validators, - waitForProvider, -} from '@eth-optimism/common-ts' -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 { version } from '../../package.json' - -const networks = { - 1: { - name: 'mainnet', - l1StartingBlockTag: mainnetConfig.l1StartingBlockTag, - accounts: [ - { - label: 'Proposer', - wallet: mainnetConfig.l2OutputOracleProposer, - target: '0xdfe97868233d1aa22e815a266982f2cf17685a27', - }, - { - label: 'Batcher', - wallet: mainnetConfig.batchSenderAddress, - target: mainnetConfig.batchInboxAddress, - }, - ], - }, -} - -type WalletMonOptions = { - rpc: Provider - startBlockNumber: number -} - -type WalletMonMetrics = { - validatedCalls: Counter - unexpectedCalls: Counter - unexpectedRpcErrors: Counter -} - -type WalletMonState = { - chainId: number - highestUncheckedBlockNumber: number -} - -export class WalletMonService extends BaseServiceV2< - WalletMonOptions, - WalletMonMetrics, - WalletMonState -> { - constructor(options?: Partial) { - super({ - version, - name: 'wallet-mon', - loop: true, - options: { - loopIntervalMs: 1000, - ...options, - }, - optionsSpec: { - rpc: { - validator: validators.provider, - desc: 'Provider for network to monitor balances on', - }, - startBlockNumber: { - validator: validators.num, - default: -1, - desc: 'L1 block number to start checking from', - public: true, - }, - }, - metricsSpec: { - validatedCalls: { - type: Gauge, - desc: 'Transactions from the account checked', - labels: ['wallet', 'target', 'nickname'], - }, - unexpectedCalls: { - type: Counter, - desc: 'Number of unexpected wallets', - labels: ['wallet', 'target', 'nickname', 'transactionHash'], - }, - unexpectedRpcErrors: { - type: Counter, - desc: 'Number of unexpected RPC errors', - labels: ['section', 'name'], - }, - }, - }) - } - - protected async init(): Promise { - // Connect to L1. - await waitForProvider(this.options.rpc, { - logger: this.logger, - name: 'L1', - }) - - this.state.chainId = await getChainId(this.options.rpc) - - const l1StartingBlockTag = networks[this.state.chainId].l1StartingBlockTag - - if (this.options.startBlockNumber === -1) { - const block = await this.options.rpc.getBlock(l1StartingBlockTag) - this.state.highestUncheckedBlockNumber = block.number - } else { - this.state.highestUncheckedBlockNumber = this.options.startBlockNumber - } - } - - protected async main(): Promise { - if ( - (await this.options.rpc.getBlockNumber()) < - this.state.highestUncheckedBlockNumber - ) { - this.logger.info('Waiting for new blocks') - return - } - - const network = networks[this.state.chainId] - const accounts = network.accounts - - const block = await this.options.rpc.getBlock( - this.state.highestUncheckedBlockNumber - ) - this.logger.info('Checking block', { - number: block.number, - }) - - const transactions: TransactionResponse[] = [] - for (const txHash of block.transactions) { - const t = await this.options.rpc.getTransaction(txHash) - transactions.push(t) - } - - for (const transaction of transactions) { - for (const account of accounts) { - if (compareAddrs(account.wallet, transaction.from)) { - if (compareAddrs(account.target, transaction.to)) { - this.metrics.validatedCalls.inc({ - nickname: account.label, - wallet: account.address, - target: account.target, - }) - this.logger.info('validated call', { - nickname: account.label, - wallet: account.address, - target: account.target, - }) - } else { - this.metrics.unexpectedCalls.inc({ - nickname: account.label, - wallet: account.address, - target: transaction.to, - transactionHash: transaction.hash, - }) - this.logger.error('Unexpected call detected', { - nickname: account.label, - address: account.address, - target: transaction.to, - transactionHash: transaction.hash, - }) - } - } - } - } - this.logger.info('Checked block', { - number: this.state.highestUncheckedBlockNumber, - }) - this.state.highestUncheckedBlockNumber++ - } -} - -if (require.main === module) { - const service = new WalletMonService() - service.run() -} diff --git a/packages/chain-mon/hardhat.config.ts b/packages/chain-mon/hardhat.config.ts deleted file mode 100644 index 51ebadf6ceec..000000000000 --- a/packages/chain-mon/hardhat.config.ts +++ /dev/null @@ -1,13 +0,0 @@ -import { HardhatUserConfig } from 'hardhat/types' - -// Hardhat plugins -import '@nomiclabs/hardhat-ethers' -import '@nomiclabs/hardhat-waffle' - -const config: HardhatUserConfig = { - mocha: { - timeout: 50000, - }, -} - -export default config diff --git a/packages/chain-mon/internal/balance-mon/service.ts b/packages/chain-mon/internal/balance-mon/service.ts deleted file mode 100644 index 3382fc8bc8bb..000000000000 --- a/packages/chain-mon/internal/balance-mon/service.ts +++ /dev/null @@ -1,105 +0,0 @@ -import { - BaseServiceV2, - StandardOptions, - Gauge, - Counter, - validators, -} from '@eth-optimism/common-ts' -import { Provider } from '@ethersproject/abstract-provider' - -import { version } from '../../package.json' - -type BalanceMonOptions = { - rpc: Provider - accounts: string -} - -type BalanceMonMetrics = { - balances: Gauge - unexpectedRpcErrors: Counter -} - -type BalanceMonState = { - accounts: Array<{ address: string; nickname: string }> -} - -export class BalanceMonService extends BaseServiceV2< - BalanceMonOptions, - BalanceMonMetrics, - BalanceMonState -> { - constructor(options?: Partial) { - super({ - version, - name: 'balance-mon', - loop: true, - options: { - loopIntervalMs: 60_000, - ...options, - }, - optionsSpec: { - rpc: { - validator: validators.provider, - desc: 'Provider for network to monitor balances on', - }, - accounts: { - validator: validators.str, - desc: 'JSON array of [{ address, nickname, safe }] to monitor balances and nonces of', - public: true, - }, - }, - metricsSpec: { - balances: { - type: Gauge, - desc: 'Balances of addresses', - labels: ['address', 'nickname'], - }, - unexpectedRpcErrors: { - type: Counter, - desc: 'Number of unexpected RPC errors', - labels: ['section', 'name'], - }, - }, - }) - } - - protected async init(): Promise { - this.state.accounts = JSON.parse(this.options.accounts) - } - - protected async main(): Promise { - for (const account of this.state.accounts) { - try { - const balance = await this.options.rpc.getBalance(account.address) - this.logger.info(`got balance`, { - address: account.address, - nickname: account.nickname, - balance: balance.toString(), - }) - - // Parse the balance as an integer instead of via toNumber() to avoid ethers throwing an - // an error. We might get rounding errors but we don't need perfect precision here, just a - // generally accurate sense for what the current balance is. - this.metrics.balances.set( - { address: account.address, nickname: account.nickname }, - parseInt(balance.toString(), 10) - ) - } catch (err) { - this.logger.info(`got unexpected RPC error`, { - section: 'balances', - name: 'getBalance', - err, - }) - this.metrics.unexpectedRpcErrors.inc({ - section: 'balances', - name: 'getBalance', - }) - } - } - } -} - -if (require.main === module) { - const service = new BalanceMonService() - service.run() -} diff --git a/packages/chain-mon/internal/multisig-mon/service.ts b/packages/chain-mon/internal/multisig-mon/service.ts deleted file mode 100644 index 6b406a43dbf1..000000000000 --- a/packages/chain-mon/internal/multisig-mon/service.ts +++ /dev/null @@ -1,252 +0,0 @@ -import { exec } from 'child_process' - -import { - BaseServiceV2, - StandardOptions, - Gauge, - Counter, - validators, -} from '@eth-optimism/common-ts' -import { Provider } from '@ethersproject/abstract-provider' -import { ethers } from 'ethers' - -import Safe from '../../src/abi/IGnosisSafe.0.8.19.json' -import OptimismPortal from '../../src/abi/OptimismPortal.json' -import { version } from '../../package.json' - -type MultisigMonOptions = { - rpc: Provider - accounts: string - onePassServiceToken: string -} - -type MultisigMonMetrics = { - safeNonce: Gauge - latestPreSignedPauseNonce: Gauge - pausedState: Gauge - unexpectedRpcErrors: Counter -} - -type MultisigMonState = { - accounts: Array<{ - nickname: string - safeAddress: string - optimismPortalAddress: string - vault: string - }> -} - -export class MultisigMonService extends BaseServiceV2< - MultisigMonOptions, - MultisigMonMetrics, - MultisigMonState -> { - constructor(options?: Partial) { - super({ - version, - name: 'multisig-mon', - loop: true, - options: { - loopIntervalMs: 60_000, - ...options, - }, - optionsSpec: { - rpc: { - validator: validators.provider, - desc: 'Provider for network to monitor balances on', - }, - accounts: { - validator: validators.str, - desc: 'JSON array of [{ nickname, safeAddress, optimismPortalAddress, vault }] to monitor', - public: true, - }, - onePassServiceToken: { - validator: validators.str, - desc: '1Password Service Token', - }, - }, - metricsSpec: { - safeNonce: { - type: Gauge, - desc: 'Safe nonce', - labels: ['address', 'nickname'], - }, - latestPreSignedPauseNonce: { - type: Gauge, - desc: 'Latest pre-signed pause nonce', - labels: ['address', 'nickname'], - }, - pausedState: { - type: Gauge, - desc: 'OptimismPortal paused state', - labels: ['address', 'nickname'], - }, - unexpectedRpcErrors: { - type: Counter, - desc: 'Number of unexpected RPC errors', - labels: ['section', 'name'], - }, - }, - }) - } - - protected async init(): Promise { - this.state.accounts = JSON.parse(this.options.accounts) - } - - protected async main(): Promise { - for (const account of this.state.accounts) { - // get the nonce 1pass - if (this.options.onePassServiceToken) { - await this.getOnePassNonce(account) - } - - // get the nonce from deployed safe - if (account.safeAddress) { - await this.getSafeNonce(account) - } - - // get the paused state of the OptimismPortal - if (account.optimismPortalAddress) { - await this.getPausedState(account) - } - } - } - - private async getPausedState(account: { - nickname: string - safeAddress: string - optimismPortalAddress: string - vault: string - }) { - try { - const optimismPortal = new ethers.Contract( - account.optimismPortalAddress, - OptimismPortal.abi, - this.options.rpc - ) - const paused = await optimismPortal.paused() - this.logger.info(`got paused state`, { - optimismPortalAddress: account.optimismPortalAddress, - nickname: account.nickname, - paused, - }) - - this.metrics.pausedState.set( - { address: account.optimismPortalAddress, nickname: account.nickname }, - paused ? 1 : 0 - ) - } catch (err) { - this.logger.error(`got unexpected RPC error`, { - section: 'pausedState', - name: 'getPausedState', - err, - }) - this.metrics.unexpectedRpcErrors.inc({ - section: 'pausedState', - name: 'getPausedState', - }) - } - } - - private async getOnePassNonce(account: { - nickname: string - safeAddress: string - optimismPortalAddress: string - vault: string - }) { - try { - exec( - `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:`, { - section: 'onePassNonce', - name: 'getOnePassNonce', - }) - return - } - if (stderr) { - this.logger.error( - `got unexpected error (from the stderr) from onepass`, - { - section: 'onePassNonce', - name: 'getOnePassNonce', - } - ) - return - } - const items = JSON.parse(stdout) - let latestNonce = -1 - this.logger.debug(`items in vault '${account.vault}':`) - for (const item of items) { - const title = item['title'] - this.logger.debug(`- ${title}`) - if (title.startsWith('ready-') && title.endsWith('.json')) { - const nonce = parseInt(title.substring(6, title.length - 5), 10) - if (nonce > latestNonce) { - latestNonce = nonce - } - } - } - this.metrics.latestPreSignedPauseNonce.set( - { address: account.safeAddress, nickname: account.nickname }, - latestNonce - ) - this.logger.debug(`latestNonce: ${latestNonce}`) - } - ) - } catch (err) { - this.logger.error(`got unexpected error from onepass`, { - section: 'onePassNonce', - name: 'getOnePassNonce', - err, - }) - this.metrics.unexpectedRpcErrors.inc({ - section: 'onePassNonce', - name: 'getOnePassNonce', - }) - } - } - - private async getSafeNonce(account: { - nickname: string - safeAddress: string - optimismPortalAddress: string - vault: string - }) { - try { - const safeContract = new ethers.Contract( - account.safeAddress, - Safe.abi, - this.options.rpc - ) - const safeNonce = await safeContract.nonce() - this.logger.info(`got nonce`, { - address: account.safeAddress, - nickname: account.nickname, - nonce: safeNonce.toString(), - }) - - this.metrics.safeNonce.set( - { address: account.safeAddress, nickname: account.nickname }, - parseInt(safeNonce.toString(), 10) - ) - } catch (err) { - this.logger.error(`got unexpected RPC error`, { - section: 'safeNonce', - name: 'getSafeNonce', - err, - }) - this.metrics.unexpectedRpcErrors.inc({ - section: 'safeNonce', - name: 'getSafeNonce', - }) - } - } -} - -if (require.main === module) { - const service = new MultisigMonService() - service.run() -} diff --git a/packages/chain-mon/package.json b/packages/chain-mon/package.json deleted file mode 100644 index 26a9073656c6..000000000000 --- a/packages/chain-mon/package.json +++ /dev/null @@ -1,71 +0,0 @@ -{ - "private": true, - "name": "@eth-optimism/chain-mon", - "version": "0.6.5", - "description": "[Optimism] Chain monitoring services", - "main": "dist/index", - "types": "dist/index", - "files": [ - "dist/*" - ], - "scripts": { - "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 ./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: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 ./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: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", - "clean": "rimraf dist/ ./tsconfig.tsbuildinfo", - "lint": "pnpm lint:fix && pnpm lint:check", - "pre-commit": "lint-staged", - "lint:fix": "pnpm lint:check --fix", - "lint:check": "eslint . --max-warnings=0" - }, - "keywords": [ - "optimism", - "ethereum", - "monitoring" - ], - "homepage": "https://github.com/ethereum-optimism/optimism/tree/develop/packages/chain-mon#readme", - "license": "MIT", - "author": "Optimism PBC", - "repository": { - "type": "git", - "url": "https://github.com/ethereum-optimism/optimism.git" - }, - "dependencies": { - "@eth-optimism/common-ts": "^0.8.9", - "@eth-optimism/contracts-bedrock": "workspace:*", - "@eth-optimism/contracts-periphery": "1.0.8", - "@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", - "dotenv": "^16.4.5", - "ethers": "^5.7.2" - }, - "devDependencies": { - "@ethersproject/abstract-provider": "^5.7.0", - "@nomiclabs/hardhat-ethers": "^2.2.3", - "@nomiclabs/hardhat-waffle": "^2.0.6", - "hardhat": "^2.20.1", - "ts-node": "^10.9.2", - "tsx": "^4.7.0" - } -} diff --git a/packages/chain-mon/src/abi/IGnosisSafe.0.8.19.json b/packages/chain-mon/src/abi/IGnosisSafe.0.8.19.json deleted file mode 100644 index 2153157f3871..000000000000 --- a/packages/chain-mon/src/abi/IGnosisSafe.0.8.19.json +++ /dev/null @@ -1,6991 +0,0 @@ -{ - "abi": [ - { - "anonymous": false, - "inputs": [ - { - "indexed": false, - "internalType": "address", - "name": "owner", - "type": "address" - } - ], - "name": "AddedOwner", - "type": "event" - }, - { - "anonymous": false, - "inputs": [ - { - "indexed": true, - "internalType": "bytes32", - "name": "approvedHash", - "type": "bytes32" - }, - { - "indexed": true, - "internalType": "address", - "name": "owner", - "type": "address" - } - ], - "name": "ApproveHash", - "type": "event" - }, - { - "anonymous": false, - "inputs": [ - { - "indexed": false, - "internalType": "address", - "name": "handler", - "type": "address" - } - ], - "name": "ChangedFallbackHandler", - "type": "event" - }, - { - "anonymous": false, - "inputs": [ - { - "indexed": false, - "internalType": "address", - "name": "guard", - "type": "address" - } - ], - "name": "ChangedGuard", - "type": "event" - }, - { - "anonymous": false, - "inputs": [ - { - "indexed": false, - "internalType": "uint256", - "name": "threshold", - "type": "uint256" - } - ], - "name": "ChangedThreshold", - "type": "event" - }, - { - "anonymous": false, - "inputs": [ - { - "indexed": false, - "internalType": "address", - "name": "module", - "type": "address" - } - ], - "name": "DisabledModule", - "type": "event" - }, - { - "anonymous": false, - "inputs": [ - { - "indexed": false, - "internalType": "address", - "name": "module", - "type": "address" - } - ], - "name": "EnabledModule", - "type": "event" - }, - { - "anonymous": false, - "inputs": [ - { - "indexed": false, - "internalType": "bytes32", - "name": "txHash", - "type": "bytes32" - }, - { - "indexed": false, - "internalType": "uint256", - "name": "payment", - "type": "uint256" - } - ], - "name": "ExecutionFailure", - "type": "event" - }, - { - "anonymous": false, - "inputs": [ - { - "indexed": true, - "internalType": "address", - "name": "module", - "type": "address" - } - ], - "name": "ExecutionFromModuleFailure", - "type": "event" - }, - { - "anonymous": false, - "inputs": [ - { - "indexed": true, - "internalType": "address", - "name": "module", - "type": "address" - } - ], - "name": "ExecutionFromModuleSuccess", - "type": "event" - }, - { - "anonymous": false, - "inputs": [ - { - "indexed": false, - "internalType": "bytes32", - "name": "txHash", - "type": "bytes32" - }, - { - "indexed": false, - "internalType": "uint256", - "name": "payment", - "type": "uint256" - } - ], - "name": "ExecutionSuccess", - "type": "event" - }, - { - "anonymous": false, - "inputs": [ - { - "indexed": false, - "internalType": "address", - "name": "owner", - "type": "address" - } - ], - "name": "RemovedOwner", - "type": "event" - }, - { - "anonymous": false, - "inputs": [ - { - "indexed": true, - "internalType": "address", - "name": "sender", - "type": "address" - }, - { - "indexed": false, - "internalType": "uint256", - "name": "value", - "type": "uint256" - } - ], - "name": "SafeReceived", - "type": "event" - }, - { - "anonymous": false, - "inputs": [ - { - "indexed": true, - "internalType": "address", - "name": "initiator", - "type": "address" - }, - { - "indexed": false, - "internalType": "address[]", - "name": "owners", - "type": "address[]" - }, - { - "indexed": false, - "internalType": "uint256", - "name": "threshold", - "type": "uint256" - }, - { - "indexed": false, - "internalType": "address", - "name": "initializer", - "type": "address" - }, - { - "indexed": false, - "internalType": "address", - "name": "fallbackHandler", - "type": "address" - } - ], - "name": "SafeSetup", - "type": "event" - }, - { - "anonymous": false, - "inputs": [ - { - "indexed": true, - "internalType": "bytes32", - "name": "msgHash", - "type": "bytes32" - } - ], - "name": "SignMsg", - "type": "event" - }, - { - "inputs": [], - "name": "VERSION", - "outputs": [ - { - "internalType": "string", - "name": "", - "type": "string" - } - ], - "stateMutability": "view", - "type": "function" - }, - { - "inputs": [ - { - "internalType": "address", - "name": "owner", - "type": "address" - }, - { - "internalType": "uint256", - "name": "_threshold", - "type": "uint256" - } - ], - "name": "addOwnerWithThreshold", - "outputs": [], - "stateMutability": "nonpayable", - "type": "function" - }, - { - "inputs": [ - { - "internalType": "bytes32", - "name": "hashToApprove", - "type": "bytes32" - } - ], - "name": "approveHash", - "outputs": [], - "stateMutability": "nonpayable", - "type": "function" - }, - { - "inputs": [ - { - "internalType": "address", - "name": "", - "type": "address" - }, - { - "internalType": "bytes32", - "name": "", - "type": "bytes32" - } - ], - "name": "approvedHashes", - "outputs": [ - { - "internalType": "uint256", - "name": "", - "type": "uint256" - } - ], - "stateMutability": "view", - "type": "function" - }, - { - "inputs": [ - { - "internalType": "uint256", - "name": "_threshold", - "type": "uint256" - } - ], - "name": "changeThreshold", - "outputs": [], - "stateMutability": "nonpayable", - "type": "function" - }, - { - "inputs": [ - { - "internalType": "bytes32", - "name": "dataHash", - "type": "bytes32" - }, - { - "internalType": "bytes", - "name": "data", - "type": "bytes" - }, - { - "internalType": "bytes", - "name": "signatures", - "type": "bytes" - }, - { - "internalType": "uint256", - "name": "requiredSignatures", - "type": "uint256" - } - ], - "name": "checkNSignatures", - "outputs": [], - "stateMutability": "view", - "type": "function" - }, - { - "inputs": [ - { - "internalType": "bytes32", - "name": "dataHash", - "type": "bytes32" - }, - { - "internalType": "bytes", - "name": "data", - "type": "bytes" - }, - { - "internalType": "bytes", - "name": "signatures", - "type": "bytes" - } - ], - "name": "checkSignatures", - "outputs": [], - "stateMutability": "view", - "type": "function" - }, - { - "inputs": [ - { - "internalType": "address", - "name": "prevModule", - "type": "address" - }, - { - "internalType": "address", - "name": "module", - "type": "address" - } - ], - "name": "disableModule", - "outputs": [], - "stateMutability": "nonpayable", - "type": "function" - }, - { - "inputs": [], - "name": "domainSeparator", - "outputs": [ - { - "internalType": "bytes32", - "name": "", - "type": "bytes32" - } - ], - "stateMutability": "view", - "type": "function" - }, - { - "inputs": [ - { - "internalType": "address", - "name": "module", - "type": "address" - } - ], - "name": "enableModule", - "outputs": [], - "stateMutability": "nonpayable", - "type": "function" - }, - { - "inputs": [ - { - "internalType": "address", - "name": "to", - "type": "address" - }, - { - "internalType": "uint256", - "name": "value", - "type": "uint256" - }, - { - "internalType": "bytes", - "name": "data", - "type": "bytes" - }, - { - "internalType": "enum Enum.Operation", - "name": "operation", - "type": "uint8" - }, - { - "internalType": "uint256", - "name": "safeTxGas", - "type": "uint256" - }, - { - "internalType": "uint256", - "name": "baseGas", - "type": "uint256" - }, - { - "internalType": "uint256", - "name": "gasPrice", - "type": "uint256" - }, - { - "internalType": "address", - "name": "gasToken", - "type": "address" - }, - { - "internalType": "address", - "name": "refundReceiver", - "type": "address" - }, - { - "internalType": "uint256", - "name": "_nonce", - "type": "uint256" - } - ], - "name": "encodeTransactionData", - "outputs": [ - { - "internalType": "bytes", - "name": "", - "type": "bytes" - } - ], - "stateMutability": "view", - "type": "function" - }, - { - "inputs": [ - { - "internalType": "address", - "name": "to", - "type": "address" - }, - { - "internalType": "uint256", - "name": "value", - "type": "uint256" - }, - { - "internalType": "bytes", - "name": "data", - "type": "bytes" - }, - { - "internalType": "enum Enum.Operation", - "name": "operation", - "type": "uint8" - }, - { - "internalType": "uint256", - "name": "safeTxGas", - "type": "uint256" - }, - { - "internalType": "uint256", - "name": "baseGas", - "type": "uint256" - }, - { - "internalType": "uint256", - "name": "gasPrice", - "type": "uint256" - }, - { - "internalType": "address", - "name": "gasToken", - "type": "address" - }, - { - "internalType": "address", - "name": "refundReceiver", - "type": "address" - }, - { - "internalType": "bytes", - "name": "signatures", - "type": "bytes" - } - ], - "name": "execTransaction", - "outputs": [ - { - "internalType": "bool", - "name": "success", - "type": "bool" - } - ], - "stateMutability": "payable", - "type": "function" - }, - { - "inputs": [ - { - "internalType": "address", - "name": "to", - "type": "address" - }, - { - "internalType": "uint256", - "name": "value", - "type": "uint256" - }, - { - "internalType": "bytes", - "name": "data", - "type": "bytes" - }, - { - "internalType": "enum Enum.Operation", - "name": "operation", - "type": "uint8" - } - ], - "name": "execTransactionFromModule", - "outputs": [ - { - "internalType": "bool", - "name": "success", - "type": "bool" - } - ], - "stateMutability": "nonpayable", - "type": "function" - }, - { - "inputs": [ - { - "internalType": "address", - "name": "to", - "type": "address" - }, - { - "internalType": "uint256", - "name": "value", - "type": "uint256" - }, - { - "internalType": "bytes", - "name": "data", - "type": "bytes" - }, - { - "internalType": "enum Enum.Operation", - "name": "operation", - "type": "uint8" - } - ], - "name": "execTransactionFromModuleReturnData", - "outputs": [ - { - "internalType": "bool", - "name": "success", - "type": "bool" - }, - { - "internalType": "bytes", - "name": "returnData", - "type": "bytes" - } - ], - "stateMutability": "nonpayable", - "type": "function" - }, - { - "inputs": [], - "name": "getChainId", - "outputs": [ - { - "internalType": "uint256", - "name": "", - "type": "uint256" - } - ], - "stateMutability": "view", - "type": "function" - }, - { - "inputs": [ - { - "internalType": "address", - "name": "start", - "type": "address" - }, - { - "internalType": "uint256", - "name": "pageSize", - "type": "uint256" - } - ], - "name": "getModulesPaginated", - "outputs": [ - { - "internalType": "address[]", - "name": "array", - "type": "address[]" - }, - { - "internalType": "address", - "name": "next", - "type": "address" - } - ], - "stateMutability": "view", - "type": "function" - }, - { - "inputs": [], - "name": "getOwners", - "outputs": [ - { - "internalType": "address[]", - "name": "", - "type": "address[]" - } - ], - "stateMutability": "view", - "type": "function" - }, - { - "inputs": [ - { - "internalType": "uint256", - "name": "offset", - "type": "uint256" - }, - { - "internalType": "uint256", - "name": "length", - "type": "uint256" - } - ], - "name": "getStorageAt", - "outputs": [ - { - "internalType": "bytes", - "name": "", - "type": "bytes" - } - ], - "stateMutability": "view", - "type": "function" - }, - { - "inputs": [], - "name": "getThreshold", - "outputs": [ - { - "internalType": "uint256", - "name": "", - "type": "uint256" - } - ], - "stateMutability": "view", - "type": "function" - }, - { - "inputs": [ - { - "internalType": "address", - "name": "to", - "type": "address" - }, - { - "internalType": "uint256", - "name": "value", - "type": "uint256" - }, - { - "internalType": "bytes", - "name": "data", - "type": "bytes" - }, - { - "internalType": "enum Enum.Operation", - "name": "operation", - "type": "uint8" - }, - { - "internalType": "uint256", - "name": "safeTxGas", - "type": "uint256" - }, - { - "internalType": "uint256", - "name": "baseGas", - "type": "uint256" - }, - { - "internalType": "uint256", - "name": "gasPrice", - "type": "uint256" - }, - { - "internalType": "address", - "name": "gasToken", - "type": "address" - }, - { - "internalType": "address", - "name": "refundReceiver", - "type": "address" - }, - { - "internalType": "uint256", - "name": "_nonce", - "type": "uint256" - } - ], - "name": "getTransactionHash", - "outputs": [ - { - "internalType": "bytes32", - "name": "", - "type": "bytes32" - } - ], - "stateMutability": "view", - "type": "function" - }, - { - "inputs": [ - { - "internalType": "address", - "name": "module", - "type": "address" - } - ], - "name": "isModuleEnabled", - "outputs": [ - { - "internalType": "bool", - "name": "", - "type": "bool" - } - ], - "stateMutability": "view", - "type": "function" - }, - { - "inputs": [ - { - "internalType": "address", - "name": "owner", - "type": "address" - } - ], - "name": "isOwner", - "outputs": [ - { - "internalType": "bool", - "name": "", - "type": "bool" - } - ], - "stateMutability": "view", - "type": "function" - }, - { - "inputs": [], - "name": "nonce", - "outputs": [ - { - "internalType": "uint256", - "name": "", - "type": "uint256" - } - ], - "stateMutability": "view", - "type": "function" - }, - { - "inputs": [ - { - "internalType": "address", - "name": "prevOwner", - "type": "address" - }, - { - "internalType": "address", - "name": "owner", - "type": "address" - }, - { - "internalType": "uint256", - "name": "_threshold", - "type": "uint256" - } - ], - "name": "removeOwner", - "outputs": [], - "stateMutability": "nonpayable", - "type": "function" - }, - { - "inputs": [ - { - "internalType": "address", - "name": "to", - "type": "address" - }, - { - "internalType": "uint256", - "name": "value", - "type": "uint256" - }, - { - "internalType": "bytes", - "name": "data", - "type": "bytes" - }, - { - "internalType": "enum Enum.Operation", - "name": "operation", - "type": "uint8" - } - ], - "name": "requiredTxGas", - "outputs": [ - { - "internalType": "uint256", - "name": "", - "type": "uint256" - } - ], - "stateMutability": "nonpayable", - "type": "function" - }, - { - "inputs": [ - { - "internalType": "address", - "name": "handler", - "type": "address" - } - ], - "name": "setFallbackHandler", - "outputs": [], - "stateMutability": "nonpayable", - "type": "function" - }, - { - "inputs": [ - { - "internalType": "address", - "name": "guard", - "type": "address" - } - ], - "name": "setGuard", - "outputs": [], - "stateMutability": "nonpayable", - "type": "function" - }, - { - "inputs": [ - { - "internalType": "address[]", - "name": "_owners", - "type": "address[]" - }, - { - "internalType": "uint256", - "name": "_threshold", - "type": "uint256" - }, - { - "internalType": "address", - "name": "to", - "type": "address" - }, - { - "internalType": "bytes", - "name": "data", - "type": "bytes" - }, - { - "internalType": "address", - "name": "fallbackHandler", - "type": "address" - }, - { - "internalType": "address", - "name": "paymentToken", - "type": "address" - }, - { - "internalType": "uint256", - "name": "payment", - "type": "uint256" - }, - { - "internalType": "address", - "name": "paymentReceiver", - "type": "address" - } - ], - "name": "setup", - "outputs": [], - "stateMutability": "nonpayable", - "type": "function" - }, - { - "inputs": [ - { - "internalType": "bytes32", - "name": "", - "type": "bytes32" - } - ], - "name": "signedMessages", - "outputs": [ - { - "internalType": "uint256", - "name": "", - "type": "uint256" - } - ], - "stateMutability": "view", - "type": "function" - }, - { - "inputs": [ - { - "internalType": "address", - "name": "targetContract", - "type": "address" - }, - { - "internalType": "bytes", - "name": "calldataPayload", - "type": "bytes" - } - ], - "name": "simulateAndRevert", - "outputs": [], - "stateMutability": "nonpayable", - "type": "function" - }, - { - "inputs": [ - { - "internalType": "address", - "name": "prevOwner", - "type": "address" - }, - { - "internalType": "address", - "name": "oldOwner", - "type": "address" - }, - { - "internalType": "address", - "name": "newOwner", - "type": "address" - } - ], - "name": "swapOwner", - "outputs": [], - "stateMutability": "nonpayable", - "type": "function" - } - ], - "bytecode": { - "object": "0x", - "sourceMap": "", - "linkReferences": {} - }, - "deployedBytecode": { - "object": "0x", - "sourceMap": "", - "linkReferences": {} - }, - "methodIdentifiers": { - "VERSION()": "ffa1ad74", - "addOwnerWithThreshold(address,uint256)": "0d582f13", - "approveHash(bytes32)": "d4d9bdcd", - "approvedHashes(address,bytes32)": "7d832974", - "changeThreshold(uint256)": "694e80c3", - "checkNSignatures(bytes32,bytes,bytes,uint256)": "12fb68e0", - "checkSignatures(bytes32,bytes,bytes)": "934f3a11", - "disableModule(address,address)": "e009cfde", - "domainSeparator()": "f698da25", - "enableModule(address)": "610b5925", - "encodeTransactionData(address,uint256,bytes,uint8,uint256,uint256,uint256,address,address,uint256)": "e86637db", - "execTransaction(address,uint256,bytes,uint8,uint256,uint256,uint256,address,address,bytes)": "6a761202", - "execTransactionFromModule(address,uint256,bytes,uint8)": "468721a7", - "execTransactionFromModuleReturnData(address,uint256,bytes,uint8)": "5229073f", - "getChainId()": "3408e470", - "getModulesPaginated(address,uint256)": "cc2f8452", - "getOwners()": "a0e67e2b", - "getStorageAt(uint256,uint256)": "5624b25b", - "getThreshold()": "e75235b8", - "getTransactionHash(address,uint256,bytes,uint8,uint256,uint256,uint256,address,address,uint256)": "d8d11f78", - "isModuleEnabled(address)": "2d9ad53d", - "isOwner(address)": "2f54bf6e", - "nonce()": "affed0e0", - "removeOwner(address,address,uint256)": "f8dc5dd9", - "requiredTxGas(address,uint256,bytes,uint8)": "c4ca3a9c", - "setFallbackHandler(address)": "f08a0323", - "setGuard(address)": "e19a9dd9", - "setup(address[],uint256,address,bytes,address,address,uint256,address)": "b63e800d", - "signedMessages(bytes32)": "5ae6bd37", - "simulateAndRevert(address,bytes)": "b4faba09", - "swapOwner(address,address,address)": "e318b52b" - }, - "rawMetadata": "{\"compiler\":{\"version\":\"0.8.19+commit.7dd6d404\"},\"language\":\"Solidity\",\"output\":{\"abi\":[{\"anonymous\":false,\"inputs\":[{\"indexed\":false,\"internalType\":\"address\",\"name\":\"owner\",\"type\":\"address\"}],\"name\":\"AddedOwner\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"bytes32\",\"name\":\"approvedHash\",\"type\":\"bytes32\"},{\"indexed\":true,\"internalType\":\"address\",\"name\":\"owner\",\"type\":\"address\"}],\"name\":\"ApproveHash\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":false,\"internalType\":\"address\",\"name\":\"handler\",\"type\":\"address\"}],\"name\":\"ChangedFallbackHandler\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":false,\"internalType\":\"address\",\"name\":\"guard\",\"type\":\"address\"}],\"name\":\"ChangedGuard\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":false,\"internalType\":\"uint256\",\"name\":\"threshold\",\"type\":\"uint256\"}],\"name\":\"ChangedThreshold\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":false,\"internalType\":\"address\",\"name\":\"module\",\"type\":\"address\"}],\"name\":\"DisabledModule\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":false,\"internalType\":\"address\",\"name\":\"module\",\"type\":\"address\"}],\"name\":\"EnabledModule\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":false,\"internalType\":\"bytes32\",\"name\":\"txHash\",\"type\":\"bytes32\"},{\"indexed\":false,\"internalType\":\"uint256\",\"name\":\"payment\",\"type\":\"uint256\"}],\"name\":\"ExecutionFailure\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"address\",\"name\":\"module\",\"type\":\"address\"}],\"name\":\"ExecutionFromModuleFailure\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"address\",\"name\":\"module\",\"type\":\"address\"}],\"name\":\"ExecutionFromModuleSuccess\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":false,\"internalType\":\"bytes32\",\"name\":\"txHash\",\"type\":\"bytes32\"},{\"indexed\":false,\"internalType\":\"uint256\",\"name\":\"payment\",\"type\":\"uint256\"}],\"name\":\"ExecutionSuccess\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":false,\"internalType\":\"address\",\"name\":\"owner\",\"type\":\"address\"}],\"name\":\"RemovedOwner\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"address\",\"name\":\"sender\",\"type\":\"address\"},{\"indexed\":false,\"internalType\":\"uint256\",\"name\":\"value\",\"type\":\"uint256\"}],\"name\":\"SafeReceived\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"address\",\"name\":\"initiator\",\"type\":\"address\"},{\"indexed\":false,\"internalType\":\"address[]\",\"name\":\"owners\",\"type\":\"address[]\"},{\"indexed\":false,\"internalType\":\"uint256\",\"name\":\"threshold\",\"type\":\"uint256\"},{\"indexed\":false,\"internalType\":\"address\",\"name\":\"initializer\",\"type\":\"address\"},{\"indexed\":false,\"internalType\":\"address\",\"name\":\"fallbackHandler\",\"type\":\"address\"}],\"name\":\"SafeSetup\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"bytes32\",\"name\":\"msgHash\",\"type\":\"bytes32\"}],\"name\":\"SignMsg\",\"type\":\"event\"},{\"inputs\":[],\"name\":\"VERSION\",\"outputs\":[{\"internalType\":\"string\",\"name\":\"\",\"type\":\"string\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"owner\",\"type\":\"address\"},{\"internalType\":\"uint256\",\"name\":\"_threshold\",\"type\":\"uint256\"}],\"name\":\"addOwnerWithThreshold\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"bytes32\",\"name\":\"hashToApprove\",\"type\":\"bytes32\"}],\"name\":\"approveHash\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"\",\"type\":\"address\"},{\"internalType\":\"bytes32\",\"name\":\"\",\"type\":\"bytes32\"}],\"name\":\"approvedHashes\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"\",\"type\":\"uint256\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"uint256\",\"name\":\"_threshold\",\"type\":\"uint256\"}],\"name\":\"changeThreshold\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"bytes32\",\"name\":\"dataHash\",\"type\":\"bytes32\"},{\"internalType\":\"bytes\",\"name\":\"data\",\"type\":\"bytes\"},{\"internalType\":\"bytes\",\"name\":\"signatures\",\"type\":\"bytes\"},{\"internalType\":\"uint256\",\"name\":\"requiredSignatures\",\"type\":\"uint256\"}],\"name\":\"checkNSignatures\",\"outputs\":[],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"bytes32\",\"name\":\"dataHash\",\"type\":\"bytes32\"},{\"internalType\":\"bytes\",\"name\":\"data\",\"type\":\"bytes\"},{\"internalType\":\"bytes\",\"name\":\"signatures\",\"type\":\"bytes\"}],\"name\":\"checkSignatures\",\"outputs\":[],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"prevModule\",\"type\":\"address\"},{\"internalType\":\"address\",\"name\":\"module\",\"type\":\"address\"}],\"name\":\"disableModule\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"domainSeparator\",\"outputs\":[{\"internalType\":\"bytes32\",\"name\":\"\",\"type\":\"bytes32\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"module\",\"type\":\"address\"}],\"name\":\"enableModule\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"to\",\"type\":\"address\"},{\"internalType\":\"uint256\",\"name\":\"value\",\"type\":\"uint256\"},{\"internalType\":\"bytes\",\"name\":\"data\",\"type\":\"bytes\"},{\"internalType\":\"enum Enum.Operation\",\"name\":\"operation\",\"type\":\"uint8\"},{\"internalType\":\"uint256\",\"name\":\"safeTxGas\",\"type\":\"uint256\"},{\"internalType\":\"uint256\",\"name\":\"baseGas\",\"type\":\"uint256\"},{\"internalType\":\"uint256\",\"name\":\"gasPrice\",\"type\":\"uint256\"},{\"internalType\":\"address\",\"name\":\"gasToken\",\"type\":\"address\"},{\"internalType\":\"address\",\"name\":\"refundReceiver\",\"type\":\"address\"},{\"internalType\":\"uint256\",\"name\":\"_nonce\",\"type\":\"uint256\"}],\"name\":\"encodeTransactionData\",\"outputs\":[{\"internalType\":\"bytes\",\"name\":\"\",\"type\":\"bytes\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"to\",\"type\":\"address\"},{\"internalType\":\"uint256\",\"name\":\"value\",\"type\":\"uint256\"},{\"internalType\":\"bytes\",\"name\":\"data\",\"type\":\"bytes\"},{\"internalType\":\"enum Enum.Operation\",\"name\":\"operation\",\"type\":\"uint8\"},{\"internalType\":\"uint256\",\"name\":\"safeTxGas\",\"type\":\"uint256\"},{\"internalType\":\"uint256\",\"name\":\"baseGas\",\"type\":\"uint256\"},{\"internalType\":\"uint256\",\"name\":\"gasPrice\",\"type\":\"uint256\"},{\"internalType\":\"address\",\"name\":\"gasToken\",\"type\":\"address\"},{\"internalType\":\"address\",\"name\":\"refundReceiver\",\"type\":\"address\"},{\"internalType\":\"bytes\",\"name\":\"signatures\",\"type\":\"bytes\"}],\"name\":\"execTransaction\",\"outputs\":[{\"internalType\":\"bool\",\"name\":\"success\",\"type\":\"bool\"}],\"stateMutability\":\"payable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"to\",\"type\":\"address\"},{\"internalType\":\"uint256\",\"name\":\"value\",\"type\":\"uint256\"},{\"internalType\":\"bytes\",\"name\":\"data\",\"type\":\"bytes\"},{\"internalType\":\"enum Enum.Operation\",\"name\":\"operation\",\"type\":\"uint8\"}],\"name\":\"execTransactionFromModule\",\"outputs\":[{\"internalType\":\"bool\",\"name\":\"success\",\"type\":\"bool\"}],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"to\",\"type\":\"address\"},{\"internalType\":\"uint256\",\"name\":\"value\",\"type\":\"uint256\"},{\"internalType\":\"bytes\",\"name\":\"data\",\"type\":\"bytes\"},{\"internalType\":\"enum Enum.Operation\",\"name\":\"operation\",\"type\":\"uint8\"}],\"name\":\"execTransactionFromModuleReturnData\",\"outputs\":[{\"internalType\":\"bool\",\"name\":\"success\",\"type\":\"bool\"},{\"internalType\":\"bytes\",\"name\":\"returnData\",\"type\":\"bytes\"}],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"getChainId\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"\",\"type\":\"uint256\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"start\",\"type\":\"address\"},{\"internalType\":\"uint256\",\"name\":\"pageSize\",\"type\":\"uint256\"}],\"name\":\"getModulesPaginated\",\"outputs\":[{\"internalType\":\"address[]\",\"name\":\"array\",\"type\":\"address[]\"},{\"internalType\":\"address\",\"name\":\"next\",\"type\":\"address\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"getOwners\",\"outputs\":[{\"internalType\":\"address[]\",\"name\":\"\",\"type\":\"address[]\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"uint256\",\"name\":\"offset\",\"type\":\"uint256\"},{\"internalType\":\"uint256\",\"name\":\"length\",\"type\":\"uint256\"}],\"name\":\"getStorageAt\",\"outputs\":[{\"internalType\":\"bytes\",\"name\":\"\",\"type\":\"bytes\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"getThreshold\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"\",\"type\":\"uint256\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"to\",\"type\":\"address\"},{\"internalType\":\"uint256\",\"name\":\"value\",\"type\":\"uint256\"},{\"internalType\":\"bytes\",\"name\":\"data\",\"type\":\"bytes\"},{\"internalType\":\"enum Enum.Operation\",\"name\":\"operation\",\"type\":\"uint8\"},{\"internalType\":\"uint256\",\"name\":\"safeTxGas\",\"type\":\"uint256\"},{\"internalType\":\"uint256\",\"name\":\"baseGas\",\"type\":\"uint256\"},{\"internalType\":\"uint256\",\"name\":\"gasPrice\",\"type\":\"uint256\"},{\"internalType\":\"address\",\"name\":\"gasToken\",\"type\":\"address\"},{\"internalType\":\"address\",\"name\":\"refundReceiver\",\"type\":\"address\"},{\"internalType\":\"uint256\",\"name\":\"_nonce\",\"type\":\"uint256\"}],\"name\":\"getTransactionHash\",\"outputs\":[{\"internalType\":\"bytes32\",\"name\":\"\",\"type\":\"bytes32\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"module\",\"type\":\"address\"}],\"name\":\"isModuleEnabled\",\"outputs\":[{\"internalType\":\"bool\",\"name\":\"\",\"type\":\"bool\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"owner\",\"type\":\"address\"}],\"name\":\"isOwner\",\"outputs\":[{\"internalType\":\"bool\",\"name\":\"\",\"type\":\"bool\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"nonce\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"\",\"type\":\"uint256\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"prevOwner\",\"type\":\"address\"},{\"internalType\":\"address\",\"name\":\"owner\",\"type\":\"address\"},{\"internalType\":\"uint256\",\"name\":\"_threshold\",\"type\":\"uint256\"}],\"name\":\"removeOwner\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"to\",\"type\":\"address\"},{\"internalType\":\"uint256\",\"name\":\"value\",\"type\":\"uint256\"},{\"internalType\":\"bytes\",\"name\":\"data\",\"type\":\"bytes\"},{\"internalType\":\"enum Enum.Operation\",\"name\":\"operation\",\"type\":\"uint8\"}],\"name\":\"requiredTxGas\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"\",\"type\":\"uint256\"}],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"handler\",\"type\":\"address\"}],\"name\":\"setFallbackHandler\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"guard\",\"type\":\"address\"}],\"name\":\"setGuard\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address[]\",\"name\":\"_owners\",\"type\":\"address[]\"},{\"internalType\":\"uint256\",\"name\":\"_threshold\",\"type\":\"uint256\"},{\"internalType\":\"address\",\"name\":\"to\",\"type\":\"address\"},{\"internalType\":\"bytes\",\"name\":\"data\",\"type\":\"bytes\"},{\"internalType\":\"address\",\"name\":\"fallbackHandler\",\"type\":\"address\"},{\"internalType\":\"address\",\"name\":\"paymentToken\",\"type\":\"address\"},{\"internalType\":\"uint256\",\"name\":\"payment\",\"type\":\"uint256\"},{\"internalType\":\"address\",\"name\":\"paymentReceiver\",\"type\":\"address\"}],\"name\":\"setup\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"bytes32\",\"name\":\"\",\"type\":\"bytes32\"}],\"name\":\"signedMessages\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"\",\"type\":\"uint256\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"targetContract\",\"type\":\"address\"},{\"internalType\":\"bytes\",\"name\":\"calldataPayload\",\"type\":\"bytes\"}],\"name\":\"simulateAndRevert\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"prevOwner\",\"type\":\"address\"},{\"internalType\":\"address\",\"name\":\"oldOwner\",\"type\":\"address\"},{\"internalType\":\"address\",\"name\":\"newOwner\",\"type\":\"address\"}],\"name\":\"swapOwner\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"}],\"devdoc\":{\"kind\":\"dev\",\"methods\":{},\"title\":\"IGnosisSafe - Gnosis Safe Interface\",\"version\":1},\"userdoc\":{\"kind\":\"user\",\"methods\":{},\"version\":1}},\"settings\":{\"compilationTarget\":{\"scripts/interfaces/IGnosisSafe.sol\":\"IGnosisSafe\"},\"evmVersion\":\"paris\",\"libraries\":{},\"metadata\":{\"bytecodeHash\":\"none\"},\"optimizer\":{\"enabled\":true,\"runs\":999999},\"remappings\":[\":@cwia/=lib/clones-with-immutable-args/src/\",\":@openzeppelin/contracts-upgradeable/=lib/openzeppelin-contracts-upgradeable/contracts/\",\":@openzeppelin/contracts/=lib/openzeppelin-contracts/contracts/\",\":@rari-capital/solmate/=lib/solmate/\",\":clones-with-immutable-args/=lib/clones-with-immutable-args/src/\",\":ds-test/=lib/forge-std/lib/ds-test/src/\",\":forge-std/=lib/forge-std/src/\",\":openzeppelin-contracts-upgradeable/=lib/openzeppelin-contracts-upgradeable/\",\":openzeppelin-contracts/=lib/openzeppelin-contracts/\",\":safe-contracts/=lib/safe-contracts/contracts/\",\":solmate/=lib/solmate/src/\"]},\"sources\":{\"scripts/interfaces/IGnosisSafe.sol\":{\"keccak256\":\"0xb9a55c98ef4d6a18260d6432f633a4bd6c5f540bfa80c4dc89c5ec33fd9aeec5\",\"license\":\"LGPL-3.0-only\",\"urls\":[\"bzz-raw://e953fc0cb723a9197006697e372f1729af1de1860a9845f2574f98aa9add72aa\",\"dweb:/ipfs/QmTdBba1DFqPNcaBmEFDSN8JmR7xPKwWno2vqnhmBjoGMD\"]}},\"version\":1}", - "metadata": { - "compiler": { - "version": "0.8.19+commit.7dd6d404" - }, - "language": "Solidity", - "output": { - "abi": [ - { - "inputs": [ - { - "internalType": "address", - "name": "owner", - "type": "address", - "indexed": false - } - ], - "type": "event", - "name": "AddedOwner", - "anonymous": false - }, - { - "inputs": [ - { - "internalType": "bytes32", - "name": "approvedHash", - "type": "bytes32", - "indexed": true - }, - { - "internalType": "address", - "name": "owner", - "type": "address", - "indexed": true - } - ], - "type": "event", - "name": "ApproveHash", - "anonymous": false - }, - { - "inputs": [ - { - "internalType": "address", - "name": "handler", - "type": "address", - "indexed": false - } - ], - "type": "event", - "name": "ChangedFallbackHandler", - "anonymous": false - }, - { - "inputs": [ - { - "internalType": "address", - "name": "guard", - "type": "address", - "indexed": false - } - ], - "type": "event", - "name": "ChangedGuard", - "anonymous": false - }, - { - "inputs": [ - { - "internalType": "uint256", - "name": "threshold", - "type": "uint256", - "indexed": false - } - ], - "type": "event", - "name": "ChangedThreshold", - "anonymous": false - }, - { - "inputs": [ - { - "internalType": "address", - "name": "module", - "type": "address", - "indexed": false - } - ], - "type": "event", - "name": "DisabledModule", - "anonymous": false - }, - { - "inputs": [ - { - "internalType": "address", - "name": "module", - "type": "address", - "indexed": false - } - ], - "type": "event", - "name": "EnabledModule", - "anonymous": false - }, - { - "inputs": [ - { - "internalType": "bytes32", - "name": "txHash", - "type": "bytes32", - "indexed": false - }, - { - "internalType": "uint256", - "name": "payment", - "type": "uint256", - "indexed": false - } - ], - "type": "event", - "name": "ExecutionFailure", - "anonymous": false - }, - { - "inputs": [ - { - "internalType": "address", - "name": "module", - "type": "address", - "indexed": true - } - ], - "type": "event", - "name": "ExecutionFromModuleFailure", - "anonymous": false - }, - { - "inputs": [ - { - "internalType": "address", - "name": "module", - "type": "address", - "indexed": true - } - ], - "type": "event", - "name": "ExecutionFromModuleSuccess", - "anonymous": false - }, - { - "inputs": [ - { - "internalType": "bytes32", - "name": "txHash", - "type": "bytes32", - "indexed": false - }, - { - "internalType": "uint256", - "name": "payment", - "type": "uint256", - "indexed": false - } - ], - "type": "event", - "name": "ExecutionSuccess", - "anonymous": false - }, - { - "inputs": [ - { - "internalType": "address", - "name": "owner", - "type": "address", - "indexed": false - } - ], - "type": "event", - "name": "RemovedOwner", - "anonymous": false - }, - { - "inputs": [ - { - "internalType": "address", - "name": "sender", - "type": "address", - "indexed": true - }, - { - "internalType": "uint256", - "name": "value", - "type": "uint256", - "indexed": false - } - ], - "type": "event", - "name": "SafeReceived", - "anonymous": false - }, - { - "inputs": [ - { - "internalType": "address", - "name": "initiator", - "type": "address", - "indexed": true - }, - { - "internalType": "address[]", - "name": "owners", - "type": "address[]", - "indexed": false - }, - { - "internalType": "uint256", - "name": "threshold", - "type": "uint256", - "indexed": false - }, - { - "internalType": "address", - "name": "initializer", - "type": "address", - "indexed": false - }, - { - "internalType": "address", - "name": "fallbackHandler", - "type": "address", - "indexed": false - } - ], - "type": "event", - "name": "SafeSetup", - "anonymous": false - }, - { - "inputs": [ - { - "internalType": "bytes32", - "name": "msgHash", - "type": "bytes32", - "indexed": true - } - ], - "type": "event", - "name": "SignMsg", - "anonymous": false - }, - { - "inputs": [], - "stateMutability": "view", - "type": "function", - "name": "VERSION", - "outputs": [ - { - "internalType": "string", - "name": "", - "type": "string" - } - ] - }, - { - "inputs": [ - { - "internalType": "address", - "name": "owner", - "type": "address" - }, - { - "internalType": "uint256", - "name": "_threshold", - "type": "uint256" - } - ], - "stateMutability": "nonpayable", - "type": "function", - "name": "addOwnerWithThreshold" - }, - { - "inputs": [ - { - "internalType": "bytes32", - "name": "hashToApprove", - "type": "bytes32" - } - ], - "stateMutability": "nonpayable", - "type": "function", - "name": "approveHash" - }, - { - "inputs": [ - { - "internalType": "address", - "name": "", - "type": "address" - }, - { - "internalType": "bytes32", - "name": "", - "type": "bytes32" - } - ], - "stateMutability": "view", - "type": "function", - "name": "approvedHashes", - "outputs": [ - { - "internalType": "uint256", - "name": "", - "type": "uint256" - } - ] - }, - { - "inputs": [ - { - "internalType": "uint256", - "name": "_threshold", - "type": "uint256" - } - ], - "stateMutability": "nonpayable", - "type": "function", - "name": "changeThreshold" - }, - { - "inputs": [ - { - "internalType": "bytes32", - "name": "dataHash", - "type": "bytes32" - }, - { - "internalType": "bytes", - "name": "data", - "type": "bytes" - }, - { - "internalType": "bytes", - "name": "signatures", - "type": "bytes" - }, - { - "internalType": "uint256", - "name": "requiredSignatures", - "type": "uint256" - } - ], - "stateMutability": "view", - "type": "function", - "name": "checkNSignatures" - }, - { - "inputs": [ - { - "internalType": "bytes32", - "name": "dataHash", - "type": "bytes32" - }, - { - "internalType": "bytes", - "name": "data", - "type": "bytes" - }, - { - "internalType": "bytes", - "name": "signatures", - "type": "bytes" - } - ], - "stateMutability": "view", - "type": "function", - "name": "checkSignatures" - }, - { - "inputs": [ - { - "internalType": "address", - "name": "prevModule", - "type": "address" - }, - { - "internalType": "address", - "name": "module", - "type": "address" - } - ], - "stateMutability": "nonpayable", - "type": "function", - "name": "disableModule" - }, - { - "inputs": [], - "stateMutability": "view", - "type": "function", - "name": "domainSeparator", - "outputs": [ - { - "internalType": "bytes32", - "name": "", - "type": "bytes32" - } - ] - }, - { - "inputs": [ - { - "internalType": "address", - "name": "module", - "type": "address" - } - ], - "stateMutability": "nonpayable", - "type": "function", - "name": "enableModule" - }, - { - "inputs": [ - { - "internalType": "address", - "name": "to", - "type": "address" - }, - { - "internalType": "uint256", - "name": "value", - "type": "uint256" - }, - { - "internalType": "bytes", - "name": "data", - "type": "bytes" - }, - { - "internalType": "enum Enum.Operation", - "name": "operation", - "type": "uint8" - }, - { - "internalType": "uint256", - "name": "safeTxGas", - "type": "uint256" - }, - { - "internalType": "uint256", - "name": "baseGas", - "type": "uint256" - }, - { - "internalType": "uint256", - "name": "gasPrice", - "type": "uint256" - }, - { - "internalType": "address", - "name": "gasToken", - "type": "address" - }, - { - "internalType": "address", - "name": "refundReceiver", - "type": "address" - }, - { - "internalType": "uint256", - "name": "_nonce", - "type": "uint256" - } - ], - "stateMutability": "view", - "type": "function", - "name": "encodeTransactionData", - "outputs": [ - { - "internalType": "bytes", - "name": "", - "type": "bytes" - } - ] - }, - { - "inputs": [ - { - "internalType": "address", - "name": "to", - "type": "address" - }, - { - "internalType": "uint256", - "name": "value", - "type": "uint256" - }, - { - "internalType": "bytes", - "name": "data", - "type": "bytes" - }, - { - "internalType": "enum Enum.Operation", - "name": "operation", - "type": "uint8" - }, - { - "internalType": "uint256", - "name": "safeTxGas", - "type": "uint256" - }, - { - "internalType": "uint256", - "name": "baseGas", - "type": "uint256" - }, - { - "internalType": "uint256", - "name": "gasPrice", - "type": "uint256" - }, - { - "internalType": "address", - "name": "gasToken", - "type": "address" - }, - { - "internalType": "address", - "name": "refundReceiver", - "type": "address" - }, - { - "internalType": "bytes", - "name": "signatures", - "type": "bytes" - } - ], - "stateMutability": "payable", - "type": "function", - "name": "execTransaction", - "outputs": [ - { - "internalType": "bool", - "name": "success", - "type": "bool" - } - ] - }, - { - "inputs": [ - { - "internalType": "address", - "name": "to", - "type": "address" - }, - { - "internalType": "uint256", - "name": "value", - "type": "uint256" - }, - { - "internalType": "bytes", - "name": "data", - "type": "bytes" - }, - { - "internalType": "enum Enum.Operation", - "name": "operation", - "type": "uint8" - } - ], - "stateMutability": "nonpayable", - "type": "function", - "name": "execTransactionFromModule", - "outputs": [ - { - "internalType": "bool", - "name": "success", - "type": "bool" - } - ] - }, - { - "inputs": [ - { - "internalType": "address", - "name": "to", - "type": "address" - }, - { - "internalType": "uint256", - "name": "value", - "type": "uint256" - }, - { - "internalType": "bytes", - "name": "data", - "type": "bytes" - }, - { - "internalType": "enum Enum.Operation", - "name": "operation", - "type": "uint8" - } - ], - "stateMutability": "nonpayable", - "type": "function", - "name": "execTransactionFromModuleReturnData", - "outputs": [ - { - "internalType": "bool", - "name": "success", - "type": "bool" - }, - { - "internalType": "bytes", - "name": "returnData", - "type": "bytes" - } - ] - }, - { - "inputs": [], - "stateMutability": "view", - "type": "function", - "name": "getChainId", - "outputs": [ - { - "internalType": "uint256", - "name": "", - "type": "uint256" - } - ] - }, - { - "inputs": [ - { - "internalType": "address", - "name": "start", - "type": "address" - }, - { - "internalType": "uint256", - "name": "pageSize", - "type": "uint256" - } - ], - "stateMutability": "view", - "type": "function", - "name": "getModulesPaginated", - "outputs": [ - { - "internalType": "address[]", - "name": "array", - "type": "address[]" - }, - { - "internalType": "address", - "name": "next", - "type": "address" - } - ] - }, - { - "inputs": [], - "stateMutability": "view", - "type": "function", - "name": "getOwners", - "outputs": [ - { - "internalType": "address[]", - "name": "", - "type": "address[]" - } - ] - }, - { - "inputs": [ - { - "internalType": "uint256", - "name": "offset", - "type": "uint256" - }, - { - "internalType": "uint256", - "name": "length", - "type": "uint256" - } - ], - "stateMutability": "view", - "type": "function", - "name": "getStorageAt", - "outputs": [ - { - "internalType": "bytes", - "name": "", - "type": "bytes" - } - ] - }, - { - "inputs": [], - "stateMutability": "view", - "type": "function", - "name": "getThreshold", - "outputs": [ - { - "internalType": "uint256", - "name": "", - "type": "uint256" - } - ] - }, - { - "inputs": [ - { - "internalType": "address", - "name": "to", - "type": "address" - }, - { - "internalType": "uint256", - "name": "value", - "type": "uint256" - }, - { - "internalType": "bytes", - "name": "data", - "type": "bytes" - }, - { - "internalType": "enum Enum.Operation", - "name": "operation", - "type": "uint8" - }, - { - "internalType": "uint256", - "name": "safeTxGas", - "type": "uint256" - }, - { - "internalType": "uint256", - "name": "baseGas", - "type": "uint256" - }, - { - "internalType": "uint256", - "name": "gasPrice", - "type": "uint256" - }, - { - "internalType": "address", - "name": "gasToken", - "type": "address" - }, - { - "internalType": "address", - "name": "refundReceiver", - "type": "address" - }, - { - "internalType": "uint256", - "name": "_nonce", - "type": "uint256" - } - ], - "stateMutability": "view", - "type": "function", - "name": "getTransactionHash", - "outputs": [ - { - "internalType": "bytes32", - "name": "", - "type": "bytes32" - } - ] - }, - { - "inputs": [ - { - "internalType": "address", - "name": "module", - "type": "address" - } - ], - "stateMutability": "view", - "type": "function", - "name": "isModuleEnabled", - "outputs": [ - { - "internalType": "bool", - "name": "", - "type": "bool" - } - ] - }, - { - "inputs": [ - { - "internalType": "address", - "name": "owner", - "type": "address" - } - ], - "stateMutability": "view", - "type": "function", - "name": "isOwner", - "outputs": [ - { - "internalType": "bool", - "name": "", - "type": "bool" - } - ] - }, - { - "inputs": [], - "stateMutability": "view", - "type": "function", - "name": "nonce", - "outputs": [ - { - "internalType": "uint256", - "name": "", - "type": "uint256" - } - ] - }, - { - "inputs": [ - { - "internalType": "address", - "name": "prevOwner", - "type": "address" - }, - { - "internalType": "address", - "name": "owner", - "type": "address" - }, - { - "internalType": "uint256", - "name": "_threshold", - "type": "uint256" - } - ], - "stateMutability": "nonpayable", - "type": "function", - "name": "removeOwner" - }, - { - "inputs": [ - { - "internalType": "address", - "name": "to", - "type": "address" - }, - { - "internalType": "uint256", - "name": "value", - "type": "uint256" - }, - { - "internalType": "bytes", - "name": "data", - "type": "bytes" - }, - { - "internalType": "enum Enum.Operation", - "name": "operation", - "type": "uint8" - } - ], - "stateMutability": "nonpayable", - "type": "function", - "name": "requiredTxGas", - "outputs": [ - { - "internalType": "uint256", - "name": "", - "type": "uint256" - } - ] - }, - { - "inputs": [ - { - "internalType": "address", - "name": "handler", - "type": "address" - } - ], - "stateMutability": "nonpayable", - "type": "function", - "name": "setFallbackHandler" - }, - { - "inputs": [ - { - "internalType": "address", - "name": "guard", - "type": "address" - } - ], - "stateMutability": "nonpayable", - "type": "function", - "name": "setGuard" - }, - { - "inputs": [ - { - "internalType": "address[]", - "name": "_owners", - "type": "address[]" - }, - { - "internalType": "uint256", - "name": "_threshold", - "type": "uint256" - }, - { - "internalType": "address", - "name": "to", - "type": "address" - }, - { - "internalType": "bytes", - "name": "data", - "type": "bytes" - }, - { - "internalType": "address", - "name": "fallbackHandler", - "type": "address" - }, - { - "internalType": "address", - "name": "paymentToken", - "type": "address" - }, - { - "internalType": "uint256", - "name": "payment", - "type": "uint256" - }, - { - "internalType": "address", - "name": "paymentReceiver", - "type": "address" - } - ], - "stateMutability": "nonpayable", - "type": "function", - "name": "setup" - }, - { - "inputs": [ - { - "internalType": "bytes32", - "name": "", - "type": "bytes32" - } - ], - "stateMutability": "view", - "type": "function", - "name": "signedMessages", - "outputs": [ - { - "internalType": "uint256", - "name": "", - "type": "uint256" - } - ] - }, - { - "inputs": [ - { - "internalType": "address", - "name": "targetContract", - "type": "address" - }, - { - "internalType": "bytes", - "name": "calldataPayload", - "type": "bytes" - } - ], - "stateMutability": "nonpayable", - "type": "function", - "name": "simulateAndRevert" - }, - { - "inputs": [ - { - "internalType": "address", - "name": "prevOwner", - "type": "address" - }, - { - "internalType": "address", - "name": "oldOwner", - "type": "address" - }, - { - "internalType": "address", - "name": "newOwner", - "type": "address" - } - ], - "stateMutability": "nonpayable", - "type": "function", - "name": "swapOwner" - } - ], - "devdoc": { - "kind": "dev", - "methods": {}, - "version": 1 - }, - "userdoc": { - "kind": "user", - "methods": {}, - "version": 1 - } - }, - "settings": { - "remappings": [ - "@cwia/=lib/clones-with-immutable-args/src/", - "@openzeppelin/contracts-upgradeable/=lib/openzeppelin-contracts-upgradeable/contracts/", - "@openzeppelin/contracts/=lib/openzeppelin-contracts/contracts/", - "@rari-capital/solmate/=lib/solmate/", - "clones-with-immutable-args/=lib/clones-with-immutable-args/src/", - "ds-test/=lib/forge-std/lib/ds-test/src/", - "forge-std/=lib/forge-std/src/", - "openzeppelin-contracts-upgradeable/=lib/openzeppelin-contracts-upgradeable/", - "openzeppelin-contracts/=lib/openzeppelin-contracts/", - "safe-contracts/=lib/safe-contracts/contracts/", - "solmate/=lib/solmate/src/" - ], - "optimizer": { - "enabled": true, - "runs": 999999 - }, - "metadata": { - "bytecodeHash": "none" - }, - "compilationTarget": { - "scripts/interfaces/IGnosisSafe.sol": "IGnosisSafe" - }, - "libraries": {} - }, - "sources": { - "scripts/interfaces/IGnosisSafe.sol": { - "keccak256": "0xb9a55c98ef4d6a18260d6432f633a4bd6c5f540bfa80c4dc89c5ec33fd9aeec5", - "urls": [ - "bzz-raw://e953fc0cb723a9197006697e372f1729af1de1860a9845f2574f98aa9add72aa", - "dweb:/ipfs/QmTdBba1DFqPNcaBmEFDSN8JmR7xPKwWno2vqnhmBjoGMD" - ], - "license": "LGPL-3.0-only" - } - }, - "version": 1 - }, - "storageLayout": { - "storage": [], - "types": {} - }, - "userdoc": { - "version": 1, - "kind": "user" - }, - "devdoc": { - "version": 1, - "kind": "dev", - "title": "IGnosisSafe - Gnosis Safe Interface" - }, - "ast": { - "absolutePath": "scripts/interfaces/IGnosisSafe.sol", - "id": 36017, - "exportedSymbols": { - "Enum": [ - 35629 - ], - "IGnosisSafe": [ - 36016 - ] - }, - "nodeType": "SourceUnit", - "src": "42:5070:43", - "nodes": [ - { - "id": 35624, - "nodeType": "PragmaDirective", - "src": "42:24:43", - "nodes": [], - "literals": [ - "solidity", - "^", - "0.8", - ".10" - ] - }, - { - "id": 35629, - "nodeType": "ContractDefinition", - "src": "172:88:43", - "nodes": [ - { - "id": 35628, - "nodeType": "EnumDefinition", - "src": "201:57:43", - "nodes": [], - "canonicalName": "Enum.Operation", - "members": [ - { - "id": 35626, - "name": "Call", - "nameLocation": "226:4:43", - "nodeType": "EnumValue", - "src": "226:4:43" - }, - { - "id": 35627, - "name": "DelegateCall", - "nameLocation": "240:12:43", - "nodeType": "EnumValue", - "src": "240:12:43" - } - ], - "name": "Operation", - "nameLocation": "206:9:43" - } - ], - "abstract": true, - "baseContracts": [], - "canonicalName": "Enum", - "contractDependencies": [], - "contractKind": "contract", - "documentation": { - "id": 35625, - "nodeType": "StructuredDocumentation", - "src": "68:104:43", - "text": "@title Enum - Collection of enums used in Safe contracts.\n @author Richard Meissner - @rmeissner" - }, - "fullyImplemented": true, - "linearizedBaseContracts": [ - 35629 - ], - "name": "Enum", - "nameLocation": "190:4:43", - "scope": 36017, - "usedErrors": [] - }, - { - "id": 36016, - "nodeType": "ContractDefinition", - "src": "309:4802:43", - "nodes": [ - { - "id": 35634, - "nodeType": "EventDefinition", - "src": "337:32:43", - "nodes": [], - "anonymous": false, - "eventSelector": "9465fa0c962cc76958e6373a993326400c1c94f8be2fe3a952adfa7f60b2ea26", - "name": "AddedOwner", - "nameLocation": "343:10:43", - "parameters": { - "id": 35633, - "nodeType": "ParameterList", - "parameters": [ - { - "constant": false, - "id": 35632, - "indexed": false, - "mutability": "mutable", - "name": "owner", - "nameLocation": "362:5:43", - "nodeType": "VariableDeclaration", - "scope": 35634, - "src": "354:13:43", - "stateVariable": false, - "storageLocation": "default", - "typeDescriptions": { - "typeIdentifier": "t_address", - "typeString": "address" - }, - "typeName": { - "id": 35631, - "name": "address", - "nodeType": "ElementaryTypeName", - "src": "354:7:43", - "stateMutability": "nonpayable", - "typeDescriptions": { - "typeIdentifier": "t_address", - "typeString": "address" - } - }, - "visibility": "internal" - } - ], - "src": "353:15:43" - } - }, - { - "id": 35640, - "nodeType": "EventDefinition", - "src": "374:71:43", - "nodes": [], - "anonymous": false, - "eventSelector": "f2a0eb156472d1440255b0d7c1e19cc07115d1051fe605b0dce69acfec884d9c", - "name": "ApproveHash", - "nameLocation": "380:11:43", - "parameters": { - "id": 35639, - "nodeType": "ParameterList", - "parameters": [ - { - "constant": false, - "id": 35636, - "indexed": true, - "mutability": "mutable", - "name": "approvedHash", - "nameLocation": "408:12:43", - "nodeType": "VariableDeclaration", - "scope": 35640, - "src": "392:28:43", - "stateVariable": false, - "storageLocation": "default", - "typeDescriptions": { - "typeIdentifier": "t_bytes32", - "typeString": "bytes32" - }, - "typeName": { - "id": 35635, - "name": "bytes32", - "nodeType": "ElementaryTypeName", - "src": "392:7:43", - "typeDescriptions": { - "typeIdentifier": "t_bytes32", - "typeString": "bytes32" - } - }, - "visibility": "internal" - }, - { - "constant": false, - "id": 35638, - "indexed": true, - "mutability": "mutable", - "name": "owner", - "nameLocation": "438:5:43", - "nodeType": "VariableDeclaration", - "scope": 35640, - "src": "422:21:43", - "stateVariable": false, - "storageLocation": "default", - "typeDescriptions": { - "typeIdentifier": "t_address", - "typeString": "address" - }, - "typeName": { - "id": 35637, - "name": "address", - "nodeType": "ElementaryTypeName", - "src": "422:7:43", - "stateMutability": "nonpayable", - "typeDescriptions": { - "typeIdentifier": "t_address", - "typeString": "address" - } - }, - "visibility": "internal" - } - ], - "src": "391:53:43" - } - }, - { - "id": 35644, - "nodeType": "EventDefinition", - "src": "450:46:43", - "nodes": [], - "anonymous": false, - "eventSelector": "5ac6c46c93c8d0e53714ba3b53db3e7c046da994313d7ed0d192028bc7c228b0", - "name": "ChangedFallbackHandler", - "nameLocation": "456:22:43", - "parameters": { - "id": 35643, - "nodeType": "ParameterList", - "parameters": [ - { - "constant": false, - "id": 35642, - "indexed": false, - "mutability": "mutable", - "name": "handler", - "nameLocation": "487:7:43", - "nodeType": "VariableDeclaration", - "scope": 35644, - "src": "479:15:43", - "stateVariable": false, - "storageLocation": "default", - "typeDescriptions": { - "typeIdentifier": "t_address", - "typeString": "address" - }, - "typeName": { - "id": 35641, - "name": "address", - "nodeType": "ElementaryTypeName", - "src": "479:7:43", - "stateMutability": "nonpayable", - "typeDescriptions": { - "typeIdentifier": "t_address", - "typeString": "address" - } - }, - "visibility": "internal" - } - ], - "src": "478:17:43" - } - }, - { - "id": 35648, - "nodeType": "EventDefinition", - "src": "501:34:43", - "nodes": [], - "anonymous": false, - "eventSelector": "1151116914515bc0891ff9047a6cb32cf902546f83066499bcf8ba33d2353fa2", - "name": "ChangedGuard", - "nameLocation": "507:12:43", - "parameters": { - "id": 35647, - "nodeType": "ParameterList", - "parameters": [ - { - "constant": false, - "id": 35646, - "indexed": false, - "mutability": "mutable", - "name": "guard", - "nameLocation": "528:5:43", - "nodeType": "VariableDeclaration", - "scope": 35648, - "src": "520:13:43", - "stateVariable": false, - "storageLocation": "default", - "typeDescriptions": { - "typeIdentifier": "t_address", - "typeString": "address" - }, - "typeName": { - "id": 35645, - "name": "address", - "nodeType": "ElementaryTypeName", - "src": "520:7:43", - "stateMutability": "nonpayable", - "typeDescriptions": { - "typeIdentifier": "t_address", - "typeString": "address" - } - }, - "visibility": "internal" - } - ], - "src": "519:15:43" - } - }, - { - "id": 35652, - "nodeType": "EventDefinition", - "src": "540:42:43", - "nodes": [], - "anonymous": false, - "eventSelector": "610f7ff2b304ae8903c3de74c60c6ab1f7d6226b3f52c5161905bb5ad4039c93", - "name": "ChangedThreshold", - "nameLocation": "546:16:43", - "parameters": { - "id": 35651, - "nodeType": "ParameterList", - "parameters": [ - { - "constant": false, - "id": 35650, - "indexed": false, - "mutability": "mutable", - "name": "threshold", - "nameLocation": "571:9:43", - "nodeType": "VariableDeclaration", - "scope": 35652, - "src": "563:17:43", - "stateVariable": false, - "storageLocation": "default", - "typeDescriptions": { - "typeIdentifier": "t_uint256", - "typeString": "uint256" - }, - "typeName": { - "id": 35649, - "name": "uint256", - "nodeType": "ElementaryTypeName", - "src": "563:7:43", - "typeDescriptions": { - "typeIdentifier": "t_uint256", - "typeString": "uint256" - } - }, - "visibility": "internal" - } - ], - "src": "562:19:43" - } - }, - { - "id": 35656, - "nodeType": "EventDefinition", - "src": "587:37:43", - "nodes": [], - "anonymous": false, - "eventSelector": "aab4fa2b463f581b2b32cb3b7e3b704b9ce37cc209b5fb4d77e593ace4054276", - "name": "DisabledModule", - "nameLocation": "593:14:43", - "parameters": { - "id": 35655, - "nodeType": "ParameterList", - "parameters": [ - { - "constant": false, - "id": 35654, - "indexed": false, - "mutability": "mutable", - "name": "module", - "nameLocation": "616:6:43", - "nodeType": "VariableDeclaration", - "scope": 35656, - "src": "608:14:43", - "stateVariable": false, - "storageLocation": "default", - "typeDescriptions": { - "typeIdentifier": "t_address", - "typeString": "address" - }, - "typeName": { - "id": 35653, - "name": "address", - "nodeType": "ElementaryTypeName", - "src": "608:7:43", - "stateMutability": "nonpayable", - "typeDescriptions": { - "typeIdentifier": "t_address", - "typeString": "address" - } - }, - "visibility": "internal" - } - ], - "src": "607:16:43" - } - }, - { - "id": 35660, - "nodeType": "EventDefinition", - "src": "629:36:43", - "nodes": [], - "anonymous": false, - "eventSelector": "ecdf3a3effea5783a3c4c2140e677577666428d44ed9d474a0b3a4c9943f8440", - "name": "EnabledModule", - "nameLocation": "635:13:43", - "parameters": { - "id": 35659, - "nodeType": "ParameterList", - "parameters": [ - { - "constant": false, - "id": 35658, - "indexed": false, - "mutability": "mutable", - "name": "module", - "nameLocation": "657:6:43", - "nodeType": "VariableDeclaration", - "scope": 35660, - "src": "649:14:43", - "stateVariable": false, - "storageLocation": "default", - "typeDescriptions": { - "typeIdentifier": "t_address", - "typeString": "address" - }, - "typeName": { - "id": 35657, - "name": "address", - "nodeType": "ElementaryTypeName", - "src": "649:7:43", - "stateMutability": "nonpayable", - "typeDescriptions": { - "typeIdentifier": "t_address", - "typeString": "address" - } - }, - "visibility": "internal" - } - ], - "src": "648:16:43" - } - }, - { - "id": 35666, - "nodeType": "EventDefinition", - "src": "670:56:43", - "nodes": [], - "anonymous": false, - "eventSelector": "23428b18acfb3ea64b08dc0c1d296ea9c09702c09083ca5272e64d115b687d23", - "name": "ExecutionFailure", - "nameLocation": "676:16:43", - "parameters": { - "id": 35665, - "nodeType": "ParameterList", - "parameters": [ - { - "constant": false, - "id": 35662, - "indexed": false, - "mutability": "mutable", - "name": "txHash", - "nameLocation": "701:6:43", - "nodeType": "VariableDeclaration", - "scope": 35666, - "src": "693:14:43", - "stateVariable": false, - "storageLocation": "default", - "typeDescriptions": { - "typeIdentifier": "t_bytes32", - "typeString": "bytes32" - }, - "typeName": { - "id": 35661, - "name": "bytes32", - "nodeType": "ElementaryTypeName", - "src": "693:7:43", - "typeDescriptions": { - "typeIdentifier": "t_bytes32", - "typeString": "bytes32" - } - }, - "visibility": "internal" - }, - { - "constant": false, - "id": 35664, - "indexed": false, - "mutability": "mutable", - "name": "payment", - "nameLocation": "717:7:43", - "nodeType": "VariableDeclaration", - "scope": 35666, - "src": "709:15:43", - "stateVariable": false, - "storageLocation": "default", - "typeDescriptions": { - "typeIdentifier": "t_uint256", - "typeString": "uint256" - }, - "typeName": { - "id": 35663, - "name": "uint256", - "nodeType": "ElementaryTypeName", - "src": "709:7:43", - "typeDescriptions": { - "typeIdentifier": "t_uint256", - "typeString": "uint256" - } - }, - "visibility": "internal" - } - ], - "src": "692:33:43" - } - }, - { - "id": 35670, - "nodeType": "EventDefinition", - "src": "731:57:43", - "nodes": [], - "anonymous": false, - "eventSelector": "acd2c8702804128fdb0db2bb49f6d127dd0181c13fd45dbfe16de0930e2bd375", - "name": "ExecutionFromModuleFailure", - "nameLocation": "737:26:43", - "parameters": { - "id": 35669, - "nodeType": "ParameterList", - "parameters": [ - { - "constant": false, - "id": 35668, - "indexed": true, - "mutability": "mutable", - "name": "module", - "nameLocation": "780:6:43", - "nodeType": "VariableDeclaration", - "scope": 35670, - "src": "764:22:43", - "stateVariable": false, - "storageLocation": "default", - "typeDescriptions": { - "typeIdentifier": "t_address", - "typeString": "address" - }, - "typeName": { - "id": 35667, - "name": "address", - "nodeType": "ElementaryTypeName", - "src": "764:7:43", - "stateMutability": "nonpayable", - "typeDescriptions": { - "typeIdentifier": "t_address", - "typeString": "address" - } - }, - "visibility": "internal" - } - ], - "src": "763:24:43" - } - }, - { - "id": 35674, - "nodeType": "EventDefinition", - "src": "793:57:43", - "nodes": [], - "anonymous": false, - "eventSelector": "6895c13664aa4f67288b25d7a21d7aaa34916e355fb9b6fae0a139a9085becb8", - "name": "ExecutionFromModuleSuccess", - "nameLocation": "799:26:43", - "parameters": { - "id": 35673, - "nodeType": "ParameterList", - "parameters": [ - { - "constant": false, - "id": 35672, - "indexed": true, - "mutability": "mutable", - "name": "module", - "nameLocation": "842:6:43", - "nodeType": "VariableDeclaration", - "scope": 35674, - "src": "826:22:43", - "stateVariable": false, - "storageLocation": "default", - "typeDescriptions": { - "typeIdentifier": "t_address", - "typeString": "address" - }, - "typeName": { - "id": 35671, - "name": "address", - "nodeType": "ElementaryTypeName", - "src": "826:7:43", - "stateMutability": "nonpayable", - "typeDescriptions": { - "typeIdentifier": "t_address", - "typeString": "address" - } - }, - "visibility": "internal" - } - ], - "src": "825:24:43" - } - }, - { - "id": 35680, - "nodeType": "EventDefinition", - "src": "855:56:43", - "nodes": [], - "anonymous": false, - "eventSelector": "442e715f626346e8c54381002da614f62bee8d27386535b2521ec8540898556e", - "name": "ExecutionSuccess", - "nameLocation": "861:16:43", - "parameters": { - "id": 35679, - "nodeType": "ParameterList", - "parameters": [ - { - "constant": false, - "id": 35676, - "indexed": false, - "mutability": "mutable", - "name": "txHash", - "nameLocation": "886:6:43", - "nodeType": "VariableDeclaration", - "scope": 35680, - "src": "878:14:43", - "stateVariable": false, - "storageLocation": "default", - "typeDescriptions": { - "typeIdentifier": "t_bytes32", - "typeString": "bytes32" - }, - "typeName": { - "id": 35675, - "name": "bytes32", - "nodeType": "ElementaryTypeName", - "src": "878:7:43", - "typeDescriptions": { - "typeIdentifier": "t_bytes32", - "typeString": "bytes32" - } - }, - "visibility": "internal" - }, - { - "constant": false, - "id": 35678, - "indexed": false, - "mutability": "mutable", - "name": "payment", - "nameLocation": "902:7:43", - "nodeType": "VariableDeclaration", - "scope": 35680, - "src": "894:15:43", - "stateVariable": false, - "storageLocation": "default", - "typeDescriptions": { - "typeIdentifier": "t_uint256", - "typeString": "uint256" - }, - "typeName": { - "id": 35677, - "name": "uint256", - "nodeType": "ElementaryTypeName", - "src": "894:7:43", - "typeDescriptions": { - "typeIdentifier": "t_uint256", - "typeString": "uint256" - } - }, - "visibility": "internal" - } - ], - "src": "877:33:43" - } - }, - { - "id": 35684, - "nodeType": "EventDefinition", - "src": "916:34:43", - "nodes": [], - "anonymous": false, - "eventSelector": "f8d49fc529812e9a7c5c50e69c20f0dccc0db8fa95c98bc58cc9a4f1c1299eaf", - "name": "RemovedOwner", - "nameLocation": "922:12:43", - "parameters": { - "id": 35683, - "nodeType": "ParameterList", - "parameters": [ - { - "constant": false, - "id": 35682, - "indexed": false, - "mutability": "mutable", - "name": "owner", - "nameLocation": "943:5:43", - "nodeType": "VariableDeclaration", - "scope": 35684, - "src": "935:13:43", - "stateVariable": false, - "storageLocation": "default", - "typeDescriptions": { - "typeIdentifier": "t_address", - "typeString": "address" - }, - "typeName": { - "id": 35681, - "name": "address", - "nodeType": "ElementaryTypeName", - "src": "935:7:43", - "stateMutability": "nonpayable", - "typeDescriptions": { - "typeIdentifier": "t_address", - "typeString": "address" - } - }, - "visibility": "internal" - } - ], - "src": "934:15:43" - } - }, - { - "id": 35690, - "nodeType": "EventDefinition", - "src": "955:58:43", - "nodes": [], - "anonymous": false, - "eventSelector": "3d0ce9bfc3ed7d6862dbb28b2dea94561fe714a1b4d019aa8af39730d1ad7c3d", - "name": "SafeReceived", - "nameLocation": "961:12:43", - "parameters": { - "id": 35689, - "nodeType": "ParameterList", - "parameters": [ - { - "constant": false, - "id": 35686, - "indexed": true, - "mutability": "mutable", - "name": "sender", - "nameLocation": "990:6:43", - "nodeType": "VariableDeclaration", - "scope": 35690, - "src": "974:22:43", - "stateVariable": false, - "storageLocation": "default", - "typeDescriptions": { - "typeIdentifier": "t_address", - "typeString": "address" - }, - "typeName": { - "id": 35685, - "name": "address", - "nodeType": "ElementaryTypeName", - "src": "974:7:43", - "stateMutability": "nonpayable", - "typeDescriptions": { - "typeIdentifier": "t_address", - "typeString": "address" - } - }, - "visibility": "internal" - }, - { - "constant": false, - "id": 35688, - "indexed": false, - "mutability": "mutable", - "name": "value", - "nameLocation": "1006:5:43", - "nodeType": "VariableDeclaration", - "scope": 35690, - "src": "998:13:43", - "stateVariable": false, - "storageLocation": "default", - "typeDescriptions": { - "typeIdentifier": "t_uint256", - "typeString": "uint256" - }, - "typeName": { - "id": 35687, - "name": "uint256", - "nodeType": "ElementaryTypeName", - "src": "998:7:43", - "typeDescriptions": { - "typeIdentifier": "t_uint256", - "typeString": "uint256" - } - }, - "visibility": "internal" - } - ], - "src": "973:39:43" - } - }, - { - "id": 35703, - "nodeType": "EventDefinition", - "src": "1018:140:43", - "nodes": [], - "anonymous": false, - "eventSelector": "141df868a6331af528e38c83b7aa03edc19be66e37ae67f9285bf4f8e3c6a1a8", - "name": "SafeSetup", - "nameLocation": "1024:9:43", - "parameters": { - "id": 35702, - "nodeType": "ParameterList", - "parameters": [ - { - "constant": false, - "id": 35692, - "indexed": true, - "mutability": "mutable", - "name": "initiator", - "nameLocation": "1059:9:43", - "nodeType": "VariableDeclaration", - "scope": 35703, - "src": "1043:25:43", - "stateVariable": false, - "storageLocation": "default", - "typeDescriptions": { - "typeIdentifier": "t_address", - "typeString": "address" - }, - "typeName": { - "id": 35691, - "name": "address", - "nodeType": "ElementaryTypeName", - "src": "1043:7:43", - "stateMutability": "nonpayable", - "typeDescriptions": { - "typeIdentifier": "t_address", - "typeString": "address" - } - }, - "visibility": "internal" - }, - { - "constant": false, - "id": 35695, - "indexed": false, - "mutability": "mutable", - "name": "owners", - "nameLocation": "1080:6:43", - "nodeType": "VariableDeclaration", - "scope": 35703, - "src": "1070:16:43", - "stateVariable": false, - "storageLocation": "default", - "typeDescriptions": { - "typeIdentifier": "t_array$_t_address_$dyn_memory_ptr", - "typeString": "address[]" - }, - "typeName": { - "baseType": { - "id": 35693, - "name": "address", - "nodeType": "ElementaryTypeName", - "src": "1070:7:43", - "stateMutability": "nonpayable", - "typeDescriptions": { - "typeIdentifier": "t_address", - "typeString": "address" - } - }, - "id": 35694, - "nodeType": "ArrayTypeName", - "src": "1070:9:43", - "typeDescriptions": { - "typeIdentifier": "t_array$_t_address_$dyn_storage_ptr", - "typeString": "address[]" - } - }, - "visibility": "internal" - }, - { - "constant": false, - "id": 35697, - "indexed": false, - "mutability": "mutable", - "name": "threshold", - "nameLocation": "1096:9:43", - "nodeType": "VariableDeclaration", - "scope": 35703, - "src": "1088:17:43", - "stateVariable": false, - "storageLocation": "default", - "typeDescriptions": { - "typeIdentifier": "t_uint256", - "typeString": "uint256" - }, - "typeName": { - "id": 35696, - "name": "uint256", - "nodeType": "ElementaryTypeName", - "src": "1088:7:43", - "typeDescriptions": { - "typeIdentifier": "t_uint256", - "typeString": "uint256" - } - }, - "visibility": "internal" - }, - { - "constant": false, - "id": 35699, - "indexed": false, - "mutability": "mutable", - "name": "initializer", - "nameLocation": "1115:11:43", - "nodeType": "VariableDeclaration", - "scope": 35703, - "src": "1107:19:43", - "stateVariable": false, - "storageLocation": "default", - "typeDescriptions": { - "typeIdentifier": "t_address", - "typeString": "address" - }, - "typeName": { - "id": 35698, - "name": "address", - "nodeType": "ElementaryTypeName", - "src": "1107:7:43", - "stateMutability": "nonpayable", - "typeDescriptions": { - "typeIdentifier": "t_address", - "typeString": "address" - } - }, - "visibility": "internal" - }, - { - "constant": false, - "id": 35701, - "indexed": false, - "mutability": "mutable", - "name": "fallbackHandler", - "nameLocation": "1136:15:43", - "nodeType": "VariableDeclaration", - "scope": 35703, - "src": "1128:23:43", - "stateVariable": false, - "storageLocation": "default", - "typeDescriptions": { - "typeIdentifier": "t_address", - "typeString": "address" - }, - "typeName": { - "id": 35700, - "name": "address", - "nodeType": "ElementaryTypeName", - "src": "1128:7:43", - "stateMutability": "nonpayable", - "typeDescriptions": { - "typeIdentifier": "t_address", - "typeString": "address" - } - }, - "visibility": "internal" - } - ], - "src": "1033:124:43" - } - }, - { - "id": 35707, - "nodeType": "EventDefinition", - "src": "1163:39:43", - "nodes": [], - "anonymous": false, - "eventSelector": "e7f4675038f4f6034dfcbbb24c4dc08e4ebf10eb9d257d3d02c0f38d122ac6e4", - "name": "SignMsg", - "nameLocation": "1169:7:43", - "parameters": { - "id": 35706, - "nodeType": "ParameterList", - "parameters": [ - { - "constant": false, - "id": 35705, - "indexed": true, - "mutability": "mutable", - "name": "msgHash", - "nameLocation": "1193:7:43", - "nodeType": "VariableDeclaration", - "scope": 35707, - "src": "1177:23:43", - "stateVariable": false, - "storageLocation": "default", - "typeDescriptions": { - "typeIdentifier": "t_bytes32", - "typeString": "bytes32" - }, - "typeName": { - "id": 35704, - "name": "bytes32", - "nodeType": "ElementaryTypeName", - "src": "1177:7:43", - "typeDescriptions": { - "typeIdentifier": "t_bytes32", - "typeString": "bytes32" - } - }, - "visibility": "internal" - } - ], - "src": "1176:25:43" - } - }, - { - "id": 35712, - "nodeType": "FunctionDefinition", - "src": "1208:57:43", - "nodes": [], - "functionSelector": "ffa1ad74", - "implemented": false, - "kind": "function", - "modifiers": [], - "name": "VERSION", - "nameLocation": "1217:7:43", - "parameters": { - "id": 35708, - "nodeType": "ParameterList", - "parameters": [], - "src": "1224:2:43" - }, - "returnParameters": { - "id": 35711, - "nodeType": "ParameterList", - "parameters": [ - { - "constant": false, - "id": 35710, - "mutability": "mutable", - "name": "", - "nameLocation": "-1:-1:-1", - "nodeType": "VariableDeclaration", - "scope": 35712, - "src": "1250:13:43", - "stateVariable": false, - "storageLocation": "memory", - "typeDescriptions": { - "typeIdentifier": "t_string_memory_ptr", - "typeString": "string" - }, - "typeName": { - "id": 35709, - "name": "string", - "nodeType": "ElementaryTypeName", - "src": "1250:6:43", - "typeDescriptions": { - "typeIdentifier": "t_string_storage_ptr", - "typeString": "string" - } - }, - "visibility": "internal" - } - ], - "src": "1249:15:43" - }, - "scope": 36016, - "stateMutability": "view", - "virtual": false, - "visibility": "external" - }, - { - "id": 35719, - "nodeType": "FunctionDefinition", - "src": "1270:75:43", - "nodes": [], - "functionSelector": "0d582f13", - "implemented": false, - "kind": "function", - "modifiers": [], - "name": "addOwnerWithThreshold", - "nameLocation": "1279:21:43", - "parameters": { - "id": 35717, - "nodeType": "ParameterList", - "parameters": [ - { - "constant": false, - "id": 35714, - "mutability": "mutable", - "name": "owner", - "nameLocation": "1309:5:43", - "nodeType": "VariableDeclaration", - "scope": 35719, - "src": "1301:13:43", - "stateVariable": false, - "storageLocation": "default", - "typeDescriptions": { - "typeIdentifier": "t_address", - "typeString": "address" - }, - "typeName": { - "id": 35713, - "name": "address", - "nodeType": "ElementaryTypeName", - "src": "1301:7:43", - "stateMutability": "nonpayable", - "typeDescriptions": { - "typeIdentifier": "t_address", - "typeString": "address" - } - }, - "visibility": "internal" - }, - { - "constant": false, - "id": 35716, - "mutability": "mutable", - "name": "_threshold", - "nameLocation": "1324:10:43", - "nodeType": "VariableDeclaration", - "scope": 35719, - "src": "1316:18:43", - "stateVariable": false, - "storageLocation": "default", - "typeDescriptions": { - "typeIdentifier": "t_uint256", - "typeString": "uint256" - }, - "typeName": { - "id": 35715, - "name": "uint256", - "nodeType": "ElementaryTypeName", - "src": "1316:7:43", - "typeDescriptions": { - "typeIdentifier": "t_uint256", - "typeString": "uint256" - } - }, - "visibility": "internal" - } - ], - "src": "1300:35:43" - }, - "returnParameters": { - "id": 35718, - "nodeType": "ParameterList", - "parameters": [], - "src": "1344:0:43" - }, - "scope": 36016, - "stateMutability": "nonpayable", - "virtual": false, - "visibility": "external" - }, - { - "id": 35724, - "nodeType": "FunctionDefinition", - "src": "1350:53:43", - "nodes": [], - "functionSelector": "d4d9bdcd", - "implemented": false, - "kind": "function", - "modifiers": [], - "name": "approveHash", - "nameLocation": "1359:11:43", - "parameters": { - "id": 35722, - "nodeType": "ParameterList", - "parameters": [ - { - "constant": false, - "id": 35721, - "mutability": "mutable", - "name": "hashToApprove", - "nameLocation": "1379:13:43", - "nodeType": "VariableDeclaration", - "scope": 35724, - "src": "1371:21:43", - "stateVariable": false, - "storageLocation": "default", - "typeDescriptions": { - "typeIdentifier": "t_bytes32", - "typeString": "bytes32" - }, - "typeName": { - "id": 35720, - "name": "bytes32", - "nodeType": "ElementaryTypeName", - "src": "1371:7:43", - "typeDescriptions": { - "typeIdentifier": "t_bytes32", - "typeString": "bytes32" - } - }, - "visibility": "internal" - } - ], - "src": "1370:23:43" - }, - "returnParameters": { - "id": 35723, - "nodeType": "ParameterList", - "parameters": [], - "src": "1402:0:43" - }, - "scope": 36016, - "stateMutability": "nonpayable", - "virtual": false, - "visibility": "external" - }, - { - "id": 35733, - "nodeType": "FunctionDefinition", - "src": "1408:74:43", - "nodes": [], - "functionSelector": "7d832974", - "implemented": false, - "kind": "function", - "modifiers": [], - "name": "approvedHashes", - "nameLocation": "1417:14:43", - "parameters": { - "id": 35729, - "nodeType": "ParameterList", - "parameters": [ - { - "constant": false, - "id": 35726, - "mutability": "mutable", - "name": "", - "nameLocation": "-1:-1:-1", - "nodeType": "VariableDeclaration", - "scope": 35733, - "src": "1432:7:43", - "stateVariable": false, - "storageLocation": "default", - "typeDescriptions": { - "typeIdentifier": "t_address", - "typeString": "address" - }, - "typeName": { - "id": 35725, - "name": "address", - "nodeType": "ElementaryTypeName", - "src": "1432:7:43", - "stateMutability": "nonpayable", - "typeDescriptions": { - "typeIdentifier": "t_address", - "typeString": "address" - } - }, - "visibility": "internal" - }, - { - "constant": false, - "id": 35728, - "mutability": "mutable", - "name": "", - "nameLocation": "-1:-1:-1", - "nodeType": "VariableDeclaration", - "scope": 35733, - "src": "1441:7:43", - "stateVariable": false, - "storageLocation": "default", - "typeDescriptions": { - "typeIdentifier": "t_bytes32", - "typeString": "bytes32" - }, - "typeName": { - "id": 35727, - "name": "bytes32", - "nodeType": "ElementaryTypeName", - "src": "1441:7:43", - "typeDescriptions": { - "typeIdentifier": "t_bytes32", - "typeString": "bytes32" - } - }, - "visibility": "internal" - } - ], - "src": "1431:18:43" - }, - "returnParameters": { - "id": 35732, - "nodeType": "ParameterList", - "parameters": [ - { - "constant": false, - "id": 35731, - "mutability": "mutable", - "name": "", - "nameLocation": "-1:-1:-1", - "nodeType": "VariableDeclaration", - "scope": 35733, - "src": "1473:7:43", - "stateVariable": false, - "storageLocation": "default", - "typeDescriptions": { - "typeIdentifier": "t_uint256", - "typeString": "uint256" - }, - "typeName": { - "id": 35730, - "name": "uint256", - "nodeType": "ElementaryTypeName", - "src": "1473:7:43", - "typeDescriptions": { - "typeIdentifier": "t_uint256", - "typeString": "uint256" - } - }, - "visibility": "internal" - } - ], - "src": "1472:9:43" - }, - "scope": 36016, - "stateMutability": "view", - "virtual": false, - "visibility": "external" - }, - { - "id": 35738, - "nodeType": "FunctionDefinition", - "src": "1487:54:43", - "nodes": [], - "functionSelector": "694e80c3", - "implemented": false, - "kind": "function", - "modifiers": [], - "name": "changeThreshold", - "nameLocation": "1496:15:43", - "parameters": { - "id": 35736, - "nodeType": "ParameterList", - "parameters": [ - { - "constant": false, - "id": 35735, - "mutability": "mutable", - "name": "_threshold", - "nameLocation": "1520:10:43", - "nodeType": "VariableDeclaration", - "scope": 35738, - "src": "1512:18:43", - "stateVariable": false, - "storageLocation": "default", - "typeDescriptions": { - "typeIdentifier": "t_uint256", - "typeString": "uint256" - }, - "typeName": { - "id": 35734, - "name": "uint256", - "nodeType": "ElementaryTypeName", - "src": "1512:7:43", - "typeDescriptions": { - "typeIdentifier": "t_uint256", - "typeString": "uint256" - } - }, - "visibility": "internal" - } - ], - "src": "1511:20:43" - }, - "returnParameters": { - "id": 35737, - "nodeType": "ParameterList", - "parameters": [], - "src": "1540:0:43" - }, - "scope": 36016, - "stateMutability": "nonpayable", - "virtual": false, - "visibility": "external" - }, - { - "id": 35749, - "nodeType": "FunctionDefinition", - "src": "1546:184:43", - "nodes": [], - "functionSelector": "12fb68e0", - "implemented": false, - "kind": "function", - "modifiers": [], - "name": "checkNSignatures", - "nameLocation": "1555:16:43", - "parameters": { - "id": 35747, - "nodeType": "ParameterList", - "parameters": [ - { - "constant": false, - "id": 35740, - "mutability": "mutable", - "name": "dataHash", - "nameLocation": "1589:8:43", - "nodeType": "VariableDeclaration", - "scope": 35749, - "src": "1581:16:43", - "stateVariable": false, - "storageLocation": "default", - "typeDescriptions": { - "typeIdentifier": "t_bytes32", - "typeString": "bytes32" - }, - "typeName": { - "id": 35739, - "name": "bytes32", - "nodeType": "ElementaryTypeName", - "src": "1581:7:43", - "typeDescriptions": { - "typeIdentifier": "t_bytes32", - "typeString": "bytes32" - } - }, - "visibility": "internal" - }, - { - "constant": false, - "id": 35742, - "mutability": "mutable", - "name": "data", - "nameLocation": "1620:4:43", - "nodeType": "VariableDeclaration", - "scope": 35749, - "src": "1607:17:43", - "stateVariable": false, - "storageLocation": "memory", - "typeDescriptions": { - "typeIdentifier": "t_bytes_memory_ptr", - "typeString": "bytes" - }, - "typeName": { - "id": 35741, - "name": "bytes", - "nodeType": "ElementaryTypeName", - "src": "1607:5:43", - "typeDescriptions": { - "typeIdentifier": "t_bytes_storage_ptr", - "typeString": "bytes" - } - }, - "visibility": "internal" - }, - { - "constant": false, - "id": 35744, - "mutability": "mutable", - "name": "signatures", - "nameLocation": "1647:10:43", - "nodeType": "VariableDeclaration", - "scope": 35749, - "src": "1634:23:43", - "stateVariable": false, - "storageLocation": "memory", - "typeDescriptions": { - "typeIdentifier": "t_bytes_memory_ptr", - "typeString": "bytes" - }, - "typeName": { - "id": 35743, - "name": "bytes", - "nodeType": "ElementaryTypeName", - "src": "1634:5:43", - "typeDescriptions": { - "typeIdentifier": "t_bytes_storage_ptr", - "typeString": "bytes" - } - }, - "visibility": "internal" - }, - { - "constant": false, - "id": 35746, - "mutability": "mutable", - "name": "requiredSignatures", - "nameLocation": "1675:18:43", - "nodeType": "VariableDeclaration", - "scope": 35749, - "src": "1667:26:43", - "stateVariable": false, - "storageLocation": "default", - "typeDescriptions": { - "typeIdentifier": "t_uint256", - "typeString": "uint256" - }, - "typeName": { - "id": 35745, - "name": "uint256", - "nodeType": "ElementaryTypeName", - "src": "1667:7:43", - "typeDescriptions": { - "typeIdentifier": "t_uint256", - "typeString": "uint256" - } - }, - "visibility": "internal" - } - ], - "src": "1571:128:43" - }, - "returnParameters": { - "id": 35748, - "nodeType": "ParameterList", - "parameters": [], - "src": "1729:0:43" - }, - "scope": 36016, - "stateMutability": "view", - "virtual": false, - "visibility": "external" - }, - { - "id": 35758, - "nodeType": "FunctionDefinition", - "src": "1735:101:43", - "nodes": [], - "functionSelector": "934f3a11", - "implemented": false, - "kind": "function", - "modifiers": [], - "name": "checkSignatures", - "nameLocation": "1744:15:43", - "parameters": { - "id": 35756, - "nodeType": "ParameterList", - "parameters": [ - { - "constant": false, - "id": 35751, - "mutability": "mutable", - "name": "dataHash", - "nameLocation": "1768:8:43", - "nodeType": "VariableDeclaration", - "scope": 35758, - "src": "1760:16:43", - "stateVariable": false, - "storageLocation": "default", - "typeDescriptions": { - "typeIdentifier": "t_bytes32", - "typeString": "bytes32" - }, - "typeName": { - "id": 35750, - "name": "bytes32", - "nodeType": "ElementaryTypeName", - "src": "1760:7:43", - "typeDescriptions": { - "typeIdentifier": "t_bytes32", - "typeString": "bytes32" - } - }, - "visibility": "internal" - }, - { - "constant": false, - "id": 35753, - "mutability": "mutable", - "name": "data", - "nameLocation": "1791:4:43", - "nodeType": "VariableDeclaration", - "scope": 35758, - "src": "1778:17:43", - "stateVariable": false, - "storageLocation": "memory", - "typeDescriptions": { - "typeIdentifier": "t_bytes_memory_ptr", - "typeString": "bytes" - }, - "typeName": { - "id": 35752, - "name": "bytes", - "nodeType": "ElementaryTypeName", - "src": "1778:5:43", - "typeDescriptions": { - "typeIdentifier": "t_bytes_storage_ptr", - "typeString": "bytes" - } - }, - "visibility": "internal" - }, - { - "constant": false, - "id": 35755, - "mutability": "mutable", - "name": "signatures", - "nameLocation": "1810:10:43", - "nodeType": "VariableDeclaration", - "scope": 35758, - "src": "1797:23:43", - "stateVariable": false, - "storageLocation": "memory", - "typeDescriptions": { - "typeIdentifier": "t_bytes_memory_ptr", - "typeString": "bytes" - }, - "typeName": { - "id": 35754, - "name": "bytes", - "nodeType": "ElementaryTypeName", - "src": "1797:5:43", - "typeDescriptions": { - "typeIdentifier": "t_bytes_storage_ptr", - "typeString": "bytes" - } - }, - "visibility": "internal" - } - ], - "src": "1759:62:43" - }, - "returnParameters": { - "id": 35757, - "nodeType": "ParameterList", - "parameters": [], - "src": "1835:0:43" - }, - "scope": 36016, - "stateMutability": "view", - "virtual": false, - "visibility": "external" - }, - { - "id": 35765, - "nodeType": "FunctionDefinition", - "src": "1841:68:43", - "nodes": [], - "functionSelector": "e009cfde", - "implemented": false, - "kind": "function", - "modifiers": [], - "name": "disableModule", - "nameLocation": "1850:13:43", - "parameters": { - "id": 35763, - "nodeType": "ParameterList", - "parameters": [ - { - "constant": false, - "id": 35760, - "mutability": "mutable", - "name": "prevModule", - "nameLocation": "1872:10:43", - "nodeType": "VariableDeclaration", - "scope": 35765, - "src": "1864:18:43", - "stateVariable": false, - "storageLocation": "default", - "typeDescriptions": { - "typeIdentifier": "t_address", - "typeString": "address" - }, - "typeName": { - "id": 35759, - "name": "address", - "nodeType": "ElementaryTypeName", - "src": "1864:7:43", - "stateMutability": "nonpayable", - "typeDescriptions": { - "typeIdentifier": "t_address", - "typeString": "address" - } - }, - "visibility": "internal" - }, - { - "constant": false, - "id": 35762, - "mutability": "mutable", - "name": "module", - "nameLocation": "1892:6:43", - "nodeType": "VariableDeclaration", - "scope": 35765, - "src": "1884:14:43", - "stateVariable": false, - "storageLocation": "default", - "typeDescriptions": { - "typeIdentifier": "t_address", - "typeString": "address" - }, - "typeName": { - "id": 35761, - "name": "address", - "nodeType": "ElementaryTypeName", - "src": "1884:7:43", - "stateMutability": "nonpayable", - "typeDescriptions": { - "typeIdentifier": "t_address", - "typeString": "address" - } - }, - "visibility": "internal" - } - ], - "src": "1863:36:43" - }, - "returnParameters": { - "id": 35764, - "nodeType": "ParameterList", - "parameters": [], - "src": "1908:0:43" - }, - "scope": 36016, - "stateMutability": "nonpayable", - "virtual": false, - "visibility": "external" - }, - { - "id": 35770, - "nodeType": "FunctionDefinition", - "src": "1914:59:43", - "nodes": [], - "functionSelector": "f698da25", - "implemented": false, - "kind": "function", - "modifiers": [], - "name": "domainSeparator", - "nameLocation": "1923:15:43", - "parameters": { - "id": 35766, - "nodeType": "ParameterList", - "parameters": [], - "src": "1938:2:43" - }, - "returnParameters": { - "id": 35769, - "nodeType": "ParameterList", - "parameters": [ - { - "constant": false, - "id": 35768, - "mutability": "mutable", - "name": "", - "nameLocation": "-1:-1:-1", - "nodeType": "VariableDeclaration", - "scope": 35770, - "src": "1964:7:43", - "stateVariable": false, - "storageLocation": "default", - "typeDescriptions": { - "typeIdentifier": "t_bytes32", - "typeString": "bytes32" - }, - "typeName": { - "id": 35767, - "name": "bytes32", - "nodeType": "ElementaryTypeName", - "src": "1964:7:43", - "typeDescriptions": { - "typeIdentifier": "t_bytes32", - "typeString": "bytes32" - } - }, - "visibility": "internal" - } - ], - "src": "1963:9:43" - }, - "scope": 36016, - "stateMutability": "view", - "virtual": false, - "visibility": "external" - }, - { - "id": 35775, - "nodeType": "FunctionDefinition", - "src": "1978:47:43", - "nodes": [], - "functionSelector": "610b5925", - "implemented": false, - "kind": "function", - "modifiers": [], - "name": "enableModule", - "nameLocation": "1987:12:43", - "parameters": { - "id": 35773, - "nodeType": "ParameterList", - "parameters": [ - { - "constant": false, - "id": 35772, - "mutability": "mutable", - "name": "module", - "nameLocation": "2008:6:43", - "nodeType": "VariableDeclaration", - "scope": 35775, - "src": "2000:14:43", - "stateVariable": false, - "storageLocation": "default", - "typeDescriptions": { - "typeIdentifier": "t_address", - "typeString": "address" - }, - "typeName": { - "id": 35771, - "name": "address", - "nodeType": "ElementaryTypeName", - "src": "2000:7:43", - "stateMutability": "nonpayable", - "typeDescriptions": { - "typeIdentifier": "t_address", - "typeString": "address" - } - }, - "visibility": "internal" - } - ], - "src": "1999:16:43" - }, - "returnParameters": { - "id": 35774, - "nodeType": "ParameterList", - "parameters": [], - "src": "2024:0:43" - }, - "scope": 36016, - "stateMutability": "nonpayable", - "virtual": false, - "visibility": "external" - }, - { - "id": 35801, - "nodeType": "FunctionDefinition", - "src": "2030:362:43", - "nodes": [], - "functionSelector": "e86637db", - "implemented": false, - "kind": "function", - "modifiers": [], - "name": "encodeTransactionData", - "nameLocation": "2039:21:43", - "parameters": { - "id": 35797, - "nodeType": "ParameterList", - "parameters": [ - { - "constant": false, - "id": 35777, - "mutability": "mutable", - "name": "to", - "nameLocation": "2078:2:43", - "nodeType": "VariableDeclaration", - "scope": 35801, - "src": "2070:10:43", - "stateVariable": false, - "storageLocation": "default", - "typeDescriptions": { - "typeIdentifier": "t_address", - "typeString": "address" - }, - "typeName": { - "id": 35776, - "name": "address", - "nodeType": "ElementaryTypeName", - "src": "2070:7:43", - "stateMutability": "nonpayable", - "typeDescriptions": { - "typeIdentifier": "t_address", - "typeString": "address" - } - }, - "visibility": "internal" - }, - { - "constant": false, - "id": 35779, - "mutability": "mutable", - "name": "value", - "nameLocation": "2098:5:43", - "nodeType": "VariableDeclaration", - "scope": 35801, - "src": "2090:13:43", - "stateVariable": false, - "storageLocation": "default", - "typeDescriptions": { - "typeIdentifier": "t_uint256", - "typeString": "uint256" - }, - "typeName": { - "id": 35778, - "name": "uint256", - "nodeType": "ElementaryTypeName", - "src": "2090:7:43", - "typeDescriptions": { - "typeIdentifier": "t_uint256", - "typeString": "uint256" - } - }, - "visibility": "internal" - }, - { - "constant": false, - "id": 35781, - "mutability": "mutable", - "name": "data", - "nameLocation": "2126:4:43", - "nodeType": "VariableDeclaration", - "scope": 35801, - "src": "2113:17:43", - "stateVariable": false, - "storageLocation": "memory", - "typeDescriptions": { - "typeIdentifier": "t_bytes_memory_ptr", - "typeString": "bytes" - }, - "typeName": { - "id": 35780, - "name": "bytes", - "nodeType": "ElementaryTypeName", - "src": "2113:5:43", - "typeDescriptions": { - "typeIdentifier": "t_bytes_storage_ptr", - "typeString": "bytes" - } - }, - "visibility": "internal" - }, - { - "constant": false, - "id": 35784, - "mutability": "mutable", - "name": "operation", - "nameLocation": "2155:9:43", - "nodeType": "VariableDeclaration", - "scope": 35801, - "src": "2140:24:43", - "stateVariable": false, - "storageLocation": "default", - "typeDescriptions": { - "typeIdentifier": "t_enum$_Operation_$35628", - "typeString": "enum Enum.Operation" - }, - "typeName": { - "id": 35783, - "nodeType": "UserDefinedTypeName", - "pathNode": { - "id": 35782, - "name": "Enum.Operation", - "nameLocations": [ - "2140:4:43", - "2145:9:43" - ], - "nodeType": "IdentifierPath", - "referencedDeclaration": 35628, - "src": "2140:14:43" - }, - "referencedDeclaration": 35628, - "src": "2140:14:43", - "typeDescriptions": { - "typeIdentifier": "t_enum$_Operation_$35628", - "typeString": "enum Enum.Operation" - } - }, - "visibility": "internal" - }, - { - "constant": false, - "id": 35786, - "mutability": "mutable", - "name": "safeTxGas", - "nameLocation": "2182:9:43", - "nodeType": "VariableDeclaration", - "scope": 35801, - "src": "2174:17:43", - "stateVariable": false, - "storageLocation": "default", - "typeDescriptions": { - "typeIdentifier": "t_uint256", - "typeString": "uint256" - }, - "typeName": { - "id": 35785, - "name": "uint256", - "nodeType": "ElementaryTypeName", - "src": "2174:7:43", - "typeDescriptions": { - "typeIdentifier": "t_uint256", - "typeString": "uint256" - } - }, - "visibility": "internal" - }, - { - "constant": false, - "id": 35788, - "mutability": "mutable", - "name": "baseGas", - "nameLocation": "2209:7:43", - "nodeType": "VariableDeclaration", - "scope": 35801, - "src": "2201:15:43", - "stateVariable": false, - "storageLocation": "default", - "typeDescriptions": { - "typeIdentifier": "t_uint256", - "typeString": "uint256" - }, - "typeName": { - "id": 35787, - "name": "uint256", - "nodeType": "ElementaryTypeName", - "src": "2201:7:43", - "typeDescriptions": { - "typeIdentifier": "t_uint256", - "typeString": "uint256" - } - }, - "visibility": "internal" - }, - { - "constant": false, - "id": 35790, - "mutability": "mutable", - "name": "gasPrice", - "nameLocation": "2234:8:43", - "nodeType": "VariableDeclaration", - "scope": 35801, - "src": "2226:16:43", - "stateVariable": false, - "storageLocation": "default", - "typeDescriptions": { - "typeIdentifier": "t_uint256", - "typeString": "uint256" - }, - "typeName": { - "id": 35789, - "name": "uint256", - "nodeType": "ElementaryTypeName", - "src": "2226:7:43", - "typeDescriptions": { - "typeIdentifier": "t_uint256", - "typeString": "uint256" - } - }, - "visibility": "internal" - }, - { - "constant": false, - "id": 35792, - "mutability": "mutable", - "name": "gasToken", - "nameLocation": "2260:8:43", - "nodeType": "VariableDeclaration", - "scope": 35801, - "src": "2252:16:43", - "stateVariable": false, - "storageLocation": "default", - "typeDescriptions": { - "typeIdentifier": "t_address", - "typeString": "address" - }, - "typeName": { - "id": 35791, - "name": "address", - "nodeType": "ElementaryTypeName", - "src": "2252:7:43", - "stateMutability": "nonpayable", - "typeDescriptions": { - "typeIdentifier": "t_address", - "typeString": "address" - } - }, - "visibility": "internal" - }, - { - "constant": false, - "id": 35794, - "mutability": "mutable", - "name": "refundReceiver", - "nameLocation": "2286:14:43", - "nodeType": "VariableDeclaration", - "scope": 35801, - "src": "2278:22:43", - "stateVariable": false, - "storageLocation": "default", - "typeDescriptions": { - "typeIdentifier": "t_address", - "typeString": "address" - }, - "typeName": { - "id": 35793, - "name": "address", - "nodeType": "ElementaryTypeName", - "src": "2278:7:43", - "stateMutability": "nonpayable", - "typeDescriptions": { - "typeIdentifier": "t_address", - "typeString": "address" - } - }, - "visibility": "internal" - }, - { - "constant": false, - "id": 35796, - "mutability": "mutable", - "name": "_nonce", - "nameLocation": "2318:6:43", - "nodeType": "VariableDeclaration", - "scope": 35801, - "src": "2310:14:43", - "stateVariable": false, - "storageLocation": "default", - "typeDescriptions": { - "typeIdentifier": "t_uint256", - "typeString": "uint256" - }, - "typeName": { - "id": 35795, - "name": "uint256", - "nodeType": "ElementaryTypeName", - "src": "2310:7:43", - "typeDescriptions": { - "typeIdentifier": "t_uint256", - "typeString": "uint256" - } - }, - "visibility": "internal" - } - ], - "src": "2060:270:43" - }, - "returnParameters": { - "id": 35800, - "nodeType": "ParameterList", - "parameters": [ - { - "constant": false, - "id": 35799, - "mutability": "mutable", - "name": "", - "nameLocation": "-1:-1:-1", - "nodeType": "VariableDeclaration", - "scope": 35801, - "src": "2378:12:43", - "stateVariable": false, - "storageLocation": "memory", - "typeDescriptions": { - "typeIdentifier": "t_bytes_memory_ptr", - "typeString": "bytes" - }, - "typeName": { - "id": 35798, - "name": "bytes", - "nodeType": "ElementaryTypeName", - "src": "2378:5:43", - "typeDescriptions": { - "typeIdentifier": "t_bytes_storage_ptr", - "typeString": "bytes" - } - }, - "visibility": "internal" - } - ], - "src": "2377:14:43" - }, - "scope": 36016, - "stateMutability": "view", - "virtual": false, - "visibility": "external" - }, - { - "id": 35827, - "nodeType": "FunctionDefinition", - "src": "2397:368:43", - "nodes": [], - "functionSelector": "6a761202", - "implemented": false, - "kind": "function", - "modifiers": [], - "name": "execTransaction", - "nameLocation": "2406:15:43", - "parameters": { - "id": 35823, - "nodeType": "ParameterList", - "parameters": [ - { - "constant": false, - "id": 35803, - "mutability": "mutable", - "name": "to", - "nameLocation": "2439:2:43", - "nodeType": "VariableDeclaration", - "scope": 35827, - "src": "2431:10:43", - "stateVariable": false, - "storageLocation": "default", - "typeDescriptions": { - "typeIdentifier": "t_address", - "typeString": "address" - }, - "typeName": { - "id": 35802, - "name": "address", - "nodeType": "ElementaryTypeName", - "src": "2431:7:43", - "stateMutability": "nonpayable", - "typeDescriptions": { - "typeIdentifier": "t_address", - "typeString": "address" - } - }, - "visibility": "internal" - }, - { - "constant": false, - "id": 35805, - "mutability": "mutable", - "name": "value", - "nameLocation": "2459:5:43", - "nodeType": "VariableDeclaration", - "scope": 35827, - "src": "2451:13:43", - "stateVariable": false, - "storageLocation": "default", - "typeDescriptions": { - "typeIdentifier": "t_uint256", - "typeString": "uint256" - }, - "typeName": { - "id": 35804, - "name": "uint256", - "nodeType": "ElementaryTypeName", - "src": "2451:7:43", - "typeDescriptions": { - "typeIdentifier": "t_uint256", - "typeString": "uint256" - } - }, - "visibility": "internal" - }, - { - "constant": false, - "id": 35807, - "mutability": "mutable", - "name": "data", - "nameLocation": "2487:4:43", - "nodeType": "VariableDeclaration", - "scope": 35827, - "src": "2474:17:43", - "stateVariable": false, - "storageLocation": "memory", - "typeDescriptions": { - "typeIdentifier": "t_bytes_memory_ptr", - "typeString": "bytes" - }, - "typeName": { - "id": 35806, - "name": "bytes", - "nodeType": "ElementaryTypeName", - "src": "2474:5:43", - "typeDescriptions": { - "typeIdentifier": "t_bytes_storage_ptr", - "typeString": "bytes" - } - }, - "visibility": "internal" - }, - { - "constant": false, - "id": 35810, - "mutability": "mutable", - "name": "operation", - "nameLocation": "2516:9:43", - "nodeType": "VariableDeclaration", - "scope": 35827, - "src": "2501:24:43", - "stateVariable": false, - "storageLocation": "default", - "typeDescriptions": { - "typeIdentifier": "t_enum$_Operation_$35628", - "typeString": "enum Enum.Operation" - }, - "typeName": { - "id": 35809, - "nodeType": "UserDefinedTypeName", - "pathNode": { - "id": 35808, - "name": "Enum.Operation", - "nameLocations": [ - "2501:4:43", - "2506:9:43" - ], - "nodeType": "IdentifierPath", - "referencedDeclaration": 35628, - "src": "2501:14:43" - }, - "referencedDeclaration": 35628, - "src": "2501:14:43", - "typeDescriptions": { - "typeIdentifier": "t_enum$_Operation_$35628", - "typeString": "enum Enum.Operation" - } - }, - "visibility": "internal" - }, - { - "constant": false, - "id": 35812, - "mutability": "mutable", - "name": "safeTxGas", - "nameLocation": "2543:9:43", - "nodeType": "VariableDeclaration", - "scope": 35827, - "src": "2535:17:43", - "stateVariable": false, - "storageLocation": "default", - "typeDescriptions": { - "typeIdentifier": "t_uint256", - "typeString": "uint256" - }, - "typeName": { - "id": 35811, - "name": "uint256", - "nodeType": "ElementaryTypeName", - "src": "2535:7:43", - "typeDescriptions": { - "typeIdentifier": "t_uint256", - "typeString": "uint256" - } - }, - "visibility": "internal" - }, - { - "constant": false, - "id": 35814, - "mutability": "mutable", - "name": "baseGas", - "nameLocation": "2570:7:43", - "nodeType": "VariableDeclaration", - "scope": 35827, - "src": "2562:15:43", - "stateVariable": false, - "storageLocation": "default", - "typeDescriptions": { - "typeIdentifier": "t_uint256", - "typeString": "uint256" - }, - "typeName": { - "id": 35813, - "name": "uint256", - "nodeType": "ElementaryTypeName", - "src": "2562:7:43", - "typeDescriptions": { - "typeIdentifier": "t_uint256", - "typeString": "uint256" - } - }, - "visibility": "internal" - }, - { - "constant": false, - "id": 35816, - "mutability": "mutable", - "name": "gasPrice", - "nameLocation": "2595:8:43", - "nodeType": "VariableDeclaration", - "scope": 35827, - "src": "2587:16:43", - "stateVariable": false, - "storageLocation": "default", - "typeDescriptions": { - "typeIdentifier": "t_uint256", - "typeString": "uint256" - }, - "typeName": { - "id": 35815, - "name": "uint256", - "nodeType": "ElementaryTypeName", - "src": "2587:7:43", - "typeDescriptions": { - "typeIdentifier": "t_uint256", - "typeString": "uint256" - } - }, - "visibility": "internal" - }, - { - "constant": false, - "id": 35818, - "mutability": "mutable", - "name": "gasToken", - "nameLocation": "2621:8:43", - "nodeType": "VariableDeclaration", - "scope": 35827, - "src": "2613:16:43", - "stateVariable": false, - "storageLocation": "default", - "typeDescriptions": { - "typeIdentifier": "t_address", - "typeString": "address" - }, - "typeName": { - "id": 35817, - "name": "address", - "nodeType": "ElementaryTypeName", - "src": "2613:7:43", - "stateMutability": "nonpayable", - "typeDescriptions": { - "typeIdentifier": "t_address", - "typeString": "address" - } - }, - "visibility": "internal" - }, - { - "constant": false, - "id": 35820, - "mutability": "mutable", - "name": "refundReceiver", - "nameLocation": "2647:14:43", - "nodeType": "VariableDeclaration", - "scope": 35827, - "src": "2639:22:43", - "stateVariable": false, - "storageLocation": "default", - "typeDescriptions": { - "typeIdentifier": "t_address", - "typeString": "address" - }, - "typeName": { - "id": 35819, - "name": "address", - "nodeType": "ElementaryTypeName", - "src": "2639:7:43", - "stateMutability": "nonpayable", - "typeDescriptions": { - "typeIdentifier": "t_address", - "typeString": "address" - } - }, - "visibility": "internal" - }, - { - "constant": false, - "id": 35822, - "mutability": "mutable", - "name": "signatures", - "nameLocation": "2684:10:43", - "nodeType": "VariableDeclaration", - "scope": 35827, - "src": "2671:23:43", - "stateVariable": false, - "storageLocation": "memory", - "typeDescriptions": { - "typeIdentifier": "t_bytes_memory_ptr", - "typeString": "bytes" - }, - "typeName": { - "id": 35821, - "name": "bytes", - "nodeType": "ElementaryTypeName", - "src": "2671:5:43", - "typeDescriptions": { - "typeIdentifier": "t_bytes_storage_ptr", - "typeString": "bytes" - } - }, - "visibility": "internal" - } - ], - "src": "2421:279:43" - }, - "returnParameters": { - "id": 35826, - "nodeType": "ParameterList", - "parameters": [ - { - "constant": false, - "id": 35825, - "mutability": "mutable", - "name": "success", - "nameLocation": "2756:7:43", - "nodeType": "VariableDeclaration", - "scope": 35827, - "src": "2751:12:43", - "stateVariable": false, - "storageLocation": "default", - "typeDescriptions": { - "typeIdentifier": "t_bool", - "typeString": "bool" - }, - "typeName": { - "id": 35824, - "name": "bool", - "nodeType": "ElementaryTypeName", - "src": "2751:4:43", - "typeDescriptions": { - "typeIdentifier": "t_bool", - "typeString": "bool" - } - }, - "visibility": "internal" - } - ], - "src": "2750:14:43" - }, - "scope": 36016, - "stateMutability": "payable", - "virtual": false, - "visibility": "external" - }, - { - "id": 35841, - "nodeType": "FunctionDefinition", - "src": "2770:193:43", - "nodes": [], - "functionSelector": "468721a7", - "implemented": false, - "kind": "function", - "modifiers": [], - "name": "execTransactionFromModule", - "nameLocation": "2779:25:43", - "parameters": { - "id": 35837, - "nodeType": "ParameterList", - "parameters": [ - { - "constant": false, - "id": 35829, - "mutability": "mutable", - "name": "to", - "nameLocation": "2822:2:43", - "nodeType": "VariableDeclaration", - "scope": 35841, - "src": "2814:10:43", - "stateVariable": false, - "storageLocation": "default", - "typeDescriptions": { - "typeIdentifier": "t_address", - "typeString": "address" - }, - "typeName": { - "id": 35828, - "name": "address", - "nodeType": "ElementaryTypeName", - "src": "2814:7:43", - "stateMutability": "nonpayable", - "typeDescriptions": { - "typeIdentifier": "t_address", - "typeString": "address" - } - }, - "visibility": "internal" - }, - { - "constant": false, - "id": 35831, - "mutability": "mutable", - "name": "value", - "nameLocation": "2842:5:43", - "nodeType": "VariableDeclaration", - "scope": 35841, - "src": "2834:13:43", - "stateVariable": false, - "storageLocation": "default", - "typeDescriptions": { - "typeIdentifier": "t_uint256", - "typeString": "uint256" - }, - "typeName": { - "id": 35830, - "name": "uint256", - "nodeType": "ElementaryTypeName", - "src": "2834:7:43", - "typeDescriptions": { - "typeIdentifier": "t_uint256", - "typeString": "uint256" - } - }, - "visibility": "internal" - }, - { - "constant": false, - "id": 35833, - "mutability": "mutable", - "name": "data", - "nameLocation": "2870:4:43", - "nodeType": "VariableDeclaration", - "scope": 35841, - "src": "2857:17:43", - "stateVariable": false, - "storageLocation": "memory", - "typeDescriptions": { - "typeIdentifier": "t_bytes_memory_ptr", - "typeString": "bytes" - }, - "typeName": { - "id": 35832, - "name": "bytes", - "nodeType": "ElementaryTypeName", - "src": "2857:5:43", - "typeDescriptions": { - "typeIdentifier": "t_bytes_storage_ptr", - "typeString": "bytes" - } - }, - "visibility": "internal" - }, - { - "constant": false, - "id": 35836, - "mutability": "mutable", - "name": "operation", - "nameLocation": "2899:9:43", - "nodeType": "VariableDeclaration", - "scope": 35841, - "src": "2884:24:43", - "stateVariable": false, - "storageLocation": "default", - "typeDescriptions": { - "typeIdentifier": "t_enum$_Operation_$35628", - "typeString": "enum Enum.Operation" - }, - "typeName": { - "id": 35835, - "nodeType": "UserDefinedTypeName", - "pathNode": { - "id": 35834, - "name": "Enum.Operation", - "nameLocations": [ - "2884:4:43", - "2889:9:43" - ], - "nodeType": "IdentifierPath", - "referencedDeclaration": 35628, - "src": "2884:14:43" - }, - "referencedDeclaration": 35628, - "src": "2884:14:43", - "typeDescriptions": { - "typeIdentifier": "t_enum$_Operation_$35628", - "typeString": "enum Enum.Operation" - } - }, - "visibility": "internal" - } - ], - "src": "2804:110:43" - }, - "returnParameters": { - "id": 35840, - "nodeType": "ParameterList", - "parameters": [ - { - "constant": false, - "id": 35839, - "mutability": "mutable", - "name": "success", - "nameLocation": "2954:7:43", - "nodeType": "VariableDeclaration", - "scope": 35841, - "src": "2949:12:43", - "stateVariable": false, - "storageLocation": "default", - "typeDescriptions": { - "typeIdentifier": "t_bool", - "typeString": "bool" - }, - "typeName": { - "id": 35838, - "name": "bool", - "nodeType": "ElementaryTypeName", - "src": "2949:4:43", - "typeDescriptions": { - "typeIdentifier": "t_bool", - "typeString": "bool" - } - }, - "visibility": "internal" - } - ], - "src": "2948:14:43" - }, - "scope": 36016, - "stateMutability": "nonpayable", - "virtual": false, - "visibility": "external" - }, - { - "id": 35857, - "nodeType": "FunctionDefinition", - "src": "2968:228:43", - "nodes": [], - "functionSelector": "5229073f", - "implemented": false, - "kind": "function", - "modifiers": [], - "name": "execTransactionFromModuleReturnData", - "nameLocation": "2977:35:43", - "parameters": { - "id": 35851, - "nodeType": "ParameterList", - "parameters": [ - { - "constant": false, - "id": 35843, - "mutability": "mutable", - "name": "to", - "nameLocation": "3030:2:43", - "nodeType": "VariableDeclaration", - "scope": 35857, - "src": "3022:10:43", - "stateVariable": false, - "storageLocation": "default", - "typeDescriptions": { - "typeIdentifier": "t_address", - "typeString": "address" - }, - "typeName": { - "id": 35842, - "name": "address", - "nodeType": "ElementaryTypeName", - "src": "3022:7:43", - "stateMutability": "nonpayable", - "typeDescriptions": { - "typeIdentifier": "t_address", - "typeString": "address" - } - }, - "visibility": "internal" - }, - { - "constant": false, - "id": 35845, - "mutability": "mutable", - "name": "value", - "nameLocation": "3050:5:43", - "nodeType": "VariableDeclaration", - "scope": 35857, - "src": "3042:13:43", - "stateVariable": false, - "storageLocation": "default", - "typeDescriptions": { - "typeIdentifier": "t_uint256", - "typeString": "uint256" - }, - "typeName": { - "id": 35844, - "name": "uint256", - "nodeType": "ElementaryTypeName", - "src": "3042:7:43", - "typeDescriptions": { - "typeIdentifier": "t_uint256", - "typeString": "uint256" - } - }, - "visibility": "internal" - }, - { - "constant": false, - "id": 35847, - "mutability": "mutable", - "name": "data", - "nameLocation": "3078:4:43", - "nodeType": "VariableDeclaration", - "scope": 35857, - "src": "3065:17:43", - "stateVariable": false, - "storageLocation": "memory", - "typeDescriptions": { - "typeIdentifier": "t_bytes_memory_ptr", - "typeString": "bytes" - }, - "typeName": { - "id": 35846, - "name": "bytes", - "nodeType": "ElementaryTypeName", - "src": "3065:5:43", - "typeDescriptions": { - "typeIdentifier": "t_bytes_storage_ptr", - "typeString": "bytes" - } - }, - "visibility": "internal" - }, - { - "constant": false, - "id": 35850, - "mutability": "mutable", - "name": "operation", - "nameLocation": "3107:9:43", - "nodeType": "VariableDeclaration", - "scope": 35857, - "src": "3092:24:43", - "stateVariable": false, - "storageLocation": "default", - "typeDescriptions": { - "typeIdentifier": "t_enum$_Operation_$35628", - "typeString": "enum Enum.Operation" - }, - "typeName": { - "id": 35849, - "nodeType": "UserDefinedTypeName", - "pathNode": { - "id": 35848, - "name": "Enum.Operation", - "nameLocations": [ - "3092:4:43", - "3097:9:43" - ], - "nodeType": "IdentifierPath", - "referencedDeclaration": 35628, - "src": "3092:14:43" - }, - "referencedDeclaration": 35628, - "src": "3092:14:43", - "typeDescriptions": { - "typeIdentifier": "t_enum$_Operation_$35628", - "typeString": "enum Enum.Operation" - } - }, - "visibility": "internal" - } - ], - "src": "3012:110:43" - }, - "returnParameters": { - "id": 35856, - "nodeType": "ParameterList", - "parameters": [ - { - "constant": false, - "id": 35853, - "mutability": "mutable", - "name": "success", - "nameLocation": "3162:7:43", - "nodeType": "VariableDeclaration", - "scope": 35857, - "src": "3157:12:43", - "stateVariable": false, - "storageLocation": "default", - "typeDescriptions": { - "typeIdentifier": "t_bool", - "typeString": "bool" - }, - "typeName": { - "id": 35852, - "name": "bool", - "nodeType": "ElementaryTypeName", - "src": "3157:4:43", - "typeDescriptions": { - "typeIdentifier": "t_bool", - "typeString": "bool" - } - }, - "visibility": "internal" - }, - { - "constant": false, - "id": 35855, - "mutability": "mutable", - "name": "returnData", - "nameLocation": "3184:10:43", - "nodeType": "VariableDeclaration", - "scope": 35857, - "src": "3171:23:43", - "stateVariable": false, - "storageLocation": "memory", - "typeDescriptions": { - "typeIdentifier": "t_bytes_memory_ptr", - "typeString": "bytes" - }, - "typeName": { - "id": 35854, - "name": "bytes", - "nodeType": "ElementaryTypeName", - "src": "3171:5:43", - "typeDescriptions": { - "typeIdentifier": "t_bytes_storage_ptr", - "typeString": "bytes" - } - }, - "visibility": "internal" - } - ], - "src": "3156:39:43" - }, - "scope": 36016, - "stateMutability": "nonpayable", - "virtual": false, - "visibility": "external" - }, - { - "id": 35862, - "nodeType": "FunctionDefinition", - "src": "3201:54:43", - "nodes": [], - "functionSelector": "3408e470", - "implemented": false, - "kind": "function", - "modifiers": [], - "name": "getChainId", - "nameLocation": "3210:10:43", - "parameters": { - "id": 35858, - "nodeType": "ParameterList", - "parameters": [], - "src": "3220:2:43" - }, - "returnParameters": { - "id": 35861, - "nodeType": "ParameterList", - "parameters": [ - { - "constant": false, - "id": 35860, - "mutability": "mutable", - "name": "", - "nameLocation": "-1:-1:-1", - "nodeType": "VariableDeclaration", - "scope": 35862, - "src": "3246:7:43", - "stateVariable": false, - "storageLocation": "default", - "typeDescriptions": { - "typeIdentifier": "t_uint256", - "typeString": "uint256" - }, - "typeName": { - "id": 35859, - "name": "uint256", - "nodeType": "ElementaryTypeName", - "src": "3246:7:43", - "typeDescriptions": { - "typeIdentifier": "t_uint256", - "typeString": "uint256" - } - }, - "visibility": "internal" - } - ], - "src": "3245:9:43" - }, - "scope": 36016, - "stateMutability": "view", - "virtual": false, - "visibility": "external" - }, - { - "id": 35874, - "nodeType": "FunctionDefinition", - "src": "3260:169:43", - "nodes": [], - "functionSelector": "cc2f8452", - "implemented": false, - "kind": "function", - "modifiers": [], - "name": "getModulesPaginated", - "nameLocation": "3269:19:43", - "parameters": { - "id": 35867, - "nodeType": "ParameterList", - "parameters": [ - { - "constant": false, - "id": 35864, - "mutability": "mutable", - "name": "start", - "nameLocation": "3306:5:43", - "nodeType": "VariableDeclaration", - "scope": 35874, - "src": "3298:13:43", - "stateVariable": false, - "storageLocation": "default", - "typeDescriptions": { - "typeIdentifier": "t_address", - "typeString": "address" - }, - "typeName": { - "id": 35863, - "name": "address", - "nodeType": "ElementaryTypeName", - "src": "3298:7:43", - "stateMutability": "nonpayable", - "typeDescriptions": { - "typeIdentifier": "t_address", - "typeString": "address" - } - }, - "visibility": "internal" - }, - { - "constant": false, - "id": 35866, - "mutability": "mutable", - "name": "pageSize", - "nameLocation": "3329:8:43", - "nodeType": "VariableDeclaration", - "scope": 35874, - "src": "3321:16:43", - "stateVariable": false, - "storageLocation": "default", - "typeDescriptions": { - "typeIdentifier": "t_uint256", - "typeString": "uint256" - }, - "typeName": { - "id": 35865, - "name": "uint256", - "nodeType": "ElementaryTypeName", - "src": "3321:7:43", - "typeDescriptions": { - "typeIdentifier": "t_uint256", - "typeString": "uint256" - } - }, - "visibility": "internal" - } - ], - "src": "3288:55:43" - }, - "returnParameters": { - "id": 35873, - "nodeType": "ParameterList", - "parameters": [ - { - "constant": false, - "id": 35870, - "mutability": "mutable", - "name": "array", - "nameLocation": "3408:5:43", - "nodeType": "VariableDeclaration", - "scope": 35874, - "src": "3391:22:43", - "stateVariable": false, - "storageLocation": "memory", - "typeDescriptions": { - "typeIdentifier": "t_array$_t_address_$dyn_memory_ptr", - "typeString": "address[]" - }, - "typeName": { - "baseType": { - "id": 35868, - "name": "address", - "nodeType": "ElementaryTypeName", - "src": "3391:7:43", - "stateMutability": "nonpayable", - "typeDescriptions": { - "typeIdentifier": "t_address", - "typeString": "address" - } - }, - "id": 35869, - "nodeType": "ArrayTypeName", - "src": "3391:9:43", - "typeDescriptions": { - "typeIdentifier": "t_array$_t_address_$dyn_storage_ptr", - "typeString": "address[]" - } - }, - "visibility": "internal" - }, - { - "constant": false, - "id": 35872, - "mutability": "mutable", - "name": "next", - "nameLocation": "3423:4:43", - "nodeType": "VariableDeclaration", - "scope": 35874, - "src": "3415:12:43", - "stateVariable": false, - "storageLocation": "default", - "typeDescriptions": { - "typeIdentifier": "t_address", - "typeString": "address" - }, - "typeName": { - "id": 35871, - "name": "address", - "nodeType": "ElementaryTypeName", - "src": "3415:7:43", - "stateMutability": "nonpayable", - "typeDescriptions": { - "typeIdentifier": "t_address", - "typeString": "address" - } - }, - "visibility": "internal" - } - ], - "src": "3390:38:43" - }, - "scope": 36016, - "stateMutability": "view", - "virtual": false, - "visibility": "external" - }, - { - "id": 35880, - "nodeType": "FunctionDefinition", - "src": "3434:62:43", - "nodes": [], - "functionSelector": "a0e67e2b", - "implemented": false, - "kind": "function", - "modifiers": [], - "name": "getOwners", - "nameLocation": "3443:9:43", - "parameters": { - "id": 35875, - "nodeType": "ParameterList", - "parameters": [], - "src": "3452:2:43" - }, - "returnParameters": { - "id": 35879, - "nodeType": "ParameterList", - "parameters": [ - { - "constant": false, - "id": 35878, - "mutability": "mutable", - "name": "", - "nameLocation": "-1:-1:-1", - "nodeType": "VariableDeclaration", - "scope": 35880, - "src": "3478:16:43", - "stateVariable": false, - "storageLocation": "memory", - "typeDescriptions": { - "typeIdentifier": "t_array$_t_address_$dyn_memory_ptr", - "typeString": "address[]" - }, - "typeName": { - "baseType": { - "id": 35876, - "name": "address", - "nodeType": "ElementaryTypeName", - "src": "3478:7:43", - "stateMutability": "nonpayable", - "typeDescriptions": { - "typeIdentifier": "t_address", - "typeString": "address" - } - }, - "id": 35877, - "nodeType": "ArrayTypeName", - "src": "3478:9:43", - "typeDescriptions": { - "typeIdentifier": "t_array$_t_address_$dyn_storage_ptr", - "typeString": "address[]" - } - }, - "visibility": "internal" - } - ], - "src": "3477:18:43" - }, - "scope": 36016, - "stateMutability": "view", - "virtual": false, - "visibility": "external" - }, - { - "id": 35889, - "nodeType": "FunctionDefinition", - "src": "3501:91:43", - "nodes": [], - "functionSelector": "5624b25b", - "implemented": false, - "kind": "function", - "modifiers": [], - "name": "getStorageAt", - "nameLocation": "3510:12:43", - "parameters": { - "id": 35885, - "nodeType": "ParameterList", - "parameters": [ - { - "constant": false, - "id": 35882, - "mutability": "mutable", - "name": "offset", - "nameLocation": "3531:6:43", - "nodeType": "VariableDeclaration", - "scope": 35889, - "src": "3523:14:43", - "stateVariable": false, - "storageLocation": "default", - "typeDescriptions": { - "typeIdentifier": "t_uint256", - "typeString": "uint256" - }, - "typeName": { - "id": 35881, - "name": "uint256", - "nodeType": "ElementaryTypeName", - "src": "3523:7:43", - "typeDescriptions": { - "typeIdentifier": "t_uint256", - "typeString": "uint256" - } - }, - "visibility": "internal" - }, - { - "constant": false, - "id": 35884, - "mutability": "mutable", - "name": "length", - "nameLocation": "3547:6:43", - "nodeType": "VariableDeclaration", - "scope": 35889, - "src": "3539:14:43", - "stateVariable": false, - "storageLocation": "default", - "typeDescriptions": { - "typeIdentifier": "t_uint256", - "typeString": "uint256" - }, - "typeName": { - "id": 35883, - "name": "uint256", - "nodeType": "ElementaryTypeName", - "src": "3539:7:43", - "typeDescriptions": { - "typeIdentifier": "t_uint256", - "typeString": "uint256" - } - }, - "visibility": "internal" - } - ], - "src": "3522:32:43" - }, - "returnParameters": { - "id": 35888, - "nodeType": "ParameterList", - "parameters": [ - { - "constant": false, - "id": 35887, - "mutability": "mutable", - "name": "", - "nameLocation": "-1:-1:-1", - "nodeType": "VariableDeclaration", - "scope": 35889, - "src": "3578:12:43", - "stateVariable": false, - "storageLocation": "memory", - "typeDescriptions": { - "typeIdentifier": "t_bytes_memory_ptr", - "typeString": "bytes" - }, - "typeName": { - "id": 35886, - "name": "bytes", - "nodeType": "ElementaryTypeName", - "src": "3578:5:43", - "typeDescriptions": { - "typeIdentifier": "t_bytes_storage_ptr", - "typeString": "bytes" - } - }, - "visibility": "internal" - } - ], - "src": "3577:14:43" - }, - "scope": 36016, - "stateMutability": "view", - "virtual": false, - "visibility": "external" - }, - { - "id": 35894, - "nodeType": "FunctionDefinition", - "src": "3597:56:43", - "nodes": [], - "functionSelector": "e75235b8", - "implemented": false, - "kind": "function", - "modifiers": [], - "name": "getThreshold", - "nameLocation": "3606:12:43", - "parameters": { - "id": 35890, - "nodeType": "ParameterList", - "parameters": [], - "src": "3618:2:43" - }, - "returnParameters": { - "id": 35893, - "nodeType": "ParameterList", - "parameters": [ - { - "constant": false, - "id": 35892, - "mutability": "mutable", - "name": "", - "nameLocation": "-1:-1:-1", - "nodeType": "VariableDeclaration", - "scope": 35894, - "src": "3644:7:43", - "stateVariable": false, - "storageLocation": "default", - "typeDescriptions": { - "typeIdentifier": "t_uint256", - "typeString": "uint256" - }, - "typeName": { - "id": 35891, - "name": "uint256", - "nodeType": "ElementaryTypeName", - "src": "3644:7:43", - "typeDescriptions": { - "typeIdentifier": "t_uint256", - "typeString": "uint256" - } - }, - "visibility": "internal" - } - ], - "src": "3643:9:43" - }, - "scope": 36016, - "stateMutability": "view", - "virtual": false, - "visibility": "external" - }, - { - "id": 35920, - "nodeType": "FunctionDefinition", - "src": "3658:354:43", - "nodes": [], - "functionSelector": "d8d11f78", - "implemented": false, - "kind": "function", - "modifiers": [], - "name": "getTransactionHash", - "nameLocation": "3667:18:43", - "parameters": { - "id": 35916, - "nodeType": "ParameterList", - "parameters": [ - { - "constant": false, - "id": 35896, - "mutability": "mutable", - "name": "to", - "nameLocation": "3703:2:43", - "nodeType": "VariableDeclaration", - "scope": 35920, - "src": "3695:10:43", - "stateVariable": false, - "storageLocation": "default", - "typeDescriptions": { - "typeIdentifier": "t_address", - "typeString": "address" - }, - "typeName": { - "id": 35895, - "name": "address", - "nodeType": "ElementaryTypeName", - "src": "3695:7:43", - "stateMutability": "nonpayable", - "typeDescriptions": { - "typeIdentifier": "t_address", - "typeString": "address" - } - }, - "visibility": "internal" - }, - { - "constant": false, - "id": 35898, - "mutability": "mutable", - "name": "value", - "nameLocation": "3723:5:43", - "nodeType": "VariableDeclaration", - "scope": 35920, - "src": "3715:13:43", - "stateVariable": false, - "storageLocation": "default", - "typeDescriptions": { - "typeIdentifier": "t_uint256", - "typeString": "uint256" - }, - "typeName": { - "id": 35897, - "name": "uint256", - "nodeType": "ElementaryTypeName", - "src": "3715:7:43", - "typeDescriptions": { - "typeIdentifier": "t_uint256", - "typeString": "uint256" - } - }, - "visibility": "internal" - }, - { - "constant": false, - "id": 35900, - "mutability": "mutable", - "name": "data", - "nameLocation": "3751:4:43", - "nodeType": "VariableDeclaration", - "scope": 35920, - "src": "3738:17:43", - "stateVariable": false, - "storageLocation": "memory", - "typeDescriptions": { - "typeIdentifier": "t_bytes_memory_ptr", - "typeString": "bytes" - }, - "typeName": { - "id": 35899, - "name": "bytes", - "nodeType": "ElementaryTypeName", - "src": "3738:5:43", - "typeDescriptions": { - "typeIdentifier": "t_bytes_storage_ptr", - "typeString": "bytes" - } - }, - "visibility": "internal" - }, - { - "constant": false, - "id": 35903, - "mutability": "mutable", - "name": "operation", - "nameLocation": "3780:9:43", - "nodeType": "VariableDeclaration", - "scope": 35920, - "src": "3765:24:43", - "stateVariable": false, - "storageLocation": "default", - "typeDescriptions": { - "typeIdentifier": "t_enum$_Operation_$35628", - "typeString": "enum Enum.Operation" - }, - "typeName": { - "id": 35902, - "nodeType": "UserDefinedTypeName", - "pathNode": { - "id": 35901, - "name": "Enum.Operation", - "nameLocations": [ - "3765:4:43", - "3770:9:43" - ], - "nodeType": "IdentifierPath", - "referencedDeclaration": 35628, - "src": "3765:14:43" - }, - "referencedDeclaration": 35628, - "src": "3765:14:43", - "typeDescriptions": { - "typeIdentifier": "t_enum$_Operation_$35628", - "typeString": "enum Enum.Operation" - } - }, - "visibility": "internal" - }, - { - "constant": false, - "id": 35905, - "mutability": "mutable", - "name": "safeTxGas", - "nameLocation": "3807:9:43", - "nodeType": "VariableDeclaration", - "scope": 35920, - "src": "3799:17:43", - "stateVariable": false, - "storageLocation": "default", - "typeDescriptions": { - "typeIdentifier": "t_uint256", - "typeString": "uint256" - }, - "typeName": { - "id": 35904, - "name": "uint256", - "nodeType": "ElementaryTypeName", - "src": "3799:7:43", - "typeDescriptions": { - "typeIdentifier": "t_uint256", - "typeString": "uint256" - } - }, - "visibility": "internal" - }, - { - "constant": false, - "id": 35907, - "mutability": "mutable", - "name": "baseGas", - "nameLocation": "3834:7:43", - "nodeType": "VariableDeclaration", - "scope": 35920, - "src": "3826:15:43", - "stateVariable": false, - "storageLocation": "default", - "typeDescriptions": { - "typeIdentifier": "t_uint256", - "typeString": "uint256" - }, - "typeName": { - "id": 35906, - "name": "uint256", - "nodeType": "ElementaryTypeName", - "src": "3826:7:43", - "typeDescriptions": { - "typeIdentifier": "t_uint256", - "typeString": "uint256" - } - }, - "visibility": "internal" - }, - { - "constant": false, - "id": 35909, - "mutability": "mutable", - "name": "gasPrice", - "nameLocation": "3859:8:43", - "nodeType": "VariableDeclaration", - "scope": 35920, - "src": "3851:16:43", - "stateVariable": false, - "storageLocation": "default", - "typeDescriptions": { - "typeIdentifier": "t_uint256", - "typeString": "uint256" - }, - "typeName": { - "id": 35908, - "name": "uint256", - "nodeType": "ElementaryTypeName", - "src": "3851:7:43", - "typeDescriptions": { - "typeIdentifier": "t_uint256", - "typeString": "uint256" - } - }, - "visibility": "internal" - }, - { - "constant": false, - "id": 35911, - "mutability": "mutable", - "name": "gasToken", - "nameLocation": "3885:8:43", - "nodeType": "VariableDeclaration", - "scope": 35920, - "src": "3877:16:43", - "stateVariable": false, - "storageLocation": "default", - "typeDescriptions": { - "typeIdentifier": "t_address", - "typeString": "address" - }, - "typeName": { - "id": 35910, - "name": "address", - "nodeType": "ElementaryTypeName", - "src": "3877:7:43", - "stateMutability": "nonpayable", - "typeDescriptions": { - "typeIdentifier": "t_address", - "typeString": "address" - } - }, - "visibility": "internal" - }, - { - "constant": false, - "id": 35913, - "mutability": "mutable", - "name": "refundReceiver", - "nameLocation": "3911:14:43", - "nodeType": "VariableDeclaration", - "scope": 35920, - "src": "3903:22:43", - "stateVariable": false, - "storageLocation": "default", - "typeDescriptions": { - "typeIdentifier": "t_address", - "typeString": "address" - }, - "typeName": { - "id": 35912, - "name": "address", - "nodeType": "ElementaryTypeName", - "src": "3903:7:43", - "stateMutability": "nonpayable", - "typeDescriptions": { - "typeIdentifier": "t_address", - "typeString": "address" - } - }, - "visibility": "internal" - }, - { - "constant": false, - "id": 35915, - "mutability": "mutable", - "name": "_nonce", - "nameLocation": "3943:6:43", - "nodeType": "VariableDeclaration", - "scope": 35920, - "src": "3935:14:43", - "stateVariable": false, - "storageLocation": "default", - "typeDescriptions": { - "typeIdentifier": "t_uint256", - "typeString": "uint256" - }, - "typeName": { - "id": 35914, - "name": "uint256", - "nodeType": "ElementaryTypeName", - "src": "3935:7:43", - "typeDescriptions": { - "typeIdentifier": "t_uint256", - "typeString": "uint256" - } - }, - "visibility": "internal" - } - ], - "src": "3685:270:43" - }, - "returnParameters": { - "id": 35919, - "nodeType": "ParameterList", - "parameters": [ - { - "constant": false, - "id": 35918, - "mutability": "mutable", - "name": "", - "nameLocation": "-1:-1:-1", - "nodeType": "VariableDeclaration", - "scope": 35920, - "src": "4003:7:43", - "stateVariable": false, - "storageLocation": "default", - "typeDescriptions": { - "typeIdentifier": "t_bytes32", - "typeString": "bytes32" - }, - "typeName": { - "id": 35917, - "name": "bytes32", - "nodeType": "ElementaryTypeName", - "src": "4003:7:43", - "typeDescriptions": { - "typeIdentifier": "t_bytes32", - "typeString": "bytes32" - } - }, - "visibility": "internal" - } - ], - "src": "4002:9:43" - }, - "scope": 36016, - "stateMutability": "view", - "virtual": false, - "visibility": "external" - }, - { - "id": 35927, - "nodeType": "FunctionDefinition", - "src": "4017:70:43", - "nodes": [], - "functionSelector": "2d9ad53d", - "implemented": false, - "kind": "function", - "modifiers": [], - "name": "isModuleEnabled", - "nameLocation": "4026:15:43", - "parameters": { - "id": 35923, - "nodeType": "ParameterList", - "parameters": [ - { - "constant": false, - "id": 35922, - "mutability": "mutable", - "name": "module", - "nameLocation": "4050:6:43", - "nodeType": "VariableDeclaration", - "scope": 35927, - "src": "4042:14:43", - "stateVariable": false, - "storageLocation": "default", - "typeDescriptions": { - "typeIdentifier": "t_address", - "typeString": "address" - }, - "typeName": { - "id": 35921, - "name": "address", - "nodeType": "ElementaryTypeName", - "src": "4042:7:43", - "stateMutability": "nonpayable", - "typeDescriptions": { - "typeIdentifier": "t_address", - "typeString": "address" - } - }, - "visibility": "internal" - } - ], - "src": "4041:16:43" - }, - "returnParameters": { - "id": 35926, - "nodeType": "ParameterList", - "parameters": [ - { - "constant": false, - "id": 35925, - "mutability": "mutable", - "name": "", - "nameLocation": "-1:-1:-1", - "nodeType": "VariableDeclaration", - "scope": 35927, - "src": "4081:4:43", - "stateVariable": false, - "storageLocation": "default", - "typeDescriptions": { - "typeIdentifier": "t_bool", - "typeString": "bool" - }, - "typeName": { - "id": 35924, - "name": "bool", - "nodeType": "ElementaryTypeName", - "src": "4081:4:43", - "typeDescriptions": { - "typeIdentifier": "t_bool", - "typeString": "bool" - } - }, - "visibility": "internal" - } - ], - "src": "4080:6:43" - }, - "scope": 36016, - "stateMutability": "view", - "virtual": false, - "visibility": "external" - }, - { - "id": 35934, - "nodeType": "FunctionDefinition", - "src": "4092:61:43", - "nodes": [], - "functionSelector": "2f54bf6e", - "implemented": false, - "kind": "function", - "modifiers": [], - "name": "isOwner", - "nameLocation": "4101:7:43", - "parameters": { - "id": 35930, - "nodeType": "ParameterList", - "parameters": [ - { - "constant": false, - "id": 35929, - "mutability": "mutable", - "name": "owner", - "nameLocation": "4117:5:43", - "nodeType": "VariableDeclaration", - "scope": 35934, - "src": "4109:13:43", - "stateVariable": false, - "storageLocation": "default", - "typeDescriptions": { - "typeIdentifier": "t_address", - "typeString": "address" - }, - "typeName": { - "id": 35928, - "name": "address", - "nodeType": "ElementaryTypeName", - "src": "4109:7:43", - "stateMutability": "nonpayable", - "typeDescriptions": { - "typeIdentifier": "t_address", - "typeString": "address" - } - }, - "visibility": "internal" - } - ], - "src": "4108:15:43" - }, - "returnParameters": { - "id": 35933, - "nodeType": "ParameterList", - "parameters": [ - { - "constant": false, - "id": 35932, - "mutability": "mutable", - "name": "", - "nameLocation": "-1:-1:-1", - "nodeType": "VariableDeclaration", - "scope": 35934, - "src": "4147:4:43", - "stateVariable": false, - "storageLocation": "default", - "typeDescriptions": { - "typeIdentifier": "t_bool", - "typeString": "bool" - }, - "typeName": { - "id": 35931, - "name": "bool", - "nodeType": "ElementaryTypeName", - "src": "4147:4:43", - "typeDescriptions": { - "typeIdentifier": "t_bool", - "typeString": "bool" - } - }, - "visibility": "internal" - } - ], - "src": "4146:6:43" - }, - "scope": 36016, - "stateMutability": "view", - "virtual": false, - "visibility": "external" - }, - { - "id": 35939, - "nodeType": "FunctionDefinition", - "src": "4158:49:43", - "nodes": [], - "functionSelector": "affed0e0", - "implemented": false, - "kind": "function", - "modifiers": [], - "name": "nonce", - "nameLocation": "4167:5:43", - "parameters": { - "id": 35935, - "nodeType": "ParameterList", - "parameters": [], - "src": "4172:2:43" - }, - "returnParameters": { - "id": 35938, - "nodeType": "ParameterList", - "parameters": [ - { - "constant": false, - "id": 35937, - "mutability": "mutable", - "name": "", - "nameLocation": "-1:-1:-1", - "nodeType": "VariableDeclaration", - "scope": 35939, - "src": "4198:7:43", - "stateVariable": false, - "storageLocation": "default", - "typeDescriptions": { - "typeIdentifier": "t_uint256", - "typeString": "uint256" - }, - "typeName": { - "id": 35936, - "name": "uint256", - "nodeType": "ElementaryTypeName", - "src": "4198:7:43", - "typeDescriptions": { - "typeIdentifier": "t_uint256", - "typeString": "uint256" - } - }, - "visibility": "internal" - } - ], - "src": "4197:9:43" - }, - "scope": 36016, - "stateMutability": "view", - "virtual": false, - "visibility": "external" - }, - { - "id": 35948, - "nodeType": "FunctionDefinition", - "src": "4212:84:43", - "nodes": [], - "functionSelector": "f8dc5dd9", - "implemented": false, - "kind": "function", - "modifiers": [], - "name": "removeOwner", - "nameLocation": "4221:11:43", - "parameters": { - "id": 35946, - "nodeType": "ParameterList", - "parameters": [ - { - "constant": false, - "id": 35941, - "mutability": "mutable", - "name": "prevOwner", - "nameLocation": "4241:9:43", - "nodeType": "VariableDeclaration", - "scope": 35948, - "src": "4233:17:43", - "stateVariable": false, - "storageLocation": "default", - "typeDescriptions": { - "typeIdentifier": "t_address", - "typeString": "address" - }, - "typeName": { - "id": 35940, - "name": "address", - "nodeType": "ElementaryTypeName", - "src": "4233:7:43", - "stateMutability": "nonpayable", - "typeDescriptions": { - "typeIdentifier": "t_address", - "typeString": "address" - } - }, - "visibility": "internal" - }, - { - "constant": false, - "id": 35943, - "mutability": "mutable", - "name": "owner", - "nameLocation": "4260:5:43", - "nodeType": "VariableDeclaration", - "scope": 35948, - "src": "4252:13:43", - "stateVariable": false, - "storageLocation": "default", - "typeDescriptions": { - "typeIdentifier": "t_address", - "typeString": "address" - }, - "typeName": { - "id": 35942, - "name": "address", - "nodeType": "ElementaryTypeName", - "src": "4252:7:43", - "stateMutability": "nonpayable", - "typeDescriptions": { - "typeIdentifier": "t_address", - "typeString": "address" - } - }, - "visibility": "internal" - }, - { - "constant": false, - "id": 35945, - "mutability": "mutable", - "name": "_threshold", - "nameLocation": "4275:10:43", - "nodeType": "VariableDeclaration", - "scope": 35948, - "src": "4267:18:43", - "stateVariable": false, - "storageLocation": "default", - "typeDescriptions": { - "typeIdentifier": "t_uint256", - "typeString": "uint256" - }, - "typeName": { - "id": 35944, - "name": "uint256", - "nodeType": "ElementaryTypeName", - "src": "4267:7:43", - "typeDescriptions": { - "typeIdentifier": "t_uint256", - "typeString": "uint256" - } - }, - "visibility": "internal" - } - ], - "src": "4232:54:43" - }, - "returnParameters": { - "id": 35947, - "nodeType": "ParameterList", - "parameters": [], - "src": "4295:0:43" - }, - "scope": 36016, - "stateMutability": "nonpayable", - "virtual": false, - "visibility": "external" - }, - { - "id": 35962, - "nodeType": "FunctionDefinition", - "src": "4301:176:43", - "nodes": [], - "functionSelector": "c4ca3a9c", - "implemented": false, - "kind": "function", - "modifiers": [], - "name": "requiredTxGas", - "nameLocation": "4310:13:43", - "parameters": { - "id": 35958, - "nodeType": "ParameterList", - "parameters": [ - { - "constant": false, - "id": 35950, - "mutability": "mutable", - "name": "to", - "nameLocation": "4341:2:43", - "nodeType": "VariableDeclaration", - "scope": 35962, - "src": "4333:10:43", - "stateVariable": false, - "storageLocation": "default", - "typeDescriptions": { - "typeIdentifier": "t_address", - "typeString": "address" - }, - "typeName": { - "id": 35949, - "name": "address", - "nodeType": "ElementaryTypeName", - "src": "4333:7:43", - "stateMutability": "nonpayable", - "typeDescriptions": { - "typeIdentifier": "t_address", - "typeString": "address" - } - }, - "visibility": "internal" - }, - { - "constant": false, - "id": 35952, - "mutability": "mutable", - "name": "value", - "nameLocation": "4361:5:43", - "nodeType": "VariableDeclaration", - "scope": 35962, - "src": "4353:13:43", - "stateVariable": false, - "storageLocation": "default", - "typeDescriptions": { - "typeIdentifier": "t_uint256", - "typeString": "uint256" - }, - "typeName": { - "id": 35951, - "name": "uint256", - "nodeType": "ElementaryTypeName", - "src": "4353:7:43", - "typeDescriptions": { - "typeIdentifier": "t_uint256", - "typeString": "uint256" - } - }, - "visibility": "internal" - }, - { - "constant": false, - "id": 35954, - "mutability": "mutable", - "name": "data", - "nameLocation": "4389:4:43", - "nodeType": "VariableDeclaration", - "scope": 35962, - "src": "4376:17:43", - "stateVariable": false, - "storageLocation": "memory", - "typeDescriptions": { - "typeIdentifier": "t_bytes_memory_ptr", - "typeString": "bytes" - }, - "typeName": { - "id": 35953, - "name": "bytes", - "nodeType": "ElementaryTypeName", - "src": "4376:5:43", - "typeDescriptions": { - "typeIdentifier": "t_bytes_storage_ptr", - "typeString": "bytes" - } - }, - "visibility": "internal" - }, - { - "constant": false, - "id": 35957, - "mutability": "mutable", - "name": "operation", - "nameLocation": "4418:9:43", - "nodeType": "VariableDeclaration", - "scope": 35962, - "src": "4403:24:43", - "stateVariable": false, - "storageLocation": "default", - "typeDescriptions": { - "typeIdentifier": "t_enum$_Operation_$35628", - "typeString": "enum Enum.Operation" - }, - "typeName": { - "id": 35956, - "nodeType": "UserDefinedTypeName", - "pathNode": { - "id": 35955, - "name": "Enum.Operation", - "nameLocations": [ - "4403:4:43", - "4408:9:43" - ], - "nodeType": "IdentifierPath", - "referencedDeclaration": 35628, - "src": "4403:14:43" - }, - "referencedDeclaration": 35628, - "src": "4403:14:43", - "typeDescriptions": { - "typeIdentifier": "t_enum$_Operation_$35628", - "typeString": "enum Enum.Operation" - } - }, - "visibility": "internal" - } - ], - "src": "4323:110:43" - }, - "returnParameters": { - "id": 35961, - "nodeType": "ParameterList", - "parameters": [ - { - "constant": false, - "id": 35960, - "mutability": "mutable", - "name": "", - "nameLocation": "-1:-1:-1", - "nodeType": "VariableDeclaration", - "scope": 35962, - "src": "4468:7:43", - "stateVariable": false, - "storageLocation": "default", - "typeDescriptions": { - "typeIdentifier": "t_uint256", - "typeString": "uint256" - }, - "typeName": { - "id": 35959, - "name": "uint256", - "nodeType": "ElementaryTypeName", - "src": "4468:7:43", - "typeDescriptions": { - "typeIdentifier": "t_uint256", - "typeString": "uint256" - } - }, - "visibility": "internal" - } - ], - "src": "4467:9:43" - }, - "scope": 36016, - "stateMutability": "nonpayable", - "virtual": false, - "visibility": "external" - }, - { - "id": 35967, - "nodeType": "FunctionDefinition", - "src": "4482:54:43", - "nodes": [], - "functionSelector": "f08a0323", - "implemented": false, - "kind": "function", - "modifiers": [], - "name": "setFallbackHandler", - "nameLocation": "4491:18:43", - "parameters": { - "id": 35965, - "nodeType": "ParameterList", - "parameters": [ - { - "constant": false, - "id": 35964, - "mutability": "mutable", - "name": "handler", - "nameLocation": "4518:7:43", - "nodeType": "VariableDeclaration", - "scope": 35967, - "src": "4510:15:43", - "stateVariable": false, - "storageLocation": "default", - "typeDescriptions": { - "typeIdentifier": "t_address", - "typeString": "address" - }, - "typeName": { - "id": 35963, - "name": "address", - "nodeType": "ElementaryTypeName", - "src": "4510:7:43", - "stateMutability": "nonpayable", - "typeDescriptions": { - "typeIdentifier": "t_address", - "typeString": "address" - } - }, - "visibility": "internal" - } - ], - "src": "4509:17:43" - }, - "returnParameters": { - "id": 35966, - "nodeType": "ParameterList", - "parameters": [], - "src": "4535:0:43" - }, - "scope": 36016, - "stateMutability": "nonpayable", - "virtual": false, - "visibility": "external" - }, - { - "id": 35972, - "nodeType": "FunctionDefinition", - "src": "4541:42:43", - "nodes": [], - "functionSelector": "e19a9dd9", - "implemented": false, - "kind": "function", - "modifiers": [], - "name": "setGuard", - "nameLocation": "4550:8:43", - "parameters": { - "id": 35970, - "nodeType": "ParameterList", - "parameters": [ - { - "constant": false, - "id": 35969, - "mutability": "mutable", - "name": "guard", - "nameLocation": "4567:5:43", - "nodeType": "VariableDeclaration", - "scope": 35972, - "src": "4559:13:43", - "stateVariable": false, - "storageLocation": "default", - "typeDescriptions": { - "typeIdentifier": "t_address", - "typeString": "address" - }, - "typeName": { - "id": 35968, - "name": "address", - "nodeType": "ElementaryTypeName", - "src": "4559:7:43", - "stateMutability": "nonpayable", - "typeDescriptions": { - "typeIdentifier": "t_address", - "typeString": "address" - } - }, - "visibility": "internal" - } - ], - "src": "4558:15:43" - }, - "returnParameters": { - "id": 35971, - "nodeType": "ParameterList", - "parameters": [], - "src": "4582:0:43" - }, - "scope": 36016, - "stateMutability": "nonpayable", - "virtual": false, - "visibility": "external" - }, - { - "id": 35992, - "nodeType": "FunctionDefinition", - "src": "4588:268:43", - "nodes": [], - "functionSelector": "b63e800d", - "implemented": false, - "kind": "function", - "modifiers": [], - "name": "setup", - "nameLocation": "4597:5:43", - "parameters": { - "id": 35990, - "nodeType": "ParameterList", - "parameters": [ - { - "constant": false, - "id": 35975, - "mutability": "mutable", - "name": "_owners", - "nameLocation": "4629:7:43", - "nodeType": "VariableDeclaration", - "scope": 35992, - "src": "4612:24:43", - "stateVariable": false, - "storageLocation": "memory", - "typeDescriptions": { - "typeIdentifier": "t_array$_t_address_$dyn_memory_ptr", - "typeString": "address[]" - }, - "typeName": { - "baseType": { - "id": 35973, - "name": "address", - "nodeType": "ElementaryTypeName", - "src": "4612:7:43", - "stateMutability": "nonpayable", - "typeDescriptions": { - "typeIdentifier": "t_address", - "typeString": "address" - } - }, - "id": 35974, - "nodeType": "ArrayTypeName", - "src": "4612:9:43", - "typeDescriptions": { - "typeIdentifier": "t_array$_t_address_$dyn_storage_ptr", - "typeString": "address[]" - } - }, - "visibility": "internal" - }, - { - "constant": false, - "id": 35977, - "mutability": "mutable", - "name": "_threshold", - "nameLocation": "4654:10:43", - "nodeType": "VariableDeclaration", - "scope": 35992, - "src": "4646:18:43", - "stateVariable": false, - "storageLocation": "default", - "typeDescriptions": { - "typeIdentifier": "t_uint256", - "typeString": "uint256" - }, - "typeName": { - "id": 35976, - "name": "uint256", - "nodeType": "ElementaryTypeName", - "src": "4646:7:43", - "typeDescriptions": { - "typeIdentifier": "t_uint256", - "typeString": "uint256" - } - }, - "visibility": "internal" - }, - { - "constant": false, - "id": 35979, - "mutability": "mutable", - "name": "to", - "nameLocation": "4682:2:43", - "nodeType": "VariableDeclaration", - "scope": 35992, - "src": "4674:10:43", - "stateVariable": false, - "storageLocation": "default", - "typeDescriptions": { - "typeIdentifier": "t_address", - "typeString": "address" - }, - "typeName": { - "id": 35978, - "name": "address", - "nodeType": "ElementaryTypeName", - "src": "4674:7:43", - "stateMutability": "nonpayable", - "typeDescriptions": { - "typeIdentifier": "t_address", - "typeString": "address" - } - }, - "visibility": "internal" - }, - { - "constant": false, - "id": 35981, - "mutability": "mutable", - "name": "data", - "nameLocation": "4707:4:43", - "nodeType": "VariableDeclaration", - "scope": 35992, - "src": "4694:17:43", - "stateVariable": false, - "storageLocation": "memory", - "typeDescriptions": { - "typeIdentifier": "t_bytes_memory_ptr", - "typeString": "bytes" - }, - "typeName": { - "id": 35980, - "name": "bytes", - "nodeType": "ElementaryTypeName", - "src": "4694:5:43", - "typeDescriptions": { - "typeIdentifier": "t_bytes_storage_ptr", - "typeString": "bytes" - } - }, - "visibility": "internal" - }, - { - "constant": false, - "id": 35983, - "mutability": "mutable", - "name": "fallbackHandler", - "nameLocation": "4729:15:43", - "nodeType": "VariableDeclaration", - "scope": 35992, - "src": "4721:23:43", - "stateVariable": false, - "storageLocation": "default", - "typeDescriptions": { - "typeIdentifier": "t_address", - "typeString": "address" - }, - "typeName": { - "id": 35982, - "name": "address", - "nodeType": "ElementaryTypeName", - "src": "4721:7:43", - "stateMutability": "nonpayable", - "typeDescriptions": { - "typeIdentifier": "t_address", - "typeString": "address" - } - }, - "visibility": "internal" - }, - { - "constant": false, - "id": 35985, - "mutability": "mutable", - "name": "paymentToken", - "nameLocation": "4762:12:43", - "nodeType": "VariableDeclaration", - "scope": 35992, - "src": "4754:20:43", - "stateVariable": false, - "storageLocation": "default", - "typeDescriptions": { - "typeIdentifier": "t_address", - "typeString": "address" - }, - "typeName": { - "id": 35984, - "name": "address", - "nodeType": "ElementaryTypeName", - "src": "4754:7:43", - "stateMutability": "nonpayable", - "typeDescriptions": { - "typeIdentifier": "t_address", - "typeString": "address" - } - }, - "visibility": "internal" - }, - { - "constant": false, - "id": 35987, - "mutability": "mutable", - "name": "payment", - "nameLocation": "4792:7:43", - "nodeType": "VariableDeclaration", - "scope": 35992, - "src": "4784:15:43", - "stateVariable": false, - "storageLocation": "default", - "typeDescriptions": { - "typeIdentifier": "t_uint256", - "typeString": "uint256" - }, - "typeName": { - "id": 35986, - "name": "uint256", - "nodeType": "ElementaryTypeName", - "src": "4784:7:43", - "typeDescriptions": { - "typeIdentifier": "t_uint256", - "typeString": "uint256" - } - }, - "visibility": "internal" - }, - { - "constant": false, - "id": 35989, - "mutability": "mutable", - "name": "paymentReceiver", - "nameLocation": "4817:15:43", - "nodeType": "VariableDeclaration", - "scope": 35992, - "src": "4809:23:43", - "stateVariable": false, - "storageLocation": "default", - "typeDescriptions": { - "typeIdentifier": "t_address", - "typeString": "address" - }, - "typeName": { - "id": 35988, - "name": "address", - "nodeType": "ElementaryTypeName", - "src": "4809:7:43", - "stateMutability": "nonpayable", - "typeDescriptions": { - "typeIdentifier": "t_address", - "typeString": "address" - } - }, - "visibility": "internal" - } - ], - "src": "4602:236:43" - }, - "returnParameters": { - "id": 35991, - "nodeType": "ParameterList", - "parameters": [], - "src": "4855:0:43" - }, - "scope": 36016, - "stateMutability": "nonpayable", - "virtual": false, - "visibility": "external" - }, - { - "id": 35999, - "nodeType": "FunctionDefinition", - "src": "4861:65:43", - "nodes": [], - "functionSelector": "5ae6bd37", - "implemented": false, - "kind": "function", - "modifiers": [], - "name": "signedMessages", - "nameLocation": "4870:14:43", - "parameters": { - "id": 35995, - "nodeType": "ParameterList", - "parameters": [ - { - "constant": false, - "id": 35994, - "mutability": "mutable", - "name": "", - "nameLocation": "-1:-1:-1", - "nodeType": "VariableDeclaration", - "scope": 35999, - "src": "4885:7:43", - "stateVariable": false, - "storageLocation": "default", - "typeDescriptions": { - "typeIdentifier": "t_bytes32", - "typeString": "bytes32" - }, - "typeName": { - "id": 35993, - "name": "bytes32", - "nodeType": "ElementaryTypeName", - "src": "4885:7:43", - "typeDescriptions": { - "typeIdentifier": "t_bytes32", - "typeString": "bytes32" - } - }, - "visibility": "internal" - } - ], - "src": "4884:9:43" - }, - "returnParameters": { - "id": 35998, - "nodeType": "ParameterList", - "parameters": [ - { - "constant": false, - "id": 35997, - "mutability": "mutable", - "name": "", - "nameLocation": "-1:-1:-1", - "nodeType": "VariableDeclaration", - "scope": 35999, - "src": "4917:7:43", - "stateVariable": false, - "storageLocation": "default", - "typeDescriptions": { - "typeIdentifier": "t_uint256", - "typeString": "uint256" - }, - "typeName": { - "id": 35996, - "name": "uint256", - "nodeType": "ElementaryTypeName", - "src": "4917:7:43", - "typeDescriptions": { - "typeIdentifier": "t_uint256", - "typeString": "uint256" - } - }, - "visibility": "internal" - } - ], - "src": "4916:9:43" - }, - "scope": 36016, - "stateMutability": "view", - "virtual": false, - "visibility": "external" - }, - { - "id": 36006, - "nodeType": "FunctionDefinition", - "src": "4931:90:43", - "nodes": [], - "functionSelector": "b4faba09", - "implemented": false, - "kind": "function", - "modifiers": [], - "name": "simulateAndRevert", - "nameLocation": "4940:17:43", - "parameters": { - "id": 36004, - "nodeType": "ParameterList", - "parameters": [ - { - "constant": false, - "id": 36001, - "mutability": "mutable", - "name": "targetContract", - "nameLocation": "4966:14:43", - "nodeType": "VariableDeclaration", - "scope": 36006, - "src": "4958:22:43", - "stateVariable": false, - "storageLocation": "default", - "typeDescriptions": { - "typeIdentifier": "t_address", - "typeString": "address" - }, - "typeName": { - "id": 36000, - "name": "address", - "nodeType": "ElementaryTypeName", - "src": "4958:7:43", - "stateMutability": "nonpayable", - "typeDescriptions": { - "typeIdentifier": "t_address", - "typeString": "address" - } - }, - "visibility": "internal" - }, - { - "constant": false, - "id": 36003, - "mutability": "mutable", - "name": "calldataPayload", - "nameLocation": "4995:15:43", - "nodeType": "VariableDeclaration", - "scope": 36006, - "src": "4982:28:43", - "stateVariable": false, - "storageLocation": "memory", - "typeDescriptions": { - "typeIdentifier": "t_bytes_memory_ptr", - "typeString": "bytes" - }, - "typeName": { - "id": 36002, - "name": "bytes", - "nodeType": "ElementaryTypeName", - "src": "4982:5:43", - "typeDescriptions": { - "typeIdentifier": "t_bytes_storage_ptr", - "typeString": "bytes" - } - }, - "visibility": "internal" - } - ], - "src": "4957:54:43" - }, - "returnParameters": { - "id": 36005, - "nodeType": "ParameterList", - "parameters": [], - "src": "5020:0:43" - }, - "scope": 36016, - "stateMutability": "nonpayable", - "virtual": false, - "visibility": "external" - }, - { - "id": 36015, - "nodeType": "FunctionDefinition", - "src": "5026:83:43", - "nodes": [], - "functionSelector": "e318b52b", - "implemented": false, - "kind": "function", - "modifiers": [], - "name": "swapOwner", - "nameLocation": "5035:9:43", - "parameters": { - "id": 36013, - "nodeType": "ParameterList", - "parameters": [ - { - "constant": false, - "id": 36008, - "mutability": "mutable", - "name": "prevOwner", - "nameLocation": "5053:9:43", - "nodeType": "VariableDeclaration", - "scope": 36015, - "src": "5045:17:43", - "stateVariable": false, - "storageLocation": "default", - "typeDescriptions": { - "typeIdentifier": "t_address", - "typeString": "address" - }, - "typeName": { - "id": 36007, - "name": "address", - "nodeType": "ElementaryTypeName", - "src": "5045:7:43", - "stateMutability": "nonpayable", - "typeDescriptions": { - "typeIdentifier": "t_address", - "typeString": "address" - } - }, - "visibility": "internal" - }, - { - "constant": false, - "id": 36010, - "mutability": "mutable", - "name": "oldOwner", - "nameLocation": "5072:8:43", - "nodeType": "VariableDeclaration", - "scope": 36015, - "src": "5064:16:43", - "stateVariable": false, - "storageLocation": "default", - "typeDescriptions": { - "typeIdentifier": "t_address", - "typeString": "address" - }, - "typeName": { - "id": 36009, - "name": "address", - "nodeType": "ElementaryTypeName", - "src": "5064:7:43", - "stateMutability": "nonpayable", - "typeDescriptions": { - "typeIdentifier": "t_address", - "typeString": "address" - } - }, - "visibility": "internal" - }, - { - "constant": false, - "id": 36012, - "mutability": "mutable", - "name": "newOwner", - "nameLocation": "5090:8:43", - "nodeType": "VariableDeclaration", - "scope": 36015, - "src": "5082:16:43", - "stateVariable": false, - "storageLocation": "default", - "typeDescriptions": { - "typeIdentifier": "t_address", - "typeString": "address" - }, - "typeName": { - "id": 36011, - "name": "address", - "nodeType": "ElementaryTypeName", - "src": "5082:7:43", - "stateMutability": "nonpayable", - "typeDescriptions": { - "typeIdentifier": "t_address", - "typeString": "address" - } - }, - "visibility": "internal" - } - ], - "src": "5044:55:43" - }, - "returnParameters": { - "id": 36014, - "nodeType": "ParameterList", - "parameters": [], - "src": "5108:0:43" - }, - "scope": 36016, - "stateMutability": "nonpayable", - "virtual": false, - "visibility": "external" - } - ], - "abstract": false, - "baseContracts": [], - "canonicalName": "IGnosisSafe", - "contractDependencies": [], - "contractKind": "interface", - "documentation": { - "id": 35630, - "nodeType": "StructuredDocumentation", - "src": "262:47:43", - "text": "@title IGnosisSafe - Gnosis Safe Interface" - }, - "fullyImplemented": false, - "linearizedBaseContracts": [ - 36016 - ], - "name": "IGnosisSafe", - "nameLocation": "319:11:43", - "scope": 36017, - "usedErrors": [] - } - ], - "license": "LGPL-3.0-only" - }, - "id": 43 -} \ No newline at end of file diff --git a/packages/chain-mon/src/abi/OptimismPortal.json b/packages/chain-mon/src/abi/OptimismPortal.json deleted file mode 100644 index e6f1d9048fea..000000000000 --- a/packages/chain-mon/src/abi/OptimismPortal.json +++ /dev/null @@ -1,11338 +0,0 @@ -{ - "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": false, - "internalType": "address", - "name": "account", - "type": "address" - } - ], - "name": "Paused", - "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": false, - "internalType": "address", - "name": "account", - "type": "address" - } - ], - "name": "Unpaused", - "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": "GUARDIAN", - "outputs": [ - { - "internalType": "address", - "name": "", - "type": "address" - } - ], - "stateMutability": "view", - "type": "function" - }, - { - "inputs": [], - "name": "L2_ORACLE", - "outputs": [ - { - "internalType": "contract L2OutputOracle", - "name": "", - "type": "address" - } - ], - "stateMutability": "view", - "type": "function" - }, - { - "inputs": [], - "name": "SYSTEM_CONFIG", - "outputs": [ - { - "internalType": "contract SystemConfig", - "name": "", - "type": "address" - } - ], - "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": [], - "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": "address", - "name": "_guardian", - "type": "address" - }, - { - "internalType": "contract SystemConfig", - "name": "_systemConfig", - "type": "address" - }, - { - "internalType": "bool", - "name": "_paused", - "type": "bool" - } - ], - "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": "pause", - "outputs": [], - "stateMutability": "nonpayable", - "type": "function" - }, - { - "inputs": [], - "name": "paused", - "outputs": [ - { - "internalType": "bool", - "name": "", - "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": "systemConfig", - "outputs": [ - { - "internalType": "contract SystemConfig", - "name": "", - "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" - }, - { - "stateMutability": "payable", - "type": "receive" - } - ], - "bytecode": { - "object": "0x60806040523480156200001157600080fd5b506200002260008080600162000028565b62000224565b600054600390610100900460ff161580156200004b575060005460ff8083169116105b620000b45760405162461bcd60e51b815260206004820152602e60248201527f496e697469616c697a61626c653a20636f6e747261637420697320616c72656160448201526d191e481a5b9a5d1a585b1a5e995960921b60648201526084015b60405180910390fd5b6000805461ffff191660ff831617610100908117909155603280546001600160a01b031990811661dead1790915560358054603680546001600160a01b0389811691861691909117909155603780548a831695169490941790935585151592891690930260ff19166001600160a81b0319909316929092171790556200013962000181565b6000805461ff001916905560405160ff821681527f7f26b83ff96e1f2b6a682f133852f6798a09c465da95921460cefb38474024989060200160405180910390a15050505050565b600054610100900460ff16620001ee5760405162461bcd60e51b815260206004820152602b60248201527f496e697469616c697a61626c653a20636f6e7472616374206973206e6f74206960448201526a6e697469616c697a696e6760a81b6064820152608401620000ab565b60408051606081018252633b9aca0080825260006020830152436001600160401b031691909201819052600160c01b0217600155565b61545c80620002346000396000f3fe60806040526004361061016d5760003560e01c80638b4c40b0116100cb578063a35d99df1161007f578063e9e05c4211610059578063e9e05c4214610573578063f049875014610586578063fecf9734146105b157600080fd5b8063a35d99df1461040d578063cff0ab9614610446578063e965084c146104e757600080fd5b80639b5f694a116100b05780639b5f694a1461037e5780639bf62d82146103b0578063a14238e7146103dd57600080fd5b80638b4c40b0146101925780638c3152e91461035e57600080fd5b806354fd4d50116101225780636dbffb78116101075780636dbffb78146102fe578063724c184c1461031e5780638456cb591461034957600080fd5b806354fd4d501461027e5780635c975abb146102d457600080fd5b80633f4ba83a116101535780633f4ba83a1461021c578063452a9320146102315780634870496f1461025e57600080fd5b80621c2ff61461019957806333d7e2bd146101ef57600080fd5b36610194576101923334620186a06000604051806020016040528060008152506105d1565b005b600080fd5b3480156101a557600080fd5b50603554610100900473ffffffffffffffffffffffffffffffffffffffff165b60405173ffffffffffffffffffffffffffffffffffffffff90911681526020015b60405180910390f35b3480156101fb57600080fd5b506036546101c59073ffffffffffffffffffffffffffffffffffffffff1681565b34801561022857600080fd5b5061019261086c565b34801561023d57600080fd5b506037546101c59073ffffffffffffffffffffffffffffffffffffffff1681565b34801561026a57600080fd5b50610192610279366004614a4a565b610971565b34801561028a57600080fd5b506102c76040518060400160405280600681526020017f312e31302e30000000000000000000000000000000000000000000000000000081525081565b6040516101e69190614ba0565b3480156102e057600080fd5b506035546102ee9060ff1681565b60405190151581526020016101e6565b34801561030a57600080fd5b506102ee610319366004614bb3565b610fa6565b34801561032a57600080fd5b5060375473ffffffffffffffffffffffffffffffffffffffff166101c5565b34801561035557600080fd5b50610192611065565b34801561036a57600080fd5b50610192610379366004614bcc565b611167565b34801561038a57600080fd5b506035546101c590610100900473ffffffffffffffffffffffffffffffffffffffff1681565b3480156103bc57600080fd5b506032546101c59073ffffffffffffffffffffffffffffffffffffffff1681565b3480156103e957600080fd5b506102ee6103f8366004614bb3565b60336020526000908152604090205460ff1681565b34801561041957600080fd5b5061042d610428366004614c26565b611a2b565b60405167ffffffffffffffff90911681526020016101e6565b34801561045257600080fd5b506001546104ae906fffffffffffffffffffffffffffffffff81169067ffffffffffffffff7001000000000000000000000000000000008204811691780100000000000000000000000000000000000000000000000090041683565b604080516fffffffffffffffffffffffffffffffff909416845267ffffffffffffffff92831660208501529116908201526060016101e6565b3480156104f357600080fd5b50610545610502366004614bb3565b603460205260009081526040902080546001909101546fffffffffffffffffffffffffffffffff8082169170010000000000000000000000000000000090041683565b604080519384526fffffffffffffffffffffffffffffffff92831660208501529116908201526060016101e6565b610192610581366004614c51565b6105d1565b34801561059257600080fd5b5060365473ffffffffffffffffffffffffffffffffffffffff166101c5565b3480156105bd57600080fd5b506101926105cc366004614ccc565b611a44565b8260005a905083156106885773ffffffffffffffffffffffffffffffffffffffff87161561068857604080517f08c379a00000000000000000000000000000000000000000000000000000000081526020600482015260248101919091527f4f7074696d69736d506f7274616c3a206d7573742073656e6420746f2061646460448201527f72657373283029207768656e206372656174696e67206120636f6e747261637460648201526084015b60405180910390fd5b6106928351611a2b565b67ffffffffffffffff168567ffffffffffffffff161015610735576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602360248201527f4f7074696d69736d506f7274616c3a20676173206c696d697420746f6f20736d60448201527f616c6c0000000000000000000000000000000000000000000000000000000000606482015260840161067f565b6201d4c0835111156107a3576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601e60248201527f4f7074696d69736d506f7274616c3a206461746120746f6f206c617267650000604482015260640161067f565b333281146107c4575033731111000000000000000000000000000000001111015b600034888888886040516020016107df959493929190614d26565b604051602081830303815290604052905060008973ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff167fb3813568d9991fc951961fcb4c784893574240a28925604d09fc577c55bb7c328460405161084f9190614ba0565b60405180910390a450506108638282611c52565b50505050505050565b60375473ffffffffffffffffffffffffffffffffffffffff163314610913576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602960248201527f4f7074696d69736d506f7274616c3a206f6e6c7920677561726469616e20636160448201527f6e20756e70617573650000000000000000000000000000000000000000000000606482015260840161067f565b603580547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff001690556040513381527f5db9ee0a495bf2e6ff9c91a7834c1ba4fdd244a5e8aa4e537bd38aeae4b073aa906020015b60405180910390a1565b60355460ff16156109de576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601660248201527f4f7074696d69736d506f7274616c3a2070617573656400000000000000000000604482015260640161067f565b3073ffffffffffffffffffffffffffffffffffffffff16856040015173ffffffffffffffffffffffffffffffffffffffff1603610a9d576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152603f60248201527f4f7074696d69736d506f7274616c3a20796f752063616e6e6f742073656e642060448201527f6d6573736167657320746f2074686520706f7274616c20636f6e747261637400606482015260840161067f565b6035546040517fa25ae55700000000000000000000000000000000000000000000000000000000815260048101869052600091610100900473ffffffffffffffffffffffffffffffffffffffff169063a25ae55790602401606060405180830381865afa158015610b12573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610b369190614dab565b519050610b50610b4b36869003860186614e10565b611f7f565b8114610bde576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602960248201527f4f7074696d69736d506f7274616c3a20696e76616c6964206f7574707574207260448201527f6f6f742070726f6f660000000000000000000000000000000000000000000000606482015260840161067f565b6000610be987611fdb565b6000818152603460209081526040918290208251606081018452815481526001909101546fffffffffffffffffffffffffffffffff8082169383018490527001000000000000000000000000000000009091041692810192909252919250901580610d035750805160355460408084015190517fa25ae5570000000000000000000000000000000000000000000000000000000081526fffffffffffffffffffffffffffffffff909116600482015261010090910473ffffffffffffffffffffffffffffffffffffffff169063a25ae55790602401606060405180830381865afa158015610cdb573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610cff9190614dab565b5114155b610d8f576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152603760248201527f4f7074696d69736d506f7274616c3a207769746864726177616c20686173682060448201527f68617320616c7265616479206265656e2070726f76656e000000000000000000606482015260840161067f565b60408051602081018490526000918101829052606001604080517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe081840301815282825280516020918201209083018190529250610e589101604080517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0818403018152828201909152600182527f0100000000000000000000000000000000000000000000000000000000000000602083015290610e4e888a614e76565b8a6040013561200b565b610ee4576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152603260248201527f4f7074696d69736d506f7274616c3a20696e76616c696420776974686472617760448201527f616c20696e636c7573696f6e2070726f6f660000000000000000000000000000606482015260840161067f565b604080516060810182528581526fffffffffffffffffffffffffffffffff42811660208084019182528c831684860190815260008981526034835286812095518655925190518416700100000000000000000000000000000000029316929092176001909301929092558b830151908c0151925173ffffffffffffffffffffffffffffffffffffffff918216939091169186917f67a6208cfcc0801d50f6cbe764733f4fddf66ac0b04442061a8a8c0cb6b63f629190a4505050505050505050565b6035546040517fa25ae5570000000000000000000000000000000000000000000000000000000081526004810183905260009161105f9161010090910473ffffffffffffffffffffffffffffffffffffffff169063a25ae55790602401606060405180830381865afa158015611020573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906110449190614dab565b602001516fffffffffffffffffffffffffffffffff1661202f565b92915050565b60375473ffffffffffffffffffffffffffffffffffffffff16331461110c576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602760248201527f4f7074696d69736d506f7274616c3a206f6e6c7920677561726469616e20636160448201527f6e20706175736500000000000000000000000000000000000000000000000000606482015260840161067f565b603580547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff001660011790556040513381527f62e78cea01bee320cd4e420270b5ea74000d11b0c9f74754ebdbfc544b05a25890602001610967565b60355460ff16156111d4576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601660248201527f4f7074696d69736d506f7274616c3a2070617573656400000000000000000000604482015260640161067f565b60325473ffffffffffffffffffffffffffffffffffffffff1661dead1461127d576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152603f60248201527f4f7074696d69736d506f7274616c3a2063616e206f6e6c79207472696767657260448201527f206f6e65207769746864726177616c20706572207472616e73616374696f6e00606482015260840161067f565b600061128882611fdb565b60008181526034602090815260408083208151606081018352815481526001909101546fffffffffffffffffffffffffffffffff80821694830185905270010000000000000000000000000000000090910416918101919091529293509003611373576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152603260248201527f4f7074696d69736d506f7274616c3a207769746864726177616c20686173206e60448201527f6f74206265656e2070726f76656e207965740000000000000000000000000000606482015260840161067f565b603560019054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1663887862726040518163ffffffff1660e01b8152600401602060405180830381865afa1580156113e0573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906114049190614efa565b81602001516fffffffffffffffffffffffffffffffff1610156114cf576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152604b60248201527f4f7074696d69736d506f7274616c3a207769746864726177616c2074696d657360448201527f74616d70206c657373207468616e204c32204f7261636c65207374617274696e60648201527f672074696d657374616d70000000000000000000000000000000000000000000608482015260a40161067f565b6114ee81602001516fffffffffffffffffffffffffffffffff1661202f565b6115a0576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152604560248201527f4f7074696d69736d506f7274616c3a2070726f76656e2077697468647261776160448201527f6c2066696e616c697a6174696f6e20706572696f6420686173206e6f7420656c60648201527f6170736564000000000000000000000000000000000000000000000000000000608482015260a40161067f565b60355460408281015190517fa25ae5570000000000000000000000000000000000000000000000000000000081526fffffffffffffffffffffffffffffffff9091166004820152600091610100900473ffffffffffffffffffffffffffffffffffffffff169063a25ae55790602401606060405180830381865afa15801561162c573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906116509190614dab565b825181519192501461170a576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152604960248201527f4f7074696d69736d506f7274616c3a206f757470757420726f6f742070726f7660448201527f656e206973206e6f74207468652073616d652061732063757272656e74206f7560648201527f7470757420726f6f740000000000000000000000000000000000000000000000608482015260a40161067f565b61172981602001516fffffffffffffffffffffffffffffffff1661202f565b6117db576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152604360248201527f4f7074696d69736d506f7274616c3a206f75747075742070726f706f73616c2060448201527f66696e616c697a6174696f6e20706572696f6420686173206e6f7420656c617060648201527f7365640000000000000000000000000000000000000000000000000000000000608482015260a40161067f565b60008381526033602052604090205460ff161561187a576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152603560248201527f4f7074696d69736d506f7274616c3a207769746864726177616c20686173206160448201527f6c7265616479206265656e2066696e616c697a65640000000000000000000000606482015260840161067f565b600083815260336020908152604080832080547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00166001179055908601516032805473ffffffffffffffffffffffffffffffffffffffff9092167fffffffffffffffffffffffff00000000000000000000000000000000000000009092169190911790558501516080860151606087015160a088015161191c939291906120d4565b603280547fffffffffffffffffffffffff00000000000000000000000000000000000000001661dead17905560405190915084907fdb5c7652857aa163daadd670e116628fb42e869d8ac4251ef8971d9e5727df1b9061198190841515815260200190565b60405180910390a2801580156119975750326001145b15611a24576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602160248201527f4f7074696d69736d506f7274616c3a207769746864726177616c206661696c6560448201527f6400000000000000000000000000000000000000000000000000000000000000606482015260840161067f565b5050505050565b6000611a38826010614f42565b61105f90615208614f72565b600054600390610100900460ff16158015611a66575060005460ff8083169116105b611af2576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602e60248201527f496e697469616c697a61626c653a20636f6e747261637420697320616c72656160448201527f647920696e697469616c697a6564000000000000000000000000000000000000606482015260840161067f565b600080547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00001660ff831617610100908117909155603280547fffffffffffffffffffffffff000000000000000000000000000000000000000090811661dead17909155603580546036805473ffffffffffffffffffffffffffffffffffffffff89811691861691909117909155603780548a83169516949094179093558515159289169093027fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00167fffffffffffffffffffffff00000000000000000000000000000000000000000090931692909217179055611bed612132565b600080547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00ff16905560405160ff821681527f7f26b83ff96e1f2b6a682f133852f6798a09c465da95921460cefb38474024989060200160405180910390a15050505050565b600154600090611c88907801000000000000000000000000000000000000000000000000900467ffffffffffffffff1643614f9e565b90506000611c94612215565b90506000816020015160ff16826000015163ffffffff16611cb59190614fe4565b90508215611dec57600154600090611cec908390700100000000000000000000000000000000900467ffffffffffffffff1661504c565b90506000836040015160ff1683611d0391906150c0565b600154611d239084906fffffffffffffffffffffffffffffffff166150c0565b611d2d9190614fe4565b600154909150600090611d7e90611d579084906fffffffffffffffffffffffffffffffff1661517c565b866060015163ffffffff168760a001516fffffffffffffffffffffffffffffffff166122db565b90506001861115611dad57611daa611d5782876040015160ff1660018a611da59190614f9e565b6122fa565b90505b6fffffffffffffffffffffffffffffffff16780100000000000000000000000000000000000000000000000067ffffffffffffffff4316021760015550505b60018054869190601090611e1f908490700100000000000000000000000000000000900467ffffffffffffffff16614f72565b92506101000a81548167ffffffffffffffff021916908367ffffffffffffffff160217905550816000015163ffffffff16600160000160109054906101000a900467ffffffffffffffff1667ffffffffffffffff161315611f02576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152603e60248201527f5265736f757263654d65746572696e673a2063616e6e6f7420627579206d6f7260448201527f6520676173207468616e20617661696c61626c6520676173206c696d69740000606482015260840161067f565b600154600090611f2e906fffffffffffffffffffffffffffffffff1667ffffffffffffffff88166151f0565b90506000611f4048633b9aca0061234f565b611f4a908361522d565b905060005a611f599088614f9e565b905080821115611f7557611f75611f708284614f9e565b612366565b5050505050505050565b60008160000151826020015183604001518460600151604051602001611fbe949392919093845260208401929092526040830152606082015260800190565b604051602081830303815290604052805190602001209050919050565b80516020808301516040808501516060860151608087015160a08801519351600097611fbe979096959101615241565b60008061201786612394565b9050612025818686866123c6565b9695505050505050565b6000603560019054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1663f4daa2916040518163ffffffff1660e01b8152600401602060405180830381865afa15801561209e573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906120c29190614efa565b6120cc9083615298565b421192915050565b60008060006120e48660006123f6565b90508061211a576308c379a06000526020805278185361666543616c6c3a204e6f7420656e6f756768206761736058526064601cfd5b600080855160208701888b5af1979650505050505050565b600054610100900460ff166121c9576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602b60248201527f496e697469616c697a61626c653a20636f6e7472616374206973206e6f74206960448201527f6e697469616c697a696e67000000000000000000000000000000000000000000606482015260840161067f565b60408051606081018252633b9aca00808252600060208301524367ffffffffffffffff169190920181905278010000000000000000000000000000000000000000000000000217600155565b6040805160c08082018352600080835260208301819052828401819052606083018190526080830181905260a083015260365483517fcc731b020000000000000000000000000000000000000000000000000000000081529351929373ffffffffffffffffffffffffffffffffffffffff9091169263cc731b02926004808401939192918290030181865afa1580156122b2573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906122d691906152d5565b905090565b60006122f06122ea8585612414565b83612424565b90505b9392505050565b6000670de0b6b3a764000061233b6123128583614fe4565b61232490670de0b6b3a764000061504c565b61233685670de0b6b3a76400006150c0565b612433565b61234590866150c0565b6122f09190614fe4565b60008183101561235f57816122f3565b5090919050565b6000805a90505b825a6123799083614f9e565b101561238f5761238882615374565b915061236d565b505050565b606081805190602001206040516020016123b091815260200190565b6040516020818303038152906040529050919050565b60006123ed846123d7878686612464565b8051602091820120825192909101919091201490565b95945050505050565b600080603f83619c4001026040850201603f5a021015949350505050565b60008183121561235f57816122f3565b600081831261235f57816122f3565b60006122f3670de0b6b3a76400008361244b86612ee2565b61245591906150c0565b61245f9190614fe4565b613126565b606060008451116124d1576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601560248201527f4d65726b6c65547269653a20656d707479206b65790000000000000000000000604482015260640161067f565b60006124dc84613365565b905060006124e986613451565b905060008460405160200161250091815260200190565b60405160208183030381529060405290506000805b8451811015612e59576000858281518110612532576125326153ac565b6020026020010151905084518311156125cd576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602e60248201527f4d65726b6c65547269653a206b657920696e646578206578636565647320746f60448201527f74616c206b6579206c656e677468000000000000000000000000000000000000606482015260840161067f565b82600003612686578051805160209182012060405161261b926125f592910190815260200190565b604051602081830303815290604052858051602091820120825192909101919091201490565b612681576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601d60248201527f4d65726b6c65547269653a20696e76616c696420726f6f742068617368000000604482015260640161067f565b6127dd565b80515160201161273c57805180516020918201206040516126b0926125f592910190815260200190565b612681576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602760248201527f4d65726b6c65547269653a20696e76616c6964206c6172676520696e7465726e60448201527f616c206861736800000000000000000000000000000000000000000000000000606482015260840161067f565b8051845160208087019190912082519190920120146127dd576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602660248201527f4d65726b6c65547269653a20696e76616c696420696e7465726e616c206e6f6460448201527f6520686173680000000000000000000000000000000000000000000000000000606482015260840161067f565b6127e960106001615298565b816020015151036129c5578451830361295d576128238160200151601081518110612816576128166153ac565b60200260200101516134b4565b965060008751116128b6576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152603b60248201527f4d65726b6c65547269653a2076616c7565206c656e677468206d75737420626560448201527f2067726561746572207468616e207a65726f20286272616e6368290000000000606482015260840161067f565b600186516128c49190614f9e565b8214612952576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152603a60248201527f4d65726b6c65547269653a2076616c7565206e6f6465206d757374206265206c60448201527f617374206e6f646520696e2070726f6f6620286272616e636829000000000000606482015260840161067f565b5050505050506122f3565b6000858481518110612971576129716153ac565b602001015160f81c60f81b60f81c9050600082602001518260ff168151811061299c5761299c6153ac565b602002602001015190506129af81613614565b95506129bc600186615298565b94505050612e46565b600281602001515103612dbe5760006129dd82613639565b90506000816000815181106129f4576129f46153ac565b016020015160f81c90506000612a0b6002836153db565b612a169060026153fd565b90506000612a27848360ff1661365d565b90506000612a358a8961365d565b90506000612a438383613693565b905080835114612ad5576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152603a60248201527f4d65726b6c65547269653a20706174682072656d61696e646572206d7573742060448201527f736861726520616c6c206e6962626c65732077697468206b6579000000000000606482015260840161067f565b60ff851660021480612aea575060ff85166003145b15612cd95780825114612b7f576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152603d60248201527f4d65726b6c65547269653a206b65792072656d61696e646572206d757374206260448201527f65206964656e746963616c20746f20706174682072656d61696e646572000000606482015260840161067f565b612b998760200151600181518110612816576128166153ac565b9c5060008d5111612c2c576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152603960248201527f4d65726b6c65547269653a2076616c7565206c656e677468206d75737420626560448201527f2067726561746572207468616e207a65726f20286c6561662900000000000000606482015260840161067f565b60018c51612c3a9190614f9e565b8814612cc8576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152603860248201527f4d65726b6c65547269653a2076616c7565206e6f6465206d757374206265206c60448201527f617374206e6f646520696e2070726f6f6620286c656166290000000000000000606482015260840161067f565b5050505050505050505050506122f3565b60ff85161580612cec575060ff85166001145b15612d2b57612d188760200151600181518110612d0b57612d0b6153ac565b6020026020010151613614565b9950612d24818a615298565b9850612db3565b6040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152603260248201527f4d65726b6c65547269653a2072656365697665642061206e6f6465207769746860448201527f20616e20756e6b6e6f776e207072656669780000000000000000000000000000606482015260840161067f565b505050505050612e46565b6040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602860248201527f4d65726b6c65547269653a20726563656976656420616e20756e70617273656160448201527f626c65206e6f6465000000000000000000000000000000000000000000000000606482015260840161067f565b5080612e5181615374565b915050612515565b506040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602560248201527f4d65726b6c65547269653a2072616e206f7574206f662070726f6f6620656c6560448201527f6d656e7473000000000000000000000000000000000000000000000000000000606482015260840161067f565b6000808213612f4d576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152600960248201527f554e444546494e45440000000000000000000000000000000000000000000000604482015260640161067f565b60006060612f5a84613747565b03609f8181039490941b90931c6c465772b2bbbb5f824b15207a3081018102606090811d6d0388eaa27412d5aca026815d636e018202811d6d0df99ac502031bf953eff472fdcc018202811d6d13cdffb29d51d99322bdff5f2211018202811d6d0a0f742023def783a307a986912e018202811d6d01920d8043ca89b5239253284e42018202811d6c0b7a86d7375468fac667a0a527016c29508e458543d8aa4df2abee7883018302821d6d0139601a2efabe717e604cbb4894018302821d6d02247f7a7b6594320649aa03aba1018302821d7fffffffffffffffffffffffffffffffffffffff73c0c716a594e00d54e3c4cbc9018302821d7ffffffffffffffffffffffffffffffffffffffdc7b88c420e53a9890533129f6f01830290911d7fffffffffffffffffffffffffffffffffffffff465fda27eb4d63ded474e5f832019091027ffffffffffffffff5f6af8f7b3396644f18e157960000000000000000000000000105711340daa0d5f769dba1915cef59f0815a5506027d0267a36c0c95b3975ab3ee5b203a7614a3f75373f047d803ae7b6687f2b393909302929092017d57115e47018c7177eebf7cd370a3356a1b7863008a5ae8028c72b88642840160ae1d92915050565b60007ffffffffffffffffffffffffffffffffffffffffffffffffdb731c958f34d94c1821361315757506000919050565b680755bf798b4a1bf1e582126131c9576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152600c60248201527f4558505f4f564552464c4f570000000000000000000000000000000000000000604482015260640161067f565b6503782dace9d9604e83901b059150600060606bb17217f7d1cf79abc9e3b39884821b056b80000000000000000000000001901d6bb17217f7d1cf79abc9e3b39881029093037fffffffffffffffffffffffffffffffffffffffdbf3ccf1604d263450f02a550481018102606090811d6d0277594991cfc85f6e2461837cd9018202811d7fffffffffffffffffffffffffffffffffffffe5adedaa1cb095af9e4da10e363c018202811d6db1bbb201f443cf962f1a1d3db4a5018202811d7ffffffffffffffffffffffffffffffffffffd38dc772608b0ae56cce01296c0eb018202811d6e05180bb14799ab47a8a8cb2a527d57016d02d16720577bd19bf614176fe9ea6c10fe68e7fd37d0007b713f765084018402831d9081019084017ffffffffffffffffffffffffffffffffffffffe2c69812cf03b0763fd454a8f7e010290911d6e0587f503bb6ea29d25fcb7401964500190910279d835ebba824c98fb31b83b2ca45c000000000000000000000000010574029d9dc38563c32e5c2f6dc192ee70ef65f9978af30260c3939093039290921c92915050565b80516060908067ffffffffffffffff8111156133835761338361486a565b6040519080825280602002602001820160405280156133c857816020015b60408051808201909152606080825260208201528152602001906001900390816133a15790505b50915060005b8181101561344a5760405180604001604052808583815181106133f3576133f36153ac565b60200260200101518152602001613422868481518110613415576134156153ac565b602002602001015161381d565b815250838281518110613437576134376153ac565b60209081029190910101526001016133ce565b5050919050565b606080604051905082518060011b603f8101601f1916830160405280835250602084016020830160005b838110156134a9578060011b82018184015160001a8060041c8253600f81166001830153505060010161347b565b509295945050505050565b606060008060006134c485613830565b9194509250905060008160018111156134df576134df615420565b1461356c576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152603960248201527f524c505265616465723a206465636f646564206974656d207479706520666f7260448201527f206279746573206973206e6f7420612064617461206974656d00000000000000606482015260840161067f565b6135768284615298565b855114613605576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152603460248201527f524c505265616465723a2062797465732076616c756520636f6e7461696e732060448201527f616e20696e76616c69642072656d61696e646572000000000000000000000000606482015260840161067f565b6123ed8560200151848461429d565b606060208260000151106136305761362b826134b4565b61105f565b61105f82614331565b606061105f6136588360200151600081518110612816576128166153ac565b613451565b60608251821061367c575060408051602081019091526000815261105f565b6122f3838384865161368e9190614f9e565b614347565b60008082518451106136a65782516136a9565b83515b90505b808210801561373057508282815181106136c8576136c86153ac565b602001015160f81c60f81b7effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916848381518110613707576137076153ac565b01602001517fff0000000000000000000000000000000000000000000000000000000000000016145b15613740578160010191506136ac565b5092915050565b60008082116137b2576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152600960248201527f554e444546494e45440000000000000000000000000000000000000000000000604482015260640161067f565b5060016fffffffffffffffffffffffffffffffff821160071b82811c67ffffffffffffffff1060061b1782811c63ffffffff1060051b1782811c61ffff1060041b1782811c60ff10600390811b90911783811c600f1060021b1783811c909110821b1791821c111790565b606061105f61382b8361451f565b614608565b6000806000808460000151116138ee576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152604a60248201527f524c505265616465723a206c656e677468206f6620616e20524c50206974656d60448201527f206d7573742062652067726561746572207468616e207a65726f20746f20626560648201527f206465636f6461626c6500000000000000000000000000000000000000000000608482015260a40161067f565b6020840151805160001a607f8111613913576000600160009450945094505050614296565b60b78111613b21576000613928608083614f9e565b9050808760000151116139e3576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152604e60248201527f524c505265616465723a206c656e677468206f6620636f6e74656e74206d757360448201527f742062652067726561746572207468616e20737472696e67206c656e6774682060648201527f2873686f727420737472696e6729000000000000000000000000000000000000608482015260a40161067f565b6001838101517fff00000000000000000000000000000000000000000000000000000000000000169082141580613a5c57507f80000000000000000000000000000000000000000000000000000000000000007fff00000000000000000000000000000000000000000000000000000000000000821610155b613b0e576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152604d60248201527f524c505265616465723a20696e76616c6964207072656669782c2073696e676c60448201527f652062797465203c203078383020617265206e6f74207072656669786564202860648201527f73686f727420737472696e672900000000000000000000000000000000000000608482015260a40161067f565b5060019550935060009250614296915050565b60bf8111613e6f576000613b3660b783614f9e565b905080876000015111613bf1576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152605160248201527f524c505265616465723a206c656e677468206f6620636f6e74656e74206d757360448201527f74206265203e207468616e206c656e677468206f6620737472696e67206c656e60648201527f67746820286c6f6e6720737472696e6729000000000000000000000000000000608482015260a40161067f565b60018301517fff00000000000000000000000000000000000000000000000000000000000000166000819003613ccf576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152604a60248201527f524c505265616465723a206c656e677468206f6620636f6e74656e74206d757360448201527f74206e6f74206861766520616e79206c656164696e67207a65726f7320286c6f60648201527f6e6720737472696e672900000000000000000000000000000000000000000000608482015260a40161067f565b600184015160088302610100031c60378111613d93576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152604860248201527f524c505265616465723a206c656e677468206f6620636f6e74656e74206d757360448201527f742062652067726561746572207468616e20353520627974657320286c6f6e6760648201527f20737472696e6729000000000000000000000000000000000000000000000000608482015260a40161067f565b613d9d8184615298565b895111613e52576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152604c60248201527f524c505265616465723a206c656e677468206f6620636f6e74656e74206d757360448201527f742062652067726561746572207468616e20746f74616c206c656e677468202860648201527f6c6f6e6720737472696e67290000000000000000000000000000000000000000608482015260a40161067f565b613e5d836001615298565b97509550600094506142969350505050565b60f78111613f50576000613e8460c083614f9e565b905080876000015111613f3f576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152604a60248201527f524c505265616465723a206c656e677468206f6620636f6e74656e74206d757360448201527f742062652067726561746572207468616e206c697374206c656e67746820287360648201527f686f7274206c6973742900000000000000000000000000000000000000000000608482015260a40161067f565b600195509350849250614296915050565b6000613f5d60f783614f9e565b905080876000015111614018576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152604d60248201527f524c505265616465723a206c656e677468206f6620636f6e74656e74206d757360448201527f74206265203e207468616e206c656e677468206f66206c697374206c656e677460648201527f6820286c6f6e67206c6973742900000000000000000000000000000000000000608482015260a40161067f565b60018301517fff000000000000000000000000000000000000000000000000000000000000001660008190036140f6576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152604860248201527f524c505265616465723a206c656e677468206f6620636f6e74656e74206d757360448201527f74206e6f74206861766520616e79206c656164696e67207a65726f7320286c6f60648201527f6e67206c69737429000000000000000000000000000000000000000000000000608482015260a40161067f565b600184015160088302610100031c603781116141ba576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152604660248201527f524c505265616465723a206c656e677468206f6620636f6e74656e74206d757360448201527f742062652067726561746572207468616e20353520627974657320286c6f6e6760648201527f206c697374290000000000000000000000000000000000000000000000000000608482015260a40161067f565b6141c48184615298565b895111614279576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152604a60248201527f524c505265616465723a206c656e677468206f6620636f6e74656e74206d757360448201527f742062652067726561746572207468616e20746f74616c206c656e677468202860648201527f6c6f6e67206c6973742900000000000000000000000000000000000000000000608482015260a40161067f565b614284836001615298565b97509550600194506142969350505050565b9193909250565b60608167ffffffffffffffff8111156142b8576142b861486a565b6040519080825280601f01601f1916602001820160405280156142e2576020820181803683370190505b50905081156122f35760006142f78486615298565b90506020820160005b84811015614318578281015182820152602001614300565b84811115614327576000858301525b5050509392505050565b606061105f82602001516000846000015161429d565b60608182601f0110156143b6576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152600e60248201527f736c6963655f6f766572666c6f77000000000000000000000000000000000000604482015260640161067f565b828284011015614422576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152600e60248201527f736c6963655f6f766572666c6f77000000000000000000000000000000000000604482015260640161067f565b8183018451101561448f576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601160248201527f736c6963655f6f75744f66426f756e6473000000000000000000000000000000604482015260640161067f565b6060821580156144ae5760405191506000825260208201604052614516565b6040519150601f8416801560200281840101858101878315602002848b0101015b818310156144e75780518352602092830192016144cf565b5050858452601f017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe016604052505b50949350505050565b604080518082019091526000808252602082015260008251116145ea576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152604a60248201527f524c505265616465723a206c656e677468206f6620616e20524c50206974656d60448201527f206d7573742062652067726561746572207468616e207a65726f20746f20626560648201527f206465636f6461626c6500000000000000000000000000000000000000000000608482015260a40161067f565b50604080518082019091528151815260209182019181019190915290565b6060600080600061461885613830565b91945092509050600181600181111561463357614633615420565b146146c0576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152603860248201527f524c505265616465723a206465636f646564206974656d207479706520666f7260448201527f206c697374206973206e6f742061206c697374206974656d0000000000000000606482015260840161067f565b84516146cc8385615298565b14614759576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152603260248201527f524c505265616465723a206c697374206974656d2068617320616e20696e766160448201527f6c696420646174612072656d61696e6465720000000000000000000000000000606482015260840161067f565b604080516020808252610420820190925290816020015b60408051808201909152600080825260208201528152602001906001900390816147705790505093506000835b865181101561485e576000806147e36040518060400160405280858c600001516147c79190614f9e565b8152602001858c602001516147dc9190615298565b9052613830565b5091509150604051806040016040528083836147ff9190615298565b8152602001848b602001516148149190615298565b815250888581518110614829576148296153ac565b602090810291909101015261483f600185615298565b935061484b8183615298565b6148559084615298565b9250505061479d565b50845250919392505050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b604051601f82017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe016810167ffffffffffffffff811182821017156148e0576148e061486a565b604052919050565b73ffffffffffffffffffffffffffffffffffffffff8116811461490a57600080fd5b50565b600082601f83011261491e57600080fd5b813567ffffffffffffffff8111156149385761493861486a565b61496960207fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0601f84011601614899565b81815284602083860101111561497e57600080fd5b816020850160208301376000918101602001919091529392505050565b600060c082840312156149ad57600080fd5b60405160c0810167ffffffffffffffff82821081831117156149d1576149d161486a565b8160405282935084358352602085013591506149ec826148e8565b81602084015260408501359150614a02826148e8565b816040840152606085013560608401526080850135608084015260a0850135915080821115614a3057600080fd5b50614a3d8582860161490d565b60a0830152505092915050565b600080600080600085870360e0811215614a6357600080fd5b863567ffffffffffffffff80821115614a7b57600080fd5b614a878a838b0161499b565b97506020890135965060807fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc084011215614ac057600080fd5b60408901955060c0890135925080831115614ada57600080fd5b828901925089601f840112614aee57600080fd5b8235915080821115614aff57600080fd5b508860208260051b8401011115614b1557600080fd5b959894975092955050506020019190565b60005b83811015614b41578181015183820152602001614b29565b83811115614b50576000848401525b50505050565b60008151808452614b6e816020860160208601614b26565b601f017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0169290920160200192915050565b6020815260006122f36020830184614b56565b600060208284031215614bc557600080fd5b5035919050565b600060208284031215614bde57600080fd5b813567ffffffffffffffff811115614bf557600080fd5b614c018482850161499b565b949350505050565b803567ffffffffffffffff81168114614c2157600080fd5b919050565b600060208284031215614c3857600080fd5b6122f382614c09565b80358015158114614c2157600080fd5b600080600080600060a08688031215614c6957600080fd5b8535614c74816148e8565b945060208601359350614c8960408701614c09565b9250614c9760608701614c41565b9150608086013567ffffffffffffffff811115614cb357600080fd5b614cbf8882890161490d565b9150509295509295909350565b60008060008060808587031215614ce257600080fd5b8435614ced816148e8565b93506020850135614cfd816148e8565b92506040850135614d0d816148e8565b9150614d1b60608601614c41565b905092959194509250565b8581528460208201527fffffffffffffffff0000000000000000000000000000000000000000000000008460c01b16604082015282151560f81b604882015260008251614d7a816049850160208701614b26565b919091016049019695505050505050565b80516fffffffffffffffffffffffffffffffff81168114614c2157600080fd5b600060608284031215614dbd57600080fd5b6040516060810181811067ffffffffffffffff82111715614de057614de061486a565b60405282518152614df360208401614d8b565b6020820152614e0460408401614d8b565b60408201529392505050565b600060808284031215614e2257600080fd5b6040516080810181811067ffffffffffffffff82111715614e4557614e4561486a565b8060405250823581526020830135602082015260408301356040820152606083013560608201528091505092915050565b600067ffffffffffffffff80841115614e9157614e9161486a565b8360051b6020614ea2818301614899565b868152918501918181019036841115614eba57600080fd5b865b84811015614eee57803586811115614ed45760008081fd5b614ee036828b0161490d565b845250918301918301614ebc565b50979650505050505050565b600060208284031215614f0c57600080fd5b5051919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b600067ffffffffffffffff80831681851681830481118215151615614f6957614f69614f13565b02949350505050565b600067ffffffffffffffff808316818516808303821115614f9557614f95614f13565b01949350505050565b600082821015614fb057614fb0614f13565b500390565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601260045260246000fd5b600082614ff357614ff3614fb5565b7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff83147f80000000000000000000000000000000000000000000000000000000000000008314161561504757615047614f13565b500590565b6000808312837f80000000000000000000000000000000000000000000000000000000000000000183128115161561508657615086614f13565b837f7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0183138116156150ba576150ba614f13565b50500390565b60007f7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff60008413600084138583048511828216161561510157615101614f13565b7f8000000000000000000000000000000000000000000000000000000000000000600087128682058812818416161561513c5761513c614f13565b6000871292508782058712848416161561515857615158614f13565b8785058712818416161561516e5761516e614f13565b505050929093029392505050565b6000808212827f7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff038413811516156151b6576151b6614f13565b827f80000000000000000000000000000000000000000000000000000000000000000384128116156151ea576151ea614f13565b50500190565b6000817fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff048311821515161561522857615228614f13565b500290565b60008261523c5761523c614fb5565b500490565b868152600073ffffffffffffffffffffffffffffffffffffffff808816602084015280871660408401525084606083015283608083015260c060a083015261528c60c0830184614b56565b98975050505050505050565b600082198211156152ab576152ab614f13565b500190565b805163ffffffff81168114614c2157600080fd5b805160ff81168114614c2157600080fd5b600060c082840312156152e757600080fd5b60405160c0810181811067ffffffffffffffff8211171561530a5761530a61486a565b604052615316836152b0565b8152615324602084016152c4565b6020820152615335604084016152c4565b6040820152615346606084016152b0565b6060820152615357608084016152b0565b608082015261536860a08401614d8b565b60a08201529392505050565b60007fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff82036153a5576153a5614f13565b5060010190565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b600060ff8316806153ee576153ee614fb5565b8060ff84160691505092915050565b600060ff821660ff84168082101561541757615417614f13565b90039392505050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602160045260246000fdfea164736f6c634300080f000a", - "sourceMap": "1135:20265:110:-:0;;;4982:219;;;;;;;;;-1:-1:-1;5006:188:110;5065:1;;;5179:4;5006:10;:188::i;:::-;1135:20265;;5491:423;4396:13:36;;2762:1:158;;4396:13:36;;;;;4395:14;:40;;;;-1:-1:-1;4413:12:36;;:22;;;;:12;;:22;4395:40;4387:99;;;;-1:-1:-1;;;4387:99:36;;216:2:285;4387:99:36;;;198:21:285;255:2;235:18;;;228:30;294:34;274:18;;;267:62;-1:-1:-1;;;345:18:285;;;338:44;399:19;;4387:99:36;;;;;;;;;4496:12;:22;;-1:-1:-1;;4528:20:36;4496:22;;;4528:20;4496:22;4528:20;;;;;;5710:8:110::1;:38:::0;;-1:-1:-1;;;;;;5710:38:110;;::::1;1337:42:158;5710:38:110;::::0;;;5758:8:::1;:20:::0;;5788:12:::1;:28:::0;;-1:-1:-1;;;;;5788:28:110;;::::1;::::0;;::::1;::::0;;;::::1;::::0;;;5826:8:::1;:20:::0;;;;::::1;::::0;::::1;::::0;;;::::1;::::0;;;5856:16;::::1;;5758:20:::0;;::::1;::::0;;::::1;-1:-1:-1::0;;5856:16:110;-1:-1:-1;;;;;;5856:16:110;;;;;;;::::1;::::0;;5882:25:::1;:23;:25::i;:::-;4585:5:36::0;4569:21;;-1:-1:-1;;4569:21:36;;;4605:20;;601:4:285;589:17;;571:36;;4605:20:36;;559:2:285;544:18;4605:20:36;;;;;;;5491:423:110;;;;;:::o;8362:180:112:-;4888:13:36;;;;;;;4880:69;;;;-1:-1:-1;;;4880:69:36;;820:2:285;4880:69:36;;;802:21:285;859:2;839:18;;;832:30;898:34;878:18;;;871:62;-1:-1:-1;;;949:18:285;;;942:41;1000:19;;4880:69:36;618:407:285;4880:69:36;8442:93:112::1;::::0;;::::1;::::0;::::1;::::0;;8472:6:::1;8442:93:::0;;;-1:-1:-1;8442:93:112::1;::::0;::::1;::::0;8519:12:::1;-1:-1:-1::0;;;;;8442:93:112::1;::::0;;;;;;;-1:-1:-1;;;8433:102:112::1;;:6;:102:::0;8362:180::o;618:407:285:-;1135:20265:110;;;;;;", - "linkReferences": {} - }, - "deployedBytecode": { - "object": "0x60806040526004361061016d5760003560e01c80638b4c40b0116100cb578063a35d99df1161007f578063e9e05c4211610059578063e9e05c4214610573578063f049875014610586578063fecf9734146105b157600080fd5b8063a35d99df1461040d578063cff0ab9614610446578063e965084c146104e757600080fd5b80639b5f694a116100b05780639b5f694a1461037e5780639bf62d82146103b0578063a14238e7146103dd57600080fd5b80638b4c40b0146101925780638c3152e91461035e57600080fd5b806354fd4d50116101225780636dbffb78116101075780636dbffb78146102fe578063724c184c1461031e5780638456cb591461034957600080fd5b806354fd4d501461027e5780635c975abb146102d457600080fd5b80633f4ba83a116101535780633f4ba83a1461021c578063452a9320146102315780634870496f1461025e57600080fd5b80621c2ff61461019957806333d7e2bd146101ef57600080fd5b36610194576101923334620186a06000604051806020016040528060008152506105d1565b005b600080fd5b3480156101a557600080fd5b50603554610100900473ffffffffffffffffffffffffffffffffffffffff165b60405173ffffffffffffffffffffffffffffffffffffffff90911681526020015b60405180910390f35b3480156101fb57600080fd5b506036546101c59073ffffffffffffffffffffffffffffffffffffffff1681565b34801561022857600080fd5b5061019261086c565b34801561023d57600080fd5b506037546101c59073ffffffffffffffffffffffffffffffffffffffff1681565b34801561026a57600080fd5b50610192610279366004614a4a565b610971565b34801561028a57600080fd5b506102c76040518060400160405280600681526020017f312e31302e30000000000000000000000000000000000000000000000000000081525081565b6040516101e69190614ba0565b3480156102e057600080fd5b506035546102ee9060ff1681565b60405190151581526020016101e6565b34801561030a57600080fd5b506102ee610319366004614bb3565b610fa6565b34801561032a57600080fd5b5060375473ffffffffffffffffffffffffffffffffffffffff166101c5565b34801561035557600080fd5b50610192611065565b34801561036a57600080fd5b50610192610379366004614bcc565b611167565b34801561038a57600080fd5b506035546101c590610100900473ffffffffffffffffffffffffffffffffffffffff1681565b3480156103bc57600080fd5b506032546101c59073ffffffffffffffffffffffffffffffffffffffff1681565b3480156103e957600080fd5b506102ee6103f8366004614bb3565b60336020526000908152604090205460ff1681565b34801561041957600080fd5b5061042d610428366004614c26565b611a2b565b60405167ffffffffffffffff90911681526020016101e6565b34801561045257600080fd5b506001546104ae906fffffffffffffffffffffffffffffffff81169067ffffffffffffffff7001000000000000000000000000000000008204811691780100000000000000000000000000000000000000000000000090041683565b604080516fffffffffffffffffffffffffffffffff909416845267ffffffffffffffff92831660208501529116908201526060016101e6565b3480156104f357600080fd5b50610545610502366004614bb3565b603460205260009081526040902080546001909101546fffffffffffffffffffffffffffffffff8082169170010000000000000000000000000000000090041683565b604080519384526fffffffffffffffffffffffffffffffff92831660208501529116908201526060016101e6565b610192610581366004614c51565b6105d1565b34801561059257600080fd5b5060365473ffffffffffffffffffffffffffffffffffffffff166101c5565b3480156105bd57600080fd5b506101926105cc366004614ccc565b611a44565b8260005a905083156106885773ffffffffffffffffffffffffffffffffffffffff87161561068857604080517f08c379a00000000000000000000000000000000000000000000000000000000081526020600482015260248101919091527f4f7074696d69736d506f7274616c3a206d7573742073656e6420746f2061646460448201527f72657373283029207768656e206372656174696e67206120636f6e747261637460648201526084015b60405180910390fd5b6106928351611a2b565b67ffffffffffffffff168567ffffffffffffffff161015610735576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602360248201527f4f7074696d69736d506f7274616c3a20676173206c696d697420746f6f20736d60448201527f616c6c0000000000000000000000000000000000000000000000000000000000606482015260840161067f565b6201d4c0835111156107a3576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601e60248201527f4f7074696d69736d506f7274616c3a206461746120746f6f206c617267650000604482015260640161067f565b333281146107c4575033731111000000000000000000000000000000001111015b600034888888886040516020016107df959493929190614d26565b604051602081830303815290604052905060008973ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff167fb3813568d9991fc951961fcb4c784893574240a28925604d09fc577c55bb7c328460405161084f9190614ba0565b60405180910390a450506108638282611c52565b50505050505050565b60375473ffffffffffffffffffffffffffffffffffffffff163314610913576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602960248201527f4f7074696d69736d506f7274616c3a206f6e6c7920677561726469616e20636160448201527f6e20756e70617573650000000000000000000000000000000000000000000000606482015260840161067f565b603580547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff001690556040513381527f5db9ee0a495bf2e6ff9c91a7834c1ba4fdd244a5e8aa4e537bd38aeae4b073aa906020015b60405180910390a1565b60355460ff16156109de576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601660248201527f4f7074696d69736d506f7274616c3a2070617573656400000000000000000000604482015260640161067f565b3073ffffffffffffffffffffffffffffffffffffffff16856040015173ffffffffffffffffffffffffffffffffffffffff1603610a9d576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152603f60248201527f4f7074696d69736d506f7274616c3a20796f752063616e6e6f742073656e642060448201527f6d6573736167657320746f2074686520706f7274616c20636f6e747261637400606482015260840161067f565b6035546040517fa25ae55700000000000000000000000000000000000000000000000000000000815260048101869052600091610100900473ffffffffffffffffffffffffffffffffffffffff169063a25ae55790602401606060405180830381865afa158015610b12573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610b369190614dab565b519050610b50610b4b36869003860186614e10565b611f7f565b8114610bde576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602960248201527f4f7074696d69736d506f7274616c3a20696e76616c6964206f7574707574207260448201527f6f6f742070726f6f660000000000000000000000000000000000000000000000606482015260840161067f565b6000610be987611fdb565b6000818152603460209081526040918290208251606081018452815481526001909101546fffffffffffffffffffffffffffffffff8082169383018490527001000000000000000000000000000000009091041692810192909252919250901580610d035750805160355460408084015190517fa25ae5570000000000000000000000000000000000000000000000000000000081526fffffffffffffffffffffffffffffffff909116600482015261010090910473ffffffffffffffffffffffffffffffffffffffff169063a25ae55790602401606060405180830381865afa158015610cdb573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610cff9190614dab565b5114155b610d8f576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152603760248201527f4f7074696d69736d506f7274616c3a207769746864726177616c20686173682060448201527f68617320616c7265616479206265656e2070726f76656e000000000000000000606482015260840161067f565b60408051602081018490526000918101829052606001604080517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe081840301815282825280516020918201209083018190529250610e589101604080517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0818403018152828201909152600182527f0100000000000000000000000000000000000000000000000000000000000000602083015290610e4e888a614e76565b8a6040013561200b565b610ee4576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152603260248201527f4f7074696d69736d506f7274616c3a20696e76616c696420776974686472617760448201527f616c20696e636c7573696f6e2070726f6f660000000000000000000000000000606482015260840161067f565b604080516060810182528581526fffffffffffffffffffffffffffffffff42811660208084019182528c831684860190815260008981526034835286812095518655925190518416700100000000000000000000000000000000029316929092176001909301929092558b830151908c0151925173ffffffffffffffffffffffffffffffffffffffff918216939091169186917f67a6208cfcc0801d50f6cbe764733f4fddf66ac0b04442061a8a8c0cb6b63f629190a4505050505050505050565b6035546040517fa25ae5570000000000000000000000000000000000000000000000000000000081526004810183905260009161105f9161010090910473ffffffffffffffffffffffffffffffffffffffff169063a25ae55790602401606060405180830381865afa158015611020573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906110449190614dab565b602001516fffffffffffffffffffffffffffffffff1661202f565b92915050565b60375473ffffffffffffffffffffffffffffffffffffffff16331461110c576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602760248201527f4f7074696d69736d506f7274616c3a206f6e6c7920677561726469616e20636160448201527f6e20706175736500000000000000000000000000000000000000000000000000606482015260840161067f565b603580547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff001660011790556040513381527f62e78cea01bee320cd4e420270b5ea74000d11b0c9f74754ebdbfc544b05a25890602001610967565b60355460ff16156111d4576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601660248201527f4f7074696d69736d506f7274616c3a2070617573656400000000000000000000604482015260640161067f565b60325473ffffffffffffffffffffffffffffffffffffffff1661dead1461127d576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152603f60248201527f4f7074696d69736d506f7274616c3a2063616e206f6e6c79207472696767657260448201527f206f6e65207769746864726177616c20706572207472616e73616374696f6e00606482015260840161067f565b600061128882611fdb565b60008181526034602090815260408083208151606081018352815481526001909101546fffffffffffffffffffffffffffffffff80821694830185905270010000000000000000000000000000000090910416918101919091529293509003611373576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152603260248201527f4f7074696d69736d506f7274616c3a207769746864726177616c20686173206e60448201527f6f74206265656e2070726f76656e207965740000000000000000000000000000606482015260840161067f565b603560019054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1663887862726040518163ffffffff1660e01b8152600401602060405180830381865afa1580156113e0573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906114049190614efa565b81602001516fffffffffffffffffffffffffffffffff1610156114cf576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152604b60248201527f4f7074696d69736d506f7274616c3a207769746864726177616c2074696d657360448201527f74616d70206c657373207468616e204c32204f7261636c65207374617274696e60648201527f672074696d657374616d70000000000000000000000000000000000000000000608482015260a40161067f565b6114ee81602001516fffffffffffffffffffffffffffffffff1661202f565b6115a0576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152604560248201527f4f7074696d69736d506f7274616c3a2070726f76656e2077697468647261776160448201527f6c2066696e616c697a6174696f6e20706572696f6420686173206e6f7420656c60648201527f6170736564000000000000000000000000000000000000000000000000000000608482015260a40161067f565b60355460408281015190517fa25ae5570000000000000000000000000000000000000000000000000000000081526fffffffffffffffffffffffffffffffff9091166004820152600091610100900473ffffffffffffffffffffffffffffffffffffffff169063a25ae55790602401606060405180830381865afa15801561162c573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906116509190614dab565b825181519192501461170a576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152604960248201527f4f7074696d69736d506f7274616c3a206f757470757420726f6f742070726f7660448201527f656e206973206e6f74207468652073616d652061732063757272656e74206f7560648201527f7470757420726f6f740000000000000000000000000000000000000000000000608482015260a40161067f565b61172981602001516fffffffffffffffffffffffffffffffff1661202f565b6117db576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152604360248201527f4f7074696d69736d506f7274616c3a206f75747075742070726f706f73616c2060448201527f66696e616c697a6174696f6e20706572696f6420686173206e6f7420656c617060648201527f7365640000000000000000000000000000000000000000000000000000000000608482015260a40161067f565b60008381526033602052604090205460ff161561187a576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152603560248201527f4f7074696d69736d506f7274616c3a207769746864726177616c20686173206160448201527f6c7265616479206265656e2066696e616c697a65640000000000000000000000606482015260840161067f565b600083815260336020908152604080832080547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00166001179055908601516032805473ffffffffffffffffffffffffffffffffffffffff9092167fffffffffffffffffffffffff00000000000000000000000000000000000000009092169190911790558501516080860151606087015160a088015161191c939291906120d4565b603280547fffffffffffffffffffffffff00000000000000000000000000000000000000001661dead17905560405190915084907fdb5c7652857aa163daadd670e116628fb42e869d8ac4251ef8971d9e5727df1b9061198190841515815260200190565b60405180910390a2801580156119975750326001145b15611a24576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602160248201527f4f7074696d69736d506f7274616c3a207769746864726177616c206661696c6560448201527f6400000000000000000000000000000000000000000000000000000000000000606482015260840161067f565b5050505050565b6000611a38826010614f42565b61105f90615208614f72565b600054600390610100900460ff16158015611a66575060005460ff8083169116105b611af2576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602e60248201527f496e697469616c697a61626c653a20636f6e747261637420697320616c72656160448201527f647920696e697469616c697a6564000000000000000000000000000000000000606482015260840161067f565b600080547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00001660ff831617610100908117909155603280547fffffffffffffffffffffffff000000000000000000000000000000000000000090811661dead17909155603580546036805473ffffffffffffffffffffffffffffffffffffffff89811691861691909117909155603780548a83169516949094179093558515159289169093027fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00167fffffffffffffffffffffff00000000000000000000000000000000000000000090931692909217179055611bed612132565b600080547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00ff16905560405160ff821681527f7f26b83ff96e1f2b6a682f133852f6798a09c465da95921460cefb38474024989060200160405180910390a15050505050565b600154600090611c88907801000000000000000000000000000000000000000000000000900467ffffffffffffffff1643614f9e565b90506000611c94612215565b90506000816020015160ff16826000015163ffffffff16611cb59190614fe4565b90508215611dec57600154600090611cec908390700100000000000000000000000000000000900467ffffffffffffffff1661504c565b90506000836040015160ff1683611d0391906150c0565b600154611d239084906fffffffffffffffffffffffffffffffff166150c0565b611d2d9190614fe4565b600154909150600090611d7e90611d579084906fffffffffffffffffffffffffffffffff1661517c565b866060015163ffffffff168760a001516fffffffffffffffffffffffffffffffff166122db565b90506001861115611dad57611daa611d5782876040015160ff1660018a611da59190614f9e565b6122fa565b90505b6fffffffffffffffffffffffffffffffff16780100000000000000000000000000000000000000000000000067ffffffffffffffff4316021760015550505b60018054869190601090611e1f908490700100000000000000000000000000000000900467ffffffffffffffff16614f72565b92506101000a81548167ffffffffffffffff021916908367ffffffffffffffff160217905550816000015163ffffffff16600160000160109054906101000a900467ffffffffffffffff1667ffffffffffffffff161315611f02576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152603e60248201527f5265736f757263654d65746572696e673a2063616e6e6f7420627579206d6f7260448201527f6520676173207468616e20617661696c61626c6520676173206c696d69740000606482015260840161067f565b600154600090611f2e906fffffffffffffffffffffffffffffffff1667ffffffffffffffff88166151f0565b90506000611f4048633b9aca0061234f565b611f4a908361522d565b905060005a611f599088614f9e565b905080821115611f7557611f75611f708284614f9e565b612366565b5050505050505050565b60008160000151826020015183604001518460600151604051602001611fbe949392919093845260208401929092526040830152606082015260800190565b604051602081830303815290604052805190602001209050919050565b80516020808301516040808501516060860151608087015160a08801519351600097611fbe979096959101615241565b60008061201786612394565b9050612025818686866123c6565b9695505050505050565b6000603560019054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1663f4daa2916040518163ffffffff1660e01b8152600401602060405180830381865afa15801561209e573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906120c29190614efa565b6120cc9083615298565b421192915050565b60008060006120e48660006123f6565b90508061211a576308c379a06000526020805278185361666543616c6c3a204e6f7420656e6f756768206761736058526064601cfd5b600080855160208701888b5af1979650505050505050565b600054610100900460ff166121c9576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602b60248201527f496e697469616c697a61626c653a20636f6e7472616374206973206e6f74206960448201527f6e697469616c697a696e67000000000000000000000000000000000000000000606482015260840161067f565b60408051606081018252633b9aca00808252600060208301524367ffffffffffffffff169190920181905278010000000000000000000000000000000000000000000000000217600155565b6040805160c08082018352600080835260208301819052828401819052606083018190526080830181905260a083015260365483517fcc731b020000000000000000000000000000000000000000000000000000000081529351929373ffffffffffffffffffffffffffffffffffffffff9091169263cc731b02926004808401939192918290030181865afa1580156122b2573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906122d691906152d5565b905090565b60006122f06122ea8585612414565b83612424565b90505b9392505050565b6000670de0b6b3a764000061233b6123128583614fe4565b61232490670de0b6b3a764000061504c565b61233685670de0b6b3a76400006150c0565b612433565b61234590866150c0565b6122f09190614fe4565b60008183101561235f57816122f3565b5090919050565b6000805a90505b825a6123799083614f9e565b101561238f5761238882615374565b915061236d565b505050565b606081805190602001206040516020016123b091815260200190565b6040516020818303038152906040529050919050565b60006123ed846123d7878686612464565b8051602091820120825192909101919091201490565b95945050505050565b600080603f83619c4001026040850201603f5a021015949350505050565b60008183121561235f57816122f3565b600081831261235f57816122f3565b60006122f3670de0b6b3a76400008361244b86612ee2565b61245591906150c0565b61245f9190614fe4565b613126565b606060008451116124d1576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601560248201527f4d65726b6c65547269653a20656d707479206b65790000000000000000000000604482015260640161067f565b60006124dc84613365565b905060006124e986613451565b905060008460405160200161250091815260200190565b60405160208183030381529060405290506000805b8451811015612e59576000858281518110612532576125326153ac565b6020026020010151905084518311156125cd576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602e60248201527f4d65726b6c65547269653a206b657920696e646578206578636565647320746f60448201527f74616c206b6579206c656e677468000000000000000000000000000000000000606482015260840161067f565b82600003612686578051805160209182012060405161261b926125f592910190815260200190565b604051602081830303815290604052858051602091820120825192909101919091201490565b612681576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601d60248201527f4d65726b6c65547269653a20696e76616c696420726f6f742068617368000000604482015260640161067f565b6127dd565b80515160201161273c57805180516020918201206040516126b0926125f592910190815260200190565b612681576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602760248201527f4d65726b6c65547269653a20696e76616c6964206c6172676520696e7465726e60448201527f616c206861736800000000000000000000000000000000000000000000000000606482015260840161067f565b8051845160208087019190912082519190920120146127dd576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602660248201527f4d65726b6c65547269653a20696e76616c696420696e7465726e616c206e6f6460448201527f6520686173680000000000000000000000000000000000000000000000000000606482015260840161067f565b6127e960106001615298565b816020015151036129c5578451830361295d576128238160200151601081518110612816576128166153ac565b60200260200101516134b4565b965060008751116128b6576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152603b60248201527f4d65726b6c65547269653a2076616c7565206c656e677468206d75737420626560448201527f2067726561746572207468616e207a65726f20286272616e6368290000000000606482015260840161067f565b600186516128c49190614f9e565b8214612952576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152603a60248201527f4d65726b6c65547269653a2076616c7565206e6f6465206d757374206265206c60448201527f617374206e6f646520696e2070726f6f6620286272616e636829000000000000606482015260840161067f565b5050505050506122f3565b6000858481518110612971576129716153ac565b602001015160f81c60f81b60f81c9050600082602001518260ff168151811061299c5761299c6153ac565b602002602001015190506129af81613614565b95506129bc600186615298565b94505050612e46565b600281602001515103612dbe5760006129dd82613639565b90506000816000815181106129f4576129f46153ac565b016020015160f81c90506000612a0b6002836153db565b612a169060026153fd565b90506000612a27848360ff1661365d565b90506000612a358a8961365d565b90506000612a438383613693565b905080835114612ad5576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152603a60248201527f4d65726b6c65547269653a20706174682072656d61696e646572206d7573742060448201527f736861726520616c6c206e6962626c65732077697468206b6579000000000000606482015260840161067f565b60ff851660021480612aea575060ff85166003145b15612cd95780825114612b7f576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152603d60248201527f4d65726b6c65547269653a206b65792072656d61696e646572206d757374206260448201527f65206964656e746963616c20746f20706174682072656d61696e646572000000606482015260840161067f565b612b998760200151600181518110612816576128166153ac565b9c5060008d5111612c2c576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152603960248201527f4d65726b6c65547269653a2076616c7565206c656e677468206d75737420626560448201527f2067726561746572207468616e207a65726f20286c6561662900000000000000606482015260840161067f565b60018c51612c3a9190614f9e565b8814612cc8576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152603860248201527f4d65726b6c65547269653a2076616c7565206e6f6465206d757374206265206c60448201527f617374206e6f646520696e2070726f6f6620286c656166290000000000000000606482015260840161067f565b5050505050505050505050506122f3565b60ff85161580612cec575060ff85166001145b15612d2b57612d188760200151600181518110612d0b57612d0b6153ac565b6020026020010151613614565b9950612d24818a615298565b9850612db3565b6040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152603260248201527f4d65726b6c65547269653a2072656365697665642061206e6f6465207769746860448201527f20616e20756e6b6e6f776e207072656669780000000000000000000000000000606482015260840161067f565b505050505050612e46565b6040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602860248201527f4d65726b6c65547269653a20726563656976656420616e20756e70617273656160448201527f626c65206e6f6465000000000000000000000000000000000000000000000000606482015260840161067f565b5080612e5181615374565b915050612515565b506040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602560248201527f4d65726b6c65547269653a2072616e206f7574206f662070726f6f6620656c6560448201527f6d656e7473000000000000000000000000000000000000000000000000000000606482015260840161067f565b6000808213612f4d576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152600960248201527f554e444546494e45440000000000000000000000000000000000000000000000604482015260640161067f565b60006060612f5a84613747565b03609f8181039490941b90931c6c465772b2bbbb5f824b15207a3081018102606090811d6d0388eaa27412d5aca026815d636e018202811d6d0df99ac502031bf953eff472fdcc018202811d6d13cdffb29d51d99322bdff5f2211018202811d6d0a0f742023def783a307a986912e018202811d6d01920d8043ca89b5239253284e42018202811d6c0b7a86d7375468fac667a0a527016c29508e458543d8aa4df2abee7883018302821d6d0139601a2efabe717e604cbb4894018302821d6d02247f7a7b6594320649aa03aba1018302821d7fffffffffffffffffffffffffffffffffffffff73c0c716a594e00d54e3c4cbc9018302821d7ffffffffffffffffffffffffffffffffffffffdc7b88c420e53a9890533129f6f01830290911d7fffffffffffffffffffffffffffffffffffffff465fda27eb4d63ded474e5f832019091027ffffffffffffffff5f6af8f7b3396644f18e157960000000000000000000000000105711340daa0d5f769dba1915cef59f0815a5506027d0267a36c0c95b3975ab3ee5b203a7614a3f75373f047d803ae7b6687f2b393909302929092017d57115e47018c7177eebf7cd370a3356a1b7863008a5ae8028c72b88642840160ae1d92915050565b60007ffffffffffffffffffffffffffffffffffffffffffffffffdb731c958f34d94c1821361315757506000919050565b680755bf798b4a1bf1e582126131c9576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152600c60248201527f4558505f4f564552464c4f570000000000000000000000000000000000000000604482015260640161067f565b6503782dace9d9604e83901b059150600060606bb17217f7d1cf79abc9e3b39884821b056b80000000000000000000000001901d6bb17217f7d1cf79abc9e3b39881029093037fffffffffffffffffffffffffffffffffffffffdbf3ccf1604d263450f02a550481018102606090811d6d0277594991cfc85f6e2461837cd9018202811d7fffffffffffffffffffffffffffffffffffffe5adedaa1cb095af9e4da10e363c018202811d6db1bbb201f443cf962f1a1d3db4a5018202811d7ffffffffffffffffffffffffffffffffffffd38dc772608b0ae56cce01296c0eb018202811d6e05180bb14799ab47a8a8cb2a527d57016d02d16720577bd19bf614176fe9ea6c10fe68e7fd37d0007b713f765084018402831d9081019084017ffffffffffffffffffffffffffffffffffffffe2c69812cf03b0763fd454a8f7e010290911d6e0587f503bb6ea29d25fcb7401964500190910279d835ebba824c98fb31b83b2ca45c000000000000000000000000010574029d9dc38563c32e5c2f6dc192ee70ef65f9978af30260c3939093039290921c92915050565b80516060908067ffffffffffffffff8111156133835761338361486a565b6040519080825280602002602001820160405280156133c857816020015b60408051808201909152606080825260208201528152602001906001900390816133a15790505b50915060005b8181101561344a5760405180604001604052808583815181106133f3576133f36153ac565b60200260200101518152602001613422868481518110613415576134156153ac565b602002602001015161381d565b815250838281518110613437576134376153ac565b60209081029190910101526001016133ce565b5050919050565b606080604051905082518060011b603f8101601f1916830160405280835250602084016020830160005b838110156134a9578060011b82018184015160001a8060041c8253600f81166001830153505060010161347b565b509295945050505050565b606060008060006134c485613830565b9194509250905060008160018111156134df576134df615420565b1461356c576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152603960248201527f524c505265616465723a206465636f646564206974656d207479706520666f7260448201527f206279746573206973206e6f7420612064617461206974656d00000000000000606482015260840161067f565b6135768284615298565b855114613605576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152603460248201527f524c505265616465723a2062797465732076616c756520636f6e7461696e732060448201527f616e20696e76616c69642072656d61696e646572000000000000000000000000606482015260840161067f565b6123ed8560200151848461429d565b606060208260000151106136305761362b826134b4565b61105f565b61105f82614331565b606061105f6136588360200151600081518110612816576128166153ac565b613451565b60608251821061367c575060408051602081019091526000815261105f565b6122f3838384865161368e9190614f9e565b614347565b60008082518451106136a65782516136a9565b83515b90505b808210801561373057508282815181106136c8576136c86153ac565b602001015160f81c60f81b7effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916848381518110613707576137076153ac565b01602001517fff0000000000000000000000000000000000000000000000000000000000000016145b15613740578160010191506136ac565b5092915050565b60008082116137b2576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152600960248201527f554e444546494e45440000000000000000000000000000000000000000000000604482015260640161067f565b5060016fffffffffffffffffffffffffffffffff821160071b82811c67ffffffffffffffff1060061b1782811c63ffffffff1060051b1782811c61ffff1060041b1782811c60ff10600390811b90911783811c600f1060021b1783811c909110821b1791821c111790565b606061105f61382b8361451f565b614608565b6000806000808460000151116138ee576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152604a60248201527f524c505265616465723a206c656e677468206f6620616e20524c50206974656d60448201527f206d7573742062652067726561746572207468616e207a65726f20746f20626560648201527f206465636f6461626c6500000000000000000000000000000000000000000000608482015260a40161067f565b6020840151805160001a607f8111613913576000600160009450945094505050614296565b60b78111613b21576000613928608083614f9e565b9050808760000151116139e3576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152604e60248201527f524c505265616465723a206c656e677468206f6620636f6e74656e74206d757360448201527f742062652067726561746572207468616e20737472696e67206c656e6774682060648201527f2873686f727420737472696e6729000000000000000000000000000000000000608482015260a40161067f565b6001838101517fff00000000000000000000000000000000000000000000000000000000000000169082141580613a5c57507f80000000000000000000000000000000000000000000000000000000000000007fff00000000000000000000000000000000000000000000000000000000000000821610155b613b0e576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152604d60248201527f524c505265616465723a20696e76616c6964207072656669782c2073696e676c60448201527f652062797465203c203078383020617265206e6f74207072656669786564202860648201527f73686f727420737472696e672900000000000000000000000000000000000000608482015260a40161067f565b5060019550935060009250614296915050565b60bf8111613e6f576000613b3660b783614f9e565b905080876000015111613bf1576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152605160248201527f524c505265616465723a206c656e677468206f6620636f6e74656e74206d757360448201527f74206265203e207468616e206c656e677468206f6620737472696e67206c656e60648201527f67746820286c6f6e6720737472696e6729000000000000000000000000000000608482015260a40161067f565b60018301517fff00000000000000000000000000000000000000000000000000000000000000166000819003613ccf576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152604a60248201527f524c505265616465723a206c656e677468206f6620636f6e74656e74206d757360448201527f74206e6f74206861766520616e79206c656164696e67207a65726f7320286c6f60648201527f6e6720737472696e672900000000000000000000000000000000000000000000608482015260a40161067f565b600184015160088302610100031c60378111613d93576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152604860248201527f524c505265616465723a206c656e677468206f6620636f6e74656e74206d757360448201527f742062652067726561746572207468616e20353520627974657320286c6f6e6760648201527f20737472696e6729000000000000000000000000000000000000000000000000608482015260a40161067f565b613d9d8184615298565b895111613e52576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152604c60248201527f524c505265616465723a206c656e677468206f6620636f6e74656e74206d757360448201527f742062652067726561746572207468616e20746f74616c206c656e677468202860648201527f6c6f6e6720737472696e67290000000000000000000000000000000000000000608482015260a40161067f565b613e5d836001615298565b97509550600094506142969350505050565b60f78111613f50576000613e8460c083614f9e565b905080876000015111613f3f576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152604a60248201527f524c505265616465723a206c656e677468206f6620636f6e74656e74206d757360448201527f742062652067726561746572207468616e206c697374206c656e67746820287360648201527f686f7274206c6973742900000000000000000000000000000000000000000000608482015260a40161067f565b600195509350849250614296915050565b6000613f5d60f783614f9e565b905080876000015111614018576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152604d60248201527f524c505265616465723a206c656e677468206f6620636f6e74656e74206d757360448201527f74206265203e207468616e206c656e677468206f66206c697374206c656e677460648201527f6820286c6f6e67206c6973742900000000000000000000000000000000000000608482015260a40161067f565b60018301517fff000000000000000000000000000000000000000000000000000000000000001660008190036140f6576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152604860248201527f524c505265616465723a206c656e677468206f6620636f6e74656e74206d757360448201527f74206e6f74206861766520616e79206c656164696e67207a65726f7320286c6f60648201527f6e67206c69737429000000000000000000000000000000000000000000000000608482015260a40161067f565b600184015160088302610100031c603781116141ba576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152604660248201527f524c505265616465723a206c656e677468206f6620636f6e74656e74206d757360448201527f742062652067726561746572207468616e20353520627974657320286c6f6e6760648201527f206c697374290000000000000000000000000000000000000000000000000000608482015260a40161067f565b6141c48184615298565b895111614279576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152604a60248201527f524c505265616465723a206c656e677468206f6620636f6e74656e74206d757360448201527f742062652067726561746572207468616e20746f74616c206c656e677468202860648201527f6c6f6e67206c6973742900000000000000000000000000000000000000000000608482015260a40161067f565b614284836001615298565b97509550600194506142969350505050565b9193909250565b60608167ffffffffffffffff8111156142b8576142b861486a565b6040519080825280601f01601f1916602001820160405280156142e2576020820181803683370190505b50905081156122f35760006142f78486615298565b90506020820160005b84811015614318578281015182820152602001614300565b84811115614327576000858301525b5050509392505050565b606061105f82602001516000846000015161429d565b60608182601f0110156143b6576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152600e60248201527f736c6963655f6f766572666c6f77000000000000000000000000000000000000604482015260640161067f565b828284011015614422576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152600e60248201527f736c6963655f6f766572666c6f77000000000000000000000000000000000000604482015260640161067f565b8183018451101561448f576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601160248201527f736c6963655f6f75744f66426f756e6473000000000000000000000000000000604482015260640161067f565b6060821580156144ae5760405191506000825260208201604052614516565b6040519150601f8416801560200281840101858101878315602002848b0101015b818310156144e75780518352602092830192016144cf565b5050858452601f017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe016604052505b50949350505050565b604080518082019091526000808252602082015260008251116145ea576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152604a60248201527f524c505265616465723a206c656e677468206f6620616e20524c50206974656d60448201527f206d7573742062652067726561746572207468616e207a65726f20746f20626560648201527f206465636f6461626c6500000000000000000000000000000000000000000000608482015260a40161067f565b50604080518082019091528151815260209182019181019190915290565b6060600080600061461885613830565b91945092509050600181600181111561463357614633615420565b146146c0576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152603860248201527f524c505265616465723a206465636f646564206974656d207479706520666f7260448201527f206c697374206973206e6f742061206c697374206974656d0000000000000000606482015260840161067f565b84516146cc8385615298565b14614759576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152603260248201527f524c505265616465723a206c697374206974656d2068617320616e20696e766160448201527f6c696420646174612072656d61696e6465720000000000000000000000000000606482015260840161067f565b604080516020808252610420820190925290816020015b60408051808201909152600080825260208201528152602001906001900390816147705790505093506000835b865181101561485e576000806147e36040518060400160405280858c600001516147c79190614f9e565b8152602001858c602001516147dc9190615298565b9052613830565b5091509150604051806040016040528083836147ff9190615298565b8152602001848b602001516148149190615298565b815250888581518110614829576148296153ac565b602090810291909101015261483f600185615298565b935061484b8183615298565b6148559084615298565b9250505061479d565b50845250919392505050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b604051601f82017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe016810167ffffffffffffffff811182821017156148e0576148e061486a565b604052919050565b73ffffffffffffffffffffffffffffffffffffffff8116811461490a57600080fd5b50565b600082601f83011261491e57600080fd5b813567ffffffffffffffff8111156149385761493861486a565b61496960207fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0601f84011601614899565b81815284602083860101111561497e57600080fd5b816020850160208301376000918101602001919091529392505050565b600060c082840312156149ad57600080fd5b60405160c0810167ffffffffffffffff82821081831117156149d1576149d161486a565b8160405282935084358352602085013591506149ec826148e8565b81602084015260408501359150614a02826148e8565b816040840152606085013560608401526080850135608084015260a0850135915080821115614a3057600080fd5b50614a3d8582860161490d565b60a0830152505092915050565b600080600080600085870360e0811215614a6357600080fd5b863567ffffffffffffffff80821115614a7b57600080fd5b614a878a838b0161499b565b97506020890135965060807fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc084011215614ac057600080fd5b60408901955060c0890135925080831115614ada57600080fd5b828901925089601f840112614aee57600080fd5b8235915080821115614aff57600080fd5b508860208260051b8401011115614b1557600080fd5b959894975092955050506020019190565b60005b83811015614b41578181015183820152602001614b29565b83811115614b50576000848401525b50505050565b60008151808452614b6e816020860160208601614b26565b601f017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0169290920160200192915050565b6020815260006122f36020830184614b56565b600060208284031215614bc557600080fd5b5035919050565b600060208284031215614bde57600080fd5b813567ffffffffffffffff811115614bf557600080fd5b614c018482850161499b565b949350505050565b803567ffffffffffffffff81168114614c2157600080fd5b919050565b600060208284031215614c3857600080fd5b6122f382614c09565b80358015158114614c2157600080fd5b600080600080600060a08688031215614c6957600080fd5b8535614c74816148e8565b945060208601359350614c8960408701614c09565b9250614c9760608701614c41565b9150608086013567ffffffffffffffff811115614cb357600080fd5b614cbf8882890161490d565b9150509295509295909350565b60008060008060808587031215614ce257600080fd5b8435614ced816148e8565b93506020850135614cfd816148e8565b92506040850135614d0d816148e8565b9150614d1b60608601614c41565b905092959194509250565b8581528460208201527fffffffffffffffff0000000000000000000000000000000000000000000000008460c01b16604082015282151560f81b604882015260008251614d7a816049850160208701614b26565b919091016049019695505050505050565b80516fffffffffffffffffffffffffffffffff81168114614c2157600080fd5b600060608284031215614dbd57600080fd5b6040516060810181811067ffffffffffffffff82111715614de057614de061486a565b60405282518152614df360208401614d8b565b6020820152614e0460408401614d8b565b60408201529392505050565b600060808284031215614e2257600080fd5b6040516080810181811067ffffffffffffffff82111715614e4557614e4561486a565b8060405250823581526020830135602082015260408301356040820152606083013560608201528091505092915050565b600067ffffffffffffffff80841115614e9157614e9161486a565b8360051b6020614ea2818301614899565b868152918501918181019036841115614eba57600080fd5b865b84811015614eee57803586811115614ed45760008081fd5b614ee036828b0161490d565b845250918301918301614ebc565b50979650505050505050565b600060208284031215614f0c57600080fd5b5051919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b600067ffffffffffffffff80831681851681830481118215151615614f6957614f69614f13565b02949350505050565b600067ffffffffffffffff808316818516808303821115614f9557614f95614f13565b01949350505050565b600082821015614fb057614fb0614f13565b500390565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601260045260246000fd5b600082614ff357614ff3614fb5565b7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff83147f80000000000000000000000000000000000000000000000000000000000000008314161561504757615047614f13565b500590565b6000808312837f80000000000000000000000000000000000000000000000000000000000000000183128115161561508657615086614f13565b837f7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0183138116156150ba576150ba614f13565b50500390565b60007f7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff60008413600084138583048511828216161561510157615101614f13565b7f8000000000000000000000000000000000000000000000000000000000000000600087128682058812818416161561513c5761513c614f13565b6000871292508782058712848416161561515857615158614f13565b8785058712818416161561516e5761516e614f13565b505050929093029392505050565b6000808212827f7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff038413811516156151b6576151b6614f13565b827f80000000000000000000000000000000000000000000000000000000000000000384128116156151ea576151ea614f13565b50500190565b6000817fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff048311821515161561522857615228614f13565b500290565b60008261523c5761523c614fb5565b500490565b868152600073ffffffffffffffffffffffffffffffffffffffff808816602084015280871660408401525084606083015283608083015260c060a083015261528c60c0830184614b56565b98975050505050505050565b600082198211156152ab576152ab614f13565b500190565b805163ffffffff81168114614c2157600080fd5b805160ff81168114614c2157600080fd5b600060c082840312156152e757600080fd5b60405160c0810181811067ffffffffffffffff8211171561530a5761530a61486a565b604052615316836152b0565b8152615324602084016152c4565b6020820152615335604084016152c4565b6040820152615346606084016152b0565b6060820152615357608084016152b0565b608082015261536860a08401614d8b565b60a08201529392505050565b60007fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff82036153a5576153a5614f13565b5060010190565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b600060ff8316806153ee576153ee614fb5565b8060ff84160691505092915050565b600060ff821660ff84168082101561541757615417614f13565b90039392505050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602160045260246000fdfea164736f6c634300080f000a", - "sourceMap": "1135:20265:110:-:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;7915:86;7934:10;7946:9;1866:7;7984:5;7991:9;;;;;;;;;;;;7915:18;:86::i;:::-;1135:20265;;;;;5989:92;;;;;;;;;;-1:-1:-1;6066:8:110;;;;;;;5989:92;;;214:42:285;202:55;;;184:74;;172:2;157:18;5989:92:110;;;;;;;;2856:32;;;;;;;;;;-1:-1:-1;2856:32:110;;;;;;;;6664:180;;;;;;;;;;;;;:::i;3007:23::-;;;;;;;;;;-1:-1:-1;3007:23:110;;;;;;;;9088:3746;;;;;;;;;;-1:-1:-1;9088:3746:110;;;;;:::i;:::-;;:::i;4878:41::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;2618:18::-;;;;;;;;;;-1:-1:-1;2618:18:110;;;;;;;;;;;5224:14:285;;5217:22;5199:41;;5187:2;5172:18;2618::110;5059:187:285;20785:180:110;;;;;;;;;;-1:-1:-1;20785:180:110;;;;;:::i;:::-;;:::i;6321:84::-;;;;;;;;;;-1:-1:-1;6390:8:110;;;;6321:84;;6447:173;;;;;;;;;;;;;:::i;12947:4839::-;;;;;;;;;;-1:-1:-1;12947:4839:110;;;;;:::i;:::-;;:::i;2732:30::-;;;;;;;;;;-1:-1:-1;2732:30:110;;;;;;;;;;;2129:23;;;;;;;;;;-1:-1:-1;2129:23:110;;;;;;;;2243:52;;;;;;;;;;-1:-1:-1;2243:52:110;;;;;:::i;:::-;;;;;;;;;;;;;;;;7337:120;;;;;;;;;;-1:-1:-1;7337:120:110;;;;;:::i;:::-;;:::i;:::-;;;6539:18:285;6527:31;;;6509:50;;6497:2;6482:18;7337:120:110;6365:200:285;2999:28:112;;;;;;;;;;-1:-1:-1;2999:28:112;;;;;;;;;;;;;;;;;;;;;;;;;6798:34:285;6786:47;;;6768:66;;6853:18;6907:15;;;6902:2;6887:18;;6880:43;6959:15;;6939:18;;;6932:43;6756:2;6741:18;2999:28:112;6570:411:285;2377:61:110;;;;;;;;;;-1:-1:-1;2377:61:110;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;7188:25:285;;;7232:34;7302:15;;;7297:2;7282:18;;7275:43;7354:15;;7334:18;;;7327:43;7176:2;7161:18;2377:61:110;6986:390:285;18516:1971:110;;;;;;:::i;:::-;;:::i;6154:98::-;;;;;;;;;;-1:-1:-1;6233:12:110;;;;6154:98;;5491:423;;;;;;;;;;-1:-1:-1;5491:423:110;;;;;:::i;:::-;;:::i;18516:1971::-;18722:9;3417:18:112;3438:9;3417:30;;18876:11:110::1;18872:136;;;18911:17;::::0;::::1;::::0;18903:94:::1;;;::::0;;::::1;::::0;;9067:2:285;18903:94:110::1;::::0;::::1;9049:21:285::0;9086:18;;;9079:30;;;;9145:34;9125:18;;;9118:62;9216:34;9196:18;;;9189:62;9268:19;;18903:94:110::1;;;;;;;;;19176:37;19199:5;:12;19176:15;:37::i;:::-;19163:50;;:9;:50;;;;19155:98;;;::::0;::::1;::::0;;9500:2:285;19155:98:110::1;::::0;::::1;9482:21:285::0;9539:2;9519:18;;;9512:30;9578:34;9558:18;;;9551:62;9649:5;9629:18;;;9622:33;9672:19;;19155:98:110::1;9298:399:285::0;19155:98:110::1;19648:7;19632:5;:12;:23;;19624:66;;;::::0;::::1;::::0;;9904:2:285;19624:66:110::1;::::0;::::1;9886:21:285::0;9943:2;9923:18;;;9916:30;9982:32;9962:18;;;9955:60;10032:18;;19624:66:110::1;9702:354:285::0;19624:66:110::1;19796:10;19834:9;19820:23:::0;::::1;19816:108;;-1:-1:-1::0;19902:10:110::1;741:42:204::0;1213:27;19816:108:110::1;20181:23;20224:9;20235:6;20243:9;20254:11;20267:5;20207:66;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;20181:92;;1716:1;20447:3;20420:60;;20441:4;20420:60;;;20469:10;20420:60;;;;;;:::i;:::-;;;;;;;;18737:1750;;3548:29:112::0;3557:7;3566:10;3548:8;:29::i;:::-;3339:245;18516:1971:110;;;;;;:::o;6664:180::-;6724:8;;;;6710:10;:22;6702:76;;;;;;;11133:2:285;6702:76:110;;;11115:21:285;11172:2;11152:18;;;11145:30;11211:34;11191:18;;;11184:62;11282:11;11262:18;;;11255:39;11311:19;;6702:76:110;10931:405:285;6702:76:110;6788:6;:14;;;;;;6817:20;;6826:10;184:74:285;;6817:20:110;;172:2:285;157:18;6817:20:110;;;;;;;;6664:180::o;9088:3746::-;4748:6;;;;:15;4740:50;;;;;;;11543:2:285;4740:50:110;;;11525:21:285;11582:2;11562:18;;;11555:30;11621:24;11601:18;;;11594:52;11663:18;;4740:50:110;11341:346:285;4740:50:110;9620:4:::1;9598:27;;:3;:10;;;:27;;::::0;9590:103:::1;;;::::0;::::1;::::0;;11894:2:285;9590:103:110::1;::::0;::::1;11876:21:285::0;11933:2;11913:18;;;11906:30;11972:34;11952:18;;;11945:62;12043:33;12023:18;;;12016:61;12094:19;;9590:103:110::1;11692:427:285::0;9590:103:110::1;9891:8;::::0;:36:::1;::::0;;;;::::1;::::0;::::1;12270:25:285::0;;;9870:18:110::1;::::0;9891:8:::1;::::0;::::1;;;::::0;:20:::1;::::0;12243:18:285;;9891:36:110::1;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;:47:::0;;-1:-1:-1;10072:45:110::1;;;::::0;;::::1;::::0;::::1;10100:16:::0;10072:45:::1;:::i;:::-;:27;:45::i;:::-;10058:10;:59;10037:135;;;::::0;::::1;::::0;;13978:2:285;10037:135:110::1;::::0;::::1;13960:21:285::0;14017:2;13997:18;;;13990:30;14056:34;14036:18;;;14029:62;14127:11;14107:18;;;14100:39;14156:19;;10037:135:110::1;13776:405:285::0;10037:135:110::1;10283:22;10308:27;10331:3;10308:22;:27::i;:::-;10345:40;10388:33:::0;;;:17:::1;:33;::::0;;;;;;;;10345:76;;::::1;::::0;::::1;::::0;;;;;;::::1;::::0;;::::1;::::0;::::1;::::0;;::::1;::::0;;::::1;::::0;;;;;;::::1;;::::0;;;;;;;10283:52;;-1:-1:-1;10345:76:110;10975:31;;:145:::1;;-1:-1:-1::0;11093:27:110;;11026:8:::1;::::0;11047:30:::1;::::0;;::::1;::::0;11026:52;;;;;14362:34:285;14350:47;;;11026:52:110::1;::::0;::::1;14332:66:285::0;11026:8:110::1;::::0;;::::1;;;::::0;:20:::1;::::0;14305:18:285;;11026:52:110::1;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;:63:::0;:94:::1;;10975:145;10954:247;;;::::0;::::1;::::0;;14611:2:285;10954:247:110::1;::::0;::::1;14593:21:285::0;14650:2;14630:18;;;14623:30;14689:34;14669:18;;;14662:62;14760:25;14740:18;;;14733:53;14803:19;;10954:247:110::1;14409:419:285::0;10954:247:110::1;11481:147;::::0;;::::1;::::0;::::1;15007:25:285::0;;;11437:18:110::1;15048::285::0;;;15041:34;;;14980:18;;11481:147:110::1;::::0;;;;;::::1;::::0;;;;;;11458:180;;11481:147:::1;11458:180:::0;;::::1;::::0;12046:22;;::::1;12270:25:285::0;;;11458:180:110;-1:-1:-1;11991:161:110::1;::::0;12243:18:285;12046:22:110::1;::::0;;;;;::::1;::::0;;;11991:161;;::::1;::::0;;;::::1;::::0;;::::1;12046:22;11991:161:::0;::::1;::::0;12046:22;11991:161:::1;12079:16:::0;;11991:161:::1;:::i;:::-;12097:16;:41;;;11991:37;:161::i;:::-;11970:258;;;::::0;::::1;::::0;;16409:2:285;11970:258:110::1;::::0;::::1;16391:21:285::0;16448:2;16428:18;;;16421:30;16487:34;16467:18;;;16460:62;16558:20;16538:18;;;16531:48;16596:19;;11970:258:110::1;16207:414:285::0;11970:258:110::1;12546:165;::::0;;::::1;::::0;::::1;::::0;;;;;::::1;12632:15;12546:165:::0;::::1;;::::0;;::::1;::::0;;;;;::::1;::::0;;;;;;-1:-1:-1;12510:33:110;;;:17:::1;:33:::0;;;;;:201;;;;;;;;;::::1;::::0;::::1;::::0;::::1;::::0;;;::::1;;::::0;;::::1;::::0;;;;12816:10;;::::1;::::0;12804;;::::1;::::0;12771:56;;::::1;::::0;;::::1;::::0;;;::::1;::::0;12528:14;;12771:56:::1;::::0;-1:-1:-1;12771:56:110::1;9353:3481;;;;9088:3746:::0;;;;;:::o;20785:180::-;20911:8;;:36;;;;;;;;12270:25:285;;;20859:4:110;;20882:76;;20911:8;;;;;;;:20;;12243:18:285;;20911:36:110;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;:46;;;20882:76;;:28;:76::i;:::-;20875:83;20785:180;-1:-1:-1;;20785:180:110:o;6447:173::-;6505:8;;;;6491:10;:22;6483:74;;;;;;;16828:2:285;6483:74:110;;;16810:21:285;16867:2;16847:18;;;16840:30;16906:34;16886:18;;;16879:62;16977:9;16957:18;;;16950:37;17004:19;;6483:74:110;16626:403:285;6483:74:110;6567:6;:13;;;;6576:4;6567:13;;;6595:18;;6602:10;184:74:285;;6595:18:110;;172:2:285;157:18;6595::110;14:250:285;12947:4839:110;4748:6;;;;:15;4740:50;;;;;;;11543:2:285;4740:50:110;;;11525:21:285;11582:2;11562:18;;;11555:30;11621:24;11601:18;;;11594:52;11663:18;;4740:50:110;11341:346:285;4740:50:110;13315:8:::1;::::0;:39:::1;:8;1337:42:158;13315:39:110;13294:137;;;::::0;::::1;::::0;;17236:2:285;13294:137:110::1;::::0;::::1;17218:21:285::0;17275:2;17255:18;;;17248:30;17314:34;17294:18;;;17287:62;17385:33;17365:18;;;17358:61;17436:19;;13294:137:110::1;17034:427:285::0;13294:137:110::1;13514:22;13539:27;13562:3;13539:22;:27::i;:::-;13576:40;13619:33:::0;;;:17:::1;:33;::::0;;;;;;;13576:76;;::::1;::::0;::::1;::::0;;;;;;::::1;::::0;;::::1;::::0;::::1;::::0;;::::1;::::0;;::::1;::::0;;;;;;::::1;;::::0;;;;;;;13514:52;;-1:-1:-1;13902:31:110;;13894:94:::1;;;::::0;::::1;::::0;;17668:2:285;13894:94:110::1;::::0;::::1;17650:21:285::0;17707:2;17687:18;;;17680:30;17746:34;17726:18;;;17719:62;17817:20;17797:18;;;17790:48;17855:19;;13894:94:110::1;17466:414:285::0;13894:94:110::1;14305:8;;;;;;;;;;;:26;;;:28;;;;;;;;;;;;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;14275:16;:26;;;:58;;;;14254:180;;;::::0;::::1;::::0;;18276:2:285;14254:180:110::1;::::0;::::1;18258:21:285::0;18315:2;18295:18;;;18288:30;18354:34;18334:18;;;18327:62;18425:34;18405:18;;;18398:62;18497:13;18476:19;;;18469:42;18528:19;;14254:180:110::1;18074:479:285::0;14254:180:110::1;14824:56;14853:16;:26;;;14824:56;;:28;:56::i;:::-;14803:172;;;::::0;::::1;::::0;;18760:2:285;14803:172:110::1;::::0;::::1;18742:21:285::0;18799:2;18779:18;;;18772:30;18838:34;18818:18;;;18811:62;18909:34;18889:18;;;18882:62;18981:7;18960:19;;;18953:36;19006:19;;14803:172:110::1;18558:473:285::0;14803:172:110::1;15185:8;::::0;15206:30:::1;::::0;;::::1;::::0;15185:52;;;;;14362:34:285;14350:47;;;15185:52:110::1;::::0;::::1;14332:66:285::0;15146:36:110::1;::::0;15185:8:::1;::::0;::::1;;;::::0;:20:::1;::::0;14305:18:285;;15185:52:110::1;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;15548:27:::0;;15525:19;;15146:91;;-1:-1:-1;15525:50:110::1;15504:170;;;::::0;::::1;::::0;;19238:2:285;15504:170:110::1;::::0;::::1;19220:21:285::0;19277:2;19257:18;;;19250:30;19316:34;19296:18;;;19289:62;19387:34;19367:18;;;19360:62;19459:11;19438:19;;;19431:40;19488:19;;15504:170:110::1;19036:477:285::0;15504:170:110::1;15773:48;15802:8;:18;;;15773:48;;:28;:48::i;:::-;15752:162;;;::::0;::::1;::::0;;19720:2:285;15752:162:110::1;::::0;::::1;19702:21:285::0;19759:2;19739:18;;;19732:30;19798:34;19778:18;;;19771:62;19869:34;19849:18;;;19842:62;19941:5;19920:19;;;19913:34;19964:19;;15752:162:110::1;19518:471:285::0;15752:162:110::1;16030:36;::::0;;;:20:::1;:36;::::0;;;;;::::1;;:45;16022:111;;;::::0;::::1;::::0;;20196:2:285;16022:111:110::1;::::0;::::1;20178:21:285::0;20235:2;20215:18;;;20208:30;20274:34;20254:18;;;20247:62;20345:23;20325:18;;;20318:51;20386:19;;16022:111:110::1;19994:417:285::0;16022:111:110::1;16213:36;::::0;;;:20:::1;:36;::::0;;;;;;;:43;;;::::1;16252:4;16213:43;::::0;;16361:10;;::::1;::::0;16350:8:::1;:21:::0;;::::1;::::0;;::::1;::::0;;;::::1;::::0;;;::::1;::::0;;17030:10;::::1;::::0;17042:12:::1;::::0;::::1;::::0;17056:9:::1;::::0;::::1;::::0;17067:8:::1;::::0;::::1;::::0;17006:70:::1;::::0;17030:10;17042:12;17056:9;17006:23:::1;:70::i;:::-;17144:8;:38:::0;;;::::1;1337:42:158;17144:38:110;::::0;;17341:44:::1;::::0;16991:85;;-1:-1:-1;17361:14:110;;17341:44:::1;::::0;::::1;::::0;16991:85;5224:14:285;5217:22;5199:41;;5187:2;5172:18;;5059:187;17341:44:110::1;;;;;;;;17649:16:::0;::::1;::::0;::::1;:61;;-1:-1:-1::0;17669:9:110::1;1015:1:158;17669:41:110;17649:61;17645:135;;;17726:43;::::0;::::1;::::0;;20618:2:285;17726:43:110::1;::::0;::::1;20600:21:285::0;20657:2;20637:18;;;20630:30;20696:34;20676:18;;;20669:62;20767:3;20747:18;;;20740:31;20788:19;;17726:43:110::1;20416:397:285::0;17645:135:110::1;13049:4737;;;;12947:4839:::0;:::o;7337:120::-;7402:6;7427:15;:10;7440:2;7427:15;:::i;:::-;:23;;7445:5;7427:23;:::i;5491:423::-;4396:13:36;;2762:1:158;;4396:13:36;;;;;4395:14;:40;;;;-1:-1:-1;4413:12:36;;:22;;;;:12;;:22;4395:40;4387:99;;;;;;;21725:2:285;4387:99:36;;;21707:21:285;21764:2;21744:18;;;21737:30;21803:34;21783:18;;;21776:62;21874:16;21854:18;;;21847:44;21908:19;;4387:99:36;21523:410:285;4387:99:36;4496:12;:22;;4528:20;;4496:22;;;4528:20;4496:22;4528:20;;;;;;5710:8:110::1;:38:::0;;;;;::::1;1337:42:158;5710:38:110;::::0;;;5758:8:::1;:20:::0;;5788:12:::1;:28:::0;;5710:38:::1;5788:28:::0;;::::1;::::0;;::::1;::::0;;;::::1;::::0;;;5826:8:::1;:20:::0;;;;::::1;::::0;::::1;::::0;;;::::1;::::0;;;5856:16;::::1;;5758:20:::0;;::::1;::::0;;::::1;4496:22:36::0;5856:16:110;;;;;;;;;::::1;::::0;;5882:25:::1;:23;:25::i;:::-;4585:5:36::0;4569:21;;;;;;4605:20;;22110:4:285;22098:17;;22080:36;;4605:20:36;;22068:2:285;22053:18;4605:20:36;;;;;;;5491:423:110;;;;;:::o;3817:4037:112:-;3984:6;:19;3949:17;;3969:34;;3984:19;;;;;3969:12;:34;:::i;:::-;3949:54;;4014:28;4045:17;:15;:17::i;:::-;4014:48;;4072:26;4171:6;:27;;;4163:36;;4128:6;:23;;;4120:32;;4113:87;;;;:::i;:::-;4072:128;-1:-1:-1;4215:13:112;;4211:2229;;4572:6;:20;4535:19;;4557:59;;4597:19;;4572:20;;;;;4557:59;:::i;:::-;4535:81;;4630:19;4761:6;:34;;;4753:43;;4724:19;:73;;;;:::i;:::-;4668:6;:18;4653:50;;4691:12;;4668:18;;4653:50;:::i;:::-;4652:146;;;;:::i;:::-;5017:6;:18;4630:168;;-1:-1:-1;4939:17:112;;4959:232;;5002:50;;4630:168;;5017:18;;5002:50;:::i;:::-;5091:6;:21;;;5083:30;;5153:6;:21;;;5145:30;;4959:16;:232::i;:::-;4939:252;;5468:1;5456:9;:13;5452:741;;;5741:437;5788:239;5845:10;5910:6;:34;;;5902:43;;6002:1;5990:9;:13;;;;:::i;:::-;5788:16;:239::i;5741:437::-;5728:450;;5452:741;6286:49;;6387:42;6349:24;6416:12;6387:42;;;6286:6;6387:42;-1:-1:-1;;4211:2229:112;6534:6;:31;;6558:7;;6534:6;:20;;:31;;6558:7;;6534:31;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;6652:6;:23;;;6644:32;;6611:6;:20;;;;;;;;;;;;6603:29;;6596:81;;6575:190;;;;;;;24367:2:285;6575:190:112;;;24349:21:285;24406:2;24386:18;;;24379:30;24445:34;24425:18;;;24418:62;24516:32;24496:18;;;24489:60;24566:19;;6575:190:112;24165:426:285;6575:190:112;6877:6;:18;6827:20;;6850:46;;6877:18;;6850:16;;;:46;:::i;:::-;6827:69;;7378:15;7411:31;7420:13;7435:6;7411:8;:31::i;:::-;7396:46;;:12;:46;:::i;:::-;7378:64;;7722:15;7754:9;7740:23;;:11;:23;:::i;:::-;7722:41;;7787:7;7777;:17;7773:75;;;7810:27;7819:17;7829:7;7819;:17;:::i;:::-;7810:8;:27::i;:::-;3881:3973;;;;;;3817:4037;;:::o;4937:384:162:-;5036:7;5113:16;:24;;;5155:16;:26;;;5199:16;:41;;;5258:16;:32;;;5085:219;;;;;;;;;;25185:25:285;;;25241:2;25226:18;;25219:34;;;;25284:2;25269:18;;25262:34;25327:2;25312:18;;25305:34;25172:3;25157:19;;24954:391;5085:219:162;;;;;;;;;;;;;5062:252;;;;;;5055:259;;4937:384;;;:::o;4432:211::-;4566:9;;4577:10;;;;;4589;;;;;4601:9;;;;4612:12;;;;4626:8;;;;4555:80;;4519:7;;4555:80;;4566:9;;4577:10;4626:8;4555:80;;:::i;1041:343:171:-;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:171:o;21218:180:110:-;21299:4;21353:8;;;;;;;;;;;:36;;;:38;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;21340:51;;:10;:51;:::i;:::-;21322:15;:69;;21218:180;-1:-1:-1;;21218:180:110:o;4419:2320:165:-;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:165:o;8362:180:112:-;4888:13:36;;;;;;;4880:69;;;;;;;26346:2:285;4880:69:36;;;26328:21:285;26385:2;26365:18;;;26358:30;26424:34;26404:18;;;26397:62;26495:13;26475:18;;;26468:41;26526:19;;4880:69:36;26144:407:285;4880:69:36;8442:93:112::1;::::0;;::::1;::::0;::::1;::::0;;8472:6:::1;8442:93:::0;;;-1:-1:-1;8442:93:112::1;::::0;::::1;::::0;8519:12:::1;8442:93;;::::0;;;;;;;8433:102;::::1;;:6;:102:::0;8362:180::o;8548:152:110:-;-1:-1:-1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;8664:12:110;;:29;;;;;;;-1:-1:-1;;8664:12:110;;;;;:27;;:29;;;;;-1:-1:-1;;8664:29:110;;;;;;:12;:29;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;8657:36;;8548:152;:::o;537:161:154:-;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:62:-;471:7;502:1;497;:6;;:14;;510:1;497:14;;;-1:-1:-1;506:1:62;;490:21;-1:-1:-1;413:105:62:o;407:192:155:-;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:171:-;2116:18;2181:4;2171:15;;;;;;2154:33;;;;;;28115:19:285;;28159:2;28150:12;;27986:182;2154:33:171;;;;;;;;;;;;;2146:41;;2052:142;;;:::o;2253:281:170:-;2446:11;2482:45;2494:6;2502:24;2506:4;2512:6;2520:5;2502:3;:24::i;:::-;6693:17:156;;;;;;;6672;;;;;;;;;;:38;;6569:148;2482:45:170;2473:54;2253:281;-1:-1:-1;;;;;2253:281:170:o;3615:365:165:-;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:165:o;311:102:64:-;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:88;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:170:-;2923:19;2976:1;2962:4;:11;:15;2954:49;;;;;;;28375:2:285;2954:49:170;;;28357:21:285;28414:2;28394:18;;;28387:30;28453:23;28433:18;;;28426:51;28494:18;;2954:49:170;28173:345:285;2954:49:170;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;;;;;;28115:19:285;;28159:2;28150:12;;27986:182;3148:23:170;;;;;;;;;;;;;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;;;;;;;28914:2:285;3489:88:170;;;28896:21:285;28953:2;28933:18;;;28926:30;28992:34;28972:18;;;28965:62;29063:16;29043:18;;;29036:44;29097:19;;3489:88:170;28712:410:285;3489:88:170;3596:15;3615:1;3596:20;3592:837;;3768:19;;3758:30;;;;;;;3741:48;;3729:76;;3741:48;;3758:30;3741:48;28115:19:285;;;28159:2;28150:12;;27986:182;3741:48:170;;;;;;;;;;;;;3791:13;6693:17:156;;;;;;;6672;;;;;;;;;;:38;;6569:148;3729:76:170;3700:176;;;;;;;29329:2:285;3700:176:170;;;29311:21:285;29368:2;29348:18;;;29341:30;29407:31;29387:18;;;29380:59;29456:18;;3700:176:170;29127:353:285;3700:176:170;3592:837;;;3901:19;;:26;3931:2;-1:-1:-1;3897:532:170;;4097:19;;4087:30;;;;;;;4070:48;;4058:76;;4070:48;;4087:30;4070:48;28115:19:285;;;28159:2;28150:12;;27986:182;4058:76:170;4029:186;;;;;;;29687:2:285;4029:186:170;;;29669:21:285;29726:2;29706:18;;;29699:30;29765:34;29745:18;;;29738:62;29836:9;29816:18;;;29809:37;29863:19;;4029:186:170;29485:403:285;3897:532:170;4336:19;;6693:17:156;;;;;;;;;;6672;;;;;;;:38;4316:98:170;;;;;;;30095:2:285;4316:98:170;;;30077:21:285;30134:2;30114:18;;;30107:30;30173:34;30153:18;;;30146:62;30244:8;30224:18;;;30217:36;30270:19;;4316:98:170;29893:402:285;4316:98:170;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;;;;;;;30502:2:285;5121:89:170;;;30484:21:285;30541:2;30521:18;;;30514:30;30580:34;30560:18;;;30553:62;30651:29;30631:18;;;30624:57;30698:19;;5121:89:170;30300:423:285;5121:89:170;5322:1;5307:5;:12;:16;;;;:::i;:::-;5302:1;:21;5294:92;;;;;;;30930:2:285;5294:92:170;;;30912:21:285;30969:2;30949:18;;;30942:30;31008:34;30988:18;;;30981:62;31079:28;31059:18;;;31052:56;31125:19;;5294:92:170;30728:422:285;5294:92:170;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:170;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:170;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;;;;;;;31719:2:285;6608:171:170;;;31701:21:285;31758:2;31738:18;;;31731:30;31797:34;31777:18;;;31770:62;31868:28;31848:18;;;31841:56;31914:19;;6608:171:170;31517:422:285;6608:171:170;6802:26;;;1447:1;6802:26;;:55;;-1:-1:-1;6832:25:170;;;1553:1;6832:25;6802:55;6798:2169;;;7498:18;7475:12;:19;:41;7442:185;;;;;;;32146:2:285;7442:185:170;;;32128:21:285;32185:2;32165:18;;;32158:30;32224:34;32204:18;;;32197:62;32295:31;32275:18;;;32268:59;32344:19;;7442:185:170;31944:425:285;7442:185:170;7985:43;8005:11;:19;;;8025:1;8005:22;;;;;;;;:::i;7985:43::-;7976:52;;8074:1;8058:6;:13;:17;8050:87;;;;;;;32576:2:285;8050:87:170;;;32558:21:285;32615:2;32595:18;;;32588:30;32654:34;32634:18;;;32627:62;32725:27;32705:18;;;32698:55;32770:19;;8050:87:170;32374:421:285;8050:87:170;8249:1;8234:5;:12;:16;;;;:::i;:::-;8229:1;:21;8221:90;;;;;;;33002:2:285;8221:90:170;;;32984:21:285;33041:2;33021:18;;;33014:30;33080:34;33060:18;;;33053:62;33151:26;33131:18;;;33124:54;33195:19;;8221:90:170;32800:420:285;8221:90:170;8334:13;;;;;;;;;;;;;;6798:2169;8376:31;;;;;:65;;-1:-1:-1;8411:30:170;;;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:170;8823:18;8804:37;;:::i;:::-;;;8372:595;;;8888:60;;;;;33427:2:285;8888:60:170;;;33409:21:285;33466:2;33446:18;;;33439:30;33505:34;33485:18;;;33478:62;33576:20;33556:18;;;33549:48;33614:19;;8888:60:170;33225:414:285;8372:595:170;5946:3035;;;;;;5881:3189;;;9005:50;;;;;33846:2:285;9005:50:170;;;33828:21:285;33885:2;33865:18;;;33858:30;33924:34;33904:18;;;33897:62;33995:10;33975:18;;;33968:38;34023:19;;9005:50:170;33644:404:285;5881:3189:170;-1:-1:-1;3328:3:170;;;;:::i;:::-;;;;3290:5790;;;-1:-1:-1;9090:47:170;;;;;34255:2:285;9090:47:170;;;34237:21:285;34294:2;34274:18;;;34267:30;34333:34;34313:18;;;34306:62;34404:7;34384:18;;;34377:35;34429:19;;9090:47:170;34053:401:285;4596:2947:88;4644:8;4700:1;4696;:5;4688:27;;;;;;;34661:2:285;4688:27:88;;;34643:21:285;34700:1;34680:18;;;34673:29;34738:11;34718:18;;;34711:39;34767:18;;4688:27:88;34459:332:285;4688:27:88;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:88:o;1487:3103::-;1536:8;1718:21;1713:1;:26;1709:40;;-1:-1:-1;1748:1:88;;1487:3103;-1:-1:-1;1487:3103:88:o;1709:40::-;1948:21;1943:1;:26;1939:54;;1971:22;;;;;34998:2:285;1971:22:88;;;34980:21:285;35037:2;35017:18;;;35010:30;35076:14;35056:18;;;35049:42;35108:18;;1971:22:88;34796:336:285;1939:54:88;2266:5;2260:2;2255:7;;;2254:17;;-1:-1:-1;2535:8:88;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:88:o;9434:390:170:-;9553:13;;9500:24;;9553:13;9585:22;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;;;;;;;;;;;;;9585:22:170;;;;;;;;;;;;;;;;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:156:-;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:156;5695:12;5647:622;;;-1:-1:-1;6295:8:156;;4332:1978;-1:-1:-1;;;;;4332:1978:156:o;3993:464:168:-;4055:17;4085:18;4105;4125:20;4149:18;4163:3;4149:13;:18::i;:::-;4084:83;;-1:-1:-1;4084:83:168;-1:-1:-1;4084:83:168;-1:-1:-1;4198:21:168;4186:8;:33;;;;;;;;:::i;:::-;;4178:103;;;;;;;35528:2:285;4178:103:168;;;35510:21:285;35567:2;35547:18;;;35540:30;35606:34;35586:18;;;35579:62;35677:27;35657:18;;;35650:55;35722:19;;4178:103:168;35326:421:285;4178:103:168;4314:23;4327:10;4314;:23;:::i;:::-;4300:10;;:37;4292:102;;;;;;;35954:2:285;4292:102:168;;;35936:21:285;35993:2;35973:18;;;35966:30;36032:34;36012:18;;;36005:62;36103:22;36083:18;;;36076:50;36143:19;;4292:102:168;35752:416:285;4292:102:168;4412:38;4418:3;:7;;;4427:10;4439;4412:5;:38::i;10121:193:170:-;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:156:-;3880:12;3918:6;:13;3908:6;:23;3904:70;;-1:-1:-1;3954:9:156;;;;;;;;;-1:-1:-1;3954:9:156;;3947:16;;3904:70;3990:45;3996:6;4004;4028;4012;:13;:22;;;;:::i;:::-;3990:5;:45::i;10892:321:170:-;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:88:-;15376:9;15409:1;15405;:5;15397:27;;;;;;;34661:2:285;15397:27:88;;;34643:21:285;34700:1;34680:18;;;34673:29;34738:11;34718:18;;;34711:39;34767:18;;15397:27:88;34459:332:285;15397:27:88;-1:-1:-1;15821:1:88;15473:34;-1:-1:-1;;15467:1:88;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:88;;15328:575::o;3732:130:168:-;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;;;;;;;36375:2:285;5684:101:168;;;36357:21:285;36414:2;36394:18;;;36387:30;36453:34;36433:18;;;36426:62;36524:34;36504:18;;;36497:62;36596:12;36575:19;;;36568:41;36626:19;;5684:101:168;36173:478:285;5684:101:168;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;;;;;;;36858:2:285;6209:140:168;;;36840:21:285;36897:2;36877:18;;;36870:30;36936:34;36916:18;;;36909:62;37007:34;36987:18;;;36980:62;37079:16;37058:19;;;37051:45;37113:19;;6209:140:168;36656:482:285;6209:140:168;6471:1;6462:11;;;6456:18;6476:14;6452:39;;6544:11;;;;:41;;-1:-1:-1;6559:26:168;;;;;;6544:41;6519:177;;;;;;;37345:2:285;6519:177:168;;;37327:21:285;37384:2;37364:18;;;37357:30;37423:34;37403:18;;;37396:62;37494:34;37474:18;;;37467:62;37566:15;37545:19;;;37538:44;37599:19;;6519:177:168;37143:481:285;6519:177:168;-1:-1:-1;6719:1:168;;-1:-1:-1;6722:6:168;-1:-1:-1;6730:21:168;;-1:-1:-1;6711:41:168;;-1:-1:-1;;6711:41:168;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;;;;;;;37831:2:285;6881:164:168;;;37813:21:285;37870:2;37850:18;;;37843:30;37909:34;37889:18;;;37882:62;37980:34;37960:18;;;37953:62;38052:19;38031;;;38024:48;38089:19;;6881:164:168;37629:485:285;6881:164:168;7167:1;7158:11;;7152:18;7172:14;7148:39;7060:25;7240:26;;;7215:143;;;;;;;38321:2:285;7215:143:168;;;38303:21:285;38360:2;38340:18;;;38333:30;38399:34;38379:18;;;38372:62;38470:34;38450:18;;;38443:62;38542:12;38521:19;;;38514:41;38572:19;;7215:143:168;38119:478:285;7215:143:168;7488:1;7479:11;;7473:18;7455:1;7451:19;;7446:3;7442:29;7438:54;7537:2;7528:11;;7520:96;;;;;;;38804:2:285;7520:96:168;;;38786:21:285;38843:2;38823:18;;;38816:30;38882:34;38862:18;;;38855:62;38953:34;38933:18;;;38926:62;39025:10;39004:19;;;38997:39;39053:19;;7520:96:168;38602:476:285;7520:96:168;7669:20;7683:6;7669:11;:20;:::i;:::-;7656:10;;:33;7631:168;;;;;;;39285:2:285;7631:168:168;;;39267:21:285;39324:2;39304:18;;;39297:30;39363:34;39343:18;;;39336:62;39434:34;39414:18;;;39407:62;39506:14;39485:19;;;39478:43;39538:19;;7631:168:168;39083:480:285;7631:168:168;7822:15;7826:11;7822:1;:15;:::i;:::-;7814:55;-1:-1:-1;7839:6:168;-1:-1:-1;7847:21:168;;-1:-1:-1;7814:55:168;;-1:-1:-1;;;;7814:55:168;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;;;;;;;39770:2:285;8049:107:168;;;39752:21:285;39809:2;39789:18;;;39782:30;39848:34;39828:18;;;39821:62;39919:34;39899:18;;;39892:62;39991:12;39970:19;;;39963:41;40021:19;;8049:107:168;39568:478:285;8049:107:168;8179:1;;-1:-1:-1;8182:7:168;-1:-1:-1;8179:1:168;;-1:-1:-1;8171:42:168;;-1:-1:-1;;8171:42:168;7886:1433;8270:20;8293:13;8302:4;8293:6;:13;:::i;:::-;8270:36;;8359:12;8346:3;:10;;;:25;8321:161;;;;;;;40253:2:285;8321:161:168;;;40235:21:285;40292:2;40272:18;;;40265:30;40331:34;40311:18;;;40304:62;40402:34;40382:18;;;40375:62;40474:15;40453:19;;;40446:44;40507:19;;8321:161:168;40051:481:285;8321:161:168;8604:1;8595:11;;8589:18;8609:14;8585:39;8497:25;8677:26;;;8652:141;;;;;;;40739:2:285;8652:141:168;;;40721:21:285;40778:2;40758:18;;;40751:30;40817:34;40797:18;;;40790:62;40888:34;40868:18;;;40861:62;40960:10;40939:19;;;40932:39;40988:19;;8652:141:168;40537:476:285;8652:141:168;8926:1;8917:11;;8911:18;8892:1;8888:20;;8883:3;8879:30;8875:55;8976:2;8966:12;;8958:95;;;;;;;41220:2:285;8958:95:168;;;41202:21:285;41259:2;41239:18;;;41232:30;41298:34;41278:18;;;41271:62;41369:34;41349:18;;;41342:62;41441:8;41420:19;;;41413:37;41467:19;;8958:95:168;41018:474:285;8958:95:168;9106:22;9121:7;9106:12;:22;:::i;:::-;9093:10;;:35;9068:168;;;;;;;41699:2:285;9068:168:168;;;41681:21:285;41738:2;41718:18;;;41711:30;41777:34;41757:18;;;41750:62;41848:34;41828:18;;;41821:62;41920:12;41899:19;;;41892:41;41950:19;;9068:168:168;41497:478:285;9068:168:168;9259:16;9263:12;9259:1;:16;:::i;:::-;9251:57;-1:-1:-1;9277:7:168;-1:-1:-1;9286:21:168;;-1:-1:-1;9251:57:168;;-1:-1:-1;;;;9251:57:168;5246:4079;;;;;;:::o;9585:780::-;9676:17;9722:7;9712:18;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;9712:18:168;-1:-1:-1;9705:25:168;-1:-1:-1;9740:54:168;;9772:11;9740:54;10053:11;10067:36;10096:7;10088:4;10067:36;:::i;:::-;10053:50;;10158:2;10152:4;10148:13;10183:1;10197:87;10211:7;10208:1;10205:14;10197:87;;;10269:11;;;10263:18;10249:12;;;10242:40;10234:2;10227:10;10197:87;;;10307:7;10304:1;10301:14;10298:51;;;10345:1;10335:7;10329:4;10325:18;10318:29;10298:51;;;10122:237;9585:780;;;;;:::o;4847:137::-;4912:17;4948:29;4954:3;:7;;;4963:1;4966:3;:10;;;4948:5;:29::i;660:2816:156:-;752:12;824:7;808;818:2;808:12;:23;;800:50;;;;;;;42182:2:285;800:50:156;;;42164:21:285;42221:2;42201:18;;;42194:30;42260:16;42240:18;;;42233:44;42294:18;;800:50:156;41980:338:285;800:50:156;892:6;881:7;872:6;:16;:26;;864:53;;;;;;;42182:2:285;864:53:156;;;42164:21:285;42221:2;42201:18;;;42194:30;42260:16;42240:18;;;42233:44;42294:18;;864:53:156;41980:338:285;864:53:156;965:7;956:6;:16;939:6;:13;:33;;931:63;;;;;;;42525:2:285;931:63:156;;;42507:21:285;42564:2;42544:18;;;42537:30;42603:19;42583:18;;;42576:47;42640:18;;931:63:156;42323:341:285;931:63:156;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:156;;;3018:2;3001:11;3014:7;2997:25;2991:4;2984:39;-1:-1:-1;1071:2362:156;-1:-1:-1;3460:9:156;660:2816;-1:-1:-1;;;;660:2816:156:o;1298:390:168:-;-1:-1:-1;;;;;;;;;;;;;;;;;1453:1:168;1440:3;:10;:14;1432:101;;;;;;;36375:2:285;1432:101:168;;;36357:21:285;36414:2;36394:18;;;36387:30;36453:34;36433:18;;;36426:62;36524:34;36504:18;;;36497:62;36596:12;36575:19;;;36568:41;36626:19;;1432:101:168;36173:478:285;1432:101:168;-1:-1:-1;1640:41:168;;;;;;;;;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:168;-1:-1:-1;1934:83:168;-1:-1:-1;2048:21:168;2036:8;:33;;;;;;;;:::i;:::-;;2028:102;;;;;;;42871:2:285;2028:102:168;;;42853:21:285;42910:2;42890:18;;;42883:30;42949:34;42929:18;;;42922:62;43020:26;43000:18;;;42993:54;43064:19;;2028:102:168;42669:420:285;2028:102:168;2176:10;;2149:23;2162:10;2149;:23;:::i;:::-;:37;2141:100;;;;;;;43296:2:285;2141:100:168;;;43278:21:285;43335:2;43315:18;;;43308:30;43374:34;43354:18;;;43347:62;43445:20;43425:18;;;43418:48;43483:19;;2141:100:168;43094:414:285;2141:100:168;2651:30;;;1123:2;2651:30;;;;;;;;;;;;;;-1:-1:-1;;;;;;;;;;;;;;;;;2651:30:168;;;;;;;;;;;;;;-1:-1:-1;2644:37:168;-1:-1:-1;2692:17:168;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:168;3420:10;3407;:23;:::i;:::-;3397:33;;;;:::i;:::-;;;2788:653;;2760:681;;;-1:-1:-1;3541:23:168;;-1:-1:-1;3548:4:168;;1840:1740;-1:-1:-1;;;1840:1740:168:o;753:184:285:-;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:285:o;1281:154::-;1367:42;1360:5;1356:54;1349:5;1346:65;1336:93;;1425:1;1422;1415:12;1336:93;1281:154;:::o;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:285: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:1173::-;3271:6;3279;3287;3295;3303;3347:9;3338:7;3334:23;3377:3;3373:2;3369:12;3366:32;;;3394:1;3391;3384:12;3366:32;3434:9;3421:23;3463:18;3504:2;3496:6;3493:14;3490:34;;;3520:1;3517;3510:12;3490:34;3543:72;3607:7;3598:6;3587:9;3583:22;3543:72;:::i;:::-;3533:82;;3662:2;3651:9;3647:18;3634:32;3624:42;;3759:3;3690:66;3686:2;3682:75;3678:85;3675:105;;;3776:1;3773;3766:12;3675:105;3814:2;3803:9;3799:18;3789:28;;3870:3;3859:9;3855:19;3842:33;3826:49;;3900:2;3890:8;3887:16;3884:36;;;3916:1;3913;3906:12;3884:36;3954:8;3943:9;3939:24;3929:34;;4001:7;3994:4;3990:2;3986:13;3982:27;3972:55;;4023:1;4020;4013:12;3972:55;4063:2;4050:16;4036:30;;4089:2;4081:6;4078:14;4075:34;;;4105:1;4102;4095:12;4075:34;;4158:7;4153:2;4143:6;4140:1;4136:14;4132:2;4128:23;4124:32;4121:45;4118:65;;;4179:1;4176;4169:12;4118:65;3071:1173;;;;-1:-1:-1;3071:1173:285;;-1:-1:-1;;;4210:2:285;4202:11;;4232:6;3071:1173::o;4249:258::-;4321:1;4331:113;4345:6;4342:1;4339:13;4331:113;;;4421:11;;;4415:18;4402:11;;;4395:39;4367:2;4360:10;4331:113;;;4462:6;4459:1;4456:13;4453:48;;;4497:1;4488:6;4483:3;4479:16;4472:27;4453:48;;4249:258;;;:::o;4512:317::-;4554:3;4592:5;4586:12;4619:6;4614:3;4607:19;4635:63;4691:6;4684:4;4679:3;4675:14;4668:4;4661:5;4657:16;4635:63;:::i;:::-;4743:2;4731:15;4748:66;4727:88;4718:98;;;;4818:4;4714:109;;4512:317;-1:-1:-1;;4512:317:285:o;4834:220::-;4983:2;4972:9;4965:21;4946:4;5003:45;5044:2;5033:9;5029:18;5021:6;5003:45;:::i;5251:180::-;5310:6;5363:2;5351:9;5342:7;5338:23;5334:32;5331:52;;;5379:1;5376;5369:12;5331:52;-1:-1:-1;5402:23:285;;5251:180;-1:-1:-1;5251:180:285:o;5436:374::-;5535:6;5588:2;5576:9;5567:7;5563:23;5559:32;5556:52;;;5604:1;5601;5594:12;5556:52;5644:9;5631:23;5677:18;5669:6;5666:30;5663:50;;;5709:1;5706;5699:12;5663:50;5732:72;5796:7;5787:6;5776:9;5772:22;5732:72;:::i;:::-;5722:82;5436:374;-1:-1:-1;;;;5436:374:285:o;6000:171::-;6067:20;;6127:18;6116:30;;6106:41;;6096:69;;6161:1;6158;6151:12;6096:69;6000:171;;;:::o;6176:184::-;6234:6;6287:2;6275:9;6266:7;6262:23;6258:32;6255:52;;;6303:1;6300;6293:12;6255:52;6326:28;6344:9;6326:28;:::i;7381:160::-;7446:20;;7502:13;;7495:21;7485:32;;7475:60;;7531:1;7528;7521:12;7546:665;7646:6;7654;7662;7670;7678;7731:3;7719:9;7710:7;7706:23;7702:33;7699:53;;;7748:1;7745;7738:12;7699:53;7787:9;7774:23;7806:31;7831:5;7806:31;:::i;:::-;7856:5;-1:-1:-1;7908:2:285;7893:18;;7880:32;;-1:-1:-1;7931:37:285;7964:2;7949:18;;7931:37;:::i;:::-;7921:47;;7987:35;8018:2;8007:9;8003:18;7987:35;:::i;:::-;7977:45;;8073:3;8062:9;8058:19;8045:33;8101:18;8093:6;8090:30;8087:50;;;8133:1;8130;8123:12;8087:50;8156:49;8197:7;8188:6;8177:9;8173:22;8156:49;:::i;:::-;8146:59;;;7546:665;;;;;;;;:::o;8216:644::-;8345:6;8353;8361;8369;8422:3;8410:9;8401:7;8397:23;8393:33;8390:53;;;8439:1;8436;8429:12;8390:53;8478:9;8465:23;8497:31;8522:5;8497:31;:::i;:::-;8547:5;-1:-1:-1;8604:2:285;8589:18;;8576:32;8617:33;8576:32;8617:33;:::i;:::-;8669:7;-1:-1:-1;8728:2:285;8713:18;;8700:32;8741:33;8700:32;8741:33;:::i;:::-;8793:7;-1:-1:-1;8819:35:285;8850:2;8835:18;;8819:35;:::i;:::-;8809:45;;8216:644;;;;;;;:::o;10061:642::-;10324:6;10319:3;10312:19;10361:6;10356:2;10351:3;10347:12;10340:28;10420:66;10411:6;10406:3;10402:16;10398:89;10393:2;10388:3;10384:12;10377:111;10541:6;10534:14;10527:22;10522:3;10518:32;10513:2;10508:3;10504:12;10497:54;10294:3;10580:6;10574:13;10596:60;10649:6;10644:2;10639:3;10635:12;10630:2;10622:6;10618:15;10596:60;:::i;:::-;10676:16;;;;10694:2;10672:25;;10061:642;-1:-1:-1;;;;;;10061:642:285:o;12306:192::-;12385:13;;12438:34;12427:46;;12417:57;;12407:85;;12488:1;12485;12478:12;12503:616;12606:6;12659:2;12647:9;12638:7;12634:23;12630:32;12627:52;;;12675:1;12672;12665:12;12627:52;12708:2;12702:9;12750:2;12742:6;12738:15;12819:6;12807:10;12804:22;12783:18;12771:10;12768:34;12765:62;12762:88;;;12830:18;;:::i;:::-;12866:2;12859:22;12905:16;;12890:32;;12955:49;13000:2;12985:18;;12955:49;:::i;:::-;12950:2;12942:6;12938:15;12931:74;13038:49;13083:2;13072:9;13068:18;13038:49;:::i;:::-;13033:2;13021:15;;13014:74;13025:6;12503:616;-1:-1:-1;;;12503:616:285:o;13124:647::-;13217:6;13270:3;13258:9;13249:7;13245:23;13241:33;13238:53;;;13287:1;13284;13277:12;13238:53;13320:2;13314:9;13362:3;13354:6;13350:16;13432:6;13420:10;13417:22;13396:18;13384:10;13381:34;13378:62;13375:88;;;13443:18;;:::i;:::-;13483:10;13479:2;13472:22;;13531:9;13518:23;13510:6;13503:39;13603:2;13592:9;13588:18;13575:32;13570:2;13562:6;13558:15;13551:57;13669:2;13658:9;13654:18;13641:32;13636:2;13628:6;13624:15;13617:57;13735:2;13724:9;13720:18;13707:32;13702:2;13694:6;13690:15;13683:57;13759:6;13749:16;;;13124:647;;;;:::o;15268:934::-;15404:9;15438:18;15479:2;15471:6;15468:14;15465:40;;;15485:18;;:::i;:::-;15531:6;15528:1;15524:14;15557:4;15581:28;15605:2;15601;15597:11;15581:28;:::i;:::-;15643:19;;;15713:14;;;;15678:12;;;;15750:14;15739:26;;15736:46;;;15778:1;15775;15768:12;15736:46;15802:5;15816:353;15832:6;15827:3;15824:15;15816:353;;;15918:3;15905:17;15954:2;15941:11;15938:19;15935:109;;;15998:1;16027:2;16023;16016:14;15935:109;16069:57;16111:14;16097:11;16090:5;16086:23;16069:57;:::i;:::-;16057:70;;-1:-1:-1;16147:12:285;;;;15849;;15816:353;;;-1:-1:-1;16191:5:285;15268:934;-1:-1:-1;;;;;;;15268:934:285:o;17885:184::-;17955:6;18008:2;17996:9;17987:7;17983:23;17979:32;17976:52;;;18024:1;18021;18014:12;17976:52;-1:-1:-1;18047:16:285;;17885:184;-1:-1:-1;17885:184:285:o;20818:::-;20870:77;20867:1;20860:88;20967:4;20964:1;20957:15;20991:4;20988:1;20981:15;21007:270;21046:7;21078:18;21123:2;21120:1;21116:10;21153:2;21150:1;21146:10;21209:3;21205:2;21201:12;21196:3;21193:21;21186:3;21179:11;21172:19;21168:47;21165:73;;;21218:18;;:::i;:::-;21258:13;;21007:270;-1:-1:-1;;;;21007:270:285:o;21282:236::-;21321:3;21349:18;21394:2;21391:1;21387:10;21424:2;21421:1;21417:10;21455:3;21451:2;21447:12;21442:3;21439:21;21436:47;;;21463:18;;:::i;:::-;21499:13;;21282:236;-1:-1:-1;;;;21282:236:285:o;22127:125::-;22167:4;22195:1;22192;22189:8;22186:34;;;22200:18;;:::i;:::-;-1:-1:-1;22237:9:285;;22127:125::o;22257:184::-;22309:77;22306:1;22299:88;22406:4;22403:1;22396:15;22430:4;22427:1;22420:15;22446:308;22485:1;22511;22501:35;;22516:18;;:::i;:::-;22633:66;22630:1;22627:73;22558:66;22555:1;22552:73;22548:153;22545:179;;;22704:18;;:::i;:::-;-1:-1:-1;22738:10:285;;22446:308::o;22759:369::-;22798:4;22834:1;22831;22827:9;22943:1;22875:66;22871:74;22868:1;22864:82;22859:2;22852:10;22848:99;22845:125;;;22950:18;;:::i;:::-;23069:1;23001:66;22997:74;22994:1;22990:82;22986:2;22982:91;22979:117;;;23076:18;;:::i;:::-;-1:-1:-1;;23113:9:285;;22759:369::o;23133:655::-;23172:7;23204:66;23296:1;23293;23289:9;23324:1;23321;23317:9;23369:1;23365:2;23361:10;23358:1;23355:17;23350:2;23346;23342:11;23338:35;23335:61;;;23376:18;;:::i;:::-;23415:66;23507:1;23504;23500:9;23554:1;23550:2;23545:11;23542:1;23538:19;23533:2;23529;23525:11;23521:37;23518:63;;;23561:18;;:::i;:::-;23607:1;23604;23600:9;23590:19;;23654:1;23650:2;23645:11;23642:1;23638:19;23633:2;23629;23625:11;23621:37;23618:63;;;23661:18;;:::i;:::-;23726:1;23722:2;23717:11;23714:1;23710:19;23705:2;23701;23697:11;23693:37;23690:63;;;23733:18;;:::i;:::-;-1:-1:-1;;;23773:9:285;;;;;23133:655;-1:-1:-1;;;23133:655:285:o;23793:367::-;23832:3;23867:1;23864;23860:9;23976:1;23908:66;23904:74;23901:1;23897:82;23892:2;23885:10;23881:99;23878:125;;;23983:18;;:::i;:::-;24102:1;24034:66;24030:74;24027:1;24023:82;24019:2;24015:91;24012:117;;;24109:18;;:::i;:::-;-1:-1:-1;;24145:9:285;;23793:367::o;24596:228::-;24636:7;24762:1;24694:66;24690:74;24687:1;24684:81;24679:1;24672:9;24665:17;24661:105;24658:131;;;24769:18;;:::i;:::-;-1:-1:-1;24809:9:285;;24596:228::o;24829:120::-;24869:1;24895;24885:35;;24900:18;;:::i;:::-;-1:-1:-1;24934:9:285;;24829:120::o;25350:656::-;25637:6;25626:9;25619:25;25600:4;25663:42;25753:2;25745:6;25741:15;25736:2;25725:9;25721:18;25714:43;25805:2;25797:6;25793:15;25788:2;25777:9;25773:18;25766:43;;25845:6;25840:2;25829:9;25825:18;25818:34;25889:6;25883:3;25872:9;25868:19;25861:35;25933:3;25927;25916:9;25912:19;25905:32;25954:46;25995:3;25984:9;25980:19;25972:6;25954:46;:::i;:::-;25946:54;25350:656;-1:-1:-1;;;;;;;;25350:656:285:o;26011:128::-;26051:3;26082:1;26078:6;26075:1;26072:13;26069:39;;;26088:18;;:::i;:::-;-1:-1:-1;26124:9:285;;26011:128::o;26556:167::-;26634:13;;26687:10;26676:22;;26666:33;;26656:61;;26713:1;26710;26703:12;26728:160;26805:13;;26858:4;26847:16;;26837:27;;26827:55;;26878:1;26875;26868:12;26893:888;26996:6;27049:3;27037:9;27028:7;27024:23;27020:33;27017:53;;;27066:1;27063;27056:12;27017:53;27099:2;27093:9;27141:3;27133:6;27129:16;27211:6;27199:10;27196:22;27175:18;27163:10;27160:34;27157:62;27154:88;;;27222:18;;:::i;:::-;27258:2;27251:22;27297:39;27326:9;27297:39;:::i;:::-;27289:6;27282:55;27370:47;27413:2;27402:9;27398:18;27370:47;:::i;:::-;27365:2;27357:6;27353:15;27346:72;27451:47;27494:2;27483:9;27479:18;27451:47;:::i;:::-;27446:2;27438:6;27434:15;27427:72;27532:48;27576:2;27565:9;27561:18;27532:48;:::i;:::-;27527:2;27519:6;27515:15;27508:73;27615:49;27659:3;27648:9;27644:19;27615:49;:::i;:::-;27609:3;27601:6;27597:16;27590:75;27699:50;27744:3;27733:9;27729:19;27699:50;:::i;:::-;27693:3;27681:16;;27674:76;27685:6;26893:888;-1:-1:-1;;;26893:888:285:o;27786:195::-;27825:3;27856:66;27849:5;27846:77;27843:103;;27926:18;;:::i;:::-;-1:-1:-1;27973:1:285;27962:13;;27786:195::o;28523:184::-;28575:77;28572:1;28565:88;28672:4;28669:1;28662:15;28696:4;28693:1;28686:15;31155:157;31185:1;31219:4;31216:1;31212:12;31243:3;31233:37;;31250:18;;:::i;:::-;31302:3;31295:4;31292:1;31288:12;31284:22;31279:27;;;31155:157;;;;:::o;31317:195::-;31355:4;31392;31389:1;31385:12;31424:4;31421:1;31417:12;31449:3;31444;31441:12;31438:38;;;31456:18;;:::i;:::-;31493:13;;;31317:195;-1:-1:-1;;;31317:195:285:o;35137:184::-;35189:77;35186:1;35179:88;35286:4;35283:1;35276:15;35310:4;35307:1;35300:15", - "linkReferences": {} - }, - "methodIdentifiers": { - "GUARDIAN()": "724c184c", - "L2_ORACLE()": "001c2ff6", - "SYSTEM_CONFIG()": "f0498750", - "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,bool)": "fecf9734", - "isOutputFinalized(uint256)": "6dbffb78", - "l2Oracle()": "9b5f694a", - "l2Sender()": "9bf62d82", - "minimumGasLimit(uint64)": "a35d99df", - "params()": "cff0ab96", - "pause()": "8456cb59", - "paused()": "5c975abb", - "proveWithdrawalTransaction((uint256,address,address,uint256,uint256,bytes),uint256,(bytes32,bytes32,bytes32,bytes32),bytes[])": "4870496f", - "provenWithdrawals(bytes32)": "e965084c", - "systemConfig()": "33d7e2bd", - "unpause()": "3f4ba83a", - "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\":false,\"internalType\":\"address\",\"name\":\"account\",\"type\":\"address\"}],\"name\":\"Paused\",\"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\":false,\"internalType\":\"address\",\"name\":\"account\",\"type\":\"address\"}],\"name\":\"Unpaused\",\"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\":\"GUARDIAN\",\"outputs\":[{\"internalType\":\"address\",\"name\":\"\",\"type\":\"address\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"L2_ORACLE\",\"outputs\":[{\"internalType\":\"contract L2OutputOracle\",\"name\":\"\",\"type\":\"address\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"SYSTEM_CONFIG\",\"outputs\":[{\"internalType\":\"contract SystemConfig\",\"name\":\"\",\"type\":\"address\"}],\"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\":[],\"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\":\"address\",\"name\":\"_guardian\",\"type\":\"address\"},{\"internalType\":\"contract SystemConfig\",\"name\":\"_systemConfig\",\"type\":\"address\"},{\"internalType\":\"bool\",\"name\":\"_paused\",\"type\":\"bool\"}],\"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\":\"pause\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"paused\",\"outputs\":[{\"internalType\":\"bool\",\"name\":\"\",\"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\":\"systemConfig\",\"outputs\":[{\"internalType\":\"contract SystemConfig\",\"name\":\"\",\"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\"},{\"stateMutability\":\"payable\",\"type\":\"receive\"}],\"devdoc\":{\"custom:proxied\":\"@title OptimismPortal\",\"events\":{\"Paused(address)\":{\"params\":{\"account\":\"Address of the account triggering the pause.\"}},\"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.\"}},\"Unpaused(address)\":{\"params\":{\"account\":\"Address of the account triggering the unpause.\"}},\"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\":{\"GUARDIAN()\":{\"custom:legacy\":\"\"},\"L2_ORACLE()\":{\"custom:legacy\":\"\"},\"SYSTEM_CONFIG()\":{\"custom:legacy\":\"\"},\"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.\"}},\"initialize(address,address,address,bool)\":{\"params\":{\"_guardian\":\"Address that can pause withdrawals.\",\"_l2Oracle\":\"Address of the L2OutputOracle contract.\",\"_paused\":\"Sets the contract's pausability state.\",\"_systemConfig\":\"Address of the SystemConfig contract.\"}},\"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.\"}},\"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\":{\"guardian\":{\"custom:network-specific\":\"\"},\"l2Oracle\":{\"custom:network-specific\":\"\"},\"systemConfig\":{\"custom:network-specific\":\"\"},\"version\":{\"custom:semver\":\"1.10.0\"}},\"version\":1},\"userdoc\":{\"events\":{\"Paused(address)\":{\"notice\":\"Emitted when the pause is triggered.\"},\"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.\"},\"Unpaused(address)\":{\"notice\":\"Emitted when the pause is lifted.\"},\"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\":{\"GUARDIAN()\":{\"notice\":\"Getter for the Guardian\"},\"L2_ORACLE()\":{\"notice\":\"Getter for the L2OutputOracle\"},\"SYSTEM_CONFIG()\":{\"notice\":\"Getter for the SystemConfig\"},\"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\":\"Address that has the ability to pause and unpause withdrawals.\"},\"initialize(address,address,address,bool)\":{\"notice\":\"Initializer.\"},\"isOutputFinalized(uint256)\":{\"notice\":\"Determine if a given output is finalized. Reverts if the call to L2_ORACLE.getL2Output reverts. Returns a boolean otherwise.\"},\"l2Oracle()\":{\"notice\":\"Address of the L2OutputOracle contract.\"},\"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.\"},\"pause()\":{\"notice\":\"Pauses withdrawals.\"},\"paused()\":{\"notice\":\"Determines if cross domain messaging is paused. When set to true, withdrawals are paused. This may be removed in the future.\"},\"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.\"},\"systemConfig()\":{\"notice\":\"Address of the SystemConfig contract.\"},\"unpause()\":{\"notice\":\"Unpauses withdrawals.\"},\"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\":[\":@cwia/=lib/clones-with-immutable-args/src/\",\":@openzeppelin/contracts-upgradeable/=lib/openzeppelin-contracts-upgradeable/contracts/\",\":@openzeppelin/contracts/=lib/openzeppelin-contracts/contracts/\",\":@rari-capital/solmate/=lib/solmate/\",\":clones-with-immutable-args/=lib/clones-with-immutable-args/src/\",\":ds-test/=lib/forge-std/lib/ds-test/src/\",\":forge-std/=lib/forge-std/src/\",\":openzeppelin-contracts-upgradeable/=lib/openzeppelin-contracts-upgradeable/\",\":openzeppelin-contracts/=lib/openzeppelin-contracts/\",\":safe-contracts/=lib/safe-contracts/contracts/\",\":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\":\"0x60042eb3e619518cab9a8f2480b62871c2d813716e2e60d9a5e0c5f271c58705\",\"license\":\"MIT\",\"urls\":[\"bzz-raw://08538ef2aa99c508b56a8bb9b3c7b93476cba9dbf0b47783141e5e50a02156cc\",\"dweb:/ipfs/QmdvFZ1fUaTkNdmtB66rNAo73RxY7kccsgR6Uqz7psoXGN\"]},\"src/L1/OptimismPortal.sol\":{\"keccak256\":\"0xdca91a921b402d82b455d7f11027514e8a16dca906cf820b3afffe271beb8a13\",\"license\":\"MIT\",\"urls\":[\"bzz-raw://688912b9d6005af8395d5c2eb5c4e3367a8be7b50ea97c34fc6a7ac0e2d8fd6a\",\"dweb:/ipfs/QmNPJDwHpNmJ5VPWAJB8muRpZxYeySZDVoV1TMVN7roijJ\"]},\"src/L1/ResourceMetering.sol\":{\"keccak256\":\"0xa4d524f2a5e91a0b63a62603e712001c51c77e8371b93cbb576bcb7d074b7588\",\"license\":\"MIT\",\"urls\":[\"bzz-raw://d6d8141b6c6dc72d2e684c1ae388c005fd78c9ca7fc9c15dddebd227ca4fd730\",\"dweb:/ipfs/QmPfJrR4qssu769TDWJnxdTozqKtZUxiY8fs95bhfECTvG\"]},\"src/L1/SystemConfig.sol\":{\"keccak256\":\"0x4bbbc7868e948c44f29285a69383e93251a0c330a67929fb72def01cec060d4e\",\"license\":\"MIT\",\"urls\":[\"bzz-raw://1e7ea2f8b3d49bee9c753f107ede6eda93b2cc0e34d0643fa14ebbb26c19e71b\",\"dweb:/ipfs/QmRP81F8FRVXVZs6u2f2poEPDnbFZhNwNYxHgCVEhGpEmB\"]},\"src/libraries/Arithmetic.sol\":{\"keccak256\":\"0x06a5a8b00527843f0cfc1bb3c0661316966a6cc432f88be31f23cde78cd07560\",\"license\":\"MIT\",\"urls\":[\"bzz-raw://d5209e78e5415c0bf8b350362a825cc56152811abd6fcf2df3d4fa47766d3dee\",\"dweb:/ipfs/Qmf43xyc4Um32NmccayDfhm8kSnS2mhHXpPZnwABJS7cWm\"]},\"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\":\"0xe12e392f05f80d3837c9392d016471181ae1ee6b84ea91b4e125e6523e5f18a2\",\"license\":\"MIT\",\"urls\":[\"bzz-raw://a3509231c228b7a4352573cd422cf0260dcbb94cfd915e5b664643db5475a5b7\",\"dweb:/ipfs/QmU2QERY4mHxqWFqSE5Exsy6Ftc5MTjTtYHC11fahLJWDC\"]},\"src/libraries/Encoding.sol\":{\"keccak256\":\"0xd5bbcb7da113e69562498d9543765e03912558ad66348682c2049c31e19f9d9b\",\"license\":\"MIT\",\"urls\":[\"bzz-raw://afc6656ea10062c0c9d0817bb8683636caebf9222c9c102f29ea54fff74a2f93\",\"dweb:/ipfs/QmTNWtMgrTRHM6XtdUmA8bMZcuFpXoFCXgXR5vRihZWLuW\"]},\"src/libraries/Hashing.sol\":{\"keccak256\":\"0x44e2b2dcfffc39c0fc95ccd3c2118c7e7585fadf3dca327877d5756c7d4b21c3\",\"license\":\"MIT\",\"urls\":[\"bzz-raw://6c89e0d9cfcb08a0d3c46c85367a32bbd9703468ba4c0c5bb6e124c1d173b26b\",\"dweb:/ipfs/QmaY3nQHBBhHK1wrurVXiEeNL8hfZ1pRmhpqW44tFDJnDf\"]},\"src/libraries/SafeCall.sol\":{\"keccak256\":\"0x0636a7abb242bb5d6f5606967c8929e6aa7e63468c1e2ce40ad4780d4c4bf94f\",\"license\":\"MIT\",\"urls\":[\"bzz-raw://a4daec2ac8f9907bbf84ef0a1c48f03bae8657619bc6f42b3a672f25c516f17a\",\"dweb:/ipfs/Qmf8gfRxBv8gEmCkP8YMPb2GGfj9QUnoNUyKE7UR2SWGnq\"]},\"src/libraries/Storage.sol\":{\"keccak256\":\"0x902a0a815272a5b76c647d9e82101aca765e9835a6624d0857088b9da0f58afd\",\"license\":\"MIT\",\"urls\":[\"bzz-raw://9c39a697aacb0a2eac0bf1fbd7790d835a685c61006f6d3464e19cbc96a24480\",\"dweb:/ipfs/QmV3T8ZTRWPB5CNuZjxwWQNoENd7W4SoBMnFG6Y6g6xYV4\"]},\"src/libraries/Types.sol\":{\"keccak256\":\"0x75900d651301940d24c00d14f0b3b6cbd6dcf379173ceaa31d9bf5be934a9aa4\",\"license\":\"MIT\",\"urls\":[\"bzz-raw://99c2632c5bf4fa3982391c32110eec9fa07917b483b2442cbaf18bdde5bdb24e\",\"dweb:/ipfs/QmSUs6Amkeootf5gKGbKi4mJpvhN2U8i1ED6ef2dskV5xc\"]},\"src/libraries/rlp/RLPReader.sol\":{\"keccak256\":\"0x9ba74a3b0a11693e622380807d213d5d1250d974e18b2cd768da9cbe719a6778\",\"license\":\"MIT\",\"urls\":[\"bzz-raw://0808d721ed9e05707526ee134faa051d707a95ee6b8bd6e0b1972275da8e5723\",\"dweb:/ipfs/QmcTTPu9xgckfWdbFUAcr2RAgk3J6vzyR4FpV798TjFMeN\"]},\"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": [ - { - "internalType": "uint8", - "name": "version", - "type": "uint8", - "indexed": false - } - ], - "type": "event", - "name": "Initialized", - "anonymous": false - }, - { - "inputs": [ - { - "internalType": "address", - "name": "account", - "type": "address", - "indexed": false - } - ], - "type": "event", - "name": "Paused", - "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": "address", - "name": "account", - "type": "address", - "indexed": false - } - ], - "type": "event", - "name": "Unpaused", - "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": [], - "stateMutability": "view", - "type": "function", - "name": "GUARDIAN", - "outputs": [ - { - "internalType": "address", - "name": "", - "type": "address" - } - ] - }, - { - "inputs": [], - "stateMutability": "view", - "type": "function", - "name": "L2_ORACLE", - "outputs": [ - { - "internalType": "contract L2OutputOracle", - "name": "", - "type": "address" - } - ] - }, - { - "inputs": [], - "stateMutability": "view", - "type": "function", - "name": "SYSTEM_CONFIG", - "outputs": [ - { - "internalType": "contract SystemConfig", - "name": "", - "type": "address" - } - ] - }, - { - "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": "address", - "name": "_guardian", - "type": "address" - }, - { - "internalType": "contract SystemConfig", - "name": "_systemConfig", - "type": "address" - }, - { - "internalType": "bool", - "name": "_paused", - "type": "bool" - } - ], - "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": "nonpayable", - "type": "function", - "name": "pause" - }, - { - "inputs": [], - "stateMutability": "view", - "type": "function", - "name": "paused", - "outputs": [ - { - "internalType": "bool", - "name": "", - "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": "systemConfig", - "outputs": [ - { - "internalType": "contract SystemConfig", - "name": "", - "type": "address" - } - ] - }, - { - "inputs": [], - "stateMutability": "nonpayable", - "type": "function", - "name": "unpause" - }, - { - "inputs": [], - "stateMutability": "view", - "type": "function", - "name": "version", - "outputs": [ - { - "internalType": "string", - "name": "", - "type": "string" - } - ] - }, - { - "inputs": [], - "stateMutability": "payable", - "type": "receive" - } - ], - "devdoc": { - "kind": "dev", - "methods": { - "GUARDIAN()": { - "custom:legacy": "" - }, - "L2_ORACLE()": { - "custom:legacy": "" - }, - "SYSTEM_CONFIG()": { - "custom:legacy": "" - }, - "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." - } - }, - "initialize(address,address,address,bool)": { - "params": { - "_guardian": "Address that can pause withdrawals.", - "_l2Oracle": "Address of the L2OutputOracle contract.", - "_paused": "Sets the contract's pausability state.", - "_systemConfig": "Address of the SystemConfig contract." - } - }, - "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." - } - }, - "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": { - "GUARDIAN()": { - "notice": "Getter for the Guardian" - }, - "L2_ORACLE()": { - "notice": "Getter for the L2OutputOracle" - }, - "SYSTEM_CONFIG()": { - "notice": "Getter for the SystemConfig" - }, - "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": "Address that has the ability to pause and unpause withdrawals." - }, - "initialize(address,address,address,bool)": { - "notice": "Initializer." - }, - "isOutputFinalized(uint256)": { - "notice": "Determine if a given output is finalized. Reverts if the call to L2_ORACLE.getL2Output reverts. Returns a boolean otherwise." - }, - "l2Oracle()": { - "notice": "Address of the L2OutputOracle contract." - }, - "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." - }, - "pause()": { - "notice": "Pauses withdrawals." - }, - "paused()": { - "notice": "Determines if cross domain messaging is paused. When set to true, withdrawals are paused. This may be removed in the future." - }, - "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." - }, - "systemConfig()": { - "notice": "Address of the SystemConfig contract." - }, - "unpause()": { - "notice": "Unpauses withdrawals." - }, - "version()": { - "notice": "Semantic version." - } - }, - "version": 1 - } - }, - "settings": { - "remappings": [ - "@cwia/=lib/clones-with-immutable-args/src/", - "@openzeppelin/contracts-upgradeable/=lib/openzeppelin-contracts-upgradeable/contracts/", - "@openzeppelin/contracts/=lib/openzeppelin-contracts/contracts/", - "@rari-capital/solmate/=lib/solmate/", - "clones-with-immutable-args/=lib/clones-with-immutable-args/src/", - "ds-test/=lib/forge-std/lib/ds-test/src/", - "forge-std/=lib/forge-std/src/", - "openzeppelin-contracts-upgradeable/=lib/openzeppelin-contracts-upgradeable/", - "openzeppelin-contracts/=lib/openzeppelin-contracts/", - "safe-contracts/=lib/safe-contracts/contracts/", - "solmate/=lib/solmate/src/" - ], - "optimizer": { - "enabled": true, - "runs": 999999 - }, - "metadata": { - "bytecodeHash": "none" - }, - "compilationTarget": { - "src/L1/OptimismPortal.sol": "OptimismPortal" - }, - "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": "0x60042eb3e619518cab9a8f2480b62871c2d813716e2e60d9a5e0c5f271c58705", - "urls": [ - "bzz-raw://08538ef2aa99c508b56a8bb9b3c7b93476cba9dbf0b47783141e5e50a02156cc", - "dweb:/ipfs/QmdvFZ1fUaTkNdmtB66rNAo73RxY7kccsgR6Uqz7psoXGN" - ], - "license": "MIT" - }, - "src/L1/OptimismPortal.sol": { - "keccak256": "0xdca91a921b402d82b455d7f11027514e8a16dca906cf820b3afffe271beb8a13", - "urls": [ - "bzz-raw://688912b9d6005af8395d5c2eb5c4e3367a8be7b50ea97c34fc6a7ac0e2d8fd6a", - "dweb:/ipfs/QmNPJDwHpNmJ5VPWAJB8muRpZxYeySZDVoV1TMVN7roijJ" - ], - "license": "MIT" - }, - "src/L1/ResourceMetering.sol": { - "keccak256": "0xa4d524f2a5e91a0b63a62603e712001c51c77e8371b93cbb576bcb7d074b7588", - "urls": [ - "bzz-raw://d6d8141b6c6dc72d2e684c1ae388c005fd78c9ca7fc9c15dddebd227ca4fd730", - "dweb:/ipfs/QmPfJrR4qssu769TDWJnxdTozqKtZUxiY8fs95bhfECTvG" - ], - "license": "MIT" - }, - "src/L1/SystemConfig.sol": { - "keccak256": "0x4bbbc7868e948c44f29285a69383e93251a0c330a67929fb72def01cec060d4e", - "urls": [ - "bzz-raw://1e7ea2f8b3d49bee9c753f107ede6eda93b2cc0e34d0643fa14ebbb26c19e71b", - "dweb:/ipfs/QmRP81F8FRVXVZs6u2f2poEPDnbFZhNwNYxHgCVEhGpEmB" - ], - "license": "MIT" - }, - "src/libraries/Arithmetic.sol": { - "keccak256": "0x06a5a8b00527843f0cfc1bb3c0661316966a6cc432f88be31f23cde78cd07560", - "urls": [ - "bzz-raw://d5209e78e5415c0bf8b350362a825cc56152811abd6fcf2df3d4fa47766d3dee", - "dweb:/ipfs/Qmf43xyc4Um32NmccayDfhm8kSnS2mhHXpPZnwABJS7cWm" - ], - "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": "0xe12e392f05f80d3837c9392d016471181ae1ee6b84ea91b4e125e6523e5f18a2", - "urls": [ - "bzz-raw://a3509231c228b7a4352573cd422cf0260dcbb94cfd915e5b664643db5475a5b7", - "dweb:/ipfs/QmU2QERY4mHxqWFqSE5Exsy6Ftc5MTjTtYHC11fahLJWDC" - ], - "license": "MIT" - }, - "src/libraries/Encoding.sol": { - "keccak256": "0xd5bbcb7da113e69562498d9543765e03912558ad66348682c2049c31e19f9d9b", - "urls": [ - "bzz-raw://afc6656ea10062c0c9d0817bb8683636caebf9222c9c102f29ea54fff74a2f93", - "dweb:/ipfs/QmTNWtMgrTRHM6XtdUmA8bMZcuFpXoFCXgXR5vRihZWLuW" - ], - "license": "MIT" - }, - "src/libraries/Hashing.sol": { - "keccak256": "0x44e2b2dcfffc39c0fc95ccd3c2118c7e7585fadf3dca327877d5756c7d4b21c3", - "urls": [ - "bzz-raw://6c89e0d9cfcb08a0d3c46c85367a32bbd9703468ba4c0c5bb6e124c1d173b26b", - "dweb:/ipfs/QmaY3nQHBBhHK1wrurVXiEeNL8hfZ1pRmhpqW44tFDJnDf" - ], - "license": "MIT" - }, - "src/libraries/SafeCall.sol": { - "keccak256": "0x0636a7abb242bb5d6f5606967c8929e6aa7e63468c1e2ce40ad4780d4c4bf94f", - "urls": [ - "bzz-raw://a4daec2ac8f9907bbf84ef0a1c48f03bae8657619bc6f42b3a672f25c516f17a", - "dweb:/ipfs/Qmf8gfRxBv8gEmCkP8YMPb2GGfj9QUnoNUyKE7UR2SWGnq" - ], - "license": "MIT" - }, - "src/libraries/Storage.sol": { - "keccak256": "0x902a0a815272a5b76c647d9e82101aca765e9835a6624d0857088b9da0f58afd", - "urls": [ - "bzz-raw://9c39a697aacb0a2eac0bf1fbd7790d835a685c61006f6d3464e19cbc96a24480", - "dweb:/ipfs/QmV3T8ZTRWPB5CNuZjxwWQNoENd7W4SoBMnFG6Y6g6xYV4" - ], - "license": "MIT" - }, - "src/libraries/Types.sol": { - "keccak256": "0x75900d651301940d24c00d14f0b3b6cbd6dcf379173ceaa31d9bf5be934a9aa4", - "urls": [ - "bzz-raw://99c2632c5bf4fa3982391c32110eec9fa07917b483b2442cbaf18bdde5bdb24e", - "dweb:/ipfs/QmSUs6Amkeootf5gKGbKi4mJpvhN2U8i1ED6ef2dskV5xc" - ], - "license": "MIT" - }, - "src/libraries/rlp/RLPReader.sol": { - "keccak256": "0x9ba74a3b0a11693e622380807d213d5d1250d974e18b2cd768da9cbe719a6778", - "urls": [ - "bzz-raw://0808d721ed9e05707526ee134faa051d707a95ee6b8bd6e0b1972275da8e5723", - "dweb:/ipfs/QmcTTPu9xgckfWdbFUAcr2RAgk3J6vzyR4FpV798TjFMeN" - ], - "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": 32100, - "contract": "src/L1/OptimismPortal.sol:OptimismPortal", - "label": "_initialized", - "offset": 0, - "slot": "0", - "type": "t_uint8" - }, - { - "astId": 32103, - "contract": "src/L1/OptimismPortal.sol:OptimismPortal", - "label": "_initializing", - "offset": 1, - "slot": "0", - "type": "t_bool" - }, - { - "astId": 60287, - "contract": "src/L1/OptimismPortal.sol:OptimismPortal", - "label": "params", - "offset": 0, - "slot": "1", - "type": "t_struct(ResourceParams)60270_storage" - }, - { - "astId": 60292, - "contract": "src/L1/OptimismPortal.sol:OptimismPortal", - "label": "__gap", - "offset": 0, - "slot": "2", - "type": "t_array(t_uint256)48_storage" - }, - { - "astId": 59323, - "contract": "src/L1/OptimismPortal.sol:OptimismPortal", - "label": "l2Sender", - "offset": 0, - "slot": "50", - "type": "t_address" - }, - { - "astId": 59328, - "contract": "src/L1/OptimismPortal.sol:OptimismPortal", - "label": "finalizedWithdrawals", - "offset": 0, - "slot": "51", - "type": "t_mapping(t_bytes32,t_bool)" - }, - { - "astId": 59334, - "contract": "src/L1/OptimismPortal.sol:OptimismPortal", - "label": "provenWithdrawals", - "offset": 0, - "slot": "52", - "type": "t_mapping(t_bytes32,t_struct(ProvenWithdrawal)59312_storage)" - }, - { - "astId": 59337, - "contract": "src/L1/OptimismPortal.sol:OptimismPortal", - "label": "paused", - "offset": 0, - "slot": "53", - "type": "t_bool" - }, - { - "astId": 59341, - "contract": "src/L1/OptimismPortal.sol:OptimismPortal", - "label": "l2Oracle", - "offset": 1, - "slot": "53", - "type": "t_contract(L2OutputOracle)59272" - }, - { - "astId": 59345, - "contract": "src/L1/OptimismPortal.sol:OptimismPortal", - "label": "systemConfig", - "offset": 0, - "slot": "54", - "type": "t_contract(SystemConfig)61393" - }, - { - "astId": 59348, - "contract": "src/L1/OptimismPortal.sol:OptimismPortal", - "label": "guardian", - "offset": 0, - "slot": "55", - "type": "t_address" - } - ], - "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)59272": { - "encoding": "inplace", - "label": "contract L2OutputOracle", - "numberOfBytes": "20" - }, - "t_contract(SystemConfig)61393": { - "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)59312_storage)": { - "encoding": "mapping", - "key": "t_bytes32", - "label": "mapping(bytes32 => struct OptimismPortal.ProvenWithdrawal)", - "numberOfBytes": "32", - "value": "t_struct(ProvenWithdrawal)59312_storage" - }, - "t_struct(ProvenWithdrawal)59312_storage": { - "encoding": "inplace", - "label": "struct OptimismPortal.ProvenWithdrawal", - "numberOfBytes": "64", - "members": [ - { - "astId": 59307, - "contract": "src/L1/OptimismPortal.sol:OptimismPortal", - "label": "outputRoot", - "offset": 0, - "slot": "0", - "type": "t_bytes32" - }, - { - "astId": 59309, - "contract": "src/L1/OptimismPortal.sol:OptimismPortal", - "label": "timestamp", - "offset": 0, - "slot": "1", - "type": "t_uint128" - }, - { - "astId": 59311, - "contract": "src/L1/OptimismPortal.sol:OptimismPortal", - "label": "l2OutputIndex", - "offset": 16, - "slot": "1", - "type": "t_uint128" - } - ] - }, - "t_struct(ResourceParams)60270_storage": { - "encoding": "inplace", - "label": "struct ResourceMetering.ResourceParams", - "numberOfBytes": "32", - "members": [ - { - "astId": 60265, - "contract": "src/L1/OptimismPortal.sol:OptimismPortal", - "label": "prevBaseFee", - "offset": 0, - "slot": "0", - "type": "t_uint128" - }, - { - "astId": 60267, - "contract": "src/L1/OptimismPortal.sol:OptimismPortal", - "label": "prevBoughtGas", - "offset": 16, - "slot": "0", - "type": "t_uint64" - }, - { - "astId": 60269, - "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": { - "GUARDIAN()": { - "notice": "Getter for the Guardian" - }, - "L2_ORACLE()": { - "notice": "Getter for the L2OutputOracle" - }, - "SYSTEM_CONFIG()": { - "notice": "Getter for the SystemConfig" - }, - "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": "Address that has the ability to pause and unpause withdrawals." - }, - "initialize(address,address,address,bool)": { - "notice": "Initializer." - }, - "isOutputFinalized(uint256)": { - "notice": "Determine if a given output is finalized. Reverts if the call to L2_ORACLE.getL2Output reverts. Returns a boolean otherwise." - }, - "l2Oracle()": { - "notice": "Address of the L2OutputOracle contract." - }, - "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." - }, - "pause()": { - "notice": "Pauses withdrawals." - }, - "paused()": { - "notice": "Determines if cross domain messaging is paused. When set to true, withdrawals are paused. This may be removed in the future." - }, - "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." - }, - "systemConfig()": { - "notice": "Address of the SystemConfig contract." - }, - "unpause()": { - "notice": "Unpauses withdrawals." - }, - "version()": { - "notice": "Semantic version." - } - }, - "events": { - "Paused(address)": { - "notice": "Emitted when the pause is triggered." - }, - "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." - }, - "Unpaused(address)": { - "notice": "Emitted when the pause is lifted." - }, - "WithdrawalFinalized(bytes32,bool)": { - "notice": "Emitted when a withdrawal transaction is finalized." - }, - "WithdrawalProven(bytes32,address,address)": { - "notice": "Emitted when a withdrawal transaction is proven." - } - }, - "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": { - "GUARDIAN()": {}, - "L2_ORACLE()": {}, - "SYSTEM_CONFIG()": {}, - "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." - } - }, - "initialize(address,address,address,bool)": { - "params": { - "_guardian": "Address that can pause withdrawals.", - "_l2Oracle": "Address of the L2OutputOracle contract.", - "_paused": "Sets the contract's pausability state.", - "_systemConfig": "Address of the SystemConfig contract." - } - }, - "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." - } - }, - "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": { - "Paused(address)": { - "params": { - "account": "Address of the account triggering the pause." - } - }, - "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." - } - }, - "Unpaused(address)": { - "params": { - "account": "Address of the account triggering the unpause." - } - }, - "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": 59998, - "exportedSymbols": { - "AddressAliasHelper": [ - 78127 - ], - "Constants": [ - 69571 - ], - "Hashing": [ - 70279 - ], - "ISemver": [ - 75669 - ], - "Initializable": [ - 32244 - ], - "L2OutputOracle": [ - 59272 - ], - "OptimismPortal": [ - 59997 - ], - "ResourceMetering": [ - 60599 - ], - "SafeCall": [ - 70479 - ], - "SecureMerkleTrie": [ - 72279 - ], - "SystemConfig": [ - 61393 - ], - "Types": [ - 70595 - ] - }, - "nodeType": "SourceUnit", - "src": "32:21369:110", - "nodes": [ - { - "id": 59274, - "nodeType": "PragmaDirective", - "src": "32:23:110", - "nodes": [], - "literals": [ - "solidity", - "0.8", - ".15" - ] - }, - { - "id": 59276, - "nodeType": "ImportDirective", - "src": "57:86:110", - "nodes": [], - "absolutePath": "lib/openzeppelin-contracts/contracts/proxy/utils/Initializable.sol", - "file": "@openzeppelin/contracts/proxy/utils/Initializable.sol", - "nameLocation": "-1:-1:-1", - "scope": 59998, - "sourceUnit": 32245, - "symbolAliases": [ - { - "foreign": { - "id": 59275, - "name": "Initializable", - "nodeType": "Identifier", - "overloadedDeclarations": [], - "referencedDeclaration": 32244, - "src": "66:13:110", - "typeDescriptions": {} - }, - "nameLocation": "-1:-1:-1" - } - ], - "unitAlias": "" - }, - { - "id": 59278, - "nodeType": "ImportDirective", - "src": "144:54:110", - "nodes": [], - "absolutePath": "src/libraries/SafeCall.sol", - "file": "src/libraries/SafeCall.sol", - "nameLocation": "-1:-1:-1", - "scope": 59998, - "sourceUnit": 70480, - "symbolAliases": [ - { - "foreign": { - "id": 59277, - "name": "SafeCall", - "nodeType": "Identifier", - "overloadedDeclarations": [], - "referencedDeclaration": 70479, - "src": "153:8:110", - "typeDescriptions": {} - }, - "nameLocation": "-1:-1:-1" - } - ], - "unitAlias": "" - }, - { - "id": 59280, - "nodeType": "ImportDirective", - "src": "199:59:110", - "nodes": [], - "absolutePath": "src/L1/L2OutputOracle.sol", - "file": "src/L1/L2OutputOracle.sol", - "nameLocation": "-1:-1:-1", - "scope": 59998, - "sourceUnit": 59273, - "symbolAliases": [ - { - "foreign": { - "id": 59279, - "name": "L2OutputOracle", - "nodeType": "Identifier", - "overloadedDeclarations": [], - "referencedDeclaration": 59272, - "src": "208:14:110", - "typeDescriptions": {} - }, - "nameLocation": "-1:-1:-1" - } - ], - "unitAlias": "" - }, - { - "id": 59282, - "nodeType": "ImportDirective", - "src": "259:55:110", - "nodes": [], - "absolutePath": "src/L1/SystemConfig.sol", - "file": "src/L1/SystemConfig.sol", - "nameLocation": "-1:-1:-1", - "scope": 59998, - "sourceUnit": 61394, - "symbolAliases": [ - { - "foreign": { - "id": 59281, - "name": "SystemConfig", - "nodeType": "Identifier", - "overloadedDeclarations": [], - "referencedDeclaration": 61393, - "src": "268:12:110", - "typeDescriptions": {} - }, - "nameLocation": "-1:-1:-1" - } - ], - "unitAlias": "" - }, - { - "id": 59284, - "nodeType": "ImportDirective", - "src": "315:56:110", - "nodes": [], - "absolutePath": "src/libraries/Constants.sol", - "file": "src/libraries/Constants.sol", - "nameLocation": "-1:-1:-1", - "scope": 59998, - "sourceUnit": 69572, - "symbolAliases": [ - { - "foreign": { - "id": 59283, - "name": "Constants", - "nodeType": "Identifier", - "overloadedDeclarations": [], - "referencedDeclaration": 69571, - "src": "324:9:110", - "typeDescriptions": {} - }, - "nameLocation": "-1:-1:-1" - } - ], - "unitAlias": "" - }, - { - "id": 59286, - "nodeType": "ImportDirective", - "src": "372:48:110", - "nodes": [], - "absolutePath": "src/libraries/Types.sol", - "file": "src/libraries/Types.sol", - "nameLocation": "-1:-1:-1", - "scope": 59998, - "sourceUnit": 70596, - "symbolAliases": [ - { - "foreign": { - "id": 59285, - "name": "Types", - "nodeType": "Identifier", - "overloadedDeclarations": [], - "referencedDeclaration": 70595, - "src": "381:5:110", - "typeDescriptions": {} - }, - "nameLocation": "-1:-1:-1" - } - ], - "unitAlias": "" - }, - { - "id": 59288, - "nodeType": "ImportDirective", - "src": "421:52:110", - "nodes": [], - "absolutePath": "src/libraries/Hashing.sol", - "file": "src/libraries/Hashing.sol", - "nameLocation": "-1:-1:-1", - "scope": 59998, - "sourceUnit": 70280, - "symbolAliases": [ - { - "foreign": { - "id": 59287, - "name": "Hashing", - "nodeType": "Identifier", - "overloadedDeclarations": [], - "referencedDeclaration": 70279, - "src": "430:7:110", - "typeDescriptions": {} - }, - "nameLocation": "-1:-1:-1" - } - ], - "unitAlias": "" - }, - { - "id": 59290, - "nodeType": "ImportDirective", - "src": "474:75:110", - "nodes": [], - "absolutePath": "src/libraries/trie/SecureMerkleTrie.sol", - "file": "src/libraries/trie/SecureMerkleTrie.sol", - "nameLocation": "-1:-1:-1", - "scope": 59998, - "sourceUnit": 72280, - "symbolAliases": [ - { - "foreign": { - "id": 59289, - "name": "SecureMerkleTrie", - "nodeType": "Identifier", - "overloadedDeclarations": [], - "referencedDeclaration": 72279, - "src": "483:16:110", - "typeDescriptions": {} - }, - "nameLocation": "-1:-1:-1" - } - ], - "unitAlias": "" - }, - { - "id": 59292, - "nodeType": "ImportDirective", - "src": "550:71:110", - "nodes": [], - "absolutePath": "src/vendor/AddressAliasHelper.sol", - "file": "src/vendor/AddressAliasHelper.sol", - "nameLocation": "-1:-1:-1", - "scope": 59998, - "sourceUnit": 78128, - "symbolAliases": [ - { - "foreign": { - "id": 59291, - "name": "AddressAliasHelper", - "nodeType": "Identifier", - "overloadedDeclarations": [], - "referencedDeclaration": 78127, - "src": "559:18:110", - "typeDescriptions": {} - }, - "nameLocation": "-1:-1:-1" - } - ], - "unitAlias": "" - }, - { - "id": 59294, - "nodeType": "ImportDirective", - "src": "622:63:110", - "nodes": [], - "absolutePath": "src/L1/ResourceMetering.sol", - "file": "src/L1/ResourceMetering.sol", - "nameLocation": "-1:-1:-1", - "scope": 59998, - "sourceUnit": 60600, - "symbolAliases": [ - { - "foreign": { - "id": 59293, - "name": "ResourceMetering", - "nodeType": "Identifier", - "overloadedDeclarations": [], - "referencedDeclaration": 60599, - "src": "631:16:110", - "typeDescriptions": {} - }, - "nameLocation": "-1:-1:-1" - } - ], - "unitAlias": "" - }, - { - "id": 59296, - "nodeType": "ImportDirective", - "src": "686:52:110", - "nodes": [], - "absolutePath": "src/universal/ISemver.sol", - "file": "src/universal/ISemver.sol", - "nameLocation": "-1:-1:-1", - "scope": 59998, - "sourceUnit": 75670, - "symbolAliases": [ - { - "foreign": { - "id": 59295, - "name": "ISemver", - "nodeType": "Identifier", - "overloadedDeclarations": [], - "referencedDeclaration": 75669, - "src": "695:7:110", - "typeDescriptions": {} - }, - "nameLocation": "-1:-1:-1" - } - ], - "unitAlias": "" - }, - { - "id": 59298, - "nodeType": "ImportDirective", - "src": "739:56:110", - "nodes": [], - "absolutePath": "src/libraries/Constants.sol", - "file": "src/libraries/Constants.sol", - "nameLocation": "-1:-1:-1", - "scope": 59998, - "sourceUnit": 69572, - "symbolAliases": [ - { - "foreign": { - "id": 59297, - "name": "Constants", - "nodeType": "Identifier", - "overloadedDeclarations": [], - "referencedDeclaration": 69571, - "src": "748:9:110", - "typeDescriptions": {} - }, - "nameLocation": "-1:-1:-1" - } - ], - "unitAlias": "" - }, - { - "id": 59997, - "nodeType": "ContractDefinition", - "src": "1135:20265:110", - "nodes": [ - { - "id": 59312, - "nodeType": "StructDefinition", - "src": "1503:117:110", - "nodes": [], - "canonicalName": "OptimismPortal.ProvenWithdrawal", - "members": [ - { - "constant": false, - "id": 59307, - "mutability": "mutable", - "name": "outputRoot", - "nameLocation": "1545:10:110", - "nodeType": "VariableDeclaration", - "scope": 59312, - "src": "1537:18:110", - "stateVariable": false, - "storageLocation": "default", - "typeDescriptions": { - "typeIdentifier": "t_bytes32", - "typeString": "bytes32" - }, - "typeName": { - "id": 59306, - "name": "bytes32", - "nodeType": "ElementaryTypeName", - "src": "1537:7:110", - "typeDescriptions": { - "typeIdentifier": "t_bytes32", - "typeString": "bytes32" - } - }, - "visibility": "internal" - }, - { - "constant": false, - "id": 59309, - "mutability": "mutable", - "name": "timestamp", - "nameLocation": "1573:9:110", - "nodeType": "VariableDeclaration", - "scope": 59312, - "src": "1565:17:110", - "stateVariable": false, - "storageLocation": "default", - "typeDescriptions": { - "typeIdentifier": "t_uint128", - "typeString": "uint128" - }, - "typeName": { - "id": 59308, - "name": "uint128", - "nodeType": "ElementaryTypeName", - "src": "1565:7:110", - "typeDescriptions": { - "typeIdentifier": "t_uint128", - "typeString": "uint128" - } - }, - "visibility": "internal" - }, - { - "constant": false, - "id": 59311, - "mutability": "mutable", - "name": "l2OutputIndex", - "nameLocation": "1600:13:110", - "nodeType": "VariableDeclaration", - "scope": 59312, - "src": "1592:21:110", - "stateVariable": false, - "storageLocation": "default", - "typeDescriptions": { - "typeIdentifier": "t_uint128", - "typeString": "uint128" - }, - "typeName": { - "id": 59310, - "name": "uint128", - "nodeType": "ElementaryTypeName", - "src": "1592:7:110", - "typeDescriptions": { - "typeIdentifier": "t_uint128", - "typeString": "uint128" - } - }, - "visibility": "internal" - } - ], - "name": "ProvenWithdrawal", - "nameLocation": "1510:16:110", - "scope": 59997, - "visibility": "public" - }, - { - "id": 59316, - "nodeType": "VariableDeclaration", - "src": "1672:45:110", - "nodes": [], - "constant": true, - "documentation": { - "id": 59313, - "nodeType": "StructuredDocumentation", - "src": "1626:41:110", - "text": "@notice Version of the deposit event." - }, - "mutability": "constant", - "name": "DEPOSIT_VERSION", - "nameLocation": "1698:15:110", - "scope": 59997, - "stateVariable": true, - "storageLocation": "default", - "typeDescriptions": { - "typeIdentifier": "t_uint256", - "typeString": "uint256" - }, - "typeName": { - "id": 59314, - "name": "uint256", - "nodeType": "ElementaryTypeName", - "src": "1672:7:110", - "typeDescriptions": { - "typeIdentifier": "t_uint256", - "typeString": "uint256" - } - }, - "value": { - "hexValue": "30", - "id": 59315, - "isConstant": false, - "isLValue": false, - "isPure": true, - "kind": "number", - "lValueRequested": false, - "nodeType": "Literal", - "src": "1716:1:110", - "typeDescriptions": { - "typeIdentifier": "t_rational_0_by_1", - "typeString": "int_const 0" - }, - "value": "0" - }, - "visibility": "internal" - }, - { - "id": 59320, - "nodeType": "VariableDeclaration", - "src": "1813:60:110", - "nodes": [], - "constant": true, - "documentation": { - "id": 59317, - "nodeType": "StructuredDocumentation", - "src": "1724:84:110", - "text": "@notice The L2 gas limit set when eth is deposited using the receive() function." - }, - "mutability": "constant", - "name": "RECEIVE_DEFAULT_GAS_LIMIT", - "nameLocation": "1838:25:110", - "scope": 59997, - "stateVariable": true, - "storageLocation": "default", - "typeDescriptions": { - "typeIdentifier": "t_uint64", - "typeString": "uint64" - }, - "typeName": { - "id": 59318, - "name": "uint64", - "nodeType": "ElementaryTypeName", - "src": "1813:6:110", - "typeDescriptions": { - "typeIdentifier": "t_uint64", - "typeString": "uint64" - } - }, - "value": { - "hexValue": "3130305f303030", - "id": 59319, - "isConstant": false, - "isLValue": false, - "isPure": true, - "kind": "number", - "lValueRequested": false, - "nodeType": "Literal", - "src": "1866:7:110", - "typeDescriptions": { - "typeIdentifier": "t_rational_100000_by_1", - "typeString": "int_const 100000" - }, - "value": "100_000" - }, - "visibility": "internal" - }, - { - "id": 59323, - "nodeType": "VariableDeclaration", - "src": "2129:23:110", - "nodes": [], - "constant": false, - "documentation": { - "id": 59321, - "nodeType": "StructuredDocumentation", - "src": "1880:244:110", - "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": "2144:8:110", - "scope": 59997, - "stateVariable": true, - "storageLocation": "default", - "typeDescriptions": { - "typeIdentifier": "t_address", - "typeString": "address" - }, - "typeName": { - "id": 59322, - "name": "address", - "nodeType": "ElementaryTypeName", - "src": "2129:7:110", - "stateMutability": "nonpayable", - "typeDescriptions": { - "typeIdentifier": "t_address", - "typeString": "address" - } - }, - "visibility": "public" - }, - { - "id": 59328, - "nodeType": "VariableDeclaration", - "src": "2243:52:110", - "nodes": [], - "constant": false, - "documentation": { - "id": 59324, - "nodeType": "StructuredDocumentation", - "src": "2159:79:110", - "text": "@notice A list of withdrawal hashes which have been successfully finalized." - }, - "functionSelector": "a14238e7", - "mutability": "mutable", - "name": "finalizedWithdrawals", - "nameLocation": "2275:20:110", - "scope": 59997, - "stateVariable": true, - "storageLocation": "default", - "typeDescriptions": { - "typeIdentifier": "t_mapping$_t_bytes32_$_t_bool_$", - "typeString": "mapping(bytes32 => bool)" - }, - "typeName": { - "id": 59327, - "keyType": { - "id": 59325, - "name": "bytes32", - "nodeType": "ElementaryTypeName", - "src": "2251:7:110", - "typeDescriptions": { - "typeIdentifier": "t_bytes32", - "typeString": "bytes32" - } - }, - "nodeType": "Mapping", - "src": "2243:24:110", - "typeDescriptions": { - "typeIdentifier": "t_mapping$_t_bytes32_$_t_bool_$", - "typeString": "mapping(bytes32 => bool)" - }, - "valueType": { - "id": 59326, - "name": "bool", - "nodeType": "ElementaryTypeName", - "src": "2262:4:110", - "typeDescriptions": { - "typeIdentifier": "t_bool", - "typeString": "bool" - } - } - }, - "visibility": "public" - }, - { - "id": 59334, - "nodeType": "VariableDeclaration", - "src": "2377:61:110", - "nodes": [], - "constant": false, - "documentation": { - "id": 59329, - "nodeType": "StructuredDocumentation", - "src": "2302:70:110", - "text": "@notice A mapping of withdrawal hashes to `ProvenWithdrawal` data." - }, - "functionSelector": "e965084c", - "mutability": "mutable", - "name": "provenWithdrawals", - "nameLocation": "2421:17:110", - "scope": 59997, - "stateVariable": true, - "storageLocation": "default", - "typeDescriptions": { - "typeIdentifier": "t_mapping$_t_bytes32_$_t_struct$_ProvenWithdrawal_$59312_storage_$", - "typeString": "mapping(bytes32 => struct OptimismPortal.ProvenWithdrawal)" - }, - "typeName": { - "id": 59333, - "keyType": { - "id": 59330, - "name": "bytes32", - "nodeType": "ElementaryTypeName", - "src": "2385:7:110", - "typeDescriptions": { - "typeIdentifier": "t_bytes32", - "typeString": "bytes32" - } - }, - "nodeType": "Mapping", - "src": "2377:36:110", - "typeDescriptions": { - "typeIdentifier": "t_mapping$_t_bytes32_$_t_struct$_ProvenWithdrawal_$59312_storage_$", - "typeString": "mapping(bytes32 => struct OptimismPortal.ProvenWithdrawal)" - }, - "valueType": { - "id": 59332, - "nodeType": "UserDefinedTypeName", - "pathNode": { - "id": 59331, - "name": "ProvenWithdrawal", - "nodeType": "IdentifierPath", - "referencedDeclaration": 59312, - "src": "2396:16:110" - }, - "referencedDeclaration": 59312, - "src": "2396:16:110", - "typeDescriptions": { - "typeIdentifier": "t_struct$_ProvenWithdrawal_$59312_storage_ptr", - "typeString": "struct OptimismPortal.ProvenWithdrawal" - } - } - }, - "visibility": "public" - }, - { - "id": 59337, - "nodeType": "VariableDeclaration", - "src": "2618:18:110", - "nodes": [], - "constant": false, - "documentation": { - "id": 59335, - "nodeType": "StructuredDocumentation", - "src": "2445:168:110", - "text": "@notice Determines if cross domain messaging is paused.\n When set to true, withdrawals are paused.\n This may be removed in the future." - }, - "functionSelector": "5c975abb", - "mutability": "mutable", - "name": "paused", - "nameLocation": "2630:6:110", - "scope": 59997, - "stateVariable": true, - "storageLocation": "default", - "typeDescriptions": { - "typeIdentifier": "t_bool", - "typeString": "bool" - }, - "typeName": { - "id": 59336, - "name": "bool", - "nodeType": "ElementaryTypeName", - "src": "2618:4:110", - "typeDescriptions": { - "typeIdentifier": "t_bool", - "typeString": "bool" - } - }, - "visibility": "public" - }, - { - "id": 59341, - "nodeType": "VariableDeclaration", - "src": "2732:30:110", - "nodes": [], - "constant": false, - "documentation": { - "id": 59338, - "nodeType": "StructuredDocumentation", - "src": "2643:84:110", - "text": "@notice Address of the L2OutputOracle contract.\n @custom:network-specific" - }, - "functionSelector": "9b5f694a", - "mutability": "mutable", - "name": "l2Oracle", - "nameLocation": "2754:8:110", - "scope": 59997, - "stateVariable": true, - "storageLocation": "default", - "typeDescriptions": { - "typeIdentifier": "t_contract$_L2OutputOracle_$59272", - "typeString": "contract L2OutputOracle" - }, - "typeName": { - "id": 59340, - "nodeType": "UserDefinedTypeName", - "pathNode": { - "id": 59339, - "name": "L2OutputOracle", - "nodeType": "IdentifierPath", - "referencedDeclaration": 59272, - "src": "2732:14:110" - }, - "referencedDeclaration": 59272, - "src": "2732:14:110", - "typeDescriptions": { - "typeIdentifier": "t_contract$_L2OutputOracle_$59272", - "typeString": "contract L2OutputOracle" - } - }, - "visibility": "public" - }, - { - "id": 59345, - "nodeType": "VariableDeclaration", - "src": "2856:32:110", - "nodes": [], - "constant": false, - "documentation": { - "id": 59342, - "nodeType": "StructuredDocumentation", - "src": "2769:82:110", - "text": "@notice Address of the SystemConfig contract.\n @custom:network-specific" - }, - "functionSelector": "33d7e2bd", - "mutability": "mutable", - "name": "systemConfig", - "nameLocation": "2876:12:110", - "scope": 59997, - "stateVariable": true, - "storageLocation": "default", - "typeDescriptions": { - "typeIdentifier": "t_contract$_SystemConfig_$61393", - "typeString": "contract SystemConfig" - }, - "typeName": { - "id": 59344, - "nodeType": "UserDefinedTypeName", - "pathNode": { - "id": 59343, - "name": "SystemConfig", - "nodeType": "IdentifierPath", - "referencedDeclaration": 61393, - "src": "2856:12:110" - }, - "referencedDeclaration": 61393, - "src": "2856:12:110", - "typeDescriptions": { - "typeIdentifier": "t_contract$_SystemConfig_$61393", - "typeString": "contract SystemConfig" - } - }, - "visibility": "public" - }, - { - "id": 59348, - "nodeType": "VariableDeclaration", - "src": "3007:23:110", - "nodes": [], - "constant": false, - "documentation": { - "id": 59346, - "nodeType": "StructuredDocumentation", - "src": "2895:107:110", - "text": "@notice Address that has the ability to pause and unpause withdrawals.\n @custom:network-specific" - }, - "functionSelector": "452a9320", - "mutability": "mutable", - "name": "guardian", - "nameLocation": "3022:8:110", - "scope": 59997, - "stateVariable": true, - "storageLocation": "default", - "typeDescriptions": { - "typeIdentifier": "t_address", - "typeString": "address" - }, - "typeName": { - "id": 59347, - "name": "address", - "nodeType": "ElementaryTypeName", - "src": "3007:7:110", - "stateMutability": "nonpayable", - "typeDescriptions": { - "typeIdentifier": "t_address", - "typeString": "address" - } - }, - "visibility": "public" - }, - { - "id": 59359, - "nodeType": "EventDefinition", - "src": "3541:112:110", - "nodes": [], - "anonymous": false, - "documentation": { - "id": 59349, - "nodeType": "StructuredDocumentation", - "src": "3037:499:110", - "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": "3547:20:110", - "parameters": { - "id": 59358, - "nodeType": "ParameterList", - "parameters": [ - { - "constant": false, - "id": 59351, - "indexed": true, - "mutability": "mutable", - "name": "from", - "nameLocation": "3584:4:110", - "nodeType": "VariableDeclaration", - "scope": 59359, - "src": "3568:20:110", - "stateVariable": false, - "storageLocation": "default", - "typeDescriptions": { - "typeIdentifier": "t_address", - "typeString": "address" - }, - "typeName": { - "id": 59350, - "name": "address", - "nodeType": "ElementaryTypeName", - "src": "3568:7:110", - "stateMutability": "nonpayable", - "typeDescriptions": { - "typeIdentifier": "t_address", - "typeString": "address" - } - }, - "visibility": "internal" - }, - { - "constant": false, - "id": 59353, - "indexed": true, - "mutability": "mutable", - "name": "to", - "nameLocation": "3606:2:110", - "nodeType": "VariableDeclaration", - "scope": 59359, - "src": "3590:18:110", - "stateVariable": false, - "storageLocation": "default", - "typeDescriptions": { - "typeIdentifier": "t_address", - "typeString": "address" - }, - "typeName": { - "id": 59352, - "name": "address", - "nodeType": "ElementaryTypeName", - "src": "3590:7:110", - "stateMutability": "nonpayable", - "typeDescriptions": { - "typeIdentifier": "t_address", - "typeString": "address" - } - }, - "visibility": "internal" - }, - { - "constant": false, - "id": 59355, - "indexed": true, - "mutability": "mutable", - "name": "version", - "nameLocation": "3626:7:110", - "nodeType": "VariableDeclaration", - "scope": 59359, - "src": "3610:23:110", - "stateVariable": false, - "storageLocation": "default", - "typeDescriptions": { - "typeIdentifier": "t_uint256", - "typeString": "uint256" - }, - "typeName": { - "id": 59354, - "name": "uint256", - "nodeType": "ElementaryTypeName", - "src": "3610:7:110", - "typeDescriptions": { - "typeIdentifier": "t_uint256", - "typeString": "uint256" - } - }, - "visibility": "internal" - }, - { - "constant": false, - "id": 59357, - "indexed": false, - "mutability": "mutable", - "name": "opaqueData", - "nameLocation": "3641:10:110", - "nodeType": "VariableDeclaration", - "scope": 59359, - "src": "3635:16:110", - "stateVariable": false, - "storageLocation": "default", - "typeDescriptions": { - "typeIdentifier": "t_bytes_memory_ptr", - "typeString": "bytes" - }, - "typeName": { - "id": 59356, - "name": "bytes", - "nodeType": "ElementaryTypeName", - "src": "3635:5:110", - "typeDescriptions": { - "typeIdentifier": "t_bytes_storage_ptr", - "typeString": "bytes" - } - }, - "visibility": "internal" - } - ], - "src": "3567:85:110" - } - }, - { - "id": 59368, - "nodeType": "EventDefinition", - "src": "3957:97:110", - "nodes": [], - "anonymous": false, - "documentation": { - "id": 59360, - "nodeType": "StructuredDocumentation", - "src": "3659:293:110", - "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": "3963:16:110", - "parameters": { - "id": 59367, - "nodeType": "ParameterList", - "parameters": [ - { - "constant": false, - "id": 59362, - "indexed": true, - "mutability": "mutable", - "name": "withdrawalHash", - "nameLocation": "3996:14:110", - "nodeType": "VariableDeclaration", - "scope": 59368, - "src": "3980:30:110", - "stateVariable": false, - "storageLocation": "default", - "typeDescriptions": { - "typeIdentifier": "t_bytes32", - "typeString": "bytes32" - }, - "typeName": { - "id": 59361, - "name": "bytes32", - "nodeType": "ElementaryTypeName", - "src": "3980:7:110", - "typeDescriptions": { - "typeIdentifier": "t_bytes32", - "typeString": "bytes32" - } - }, - "visibility": "internal" - }, - { - "constant": false, - "id": 59364, - "indexed": true, - "mutability": "mutable", - "name": "from", - "nameLocation": "4028:4:110", - "nodeType": "VariableDeclaration", - "scope": 59368, - "src": "4012:20:110", - "stateVariable": false, - "storageLocation": "default", - "typeDescriptions": { - "typeIdentifier": "t_address", - "typeString": "address" - }, - "typeName": { - "id": 59363, - "name": "address", - "nodeType": "ElementaryTypeName", - "src": "4012:7:110", - "stateMutability": "nonpayable", - "typeDescriptions": { - "typeIdentifier": "t_address", - "typeString": "address" - } - }, - "visibility": "internal" - }, - { - "constant": false, - "id": 59366, - "indexed": true, - "mutability": "mutable", - "name": "to", - "nameLocation": "4050:2:110", - "nodeType": "VariableDeclaration", - "scope": 59368, - "src": "4034:18:110", - "stateVariable": false, - "storageLocation": "default", - "typeDescriptions": { - "typeIdentifier": "t_address", - "typeString": "address" - }, - "typeName": { - "id": 59365, - "name": "address", - "nodeType": "ElementaryTypeName", - "src": "4034:7:110", - "stateMutability": "nonpayable", - "typeDescriptions": { - "typeIdentifier": "t_address", - "typeString": "address" - } - }, - "visibility": "internal" - } - ], - "src": "3979:74:110" - } - }, - { - "id": 59375, - "nodeType": "EventDefinition", - "src": "4275:72:110", - "nodes": [], - "anonymous": false, - "documentation": { - "id": 59369, - "nodeType": "StructuredDocumentation", - "src": "4060:210:110", - "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": "4281:19:110", - "parameters": { - "id": 59374, - "nodeType": "ParameterList", - "parameters": [ - { - "constant": false, - "id": 59371, - "indexed": true, - "mutability": "mutable", - "name": "withdrawalHash", - "nameLocation": "4317:14:110", - "nodeType": "VariableDeclaration", - "scope": 59375, - "src": "4301:30:110", - "stateVariable": false, - "storageLocation": "default", - "typeDescriptions": { - "typeIdentifier": "t_bytes32", - "typeString": "bytes32" - }, - "typeName": { - "id": 59370, - "name": "bytes32", - "nodeType": "ElementaryTypeName", - "src": "4301:7:110", - "typeDescriptions": { - "typeIdentifier": "t_bytes32", - "typeString": "bytes32" - } - }, - "visibility": "internal" - }, - { - "constant": false, - "id": 59373, - "indexed": false, - "mutability": "mutable", - "name": "success", - "nameLocation": "4338:7:110", - "nodeType": "VariableDeclaration", - "scope": 59375, - "src": "4333:12:110", - "stateVariable": false, - "storageLocation": "default", - "typeDescriptions": { - "typeIdentifier": "t_bool", - "typeString": "bool" - }, - "typeName": { - "id": 59372, - "name": "bool", - "nodeType": "ElementaryTypeName", - "src": "4333:4:110", - "typeDescriptions": { - "typeIdentifier": "t_bool", - "typeString": "bool" - } - }, - "visibility": "internal" - } - ], - "src": "4300:46:110" - } - }, - { - "id": 59380, - "nodeType": "EventDefinition", - "src": "4474:30:110", - "nodes": [], - "anonymous": false, - "documentation": { - "id": 59376, - "nodeType": "StructuredDocumentation", - "src": "4353:116:110", - "text": "@notice Emitted when the pause is triggered.\n @param account Address of the account triggering the pause." - }, - "eventSelector": "62e78cea01bee320cd4e420270b5ea74000d11b0c9f74754ebdbfc544b05a258", - "name": "Paused", - "nameLocation": "4480:6:110", - "parameters": { - "id": 59379, - "nodeType": "ParameterList", - "parameters": [ - { - "constant": false, - "id": 59378, - "indexed": false, - "mutability": "mutable", - "name": "account", - "nameLocation": "4495:7:110", - "nodeType": "VariableDeclaration", - "scope": 59380, - "src": "4487:15:110", - "stateVariable": false, - "storageLocation": "default", - "typeDescriptions": { - "typeIdentifier": "t_address", - "typeString": "address" - }, - "typeName": { - "id": 59377, - "name": "address", - "nodeType": "ElementaryTypeName", - "src": "4487:7:110", - "stateMutability": "nonpayable", - "typeDescriptions": { - "typeIdentifier": "t_address", - "typeString": "address" - } - }, - "visibility": "internal" - } - ], - "src": "4486:17:110" - } - }, - { - "id": 59385, - "nodeType": "EventDefinition", - "src": "4630:32:110", - "nodes": [], - "anonymous": false, - "documentation": { - "id": 59381, - "nodeType": "StructuredDocumentation", - "src": "4510:115:110", - "text": "@notice Emitted when the pause is lifted.\n @param account Address of the account triggering the unpause." - }, - "eventSelector": "5db9ee0a495bf2e6ff9c91a7834c1ba4fdd244a5e8aa4e537bd38aeae4b073aa", - "name": "Unpaused", - "nameLocation": "4636:8:110", - "parameters": { - "id": 59384, - "nodeType": "ParameterList", - "parameters": [ - { - "constant": false, - "id": 59383, - "indexed": false, - "mutability": "mutable", - "name": "account", - "nameLocation": "4653:7:110", - "nodeType": "VariableDeclaration", - "scope": 59385, - "src": "4645:15:110", - "stateVariable": false, - "storageLocation": "default", - "typeDescriptions": { - "typeIdentifier": "t_address", - "typeString": "address" - }, - "typeName": { - "id": 59382, - "name": "address", - "nodeType": "ElementaryTypeName", - "src": "4645:7:110", - "stateMutability": "nonpayable", - "typeDescriptions": { - "typeIdentifier": "t_address", - "typeString": "address" - } - }, - "visibility": "internal" - } - ], - "src": "4644:17:110" - } - }, - { - "id": 59397, - "nodeType": "ModifierDefinition", - "src": "4705:103:110", - "nodes": [], - "body": { - "id": 59396, - "nodeType": "Block", - "src": "4730:78:110", - "nodes": [], - "statements": [ - { - "expression": { - "arguments": [ - { - "commonType": { - "typeIdentifier": "t_bool", - "typeString": "bool" - }, - "id": 59391, - "isConstant": false, - "isLValue": false, - "isPure": false, - "lValueRequested": false, - "leftExpression": { - "id": 59389, - "name": "paused", - "nodeType": "Identifier", - "overloadedDeclarations": [], - "referencedDeclaration": 59337, - "src": "4748:6:110", - "typeDescriptions": { - "typeIdentifier": "t_bool", - "typeString": "bool" - } - }, - "nodeType": "BinaryOperation", - "operator": "==", - "rightExpression": { - "hexValue": "66616c7365", - "id": 59390, - "isConstant": false, - "isLValue": false, - "isPure": true, - "kind": "bool", - "lValueRequested": false, - "nodeType": "Literal", - "src": "4758:5:110", - "typeDescriptions": { - "typeIdentifier": "t_bool", - "typeString": "bool" - }, - "value": "false" - }, - "src": "4748:15:110", - "typeDescriptions": { - "typeIdentifier": "t_bool", - "typeString": "bool" - } - }, - { - "hexValue": "4f7074696d69736d506f7274616c3a20706175736564", - "id": 59392, - "isConstant": false, - "isLValue": false, - "isPure": true, - "kind": "string", - "lValueRequested": false, - "nodeType": "Literal", - "src": "4765:24:110", - "typeDescriptions": { - "typeIdentifier": "t_stringliteral_b66caa771ead292be27065b6fdbf17fc2b4f01cda6f3a71dafb599bc9ced165d", - "typeString": "literal_string \"OptimismPortal: paused\"" - }, - "value": "OptimismPortal: paused" - } - ], - "expression": { - "argumentTypes": [ - { - "typeIdentifier": "t_bool", - "typeString": "bool" - }, - { - "typeIdentifier": "t_stringliteral_b66caa771ead292be27065b6fdbf17fc2b4f01cda6f3a71dafb599bc9ced165d", - "typeString": "literal_string \"OptimismPortal: paused\"" - } - ], - "id": 59388, - "name": "require", - "nodeType": "Identifier", - "overloadedDeclarations": [ - -18, - -18 - ], - "referencedDeclaration": -18, - "src": "4740:7:110", - "typeDescriptions": { - "typeIdentifier": "t_function_require_pure$_t_bool_$_t_string_memory_ptr_$returns$__$", - "typeString": "function (bool,string memory) pure" - } - }, - "id": 59393, - "isConstant": false, - "isLValue": false, - "isPure": false, - "kind": "functionCall", - "lValueRequested": false, - "names": [], - "nodeType": "FunctionCall", - "src": "4740:50:110", - "tryCall": false, - "typeDescriptions": { - "typeIdentifier": "t_tuple$__$", - "typeString": "tuple()" - } - }, - "id": 59394, - "nodeType": "ExpressionStatement", - "src": "4740:50:110" - }, - { - "id": 59395, - "nodeType": "PlaceholderStatement", - "src": "4800:1:110" - } - ] - }, - "documentation": { - "id": 59386, - "nodeType": "StructuredDocumentation", - "src": "4668:32:110", - "text": "@notice Reverts when paused." - }, - "name": "whenNotPaused", - "nameLocation": "4714:13:110", - "parameters": { - "id": 59387, - "nodeType": "ParameterList", - "parameters": [], - "src": "4727:2:110" - }, - "virtual": false, - "visibility": "internal" - }, - { - "id": 59401, - "nodeType": "VariableDeclaration", - "src": "4878:41:110", - "nodes": [], - "baseFunctions": [ - 75668 - ], - "constant": true, - "documentation": { - "id": 59398, - "nodeType": "StructuredDocumentation", - "src": "4814:59:110", - "text": "@notice Semantic version.\n @custom:semver 1.10.0" - }, - "functionSelector": "54fd4d50", - "mutability": "constant", - "name": "version", - "nameLocation": "4901:7:110", - "scope": 59997, - "stateVariable": true, - "storageLocation": "default", - "typeDescriptions": { - "typeIdentifier": "t_string_memory_ptr", - "typeString": "string" - }, - "typeName": { - "id": 59399, - "name": "string", - "nodeType": "ElementaryTypeName", - "src": "4878:6:110", - "typeDescriptions": { - "typeIdentifier": "t_string_storage_ptr", - "typeString": "string" - } - }, - "value": { - "hexValue": "312e31302e30", - "id": 59400, - "isConstant": false, - "isLValue": false, - "isPure": true, - "kind": "string", - "lValueRequested": false, - "nodeType": "Literal", - "src": "4911:8:110", - "typeDescriptions": { - "typeIdentifier": "t_stringliteral_0da5b5e4c121ebd588f58cd2a27b23bac1ec4a69fdf68241600b139ec2a21f64", - "typeString": "literal_string \"1.10.0\"" - }, - "value": "1.10.0" - }, - "visibility": "public" - }, - { - "id": 59426, - "nodeType": "FunctionDefinition", - "src": "4982:219:110", - "nodes": [], - "body": { - "id": 59425, - "nodeType": "Block", - "src": "4996:205:110", - "nodes": [], - "statements": [ - { - "expression": { - "arguments": [ - { - "arguments": [ - { - "arguments": [ - { - "hexValue": "30", - "id": 59409, - "isConstant": false, - "isLValue": false, - "isPure": true, - "kind": "number", - "lValueRequested": false, - "nodeType": "Literal", - "src": "5065:1:110", - "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": 59408, - "isConstant": false, - "isLValue": false, - "isPure": true, - "lValueRequested": false, - "nodeType": "ElementaryTypeNameExpression", - "src": "5057:7:110", - "typeDescriptions": { - "typeIdentifier": "t_type$_t_address_$", - "typeString": "type(address)" - }, - "typeName": { - "id": 59407, - "name": "address", - "nodeType": "ElementaryTypeName", - "src": "5057:7:110", - "typeDescriptions": {} - } - }, - "id": 59410, - "isConstant": false, - "isLValue": false, - "isPure": true, - "kind": "typeConversion", - "lValueRequested": false, - "names": [], - "nodeType": "FunctionCall", - "src": "5057:10:110", - "tryCall": false, - "typeDescriptions": { - "typeIdentifier": "t_address", - "typeString": "address" - } - } - ], - "expression": { - "argumentTypes": [ - { - "typeIdentifier": "t_address", - "typeString": "address" - } - ], - "id": 59406, - "name": "L2OutputOracle", - "nodeType": "Identifier", - "overloadedDeclarations": [], - "referencedDeclaration": 59272, - "src": "5042:14:110", - "typeDescriptions": { - "typeIdentifier": "t_type$_t_contract$_L2OutputOracle_$59272_$", - "typeString": "type(contract L2OutputOracle)" - } - }, - "id": 59411, - "isConstant": false, - "isLValue": false, - "isPure": true, - "kind": "typeConversion", - "lValueRequested": false, - "names": [], - "nodeType": "FunctionCall", - "src": "5042:26:110", - "tryCall": false, - "typeDescriptions": { - "typeIdentifier": "t_contract$_L2OutputOracle_$59272", - "typeString": "contract L2OutputOracle" - } - }, - { - "arguments": [ - { - "hexValue": "30", - "id": 59414, - "isConstant": false, - "isLValue": false, - "isPure": true, - "kind": "number", - "lValueRequested": false, - "nodeType": "Literal", - "src": "5101:1:110", - "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": 59413, - "isConstant": false, - "isLValue": false, - "isPure": true, - "lValueRequested": false, - "nodeType": "ElementaryTypeNameExpression", - "src": "5093:7:110", - "typeDescriptions": { - "typeIdentifier": "t_type$_t_address_$", - "typeString": "type(address)" - }, - "typeName": { - "id": 59412, - "name": "address", - "nodeType": "ElementaryTypeName", - "src": "5093:7:110", - "typeDescriptions": {} - } - }, - "id": 59415, - "isConstant": false, - "isLValue": false, - "isPure": true, - "kind": "typeConversion", - "lValueRequested": false, - "names": [], - "nodeType": "FunctionCall", - "src": "5093:10:110", - "tryCall": false, - "typeDescriptions": { - "typeIdentifier": "t_address", - "typeString": "address" - } - }, - { - "arguments": [ - { - "arguments": [ - { - "hexValue": "30", - "id": 59419, - "isConstant": false, - "isLValue": false, - "isPure": true, - "kind": "number", - "lValueRequested": false, - "nodeType": "Literal", - "src": "5153:1:110", - "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": 59418, - "isConstant": false, - "isLValue": false, - "isPure": true, - "lValueRequested": false, - "nodeType": "ElementaryTypeNameExpression", - "src": "5145:7:110", - "typeDescriptions": { - "typeIdentifier": "t_type$_t_address_$", - "typeString": "type(address)" - }, - "typeName": { - "id": 59417, - "name": "address", - "nodeType": "ElementaryTypeName", - "src": "5145:7:110", - "typeDescriptions": {} - } - }, - "id": 59420, - "isConstant": false, - "isLValue": false, - "isPure": true, - "kind": "typeConversion", - "lValueRequested": false, - "names": [], - "nodeType": "FunctionCall", - "src": "5145:10:110", - "tryCall": false, - "typeDescriptions": { - "typeIdentifier": "t_address", - "typeString": "address" - } - } - ], - "expression": { - "argumentTypes": [ - { - "typeIdentifier": "t_address", - "typeString": "address" - } - ], - "id": 59416, - "name": "SystemConfig", - "nodeType": "Identifier", - "overloadedDeclarations": [], - "referencedDeclaration": 61393, - "src": "5132:12:110", - "typeDescriptions": { - "typeIdentifier": "t_type$_t_contract$_SystemConfig_$61393_$", - "typeString": "type(contract SystemConfig)" - } - }, - "id": 59421, - "isConstant": false, - "isLValue": false, - "isPure": true, - "kind": "typeConversion", - "lValueRequested": false, - "names": [], - "nodeType": "FunctionCall", - "src": "5132:24:110", - "tryCall": false, - "typeDescriptions": { - "typeIdentifier": "t_contract$_SystemConfig_$61393", - "typeString": "contract SystemConfig" - } - }, - { - "hexValue": "74727565", - "id": 59422, - "isConstant": false, - "isLValue": false, - "isPure": true, - "kind": "bool", - "lValueRequested": false, - "nodeType": "Literal", - "src": "5179:4:110", - "typeDescriptions": { - "typeIdentifier": "t_bool", - "typeString": "bool" - }, - "value": "true" - } - ], - "expression": { - "argumentTypes": [ - { - "typeIdentifier": "t_contract$_L2OutputOracle_$59272", - "typeString": "contract L2OutputOracle" - }, - { - "typeIdentifier": "t_address", - "typeString": "address" - }, - { - "typeIdentifier": "t_contract$_SystemConfig_$61393", - "typeString": "contract SystemConfig" - }, - { - "typeIdentifier": "t_bool", - "typeString": "bool" - } - ], - "id": 59405, - "name": "initialize", - "nodeType": "Identifier", - "overloadedDeclarations": [], - "referencedDeclaration": 59469, - "src": "5006:10:110", - "typeDescriptions": { - "typeIdentifier": "t_function_internal_nonpayable$_t_contract$_L2OutputOracle_$59272_$_t_address_$_t_contract$_SystemConfig_$61393_$_t_bool_$returns$__$", - "typeString": "function (contract L2OutputOracle,address,contract SystemConfig,bool)" - } - }, - "id": 59423, - "isConstant": false, - "isLValue": false, - "isPure": false, - "kind": "functionCall", - "lValueRequested": false, - "names": [ - "_l2Oracle", - "_guardian", - "_systemConfig", - "_paused" - ], - "nodeType": "FunctionCall", - "src": "5006:188:110", - "tryCall": false, - "typeDescriptions": { - "typeIdentifier": "t_tuple$__$", - "typeString": "tuple()" - } - }, - "id": 59424, - "nodeType": "ExpressionStatement", - "src": "5006:188:110" - } - ] - }, - "documentation": { - "id": 59402, - "nodeType": "StructuredDocumentation", - "src": "4926:51:110", - "text": "@notice Constructs the OptimismPortal contract." - }, - "implemented": true, - "kind": "constructor", - "modifiers": [], - "name": "", - "nameLocation": "-1:-1:-1", - "parameters": { - "id": 59403, - "nodeType": "ParameterList", - "parameters": [], - "src": "4993:2:110" - }, - "returnParameters": { - "id": 59404, - "nodeType": "ParameterList", - "parameters": [], - "src": "4996:0:110" - }, - "scope": 59997, - "stateMutability": "nonpayable", - "virtual": false, - "visibility": "public" - }, - { - "id": 59469, - "nodeType": "FunctionDefinition", - "src": "5491:423:110", - "nodes": [], - "body": { - "id": 59468, - "nodeType": "Block", - "src": "5700:214:110", - "nodes": [], - "statements": [ - { - "expression": { - "id": 59447, - "isConstant": false, - "isLValue": false, - "isPure": false, - "lValueRequested": false, - "leftHandSide": { - "id": 59444, - "name": "l2Sender", - "nodeType": "Identifier", - "overloadedDeclarations": [], - "referencedDeclaration": 59323, - "src": "5710:8:110", - "typeDescriptions": { - "typeIdentifier": "t_address", - "typeString": "address" - } - }, - "nodeType": "Assignment", - "operator": "=", - "rightHandSide": { - "expression": { - "id": 59445, - "name": "Constants", - "nodeType": "Identifier", - "overloadedDeclarations": [], - "referencedDeclaration": 69571, - "src": "5721:9:110", - "typeDescriptions": { - "typeIdentifier": "t_type$_t_contract$_Constants_$69571_$", - "typeString": "type(library Constants)" - } - }, - "id": 59446, - "isConstant": false, - "isLValue": false, - "isPure": false, - "lValueRequested": false, - "memberName": "DEFAULT_L2_SENDER", - "nodeType": "MemberAccess", - "referencedDeclaration": 69529, - "src": "5721:27:110", - "typeDescriptions": { - "typeIdentifier": "t_address", - "typeString": "address" - } - }, - "src": "5710:38:110", - "typeDescriptions": { - "typeIdentifier": "t_address", - "typeString": "address" - } - }, - "id": 59448, - "nodeType": "ExpressionStatement", - "src": "5710:38:110" - }, - { - "expression": { - "id": 59451, - "isConstant": false, - "isLValue": false, - "isPure": false, - "lValueRequested": false, - "leftHandSide": { - "id": 59449, - "name": "l2Oracle", - "nodeType": "Identifier", - "overloadedDeclarations": [], - "referencedDeclaration": 59341, - "src": "5758:8:110", - "typeDescriptions": { - "typeIdentifier": "t_contract$_L2OutputOracle_$59272", - "typeString": "contract L2OutputOracle" - } - }, - "nodeType": "Assignment", - "operator": "=", - "rightHandSide": { - "id": 59450, - "name": "_l2Oracle", - "nodeType": "Identifier", - "overloadedDeclarations": [], - "referencedDeclaration": 59430, - "src": "5769:9:110", - "typeDescriptions": { - "typeIdentifier": "t_contract$_L2OutputOracle_$59272", - "typeString": "contract L2OutputOracle" - } - }, - "src": "5758:20:110", - "typeDescriptions": { - "typeIdentifier": "t_contract$_L2OutputOracle_$59272", - "typeString": "contract L2OutputOracle" - } - }, - "id": 59452, - "nodeType": "ExpressionStatement", - "src": "5758:20:110" - }, - { - "expression": { - "id": 59455, - "isConstant": false, - "isLValue": false, - "isPure": false, - "lValueRequested": false, - "leftHandSide": { - "id": 59453, - "name": "systemConfig", - "nodeType": "Identifier", - "overloadedDeclarations": [], - "referencedDeclaration": 59345, - "src": "5788:12:110", - "typeDescriptions": { - "typeIdentifier": "t_contract$_SystemConfig_$61393", - "typeString": "contract SystemConfig" - } - }, - "nodeType": "Assignment", - "operator": "=", - "rightHandSide": { - "id": 59454, - "name": "_systemConfig", - "nodeType": "Identifier", - "overloadedDeclarations": [], - "referencedDeclaration": 59435, - "src": "5803:13:110", - "typeDescriptions": { - "typeIdentifier": "t_contract$_SystemConfig_$61393", - "typeString": "contract SystemConfig" - } - }, - "src": "5788:28:110", - "typeDescriptions": { - "typeIdentifier": "t_contract$_SystemConfig_$61393", - "typeString": "contract SystemConfig" - } - }, - "id": 59456, - "nodeType": "ExpressionStatement", - "src": "5788:28:110" - }, - { - "expression": { - "id": 59459, - "isConstant": false, - "isLValue": false, - "isPure": false, - "lValueRequested": false, - "leftHandSide": { - "id": 59457, - "name": "guardian", - "nodeType": "Identifier", - "overloadedDeclarations": [], - "referencedDeclaration": 59348, - "src": "5826:8:110", - "typeDescriptions": { - "typeIdentifier": "t_address", - "typeString": "address" - } - }, - "nodeType": "Assignment", - "operator": "=", - "rightHandSide": { - "id": 59458, - "name": "_guardian", - "nodeType": "Identifier", - "overloadedDeclarations": [], - "referencedDeclaration": 59432, - "src": "5837:9:110", - "typeDescriptions": { - "typeIdentifier": "t_address", - "typeString": "address" - } - }, - "src": "5826:20:110", - "typeDescriptions": { - "typeIdentifier": "t_address", - "typeString": "address" - } - }, - "id": 59460, - "nodeType": "ExpressionStatement", - "src": "5826:20:110" - }, - { - "expression": { - "id": 59463, - "isConstant": false, - "isLValue": false, - "isPure": false, - "lValueRequested": false, - "leftHandSide": { - "id": 59461, - "name": "paused", - "nodeType": "Identifier", - "overloadedDeclarations": [], - "referencedDeclaration": 59337, - "src": "5856:6:110", - "typeDescriptions": { - "typeIdentifier": "t_bool", - "typeString": "bool" - } - }, - "nodeType": "Assignment", - "operator": "=", - "rightHandSide": { - "id": 59462, - "name": "_paused", - "nodeType": "Identifier", - "overloadedDeclarations": [], - "referencedDeclaration": 59437, - "src": "5865:7:110", - "typeDescriptions": { - "typeIdentifier": "t_bool", - "typeString": "bool" - } - }, - "src": "5856:16:110", - "typeDescriptions": { - "typeIdentifier": "t_bool", - "typeString": "bool" - } - }, - "id": 59464, - "nodeType": "ExpressionStatement", - "src": "5856:16:110" - }, - { - "expression": { - "arguments": [], - "expression": { - "argumentTypes": [], - "id": 59465, - "name": "__ResourceMetering_init", - "nodeType": "Identifier", - "overloadedDeclarations": [], - "referencedDeclaration": 60598, - "src": "5882:23:110", - "typeDescriptions": { - "typeIdentifier": "t_function_internal_nonpayable$__$returns$__$", - "typeString": "function ()" - } - }, - "id": 59466, - "isConstant": false, - "isLValue": false, - "isPure": false, - "kind": "functionCall", - "lValueRequested": false, - "names": [], - "nodeType": "FunctionCall", - "src": "5882:25:110", - "tryCall": false, - "typeDescriptions": { - "typeIdentifier": "t_tuple$__$", - "typeString": "tuple()" - } - }, - "id": 59467, - "nodeType": "ExpressionStatement", - "src": "5882:25:110" - } - ] - }, - "documentation": { - "id": 59427, - "nodeType": "StructuredDocumentation", - "src": "5207:279:110", - "text": "@notice Initializer.\n @param _l2Oracle Address of the L2OutputOracle contract.\n @param _guardian Address that can pause withdrawals.\n @param _paused Sets the contract's pausability state.\n @param _systemConfig Address of the SystemConfig contract." - }, - "functionSelector": "fecf9734", - "implemented": true, - "kind": "function", - "modifiers": [ - { - "arguments": [ - { - "expression": { - "id": 59440, - "name": "Constants", - "nodeType": "Identifier", - "overloadedDeclarations": [], - "referencedDeclaration": 69571, - "src": "5673:9:110", - "typeDescriptions": { - "typeIdentifier": "t_type$_t_contract$_Constants_$69571_$", - "typeString": "type(library Constants)" - } - }, - "id": 59441, - "isConstant": false, - "isLValue": false, - "isPure": false, - "lValueRequested": false, - "memberName": "INITIALIZER", - "nodeType": "MemberAccess", - "referencedDeclaration": 69570, - "src": "5673:21:110", - "typeDescriptions": { - "typeIdentifier": "t_uint8", - "typeString": "uint8" - } - } - ], - "id": 59442, - "kind": "modifierInvocation", - "modifierName": { - "id": 59439, - "name": "reinitializer", - "nodeType": "IdentifierPath", - "referencedDeclaration": 32197, - "src": "5659:13:110" - }, - "nodeType": "ModifierInvocation", - "src": "5659:36:110" - } - ], - "name": "initialize", - "nameLocation": "5500:10:110", - "parameters": { - "id": 59438, - "nodeType": "ParameterList", - "parameters": [ - { - "constant": false, - "id": 59430, - "mutability": "mutable", - "name": "_l2Oracle", - "nameLocation": "5535:9:110", - "nodeType": "VariableDeclaration", - "scope": 59469, - "src": "5520:24:110", - "stateVariable": false, - "storageLocation": "default", - "typeDescriptions": { - "typeIdentifier": "t_contract$_L2OutputOracle_$59272", - "typeString": "contract L2OutputOracle" - }, - "typeName": { - "id": 59429, - "nodeType": "UserDefinedTypeName", - "pathNode": { - "id": 59428, - "name": "L2OutputOracle", - "nodeType": "IdentifierPath", - "referencedDeclaration": 59272, - "src": "5520:14:110" - }, - "referencedDeclaration": 59272, - "src": "5520:14:110", - "typeDescriptions": { - "typeIdentifier": "t_contract$_L2OutputOracle_$59272", - "typeString": "contract L2OutputOracle" - } - }, - "visibility": "internal" - }, - { - "constant": false, - "id": 59432, - "mutability": "mutable", - "name": "_guardian", - "nameLocation": "5562:9:110", - "nodeType": "VariableDeclaration", - "scope": 59469, - "src": "5554:17:110", - "stateVariable": false, - "storageLocation": "default", - "typeDescriptions": { - "typeIdentifier": "t_address", - "typeString": "address" - }, - "typeName": { - "id": 59431, - "name": "address", - "nodeType": "ElementaryTypeName", - "src": "5554:7:110", - "stateMutability": "nonpayable", - "typeDescriptions": { - "typeIdentifier": "t_address", - "typeString": "address" - } - }, - "visibility": "internal" - }, - { - "constant": false, - "id": 59435, - "mutability": "mutable", - "name": "_systemConfig", - "nameLocation": "5594:13:110", - "nodeType": "VariableDeclaration", - "scope": 59469, - "src": "5581:26:110", - "stateVariable": false, - "storageLocation": "default", - "typeDescriptions": { - "typeIdentifier": "t_contract$_SystemConfig_$61393", - "typeString": "contract SystemConfig" - }, - "typeName": { - "id": 59434, - "nodeType": "UserDefinedTypeName", - "pathNode": { - "id": 59433, - "name": "SystemConfig", - "nodeType": "IdentifierPath", - "referencedDeclaration": 61393, - "src": "5581:12:110" - }, - "referencedDeclaration": 61393, - "src": "5581:12:110", - "typeDescriptions": { - "typeIdentifier": "t_contract$_SystemConfig_$61393", - "typeString": "contract SystemConfig" - } - }, - "visibility": "internal" - }, - { - "constant": false, - "id": 59437, - "mutability": "mutable", - "name": "_paused", - "nameLocation": "5622:7:110", - "nodeType": "VariableDeclaration", - "scope": 59469, - "src": "5617:12:110", - "stateVariable": false, - "storageLocation": "default", - "typeDescriptions": { - "typeIdentifier": "t_bool", - "typeString": "bool" - }, - "typeName": { - "id": 59436, - "name": "bool", - "nodeType": "ElementaryTypeName", - "src": "5617:4:110", - "typeDescriptions": { - "typeIdentifier": "t_bool", - "typeString": "bool" - } - }, - "visibility": "internal" - } - ], - "src": "5510:125:110" - }, - "returnParameters": { - "id": 59443, - "nodeType": "ParameterList", - "parameters": [], - "src": "5700:0:110" - }, - "scope": 59997, - "stateMutability": "nonpayable", - "virtual": false, - "visibility": "public" - }, - { - "id": 59479, - "nodeType": "FunctionDefinition", - "src": "5989:92:110", - "nodes": [], - "body": { - "id": 59478, - "nodeType": "Block", - "src": "6049:32:110", - "nodes": [], - "statements": [ - { - "expression": { - "id": 59476, - "name": "l2Oracle", - "nodeType": "Identifier", - "overloadedDeclarations": [], - "referencedDeclaration": 59341, - "src": "6066:8:110", - "typeDescriptions": { - "typeIdentifier": "t_contract$_L2OutputOracle_$59272", - "typeString": "contract L2OutputOracle" - } - }, - "functionReturnParameters": 59475, - "id": 59477, - "nodeType": "Return", - "src": "6059:15:110" - } - ] - }, - "documentation": { - "id": 59470, - "nodeType": "StructuredDocumentation", - "src": "5920:64:110", - "text": "@notice Getter for the L2OutputOracle\n @custom:legacy" - }, - "functionSelector": "001c2ff6", - "implemented": true, - "kind": "function", - "modifiers": [], - "name": "L2_ORACLE", - "nameLocation": "5998:9:110", - "parameters": { - "id": 59471, - "nodeType": "ParameterList", - "parameters": [], - "src": "6007:2:110" - }, - "returnParameters": { - "id": 59475, - "nodeType": "ParameterList", - "parameters": [ - { - "constant": false, - "id": 59474, - "mutability": "mutable", - "name": "", - "nameLocation": "-1:-1:-1", - "nodeType": "VariableDeclaration", - "scope": 59479, - "src": "6033:14:110", - "stateVariable": false, - "storageLocation": "default", - "typeDescriptions": { - "typeIdentifier": "t_contract$_L2OutputOracle_$59272", - "typeString": "contract L2OutputOracle" - }, - "typeName": { - "id": 59473, - "nodeType": "UserDefinedTypeName", - "pathNode": { - "id": 59472, - "name": "L2OutputOracle", - "nodeType": "IdentifierPath", - "referencedDeclaration": 59272, - "src": "6033:14:110" - }, - "referencedDeclaration": 59272, - "src": "6033:14:110", - "typeDescriptions": { - "typeIdentifier": "t_contract$_L2OutputOracle_$59272", - "typeString": "contract L2OutputOracle" - } - }, - "visibility": "internal" - } - ], - "src": "6032:16:110" - }, - "scope": 59997, - "stateMutability": "view", - "virtual": false, - "visibility": "external" - }, - { - "id": 59489, - "nodeType": "FunctionDefinition", - "src": "6154:98:110", - "nodes": [], - "body": { - "id": 59488, - "nodeType": "Block", - "src": "6216:36:110", - "nodes": [], - "statements": [ - { - "expression": { - "id": 59486, - "name": "systemConfig", - "nodeType": "Identifier", - "overloadedDeclarations": [], - "referencedDeclaration": 59345, - "src": "6233:12:110", - "typeDescriptions": { - "typeIdentifier": "t_contract$_SystemConfig_$61393", - "typeString": "contract SystemConfig" - } - }, - "functionReturnParameters": 59485, - "id": 59487, - "nodeType": "Return", - "src": "6226:19:110" - } - ] - }, - "documentation": { - "id": 59480, - "nodeType": "StructuredDocumentation", - "src": "6087:62:110", - "text": "@notice Getter for the SystemConfig\n @custom:legacy" - }, - "functionSelector": "f0498750", - "implemented": true, - "kind": "function", - "modifiers": [], - "name": "SYSTEM_CONFIG", - "nameLocation": "6163:13:110", - "parameters": { - "id": 59481, - "nodeType": "ParameterList", - "parameters": [], - "src": "6176:2:110" - }, - "returnParameters": { - "id": 59485, - "nodeType": "ParameterList", - "parameters": [ - { - "constant": false, - "id": 59484, - "mutability": "mutable", - "name": "", - "nameLocation": "-1:-1:-1", - "nodeType": "VariableDeclaration", - "scope": 59489, - "src": "6202:12:110", - "stateVariable": false, - "storageLocation": "default", - "typeDescriptions": { - "typeIdentifier": "t_contract$_SystemConfig_$61393", - "typeString": "contract SystemConfig" - }, - "typeName": { - "id": 59483, - "nodeType": "UserDefinedTypeName", - "pathNode": { - "id": 59482, - "name": "SystemConfig", - "nodeType": "IdentifierPath", - "referencedDeclaration": 61393, - "src": "6202:12:110" - }, - "referencedDeclaration": 61393, - "src": "6202:12:110", - "typeDescriptions": { - "typeIdentifier": "t_contract$_SystemConfig_$61393", - "typeString": "contract SystemConfig" - } - }, - "visibility": "internal" - } - ], - "src": "6201:14:110" - }, - "scope": 59997, - "stateMutability": "view", - "virtual": false, - "visibility": "external" - }, - { - "id": 59498, - "nodeType": "FunctionDefinition", - "src": "6321:84:110", - "nodes": [], - "body": { - "id": 59497, - "nodeType": "Block", - "src": "6373:32:110", - "nodes": [], - "statements": [ - { - "expression": { - "id": 59495, - "name": "guardian", - "nodeType": "Identifier", - "overloadedDeclarations": [], - "referencedDeclaration": 59348, - "src": "6390:8:110", - "typeDescriptions": { - "typeIdentifier": "t_address", - "typeString": "address" - } - }, - "functionReturnParameters": 59494, - "id": 59496, - "nodeType": "Return", - "src": "6383:15:110" - } - ] - }, - "documentation": { - "id": 59490, - "nodeType": "StructuredDocumentation", - "src": "6258:58:110", - "text": "@notice Getter for the Guardian\n @custom:legacy" - }, - "functionSelector": "724c184c", - "implemented": true, - "kind": "function", - "modifiers": [], - "name": "GUARDIAN", - "nameLocation": "6330:8:110", - "parameters": { - "id": 59491, - "nodeType": "ParameterList", - "parameters": [], - "src": "6338:2:110" - }, - "returnParameters": { - "id": 59494, - "nodeType": "ParameterList", - "parameters": [ - { - "constant": false, - "id": 59493, - "mutability": "mutable", - "name": "", - "nameLocation": "-1:-1:-1", - "nodeType": "VariableDeclaration", - "scope": 59498, - "src": "6364:7:110", - "stateVariable": false, - "storageLocation": "default", - "typeDescriptions": { - "typeIdentifier": "t_address", - "typeString": "address" - }, - "typeName": { - "id": 59492, - "name": "address", - "nodeType": "ElementaryTypeName", - "src": "6364:7:110", - "stateMutability": "nonpayable", - "typeDescriptions": { - "typeIdentifier": "t_address", - "typeString": "address" - } - }, - "visibility": "internal" - } - ], - "src": "6363:9:110" - }, - "scope": 59997, - "stateMutability": "view", - "virtual": false, - "visibility": "external" - }, - { - "id": 59520, - "nodeType": "FunctionDefinition", - "src": "6447:173:110", - "nodes": [], - "body": { - "id": 59519, - "nodeType": "Block", - "src": "6473:147:110", - "nodes": [], - "statements": [ - { - "expression": { - "arguments": [ - { - "commonType": { - "typeIdentifier": "t_address", - "typeString": "address" - }, - "id": 59506, - "isConstant": false, - "isLValue": false, - "isPure": false, - "lValueRequested": false, - "leftExpression": { - "expression": { - "id": 59503, - "name": "msg", - "nodeType": "Identifier", - "overloadedDeclarations": [], - "referencedDeclaration": -15, - "src": "6491:3:110", - "typeDescriptions": { - "typeIdentifier": "t_magic_message", - "typeString": "msg" - } - }, - "id": 59504, - "isConstant": false, - "isLValue": false, - "isPure": false, - "lValueRequested": false, - "memberName": "sender", - "nodeType": "MemberAccess", - "src": "6491:10:110", - "typeDescriptions": { - "typeIdentifier": "t_address", - "typeString": "address" - } - }, - "nodeType": "BinaryOperation", - "operator": "==", - "rightExpression": { - "id": 59505, - "name": "guardian", - "nodeType": "Identifier", - "overloadedDeclarations": [], - "referencedDeclaration": 59348, - "src": "6505:8:110", - "typeDescriptions": { - "typeIdentifier": "t_address", - "typeString": "address" - } - }, - "src": "6491:22:110", - "typeDescriptions": { - "typeIdentifier": "t_bool", - "typeString": "bool" - } - }, - { - "hexValue": "4f7074696d69736d506f7274616c3a206f6e6c7920677561726469616e2063616e207061757365", - "id": 59507, - "isConstant": false, - "isLValue": false, - "isPure": true, - "kind": "string", - "lValueRequested": false, - "nodeType": "Literal", - "src": "6515:41:110", - "typeDescriptions": { - "typeIdentifier": "t_stringliteral_a662ad7462f0018e8b171ba19146984ad716c45a2c8d7c903bdd6e1628b95f08", - "typeString": "literal_string \"OptimismPortal: only guardian can pause\"" - }, - "value": "OptimismPortal: only guardian can pause" - } - ], - "expression": { - "argumentTypes": [ - { - "typeIdentifier": "t_bool", - "typeString": "bool" - }, - { - "typeIdentifier": "t_stringliteral_a662ad7462f0018e8b171ba19146984ad716c45a2c8d7c903bdd6e1628b95f08", - "typeString": "literal_string \"OptimismPortal: only guardian can pause\"" - } - ], - "id": 59502, - "name": "require", - "nodeType": "Identifier", - "overloadedDeclarations": [ - -18, - -18 - ], - "referencedDeclaration": -18, - "src": "6483:7:110", - "typeDescriptions": { - "typeIdentifier": "t_function_require_pure$_t_bool_$_t_string_memory_ptr_$returns$__$", - "typeString": "function (bool,string memory) pure" - } - }, - "id": 59508, - "isConstant": false, - "isLValue": false, - "isPure": false, - "kind": "functionCall", - "lValueRequested": false, - "names": [], - "nodeType": "FunctionCall", - "src": "6483:74:110", - "tryCall": false, - "typeDescriptions": { - "typeIdentifier": "t_tuple$__$", - "typeString": "tuple()" - } - }, - "id": 59509, - "nodeType": "ExpressionStatement", - "src": "6483:74:110" - }, - { - "expression": { - "id": 59512, - "isConstant": false, - "isLValue": false, - "isPure": false, - "lValueRequested": false, - "leftHandSide": { - "id": 59510, - "name": "paused", - "nodeType": "Identifier", - "overloadedDeclarations": [], - "referencedDeclaration": 59337, - "src": "6567:6:110", - "typeDescriptions": { - "typeIdentifier": "t_bool", - "typeString": "bool" - } - }, - "nodeType": "Assignment", - "operator": "=", - "rightHandSide": { - "hexValue": "74727565", - "id": 59511, - "isConstant": false, - "isLValue": false, - "isPure": true, - "kind": "bool", - "lValueRequested": false, - "nodeType": "Literal", - "src": "6576:4:110", - "typeDescriptions": { - "typeIdentifier": "t_bool", - "typeString": "bool" - }, - "value": "true" - }, - "src": "6567:13:110", - "typeDescriptions": { - "typeIdentifier": "t_bool", - "typeString": "bool" - } - }, - "id": 59513, - "nodeType": "ExpressionStatement", - "src": "6567:13:110" - }, - { - "eventCall": { - "arguments": [ - { - "expression": { - "id": 59515, - "name": "msg", - "nodeType": "Identifier", - "overloadedDeclarations": [], - "referencedDeclaration": -15, - "src": "6602:3:110", - "typeDescriptions": { - "typeIdentifier": "t_magic_message", - "typeString": "msg" - } - }, - "id": 59516, - "isConstant": false, - "isLValue": false, - "isPure": false, - "lValueRequested": false, - "memberName": "sender", - "nodeType": "MemberAccess", - "src": "6602:10:110", - "typeDescriptions": { - "typeIdentifier": "t_address", - "typeString": "address" - } - } - ], - "expression": { - "argumentTypes": [ - { - "typeIdentifier": "t_address", - "typeString": "address" - } - ], - "id": 59514, - "name": "Paused", - "nodeType": "Identifier", - "overloadedDeclarations": [], - "referencedDeclaration": 59380, - "src": "6595:6:110", - "typeDescriptions": { - "typeIdentifier": "t_function_event_nonpayable$_t_address_$returns$__$", - "typeString": "function (address)" - } - }, - "id": 59517, - "isConstant": false, - "isLValue": false, - "isPure": false, - "kind": "functionCall", - "lValueRequested": false, - "names": [], - "nodeType": "FunctionCall", - "src": "6595:18:110", - "tryCall": false, - "typeDescriptions": { - "typeIdentifier": "t_tuple$__$", - "typeString": "tuple()" - } - }, - "id": 59518, - "nodeType": "EmitStatement", - "src": "6590:23:110" - } - ] - }, - "documentation": { - "id": 59499, - "nodeType": "StructuredDocumentation", - "src": "6411:31:110", - "text": "@notice Pauses withdrawals." - }, - "functionSelector": "8456cb59", - "implemented": true, - "kind": "function", - "modifiers": [], - "name": "pause", - "nameLocation": "6456:5:110", - "parameters": { - "id": 59500, - "nodeType": "ParameterList", - "parameters": [], - "src": "6461:2:110" - }, - "returnParameters": { - "id": 59501, - "nodeType": "ParameterList", - "parameters": [], - "src": "6473:0:110" - }, - "scope": 59997, - "stateMutability": "nonpayable", - "virtual": false, - "visibility": "external" - }, - { - "id": 59542, - "nodeType": "FunctionDefinition", - "src": "6664:180:110", - "nodes": [], - "body": { - "id": 59541, - "nodeType": "Block", - "src": "6692:152:110", - "nodes": [], - "statements": [ - { - "expression": { - "arguments": [ - { - "commonType": { - "typeIdentifier": "t_address", - "typeString": "address" - }, - "id": 59528, - "isConstant": false, - "isLValue": false, - "isPure": false, - "lValueRequested": false, - "leftExpression": { - "expression": { - "id": 59525, - "name": "msg", - "nodeType": "Identifier", - "overloadedDeclarations": [], - "referencedDeclaration": -15, - "src": "6710:3:110", - "typeDescriptions": { - "typeIdentifier": "t_magic_message", - "typeString": "msg" - } - }, - "id": 59526, - "isConstant": false, - "isLValue": false, - "isPure": false, - "lValueRequested": false, - "memberName": "sender", - "nodeType": "MemberAccess", - "src": "6710:10:110", - "typeDescriptions": { - "typeIdentifier": "t_address", - "typeString": "address" - } - }, - "nodeType": "BinaryOperation", - "operator": "==", - "rightExpression": { - "id": 59527, - "name": "guardian", - "nodeType": "Identifier", - "overloadedDeclarations": [], - "referencedDeclaration": 59348, - "src": "6724:8:110", - "typeDescriptions": { - "typeIdentifier": "t_address", - "typeString": "address" - } - }, - "src": "6710:22:110", - "typeDescriptions": { - "typeIdentifier": "t_bool", - "typeString": "bool" - } - }, - { - "hexValue": "4f7074696d69736d506f7274616c3a206f6e6c7920677561726469616e2063616e20756e7061757365", - "id": 59529, - "isConstant": false, - "isLValue": false, - "isPure": true, - "kind": "string", - "lValueRequested": false, - "nodeType": "Literal", - "src": "6734:43:110", - "typeDescriptions": { - "typeIdentifier": "t_stringliteral_9b69e94c34df6db33f20b596e1e1d19a7e5843e1b38ae4395fe1bbf64e89e262", - "typeString": "literal_string \"OptimismPortal: only guardian can unpause\"" - }, - "value": "OptimismPortal: only guardian can unpause" - } - ], - "expression": { - "argumentTypes": [ - { - "typeIdentifier": "t_bool", - "typeString": "bool" - }, - { - "typeIdentifier": "t_stringliteral_9b69e94c34df6db33f20b596e1e1d19a7e5843e1b38ae4395fe1bbf64e89e262", - "typeString": "literal_string \"OptimismPortal: only guardian can unpause\"" - } - ], - "id": 59524, - "name": "require", - "nodeType": "Identifier", - "overloadedDeclarations": [ - -18, - -18 - ], - "referencedDeclaration": -18, - "src": "6702:7:110", - "typeDescriptions": { - "typeIdentifier": "t_function_require_pure$_t_bool_$_t_string_memory_ptr_$returns$__$", - "typeString": "function (bool,string memory) pure" - } - }, - "id": 59530, - "isConstant": false, - "isLValue": false, - "isPure": false, - "kind": "functionCall", - "lValueRequested": false, - "names": [], - "nodeType": "FunctionCall", - "src": "6702:76:110", - "tryCall": false, - "typeDescriptions": { - "typeIdentifier": "t_tuple$__$", - "typeString": "tuple()" - } - }, - "id": 59531, - "nodeType": "ExpressionStatement", - "src": "6702:76:110" - }, - { - "expression": { - "id": 59534, - "isConstant": false, - "isLValue": false, - "isPure": false, - "lValueRequested": false, - "leftHandSide": { - "id": 59532, - "name": "paused", - "nodeType": "Identifier", - "overloadedDeclarations": [], - "referencedDeclaration": 59337, - "src": "6788:6:110", - "typeDescriptions": { - "typeIdentifier": "t_bool", - "typeString": "bool" - } - }, - "nodeType": "Assignment", - "operator": "=", - "rightHandSide": { - "hexValue": "66616c7365", - "id": 59533, - "isConstant": false, - "isLValue": false, - "isPure": true, - "kind": "bool", - "lValueRequested": false, - "nodeType": "Literal", - "src": "6797:5:110", - "typeDescriptions": { - "typeIdentifier": "t_bool", - "typeString": "bool" - }, - "value": "false" - }, - "src": "6788:14:110", - "typeDescriptions": { - "typeIdentifier": "t_bool", - "typeString": "bool" - } - }, - "id": 59535, - "nodeType": "ExpressionStatement", - "src": "6788:14:110" - }, - { - "eventCall": { - "arguments": [ - { - "expression": { - "id": 59537, - "name": "msg", - "nodeType": "Identifier", - "overloadedDeclarations": [], - "referencedDeclaration": -15, - "src": "6826:3:110", - "typeDescriptions": { - "typeIdentifier": "t_magic_message", - "typeString": "msg" - } - }, - "id": 59538, - "isConstant": false, - "isLValue": false, - "isPure": false, - "lValueRequested": false, - "memberName": "sender", - "nodeType": "MemberAccess", - "src": "6826:10:110", - "typeDescriptions": { - "typeIdentifier": "t_address", - "typeString": "address" - } - } - ], - "expression": { - "argumentTypes": [ - { - "typeIdentifier": "t_address", - "typeString": "address" - } - ], - "id": 59536, - "name": "Unpaused", - "nodeType": "Identifier", - "overloadedDeclarations": [], - "referencedDeclaration": 59385, - "src": "6817:8:110", - "typeDescriptions": { - "typeIdentifier": "t_function_event_nonpayable$_t_address_$returns$__$", - "typeString": "function (address)" - } - }, - "id": 59539, - "isConstant": false, - "isLValue": false, - "isPure": false, - "kind": "functionCall", - "lValueRequested": false, - "names": [], - "nodeType": "FunctionCall", - "src": "6817:20:110", - "tryCall": false, - "typeDescriptions": { - "typeIdentifier": "t_tuple$__$", - "typeString": "tuple()" - } - }, - "id": 59540, - "nodeType": "EmitStatement", - "src": "6812:25:110" - } - ] - }, - "documentation": { - "id": 59521, - "nodeType": "StructuredDocumentation", - "src": "6626:33:110", - "text": "@notice Unpauses withdrawals." - }, - "functionSelector": "3f4ba83a", - "implemented": true, - "kind": "function", - "modifiers": [], - "name": "unpause", - "nameLocation": "6673:7:110", - "parameters": { - "id": 59522, - "nodeType": "ParameterList", - "parameters": [], - "src": "6680:2:110" - }, - "returnParameters": { - "id": 59523, - "nodeType": "ParameterList", - "parameters": [], - "src": "6692:0:110" - }, - "scope": 59997, - "stateMutability": "nonpayable", - "virtual": false, - "visibility": "external" - }, - { - "id": 59557, - "nodeType": "FunctionDefinition", - "src": "7337:120:110", - "nodes": [], - "body": { - "id": 59556, - "nodeType": "Block", - "src": "7410:47:110", - "nodes": [], - "statements": [ - { - "expression": { - "commonType": { - "typeIdentifier": "t_uint64", - "typeString": "uint64" - }, - "id": 59554, - "isConstant": false, - "isLValue": false, - "isPure": false, - "lValueRequested": false, - "leftExpression": { - "commonType": { - "typeIdentifier": "t_uint64", - "typeString": "uint64" - }, - "id": 59552, - "isConstant": false, - "isLValue": false, - "isPure": false, - "lValueRequested": false, - "leftExpression": { - "id": 59550, - "name": "_byteCount", - "nodeType": "Identifier", - "overloadedDeclarations": [], - "referencedDeclaration": 59545, - "src": "7427:10:110", - "typeDescriptions": { - "typeIdentifier": "t_uint64", - "typeString": "uint64" - } - }, - "nodeType": "BinaryOperation", - "operator": "*", - "rightExpression": { - "hexValue": "3136", - "id": 59551, - "isConstant": false, - "isLValue": false, - "isPure": true, - "kind": "number", - "lValueRequested": false, - "nodeType": "Literal", - "src": "7440:2:110", - "typeDescriptions": { - "typeIdentifier": "t_rational_16_by_1", - "typeString": "int_const 16" - }, - "value": "16" - }, - "src": "7427:15:110", - "typeDescriptions": { - "typeIdentifier": "t_uint64", - "typeString": "uint64" - } - }, - "nodeType": "BinaryOperation", - "operator": "+", - "rightExpression": { - "hexValue": "3231303030", - "id": 59553, - "isConstant": false, - "isLValue": false, - "isPure": true, - "kind": "number", - "lValueRequested": false, - "nodeType": "Literal", - "src": "7445:5:110", - "typeDescriptions": { - "typeIdentifier": "t_rational_21000_by_1", - "typeString": "int_const 21000" - }, - "value": "21000" - }, - "src": "7427:23:110", - "typeDescriptions": { - "typeIdentifier": "t_uint64", - "typeString": "uint64" - } - }, - "functionReturnParameters": 59549, - "id": 59555, - "nodeType": "Return", - "src": "7420:30:110" - } - ] - }, - "documentation": { - "id": 59543, - "nodeType": "StructuredDocumentation", - "src": "6850:482:110", - "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": "7346:15:110", - "parameters": { - "id": 59546, - "nodeType": "ParameterList", - "parameters": [ - { - "constant": false, - "id": 59545, - "mutability": "mutable", - "name": "_byteCount", - "nameLocation": "7369:10:110", - "nodeType": "VariableDeclaration", - "scope": 59557, - "src": "7362:17:110", - "stateVariable": false, - "storageLocation": "default", - "typeDescriptions": { - "typeIdentifier": "t_uint64", - "typeString": "uint64" - }, - "typeName": { - "id": 59544, - "name": "uint64", - "nodeType": "ElementaryTypeName", - "src": "7362:6:110", - "typeDescriptions": { - "typeIdentifier": "t_uint64", - "typeString": "uint64" - } - }, - "visibility": "internal" - } - ], - "src": "7361:19:110" - }, - "returnParameters": { - "id": 59549, - "nodeType": "ParameterList", - "parameters": [ - { - "constant": false, - "id": 59548, - "mutability": "mutable", - "name": "", - "nameLocation": "-1:-1:-1", - "nodeType": "VariableDeclaration", - "scope": 59557, - "src": "7402:6:110", - "stateVariable": false, - "storageLocation": "default", - "typeDescriptions": { - "typeIdentifier": "t_uint64", - "typeString": "uint64" - }, - "typeName": { - "id": 59547, - "name": "uint64", - "nodeType": "ElementaryTypeName", - "src": "7402:6:110", - "typeDescriptions": { - "typeIdentifier": "t_uint64", - "typeString": "uint64" - } - }, - "visibility": "internal" - } - ], - "src": "7401:8:110" - }, - "scope": 59997, - "stateMutability": "pure", - "virtual": false, - "visibility": "public" - }, - { - "id": 59575, - "nodeType": "FunctionDefinition", - "src": "7878:130:110", - "nodes": [], - "body": { - "id": 59574, - "nodeType": "Block", - "src": "7905:103:110", - "nodes": [], - "statements": [ - { - "expression": { - "arguments": [ - { - "expression": { - "id": 59562, - "name": "msg", - "nodeType": "Identifier", - "overloadedDeclarations": [], - "referencedDeclaration": -15, - "src": "7934:3:110", - "typeDescriptions": { - "typeIdentifier": "t_magic_message", - "typeString": "msg" - } - }, - "id": 59563, - "isConstant": false, - "isLValue": false, - "isPure": false, - "lValueRequested": false, - "memberName": "sender", - "nodeType": "MemberAccess", - "src": "7934:10:110", - "typeDescriptions": { - "typeIdentifier": "t_address", - "typeString": "address" - } - }, - { - "expression": { - "id": 59564, - "name": "msg", - "nodeType": "Identifier", - "overloadedDeclarations": [], - "referencedDeclaration": -15, - "src": "7946:3:110", - "typeDescriptions": { - "typeIdentifier": "t_magic_message", - "typeString": "msg" - } - }, - "id": 59565, - "isConstant": false, - "isLValue": false, - "isPure": false, - "lValueRequested": false, - "memberName": "value", - "nodeType": "MemberAccess", - "src": "7946:9:110", - "typeDescriptions": { - "typeIdentifier": "t_uint256", - "typeString": "uint256" - } - }, - { - "id": 59566, - "name": "RECEIVE_DEFAULT_GAS_LIMIT", - "nodeType": "Identifier", - "overloadedDeclarations": [], - "referencedDeclaration": 59320, - "src": "7957:25:110", - "typeDescriptions": { - "typeIdentifier": "t_uint64", - "typeString": "uint64" - } - }, - { - "hexValue": "66616c7365", - "id": 59567, - "isConstant": false, - "isLValue": false, - "isPure": true, - "kind": "bool", - "lValueRequested": false, - "nodeType": "Literal", - "src": "7984:5:110", - "typeDescriptions": { - "typeIdentifier": "t_bool", - "typeString": "bool" - }, - "value": "false" - }, - { - "arguments": [ - { - "hexValue": "", - "id": 59570, - "isConstant": false, - "isLValue": false, - "isPure": true, - "kind": "string", - "lValueRequested": false, - "nodeType": "Literal", - "src": "7997:2:110", - "typeDescriptions": { - "typeIdentifier": "t_stringliteral_c5d2460186f7233c927e7db2dcc703c0e500b653ca82273b7bfad8045d85a470", - "typeString": "literal_string \"\"" - }, - "value": "" - } - ], - "expression": { - "argumentTypes": [ - { - "typeIdentifier": "t_stringliteral_c5d2460186f7233c927e7db2dcc703c0e500b653ca82273b7bfad8045d85a470", - "typeString": "literal_string \"\"" - } - ], - "id": 59569, - "isConstant": false, - "isLValue": false, - "isPure": true, - "lValueRequested": false, - "nodeType": "ElementaryTypeNameExpression", - "src": "7991:5:110", - "typeDescriptions": { - "typeIdentifier": "t_type$_t_bytes_storage_ptr_$", - "typeString": "type(bytes storage pointer)" - }, - "typeName": { - "id": 59568, - "name": "bytes", - "nodeType": "ElementaryTypeName", - "src": "7991:5:110", - "typeDescriptions": {} - } - }, - "id": 59571, - "isConstant": false, - "isLValue": false, - "isPure": true, - "kind": "typeConversion", - "lValueRequested": false, - "names": [], - "nodeType": "FunctionCall", - "src": "7991:9:110", - "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": 59561, - "name": "depositTransaction", - "nodeType": "Identifier", - "overloadedDeclarations": [], - "referencedDeclaration": 59961, - "src": "7915:18:110", - "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": 59572, - "isConstant": false, - "isLValue": false, - "isPure": false, - "kind": "functionCall", - "lValueRequested": false, - "names": [], - "nodeType": "FunctionCall", - "src": "7915:86:110", - "tryCall": false, - "typeDescriptions": { - "typeIdentifier": "t_tuple$__$", - "typeString": "tuple()" - } - }, - "id": 59573, - "nodeType": "ExpressionStatement", - "src": "7915:86:110" - } - ] - }, - "documentation": { - "id": 59558, - "nodeType": "StructuredDocumentation", - "src": "7463:368:110", - "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": 59559, - "nodeType": "ParameterList", - "parameters": [], - "src": "7885:2:110" - }, - "returnParameters": { - "id": 59560, - "nodeType": "ParameterList", - "parameters": [], - "src": "7905:0:110" - }, - "scope": 59997, - "stateMutability": "payable", - "virtual": false, - "visibility": "external" - }, - { - "id": 59580, - "nodeType": "FunctionDefinition", - "src": "8222:77:110", - "nodes": [], - "body": { - "id": 59579, - "nodeType": "Block", - "src": "8260:39:110", - "nodes": [], - "statements": [] - }, - "documentation": { - "id": 59576, - "nodeType": "StructuredDocumentation", - "src": "8014:203:110", - "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": "8231:9:110", - "parameters": { - "id": 59577, - "nodeType": "ParameterList", - "parameters": [], - "src": "8240:2:110" - }, - "returnParameters": { - "id": 59578, - "nodeType": "ParameterList", - "parameters": [], - "src": "8260:0:110" - }, - "scope": 59997, - "stateMutability": "payable", - "virtual": false, - "visibility": "external" - }, - { - "id": 59593, - "nodeType": "FunctionDefinition", - "src": "8548:152:110", - "nodes": [], - "body": { - "id": 59592, - "nodeType": "Block", - "src": "8647:53:110", - "nodes": [], - "statements": [ - { - "expression": { - "arguments": [], - "expression": { - "argumentTypes": [], - "expression": { - "id": 59588, - "name": "systemConfig", - "nodeType": "Identifier", - "overloadedDeclarations": [], - "referencedDeclaration": 59345, - "src": "8664:12:110", - "typeDescriptions": { - "typeIdentifier": "t_contract$_SystemConfig_$61393", - "typeString": "contract SystemConfig" - } - }, - "id": 59589, - "isConstant": false, - "isLValue": false, - "isPure": false, - "lValueRequested": false, - "memberName": "resourceConfig", - "nodeType": "MemberAccess", - "referencedDeclaration": 61313, - "src": "8664:27:110", - "typeDescriptions": { - "typeIdentifier": "t_function_external_view$__$returns$_t_struct$_ResourceConfig_$60283_memory_ptr_$", - "typeString": "function () view external returns (struct ResourceMetering.ResourceConfig memory)" - } - }, - "id": 59590, - "isConstant": false, - "isLValue": false, - "isPure": false, - "kind": "functionCall", - "lValueRequested": false, - "names": [], - "nodeType": "FunctionCall", - "src": "8664:29:110", - "tryCall": false, - "typeDescriptions": { - "typeIdentifier": "t_struct$_ResourceConfig_$60283_memory_ptr", - "typeString": "struct ResourceMetering.ResourceConfig memory" - } - }, - "functionReturnParameters": 59587, - "id": 59591, - "nodeType": "Return", - "src": "8657:36:110" - } - ] - }, - "baseFunctions": [ - 60579 - ], - "documentation": { - "id": 59581, - "nodeType": "StructuredDocumentation", - "src": "8305:238:110", - "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": "8557:15:110", - "overrides": { - "id": 59583, - "nodeType": "OverrideSpecifier", - "overrides": [], - "src": "8589:8:110" - }, - "parameters": { - "id": 59582, - "nodeType": "ParameterList", - "parameters": [], - "src": "8572:2:110" - }, - "returnParameters": { - "id": 59587, - "nodeType": "ParameterList", - "parameters": [ - { - "constant": false, - "id": 59586, - "mutability": "mutable", - "name": "", - "nameLocation": "-1:-1:-1", - "nodeType": "VariableDeclaration", - "scope": 59593, - "src": "8607:38:110", - "stateVariable": false, - "storageLocation": "memory", - "typeDescriptions": { - "typeIdentifier": "t_struct$_ResourceConfig_$60283_memory_ptr", - "typeString": "struct ResourceMetering.ResourceConfig" - }, - "typeName": { - "id": 59585, - "nodeType": "UserDefinedTypeName", - "pathNode": { - "id": 59584, - "name": "ResourceMetering.ResourceConfig", - "nodeType": "IdentifierPath", - "referencedDeclaration": 60283, - "src": "8607:31:110" - }, - "referencedDeclaration": 60283, - "src": "8607:31:110", - "typeDescriptions": { - "typeIdentifier": "t_struct$_ResourceConfig_$60283_storage_ptr", - "typeString": "struct ResourceMetering.ResourceConfig" - } - }, - "visibility": "internal" - } - ], - "src": "8606:40:110" - }, - "scope": 59997, - "stateMutability": "view", - "virtual": false, - "visibility": "internal" - }, - { - "id": 59725, - "nodeType": "FunctionDefinition", - "src": "9088:3746:110", - "nodes": [], - "body": { - "id": 59724, - "nodeType": "Block", - "src": "9353:3481:110", - "nodes": [], - "statements": [ - { - "expression": { - "arguments": [ - { - "commonType": { - "typeIdentifier": "t_address", - "typeString": "address" - }, - "id": 59617, - "isConstant": false, - "isLValue": false, - "isPure": false, - "lValueRequested": false, - "leftExpression": { - "expression": { - "id": 59611, - "name": "_tx", - "nodeType": "Identifier", - "overloadedDeclarations": [], - "referencedDeclaration": 59597, - "src": "9598:3:110", - "typeDescriptions": { - "typeIdentifier": "t_struct$_WithdrawalTransaction_$70594_memory_ptr", - "typeString": "struct Types.WithdrawalTransaction memory" - } - }, - "id": 59612, - "isConstant": false, - "isLValue": true, - "isPure": false, - "lValueRequested": false, - "memberName": "target", - "nodeType": "MemberAccess", - "referencedDeclaration": 70587, - "src": "9598:10:110", - "typeDescriptions": { - "typeIdentifier": "t_address", - "typeString": "address" - } - }, - "nodeType": "BinaryOperation", - "operator": "!=", - "rightExpression": { - "arguments": [ - { - "id": 59615, - "name": "this", - "nodeType": "Identifier", - "overloadedDeclarations": [], - "referencedDeclaration": -28, - "src": "9620:4:110", - "typeDescriptions": { - "typeIdentifier": "t_contract$_OptimismPortal_$59997", - "typeString": "contract OptimismPortal" - } - } - ], - "expression": { - "argumentTypes": [ - { - "typeIdentifier": "t_contract$_OptimismPortal_$59997", - "typeString": "contract OptimismPortal" - } - ], - "id": 59614, - "isConstant": false, - "isLValue": false, - "isPure": true, - "lValueRequested": false, - "nodeType": "ElementaryTypeNameExpression", - "src": "9612:7:110", - "typeDescriptions": { - "typeIdentifier": "t_type$_t_address_$", - "typeString": "type(address)" - }, - "typeName": { - "id": 59613, - "name": "address", - "nodeType": "ElementaryTypeName", - "src": "9612:7:110", - "typeDescriptions": {} - } - }, - "id": 59616, - "isConstant": false, - "isLValue": false, - "isPure": false, - "kind": "typeConversion", - "lValueRequested": false, - "names": [], - "nodeType": "FunctionCall", - "src": "9612:13:110", - "tryCall": false, - "typeDescriptions": { - "typeIdentifier": "t_address", - "typeString": "address" - } - }, - "src": "9598:27:110", - "typeDescriptions": { - "typeIdentifier": "t_bool", - "typeString": "bool" - } - }, - { - "hexValue": "4f7074696d69736d506f7274616c3a20796f752063616e6e6f742073656e64206d6573736167657320746f2074686520706f7274616c20636f6e7472616374", - "id": 59618, - "isConstant": false, - "isLValue": false, - "isPure": true, - "kind": "string", - "lValueRequested": false, - "nodeType": "Literal", - "src": "9627:65:110", - "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": 59610, - "name": "require", - "nodeType": "Identifier", - "overloadedDeclarations": [ - -18, - -18 - ], - "referencedDeclaration": -18, - "src": "9590:7:110", - "typeDescriptions": { - "typeIdentifier": "t_function_require_pure$_t_bool_$_t_string_memory_ptr_$returns$__$", - "typeString": "function (bool,string memory) pure" - } - }, - "id": 59619, - "isConstant": false, - "isLValue": false, - "isPure": false, - "kind": "functionCall", - "lValueRequested": false, - "names": [], - "nodeType": "FunctionCall", - "src": "9590:103:110", - "tryCall": false, - "typeDescriptions": { - "typeIdentifier": "t_tuple$__$", - "typeString": "tuple()" - } - }, - "id": 59620, - "nodeType": "ExpressionStatement", - "src": "9590:103:110" - }, - { - "assignments": [ - 59622 - ], - "declarations": [ - { - "constant": false, - "id": 59622, - "mutability": "mutable", - "name": "outputRoot", - "nameLocation": "9878:10:110", - "nodeType": "VariableDeclaration", - "scope": 59724, - "src": "9870:18:110", - "stateVariable": false, - "storageLocation": "default", - "typeDescriptions": { - "typeIdentifier": "t_bytes32", - "typeString": "bytes32" - }, - "typeName": { - "id": 59621, - "name": "bytes32", - "nodeType": "ElementaryTypeName", - "src": "9870:7:110", - "typeDescriptions": { - "typeIdentifier": "t_bytes32", - "typeString": "bytes32" - } - }, - "visibility": "internal" - } - ], - "id": 59628, - "initialValue": { - "expression": { - "arguments": [ - { - "id": 59625, - "name": "_l2OutputIndex", - "nodeType": "Identifier", - "overloadedDeclarations": [], - "referencedDeclaration": 59599, - "src": "9912:14:110", - "typeDescriptions": { - "typeIdentifier": "t_uint256", - "typeString": "uint256" - } - } - ], - "expression": { - "argumentTypes": [ - { - "typeIdentifier": "t_uint256", - "typeString": "uint256" - } - ], - "expression": { - "id": 59623, - "name": "l2Oracle", - "nodeType": "Identifier", - "overloadedDeclarations": [], - "referencedDeclaration": 59341, - "src": "9891:8:110", - "typeDescriptions": { - "typeIdentifier": "t_contract$_L2OutputOracle_$59272", - "typeString": "contract L2OutputOracle" - } - }, - "id": 59624, - "isConstant": false, - "isLValue": false, - "isPure": false, - "lValueRequested": false, - "memberName": "getL2Output", - "nodeType": "MemberAccess", - "referencedDeclaration": 59112, - "src": "9891:20:110", - "typeDescriptions": { - "typeIdentifier": "t_function_external_view$_t_uint256_$returns$_t_struct$_OutputProposal_$70553_memory_ptr_$", - "typeString": "function (uint256) view external returns (struct Types.OutputProposal memory)" - } - }, - "id": 59626, - "isConstant": false, - "isLValue": false, - "isPure": false, - "kind": "functionCall", - "lValueRequested": false, - "names": [], - "nodeType": "FunctionCall", - "src": "9891:36:110", - "tryCall": false, - "typeDescriptions": { - "typeIdentifier": "t_struct$_OutputProposal_$70553_memory_ptr", - "typeString": "struct Types.OutputProposal memory" - } - }, - "id": 59627, - "isConstant": false, - "isLValue": true, - "isPure": false, - "lValueRequested": false, - "memberName": "outputRoot", - "nodeType": "MemberAccess", - "referencedDeclaration": 70548, - "src": "9891:47:110", - "typeDescriptions": { - "typeIdentifier": "t_bytes32", - "typeString": "bytes32" - } - }, - "nodeType": "VariableDeclarationStatement", - "src": "9870:68:110" - }, - { - "expression": { - "arguments": [ - { - "commonType": { - "typeIdentifier": "t_bytes32", - "typeString": "bytes32" - }, - "id": 59635, - "isConstant": false, - "isLValue": false, - "isPure": false, - "lValueRequested": false, - "leftExpression": { - "id": 59630, - "name": "outputRoot", - "nodeType": "Identifier", - "overloadedDeclarations": [], - "referencedDeclaration": 59622, - "src": "10058:10:110", - "typeDescriptions": { - "typeIdentifier": "t_bytes32", - "typeString": "bytes32" - } - }, - "nodeType": "BinaryOperation", - "operator": "==", - "rightExpression": { - "arguments": [ - { - "id": 59633, - "name": "_outputRootProof", - "nodeType": "Identifier", - "overloadedDeclarations": [], - "referencedDeclaration": 59602, - "src": "10100:16:110", - "typeDescriptions": { - "typeIdentifier": "t_struct$_OutputRootProof_$70562_calldata_ptr", - "typeString": "struct Types.OutputRootProof calldata" - } - } - ], - "expression": { - "argumentTypes": [ - { - "typeIdentifier": "t_struct$_OutputRootProof_$70562_calldata_ptr", - "typeString": "struct Types.OutputRootProof calldata" - } - ], - "expression": { - "id": 59631, - "name": "Hashing", - "nodeType": "Identifier", - "overloadedDeclarations": [], - "referencedDeclaration": 70279, - "src": "10072:7:110", - "typeDescriptions": { - "typeIdentifier": "t_type$_t_contract$_Hashing_$70279_$", - "typeString": "type(library Hashing)" - } - }, - "id": 59632, - "isConstant": false, - "isLValue": false, - "isPure": false, - "lValueRequested": false, - "memberName": "hashOutputRootProof", - "nodeType": "MemberAccess", - "referencedDeclaration": 70278, - "src": "10072:27:110", - "typeDescriptions": { - "typeIdentifier": "t_function_internal_pure$_t_struct$_OutputRootProof_$70562_memory_ptr_$returns$_t_bytes32_$", - "typeString": "function (struct Types.OutputRootProof memory) pure returns (bytes32)" - } - }, - "id": 59634, - "isConstant": false, - "isLValue": false, - "isPure": false, - "kind": "functionCall", - "lValueRequested": false, - "names": [], - "nodeType": "FunctionCall", - "src": "10072:45:110", - "tryCall": false, - "typeDescriptions": { - "typeIdentifier": "t_bytes32", - "typeString": "bytes32" - } - }, - "src": "10058:59:110", - "typeDescriptions": { - "typeIdentifier": "t_bool", - "typeString": "bool" - } - }, - { - "hexValue": "4f7074696d69736d506f7274616c3a20696e76616c6964206f757470757420726f6f742070726f6f66", - "id": 59636, - "isConstant": false, - "isLValue": false, - "isPure": true, - "kind": "string", - "lValueRequested": false, - "nodeType": "Literal", - "src": "10119:43:110", - "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": 59629, - "name": "require", - "nodeType": "Identifier", - "overloadedDeclarations": [ - -18, - -18 - ], - "referencedDeclaration": -18, - "src": "10037:7:110", - "typeDescriptions": { - "typeIdentifier": "t_function_require_pure$_t_bool_$_t_string_memory_ptr_$returns$__$", - "typeString": "function (bool,string memory) pure" - } - }, - "id": 59637, - "isConstant": false, - "isLValue": false, - "isPure": false, - "kind": "functionCall", - "lValueRequested": false, - "names": [], - "nodeType": "FunctionCall", - "src": "10037:135:110", - "tryCall": false, - "typeDescriptions": { - "typeIdentifier": "t_tuple$__$", - "typeString": "tuple()" - } - }, - "id": 59638, - "nodeType": "ExpressionStatement", - "src": "10037:135:110" - }, - { - "assignments": [ - 59640 - ], - "declarations": [ - { - "constant": false, - "id": 59640, - "mutability": "mutable", - "name": "withdrawalHash", - "nameLocation": "10291:14:110", - "nodeType": "VariableDeclaration", - "scope": 59724, - "src": "10283:22:110", - "stateVariable": false, - "storageLocation": "default", - "typeDescriptions": { - "typeIdentifier": "t_bytes32", - "typeString": "bytes32" - }, - "typeName": { - "id": 59639, - "name": "bytes32", - "nodeType": "ElementaryTypeName", - "src": "10283:7:110", - "typeDescriptions": { - "typeIdentifier": "t_bytes32", - "typeString": "bytes32" - } - }, - "visibility": "internal" - } - ], - "id": 59645, - "initialValue": { - "arguments": [ - { - "id": 59643, - "name": "_tx", - "nodeType": "Identifier", - "overloadedDeclarations": [], - "referencedDeclaration": 59597, - "src": "10331:3:110", - "typeDescriptions": { - "typeIdentifier": "t_struct$_WithdrawalTransaction_$70594_memory_ptr", - "typeString": "struct Types.WithdrawalTransaction memory" - } - } - ], - "expression": { - "argumentTypes": [ - { - "typeIdentifier": "t_struct$_WithdrawalTransaction_$70594_memory_ptr", - "typeString": "struct Types.WithdrawalTransaction memory" - } - ], - "expression": { - "id": 59641, - "name": "Hashing", - "nodeType": "Identifier", - "overloadedDeclarations": [], - "referencedDeclaration": 70279, - "src": "10308:7:110", - "typeDescriptions": { - "typeIdentifier": "t_type$_t_contract$_Hashing_$70279_$", - "typeString": "type(library Hashing)" - } - }, - "id": 59642, - "isConstant": false, - "isLValue": false, - "isPure": false, - "lValueRequested": false, - "memberName": "hashWithdrawal", - "nodeType": "MemberAccess", - "referencedDeclaration": 70254, - "src": "10308:22:110", - "typeDescriptions": { - "typeIdentifier": "t_function_internal_pure$_t_struct$_WithdrawalTransaction_$70594_memory_ptr_$returns$_t_bytes32_$", - "typeString": "function (struct Types.WithdrawalTransaction memory) pure returns (bytes32)" - } - }, - "id": 59644, - "isConstant": false, - "isLValue": false, - "isPure": false, - "kind": "functionCall", - "lValueRequested": false, - "names": [], - "nodeType": "FunctionCall", - "src": "10308:27:110", - "tryCall": false, - "typeDescriptions": { - "typeIdentifier": "t_bytes32", - "typeString": "bytes32" - } - }, - "nodeType": "VariableDeclarationStatement", - "src": "10283:52:110" - }, - { - "assignments": [ - 59648 - ], - "declarations": [ - { - "constant": false, - "id": 59648, - "mutability": "mutable", - "name": "provenWithdrawal", - "nameLocation": "10369:16:110", - "nodeType": "VariableDeclaration", - "scope": 59724, - "src": "10345:40:110", - "stateVariable": false, - "storageLocation": "memory", - "typeDescriptions": { - "typeIdentifier": "t_struct$_ProvenWithdrawal_$59312_memory_ptr", - "typeString": "struct OptimismPortal.ProvenWithdrawal" - }, - "typeName": { - "id": 59647, - "nodeType": "UserDefinedTypeName", - "pathNode": { - "id": 59646, - "name": "ProvenWithdrawal", - "nodeType": "IdentifierPath", - "referencedDeclaration": 59312, - "src": "10345:16:110" - }, - "referencedDeclaration": 59312, - "src": "10345:16:110", - "typeDescriptions": { - "typeIdentifier": "t_struct$_ProvenWithdrawal_$59312_storage_ptr", - "typeString": "struct OptimismPortal.ProvenWithdrawal" - } - }, - "visibility": "internal" - } - ], - "id": 59652, - "initialValue": { - "baseExpression": { - "id": 59649, - "name": "provenWithdrawals", - "nodeType": "Identifier", - "overloadedDeclarations": [], - "referencedDeclaration": 59334, - "src": "10388:17:110", - "typeDescriptions": { - "typeIdentifier": "t_mapping$_t_bytes32_$_t_struct$_ProvenWithdrawal_$59312_storage_$", - "typeString": "mapping(bytes32 => struct OptimismPortal.ProvenWithdrawal storage ref)" - } - }, - "id": 59651, - "indexExpression": { - "id": 59650, - "name": "withdrawalHash", - "nodeType": "Identifier", - "overloadedDeclarations": [], - "referencedDeclaration": 59640, - "src": "10406:14:110", - "typeDescriptions": { - "typeIdentifier": "t_bytes32", - "typeString": "bytes32" - } - }, - "isConstant": false, - "isLValue": true, - "isPure": false, - "lValueRequested": false, - "nodeType": "IndexAccess", - "src": "10388:33:110", - "typeDescriptions": { - "typeIdentifier": "t_struct$_ProvenWithdrawal_$59312_storage", - "typeString": "struct OptimismPortal.ProvenWithdrawal storage ref" - } - }, - "nodeType": "VariableDeclarationStatement", - "src": "10345:76:110" - }, - { - "expression": { - "arguments": [ - { - "commonType": { - "typeIdentifier": "t_bool", - "typeString": "bool" - }, - "id": 59667, - "isConstant": false, - "isLValue": false, - "isPure": false, - "lValueRequested": false, - "leftExpression": { - "commonType": { - "typeIdentifier": "t_uint128", - "typeString": "uint128" - }, - "id": 59657, - "isConstant": false, - "isLValue": false, - "isPure": false, - "lValueRequested": false, - "leftExpression": { - "expression": { - "id": 59654, - "name": "provenWithdrawal", - "nodeType": "Identifier", - "overloadedDeclarations": [], - "referencedDeclaration": 59648, - "src": "10975:16:110", - "typeDescriptions": { - "typeIdentifier": "t_struct$_ProvenWithdrawal_$59312_memory_ptr", - "typeString": "struct OptimismPortal.ProvenWithdrawal memory" - } - }, - "id": 59655, - "isConstant": false, - "isLValue": true, - "isPure": false, - "lValueRequested": false, - "memberName": "timestamp", - "nodeType": "MemberAccess", - "referencedDeclaration": 59309, - "src": "10975:26:110", - "typeDescriptions": { - "typeIdentifier": "t_uint128", - "typeString": "uint128" - } - }, - "nodeType": "BinaryOperation", - "operator": "==", - "rightExpression": { - "hexValue": "30", - "id": 59656, - "isConstant": false, - "isLValue": false, - "isPure": true, - "kind": "number", - "lValueRequested": false, - "nodeType": "Literal", - "src": "11005:1:110", - "typeDescriptions": { - "typeIdentifier": "t_rational_0_by_1", - "typeString": "int_const 0" - }, - "value": "0" - }, - "src": "10975:31:110", - "typeDescriptions": { - "typeIdentifier": "t_bool", - "typeString": "bool" - } - }, - "nodeType": "BinaryOperation", - "operator": "||", - "rightExpression": { - "commonType": { - "typeIdentifier": "t_bytes32", - "typeString": "bytes32" - }, - "id": 59666, - "isConstant": false, - "isLValue": false, - "isPure": false, - "lValueRequested": false, - "leftExpression": { - "expression": { - "arguments": [ - { - "expression": { - "id": 59660, - "name": "provenWithdrawal", - "nodeType": "Identifier", - "overloadedDeclarations": [], - "referencedDeclaration": 59648, - "src": "11047:16:110", - "typeDescriptions": { - "typeIdentifier": "t_struct$_ProvenWithdrawal_$59312_memory_ptr", - "typeString": "struct OptimismPortal.ProvenWithdrawal memory" - } - }, - "id": 59661, - "isConstant": false, - "isLValue": true, - "isPure": false, - "lValueRequested": false, - "memberName": "l2OutputIndex", - "nodeType": "MemberAccess", - "referencedDeclaration": 59311, - "src": "11047:30:110", - "typeDescriptions": { - "typeIdentifier": "t_uint128", - "typeString": "uint128" - } - } - ], - "expression": { - "argumentTypes": [ - { - "typeIdentifier": "t_uint128", - "typeString": "uint128" - } - ], - "expression": { - "id": 59658, - "name": "l2Oracle", - "nodeType": "Identifier", - "overloadedDeclarations": [], - "referencedDeclaration": 59341, - "src": "11026:8:110", - "typeDescriptions": { - "typeIdentifier": "t_contract$_L2OutputOracle_$59272", - "typeString": "contract L2OutputOracle" - } - }, - "id": 59659, - "isConstant": false, - "isLValue": false, - "isPure": false, - "lValueRequested": false, - "memberName": "getL2Output", - "nodeType": "MemberAccess", - "referencedDeclaration": 59112, - "src": "11026:20:110", - "typeDescriptions": { - "typeIdentifier": "t_function_external_view$_t_uint256_$returns$_t_struct$_OutputProposal_$70553_memory_ptr_$", - "typeString": "function (uint256) view external returns (struct Types.OutputProposal memory)" - } - }, - "id": 59662, - "isConstant": false, - "isLValue": false, - "isPure": false, - "kind": "functionCall", - "lValueRequested": false, - "names": [], - "nodeType": "FunctionCall", - "src": "11026:52:110", - "tryCall": false, - "typeDescriptions": { - "typeIdentifier": "t_struct$_OutputProposal_$70553_memory_ptr", - "typeString": "struct Types.OutputProposal memory" - } - }, - "id": 59663, - "isConstant": false, - "isLValue": true, - "isPure": false, - "lValueRequested": false, - "memberName": "outputRoot", - "nodeType": "MemberAccess", - "referencedDeclaration": 70548, - "src": "11026:63:110", - "typeDescriptions": { - "typeIdentifier": "t_bytes32", - "typeString": "bytes32" - } - }, - "nodeType": "BinaryOperation", - "operator": "!=", - "rightExpression": { - "expression": { - "id": 59664, - "name": "provenWithdrawal", - "nodeType": "Identifier", - "overloadedDeclarations": [], - "referencedDeclaration": 59648, - "src": "11093:16:110", - "typeDescriptions": { - "typeIdentifier": "t_struct$_ProvenWithdrawal_$59312_memory_ptr", - "typeString": "struct OptimismPortal.ProvenWithdrawal memory" - } - }, - "id": 59665, - "isConstant": false, - "isLValue": true, - "isPure": false, - "lValueRequested": false, - "memberName": "outputRoot", - "nodeType": "MemberAccess", - "referencedDeclaration": 59307, - "src": "11093:27:110", - "typeDescriptions": { - "typeIdentifier": "t_bytes32", - "typeString": "bytes32" - } - }, - "src": "11026:94:110", - "typeDescriptions": { - "typeIdentifier": "t_bool", - "typeString": "bool" - } - }, - "src": "10975:145:110", - "typeDescriptions": { - "typeIdentifier": "t_bool", - "typeString": "bool" - } - }, - { - "hexValue": "4f7074696d69736d506f7274616c3a207769746864726177616c20686173682068617320616c7265616479206265656e2070726f76656e", - "id": 59668, - "isConstant": false, - "isLValue": false, - "isPure": true, - "kind": "string", - "lValueRequested": false, - "nodeType": "Literal", - "src": "11134:57:110", - "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": 59653, - "name": "require", - "nodeType": "Identifier", - "overloadedDeclarations": [ - -18, - -18 - ], - "referencedDeclaration": -18, - "src": "10954:7:110", - "typeDescriptions": { - "typeIdentifier": "t_function_require_pure$_t_bool_$_t_string_memory_ptr_$returns$__$", - "typeString": "function (bool,string memory) pure" - } - }, - "id": 59669, - "isConstant": false, - "isLValue": false, - "isPure": false, - "kind": "functionCall", - "lValueRequested": false, - "names": [], - "nodeType": "FunctionCall", - "src": "10954:247:110", - "tryCall": false, - "typeDescriptions": { - "typeIdentifier": "t_tuple$__$", - "typeString": "tuple()" - } - }, - "id": 59670, - "nodeType": "ExpressionStatement", - "src": "10954:247:110" - }, - { - "assignments": [ - 59672 - ], - "declarations": [ - { - "constant": false, - "id": 59672, - "mutability": "mutable", - "name": "storageKey", - "nameLocation": "11445:10:110", - "nodeType": "VariableDeclaration", - "scope": 59724, - "src": "11437:18:110", - "stateVariable": false, - "storageLocation": "default", - "typeDescriptions": { - "typeIdentifier": "t_bytes32", - "typeString": "bytes32" - }, - "typeName": { - "id": 59671, - "name": "bytes32", - "nodeType": "ElementaryTypeName", - "src": "11437:7:110", - "typeDescriptions": { - "typeIdentifier": "t_bytes32", - "typeString": "bytes32" - } - }, - "visibility": "internal" - } - ], - "id": 59683, - "initialValue": { - "arguments": [ - { - "arguments": [ - { - "id": 59676, - "name": "withdrawalHash", - "nodeType": "Identifier", - "overloadedDeclarations": [], - "referencedDeclaration": 59640, - "src": "11509:14:110", - "typeDescriptions": { - "typeIdentifier": "t_bytes32", - "typeString": "bytes32" - } - }, - { - "arguments": [ - { - "hexValue": "30", - "id": 59679, - "isConstant": false, - "isLValue": false, - "isPure": true, - "kind": "number", - "lValueRequested": false, - "nodeType": "Literal", - "src": "11549:1:110", - "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": 59678, - "isConstant": false, - "isLValue": false, - "isPure": true, - "lValueRequested": false, - "nodeType": "ElementaryTypeNameExpression", - "src": "11541:7:110", - "typeDescriptions": { - "typeIdentifier": "t_type$_t_uint256_$", - "typeString": "type(uint256)" - }, - "typeName": { - "id": 59677, - "name": "uint256", - "nodeType": "ElementaryTypeName", - "src": "11541:7:110", - "typeDescriptions": {} - } - }, - "id": 59680, - "isConstant": false, - "isLValue": false, - "isPure": true, - "kind": "typeConversion", - "lValueRequested": false, - "names": [], - "nodeType": "FunctionCall", - "src": "11541:10:110", - "tryCall": false, - "typeDescriptions": { - "typeIdentifier": "t_uint256", - "typeString": "uint256" - } - } - ], - "expression": { - "argumentTypes": [ - { - "typeIdentifier": "t_bytes32", - "typeString": "bytes32" - }, - { - "typeIdentifier": "t_uint256", - "typeString": "uint256" - } - ], - "expression": { - "id": 59674, - "name": "abi", - "nodeType": "Identifier", - "overloadedDeclarations": [], - "referencedDeclaration": -1, - "src": "11481:3:110", - "typeDescriptions": { - "typeIdentifier": "t_magic_abi", - "typeString": "abi" - } - }, - "id": 59675, - "isConstant": false, - "isLValue": false, - "isPure": true, - "lValueRequested": false, - "memberName": "encode", - "nodeType": "MemberAccess", - "src": "11481:10:110", - "typeDescriptions": { - "typeIdentifier": "t_function_abiencode_pure$__$returns$_t_bytes_memory_ptr_$", - "typeString": "function () pure returns (bytes memory)" - } - }, - "id": 59681, - "isConstant": false, - "isLValue": false, - "isPure": false, - "kind": "functionCall", - "lValueRequested": false, - "names": [], - "nodeType": "FunctionCall", - "src": "11481:147:110", - "tryCall": false, - "typeDescriptions": { - "typeIdentifier": "t_bytes_memory_ptr", - "typeString": "bytes memory" - } - } - ], - "expression": { - "argumentTypes": [ - { - "typeIdentifier": "t_bytes_memory_ptr", - "typeString": "bytes memory" - } - ], - "id": 59673, - "name": "keccak256", - "nodeType": "Identifier", - "overloadedDeclarations": [], - "referencedDeclaration": -8, - "src": "11458:9:110", - "typeDescriptions": { - "typeIdentifier": "t_function_keccak256_pure$_t_bytes_memory_ptr_$returns$_t_bytes32_$", - "typeString": "function (bytes memory) pure returns (bytes32)" - } - }, - "id": 59682, - "isConstant": false, - "isLValue": false, - "isPure": false, - "kind": "functionCall", - "lValueRequested": false, - "names": [], - "nodeType": "FunctionCall", - "src": "11458:180:110", - "tryCall": false, - "typeDescriptions": { - "typeIdentifier": "t_bytes32", - "typeString": "bytes32" - } - }, - "nodeType": "VariableDeclarationStatement", - "src": "11437:201:110" - }, - { - "expression": { - "arguments": [ - { - "arguments": [ - { - "arguments": [ - { - "id": 59689, - "name": "storageKey", - "nodeType": "Identifier", - "overloadedDeclarations": [], - "referencedDeclaration": 59672, - "src": "12057:10:110", - "typeDescriptions": { - "typeIdentifier": "t_bytes32", - "typeString": "bytes32" - } - } - ], - "expression": { - "argumentTypes": [ - { - "typeIdentifier": "t_bytes32", - "typeString": "bytes32" - } - ], - "expression": { - "id": 59687, - "name": "abi", - "nodeType": "Identifier", - "overloadedDeclarations": [], - "referencedDeclaration": -1, - "src": "12046:3:110", - "typeDescriptions": { - "typeIdentifier": "t_magic_abi", - "typeString": "abi" - } - }, - "id": 59688, - "isConstant": false, - "isLValue": false, - "isPure": true, - "lValueRequested": false, - "memberName": "encode", - "nodeType": "MemberAccess", - "src": "12046:10:110", - "typeDescriptions": { - "typeIdentifier": "t_function_abiencode_pure$__$returns$_t_bytes_memory_ptr_$", - "typeString": "function () pure returns (bytes memory)" - } - }, - "id": 59690, - "isConstant": false, - "isLValue": false, - "isPure": false, - "kind": "functionCall", - "lValueRequested": false, - "names": [], - "nodeType": "FunctionCall", - "src": "12046:22:110", - "tryCall": false, - "typeDescriptions": { - "typeIdentifier": "t_bytes_memory_ptr", - "typeString": "bytes memory" - } - }, - { - "hexValue": "01", - "id": 59691, - "isConstant": false, - "isLValue": false, - "isPure": true, - "kind": "hexString", - "lValueRequested": false, - "nodeType": "Literal", - "src": "12070:7:110", - "typeDescriptions": { - "typeIdentifier": "t_stringliteral_5fe7f977e71dba2ea1a68e21057beebb9be2ac30c6410aa38d4f3fbe41dcffd2", - "typeString": "literal_string hex\"01\"" - }, - "value": "\u0001" - }, - { - "id": 59692, - "name": "_withdrawalProof", - "nodeType": "Identifier", - "overloadedDeclarations": [], - "referencedDeclaration": 59605, - "src": "12079:16:110", - "typeDescriptions": { - "typeIdentifier": "t_array$_t_bytes_calldata_ptr_$dyn_calldata_ptr", - "typeString": "bytes calldata[] calldata" - } - }, - { - "expression": { - "id": 59693, - "name": "_outputRootProof", - "nodeType": "Identifier", - "overloadedDeclarations": [], - "referencedDeclaration": 59602, - "src": "12097:16:110", - "typeDescriptions": { - "typeIdentifier": "t_struct$_OutputRootProof_$70562_calldata_ptr", - "typeString": "struct Types.OutputRootProof calldata" - } - }, - "id": 59694, - "isConstant": false, - "isLValue": false, - "isPure": false, - "lValueRequested": false, - "memberName": "messagePasserStorageRoot", - "nodeType": "MemberAccess", - "referencedDeclaration": 70559, - "src": "12097:41:110", - "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": 59685, - "name": "SecureMerkleTrie", - "nodeType": "Identifier", - "overloadedDeclarations": [], - "referencedDeclaration": 72279, - "src": "11991:16:110", - "typeDescriptions": { - "typeIdentifier": "t_type$_t_contract$_SecureMerkleTrie_$72279_$", - "typeString": "type(library SecureMerkleTrie)" - } - }, - "id": 59686, - "isConstant": false, - "isLValue": false, - "isPure": false, - "lValueRequested": false, - "memberName": "verifyInclusionProof", - "nodeType": "MemberAccess", - "referencedDeclaration": 72231, - "src": "11991:37:110", - "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": 59695, - "isConstant": false, - "isLValue": false, - "isPure": false, - "kind": "functionCall", - "lValueRequested": false, - "names": [], - "nodeType": "FunctionCall", - "src": "11991:161:110", - "tryCall": false, - "typeDescriptions": { - "typeIdentifier": "t_bool", - "typeString": "bool" - } - }, - { - "hexValue": "4f7074696d69736d506f7274616c3a20696e76616c6964207769746864726177616c20696e636c7573696f6e2070726f6f66", - "id": 59696, - "isConstant": false, - "isLValue": false, - "isPure": true, - "kind": "string", - "lValueRequested": false, - "nodeType": "Literal", - "src": "12166:52:110", - "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": 59684, - "name": "require", - "nodeType": "Identifier", - "overloadedDeclarations": [ - -18, - -18 - ], - "referencedDeclaration": -18, - "src": "11970:7:110", - "typeDescriptions": { - "typeIdentifier": "t_function_require_pure$_t_bool_$_t_string_memory_ptr_$returns$__$", - "typeString": "function (bool,string memory) pure" - } - }, - "id": 59697, - "isConstant": false, - "isLValue": false, - "isPure": false, - "kind": "functionCall", - "lValueRequested": false, - "names": [], - "nodeType": "FunctionCall", - "src": "11970:258:110", - "tryCall": false, - "typeDescriptions": { - "typeIdentifier": "t_tuple$__$", - "typeString": "tuple()" - } - }, - "id": 59698, - "nodeType": "ExpressionStatement", - "src": "11970:258:110" - }, - { - "expression": { - "id": 59714, - "isConstant": false, - "isLValue": false, - "isPure": false, - "lValueRequested": false, - "leftHandSide": { - "baseExpression": { - "id": 59699, - "name": "provenWithdrawals", - "nodeType": "Identifier", - "overloadedDeclarations": [], - "referencedDeclaration": 59334, - "src": "12510:17:110", - "typeDescriptions": { - "typeIdentifier": "t_mapping$_t_bytes32_$_t_struct$_ProvenWithdrawal_$59312_storage_$", - "typeString": "mapping(bytes32 => struct OptimismPortal.ProvenWithdrawal storage ref)" - } - }, - "id": 59701, - "indexExpression": { - "id": 59700, - "name": "withdrawalHash", - "nodeType": "Identifier", - "overloadedDeclarations": [], - "referencedDeclaration": 59640, - "src": "12528:14:110", - "typeDescriptions": { - "typeIdentifier": "t_bytes32", - "typeString": "bytes32" - } - }, - "isConstant": false, - "isLValue": true, - "isPure": false, - "lValueRequested": true, - "nodeType": "IndexAccess", - "src": "12510:33:110", - "typeDescriptions": { - "typeIdentifier": "t_struct$_ProvenWithdrawal_$59312_storage", - "typeString": "struct OptimismPortal.ProvenWithdrawal storage ref" - } - }, - "nodeType": "Assignment", - "operator": "=", - "rightHandSide": { - "arguments": [ - { - "id": 59703, - "name": "outputRoot", - "nodeType": "Identifier", - "overloadedDeclarations": [], - "referencedDeclaration": 59622, - "src": "12589:10:110", - "typeDescriptions": { - "typeIdentifier": "t_bytes32", - "typeString": "bytes32" - } - }, - { - "arguments": [ - { - "expression": { - "id": 59706, - "name": "block", - "nodeType": "Identifier", - "overloadedDeclarations": [], - "referencedDeclaration": -4, - "src": "12632:5:110", - "typeDescriptions": { - "typeIdentifier": "t_magic_block", - "typeString": "block" - } - }, - "id": 59707, - "isConstant": false, - "isLValue": false, - "isPure": false, - "lValueRequested": false, - "memberName": "timestamp", - "nodeType": "MemberAccess", - "src": "12632:15:110", - "typeDescriptions": { - "typeIdentifier": "t_uint256", - "typeString": "uint256" - } - } - ], - "expression": { - "argumentTypes": [ - { - "typeIdentifier": "t_uint256", - "typeString": "uint256" - } - ], - "id": 59705, - "isConstant": false, - "isLValue": false, - "isPure": true, - "lValueRequested": false, - "nodeType": "ElementaryTypeNameExpression", - "src": "12624:7:110", - "typeDescriptions": { - "typeIdentifier": "t_type$_t_uint128_$", - "typeString": "type(uint128)" - }, - "typeName": { - "id": 59704, - "name": "uint128", - "nodeType": "ElementaryTypeName", - "src": "12624:7:110", - "typeDescriptions": {} - } - }, - "id": 59708, - "isConstant": false, - "isLValue": false, - "isPure": false, - "kind": "typeConversion", - "lValueRequested": false, - "names": [], - "nodeType": "FunctionCall", - "src": "12624:24:110", - "tryCall": false, - "typeDescriptions": { - "typeIdentifier": "t_uint128", - "typeString": "uint128" - } - }, - { - "arguments": [ - { - "id": 59711, - "name": "_l2OutputIndex", - "nodeType": "Identifier", - "overloadedDeclarations": [], - "referencedDeclaration": 59599, - "src": "12685:14:110", - "typeDescriptions": { - "typeIdentifier": "t_uint256", - "typeString": "uint256" - } - } - ], - "expression": { - "argumentTypes": [ - { - "typeIdentifier": "t_uint256", - "typeString": "uint256" - } - ], - "id": 59710, - "isConstant": false, - "isLValue": false, - "isPure": true, - "lValueRequested": false, - "nodeType": "ElementaryTypeNameExpression", - "src": "12677:7:110", - "typeDescriptions": { - "typeIdentifier": "t_type$_t_uint128_$", - "typeString": "type(uint128)" - }, - "typeName": { - "id": 59709, - "name": "uint128", - "nodeType": "ElementaryTypeName", - "src": "12677:7:110", - "typeDescriptions": {} - } - }, - "id": 59712, - "isConstant": false, - "isLValue": false, - "isPure": false, - "kind": "typeConversion", - "lValueRequested": false, - "names": [], - "nodeType": "FunctionCall", - "src": "12677:23:110", - "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": 59702, - "name": "ProvenWithdrawal", - "nodeType": "Identifier", - "overloadedDeclarations": [], - "referencedDeclaration": 59312, - "src": "12546:16:110", - "typeDescriptions": { - "typeIdentifier": "t_type$_t_struct$_ProvenWithdrawal_$59312_storage_ptr_$", - "typeString": "type(struct OptimismPortal.ProvenWithdrawal storage pointer)" - } - }, - "id": 59713, - "isConstant": false, - "isLValue": false, - "isPure": false, - "kind": "structConstructorCall", - "lValueRequested": false, - "names": [ - "outputRoot", - "timestamp", - "l2OutputIndex" - ], - "nodeType": "FunctionCall", - "src": "12546:165:110", - "tryCall": false, - "typeDescriptions": { - "typeIdentifier": "t_struct$_ProvenWithdrawal_$59312_memory_ptr", - "typeString": "struct OptimismPortal.ProvenWithdrawal memory" - } - }, - "src": "12510:201:110", - "typeDescriptions": { - "typeIdentifier": "t_struct$_ProvenWithdrawal_$59312_storage", - "typeString": "struct OptimismPortal.ProvenWithdrawal storage ref" - } - }, - "id": 59715, - "nodeType": "ExpressionStatement", - "src": "12510:201:110" - }, - { - "eventCall": { - "arguments": [ - { - "id": 59717, - "name": "withdrawalHash", - "nodeType": "Identifier", - "overloadedDeclarations": [], - "referencedDeclaration": 59640, - "src": "12788:14:110", - "typeDescriptions": { - "typeIdentifier": "t_bytes32", - "typeString": "bytes32" - } - }, - { - "expression": { - "id": 59718, - "name": "_tx", - "nodeType": "Identifier", - "overloadedDeclarations": [], - "referencedDeclaration": 59597, - "src": "12804:3:110", - "typeDescriptions": { - "typeIdentifier": "t_struct$_WithdrawalTransaction_$70594_memory_ptr", - "typeString": "struct Types.WithdrawalTransaction memory" - } - }, - "id": 59719, - "isConstant": false, - "isLValue": true, - "isPure": false, - "lValueRequested": false, - "memberName": "sender", - "nodeType": "MemberAccess", - "referencedDeclaration": 70585, - "src": "12804:10:110", - "typeDescriptions": { - "typeIdentifier": "t_address", - "typeString": "address" - } - }, - { - "expression": { - "id": 59720, - "name": "_tx", - "nodeType": "Identifier", - "overloadedDeclarations": [], - "referencedDeclaration": 59597, - "src": "12816:3:110", - "typeDescriptions": { - "typeIdentifier": "t_struct$_WithdrawalTransaction_$70594_memory_ptr", - "typeString": "struct Types.WithdrawalTransaction memory" - } - }, - "id": 59721, - "isConstant": false, - "isLValue": true, - "isPure": false, - "lValueRequested": false, - "memberName": "target", - "nodeType": "MemberAccess", - "referencedDeclaration": 70587, - "src": "12816:10:110", - "typeDescriptions": { - "typeIdentifier": "t_address", - "typeString": "address" - } - } - ], - "expression": { - "argumentTypes": [ - { - "typeIdentifier": "t_bytes32", - "typeString": "bytes32" - }, - { - "typeIdentifier": "t_address", - "typeString": "address" - }, - { - "typeIdentifier": "t_address", - "typeString": "address" - } - ], - "id": 59716, - "name": "WithdrawalProven", - "nodeType": "Identifier", - "overloadedDeclarations": [], - "referencedDeclaration": 59368, - "src": "12771:16:110", - "typeDescriptions": { - "typeIdentifier": "t_function_event_nonpayable$_t_bytes32_$_t_address_$_t_address_$returns$__$", - "typeString": "function (bytes32,address,address)" - } - }, - "id": 59722, - "isConstant": false, - "isLValue": false, - "isPure": false, - "kind": "functionCall", - "lValueRequested": false, - "names": [], - "nodeType": "FunctionCall", - "src": "12771:56:110", - "tryCall": false, - "typeDescriptions": { - "typeIdentifier": "t_tuple$__$", - "typeString": "tuple()" - } - }, - "id": 59723, - "nodeType": "EmitStatement", - "src": "12766:61:110" - } - ] - }, - "documentation": { - "id": 59594, - "nodeType": "StructuredDocumentation", - "src": "8706:377:110", - "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": 59608, - "kind": "modifierInvocation", - "modifierName": { - "id": 59607, - "name": "whenNotPaused", - "nodeType": "IdentifierPath", - "referencedDeclaration": 59397, - "src": "9335:13:110" - }, - "nodeType": "ModifierInvocation", - "src": "9335:13:110" - } - ], - "name": "proveWithdrawalTransaction", - "nameLocation": "9097:26:110", - "parameters": { - "id": 59606, - "nodeType": "ParameterList", - "parameters": [ - { - "constant": false, - "id": 59597, - "mutability": "mutable", - "name": "_tx", - "nameLocation": "9168:3:110", - "nodeType": "VariableDeclaration", - "scope": 59725, - "src": "9133:38:110", - "stateVariable": false, - "storageLocation": "memory", - "typeDescriptions": { - "typeIdentifier": "t_struct$_WithdrawalTransaction_$70594_memory_ptr", - "typeString": "struct Types.WithdrawalTransaction" - }, - "typeName": { - "id": 59596, - "nodeType": "UserDefinedTypeName", - "pathNode": { - "id": 59595, - "name": "Types.WithdrawalTransaction", - "nodeType": "IdentifierPath", - "referencedDeclaration": 70594, - "src": "9133:27:110" - }, - "referencedDeclaration": 70594, - "src": "9133:27:110", - "typeDescriptions": { - "typeIdentifier": "t_struct$_WithdrawalTransaction_$70594_storage_ptr", - "typeString": "struct Types.WithdrawalTransaction" - } - }, - "visibility": "internal" - }, - { - "constant": false, - "id": 59599, - "mutability": "mutable", - "name": "_l2OutputIndex", - "nameLocation": "9189:14:110", - "nodeType": "VariableDeclaration", - "scope": 59725, - "src": "9181:22:110", - "stateVariable": false, - "storageLocation": "default", - "typeDescriptions": { - "typeIdentifier": "t_uint256", - "typeString": "uint256" - }, - "typeName": { - "id": 59598, - "name": "uint256", - "nodeType": "ElementaryTypeName", - "src": "9181:7:110", - "typeDescriptions": { - "typeIdentifier": "t_uint256", - "typeString": "uint256" - } - }, - "visibility": "internal" - }, - { - "constant": false, - "id": 59602, - "mutability": "mutable", - "name": "_outputRootProof", - "nameLocation": "9244:16:110", - "nodeType": "VariableDeclaration", - "scope": 59725, - "src": "9213:47:110", - "stateVariable": false, - "storageLocation": "calldata", - "typeDescriptions": { - "typeIdentifier": "t_struct$_OutputRootProof_$70562_calldata_ptr", - "typeString": "struct Types.OutputRootProof" - }, - "typeName": { - "id": 59601, - "nodeType": "UserDefinedTypeName", - "pathNode": { - "id": 59600, - "name": "Types.OutputRootProof", - "nodeType": "IdentifierPath", - "referencedDeclaration": 70562, - "src": "9213:21:110" - }, - "referencedDeclaration": 70562, - "src": "9213:21:110", - "typeDescriptions": { - "typeIdentifier": "t_struct$_OutputRootProof_$70562_storage_ptr", - "typeString": "struct Types.OutputRootProof" - } - }, - "visibility": "internal" - }, - { - "constant": false, - "id": 59605, - "mutability": "mutable", - "name": "_withdrawalProof", - "nameLocation": "9287:16:110", - "nodeType": "VariableDeclaration", - "scope": 59725, - "src": "9270:33:110", - "stateVariable": false, - "storageLocation": "calldata", - "typeDescriptions": { - "typeIdentifier": "t_array$_t_bytes_calldata_ptr_$dyn_calldata_ptr", - "typeString": "bytes[]" - }, - "typeName": { - "baseType": { - "id": 59603, - "name": "bytes", - "nodeType": "ElementaryTypeName", - "src": "9270:5:110", - "typeDescriptions": { - "typeIdentifier": "t_bytes_storage_ptr", - "typeString": "bytes" - } - }, - "id": 59604, - "nodeType": "ArrayTypeName", - "src": "9270:7:110", - "typeDescriptions": { - "typeIdentifier": "t_array$_t_bytes_storage_$dyn_storage_ptr", - "typeString": "bytes[]" - } - }, - "visibility": "internal" - } - ], - "src": "9123:186:110" - }, - "returnParameters": { - "id": 59609, - "nodeType": "ParameterList", - "parameters": [], - "src": "9353:0:110" - }, - "scope": 59997, - "stateMutability": "nonpayable", - "virtual": false, - "visibility": "external" - }, - { - "id": 59870, - "nodeType": "FunctionDefinition", - "src": "12947:4839:110", - "nodes": [], - "body": { - "id": 59869, - "nodeType": "Block", - "src": "13049:4737:110", - "nodes": [], - "statements": [ - { - "expression": { - "arguments": [ - { - "commonType": { - "typeIdentifier": "t_address", - "typeString": "address" - }, - "id": 59738, - "isConstant": false, - "isLValue": false, - "isPure": false, - "lValueRequested": false, - "leftExpression": { - "id": 59735, - "name": "l2Sender", - "nodeType": "Identifier", - "overloadedDeclarations": [], - "referencedDeclaration": 59323, - "src": "13315:8:110", - "typeDescriptions": { - "typeIdentifier": "t_address", - "typeString": "address" - } - }, - "nodeType": "BinaryOperation", - "operator": "==", - "rightExpression": { - "expression": { - "id": 59736, - "name": "Constants", - "nodeType": "Identifier", - "overloadedDeclarations": [], - "referencedDeclaration": 69571, - "src": "13327:9:110", - "typeDescriptions": { - "typeIdentifier": "t_type$_t_contract$_Constants_$69571_$", - "typeString": "type(library Constants)" - } - }, - "id": 59737, - "isConstant": false, - "isLValue": false, - "isPure": false, - "lValueRequested": false, - "memberName": "DEFAULT_L2_SENDER", - "nodeType": "MemberAccess", - "referencedDeclaration": 69529, - "src": "13327:27:110", - "typeDescriptions": { - "typeIdentifier": "t_address", - "typeString": "address" - } - }, - "src": "13315:39:110", - "typeDescriptions": { - "typeIdentifier": "t_bool", - "typeString": "bool" - } - }, - { - "hexValue": "4f7074696d69736d506f7274616c3a2063616e206f6e6c792074726967676572206f6e65207769746864726177616c20706572207472616e73616374696f6e", - "id": 59739, - "isConstant": false, - "isLValue": false, - "isPure": true, - "kind": "string", - "lValueRequested": false, - "nodeType": "Literal", - "src": "13356:65:110", - "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": 59734, - "name": "require", - "nodeType": "Identifier", - "overloadedDeclarations": [ - -18, - -18 - ], - "referencedDeclaration": -18, - "src": "13294:7:110", - "typeDescriptions": { - "typeIdentifier": "t_function_require_pure$_t_bool_$_t_string_memory_ptr_$returns$__$", - "typeString": "function (bool,string memory) pure" - } - }, - "id": 59740, - "isConstant": false, - "isLValue": false, - "isPure": false, - "kind": "functionCall", - "lValueRequested": false, - "names": [], - "nodeType": "FunctionCall", - "src": "13294:137:110", - "tryCall": false, - "typeDescriptions": { - "typeIdentifier": "t_tuple$__$", - "typeString": "tuple()" - } - }, - "id": 59741, - "nodeType": "ExpressionStatement", - "src": "13294:137:110" - }, - { - "assignments": [ - 59743 - ], - "declarations": [ - { - "constant": false, - "id": 59743, - "mutability": "mutable", - "name": "withdrawalHash", - "nameLocation": "13522:14:110", - "nodeType": "VariableDeclaration", - "scope": 59869, - "src": "13514:22:110", - "stateVariable": false, - "storageLocation": "default", - "typeDescriptions": { - "typeIdentifier": "t_bytes32", - "typeString": "bytes32" - }, - "typeName": { - "id": 59742, - "name": "bytes32", - "nodeType": "ElementaryTypeName", - "src": "13514:7:110", - "typeDescriptions": { - "typeIdentifier": "t_bytes32", - "typeString": "bytes32" - } - }, - "visibility": "internal" - } - ], - "id": 59748, - "initialValue": { - "arguments": [ - { - "id": 59746, - "name": "_tx", - "nodeType": "Identifier", - "overloadedDeclarations": [], - "referencedDeclaration": 59729, - "src": "13562:3:110", - "typeDescriptions": { - "typeIdentifier": "t_struct$_WithdrawalTransaction_$70594_memory_ptr", - "typeString": "struct Types.WithdrawalTransaction memory" - } - } - ], - "expression": { - "argumentTypes": [ - { - "typeIdentifier": "t_struct$_WithdrawalTransaction_$70594_memory_ptr", - "typeString": "struct Types.WithdrawalTransaction memory" - } - ], - "expression": { - "id": 59744, - "name": "Hashing", - "nodeType": "Identifier", - "overloadedDeclarations": [], - "referencedDeclaration": 70279, - "src": "13539:7:110", - "typeDescriptions": { - "typeIdentifier": "t_type$_t_contract$_Hashing_$70279_$", - "typeString": "type(library Hashing)" - } - }, - "id": 59745, - "isConstant": false, - "isLValue": false, - "isPure": false, - "lValueRequested": false, - "memberName": "hashWithdrawal", - "nodeType": "MemberAccess", - "referencedDeclaration": 70254, - "src": "13539:22:110", - "typeDescriptions": { - "typeIdentifier": "t_function_internal_pure$_t_struct$_WithdrawalTransaction_$70594_memory_ptr_$returns$_t_bytes32_$", - "typeString": "function (struct Types.WithdrawalTransaction memory) pure returns (bytes32)" - } - }, - "id": 59747, - "isConstant": false, - "isLValue": false, - "isPure": false, - "kind": "functionCall", - "lValueRequested": false, - "names": [], - "nodeType": "FunctionCall", - "src": "13539:27:110", - "tryCall": false, - "typeDescriptions": { - "typeIdentifier": "t_bytes32", - "typeString": "bytes32" - } - }, - "nodeType": "VariableDeclarationStatement", - "src": "13514:52:110" - }, - { - "assignments": [ - 59751 - ], - "declarations": [ - { - "constant": false, - "id": 59751, - "mutability": "mutable", - "name": "provenWithdrawal", - "nameLocation": "13600:16:110", - "nodeType": "VariableDeclaration", - "scope": 59869, - "src": "13576:40:110", - "stateVariable": false, - "storageLocation": "memory", - "typeDescriptions": { - "typeIdentifier": "t_struct$_ProvenWithdrawal_$59312_memory_ptr", - "typeString": "struct OptimismPortal.ProvenWithdrawal" - }, - "typeName": { - "id": 59750, - "nodeType": "UserDefinedTypeName", - "pathNode": { - "id": 59749, - "name": "ProvenWithdrawal", - "nodeType": "IdentifierPath", - "referencedDeclaration": 59312, - "src": "13576:16:110" - }, - "referencedDeclaration": 59312, - "src": "13576:16:110", - "typeDescriptions": { - "typeIdentifier": "t_struct$_ProvenWithdrawal_$59312_storage_ptr", - "typeString": "struct OptimismPortal.ProvenWithdrawal" - } - }, - "visibility": "internal" - } - ], - "id": 59755, - "initialValue": { - "baseExpression": { - "id": 59752, - "name": "provenWithdrawals", - "nodeType": "Identifier", - "overloadedDeclarations": [], - "referencedDeclaration": 59334, - "src": "13619:17:110", - "typeDescriptions": { - "typeIdentifier": "t_mapping$_t_bytes32_$_t_struct$_ProvenWithdrawal_$59312_storage_$", - "typeString": "mapping(bytes32 => struct OptimismPortal.ProvenWithdrawal storage ref)" - } - }, - "id": 59754, - "indexExpression": { - "id": 59753, - "name": "withdrawalHash", - "nodeType": "Identifier", - "overloadedDeclarations": [], - "referencedDeclaration": 59743, - "src": "13637:14:110", - "typeDescriptions": { - "typeIdentifier": "t_bytes32", - "typeString": "bytes32" - } - }, - "isConstant": false, - "isLValue": true, - "isPure": false, - "lValueRequested": false, - "nodeType": "IndexAccess", - "src": "13619:33:110", - "typeDescriptions": { - "typeIdentifier": "t_struct$_ProvenWithdrawal_$59312_storage", - "typeString": "struct OptimismPortal.ProvenWithdrawal storage ref" - } - }, - "nodeType": "VariableDeclarationStatement", - "src": "13576:76:110" - }, - { - "expression": { - "arguments": [ - { - "commonType": { - "typeIdentifier": "t_uint128", - "typeString": "uint128" - }, - "id": 59760, - "isConstant": false, - "isLValue": false, - "isPure": false, - "lValueRequested": false, - "leftExpression": { - "expression": { - "id": 59757, - "name": "provenWithdrawal", - "nodeType": "Identifier", - "overloadedDeclarations": [], - "referencedDeclaration": 59751, - "src": "13902:16:110", - "typeDescriptions": { - "typeIdentifier": "t_struct$_ProvenWithdrawal_$59312_memory_ptr", - "typeString": "struct OptimismPortal.ProvenWithdrawal memory" - } - }, - "id": 59758, - "isConstant": false, - "isLValue": true, - "isPure": false, - "lValueRequested": false, - "memberName": "timestamp", - "nodeType": "MemberAccess", - "referencedDeclaration": 59309, - "src": "13902:26:110", - "typeDescriptions": { - "typeIdentifier": "t_uint128", - "typeString": "uint128" - } - }, - "nodeType": "BinaryOperation", - "operator": "!=", - "rightExpression": { - "hexValue": "30", - "id": 59759, - "isConstant": false, - "isLValue": false, - "isPure": true, - "kind": "number", - "lValueRequested": false, - "nodeType": "Literal", - "src": "13932:1:110", - "typeDescriptions": { - "typeIdentifier": "t_rational_0_by_1", - "typeString": "int_const 0" - }, - "value": "0" - }, - "src": "13902:31:110", - "typeDescriptions": { - "typeIdentifier": "t_bool", - "typeString": "bool" - } - }, - { - "hexValue": "4f7074696d69736d506f7274616c3a207769746864726177616c20686173206e6f74206265656e2070726f76656e20796574", - "id": 59761, - "isConstant": false, - "isLValue": false, - "isPure": true, - "kind": "string", - "lValueRequested": false, - "nodeType": "Literal", - "src": "13935:52:110", - "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": 59756, - "name": "require", - "nodeType": "Identifier", - "overloadedDeclarations": [ - -18, - -18 - ], - "referencedDeclaration": -18, - "src": "13894:7:110", - "typeDescriptions": { - "typeIdentifier": "t_function_require_pure$_t_bool_$_t_string_memory_ptr_$returns$__$", - "typeString": "function (bool,string memory) pure" - } - }, - "id": 59762, - "isConstant": false, - "isLValue": false, - "isPure": false, - "kind": "functionCall", - "lValueRequested": false, - "names": [], - "nodeType": "FunctionCall", - "src": "13894:94:110", - "tryCall": false, - "typeDescriptions": { - "typeIdentifier": "t_tuple$__$", - "typeString": "tuple()" - } - }, - "id": 59763, - "nodeType": "ExpressionStatement", - "src": "13894:94:110" - }, - { - "expression": { - "arguments": [ - { - "commonType": { - "typeIdentifier": "t_uint256", - "typeString": "uint256" - }, - "id": 59770, - "isConstant": false, - "isLValue": false, - "isPure": false, - "lValueRequested": false, - "leftExpression": { - "expression": { - "id": 59765, - "name": "provenWithdrawal", - "nodeType": "Identifier", - "overloadedDeclarations": [], - "referencedDeclaration": 59751, - "src": "14275:16:110", - "typeDescriptions": { - "typeIdentifier": "t_struct$_ProvenWithdrawal_$59312_memory_ptr", - "typeString": "struct OptimismPortal.ProvenWithdrawal memory" - } - }, - "id": 59766, - "isConstant": false, - "isLValue": true, - "isPure": false, - "lValueRequested": false, - "memberName": "timestamp", - "nodeType": "MemberAccess", - "referencedDeclaration": 59309, - "src": "14275:26:110", - "typeDescriptions": { - "typeIdentifier": "t_uint128", - "typeString": "uint128" - } - }, - "nodeType": "BinaryOperation", - "operator": ">=", - "rightExpression": { - "arguments": [], - "expression": { - "argumentTypes": [], - "expression": { - "id": 59767, - "name": "l2Oracle", - "nodeType": "Identifier", - "overloadedDeclarations": [], - "referencedDeclaration": 59341, - "src": "14305:8:110", - "typeDescriptions": { - "typeIdentifier": "t_contract$_L2OutputOracle_$59272", - "typeString": "contract L2OutputOracle" - } - }, - "id": 59768, - "isConstant": false, - "isLValue": false, - "isPure": false, - "lValueRequested": false, - "memberName": "startingTimestamp", - "nodeType": "MemberAccess", - "referencedDeclaration": 58789, - "src": "14305:26:110", - "typeDescriptions": { - "typeIdentifier": "t_function_external_view$__$returns$_t_uint256_$", - "typeString": "function () view external returns (uint256)" - } - }, - "id": 59769, - "isConstant": false, - "isLValue": false, - "isPure": false, - "kind": "functionCall", - "lValueRequested": false, - "names": [], - "nodeType": "FunctionCall", - "src": "14305:28:110", - "tryCall": false, - "typeDescriptions": { - "typeIdentifier": "t_uint256", - "typeString": "uint256" - } - }, - "src": "14275:58:110", - "typeDescriptions": { - "typeIdentifier": "t_bool", - "typeString": "bool" - } - }, - { - "hexValue": "4f7074696d69736d506f7274616c3a207769746864726177616c2074696d657374616d70206c657373207468616e204c32204f7261636c65207374617274696e672074696d657374616d70", - "id": 59771, - "isConstant": false, - "isLValue": false, - "isPure": true, - "kind": "string", - "lValueRequested": false, - "nodeType": "Literal", - "src": "14347:77:110", - "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": 59764, - "name": "require", - "nodeType": "Identifier", - "overloadedDeclarations": [ - -18, - -18 - ], - "referencedDeclaration": -18, - "src": "14254:7:110", - "typeDescriptions": { - "typeIdentifier": "t_function_require_pure$_t_bool_$_t_string_memory_ptr_$returns$__$", - "typeString": "function (bool,string memory) pure" - } - }, - "id": 59772, - "isConstant": false, - "isLValue": false, - "isPure": false, - "kind": "functionCall", - "lValueRequested": false, - "names": [], - "nodeType": "FunctionCall", - "src": "14254:180:110", - "tryCall": false, - "typeDescriptions": { - "typeIdentifier": "t_tuple$__$", - "typeString": "tuple()" - } - }, - "id": 59773, - "nodeType": "ExpressionStatement", - "src": "14254:180:110" - }, - { - "expression": { - "arguments": [ - { - "arguments": [ - { - "expression": { - "id": 59776, - "name": "provenWithdrawal", - "nodeType": "Identifier", - "overloadedDeclarations": [], - "referencedDeclaration": 59751, - "src": "14853:16:110", - "typeDescriptions": { - "typeIdentifier": "t_struct$_ProvenWithdrawal_$59312_memory_ptr", - "typeString": "struct OptimismPortal.ProvenWithdrawal memory" - } - }, - "id": 59777, - "isConstant": false, - "isLValue": true, - "isPure": false, - "lValueRequested": false, - "memberName": "timestamp", - "nodeType": "MemberAccess", - "referencedDeclaration": 59309, - "src": "14853:26:110", - "typeDescriptions": { - "typeIdentifier": "t_uint128", - "typeString": "uint128" - } - } - ], - "expression": { - "argumentTypes": [ - { - "typeIdentifier": "t_uint128", - "typeString": "uint128" - } - ], - "id": 59775, - "name": "_isFinalizationPeriodElapsed", - "nodeType": "Identifier", - "overloadedDeclarations": [], - "referencedDeclaration": 59996, - "src": "14824:28:110", - "typeDescriptions": { - "typeIdentifier": "t_function_internal_view$_t_uint256_$returns$_t_bool_$", - "typeString": "function (uint256) view returns (bool)" - } - }, - "id": 59778, - "isConstant": false, - "isLValue": false, - "isPure": false, - "kind": "functionCall", - "lValueRequested": false, - "names": [], - "nodeType": "FunctionCall", - "src": "14824:56:110", - "tryCall": false, - "typeDescriptions": { - "typeIdentifier": "t_bool", - "typeString": "bool" - } - }, - { - "hexValue": "4f7074696d69736d506f7274616c3a2070726f76656e207769746864726177616c2066696e616c697a6174696f6e20706572696f6420686173206e6f7420656c6170736564", - "id": 59779, - "isConstant": false, - "isLValue": false, - "isPure": true, - "kind": "string", - "lValueRequested": false, - "nodeType": "Literal", - "src": "14894:71:110", - "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": 59774, - "name": "require", - "nodeType": "Identifier", - "overloadedDeclarations": [ - -18, - -18 - ], - "referencedDeclaration": -18, - "src": "14803:7:110", - "typeDescriptions": { - "typeIdentifier": "t_function_require_pure$_t_bool_$_t_string_memory_ptr_$returns$__$", - "typeString": "function (bool,string memory) pure" - } - }, - "id": 59780, - "isConstant": false, - "isLValue": false, - "isPure": false, - "kind": "functionCall", - "lValueRequested": false, - "names": [], - "nodeType": "FunctionCall", - "src": "14803:172:110", - "tryCall": false, - "typeDescriptions": { - "typeIdentifier": "t_tuple$__$", - "typeString": "tuple()" - } - }, - "id": 59781, - "nodeType": "ExpressionStatement", - "src": "14803:172:110" - }, - { - "assignments": [ - 59786 - ], - "declarations": [ - { - "constant": false, - "id": 59786, - "mutability": "mutable", - "name": "proposal", - "nameLocation": "15174:8:110", - "nodeType": "VariableDeclaration", - "scope": 59869, - "src": "15146:36:110", - "stateVariable": false, - "storageLocation": "memory", - "typeDescriptions": { - "typeIdentifier": "t_struct$_OutputProposal_$70553_memory_ptr", - "typeString": "struct Types.OutputProposal" - }, - "typeName": { - "id": 59785, - "nodeType": "UserDefinedTypeName", - "pathNode": { - "id": 59784, - "name": "Types.OutputProposal", - "nodeType": "IdentifierPath", - "referencedDeclaration": 70553, - "src": "15146:20:110" - }, - "referencedDeclaration": 70553, - "src": "15146:20:110", - "typeDescriptions": { - "typeIdentifier": "t_struct$_OutputProposal_$70553_storage_ptr", - "typeString": "struct Types.OutputProposal" - } - }, - "visibility": "internal" - } - ], - "id": 59792, - "initialValue": { - "arguments": [ - { - "expression": { - "id": 59789, - "name": "provenWithdrawal", - "nodeType": "Identifier", - "overloadedDeclarations": [], - "referencedDeclaration": 59751, - "src": "15206:16:110", - "typeDescriptions": { - "typeIdentifier": "t_struct$_ProvenWithdrawal_$59312_memory_ptr", - "typeString": "struct OptimismPortal.ProvenWithdrawal memory" - } - }, - "id": 59790, - "isConstant": false, - "isLValue": true, - "isPure": false, - "lValueRequested": false, - "memberName": "l2OutputIndex", - "nodeType": "MemberAccess", - "referencedDeclaration": 59311, - "src": "15206:30:110", - "typeDescriptions": { - "typeIdentifier": "t_uint128", - "typeString": "uint128" - } - } - ], - "expression": { - "argumentTypes": [ - { - "typeIdentifier": "t_uint128", - "typeString": "uint128" - } - ], - "expression": { - "id": 59787, - "name": "l2Oracle", - "nodeType": "Identifier", - "overloadedDeclarations": [], - "referencedDeclaration": 59341, - "src": "15185:8:110", - "typeDescriptions": { - "typeIdentifier": "t_contract$_L2OutputOracle_$59272", - "typeString": "contract L2OutputOracle" - } - }, - "id": 59788, - "isConstant": false, - "isLValue": false, - "isPure": false, - "lValueRequested": false, - "memberName": "getL2Output", - "nodeType": "MemberAccess", - "referencedDeclaration": 59112, - "src": "15185:20:110", - "typeDescriptions": { - "typeIdentifier": "t_function_external_view$_t_uint256_$returns$_t_struct$_OutputProposal_$70553_memory_ptr_$", - "typeString": "function (uint256) view external returns (struct Types.OutputProposal memory)" - } - }, - "id": 59791, - "isConstant": false, - "isLValue": false, - "isPure": false, - "kind": "functionCall", - "lValueRequested": false, - "names": [], - "nodeType": "FunctionCall", - "src": "15185:52:110", - "tryCall": false, - "typeDescriptions": { - "typeIdentifier": "t_struct$_OutputProposal_$70553_memory_ptr", - "typeString": "struct Types.OutputProposal memory" - } - }, - "nodeType": "VariableDeclarationStatement", - "src": "15146:91:110" - }, - { - "expression": { - "arguments": [ - { - "commonType": { - "typeIdentifier": "t_bytes32", - "typeString": "bytes32" - }, - "id": 59798, - "isConstant": false, - "isLValue": false, - "isPure": false, - "lValueRequested": false, - "leftExpression": { - "expression": { - "id": 59794, - "name": "proposal", - "nodeType": "Identifier", - "overloadedDeclarations": [], - "referencedDeclaration": 59786, - "src": "15525:8:110", - "typeDescriptions": { - "typeIdentifier": "t_struct$_OutputProposal_$70553_memory_ptr", - "typeString": "struct Types.OutputProposal memory" - } - }, - "id": 59795, - "isConstant": false, - "isLValue": true, - "isPure": false, - "lValueRequested": false, - "memberName": "outputRoot", - "nodeType": "MemberAccess", - "referencedDeclaration": 70548, - "src": "15525:19:110", - "typeDescriptions": { - "typeIdentifier": "t_bytes32", - "typeString": "bytes32" - } - }, - "nodeType": "BinaryOperation", - "operator": "==", - "rightExpression": { - "expression": { - "id": 59796, - "name": "provenWithdrawal", - "nodeType": "Identifier", - "overloadedDeclarations": [], - "referencedDeclaration": 59751, - "src": "15548:16:110", - "typeDescriptions": { - "typeIdentifier": "t_struct$_ProvenWithdrawal_$59312_memory_ptr", - "typeString": "struct OptimismPortal.ProvenWithdrawal memory" - } - }, - "id": 59797, - "isConstant": false, - "isLValue": true, - "isPure": false, - "lValueRequested": false, - "memberName": "outputRoot", - "nodeType": "MemberAccess", - "referencedDeclaration": 59307, - "src": "15548:27:110", - "typeDescriptions": { - "typeIdentifier": "t_bytes32", - "typeString": "bytes32" - } - }, - "src": "15525:50:110", - "typeDescriptions": { - "typeIdentifier": "t_bool", - "typeString": "bool" - } - }, - { - "hexValue": "4f7074696d69736d506f7274616c3a206f757470757420726f6f742070726f76656e206973206e6f74207468652073616d652061732063757272656e74206f757470757420726f6f74", - "id": 59799, - "isConstant": false, - "isLValue": false, - "isPure": true, - "kind": "string", - "lValueRequested": false, - "nodeType": "Literal", - "src": "15589:75:110", - "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": 59793, - "name": "require", - "nodeType": "Identifier", - "overloadedDeclarations": [ - -18, - -18 - ], - "referencedDeclaration": -18, - "src": "15504:7:110", - "typeDescriptions": { - "typeIdentifier": "t_function_require_pure$_t_bool_$_t_string_memory_ptr_$returns$__$", - "typeString": "function (bool,string memory) pure" - } - }, - "id": 59800, - "isConstant": false, - "isLValue": false, - "isPure": false, - "kind": "functionCall", - "lValueRequested": false, - "names": [], - "nodeType": "FunctionCall", - "src": "15504:170:110", - "tryCall": false, - "typeDescriptions": { - "typeIdentifier": "t_tuple$__$", - "typeString": "tuple()" - } - }, - "id": 59801, - "nodeType": "ExpressionStatement", - "src": "15504:170:110" - }, - { - "expression": { - "arguments": [ - { - "arguments": [ - { - "expression": { - "id": 59804, - "name": "proposal", - "nodeType": "Identifier", - "overloadedDeclarations": [], - "referencedDeclaration": 59786, - "src": "15802:8:110", - "typeDescriptions": { - "typeIdentifier": "t_struct$_OutputProposal_$70553_memory_ptr", - "typeString": "struct Types.OutputProposal memory" - } - }, - "id": 59805, - "isConstant": false, - "isLValue": true, - "isPure": false, - "lValueRequested": false, - "memberName": "timestamp", - "nodeType": "MemberAccess", - "referencedDeclaration": 70550, - "src": "15802:18:110", - "typeDescriptions": { - "typeIdentifier": "t_uint128", - "typeString": "uint128" - } - } - ], - "expression": { - "argumentTypes": [ - { - "typeIdentifier": "t_uint128", - "typeString": "uint128" - } - ], - "id": 59803, - "name": "_isFinalizationPeriodElapsed", - "nodeType": "Identifier", - "overloadedDeclarations": [], - "referencedDeclaration": 59996, - "src": "15773:28:110", - "typeDescriptions": { - "typeIdentifier": "t_function_internal_view$_t_uint256_$returns$_t_bool_$", - "typeString": "function (uint256) view returns (bool)" - } - }, - "id": 59806, - "isConstant": false, - "isLValue": false, - "isPure": false, - "kind": "functionCall", - "lValueRequested": false, - "names": [], - "nodeType": "FunctionCall", - "src": "15773:48:110", - "tryCall": false, - "typeDescriptions": { - "typeIdentifier": "t_bool", - "typeString": "bool" - } - }, - { - "hexValue": "4f7074696d69736d506f7274616c3a206f75747075742070726f706f73616c2066696e616c697a6174696f6e20706572696f6420686173206e6f7420656c6170736564", - "id": 59807, - "isConstant": false, - "isLValue": false, - "isPure": true, - "kind": "string", - "lValueRequested": false, - "nodeType": "Literal", - "src": "15835:69:110", - "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": 59802, - "name": "require", - "nodeType": "Identifier", - "overloadedDeclarations": [ - -18, - -18 - ], - "referencedDeclaration": -18, - "src": "15752:7:110", - "typeDescriptions": { - "typeIdentifier": "t_function_require_pure$_t_bool_$_t_string_memory_ptr_$returns$__$", - "typeString": "function (bool,string memory) pure" - } - }, - "id": 59808, - "isConstant": false, - "isLValue": false, - "isPure": false, - "kind": "functionCall", - "lValueRequested": false, - "names": [], - "nodeType": "FunctionCall", - "src": "15752:162:110", - "tryCall": false, - "typeDescriptions": { - "typeIdentifier": "t_tuple$__$", - "typeString": "tuple()" - } - }, - "id": 59809, - "nodeType": "ExpressionStatement", - "src": "15752:162:110" - }, - { - "expression": { - "arguments": [ - { - "commonType": { - "typeIdentifier": "t_bool", - "typeString": "bool" - }, - "id": 59815, - "isConstant": false, - "isLValue": false, - "isPure": false, - "lValueRequested": false, - "leftExpression": { - "baseExpression": { - "id": 59811, - "name": "finalizedWithdrawals", - "nodeType": "Identifier", - "overloadedDeclarations": [], - "referencedDeclaration": 59328, - "src": "16030:20:110", - "typeDescriptions": { - "typeIdentifier": "t_mapping$_t_bytes32_$_t_bool_$", - "typeString": "mapping(bytes32 => bool)" - } - }, - "id": 59813, - "indexExpression": { - "id": 59812, - "name": "withdrawalHash", - "nodeType": "Identifier", - "overloadedDeclarations": [], - "referencedDeclaration": 59743, - "src": "16051:14:110", - "typeDescriptions": { - "typeIdentifier": "t_bytes32", - "typeString": "bytes32" - } - }, - "isConstant": false, - "isLValue": true, - "isPure": false, - "lValueRequested": false, - "nodeType": "IndexAccess", - "src": "16030:36:110", - "typeDescriptions": { - "typeIdentifier": "t_bool", - "typeString": "bool" - } - }, - "nodeType": "BinaryOperation", - "operator": "==", - "rightExpression": { - "hexValue": "66616c7365", - "id": 59814, - "isConstant": false, - "isLValue": false, - "isPure": true, - "kind": "bool", - "lValueRequested": false, - "nodeType": "Literal", - "src": "16070:5:110", - "typeDescriptions": { - "typeIdentifier": "t_bool", - "typeString": "bool" - }, - "value": "false" - }, - "src": "16030:45:110", - "typeDescriptions": { - "typeIdentifier": "t_bool", - "typeString": "bool" - } - }, - { - "hexValue": "4f7074696d69736d506f7274616c3a207769746864726177616c2068617320616c7265616479206265656e2066696e616c697a6564", - "id": 59816, - "isConstant": false, - "isLValue": false, - "isPure": true, - "kind": "string", - "lValueRequested": false, - "nodeType": "Literal", - "src": "16077:55:110", - "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": 59810, - "name": "require", - "nodeType": "Identifier", - "overloadedDeclarations": [ - -18, - -18 - ], - "referencedDeclaration": -18, - "src": "16022:7:110", - "typeDescriptions": { - "typeIdentifier": "t_function_require_pure$_t_bool_$_t_string_memory_ptr_$returns$__$", - "typeString": "function (bool,string memory) pure" - } - }, - "id": 59817, - "isConstant": false, - "isLValue": false, - "isPure": false, - "kind": "functionCall", - "lValueRequested": false, - "names": [], - "nodeType": "FunctionCall", - "src": "16022:111:110", - "tryCall": false, - "typeDescriptions": { - "typeIdentifier": "t_tuple$__$", - "typeString": "tuple()" - } - }, - "id": 59818, - "nodeType": "ExpressionStatement", - "src": "16022:111:110" - }, - { - "expression": { - "id": 59823, - "isConstant": false, - "isLValue": false, - "isPure": false, - "lValueRequested": false, - "leftHandSide": { - "baseExpression": { - "id": 59819, - "name": "finalizedWithdrawals", - "nodeType": "Identifier", - "overloadedDeclarations": [], - "referencedDeclaration": 59328, - "src": "16213:20:110", - "typeDescriptions": { - "typeIdentifier": "t_mapping$_t_bytes32_$_t_bool_$", - "typeString": "mapping(bytes32 => bool)" - } - }, - "id": 59821, - "indexExpression": { - "id": 59820, - "name": "withdrawalHash", - "nodeType": "Identifier", - "overloadedDeclarations": [], - "referencedDeclaration": 59743, - "src": "16234:14:110", - "typeDescriptions": { - "typeIdentifier": "t_bytes32", - "typeString": "bytes32" - } - }, - "isConstant": false, - "isLValue": true, - "isPure": false, - "lValueRequested": true, - "nodeType": "IndexAccess", - "src": "16213:36:110", - "typeDescriptions": { - "typeIdentifier": "t_bool", - "typeString": "bool" - } - }, - "nodeType": "Assignment", - "operator": "=", - "rightHandSide": { - "hexValue": "74727565", - "id": 59822, - "isConstant": false, - "isLValue": false, - "isPure": true, - "kind": "bool", - "lValueRequested": false, - "nodeType": "Literal", - "src": "16252:4:110", - "typeDescriptions": { - "typeIdentifier": "t_bool", - "typeString": "bool" - }, - "value": "true" - }, - "src": "16213:43:110", - "typeDescriptions": { - "typeIdentifier": "t_bool", - "typeString": "bool" - } - }, - "id": 59824, - "nodeType": "ExpressionStatement", - "src": "16213:43:110" - }, - { - "expression": { - "id": 59828, - "isConstant": false, - "isLValue": false, - "isPure": false, - "lValueRequested": false, - "leftHandSide": { - "id": 59825, - "name": "l2Sender", - "nodeType": "Identifier", - "overloadedDeclarations": [], - "referencedDeclaration": 59323, - "src": "16350:8:110", - "typeDescriptions": { - "typeIdentifier": "t_address", - "typeString": "address" - } - }, - "nodeType": "Assignment", - "operator": "=", - "rightHandSide": { - "expression": { - "id": 59826, - "name": "_tx", - "nodeType": "Identifier", - "overloadedDeclarations": [], - "referencedDeclaration": 59729, - "src": "16361:3:110", - "typeDescriptions": { - "typeIdentifier": "t_struct$_WithdrawalTransaction_$70594_memory_ptr", - "typeString": "struct Types.WithdrawalTransaction memory" - } - }, - "id": 59827, - "isConstant": false, - "isLValue": true, - "isPure": false, - "lValueRequested": false, - "memberName": "sender", - "nodeType": "MemberAccess", - "referencedDeclaration": 70585, - "src": "16361:10:110", - "typeDescriptions": { - "typeIdentifier": "t_address", - "typeString": "address" - } - }, - "src": "16350:21:110", - "typeDescriptions": { - "typeIdentifier": "t_address", - "typeString": "address" - } - }, - "id": 59829, - "nodeType": "ExpressionStatement", - "src": "16350:21:110" - }, - { - "assignments": [ - 59831 - ], - "declarations": [ - { - "constant": false, - "id": 59831, - "mutability": "mutable", - "name": "success", - "nameLocation": "16996:7:110", - "nodeType": "VariableDeclaration", - "scope": 59869, - "src": "16991:12:110", - "stateVariable": false, - "storageLocation": "default", - "typeDescriptions": { - "typeIdentifier": "t_bool", - "typeString": "bool" - }, - "typeName": { - "id": 59830, - "name": "bool", - "nodeType": "ElementaryTypeName", - "src": "16991:4:110", - "typeDescriptions": { - "typeIdentifier": "t_bool", - "typeString": "bool" - } - }, - "visibility": "internal" - } - ], - "id": 59843, - "initialValue": { - "arguments": [ - { - "expression": { - "id": 59834, - "name": "_tx", - "nodeType": "Identifier", - "overloadedDeclarations": [], - "referencedDeclaration": 59729, - "src": "17030:3:110", - "typeDescriptions": { - "typeIdentifier": "t_struct$_WithdrawalTransaction_$70594_memory_ptr", - "typeString": "struct Types.WithdrawalTransaction memory" - } - }, - "id": 59835, - "isConstant": false, - "isLValue": true, - "isPure": false, - "lValueRequested": false, - "memberName": "target", - "nodeType": "MemberAccess", - "referencedDeclaration": 70587, - "src": "17030:10:110", - "typeDescriptions": { - "typeIdentifier": "t_address", - "typeString": "address" - } - }, - { - "expression": { - "id": 59836, - "name": "_tx", - "nodeType": "Identifier", - "overloadedDeclarations": [], - "referencedDeclaration": 59729, - "src": "17042:3:110", - "typeDescriptions": { - "typeIdentifier": "t_struct$_WithdrawalTransaction_$70594_memory_ptr", - "typeString": "struct Types.WithdrawalTransaction memory" - } - }, - "id": 59837, - "isConstant": false, - "isLValue": true, - "isPure": false, - "lValueRequested": false, - "memberName": "gasLimit", - "nodeType": "MemberAccess", - "referencedDeclaration": 70591, - "src": "17042:12:110", - "typeDescriptions": { - "typeIdentifier": "t_uint256", - "typeString": "uint256" - } - }, - { - "expression": { - "id": 59838, - "name": "_tx", - "nodeType": "Identifier", - "overloadedDeclarations": [], - "referencedDeclaration": 59729, - "src": "17056:3:110", - "typeDescriptions": { - "typeIdentifier": "t_struct$_WithdrawalTransaction_$70594_memory_ptr", - "typeString": "struct Types.WithdrawalTransaction memory" - } - }, - "id": 59839, - "isConstant": false, - "isLValue": true, - "isPure": false, - "lValueRequested": false, - "memberName": "value", - "nodeType": "MemberAccess", - "referencedDeclaration": 70589, - "src": "17056:9:110", - "typeDescriptions": { - "typeIdentifier": "t_uint256", - "typeString": "uint256" - } - }, - { - "expression": { - "id": 59840, - "name": "_tx", - "nodeType": "Identifier", - "overloadedDeclarations": [], - "referencedDeclaration": 59729, - "src": "17067:3:110", - "typeDescriptions": { - "typeIdentifier": "t_struct$_WithdrawalTransaction_$70594_memory_ptr", - "typeString": "struct Types.WithdrawalTransaction memory" - } - }, - "id": 59841, - "isConstant": false, - "isLValue": true, - "isPure": false, - "lValueRequested": false, - "memberName": "data", - "nodeType": "MemberAccess", - "referencedDeclaration": 70593, - "src": "17067:8:110", - "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": 59832, - "name": "SafeCall", - "nodeType": "Identifier", - "overloadedDeclarations": [], - "referencedDeclaration": 70479, - "src": "17006:8:110", - "typeDescriptions": { - "typeIdentifier": "t_type$_t_contract$_SafeCall_$70479_$", - "typeString": "type(library SafeCall)" - } - }, - "id": 59833, - "isConstant": false, - "isLValue": false, - "isPure": false, - "lValueRequested": false, - "memberName": "callWithMinGas", - "nodeType": "MemberAccess", - "referencedDeclaration": 70478, - "src": "17006:23:110", - "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": 59842, - "isConstant": false, - "isLValue": false, - "isPure": false, - "kind": "functionCall", - "lValueRequested": false, - "names": [], - "nodeType": "FunctionCall", - "src": "17006:70:110", - "tryCall": false, - "typeDescriptions": { - "typeIdentifier": "t_bool", - "typeString": "bool" - } - }, - "nodeType": "VariableDeclarationStatement", - "src": "16991:85:110" - }, - { - "expression": { - "id": 59847, - "isConstant": false, - "isLValue": false, - "isPure": false, - "lValueRequested": false, - "leftHandSide": { - "id": 59844, - "name": "l2Sender", - "nodeType": "Identifier", - "overloadedDeclarations": [], - "referencedDeclaration": 59323, - "src": "17144:8:110", - "typeDescriptions": { - "typeIdentifier": "t_address", - "typeString": "address" - } - }, - "nodeType": "Assignment", - "operator": "=", - "rightHandSide": { - "expression": { - "id": 59845, - "name": "Constants", - "nodeType": "Identifier", - "overloadedDeclarations": [], - "referencedDeclaration": 69571, - "src": "17155:9:110", - "typeDescriptions": { - "typeIdentifier": "t_type$_t_contract$_Constants_$69571_$", - "typeString": "type(library Constants)" - } - }, - "id": 59846, - "isConstant": false, - "isLValue": false, - "isPure": false, - "lValueRequested": false, - "memberName": "DEFAULT_L2_SENDER", - "nodeType": "MemberAccess", - "referencedDeclaration": 69529, - "src": "17155:27:110", - "typeDescriptions": { - "typeIdentifier": "t_address", - "typeString": "address" - } - }, - "src": "17144:38:110", - "typeDescriptions": { - "typeIdentifier": "t_address", - "typeString": "address" - } - }, - "id": 59848, - "nodeType": "ExpressionStatement", - "src": "17144:38:110" - }, - { - "eventCall": { - "arguments": [ - { - "id": 59850, - "name": "withdrawalHash", - "nodeType": "Identifier", - "overloadedDeclarations": [], - "referencedDeclaration": 59743, - "src": "17361:14:110", - "typeDescriptions": { - "typeIdentifier": "t_bytes32", - "typeString": "bytes32" - } - }, - { - "id": 59851, - "name": "success", - "nodeType": "Identifier", - "overloadedDeclarations": [], - "referencedDeclaration": 59831, - "src": "17377:7:110", - "typeDescriptions": { - "typeIdentifier": "t_bool", - "typeString": "bool" - } - } - ], - "expression": { - "argumentTypes": [ - { - "typeIdentifier": "t_bytes32", - "typeString": "bytes32" - }, - { - "typeIdentifier": "t_bool", - "typeString": "bool" - } - ], - "id": 59849, - "name": "WithdrawalFinalized", - "nodeType": "Identifier", - "overloadedDeclarations": [], - "referencedDeclaration": 59375, - "src": "17341:19:110", - "typeDescriptions": { - "typeIdentifier": "t_function_event_nonpayable$_t_bytes32_$_t_bool_$returns$__$", - "typeString": "function (bytes32,bool)" - } - }, - "id": 59852, - "isConstant": false, - "isLValue": false, - "isPure": false, - "kind": "functionCall", - "lValueRequested": false, - "names": [], - "nodeType": "FunctionCall", - "src": "17341:44:110", - "tryCall": false, - "typeDescriptions": { - "typeIdentifier": "t_tuple$__$", - "typeString": "tuple()" - } - }, - "id": 59853, - "nodeType": "EmitStatement", - "src": "17336:49:110" - }, - { - "condition": { - "commonType": { - "typeIdentifier": "t_bool", - "typeString": "bool" - }, - "id": 59862, - "isConstant": false, - "isLValue": false, - "isPure": false, - "lValueRequested": false, - "leftExpression": { - "commonType": { - "typeIdentifier": "t_bool", - "typeString": "bool" - }, - "id": 59856, - "isConstant": false, - "isLValue": false, - "isPure": false, - "lValueRequested": false, - "leftExpression": { - "id": 59854, - "name": "success", - "nodeType": "Identifier", - "overloadedDeclarations": [], - "referencedDeclaration": 59831, - "src": "17649:7:110", - "typeDescriptions": { - "typeIdentifier": "t_bool", - "typeString": "bool" - } - }, - "nodeType": "BinaryOperation", - "operator": "==", - "rightExpression": { - "hexValue": "66616c7365", - "id": 59855, - "isConstant": false, - "isLValue": false, - "isPure": true, - "kind": "bool", - "lValueRequested": false, - "nodeType": "Literal", - "src": "17660:5:110", - "typeDescriptions": { - "typeIdentifier": "t_bool", - "typeString": "bool" - }, - "value": "false" - }, - "src": "17649:16:110", - "typeDescriptions": { - "typeIdentifier": "t_bool", - "typeString": "bool" - } - }, - "nodeType": "BinaryOperation", - "operator": "&&", - "rightExpression": { - "commonType": { - "typeIdentifier": "t_address", - "typeString": "address" - }, - "id": 59861, - "isConstant": false, - "isLValue": false, - "isPure": false, - "lValueRequested": false, - "leftExpression": { - "expression": { - "id": 59857, - "name": "tx", - "nodeType": "Identifier", - "overloadedDeclarations": [], - "referencedDeclaration": -26, - "src": "17669:2:110", - "typeDescriptions": { - "typeIdentifier": "t_magic_transaction", - "typeString": "tx" - } - }, - "id": 59858, - "isConstant": false, - "isLValue": false, - "isPure": false, - "lValueRequested": false, - "memberName": "origin", - "nodeType": "MemberAccess", - "src": "17669:9:110", - "typeDescriptions": { - "typeIdentifier": "t_address", - "typeString": "address" - } - }, - "nodeType": "BinaryOperation", - "operator": "==", - "rightExpression": { - "expression": { - "id": 59859, - "name": "Constants", - "nodeType": "Identifier", - "overloadedDeclarations": [], - "referencedDeclaration": 69571, - "src": "17682:9:110", - "typeDescriptions": { - "typeIdentifier": "t_type$_t_contract$_Constants_$69571_$", - "typeString": "type(library Constants)" - } - }, - "id": 59860, - "isConstant": false, - "isLValue": false, - "isPure": false, - "lValueRequested": false, - "memberName": "ESTIMATION_ADDRESS", - "nodeType": "MemberAccess", - "referencedDeclaration": 69525, - "src": "17682:28:110", - "typeDescriptions": { - "typeIdentifier": "t_address", - "typeString": "address" - } - }, - "src": "17669:41:110", - "typeDescriptions": { - "typeIdentifier": "t_bool", - "typeString": "bool" - } - }, - "src": "17649:61:110", - "typeDescriptions": { - "typeIdentifier": "t_bool", - "typeString": "bool" - } - }, - "id": 59868, - "nodeType": "IfStatement", - "src": "17645:135:110", - "trueBody": { - "id": 59867, - "nodeType": "Block", - "src": "17712:68:110", - "statements": [ - { - "expression": { - "arguments": [ - { - "hexValue": "4f7074696d69736d506f7274616c3a207769746864726177616c206661696c6564", - "id": 59864, - "isConstant": false, - "isLValue": false, - "isPure": true, - "kind": "string", - "lValueRequested": false, - "nodeType": "Literal", - "src": "17733:35:110", - "typeDescriptions": { - "typeIdentifier": "t_stringliteral_a0543a16ebb14b11743ebd89913eeb3a89aab6ee2824b60e6e93ee3d5b6c55bb", - "typeString": "literal_string \"OptimismPortal: withdrawal failed\"" - }, - "value": "OptimismPortal: withdrawal failed" - } - ], - "expression": { - "argumentTypes": [ - { - "typeIdentifier": "t_stringliteral_a0543a16ebb14b11743ebd89913eeb3a89aab6ee2824b60e6e93ee3d5b6c55bb", - "typeString": "literal_string \"OptimismPortal: withdrawal failed\"" - } - ], - "id": 59863, - "name": "revert", - "nodeType": "Identifier", - "overloadedDeclarations": [ - -19, - -19 - ], - "referencedDeclaration": -19, - "src": "17726:6:110", - "typeDescriptions": { - "typeIdentifier": "t_function_revert_pure$_t_string_memory_ptr_$returns$__$", - "typeString": "function (string memory) pure" - } - }, - "id": 59865, - "isConstant": false, - "isLValue": false, - "isPure": false, - "kind": "functionCall", - "lValueRequested": false, - "names": [], - "nodeType": "FunctionCall", - "src": "17726:43:110", - "tryCall": false, - "typeDescriptions": { - "typeIdentifier": "t_tuple$__$", - "typeString": "tuple()" - } - }, - "id": 59866, - "nodeType": "ExpressionStatement", - "src": "17726:43:110" - } - ] - } - } - ] - }, - "documentation": { - "id": 59726, - "nodeType": "StructuredDocumentation", - "src": "12840:102:110", - "text": "@notice Finalizes a withdrawal transaction.\n @param _tx Withdrawal transaction to finalize." - }, - "functionSelector": "8c3152e9", - "implemented": true, - "kind": "function", - "modifiers": [ - { - "id": 59732, - "kind": "modifierInvocation", - "modifierName": { - "id": 59731, - "name": "whenNotPaused", - "nodeType": "IdentifierPath", - "referencedDeclaration": 59397, - "src": "13035:13:110" - }, - "nodeType": "ModifierInvocation", - "src": "13035:13:110" - } - ], - "name": "finalizeWithdrawalTransaction", - "nameLocation": "12956:29:110", - "parameters": { - "id": 59730, - "nodeType": "ParameterList", - "parameters": [ - { - "constant": false, - "id": 59729, - "mutability": "mutable", - "name": "_tx", - "nameLocation": "13021:3:110", - "nodeType": "VariableDeclaration", - "scope": 59870, - "src": "12986:38:110", - "stateVariable": false, - "storageLocation": "memory", - "typeDescriptions": { - "typeIdentifier": "t_struct$_WithdrawalTransaction_$70594_memory_ptr", - "typeString": "struct Types.WithdrawalTransaction" - }, - "typeName": { - "id": 59728, - "nodeType": "UserDefinedTypeName", - "pathNode": { - "id": 59727, - "name": "Types.WithdrawalTransaction", - "nodeType": "IdentifierPath", - "referencedDeclaration": 70594, - "src": "12986:27:110" - }, - "referencedDeclaration": 70594, - "src": "12986:27:110", - "typeDescriptions": { - "typeIdentifier": "t_struct$_WithdrawalTransaction_$70594_storage_ptr", - "typeString": "struct Types.WithdrawalTransaction" - } - }, - "visibility": "internal" - } - ], - "src": "12985:40:110" - }, - "returnParameters": { - "id": 59733, - "nodeType": "ParameterList", - "parameters": [], - "src": "13049:0:110" - }, - "scope": 59997, - "stateMutability": "nonpayable", - "virtual": false, - "visibility": "external" - }, - { - "id": 59961, - "nodeType": "FunctionDefinition", - "src": "18516:1971:110", - "nodes": [], - "body": { - "id": 59960, - "nodeType": "Block", - "src": "18737:1750:110", - "nodes": [], - "statements": [ - { - "condition": { - "id": 59887, - "name": "_isCreation", - "nodeType": "Identifier", - "overloadedDeclarations": [], - "referencedDeclaration": 59879, - "src": "18876:11:110", - "typeDescriptions": { - "typeIdentifier": "t_bool", - "typeString": "bool" - } - }, - "id": 59899, - "nodeType": "IfStatement", - "src": "18872:136:110", - "trueBody": { - "id": 59898, - "nodeType": "Block", - "src": "18889:119:110", - "statements": [ - { - "expression": { - "arguments": [ - { - "commonType": { - "typeIdentifier": "t_address", - "typeString": "address" - }, - "id": 59894, - "isConstant": false, - "isLValue": false, - "isPure": false, - "lValueRequested": false, - "leftExpression": { - "id": 59889, - "name": "_to", - "nodeType": "Identifier", - "overloadedDeclarations": [], - "referencedDeclaration": 59873, - "src": "18911:3:110", - "typeDescriptions": { - "typeIdentifier": "t_address", - "typeString": "address" - } - }, - "nodeType": "BinaryOperation", - "operator": "==", - "rightExpression": { - "arguments": [ - { - "hexValue": "30", - "id": 59892, - "isConstant": false, - "isLValue": false, - "isPure": true, - "kind": "number", - "lValueRequested": false, - "nodeType": "Literal", - "src": "18926:1:110", - "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": 59891, - "isConstant": false, - "isLValue": false, - "isPure": true, - "lValueRequested": false, - "nodeType": "ElementaryTypeNameExpression", - "src": "18918:7:110", - "typeDescriptions": { - "typeIdentifier": "t_type$_t_address_$", - "typeString": "type(address)" - }, - "typeName": { - "id": 59890, - "name": "address", - "nodeType": "ElementaryTypeName", - "src": "18918:7:110", - "typeDescriptions": {} - } - }, - "id": 59893, - "isConstant": false, - "isLValue": false, - "isPure": true, - "kind": "typeConversion", - "lValueRequested": false, - "names": [], - "nodeType": "FunctionCall", - "src": "18918:10:110", - "tryCall": false, - "typeDescriptions": { - "typeIdentifier": "t_address", - "typeString": "address" - } - }, - "src": "18911:17:110", - "typeDescriptions": { - "typeIdentifier": "t_bool", - "typeString": "bool" - } - }, - { - "hexValue": "4f7074696d69736d506f7274616c3a206d7573742073656e6420746f2061646472657373283029207768656e206372656174696e67206120636f6e7472616374", - "id": 59895, - "isConstant": false, - "isLValue": false, - "isPure": true, - "kind": "string", - "lValueRequested": false, - "nodeType": "Literal", - "src": "18930:66:110", - "typeDescriptions": { - "typeIdentifier": "t_stringliteral_35a8c36d4f7649c8575025c089af07faab9c54040307e9d6ec8463fe4050a639", - "typeString": "literal_string \"OptimismPortal: must send to address(0) when creating a contract\"" - }, - "value": "OptimismPortal: must send to address(0) when creating a contract" - } - ], - "expression": { - "argumentTypes": [ - { - "typeIdentifier": "t_bool", - "typeString": "bool" - }, - { - "typeIdentifier": "t_stringliteral_35a8c36d4f7649c8575025c089af07faab9c54040307e9d6ec8463fe4050a639", - "typeString": "literal_string \"OptimismPortal: must send to address(0) when creating a contract\"" - } - ], - "id": 59888, - "name": "require", - "nodeType": "Identifier", - "overloadedDeclarations": [ - -18, - -18 - ], - "referencedDeclaration": -18, - "src": "18903:7:110", - "typeDescriptions": { - "typeIdentifier": "t_function_require_pure$_t_bool_$_t_string_memory_ptr_$returns$__$", - "typeString": "function (bool,string memory) pure" - } - }, - "id": 59896, - "isConstant": false, - "isLValue": false, - "isPure": false, - "kind": "functionCall", - "lValueRequested": false, - "names": [], - "nodeType": "FunctionCall", - "src": "18903:94:110", - "tryCall": false, - "typeDescriptions": { - "typeIdentifier": "t_tuple$__$", - "typeString": "tuple()" - } - }, - "id": 59897, - "nodeType": "ExpressionStatement", - "src": "18903:94:110" - } - ] - } - }, - { - "expression": { - "arguments": [ - { - "commonType": { - "typeIdentifier": "t_uint64", - "typeString": "uint64" - }, - "id": 59909, - "isConstant": false, - "isLValue": false, - "isPure": false, - "lValueRequested": false, - "leftExpression": { - "id": 59901, - "name": "_gasLimit", - "nodeType": "Identifier", - "overloadedDeclarations": [], - "referencedDeclaration": 59877, - "src": "19163:9:110", - "typeDescriptions": { - "typeIdentifier": "t_uint64", - "typeString": "uint64" - } - }, - "nodeType": "BinaryOperation", - "operator": ">=", - "rightExpression": { - "arguments": [ - { - "arguments": [ - { - "expression": { - "id": 59905, - "name": "_data", - "nodeType": "Identifier", - "overloadedDeclarations": [], - "referencedDeclaration": 59881, - "src": "19199:5:110", - "typeDescriptions": { - "typeIdentifier": "t_bytes_memory_ptr", - "typeString": "bytes memory" - } - }, - "id": 59906, - "isConstant": false, - "isLValue": false, - "isPure": false, - "lValueRequested": false, - "memberName": "length", - "nodeType": "MemberAccess", - "src": "19199:12:110", - "typeDescriptions": { - "typeIdentifier": "t_uint256", - "typeString": "uint256" - } - } - ], - "expression": { - "argumentTypes": [ - { - "typeIdentifier": "t_uint256", - "typeString": "uint256" - } - ], - "id": 59904, - "isConstant": false, - "isLValue": false, - "isPure": true, - "lValueRequested": false, - "nodeType": "ElementaryTypeNameExpression", - "src": "19192:6:110", - "typeDescriptions": { - "typeIdentifier": "t_type$_t_uint64_$", - "typeString": "type(uint64)" - }, - "typeName": { - "id": 59903, - "name": "uint64", - "nodeType": "ElementaryTypeName", - "src": "19192:6:110", - "typeDescriptions": {} - } - }, - "id": 59907, - "isConstant": false, - "isLValue": false, - "isPure": false, - "kind": "typeConversion", - "lValueRequested": false, - "names": [], - "nodeType": "FunctionCall", - "src": "19192:20:110", - "tryCall": false, - "typeDescriptions": { - "typeIdentifier": "t_uint64", - "typeString": "uint64" - } - } - ], - "expression": { - "argumentTypes": [ - { - "typeIdentifier": "t_uint64", - "typeString": "uint64" - } - ], - "id": 59902, - "name": "minimumGasLimit", - "nodeType": "Identifier", - "overloadedDeclarations": [], - "referencedDeclaration": 59557, - "src": "19176:15:110", - "typeDescriptions": { - "typeIdentifier": "t_function_internal_pure$_t_uint64_$returns$_t_uint64_$", - "typeString": "function (uint64) pure returns (uint64)" - } - }, - "id": 59908, - "isConstant": false, - "isLValue": false, - "isPure": false, - "kind": "functionCall", - "lValueRequested": false, - "names": [], - "nodeType": "FunctionCall", - "src": "19176:37:110", - "tryCall": false, - "typeDescriptions": { - "typeIdentifier": "t_uint64", - "typeString": "uint64" - } - }, - "src": "19163:50:110", - "typeDescriptions": { - "typeIdentifier": "t_bool", - "typeString": "bool" - } - }, - { - "hexValue": "4f7074696d69736d506f7274616c3a20676173206c696d697420746f6f20736d616c6c", - "id": 59910, - "isConstant": false, - "isLValue": false, - "isPure": true, - "kind": "string", - "lValueRequested": false, - "nodeType": "Literal", - "src": "19215:37:110", - "typeDescriptions": { - "typeIdentifier": "t_stringliteral_0a0c886a0c5bbb9f3e1be0cff5d8eb64eb65c2a072ac278a98f80049a2d6c3f8", - "typeString": "literal_string \"OptimismPortal: gas limit too small\"" - }, - "value": "OptimismPortal: gas limit too small" - } - ], - "expression": { - "argumentTypes": [ - { - "typeIdentifier": "t_bool", - "typeString": "bool" - }, - { - "typeIdentifier": "t_stringliteral_0a0c886a0c5bbb9f3e1be0cff5d8eb64eb65c2a072ac278a98f80049a2d6c3f8", - "typeString": "literal_string \"OptimismPortal: gas limit too small\"" - } - ], - "id": 59900, - "name": "require", - "nodeType": "Identifier", - "overloadedDeclarations": [ - -18, - -18 - ], - "referencedDeclaration": -18, - "src": "19155:7:110", - "typeDescriptions": { - "typeIdentifier": "t_function_require_pure$_t_bool_$_t_string_memory_ptr_$returns$__$", - "typeString": "function (bool,string memory) pure" - } - }, - "id": 59911, - "isConstant": false, - "isLValue": false, - "isPure": false, - "kind": "functionCall", - "lValueRequested": false, - "names": [], - "nodeType": "FunctionCall", - "src": "19155:98:110", - "tryCall": false, - "typeDescriptions": { - "typeIdentifier": "t_tuple$__$", - "typeString": "tuple()" - } - }, - "id": 59912, - "nodeType": "ExpressionStatement", - "src": "19155:98:110" - }, - { - "expression": { - "arguments": [ - { - "commonType": { - "typeIdentifier": "t_uint256", - "typeString": "uint256" - }, - "id": 59917, - "isConstant": false, - "isLValue": false, - "isPure": false, - "lValueRequested": false, - "leftExpression": { - "expression": { - "id": 59914, - "name": "_data", - "nodeType": "Identifier", - "overloadedDeclarations": [], - "referencedDeclaration": 59881, - "src": "19632:5:110", - "typeDescriptions": { - "typeIdentifier": "t_bytes_memory_ptr", - "typeString": "bytes memory" - } - }, - "id": 59915, - "isConstant": false, - "isLValue": false, - "isPure": false, - "lValueRequested": false, - "memberName": "length", - "nodeType": "MemberAccess", - "src": "19632:12:110", - "typeDescriptions": { - "typeIdentifier": "t_uint256", - "typeString": "uint256" - } - }, - "nodeType": "BinaryOperation", - "operator": "<=", - "rightExpression": { - "hexValue": "3132305f303030", - "id": 59916, - "isConstant": false, - "isLValue": false, - "isPure": true, - "kind": "number", - "lValueRequested": false, - "nodeType": "Literal", - "src": "19648:7:110", - "typeDescriptions": { - "typeIdentifier": "t_rational_120000_by_1", - "typeString": "int_const 120000" - }, - "value": "120_000" - }, - "src": "19632:23:110", - "typeDescriptions": { - "typeIdentifier": "t_bool", - "typeString": "bool" - } - }, - { - "hexValue": "4f7074696d69736d506f7274616c3a206461746120746f6f206c61726765", - "id": 59918, - "isConstant": false, - "isLValue": false, - "isPure": true, - "kind": "string", - "lValueRequested": false, - "nodeType": "Literal", - "src": "19657:32:110", - "typeDescriptions": { - "typeIdentifier": "t_stringliteral_ed1d4c6d62337124a330de9c9e42dcf809033e5ae909544279fbaee2e389020b", - "typeString": "literal_string \"OptimismPortal: data too large\"" - }, - "value": "OptimismPortal: data too large" - } - ], - "expression": { - "argumentTypes": [ - { - "typeIdentifier": "t_bool", - "typeString": "bool" - }, - { - "typeIdentifier": "t_stringliteral_ed1d4c6d62337124a330de9c9e42dcf809033e5ae909544279fbaee2e389020b", - "typeString": "literal_string \"OptimismPortal: data too large\"" - } - ], - "id": 59913, - "name": "require", - "nodeType": "Identifier", - "overloadedDeclarations": [ - -18, - -18 - ], - "referencedDeclaration": -18, - "src": "19624:7:110", - "typeDescriptions": { - "typeIdentifier": "t_function_require_pure$_t_bool_$_t_string_memory_ptr_$returns$__$", - "typeString": "function (bool,string memory) pure" - } - }, - "id": 59919, - "isConstant": false, - "isLValue": false, - "isPure": false, - "kind": "functionCall", - "lValueRequested": false, - "names": [], - "nodeType": "FunctionCall", - "src": "19624:66:110", - "tryCall": false, - "typeDescriptions": { - "typeIdentifier": "t_tuple$__$", - "typeString": "tuple()" - } - }, - "id": 59920, - "nodeType": "ExpressionStatement", - "src": "19624:66:110" - }, - { - "assignments": [ - 59922 - ], - "declarations": [ - { - "constant": false, - "id": 59922, - "mutability": "mutable", - "name": "from", - "nameLocation": "19789:4:110", - "nodeType": "VariableDeclaration", - "scope": 59960, - "src": "19781:12:110", - "stateVariable": false, - "storageLocation": "default", - "typeDescriptions": { - "typeIdentifier": "t_address", - "typeString": "address" - }, - "typeName": { - "id": 59921, - "name": "address", - "nodeType": "ElementaryTypeName", - "src": "19781:7:110", - "stateMutability": "nonpayable", - "typeDescriptions": { - "typeIdentifier": "t_address", - "typeString": "address" - } - }, - "visibility": "internal" - } - ], - "id": 59925, - "initialValue": { - "expression": { - "id": 59923, - "name": "msg", - "nodeType": "Identifier", - "overloadedDeclarations": [], - "referencedDeclaration": -15, - "src": "19796:3:110", - "typeDescriptions": { - "typeIdentifier": "t_magic_message", - "typeString": "msg" - } - }, - "id": 59924, - "isConstant": false, - "isLValue": false, - "isPure": false, - "lValueRequested": false, - "memberName": "sender", - "nodeType": "MemberAccess", - "src": "19796:10:110", - "typeDescriptions": { - "typeIdentifier": "t_address", - "typeString": "address" - } - }, - "nodeType": "VariableDeclarationStatement", - "src": "19781:25:110" - }, - { - "condition": { - "commonType": { - "typeIdentifier": "t_address", - "typeString": "address" - }, - "id": 59930, - "isConstant": false, - "isLValue": false, - "isPure": false, - "lValueRequested": false, - "leftExpression": { - "expression": { - "id": 59926, - "name": "msg", - "nodeType": "Identifier", - "overloadedDeclarations": [], - "referencedDeclaration": -15, - "src": "19820:3:110", - "typeDescriptions": { - "typeIdentifier": "t_magic_message", - "typeString": "msg" - } - }, - "id": 59927, - "isConstant": false, - "isLValue": false, - "isPure": false, - "lValueRequested": false, - "memberName": "sender", - "nodeType": "MemberAccess", - "src": "19820:10:110", - "typeDescriptions": { - "typeIdentifier": "t_address", - "typeString": "address" - } - }, - "nodeType": "BinaryOperation", - "operator": "!=", - "rightExpression": { - "expression": { - "id": 59928, - "name": "tx", - "nodeType": "Identifier", - "overloadedDeclarations": [], - "referencedDeclaration": -26, - "src": "19834:2:110", - "typeDescriptions": { - "typeIdentifier": "t_magic_transaction", - "typeString": "tx" - } - }, - "id": 59929, - "isConstant": false, - "isLValue": false, - "isPure": false, - "lValueRequested": false, - "memberName": "origin", - "nodeType": "MemberAccess", - "src": "19834:9:110", - "typeDescriptions": { - "typeIdentifier": "t_address", - "typeString": "address" - } - }, - "src": "19820:23:110", - "typeDescriptions": { - "typeIdentifier": "t_bool", - "typeString": "bool" - } - }, - "id": 59940, - "nodeType": "IfStatement", - "src": "19816:108:110", - "trueBody": { - "id": 59939, - "nodeType": "Block", - "src": "19845:79:110", - "statements": [ - { - "expression": { - "id": 59937, - "isConstant": false, - "isLValue": false, - "isPure": false, - "lValueRequested": false, - "leftHandSide": { - "id": 59931, - "name": "from", - "nodeType": "Identifier", - "overloadedDeclarations": [], - "referencedDeclaration": 59922, - "src": "19859:4:110", - "typeDescriptions": { - "typeIdentifier": "t_address", - "typeString": "address" - } - }, - "nodeType": "Assignment", - "operator": "=", - "rightHandSide": { - "arguments": [ - { - "expression": { - "id": 59934, - "name": "msg", - "nodeType": "Identifier", - "overloadedDeclarations": [], - "referencedDeclaration": -15, - "src": "19902:3:110", - "typeDescriptions": { - "typeIdentifier": "t_magic_message", - "typeString": "msg" - } - }, - "id": 59935, - "isConstant": false, - "isLValue": false, - "isPure": false, - "lValueRequested": false, - "memberName": "sender", - "nodeType": "MemberAccess", - "src": "19902:10:110", - "typeDescriptions": { - "typeIdentifier": "t_address", - "typeString": "address" - } - } - ], - "expression": { - "argumentTypes": [ - { - "typeIdentifier": "t_address", - "typeString": "address" - } - ], - "expression": { - "id": 59932, - "name": "AddressAliasHelper", - "nodeType": "Identifier", - "overloadedDeclarations": [], - "referencedDeclaration": 78127, - "src": "19866:18:110", - "typeDescriptions": { - "typeIdentifier": "t_type$_t_contract$_AddressAliasHelper_$78127_$", - "typeString": "type(library AddressAliasHelper)" - } - }, - "id": 59933, - "isConstant": false, - "isLValue": false, - "isPure": false, - "lValueRequested": false, - "memberName": "applyL1ToL2Alias", - "nodeType": "MemberAccess", - "referencedDeclaration": 78104, - "src": "19866:35:110", - "typeDescriptions": { - "typeIdentifier": "t_function_internal_pure$_t_address_$returns$_t_address_$", - "typeString": "function (address) pure returns (address)" - } - }, - "id": 59936, - "isConstant": false, - "isLValue": false, - "isPure": false, - "kind": "functionCall", - "lValueRequested": false, - "names": [], - "nodeType": "FunctionCall", - "src": "19866:47:110", - "tryCall": false, - "typeDescriptions": { - "typeIdentifier": "t_address", - "typeString": "address" - } - }, - "src": "19859:54:110", - "typeDescriptions": { - "typeIdentifier": "t_address", - "typeString": "address" - } - }, - "id": 59938, - "nodeType": "ExpressionStatement", - "src": "19859:54:110" - } - ] - } - }, - { - "assignments": [ - 59942 - ], - "declarations": [ - { - "constant": false, - "id": 59942, - "mutability": "mutable", - "name": "opaqueData", - "nameLocation": "20194:10:110", - "nodeType": "VariableDeclaration", - "scope": 59960, - "src": "20181:23:110", - "stateVariable": false, - "storageLocation": "memory", - "typeDescriptions": { - "typeIdentifier": "t_bytes_memory_ptr", - "typeString": "bytes" - }, - "typeName": { - "id": 59941, - "name": "bytes", - "nodeType": "ElementaryTypeName", - "src": "20181:5:110", - "typeDescriptions": { - "typeIdentifier": "t_bytes_storage_ptr", - "typeString": "bytes" - } - }, - "visibility": "internal" - } - ], - "id": 59952, - "initialValue": { - "arguments": [ - { - "expression": { - "id": 59945, - "name": "msg", - "nodeType": "Identifier", - "overloadedDeclarations": [], - "referencedDeclaration": -15, - "src": "20224:3:110", - "typeDescriptions": { - "typeIdentifier": "t_magic_message", - "typeString": "msg" - } - }, - "id": 59946, - "isConstant": false, - "isLValue": false, - "isPure": false, - "lValueRequested": false, - "memberName": "value", - "nodeType": "MemberAccess", - "src": "20224:9:110", - "typeDescriptions": { - "typeIdentifier": "t_uint256", - "typeString": "uint256" - } - }, - { - "id": 59947, - "name": "_value", - "nodeType": "Identifier", - "overloadedDeclarations": [], - "referencedDeclaration": 59875, - "src": "20235:6:110", - "typeDescriptions": { - "typeIdentifier": "t_uint256", - "typeString": "uint256" - } - }, - { - "id": 59948, - "name": "_gasLimit", - "nodeType": "Identifier", - "overloadedDeclarations": [], - "referencedDeclaration": 59877, - "src": "20243:9:110", - "typeDescriptions": { - "typeIdentifier": "t_uint64", - "typeString": "uint64" - } - }, - { - "id": 59949, - "name": "_isCreation", - "nodeType": "Identifier", - "overloadedDeclarations": [], - "referencedDeclaration": 59879, - "src": "20254:11:110", - "typeDescriptions": { - "typeIdentifier": "t_bool", - "typeString": "bool" - } - }, - { - "id": 59950, - "name": "_data", - "nodeType": "Identifier", - "overloadedDeclarations": [], - "referencedDeclaration": 59881, - "src": "20267:5:110", - "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": 59943, - "name": "abi", - "nodeType": "Identifier", - "overloadedDeclarations": [], - "referencedDeclaration": -1, - "src": "20207:3:110", - "typeDescriptions": { - "typeIdentifier": "t_magic_abi", - "typeString": "abi" - } - }, - "id": 59944, - "isConstant": false, - "isLValue": false, - "isPure": true, - "lValueRequested": false, - "memberName": "encodePacked", - "nodeType": "MemberAccess", - "src": "20207:16:110", - "typeDescriptions": { - "typeIdentifier": "t_function_abiencodepacked_pure$__$returns$_t_bytes_memory_ptr_$", - "typeString": "function () pure returns (bytes memory)" - } - }, - "id": 59951, - "isConstant": false, - "isLValue": false, - "isPure": false, - "kind": "functionCall", - "lValueRequested": false, - "names": [], - "nodeType": "FunctionCall", - "src": "20207:66:110", - "tryCall": false, - "typeDescriptions": { - "typeIdentifier": "t_bytes_memory_ptr", - "typeString": "bytes memory" - } - }, - "nodeType": "VariableDeclarationStatement", - "src": "20181:92:110" - }, - { - "eventCall": { - "arguments": [ - { - "id": 59954, - "name": "from", - "nodeType": "Identifier", - "overloadedDeclarations": [], - "referencedDeclaration": 59922, - "src": "20441:4:110", - "typeDescriptions": { - "typeIdentifier": "t_address", - "typeString": "address" - } - }, - { - "id": 59955, - "name": "_to", - "nodeType": "Identifier", - "overloadedDeclarations": [], - "referencedDeclaration": 59873, - "src": "20447:3:110", - "typeDescriptions": { - "typeIdentifier": "t_address", - "typeString": "address" - } - }, - { - "id": 59956, - "name": "DEPOSIT_VERSION", - "nodeType": "Identifier", - "overloadedDeclarations": [], - "referencedDeclaration": 59316, - "src": "20452:15:110", - "typeDescriptions": { - "typeIdentifier": "t_uint256", - "typeString": "uint256" - } - }, - { - "id": 59957, - "name": "opaqueData", - "nodeType": "Identifier", - "overloadedDeclarations": [], - "referencedDeclaration": 59942, - "src": "20469:10:110", - "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": 59953, - "name": "TransactionDeposited", - "nodeType": "Identifier", - "overloadedDeclarations": [], - "referencedDeclaration": 59359, - "src": "20420:20:110", - "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": 59958, - "isConstant": false, - "isLValue": false, - "isPure": false, - "kind": "functionCall", - "lValueRequested": false, - "names": [], - "nodeType": "FunctionCall", - "src": "20420:60:110", - "tryCall": false, - "typeDescriptions": { - "typeIdentifier": "t_tuple$__$", - "typeString": "tuple()" - } - }, - "id": 59959, - "nodeType": "EmitStatement", - "src": "20415:65:110" - } - ] - }, - "documentation": { - "id": 59871, - "nodeType": "StructuredDocumentation", - "src": "17792:719:110", - "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": 59884, - "name": "_gasLimit", - "nodeType": "Identifier", - "overloadedDeclarations": [], - "referencedDeclaration": 59877, - "src": "18722:9:110", - "typeDescriptions": { - "typeIdentifier": "t_uint64", - "typeString": "uint64" - } - } - ], - "id": 59885, - "kind": "modifierInvocation", - "modifierName": { - "id": 59883, - "name": "metered", - "nodeType": "IdentifierPath", - "referencedDeclaration": 60309, - "src": "18714:7:110" - }, - "nodeType": "ModifierInvocation", - "src": "18714:18:110" - } - ], - "name": "depositTransaction", - "nameLocation": "18525:18:110", - "parameters": { - "id": 59882, - "nodeType": "ParameterList", - "parameters": [ - { - "constant": false, - "id": 59873, - "mutability": "mutable", - "name": "_to", - "nameLocation": "18561:3:110", - "nodeType": "VariableDeclaration", - "scope": 59961, - "src": "18553:11:110", - "stateVariable": false, - "storageLocation": "default", - "typeDescriptions": { - "typeIdentifier": "t_address", - "typeString": "address" - }, - "typeName": { - "id": 59872, - "name": "address", - "nodeType": "ElementaryTypeName", - "src": "18553:7:110", - "stateMutability": "nonpayable", - "typeDescriptions": { - "typeIdentifier": "t_address", - "typeString": "address" - } - }, - "visibility": "internal" - }, - { - "constant": false, - "id": 59875, - "mutability": "mutable", - "name": "_value", - "nameLocation": "18582:6:110", - "nodeType": "VariableDeclaration", - "scope": 59961, - "src": "18574:14:110", - "stateVariable": false, - "storageLocation": "default", - "typeDescriptions": { - "typeIdentifier": "t_uint256", - "typeString": "uint256" - }, - "typeName": { - "id": 59874, - "name": "uint256", - "nodeType": "ElementaryTypeName", - "src": "18574:7:110", - "typeDescriptions": { - "typeIdentifier": "t_uint256", - "typeString": "uint256" - } - }, - "visibility": "internal" - }, - { - "constant": false, - "id": 59877, - "mutability": "mutable", - "name": "_gasLimit", - "nameLocation": "18605:9:110", - "nodeType": "VariableDeclaration", - "scope": 59961, - "src": "18598:16:110", - "stateVariable": false, - "storageLocation": "default", - "typeDescriptions": { - "typeIdentifier": "t_uint64", - "typeString": "uint64" - }, - "typeName": { - "id": 59876, - "name": "uint64", - "nodeType": "ElementaryTypeName", - "src": "18598:6:110", - "typeDescriptions": { - "typeIdentifier": "t_uint64", - "typeString": "uint64" - } - }, - "visibility": "internal" - }, - { - "constant": false, - "id": 59879, - "mutability": "mutable", - "name": "_isCreation", - "nameLocation": "18629:11:110", - "nodeType": "VariableDeclaration", - "scope": 59961, - "src": "18624:16:110", - "stateVariable": false, - "storageLocation": "default", - "typeDescriptions": { - "typeIdentifier": "t_bool", - "typeString": "bool" - }, - "typeName": { - "id": 59878, - "name": "bool", - "nodeType": "ElementaryTypeName", - "src": "18624:4:110", - "typeDescriptions": { - "typeIdentifier": "t_bool", - "typeString": "bool" - } - }, - "visibility": "internal" - }, - { - "constant": false, - "id": 59881, - "mutability": "mutable", - "name": "_data", - "nameLocation": "18663:5:110", - "nodeType": "VariableDeclaration", - "scope": 59961, - "src": "18650:18:110", - "stateVariable": false, - "storageLocation": "memory", - "typeDescriptions": { - "typeIdentifier": "t_bytes_memory_ptr", - "typeString": "bytes" - }, - "typeName": { - "id": 59880, - "name": "bytes", - "nodeType": "ElementaryTypeName", - "src": "18650:5:110", - "typeDescriptions": { - "typeIdentifier": "t_bytes_storage_ptr", - "typeString": "bytes" - } - }, - "visibility": "internal" - } - ], - "src": "18543:131:110" - }, - "returnParameters": { - "id": 59886, - "nodeType": "ParameterList", - "parameters": [], - "src": "18737:0:110" - }, - "scope": 59997, - "stateMutability": "payable", - "virtual": false, - "visibility": "public" - }, - { - "id": 59978, - "nodeType": "FunctionDefinition", - "src": "20785:180:110", - "nodes": [], - "body": { - "id": 59977, - "nodeType": "Block", - "src": "20865:100:110", - "nodes": [], - "statements": [ - { - "expression": { - "arguments": [ - { - "expression": { - "arguments": [ - { - "id": 59972, - "name": "_l2OutputIndex", - "nodeType": "Identifier", - "overloadedDeclarations": [], - "referencedDeclaration": 59964, - "src": "20932:14:110", - "typeDescriptions": { - "typeIdentifier": "t_uint256", - "typeString": "uint256" - } - } - ], - "expression": { - "argumentTypes": [ - { - "typeIdentifier": "t_uint256", - "typeString": "uint256" - } - ], - "expression": { - "id": 59970, - "name": "l2Oracle", - "nodeType": "Identifier", - "overloadedDeclarations": [], - "referencedDeclaration": 59341, - "src": "20911:8:110", - "typeDescriptions": { - "typeIdentifier": "t_contract$_L2OutputOracle_$59272", - "typeString": "contract L2OutputOracle" - } - }, - "id": 59971, - "isConstant": false, - "isLValue": false, - "isPure": false, - "lValueRequested": false, - "memberName": "getL2Output", - "nodeType": "MemberAccess", - "referencedDeclaration": 59112, - "src": "20911:20:110", - "typeDescriptions": { - "typeIdentifier": "t_function_external_view$_t_uint256_$returns$_t_struct$_OutputProposal_$70553_memory_ptr_$", - "typeString": "function (uint256) view external returns (struct Types.OutputProposal memory)" - } - }, - "id": 59973, - "isConstant": false, - "isLValue": false, - "isPure": false, - "kind": "functionCall", - "lValueRequested": false, - "names": [], - "nodeType": "FunctionCall", - "src": "20911:36:110", - "tryCall": false, - "typeDescriptions": { - "typeIdentifier": "t_struct$_OutputProposal_$70553_memory_ptr", - "typeString": "struct Types.OutputProposal memory" - } - }, - "id": 59974, - "isConstant": false, - "isLValue": true, - "isPure": false, - "lValueRequested": false, - "memberName": "timestamp", - "nodeType": "MemberAccess", - "referencedDeclaration": 70550, - "src": "20911:46:110", - "typeDescriptions": { - "typeIdentifier": "t_uint128", - "typeString": "uint128" - } - } - ], - "expression": { - "argumentTypes": [ - { - "typeIdentifier": "t_uint128", - "typeString": "uint128" - } - ], - "id": 59969, - "name": "_isFinalizationPeriodElapsed", - "nodeType": "Identifier", - "overloadedDeclarations": [], - "referencedDeclaration": 59996, - "src": "20882:28:110", - "typeDescriptions": { - "typeIdentifier": "t_function_internal_view$_t_uint256_$returns$_t_bool_$", - "typeString": "function (uint256) view returns (bool)" - } - }, - "id": 59975, - "isConstant": false, - "isLValue": false, - "isPure": false, - "kind": "functionCall", - "lValueRequested": false, - "names": [], - "nodeType": "FunctionCall", - "src": "20882:76:110", - "tryCall": false, - "typeDescriptions": { - "typeIdentifier": "t_bool", - "typeString": "bool" - } - }, - "functionReturnParameters": 59968, - "id": 59976, - "nodeType": "Return", - "src": "20875:83:110" - } - ] - }, - "documentation": { - "id": 59962, - "nodeType": "StructuredDocumentation", - "src": "20493:287:110", - "text": "@notice Determine if a given output is finalized.\n Reverts if the call to L2_ORACLE.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": "20794:17:110", - "parameters": { - "id": 59965, - "nodeType": "ParameterList", - "parameters": [ - { - "constant": false, - "id": 59964, - "mutability": "mutable", - "name": "_l2OutputIndex", - "nameLocation": "20820:14:110", - "nodeType": "VariableDeclaration", - "scope": 59978, - "src": "20812:22:110", - "stateVariable": false, - "storageLocation": "default", - "typeDescriptions": { - "typeIdentifier": "t_uint256", - "typeString": "uint256" - }, - "typeName": { - "id": 59963, - "name": "uint256", - "nodeType": "ElementaryTypeName", - "src": "20812:7:110", - "typeDescriptions": { - "typeIdentifier": "t_uint256", - "typeString": "uint256" - } - }, - "visibility": "internal" - } - ], - "src": "20811:24:110" - }, - "returnParameters": { - "id": 59968, - "nodeType": "ParameterList", - "parameters": [ - { - "constant": false, - "id": 59967, - "mutability": "mutable", - "name": "", - "nameLocation": "-1:-1:-1", - "nodeType": "VariableDeclaration", - "scope": 59978, - "src": "20859:4:110", - "stateVariable": false, - "storageLocation": "default", - "typeDescriptions": { - "typeIdentifier": "t_bool", - "typeString": "bool" - }, - "typeName": { - "id": 59966, - "name": "bool", - "nodeType": "ElementaryTypeName", - "src": "20859:4:110", - "typeDescriptions": { - "typeIdentifier": "t_bool", - "typeString": "bool" - } - }, - "visibility": "internal" - } - ], - "src": "20858:6:110" - }, - "scope": 59997, - "stateMutability": "view", - "virtual": false, - "visibility": "external" - }, - { - "id": 59996, - "nodeType": "FunctionDefinition", - "src": "21218:180:110", - "nodes": [], - "body": { - "id": 59995, - "nodeType": "Block", - "src": "21305:93:110", - "nodes": [], - "statements": [ - { - "expression": { - "commonType": { - "typeIdentifier": "t_uint256", - "typeString": "uint256" - }, - "id": 59993, - "isConstant": false, - "isLValue": false, - "isPure": false, - "lValueRequested": false, - "leftExpression": { - "expression": { - "id": 59986, - "name": "block", - "nodeType": "Identifier", - "overloadedDeclarations": [], - "referencedDeclaration": -4, - "src": "21322:5:110", - "typeDescriptions": { - "typeIdentifier": "t_magic_block", - "typeString": "block" - } - }, - "id": 59987, - "isConstant": false, - "isLValue": false, - "isPure": false, - "lValueRequested": false, - "memberName": "timestamp", - "nodeType": "MemberAccess", - "src": "21322:15:110", - "typeDescriptions": { - "typeIdentifier": "t_uint256", - "typeString": "uint256" - } - }, - "nodeType": "BinaryOperation", - "operator": ">", - "rightExpression": { - "commonType": { - "typeIdentifier": "t_uint256", - "typeString": "uint256" - }, - "id": 59992, - "isConstant": false, - "isLValue": false, - "isPure": false, - "lValueRequested": false, - "leftExpression": { - "id": 59988, - "name": "_timestamp", - "nodeType": "Identifier", - "overloadedDeclarations": [], - "referencedDeclaration": 59981, - "src": "21340:10:110", - "typeDescriptions": { - "typeIdentifier": "t_uint256", - "typeString": "uint256" - } - }, - "nodeType": "BinaryOperation", - "operator": "+", - "rightExpression": { - "arguments": [], - "expression": { - "argumentTypes": [], - "expression": { - "id": 59989, - "name": "l2Oracle", - "nodeType": "Identifier", - "overloadedDeclarations": [], - "referencedDeclaration": 59341, - "src": "21353:8:110", - "typeDescriptions": { - "typeIdentifier": "t_contract$_L2OutputOracle_$59272", - "typeString": "contract L2OutputOracle" - } - }, - "id": 59990, - "isConstant": false, - "isLValue": false, - "isPure": false, - "lValueRequested": false, - "memberName": "FINALIZATION_PERIOD_SECONDS", - "nodeType": "MemberAccess", - "referencedDeclaration": 58783, - "src": "21353:36:110", - "typeDescriptions": { - "typeIdentifier": "t_function_external_view$__$returns$_t_uint256_$", - "typeString": "function () view external returns (uint256)" - } - }, - "id": 59991, - "isConstant": false, - "isLValue": false, - "isPure": false, - "kind": "functionCall", - "lValueRequested": false, - "names": [], - "nodeType": "FunctionCall", - "src": "21353:38:110", - "tryCall": false, - "typeDescriptions": { - "typeIdentifier": "t_uint256", - "typeString": "uint256" - } - }, - "src": "21340:51:110", - "typeDescriptions": { - "typeIdentifier": "t_uint256", - "typeString": "uint256" - } - }, - "src": "21322:69:110", - "typeDescriptions": { - "typeIdentifier": "t_bool", - "typeString": "bool" - } - }, - "functionReturnParameters": 59985, - "id": 59994, - "nodeType": "Return", - "src": "21315:76:110" - } - ] - }, - "documentation": { - "id": 59979, - "nodeType": "StructuredDocumentation", - "src": "20971:242:110", - "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": "21227:28:110", - "parameters": { - "id": 59982, - "nodeType": "ParameterList", - "parameters": [ - { - "constant": false, - "id": 59981, - "mutability": "mutable", - "name": "_timestamp", - "nameLocation": "21264:10:110", - "nodeType": "VariableDeclaration", - "scope": 59996, - "src": "21256:18:110", - "stateVariable": false, - "storageLocation": "default", - "typeDescriptions": { - "typeIdentifier": "t_uint256", - "typeString": "uint256" - }, - "typeName": { - "id": 59980, - "name": "uint256", - "nodeType": "ElementaryTypeName", - "src": "21256:7:110", - "typeDescriptions": { - "typeIdentifier": "t_uint256", - "typeString": "uint256" - } - }, - "visibility": "internal" - } - ], - "src": "21255:20:110" - }, - "returnParameters": { - "id": 59985, - "nodeType": "ParameterList", - "parameters": [ - { - "constant": false, - "id": 59984, - "mutability": "mutable", - "name": "", - "nameLocation": "-1:-1:-1", - "nodeType": "VariableDeclaration", - "scope": 59996, - "src": "21299:4:110", - "stateVariable": false, - "storageLocation": "default", - "typeDescriptions": { - "typeIdentifier": "t_bool", - "typeString": "bool" - }, - "typeName": { - "id": 59983, - "name": "bool", - "nodeType": "ElementaryTypeName", - "src": "21299:4:110", - "typeDescriptions": { - "typeIdentifier": "t_bool", - "typeString": "bool" - } - }, - "visibility": "internal" - } - ], - "src": "21298:6:110" - }, - "scope": 59997, - "stateMutability": "view", - "virtual": false, - "visibility": "internal" - } - ], - "abstract": false, - "baseContracts": [ - { - "baseName": { - "id": 59300, - "name": "Initializable", - "nodeType": "IdentifierPath", - "referencedDeclaration": 32244, - "src": "1162:13:110" - }, - "id": 59301, - "nodeType": "InheritanceSpecifier", - "src": "1162:13:110" - }, - { - "baseName": { - "id": 59302, - "name": "ResourceMetering", - "nodeType": "IdentifierPath", - "referencedDeclaration": 60599, - "src": "1177:16:110" - }, - "id": 59303, - "nodeType": "InheritanceSpecifier", - "src": "1177:16:110" - }, - { - "baseName": { - "id": 59304, - "name": "ISemver", - "nodeType": "IdentifierPath", - "referencedDeclaration": 75669, - "src": "1195:7:110" - }, - "id": 59305, - "nodeType": "InheritanceSpecifier", - "src": "1195:7:110" - } - ], - "canonicalName": "OptimismPortal", - "contractDependencies": [], - "contractKind": "contract", - "documentation": { - "id": 59299, - "nodeType": "StructuredDocumentation", - "src": "797:338:110", - "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": [ - 59997, - 75669, - 60599, - 32244 - ], - "name": "OptimismPortal", - "nameLocation": "1144:14:110", - "scope": 59998, - "usedErrors": [] - } - ], - "license": "MIT" - }, - "id": 110 -} \ No newline at end of file diff --git a/packages/chain-mon/src/fault-mon/README.md b/packages/chain-mon/src/fault-mon/README.md deleted file mode 100644 index eec7dcee7f70..000000000000 --- a/packages/chain-mon/src/fault-mon/README.md +++ /dev/null @@ -1,73 +0,0 @@ -# @eth-optimism/fault-mon - -[![codecov](https://codecov.io/gh/ethereum-optimism/optimism/branch/develop/graph/badge.svg?token=0VTG7PG7YR&flag=fault-detector-tests)](https://codecov.io/gh/ethereum-optimism/optimism) - -The `fault-mon` is a simple service for detecting discrepancies between your local view of the Optimism network and the L2 output proposals published to Ethereum. - -## Installation - -Clone, install, and build the Optimism monorepo: - -``` -git clone https://github.com/ethereum-optimism/optimism.git -pnpm install -pnpm build -``` - -## Running the service - -Copy `.env.example` into a new file named `.env`, then set the environment variables listed there. Additional env settings are listed on `--help`. If running the fault detector against -a custom op chain, the `OptimismPortal` contract addresses must also be set associated with the op-chain. - -Once your environment variables or flags have been set, run the service via: - -``` -pnpm start -``` - -## Ports - -- API is exposed at `$FAULT_DETECTOR__HOSTNAME:$FAULT_DETECTOR__PORT/api` -- Metrics are exposed at `$FAULT_DETECTOR__HOSTNAME:$FAULT_DETECTOR__PORT/metrics` -- `$FAULT_DETECTOR__HOSTNAME` defaults to `0.0.0.0` -- `$FAULT_DETECTOR__PORT` defaults to `7300` - -## What this service does - -The `fault-mon` detects differences between the transaction results generated by your local Optimism node and the transaction results actually published to Ethereum. -Currently, transaction results take the form of [the root of the Optimism state trie](https://medium.com/@eiki1212/ethereum-state-trie-architecture-explained-a30237009d4e). - -The state root of the block is published to the [`L2OutputOracle`](https://github.com/ethereum-optimism/optimism/blob/39b7262cc3ffd78cd314341b8512b2683c1d9af7/packages/contracts-bedrock/contracts/L1/L2OutputOracle.sol) contract on Ethereum. - - ***Note***: The service accepts the `OptimismPortal` as a flag instead of the `L2OutputOracle` for backwards compatibility with early versions of these contracts. The `L2OutputOracle` - is inferred from the portal contract. - -We can therefore detect differences by, for each block, checking the state root of the given block as reported by an Optimism node and the state root as published to Ethereum. - -We export a series of Prometheus metrics that you can use to trigger alerting when issues are detected. -Check the list of available metrics via `pnpm start --help`: - -```sh -> pnpm start --help -$ tsx ./src/service.ts --help -Usage: service [options] - -Options: - --l1rpcprovider Provider for interacting with L1 (env: FAULT_DETECTOR__L1_RPC_PROVIDER) - --l2rpcprovider Provider for interacting with L2 (env: FAULT_DETECTOR__L2_RPC_PROVIDER) - --startbatchindex Batch index to start checking from. Setting it to -1 will cause the fault detector to find the first state batch index that has not yet passed the fault proof window (env: FAULT_DETECTOR__START_BATCH_INDEX, default value: -1) - --loopintervalms Loop interval in milliseconds (env: FAULT_DETECTOR__LOOP_INTERVAL_MS) - --optimismportaladdress [Custom OP Chains] Deployed OptimismPortal contract address. Used to retrieve necessary info for output verification (env: FAULT_DETECTOR__OPTIMISM_PORTAL_ADDRESS, default 0x0) - - --port Port for the app server (env: FAULT_DETECTOR__PORT) - --hostname Hostname for the app server (env: FAULT_DETECTOR__HOSTNAME) - -h, --help display help for command - -Metrics: - highest_checked_batch_index Highest good batch index (type: Gauge) - highest_known_batch_index Highest known batch index (type: Gauge) - is_currently_mismatched 0 if state is ok, 1 if state is mismatched (type: Gauge) - l1_node_connection_failures Number of times L1 node connection has failed (type: Gauge) - l2_node_connection_failures Number of times L2 node connection has failed (type: Gauge) - metadata Service metadata (type: Gauge) - unhandled_errors Unhandled errors (type: Counter) -``` diff --git a/packages/chain-mon/src/fault-mon/helpers.ts b/packages/chain-mon/src/fault-mon/helpers.ts deleted file mode 100644 index 438d419e37c8..000000000000 --- a/packages/chain-mon/src/fault-mon/helpers.ts +++ /dev/null @@ -1,68 +0,0 @@ -import { Contract } from 'ethers' -import { Logger } from '@eth-optimism/common-ts' -import { BedrockOutputData } from '@eth-optimism/core-utils' - -/** - * Finds the BedrockOutputData that corresponds to a given output index. - * - * @param oracle Output oracle contract - * @param index Output index to search for. - * @returns BedrockOutputData corresponding to the output index. - */ -export const findOutputForIndex = async ( - oracle: Contract, - index: number, - logger?: Logger -): Promise => { - try { - const proposal = await oracle.getL2Output(index) - return { - outputRoot: proposal.outputRoot, - l1Timestamp: proposal.timestamp.toNumber(), - l2BlockNumber: proposal.l2BlockNumber.toNumber(), - l2OutputIndex: index, - } - } catch (err) { - logger?.fatal('error when calling L2OuputOracle.getL2Output', { - errors: err, - }) - throw new Error(`unable to find output for index ${index}`) - } -} - -/** - * Finds the first L2 output index that has not yet passed the fault proof window. - * - * @param oracle Output oracle contract. - * @returns Starting L2 output index. - */ -export const findFirstUnfinalizedOutputIndex = async ( - oracle: Contract, - fpw: number, - logger?: Logger -): Promise => { - const latestBlock = await oracle.provider.getBlock('latest') - const totalOutputs = (await oracle.nextOutputIndex()).toNumber() - - // Perform a binary search to find the next batch that will pass the challenge period. - let lo = 0 - let hi = totalOutputs - while (lo !== hi) { - const mid = Math.floor((lo + hi) / 2) - const outputData = await findOutputForIndex(oracle, mid, logger) - - if (outputData.l1Timestamp + fpw < latestBlock.timestamp) { - lo = mid + 1 - } else { - hi = mid - } - } - - // Result will be zero if the chain is less than FPW seconds old. Only returns undefined in the - // case that no batches have been submitted for an entire challenge period. - if (lo === totalOutputs) { - return undefined - } else { - return lo - } -} diff --git a/packages/chain-mon/src/fault-mon/index.ts b/packages/chain-mon/src/fault-mon/index.ts deleted file mode 100644 index e787cf766e23..000000000000 --- a/packages/chain-mon/src/fault-mon/index.ts +++ /dev/null @@ -1,2 +0,0 @@ -export * from './service' -export * from './helpers' diff --git a/packages/chain-mon/src/fault-mon/service.ts b/packages/chain-mon/src/fault-mon/service.ts deleted file mode 100644 index b86f406c9125..000000000000 --- a/packages/chain-mon/src/fault-mon/service.ts +++ /dev/null @@ -1,420 +0,0 @@ -import { - BaseServiceV2, - StandardOptions, - ExpressRouter, - Gauge, - validators, - waitForProvider, -} from '@eth-optimism/common-ts' -import { - BedrockOutputData, - getChainId, - sleep, - toRpcHexString, -} from '@eth-optimism/core-utils' -import { config } from 'dotenv' -import { - CONTRACT_ADDRESSES, - CrossChainMessenger, - getOEContract, - L2ChainID, - OEL1ContractsLike, -} from '@eth-optimism/sdk' -import { Provider } from '@ethersproject/abstract-provider' -import { Contract, ethers } from 'ethers' -import dateformat from 'dateformat' - -import { version } from '../../package.json' -import { findFirstUnfinalizedOutputIndex, findOutputForIndex } from './helpers' - -type Options = { - l1RpcProvider: Provider - l2RpcProvider: Provider - startOutputIndex: number - optimismPortalAddress?: string -} - -type Metrics = { - highestOutputIndex: Gauge - isCurrentlyMismatched: Gauge - nodeConnectionFailures: Gauge -} - -type State = { - faultProofWindow: number - outputOracle: Contract - messenger: CrossChainMessenger - currentOutputIndex: number - diverged: boolean -} - -export class FaultDetector extends BaseServiceV2 { - constructor(options?: Partial) { - super({ - version, - name: 'fault-detector', - 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', - }, - startOutputIndex: { - validator: validators.num, - default: -1, - desc: 'The L2 height to start from', - public: true, - }, - optimismPortalAddress: { - validator: validators.str, - default: ethers.constants.AddressZero, - desc: '[Custom OP Chains] Deployed OptimismPortal contract address. Used to retrieve necessary info for output verification ', - public: true, - }, - }, - metricsSpec: { - highestOutputIndex: { - type: Gauge, - desc: 'Highest output indices (checked and known)', - labels: ['type'], - }, - isCurrentlyMismatched: { - type: Gauge, - desc: '0 if state is ok, 1 if state is mismatched', - }, - nodeConnectionFailures: { - type: Gauge, - desc: 'Number of times node connection has failed', - labels: ['layer', 'section'], - }, - }, - }) - } - - /** - * Provides the required set of addresses used by the fault detector. For recognized op-chains, this - * will fallback to the pre-defined set of addresses from options, otherwise aborting if unset. - * - * Required Contracts - * - OptimismPortal (used to also fetch L2OutputOracle address variable). This is the preferred address - * since in early versions of bedrock, OptimismPortal holds the FINALIZATION_WINDOW variable instead of L2OutputOracle. - * The retrieved L2OutputOracle address from OptimismPortal is used to query for output roots. - * - * @param l2ChainId op chain id - * @returns OEL1ContractsLike set of L1 contracts with only the required addresses set - */ - async getOEL1Contracts(l2ChainId: number): Promise { - // CrossChainMessenger requires all address to be defined. Default to `AddressZero` to ignore unused contracts - let contracts: OEL1ContractsLike = { - OptimismPortal: ethers.constants.AddressZero, - L2OutputOracle: ethers.constants.AddressZero, - // Unused contracts - AddressManager: ethers.constants.AddressZero, - BondManager: ethers.constants.AddressZero, - CanonicalTransactionChain: ethers.constants.AddressZero, - L1CrossDomainMessenger: ethers.constants.AddressZero, - L1StandardBridge: ethers.constants.AddressZero, - StateCommitmentChain: ethers.constants.AddressZero, - } - - const knownChainId = L2ChainID[l2ChainId] !== undefined - if (knownChainId) { - this.logger.info(`Recognized L2 chain id ${L2ChainID[l2ChainId]}`) - - // fallback to the predefined defaults for this chain id - contracts = CONTRACT_ADDRESSES[l2ChainId].l1 - } - - this.logger.info('checking contract address options...') - const portalAddress = this.options.optimismPortalAddress - if (!knownChainId && portalAddress === ethers.constants.AddressZero) { - this.logger.error('OptimismPortal contract unspecified') - throw new Error( - '--optimismportalcontractaddress needs to set for custom op chains' - ) - } - - if (portalAddress !== ethers.constants.AddressZero) { - this.logger.info('set OptimismPortal contract override') - contracts.OptimismPortal = portalAddress - - this.logger.info('fetching L2OutputOracle contract from OptimismPortal') - const portalContract = getOEContract('OptimismPortal', l2ChainId, { - address: portalAddress, - signerOrProvider: this.options.l1RpcProvider, - }) - contracts.L2OutputOracle = await portalContract.l2Oracle() - } - - // ... for a known chain ids without an override, the L2OutputOracle will already - // be set via the hardcoded default - return contracts - } - - 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', - }) - - const l1ChainId = await getChainId(this.options.l1RpcProvider) - const l2ChainId = await getChainId(this.options.l2RpcProvider) - this.state.messenger = new CrossChainMessenger({ - l1SignerOrProvider: this.options.l1RpcProvider, - l2SignerOrProvider: this.options.l2RpcProvider, - l1ChainId, - l2ChainId, - bedrock: true, - contracts: { l1: await this.getOEL1Contracts(l2ChainId) }, - }) - - // Not diverged by default. - this.state.diverged = false - - // We use this a lot, a bit cleaner to pull out to the top level of the state object. - this.state.faultProofWindow = - await this.state.messenger.getChallengePeriodSeconds() - this.logger.info( - `fault proof window is ${this.state.faultProofWindow} seconds` - ) - - this.state.outputOracle = this.state.messenger.contracts.l1.L2OutputOracle - - // Figure out where to start syncing from. - if (this.options.startOutputIndex === -1) { - this.logger.info('finding appropriate starting unfinalized output') - const firstUnfinalized = await findFirstUnfinalizedOutputIndex( - this.state.outputOracle, - this.state.faultProofWindow, - this.logger - ) - - // We may not have an unfinalized outputs in the case where no outputs have been submitted - // for the entire duration of the FAULTPROOFWINDOW. We generally do not expect this to happen on mainnet, - // but it happens often on testnets because the FAULTPROOFWINDOW is very short. - if (firstUnfinalized === undefined) { - this.logger.info( - 'no unfinalized outputes found. skipping all outputes.' - ) - const totalOutputes = await this.state.outputOracle.nextOutputIndex() - this.state.currentOutputIndex = totalOutputes.toNumber() - 1 - } else { - this.state.currentOutputIndex = firstUnfinalized - } - } else { - this.state.currentOutputIndex = this.options.startOutputIndex - } - - this.logger.info('starting output', { - outputIndex: this.state.currentOutputIndex, - }) - - // Set the initial metrics. - this.metrics.isCurrentlyMismatched.set(0) - } - - async routes(router: ExpressRouter): Promise { - router.get('/status', async (req, res) => { - return res.status(200).json({ - ok: !this.state.diverged, - }) - }) - } - - async main(): Promise { - const startMs = Date.now() - - let latestOutputIndex: number - try { - const totalOutputes = await this.state.outputOracle.nextOutputIndex() - latestOutputIndex = totalOutputes.toNumber() - 1 - } catch (err) { - this.logger.error('failed to query total # of outputes', { - error: err, - node: 'l1', - section: 'nextOutputIndex', - }) - this.metrics.nodeConnectionFailures.inc({ - layer: 'l1', - section: 'nextOutputIndex', - }) - await sleep(15000) - return - } - - if (this.state.currentOutputIndex > latestOutputIndex) { - this.logger.info('output index is ahead of the oracle. waiting...', { - outputIndex: this.state.currentOutputIndex, - latestOutputIndex, - }) - await sleep(15000) - return - } - - this.metrics.highestOutputIndex.set({ type: 'known' }, latestOutputIndex) - this.logger.info('checking output', { - outputIndex: this.state.currentOutputIndex, - latestOutputIndex, - }) - - let outputData: BedrockOutputData - try { - outputData = await findOutputForIndex( - this.state.outputOracle, - this.state.currentOutputIndex, - this.logger - ) - } catch (err) { - this.logger.error('failed to fetch output associated with output', { - error: err, - node: 'l1', - section: 'findOutputForIndex', - outputIndex: this.state.currentOutputIndex, - }) - this.metrics.nodeConnectionFailures.inc({ - layer: 'l1', - section: 'findOutputForIndex', - }) - await sleep(15000) - return - } - - let latestBlock: number - try { - latestBlock = await this.options.l2RpcProvider.getBlockNumber() - } catch (err) { - this.logger.error('failed to query L2 block height', { - error: err, - node: 'l2', - section: 'getBlockNumber', - }) - this.metrics.nodeConnectionFailures.inc({ - layer: 'l2', - section: 'getBlockNumber', - }) - await sleep(15000) - return - } - - const outputBlockNumber = outputData.l2BlockNumber - if (latestBlock < outputBlockNumber) { - this.logger.info('L2 node is behind, waiting for sync...', { - l2BlockHeight: latestBlock, - outputBlock: outputBlockNumber, - }) - return - } - - let outputBlock: any - try { - outputBlock = await ( - this.options.l2RpcProvider as ethers.providers.JsonRpcProvider - ).send('eth_getBlockByNumber', [toRpcHexString(outputBlockNumber), false]) - } catch (err) { - this.logger.error('failed to fetch output block', { - error: err, - node: 'l2', - section: 'getBlock', - block: outputBlockNumber, - }) - this.metrics.nodeConnectionFailures.inc({ - layer: 'l2', - section: 'getBlock', - }) - await sleep(15000) - return - } - - let messagePasserProofResponse: any - try { - messagePasserProofResponse = await ( - this.options.l2RpcProvider as ethers.providers.JsonRpcProvider - ).send('eth_getProof', [ - this.state.messenger.contracts.l2.BedrockMessagePasser.address, - [], - toRpcHexString(outputBlockNumber), - ]) - } catch (err) { - this.logger.error('failed to fetch message passer proof', { - error: err, - node: 'l2', - section: 'getProof', - block: outputBlockNumber, - }) - this.metrics.nodeConnectionFailures.inc({ - layer: 'l2', - section: 'getProof', - }) - await sleep(15000) - return - } - - const outputRoot = ethers.utils.solidityKeccak256( - ['uint256', 'bytes32', 'bytes32', 'bytes32'], - [ - 0, - outputBlock.stateRoot, - messagePasserProofResponse.storageHash, - outputBlock.hash, - ] - ) - - if (outputRoot !== outputData.outputRoot) { - this.state.diverged = true - this.metrics.isCurrentlyMismatched.set(1) - this.logger.error('state root mismatch', { - blockNumber: outputBlock.number, - expectedStateRoot: outputData.outputRoot, - actualStateRoot: outputRoot, - finalizationTime: dateformat( - new Date( - (ethers.BigNumber.from(outputBlock.timestamp).toNumber() + - this.state.faultProofWindow) * - 1000 - ), - 'mmmm dS, yyyy, h:MM:ss TT' - ), - }) - return - } - - const elapsedMs = Date.now() - startMs - - // Mark the current output index as checked - this.logger.info('checked output ok', { - outputIndex: this.state.currentOutputIndex, - timeMs: elapsedMs, - }) - this.metrics.highestOutputIndex.set( - { type: 'checked' }, - this.state.currentOutputIndex - ) - - // If we got through the above without throwing an error, we should be - // fine to reset and move onto the next output - this.state.diverged = false - this.state.currentOutputIndex++ - this.metrics.isCurrentlyMismatched.set(0) - } -} - -if (require.main === module) { - config() - const service = new FaultDetector() - service.run() -} diff --git a/packages/chain-mon/src/faultproof-wd-mon/constants.ts b/packages/chain-mon/src/faultproof-wd-mon/constants.ts deleted file mode 100644 index 0021c0de2606..000000000000 --- a/packages/chain-mon/src/faultproof-wd-mon/constants.ts +++ /dev/null @@ -1,21 +0,0 @@ -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 deleted file mode 100644 index d4590f805d4b..000000000000 --- a/packages/chain-mon/src/faultproof-wd-mon/service.ts +++ /dev/null @@ -1,556 +0,0 @@ -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 deleted file mode 100644 index 9f838b714b40..000000000000 --- a/packages/chain-mon/src/index.ts +++ /dev/null @@ -1,8 +0,0 @@ -export * from '../internal/balance-mon/service' -export * from '../contrib/drippie-mon/service' -export * from './fault-mon/index' -export * from '../internal/multisig-mon/service' -export * from './wd-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/src/wd-mon/constants.ts b/packages/chain-mon/src/wd-mon/constants.ts deleted file mode 100644 index 0021c0de2606..000000000000 --- a/packages/chain-mon/src/wd-mon/constants.ts +++ /dev/null @@ -1,21 +0,0 @@ -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/wd-mon/service.ts b/packages/chain-mon/src/wd-mon/service.ts deleted file mode 100644 index 86e56e12562a..000000000000 --- a/packages/chain-mon/src/wd-mon/service.ts +++ /dev/null @@ -1,310 +0,0 @@ -import { - BaseServiceV2, - StandardOptions, - ExpressRouter, - Gauge, - validators, - waitForProvider, -} from '@eth-optimism/common-ts' -import { getOEContract, DEFAULT_L2_CONTRACT_ADDRESSES } from '@eth-optimism/sdk' -import { getChainId, sleep } 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 = { - highestBlockNumber: Gauge - withdrawalsValidated: Gauge - isDetectingForgeries: Gauge - nodeConnectionFailures: Gauge -} - -type State = { - portal: ethers.Contract - messenger: ethers.Contract - highestUncheckedBlockNumber: number - faultProofWindow: number - forgeryDetected: boolean -} - -export class WithdrawalMonitor extends BaseServiceV2 { - 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: { - highestBlockNumber: { - type: Gauge, - desc: 'Highest block number (checked and known)', - 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) - - // 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('OptimismPortal', 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 - } - - // 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 { - // 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.highestBlockNumber.set({ type: 'known' }, latestL1BlockNumber) - this.metrics.highestBlockNumber.set( - { type: 'checked' }, - 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) { - // Could consider using multicall here but this is efficient enough for now. - const hash = event.args.withdrawalHash - 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 { - // Grab and format the timestamp so it's clear how much time is left. - const block = await event.getBlock() - const ts = `${dateformat( - new Date(block.timestamp * 1000), - 'mmmm dS, yyyy, h:MM:ss TT', - true - )} UTC` - - // 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(1) - - // Return early so that we never increment the highest unchecked block number and therefore - // will continue to loop on this forgery indefinitely. We probably want to change this - // behavior at some point so that we keep scanning for additional forgeries since the - // existence of one forgery likely implies the existence of many others. - return sleep(this.options.sleepTimeMs) - } - } - - // Increment the highest unchecked block number for the next loop. - this.state.highestUncheckedBlockNumber = toBlockNumber - - // If we got through the above without throwing an error, we should be fine to reset. Only case - // where this is relevant is if something is detected as a forgery accidentally and the error - // doesn't happen again on the next loop. - this.state.forgeryDetected = false - this.metrics.isDetectingForgeries.set(0) - } -} - -if (require.main === module) { - const service = new WithdrawalMonitor() - service.run() -} diff --git a/packages/chain-mon/test/fault-mon/helpers.spec.ts b/packages/chain-mon/test/fault-mon/helpers.spec.ts deleted file mode 100644 index f62e484cece8..000000000000 --- a/packages/chain-mon/test/fault-mon/helpers.spec.ts +++ /dev/null @@ -1,247 +0,0 @@ -import hre from 'hardhat' -import '@nomiclabs/hardhat-ethers' -import { Contract, utils } from 'ethers' -import { toRpcHexString } from '@eth-optimism/core-utils' -import Artifact__L2OutputOracle from '@eth-optimism/contracts-bedrock/forge-artifacts/L2OutputOracle.sol/L2OutputOracle.json' -import Artifact__Proxy from '@eth-optimism/contracts-bedrock/forge-artifacts/Proxy.sol/Proxy.json' -import { SignerWithAddress } from '@nomiclabs/hardhat-ethers/signers' - -import { expect } from './setup' -import { - findOutputForIndex, - findFirstUnfinalizedOutputIndex, -} from '../../src/fault-mon' - -describe('helpers', () => { - const deployConfig = { - l2OutputOracleSubmissionInterval: 6, - l2BlockTime: 2, - l2OutputOracleStartingBlockNumber: 0, - l2OutputOracleStartingTimestamp: 0, - l2OutputOracleProposer: '0xf39Fd6e51aad88F6F4ce6aB8827279cffFb92266', - l2OutputOracleChallenger: '0x6925B8704Ff96DEe942623d6FB5e946EF5884b63', - // Can be any non-zero value, 1000 is fine. - finalizationPeriodSeconds: 1000, - } - - let signer: SignerWithAddress - before(async () => { - ;[signer] = await hre.ethers.getSigners() - }) - - let L2OutputOracle: Contract - let Proxy: Contract - beforeEach(async () => { - const Factory__Proxy = new hre.ethers.ContractFactory( - Artifact__Proxy.abi, - Artifact__Proxy.bytecode.object, - signer - ) - - Proxy = await Factory__Proxy.deploy(signer.address) - - const Factory__L2OutputOracle = new hre.ethers.ContractFactory( - Artifact__L2OutputOracle.abi, - Artifact__L2OutputOracle.bytecode.object, - signer - ) - - const L2OutputOracleImplementation = await Factory__L2OutputOracle.deploy() - - await Proxy.upgradeToAndCall( - L2OutputOracleImplementation.address, - L2OutputOracleImplementation.interface.encodeFunctionData('initialize', [ - deployConfig.l2OutputOracleSubmissionInterval, - deployConfig.l2BlockTime, - deployConfig.l2OutputOracleStartingBlockNumber, - deployConfig.l2OutputOracleStartingTimestamp, - deployConfig.l2OutputOracleProposer, - deployConfig.l2OutputOracleChallenger, - deployConfig.finalizationPeriodSeconds, - ]) - ) - - L2OutputOracle = new hre.ethers.Contract( - Proxy.address, - Artifact__L2OutputOracle.abi, - signer - ) - }) - - describe('findOutputForIndex', () => { - describe('when the output exists once', () => { - beforeEach(async () => { - const latestBlock = await hre.ethers.provider.getBlock('latest') - const params = { - _outputRoot: utils.formatBytes32String('testhash'), - _l2BlockNumber: - deployConfig.l2OutputOracleStartingBlockNumber + - deployConfig.l2OutputOracleSubmissionInterval, - _l1BlockHash: latestBlock.hash, - _l1BlockNumber: latestBlock.number, - } - await L2OutputOracle.proposeL2Output( - params._outputRoot, - params._l2BlockNumber, - params._l1BlockHash, - params._l1BlockNumber - ) - }) - - it('should return the output', async () => { - const output = await findOutputForIndex(L2OutputOracle, 0) - - expect(output.l2OutputIndex).to.equal(0) - }) - }) - - describe('when the output does not exist', () => { - it('should throw an error', async () => { - await expect( - findOutputForIndex(L2OutputOracle, 0) - ).to.eventually.be.rejectedWith('unable to find output for index') - }) - }) - }) - - describe('findFirstUnfinalizedIndex', () => { - describe('when the chain is more then FPW seconds old', () => { - beforeEach(async () => { - const latestBlock = await hre.ethers.provider.getBlock('latest') - const params = { - _l2BlockNumber: - deployConfig.l2OutputOracleStartingBlockNumber + - deployConfig.l2OutputOracleSubmissionInterval, - _l1BlockHash: latestBlock.hash, - _l1BlockNumber: latestBlock.number, - } - await L2OutputOracle.proposeL2Output( - utils.formatBytes32String('outputRoot1'), - params._l2BlockNumber, - params._l1BlockHash, - params._l1BlockNumber - ) - - // Simulate FPW passing - await hre.ethers.provider.send('evm_increaseTime', [ - toRpcHexString(deployConfig.finalizationPeriodSeconds * 2), - ]) - - await L2OutputOracle.proposeL2Output( - utils.formatBytes32String('outputRoot2'), - params._l2BlockNumber + deployConfig.l2OutputOracleSubmissionInterval, - params._l1BlockHash, - params._l1BlockNumber - ) - await L2OutputOracle.proposeL2Output( - utils.formatBytes32String('outputRoot3'), - params._l2BlockNumber + - deployConfig.l2OutputOracleSubmissionInterval * 2, - params._l1BlockHash, - params._l1BlockNumber - ) - }) - - it('should find the first batch older than the FPW', async () => { - const first = await findFirstUnfinalizedOutputIndex( - L2OutputOracle, - deployConfig.finalizationPeriodSeconds - ) - - expect(first).to.equal(1) - }) - }) - - describe('when the chain is less than FPW seconds old', () => { - beforeEach(async () => { - const latestBlock = await hre.ethers.provider.getBlock('latest') - const params = { - _outputRoot: utils.formatBytes32String('testhash'), - _l2BlockNumber: - deployConfig.l2OutputOracleStartingBlockNumber + - deployConfig.l2OutputOracleSubmissionInterval, - _l1BlockHash: latestBlock.hash, - _l1BlockNumber: latestBlock.number, - } - await L2OutputOracle.proposeL2Output( - params._outputRoot, - params._l2BlockNumber, - params._l1BlockHash, - params._l1BlockNumber - ) - await L2OutputOracle.proposeL2Output( - params._outputRoot, - params._l2BlockNumber + deployConfig.l2OutputOracleSubmissionInterval, - params._l1BlockHash, - params._l1BlockNumber - ) - await L2OutputOracle.proposeL2Output( - params._outputRoot, - params._l2BlockNumber + - deployConfig.l2OutputOracleSubmissionInterval * 2, - params._l1BlockHash, - params._l1BlockNumber - ) - }) - - it('should return zero', async () => { - const first = await findFirstUnfinalizedOutputIndex( - L2OutputOracle, - deployConfig.finalizationPeriodSeconds - ) - - expect(first).to.equal(0) - }) - }) - - describe('when no batches submitted for the entire FPW', () => { - beforeEach(async () => { - const latestBlock = await hre.ethers.provider.getBlock('latest') - const params = { - _outputRoot: utils.formatBytes32String('testhash'), - _l2BlockNumber: - deployConfig.l2OutputOracleStartingBlockNumber + - deployConfig.l2OutputOracleSubmissionInterval, - _l1BlockHash: latestBlock.hash, - _l1BlockNumber: latestBlock.number, - } - await L2OutputOracle.proposeL2Output( - params._outputRoot, - params._l2BlockNumber, - params._l1BlockHash, - params._l1BlockNumber - ) - await L2OutputOracle.proposeL2Output( - params._outputRoot, - params._l2BlockNumber + deployConfig.l2OutputOracleSubmissionInterval, - params._l1BlockHash, - params._l1BlockNumber - ) - await L2OutputOracle.proposeL2Output( - params._outputRoot, - params._l2BlockNumber + - deployConfig.l2OutputOracleSubmissionInterval * 2, - params._l1BlockHash, - params._l1BlockNumber - ) - - // Simulate FPW passing and no new batches - await hre.ethers.provider.send('evm_increaseTime', [ - toRpcHexString(deployConfig.finalizationPeriodSeconds * 2), - ]) - - // Mine a block to force timestamp to update - await hre.ethers.provider.send('hardhat_mine', ['0x1']) - }) - - it('should return undefined', async () => { - const first = await findFirstUnfinalizedOutputIndex( - L2OutputOracle, - deployConfig.finalizationPeriodSeconds - ) - - expect(first).to.equal(undefined) - }) - }) - }) -}) diff --git a/packages/chain-mon/test/fault-mon/setup.ts b/packages/chain-mon/test/fault-mon/setup.ts deleted file mode 100644 index c20ad0f59006..000000000000 --- a/packages/chain-mon/test/fault-mon/setup.ts +++ /dev/null @@ -1,10 +0,0 @@ -import chai = require('chai') -import chaiAsPromised from 'chai-as-promised' - -// Chai plugins go here. -chai.use(chaiAsPromised) - -const should = chai.should() -const expect = chai.expect - -export { should, expect } diff --git a/packages/chain-mon/tsconfig.json b/packages/chain-mon/tsconfig.json deleted file mode 100644 index f9bea541e657..000000000000 --- a/packages/chain-mon/tsconfig.json +++ /dev/null @@ -1,15 +0,0 @@ -{ - "extends": "../../tsconfig.json", - "compilerOptions": { - "outDir": "./dist", - "skipLibCheck": true - }, - "include": [ - "package.json", - "src/abi/IGnosisSafe.0.8.19.json", - "src/abi/OptimismPortal.json", - "src/**/*", - "contrib/**/*", - "internal/**/*" - ] -} diff --git a/packages/contracts-bedrock/.eslintignore b/packages/contracts-bedrock/.eslintignore deleted file mode 100644 index d8eb5b7a65a2..000000000000 --- a/packages/contracts-bedrock/.eslintignore +++ /dev/null @@ -1,9 +0,0 @@ -# Deps and test files -lib - -# build output -artifacts -forge-artifacts -cache -coverage* -deployments diff --git a/packages/contracts-bedrock/.eslintrc.js b/packages/contracts-bedrock/.eslintrc.js deleted file mode 100644 index 048ff5ebd5b6..000000000000 --- a/packages/contracts-bedrock/.eslintrc.js +++ /dev/null @@ -1,4 +0,0 @@ -module.exports = { - extends: '../../.eslintrc.js', - ignorePatterns: ['src/contract-artifacts.ts'], -} diff --git a/packages/contracts-bedrock/.gas-snapshot b/packages/contracts-bedrock/.gas-snapshot index 25dfa45eaf93..ecfb713d05a0 100644 --- a/packages/contracts-bedrock/.gas-snapshot +++ b/packages/contracts-bedrock/.gas-snapshot @@ -1,11 +1,17 @@ -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 +GasBenchMark_L1BlockIsthmus_DepositsComplete:test_depositsComplete_benchmark() (gas: 7567) +GasBenchMark_L1BlockIsthmus_DepositsComplete_Warm:test_depositsComplete_benchmark() (gas: 5567) +GasBenchMark_L1BlockIsthmus_SetValuesIsthmus:test_setL1BlockValuesIsthmus_benchmark() (gas: 175657) +GasBenchMark_L1BlockIsthmus_SetValuesIsthmus_Warm:test_setL1BlockValuesIsthmus_benchmark() (gas: 5121) +GasBenchMark_L1Block_SetValuesEcotone:test_setL1BlockValuesEcotone_benchmark() (gas: 158531) +GasBenchMark_L1Block_SetValuesEcotone_Warm:test_setL1BlockValuesEcotone_benchmark() (gas: 7597) +GasBenchMark_L1CrossDomainMessenger:test_sendMessage_benchmark_0() (gas: 369242) +GasBenchMark_L1CrossDomainMessenger:test_sendMessage_benchmark_1() (gas: 2967382) +GasBenchMark_L1StandardBridge_Deposit:test_depositERC20_benchmark_0() (gas: 564362) +GasBenchMark_L1StandardBridge_Deposit:test_depositERC20_benchmark_1() (gas: 4076577) +GasBenchMark_L1StandardBridge_Deposit:test_depositETH_benchmark_0() (gas: 467019) +GasBenchMark_L1StandardBridge_Deposit:test_depositETH_benchmark_1() (gas: 3512701) +GasBenchMark_L1StandardBridge_Finalize:test_finalizeETHWithdrawal_benchmark() (gas: 72618) +GasBenchMark_L2OutputOracle:test_proposeL2Output_benchmark() (gas: 92970) +GasBenchMark_OptimismPortal:test_depositTransaction_benchmark() (gas: 68312) +GasBenchMark_OptimismPortal:test_depositTransaction_benchmark_1() (gas: 68943) +GasBenchMark_OptimismPortal:test_proveWithdrawalTransaction_benchmark() (gas: 155607) \ No newline at end of file diff --git a/packages/contracts-bedrock/.gitignore b/packages/contracts-bedrock/.gitignore index 6d5212b28b4e..96e09c8c7190 100644 --- a/packages/contracts-bedrock/.gitignore +++ b/packages/contracts-bedrock/.gitignore @@ -34,7 +34,6 @@ 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/.npmignore b/packages/contracts-bedrock/.npmignore deleted file mode 100644 index 2148c7b285cd..000000000000 --- a/packages/contracts-bedrock/.npmignore +++ /dev/null @@ -1,3 +0,0 @@ -scripts -test -.envrc diff --git a/packages/contracts-bedrock/.testdata/.gitkeep b/packages/contracts-bedrock/.testdata/.gitkeep new file mode 100644 index 000000000000..e69de29bb2d1 diff --git a/packages/contracts-bedrock/CHANGELOG.md b/packages/contracts-bedrock/CHANGELOG.md index 231089ac102d..e4d02f372ade 100644 --- a/packages/contracts-bedrock/CHANGELOG.md +++ b/packages/contracts-bedrock/CHANGELOG.md @@ -1,5 +1,11 @@ # @eth-optimism/contracts-bedrock +## 0.17.3 + +### Patch Changes + +- [#10621](https://github.com/ethereum-optimism/optimism/pull/10621) [`eb454ac72b26211eb8037e7e777315c8f30d994d`](https://github.com/ethereum-optimism/optimism/commit/eb454ac72b26211eb8037e7e777315c8f30d994d) Thanks [@tarunkhasnavis](https://github.com/tarunkhasnavis)! - Add data field to faucet contract drip parameters + ## 0.17.2 ### Patch Changes diff --git a/packages/contracts-bedrock/CONTRIBUTING.md b/packages/contracts-bedrock/CONTRIBUTING.md index 63c579dedf2f..a249ae5bedca 100644 --- a/packages/contracts-bedrock/CONTRIBUTING.md +++ b/packages/contracts-bedrock/CONTRIBUTING.md @@ -51,30 +51,29 @@ Enhancement suggestions are tracked as [GitHub issues](/issues). The best place to begin contributing is by looking through the issues with the `good first issue` label. These are issues that are relatively easy to implement and are a great way to get familiar with the codebase. Optimism's smart contracts are written in Solidity and we use [foundry](https://github.com/foundry-rs/foundry) as our development framework. To get started, you'll need to install several dependencies: -1. [pnpm](https://pnpm.io) - 1. Make sure to `pnpm install` +1. [just](https://github.com/casey/just) + 1. Make sure to `just install` 1. [foundry](https://getfoundry.sh) 1. Foundry is built with [rust](https://www.rust-lang.org/tools/install), and this project uses a pinned version of foundry. Install the rust toolchain with `rustup`. - 1. Make sure to install the version of foundry used by `ci-builder`, defined in the `versions.json` file in the root of this repo under the `foundry` key. Once you have `foundryup` installed, there is a helper to do this: `pnpm install:foundry` + 1. Make sure to install the version of foundry used by `ci-builder`, defined in the `versions.json` file in the root of this repo under the `foundry` key. Once you have `foundryup` installed, there is a helper to do this: `just install-foundry` 1. [golang](https://golang.org/doc/install) 1. [python](https://www.python.org/downloads/) Our [Style Guide](STYLE_GUIDE.md) contains information about the project structure, syntax preferences, naming conventions, and more. Please take a look at it before submitting a PR, and let us know if you spot inconsistencies! -Once you've read the styleguide and are ready to work on your PR, there are a plethora of useful `pnpm` scripts to know about that will help you with development: -1. `pnpm build` Builds the smart contracts. -1. `pnpm test` Runs the full `forge` test suite. -1 `pnpm gas-snapshot` Generates the gas snapshot for the smart contracts. -1. `pnpm semver-lock` Generates the semver lockfile. -1. `pnpm storage-snapshot` Generates the storage lockfile. -1. `pnpm autogen:invariant-docs` Generates the invariant test documentation. -1. `pnpm clean` Removes all build artifacts for `forge` and `go` compilations. -1. `pnpm validate-spacers` Validates the positions of the storage slot spacers. -1. `pnpm validate-deploy-configs` Validates the deployment configurations in `deploy-config` -1. `pnpm slither` Runs the slither static analysis tool on the smart contracts. -1. `pnpm lint` Runs the linter on the smart contracts and scripts. -1. `pnpm pre-pr` Runs most checks, generators, and linters prior to a PR. For most PRs, this is sufficient to pass CI if everything is in order. -1. `pnpm pre-pr:full` Runs all checks, generators, and linters prior to a PR. +Once you've read the style guide and are ready to work on your PR, there are a plethora of useful `just` scripts to know about that will help you with development. +You can run `just -l` to list them all, some of the key ones are: +1. `just build` Builds the smart contracts. +1. `just test` Runs the full `forge` test suite. +1 `just gas-snapshot` Generates the gas snapshot for the smart contracts. +1. `just semver-lock` Generates the semver lockfile. +1. `just snapshots` Generates the storage and ABI snapshots. +1. `just clean` Removes all build artifacts for `forge` and `go` compilations. +1. `just validate-spacers` Validates the positions of the storage slot spacers. +1. `just validate-deploy-configs` Validates the deployment configurations in `deploy-config` +1. `just lint` Runs the linter on the smart contracts and scripts. +1. `just pre-pr` Runs most checks, generators, and linters prior to a PR. For most PRs, this is sufficient to pass CI if everything is in order. +1. `just pre-pr-full` Runs all checks, generators, and linters prior to a PR. ### Improving The Documentation @@ -82,7 +81,7 @@ Documentation improvements are more than welcome! If you see a typo or feel that ### Deploying on Devnet -To deploy the smart contracts on a local devnet, run `make devnet-up` in the monorepo root. For more information on the local devnet, see [devnet.md](../../specs/meta/devnet.md). +To deploy the smart contracts on a local devnet, run `make devnet-up` in the monorepo root. For more information on the local devnet, see [dev-node](https://docs.optimism.io/chain/testing/dev-node). ### Tools @@ -90,11 +89,11 @@ To deploy the smart contracts on a local devnet, run `make devnet-up` in the mon In order to make sure that we don't accidentally overwrite storage slots, contract storage layouts are checked to make sure spacing is correct. -This uses the `.storage-layout` file to check contract spacing. Run `pnpm validate-spacers` to check the spacing of all contracts. +This uses the `snapshots/storageLayout` directory to check contract spacing. Run `just validate-spacers` to check the spacing of all contracts. #### Gas Snapshots -We use forge's `gas-snapshot` subcommand to produce a gas snapshot for most tests within our suite. CI will check that the gas snapshot has been updated properly when it runs, so make sure to run `pnpm gas-snapshot`! +We use forge's `gas-snapshot` subcommand to produce a gas snapshot for tests in `Benchmark.t.sol`. CI will check that the gas snapshot has been updated properly when it runs, so make sure to run `just gas-snapshot`! #### Semver Locking @@ -102,4 +101,4 @@ Many of our smart contracts are semantically versioned. To make sure that change #### Storage Snapshots -Due to the many proxied contracts in Optimism's protocol, we automate tracking the diff to storage layouts of the contracts in the project. This is to ensure that we don't break a proxy by upgrading its implementation to a contract with a different storage layout. To generate the storage lockfile, run `pnpm storage-snapshot`. +Due to the many proxied contracts in Optimism's protocol, we automate tracking the diff to storage layouts of the contracts in the project. This is to ensure that we don't break a proxy by upgrading its implementation to a contract with a different storage layout. To generate the storage lockfile, run `just snapshots`. diff --git a/packages/contracts-bedrock/README.md b/packages/contracts-bedrock/README.md index 216e84b7af58..cc687ce6ae97 100644 --- a/packages/contracts-bedrock/README.md +++ b/packages/contracts-bedrock/README.md @@ -9,11 +9,6 @@ High-level information about these contracts can be found within this README and ## 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) @@ -22,7 +17,10 @@ High-level information about these contracts can be found within this README and - [Contributing Guide](#contributing-guide) - [Style Guide](#style-guide) - [Deployment](#deployment) + - [Deploying Production Networks](#deploying-production-networks) +- [Generating L2 Genesis Allocs](#generating-l2-genesis-allocs) - [Configuration](#configuration) + - [Custom Gas Token](#custom-gas-token) - [Execution](#execution) - [Deploying a single contract](#deploying-a-single-contract) - [Testing](#testing) @@ -33,198 +31,7 @@ High-level information about these contracts can be found within this README and ## 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; -``` - -#### 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; -``` - -#### Notes for Core L2 Smart Contracts - -- 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). - -### Smart Contract Proxies - -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. - -```mermaid -graph LR - ProxyAdminOwner(Proxy Admin Owner) - ProxyAdmin(ProxyAdmin) - - subgraph "Logical Smart Contract" - Proxy(Proxy) - Implementation(Implementation) - end - - ProxyAdminOwner -->|manages| ProxyAdmin - ProxyAdmin -->|upgrades| Proxy - Proxy -->|delegatecall| Implementation - - classDef l1Contracts stroke:#bbf,stroke-width:2px; - classDef systemUser stroke:#f9a,stroke-width:2px; - class Proxy l1Contracts; - class ProxyAdminOwner systemUser; -``` +Refer to the [Optimism Overview page within the OP Stack Specs](https://specs.optimism.io/protocol/overview.html#architecture-overview) for a detailed architecture overview of core L1 contracts, core L2 contracts, and smart contract proxies. ## External Usage @@ -233,7 +40,7 @@ graph LR OP Stack smart contracts are published to NPM and can be installed via: ```sh -npm install @eth-optimism/contracts-bedrock. +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. @@ -266,29 +73,83 @@ Maintaining a consistent code style makes code easier to review and maintain, ul ## Deployment -The smart contracts are deployed using `foundry` with a `hardhat-deploy` compatibility layer. When the contracts are deployed, -they will write a temp file to disk that can then be formatted into a `hardhat-deploy` style artifact by calling another script. +The smart contracts are deployed using `foundry`. The `DEPLOYMENT_OUTFILE` env var will determine the filepath that the +deployment artifact is written to on disk after the deployment. It comes in the form of a JSON file where keys are +the names of the contracts and the values are the addresses the contract was deployed to. + +The `DEPLOY_CONFIG_PATH` is a filepath to a deploy config file, see the `deploy-config` directory for examples and the +[DeployConfig](https://github.com/ethereum-optimism/optimism/blob/develop/op-chain-ops/genesis/config.go) definition for +descriptions of the values. +If you are following the official deployment tutorial, please make sure to use the `getting-started.json` file. + +```bash +DEPLOYMENT_OUTFILE=deployments/artifact.json \ +DEPLOY_CONFIG_PATH= \ + forge script scripts/deploy/Deploy.s.sol:Deploy \ + --broadcast --private-key $PRIVATE_KEY \ + --rpc-url $ETH_RPC_URL +``` + +The `IMPL_SALT` env var can be used to set the `create2` salt for deploying the implementation +contracts. + +This will deploy an entire new system of L1 smart contracts including a new `SuperchainConfig`. +In the future there will be an easy way to deploy only proxies and use shared implementations +for each of the contracts as well as a shared `SuperchainConfig` contract. + +### Deploying Production Networks + +Production users should deploy their L1 contracts from a contracts release. +All contracts releases are on git tags with the following format: `op-contracts/vX.Y.Z`. +See the [release process](https://github.com/ethereum-optimism/optimism?tab=readme-ov-file#development-and-release-process) +for more information. + +## Generating L2 Genesis Allocs -The addresses in the `deployments` directory will be read into the script based on the backend's chain id. -To manually define the set of addresses used in the script, set the `CONTRACT_ADDRESSES_PATH` env var to a path on the local -filesystem that points to a JSON file full of key value pairs where the keys are names of contracts and the -values are addresses. This works well with the JSON files in `superchain-ops`. +A foundry script is used to generate the L2 genesis allocs. This is a JSON file that represents the L2 genesis state. +The `CONTRACT_ADDRESSES_PATH` env var represents the deployment artifact that was generated during a contract deployment. +The same deploy config JSON file should be used for L1 contracts deployment as when generating the L2 genesis allocs. +The `STATE_DUMP_PATH` env var represents the filepath at which the allocs will be written to on disk. + +```bash +CONTRACT_ADDRESSES_PATH=deployments/artifact.json \ +DEPLOY_CONFIG_PATH= \ +STATE_DUMP_PATH= \ + forge script scripts/L2Genesis.s.sol:L2Genesis \ + --sig 'runWithStateDump()' +``` ### 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. + +The script will read the latest active fork from the deploy config and the L2 genesis allocs generated will be +compatible with this fork. The automatically detected fork can be overwritten by setting the environment variable +`FORK` either to the lower-case fork name (currently `delta`, `ecotone`, `fjord`, or `granite`) or to `latest`, which +will select the latest fork available (currently `granite`). + +By default, the script will dump the L2 genesis allocs of the detected or selected fork only, to the file at `STATE_DUMP_PATH`. +The optional environment variable `OUTPUT_MODE` allows to modify this behavior by setting it to one of the following values: +* `latest` (default) - only dump the selected fork's allocs. +* `all` - also dump all intermediary fork's allocs. This only works if `STATE_DUMP_PATH` is _not_ set. In this case, all allocs + will be written to files `/state-dump-.json`. Another path cannot currently be specified for this use case. +* `none` - won't dump any allocs. Only makes sense for internal test usage. + +#### 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`. +Run the deployment with state diffs by executing: `forge script -vvv scripts/deploy/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. Deploy the contracts with `forge script -vvv scripts/Deploy.s.sol:Deploy --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 `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/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 @@ -305,7 +166,7 @@ to reduce the overhead of maintaining multiple ways to set up the state as well The L1 contract addresses are held in `deployments/hardhat/.deploy` and the L2 test state is held in a `.testdata` directory. The L1 addresses are used to create the L2 state and it is possible for stale addresses to be pulled into the L2 state, causing tests to fail. Stale addresses may happen if the order of the L1 deployments happen differently -since some contracts are deployed using `CREATE`. Run `pnpm clean` and rerun the tests if they are failing for an unknown reason. +since some contracts are deployed using `CREATE`. Run `just clean` and rerun the tests if they are failing for an unknown reason. ### Static Analysis diff --git a/packages/contracts-bedrock/STYLE_GUIDE.md b/packages/contracts-bedrock/STYLE_GUIDE.md index a27d5b0e5721..1d8b84818b9b 100644 --- a/packages/contracts-bedrock/STYLE_GUIDE.md +++ b/packages/contracts-bedrock/STYLE_GUIDE.md @@ -96,37 +96,49 @@ Spacers MUST be `private`. All contracts should be assumed to live behind proxies (except in certain special circumstances). This means that new contracts MUST be built under the assumption of upgradeability. -We use a minimal [`Proxy`](./contracts/universal/Proxy.sol) contract designed to be owned by a -corresponding [`ProxyAdmin`](./contracts/universal/ProxyAdmin.sol) which follow the interfaces +We use a minimal [`Proxy`](./src/universal/Proxy.sol) contract designed to be owned by a +corresponding [`ProxyAdmin`](./src/universal/ProxyAdmin.sol) which follow the interfaces of OpenZeppelin's `Proxy` and `ProxyAdmin` contracts, respectively. Unless explicitly discussed otherwise, you MUST include the following basic upgradeability pattern for each new implementation contract: 1. Extend OpenZeppelin's `Initializable` base contract. -2. Include a `uint8 public constant VERSION = X` at the TOP of your contract. -3. Include a function `initialize` with the modifier `reinitializer(VERSION)`. -4. In the `constructor`, set any `immutable` variables and call the `initialize` function for setting mutables. +2. Include a function `initialize` with the modifier `initializer()`. +3. In the `constructor`: + 1. Call `_disableInitializers()` to ensure the implementation contract cannot be initialized. + 2. Set any immutables. However, we generally prefer to not use immutables to ensure the same implementation contracts can be used for all chains, and to allow chain operators to dynamically configure parameters + +Because `reinitializer(uint64 version)` is not used, the process for upgrading the implementation is to atomically: +1. Upgrade the implementation to the `StorageSetter` contract. +2. Use that to set the initialized slot (typically slot 0) to zero. +3. Upgrade the implementation to the desired new implementation and `initialize` it. ### Versioning -All (non-library and non-abstract) contracts MUST extend the `Semver` base contract which +All (non-library and non-abstract) contracts MUST inherit the `ISemver` interface which exposes a `version()` function that returns a semver-compliant version string. -Contracts must have a `Semver` of `1.0.0` or greater to be production ready. Contracts -with `Semver` values less than `1.0.0` should only be used locally or on devnets. +Contracts must have a `version` of `1.0.0` or greater to be production ready. -Additionally, contracts MUST use the following versioning scheme: +Additionally, contracts MUST use the following versioning scheme when incrementing their version: - `patch` releases are to be used only for changes that do NOT modify contract bytecode (such as updating comments). - `minor` releases are to be used for changes that modify bytecode OR changes that expand the contract ABI provided that these changes do NOT break the existing interface. - `major` releases are to be used for changes that break the existing contract interface OR changes that modify the security model of a contract. +The remainder of the contract versioning and release process can be found in [`VERSIONING.md](./VERSIONING.md). + #### Exceptions We have made an exception to the `Semver` rule for the `WETH` contract to avoid making changes to a well-known, simple, and recognizable contract. +Additionally, bumping the patch version does change the bytecode, so another exception is carved out for this. +In other words, changing comments increments the patch version, which changes bytecode. This bytecode +change implies a minor version increment is needed, but because it's just a version change, only a +patch increment should be used. + ### Dependencies Where basic functionality is already supported by an existing contract in the OpenZeppelin library, diff --git a/packages/contracts-bedrock/VERSIONING.md b/packages/contracts-bedrock/VERSIONING.md new file mode 100644 index 000000000000..fefc2211b3e5 --- /dev/null +++ b/packages/contracts-bedrock/VERSIONING.md @@ -0,0 +1,132 @@ +# Smart Contract Versioning and Release Process + +The Smart Contract Versioning and Release Process closely follows a true [semver](https://semver.org) for both individual contracts and monorepo releases. +However, there are some changes to accommodate the unique nature of smart contract development and governance cycles. + +There are five parts to the versioning and release process: + +- [Semver Rules](#semver-rules): Follows the rules defined in the [style guide](./STYLE_GUIDE.md#versioning) for when to bump major, minor, and patch versions in individual contracts. +- [Individual Contract Versioning](#individual-contract-versioning): The versioning scheme for individual contracts and includes beta, release candidate, and feature tags. +- [Monorepo Contracts Release Versioning](#monorepo-contracts-release-versioning): The versioning scheme for monorepo smart contract releases. +- [Release Process](#release-process): The process for deploying contracts, creating a governance proposal, and the required associated releases. + - [Additional Release Candidates](#additional-release-candidates): How to handle additional release candidates after an initial `op-contracts/vX.Y.Z-rc.1` release. + - [Merging Back to Develop After Governance Approval](#merging-back-to-develop-after-governance-approval): Explains how to choose the resulting contract versions when merging back into `develop`. +- [Changelog](#changelog): A CHANGELOG for contract releases is maintained. + +> [!NOTE] +> The rules described in this document must be enforced manually. +> Ideally, a check can be added to CI to enforce the conventions defined here, but this is not currently implemented. + +## Semver Rules + +Version increments follow the [style guide rules](./STYLE_GUIDE.md#versioning) for when to bump major, minor, and patch versions in individual contracts: + +> - `patch` releases are to be used only for changes that do NOT modify contract bytecode (such as updating comments). +> - `minor` releases are to be used for changes that modify bytecode OR changes that expand the contract ABI provided that these changes do NOT break the existing interface. +> - `major` releases are to be used for changes that break the existing contract interface OR changes that modify the security model of a contract. +> +> Bumping the patch version does change the bytecode, so another exception is carved out for this. +> In other words, changing comments increments the patch version, which changes bytecode. This bytecode +> change implies a minor version increment is needed, but because it's just a version change, only a +> patch increment should be used. + +## Individual Contract Versioning + +Versioning for individual contracts works as follows: + +- A contract is only `X.Y.Z` on `develop` if it has been governance approved. If it's `X.Y.Z` before that, it must be on a branch. More on this below. +- For contracts undergoing development, a `-beta.n` identifier must be appended to the version number. +- For contracts in a release candidate state, an `-rc.n` identifier must be appended to the version number. +- For contracts with feature-specific changes, a `+feature-name` identifier must be appended to the version number. See the [Smart Contract Feature Development](https://github.com/ethereum-optimism/design-docs/blob/main/smart-contract-feature-development.md) design document to learn more. +- When making changes to a contract, always bump to the lowest possible version based on the specific change you are making. We do not want to e.g. optimistically bump to a major version, because protocol development sequencing may change unexpectedly. Use these examples to know how to bump the version: + - Example 1: A contract is currently on `1.2.3`. + - We don't yet know when the next release of this contract will be. However, you are simply fixing typos in comments so you bump the version to `1.2.4-beta.1`. + - The next PR made to that same contract clarifies some comments, so it bumps the version to `1.2.4-beta.2`. + - The next PR introduces a breaking change, which bumps the version from `1.2.4-beta.2` to `2.0.0-beta.1`. A `1.2.4-rc.1` and `1.2.4` version both never exist. + - Example 2: A contract is currently on `2.4.7`. + - We know the next release of this contract will be a breaking change. Regardless, as you start development by fixing typos in comments, bump the version to `2.4.8-beta.1`. This is because we may end up putting out a release before the breaking change is added. + - Once you start working on the breaking change, bump the version to `3.0.0-beta.1`. + - Continue to bump the beta version as you make changes. When the contract is ready for release, bump the version to `3.0.0-rc.1`. +- New contracts start at `1.0.0-beta.1`, increment the `-beta.n` counter during development, and become `1.0.0` when they are ready for production. + +## Monorepo Contracts Release Versioning + +Versioning for monorepo releases works as follows: + +- Monorepo releases continue to follow the `op-contracts/vX.Y.Z` naming convention. +- The version used for the next release is determined by the highest version bump of any individual contract in the release. + - Example 1: The monorepo is at `op-contracts/v1.5.0`. Clarifying comments are made in contracts, so all contracts only bump the patch version. The next monorepo release will be `op-contracts/v1.5.1`. + - Example 2: The monorepo is at `op-contracts/v1.5.1`. Various tech debt and code is cleaned up in contracts, but no features are added, so at most, contracts bumped the minor version. The next monorepo release will be `op-contracts/v1.6.0`. + - Example 3: The monorepo is at `op-contracts/v1.5.1`. Legacy `ALL_CAPS()` getter methods are removed from a contract, causing that contract to bump the major version. The next monorepo release will be `op-contracts/v2.0.0`. +- Feature specific monorepo releases (such as a beta release of the custom gas token feature) are supported, and should follow the guidelines in the [Smart Contract Feature Development](https://github.com/ethereum-optimism/design-docs/blob/main/smart-contract-feature-development.md) design doc. Bump the overall monorepo semver as required by the above rules, and append the `-beta,n` modifier to the version number. For example, if the last release before the custom gas token feature was `op-contracts/v1.5.1`, because the custom gas token introduces breaking changes, its beta release will be `op-contracts/v2.0.0-beta.n`. + - A subsequent release of the custom gas token feature that fixes bugs and introduces an additional breaking change would be `op-contracts/v2.0.0-beta.2`. + - This means `+feature-name` naming is not used for monorepo releases, only for individual contracts as described below. +- A monorepo contracts release must map to an exact set of contract semvers, and this mapping must be defined in the contract release notes which are the source of truth. See [`op-contracts/v1.4.0-rc.4`](https://github.com/ethereum-optimism/optimism/releases/tag/op-contracts%2Fv1.4.0-rc.4) for an example of what release notes should look like. + +## Release Process + +When a release is proposed to governance, the proposal includes a commit hash, and often the +contracts from that commit hash are already deployed to mainnet with their addresses included +in the proposal. +For example, the [Fault Proofs governance proposal](https://gov.optimism.io/t/upgrade-proposal-fault-proofs/8161) provides specific addresses that will be used. + +To accommodate this, once contract changes are ready for governance approval, the release flow is: + +- On the `develop` branch, bump the version of all contracts to be included in this release to their respective `X.Y.Z-rc.n`. The `X.Y.Z` here refers to the contract-specific versions, so it differs per-contract. The `-rc.n` begins as `-rc.1` for all contracts. + - Any `-beta.n` and `+feature-name` identifiers are removed at this point. + - Contracts that are not included as part of this release are left untouched. +- Branch off of `develop` and create a branch named `proposal/op-contracts/vX.Y.Z`. Here, `X.Y.Z` is the new version of the monorepo release. + - Using the `proposal/` prefix signals that this branch is for a governance proposal, and intentionally does not convey whether or not the proposal has passed. +- Open a PR into the `proposal/op-contracts/vX.Y.Z` branch that removes the `-rc.1` suffixes from all contracts, and merge it into the `proposal/op-contracts/vX.Y.Z` branch. + - After merge, the new commit on the `proposal/op-contracts/vX.Y.Z` branch is the commit hash that will be tagged as `op-contracts/vX.Y.Z-rc.1`, used to deploy the contracts, and proposed to governance. + - Sometimes additional release candidates are needed before proposal—see [Additional Release Candidates](#additional-release-candidates) for more information on this flow. +- Once the governance approval is posted, any lock on contracts on `develop` is released. +- Once governance approves the proposal: + - Create the official `op-contracts/vX.Y.Z` off of this `proposal/op-contracts/vX.Y.Z` branch. It should be at the same commit as the most recent release candidate. + - Merge the proposal branch into `develop` and set the version of all contracts to the appropriate `X.Y.Z` after considering any changes made to `develop` since the release candidate was created. + - See [Merging Back to Develop After Governance Approval](#merging-back-to-develop-after-governance-approval) for more information on how to choose the resulting contract versions when merging back into `develop`. + +### Additional Release Candidates + +Sometimes additional release candidate versions are needed. +The process for this is: + +- Make the fixes on `develop`. Increment the `-rc.n` qualifier for the changed contracts only. +- Open a PR into the `proposal/op-contracts/vX.Y.Z` branch that incorporates the changes from `develop`. +- Open another PR to remove the new `-rc.2` version identifiers from the changed contracts. Tag the resulting commit on the proposal branch as `op-contracts/vX.Y.Z-rc.2`. +- This flow (1) ensures develop stays up to date during the release process, (2) mitigates the risk of forgetting to merge the release back into the develop branch, and (3) mitigates the risk of the merge into develop removing the required `-rc.n` version that is needed until the release is approved. + +### Merging Back to Develop After Governance Approval + +A release will change a set of contracts, and those contracts may have changed on `develop` since the release candidate was created. + +If there have been no changes to a contract since the release candidate, the version of that contract stays at `X.Y.Z` and just has the `-rc.n` removed. +For example, if the release candidate is `1.2.3-rc.1`, the resulting version on `develop` will be `1.2.3`. + +If there have been changes to a contract, the `X.Y.Z` will stay the same as whatever is the latest version on `develop`, with the `-beta.n` qualifier incremented. + +For example, given that ContractA is `1.2.3-rc.1` on develop, then the initial sequence of events is: + +- We create the release branch, and on that branch remove the `-rc.1`, giving a final ContractA version on that branch of `1.2.3` +- Governance proposal is posted, pointing to the corresponding monorepo tag. +- Governance approves the release. +- Open a PR to merge the final versions of the contracts (ContractA) back into develop. + +Now there are two scenarios for the PR that merges the release branch back into develop: + +1. On develop, no changes have been made to ContractA. The PR therefore changes ContractA's version on develop from `1.2.3-rc.1` to `1.2.3`, and no other changes to ContractA occur. +2. On develop, breaking changes have been made to ContractA for a new feature, and it's currently versioned as `2.0.0-beta.3`. The PR should bump the version to `2.0.0-beta.4` if it changes the source code of ContractA. + - In practice, this one unlikely to occur when using inheritance for feature development, as specified in [Smart Contract Feature Development](https://github.com/ethereum-optimism/design-docs/blob/main/smart-contract-feature-development.md) architecture. It's more likely that (1) is the case, and we merge the version change into the base contract. + +This flow also provides a dedicated branch for each release, making it easy to deploy a patch or bug fix, regardless of other changes that may have occurred on develop since the release. + +## Changelog + +Lastly, a CHANGELOG for contract releases must be maintained: + +- Each upcoming release will have a tracking issue that documents the new versions of each contract that will be included in the release, along with links to the PRs that made the changes. +- Every contracts PR must have an accompanying changelog entry in a tracking issue once it is merged. +- Tracking issue titles should be named based on the expected Upgrade number they will go to governance with, e.g. "op-contracts changelog: Upgrade 9". + - See [ethereum-optimism/optimism#10592](https://github.com/ethereum-optimism/optimism/issues/10592) for an example of what this tracking issue should look like. + - We do not include a version number in the issue because it may be hard to predict the final version number of a release until all PRs are merged. + - Using upgrade numbers also acts as a forcing function to ensure upgrade sequencing and the governance process is accounted for early in the development process. diff --git a/packages/contracts-bedrock/periphery-deploy-config/4202.json b/packages/contracts-bedrock/deploy-config-periphery/deploy/4202.json similarity index 100% rename from packages/contracts-bedrock/periphery-deploy-config/4202.json rename to packages/contracts-bedrock/deploy-config-periphery/deploy/4202.json diff --git a/packages/contracts-bedrock/periphery-deploy-config/4460.json b/packages/contracts-bedrock/deploy-config-periphery/deploy/4460.json similarity index 100% rename from packages/contracts-bedrock/periphery-deploy-config/4460.json rename to packages/contracts-bedrock/deploy-config-periphery/deploy/4460.json diff --git a/packages/contracts-bedrock/periphery-deploy-config/58008.json b/packages/contracts-bedrock/deploy-config-periphery/deploy/58008.json similarity index 100% rename from packages/contracts-bedrock/periphery-deploy-config/58008.json rename to packages/contracts-bedrock/deploy-config-periphery/deploy/58008.json diff --git a/packages/contracts-bedrock/periphery-deploy-config/84532.json b/packages/contracts-bedrock/deploy-config-periphery/deploy/84532.json similarity index 100% rename from packages/contracts-bedrock/periphery-deploy-config/84532.json rename to packages/contracts-bedrock/deploy-config-periphery/deploy/84532.json diff --git a/packages/contracts-bedrock/periphery-deploy-config/901.json b/packages/contracts-bedrock/deploy-config-periphery/deploy/901.json similarity index 100% rename from packages/contracts-bedrock/periphery-deploy-config/901.json rename to packages/contracts-bedrock/deploy-config-periphery/deploy/901.json diff --git a/packages/contracts-bedrock/periphery-deploy-config/919.json b/packages/contracts-bedrock/deploy-config-periphery/deploy/919.json similarity index 100% rename from packages/contracts-bedrock/periphery-deploy-config/919.json rename to packages/contracts-bedrock/deploy-config-periphery/deploy/919.json diff --git a/packages/contracts-bedrock/periphery-deploy-config/999999999.json b/packages/contracts-bedrock/deploy-config-periphery/deploy/999999999.json similarity index 100% rename from packages/contracts-bedrock/periphery-deploy-config/999999999.json rename to packages/contracts-bedrock/deploy-config-periphery/deploy/999999999.json diff --git a/packages/contracts-bedrock/periphery-deploy-config/optimism-goerli.json b/packages/contracts-bedrock/deploy-config-periphery/deploy/optimism-goerli.json similarity index 100% rename from packages/contracts-bedrock/periphery-deploy-config/optimism-goerli.json rename to packages/contracts-bedrock/deploy-config-periphery/deploy/optimism-goerli.json diff --git a/packages/contracts-bedrock/periphery-deploy-config/optimism-sepolia.json b/packages/contracts-bedrock/deploy-config-periphery/deploy/optimism-sepolia.json similarity index 100% rename from packages/contracts-bedrock/periphery-deploy-config/optimism-sepolia.json rename to packages/contracts-bedrock/deploy-config-periphery/deploy/optimism-sepolia.json diff --git a/packages/contracts-bedrock/deploy-config-periphery/deploy/sepolia.json b/packages/contracts-bedrock/deploy-config-periphery/deploy/sepolia.json new file mode 100644 index 000000000000..614b6380ef26 --- /dev/null +++ b/packages/contracts-bedrock/deploy-config-periphery/deploy/sepolia.json @@ -0,0 +1,23 @@ +{ + "create2DeploymentSalt": "0.0.7", + + "gelatoAutomateContract": "0x2A6C106ae13B558BB9E2Ec64Bd2f1f7BEFF3A5E0", + + "operationsDrippieOwner": "0xCd438409d5Cac9D2E076Ac7Bd0Bf2377E99BB6e4", + "faucetDrippieOwner": "0x10ab157483dd308f8B38aCF2ad823dfD255F56b5", + + "opChainAdminWalletDripValue": 1000000000000000000, + "opChainAdminWalletDripInterval": 2592000, + + "faucetAdmin": "0x212E789D4523D4BAF464f8Fb2A9B9dff2B36e5A6", + "faucetOnchainAuthModuleAdmin": "0xFe44Ae787A632c45ACea658492dDBebE39f002aC", + "faucetOnchainAuthModuleTtl": 86400, + "faucetOnchainAuthModuleAmount": 1000000000000000000, + "faucetOffchainAuthModuleAdmin": "0xFe44Ae787A632c45ACea658492dDBebE39f002aC", + "faucetOffchainAuthModuleTtl": 86400, + "faucetOffchainAuthModuleAmount": 50000000000000000, + + "deployDripchecks": true, + "deployFaucetContracts": false, + "deployOperationsContracts": true +} diff --git a/packages/contracts-bedrock/deploy-config-periphery/drippie/sepolia-faucet-bridges.json b/packages/contracts-bedrock/deploy-config-periphery/drippie/sepolia-faucet-bridges.json new file mode 100644 index 000000000000..30d3cdc4447b --- /dev/null +++ b/packages/contracts-bedrock/deploy-config-periphery/drippie/sepolia-faucet-bridges.json @@ -0,0 +1,103 @@ +{ + "drippie": "0xd6F935Bd272BEE05bD64096D82970482EF16D64b", + "gelato": "0x859E31b3848Ec384012EECc72C5c49821008296C", + + "__comment": "Addresses of dripcheck contracts to be used in drips", + "dripchecks": [ + { + "00__name": "CheckBalanceLow", + "01__address": "0xaF8C77CfeB57620c4D9dCC81df75a1F0Da7064Af" + }, + { + "00__name": "CheckGelatoLow", + "01__address": "0x0fF11AfAC4146a0bABf7F9F042a22C8053a54674" + }, + { + "00__name": "CheckSecrets", + "01__address": "0x32c1e36E733913388076D7c3055300072814bF2A" + }, + { + "00__name": "CheckTrue", + "01__address": "0xcBCb3896Ddec35d91901768733C5d3738e10509F" + } + ], + + "__comment": "Prefix is used to namespace drips so that drip management can be handled modularly", + "prefix": "faucetbridged", + + "__comment": "Object attributes below are prefixed with numbers because of how foundry parses JSON into structs in alphabetical order", + "drips": [ + { + "00__name": "opmainnet_v1", + "01__dripcheck": "CheckTrue", + "02__checkparams": {}, + "03__recipient": "0xFBb0621E0B23b5478B630BD55a5f21f67730B0F1", + "04__value": 34000000000000000000, + "05__interval": 86400, + "06__data": "0x000000000000000000000000f21d42203af9af1c86e1e8ac501b41f5bc004a0a0000000000000000000000000000000000000000000000000000000000030d4000000000000000000000000000000000000000000000000000000000000000600000000000000000000000000000000000000000000000000000000000000000" + }, + { + "00__name": "base_v1", + "01__dripcheck": "CheckTrue", + "02__checkparams": {}, + "03__recipient": "0xfd0Bf71F60660E2f608ed56e1659C450eB113120", + "04__value": 34000000000000000000, + "05__interval": 86400, + "06__data": "0x000000000000000000000000f21d42203af9af1c86e1e8ac501b41f5bc004a0a0000000000000000000000000000000000000000000000000000000000030d4000000000000000000000000000000000000000000000000000000000000000600000000000000000000000000000000000000000000000000000000000000000" + }, + { + "00__name": "zora_v1", + "01__dripcheck": "CheckTrue", + "02__checkparams": {}, + "03__recipient": "0x5376f1D543dcbB5BD416c56C189e4cB7399fCcCB", + "04__value": 34000000000000000000, + "05__interval": 86400, + "06__data": "0x000000000000000000000000f21d42203af9af1c86e1e8ac501b41f5bc004a0a0000000000000000000000000000000000000000000000000000000000030d4000000000000000000000000000000000000000000000000000000000000000600000000000000000000000000000000000000000000000000000000000000000" + }, + { + "00__name": "pgn_v1", + "01__dripcheck": "CheckTrue", + "02__checkparams": {}, + "03__recipient": "0xFaE6abCAF30D23e233AC7faF747F2fC3a5a6Bfa3", + "04__value": 34000000000000000000, + "05__interval": 86400, + "06__data": "0x000000000000000000000000f21d42203af9af1c86e1e8ac501b41f5bc004a0a0000000000000000000000000000000000000000000000000000000000030d4000000000000000000000000000000000000000000000000000000000000000600000000000000000000000000000000000000000000000000000000000000000" + }, + { + "00__name": "orderly_v1", + "01__dripcheck": "CheckTrue", + "02__checkparams": {}, + "03__recipient": "0x1Af0494040d6904A9F3EE21921de4b359C736333", + "04__value": 34000000000000000000, + "05__interval": 86400, + "06__data": "0x000000000000000000000000f21d42203af9af1c86e1e8ac501b41f5bc004a0a0000000000000000000000000000000000000000000000000000000000030d4000000000000000000000000000000000000000000000000000000000000000600000000000000000000000000000000000000000000000000000000000000000" + }, + { + "00__name": "mode_v1", + "01__dripcheck": "CheckTrue", + "02__checkparams": {}, + "03__recipient": "0xbC5C679879B2965296756CD959C3C739769995E2", + "04__value": 34000000000000000000, + "05__interval": 86400, + "06__data": "0x000000000000000000000000f21d42203af9af1c86e1e8ac501b41f5bc004a0a0000000000000000000000000000000000000000000000000000000000030d4000000000000000000000000000000000000000000000000000000000000000600000000000000000000000000000000000000000000000000000000000000000" + }, + { + "00__name": "lyra_v1", + "01__dripcheck": "CheckTrue", + "02__checkparams": {}, + "03__recipient": "0x915f179A77FB2e1AeA8b56Ebc0D75A7e1A8a7A17", + "04__value": 34000000000000000000, + "05__interval": 86400, + "06__data": "0x000000000000000000000000f21d42203af9af1c86e1e8ac501b41f5bc004a0a0000000000000000000000000000000000000000000000000000000000030d4000000000000000000000000000000000000000000000000000000000000000600000000000000000000000000000000000000000000000000000000000000000" + }, + { + "00__name": "lisk_v1", + "01__dripcheck": "CheckTrue", + "02__checkparams": {}, + "03__recipient": "0x1Fb30e446eA791cd1f011675E5F3f5311b70faF5", + "04__value": 34000000000000000000, + "05__interval": 86400, + "06__data": "0x000000000000000000000000f21d42203af9af1c86e1e8ac501b41f5bc004a0a0000000000000000000000000000000000000000000000000000000000030d4000000000000000000000000000000000000000000000000000000000000000600000000000000000000000000000000000000000000000000000000000000000" + } + ] +} diff --git a/packages/contracts-bedrock/deploy-config-periphery/drippie/sepolia-faucet-core.json b/packages/contracts-bedrock/deploy-config-periphery/drippie/sepolia-faucet-core.json new file mode 100644 index 000000000000..7b9e0181330a --- /dev/null +++ b/packages/contracts-bedrock/deploy-config-periphery/drippie/sepolia-faucet-core.json @@ -0,0 +1,80 @@ +{ + "drippie": "0xd6F935Bd272BEE05bD64096D82970482EF16D64b", + "gelato": "0x859E31b3848Ec384012EECc72C5c49821008296C", + + "__comment": "Addresses of dripcheck contracts to be used in drips", + "dripchecks": [ + { + "00__name": "CheckBalanceLow", + "01__address": "0xaF8C77CfeB57620c4D9dCC81df75a1F0Da7064Af" + }, + { + "00__name": "CheckGelatoLow", + "01__address": "0x0fF11AfAC4146a0bABf7F9F042a22C8053a54674" + }, + { + "00__name": "CheckSecrets", + "01__address": "0x32c1e36E733913388076D7c3055300072814bF2A" + }, + { + "00__name": "CheckTrue", + "01__address": "0xcBCb3896Ddec35d91901768733C5d3738e10509F" + } + ], + + "__comment": "Prefix is used to namespace drips so that drip management can be handled modularly", + "prefix": "faucetcore", + + "__comment": "Object attributes below are prefixed with numbers because of how foundry parses JSON into structs in alphabetical order", + "drips": [ + { + "00__name": "balance_v1", + "01__dripcheck": "CheckBalanceLow", + "02__checkparams": { + "01__target": "0xF21d42203AF9af1C86E1e8ac501B41f5bc004A0a", + "02__threshold": 100000000000000000000 + }, + "03__recipient": "0xF21d42203AF9af1C86E1e8ac501B41f5bc004A0a", + "04__value": 20000000000000000000, + "05__interval": 3600, + "06__data": "" + }, + { + "00__name": "balance_v2", + "01__dripcheck": "CheckBalanceLow", + "02__checkparams": { + "01__target": "0xF21d42203AF9af1C86E1e8ac501B41f5bc004A0a", + "02__threshold": 20000000000000000000 + }, + "03__recipient": "0xF21d42203AF9af1C86E1e8ac501B41f5bc004A0a", + "04__value": 500000000000000000000, + "05__interval": 604800, + "06__data": "" + }, + { + "00__name": "admin_v1", + "01__dripcheck": "CheckBalanceLow", + "02__checkparams": { + "01__target": "0x212E789D4523D4BAF464f8Fb2A9B9dff2B36e5A6", + "02__threshold": 100000000000000000 + }, + "03__recipient": "0x212E789D4523D4BAF464f8Fb2A9B9dff2B36e5A6", + "04__value": 1000000000000000000, + "05__interval": 86400, + "06__data": "" + }, + { + "00__name": "gelato_v1", + "01__dripcheck": "CheckGelatoLow", + "02__checkparams": { + "00__treasury": "0x7506C12a824d73D9b08564d5Afc22c949434755e", + "01__threshold": 100000000000000000, + "02__recipient": "0x0E9b4649eB0760A4F01646636E032D68cFDe58FF" + }, + "03__recipient": "0x7506C12a824d73D9b08564d5Afc22c949434755e", + "04__value": 1000000000000000000, + "05__interval": 86400, + "06__data": "0x0000000000000000000000000e9b4649eb0760a4f01646636e032d68cfde58ff" + } + ] +} diff --git a/packages/contracts-bedrock/deploy-config-periphery/drippie/sepolia-ops.json b/packages/contracts-bedrock/deploy-config-periphery/drippie/sepolia-ops.json new file mode 100644 index 000000000000..3c5dc6346f4c --- /dev/null +++ b/packages/contracts-bedrock/deploy-config-periphery/drippie/sepolia-ops.json @@ -0,0 +1,80 @@ +{ + "drippie": "0xa0fF2a54AdC3fB33c44a141E67d194CF249258cb", + "gelato": "0x2A6C106ae13B558BB9E2Ec64Bd2f1f7BEFF3A5E0", + + "__comment": "Addresses of dripcheck contracts to be used in drips", + "dripchecks": [ + { + "00__name": "CheckBalanceLow", + "01__address": "0xaF8C77CfeB57620c4D9dCC81df75a1F0Da7064Af" + }, + { + "00__name": "CheckGelatoLow", + "01__address": "0x0fF11AfAC4146a0bABf7F9F042a22C8053a54674" + }, + { + "00__name": "CheckSecrets", + "01__address": "0x32c1e36E733913388076D7c3055300072814bF2A" + }, + { + "00__name": "CheckTrue", + "01__address": "0xcBCb3896Ddec35d91901768733C5d3738e10509F" + } + ], + + "__comment": "Prefix is used to namespace drips so that drip management can be handled modularly", + "prefix": "operations", + + "__comment": "Object attributes below are prefixed with numbers because of how foundry parses JSON into structs in alphabetical order", + "drips": [ + { + "00__name": "sequencer_v4", + "01__dripcheck": "CheckBalanceLow", + "02__checkparams": { + "01__target": "0x8F23BB38F531600e5d8FDDaAEC41F13FaB46E98c", + "02__threshold": 1000000000000000000000 + }, + "03__recipient": "0x8F23BB38F531600e5d8FDDaAEC41F13FaB46E98c", + "04__value": 100000000000000000000, + "05__interval": 3600, + "06__data": "" + }, + { + "00__name": "proposer_v3", + "01__dripcheck": "CheckBalanceLow", + "02__checkparams": { + "01__target": "0x49277EE36A024120Ee218127354c4a3591dc90A9", + "02__threshold": 100000000000000000000 + }, + "03__recipient": "0x49277EE36A024120Ee218127354c4a3591dc90A9", + "04__value": 20000000000000000000, + "05__interval": 86400, + "06__data": "" + }, + { + "00__name": "challenger_v2", + "01__dripcheck": "CheckBalanceLow", + "02__checkparams": { + "01__target": "0xffb026F67DA0869EB3ABB090cB7F015CE0925CdF", + "02__threshold": 1000000000000000000000 + }, + "03__recipient": "0x49277EE36A024120Ee218127354c4a3591dc90A9", + "04__value": 100000000000000000000, + "05__interval": 3600, + "06__data": "" + }, + { + "00__name": "gelato_v3", + "01__dripcheck": "CheckGelatoLow", + "02__checkparams": { + "00__treasury": "0x7506C12a824d73D9b08564d5Afc22c949434755e", + "01__threshold": 1000000000000000000, + "02__recipient": "0xCd438409d5Cac9D2E076Ac7Bd0Bf2377E99BB6e4" + }, + "03__recipient": "0x7506C12a824d73D9b08564d5Afc22c949434755e", + "04__value": 1000000000000000000, + "05__interval": 86400, + "06__data": "0x0000000000000000000000000Cd438409d5Cac9D2E076Ac7Bd0Bf2377E99BB6e4" + } + ] +} diff --git a/packages/contracts-bedrock/deploy-config/devnetL1-template.json b/packages/contracts-bedrock/deploy-config/devnetL1-template.json index e0b01bdd570a..25b73d02a438 100644 --- a/packages/contracts-bedrock/deploy-config/devnetL1-template.json +++ b/packages/contracts-bedrock/deploy-config/devnetL1-template.json @@ -8,8 +8,6 @@ "p2pSequencerAddress": "0x9965507D1a55bcC2695C58ba16FB37d819B0A4dc", "batchInboxAddress": "0xff00000000000000000000000000000000000901", "batchSenderAddress": "0x3C44CdDdB6a900fa2b585dd299e03d12FA4293BC", - "cliqueSignerAddress": "0xf39Fd6e51aad88F6F4ce6aB8827279cffFb92266", - "l1UseClique": true, "l1StartingBlockTag": "earliest", "l2OutputOracleSubmissionInterval": 10, "l2OutputOracleStartingTimestamp": 0, @@ -17,7 +15,7 @@ "l2OutputOracleProposer": "0x70997970C51812dc3A010C7d01b50e0d17dc79C8", "l2OutputOracleChallenger": "0x15d34AAf54267DB7D7c367839AAf71A00a2C6A65", "l2GenesisBlockGasLimit": "0x1c9c380", - "l1BlockTime": 3, + "l1BlockTime": 6, "baseFeeVaultRecipient": "0x14dC79964da2C08b23698B3D3cc7Ca32193d9955", "l1FeeVaultRecipient": "0x23618e81E3f5cdF7f54C3d65f7FBc0aBf5B21E8f", "sequencerFeeVaultRecipient": "0xa0Ee7A142d267C1f36714E4a8F75612F20a79720", @@ -44,10 +42,13 @@ "eip1559Denominator": 50, "eip1559DenominatorCanyon": 250, "eip1559Elasticity": 6, - "l1GenesisBlockTimestamp": "0x64c811bf", + "l1GenesisBlockTimestamp": "0x123", "l2GenesisRegolithTimeOffset": "0x0", - "l2GenesisDeltaTimeOffset": null, "l2GenesisCanyonTimeOffset": "0x0", + "l2GenesisDeltaTimeOffset": "0x0", + "l2GenesisEcotoneTimeOffset": "0x0", + "l2GenesisFjordTimeOffset": "0x0", + "l1CancunTimeOffset": "0x0", "systemConfigStartBlock": 0, "requiredProtocolVersion": "0x0000000000000000000000000000000000000000000000000000000000000000", "recommendedProtocolVersion": "0x0000000000000000000000000000000000000000000000000000000000000000", @@ -63,11 +64,12 @@ "preimageOracleChallengePeriod": 120, "proofMaturityDelaySeconds": 12, "disputeGameFinalityDelaySeconds": 6, - "respectedGameType": 0, - "useFaultProofs": false, - "usePlasma": false, - "daChallengeWindow": 160, - "daResolveWindow": 160, + "respectedGameType": 254, + "useFaultProofs": true, + "useAltDA": false, + "daCommitmentType": "KeccakCommitment", + "daChallengeWindow": 16, + "daResolveWindow": 16, "daBondSize": 1000000, "useSoulGasToken": true, "isSoulBackedByNative": true, diff --git a/packages/contracts-bedrock/deploy-config/hardhat.json b/packages/contracts-bedrock/deploy-config/hardhat.json index 30a89a4ff4ab..e26c10ef78ce 100644 --- a/packages/contracts-bedrock/deploy-config/hardhat.json +++ b/packages/contracts-bedrock/deploy-config/hardhat.json @@ -58,7 +58,7 @@ "respectedGameType": 0, "useFaultProofs": false, "fundDevAccounts": true, - "usePlasma": false, + "useAltDA": false, "daChallengeWindow": 100, "daResolveWindow": 100, "daBondSize": 1000, diff --git a/packages/contracts-bedrock/deploy-config/mainnet.json b/packages/contracts-bedrock/deploy-config/mainnet.json index ba16326b3c0b..cd217ba11153 100644 --- a/packages/contracts-bedrock/deploy-config/mainnet.json +++ b/packages/contracts-bedrock/deploy-config/mainnet.json @@ -42,7 +42,7 @@ "systemConfigStartBlock": 17422444, "requiredProtocolVersion": "0x0000000000000000000000000000000000000003000000010000000000000000", "recommendedProtocolVersion": "0x0000000000000000000000000000000000000003000000010000000000000000", - "faultGameAbsolutePrestate": "0x037ef3c1a487960b0e633d3e513df020c43432769f41a634d18a9595cbf53c55", + "faultGameAbsolutePrestate": "0x038512e02c4c3f7bdaec27d00edf55b7155e0905301e1a88083e4e0a6764d54c", "faultGameMaxDepth": 73, "faultGameClockExtension": 10800, "faultGameMaxClockDuration": 302400, diff --git a/packages/contracts-bedrock/deploy-config/sepolia-devnet-0.json b/packages/contracts-bedrock/deploy-config/sepolia-devnet-0.json index c44866b18032..7dd5df431cd1 100644 --- a/packages/contracts-bedrock/deploy-config/sepolia-devnet-0.json +++ b/packages/contracts-bedrock/deploy-config/sepolia-devnet-0.json @@ -66,10 +66,10 @@ "eip1559Denominator": 250, "eip1559DenominatorCanyon": 250, "systemConfigStartBlock": 4071248, - "faultGameAbsolutePrestate": "0x037ef3c1a487960b0e633d3e513df020c43432769f41a634d18a9595cbf53c55", + "faultGameAbsolutePrestate": "0x0385c3f8ee78491001d92b90b07d0cf387b7b52ab9b83b4d87c994e92cf823ba", "faultGameMaxDepth": 73, - "faultGameClockExtension": 120, - "faultGameMaxClockDuration": 600, + "faultGameClockExtension": 3600, + "faultGameMaxClockDuration": 14400, "faultGameGenesisBlock": 0, "faultGameGenesisOutputRoot": "0x91bd00ecd596a86c9f4e12c0646578e77022881c87c06ec6aa31e656d2730688", "faultGameSplitDepth": 30, diff --git a/packages/contracts-bedrock/deploy-config/sepolia.json b/packages/contracts-bedrock/deploy-config/sepolia.json index d8e901c0840f..8ec58e7b9301 100644 --- a/packages/contracts-bedrock/deploy-config/sepolia.json +++ b/packages/contracts-bedrock/deploy-config/sepolia.json @@ -41,7 +41,7 @@ "requiredProtocolVersion": "0x0000000000000000000000000000000000000004000000000000000000000001", "recommendedProtocolVersion": "0x0000000000000000000000000000000000000004000000000000000000000001", "fundDevAccounts": false, - "faultGameAbsolutePrestate": "0x037ef3c1a487960b0e633d3e513df020c43432769f41a634d18a9595cbf53c55", + "faultGameAbsolutePrestate": "0x030de10d9da911a2b180ecfae2aeaba8758961fc28262ce989458c6f9a547922", "faultGameMaxDepth": 73, "faultGameClockExtension": 10800, "faultGameMaxClockDuration": 302400, diff --git a/packages/contracts-bedrock/foundry.toml b/packages/contracts-bedrock/foundry.toml index eaed71ce82f9..cef9f85bbaeb 100644 --- a/packages/contracts-bedrock/foundry.toml +++ b/packages/contracts-bedrock/foundry.toml @@ -13,6 +13,7 @@ optimizer_runs = 999999 remappings = [ '@openzeppelin/contracts-upgradeable/=lib/openzeppelin-contracts-upgradeable/contracts', '@openzeppelin/contracts/=lib/openzeppelin-contracts/contracts', + '@openzeppelin/contracts-v5/=lib/openzeppelin-contracts-v5/contracts', '@rari-capital/solmate/=lib/solmate', '@lib-keccak/=lib/lib-keccak/contracts/lib', '@solady/=lib/solady/src', @@ -20,13 +21,21 @@ remappings = [ 'ds-test/=lib/forge-std/lib/ds-test/src', 'safe-contracts/=lib/safe-contracts/contracts', 'kontrol-cheatcodes/=lib/kontrol-cheatcodes/src', + 'gelato/=lib/automate/contracts' ] 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"] +# 5159 error code is selfdestruct error code +ignored_error_codes = ["transient-storage", "code-size", "init-code-size", 5159] + +# We set the gas limit to max int64 to avoid running out of gas during testing, since the default +# gas limit is 1B and some of our tests require more gas than that, such as `test_callWithMinGas_noLeakageLow_succeeds`. +# We use this gas limit since it was the default gas limit prior to https://github.com/foundry-rs/foundry/pull/8274. +# Due to toml-rs limitations, if you increase the gas limit above this value it must be a string. +gas_limit = 9223372036854775807 # Test / Script Runner Settings ffi = true @@ -35,12 +44,13 @@ fs_permissions = [ { access='read-write', path='./snapshots/' }, { access='read-write', path='./deployments/' }, { access='read', path='./deploy-config/' }, - { access='read', path='./periphery-deploy-config/' }, + { access='read', path='./deploy-config-periphery/' }, { access='read', path='./broadcast/' }, { access='read', path = './forge-artifacts/' }, { access='write', path='./semver-lock.json' }, { access='read-write', path='./.testdata/' }, - { access='read', path='./kout-deployment' } + { access='read', path='./kout-deployment' }, + { access='read', path='./test/fixtures' }, ] libs = ["node_modules", "lib"] diff --git a/packages/contracts-bedrock/invariant-docs/AddressAliasHelper.md b/packages/contracts-bedrock/invariant-docs/AddressAliasHelper.md deleted file mode 100644 index f7787a436122..000000000000 --- a/packages/contracts-bedrock/invariant-docs/AddressAliasHelper.md +++ /dev/null @@ -1,6 +0,0 @@ -# `AddressAliasHelper` Invariants - -## Address aliases are always able to be undone. -**Test:** [`AddressAliasHelper.t.sol#L48`](../test/invariants/AddressAliasHelper.t.sol#L48) - -Asserts that an address that has been aliased with `applyL1ToL2Alias` can always be unaliased with `undoL1ToL2Alias`. \ No newline at end of file diff --git a/packages/contracts-bedrock/invariant-docs/Burn.Eth.md b/packages/contracts-bedrock/invariant-docs/Burn.Eth.md deleted file mode 100644 index eb11cba92315..000000000000 --- a/packages/contracts-bedrock/invariant-docs/Burn.Eth.md +++ /dev/null @@ -1,6 +0,0 @@ -# `Burn.Eth` Invariants - -## `eth(uint256)` always burns the exact amount of eth passed. -**Test:** [`Burn.Eth.t.sol#L66`](../test/invariants/Burn.Eth.t.sol#L66) - -Asserts that when `Burn.eth(uint256)` is called, it always burns the exact amount of ETH passed to the function. \ No newline at end of file diff --git a/packages/contracts-bedrock/invariant-docs/Burn.Gas.md b/packages/contracts-bedrock/invariant-docs/Burn.Gas.md deleted file mode 100644 index 5c343bca23fd..000000000000 --- a/packages/contracts-bedrock/invariant-docs/Burn.Gas.md +++ /dev/null @@ -1,6 +0,0 @@ -# `Burn.Gas` Invariants - -## `gas(uint256)` always burns at least the amount of gas passed. -**Test:** [`Burn.Gas.t.sol#L66`](../test/invariants/Burn.Gas.t.sol#L66) - -Asserts that when `Burn.gas(uint256)` is called, it always burns at least the amount of gas passed to the function. \ No newline at end of file diff --git a/packages/contracts-bedrock/invariant-docs/CrossDomainMessenger.md b/packages/contracts-bedrock/invariant-docs/CrossDomainMessenger.md deleted file mode 100644 index 4329859f24a3..000000000000 --- a/packages/contracts-bedrock/invariant-docs/CrossDomainMessenger.md +++ /dev/null @@ -1,15 +0,0 @@ -# `CrossDomainMessenger` Invariants - -## A call to `relayMessage` should succeed if at least the minimum gas limit can be supplied to the target context, there is enough gas to complete execution of `relayMessage` after the target context's execution is finished, and the target context did not revert. -**Test:** [`CrossDomainMessenger.t.sol#L143`](../test/invariants/CrossDomainMessenger.t.sol#L143) - -There are two minimum gas limits here: -- The outer min gas limit is for the call from the `OptimismPortal` to the `L1CrossDomainMessenger`, and it can be retrieved by calling the xdm's `baseGas` function with the `message` and inner limit. -- The inner min gas limit is for the call from the `L1CrossDomainMessenger` to the target contract. - -## A call to `relayMessage` should assign the message hash to the `failedMessages` mapping if not enough gas is supplied to forward `minGasLimit` to the target context or if there is not enough gas to complete execution of `relayMessage` after the target context's execution is finished. -**Test:** [`CrossDomainMessenger.t.sol#L176`](../test/invariants/CrossDomainMessenger.t.sol#L176) - -There are two minimum gas limits here: -- The outer min gas limit is for the call from the `OptimismPortal` to the `L1CrossDomainMessenger`, and it can be retrieved by calling the xdm's `baseGas` function with the `message` and inner limit. -- The inner min gas limit is for the call from the `L1CrossDomainMessenger` to the target contract. \ No newline at end of file diff --git a/packages/contracts-bedrock/invariant-docs/Encoding.md b/packages/contracts-bedrock/invariant-docs/Encoding.md deleted file mode 100644 index 460eff43df77..000000000000 --- a/packages/contracts-bedrock/invariant-docs/Encoding.md +++ /dev/null @@ -1,11 +0,0 @@ -# `Encoding` Invariants - -## `convertRoundTripAToB` never fails. -**Test:** [`Encoding.t.sol#L73`](../test/invariants/Encoding.t.sol#L73) - -Asserts that a raw versioned nonce can be encoded / decoded to reach the same raw value. - -## `convertRoundTripBToA` never fails. -**Test:** [`Encoding.t.sol#L82`](../test/invariants/Encoding.t.sol#L82) - -Asserts that an encoded versioned nonce can always be decoded / re-encoded to reach the same encoded value. \ No newline at end of file diff --git a/packages/contracts-bedrock/invariant-docs/FaultDisputeGame.md b/packages/contracts-bedrock/invariant-docs/FaultDisputeGame.md deleted file mode 100644 index c54eb974cff7..000000000000 --- a/packages/contracts-bedrock/invariant-docs/FaultDisputeGame.md +++ /dev/null @@ -1,6 +0,0 @@ -# `FaultDisputeGame` Invariants - -## FaultDisputeGame always returns all ETH on total resolution -**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/Hashing.md b/packages/contracts-bedrock/invariant-docs/Hashing.md deleted file mode 100644 index acf407876d3c..000000000000 --- a/packages/contracts-bedrock/invariant-docs/Hashing.md +++ /dev/null @@ -1,16 +0,0 @@ -# `Hashing` Invariants - -## `hashCrossDomainMessage` reverts if `version` is > `1`. -**Test:** [`Hashing.t.sol#L119`](../test/invariants/Hashing.t.sol#L119) - -The `hashCrossDomainMessage` function should always revert if the `version` passed is > `1`. - -## `version` = `0`: `hashCrossDomainMessage` and `hashCrossDomainMessageV0` are equivalent. -**Test:** [`Hashing.t.sol#L129`](../test/invariants/Hashing.t.sol#L129) - -If the version passed is 0, `hashCrossDomainMessage` and `hashCrossDomainMessageV0` should be equivalent. - -## `version` = `1`: `hashCrossDomainMessage` and `hashCrossDomainMessageV1` are equivalent. -**Test:** [`Hashing.t.sol#L140`](../test/invariants/Hashing.t.sol#L140) - -If the version passed is 1, `hashCrossDomainMessage` and `hashCrossDomainMessageV1` should be equivalent. \ No newline at end of file diff --git a/packages/contracts-bedrock/invariant-docs/InvariantTest.sol.md b/packages/contracts-bedrock/invariant-docs/InvariantTest.sol.md deleted file mode 100644 index bd27f490f563..000000000000 --- a/packages/contracts-bedrock/invariant-docs/InvariantTest.sol.md +++ /dev/null @@ -1,2 +0,0 @@ -# `InvariantTest.sol` Invariants - diff --git a/packages/contracts-bedrock/invariant-docs/L2OutputOracle.md b/packages/contracts-bedrock/invariant-docs/L2OutputOracle.md deleted file mode 100644 index 18804304e71c..000000000000 --- a/packages/contracts-bedrock/invariant-docs/L2OutputOracle.md +++ /dev/null @@ -1,6 +0,0 @@ -# `L2OutputOracle` Invariants - -## The block number of the output root proposals should monotonically increase. -**Test:** [`L2OutputOracle.t.sol#L58`](../test/invariants/L2OutputOracle.t.sol#L58) - -When a new output is submitted, it should never be allowed to correspond to a block number that is less than the current output. \ No newline at end of file diff --git a/packages/contracts-bedrock/invariant-docs/OptimismPortal.md b/packages/contracts-bedrock/invariant-docs/OptimismPortal.md deleted file mode 100644 index 07347e58bd77..000000000000 --- a/packages/contracts-bedrock/invariant-docs/OptimismPortal.md +++ /dev/null @@ -1,21 +0,0 @@ -# `OptimismPortal` Invariants - -## Deposits of any value should always succeed unless `_to` = `address(0)` or `_isCreation` = `true`. -**Test:** [`OptimismPortal.t.sol#L149`](../test/invariants/OptimismPortal.t.sol#L149) - -All deposits, barring creation transactions and transactions sent to `address(0)`, should always succeed. - -## `finalizeWithdrawalTransaction` should revert if the finalization period has not elapsed. -**Test:** [`OptimismPortal.t.sol#L172`](../test/invariants/OptimismPortal.t.sol#L172) - -A withdrawal that has been proven should not be able to be finalized until after the finalization period has elapsed. - -## `finalizeWithdrawalTransaction` should revert if the withdrawal has already been finalized. -**Test:** [`OptimismPortal.t.sol#L202`](../test/invariants/OptimismPortal.t.sol#L202) - -Ensures that there is no chain of calls that can be made that allows a withdrawal to be finalized twice. - -## A withdrawal should **always** be able to be finalized `FINALIZATION_PERIOD_SECONDS` after it was successfully proven. -**Test:** [`OptimismPortal.t.sol#L231`](../test/invariants/OptimismPortal.t.sol#L231) - -This invariant asserts that there is no chain of calls that can be made that will prevent a withdrawal from being finalized exactly `FINALIZATION_PERIOD_SECONDS` after it was successfully proven. \ No newline at end of file diff --git a/packages/contracts-bedrock/invariant-docs/OptimismPortal2.md b/packages/contracts-bedrock/invariant-docs/OptimismPortal2.md deleted file mode 100644 index 03630c5cd9a0..000000000000 --- a/packages/contracts-bedrock/invariant-docs/OptimismPortal2.md +++ /dev/null @@ -1,21 +0,0 @@ -# `OptimismPortal2` Invariants - -## Deposits of any value should always succeed unless `_to` = `address(0)` or `_isCreation` = `true`. -**Test:** [`OptimismPortal2.t.sol#L160`](../test/invariants/OptimismPortal2.t.sol#L160) - -All deposits, barring creation transactions and transactions sent to `address(0)`, should always succeed. - -## `finalizeWithdrawalTransaction` should revert if the proof maturity period has not elapsed. -**Test:** [`OptimismPortal2.t.sol#L182`](../test/invariants/OptimismPortal2.t.sol#L182) - -A withdrawal that has been proven should not be able to be finalized until after the proof maturity period has elapsed. - -## `finalizeWithdrawalTransaction` should revert if the withdrawal has already been finalized. -**Test:** [`OptimismPortal2.t.sol#L211`](../test/invariants/OptimismPortal2.t.sol#L211) - -Ensures that there is no chain of calls that can be made that allows a withdrawal to be finalized twice. - -## A withdrawal should **always** be able to be finalized `PROOF_MATURITY_DELAY_SECONDS` after it was successfully proven, if the game has resolved and passed the air-gap. -**Test:** [`OptimismPortal2.t.sol#L239`](../test/invariants/OptimismPortal2.t.sol#L239) - -This invariant asserts that there is no chain of calls that can be made that will prevent a withdrawal from being finalized exactly `PROOF_MATURITY_DELAY_SECONDS` after it was successfully proven and the game has resolved and passed the air-gap. \ No newline at end of file diff --git a/packages/contracts-bedrock/invariant-docs/README.md b/packages/contracts-bedrock/invariant-docs/README.md deleted file mode 100644 index eae292a89cc2..000000000000 --- a/packages/contracts-bedrock/invariant-docs/README.md +++ /dev/null @@ -1,50 +0,0 @@ -# Invariant Docs - -This directory contains documentation for all defined invariant tests within `contracts-bedrock`. - - - - -## Table of Contents -- [AddressAliasHelper](./AddressAliasHelper.md) -- [Burn.Eth](./Burn.Eth.md) -- [Burn.Gas](./Burn.Gas.md) -- [CrossDomainMessenger](./CrossDomainMessenger.md) -- [Encoding](./Encoding.md) -- [FaultDisputeGame](./FaultDisputeGame.md) -- [Hashing](./Hashing.md) -- [InvariantTest.sol](./InvariantTest.sol.md) -- [L2OutputOracle](./L2OutputOracle.md) -- [OptimismPortal](./OptimismPortal.md) -- [OptimismPortal2](./OptimismPortal2.md) -- [ResourceMetering](./ResourceMetering.md) -- [SafeCall](./SafeCall.md) -- [SystemConfig](./SystemConfig.md) - - -## Usage - -To auto-generate documentation for invariant tests, run `pnpm autogen:invariant-docs`. - -## Documentation Standard - -In order for an invariant test file to be picked up by the [docgen script](../scripts/autogen/generate-invariant-docs.ts), it must -adhere to the following conventions: - -### Forge Invariants - -All `forge` invariant tests must exist within the `contracts/test/invariants` folder, and the file name should be -`.t.sol`, where `` is the name of the contract that is being tested. - -All tests within `forge` invariant files should follow the convention: - -```solidity -/** - * @custom:invariant - * - * <longDescription> - */ -function invariant_<shortDescription>() external { - // ... -} -``` diff --git a/packages/contracts-bedrock/invariant-docs/ResourceMetering.md b/packages/contracts-bedrock/invariant-docs/ResourceMetering.md deleted file mode 100644 index 967c24bf886f..000000000000 --- a/packages/contracts-bedrock/invariant-docs/ResourceMetering.md +++ /dev/null @@ -1,36 +0,0 @@ -# `ResourceMetering` Invariants - -## The base fee should increase if the last block used more than the target amount of gas. -**Test:** [`ResourceMetering.t.sol#L163`](../test/invariants/ResourceMetering.t.sol#L163) - -If the last block used more than the target amount of gas (and there were no empty blocks in between), ensure this block's baseFee increased, but not by more than the max amount per block. - -## The base fee should decrease if the last block used less than the target amount of gas. -**Test:** [`ResourceMetering.t.sol#L172`](../test/invariants/ResourceMetering.t.sol#L172) - -If the previous block used less than the target amount of gas, the base fee should decrease, but not more than the max amount. - -## A block's base fee should never be below `MINIMUM_BASE_FEE`. -**Test:** [`ResourceMetering.t.sol#L180`](../test/invariants/ResourceMetering.t.sol#L180) - -This test asserts that a block's base fee can never drop below the `MINIMUM_BASE_FEE` threshold. - -## A block can never consume more than `MAX_RESOURCE_LIMIT` gas. -**Test:** [`ResourceMetering.t.sol#L188`](../test/invariants/ResourceMetering.t.sol#L188) - -This test asserts that a block can never consume more than the `MAX_RESOURCE_LIMIT` gas threshold. - -## The base fee can never be raised more than the max base fee change. -**Test:** [`ResourceMetering.t.sol#L198`](../test/invariants/ResourceMetering.t.sol#L198) - -After a block consumes more gas than the target gas, the base fee 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` - -## The base fee can never be lowered more than the max base fee change. -**Test:** [`ResourceMetering.t.sol#L208`](../test/invariants/ResourceMetering.t.sol#L208) - -After a block consumes less than the target gas, the base fee cannot 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` - -## The `maxBaseFeeChange` calculation over multiple blocks can never underflow. -**Test:** [`ResourceMetering.t.sol#L217`](../test/invariants/ResourceMetering.t.sol#L217) - -When calculating the `maxBaseFeeChange` after multiple empty blocks, the calculation should never be allowed to underflow. \ No newline at end of file diff --git a/packages/contracts-bedrock/invariant-docs/SafeCall.md b/packages/contracts-bedrock/invariant-docs/SafeCall.md deleted file mode 100644 index 19ac6d851030..000000000000 --- a/packages/contracts-bedrock/invariant-docs/SafeCall.md +++ /dev/null @@ -1,11 +0,0 @@ -# `SafeCall` Invariants - -## If `callWithMinGas` performs a call, then it must always provide at least the specified minimum gas limit to the subcontext. -**Test:** [`SafeCall.t.sol#L33`](../test/invariants/SafeCall.t.sol#L33) - -If the check for remaining gas in `SafeCall.callWithMinGas` passes, the subcontext of the call below it must be provided at least `minGas` gas. - -## `callWithMinGas` reverts if there is not enough gas to pass to the subcontext. -**Test:** [`SafeCall.t.sol#L66`](../test/invariants/SafeCall.t.sol#L66) - -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. \ No newline at end of file diff --git a/packages/contracts-bedrock/invariant-docs/SystemConfig.md b/packages/contracts-bedrock/invariant-docs/SystemConfig.md deleted file mode 100644 index 59f9a999f10c..000000000000 --- a/packages/contracts-bedrock/invariant-docs/SystemConfig.md +++ /dev/null @@ -1,6 +0,0 @@ -# `SystemConfig` Invariants - -## 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/justfile b/packages/contracts-bedrock/justfile new file mode 100644 index 000000000000..e660d7a1c7ba --- /dev/null +++ b/packages/contracts-bedrock/justfile @@ -0,0 +1,209 @@ +######################################################## +# INSTALL # +######################################################## + +# Installs dependencies. +install: + forge install + +# Shows the status of the git submodules. +dep-status: + git submodule status + + +######################################################## +# BUILD # +######################################################## + +# Checks that the correct version of Foundry is installed. +prebuild: + ./scripts/checks/check-foundry-install.sh + +# Builds the contracts. +build: prebuild + forge build + +# Builds the go-ffi tool for contract tests. +build-go-ffi: + cd scripts/go-ffi && go build + +# Cleans build artifacts and deployments. +# Removes everything inside of .testdata (except the .gitkeep file). +clean: + rm -rf ./artifacts ./forge-artifacts ./cache ./scripts/go-ffi/go-ffi ./deployments/hardhat/* + find ./.testdata -mindepth 1 -not -name '.gitkeep' -delete + + +######################################################## +# TEST # +######################################################## + +# Runs standard contract tests. +test: build-go-ffi + forge test + +# Runs standard contract tests with rerun flag. +test-rerun: build-go-ffi + forge test --rerun -vvv + +# Run Kontrol tests and build all dependencies. +test-kontrol: build-go-ffi build kontrol-summary-full test-kontrol-no-build + +# Run Kontrol tests without dependencies. +test-kontrol-no-build: + ./test/kontrol/scripts/run-kontrol.sh script + +# Runs contract coverage. +coverage: 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") + +# Runs contract coverage with lcov. +coverage-lcov: 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 # +######################################################## + +# Generates the L2 genesis state. +genesis: + forge script scripts/L2Genesis.s.sol:L2Genesis --sig 'runWithStateDump()' + +# Deploys the contracts. +deploy: + ./scripts/deploy/deploy.sh + + +######################################################## +# SNAPSHOTS # +######################################################## + +# Generates a gas snapshot without building. +gas-snapshot-no-build: + forge snapshot --match-contract GasBenchMark + +# Generates a gas snapshot. +gas-snapshot: build-go-ffi gas-snapshot-no-build + +# Checks that the state diff is up to date. +statediff: + ./scripts/utils/statediff.sh && git diff --exit-code + +# Generates default Kontrol summary. +kontrol-summary: + ./test/kontrol/scripts/make-summary-deployment.sh + +# Generates fault proofs Kontrol summary. +kontrol-summary-fp: + KONTROL_FP_DEPLOYMENT=true ./test/kontrol/scripts/make-summary-deployment.sh + +# Generates all Kontrol summaries (default and FP). +kontrol-summary-full: kontrol-summary kontrol-summary-fp + +# Generates ABI snapshots for contracts. +snapshots-abi-storage: + go run ./scripts/autogen/generate-snapshots . + +# Updates the semver-lock.json file. +semver-lock: + forge script scripts/autogen/SemverLock.s.sol + +# Generates core snapshots without building contracts. Currently just an alias for +# snapshots-abi-storage because we no longer run Kontrol snapshots here. Run +# kontrol-summary-full to build the Kontrol summaries if necessary. +snapshots-no-build: snapshots-abi-storage + +# Builds contracts and then generates core snapshots. +snapshots: build snapshots-no-build + + +######################################################## +# CHECKS # +######################################################## + +# Checks that the gas snapshot is up to date without building. +gas-snapshot-check-no-build: + forge snapshot --match-contract GasBenchMark --check + +# Checks that the gas snapshot is up to date. +gas-snapshot-check: build-go-ffi gas-snapshot-check-no-build + +# Checks that the Kontrol deployment script has not changed. +kontrol-deployment-check: + ./scripts/checks/check-kontrol-deployment.sh + +# Checks if the snapshots are up to date without building. +snapshots-check-no-build: + ./scripts/checks/check-snapshots.sh --no-build + +# Checks if the snapshots are up to date. +snapshots-check: + ./scripts/checks/check-snapshots.sh + +# Checks interface correctness without building. +interfaces-check-no-build: + ./scripts/checks/check-interfaces.sh + +# Checks that all interfaces are appropriately named and accurately reflect the corresponding +# contract that they're meant to represent. We run "clean" before building because leftover +# artifacts can cause the script to detect issues incorrectly.2 +interfaces-check: clean build interfaces-check-no-build + +# Checks that the size of the contracts is within the limit. +size-check: + forge build --sizes --skip "/**/test/**" --skip "/**/scripts/**" + +# Checks that any contracts with a modified semver lock also have a modified semver version. +# Does not build contracts. +semver-diff-check-no-build: + ./scripts/checks/check-semver-diff.sh + +# Checks that any contracts with a modified semver lock also have a modified semver version. +semver-diff-check: build semver-diff-check-no-build + +# Checks that semver natspec is equal to the actual semver version. +# Does not build contracts. +semver-natspec-check-no-build: + ./scripts/checks/check-semver-natspec-match.sh + +# Checks that semver natspec is equal to the actual semver version. +semver-natspec-check: build semver-natspec-check-no-build + +# Checks that forge test names are correctly formatted. +lint-forge-tests-check: + go run ./scripts/checks/names + +# Checks that contracts are properly linted. +lint-check: + forge fmt --check + +# Checks that the deploy configs are valid. +validate-deploy-configs: + ./scripts/checks/check-deploy-configs.sh + +# Checks that spacer variables are correctly inserted without building. +validate-spacers-no-build: + go run ./scripts/checks/spacers + +# Checks that spacer variables are correctly inserted. +validate-spacers: build validate-spacers-no-build + +# TODO: Also run lint-forge-tests-check but we need to fix the test names first. +# Runs all checks. +check: gas-snapshot-check-no-build kontrol-deployment-check snapshots-check-no-build lint-check semver-diff-check-no-build semver-natspec-check-no-build validate-deploy-configs validate-spacers-no-build interfaces-check-no-build + + +######################################################## +# DEV TOOLS # +######################################################## + +# Cleans, builds, lints, and runs all checks. +pre-pr: clean build-go-ffi build lint gas-snapshot-no-build snapshots-no-build semver-lock check + +# Fixes linting errors. +lint-fix: + forge fmt + +# Fixes linting errors and checks that the code is correctly formatted. +lint: lint-fix lint-check diff --git a/packages/contracts-bedrock/lib/automate b/packages/contracts-bedrock/lib/automate new file mode 160000 index 000000000000..0117585fea20 --- /dev/null +++ b/packages/contracts-bedrock/lib/automate @@ -0,0 +1 @@ +Subproject commit 0117585fea20ff0cd24fd17bf74a6debaa4d57d2 diff --git a/packages/contracts-bedrock/lib/openzeppelin-contracts-v5 b/packages/contracts-bedrock/lib/openzeppelin-contracts-v5 new file mode 160000 index 000000000000..dbb6104ce834 --- /dev/null +++ b/packages/contracts-bedrock/lib/openzeppelin-contracts-v5 @@ -0,0 +1 @@ +Subproject commit dbb6104ce834628e473d2173bbc9d47f81a9eec3 diff --git a/packages/contracts-bedrock/package.json b/packages/contracts-bedrock/package.json deleted file mode 100644 index e6efb918a5d0..000000000000 --- a/packages/contracts-bedrock/package.json +++ /dev/null @@ -1,53 +0,0 @@ -{ - "name": "@eth-optimism/contracts-bedrock", - "version": "0.17.2", - "description": "Contracts for Optimism Specs", - "license": "MIT", - "files": [ - "forge-artifacts/**/*.json", - "!forge-artifacts/**/*.t.sol/*.json", - "deployments/**/*.json", - "src/**/*.sol" - ], - "scripts": { - "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": "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", - "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", - "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", - "lint:forge-tests:check": "npx tsx scripts/checks/check-test-names.ts", - "lint:contracts:check": "pnpm lint:fix && git diff --exit-code", - "lint:check": "pnpm lint:contracts:check && pnpm lint:ts:check", - "lint:ts:fix": "eslint --fix .", - "lint:contracts:fix": "forge fmt", - "lint:fix": "pnpm lint:contracts:fix && pnpm lint:ts:fix", - "lint": "pnpm lint:fix && pnpm lint:check" - }, - "devDependencies": { - "@typescript-eslint/eslint-plugin": "^6.21.0", - "@typescript-eslint/parser": "^6.21.0", - "tsx": "^4.7.0", - "typescript": "^5.4.5" - } -} diff --git a/packages/contracts-bedrock/periphery-deploy-config/sepolia.json b/packages/contracts-bedrock/periphery-deploy-config/sepolia.json deleted file mode 100644 index c6f7945deeb0..000000000000 --- a/packages/contracts-bedrock/periphery-deploy-config/sepolia.json +++ /dev/null @@ -1,42 +0,0 @@ -{ - "faucetAdmin": "0x212E789D4523D4BAF464f8Fb2A9B9dff2B36e5A6", - "faucetDrippieOwner": "0x10ab157483dd308f8B38aCF2ad823dfD255F56b5", - "faucetDripV1Value": 20000000000000000000, - "faucetDripV1Interval": 3600, - "faucetDripV1Threshold": 100000000000000000000, - "faucetDripV2Interval": 604800, - "faucetDripV2Threshold": 20000000000000000000, - "faucetDripV2Value": 500000000000000000000, - "faucetAdminDripV1Interval": 86400, - "faucetAdminDripV1Threshold": 100000000000000000, - "faucetAdminDripV1Value": 1000000000000000000, - "faucetGelatoTreasury": "0x644CB00854EDC55FE8CCC9c1967BABb22F08Ad2f", - "faucetGelatoRecipient": "0x0E9b4649eB0760A4F01646636E032D68cFDe58FF", - "faucetGelatoBalanceV1DripInterval": 86400, - "faucetGelatoBalanceV1Value": 1000000000000000000, - "faucetGelatoThreshold": 100000000000000000, - "faucetOnchainAuthModuleAdmin": "0xFe44Ae787A632c45ACea658492dDBebE39f002aC", - "faucetOnchainAuthModuleTtl": 86400, - "faucetOnchainAuthModuleAmount": 1000000000000000000, - "faucetOffchainAuthModuleAdmin": "0xFe44Ae787A632c45ACea658492dDBebE39f002aC", - "faucetOffchainAuthModuleTtl": 86400, - "faucetOffchainAuthModuleAmount": 50000000000000000, - "opL1BridgeAddress": "0xFBb0621E0B23b5478B630BD55a5f21f67730B0F1", - "baseL1BridgeAddress": "0xfd0Bf71F60660E2f608ed56e1659C450eB113120", - "pgnL1BridgeAddress": "0xFaE6abCAF30D23e233AC7faF747F2fC3a5a6Bfa3", - "zoraL1BridgeAddress": "0x5376f1D543dcbB5BD416c56C189e4cB7399fCcCB", - "orderlyL1BridgeAddress": "0x1Af0494040d6904A9F3EE21921de4b359C736333", - "modeL1BridgeAddress": "0xbC5C679879B2965296756CD959C3C739769995E2", - "lyraL1BridgeAddress": "0x915f179A77FB2e1AeA8b56Ebc0D75A7e1A8a7A17", - "liskL1BridgeAddress": "0x1Fb30e446eA791cd1f011675E5F3f5311b70faF5", - "installOpChainFaucetsDrips": true, - "archivePreviousOpChainFaucetsDrips": false, - "dripVersion": 3, - "previousDripVersion": 2, - "smallOpChainFaucetDripValue": 34000000000000000000, - "smallOpChainFaucetDripInterval": 86400, - "largeOpChainFaucetDripValue": 34000000000000000000, - "largeOpChainFaucetDripInterval": 86400, - "opChainAdminWalletDripValue": 1000000000000000000, - "opChainAdminWalletDripInterval": 2592000 -} diff --git a/packages/contracts-bedrock/safe.json b/packages/contracts-bedrock/safe.json new file mode 100644 index 000000000000..1168ce3d5150 --- /dev/null +++ b/packages/contracts-bedrock/safe.json @@ -0,0 +1,155 @@ +{ + "version": "1.0", + "chainId": "11155111", + "createdAt": 1718216278, + "meta": { + "name": "Transactions Batch", + "description": "", + "txBuilderVersion": "1.16.5", + "createdFromSafeAddress": "0x422c32c10b16c442426Eb7E93b07f7B521294565", + "createdFromOwnerAddress": "", + "checksum": "0xc2d69412777b9d9ba16c95d12f3aca13820b37a8db5f9d436f63058c48994cde" + }, + "transactions": [ + { + "to": "0xa0ff2a54adc3fb33c44a141e67d194cf249258cb", + "value": "0", + "data": "0x9bc94d010000000000000000000000000000000000000000000000000000000000000040000000000000000000000000000000000000000000000000000000000000000100000000000000000000000000000000000000000000000000000000000000176f7065726174696f6e735f73657175656e6365725f7632000000000000000000", + "contractMethod": null, + "contractInputsValues": null + }, + { + "to": "0x2a6c106ae13b558bb9e2ec64bd2f1f7beff3a5e0", + "value": "0", + "data": "0xee8ca3b568c76a8fa53bf566fc0934edddf25deba2199a53772b6c3a05ce20f5b8d220f8", + "contractMethod": null, + "contractInputsValues": null + }, + { + "to": "0xa0ff2a54adc3fb33c44a141e67d194cf249258cb", + "value": "0", + "data": "0x9bc94d010000000000000000000000000000000000000000000000000000000000000040000000000000000000000000000000000000000000000000000000000000000100000000000000000000000000000000000000000000000000000000000000166f7065726174696f6e735f70726f706f7365725f763200000000000000000000", + "contractMethod": null, + "contractInputsValues": null + }, + { + "to": "0x2a6c106ae13b558bb9e2ec64bd2f1f7beff3a5e0", + "value": "0", + "data": "0xee8ca3b5c790be67575b95a6b0c9f618fbdce9b72b6e7202233f0afe087bb641e3d1f0e8", + "contractMethod": null, + "contractInputsValues": null + }, + { + "to": "0xa0ff2a54adc3fb33c44a141e67d194cf249258cb", + "value": "0", + "data": "0x9bc94d010000000000000000000000000000000000000000000000000000000000000040000000000000000000000000000000000000000000000000000000000000000100000000000000000000000000000000000000000000000000000000000000146f7065726174696f6e735f67656c61746f5f7632000000000000000000000000", + "contractMethod": null, + "contractInputsValues": null + }, + { + "to": "0x2a6c106ae13b558bb9e2ec64bd2f1f7beff3a5e0", + "value": "0", + "data": "0xee8ca3b5f666fe8af1ff0032744dcf71fbbeada5e47079f37425a8a0069350bbb508c3db", + "contractMethod": null, + "contractInputsValues": null + }, + { + "to": "0xa0ff2a54adc3fb33c44a141e67d194cf249258cb", + "value": "0", + "data": "0x9bc94d010000000000000000000000000000000000000000000000000000000000000040000000000000000000000000000000000000000000000000000000000000000100000000000000000000000000000000000000000000000000000000000000186f7065726174696f6e735f6368616c6c656e6765725f76310000000000000000", + "contractMethod": null, + "contractInputsValues": null + }, + { + "to": "0x2a6c106ae13b558bb9e2ec64bd2f1f7beff3a5e0", + "value": "0", + "data": "0xee8ca3b53fa0ce0493ae4a3e182ec7ed727076c63bf2d7761a43e328e118b2afdf86afc3", + "contractMethod": null, + "contractInputsValues": null + }, + { + "to": "0xa0ff2a54adc3fb33c44a141e67d194cf249258cb", + "value": "0", + "data": "0xe551cdaa0000000000000000000000000000000000000000000000000000000000000040000000000000000000000000000000000000000000000000000000000000008000000000000000000000000000000000000000000000000000000000000000176f7065726174696f6e735f73657175656e6365725f763400000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000e10000000000000000000000000af8c77cfeb57620c4d9dcc81df75a1f0da7064af00000000000000000000000000000000000000000000000000000000000000a0000000000000000000000000000000000000000000000000000000000000010000000000000000000000000000000000000000000000000000000000000000400000000000000000000000008f23bb38f531600e5d8fddaaec41f13fab46e98c00000000000000000000000000000000000000000000003635c9adc5dea00000000000000000000000000000000000000000000000000000000000000000000100000000000000000000000000000000000000000000000000000000000000200000000000000000000000008f23bb38f531600e5d8fddaaec41f13fab46e98c00000000000000000000000000000000000000000000000000000000000000600000000000000000000000000000000000000000000000056bc75e2d63100000000000000000000000000000000000000000000000000000000000000000004000000000000000000000000000000000000000000000000000000000000000200000000000000000000000000000000000000000000000000000000000000000", + "contractMethod": null, + "contractInputsValues": null + }, + { + "to": "0x2a6c106ae13b558bb9e2ec64bd2f1f7beff3a5e0", + "value": "0", + "data": "0x3323b467000000000000000000000000a0ff2a54adc3fb33c44a141e67d194cf249258cb000000000000000000000000000000000000000000000000000000000000008000000000000000000000000000000000000000000000000000000000000001200000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000006467148cd2000000000000000000000000000000000000000000000000000000000000002000000000000000000000000000000000000000000000000000000000000000176f7065726174696f6e735f73657175656e6365725f763400000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000004000000000000000000000000000000000000000000000000000000000000000a00000000000000000000000000000000000000000000000000000000000000002000000000000000000000000000000000000000000000000000000000000000200000000000000000000000000000000000000000000000000000000000000050000000000000000000000000000000000000000000000000000000000000002000000000000000000000000000000000000000000000000000000000000004000000000000000000000000000000000000000000000000000000000000000c00000000000000000000000000000000000000000000000000000000000000060000000000000000000000000000000000000000000000000000000000000002000000000000000000000000000000000000000000000000000000000000000176f7065726174696f6e735f73657175656e6365725f763400000000000000000000000000000000000000000000000000000000000000000000000000000000a000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000040000000000000000000000000000000000000000000000000000000000000004000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000057e40", + "contractMethod": null, + "contractInputsValues": null + }, + { + "to": "0xa0ff2a54adc3fb33c44a141e67d194cf249258cb", + "value": "0", + "data": "0x9bc94d010000000000000000000000000000000000000000000000000000000000000040000000000000000000000000000000000000000000000000000000000000000200000000000000000000000000000000000000000000000000000000000000176f7065726174696f6e735f73657175656e6365725f7634000000000000000000", + "contractMethod": null, + "contractInputsValues": null + }, + { + "to": "0xa0ff2a54adc3fb33c44a141e67d194cf249258cb", + "value": "0", + "data": "0xe551cdaa0000000000000000000000000000000000000000000000000000000000000040000000000000000000000000000000000000000000000000000000000000008000000000000000000000000000000000000000000000000000000000000000166f7065726174696f6e735f70726f706f7365725f76330000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000015180000000000000000000000000af8c77cfeb57620c4d9dcc81df75a1f0da7064af00000000000000000000000000000000000000000000000000000000000000a00000000000000000000000000000000000000000000000000000000000000100000000000000000000000000000000000000000000000000000000000000004000000000000000000000000049277ee36a024120ee218127354c4a3591dc90a90000000000000000000000000000000000000000000000056bc75e2d631000000000000000000000000000000000000000000000000000000000000000000001000000000000000000000000000000000000000000000000000000000000002000000000000000000000000049277ee36a024120ee218127354c4a3591dc90a90000000000000000000000000000000000000000000000000000000000000060000000000000000000000000000000000000000000000001158e460913d00000000000000000000000000000000000000000000000000000000000000000004000000000000000000000000000000000000000000000000000000000000000200000000000000000000000000000000000000000000000000000000000000000", + "contractMethod": null, + "contractInputsValues": null + }, + { + "to": "0x2a6c106ae13b558bb9e2ec64bd2f1f7beff3a5e0", + "value": "0", + "data": "0x3323b467000000000000000000000000a0ff2a54adc3fb33c44a141e67d194cf249258cb000000000000000000000000000000000000000000000000000000000000008000000000000000000000000000000000000000000000000000000000000001200000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000006467148cd2000000000000000000000000000000000000000000000000000000000000002000000000000000000000000000000000000000000000000000000000000000166f7065726174696f6e735f70726f706f7365725f76330000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000004000000000000000000000000000000000000000000000000000000000000000a00000000000000000000000000000000000000000000000000000000000000002000000000000000000000000000000000000000000000000000000000000000200000000000000000000000000000000000000000000000000000000000000050000000000000000000000000000000000000000000000000000000000000002000000000000000000000000000000000000000000000000000000000000004000000000000000000000000000000000000000000000000000000000000000c00000000000000000000000000000000000000000000000000000000000000060000000000000000000000000000000000000000000000000000000000000002000000000000000000000000000000000000000000000000000000000000000166f7065726174696f6e735f70726f706f7365725f76330000000000000000000000000000000000000000000000000000000000000000000000000000000000a00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000004000000000000000000000000000000000000000000000000000000000000000400000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000083d600", + "contractMethod": null, + "contractInputsValues": null + }, + { + "to": "0xa0ff2a54adc3fb33c44a141e67d194cf249258cb", + "value": "0", + "data": "0x9bc94d010000000000000000000000000000000000000000000000000000000000000040000000000000000000000000000000000000000000000000000000000000000200000000000000000000000000000000000000000000000000000000000000166f7065726174696f6e735f70726f706f7365725f763300000000000000000000", + "contractMethod": null, + "contractInputsValues": null + }, + { + "to": "0xa0ff2a54adc3fb33c44a141e67d194cf249258cb", + "value": "0", + "data": "0xe551cdaa0000000000000000000000000000000000000000000000000000000000000040000000000000000000000000000000000000000000000000000000000000008000000000000000000000000000000000000000000000000000000000000000186f7065726174696f6e735f6368616c6c656e6765725f7632000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000e10000000000000000000000000af8c77cfeb57620c4d9dcc81df75a1f0da7064af00000000000000000000000000000000000000000000000000000000000000a000000000000000000000000000000000000000000000000000000000000001000000000000000000000000000000000000000000000000000000000000000040000000000000000000000000ffb026f67da0869eb3abb090cb7f015ce0925cdf00000000000000000000000000000000000000000000003635c9adc5dea000000000000000000000000000000000000000000000000000000000000000000001000000000000000000000000000000000000000000000000000000000000002000000000000000000000000049277ee36a024120ee218127354c4a3591dc90a900000000000000000000000000000000000000000000000000000000000000600000000000000000000000000000000000000000000000056bc75e2d63100000000000000000000000000000000000000000000000000000000000000000004000000000000000000000000000000000000000000000000000000000000000200000000000000000000000000000000000000000000000000000000000000000", + "contractMethod": null, + "contractInputsValues": null + }, + { + "to": "0x2a6c106ae13b558bb9e2ec64bd2f1f7beff3a5e0", + "value": "0", + "data": "0x3323b467000000000000000000000000a0ff2a54adc3fb33c44a141e67d194cf249258cb000000000000000000000000000000000000000000000000000000000000008000000000000000000000000000000000000000000000000000000000000001200000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000006467148cd2000000000000000000000000000000000000000000000000000000000000002000000000000000000000000000000000000000000000000000000000000000186f7065726174696f6e735f6368616c6c656e6765725f7632000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000004000000000000000000000000000000000000000000000000000000000000000a00000000000000000000000000000000000000000000000000000000000000002000000000000000000000000000000000000000000000000000000000000000200000000000000000000000000000000000000000000000000000000000000050000000000000000000000000000000000000000000000000000000000000002000000000000000000000000000000000000000000000000000000000000004000000000000000000000000000000000000000000000000000000000000000c00000000000000000000000000000000000000000000000000000000000000060000000000000000000000000000000000000000000000000000000000000002000000000000000000000000000000000000000000000000000000000000000186f7065726174696f6e735f6368616c6c656e6765725f7632000000000000000000000000000000000000000000000000000000000000000000000000000000a000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000040000000000000000000000000000000000000000000000000000000000000004000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000057e40", + "contractMethod": null, + "contractInputsValues": null + }, + { + "to": "0xa0ff2a54adc3fb33c44a141e67d194cf249258cb", + "value": "0", + "data": "0x9bc94d010000000000000000000000000000000000000000000000000000000000000040000000000000000000000000000000000000000000000000000000000000000200000000000000000000000000000000000000000000000000000000000000186f7065726174696f6e735f6368616c6c656e6765725f76320000000000000000", + "contractMethod": null, + "contractInputsValues": null + }, + { + "to": "0xa0ff2a54adc3fb33c44a141e67d194cf249258cb", + "value": "0", + "data": "0xe551cdaa0000000000000000000000000000000000000000000000000000000000000040000000000000000000000000000000000000000000000000000000000000008000000000000000000000000000000000000000000000000000000000000000146f7065726174696f6e735f67656c61746f5f7633000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000151800000000000000000000000000ff11afac4146a0babf7f9f042a22c8053a5467400000000000000000000000000000000000000000000000000000000000000a0000000000000000000000000000000000000000000000000000000000000012000000000000000000000000000000000000000000000000000000000000000600000000000000000000000007506c12a824d73d9b08564d5afc22c949434755e0000000000000000000000000000000000000000000000000de0b6b3a7640000000000000000000000000000cd438409d5cac9d2e076ac7bd0bf2377e99bb6e4000000000000000000000000000000000000000000000000000000000000000100000000000000000000000000000000000000000000000000000000000000200000000000000000000000007506c12a824d73d9b08564d5afc22c949434755e00000000000000000000000000000000000000000000000000000000000000600000000000000000000000000000000000000000000000000de0b6b3a764000000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000020000000000000000000000000000000000000000000000000000000000000002100000000000000000000000000cd438409d5cac9d2e076ac7bd0bf2377e99bb6e400000000000000000000000000000000000000000000000000000000000000", + "contractMethod": null, + "contractInputsValues": null + }, + { + "to": "0x2a6c106ae13b558bb9e2ec64bd2f1f7beff3a5e0", + "value": "0", + "data": "0x3323b467000000000000000000000000a0ff2a54adc3fb33c44a141e67d194cf249258cb000000000000000000000000000000000000000000000000000000000000008000000000000000000000000000000000000000000000000000000000000001200000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000006467148cd2000000000000000000000000000000000000000000000000000000000000002000000000000000000000000000000000000000000000000000000000000000146f7065726174696f6e735f67656c61746f5f763300000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000004000000000000000000000000000000000000000000000000000000000000000a00000000000000000000000000000000000000000000000000000000000000002000000000000000000000000000000000000000000000000000000000000000200000000000000000000000000000000000000000000000000000000000000050000000000000000000000000000000000000000000000000000000000000002000000000000000000000000000000000000000000000000000000000000004000000000000000000000000000000000000000000000000000000000000000c00000000000000000000000000000000000000000000000000000000000000060000000000000000000000000000000000000000000000000000000000000002000000000000000000000000000000000000000000000000000000000000000146f7065726174696f6e735f67656c61746f5f763300000000000000000000000000000000000000000000000000000000000000000000000000000000000000a00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000004000000000000000000000000000000000000000000000000000000000000000400000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000083d600", + "contractMethod": null, + "contractInputsValues": null + }, + { + "to": "0xa0ff2a54adc3fb33c44a141e67d194cf249258cb", + "value": "0", + "data": "0x9bc94d010000000000000000000000000000000000000000000000000000000000000040000000000000000000000000000000000000000000000000000000000000000200000000000000000000000000000000000000000000000000000000000000146f7065726174696f6e735f67656c61746f5f7633000000000000000000000000", + "contractMethod": null, + "contractInputsValues": null + } + ] +} \ No newline at end of file diff --git a/packages/contracts-bedrock/scripts/Artifacts.s.sol b/packages/contracts-bedrock/scripts/Artifacts.s.sol index d8b8a218e92a..bfac0c367bfc 100644 --- a/packages/contracts-bedrock/scripts/Artifacts.s.sol +++ b/packages/contracts-bedrock/scripts/Artifacts.s.sol @@ -4,14 +4,15 @@ pragma solidity ^0.8.0; import { console2 as console } from "forge-std/console2.sol"; import { stdJson } from "forge-std/StdJson.sol"; import { Vm } from "forge-std/Vm.sol"; -import { Executables } from "scripts/Executables.sol"; +import { Executables } from "scripts/libraries/Executables.sol"; import { Predeploys } from "src/libraries/Predeploys.sol"; -import { Config } from "scripts/Config.sol"; -import { StorageSlot } from "scripts/ForgeArtifacts.sol"; +import { Config } from "scripts/libraries/Config.sol"; +import { StorageSlot } from "scripts/libraries/ForgeArtifacts.sol"; import { EIP1967Helper } from "test/mocks/EIP1967Helper.sol"; import { LibString } from "@solady/utils/LibString.sol"; -import { ForgeArtifacts } from "scripts/ForgeArtifacts.sol"; -import { IAddressManager } from "scripts/interfaces/IAddressManager.sol"; +import { ForgeArtifacts } from "scripts/libraries/ForgeArtifacts.sol"; +import { IAddressManager } from "src/legacy/interfaces/IAddressManager.sol"; +import { Process } from "scripts/libraries/Process.sol"; /// @notice Represents a deployment. Is serialized to JSON as a key/value /// pair. Can be accessed from within scripts. @@ -27,13 +28,15 @@ struct Deployment { abstract contract Artifacts { /// @notice Foundry cheatcode VM. Vm private constant vm = Vm(address(uint160(uint256(keccak256("hevm cheat code"))))); - /// @notice Error for when attempting to fetch a deployment and it does not exist + /// @notice Error for when attempting to fetch a deployment and it does not exist error DeploymentDoesNotExist(string); /// @notice Error for when trying to save an invalid deployment error InvalidDeployment(string); - /// @notice The set of deployments that have been done during execution. + /// @notice Error for when attempting to load the initialized slot of an unsupported contract. + error UnsupportedInitializableContract(string); + /// @notice The set of deployments that have been done during execution. mapping(string => Deployment) internal _namedDeployments; /// @notice The same as `_namedDeployments` but as an array. Deployment[] internal _newDeployments; @@ -71,7 +74,7 @@ abstract contract Artifacts { commands[0] = "bash"; commands[1] = "-c"; commands[2] = string.concat("jq -cr < ", _path); - string memory json = string(vm.ffi(commands)); + string memory json = string(Process.run(commands)); string[] memory keys = vm.parseJsonKeys(json, ""); for (uint256 i; i < keys.length; i++) { string memory key = keys[i]; @@ -113,6 +116,8 @@ abstract contract Artifacts { return payable(Predeploys.L2_TO_L1_MESSAGE_PASSER); } else if (digest == keccak256(bytes("L2StandardBridge"))) { return payable(Predeploys.L2_STANDARD_BRIDGE); + } else if (digest == keccak256(bytes("L2StandardBridgeInterop"))) { + return payable(Predeploys.L2_STANDARD_BRIDGE); } else if (digest == keccak256(bytes("L2ERC721Bridge"))) { return payable(Predeploys.L2_ERC721_BRIDGE); } else if (digest == keccak256(bytes("SequencerFeeWallet"))) { @@ -149,6 +154,10 @@ abstract contract Artifacts { return payable(Predeploys.SCHEMA_REGISTRY); } else if (digest == keccak256(bytes("EAS"))) { return payable(Predeploys.EAS); + } else if (digest == keccak256(bytes("OptimismSuperchainERC20Factory"))) { + return payable(Predeploys.OPTIMISM_SUPERCHAIN_ERC20_FACTORY); + } else if (digest == keccak256(bytes("OptimismSuperchainERC20Beacon"))) { + return payable(Predeploys.OPTIMISM_SUPERCHAIN_ERC20_BEACON); } return payable(address(0)); } @@ -189,27 +198,6 @@ abstract contract Artifacts { _appendDeployment(_name, _deployed); } - /// @notice Reads the deployment artifact from disk that were generated - /// by the deploy script. - /// @return An array of deployments. - function _getDeployments() internal returns (Deployment[] memory) { - string memory json = vm.readFile(deploymentOutfile); - string[] memory cmd = new string[](3); - cmd[0] = Executables.bash; - cmd[1] = "-c"; - cmd[2] = string.concat(Executables.jq, " 'keys' <<< '", json, "'"); - bytes memory res = vm.ffi(cmd); - string[] memory names = stdJson.readStringArray(string(res), ""); - - Deployment[] memory deployments = new Deployment[](names.length); - for (uint256 i; i < names.length; i++) { - string memory contractName = names[i]; - address addr = stdJson.readAddress(json, string.concat("$.", contractName)); - deployments[i] = Deployment({ name: contractName, addr: payable(addr) }); - } - return deployments; - } - /// @notice Adds a deployment to the temp deployments file function _appendDeployment(string memory _name, address _deployed) internal { vm.writeJson({ json: stdJson.serialize("", _name, _deployed), path: deploymentOutfile }); @@ -229,6 +217,13 @@ abstract contract Artifacts { /// @notice Returns the value of the internal `_initialized` storage slot for a given contract. function loadInitializedSlot(string memory _contractName) public returns (uint8 initialized_) { + // FaultDisputeGame and PermissionedDisputeGame are initializable but cannot be loaded with + // this function yet because they are not properly labeled in the deploy script. + // TODO: Remove this restriction once the deploy script is fixed. + if (LibString.eq(_contractName, "FaultDisputeGame") || LibString.eq(_contractName, "PermissionedDisputeGame")) { + revert UnsupportedInitializableContract(_contractName); + } + address contractAddress; // Check if the contract name ends with `Proxy` and, if so, get the implementation address if (LibString.endsWith(_contractName, "Proxy")) { diff --git a/packages/contracts-bedrock/scripts/Config.sol b/packages/contracts-bedrock/scripts/Config.sol deleted file mode 100644 index 1a7692d498ff..000000000000 --- a/packages/contracts-bedrock/scripts/Config.sol +++ /dev/null @@ -1,70 +0,0 @@ -// SPDX-License-Identifier: MIT -pragma solidity ^0.8.0; - -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 -/// to ensure that all config is in a single place. -library Config { - /// @notice Foundry cheatcode VM. - Vm private constant vm = Vm(address(uint160(uint256(keccak256("hevm cheat code"))))); - - /// @notice Returns the path on the local filesystem where the deployment artifact is - /// 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/", 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) { - 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 - /// an override. - function chainID() internal view returns (uint256 _env) { - _env = vm.envOr("CHAIN_ID", block.chainid); - } - - /// @notice Returns the value of the env var CONTRACT_ADDRESSES_PATH which is a JSON key/value - /// pair of contract names and their addresses. Each key/value pair is passed to `save` - /// which then backs the `getAddress` function. - function contractAddressesPath() internal view returns (string memory _env) { - _env = vm.envOr("CONTRACT_ADDRESSES_PATH", 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")); - } - - /// @notice Returns the path that the state dump file should be written to or read from - /// on the local filesystem. - function stateDumpPath(string memory _suffix) internal view returns (string memory _env) { - _env = vm.envOr( - "STATE_DUMP_PATH", - string.concat(vm.projectRoot(), "/state-dump-", vm.toString(block.chainid), _suffix, ".json") - ); - } - - /// @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. - function deployFile(string memory _sig) internal view returns (string memory _env) { - _env = vm.envOr("DEPLOY_FILE", string.concat(_sig, "-latest.json")); - } - - /// @notice Returns the private key that is used to configure drippie. - function drippieOwnerPrivateKey() internal view returns (uint256 _env) { - _env = vm.envUint("DRIPPIE_OWNER_PRIVATE_KEY"); - } -} diff --git a/packages/contracts-bedrock/scripts/Deploy.s.sol b/packages/contracts-bedrock/scripts/Deploy.s.sol deleted file mode 100644 index 18cb83d9b8bb..000000000000 --- a/packages/contracts-bedrock/scripts/Deploy.s.sol +++ /dev/null @@ -1,1498 +0,0 @@ -// SPDX-License-Identifier: MIT -pragma solidity ^0.8.0; - -import { VmSafe } from "forge-std/Vm.sol"; -import { Script } from "forge-std/Script.sol"; - -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 { 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"; - -import { ProxyAdmin } from "src/universal/ProxyAdmin.sol"; -import { AddressManager } from "src/legacy/AddressManager.sol"; -import { Proxy } from "src/universal/Proxy.sol"; -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 { L1ChugSplashProxy } from "src/legacy/L1ChugSplashProxy.sol"; -import { ResolvedDelegateProxy } from "src/legacy/ResolvedDelegateProxy.sol"; -import { L1CrossDomainMessenger } from "src/L1/L1CrossDomainMessenger.sol"; -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 { ResourceMetering } from "src/L1/ResourceMetering.sol"; -import { DataAvailabilityChallenge } from "src/L1/DataAvailabilityChallenge.sol"; -import { Constants } from "src/libraries/Constants.sol"; -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"; -import { ProtocolVersions, ProtocolVersion } from "src/L1/ProtocolVersions.sol"; -import { StorageSetter } from "src/universal/StorageSetter.sol"; -import { Predeploys } from "src/libraries/Predeploys.sol"; -import { Chains } from "scripts/Chains.sol"; -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/dispute/lib/Types.sol"; -import { ChainAssertions } from "scripts/ChainAssertions.sol"; -import { Types } from "scripts/Types.sol"; -import { LibStateDiff } from "scripts/libraries/LibStateDiff.sol"; -import { EIP1967Helper } from "test/mocks/EIP1967Helper.sol"; -import { ForgeArtifacts } from "scripts/ForgeArtifacts.sol"; - -/// @title Deploy -/// @notice Script used to deploy a bedrock system. The entire system is deployed within the `run` function. -/// To add a new contract to the system, add a public function that deploys that individual contract. -/// Then add a call to that function inside of `run`. Be sure to call the `save` function after each -/// deployment so that hardhat-deploy style artifacts can be generated using a call to `sync()`. -/// The `CONTRACT_ADDRESSES_PATH` environment variable can be set to a path that contains a JSON file full of -/// contract name to address pairs. That enables this script to be much more flexible in the way it is used. -/// This contract must not have constructor logic because it is set into state using `etch`. -contract Deploy is Deployer { - using stdJson for string; - - /// @notice FaultDisputeGameParams is a struct that contains the parameters necessary to call - /// the function _setFaultGameImplementation. This struct exists because the EVM needs - /// 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; - IBigStepper faultVm; - uint256 maxGameDepth; - } - - //////////////////////////////////////////////////////////////// - // Modifiers // - //////////////////////////////////////////////////////////////// - - /// @notice Modifier that wraps a function in broadcasting. - modifier broadcast() { - vm.startBroadcast(msg.sender); - _; - vm.stopBroadcast(); - } - - /// @notice Modifier that will only allow a function to be called on devnet. - modifier onlyDevnet() { - uint256 chainid = block.chainid; - if (chainid == Chains.LocalDevnet || chainid == Chains.GethDevnet) { - _; - } - } - - /// @notice Modifier that will only allow a function to be called on a public - /// testnet or devnet. - modifier onlyTestnetOrDevnet() { - uint256 chainid = block.chainid; - if ( - chainid == Chains.Goerli || chainid == Chains.Sepolia || chainid == Chains.LocalDevnet - || chainid == Chains.GethDevnet - ) { - _; - } - } - - /// @notice Modifier that wraps a function with statediff recording. - /// The returned AccountAccess[] array is then written to - /// the `snapshots/state-diff/<name>.json` output file. - modifier stateDiff() { - vm.startStateDiffRecording(); - _; - VmSafe.AccountAccess[] memory accesses = vm.stopAndReturnStateDiff(); - 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/", vm.toString(block.chainid), ".json"); - vm.writeJson({ json: json, path: statediffPath }); - } - - //////////////////////////////////////////////////////////////// - // Accessors // - //////////////////////////////////////////////////////////////// - - /// @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. - function _implSalt() internal view returns (bytes32) { - return keccak256(bytes(Config.implSalt())); - } - - /// @notice Returns the proxy addresses. If a proxy is not found, it will have address(0). - function _proxies() internal view returns (Types.ContractSet memory proxies_) { - proxies_ = Types.ContractSet({ - L1CrossDomainMessenger: mustGetAddress("L1CrossDomainMessengerProxy"), - L1StandardBridge: mustGetAddress("L1StandardBridgeProxy"), - L2OutputOracle: mustGetAddress("L2OutputOracleProxy"), - DisputeGameFactory: mustGetAddress("DisputeGameFactoryProxy"), - DelayedWETH: mustGetAddress("DelayedWETHProxy"), - AnchorStateRegistry: mustGetAddress("AnchorStateRegistryProxy"), - OptimismMintableERC20Factory: mustGetAddress("OptimismMintableERC20FactoryProxy"), - OptimismPortal: mustGetAddress("OptimismPortalProxy"), - OptimismPortal2: mustGetAddress("OptimismPortalProxy"), - SystemConfig: mustGetAddress("SystemConfigProxy"), - L1ERC721Bridge: mustGetAddress("L1ERC721BridgeProxy"), - ProtocolVersions: mustGetAddress("ProtocolVersionsProxy"), - SuperchainConfig: mustGetAddress("SuperchainConfigProxy") - }); - } - - /// @notice Returns the proxy addresses, not reverting if any are unset. - function _proxiesUnstrict() internal view returns (Types.ContractSet memory proxies_) { - proxies_ = Types.ContractSet({ - L1CrossDomainMessenger: getAddress("L1CrossDomainMessengerProxy"), - L1StandardBridge: getAddress("L1StandardBridgeProxy"), - L2OutputOracle: getAddress("L2OutputOracleProxy"), - DisputeGameFactory: getAddress("DisputeGameFactoryProxy"), - DelayedWETH: getAddress("DelayedWETHProxy"), - AnchorStateRegistry: getAddress("AnchorStateRegistryProxy"), - OptimismMintableERC20Factory: getAddress("OptimismMintableERC20FactoryProxy"), - OptimismPortal: getAddress("OptimismPortalProxy"), - OptimismPortal2: getAddress("OptimismPortalProxy"), - SystemConfig: getAddress("SystemConfigProxy"), - L1ERC721Bridge: getAddress("L1ERC721BridgeProxy"), - ProtocolVersions: getAddress("ProtocolVersionsProxy"), - SuperchainConfig: getAddress("SuperchainConfigProxy") - }); - } - - //////////////////////////////////////////////////////////////// - // State Changing Helper Functions // - //////////////////////////////////////////////////////////////// - - /// @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; - address safeSingleton = 0xd9Db270c1B5E3Bd161E8c8503c55cEABeE709552; - - safeProxyFactory.code.length == 0 - ? safeProxyFactory_ = new SafeProxyFactory() - : safeProxyFactory_ = SafeProxyFactory(safeProxyFactory); - - safeSingleton.code.length == 0 ? safeSingleton_ = new Safe() : safeSingleton_ = Safe(payable(safeSingleton)); - - save("SafeProxyFactory", address(safeProxyFactory_)); - save("SafeSingleton", address(safeSingleton_)); - } - - /// @notice Make a call from the Safe contract to an arbitrary address with arbitrary data - 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({ - to: _target, - value: 0, - data: _data, - operation: SafeOps.Operation.Call, - safeTxGas: 0, - baseGas: 0, - gasPrice: 0, - gasToken: address(0), - refundReceiver: payable(address(0)), - signatures: signature - }); - } - - /// @notice Call from the Safe contract to the Proxy Admin's upgrade and call method - function _upgradeAndCallViaSafe(address _proxy, address _implementation, bytes memory _innerCallData) internal { - address proxyAdmin = mustGetAddress("ProxyAdmin"); - - bytes memory data = - abi.encodeCall(ProxyAdmin.upgradeAndCall, (payable(_proxy), _implementation, _innerCallData)); - - Safe safe = Safe(mustGetAddress("SystemOwnerSafe")); - _callViaSafe({ _safe: safe, _target: proxyAdmin, _data: data }); - } - - /// @notice Transfer ownership of the ProxyAdmin contract to the final system owner - function transferProxyAdminOwnership() public broadcast { - ProxyAdmin proxyAdmin = ProxyAdmin(mustGetAddress("ProxyAdmin")); - address owner = proxyAdmin.owner(); - address safe = mustGetAddress("SystemOwnerSafe"); - if (owner != safe) { - proxyAdmin.transferOwnership(safe); - console.log("ProxyAdmin ownership transferred to Safe at: %s", safe); - } - } - - /// @notice Transfer ownership of a Proxy to the ProxyAdmin contract - /// This is expected to be used in conjusting with deployERC1967ProxyWithOwner after setup actions - /// have been performed on the proxy. - /// @param _name The name of the proxy to transfer ownership of. - function transferProxyToProxyAdmin(string memory _name) public broadcast { - Proxy proxy = Proxy(mustGetAddress(_name)); - address proxyAdmin = mustGetAddress("ProxyAdmin"); - proxy.changeAdmin(proxyAdmin); - console.log("Proxy %s ownership transferred to ProxyAdmin at: %s", _name, proxyAdmin); - } - - //////////////////////////////////////////////////////////////// - // SetUp and Run // - //////////////////////////////////////////////////////////////// - - /// @notice Deploy all of the L1 contracts necessary for a full Superchain with a single Op Chain. - function run() public { - console.log("Deploying a fresh OP Stack including SuperchainConfig"); - _run(); - } - - function runWithStateDump() public { - vm.chainId(cfg.l1ChainID()); - _run(); - vm.dumpState(Config.stateDumpPath("")); - } - - /// @notice Deploy all L1 contracts and write the state diff to a file. - function runWithStateDiff() public stateDiff { - _run(); - } - - /// @notice Internal function containing the deploy logic. - 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(); - } - setupOpChain(); - console.log("set up op chain!"); - } - - //////////////////////////////////////////////////////////////// - // High Level Deployment Functions // - //////////////////////////////////////////////////////////////// - - /// @notice Deploy a full system with a new SuperchainConfig - /// The Superchain system has 2 singleton contracts which lie outside of an OP Chain: - /// 1. The SuperchainConfig contract - /// 2. The ProtocolVersions contract - function setupSuperchain() public { - console.log("Setting up Superchain"); - - // Deploy a new ProxyAdmin and AddressManager - // This proxy will be used on the SuperchainConfig and ProtocolVersions contracts, as well as the contracts - // in the OP Chain system. - deployAddressManager(); - deployProxyAdmin(); - transferProxyAdminOwnership(); - - // Deploy the SuperchainConfigProxy - deployERC1967Proxy("SuperchainConfigProxy"); - deploySuperchainConfig(); - initializeSuperchainConfig(); - - // Deploy the ProtocolVersionsProxy - deployERC1967Proxy("ProtocolVersionsProxy"); - deployProtocolVersions(); - initializeProtocolVersions(); - } - - /// @notice Deploy a new OP Chain, with an existing SuperchainConfig provided - function setupOpChain() public { - console.log("Deploying OP Chain"); - - // Ensure that the requisite contracts are deployed - mustGetAddress("SuperchainConfigProxy"); - mustGetAddress("SystemOwnerSafe"); - mustGetAddress("AddressManager"); - mustGetAddress("ProxyAdmin"); - - deployProxies(); - deployImplementations(); - initializeImplementations(); - - setAlphabetFaultGameImplementation({ _allowUpgrade: false }); - setCannonFaultGameImplementation({ _allowUpgrade: false }); - setPermissionedCannonFaultGameImplementation({ _allowUpgrade: false }); - - transferDisputeGameFactoryOwnership(); - transferDelayedWETHOwnership(); - } - - /// @notice Deploy all of the proxies - function deployProxies() public { - console.log("Deploying proxies"); - - deployERC1967Proxy("OptimismPortalProxy"); - deployERC1967Proxy("SystemConfigProxy"); - deployL1StandardBridgeProxy(); - deployL1CrossDomainMessengerProxy(); - deployERC1967Proxy("OptimismMintableERC20FactoryProxy"); - deployERC1967Proxy("L1ERC721BridgeProxy"); - - // Both the DisputeGameFactory and L2OutputOracle proxies are deployed regardles of whether FPAC is enabled - // to prevent a nastier refactor to the deploy scripts. In the future, the L2OutputOracle will be removed. If - // fault proofs are not enabled, the DisputeGameFactory proxy will be unused. - deployERC1967Proxy("DisputeGameFactoryProxy"); - deployERC1967Proxy("L2OutputOracleProxy"); - deployERC1967Proxy("DelayedWETHProxy"); - deployERC1967Proxy("AnchorStateRegistryProxy"); - - transferAddressManagerOwnership(); // to the ProxyAdmin - } - - /// @notice Deploy all of the implementations - function deployImplementations() public { - console.log("Deploying implementations"); - deployL1CrossDomainMessenger(); - deployOptimismMintableERC20Factory(); - deploySystemConfig(); - deployL1StandardBridge(); - deployL1ERC721Bridge(); - deployOptimismPortal(); - deployL2OutputOracle(); - - // Fault proofs - deployOptimismPortal2(); - deployDisputeGameFactory(); - deployDelayedWETH(); - deployPreimageOracle(); - deployMips(); - deployAnchorStateRegistry(); - } - - /// @notice Initialize all of the implementations - function initializeImplementations() public { - console.log("Initializing implementations"); - // 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. - if (cfg.useFaultProofs()) { - console.log("WARNING: FPAC is enabled. Initializing the OptimismPortal proxy with the OptimismPortal2."); - initializeOptimismPortal2(); - } else { - initializeOptimismPortal(); - } - - initializeSystemConfig(); - initializeL1StandardBridge(); - initializeL1ERC721Bridge(); - initializeOptimismMintableERC20Factory(); - initializeL1CrossDomainMessenger(); - initializeL2OutputOracle(); - initializeDisputeGameFactory(); - initializeDelayedWETH(); - initializeAnchorStateRegistry(); - } - - /// @notice Add Plasma setup to the OP chain - function setupOpPlasma() public { - console.log("Deploying OP Plasma"); - deployDataAvailabilityChallengeProxy(); - deployDataAvailabilityChallenge(); - initializeDataAvailabilityChallenge(); - } - - //////////////////////////////////////////////////////////////// - // Non-Proxied Deployment Functions // - //////////////////////////////////////////////////////////////// - - /// @notice Deploy the Safe - function deploySafe(string memory _name) public broadcast returns (address addr_) { - address[] memory owners = new address[](0); - addr_ = deploySafe(_name, owners, 1, true); - } - - function deploySafe( - string memory _name, - address[] memory _owners, - uint256 _threshold, - bool _keepDeployer - ) - public - returns (address addr_) - { - console.log("Deploying safe: %s ", _name); - (SafeProxyFactory safeProxyFactory, Safe safeSingleton) = _getSafeFactory(); - - 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.encodeCall( - Safe.setup, (_owners, _threshold, address(0), hex"", address(0), address(0), 0, payable(address(0))) - ); - addr_ = address( - safeProxyFactory.createProxyWithNonce( - address(safeSingleton), initData, uint256(keccak256(abi.encode(_name))) - ) - ); - - save(_name, addr_); - console.log("New safe: %s deployed at %s\n Note that this safe is owned by the deployer key", _name, addr_); - } - - /// @notice Deploy the AddressManager - function deployAddressManager() public broadcast returns (address addr_) { - console.log("Deploying AddressManager"); - AddressManager manager = new AddressManager(); - require(manager.owner() == msg.sender); - - save("AddressManager", address(manager)); - console.log("AddressManager deployed at %s", address(manager)); - addr_ = address(manager); - } - - /// @notice Deploy the ProxyAdmin - function deployProxyAdmin() public broadcast returns (address addr_) { - console.log("Deploying ProxyAdmin"); - ProxyAdmin admin = new ProxyAdmin({ _owner: msg.sender }); - require(admin.owner() == msg.sender); - - AddressManager addressManager = AddressManager(mustGetAddress("AddressManager")); - if (admin.addressManager() != addressManager) { - admin.setAddressManager(addressManager); - } - - require(admin.addressManager() == addressManager); - - save("ProxyAdmin", address(admin)); - console.log("ProxyAdmin deployed at %s", address(admin)); - addr_ = address(admin); - } - - /// @notice Deploy the StorageSetter contract, used for upgrades. - function deployStorageSetter() public broadcast returns (address addr_) { - console.log("Deploying StorageSetter"); - StorageSetter setter = new StorageSetter{ salt: _implSalt() }(); - console.log("StorageSetter deployed at: %s", address(setter)); - string memory version = setter.version(); - console.log("StorageSetter version: %s", version); - addr_ = address(setter); - } - - //////////////////////////////////////////////////////////////// - // Proxy Deployment Functions // - //////////////////////////////////////////////////////////////// - - /// @notice Deploy the L1StandardBridgeProxy using a ChugSplashProxy - function deployL1StandardBridgeProxy() public broadcast returns (address addr_) { - console.log("Deploying proxy for L1StandardBridge"); - address proxyAdmin = mustGetAddress("ProxyAdmin"); - L1ChugSplashProxy proxy = new L1ChugSplashProxy(proxyAdmin); - - require(EIP1967Helper.getAdmin(address(proxy)) == proxyAdmin); - - save("L1StandardBridgeProxy", address(proxy)); - console.log("L1StandardBridgeProxy deployed at %s", address(proxy)); - addr_ = address(proxy); - } - - /// @notice Deploy the L1CrossDomainMessengerProxy using a ResolvedDelegateProxy - function deployL1CrossDomainMessengerProxy() public broadcast returns (address addr_) { - console.log("Deploying proxy for L1CrossDomainMessenger"); - AddressManager addressManager = AddressManager(mustGetAddress("AddressManager")); - ResolvedDelegateProxy proxy = new ResolvedDelegateProxy(addressManager, "OVM_L1CrossDomainMessenger"); - - save("L1CrossDomainMessengerProxy", address(proxy)); - console.log("L1CrossDomainMessengerProxy deployed at %s", address(proxy)); - - addr_ = address(proxy); - } - - /// @notice Deploys an ERC1967Proxy contract with the ProxyAdmin as the owner. - /// @param _name The name of the proxy contract to be deployed. - /// @return addr_ The address of the deployed proxy contract. - function deployERC1967Proxy(string memory _name) public returns (address addr_) { - addr_ = deployERC1967ProxyWithOwner(_name, mustGetAddress("ProxyAdmin")); - } - - /// @notice Deploys an ERC1967Proxy contract with a specified owner. - /// @param _name The name of the proxy contract to be deployed. - /// @param _proxyOwner The address of the owner of the proxy contract. - /// @return addr_ The address of the deployed proxy contract. - function deployERC1967ProxyWithOwner( - string memory _name, - address _proxyOwner - ) - public - broadcast - returns (address addr_) - { - console.log(string.concat("Deploying ERC1967 proxy for ", _name)); - Proxy proxy = new Proxy({ _admin: _proxyOwner }); - - require(EIP1967Helper.getAdmin(address(proxy)) == _proxyOwner); - - save(_name, address(proxy)); - console.log(" at %s", address(proxy)); - addr_ = address(proxy); - } - - /// @notice Deploy the DataAvailabilityChallengeProxy - function deployDataAvailabilityChallengeProxy() public broadcast returns (address addr_) { - console.log("Deploying proxy for DataAvailabilityChallenge"); - address proxyAdmin = mustGetAddress("ProxyAdmin"); - Proxy proxy = new Proxy({ _admin: proxyAdmin }); - - require(EIP1967Helper.getAdmin(address(proxy)) == proxyAdmin); - - save("DataAvailabilityChallengeProxy", address(proxy)); - console.log("DataAvailabilityChallengeProxy deployed at %s", address(proxy)); - - addr_ = address(proxy); - } - - //////////////////////////////////////////////////////////////// - // Implementation Deployment Functions // - //////////////////////////////////////////////////////////////// - - /// @notice Deploy the SuperchainConfig contract - function deploySuperchainConfig() public broadcast { - SuperchainConfig superchainConfig = new SuperchainConfig{ salt: _implSalt() }(); - - require(superchainConfig.guardian() == address(0)); - bytes32 initialized = vm.load(address(superchainConfig), bytes32(0)); - require(initialized != 0); - - save("SuperchainConfig", address(superchainConfig)); - console.log("SuperchainConfig deployed at %s", address(superchainConfig)); - } - - /// @notice Deploy the L1CrossDomainMessenger - function deployL1CrossDomainMessenger() public broadcast returns (address addr_) { - console.log("Deploying L1CrossDomainMessenger implementation"); - L1CrossDomainMessenger messenger = new L1CrossDomainMessenger{ salt: _implSalt() }(); - - save("L1CrossDomainMessenger", address(messenger)); - console.log("L1CrossDomainMessenger deployed at %s", address(messenger)); - - // Override the `L1CrossDomainMessenger` contract to the deployed implementation. This is necessary - // to check the `L1CrossDomainMessenger` implementation alongside dependent contracts, which - // are always proxies. - Types.ContractSet memory contracts = _proxiesUnstrict(); - contracts.L1CrossDomainMessenger = address(messenger); - ChainAssertions.checkL1CrossDomainMessenger({ _contracts: contracts, _vm: vm, _isProxy: false }); - - addr_ = address(messenger); - } - - /// @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)); - - // 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); - ChainAssertions.checkOptimismPortal({ _contracts: contracts, _cfg: cfg, _isProxy: false }); - - addr_ = address(portal); - } - - /// @notice Deploy the OptimismPortal2 - function deployOptimismPortal2() public broadcast returns (address addr_) { - console.log("Deploying OptimismPortal2 implementation"); - - // Could also verify this inside DeployConfig but doing it here is a bit more reliable. - require( - uint32(cfg.respectedGameType()) == cfg.respectedGameType(), "Deploy: respectedGameType must fit into uint32" - ); - - OptimismPortal2 portal = new OptimismPortal2{ salt: _implSalt() }({ - _proofMaturityDelaySeconds: cfg.proofMaturityDelaySeconds(), - _disputeGameFinalityDelaySeconds: cfg.disputeGameFinalityDelaySeconds() - }); - - save("OptimismPortal2", address(portal)); - console.log("OptimismPortal2 deployed at %s", address(portal)); - - // Override the `OptimismPortal2` contract to the deployed implementation. This is necessary - // to check the `OptimismPortal2` implementation alongside dependent contracts, which - // are always proxies. - Types.ContractSet memory contracts = _proxiesUnstrict(); - contracts.OptimismPortal2 = address(portal); - ChainAssertions.checkOptimismPortal2({ _contracts: contracts, _cfg: cfg, _isProxy: false }); - - addr_ = address(portal); - } - - /// @notice Deploy the L2OutputOracle - function deployL2OutputOracle() public broadcast returns (address addr_) { - console.log("Deploying L2OutputOracle implementation"); - L2OutputOracle oracle = new L2OutputOracle{ salt: _implSalt() }(); - - save("L2OutputOracle", address(oracle)); - console.log("L2OutputOracle deployed at %s", address(oracle)); - - // Override the `L2OutputOracle` contract to the deployed implementation. This is necessary - // to check the `L2OutputOracle` implementation alongside dependent contracts, which - // are always proxies. - Types.ContractSet memory contracts = _proxiesUnstrict(); - contracts.L2OutputOracle = address(oracle); - ChainAssertions.checkL2OutputOracle({ - _contracts: contracts, - _cfg: cfg, - _l2OutputOracleStartingTimestamp: 0, - _isProxy: false - }); - - addr_ = address(oracle); - } - - /// @notice Deploy the OptimismMintableERC20Factory - function deployOptimismMintableERC20Factory() public broadcast returns (address addr_) { - console.log("Deploying OptimismMintableERC20Factory implementation"); - OptimismMintableERC20Factory factory = new OptimismMintableERC20Factory{ salt: _implSalt() }(); - - save("OptimismMintableERC20Factory", address(factory)); - console.log("OptimismMintableERC20Factory deployed at %s", address(factory)); - - // Override the `OptimismMintableERC20Factory` contract to the deployed implementation. This is necessary - // to check the `OptimismMintableERC20Factory` implementation alongside dependent contracts, which - // are always proxies. - Types.ContractSet memory contracts = _proxiesUnstrict(); - contracts.OptimismMintableERC20Factory = address(factory); - ChainAssertions.checkOptimismMintableERC20Factory({ _contracts: contracts, _isProxy: false }); - - addr_ = address(factory); - } - - /// @notice Deploy the DisputeGameFactory - function deployDisputeGameFactory() public broadcast returns (address addr_) { - console.log("Deploying DisputeGameFactory implementation"); - DisputeGameFactory factory = new DisputeGameFactory{ salt: _implSalt() }(); - save("DisputeGameFactory", address(factory)); - console.log("DisputeGameFactory deployed at %s", address(factory)); - - // Override the `DisputeGameFactory` contract to the deployed implementation. This is necessary to check the - // `DisputeGameFactory` implementation alongside dependent contracts, which are always proxies. - Types.ContractSet memory contracts = _proxiesUnstrict(); - contracts.DisputeGameFactory = address(factory); - ChainAssertions.checkDisputeGameFactory({ _contracts: contracts, _expectedOwner: address(0) }); - - addr_ = address(factory); - } - - function deployDelayedWETH() public broadcast returns (address addr_) { - console.log("Deploying DelayedWETH implementation"); - DelayedWETH weth = new DelayedWETH{ salt: _implSalt() }(cfg.faultGameWithdrawalDelay()); - save("DelayedWETH", address(weth)); - console.log("DelayedWETH deployed at %s", address(weth)); - - // Override the `DelayedWETH` contract to the deployed implementation. This is necessary - // to check the `DelayedWETH` implementation alongside dependent contracts, which are - // always proxies. - Types.ContractSet memory contracts = _proxiesUnstrict(); - contracts.DelayedWETH = address(weth); - ChainAssertions.checkDelayedWETH({ - _contracts: contracts, - _cfg: cfg, - _isProxy: false, - _expectedOwner: address(0) - }); - - addr_ = address(weth); - } - - /// @notice Deploy the ProtocolVersions - function deployProtocolVersions() public broadcast returns (address addr_) { - console.log("Deploying ProtocolVersions implementation"); - ProtocolVersions versions = new ProtocolVersions{ salt: _implSalt() }(); - save("ProtocolVersions", address(versions)); - console.log("ProtocolVersions deployed at %s", address(versions)); - - // Override the `ProtocolVersions` contract to the deployed implementation. This is necessary - // to check the `ProtocolVersions` implementation alongside dependent contracts, which - // are always proxies. - Types.ContractSet memory contracts = _proxiesUnstrict(); - contracts.ProtocolVersions = address(versions); - ChainAssertions.checkProtocolVersions({ _contracts: contracts, _cfg: cfg, _isProxy: false }); - - addr_ = address(versions); - } - - /// @notice Deploy the PreimageOracle - function deployPreimageOracle() public broadcast returns (address addr_) { - console.log("Deploying PreimageOracle implementation"); - PreimageOracle preimageOracle = new PreimageOracle{ salt: _implSalt() }({ - _minProposalSize: cfg.preimageOracleMinProposalSize(), - _challengePeriod: cfg.preimageOracleChallengePeriod() - }); - save("PreimageOracle", address(preimageOracle)); - console.log("PreimageOracle deployed at %s", address(preimageOracle)); - - addr_ = address(preimageOracle); - } - - /// @notice Deploy Mips - function deployMips() public broadcast returns (address addr_) { - console.log("Deploying Mips implementation"); - MIPS mips = new MIPS{ salt: _implSalt() }(IPreimageOracle(mustGetAddress("PreimageOracle"))); - save("Mips", address(mips)); - console.log("MIPS deployed at %s", address(mips)); - - 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)); - - // 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); - ChainAssertions.checkSystemConfig({ _contracts: contracts, _cfg: cfg, _isProxy: false }); - - addr_ = address(config); - } - - /// @notice Deploy the L1StandardBridge - function deployL1StandardBridge() public broadcast returns (address addr_) { - console.log("Deploying L1StandardBridge implementation"); - - L1StandardBridge bridge = new L1StandardBridge{ salt: _implSalt() }(); - - save("L1StandardBridge", address(bridge)); - console.log("L1StandardBridge deployed at %s", address(bridge)); - - // Override the `L1StandardBridge` contract to the deployed implementation. This is necessary - // to check the `L1StandardBridge` implementation alongside dependent contracts, which - // are always proxies. - Types.ContractSet memory contracts = _proxiesUnstrict(); - contracts.L1StandardBridge = address(bridge); - ChainAssertions.checkL1StandardBridge({ _contracts: contracts, _isProxy: false }); - - addr_ = address(bridge); - } - - /// @notice Deploy the L1ERC721Bridge - function deployL1ERC721Bridge() public broadcast returns (address addr_) { - console.log("Deploying L1ERC721Bridge implementation"); - L1ERC721Bridge bridge = new L1ERC721Bridge{ salt: _implSalt() }(); - - save("L1ERC721Bridge", address(bridge)); - console.log("L1ERC721Bridge deployed at %s", address(bridge)); - - // Override the `L1ERC721Bridge` contract to the deployed implementation. This is necessary - // to check the `L1ERC721Bridge` implementation alongside dependent contracts, which - // are always proxies. - Types.ContractSet memory contracts = _proxiesUnstrict(); - contracts.L1ERC721Bridge = address(bridge); - - ChainAssertions.checkL1ERC721Bridge({ _contracts: contracts, _isProxy: false }); - - addr_ = address(bridge); - } - - /// @notice Transfer ownership of the address manager to the ProxyAdmin - function transferAddressManagerOwnership() public broadcast { - console.log("Transferring AddressManager ownership to ProxyAdmin"); - AddressManager addressManager = AddressManager(mustGetAddress("AddressManager")); - address owner = addressManager.owner(); - address proxyAdmin = mustGetAddress("ProxyAdmin"); - if (owner != proxyAdmin) { - addressManager.transferOwnership(proxyAdmin); - console.log("AddressManager ownership transferred to %s", proxyAdmin); - } - - require(addressManager.owner() == proxyAdmin); - } - - /// @notice Deploy the DataAvailabilityChallenge - function deployDataAvailabilityChallenge() public broadcast returns (address addr_) { - console.log("Deploying DataAvailabilityChallenge implementation"); - DataAvailabilityChallenge dac = new DataAvailabilityChallenge(); - save("DataAvailabilityChallenge", address(dac)); - console.log("DataAvailabilityChallenge deployed at %s", address(dac)); - - addr_ = address(dac); - } - - //////////////////////////////////////////////////////////////// - // Initialize Functions // - //////////////////////////////////////////////////////////////// - - /// @notice Initialize the SuperchainConfig - function initializeSuperchainConfig() public broadcast { - address payable superchainConfigProxy = mustGetAddress("SuperchainConfigProxy"); - address payable superchainConfig = mustGetAddress("SuperchainConfig"); - _upgradeAndCallViaSafe({ - _proxy: superchainConfigProxy, - _implementation: superchainConfig, - _innerCallData: abi.encodeCall(SuperchainConfig.initialize, (cfg.superchainConfigGuardian(), false)) - }); - - ChainAssertions.checkSuperchainConfig({ _contracts: _proxiesUnstrict(), _cfg: cfg, _isPaused: false }); - } - - /// @notice Initialize the DisputeGameFactory - function initializeDisputeGameFactory() public broadcast { - console.log("Upgrading and initializing DisputeGameFactory proxy"); - address disputeGameFactoryProxy = mustGetAddress("DisputeGameFactoryProxy"); - address disputeGameFactory = mustGetAddress("DisputeGameFactory"); - - _upgradeAndCallViaSafe({ - _proxy: payable(disputeGameFactoryProxy), - _implementation: disputeGameFactory, - _innerCallData: abi.encodeCall(DisputeGameFactory.initialize, (msg.sender)) - }); - - string memory version = DisputeGameFactory(disputeGameFactoryProxy).version(); - console.log("DisputeGameFactory version: %s", version); - - ChainAssertions.checkDisputeGameFactory({ _contracts: _proxiesUnstrict(), _expectedOwner: msg.sender }); - } - - function initializeDelayedWETH() public broadcast { - console.log("Upgrading and initializing DelayedWETH proxy"); - address delayedWETHProxy = mustGetAddress("DelayedWETHProxy"); - address delayedWETH = mustGetAddress("DelayedWETH"); - address superchainConfigProxy = mustGetAddress("SuperchainConfigProxy"); - - _upgradeAndCallViaSafe({ - _proxy: payable(delayedWETHProxy), - _implementation: delayedWETH, - _innerCallData: abi.encodeCall(DelayedWETH.initialize, (msg.sender, SuperchainConfig(superchainConfigProxy))) - }); - - string memory version = DelayedWETH(payable(delayedWETHProxy)).version(); - console.log("DelayedWETH version: %s", version); - - ChainAssertions.checkDelayedWETH({ - _contracts: _proxiesUnstrict(), - _cfg: cfg, - _isProxy: true, - _expectedOwner: msg.sender - }); - } - - 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"); - address systemConfigProxy = mustGetAddress("SystemConfigProxy"); - address systemConfig = mustGetAddress("SystemConfig"); - - bytes32 batcherHash = bytes32(uint256(uint160(cfg.batchSenderAddress()))); - - address customGasTokenAddress = Constants.ETHER; - if (cfg.useCustomGasToken()) { - customGasTokenAddress = cfg.customGasTokenAddress(); - } - - _upgradeAndCallViaSafe({ - _proxy: payable(systemConfigProxy), - _implementation: systemConfig, - _innerCallData: abi.encodeCall( - SystemConfig.initialize, - ( - cfg.finalSystemOwner(), - cfg.basefeeScalar(), - cfg.blobbasefeeScalar(), - batcherHash, - uint64(cfg.l2GenesisBlockGasLimit()), - cfg.p2pSequencerAddress(), - Constants.DEFAULT_RESOURCE_CONFIG(), - cfg.batchInboxAddress(), - SystemConfig.Addresses({ - l1CrossDomainMessenger: mustGetAddress("L1CrossDomainMessengerProxy"), - l1ERC721Bridge: mustGetAddress("L1ERC721BridgeProxy"), - l1StandardBridge: mustGetAddress("L1StandardBridgeProxy"), - disputeGameFactory: mustGetAddress("DisputeGameFactoryProxy"), - optimismPortal: mustGetAddress("OptimismPortalProxy"), - optimismMintableERC20Factory: mustGetAddress("OptimismMintableERC20FactoryProxy"), - gasPayingToken: customGasTokenAddress - }) - ) - ) - }); - - SystemConfig config = SystemConfig(systemConfigProxy); - string memory version = config.version(); - console.log("SystemConfig version: %s", version); - - ChainAssertions.checkSystemConfig({ _contracts: _proxies(), _cfg: cfg, _isProxy: true }); - } - - /// @notice Initialize the L1StandardBridge - function initializeL1StandardBridge() public broadcast { - console.log("Upgrading and initializing L1StandardBridge proxy"); - ProxyAdmin proxyAdmin = ProxyAdmin(mustGetAddress("ProxyAdmin")); - address l1StandardBridgeProxy = mustGetAddress("L1StandardBridgeProxy"); - 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)) - }); - } - require(uint256(proxyAdmin.proxyType(l1StandardBridgeProxy)) == uint256(ProxyAdmin.ProxyType.CHUGSPLASH)); - - _upgradeAndCallViaSafe({ - _proxy: payable(l1StandardBridgeProxy), - _implementation: l1StandardBridge, - _innerCallData: abi.encodeCall( - L1StandardBridge.initialize, - ( - L1CrossDomainMessenger(l1CrossDomainMessengerProxy), - SuperchainConfig(superchainConfigProxy), - SystemConfig(systemConfigProxy) - ) - ) - }); - - string memory version = L1StandardBridge(payable(l1StandardBridgeProxy)).version(); - console.log("L1StandardBridge version: %s", version); - - ChainAssertions.checkL1StandardBridge({ _contracts: _proxies(), _isProxy: true }); - } - - /// @notice Initialize the L1ERC721Bridge - function initializeL1ERC721Bridge() public broadcast { - console.log("Upgrading and initializing L1ERC721Bridge proxy"); - address l1ERC721BridgeProxy = mustGetAddress("L1ERC721BridgeProxy"); - address l1ERC721Bridge = mustGetAddress("L1ERC721Bridge"); - address l1CrossDomainMessengerProxy = mustGetAddress("L1CrossDomainMessengerProxy"); - address superchainConfigProxy = mustGetAddress("SuperchainConfigProxy"); - - _upgradeAndCallViaSafe({ - _proxy: payable(l1ERC721BridgeProxy), - _implementation: l1ERC721Bridge, - _innerCallData: abi.encodeCall( - L1ERC721Bridge.initialize, - (L1CrossDomainMessenger(payable(l1CrossDomainMessengerProxy)), SuperchainConfig(superchainConfigProxy)) - ) - }); - - L1ERC721Bridge bridge = L1ERC721Bridge(l1ERC721BridgeProxy); - string memory version = bridge.version(); - console.log("L1ERC721Bridge version: %s", version); - - ChainAssertions.checkL1ERC721Bridge({ _contracts: _proxies(), _isProxy: true }); - } - - /// @notice Initialize the OptimismMintableERC20Factory - function initializeOptimismMintableERC20Factory() public broadcast { - console.log("Upgrading and initializing OptimismMintableERC20Factory proxy"); - address optimismMintableERC20FactoryProxy = mustGetAddress("OptimismMintableERC20FactoryProxy"); - address optimismMintableERC20Factory = mustGetAddress("OptimismMintableERC20Factory"); - address l1StandardBridgeProxy = mustGetAddress("L1StandardBridgeProxy"); - - _upgradeAndCallViaSafe({ - _proxy: payable(optimismMintableERC20FactoryProxy), - _implementation: optimismMintableERC20Factory, - _innerCallData: abi.encodeCall(OptimismMintableERC20Factory.initialize, (l1StandardBridgeProxy)) - }); - - OptimismMintableERC20Factory factory = OptimismMintableERC20Factory(optimismMintableERC20FactoryProxy); - string memory version = factory.version(); - console.log("OptimismMintableERC20Factory version: %s", version); - - ChainAssertions.checkOptimismMintableERC20Factory({ _contracts: _proxies(), _isProxy: true }); - } - - /// @notice initializeL1CrossDomainMessenger - function initializeL1CrossDomainMessenger() public broadcast { - console.log("Upgrading and initializing L1CrossDomainMessenger proxy"); - ProxyAdmin proxyAdmin = ProxyAdmin(mustGetAddress("ProxyAdmin")); - address l1CrossDomainMessengerProxy = mustGetAddress("L1CrossDomainMessengerProxy"); - 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)) - }); - } - require(uint256(proxyAdmin.proxyType(l1CrossDomainMessengerProxy)) == uint256(ProxyAdmin.ProxyType.RESOLVED)); - - string memory contractName = "OVM_L1CrossDomainMessenger"; - 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)) - }); - } - require( - keccak256(bytes(proxyAdmin.implementationName(l1CrossDomainMessengerProxy))) - == keccak256(bytes(contractName)) - ); - - _upgradeAndCallViaSafe({ - _proxy: payable(l1CrossDomainMessengerProxy), - _implementation: l1CrossDomainMessenger, - _innerCallData: abi.encodeCall( - L1CrossDomainMessenger.initialize, - ( - SuperchainConfig(superchainConfigProxy), - OptimismPortal(payable(optimismPortalProxy)), - SystemConfig(systemConfigProxy) - ) - ) - }); - - L1CrossDomainMessenger messenger = L1CrossDomainMessenger(l1CrossDomainMessengerProxy); - string memory version = messenger.version(); - console.log("L1CrossDomainMessenger version: %s", version); - - ChainAssertions.checkL1CrossDomainMessenger({ _contracts: _proxies(), _vm: vm, _isProxy: true }); - } - - /// @notice Initialize the L2OutputOracle - function initializeL2OutputOracle() public broadcast { - console.log("Upgrading and initializing L2OutputOracle proxy"); - address l2OutputOracleProxy = mustGetAddress("L2OutputOracleProxy"); - address l2OutputOracle = mustGetAddress("L2OutputOracle"); - - _upgradeAndCallViaSafe({ - _proxy: payable(l2OutputOracleProxy), - _implementation: l2OutputOracle, - _innerCallData: abi.encodeCall( - L2OutputOracle.initialize, - ( - cfg.l2OutputOracleSubmissionInterval(), - cfg.l2BlockTime(), - cfg.l2OutputOracleStartingBlockNumber(), - cfg.l2OutputOracleStartingTimestamp(), - cfg.l2OutputOracleProposer(), - cfg.l2OutputOracleChallenger(), - cfg.finalizationPeriodSeconds() - ) - ) - }); - - L2OutputOracle oracle = L2OutputOracle(l2OutputOracleProxy); - string memory version = oracle.version(); - console.log("L2OutputOracle version: %s", version); - - ChainAssertions.checkL2OutputOracle({ - _contracts: _proxies(), - _cfg: cfg, - _l2OutputOracleStartingTimestamp: cfg.l2OutputOracleStartingTimestamp(), - _isProxy: true - }); - } - - /// @notice Initialize the OptimismPortal - function initializeOptimismPortal() public broadcast { - console.log("Upgrading and initializing OptimismPortal proxy"); - address optimismPortalProxy = mustGetAddress("OptimismPortalProxy"); - address optimismPortal = mustGetAddress("OptimismPortal"); - address l2OutputOracleProxy = mustGetAddress("L2OutputOracleProxy"); - address systemConfigProxy = mustGetAddress("SystemConfigProxy"); - address superchainConfigProxy = mustGetAddress("SuperchainConfigProxy"); - - _upgradeAndCallViaSafe({ - _proxy: payable(optimismPortalProxy), - _implementation: optimismPortal, - _innerCallData: abi.encodeCall( - OptimismPortal.initialize, - ( - L2OutputOracle(l2OutputOracleProxy), - SystemConfig(systemConfigProxy), - SuperchainConfig(superchainConfigProxy) - ) - ) - }); - - OptimismPortal portal = OptimismPortal(payable(optimismPortalProxy)); - string memory version = portal.version(); - console.log("OptimismPortal version: %s", version); - - ChainAssertions.checkOptimismPortal({ _contracts: _proxies(), _cfg: cfg, _isProxy: true }); - } - - /// @notice Initialize the OptimismPortal2 - function initializeOptimismPortal2() public broadcast { - console.log("Upgrading and initializing OptimismPortal2 proxy"); - address optimismPortalProxy = mustGetAddress("OptimismPortalProxy"); - address optimismPortal2 = mustGetAddress("OptimismPortal2"); - address disputeGameFactoryProxy = mustGetAddress("DisputeGameFactoryProxy"); - address systemConfigProxy = mustGetAddress("SystemConfigProxy"); - address superchainConfigProxy = mustGetAddress("SuperchainConfigProxy"); - - _upgradeAndCallViaSafe({ - _proxy: payable(optimismPortalProxy), - _implementation: optimismPortal2, - _innerCallData: abi.encodeCall( - OptimismPortal2.initialize, - ( - DisputeGameFactory(disputeGameFactoryProxy), - SystemConfig(systemConfigProxy), - SuperchainConfig(superchainConfigProxy), - GameType.wrap(uint32(cfg.respectedGameType())) - ) - ) - }); - - OptimismPortal2 portal = OptimismPortal2(payable(optimismPortalProxy)); - string memory version = portal.version(); - console.log("OptimismPortal2 version: %s", version); - - ChainAssertions.checkOptimismPortal2({ _contracts: _proxies(), _cfg: cfg, _isProxy: true }); - } - - function initializeProtocolVersions() public broadcast { - console.log("Upgrading and initializing ProtocolVersions proxy"); - address protocolVersionsProxy = mustGetAddress("ProtocolVersionsProxy"); - address protocolVersions = mustGetAddress("ProtocolVersions"); - - address finalSystemOwner = cfg.finalSystemOwner(); - uint256 requiredProtocolVersion = cfg.requiredProtocolVersion(); - uint256 recommendedProtocolVersion = cfg.recommendedProtocolVersion(); - - _upgradeAndCallViaSafe({ - _proxy: payable(protocolVersionsProxy), - _implementation: protocolVersions, - _innerCallData: abi.encodeCall( - ProtocolVersions.initialize, - ( - finalSystemOwner, - ProtocolVersion.wrap(requiredProtocolVersion), - ProtocolVersion.wrap(recommendedProtocolVersion) - ) - ) - }); - - ProtocolVersions versions = ProtocolVersions(protocolVersionsProxy); - string memory version = versions.version(); - console.log("ProtocolVersions version: %s", version); - - ChainAssertions.checkProtocolVersions({ _contracts: _proxiesUnstrict(), _cfg: cfg, _isProxy: true }); - } - - /// @notice Transfer ownership of the DisputeGameFactory contract to the final system owner - function transferDisputeGameFactoryOwnership() public broadcast { - console.log("Transferring DisputeGameFactory ownership to Safe"); - DisputeGameFactory disputeGameFactory = DisputeGameFactory(mustGetAddress("DisputeGameFactoryProxy")); - address owner = disputeGameFactory.owner(); - - address safe = mustGetAddress("SystemOwnerSafe"); - if (owner != safe) { - disputeGameFactory.transferOwnership(safe); - console.log("DisputeGameFactory ownership transferred to Safe at: %s", safe); - } - ChainAssertions.checkDisputeGameFactory({ _contracts: _proxies(), _expectedOwner: safe }); - } - - /// @notice Transfer ownership of the DelayedWETH contract to the final system owner - function transferDelayedWETHOwnership() public broadcast { - console.log("Transferring DelayedWETH ownership to Safe"); - DelayedWETH weth = DelayedWETH(mustGetAddress("DelayedWETHProxy")); - address owner = weth.owner(); - - address safe = mustGetAddress("SystemOwnerSafe"); - if (owner != safe) { - weth.transferOwnership(safe); - console.log("DelayedWETH ownership transferred to Safe at: %s", safe); - } - ChainAssertions.checkDelayedWETH({ _contracts: _proxies(), _cfg: cfg, _isProxy: true, _expectedOwner: safe }); - } - - /// @notice Loads the mips absolute prestate from the prestate-proof for devnets otherwise - /// from the config. - function loadMipsAbsolutePrestate() internal returns (Claim mipsAbsolutePrestate_) { - if (block.chainid == Chains.LocalDevnet || block.chainid == Chains.GethDevnet) { - // Fetch the absolute prestate dump - string memory filePath = string.concat(vm.projectRoot(), "/../../op-program/bin/prestate-proof.json"); - string[] memory commands = new string[](3); - commands[0] = "bash"; - commands[1] = "-c"; - commands[2] = string.concat("[[ -f ", filePath, " ]] && echo \"present\""); - if (vm.ffi(commands).length == 0) { - revert("Cannon prestate dump not found, generate it with `make cannon-prestate` in the monorepo root."); - } - commands[2] = string.concat("cat ", filePath, " | jq -r .pre"); - mipsAbsolutePrestate_ = Claim.wrap(abi.decode(vm.ffi(commands), (bytes32))); - console.log( - "[Cannon Dispute Game] Using devnet MIPS Absolute prestate: %s", - vm.toString(Claim.unwrap(mipsAbsolutePrestate_)) - ); - } else { - console.log( - "[Cannon Dispute Game] Using absolute prestate from config: %x", cfg.faultGameAbsolutePrestate() - ); - mipsAbsolutePrestate_ = Claim.wrap(bytes32(cfg.faultGameAbsolutePrestate())); - } - } - - /// @notice Sets the implementation for the `CANNON` game type in the `DisputeGameFactory` - function setCannonFaultGameImplementation(bool _allowUpgrade) public broadcast { - console.log("Setting Cannon FaultDisputeGame implementation"); - DisputeGameFactory factory = DisputeGameFactory(mustGetAddress("DisputeGameFactoryProxy")); - DelayedWETH weth = DelayedWETH(mustGetAddress("DelayedWETHProxy")); - - // Set the Cannon FaultDisputeGame implementation in the factory. - _setFaultGameImplementation({ - _factory: factory, - _allowUpgrade: _allowUpgrade, - _params: FaultDisputeGameParams({ - anchorStateRegistry: AnchorStateRegistry(mustGetAddress("AnchorStateRegistryProxy")), - weth: weth, - gameType: GameTypes.CANNON, - absolutePrestate: loadMipsAbsolutePrestate(), - faultVm: IBigStepper(mustGetAddress("Mips")), - maxGameDepth: cfg.faultGameMaxDepth() - }) - }); - } - - /// @notice Sets the implementation for the `PERMISSIONED_CANNON` game type in the `DisputeGameFactory` - function setPermissionedCannonFaultGameImplementation(bool _allowUpgrade) public broadcast { - console.log("Setting Cannon PermissionedDisputeGame implementation"); - DisputeGameFactory factory = DisputeGameFactory(mustGetAddress("DisputeGameFactoryProxy")); - DelayedWETH weth = DelayedWETH(mustGetAddress("DelayedWETHProxy")); - - // Set the Cannon FaultDisputeGame implementation in the factory. - _setFaultGameImplementation({ - _factory: factory, - _allowUpgrade: _allowUpgrade, - _params: FaultDisputeGameParams({ - anchorStateRegistry: AnchorStateRegistry(mustGetAddress("AnchorStateRegistryProxy")), - weth: weth, - gameType: GameTypes.PERMISSIONED_CANNON, - absolutePrestate: loadMipsAbsolutePrestate(), - faultVm: IBigStepper(mustGetAddress("Mips")), - maxGameDepth: cfg.faultGameMaxDepth() - }) - }); - } - - /// @notice Sets the implementation for the `ALPHABET` game type in the `DisputeGameFactory` - function setAlphabetFaultGameImplementation(bool _allowUpgrade) public onlyDevnet broadcast { - console.log("Setting Alphabet FaultDisputeGame implementation"); - DisputeGameFactory factory = DisputeGameFactory(mustGetAddress("DisputeGameFactoryProxy")); - DelayedWETH weth = DelayedWETH(mustGetAddress("DelayedWETHProxy")); - - Claim outputAbsolutePrestate = Claim.wrap(bytes32(cfg.faultGameAbsolutePrestate())); - _setFaultGameImplementation({ - _factory: factory, - _allowUpgrade: _allowUpgrade, - _params: FaultDisputeGameParams({ - anchorStateRegistry: AnchorStateRegistry(mustGetAddress("AnchorStateRegistryProxy")), - weth: weth, - gameType: GameTypes.ALPHABET, - absolutePrestate: outputAbsolutePrestate, - faultVm: IBigStepper(new AlphabetVM(outputAbsolutePrestate, PreimageOracle(mustGetAddress("PreimageOracle")))), - // The max depth for the alphabet trace is always 3. Add 1 because split depth is fully inclusive. - maxGameDepth: cfg.faultGameSplitDepth() + 3 + 1 - }) - }); - } - - /// @notice Sets the implementation for the given fault game type in the `DisputeGameFactory`. - function _setFaultGameImplementation( - DisputeGameFactory _factory, - bool _allowUpgrade, - FaultDisputeGameParams memory _params - ) - internal - { - if (address(_factory.gameImpls(_params.gameType)) != address(0) && !_allowUpgrade) { - console.log( - "[WARN] DisputeGameFactoryProxy: `FaultDisputeGame` implementation already set for game type: %s", - vm.toString(GameType.unwrap(_params.gameType)) - ); - return; - } - - uint32 rawGameType = GameType.unwrap(_params.gameType); - if (rawGameType != GameTypes.PERMISSIONED_CANNON.raw()) { - _factory.setImplementation( - _params.gameType, - new FaultDisputeGame({ - _gameType: _params.gameType, - _absolutePrestate: _params.absolutePrestate, - _maxGameDepth: _params.maxGameDepth, - _splitDepth: cfg.faultGameSplitDepth(), - _clockExtension: Duration.wrap(uint64(cfg.faultGameClockExtension())), - _maxClockDuration: Duration.wrap(uint64(cfg.faultGameMaxClockDuration())), - _vm: _params.faultVm, - _weth: _params.weth, - _anchorStateRegistry: _params.anchorStateRegistry, - _l2ChainId: cfg.l2ChainID() - }) - ); - } else { - _factory.setImplementation( - _params.gameType, - new PermissionedDisputeGame({ - _gameType: _params.gameType, - _absolutePrestate: _params.absolutePrestate, - _maxGameDepth: _params.maxGameDepth, - _splitDepth: cfg.faultGameSplitDepth(), - _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() - }) - ); - } - - string memory gameTypeString; - if (rawGameType == GameTypes.CANNON.raw()) { - gameTypeString = "Cannon"; - } else if (rawGameType == GameTypes.PERMISSIONED_CANNON.raw()) { - gameTypeString = "PermissionedCannon"; - } else if (rawGameType == GameTypes.ALPHABET.raw()) { - gameTypeString = "Alphabet"; - } else { - gameTypeString = "Unknown"; - } - - console.log( - "DisputeGameFactoryProxy: set `FaultDisputeGame` implementation (Backend: %s | GameType: %s)", - gameTypeString, - vm.toString(rawGameType) - ); - } - - /// @notice Initialize the DataAvailabilityChallenge - function initializeDataAvailabilityChallenge() public broadcast { - console.log("Upgrading and initializing DataAvailabilityChallenge proxy"); - address dataAvailabilityChallengeProxy = mustGetAddress("DataAvailabilityChallengeProxy"); - address dataAvailabilityChallenge = mustGetAddress("DataAvailabilityChallenge"); - - address finalSystemOwner = cfg.finalSystemOwner(); - uint256 daChallengeWindow = cfg.daChallengeWindow(); - uint256 daResolveWindow = cfg.daResolveWindow(); - uint256 daBondSize = cfg.daBondSize(); - uint256 daResolverRefundPercentage = cfg.daResolverRefundPercentage(); - - _upgradeAndCallViaSafe({ - _proxy: payable(dataAvailabilityChallengeProxy), - _implementation: dataAvailabilityChallenge, - _innerCallData: abi.encodeCall( - DataAvailabilityChallenge.initialize, - (finalSystemOwner, daChallengeWindow, daResolveWindow, daBondSize, daResolverRefundPercentage) - ) - }); - - DataAvailabilityChallenge dac = DataAvailabilityChallenge(payable(dataAvailabilityChallengeProxy)); - string memory version = dac.version(); - console.log("DataAvailabilityChallenge version: %s", version); - - require(dac.owner() == finalSystemOwner); - require(dac.challengeWindow() == daChallengeWindow); - require(dac.resolveWindow() == daResolveWindow); - require(dac.bondSize() == daBondSize); - require(dac.resolverRefundPercentage() == daResolverRefundPercentage); - } -} diff --git a/packages/contracts-bedrock/scripts/DeployAuthSystem.s.sol b/packages/contracts-bedrock/scripts/DeployAuthSystem.s.sol new file mode 100644 index 000000000000..0ddcbc1a7aa0 --- /dev/null +++ b/packages/contracts-bedrock/scripts/DeployAuthSystem.s.sol @@ -0,0 +1,99 @@ +// SPDX-License-Identifier: MIT +pragma solidity 0.8.15; + +import { Script } from "forge-std/Script.sol"; +import { CommonBase } from "forge-std/Base.sol"; +import { stdToml } from "forge-std/StdToml.sol"; + +import { GnosisSafe as Safe } from "safe-contracts/GnosisSafe.sol"; + +import { DeployUtils } from "scripts/libraries/DeployUtils.sol"; +import { Solarray } from "scripts/libraries/Solarray.sol"; + +// This file follows the pattern of Superchain.s.sol. Refer to that file for more details. +contract DeployAuthSystemInput is CommonBase { + using stdToml for string; + + // Generic safe inputs + // Note: these will need to be replaced with settings specific to the different Safes in the system. + uint256 internal _threshold; + address[] internal _owners; + + function set(bytes4 _sel, uint256 _value) public { + if (_sel == this.threshold.selector) _threshold = _value; + else revert("DeployAuthSystemInput: unknown selector"); + } + + function set(bytes4 _sel, address[] memory _addrs) public { + if (_sel == this.owners.selector) { + require(_owners.length == 0, "DeployAuthSystemInput: owners already set"); + for (uint256 i = 0; i < _addrs.length; i++) { + _owners.push(_addrs[i]); + } + } else { + revert("DeployAuthSystemInput: unknown selector"); + } + } + + function threshold() public view returns (uint256) { + require(_threshold != 0, "DeployAuthSystemInput: threshold not set"); + return _threshold; + } + + function owners() public view returns (address[] memory) { + require(_owners.length != 0, "DeployAuthSystemInput: owners not set"); + return _owners; + } +} + +contract DeployAuthSystemOutput is CommonBase { + Safe internal _safe; + + function set(bytes4 sel, address _address) public { + if (sel == this.safe.selector) _safe = Safe(payable(_address)); + else revert("DeployAuthSystemOutput: unknown selector"); + } + + function checkOutput() public view { + address[] memory addrs = Solarray.addresses(address(this.safe())); + DeployUtils.assertValidContractAddresses(addrs); + } + + function safe() public view returns (Safe) { + DeployUtils.assertValidContractAddress(address(_safe)); + return _safe; + } +} + +contract DeployAuthSystem is Script { + function run(DeployAuthSystemInput _dasi, DeployAuthSystemOutput _daso) public { + deploySafe(_dasi, _daso); + } + + function deploySafe(DeployAuthSystemInput _dasi, DeployAuthSystemOutput _daso) public { + address[] memory owners = _dasi.owners(); + uint256 threshold = _dasi.threshold(); + + // TODO: replace with a real deployment. The safe deployment logic is fairly complex, so for the purposes of + // this scaffolding PR we'll just etch the code. + address safe = makeAddr("safe"); + vm.etch(safe, type(Safe).runtimeCode); + vm.store(safe, bytes32(uint256(3)), bytes32(uint256(owners.length))); + vm.store(safe, bytes32(uint256(4)), bytes32(uint256(threshold))); + + _daso.set(_daso.safe.selector, safe); + } + + function etchIOContracts() public returns (DeployAuthSystemInput dasi_, DeployAuthSystemOutput daso_) { + (dasi_, daso_) = getIOContracts(); + vm.etch(address(dasi_), type(DeployAuthSystemInput).runtimeCode); + vm.etch(address(daso_), type(DeployAuthSystemOutput).runtimeCode); + vm.allowCheatcodes(address(dasi_)); + vm.allowCheatcodes(address(daso_)); + } + + function getIOContracts() public view returns (DeployAuthSystemInput dasi_, DeployAuthSystemOutput daso_) { + dasi_ = DeployAuthSystemInput(DeployUtils.toIOAddress(msg.sender, "optimism.DeployAuthSystemInput")); + daso_ = DeployAuthSystemOutput(DeployUtils.toIOAddress(msg.sender, "optimism.DeployAuthSystemOutput")); + } +} diff --git a/packages/contracts-bedrock/scripts/DeployImplementations.s.sol b/packages/contracts-bedrock/scripts/DeployImplementations.s.sol new file mode 100644 index 000000000000..433b1573efe4 --- /dev/null +++ b/packages/contracts-bedrock/scripts/DeployImplementations.s.sol @@ -0,0 +1,840 @@ +// SPDX-License-Identifier: MIT +pragma solidity 0.8.15; + +import { Script } from "forge-std/Script.sol"; + +import { LibString } from "@solady/utils/LibString.sol"; + +import { IResourceMetering } from "src/L1/interfaces/IResourceMetering.sol"; +import { ISuperchainConfig } from "src/L1/interfaces/ISuperchainConfig.sol"; + +import { Constants } from "src/libraries/Constants.sol"; +import { Predeploys } from "src/libraries/Predeploys.sol"; + +import { ProxyAdmin } from "src/universal/ProxyAdmin.sol"; +import { Proxy } from "src/universal/Proxy.sol"; +import { L1ChugSplashProxy } from "src/legacy/L1ChugSplashProxy.sol"; +import { ResolvedDelegateProxy } from "src/legacy/ResolvedDelegateProxy.sol"; +import { AddressManager } from "src/legacy/AddressManager.sol"; + +import { DelayedWETH } from "src/dispute/DelayedWETH.sol"; +import { PreimageOracle } from "src/cannon/PreimageOracle.sol"; +import { IPreimageOracle } from "src/cannon/interfaces/IPreimageOracle.sol"; +import { MIPS } from "src/cannon/MIPS.sol"; +import { DisputeGameFactory } from "src/dispute/DisputeGameFactory.sol"; +import { AnchorStateRegistry } from "src/dispute/AnchorStateRegistry.sol"; + +import { SuperchainConfig } from "src/L1/SuperchainConfig.sol"; +import { ProtocolVersions } from "src/L1/ProtocolVersions.sol"; +import { OPStackManager } from "src/L1/OPStackManager.sol"; +import { OptimismPortal2 } from "src/L1/OptimismPortal2.sol"; +import { SystemConfig } from "src/L1/SystemConfig.sol"; +import { L1CrossDomainMessenger } from "src/L1/L1CrossDomainMessenger.sol"; +import { L1ERC721Bridge } from "src/L1/L1ERC721Bridge.sol"; +import { L1StandardBridge } from "src/L1/L1StandardBridge.sol"; +import { OptimismMintableERC20Factory } from "src/universal/OptimismMintableERC20Factory.sol"; + +import { OPStackManagerInterop } from "src/L1/OPStackManagerInterop.sol"; +import { OptimismPortalInterop } from "src/L1/OptimismPortalInterop.sol"; +import { SystemConfigInterop } from "src/L1/SystemConfigInterop.sol"; + +import { Blueprint } from "src/libraries/Blueprint.sol"; + +import { DeployUtils } from "scripts/libraries/DeployUtils.sol"; +import { Solarray } from "scripts/libraries/Solarray.sol"; +import { BaseDeployIO } from "scripts/utils/BaseDeployIO.sol"; + +// See DeploySuperchain.s.sol for detailed comments on the script architecture used here. +contract DeployImplementationsInput is BaseDeployIO { + bytes32 internal _salt; + uint256 internal _withdrawalDelaySeconds; + uint256 internal _minProposalSizeBytes; + uint256 internal _challengePeriodSeconds; + uint256 internal _proofMaturityDelaySeconds; + uint256 internal _disputeGameFinalityDelaySeconds; + + // The release version to set OPSM implementations for, of the format `op-contracts/vX.Y.Z`. + string internal _release; + + // Outputs from DeploySuperchain.s.sol. + SuperchainConfig internal _superchainConfigProxy; + ProtocolVersions internal _protocolVersionsProxy; + + function set(bytes4 sel, uint256 _value) public { + require(_value != 0, "DeployImplementationsInput: cannot set zero value"); + + if (sel == this.withdrawalDelaySeconds.selector) { + _withdrawalDelaySeconds = _value; + } else if (sel == this.minProposalSizeBytes.selector) { + _minProposalSizeBytes = _value; + } else if (sel == this.challengePeriodSeconds.selector) { + require(_value <= type(uint64).max, "DeployImplementationsInput: challengePeriodSeconds too large"); + _challengePeriodSeconds = _value; + } else if (sel == this.proofMaturityDelaySeconds.selector) { + _proofMaturityDelaySeconds = _value; + } else if (sel == this.disputeGameFinalityDelaySeconds.selector) { + _disputeGameFinalityDelaySeconds = _value; + } else { + revert("DeployImplementationsInput: unknown selector"); + } + } + + function set(bytes4 sel, string memory _value) public { + require(!LibString.eq(_value, ""), "DeployImplementationsInput: cannot set empty string"); + if (sel == this.release.selector) _release = _value; + else revert("DeployImplementationsInput: unknown selector"); + } + + function set(bytes4 sel, address _addr) public { + require(_addr != address(0), "DeployImplementationsInput: cannot set zero address"); + if (sel == this.superchainConfigProxy.selector) _superchainConfigProxy = SuperchainConfig(_addr); + else if (sel == this.protocolVersionsProxy.selector) _protocolVersionsProxy = ProtocolVersions(_addr); + else revert("DeployImplementationsInput: unknown selector"); + } + + function set(bytes4 sel, bytes32 _value) public { + if (sel == this.salt.selector) _salt = _value; + else revert("DeployImplementationsInput: unknown selector"); + } + + function salt() public view returns (bytes32) { + // TODO check if implementations are deployed based on code+salt and skip deploy if so. + return _salt; + } + + function withdrawalDelaySeconds() public view returns (uint256) { + require(_withdrawalDelaySeconds != 0, "DeployImplementationsInput: not set"); + return _withdrawalDelaySeconds; + } + + function minProposalSizeBytes() public view returns (uint256) { + require(_minProposalSizeBytes != 0, "DeployImplementationsInput: not set"); + return _minProposalSizeBytes; + } + + function challengePeriodSeconds() public view returns (uint256) { + require(_challengePeriodSeconds != 0, "DeployImplementationsInput: not set"); + require( + _challengePeriodSeconds <= type(uint64).max, "DeployImplementationsInput: challengePeriodSeconds too large" + ); + return _challengePeriodSeconds; + } + + function proofMaturityDelaySeconds() public view returns (uint256) { + require(_proofMaturityDelaySeconds != 0, "DeployImplementationsInput: not set"); + return _proofMaturityDelaySeconds; + } + + function disputeGameFinalityDelaySeconds() public view returns (uint256) { + require(_disputeGameFinalityDelaySeconds != 0, "DeployImplementationsInput: not set"); + return _disputeGameFinalityDelaySeconds; + } + + function release() public view returns (string memory) { + require(!LibString.eq(_release, ""), "DeployImplementationsInput: not set"); + return _release; + } + + function superchainConfigProxy() public view returns (SuperchainConfig) { + require(address(_superchainConfigProxy) != address(0), "DeployImplementationsInput: not set"); + return _superchainConfigProxy; + } + + function protocolVersionsProxy() public view returns (ProtocolVersions) { + require(address(_protocolVersionsProxy) != address(0), "DeployImplementationsInput: not set"); + return _protocolVersionsProxy; + } + + function superchainProxyAdmin() public returns (ProxyAdmin) { + SuperchainConfig proxy = this.superchainConfigProxy(); + // Can infer the superchainProxyAdmin from the superchainConfigProxy. + vm.prank(address(0)); + ProxyAdmin proxyAdmin = ProxyAdmin(Proxy(payable(address(proxy))).admin()); + require(address(proxyAdmin) != address(0), "DeployImplementationsInput: not set"); + return proxyAdmin; + } +} + +contract DeployImplementationsOutput is BaseDeployIO { + OPStackManager internal _opsmProxy; + DelayedWETH internal _delayedWETHImpl; + OptimismPortal2 internal _optimismPortalImpl; + PreimageOracle internal _preimageOracleSingleton; + MIPS internal _mipsSingleton; + SystemConfig internal _systemConfigImpl; + L1CrossDomainMessenger internal _l1CrossDomainMessengerImpl; + L1ERC721Bridge internal _l1ERC721BridgeImpl; + L1StandardBridge internal _l1StandardBridgeImpl; + OptimismMintableERC20Factory internal _optimismMintableERC20FactoryImpl; + DisputeGameFactory internal _disputeGameFactoryImpl; + + function set(bytes4 sel, address _addr) public { + require(_addr != address(0), "DeployImplementationsOutput: cannot set zero address"); + + // forgefmt: disable-start + if (sel == this.opsmProxy.selector) _opsmProxy = OPStackManager(payable(_addr)); + else if (sel == this.optimismPortalImpl.selector) _optimismPortalImpl = OptimismPortal2(payable(_addr)); + else if (sel == this.delayedWETHImpl.selector) _delayedWETHImpl = DelayedWETH(payable(_addr)); + else if (sel == this.preimageOracleSingleton.selector) _preimageOracleSingleton = PreimageOracle(_addr); + else if (sel == this.mipsSingleton.selector) _mipsSingleton = MIPS(_addr); + else if (sel == this.systemConfigImpl.selector) _systemConfigImpl = SystemConfig(_addr); + else if (sel == this.l1CrossDomainMessengerImpl.selector) _l1CrossDomainMessengerImpl = L1CrossDomainMessenger(_addr); + else if (sel == this.l1ERC721BridgeImpl.selector) _l1ERC721BridgeImpl = L1ERC721Bridge(_addr); + else if (sel == this.l1StandardBridgeImpl.selector) _l1StandardBridgeImpl = L1StandardBridge(payable(_addr)); + else if (sel == this.optimismMintableERC20FactoryImpl.selector) _optimismMintableERC20FactoryImpl = OptimismMintableERC20Factory(_addr); + else if (sel == this.disputeGameFactoryImpl.selector) _disputeGameFactoryImpl = DisputeGameFactory(_addr); + else revert("DeployImplementationsOutput: unknown selector"); + // forgefmt: disable-end + } + + function checkOutput(DeployImplementationsInput _dii) public { + address[] memory addrs = Solarray.addresses( + address(this.opsmProxy()), + address(this.optimismPortalImpl()), + address(this.delayedWETHImpl()), + address(this.preimageOracleSingleton()), + address(this.mipsSingleton()), + address(this.systemConfigImpl()), + address(this.l1CrossDomainMessengerImpl()), + address(this.l1ERC721BridgeImpl()), + address(this.l1StandardBridgeImpl()), + address(this.optimismMintableERC20FactoryImpl()), + address(this.disputeGameFactoryImpl()) + ); + DeployUtils.assertValidContractAddresses(addrs); + + assertValidDeploy(_dii); + } + + function opsmProxy() public returns (OPStackManager) { + DeployUtils.assertValidContractAddress(address(_opsmProxy)); + DeployUtils.assertImplementationSet(address(_opsmProxy)); + return _opsmProxy; + } + + function optimismPortalImpl() public view returns (OptimismPortal2) { + DeployUtils.assertValidContractAddress(address(_optimismPortalImpl)); + return _optimismPortalImpl; + } + + function delayedWETHImpl() public view returns (DelayedWETH) { + DeployUtils.assertValidContractAddress(address(_delayedWETHImpl)); + return _delayedWETHImpl; + } + + function preimageOracleSingleton() public view returns (PreimageOracle) { + DeployUtils.assertValidContractAddress(address(_preimageOracleSingleton)); + return _preimageOracleSingleton; + } + + function mipsSingleton() public view returns (MIPS) { + DeployUtils.assertValidContractAddress(address(_mipsSingleton)); + return _mipsSingleton; + } + + function systemConfigImpl() public view returns (SystemConfig) { + DeployUtils.assertValidContractAddress(address(_systemConfigImpl)); + return _systemConfigImpl; + } + + function l1CrossDomainMessengerImpl() public view returns (L1CrossDomainMessenger) { + DeployUtils.assertValidContractAddress(address(_l1CrossDomainMessengerImpl)); + return _l1CrossDomainMessengerImpl; + } + + function l1ERC721BridgeImpl() public view returns (L1ERC721Bridge) { + DeployUtils.assertValidContractAddress(address(_l1ERC721BridgeImpl)); + return _l1ERC721BridgeImpl; + } + + function l1StandardBridgeImpl() public view returns (L1StandardBridge) { + DeployUtils.assertValidContractAddress(address(_l1StandardBridgeImpl)); + return _l1StandardBridgeImpl; + } + + function optimismMintableERC20FactoryImpl() public view returns (OptimismMintableERC20Factory) { + DeployUtils.assertValidContractAddress(address(_optimismMintableERC20FactoryImpl)); + return _optimismMintableERC20FactoryImpl; + } + + function disputeGameFactoryImpl() public view returns (DisputeGameFactory) { + DeployUtils.assertValidContractAddress(address(_disputeGameFactoryImpl)); + return _disputeGameFactoryImpl; + } + + // -------- Deployment Assertions -------- + function assertValidDeploy(DeployImplementationsInput _dii) public { + assertValidDelayedWETHImpl(_dii); + assertValidDisputeGameFactoryImpl(_dii); + assertValidL1CrossDomainMessengerImpl(_dii); + assertValidL1ERC721BridgeImpl(_dii); + assertValidL1StandardBridgeImpl(_dii); + assertValidMipsSingleton(_dii); + assertValidOpsmProxy(_dii); + assertValidOpsmImpl(_dii); + assertValidOptimismMintableERC20FactoryImpl(_dii); + assertValidOptimismPortalImpl(_dii); + assertValidPreimageOracleSingleton(_dii); + assertValidSystemConfigImpl(_dii); + } + + function assertValidOpsmProxy(DeployImplementationsInput _dii) internal { + // First we check the proxy as itself. + Proxy proxy = Proxy(payable(address(opsmProxy()))); + vm.prank(address(0)); + address admin = proxy.admin(); + require(admin == address(_dii.superchainProxyAdmin()), "OPSMP-10"); + + // Then we check the proxy as OPSM. + DeployUtils.assertInitialized({ _contractAddress: address(opsmProxy()), _slot: 0, _offset: 0 }); + require(address(opsmProxy().superchainConfig()) == address(_dii.superchainConfigProxy()), "OPSMP-20"); + require(address(opsmProxy().protocolVersions()) == address(_dii.protocolVersionsProxy()), "OPSMP-30"); + require(LibString.eq(opsmProxy().latestRelease(), _dii.release()), "OPSMP-50"); // Initial release is latest. + } + + function assertValidOpsmImpl(DeployImplementationsInput _dii) internal { + Proxy proxy = Proxy(payable(address(opsmProxy()))); + vm.prank(address(0)); + OPStackManager impl = OPStackManager(proxy.implementation()); + DeployUtils.assertInitialized({ _contractAddress: address(impl), _slot: 0, _offset: 0 }); + require(address(impl.superchainConfig()) == address(_dii.superchainConfigProxy()), "OPSMI-10"); + require(address(impl.protocolVersions()) == address(_dii.protocolVersionsProxy()), "OPSMI-20"); + } + + function assertValidOptimismPortalImpl(DeployImplementationsInput) internal view { + OptimismPortal2 portal = optimismPortalImpl(); + + DeployUtils.assertInitialized({ _contractAddress: address(portal), _slot: 0, _offset: 0 }); + + require(address(portal.disputeGameFactory()) == address(0), "PORTAL-10"); + require(address(portal.systemConfig()) == address(0), "PORTAL-20"); + require(address(portal.superchainConfig()) == address(0), "PORTAL-30"); + require(portal.l2Sender() == Constants.DEFAULT_L2_SENDER, "PORTAL-40"); + + // 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), "PORTAL-50"); + } + + function assertValidDelayedWETHImpl(DeployImplementationsInput _dii) internal view { + DelayedWETH delayedWETH = delayedWETHImpl(); + + DeployUtils.assertInitialized({ _contractAddress: address(delayedWETH), _slot: 0, _offset: 0 }); + + require(delayedWETH.owner() == address(0), "DW-10"); + require(delayedWETH.delay() == _dii.withdrawalDelaySeconds(), "DW-20"); + require(delayedWETH.config() == ISuperchainConfig(address(0)), "DW-30"); + } + + function assertValidPreimageOracleSingleton(DeployImplementationsInput _dii) internal view { + PreimageOracle oracle = preimageOracleSingleton(); + + require(oracle.minProposalSize() == _dii.minProposalSizeBytes(), "PO-10"); + require(oracle.challengePeriod() == _dii.challengePeriodSeconds(), "PO-20"); + } + + function assertValidMipsSingleton(DeployImplementationsInput) internal view { + MIPS mips = mipsSingleton(); + + require(address(mips.oracle()) == address(preimageOracleSingleton()), "MIPS-10"); + } + + function assertValidSystemConfigImpl(DeployImplementationsInput) internal view { + SystemConfig systemConfig = systemConfigImpl(); + + DeployUtils.assertInitialized({ _contractAddress: address(systemConfig), _slot: 0, _offset: 0 }); + + require(systemConfig.owner() == address(0xdead), "SYSCON-10"); + require(systemConfig.overhead() == 0, "SYSCON-20"); + require(systemConfig.scalar() == uint256(0x01) << 248, "SYSCON-30"); + require(systemConfig.basefeeScalar() == 0, "SYSCON-40"); + require(systemConfig.blobbasefeeScalar() == 0, "SYSCON-50"); + require(systemConfig.batcherHash() == bytes32(0), "SYSCON-60"); + require(systemConfig.gasLimit() == 1, "SYSCON-70"); + require(systemConfig.unsafeBlockSigner() == address(0), "SYSCON-80"); + + IResourceMetering.ResourceConfig memory resourceConfig = systemConfig.resourceConfig(); + require(resourceConfig.maxResourceLimit == 1, "SYSCON-90"); + require(resourceConfig.elasticityMultiplier == 1, "SYSCON-100"); + require(resourceConfig.baseFeeMaxChangeDenominator == 2, "SYSCON-110"); + require(resourceConfig.systemTxMaxGas == 0, "SYSCON-120"); + require(resourceConfig.minimumBaseFee == 0, "SYSCON-130"); + require(resourceConfig.maximumBaseFee == 0, "SYSCON-140"); + + require(systemConfig.startBlock() == type(uint256).max, "SYSCON-150"); + require(systemConfig.batchInbox() == address(0), "SYSCON-160"); + require(systemConfig.l1CrossDomainMessenger() == address(0), "SYSCON-170"); + require(systemConfig.l1ERC721Bridge() == address(0), "SYSCON-180"); + require(systemConfig.l1StandardBridge() == address(0), "SYSCON-190"); + require(systemConfig.disputeGameFactory() == address(0), "SYSCON-200"); + require(systemConfig.optimismPortal() == address(0), "SYSCON-210"); + require(systemConfig.optimismMintableERC20Factory() == address(0), "SYSCON-220"); + } + + function assertValidL1CrossDomainMessengerImpl(DeployImplementationsInput) internal view { + L1CrossDomainMessenger messenger = l1CrossDomainMessengerImpl(); + + DeployUtils.assertInitialized({ _contractAddress: address(messenger), _slot: 0, _offset: 20 }); + + require(address(messenger.OTHER_MESSENGER()) == Predeploys.L2_CROSS_DOMAIN_MESSENGER, "L1xDM-10"); + require(address(messenger.otherMessenger()) == Predeploys.L2_CROSS_DOMAIN_MESSENGER, "L1xDM-20"); + require(address(messenger.PORTAL()) == address(0), "L1xDM-30"); + require(address(messenger.portal()) == address(0), "L1xDM-40"); + require(address(messenger.superchainConfig()) == address(0), "L1xDM-50"); + + bytes32 xdmSenderSlot = vm.load(address(messenger), bytes32(uint256(204))); + require(address(uint160(uint256(xdmSenderSlot))) == Constants.DEFAULT_L2_SENDER, "L1xDM-60"); + } + + function assertValidL1ERC721BridgeImpl(DeployImplementationsInput) internal view { + L1ERC721Bridge bridge = l1ERC721BridgeImpl(); + + DeployUtils.assertInitialized({ _contractAddress: address(bridge), _slot: 0, _offset: 0 }); + + require(address(bridge.OTHER_BRIDGE()) == Predeploys.L2_ERC721_BRIDGE, "L721B-10"); + require(address(bridge.otherBridge()) == Predeploys.L2_ERC721_BRIDGE, "L721B-20"); + require(address(bridge.MESSENGER()) == address(0), "L721B-30"); + require(address(bridge.messenger()) == address(0), "L721B-40"); + require(address(bridge.superchainConfig()) == address(0), "L721B-50"); + } + + function assertValidL1StandardBridgeImpl(DeployImplementationsInput) internal view { + L1StandardBridge bridge = l1StandardBridgeImpl(); + + DeployUtils.assertInitialized({ _contractAddress: address(bridge), _slot: 0, _offset: 0 }); + + require(address(bridge.MESSENGER()) == address(0), "L1SB-10"); + require(address(bridge.messenger()) == address(0), "L1SB-20"); + require(address(bridge.OTHER_BRIDGE()) == Predeploys.L2_STANDARD_BRIDGE, "L1SB-30"); + require(address(bridge.otherBridge()) == Predeploys.L2_STANDARD_BRIDGE, "L1SB-40"); + require(address(bridge.superchainConfig()) == address(0), "L1SB-50"); + } + + function assertValidOptimismMintableERC20FactoryImpl(DeployImplementationsInput) internal view { + OptimismMintableERC20Factory factory = optimismMintableERC20FactoryImpl(); + + DeployUtils.assertInitialized({ _contractAddress: address(factory), _slot: 0, _offset: 0 }); + + require(address(factory.BRIDGE()) == address(0), "MERC20F-10"); + require(address(factory.bridge()) == address(0), "MERC20F-20"); + } + + function assertValidDisputeGameFactoryImpl(DeployImplementationsInput) internal view { + DisputeGameFactory factory = disputeGameFactoryImpl(); + + DeployUtils.assertInitialized({ _contractAddress: address(factory), _slot: 0, _offset: 0 }); + + require(address(factory.owner()) == address(0), "DG-10"); + } +} + +contract DeployImplementations is Script { + // -------- Core Deployment Methods -------- + + function run(DeployImplementationsInput _dii, DeployImplementationsOutput _dio) public { + // Deploy the implementations. + deploySystemConfigImpl(_dii, _dio); + deployL1CrossDomainMessengerImpl(_dii, _dio); + deployL1ERC721BridgeImpl(_dii, _dio); + deployL1StandardBridgeImpl(_dii, _dio); + deployOptimismMintableERC20FactoryImpl(_dii, _dio); + deployOptimismPortalImpl(_dii, _dio); + deployDelayedWETHImpl(_dii, _dio); + deployPreimageOracleSingleton(_dii, _dio); + deployMipsSingleton(_dii, _dio); + deployDisputeGameFactoryImpl(_dii, _dio); + + // Deploy the OP Stack Manager with the new implementations set. + deployOPStackManager(_dii, _dio); + + _dio.checkOutput(_dii); + } + + // -------- Deployment Steps -------- + + // --- OP Stack Manager --- + + function opsmSystemConfigSetter( + DeployImplementationsInput, + DeployImplementationsOutput _dio + ) + internal + view + virtual + returns (OPStackManager.ImplementationSetter memory) + { + return OPStackManager.ImplementationSetter({ + name: "SystemConfig", + info: OPStackManager.Implementation(address(_dio.systemConfigImpl()), SystemConfig.initialize.selector) + }); + } + + // Deploy and initialize a proxied OPStackManager. + function createOPSMContract( + DeployImplementationsInput _dii, + DeployImplementationsOutput, + OPStackManager.Blueprints memory blueprints, + string memory release, + OPStackManager.ImplementationSetter[] memory setters + ) + internal + virtual + returns (OPStackManager opsmProxy_) + { + SuperchainConfig superchainConfigProxy = _dii.superchainConfigProxy(); + ProtocolVersions protocolVersionsProxy = _dii.protocolVersionsProxy(); + ProxyAdmin proxyAdmin = _dii.superchainProxyAdmin(); + + vm.startBroadcast(msg.sender); + Proxy proxy = new Proxy(address(msg.sender)); + OPStackManager opsm = new OPStackManager(superchainConfigProxy, protocolVersionsProxy); + + OPStackManager.InitializerInputs memory initializerInputs = + OPStackManager.InitializerInputs(blueprints, setters, release, true); + proxy.upgradeToAndCall(address(opsm), abi.encodeWithSelector(opsm.initialize.selector, initializerInputs)); + + proxy.changeAdmin(address(proxyAdmin)); // transfer ownership of Proxy contract to the ProxyAdmin contract + vm.stopBroadcast(); + + opsmProxy_ = OPStackManager(address(proxy)); + } + + function deployOPStackManager(DeployImplementationsInput _dii, DeployImplementationsOutput _dio) public virtual { + string memory release = _dii.release(); + + // First we deploy the blueprints for the singletons deployed by OPSM. + // forgefmt: disable-start + bytes32 salt = _dii.salt(); + OPStackManager.Blueprints memory blueprints; + + vm.startBroadcast(msg.sender); + blueprints.addressManager = deployBytecode(Blueprint.blueprintDeployerBytecode(type(AddressManager).creationCode), salt); + blueprints.proxy = deployBytecode(Blueprint.blueprintDeployerBytecode(type(Proxy).creationCode), salt); + blueprints.proxyAdmin = deployBytecode(Blueprint.blueprintDeployerBytecode(type(ProxyAdmin).creationCode), salt); + blueprints.l1ChugSplashProxy = deployBytecode(Blueprint.blueprintDeployerBytecode(type(L1ChugSplashProxy).creationCode), salt); + blueprints.resolvedDelegateProxy = deployBytecode(Blueprint.blueprintDeployerBytecode(type(ResolvedDelegateProxy).creationCode), salt); + blueprints.anchorStateRegistry = deployBytecode(Blueprint.blueprintDeployerBytecode(type(AnchorStateRegistry).creationCode), salt); + vm.stopBroadcast(); + // forgefmt: disable-end + + OPStackManager.ImplementationSetter[] memory setters = new OPStackManager.ImplementationSetter[](7); + setters[0] = OPStackManager.ImplementationSetter({ + name: "L1ERC721Bridge", + info: OPStackManager.Implementation(address(_dio.l1ERC721BridgeImpl()), L1ERC721Bridge.initialize.selector) + }); + setters[1] = OPStackManager.ImplementationSetter({ + name: "OptimismPortal", + info: OPStackManager.Implementation(address(_dio.optimismPortalImpl()), OptimismPortal2.initialize.selector) + }); + setters[2] = opsmSystemConfigSetter(_dii, _dio); + setters[3] = OPStackManager.ImplementationSetter({ + name: "OptimismMintableERC20Factory", + info: OPStackManager.Implementation( + address(_dio.optimismMintableERC20FactoryImpl()), OptimismMintableERC20Factory.initialize.selector + ) + }); + setters[4] = OPStackManager.ImplementationSetter({ + name: "L1CrossDomainMessenger", + info: OPStackManager.Implementation( + address(_dio.l1CrossDomainMessengerImpl()), L1CrossDomainMessenger.initialize.selector + ) + }); + setters[5] = OPStackManager.ImplementationSetter({ + name: "L1StandardBridge", + info: OPStackManager.Implementation(address(_dio.l1StandardBridgeImpl()), L1StandardBridge.initialize.selector) + }); + + setters[6] = OPStackManager.ImplementationSetter({ + name: "DisputeGameFactory", + info: OPStackManager.Implementation( + address(_dio.disputeGameFactoryImpl()), DisputeGameFactory.initialize.selector + ) + }); + + // This call contains a broadcast to deploy OPSM which is proxied. + OPStackManager opsmProxy = createOPSMContract(_dii, _dio, blueprints, release, setters); + + vm.label(address(opsmProxy), "OPStackManager"); + _dio.set(_dio.opsmProxy.selector, address(opsmProxy)); + } + + // --- Core Contracts --- + + function deploySystemConfigImpl(DeployImplementationsInput, DeployImplementationsOutput _dio) public virtual { + vm.broadcast(msg.sender); + SystemConfig systemConfigImpl = new SystemConfig(); + + vm.label(address(systemConfigImpl), "SystemConfigImpl"); + _dio.set(_dio.systemConfigImpl.selector, address(systemConfigImpl)); + } + + function deployL1CrossDomainMessengerImpl( + DeployImplementationsInput, + DeployImplementationsOutput _dio + ) + public + virtual + { + vm.broadcast(msg.sender); + L1CrossDomainMessenger l1CrossDomainMessengerImpl = new L1CrossDomainMessenger(); + + vm.label(address(l1CrossDomainMessengerImpl), "L1CrossDomainMessengerImpl"); + _dio.set(_dio.l1CrossDomainMessengerImpl.selector, address(l1CrossDomainMessengerImpl)); + } + + function deployL1ERC721BridgeImpl(DeployImplementationsInput, DeployImplementationsOutput _dio) public virtual { + vm.broadcast(msg.sender); + L1ERC721Bridge l1ERC721BridgeImpl = new L1ERC721Bridge(); + + vm.label(address(l1ERC721BridgeImpl), "L1ERC721BridgeImpl"); + _dio.set(_dio.l1ERC721BridgeImpl.selector, address(l1ERC721BridgeImpl)); + } + + function deployL1StandardBridgeImpl(DeployImplementationsInput, DeployImplementationsOutput _dio) public virtual { + vm.broadcast(msg.sender); + L1StandardBridge l1StandardBridgeImpl = new L1StandardBridge(); + + vm.label(address(l1StandardBridgeImpl), "L1StandardBridgeImpl"); + _dio.set(_dio.l1StandardBridgeImpl.selector, address(l1StandardBridgeImpl)); + } + + function deployOptimismMintableERC20FactoryImpl( + DeployImplementationsInput, + DeployImplementationsOutput _dio + ) + public + virtual + { + vm.broadcast(msg.sender); + OptimismMintableERC20Factory optimismMintableERC20FactoryImpl = new OptimismMintableERC20Factory(); + + vm.label(address(optimismMintableERC20FactoryImpl), "OptimismMintableERC20FactoryImpl"); + _dio.set(_dio.optimismMintableERC20FactoryImpl.selector, address(optimismMintableERC20FactoryImpl)); + } + + // --- Fault Proofs Contracts --- + + // The fault proofs contracts are configured as follows: + // | Contract | Proxied | Deployment | MCP Ready | + // |-------------------------|---------|-----------------------------------|------------| + // | DisputeGameFactory | Yes | Bespoke | Yes | X + // | AnchorStateRegistry | Yes | Bespoke | No | X + // | FaultDisputeGame | No | Bespoke | No | Todo + // | PermissionedDisputeGame | No | Bespoke | No | Todo + // | DelayedWETH | Yes | Two bespoke (one per DisputeGame) | No | Todo: Proxies. + // | PreimageOracle | No | Shared | N/A | X + // | MIPS | No | Shared | N/A | X + // | OptimismPortal2 | Yes | Shared | No | X + // + // This script only deploys the shared contracts. The bespoke contracts are deployed by + // `DeployOPChain.s.sol`. When the shared contracts are proxied, the contracts deployed here are + // "implementations", and when shared contracts are not proxied, they are "singletons". So + // here we deploy: + // + // - DisputeGameFactory (implementation) + // - OptimismPortal2 (implementation) + // - DelayedWETH (implementation) + // - PreimageOracle (singleton) + // - MIPS (singleton) + // + // For contracts which are not MCP ready neither the Proxy nor the implementation can be shared, therefore they + // are deployed by `DeployOpChain.s.sol`. + + function deployOptimismPortalImpl( + DeployImplementationsInput _dii, + DeployImplementationsOutput _dio + ) + public + virtual + { + uint256 proofMaturityDelaySeconds = _dii.proofMaturityDelaySeconds(); + uint256 disputeGameFinalityDelaySeconds = _dii.disputeGameFinalityDelaySeconds(); + + vm.broadcast(msg.sender); + OptimismPortal2 optimismPortalImpl = new OptimismPortal2({ + _proofMaturityDelaySeconds: proofMaturityDelaySeconds, + _disputeGameFinalityDelaySeconds: disputeGameFinalityDelaySeconds + }); + + vm.label(address(optimismPortalImpl), "OptimismPortalImpl"); + _dio.set(_dio.optimismPortalImpl.selector, address(optimismPortalImpl)); + } + + function deployDelayedWETHImpl(DeployImplementationsInput _dii, DeployImplementationsOutput _dio) public virtual { + uint256 withdrawalDelaySeconds = _dii.withdrawalDelaySeconds(); + + vm.broadcast(msg.sender); + DelayedWETH delayedWETHImpl = new DelayedWETH({ _delay: withdrawalDelaySeconds }); + + vm.label(address(delayedWETHImpl), "DelayedWETHImpl"); + _dio.set(_dio.delayedWETHImpl.selector, address(delayedWETHImpl)); + } + + function deployPreimageOracleSingleton( + DeployImplementationsInput _dii, + DeployImplementationsOutput _dio + ) + public + virtual + { + uint256 minProposalSizeBytes = _dii.minProposalSizeBytes(); + uint256 challengePeriodSeconds = _dii.challengePeriodSeconds(); + + vm.broadcast(msg.sender); + PreimageOracle preimageOracleSingleton = + new PreimageOracle({ _minProposalSize: minProposalSizeBytes, _challengePeriod: challengePeriodSeconds }); + + vm.label(address(preimageOracleSingleton), "PreimageOracleSingleton"); + _dio.set(_dio.preimageOracleSingleton.selector, address(preimageOracleSingleton)); + } + + function deployMipsSingleton(DeployImplementationsInput, DeployImplementationsOutput _dio) public virtual { + IPreimageOracle preimageOracle = IPreimageOracle(_dio.preimageOracleSingleton()); + + vm.broadcast(msg.sender); + MIPS mipsSingleton = new MIPS(preimageOracle); + + vm.label(address(mipsSingleton), "MIPSSingleton"); + _dio.set(_dio.mipsSingleton.selector, address(mipsSingleton)); + } + + function deployDisputeGameFactoryImpl( + DeployImplementationsInput, + DeployImplementationsOutput _dio + ) + public + virtual + { + vm.broadcast(msg.sender); + DisputeGameFactory disputeGameFactoryImpl = new DisputeGameFactory(); + + vm.label(address(disputeGameFactoryImpl), "DisputeGameFactoryImpl"); + _dio.set(_dio.disputeGameFactoryImpl.selector, address(disputeGameFactoryImpl)); + } + + // -------- Utilities -------- + + function etchIOContracts() public returns (DeployImplementationsInput dii_, DeployImplementationsOutput dio_) { + (dii_, dio_) = getIOContracts(); + vm.etch(address(dii_), type(DeployImplementationsInput).runtimeCode); + vm.etch(address(dio_), type(DeployImplementationsOutput).runtimeCode); + } + + function getIOContracts() public view returns (DeployImplementationsInput dii_, DeployImplementationsOutput dio_) { + dii_ = DeployImplementationsInput(DeployUtils.toIOAddress(msg.sender, "optimism.DeployImplementationsInput")); + dio_ = DeployImplementationsOutput(DeployUtils.toIOAddress(msg.sender, "optimism.DeployImplementationsOutput")); + } + + function deployBytecode(bytes memory _bytecode, bytes32 _salt) public returns (address newContract_) { + assembly ("memory-safe") { + newContract_ := create2(0, add(_bytecode, 0x20), mload(_bytecode), _salt) + } + require(newContract_ != address(0), "DeployImplementations: create2 failed"); + } +} + +// Similar to how DeploySuperchain.s.sol contains a lot of comments to thoroughly document the script +// architecture, this comment block documents how to update the deploy scripts to support new features. +// +// Using the base scripts and contracts (DeploySuperchain, DeployImplementations, DeployOPChain, and +// the corresponding OPStackManager) deploys a standard chain. For nonstandard and in-development +// features we need to modify some or all of those contracts, and we do that via inheritance. Using +// interop as an example, they've made the following changes to L1 contracts: +// - `OptimismPortalInterop is OptimismPortal`: A different portal implementation is used, and +// it's ABI is the same. +// - `SystemConfigInterop is SystemConfig`: A different system config implementation is used, and +// it's initializer has a different signature. This signature is different because there is a +// new input parameter, the `dependencyManager`. +// - Because of the different system config initializer, there is a new input parameter (dependencyManager). +// +// Similar to how inheritance was used to develop the new portal and system config contracts, we use +// inheritance to modify up to all of the deployer contracts. For this interop example, what this +// means is we need: +// - An `OPStackManagerInterop is OPStackManager` that knows how to encode the calldata for the +// new system config initializer. +// - A `DeployImplementationsInterop is DeployImplementations` that: +// - Deploys OptimismPortalInterop instead of OptimismPortal. +// - Deploys SystemConfigInterop instead of SystemConfig. +// - Deploys OPStackManagerInterop instead of OPStackManager, which contains the updated logic +// for encoding the SystemConfig initializer. +// - Updates the OPSM release setter logic to use the updated initializer. +// - A `DeployOPChainInterop is DeployOPChain` that allows the updated input parameter to be passed. +// +// Most of the complexity in the above flow comes from the the new input for the updated SystemConfig +// initializer. If all function signatures were the same, all we'd have to change is the contract +// implementations that are deployed then set in the OPSM. For now, to simplify things until we +// resolve https://github.com/ethereum-optimism/optimism/issues/11783, we just assume this new role +// is the same as the proxy admin owner. +contract DeployImplementationsInterop is DeployImplementations { + function createOPSMContract( + DeployImplementationsInput _dii, + DeployImplementationsOutput, + OPStackManager.Blueprints memory blueprints, + string memory release, + OPStackManager.ImplementationSetter[] memory setters + ) + internal + override + returns (OPStackManager opsmProxy_) + { + SuperchainConfig superchainConfigProxy = _dii.superchainConfigProxy(); + ProtocolVersions protocolVersionsProxy = _dii.protocolVersionsProxy(); + ProxyAdmin proxyAdmin = _dii.superchainProxyAdmin(); + + vm.startBroadcast(msg.sender); + Proxy proxy = new Proxy(address(msg.sender)); + OPStackManager opsm = new OPStackManagerInterop(superchainConfigProxy, protocolVersionsProxy); + + OPStackManager.InitializerInputs memory initializerInputs = + OPStackManager.InitializerInputs(blueprints, setters, release, true); + proxy.upgradeToAndCall(address(opsm), abi.encodeWithSelector(opsm.initialize.selector, initializerInputs)); + + proxy.changeAdmin(address(proxyAdmin)); // transfer ownership of Proxy contract to the ProxyAdmin contract + vm.stopBroadcast(); + + opsmProxy_ = OPStackManagerInterop(address(proxy)); + } + + function deployOptimismPortalImpl( + DeployImplementationsInput _dii, + DeployImplementationsOutput _dio + ) + public + override + { + uint256 proofMaturityDelaySeconds = _dii.proofMaturityDelaySeconds(); + uint256 disputeGameFinalityDelaySeconds = _dii.disputeGameFinalityDelaySeconds(); + + vm.broadcast(msg.sender); + OptimismPortalInterop optimismPortalImpl = new OptimismPortalInterop({ + _proofMaturityDelaySeconds: proofMaturityDelaySeconds, + _disputeGameFinalityDelaySeconds: disputeGameFinalityDelaySeconds + }); + + vm.label(address(optimismPortalImpl), "OptimismPortalImpl"); + _dio.set(_dio.optimismPortalImpl.selector, address(optimismPortalImpl)); + } + + function deploySystemConfigImpl(DeployImplementationsInput, DeployImplementationsOutput _dio) public override { + vm.broadcast(msg.sender); + SystemConfigInterop systemConfigImpl = new SystemConfigInterop(); + + vm.label(address(systemConfigImpl), "SystemConfigImpl"); + _dio.set(_dio.systemConfigImpl.selector, address(systemConfigImpl)); + } + + function opsmSystemConfigSetter( + DeployImplementationsInput, + DeployImplementationsOutput _dio + ) + internal + view + override + returns (OPStackManager.ImplementationSetter memory) + { + return OPStackManager.ImplementationSetter({ + name: "SystemConfig", + info: OPStackManager.Implementation(address(_dio.systemConfigImpl()), SystemConfigInterop.initialize.selector) + }); + } +} diff --git a/packages/contracts-bedrock/scripts/DeployOPChain.s.sol b/packages/contracts-bedrock/scripts/DeployOPChain.s.sol new file mode 100644 index 000000000000..50fd9060ae91 --- /dev/null +++ b/packages/contracts-bedrock/scripts/DeployOPChain.s.sol @@ -0,0 +1,523 @@ +// SPDX-License-Identifier: MIT +pragma solidity 0.8.15; + +import { Script } from "forge-std/Script.sol"; + +import { SafeCast } from "@openzeppelin/contracts/utils/math/SafeCast.sol"; + +import { DeployUtils } from "scripts/libraries/DeployUtils.sol"; +import { Solarray } from "scripts/libraries/Solarray.sol"; +import { BaseDeployIO } from "scripts/utils/BaseDeployIO.sol"; + +import { IResourceMetering } from "src/L1/interfaces/IResourceMetering.sol"; +import { ISuperchainConfig } from "src/L1/interfaces/ISuperchainConfig.sol"; +import { Constants } from "src/libraries/Constants.sol"; +import { Predeploys } from "src/libraries/Predeploys.sol"; + +import { ProxyAdmin } from "src/universal/ProxyAdmin.sol"; +import { Proxy } from "src/universal/Proxy.sol"; + +import { AddressManager } from "src/legacy/AddressManager.sol"; +import { DelayedWETH } from "src/dispute/DelayedWETH.sol"; +import { DisputeGameFactory } from "src/dispute/DisputeGameFactory.sol"; +import { AnchorStateRegistry } from "src/dispute/AnchorStateRegistry.sol"; +import { FaultDisputeGame } from "src/dispute/FaultDisputeGame.sol"; +import { PermissionedDisputeGame } from "src/dispute/PermissionedDisputeGame.sol"; +import { GameType, GameTypes, Hash, OutputRoot } from "src/dispute/lib/Types.sol"; + +import { OPStackManager } from "src/L1/OPStackManager.sol"; +import { OptimismPortal2 } from "src/L1/OptimismPortal2.sol"; +import { SystemConfig } from "src/L1/SystemConfig.sol"; +import { L1CrossDomainMessenger } from "src/L1/L1CrossDomainMessenger.sol"; +import { L1ERC721Bridge } from "src/L1/L1ERC721Bridge.sol"; +import { L1StandardBridge } from "src/L1/L1StandardBridge.sol"; +import { OptimismMintableERC20Factory } from "src/universal/OptimismMintableERC20Factory.sol"; + +contract DeployOPChainInput is BaseDeployIO { + address internal _opChainProxyAdminOwner; + address internal _systemConfigOwner; + address internal _batcher; + address internal _unsafeBlockSigner; + address internal _proposer; + address internal _challenger; + + // TODO Add fault proofs inputs in a future PR. + uint32 internal _basefeeScalar; + uint32 internal _blobBaseFeeScalar; + uint256 internal _l2ChainId; + OPStackManager internal _opsmProxy; + + function set(bytes4 _sel, address _addr) public { + require(_addr != address(0), "DeployOPChainInput: cannot set zero address"); + if (_sel == this.opChainProxyAdminOwner.selector) _opChainProxyAdminOwner = _addr; + else if (_sel == this.systemConfigOwner.selector) _systemConfigOwner = _addr; + else if (_sel == this.batcher.selector) _batcher = _addr; + else if (_sel == this.unsafeBlockSigner.selector) _unsafeBlockSigner = _addr; + else if (_sel == this.proposer.selector) _proposer = _addr; + else if (_sel == this.challenger.selector) _challenger = _addr; + else if (_sel == this.opsmProxy.selector) _opsmProxy = OPStackManager(_addr); + else revert("DeployOPChainInput: unknown selector"); + } + + function set(bytes4 _sel, uint256 _value) public { + if (_sel == this.basefeeScalar.selector) { + _basefeeScalar = SafeCast.toUint32(_value); + } else if (_sel == this.blobBaseFeeScalar.selector) { + _blobBaseFeeScalar = SafeCast.toUint32(_value); + } else if (_sel == this.l2ChainId.selector) { + require(_value != 0 && _value != block.chainid, "DeployOPChainInput: invalid l2ChainId"); + _l2ChainId = _value; + } else { + revert("DeployOPChainInput: unknown selector"); + } + } + + function opChainProxyAdminOwner() public view returns (address) { + require(_opChainProxyAdminOwner != address(0), "DeployOPChainInput: not set"); + return _opChainProxyAdminOwner; + } + + function systemConfigOwner() public view returns (address) { + require(_systemConfigOwner != address(0), "DeployOPChainInput: not set"); + return _systemConfigOwner; + } + + function batcher() public view returns (address) { + require(_batcher != address(0), "DeployOPChainInput: not set"); + return _batcher; + } + + function unsafeBlockSigner() public view returns (address) { + require(_unsafeBlockSigner != address(0), "DeployOPChainInput: not set"); + return _unsafeBlockSigner; + } + + function proposer() public view returns (address) { + require(_proposer != address(0), "DeployOPChainInput: not set"); + return _proposer; + } + + function challenger() public view returns (address) { + require(_challenger != address(0), "DeployOPChainInput: not set"); + return _challenger; + } + + function basefeeScalar() public view returns (uint32) { + require(_basefeeScalar != 0, "DeployOPChainInput: not set"); + return _basefeeScalar; + } + + function blobBaseFeeScalar() public view returns (uint32) { + require(_blobBaseFeeScalar != 0, "DeployOPChainInput: not set"); + return _blobBaseFeeScalar; + } + + function l2ChainId() public view returns (uint256) { + require(_l2ChainId != 0, "DeployOPChainInput: not set"); + require(_l2ChainId != block.chainid, "DeployOPChainInput: invalid l2ChainId"); + return _l2ChainId; + } + + function startingAnchorRoots() public pure returns (bytes memory) { + // WARNING: For now always hardcode the starting permissioned game anchor root to 0xdead, + // and we do not set anything for the permissioned game. This is because we currently only + // support deploying straight to permissioned games, and the starting root does not + // matter for that, as long as it is non-zero, since no games will be played. We do not + // deploy the permissionless game (and therefore do not set a starting root for it here) + // because to to update to the permissionless game, we will need to update its starting + // anchor root and deploy a new permissioned dispute game contract anyway. + // + // You can `console.logBytes(abi.encode(defaultStartingAnchorRoots))` to get the bytes that + // are hardcoded into `op-chain-ops/deployer/opsm/opchain.go` + AnchorStateRegistry.StartingAnchorRoot[] memory defaultStartingAnchorRoots = + new AnchorStateRegistry.StartingAnchorRoot[](1); + defaultStartingAnchorRoots[0] = AnchorStateRegistry.StartingAnchorRoot({ + gameType: GameTypes.PERMISSIONED_CANNON, + outputRoot: OutputRoot({ root: Hash.wrap(bytes32(hex"dead")), l2BlockNumber: 0 }) + }); + return abi.encode(defaultStartingAnchorRoots); + } + + // TODO: Check that opsm is proxied and it has an implementation. + function opsmProxy() public view returns (OPStackManager) { + require(address(_opsmProxy) != address(0), "DeployOPChainInput: not set"); + return _opsmProxy; + } +} + +contract DeployOPChainOutput is BaseDeployIO { + ProxyAdmin internal _opChainProxyAdmin; + AddressManager internal _addressManager; + L1ERC721Bridge internal _l1ERC721BridgeProxy; + SystemConfig internal _systemConfigProxy; + OptimismMintableERC20Factory internal _optimismMintableERC20FactoryProxy; + L1StandardBridge internal _l1StandardBridgeProxy; + L1CrossDomainMessenger internal _l1CrossDomainMessengerProxy; + OptimismPortal2 internal _optimismPortalProxy; + DisputeGameFactory internal _disputeGameFactoryProxy; + AnchorStateRegistry internal _anchorStateRegistryProxy; + AnchorStateRegistry internal _anchorStateRegistryImpl; + FaultDisputeGame internal _faultDisputeGame; + PermissionedDisputeGame internal _permissionedDisputeGame; + DelayedWETH internal _delayedWETHPermissionedGameProxy; + DelayedWETH internal _delayedWETHPermissionlessGameProxy; + + function set(bytes4 sel, address _addr) public { + require(_addr != address(0), "DeployOPChainOutput: cannot set zero address"); + // forgefmt: disable-start + if (sel == this.opChainProxyAdmin.selector) _opChainProxyAdmin = ProxyAdmin(_addr) ; + else if (sel == this.addressManager.selector) _addressManager = AddressManager(_addr) ; + else if (sel == this.l1ERC721BridgeProxy.selector) _l1ERC721BridgeProxy = L1ERC721Bridge(_addr) ; + else if (sel == this.systemConfigProxy.selector) _systemConfigProxy = SystemConfig(_addr) ; + else if (sel == this.optimismMintableERC20FactoryProxy.selector) _optimismMintableERC20FactoryProxy = OptimismMintableERC20Factory(_addr) ; + else if (sel == this.l1StandardBridgeProxy.selector) _l1StandardBridgeProxy = L1StandardBridge(payable(_addr)) ; + else if (sel == this.l1CrossDomainMessengerProxy.selector) _l1CrossDomainMessengerProxy = L1CrossDomainMessenger(_addr) ; + else if (sel == this.optimismPortalProxy.selector) _optimismPortalProxy = OptimismPortal2(payable(_addr)) ; + else if (sel == this.disputeGameFactoryProxy.selector) _disputeGameFactoryProxy = DisputeGameFactory(_addr) ; + else if (sel == this.anchorStateRegistryProxy.selector) _anchorStateRegistryProxy = AnchorStateRegistry(_addr) ; + else if (sel == this.anchorStateRegistryImpl.selector) _anchorStateRegistryImpl = AnchorStateRegistry(_addr) ; + else if (sel == this.faultDisputeGame.selector) _faultDisputeGame = FaultDisputeGame(_addr) ; + else if (sel == this.permissionedDisputeGame.selector) _permissionedDisputeGame = PermissionedDisputeGame(_addr) ; + else if (sel == this.delayedWETHPermissionedGameProxy.selector) _delayedWETHPermissionedGameProxy = DelayedWETH(payable(_addr)) ; + else if (sel == this.delayedWETHPermissionlessGameProxy.selector) _delayedWETHPermissionlessGameProxy = DelayedWETH(payable(_addr)) ; + else revert("DeployOPChainOutput: unknown selector"); + // forgefmt: disable-end + } + + function checkOutput(DeployOPChainInput _doi) public { + // With 16 addresses, we'd get a stack too deep error if we tried to do this inline as a + // single call to `Solarray.addresses`. So we split it into two calls. + address[] memory addrs1 = Solarray.addresses( + address(_opChainProxyAdmin), + address(_addressManager), + address(_l1ERC721BridgeProxy), + address(_systemConfigProxy), + address(_optimismMintableERC20FactoryProxy), + address(_l1StandardBridgeProxy), + address(_l1CrossDomainMessengerProxy) + ); + address[] memory addrs2 = Solarray.addresses( + address(_optimismPortalProxy), + address(_disputeGameFactoryProxy), + address(_anchorStateRegistryProxy), + address(_anchorStateRegistryImpl), + address(_faultDisputeGame), + address(_permissionedDisputeGame), + address(_delayedWETHPermissionedGameProxy), + address(_delayedWETHPermissionlessGameProxy) + ); + DeployUtils.assertValidContractAddresses(Solarray.extend(addrs1, addrs2)); + + assertValidDeploy(_doi); + } + + function opChainProxyAdmin() public view returns (ProxyAdmin) { + DeployUtils.assertValidContractAddress(address(_opChainProxyAdmin)); + return _opChainProxyAdmin; + } + + function addressManager() public view returns (AddressManager) { + DeployUtils.assertValidContractAddress(address(_addressManager)); + return _addressManager; + } + + function l1ERC721BridgeProxy() public view returns (L1ERC721Bridge) { + DeployUtils.assertValidContractAddress(address(_l1ERC721BridgeProxy)); + return _l1ERC721BridgeProxy; + } + + function systemConfigProxy() public view returns (SystemConfig) { + DeployUtils.assertValidContractAddress(address(_systemConfigProxy)); + return _systemConfigProxy; + } + + function optimismMintableERC20FactoryProxy() public view returns (OptimismMintableERC20Factory) { + DeployUtils.assertValidContractAddress(address(_optimismMintableERC20FactoryProxy)); + return _optimismMintableERC20FactoryProxy; + } + + function l1StandardBridgeProxy() public view returns (L1StandardBridge) { + DeployUtils.assertValidContractAddress(address(_l1StandardBridgeProxy)); + return _l1StandardBridgeProxy; + } + + function l1CrossDomainMessengerProxy() public view returns (L1CrossDomainMessenger) { + DeployUtils.assertValidContractAddress(address(_l1CrossDomainMessengerProxy)); + return _l1CrossDomainMessengerProxy; + } + + function optimismPortalProxy() public view returns (OptimismPortal2) { + DeployUtils.assertValidContractAddress(address(_optimismPortalProxy)); + return _optimismPortalProxy; + } + + function disputeGameFactoryProxy() public view returns (DisputeGameFactory) { + DeployUtils.assertValidContractAddress(address(_disputeGameFactoryProxy)); + return _disputeGameFactoryProxy; + } + + function anchorStateRegistryProxy() public view returns (AnchorStateRegistry) { + DeployUtils.assertValidContractAddress(address(_anchorStateRegistryProxy)); + return _anchorStateRegistryProxy; + } + + function anchorStateRegistryImpl() public view returns (AnchorStateRegistry) { + DeployUtils.assertValidContractAddress(address(_anchorStateRegistryImpl)); + return _anchorStateRegistryImpl; + } + + function faultDisputeGame() public view returns (FaultDisputeGame) { + DeployUtils.assertValidContractAddress(address(_faultDisputeGame)); + return _faultDisputeGame; + } + + function permissionedDisputeGame() public view returns (PermissionedDisputeGame) { + DeployUtils.assertValidContractAddress(address(_permissionedDisputeGame)); + return _permissionedDisputeGame; + } + + function delayedWETHPermissionedGameProxy() public view returns (DelayedWETH) { + DeployUtils.assertValidContractAddress(address(_delayedWETHPermissionedGameProxy)); + return _delayedWETHPermissionedGameProxy; + } + + function delayedWETHPermissionlessGameProxy() public view returns (DelayedWETH) { + DeployUtils.assertValidContractAddress(address(_delayedWETHPermissionlessGameProxy)); + return _delayedWETHPermissionlessGameProxy; + } + + // -------- Deployment Assertions -------- + + function assertValidDeploy(DeployOPChainInput _doi) internal { + assertValidAnchorStateRegistryProxy(_doi); + assertValidAnchorStateRegistryImpl(_doi); + assertValidDelayedWETHs(_doi); + assertValidDisputeGameFactory(_doi); + assertValidL1CrossDomainMessenger(_doi); + assertValidL1ERC721Bridge(_doi); + assertValidL1StandardBridge(_doi); + assertValidOptimismMintableERC20Factory(_doi); + assertValidOptimismPortal(_doi); + assertValidSystemConfig(_doi); + // TODO Other FP assertions like the dispute games, anchor state registry, etc. + // TODO add initialization assertions + } + + function assertValidAnchorStateRegistryProxy(DeployOPChainInput) internal { + // First we check the proxy as itself. + Proxy proxy = Proxy(payable(address(anchorStateRegistryProxy()))); + vm.prank(address(0)); + address admin = proxy.admin(); + require(admin == address(opChainProxyAdmin()), "ANCHORP-10"); + + // Then we check the proxy as ASR. + DeployUtils.assertInitialized({ _contractAddress: address(anchorStateRegistryProxy()), _slot: 0, _offset: 0 }); + + vm.prank(address(0)); + address impl = proxy.implementation(); + require(impl == address(anchorStateRegistryImpl()), "ANCHORP-20"); + require( + address(anchorStateRegistryProxy().disputeGameFactory()) == address(disputeGameFactoryProxy()), "ANCHORP-30" + ); + } + + function assertValidAnchorStateRegistryImpl(DeployOPChainInput) internal view { + AnchorStateRegistry registry = anchorStateRegistryImpl(); + + DeployUtils.assertInitialized({ _contractAddress: address(registry), _slot: 0, _offset: 0 }); + + require(address(registry.disputeGameFactory()) == address(disputeGameFactoryProxy()), "ANCHORI-10"); + } + + function assertValidSystemConfig(DeployOPChainInput _doi) internal view { + SystemConfig systemConfig = systemConfigProxy(); + + DeployUtils.assertInitialized({ _contractAddress: address(systemConfig), _slot: 0, _offset: 0 }); + + require(systemConfig.owner() == _doi.systemConfigOwner(), "SYSCON-10"); + require(systemConfig.basefeeScalar() == _doi.basefeeScalar(), "SYSCON-20"); + require(systemConfig.blobbasefeeScalar() == _doi.blobBaseFeeScalar(), "SYSCON-30"); + require(systemConfig.batcherHash() == bytes32(uint256(uint160(_doi.batcher()))), "SYSCON-40"); + require(systemConfig.gasLimit() == uint64(30000000), "SYSCON-50"); // TODO allow other gas limits? + require(systemConfig.unsafeBlockSigner() == _doi.unsafeBlockSigner(), "SYSCON-60"); + require(systemConfig.scalar() >> 248 == 1, "SYSCON-70"); + + IResourceMetering.ResourceConfig memory rConfig = Constants.DEFAULT_RESOURCE_CONFIG(); + IResourceMetering.ResourceConfig memory outputConfig = systemConfig.resourceConfig(); + require(outputConfig.maxResourceLimit == rConfig.maxResourceLimit, "SYSCON-80"); + require(outputConfig.elasticityMultiplier == rConfig.elasticityMultiplier, "SYSCON-90"); + require(outputConfig.baseFeeMaxChangeDenominator == rConfig.baseFeeMaxChangeDenominator, "SYSCON-100"); + require(outputConfig.systemTxMaxGas == rConfig.systemTxMaxGas, "SYSCON-110"); + require(outputConfig.minimumBaseFee == rConfig.minimumBaseFee, "SYSCON-120"); + require(outputConfig.maximumBaseFee == rConfig.maximumBaseFee, "SYSCON-130"); + + require(systemConfig.startBlock() == block.number, "SYSCON-140"); + require( + systemConfig.batchInbox() == _doi.opsmProxy().chainIdToBatchInboxAddress(_doi.l2ChainId()), "SYSCON-150" + ); + + require(systemConfig.l1CrossDomainMessenger() == address(l1CrossDomainMessengerProxy()), "SYSCON-160"); + require(systemConfig.l1ERC721Bridge() == address(l1ERC721BridgeProxy()), "SYSCON-170"); + require(systemConfig.l1StandardBridge() == address(l1StandardBridgeProxy()), "SYSCON-180"); + require(systemConfig.disputeGameFactory() == address(disputeGameFactoryProxy()), "SYSCON-190"); + require(systemConfig.optimismPortal() == address(optimismPortalProxy()), "SYSCON-200"); + require( + systemConfig.optimismMintableERC20Factory() == address(optimismMintableERC20FactoryProxy()), "SYSCON-210" + ); + (address gasPayingToken,) = systemConfig.gasPayingToken(); + require(gasPayingToken == Constants.ETHER, "SYSCON-220"); + } + + function assertValidL1CrossDomainMessenger(DeployOPChainInput _doi) internal view { + L1CrossDomainMessenger messenger = l1CrossDomainMessengerProxy(); + + DeployUtils.assertInitialized({ _contractAddress: address(messenger), _slot: 0, _offset: 20 }); + + require(address(messenger.OTHER_MESSENGER()) == Predeploys.L2_CROSS_DOMAIN_MESSENGER, "L1xDM-10"); + require(address(messenger.otherMessenger()) == Predeploys.L2_CROSS_DOMAIN_MESSENGER, "L1xDM-20"); + + require(address(messenger.PORTAL()) == address(optimismPortalProxy()), "L1xDM-30"); + require(address(messenger.portal()) == address(optimismPortalProxy()), "L1xDM-40"); + require(address(messenger.superchainConfig()) == address(_doi.opsmProxy().superchainConfig()), "L1xDM-50"); + + bytes32 xdmSenderSlot = vm.load(address(messenger), bytes32(uint256(204))); + require(address(uint160(uint256(xdmSenderSlot))) == Constants.DEFAULT_L2_SENDER, "L1xDM-60"); + } + + function assertValidL1StandardBridge(DeployOPChainInput _doi) internal view { + L1StandardBridge bridge = l1StandardBridgeProxy(); + L1CrossDomainMessenger messenger = l1CrossDomainMessengerProxy(); + + DeployUtils.assertInitialized({ _contractAddress: address(bridge), _slot: 0, _offset: 0 }); + + require(address(bridge.MESSENGER()) == address(messenger), "L1SB-10"); + require(address(bridge.messenger()) == address(messenger), "L1SB-20"); + require(address(bridge.OTHER_BRIDGE()) == Predeploys.L2_STANDARD_BRIDGE, "L1SB-30"); + require(address(bridge.otherBridge()) == Predeploys.L2_STANDARD_BRIDGE, "L1SB-40"); + require(address(bridge.superchainConfig()) == address(_doi.opsmProxy().superchainConfig()), "L1SB-50"); + } + + function assertValidOptimismMintableERC20Factory(DeployOPChainInput) internal view { + OptimismMintableERC20Factory factory = optimismMintableERC20FactoryProxy(); + + DeployUtils.assertInitialized({ _contractAddress: address(factory), _slot: 0, _offset: 0 }); + + require(factory.BRIDGE() == address(l1StandardBridgeProxy()), "MERC20F-10"); + require(factory.bridge() == address(l1StandardBridgeProxy()), "MERC20F-20"); + } + + function assertValidL1ERC721Bridge(DeployOPChainInput _doi) internal view { + L1ERC721Bridge bridge = l1ERC721BridgeProxy(); + + DeployUtils.assertInitialized({ _contractAddress: address(bridge), _slot: 0, _offset: 0 }); + + require(address(bridge.OTHER_BRIDGE()) == Predeploys.L2_ERC721_BRIDGE, "L721B-10"); + require(address(bridge.otherBridge()) == Predeploys.L2_ERC721_BRIDGE, "L721B-20"); + + require(address(bridge.MESSENGER()) == address(l1CrossDomainMessengerProxy()), "L721B-30"); + require(address(bridge.messenger()) == address(l1CrossDomainMessengerProxy()), "L721B-40"); + require(address(bridge.superchainConfig()) == address(_doi.opsmProxy().superchainConfig()), "L721B-50"); + } + + function assertValidOptimismPortal(DeployOPChainInput _doi) internal view { + OptimismPortal2 portal = optimismPortalProxy(); + ISuperchainConfig superchainConfig = ISuperchainConfig(address(_doi.opsmProxy().superchainConfig())); + + require(address(portal.disputeGameFactory()) == address(disputeGameFactoryProxy()), "PORTAL-10"); + require(address(portal.systemConfig()) == address(systemConfigProxy()), "PORTAL-20"); + require(address(portal.superchainConfig()) == address(superchainConfig), "PORTAL-30"); + require(portal.guardian() == superchainConfig.guardian(), "PORTAL-40"); + require(portal.paused() == superchainConfig.paused(), "PORTAL-50"); + require(portal.l2Sender() == Constants.DEFAULT_L2_SENDER, "PORTAL-60"); + + // 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)); + } + + function assertValidDisputeGameFactory(DeployOPChainInput) internal view { + // TODO add in once FP support is added. + } + + function assertValidDelayedWETHs(DeployOPChainInput) internal view { + // TODO add in once FP support is added. + } +} + +contract DeployOPChain is Script { + // -------- Core Deployment Methods -------- + + function run(DeployOPChainInput _doi, DeployOPChainOutput _doo) public { + OPStackManager opsmProxy = _doi.opsmProxy(); + + OPStackManager.Roles memory roles = OPStackManager.Roles({ + opChainProxyAdminOwner: _doi.opChainProxyAdminOwner(), + systemConfigOwner: _doi.systemConfigOwner(), + batcher: _doi.batcher(), + unsafeBlockSigner: _doi.unsafeBlockSigner(), + proposer: _doi.proposer(), + challenger: _doi.challenger() + }); + OPStackManager.DeployInput memory deployInput = OPStackManager.DeployInput({ + roles: roles, + basefeeScalar: _doi.basefeeScalar(), + blobBasefeeScalar: _doi.blobBaseFeeScalar(), + l2ChainId: _doi.l2ChainId(), + startingAnchorRoots: _doi.startingAnchorRoots() + }); + + vm.broadcast(msg.sender); + OPStackManager.DeployOutput memory deployOutput = opsmProxy.deploy(deployInput); + + vm.label(address(deployOutput.opChainProxyAdmin), "opChainProxyAdmin"); + vm.label(address(deployOutput.addressManager), "addressManager"); + vm.label(address(deployOutput.l1ERC721BridgeProxy), "l1ERC721BridgeProxy"); + vm.label(address(deployOutput.systemConfigProxy), "systemConfigProxy"); + vm.label(address(deployOutput.optimismMintableERC20FactoryProxy), "optimismMintableERC20FactoryProxy"); + vm.label(address(deployOutput.l1StandardBridgeProxy), "l1StandardBridgeProxy"); + vm.label(address(deployOutput.l1CrossDomainMessengerProxy), "l1CrossDomainMessengerProxy"); + vm.label(address(deployOutput.optimismPortalProxy), "optimismPortalProxy"); + vm.label(address(deployOutput.disputeGameFactoryProxy), "disputeGameFactoryProxy"); + vm.label(address(deployOutput.anchorStateRegistryProxy), "anchorStateRegistryProxy"); + vm.label(address(deployOutput.anchorStateRegistryImpl), "anchorStateRegistryImpl"); + vm.label(address(deployOutput.faultDisputeGame), "faultDisputeGame"); + vm.label(address(deployOutput.permissionedDisputeGame), "permissionedDisputeGame"); + vm.label(address(deployOutput.delayedWETHPermissionedGameProxy), "delayedWETHPermissionedGameProxy"); + vm.label(address(deployOutput.delayedWETHPermissionlessGameProxy), "delayedWETHPermissionlessGameProxy"); + + _doo.set(_doo.opChainProxyAdmin.selector, address(deployOutput.opChainProxyAdmin)); + _doo.set(_doo.addressManager.selector, address(deployOutput.addressManager)); + _doo.set(_doo.l1ERC721BridgeProxy.selector, address(deployOutput.l1ERC721BridgeProxy)); + _doo.set(_doo.systemConfigProxy.selector, address(deployOutput.systemConfigProxy)); + _doo.set( + _doo.optimismMintableERC20FactoryProxy.selector, address(deployOutput.optimismMintableERC20FactoryProxy) + ); + _doo.set(_doo.l1StandardBridgeProxy.selector, address(deployOutput.l1StandardBridgeProxy)); + _doo.set(_doo.l1CrossDomainMessengerProxy.selector, address(deployOutput.l1CrossDomainMessengerProxy)); + _doo.set(_doo.optimismPortalProxy.selector, address(deployOutput.optimismPortalProxy)); + _doo.set(_doo.disputeGameFactoryProxy.selector, address(deployOutput.disputeGameFactoryProxy)); + _doo.set(_doo.anchorStateRegistryProxy.selector, address(deployOutput.anchorStateRegistryProxy)); + _doo.set(_doo.anchorStateRegistryImpl.selector, address(deployOutput.anchorStateRegistryImpl)); + _doo.set(_doo.faultDisputeGame.selector, address(deployOutput.faultDisputeGame)); + _doo.set(_doo.permissionedDisputeGame.selector, address(deployOutput.permissionedDisputeGame)); + _doo.set(_doo.delayedWETHPermissionedGameProxy.selector, address(deployOutput.delayedWETHPermissionedGameProxy)); + _doo.set( + _doo.delayedWETHPermissionlessGameProxy.selector, address(deployOutput.delayedWETHPermissionlessGameProxy) + ); + + _doo.checkOutput(_doi); + } + + // -------- Utilities -------- + + function etchIOContracts() public returns (DeployOPChainInput doi_, DeployOPChainOutput doo_) { + (doi_, doo_) = getIOContracts(); + vm.etch(address(doi_), type(DeployOPChainInput).runtimeCode); + vm.etch(address(doo_), type(DeployOPChainOutput).runtimeCode); + } + + function getIOContracts() public view returns (DeployOPChainInput doi_, DeployOPChainOutput doo_) { + doi_ = DeployOPChainInput(DeployUtils.toIOAddress(msg.sender, "optimism.DeployOPChainInput")); + doo_ = DeployOPChainOutput(DeployUtils.toIOAddress(msg.sender, "optimism.DeployOPChainOutput")); + } +} diff --git a/packages/contracts-bedrock/scripts/DeployPeriphery.s.sol b/packages/contracts-bedrock/scripts/DeployPeriphery.s.sol deleted file mode 100644 index 01371b4a0d28..000000000000 --- a/packages/contracts-bedrock/scripts/DeployPeriphery.s.sol +++ /dev/null @@ -1,592 +0,0 @@ -// SPDX-License-Identifier: MIT -pragma solidity ^0.8.0; - -import { console2 as console } from "forge-std/console2.sol"; - -import { Script } from "forge-std/Script.sol"; -import { Artifacts } from "scripts/Artifacts.s.sol"; -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"; -import { CheckBalanceLow } from "src/periphery/drippie/dripchecks/CheckBalanceLow.sol"; -import { CheckTrue } from "src/periphery/drippie/dripchecks/CheckTrue.sol"; -import { AdminFaucetAuthModule } from "src/periphery/faucet/authmodules/AdminFaucetAuthModule.sol"; -import { EIP1967Helper } from "test/mocks/EIP1967Helper.sol"; -import { Config } from "scripts/Config.sol"; - -/// @title DeployPeriphery -/// @notice Script used to deploy periphery contracts. -contract DeployPeriphery is Script, Artifacts { - PeripheryDeployConfig cfg; - - /// @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. - function run() public { - console.log("Deploying all periphery contracts"); - - deployProxies(); - deployImplementations(); - - initializeFaucet(); - installFaucetAuthModulesConfigs(); - - if (cfg.installOpChainFaucetsDrips()) { - installOpChainFaucetsDrippieConfigs(); - } - - if (cfg.archivePreviousOpChainFaucetsDrips()) { - archivePreviousOpChainFaucetsDrippieConfigs(); - } - } - - /// @notice Deploy all of the proxies. - function deployProxies() public { - deployProxyAdmin(); - deployFaucetProxy(); - } - - /// @notice Deploy all of the implementations. - function deployImplementations() public { - deployFaucet(); - deployFaucetDrippie(); - deployCheckTrue(); - deployCheckBalanceLow(); - deployCheckGelatoLow(); - deployOnChainAuthModule(); - deployOffChainAuthModule(); - } - - /// @notice Modifier that wraps a function in broadcasting. - modifier broadcast() { - vm.startBroadcast(); - _; - vm.stopBroadcast(); - } - - /// @notice Deploy ProxyAdmin. - function deployProxyAdmin() public broadcast returns (address addr_) { - addr_ = _deployCreate2({ - _name: "ProxyAdmin", - _creationCode: type(ProxyAdmin).creationCode, - _constructorParams: abi.encode(msg.sender) - }); - - ProxyAdmin admin = ProxyAdmin(addr_); - require(admin.owner() == msg.sender); - } - - /// @notice Deploy FaucetProxy. - function deployFaucetProxy() public broadcast returns (address addr_) { - addr_ = _deployCreate2({ - _name: "FaucetProxy", - _creationCode: type(Proxy).creationCode, - _constructorParams: abi.encode(mustGetAddress("ProxyAdmin")) - }); - - Proxy proxy = Proxy(payable(addr_)); - require(EIP1967Helper.getAdmin(address(proxy)) == mustGetAddress("ProxyAdmin")); - } - - /// @notice Deploy the Faucet contract. - function deployFaucet() public broadcast returns (address addr_) { - addr_ = _deployCreate2({ - _name: "Faucet", - _creationCode: type(Faucet).creationCode, - _constructorParams: abi.encode(cfg.faucetAdmin()) - }); - - Faucet faucet = Faucet(payable(addr_)); - require(faucet.ADMIN() == cfg.faucetAdmin()); - } - - /// @notice Deploy the Drippie contract. - function deployFaucetDrippie() public broadcast returns (address addr_) { - addr_ = _deployCreate2({ - _name: "FaucetDrippie", - _creationCode: type(Drippie).creationCode, - _constructorParams: abi.encode(cfg.faucetDrippieOwner()) - }); - - Drippie drippie = Drippie(payable(addr_)); - require(drippie.owner() == cfg.faucetDrippieOwner()); - } - - /// @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 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") - }); - - AdminFaucetAuthModule module = AdminFaucetAuthModule(addr_); - require(module.ADMIN() == cfg.faucetOffchainAuthModuleAdmin()); - } - - /// @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_) { - addr_ = _deployCreate2({ - _name: "CheckBalanceLow", - _creationCode: type(CheckBalanceLow).creationCode, - _constructorParams: hex"" - }); - } - - /// @notice Deploy CheckGelatoLow contract. - function deployCheckGelatoLow() public broadcast returns (address addr_) { - addr_ = _deployCreate2({ - _name: "CheckGelatoLow", - _creationCode: type(CheckGelatoLow).creationCode, - _constructorParams: hex"" - }); - } - - /// @notice Initialize the Faucet. - function initializeFaucet() public broadcast { - ProxyAdmin proxyAdmin = ProxyAdmin(mustGetAddress("ProxyAdmin")); - address faucetProxy = mustGetAddress("FaucetProxy"); - address faucet = mustGetAddress("Faucet"); - address implementationAddress = proxyAdmin.getProxyImplementation(faucetProxy); - if (implementationAddress == faucet) { - console.log("Faucet proxy implementation already set"); - } else { - proxyAdmin.upgrade({ _proxy: payable(faucetProxy), _implementation: faucet }); - } - - require(Faucet(payable(faucetProxy)).ADMIN() == Faucet(payable(faucet)).ADMIN()); - } - - /// @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(); - 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. - function installOpChainFaucetsDrippieConfigs() public { - uint256 drippieOwnerPrivateKey = Config.drippieOwnerPrivateKey(); - vm.startBroadcast(drippieOwnerPrivateKey); - - Drippie drippie = Drippie(mustGetAddress("FaucetDrippie")); - console.log("Installing OP Chain faucet drips at %s", address(drippie)); - installSmallOpChainFaucetsDrips(); - installLargeOpChainFaucetsDrips(); - installSmallOpChainAdminWalletDrips(); - installLargeOpChainAdminWalletDrips(); - console.log("OP chain faucet drip configs successfully installed"); - - vm.stopBroadcast(); - } - - /// @notice Installs drips that send funds to small OP chain faucets on the scheduled interval. - function installSmallOpChainFaucetsDrips() public { - for (uint256 i = 0; i < cfg.getSmallFaucetsL1BridgeAddressesCount(); i++) { - address l1BridgeAddress = cfg.smallFaucetsL1BridgeAddresses(i); - _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 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" - ); - - for (uint256 i = 0; i < cfg.getSmallFaucetsL1BridgeAddressesCount(); i++) { - address l1BridgeAddress = cfg.smallFaucetsL1BridgeAddresses(i); - _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. - function installLargeOpChainAdminWalletDrips() public { - require( - cfg.faucetOnchainAuthModuleAdmin() == cfg.faucetOffchainAuthModuleAdmin(), - "installLargeOpChainAdminWalletDrips: Only handles identical admin wallet addresses" - ); - - for (uint256 i = 0; i < cfg.getLargeFaucetsL1BridgeAddressesCount(); i++) { - address l1BridgeAddress = cfg.largeFaucetsL1BridgeAddresses(i); - _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. - function installFaucetDripV1() public broadcast { - _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. - function installFaucetDripV2() public broadcast { - _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. - function installFaucetAdminDripV1() public broadcast { - _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); - - 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"); - } - - function archivePreviousSmallOpChainFaucetsDrips() public { - Drippie drippie = Drippie(mustGetAddress("FaucetDrippie")); - uint256 arrayLength = cfg.getSmallFaucetsL1BridgeAddressesCount(); - for (uint256 i = 0; i < arrayLength; i++) { - address l1BridgeAddress = cfg.smallFaucetsL1BridgeAddresses(i); - 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 - ); - } - } - - function archivePreviousLargeOpChainFaucetsDrips() public { - Drippie drippie = Drippie(mustGetAddress("FaucetDrippie")); - uint256 arrayLength = cfg.getLargeFaucetsL1BridgeAddressesCount(); - for (uint256 i = 0; i < arrayLength; i++) { - address l1BridgeAddress = cfg.largeFaucetsL1BridgeAddresses(i); - 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. - function installOnChainAuthModule() public broadcast { - _installAuthModule({ - _faucet: Faucet(mustGetAddress("FaucetProxy")), - _name: "OnChainAuthModule", - _config: Faucet.ModuleConfig({ - name: "OnChainAuthModule", - enabled: true, - ttl: cfg.faucetOnchainAuthModuleTtl(), - amount: cfg.faucetOnchainAuthModuleAmount() - }) - }); - } - - /// @notice Installs the OffChain AuthModule on the Faucet contract. - function installOffChainAuthModule() public broadcast { - _installAuthModule({ - _faucet: Faucet(mustGetAddress("FaucetProxy")), - _name: "OffChainAuthModule", - _config: Faucet.ModuleConfig({ - name: "OffChainAuthModule", - enabled: true, - ttl: cfg.faucetOffchainAuthModuleTtl(), - amount: cfg.faucetOffchainAuthModuleAmount() - }) - }); - } - - /// @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"); - } - - /// @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)); - return string.concat(dripNamePrefixWithBridgeAddress, versionSuffix); - } - - /// @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)); - return string.concat(dripNamePrefixWithBridgeAddress, versionSuffix); - } - - // @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_) - { - 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", _name); - } - - // 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/DeploySuperchain.s.sol b/packages/contracts-bedrock/scripts/DeploySuperchain.s.sol new file mode 100644 index 000000000000..365b67df7b47 --- /dev/null +++ b/packages/contracts-bedrock/scripts/DeploySuperchain.s.sol @@ -0,0 +1,415 @@ +// SPDX-License-Identifier: MIT +pragma solidity 0.8.15; + +import { Script } from "forge-std/Script.sol"; +import { stdToml } from "forge-std/StdToml.sol"; + +import { SuperchainConfig } from "src/L1/SuperchainConfig.sol"; +import { ProtocolVersions, ProtocolVersion } from "src/L1/ProtocolVersions.sol"; +import { ProxyAdmin } from "src/universal/ProxyAdmin.sol"; +import { Proxy } from "src/universal/Proxy.sol"; + +import { DeployUtils } from "scripts/libraries/DeployUtils.sol"; +import { Solarray } from "scripts/libraries/Solarray.sol"; +import { BaseDeployIO } from "scripts/utils/BaseDeployIO.sol"; + +// This comment block defines the requirements and rationale for the architecture used in this forge +// script, along with other scripts that are being written as new Superchain-first deploy scripts to +// complement the OP Stack Manager. The script architecture is a bit different than a standard forge +// deployment script. +// +// There are three categories of users that are expected to interact with the scripts: +// 1. End users that want to run live contract deployments. These users are expected to run these scripts via +// 'op-deployer' which uses a go interface to interact with the scripts. +// 2. Solidity developers that want to use or test these scripts in a standard forge test environment. +// 3. Go developers that want to run the deploy scripts as part of e2e testing with other aspects of the OP Stack. +// +// We want each user to interact with the scripts in the way that's simplest for their use case: +// 1. Solidity developers: Direct calls to the script, with the input and output contracts configured. +// 2. Go developers: The forge scripts can be executed directly in Go. +// +// The following architecture is used to meet the requirements of each user. We use this file's +// `DeploySuperchain` script as an example, but it applies to other scripts as well. +// +// This `DeploySuperchain.s.sol` file contains three contracts: +// 1. `DeploySuperchainInput`: Responsible for parsing, storing, and exposing the input data. +// 2. `DeploySuperchainOutput`: Responsible for storing and exposing the output data. +// 3. `DeploySuperchain`: The core script that executes the deployment. It reads inputs from the +// input contract, and writes outputs to the output contract. +// +// Because the core script performs calls to the input and output contracts, Go developers can +// intercept calls to these addresses (analogous to how forge intercepts calls to the `Vm` address +// to execute cheatcodes), to avoid the need for hardcoding the input/output values. +// +// Public getter methods on the input and output contracts allow individual fields to be accessed +// in a strong, type-safe manner (as opposed to a single struct getter where the caller may +// inadvertently transpose two addresses, for example). +// +// Each deployment step in the core deploy script is modularized into its own function that performs +// the deploy and sets the output on the Output contract, allowing for easy composition and testing +// of deployment steps. The output setter methods requires keying off the four-byte selector of +// each output field's getter method, ensuring that the output is set for the correct field and +// minimizing the amount of boilerplate needed for each output field. +// +// This script doubles as a reference for documenting the pattern used and therefore contains +// comments explaining the patterns used. Other scripts are not expected to have this level of +// documentation. +// +// Additionally, we intentionally use "Input" and "Output" terminology to clearly distinguish these +// scripts from the existing ones that use the "Config" and "Artifacts" terminology. Within scripts +// we use variable names that are shorthand for the full contract names, for example: +// - `dsi` for DeploySuperchainInput +// - `dso` for DeploySuperchainOutput +// - `dio` for DeployImplementationsInput +// - `dio` for DeployImplementationsOutput +// - `doo` for DeployOPChainInput +// - `doo` for DeployOPChainOutput +// - etc. + +// All contracts of the form `Deploy<X>Input` should inherit from `BaseDeployIO`, as it provides +// shared functionality for all deploy scripts, such as access to cheat codes. +contract DeploySuperchainInput is BaseDeployIO { + using stdToml for string; + + // All inputs are set in storage individually. We put any roles first, followed by the remaining + // inputs. Inputs are internal and prefixed with an underscore, because we will expose a getter + // method that returns the input value. We use a getter method to allow us to make assertions on + // the input to ensure it's valid before returning it. We also intentionally do not use a struct + // to hold all inputs, because as features are developed the set of inputs will change, and + // modifying structs in Solidity is not very simple. + + // Role inputs. + address internal _guardian; + address internal _protocolVersionsOwner; + address internal _proxyAdminOwner; + + // Other inputs. + bool internal _paused; + ProtocolVersion internal _recommendedProtocolVersion; + ProtocolVersion internal _requiredProtocolVersion; + + // These `set` methods let each input be set individually. The selector of an input's getter method + // is used to determine which field to set. + function set(bytes4 _sel, address _address) public { + require(_address != address(0), "DeploySuperchainInput: cannot set zero address"); + if (_sel == this.guardian.selector) _guardian = _address; + else if (_sel == this.protocolVersionsOwner.selector) _protocolVersionsOwner = _address; + else if (_sel == this.proxyAdminOwner.selector) _proxyAdminOwner = _address; + else revert("DeploySuperchainInput: unknown selector"); + } + + function set(bytes4 _sel, bool _value) public { + if (_sel == this.paused.selector) _paused = _value; + else revert("DeploySuperchainInput: unknown selector"); + } + + function set(bytes4 _sel, ProtocolVersion _value) public { + require(ProtocolVersion.unwrap(_value) != 0, "DeploySuperchainInput: cannot set null protocol version"); + if (_sel == this.recommendedProtocolVersion.selector) _recommendedProtocolVersion = _value; + else if (_sel == this.requiredProtocolVersion.selector) _requiredProtocolVersion = _value; + else revert("DeploySuperchainInput: unknown selector"); + } + + // Each input field is exposed via it's own getter method. Using public storage variables here + // would be less verbose, but would also be more error-prone, as it would require the caller to + // validate that each input is set before accessing it. With getter methods, we can automatically + // validate that each input is set before allowing any field to be accessed. + + function proxyAdminOwner() public view returns (address) { + require(_proxyAdminOwner != address(0), "DeploySuperchainInput: proxyAdminOwner not set"); + return _proxyAdminOwner; + } + + function protocolVersionsOwner() public view returns (address) { + require(_protocolVersionsOwner != address(0), "DeploySuperchainInput: protocolVersionsOwner not set"); + return _protocolVersionsOwner; + } + + function guardian() public view returns (address) { + require(_guardian != address(0), "DeploySuperchainInput: guardian not set"); + return _guardian; + } + + function paused() public view returns (bool) { + return _paused; + } + + function requiredProtocolVersion() public view returns (ProtocolVersion) { + require( + ProtocolVersion.unwrap(_requiredProtocolVersion) != 0, + "DeploySuperchainInput: requiredProtocolVersion not set" + ); + return _requiredProtocolVersion; + } + + function recommendedProtocolVersion() public view returns (ProtocolVersion) { + require( + ProtocolVersion.unwrap(_recommendedProtocolVersion) != 0, + "DeploySuperchainInput: recommendedProtocolVersion not set" + ); + return _recommendedProtocolVersion; + } +} + +// All contracts of the form `Deploy<X>Output` should inherit from `BaseDeployIO`, as it provides +// shared functionality for all deploy scripts, such as access to cheat codes. +contract DeploySuperchainOutput is BaseDeployIO { + // All outputs are stored in storage individually, with the same rationale as doing so for + // inputs, and the same pattern is used below to expose the outputs. + ProtocolVersions internal _protocolVersionsImpl; + ProtocolVersions internal _protocolVersionsProxy; + SuperchainConfig internal _superchainConfigImpl; + SuperchainConfig internal _superchainConfigProxy; + ProxyAdmin internal _superchainProxyAdmin; + + // This method lets each field be set individually. The selector of an output's getter method + // is used to determine which field to set. + function set(bytes4 sel, address _address) public { + require(_address != address(0), "DeploySuperchainOutput: cannot set zero address"); + if (sel == this.superchainProxyAdmin.selector) _superchainProxyAdmin = ProxyAdmin(_address); + else if (sel == this.superchainConfigImpl.selector) _superchainConfigImpl = SuperchainConfig(_address); + else if (sel == this.superchainConfigProxy.selector) _superchainConfigProxy = SuperchainConfig(_address); + else if (sel == this.protocolVersionsImpl.selector) _protocolVersionsImpl = ProtocolVersions(_address); + else if (sel == this.protocolVersionsProxy.selector) _protocolVersionsProxy = ProtocolVersions(_address); + else revert("DeploySuperchainOutput: unknown selector"); + } + + // This function can be called to ensure all outputs are correct. + // It fetches the output values using external calls to the getter methods for safety. + function checkOutput(DeploySuperchainInput _dsi) public { + address[] memory addrs = Solarray.addresses( + address(this.superchainProxyAdmin()), + address(this.superchainConfigImpl()), + address(this.superchainConfigProxy()), + address(this.protocolVersionsImpl()), + address(this.protocolVersionsProxy()) + ); + DeployUtils.assertValidContractAddresses(addrs); + + // To read the implementations we prank as the zero address due to the proxyCallIfNotAdmin modifier. + vm.startPrank(address(0)); + address actualSuperchainConfigImpl = Proxy(payable(address(_superchainConfigProxy))).implementation(); + address actualProtocolVersionsImpl = Proxy(payable(address(_protocolVersionsProxy))).implementation(); + vm.stopPrank(); + + require(actualSuperchainConfigImpl == address(_superchainConfigImpl), "100"); + require(actualProtocolVersionsImpl == address(_protocolVersionsImpl), "200"); + + // TODO Also add the assertions for the implementation contracts from ChainAssertions.sol + assertValidDeploy(_dsi); + } + + function superchainProxyAdmin() public view returns (ProxyAdmin) { + // This does not have to be a contract address, it could be an EOA. + return _superchainProxyAdmin; + } + + function superchainConfigImpl() public view returns (SuperchainConfig) { + DeployUtils.assertValidContractAddress(address(_superchainConfigImpl)); + return _superchainConfigImpl; + } + + function superchainConfigProxy() public view returns (SuperchainConfig) { + DeployUtils.assertValidContractAddress(address(_superchainConfigProxy)); + return _superchainConfigProxy; + } + + function protocolVersionsImpl() public view returns (ProtocolVersions) { + DeployUtils.assertValidContractAddress(address(_protocolVersionsImpl)); + return _protocolVersionsImpl; + } + + function protocolVersionsProxy() public view returns (ProtocolVersions) { + DeployUtils.assertValidContractAddress(address(_protocolVersionsProxy)); + return _protocolVersionsProxy; + } + + // -------- Deployment Assertions -------- + function assertValidDeploy(DeploySuperchainInput _dsi) public { + assertValidSuperchainProxyAdmin(_dsi); + assertValidSuperchainConfig(_dsi); + assertValidProtocolVersions(_dsi); + } + + function assertValidSuperchainProxyAdmin(DeploySuperchainInput _dsi) internal view { + require(superchainProxyAdmin().owner() == _dsi.proxyAdminOwner(), "SPA-10"); + } + + function assertValidSuperchainConfig(DeploySuperchainInput _dsi) internal { + // Proxy checks. + SuperchainConfig superchainConfig = superchainConfigProxy(); + DeployUtils.assertInitialized({ _contractAddress: address(superchainConfig), _slot: 0, _offset: 0 }); + require(superchainConfig.guardian() == _dsi.guardian(), "SUPCON-10"); + require(superchainConfig.paused() == _dsi.paused(), "SUPCON-20"); + + vm.startPrank(address(0)); + require( + Proxy(payable(address(superchainConfig))).implementation() == address(superchainConfigImpl()), "SUPCON-30" + ); + require(Proxy(payable(address(superchainConfig))).admin() == address(superchainProxyAdmin()), "SUPCON-40"); + vm.stopPrank(); + + // Implementation checks + superchainConfig = superchainConfigImpl(); + require(superchainConfig.guardian() == address(0), "SUPCON-50"); + require(superchainConfig.paused() == false, "SUPCON-60"); + } + + function assertValidProtocolVersions(DeploySuperchainInput _dsi) internal { + // Proxy checks. + ProtocolVersions pv = protocolVersionsProxy(); + DeployUtils.assertInitialized({ _contractAddress: address(pv), _slot: 0, _offset: 0 }); + require(pv.owner() == _dsi.protocolVersionsOwner(), "PV-10"); + require( + ProtocolVersion.unwrap(pv.required()) == ProtocolVersion.unwrap(_dsi.requiredProtocolVersion()), "PV-20" + ); + require( + ProtocolVersion.unwrap(pv.recommended()) == ProtocolVersion.unwrap(_dsi.recommendedProtocolVersion()), + "PV-30" + ); + + vm.startPrank(address(0)); + require(Proxy(payable(address(pv))).implementation() == address(protocolVersionsImpl()), "PV-40"); + require(Proxy(payable(address(pv))).admin() == address(superchainProxyAdmin()), "PV-50"); + vm.stopPrank(); + + // Implementation checks. + pv = protocolVersionsImpl(); + require(pv.owner() == address(0xdead), "PV-60"); + require(ProtocolVersion.unwrap(pv.required()) == 0, "PV-70"); + require(ProtocolVersion.unwrap(pv.recommended()) == 0, "PV-80"); + } +} + +// For all broadcasts in this script we explicitly specify the deployer as `msg.sender` because for +// testing we deploy this script from a test contract. If we provide no argument, the foundry +// default sender would be the broadcaster during test, but the broadcaster needs to be the deployer +// since they are set to the initial proxy admin owner. +contract DeploySuperchain is Script { + // -------- Core Deployment Methods -------- + + function run(DeploySuperchainInput _dsi, DeploySuperchainOutput _dso) public { + // Notice that we do not do any explicit verification here that inputs are set. This is because + // the verification happens elsewhere: + // - Getter methods on the input contract provide sanity checks that values are set, when applicable. + // - The individual methods below that we use to compose the deployment are responsible for handling + // their own verification. + // This pattern ensures that other deploy scripts that might compose these contracts and + // methods in different ways are still protected from invalid inputs without need to implement + // additional verification logic. + + // Deploy the proxy admin, with the owner set to the deployer. + deploySuperchainProxyAdmin(_dsi, _dso); + + // Deploy and initialize the superchain contracts. + deploySuperchainImplementationContracts(_dsi, _dso); + deployAndInitializeSuperchainConfig(_dsi, _dso); + deployAndInitializeProtocolVersions(_dsi, _dso); + + // Transfer ownership of the ProxyAdmin from the deployer to the specified owner. + transferProxyAdminOwnership(_dsi, _dso); + + // Output assertions, to make sure outputs were assigned correctly. + _dso.checkOutput(_dsi); + } + + // -------- Deployment Steps -------- + + function deploySuperchainProxyAdmin(DeploySuperchainInput, DeploySuperchainOutput _dso) public { + // Deploy the proxy admin, with the owner set to the deployer. + // We explicitly specify the deployer as `msg.sender` because for testing we deploy this script from a test + // contract. If we provide no argument, the foundry default sender would be the broadcaster during test, but the + // broadcaster needs to be the deployer since they are set to the initial proxy admin owner. + vm.broadcast(msg.sender); + ProxyAdmin superchainProxyAdmin = new ProxyAdmin(msg.sender); + + vm.label(address(superchainProxyAdmin), "SuperchainProxyAdmin"); + _dso.set(_dso.superchainProxyAdmin.selector, address(superchainProxyAdmin)); + } + + function deploySuperchainImplementationContracts(DeploySuperchainInput, DeploySuperchainOutput _dso) public { + // Deploy implementation contracts. + vm.startBroadcast(msg.sender); + SuperchainConfig superchainConfigImpl = new SuperchainConfig(); + ProtocolVersions protocolVersionsImpl = new ProtocolVersions(); + vm.stopBroadcast(); + + vm.label(address(superchainConfigImpl), "SuperchainConfigImpl"); + vm.label(address(protocolVersionsImpl), "ProtocolVersionsImpl"); + + _dso.set(_dso.superchainConfigImpl.selector, address(superchainConfigImpl)); + _dso.set(_dso.protocolVersionsImpl.selector, address(protocolVersionsImpl)); + } + + function deployAndInitializeSuperchainConfig(DeploySuperchainInput _dsi, DeploySuperchainOutput _dso) public { + address guardian = _dsi.guardian(); + bool paused = _dsi.paused(); + + ProxyAdmin superchainProxyAdmin = _dso.superchainProxyAdmin(); + SuperchainConfig superchainConfigImpl = _dso.superchainConfigImpl(); + + vm.startBroadcast(msg.sender); + SuperchainConfig superchainConfigProxy = SuperchainConfig(address(new Proxy(address(superchainProxyAdmin)))); + superchainProxyAdmin.upgradeAndCall( + payable(address(superchainConfigProxy)), + address(superchainConfigImpl), + abi.encodeCall(SuperchainConfig.initialize, (guardian, paused)) + ); + vm.stopBroadcast(); + + vm.label(address(superchainConfigProxy), "SuperchainConfigProxy"); + _dso.set(_dso.superchainConfigProxy.selector, address(superchainConfigProxy)); + } + + function deployAndInitializeProtocolVersions(DeploySuperchainInput _dsi, DeploySuperchainOutput _dso) public { + address protocolVersionsOwner = _dsi.protocolVersionsOwner(); + ProtocolVersion requiredProtocolVersion = _dsi.requiredProtocolVersion(); + ProtocolVersion recommendedProtocolVersion = _dsi.recommendedProtocolVersion(); + + ProxyAdmin superchainProxyAdmin = _dso.superchainProxyAdmin(); + ProtocolVersions protocolVersionsImpl = _dso.protocolVersionsImpl(); + + vm.startBroadcast(msg.sender); + ProtocolVersions protocolVersionsProxy = ProtocolVersions(address(new Proxy(address(superchainProxyAdmin)))); + superchainProxyAdmin.upgradeAndCall( + payable(address(protocolVersionsProxy)), + address(protocolVersionsImpl), + abi.encodeCall( + ProtocolVersions.initialize, + (protocolVersionsOwner, requiredProtocolVersion, recommendedProtocolVersion) + ) + ); + vm.stopBroadcast(); + + vm.label(address(protocolVersionsProxy), "ProtocolVersionsProxy"); + _dso.set(_dso.protocolVersionsProxy.selector, address(protocolVersionsProxy)); + } + + function transferProxyAdminOwnership(DeploySuperchainInput _dsi, DeploySuperchainOutput _dso) public { + address proxyAdminOwner = _dsi.proxyAdminOwner(); + + ProxyAdmin superchainProxyAdmin = _dso.superchainProxyAdmin(); + DeployUtils.assertValidContractAddress(address(superchainProxyAdmin)); + + vm.broadcast(msg.sender); + superchainProxyAdmin.transferOwnership(proxyAdminOwner); + } + + // -------- Utilities -------- + + // This etches the IO contracts into memory so that we can use them in tests. + // When interacting with the script programmatically (e.g. in a Solidity test), this must be called. + function etchIOContracts() public returns (DeploySuperchainInput dsi_, DeploySuperchainOutput dso_) { + (dsi_, dso_) = getIOContracts(); + vm.etch(address(dsi_), type(DeploySuperchainInput).runtimeCode); + vm.etch(address(dso_), type(DeploySuperchainOutput).runtimeCode); + vm.allowCheatcodes(address(dsi_)); + vm.allowCheatcodes(address(dso_)); + } + + // This returns the addresses of the IO contracts for this script. + function getIOContracts() public view returns (DeploySuperchainInput dsi_, DeploySuperchainOutput dso_) { + dsi_ = DeploySuperchainInput(DeployUtils.toIOAddress(msg.sender, "optimism.DeploySuperchainInput")); + dso_ = DeploySuperchainOutput(DeployUtils.toIOAddress(msg.sender, "optimism.DeploySuperchainOutput")); + } +} diff --git a/packages/contracts-bedrock/scripts/Executables.sol b/packages/contracts-bedrock/scripts/Executables.sol deleted file mode 100644 index bd0621b96f54..000000000000 --- a/packages/contracts-bedrock/scripts/Executables.sol +++ /dev/null @@ -1,29 +0,0 @@ -// 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"; - string internal constant echo = "echo"; - 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/ForgeArtifacts.sol b/packages/contracts-bedrock/scripts/ForgeArtifacts.sol deleted file mode 100644 index 19ef08cdf0df..000000000000 --- a/packages/contracts-bedrock/scripts/ForgeArtifacts.sol +++ /dev/null @@ -1,214 +0,0 @@ -// SPDX-License-Identifier: MIT -pragma solidity ^0.8.0; - -import { Vm } from "forge-std/Vm.sol"; -import { Executables } from "scripts/Executables.sol"; -import { stdJson } from "forge-std/StdJson.sol"; - -/// @notice Contains information about a storage slot. Mirrors the layout of the storage -/// slot object in Forge artifacts so that we can deserialize JSON into this struct. -struct StorageSlot { - uint256 astId; - string _contract; - string label; - uint256 offset; - string slot; - 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 { - /// @notice Foundry cheatcode VM. - Vm private constant vm = Vm(address(uint160(uint256(keccak256("hevm cheat code"))))); - - /// @notice Removes the semantic versioning from a contract name. The semver will exist if the contract is compiled - /// more than once with different versions of the compiler. - function _stripSemver(string memory _name) internal returns (string memory out_) { - string[] memory cmd = new string[](3); - cmd[0] = Executables.bash; - cmd[1] = "-c"; - cmd[2] = string.concat( - Executables.echo, " ", _name, " | ", Executables.sed, " -E 's/[.][0-9]+\\.[0-9]+\\.[0-9]+//g'" - ); - bytes memory res = vm.ffi(cmd); - out_ = string(res); - } - - /// @notice Builds the fully qualified name of a contract. Assumes that the - /// file name is the same as the contract name but strips semver for the file name. - function _getFullyQualifiedName(string memory _name) internal returns (string memory out_) { - string memory sanitized = _stripSemver(_name); - out_ = string.concat(sanitized, ".sol:", _name); - } - - /// @notice Returns the storage layout for a deployed contract. - function getStorageLayout(string memory _name) public returns (string memory layout_) { - string[] memory cmd = new string[](3); - cmd[0] = Executables.bash; - cmd[1] = "-c"; - cmd[2] = string.concat(Executables.jq, " -r '.storageLayout' < ", _getForgeArtifactPath(_name)); - bytes memory res = vm.ffi(cmd); - layout_ = string(res); - } - - /// @notice Returns the abi from a the forge artifact - function getAbi(string memory _name) public returns (string memory abi_) { - string[] memory cmd = new string[](3); - cmd[0] = Executables.bash; - cmd[1] = "-c"; - cmd[2] = string.concat(Executables.jq, " -r '.abi' < ", _getForgeArtifactPath(_name)); - bytes memory res = vm.ffi(cmd); - abi_ = string(res); - } - - /// @notice Returns the methodIdentifiers from the forge artifact - function getMethodIdentifiers(string memory _name) internal returns (string[] memory ids_) { - string[] memory cmd = new string[](3); - cmd[0] = Executables.bash; - cmd[1] = "-c"; - cmd[2] = string.concat(Executables.jq, " '.methodIdentifiers | keys' < ", _getForgeArtifactPath(_name)); - bytes memory res = vm.ffi(cmd); - ids_ = stdJson.readStringArray(string(res), ""); - } - - function _getForgeArtifactDirectory(string memory _name) internal returns (string memory dir_) { - string[] memory cmd = new string[](3); - cmd[0] = Executables.bash; - cmd[1] = "-c"; - cmd[2] = string.concat(Executables.forge, " config --json | ", Executables.jq, " -r .out"); - bytes memory res = vm.ffi(cmd); - string memory contractName = _stripSemver(_name); - dir_ = string.concat(vm.projectRoot(), "/", string(res), "/", contractName, ".sol"); - } - - /// @notice Returns the filesystem path to the artifact path. If the contract was compiled - /// with multiple solidity versions then return the first one based on the result of `ls`. - function _getForgeArtifactPath(string memory _name) internal returns (string memory out_) { - string memory directory = _getForgeArtifactDirectory(_name); - string memory path = string.concat(directory, "/", _name, ".json"); - if (vm.exists(path)) { - return path; - } - - string[] memory cmd = new string[](3); - cmd[0] = Executables.bash; - cmd[1] = "-c"; - cmd[2] = string.concat( - Executables.ls, - " -1 --color=never ", - directory, - " | ", - Executables.jq, - " -R -s -c 'split(\"\n\") | map(select(length > 0))'" - ); - bytes memory res = vm.ffi(cmd); - string[] memory files = stdJson.readStringArray(string(res), ""); - out_ = string.concat(directory, "/", files[0]); - } - - /// @notice Returns the forge artifact given a contract name. - function _getForgeArtifact(string memory _name) internal returns (string memory out_) { - string memory forgeArtifactPath = _getForgeArtifactPath(_name); - out_ = vm.readFile(forgeArtifactPath); - } - - /// @notice Pulls the `_initialized` storage slot information from the Forge artifacts for a given contract. - function getInitializedSlot(string memory _contractName) internal returns (StorageSlot memory slot_) { - string memory storageLayout = getStorageLayout(_contractName); - - string[] memory command = new string[](3); - command[0] = Executables.bash; - command[1] = "-c"; - command[2] = string.concat( - Executables.echo, - " '", - storageLayout, - "'", - " | ", - Executables.jq, - " '.storage[] | select(.label == \"_initialized\" and .type == \"t_uint8\")'" - ); - bytes memory rawSlot = vm.parseJson(string(vm.ffi(command))); - 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 { - string[] memory outputs = vm.split(_path, "/"); - string memory path = ""; - for (uint256 i = 0; i < outputs.length - 1; i++) { - path = string.concat(path, outputs[i], "/"); - } - vm.createDir(path, true); - } -} diff --git a/packages/contracts-bedrock/scripts/L2Genesis.s.sol b/packages/contracts-bedrock/scripts/L2Genesis.s.sol index d3098851eb98..d57ec1ea5ca6 100644 --- a/packages/contracts-bedrock/scripts/L2Genesis.s.sol +++ b/packages/contracts-bedrock/scripts/L2Genesis.s.sol @@ -1,32 +1,43 @@ // SPDX-License-Identifier: MIT pragma solidity 0.8.15; +// Testing import { Script } from "forge-std/Script.sol"; import { console2 as console } from "forge-std/console2.sol"; -import { Deployer } from "scripts/Deployer.sol"; +import { EIP1967Helper } from "test/mocks/EIP1967Helper.sol"; -import { Config } from "scripts/Config.sol"; +// Scripts +import { Deployer } from "scripts/deploy/Deployer.sol"; +import { Config, OutputMode, OutputModeUtils, Fork, ForkUtils, LATEST_FORK } from "scripts/libraries/Config.sol"; import { Artifacts } from "scripts/Artifacts.s.sol"; -import { DeployConfig } from "scripts/DeployConfig.s.sol"; -import { Predeploys } from "src/libraries/Predeploys.sol"; -import { Preinstalls } from "src/libraries/Preinstalls.sol"; -import { Constants } from "src/libraries/Constants.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 { DeployConfig } from "scripts/deploy/DeployConfig.s.sol"; +import { Process } from "scripts/libraries/Process.sol"; +import { SetPreinstalls } from "scripts/SetPreinstalls.s.sol"; + +// Contracts import { SequencerFeeVault } from "src/L2/SequencerFeeVault.sol"; -import { OptimismMintableERC20Factory } from "src/universal/OptimismMintableERC20Factory.sol"; -import { OptimismMintableERC721Factory } from "src/universal/OptimismMintableERC721Factory.sol"; import { BaseFeeVault } from "src/L2/BaseFeeVault.sol"; import { L1FeeVault } from "src/L2/L1FeeVault.sol"; import { SoulGasToken } from "src/L2/SoulGasToken.sol"; -import { GovernanceToken } from "src/governance/GovernanceToken.sol"; -import { L1CrossDomainMessenger } from "src/L1/L1CrossDomainMessenger.sol"; -import { L1StandardBridge } from "src/L1/L1StandardBridge.sol"; +import { OptimismSuperchainERC20Beacon } from "src/L2/OptimismSuperchainERC20Beacon.sol"; +import { OptimismMintableERC721Factory } from "src/universal/OptimismMintableERC721Factory.sol"; import { FeeVault } from "src/universal/FeeVault.sol"; -import { EIP1967Helper } from "test/mocks/EIP1967Helper.sol"; +import { GovernanceToken } from "src/governance/GovernanceToken.sol"; + +// Libraries +import { Predeploys } from "src/libraries/Predeploys.sol"; +import { Preinstalls } from "src/libraries/Preinstalls.sol"; + +// Interfaces +import { IOptimismMintableERC20Factory } from "src/universal/interfaces/IOptimismMintableERC20Factory.sol"; +import { IL2StandardBridge } from "src/L2/interfaces/IL2StandardBridge.sol"; +import { IL2ERC721Bridge } from "src/L2/interfaces/IL2ERC721Bridge.sol"; +import { IStandardBridge } from "src/universal/interfaces/IStandardBridge.sol"; +import { ICrossDomainMessenger } from "src/universal/interfaces/ICrossDomainMessenger.sol"; +import { IL2CrossDomainMessenger } from "src/L2/interfaces/IL2CrossDomainMessenger.sol"; +import { IGasPriceOracle } from "src/L2/interfaces/IGasPriceOracle.sol"; +import { IL1Block } from "src/L2/interfaces/IL1Block.sol"; interface IInitializable { function initialize(address _addr) external; @@ -38,20 +49,6 @@ struct L1Dependencies { 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: @@ -60,6 +57,9 @@ enum OutputMode { /// 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. contract L2Genesis is Deployer { + using ForkUtils for Fork; + using OutputModeUtils for OutputMode; + uint256 public constant PRECOMPILE_COUNT = 256; uint80 internal constant DEV_ACCOUNT_FUND_AMT = 10_000 ether; @@ -121,7 +121,7 @@ contract L2Genesis is Deployer { /// 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()); + runWithOptions(Config.outputMode(), cfg.fork(), artifactDependencies()); } /// @notice Alias for `runWithStateDump` so that no `--sig` needs to be specified. @@ -131,11 +131,33 @@ contract L2Genesis is Deployer { /// @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()); + runWithOptions(OutputMode.ALL, LATEST_FORK, artifactDependencies()); + } + + /// @notice This is used by new experimental interop deploy tooling. + function runWithEnv() public { + // The setUp() is skipped (since we insert a custom DeployConfig, and do not use Artifacts) + deployer = makeAddr("deployer"); + runWithOptions( + OutputMode.NONE, + Config.fork(), + L1Dependencies({ + l1CrossDomainMessengerProxy: payable(vm.envAddress("L2GENESIS_L1CrossDomainMessengerProxy")), + l1StandardBridgeProxy: payable(vm.envAddress("L2GENESIS_L1StandardBridgeProxy")), + l1ERC721BridgeProxy: payable(vm.envAddress("L2GENESIS_L1ERC721BridgeProxy")) + }) + ); + } + + /// @notice This is used by foundry tests to enable the latest fork with the + /// given L1 dependencies. + function runWithLatestLocal(L1Dependencies memory _l1Dependencies) public { + runWithOptions(OutputMode.NONE, LATEST_FORK, _l1Dependencies); } /// @notice Build the L2 genesis. - function runWithOptions(OutputMode _mode, L1Dependencies memory _l1Dependencies) public { + function runWithOptions(OutputMode _mode, Fork _fork, L1Dependencies memory _l1Dependencies) public { + console.log("L2Genesis: outputMode: %s, fork: %s", _mode.toString(), _fork.toString()); vm.startPrank(deployer); vm.chainId(cfg.l2ChainID()); @@ -148,28 +170,34 @@ contract L2Genesis is Deployer { } vm.stopPrank(); - // 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) { + if (writeForkGenesisAllocs(_fork, Fork.DELTA, _mode)) { return; } - if (_mode == OutputMode.OUTPUT_ALL) { - writeGenesisAllocs(Config.stateDumpPath("-delta")); - } activateEcotone(); - if (_mode == OutputMode.LOCAL_ECOTONE) { + if (writeForkGenesisAllocs(_fork, Fork.ECOTONE, _mode)) { return; } - if (_mode == OutputMode.OUTPUT_ALL) { - writeGenesisAllocs(Config.stateDumpPath("-ecotone")); - } activateFjord(); - if (_mode == OutputMode.OUTPUT_ALL || _mode == OutputMode.DEFAULT_LATEST) { - writeGenesisAllocs(Config.stateDumpPath("")); + if (writeForkGenesisAllocs(_fork, Fork.FJORD, _mode)) { + return; + } + + if (writeForkGenesisAllocs(_fork, Fork.GRANITE, _mode)) { + return; + } + } + + function writeForkGenesisAllocs(Fork _latest, Fork _current, OutputMode _mode) internal returns (bool isLatest_) { + if (_mode == OutputMode.ALL || _latest == _current && _mode == OutputMode.LATEST) { + string memory suffix = string.concat("-", _current.toString()); + writeGenesisAllocs(Config.stateDumpPath(suffix)); + } + if (_latest == _current) { + isLatest_ = true; } } @@ -185,7 +213,10 @@ contract L2Genesis is Deployer { /// 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. + /// Warning: the predeploy accounts have contract code, but 0 nonce value, contrary + /// to the expected nonce of 1 per EIP-161. This is because the legacy go genesis + // script didn't set the nonce and we didn't want to change that behavior when + /// migrating genesis generation to Solidity. function setPredeployProxies() public { console.log("Setting Predeploy proxies"); bytes memory code = vm.getDeployedCode("Proxy.sol:Proxy"); @@ -249,6 +280,10 @@ contract L2Genesis is Deployer { if (cfg.useInterop()) { setCrossL2Inbox(); // 22 setL2ToL2CrossDomainMessenger(); // 23 + setSuperchainWETH(); // 24 + setETHLiquidity(); // 25 + setOptimismSuperchainERC20Factory(); // 26 + setOptimismSuperchainERC20Beacon(); // 27 } } @@ -306,21 +341,29 @@ contract L2Genesis is Deployer { function setL2CrossDomainMessenger(address payable _l1CrossDomainMessengerProxy) public { address impl = _setImplementationCode(Predeploys.L2_CROSS_DOMAIN_MESSENGER); - L2CrossDomainMessenger(impl).initialize({ _l1CrossDomainMessenger: L1CrossDomainMessenger(address(0)) }); + IL2CrossDomainMessenger(impl).initialize({ _l1CrossDomainMessenger: ICrossDomainMessenger(address(0)) }); - L2CrossDomainMessenger(Predeploys.L2_CROSS_DOMAIN_MESSENGER).initialize({ - _l1CrossDomainMessenger: L1CrossDomainMessenger(_l1CrossDomainMessengerProxy) + IL2CrossDomainMessenger(Predeploys.L2_CROSS_DOMAIN_MESSENGER).initialize({ + _l1CrossDomainMessenger: ICrossDomainMessenger(_l1CrossDomainMessengerProxy) }); } /// @notice This predeploy is following the safety invariant #1. function setL2StandardBridge(address payable _l1StandardBridgeProxy) public { - address impl = _setImplementationCode(Predeploys.L2_STANDARD_BRIDGE); + address impl; + if (cfg.useInterop()) { + string memory cname = "L2StandardBridgeInterop"; + impl = Predeploys.predeployToCodeNamespace(Predeploys.L2_STANDARD_BRIDGE); + console.log("Setting %s implementation at: %s", cname, impl); + vm.etch(impl, vm.getDeployedCode(string.concat(cname, ".sol:", cname))); + } else { + impl = _setImplementationCode(Predeploys.L2_STANDARD_BRIDGE); + } - L2StandardBridge(payable(impl)).initialize({ _otherBridge: L1StandardBridge(payable(address(0))) }); + IL2StandardBridge(payable(impl)).initialize({ _otherBridge: IStandardBridge(payable(address(0))) }); - L2StandardBridge(payable(Predeploys.L2_STANDARD_BRIDGE)).initialize({ - _otherBridge: L1StandardBridge(_l1StandardBridgeProxy) + IL2StandardBridge(payable(Predeploys.L2_STANDARD_BRIDGE)).initialize({ + _otherBridge: IStandardBridge(_l1StandardBridgeProxy) }); } @@ -328,9 +371,9 @@ contract L2Genesis is Deployer { function setL2ERC721Bridge(address payable _l1ERC721BridgeProxy) public { address impl = _setImplementationCode(Predeploys.L2_ERC721_BRIDGE); - L2ERC721Bridge(impl).initialize({ _l1ERC721Bridge: payable(address(0)) }); + IL2ERC721Bridge(impl).initialize({ _l1ERC721Bridge: payable(address(0)) }); - L2ERC721Bridge(Predeploys.L2_ERC721_BRIDGE).initialize({ _l1ERC721Bridge: payable(_l1ERC721BridgeProxy) }); + IL2ERC721Bridge(Predeploys.L2_ERC721_BRIDGE).initialize({ _l1ERC721Bridge: payable(_l1ERC721BridgeProxy) }); } /// @notice This predeploy is following the safety invariant #2, @@ -354,9 +397,9 @@ contract L2Genesis is Deployer { function setOptimismMintableERC20Factory() public { address impl = _setImplementationCode(Predeploys.OPTIMISM_MINTABLE_ERC20_FACTORY); - OptimismMintableERC20Factory(impl).initialize({ _bridge: address(0) }); + IOptimismMintableERC20Factory(impl).initialize({ _bridge: address(0) }); - OptimismMintableERC20Factory(Predeploys.OPTIMISM_MINTABLE_ERC20_FACTORY).initialize({ + IOptimismMintableERC20Factory(Predeploys.OPTIMISM_MINTABLE_ERC20_FACTORY).initialize({ _bridge: Predeploys.L2_STANDARD_BRIDGE }); } @@ -377,9 +420,16 @@ contract L2Genesis is Deployer { /// @notice This predeploy is following the safety invariant #1. function setL1Block() public { - _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. + if (cfg.useInterop()) { + string memory cname = "L1BlockIsthmus"; + 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 safety invariant #1. @@ -494,40 +544,60 @@ contract L2Genesis is Deployer { vm.resetNonce(address(eas)); } - /// @notice This predeploy is following the saftey invariant #2. + /// @notice This predeploy is following the safety invariant #2. /// This contract has no initializer. function setCrossL2Inbox() internal { _setImplementationCode(Predeploys.CROSS_L2_INBOX); } - /// @notice This predeploy is following the saftey invariant #2. + /// @notice This predeploy is following the safety invariant #2. /// This contract has no initializer. function setL2ToL2CrossDomainMessenger() internal { _setImplementationCode(Predeploys.L2_TO_L2_CROSS_DOMAIN_MESSENGER); } + /// @notice This predeploy is following the safety invariant #1. + /// This contract has no initializer. + function setETHLiquidity() internal { + _setImplementationCode(Predeploys.ETH_LIQUIDITY); + vm.deal(Predeploys.ETH_LIQUIDITY, type(uint248).max); + } + + /// @notice This predeploy is following the safety invariant #1. + /// This contract has no initializer. + function setSuperchainWETH() internal { + _setImplementationCode(Predeploys.SUPERCHAIN_WETH); + } + + /// @notice This predeploy is following the safety invariant #1. + /// This contract has no initializer. + function setOptimismSuperchainERC20Factory() internal { + _setImplementationCode(Predeploys.OPTIMISM_SUPERCHAIN_ERC20_FACTORY); + } + + /// @notice This predeploy is following the safety invariant #2. + function setOptimismSuperchainERC20Beacon() internal { + address superchainERC20Impl = Predeploys.OPTIMISM_SUPERCHAIN_ERC20; + console.log("Setting %s implementation at: %s", "OptimismSuperchainERC20", superchainERC20Impl); + vm.etch(superchainERC20Impl, vm.getDeployedCode("OptimismSuperchainERC20.sol:OptimismSuperchainERC20")); + + OptimismSuperchainERC20Beacon beacon = new OptimismSuperchainERC20Beacon(superchainERC20Impl); + address beaconImpl = Predeploys.predeployToCodeNamespace(Predeploys.OPTIMISM_SUPERCHAIN_ERC20_BEACON); + + console.log("Setting %s implementation at: %s", "OptimismSuperchainERC20Beacon", beaconImpl); + vm.etch(beaconImpl, address(beacon).code); + + /// Reset so its not included state dump + vm.etch(address(beacon), ""); + vm.resetNonce(address(beacon)); + } + /// @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 setPreinstalls() public { + address tmpSetPreinstalls = address(uint160(uint256(keccak256("SetPreinstalls")))); + vm.etch(tmpSetPreinstalls, vm.getDeployedCode("SetPreinstalls.s.sol:SetPreinstalls")); + SetPreinstalls(tmpSetPreinstalls).setPreinstalls(); + vm.etch(tmpSetPreinstalls, ""); } /// @notice Activate Ecotone network upgrade. @@ -535,14 +605,14 @@ contract L2Genesis is Deployer { 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(); + vm.prank(IL1Block(Predeploys.L1_BLOCK_ATTRIBUTES).DEPOSITOR_ACCOUNT()); + IGasPriceOracle(Predeploys.GAS_PRICE_ORACLE).setEcotone(); } 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(); + vm.prank(IL1Block(Predeploys.L1_BLOCK_ATTRIBUTES).DEPOSITOR_ACCOUNT()); + IGasPriceOracle(Predeploys.GAS_PRICE_ORACLE).setFjord(); } /// @notice Sets the bytecode in state @@ -554,17 +624,6 @@ contract L2Genesis is Deployer { return impl; } - /// @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); - } - } - /// @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 @@ -587,7 +646,7 @@ contract L2Genesis is Deployer { commands[0] = "bash"; commands[1] = "-c"; commands[2] = string.concat("cat <<< $(jq -S '.' ", _path, ") > ", _path); - vm.ffi(commands); + Process.run(commands); } /// @notice Funds the default dev accounts with ether diff --git a/packages/contracts-bedrock/scripts/PeripheryDeployConfig.s.sol b/packages/contracts-bedrock/scripts/PeripheryDeployConfig.s.sol deleted file mode 100644 index adf2e88fe3ae..000000000000 --- a/packages/contracts-bedrock/scripts/PeripheryDeployConfig.s.sol +++ /dev/null @@ -1,124 +0,0 @@ -// SPDX-License-Identifier: MIT -pragma solidity ^0.8.0; - -import { Script } from "forge-std/Script.sol"; -import { console2 as console } from "forge-std/console2.sol"; -import { stdJson } from "forge-std/StdJson.sol"; - -/// @title PeripheryDeployConfig -/// @notice Represents the configuration required to deploy the periphery contracts. It is expected -/// to read the file from JSON. A future improvement would be to have fallback -/// values if they are not defined in the JSON themselves. -contract PeripheryDeployConfig is Script { - string internal _json; - - address public faucetAdmin; - address public faucetDrippieOwner; - uint256 public faucetDripV1Value; - uint256 public faucetDripV1Interval; - uint256 public faucetDripV1Threshold; - uint256 public faucetDripV2Value; - uint256 public faucetDripV2Interval; - uint256 public faucetDripV2Threshold; - uint256 public faucetAdminDripV1Value; - uint256 public faucetAdminDripV1Interval; - uint256 public faucetAdminDripV1Threshold; - address public faucetGelatoTreasury; - address public faucetGelatoRecipient; - uint256 public faucetGelatoBalanceV1DripInterval; - uint256 public faucetGelatoBalanceV1Value; - uint256 public faucetGelatoThreshold; - address public faucetOnchainAuthModuleAdmin; - uint256 public faucetOnchainAuthModuleTtl; - uint256 public faucetOnchainAuthModuleAmount; - address public faucetOffchainAuthModuleAdmin; - uint256 public faucetOffchainAuthModuleTtl; - uint256 public faucetOffchainAuthModuleAmount; - bool public installOpChainFaucetsDrips; - bool public archivePreviousOpChainFaucetsDrips; - uint256 public smallOpChainFaucetDripValue; - uint256 public smallOpChainFaucetDripInterval; - uint256 public largeOpChainFaucetDripValue; - uint256 public largeOpChainFaucetDripInterval; - uint256 public opChainAdminWalletDripValue; - uint256 public opChainAdminWalletDripInterval; - address public opL1BridgeAddress; - address public baseL1BridgeAddress; - address public zoraL1BridgeAddress; - address public pgnL1BridgeAddress; - address public orderlyL1BridgeAddress; - address public modeL1BridgeAddress; - address public lyraL1BridgeAddress; - address public liskL1BridgeAddress; - address[6] public smallFaucetsL1BridgeAddresses; - address[2] public largeFaucetsL1BridgeAddresses; - uint256 public dripVersion; - uint256 public previousDripVersion; - - constructor(string memory _path) { - console.log("PeripheryDeployConfig: reading file %s", _path); - try vm.readFile(_path) returns (string memory data) { - _json = data; - } catch { - console.log("Warning: unable to read config. Do not deploy unless you are not using config."); - return; - } - - faucetAdmin = stdJson.readAddress(_json, "$.faucetAdmin"); - faucetDrippieOwner = stdJson.readAddress(_json, "$.faucetDrippieOwner"); - faucetDripV1Value = stdJson.readUint(_json, "$.faucetDripV1Value"); - faucetDripV1Interval = stdJson.readUint(_json, "$.faucetDripV1Interval"); - faucetDripV1Threshold = stdJson.readUint(_json, "$.faucetDripV1Threshold"); - faucetDripV2Value = stdJson.readUint(_json, "$.faucetDripV2Value"); - faucetDripV2Interval = stdJson.readUint(_json, "$.faucetDripV2Interval"); - faucetDripV2Threshold = stdJson.readUint(_json, "$.faucetDripV2Threshold"); - faucetAdminDripV1Value = stdJson.readUint(_json, "$.faucetAdminDripV1Value"); - faucetAdminDripV1Interval = stdJson.readUint(_json, "$.faucetAdminDripV1Interval"); - faucetAdminDripV1Threshold = stdJson.readUint(_json, "$.faucetAdminDripV1Threshold"); - faucetGelatoTreasury = stdJson.readAddress(_json, "$.faucetGelatoTreasury"); - faucetGelatoRecipient = stdJson.readAddress(_json, "$.faucetGelatoRecipient"); - faucetGelatoBalanceV1DripInterval = stdJson.readUint(_json, "$.faucetGelatoBalanceV1DripInterval"); - faucetGelatoBalanceV1Value = stdJson.readUint(_json, "$.faucetGelatoBalanceV1Value"); - faucetGelatoThreshold = stdJson.readUint(_json, "$.faucetGelatoThreshold"); - faucetOnchainAuthModuleAdmin = stdJson.readAddress(_json, "$.faucetOnchainAuthModuleAdmin"); - faucetOnchainAuthModuleTtl = stdJson.readUint(_json, "$.faucetOnchainAuthModuleTtl"); - faucetOnchainAuthModuleAmount = stdJson.readUint(_json, "$.faucetOnchainAuthModuleAmount"); - faucetOffchainAuthModuleAdmin = stdJson.readAddress(_json, "$.faucetOffchainAuthModuleAdmin"); - faucetOffchainAuthModuleTtl = stdJson.readUint(_json, "$.faucetOffchainAuthModuleTtl"); - faucetOffchainAuthModuleAmount = stdJson.readUint(_json, "$.faucetOffchainAuthModuleAmount"); - installOpChainFaucetsDrips = stdJson.readBool(_json, "$.installOpChainFaucetsDrips"); - archivePreviousOpChainFaucetsDrips = stdJson.readBool(_json, "$.archivePreviousOpChainFaucetsDrips"); - opL1BridgeAddress = stdJson.readAddress(_json, "$.opL1BridgeAddress"); - baseL1BridgeAddress = stdJson.readAddress(_json, "$.baseL1BridgeAddress"); - zoraL1BridgeAddress = stdJson.readAddress(_json, "$.zoraL1BridgeAddress"); - pgnL1BridgeAddress = stdJson.readAddress(_json, "$.pgnL1BridgeAddress"); - orderlyL1BridgeAddress = stdJson.readAddress(_json, "$.orderlyL1BridgeAddress"); - liskL1BridgeAddress = stdJson.readAddress(_json, "$.liskL1BridgeAddress"); - modeL1BridgeAddress = stdJson.readAddress(_json, "$.modeL1BridgeAddress"); - lyraL1BridgeAddress = stdJson.readAddress(_json, "$.lyraL1BridgeAddress"); - dripVersion = stdJson.readUint(_json, "$.dripVersion"); - previousDripVersion = stdJson.readUint(_json, "$.previousDripVersion"); - smallOpChainFaucetDripValue = stdJson.readUint(_json, "$.smallOpChainFaucetDripValue"); - smallOpChainFaucetDripInterval = stdJson.readUint(_json, "$.smallOpChainFaucetDripInterval"); - largeOpChainFaucetDripValue = stdJson.readUint(_json, "$.largeOpChainFaucetDripValue"); - largeOpChainFaucetDripInterval = stdJson.readUint(_json, "$.largeOpChainFaucetDripInterval"); - opChainAdminWalletDripValue = stdJson.readUint(_json, "$.opChainAdminWalletDripValue"); - opChainAdminWalletDripInterval = stdJson.readUint(_json, "$.opChainAdminWalletDripInterval"); - largeFaucetsL1BridgeAddresses[0] = opL1BridgeAddress; - largeFaucetsL1BridgeAddresses[1] = baseL1BridgeAddress; - smallFaucetsL1BridgeAddresses[0] = zoraL1BridgeAddress; - smallFaucetsL1BridgeAddresses[1] = pgnL1BridgeAddress; - smallFaucetsL1BridgeAddresses[2] = orderlyL1BridgeAddress; - smallFaucetsL1BridgeAddresses[3] = modeL1BridgeAddress; - smallFaucetsL1BridgeAddresses[4] = lyraL1BridgeAddress; - smallFaucetsL1BridgeAddresses[5] = liskL1BridgeAddress; - } - - function getSmallFaucetsL1BridgeAddressesCount() public view returns (uint256 count) { - return smallFaucetsL1BridgeAddresses.length; - } - - function getLargeFaucetsL1BridgeAddressesCount() public view returns (uint256 count) { - return largeFaucetsL1BridgeAddresses.length; - } -} diff --git a/packages/contracts-bedrock/scripts/SetPreinstalls.s.sol b/packages/contracts-bedrock/scripts/SetPreinstalls.s.sol new file mode 100644 index 000000000000..46e68a17c941 --- /dev/null +++ b/packages/contracts-bedrock/scripts/SetPreinstalls.s.sol @@ -0,0 +1,50 @@ +// SPDX-License-Identifier: MIT +pragma solidity 0.8.15; + +import { Script } from "forge-std/Script.sol"; +import { console2 as console } from "forge-std/console2.sol"; + +import { Preinstalls } from "src/libraries/Preinstalls.sol"; + +/// @title SetPreinstalls +/// @notice Sets all preinstalls in the VM state. There is no default "run()" entrypoint, +/// as this is used in L2Genesis.s.sol, and standalone in the Go test setup for L1 state. +contract SetPreinstalls is Script { + /// @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() public { + _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_v060); // ERC 4337 v0.6.0 + _setPreinstallCode(Preinstalls.EntryPoint_v060); // ERC 4337 v0.6.0 + _setPreinstallCode(Preinstalls.SenderCreator_v070); // ERC 4337 v0.7.0 + _setPreinstallCode(Preinstalls.EntryPoint_v070); // ERC 4337 v0.7.0 + _setPreinstallCode(Preinstalls.BeaconBlockRoots); + _setPreinstallCode(Preinstalls.CreateX); + // 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); + } + + /// @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, block.chainid)); + // 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); + } + } +} diff --git a/packages/contracts-bedrock/scripts/SemverLock.s.sol b/packages/contracts-bedrock/scripts/autogen/SemverLock.s.sol similarity index 87% rename from packages/contracts-bedrock/scripts/SemverLock.s.sol rename to packages/contracts-bedrock/scripts/autogen/SemverLock.s.sol index e940431b091d..bd2b5534b7fc 100644 --- a/packages/contracts-bedrock/scripts/SemverLock.s.sol +++ b/packages/contracts-bedrock/scripts/autogen/SemverLock.s.sol @@ -4,6 +4,7 @@ pragma solidity 0.8.15; import { Script } from "forge-std/Script.sol"; import { stdJson } from "forge-std/StdJson.sol"; import { console2 as console } from "forge-std/console2.sol"; +import { Process } from "scripts/libraries/Process.sol"; contract SemverLock is Script { function run() public { @@ -12,7 +13,7 @@ contract SemverLock is Script { commands[0] = "bash"; commands[1] = "-c"; commands[2] = "grep -rl '@custom:semver' src | jq -Rs 'split(\"\\n\") | map(select(length > 0))'"; - string memory rawFiles = string(vm.ffi(commands)); + string memory rawFiles = string(Process.run(commands)); string[] memory files = vm.parseJsonStringArray(rawFiles, ""); writeSemverLock(files); @@ -26,17 +27,17 @@ contract SemverLock is Script { string[] memory commands = new string[](2); commands[0] = "cat"; commands[1] = _files[i]; - string memory fileContents = string(vm.ffi(commands)); + string memory fileContents = string(Process.run(commands)); // Grab the contract name commands = new string[](3); commands[0] = "bash"; commands[1] = "-c"; commands[2] = string.concat("echo \"", _files[i], "\"| sed -E \'s|src/.*/(.+)\\.sol|\\1|\'"); - string memory contractName = string(vm.ffi(commands)); + string memory contractName = string(Process.run(commands)); commands[2] = "forge config --json | jq -r .out"; - string memory artifactsDir = string(vm.ffi(commands)); + string memory artifactsDir = string(Process.run(commands)); // Handle the case where there are multiple artifacts for a contract. This happens // when the same contract is compiled with multiple compiler versions. @@ -44,7 +45,7 @@ contract SemverLock is Script { commands[2] = string.concat( "ls -1 --color=never ", contractArtifactDir, " | jq -R -s -c 'split(\"\n\") | map(select(length > 0))'" ); - string memory artifactFiles = string(vm.ffi(commands)); + string memory artifactFiles = string(Process.run(commands)); string[] memory files = stdJson.readStringArray(artifactFiles, ""); require(files.length > 0, string.concat("No artifacts found for ", contractName)); diff --git a/packages/contracts-bedrock/scripts/autogen/generate-invariant-docs.ts b/packages/contracts-bedrock/scripts/autogen/generate-invariant-docs.ts deleted file mode 100644 index 2c01e2617ef4..000000000000 --- a/packages/contracts-bedrock/scripts/autogen/generate-invariant-docs.ts +++ /dev/null @@ -1,170 +0,0 @@ -import fs from 'fs' -import path from 'path' - -const ROOT_DIR = path.join(__dirname, '..', '..') -const BASE_INVARIANTS_DIR = path.join(ROOT_DIR, 'test', 'invariants') -const BASE_DOCS_DIR = path.join(ROOT_DIR, 'invariant-docs') -const BASE_INVARIANT_GH_URL = '../test/invariants/' -const NATSPEC_INV = '@custom:invariant' - -// Represents an invariant test contract -type Contract = { - name: string - fileName: string - docs: InvariantDoc[] -} - -// Represents the documentation of an invariant -type InvariantDoc = { - header?: string - desc?: string - lineNo?: number -} - -const writtenFiles = [] - -// Lazy-parses all test files in the `test/invariants` directory -// to generate documentation on all invariant tests. -const docGen = (dir: string): void => { - // Grab all files within the invariants test dir - const files = fs.readdirSync(dir) - - // Array to store all found invariant documentation comments. - const docs: Contract[] = [] - - for (const fileName of files) { - // Read the contents of the invariant test file. - const fileContents = fs.readFileSync(path.join(dir, fileName)).toString() - - // Split the file into individual lines and trim whitespace. - const lines = fileContents.split('\n').map((line: string) => line.trim()) - - // Create an object to store all invariant test docs for the current contract - const name = fileName.replace('.t.sol', '') - const contract: Contract = { name, fileName, docs: [] } - - let currentDoc: InvariantDoc - - // Loop through all lines to find comments. - for (let i = 0; i < lines.length; i++) { - let line = lines[i] - - // We have an invariant doc - if (line.startsWith(`/// ${NATSPEC_INV}`)) { - // Assign the header of the invariant doc. - // TODO: Handle ambiguous case for `INVARIANT: ` prefix. - currentDoc = { - header: line.replace(`/// ${NATSPEC_INV}`, '').trim(), - desc: '', - } - - // If the header is multi-line, continue appending to the `currentDoc`'s header. - line = lines[++i] - while (line.startsWith(`///`) && line.trim() !== '///') { - currentDoc.header += ` ${line.replace(`///`, '').trim()}` - line = lines[++i] - } - - // Process the description - while ((line = lines[++i]).startsWith('///')) { - line = line.replace('///', '').trim() - - // If the line has any contents, insert it into the desc. - // Otherwise, consider it a linebreak. - currentDoc.desc += line.length > 0 ? `${line} ` : '\n' - } - - // Set the line number of the test - currentDoc.lineNo = i + 1 - - // Add the doc to the contract - contract.docs.push(currentDoc) - } - } - - // Add the contract to the array of docs - docs.push(contract) - } - - for (const contract of docs) { - const fileName = path.join(BASE_DOCS_DIR, `${contract.name}.md`) - const alreadyWritten = writtenFiles.includes(fileName) - - // If the file has already been written, append the extra docs to the end. - // Otherwise, write the file from scratch. - fs.writeFileSync( - fileName, - alreadyWritten - ? `${fs.readFileSync(fileName)}\n${renderContractDoc(contract, false)}` - : renderContractDoc(contract, true) - ) - - // If the file was just written for the first time, add it to the list of written files. - if (!alreadyWritten) { - writtenFiles.push(fileName) - } - } - - console.log( - `Generated invariant test documentation for:\n - ${ - docs.length - } contracts\n - ${docs.reduce( - (acc: number, contract: Contract) => acc + contract.docs.length, - 0 - )} invariant tests\nsuccessfully!` - ) -} - -// Generate a table of contents for all invariant docs and place it in the README. -const tocGen = (): void => { - const autoTOCPrefix = '<!-- START autoTOC -->\n' - const autoTOCPostfix = '<!-- END autoTOC -->\n' - - // Grab the name of all markdown files in `BASE_DOCS_DIR` except for `README.md`. - const files = fs - .readdirSync(BASE_DOCS_DIR) - .filter((fileName: string) => fileName !== 'README.md') - - // Generate a table of contents section. - const tocList = files - .map( - (fileName: string) => `- [${fileName.replace('.md', '')}](./${fileName})` - ) - .join('\n') - const toc = `${autoTOCPrefix}\n## Table of Contents\n${tocList}\n${autoTOCPostfix}` - - // Write the table of contents to the README. - const readmeContents = fs - .readFileSync(path.join(BASE_DOCS_DIR, 'README.md')) - .toString() - const above = readmeContents.split(autoTOCPrefix)[0] - const below = readmeContents.split(autoTOCPostfix)[1] - fs.writeFileSync( - path.join(BASE_DOCS_DIR, 'README.md'), - `${above}${toc}${below}` - ) -} - -// Render a `Contract` object into valid markdown. -const renderContractDoc = (contract: Contract, header: boolean): string => { - const _header = header ? `# \`${contract.name}\` Invariants\n` : '' - const docs = contract.docs - .map((doc: InvariantDoc) => { - const line = `${contract.fileName}#L${doc.lineNo}` - return `## ${doc.header}\n**Test:** [\`${line}\`](${BASE_INVARIANT_GH_URL}${line})\n\n${doc.desc}` - }) - .join('\n\n') - return `${_header}\n${docs}` -} - -// Generate the docs - -// Forge -console.log('Generating docs for forge invariants...') -docGen(BASE_INVARIANTS_DIR) - -// New line -console.log() - -// Generate an updated table of contents -tocGen() diff --git a/packages/contracts-bedrock/scripts/autogen/generate-snapshots.ts b/packages/contracts-bedrock/scripts/autogen/generate-snapshots.ts deleted file mode 100644 index fcfc59b89950..000000000000 --- a/packages/contracts-bedrock/scripts/autogen/generate-snapshots.ts +++ /dev/null @@ -1,163 +0,0 @@ -import fs from 'fs' -import path from 'path' - -const root = path.join(__dirname, '..', '..') -const outdir = process.argv[2] || path.join(root, 'snapshots') -const forgeArtifactsDir = path.join(root, 'forge-artifacts') - -const getAllContractsSources = (): Array<string> => { - const paths = [] - const readFilesRecursively = (dir: string) => { - const files = fs.readdirSync(dir) - - for (const file of files) { - const filePath = path.join(dir, file) - const fileStat = fs.statSync(filePath) - - if (fileStat.isDirectory()) { - readFilesRecursively(filePath) - } else { - paths.push(filePath) - } - } - } - readFilesRecursively(path.join(root, 'src')) - - return paths - .filter((x) => x.endsWith('.sol')) - .map((p: string) => path.basename(p)) - .sort() -} - -type ForgeArtifact = { - abi: object - ast: { - nodeType: string - nodes: any[] - } - storageLayout: { - storage: [{ type: string; label: string; offset: number; slot: number }] - types: { [key: string]: { label: string; numberOfBytes: number } } - } - bytecode: { - object: string - } -} - -type AbiSpecStorageLayoutEntry = { - label: string - slot: number - offset: number - bytes: number - type: string -} -const sortKeys = (obj: any) => { - if (typeof obj !== 'object' || obj === null) { - return obj - } - return Object.keys(obj) - .sort() - .reduce( - (acc, key) => { - acc[key] = sortKeys(obj[key]) - return acc - }, - Array.isArray(obj) ? [] : {} - ) -} - -// ContractName.0.9.8.json -> ContractName.sol -// ContractName.json -> ContractName.sol -const parseArtifactName = (artifactVersionFile: string): string => { - const match = artifactVersionFile.match(/(.*?)\.([0-9]+\.[0-9]+\.[0-9]+)?/) - if (!match) { - throw new Error(`Invalid artifact file name: ${artifactVersionFile}`) - } - return match[1] -} - -const main = async () => { - console.log(`writing abi and storage layout snapshots to ${outdir}`) - - 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 }) - - const contractSources = getAllContractsSources() - const knownAbis = {} - - for (const contractFile of contractSources) { - const contractArtifacts = path.join(forgeArtifactsDir, contractFile) - for (const name of fs.readdirSync(contractArtifacts)) { - const data = fs.readFileSync(path.join(contractArtifacts, name)) - const artifact: ForgeArtifact = JSON.parse(data.toString()) - - 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' && - node.name === contractName && - node.contractKind === 'contract' && - (node.abstract === undefined || // solc < 0.6 doesn't have explicit abstract contracts - node.abstract === false) - ) - }) - if (!isContract) { - console.log(`ignoring library/interface ${contractName}`) - continue - } - - const storageLayout: AbiSpecStorageLayoutEntry[] = [] - for (const storageEntry of artifact.storageLayout.storage) { - // convert ast-based type to solidity type - const typ = artifact.storageLayout.types[storageEntry.type] - if (typ === undefined) { - throw new Error( - `undefined type for ${contractName}:${storageEntry.label}` - ) - } - storageLayout.push({ - label: storageEntry.label, - bytes: typ.numberOfBytes, - offset: storageEntry.offset, - slot: storageEntry.slot, - type: typ.label, - }) - } - - if (knownAbis[contractName] === undefined) { - knownAbis[contractName] = artifact.abi - } else if ( - JSON.stringify(knownAbis[contractName]) !== JSON.stringify(artifact.abi) - ) { - throw Error( - `detected multiple artifact versions with different ABIs for ${contractFile}` - ) - } else { - console.log(`detected multiple artifacts for ${contractName}`) - } - - // Sort snapshots for easier manual inspection - fs.writeFileSync( - `${abiDir}/${contractName}.json`, - JSON.stringify(sortKeys(artifact.abi), null, 2) - ) - fs.writeFileSync( - `${storageLayoutDir}/${contractName}.json`, - JSON.stringify(sortKeys(storageLayout), null, 2) - ) - } - } -} - -main() diff --git a/packages/contracts-bedrock/scripts/autogen/generate-snapshots/main.go b/packages/contracts-bedrock/scripts/autogen/generate-snapshots/main.go new file mode 100644 index 000000000000..c446af7a0c80 --- /dev/null +++ b/packages/contracts-bedrock/scripts/autogen/generate-snapshots/main.go @@ -0,0 +1,251 @@ +package main + +import ( + "bytes" + "encoding/json" + "flag" + "fmt" + "os" + "path/filepath" + "regexp" + "sort" +) + +type ForgeArtifact struct { + // ABI is a nested JSON data structure, including some objects/maps. + // We declare it as interface, and not raw-message, such that Go decodes into map[string]interface{} + // where possible. The JSON-encoder will then sort the keys (default Go JSON behavior on maps), + // to reproduce the sortKeys(abi) result of the legacy Typescript version of the snapshort-generator. + ABI interface{} `json:"abi"` + Ast *struct { + NodeType string `json:"nodeType"` + Nodes []struct { + NodeType string `json:"nodeType"` + Name string `json:"name"` + ContractKind string `json:"contractKind"` + Abstract bool `json:"abstract"` + } `json:"nodes"` + } `json:"ast"` + StorageLayout struct { + Storage []struct { + Type string `json:"type"` + Label json.RawMessage `json:"label"` + Offset json.RawMessage `json:"offset"` + Slot json.RawMessage `json:"slot"` + } `json:"storage"` + Types map[string]struct { + Label string `json:"label"` + NumberOfBytes json.RawMessage `json:"numberOfBytes"` + } `json:"types"` + } `json:"storageLayout"` + Bytecode struct { + Object string `json:"object"` + } `json:"bytecode"` +} + +type AbiSpecStorageLayoutEntry struct { + Bytes json.RawMessage `json:"bytes"` + Label json.RawMessage `json:"label"` + Offset json.RawMessage `json:"offset"` + Slot json.RawMessage `json:"slot"` + Type string `json:"type"` +} + +func main() { + flag.Parse() + if flag.NArg() != 1 { + fmt.Println("Expected path of contracts-bedrock as CLI argument") + os.Exit(1) + } + rootDir := flag.Arg(0) + err := generateSnapshots(rootDir) + if err != nil { + fmt.Printf("Failed to generate snapshots: %v\n", err) + os.Exit(1) + } +} + +func generateSnapshots(rootDir string) error { + + forgeArtifactsDir := filepath.Join(rootDir, "forge-artifacts") + srcDir := filepath.Join(rootDir, "src") + outDir := filepath.Join(rootDir, "snapshots") + + storageLayoutDir := filepath.Join(outDir, "storageLayout") + abiDir := filepath.Join(outDir, "abi") + + fmt.Printf("writing abi and storage layout snapshots to %s\n", outDir) + + // Clean and recreate directories + if err := os.RemoveAll(storageLayoutDir); err != nil { + return fmt.Errorf("failed to remove storage layout dir: %w", err) + } + if err := os.RemoveAll(abiDir); err != nil { + return fmt.Errorf("failed to remove ABI dir: %w", err) + } + if err := os.MkdirAll(storageLayoutDir, os.ModePerm); err != nil { + return fmt.Errorf("failed to create storage layout dir: %w", err) + } + if err := os.MkdirAll(abiDir, os.ModePerm); err != nil { + return fmt.Errorf("failed to create ABI dir: %w", err) + } + + contractSources, err := getAllContractsSources(srcDir) + if err != nil { + return fmt.Errorf("failed to retrieve contract sources: %w", err) + } + + knownAbis := make(map[string]interface{}) + + for _, contractFile := range contractSources { + contractArtifacts := filepath.Join(forgeArtifactsDir, contractFile) + files, err := os.ReadDir(contractArtifacts) + if err != nil { + return fmt.Errorf("failed to scan contract artifacts of %q: %w", contractFile, err) + } + + for _, file := range files { + artifactPath := filepath.Join(contractArtifacts, file.Name()) + data, err := os.ReadFile(artifactPath) + if err != nil { + return fmt.Errorf("failed to read artifact %q: %w", artifactPath, err) + } + var artifact ForgeArtifact + if err := json.Unmarshal(data, &artifact); err != nil { + return fmt.Errorf("failed to decode artifact %q: %w", artifactPath, err) + } + + contractName, err := parseArtifactName(file.Name()) + if err != nil { + return fmt.Errorf("failed to parse artifact name %q: %w", file.Name(), err) + } + + // HACK: This is a hack to ignore libraries and abstract contracts. Not robust against changes to solc's internal ast repr + if artifact.Ast == nil { + return fmt.Errorf("ast isn't present in forge-artifacts. Did you run forge build with `--ast`? Artifact: %s", artifactPath) + } + // Check if the artifact is a contract + isContract := false + for _, node := range artifact.Ast.Nodes { + if node.NodeType == "ContractDefinition" && + node.Name == contractName && + node.ContractKind == "contract" && + !node.Abstract { + isContract = true + break + } + } + if !isContract { + fmt.Printf("ignoring library/interface %s\n", contractName) + continue + } + + storageLayout := make([]AbiSpecStorageLayoutEntry, 0, len(artifact.StorageLayout.Storage)) + for _, storageEntry := range artifact.StorageLayout.Storage { + // convert ast-based type to solidity type + typ, ok := artifact.StorageLayout.Types[storageEntry.Type] + if !ok { + return fmt.Errorf("undefined type for %s:%s", contractName, storageEntry.Label) + } + storageLayout = append(storageLayout, AbiSpecStorageLayoutEntry{ + Label: storageEntry.Label, + Bytes: typ.NumberOfBytes, + Offset: storageEntry.Offset, + Slot: storageEntry.Slot, + Type: typ.Label, + }) + } + + if existingAbi, exists := knownAbis[contractName]; exists { + if !jsonEqual(existingAbi, artifact.ABI) { + return fmt.Errorf("detected multiple artifact versions with different ABIs for %s", contractFile) + } else { + fmt.Printf("detected multiple artifacts for %s\n", contractName) + } + } else { + knownAbis[contractName] = artifact.ABI + } + + // Sort and write snapshots + if err := writeJSON(filepath.Join(abiDir, contractName+".json"), artifact.ABI); err != nil { + return fmt.Errorf("failed to write ABI snapshot JSON of %q: %w", contractName, err) + } + + if err := writeJSON(filepath.Join(storageLayoutDir, contractName+".json"), storageLayout); err != nil { + return fmt.Errorf("failed to write storage layout snapshot JSON of %q: %w", contractName, err) + } + } + } + return nil +} + +func getAllContractsSources(srcDir string) ([]string, error) { + var paths []string + if err := readFilesRecursively(srcDir, &paths); err != nil { + return nil, fmt.Errorf("failed to retrieve files: %w", err) + } + + var solFiles []string + for _, p := range paths { + if filepath.Ext(p) == ".sol" { + solFiles = append(solFiles, filepath.Base(p)) + } + } + sort.Strings(solFiles) + return solFiles, nil +} + +func readFilesRecursively(dir string, paths *[]string) error { + files, err := os.ReadDir(dir) + if err != nil { + return err + } + + for _, file := range files { + filePath := filepath.Join(dir, file.Name()) + if file.IsDir() { + if err := readFilesRecursively(filePath, paths); err != nil { + return fmt.Errorf("failed to recurse into %q: %w", filePath, err) + } + } else { + *paths = append(*paths, filePath) + } + } + return nil +} + +// ContractName.0.9.8.json -> ContractName.sol +// ContractName.json -> ContractName.sol +func parseArtifactName(artifactVersionFile string) (string, error) { + re := regexp.MustCompile(`(.*?)\.([0-9]+\.[0-9]+\.[0-9]+)?`) + match := re.FindStringSubmatch(artifactVersionFile) + if len(match) < 2 { + return "", fmt.Errorf("invalid artifact file name: %q", artifactVersionFile) + } + return match[1], nil +} + +func writeJSON(filename string, data interface{}) error { + var out bytes.Buffer + enc := json.NewEncoder(&out) + enc.SetEscapeHTML(false) + enc.SetIndent("", " ") + err := enc.Encode(data) + if err != nil { + return fmt.Errorf("failed to encode data: %w", err) + } + jsonData := out.Bytes() + if len(jsonData) > 0 && jsonData[len(jsonData)-1] == '\n' { // strip newline + jsonData = jsonData[:len(jsonData)-1] + } + if err := os.WriteFile(filename, jsonData, 0644); err != nil { + return fmt.Errorf("failed to write file: %w", err) + } + return nil +} + +func jsonEqual(a, b interface{}) bool { + jsonA, errA := json.Marshal(a) + jsonB, errB := json.Marshal(b) + return errA == nil && errB == nil && string(jsonA) == string(jsonB) +} diff --git a/packages/contracts-bedrock/scripts/checks/check-foundry-install.sh b/packages/contracts-bedrock/scripts/checks/check-foundry-install.sh index e7edc7db270e..ccd337e958e7 100755 --- a/packages/contracts-bedrock/scripts/checks/check-foundry-install.sh +++ b/packages/contracts-bedrock/scripts/checks/check-foundry-install.sh @@ -8,7 +8,7 @@ VERSIONS_FILE="${MONOREPO_BASE}/versions.json" if ! command -v forge &> /dev/null then # shellcheck disable=SC2006 - echo "Is Foundry not installed? Consider installing via pnpm install:foundry" >&2 + echo "Is Foundry not installed? Consider installing via just install-foundry" >&2 exit 1 fi @@ -34,5 +34,5 @@ if [ "$INSTALLED_VERSION" = "$EXPECTED_VERSION" ]; then else echo "Mismatch between installed Foundry version ($INSTALLED_VERSION) and expected version ($EXPECTED_VERSION)." echo "Your version of Foundry may either not be up to date, or it could be a later version." - echo "Running pnpm update:foundry will install the expected version." + echo "Running just update-foundry will install the expected version." fi diff --git a/packages/contracts-bedrock/scripts/checks/check-interfaces.sh b/packages/contracts-bedrock/scripts/checks/check-interfaces.sh new file mode 100755 index 000000000000..ed2c8e798eb1 --- /dev/null +++ b/packages/contracts-bedrock/scripts/checks/check-interfaces.sh @@ -0,0 +1,249 @@ +#!/usr/bin/env bash +set -euo pipefail + +# This script checks for ABI consistency between interfaces and their corresponding contracts. +# It compares the ABIs of interfaces (files starting with 'I') with their implementation contracts, +# excluding certain predefined files. Constructors are expected to be represented in interfaces by a +# pseudo-constructor function `__constructor__(...)` with arguments the same as the contract's constructor. +# The script reports any differences found and exits with an error if inconsistencies are detected. +# NOTE: Script is fast enough but could be parallelized if necessary. + +# Parse flags +no_diff=false +if [[ "${1:-}" == "--no-diff" ]]; then + no_diff=true +fi + +# Grab the directory of the contracts-bedrock package +SCRIPT_DIR=$( cd -- "$( dirname -- "${BASH_SOURCE[0]}" )" &> /dev/null && pwd ) +CONTRACTS_BASE=$(dirname "$(dirname "$SCRIPT_DIR")") + +# Define contracts that should be excluded from the check +EXCLUDE_CONTRACTS=( + # External dependencies + "IERC20" + "IERC721" + "IERC721Enumerable" + "IERC721Upgradeable" + "IERC721Metadata" + "IERC165" + "IERC165Upgradeable" + "ERC721TokenReceiver" + "ERC1155TokenReceiver" + "ERC777TokensRecipient" + "Guard" + "IProxy" + "Vm" + "VmSafe" + "IMulticall3" + "IERC721TokenReceiver" + "IProxyCreationCallback" + "IBeacon" + + # EAS + "IEAS" + "ISchemaResolver" + "ISchemaRegistry" + + # Kontrol + "KontrolCheatsBase" + + # TODO: Interfaces that need to be fixed + "IOptimismSuperchainERC20" + "IOptimismMintableERC721" + "IOptimismMintableERC20" + "ILegacyMintableERC20" + "IInitializable" + "IPreimageOracle" + "ICrossL2Inbox" + "IL2ToL2CrossDomainMessenger" + "MintableAndBurnable" + "IWETH" + "IDelayedWETH" + "IResolvedDelegateProxy" + + # TODO: Kontrol interfaces that need to be removed + "IL1ERC721Bridge" + "IL1StandardBridge" + "IL1CrossDomainMessenger" + "ISuperchainConfig" + "IOptimismPortal" +) + +# Find all JSON files in the forge-artifacts folder +JSON_FILES=$(find "$CONTRACTS_BASE/forge-artifacts" -type f -name "*.json") + +# Initialize a flag to track if any issues are detected +issues_detected=false + +# Create a temporary file to store files that have already been reported +REPORTED_INTERFACES_FILE=$(mktemp) + +# Clean up the temporary file on exit +cleanup() { + rm -f "$REPORTED_INTERFACES_FILE" +} + +# Trap exit and error signals and call cleanup function +trap cleanup EXIT ERR + +# Check if a contract is excluded +is_excluded() { + for exclude in "${EXCLUDE_CONTRACTS[@]}"; do + if [[ "$exclude" == "$1" ]]; then + return 0 + fi + done + return 1 +} + +# Iterate over all JSON files +for interface_file in $JSON_FILES; do + # Grab the contract name from the file name + contract_name=$(basename "$interface_file" .json | cut -d '.' -f 1) + + # Extract all contract definitions in a single pass + contract_definitions=$(jq -r '.ast.nodes[] | select(.nodeType == "ContractDefinition") | "\(.contractKind),\(.name)"' "$interface_file") + + # Continue if no contract definitions are found + # Can happen in Solidity files that don't declare any contracts/interfaces + if [ -z "$contract_definitions" ]; then + continue + fi + + # Iterate over the found contract definitions and figure out which one + # matches the file name. We do this so that we can figure out if this is an + # interface or a contract based on the contract kind. + found=false + contract_temp="" + contract_kind="" + for definition in $contract_definitions; do + IFS=',' read -r contract_kind contract_temp <<< "$definition" + if [[ "$contract_name" == "$contract_temp" ]]; then + found=true + break + fi + done + + # Continue if no matching contract name is found. Can happen in Solidity + # files where no contracts/interfaces are defined with the same name as the + # file. Still OK because a separate artifact *will* be generated for the + # specific contract/interface. + if [ "$found" = false ]; then + continue + fi + + # If contract kind is not "interface", skip the file + if [ "$contract_kind" != "interface" ]; then + continue + fi + + # If contract name does not start with an "I", throw an error + if [[ "$contract_name" != I* ]]; then + if ! grep -q "^$contract_name$" "$REPORTED_INTERFACES_FILE"; then + echo "$contract_name" >> "$REPORTED_INTERFACES_FILE" + if ! is_excluded "$contract_name"; then + echo "Issue found in ABI for interface $contract_name from file $interface_file." + echo "Interface $contract_name does not start with 'I'." + issues_detected=true + fi + fi + continue + fi + + # Extract contract semver + contract_semver=$(jq -r '.ast.nodes[] | select(.nodeType == "PragmaDirective") | .literals | join("")' "$interface_file") + + # If semver is not exactly "solidity^0.8.0", throw an error + if [ "$contract_semver" != "solidity^0.8.0" ]; then + if ! grep -q "^$contract_name$" "$REPORTED_INTERFACES_FILE"; then + echo "$contract_name" >> "$REPORTED_INTERFACES_FILE" + if ! is_excluded "$contract_name"; then + echo "Issue found in ABI for interface $contract_name from file $interface_file." + echo "Interface $contract_name does not have correct compiler version (MUST be exactly solidity ^0.8.0)." + issues_detected=true + fi + fi + continue + fi + + # Construct the corresponding contract name by removing the leading "I" + contract_basename=${contract_name:1} + corresponding_contract_file="$CONTRACTS_BASE/forge-artifacts/$contract_basename.sol/$contract_basename.json" + + # Skip the file if the corresponding contract file does not exist + if [ ! -f "$corresponding_contract_file" ]; then + continue + fi + + # Extract and compare ABIs excluding constructors + interface_abi=$(jq '[.abi[]]' < "$interface_file") + contract_abi=$(jq '[.abi[]]' < "$corresponding_contract_file") + + # Function to normalize ABI by replacing interface name with contract name. + # Base contracts aren't allowed to inherit from their interfaces in order + # to guarantee a 1:1 match between interfaces and contracts. This means + # that the interface will redefine types in the base contract. We normalize + # the ABI as if the interface and contract are the same name. + normalize_abi() { + # Here we just remove the leading "I" from any contract, enum, or + # struct type. It's not beautiful but it's good enough for now. It + # would miss certain edge cases like if an interface really is using + # the contract type instead of the interface type but that's unlikely + # to happen in practice and should be an easy fix if it does. + local abi="$1" + + # Remove the leading "I" from types. + abi="${abi//\"internalType\": \"contract I/\"internalType\": \"contract }" + abi="${abi//\"internalType\": \"enum I/\"internalType\": \"enum }" + abi="${abi//\"internalType\": \"struct I/\"internalType\": \"struct }" + + # Handle translating pseudo-constructors. + abi=$(echo "$abi" | jq 'map(if .type == "function" and .name == "__constructor__" then .type = "constructor" | del(.name) | del(.outputs) else . end)') + + echo "$abi" + } + + # Normalize the ABIs + normalized_interface_abi=$(normalize_abi "$interface_abi") + normalized_contract_abi=$(normalize_abi "$contract_abi") + + # Use jq to compare the ABIs + if ! diff_result=$(diff -u <(echo "$normalized_interface_abi" | jq 'sort') <(echo "$normalized_contract_abi" | jq 'sort')); then + if ! grep -q "^$contract_name$" "$REPORTED_INTERFACES_FILE"; then + echo "$contract_name" >> "$REPORTED_INTERFACES_FILE" + if ! is_excluded "$contract_name"; then + echo "Issue found in ABI for interface $contract_name from file $interface_file." + echo "Differences found in ABI between interface $contract_name and actual contract $contract_basename." + if [ "$no_diff" = false ]; then + echo "$diff_result" + fi + issues_detected=true + fi + fi + continue + fi +done + +# Check for unnecessary exclusions +for exclude_item in "${EXCLUDE_CONTRACTS[@]}"; do + if ! grep -q "^$exclude_item$" "$REPORTED_INTERFACES_FILE"; then + echo "Warning: $exclude_item is in the exclude list but WAS NOT reported as an issue. It" + echo "may be unnecessary in the EXCLUDE_CONTRACTS list, but you MUST verify this before" + echo "removing it by performing a clean and full build before re-running this script." + fi +done + +# Fail the script if any issues were detected +if [ "$issues_detected" = true ]; then + echo "Issues were detected while validating interface files." + echo "If the interface is an external dependency or should otherwise be excluded from this" + echo "check, add the interface name to the EXCLUDE_CONTRACTS list in the script. This will prevent" + echo "the script from comparing it against a corresponding contract." + echo "IMPORTANT: Interface files are NOT yet generated automatically. You must fix any" + echo "listed discrepancies manually by updating the specified interface file. Automated" + echo "interface generation is dependent on a few Forge bug fixes." + exit 1 +else + exit 0 +fi diff --git a/packages/contracts-bedrock/scripts/checks/check-kontrol-deployment.sh b/packages/contracts-bedrock/scripts/checks/check-kontrol-deployment.sh new file mode 100755 index 000000000000..bfa78ae35a70 --- /dev/null +++ b/packages/contracts-bedrock/scripts/checks/check-kontrol-deployment.sh @@ -0,0 +1,27 @@ +#!/usr/bin/env bash +set -euo pipefail + +# This script checks if the KontrolDeployment.sol file has changed. Removal of +# the DeploymentSummary.t.sol test file means that our primary risk vector for +# KontrolDeployment.sol is an *accidental* change to the file. Changes must +# therefore be explicitly acknowledged by bumping the hash below. + +# Get relevant directories +SCRIPT_DIR=$( cd -- "$( dirname -- "${BASH_SOURCE[0]}" )" &> /dev/null && pwd ) +CONTRACTS_BASE=$(dirname "$(dirname "$SCRIPT_DIR")") + +# Generate the SHA-512 hash using OpenSSL (very portable) +generated_hash=$(openssl dgst -sha512 "${CONTRACTS_BASE}/test/kontrol/deployment/KontrolDeployment.sol" | awk '{print $2}') + +# Define the known hash +known_hash="1664d9c22266b55b43086fa03c0e9d0447b092abc86cba79b86ad36c49167062c2b58a78757a20a5fd257d307599edce8f8f604cc6b2ee86715144015a8c977d" + +# Compare the generated hash with the known hash +if [ "$generated_hash" = "$known_hash" ]; then + echo "KontrolDeployment.sol matches the known hash." +else + echo "KontrolDeployment.sol does not match the known hash. Please update the known hash." + echo "Old hash: $known_hash" + echo "New hash: $generated_hash" + exit 1 +fi diff --git a/packages/contracts-bedrock/scripts/checks/check-semver-diff.sh b/packages/contracts-bedrock/scripts/checks/check-semver-diff.sh new file mode 100755 index 000000000000..15a3ebb50da2 --- /dev/null +++ b/packages/contracts-bedrock/scripts/checks/check-semver-diff.sh @@ -0,0 +1,88 @@ +#!/usr/bin/env bash +set -euo pipefail + +# Grab the directory of the contracts-bedrock package. +SCRIPT_DIR=$( cd -- "$( dirname -- "${BASH_SOURCE[0]}" )" &> /dev/null && pwd ) + +# Load semver-utils. +# shellcheck source=/dev/null +source "$SCRIPT_DIR/utils/semver-utils.sh" + +# Path to semver-lock.json. +SEMVER_LOCK="semver-lock.json" + +# Create a temporary directory. +temp_dir=$(mktemp -d) +trap 'rm -rf "$temp_dir"' EXIT + +# Exit early if semver-lock.json has not changed. +if ! git diff origin/develop...HEAD --name-only | grep -q "$SEMVER_LOCK"; then + echo "No changes detected in semver-lock.json" + exit 0 +fi + +# Get the upstream semver-lock.json. +git show origin/develop:packages/contracts-bedrock/semver-lock.json > "$temp_dir/upstream_semver_lock.json" + +# Copy the local semver-lock.json. +cp "$SEMVER_LOCK" "$temp_dir/local_semver_lock.json" + +# Get the changed contracts. +changed_contracts=$(jq -r ' + def changes: + to_entries as $local + | input as $upstream + | $local | map( + select( + .key as $key + | .value != $upstream[$key] + ) + ) | map(.key); + changes[] +' "$temp_dir/local_semver_lock.json" "$temp_dir/upstream_semver_lock.json") + +# Flag to track if any errors are detected. +has_errors=false + +# Check each changed contract for a semver version change. +for contract in $changed_contracts; do + # Check if the contract file exists. + if [ ! -f "$contract" ]; then + echo "❌ Error: Contract file $contract not found" + has_errors=true + continue + fi + + # Extract the old and new source files. + old_source_file="$temp_dir/old_${contract##*/}" + new_source_file="$temp_dir/new_${contract##*/}" + git show origin/develop:packages/contracts-bedrock/"$contract" > "$old_source_file" 2>/dev/null || true + cp "$contract" "$new_source_file" + + # Extract the old and new versions. + old_version=$(extract_version "$old_source_file" 2>/dev/null || echo "N/A") + new_version=$(extract_version "$new_source_file" 2>/dev/null || echo "N/A") + + # Check if the versions were extracted successfully. + if [ "$old_version" = "N/A" ] || [ "$new_version" = "N/A" ]; then + echo "❌ Error: unable to extract version for $contract" + echo " this is probably a bug in check-semver-diff.sh" + echo " please report or fix the issue if possible" + has_errors=true + fi + + # Check if the version changed. + if [ "$old_version" = "$new_version" ]; then + echo "❌ Error: src/$contract has changes in semver-lock.json but no version change" + echo " Old version: $old_version" + echo " New version: $new_version" + has_errors=true + else + echo "✅ $contract: version changed from $old_version to $new_version" + fi +done + +# Exit with error if any issues were found. +if [ "$has_errors" = true ]; then + exit 1 +fi diff --git a/packages/contracts-bedrock/scripts/checks/check-semver-natspec-match.sh b/packages/contracts-bedrock/scripts/checks/check-semver-natspec-match.sh new file mode 100755 index 000000000000..de4de3f8497a --- /dev/null +++ b/packages/contracts-bedrock/scripts/checks/check-semver-natspec-match.sh @@ -0,0 +1,74 @@ +#!/usr/bin/env bash +set -euo pipefail + +# Grab the directory of the contracts-bedrock package +SCRIPT_DIR=$( cd -- "$( dirname -- "${BASH_SOURCE[0]}" )" &> /dev/null && pwd ) +CONTRACTS_BASE=$(dirname "$(dirname "$SCRIPT_DIR")") +ARTIFACTS_DIR="$CONTRACTS_BASE/forge-artifacts" +CONTRACTS_DIR="$CONTRACTS_BASE/src" + +# Load semver-utils +# shellcheck source=/dev/null +source "$SCRIPT_DIR/utils/semver-utils.sh" + +# Flag to track if any errors are detected +has_errors=false + +# Iterate through each artifact file +for artifact_file in "$ARTIFACTS_DIR"/**/*.json; do + # Get the contract name and find the corresponding source file + contract_name=$(basename "$artifact_file" .json) + contract_file=$(find "$CONTRACTS_DIR" -name "$contract_name.sol") + + # Try to extract version as a constant + raw_metadata=$(jq -r '.rawMetadata' "$artifact_file") + artifact_version=$(echo "$raw_metadata" | jq -r '.output.devdoc.stateVariables.version."custom:semver"') + + is_constant=true + if [ "$artifact_version" = "null" ]; then + # If not found as a constant, try to extract as a function + artifact_version=$(echo "$raw_metadata" | jq -r '.output.devdoc.methods."version()"."custom:semver"') + is_constant=false + fi + + # If @custom:semver is not found in either location, skip this file + if [ "$artifact_version" = "null" ]; then + continue + fi + + # If source file is not found, report an error + if [ -z "$contract_file" ]; then + echo "❌ $contract_name: Source file not found" + continue + fi + + # Extract version from source based on whether it's a constant or function + if [ "$is_constant" = true ]; then + source_version=$(extract_constant_version "$contract_file") + else + source_version=$(extract_function_version "$contract_file") + fi + + # If source version is not found, report an error + if [ "$source_version" = "" ]; then + echo "❌ Error: failed to find version string for $contract_name" + echo " this is probably a bug in check-contract-semver.sh" + echo " please report or fix the issue if possible" + has_errors=true + fi + + # Compare versions + if [ "$source_version" != "$artifact_version" ]; then + echo "❌ Error: $contract_name has different semver in code and devdoc" + echo " Code: $source_version" + echo " Devdoc: $artifact_version" + has_errors=true + else + echo "✅ $contract_name: code: $source_version, devdoc: $artifact_version" + fi +done + +# If any errors were detected, exit with a non-zero status +if [ "$has_errors" = true ]; then + exit 1 +fi diff --git a/packages/contracts-bedrock/scripts/checks/check-snapshots.sh b/packages/contracts-bedrock/scripts/checks/check-snapshots.sh index cc1ffabd3659..66a04dc331d4 100755 --- a/packages/contracts-bedrock/scripts/checks/check-snapshots.sh +++ b/packages/contracts-bedrock/scripts/checks/check-snapshots.sh @@ -1,13 +1,17 @@ #!/usr/bin/env bash - set -euo pipefail -# Generate the snapshots -pnpm snapshots +# Check for the --no-build flag +# Generate snapshots +if [ "$1" == "--no-build" ]; then + just snapshots-no-build +else + just snapshots +fi -# 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 +# Check if the generated `snapshots` files are different from the committed versions +if git diff --exit-code snapshots > /dev/null; then + [ -z "$(git ls-files --others --exclude-standard snapshots)" ] || exit 1 else - exit 1 + exit 1 fi diff --git a/packages/contracts-bedrock/scripts/checks/check-spacers.ts b/packages/contracts-bedrock/scripts/checks/check-spacers.ts deleted file mode 100644 index 8967618131d3..000000000000 --- a/packages/contracts-bedrock/scripts/checks/check-spacers.ts +++ /dev/null @@ -1,152 +0,0 @@ -import fs from 'fs' -import path from 'path' - -/** - * Directory path to the artifacts. - * Can be configured as the first argument to the script or - * defaults to the forge-artifacts directory. - */ -const directoryPath = - process.argv[2] || path.join(__dirname, '..', '..', 'forge-artifacts') - -/** - * Returns true if the contract should be skipped when inspecting its storage layout. - * This is useful for abstract contracts that are meant to be inherited. - * The two particular targets are: - * - CrossDomainMessengerLegacySpacer0 - * - CrossDomainMessengerLegacySpacer1 - */ -const skipped = (contractName: string): boolean => { - return contractName.includes('CrossDomainMessengerLegacySpacer') -} - -/** - * Parses out variable info from the variable structure in standard compiler json output. - * - * @param variable Variable structure from standard compiler json output. - * @returns Parsed variable info. - */ -const parseVariableInfo = ( - variable: any -): { - name: string - slot: number - offset: number - length: number -} => { - // Figure out the length of the variable. - let variableLength: number - if (variable.type.startsWith('t_mapping')) { - variableLength = 32 - } else if (variable.type.startsWith('t_uint')) { - variableLength = variable.type.match(/uint([0-9]+)/)?.[1] / 8 - } else if (variable.type.startsWith('t_bytes_')) { - variableLength = 32 - } else if (variable.type.startsWith('t_bytes')) { - variableLength = parseInt(variable.type.match(/bytes([0-9]+)/)?.[1], 10) - } else if (variable.type.startsWith('t_address')) { - variableLength = 20 - } else if (variable.type.startsWith('t_bool')) { - variableLength = 1 - } else if (variable.type.startsWith('t_array')) { - // Figure out the size of the type inside of the array - // and then multiply that by the length of the array. - // This does not support recursion multiple times for simplicity - const type = variable.type.match(/^t_array\((\w+)\)/)?.[1] - const info = parseVariableInfo({ - label: variable.label, - offset: variable.offset, - slot: variable.slot, - type, - }) - const size = variable.type.match(/^t_array\(\w+\)([0-9]+)/)?.[1] - variableLength = info.length * parseInt(size, 10) - } else { - throw new Error( - `${variable.label}: unsupported type ${variable.type}, add it to the script` - ) - } - - return { - name: variable.label, - slot: parseInt(variable.slot, 10), - offset: variable.offset, - length: variableLength, - } -} - -/** - * Main logic of the script - * - Ensures that all of the spacer variables are named correctly - */ -const main = async () => { - const paths = [] - - const readFilesRecursively = (dir: string) => { - const files = fs.readdirSync(dir) - - for (const file of files) { - const filePath = path.join(dir, file) - const fileStat = fs.statSync(filePath) - - if (fileStat.isDirectory()) { - readFilesRecursively(filePath) - } else { - paths.push(filePath) - } - } - } - - readFilesRecursively(directoryPath) - - for (const filePath of paths) { - if (filePath.includes('t.sol')) { - continue - } - const raw = fs.readFileSync(filePath, 'utf8').toString() - const artifact = JSON.parse(raw) - - // Handle contracts without storage - const storageLayout = artifact.storageLayout || {} - if (storageLayout.storage) { - for (const variable of storageLayout.storage) { - const fqn = variable.contract - // Skip some abstract contracts - if (skipped(fqn)) { - continue - } - - // Check that the spacers are all named correctly - if (variable.label.startsWith('spacer_')) { - const [, slot, offset, length] = variable.label.split('_') - const variableInfo = parseVariableInfo(variable) - - // Check that the slot is correct. - if (parseInt(slot, 10) !== variableInfo.slot) { - throw new Error( - `${fqn} ${variable.label} is in slot ${variable.slot} but should be in ${slot}` - ) - } - - // Check that the offset is correct. - if (parseInt(offset, 10) !== variableInfo.offset) { - throw new Error( - `${fqn} ${variable.label} is at offset ${variable.offset} but should be at ${offset}` - ) - } - - // Check that the length is correct. - if (parseInt(length, 10) !== variableInfo.length) { - throw new Error( - `${fqn} ${variable.label} is ${variableInfo.length} bytes long but should be ${length}` - ) - } - - console.log(`${fqn}.${variable.label} is valid`) - } - } - } - } -} - -main() diff --git a/packages/contracts-bedrock/scripts/checks/check-test-names.ts b/packages/contracts-bedrock/scripts/checks/check-test-names.ts deleted file mode 100644 index b3270b1e63c1..000000000000 --- a/packages/contracts-bedrock/scripts/checks/check-test-names.ts +++ /dev/null @@ -1,130 +0,0 @@ -import fs from 'fs' -import path from 'path' -import { execSync } from 'child_process' - -type Check = (parts: string[]) => boolean -type Checks = Array<{ - check: Check - error: string -}> - -/** - * Series of function name checks. - */ -const checks: Checks = [ - { - error: 'test name parts should be in camelCase', - check: (parts: string[]): boolean => { - return parts.every((part) => { - return part[0] === part[0].toLowerCase() - }) - }, - }, - { - error: - 'test names should have either 3 or 4 parts, each separated by underscores', - check: (parts: string[]): boolean => { - return parts.length === 3 || parts.length === 4 - }, - }, - { - error: 'test names should begin with "test", "testFuzz", or "testDiff"', - check: (parts: string[]): boolean => { - return ['test', 'testFuzz', 'testDiff'].includes(parts[0]) - }, - }, - { - error: - 'test names should end with either "succeeds", "reverts", "fails", "works" or "benchmark[_num]"', - check: (parts: string[]): boolean => { - return ( - ['succeeds', 'reverts', 'fails', 'benchmark', 'works'].includes( - parts[parts.length - 1] - ) || - (parts[parts.length - 2] === 'benchmark' && - !isNaN(parseInt(parts[parts.length - 1], 10))) - ) - }, - }, - { - error: - 'failure tests should have 4 parts, third part should indicate the reason for failure', - check: (parts: string[]): boolean => { - return ( - parts.length === 4 || - !['reverts', 'fails'].includes(parts[parts.length - 1]) - ) - }, - }, -] - -/** - * Script for checking that all test functions are named correctly. - */ -const main = async () => { - const result = execSync('forge config --json') - const config = JSON.parse(result.toString()) - const out = config.out || 'out' - - const paths = [] - - const readFilesRecursively = (dir: string) => { - const files = fs.readdirSync(dir) - - for (const file of files) { - const filePath = path.join(dir, file) - const fileStat = fs.statSync(filePath) - - if (fileStat.isDirectory()) { - readFilesRecursively(filePath) - } else { - paths.push(filePath) - } - } - } - - readFilesRecursively(out) - - console.log('Success:') - const errors: string[] = [] - - for (const filepath of paths) { - const artifact = JSON.parse(fs.readFileSync(filepath, 'utf8')) - - let isTest = false - for (const element of artifact.abi) { - if (element.name === 'IS_TEST') { - isTest = true - break - } - } - - if (isTest) { - let success = true - for (const element of artifact.abi) { - // Skip non-functions and functions that don't start with "test". - if (element.type !== 'function' || !element.name.startsWith('test')) { - continue - } - - // Check the rest. - for (const { check, error } of checks) { - if (!check(element.name.split('_'))) { - errors.push(`${filepath}#${element.name}: ${error}`) - success = false - } - } - } - if (success) { - console.log(` - ${path.parse(filepath).name}`) - } - } - } - - if (errors.length > 0) { - console.error(errors.join('\n')) - process.exit(1) - } -} - -main() diff --git a/packages/contracts-bedrock/scripts/checks/names/main.go b/packages/contracts-bedrock/scripts/checks/names/main.go new file mode 100644 index 000000000000..1a0be03f33f2 --- /dev/null +++ b/packages/contracts-bedrock/scripts/checks/names/main.go @@ -0,0 +1,164 @@ +package main + +import ( + "encoding/json" + "fmt" + "os" + "os/exec" + "path/filepath" + "strconv" + "strings" + "unicode" +) + +type Check func(parts []string) bool + +type CheckInfo struct { + check Check + error string +} + +var checks = []CheckInfo{ + { + error: "test name parts should be in camelCase", + check: func(parts []string) bool { + for _, part := range parts { + if len(part) > 0 && unicode.IsUpper(rune(part[0])) { + return false + } + } + return true + }, + }, + { + error: "test names should have either 3 or 4 parts, each separated by underscores", + check: func(parts []string) bool { + return len(parts) == 3 || len(parts) == 4 + }, + }, + { + error: "test names should begin with \"test\", \"testFuzz\", or \"testDiff\"", + check: func(parts []string) bool { + return parts[0] == "test" || parts[0] == "testFuzz" || parts[0] == "testDiff" + }, + }, + { + error: "test names should end with either \"succeeds\", \"reverts\", \"fails\", \"works\" or \"benchmark[_num]\"", + check: func(parts []string) bool { + last := parts[len(parts)-1] + if last == "succeeds" || last == "reverts" || last == "fails" || last == "works" { + return true + } + if len(parts) >= 2 && parts[len(parts)-2] == "benchmark" { + _, err := strconv.Atoi(last) + return err == nil + } + return last == "benchmark" + }, + }, + { + error: "failure tests should have 4 parts, third part should indicate the reason for failure", + check: func(parts []string) bool { + last := parts[len(parts)-1] + return len(parts) == 4 || (last != "reverts" && last != "fails") + }, + }, +} + +func main() { + cmd := exec.Command("forge", "config", "--json") + output, err := cmd.Output() + if err != nil { + fmt.Printf("Error executing forge config: %v\n", err) + os.Exit(1) + } + + var config map[string]interface{} + err = json.Unmarshal(output, &config) + if err != nil { + fmt.Printf("Error parsing forge config: %v\n", err) + os.Exit(1) + } + + outDir, ok := config["out"].(string) + if !ok { + outDir = "out" + } + + fmt.Println("Success:") + var errors []string + + err = filepath.Walk(outDir, func(path string, info os.FileInfo, err error) error { + if err != nil { + return err + } + + if info.IsDir() { + return nil + } + + data, err := os.ReadFile(path) + if err != nil { + return err + } + + var artifact map[string]interface{} + err = json.Unmarshal(data, &artifact) + if err != nil { + return nil // Skip files that are not valid JSON + } + + abi, ok := artifact["abi"].([]interface{}) + if !ok { + return nil + } + + isTest := false + for _, element := range abi { + if elem, ok := element.(map[string]interface{}); ok { + if elem["name"] == "IS_TEST" { + isTest = true + break + } + } + } + + if isTest { + success := true + for _, element := range abi { + if elem, ok := element.(map[string]interface{}); ok { + if elem["type"] == "function" { + name, ok := elem["name"].(string) + if !ok || !strings.HasPrefix(name, "test") { + continue + } + + parts := strings.Split(name, "_") + for _, check := range checks { + if !check.check(parts) { + errors = append(errors, fmt.Sprintf("%s#%s: %s", path, name, check.error)) + success = false + } + } + } + } + } + + if success { + fmt.Printf(" - %s\n", filepath.Base(path[:len(path)-len(filepath.Ext(path))])) + } + } + + return nil + }) + + if err != nil { + fmt.Printf("Error walking the path %q: %v\n", outDir, err) + os.Exit(1) + } + + if len(errors) > 0 { + fmt.Println(strings.Join(errors, "\n")) + os.Exit(1) + } +} diff --git a/packages/contracts-bedrock/scripts/checks/spacers/main.go b/packages/contracts-bedrock/scripts/checks/spacers/main.go new file mode 100644 index 000000000000..3360bda74d39 --- /dev/null +++ b/packages/contracts-bedrock/scripts/checks/spacers/main.go @@ -0,0 +1,176 @@ +package main + +import ( + "encoding/json" + "fmt" + "os" + "path/filepath" + "regexp" + "strconv" + "strings" +) + +// directoryPath is the path to the artifacts directory. +// It can be configured as the first argument to the script or +// defaults to the forge-artifacts directory. +var directoryPath string + +func init() { + if len(os.Args) > 1 { + directoryPath = os.Args[1] + } else { + currentDir, _ := os.Getwd() + directoryPath = filepath.Join(currentDir, "forge-artifacts") + } +} + +// skipped returns true if the contract should be skipped when inspecting its storage layout. +func skipped(contractName string) bool { + return strings.Contains(contractName, "CrossDomainMessengerLegacySpacer") +} + +// variableInfo represents the parsed variable information. +type variableInfo struct { + name string + slot int + offset int + length int +} + +// parseVariableInfo parses out variable info from the variable structure in standard compiler json output. +func parseVariableInfo(variable map[string]interface{}) (variableInfo, error) { + var info variableInfo + var err error + + info.name = variable["label"].(string) + info.slot, err = strconv.Atoi(variable["slot"].(string)) + if err != nil { + return info, err + } + info.offset = int(variable["offset"].(float64)) + + variableType := variable["type"].(string) + if strings.HasPrefix(variableType, "t_mapping") { + info.length = 32 + } else if strings.HasPrefix(variableType, "t_uint") { + re := regexp.MustCompile(`uint(\d+)`) + matches := re.FindStringSubmatch(variableType) + if len(matches) > 1 { + bitSize, _ := strconv.Atoi(matches[1]) + info.length = bitSize / 8 + } + } else if strings.HasPrefix(variableType, "t_bytes_") { + info.length = 32 + } else if strings.HasPrefix(variableType, "t_bytes") { + re := regexp.MustCompile(`bytes(\d+)`) + matches := re.FindStringSubmatch(variableType) + if len(matches) > 1 { + info.length, _ = strconv.Atoi(matches[1]) + } + } else if strings.HasPrefix(variableType, "t_address") { + info.length = 20 + } else if strings.HasPrefix(variableType, "t_bool") { + info.length = 1 + } else if strings.HasPrefix(variableType, "t_array") { + re := regexp.MustCompile(`^t_array\((\w+)\)(\d+)`) + matches := re.FindStringSubmatch(variableType) + if len(matches) > 2 { + innerType := matches[1] + size, _ := strconv.Atoi(matches[2]) + innerInfo, err := parseVariableInfo(map[string]interface{}{ + "label": variable["label"], + "offset": variable["offset"], + "slot": variable["slot"], + "type": innerType, + }) + if err != nil { + return info, err + } + info.length = innerInfo.length * size + } + } else { + return info, fmt.Errorf("%s: unsupported type %s, add it to the script", info.name, variableType) + } + + return info, nil +} + +func main() { + err := filepath.Walk(directoryPath, func(path string, info os.FileInfo, err error) error { + if err != nil { + return err + } + + if info.IsDir() || strings.Contains(path, "t.sol") { + return nil + } + + raw, err := os.ReadFile(path) + if err != nil { + return err + } + + var artifact map[string]interface{} + err = json.Unmarshal(raw, &artifact) + if err != nil { + return err + } + + storageLayout, ok := artifact["storageLayout"].(map[string]interface{}) + if !ok { + return nil + } + + storage, ok := storageLayout["storage"].([]interface{}) + if !ok { + return nil + } + + for _, v := range storage { + variable := v.(map[string]interface{}) + fqn := variable["contract"].(string) + + if skipped(fqn) { + continue + } + + label := variable["label"].(string) + if strings.HasPrefix(label, "spacer_") { + parts := strings.Split(label, "_") + if len(parts) != 4 { + return fmt.Errorf("invalid spacer name format: %s", label) + } + + slot, _ := strconv.Atoi(parts[1]) + offset, _ := strconv.Atoi(parts[2]) + length, _ := strconv.Atoi(parts[3]) + + variableInfo, err := parseVariableInfo(variable) + if err != nil { + return err + } + + if slot != variableInfo.slot { + return fmt.Errorf("%s %s is in slot %d but should be in %d", fqn, label, variableInfo.slot, slot) + } + + if offset != variableInfo.offset { + return fmt.Errorf("%s %s is at offset %d but should be at %d", fqn, label, variableInfo.offset, offset) + } + + if length != variableInfo.length { + return fmt.Errorf("%s %s is %d bytes long but should be %d", fqn, label, variableInfo.length, length) + } + + fmt.Printf("%s.%s is valid\n", fqn, label) + } + } + + return nil + }) + + if err != nil { + fmt.Printf("Error: %v\n", err) + os.Exit(1) + } +} diff --git a/packages/contracts-bedrock/scripts/checks/utils/semver-utils.sh b/packages/contracts-bedrock/scripts/checks/utils/semver-utils.sh new file mode 100755 index 000000000000..5f8d80156a45 --- /dev/null +++ b/packages/contracts-bedrock/scripts/checks/utils/semver-utils.sh @@ -0,0 +1,24 @@ +#!/usr/bin/env bash +set -euo pipefail + +# Function to extract version from contract source as a constant +extract_constant_version() { + local file=$1 + grep -o 'string.*constant.*version.*=.*"[^"]*"' "$file" | sed 's/.*"\([^"]*\)".*/\1/' || echo "" +} + +# Function to extract version from contract source as a function +extract_function_version() { + local file=$1 + sed -n '/function.*version()/,/return/p' "$file" | grep -o '"[^"]*"' | sed 's/"//g' || echo "" +} + +# Function to extract version from either constant or function +extract_version() { + local file=$1 + version=$(extract_constant_version "$file") + if [ -z "$version" ]; then + version=$(extract_function_version "$file") + fi + echo "$version" +} diff --git a/packages/contracts-bedrock/scripts/deploy.sh b/packages/contracts-bedrock/scripts/deploy.sh deleted file mode 100755 index bfbd436eb5fa..000000000000 --- a/packages/contracts-bedrock/scripts/deploy.sh +++ /dev/null @@ -1,15 +0,0 @@ -#!/usr/bin/env bash -set -euo pipefail - -verify_flag="" -if [ -n "${DEPLOY_VERIFY:-}" ]; then - verify_flag="--verify" -fi - -echo "> Deploying contracts" -forge script -vvv scripts/Deploy.s.sol:Deploy --rpc-url "$DEPLOY_ETH_RPC_URL" --broadcast --private-key "$DEPLOY_PRIVATE_KEY" $verify_flag - -if [ -n "${DEPLOY_GENERATE_HARDHAT_ARTIFACTS:-}" ]; then - echo "> Generating hardhat artifacts" - forge script -vvv scripts/Deploy.s.sol:Deploy --sig 'sync()' --rpc-url "$DEPLOY_ETH_RPC_URL" --broadcast --private-key "$DEPLOY_PRIVATE_KEY" -fi diff --git a/packages/contracts-bedrock/scripts/ChainAssertions.sol b/packages/contracts-bedrock/scripts/deploy/ChainAssertions.sol similarity index 82% rename from packages/contracts-bedrock/scripts/ChainAssertions.sol rename to packages/contracts-bedrock/scripts/deploy/ChainAssertions.sol index a99c14e9514b..7e5a9164f466 100644 --- a/packages/contracts-bedrock/scripts/ChainAssertions.sol +++ b/packages/contracts-bedrock/scripts/deploy/ChainAssertions.sol @@ -1,28 +1,37 @@ // SPDX-License-Identifier: MIT pragma solidity ^0.8.0; +// Testing +import { Vm } from "forge-std/Vm.sol"; +import { console2 as console } from "forge-std/console2.sol"; + +// Scripts +import { DeployConfig } from "scripts/deploy/DeployConfig.s.sol"; +import { Deployer } from "scripts/deploy/Deployer.sol"; +import { ISystemConfigV0 } from "scripts/interfaces/ISystemConfigV0.sol"; + +// Contracts import { ProxyAdmin } from "src/universal/ProxyAdmin.sol"; -import { ResourceMetering } from "src/L1/ResourceMetering.sol"; -import { DeployConfig } from "scripts/DeployConfig.s.sol"; -import { Deployer } from "scripts/Deployer.sol"; -import { SystemConfig } from "src/L1/SystemConfig.sol"; + +// Libraries import { Constants } from "src/libraries/Constants.sol"; -import { L1StandardBridge } from "src/L1/L1StandardBridge.sol"; -import { L2OutputOracle } from "src/L1/L2OutputOracle.sol"; -import { DisputeGameFactory } from "src/dispute/DisputeGameFactory.sol"; -import { DelayedWETH } from "src/dispute/weth/DelayedWETH.sol"; -import { ProtocolVersion, ProtocolVersions } from "src/L1/ProtocolVersions.sol"; -import { SuperchainConfig } from "src/L1/SuperchainConfig.sol"; -import { OptimismPortal } from "src/L1/OptimismPortal.sol"; -import { OptimismPortal2 } from "src/L1/OptimismPortal2.sol"; -import { L1CrossDomainMessenger } from "src/L1/L1CrossDomainMessenger.sol"; -import { OptimismMintableERC20Factory } from "src/universal/OptimismMintableERC20Factory.sol"; -import { L1ERC721Bridge } from "src/L1/L1ERC721Bridge.sol"; import { Predeploys } from "src/libraries/Predeploys.sol"; -import { Types } from "scripts/Types.sol"; -import { Vm } from "forge-std/Vm.sol"; -import { ISystemConfigV0 } from "scripts/interfaces/ISystemConfigV0.sol"; -import { console2 as console } from "forge-std/console2.sol"; +import { Types } from "scripts/libraries/Types.sol"; + +// Interfaces +import { IResourceMetering } from "src/L1/interfaces/IResourceMetering.sol"; +import { ISystemConfig } from "src/L1/interfaces/ISystemConfig.sol"; +import { IL2OutputOracle } from "src/L1/interfaces/IL2OutputOracle.sol"; +import { ISuperchainConfig } from "src/L1/interfaces/ISuperchainConfig.sol"; +import { IL1CrossDomainMessenger } from "src/L1/interfaces/IL1CrossDomainMessenger.sol"; +import { IOptimismPortal } from "src/L1/interfaces/IOptimismPortal.sol"; +import { IOptimismPortal2 } from "src/L1/interfaces/IOptimismPortal2.sol"; +import { IL1ERC721Bridge } from "src/L1/interfaces/IL1ERC721Bridge.sol"; +import { IL1StandardBridge } from "src/L1/interfaces/IL1StandardBridge.sol"; +import { ProtocolVersion, IProtocolVersions } from "src/L1/interfaces/IProtocolVersions.sol"; +import { IDisputeGameFactory } from "src/dispute/interfaces/IDisputeGameFactory.sol"; +import { IDelayedWETH } from "src/dispute/interfaces/IDelayedWETH.sol"; +import { IOptimismMintableERC20Factory } from "src/universal/interfaces/IOptimismMintableERC20Factory.sol"; library ChainAssertions { Vm internal constant vm = Vm(0x7109709ECfa91a80626fF3989D68f67F5b1DD12D); @@ -39,8 +48,8 @@ library ChainAssertions { view { console.log("Running post-deploy assertions"); - ResourceMetering.ResourceConfig memory rcfg = SystemConfig(_prox.SystemConfig).resourceConfig(); - ResourceMetering.ResourceConfig memory dflt = Constants.DEFAULT_RESOURCE_CONFIG(); + IResourceMetering.ResourceConfig memory rcfg = ISystemConfig(_prox.SystemConfig).resourceConfig(); + IResourceMetering.ResourceConfig memory dflt = Constants.DEFAULT_RESOURCE_CONFIG(); require(keccak256(abi.encode(rcfg)) == keccak256(abi.encode(dflt))); checkSystemConfig({ _contracts: _prox, _cfg: _cfg, _isProxy: true }); @@ -62,12 +71,12 @@ library ChainAssertions { /// @notice Asserts that the SystemConfig is setup correctly function checkSystemConfig(Types.ContractSet memory _contracts, DeployConfig _cfg, bool _isProxy) internal view { console.log("Running chain assertions on the SystemConfig"); - SystemConfig config = SystemConfig(_contracts.SystemConfig); + ISystemConfig config = ISystemConfig(_contracts.SystemConfig); // Check that the contract is initialized assertSlotValueIsOne({ _contractAddress: address(config), _slot: 0, _offset: 0 }); - ResourceMetering.ResourceConfig memory resourceConfig = config.resourceConfig(); + IResourceMetering.ResourceConfig memory resourceConfig = config.resourceConfig(); if (_isProxy) { require(config.owner() == _cfg.finalSystemOwner()); @@ -78,7 +87,7 @@ library ChainAssertions { require(config.unsafeBlockSigner() == _cfg.p2pSequencerAddress()); require(config.scalar() >> 248 == 1); // Check _config - ResourceMetering.ResourceConfig memory rconfig = Constants.DEFAULT_RESOURCE_CONFIG(); + IResourceMetering.ResourceConfig memory rconfig = Constants.DEFAULT_RESOURCE_CONFIG(); require(resourceConfig.maxResourceLimit == rconfig.maxResourceLimit); require(resourceConfig.elasticityMultiplier == rconfig.elasticityMultiplier); require(resourceConfig.baseFeeMaxChangeDenominator == rconfig.baseFeeMaxChangeDenominator); @@ -127,7 +136,7 @@ library ChainAssertions { /// @notice Asserts that the L1CrossDomainMessenger is setup correctly function checkL1CrossDomainMessenger(Types.ContractSet memory _contracts, Vm _vm, bool _isProxy) internal view { console.log("Running chain assertions on the L1CrossDomainMessenger"); - L1CrossDomainMessenger messenger = L1CrossDomainMessenger(_contracts.L1CrossDomainMessenger); + IL1CrossDomainMessenger messenger = IL1CrossDomainMessenger(_contracts.L1CrossDomainMessenger); // Check that the contract is initialized assertSlotValueIsOne({ _contractAddress: address(messenger), _slot: 0, _offset: 20 }); @@ -151,7 +160,7 @@ library ChainAssertions { /// @notice Asserts that the L1StandardBridge is setup correctly function checkL1StandardBridge(Types.ContractSet memory _contracts, bool _isProxy) internal view { console.log("Running chain assertions on the L1StandardBridge"); - L1StandardBridge bridge = L1StandardBridge(payable(_contracts.L1StandardBridge)); + IL1StandardBridge bridge = IL1StandardBridge(payable(_contracts.L1StandardBridge)); // Check that the contract is initialized assertSlotValueIsOne({ _contractAddress: address(bridge), _slot: 0, _offset: 0 }); @@ -174,7 +183,7 @@ library ChainAssertions { /// @notice Asserts that the DisputeGameFactory is setup correctly function checkDisputeGameFactory(Types.ContractSet memory _contracts, address _expectedOwner) internal view { console.log("Running chain assertions on the DisputeGameFactory"); - DisputeGameFactory factory = DisputeGameFactory(_contracts.DisputeGameFactory); + IDisputeGameFactory factory = IDisputeGameFactory(_contracts.DisputeGameFactory); // Check that the contract is initialized assertSlotValueIsOne({ _contractAddress: address(factory), _slot: 0, _offset: 0 }); @@ -193,7 +202,33 @@ library ChainAssertions { view { console.log("Running chain assertions on the DelayedWETH"); - DelayedWETH weth = DelayedWETH(payable(_contracts.DelayedWETH)); + IDelayedWETH weth = IDelayedWETH(payable(_contracts.DelayedWETH)); + + // Check that the contract is initialized + assertSlotValueIsOne({ _contractAddress: address(weth), _slot: 0, _offset: 0 }); + + if (_isProxy) { + require(weth.owner() == _expectedOwner); + require(weth.delay() == _cfg.faultGameWithdrawalDelay()); + require(weth.config() == ISuperchainConfig(_contracts.SuperchainConfig)); + } else { + require(weth.owner() == _expectedOwner); + require(weth.delay() == _cfg.faultGameWithdrawalDelay()); + } + } + + /// @notice Asserts that the permissioned DelayedWETH is setup correctly + function checkPermissionedDelayedWETH( + Types.ContractSet memory _contracts, + DeployConfig _cfg, + bool _isProxy, + address _expectedOwner + ) + internal + view + { + console.log("Running chain assertions on the permissioned DelayedWETH"); + IDelayedWETH weth = IDelayedWETH(payable(_contracts.PermissionedDelayedWETH)); // Check that the contract is initialized assertSlotValueIsOne({ _contractAddress: address(weth), _slot: 0, _offset: 0 }); @@ -201,7 +236,7 @@ library ChainAssertions { if (_isProxy) { require(weth.owner() == _expectedOwner); require(weth.delay() == _cfg.faultGameWithdrawalDelay()); - require(weth.config() == SuperchainConfig(_contracts.SuperchainConfig)); + require(weth.config() == ISuperchainConfig(_contracts.SuperchainConfig)); } else { require(weth.owner() == _expectedOwner); require(weth.delay() == _cfg.faultGameWithdrawalDelay()); @@ -219,7 +254,7 @@ library ChainAssertions { view { console.log("Running chain assertions on the L2OutputOracle"); - L2OutputOracle oracle = L2OutputOracle(_contracts.L2OutputOracle); + IL2OutputOracle oracle = IL2OutputOracle(_contracts.L2OutputOracle); // Check that the contract is initialized assertSlotValueIsOne({ _contractAddress: address(oracle), _slot: 0, _offset: 0 }); @@ -256,7 +291,7 @@ library ChainAssertions { /// @notice Asserts that the OptimismMintableERC20Factory is setup correctly function checkOptimismMintableERC20Factory(Types.ContractSet memory _contracts, bool _isProxy) internal view { console.log("Running chain assertions on the OptimismMintableERC20Factory"); - OptimismMintableERC20Factory factory = OptimismMintableERC20Factory(_contracts.OptimismMintableERC20Factory); + IOptimismMintableERC20Factory factory = IOptimismMintableERC20Factory(_contracts.OptimismMintableERC20Factory); // Check that the contract is initialized assertSlotValueIsOne({ _contractAddress: address(factory), _slot: 0, _offset: 0 }); @@ -273,7 +308,7 @@ library ChainAssertions { /// @notice Asserts that the L1ERC721Bridge is setup correctly function checkL1ERC721Bridge(Types.ContractSet memory _contracts, bool _isProxy) internal view { console.log("Running chain assertions on the L1ERC721Bridge"); - L1ERC721Bridge bridge = L1ERC721Bridge(_contracts.L1ERC721Bridge); + IL1ERC721Bridge bridge = IL1ERC721Bridge(_contracts.L1ERC721Bridge); // Check that the contract is initialized assertSlotValueIsOne({ _contractAddress: address(bridge), _slot: 0, _offset: 0 }); @@ -296,7 +331,7 @@ library ChainAssertions { function checkOptimismPortal(Types.ContractSet memory _contracts, DeployConfig _cfg, bool _isProxy) internal view { console.log("Running chain assertions on the OptimismPortal"); - OptimismPortal portal = OptimismPortal(payable(_contracts.OptimismPortal)); + IOptimismPortal portal = IOptimismPortal(payable(_contracts.OptimismPortal)); // Check that the contract is initialized assertSlotValueIsOne({ _contractAddress: address(portal), _slot: 0, _offset: 0 }); @@ -311,7 +346,7 @@ library ChainAssertions { require(address(portal.systemConfig()) == _contracts.SystemConfig); require(portal.guardian() == guardian); require(address(portal.superchainConfig()) == address(_contracts.SuperchainConfig)); - require(portal.paused() == SuperchainConfig(_contracts.SuperchainConfig).paused()); + require(portal.paused() == ISuperchainConfig(_contracts.SuperchainConfig).paused()); require(portal.l2Sender() == Constants.DEFAULT_L2_SENDER); } else { require(address(portal.l2Oracle()) == address(0)); @@ -332,7 +367,7 @@ library ChainAssertions { { console.log("Running chain assertions on the OptimismPortal2"); - OptimismPortal2 portal = OptimismPortal2(payable(_contracts.OptimismPortal2)); + IOptimismPortal2 portal = IOptimismPortal2(payable(_contracts.OptimismPortal2)); // Check that the contract is initialized assertSlotValueIsOne({ _contractAddress: address(portal), _slot: 0, _offset: 0 }); @@ -347,7 +382,7 @@ library ChainAssertions { require(address(portal.systemConfig()) == _contracts.SystemConfig); require(portal.guardian() == guardian); require(address(portal.superchainConfig()) == address(_contracts.SuperchainConfig)); - require(portal.paused() == SuperchainConfig(_contracts.SuperchainConfig).paused()); + require(portal.paused() == ISuperchainConfig(_contracts.SuperchainConfig).paused()); require(portal.l2Sender() == Constants.DEFAULT_L2_SENDER); } else { require(address(portal.disputeGameFactory()) == address(0)); @@ -370,7 +405,7 @@ library ChainAssertions { view { console.log("Running chain assertions on the ProtocolVersions"); - ProtocolVersions versions = ProtocolVersions(_contracts.ProtocolVersions); + IProtocolVersions versions = IProtocolVersions(_contracts.ProtocolVersions); // Check that the contract is initialized assertSlotValueIsOne({ _contractAddress: address(versions), _slot: 0, _offset: 0 }); @@ -396,7 +431,7 @@ library ChainAssertions { view { console.log("Running chain assertions on the SuperchainConfig"); - SuperchainConfig superchainConfig = SuperchainConfig(_contracts.SuperchainConfig); + ISuperchainConfig superchainConfig = ISuperchainConfig(_contracts.SuperchainConfig); // Check that the contract is initialized assertSlotValueIsOne({ _contractAddress: address(superchainConfig), _slot: 0, _offset: 0 }); diff --git a/packages/contracts-bedrock/scripts/deploy/Deploy.s.sol b/packages/contracts-bedrock/scripts/deploy/Deploy.s.sol new file mode 100644 index 000000000000..722cd7c61ecf --- /dev/null +++ b/packages/contracts-bedrock/scripts/deploy/Deploy.s.sol @@ -0,0 +1,1709 @@ +// SPDX-License-Identifier: MIT +pragma solidity ^0.8.0; + +// Testing +import { VmSafe } from "forge-std/Vm.sol"; +import { Script } from "forge-std/Script.sol"; +import { console2 as console } from "forge-std/console2.sol"; +import { stdJson } from "forge-std/StdJson.sol"; +import { AlphabetVM } from "test/mocks/AlphabetVM.sol"; +import { EIP1967Helper } from "test/mocks/EIP1967Helper.sol"; + +// Safe +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"; + +// Scripts +import { Deployer } from "scripts/deploy/Deployer.sol"; +import { Chains } from "scripts/libraries/Chains.sol"; +import { Config } from "scripts/libraries/Config.sol"; +import { LibStateDiff } from "scripts/libraries/LibStateDiff.sol"; +import { Process } from "scripts/libraries/Process.sol"; +import { ForgeArtifacts } from "scripts/libraries/ForgeArtifacts.sol"; +import { ChainAssertions } from "scripts/deploy/ChainAssertions.sol"; + +// Contracts +import { ProxyAdmin } from "src/universal/ProxyAdmin.sol"; +import { AddressManager } from "src/legacy/AddressManager.sol"; +import { Proxy } from "src/universal/Proxy.sol"; +import { StandardBridge } from "src/universal/StandardBridge.sol"; +import { L1ChugSplashProxy } from "src/legacy/L1ChugSplashProxy.sol"; +import { ResolvedDelegateProxy } from "src/legacy/ResolvedDelegateProxy.sol"; +import { PreimageOracle } from "src/cannon/PreimageOracle.sol"; +import { MIPS } from "src/cannon/MIPS.sol"; +import { MIPS2 } from "src/cannon/MIPS2.sol"; +import { StorageSetter } from "src/universal/StorageSetter.sol"; + +// Libraries +import { Constants } from "src/libraries/Constants.sol"; +import { Predeploys } from "src/libraries/Predeploys.sol"; +import { Types } from "scripts/libraries/Types.sol"; +import "src/dispute/lib/Types.sol"; + +// Interfaces +import { IOptimismPortal } from "src/L1/interfaces/IOptimismPortal.sol"; +import { IOptimismPortal2 } from "src/L1/interfaces/IOptimismPortal2.sol"; +import { IOptimismPortalInterop } from "src/L1/interfaces/IOptimismPortalInterop.sol"; +import { ICrossDomainMessenger } from "src/universal/interfaces/ICrossDomainMessenger.sol"; +import { IL1CrossDomainMessenger } from "src/L1/interfaces/IL1CrossDomainMessenger.sol"; +import { IL2OutputOracle } from "src/L1/interfaces/IL2OutputOracle.sol"; +import { ISuperchainConfig } from "src/L1/interfaces/ISuperchainConfig.sol"; +import { ISystemConfig } from "src/L1/interfaces/ISystemConfig.sol"; +import { IDataAvailabilityChallenge } from "src/L1/interfaces/IDataAvailabilityChallenge.sol"; +import { IL1ERC721Bridge } from "src/L1/interfaces/IL1ERC721Bridge.sol"; +import { IL1StandardBridge } from "src/L1/interfaces/IL1StandardBridge.sol"; +import { IProtocolVersions, ProtocolVersion } from "src/L1/interfaces/IProtocolVersions.sol"; +import { IBigStepper } from "src/dispute/interfaces/IBigStepper.sol"; +import { IDisputeGameFactory } from "src/dispute/interfaces/IDisputeGameFactory.sol"; +import { IDisputeGame } from "src/dispute/interfaces/IDisputeGame.sol"; +import { IDelayedWETH } from "src/dispute/interfaces/IDelayedWETH.sol"; +import { IAnchorStateRegistry } from "src/dispute/interfaces/IAnchorStateRegistry.sol"; +import { IPreimageOracle } from "src/cannon/interfaces/IPreimageOracle.sol"; +import { IOptimismMintableERC20Factory } from "src/universal/interfaces/IOptimismMintableERC20Factory.sol"; + +/// @title Deploy +/// @notice Script used to deploy a bedrock system. The entire system is deployed within the `run` function. +/// To add a new contract to the system, add a public function that deploys that individual contract. +/// Then add a call to that function inside of `run`. Be sure to call the `save` function after each +/// deployment so that hardhat-deploy style artifacts can be generated using a call to `sync()`. +/// The `CONTRACT_ADDRESSES_PATH` environment variable can be set to a path that contains a JSON file full of +/// contract name to address pairs. That enables this script to be much more flexible in the way it is used. +/// This contract must not have constructor logic because it is set into state using `etch`. +contract Deploy is Deployer { + using stdJson for string; + + /// @notice FaultDisputeGameParams is a struct that contains the parameters necessary to call + /// the function _setFaultGameImplementation. This struct exists because the EVM needs + /// 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 { + IAnchorStateRegistry anchorStateRegistry; + IDelayedWETH weth; + GameType gameType; + Claim absolutePrestate; + IBigStepper faultVm; + uint256 maxGameDepth; + Duration maxClockDuration; + } + + //////////////////////////////////////////////////////////////// + // Modifiers // + //////////////////////////////////////////////////////////////// + + /// @notice Modifier that wraps a function in broadcasting. + modifier broadcast() { + vm.startBroadcast(msg.sender); + _; + vm.stopBroadcast(); + } + + /// @notice Modifier that will only allow a function to be called on devnet. + modifier onlyDevnet() { + uint256 chainid = block.chainid; + if (chainid == Chains.LocalDevnet || chainid == Chains.GethDevnet) { + _; + } + } + + /// @notice Modifier that will only allow a function to be called on a public + /// testnet or devnet. + modifier onlyTestnetOrDevnet() { + uint256 chainid = block.chainid; + if ( + chainid == Chains.Goerli || chainid == Chains.Sepolia || chainid == Chains.LocalDevnet + || chainid == Chains.GethDevnet + ) { + _; + } + } + + /// @notice Modifier that wraps a function with statediff recording. + /// The returned AccountAccess[] array is then written to + /// the `snapshots/state-diff/<name>.json` output file. + modifier stateDiff() { + vm.startStateDiffRecording(); + _; + VmSafe.AccountAccess[] memory accesses = vm.stopAndReturnStateDiff(); + 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/", vm.toString(block.chainid), ".json"); + vm.writeJson({ json: json, path: statediffPath }); + } + + //////////////////////////////////////////////////////////////// + // Accessors // + //////////////////////////////////////////////////////////////// + + /// @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. + function _implSalt() internal view returns (bytes32) { + return keccak256(bytes(Config.implSalt())); + } + + /// @notice Returns the proxy addresses. If a proxy is not found, it will have address(0). + function _proxies() internal view returns (Types.ContractSet memory proxies_) { + proxies_ = Types.ContractSet({ + L1CrossDomainMessenger: mustGetAddress("L1CrossDomainMessengerProxy"), + L1StandardBridge: mustGetAddress("L1StandardBridgeProxy"), + L2OutputOracle: mustGetAddress("L2OutputOracleProxy"), + DisputeGameFactory: mustGetAddress("DisputeGameFactoryProxy"), + DelayedWETH: mustGetAddress("DelayedWETHProxy"), + PermissionedDelayedWETH: mustGetAddress("PermissionedDelayedWETHProxy"), + AnchorStateRegistry: mustGetAddress("AnchorStateRegistryProxy"), + OptimismMintableERC20Factory: mustGetAddress("OptimismMintableERC20FactoryProxy"), + OptimismPortal: mustGetAddress("OptimismPortalProxy"), + OptimismPortal2: mustGetAddress("OptimismPortalProxy"), + SystemConfig: mustGetAddress("SystemConfigProxy"), + L1ERC721Bridge: mustGetAddress("L1ERC721BridgeProxy"), + ProtocolVersions: mustGetAddress("ProtocolVersionsProxy"), + SuperchainConfig: mustGetAddress("SuperchainConfigProxy") + }); + } + + /// @notice Returns the proxy addresses, not reverting if any are unset. + function _proxiesUnstrict() internal view returns (Types.ContractSet memory proxies_) { + proxies_ = Types.ContractSet({ + L1CrossDomainMessenger: getAddress("L1CrossDomainMessengerProxy"), + L1StandardBridge: getAddress("L1StandardBridgeProxy"), + L2OutputOracle: getAddress("L2OutputOracleProxy"), + DisputeGameFactory: getAddress("DisputeGameFactoryProxy"), + DelayedWETH: getAddress("DelayedWETHProxy"), + PermissionedDelayedWETH: getAddress("PermissionedDelayedWETHProxy"), + AnchorStateRegistry: getAddress("AnchorStateRegistryProxy"), + OptimismMintableERC20Factory: getAddress("OptimismMintableERC20FactoryProxy"), + OptimismPortal: getAddress("OptimismPortalProxy"), + OptimismPortal2: getAddress("OptimismPortalProxy"), + SystemConfig: getAddress("SystemConfigProxy"), + L1ERC721Bridge: getAddress("L1ERC721BridgeProxy"), + ProtocolVersions: getAddress("ProtocolVersionsProxy"), + SuperchainConfig: getAddress("SuperchainConfigProxy") + }); + } + + //////////////////////////////////////////////////////////////// + // State Changing Helper Functions // + //////////////////////////////////////////////////////////////// + + /// @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; + address safeSingleton = 0xd9Db270c1B5E3Bd161E8c8503c55cEABeE709552; + + safeProxyFactory.code.length == 0 + ? safeProxyFactory_ = new SafeProxyFactory() + : safeProxyFactory_ = SafeProxyFactory(safeProxyFactory); + + safeSingleton.code.length == 0 ? safeSingleton_ = new Safe() : safeSingleton_ = Safe(payable(safeSingleton)); + + save("SafeProxyFactory", address(safeProxyFactory_)); + save("SafeSingleton", address(safeSingleton_)); + } + + /// @notice Make a call from the Safe contract to an arbitrary address with arbitrary data + function _callViaSafe(Safe _safe, address _target, bytes memory _data) internal { + // This is the signature format used when the caller is also the signer. + bytes memory signature = abi.encodePacked(uint256(uint160(msg.sender)), bytes32(0), uint8(1)); + + _safe.execTransaction({ + to: _target, + value: 0, + data: _data, + operation: SafeOps.Operation.Call, + safeTxGas: 0, + baseGas: 0, + gasPrice: 0, + gasToken: address(0), + refundReceiver: payable(address(0)), + signatures: signature + }); + } + + /// @notice Call from the Safe contract to the Proxy Admin's upgrade and call method + function _upgradeAndCallViaSafe(address _proxy, address _implementation, bytes memory _innerCallData) internal { + address proxyAdmin = mustGetAddress("ProxyAdmin"); + + bytes memory data = + abi.encodeCall(ProxyAdmin.upgradeAndCall, (payable(_proxy), _implementation, _innerCallData)); + + Safe safe = Safe(mustGetAddress("SystemOwnerSafe")); + _callViaSafe({ _safe: safe, _target: proxyAdmin, _data: data }); + } + + /// @notice Transfer ownership of the ProxyAdmin contract to the final system owner + function transferProxyAdminOwnership() public broadcast { + ProxyAdmin proxyAdmin = ProxyAdmin(mustGetAddress("ProxyAdmin")); + address owner = proxyAdmin.owner(); + address safe = mustGetAddress("SystemOwnerSafe"); + if (owner != safe) { + proxyAdmin.transferOwnership(safe); + console.log("ProxyAdmin ownership transferred to Safe at: %s", safe); + } + } + + /// @notice Transfer ownership of a Proxy to the ProxyAdmin contract + /// This is expected to be used in conjusting with deployERC1967ProxyWithOwner after setup actions + /// have been performed on the proxy. + /// @param _name The name of the proxy to transfer ownership of. + function transferProxyToProxyAdmin(string memory _name) public broadcast { + Proxy proxy = Proxy(mustGetAddress(_name)); + address proxyAdmin = mustGetAddress("ProxyAdmin"); + proxy.changeAdmin(proxyAdmin); + console.log("Proxy %s ownership transferred to ProxyAdmin at: %s", _name, proxyAdmin); + } + + //////////////////////////////////////////////////////////////// + // SetUp and Run // + //////////////////////////////////////////////////////////////// + + /// @notice Deploy all of the L1 contracts necessary for a full Superchain with a single Op Chain. + function run() public { + console.log("Deploying a fresh OP Stack including SuperchainConfig"); + _run(); + } + + /// @notice Deploy a new OP Chain using an existing SuperchainConfig and ProtocolVersions + /// @param _superchainConfigProxy Address of the existing SuperchainConfig proxy + /// @param _protocolVersionsProxy Address of the existing ProtocolVersions proxy + /// @param includeDump Whether to include a state dump after deployment + function runWithSuperchain( + address payable _superchainConfigProxy, + address payable _protocolVersionsProxy, + bool includeDump + ) + public + { + require(_superchainConfigProxy != address(0), "must specify address for superchain config proxy"); + require(_protocolVersionsProxy != address(0), "must specify address for protocol versions proxy"); + + vm.chainId(cfg.l1ChainID()); + + console.log("Deploying a fresh OP Stack with existing SuperchainConfig and ProtocolVersions"); + + Proxy scProxy = Proxy(_superchainConfigProxy); + save("SuperchainConfig", scProxy.implementation()); + save("SuperchainConfigProxy", _superchainConfigProxy); + + Proxy pvProxy = Proxy(_protocolVersionsProxy); + save("ProtocolVersions", pvProxy.implementation()); + save("ProtocolVersionsProxy", _protocolVersionsProxy); + + _run(false); + + if (includeDump) { + vm.dumpState(Config.stateDumpPath("")); + } + } + + function runWithStateDump() public { + vm.chainId(cfg.l1ChainID()); + _run(); + vm.dumpState(Config.stateDumpPath("")); + } + + /// @notice Deploy all L1 contracts and write the state diff to a file. + function runWithStateDiff() public stateDiff { + _run(); + } + + /// @notice Compatibility function for tests that override _run(). + function _run() internal virtual { + _run(true); + } + + /// @notice Internal function containing the deploy logic. + function _run(bool _needsSuperchain) internal { + console.log("start of L1 Deploy!"); + deploySafe("SystemOwnerSafe"); + console.log("deployed Safe!"); + + // Deploy a new ProxyAdmin and AddressManager + // This proxy will be used on the SuperchainConfig and ProtocolVersions contracts, as well as the contracts + // in the OP Chain system. + setupAdmin(); + + if (_needsSuperchain) { + setupSuperchain(); + console.log("set up superchain!"); + } + + if (cfg.useAltDA()) { + bytes32 typeHash = keccak256(bytes(cfg.daCommitmentType())); + bytes32 keccakHash = keccak256(bytes("KeccakCommitment")); + if (typeHash == keccakHash) { + setupOpAltDA(); + } + } + setupOpChain(); + console.log("set up op chain!"); + } + + //////////////////////////////////////////////////////////////// + // High Level Deployment Functions // + //////////////////////////////////////////////////////////////// + + /// @notice Deploy the address manager and proxy admin contracts. + function setupAdmin() public { + deployAddressManager(); + deployProxyAdmin(); + transferProxyAdminOwnership(); + } + + /// @notice Deploy a full system with a new SuperchainConfig + /// The Superchain system has 2 singleton contracts which lie outside of an OP Chain: + /// 1. The SuperchainConfig contract + /// 2. The ProtocolVersions contract + function setupSuperchain() public { + console.log("Setting up Superchain"); + + // Deploy the SuperchainConfigProxy + deployERC1967Proxy("SuperchainConfigProxy"); + deploySuperchainConfig(); + initializeSuperchainConfig(); + + // Deploy the ProtocolVersionsProxy + deployERC1967Proxy("ProtocolVersionsProxy"); + deployProtocolVersions(); + initializeProtocolVersions(); + } + + /// @notice Deploy a new OP Chain, with an existing SuperchainConfig provided + function setupOpChain() public { + console.log("Deploying OP Chain"); + + // Ensure that the requisite contracts are deployed + mustGetAddress("SuperchainConfigProxy"); + mustGetAddress("SystemOwnerSafe"); + mustGetAddress("AddressManager"); + mustGetAddress("ProxyAdmin"); + + deployProxies(); + deployImplementations(); + initializeImplementations(); + + setAlphabetFaultGameImplementation({ _allowUpgrade: false }); + setFastFaultGameImplementation({ _allowUpgrade: false }); + setCannonFaultGameImplementation({ _allowUpgrade: false }); + setPermissionedCannonFaultGameImplementation({ _allowUpgrade: false }); + + transferDisputeGameFactoryOwnership(); + transferDelayedWETHOwnership(); + } + + /// @notice Deploy all of the proxies + function deployProxies() public { + console.log("Deploying proxies"); + + deployERC1967Proxy("OptimismPortalProxy"); + deployERC1967Proxy("SystemConfigProxy"); + deployL1StandardBridgeProxy(); + deployL1CrossDomainMessengerProxy(); + deployERC1967Proxy("OptimismMintableERC20FactoryProxy"); + deployERC1967Proxy("L1ERC721BridgeProxy"); + + // Both the DisputeGameFactory and L2OutputOracle proxies are deployed regardless of whether fault proofs is + // enabled to prevent a nastier refactor to the deploy scripts. In the future, the L2OutputOracle will be + // removed. If fault proofs are not enabled, the DisputeGameFactory proxy will be unused. + deployERC1967Proxy("DisputeGameFactoryProxy"); + deployERC1967Proxy("L2OutputOracleProxy"); + deployERC1967Proxy("DelayedWETHProxy"); + deployERC1967Proxy("PermissionedDelayedWETHProxy"); + deployERC1967Proxy("AnchorStateRegistryProxy"); + + transferAddressManagerOwnership(); // to the ProxyAdmin + } + + /// @notice Deploy all of the implementations + function deployImplementations() public { + console.log("Deploying implementations"); + deployL1CrossDomainMessenger(); + deployOptimismMintableERC20Factory(); + deploySystemConfig(); + deployL1StandardBridge(); + deployL1ERC721Bridge(); + deployOptimismPortal(); + deployL2OutputOracle(); + // Fault proofs + deployOptimismPortal2(); + deployDisputeGameFactory(); + deployDelayedWETH(); + deployPreimageOracle(); + deployMips(); + deployAnchorStateRegistry(); + } + + /// @notice Initialize all of the implementations + function initializeImplementations() public { + console.log("Initializing implementations"); + // Selectively initialize either the original OptimismPortal or the new OptimismPortal2. Since this will upgrade + // the proxy, we cannot initialize both. + if (cfg.useFaultProofs()) { + console.log("Fault proofs enabled. Initializing the OptimismPortal proxy with the OptimismPortal2."); + initializeOptimismPortal2(); + } else { + initializeOptimismPortal(); + } + + initializeSystemConfig(); + initializeL1StandardBridge(); + initializeL1ERC721Bridge(); + initializeOptimismMintableERC20Factory(); + initializeL1CrossDomainMessenger(); + initializeL2OutputOracle(); + initializeDisputeGameFactory(); + initializeDelayedWETH(); + initializePermissionedDelayedWETH(); + initializeAnchorStateRegistry(); + } + + /// @notice Add AltDA setup to the OP chain + function setupOpAltDA() public { + console.log("Deploying OP AltDA"); + deployDataAvailabilityChallengeProxy(); + deployDataAvailabilityChallenge(); + initializeDataAvailabilityChallenge(); + } + + //////////////////////////////////////////////////////////////// + // Non-Proxied Deployment Functions // + //////////////////////////////////////////////////////////////// + + /// @notice Deploy the 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(); + + if (_keepDeployer) { + address[] memory expandedOwners = new address[](_owners.length + 1); + // 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.encodeCall( + Safe.setup, (_owners, _threshold, address(0), hex"", address(0), address(0), 0, payable(address(0))) + ); + 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_); + } + + /// @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 + function deployAddressManager() public broadcast returns (address addr_) { + console.log("Deploying AddressManager"); + AddressManager manager = new AddressManager(); + require(manager.owner() == msg.sender); + + save("AddressManager", address(manager)); + console.log("AddressManager deployed at %s", address(manager)); + addr_ = address(manager); + } + + /// @notice Deploy the ProxyAdmin + function deployProxyAdmin() public broadcast returns (address addr_) { + console.log("Deploying ProxyAdmin"); + ProxyAdmin admin = new ProxyAdmin({ _owner: msg.sender }); + require(admin.owner() == msg.sender); + + AddressManager addressManager = AddressManager(mustGetAddress("AddressManager")); + if (admin.addressManager() != addressManager) { + admin.setAddressManager(addressManager); + } + + require(admin.addressManager() == addressManager); + + save("ProxyAdmin", address(admin)); + console.log("ProxyAdmin deployed at %s", address(admin)); + addr_ = address(admin); + } + + /// @notice Deploy the StorageSetter contract, used for upgrades. + function deployStorageSetter() public broadcast returns (address addr_) { + console.log("Deploying StorageSetter"); + StorageSetter setter = new StorageSetter{ salt: _implSalt() }(); + console.log("StorageSetter deployed at: %s", address(setter)); + string memory version = setter.version(); + console.log("StorageSetter version: %s", version); + addr_ = address(setter); + } + + //////////////////////////////////////////////////////////////// + // Proxy Deployment Functions // + //////////////////////////////////////////////////////////////// + + /// @notice Deploy the L1StandardBridgeProxy using a ChugSplashProxy + function deployL1StandardBridgeProxy() public broadcast returns (address addr_) { + console.log("Deploying proxy for L1StandardBridge"); + address proxyAdmin = mustGetAddress("ProxyAdmin"); + L1ChugSplashProxy proxy = new L1ChugSplashProxy(proxyAdmin); + + require(EIP1967Helper.getAdmin(address(proxy)) == proxyAdmin); + + save("L1StandardBridgeProxy", address(proxy)); + console.log("L1StandardBridgeProxy deployed at %s", address(proxy)); + addr_ = address(proxy); + } + + /// @notice Deploy the L1CrossDomainMessengerProxy using a ResolvedDelegateProxy + function deployL1CrossDomainMessengerProxy() public broadcast returns (address addr_) { + console.log("Deploying proxy for L1CrossDomainMessenger"); + AddressManager addressManager = AddressManager(mustGetAddress("AddressManager")); + ResolvedDelegateProxy proxy = new ResolvedDelegateProxy(addressManager, "OVM_L1CrossDomainMessenger"); + + save("L1CrossDomainMessengerProxy", address(proxy)); + console.log("L1CrossDomainMessengerProxy deployed at %s", address(proxy)); + + addr_ = address(proxy); + } + + /// @notice Deploys an ERC1967Proxy contract with the ProxyAdmin as the owner. + /// @param _name The name of the proxy contract to be deployed. + /// @return addr_ The address of the deployed proxy contract. + function deployERC1967Proxy(string memory _name) public returns (address addr_) { + addr_ = deployERC1967ProxyWithOwner(_name, mustGetAddress("ProxyAdmin")); + } + + /// @notice Deploys an ERC1967Proxy contract with a specified owner. + /// @param _name The name of the proxy contract to be deployed. + /// @param _proxyOwner The address of the owner of the proxy contract. + /// @return addr_ The address of the deployed proxy contract. + function deployERC1967ProxyWithOwner( + string memory _name, + address _proxyOwner + ) + public + broadcast + returns (address addr_) + { + console.log(string.concat("Deploying ERC1967 proxy for ", _name)); + Proxy proxy = new Proxy({ _admin: _proxyOwner }); + + require(EIP1967Helper.getAdmin(address(proxy)) == _proxyOwner); + + save(_name, address(proxy)); + console.log(" at %s", address(proxy)); + addr_ = address(proxy); + } + + /// @notice Deploy the DataAvailabilityChallengeProxy + function deployDataAvailabilityChallengeProxy() public broadcast returns (address addr_) { + console.log("Deploying proxy for DataAvailabilityChallenge"); + address proxyAdmin = mustGetAddress("ProxyAdmin"); + Proxy proxy = new Proxy({ _admin: proxyAdmin }); + + require(EIP1967Helper.getAdmin(address(proxy)) == proxyAdmin); + + save("DataAvailabilityChallengeProxy", address(proxy)); + console.log("DataAvailabilityChallengeProxy deployed at %s", address(proxy)); + + addr_ = address(proxy); + } + + //////////////////////////////////////////////////////////////// + // Implementation Deployment Functions // + //////////////////////////////////////////////////////////////// + + /// @notice Deploy the SuperchainConfig contract + function deploySuperchainConfig() public broadcast { + ISuperchainConfig superchainConfig = ISuperchainConfig(_deploy("SuperchainConfig", hex"")); + + require(superchainConfig.guardian() == address(0)); + bytes32 initialized = vm.load(address(superchainConfig), bytes32(0)); + require(initialized != 0); + } + + /// @notice Deploy the L1CrossDomainMessenger + function deployL1CrossDomainMessenger() public broadcast returns (address addr_) { + IL1CrossDomainMessenger messenger = IL1CrossDomainMessenger(_deploy("L1CrossDomainMessenger", hex"")); + + // Override the `L1CrossDomainMessenger` contract to the deployed implementation. This is necessary + // to check the `L1CrossDomainMessenger` implementation alongside dependent contracts, which + // are always proxies. + Types.ContractSet memory contracts = _proxiesUnstrict(); + contracts.L1CrossDomainMessenger = address(messenger); + ChainAssertions.checkL1CrossDomainMessenger({ _contracts: contracts, _vm: vm, _isProxy: false }); + + addr_ = address(messenger); + } + + /// @notice Deploy the OptimismPortal + function deployOptimismPortal() public broadcast returns (address addr_) { + if (cfg.useInterop()) { + console.log("Attempting to deploy OptimismPortal with interop, this config is a noop"); + } + + addr_ = _deploy("OptimismPortal", hex""); + + // 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 = addr_; + ChainAssertions.checkOptimismPortal({ _contracts: contracts, _cfg: cfg, _isProxy: false }); + } + + /// @notice Deploy the OptimismPortal2 + function deployOptimismPortal2() public broadcast returns (address addr_) { + // Could also verify this inside DeployConfig but doing it here is a bit more reliable. + require( + uint32(cfg.respectedGameType()) == cfg.respectedGameType(), "Deploy: respectedGameType must fit into uint32" + ); + + if (cfg.useInterop()) { + addr_ = _deploy( + "OptimismPortalInterop", + abi.encode(cfg.proofMaturityDelaySeconds(), cfg.disputeGameFinalityDelaySeconds()) + ); + save("OptimismPortal2", addr_); + } else { + addr_ = _deploy( + "OptimismPortal2", abi.encode(cfg.proofMaturityDelaySeconds(), cfg.disputeGameFinalityDelaySeconds()) + ); + } + + // Override the `OptimismPortal2` contract to the deployed implementation. This is necessary + // to check the `OptimismPortal2` implementation alongside dependent contracts, which + // are always proxies. + Types.ContractSet memory contracts = _proxiesUnstrict(); + contracts.OptimismPortal2 = addr_; + ChainAssertions.checkOptimismPortal2({ _contracts: contracts, _cfg: cfg, _isProxy: false }); + } + + /// @notice Deploy the L2OutputOracle + function deployL2OutputOracle() public broadcast returns (address addr_) { + IL2OutputOracle oracle = IL2OutputOracle(_deploy("L2OutputOracle", hex"")); + + // Override the `L2OutputOracle` contract to the deployed implementation. This is necessary + // to check the `L2OutputOracle` implementation alongside dependent contracts, which + // are always proxies. + Types.ContractSet memory contracts = _proxiesUnstrict(); + contracts.L2OutputOracle = address(oracle); + ChainAssertions.checkL2OutputOracle({ + _contracts: contracts, + _cfg: cfg, + _l2OutputOracleStartingTimestamp: 0, + _isProxy: false + }); + + addr_ = address(oracle); + } + + /// @notice Deploy the OptimismMintableERC20Factory + function deployOptimismMintableERC20Factory() public broadcast returns (address addr_) { + IOptimismMintableERC20Factory factory = + IOptimismMintableERC20Factory(_deploy("OptimismMintableERC20Factory", hex"")); + + // Override the `OptimismMintableERC20Factory` contract to the deployed implementation. This is necessary + // to check the `OptimismMintableERC20Factory` implementation alongside dependent contracts, which + // are always proxies. + Types.ContractSet memory contracts = _proxiesUnstrict(); + contracts.OptimismMintableERC20Factory = address(factory); + ChainAssertions.checkOptimismMintableERC20Factory({ _contracts: contracts, _isProxy: false }); + + addr_ = address(factory); + } + + /// @notice Deploy the DisputeGameFactory + function deployDisputeGameFactory() public broadcast returns (address addr_) { + IDisputeGameFactory factory = IDisputeGameFactory(_deploy("DisputeGameFactory", hex"")); + + // Override the `DisputeGameFactory` contract to the deployed implementation. This is necessary to check the + // `DisputeGameFactory` implementation alongside dependent contracts, which are always proxies. + Types.ContractSet memory contracts = _proxiesUnstrict(); + contracts.DisputeGameFactory = address(factory); + ChainAssertions.checkDisputeGameFactory({ _contracts: contracts, _expectedOwner: address(0) }); + + addr_ = address(factory); + } + + function deployDelayedWETH() public broadcast returns (address addr_) { + IDelayedWETH weth = IDelayedWETH(payable(_deploy("DelayedWETH", abi.encode(cfg.faultGameWithdrawalDelay())))); + + // Override the `DelayedWETH` contract to the deployed implementation. This is necessary + // to check the `DelayedWETH` implementation alongside dependent contracts, which are + // always proxies. + Types.ContractSet memory contracts = _proxiesUnstrict(); + contracts.DelayedWETH = address(weth); + ChainAssertions.checkDelayedWETH({ + _contracts: contracts, + _cfg: cfg, + _isProxy: false, + _expectedOwner: address(0) + }); + + addr_ = address(weth); + } + + /// @notice Deploy the ProtocolVersions + function deployProtocolVersions() public broadcast returns (address addr_) { + IProtocolVersions versions = IProtocolVersions(_deploy("ProtocolVersions", hex"")); + + // Override the `ProtocolVersions` contract to the deployed implementation. This is necessary + // to check the `ProtocolVersions` implementation alongside dependent contracts, which + // are always proxies. + Types.ContractSet memory contracts = _proxiesUnstrict(); + contracts.ProtocolVersions = address(versions); + ChainAssertions.checkProtocolVersions({ _contracts: contracts, _cfg: cfg, _isProxy: false }); + + addr_ = address(versions); + } + + /// @notice Deploy the PreimageOracle + function deployPreimageOracle() public broadcast returns (address addr_) { + console.log("Deploying PreimageOracle implementation"); + PreimageOracle preimageOracle = new PreimageOracle{ salt: _implSalt() }({ + _minProposalSize: cfg.preimageOracleMinProposalSize(), + _challengePeriod: cfg.preimageOracleChallengePeriod() + }); + save("PreimageOracle", address(preimageOracle)); + console.log("PreimageOracle deployed at %s", address(preimageOracle)); + + addr_ = address(preimageOracle); + } + + /// @notice Deploy Mips VM. Deploys either MIPS or MIPS2 depending on the environment + function deployMips() public broadcast returns (address addr_) { + if (Config.useMultithreadedCannon()) { + addr_ = _deployMips2(); + } else { + addr_ = _deployMips(); + } + save("Mips", address(addr_)); + } + + /// @notice Deploy MIPS + function _deployMips() internal returns (address addr_) { + console.log("Deploying Mips implementation"); + MIPS mips = new MIPS{ salt: _implSalt() }(IPreimageOracle(mustGetAddress("PreimageOracle"))); + console.log("MIPS deployed at %s", address(mips)); + addr_ = address(mips); + } + + /// @notice Deploy MIPS2 + function _deployMips2() internal returns (address addr_) { + console.log("Deploying Mips2 implementation"); + MIPS2 mips2 = new MIPS2{ salt: _implSalt() }(IPreimageOracle(mustGetAddress("PreimageOracle"))); + console.log("MIPS2 deployed at %s", address(mips2)); + addr_ = address(mips2); + } + + /// @notice Deploy the AnchorStateRegistry + function deployAnchorStateRegistry() public broadcast returns (address addr_) { + IAnchorStateRegistry anchorStateRegistry = + IAnchorStateRegistry(_deploy("AnchorStateRegistry", abi.encode(mustGetAddress("DisputeGameFactoryProxy")))); + + addr_ = address(anchorStateRegistry); + } + + /// @notice Deploy the SystemConfig + function deploySystemConfig() public broadcast returns (address addr_) { + if (cfg.useInterop()) { + addr_ = _deploy("SystemConfigInterop", hex""); + save("SystemConfig", addr_); + } else { + addr_ = _deploy("SystemConfig", hex""); + } + + // 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 = addr_; + ChainAssertions.checkSystemConfig({ _contracts: contracts, _cfg: cfg, _isProxy: false }); + } + + /// @notice Deploy the L1StandardBridge + function deployL1StandardBridge() public broadcast returns (address addr_) { + IL1StandardBridge bridge = IL1StandardBridge(payable(_deploy("L1StandardBridge", hex""))); + + // Override the `L1StandardBridge` contract to the deployed implementation. This is necessary + // to check the `L1StandardBridge` implementation alongside dependent contracts, which + // are always proxies. + Types.ContractSet memory contracts = _proxiesUnstrict(); + contracts.L1StandardBridge = address(bridge); + ChainAssertions.checkL1StandardBridge({ _contracts: contracts, _isProxy: false }); + + addr_ = address(bridge); + } + + /// @notice Deploy the L1ERC721Bridge + function deployL1ERC721Bridge() public broadcast returns (address addr_) { + IL1ERC721Bridge bridge = IL1ERC721Bridge(_deploy("L1ERC721Bridge", hex"")); + + // Override the `L1ERC721Bridge` contract to the deployed implementation. This is necessary + // to check the `L1ERC721Bridge` implementation alongside dependent contracts, which + // are always proxies. + Types.ContractSet memory contracts = _proxiesUnstrict(); + contracts.L1ERC721Bridge = address(bridge); + + ChainAssertions.checkL1ERC721Bridge({ _contracts: contracts, _isProxy: false }); + + addr_ = address(bridge); + } + + /// @notice Transfer ownership of the address manager to the ProxyAdmin + function transferAddressManagerOwnership() public broadcast { + console.log("Transferring AddressManager ownership to ProxyAdmin"); + AddressManager addressManager = AddressManager(mustGetAddress("AddressManager")); + address owner = addressManager.owner(); + address proxyAdmin = mustGetAddress("ProxyAdmin"); + if (owner != proxyAdmin) { + addressManager.transferOwnership(proxyAdmin); + console.log("AddressManager ownership transferred to %s", proxyAdmin); + } + + require(addressManager.owner() == proxyAdmin); + } + + /// @notice Deploy the DataAvailabilityChallenge + function deployDataAvailabilityChallenge() public broadcast returns (address addr_) { + IDataAvailabilityChallenge dac = + IDataAvailabilityChallenge(payable(_deploy("DataAvailabilityChallenge", hex""))); + addr_ = address(dac); + } + + //////////////////////////////////////////////////////////////// + // Initialize Functions // + //////////////////////////////////////////////////////////////// + + /// @notice Initialize the SuperchainConfig + function initializeSuperchainConfig() public broadcast { + address payable superchainConfigProxy = mustGetAddress("SuperchainConfigProxy"); + address payable superchainConfig = mustGetAddress("SuperchainConfig"); + _upgradeAndCallViaSafe({ + _proxy: superchainConfigProxy, + _implementation: superchainConfig, + _innerCallData: abi.encodeCall(ISuperchainConfig.initialize, (cfg.superchainConfigGuardian(), false)) + }); + + ChainAssertions.checkSuperchainConfig({ _contracts: _proxiesUnstrict(), _cfg: cfg, _isPaused: false }); + } + + /// @notice Initialize the DisputeGameFactory + function initializeDisputeGameFactory() public broadcast { + console.log("Upgrading and initializing DisputeGameFactory proxy"); + address disputeGameFactoryProxy = mustGetAddress("DisputeGameFactoryProxy"); + address disputeGameFactory = mustGetAddress("DisputeGameFactory"); + + _upgradeAndCallViaSafe({ + _proxy: payable(disputeGameFactoryProxy), + _implementation: disputeGameFactory, + _innerCallData: abi.encodeCall(IDisputeGameFactory.initialize, (msg.sender)) + }); + + string memory version = IDisputeGameFactory(disputeGameFactoryProxy).version(); + console.log("DisputeGameFactory version: %s", version); + + ChainAssertions.checkDisputeGameFactory({ _contracts: _proxiesUnstrict(), _expectedOwner: msg.sender }); + } + + function initializeDelayedWETH() public broadcast { + console.log("Upgrading and initializing DelayedWETH proxy"); + address delayedWETHProxy = mustGetAddress("DelayedWETHProxy"); + address delayedWETH = mustGetAddress("DelayedWETH"); + address superchainConfigProxy = mustGetAddress("SuperchainConfigProxy"); + + _upgradeAndCallViaSafe({ + _proxy: payable(delayedWETHProxy), + _implementation: delayedWETH, + _innerCallData: abi.encodeCall(IDelayedWETH.initialize, (msg.sender, ISuperchainConfig(superchainConfigProxy))) + }); + + string memory version = IDelayedWETH(payable(delayedWETHProxy)).version(); + console.log("DelayedWETH version: %s", version); + + ChainAssertions.checkDelayedWETH({ + _contracts: _proxiesUnstrict(), + _cfg: cfg, + _isProxy: true, + _expectedOwner: msg.sender + }); + } + + function initializePermissionedDelayedWETH() public broadcast { + console.log("Upgrading and initializing permissioned DelayedWETH proxy"); + address delayedWETHProxy = mustGetAddress("PermissionedDelayedWETHProxy"); + address delayedWETH = mustGetAddress("DelayedWETH"); + address superchainConfigProxy = mustGetAddress("SuperchainConfigProxy"); + + _upgradeAndCallViaSafe({ + _proxy: payable(delayedWETHProxy), + _implementation: delayedWETH, + _innerCallData: abi.encodeCall(IDelayedWETH.initialize, (msg.sender, ISuperchainConfig(superchainConfigProxy))) + }); + + string memory version = IDelayedWETH(payable(delayedWETHProxy)).version(); + console.log("DelayedWETH version: %s", version); + + ChainAssertions.checkPermissionedDelayedWETH({ + _contracts: _proxiesUnstrict(), + _cfg: cfg, + _isProxy: true, + _expectedOwner: msg.sender + }); + } + + function initializeAnchorStateRegistry() public broadcast { + console.log("Upgrading and initializing AnchorStateRegistry proxy"); + address anchorStateRegistryProxy = mustGetAddress("AnchorStateRegistryProxy"); + address anchorStateRegistry = mustGetAddress("AnchorStateRegistry"); + ISuperchainConfig superchainConfig = ISuperchainConfig(mustGetAddress("SuperchainConfigProxy")); + + IAnchorStateRegistry.StartingAnchorRoot[] memory roots = new IAnchorStateRegistry.StartingAnchorRoot[](5); + roots[0] = IAnchorStateRegistry.StartingAnchorRoot({ + gameType: GameTypes.CANNON, + outputRoot: OutputRoot({ + root: Hash.wrap(cfg.faultGameGenesisOutputRoot()), + l2BlockNumber: cfg.faultGameGenesisBlock() + }) + }); + roots[1] = IAnchorStateRegistry.StartingAnchorRoot({ + gameType: GameTypes.PERMISSIONED_CANNON, + outputRoot: OutputRoot({ + root: Hash.wrap(cfg.faultGameGenesisOutputRoot()), + l2BlockNumber: cfg.faultGameGenesisBlock() + }) + }); + roots[2] = IAnchorStateRegistry.StartingAnchorRoot({ + gameType: GameTypes.ALPHABET, + outputRoot: OutputRoot({ + root: Hash.wrap(cfg.faultGameGenesisOutputRoot()), + l2BlockNumber: cfg.faultGameGenesisBlock() + }) + }); + roots[3] = IAnchorStateRegistry.StartingAnchorRoot({ + gameType: GameTypes.ASTERISC, + outputRoot: OutputRoot({ + root: Hash.wrap(cfg.faultGameGenesisOutputRoot()), + l2BlockNumber: cfg.faultGameGenesisBlock() + }) + }); + roots[4] = IAnchorStateRegistry.StartingAnchorRoot({ + gameType: GameTypes.FAST, + outputRoot: OutputRoot({ + root: Hash.wrap(cfg.faultGameGenesisOutputRoot()), + l2BlockNumber: cfg.faultGameGenesisBlock() + }) + }); + + _upgradeAndCallViaSafe({ + _proxy: payable(anchorStateRegistryProxy), + _implementation: anchorStateRegistry, + _innerCallData: abi.encodeCall(IAnchorStateRegistry.initialize, (roots, superchainConfig)) + }); + + string memory version = IAnchorStateRegistry(payable(anchorStateRegistryProxy)).version(); + console.log("AnchorStateRegistry version: %s", version); + } + + /// @notice Initialize the SystemConfig + function initializeSystemConfig() public broadcast { + console.log("Upgrading and initializing SystemConfig proxy"); + address systemConfigProxy = mustGetAddress("SystemConfigProxy"); + address systemConfig = mustGetAddress("SystemConfig"); + + bytes32 batcherHash = bytes32(uint256(uint160(cfg.batchSenderAddress()))); + + address customGasTokenAddress = Constants.ETHER; + if (cfg.useCustomGasToken()) { + customGasTokenAddress = cfg.customGasTokenAddress(); + } + + _upgradeAndCallViaSafe({ + _proxy: payable(systemConfigProxy), + _implementation: systemConfig, + _innerCallData: abi.encodeCall( + ISystemConfig.initialize, + ( + cfg.finalSystemOwner(), + cfg.basefeeScalar(), + cfg.blobbasefeeScalar(), + batcherHash, + uint64(cfg.l2GenesisBlockGasLimit()), + cfg.p2pSequencerAddress(), + Constants.DEFAULT_RESOURCE_CONFIG(), + cfg.batchInboxAddress(), + ISystemConfig.Addresses({ + l1CrossDomainMessenger: mustGetAddress("L1CrossDomainMessengerProxy"), + l1ERC721Bridge: mustGetAddress("L1ERC721BridgeProxy"), + l1StandardBridge: mustGetAddress("L1StandardBridgeProxy"), + disputeGameFactory: mustGetAddress("DisputeGameFactoryProxy"), + optimismPortal: mustGetAddress("OptimismPortalProxy"), + optimismMintableERC20Factory: mustGetAddress("OptimismMintableERC20FactoryProxy"), + gasPayingToken: customGasTokenAddress + }) + ) + ) + }); + + ISystemConfig config = ISystemConfig(systemConfigProxy); + string memory version = config.version(); + console.log("SystemConfig version: %s", version); + + ChainAssertions.checkSystemConfig({ _contracts: _proxies(), _cfg: cfg, _isProxy: true }); + } + + /// @notice Initialize the L1StandardBridge + function initializeL1StandardBridge() public broadcast { + console.log("Upgrading and initializing L1StandardBridge proxy"); + ProxyAdmin proxyAdmin = ProxyAdmin(mustGetAddress("ProxyAdmin")); + address l1StandardBridgeProxy = mustGetAddress("L1StandardBridgeProxy"); + 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)) + }); + } + require(uint256(proxyAdmin.proxyType(l1StandardBridgeProxy)) == uint256(ProxyAdmin.ProxyType.CHUGSPLASH)); + + _upgradeAndCallViaSafe({ + _proxy: payable(l1StandardBridgeProxy), + _implementation: l1StandardBridge, + _innerCallData: abi.encodeCall( + IL1StandardBridge.initialize, + ( + ICrossDomainMessenger(l1CrossDomainMessengerProxy), + ISuperchainConfig(superchainConfigProxy), + ISystemConfig(systemConfigProxy) + ) + ) + }); + + string memory version = IL1StandardBridge(payable(l1StandardBridgeProxy)).version(); + console.log("L1StandardBridge version: %s", version); + + ChainAssertions.checkL1StandardBridge({ _contracts: _proxies(), _isProxy: true }); + } + + /// @notice Initialize the L1ERC721Bridge + function initializeL1ERC721Bridge() public broadcast { + console.log("Upgrading and initializing L1ERC721Bridge proxy"); + address l1ERC721BridgeProxy = mustGetAddress("L1ERC721BridgeProxy"); + address l1ERC721Bridge = mustGetAddress("L1ERC721Bridge"); + address l1CrossDomainMessengerProxy = mustGetAddress("L1CrossDomainMessengerProxy"); + address superchainConfigProxy = mustGetAddress("SuperchainConfigProxy"); + + _upgradeAndCallViaSafe({ + _proxy: payable(l1ERC721BridgeProxy), + _implementation: l1ERC721Bridge, + _innerCallData: abi.encodeCall( + IL1ERC721Bridge.initialize, + (ICrossDomainMessenger(payable(l1CrossDomainMessengerProxy)), ISuperchainConfig(superchainConfigProxy)) + ) + }); + + IL1ERC721Bridge bridge = IL1ERC721Bridge(l1ERC721BridgeProxy); + string memory version = bridge.version(); + console.log("L1ERC721Bridge version: %s", version); + + ChainAssertions.checkL1ERC721Bridge({ _contracts: _proxies(), _isProxy: true }); + } + + /// @notice Initialize the OptimismMintableERC20Factory + function initializeOptimismMintableERC20Factory() public broadcast { + console.log("Upgrading and initializing OptimismMintableERC20Factory proxy"); + address optimismMintableERC20FactoryProxy = mustGetAddress("OptimismMintableERC20FactoryProxy"); + address optimismMintableERC20Factory = mustGetAddress("OptimismMintableERC20Factory"); + address l1StandardBridgeProxy = mustGetAddress("L1StandardBridgeProxy"); + + _upgradeAndCallViaSafe({ + _proxy: payable(optimismMintableERC20FactoryProxy), + _implementation: optimismMintableERC20Factory, + _innerCallData: abi.encodeCall(IOptimismMintableERC20Factory.initialize, (l1StandardBridgeProxy)) + }); + + IOptimismMintableERC20Factory factory = IOptimismMintableERC20Factory(optimismMintableERC20FactoryProxy); + string memory version = factory.version(); + console.log("OptimismMintableERC20Factory version: %s", version); + + ChainAssertions.checkOptimismMintableERC20Factory({ _contracts: _proxies(), _isProxy: true }); + } + + /// @notice initializeL1CrossDomainMessenger + function initializeL1CrossDomainMessenger() public broadcast { + console.log("Upgrading and initializing L1CrossDomainMessenger proxy"); + ProxyAdmin proxyAdmin = ProxyAdmin(mustGetAddress("ProxyAdmin")); + address l1CrossDomainMessengerProxy = mustGetAddress("L1CrossDomainMessengerProxy"); + 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)) + }); + } + require(uint256(proxyAdmin.proxyType(l1CrossDomainMessengerProxy)) == uint256(ProxyAdmin.ProxyType.RESOLVED)); + + string memory contractName = "OVM_L1CrossDomainMessenger"; + 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)) + }); + } + require( + keccak256(bytes(proxyAdmin.implementationName(l1CrossDomainMessengerProxy))) + == keccak256(bytes(contractName)) + ); + + _upgradeAndCallViaSafe({ + _proxy: payable(l1CrossDomainMessengerProxy), + _implementation: l1CrossDomainMessenger, + _innerCallData: abi.encodeCall( + IL1CrossDomainMessenger.initialize, + ( + ISuperchainConfig(superchainConfigProxy), + IOptimismPortal(payable(optimismPortalProxy)), + ISystemConfig(systemConfigProxy) + ) + ) + }); + + IL1CrossDomainMessenger messenger = IL1CrossDomainMessenger(l1CrossDomainMessengerProxy); + string memory version = messenger.version(); + console.log("L1CrossDomainMessenger version: %s", version); + + ChainAssertions.checkL1CrossDomainMessenger({ _contracts: _proxies(), _vm: vm, _isProxy: true }); + } + + /// @notice Initialize the L2OutputOracle + function initializeL2OutputOracle() public broadcast { + console.log("Upgrading and initializing L2OutputOracle proxy"); + address l2OutputOracleProxy = mustGetAddress("L2OutputOracleProxy"); + address l2OutputOracle = mustGetAddress("L2OutputOracle"); + + _upgradeAndCallViaSafe({ + _proxy: payable(l2OutputOracleProxy), + _implementation: l2OutputOracle, + _innerCallData: abi.encodeCall( + IL2OutputOracle.initialize, + ( + cfg.l2OutputOracleSubmissionInterval(), + cfg.l2BlockTime(), + cfg.l2OutputOracleStartingBlockNumber(), + cfg.l2OutputOracleStartingTimestamp(), + cfg.l2OutputOracleProposer(), + cfg.l2OutputOracleChallenger(), + cfg.finalizationPeriodSeconds() + ) + ) + }); + + IL2OutputOracle oracle = IL2OutputOracle(l2OutputOracleProxy); + string memory version = oracle.version(); + console.log("L2OutputOracle version: %s", version); + + ChainAssertions.checkL2OutputOracle({ + _contracts: _proxies(), + _cfg: cfg, + _l2OutputOracleStartingTimestamp: cfg.l2OutputOracleStartingTimestamp(), + _isProxy: true + }); + } + + /// @notice Initialize the OptimismPortal + function initializeOptimismPortal() public broadcast { + console.log("Upgrading and initializing OptimismPortal proxy"); + address optimismPortalProxy = mustGetAddress("OptimismPortalProxy"); + address optimismPortal = mustGetAddress("OptimismPortal"); + address l2OutputOracleProxy = mustGetAddress("L2OutputOracleProxy"); + address systemConfigProxy = mustGetAddress("SystemConfigProxy"); + address superchainConfigProxy = mustGetAddress("SuperchainConfigProxy"); + + _upgradeAndCallViaSafe({ + _proxy: payable(optimismPortalProxy), + _implementation: optimismPortal, + _innerCallData: abi.encodeCall( + IOptimismPortal.initialize, + ( + IL2OutputOracle(l2OutputOracleProxy), + ISystemConfig(systemConfigProxy), + ISuperchainConfig(superchainConfigProxy) + ) + ) + }); + + IOptimismPortal portal = IOptimismPortal(payable(optimismPortalProxy)); + string memory version = portal.version(); + console.log("OptimismPortal version: %s", version); + + ChainAssertions.checkOptimismPortal({ _contracts: _proxies(), _cfg: cfg, _isProxy: true }); + } + + /// @notice Initialize the OptimismPortal2 + function initializeOptimismPortal2() public broadcast { + console.log("Upgrading and initializing OptimismPortal2 proxy"); + address optimismPortalProxy = mustGetAddress("OptimismPortalProxy"); + address optimismPortal2 = mustGetAddress("OptimismPortal2"); + address disputeGameFactoryProxy = mustGetAddress("DisputeGameFactoryProxy"); + address systemConfigProxy = mustGetAddress("SystemConfigProxy"); + address superchainConfigProxy = mustGetAddress("SuperchainConfigProxy"); + + _upgradeAndCallViaSafe({ + _proxy: payable(optimismPortalProxy), + _implementation: optimismPortal2, + _innerCallData: abi.encodeCall( + IOptimismPortal2.initialize, + ( + IDisputeGameFactory(disputeGameFactoryProxy), + ISystemConfig(systemConfigProxy), + ISuperchainConfig(superchainConfigProxy), + GameType.wrap(uint32(cfg.respectedGameType())) + ) + ) + }); + + IOptimismPortal2 portal = IOptimismPortal2(payable(optimismPortalProxy)); + string memory version = portal.version(); + console.log("OptimismPortal2 version: %s", version); + + ChainAssertions.checkOptimismPortal2({ _contracts: _proxies(), _cfg: cfg, _isProxy: true }); + } + + function initializeProtocolVersions() public broadcast { + console.log("Upgrading and initializing ProtocolVersions proxy"); + address protocolVersionsProxy = mustGetAddress("ProtocolVersionsProxy"); + address protocolVersions = mustGetAddress("ProtocolVersions"); + + address finalSystemOwner = cfg.finalSystemOwner(); + uint256 requiredProtocolVersion = cfg.requiredProtocolVersion(); + uint256 recommendedProtocolVersion = cfg.recommendedProtocolVersion(); + + _upgradeAndCallViaSafe({ + _proxy: payable(protocolVersionsProxy), + _implementation: protocolVersions, + _innerCallData: abi.encodeCall( + IProtocolVersions.initialize, + ( + finalSystemOwner, + ProtocolVersion.wrap(requiredProtocolVersion), + ProtocolVersion.wrap(recommendedProtocolVersion) + ) + ) + }); + + IProtocolVersions versions = IProtocolVersions(protocolVersionsProxy); + string memory version = versions.version(); + console.log("ProtocolVersions version: %s", version); + + ChainAssertions.checkProtocolVersions({ _contracts: _proxiesUnstrict(), _cfg: cfg, _isProxy: true }); + } + + /// @notice Transfer ownership of the DisputeGameFactory contract to the final system owner + function transferDisputeGameFactoryOwnership() public broadcast { + console.log("Transferring DisputeGameFactory ownership to Safe"); + IDisputeGameFactory disputeGameFactory = IDisputeGameFactory(mustGetAddress("DisputeGameFactoryProxy")); + address owner = disputeGameFactory.owner(); + + address safe = mustGetAddress("SystemOwnerSafe"); + if (owner != safe) { + disputeGameFactory.transferOwnership(safe); + console.log("DisputeGameFactory ownership transferred to Safe at: %s", safe); + } + ChainAssertions.checkDisputeGameFactory({ _contracts: _proxies(), _expectedOwner: safe }); + } + + /// @notice Transfer ownership of the DelayedWETH contract to the final system owner + function transferDelayedWETHOwnership() public broadcast { + console.log("Transferring DelayedWETH ownership to Safe"); + IDelayedWETH weth = IDelayedWETH(mustGetAddress("DelayedWETHProxy")); + address owner = weth.owner(); + + address safe = mustGetAddress("SystemOwnerSafe"); + if (owner != safe) { + weth.transferOwnership(safe); + console.log("DelayedWETH ownership transferred to Safe at: %s", safe); + } + ChainAssertions.checkDelayedWETH({ _contracts: _proxies(), _cfg: cfg, _isProxy: true, _expectedOwner: safe }); + } + + /// @notice Transfer ownership of the permissioned DelayedWETH contract to the final system owner + function transferPermissionedDelayedWETHOwnership() public broadcast { + console.log("Transferring permissioned DelayedWETH ownership to Safe"); + IDelayedWETH weth = IDelayedWETH(mustGetAddress("PermissionedDelayedWETHProxy")); + address owner = weth.owner(); + + address safe = mustGetAddress("SystemOwnerSafe"); + if (owner != safe) { + weth.transferOwnership(safe); + console.log("DelayedWETH ownership transferred to Safe at: %s", safe); + } + ChainAssertions.checkPermissionedDelayedWETH({ + _contracts: _proxies(), + _cfg: cfg, + _isProxy: true, + _expectedOwner: safe + }); + } + + /// @notice Load the appropriate mips absolute prestate for devenets depending on config environment. + function loadMipsAbsolutePrestate() internal returns (Claim mipsAbsolutePrestate_) { + if (block.chainid == Chains.LocalDevnet || block.chainid == Chains.GethDevnet) { + if (Config.useMultithreadedCannon()) { + return _loadDevnetMtMipsAbsolutePrestate(); + } else { + return _loadDevnetStMipsAbsolutePrestate(); + } + } else { + console.log( + "[Cannon Dispute Game] Using absolute prestate from config: %x", cfg.faultGameAbsolutePrestate() + ); + mipsAbsolutePrestate_ = Claim.wrap(bytes32(cfg.faultGameAbsolutePrestate())); + } + } + + /// @notice Loads the singlethreaded mips absolute prestate from the prestate-proof for devnets otherwise + /// from the config. + function _loadDevnetStMipsAbsolutePrestate() internal returns (Claim mipsAbsolutePrestate_) { + // Fetch the absolute prestate dump + string memory filePath = string.concat(vm.projectRoot(), "/../../op-program/bin/prestate-proof.json"); + string[] memory commands = new string[](3); + commands[0] = "bash"; + commands[1] = "-c"; + commands[2] = string.concat("[[ -f ", filePath, " ]] && echo \"present\""); + if (Process.run(commands).length == 0) { + revert("Cannon prestate dump not found, generate it with `make cannon-prestate` in the monorepo root."); + } + commands[2] = string.concat("cat ", filePath, " | jq -r .pre"); + mipsAbsolutePrestate_ = Claim.wrap(abi.decode(Process.run(commands), (bytes32))); + console.log( + "[Cannon Dispute Game] Using devnet MIPS Absolute prestate: %s", + vm.toString(Claim.unwrap(mipsAbsolutePrestate_)) + ); + } + + /// @notice Loads the multithreaded mips absolute prestate from the prestate-proof-mt for devnets otherwise + /// from the config. + function _loadDevnetMtMipsAbsolutePrestate() internal returns (Claim mipsAbsolutePrestate_) { + // Fetch the absolute prestate dump + string memory filePath = string.concat(vm.projectRoot(), "/../../op-program/bin/prestate-proof-mt.json"); + string[] memory commands = new string[](3); + commands[0] = "bash"; + commands[1] = "-c"; + commands[2] = string.concat("[[ -f ", filePath, " ]] && echo \"present\""); + if (Process.run(commands).length == 0) { + revert( + "MT-Cannon prestate dump not found, generate it with `make cannon-prestate-mt` in the monorepo root." + ); + } + commands[2] = string.concat("cat ", filePath, " | jq -r .pre"); + mipsAbsolutePrestate_ = Claim.wrap(abi.decode(Process.run(commands), (bytes32))); + console.log( + "[MT-Cannon Dispute Game] Using devnet MIPS2 Absolute prestate: %s", + vm.toString(Claim.unwrap(mipsAbsolutePrestate_)) + ); + } + + /// @notice Sets the implementation for the `CANNON` game type in the `DisputeGameFactory` + function setCannonFaultGameImplementation(bool _allowUpgrade) public broadcast { + console.log("Setting Cannon FaultDisputeGame implementation"); + IDisputeGameFactory factory = IDisputeGameFactory(mustGetAddress("DisputeGameFactoryProxy")); + IDelayedWETH weth = IDelayedWETH(mustGetAddress("DelayedWETHProxy")); + + // Set the Cannon FaultDisputeGame implementation in the factory. + _setFaultGameImplementation({ + _factory: factory, + _allowUpgrade: _allowUpgrade, + _params: FaultDisputeGameParams({ + anchorStateRegistry: IAnchorStateRegistry(mustGetAddress("AnchorStateRegistryProxy")), + weth: weth, + gameType: GameTypes.CANNON, + absolutePrestate: loadMipsAbsolutePrestate(), + faultVm: IBigStepper(mustGetAddress("Mips")), + maxGameDepth: cfg.faultGameMaxDepth(), + maxClockDuration: Duration.wrap(uint64(cfg.faultGameMaxClockDuration())) + }) + }); + } + + /// @notice Sets the implementation for the `PERMISSIONED_CANNON` game type in the `DisputeGameFactory` + function setPermissionedCannonFaultGameImplementation(bool _allowUpgrade) public broadcast { + console.log("Setting Cannon PermissionedDisputeGame implementation"); + IDisputeGameFactory factory = IDisputeGameFactory(mustGetAddress("DisputeGameFactoryProxy")); + IDelayedWETH weth = IDelayedWETH(mustGetAddress("PermissionedDelayedWETHProxy")); + + // Set the Cannon FaultDisputeGame implementation in the factory. + _setFaultGameImplementation({ + _factory: factory, + _allowUpgrade: _allowUpgrade, + _params: FaultDisputeGameParams({ + anchorStateRegistry: IAnchorStateRegistry(mustGetAddress("AnchorStateRegistryProxy")), + weth: weth, + gameType: GameTypes.PERMISSIONED_CANNON, + absolutePrestate: loadMipsAbsolutePrestate(), + faultVm: IBigStepper(mustGetAddress("Mips")), + maxGameDepth: cfg.faultGameMaxDepth(), + maxClockDuration: Duration.wrap(uint64(cfg.faultGameMaxClockDuration())) + }) + }); + } + + /// @notice Sets the implementation for the `ALPHABET` game type in the `DisputeGameFactory` + function setAlphabetFaultGameImplementation(bool _allowUpgrade) public onlyDevnet broadcast { + console.log("Setting Alphabet FaultDisputeGame implementation"); + IDisputeGameFactory factory = IDisputeGameFactory(mustGetAddress("DisputeGameFactoryProxy")); + IDelayedWETH weth = IDelayedWETH(mustGetAddress("DelayedWETHProxy")); + + Claim outputAbsolutePrestate = Claim.wrap(bytes32(cfg.faultGameAbsolutePrestate())); + _setFaultGameImplementation({ + _factory: factory, + _allowUpgrade: _allowUpgrade, + _params: FaultDisputeGameParams({ + anchorStateRegistry: IAnchorStateRegistry(mustGetAddress("AnchorStateRegistryProxy")), + weth: weth, + gameType: GameTypes.ALPHABET, + absolutePrestate: outputAbsolutePrestate, + faultVm: IBigStepper(new AlphabetVM(outputAbsolutePrestate, PreimageOracle(mustGetAddress("PreimageOracle")))), + // The max depth for the alphabet trace is always 3. Add 1 because split depth is fully inclusive. + maxGameDepth: cfg.faultGameSplitDepth() + 3 + 1, + maxClockDuration: Duration.wrap(uint64(cfg.faultGameMaxClockDuration())) + }) + }); + } + + /// @notice Sets the implementation for the `ALPHABET` game type in the `DisputeGameFactory` + function setFastFaultGameImplementation(bool _allowUpgrade) public onlyDevnet broadcast { + console.log("Setting Fast FaultDisputeGame implementation"); + IDisputeGameFactory factory = IDisputeGameFactory(mustGetAddress("DisputeGameFactoryProxy")); + IDelayedWETH weth = IDelayedWETH(mustGetAddress("DelayedWETHProxy")); + + Claim outputAbsolutePrestate = Claim.wrap(bytes32(cfg.faultGameAbsolutePrestate())); + PreimageOracle fastOracle = new PreimageOracle(cfg.preimageOracleMinProposalSize(), 0); + _setFaultGameImplementation({ + _factory: factory, + _allowUpgrade: _allowUpgrade, + _params: FaultDisputeGameParams({ + anchorStateRegistry: IAnchorStateRegistry(mustGetAddress("AnchorStateRegistryProxy")), + weth: weth, + gameType: GameTypes.FAST, + absolutePrestate: outputAbsolutePrestate, + faultVm: IBigStepper(new AlphabetVM(outputAbsolutePrestate, fastOracle)), + // The max depth for the alphabet trace is always 3. Add 1 because split depth is fully inclusive. + maxGameDepth: cfg.faultGameSplitDepth() + 3 + 1, + maxClockDuration: Duration.wrap(0) // Resolvable immediately + }) + }); + } + + /// @notice Sets the implementation for the given fault game type in the `DisputeGameFactory`. + function _setFaultGameImplementation( + IDisputeGameFactory _factory, + bool _allowUpgrade, + FaultDisputeGameParams memory _params + ) + internal + { + if (address(_factory.gameImpls(_params.gameType)) != address(0) && !_allowUpgrade) { + console.log( + "[WARN] DisputeGameFactoryProxy: `FaultDisputeGame` implementation already set for game type: %s", + vm.toString(GameType.unwrap(_params.gameType)) + ); + return; + } + + uint32 rawGameType = GameType.unwrap(_params.gameType); + if (rawGameType != GameTypes.PERMISSIONED_CANNON.raw()) { + _factory.setImplementation( + _params.gameType, + IDisputeGame( + _deploy( + "FaultDisputeGame", + string.concat("FaultDisputeGame_", vm.toString(rawGameType)), + abi.encode( + _params.gameType, + _params.absolutePrestate, + _params.maxGameDepth, + cfg.faultGameSplitDepth(), + cfg.faultGameClockExtension(), + _params.maxClockDuration, + _params.faultVm, + _params.weth, + IAnchorStateRegistry(mustGetAddress("AnchorStateRegistryProxy")), + cfg.l2ChainID() + ) + ) + ) + ); + } else { + _factory.setImplementation( + _params.gameType, + IDisputeGame( + _deploy( + "PermissionedDisputeGame", + abi.encode( + _params.gameType, + _params.absolutePrestate, + _params.maxGameDepth, + cfg.faultGameSplitDepth(), + cfg.faultGameClockExtension(), + _params.maxClockDuration, + _params.faultVm, + _params.weth, + _params.anchorStateRegistry, + cfg.l2ChainID(), + cfg.l2OutputOracleProposer(), + cfg.l2OutputOracleChallenger() + ) + ) + ) + ); + } + + string memory gameTypeString; + if (rawGameType == GameTypes.CANNON.raw()) { + gameTypeString = "Cannon"; + } else if (rawGameType == GameTypes.PERMISSIONED_CANNON.raw()) { + gameTypeString = "PermissionedCannon"; + } else if (rawGameType == GameTypes.ALPHABET.raw()) { + gameTypeString = "Alphabet"; + } else { + gameTypeString = "Unknown"; + } + + console.log( + "DisputeGameFactoryProxy: set `FaultDisputeGame` implementation (Backend: %s | GameType: %s)", + gameTypeString, + vm.toString(rawGameType) + ); + } + + /// @notice Initialize the DataAvailabilityChallenge + function initializeDataAvailabilityChallenge() public broadcast { + console.log("Upgrading and initializing DataAvailabilityChallenge proxy"); + address dataAvailabilityChallengeProxy = mustGetAddress("DataAvailabilityChallengeProxy"); + address dataAvailabilityChallenge = mustGetAddress("DataAvailabilityChallenge"); + + address finalSystemOwner = cfg.finalSystemOwner(); + uint256 daChallengeWindow = cfg.daChallengeWindow(); + uint256 daResolveWindow = cfg.daResolveWindow(); + uint256 daBondSize = cfg.daBondSize(); + uint256 daResolverRefundPercentage = cfg.daResolverRefundPercentage(); + + _upgradeAndCallViaSafe({ + _proxy: payable(dataAvailabilityChallengeProxy), + _implementation: dataAvailabilityChallenge, + _innerCallData: abi.encodeCall( + IDataAvailabilityChallenge.initialize, + (finalSystemOwner, daChallengeWindow, daResolveWindow, daBondSize, daResolverRefundPercentage) + ) + }); + + IDataAvailabilityChallenge dac = IDataAvailabilityChallenge(payable(dataAvailabilityChallengeProxy)); + string memory version = dac.version(); + console.log("DataAvailabilityChallenge version: %s", version); + + require(dac.owner() == finalSystemOwner); + require(dac.challengeWindow() == daChallengeWindow); + require(dac.resolveWindow() == daResolveWindow); + require(dac.bondSize() == daBondSize); + require(dac.resolverRefundPercentage() == daResolverRefundPercentage); + } + + /// @notice Deploys a contract via CREATE2. + /// @param _name The name of the contract. + /// @param _constructorParams The constructor parameters. + function _deploy(string memory _name, bytes memory _constructorParams) internal returns (address addr_) { + return _deploy(_name, _name, _constructorParams); + } + + /// @notice Deploys a contract via CREATE2. + /// @param _name The name of the contract. + /// @param _nickname The nickname of the contract. + /// @param _constructorParams The constructor parameters. + function _deploy( + string memory _name, + string memory _nickname, + bytes memory _constructorParams + ) + internal + returns (address addr_) + { + console.log("Deploying %s", _nickname); + bytes32 salt = _implSalt(); + bytes memory initCode = abi.encodePacked(vm.getCode(_name), _constructorParams); + address preComputedAddress = vm.computeCreate2Address(salt, keccak256(initCode)); + require(preComputedAddress.code.length == 0, "Deploy: contract already deployed"); + assembly { + addr_ := create2(0, add(initCode, 0x20), mload(initCode), salt) + } + require(addr_ != address(0), "deployment failed"); + save(_nickname, addr_); + console.log("%s deployed at %s", _nickname, addr_); + } +} diff --git a/packages/contracts-bedrock/scripts/DeployConfig.s.sol b/packages/contracts-bedrock/scripts/deploy/DeployConfig.s.sol similarity index 78% rename from packages/contracts-bedrock/scripts/DeployConfig.s.sol rename to packages/contracts-bedrock/scripts/deploy/DeployConfig.s.sol index deef8ef7a255..8e82d0cd0e1f 100644 --- a/packages/contracts-bedrock/scripts/DeployConfig.s.sol +++ b/packages/contracts-bedrock/scripts/deploy/DeployConfig.s.sol @@ -4,14 +4,22 @@ pragma solidity 0.8.15; import { Script } from "forge-std/Script.sol"; import { console2 as console } from "forge-std/console2.sol"; import { stdJson } from "forge-std/StdJson.sol"; -import { Executables } from "scripts/Executables.sol"; -import { Chains } from "scripts/Chains.sol"; +import { Executables } from "scripts/libraries/Executables.sol"; +import { Process } from "scripts/libraries/Process.sol"; +import { Chains } from "scripts/libraries/Chains.sol"; +import { Config, Fork, ForkUtils } from "scripts/libraries/Config.sol"; /// @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 /// values if they are not defined in the JSON themselves. contract DeployConfig is Script { + using stdJson for string; + using ForkUtils for Fork; + + /// @notice Represents an unset offset value, as opposed to 0, which denotes no-offset. + uint256 constant NULL_OFFSET = type(uint256).max; + string internal _json; address public finalSystemOwner; @@ -19,6 +27,10 @@ contract DeployConfig is Script { uint256 public l1ChainID; uint256 public l2ChainID; uint256 public l2BlockTime; + uint256 public l2GenesisDeltaTimeOffset; + uint256 public l2GenesisEcotoneTimeOffset; + uint256 public l2GenesisFjordTimeOffset; + uint256 public l2GenesisGraniteTimeOffset; uint256 public maxSequencerDrift; uint256 public sequencerWindowSize; uint256 public channelTimeout; @@ -68,7 +80,8 @@ contract DeployConfig is Script { uint256 public disputeGameFinalityDelaySeconds; uint256 public respectedGameType; bool public useFaultProofs; - bool public usePlasma; + bool public useAltDA; + string public daCommitmentType; uint256 public daChallengeWindow; uint256 public daResolveWindow; uint256 public daBondSize; @@ -94,6 +107,12 @@ contract DeployConfig is Script { l1ChainID = stdJson.readUint(_json, "$.l1ChainID"); l2ChainID = stdJson.readUint(_json, "$.l2ChainID"); l2BlockTime = stdJson.readUint(_json, "$.l2BlockTime"); + + l2GenesisDeltaTimeOffset = _readOr(_json, "$.l2GenesisDeltaTimeOffset", NULL_OFFSET); + l2GenesisEcotoneTimeOffset = _readOr(_json, "$.l2GenesisEcotoneTimeOffset", NULL_OFFSET); + l2GenesisFjordTimeOffset = _readOr(_json, "$.l2GenesisFjordTimeOffset", NULL_OFFSET); + l2GenesisGraniteTimeOffset = _readOr(_json, "$.l2GenesisGraniteTimeOffset", NULL_OFFSET); + maxSequencerDrift = stdJson.readUint(_json, "$.maxSequencerDrift"); sequencerWindowSize = stdJson.readUint(_json, "$.sequencerWindowSize"); channelTimeout = stdJson.readUint(_json, "$.channelTimeout"); @@ -148,7 +167,8 @@ contract DeployConfig is Script { preimageOracleMinProposalSize = stdJson.readUint(_json, "$.preimageOracleMinProposalSize"); preimageOracleChallengePeriod = stdJson.readUint(_json, "$.preimageOracleChallengePeriod"); - usePlasma = _readOr(_json, "$.usePlasma", false); + useAltDA = _readOr(_json, "$.useAltDA", false); + daCommitmentType = _readOr(_json, "$.daCommitmentType", "KeccakCommitment"); daChallengeWindow = _readOr(_json, "$.daChallengeWindow", 1000); daResolveWindow = _readOr(_json, "$.daResolveWindow", 1000); daBondSize = _readOr(_json, "$.daBondSize", 1000000000); @@ -162,6 +182,18 @@ contract DeployConfig is Script { isSoulBackedByNative = _readOr(_json, "$.isSoulBackedByNative", false); } + function fork() public view returns (Fork fork_) { + // let env var take precedence + fork_ = Config.fork(); + if (fork_ == Fork.NONE) { + // Will revert if no deploy config can be found either. + fork_ = latestGenesisFork(); + console.log("DeployConfig: using deploy config fork: %s", fork_.toString()); + } else { + console.log("DeployConfig: using env var fork: %s", fork_.toString()); + } + } + function l1StartingBlockTag() public returns (bytes32) { try vm.parseJsonBytes32(_json, "$.l1StartingBlockTag") returns (bytes32 tag) { return tag; @@ -184,15 +216,15 @@ contract DeployConfig is Script { cmd[0] = Executables.bash; cmd[1] = "-c"; cmd[2] = string.concat("cast block ", vm.toString(tag), " --json | ", Executables.jq, " .timestamp"); - bytes memory res = vm.ffi(cmd); + bytes memory res = Process.run(cmd); return stdJson.readUint(string(res), ""); } return uint256(_l2OutputOracleStartingTimestamp); } - /// @notice Allow the `usePlasma` config to be overridden in testing environments - function setUsePlasma(bool _usePlasma) public { - usePlasma = _usePlasma; + /// @notice Allow the `useAltDA` config to be overridden in testing environments + function setUseAltDA(bool _useAltDA) public { + useAltDA = _useAltDA; } /// @notice Allow the `useFaultProofs` config to be overridden in testing environments @@ -216,24 +248,54 @@ contract DeployConfig is Script { customGasTokenAddress = _token; } + function latestGenesisFork() internal view returns (Fork) { + if (l2GenesisGraniteTimeOffset == 0) { + return Fork.GRANITE; + } else if (l2GenesisFjordTimeOffset == 0) { + return Fork.FJORD; + } else if (l2GenesisEcotoneTimeOffset == 0) { + return Fork.ECOTONE; + } else if (l2GenesisDeltaTimeOffset == 0) { + return Fork.DELTA; + } + revert("DeployConfig: no supported fork active at genesis"); + } + function _getBlockByTag(string memory _tag) internal returns (bytes32) { string[] memory cmd = new string[](3); cmd[0] = Executables.bash; cmd[1] = "-c"; cmd[2] = string.concat("cast block ", _tag, " --json | ", Executables.jq, " -r .hash"); - bytes memory res = vm.ffi(cmd); + bytes memory res = Process.run(cmd); return abi.decode(res, (bytes32)); } function _readOr(string memory json, string memory key, bool defaultValue) internal view returns (bool) { - return vm.keyExists(json, key) ? stdJson.readBool(json, key) : defaultValue; + return vm.keyExistsJson(json, key) ? json.readBool(key) : defaultValue; } function _readOr(string memory json, string memory key, uint256 defaultValue) internal view returns (uint256) { - return vm.keyExists(json, key) ? stdJson.readUint(json, key) : defaultValue; + return (vm.keyExistsJson(json, key) && !_isNull(json, key)) ? json.readUint(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; + return vm.keyExistsJson(json, key) ? json.readAddress(key) : defaultValue; + } + + function _isNull(string memory json, string memory key) internal pure returns (bool) { + string memory value = json.readString(key); + return (keccak256(bytes(value)) == keccak256(bytes("null"))); + } + + function _readOr( + string memory json, + string memory key, + string memory defaultValue + ) + internal + view + returns (string memory) + { + return vm.keyExists(json, key) ? json.readString(key) : defaultValue; } } diff --git a/packages/contracts-bedrock/scripts/DeployOwnership.s.sol b/packages/contracts-bedrock/scripts/deploy/DeployOwnership.s.sol similarity index 79% rename from packages/contracts-bedrock/scripts/DeployOwnership.s.sol rename to packages/contracts-bedrock/scripts/deploy/DeployOwnership.s.sol index 1bc866ea1137..252b4703b203 100644 --- a/packages/contracts-bedrock/scripts/DeployOwnership.s.sol +++ b/packages/contracts-bedrock/scripts/deploy/DeployOwnership.s.sol @@ -9,12 +9,12 @@ 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 { Deployer } from "scripts/deploy/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 { LivenessGuard } from "src/safe/LivenessGuard.sol"; +import { LivenessModule } from "src/safe/LivenessModule.sol"; +import { DeputyGuardianModule } from "src/safe/DeputyGuardianModule.sol"; +import { ISuperchainConfig } from "src/L1/interfaces/ISuperchainConfig.sol"; import { Deploy } from "./Deploy.s.sol"; @@ -41,7 +41,7 @@ struct SecurityCouncilConfig { /// @notice Configuration for the Deputy Guardian Module struct DeputyGuardianModuleConfig { address deputyGuardian; - SuperchainConfig superchainConfig; + ISuperchainConfig superchainConfig; } /// @notice Configuration for the Guardian Safe. @@ -50,9 +50,6 @@ struct GuardianConfig { DeputyGuardianModuleConfig deputyGuardianModuleConfig; } -// The sentinel address is used to mark the start and end of the linked list of owners in the Safe. -address constant SENTINEL_OWNERS = address(0x1); - /// @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 @@ -65,7 +62,8 @@ contract DeployOwnership is Deploy { // The SuperchainConfig is needed as a constructor argument to the Deputy Guardian Module deploySuperchainConfig(); - deployFoundationSafe(); + deployFoundationOperationsSafe(); + deployFoundationUpgradeSafe(); deploySecurityCouncilSafe(); deployGuardianSafe(); configureGuardianSafe(); @@ -84,14 +82,14 @@ contract DeployOwnership is Deploy { } /// @notice Returns a GuardianConfig similar to that of the Guardian Safe on Mainnet. - function _getExampleGuardianConfig() internal returns (GuardianConfig memory guardianConfig_) { + 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("FoundationSafe"), - superchainConfig: SuperchainConfig(mustGetAddress("SuperchainConfig")) + deputyGuardian: mustGetAddress("FoundationOperationsSafe"), + superchainConfig: ISuperchainConfig(mustGetAddress("SuperchainConfig")) }) }); } @@ -106,24 +104,34 @@ contract DeployOwnership is Deploy { councilConfig_ = SecurityCouncilConfig({ safeConfig: safeConfig, livenessModuleConfig: LivenessModuleConfig({ - livenessInterval: 24 weeks, + livenessInterval: 14 weeks, thresholdPercentage: 75, minOwners: 8, - fallbackOwner: mustGetAddress("FoundationSafe") + fallbackOwner: mustGetAddress("FoundationUpgradeSafe") }) }); } /// @notice Deploys a Safe with a configuration similar to that of the Foundation Safe on Mainnet. - function deployFoundationSafe() public broadcast returns (address addr_) { + 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: "FoundationSafe", + _name: "FoundationUpgradeSafe", _owners: exampleFoundationConfig.owners, _threshold: exampleFoundationConfig.threshold, _keepDeployer: false }); - console.log("Deployed and configured the Foundation Safe!"); } /// @notice Deploy a LivenessGuard for use on the Security Council Safe. @@ -161,13 +169,12 @@ contract DeployOwnership is Deploy { /// @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_) { - SecurityCouncilConfig memory councilConfig = _getExampleCouncilConfig(); - Safe councilSafe = Safe(payable(mustGetAddress("SecurityCouncilSafe"))); + Safe guardianSafe = Safe(payable(mustGetAddress("GuardianSafe"))); DeputyGuardianModuleConfig memory deputyGuardianModuleConfig = _getExampleGuardianConfig().deputyGuardianModuleConfig; addr_ = address( new DeputyGuardianModule({ - _safe: councilSafe, + _safe: guardianSafe, _superchainConfig: deputyGuardianModuleConfig.superchainConfig, _deputyGuardian: deputyGuardianModuleConfig.deputyGuardian }) @@ -203,23 +210,16 @@ contract DeployOwnership is Deploy { /// @notice Configure the Guardian Safe with the DeputyGuardianModule. function configureGuardianSafe() public broadcast returns (address addr_) { - Safe safe = Safe(payable(mustGetAddress("GuardianSafe"))); + addr_ = mustGetAddress("GuardianSafe"); address deputyGuardianModule = deployDeputyGuardianModule(); _callViaSafe({ - _safe: safe, - _target: address(safe), + _safe: Safe(payable(addr_)), + _target: addr_, _data: abi.encodeCall(ModuleManager.enableModule, (deputyGuardianModule)) }); - // Remove the deployer address (msg.sender) which was used to setup the Security Council Safe thus far - // this call is also used to update the threshold. - // Because deploySafe() always adds msg.sender first (if keepDeployer is true), we know that the previousOwner - // will be SENTINEL_OWNERS. - _callViaSafe({ - _safe: safe, - _target: address(safe), - _data: abi.encodeCall(OwnerManager.removeOwner, (SENTINEL_OWNERS, msg.sender, 1)) - }); + // Finalize configuration by removing the additional deployer key. + removeDeployerFromSafe({ _name: "GuardianSafe", _newThreshold: 1 }); console.log("DeputyGuardianModule enabled on GuardianSafe"); } @@ -242,22 +242,15 @@ contract DeployOwnership is Deploy { _data: abi.encodeCall(ModuleManager.enableModule, (livenessModule)) }); - // Remove the deployer address (msg.sender) which was used to setup the Security Council Safe thus far - // this call is also used to update the threshold. - // Because deploySafe() always adds msg.sender first (if keepDeployer is true), we know that the previousOwner - // will be SENTINEL_OWNERS. - _callViaSafe({ - _safe: safe, - _target: address(safe), - _data: abi.encodeCall( - OwnerManager.removeOwner, (SENTINEL_OWNERS, msg.sender, exampleCouncilConfig.safeConfig.threshold) - ) - }); + // 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/Deployer.sol b/packages/contracts-bedrock/scripts/deploy/Deployer.sol similarity index 83% rename from packages/contracts-bedrock/scripts/Deployer.sol rename to packages/contracts-bedrock/scripts/deploy/Deployer.sol index aac3f5ac8ec2..36de8dd440fc 100644 --- a/packages/contracts-bedrock/scripts/Deployer.sol +++ b/packages/contracts-bedrock/scripts/deploy/Deployer.sol @@ -3,9 +3,9 @@ pragma solidity ^0.8.0; 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 { Executables } from "scripts/Executables.sol"; +import { Config } from "scripts/libraries/Config.sol"; +import { DeployConfig } from "scripts/deploy/DeployConfig.s.sol"; +import { Executables } from "scripts/libraries/Executables.sol"; import { console } from "forge-std/console.sol"; /// @title Deployer diff --git a/packages/contracts-bedrock/scripts/deploy/deploy.sh b/packages/contracts-bedrock/scripts/deploy/deploy.sh new file mode 100755 index 000000000000..bc497e0b8568 --- /dev/null +++ b/packages/contracts-bedrock/scripts/deploy/deploy.sh @@ -0,0 +1,15 @@ +#!/usr/bin/env bash +set -euo pipefail + +verify_flag="" +if [ -n "${DEPLOY_VERIFY:-}" ]; then + verify_flag="--verify" +fi + +echo "> Deploying contracts" +forge script -vvv scripts/deploy/Deploy.s.sol:Deploy --rpc-url "$DEPLOY_ETH_RPC_URL" --broadcast --private-key "$DEPLOY_PRIVATE_KEY" $verify_flag + +if [ -n "${DEPLOY_GENERATE_HARDHAT_ARTIFACTS:-}" ]; then + echo "> Generating hardhat artifacts" + forge script -vvv scripts/deploy/Deploy.s.sol:Deploy --sig 'sync()' --rpc-url "$DEPLOY_ETH_RPC_URL" --broadcast --private-key "$DEPLOY_PRIVATE_KEY" +fi diff --git a/packages/contracts-bedrock/scripts/fpac/FPACOPS.s.sol b/packages/contracts-bedrock/scripts/fpac/FPACOPS.s.sol index 434b5274d929..2dc07b525bd0 100644 --- a/packages/contracts-bedrock/scripts/fpac/FPACOPS.s.sol +++ b/packages/contracts-bedrock/scripts/fpac/FPACOPS.s.sol @@ -1,13 +1,22 @@ // SPDX-License-Identifier: MIT pragma solidity 0.8.15; +// Scripts +import { StdAssertions } from "forge-std/StdAssertions.sol"; +import "scripts/deploy/Deploy.s.sol"; + +// Contracts import { Proxy } from "src/universal/Proxy.sol"; + +// Libraries +import "src/dispute/lib/Types.sol"; + +// Interfaces import { IDisputeGame } from "src/dispute/interfaces/IDisputeGame.sol"; -import { AnchorStateRegistry, IAnchorStateRegistry } from "src/dispute/AnchorStateRegistry.sol"; +import { IAnchorStateRegistry } from "src/dispute/interfaces/IAnchorStateRegistry.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"; +import { IFaultDisputeGame } from "src/dispute/interfaces/IFaultDisputeGame.sol"; +import { IPermissionedDisputeGame } from "src/dispute/interfaces/IPermissionedDisputeGame.sol"; /// @notice Deploys the Fault Proof Alpha Chad contracts. contract FPACOPS is Deploy, StdAssertions { @@ -70,11 +79,11 @@ contract FPACOPS is Deploy, StdAssertions { address dgfProxy = mustGetAddress("DisputeGameFactoryProxy"); Proxy(payable(dgfProxy)).upgradeToAndCall( - mustGetAddress("DisputeGameFactory"), abi.encodeCall(DisputeGameFactory.initialize, msg.sender) + mustGetAddress("DisputeGameFactory"), abi.encodeCall(IDisputeGameFactory.initialize, msg.sender) ); // Set the initialization bonds for the FaultDisputeGame and PermissionedDisputeGame. - DisputeGameFactory dgf = DisputeGameFactory(dgfProxy); + IDisputeGameFactory dgf = IDisputeGameFactory(dgfProxy); dgf.setInitBond(GameTypes.CANNON, 0.08 ether); dgf.setInitBond(GameTypes.PERMISSIONED_CANNON, 0.08 ether); } @@ -86,22 +95,24 @@ contract FPACOPS is Deploy, StdAssertions { address superchainConfigProxy = mustGetAddress("SuperchainConfigProxy"); Proxy(payable(wethProxy)).upgradeToAndCall( mustGetAddress("DelayedWETH"), - abi.encodeCall(DelayedWETH.initialize, (msg.sender, SuperchainConfig(superchainConfigProxy))) + abi.encodeCall(IDelayedWETH.initialize, (msg.sender, ISuperchainConfig(superchainConfigProxy))) ); } function initializeAnchorStateRegistryProxy() internal broadcast { console.log("Initializing AnchorStateRegistryProxy with AnchorStateRegistry."); + address superchainConfigProxy = mustGetAddress("SuperchainConfigProxy"); + ISuperchainConfig superchainConfig = ISuperchainConfig(superchainConfigProxy); - AnchorStateRegistry.StartingAnchorRoot[] memory roots = new AnchorStateRegistry.StartingAnchorRoot[](2); - roots[0] = AnchorStateRegistry.StartingAnchorRoot({ + IAnchorStateRegistry.StartingAnchorRoot[] memory roots = new IAnchorStateRegistry.StartingAnchorRoot[](2); + roots[0] = IAnchorStateRegistry.StartingAnchorRoot({ gameType: GameTypes.CANNON, outputRoot: OutputRoot({ root: Hash.wrap(cfg.faultGameGenesisOutputRoot()), l2BlockNumber: cfg.faultGameGenesisBlock() }) }); - roots[1] = AnchorStateRegistry.StartingAnchorRoot({ + roots[1] = IAnchorStateRegistry.StartingAnchorRoot({ gameType: GameTypes.PERMISSIONED_CANNON, outputRoot: OutputRoot({ root: Hash.wrap(cfg.faultGameGenesisOutputRoot()), @@ -111,14 +122,15 @@ contract FPACOPS is Deploy, StdAssertions { address asrProxy = mustGetAddress("AnchorStateRegistryProxy"); Proxy(payable(asrProxy)).upgradeToAndCall( - mustGetAddress("AnchorStateRegistry"), abi.encodeCall(AnchorStateRegistry.initialize, (roots)) + mustGetAddress("AnchorStateRegistry"), + abi.encodeCall(IAnchorStateRegistry.initialize, (roots, superchainConfig)) ); } /// @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 { - DisputeGameFactory dgf = DisputeGameFactory(mustGetAddress("DisputeGameFactoryProxy")); + IDisputeGameFactory dgf = IDisputeGameFactory(mustGetAddress("DisputeGameFactoryProxy")); // Transfer the ownership of the DisputeGameFactory to the SystemOwnerSafe. dgf.transferOwnership(_systemOwnerSafe); @@ -131,7 +143,7 @@ contract FPACOPS is Deploy, StdAssertions { /// @notice Transfers admin rights of the `DelayedWETHProxy` to the `ProxyAdmin` and sets the /// `DelayedWETH` owner to the `SystemOwnerSafe`. function transferWethOwnershipFinal(address _proxyAdmin, address _systemOwnerSafe) internal broadcast { - DelayedWETH weth = DelayedWETH(mustGetAddress("DelayedWETHProxy")); + IDelayedWETH weth = IDelayedWETH(mustGetAddress("DelayedWETHProxy")); // Transfer the ownership of the DelayedWETH to the SystemOwnerSafe. weth.transferOwnership(_systemOwnerSafe); @@ -143,7 +155,7 @@ contract FPACOPS is Deploy, StdAssertions { /// @notice Transfers admin rights of the `AnchorStateRegistryProxy` to the `ProxyAdmin`. function transferAnchorStateOwnershipFinal(address _proxyAdmin) internal broadcast { - AnchorStateRegistry asr = AnchorStateRegistry(mustGetAddress("AnchorStateRegistryProxy")); + IAnchorStateRegistry asr = IAnchorStateRegistry(mustGetAddress("AnchorStateRegistryProxy")); // Transfer the admin rights of the AnchorStateRegistryProxy to the ProxyAdmin. Proxy prox = Proxy(payable(address(asr))); @@ -160,7 +172,7 @@ contract FPACOPS is Deploy, StdAssertions { // Ensure the contracts are owned by the correct entities. address dgfProxyAddr = mustGetAddress("DisputeGameFactoryProxy"); - DisputeGameFactory dgfProxy = DisputeGameFactory(dgfProxyAddr); + IDisputeGameFactory dgfProxy = IDisputeGameFactory(dgfProxyAddr); assertEq(address(uint160(uint256(vm.load(dgfProxyAddr, Constants.PROXY_OWNER_ADDRESS)))), _proxyAdmin); ChainAssertions.checkDisputeGameFactory(contracts, _systemOwnerSafe); address wethProxyAddr = mustGetAddress("DelayedWETHProxy"); @@ -178,7 +190,7 @@ contract FPACOPS is Deploy, StdAssertions { assertEq(address(mips.oracle()), address(oracle)); // Check the AnchorStateRegistry configuration. - AnchorStateRegistry asr = AnchorStateRegistry(mustGetAddress("AnchorStateRegistryProxy")); + IAnchorStateRegistry asr = IAnchorStateRegistry(mustGetAddress("AnchorStateRegistryProxy")); (Hash root1, uint256 l2BlockNumber1) = asr.anchors(GameTypes.CANNON); (Hash root2, uint256 l2BlockNumber2) = asr.anchors(GameTypes.PERMISSIONED_CANNON); assertEq(root1.raw(), cfg.faultGameGenesisOutputRoot()); @@ -187,7 +199,7 @@ contract FPACOPS is Deploy, StdAssertions { assertEq(l2BlockNumber2, cfg.faultGameGenesisBlock()); // Check the FaultDisputeGame configuration. - FaultDisputeGame gameImpl = FaultDisputeGame(payable(address(dgfProxy.gameImpls(GameTypes.CANNON)))); + IFaultDisputeGame gameImpl = IFaultDisputeGame(payable(address(dgfProxy.gameImpls(GameTypes.CANNON)))); assertEq(gameImpl.maxGameDepth(), cfg.faultGameMaxDepth()); assertEq(gameImpl.splitDepth(), cfg.faultGameSplitDepth()); assertEq(gameImpl.clockExtension().raw(), cfg.faultGameClockExtension()); @@ -198,8 +210,8 @@ contract FPACOPS is Deploy, StdAssertions { assertEq(address(gameImpl.vm()), address(mips)); // Check the security override yoke configuration. - PermissionedDisputeGame soyGameImpl = - PermissionedDisputeGame(payable(address(dgfProxy.gameImpls(GameTypes.PERMISSIONED_CANNON)))); + IPermissionedDisputeGame soyGameImpl = + IPermissionedDisputeGame(payable(address(dgfProxy.gameImpls(GameTypes.PERMISSIONED_CANNON)))); assertEq(soyGameImpl.proposer(), cfg.l2OutputOracleProposer()); assertEq(soyGameImpl.challenger(), cfg.l2OutputOracleChallenger()); assertEq(soyGameImpl.maxGameDepth(), cfg.faultGameMaxDepth()); diff --git a/packages/contracts-bedrock/scripts/fpac/FPACOPS2.s.sol b/packages/contracts-bedrock/scripts/fpac/FPACOPS2.s.sol new file mode 100644 index 000000000000..0f5962a50d02 --- /dev/null +++ b/packages/contracts-bedrock/scripts/fpac/FPACOPS2.s.sol @@ -0,0 +1,278 @@ +// SPDX-License-Identifier: MIT +pragma solidity 0.8.15; + +// Scripts +import { StdAssertions } from "forge-std/StdAssertions.sol"; +import "scripts/deploy/Deploy.s.sol"; + +// Contracts +import { Proxy } from "src/universal/Proxy.sol"; + +// Libraries +import "src/dispute/lib/Types.sol"; + +// Interfaces +import { IDisputeGame } from "src/dispute/interfaces/IDisputeGame.sol"; +import { IAnchorStateRegistry } from "src/dispute/interfaces/IAnchorStateRegistry.sol"; +import { IDelayedWETH } from "src/dispute/interfaces/IDelayedWETH.sol"; +import { IFaultDisputeGame } from "src/dispute/interfaces/IFaultDisputeGame.sol"; +import { IPermissionedDisputeGame } from "src/dispute/interfaces/IPermissionedDisputeGame.sol"; + +/// @notice Deploys new implementations of the FaultDisputeGame contract and its dependencies +/// assuming that the DisputeGameFactory contract does not need to be modified. Assumes +/// that the System Owner will update the DisputeGameFactory to point to these new +/// contracts at a later point in time. +contract FPACOPS2 is Deploy, StdAssertions { + //////////////////////////////////////////////////////////////// + // ENTRYPOINTS // + //////////////////////////////////////////////////////////////// + + /// @notice Deploys an updated FP system with new FaultDisputeGame contracts and new + /// DelayedWETH contracts. Deploys a new implementation of the + /// AnchorStateRegistry. Does not deploy a new DisputeGameFactory. System + /// Owner is responsible for updating implementations later. + /// @param _proxyAdmin Address of the ProxyAdmin contract to transfer ownership to. + /// @param _systemOwnerSafe Address of the SystemOwner. + /// @param _superchainConfigProxy Address of the SuperchainConfig proxy contract. + /// @param _disputeGameFactoryProxy Address of the DisputeGameFactory proxy contract. + /// @param _anchorStateRegistryProxy Address of the AnchorStateRegistry proxy contract. + function deployFPAC2( + address _proxyAdmin, + address _systemOwnerSafe, + address _superchainConfigProxy, + address _disputeGameFactoryProxy, + address _anchorStateRegistryProxy + ) + public + { + console.log("Deploying updated FP contracts."); + + // Prank required deployments. + prankDeployment("ProxyAdmin", msg.sender); + prankDeployment("SystemOwnerSafe", msg.sender); + prankDeployment("SuperchainConfigProxy", _superchainConfigProxy); + prankDeployment("DisputeGameFactoryProxy", _disputeGameFactoryProxy); + prankDeployment("AnchorStateRegistryProxy", _anchorStateRegistryProxy); + + // Deploy the proxies. + deployERC1967Proxy("DelayedWETHProxy"); + deployERC1967Proxy("PermissionedDelayedWETHProxy"); + + // Deploy implementations. + deployDelayedWETH(); + deployAnchorStateRegistry(); + deployPreimageOracle(); + deployMips(); + + // Initialize the proxies. + initializeDelayedWETHProxy(); + initializePermissionedDelayedWETHProxy(); + + // Deploy the new game implementations. + deployCannonDisputeGame(); + deployPermissionedDisputeGame(); + + // Transfer ownership of DelayedWETH to ProxyAdmin. + transferWethOwnershipFinal({ _proxyAdmin: _proxyAdmin, _systemOwnerSafe: _systemOwnerSafe }); + transferPermissionedWETHOwnershipFinal({ _proxyAdmin: _proxyAdmin, _systemOwnerSafe: _systemOwnerSafe }); + + // Run post-deployment assertions. + postDeployAssertions({ _proxyAdmin: _proxyAdmin, _systemOwnerSafe: _systemOwnerSafe }); + + // Print overview. + printConfigReview(); + } + + //////////////////////////////////////////////////////////////// + // HELPERS // + //////////////////////////////////////////////////////////////// + + /// @notice Deploys the standard Cannon version of the FaultDisputeGame. + function deployCannonDisputeGame() internal broadcast { + console.log("Deploying CannonFaultDisputeGame implementation"); + + save( + "CannonFaultDisputeGame", + address( + _deploy( + "FaultDisputeGame", + abi.encode( + GameTypes.CANNON, + loadMipsAbsolutePrestate(), + cfg.faultGameMaxDepth(), + cfg.faultGameSplitDepth(), + Duration.wrap(uint64(cfg.faultGameClockExtension())), + Duration.wrap(uint64(cfg.faultGameMaxClockDuration())), + IBigStepper(mustGetAddress("Mips")), + IDelayedWETH(mustGetAddress("DelayedWETHProxy")), + IAnchorStateRegistry(mustGetAddress("AnchorStateRegistryProxy")), + cfg.l2ChainID() + ) + ) + ) + ); + } + + /// @notice Deploys the PermissionedDisputeGame. + function deployPermissionedDisputeGame() internal broadcast { + console.log("Deploying PermissionedDisputeGame implementation"); + + save( + "PermissionedDisputeGame", + address( + _deploy( + "PermissionedDisputeGame", + abi.encode( + GameTypes.PERMISSIONED_CANNON, + loadMipsAbsolutePrestate(), + cfg.faultGameMaxDepth(), + cfg.faultGameSplitDepth(), + Duration.wrap(uint64(cfg.faultGameClockExtension())), + Duration.wrap(uint64(cfg.faultGameMaxClockDuration())), + IBigStepper(mustGetAddress("Mips")), + IDelayedWETH(mustGetAddress("PermissionedDelayedWETHProxy")), + IAnchorStateRegistry(mustGetAddress("AnchorStateRegistryProxy")), + cfg.l2ChainID(), + cfg.l2OutputOracleProposer(), + cfg.l2OutputOracleChallenger() + ) + ) + ) + ); + } + + /// @notice Initializes the DelayedWETH proxy. + function initializeDelayedWETHProxy() internal broadcast { + console.log("Initializing DelayedWETHProxy with DelayedWETH."); + + address wethProxy = mustGetAddress("DelayedWETHProxy"); + address superchainConfigProxy = mustGetAddress("SuperchainConfigProxy"); + Proxy(payable(wethProxy)).upgradeToAndCall( + mustGetAddress("DelayedWETH"), + abi.encodeCall(IDelayedWETH.initialize, (msg.sender, ISuperchainConfig(superchainConfigProxy))) + ); + } + + /// @notice Initializes the permissioned DelayedWETH proxy. + function initializePermissionedDelayedWETHProxy() internal broadcast { + console.log("Initializing permissioned DelayedWETHProxy with DelayedWETH."); + + address wethProxy = mustGetAddress("PermissionedDelayedWETHProxy"); + address superchainConfigProxy = mustGetAddress("SuperchainConfigProxy"); + Proxy(payable(wethProxy)).upgradeToAndCall( + mustGetAddress("DelayedWETH"), + abi.encodeCall(IDelayedWETH.initialize, (msg.sender, ISuperchainConfig(superchainConfigProxy))) + ); + } + + /// @notice Transfers admin rights of the `DelayedWETHProxy` to the `ProxyAdmin` and sets the + /// `DelayedWETH` owner to the `SystemOwnerSafe`. + function transferWethOwnershipFinal(address _proxyAdmin, address _systemOwnerSafe) internal broadcast { + console.log("Transferring ownership of DelayedWETHProxy"); + + IDelayedWETH weth = IDelayedWETH(mustGetAddress("DelayedWETHProxy")); + + // Transfer the ownership of the DelayedWETH to the SystemOwnerSafe. + weth.transferOwnership(_systemOwnerSafe); + + // Transfer the admin rights of the DelayedWETHProxy to the ProxyAdmin. + Proxy prox = Proxy(payable(address(weth))); + prox.changeAdmin(_proxyAdmin); + } + + /// @notice Transfers admin rights of the permissioned `DelayedWETHProxy` to the `ProxyAdmin` + /// and sets the `DelayedWETH` owner to the `SystemOwnerSafe`. + function transferPermissionedWETHOwnershipFinal(address _proxyAdmin, address _systemOwnerSafe) internal broadcast { + console.log("Transferring ownership of permissioned DelayedWETHProxy"); + + IDelayedWETH weth = IDelayedWETH(mustGetAddress("PermissionedDelayedWETHProxy")); + + // Transfer the ownership of the DelayedWETH to the SystemOwnerSafe. + weth.transferOwnership(_systemOwnerSafe); + + // Transfer the admin rights of the DelayedWETHProxy to the ProxyAdmin. + Proxy prox = Proxy(payable(address(weth))); + prox.changeAdmin(_proxyAdmin); + } + + /// @notice Checks that the deployed system is configured correctly. + function postDeployAssertions(address _proxyAdmin, address _systemOwnerSafe) internal view { + Types.ContractSet memory contracts = _proxiesUnstrict(); + + // Ensure that `useFaultProofs` is set to `true`. + assertTrue(cfg.useFaultProofs()); + + // Verify that the DGF is owned by the ProxyAdmin. + address dgfProxyAddr = mustGetAddress("DisputeGameFactoryProxy"); + assertEq(address(uint160(uint256(vm.load(dgfProxyAddr, Constants.PROXY_OWNER_ADDRESS)))), _proxyAdmin); + + // Verify that DelayedWETH is owned by the ProxyAdmin. + address wethProxyAddr = mustGetAddress("DelayedWETHProxy"); + assertEq(address(uint160(uint256(vm.load(wethProxyAddr, Constants.PROXY_OWNER_ADDRESS)))), _proxyAdmin); + + // Verify that permissioned DelayedWETH is owned by the ProxyAdmin. + address soyWethProxyAddr = mustGetAddress("PermissionedDelayedWETHProxy"); + assertEq(address(uint160(uint256(vm.load(soyWethProxyAddr, Constants.PROXY_OWNER_ADDRESS)))), _proxyAdmin); + + // Run standard assertions for DGF and DelayedWETH. + ChainAssertions.checkDisputeGameFactory(contracts, _systemOwnerSafe); + ChainAssertions.checkDelayedWETH(contracts, cfg, true, _systemOwnerSafe); + ChainAssertions.checkPermissionedDelayedWETH(contracts, cfg, true, _systemOwnerSafe); + + // Verify PreimageOracle configuration. + PreimageOracle oracle = PreimageOracle(mustGetAddress("PreimageOracle")); + assertEq(oracle.minProposalSize(), cfg.preimageOracleMinProposalSize()); + assertEq(oracle.challengePeriod(), cfg.preimageOracleChallengePeriod()); + + // Verify MIPS configuration. + MIPS mips = MIPS(mustGetAddress("Mips")); + assertEq(address(mips.oracle()), address(oracle)); + + // Grab ASR + IAnchorStateRegistry asr = IAnchorStateRegistry(mustGetAddress("AnchorStateRegistryProxy")); + + // Verify FaultDisputeGame configuration. + address gameAddr = mustGetAddress("CannonFaultDisputeGame"); + IFaultDisputeGame gameImpl = IFaultDisputeGame(payable(gameAddr)); + assertEq(gameImpl.maxGameDepth(), cfg.faultGameMaxDepth()); + assertEq(gameImpl.splitDepth(), cfg.faultGameSplitDepth()); + assertEq(gameImpl.clockExtension().raw(), cfg.faultGameClockExtension()); + assertEq(gameImpl.maxClockDuration().raw(), cfg.faultGameMaxClockDuration()); + assertEq(gameImpl.absolutePrestate().raw(), bytes32(cfg.faultGameAbsolutePrestate())); + assertEq(address(gameImpl.weth()), wethProxyAddr); + assertEq(address(gameImpl.anchorStateRegistry()), address(asr)); + assertEq(address(gameImpl.vm()), address(mips)); + + // Verify security override yoke configuration. + address soyGameAddr = mustGetAddress("PermissionedDisputeGame"); + IPermissionedDisputeGame soyGameImpl = IPermissionedDisputeGame(payable(soyGameAddr)); + assertEq(soyGameImpl.proposer(), cfg.l2OutputOracleProposer()); + assertEq(soyGameImpl.challenger(), cfg.l2OutputOracleChallenger()); + assertEq(soyGameImpl.maxGameDepth(), cfg.faultGameMaxDepth()); + assertEq(soyGameImpl.splitDepth(), cfg.faultGameSplitDepth()); + assertEq(soyGameImpl.clockExtension().raw(), cfg.faultGameClockExtension()); + assertEq(soyGameImpl.maxClockDuration().raw(), cfg.faultGameMaxClockDuration()); + assertEq(soyGameImpl.absolutePrestate().raw(), bytes32(cfg.faultGameAbsolutePrestate())); + assertEq(address(soyGameImpl.weth()), soyWethProxyAddr); + 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. + function printConfigReview() internal view { + console.log(unicode"📖 FaultDisputeGame Config Overview (chainid: %d)", block.chainid); + console.log(" 0. Use Fault Proofs: %s", cfg.useFaultProofs() ? "true" : "false"); + 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. 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/fpac/Makefile b/packages/contracts-bedrock/scripts/fpac/Makefile index 64db2979b943..dbdea4a62cb2 100644 --- a/packages/contracts-bedrock/scripts/fpac/Makefile +++ b/packages/contracts-bedrock/scripts/fpac/Makefile @@ -23,4 +23,9 @@ cannon-prestate: # Generate the cannon prestate, and tar the `op-program` + `can .PHONY: deploy-fresh deploy-fresh: cannon-prestate # Deploy a fresh version of the FPAC contracts. Pass `--broadcast` to send to the network. - forge script FPACOPS.sol --sig "deployFPAC(address,address)" $(proxy-admin) $(system-owner-safe) --chain $(chain) -vvv $(args) + forge script FPACOPS.s.sol --sig "deployFPAC(address,address,address)" $(proxy-admin) $(system-owner-safe) $(superchain-config-proxy) --chain $(chain) -vvv $(args) + +# TODO: Convert this whole file to a justfile +.PHONY: deploy-upgrade +deploy-upgrade: cannon-prestate # Deploy upgraded FP contracts. Pass `--broadcast` to send to the network. + forge script FPACOPS2.s.sol --sig "deployFPAC2(address,address,address,address,address)" $(proxy-admin) $(system-owner-safe) $(superchain-config-proxy) $(dispute-game-factory-proxy) $(anchor-state-registry-proxy) --chain $(chain) -vvv $(args) diff --git a/packages/contracts-bedrock/scripts/fpac/README.md b/packages/contracts-bedrock/scripts/fpac/README.md index f03b755e0fbc..a5d981172b2a 100644 --- a/packages/contracts-bedrock/scripts/fpac/README.md +++ b/packages/contracts-bedrock/scripts/fpac/README.md @@ -6,7 +6,7 @@ Chain-ops scripts for the Fault Proof Alpha Chad contracts. ### Generating the Cannon prestate and artifacts -_Description_: Generates the cannon prestate, tars the relavent artifacts, and sets the absolute prestate field in the network's deploy config. +_Description_: Generates the cannon prestate, tars the relevant artifacts, and sets the absolute prestate field in the network's deploy config. ```sh make cannon-prestate chain=<chain-name> diff --git a/packages/contracts-bedrock/scripts/FaultDisputeGameViz.s.sol b/packages/contracts-bedrock/scripts/fpac/viz/FaultDisputeGameViz.s.sol similarity index 92% rename from packages/contracts-bedrock/scripts/FaultDisputeGameViz.s.sol rename to packages/contracts-bedrock/scripts/fpac/viz/FaultDisputeGameViz.s.sol index ae370934f1e3..2e0dd45e4ebe 100644 --- a/packages/contracts-bedrock/scripts/FaultDisputeGameViz.s.sol +++ b/packages/contracts-bedrock/scripts/fpac/viz/FaultDisputeGameViz.s.sol @@ -1,17 +1,21 @@ // SPDX-License-Identifier: MIT pragma solidity ^0.8.15; +// Testing +import { FaultDisputeGame_Init } from "test/dispute/FaultDisputeGame.t.sol"; + +// Scripts import { Script } from "forge-std/Script.sol"; import { console2 as console } from "forge-std/console2.sol"; +import { Process } from "scripts/libraries/Process.sol"; -import { FaultDisputeGame_Init } from "test/dispute/FaultDisputeGame.t.sol"; -import { DisputeGameFactory } from "src/dispute/DisputeGameFactory.sol"; -import { FaultDisputeGame } from "src/dispute/FaultDisputeGame.sol"; -import { IFaultDisputeGame } from "src/dispute/interfaces/IFaultDisputeGame.sol"; - +// Libraries import "src/dispute/lib/Types.sol"; import "src/dispute/lib/Errors.sol"; +// Interfaces +import { IFaultDisputeGame } from "src/dispute/interfaces/IFaultDisputeGame.sol"; + /** * @title FaultDisputeGameViz * @dev To run this script, make sure to install the `dagviz` & `eth_abi` python packages. @@ -42,7 +46,7 @@ contract FaultDisputeGameViz is Script, FaultDisputeGame_Init { * @dev Entry point */ function remote(address _addr) public { - gameProxy = FaultDisputeGame(payable(_addr)); + gameProxy = IFaultDisputeGame(payable(_addr)); buildGraph(); console.log("Saved graph to `./dispute_game.svg"); } @@ -79,6 +83,6 @@ contract FaultDisputeGameViz is Script, FaultDisputeGame_Init { commands[0] = "python3"; commands[1] = "scripts/dag-viz.py"; commands[2] = vm.toString(abi.encode(gameData)); - vm.ffi(commands); + Process.run(commands); } } diff --git a/packages/contracts-bedrock/scripts/dag-viz.py b/packages/contracts-bedrock/scripts/fpac/viz/dag-viz.py similarity index 100% rename from packages/contracts-bedrock/scripts/dag-viz.py rename to packages/contracts-bedrock/scripts/fpac/viz/dag-viz.py diff --git a/packages/contracts-bedrock/scripts/visualize.sh b/packages/contracts-bedrock/scripts/fpac/viz/visualize.sh similarity index 82% rename from packages/contracts-bedrock/scripts/visualize.sh rename to packages/contracts-bedrock/scripts/fpac/viz/visualize.sh index 4fb3078ebe70..f0ecf872aa2e 100644 --- a/packages/contracts-bedrock/scripts/visualize.sh +++ b/packages/contracts-bedrock/scripts/fpac/viz/visualize.sh @@ -8,6 +8,6 @@ DIR="$(cd "$(dirname "${BASH_SOURCE[0]}")" && pwd)" DIR="${DIR%/*}" cd "$DIR" -forge script scripts/FaultDisputeGameViz.s.sol \ +forge script scripts/fpac/viz/FaultDisputeGameViz.s.sol \ --sig "remote(address)" "$FAULT_GAME_ADDRESS" \ --fork-url "$RPC" diff --git a/packages/contracts-bedrock/scripts/getting-started/config.sh b/packages/contracts-bedrock/scripts/getting-started/config.sh index 0e3bc5cf7ebb..ca2df6e099d5 100755 --- a/packages/contracts-bedrock/scripts/getting-started/config.sh +++ b/packages/contracts-bedrock/scripts/getting-started/config.sh @@ -5,6 +5,9 @@ # need to have the getting-started.json committed to the repo since it's an # invalid JSON file when not filled in, which is annoying. +SCRIPT_DIR=$( cd -- "$( dirname -- "${BASH_SOURCE[0]}" )" &> /dev/null && pwd ) +CONTRACTS_BASE=$(dirname "$(dirname "$SCRIPT_DIR")") + reqenv() { if [ -z "${!1}" ]; then echo "Error: environment variable '$1' is undefined" @@ -12,27 +15,46 @@ reqenv() { fi } +append_with_default() { + json_key="$1" + env_var_name="$2" + default_value="$3" + var_value="${!env_var_name}" + + if [ -z "$var_value" ] || [ "$var_value" == "None" ]; then + var_value="$default_value" + fi + + echo " \"$json_key\": \"$var_value\"," >> tmp_config.json +} + # Check required environment variables reqenv "GS_ADMIN_ADDRESS" reqenv "GS_BATCHER_ADDRESS" reqenv "GS_PROPOSER_ADDRESS" reqenv "GS_SEQUENCER_ADDRESS" reqenv "L1_RPC_URL" +reqenv "L1_CHAIN_ID" +reqenv "L2_CHAIN_ID" +reqenv "L1_BLOCK_TIME" +reqenv "L2_BLOCK_TIME" -# Get the finalized block timestamp and hash -block=$(cast block finalized --rpc-url "$L1_RPC_URL") +# Get the latest block timestamp and hash +block=$(cast block latest --rpc-url "$L1_RPC_URL") timestamp=$(echo "$block" | awk '/timestamp/ { print $2 }') blockhash=$(echo "$block" | awk '/hash/ { print $2 }') -# Generate the config file -config=$(cat << EOL +# Start generating the config file in a temporary file + +cat << EOL > tmp_config.json { - "l1StartingBlockTag": "$blockhash", - "l1ChainID": 11155111, - "l2ChainID": 42069, - "l2BlockTime": 2, - "l1BlockTime": 12, + "l1StartingBlockTag": "$blockhash", + + "l1ChainID": $L1_CHAIN_ID, + "l2ChainID": $L2_CHAIN_ID, + "l2BlockTime": $L2_BLOCK_TIME, + "l1BlockTime": $L1_BLOCK_TIME, "maxSequencerDrift": 600, "sequencerWindowSize": 3600, @@ -75,16 +97,36 @@ config=$(cat << EOL "l2GenesisBlockGasLimit": "0x1c9c380", "l2GenesisBlockBaseFeePerGas": "0x3b9aca00", - "l2GenesisRegolithTimeOffset": "0x0", "eip1559Denominator": 50, "eip1559DenominatorCanyon": 250, "eip1559Elasticity": 6, +EOL - "l2GenesisEcotoneTimeOffset": "0x0", - "l2GenesisDeltaTimeOffset": "0x0", - "l2GenesisCanyonTimeOffset": "0x0", - +# Append conditional environment variables with their corresponding default values +# Activate granite fork +if [ -n "${GRANITE_TIME_OFFSET}" ]; then + append_with_default "l2GenesisGraniteTimeOffset" "GRANITE_TIME_OFFSET" "0x0" +fi +# Activate holocene fork +if [ -n "${HOLOCENE_TIME_OFFSET}" ]; then + append_with_default "l2GenesisHoloceneTimeOffset" "HOLOCENE_TIME_OFFSET" "0x0" +fi + +# Activate the interop fork +if [ -n "${INTEROP_TIME_OFFSET}" ]; then + append_with_default "l2GenesisInteropTimeOffset" "INTEROP_TIME_OFFSET" "0x0" +fi + +# Already forked updates +append_with_default "l2GenesisFjordTimeOffset" "FJORD_TIME_OFFSET" "0x0" +append_with_default "l2GenesisRegolithTimeOffset" "REGOLITH_TIME_OFFSET" "0x0" +append_with_default "l2GenesisEcotoneTimeOffset" "ECOTONE_TIME_OFFSET" "0x0" +append_with_default "l2GenesisDeltaTimeOffset" "DELTA_TIME_OFFSET" "0x0" +append_with_default "l2GenesisCanyonTimeOffset" "CANYON_TIME_OFFSET" "0x0" + +# Continue generating the config file +cat << EOL >> tmp_config.json "systemConfigStartBlock": 0, "requiredProtocolVersion": "0x0000000000000000000000000000000000000000000000000000000000000000", @@ -93,16 +135,16 @@ config=$(cat << EOL "faultGameAbsolutePrestate": "0x03c7ae758795765c6664a5d39bf63841c71ff191e9189522bad8ebff5d4eca98", "faultGameMaxDepth": 44, "faultGameClockExtension": 0, - "faultGameMaxClockDuration": 600, + "faultGameMaxClockDuration": 1200, "faultGameGenesisBlock": 0, "faultGameGenesisOutputRoot": "0x0000000000000000000000000000000000000000000000000000000000000000", "faultGameSplitDepth": 14, + "faultGameWithdrawalDelay": 600, "preimageOracleMinProposalSize": 1800000, - "preimageOracleChallengePeriod": 86400 + "preimageOracleChallengePeriod": 300 } EOL -) -# Write the config file -echo "$config" > deploy-config/getting-started.json +# Write the final config file +mv tmp_config.json "$CONTRACTS_BASE/deploy-config/getting-started.json" diff --git a/packages/contracts-bedrock/scripts/getting-started/versions.sh b/packages/contracts-bedrock/scripts/getting-started/versions.sh index 79dc55a7e9c5..880bd2898dd9 100755 --- a/packages/contracts-bedrock/scripts/getting-started/versions.sh +++ b/packages/contracts-bedrock/scripts/getting-started/versions.sh @@ -32,19 +32,19 @@ versionFoundry() { ver_git=$(version "$(git --version)") ver_go=$(version "$(go version)") ver_node=$(version "$(node --version)") -ver_pnpm=$(version "$(pnpm --version)") ver_foundry=$(versionFoundry "$(forge --version)") ver_make=$(version "$(make --version)") ver_jq=$(version "$(jq --version)") ver_direnv=$(version "$(direnv --version)") +ver_just=$(version "$(just --version)") # Print versions 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 "foundry 0.2.0 (a5efe4f) $ver_foundry" echo "make 3 $ver_make" echo "jq 1.6 $ver_jq" echo "direnv 2 $ver_direnv" +echo "just 1.34.0 $ver_just" diff --git a/packages/contracts-bedrock/scripts/getting-started/wallets.sh b/packages/contracts-bedrock/scripts/getting-started/wallets.sh index 4d1426d8db5b..1d3ebfc6bbd5 100755 --- a/packages/contracts-bedrock/scripts/getting-started/wallets.sh +++ b/packages/contracts-bedrock/scripts/getting-started/wallets.sh @@ -24,7 +24,7 @@ key3=$(echo "$wallet3" | awk '/Private key/ { print $3 }') key4=$(echo "$wallet4" | awk '/Private key/ { print $3 }') # Print out the environment variables to copy -echo "Copy the following into your .envrc file:" +echo "# Copy the following into your .envrc file:" echo echo "# Admin account" echo "export GS_ADMIN_ADDRESS=$address1" diff --git a/packages/contracts-bedrock/scripts/go-ffi/README.md b/packages/contracts-bedrock/scripts/go-ffi/README.md index 8348100fb8a3..2b928f703f26 100644 --- a/packages/contracts-bedrock/scripts/go-ffi/README.md +++ b/packages/contracts-bedrock/scripts/go-ffi/README.md @@ -11,11 +11,11 @@ A lightweight binary for utilities accessed via `forge`'s `ffi` cheatcode in the ## Usage -To build, run `pnpm build:go-ffi` from this directory or the `contract-bedrock` package. +To build, run `just build-go-ffi` from this directory or the `contract-bedrock` package. ### In a Forge Test -To use `go-ffi` in a forge test, simply invoke the binary via the `vm.ffi` cheatcode. +To use `go-ffi` in a forge test, simply invoke the binary using the solidity `Process` library's `run` method. ```solidity function myFFITest() public { @@ -23,7 +23,7 @@ function myFFITest() public { commands[0] = "./scripts/go-ffi/go-ffi"; commands[1] = "trie"; commands[2] = "valid"; - bytes memory result = vm.ffi(commands); + bytes memory result = Process.run(commands); // Do something with the result of the command } diff --git a/packages/contracts-bedrock/scripts/go-ffi/differential-testing.go b/packages/contracts-bedrock/scripts/go-ffi/differential-testing.go index d389329bef04..af4deae5c09c 100644 --- a/packages/contracts-bedrock/scripts/go-ffi/differential-testing.go +++ b/packages/contracts-bedrock/scripts/go-ffi/differential-testing.go @@ -7,10 +7,6 @@ import ( "os" "strconv" - "github.com/ethereum-optimism/optimism/cannon/mipsevm" - "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" @@ -20,6 +16,11 @@ import ( "github.com/ethereum/go-ethereum/trie" "github.com/ethereum/go-ethereum/triedb" "github.com/ethereum/go-ethereum/triedb/hashdb" + + "github.com/ethereum-optimism/optimism/cannon/mipsevm/memory" + "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" ) // ABI types @@ -38,6 +39,15 @@ var ( 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"}, @@ -82,6 +92,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() { @@ -338,28 +359,104 @@ func DiffTestUtils() { // Print the output fmt.Print(hexutil.Encode(packed[32:])) case "cannonMemoryProof": - // <pc, insn, [memAddr, memValue]> - mem := mipsevm.NewMemory() - if len(args) != 3 && len(args) != 5 { - panic("Error: cannonMemoryProofWithProof requires 2 or 4 arguments") + // <pc, insn, [memAddr, memValue], [memAddr2, memValue2]> + // Generates a memory proof of `memAddr` for a trie containing memValue and memValue2 + mem := memory.NewMemory() + if len(args) != 3 && len(args) != 5 && len(args) != 7 { + panic("Error: cannonMemoryProofWithProof requires 2, 4, or 6 arguments") } pc, err := strconv.ParseUint(args[1], 10, 32) - checkErr(err, "Error decocding addr") + checkErr(err, "Error decoding addr") insn, err := strconv.ParseUint(args[2], 10, 32) - checkErr(err, "Error decocding insn") + checkErr(err, "Error decoding insn") mem.SetMemory(uint32(pc), uint32(insn)) var insnProof, memProof [896]byte - if len(args) == 5 { + if len(args) >= 5 { memAddr, err := strconv.ParseUint(args[3], 10, 32) - checkErr(err, "Error decocding memAddr") + checkErr(err, "Error decoding memAddr") memValue, err := strconv.ParseUint(args[4], 10, 32) - checkErr(err, "Error decocding memValue") + checkErr(err, "Error decoding memValue") + mem.SetMemory(uint32(memAddr), uint32(memValue)) + memProof = mem.MerkleProof(uint32(memAddr)) + } + if len(args) == 7 { + memAddr, err := strconv.ParseUint(args[5], 10, 32) + checkErr(err, "Error decoding memAddr") + memValue, err := strconv.ParseUint(args[6], 10, 32) + checkErr(err, "Error decoding memValue") mem.SetMemory(uint32(memAddr), uint32(memValue)) memProof = mem.MerkleProof(uint32(memAddr)) } insnProof = mem.MerkleProof(uint32(pc)) + output := struct { + MemRoot common.Hash + Proof []byte + }{ + MemRoot: mem.MerkleRoot(), + Proof: append(insnProof[:], memProof[:]...), + } + packed, err := cannonMemoryProofArgs.Pack(&output) + checkErr(err, "Error encoding output") + fmt.Print(hexutil.Encode(packed[32:])) + case "cannonMemoryProof2": + // <pc, insn, [memAddr, memValue], memAddr2> + // Generates a memory proof of memAddr2 for a trie containing memValue + mem := memory.NewMemory() + if len(args) != 6 { + panic("Error: cannonMemoryProofWithProof2 requires 5 arguments") + } + pc, err := strconv.ParseUint(args[1], 10, 32) + checkErr(err, "Error decoding addr") + insn, err := strconv.ParseUint(args[2], 10, 32) + checkErr(err, "Error decoding insn") + mem.SetMemory(uint32(pc), uint32(insn)) + + var memProof [896]byte + memAddr, err := strconv.ParseUint(args[3], 10, 32) + checkErr(err, "Error decoding memAddr") + memValue, err := strconv.ParseUint(args[4], 10, 32) + checkErr(err, "Error decoding memValue") + mem.SetMemory(uint32(memAddr), uint32(memValue)) + + memAddr2, err := strconv.ParseUint(args[5], 10, 32) + checkErr(err, "Error decoding memAddr") + memProof = mem.MerkleProof(uint32(memAddr2)) + + output := struct { + MemRoot common.Hash + Proof []byte + }{ + MemRoot: mem.MerkleRoot(), + Proof: memProof[:], + } + packed, err := cannonMemoryProofArgs.Pack(&output) + checkErr(err, "Error encoding output") + fmt.Print(hexutil.Encode(packed[32:])) + case "cannonMemoryProofWrongLeaf": + // <pc, insn, memAddr, memValue> + mem := memory.NewMemory() + if len(args) != 5 { + panic("Error: cannonMemoryProofWrongLeaf requires 4 arguments") + } + pc, err := strconv.ParseUint(args[1], 10, 32) + checkErr(err, "Error decoding addr") + insn, err := strconv.ParseUint(args[2], 10, 32) + checkErr(err, "Error decoding insn") + mem.SetMemory(uint32(pc), uint32(insn)) + + var insnProof, memProof [896]byte + memAddr, err := strconv.ParseUint(args[3], 10, 32) + checkErr(err, "Error decoding memAddr") + memValue, err := strconv.ParseUint(args[4], 10, 32) + checkErr(err, "Error decoding memValue") + mem.SetMemory(uint32(memAddr), uint32(memValue)) + + // Compute a valid proof for the root, but for the wrong leaves. + memProof = mem.MerkleProof(uint32(memAddr + 32)) + insnProof = mem.MerkleProof(uint32(pc + 32)) + output := struct { MemRoot common.Hash Proof []byte @@ -372,9 +469,9 @@ func DiffTestUtils() { fmt.Print(hexutil.Encode(packed[32:])) case "encodeScalarEcotone": basefeeScalar, err := strconv.ParseUint(args[1], 10, 32) - checkErr(err, "Error decocding basefeeScalar") + checkErr(err, "Error decoding basefeeScalar") blobbasefeeScalar, err := strconv.ParseUint(args[2], 10, 32) - checkErr(err, "Error decocding blobbasefeeScalar") + checkErr(err, "Error decoding blobbasefeeScalar") encoded := eth.EncodeScalar(eth.EcotoneScalars{ BaseFeeScalar: uint32(basefeeScalar), @@ -388,6 +485,37 @@ func DiffTestUtils() { 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/interfaces/IAddressManager.sol b/packages/contracts-bedrock/scripts/interfaces/IAddressManager.sol deleted file mode 100644 index f7e87cdc8702..000000000000 --- a/packages/contracts-bedrock/scripts/interfaces/IAddressManager.sol +++ /dev/null @@ -1,22 +0,0 @@ -// SPDX-License-Identifier: MIT -pragma solidity ^0.8.15; - -/// @title IAddressManager -/// @notice Minimal interface of the Legacy AddressManager. -interface IAddressManager { - /// @notice Emitted when an address is modified in the registry. - /// @param name String name being set in the registry. - /// @param newAddress Address set for the given name. - /// @param oldAddress Address that was previously set for the given name. - event AddressSet(string indexed name, address newAddress, address oldAddress); - - /// @notice Changes the address associated with a particular name. - /// @param _name String name to associate an address with. - /// @param _address Address to associate with the name. - function setAddress(string memory _name, address _address) external; - - /// @notice Retrieves the address associated with a given name. - /// @param _name Name to retrieve an address for. - /// @return Address associated with the given name. - function getAddress(string memory _name) external view returns (address); -} diff --git a/packages/contracts-bedrock/scripts/interfaces/IGnosisSafe.sol b/packages/contracts-bedrock/scripts/interfaces/IGnosisSafe.sol index 60434364fd9a..068f3815134a 100644 --- a/packages/contracts-bedrock/scripts/interfaces/IGnosisSafe.sol +++ b/packages/contracts-bedrock/scripts/interfaces/IGnosisSafe.sol @@ -1,5 +1,5 @@ // SPDX-License-Identifier: LGPL-3.0-only -pragma solidity ^0.8.10; +pragma solidity ^0.8.0; /// @title Enum - Collection of enums used in Safe contracts. /// @author Richard Meissner - @rmeissner diff --git a/packages/contracts-bedrock/scripts/interfaces/ISystemConfigV0.sol b/packages/contracts-bedrock/scripts/interfaces/ISystemConfigV0.sol index 2871d76b8238..af1397d72645 100644 --- a/packages/contracts-bedrock/scripts/interfaces/ISystemConfigV0.sol +++ b/packages/contracts-bedrock/scripts/interfaces/ISystemConfigV0.sol @@ -1,7 +1,7 @@ // SPDX-License-Identifier: MIT -pragma solidity 0.8.15; +pragma solidity ^0.8.0; -import { ResourceMetering } from "src/L1/ResourceMetering.sol"; +import { IResourceMetering } from "src/L1/interfaces/IResourceMetering.sol"; /// @title ISystemConfigV0 /// @notice Minimal interface of the Legacy SystemConfig containing only getters. @@ -14,6 +14,6 @@ interface ISystemConfigV0 { function scalar() external view returns (uint256); function batcherHash() external view returns (bytes32); function gasLimit() external view returns (uint64); - function resourceConfig() external view returns (ResourceMetering.ResourceConfig memory); + function resourceConfig() external view returns (IResourceMetering.ResourceConfig memory); function unsafeBlockSigner() external view returns (address); } diff --git a/packages/contracts-bedrock/scripts/Chains.sol b/packages/contracts-bedrock/scripts/libraries/Chains.sol similarity index 100% rename from packages/contracts-bedrock/scripts/Chains.sol rename to packages/contracts-bedrock/scripts/libraries/Chains.sol diff --git a/packages/contracts-bedrock/scripts/libraries/Config.sol b/packages/contracts-bedrock/scripts/libraries/Config.sol new file mode 100644 index 000000000000..06e59e902246 --- /dev/null +++ b/packages/contracts-bedrock/scripts/libraries/Config.sol @@ -0,0 +1,170 @@ +// SPDX-License-Identifier: MIT +pragma solidity ^0.8.0; + +import { Vm, VmSafe } from "forge-std/Vm.sol"; + +/// @notice Enum representing different ways of outputting genesis allocs. +/// @custom:value NONE No output, used in internal tests. +/// @custom:value LATEST Output allocs only for latest fork. +/// @custom:value ALL Output allocs for all intermediary forks. +enum OutputMode { + NONE, + LATEST, + ALL +} + +library OutputModeUtils { + function toString(OutputMode _mode) internal pure returns (string memory) { + if (_mode == OutputMode.NONE) { + return "none"; + } else if (_mode == OutputMode.LATEST) { + return "latest"; + } else if (_mode == OutputMode.ALL) { + return "all"; + } else { + return "unknown"; + } + } +} + +/// @notice Enum of forks available for selection when generating genesis allocs. +enum Fork { + NONE, + DELTA, + ECOTONE, + FJORD, + GRANITE +} + +Fork constant LATEST_FORK = Fork.GRANITE; + +library ForkUtils { + function toString(Fork _fork) internal pure returns (string memory) { + if (_fork == Fork.NONE) { + return "none"; + } else if (_fork == Fork.DELTA) { + return "delta"; + } else if (_fork == Fork.ECOTONE) { + return "ecotone"; + } else if (_fork == Fork.FJORD) { + return "fjord"; + } else if (_fork == Fork.GRANITE) { + return "granite"; + } else { + return "unknown"; + } + } +} + +/// @title Config +/// @notice Contains all env var based config. Add any new env var parsing to this file +/// to ensure that all config is in a single place. +library Config { + /// @notice Foundry cheatcode VM. + Vm private constant vm = Vm(address(uint160(uint256(keccak256("hevm cheat code"))))); + + /// @notice Returns the path on the local filesystem where the deployment artifact is + /// 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/", 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) { + 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 + /// an override. + function chainID() internal view returns (uint256 _env) { + _env = vm.envOr("CHAIN_ID", block.chainid); + } + + /// @notice Returns the value of the env var CONTRACT_ADDRESSES_PATH which is a JSON key/value + /// pair of contract names and their addresses. Each key/value pair is passed to `save` + /// which then backs the `getAddress` function. + function contractAddressesPath() internal view returns (string memory _env) { + _env = vm.envOr("CONTRACT_ADDRESSES_PATH", 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")); + } + + /// @notice Returns the path that the state dump file should be written to or read from + /// on the local filesystem. + function stateDumpPath(string memory _suffix) internal view returns (string memory _env) { + _env = vm.envOr( + "STATE_DUMP_PATH", + string.concat(vm.projectRoot(), "/state-dump-", vm.toString(block.chainid), _suffix, ".json") + ); + } + + /// @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. + function deployFile(string memory _sig) internal view returns (string memory _env) { + _env = vm.envOr("DEPLOY_FILE", string.concat(_sig, "-latest.json")); + } + + /// @notice Returns the private key that is used to configure drippie. + function drippieOwnerPrivateKey() internal view returns (uint256 _env) { + _env = vm.envUint("DRIPPIE_OWNER_PRIVATE_KEY"); + } + + /// @notice Returns the OutputMode for genesis allocs generation. + /// It reads the mode from the environment variable OUTPUT_MODE. + /// If it is unset, OutputMode.ALL is returned. + function outputMode() internal view returns (OutputMode) { + string memory modeStr = vm.envOr("OUTPUT_MODE", string("latest")); + bytes32 modeHash = keccak256(bytes(modeStr)); + if (modeHash == keccak256(bytes("none"))) { + return OutputMode.NONE; + } else if (modeHash == keccak256(bytes("latest"))) { + return OutputMode.LATEST; + } else if (modeHash == keccak256(bytes("all"))) { + return OutputMode.ALL; + } else { + revert(string.concat("Config: unknown output mode: ", modeStr)); + } + } + + /// @notice Returns true if multithreaded Cannon is used for the deployment. + function useMultithreadedCannon() internal view returns (bool _enabled) { + _enabled = vm.envOr("USE_MT_CANNON", false); + } + + /// @notice Returns the latest fork to use for genesis allocs generation. + /// It reads the fork from the environment variable FORK. If it is + /// unset, NONE is returned. + /// If set to the special value "latest", the latest fork is returned. + function fork() internal view returns (Fork) { + string memory forkStr = vm.envOr("FORK", string("")); + if (bytes(forkStr).length == 0) { + return Fork.NONE; + } + bytes32 forkHash = keccak256(bytes(forkStr)); + if (forkHash == keccak256(bytes("latest"))) { + return LATEST_FORK; + } else if (forkHash == keccak256(bytes("delta"))) { + return Fork.DELTA; + } else if (forkHash == keccak256(bytes("ecotone"))) { + return Fork.ECOTONE; + } else if (forkHash == keccak256(bytes("fjord"))) { + return Fork.FJORD; + } else if (forkHash == keccak256(bytes("granite"))) { + return Fork.GRANITE; + } else { + revert(string.concat("Config: unknown fork: ", forkStr)); + } + } +} diff --git a/packages/contracts-bedrock/scripts/libraries/DeployUtils.sol b/packages/contracts-bedrock/scripts/libraries/DeployUtils.sol new file mode 100644 index 000000000000..92870309657e --- /dev/null +++ b/packages/contracts-bedrock/scripts/libraries/DeployUtils.sol @@ -0,0 +1,249 @@ +// SPDX-License-Identifier: MIT +pragma solidity 0.8.15; + +// Scripts +import { Vm } from "forge-std/Vm.sol"; +import { console2 as console } from "forge-std/console2.sol"; +import { Artifacts } from "scripts/Artifacts.s.sol"; + +// Libraries +import { LibString } from "@solady/utils/LibString.sol"; + +// Contracts +import { Proxy } from "src/universal/Proxy.sol"; + +library DeployUtils { + Vm internal constant vm = Vm(address(uint160(uint256(keccak256("hevm cheat code"))))); + + /// @notice Deploys a contract with the given name and arguments via CREATE. + /// @param _name Name of the contract to deploy. + /// @param _args ABI-encoded constructor arguments. + /// @return addr_ Address of the deployed contract. + function create1(string memory _name, bytes memory _args) internal returns (address payable addr_) { + bytes memory bytecode = abi.encodePacked(vm.getCode(_name), _args); + assembly { + addr_ := create(0, add(bytecode, 0x20), mload(bytecode)) + } + assertValidContractAddress(addr_); + } + + /// @notice Deploys a contract with the given name via CREATE. + /// @param _name Name of the contract to deploy. + /// @return Address of the deployed contract. + function create1(string memory _name) internal returns (address payable) { + return create1(_name, hex""); + } + + /// @notice Deploys a contract with the given name and arguments via CREATE and saves the result. + /// @param _save Artifacts contract. + /// @param _name Name of the contract to deploy. + /// @param _nick Nickname to save the address to. + /// @param _args ABI-encoded constructor arguments. + /// @return addr_ Address of the deployed contract. + function create1AndSave( + Artifacts _save, + string memory _name, + string memory _nick, + bytes memory _args + ) + internal + returns (address payable addr_) + { + console.log("Deploying %s", _nick); + addr_ = create1(_name, _args); + _save.save(_nick, addr_); + console.log("%s deployed at %s", _nick, addr_); + } + + /// @notice Deploys a contract with the given name via CREATE and saves the result. + /// @param _save Artifacts contract. + /// @param _name Name of the contract to deploy. + /// @param _nickname Nickname to save the address to. + /// @return addr_ Address of the deployed contract. + function create1AndSave( + Artifacts _save, + string memory _name, + string memory _nickname + ) + internal + returns (address payable addr_) + { + return create1AndSave(_save, _name, _nickname, hex""); + } + + /// @notice Deploys a contract with the given name and arguments via CREATE and saves the result. + /// @param _save Artifacts contract. + /// @param _name Name of the contract to deploy. + /// @param _args ABI-encoded constructor arguments. + /// @return addr_ Address of the deployed contract. + function create1AndSave( + Artifacts _save, + string memory _name, + bytes memory _args + ) + internal + returns (address payable addr_) + { + return create1AndSave(_save, _name, _name, _args); + } + + /// @notice Deploys a contract with the given name and arguments via CREATE2. + /// @param _name Name of the contract to deploy. + /// @param _args ABI-encoded constructor arguments. + /// @param _salt Salt for the CREATE2 operation. + /// @return addr_ Address of the deployed contract. + function create2(string memory _name, bytes memory _args, bytes32 _salt) internal returns (address payable addr_) { + bytes memory initCode = abi.encodePacked(vm.getCode(_name), _args); + address preComputedAddress = vm.computeCreate2Address(_salt, keccak256(initCode)); + require(preComputedAddress.code.length == 0, "DeployUtils: contract already deployed"); + assembly { + addr_ := create2(0, add(initCode, 0x20), mload(initCode), _salt) + } + assertValidContractAddress(addr_); + } + + /// @notice Deploys a contract with the given name via CREATE2. + /// @param _name Name of the contract to deploy. + /// @param _salt Salt for the CREATE2 operation. + /// @return Address of the deployed contract. + function create2(string memory _name, bytes32 _salt) internal returns (address payable) { + return create2(_name, hex"", _salt); + } + + /// @notice Deploys a contract with the given name and arguments via CREATE2 and saves the result. + /// @param _save Artifacts contract. + /// @param _name Name of the contract to deploy. + /// @param _nick Nickname to save the address to. + /// @param _args ABI-encoded constructor arguments. + /// @param _salt Salt for the CREATE2 operation. + /// @return addr_ Address of the deployed contract. + function create2AndSave( + Artifacts _save, + string memory _name, + string memory _nick, + bytes memory _args, + bytes32 _salt + ) + internal + returns (address payable addr_) + { + console.log("Deploying %s", _nick); + addr_ = create2(_name, _args, _salt); + _save.save(_nick, addr_); + console.log("%s deployed at %s", _nick, addr_); + } + + /// @notice Deploys a contract with the given name via CREATE2 and saves the result. + /// @param _save Artifacts contract. + /// @param _name Name of the contract to deploy. + /// @param _nick Nickname to save the address to. + /// @param _salt Salt for the CREATE2 operation. + /// @return addr_ Address of the deployed contract. + function create2AndSave( + Artifacts _save, + string memory _name, + string memory _nick, + bytes32 _salt + ) + internal + returns (address payable addr_) + { + return create2AndSave(_save, _name, _nick, hex"", _salt); + } + + /// @notice Deploys a contract with the given name and arguments via CREATE2 and saves the result. + /// @param _save Artifacts contract. + /// @param _name Name of the contract to deploy. + /// @param _args ABI-encoded constructor arguments. + /// @param _salt Salt for the CREATE2 operation. + /// @return addr_ Address of the deployed contract. + function create2AndSave( + Artifacts _save, + string memory _name, + bytes memory _args, + bytes32 _salt + ) + internal + returns (address payable addr_) + { + return create2AndSave(_save, _name, _name, _args, _salt); + } + + /// @notice Deploys a contract with the given name via CREATE2 and saves the result. + /// @param _save Artifacts contract. + /// @param _name Name of the contract to deploy. + /// @param _salt Salt for the CREATE2 operation. + /// @return addr_ Address of the deployed contract. + function create2AndSave( + Artifacts _save, + string memory _name, + bytes32 _salt + ) + internal + returns (address payable addr_) + { + return create2AndSave(_save, _name, _name, hex"", _salt); + } + + /// @notice Takes a sender and an identifier and returns a deterministic address based on the + /// two. The result is used to etch the input and output contracts to a deterministic + /// address based on those two values, where the identifier represents the input or + /// output contract, such as `optimism.DeploySuperchainInput` or + /// `optimism.DeployOPChainOutput`. + /// Example: `toIOAddress(msg.sender, "optimism.DeploySuperchainInput")` + /// @param _sender Address of the sender. + /// @param _identifier Additional identifier. + /// @return Deterministic address. + function toIOAddress(address _sender, string memory _identifier) internal pure returns (address) { + return address(uint160(uint256(keccak256(abi.encode(_sender, _identifier))))); + } + + /// @notice Asserts that the given address is a valid contract address. + /// @param _who Address to check. + function assertValidContractAddress(address _who) internal view { + require(_who != address(0), "DeployUtils: zero address"); + require(_who.code.length > 0, string.concat("DeployUtils: no code at ", LibString.toHexStringChecksummed(_who))); + } + + /// @notice Asserts that the given proxy has an implementation set. + /// @param _proxy Proxy to check. + function assertImplementationSet(address _proxy) internal { + // We prank as the zero address due to the Proxy's `proxyCallIfNotAdmin` modifier. + // Pranking inside this function also means it can no longer be considered `view`. + vm.prank(address(0)); + address implementation = Proxy(payable(_proxy)).implementation(); + assertValidContractAddress(implementation); + } + + /// @notice Asserts that the given addresses are valid contract addresses. + /// @param _addrs Addresses to check. + function assertValidContractAddresses(address[] memory _addrs) internal view { + // Assert that all addresses are non-zero and have code. + // We use LibString to avoid the need for adding cheatcodes to this contract. + for (uint256 i = 0; i < _addrs.length; i++) { + address who = _addrs[i]; + assertValidContractAddress(who); + } + + // All addresses should be unique. + for (uint256 i = 0; i < _addrs.length; i++) { + for (uint256 j = i + 1; j < _addrs.length; j++) { + string memory err = + string.concat("check failed: duplicates at ", LibString.toString(i), ",", LibString.toString(j)); + require(_addrs[i] != _addrs[j], err); + } + } + } + + /// @notice Asserts that for a given contract the value of a storage slot at an offset is 1 or + /// `type(uint8).max`. The value is set to 1 when a contract is initialized, and set to + /// `type(uint8).max` when `_disableInitializers` is called. + function assertInitialized(address _contractAddress, uint256 _slot, uint256 _offset) internal view { + bytes32 slotVal = vm.load(_contractAddress, bytes32(_slot)); + uint8 value = uint8((uint256(slotVal) >> (_offset * 8)) & 0xFF); + require( + value == 1 || value == type(uint8).max, + "Value at the given slot and offset does not indicate initialization" + ); + } +} diff --git a/packages/contracts-bedrock/scripts/libraries/Executables.sol b/packages/contracts-bedrock/scripts/libraries/Executables.sol new file mode 100644 index 000000000000..0dc91e32072d --- /dev/null +++ b/packages/contracts-bedrock/scripts/libraries/Executables.sol @@ -0,0 +1,34 @@ +// SPDX-License-Identifier: MIT +pragma solidity ^0.8.0; + +import { Vm } from "forge-std/Vm.sol"; +import { Process } from "scripts/libraries/Process.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"; + string internal constant echo = "echo"; + 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. If no git repository is + /// found, it will return the contents of the .gitcommit file. Otherwise, + /// it will return an error. The .gitcommit file is used to store the + /// git commit of the contracts when they are packaged into docker images + /// in order to avoid the need to have a git repository in the image. + 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 || cat .gitcommit)"; + return abi.decode(Process.run(commands), (string)); + } +} diff --git a/packages/contracts-bedrock/scripts/libraries/ForgeArtifacts.sol b/packages/contracts-bedrock/scripts/libraries/ForgeArtifacts.sol new file mode 100644 index 000000000000..4aa4309fad83 --- /dev/null +++ b/packages/contracts-bedrock/scripts/libraries/ForgeArtifacts.sol @@ -0,0 +1,303 @@ +// SPDX-License-Identifier: MIT +pragma solidity ^0.8.0; + +import { Vm } from "forge-std/Vm.sol"; +import { stdJson } from "forge-std/StdJson.sol"; +import { LibString } from "@solady/utils/LibString.sol"; +import { Executables } from "scripts/libraries/Executables.sol"; +import { Process } from "scripts/libraries/Process.sol"; + +/// @notice Contains information about a storage slot. Mirrors the layout of the storage +/// slot object in Forge artifacts so that we can deserialize JSON into this struct. +struct StorageSlot { + uint256 astId; + string _contract; + string label; + uint256 offset; + string slot; + 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 { + /// @notice Foundry cheatcode VM. + Vm private constant vm = Vm(address(uint160(uint256(keccak256("hevm cheat code"))))); + + /// @notice Removes the semantic versioning from a contract name. The semver will exist if the contract is compiled + /// more than once with different versions of the compiler. + function _stripSemver(string memory _name) internal returns (string memory out_) { + string[] memory cmd = new string[](3); + cmd[0] = Executables.bash; + cmd[1] = "-c"; + cmd[2] = string.concat( + Executables.echo, " ", _name, " | ", Executables.sed, " -E 's/[.][0-9]+\\.[0-9]+\\.[0-9]+//g'" + ); + bytes memory res = Process.run(cmd); + out_ = string(res); + } + + /// @notice Builds the fully qualified name of a contract. Assumes that the + /// file name is the same as the contract name but strips semver for the file name. + function _getFullyQualifiedName(string memory _name) internal returns (string memory out_) { + string memory sanitized = _stripSemver(_name); + out_ = string.concat(sanitized, ".sol:", _name); + } + + /// @notice Returns the storage layout for a deployed contract. + function getStorageLayout(string memory _name) internal returns (string memory layout_) { + string[] memory cmd = new string[](3); + cmd[0] = Executables.bash; + cmd[1] = "-c"; + cmd[2] = string.concat(Executables.jq, " -r '.storageLayout' < ", _getForgeArtifactPath(_name)); + bytes memory res = Process.run(cmd); + layout_ = string(res); + } + + /// @notice Returns the abi from a the forge artifact + function getAbi(string memory _name) internal returns (string memory abi_) { + string[] memory cmd = new string[](3); + cmd[0] = Executables.bash; + cmd[1] = "-c"; + cmd[2] = string.concat(Executables.jq, " -r '.abi' < ", _getForgeArtifactPath(_name)); + bytes memory res = Process.run(cmd); + abi_ = string(res); + } + + /// @notice Returns the methodIdentifiers from the forge artifact + function getMethodIdentifiers(string memory _name) internal returns (string[] memory ids_) { + string[] memory cmd = new string[](3); + cmd[0] = Executables.bash; + cmd[1] = "-c"; + cmd[2] = string.concat(Executables.jq, " '.methodIdentifiers // {} | keys ' < ", _getForgeArtifactPath(_name)); + bytes memory res = Process.run(cmd, true); + ids_ = stdJson.readStringArray(string(res), ""); + } + + /// @notice Returns the kind of contract (i.e. library, contract, or interface). + /// @param _name The name of the contract to get the kind of. + /// @return kind_ The kind of contract ("library", "contract", or "interface"). + function getContractKind(string memory _name) internal returns (string memory kind_) { + string[] memory cmd = new string[](3); + cmd[0] = Executables.bash; + cmd[1] = "-c"; + cmd[2] = string.concat( + Executables.jq, + " -r '.ast.nodes[] | select(.nodeType == \"ContractDefinition\") | .contractKind' < ", + _getForgeArtifactPath(_name) + ); + bytes memory res = Process.run(cmd); + kind_ = string(res); + } + + /// @notice Returns whether or not a contract is proxied. + /// @param _name The name of the contract to check. + /// @return out_ Whether or not the contract is proxied. + function isProxiedContract(string memory _name) internal returns (bool out_) { + // TODO: Using the `@custom:proxied` tag is to determine if a contract is meant to be + // proxied is functional but developers can easily forget to add the tag when writing a new + // contract. We should consider determining whether a contract is proxied based on the + // deployment script since it's the source of truth for that. Current deployment script + // does not make this easy but an updated script should likely make this possible. + string[] memory cmd = new string[](3); + cmd[0] = Executables.bash; + cmd[1] = "-c"; + cmd[2] = string.concat( + Executables.jq, + " -r '.rawMetadata' ", + _getForgeArtifactPath(_name), + " | ", + Executables.jq, + " -r '.output.devdoc' | jq -r 'has(\"custom:proxied\")'" + ); + bytes memory res = Process.run(cmd); + out_ = stdJson.readBool(string(res), ""); + } + + /// @notice Returns whether or not a contract is predeployed. + /// @param _name The name of the contract to check. + /// @return out_ Whether or not the contract is predeployed. + function isPredeployedContract(string memory _name) internal returns (bool out_) { + // TODO: Similar to the above, using the `@custom:predeployed` tag is not reliable but + // functional for now. Deployment script should make this easier to determine. + string[] memory cmd = new string[](3); + cmd[0] = Executables.bash; + cmd[1] = "-c"; + cmd[2] = string.concat( + Executables.jq, + " -r '.rawMetadata' ", + _getForgeArtifactPath(_name), + " | ", + Executables.jq, + " -r '.output.devdoc' | jq -r 'has(\"custom:predeploy\")'" + ); + bytes memory res = Process.run(cmd); + out_ = stdJson.readBool(string(res), ""); + } + + function _getForgeArtifactDirectory(string memory _name) internal returns (string memory dir_) { + string[] memory cmd = new string[](3); + cmd[0] = Executables.bash; + cmd[1] = "-c"; + cmd[2] = string.concat(Executables.forge, " config --json | ", Executables.jq, " -r .out"); + bytes memory res = Process.run(cmd); + string memory contractName = _stripSemver(_name); + dir_ = string.concat(vm.projectRoot(), "/", string(res), "/", contractName, ".sol"); + } + + /// @notice Returns the filesystem path to the artifact path. If the contract was compiled + /// with multiple solidity versions then return the first one based on the result of `ls`. + function _getForgeArtifactPath(string memory _name) internal returns (string memory out_) { + string memory directory = _getForgeArtifactDirectory(_name); + string memory path = string.concat(directory, "/", _name, ".json"); + if (vm.exists(path)) { + return path; + } + + string[] memory cmd = new string[](3); + cmd[0] = Executables.bash; + cmd[1] = "-c"; + cmd[2] = string.concat( + Executables.ls, + " -1 --color=never ", + directory, + " | ", + Executables.jq, + " -R -s -c 'split(\"\n\") | map(select(length > 0))'" + ); + bytes memory res = Process.run(cmd); + string[] memory files = stdJson.readStringArray(string(res), ""); + out_ = string.concat(directory, "/", files[0]); + } + + /// @notice Returns the forge artifact given a contract name. + function _getForgeArtifact(string memory _name) internal returns (string memory out_) { + string memory forgeArtifactPath = _getForgeArtifactPath(_name); + out_ = vm.readFile(forgeArtifactPath); + } + + /// @notice Pulls the `_initialized` storage slot information from the Forge artifacts for a given contract. + function getInitializedSlot(string memory _contractName) internal returns (StorageSlot memory slot_) { + string memory storageLayout = getStorageLayout(_contractName); + + // FaultDisputeGame and PermissionedDisputeGame use a different name for the initialized storage slot. + string memory slotName = "_initialized"; + string memory slotType = "t_uint8"; + if (LibString.eq(_contractName, "FaultDisputeGame") || LibString.eq(_contractName, "PermissionedDisputeGame")) { + slotName = "initialized"; + slotType = "t_bool"; + } + + string[] memory command = new string[](3); + command[0] = Executables.bash; + command[1] = "-c"; + command[2] = string.concat( + Executables.echo, + " '", + storageLayout, + "'", + " | ", + Executables.jq, + " '.storage[] | select(.label == \"", + slotName, + "\" and .type == \"", + slotType, + "\")'" + ); + bytes memory rawSlot = vm.parseJson(string(Process.run(command))); + 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 names of all contracts in a given directory. + /// @param _path The path to search for contracts. + /// @param _pathExcludes An array of paths to exclude from the search. + /// @return contractNames_ An array of contract names. + function getContractNames( + string memory _path, + string[] memory _pathExcludes + ) + internal + returns (string[] memory contractNames_) + { + 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]'" + ); + + contractNames_ = abi.decode(vm.parseJson(string(Process.run(command))), (string[])); + } + + /// @notice Returns the function ABIs of all L1 contracts. + function getContractFunctionAbis( + string memory path, + string[] memory pathExcludes + ) + internal + returns (Abi[] memory abis_) + { + string[] memory contractNames = getContractNames(path, pathExcludes); + 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 { + string[] memory outputs = vm.split(_path, "/"); + string memory path = ""; + for (uint256 i = 0; i < outputs.length - 1; i++) { + path = string.concat(path, outputs[i], "/"); + } + vm.createDir(path, true); + } +} diff --git a/packages/contracts-bedrock/scripts/libraries/Process.sol b/packages/contracts-bedrock/scripts/libraries/Process.sol new file mode 100644 index 000000000000..d2cf5c3af4aa --- /dev/null +++ b/packages/contracts-bedrock/scripts/libraries/Process.sol @@ -0,0 +1,37 @@ +// SPDX-License-Identifier: MIT +pragma solidity ^0.8.0; + +import { Vm } from "forge-std/Vm.sol"; + +library Process { + /// @notice Error for when an ffi command fails. + error FfiFailed(string); + + /// @notice Foundry cheatcode VM. + Vm private constant vm = Vm(address(uint160(uint256(keccak256("hevm cheat code"))))); + + /// @notice Run a command in a subprocess. Fails if no output is returned. + /// @param _command Command to run. + function run(string[] memory _command) internal returns (bytes memory stdout_) { + stdout_ = run({ _command: _command, _allowEmpty: false }); + } + + /// @notice Run a command in a subprocess. + /// @param _command Command to run. + /// @param _allowEmpty Allow empty output. + function run(string[] memory _command, bool _allowEmpty) internal returns (bytes memory stdout_) { + Vm.FfiResult memory result = vm.tryFfi(_command); + string memory command; + for (uint256 i = 0; i < _command.length; i++) { + command = string.concat(command, _command[i], " "); + } + if (result.exitCode != 0) { + revert FfiFailed(string.concat("Command: ", command, "\nError: ", string(result.stderr))); + } + // If the output is empty, result.stdout is "[]". + if (!_allowEmpty && keccak256(result.stdout) == keccak256(bytes("[]"))) { + revert FfiFailed(string.concat("No output from Command: ", command)); + } + stdout_ = result.stdout; + } +} diff --git a/packages/contracts-bedrock/scripts/libraries/Solarray.sol b/packages/contracts-bedrock/scripts/libraries/Solarray.sol new file mode 100644 index 000000000000..57ef9b320bb0 --- /dev/null +++ b/packages/contracts-bedrock/scripts/libraries/Solarray.sol @@ -0,0 +1,245 @@ +// SPDX-License-Identifier: MIT +pragma solidity ^0.8.13; + +// A trimmed-down and formatted version of https://github.com/emo-eth/solarray. +// +// This is provided to provide better UX when generating and using arrays in tests and scripts, +// since Solidity does not have great array UX. +// +// This library was generated using the `generator.py` script from the linked repo with the length +// set accordingly, and then everything except the `addresses` functions was removed. +library Solarray { + function addresses(address a) internal pure returns (address[] memory) { + address[] memory arr = new address[](1); + arr[0] = a; + return arr; + } + + function addresses(address a, address b) internal pure returns (address[] memory) { + address[] memory arr = new address[](2); + arr[0] = a; + arr[1] = b; + return arr; + } + + function addresses(address a, address b, address c) internal pure returns (address[] memory) { + address[] memory arr = new address[](3); + arr[0] = a; + arr[1] = b; + arr[2] = c; + return arr; + } + + function addresses(address a, address b, address c, address d) internal pure returns (address[] memory) { + address[] memory arr = new address[](4); + arr[0] = a; + arr[1] = b; + arr[2] = c; + arr[3] = d; + return arr; + } + + function addresses( + address a, + address b, + address c, + address d, + address e + ) + internal + pure + returns (address[] memory) + { + address[] memory arr = new address[](5); + arr[0] = a; + arr[1] = b; + arr[2] = c; + arr[3] = d; + arr[4] = e; + return arr; + } + + function addresses( + address a, + address b, + address c, + address d, + address e, + address f + ) + internal + pure + returns (address[] memory) + { + address[] memory arr = new address[](6); + arr[0] = a; + arr[1] = b; + arr[2] = c; + arr[3] = d; + arr[4] = e; + arr[5] = f; + return arr; + } + + function addresses( + address a, + address b, + address c, + address d, + address e, + address f, + address g + ) + internal + pure + returns (address[] memory) + { + address[] memory arr = new address[](7); + arr[0] = a; + arr[1] = b; + arr[2] = c; + arr[3] = d; + arr[4] = e; + arr[5] = f; + arr[6] = g; + return arr; + } + + function addresses( + address a, + address b, + address c, + address d, + address e, + address f, + address g, + address h + ) + internal + pure + returns (address[] memory) + { + address[] memory arr = new address[](8); + arr[0] = a; + arr[1] = b; + arr[2] = c; + arr[3] = d; + arr[4] = e; + arr[5] = f; + arr[6] = g; + arr[7] = h; + return arr; + } + + function addresses( + address a, + address b, + address c, + address d, + address e, + address f, + address g, + address h, + address i + ) + internal + pure + returns (address[] memory) + { + address[] memory arr = new address[](9); + arr[0] = a; + arr[1] = b; + arr[2] = c; + arr[3] = d; + arr[4] = e; + arr[5] = f; + arr[6] = g; + arr[7] = h; + arr[8] = i; + return arr; + } + + function addresses( + address a, + address b, + address c, + address d, + address e, + address f, + address g, + address h, + address i, + address j + ) + internal + pure + returns (address[] memory) + { + address[] memory arr = new address[](10); + arr[0] = a; + arr[1] = b; + arr[2] = c; + arr[3] = d; + arr[4] = e; + arr[5] = f; + arr[6] = g; + arr[7] = h; + arr[8] = i; + arr[9] = j; + return arr; + } + + function addresses( + address a, + address b, + address c, + address d, + address e, + address f, + address g, + address h, + address i, + address j, + address k + ) + internal + pure + returns (address[] memory) + { + address[] memory arr = new address[](11); + arr[0] = a; + arr[1] = b; + arr[2] = c; + arr[3] = d; + arr[4] = e; + arr[5] = f; + arr[6] = g; + arr[7] = h; + arr[8] = i; + arr[9] = j; + arr[10] = k; + return arr; + } + + function extend(address[] memory arr1, address[] memory arr2) internal pure returns (address[] memory newArr) { + uint256 length1 = arr1.length; + uint256 length2 = arr2.length; + newArr = new address[](length1 + length2); + for (uint256 i = 0; i < length1;) { + newArr[i] = arr1[i]; + unchecked { + ++i; + } + } + for (uint256 i = 0; i < arr2.length;) { + uint256 j; + unchecked { + j = i + length1; + } + newArr[j] = arr2[i]; + unchecked { + ++i; + } + } + } +} diff --git a/packages/contracts-bedrock/scripts/Types.sol b/packages/contracts-bedrock/scripts/libraries/Types.sol similarity index 93% rename from packages/contracts-bedrock/scripts/Types.sol rename to packages/contracts-bedrock/scripts/libraries/Types.sol index c8b48dc1e704..7733be34f3b5 100644 --- a/packages/contracts-bedrock/scripts/Types.sol +++ b/packages/contracts-bedrock/scripts/libraries/Types.sol @@ -9,6 +9,7 @@ library Types { address L2OutputOracle; address DisputeGameFactory; address DelayedWETH; + address PermissionedDelayedWETH; address AnchorStateRegistry; address OptimismMintableERC20Factory; address OptimismPortal; diff --git a/packages/contracts-bedrock/scripts/FeeVaultWithdrawal.s.sol b/packages/contracts-bedrock/scripts/ops/FeeVaultWithdrawal.s.sol similarity index 96% rename from packages/contracts-bedrock/scripts/FeeVaultWithdrawal.s.sol rename to packages/contracts-bedrock/scripts/ops/FeeVaultWithdrawal.s.sol index f16cc994a4a2..e19cd7e994bd 100644 --- a/packages/contracts-bedrock/scripts/FeeVaultWithdrawal.s.sol +++ b/packages/contracts-bedrock/scripts/ops/FeeVaultWithdrawal.s.sol @@ -3,9 +3,9 @@ pragma solidity 0.8.15; import { console } from "forge-std/console.sol"; import { Script } from "forge-std/Script.sol"; -import { Predeploys } from "../src/libraries/Predeploys.sol"; -import { FeeVault } from "../src/universal/FeeVault.sol"; import { IMulticall3 } from "forge-std/interfaces/IMulticall3.sol"; +import { Predeploys } from "src/libraries/Predeploys.sol"; +import { FeeVault } from "src/universal/FeeVault.sol"; /// @title FeeVaultWithdrawal /// @notice A script to make it very simple to withdraw from the fee vaults. diff --git a/packages/contracts-bedrock/scripts/ops/calculate-checksum.sh b/packages/contracts-bedrock/scripts/ops/calculate-checksum.sh new file mode 100644 index 000000000000..6278e37ffa74 --- /dev/null +++ b/packages/contracts-bedrock/scripts/ops/calculate-checksum.sh @@ -0,0 +1,25 @@ +#!/usr/bin/env bash + +set -euo pipefail + +echoerr() { + echo "$@" 1>&2 +} + +SCRIPT_DIR=$( cd -- "$( dirname -- "${BASH_SOURCE[0]}" )" &> /dev/null && pwd ) +CONTRACTS_DIR="$SCRIPT_DIR/../.." + +cd "$CONTRACTS_DIR" + +echoerr "> Calculating contracts checksum..." + +find . -type f -name '*.sol' -exec sha256sum {} + > manifest.txt +sha256sum semver-lock.json >> manifest.txt +sha256sum foundry.toml >> manifest.txt +# need to specify the locale to ensure consistent sorting across platforms +LC_ALL=C sort -o manifest.txt manifest.txt +checksum=$(sha256sum manifest.txt | awk '{print $1}') +rm manifest.txt +echoerr "> Done." + +echo -n "$checksum" \ No newline at end of file diff --git a/packages/contracts-bedrock/scripts/ops/publish-artifacts.sh b/packages/contracts-bedrock/scripts/ops/publish-artifacts.sh new file mode 100644 index 000000000000..309b2d818eda --- /dev/null +++ b/packages/contracts-bedrock/scripts/ops/publish-artifacts.sh @@ -0,0 +1,54 @@ +#!/usr/bin/env bash + +set -euo pipefail + +echoerr() { + echo "$@" 1>&2 +} + +SCRIPT_DIR=$( cd -- "$( dirname -- "${BASH_SOURCE[0]}" )" &> /dev/null && pwd ) +CONTRACTS_DIR="$SCRIPT_DIR/../.." +DEPLOY_BUCKET="oplabs-contract-artifacts" + +cd "$CONTRACTS_DIR" + +# ensure that artifacts exists and is non-empty +if [ ! -d "forge-artifacts" ] || [ -z "$(ls -A forge-artifacts)" ]; then + echoerr "> No forge-artifacts directory found." + exit 1 +fi + +if [ ! -d "artifacts" ] || [ -z "$(ls -A artifacts)" ]; then + echoerr "> No artifacts directory found." + exit 1 +fi + +checksum=$(bash scripts/ops/calculate-checksum.sh) + +echoerr "> Checking for existing artifacts..." +exists=$(curl -s -o /dev/null --fail -LI "https://storage.googleapis.com/$DEPLOY_BUCKET/artifacts-v1-$checksum.tar.gz" || echo "fail") + +if [ "$exists" != "fail" ]; then + echoerr "> Existing artifacts found, nothing to do." + exit 0 +fi + +echoerr "> Archiving artifacts..." +archive_name="artifacts-v1-$checksum.tar.gz" + +# use gtar on darwin +if [[ "$OSTYPE" == "darwin"* ]]; then + tar="gtar" +else + tar="tar" +fi + +"$tar" -czf "$archive_name" artifacts forge-artifacts cache +du -sh "$archive_name" | awk '{$1=$1};1' # trim leading whitespace +echoerr "> Done." + +echoerr "> Uploading artifacts to GCS..." +gcloud storage cp "$archive_name" "gs://$DEPLOY_BUCKET/$archive_name" +echoerr "> Done." + +rm "$archive_name" \ No newline at end of file diff --git a/packages/contracts-bedrock/scripts/ops/pull-artifacts.sh b/packages/contracts-bedrock/scripts/ops/pull-artifacts.sh new file mode 100644 index 000000000000..f119b087f38c --- /dev/null +++ b/packages/contracts-bedrock/scripts/ops/pull-artifacts.sh @@ -0,0 +1,41 @@ +#!/usr/bin/env bash + +set -euo pipefail + +echoerr() { + echo "$@" 1>&2 +} + +SCRIPT_DIR=$( cd -- "$( dirname -- "${BASH_SOURCE[0]}" )" &> /dev/null && pwd ) +CONTRACTS_DIR="$SCRIPT_DIR/../.." + +cd "$CONTRACTS_DIR" + +checksum=$(bash scripts/ops/calculate-checksum.sh) +archive_name="artifacts-v1-$checksum.tar.gz" + +echoerr "> Checking for existing artifacts..." +exists=$(curl -s -o /dev/null --fail -LI "https://storage.googleapis.com/oplabs-contract-artifacts/$archive_name" || echo "fail") + +if [ "$exists" == "fail" ]; then + echoerr "> No existing artifacts found, exiting." + exit 0 +fi + +echoerr "> Cleaning up existing artifacts..." +rm -rf artifacts +rm -rf forge-artifacts +rm -rf cache +echoerr "> Done." + +echoerr "> Found existing artifacts. Downloading..." +curl -o "$archive_name" "https://storage.googleapis.com/oplabs-contract-artifacts/$archive_name" +echoerr "> Done." + +echoerr "> Extracting existing artifacts..." +tar -xzvf "$archive_name" +echoerr "> Done." + +echoerr "> Cleaning up." +rm "$archive_name" +echoerr "> Done." \ No newline at end of file diff --git a/packages/contracts-bedrock/scripts/periphery/deploy/DeployPeriphery.s.sol b/packages/contracts-bedrock/scripts/periphery/deploy/DeployPeriphery.s.sol new file mode 100644 index 000000000000..8f4b86b95d62 --- /dev/null +++ b/packages/contracts-bedrock/scripts/periphery/deploy/DeployPeriphery.s.sol @@ -0,0 +1,299 @@ +// SPDX-License-Identifier: MIT +pragma solidity ^0.8.0; + +import { console2 as console } from "forge-std/console2.sol"; +import { Script } from "forge-std/Script.sol"; + +import { Config } from "scripts/libraries/Config.sol"; +import { Artifacts } from "scripts/Artifacts.s.sol"; +import { PeripheryDeployConfig } from "scripts/periphery/deploy/PeripheryDeployConfig.s.sol"; + +import { ProxyAdmin } from "src/universal/ProxyAdmin.sol"; +import { Proxy } from "src/universal/Proxy.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"; +import { CheckBalanceLow } from "src/periphery/drippie/dripchecks/CheckBalanceLow.sol"; +import { CheckTrue } from "src/periphery/drippie/dripchecks/CheckTrue.sol"; +import { CheckSecrets } from "src/periphery/drippie/dripchecks/CheckSecrets.sol"; +import { AdminFaucetAuthModule } from "src/periphery/faucet/authmodules/AdminFaucetAuthModule.sol"; + +import { EIP1967Helper } from "test/mocks/EIP1967Helper.sol"; + +/// @title DeployPeriphery +/// @notice Script used to deploy periphery contracts. +contract DeployPeriphery is Script, Artifacts { + /// @notice Error emitted when an address mismatch is detected. + error AddressMismatch(string, address, address); + + /// @notice Deployment configuration. + PeripheryDeployConfig cfg; + + /// @notice Sets up the deployment script. + function setUp() public override { + Artifacts.setUp(); + cfg = new PeripheryDeployConfig(Config.deployConfigPath()); + console.log("Config path: %s", Config.deployConfigPath()); + } + + /// @notice Deploy all of the periphery contracts. + function run() public { + console.log("Deploying periphery contracts"); + + // Optionally deploy the base dripcheck contracts. + if (cfg.deployDripchecks()) { + deployCheckTrue(); + deployCheckBalanceLow(); + deployCheckGelatoLow(); + deployCheckSecrets(); + } + + // Optionally deploy the faucet contracts. + if (cfg.deployFaucetContracts()) { + // Deploy faucet contracts. + deployProxyAdmin(); + deployFaucetProxy(); + deployFaucet(); + deployFaucetDrippie(); + deployOnChainAuthModule(); + deployOffChainAuthModule(); + + // Initialize the faucet. + initializeFaucet(); + installFaucetAuthModulesConfigs(); + } + + // Optionally deploy the operations contracts. + if (cfg.deployOperationsContracts()) { + deployOperationsDrippie(); + } + } + + /// @notice Modifier that wraps a function in broadcasting. + modifier broadcast() { + vm.startBroadcast(); + _; + vm.stopBroadcast(); + } + + /// @notice Deploy ProxyAdmin. + function deployProxyAdmin() public broadcast returns (address addr_) { + addr_ = _deployCreate2({ + _name: "ProxyAdmin", + _creationCode: type(ProxyAdmin).creationCode, + _constructorParams: abi.encode(msg.sender) + }); + + ProxyAdmin admin = ProxyAdmin(addr_); + require(admin.owner() == msg.sender); + } + + /// @notice Deploy FaucetProxy. + function deployFaucetProxy() public broadcast returns (address addr_) { + addr_ = _deployCreate2({ + _name: "FaucetProxy", + _creationCode: type(Proxy).creationCode, + _constructorParams: abi.encode(mustGetAddress("ProxyAdmin")) + }); + + Proxy proxy = Proxy(payable(addr_)); + require(EIP1967Helper.getAdmin(address(proxy)) == mustGetAddress("ProxyAdmin")); + } + + /// @notice Deploy the Faucet contract. + function deployFaucet() public broadcast returns (address addr_) { + addr_ = _deployCreate2({ + _name: "Faucet", + _creationCode: type(Faucet).creationCode, + _constructorParams: abi.encode(cfg.faucetAdmin()) + }); + + Faucet faucet = Faucet(payable(addr_)); + require(faucet.ADMIN() == cfg.faucetAdmin()); + } + + /// @notice Deploy the Drippie contract. + function deployFaucetDrippie() public broadcast returns (address addr_) { + addr_ = _deployCreate2({ + _name: "FaucetDrippie", + _creationCode: type(Drippie).creationCode, + _constructorParams: abi.encode(cfg.faucetDrippieOwner()) + }); + + Drippie drippie = Drippie(payable(addr_)); + require(drippie.owner() == cfg.faucetDrippieOwner()); + } + + /// @notice Deploy the Drippie contract for standard operations. + function deployOperationsDrippie() public broadcast returns (address addr_) { + addr_ = _deployCreate2({ + _name: "OperationsDrippie", + _creationCode: type(Drippie).creationCode, + _constructorParams: abi.encode(cfg.operationsDrippieOwner()) + }); + + Drippie drippie = Drippie(payable(addr_)); + require(drippie.owner() == cfg.operationsDrippieOwner()); + } + + /// @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 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") + }); + + AdminFaucetAuthModule module = AdminFaucetAuthModule(addr_); + require(module.ADMIN() == cfg.faucetOffchainAuthModuleAdmin()); + } + + /// @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_) { + addr_ = _deployCreate2({ + _name: "CheckBalanceLow", + _creationCode: type(CheckBalanceLow).creationCode, + _constructorParams: hex"" + }); + } + + /// @notice Deploy CheckGelatoLow contract. + function deployCheckGelatoLow() public broadcast returns (address addr_) { + addr_ = _deployCreate2({ + _name: "CheckGelatoLow", + _creationCode: type(CheckGelatoLow).creationCode, + _constructorParams: hex"" + }); + } + + /// @notice Deploy CheckSecrets contract. + function deployCheckSecrets() public broadcast returns (address addr_) { + addr_ = _deployCreate2({ + _name: "CheckSecrets", + _creationCode: type(CheckSecrets).creationCode, + _constructorParams: hex"" + }); + } + + /// @notice Initialize the Faucet. + function initializeFaucet() public broadcast { + ProxyAdmin proxyAdmin = ProxyAdmin(mustGetAddress("ProxyAdmin")); + address faucetProxy = mustGetAddress("FaucetProxy"); + address faucet = mustGetAddress("Faucet"); + address implementationAddress = proxyAdmin.getProxyImplementation(faucetProxy); + if (implementationAddress == faucet) { + console.log("Faucet proxy implementation already set"); + } else { + proxyAdmin.upgrade({ _proxy: payable(faucetProxy), _implementation: faucet }); + } + + require(Faucet(payable(faucetProxy)).ADMIN() == Faucet(payable(faucet)).ADMIN()); + } + + /// @notice Installs the OnChain AuthModule on the Faucet contract. + function installOnChainAuthModule() public broadcast { + _installAuthModule({ + _faucet: Faucet(mustGetAddress("FaucetProxy")), + _name: "OnChainAuthModule", + _config: Faucet.ModuleConfig({ + name: "OnChainAuthModule", + enabled: true, + ttl: cfg.faucetOnchainAuthModuleTtl(), + amount: cfg.faucetOnchainAuthModuleAmount() + }) + }); + } + + /// @notice Installs the OffChain AuthModule on the Faucet contract. + function installOffChainAuthModule() public broadcast { + _installAuthModule({ + _faucet: Faucet(mustGetAddress("FaucetProxy")), + _name: "OffChainAuthModule", + _config: Faucet.ModuleConfig({ + name: "OffChainAuthModule", + enabled: true, + ttl: cfg.faucetOffchainAuthModuleTtl(), + amount: cfg.faucetOffchainAuthModuleAmount() + }) + }); + } + + /// @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"); + } + + /// @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_) + { + bytes32 salt = keccak256(abi.encodePacked(bytes(_name), cfg.create2DeploymentSalt())); + bytes memory initCode = abi.encodePacked(_creationCode, _constructorParams); + address preComputedAddress = vm.computeCreate2Address(salt, keccak256(initCode)); + if (preComputedAddress.code.length > 0) { + console.log("%s already deployed at %s", _name, preComputedAddress); + address savedAddress = getAddress(_name); + if (savedAddress == address(0)) { + save(_name, preComputedAddress); + } else if (savedAddress != preComputedAddress) { + revert AddressMismatch(_name, preComputedAddress, savedAddress); + } + 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); + } + } +} diff --git a/packages/contracts-bedrock/scripts/periphery/deploy/PeripheryDeployConfig.s.sol b/packages/contracts-bedrock/scripts/periphery/deploy/PeripheryDeployConfig.s.sol new file mode 100644 index 000000000000..a4a6e2bfa379 --- /dev/null +++ b/packages/contracts-bedrock/scripts/periphery/deploy/PeripheryDeployConfig.s.sol @@ -0,0 +1,76 @@ +// SPDX-License-Identifier: MIT +pragma solidity ^0.8.0; + +import { Script } from "forge-std/Script.sol"; +import { console2 as console } from "forge-std/console2.sol"; +import { stdJson } from "forge-std/StdJson.sol"; + +/// @title PeripheryDeployConfig +/// @notice Represents the configuration required to deploy the periphery contracts. It is expected +/// to read the file from JSON. A future improvement would be to have fallback +/// values if they are not defined in the JSON themselves. +contract PeripheryDeployConfig is Script { + string internal _json; + + // General configuration. + string public create2DeploymentSalt; + + // Configuration for Gelato. + address public gelatoAutomateContract; + + // Configuration for standard operations Drippie contract. + address public operationsDrippieOwner; + + // Configuration for the faucet Drippie contract. + address public faucetDrippieOwner; + + // Configuration for the Faucet contract. + address public faucetAdmin; + address public faucetOnchainAuthModuleAdmin; + uint256 public faucetOnchainAuthModuleTtl; + uint256 public faucetOnchainAuthModuleAmount; + address public faucetOffchainAuthModuleAdmin; + uint256 public faucetOffchainAuthModuleTtl; + uint256 public faucetOffchainAuthModuleAmount; + + // Configuration booleans. + bool public deployDripchecks; + bool public deployFaucetContracts; + bool public deployOperationsContracts; + + constructor(string memory _path) { + console.log("PeripheryDeployConfig: reading file %s", _path); + try vm.readFile(_path) returns (string memory data) { + _json = data; + } catch { + console.log("Warning: unable to read config. Do not deploy unless you are not using config."); + return; + } + + // General configuration. + create2DeploymentSalt = stdJson.readString(_json, "$.create2DeploymentSalt"); + + // Configuration for Gelato. + gelatoAutomateContract = stdJson.readAddress(_json, "$.gelatoAutomateContract"); + + // Configuration for the standard operations Drippie contract. + operationsDrippieOwner = stdJson.readAddress(_json, "$.operationsDrippieOwner"); + + // Configuration for the faucet Drippie contract. + faucetDrippieOwner = stdJson.readAddress(_json, "$.faucetDrippieOwner"); + + // Configuration for the Faucet contract. + faucetAdmin = stdJson.readAddress(_json, "$.faucetAdmin"); + faucetOnchainAuthModuleAdmin = stdJson.readAddress(_json, "$.faucetOnchainAuthModuleAdmin"); + faucetOnchainAuthModuleTtl = stdJson.readUint(_json, "$.faucetOnchainAuthModuleTtl"); + faucetOnchainAuthModuleAmount = stdJson.readUint(_json, "$.faucetOnchainAuthModuleAmount"); + faucetOffchainAuthModuleAdmin = stdJson.readAddress(_json, "$.faucetOffchainAuthModuleAdmin"); + faucetOffchainAuthModuleTtl = stdJson.readUint(_json, "$.faucetOffchainAuthModuleTtl"); + faucetOffchainAuthModuleAmount = stdJson.readUint(_json, "$.faucetOffchainAuthModuleAmount"); + + // Configuration booleans. + deployDripchecks = stdJson.readBool(_json, "$.deployDripchecks"); + deployFaucetContracts = stdJson.readBool(_json, "$.deployFaucetContracts"); + deployOperationsContracts = stdJson.readBool(_json, "$.deployOperationsContracts"); + } +} diff --git a/packages/contracts-bedrock/scripts/periphery/drippie/DrippieConfig.s.sol b/packages/contracts-bedrock/scripts/periphery/drippie/DrippieConfig.s.sol new file mode 100644 index 000000000000..3ab115ba326f --- /dev/null +++ b/packages/contracts-bedrock/scripts/periphery/drippie/DrippieConfig.s.sol @@ -0,0 +1,177 @@ +// SPDX-License-Identifier: MIT +pragma solidity ^0.8.0; + +import { Script } from "forge-std/Script.sol"; +import { console2 as console } from "forge-std/console2.sol"; +import { stdJson } from "forge-std/StdJson.sol"; + +import { IAutomate as IGelato } from "gelato/interfaces/IAutomate.sol"; + +import { Drippie } from "src/periphery/drippie/Drippie.sol"; +import { CheckBalanceLow } from "src/periphery/drippie/dripchecks/CheckBalanceLow.sol"; +import { CheckGelatoLow } from "src/periphery/drippie/dripchecks/CheckGelatoLow.sol"; +import { CheckSecrets } from "src/periphery/drippie/dripchecks/CheckSecrets.sol"; + +/// @title DrippieConfig +/// @notice Loads Drippie configuration from a JSON file. +contract DrippieConfig is Script { + /// @notice Error emitted when an unknown drip check is encountered. + error UnknownDripCheck(string name); + + /// @notice Struct describing a dripcheck. + struct DripCheck { + string name; + address addr; + } + + /// @notice Drip configuration with only name and dripcheck. + struct CoreDripConfig { + string name; + string dripcheck; + } + + /// @notice Full drip configuration. + struct FullDripConfig { + string name; + string dripcheck; + bytes checkparams; + address recipient; + uint256 value; + uint256 interval; + bytes data; + } + + /// @notice JSON configuration file represented as string. + string internal _json; + + /// @notice Drippie contract. + Drippie public drippie; + + /// @notice Gelato automation contract. + IGelato public gelato; + + /// @notice Prefix for the configuration file. + string public prefix; + + /// @notice Drip configuration array. + FullDripConfig[] public drips; + + /// @notice Mapping of drip names in the config. + mapping(string => bool) public names; + + /// @notice Mapping of dripcheck names to addresses. + mapping(string => address) public dripchecks; + + /// @param _path Path to the configuration file. + constructor(string memory _path) { + // Load the configuration file. + console.log("DrippieConfig: reading file %s", _path); + try vm.readFile(_path) returns (string memory data) { + _json = data; + } catch { + console.log("WARNING: unable to read config, do not deploy unless you are not using config"); + return; + } + + // Load the Drippie contract address. + drippie = Drippie(payable(stdJson.readAddress(_json, "$.drippie"))); + + // Load the Gelato contract address. + gelato = IGelato(stdJson.readAddress(_json, "$.gelato")); + + // Load the prefix. + prefix = stdJson.readString(_json, "$.prefix"); + + // Determine the number of drips. + // In an ideal world we'd be able to load this array in one go by parsing it as an array + // of structs that include the checkparams as bytes. Unfortunately, Foundry parses the + // checkparams as a tuple which can't be parsed in a generic way (since Solidity does not + // support generics). As a result, we first parse the array as a simplified struct that + // only includes the first two fields so that we can determine the number of drips. We then + // iterate over the array and parse the full struct for each drip somewhat manually. + CoreDripConfig[] memory corecfg = abi.decode(stdJson.parseRaw(_json, "$.drips"), (CoreDripConfig[])); + console.log("DrippieConfig: found %d drips", corecfg.length); + + // Load the dripchecks. + DripCheck[] memory checks = abi.decode(stdJson.parseRaw(_json, "$.dripchecks"), (DripCheck[])); + for (uint256 i = 0; i < checks.length; i++) { + dripchecks[checks[i].name] = checks[i].addr; + } + + // Iterate and parse all of the drips. + for (uint256 i = 0; i < corecfg.length; i++) { + // Log so we know what's being loaded. + string memory name = corecfg[i].name; + string memory fullname = string.concat(prefix, "_", name); + console.log("DrippieConfig: attempting to load config for %s", fullname); + + // Make sure the dripcheck is deployed. + string memory dripcheck = corecfg[i].dripcheck; + console.log("DrippieConfig: attempting to get address for %s", dripcheck); + mustGetDripCheck(dripcheck); + + // Generate the base JSON path string. + string memory p = string.concat("$.drips[", vm.toString(i), "]"); + + // Load the checkparams as bytes. + bytes memory checkparams = stdJson.parseRaw(_json, string.concat(p, ".02__checkparams")); + + // Determine if the parameters are decodable. + console.log("DrippieConfig: attempting to decode check parameters for %s", fullname); + if (strcmp(dripcheck, "CheckBalanceLow")) { + abi.decode(checkparams, (CheckBalanceLow.Params)); + } else if (strcmp(dripcheck, "CheckGelatoLow")) { + abi.decode(checkparams, (CheckGelatoLow.Params)); + } else if (strcmp(dripcheck, "CheckSecrets")) { + abi.decode(checkparams, (CheckSecrets.Params)); + } else if (strcmp(dripcheck, "CheckTrue")) { + // No parameters to decode. + } else { + console.log("ERROR: unknown drip configuration %s", dripcheck); + revert UnknownDripCheck(dripcheck); + } + + // Parse all the easy stuff first. + console.log("DrippieConfig: attempting to load core configuration for %s", name); + FullDripConfig memory dripcfg = FullDripConfig({ + name: fullname, + dripcheck: dripcheck, + checkparams: checkparams, + recipient: stdJson.readAddress(_json, string.concat(p, ".03__recipient")), + value: stdJson.readUint(_json, string.concat(p, ".04__value")), + interval: stdJson.readUint(_json, string.concat(p, ".05__interval")), + data: stdJson.parseRaw(_json, string.concat(p, ".06__data")) + }); + + // Ok we're good to go. + drips.push(dripcfg); + names[fullname] = true; + } + } + + /// @notice Returns the number of drips in the configuration. + function dripsLength() public view returns (uint256) { + return drips.length; + } + + /// @notice Returns the drip configuration at the given index as ABI-encoded bytes. + function drip(uint256 _index) public view returns (bytes memory) { + return abi.encode(drips[_index]); + } + + /// @notice Retrieves the address of a dripcheck and reverts if it is not found. + /// @param _name Name of the dripcheck. + /// @return addr_ Address of the dripcheck. + function mustGetDripCheck(string memory _name) public view returns (address addr_) { + addr_ = dripchecks[_name]; + require(addr_ != address(0), "DrippieConfig: unknown dripcheck"); + } + + /// @notice Check if two strings are equal. + /// @param _a First string. + /// @param _b Second string. + /// @return True if the strings are equal, false otherwise. + function strcmp(string memory _a, string memory _b) internal pure returns (bool) { + return keccak256(bytes(_a)) == keccak256(bytes(_b)); + } +} diff --git a/packages/contracts-bedrock/scripts/periphery/drippie/ManageDrippie.s.sol b/packages/contracts-bedrock/scripts/periphery/drippie/ManageDrippie.s.sol new file mode 100644 index 000000000000..f37a16f547f9 --- /dev/null +++ b/packages/contracts-bedrock/scripts/periphery/drippie/ManageDrippie.s.sol @@ -0,0 +1,241 @@ +// SPDX-License-Identifier: MIT +pragma solidity ^0.8.0; + +import { console2 as console } from "forge-std/console2.sol"; +import { Script } from "forge-std/Script.sol"; + +import { LibString } from "@solady/utils/LibString.sol"; + +import { IAutomate as IGelato } from "gelato/interfaces/IAutomate.sol"; +import { LibDataTypes as GelatoDataTypes } from "gelato/libraries/LibDataTypes.sol"; +import { LibTaskId as GelatoTaskId } from "gelato/libraries/LibTaskId.sol"; +import { GelatoBytes } from "gelato/vendor/gelato/GelatoBytes.sol"; + +import { Config } from "scripts/libraries/Config.sol"; +import { DrippieConfig } from "scripts/periphery/drippie/DrippieConfig.s.sol"; + +import { Drippie } from "src/periphery/drippie/Drippie.sol"; +import { IDripCheck } from "src/periphery/drippie/IDripCheck.sol"; + +/// @title ManageDrippie +/// @notice Script for managing drips in the Drippie contract. +contract ManageDrippie is Script { + /// @notice Struct that contains the data for a Gelato task. + struct GelatoTaskData { + address taskCreator; + address execAddress; + bytes execData; + GelatoDataTypes.ModuleData moduleData; + address feeToken; + } + + /// @notice Drippie configuration. + DrippieConfig public cfg; + + /// @notice Modifier that wraps a function in broadcasting. + modifier broadcast() { + vm.startBroadcast(msg.sender); + _; + vm.stopBroadcast(); + } + + /// @notice Sets up the deployment script. + function setUp() public { + cfg = new DrippieConfig(Config.deployConfigPath()); + console.log("Config path: %s", Config.deployConfigPath()); + } + + /// @notice Runs the management script. + function run() public { + pauseDrips(); + installDrips(); + } + + /// @notice Pauses drips that have been removed from config. + function pauseDrips() public broadcast { + console.log("ManageDrippie: pausing removed drips"); + for (uint256 i = 0; i < cfg.drippie().getDripCount(); i++) { + // Skip drips that aren't prefixed for this config file. + string memory name = cfg.drippie().created(i); + if (!LibString.startsWith(name, cfg.prefix())) { + continue; + } + + // Pause drips that are no longer in the config if not already paused. + if (!cfg.names(name)) { + // Pause the drip if it's active. + if (cfg.drippie().getDripStatus(name) == Drippie.DripStatus.ACTIVE) { + console.log("ManageDrippie: pausing drip for %s", name); + cfg.drippie().status(name, Drippie.DripStatus.PAUSED); + } + + // Cancel the Gelato task if it's active. + if (_isGelatoDripTaskActive(cfg.gelato(), cfg.drippie(), name)) { + console.log("ManageDrippie: pausing Gelato task for %s", name); + _pauseGelatoDripTask(cfg.gelato(), cfg.drippie(), name); + } + } + } + } + + /// @notice Installs drips in the drippie contract. + function installDrips() public broadcast { + console.log("ManageDrippie: installing Drippie config for %s drips", cfg.dripsLength()); + for (uint256 i = 0; i < cfg.dripsLength(); i++) { + DrippieConfig.FullDripConfig memory drip = abi.decode(cfg.drip(i), (DrippieConfig.FullDripConfig)); + Drippie.DripAction[] memory actions = new Drippie.DripAction[](1); + actions[0] = Drippie.DripAction({ target: payable(drip.recipient), data: drip.data, value: drip.value }); + _installDrip({ + _gelato: cfg.gelato(), + _drippie: cfg.drippie(), + _name: drip.name, + _config: Drippie.DripConfig({ + reentrant: false, + interval: drip.interval, + dripcheck: IDripCheck(cfg.mustGetDripCheck(drip.dripcheck)), + checkparams: drip.checkparams, + actions: actions + }) + }); + } + } + + /// @notice Generates the data for a Gelato task that would trigger a drip. + /// @param _drippie The drippie contract. + /// @param _name The name of the drip. + /// @return _taskData Gelato task data. + function _makeGelatoDripTaskData( + Drippie _drippie, + string memory _name + ) + internal + view + returns (GelatoTaskData memory _taskData) + { + // Get the drip interval. + uint256 dripInterval = _drippie.getDripInterval(_name); + + // Set up module types. + GelatoDataTypes.Module[] memory modules = new GelatoDataTypes.Module[](2); + modules[0] = GelatoDataTypes.Module.PROXY; + modules[1] = GelatoDataTypes.Module.TRIGGER; + + // Interval is in milliseconds, so we should be multiplying by 1000. + // We then want to attempt to trigger the drip 10x per interval, so we divide by 10. + // Total multiplier is then 1000 / 10 = 100. + uint128 interval = uint128(dripInterval) * 100; + + // Create arguments for the PROXY and TRIGGER modules. + bytes[] memory args = new bytes[](2); + args[0] = abi.encode(_name); + args[1] = abi.encode(uint128(GelatoDataTypes.TriggerType.TIME), abi.encode(uint128(0), interval)); + + // Create the task data. + _taskData = GelatoTaskData({ + taskCreator: msg.sender, + execAddress: address(_drippie), + execData: abi.encodeCall(Drippie.drip, (_name)), + moduleData: GelatoDataTypes.ModuleData({ modules: modules, args: args }), + feeToken: address(0) + }); + } + + /// @notice Starts a gelato drip task. + /// @param _gelato The gelato contract. + /// @param _drippie The drippie contract. + /// @param _name The name of the drip being triggered. + function _startGelatoDripTask(IGelato _gelato, Drippie _drippie, string memory _name) internal { + GelatoTaskData memory taskData = _makeGelatoDripTaskData({ _drippie: _drippie, _name: _name }); + _gelato.createTask({ + execAddress: taskData.execAddress, + execData: taskData.execData, + moduleData: taskData.moduleData, + feeToken: taskData.feeToken + }); + } + + /// @notice Determines if a gelato drip task is active or not. + /// @param _gelato The gelato contract. + /// @param _drippie The drippie contract. + /// @param _name The name of the drip being triggered. + /// @return _active True if the task is active, false otherwise. + function _isGelatoDripTaskActive( + IGelato _gelato, + Drippie _drippie, + string memory _name + ) + internal + view + returns (bool _active) + { + GelatoTaskData memory taskData = _makeGelatoDripTaskData({ _drippie: _drippie, _name: _name }); + bytes32 taskId = GelatoTaskId.getTaskId({ + taskCreator: taskData.taskCreator, + execAddress: taskData.execAddress, + execSelector: GelatoBytes.memorySliceSelector(taskData.execData), + moduleData: taskData.moduleData, + feeToken: taskData.feeToken + }); + + // Iterate over the task IDs to see if the task is active. + bytes32[] memory taskIds = _gelato.getTaskIdsByUser(taskData.taskCreator); + for (uint256 i = 0; i < taskIds.length; i++) { + if (taskIds[i] == taskId) { + _active = true; + } + } + } + + /// @notice Pauses a gelato drip task. + /// @param _gelato The gelato contract. + /// @param _drippie The drippie contract. + /// @param _name The name of the drip being triggered. + function _pauseGelatoDripTask(IGelato _gelato, Drippie _drippie, string memory _name) internal { + GelatoTaskData memory taskData = _makeGelatoDripTaskData({ _drippie: _drippie, _name: _name }); + _gelato.cancelTask( + GelatoTaskId.getTaskId({ + taskCreator: taskData.taskCreator, + execAddress: taskData.execAddress, + execSelector: GelatoBytes.memorySliceSelector(taskData.execData), + moduleData: taskData.moduleData, + feeToken: taskData.feeToken + }) + ); + } + + /// @notice Installs a drip in the drippie contract. + /// @param _gelato The gelato contract. + /// @param _drippie The drippie contract. + /// @param _name The name of the drip. + /// @param _config The configuration of the drip. + function _installDrip( + IGelato _gelato, + 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); + _startGelatoDripTask(_gelato, _drippie, _name); + console.log("%s installed successfully", _name); + } else { + console.log("%s already installed", _name); + } + + // Grab the status again now that we've installed the drip. + Drippie.DripStatus status = _drippie.getDripStatus(_name); + if (status == Drippie.DripStatus.PAUSED) { + console.log("activating %s", _name); + _drippie.status(_name, Drippie.DripStatus.ACTIVE); + console.log("%s activated successfully", _name); + } else if (status == Drippie.DripStatus.ACTIVE) { + console.log("%s already active", _name); + } else { + // TODO: Better way to handle this? + console.log("WARNING: % could not be activated", _name); + } + } +} diff --git a/packages/contracts-bedrock/scripts/safe/forge-to-safe-json.ts b/packages/contracts-bedrock/scripts/safe/forge-to-safe-json.ts new file mode 100644 index 000000000000..d7e6cc0e9342 --- /dev/null +++ b/packages/contracts-bedrock/scripts/safe/forge-to-safe-json.ts @@ -0,0 +1,124 @@ +import fs from 'fs' +import crypto from 'crypto' + +interface ForgeTransaction { + contractAddress: string + transaction: { + to: string + value: string + input: string + } +} + +interface ForgeTransactionFile { + transactions: ForgeTransaction[] + timestamp: number + chain: number +} + +interface SafeTransaction { + to: string + value: string + data: string + contractMethod: null + contractInputsValues: null +} + +interface SafeTransactionFile { + version: string + chainId: string + createdAt: number + meta: { + name: string + description: string + txBuilderVersion: string + createdFromSafeAddress: string + createdFromOwnerAddress: string + checksum: string + } + transactions: SafeTransaction[] +} + +/** + * Calculate the checksum for a safe transaction file. + * @param data The safe transaction file. + * @returns The checksum. + */ +const checksum = (data: SafeTransactionFile): string => { + const hash = crypto.createHash('sha256') + hash.update(JSON.stringify(data.transactions)) + return `0x${hash.digest('hex')}` +} + +/** + * Transform a forge transaction file into a safe transaction file. + * @param forge Forge transaction file. + * @param address Safe address. + * @returns Safe transaction file. + */ +const transform = ( + forge: ForgeTransactionFile, + address: string +): SafeTransactionFile => { + const transactions = forge.transactions.map((tx) => ({ + to: tx.contractAddress, + value: '0', + data: tx.transaction.input, + contractMethod: null, + contractInputsValues: null, + })) + + const safe: SafeTransactionFile = { + version: '1.0', + chainId: forge.chain.toString(), + createdAt: forge.timestamp, + meta: { + name: 'Transactions Batch', + description: '', + txBuilderVersion: '1.16.5', + createdFromSafeAddress: address, + createdFromOwnerAddress: '', + checksum: '', + }, + transactions, + } + + safe.meta.checksum = checksum(safe) + + return safe +} + +/** + * Get a required argument from the command line. + * @param name The argument name. + * @returns The argument value. + */ +const reqarg = (name: string) => { + const value = process.argv.find((arg) => arg.startsWith(`--${name}=`)) + if (!value) { + console.error(`Please provide --${name} argument`) + process.exit(1) + } + return value.split('=')[1] +} + +/** + * Main function. + */ +const main = () => { + const input = reqarg('input') + const output = reqarg('output') + const address = reqarg('safe') + + // Load the original forge transaction file. + const forge: ForgeTransactionFile = JSON.parse(fs.readFileSync(input, 'utf8')) + + // Transform the forge transaction file into a safe transaction file. + const safe = transform(forge, address) + + // Write the safe transaction file. + fs.writeFileSync(output, JSON.stringify(safe, null, 2), 'utf8') +} + +// Run the main function. +main() diff --git a/packages/contracts-bedrock/scripts/statediff.sh b/packages/contracts-bedrock/scripts/statediff.sh deleted file mode 100755 index fa1aef11c884..000000000000 --- a/packages/contracts-bedrock/scripts/statediff.sh +++ /dev/null @@ -1,5 +0,0 @@ -#!/usr/bin/env bash -set -euo pipefail - -echo "> Deploying contracts to generate state diff (non-broadcast)" -forge script -vvv scripts/Deploy.s.sol:Deploy --sig 'runWithStateDiff()' diff --git a/packages/contracts-bedrock/scripts/utils/BaseDeployIO.sol b/packages/contracts-bedrock/scripts/utils/BaseDeployIO.sol new file mode 100644 index 000000000000..f8157ae39241 --- /dev/null +++ b/packages/contracts-bedrock/scripts/utils/BaseDeployIO.sol @@ -0,0 +1,9 @@ +// SPDX-License-Identifier: MIT +pragma solidity ^0.8.0; + +import { CommonBase } from "forge-std/Base.sol"; + +/// @notice All contracts of the form `Deploy<X>Input` and `Deploy<X>Output` should inherit from this contract. +/// It provides a base set of functionality, such as access to cheat codes, that these scripts may need. +/// See the comments in `DeploySuperchain.s.sol` for more information on this pattern. +abstract contract BaseDeployIO is CommonBase { } diff --git a/packages/contracts-bedrock/scripts/print-addresses.sh b/packages/contracts-bedrock/scripts/utils/print-addresses.sh similarity index 100% rename from packages/contracts-bedrock/scripts/print-addresses.sh rename to packages/contracts-bedrock/scripts/utils/print-addresses.sh diff --git a/packages/contracts-bedrock/scripts/restructure_tests.py b/packages/contracts-bedrock/scripts/utils/restructure_tests.py similarity index 100% rename from packages/contracts-bedrock/scripts/restructure_tests.py rename to packages/contracts-bedrock/scripts/utils/restructure_tests.py diff --git a/packages/contracts-bedrock/scripts/utils/statediff.sh b/packages/contracts-bedrock/scripts/utils/statediff.sh new file mode 100755 index 000000000000..cce1138c962b --- /dev/null +++ b/packages/contracts-bedrock/scripts/utils/statediff.sh @@ -0,0 +1,5 @@ +#!/usr/bin/env bash +set -euo pipefail + +echo "> Deploying contracts to generate state diff (non-broadcast)" +forge script -vvv scripts/deploy/Deploy.s.sol:Deploy --sig 'runWithStateDiff()' diff --git a/packages/contracts-bedrock/semver-lock.json b/packages/contracts-bedrock/semver-lock.json index db08b3a4a19f..db35c5b37429 100644 --- a/packages/contracts-bedrock/semver-lock.json +++ b/packages/contracts-bedrock/semver-lock.json @@ -1,190 +1,230 @@ { "src/EAS/EAS.sol": { - "initCodeHash": "0x1a097f352425b503a28c795dbfd390f2bc330e9c1f8a27bd26cf243b6c703499", - "sourceCodeHash": "0x23287e96b00c31ab57b05090525afdebf8e45ca09253a21b95052cf7d94e071b" + "initCodeHash": "0xf96d1ebc530ed95e2dffebcfa2b4a1f18103235e6352d97838b77b7a2c14567b", + "sourceCodeHash": "0x1902e1528cc6ff04a181036d9f1da70bd3f861b6cf1bb844d916501af5f40127" }, "src/EAS/SchemaRegistry.sol": { - "initCodeHash": "0xf4c3155413be4a4ebaaba66b9f9daaf12db7b090afdea739dfb8a543df357289", - "sourceCodeHash": "0x2ed7a2d6d66839fb3d207952f44b001bce349334adc40ce66d0503ce64e48548" + "initCodeHash": "0x06ae2c0b39c215b7fa450d382916ce6f5c6f9f2d630e572db6b72d688255b3fd", + "sourceCodeHash": "0x9ec99e63a991691e8756a663edf2ccfbe9b91161c134e24f38298da61ecd66dd" }, "src/L1/DataAvailabilityChallenge.sol": { - "initCodeHash": "0x39d938938b13abb2455959960c2ee96d48149fd16a7fb69f1f6699460d5019be", - "sourceCodeHash": "0xf6c72a2cca24cfa7c9274d720e93b05d665a2751cca3d747105e6c511ccffc73" + "initCodeHash": "0xcc96cf2e4d841adb7ecb9dd84abeb0893dd62d913c0d47ab5b66a893c6e47e88", + "sourceCodeHash": "0xce01773740f4d50ac77f868343d654f6ca24f85d2770eb7e4043e98f609b1c15" }, "src/L1/DelayedVetoable.sol": { - "initCodeHash": "0x84f78e56211500a768b2c5bbafde8e7b411bd64c237297370d7d22326b68357c", - "sourceCodeHash": "0xc59b8574531162e016d7342aeb6e79d05574e90dbea6c0e5ede35b65010ad894" + "initCodeHash": "0xd504ab0568719a0fb960ebe73d0437645f5c4bd8f6619219858209ef002516dd", + "sourceCodeHash": "0x60af558156543d639a0a92e983ad0f045aac1f9ac4c3adaa1d4d97b37175e03a" }, "src/L1/L1CrossDomainMessenger.sol": { - "initCodeHash": "0xff2c621c5ae8f1190779b13d8da4ee9fcd64f202d6e5ee309f0028bca17a8b8f", - "sourceCodeHash": "0x56a2d3abed97eb7b292db758aac1e36fc08a12bfa44f7969824e26866a1417fa" + "initCodeHash": "0x48db42620b9f16e0dec2355f4076314f82fd0f60ef04c10cdbc266eac9472515", + "sourceCodeHash": "0xb77342e6b55b835e9597f7a1c4a2d52ddd56f5cfb7cd38da0bcc488c79a9011e" }, "src/L1/L1ERC721Bridge.sol": { - "initCodeHash": "0xec73b46e68ea29298707f7b9709e7948afe303907b6c4e8b161e2ded2c85ee9c", - "sourceCodeHash": "0xd57acdbd001941e75cf4326ba7c1bdad809912f10b1e44ffaebe073917cdd296" + "initCodeHash": "0xfb8b3c51e1790a0b951eaba05ed7368309fbfc7ddc558b4ce1de29da087fb4bd", + "sourceCodeHash": "0xcb125e7f640cf5f372c7bf4f8e36150328914ceef99b6fd5d65ae12b6db430b5" }, "src/L1/L1StandardBridge.sol": { - "initCodeHash": "0xf46dc2d8e171bd5aebbafe31386e9d27323a124b1b99f378cb8f67ab22225a7b", - "sourceCodeHash": "0x0d07e526c1891abb81c7e94f73642caa8ee386ab036b3b2a67f1b21ca85089c5" + "initCodeHash": "0x2868b09ecbe9f2bbc885605c2886b4c79f1c8e4171626c63776603b1b84698a8", + "sourceCodeHash": "0xc03da137b3ea72e0109fb284229283b21a0303104afbe37d2fe86ad806392a7f" }, "src/L1/L2OutputOracle.sol": { - "initCodeHash": "0x14c3a582ca46ef2a6abad5590323f4de26ff4de54415c927c62e131ccbf8d9ba", - "sourceCodeHash": "0xf5fcf570721e25459fadbb37e02f9efe349e1c8afcbf1e3b5fdb09c9f612cdc0" + "initCodeHash": "0x433fac9de52d8ce8fc3471b78ef6cc9cff1019f480c9ad91b6e09ab8738a8edb", + "sourceCodeHash": "0xde4df0f9633dc0cdb1c9f634003ea5b0f7c5c1aebc407bc1b2f44c0ecf938649" + }, + "src/L1/OPStackManager.sol": { + "initCodeHash": "0x4bffecbd95e63f9bd04ab8e3c6a804cc25e0cd151ebeb7f8d6b9330332e6eb20", + "sourceCodeHash": "0x850f1eacc77f1a5c680625196618bc4b4332cb68924d9eddd57c749bedcd7c94" }, "src/L1/OptimismPortal.sol": { - "initCodeHash": "0xbb8e7b110d3aa0f4807cd790174d6fb6d98c44348c977007ad7a11aa7053f1c5", - "sourceCodeHash": "0x3d0e9dc8ed75b6f2e59444e9204341b18d343af02d6e37ecd9f759da2c8c118b" + "initCodeHash": "0xbe2c0c81b3459014f287d8c89cdc0d27dde5d1f44e5d024fa1e4773ddc47c190", + "sourceCodeHash": "0xb3dd8068477dd304ef1562acf69c2ce460b08cc36aef53b5bbe489fd7d992104" }, "src/L1/OptimismPortal2.sol": { - "initCodeHash": "0x45cae622788a795c2fc4f4bc8e6b85d8edf284a1dc20e1b5fa01e88d737deb23", - "sourceCodeHash": "0xea564dbff9831ad1bf0c1b345fbc3da4675cf112d2605ba94e1ef5c7b745b7ae" + "initCodeHash": "0xc94c609e04ab8ffee880806550dffff53478dfffdfb079f7c487abe0e2996f3c", + "sourceCodeHash": "0x3fb97859f66c078573753b6ba5ec370449ab03b8eca9e7779fce8db5bb23b7c0" + }, + "src/L1/OptimismPortalInterop.sol": { + "initCodeHash": "0x1c8372865dbf38225de4d843ca696a17f0d9e3cacf13c10a3d065ba19bdca05e", + "sourceCodeHash": "0xe6a7794799915f408cb57c73af266670de8a3f02408d3dbc2c97db25d3e42635" }, "src/L1/ProtocolVersions.sol": { - "initCodeHash": "0x72cd467e8bcf019c02675d72ab762e088bcc9cc0f1a4e9f587fa4589f7fdd1b8", - "sourceCodeHash": "0xbd56a23cd3221cb9d25029e80cd9f2afe2c615ae9c0b3956bf6ed373b8b805b6" + "initCodeHash": "0x8f033874dd8b36615b2209d553660dcff1ff91ca2bad3ca1de7b441dbfba4842", + "sourceCodeHash": "0x5a7e91e02224e02a5a4bbf0fea7e9bd4a1168e2fe5e787023c9a75bcb6c26204" }, "src/L1/SuperchainConfig.sol": { - "initCodeHash": "0xa71c67640d6a25c750fef910a5fe85776ebb7bb18c677bb1b9b95c2f3f561b0c", - "sourceCodeHash": "0xd6a894e371c2c7182b5960c507491f81c3775dda0efedd29475f7c30ca07b004" + "initCodeHash": "0xfca12d9016c746e5c275b186e0ca40cfd65cf45a5665aab7589a669fea3abb47", + "sourceCodeHash": "0x39489a85bc3a5c8560f82d41b31bf7fe22f5b648f4ed538f61695a73092ea9eb" }, "src/L1/SystemConfig.sol": { - "initCodeHash": "0x6160c9c96d0972e0761ab3b9d4f6d1b8543288c4c3aea9e132008a40e4c5d202", - "sourceCodeHash": "0xd27df6e227cc4728471641aec25a1fe6f79a12ce96d3ce6c1774d9411a54133e" + "initCodeHash": "0x2fc36af5b3c493a423a19e0b597f6ff230b756b861b68099f3192d69b6088dc0", + "sourceCodeHash": "0x06a50ac992175fdb434b13e8461893e83862c23ce399e697e6e8109728ad1a3d" + }, + "src/L1/SystemConfigInterop.sol": { + "initCodeHash": "0x1f500e310170769ffc747e08ad1d5b0de4b0f58534001bc4d4d563ec058bb331", + "sourceCodeHash": "0xcb6008cb49a06f87eb5b6cb4651e5e4aafe0b1f33000eccd165226c04f6b63c6" }, "src/L2/BaseFeeVault.sol": { - "initCodeHash": "0x2744d34573be83206d1b75d049d18a7bb37f9058e68c0803e5008c46b0dc2474", - "sourceCodeHash": "0xd787bd2a192ba5025fa0a8de2363af66a8de20de226e411bdb576adb64636cd0" + "initCodeHash": "0x3bfcd57e25ad54b66c374f63e24e33a6cf107044aa8f5f69ef21202c380b5c5b", + "sourceCodeHash": "0x2dc2284cf7c68e743da50e4113e96ffeab435de2390aeba2eab2f1e8ca411ce9" }, "src/L2/CrossL2Inbox.sol": { - "initCodeHash": "0x2455cab02c32f22521bfeb8a6e404c5ea2eca32e1bfdce8f34013e32d52ffc13", - "sourceCodeHash": "0x864d244dd0b01cb01e5f50425bedce46e72005bdb8bead198ac885481547f41d" + "initCodeHash": "0x79c5deb404605b42ef917b5e7308a9015dacfb71225d957a634e6d0a3a5bc621", + "sourceCodeHash": "0xd219408d99f627770dfcdb3243a183dec7429372787f0aec3bdbff5b3c294f2a" + }, + "src/L2/ETHLiquidity.sol": { + "initCodeHash": "0x713c18f95a6a746d0703f475f3ae10c106c9b9ecb64d881a2e61b8969b581371", + "sourceCodeHash": "0x0b6afdc52d1ae88d9e4bbb5dc00920e7a6bd1e9d6595bfdbae64874190f39df0" }, "src/L2/GasPriceOracle.sol": { - "initCodeHash": "0xb16f1e370e58c7693fd113a21a1b1e7ccebc03d4f1e5a76786fc27847ef51ead", - "sourceCodeHash": "0x5529ee28aae94904a1c08a8b188f51a39a0f51fbd3b43f1abd4fee7bba57998c" + "initCodeHash": "0x03947f33b80774b92214083374262fe6a4defa61da548391b44d471f2e87e9e7", + "sourceCodeHash": "0x4f21025d4b5c9c74cf7040db6f8e9ce605b82931e3012fee51d3f5d9fbd7b73f" }, "src/L2/L1Block.sol": { - "initCodeHash": "0x00961e82f3ed7f7755115c897304063e283bff0bed1200d50e0abe5c59424069", - "sourceCodeHash": "0x9c19260697d5ed5f85318098dead3f5882d77f1ee87233da1b47d1e87c88bce8" + "initCodeHash": "0xd12353c5bf71c6765cc9292eecf262f216e67f117f4ba6287796a5207dbca00f", + "sourceCodeHash": "0xfe3a9585d9bfca8428e12759cab68a3114374e5c37371cfe08bb1976a9a5a041" }, - "src/L2/L1BlockInterop.sol": { - "initCodeHash": "0x2929683ae3e4f76fca87462f0217b6e24c418bc964328f8d095f0e90343d2cae", - "sourceCodeHash": "0x78ca58451d973e9896eeb9d19699943b7a4e96c36da2724f47d5aafdf243abcd" + "src/L2/L1BlockIsthmus.sol": { + "initCodeHash": "0xb7a7a113056e4ac44824350b79fed5ea423e880223edcf1220e8f8b3172f50c5", + "sourceCodeHash": "0x6be7e7402c4dfc10e1407e070712a3f9f352db45f8a8ab296e8f6bc56a341f47" }, "src/L2/L1FeeVault.sol": { - "initCodeHash": "0x2744d34573be83206d1b75d049d18a7bb37f9058e68c0803e5008c46b0dc2474", - "sourceCodeHash": "0x3a94f273937d8908fb37dd2c495a6a0b9c3941fe68ccea51723f84eb343ba225" + "initCodeHash": "0x3bfcd57e25ad54b66c374f63e24e33a6cf107044aa8f5f69ef21202c380b5c5b", + "sourceCodeHash": "0x927cc729bf5c9f209112df597f649493f276c4c50e17a57f7da02c2be266b192" }, "src/L2/L2CrossDomainMessenger.sol": { - "initCodeHash": "0x5d1d1c0c3cc2171832438cbafb6e55c142eab43a7d7ea09ee818a7e3c50d9314", - "sourceCodeHash": "0x440d299b7429c44f6faa4005b33428f9edc1283027d9c78a63eb3d76452bfa47" + "initCodeHash": "0xcc4527d21cceeedbb3cbf8e7028e22fe12bc1ab30365dbebd0713499451b959d", + "sourceCodeHash": "0x66e4ae82b58693cb394d70159308d50270ccdd56c495c5e2aaf55de1fdc78695" }, "src/L2/L2ERC721Bridge.sol": { - "initCodeHash": "0xcafa012b2d8f1bb05c11cbbff9749c0fe6f995c9afb1d26d2d71f03384e34a22", - "sourceCodeHash": "0xa7646a588275046f92525ef121e5a0fe149e7752ea51fe62f7e0686a21153542" + "initCodeHash": "0x827077e1a0ce6c8f9ee1196c409ea77d831efd440992b3969b05259083cdf0bd", + "sourceCodeHash": "0x51a44e1fcef9483cc58ba0c9895cb3eec675785145428ece9aa7acd1a1a5b57c" }, "src/L2/L2StandardBridge.sol": { - "initCodeHash": "0xdfe717975f7c76e80201f715a0d68f3fef02beca6a9e0f378a115e175c6a5944", - "sourceCodeHash": "0xb4a9f333f04008f610eb55fa6ff7e610bab340d53156cb50ec65a575c9576b0e" + "initCodeHash": "0x651eed10044d0b19b7e4eba864345df15e252be1401f39a552ec0d2f9c4df064", + "sourceCodeHash": "0xb55e58b5d4912edf05026878a5f5ac8019372212ed2a77843775d595fbf51b84" + }, + "src/L2/L2StandardBridgeInterop.sol": { + "initCodeHash": "0x9bc28e8511a4593362c2517ff90b26f9c1ecee382cce3950b47ca08892a872ef", + "sourceCodeHash": "0x6c814f4536d9fb8f384ed2195957f868abd15252e36d6dd243f3d60349a61994" }, "src/L2/L2ToL1MessagePasser.sol": { - "initCodeHash": "0x08bbede75cd6dfd076903b8f04d24f82fa7881576c135825098778632e37eebc", - "sourceCodeHash": "0x8388b9b8075f31d580fed815b66b45394e40fb1a63cd8cda2272d2c390fc908c" + "initCodeHash": "0x13fe3729beb9ed966c97bef09acb9fe5043fe651d453145073d05f2567fa988d", + "sourceCodeHash": "0xd08a2e6514dbd44e16aa312a1b27b2841a9eab5622cbd05a39c30f543fad673c" }, "src/L2/L2ToL2CrossDomainMessenger.sol": { - "initCodeHash": "0x26995afaa790e4daa74deb8dc5088b915633d3d037a2feb5cd8dd2ec8d3c51fc", - "sourceCodeHash": "0x0cbdda4623c9c10653332af3c43ee37d9c4a6e4e0214f9a0fb51ae053b0b6220" + "initCodeHash": "0x3e4337542234c732a55e60fc20dcb1ad639ff2fb378e3f29e94b4059df9a637b", + "sourceCodeHash": "0x4b806cc85cead74c8df34ab08f4b6c6a95a1a387a335ec8a7cb2de4ea4e1cf41" }, - "src/L2/SequencerFeeVault.sol": { - "initCodeHash": "0xd62e193d89b1661d34031227a45ce1eade9c2a89b0bd7f362f511d03cceef294", - "sourceCodeHash": "0xa304b4b556162323d69662b4dd9a1d073d55ec661494465489bb67f1e465e7b3" + "src/L2/OptimismSuperchainERC20.sol": { + "initCodeHash": "0x4fd71b5352b78d51d39625b6defa77a75be53067b32f3cba86bd17a46917adf9", + "sourceCodeHash": "0xad3934ea533544b3c130c80be26201354af85f9166cb2ce54d96e5e383ebb5c1" }, - "src/L2/WETH.sol": { - "initCodeHash": "0xde72ae96910e95249623c2d695749847e4c4adeaf96a7a35033afd77318a528a", - "sourceCodeHash": "0xbe200a6cb297a3ca1a7d174a9c886e3f17eb8edf617ad014a2ac4f6c2e2ac7f1" + "src/L2/OptimismSuperchainERC20Beacon.sol": { + "initCodeHash": "0x99ce8095b23c124850d866cbc144fee6cee05dbc6bb5d83acadfe00b90cf42c7", + "sourceCodeHash": "0x5e58b7c867fafa49fe39d68d83875425e9cf94f05f2835bdcdaa08fc8bc6b68e" + }, + "src/L2/OptimismSuperchainERC20Factory.sol": { + "initCodeHash": "0x98011045722178751e4a1112892f7d9a11bc1f5e42ac18205b6d30a1f1476d24", + "sourceCodeHash": "0x9e72b2a77d82fcf3963734232ba9faff9d63962594a032041c2561f0a9f1b0b5" }, - "src/Safe/DeputyGuardianModule.sol": { - "initCodeHash": "0x433eb7488e613a51c7ff05a76bbecf47f5beac8b8614f5c50001f99e39ae7ed2", - "sourceCodeHash": "0x5b415dc432a83fb1d5c41585539245997c62acb6bd77c489bf57e9b59be5f983" + "src/L2/SequencerFeeVault.sol": { + "initCodeHash": "0x2e6551705e493bacba8cffe22e564d5c401ae5bb02577a5424e0d32784e13e74", + "sourceCodeHash": "0xd56922cb04597dea469c65e5a49d4b3c50c171e603601e6f41da9517cae0b11a" }, - "src/Safe/LivenessGuard.sol": { - "initCodeHash": "0xf54289de5cef7ba0044e0d63310937fa231d6528aac91e13e531c845af42afac", - "sourceCodeHash": "0xea3872d8f196ae3c863363dfa4b57803cb2a24b0c100244d8f861891e901e03f" + "src/L2/SuperchainWETH.sol": { + "initCodeHash": "0xd8766c7ab41d34d935febf5b48289f947804634bde38f8e346075b9f2d867275", + "sourceCodeHash": "0x6c1691c0fb5c86f1fd67e23495725c2cd86567556602e8cc0f28104ad6114bf4" }, - "src/Safe/LivenessModule.sol": { - "initCodeHash": "0xde144889fe7d98dbf300a98f5331edd535086a4af8ae6d88ca190c7f4c754a2d", - "sourceCodeHash": "0x3ff4a3f21202478935412d47fd5ef7f94a170402ddc50e5c062013ce5544c83f" + "src/L2/WETH.sol": { + "initCodeHash": "0xfb253765520690623f177941c2cd9eba23e4c6d15063bccdd5e98081329d8956", + "sourceCodeHash": "0x2ab6be69795109a1ee04c5693a34d6ce0ff90b62e404cdeb18178bab18d06784" }, "src/cannon/MIPS.sol": { - "initCodeHash": "0xa5d36fc67170ad87322f358f612695f642757bbf5280800d5d878da21402579a", - "sourceCodeHash": "0x75701f3efb7a9c16079ba0a4ed2867999aab7d95bfa0fe5ebb131cfc278593aa" + "initCodeHash": "0x4043f262804931bbbbecff64f87f2d0bdc4554b4d0a8b22df8fff940e8d239bf", + "sourceCodeHash": "0xba4674e1846afbbc708877332a38dfabd4b8d1e48ce07d8ebf0a45c9f27f16b0" + }, + "src/cannon/MIPS2.sol": { + "initCodeHash": "0xd9da47f735b7a655a25ae0e867b467620a2cb537eb65d184a361f5ea4174d384", + "sourceCodeHash": "0x3a6d83a7d46eb267f6778f8ae116383fe3c14ad553d90b6c761fafeef22ae29c" }, "src/cannon/PreimageOracle.sol": { - "initCodeHash": "0xe5db668fe41436f53995e910488c7c140766ba8745e19743773ebab508efd090", - "sourceCodeHash": "0x7c8b26cd263f6be144bace1f3faf0ec9265df0efb68ac34fa1fa7df7f608ab42" + "initCodeHash": "0x801e52f9c8439fcf7089575fa93272dfb874641dbfc7d82f36d979c987271c0b", + "sourceCodeHash": "0xdb9421a552e6d7581b3db9e4c2a02d8210ad6ca66ba0f8703d77f7cd4b8e132b" }, "src/dispute/AnchorStateRegistry.sol": { - "initCodeHash": "0x0305c21e50829b9e07d43358d8c2c82f1449534c90d4391400d46e76d0503a49", - "sourceCodeHash": "0x56b069b33d080c2a45ee6fd340e5c5824ab4dc866eadb5b481b9026ebb12aa7c" + "initCodeHash": "0x13d00eef8c3f769863fc766180acc8586f5da309ca0a098e67d4d90bd3243341", + "sourceCodeHash": "0x39a23c91d4c5380d285f49660b858d39f3fa27bdbfbc72e0e14587e7c57dfae9" + }, + "src/dispute/DelayedWETH.sol": { + "initCodeHash": "0x835b322de7d5c84b415e99f2cb1000411df18995b5476f2116ac6f897f2d0910", + "sourceCodeHash": "0xdbd64724b73f8f9d6f1cc72bb662a99b9955ab72950a8f6ffeb1d2454997f60b" }, "src/dispute/DisputeGameFactory.sol": { - "initCodeHash": "0x7a7cb8f2c95df2f9afb3ce9eaefe4a6f997ccce7ed8ffda5d425a65a2474a792", - "sourceCodeHash": "0x918c395ac5d77357f2551616aad0613e68893862edd14e554623eb16ee6ba148" + "initCodeHash": "0xb91623cca41e63e6e5a75c681b0d9ef7cb8bf68e7ff5e202a217629899fae099", + "sourceCodeHash": "0xc8f21c777b2c5a37c2d2f92e8eeceba3b231b500a7d9cb0b607b774478f8be6b" }, "src/dispute/FaultDisputeGame.sol": { - "initCodeHash": "0x5ea5b544b8d7b32f55f7864c25a2443a5db363ffd1c66e0799cbc7bccaf98526", - "sourceCodeHash": "0xe8d90f1a8f92732707e370767df260bc806be5be9808f150ebed2c6caa158734" - }, - "src/dispute/weth/DelayedWETH.sol": { - "initCodeHash": "0xb9bbe005874922cd8f499e7a0a092967cfca03e012c1e41912b0c77481c71777", - "sourceCodeHash": "0x87d00995773d34cc28e81559f4cc5f25890d924df285ec6e9e01b5277f52a9dc" + "initCodeHash": "0xdb724dfd12dcea804d1adbc5a7e919625615c62b940035cf4b9115ea3a63e0ae", + "sourceCodeHash": "0x223428ee91532af397cef72356430ff59221e0ac0cbf697a881d36bb1d672392" }, "src/legacy/DeployerWhitelist.sol": { - "initCodeHash": "0x8de80fb23b26dd9d849f6328e56ea7c173cd9e9ce1f05c9beea559d1720deb3d", - "sourceCodeHash": "0xb518a9f56136a910f2450098b4823c9982f93883fe4a9ef6f6b0a89355965d38" + "initCodeHash": "0x0b8177ed75b69eddbb9ce6537683f69a9935efed86a1d6faa8feaafbd151c1bd", + "sourceCodeHash": "0xc8fe9571fcf8fcb51a4dcb00ffa97f43a9ce811c323c4926e710b28c90a9005f" }, "src/legacy/L1BlockNumber.sol": { - "initCodeHash": "0xd586c4f93caf1753e53fcdc05eb547c1f3a69afda2904ae9f9d851b73e1c9c1d", - "sourceCodeHash": "0xed7d0d1695f28bf967626ee58debcf235204ecc5e814f53da369c94a9ed7cf0d" + "initCodeHash": "0x542955f1a84b304eaf291f76633b03e4c87c2654f7eff46c3bea94d27346ea1f", + "sourceCodeHash": "0x898c239e6367a0971a075df18030a033cdada26983fa8a5cd6e7b88ec90d4958" }, "src/legacy/LegacyMessagePasser.sol": { - "initCodeHash": "0x024ff54be1762f8946c6dc1796517bd5e622349a26a908f78a31872969f10369", - "sourceCodeHash": "0x31f66f771d912ed4fe06c166f4b1c44d9f2bce8537ab42271c3900360966999f" + "initCodeHash": "0xefc6ed9e325c2d614ea0d28c3eabfff1b345f7c6054e90253c6a091c29508267", + "sourceCodeHash": "0xaa08a61448f485b277af57251d2089cc6a80ce0a763bf7184d48ffed5034ef69" }, "src/periphery/op-nft/AttestationStation.sol": { - "initCodeHash": "0xf9b8ff2ecdcaca2b1521a96f0ebaea2d77aeb986ff1b9b7d82fb0cbc63f9169a", - "sourceCodeHash": "0x81ba07ca8d0bedf3b0d0ff054d68fcc6dca52a4da0ca5c8624cee92f20a87c37" + "initCodeHash": "0x2e665d9ee554430980f64bcb6d2611a1cb03dbacfd58bb0d6f5d32951a267bde", + "sourceCodeHash": "0xe0bc805b22c7d04b5a9444cddd4c0e1bcb3006c69c03610494277ab2cc83f553" }, "src/periphery/op-nft/Optimist.sol": { - "initCodeHash": "0x468354be7d17863a587b1f1daf220c17697e57c76cba8e0082d7afec4aafea49", - "sourceCodeHash": "0x3ceeaab5b013968b226b3c97e202a3af4946590763b2002d1bc36ae8776c78fe" + "initCodeHash": "0x8fccdef5fb6e6d51215b39acc449faad8ba15416699c9b3af77866f4297805a3", + "sourceCodeHash": "0xfa9354827b642803e10415ed30ca789be1bd23d88fac14f7adaa65c6eb1c1643" }, "src/periphery/op-nft/OptimistAllowlist.sol": { - "initCodeHash": "0xbe1a89f077473c298ce96be5eb5e5a0ec97968f24c7ef843e1f9fee1c57087e4", - "sourceCodeHash": "0x077967c4c1b99396481c91464237e696f12974c864470b2ef39ffa3756a58ac0" + "initCodeHash": "0x166dd3fc18cb238895f2faa7fdd635af48ce2c54e21ed2d6dae857c3731c4d6c", + "sourceCodeHash": "0x3a5f61046f729c9a70274b8b2a739382987ec5eb77705b259e8a3210a5f43462" }, "src/periphery/op-nft/OptimistInviter.sol": { - "initCodeHash": "0xefc67e1be541adfc92f9a5bef36746477299f5e76a4601c12f802af52fb02253", - "sourceCodeHash": "0x323f707d4cebc38f59f9241098a1d7e5e790ffcaf1719065edabf4cb794ac745" + "initCodeHash": "0x28dfa6676702a7abd19609cc773158d1f958210bc0a38c008d67a002dc1df862", + "sourceCodeHash": "0x3a0a294932d6deba043f6a2b46b4e8477ee96e7fb054d7e7229a43ce4352c68d" + }, + "src/safe/DeputyGuardianModule.sol": { + "initCodeHash": "0x308212d163aad169a5e42ce703a1ce36f5425ad96037850c0747177041f6596e", + "sourceCodeHash": "0xde1a289c1cb0bf92138daf8f3db7457be2f84bedaa111b536f646dd6e121718c" + }, + "src/safe/LivenessGuard.sol": { + "initCodeHash": "0xfd74ff89e7b689b38ab97515d64429ffaf6c0cd1ea6488c6a4743a0665419c85", + "sourceCodeHash": "0xa40ea6472d9c7e124791489c0899822d6f6b19b16e583d3b437674c615e4bac3" + }, + "src/safe/LivenessModule.sol": { + "initCodeHash": "0xcfccdd9e423c95a0ddc6e09ccb6333d5fc8429ed2b8fc872f1290d392ae13aad", + "sourceCodeHash": "0xd1479c60087f352385b6d5379ef3cc07839f671d617626b4c94ece91da781ef2" }, "src/universal/OptimismMintableERC20.sol": { - "initCodeHash": "0x7c6e1cf86cf8622d8beceafa3610ff88eceb3b0fafff0491bfa26a7b876c4d9a", - "sourceCodeHash": "0x52737b23e99bf79dd2c23196b3298e80aa41f740efc6adc7916e696833eb546a" + "initCodeHash": "0x28c88484e1932253d6d12954492ac8a70744dc15c84429089af9944e5b158fd9", + "sourceCodeHash": "0x740b4043436d1b314ee3ba145acfcde60b6abd8416ea594f2b8e890b5d0bce6b" }, "src/universal/OptimismMintableERC20Factory.sol": { - "initCodeHash": "0xf6f522681e7ae940cb778db68004f122b25194296a65bba7ad1d792bd593c4a6", - "sourceCodeHash": "0x9b8c73ea139f13028008eedef53a6b07576cd6b08979574e6dde3192656e9268" + "initCodeHash": "0x9cd4102d3ca811d5dc67ae99ce7de95812264575a789f96a6057600e55dcab64", + "sourceCodeHash": "0xc70c8c11d6e754eabe746bbee47a5e1051f71f7a83913f62ebcce8db989a1357" }, "src/universal/OptimismMintableERC721.sol": { - "initCodeHash": "0xb400f430acf4d65bee9635e4935a6e1e3a0284fc50aea40ad8b7818dc826f31c", - "sourceCodeHash": "0xd4bb4d1e16f545976302109ab0234ae785afa52de820553d67ebd9f147e4b994" + "initCodeHash": "0xec037be7fc28e072944b0a9e55d4278b92d6c68ccb41049ab52eafca59c6e023", + "sourceCodeHash": "0x5ea7c1b0cef5609f25c4193f5795fc9ce8f3ae08dbbf2945afe38e5af58f32c3" }, "src/universal/OptimismMintableERC721Factory.sol": { - "initCodeHash": "0x5504069cb1377405bf5c6f1b37ea02057fdb452cf85922cc83dffd5390cad7da", - "sourceCodeHash": "0xf8f2f0f6bc3cdbacbb1ef8b3fa31897a1eb749af0ba14b19b0cbc1cf0e6271f8" + "initCodeHash": "0x1e247d46b5ac3cc8ac6b51193917cd5b88ff00fbea7bf768c65fa35a115f8607", + "sourceCodeHash": "0x1c4bc4727f08d80e8364561b49397ee57bb485072cb004b7a430559cbfa019a6" }, "src/universal/StorageSetter.sol": { - "initCodeHash": "0xb656d2aa6aff3e6435e747a0c23236d1b66f1f5c0b45e4b1a10d290a90223c5a", - "sourceCodeHash": "0xebfc968e6b78d7ea355547d427300739f14d000a11ff35f29d9ded3ddb7882da" + "initCodeHash": "0x00b8b883597e67e5c3548e7ba4139ed720893c0acb217dd170bec520cefdfab5", + "sourceCodeHash": "0xf63aff9c38f4c5e9cdbd1f910bc002e16008a592d26c0dcc67929e0024638edd" } } \ No newline at end of file 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 index 37ddc45a0ae2..c1a0fc693a9a 100644 --- a/packages/contracts-bedrock/snapshots/abi/AnchorStateRegistry.json +++ b/packages/contracts-bedrock/snapshots/abi/AnchorStateRegistry.json @@ -77,6 +77,11 @@ "internalType": "struct AnchorStateRegistry.StartingAnchorRoot[]", "name": "_startingAnchorRoots", "type": "tuple[]" + }, + { + "internalType": "contract ISuperchainConfig", + "name": "_superchainConfig", + "type": "address" } ], "name": "initialize", @@ -84,6 +89,32 @@ "stateMutability": "nonpayable", "type": "function" }, + { + "inputs": [ + { + "internalType": "contract IFaultDisputeGame", + "name": "_game", + "type": "address" + } + ], + "name": "setAnchorState", + "outputs": [], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [], + "name": "superchainConfig", + "outputs": [ + { + "internalType": "contract ISuperchainConfig", + "name": "", + "type": "address" + } + ], + "stateMutability": "view", + "type": "function" + }, { "inputs": [], "name": "tryUpdateAnchorState", @@ -116,5 +147,20 @@ ], "name": "Initialized", "type": "event" + }, + { + "inputs": [], + "name": "InvalidGameStatus", + "type": "error" + }, + { + "inputs": [], + "name": "Unauthorized", + "type": "error" + }, + { + "inputs": [], + "name": "UnregisteredGame", + "type": "error" } ] \ No newline at end of file diff --git a/packages/contracts-bedrock/snapshots/abi/BaseFeeVault.json b/packages/contracts-bedrock/snapshots/abi/BaseFeeVault.json index 980f6f31551f..9b98c78abed2 100644 --- a/packages/contracts-bedrock/snapshots/abi/BaseFeeVault.json +++ b/packages/contracts-bedrock/snapshots/abi/BaseFeeVault.json @@ -63,6 +63,32 @@ "stateMutability": "view", "type": "function" }, + { + "inputs": [], + "name": "minWithdrawalAmount", + "outputs": [ + { + "internalType": "uint256", + "name": "amount_", + "type": "uint256" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [], + "name": "recipient", + "outputs": [ + { + "internalType": "address", + "name": "recipient_", + "type": "address" + } + ], + "stateMutability": "view", + "type": "function" + }, { "inputs": [], "name": "totalProcessed", @@ -96,6 +122,19 @@ "stateMutability": "nonpayable", "type": "function" }, + { + "inputs": [], + "name": "withdrawalNetwork", + "outputs": [ + { + "internalType": "enum FeeVault.WithdrawalNetwork", + "name": "network_", + "type": "uint8" + } + ], + "stateMutability": "view", + "type": "function" + }, { "anonymous": false, "inputs": [ diff --git a/packages/contracts-bedrock/snapshots/abi/CheckBalanceLow.json b/packages/contracts-bedrock/snapshots/abi/CheckBalanceLow.json index 6bdf5f033af8..395c418d243d 100644 --- a/packages/contracts-bedrock/snapshots/abi/CheckBalanceLow.json +++ b/packages/contracts-bedrock/snapshots/abi/CheckBalanceLow.json @@ -18,6 +18,19 @@ "stateMutability": "view", "type": "function" }, + { + "inputs": [], + "name": "name", + "outputs": [ + { + "internalType": "string", + "name": "", + "type": "string" + } + ], + "stateMutability": "view", + "type": "function" + }, { "anonymous": false, "inputs": [ diff --git a/packages/contracts-bedrock/snapshots/abi/CheckGelatoLow.json b/packages/contracts-bedrock/snapshots/abi/CheckGelatoLow.json index 7e3b9cbee04a..8d22c2b53b47 100644 --- a/packages/contracts-bedrock/snapshots/abi/CheckGelatoLow.json +++ b/packages/contracts-bedrock/snapshots/abi/CheckGelatoLow.json @@ -18,6 +18,19 @@ "stateMutability": "view", "type": "function" }, + { + "inputs": [], + "name": "name", + "outputs": [ + { + "internalType": "string", + "name": "", + "type": "string" + } + ], + "stateMutability": "view", + "type": "function" + }, { "anonymous": false, "inputs": [ diff --git a/packages/contracts-bedrock/snapshots/abi/CheckSecrets.json b/packages/contracts-bedrock/snapshots/abi/CheckSecrets.json index b0be49aadd11..35a5b9d31b96 100644 --- a/packages/contracts-bedrock/snapshots/abi/CheckSecrets.json +++ b/packages/contracts-bedrock/snapshots/abi/CheckSecrets.json @@ -18,6 +18,19 @@ "stateMutability": "view", "type": "function" }, + { + "inputs": [], + "name": "name", + "outputs": [ + { + "internalType": "string", + "name": "", + "type": "string" + } + ], + "stateMutability": "view", + "type": "function" + }, { "inputs": [ { diff --git a/packages/contracts-bedrock/snapshots/abi/CheckTrue.json b/packages/contracts-bedrock/snapshots/abi/CheckTrue.json index 8d146c452afb..711cc3f439e6 100644 --- a/packages/contracts-bedrock/snapshots/abi/CheckTrue.json +++ b/packages/contracts-bedrock/snapshots/abi/CheckTrue.json @@ -17,5 +17,18 @@ ], "stateMutability": "pure", "type": "function" + }, + { + "inputs": [], + "name": "name", + "outputs": [ + { + "internalType": "string", + "name": "", + "type": "string" + } + ], + "stateMutability": "view", + "type": "function" } ] \ No newline at end of file diff --git a/packages/contracts-bedrock/snapshots/abi/CrossL2Inbox.json b/packages/contracts-bedrock/snapshots/abi/CrossL2Inbox.json index c1aae9a8687a..6f8c10e82eed 100644 --- a/packages/contracts-bedrock/snapshots/abi/CrossL2Inbox.json +++ b/packages/contracts-bedrock/snapshots/abi/CrossL2Inbox.json @@ -75,6 +75,19 @@ "stateMutability": "payable", "type": "function" }, + { + "inputs": [], + "name": "interopStart", + "outputs": [ + { + "internalType": "uint256", + "name": "interopStart_", + "type": "uint256" + } + ], + "stateMutability": "view", + "type": "function" + }, { "inputs": [], "name": "logIndex", @@ -101,6 +114,13 @@ "stateMutability": "view", "type": "function" }, + { + "inputs": [], + "name": "setInteropStart", + "outputs": [], + "stateMutability": "nonpayable", + "type": "function" + }, { "inputs": [], "name": "timestamp", @@ -114,6 +134,51 @@ "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": "bytes32", + "name": "_msgHash", + "type": "bytes32" + } + ], + "name": "validateMessage", + "outputs": [], + "stateMutability": "nonpayable", + "type": "function" + }, { "inputs": [], "name": "version", @@ -131,21 +196,53 @@ "anonymous": false, "inputs": [ { - "indexed": false, - "internalType": "bytes", - "name": "encodedId", - "type": "bytes" + "indexed": true, + "internalType": "bytes32", + "name": "msgHash", + "type": "bytes32" }, { + "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" + } + ], "indexed": false, - "internalType": "bytes", - "name": "message", - "type": "bytes" + "internalType": "struct ICrossL2Inbox.Identifier", + "name": "id", + "type": "tuple" } ], "name": "ExecutingMessage", "type": "event" }, + { + "inputs": [], + "name": "InteropStartAlreadySet", + "type": "error" + }, { "inputs": [], "name": "InvalidChainId", @@ -156,11 +253,26 @@ "name": "InvalidTimestamp", "type": "error" }, + { + "inputs": [], + "name": "NoExecutingDeposits", + "type": "error" + }, + { + "inputs": [], + "name": "NotDepositor", + "type": "error" + }, { "inputs": [], "name": "NotEntered", "type": "error" }, + { + "inputs": [], + "name": "ReentrantCall", + "type": "error" + }, { "inputs": [], "name": "TargetCallFailed", diff --git a/packages/contracts-bedrock/snapshots/abi/DelayedWETH.json b/packages/contracts-bedrock/snapshots/abi/DelayedWETH.json index fe4fd5b63f61..a84394e6b003 100644 --- a/packages/contracts-bedrock/snapshots/abi/DelayedWETH.json +++ b/packages/contracts-bedrock/snapshots/abi/DelayedWETH.json @@ -90,7 +90,7 @@ "name": "config", "outputs": [ { - "internalType": "contract SuperchainConfig", + "internalType": "contract ISuperchainConfig", "name": "", "type": "address" } @@ -157,7 +157,7 @@ "type": "address" }, { - "internalType": "contract SuperchainConfig", + "internalType": "contract ISuperchainConfig", "name": "_config", "type": "address" } diff --git a/packages/contracts-bedrock/snapshots/abi/DeputyGuardianModule.json b/packages/contracts-bedrock/snapshots/abi/DeputyGuardianModule.json index 643273921771..f1006749351e 100644 --- a/packages/contracts-bedrock/snapshots/abi/DeputyGuardianModule.json +++ b/packages/contracts-bedrock/snapshots/abi/DeputyGuardianModule.json @@ -7,7 +7,7 @@ "type": "address" }, { - "internalType": "contract SuperchainConfig", + "internalType": "contract ISuperchainConfig", "name": "_superchainConfig", "type": "address" }, @@ -23,7 +23,7 @@ { "inputs": [ { - "internalType": "contract OptimismPortal2", + "internalType": "contract IOptimismPortal2", "name": "_portal", "type": "address" }, @@ -74,7 +74,25 @@ { "inputs": [ { - "internalType": "contract OptimismPortal2", + "internalType": "contract IAnchorStateRegistry", + "name": "_registry", + "type": "address" + }, + { + "internalType": "contract IFaultDisputeGame", + "name": "_game", + "type": "address" + } + ], + "name": "setAnchorState", + "outputs": [], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "contract IOptimismPortal2", "name": "_portal", "type": "address" }, @@ -94,7 +112,7 @@ "name": "superchainConfig", "outputs": [ { - "internalType": "contract SuperchainConfig", + "internalType": "contract ISuperchainConfig", "name": "superchainConfig_", "type": "address" } diff --git a/packages/contracts-bedrock/snapshots/abi/DisputeGameFactory.json b/packages/contracts-bedrock/snapshots/abi/DisputeGameFactory.json index d4ae9165f9d7..205b9861d18b 100644 --- a/packages/contracts-bedrock/snapshots/abi/DisputeGameFactory.json +++ b/packages/contracts-bedrock/snapshots/abi/DisputeGameFactory.json @@ -81,7 +81,7 @@ "type": "bytes" } ], - "internalType": "struct IDisputeGameFactory.GameSearchResult[]", + "internalType": "struct DisputeGameFactory.GameSearchResult[]", "name": "games_", "type": "tuple[]" } diff --git a/packages/contracts-bedrock/snapshots/abi/Drippie.json b/packages/contracts-bedrock/snapshots/abi/Drippie.json index 2e0da78d28b2..cc7f7c85fa79 100644 --- a/packages/contracts-bedrock/snapshots/abi/Drippie.json +++ b/packages/contracts-bedrock/snapshots/abi/Drippie.json @@ -139,6 +139,25 @@ "stateMutability": "nonpayable", "type": "function" }, + { + "inputs": [ + { + "internalType": "uint256", + "name": "", + "type": "uint256" + } + ], + "name": "created", + "outputs": [ + { + "internalType": "string", + "name": "", + "type": "string" + } + ], + "stateMutability": "view", + "type": "function" + }, { "inputs": [ { @@ -249,6 +268,38 @@ "stateMutability": "view", "type": "function" }, + { + "inputs": [], + "name": "getDripCount", + "outputs": [ + { + "internalType": "uint256", + "name": "", + "type": "uint256" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "string", + "name": "_name", + "type": "string" + } + ], + "name": "getDripInterval", + "outputs": [ + { + "internalType": "uint256", + "name": "", + "type": "uint256" + } + ], + "stateMutability": "view", + "type": "function" + }, { "inputs": [ { diff --git a/packages/contracts-bedrock/snapshots/abi/ETHLiquidity.json b/packages/contracts-bedrock/snapshots/abi/ETHLiquidity.json new file mode 100644 index 000000000000..5fd386c52e5a --- /dev/null +++ b/packages/contracts-bedrock/snapshots/abi/ETHLiquidity.json @@ -0,0 +1,83 @@ +[ + { + "inputs": [], + "name": "burn", + "outputs": [], + "stateMutability": "payable", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "uint256", + "name": "_amount", + "type": "uint256" + } + ], + "name": "mint", + "outputs": [], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [], + "name": "version", + "outputs": [ + { + "internalType": "string", + "name": "", + "type": "string" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "anonymous": false, + "inputs": [ + { + "indexed": true, + "internalType": "address", + "name": "caller", + "type": "address" + }, + { + "indexed": false, + "internalType": "uint256", + "name": "value", + "type": "uint256" + } + ], + "name": "LiquidityBurned", + "type": "event" + }, + { + "anonymous": false, + "inputs": [ + { + "indexed": true, + "internalType": "address", + "name": "caller", + "type": "address" + }, + { + "indexed": false, + "internalType": "uint256", + "name": "value", + "type": "uint256" + } + ], + "name": "LiquidityMinted", + "type": "event" + }, + { + "inputs": [], + "name": "NotCustomGasToken", + "type": "error" + }, + { + "inputs": [], + "name": "Unauthorized", + "type": "error" + } +] \ No newline at end of file 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 e9527c8a4f44..e1e59c38701c 100644 --- a/packages/contracts-bedrock/snapshots/abi/FaultDisputeGame.json +++ b/packages/contracts-bedrock/snapshots/abi/FaultDisputeGame.json @@ -963,6 +963,11 @@ "name": "IncorrectBondAmount", "type": "error" }, + { + "inputs": [], + "name": "InvalidChallengePeriod", + "type": "error" + }, { "inputs": [], "name": "InvalidClockExtension", diff --git a/packages/contracts-bedrock/snapshots/abi/L1BlockInterop.json b/packages/contracts-bedrock/snapshots/abi/L1BlockInterop.json deleted file mode 100644 index aa278165fe24..000000000000 --- a/packages/contracts-bedrock/snapshots/abi/L1BlockInterop.json +++ /dev/null @@ -1,405 +0,0 @@ -[ - { - "inputs": [], - "name": "DEPOSITOR_ACCOUNT", - "outputs": [ - { - "internalType": "address", - "name": "addr_", - "type": "address" - } - ], - "stateMutability": "pure", - "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": [ - { - "internalType": "uint256", - "name": "", - "type": "uint256" - } - ], - "name": "dependencySet", - "outputs": [ - { - "internalType": "uint256", - "name": "", - "type": "uint256" - } - ], - "stateMutability": "view", - "type": "function" - }, - { - "inputs": [], - "name": "dependencySetSize", - "outputs": [ - { - "internalType": "uint8", - "name": "", - "type": "uint8" - } - ], - "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", - "outputs": [ - { - "internalType": "bytes32", - "name": "", - "type": "bytes32" - } - ], - "stateMutability": "view", - "type": "function" - }, - { - "inputs": [], - "name": "isCustomGasToken", - "outputs": [ - { - "internalType": "bool", - "name": "", - "type": "bool" - } - ], - "stateMutability": "view", - "type": "function" - }, - { - "inputs": [ - { - "internalType": "uint256", - "name": "_chainId", - "type": "uint256" - } - ], - "name": "isInDependencySet", - "outputs": [ - { - "internalType": "bool", - "name": "", - "type": "bool" - } - ], - "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": "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": "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": "setL1BlockValuesInterop", - "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": "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/L1BlockIsthmus.json b/packages/contracts-bedrock/snapshots/abi/L1BlockIsthmus.json new file mode 100644 index 000000000000..d827b32a9cab --- /dev/null +++ b/packages/contracts-bedrock/snapshots/abi/L1BlockIsthmus.json @@ -0,0 +1,475 @@ +[ + { + "inputs": [], + "name": "DEPOSITOR_ACCOUNT", + "outputs": [ + { + "internalType": "address", + "name": "addr_", + "type": "address" + } + ], + "stateMutability": "pure", + "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": "dependencySetSize", + "outputs": [ + { + "internalType": "uint8", + "name": "", + "type": "uint8" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [], + "name": "depositsComplete", + "outputs": [], + "stateMutability": "nonpayable", + "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", + "outputs": [ + { + "internalType": "bytes32", + "name": "", + "type": "bytes32" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [], + "name": "isCustomGasToken", + "outputs": [ + { + "internalType": "bool", + "name": "", + "type": "bool" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [], + "name": "isDeposit", + "outputs": [ + { + "internalType": "bool", + "name": "isDeposit_", + "type": "bool" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "uint256", + "name": "_chainId", + "type": "uint256" + } + ], + "name": "isInDependencySet", + "outputs": [ + { + "internalType": "bool", + "name": "", + "type": "bool" + } + ], + "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": "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": [ + { + "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": "setL1BlockValuesIsthmus", + "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": "pure", + "type": "function" + }, + { + "anonymous": false, + "inputs": [ + { + "indexed": true, + "internalType": "uint256", + "name": "chainId", + "type": "uint256" + } + ], + "name": "DependencyAdded", + "type": "event" + }, + { + "anonymous": false, + "inputs": [ + { + "indexed": true, + "internalType": "uint256", + "name": "chainId", + "type": "uint256" + } + ], + "name": "DependencyRemoved", + "type": "event" + }, + { + "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": "AlreadyDependency", + "type": "error" + }, + { + "inputs": [], + "name": "CantRemovedDependency", + "type": "error" + }, + { + "inputs": [], + "name": "DependencySetSizeTooLarge", + "type": "error" + }, + { + "inputs": [], + "name": "NotCrossL2Inbox", + "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 cc99f64c449e..22a4353cc656 100644 --- a/packages/contracts-bedrock/snapshots/abi/L1CrossDomainMessenger.json +++ b/packages/contracts-bedrock/snapshots/abi/L1CrossDomainMessenger.json @@ -74,7 +74,7 @@ "name": "PORTAL", "outputs": [ { - "internalType": "contract OptimismPortal", + "internalType": "contract IOptimismPortal", "name": "", "type": "address" } @@ -180,17 +180,17 @@ { "inputs": [ { - "internalType": "contract SuperchainConfig", + "internalType": "contract ISuperchainConfig", "name": "_superchainConfig", "type": "address" }, { - "internalType": "contract OptimismPortal", + "internalType": "contract IOptimismPortal", "name": "_portal", "type": "address" }, { - "internalType": "contract SystemConfig", + "internalType": "contract ISystemConfig", "name": "_systemConfig", "type": "address" } @@ -244,7 +244,7 @@ "name": "portal", "outputs": [ { - "internalType": "contract OptimismPortal", + "internalType": "contract IOptimismPortal", "name": "", "type": "address" } @@ -337,7 +337,7 @@ "name": "superchainConfig", "outputs": [ { - "internalType": "contract SuperchainConfig", + "internalType": "contract ISuperchainConfig", "name": "", "type": "address" } @@ -350,7 +350,7 @@ "name": "systemConfig", "outputs": [ { - "internalType": "contract SystemConfig", + "internalType": "contract ISystemConfig", "name": "", "type": "address" } diff --git a/packages/contracts-bedrock/snapshots/abi/L1ERC721Bridge.json b/packages/contracts-bedrock/snapshots/abi/L1ERC721Bridge.json index 296d95dd33e6..33cd5b0a850b 100644 --- a/packages/contracts-bedrock/snapshots/abi/L1ERC721Bridge.json +++ b/packages/contracts-bedrock/snapshots/abi/L1ERC721Bridge.json @@ -9,7 +9,7 @@ "name": "MESSENGER", "outputs": [ { - "internalType": "contract CrossDomainMessenger", + "internalType": "contract ICrossDomainMessenger", "name": "", "type": "address" } @@ -22,7 +22,7 @@ "name": "OTHER_BRIDGE", "outputs": [ { - "internalType": "contract StandardBridge", + "internalType": "contract ERC721Bridge", "name": "", "type": "address" } @@ -171,12 +171,12 @@ { "inputs": [ { - "internalType": "contract CrossDomainMessenger", + "internalType": "contract ICrossDomainMessenger", "name": "_messenger", "type": "address" }, { - "internalType": "contract SuperchainConfig", + "internalType": "contract ISuperchainConfig", "name": "_superchainConfig", "type": "address" } @@ -191,7 +191,7 @@ "name": "messenger", "outputs": [ { - "internalType": "contract CrossDomainMessenger", + "internalType": "contract ICrossDomainMessenger", "name": "", "type": "address" } @@ -204,7 +204,7 @@ "name": "otherBridge", "outputs": [ { - "internalType": "contract StandardBridge", + "internalType": "contract ERC721Bridge", "name": "", "type": "address" } @@ -230,7 +230,7 @@ "name": "superchainConfig", "outputs": [ { - "internalType": "contract SuperchainConfig", + "internalType": "contract ISuperchainConfig", "name": "", "type": "address" } diff --git a/packages/contracts-bedrock/snapshots/abi/L1FeeVault.json b/packages/contracts-bedrock/snapshots/abi/L1FeeVault.json index 980f6f31551f..9b98c78abed2 100644 --- a/packages/contracts-bedrock/snapshots/abi/L1FeeVault.json +++ b/packages/contracts-bedrock/snapshots/abi/L1FeeVault.json @@ -63,6 +63,32 @@ "stateMutability": "view", "type": "function" }, + { + "inputs": [], + "name": "minWithdrawalAmount", + "outputs": [ + { + "internalType": "uint256", + "name": "amount_", + "type": "uint256" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [], + "name": "recipient", + "outputs": [ + { + "internalType": "address", + "name": "recipient_", + "type": "address" + } + ], + "stateMutability": "view", + "type": "function" + }, { "inputs": [], "name": "totalProcessed", @@ -96,6 +122,19 @@ "stateMutability": "nonpayable", "type": "function" }, + { + "inputs": [], + "name": "withdrawalNetwork", + "outputs": [ + { + "internalType": "enum FeeVault.WithdrawalNetwork", + "name": "network_", + "type": "uint8" + } + ], + "stateMutability": "view", + "type": "function" + }, { "anonymous": false, "inputs": [ diff --git a/packages/contracts-bedrock/snapshots/abi/L1StandardBridge.json b/packages/contracts-bedrock/snapshots/abi/L1StandardBridge.json index 2a93a9f8da24..45480499fe9f 100644 --- a/packages/contracts-bedrock/snapshots/abi/L1StandardBridge.json +++ b/packages/contracts-bedrock/snapshots/abi/L1StandardBridge.json @@ -13,7 +13,7 @@ "name": "MESSENGER", "outputs": [ { - "internalType": "contract CrossDomainMessenger", + "internalType": "contract ICrossDomainMessenger", "name": "", "type": "address" } @@ -417,17 +417,17 @@ { "inputs": [ { - "internalType": "contract CrossDomainMessenger", + "internalType": "contract ICrossDomainMessenger", "name": "_messenger", "type": "address" }, { - "internalType": "contract SuperchainConfig", + "internalType": "contract ISuperchainConfig", "name": "_superchainConfig", "type": "address" }, { - "internalType": "contract SystemConfig", + "internalType": "contract ISystemConfig", "name": "_systemConfig", "type": "address" } @@ -455,7 +455,7 @@ "name": "messenger", "outputs": [ { - "internalType": "contract CrossDomainMessenger", + "internalType": "contract ICrossDomainMessenger", "name": "", "type": "address" } @@ -494,7 +494,7 @@ "name": "superchainConfig", "outputs": [ { - "internalType": "contract SuperchainConfig", + "internalType": "contract ISuperchainConfig", "name": "", "type": "address" } @@ -507,7 +507,7 @@ "name": "systemConfig", "outputs": [ { - "internalType": "contract SystemConfig", + "internalType": "contract ISystemConfig", "name": "", "type": "address" } diff --git a/packages/contracts-bedrock/snapshots/abi/L2ERC721Bridge.json b/packages/contracts-bedrock/snapshots/abi/L2ERC721Bridge.json index e9ae576e943a..e9578ad9726c 100644 --- a/packages/contracts-bedrock/snapshots/abi/L2ERC721Bridge.json +++ b/packages/contracts-bedrock/snapshots/abi/L2ERC721Bridge.json @@ -9,7 +9,7 @@ "name": "MESSENGER", "outputs": [ { - "internalType": "contract CrossDomainMessenger", + "internalType": "contract ICrossDomainMessenger", "name": "", "type": "address" } @@ -22,7 +22,7 @@ "name": "OTHER_BRIDGE", "outputs": [ { - "internalType": "contract StandardBridge", + "internalType": "contract ERC721Bridge", "name": "", "type": "address" } @@ -157,7 +157,7 @@ "name": "messenger", "outputs": [ { - "internalType": "contract CrossDomainMessenger", + "internalType": "contract ICrossDomainMessenger", "name": "", "type": "address" } @@ -170,7 +170,7 @@ "name": "otherBridge", "outputs": [ { - "internalType": "contract StandardBridge", + "internalType": "contract ERC721Bridge", "name": "", "type": "address" } diff --git a/packages/contracts-bedrock/snapshots/abi/L2StandardBridge.json b/packages/contracts-bedrock/snapshots/abi/L2StandardBridge.json index a73e6038c22a..e562034818d5 100644 --- a/packages/contracts-bedrock/snapshots/abi/L2StandardBridge.json +++ b/packages/contracts-bedrock/snapshots/abi/L2StandardBridge.json @@ -13,7 +13,7 @@ "name": "MESSENGER", "outputs": [ { - "internalType": "contract CrossDomainMessenger", + "internalType": "contract ICrossDomainMessenger", "name": "", "type": "address" } @@ -267,7 +267,7 @@ "name": "messenger", "outputs": [ { - "internalType": "contract CrossDomainMessenger", + "internalType": "contract ICrossDomainMessenger", "name": "", "type": "address" } @@ -311,7 +311,7 @@ "type": "string" } ], - "stateMutability": "view", + "stateMutability": "pure", "type": "function" }, { diff --git a/packages/contracts-bedrock/snapshots/abi/L2StandardBridgeInterop.json b/packages/contracts-bedrock/snapshots/abi/L2StandardBridgeInterop.json new file mode 100644 index 000000000000..b2dc8dddd050 --- /dev/null +++ b/packages/contracts-bedrock/snapshots/abi/L2StandardBridgeInterop.json @@ -0,0 +1,694 @@ +[ + { + "stateMutability": "payable", + "type": "receive" + }, + { + "inputs": [], + "name": "MESSENGER", + "outputs": [ + { + "internalType": "contract ICrossDomainMessenger", + "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": "_from", + "type": "address" + }, + { + "internalType": "address", + "name": "_to", + "type": "address" + }, + { + "internalType": "uint256", + "name": "_amount", + "type": "uint256" + } + ], + "name": "convert", + "outputs": [], + "stateMutability": "nonpayable", + "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": "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 ICrossDomainMessenger", + "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": "pure", + "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" + }, + { + "anonymous": false, + "inputs": [ + { + "indexed": true, + "internalType": "address", + "name": "from", + "type": "address" + }, + { + "indexed": true, + "internalType": "address", + "name": "to", + "type": "address" + }, + { + "indexed": true, + "internalType": "address", + "name": "caller", + "type": "address" + }, + { + "indexed": false, + "internalType": "uint256", + "name": "amount", + "type": "uint256" + } + ], + "name": "Converted", + "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": "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": "InvalidDecimals", + "type": "error" + }, + { + "inputs": [], + "name": "InvalidLegacyERC20Address", + "type": "error" + }, + { + "inputs": [], + "name": "InvalidSuperchainERC20Address", + "type": "error" + }, + { + "inputs": [], + "name": "InvalidTokenPair", + "type": "error" + } +] \ No newline at end of file diff --git a/packages/contracts-bedrock/snapshots/abi/L2ToL2CrossDomainMessenger.json b/packages/contracts-bedrock/snapshots/abi/L2ToL2CrossDomainMessenger.json index f708571aff1c..f8468eb81e8c 100644 --- a/packages/contracts-bedrock/snapshots/abi/L2ToL2CrossDomainMessenger.json +++ b/packages/contracts-bedrock/snapshots/abi/L2ToL2CrossDomainMessenger.json @@ -109,7 +109,7 @@ ], "name": "sendMessage", "outputs": [], - "stateMutability": "payable", + "stateMutability": "nonpayable", "type": "function" }, { @@ -170,19 +170,6 @@ "name": "RelayedMessage", "type": "event" }, - { - "anonymous": true, - "inputs": [ - { - "indexed": false, - "internalType": "bytes", - "name": "data", - "type": "bytes" - } - ], - "name": "SentMessage", - "type": "event" - }, { "inputs": [], "name": "CrossL2InboxOriginNotL2ToL2CrossDomainMessenger", diff --git a/packages/contracts-bedrock/snapshots/abi/MIPS.json b/packages/contracts-bedrock/snapshots/abi/MIPS.json index e4760d16fc5a..afdc8c355ddc 100644 --- a/packages/contracts-bedrock/snapshots/abi/MIPS.json +++ b/packages/contracts-bedrock/snapshots/abi/MIPS.json @@ -10,19 +10,6 @@ "stateMutability": "nonpayable", "type": "constructor" }, - { - "inputs": [], - "name": "BRK_START", - "outputs": [ - { - "internalType": "uint32", - "name": "", - "type": "uint32" - } - ], - "stateMutability": "view", - "type": "function" - }, { "inputs": [], "name": "oracle", @@ -77,5 +64,15 @@ ], "stateMutability": "view", "type": "function" + }, + { + "inputs": [], + "name": "InvalidMemoryProof", + "type": "error" + }, + { + "inputs": [], + "name": "InvalidRMWInstruction", + "type": "error" } ] \ No newline at end of file diff --git a/packages/contracts-bedrock/snapshots/abi/MIPS2.json b/packages/contracts-bedrock/snapshots/abi/MIPS2.json new file mode 100644 index 000000000000..2294e23e754e --- /dev/null +++ b/packages/contracts-bedrock/snapshots/abi/MIPS2.json @@ -0,0 +1,88 @@ +[ + { + "inputs": [ + { + "internalType": "contract IPreimageOracle", + "name": "_oracle", + "type": "address" + } + ], + "stateMutability": "nonpayable", + "type": "constructor" + }, + { + "inputs": [], + "name": "oracle", + "outputs": [ + { + "internalType": "contract IPreimageOracle", + "name": "oracle_", + "type": "address" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "bytes", + "name": "_stateData", + "type": "bytes" + }, + { + "internalType": "bytes", + "name": "_proof", + "type": "bytes" + }, + { + "internalType": "bytes32", + "name": "_localContext", + "type": "bytes32" + } + ], + "name": "step", + "outputs": [ + { + "internalType": "bytes32", + "name": "", + "type": "bytes32" + } + ], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [], + "name": "version", + "outputs": [ + { + "internalType": "string", + "name": "", + "type": "string" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [], + "name": "InvalidExitedValue", + "type": "error" + }, + { + "inputs": [], + "name": "InvalidMemoryProof", + "type": "error" + }, + { + "inputs": [], + "name": "InvalidRMWInstruction", + "type": "error" + }, + { + "inputs": [], + "name": "InvalidSecondMemoryProof", + "type": "error" + } +] \ No newline at end of file diff --git a/packages/contracts-bedrock/snapshots/abi/MintManager.json b/packages/contracts-bedrock/snapshots/abi/MintManager.json index 36afd1e16719..e942fbd3eddc 100644 --- a/packages/contracts-bedrock/snapshots/abi/MintManager.json +++ b/packages/contracts-bedrock/snapshots/abi/MintManager.json @@ -59,7 +59,7 @@ "name": "governanceToken", "outputs": [ { - "internalType": "contract GovernanceToken", + "internalType": "contract IGovernanceToken", "name": "", "type": "address" } diff --git a/packages/contracts-bedrock/snapshots/abi/OPStackManager.json b/packages/contracts-bedrock/snapshots/abi/OPStackManager.json new file mode 100644 index 000000000000..2ad0a4d1dc2c --- /dev/null +++ b/packages/contracts-bedrock/snapshots/abi/OPStackManager.json @@ -0,0 +1,555 @@ +[ + { + "inputs": [ + { + "internalType": "contract SuperchainConfig", + "name": "_superchainConfig", + "type": "address" + }, + { + "internalType": "contract ProtocolVersions", + "name": "_protocolVersions", + "type": "address" + } + ], + "stateMutability": "nonpayable", + "type": "constructor" + }, + { + "inputs": [], + "name": "blueprints", + "outputs": [ + { + "components": [ + { + "internalType": "address", + "name": "addressManager", + "type": "address" + }, + { + "internalType": "address", + "name": "proxy", + "type": "address" + }, + { + "internalType": "address", + "name": "proxyAdmin", + "type": "address" + }, + { + "internalType": "address", + "name": "l1ChugSplashProxy", + "type": "address" + }, + { + "internalType": "address", + "name": "resolvedDelegateProxy", + "type": "address" + }, + { + "internalType": "address", + "name": "anchorStateRegistry", + "type": "address" + } + ], + "internalType": "struct OPStackManager.Blueprints", + "name": "", + "type": "tuple" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "uint256", + "name": "_l2ChainId", + "type": "uint256" + } + ], + "name": "chainIdToBatchInboxAddress", + "outputs": [ + { + "internalType": "address", + "name": "", + "type": "address" + } + ], + "stateMutability": "pure", + "type": "function" + }, + { + "inputs": [ + { + "components": [ + { + "components": [ + { + "internalType": "address", + "name": "opChainProxyAdminOwner", + "type": "address" + }, + { + "internalType": "address", + "name": "systemConfigOwner", + "type": "address" + }, + { + "internalType": "address", + "name": "batcher", + "type": "address" + }, + { + "internalType": "address", + "name": "unsafeBlockSigner", + "type": "address" + }, + { + "internalType": "address", + "name": "proposer", + "type": "address" + }, + { + "internalType": "address", + "name": "challenger", + "type": "address" + } + ], + "internalType": "struct OPStackManager.Roles", + "name": "roles", + "type": "tuple" + }, + { + "internalType": "uint32", + "name": "basefeeScalar", + "type": "uint32" + }, + { + "internalType": "uint32", + "name": "blobBasefeeScalar", + "type": "uint32" + }, + { + "internalType": "uint256", + "name": "l2ChainId", + "type": "uint256" + }, + { + "internalType": "bytes", + "name": "startingAnchorRoots", + "type": "bytes" + } + ], + "internalType": "struct OPStackManager.DeployInput", + "name": "_input", + "type": "tuple" + } + ], + "name": "deploy", + "outputs": [ + { + "components": [ + { + "internalType": "contract ProxyAdmin", + "name": "opChainProxyAdmin", + "type": "address" + }, + { + "internalType": "contract AddressManager", + "name": "addressManager", + "type": "address" + }, + { + "internalType": "contract L1ERC721Bridge", + "name": "l1ERC721BridgeProxy", + "type": "address" + }, + { + "internalType": "contract SystemConfig", + "name": "systemConfigProxy", + "type": "address" + }, + { + "internalType": "contract OptimismMintableERC20Factory", + "name": "optimismMintableERC20FactoryProxy", + "type": "address" + }, + { + "internalType": "contract L1StandardBridge", + "name": "l1StandardBridgeProxy", + "type": "address" + }, + { + "internalType": "contract L1CrossDomainMessenger", + "name": "l1CrossDomainMessengerProxy", + "type": "address" + }, + { + "internalType": "contract OptimismPortal2", + "name": "optimismPortalProxy", + "type": "address" + }, + { + "internalType": "contract DisputeGameFactory", + "name": "disputeGameFactoryProxy", + "type": "address" + }, + { + "internalType": "contract AnchorStateRegistry", + "name": "anchorStateRegistryProxy", + "type": "address" + }, + { + "internalType": "contract AnchorStateRegistry", + "name": "anchorStateRegistryImpl", + "type": "address" + }, + { + "internalType": "contract FaultDisputeGame", + "name": "faultDisputeGame", + "type": "address" + }, + { + "internalType": "contract PermissionedDisputeGame", + "name": "permissionedDisputeGame", + "type": "address" + }, + { + "internalType": "contract DelayedWETH", + "name": "delayedWETHPermissionedGameProxy", + "type": "address" + }, + { + "internalType": "contract DelayedWETH", + "name": "delayedWETHPermissionlessGameProxy", + "type": "address" + } + ], + "internalType": "struct OPStackManager.DeployOutput", + "name": "", + "type": "tuple" + } + ], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "string", + "name": "", + "type": "string" + }, + { + "internalType": "string", + "name": "", + "type": "string" + } + ], + "name": "implementations", + "outputs": [ + { + "internalType": "address", + "name": "logic", + "type": "address" + }, + { + "internalType": "bytes4", + "name": "initializer", + "type": "bytes4" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [ + { + "components": [ + { + "components": [ + { + "internalType": "address", + "name": "addressManager", + "type": "address" + }, + { + "internalType": "address", + "name": "proxy", + "type": "address" + }, + { + "internalType": "address", + "name": "proxyAdmin", + "type": "address" + }, + { + "internalType": "address", + "name": "l1ChugSplashProxy", + "type": "address" + }, + { + "internalType": "address", + "name": "resolvedDelegateProxy", + "type": "address" + }, + { + "internalType": "address", + "name": "anchorStateRegistry", + "type": "address" + } + ], + "internalType": "struct OPStackManager.Blueprints", + "name": "blueprints", + "type": "tuple" + }, + { + "components": [ + { + "internalType": "string", + "name": "name", + "type": "string" + }, + { + "components": [ + { + "internalType": "address", + "name": "logic", + "type": "address" + }, + { + "internalType": "bytes4", + "name": "initializer", + "type": "bytes4" + } + ], + "internalType": "struct OPStackManager.Implementation", + "name": "info", + "type": "tuple" + } + ], + "internalType": "struct OPStackManager.ImplementationSetter[]", + "name": "setters", + "type": "tuple[]" + }, + { + "internalType": "string", + "name": "release", + "type": "string" + }, + { + "internalType": "bool", + "name": "isLatest", + "type": "bool" + } + ], + "internalType": "struct OPStackManager.InitializerInputs", + "name": "_initializerInputs", + "type": "tuple" + } + ], + "name": "initialize", + "outputs": [], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [], + "name": "latestRelease", + "outputs": [ + { + "internalType": "string", + "name": "", + "type": "string" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [], + "name": "protocolVersions", + "outputs": [ + { + "internalType": "contract ProtocolVersions", + "name": "", + "type": "address" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [], + "name": "superchainConfig", + "outputs": [ + { + "internalType": "contract SuperchainConfig", + "name": "", + "type": "address" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "uint256", + "name": "", + "type": "uint256" + } + ], + "name": "systemConfigs", + "outputs": [ + { + "internalType": "contract SystemConfig", + "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": "uint256", + "name": "l2ChainId", + "type": "uint256" + }, + { + "indexed": true, + "internalType": "contract SystemConfig", + "name": "systemConfig", + "type": "address" + } + ], + "name": "Deployed", + "type": "event" + }, + { + "anonymous": false, + "inputs": [ + { + "indexed": false, + "internalType": "uint8", + "name": "version", + "type": "uint8" + } + ], + "name": "Initialized", + "type": "event" + }, + { + "inputs": [ + { + "internalType": "address", + "name": "who", + "type": "address" + } + ], + "name": "AddressHasNoCode", + "type": "error" + }, + { + "inputs": [ + { + "internalType": "address", + "name": "who", + "type": "address" + } + ], + "name": "AddressNotFound", + "type": "error" + }, + { + "inputs": [], + "name": "AlreadyReleased", + "type": "error" + }, + { + "inputs": [], + "name": "BytesArrayTooLong", + "type": "error" + }, + { + "inputs": [], + "name": "DeploymentFailed", + "type": "error" + }, + { + "inputs": [], + "name": "EmptyInitcode", + "type": "error" + }, + { + "inputs": [], + "name": "InvalidChainId", + "type": "error" + }, + { + "inputs": [ + { + "internalType": "string", + "name": "role", + "type": "string" + } + ], + "name": "InvalidRoleAddress", + "type": "error" + }, + { + "inputs": [], + "name": "LatestReleaseNotSet", + "type": "error" + }, + { + "inputs": [], + "name": "NotABlueprint", + "type": "error" + }, + { + "inputs": [], + "name": "ReservedBitsSet", + "type": "error" + }, + { + "inputs": [ + { + "internalType": "bytes", + "name": "data", + "type": "bytes" + } + ], + "name": "UnexpectedPreambleData", + "type": "error" + }, + { + "inputs": [ + { + "internalType": "uint8", + "name": "version", + "type": "uint8" + } + ], + "name": "UnsupportedERCVersion", + "type": "error" + } +] \ No newline at end of file diff --git a/packages/contracts-bedrock/snapshots/abi/OPStackManagerInterop.json b/packages/contracts-bedrock/snapshots/abi/OPStackManagerInterop.json new file mode 100644 index 000000000000..2ad0a4d1dc2c --- /dev/null +++ b/packages/contracts-bedrock/snapshots/abi/OPStackManagerInterop.json @@ -0,0 +1,555 @@ +[ + { + "inputs": [ + { + "internalType": "contract SuperchainConfig", + "name": "_superchainConfig", + "type": "address" + }, + { + "internalType": "contract ProtocolVersions", + "name": "_protocolVersions", + "type": "address" + } + ], + "stateMutability": "nonpayable", + "type": "constructor" + }, + { + "inputs": [], + "name": "blueprints", + "outputs": [ + { + "components": [ + { + "internalType": "address", + "name": "addressManager", + "type": "address" + }, + { + "internalType": "address", + "name": "proxy", + "type": "address" + }, + { + "internalType": "address", + "name": "proxyAdmin", + "type": "address" + }, + { + "internalType": "address", + "name": "l1ChugSplashProxy", + "type": "address" + }, + { + "internalType": "address", + "name": "resolvedDelegateProxy", + "type": "address" + }, + { + "internalType": "address", + "name": "anchorStateRegistry", + "type": "address" + } + ], + "internalType": "struct OPStackManager.Blueprints", + "name": "", + "type": "tuple" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "uint256", + "name": "_l2ChainId", + "type": "uint256" + } + ], + "name": "chainIdToBatchInboxAddress", + "outputs": [ + { + "internalType": "address", + "name": "", + "type": "address" + } + ], + "stateMutability": "pure", + "type": "function" + }, + { + "inputs": [ + { + "components": [ + { + "components": [ + { + "internalType": "address", + "name": "opChainProxyAdminOwner", + "type": "address" + }, + { + "internalType": "address", + "name": "systemConfigOwner", + "type": "address" + }, + { + "internalType": "address", + "name": "batcher", + "type": "address" + }, + { + "internalType": "address", + "name": "unsafeBlockSigner", + "type": "address" + }, + { + "internalType": "address", + "name": "proposer", + "type": "address" + }, + { + "internalType": "address", + "name": "challenger", + "type": "address" + } + ], + "internalType": "struct OPStackManager.Roles", + "name": "roles", + "type": "tuple" + }, + { + "internalType": "uint32", + "name": "basefeeScalar", + "type": "uint32" + }, + { + "internalType": "uint32", + "name": "blobBasefeeScalar", + "type": "uint32" + }, + { + "internalType": "uint256", + "name": "l2ChainId", + "type": "uint256" + }, + { + "internalType": "bytes", + "name": "startingAnchorRoots", + "type": "bytes" + } + ], + "internalType": "struct OPStackManager.DeployInput", + "name": "_input", + "type": "tuple" + } + ], + "name": "deploy", + "outputs": [ + { + "components": [ + { + "internalType": "contract ProxyAdmin", + "name": "opChainProxyAdmin", + "type": "address" + }, + { + "internalType": "contract AddressManager", + "name": "addressManager", + "type": "address" + }, + { + "internalType": "contract L1ERC721Bridge", + "name": "l1ERC721BridgeProxy", + "type": "address" + }, + { + "internalType": "contract SystemConfig", + "name": "systemConfigProxy", + "type": "address" + }, + { + "internalType": "contract OptimismMintableERC20Factory", + "name": "optimismMintableERC20FactoryProxy", + "type": "address" + }, + { + "internalType": "contract L1StandardBridge", + "name": "l1StandardBridgeProxy", + "type": "address" + }, + { + "internalType": "contract L1CrossDomainMessenger", + "name": "l1CrossDomainMessengerProxy", + "type": "address" + }, + { + "internalType": "contract OptimismPortal2", + "name": "optimismPortalProxy", + "type": "address" + }, + { + "internalType": "contract DisputeGameFactory", + "name": "disputeGameFactoryProxy", + "type": "address" + }, + { + "internalType": "contract AnchorStateRegistry", + "name": "anchorStateRegistryProxy", + "type": "address" + }, + { + "internalType": "contract AnchorStateRegistry", + "name": "anchorStateRegistryImpl", + "type": "address" + }, + { + "internalType": "contract FaultDisputeGame", + "name": "faultDisputeGame", + "type": "address" + }, + { + "internalType": "contract PermissionedDisputeGame", + "name": "permissionedDisputeGame", + "type": "address" + }, + { + "internalType": "contract DelayedWETH", + "name": "delayedWETHPermissionedGameProxy", + "type": "address" + }, + { + "internalType": "contract DelayedWETH", + "name": "delayedWETHPermissionlessGameProxy", + "type": "address" + } + ], + "internalType": "struct OPStackManager.DeployOutput", + "name": "", + "type": "tuple" + } + ], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "string", + "name": "", + "type": "string" + }, + { + "internalType": "string", + "name": "", + "type": "string" + } + ], + "name": "implementations", + "outputs": [ + { + "internalType": "address", + "name": "logic", + "type": "address" + }, + { + "internalType": "bytes4", + "name": "initializer", + "type": "bytes4" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [ + { + "components": [ + { + "components": [ + { + "internalType": "address", + "name": "addressManager", + "type": "address" + }, + { + "internalType": "address", + "name": "proxy", + "type": "address" + }, + { + "internalType": "address", + "name": "proxyAdmin", + "type": "address" + }, + { + "internalType": "address", + "name": "l1ChugSplashProxy", + "type": "address" + }, + { + "internalType": "address", + "name": "resolvedDelegateProxy", + "type": "address" + }, + { + "internalType": "address", + "name": "anchorStateRegistry", + "type": "address" + } + ], + "internalType": "struct OPStackManager.Blueprints", + "name": "blueprints", + "type": "tuple" + }, + { + "components": [ + { + "internalType": "string", + "name": "name", + "type": "string" + }, + { + "components": [ + { + "internalType": "address", + "name": "logic", + "type": "address" + }, + { + "internalType": "bytes4", + "name": "initializer", + "type": "bytes4" + } + ], + "internalType": "struct OPStackManager.Implementation", + "name": "info", + "type": "tuple" + } + ], + "internalType": "struct OPStackManager.ImplementationSetter[]", + "name": "setters", + "type": "tuple[]" + }, + { + "internalType": "string", + "name": "release", + "type": "string" + }, + { + "internalType": "bool", + "name": "isLatest", + "type": "bool" + } + ], + "internalType": "struct OPStackManager.InitializerInputs", + "name": "_initializerInputs", + "type": "tuple" + } + ], + "name": "initialize", + "outputs": [], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [], + "name": "latestRelease", + "outputs": [ + { + "internalType": "string", + "name": "", + "type": "string" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [], + "name": "protocolVersions", + "outputs": [ + { + "internalType": "contract ProtocolVersions", + "name": "", + "type": "address" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [], + "name": "superchainConfig", + "outputs": [ + { + "internalType": "contract SuperchainConfig", + "name": "", + "type": "address" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "uint256", + "name": "", + "type": "uint256" + } + ], + "name": "systemConfigs", + "outputs": [ + { + "internalType": "contract SystemConfig", + "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": "uint256", + "name": "l2ChainId", + "type": "uint256" + }, + { + "indexed": true, + "internalType": "contract SystemConfig", + "name": "systemConfig", + "type": "address" + } + ], + "name": "Deployed", + "type": "event" + }, + { + "anonymous": false, + "inputs": [ + { + "indexed": false, + "internalType": "uint8", + "name": "version", + "type": "uint8" + } + ], + "name": "Initialized", + "type": "event" + }, + { + "inputs": [ + { + "internalType": "address", + "name": "who", + "type": "address" + } + ], + "name": "AddressHasNoCode", + "type": "error" + }, + { + "inputs": [ + { + "internalType": "address", + "name": "who", + "type": "address" + } + ], + "name": "AddressNotFound", + "type": "error" + }, + { + "inputs": [], + "name": "AlreadyReleased", + "type": "error" + }, + { + "inputs": [], + "name": "BytesArrayTooLong", + "type": "error" + }, + { + "inputs": [], + "name": "DeploymentFailed", + "type": "error" + }, + { + "inputs": [], + "name": "EmptyInitcode", + "type": "error" + }, + { + "inputs": [], + "name": "InvalidChainId", + "type": "error" + }, + { + "inputs": [ + { + "internalType": "string", + "name": "role", + "type": "string" + } + ], + "name": "InvalidRoleAddress", + "type": "error" + }, + { + "inputs": [], + "name": "LatestReleaseNotSet", + "type": "error" + }, + { + "inputs": [], + "name": "NotABlueprint", + "type": "error" + }, + { + "inputs": [], + "name": "ReservedBitsSet", + "type": "error" + }, + { + "inputs": [ + { + "internalType": "bytes", + "name": "data", + "type": "bytes" + } + ], + "name": "UnexpectedPreambleData", + "type": "error" + }, + { + "inputs": [ + { + "internalType": "uint8", + "name": "version", + "type": "uint8" + } + ], + "name": "UnsupportedERCVersion", + "type": "error" + } +] \ No newline at end of file diff --git a/packages/contracts-bedrock/snapshots/abi/OptimismMintableERC20.json b/packages/contracts-bedrock/snapshots/abi/OptimismMintableERC20.json index 3c6f5e9ab348..5a5763c73962 100644 --- a/packages/contracts-bedrock/snapshots/abi/OptimismMintableERC20.json +++ b/packages/contracts-bedrock/snapshots/abi/OptimismMintableERC20.json @@ -43,6 +43,32 @@ "stateMutability": "view", "type": "function" }, + { + "inputs": [], + "name": "DOMAIN_SEPARATOR", + "outputs": [ + { + "internalType": "bytes32", + "name": "", + "type": "bytes32" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [], + "name": "PERMIT2", + "outputs": [ + { + "internalType": "address", + "name": "", + "type": "address" + } + ], + "stateMutability": "pure", + "type": "function" + }, { "inputs": [], "name": "REMOTE_TOKEN", @@ -60,12 +86,12 @@ "inputs": [ { "internalType": "address", - "name": "owner", + "name": "_owner", "type": "address" }, { "internalType": "address", - "name": "spender", + "name": "_spender", "type": "address" } ], @@ -272,6 +298,68 @@ "stateMutability": "view", "type": "function" }, + { + "inputs": [ + { + "internalType": "address", + "name": "owner", + "type": "address" + } + ], + "name": "nonces", + "outputs": [ + { + "internalType": "uint256", + "name": "", + "type": "uint256" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "address", + "name": "owner", + "type": "address" + }, + { + "internalType": "address", + "name": "spender", + "type": "address" + }, + { + "internalType": "uint256", + "name": "value", + "type": "uint256" + }, + { + "internalType": "uint256", + "name": "deadline", + "type": "uint256" + }, + { + "internalType": "uint8", + "name": "v", + "type": "uint8" + }, + { + "internalType": "bytes32", + "name": "r", + "type": "bytes32" + }, + { + "internalType": "bytes32", + "name": "s", + "type": "bytes32" + } + ], + "name": "permit", + "outputs": [], + "stateMutability": "nonpayable", + "type": "function" + }, { "inputs": [], "name": "remoteToken", diff --git a/packages/contracts-bedrock/snapshots/abi/OptimismMintableERC20Factory.json b/packages/contracts-bedrock/snapshots/abi/OptimismMintableERC20Factory.json index 3f2f14fcbe59..d3da8e2de735 100644 --- a/packages/contracts-bedrock/snapshots/abi/OptimismMintableERC20Factory.json +++ b/packages/contracts-bedrock/snapshots/abi/OptimismMintableERC20Factory.json @@ -122,6 +122,25 @@ "stateMutability": "nonpayable", "type": "function" }, + { + "inputs": [ + { + "internalType": "address", + "name": "", + "type": "address" + } + ], + "name": "deployments", + "outputs": [ + { + "internalType": "address", + "name": "", + "type": "address" + } + ], + "stateMutability": "view", + "type": "function" + }, { "inputs": [ { diff --git a/packages/contracts-bedrock/snapshots/abi/OptimismPortal.json b/packages/contracts-bedrock/snapshots/abi/OptimismPortal.json index dac6fbc0bee6..7ccee328a984 100644 --- a/packages/contracts-bedrock/snapshots/abi/OptimismPortal.json +++ b/packages/contracts-bedrock/snapshots/abi/OptimismPortal.json @@ -179,17 +179,17 @@ { "inputs": [ { - "internalType": "contract L2OutputOracle", + "internalType": "contract IL2OutputOracle", "name": "_l2Oracle", "type": "address" }, { - "internalType": "contract SystemConfig", + "internalType": "contract ISystemConfig", "name": "_systemConfig", "type": "address" }, { - "internalType": "contract SuperchainConfig", + "internalType": "contract ISuperchainConfig", "name": "_superchainConfig", "type": "address" } @@ -223,7 +223,7 @@ "name": "l2Oracle", "outputs": [ { - "internalType": "contract L2OutputOracle", + "internalType": "contract IL2OutputOracle", "name": "", "type": "address" } @@ -443,7 +443,7 @@ "name": "superchainConfig", "outputs": [ { - "internalType": "contract SuperchainConfig", + "internalType": "contract ISuperchainConfig", "name": "", "type": "address" } @@ -456,7 +456,7 @@ "name": "systemConfig", "outputs": [ { - "internalType": "contract SystemConfig", + "internalType": "contract ISystemConfig", "name": "", "type": "address" } @@ -474,7 +474,7 @@ "type": "string" } ], - "stateMutability": "view", + "stateMutability": "pure", "type": "function" }, { diff --git a/packages/contracts-bedrock/snapshots/abi/OptimismPortal2.json b/packages/contracts-bedrock/snapshots/abi/OptimismPortal2.json index 6fb9255844cc..2f52ed573d37 100644 --- a/packages/contracts-bedrock/snapshots/abi/OptimismPortal2.json +++ b/packages/contracts-bedrock/snapshots/abi/OptimismPortal2.json @@ -19,6 +19,19 @@ "stateMutability": "payable", "type": "receive" }, + { + "inputs": [], + "name": "balance", + "outputs": [ + { + "internalType": "uint256", + "name": "", + "type": "uint256" + } + ], + "stateMutability": "view", + "type": "function" + }, { "inputs": [ { @@ -50,6 +63,44 @@ "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": [ { @@ -107,7 +158,7 @@ "name": "disputeGameFactory", "outputs": [ { - "internalType": "contract DisputeGameFactory", + "internalType": "contract IDisputeGameFactory", "name": "", "type": "address" } @@ -265,17 +316,17 @@ { "inputs": [ { - "internalType": "contract DisputeGameFactory", + "internalType": "contract IDisputeGameFactory", "name": "_disputeGameFactory", "type": "address" }, { - "internalType": "contract SystemConfig", + "internalType": "contract ISystemConfig", "name": "_systemConfig", "type": "address" }, { - "internalType": "contract SuperchainConfig", + "internalType": "contract ISuperchainConfig", "name": "_superchainConfig", "type": "address" }, @@ -551,6 +602,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": [ { @@ -569,7 +648,7 @@ "name": "superchainConfig", "outputs": [ { - "internalType": "contract SuperchainConfig", + "internalType": "contract ISuperchainConfig", "name": "", "type": "address" } @@ -582,7 +661,7 @@ "name": "systemConfig", "outputs": [ { - "internalType": "contract SystemConfig", + "internalType": "contract ISystemConfig", "name": "", "type": "address" } @@ -600,7 +679,7 @@ "type": "string" } ], - "stateMutability": "view", + "stateMutability": "pure", "type": "function" }, { @@ -742,11 +821,21 @@ "name": "WithdrawalProvenExtension1", "type": "event" }, + { + "inputs": [], + "name": "AlreadyFinalized", + "type": "error" + }, { "inputs": [], "name": "BadTarget", "type": "error" }, + { + "inputs": [], + "name": "Blacklisted", + "type": "error" + }, { "inputs": [], "name": "CallPaused", @@ -772,26 +861,71 @@ "name": "InvalidDataRemainder", "type": "error" }, + { + "inputs": [], + "name": "InvalidDisputeGame", + "type": "error" + }, + { + "inputs": [], + "name": "InvalidGameType", + "type": "error" + }, { "inputs": [], "name": "InvalidHeader", "type": "error" }, + { + "inputs": [], + "name": "InvalidMerkleProof", + "type": "error" + }, + { + "inputs": [], + "name": "InvalidProof", + "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": "ProposalNotValidated", + "type": "error" + }, { "inputs": [], "name": "SmallGasLimit", "type": "error" }, + { + "inputs": [], + "name": "TransferFailed", + "type": "error" + }, { "inputs": [], "name": "Unauthorized", @@ -806,5 +940,10 @@ "inputs": [], "name": "UnexpectedString", "type": "error" + }, + { + "inputs": [], + "name": "Unproven", + "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..5b9f72b9446c --- /dev/null +++ b/packages/contracts-bedrock/snapshots/abi/OptimismPortalInterop.json @@ -0,0 +1,967 @@ +[ + { + "inputs": [ + { + "internalType": "uint256", + "name": "_proofMaturityDelaySeconds", + "type": "uint256" + }, + { + "internalType": "uint256", + "name": "_disputeGameFinalityDelaySeconds", + "type": "uint256" + } + ], + "stateMutability": "nonpayable", + "type": "constructor" + }, + { + "stateMutability": "payable", + "type": "receive" + }, + { + "inputs": [], + "name": "balance", + "outputs": [ + { + "internalType": "uint256", + "name": "", + "type": "uint256" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "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": "_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": [ + { + "internalType": "contract IDisputeGame", + "name": "", + "type": "address" + } + ], + "name": "disputeGameBlacklist", + "outputs": [ + { + "internalType": "bool", + "name": "", + "type": "bool" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [], + "name": "disputeGameFactory", + "outputs": [ + { + "internalType": "contract IDisputeGameFactory", + "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 IDisputeGameFactory", + "name": "_disputeGameFactory", + "type": "address" + }, + { + "internalType": "contract ISystemConfig", + "name": "_systemConfig", + "type": "address" + }, + { + "internalType": "contract ISuperchainConfig", + "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": "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": [ + { + "internalType": "GameType", + "name": "_gameType", + "type": "uint32" + } + ], + "name": "setRespectedGameType", + "outputs": [], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [], + "name": "superchainConfig", + "outputs": [ + { + "internalType": "contract ISuperchainConfig", + "name": "", + "type": "address" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [], + "name": "systemConfig", + "outputs": [ + { + "internalType": "contract ISystemConfig", + "name": "", + "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": "contract IDisputeGame", + "name": "disputeGame", + "type": "address" + } + ], + "name": "DisputeGameBlacklisted", + "type": "event" + }, + { + "anonymous": false, + "inputs": [ + { + "indexed": false, + "internalType": "uint8", + "name": "version", + "type": "uint8" + } + ], + "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": [ + { + "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" + }, + { + "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": "AlreadyFinalized", + "type": "error" + }, + { + "inputs": [], + "name": "BadTarget", + "type": "error" + }, + { + "inputs": [], + "name": "Blacklisted", + "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": "InvalidDisputeGame", + "type": "error" + }, + { + "inputs": [], + "name": "InvalidGameType", + "type": "error" + }, + { + "inputs": [], + "name": "InvalidHeader", + "type": "error" + }, + { + "inputs": [], + "name": "InvalidMerkleProof", + "type": "error" + }, + { + "inputs": [], + "name": "InvalidProof", + "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": "ProposalNotValidated", + "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" + }, + { + "inputs": [], + "name": "Unproven", + "type": "error" + } +] \ No newline at end of file diff --git a/packages/contracts-bedrock/snapshots/abi/OptimismSuperchainERC20.json b/packages/contracts-bedrock/snapshots/abi/OptimismSuperchainERC20.json new file mode 100644 index 000000000000..6eb57764a8cb --- /dev/null +++ b/packages/contracts-bedrock/snapshots/abi/OptimismSuperchainERC20.json @@ -0,0 +1,637 @@ +[ + { + "inputs": [], + "stateMutability": "nonpayable", + "type": "constructor" + }, + { + "inputs": [], + "name": "DOMAIN_SEPARATOR", + "outputs": [ + { + "internalType": "bytes32", + "name": "result", + "type": "bytes32" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "address", + "name": "owner", + "type": "address" + }, + { + "internalType": "address", + "name": "spender", + "type": "address" + } + ], + "name": "allowance", + "outputs": [ + { + "internalType": "uint256", + "name": "result", + "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": "owner", + "type": "address" + } + ], + "name": "balanceOf", + "outputs": [ + { + "internalType": "uint256", + "name": "result", + "type": "uint256" + } + ], + "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": "_remoteToken", + "type": "address" + }, + { + "internalType": "string", + "name": "_name", + "type": "string" + }, + { + "internalType": "string", + "name": "_symbol", + "type": "string" + }, + { + "internalType": "uint8", + "name": "_decimals", + "type": "uint8" + } + ], + "name": "initialize", + "outputs": [], + "stateMutability": "nonpayable", + "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": [ + { + "internalType": "address", + "name": "owner", + "type": "address" + } + ], + "name": "nonces", + "outputs": [ + { + "internalType": "uint256", + "name": "result", + "type": "uint256" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "address", + "name": "owner", + "type": "address" + }, + { + "internalType": "address", + "name": "spender", + "type": "address" + }, + { + "internalType": "uint256", + "name": "value", + "type": "uint256" + }, + { + "internalType": "uint256", + "name": "deadline", + "type": "uint256" + }, + { + "internalType": "uint8", + "name": "v", + "type": "uint8" + }, + { + "internalType": "bytes32", + "name": "r", + "type": "bytes32" + }, + { + "internalType": "bytes32", + "name": "s", + "type": "bytes32" + } + ], + "name": "permit", + "outputs": [], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "address", + "name": "_from", + "type": "address" + }, + { + "internalType": "address", + "name": "_to", + "type": "address" + }, + { + "internalType": "uint256", + "name": "_amount", + "type": "uint256" + } + ], + "name": "relayERC20", + "outputs": [], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [], + "name": "remoteToken", + "outputs": [ + { + "internalType": "address", + "name": "", + "type": "address" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "address", + "name": "_to", + "type": "address" + }, + { + "internalType": "uint256", + "name": "_amount", + "type": "uint256" + }, + { + "internalType": "uint256", + "name": "_chainId", + "type": "uint256" + } + ], + "name": "sendERC20", + "outputs": [], + "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": "symbol", + "outputs": [ + { + "internalType": "string", + "name": "", + "type": "string" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [], + "name": "totalSupply", + "outputs": [ + { + "internalType": "uint256", + "name": "result", + "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" + }, + { + "anonymous": false, + "inputs": [ + { + "indexed": true, + "internalType": "address", + "name": "owner", + "type": "address" + }, + { + "indexed": true, + "internalType": "address", + "name": "spender", + "type": "address" + }, + { + "indexed": false, + "internalType": "uint256", + "name": "amount", + "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": false, + "internalType": "uint64", + "name": "version", + "type": "uint64" + } + ], + "name": "Initialized", + "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": "amount", + "type": "uint256" + }, + { + "indexed": false, + "internalType": "uint256", + "name": "source", + "type": "uint256" + } + ], + "name": "RelayERC20", + "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": "uint256", + "name": "destination", + "type": "uint256" + } + ], + "name": "SendERC20", + "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" + } + ], + "name": "Transfer", + "type": "event" + }, + { + "inputs": [], + "name": "AllowanceOverflow", + "type": "error" + }, + { + "inputs": [], + "name": "AllowanceUnderflow", + "type": "error" + }, + { + "inputs": [], + "name": "CallerNotL2ToL2CrossDomainMessenger", + "type": "error" + }, + { + "inputs": [], + "name": "InsufficientAllowance", + "type": "error" + }, + { + "inputs": [], + "name": "InsufficientBalance", + "type": "error" + }, + { + "inputs": [], + "name": "InvalidCrossDomainSender", + "type": "error" + }, + { + "inputs": [], + "name": "InvalidInitialization", + "type": "error" + }, + { + "inputs": [], + "name": "InvalidPermit", + "type": "error" + }, + { + "inputs": [], + "name": "NotInitializing", + "type": "error" + }, + { + "inputs": [], + "name": "OnlyBridge", + "type": "error" + }, + { + "inputs": [], + "name": "PermitExpired", + "type": "error" + }, + { + "inputs": [], + "name": "TotalSupplyOverflow", + "type": "error" + }, + { + "inputs": [], + "name": "ZeroAddress", + "type": "error" + } +] \ No newline at end of file diff --git a/packages/contracts-bedrock/snapshots/abi/OptimismSuperchainERC20Beacon.json b/packages/contracts-bedrock/snapshots/abi/OptimismSuperchainERC20Beacon.json new file mode 100644 index 000000000000..0bdfc64ed2fe --- /dev/null +++ b/packages/contracts-bedrock/snapshots/abi/OptimismSuperchainERC20Beacon.json @@ -0,0 +1,39 @@ +[ + { + "inputs": [ + { + "internalType": "address", + "name": "_implementation", + "type": "address" + } + ], + "stateMutability": "nonpayable", + "type": "constructor" + }, + { + "inputs": [], + "name": "implementation", + "outputs": [ + { + "internalType": "address", + "name": "", + "type": "address" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [], + "name": "version", + "outputs": [ + { + "internalType": "string", + "name": "", + "type": "string" + } + ], + "stateMutability": "view", + "type": "function" + } +] \ No newline at end of file diff --git a/packages/contracts-bedrock/snapshots/abi/OptimismSuperchainERC20Factory.json b/packages/contracts-bedrock/snapshots/abi/OptimismSuperchainERC20Factory.json new file mode 100644 index 000000000000..7171cf1f3198 --- /dev/null +++ b/packages/contracts-bedrock/snapshots/abi/OptimismSuperchainERC20Factory.json @@ -0,0 +1,93 @@ +[ + { + "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": "deploy", + "outputs": [ + { + "internalType": "address", + "name": "_superchainERC20", + "type": "address" + } + ], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "address", + "name": "superchainToken", + "type": "address" + } + ], + "name": "deployments", + "outputs": [ + { + "internalType": "address", + "name": "remoteToken", + "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": "superchainToken", + "type": "address" + }, + { + "indexed": true, + "internalType": "address", + "name": "remoteToken", + "type": "address" + }, + { + "indexed": false, + "internalType": "address", + "name": "deployer", + "type": "address" + } + ], + "name": "OptimismSuperchainERC20Created", + "type": "event" + } +] \ 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 f9849492b8d0..fd9737cc5842 100644 --- a/packages/contracts-bedrock/snapshots/abi/PermissionedDisputeGame.json +++ b/packages/contracts-bedrock/snapshots/abi/PermissionedDisputeGame.json @@ -1004,6 +1004,11 @@ "name": "IncorrectBondAmount", "type": "error" }, + { + "inputs": [], + "name": "InvalidChallengePeriod", + "type": "error" + }, { "inputs": [], "name": "InvalidClockExtension", diff --git a/packages/contracts-bedrock/snapshots/abi/PreimageOracle.json b/packages/contracts-bedrock/snapshots/abi/PreimageOracle.json index 5ba83bc0b514..8094e4ab9283 100644 --- a/packages/contracts-bedrock/snapshots/abi/PreimageOracle.json +++ b/packages/contracts-bedrock/snapshots/abi/PreimageOracle.json @@ -54,6 +54,19 @@ "stateMutability": "view", "type": "function" }, + { + "inputs": [], + "name": "PRECOMPILE_CALL_RESERVED_GAS", + "outputs": [ + { + "internalType": "uint256", + "name": "", + "type": "uint256" + } + ], + "stateMutability": "view", + "type": "function" + }, { "inputs": [ { @@ -378,6 +391,11 @@ "name": "_precompile", "type": "address" }, + { + "internalType": "uint64", + "name": "_requiredGas", + "type": "uint64" + }, { "internalType": "bytes", "name": "_input", @@ -833,6 +851,11 @@ "name": "AlreadyFinalized", "type": "error" }, + { + "inputs": [], + "name": "AlreadyInitialized", + "type": "error" + }, { "inputs": [], "name": "BadProposal", diff --git a/packages/contracts-bedrock/snapshots/abi/SequencerFeeVault.json b/packages/contracts-bedrock/snapshots/abi/SequencerFeeVault.json index 568a041b3cc8..98c97149b215 100644 --- a/packages/contracts-bedrock/snapshots/abi/SequencerFeeVault.json +++ b/packages/contracts-bedrock/snapshots/abi/SequencerFeeVault.json @@ -76,6 +76,32 @@ "stateMutability": "view", "type": "function" }, + { + "inputs": [], + "name": "minWithdrawalAmount", + "outputs": [ + { + "internalType": "uint256", + "name": "amount_", + "type": "uint256" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [], + "name": "recipient", + "outputs": [ + { + "internalType": "address", + "name": "recipient_", + "type": "address" + } + ], + "stateMutability": "view", + "type": "function" + }, { "inputs": [], "name": "totalProcessed", @@ -109,6 +135,19 @@ "stateMutability": "nonpayable", "type": "function" }, + { + "inputs": [], + "name": "withdrawalNetwork", + "outputs": [ + { + "internalType": "enum FeeVault.WithdrawalNetwork", + "name": "network_", + "type": "uint8" + } + ], + "stateMutability": "view", + "type": "function" + }, { "anonymous": false, "inputs": [ diff --git a/packages/contracts-bedrock/snapshots/abi/SuperchainWETH.json b/packages/contracts-bedrock/snapshots/abi/SuperchainWETH.json new file mode 100644 index 000000000000..600e0e6b64f7 --- /dev/null +++ b/packages/contracts-bedrock/snapshots/abi/SuperchainWETH.json @@ -0,0 +1,421 @@ +[ + { + "stateMutability": "payable", + "type": "fallback" + }, + { + "stateMutability": "payable", + "type": "receive" + }, + { + "inputs": [ + { + "internalType": "address", + "name": "", + "type": "address" + }, + { + "internalType": "address", + "name": "", + "type": "address" + } + ], + "name": "allowance", + "outputs": [ + { + "internalType": "uint256", + "name": "", + "type": "uint256" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "address", + "name": "guy", + "type": "address" + }, + { + "internalType": "uint256", + "name": "wad", + "type": "uint256" + } + ], + "name": "approve", + "outputs": [ + { + "internalType": "bool", + "name": "", + "type": "bool" + } + ], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "address", + "name": "", + "type": "address" + } + ], + "name": "balanceOf", + "outputs": [ + { + "internalType": "uint256", + "name": "", + "type": "uint256" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [], + "name": "decimals", + "outputs": [ + { + "internalType": "uint8", + "name": "", + "type": "uint8" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [], + "name": "deposit", + "outputs": [], + "stateMutability": "payable", + "type": "function" + }, + { + "inputs": [], + "name": "name", + "outputs": [ + { + "internalType": "string", + "name": "", + "type": "string" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "address", + "name": "from", + "type": "address" + }, + { + "internalType": "address", + "name": "dst", + "type": "address" + }, + { + "internalType": "uint256", + "name": "wad", + "type": "uint256" + } + ], + "name": "relayERC20", + "outputs": [], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "address", + "name": "dst", + "type": "address" + }, + { + "internalType": "uint256", + "name": "wad", + "type": "uint256" + }, + { + "internalType": "uint256", + "name": "chainId", + "type": "uint256" + } + ], + "name": "sendERC20", + "outputs": [], + "stateMutability": "nonpayable", + "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": "dst", + "type": "address" + }, + { + "internalType": "uint256", + "name": "wad", + "type": "uint256" + } + ], + "name": "transfer", + "outputs": [ + { + "internalType": "bool", + "name": "", + "type": "bool" + } + ], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "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" + } + ], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [], + "name": "version", + "outputs": [ + { + "internalType": "string", + "name": "", + "type": "string" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "uint256", + "name": "wad", + "type": "uint256" + } + ], + "name": "withdraw", + "outputs": [], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "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": "from", + "type": "address" + }, + { + "indexed": true, + "internalType": "address", + "name": "to", + "type": "address" + }, + { + "indexed": false, + "internalType": "uint256", + "name": "amount", + "type": "uint256" + }, + { + "indexed": false, + "internalType": "uint256", + "name": "source", + "type": "uint256" + } + ], + "name": "RelayERC20", + "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": "uint256", + "name": "destination", + "type": "uint256" + } + ], + "name": "SendERC20", + "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" + }, + { + "inputs": [], + "name": "NotCustomGasToken", + "type": "error" + }, + { + "inputs": [], + "name": "Unauthorized", + "type": "error" + } +] \ No newline at end of file diff --git a/packages/contracts-bedrock/snapshots/abi/SystemConfig.json b/packages/contracts-bedrock/snapshots/abi/SystemConfig.json index c9f039264558..695231b9b119 100644 --- a/packages/contracts-bedrock/snapshots/abi/SystemConfig.json +++ b/packages/contracts-bedrock/snapshots/abi/SystemConfig.json @@ -321,7 +321,7 @@ "type": "uint128" } ], - "internalType": "struct ResourceMetering.ResourceConfig", + "internalType": "struct IResourceMetering.ResourceConfig", "name": "_config", "type": "tuple" }, @@ -552,7 +552,7 @@ "type": "uint128" } ], - "internalType": "struct ResourceMetering.ResourceConfig", + "internalType": "struct IResourceMetering.ResourceConfig", "name": "", "type": "tuple" } @@ -697,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..64f72945615b --- /dev/null +++ b/packages/contracts-bedrock/snapshots/abi/SystemConfigInterop.json @@ -0,0 +1,921 @@ +[ + { + "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": "dependencyManager", + "outputs": [ + { + "internalType": "address", + "name": "", + "type": "address" + } + ], + "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 IResourceMetering.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" + }, + { + "internalType": "address", + "name": "_dependencyManager", + "type": "address" + } + ], + "name": "initialize", + "outputs": [], + "stateMutability": "nonpayable", + "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 IResourceMetering.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 IResourceMetering.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/TransientReentrancyAware.json b/packages/contracts-bedrock/snapshots/abi/TransientReentrancyAware.json index 0637a088a01e..02e2e526860f 100644 --- a/packages/contracts-bedrock/snapshots/abi/TransientReentrancyAware.json +++ b/packages/contracts-bedrock/snapshots/abi/TransientReentrancyAware.json @@ -1 +1,12 @@ -[] \ No newline at end of file +[ + { + "inputs": [], + "name": "NotEntered", + "type": "error" + }, + { + "inputs": [], + "name": "ReentrantCall", + "type": "error" + } +] \ No newline at end of file diff --git a/packages/contracts-bedrock/snapshots/abi_loader.go b/packages/contracts-bedrock/snapshots/abi_loader.go index 483969e61a77..34d6375436b7 100644 --- a/packages/contracts-bedrock/snapshots/abi_loader.go +++ b/packages/contracts-bedrock/snapshots/abi_loader.go @@ -22,6 +22,12 @@ var mips []byte //go:embed abi/DelayedWETH.json var delayedWETH []byte +//go:embed abi/SystemConfig.json +var systemConfig []byte + +//go:embed abi/CrossL2Inbox.json +var crossL2Inbox []byte + func LoadDisputeGameFactoryABI() *abi.ABI { return loadABI(disputeGameFactory) } @@ -38,6 +44,14 @@ func LoadDelayedWETHABI() *abi.ABI { return loadABI(delayedWETH) } +func LoadSystemConfigABI() *abi.ABI { + return loadABI(systemConfig) +} + +func LoadCrossL2InboxABI() *abi.ABI { + return loadABI(crossL2Inbox) +} + func loadABI(json []byte) *abi.ABI { if parsed, err := abi.JSON(bytes.NewReader(json)); err != nil { panic(err) diff --git a/packages/contracts-bedrock/snapshots/state-diff/.gitkeep b/packages/contracts-bedrock/snapshots/state-diff/.gitkeep new file mode 100644 index 000000000000..e69de29bb2d1 diff --git a/packages/contracts-bedrock/snapshots/state-diff/Kontrol-Deploy.json b/packages/contracts-bedrock/snapshots/state-diff/Kontrol-Deploy.json deleted file mode 100644 index fe1f98e7ee44..000000000000 --- a/packages/contracts-bedrock/snapshots/state-diff/Kontrol-Deploy.json +++ /dev/null @@ -1,12001 +0,0 @@ -{ - "accountAccesses": [ - { - "accessor": "0x7FA9385bE102ac3EAc297483Dd6233D62b3e1496", - "account": "0x7109709ECfa91a80626fF3989D68f67F5b1DD12D", - "chainInfo": { - "chainId": 31337, - "forkId": 0 - }, - "data": "0x", - "deployedCode": "0x", - "initialized": true, - "kind": "Resume", - "newBalance": 0, - "oldBalance": 0, - "reverted": false, - "storageAccesses": [], - "value": 0 - }, - { - "accessor": "0x7FA9385bE102ac3EAc297483Dd6233D62b3e1496", - "account": "0xa6B71E26C5e0845f74c812102Ca7114b6a896AB2", - "chainInfo": { - "chainId": 31337, - "forkId": 0 - }, - "data": "0x", - "deployedCode": "0x", - "initialized": false, - "kind": "Resume", - "newBalance": 0, - "oldBalance": 0, - "reverted": false, - "storageAccesses": [], - "value": 0 - }, - { - "accessor": "0x1804c8AB1F12E6bbf3894d4083f33e07309d1f38", - "account": "0x34A1D3fff3958843C43aD80F30b94c510645C316", - "chainInfo": { - "chainId": 31337, - "forkId": 0 - }, - "data": "0x608060405234801561001057600080fd5b50610913806100206000396000f3fe608060405234801561001057600080fd5b50600436106100675760003560e01c806353e5d9351161005057806353e5d935146100b7578063d18af54d146100cc578063ec9e80bb146100df57600080fd5b80631688f0b91461006c5780633408e470146100a9575b600080fd5b61007f61007a3660046105d2565b6100f2565b60405173ffffffffffffffffffffffffffffffffffffffff90911681526020015b60405180910390f35b6040514681526020016100a0565b6100bf610194565b6040516100a091906106a5565b61007f6100da3660046106bf565b6101dc565b61007f6100ed3660046105d2565b6102f8565b600080838051906020012083604051602001610118929190918252602082015260400190565b60405160208183030381529060405280519060200120905061013b85858361032a565b60405173ffffffffffffffffffffffffffffffffffffffff8781168252919350908316907f4f51faf6c4561ff95f067657e43439f0f856d97c04d9ec9070a6199ad418e2359060200160405180910390a2509392505050565b6060604051806020016101a6906104c6565b7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe082820381018352601f90910116604052919050565b600080838360405160200161022092919091825260601b7fffffffffffffffffffffffffffffffffffffffff00000000000000000000000016602082015260340190565b6040516020818303038152906040528051906020012060001c90506102468686836100f2565b915073ffffffffffffffffffffffffffffffffffffffff8316156102ef576040517f1e52b51800000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff841690631e52b518906102bc9085908a908a908a9060040161072b565b600060405180830381600087803b1580156102d657600080fd5b505af11580156102ea573d6000803e3d6000fd5b505050505b50949350505050565b60008083805190602001208361030b4690565b6040805160208101949094528301919091526060820152608001610118565b6000833b610399576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601f60248201527f53696e676c65746f6e20636f6e7472616374206e6f74206465706c6f7965640060448201526064015b60405180910390fd5b6000604051806020016103ab906104c6565b7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe082820381018352601f909101166040819052610403919073ffffffffffffffffffffffffffffffffffffffff881690602001610775565b6040516020818303038152906040529050828151826020016000f5915073ffffffffffffffffffffffffffffffffffffffff821661049d576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601360248201527f437265617465322063616c6c206661696c6564000000000000000000000000006044820152606401610390565b8351156104be5760008060008651602088016000875af1036104be57600080fd5b509392505050565b61016f8061079883390190565b73ffffffffffffffffffffffffffffffffffffffff811681146104f557600080fd5b50565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b600082601f83011261053857600080fd5b813567ffffffffffffffff80821115610553576105536104f8565b604051601f83017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0908116603f01168101908282118183101715610599576105996104f8565b816040528381528660208588010111156105b257600080fd5b836020870160208301376000602085830101528094505050505092915050565b6000806000606084860312156105e757600080fd5b83356105f2816104d3565b9250602084013567ffffffffffffffff81111561060e57600080fd5b61061a86828701610527565b925050604084013590509250925092565b60005b8381101561064657818101518382015260200161062e565b83811115610655576000848401525b50505050565b6000815180845261067381602086016020860161062b565b601f017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0169290920160200192915050565b6020815260006106b8602083018461065b565b9392505050565b600080600080608085870312156106d557600080fd5b84356106e0816104d3565b9350602085013567ffffffffffffffff8111156106fc57600080fd5b61070887828801610527565b935050604085013591506060850135610720816104d3565b939692955090935050565b600073ffffffffffffffffffffffffffffffffffffffff808716835280861660208401525060806040830152610764608083018561065b565b905082606083015295945050505050565b6000835161078781846020880161062b565b919091019182525060200191905056fe608060405234801561001057600080fd5b5060405161016f38038061016f83398101604081905261002f916100b9565b6001600160a01b0381166100945760405162461bcd60e51b815260206004820152602260248201527f496e76616c69642073696e676c65746f6e20616464726573732070726f766964604482015261195960f21b606482015260840160405180910390fd5b600080546001600160a01b0319166001600160a01b03929092169190911790556100e9565b6000602082840312156100cb57600080fd5b81516001600160a01b03811681146100e257600080fd5b9392505050565b6078806100f76000396000f3fe6080604052600073ffffffffffffffffffffffffffffffffffffffff8154167fa619486e00000000000000000000000000000000000000000000000000000000823503604d57808252602082f35b3682833781823684845af490503d82833e806066573d82fd5b503d81f3fea164736f6c634300080f000aa164736f6c634300080f000a", - "deployedCode": "0x608060405234801561001057600080fd5b50600436106100675760003560e01c806353e5d9351161005057806353e5d935146100b7578063d18af54d146100cc578063ec9e80bb146100df57600080fd5b80631688f0b91461006c5780633408e470146100a9575b600080fd5b61007f61007a3660046105d2565b6100f2565b60405173ffffffffffffffffffffffffffffffffffffffff90911681526020015b60405180910390f35b6040514681526020016100a0565b6100bf610194565b6040516100a091906106a5565b61007f6100da3660046106bf565b6101dc565b61007f6100ed3660046105d2565b6102f8565b600080838051906020012083604051602001610118929190918252602082015260400190565b60405160208183030381529060405280519060200120905061013b85858361032a565b60405173ffffffffffffffffffffffffffffffffffffffff8781168252919350908316907f4f51faf6c4561ff95f067657e43439f0f856d97c04d9ec9070a6199ad418e2359060200160405180910390a2509392505050565b6060604051806020016101a6906104c6565b7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe082820381018352601f90910116604052919050565b600080838360405160200161022092919091825260601b7fffffffffffffffffffffffffffffffffffffffff00000000000000000000000016602082015260340190565b6040516020818303038152906040528051906020012060001c90506102468686836100f2565b915073ffffffffffffffffffffffffffffffffffffffff8316156102ef576040517f1e52b51800000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff841690631e52b518906102bc9085908a908a908a9060040161072b565b600060405180830381600087803b1580156102d657600080fd5b505af11580156102ea573d6000803e3d6000fd5b505050505b50949350505050565b60008083805190602001208361030b4690565b6040805160208101949094528301919091526060820152608001610118565b6000833b610399576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601f60248201527f53696e676c65746f6e20636f6e7472616374206e6f74206465706c6f7965640060448201526064015b60405180910390fd5b6000604051806020016103ab906104c6565b7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe082820381018352601f909101166040819052610403919073ffffffffffffffffffffffffffffffffffffffff881690602001610775565b6040516020818303038152906040529050828151826020016000f5915073ffffffffffffffffffffffffffffffffffffffff821661049d576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601360248201527f437265617465322063616c6c206661696c6564000000000000000000000000006044820152606401610390565b8351156104be5760008060008651602088016000875af1036104be57600080fd5b509392505050565b61016f8061079883390190565b73ffffffffffffffffffffffffffffffffffffffff811681146104f557600080fd5b50565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b600082601f83011261053857600080fd5b813567ffffffffffffffff80821115610553576105536104f8565b604051601f83017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0908116603f01168101908282118183101715610599576105996104f8565b816040528381528660208588010111156105b257600080fd5b836020870160208301376000602085830101528094505050505092915050565b6000806000606084860312156105e757600080fd5b83356105f2816104d3565b9250602084013567ffffffffffffffff81111561060e57600080fd5b61061a86828701610527565b925050604084013590509250925092565b60005b8381101561064657818101518382015260200161062e565b83811115610655576000848401525b50505050565b6000815180845261067381602086016020860161062b565b601f017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0169290920160200192915050565b6020815260006106b8602083018461065b565b9392505050565b600080600080608085870312156106d557600080fd5b84356106e0816104d3565b9350602085013567ffffffffffffffff8111156106fc57600080fd5b61070887828801610527565b935050604085013591506060850135610720816104d3565b939692955090935050565b600073ffffffffffffffffffffffffffffffffffffffff808716835280861660208401525060806040830152610764608083018561065b565b905082606083015295945050505050565b6000835161078781846020880161062b565b919091019182525060200191905056fe608060405234801561001057600080fd5b5060405161016f38038061016f83398101604081905261002f916100b9565b6001600160a01b0381166100945760405162461bcd60e51b815260206004820152602260248201527f496e76616c69642073696e676c65746f6e20616464726573732070726f766964604482015261195960f21b606482015260840160405180910390fd5b600080546001600160a01b0319166001600160a01b03929092169190911790556100e9565b6000602082840312156100cb57600080fd5b81516001600160a01b03811681146100e257600080fd5b9392505050565b6078806100f76000396000f3fe6080604052600073ffffffffffffffffffffffffffffffffffffffff8154167fa619486e00000000000000000000000000000000000000000000000000000000823503604d57808252602082f35b3682833781823684845af490503d82833e806066573d82fd5b503d81f3fea164736f6c634300080f000aa164736f6c634300080f000a", - "initialized": true, - "kind": "Create", - "newBalance": 0, - "oldBalance": 0, - "reverted": false, - "storageAccesses": [], - "value": 0 - }, - { - "accessor": "0x7FA9385bE102ac3EAc297483Dd6233D62b3e1496", - "account": "0xd9Db270c1B5E3Bd161E8c8503c55cEABeE709552", - "chainInfo": { - "chainId": 31337, - "forkId": 0 - }, - "data": "0x", - "deployedCode": "0x", - "initialized": false, - "kind": "Resume", - "newBalance": 0, - "oldBalance": 0, - "reverted": false, - "storageAccesses": [], - "value": 0 - }, - { - "accessor": "0x1804c8AB1F12E6bbf3894d4083f33e07309d1f38", - "account": "0x90193C961A926261B756D1E5bb255e67ff9498A1", - "chainInfo": { - "chainId": 31337, - "forkId": 0 - }, - "data": "0x608060405234801561001057600080fd5b506001600455614201806100256000396000f3fe6080604052600436106101d15760003560e01c8063affed0e0116100f7578063e19a9dd911610095578063f08a032311610064578063f08a0323146105f5578063f698da2514610615578063f8dc5dd91461067c578063ffa1ad741461069c5761020d565b8063e19a9dd914610580578063e318b52b146105a0578063e75235b8146105c0578063e86637db146105d55761020d565b8063cc2f8452116100d1578063cc2f8452146104f2578063d4d9bdcd14610520578063d8d11f7814610540578063e009cfde146105605761020d565b8063affed0e01461049c578063b4faba09146104b2578063b63e800d146104d25761020d565b80635624b25b1161016f5780636a7612021161013e5780636a7612021461040f5780637d83297414610422578063934f3a111461045a578063a0e67e2b1461047a5761020d565b80635624b25b146103755780635ae6bd37146103a2578063610b5925146103cf578063694e80c3146103ef5761020d565b80632f54bf6e116101ab5780632f54bf6e146102ea5780633408e4701461030a578063468721a7146103275780635229073f146103475761020d565b80630d582f131461027357806312fb68e0146102955780632d9ad53d146102b55761020d565b3661020d5760405134815233907f3d0ce9bfc3ed7d6862dbb28b2dea94561fe714a1b4d019aa8af39730d1ad7c3d9060200160405180910390a2005b34801561021957600080fd5b507f6c9a6c4a39284e37ed1cf53d337577d14212a4870fb976a4366c693b939918d580548061024457005b36600080373360601b365260008060143601600080855af190503d6000803e8061026d573d6000fd5b503d6000f35b34801561027f57600080fd5b5061029361028e366004613568565b6106e5565b005b3480156102a157600080fd5b506102936102b036600461366e565b610933565b3480156102c157600080fd5b506102d56102d03660046136e3565b610ff7565b60405190151581526020015b60405180910390f35b3480156102f657600080fd5b506102d56103053660046136e3565b61104c565b34801561031657600080fd5b50465b6040519081526020016102e1565b34801561033357600080fd5b506102d561034236600461370f565b61109e565b34801561035357600080fd5b5061036761036236600461370f565b6111d4565b6040516102e19291906137e4565b34801561038157600080fd5b506103956103903660046137ff565b61120a565b6040516102e19190613821565b3480156103ae57600080fd5b506103196103bd366004613834565b60076020526000908152604090205481565b3480156103db57600080fd5b506102936103ea3660046136e3565b611290565b3480156103fb57600080fd5b5061029361040a366004613834565b611479565b6102d561041d366004613896565b611593565b34801561042e57600080fd5b5061031961043d366004613568565b600860209081526000928352604080842090915290825290205481565b34801561046657600080fd5b5061029361047536600461396f565b61198f565b34801561048657600080fd5b5061048f611a0b565b6040516102e19190613a2d565b3480156104a857600080fd5b5061031960055481565b3480156104be57600080fd5b506102936104cd366004613a40565b611b23565b3480156104de57600080fd5b506102936104ed366004613a90565b611b46565b3480156104fe57600080fd5b5061051261050d366004613568565b611c62565b6040516102e1929190613b85565b34801561052c57600080fd5b5061029361053b366004613834565b611ed0565b34801561054c57600080fd5b5061031961055b366004613bbd565b611fa4565b34801561056c57600080fd5b5061029361057b366004613c7e565b611fd1565b34801561058c57600080fd5b5061029361059b3660046136e3565b6121a3565b3480156105ac57600080fd5b506102936105bb366004613cb7565b612344565b3480156105cc57600080fd5b50600454610319565b3480156105e157600080fd5b506103956105f0366004613bbd565b6126bc565b34801561060157600080fd5b506102936106103660046136e3565b612855565b34801561062157600080fd5b5061031960007f47e79534a245952e8b16893a336b85a3d9ea9fa8c573f3d803afb92a794692184660408051602081019390935282015230606082015260800160405160208183030381529060405280519060200120905090565b34801561068857600080fd5b50610293610697366004613d02565b6128aa565b3480156106a857600080fd5b506103956040518060400160405280600581526020017f312e342e3000000000000000000000000000000000000000000000000000000081525081565b6106ed612b34565b73ffffffffffffffffffffffffffffffffffffffff821615801590610729575073ffffffffffffffffffffffffffffffffffffffff8216600114155b801561074b575073ffffffffffffffffffffffffffffffffffffffff82163014155b6107b6576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152600560248201527f475332303300000000000000000000000000000000000000000000000000000060448201526064015b60405180910390fd5b73ffffffffffffffffffffffffffffffffffffffff8281166000908152600260205260409020541615610845576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152600560248201527f475332303400000000000000000000000000000000000000000000000000000060448201526064016107ad565b60026020527fe90b7bceb6e7df5418fb78d8ee546e97c83a08bbccc01a0644d599ccd2a7c2e0805473ffffffffffffffffffffffffffffffffffffffff8481166000818152604081208054939094167fffffffffffffffffffffffff0000000000000000000000000000000000000000938416179093556001835283549091161790915560038054916108d783613d72565b909155505060405173ffffffffffffffffffffffffffffffffffffffff8316907f9465fa0c962cc76958e6373a993326400c1c94f8be2fe3a952adfa7f60b2ea2690600090a2806004541461092f5761092f81611479565b5050565b61093e816041612b9f565b825110156109a8576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152600560248201527f475330323000000000000000000000000000000000000000000000000000000060448201526064016107ad565b6000808060008060005b86811015610feb576041818102890160208101516040820151919092015160ff16955090935091506000849003610cf857885160208a01208a14610a52576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152600560248201527f475330323700000000000000000000000000000000000000000000000000000060448201526064016107ad565b9193508391610a62876041612b9f565b821015610acb576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152600560248201527f475330323100000000000000000000000000000000000000000000000000000060448201526064016107ad565b8751610ad8836020612bdb565b1115610b40576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152600560248201527f475330323200000000000000000000000000000000000000000000000000000060448201526064016107ad565b602082890181015189519091610b63908390610b5d908790612bdb565b90612bdb565b1115610bcb576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152600560248201527f475330323300000000000000000000000000000000000000000000000000000060448201526064016107ad565b6040517f20c13b0b000000000000000000000000000000000000000000000000000000008082528a85016020019173ffffffffffffffffffffffffffffffffffffffff8916906320c13b0b90610c27908f908690600401613daa565b602060405180830381865afa158015610c44573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610c689190613dcf565b7fffffffff000000000000000000000000000000000000000000000000000000001614610cf1576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152600560248201527f475330323400000000000000000000000000000000000000000000000000000060448201526064016107ad565b5050610eeb565b8360ff16600103610dc65791935083913373ffffffffffffffffffffffffffffffffffffffff84161480610d5b575073ffffffffffffffffffffffffffffffffffffffff851660009081526008602090815260408083208d845290915290205415155b610dc1576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152600560248201527f475330323500000000000000000000000000000000000000000000000000000060448201526064016107ad565b610eeb565b601e8460ff161115610e8b576040517f19457468657265756d205369676e6564204d6573736167653a0a3332000000006020820152603c81018b9052600190605c0160405160208183030381529060405280519060200120600486610e2b9190613e11565b6040805160008152602081018083529390935260ff90911690820152606081018590526080810184905260a0016020604051602081039080840390855afa158015610e7a573d6000803e3d6000fd5b505050602060405103519450610eeb565b6040805160008152602081018083528c905260ff861691810191909152606081018490526080810183905260019060a0016020604051602081039080840390855afa158015610ede573d6000803e3d6000fd5b5050506020604051035194505b8573ffffffffffffffffffffffffffffffffffffffff168573ffffffffffffffffffffffffffffffffffffffff16118015610f4c575073ffffffffffffffffffffffffffffffffffffffff8581166000908152600260205260409020541615155b8015610f6f575073ffffffffffffffffffffffffffffffffffffffff8516600114155b610fd5576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152600560248201527f475330323600000000000000000000000000000000000000000000000000000060448201526064016107ad565b8495508080610fe390613d72565b9150506109b2565b50505050505050505050565b6000600173ffffffffffffffffffffffffffffffffffffffff831614801590611046575073ffffffffffffffffffffffffffffffffffffffff8281166000908152600160205260409020541615155b92915050565b600073ffffffffffffffffffffffffffffffffffffffff821660011480159061104657505073ffffffffffffffffffffffffffffffffffffffff90811660009081526002602052604090205416151590565b6000336001148015906110d557503360009081526001602052604090205473ffffffffffffffffffffffffffffffffffffffff1615155b61113b576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152600560248201527f475331303400000000000000000000000000000000000000000000000000000060448201526064016107ad565b611168858585857fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff612bf7565b905080156111a05760405133907f6895c13664aa4f67288b25d7a21d7aaa34916e355fb9b6fae0a139a9085becb890600090a26111cc565b60405133907facd2c8702804128fdb0db2bb49f6d127dd0181c13fd45dbfe16de0930e2bd37590600090a25b949350505050565b600060606111e48686868661109e565b915060405160203d0181016040523d81523d6000602083013e8091505094509492505050565b60606000611219836020613e34565b67ffffffffffffffff81111561123157611231613594565b6040519080825280601f01601f19166020018201604052801561125b576020820181803683370190505b50905060005b8381101561128857848101546020808302840101528061128081613d72565b915050611261565b509392505050565b611298612b34565b73ffffffffffffffffffffffffffffffffffffffff8116158015906112d4575073ffffffffffffffffffffffffffffffffffffffff8116600114155b61133a576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152600560248201527f475331303100000000000000000000000000000000000000000000000000000060448201526064016107ad565b73ffffffffffffffffffffffffffffffffffffffff81811660009081526001602052604090205416156113c9576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152600560248201527f475331303200000000000000000000000000000000000000000000000000000060448201526064016107ad565b600160208190527fcc69885fda6bcc1a4ace058b4a62bf5e179ea78fd58a1ccd71c22cc9b688792f805473ffffffffffffffffffffffffffffffffffffffff848116600081815260408082208054949095167fffffffffffffffffffffffff000000000000000000000000000000000000000094851617909455948552835490911681179092555190917fecdf3a3effea5783a3c4c2140e677577666428d44ed9d474a0b3a4c9943f844091a250565b611481612b34565b6003548111156114ed576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152600560248201527f475332303100000000000000000000000000000000000000000000000000000060448201526064016107ad565b6001811015611558576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152600560248201527f475332303200000000000000000000000000000000000000000000000000000060448201526064016107ad565b60048190556040518181527f610f7ff2b304ae8903c3de74c60c6ab1f7d6226b3f52c5161905bb5ad4039c939060200160405180910390a150565b60008060006115ad8e8e8e8e8e8e8e8e8e8e6005546126bc565b6005805491925060006115bf83613d72565b90915550508051602082012091506115d882828661198f565b5060006116037f4a204f620c8c5ccdca3fd54d003badd85ba500436a431f0cbda4f558c93c34c85490565b905073ffffffffffffffffffffffffffffffffffffffff8116156116a3578073ffffffffffffffffffffffffffffffffffffffff166375f0bb528f8f8f8f8f8f8f8f8f8f8f336040518d63ffffffff1660e01b81526004016116709c9b9a99989796959493929190613edb565b600060405180830381600087803b15801561168a57600080fd5b505af115801561169e573d6000803e3d6000fd5b505050505b6116cf6116b28a6109c4613ff1565b603f6116bf8c6040613e34565b6116c99190614009565b90612c3e565b6116db906101f4613ff1565b5a1015611744576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152600560248201527f475330313000000000000000000000000000000000000000000000000000000060448201526064016107ad565b60005a90506117b58f8f8f8f8080601f016020809104026020016040519081016040528093929190818152602001838380828437600081840152601f19601f820116905080830192505050505050508e8c6000146117a2578e612bf7565b6109c45a6117b09190614044565b612bf7565b93506117c25a8290612c55565b905083806117cf57508915155b806117d957508715155b61183f576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152600560248201527f475330313300000000000000000000000000000000000000000000000000000060448201526064016107ad565b6000881561185757611854828b8b8b8b612c70565b90505b841561189c57837f442e715f626346e8c54381002da614f62bee8d27386535b2521ec8540898556e8260405161188f91815260200190565b60405180910390a26118d7565b837f23428b18acfb3ea64b08dc0c1d296ea9c09702c09083ca5272e64d115b687d23826040516118ce91815260200190565b60405180910390a25b505073ffffffffffffffffffffffffffffffffffffffff81161561197e576040517f9327136800000000000000000000000000000000000000000000000000000000815260048101839052831515602482015273ffffffffffffffffffffffffffffffffffffffff821690639327136890604401600060405180830381600087803b15801561196557600080fd5b505af1158015611979573d6000803e3d6000fd5b505050505b50509b9a5050505050505050505050565b600454806119f9576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152600560248201527f475330303100000000000000000000000000000000000000000000000000000060448201526064016107ad565b611a0584848484610933565b50505050565b6060600060035467ffffffffffffffff811115611a2a57611a2a613594565b604051908082528060200260200182016040528015611a53578160200160208202803683370190505b506001600090815260026020527fe90b7bceb6e7df5418fb78d8ee546e97c83a08bbccc01a0644d599ccd2a7c2e0549192509073ffffffffffffffffffffffffffffffffffffffff165b73ffffffffffffffffffffffffffffffffffffffff8116600114611b1b5780838381518110611ace57611ace61405b565b73ffffffffffffffffffffffffffffffffffffffff928316602091820292909201810191909152918116600090815260029092526040909120541681611b1381613d72565b925050611a9d565b509092915050565b600080825160208401855af480600052503d6020523d600060403e60403d016000fd5b611b848a8a808060200260200160405190810160405280939291908181526020018383602002808284376000920191909152508c9250612e01915050565b73ffffffffffffffffffffffffffffffffffffffff841615611ba957611ba9846131ce565b611be98787878080601f01602080910402602001604051908101604052809392919081815260200183838082843760009201919091525061327192505050565b8115611c0057611bfe82600060018685612c70565b505b3373ffffffffffffffffffffffffffffffffffffffff167f141df868a6331af528e38c83b7aa03edc19be66e37ae67f9285bf4f8e3c6a1a88b8b8b8b89604051611c4e95949392919061408a565b60405180910390a250505050505050505050565b6060600073ffffffffffffffffffffffffffffffffffffffff841660011480611c8f5750611c8f84610ff7565b611cf5576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152600560248201527f475331303500000000000000000000000000000000000000000000000000000060448201526064016107ad565b60008311611d5f576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152600560248201527f475331303600000000000000000000000000000000000000000000000000000060448201526064016107ad565b8267ffffffffffffffff811115611d7857611d78613594565b604051908082528060200260200182016040528015611da1578160200160208202803683370190505b5073ffffffffffffffffffffffffffffffffffffffff808616600090815260016020526040812054929450911691505b73ffffffffffffffffffffffffffffffffffffffff821615801590611e0d575073ffffffffffffffffffffffffffffffffffffffff8216600114155b8015611e1857508381105b15611e805781838281518110611e3057611e3061405b565b73ffffffffffffffffffffffffffffffffffffffff928316602091820292909201810191909152928116600090815260019093526040909220549091169080611e7881613d72565b915050611dd1565b73ffffffffffffffffffffffffffffffffffffffff8216600114611ec55782611eaa600183614044565b81518110611eba57611eba61405b565b602002602001015191505b808352509250929050565b3360009081526002602052604090205473ffffffffffffffffffffffffffffffffffffffff16611f5c576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152600560248201527f475330333000000000000000000000000000000000000000000000000000000060448201526064016107ad565b336000818152600860209081526040808320858452909152808220600190555183917ff2a0eb156472d1440255b0d7c1e19cc07115d1051fe605b0dce69acfec884d9c91a350565b6000611fb98c8c8c8c8c8c8c8c8c8c8c6126bc565b8051906020012090509b9a5050505050505050505050565b611fd9612b34565b73ffffffffffffffffffffffffffffffffffffffff811615801590612015575073ffffffffffffffffffffffffffffffffffffffff8116600114155b61207b576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152600560248201527f475331303100000000000000000000000000000000000000000000000000000060448201526064016107ad565b73ffffffffffffffffffffffffffffffffffffffff82811660009081526001602052604090205481169082161461210e576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152600560248201527f475331303300000000000000000000000000000000000000000000000000000060448201526064016107ad565b73ffffffffffffffffffffffffffffffffffffffff818116600081815260016020526040808220805487861684528284208054919096167fffffffffffffffffffffffff0000000000000000000000000000000000000000918216179095558383528054909416909355915190917faab4fa2b463f581b2b32cb3b7e3b704b9ce37cc209b5fb4d77e593ace405427691a25050565b6121ab612b34565b73ffffffffffffffffffffffffffffffffffffffff8116156122db576040517f01ffc9a70000000000000000000000000000000000000000000000000000000081527fe6d7a83a00000000000000000000000000000000000000000000000000000000600482015273ffffffffffffffffffffffffffffffffffffffff8216906301ffc9a790602401602060405180830381865afa158015612251573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906122759190614110565b6122db576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152600560248201527f475333303000000000000000000000000000000000000000000000000000000060448201526064016107ad565b7f4a204f620c8c5ccdca3fd54d003badd85ba500436a431f0cbda4f558c93c34c881815560405173ffffffffffffffffffffffffffffffffffffffff8316907f1151116914515bc0891ff9047a6cb32cf902546f83066499bcf8ba33d2353fa290600090a25050565b61234c612b34565b73ffffffffffffffffffffffffffffffffffffffff811615801590612388575073ffffffffffffffffffffffffffffffffffffffff8116600114155b80156123aa575073ffffffffffffffffffffffffffffffffffffffff81163014155b612410576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152600560248201527f475332303300000000000000000000000000000000000000000000000000000060448201526064016107ad565b73ffffffffffffffffffffffffffffffffffffffff818116600090815260026020526040902054161561249f576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152600560248201527f475332303400000000000000000000000000000000000000000000000000000060448201526064016107ad565b73ffffffffffffffffffffffffffffffffffffffff8216158015906124db575073ffffffffffffffffffffffffffffffffffffffff8216600114155b612541576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152600560248201527f475332303300000000000000000000000000000000000000000000000000000060448201526064016107ad565b73ffffffffffffffffffffffffffffffffffffffff8381166000908152600260205260409020548116908316146125d4576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152600560248201527f475332303500000000000000000000000000000000000000000000000000000060448201526064016107ad565b73ffffffffffffffffffffffffffffffffffffffff828116600081815260026020526040808220805486861680855283852080549288167fffffffffffffffffffffffff00000000000000000000000000000000000000009384161790559589168452828420805482169096179095558383528054909416909355915190917ff8d49fc529812e9a7c5c50e69c20f0dccc0db8fa95c98bc58cc9a4f1c1299eaf91a260405173ffffffffffffffffffffffffffffffffffffffff8216907f9465fa0c962cc76958e6373a993326400c1c94f8be2fe3a952adfa7f60b2ea2690600090a2505050565b606060007fbb8310d486368db6bd6f849402fdd73ad53d316b5a4b2644ad6efe0f941286d860001b8d8d8d8d6040516126f6929190614132565b60405190819003812061271c949392918e908e908e908e908e908e908e90602001614142565b604080517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0818403018152919052805160209091012090507f19000000000000000000000000000000000000000000000000000000000000007f01000000000000000000000000000000000000000000000000000000000000006127f060007f47e79534a245952e8b16893a336b85a3d9ea9fa8c573f3d803afb92a794692184660408051602081019390935282015230606082015260800160405160208183030381529060405280519060200120905090565b6040517fff0000000000000000000000000000000000000000000000000000000000000093841660208201529290911660218301526022820152604281018290526062016040516020818303038152906040529150509b9a5050505050505050505050565b61285d612b34565b612866816131ce565b60405173ffffffffffffffffffffffffffffffffffffffff8216907f5ac6c46c93c8d0e53714ba3b53db3e7c046da994313d7ed0d192028bc7c228b090600090a250565b6128b2612b34565b8060016003546128c29190614044565b101561292a576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152600560248201527f475332303100000000000000000000000000000000000000000000000000000060448201526064016107ad565b73ffffffffffffffffffffffffffffffffffffffff821615801590612966575073ffffffffffffffffffffffffffffffffffffffff8216600114155b6129cc576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152600560248201527f475332303300000000000000000000000000000000000000000000000000000060448201526064016107ad565b73ffffffffffffffffffffffffffffffffffffffff838116600090815260026020526040902054811690831614612a5f576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152600560248201527f475332303500000000000000000000000000000000000000000000000000000060448201526064016107ad565b73ffffffffffffffffffffffffffffffffffffffff828116600081815260026020526040808220805488861684529183208054929095167fffffffffffffffffffffffff00000000000000000000000000000000000000009283161790945591815282549091169091556003805491612ad7836141bf565b909155505060405173ffffffffffffffffffffffffffffffffffffffff8316907ff8d49fc529812e9a7c5c50e69c20f0dccc0db8fa95c98bc58cc9a4f1c1299eaf90600090a28060045414612b2f57612b2f81611479565b505050565b333014612b9d576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152600560248201527f475330333100000000000000000000000000000000000000000000000000000060448201526064016107ad565b565b600082600003612bb157506000611046565b6000612bbd8385613e34565b905082612bca8583614009565b14612bd457600080fd5b9392505050565b600080612be88385613ff1565b905083811015612bd457600080fd5b60006001836001811115612c0d57612c0d613e71565b03612c25576000808551602087018986f49050612c35565b600080855160208701888a87f190505b95945050505050565b600081831015612c4e5781612bd4565b5090919050565b600082821115612c6457600080fd5b60006111cc8385614044565b60008073ffffffffffffffffffffffffffffffffffffffff831615612c955782612c97565b325b905073ffffffffffffffffffffffffffffffffffffffff8416612d7657612cd63a8610612cc4573a612cc6565b855b612cd08989612bdb565b90612b9f565b60405190925073ffffffffffffffffffffffffffffffffffffffff82169083156108fc029084906000818181858888f19350505050612d71576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152600560248201527f475330313100000000000000000000000000000000000000000000000000000060448201526064016107ad565b612df7565b612d8485612cd08989612bdb565b9150612d91848284613469565b612df7576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152600560248201527f475330313200000000000000000000000000000000000000000000000000000060448201526064016107ad565b5095945050505050565b60045415612e6b576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152600560248201527f475332303000000000000000000000000000000000000000000000000000000060448201526064016107ad565b8151811115612ed6576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152600560248201527f475332303100000000000000000000000000000000000000000000000000000060448201526064016107ad565b6001811015612f41576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152600560248201527f475332303200000000000000000000000000000000000000000000000000000060448201526064016107ad565b600160005b8351811015613176576000848281518110612f6357612f6361405b565b60200260200101519050600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff1614158015612fc1575073ffffffffffffffffffffffffffffffffffffffff8116600114155b8015612fe3575073ffffffffffffffffffffffffffffffffffffffff81163014155b801561301b57508073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff1614155b613081576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152600560248201527f475332303300000000000000000000000000000000000000000000000000000060448201526064016107ad565b73ffffffffffffffffffffffffffffffffffffffff8181166000908152600260205260409020541615613110576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152600560248201527f475332303400000000000000000000000000000000000000000000000000000060448201526064016107ad565b73ffffffffffffffffffffffffffffffffffffffff928316600090815260026020526040902080547fffffffffffffffffffffffff000000000000000000000000000000000000000016938216939093179092558061316e81613d72565b915050612f46565b5073ffffffffffffffffffffffffffffffffffffffff16600090815260026020526040902080547fffffffffffffffffffffffff00000000000000000000000000000000000000001660011790559051600355600455565b3073ffffffffffffffffffffffffffffffffffffffff82160361324d576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152600560248201527f475334303000000000000000000000000000000000000000000000000000000060448201526064016107ad565b7f6c9a6c4a39284e37ed1cf53d337577d14212a4870fb976a4366c693b939918d555565b600160008190526020527fcc69885fda6bcc1a4ace058b4a62bf5e179ea78fd58a1ccd71c22cc9b688792f5473ffffffffffffffffffffffffffffffffffffffff161561331a576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152600560248201527f475331303000000000000000000000000000000000000000000000000000000060448201526064016107ad565b6001600081905260208190527fcc69885fda6bcc1a4ace058b4a62bf5e179ea78fd58a1ccd71c22cc9b688792f80547fffffffffffffffffffffffff000000000000000000000000000000000000000016909117905573ffffffffffffffffffffffffffffffffffffffff82161561092f57813b6133f4576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152600560248201527f475330303200000000000000000000000000000000000000000000000000000060448201526064016107ad565b6134038260008360015a612bf7565b61092f576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152600560248201527f475330303000000000000000000000000000000000000000000000000000000060448201526064016107ad565b6040805173ffffffffffffffffffffffffffffffffffffffff841660248201526044808201849052825180830390910181526064909101909152602080820180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff167fa9059cbb000000000000000000000000000000000000000000000000000000001781528251600093929184919082896127105a03f13d8015613516576020811461351e5760009350613529565b819350613529565b600051158215171593505b5050509392505050565b73ffffffffffffffffffffffffffffffffffffffff8116811461355557600080fd5b50565b803561356381613533565b919050565b6000806040838503121561357b57600080fd5b823561358681613533565b946020939093013593505050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b600082601f8301126135d457600080fd5b813567ffffffffffffffff808211156135ef576135ef613594565b604051601f83017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0908116603f0116810190828211818310171561363557613635613594565b8160405283815286602085880101111561364e57600080fd5b836020870160208301376000602085830101528094505050505092915050565b6000806000806080858703121561368457600080fd5b84359350602085013567ffffffffffffffff808211156136a357600080fd5b6136af888389016135c3565b945060408701359150808211156136c557600080fd5b506136d2878288016135c3565b949793965093946060013593505050565b6000602082840312156136f557600080fd5b8135612bd481613533565b80356002811061356357600080fd5b6000806000806080858703121561372557600080fd5b843561373081613533565b935060208501359250604085013567ffffffffffffffff81111561375357600080fd5b61375f878288016135c3565b92505061376e60608601613700565b905092959194509250565b6000815180845260005b8181101561379f57602081850181015186830182015201613783565b818111156137b1576000602083870101525b50601f017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0169290920160200192915050565b82151581526040602082015260006111cc6040830184613779565b6000806040838503121561381257600080fd5b50508035926020909101359150565b602081526000612bd46020830184613779565b60006020828403121561384657600080fd5b5035919050565b60008083601f84011261385f57600080fd5b50813567ffffffffffffffff81111561387757600080fd5b60208301915083602082850101111561388f57600080fd5b9250929050565b60008060008060008060008060008060006101408c8e0312156138b857600080fd5b6138c18c613558565b9a5060208c0135995067ffffffffffffffff8060408e013511156138e457600080fd5b6138f48e60408f01358f0161384d565b909a50985061390560608e01613700565b975060808d0135965060a08d0135955060c08d0135945061392860e08e01613558565b93506139376101008e01613558565b9250806101208e0135111561394b57600080fd5b5061395d8d6101208e01358e016135c3565b90509295989b509295989b9093969950565b60008060006060848603121561398457600080fd5b83359250602084013567ffffffffffffffff808211156139a357600080fd5b6139af878388016135c3565b935060408601359150808211156139c557600080fd5b506139d2868287016135c3565b9150509250925092565b600081518084526020808501945080840160005b83811015613a2257815173ffffffffffffffffffffffffffffffffffffffff16875295820195908201906001016139f0565b509495945050505050565b602081526000612bd460208301846139dc565b60008060408385031215613a5357600080fd5b8235613a5e81613533565b9150602083013567ffffffffffffffff811115613a7a57600080fd5b613a86858286016135c3565b9150509250929050565b6000806000806000806000806000806101008b8d031215613ab057600080fd5b8a3567ffffffffffffffff80821115613ac857600080fd5b818d0191508d601f830112613adc57600080fd5b813581811115613aeb57600080fd5b8e60208260051b8501011115613b0057600080fd5b60208381019d50909b508d01359950613b1b60408e01613558565b985060608d0135915080821115613b3157600080fd5b50613b3e8d828e0161384d565b9097509550613b51905060808c01613558565b9350613b5f60a08c01613558565b925060c08b01359150613b7460e08c01613558565b90509295989b9194979a5092959850565b604081526000613b9860408301856139dc565b905073ffffffffffffffffffffffffffffffffffffffff831660208301529392505050565b60008060008060008060008060008060006101408c8e031215613bdf57600080fd5b8b35613bea81613533565b9a5060208c0135995060408c013567ffffffffffffffff811115613c0d57600080fd5b613c198e828f0161384d565b909a509850613c2c905060608d01613700565b965060808c0135955060a08c0135945060c08c0135935060e08c0135613c5181613533565b92506101008c0135613c6281613533565b809250506101208c013590509295989b509295989b9093969950565b60008060408385031215613c9157600080fd5b8235613c9c81613533565b91506020830135613cac81613533565b809150509250929050565b600080600060608486031215613ccc57600080fd5b8335613cd781613533565b92506020840135613ce781613533565b91506040840135613cf781613533565b809150509250925092565b600080600060608486031215613d1757600080fd5b8335613d2281613533565b92506020840135613d3281613533565b929592945050506040919091013590565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b60007fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff8203613da357613da3613d43565b5060010190565b604081526000613dbd6040830185613779565b8281036020840152612c358185613779565b600060208284031215613de157600080fd5b81517fffffffff0000000000000000000000000000000000000000000000000000000081168114612bd457600080fd5b600060ff821660ff841680821015613e2b57613e2b613d43565b90039392505050565b6000817fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0483118215151615613e6c57613e6c613d43565b500290565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602160045260246000fd5b60028110613ed7577f4e487b7100000000000000000000000000000000000000000000000000000000600052602160045260246000fd5b9052565b600061016073ffffffffffffffffffffffffffffffffffffffff8f1683528d60208401528060408401528b81840152506101808b8d828501376000818d850101527fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0601f8d01168301613f51606085018d613ea0565b8a60808501528960a08501528860c0850152613f8560e085018973ffffffffffffffffffffffffffffffffffffffff169052565b73ffffffffffffffffffffffffffffffffffffffff87166101008501528184820301610120850152613fb982820187613779565b92505050613fe061014083018473ffffffffffffffffffffffffffffffffffffffff169052565b9d9c50505050505050505050505050565b6000821982111561400457614004613d43565b500190565b60008261403f577f4e487b7100000000000000000000000000000000000000000000000000000000600052601260045260246000fd5b500490565b60008282101561405657614056613d43565b500390565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b6080808252810185905260008660a08301825b888110156140da5782356140b081613533565b73ffffffffffffffffffffffffffffffffffffffff1682526020928301929091019060010161409d565b506020840196909652505073ffffffffffffffffffffffffffffffffffffffff9283166040820152911660609091015292915050565b60006020828403121561412257600080fd5b81518015158114612bd457600080fd5b8183823760009101908152919050565b6000610160820190508c825273ffffffffffffffffffffffffffffffffffffffff808d1660208401528b60408401528a6060840152614184608084018b613ea0565b60a083019890985260c082019690965260e0810194909452918516610100840152909316610120820152610140019190915295945050505050565b6000816141ce576141ce613d43565b507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff019056fea164736f6c634300080f000a", - "deployedCode": "0x6080604052600436106101d15760003560e01c8063affed0e0116100f7578063e19a9dd911610095578063f08a032311610064578063f08a0323146105f5578063f698da2514610615578063f8dc5dd91461067c578063ffa1ad741461069c5761020d565b8063e19a9dd914610580578063e318b52b146105a0578063e75235b8146105c0578063e86637db146105d55761020d565b8063cc2f8452116100d1578063cc2f8452146104f2578063d4d9bdcd14610520578063d8d11f7814610540578063e009cfde146105605761020d565b8063affed0e01461049c578063b4faba09146104b2578063b63e800d146104d25761020d565b80635624b25b1161016f5780636a7612021161013e5780636a7612021461040f5780637d83297414610422578063934f3a111461045a578063a0e67e2b1461047a5761020d565b80635624b25b146103755780635ae6bd37146103a2578063610b5925146103cf578063694e80c3146103ef5761020d565b80632f54bf6e116101ab5780632f54bf6e146102ea5780633408e4701461030a578063468721a7146103275780635229073f146103475761020d565b80630d582f131461027357806312fb68e0146102955780632d9ad53d146102b55761020d565b3661020d5760405134815233907f3d0ce9bfc3ed7d6862dbb28b2dea94561fe714a1b4d019aa8af39730d1ad7c3d9060200160405180910390a2005b34801561021957600080fd5b507f6c9a6c4a39284e37ed1cf53d337577d14212a4870fb976a4366c693b939918d580548061024457005b36600080373360601b365260008060143601600080855af190503d6000803e8061026d573d6000fd5b503d6000f35b34801561027f57600080fd5b5061029361028e366004613568565b6106e5565b005b3480156102a157600080fd5b506102936102b036600461366e565b610933565b3480156102c157600080fd5b506102d56102d03660046136e3565b610ff7565b60405190151581526020015b60405180910390f35b3480156102f657600080fd5b506102d56103053660046136e3565b61104c565b34801561031657600080fd5b50465b6040519081526020016102e1565b34801561033357600080fd5b506102d561034236600461370f565b61109e565b34801561035357600080fd5b5061036761036236600461370f565b6111d4565b6040516102e19291906137e4565b34801561038157600080fd5b506103956103903660046137ff565b61120a565b6040516102e19190613821565b3480156103ae57600080fd5b506103196103bd366004613834565b60076020526000908152604090205481565b3480156103db57600080fd5b506102936103ea3660046136e3565b611290565b3480156103fb57600080fd5b5061029361040a366004613834565b611479565b6102d561041d366004613896565b611593565b34801561042e57600080fd5b5061031961043d366004613568565b600860209081526000928352604080842090915290825290205481565b34801561046657600080fd5b5061029361047536600461396f565b61198f565b34801561048657600080fd5b5061048f611a0b565b6040516102e19190613a2d565b3480156104a857600080fd5b5061031960055481565b3480156104be57600080fd5b506102936104cd366004613a40565b611b23565b3480156104de57600080fd5b506102936104ed366004613a90565b611b46565b3480156104fe57600080fd5b5061051261050d366004613568565b611c62565b6040516102e1929190613b85565b34801561052c57600080fd5b5061029361053b366004613834565b611ed0565b34801561054c57600080fd5b5061031961055b366004613bbd565b611fa4565b34801561056c57600080fd5b5061029361057b366004613c7e565b611fd1565b34801561058c57600080fd5b5061029361059b3660046136e3565b6121a3565b3480156105ac57600080fd5b506102936105bb366004613cb7565b612344565b3480156105cc57600080fd5b50600454610319565b3480156105e157600080fd5b506103956105f0366004613bbd565b6126bc565b34801561060157600080fd5b506102936106103660046136e3565b612855565b34801561062157600080fd5b5061031960007f47e79534a245952e8b16893a336b85a3d9ea9fa8c573f3d803afb92a794692184660408051602081019390935282015230606082015260800160405160208183030381529060405280519060200120905090565b34801561068857600080fd5b50610293610697366004613d02565b6128aa565b3480156106a857600080fd5b506103956040518060400160405280600581526020017f312e342e3000000000000000000000000000000000000000000000000000000081525081565b6106ed612b34565b73ffffffffffffffffffffffffffffffffffffffff821615801590610729575073ffffffffffffffffffffffffffffffffffffffff8216600114155b801561074b575073ffffffffffffffffffffffffffffffffffffffff82163014155b6107b6576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152600560248201527f475332303300000000000000000000000000000000000000000000000000000060448201526064015b60405180910390fd5b73ffffffffffffffffffffffffffffffffffffffff8281166000908152600260205260409020541615610845576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152600560248201527f475332303400000000000000000000000000000000000000000000000000000060448201526064016107ad565b60026020527fe90b7bceb6e7df5418fb78d8ee546e97c83a08bbccc01a0644d599ccd2a7c2e0805473ffffffffffffffffffffffffffffffffffffffff8481166000818152604081208054939094167fffffffffffffffffffffffff0000000000000000000000000000000000000000938416179093556001835283549091161790915560038054916108d783613d72565b909155505060405173ffffffffffffffffffffffffffffffffffffffff8316907f9465fa0c962cc76958e6373a993326400c1c94f8be2fe3a952adfa7f60b2ea2690600090a2806004541461092f5761092f81611479565b5050565b61093e816041612b9f565b825110156109a8576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152600560248201527f475330323000000000000000000000000000000000000000000000000000000060448201526064016107ad565b6000808060008060005b86811015610feb576041818102890160208101516040820151919092015160ff16955090935091506000849003610cf857885160208a01208a14610a52576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152600560248201527f475330323700000000000000000000000000000000000000000000000000000060448201526064016107ad565b9193508391610a62876041612b9f565b821015610acb576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152600560248201527f475330323100000000000000000000000000000000000000000000000000000060448201526064016107ad565b8751610ad8836020612bdb565b1115610b40576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152600560248201527f475330323200000000000000000000000000000000000000000000000000000060448201526064016107ad565b602082890181015189519091610b63908390610b5d908790612bdb565b90612bdb565b1115610bcb576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152600560248201527f475330323300000000000000000000000000000000000000000000000000000060448201526064016107ad565b6040517f20c13b0b000000000000000000000000000000000000000000000000000000008082528a85016020019173ffffffffffffffffffffffffffffffffffffffff8916906320c13b0b90610c27908f908690600401613daa565b602060405180830381865afa158015610c44573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610c689190613dcf565b7fffffffff000000000000000000000000000000000000000000000000000000001614610cf1576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152600560248201527f475330323400000000000000000000000000000000000000000000000000000060448201526064016107ad565b5050610eeb565b8360ff16600103610dc65791935083913373ffffffffffffffffffffffffffffffffffffffff84161480610d5b575073ffffffffffffffffffffffffffffffffffffffff851660009081526008602090815260408083208d845290915290205415155b610dc1576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152600560248201527f475330323500000000000000000000000000000000000000000000000000000060448201526064016107ad565b610eeb565b601e8460ff161115610e8b576040517f19457468657265756d205369676e6564204d6573736167653a0a3332000000006020820152603c81018b9052600190605c0160405160208183030381529060405280519060200120600486610e2b9190613e11565b6040805160008152602081018083529390935260ff90911690820152606081018590526080810184905260a0016020604051602081039080840390855afa158015610e7a573d6000803e3d6000fd5b505050602060405103519450610eeb565b6040805160008152602081018083528c905260ff861691810191909152606081018490526080810183905260019060a0016020604051602081039080840390855afa158015610ede573d6000803e3d6000fd5b5050506020604051035194505b8573ffffffffffffffffffffffffffffffffffffffff168573ffffffffffffffffffffffffffffffffffffffff16118015610f4c575073ffffffffffffffffffffffffffffffffffffffff8581166000908152600260205260409020541615155b8015610f6f575073ffffffffffffffffffffffffffffffffffffffff8516600114155b610fd5576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152600560248201527f475330323600000000000000000000000000000000000000000000000000000060448201526064016107ad565b8495508080610fe390613d72565b9150506109b2565b50505050505050505050565b6000600173ffffffffffffffffffffffffffffffffffffffff831614801590611046575073ffffffffffffffffffffffffffffffffffffffff8281166000908152600160205260409020541615155b92915050565b600073ffffffffffffffffffffffffffffffffffffffff821660011480159061104657505073ffffffffffffffffffffffffffffffffffffffff90811660009081526002602052604090205416151590565b6000336001148015906110d557503360009081526001602052604090205473ffffffffffffffffffffffffffffffffffffffff1615155b61113b576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152600560248201527f475331303400000000000000000000000000000000000000000000000000000060448201526064016107ad565b611168858585857fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff612bf7565b905080156111a05760405133907f6895c13664aa4f67288b25d7a21d7aaa34916e355fb9b6fae0a139a9085becb890600090a26111cc565b60405133907facd2c8702804128fdb0db2bb49f6d127dd0181c13fd45dbfe16de0930e2bd37590600090a25b949350505050565b600060606111e48686868661109e565b915060405160203d0181016040523d81523d6000602083013e8091505094509492505050565b60606000611219836020613e34565b67ffffffffffffffff81111561123157611231613594565b6040519080825280601f01601f19166020018201604052801561125b576020820181803683370190505b50905060005b8381101561128857848101546020808302840101528061128081613d72565b915050611261565b509392505050565b611298612b34565b73ffffffffffffffffffffffffffffffffffffffff8116158015906112d4575073ffffffffffffffffffffffffffffffffffffffff8116600114155b61133a576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152600560248201527f475331303100000000000000000000000000000000000000000000000000000060448201526064016107ad565b73ffffffffffffffffffffffffffffffffffffffff81811660009081526001602052604090205416156113c9576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152600560248201527f475331303200000000000000000000000000000000000000000000000000000060448201526064016107ad565b600160208190527fcc69885fda6bcc1a4ace058b4a62bf5e179ea78fd58a1ccd71c22cc9b688792f805473ffffffffffffffffffffffffffffffffffffffff848116600081815260408082208054949095167fffffffffffffffffffffffff000000000000000000000000000000000000000094851617909455948552835490911681179092555190917fecdf3a3effea5783a3c4c2140e677577666428d44ed9d474a0b3a4c9943f844091a250565b611481612b34565b6003548111156114ed576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152600560248201527f475332303100000000000000000000000000000000000000000000000000000060448201526064016107ad565b6001811015611558576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152600560248201527f475332303200000000000000000000000000000000000000000000000000000060448201526064016107ad565b60048190556040518181527f610f7ff2b304ae8903c3de74c60c6ab1f7d6226b3f52c5161905bb5ad4039c939060200160405180910390a150565b60008060006115ad8e8e8e8e8e8e8e8e8e8e6005546126bc565b6005805491925060006115bf83613d72565b90915550508051602082012091506115d882828661198f565b5060006116037f4a204f620c8c5ccdca3fd54d003badd85ba500436a431f0cbda4f558c93c34c85490565b905073ffffffffffffffffffffffffffffffffffffffff8116156116a3578073ffffffffffffffffffffffffffffffffffffffff166375f0bb528f8f8f8f8f8f8f8f8f8f8f336040518d63ffffffff1660e01b81526004016116709c9b9a99989796959493929190613edb565b600060405180830381600087803b15801561168a57600080fd5b505af115801561169e573d6000803e3d6000fd5b505050505b6116cf6116b28a6109c4613ff1565b603f6116bf8c6040613e34565b6116c99190614009565b90612c3e565b6116db906101f4613ff1565b5a1015611744576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152600560248201527f475330313000000000000000000000000000000000000000000000000000000060448201526064016107ad565b60005a90506117b58f8f8f8f8080601f016020809104026020016040519081016040528093929190818152602001838380828437600081840152601f19601f820116905080830192505050505050508e8c6000146117a2578e612bf7565b6109c45a6117b09190614044565b612bf7565b93506117c25a8290612c55565b905083806117cf57508915155b806117d957508715155b61183f576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152600560248201527f475330313300000000000000000000000000000000000000000000000000000060448201526064016107ad565b6000881561185757611854828b8b8b8b612c70565b90505b841561189c57837f442e715f626346e8c54381002da614f62bee8d27386535b2521ec8540898556e8260405161188f91815260200190565b60405180910390a26118d7565b837f23428b18acfb3ea64b08dc0c1d296ea9c09702c09083ca5272e64d115b687d23826040516118ce91815260200190565b60405180910390a25b505073ffffffffffffffffffffffffffffffffffffffff81161561197e576040517f9327136800000000000000000000000000000000000000000000000000000000815260048101839052831515602482015273ffffffffffffffffffffffffffffffffffffffff821690639327136890604401600060405180830381600087803b15801561196557600080fd5b505af1158015611979573d6000803e3d6000fd5b505050505b50509b9a5050505050505050505050565b600454806119f9576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152600560248201527f475330303100000000000000000000000000000000000000000000000000000060448201526064016107ad565b611a0584848484610933565b50505050565b6060600060035467ffffffffffffffff811115611a2a57611a2a613594565b604051908082528060200260200182016040528015611a53578160200160208202803683370190505b506001600090815260026020527fe90b7bceb6e7df5418fb78d8ee546e97c83a08bbccc01a0644d599ccd2a7c2e0549192509073ffffffffffffffffffffffffffffffffffffffff165b73ffffffffffffffffffffffffffffffffffffffff8116600114611b1b5780838381518110611ace57611ace61405b565b73ffffffffffffffffffffffffffffffffffffffff928316602091820292909201810191909152918116600090815260029092526040909120541681611b1381613d72565b925050611a9d565b509092915050565b600080825160208401855af480600052503d6020523d600060403e60403d016000fd5b611b848a8a808060200260200160405190810160405280939291908181526020018383602002808284376000920191909152508c9250612e01915050565b73ffffffffffffffffffffffffffffffffffffffff841615611ba957611ba9846131ce565b611be98787878080601f01602080910402602001604051908101604052809392919081815260200183838082843760009201919091525061327192505050565b8115611c0057611bfe82600060018685612c70565b505b3373ffffffffffffffffffffffffffffffffffffffff167f141df868a6331af528e38c83b7aa03edc19be66e37ae67f9285bf4f8e3c6a1a88b8b8b8b89604051611c4e95949392919061408a565b60405180910390a250505050505050505050565b6060600073ffffffffffffffffffffffffffffffffffffffff841660011480611c8f5750611c8f84610ff7565b611cf5576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152600560248201527f475331303500000000000000000000000000000000000000000000000000000060448201526064016107ad565b60008311611d5f576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152600560248201527f475331303600000000000000000000000000000000000000000000000000000060448201526064016107ad565b8267ffffffffffffffff811115611d7857611d78613594565b604051908082528060200260200182016040528015611da1578160200160208202803683370190505b5073ffffffffffffffffffffffffffffffffffffffff808616600090815260016020526040812054929450911691505b73ffffffffffffffffffffffffffffffffffffffff821615801590611e0d575073ffffffffffffffffffffffffffffffffffffffff8216600114155b8015611e1857508381105b15611e805781838281518110611e3057611e3061405b565b73ffffffffffffffffffffffffffffffffffffffff928316602091820292909201810191909152928116600090815260019093526040909220549091169080611e7881613d72565b915050611dd1565b73ffffffffffffffffffffffffffffffffffffffff8216600114611ec55782611eaa600183614044565b81518110611eba57611eba61405b565b602002602001015191505b808352509250929050565b3360009081526002602052604090205473ffffffffffffffffffffffffffffffffffffffff16611f5c576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152600560248201527f475330333000000000000000000000000000000000000000000000000000000060448201526064016107ad565b336000818152600860209081526040808320858452909152808220600190555183917ff2a0eb156472d1440255b0d7c1e19cc07115d1051fe605b0dce69acfec884d9c91a350565b6000611fb98c8c8c8c8c8c8c8c8c8c8c6126bc565b8051906020012090509b9a5050505050505050505050565b611fd9612b34565b73ffffffffffffffffffffffffffffffffffffffff811615801590612015575073ffffffffffffffffffffffffffffffffffffffff8116600114155b61207b576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152600560248201527f475331303100000000000000000000000000000000000000000000000000000060448201526064016107ad565b73ffffffffffffffffffffffffffffffffffffffff82811660009081526001602052604090205481169082161461210e576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152600560248201527f475331303300000000000000000000000000000000000000000000000000000060448201526064016107ad565b73ffffffffffffffffffffffffffffffffffffffff818116600081815260016020526040808220805487861684528284208054919096167fffffffffffffffffffffffff0000000000000000000000000000000000000000918216179095558383528054909416909355915190917faab4fa2b463f581b2b32cb3b7e3b704b9ce37cc209b5fb4d77e593ace405427691a25050565b6121ab612b34565b73ffffffffffffffffffffffffffffffffffffffff8116156122db576040517f01ffc9a70000000000000000000000000000000000000000000000000000000081527fe6d7a83a00000000000000000000000000000000000000000000000000000000600482015273ffffffffffffffffffffffffffffffffffffffff8216906301ffc9a790602401602060405180830381865afa158015612251573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906122759190614110565b6122db576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152600560248201527f475333303000000000000000000000000000000000000000000000000000000060448201526064016107ad565b7f4a204f620c8c5ccdca3fd54d003badd85ba500436a431f0cbda4f558c93c34c881815560405173ffffffffffffffffffffffffffffffffffffffff8316907f1151116914515bc0891ff9047a6cb32cf902546f83066499bcf8ba33d2353fa290600090a25050565b61234c612b34565b73ffffffffffffffffffffffffffffffffffffffff811615801590612388575073ffffffffffffffffffffffffffffffffffffffff8116600114155b80156123aa575073ffffffffffffffffffffffffffffffffffffffff81163014155b612410576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152600560248201527f475332303300000000000000000000000000000000000000000000000000000060448201526064016107ad565b73ffffffffffffffffffffffffffffffffffffffff818116600090815260026020526040902054161561249f576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152600560248201527f475332303400000000000000000000000000000000000000000000000000000060448201526064016107ad565b73ffffffffffffffffffffffffffffffffffffffff8216158015906124db575073ffffffffffffffffffffffffffffffffffffffff8216600114155b612541576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152600560248201527f475332303300000000000000000000000000000000000000000000000000000060448201526064016107ad565b73ffffffffffffffffffffffffffffffffffffffff8381166000908152600260205260409020548116908316146125d4576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152600560248201527f475332303500000000000000000000000000000000000000000000000000000060448201526064016107ad565b73ffffffffffffffffffffffffffffffffffffffff828116600081815260026020526040808220805486861680855283852080549288167fffffffffffffffffffffffff00000000000000000000000000000000000000009384161790559589168452828420805482169096179095558383528054909416909355915190917ff8d49fc529812e9a7c5c50e69c20f0dccc0db8fa95c98bc58cc9a4f1c1299eaf91a260405173ffffffffffffffffffffffffffffffffffffffff8216907f9465fa0c962cc76958e6373a993326400c1c94f8be2fe3a952adfa7f60b2ea2690600090a2505050565b606060007fbb8310d486368db6bd6f849402fdd73ad53d316b5a4b2644ad6efe0f941286d860001b8d8d8d8d6040516126f6929190614132565b60405190819003812061271c949392918e908e908e908e908e908e908e90602001614142565b604080517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0818403018152919052805160209091012090507f19000000000000000000000000000000000000000000000000000000000000007f01000000000000000000000000000000000000000000000000000000000000006127f060007f47e79534a245952e8b16893a336b85a3d9ea9fa8c573f3d803afb92a794692184660408051602081019390935282015230606082015260800160405160208183030381529060405280519060200120905090565b6040517fff0000000000000000000000000000000000000000000000000000000000000093841660208201529290911660218301526022820152604281018290526062016040516020818303038152906040529150509b9a5050505050505050505050565b61285d612b34565b612866816131ce565b60405173ffffffffffffffffffffffffffffffffffffffff8216907f5ac6c46c93c8d0e53714ba3b53db3e7c046da994313d7ed0d192028bc7c228b090600090a250565b6128b2612b34565b8060016003546128c29190614044565b101561292a576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152600560248201527f475332303100000000000000000000000000000000000000000000000000000060448201526064016107ad565b73ffffffffffffffffffffffffffffffffffffffff821615801590612966575073ffffffffffffffffffffffffffffffffffffffff8216600114155b6129cc576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152600560248201527f475332303300000000000000000000000000000000000000000000000000000060448201526064016107ad565b73ffffffffffffffffffffffffffffffffffffffff838116600090815260026020526040902054811690831614612a5f576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152600560248201527f475332303500000000000000000000000000000000000000000000000000000060448201526064016107ad565b73ffffffffffffffffffffffffffffffffffffffff828116600081815260026020526040808220805488861684529183208054929095167fffffffffffffffffffffffff00000000000000000000000000000000000000009283161790945591815282549091169091556003805491612ad7836141bf565b909155505060405173ffffffffffffffffffffffffffffffffffffffff8316907ff8d49fc529812e9a7c5c50e69c20f0dccc0db8fa95c98bc58cc9a4f1c1299eaf90600090a28060045414612b2f57612b2f81611479565b505050565b333014612b9d576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152600560248201527f475330333100000000000000000000000000000000000000000000000000000060448201526064016107ad565b565b600082600003612bb157506000611046565b6000612bbd8385613e34565b905082612bca8583614009565b14612bd457600080fd5b9392505050565b600080612be88385613ff1565b905083811015612bd457600080fd5b60006001836001811115612c0d57612c0d613e71565b03612c25576000808551602087018986f49050612c35565b600080855160208701888a87f190505b95945050505050565b600081831015612c4e5781612bd4565b5090919050565b600082821115612c6457600080fd5b60006111cc8385614044565b60008073ffffffffffffffffffffffffffffffffffffffff831615612c955782612c97565b325b905073ffffffffffffffffffffffffffffffffffffffff8416612d7657612cd63a8610612cc4573a612cc6565b855b612cd08989612bdb565b90612b9f565b60405190925073ffffffffffffffffffffffffffffffffffffffff82169083156108fc029084906000818181858888f19350505050612d71576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152600560248201527f475330313100000000000000000000000000000000000000000000000000000060448201526064016107ad565b612df7565b612d8485612cd08989612bdb565b9150612d91848284613469565b612df7576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152600560248201527f475330313200000000000000000000000000000000000000000000000000000060448201526064016107ad565b5095945050505050565b60045415612e6b576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152600560248201527f475332303000000000000000000000000000000000000000000000000000000060448201526064016107ad565b8151811115612ed6576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152600560248201527f475332303100000000000000000000000000000000000000000000000000000060448201526064016107ad565b6001811015612f41576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152600560248201527f475332303200000000000000000000000000000000000000000000000000000060448201526064016107ad565b600160005b8351811015613176576000848281518110612f6357612f6361405b565b60200260200101519050600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff1614158015612fc1575073ffffffffffffffffffffffffffffffffffffffff8116600114155b8015612fe3575073ffffffffffffffffffffffffffffffffffffffff81163014155b801561301b57508073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff1614155b613081576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152600560248201527f475332303300000000000000000000000000000000000000000000000000000060448201526064016107ad565b73ffffffffffffffffffffffffffffffffffffffff8181166000908152600260205260409020541615613110576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152600560248201527f475332303400000000000000000000000000000000000000000000000000000060448201526064016107ad565b73ffffffffffffffffffffffffffffffffffffffff928316600090815260026020526040902080547fffffffffffffffffffffffff000000000000000000000000000000000000000016938216939093179092558061316e81613d72565b915050612f46565b5073ffffffffffffffffffffffffffffffffffffffff16600090815260026020526040902080547fffffffffffffffffffffffff00000000000000000000000000000000000000001660011790559051600355600455565b3073ffffffffffffffffffffffffffffffffffffffff82160361324d576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152600560248201527f475334303000000000000000000000000000000000000000000000000000000060448201526064016107ad565b7f6c9a6c4a39284e37ed1cf53d337577d14212a4870fb976a4366c693b939918d555565b600160008190526020527fcc69885fda6bcc1a4ace058b4a62bf5e179ea78fd58a1ccd71c22cc9b688792f5473ffffffffffffffffffffffffffffffffffffffff161561331a576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152600560248201527f475331303000000000000000000000000000000000000000000000000000000060448201526064016107ad565b6001600081905260208190527fcc69885fda6bcc1a4ace058b4a62bf5e179ea78fd58a1ccd71c22cc9b688792f80547fffffffffffffffffffffffff000000000000000000000000000000000000000016909117905573ffffffffffffffffffffffffffffffffffffffff82161561092f57813b6133f4576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152600560248201527f475330303200000000000000000000000000000000000000000000000000000060448201526064016107ad565b6134038260008360015a612bf7565b61092f576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152600560248201527f475330303000000000000000000000000000000000000000000000000000000060448201526064016107ad565b6040805173ffffffffffffffffffffffffffffffffffffffff841660248201526044808201849052825180830390910181526064909101909152602080820180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff167fa9059cbb000000000000000000000000000000000000000000000000000000001781528251600093929184919082896127105a03f13d8015613516576020811461351e5760009350613529565b819350613529565b600051158215171593505b5050509392505050565b73ffffffffffffffffffffffffffffffffffffffff8116811461355557600080fd5b50565b803561356381613533565b919050565b6000806040838503121561357b57600080fd5b823561358681613533565b946020939093013593505050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b600082601f8301126135d457600080fd5b813567ffffffffffffffff808211156135ef576135ef613594565b604051601f83017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0908116603f0116810190828211818310171561363557613635613594565b8160405283815286602085880101111561364e57600080fd5b836020870160208301376000602085830101528094505050505092915050565b6000806000806080858703121561368457600080fd5b84359350602085013567ffffffffffffffff808211156136a357600080fd5b6136af888389016135c3565b945060408701359150808211156136c557600080fd5b506136d2878288016135c3565b949793965093946060013593505050565b6000602082840312156136f557600080fd5b8135612bd481613533565b80356002811061356357600080fd5b6000806000806080858703121561372557600080fd5b843561373081613533565b935060208501359250604085013567ffffffffffffffff81111561375357600080fd5b61375f878288016135c3565b92505061376e60608601613700565b905092959194509250565b6000815180845260005b8181101561379f57602081850181015186830182015201613783565b818111156137b1576000602083870101525b50601f017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0169290920160200192915050565b82151581526040602082015260006111cc6040830184613779565b6000806040838503121561381257600080fd5b50508035926020909101359150565b602081526000612bd46020830184613779565b60006020828403121561384657600080fd5b5035919050565b60008083601f84011261385f57600080fd5b50813567ffffffffffffffff81111561387757600080fd5b60208301915083602082850101111561388f57600080fd5b9250929050565b60008060008060008060008060008060006101408c8e0312156138b857600080fd5b6138c18c613558565b9a5060208c0135995067ffffffffffffffff8060408e013511156138e457600080fd5b6138f48e60408f01358f0161384d565b909a50985061390560608e01613700565b975060808d0135965060a08d0135955060c08d0135945061392860e08e01613558565b93506139376101008e01613558565b9250806101208e0135111561394b57600080fd5b5061395d8d6101208e01358e016135c3565b90509295989b509295989b9093969950565b60008060006060848603121561398457600080fd5b83359250602084013567ffffffffffffffff808211156139a357600080fd5b6139af878388016135c3565b935060408601359150808211156139c557600080fd5b506139d2868287016135c3565b9150509250925092565b600081518084526020808501945080840160005b83811015613a2257815173ffffffffffffffffffffffffffffffffffffffff16875295820195908201906001016139f0565b509495945050505050565b602081526000612bd460208301846139dc565b60008060408385031215613a5357600080fd5b8235613a5e81613533565b9150602083013567ffffffffffffffff811115613a7a57600080fd5b613a86858286016135c3565b9150509250929050565b6000806000806000806000806000806101008b8d031215613ab057600080fd5b8a3567ffffffffffffffff80821115613ac857600080fd5b818d0191508d601f830112613adc57600080fd5b813581811115613aeb57600080fd5b8e60208260051b8501011115613b0057600080fd5b60208381019d50909b508d01359950613b1b60408e01613558565b985060608d0135915080821115613b3157600080fd5b50613b3e8d828e0161384d565b9097509550613b51905060808c01613558565b9350613b5f60a08c01613558565b925060c08b01359150613b7460e08c01613558565b90509295989b9194979a5092959850565b604081526000613b9860408301856139dc565b905073ffffffffffffffffffffffffffffffffffffffff831660208301529392505050565b60008060008060008060008060008060006101408c8e031215613bdf57600080fd5b8b35613bea81613533565b9a5060208c0135995060408c013567ffffffffffffffff811115613c0d57600080fd5b613c198e828f0161384d565b909a509850613c2c905060608d01613700565b965060808c0135955060a08c0135945060c08c0135935060e08c0135613c5181613533565b92506101008c0135613c6281613533565b809250506101208c013590509295989b509295989b9093969950565b60008060408385031215613c9157600080fd5b8235613c9c81613533565b91506020830135613cac81613533565b809150509250929050565b600080600060608486031215613ccc57600080fd5b8335613cd781613533565b92506020840135613ce781613533565b91506040840135613cf781613533565b809150509250925092565b600080600060608486031215613d1757600080fd5b8335613d2281613533565b92506020840135613d3281613533565b929592945050506040919091013590565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b60007fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff8203613da357613da3613d43565b5060010190565b604081526000613dbd6040830185613779565b8281036020840152612c358185613779565b600060208284031215613de157600080fd5b81517fffffffff0000000000000000000000000000000000000000000000000000000081168114612bd457600080fd5b600060ff821660ff841680821015613e2b57613e2b613d43565b90039392505050565b6000817fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0483118215151615613e6c57613e6c613d43565b500290565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602160045260246000fd5b60028110613ed7577f4e487b7100000000000000000000000000000000000000000000000000000000600052602160045260246000fd5b9052565b600061016073ffffffffffffffffffffffffffffffffffffffff8f1683528d60208401528060408401528b81840152506101808b8d828501376000818d850101527fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0601f8d01168301613f51606085018d613ea0565b8a60808501528960a08501528860c0850152613f8560e085018973ffffffffffffffffffffffffffffffffffffffff169052565b73ffffffffffffffffffffffffffffffffffffffff87166101008501528184820301610120850152613fb982820187613779565b92505050613fe061014083018473ffffffffffffffffffffffffffffffffffffffff169052565b9d9c50505050505050505050505050565b6000821982111561400457614004613d43565b500190565b60008261403f577f4e487b7100000000000000000000000000000000000000000000000000000000600052601260045260246000fd5b500490565b60008282101561405657614056613d43565b500390565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b6080808252810185905260008660a08301825b888110156140da5782356140b081613533565b73ffffffffffffffffffffffffffffffffffffffff1682526020928301929091019060010161409d565b506020840196909652505073ffffffffffffffffffffffffffffffffffffffff9283166040820152911660609091015292915050565b60006020828403121561412257600080fd5b81518015158114612bd457600080fd5b8183823760009101908152919050565b6000610160820190508c825273ffffffffffffffffffffffffffffffffffffffff808d1660208401528b60408401528a6060840152614184608084018b613ea0565b60a083019890985260c082019690965260e0810194909452918516610100840152909316610120820152610140019190915295945050505050565b6000816141ce576141ce613d43565b507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff019056fea164736f6c634300080f000a", - "initialized": true, - "kind": "Create", - "newBalance": 0, - "oldBalance": 0, - "reverted": false, - "storageAccesses": [ - { - "account": "0x90193C961A926261B756D1E5bb255e67ff9498A1", - "isWrite": true, - "newValue": "0x0000000000000000000000000000000000000000000000000000000000000001", - "previousValue": "0x0000000000000000000000000000000000000000000000000000000000000000", - "reverted": false, - "slot": "0x0000000000000000000000000000000000000000000000000000000000000004" - } - ], - "value": 0 - }, - { - "accessor": "0x7FA9385bE102ac3EAc297483Dd6233D62b3e1496", - "account": "0x7109709ECfa91a80626fF3989D68f67F5b1DD12D", - "chainInfo": { - "chainId": 31337, - "forkId": 0 - }, - "data": "0x", - "deployedCode": "0x", - "initialized": true, - "kind": "Resume", - "newBalance": 0, - "oldBalance": 0, - "reverted": false, - "storageAccesses": [], - "value": 0 - }, - { - "accessor": "0x7FA9385bE102ac3EAc297483Dd6233D62b3e1496", - "account": "0x7109709ECfa91a80626fF3989D68f67F5b1DD12D", - "chainInfo": { - "chainId": 31337, - "forkId": 0 - }, - "data": "0x", - "deployedCode": "0x", - "initialized": true, - "kind": "Resume", - "newBalance": 0, - "oldBalance": 0, - "reverted": false, - "storageAccesses": [], - "value": 0 - }, - { - "accessor": "0x1804c8AB1F12E6bbf3894d4083f33e07309d1f38", - "account": "0x34A1D3fff3958843C43aD80F30b94c510645C316", - "chainInfo": { - "chainId": 31337, - "forkId": 0 - }, - "data": "0x1688f0b900000000000000000000000090193c961a926261b756d1e5bb255e67ff9498a100000000000000000000000000000000000000000000000000000000000000607f1c05487074ec69e9df71933c23a7dde272d692d6610a01ffa18261163204e20000000000000000000000000000000000000000000000000000000000000164b63e800d0000000000000000000000000000000000000000000000000000000000000100000000000000000000000000000000000000000000000000000000000000000100000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000140000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000010000000000000000000000001804c8ab1f12e6bbf3894d4083f33e07309d1f38000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000", - "deployedCode": "0x", - "initialized": true, - "kind": "Call", - "newBalance": 0, - "oldBalance": 0, - "reverted": false, - "storageAccesses": [], - "value": 0 - }, - { - "accessor": "0x34A1D3fff3958843C43aD80F30b94c510645C316", - "account": "0x90193C961A926261B756D1E5bb255e67ff9498A1", - "chainInfo": { - "chainId": 31337, - "forkId": 0 - }, - "data": "0x", - "deployedCode": "0x", - "initialized": true, - "kind": "Resume", - "newBalance": 0, - "oldBalance": 0, - "reverted": false, - "storageAccesses": [], - "value": 0 - }, - { - "accessor": "0x34A1D3fff3958843C43aD80F30b94c510645C316", - "account": "0x7d039be7F9b5190147621b02e82B250e1D748e02", - "chainInfo": { - "chainId": 31337, - "forkId": 0 - }, - "data": "0x608060405234801561001057600080fd5b5060405161016f38038061016f83398101604081905261002f916100b9565b6001600160a01b0381166100945760405162461bcd60e51b815260206004820152602260248201527f496e76616c69642073696e676c65746f6e20616464726573732070726f766964604482015261195960f21b606482015260840160405180910390fd5b600080546001600160a01b0319166001600160a01b03929092169190911790556100e9565b6000602082840312156100cb57600080fd5b81516001600160a01b03811681146100e257600080fd5b9392505050565b6078806100f76000396000f3fe6080604052600073ffffffffffffffffffffffffffffffffffffffff8154167fa619486e00000000000000000000000000000000000000000000000000000000823503604d57808252602082f35b3682833781823684845af490503d82833e806066573d82fd5b503d81f3fea164736f6c634300080f000a00000000000000000000000090193c961a926261b756d1e5bb255e67ff9498a1", - "deployedCode": "0x6080604052600073ffffffffffffffffffffffffffffffffffffffff8154167fa619486e00000000000000000000000000000000000000000000000000000000823503604d57808252602082f35b3682833781823684845af490503d82833e806066573d82fd5b503d81f3fea164736f6c634300080f000a", - "initialized": true, - "kind": "Create", - "newBalance": 0, - "oldBalance": 0, - "reverted": false, - "storageAccesses": [ - { - "account": "0x7d039be7F9b5190147621b02e82B250e1D748e02", - "isWrite": false, - "newValue": "0x0000000000000000000000000000000000000000000000000000000000000000", - "previousValue": "0x0000000000000000000000000000000000000000000000000000000000000000", - "reverted": false, - "slot": "0x0000000000000000000000000000000000000000000000000000000000000000" - }, - { - "account": "0x7d039be7F9b5190147621b02e82B250e1D748e02", - "isWrite": true, - "newValue": "0x00000000000000000000000090193c961a926261b756d1e5bb255e67ff9498a1", - "previousValue": "0x0000000000000000000000000000000000000000000000000000000000000000", - "reverted": false, - "slot": "0x0000000000000000000000000000000000000000000000000000000000000000" - } - ], - "value": 0 - }, - { - "accessor": "0x34A1D3fff3958843C43aD80F30b94c510645C316", - "account": "0x7d039be7F9b5190147621b02e82B250e1D748e02", - "chainInfo": { - "chainId": 31337, - "forkId": 0 - }, - "data": "0xb63e800d0000000000000000000000000000000000000000000000000000000000000100000000000000000000000000000000000000000000000000000000000000000100000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000140000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000010000000000000000000000001804c8ab1f12e6bbf3894d4083f33e07309d1f380000000000000000000000000000000000000000000000000000000000000000", - "deployedCode": "0x", - "initialized": true, - "kind": "Call", - "newBalance": 0, - "oldBalance": 0, - "reverted": false, - "storageAccesses": [ - { - "account": "0x7d039be7F9b5190147621b02e82B250e1D748e02", - "isWrite": false, - "newValue": "0x00000000000000000000000090193c961a926261b756d1e5bb255e67ff9498a1", - "previousValue": "0x00000000000000000000000090193c961a926261b756d1e5bb255e67ff9498a1", - "reverted": false, - "slot": "0x0000000000000000000000000000000000000000000000000000000000000000" - } - ], - "value": 0 - }, - { - "accessor": "0x34A1D3fff3958843C43aD80F30b94c510645C316", - "account": "0x90193C961A926261B756D1E5bb255e67ff9498A1", - "chainInfo": { - "chainId": 31337, - "forkId": 0 - }, - "data": "0xb63e800d0000000000000000000000000000000000000000000000000000000000000100000000000000000000000000000000000000000000000000000000000000000100000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000140000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000010000000000000000000000001804c8ab1f12e6bbf3894d4083f33e07309d1f380000000000000000000000000000000000000000000000000000000000000000", - "deployedCode": "0x", - "initialized": true, - "kind": "DelegateCall", - "newBalance": 0, - "oldBalance": 0, - "reverted": false, - "storageAccesses": [ - { - "account": "0x7d039be7F9b5190147621b02e82B250e1D748e02", - "isWrite": false, - "newValue": "0x0000000000000000000000000000000000000000000000000000000000000000", - "previousValue": "0x0000000000000000000000000000000000000000000000000000000000000000", - "reverted": false, - "slot": "0x0000000000000000000000000000000000000000000000000000000000000004" - }, - { - "account": "0x7d039be7F9b5190147621b02e82B250e1D748e02", - "isWrite": false, - "newValue": "0x0000000000000000000000000000000000000000000000000000000000000000", - "previousValue": "0x0000000000000000000000000000000000000000000000000000000000000000", - "reverted": false, - "slot": "0xd1b0d319c6526317dce66989b393dcfb4435c9a65e399a088b63bbf65d7aee32" - }, - { - "account": "0x7d039be7F9b5190147621b02e82B250e1D748e02", - "isWrite": false, - "newValue": "0x0000000000000000000000000000000000000000000000000000000000000000", - "previousValue": "0x0000000000000000000000000000000000000000000000000000000000000000", - "reverted": false, - "slot": "0xe90b7bceb6e7df5418fb78d8ee546e97c83a08bbccc01a0644d599ccd2a7c2e0" - }, - { - "account": "0x7d039be7F9b5190147621b02e82B250e1D748e02", - "isWrite": true, - "newValue": "0x0000000000000000000000001804c8ab1f12e6bbf3894d4083f33e07309d1f38", - "previousValue": "0x0000000000000000000000000000000000000000000000000000000000000000", - "reverted": false, - "slot": "0xe90b7bceb6e7df5418fb78d8ee546e97c83a08bbccc01a0644d599ccd2a7c2e0" - }, - { - "account": "0x7d039be7F9b5190147621b02e82B250e1D748e02", - "isWrite": false, - "newValue": "0x0000000000000000000000000000000000000000000000000000000000000000", - "previousValue": "0x0000000000000000000000000000000000000000000000000000000000000000", - "reverted": false, - "slot": "0xd1b0d319c6526317dce66989b393dcfb4435c9a65e399a088b63bbf65d7aee32" - }, - { - "account": "0x7d039be7F9b5190147621b02e82B250e1D748e02", - "isWrite": true, - "newValue": "0x0000000000000000000000000000000000000000000000000000000000000001", - "previousValue": "0x0000000000000000000000000000000000000000000000000000000000000000", - "reverted": false, - "slot": "0xd1b0d319c6526317dce66989b393dcfb4435c9a65e399a088b63bbf65d7aee32" - }, - { - "account": "0x7d039be7F9b5190147621b02e82B250e1D748e02", - "isWrite": true, - "newValue": "0x0000000000000000000000000000000000000000000000000000000000000001", - "previousValue": "0x0000000000000000000000000000000000000000000000000000000000000000", - "reverted": false, - "slot": "0x0000000000000000000000000000000000000000000000000000000000000003" - }, - { - "account": "0x7d039be7F9b5190147621b02e82B250e1D748e02", - "isWrite": true, - "newValue": "0x0000000000000000000000000000000000000000000000000000000000000001", - "previousValue": "0x0000000000000000000000000000000000000000000000000000000000000000", - "reverted": false, - "slot": "0x0000000000000000000000000000000000000000000000000000000000000004" - }, - { - "account": "0x7d039be7F9b5190147621b02e82B250e1D748e02", - "isWrite": false, - "newValue": "0x0000000000000000000000000000000000000000000000000000000000000000", - "previousValue": "0x0000000000000000000000000000000000000000000000000000000000000000", - "reverted": false, - "slot": "0xcc69885fda6bcc1a4ace058b4a62bf5e179ea78fd58a1ccd71c22cc9b688792f" - }, - { - "account": "0x7d039be7F9b5190147621b02e82B250e1D748e02", - "isWrite": false, - "newValue": "0x0000000000000000000000000000000000000000000000000000000000000000", - "previousValue": "0x0000000000000000000000000000000000000000000000000000000000000000", - "reverted": false, - "slot": "0xcc69885fda6bcc1a4ace058b4a62bf5e179ea78fd58a1ccd71c22cc9b688792f" - }, - { - "account": "0x7d039be7F9b5190147621b02e82B250e1D748e02", - "isWrite": true, - "newValue": "0x0000000000000000000000000000000000000000000000000000000000000001", - "previousValue": "0x0000000000000000000000000000000000000000000000000000000000000000", - "reverted": false, - "slot": "0xcc69885fda6bcc1a4ace058b4a62bf5e179ea78fd58a1ccd71c22cc9b688792f" - } - ], - "value": 0 - }, - { - "accessor": "0x7FA9385bE102ac3EAc297483Dd6233D62b3e1496", - "account": "0x7109709ECfa91a80626fF3989D68f67F5b1DD12D", - "chainInfo": { - "chainId": 31337, - "forkId": 0 - }, - "data": "0x", - "deployedCode": "0x", - "initialized": true, - "kind": "Resume", - "newBalance": 0, - "oldBalance": 0, - "reverted": false, - "storageAccesses": [], - "value": 0 - }, - { - "accessor": "0x7FA9385bE102ac3EAc297483Dd6233D62b3e1496", - "account": "0x7109709ECfa91a80626fF3989D68f67F5b1DD12D", - "chainInfo": { - "chainId": 31337, - "forkId": 0 - }, - "data": "0x", - "deployedCode": "0x", - "initialized": true, - "kind": "Resume", - "newBalance": 0, - "oldBalance": 0, - "reverted": false, - "storageAccesses": [], - "value": 0 - }, - { - "accessor": "0x7FA9385bE102ac3EAc297483Dd6233D62b3e1496", - "account": "0x7109709ECfa91a80626fF3989D68f67F5b1DD12D", - "chainInfo": { - "chainId": 31337, - "forkId": 0 - }, - "data": "0x", - "deployedCode": "0x", - "initialized": true, - "kind": "Resume", - "newBalance": 0, - "oldBalance": 0, - "reverted": false, - "storageAccesses": [], - "value": 0 - }, - { - "accessor": "0x1804c8AB1F12E6bbf3894d4083f33e07309d1f38", - "account": "0xBb2180ebd78ce97360503434eD37fcf4a1Df61c3", - "chainInfo": { - "chainId": 31337, - "forkId": 0 - }, - "data": "0x608060405234801561001057600080fd5b5061001a3361001f565b61006f565b600080546001600160a01b038381166001600160a01b0319831681178455604051919092169283917f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e09190a35050565b6105ef8061007e6000396000f3fe608060405234801561001057600080fd5b50600436106100675760003560e01c80639b2ea4bd116100505780639b2ea4bd146100b9578063bf40fac1146100cc578063f2fde38b146100df57600080fd5b8063715018a61461006c5780638da5cb5b14610076575b600080fd5b6100746100f2565b005b60005473ffffffffffffffffffffffffffffffffffffffff165b60405173ffffffffffffffffffffffffffffffffffffffff909116815260200160405180910390f35b6100746100c73660046104fa565b610106565b6100906100da366004610548565b6101d9565b6100746100ed366004610585565b610215565b6100fa6102d1565b6101046000610352565b565b61010e6102d1565b6000610119836103c7565b60008181526001602052604090819020805473ffffffffffffffffffffffffffffffffffffffff8681167fffffffffffffffffffffffff00000000000000000000000000000000000000008316179092559151929350169061017c9085906105a7565b6040805191829003822073ffffffffffffffffffffffffffffffffffffffff808716845284166020840152917f9416a153a346f93d95f94b064ae3f148b6460473c6e82b3f9fc2521b873fcd6c910160405180910390a250505050565b6000600160006101e8846103c7565b815260208101919091526040016000205473ffffffffffffffffffffffffffffffffffffffff1692915050565b61021d6102d1565b73ffffffffffffffffffffffffffffffffffffffff81166102c5576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602660248201527f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160448201527f646472657373000000000000000000000000000000000000000000000000000060648201526084015b60405180910390fd5b6102ce81610352565b50565b60005473ffffffffffffffffffffffffffffffffffffffff163314610104576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e657260448201526064016102bc565b6000805473ffffffffffffffffffffffffffffffffffffffff8381167fffffffffffffffffffffffff0000000000000000000000000000000000000000831681178455604051919092169283917f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e09190a35050565b6000816040516020016103da91906105a7565b604051602081830303815290604052805190602001209050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b600082601f83011261043757600080fd5b813567ffffffffffffffff80821115610452576104526103f7565b604051601f83017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0908116603f01168101908282118183101715610498576104986103f7565b816040528381528660208588010111156104b157600080fd5b836020870160208301376000602085830101528094505050505092915050565b803573ffffffffffffffffffffffffffffffffffffffff811681146104f557600080fd5b919050565b6000806040838503121561050d57600080fd5b823567ffffffffffffffff81111561052457600080fd5b61053085828601610426565b92505061053f602084016104d1565b90509250929050565b60006020828403121561055a57600080fd5b813567ffffffffffffffff81111561057157600080fd5b61057d84828501610426565b949350505050565b60006020828403121561059757600080fd5b6105a0826104d1565b9392505050565b6000825160005b818110156105c857602081860181015185830152016105ae565b818111156105d7576000828501525b50919091019291505056fea164736f6c634300080f000a", - "deployedCode": "0x608060405234801561001057600080fd5b50600436106100675760003560e01c80639b2ea4bd116100505780639b2ea4bd146100b9578063bf40fac1146100cc578063f2fde38b146100df57600080fd5b8063715018a61461006c5780638da5cb5b14610076575b600080fd5b6100746100f2565b005b60005473ffffffffffffffffffffffffffffffffffffffff165b60405173ffffffffffffffffffffffffffffffffffffffff909116815260200160405180910390f35b6100746100c73660046104fa565b610106565b6100906100da366004610548565b6101d9565b6100746100ed366004610585565b610215565b6100fa6102d1565b6101046000610352565b565b61010e6102d1565b6000610119836103c7565b60008181526001602052604090819020805473ffffffffffffffffffffffffffffffffffffffff8681167fffffffffffffffffffffffff00000000000000000000000000000000000000008316179092559151929350169061017c9085906105a7565b6040805191829003822073ffffffffffffffffffffffffffffffffffffffff808716845284166020840152917f9416a153a346f93d95f94b064ae3f148b6460473c6e82b3f9fc2521b873fcd6c910160405180910390a250505050565b6000600160006101e8846103c7565b815260208101919091526040016000205473ffffffffffffffffffffffffffffffffffffffff1692915050565b61021d6102d1565b73ffffffffffffffffffffffffffffffffffffffff81166102c5576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602660248201527f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160448201527f646472657373000000000000000000000000000000000000000000000000000060648201526084015b60405180910390fd5b6102ce81610352565b50565b60005473ffffffffffffffffffffffffffffffffffffffff163314610104576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e657260448201526064016102bc565b6000805473ffffffffffffffffffffffffffffffffffffffff8381167fffffffffffffffffffffffff0000000000000000000000000000000000000000831681178455604051919092169283917f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e09190a35050565b6000816040516020016103da91906105a7565b604051602081830303815290604052805190602001209050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b600082601f83011261043757600080fd5b813567ffffffffffffffff80821115610452576104526103f7565b604051601f83017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0908116603f01168101908282118183101715610498576104986103f7565b816040528381528660208588010111156104b157600080fd5b836020870160208301376000602085830101528094505050505092915050565b803573ffffffffffffffffffffffffffffffffffffffff811681146104f557600080fd5b919050565b6000806040838503121561050d57600080fd5b823567ffffffffffffffff81111561052457600080fd5b61053085828601610426565b92505061053f602084016104d1565b90509250929050565b60006020828403121561055a57600080fd5b813567ffffffffffffffff81111561057157600080fd5b61057d84828501610426565b949350505050565b60006020828403121561059757600080fd5b6105a0826104d1565b9392505050565b6000825160005b818110156105c857602081860181015185830152016105ae565b818111156105d7576000828501525b50919091019291505056fea164736f6c634300080f000a", - "initialized": true, - "kind": "Create", - "newBalance": 0, - "oldBalance": 0, - "reverted": false, - "storageAccesses": [ - { - "account": "0xBb2180ebd78ce97360503434eD37fcf4a1Df61c3", - "isWrite": false, - "newValue": "0x0000000000000000000000000000000000000000000000000000000000000000", - "previousValue": "0x0000000000000000000000000000000000000000000000000000000000000000", - "reverted": false, - "slot": "0x0000000000000000000000000000000000000000000000000000000000000000" - }, - { - "account": "0xBb2180ebd78ce97360503434eD37fcf4a1Df61c3", - "isWrite": true, - "newValue": "0x0000000000000000000000001804c8ab1f12e6bbf3894d4083f33e07309d1f38", - "previousValue": "0x0000000000000000000000000000000000000000000000000000000000000000", - "reverted": false, - "slot": "0x0000000000000000000000000000000000000000000000000000000000000000" - } - ], - "value": 0 - }, - { - "accessor": "0x1804c8AB1F12E6bbf3894d4083f33e07309d1f38", - "account": "0xBb2180ebd78ce97360503434eD37fcf4a1Df61c3", - "chainInfo": { - "chainId": 31337, - "forkId": 0 - }, - "data": "0x8da5cb5b", - "deployedCode": "0x", - "initialized": true, - "kind": "StaticCall", - "newBalance": 0, - "oldBalance": 0, - "reverted": false, - "storageAccesses": [ - { - "account": "0xBb2180ebd78ce97360503434eD37fcf4a1Df61c3", - "isWrite": false, - "newValue": "0x0000000000000000000000001804c8ab1f12e6bbf3894d4083f33e07309d1f38", - "previousValue": "0x0000000000000000000000001804c8ab1f12e6bbf3894d4083f33e07309d1f38", - "reverted": false, - "slot": "0x0000000000000000000000000000000000000000000000000000000000000000" - } - ], - "value": 0 - }, - { - "accessor": "0x7FA9385bE102ac3EAc297483Dd6233D62b3e1496", - "account": "0x7109709ECfa91a80626fF3989D68f67F5b1DD12D", - "chainInfo": { - "chainId": 31337, - "forkId": 0 - }, - "data": "0x", - "deployedCode": "0x", - "initialized": true, - "kind": "Resume", - "newBalance": 0, - "oldBalance": 0, - "reverted": false, - "storageAccesses": [], - "value": 0 - }, - { - "accessor": "0x7FA9385bE102ac3EAc297483Dd6233D62b3e1496", - "account": "0x7109709ECfa91a80626fF3989D68f67F5b1DD12D", - "chainInfo": { - "chainId": 31337, - "forkId": 0 - }, - "data": "0x", - "deployedCode": "0x", - "initialized": true, - "kind": "Resume", - "newBalance": 0, - "oldBalance": 0, - "reverted": false, - "storageAccesses": [], - "value": 0 - }, - { - "accessor": "0x7FA9385bE102ac3EAc297483Dd6233D62b3e1496", - "account": "0x7109709ECfa91a80626fF3989D68f67F5b1DD12D", - "chainInfo": { - "chainId": 31337, - "forkId": 0 - }, - "data": "0x", - "deployedCode": "0x", - "initialized": true, - "kind": "Resume", - "newBalance": 0, - "oldBalance": 0, - "reverted": false, - "storageAccesses": [], - "value": 0 - }, - { - "accessor": "0x1804c8AB1F12E6bbf3894d4083f33e07309d1f38", - "account": "0xDB8cFf278adCCF9E9b5da745B44E754fC4EE3C76", - "chainInfo": { - "chainId": 31337, - "forkId": 0 - }, - "data": "0x60806040523480156200001157600080fd5b5060405162001a5f38038062001a5f8339810160408190526200003491620000a1565b6200003f3362000051565b6200004a8162000051565b50620000d3565b600080546001600160a01b038381166001600160a01b0319831681178455604051919092169283917f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e09190a35050565b600060208284031215620000b457600080fd5b81516001600160a01b0381168114620000cc57600080fd5b9392505050565b61197c80620000e36000396000f3fe60806040526004361061010e5760003560e01c8063860f7cda116100a557806399a88ec411610074578063b794726211610059578063b794726214610329578063f2fde38b14610364578063f3b7dead1461038457600080fd5b806399a88ec4146102e95780639b2ea4bd1461030957600080fd5b8063860f7cda1461026b5780638d52d4a01461028b5780638da5cb5b146102ab5780639623609d146102d657600080fd5b80633ab76e9f116100e15780633ab76e9f146101cc5780636bd9f516146101f9578063715018a6146102365780637eff275e1461024b57600080fd5b80630652b57a1461011357806307c8f7b014610135578063204e1c7a14610155578063238181ae1461019f575b600080fd5b34801561011f57600080fd5b5061013361012e3660046111f9565b6103a4565b005b34801561014157600080fd5b50610133610150366004611216565b6103f3565b34801561016157600080fd5b506101756101703660046111f9565b610445565b60405173ffffffffffffffffffffffffffffffffffffffff90911681526020015b60405180910390f35b3480156101ab57600080fd5b506101bf6101ba3660046111f9565b61066b565b60405161019691906112ae565b3480156101d857600080fd5b506003546101759073ffffffffffffffffffffffffffffffffffffffff1681565b34801561020557600080fd5b506102296102143660046111f9565b60016020526000908152604090205460ff1681565b60405161019691906112f0565b34801561024257600080fd5b50610133610705565b34801561025757600080fd5b50610133610266366004611331565b610719565b34801561027757600080fd5b5061013361028636600461148c565b6108cc565b34801561029757600080fd5b506101336102a63660046114dc565b610903565b3480156102b757600080fd5b5060005473ffffffffffffffffffffffffffffffffffffffff16610175565b6101336102e436600461150e565b610977565b3480156102f557600080fd5b50610133610304366004611331565b610b8e565b34801561031557600080fd5b50610133610324366004611584565b610e1e565b34801561033557600080fd5b5060035474010000000000000000000000000000000000000000900460ff166040519015158152602001610196565b34801561037057600080fd5b5061013361037f3660046111f9565b610eb4565b34801561039057600080fd5b5061017561039f3660046111f9565b610f6b565b6103ac6110e1565b600380547fffffffffffffffffffffffff00000000000000000000000000000000000000001673ffffffffffffffffffffffffffffffffffffffff92909216919091179055565b6103fb6110e1565b6003805491151574010000000000000000000000000000000000000000027fffffffffffffffffffffff00ffffffffffffffffffffffffffffffffffffffff909216919091179055565b73ffffffffffffffffffffffffffffffffffffffff811660009081526001602052604081205460ff1681816002811115610481576104816112c1565b036104fc578273ffffffffffffffffffffffffffffffffffffffff16635c60da1b6040518163ffffffff1660e01b8152600401602060405180830381865afa1580156104d1573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906104f591906115cb565b9392505050565b6001816002811115610510576105106112c1565b03610560578273ffffffffffffffffffffffffffffffffffffffff1663aaf10f426040518163ffffffff1660e01b8152600401602060405180830381865afa1580156104d1573d6000803e3d6000fd5b6002816002811115610574576105746112c1565b036105fe5760035473ffffffffffffffffffffffffffffffffffffffff8481166000908152600260205260409081902090517fbf40fac1000000000000000000000000000000000000000000000000000000008152919092169163bf40fac1916105e19190600401611635565b602060405180830381865afa1580156104d1573d6000803e3d6000fd5b6040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601e60248201527f50726f787941646d696e3a20756e6b6e6f776e2070726f78792074797065000060448201526064015b60405180910390fd5b50919050565b60026020526000908152604090208054610684906115e8565b80601f01602080910402602001604051908101604052809291908181526020018280546106b0906115e8565b80156106fd5780601f106106d2576101008083540402835291602001916106fd565b820191906000526020600020905b8154815290600101906020018083116106e057829003601f168201915b505050505081565b61070d6110e1565b6107176000611162565b565b6107216110e1565b73ffffffffffffffffffffffffffffffffffffffff821660009081526001602052604081205460ff169081600281111561075d5761075d6112c1565b036107e9576040517f8f28397000000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff8381166004830152841690638f283970906024015b600060405180830381600087803b1580156107cc57600080fd5b505af11580156107e0573d6000803e3d6000fd5b50505050505050565b60018160028111156107fd576107fd6112c1565b03610856576040517f13af403500000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff83811660048301528416906313af4035906024016107b2565b600281600281111561086a5761086a6112c1565b036105fe576003546040517ff2fde38b00000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff84811660048301529091169063f2fde38b906024016107b2565b505050565b6108d46110e1565b73ffffffffffffffffffffffffffffffffffffffff821660009081526002602052604090206108c78282611724565b61090b6110e1565b73ffffffffffffffffffffffffffffffffffffffff82166000908152600160208190526040909120805483927fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff009091169083600281111561096e5761096e6112c1565b02179055505050565b61097f6110e1565b73ffffffffffffffffffffffffffffffffffffffff831660009081526001602052604081205460ff16908160028111156109bb576109bb6112c1565b03610a81576040517f4f1ef28600000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff851690634f1ef286903490610a16908790879060040161183e565b60006040518083038185885af1158015610a34573d6000803e3d6000fd5b50505050506040513d6000823e601f3d9081017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0168201604052610a7b9190810190611875565b50610b88565b610a8b8484610b8e565b60008473ffffffffffffffffffffffffffffffffffffffff163484604051610ab391906118ec565b60006040518083038185875af1925050503d8060008114610af0576040519150601f19603f3d011682016040523d82523d6000602084013e610af5565b606091505b5050905080610b86576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602e60248201527f50726f787941646d696e3a2063616c6c20746f2070726f78792061667465722060448201527f75706772616465206661696c6564000000000000000000000000000000000000606482015260840161065c565b505b50505050565b610b966110e1565b73ffffffffffffffffffffffffffffffffffffffff821660009081526001602052604081205460ff1690816002811115610bd257610bd26112c1565b03610c2b576040517f3659cfe600000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff8381166004830152841690633659cfe6906024016107b2565b6001816002811115610c3f57610c3f6112c1565b03610cbe576040517f9b0b0fda0000000000000000000000000000000000000000000000000000000081527f360894a13ba1a3210667c828492db98dca3e2076cc3735a920a3ca505d382bbc600482015273ffffffffffffffffffffffffffffffffffffffff8381166024830152841690639b0b0fda906044016107b2565b6002816002811115610cd257610cd26112c1565b03610e165773ffffffffffffffffffffffffffffffffffffffff831660009081526002602052604081208054610d07906115e8565b80601f0160208091040260200160405190810160405280929190818152602001828054610d33906115e8565b8015610d805780601f10610d5557610100808354040283529160200191610d80565b820191906000526020600020905b815481529060010190602001808311610d6357829003601f168201915b50506003546040517f9b2ea4bd00000000000000000000000000000000000000000000000000000000815294955073ffffffffffffffffffffffffffffffffffffffff1693639b2ea4bd9350610dde92508591508790600401611908565b600060405180830381600087803b158015610df857600080fd5b505af1158015610e0c573d6000803e3d6000fd5b5050505050505050565b6108c7611940565b610e266110e1565b6003546040517f9b2ea4bd00000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff90911690639b2ea4bd90610e7e9085908590600401611908565b600060405180830381600087803b158015610e9857600080fd5b505af1158015610eac573d6000803e3d6000fd5b505050505050565b610ebc6110e1565b73ffffffffffffffffffffffffffffffffffffffff8116610f5f576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602660248201527f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160448201527f6464726573730000000000000000000000000000000000000000000000000000606482015260840161065c565b610f6881611162565b50565b73ffffffffffffffffffffffffffffffffffffffff811660009081526001602052604081205460ff1681816002811115610fa757610fa76112c1565b03610ff7578273ffffffffffffffffffffffffffffffffffffffff1663f851a4406040518163ffffffff1660e01b8152600401602060405180830381865afa1580156104d1573d6000803e3d6000fd5b600181600281111561100b5761100b6112c1565b0361105b578273ffffffffffffffffffffffffffffffffffffffff1663893d20e86040518163ffffffff1660e01b8152600401602060405180830381865afa1580156104d1573d6000803e3d6000fd5b600281600281111561106f5761106f6112c1565b036105fe57600360009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16638da5cb5b6040518163ffffffff1660e01b8152600401602060405180830381865afa1580156104d1573d6000803e3d6000fd5b60005473ffffffffffffffffffffffffffffffffffffffff163314610717576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572604482015260640161065c565b6000805473ffffffffffffffffffffffffffffffffffffffff8381167fffffffffffffffffffffffff0000000000000000000000000000000000000000831681178455604051919092169283917f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e09190a35050565b73ffffffffffffffffffffffffffffffffffffffff81168114610f6857600080fd5b60006020828403121561120b57600080fd5b81356104f5816111d7565b60006020828403121561122857600080fd5b813580151581146104f557600080fd5b60005b8381101561125357818101518382015260200161123b565b83811115610b885750506000910152565b6000815180845261127c816020860160208601611238565b601f017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0169290920160200192915050565b6020815260006104f56020830184611264565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602160045260246000fd5b602081016003831061132b577f4e487b7100000000000000000000000000000000000000000000000000000000600052602160045260246000fd5b91905290565b6000806040838503121561134457600080fd5b823561134f816111d7565b9150602083013561135f816111d7565b809150509250929050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b604051601f82017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe016810167ffffffffffffffff811182821017156113e0576113e061136a565b604052919050565b600067ffffffffffffffff8211156114025761140261136a565b50601f017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe01660200190565b600061144161143c846113e8565b611399565b905082815283838301111561145557600080fd5b828260208301376000602084830101529392505050565b600082601f83011261147d57600080fd5b6104f58383356020850161142e565b6000806040838503121561149f57600080fd5b82356114aa816111d7565b9150602083013567ffffffffffffffff8111156114c657600080fd5b6114d28582860161146c565b9150509250929050565b600080604083850312156114ef57600080fd5b82356114fa816111d7565b915060208301356003811061135f57600080fd5b60008060006060848603121561152357600080fd5b833561152e816111d7565b9250602084013561153e816111d7565b9150604084013567ffffffffffffffff81111561155a57600080fd5b8401601f8101861361156b57600080fd5b61157a8682356020840161142e565b9150509250925092565b6000806040838503121561159757600080fd5b823567ffffffffffffffff8111156115ae57600080fd5b6115ba8582860161146c565b925050602083013561135f816111d7565b6000602082840312156115dd57600080fd5b81516104f5816111d7565b600181811c908216806115fc57607f821691505b602082108103610665577f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b6000602080835260008454611649816115e8565b8084870152604060018084166000811461166a57600181146116a2576116d0565b7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff008516838a01528284151560051b8a010195506116d0565b896000528660002060005b858110156116c85781548b82018601529083019088016116ad565b8a0184019650505b509398975050505050505050565b601f8211156108c757600081815260208120601f850160051c810160208610156117055750805b601f850160051c820191505b81811015610eac57828155600101611711565b815167ffffffffffffffff81111561173e5761173e61136a565b6117528161174c84546115e8565b846116de565b602080601f8311600181146117a5576000841561176f5750858301515b7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff600386901b1c1916600185901b178555610eac565b6000858152602081207fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe08616915b828110156117f2578886015182559484019460019091019084016117d3565b508582101561182e57878501517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff600388901b60f8161c191681555b5050505050600190811b01905550565b73ffffffffffffffffffffffffffffffffffffffff8316815260406020820152600061186d6040830184611264565b949350505050565b60006020828403121561188757600080fd5b815167ffffffffffffffff81111561189e57600080fd5b8201601f810184136118af57600080fd5b80516118bd61143c826113e8565b8181528560208385010111156118d257600080fd5b6118e3826020830160208601611238565b95945050505050565b600082516118fe818460208701611238565b9190910192915050565b60408152600061191b6040830185611264565b905073ffffffffffffffffffffffffffffffffffffffff831660208301529392505050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052600160045260246000fdfea164736f6c634300080f000a0000000000000000000000001804c8ab1f12e6bbf3894d4083f33e07309d1f38", - "deployedCode": "0x60806040526004361061010e5760003560e01c8063860f7cda116100a557806399a88ec411610074578063b794726211610059578063b794726214610329578063f2fde38b14610364578063f3b7dead1461038457600080fd5b806399a88ec4146102e95780639b2ea4bd1461030957600080fd5b8063860f7cda1461026b5780638d52d4a01461028b5780638da5cb5b146102ab5780639623609d146102d657600080fd5b80633ab76e9f116100e15780633ab76e9f146101cc5780636bd9f516146101f9578063715018a6146102365780637eff275e1461024b57600080fd5b80630652b57a1461011357806307c8f7b014610135578063204e1c7a14610155578063238181ae1461019f575b600080fd5b34801561011f57600080fd5b5061013361012e3660046111f9565b6103a4565b005b34801561014157600080fd5b50610133610150366004611216565b6103f3565b34801561016157600080fd5b506101756101703660046111f9565b610445565b60405173ffffffffffffffffffffffffffffffffffffffff90911681526020015b60405180910390f35b3480156101ab57600080fd5b506101bf6101ba3660046111f9565b61066b565b60405161019691906112ae565b3480156101d857600080fd5b506003546101759073ffffffffffffffffffffffffffffffffffffffff1681565b34801561020557600080fd5b506102296102143660046111f9565b60016020526000908152604090205460ff1681565b60405161019691906112f0565b34801561024257600080fd5b50610133610705565b34801561025757600080fd5b50610133610266366004611331565b610719565b34801561027757600080fd5b5061013361028636600461148c565b6108cc565b34801561029757600080fd5b506101336102a63660046114dc565b610903565b3480156102b757600080fd5b5060005473ffffffffffffffffffffffffffffffffffffffff16610175565b6101336102e436600461150e565b610977565b3480156102f557600080fd5b50610133610304366004611331565b610b8e565b34801561031557600080fd5b50610133610324366004611584565b610e1e565b34801561033557600080fd5b5060035474010000000000000000000000000000000000000000900460ff166040519015158152602001610196565b34801561037057600080fd5b5061013361037f3660046111f9565b610eb4565b34801561039057600080fd5b5061017561039f3660046111f9565b610f6b565b6103ac6110e1565b600380547fffffffffffffffffffffffff00000000000000000000000000000000000000001673ffffffffffffffffffffffffffffffffffffffff92909216919091179055565b6103fb6110e1565b6003805491151574010000000000000000000000000000000000000000027fffffffffffffffffffffff00ffffffffffffffffffffffffffffffffffffffff909216919091179055565b73ffffffffffffffffffffffffffffffffffffffff811660009081526001602052604081205460ff1681816002811115610481576104816112c1565b036104fc578273ffffffffffffffffffffffffffffffffffffffff16635c60da1b6040518163ffffffff1660e01b8152600401602060405180830381865afa1580156104d1573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906104f591906115cb565b9392505050565b6001816002811115610510576105106112c1565b03610560578273ffffffffffffffffffffffffffffffffffffffff1663aaf10f426040518163ffffffff1660e01b8152600401602060405180830381865afa1580156104d1573d6000803e3d6000fd5b6002816002811115610574576105746112c1565b036105fe5760035473ffffffffffffffffffffffffffffffffffffffff8481166000908152600260205260409081902090517fbf40fac1000000000000000000000000000000000000000000000000000000008152919092169163bf40fac1916105e19190600401611635565b602060405180830381865afa1580156104d1573d6000803e3d6000fd5b6040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601e60248201527f50726f787941646d696e3a20756e6b6e6f776e2070726f78792074797065000060448201526064015b60405180910390fd5b50919050565b60026020526000908152604090208054610684906115e8565b80601f01602080910402602001604051908101604052809291908181526020018280546106b0906115e8565b80156106fd5780601f106106d2576101008083540402835291602001916106fd565b820191906000526020600020905b8154815290600101906020018083116106e057829003601f168201915b505050505081565b61070d6110e1565b6107176000611162565b565b6107216110e1565b73ffffffffffffffffffffffffffffffffffffffff821660009081526001602052604081205460ff169081600281111561075d5761075d6112c1565b036107e9576040517f8f28397000000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff8381166004830152841690638f283970906024015b600060405180830381600087803b1580156107cc57600080fd5b505af11580156107e0573d6000803e3d6000fd5b50505050505050565b60018160028111156107fd576107fd6112c1565b03610856576040517f13af403500000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff83811660048301528416906313af4035906024016107b2565b600281600281111561086a5761086a6112c1565b036105fe576003546040517ff2fde38b00000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff84811660048301529091169063f2fde38b906024016107b2565b505050565b6108d46110e1565b73ffffffffffffffffffffffffffffffffffffffff821660009081526002602052604090206108c78282611724565b61090b6110e1565b73ffffffffffffffffffffffffffffffffffffffff82166000908152600160208190526040909120805483927fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff009091169083600281111561096e5761096e6112c1565b02179055505050565b61097f6110e1565b73ffffffffffffffffffffffffffffffffffffffff831660009081526001602052604081205460ff16908160028111156109bb576109bb6112c1565b03610a81576040517f4f1ef28600000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff851690634f1ef286903490610a16908790879060040161183e565b60006040518083038185885af1158015610a34573d6000803e3d6000fd5b50505050506040513d6000823e601f3d9081017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0168201604052610a7b9190810190611875565b50610b88565b610a8b8484610b8e565b60008473ffffffffffffffffffffffffffffffffffffffff163484604051610ab391906118ec565b60006040518083038185875af1925050503d8060008114610af0576040519150601f19603f3d011682016040523d82523d6000602084013e610af5565b606091505b5050905080610b86576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602e60248201527f50726f787941646d696e3a2063616c6c20746f2070726f78792061667465722060448201527f75706772616465206661696c6564000000000000000000000000000000000000606482015260840161065c565b505b50505050565b610b966110e1565b73ffffffffffffffffffffffffffffffffffffffff821660009081526001602052604081205460ff1690816002811115610bd257610bd26112c1565b03610c2b576040517f3659cfe600000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff8381166004830152841690633659cfe6906024016107b2565b6001816002811115610c3f57610c3f6112c1565b03610cbe576040517f9b0b0fda0000000000000000000000000000000000000000000000000000000081527f360894a13ba1a3210667c828492db98dca3e2076cc3735a920a3ca505d382bbc600482015273ffffffffffffffffffffffffffffffffffffffff8381166024830152841690639b0b0fda906044016107b2565b6002816002811115610cd257610cd26112c1565b03610e165773ffffffffffffffffffffffffffffffffffffffff831660009081526002602052604081208054610d07906115e8565b80601f0160208091040260200160405190810160405280929190818152602001828054610d33906115e8565b8015610d805780601f10610d5557610100808354040283529160200191610d80565b820191906000526020600020905b815481529060010190602001808311610d6357829003601f168201915b50506003546040517f9b2ea4bd00000000000000000000000000000000000000000000000000000000815294955073ffffffffffffffffffffffffffffffffffffffff1693639b2ea4bd9350610dde92508591508790600401611908565b600060405180830381600087803b158015610df857600080fd5b505af1158015610e0c573d6000803e3d6000fd5b5050505050505050565b6108c7611940565b610e266110e1565b6003546040517f9b2ea4bd00000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff90911690639b2ea4bd90610e7e9085908590600401611908565b600060405180830381600087803b158015610e9857600080fd5b505af1158015610eac573d6000803e3d6000fd5b505050505050565b610ebc6110e1565b73ffffffffffffffffffffffffffffffffffffffff8116610f5f576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602660248201527f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160448201527f6464726573730000000000000000000000000000000000000000000000000000606482015260840161065c565b610f6881611162565b50565b73ffffffffffffffffffffffffffffffffffffffff811660009081526001602052604081205460ff1681816002811115610fa757610fa76112c1565b03610ff7578273ffffffffffffffffffffffffffffffffffffffff1663f851a4406040518163ffffffff1660e01b8152600401602060405180830381865afa1580156104d1573d6000803e3d6000fd5b600181600281111561100b5761100b6112c1565b0361105b578273ffffffffffffffffffffffffffffffffffffffff1663893d20e86040518163ffffffff1660e01b8152600401602060405180830381865afa1580156104d1573d6000803e3d6000fd5b600281600281111561106f5761106f6112c1565b036105fe57600360009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16638da5cb5b6040518163ffffffff1660e01b8152600401602060405180830381865afa1580156104d1573d6000803e3d6000fd5b60005473ffffffffffffffffffffffffffffffffffffffff163314610717576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572604482015260640161065c565b6000805473ffffffffffffffffffffffffffffffffffffffff8381167fffffffffffffffffffffffff0000000000000000000000000000000000000000831681178455604051919092169283917f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e09190a35050565b73ffffffffffffffffffffffffffffffffffffffff81168114610f6857600080fd5b60006020828403121561120b57600080fd5b81356104f5816111d7565b60006020828403121561122857600080fd5b813580151581146104f557600080fd5b60005b8381101561125357818101518382015260200161123b565b83811115610b885750506000910152565b6000815180845261127c816020860160208601611238565b601f017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0169290920160200192915050565b6020815260006104f56020830184611264565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602160045260246000fd5b602081016003831061132b577f4e487b7100000000000000000000000000000000000000000000000000000000600052602160045260246000fd5b91905290565b6000806040838503121561134457600080fd5b823561134f816111d7565b9150602083013561135f816111d7565b809150509250929050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b604051601f82017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe016810167ffffffffffffffff811182821017156113e0576113e061136a565b604052919050565b600067ffffffffffffffff8211156114025761140261136a565b50601f017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe01660200190565b600061144161143c846113e8565b611399565b905082815283838301111561145557600080fd5b828260208301376000602084830101529392505050565b600082601f83011261147d57600080fd5b6104f58383356020850161142e565b6000806040838503121561149f57600080fd5b82356114aa816111d7565b9150602083013567ffffffffffffffff8111156114c657600080fd5b6114d28582860161146c565b9150509250929050565b600080604083850312156114ef57600080fd5b82356114fa816111d7565b915060208301356003811061135f57600080fd5b60008060006060848603121561152357600080fd5b833561152e816111d7565b9250602084013561153e816111d7565b9150604084013567ffffffffffffffff81111561155a57600080fd5b8401601f8101861361156b57600080fd5b61157a8682356020840161142e565b9150509250925092565b6000806040838503121561159757600080fd5b823567ffffffffffffffff8111156115ae57600080fd5b6115ba8582860161146c565b925050602083013561135f816111d7565b6000602082840312156115dd57600080fd5b81516104f5816111d7565b600181811c908216806115fc57607f821691505b602082108103610665577f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b6000602080835260008454611649816115e8565b8084870152604060018084166000811461166a57600181146116a2576116d0565b7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff008516838a01528284151560051b8a010195506116d0565b896000528660002060005b858110156116c85781548b82018601529083019088016116ad565b8a0184019650505b509398975050505050505050565b601f8211156108c757600081815260208120601f850160051c810160208610156117055750805b601f850160051c820191505b81811015610eac57828155600101611711565b815167ffffffffffffffff81111561173e5761173e61136a565b6117528161174c84546115e8565b846116de565b602080601f8311600181146117a5576000841561176f5750858301515b7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff600386901b1c1916600185901b178555610eac565b6000858152602081207fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe08616915b828110156117f2578886015182559484019460019091019084016117d3565b508582101561182e57878501517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff600388901b60f8161c191681555b5050505050600190811b01905550565b73ffffffffffffffffffffffffffffffffffffffff8316815260406020820152600061186d6040830184611264565b949350505050565b60006020828403121561188757600080fd5b815167ffffffffffffffff81111561189e57600080fd5b8201601f810184136118af57600080fd5b80516118bd61143c826113e8565b8181528560208385010111156118d257600080fd5b6118e3826020830160208601611238565b95945050505050565b600082516118fe818460208701611238565b9190910192915050565b60408152600061191b6040830185611264565b905073ffffffffffffffffffffffffffffffffffffffff831660208301529392505050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052600160045260246000fdfea164736f6c634300080f000a", - "initialized": true, - "kind": "Create", - "newBalance": 0, - "oldBalance": 0, - "reverted": false, - "storageAccesses": [ - { - "account": "0xDB8cFf278adCCF9E9b5da745B44E754fC4EE3C76", - "isWrite": false, - "newValue": "0x0000000000000000000000000000000000000000000000000000000000000000", - "previousValue": "0x0000000000000000000000000000000000000000000000000000000000000000", - "reverted": false, - "slot": "0x0000000000000000000000000000000000000000000000000000000000000000" - }, - { - "account": "0xDB8cFf278adCCF9E9b5da745B44E754fC4EE3C76", - "isWrite": true, - "newValue": "0x0000000000000000000000001804c8ab1f12e6bbf3894d4083f33e07309d1f38", - "previousValue": "0x0000000000000000000000000000000000000000000000000000000000000000", - "reverted": false, - "slot": "0x0000000000000000000000000000000000000000000000000000000000000000" - }, - { - "account": "0xDB8cFf278adCCF9E9b5da745B44E754fC4EE3C76", - "isWrite": false, - "newValue": "0x0000000000000000000000001804c8ab1f12e6bbf3894d4083f33e07309d1f38", - "previousValue": "0x0000000000000000000000001804c8ab1f12e6bbf3894d4083f33e07309d1f38", - "reverted": false, - "slot": "0x0000000000000000000000000000000000000000000000000000000000000000" - }, - { - "account": "0xDB8cFf278adCCF9E9b5da745B44E754fC4EE3C76", - "isWrite": true, - "newValue": "0x0000000000000000000000001804c8ab1f12e6bbf3894d4083f33e07309d1f38", - "previousValue": "0x0000000000000000000000001804c8ab1f12e6bbf3894d4083f33e07309d1f38", - "reverted": false, - "slot": "0x0000000000000000000000000000000000000000000000000000000000000000" - } - ], - "value": 0 - }, - { - "accessor": "0x1804c8AB1F12E6bbf3894d4083f33e07309d1f38", - "account": "0xDB8cFf278adCCF9E9b5da745B44E754fC4EE3C76", - "chainInfo": { - "chainId": 31337, - "forkId": 0 - }, - "data": "0x8da5cb5b", - "deployedCode": "0x", - "initialized": true, - "kind": "StaticCall", - "newBalance": 0, - "oldBalance": 0, - "reverted": false, - "storageAccesses": [ - { - "account": "0xDB8cFf278adCCF9E9b5da745B44E754fC4EE3C76", - "isWrite": false, - "newValue": "0x0000000000000000000000001804c8ab1f12e6bbf3894d4083f33e07309d1f38", - "previousValue": "0x0000000000000000000000001804c8ab1f12e6bbf3894d4083f33e07309d1f38", - "reverted": false, - "slot": "0x0000000000000000000000000000000000000000000000000000000000000000" - } - ], - "value": 0 - }, - { - "accessor": "0x1804c8AB1F12E6bbf3894d4083f33e07309d1f38", - "account": "0xDB8cFf278adCCF9E9b5da745B44E754fC4EE3C76", - "chainInfo": { - "chainId": 31337, - "forkId": 0 - }, - "data": "0x3ab76e9f", - "deployedCode": "0x", - "initialized": true, - "kind": "StaticCall", - "newBalance": 0, - "oldBalance": 0, - "reverted": false, - "storageAccesses": [ - { - "account": "0xDB8cFf278adCCF9E9b5da745B44E754fC4EE3C76", - "isWrite": false, - "newValue": "0x0000000000000000000000000000000000000000000000000000000000000000", - "previousValue": "0x0000000000000000000000000000000000000000000000000000000000000000", - "reverted": false, - "slot": "0x0000000000000000000000000000000000000000000000000000000000000003" - } - ], - "value": 0 - }, - { - "accessor": "0x7FA9385bE102ac3EAc297483Dd6233D62b3e1496", - "account": "0xDB8cFf278adCCF9E9b5da745B44E754fC4EE3C76", - "chainInfo": { - "chainId": 31337, - "forkId": 0 - }, - "data": "0x", - "deployedCode": "0x", - "initialized": true, - "kind": "Resume", - "newBalance": 0, - "oldBalance": 0, - "reverted": false, - "storageAccesses": [], - "value": 0 - }, - { - "accessor": "0x1804c8AB1F12E6bbf3894d4083f33e07309d1f38", - "account": "0xDB8cFf278adCCF9E9b5da745B44E754fC4EE3C76", - "chainInfo": { - "chainId": 31337, - "forkId": 0 - }, - "data": "0x0652b57a000000000000000000000000bb2180ebd78ce97360503434ed37fcf4a1df61c3", - "deployedCode": "0x", - "initialized": true, - "kind": "Call", - "newBalance": 0, - "oldBalance": 0, - "reverted": false, - "storageAccesses": [ - { - "account": "0xDB8cFf278adCCF9E9b5da745B44E754fC4EE3C76", - "isWrite": false, - "newValue": "0x0000000000000000000000001804c8ab1f12e6bbf3894d4083f33e07309d1f38", - "previousValue": "0x0000000000000000000000001804c8ab1f12e6bbf3894d4083f33e07309d1f38", - "reverted": false, - "slot": "0x0000000000000000000000000000000000000000000000000000000000000000" - }, - { - "account": "0xDB8cFf278adCCF9E9b5da745B44E754fC4EE3C76", - "isWrite": false, - "newValue": "0x0000000000000000000000000000000000000000000000000000000000000000", - "previousValue": "0x0000000000000000000000000000000000000000000000000000000000000000", - "reverted": false, - "slot": "0x0000000000000000000000000000000000000000000000000000000000000003" - }, - { - "account": "0xDB8cFf278adCCF9E9b5da745B44E754fC4EE3C76", - "isWrite": true, - "newValue": "0x000000000000000000000000bb2180ebd78ce97360503434ed37fcf4a1df61c3", - "previousValue": "0x0000000000000000000000000000000000000000000000000000000000000000", - "reverted": false, - "slot": "0x0000000000000000000000000000000000000000000000000000000000000003" - } - ], - "value": 0 - }, - { - "accessor": "0x1804c8AB1F12E6bbf3894d4083f33e07309d1f38", - "account": "0xDB8cFf278adCCF9E9b5da745B44E754fC4EE3C76", - "chainInfo": { - "chainId": 31337, - "forkId": 0 - }, - "data": "0x3ab76e9f", - "deployedCode": "0x", - "initialized": true, - "kind": "StaticCall", - "newBalance": 0, - "oldBalance": 0, - "reverted": false, - "storageAccesses": [ - { - "account": "0xDB8cFf278adCCF9E9b5da745B44E754fC4EE3C76", - "isWrite": false, - "newValue": "0x000000000000000000000000bb2180ebd78ce97360503434ed37fcf4a1df61c3", - "previousValue": "0x000000000000000000000000bb2180ebd78ce97360503434ed37fcf4a1df61c3", - "reverted": false, - "slot": "0x0000000000000000000000000000000000000000000000000000000000000003" - } - ], - "value": 0 - }, - { - "accessor": "0x7FA9385bE102ac3EAc297483Dd6233D62b3e1496", - "account": "0x7109709ECfa91a80626fF3989D68f67F5b1DD12D", - "chainInfo": { - "chainId": 31337, - "forkId": 0 - }, - "data": "0x", - "deployedCode": "0x", - "initialized": true, - "kind": "Resume", - "newBalance": 0, - "oldBalance": 0, - "reverted": false, - "storageAccesses": [], - "value": 0 - }, - { - "accessor": "0x7FA9385bE102ac3EAc297483Dd6233D62b3e1496", - "account": "0x7109709ECfa91a80626fF3989D68f67F5b1DD12D", - "chainInfo": { - "chainId": 31337, - "forkId": 0 - }, - "data": "0x", - "deployedCode": "0x", - "initialized": true, - "kind": "Resume", - "newBalance": 0, - "oldBalance": 0, - "reverted": false, - "storageAccesses": [], - "value": 0 - }, - { - "accessor": "0x7FA9385bE102ac3EAc297483Dd6233D62b3e1496", - "account": "0x7109709ECfa91a80626fF3989D68f67F5b1DD12D", - "chainInfo": { - "chainId": 31337, - "forkId": 0 - }, - "data": "0x", - "deployedCode": "0x", - "initialized": true, - "kind": "Resume", - "newBalance": 0, - "oldBalance": 0, - "reverted": false, - "storageAccesses": [], - "value": 0 - }, - { - "accessor": "0x1804c8AB1F12E6bbf3894d4083f33e07309d1f38", - "account": "0xDB8cFf278adCCF9E9b5da745B44E754fC4EE3C76", - "chainInfo": { - "chainId": 31337, - "forkId": 0 - }, - "data": "0x8da5cb5b", - "deployedCode": "0x", - "initialized": true, - "kind": "StaticCall", - "newBalance": 0, - "oldBalance": 0, - "reverted": false, - "storageAccesses": [ - { - "account": "0xDB8cFf278adCCF9E9b5da745B44E754fC4EE3C76", - "isWrite": false, - "newValue": "0x0000000000000000000000001804c8ab1f12e6bbf3894d4083f33e07309d1f38", - "previousValue": "0x0000000000000000000000001804c8ab1f12e6bbf3894d4083f33e07309d1f38", - "reverted": false, - "slot": "0x0000000000000000000000000000000000000000000000000000000000000000" - } - ], - "value": 0 - }, - { - "accessor": "0x7FA9385bE102ac3EAc297483Dd6233D62b3e1496", - "account": "0xDB8cFf278adCCF9E9b5da745B44E754fC4EE3C76", - "chainInfo": { - "chainId": 31337, - "forkId": 0 - }, - "data": "0x", - "deployedCode": "0x", - "initialized": true, - "kind": "Resume", - "newBalance": 0, - "oldBalance": 0, - "reverted": false, - "storageAccesses": [], - "value": 0 - }, - { - "accessor": "0x1804c8AB1F12E6bbf3894d4083f33e07309d1f38", - "account": "0xDB8cFf278adCCF9E9b5da745B44E754fC4EE3C76", - "chainInfo": { - "chainId": 31337, - "forkId": 0 - }, - "data": "0xf2fde38b0000000000000000000000007d039be7f9b5190147621b02e82b250e1d748e02", - "deployedCode": "0x", - "initialized": true, - "kind": "Call", - "newBalance": 0, - "oldBalance": 0, - "reverted": false, - "storageAccesses": [ - { - "account": "0xDB8cFf278adCCF9E9b5da745B44E754fC4EE3C76", - "isWrite": false, - "newValue": "0x0000000000000000000000001804c8ab1f12e6bbf3894d4083f33e07309d1f38", - "previousValue": "0x0000000000000000000000001804c8ab1f12e6bbf3894d4083f33e07309d1f38", - "reverted": false, - "slot": "0x0000000000000000000000000000000000000000000000000000000000000000" - }, - { - "account": "0xDB8cFf278adCCF9E9b5da745B44E754fC4EE3C76", - "isWrite": false, - "newValue": "0x0000000000000000000000001804c8ab1f12e6bbf3894d4083f33e07309d1f38", - "previousValue": "0x0000000000000000000000001804c8ab1f12e6bbf3894d4083f33e07309d1f38", - "reverted": false, - "slot": "0x0000000000000000000000000000000000000000000000000000000000000000" - }, - { - "account": "0xDB8cFf278adCCF9E9b5da745B44E754fC4EE3C76", - "isWrite": true, - "newValue": "0x0000000000000000000000007d039be7f9b5190147621b02e82b250e1d748e02", - "previousValue": "0x0000000000000000000000001804c8ab1f12e6bbf3894d4083f33e07309d1f38", - "reverted": false, - "slot": "0x0000000000000000000000000000000000000000000000000000000000000000" - } - ], - "value": 0 - }, - { - "accessor": "0x7FA9385bE102ac3EAc297483Dd6233D62b3e1496", - "account": "0x7109709ECfa91a80626fF3989D68f67F5b1DD12D", - "chainInfo": { - "chainId": 31337, - "forkId": 0 - }, - "data": "0x", - "deployedCode": "0x", - "initialized": true, - "kind": "Resume", - "newBalance": 0, - "oldBalance": 0, - "reverted": false, - "storageAccesses": [], - "value": 0 - }, - { - "accessor": "0x7FA9385bE102ac3EAc297483Dd6233D62b3e1496", - "account": "0x7109709ECfa91a80626fF3989D68f67F5b1DD12D", - "chainInfo": { - "chainId": 31337, - "forkId": 0 - }, - "data": "0x", - "deployedCode": "0x", - "initialized": true, - "kind": "Resume", - "newBalance": 0, - "oldBalance": 0, - "reverted": false, - "storageAccesses": [], - "value": 0 - }, - { - "accessor": "0x1804c8AB1F12E6bbf3894d4083f33e07309d1f38", - "account": "0xDEb1E9a6Be7Baf84208BB6E10aC9F9bbE1D70809", - "chainInfo": { - "chainId": 31337, - "forkId": 0 - }, - "data": "0x608060405234801561001057600080fd5b5060405161091f38038061091f83398101604081905261002f916100b5565b6100388161003e565b506100e5565b60006100566000805160206108ff8339815191525490565b6000805160206108ff833981519152838155604080516001600160a01b0380851682528616602082015292935090917f7e644d79422f17c01e4894b5f4f588d331ebfa28653d42ae832dc59e38c9798f910160405180910390a1505050565b6000602082840312156100c757600080fd5b81516001600160a01b03811681146100de57600080fd5b9392505050565b61080b806100f46000396000f3fe60806040526004361061005e5760003560e01c80635c60da1b116100435780635c60da1b146100be5780638f283970146100f8578063f851a440146101185761006d565b80633659cfe6146100755780634f1ef286146100955761006d565b3661006d5761006b61012d565b005b61006b61012d565b34801561008157600080fd5b5061006b6100903660046106dd565b610224565b6100a86100a33660046106f8565b610296565b6040516100b5919061077b565b60405180910390f35b3480156100ca57600080fd5b506100d3610419565b60405173ffffffffffffffffffffffffffffffffffffffff90911681526020016100b5565b34801561010457600080fd5b5061006b6101133660046106dd565b6104b0565b34801561012457600080fd5b506100d3610517565b60006101577f360894a13ba1a3210667c828492db98dca3e2076cc3735a920a3ca505d382bbc5490565b905073ffffffffffffffffffffffffffffffffffffffff8116610201576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602560248201527f50726f78793a20696d706c656d656e746174696f6e206e6f7420696e6974696160448201527f6c697a656400000000000000000000000000000000000000000000000000000060648201526084015b60405180910390fd5b3660008037600080366000845af43d6000803e8061021e573d6000fd5b503d6000f35b7fb53127684a568b3173ae13b9f8a6016e243e63b6e8ee1178d6a717850b5d61035473ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff16148061027d575033155b1561028e5761028b816105a3565b50565b61028b61012d565b60606102c07fb53127684a568b3173ae13b9f8a6016e243e63b6e8ee1178d6a717850b5d61035490565b73ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff1614806102f7575033155b1561040a57610305846105a3565b6000808573ffffffffffffffffffffffffffffffffffffffff16858560405161032f9291906107ee565b600060405180830381855af49150503d806000811461036a576040519150601f19603f3d011682016040523d82523d6000602084013e61036f565b606091505b509150915081610401576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152603960248201527f50726f78793a2064656c656761746563616c6c20746f206e657720696d706c6560448201527f6d656e746174696f6e20636f6e7472616374206661696c65640000000000000060648201526084016101f8565b91506104129050565b61041261012d565b9392505050565b60006104437fb53127684a568b3173ae13b9f8a6016e243e63b6e8ee1178d6a717850b5d61035490565b73ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff16148061047a575033155b156104a557507f360894a13ba1a3210667c828492db98dca3e2076cc3735a920a3ca505d382bbc5490565b6104ad61012d565b90565b7fb53127684a568b3173ae13b9f8a6016e243e63b6e8ee1178d6a717850b5d61035473ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff161480610509575033155b1561028e5761028b8161060c565b60006105417fb53127684a568b3173ae13b9f8a6016e243e63b6e8ee1178d6a717850b5d61035490565b73ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff161480610578575033155b156104a557507fb53127684a568b3173ae13b9f8a6016e243e63b6e8ee1178d6a717850b5d61035490565b7f360894a13ba1a3210667c828492db98dca3e2076cc3735a920a3ca505d382bbc81815560405173ffffffffffffffffffffffffffffffffffffffff8316907fbc7cd75a20ee27fd9adebab32041f755214dbc6bffa90cc0225b39da2e5c2d3b90600090a25050565b60006106367fb53127684a568b3173ae13b9f8a6016e243e63b6e8ee1178d6a717850b5d61035490565b7fb53127684a568b3173ae13b9f8a6016e243e63b6e8ee1178d6a717850b5d61038381556040805173ffffffffffffffffffffffffffffffffffffffff80851682528616602082015292935090917f7e644d79422f17c01e4894b5f4f588d331ebfa28653d42ae832dc59e38c9798f910160405180910390a1505050565b803573ffffffffffffffffffffffffffffffffffffffff811681146106d857600080fd5b919050565b6000602082840312156106ef57600080fd5b610412826106b4565b60008060006040848603121561070d57600080fd5b610716846106b4565b9250602084013567ffffffffffffffff8082111561073357600080fd5b818601915086601f83011261074757600080fd5b81358181111561075657600080fd5b87602082850101111561076857600080fd5b6020830194508093505050509250925092565b600060208083528351808285015260005b818110156107a85785810183015185820160400152820161078c565b818111156107ba576000604083870101525b50601f017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe016929092016040019392505050565b818382376000910190815291905056fea164736f6c634300080f000ab53127684a568b3173ae13b9f8a6016e243e63b6e8ee1178d6a717850b5d6103000000000000000000000000db8cff278adccf9e9b5da745b44e754fc4ee3c76", - "deployedCode": "0x60806040526004361061005e5760003560e01c80635c60da1b116100435780635c60da1b146100be5780638f283970146100f8578063f851a440146101185761006d565b80633659cfe6146100755780634f1ef286146100955761006d565b3661006d5761006b61012d565b005b61006b61012d565b34801561008157600080fd5b5061006b6100903660046106dd565b610224565b6100a86100a33660046106f8565b610296565b6040516100b5919061077b565b60405180910390f35b3480156100ca57600080fd5b506100d3610419565b60405173ffffffffffffffffffffffffffffffffffffffff90911681526020016100b5565b34801561010457600080fd5b5061006b6101133660046106dd565b6104b0565b34801561012457600080fd5b506100d3610517565b60006101577f360894a13ba1a3210667c828492db98dca3e2076cc3735a920a3ca505d382bbc5490565b905073ffffffffffffffffffffffffffffffffffffffff8116610201576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602560248201527f50726f78793a20696d706c656d656e746174696f6e206e6f7420696e6974696160448201527f6c697a656400000000000000000000000000000000000000000000000000000060648201526084015b60405180910390fd5b3660008037600080366000845af43d6000803e8061021e573d6000fd5b503d6000f35b7fb53127684a568b3173ae13b9f8a6016e243e63b6e8ee1178d6a717850b5d61035473ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff16148061027d575033155b1561028e5761028b816105a3565b50565b61028b61012d565b60606102c07fb53127684a568b3173ae13b9f8a6016e243e63b6e8ee1178d6a717850b5d61035490565b73ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff1614806102f7575033155b1561040a57610305846105a3565b6000808573ffffffffffffffffffffffffffffffffffffffff16858560405161032f9291906107ee565b600060405180830381855af49150503d806000811461036a576040519150601f19603f3d011682016040523d82523d6000602084013e61036f565b606091505b509150915081610401576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152603960248201527f50726f78793a2064656c656761746563616c6c20746f206e657720696d706c6560448201527f6d656e746174696f6e20636f6e7472616374206661696c65640000000000000060648201526084016101f8565b91506104129050565b61041261012d565b9392505050565b60006104437fb53127684a568b3173ae13b9f8a6016e243e63b6e8ee1178d6a717850b5d61035490565b73ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff16148061047a575033155b156104a557507f360894a13ba1a3210667c828492db98dca3e2076cc3735a920a3ca505d382bbc5490565b6104ad61012d565b90565b7fb53127684a568b3173ae13b9f8a6016e243e63b6e8ee1178d6a717850b5d61035473ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff161480610509575033155b1561028e5761028b8161060c565b60006105417fb53127684a568b3173ae13b9f8a6016e243e63b6e8ee1178d6a717850b5d61035490565b73ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff161480610578575033155b156104a557507fb53127684a568b3173ae13b9f8a6016e243e63b6e8ee1178d6a717850b5d61035490565b7f360894a13ba1a3210667c828492db98dca3e2076cc3735a920a3ca505d382bbc81815560405173ffffffffffffffffffffffffffffffffffffffff8316907fbc7cd75a20ee27fd9adebab32041f755214dbc6bffa90cc0225b39da2e5c2d3b90600090a25050565b60006106367fb53127684a568b3173ae13b9f8a6016e243e63b6e8ee1178d6a717850b5d61035490565b7fb53127684a568b3173ae13b9f8a6016e243e63b6e8ee1178d6a717850b5d61038381556040805173ffffffffffffffffffffffffffffffffffffffff80851682528616602082015292935090917f7e644d79422f17c01e4894b5f4f588d331ebfa28653d42ae832dc59e38c9798f910160405180910390a1505050565b803573ffffffffffffffffffffffffffffffffffffffff811681146106d857600080fd5b919050565b6000602082840312156106ef57600080fd5b610412826106b4565b60008060006040848603121561070d57600080fd5b610716846106b4565b9250602084013567ffffffffffffffff8082111561073357600080fd5b818601915086601f83011261074757600080fd5b81358181111561075657600080fd5b87602082850101111561076857600080fd5b6020830194508093505050509250925092565b600060208083528351808285015260005b818110156107a85785810183015185820160400152820161078c565b818111156107ba576000604083870101525b50601f017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe016929092016040019392505050565b818382376000910190815291905056fea164736f6c634300080f000a", - "initialized": true, - "kind": "Create", - "newBalance": 0, - "oldBalance": 0, - "reverted": false, - "storageAccesses": [ - { - "account": "0xDEb1E9a6Be7Baf84208BB6E10aC9F9bbE1D70809", - "isWrite": false, - "newValue": "0x0000000000000000000000000000000000000000000000000000000000000000", - "previousValue": "0x0000000000000000000000000000000000000000000000000000000000000000", - "reverted": false, - "slot": "0xb53127684a568b3173ae13b9f8a6016e243e63b6e8ee1178d6a717850b5d6103" - }, - { - "account": "0xDEb1E9a6Be7Baf84208BB6E10aC9F9bbE1D70809", - "isWrite": true, - "newValue": "0x000000000000000000000000db8cff278adccf9e9b5da745b44e754fc4ee3c76", - "previousValue": "0x0000000000000000000000000000000000000000000000000000000000000000", - "reverted": false, - "slot": "0xb53127684a568b3173ae13b9f8a6016e243e63b6e8ee1178d6a717850b5d6103" - } - ], - "value": 0 - }, - { - "accessor": "0x7FA9385bE102ac3EAc297483Dd6233D62b3e1496", - "account": "0x7109709ECfa91a80626fF3989D68f67F5b1DD12D", - "chainInfo": { - "chainId": 31337, - "forkId": 0 - }, - "data": "0x", - "deployedCode": "0x", - "initialized": true, - "kind": "Resume", - "newBalance": 0, - "oldBalance": 0, - "reverted": false, - "storageAccesses": [], - "value": 0 - }, - { - "accessor": "0x7FA9385bE102ac3EAc297483Dd6233D62b3e1496", - "account": "0x7109709ECfa91a80626fF3989D68f67F5b1DD12D", - "chainInfo": { - "chainId": 31337, - "forkId": 0 - }, - "data": "0x", - "deployedCode": "0x", - "initialized": true, - "kind": "Resume", - "newBalance": 0, - "oldBalance": 0, - "reverted": false, - "storageAccesses": [], - "value": 0 - }, - { - "accessor": "0x7FA9385bE102ac3EAc297483Dd6233D62b3e1496", - "account": "0x7109709ECfa91a80626fF3989D68f67F5b1DD12D", - "chainInfo": { - "chainId": 31337, - "forkId": 0 - }, - "data": "0x", - "deployedCode": "0x", - "initialized": true, - "kind": "Resume", - "newBalance": 0, - "oldBalance": 0, - "reverted": false, - "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", - "chainInfo": { - "chainId": 31337, - "forkId": 0 - }, - "data": "0x60806040523480156200001157600080fd5b506200001f60008062000025565b62000361565b600054610100900460ff1615808015620000465750600054600160ff909116105b8062000076575062000063306200019460201b620005fd1760201c565b15801562000076575060005460ff166001145b620000de5760405162461bcd60e51b815260206004820152602e60248201527f496e697469616c697a61626c653a20636f6e747261637420697320616c72656160448201526d191e481a5b9a5d1a585b1a5e995960921b606482015260840160405180910390fd5b6000805460ff19166001179055801562000102576000805461ff0019166101001790555b6200010d83620001a3565b81156200014857604080518082019091526012815271125b9a5d1a585b1a5e995c881c185d5cd95960721b6020820152620001489062000248565b80156200018f576000805461ff0019169055604051600181527f7f26b83ff96e1f2b6a682f133852f6798a09c465da95921460cefb38474024989060200160405180910390a15b505050565b6001600160a01b03163b151590565b620001e9620001d460017fd30e835d3f35624761057ff5b27d558f97bd5be034621e62240e5c0b784abe69620002cf565b60001b82620002cb60201b620006191760201c565b6000604080516001600160a01b03841660208201527f7b743789cff01dafdeae47739925425aab5dfd02d0c8229e4a508bcd2b9f42bb910160408051601f19818403018152908290526200023d9162000345565b60405180910390a250565b6200028f6200027960017f54176ff9944c4784e5857ec4e5ef560a462c483bf534eda43f91bb01a470b1b7620002cf565b60001b6001620002cb60201b620006191760201c565b7fc32e6d5d6d1de257f64eac19ddb1f700ba13527983849c9486b1ab007ea2838181604051620002c0919062000345565b60405180910390a150565b9055565b600082821015620002f057634e487b7160e01b600052601160045260246000fd5b500390565b6000815180845260005b818110156200031d57602081850181015186830182015201620002ff565b8181111562000330576000602083870101525b50601f01601f19169290920160200192915050565b6020815260006200035a6020830184620002f5565b9392505050565b61096b80620003716000396000f3fe608060405234801561001057600080fd5b50600436106100885760003560e01c80635c975abb1161005b5780635c975abb146101255780636da663551461013d5780637fbf7b6a14610150578063c23a451a1461016657600080fd5b80633f4ba83a1461008d578063400ada7514610097578063452a9320146100aa57806354fd4d50146100dc575b600080fd5b61009561016e565b005b6100956100a5366004610746565b610294565b6100b261046d565b60405173ffffffffffffffffffffffffffffffffffffffff90911681526020015b60405180910390f35b6101186040518060400160405280600581526020017f312e312e3000000000000000000000000000000000000000000000000000000081525081565b6040516100d39190610808565b61012d6104a6565b60405190151581526020016100d3565b61009561014b366004610851565b6104d6565b6101586105a4565b6040519081526020016100d3565b6101586105d2565b61017661046d565b73ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff1614610235576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602b60248201527f5375706572636861696e436f6e6669673a206f6e6c7920677561726469616e2060448201527f63616e20756e706175736500000000000000000000000000000000000000000060648201526084015b60405180910390fd5b61026961026360017f54176ff9944c4784e5857ec4e5ef560a462c483bf534eda43f91bb01a470b1b7610920565b60009055565b6040517fa45f47fdea8a1efdd9029a5691c7f759c32b7c698632b563573e155625d1693390600090a1565b600054610100900460ff16158080156102b45750600054600160ff909116105b806102ce5750303b1580156102ce575060005460ff166001145b61035a576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602e60248201527f496e697469616c697a61626c653a20636f6e747261637420697320616c72656160448201527f647920696e697469616c697a6564000000000000000000000000000000000000606482015260840161022c565b600080547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0016600117905580156103b857600080547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00ff166101001790555b6103c18361061d565b8115610405576104056040518060400160405280601281526020017f496e697469616c697a65722070617573656400000000000000000000000000008152506106d8565b801561046857600080547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00ff169055604051600181527f7f26b83ff96e1f2b6a682f133852f6798a09c465da95921460cefb38474024989060200160405180910390a15b505050565b60006104a161049d60017fd30e835d3f35624761057ff5b27d558f97bd5be034621e62240e5c0b784abe69610920565b5490565b905090565b60006104a161049d60017f54176ff9944c4784e5857ec4e5ef560a462c483bf534eda43f91bb01a470b1b7610920565b6104de61046d565b73ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff1614610598576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602960248201527f5375706572636861696e436f6e6669673a206f6e6c7920677561726469616e2060448201527f63616e2070617573650000000000000000000000000000000000000000000000606482015260840161022c565b6105a1816106d8565b50565b6105cf60017f54176ff9944c4784e5857ec4e5ef560a462c483bf534eda43f91bb01a470b1b7610920565b81565b6105cf60017fd30e835d3f35624761057ff5b27d558f97bd5be034621e62240e5c0b784abe69610920565b73ffffffffffffffffffffffffffffffffffffffff163b151590565b9055565b61065061064b60017fd30e835d3f35624761057ff5b27d558f97bd5be034621e62240e5c0b784abe69610920565b829055565b60006040805173ffffffffffffffffffffffffffffffffffffffff841660208201527f7b743789cff01dafdeae47739925425aab5dfd02d0c8229e4a508bcd2b9f42bb9101604080517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0818403018152908290526106cd91610808565b60405180910390a250565b61070c61070660017f54176ff9944c4784e5857ec4e5ef560a462c483bf534eda43f91bb01a470b1b7610920565b60019055565b7fc32e6d5d6d1de257f64eac19ddb1f700ba13527983849c9486b1ab007ea283818160405161073b9190610808565b60405180910390a150565b6000806040838503121561075957600080fd5b823573ffffffffffffffffffffffffffffffffffffffff8116811461077d57600080fd5b91506020830135801515811461079257600080fd5b809150509250929050565b6000815180845260005b818110156107c3576020818501810151868301820152016107a7565b818111156107d5576000602083870101525b50601f017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0169290920160200192915050565b60208152600061081b602083018461079d565b9392505050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b60006020828403121561086357600080fd5b813567ffffffffffffffff8082111561087b57600080fd5b818401915084601f83011261088f57600080fd5b8135818111156108a1576108a1610822565b604051601f82017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0908116603f011681019083821181831017156108e7576108e7610822565b8160405282815287602084870101111561090057600080fd5b826020860160208301376000928101602001929092525095945050505050565b600082821015610959577f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b50039056fea164736f6c634300080f000a", - "deployedCode": "0x608060405234801561001057600080fd5b50600436106100885760003560e01c80635c975abb1161005b5780635c975abb146101255780636da663551461013d5780637fbf7b6a14610150578063c23a451a1461016657600080fd5b80633f4ba83a1461008d578063400ada7514610097578063452a9320146100aa57806354fd4d50146100dc575b600080fd5b61009561016e565b005b6100956100a5366004610746565b610294565b6100b261046d565b60405173ffffffffffffffffffffffffffffffffffffffff90911681526020015b60405180910390f35b6101186040518060400160405280600581526020017f312e312e3000000000000000000000000000000000000000000000000000000081525081565b6040516100d39190610808565b61012d6104a6565b60405190151581526020016100d3565b61009561014b366004610851565b6104d6565b6101586105a4565b6040519081526020016100d3565b6101586105d2565b61017661046d565b73ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff1614610235576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602b60248201527f5375706572636861696e436f6e6669673a206f6e6c7920677561726469616e2060448201527f63616e20756e706175736500000000000000000000000000000000000000000060648201526084015b60405180910390fd5b61026961026360017f54176ff9944c4784e5857ec4e5ef560a462c483bf534eda43f91bb01a470b1b7610920565b60009055565b6040517fa45f47fdea8a1efdd9029a5691c7f759c32b7c698632b563573e155625d1693390600090a1565b600054610100900460ff16158080156102b45750600054600160ff909116105b806102ce5750303b1580156102ce575060005460ff166001145b61035a576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602e60248201527f496e697469616c697a61626c653a20636f6e747261637420697320616c72656160448201527f647920696e697469616c697a6564000000000000000000000000000000000000606482015260840161022c565b600080547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0016600117905580156103b857600080547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00ff166101001790555b6103c18361061d565b8115610405576104056040518060400160405280601281526020017f496e697469616c697a65722070617573656400000000000000000000000000008152506106d8565b801561046857600080547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00ff169055604051600181527f7f26b83ff96e1f2b6a682f133852f6798a09c465da95921460cefb38474024989060200160405180910390a15b505050565b60006104a161049d60017fd30e835d3f35624761057ff5b27d558f97bd5be034621e62240e5c0b784abe69610920565b5490565b905090565b60006104a161049d60017f54176ff9944c4784e5857ec4e5ef560a462c483bf534eda43f91bb01a470b1b7610920565b6104de61046d565b73ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff1614610598576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602960248201527f5375706572636861696e436f6e6669673a206f6e6c7920677561726469616e2060448201527f63616e2070617573650000000000000000000000000000000000000000000000606482015260840161022c565b6105a1816106d8565b50565b6105cf60017f54176ff9944c4784e5857ec4e5ef560a462c483bf534eda43f91bb01a470b1b7610920565b81565b6105cf60017fd30e835d3f35624761057ff5b27d558f97bd5be034621e62240e5c0b784abe69610920565b73ffffffffffffffffffffffffffffffffffffffff163b151590565b9055565b61065061064b60017fd30e835d3f35624761057ff5b27d558f97bd5be034621e62240e5c0b784abe69610920565b829055565b60006040805173ffffffffffffffffffffffffffffffffffffffff841660208201527f7b743789cff01dafdeae47739925425aab5dfd02d0c8229e4a508bcd2b9f42bb9101604080517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0818403018152908290526106cd91610808565b60405180910390a250565b61070c61070660017f54176ff9944c4784e5857ec4e5ef560a462c483bf534eda43f91bb01a470b1b7610920565b60019055565b7fc32e6d5d6d1de257f64eac19ddb1f700ba13527983849c9486b1ab007ea283818160405161073b9190610808565b60405180910390a150565b6000806040838503121561075957600080fd5b823573ffffffffffffffffffffffffffffffffffffffff8116811461077d57600080fd5b91506020830135801515811461079257600080fd5b809150509250929050565b6000815180845260005b818110156107c3576020818501810151868301820152016107a7565b818111156107d5576000602083870101525b50601f017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0169290920160200192915050565b60208152600061081b602083018461079d565b9392505050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b60006020828403121561086357600080fd5b813567ffffffffffffffff8082111561087b57600080fd5b818401915084601f83011261088f57600080fd5b8135818111156108a1576108a1610822565b604051601f82017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0908116603f011681019083821181831017156108e7576108e7610822565b8160405282815287602084870101111561090057600080fd5b826020860160208301376000928101602001929092525095945050505050565b600082821015610959577f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b50039056fea164736f6c634300080f000a", - "initialized": true, - "kind": "Create", - "newBalance": 0, - "oldBalance": 0, - "reverted": false, - "storageAccesses": [ - { - "account": "0x068E44eB31e111028c41598E4535be7468674D0A", - "isWrite": false, - "newValue": "0x0000000000000000000000000000000000000000000000000000000000000000", - "previousValue": "0x0000000000000000000000000000000000000000000000000000000000000000", - "reverted": false, - "slot": "0x0000000000000000000000000000000000000000000000000000000000000000" - }, - { - "account": "0x068E44eB31e111028c41598E4535be7468674D0A", - "isWrite": false, - "newValue": "0x0000000000000000000000000000000000000000000000000000000000000000", - "previousValue": "0x0000000000000000000000000000000000000000000000000000000000000000", - "reverted": false, - "slot": "0x0000000000000000000000000000000000000000000000000000000000000000" - }, - { - "account": "0x068E44eB31e111028c41598E4535be7468674D0A", - "isWrite": false, - "newValue": "0x0000000000000000000000000000000000000000000000000000000000000000", - "previousValue": "0x0000000000000000000000000000000000000000000000000000000000000000", - "reverted": false, - "slot": "0x0000000000000000000000000000000000000000000000000000000000000000" - }, - { - "account": "0x068E44eB31e111028c41598E4535be7468674D0A", - "isWrite": true, - "newValue": "0x0000000000000000000000000000000000000000000000000000000000000001", - "previousValue": "0x0000000000000000000000000000000000000000000000000000000000000000", - "reverted": false, - "slot": "0x0000000000000000000000000000000000000000000000000000000000000000" - }, - { - "account": "0x068E44eB31e111028c41598E4535be7468674D0A", - "isWrite": false, - "newValue": "0x0000000000000000000000000000000000000000000000000000000000000001", - "previousValue": "0x0000000000000000000000000000000000000000000000000000000000000001", - "reverted": false, - "slot": "0x0000000000000000000000000000000000000000000000000000000000000000" - }, - { - "account": "0x068E44eB31e111028c41598E4535be7468674D0A", - "isWrite": true, - "newValue": "0x0000000000000000000000000000000000000000000000000000000000000101", - "previousValue": "0x0000000000000000000000000000000000000000000000000000000000000001", - "reverted": false, - "slot": "0x0000000000000000000000000000000000000000000000000000000000000000" - }, - { - "account": "0x068E44eB31e111028c41598E4535be7468674D0A", - "isWrite": true, - "newValue": "0x0000000000000000000000000000000000000000000000000000000000000000", - "previousValue": "0x0000000000000000000000000000000000000000000000000000000000000000", - "reverted": false, - "slot": "0xd30e835d3f35624761057ff5b27d558f97bd5be034621e62240e5c0b784abe68" - }, - { - "account": "0x068E44eB31e111028c41598E4535be7468674D0A", - "isWrite": false, - "newValue": "0x0000000000000000000000000000000000000000000000000000000000000101", - "previousValue": "0x0000000000000000000000000000000000000000000000000000000000000101", - "reverted": false, - "slot": "0x0000000000000000000000000000000000000000000000000000000000000000" - }, - { - "account": "0x068E44eB31e111028c41598E4535be7468674D0A", - "isWrite": true, - "newValue": "0x0000000000000000000000000000000000000000000000000000000000000001", - "previousValue": "0x0000000000000000000000000000000000000000000000000000000000000101", - "reverted": false, - "slot": "0x0000000000000000000000000000000000000000000000000000000000000000" - } - ], - "value": 0 - }, - { - "accessor": "0x1804c8AB1F12E6bbf3894d4083f33e07309d1f38", - "account": "0x068E44eB31e111028c41598E4535be7468674D0A", - "chainInfo": { - "chainId": 31337, - "forkId": 0 - }, - "data": "0x452a9320", - "deployedCode": "0x", - "initialized": true, - "kind": "StaticCall", - "newBalance": 0, - "oldBalance": 0, - "reverted": false, - "storageAccesses": [ - { - "account": "0x068E44eB31e111028c41598E4535be7468674D0A", - "isWrite": false, - "newValue": "0x0000000000000000000000000000000000000000000000000000000000000000", - "previousValue": "0x0000000000000000000000000000000000000000000000000000000000000000", - "reverted": false, - "slot": "0xd30e835d3f35624761057ff5b27d558f97bd5be034621e62240e5c0b784abe68" - } - ], - "value": 0 - }, - { - "accessor": "0x7FA9385bE102ac3EAc297483Dd6233D62b3e1496", - "account": "0x7109709ECfa91a80626fF3989D68f67F5b1DD12D", - "chainInfo": { - "chainId": 31337, - "forkId": 0 - }, - "data": "0x", - "deployedCode": "0x", - "initialized": true, - "kind": "Resume", - "newBalance": 0, - "oldBalance": 0, - "reverted": false, - "storageAccesses": [], - "value": 0 - }, - { - "accessor": "0x7FA9385bE102ac3EAc297483Dd6233D62b3e1496", - "account": "0x7109709ECfa91a80626fF3989D68f67F5b1DD12D", - "chainInfo": { - "chainId": 31337, - "forkId": 0 - }, - "data": "0x", - "deployedCode": "0x", - "initialized": true, - "kind": "Resume", - "newBalance": 0, - "oldBalance": 0, - "reverted": false, - "storageAccesses": [], - "value": 0 - }, - { - "accessor": "0x7FA9385bE102ac3EAc297483Dd6233D62b3e1496", - "account": "0x7109709ECfa91a80626fF3989D68f67F5b1DD12D", - "chainInfo": { - "chainId": 31337, - "forkId": 0 - }, - "data": "0x", - "deployedCode": "0x", - "initialized": true, - "kind": "Resume", - "newBalance": 0, - "oldBalance": 0, - "reverted": false, - "storageAccesses": [], - "value": 0 - }, - { - "accessor": "0x1804c8AB1F12E6bbf3894d4083f33e07309d1f38", - "account": "0x9568d36E291c2C4c34fa5593fcE73715abEf6F9c", - "chainInfo": { - "chainId": 31337, - "forkId": 0 - }, - "data": "0xfa60f9b2", - "deployedCode": "0x", - "initialized": true, - "kind": "StaticCall", - "newBalance": 0, - "oldBalance": 0, - "reverted": false, - "storageAccesses": [ - { - "account": "0x9568d36E291c2C4c34fa5593fcE73715abEf6F9c", - "isWrite": false, - "newValue": "0x0000000000000000000000009965507d1a55bcc2695c58ba16fb37d819b0a4dc", - "previousValue": "0x0000000000000000000000009965507d1a55bcc2695c58ba16fb37d819b0a4dc", - "reverted": false, - "slot": "0x000000000000000000000000000000000000000000000000000000000000000f" - } - ], - "value": 0 - }, - { - "accessor": "0x1804c8AB1F12E6bbf3894d4083f33e07309d1f38", - "account": "0x7d039be7F9b5190147621b02e82B250e1D748e02", - "chainInfo": { - "chainId": 31337, - "forkId": 0 - }, - "data": "0x6a761202000000000000000000000000db8cff278adccf9e9b5da745b44e754fc4ee3c7600000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000140000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000026000000000000000000000000000000000000000000000000000000000000000e49623609d000000000000000000000000deb1e9a6be7baf84208bb6e10ac9f9bbe1d70809000000000000000000000000068e44eb31e111028c41598e4535be7468674d0a00000000000000000000000000000000000000000000000000000000000000600000000000000000000000000000000000000000000000000000000000000044400ada750000000000000000000000009965507d1a55bcc2695c58ba16fb37d819b0a4dc0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000410000000000000000000000001804c8ab1f12e6bbf3894d4083f33e07309d1f3800000000000000000000000000000000000000000000000000000000000000000100000000000000000000000000000000000000000000000000000000000000", - "deployedCode": "0x", - "initialized": true, - "kind": "Call", - "newBalance": 0, - "oldBalance": 0, - "reverted": false, - "storageAccesses": [ - { - "account": "0x7d039be7F9b5190147621b02e82B250e1D748e02", - "isWrite": false, - "newValue": "0x00000000000000000000000090193c961a926261b756d1e5bb255e67ff9498a1", - "previousValue": "0x00000000000000000000000090193c961a926261b756d1e5bb255e67ff9498a1", - "reverted": false, - "slot": "0x0000000000000000000000000000000000000000000000000000000000000000" - } - ], - "value": 0 - }, - { - "accessor": "0x1804c8AB1F12E6bbf3894d4083f33e07309d1f38", - "account": "0x90193C961A926261B756D1E5bb255e67ff9498A1", - "chainInfo": { - "chainId": 31337, - "forkId": 0 - }, - "data": "0x6a761202000000000000000000000000db8cff278adccf9e9b5da745b44e754fc4ee3c7600000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000140000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000026000000000000000000000000000000000000000000000000000000000000000e49623609d000000000000000000000000deb1e9a6be7baf84208bb6e10ac9f9bbe1d70809000000000000000000000000068e44eb31e111028c41598e4535be7468674d0a00000000000000000000000000000000000000000000000000000000000000600000000000000000000000000000000000000000000000000000000000000044400ada750000000000000000000000009965507d1a55bcc2695c58ba16fb37d819b0a4dc0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000410000000000000000000000001804c8ab1f12e6bbf3894d4083f33e07309d1f3800000000000000000000000000000000000000000000000000000000000000000100000000000000000000000000000000000000000000000000000000000000", - "deployedCode": "0x", - "initialized": true, - "kind": "DelegateCall", - "newBalance": 0, - "oldBalance": 0, - "reverted": false, - "storageAccesses": [ - { - "account": "0x7d039be7F9b5190147621b02e82B250e1D748e02", - "isWrite": false, - "newValue": "0x0000000000000000000000000000000000000000000000000000000000000000", - "previousValue": "0x0000000000000000000000000000000000000000000000000000000000000000", - "reverted": false, - "slot": "0x0000000000000000000000000000000000000000000000000000000000000005" - }, - { - "account": "0x7d039be7F9b5190147621b02e82B250e1D748e02", - "isWrite": false, - "newValue": "0x0000000000000000000000000000000000000000000000000000000000000000", - "previousValue": "0x0000000000000000000000000000000000000000000000000000000000000000", - "reverted": false, - "slot": "0x0000000000000000000000000000000000000000000000000000000000000005" - }, - { - "account": "0x7d039be7F9b5190147621b02e82B250e1D748e02", - "isWrite": true, - "newValue": "0x0000000000000000000000000000000000000000000000000000000000000001", - "previousValue": "0x0000000000000000000000000000000000000000000000000000000000000000", - "reverted": false, - "slot": "0x0000000000000000000000000000000000000000000000000000000000000005" - }, - { - "account": "0x7d039be7F9b5190147621b02e82B250e1D748e02", - "isWrite": false, - "newValue": "0x0000000000000000000000000000000000000000000000000000000000000001", - "previousValue": "0x0000000000000000000000000000000000000000000000000000000000000001", - "reverted": false, - "slot": "0x0000000000000000000000000000000000000000000000000000000000000004" - }, - { - "account": "0x7d039be7F9b5190147621b02e82B250e1D748e02", - "isWrite": false, - "newValue": "0x0000000000000000000000000000000000000000000000000000000000000001", - "previousValue": "0x0000000000000000000000000000000000000000000000000000000000000001", - "reverted": false, - "slot": "0xd1b0d319c6526317dce66989b393dcfb4435c9a65e399a088b63bbf65d7aee32" - }, - { - "account": "0x7d039be7F9b5190147621b02e82B250e1D748e02", - "isWrite": false, - "newValue": "0x0000000000000000000000000000000000000000000000000000000000000000", - "previousValue": "0x0000000000000000000000000000000000000000000000000000000000000000", - "reverted": false, - "slot": "0x4a204f620c8c5ccdca3fd54d003badd85ba500436a431f0cbda4f558c93c34c8" - } - ], - "value": 0 - }, - { - "accessor": "0x7d039be7F9b5190147621b02e82B250e1D748e02", - "account": "0xDB8cFf278adCCF9E9b5da745B44E754fC4EE3C76", - "chainInfo": { - "chainId": 31337, - "forkId": 0 - }, - "data": "0x9623609d000000000000000000000000deb1e9a6be7baf84208bb6e10ac9f9bbe1d70809000000000000000000000000068e44eb31e111028c41598e4535be7468674d0a00000000000000000000000000000000000000000000000000000000000000600000000000000000000000000000000000000000000000000000000000000044400ada750000000000000000000000009965507d1a55bcc2695c58ba16fb37d819b0a4dc000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000", - "deployedCode": "0x", - "initialized": true, - "kind": "Call", - "newBalance": 0, - "oldBalance": 0, - "reverted": false, - "storageAccesses": [ - { - "account": "0xDB8cFf278adCCF9E9b5da745B44E754fC4EE3C76", - "isWrite": false, - "newValue": "0x0000000000000000000000007d039be7f9b5190147621b02e82b250e1d748e02", - "previousValue": "0x0000000000000000000000007d039be7f9b5190147621b02e82b250e1d748e02", - "reverted": false, - "slot": "0x0000000000000000000000000000000000000000000000000000000000000000" - }, - { - "account": "0xDB8cFf278adCCF9E9b5da745B44E754fC4EE3C76", - "isWrite": false, - "newValue": "0x0000000000000000000000000000000000000000000000000000000000000000", - "previousValue": "0x0000000000000000000000000000000000000000000000000000000000000000", - "reverted": false, - "slot": "0x070dca21862da24de5bcba7acd697f207bda1c8caae3812d68f0baee0dd32f38" - } - ], - "value": 0 - }, - { - "accessor": "0xDB8cFf278adCCF9E9b5da745B44E754fC4EE3C76", - "account": "0xDEb1E9a6Be7Baf84208BB6E10aC9F9bbE1D70809", - "chainInfo": { - "chainId": 31337, - "forkId": 0 - }, - "data": "0x4f1ef286000000000000000000000000068e44eb31e111028c41598e4535be7468674d0a00000000000000000000000000000000000000000000000000000000000000400000000000000000000000000000000000000000000000000000000000000044400ada750000000000000000000000009965507d1a55bcc2695c58ba16fb37d819b0a4dc000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000", - "deployedCode": "0x", - "initialized": true, - "kind": "Call", - "newBalance": 0, - "oldBalance": 0, - "reverted": false, - "storageAccesses": [ - { - "account": "0xDEb1E9a6Be7Baf84208BB6E10aC9F9bbE1D70809", - "isWrite": false, - "newValue": "0x000000000000000000000000db8cff278adccf9e9b5da745b44e754fc4ee3c76", - "previousValue": "0x000000000000000000000000db8cff278adccf9e9b5da745b44e754fc4ee3c76", - "reverted": false, - "slot": "0xb53127684a568b3173ae13b9f8a6016e243e63b6e8ee1178d6a717850b5d6103" - }, - { - "account": "0xDEb1E9a6Be7Baf84208BB6E10aC9F9bbE1D70809", - "isWrite": true, - "newValue": "0x000000000000000000000000068e44eb31e111028c41598e4535be7468674d0a", - "previousValue": "0x0000000000000000000000000000000000000000000000000000000000000000", - "reverted": false, - "slot": "0x360894a13ba1a3210667c828492db98dca3e2076cc3735a920a3ca505d382bbc" - } - ], - "value": 0 - }, - { - "accessor": "0xDB8cFf278adCCF9E9b5da745B44E754fC4EE3C76", - "account": "0x068E44eB31e111028c41598E4535be7468674D0A", - "chainInfo": { - "chainId": 31337, - "forkId": 0 - }, - "data": "0x400ada750000000000000000000000009965507d1a55bcc2695c58ba16fb37d819b0a4dc0000000000000000000000000000000000000000000000000000000000000000", - "deployedCode": "0x", - "initialized": true, - "kind": "DelegateCall", - "newBalance": 0, - "oldBalance": 0, - "reverted": false, - "storageAccesses": [ - { - "account": "0xDEb1E9a6Be7Baf84208BB6E10aC9F9bbE1D70809", - "isWrite": false, - "newValue": "0x0000000000000000000000000000000000000000000000000000000000000000", - "previousValue": "0x0000000000000000000000000000000000000000000000000000000000000000", - "reverted": false, - "slot": "0x0000000000000000000000000000000000000000000000000000000000000000" - }, - { - "account": "0xDEb1E9a6Be7Baf84208BB6E10aC9F9bbE1D70809", - "isWrite": false, - "newValue": "0x0000000000000000000000000000000000000000000000000000000000000000", - "previousValue": "0x0000000000000000000000000000000000000000000000000000000000000000", - "reverted": false, - "slot": "0x0000000000000000000000000000000000000000000000000000000000000000" - }, - { - "account": "0xDEb1E9a6Be7Baf84208BB6E10aC9F9bbE1D70809", - "isWrite": false, - "newValue": "0x0000000000000000000000000000000000000000000000000000000000000000", - "previousValue": "0x0000000000000000000000000000000000000000000000000000000000000000", - "reverted": false, - "slot": "0x0000000000000000000000000000000000000000000000000000000000000000" - }, - { - "account": "0xDEb1E9a6Be7Baf84208BB6E10aC9F9bbE1D70809", - "isWrite": true, - "newValue": "0x0000000000000000000000000000000000000000000000000000000000000001", - "previousValue": "0x0000000000000000000000000000000000000000000000000000000000000000", - "reverted": false, - "slot": "0x0000000000000000000000000000000000000000000000000000000000000000" - }, - { - "account": "0xDEb1E9a6Be7Baf84208BB6E10aC9F9bbE1D70809", - "isWrite": false, - "newValue": "0x0000000000000000000000000000000000000000000000000000000000000001", - "previousValue": "0x0000000000000000000000000000000000000000000000000000000000000001", - "reverted": false, - "slot": "0x0000000000000000000000000000000000000000000000000000000000000000" - }, - { - "account": "0xDEb1E9a6Be7Baf84208BB6E10aC9F9bbE1D70809", - "isWrite": true, - "newValue": "0x0000000000000000000000000000000000000000000000000000000000000101", - "previousValue": "0x0000000000000000000000000000000000000000000000000000000000000001", - "reverted": false, - "slot": "0x0000000000000000000000000000000000000000000000000000000000000000" - }, - { - "account": "0xDEb1E9a6Be7Baf84208BB6E10aC9F9bbE1D70809", - "isWrite": true, - "newValue": "0x0000000000000000000000009965507d1a55bcc2695c58ba16fb37d819b0a4dc", - "previousValue": "0x0000000000000000000000000000000000000000000000000000000000000000", - "reverted": false, - "slot": "0xd30e835d3f35624761057ff5b27d558f97bd5be034621e62240e5c0b784abe68" - }, - { - "account": "0xDEb1E9a6Be7Baf84208BB6E10aC9F9bbE1D70809", - "isWrite": false, - "newValue": "0x0000000000000000000000000000000000000000000000000000000000000101", - "previousValue": "0x0000000000000000000000000000000000000000000000000000000000000101", - "reverted": false, - "slot": "0x0000000000000000000000000000000000000000000000000000000000000000" - }, - { - "account": "0xDEb1E9a6Be7Baf84208BB6E10aC9F9bbE1D70809", - "isWrite": true, - "newValue": "0x0000000000000000000000000000000000000000000000000000000000000001", - "previousValue": "0x0000000000000000000000000000000000000000000000000000000000000101", - "reverted": false, - "slot": "0x0000000000000000000000000000000000000000000000000000000000000000" - } - ], - "value": 0 - }, - { - "accessor": "0x1804c8AB1F12E6bbf3894d4083f33e07309d1f38", - "account": "0x9568d36E291c2C4c34fa5593fcE73715abEf6F9c", - "chainInfo": { - "chainId": 31337, - "forkId": 0 - }, - "data": "0xfa60f9b2", - "deployedCode": "0x", - "initialized": true, - "kind": "StaticCall", - "newBalance": 0, - "oldBalance": 0, - "reverted": false, - "storageAccesses": [ - { - "account": "0x9568d36E291c2C4c34fa5593fcE73715abEf6F9c", - "isWrite": false, - "newValue": "0x0000000000000000000000009965507d1a55bcc2695c58ba16fb37d819b0a4dc", - "previousValue": "0x0000000000000000000000009965507d1a55bcc2695c58ba16fb37d819b0a4dc", - "reverted": false, - "slot": "0x000000000000000000000000000000000000000000000000000000000000000f" - } - ], - "value": 0 - }, - { - "accessor": "0x1804c8AB1F12E6bbf3894d4083f33e07309d1f38", - "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": "0x1804c8AB1F12E6bbf3894d4083f33e07309d1f38", - "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": "0xDEb1E9a6Be7Baf84208BB6E10aC9F9bbE1D70809", - "chainInfo": { - "chainId": 31337, - "forkId": 0 - }, - "data": "0x5c975abb", - "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": "0x1804c8AB1F12E6bbf3894d4083f33e07309d1f38", - "account": "0x068E44eB31e111028c41598E4535be7468674D0A", - "chainInfo": { - "chainId": 31337, - "forkId": 0 - }, - "data": "0x5c975abb", - "deployedCode": "0x", - "initialized": true, - "kind": "DelegateCall", - "newBalance": 0, - "oldBalance": 0, - "reverted": false, - "storageAccesses": [ - { - "account": "0xDEb1E9a6Be7Baf84208BB6E10aC9F9bbE1D70809", - "isWrite": false, - "newValue": "0x0000000000000000000000000000000000000000000000000000000000000000", - "previousValue": "0x0000000000000000000000000000000000000000000000000000000000000000", - "reverted": false, - "slot": "0x54176ff9944c4784e5857ec4e5ef560a462c483bf534eda43f91bb01a470b1b6" - } - ], - "value": 0 - }, - { - "accessor": "0x7FA9385bE102ac3EAc297483Dd6233D62b3e1496", - "account": "0x7109709ECfa91a80626fF3989D68f67F5b1DD12D", - "chainInfo": { - "chainId": 31337, - "forkId": 0 - }, - "data": "0x", - "deployedCode": "0x", - "initialized": true, - "kind": "Resume", - "newBalance": 0, - "oldBalance": 0, - "reverted": false, - "storageAccesses": [], - "value": 0 - }, - { - "accessor": "0x7FA9385bE102ac3EAc297483Dd6233D62b3e1496", - "account": "0x7109709ECfa91a80626fF3989D68f67F5b1DD12D", - "chainInfo": { - "chainId": 31337, - "forkId": 0 - }, - "data": "0x", - "deployedCode": "0x", - "initialized": true, - "kind": "Resume", - "newBalance": 0, - "oldBalance": 0, - "reverted": false, - "storageAccesses": [], - "value": 0 - }, - { - "accessor": "0x1804c8AB1F12E6bbf3894d4083f33e07309d1f38", - "account": "0x416C42991d05b31E9A6dC209e91AD22b79D87Ae6", - "chainInfo": { - "chainId": 31337, - "forkId": 0 - }, - "data": "0x608060405234801561001057600080fd5b5060405161091f38038061091f83398101604081905261002f916100b5565b6100388161003e565b506100e5565b60006100566000805160206108ff8339815191525490565b6000805160206108ff833981519152838155604080516001600160a01b0380851682528616602082015292935090917f7e644d79422f17c01e4894b5f4f588d331ebfa28653d42ae832dc59e38c9798f910160405180910390a1505050565b6000602082840312156100c757600080fd5b81516001600160a01b03811681146100de57600080fd5b9392505050565b61080b806100f46000396000f3fe60806040526004361061005e5760003560e01c80635c60da1b116100435780635c60da1b146100be5780638f283970146100f8578063f851a440146101185761006d565b80633659cfe6146100755780634f1ef286146100955761006d565b3661006d5761006b61012d565b005b61006b61012d565b34801561008157600080fd5b5061006b6100903660046106dd565b610224565b6100a86100a33660046106f8565b610296565b6040516100b5919061077b565b60405180910390f35b3480156100ca57600080fd5b506100d3610419565b60405173ffffffffffffffffffffffffffffffffffffffff90911681526020016100b5565b34801561010457600080fd5b5061006b6101133660046106dd565b6104b0565b34801561012457600080fd5b506100d3610517565b60006101577f360894a13ba1a3210667c828492db98dca3e2076cc3735a920a3ca505d382bbc5490565b905073ffffffffffffffffffffffffffffffffffffffff8116610201576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602560248201527f50726f78793a20696d706c656d656e746174696f6e206e6f7420696e6974696160448201527f6c697a656400000000000000000000000000000000000000000000000000000060648201526084015b60405180910390fd5b3660008037600080366000845af43d6000803e8061021e573d6000fd5b503d6000f35b7fb53127684a568b3173ae13b9f8a6016e243e63b6e8ee1178d6a717850b5d61035473ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff16148061027d575033155b1561028e5761028b816105a3565b50565b61028b61012d565b60606102c07fb53127684a568b3173ae13b9f8a6016e243e63b6e8ee1178d6a717850b5d61035490565b73ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff1614806102f7575033155b1561040a57610305846105a3565b6000808573ffffffffffffffffffffffffffffffffffffffff16858560405161032f9291906107ee565b600060405180830381855af49150503d806000811461036a576040519150601f19603f3d011682016040523d82523d6000602084013e61036f565b606091505b509150915081610401576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152603960248201527f50726f78793a2064656c656761746563616c6c20746f206e657720696d706c6560448201527f6d656e746174696f6e20636f6e7472616374206661696c65640000000000000060648201526084016101f8565b91506104129050565b61041261012d565b9392505050565b60006104437fb53127684a568b3173ae13b9f8a6016e243e63b6e8ee1178d6a717850b5d61035490565b73ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff16148061047a575033155b156104a557507f360894a13ba1a3210667c828492db98dca3e2076cc3735a920a3ca505d382bbc5490565b6104ad61012d565b90565b7fb53127684a568b3173ae13b9f8a6016e243e63b6e8ee1178d6a717850b5d61035473ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff161480610509575033155b1561028e5761028b8161060c565b60006105417fb53127684a568b3173ae13b9f8a6016e243e63b6e8ee1178d6a717850b5d61035490565b73ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff161480610578575033155b156104a557507fb53127684a568b3173ae13b9f8a6016e243e63b6e8ee1178d6a717850b5d61035490565b7f360894a13ba1a3210667c828492db98dca3e2076cc3735a920a3ca505d382bbc81815560405173ffffffffffffffffffffffffffffffffffffffff8316907fbc7cd75a20ee27fd9adebab32041f755214dbc6bffa90cc0225b39da2e5c2d3b90600090a25050565b60006106367fb53127684a568b3173ae13b9f8a6016e243e63b6e8ee1178d6a717850b5d61035490565b7fb53127684a568b3173ae13b9f8a6016e243e63b6e8ee1178d6a717850b5d61038381556040805173ffffffffffffffffffffffffffffffffffffffff80851682528616602082015292935090917f7e644d79422f17c01e4894b5f4f588d331ebfa28653d42ae832dc59e38c9798f910160405180910390a1505050565b803573ffffffffffffffffffffffffffffffffffffffff811681146106d857600080fd5b919050565b6000602082840312156106ef57600080fd5b610412826106b4565b60008060006040848603121561070d57600080fd5b610716846106b4565b9250602084013567ffffffffffffffff8082111561073357600080fd5b818601915086601f83011261074757600080fd5b81358181111561075657600080fd5b87602082850101111561076857600080fd5b6020830194508093505050509250925092565b600060208083528351808285015260005b818110156107a85785810183015185820160400152820161078c565b818111156107ba576000604083870101525b50601f017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe016929092016040019392505050565b818382376000910190815291905056fea164736f6c634300080f000ab53127684a568b3173ae13b9f8a6016e243e63b6e8ee1178d6a717850b5d6103000000000000000000000000db8cff278adccf9e9b5da745b44e754fc4ee3c76", - "deployedCode": "0x60806040526004361061005e5760003560e01c80635c60da1b116100435780635c60da1b146100be5780638f283970146100f8578063f851a440146101185761006d565b80633659cfe6146100755780634f1ef286146100955761006d565b3661006d5761006b61012d565b005b61006b61012d565b34801561008157600080fd5b5061006b6100903660046106dd565b610224565b6100a86100a33660046106f8565b610296565b6040516100b5919061077b565b60405180910390f35b3480156100ca57600080fd5b506100d3610419565b60405173ffffffffffffffffffffffffffffffffffffffff90911681526020016100b5565b34801561010457600080fd5b5061006b6101133660046106dd565b6104b0565b34801561012457600080fd5b506100d3610517565b60006101577f360894a13ba1a3210667c828492db98dca3e2076cc3735a920a3ca505d382bbc5490565b905073ffffffffffffffffffffffffffffffffffffffff8116610201576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602560248201527f50726f78793a20696d706c656d656e746174696f6e206e6f7420696e6974696160448201527f6c697a656400000000000000000000000000000000000000000000000000000060648201526084015b60405180910390fd5b3660008037600080366000845af43d6000803e8061021e573d6000fd5b503d6000f35b7fb53127684a568b3173ae13b9f8a6016e243e63b6e8ee1178d6a717850b5d61035473ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff16148061027d575033155b1561028e5761028b816105a3565b50565b61028b61012d565b60606102c07fb53127684a568b3173ae13b9f8a6016e243e63b6e8ee1178d6a717850b5d61035490565b73ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff1614806102f7575033155b1561040a57610305846105a3565b6000808573ffffffffffffffffffffffffffffffffffffffff16858560405161032f9291906107ee565b600060405180830381855af49150503d806000811461036a576040519150601f19603f3d011682016040523d82523d6000602084013e61036f565b606091505b509150915081610401576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152603960248201527f50726f78793a2064656c656761746563616c6c20746f206e657720696d706c6560448201527f6d656e746174696f6e20636f6e7472616374206661696c65640000000000000060648201526084016101f8565b91506104129050565b61041261012d565b9392505050565b60006104437fb53127684a568b3173ae13b9f8a6016e243e63b6e8ee1178d6a717850b5d61035490565b73ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff16148061047a575033155b156104a557507f360894a13ba1a3210667c828492db98dca3e2076cc3735a920a3ca505d382bbc5490565b6104ad61012d565b90565b7fb53127684a568b3173ae13b9f8a6016e243e63b6e8ee1178d6a717850b5d61035473ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff161480610509575033155b1561028e5761028b8161060c565b60006105417fb53127684a568b3173ae13b9f8a6016e243e63b6e8ee1178d6a717850b5d61035490565b73ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff161480610578575033155b156104a557507fb53127684a568b3173ae13b9f8a6016e243e63b6e8ee1178d6a717850b5d61035490565b7f360894a13ba1a3210667c828492db98dca3e2076cc3735a920a3ca505d382bbc81815560405173ffffffffffffffffffffffffffffffffffffffff8316907fbc7cd75a20ee27fd9adebab32041f755214dbc6bffa90cc0225b39da2e5c2d3b90600090a25050565b60006106367fb53127684a568b3173ae13b9f8a6016e243e63b6e8ee1178d6a717850b5d61035490565b7fb53127684a568b3173ae13b9f8a6016e243e63b6e8ee1178d6a717850b5d61038381556040805173ffffffffffffffffffffffffffffffffffffffff80851682528616602082015292935090917f7e644d79422f17c01e4894b5f4f588d331ebfa28653d42ae832dc59e38c9798f910160405180910390a1505050565b803573ffffffffffffffffffffffffffffffffffffffff811681146106d857600080fd5b919050565b6000602082840312156106ef57600080fd5b610412826106b4565b60008060006040848603121561070d57600080fd5b610716846106b4565b9250602084013567ffffffffffffffff8082111561073357600080fd5b818601915086601f83011261074757600080fd5b81358181111561075657600080fd5b87602082850101111561076857600080fd5b6020830194508093505050509250925092565b600060208083528351808285015260005b818110156107a85785810183015185820160400152820161078c565b818111156107ba576000604083870101525b50601f017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe016929092016040019392505050565b818382376000910190815291905056fea164736f6c634300080f000a", - "initialized": true, - "kind": "Create", - "newBalance": 0, - "oldBalance": 0, - "reverted": false, - "storageAccesses": [ - { - "account": "0x416C42991d05b31E9A6dC209e91AD22b79D87Ae6", - "isWrite": false, - "newValue": "0x0000000000000000000000000000000000000000000000000000000000000000", - "previousValue": "0x0000000000000000000000000000000000000000000000000000000000000000", - "reverted": false, - "slot": "0xb53127684a568b3173ae13b9f8a6016e243e63b6e8ee1178d6a717850b5d6103" - }, - { - "account": "0x416C42991d05b31E9A6dC209e91AD22b79D87Ae6", - "isWrite": true, - "newValue": "0x000000000000000000000000db8cff278adccf9e9b5da745b44e754fc4ee3c76", - "previousValue": "0x0000000000000000000000000000000000000000000000000000000000000000", - "reverted": false, - "slot": "0xb53127684a568b3173ae13b9f8a6016e243e63b6e8ee1178d6a717850b5d6103" - } - ], - "value": 0 - }, - { - "accessor": "0x7FA9385bE102ac3EAc297483Dd6233D62b3e1496", - "account": "0x7109709ECfa91a80626fF3989D68f67F5b1DD12D", - "chainInfo": { - "chainId": 31337, - "forkId": 0 - }, - "data": "0x", - "deployedCode": "0x", - "initialized": true, - "kind": "Resume", - "newBalance": 0, - "oldBalance": 0, - "reverted": false, - "storageAccesses": [], - "value": 0 - }, - { - "accessor": "0x7FA9385bE102ac3EAc297483Dd6233D62b3e1496", - "account": "0x7109709ECfa91a80626fF3989D68f67F5b1DD12D", - "chainInfo": { - "chainId": 31337, - "forkId": 0 - }, - "data": "0x", - "deployedCode": "0x", - "initialized": true, - "kind": "Resume", - "newBalance": 0, - "oldBalance": 0, - "reverted": false, - "storageAccesses": [], - "value": 0 - }, - { - "accessor": "0x7FA9385bE102ac3EAc297483Dd6233D62b3e1496", - "account": "0x7109709ECfa91a80626fF3989D68f67F5b1DD12D", - "chainInfo": { - "chainId": 31337, - "forkId": 0 - }, - "data": "0x", - "deployedCode": "0x", - "initialized": true, - "kind": "Resume", - "newBalance": 0, - "oldBalance": 0, - "reverted": false, - "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", - "chainInfo": { - "chainId": 31337, - "forkId": 0 - }, - "data": "0x60806040523480156200001157600080fd5b506200002261dead60008062000028565b6200051c565b600054610100900460ff1615808015620000495750600054600160ff909116105b8062000079575062000066306200017e60201b6200053f1760201c565b15801562000079575060005460ff166001145b620000e25760405162461bcd60e51b815260206004820152602e60248201527f496e697469616c697a61626c653a20636f6e747261637420697320616c72656160448201526d191e481a5b9a5d1a585b1a5e995960921b60648201526084015b60405180910390fd5b6000805460ff19166001179055801562000106576000805461ff0019166101001790555b620001106200018d565b6200011b84620001f5565b620001268362000274565b620001318262000324565b801562000178576000805461ff0019169055604051600181527f7f26b83ff96e1f2b6a682f133852f6798a09c465da95921460cefb38474024989060200160405180910390a15b50505050565b6001600160a01b03163b151590565b600054610100900460ff16620001e95760405162461bcd60e51b815260206004820152602b602482015260008051602062000f4f83398151915260448201526a6e697469616c697a696e6760a81b6064820152608401620000d9565b620001f362000385565b565b620001ff620003ec565b6001600160a01b038116620002665760405162461bcd60e51b815260206004820152602660248201527f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160448201526564647265737360d01b6064820152608401620000d9565b620002718162000448565b50565b620002ba620002a560017f4aaefe95bd84fd3f32700cf3b7566bc944b73138e41958b5785826df2aecace16200049e565b60001b826200049a60201b6200055b1760201c565b600081604051602001620002d091815260200190565b60408051601f19818403018152919052905060005b60007f1d2b0bda21d56b8bd12d4f94ebacffdfb35f5e226f84b461103bb8beab6353be83604051620003189190620004c4565b60405180910390a35050565b62000355620002a560017fe314dfc40f0025322aacc0ba8ef420b62fb3b702cf01e0cdf3d829117ac2ff1b6200049e565b6000816040516020016200036b91815260200190565b60408051601f1981840301815291905290506001620002e5565b600054610100900460ff16620003e15760405162461bcd60e51b815260206004820152602b602482015260008051602062000f4f83398151915260448201526a6e697469616c697a696e6760a81b6064820152608401620000d9565b620001f33362000448565b6033546001600160a01b03163314620001f35760405162461bcd60e51b815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e65726044820152606401620000d9565b603380546001600160a01b038381166001600160a01b0319831681179093556040519116919082907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e090600090a35050565b9055565b600082821015620004bf57634e487b7160e01b600052601160045260246000fd5b500390565b600060208083528351808285015260005b81811015620004f357858101830151858201604001528201620004d5565b8181111562000506576000604083870101525b50601f01601f1916929092016040019392505050565b610a23806200052c6000396000f3fe608060405234801561001057600080fd5b50600436106100d45760003560e01c80638da5cb5b11610081578063f2fde38b1161005b578063f2fde38b146101b8578063f7d12760146101cb578063ffa1ad74146101d357600080fd5b80638da5cb5b14610180578063d798b1ac146101a8578063dc8452cd146101b057600080fd5b80635fd579af116100b25780635fd579af14610152578063715018a6146101655780637a1ac61e1461016d57600080fd5b80630457d6f2146100d9578063206a8300146100ee57806354fd4d5014610109575b600080fd5b6100ec6100e73660046108c3565b6101db565b005b6100f66101ef565b6040519081526020015b60405180910390f35b6101456040518060400160405280600581526020017f312e302e3000000000000000000000000000000000000000000000000000000081525081565b6040516101009190610947565b6100ec6101603660046108c3565b61021d565b6100ec61022e565b6100ec61017b36600461098a565b610242565b60335460405173ffffffffffffffffffffffffffffffffffffffff9091168152602001610100565b6100f66103f7565b6100f6610430565b6100ec6101c63660046109bd565b610460565b6100f6610514565b6100f6600081565b6101e361055f565b6101ec816105e0565b50565b61021a60017f4aaefe95bd84fd3f32700cf3b7566bc944b73138e41958b5785826df2aecace16109d8565b81565b61022561055f565b6101ec81610698565b61023661055f565b6102406000610712565b565b600054610100900460ff16158080156102625750600054600160ff909116105b8061027c5750303b15801561027c575060005460ff166001145b61030d576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602e60248201527f496e697469616c697a61626c653a20636f6e747261637420697320616c72656160448201527f647920696e697469616c697a656400000000000000000000000000000000000060648201526084015b60405180910390fd5b600080547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00166001179055801561036b57600080547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00ff166101001790555b610373610789565b61037c84610460565b610385836105e0565b61038e82610698565b80156103f157600080547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00ff169055604051600181527f7f26b83ff96e1f2b6a682f133852f6798a09c465da95921460cefb38474024989060200160405180910390a15b50505050565b600061042b61042760017fe314dfc40f0025322aacc0ba8ef420b62fb3b702cf01e0cdf3d829117ac2ff1b6109d8565b5490565b905090565b600061042b61042760017f4aaefe95bd84fd3f32700cf3b7566bc944b73138e41958b5785826df2aecace16109d8565b61046861055f565b73ffffffffffffffffffffffffffffffffffffffff811661050b576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602660248201527f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160448201527f64647265737300000000000000000000000000000000000000000000000000006064820152608401610304565b6101ec81610712565b61021a60017fe314dfc40f0025322aacc0ba8ef420b62fb3b702cf01e0cdf3d829117ac2ff1b6109d8565b73ffffffffffffffffffffffffffffffffffffffff163b151590565b9055565b60335473ffffffffffffffffffffffffffffffffffffffff163314610240576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e65726044820152606401610304565b61061361060e60017f4aaefe95bd84fd3f32700cf3b7566bc944b73138e41958b5785826df2aecace16109d8565b829055565b60008160405160200161062891815260200190565b604080517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0818403018152919052905060005b60007f1d2b0bda21d56b8bd12d4f94ebacffdfb35f5e226f84b461103bb8beab6353be8360405161068c9190610947565b60405180910390a35050565b6106c661060e60017fe314dfc40f0025322aacc0ba8ef420b62fb3b702cf01e0cdf3d829117ac2ff1b6109d8565b6000816040516020016106db91815260200190565b604080517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe08184030181529190529050600161065b565b6033805473ffffffffffffffffffffffffffffffffffffffff8381167fffffffffffffffffffffffff0000000000000000000000000000000000000000831681179093556040519116919082907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e090600090a35050565b600054610100900460ff16610820576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602b60248201527f496e697469616c697a61626c653a20636f6e7472616374206973206e6f74206960448201527f6e697469616c697a696e670000000000000000000000000000000000000000006064820152608401610304565b610240600054610100900460ff166108ba576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602b60248201527f496e697469616c697a61626c653a20636f6e7472616374206973206e6f74206960448201527f6e697469616c697a696e670000000000000000000000000000000000000000006064820152608401610304565b61024033610712565b6000602082840312156108d557600080fd5b5035919050565b6000815180845260005b81811015610902576020818501810151868301820152016108e6565b81811115610914576000602083870101525b50601f017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0169290920160200192915050565b60208152600061095a60208301846108dc565b9392505050565b803573ffffffffffffffffffffffffffffffffffffffff8116811461098557600080fd5b919050565b60008060006060848603121561099f57600080fd5b6109a884610961565b95602085013595506040909401359392505050565b6000602082840312156109cf57600080fd5b61095a82610961565b600082821015610a11577f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b50039056fea164736f6c634300080f000a496e697469616c697a61626c653a20636f6e7472616374206973206e6f742069", - "deployedCode": "0x608060405234801561001057600080fd5b50600436106100d45760003560e01c80638da5cb5b11610081578063f2fde38b1161005b578063f2fde38b146101b8578063f7d12760146101cb578063ffa1ad74146101d357600080fd5b80638da5cb5b14610180578063d798b1ac146101a8578063dc8452cd146101b057600080fd5b80635fd579af116100b25780635fd579af14610152578063715018a6146101655780637a1ac61e1461016d57600080fd5b80630457d6f2146100d9578063206a8300146100ee57806354fd4d5014610109575b600080fd5b6100ec6100e73660046108c3565b6101db565b005b6100f66101ef565b6040519081526020015b60405180910390f35b6101456040518060400160405280600581526020017f312e302e3000000000000000000000000000000000000000000000000000000081525081565b6040516101009190610947565b6100ec6101603660046108c3565b61021d565b6100ec61022e565b6100ec61017b36600461098a565b610242565b60335460405173ffffffffffffffffffffffffffffffffffffffff9091168152602001610100565b6100f66103f7565b6100f6610430565b6100ec6101c63660046109bd565b610460565b6100f6610514565b6100f6600081565b6101e361055f565b6101ec816105e0565b50565b61021a60017f4aaefe95bd84fd3f32700cf3b7566bc944b73138e41958b5785826df2aecace16109d8565b81565b61022561055f565b6101ec81610698565b61023661055f565b6102406000610712565b565b600054610100900460ff16158080156102625750600054600160ff909116105b8061027c5750303b15801561027c575060005460ff166001145b61030d576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602e60248201527f496e697469616c697a61626c653a20636f6e747261637420697320616c72656160448201527f647920696e697469616c697a656400000000000000000000000000000000000060648201526084015b60405180910390fd5b600080547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00166001179055801561036b57600080547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00ff166101001790555b610373610789565b61037c84610460565b610385836105e0565b61038e82610698565b80156103f157600080547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00ff169055604051600181527f7f26b83ff96e1f2b6a682f133852f6798a09c465da95921460cefb38474024989060200160405180910390a15b50505050565b600061042b61042760017fe314dfc40f0025322aacc0ba8ef420b62fb3b702cf01e0cdf3d829117ac2ff1b6109d8565b5490565b905090565b600061042b61042760017f4aaefe95bd84fd3f32700cf3b7566bc944b73138e41958b5785826df2aecace16109d8565b61046861055f565b73ffffffffffffffffffffffffffffffffffffffff811661050b576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602660248201527f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160448201527f64647265737300000000000000000000000000000000000000000000000000006064820152608401610304565b6101ec81610712565b61021a60017fe314dfc40f0025322aacc0ba8ef420b62fb3b702cf01e0cdf3d829117ac2ff1b6109d8565b73ffffffffffffffffffffffffffffffffffffffff163b151590565b9055565b60335473ffffffffffffffffffffffffffffffffffffffff163314610240576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e65726044820152606401610304565b61061361060e60017f4aaefe95bd84fd3f32700cf3b7566bc944b73138e41958b5785826df2aecace16109d8565b829055565b60008160405160200161062891815260200190565b604080517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0818403018152919052905060005b60007f1d2b0bda21d56b8bd12d4f94ebacffdfb35f5e226f84b461103bb8beab6353be8360405161068c9190610947565b60405180910390a35050565b6106c661060e60017fe314dfc40f0025322aacc0ba8ef420b62fb3b702cf01e0cdf3d829117ac2ff1b6109d8565b6000816040516020016106db91815260200190565b604080517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe08184030181529190529050600161065b565b6033805473ffffffffffffffffffffffffffffffffffffffff8381167fffffffffffffffffffffffff0000000000000000000000000000000000000000831681179093556040519116919082907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e090600090a35050565b600054610100900460ff16610820576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602b60248201527f496e697469616c697a61626c653a20636f6e7472616374206973206e6f74206960448201527f6e697469616c697a696e670000000000000000000000000000000000000000006064820152608401610304565b610240600054610100900460ff166108ba576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602b60248201527f496e697469616c697a61626c653a20636f6e7472616374206973206e6f74206960448201527f6e697469616c697a696e670000000000000000000000000000000000000000006064820152608401610304565b61024033610712565b6000602082840312156108d557600080fd5b5035919050565b6000815180845260005b81811015610902576020818501810151868301820152016108e6565b81811115610914576000602083870101525b50601f017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0169290920160200192915050565b60208152600061095a60208301846108dc565b9392505050565b803573ffffffffffffffffffffffffffffffffffffffff8116811461098557600080fd5b919050565b60008060006060848603121561099f57600080fd5b6109a884610961565b95602085013595506040909401359392505050565b6000602082840312156109cf57600080fd5b61095a82610961565b600082821015610a11577f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b50039056fea164736f6c634300080f000a", - "initialized": true, - "kind": "Create", - "newBalance": 0, - "oldBalance": 0, - "reverted": false, - "storageAccesses": [ - { - "account": "0xfbfD64a6C0257F613feFCe050Aa30ecC3E3d7C3F", - "isWrite": false, - "newValue": "0x0000000000000000000000000000000000000000000000000000000000000000", - "previousValue": "0x0000000000000000000000000000000000000000000000000000000000000000", - "reverted": false, - "slot": "0x0000000000000000000000000000000000000000000000000000000000000000" - }, - { - "account": "0xfbfD64a6C0257F613feFCe050Aa30ecC3E3d7C3F", - "isWrite": false, - "newValue": "0x0000000000000000000000000000000000000000000000000000000000000000", - "previousValue": "0x0000000000000000000000000000000000000000000000000000000000000000", - "reverted": false, - "slot": "0x0000000000000000000000000000000000000000000000000000000000000000" - }, - { - "account": "0xfbfD64a6C0257F613feFCe050Aa30ecC3E3d7C3F", - "isWrite": false, - "newValue": "0x0000000000000000000000000000000000000000000000000000000000000000", - "previousValue": "0x0000000000000000000000000000000000000000000000000000000000000000", - "reverted": false, - "slot": "0x0000000000000000000000000000000000000000000000000000000000000000" - }, - { - "account": "0xfbfD64a6C0257F613feFCe050Aa30ecC3E3d7C3F", - "isWrite": true, - "newValue": "0x0000000000000000000000000000000000000000000000000000000000000001", - "previousValue": "0x0000000000000000000000000000000000000000000000000000000000000000", - "reverted": false, - "slot": "0x0000000000000000000000000000000000000000000000000000000000000000" - }, - { - "account": "0xfbfD64a6C0257F613feFCe050Aa30ecC3E3d7C3F", - "isWrite": false, - "newValue": "0x0000000000000000000000000000000000000000000000000000000000000001", - "previousValue": "0x0000000000000000000000000000000000000000000000000000000000000001", - "reverted": false, - "slot": "0x0000000000000000000000000000000000000000000000000000000000000000" - }, - { - "account": "0xfbfD64a6C0257F613feFCe050Aa30ecC3E3d7C3F", - "isWrite": true, - "newValue": "0x0000000000000000000000000000000000000000000000000000000000000101", - "previousValue": "0x0000000000000000000000000000000000000000000000000000000000000001", - "reverted": false, - "slot": "0x0000000000000000000000000000000000000000000000000000000000000000" - }, - { - "account": "0xfbfD64a6C0257F613feFCe050Aa30ecC3E3d7C3F", - "isWrite": false, - "newValue": "0x0000000000000000000000000000000000000000000000000000000000000101", - "previousValue": "0x0000000000000000000000000000000000000000000000000000000000000101", - "reverted": false, - "slot": "0x0000000000000000000000000000000000000000000000000000000000000000" - }, - { - "account": "0xfbfD64a6C0257F613feFCe050Aa30ecC3E3d7C3F", - "isWrite": false, - "newValue": "0x0000000000000000000000000000000000000000000000000000000000000101", - "previousValue": "0x0000000000000000000000000000000000000000000000000000000000000101", - "reverted": false, - "slot": "0x0000000000000000000000000000000000000000000000000000000000000000" - }, - { - "account": "0xfbfD64a6C0257F613feFCe050Aa30ecC3E3d7C3F", - "isWrite": false, - "newValue": "0x0000000000000000000000000000000000000000000000000000000000000000", - "previousValue": "0x0000000000000000000000000000000000000000000000000000000000000000", - "reverted": false, - "slot": "0x0000000000000000000000000000000000000000000000000000000000000033" - }, - { - "account": "0xfbfD64a6C0257F613feFCe050Aa30ecC3E3d7C3F", - "isWrite": true, - "newValue": "0x0000000000000000000000004e59b44847b379578588920ca78fbf26c0b4956c", - "previousValue": "0x0000000000000000000000000000000000000000000000000000000000000000", - "reverted": false, - "slot": "0x0000000000000000000000000000000000000000000000000000000000000033" - }, - { - "account": "0xfbfD64a6C0257F613feFCe050Aa30ecC3E3d7C3F", - "isWrite": false, - "newValue": "0x0000000000000000000000004e59b44847b379578588920ca78fbf26c0b4956c", - "previousValue": "0x0000000000000000000000004e59b44847b379578588920ca78fbf26c0b4956c", - "reverted": false, - "slot": "0x0000000000000000000000000000000000000000000000000000000000000033" - }, - { - "account": "0xfbfD64a6C0257F613feFCe050Aa30ecC3E3d7C3F", - "isWrite": false, - "newValue": "0x0000000000000000000000004e59b44847b379578588920ca78fbf26c0b4956c", - "previousValue": "0x0000000000000000000000004e59b44847b379578588920ca78fbf26c0b4956c", - "reverted": false, - "slot": "0x0000000000000000000000000000000000000000000000000000000000000033" - }, - { - "account": "0xfbfD64a6C0257F613feFCe050Aa30ecC3E3d7C3F", - "isWrite": true, - "newValue": "0x000000000000000000000000000000000000000000000000000000000000dead", - "previousValue": "0x0000000000000000000000004e59b44847b379578588920ca78fbf26c0b4956c", - "reverted": false, - "slot": "0x0000000000000000000000000000000000000000000000000000000000000033" - }, - { - "account": "0xfbfD64a6C0257F613feFCe050Aa30ecC3E3d7C3F", - "isWrite": true, - "newValue": "0x0000000000000000000000000000000000000000000000000000000000000000", - "previousValue": "0x0000000000000000000000000000000000000000000000000000000000000000", - "reverted": false, - "slot": "0x4aaefe95bd84fd3f32700cf3b7566bc944b73138e41958b5785826df2aecace0" - }, - { - "account": "0xfbfD64a6C0257F613feFCe050Aa30ecC3E3d7C3F", - "isWrite": true, - "newValue": "0x0000000000000000000000000000000000000000000000000000000000000000", - "previousValue": "0x0000000000000000000000000000000000000000000000000000000000000000", - "reverted": false, - "slot": "0xe314dfc40f0025322aacc0ba8ef420b62fb3b702cf01e0cdf3d829117ac2ff1a" - }, - { - "account": "0xfbfD64a6C0257F613feFCe050Aa30ecC3E3d7C3F", - "isWrite": false, - "newValue": "0x0000000000000000000000000000000000000000000000000000000000000101", - "previousValue": "0x0000000000000000000000000000000000000000000000000000000000000101", - "reverted": false, - "slot": "0x0000000000000000000000000000000000000000000000000000000000000000" - }, - { - "account": "0xfbfD64a6C0257F613feFCe050Aa30ecC3E3d7C3F", - "isWrite": true, - "newValue": "0x0000000000000000000000000000000000000000000000000000000000000001", - "previousValue": "0x0000000000000000000000000000000000000000000000000000000000000101", - "reverted": false, - "slot": "0x0000000000000000000000000000000000000000000000000000000000000000" - } - ], - "value": 0 - }, - { - "accessor": "0x7FA9385bE102ac3EAc297483Dd6233D62b3e1496", - "account": "0x7109709ECfa91a80626fF3989D68f67F5b1DD12D", - "chainInfo": { - "chainId": 31337, - "forkId": 0 - }, - "data": "0x", - "deployedCode": "0x", - "initialized": true, - "kind": "Resume", - "newBalance": 0, - "oldBalance": 0, - "reverted": false, - "storageAccesses": [], - "value": 0 - }, - { - "accessor": "0x1804c8AB1F12E6bbf3894d4083f33e07309d1f38", - "account": "0xfbfD64a6C0257F613feFCe050Aa30ecC3E3d7C3F", - "chainInfo": { - "chainId": 31337, - "forkId": 0 - }, - "data": "0x8da5cb5b", - "deployedCode": "0x", - "initialized": true, - "kind": "StaticCall", - "newBalance": 0, - "oldBalance": 0, - "reverted": false, - "storageAccesses": [ - { - "account": "0xfbfD64a6C0257F613feFCe050Aa30ecC3E3d7C3F", - "isWrite": false, - "newValue": "0x000000000000000000000000000000000000000000000000000000000000dead", - "previousValue": "0x000000000000000000000000000000000000000000000000000000000000dead", - "reverted": false, - "slot": "0x0000000000000000000000000000000000000000000000000000000000000033" - } - ], - "value": 0 - }, - { - "accessor": "0x1804c8AB1F12E6bbf3894d4083f33e07309d1f38", - "account": "0xfbfD64a6C0257F613feFCe050Aa30ecC3E3d7C3F", - "chainInfo": { - "chainId": 31337, - "forkId": 0 - }, - "data": "0xdc8452cd", - "deployedCode": "0x", - "initialized": true, - "kind": "StaticCall", - "newBalance": 0, - "oldBalance": 0, - "reverted": false, - "storageAccesses": [ - { - "account": "0xfbfD64a6C0257F613feFCe050Aa30ecC3E3d7C3F", - "isWrite": false, - "newValue": "0x0000000000000000000000000000000000000000000000000000000000000000", - "previousValue": "0x0000000000000000000000000000000000000000000000000000000000000000", - "reverted": false, - "slot": "0x4aaefe95bd84fd3f32700cf3b7566bc944b73138e41958b5785826df2aecace0" - } - ], - "value": 0 - }, - { - "accessor": "0x1804c8AB1F12E6bbf3894d4083f33e07309d1f38", - "account": "0xfbfD64a6C0257F613feFCe050Aa30ecC3E3d7C3F", - "chainInfo": { - "chainId": 31337, - "forkId": 0 - }, - "data": "0xd798b1ac", - "deployedCode": "0x", - "initialized": true, - "kind": "StaticCall", - "newBalance": 0, - "oldBalance": 0, - "reverted": false, - "storageAccesses": [ - { - "account": "0xfbfD64a6C0257F613feFCe050Aa30ecC3E3d7C3F", - "isWrite": false, - "newValue": "0x0000000000000000000000000000000000000000000000000000000000000000", - "previousValue": "0x0000000000000000000000000000000000000000000000000000000000000000", - "reverted": false, - "slot": "0xe314dfc40f0025322aacc0ba8ef420b62fb3b702cf01e0cdf3d829117ac2ff1a" - } - ], - "value": 0 - }, - { - "accessor": "0x7FA9385bE102ac3EAc297483Dd6233D62b3e1496", - "account": "0x7109709ECfa91a80626fF3989D68f67F5b1DD12D", - "chainInfo": { - "chainId": 31337, - "forkId": 0 - }, - "data": "0x", - "deployedCode": "0x", - "initialized": true, - "kind": "Resume", - "newBalance": 0, - "oldBalance": 0, - "reverted": false, - "storageAccesses": [], - "value": 0 - }, - { - "accessor": "0x7FA9385bE102ac3EAc297483Dd6233D62b3e1496", - "account": "0x7109709ECfa91a80626fF3989D68f67F5b1DD12D", - "chainInfo": { - "chainId": 31337, - "forkId": 0 - }, - "data": "0x", - "deployedCode": "0x", - "initialized": true, - "kind": "Resume", - "newBalance": 0, - "oldBalance": 0, - "reverted": false, - "storageAccesses": [], - "value": 0 - }, - { - "accessor": "0x1804c8AB1F12E6bbf3894d4083f33e07309d1f38", - "account": "0x9568d36E291c2C4c34fa5593fcE73715abEf6F9c", - "chainInfo": { - "chainId": 31337, - "forkId": 0 - }, - "data": "0xd2354f20", - "deployedCode": "0x", - "initialized": true, - "kind": "StaticCall", - "newBalance": 0, - "oldBalance": 0, - "reverted": false, - "storageAccesses": [ - { - "account": "0x9568d36E291c2C4c34fa5593fcE73715abEf6F9c", - "isWrite": false, - "newValue": "0x0000000000000000000000009965507d1a55bcc2695c58ba16fb37d819b0a4dc", - "previousValue": "0x0000000000000000000000009965507d1a55bcc2695c58ba16fb37d819b0a4dc", - "reverted": false, - "slot": "0x000000000000000000000000000000000000000000000000000000000000000e" - } - ], - "value": 0 - }, - { - "accessor": "0x1804c8AB1F12E6bbf3894d4083f33e07309d1f38", - "account": "0x9568d36E291c2C4c34fa5593fcE73715abEf6F9c", - "chainInfo": { - "chainId": 31337, - "forkId": 0 - }, - "data": "0x38c27159", - "deployedCode": "0x", - "initialized": true, - "kind": "StaticCall", - "newBalance": 0, - "oldBalance": 0, - "reverted": false, - "storageAccesses": [ - { - "account": "0x9568d36E291c2C4c34fa5593fcE73715abEf6F9c", - "isWrite": false, - "newValue": "0x0000000000000000000000000000000000000000000000000000000000000000", - "previousValue": "0x0000000000000000000000000000000000000000000000000000000000000000", - "reverted": false, - "slot": "0x000000000000000000000000000000000000000000000000000000000000003d" - } - ], - "value": 0 - }, - { - "accessor": "0x1804c8AB1F12E6bbf3894d4083f33e07309d1f38", - "account": "0x9568d36E291c2C4c34fa5593fcE73715abEf6F9c", - "chainInfo": { - "chainId": 31337, - "forkId": 0 - }, - "data": "0x67cef446", - "deployedCode": "0x", - "initialized": true, - "kind": "StaticCall", - "newBalance": 0, - "oldBalance": 0, - "reverted": false, - "storageAccesses": [ - { - "account": "0x9568d36E291c2C4c34fa5593fcE73715abEf6F9c", - "isWrite": false, - "newValue": "0x0000000000000000000000000000000000000000000000000000000000000000", - "previousValue": "0x0000000000000000000000000000000000000000000000000000000000000000", - "reverted": false, - "slot": "0x000000000000000000000000000000000000000000000000000000000000003e" - } - ], - "value": 0 - }, - { - "accessor": "0x1804c8AB1F12E6bbf3894d4083f33e07309d1f38", - "account": "0x7d039be7F9b5190147621b02e82B250e1D748e02", - "chainInfo": { - "chainId": 31337, - "forkId": 0 - }, - "data": "0x6a761202000000000000000000000000db8cff278adccf9e9b5da745b44e754fc4ee3c7600000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000140000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000028000000000000000000000000000000000000000000000000000000000000001049623609d000000000000000000000000416c42991d05b31e9a6dc209e91ad22b79d87ae6000000000000000000000000fbfd64a6c0257f613fefce050aa30ecc3e3d7c3f000000000000000000000000000000000000000000000000000000000000006000000000000000000000000000000000000000000000000000000000000000647a1ac61e0000000000000000000000009965507d1a55bcc2695c58ba16fb37d819b0a4dc00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000410000000000000000000000001804c8ab1f12e6bbf3894d4083f33e07309d1f3800000000000000000000000000000000000000000000000000000000000000000100000000000000000000000000000000000000000000000000000000000000", - "deployedCode": "0x", - "initialized": true, - "kind": "Call", - "newBalance": 0, - "oldBalance": 0, - "reverted": false, - "storageAccesses": [ - { - "account": "0x7d039be7F9b5190147621b02e82B250e1D748e02", - "isWrite": false, - "newValue": "0x00000000000000000000000090193c961a926261b756d1e5bb255e67ff9498a1", - "previousValue": "0x00000000000000000000000090193c961a926261b756d1e5bb255e67ff9498a1", - "reverted": false, - "slot": "0x0000000000000000000000000000000000000000000000000000000000000000" - } - ], - "value": 0 - }, - { - "accessor": "0x1804c8AB1F12E6bbf3894d4083f33e07309d1f38", - "account": "0x90193C961A926261B756D1E5bb255e67ff9498A1", - "chainInfo": { - "chainId": 31337, - "forkId": 0 - }, - "data": "0x6a761202000000000000000000000000db8cff278adccf9e9b5da745b44e754fc4ee3c7600000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000140000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000028000000000000000000000000000000000000000000000000000000000000001049623609d000000000000000000000000416c42991d05b31e9a6dc209e91ad22b79d87ae6000000000000000000000000fbfd64a6c0257f613fefce050aa30ecc3e3d7c3f000000000000000000000000000000000000000000000000000000000000006000000000000000000000000000000000000000000000000000000000000000647a1ac61e0000000000000000000000009965507d1a55bcc2695c58ba16fb37d819b0a4dc00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000410000000000000000000000001804c8ab1f12e6bbf3894d4083f33e07309d1f3800000000000000000000000000000000000000000000000000000000000000000100000000000000000000000000000000000000000000000000000000000000", - "deployedCode": "0x", - "initialized": true, - "kind": "DelegateCall", - "newBalance": 0, - "oldBalance": 0, - "reverted": false, - "storageAccesses": [ - { - "account": "0x7d039be7F9b5190147621b02e82B250e1D748e02", - "isWrite": false, - "newValue": "0x0000000000000000000000000000000000000000000000000000000000000001", - "previousValue": "0x0000000000000000000000000000000000000000000000000000000000000001", - "reverted": false, - "slot": "0x0000000000000000000000000000000000000000000000000000000000000005" - }, - { - "account": "0x7d039be7F9b5190147621b02e82B250e1D748e02", - "isWrite": false, - "newValue": "0x0000000000000000000000000000000000000000000000000000000000000001", - "previousValue": "0x0000000000000000000000000000000000000000000000000000000000000001", - "reverted": false, - "slot": "0x0000000000000000000000000000000000000000000000000000000000000005" - }, - { - "account": "0x7d039be7F9b5190147621b02e82B250e1D748e02", - "isWrite": true, - "newValue": "0x0000000000000000000000000000000000000000000000000000000000000002", - "previousValue": "0x0000000000000000000000000000000000000000000000000000000000000001", - "reverted": false, - "slot": "0x0000000000000000000000000000000000000000000000000000000000000005" - }, - { - "account": "0x7d039be7F9b5190147621b02e82B250e1D748e02", - "isWrite": false, - "newValue": "0x0000000000000000000000000000000000000000000000000000000000000001", - "previousValue": "0x0000000000000000000000000000000000000000000000000000000000000001", - "reverted": false, - "slot": "0x0000000000000000000000000000000000000000000000000000000000000004" - }, - { - "account": "0x7d039be7F9b5190147621b02e82B250e1D748e02", - "isWrite": false, - "newValue": "0x0000000000000000000000000000000000000000000000000000000000000001", - "previousValue": "0x0000000000000000000000000000000000000000000000000000000000000001", - "reverted": false, - "slot": "0xd1b0d319c6526317dce66989b393dcfb4435c9a65e399a088b63bbf65d7aee32" - }, - { - "account": "0x7d039be7F9b5190147621b02e82B250e1D748e02", - "isWrite": false, - "newValue": "0x0000000000000000000000000000000000000000000000000000000000000000", - "previousValue": "0x0000000000000000000000000000000000000000000000000000000000000000", - "reverted": false, - "slot": "0x4a204f620c8c5ccdca3fd54d003badd85ba500436a431f0cbda4f558c93c34c8" - } - ], - "value": 0 - }, - { - "accessor": "0x7d039be7F9b5190147621b02e82B250e1D748e02", - "account": "0xDB8cFf278adCCF9E9b5da745B44E754fC4EE3C76", - "chainInfo": { - "chainId": 31337, - "forkId": 0 - }, - "data": "0x9623609d000000000000000000000000416c42991d05b31e9a6dc209e91ad22b79d87ae6000000000000000000000000fbfd64a6c0257f613fefce050aa30ecc3e3d7c3f000000000000000000000000000000000000000000000000000000000000006000000000000000000000000000000000000000000000000000000000000000647a1ac61e0000000000000000000000009965507d1a55bcc2695c58ba16fb37d819b0a4dc0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000", - "deployedCode": "0x", - "initialized": true, - "kind": "Call", - "newBalance": 0, - "oldBalance": 0, - "reverted": false, - "storageAccesses": [ - { - "account": "0xDB8cFf278adCCF9E9b5da745B44E754fC4EE3C76", - "isWrite": false, - "newValue": "0x0000000000000000000000007d039be7f9b5190147621b02e82b250e1d748e02", - "previousValue": "0x0000000000000000000000007d039be7f9b5190147621b02e82b250e1d748e02", - "reverted": false, - "slot": "0x0000000000000000000000000000000000000000000000000000000000000000" - }, - { - "account": "0xDB8cFf278adCCF9E9b5da745B44E754fC4EE3C76", - "isWrite": false, - "newValue": "0x0000000000000000000000000000000000000000000000000000000000000000", - "previousValue": "0x0000000000000000000000000000000000000000000000000000000000000000", - "reverted": false, - "slot": "0x9d54a4eb6e745ee152f323ba7a05534bbe68629624a74c9623b7903663b002cf" - } - ], - "value": 0 - }, - { - "accessor": "0xDB8cFf278adCCF9E9b5da745B44E754fC4EE3C76", - "account": "0x416C42991d05b31E9A6dC209e91AD22b79D87Ae6", - "chainInfo": { - "chainId": 31337, - "forkId": 0 - }, - "data": "0x4f1ef286000000000000000000000000fbfd64a6c0257f613fefce050aa30ecc3e3d7c3f000000000000000000000000000000000000000000000000000000000000004000000000000000000000000000000000000000000000000000000000000000647a1ac61e0000000000000000000000009965507d1a55bcc2695c58ba16fb37d819b0a4dc0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000", - "deployedCode": "0x", - "initialized": true, - "kind": "Call", - "newBalance": 0, - "oldBalance": 0, - "reverted": false, - "storageAccesses": [ - { - "account": "0x416C42991d05b31E9A6dC209e91AD22b79D87Ae6", - "isWrite": false, - "newValue": "0x000000000000000000000000db8cff278adccf9e9b5da745b44e754fc4ee3c76", - "previousValue": "0x000000000000000000000000db8cff278adccf9e9b5da745b44e754fc4ee3c76", - "reverted": false, - "slot": "0xb53127684a568b3173ae13b9f8a6016e243e63b6e8ee1178d6a717850b5d6103" - }, - { - "account": "0x416C42991d05b31E9A6dC209e91AD22b79D87Ae6", - "isWrite": true, - "newValue": "0x000000000000000000000000fbfd64a6c0257f613fefce050aa30ecc3e3d7c3f", - "previousValue": "0x0000000000000000000000000000000000000000000000000000000000000000", - "reverted": false, - "slot": "0x360894a13ba1a3210667c828492db98dca3e2076cc3735a920a3ca505d382bbc" - } - ], - "value": 0 - }, - { - "accessor": "0xDB8cFf278adCCF9E9b5da745B44E754fC4EE3C76", - "account": "0xfbfD64a6C0257F613feFCe050Aa30ecC3E3d7C3F", - "chainInfo": { - "chainId": 31337, - "forkId": 0 - }, - "data": "0x7a1ac61e0000000000000000000000009965507d1a55bcc2695c58ba16fb37d819b0a4dc00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000", - "deployedCode": "0x", - "initialized": true, - "kind": "DelegateCall", - "newBalance": 0, - "oldBalance": 0, - "reverted": false, - "storageAccesses": [ - { - "account": "0x416C42991d05b31E9A6dC209e91AD22b79D87Ae6", - "isWrite": false, - "newValue": "0x0000000000000000000000000000000000000000000000000000000000000000", - "previousValue": "0x0000000000000000000000000000000000000000000000000000000000000000", - "reverted": false, - "slot": "0x0000000000000000000000000000000000000000000000000000000000000000" - }, - { - "account": "0x416C42991d05b31E9A6dC209e91AD22b79D87Ae6", - "isWrite": false, - "newValue": "0x0000000000000000000000000000000000000000000000000000000000000000", - "previousValue": "0x0000000000000000000000000000000000000000000000000000000000000000", - "reverted": false, - "slot": "0x0000000000000000000000000000000000000000000000000000000000000000" - }, - { - "account": "0x416C42991d05b31E9A6dC209e91AD22b79D87Ae6", - "isWrite": false, - "newValue": "0x0000000000000000000000000000000000000000000000000000000000000000", - "previousValue": "0x0000000000000000000000000000000000000000000000000000000000000000", - "reverted": false, - "slot": "0x0000000000000000000000000000000000000000000000000000000000000000" - }, - { - "account": "0x416C42991d05b31E9A6dC209e91AD22b79D87Ae6", - "isWrite": true, - "newValue": "0x0000000000000000000000000000000000000000000000000000000000000001", - "previousValue": "0x0000000000000000000000000000000000000000000000000000000000000000", - "reverted": false, - "slot": "0x0000000000000000000000000000000000000000000000000000000000000000" - }, - { - "account": "0x416C42991d05b31E9A6dC209e91AD22b79D87Ae6", - "isWrite": false, - "newValue": "0x0000000000000000000000000000000000000000000000000000000000000001", - "previousValue": "0x0000000000000000000000000000000000000000000000000000000000000001", - "reverted": false, - "slot": "0x0000000000000000000000000000000000000000000000000000000000000000" - }, - { - "account": "0x416C42991d05b31E9A6dC209e91AD22b79D87Ae6", - "isWrite": true, - "newValue": "0x0000000000000000000000000000000000000000000000000000000000000101", - "previousValue": "0x0000000000000000000000000000000000000000000000000000000000000001", - "reverted": false, - "slot": "0x0000000000000000000000000000000000000000000000000000000000000000" - }, - { - "account": "0x416C42991d05b31E9A6dC209e91AD22b79D87Ae6", - "isWrite": false, - "newValue": "0x0000000000000000000000000000000000000000000000000000000000000101", - "previousValue": "0x0000000000000000000000000000000000000000000000000000000000000101", - "reverted": false, - "slot": "0x0000000000000000000000000000000000000000000000000000000000000000" - }, - { - "account": "0x416C42991d05b31E9A6dC209e91AD22b79D87Ae6", - "isWrite": false, - "newValue": "0x0000000000000000000000000000000000000000000000000000000000000101", - "previousValue": "0x0000000000000000000000000000000000000000000000000000000000000101", - "reverted": false, - "slot": "0x0000000000000000000000000000000000000000000000000000000000000000" - }, - { - "account": "0x416C42991d05b31E9A6dC209e91AD22b79D87Ae6", - "isWrite": false, - "newValue": "0x0000000000000000000000000000000000000000000000000000000000000000", - "previousValue": "0x0000000000000000000000000000000000000000000000000000000000000000", - "reverted": false, - "slot": "0x0000000000000000000000000000000000000000000000000000000000000033" - }, - { - "account": "0x416C42991d05b31E9A6dC209e91AD22b79D87Ae6", - "isWrite": true, - "newValue": "0x000000000000000000000000db8cff278adccf9e9b5da745b44e754fc4ee3c76", - "previousValue": "0x0000000000000000000000000000000000000000000000000000000000000000", - "reverted": false, - "slot": "0x0000000000000000000000000000000000000000000000000000000000000033" - }, - { - "account": "0x416C42991d05b31E9A6dC209e91AD22b79D87Ae6", - "isWrite": false, - "newValue": "0x000000000000000000000000db8cff278adccf9e9b5da745b44e754fc4ee3c76", - "previousValue": "0x000000000000000000000000db8cff278adccf9e9b5da745b44e754fc4ee3c76", - "reverted": false, - "slot": "0x0000000000000000000000000000000000000000000000000000000000000033" - }, - { - "account": "0x416C42991d05b31E9A6dC209e91AD22b79D87Ae6", - "isWrite": false, - "newValue": "0x000000000000000000000000db8cff278adccf9e9b5da745b44e754fc4ee3c76", - "previousValue": "0x000000000000000000000000db8cff278adccf9e9b5da745b44e754fc4ee3c76", - "reverted": false, - "slot": "0x0000000000000000000000000000000000000000000000000000000000000033" - }, - { - "account": "0x416C42991d05b31E9A6dC209e91AD22b79D87Ae6", - "isWrite": true, - "newValue": "0x0000000000000000000000009965507d1a55bcc2695c58ba16fb37d819b0a4dc", - "previousValue": "0x000000000000000000000000db8cff278adccf9e9b5da745b44e754fc4ee3c76", - "reverted": false, - "slot": "0x0000000000000000000000000000000000000000000000000000000000000033" - }, - { - "account": "0x416C42991d05b31E9A6dC209e91AD22b79D87Ae6", - "isWrite": true, - "newValue": "0x0000000000000000000000000000000000000000000000000000000000000000", - "previousValue": "0x0000000000000000000000000000000000000000000000000000000000000000", - "reverted": false, - "slot": "0x4aaefe95bd84fd3f32700cf3b7566bc944b73138e41958b5785826df2aecace0" - }, - { - "account": "0x416C42991d05b31E9A6dC209e91AD22b79D87Ae6", - "isWrite": true, - "newValue": "0x0000000000000000000000000000000000000000000000000000000000000000", - "previousValue": "0x0000000000000000000000000000000000000000000000000000000000000000", - "reverted": false, - "slot": "0xe314dfc40f0025322aacc0ba8ef420b62fb3b702cf01e0cdf3d829117ac2ff1a" - }, - { - "account": "0x416C42991d05b31E9A6dC209e91AD22b79D87Ae6", - "isWrite": false, - "newValue": "0x0000000000000000000000000000000000000000000000000000000000000101", - "previousValue": "0x0000000000000000000000000000000000000000000000000000000000000101", - "reverted": false, - "slot": "0x0000000000000000000000000000000000000000000000000000000000000000" - }, - { - "account": "0x416C42991d05b31E9A6dC209e91AD22b79D87Ae6", - "isWrite": true, - "newValue": "0x0000000000000000000000000000000000000000000000000000000000000001", - "previousValue": "0x0000000000000000000000000000000000000000000000000000000000000101", - "reverted": false, - "slot": "0x0000000000000000000000000000000000000000000000000000000000000000" - } - ], - "value": 0 - }, - { - "accessor": "0x1804c8AB1F12E6bbf3894d4083f33e07309d1f38", - "account": "0x416C42991d05b31E9A6dC209e91AD22b79D87Ae6", - "chainInfo": { - "chainId": 31337, - "forkId": 0 - }, - "data": "0x54fd4d50", - "deployedCode": "0x", - "initialized": true, - "kind": "StaticCall", - "newBalance": 0, - "oldBalance": 0, - "reverted": false, - "storageAccesses": [ - { - "account": "0x416C42991d05b31E9A6dC209e91AD22b79D87Ae6", - "isWrite": false, - "newValue": "0x000000000000000000000000fbfd64a6c0257f613fefce050aa30ecc3e3d7c3f", - "previousValue": "0x000000000000000000000000fbfd64a6c0257f613fefce050aa30ecc3e3d7c3f", - "reverted": false, - "slot": "0x360894a13ba1a3210667c828492db98dca3e2076cc3735a920a3ca505d382bbc" - } - ], - "value": 0 - }, - { - "accessor": "0x1804c8AB1F12E6bbf3894d4083f33e07309d1f38", - "account": "0xfbfD64a6C0257F613feFCe050Aa30ecC3E3d7C3F", - "chainInfo": { - "chainId": 31337, - "forkId": 0 - }, - "data": "0x54fd4d50", - "deployedCode": "0x", - "initialized": true, - "kind": "DelegateCall", - "newBalance": 0, - "oldBalance": 0, - "reverted": false, - "storageAccesses": [], - "value": 0 - }, - { - "accessor": "0x1804c8AB1F12E6bbf3894d4083f33e07309d1f38", - "account": "0x9568d36E291c2C4c34fa5593fcE73715abEf6F9c", - "chainInfo": { - "chainId": 31337, - "forkId": 0 - }, - "data": "0xd2354f20", - "deployedCode": "0x", - "initialized": true, - "kind": "StaticCall", - "newBalance": 0, - "oldBalance": 0, - "reverted": false, - "storageAccesses": [ - { - "account": "0x9568d36E291c2C4c34fa5593fcE73715abEf6F9c", - "isWrite": false, - "newValue": "0x0000000000000000000000009965507d1a55bcc2695c58ba16fb37d819b0a4dc", - "previousValue": "0x0000000000000000000000009965507d1a55bcc2695c58ba16fb37d819b0a4dc", - "reverted": false, - "slot": "0x000000000000000000000000000000000000000000000000000000000000000e" - } - ], - "value": 0 - }, - { - "accessor": "0x1804c8AB1F12E6bbf3894d4083f33e07309d1f38", - "account": "0x416C42991d05b31E9A6dC209e91AD22b79D87Ae6", - "chainInfo": { - "chainId": 31337, - "forkId": 0 - }, - "data": "0x8da5cb5b", - "deployedCode": "0x", - "initialized": true, - "kind": "StaticCall", - "newBalance": 0, - "oldBalance": 0, - "reverted": false, - "storageAccesses": [ - { - "account": "0x416C42991d05b31E9A6dC209e91AD22b79D87Ae6", - "isWrite": false, - "newValue": "0x000000000000000000000000fbfd64a6c0257f613fefce050aa30ecc3e3d7c3f", - "previousValue": "0x000000000000000000000000fbfd64a6c0257f613fefce050aa30ecc3e3d7c3f", - "reverted": false, - "slot": "0x360894a13ba1a3210667c828492db98dca3e2076cc3735a920a3ca505d382bbc" - } - ], - "value": 0 - }, - { - "accessor": "0x1804c8AB1F12E6bbf3894d4083f33e07309d1f38", - "account": "0xfbfD64a6C0257F613feFCe050Aa30ecC3E3d7C3F", - "chainInfo": { - "chainId": 31337, - "forkId": 0 - }, - "data": "0x8da5cb5b", - "deployedCode": "0x", - "initialized": true, - "kind": "DelegateCall", - "newBalance": 0, - "oldBalance": 0, - "reverted": false, - "storageAccesses": [ - { - "account": "0x416C42991d05b31E9A6dC209e91AD22b79D87Ae6", - "isWrite": false, - "newValue": "0x0000000000000000000000009965507d1a55bcc2695c58ba16fb37d819b0a4dc", - "previousValue": "0x0000000000000000000000009965507d1a55bcc2695c58ba16fb37d819b0a4dc", - "reverted": false, - "slot": "0x0000000000000000000000000000000000000000000000000000000000000033" - } - ], - "value": 0 - }, - { - "accessor": "0x1804c8AB1F12E6bbf3894d4083f33e07309d1f38", - "account": "0x9568d36E291c2C4c34fa5593fcE73715abEf6F9c", - "chainInfo": { - "chainId": 31337, - "forkId": 0 - }, - "data": "0x38c27159", - "deployedCode": "0x", - "initialized": true, - "kind": "StaticCall", - "newBalance": 0, - "oldBalance": 0, - "reverted": false, - "storageAccesses": [ - { - "account": "0x9568d36E291c2C4c34fa5593fcE73715abEf6F9c", - "isWrite": false, - "newValue": "0x0000000000000000000000000000000000000000000000000000000000000000", - "previousValue": "0x0000000000000000000000000000000000000000000000000000000000000000", - "reverted": false, - "slot": "0x000000000000000000000000000000000000000000000000000000000000003d" - } - ], - "value": 0 - }, - { - "accessor": "0x1804c8AB1F12E6bbf3894d4083f33e07309d1f38", - "account": "0x416C42991d05b31E9A6dC209e91AD22b79D87Ae6", - "chainInfo": { - "chainId": 31337, - "forkId": 0 - }, - "data": "0xdc8452cd", - "deployedCode": "0x", - "initialized": true, - "kind": "StaticCall", - "newBalance": 0, - "oldBalance": 0, - "reverted": false, - "storageAccesses": [ - { - "account": "0x416C42991d05b31E9A6dC209e91AD22b79D87Ae6", - "isWrite": false, - "newValue": "0x000000000000000000000000fbfd64a6c0257f613fefce050aa30ecc3e3d7c3f", - "previousValue": "0x000000000000000000000000fbfd64a6c0257f613fefce050aa30ecc3e3d7c3f", - "reverted": false, - "slot": "0x360894a13ba1a3210667c828492db98dca3e2076cc3735a920a3ca505d382bbc" - } - ], - "value": 0 - }, - { - "accessor": "0x1804c8AB1F12E6bbf3894d4083f33e07309d1f38", - "account": "0xfbfD64a6C0257F613feFCe050Aa30ecC3E3d7C3F", - "chainInfo": { - "chainId": 31337, - "forkId": 0 - }, - "data": "0xdc8452cd", - "deployedCode": "0x", - "initialized": true, - "kind": "DelegateCall", - "newBalance": 0, - "oldBalance": 0, - "reverted": false, - "storageAccesses": [ - { - "account": "0x416C42991d05b31E9A6dC209e91AD22b79D87Ae6", - "isWrite": false, - "newValue": "0x0000000000000000000000000000000000000000000000000000000000000000", - "previousValue": "0x0000000000000000000000000000000000000000000000000000000000000000", - "reverted": false, - "slot": "0x4aaefe95bd84fd3f32700cf3b7566bc944b73138e41958b5785826df2aecace0" - } - ], - "value": 0 - }, - { - "accessor": "0x1804c8AB1F12E6bbf3894d4083f33e07309d1f38", - "account": "0x9568d36E291c2C4c34fa5593fcE73715abEf6F9c", - "chainInfo": { - "chainId": 31337, - "forkId": 0 - }, - "data": "0x67cef446", - "deployedCode": "0x", - "initialized": true, - "kind": "StaticCall", - "newBalance": 0, - "oldBalance": 0, - "reverted": false, - "storageAccesses": [ - { - "account": "0x9568d36E291c2C4c34fa5593fcE73715abEf6F9c", - "isWrite": false, - "newValue": "0x0000000000000000000000000000000000000000000000000000000000000000", - "previousValue": "0x0000000000000000000000000000000000000000000000000000000000000000", - "reverted": false, - "slot": "0x000000000000000000000000000000000000000000000000000000000000003e" - } - ], - "value": 0 - }, - { - "accessor": "0x1804c8AB1F12E6bbf3894d4083f33e07309d1f38", - "account": "0x416C42991d05b31E9A6dC209e91AD22b79D87Ae6", - "chainInfo": { - "chainId": 31337, - "forkId": 0 - }, - "data": "0xd798b1ac", - "deployedCode": "0x", - "initialized": true, - "kind": "StaticCall", - "newBalance": 0, - "oldBalance": 0, - "reverted": false, - "storageAccesses": [ - { - "account": "0x416C42991d05b31E9A6dC209e91AD22b79D87Ae6", - "isWrite": false, - "newValue": "0x000000000000000000000000fbfd64a6c0257f613fefce050aa30ecc3e3d7c3f", - "previousValue": "0x000000000000000000000000fbfd64a6c0257f613fefce050aa30ecc3e3d7c3f", - "reverted": false, - "slot": "0x360894a13ba1a3210667c828492db98dca3e2076cc3735a920a3ca505d382bbc" - } - ], - "value": 0 - }, - { - "accessor": "0x1804c8AB1F12E6bbf3894d4083f33e07309d1f38", - "account": "0xfbfD64a6C0257F613feFCe050Aa30ecC3E3d7C3F", - "chainInfo": { - "chainId": 31337, - "forkId": 0 - }, - "data": "0xd798b1ac", - "deployedCode": "0x", - "initialized": true, - "kind": "DelegateCall", - "newBalance": 0, - "oldBalance": 0, - "reverted": false, - "storageAccesses": [ - { - "account": "0x416C42991d05b31E9A6dC209e91AD22b79D87Ae6", - "isWrite": false, - "newValue": "0x0000000000000000000000000000000000000000000000000000000000000000", - "previousValue": "0x0000000000000000000000000000000000000000000000000000000000000000", - "reverted": false, - "slot": "0xe314dfc40f0025322aacc0ba8ef420b62fb3b702cf01e0cdf3d829117ac2ff1a" - } - ], - "value": 0 - }, - { - "accessor": "0x7FA9385bE102ac3EAc297483Dd6233D62b3e1496", - "account": "0x7109709ECfa91a80626fF3989D68f67F5b1DD12D", - "chainInfo": { - "chainId": 31337, - "forkId": 0 - }, - "data": "0x", - "deployedCode": "0x", - "initialized": true, - "kind": "Resume", - "newBalance": 0, - "oldBalance": 0, - "reverted": false, - "storageAccesses": [], - "value": 0 - }, - { - "accessor": "0x7FA9385bE102ac3EAc297483Dd6233D62b3e1496", - "account": "0x7109709ECfa91a80626fF3989D68f67F5b1DD12D", - "chainInfo": { - "chainId": 31337, - "forkId": 0 - }, - "data": "0x", - "deployedCode": "0x", - "initialized": true, - "kind": "Resume", - "newBalance": 0, - "oldBalance": 0, - "reverted": false, - "storageAccesses": [], - "value": 0 - }, - { - "accessor": "0x1804c8AB1F12E6bbf3894d4083f33e07309d1f38", - "account": "0x978e3286EB805934215a88694d80b09aDed68D90", - "chainInfo": { - "chainId": 31337, - "forkId": 0 - }, - "data": "0x608060405234801561001057600080fd5b5060405161091f38038061091f83398101604081905261002f916100b5565b6100388161003e565b506100e5565b60006100566000805160206108ff8339815191525490565b6000805160206108ff833981519152838155604080516001600160a01b0380851682528616602082015292935090917f7e644d79422f17c01e4894b5f4f588d331ebfa28653d42ae832dc59e38c9798f910160405180910390a1505050565b6000602082840312156100c757600080fd5b81516001600160a01b03811681146100de57600080fd5b9392505050565b61080b806100f46000396000f3fe60806040526004361061005e5760003560e01c80635c60da1b116100435780635c60da1b146100be5780638f283970146100f8578063f851a440146101185761006d565b80633659cfe6146100755780634f1ef286146100955761006d565b3661006d5761006b61012d565b005b61006b61012d565b34801561008157600080fd5b5061006b6100903660046106dd565b610224565b6100a86100a33660046106f8565b610296565b6040516100b5919061077b565b60405180910390f35b3480156100ca57600080fd5b506100d3610419565b60405173ffffffffffffffffffffffffffffffffffffffff90911681526020016100b5565b34801561010457600080fd5b5061006b6101133660046106dd565b6104b0565b34801561012457600080fd5b506100d3610517565b60006101577f360894a13ba1a3210667c828492db98dca3e2076cc3735a920a3ca505d382bbc5490565b905073ffffffffffffffffffffffffffffffffffffffff8116610201576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602560248201527f50726f78793a20696d706c656d656e746174696f6e206e6f7420696e6974696160448201527f6c697a656400000000000000000000000000000000000000000000000000000060648201526084015b60405180910390fd5b3660008037600080366000845af43d6000803e8061021e573d6000fd5b503d6000f35b7fb53127684a568b3173ae13b9f8a6016e243e63b6e8ee1178d6a717850b5d61035473ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff16148061027d575033155b1561028e5761028b816105a3565b50565b61028b61012d565b60606102c07fb53127684a568b3173ae13b9f8a6016e243e63b6e8ee1178d6a717850b5d61035490565b73ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff1614806102f7575033155b1561040a57610305846105a3565b6000808573ffffffffffffffffffffffffffffffffffffffff16858560405161032f9291906107ee565b600060405180830381855af49150503d806000811461036a576040519150601f19603f3d011682016040523d82523d6000602084013e61036f565b606091505b509150915081610401576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152603960248201527f50726f78793a2064656c656761746563616c6c20746f206e657720696d706c6560448201527f6d656e746174696f6e20636f6e7472616374206661696c65640000000000000060648201526084016101f8565b91506104129050565b61041261012d565b9392505050565b60006104437fb53127684a568b3173ae13b9f8a6016e243e63b6e8ee1178d6a717850b5d61035490565b73ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff16148061047a575033155b156104a557507f360894a13ba1a3210667c828492db98dca3e2076cc3735a920a3ca505d382bbc5490565b6104ad61012d565b90565b7fb53127684a568b3173ae13b9f8a6016e243e63b6e8ee1178d6a717850b5d61035473ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff161480610509575033155b1561028e5761028b8161060c565b60006105417fb53127684a568b3173ae13b9f8a6016e243e63b6e8ee1178d6a717850b5d61035490565b73ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff161480610578575033155b156104a557507fb53127684a568b3173ae13b9f8a6016e243e63b6e8ee1178d6a717850b5d61035490565b7f360894a13ba1a3210667c828492db98dca3e2076cc3735a920a3ca505d382bbc81815560405173ffffffffffffffffffffffffffffffffffffffff8316907fbc7cd75a20ee27fd9adebab32041f755214dbc6bffa90cc0225b39da2e5c2d3b90600090a25050565b60006106367fb53127684a568b3173ae13b9f8a6016e243e63b6e8ee1178d6a717850b5d61035490565b7fb53127684a568b3173ae13b9f8a6016e243e63b6e8ee1178d6a717850b5d61038381556040805173ffffffffffffffffffffffffffffffffffffffff80851682528616602082015292935090917f7e644d79422f17c01e4894b5f4f588d331ebfa28653d42ae832dc59e38c9798f910160405180910390a1505050565b803573ffffffffffffffffffffffffffffffffffffffff811681146106d857600080fd5b919050565b6000602082840312156106ef57600080fd5b610412826106b4565b60008060006040848603121561070d57600080fd5b610716846106b4565b9250602084013567ffffffffffffffff8082111561073357600080fd5b818601915086601f83011261074757600080fd5b81358181111561075657600080fd5b87602082850101111561076857600080fd5b6020830194508093505050509250925092565b600060208083528351808285015260005b818110156107a85785810183015185820160400152820161078c565b818111156107ba576000604083870101525b50601f017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe016929092016040019392505050565b818382376000910190815291905056fea164736f6c634300080f000ab53127684a568b3173ae13b9f8a6016e243e63b6e8ee1178d6a717850b5d6103000000000000000000000000db8cff278adccf9e9b5da745b44e754fc4ee3c76", - "deployedCode": "0x60806040526004361061005e5760003560e01c80635c60da1b116100435780635c60da1b146100be5780638f283970146100f8578063f851a440146101185761006d565b80633659cfe6146100755780634f1ef286146100955761006d565b3661006d5761006b61012d565b005b61006b61012d565b34801561008157600080fd5b5061006b6100903660046106dd565b610224565b6100a86100a33660046106f8565b610296565b6040516100b5919061077b565b60405180910390f35b3480156100ca57600080fd5b506100d3610419565b60405173ffffffffffffffffffffffffffffffffffffffff90911681526020016100b5565b34801561010457600080fd5b5061006b6101133660046106dd565b6104b0565b34801561012457600080fd5b506100d3610517565b60006101577f360894a13ba1a3210667c828492db98dca3e2076cc3735a920a3ca505d382bbc5490565b905073ffffffffffffffffffffffffffffffffffffffff8116610201576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602560248201527f50726f78793a20696d706c656d656e746174696f6e206e6f7420696e6974696160448201527f6c697a656400000000000000000000000000000000000000000000000000000060648201526084015b60405180910390fd5b3660008037600080366000845af43d6000803e8061021e573d6000fd5b503d6000f35b7fb53127684a568b3173ae13b9f8a6016e243e63b6e8ee1178d6a717850b5d61035473ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff16148061027d575033155b1561028e5761028b816105a3565b50565b61028b61012d565b60606102c07fb53127684a568b3173ae13b9f8a6016e243e63b6e8ee1178d6a717850b5d61035490565b73ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff1614806102f7575033155b1561040a57610305846105a3565b6000808573ffffffffffffffffffffffffffffffffffffffff16858560405161032f9291906107ee565b600060405180830381855af49150503d806000811461036a576040519150601f19603f3d011682016040523d82523d6000602084013e61036f565b606091505b509150915081610401576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152603960248201527f50726f78793a2064656c656761746563616c6c20746f206e657720696d706c6560448201527f6d656e746174696f6e20636f6e7472616374206661696c65640000000000000060648201526084016101f8565b91506104129050565b61041261012d565b9392505050565b60006104437fb53127684a568b3173ae13b9f8a6016e243e63b6e8ee1178d6a717850b5d61035490565b73ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff16148061047a575033155b156104a557507f360894a13ba1a3210667c828492db98dca3e2076cc3735a920a3ca505d382bbc5490565b6104ad61012d565b90565b7fb53127684a568b3173ae13b9f8a6016e243e63b6e8ee1178d6a717850b5d61035473ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff161480610509575033155b1561028e5761028b8161060c565b60006105417fb53127684a568b3173ae13b9f8a6016e243e63b6e8ee1178d6a717850b5d61035490565b73ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff161480610578575033155b156104a557507fb53127684a568b3173ae13b9f8a6016e243e63b6e8ee1178d6a717850b5d61035490565b7f360894a13ba1a3210667c828492db98dca3e2076cc3735a920a3ca505d382bbc81815560405173ffffffffffffffffffffffffffffffffffffffff8316907fbc7cd75a20ee27fd9adebab32041f755214dbc6bffa90cc0225b39da2e5c2d3b90600090a25050565b60006106367fb53127684a568b3173ae13b9f8a6016e243e63b6e8ee1178d6a717850b5d61035490565b7fb53127684a568b3173ae13b9f8a6016e243e63b6e8ee1178d6a717850b5d61038381556040805173ffffffffffffffffffffffffffffffffffffffff80851682528616602082015292935090917f7e644d79422f17c01e4894b5f4f588d331ebfa28653d42ae832dc59e38c9798f910160405180910390a1505050565b803573ffffffffffffffffffffffffffffffffffffffff811681146106d857600080fd5b919050565b6000602082840312156106ef57600080fd5b610412826106b4565b60008060006040848603121561070d57600080fd5b610716846106b4565b9250602084013567ffffffffffffffff8082111561073357600080fd5b818601915086601f83011261074757600080fd5b81358181111561075657600080fd5b87602082850101111561076857600080fd5b6020830194508093505050509250925092565b600060208083528351808285015260005b818110156107a85785810183015185820160400152820161078c565b818111156107ba576000604083870101525b50601f017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe016929092016040019392505050565b818382376000910190815291905056fea164736f6c634300080f000a", - "initialized": true, - "kind": "Create", - "newBalance": 0, - "oldBalance": 0, - "reverted": false, - "storageAccesses": [ - { - "account": "0x978e3286EB805934215a88694d80b09aDed68D90", - "isWrite": false, - "newValue": "0x0000000000000000000000000000000000000000000000000000000000000000", - "previousValue": "0x0000000000000000000000000000000000000000000000000000000000000000", - "reverted": false, - "slot": "0xb53127684a568b3173ae13b9f8a6016e243e63b6e8ee1178d6a717850b5d6103" - }, - { - "account": "0x978e3286EB805934215a88694d80b09aDed68D90", - "isWrite": true, - "newValue": "0x000000000000000000000000db8cff278adccf9e9b5da745b44e754fc4ee3c76", - "previousValue": "0x0000000000000000000000000000000000000000000000000000000000000000", - "reverted": false, - "slot": "0xb53127684a568b3173ae13b9f8a6016e243e63b6e8ee1178d6a717850b5d6103" - } - ], - "value": 0 - }, - { - "accessor": "0x7FA9385bE102ac3EAc297483Dd6233D62b3e1496", - "account": "0x7109709ECfa91a80626fF3989D68f67F5b1DD12D", - "chainInfo": { - "chainId": 31337, - "forkId": 0 - }, - "data": "0x", - "deployedCode": "0x", - "initialized": true, - "kind": "Resume", - "newBalance": 0, - "oldBalance": 0, - "reverted": false, - "storageAccesses": [], - "value": 0 - }, - { - "accessor": "0x7FA9385bE102ac3EAc297483Dd6233D62b3e1496", - "account": "0x7109709ECfa91a80626fF3989D68f67F5b1DD12D", - "chainInfo": { - "chainId": 31337, - "forkId": 0 - }, - "data": "0x", - "deployedCode": "0x", - "initialized": true, - "kind": "Resume", - "newBalance": 0, - "oldBalance": 0, - "reverted": false, - "storageAccesses": [], - "value": 0 - }, - { - "accessor": "0x7FA9385bE102ac3EAc297483Dd6233D62b3e1496", - "account": "0x7109709ECfa91a80626fF3989D68f67F5b1DD12D", - "chainInfo": { - "chainId": 31337, - "forkId": 0 - }, - "data": "0x", - "deployedCode": "0x", - "initialized": true, - "kind": "Resume", - "newBalance": 0, - "oldBalance": 0, - "reverted": false, - "storageAccesses": [], - "value": 0 - }, - { - "accessor": "0x1804c8AB1F12E6bbf3894d4083f33e07309d1f38", - "account": "0x8B71b41D4dBEb2b6821d44692d3fACAAf77480Bb", - "chainInfo": { - "chainId": 31337, - "forkId": 0 - }, - "data": "0x608060405234801561001057600080fd5b5060405161091f38038061091f83398101604081905261002f916100b5565b6100388161003e565b506100e5565b60006100566000805160206108ff8339815191525490565b6000805160206108ff833981519152838155604080516001600160a01b0380851682528616602082015292935090917f7e644d79422f17c01e4894b5f4f588d331ebfa28653d42ae832dc59e38c9798f910160405180910390a1505050565b6000602082840312156100c757600080fd5b81516001600160a01b03811681146100de57600080fd5b9392505050565b61080b806100f46000396000f3fe60806040526004361061005e5760003560e01c80635c60da1b116100435780635c60da1b146100be5780638f283970146100f8578063f851a440146101185761006d565b80633659cfe6146100755780634f1ef286146100955761006d565b3661006d5761006b61012d565b005b61006b61012d565b34801561008157600080fd5b5061006b6100903660046106dd565b610224565b6100a86100a33660046106f8565b610296565b6040516100b5919061077b565b60405180910390f35b3480156100ca57600080fd5b506100d3610419565b60405173ffffffffffffffffffffffffffffffffffffffff90911681526020016100b5565b34801561010457600080fd5b5061006b6101133660046106dd565b6104b0565b34801561012457600080fd5b506100d3610517565b60006101577f360894a13ba1a3210667c828492db98dca3e2076cc3735a920a3ca505d382bbc5490565b905073ffffffffffffffffffffffffffffffffffffffff8116610201576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602560248201527f50726f78793a20696d706c656d656e746174696f6e206e6f7420696e6974696160448201527f6c697a656400000000000000000000000000000000000000000000000000000060648201526084015b60405180910390fd5b3660008037600080366000845af43d6000803e8061021e573d6000fd5b503d6000f35b7fb53127684a568b3173ae13b9f8a6016e243e63b6e8ee1178d6a717850b5d61035473ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff16148061027d575033155b1561028e5761028b816105a3565b50565b61028b61012d565b60606102c07fb53127684a568b3173ae13b9f8a6016e243e63b6e8ee1178d6a717850b5d61035490565b73ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff1614806102f7575033155b1561040a57610305846105a3565b6000808573ffffffffffffffffffffffffffffffffffffffff16858560405161032f9291906107ee565b600060405180830381855af49150503d806000811461036a576040519150601f19603f3d011682016040523d82523d6000602084013e61036f565b606091505b509150915081610401576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152603960248201527f50726f78793a2064656c656761746563616c6c20746f206e657720696d706c6560448201527f6d656e746174696f6e20636f6e7472616374206661696c65640000000000000060648201526084016101f8565b91506104129050565b61041261012d565b9392505050565b60006104437fb53127684a568b3173ae13b9f8a6016e243e63b6e8ee1178d6a717850b5d61035490565b73ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff16148061047a575033155b156104a557507f360894a13ba1a3210667c828492db98dca3e2076cc3735a920a3ca505d382bbc5490565b6104ad61012d565b90565b7fb53127684a568b3173ae13b9f8a6016e243e63b6e8ee1178d6a717850b5d61035473ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff161480610509575033155b1561028e5761028b8161060c565b60006105417fb53127684a568b3173ae13b9f8a6016e243e63b6e8ee1178d6a717850b5d61035490565b73ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff161480610578575033155b156104a557507fb53127684a568b3173ae13b9f8a6016e243e63b6e8ee1178d6a717850b5d61035490565b7f360894a13ba1a3210667c828492db98dca3e2076cc3735a920a3ca505d382bbc81815560405173ffffffffffffffffffffffffffffffffffffffff8316907fbc7cd75a20ee27fd9adebab32041f755214dbc6bffa90cc0225b39da2e5c2d3b90600090a25050565b60006106367fb53127684a568b3173ae13b9f8a6016e243e63b6e8ee1178d6a717850b5d61035490565b7fb53127684a568b3173ae13b9f8a6016e243e63b6e8ee1178d6a717850b5d61038381556040805173ffffffffffffffffffffffffffffffffffffffff80851682528616602082015292935090917f7e644d79422f17c01e4894b5f4f588d331ebfa28653d42ae832dc59e38c9798f910160405180910390a1505050565b803573ffffffffffffffffffffffffffffffffffffffff811681146106d857600080fd5b919050565b6000602082840312156106ef57600080fd5b610412826106b4565b60008060006040848603121561070d57600080fd5b610716846106b4565b9250602084013567ffffffffffffffff8082111561073357600080fd5b818601915086601f83011261074757600080fd5b81358181111561075657600080fd5b87602082850101111561076857600080fd5b6020830194508093505050509250925092565b600060208083528351808285015260005b818110156107a85785810183015185820160400152820161078c565b818111156107ba576000604083870101525b50601f017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe016929092016040019392505050565b818382376000910190815291905056fea164736f6c634300080f000ab53127684a568b3173ae13b9f8a6016e243e63b6e8ee1178d6a717850b5d6103000000000000000000000000db8cff278adccf9e9b5da745b44e754fc4ee3c76", - "deployedCode": "0x60806040526004361061005e5760003560e01c80635c60da1b116100435780635c60da1b146100be5780638f283970146100f8578063f851a440146101185761006d565b80633659cfe6146100755780634f1ef286146100955761006d565b3661006d5761006b61012d565b005b61006b61012d565b34801561008157600080fd5b5061006b6100903660046106dd565b610224565b6100a86100a33660046106f8565b610296565b6040516100b5919061077b565b60405180910390f35b3480156100ca57600080fd5b506100d3610419565b60405173ffffffffffffffffffffffffffffffffffffffff90911681526020016100b5565b34801561010457600080fd5b5061006b6101133660046106dd565b6104b0565b34801561012457600080fd5b506100d3610517565b60006101577f360894a13ba1a3210667c828492db98dca3e2076cc3735a920a3ca505d382bbc5490565b905073ffffffffffffffffffffffffffffffffffffffff8116610201576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602560248201527f50726f78793a20696d706c656d656e746174696f6e206e6f7420696e6974696160448201527f6c697a656400000000000000000000000000000000000000000000000000000060648201526084015b60405180910390fd5b3660008037600080366000845af43d6000803e8061021e573d6000fd5b503d6000f35b7fb53127684a568b3173ae13b9f8a6016e243e63b6e8ee1178d6a717850b5d61035473ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff16148061027d575033155b1561028e5761028b816105a3565b50565b61028b61012d565b60606102c07fb53127684a568b3173ae13b9f8a6016e243e63b6e8ee1178d6a717850b5d61035490565b73ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff1614806102f7575033155b1561040a57610305846105a3565b6000808573ffffffffffffffffffffffffffffffffffffffff16858560405161032f9291906107ee565b600060405180830381855af49150503d806000811461036a576040519150601f19603f3d011682016040523d82523d6000602084013e61036f565b606091505b509150915081610401576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152603960248201527f50726f78793a2064656c656761746563616c6c20746f206e657720696d706c6560448201527f6d656e746174696f6e20636f6e7472616374206661696c65640000000000000060648201526084016101f8565b91506104129050565b61041261012d565b9392505050565b60006104437fb53127684a568b3173ae13b9f8a6016e243e63b6e8ee1178d6a717850b5d61035490565b73ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff16148061047a575033155b156104a557507f360894a13ba1a3210667c828492db98dca3e2076cc3735a920a3ca505d382bbc5490565b6104ad61012d565b90565b7fb53127684a568b3173ae13b9f8a6016e243e63b6e8ee1178d6a717850b5d61035473ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff161480610509575033155b1561028e5761028b8161060c565b60006105417fb53127684a568b3173ae13b9f8a6016e243e63b6e8ee1178d6a717850b5d61035490565b73ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff161480610578575033155b156104a557507fb53127684a568b3173ae13b9f8a6016e243e63b6e8ee1178d6a717850b5d61035490565b7f360894a13ba1a3210667c828492db98dca3e2076cc3735a920a3ca505d382bbc81815560405173ffffffffffffffffffffffffffffffffffffffff8316907fbc7cd75a20ee27fd9adebab32041f755214dbc6bffa90cc0225b39da2e5c2d3b90600090a25050565b60006106367fb53127684a568b3173ae13b9f8a6016e243e63b6e8ee1178d6a717850b5d61035490565b7fb53127684a568b3173ae13b9f8a6016e243e63b6e8ee1178d6a717850b5d61038381556040805173ffffffffffffffffffffffffffffffffffffffff80851682528616602082015292935090917f7e644d79422f17c01e4894b5f4f588d331ebfa28653d42ae832dc59e38c9798f910160405180910390a1505050565b803573ffffffffffffffffffffffffffffffffffffffff811681146106d857600080fd5b919050565b6000602082840312156106ef57600080fd5b610412826106b4565b60008060006040848603121561070d57600080fd5b610716846106b4565b9250602084013567ffffffffffffffff8082111561073357600080fd5b818601915086601f83011261074757600080fd5b81358181111561075657600080fd5b87602082850101111561076857600080fd5b6020830194508093505050509250925092565b600060208083528351808285015260005b818110156107a85785810183015185820160400152820161078c565b818111156107ba576000604083870101525b50601f017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe016929092016040019392505050565b818382376000910190815291905056fea164736f6c634300080f000a", - "initialized": true, - "kind": "Create", - "newBalance": 0, - "oldBalance": 0, - "reverted": false, - "storageAccesses": [ - { - "account": "0x8B71b41D4dBEb2b6821d44692d3fACAAf77480Bb", - "isWrite": false, - "newValue": "0x0000000000000000000000000000000000000000000000000000000000000000", - "previousValue": "0x0000000000000000000000000000000000000000000000000000000000000000", - "reverted": false, - "slot": "0xb53127684a568b3173ae13b9f8a6016e243e63b6e8ee1178d6a717850b5d6103" - }, - { - "account": "0x8B71b41D4dBEb2b6821d44692d3fACAAf77480Bb", - "isWrite": true, - "newValue": "0x000000000000000000000000db8cff278adccf9e9b5da745b44e754fc4ee3c76", - "previousValue": "0x0000000000000000000000000000000000000000000000000000000000000000", - "reverted": false, - "slot": "0xb53127684a568b3173ae13b9f8a6016e243e63b6e8ee1178d6a717850b5d6103" - } - ], - "value": 0 - }, - { - "accessor": "0x7FA9385bE102ac3EAc297483Dd6233D62b3e1496", - "account": "0x7109709ECfa91a80626fF3989D68f67F5b1DD12D", - "chainInfo": { - "chainId": 31337, - "forkId": 0 - }, - "data": "0x", - "deployedCode": "0x", - "initialized": true, - "kind": "Resume", - "newBalance": 0, - "oldBalance": 0, - "reverted": false, - "storageAccesses": [], - "value": 0 - }, - { - "accessor": "0x7FA9385bE102ac3EAc297483Dd6233D62b3e1496", - "account": "0x7109709ECfa91a80626fF3989D68f67F5b1DD12D", - "chainInfo": { - "chainId": 31337, - "forkId": 0 - }, - "data": "0x", - "deployedCode": "0x", - "initialized": true, - "kind": "Resume", - "newBalance": 0, - "oldBalance": 0, - "reverted": false, - "storageAccesses": [], - "value": 0 - }, - { - "accessor": "0x7FA9385bE102ac3EAc297483Dd6233D62b3e1496", - "account": "0x7109709ECfa91a80626fF3989D68f67F5b1DD12D", - "chainInfo": { - "chainId": 31337, - "forkId": 0 - }, - "data": "0x", - "deployedCode": "0x", - "initialized": true, - "kind": "Resume", - "newBalance": 0, - "oldBalance": 0, - "reverted": false, - "storageAccesses": [], - "value": 0 - }, - { - "accessor": "0x1804c8AB1F12E6bbf3894d4083f33e07309d1f38", - "account": "0x1c23A6d89F95ef3148BCDA8E242cAb145bf9c0E4", - "chainInfo": { - "chainId": 31337, - "forkId": 0 - }, - "data": "0x608060405234801561001057600080fd5b5060405161091f38038061091f83398101604081905261002f916100b5565b6100388161003e565b506100e5565b60006100566000805160206108ff8339815191525490565b6000805160206108ff833981519152838155604080516001600160a01b0380851682528616602082015292935090917f7e644d79422f17c01e4894b5f4f588d331ebfa28653d42ae832dc59e38c9798f910160405180910390a1505050565b6000602082840312156100c757600080fd5b81516001600160a01b03811681146100de57600080fd5b9392505050565b61080b806100f46000396000f3fe60806040526004361061005e5760003560e01c80635c60da1b116100435780635c60da1b146100be5780638f283970146100f8578063f851a440146101185761006d565b80633659cfe6146100755780634f1ef286146100955761006d565b3661006d5761006b61012d565b005b61006b61012d565b34801561008157600080fd5b5061006b6100903660046106dd565b610224565b6100a86100a33660046106f8565b610296565b6040516100b5919061077b565b60405180910390f35b3480156100ca57600080fd5b506100d3610419565b60405173ffffffffffffffffffffffffffffffffffffffff90911681526020016100b5565b34801561010457600080fd5b5061006b6101133660046106dd565b6104b0565b34801561012457600080fd5b506100d3610517565b60006101577f360894a13ba1a3210667c828492db98dca3e2076cc3735a920a3ca505d382bbc5490565b905073ffffffffffffffffffffffffffffffffffffffff8116610201576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602560248201527f50726f78793a20696d706c656d656e746174696f6e206e6f7420696e6974696160448201527f6c697a656400000000000000000000000000000000000000000000000000000060648201526084015b60405180910390fd5b3660008037600080366000845af43d6000803e8061021e573d6000fd5b503d6000f35b7fb53127684a568b3173ae13b9f8a6016e243e63b6e8ee1178d6a717850b5d61035473ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff16148061027d575033155b1561028e5761028b816105a3565b50565b61028b61012d565b60606102c07fb53127684a568b3173ae13b9f8a6016e243e63b6e8ee1178d6a717850b5d61035490565b73ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff1614806102f7575033155b1561040a57610305846105a3565b6000808573ffffffffffffffffffffffffffffffffffffffff16858560405161032f9291906107ee565b600060405180830381855af49150503d806000811461036a576040519150601f19603f3d011682016040523d82523d6000602084013e61036f565b606091505b509150915081610401576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152603960248201527f50726f78793a2064656c656761746563616c6c20746f206e657720696d706c6560448201527f6d656e746174696f6e20636f6e7472616374206661696c65640000000000000060648201526084016101f8565b91506104129050565b61041261012d565b9392505050565b60006104437fb53127684a568b3173ae13b9f8a6016e243e63b6e8ee1178d6a717850b5d61035490565b73ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff16148061047a575033155b156104a557507f360894a13ba1a3210667c828492db98dca3e2076cc3735a920a3ca505d382bbc5490565b6104ad61012d565b90565b7fb53127684a568b3173ae13b9f8a6016e243e63b6e8ee1178d6a717850b5d61035473ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff161480610509575033155b1561028e5761028b8161060c565b60006105417fb53127684a568b3173ae13b9f8a6016e243e63b6e8ee1178d6a717850b5d61035490565b73ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff161480610578575033155b156104a557507fb53127684a568b3173ae13b9f8a6016e243e63b6e8ee1178d6a717850b5d61035490565b7f360894a13ba1a3210667c828492db98dca3e2076cc3735a920a3ca505d382bbc81815560405173ffffffffffffffffffffffffffffffffffffffff8316907fbc7cd75a20ee27fd9adebab32041f755214dbc6bffa90cc0225b39da2e5c2d3b90600090a25050565b60006106367fb53127684a568b3173ae13b9f8a6016e243e63b6e8ee1178d6a717850b5d61035490565b7fb53127684a568b3173ae13b9f8a6016e243e63b6e8ee1178d6a717850b5d61038381556040805173ffffffffffffffffffffffffffffffffffffffff80851682528616602082015292935090917f7e644d79422f17c01e4894b5f4f588d331ebfa28653d42ae832dc59e38c9798f910160405180910390a1505050565b803573ffffffffffffffffffffffffffffffffffffffff811681146106d857600080fd5b919050565b6000602082840312156106ef57600080fd5b610412826106b4565b60008060006040848603121561070d57600080fd5b610716846106b4565b9250602084013567ffffffffffffffff8082111561073357600080fd5b818601915086601f83011261074757600080fd5b81358181111561075657600080fd5b87602082850101111561076857600080fd5b6020830194508093505050509250925092565b600060208083528351808285015260005b818110156107a85785810183015185820160400152820161078c565b818111156107ba576000604083870101525b50601f017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe016929092016040019392505050565b818382376000910190815291905056fea164736f6c634300080f000ab53127684a568b3173ae13b9f8a6016e243e63b6e8ee1178d6a717850b5d6103000000000000000000000000db8cff278adccf9e9b5da745b44e754fc4ee3c76", - "deployedCode": "0x60806040526004361061005e5760003560e01c80635c60da1b116100435780635c60da1b146100be5780638f283970146100f8578063f851a440146101185761006d565b80633659cfe6146100755780634f1ef286146100955761006d565b3661006d5761006b61012d565b005b61006b61012d565b34801561008157600080fd5b5061006b6100903660046106dd565b610224565b6100a86100a33660046106f8565b610296565b6040516100b5919061077b565b60405180910390f35b3480156100ca57600080fd5b506100d3610419565b60405173ffffffffffffffffffffffffffffffffffffffff90911681526020016100b5565b34801561010457600080fd5b5061006b6101133660046106dd565b6104b0565b34801561012457600080fd5b506100d3610517565b60006101577f360894a13ba1a3210667c828492db98dca3e2076cc3735a920a3ca505d382bbc5490565b905073ffffffffffffffffffffffffffffffffffffffff8116610201576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602560248201527f50726f78793a20696d706c656d656e746174696f6e206e6f7420696e6974696160448201527f6c697a656400000000000000000000000000000000000000000000000000000060648201526084015b60405180910390fd5b3660008037600080366000845af43d6000803e8061021e573d6000fd5b503d6000f35b7fb53127684a568b3173ae13b9f8a6016e243e63b6e8ee1178d6a717850b5d61035473ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff16148061027d575033155b1561028e5761028b816105a3565b50565b61028b61012d565b60606102c07fb53127684a568b3173ae13b9f8a6016e243e63b6e8ee1178d6a717850b5d61035490565b73ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff1614806102f7575033155b1561040a57610305846105a3565b6000808573ffffffffffffffffffffffffffffffffffffffff16858560405161032f9291906107ee565b600060405180830381855af49150503d806000811461036a576040519150601f19603f3d011682016040523d82523d6000602084013e61036f565b606091505b509150915081610401576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152603960248201527f50726f78793a2064656c656761746563616c6c20746f206e657720696d706c6560448201527f6d656e746174696f6e20636f6e7472616374206661696c65640000000000000060648201526084016101f8565b91506104129050565b61041261012d565b9392505050565b60006104437fb53127684a568b3173ae13b9f8a6016e243e63b6e8ee1178d6a717850b5d61035490565b73ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff16148061047a575033155b156104a557507f360894a13ba1a3210667c828492db98dca3e2076cc3735a920a3ca505d382bbc5490565b6104ad61012d565b90565b7fb53127684a568b3173ae13b9f8a6016e243e63b6e8ee1178d6a717850b5d61035473ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff161480610509575033155b1561028e5761028b8161060c565b60006105417fb53127684a568b3173ae13b9f8a6016e243e63b6e8ee1178d6a717850b5d61035490565b73ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff161480610578575033155b156104a557507fb53127684a568b3173ae13b9f8a6016e243e63b6e8ee1178d6a717850b5d61035490565b7f360894a13ba1a3210667c828492db98dca3e2076cc3735a920a3ca505d382bbc81815560405173ffffffffffffffffffffffffffffffffffffffff8316907fbc7cd75a20ee27fd9adebab32041f755214dbc6bffa90cc0225b39da2e5c2d3b90600090a25050565b60006106367fb53127684a568b3173ae13b9f8a6016e243e63b6e8ee1178d6a717850b5d61035490565b7fb53127684a568b3173ae13b9f8a6016e243e63b6e8ee1178d6a717850b5d61038381556040805173ffffffffffffffffffffffffffffffffffffffff80851682528616602082015292935090917f7e644d79422f17c01e4894b5f4f588d331ebfa28653d42ae832dc59e38c9798f910160405180910390a1505050565b803573ffffffffffffffffffffffffffffffffffffffff811681146106d857600080fd5b919050565b6000602082840312156106ef57600080fd5b610412826106b4565b60008060006040848603121561070d57600080fd5b610716846106b4565b9250602084013567ffffffffffffffff8082111561073357600080fd5b818601915086601f83011261074757600080fd5b81358181111561075657600080fd5b87602082850101111561076857600080fd5b6020830194508093505050509250925092565b600060208083528351808285015260005b818110156107a85785810183015185820160400152820161078c565b818111156107ba576000604083870101525b50601f017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe016929092016040019392505050565b818382376000910190815291905056fea164736f6c634300080f000a", - "initialized": true, - "kind": "Create", - "newBalance": 0, - "oldBalance": 0, - "reverted": false, - "storageAccesses": [ - { - "account": "0x1c23A6d89F95ef3148BCDA8E242cAb145bf9c0E4", - "isWrite": false, - "newValue": "0x0000000000000000000000000000000000000000000000000000000000000000", - "previousValue": "0x0000000000000000000000000000000000000000000000000000000000000000", - "reverted": false, - "slot": "0xb53127684a568b3173ae13b9f8a6016e243e63b6e8ee1178d6a717850b5d6103" - }, - { - "account": "0x1c23A6d89F95ef3148BCDA8E242cAb145bf9c0E4", - "isWrite": true, - "newValue": "0x000000000000000000000000db8cff278adccf9e9b5da745b44e754fc4ee3c76", - "previousValue": "0x0000000000000000000000000000000000000000000000000000000000000000", - "reverted": false, - "slot": "0xb53127684a568b3173ae13b9f8a6016e243e63b6e8ee1178d6a717850b5d6103" - } - ], - "value": 0 - }, - { - "accessor": "0x7FA9385bE102ac3EAc297483Dd6233D62b3e1496", - "account": "0x7109709ECfa91a80626fF3989D68f67F5b1DD12D", - "chainInfo": { - "chainId": 31337, - "forkId": 0 - }, - "data": "0x", - "deployedCode": "0x", - "initialized": true, - "kind": "Resume", - "newBalance": 0, - "oldBalance": 0, - "reverted": false, - "storageAccesses": [], - "value": 0 - }, - { - "accessor": "0x7FA9385bE102ac3EAc297483Dd6233D62b3e1496", - "account": "0x7109709ECfa91a80626fF3989D68f67F5b1DD12D", - "chainInfo": { - "chainId": 31337, - "forkId": 0 - }, - "data": "0x", - "deployedCode": "0x", - "initialized": true, - "kind": "Resume", - "newBalance": 0, - "oldBalance": 0, - "reverted": false, - "storageAccesses": [], - "value": 0 - }, - { - "accessor": "0x7FA9385bE102ac3EAc297483Dd6233D62b3e1496", - "account": "0x7109709ECfa91a80626fF3989D68f67F5b1DD12D", - "chainInfo": { - "chainId": 31337, - "forkId": 0 - }, - "data": "0x", - "deployedCode": "0x", - "initialized": true, - "kind": "Resume", - "newBalance": 0, - "oldBalance": 0, - "reverted": false, - "storageAccesses": [], - "value": 0 - }, - { - "accessor": "0x1804c8AB1F12E6bbf3894d4083f33e07309d1f38", - "account": "0x0c8b5822b6e02CDa722174F19A1439A7495a3fA6", - "chainInfo": { - "chainId": 31337, - "forkId": 0 - }, - "data": "0x608060405234801561001057600080fd5b50604051610a44380380610a4483398101604081905261002f9161005d565b610057817fb53127684a568b3173ae13b9f8a6016e243e63b6e8ee1178d6a717850b5d610355565b5061008d565b60006020828403121561006f57600080fd5b81516001600160a01b038116811461008657600080fd5b9392505050565b6109a88061009c6000396000f3fe60806040526004361061005e5760003560e01c8063893d20e811610043578063893d20e8146100b55780639b0b0fda146100f3578063aaf10f42146101135761006d565b806313af4035146100755780636c5d4ad0146100955761006d565b3661006d5761006b610128565b005b61006b610128565b34801561008157600080fd5b5061006b6100903660046107a2565b6103cb565b3480156100a157600080fd5b5061006b6100b036600461080e565b61045c565b3480156100c157600080fd5b506100ca610611565b60405173ffffffffffffffffffffffffffffffffffffffff909116815260200160405180910390f35b3480156100ff57600080fd5b5061006b61010e3660046108dd565b6106a8565b34801561011f57600080fd5b506100ca610716565b60006101527fb53127684a568b3173ae13b9f8a6016e243e63b6e8ee1178d6a717850b5d61035490565b60408051600481526024810182526020810180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff167fb7947262000000000000000000000000000000000000000000000000000000001790529051919250600091829173ffffffffffffffffffffffffffffffffffffffff8516916101d4919061093a565b600060405180830381855afa9150503d806000811461020f576040519150601f19603f3d011682016040523d82523d6000602084013e610214565b606091505b5091509150818015610227575080516020145b156102d9576000818060200190518101906102429190610946565b905080156102d7576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152603560248201527f4c314368756753706c61736850726f78793a2073797374656d2069732063757260448201527f72656e746c79206265696e67207570677261646564000000000000000000000060648201526084015b60405180910390fd5b505b60006103037f360894a13ba1a3210667c828492db98dca3e2076cc3735a920a3ca505d382bbc5490565b905073ffffffffffffffffffffffffffffffffffffffff81166103a8576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152603060248201527f4c314368756753706c61736850726f78793a20696d706c656d656e746174696f60448201527f6e206973206e6f7420736574207965740000000000000000000000000000000060648201526084016102ce565b3660008037600080366000845af43d6000803e806103c5573d6000fd5b503d6000f35b7fb53127684a568b3173ae13b9f8a6016e243e63b6e8ee1178d6a717850b5d61035473ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff161480610424575033155b1561045457610451817fb53127684a568b3173ae13b9f8a6016e243e63b6e8ee1178d6a717850b5d610355565b50565b610451610128565b7fb53127684a568b3173ae13b9f8a6016e243e63b6e8ee1178d6a717850b5d61035473ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff1614806104b5575033155b156104545760006104e47f360894a13ba1a3210667c828492db98dca3e2076cc3735a920a3ca505d382bbc5490565b9050803f82516020840120036104f8575050565b60405160009061052e907f600d380380600d6000396000f30000000000000000000000000000000000000090859060200161095f565b604051602081830303815290604052905060008151602083016000f084516020860120909150813f146105e3576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152603260248201527f4c314368756753706c61736850726f78793a20636f646520776173206e6f742060448201527f636f72726563746c79206465706c6f796564000000000000000000000000000060648201526084016102ce565b61060b817f360894a13ba1a3210667c828492db98dca3e2076cc3735a920a3ca505d382bbc55565b50505050565b600061063b7fb53127684a568b3173ae13b9f8a6016e243e63b6e8ee1178d6a717850b5d61035490565b73ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff161480610672575033155b1561069d57507fb53127684a568b3173ae13b9f8a6016e243e63b6e8ee1178d6a717850b5d61035490565b6106a5610128565b90565b7fb53127684a568b3173ae13b9f8a6016e243e63b6e8ee1178d6a717850b5d61035473ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff161480610701575033155b1561070a579055565b610712610128565b5050565b60006107407fb53127684a568b3173ae13b9f8a6016e243e63b6e8ee1178d6a717850b5d61035490565b73ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff161480610777575033155b1561069d57507f360894a13ba1a3210667c828492db98dca3e2076cc3735a920a3ca505d382bbc5490565b6000602082840312156107b457600080fd5b813573ffffffffffffffffffffffffffffffffffffffff811681146107d857600080fd5b9392505050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b60006020828403121561082057600080fd5b813567ffffffffffffffff8082111561083857600080fd5b818401915084601f83011261084c57600080fd5b81358181111561085e5761085e6107df565b604051601f82017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0908116603f011681019083821181831017156108a4576108a46107df565b816040528281528760208487010111156108bd57600080fd5b826020860160208301376000928101602001929092525095945050505050565b600080604083850312156108f057600080fd5b50508035926020909101359150565b6000815160005b818110156109205760208185018101518683015201610906565b8181111561092f576000828601525b509290920192915050565b60006107d882846108ff565b60006020828403121561095857600080fd5b5051919050565b7fffffffffffffffffffffffffff00000000000000000000000000000000000000831681526000610993600d8301846108ff565b94935050505056fea164736f6c634300080f000a000000000000000000000000db8cff278adccf9e9b5da745b44e754fc4ee3c76", - "deployedCode": "0x60806040526004361061005e5760003560e01c8063893d20e811610043578063893d20e8146100b55780639b0b0fda146100f3578063aaf10f42146101135761006d565b806313af4035146100755780636c5d4ad0146100955761006d565b3661006d5761006b610128565b005b61006b610128565b34801561008157600080fd5b5061006b6100903660046107a2565b6103cb565b3480156100a157600080fd5b5061006b6100b036600461080e565b61045c565b3480156100c157600080fd5b506100ca610611565b60405173ffffffffffffffffffffffffffffffffffffffff909116815260200160405180910390f35b3480156100ff57600080fd5b5061006b61010e3660046108dd565b6106a8565b34801561011f57600080fd5b506100ca610716565b60006101527fb53127684a568b3173ae13b9f8a6016e243e63b6e8ee1178d6a717850b5d61035490565b60408051600481526024810182526020810180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff167fb7947262000000000000000000000000000000000000000000000000000000001790529051919250600091829173ffffffffffffffffffffffffffffffffffffffff8516916101d4919061093a565b600060405180830381855afa9150503d806000811461020f576040519150601f19603f3d011682016040523d82523d6000602084013e610214565b606091505b5091509150818015610227575080516020145b156102d9576000818060200190518101906102429190610946565b905080156102d7576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152603560248201527f4c314368756753706c61736850726f78793a2073797374656d2069732063757260448201527f72656e746c79206265696e67207570677261646564000000000000000000000060648201526084015b60405180910390fd5b505b60006103037f360894a13ba1a3210667c828492db98dca3e2076cc3735a920a3ca505d382bbc5490565b905073ffffffffffffffffffffffffffffffffffffffff81166103a8576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152603060248201527f4c314368756753706c61736850726f78793a20696d706c656d656e746174696f60448201527f6e206973206e6f7420736574207965740000000000000000000000000000000060648201526084016102ce565b3660008037600080366000845af43d6000803e806103c5573d6000fd5b503d6000f35b7fb53127684a568b3173ae13b9f8a6016e243e63b6e8ee1178d6a717850b5d61035473ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff161480610424575033155b1561045457610451817fb53127684a568b3173ae13b9f8a6016e243e63b6e8ee1178d6a717850b5d610355565b50565b610451610128565b7fb53127684a568b3173ae13b9f8a6016e243e63b6e8ee1178d6a717850b5d61035473ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff1614806104b5575033155b156104545760006104e47f360894a13ba1a3210667c828492db98dca3e2076cc3735a920a3ca505d382bbc5490565b9050803f82516020840120036104f8575050565b60405160009061052e907f600d380380600d6000396000f30000000000000000000000000000000000000090859060200161095f565b604051602081830303815290604052905060008151602083016000f084516020860120909150813f146105e3576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152603260248201527f4c314368756753706c61736850726f78793a20636f646520776173206e6f742060448201527f636f72726563746c79206465706c6f796564000000000000000000000000000060648201526084016102ce565b61060b817f360894a13ba1a3210667c828492db98dca3e2076cc3735a920a3ca505d382bbc55565b50505050565b600061063b7fb53127684a568b3173ae13b9f8a6016e243e63b6e8ee1178d6a717850b5d61035490565b73ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff161480610672575033155b1561069d57507fb53127684a568b3173ae13b9f8a6016e243e63b6e8ee1178d6a717850b5d61035490565b6106a5610128565b90565b7fb53127684a568b3173ae13b9f8a6016e243e63b6e8ee1178d6a717850b5d61035473ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff161480610701575033155b1561070a579055565b610712610128565b5050565b60006107407fb53127684a568b3173ae13b9f8a6016e243e63b6e8ee1178d6a717850b5d61035490565b73ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff161480610777575033155b1561069d57507f360894a13ba1a3210667c828492db98dca3e2076cc3735a920a3ca505d382bbc5490565b6000602082840312156107b457600080fd5b813573ffffffffffffffffffffffffffffffffffffffff811681146107d857600080fd5b9392505050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b60006020828403121561082057600080fd5b813567ffffffffffffffff8082111561083857600080fd5b818401915084601f83011261084c57600080fd5b81358181111561085e5761085e6107df565b604051601f82017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0908116603f011681019083821181831017156108a4576108a46107df565b816040528281528760208487010111156108bd57600080fd5b826020860160208301376000928101602001929092525095945050505050565b600080604083850312156108f057600080fd5b50508035926020909101359150565b6000815160005b818110156109205760208185018101518683015201610906565b8181111561092f576000828601525b509290920192915050565b60006107d882846108ff565b60006020828403121561095857600080fd5b5051919050565b7fffffffffffffffffffffffffff00000000000000000000000000000000000000831681526000610993600d8301846108ff565b94935050505056fea164736f6c634300080f000a", - "initialized": true, - "kind": "Create", - "newBalance": 0, - "oldBalance": 0, - "reverted": false, - "storageAccesses": [ - { - "account": "0x0c8b5822b6e02CDa722174F19A1439A7495a3fA6", - "isWrite": true, - "newValue": "0x000000000000000000000000db8cff278adccf9e9b5da745b44e754fc4ee3c76", - "previousValue": "0x0000000000000000000000000000000000000000000000000000000000000000", - "reverted": false, - "slot": "0xb53127684a568b3173ae13b9f8a6016e243e63b6e8ee1178d6a717850b5d6103" - } - ], - "value": 0 - }, - { - "accessor": "0x7FA9385bE102ac3EAc297483Dd6233D62b3e1496", - "account": "0x7109709ECfa91a80626fF3989D68f67F5b1DD12D", - "chainInfo": { - "chainId": 31337, - "forkId": 0 - }, - "data": "0x", - "deployedCode": "0x", - "initialized": true, - "kind": "Resume", - "newBalance": 0, - "oldBalance": 0, - "reverted": false, - "storageAccesses": [], - "value": 0 - }, - { - "accessor": "0x7FA9385bE102ac3EAc297483Dd6233D62b3e1496", - "account": "0x7109709ECfa91a80626fF3989D68f67F5b1DD12D", - "chainInfo": { - "chainId": 31337, - "forkId": 0 - }, - "data": "0x", - "deployedCode": "0x", - "initialized": true, - "kind": "Resume", - "newBalance": 0, - "oldBalance": 0, - "reverted": false, - "storageAccesses": [], - "value": 0 - }, - { - "accessor": "0x7FA9385bE102ac3EAc297483Dd6233D62b3e1496", - "account": "0x7109709ECfa91a80626fF3989D68f67F5b1DD12D", - "chainInfo": { - "chainId": 31337, - "forkId": 0 - }, - "data": "0x", - "deployedCode": "0x", - "initialized": true, - "kind": "Resume", - "newBalance": 0, - "oldBalance": 0, - "reverted": false, - "storageAccesses": [], - "value": 0 - }, - { - "accessor": "0x1804c8AB1F12E6bbf3894d4083f33e07309d1f38", - "account": "0x20A42a5a785622c6Ba2576B2D6e924aA82BFA11D", - "chainInfo": { - "chainId": 31337, - "forkId": 0 - }, - "data": "0x608060405234801561001057600080fd5b506040516105f03803806105f083398101604081905261002f91610088565b30600090815260016020908152604080832080546001600160a01b0319166001600160a01b03871617905590829052902061006a8282610203565b5050506102c2565b634e487b7160e01b600052604160045260246000fd5b6000806040838503121561009b57600080fd5b82516001600160a01b03811681146100b257600080fd5b602084810151919350906001600160401b03808211156100d157600080fd5b818601915086601f8301126100e557600080fd5b8151818111156100f7576100f7610072565b604051601f8201601f19908116603f0116810190838211818310171561011f5761011f610072565b81604052828152898684870101111561013757600080fd5b600093505b82841015610159578484018601518185018701529285019261013c565b8284111561016a5760008684830101525b8096505050505050509250929050565b600181811c9082168061018e57607f821691505b6020821081036101ae57634e487b7160e01b600052602260045260246000fd5b50919050565b601f8211156101fe57600081815260208120601f850160051c810160208610156101db5750805b601f850160051c820191505b818110156101fa578281556001016101e7565b5050505b505050565b81516001600160401b0381111561021c5761021c610072565b6102308161022a845461017a565b846101b4565b602080601f831160018114610265576000841561024d5750858301515b600019600386901b1c1916600185901b1785556101fa565b600085815260208120601f198616915b8281101561029457888601518255948401946001909101908401610275565b50858210156102b25787850151600019600388901b60f8161c191681555b5050505050600190811b01905550565b61031f806102d16000396000f3fe608060408181523060009081526001602090815282822054908290529181207fbf40fac1000000000000000000000000000000000000000000000000000000009093529173ffffffffffffffffffffffffffffffffffffffff9091169063bf40fac19061006d9060846101e2565b602060405180830381865afa15801561008a573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906100ae91906102c5565b905073ffffffffffffffffffffffffffffffffffffffff8116610157576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152603960248201527f5265736f6c76656444656c656761746550726f78793a2074617267657420616460448201527f6472657373206d75737420626520696e697469616c697a656400000000000000606482015260840160405180910390fd5b6000808273ffffffffffffffffffffffffffffffffffffffff16600036604051610182929190610302565b600060405180830381855af49150503d80600081146101bd576040519150601f19603f3d011682016040523d82523d6000602084013e6101c2565b606091505b5090925090508115156001036101da57805160208201f35b805160208201fd5b600060208083526000845481600182811c91508083168061020457607f831692505b858310810361023a577f4e487b710000000000000000000000000000000000000000000000000000000085526022600452602485fd5b878601838152602001818015610257576001811461028b576102b6565b7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff008616825284151560051b820196506102b6565b60008b81526020902060005b868110156102b057815484820152908501908901610297565b83019750505b50949998505050505050505050565b6000602082840312156102d757600080fd5b815173ffffffffffffffffffffffffffffffffffffffff811681146102fb57600080fd5b9392505050565b818382376000910190815291905056fea164736f6c634300080f000a000000000000000000000000bb2180ebd78ce97360503434ed37fcf4a1df61c30000000000000000000000000000000000000000000000000000000000000040000000000000000000000000000000000000000000000000000000000000001a4f564d5f4c3143726f7373446f6d61696e4d657373656e676572000000000000", - "deployedCode": "0x608060408181523060009081526001602090815282822054908290529181207fbf40fac1000000000000000000000000000000000000000000000000000000009093529173ffffffffffffffffffffffffffffffffffffffff9091169063bf40fac19061006d9060846101e2565b602060405180830381865afa15801561008a573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906100ae91906102c5565b905073ffffffffffffffffffffffffffffffffffffffff8116610157576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152603960248201527f5265736f6c76656444656c656761746550726f78793a2074617267657420616460448201527f6472657373206d75737420626520696e697469616c697a656400000000000000606482015260840160405180910390fd5b6000808273ffffffffffffffffffffffffffffffffffffffff16600036604051610182929190610302565b600060405180830381855af49150503d80600081146101bd576040519150601f19603f3d011682016040523d82523d6000602084013e6101c2565b606091505b5090925090508115156001036101da57805160208201f35b805160208201fd5b600060208083526000845481600182811c91508083168061020457607f831692505b858310810361023a577f4e487b710000000000000000000000000000000000000000000000000000000085526022600452602485fd5b878601838152602001818015610257576001811461028b576102b6565b7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff008616825284151560051b820196506102b6565b60008b81526020902060005b868110156102b057815484820152908501908901610297565b83019750505b50949998505050505050505050565b6000602082840312156102d757600080fd5b815173ffffffffffffffffffffffffffffffffffffffff811681146102fb57600080fd5b9392505050565b818382376000910190815291905056fea164736f6c634300080f000a", - "initialized": true, - "kind": "Create", - "newBalance": 0, - "oldBalance": 0, - "reverted": false, - "storageAccesses": [ - { - "account": "0x20A42a5a785622c6Ba2576B2D6e924aA82BFA11D", - "isWrite": false, - "newValue": "0x0000000000000000000000000000000000000000000000000000000000000000", - "previousValue": "0x0000000000000000000000000000000000000000000000000000000000000000", - "reverted": false, - "slot": "0x540cf4e2f45b866b44f44bde51e109474016dc46a0670fbe1684ad8eaf90fdc3" - }, - { - "account": "0x20A42a5a785622c6Ba2576B2D6e924aA82BFA11D", - "isWrite": true, - "newValue": "0x000000000000000000000000bb2180ebd78ce97360503434ed37fcf4a1df61c3", - "previousValue": "0x0000000000000000000000000000000000000000000000000000000000000000", - "reverted": false, - "slot": "0x540cf4e2f45b866b44f44bde51e109474016dc46a0670fbe1684ad8eaf90fdc3" - }, - { - "account": "0x20A42a5a785622c6Ba2576B2D6e924aA82BFA11D", - "isWrite": false, - "newValue": "0x0000000000000000000000000000000000000000000000000000000000000000", - "previousValue": "0x0000000000000000000000000000000000000000000000000000000000000000", - "reverted": false, - "slot": "0x4505be7acf20898edfef2b5289635349881ad9bf4b57316a74e81e2abec2be52" - }, - { - "account": "0x20A42a5a785622c6Ba2576B2D6e924aA82BFA11D", - "isWrite": true, - "newValue": "0x4f564d5f4c3143726f7373446f6d61696e4d657373656e676572000000000034", - "previousValue": "0x0000000000000000000000000000000000000000000000000000000000000000", - "reverted": false, - "slot": "0x4505be7acf20898edfef2b5289635349881ad9bf4b57316a74e81e2abec2be52" - } - ], - "value": 0 - }, - { - "accessor": "0x7FA9385bE102ac3EAc297483Dd6233D62b3e1496", - "account": "0x7109709ECfa91a80626fF3989D68f67F5b1DD12D", - "chainInfo": { - "chainId": 31337, - "forkId": 0 - }, - "data": "0x", - "deployedCode": "0x", - "initialized": true, - "kind": "Resume", - "newBalance": 0, - "oldBalance": 0, - "reverted": false, - "storageAccesses": [], - "value": 0 - }, - { - "accessor": "0x7FA9385bE102ac3EAc297483Dd6233D62b3e1496", - "account": "0x7109709ECfa91a80626fF3989D68f67F5b1DD12D", - "chainInfo": { - "chainId": 31337, - "forkId": 0 - }, - "data": "0x", - "deployedCode": "0x", - "initialized": true, - "kind": "Resume", - "newBalance": 0, - "oldBalance": 0, - "reverted": false, - "storageAccesses": [], - "value": 0 - }, - { - "accessor": "0x7FA9385bE102ac3EAc297483Dd6233D62b3e1496", - "account": "0x7109709ECfa91a80626fF3989D68f67F5b1DD12D", - "chainInfo": { - "chainId": 31337, - "forkId": 0 - }, - "data": "0x", - "deployedCode": "0x", - "initialized": true, - "kind": "Resume", - "newBalance": 0, - "oldBalance": 0, - "reverted": false, - "storageAccesses": [], - "value": 0 - }, - { - "accessor": "0x1804c8AB1F12E6bbf3894d4083f33e07309d1f38", - "account": "0xDeF3bca8c80064589E6787477FFa7Dd616B5574F", - "chainInfo": { - "chainId": 31337, - "forkId": 0 - }, - "data": "0x608060405234801561001057600080fd5b5060405161091f38038061091f83398101604081905261002f916100b5565b6100388161003e565b506100e5565b60006100566000805160206108ff8339815191525490565b6000805160206108ff833981519152838155604080516001600160a01b0380851682528616602082015292935090917f7e644d79422f17c01e4894b5f4f588d331ebfa28653d42ae832dc59e38c9798f910160405180910390a1505050565b6000602082840312156100c757600080fd5b81516001600160a01b03811681146100de57600080fd5b9392505050565b61080b806100f46000396000f3fe60806040526004361061005e5760003560e01c80635c60da1b116100435780635c60da1b146100be5780638f283970146100f8578063f851a440146101185761006d565b80633659cfe6146100755780634f1ef286146100955761006d565b3661006d5761006b61012d565b005b61006b61012d565b34801561008157600080fd5b5061006b6100903660046106dd565b610224565b6100a86100a33660046106f8565b610296565b6040516100b5919061077b565b60405180910390f35b3480156100ca57600080fd5b506100d3610419565b60405173ffffffffffffffffffffffffffffffffffffffff90911681526020016100b5565b34801561010457600080fd5b5061006b6101133660046106dd565b6104b0565b34801561012457600080fd5b506100d3610517565b60006101577f360894a13ba1a3210667c828492db98dca3e2076cc3735a920a3ca505d382bbc5490565b905073ffffffffffffffffffffffffffffffffffffffff8116610201576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602560248201527f50726f78793a20696d706c656d656e746174696f6e206e6f7420696e6974696160448201527f6c697a656400000000000000000000000000000000000000000000000000000060648201526084015b60405180910390fd5b3660008037600080366000845af43d6000803e8061021e573d6000fd5b503d6000f35b7fb53127684a568b3173ae13b9f8a6016e243e63b6e8ee1178d6a717850b5d61035473ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff16148061027d575033155b1561028e5761028b816105a3565b50565b61028b61012d565b60606102c07fb53127684a568b3173ae13b9f8a6016e243e63b6e8ee1178d6a717850b5d61035490565b73ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff1614806102f7575033155b1561040a57610305846105a3565b6000808573ffffffffffffffffffffffffffffffffffffffff16858560405161032f9291906107ee565b600060405180830381855af49150503d806000811461036a576040519150601f19603f3d011682016040523d82523d6000602084013e61036f565b606091505b509150915081610401576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152603960248201527f50726f78793a2064656c656761746563616c6c20746f206e657720696d706c6560448201527f6d656e746174696f6e20636f6e7472616374206661696c65640000000000000060648201526084016101f8565b91506104129050565b61041261012d565b9392505050565b60006104437fb53127684a568b3173ae13b9f8a6016e243e63b6e8ee1178d6a717850b5d61035490565b73ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff16148061047a575033155b156104a557507f360894a13ba1a3210667c828492db98dca3e2076cc3735a920a3ca505d382bbc5490565b6104ad61012d565b90565b7fb53127684a568b3173ae13b9f8a6016e243e63b6e8ee1178d6a717850b5d61035473ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff161480610509575033155b1561028e5761028b8161060c565b60006105417fb53127684a568b3173ae13b9f8a6016e243e63b6e8ee1178d6a717850b5d61035490565b73ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff161480610578575033155b156104a557507fb53127684a568b3173ae13b9f8a6016e243e63b6e8ee1178d6a717850b5d61035490565b7f360894a13ba1a3210667c828492db98dca3e2076cc3735a920a3ca505d382bbc81815560405173ffffffffffffffffffffffffffffffffffffffff8316907fbc7cd75a20ee27fd9adebab32041f755214dbc6bffa90cc0225b39da2e5c2d3b90600090a25050565b60006106367fb53127684a568b3173ae13b9f8a6016e243e63b6e8ee1178d6a717850b5d61035490565b7fb53127684a568b3173ae13b9f8a6016e243e63b6e8ee1178d6a717850b5d61038381556040805173ffffffffffffffffffffffffffffffffffffffff80851682528616602082015292935090917f7e644d79422f17c01e4894b5f4f588d331ebfa28653d42ae832dc59e38c9798f910160405180910390a1505050565b803573ffffffffffffffffffffffffffffffffffffffff811681146106d857600080fd5b919050565b6000602082840312156106ef57600080fd5b610412826106b4565b60008060006040848603121561070d57600080fd5b610716846106b4565b9250602084013567ffffffffffffffff8082111561073357600080fd5b818601915086601f83011261074757600080fd5b81358181111561075657600080fd5b87602082850101111561076857600080fd5b6020830194508093505050509250925092565b600060208083528351808285015260005b818110156107a85785810183015185820160400152820161078c565b818111156107ba576000604083870101525b50601f017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe016929092016040019392505050565b818382376000910190815291905056fea164736f6c634300080f000ab53127684a568b3173ae13b9f8a6016e243e63b6e8ee1178d6a717850b5d6103000000000000000000000000db8cff278adccf9e9b5da745b44e754fc4ee3c76", - "deployedCode": "0x60806040526004361061005e5760003560e01c80635c60da1b116100435780635c60da1b146100be5780638f283970146100f8578063f851a440146101185761006d565b80633659cfe6146100755780634f1ef286146100955761006d565b3661006d5761006b61012d565b005b61006b61012d565b34801561008157600080fd5b5061006b6100903660046106dd565b610224565b6100a86100a33660046106f8565b610296565b6040516100b5919061077b565b60405180910390f35b3480156100ca57600080fd5b506100d3610419565b60405173ffffffffffffffffffffffffffffffffffffffff90911681526020016100b5565b34801561010457600080fd5b5061006b6101133660046106dd565b6104b0565b34801561012457600080fd5b506100d3610517565b60006101577f360894a13ba1a3210667c828492db98dca3e2076cc3735a920a3ca505d382bbc5490565b905073ffffffffffffffffffffffffffffffffffffffff8116610201576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602560248201527f50726f78793a20696d706c656d656e746174696f6e206e6f7420696e6974696160448201527f6c697a656400000000000000000000000000000000000000000000000000000060648201526084015b60405180910390fd5b3660008037600080366000845af43d6000803e8061021e573d6000fd5b503d6000f35b7fb53127684a568b3173ae13b9f8a6016e243e63b6e8ee1178d6a717850b5d61035473ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff16148061027d575033155b1561028e5761028b816105a3565b50565b61028b61012d565b60606102c07fb53127684a568b3173ae13b9f8a6016e243e63b6e8ee1178d6a717850b5d61035490565b73ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff1614806102f7575033155b1561040a57610305846105a3565b6000808573ffffffffffffffffffffffffffffffffffffffff16858560405161032f9291906107ee565b600060405180830381855af49150503d806000811461036a576040519150601f19603f3d011682016040523d82523d6000602084013e61036f565b606091505b509150915081610401576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152603960248201527f50726f78793a2064656c656761746563616c6c20746f206e657720696d706c6560448201527f6d656e746174696f6e20636f6e7472616374206661696c65640000000000000060648201526084016101f8565b91506104129050565b61041261012d565b9392505050565b60006104437fb53127684a568b3173ae13b9f8a6016e243e63b6e8ee1178d6a717850b5d61035490565b73ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff16148061047a575033155b156104a557507f360894a13ba1a3210667c828492db98dca3e2076cc3735a920a3ca505d382bbc5490565b6104ad61012d565b90565b7fb53127684a568b3173ae13b9f8a6016e243e63b6e8ee1178d6a717850b5d61035473ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff161480610509575033155b1561028e5761028b8161060c565b60006105417fb53127684a568b3173ae13b9f8a6016e243e63b6e8ee1178d6a717850b5d61035490565b73ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff161480610578575033155b156104a557507fb53127684a568b3173ae13b9f8a6016e243e63b6e8ee1178d6a717850b5d61035490565b7f360894a13ba1a3210667c828492db98dca3e2076cc3735a920a3ca505d382bbc81815560405173ffffffffffffffffffffffffffffffffffffffff8316907fbc7cd75a20ee27fd9adebab32041f755214dbc6bffa90cc0225b39da2e5c2d3b90600090a25050565b60006106367fb53127684a568b3173ae13b9f8a6016e243e63b6e8ee1178d6a717850b5d61035490565b7fb53127684a568b3173ae13b9f8a6016e243e63b6e8ee1178d6a717850b5d61038381556040805173ffffffffffffffffffffffffffffffffffffffff80851682528616602082015292935090917f7e644d79422f17c01e4894b5f4f588d331ebfa28653d42ae832dc59e38c9798f910160405180910390a1505050565b803573ffffffffffffffffffffffffffffffffffffffff811681146106d857600080fd5b919050565b6000602082840312156106ef57600080fd5b610412826106b4565b60008060006040848603121561070d57600080fd5b610716846106b4565b9250602084013567ffffffffffffffff8082111561073357600080fd5b818601915086601f83011261074757600080fd5b81358181111561075657600080fd5b87602082850101111561076857600080fd5b6020830194508093505050509250925092565b600060208083528351808285015260005b818110156107a85785810183015185820160400152820161078c565b818111156107ba576000604083870101525b50601f017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe016929092016040019392505050565b818382376000910190815291905056fea164736f6c634300080f000a", - "initialized": true, - "kind": "Create", - "newBalance": 0, - "oldBalance": 0, - "reverted": false, - "storageAccesses": [ - { - "account": "0xDeF3bca8c80064589E6787477FFa7Dd616B5574F", - "isWrite": false, - "newValue": "0x0000000000000000000000000000000000000000000000000000000000000000", - "previousValue": "0x0000000000000000000000000000000000000000000000000000000000000000", - "reverted": false, - "slot": "0xb53127684a568b3173ae13b9f8a6016e243e63b6e8ee1178d6a717850b5d6103" - }, - { - "account": "0xDeF3bca8c80064589E6787477FFa7Dd616B5574F", - "isWrite": true, - "newValue": "0x000000000000000000000000db8cff278adccf9e9b5da745b44e754fc4ee3c76", - "previousValue": "0x0000000000000000000000000000000000000000000000000000000000000000", - "reverted": false, - "slot": "0xb53127684a568b3173ae13b9f8a6016e243e63b6e8ee1178d6a717850b5d6103" - } - ], - "value": 0 - }, - { - "accessor": "0x7FA9385bE102ac3EAc297483Dd6233D62b3e1496", - "account": "0x7109709ECfa91a80626fF3989D68f67F5b1DD12D", - "chainInfo": { - "chainId": 31337, - "forkId": 0 - }, - "data": "0x", - "deployedCode": "0x", - "initialized": true, - "kind": "Resume", - "newBalance": 0, - "oldBalance": 0, - "reverted": false, - "storageAccesses": [], - "value": 0 - }, - { - "accessor": "0x7FA9385bE102ac3EAc297483Dd6233D62b3e1496", - "account": "0x7109709ECfa91a80626fF3989D68f67F5b1DD12D", - "chainInfo": { - "chainId": 31337, - "forkId": 0 - }, - "data": "0x", - "deployedCode": "0x", - "initialized": true, - "kind": "Resume", - "newBalance": 0, - "oldBalance": 0, - "reverted": false, - "storageAccesses": [], - "value": 0 - }, - { - "accessor": "0x7FA9385bE102ac3EAc297483Dd6233D62b3e1496", - "account": "0x7109709ECfa91a80626fF3989D68f67F5b1DD12D", - "chainInfo": { - "chainId": 31337, - "forkId": 0 - }, - "data": "0x", - "deployedCode": "0x", - "initialized": true, - "kind": "Resume", - "newBalance": 0, - "oldBalance": 0, - "reverted": false, - "storageAccesses": [], - "value": 0 - }, - { - "accessor": "0x1804c8AB1F12E6bbf3894d4083f33e07309d1f38", - "account": "0xBb2180ebd78ce97360503434eD37fcf4a1Df61c3", - "chainInfo": { - "chainId": 31337, - "forkId": 0 - }, - "data": "0x8da5cb5b", - "deployedCode": "0x", - "initialized": true, - "kind": "StaticCall", - "newBalance": 0, - "oldBalance": 0, - "reverted": false, - "storageAccesses": [ - { - "account": "0xBb2180ebd78ce97360503434eD37fcf4a1Df61c3", - "isWrite": false, - "newValue": "0x0000000000000000000000001804c8ab1f12e6bbf3894d4083f33e07309d1f38", - "previousValue": "0x0000000000000000000000001804c8ab1f12e6bbf3894d4083f33e07309d1f38", - "reverted": false, - "slot": "0x0000000000000000000000000000000000000000000000000000000000000000" - } - ], - "value": 0 - }, - { - "accessor": "0x7FA9385bE102ac3EAc297483Dd6233D62b3e1496", - "account": "0xBb2180ebd78ce97360503434eD37fcf4a1Df61c3", - "chainInfo": { - "chainId": 31337, - "forkId": 0 - }, - "data": "0x", - "deployedCode": "0x", - "initialized": true, - "kind": "Resume", - "newBalance": 0, - "oldBalance": 0, - "reverted": false, - "storageAccesses": [], - "value": 0 - }, - { - "accessor": "0x1804c8AB1F12E6bbf3894d4083f33e07309d1f38", - "account": "0xBb2180ebd78ce97360503434eD37fcf4a1Df61c3", - "chainInfo": { - "chainId": 31337, - "forkId": 0 - }, - "data": "0xf2fde38b000000000000000000000000db8cff278adccf9e9b5da745b44e754fc4ee3c76", - "deployedCode": "0x", - "initialized": true, - "kind": "Call", - "newBalance": 0, - "oldBalance": 0, - "reverted": false, - "storageAccesses": [ - { - "account": "0xBb2180ebd78ce97360503434eD37fcf4a1Df61c3", - "isWrite": false, - "newValue": "0x0000000000000000000000001804c8ab1f12e6bbf3894d4083f33e07309d1f38", - "previousValue": "0x0000000000000000000000001804c8ab1f12e6bbf3894d4083f33e07309d1f38", - "reverted": false, - "slot": "0x0000000000000000000000000000000000000000000000000000000000000000" - }, - { - "account": "0xBb2180ebd78ce97360503434eD37fcf4a1Df61c3", - "isWrite": false, - "newValue": "0x0000000000000000000000001804c8ab1f12e6bbf3894d4083f33e07309d1f38", - "previousValue": "0x0000000000000000000000001804c8ab1f12e6bbf3894d4083f33e07309d1f38", - "reverted": false, - "slot": "0x0000000000000000000000000000000000000000000000000000000000000000" - }, - { - "account": "0xBb2180ebd78ce97360503434eD37fcf4a1Df61c3", - "isWrite": true, - "newValue": "0x000000000000000000000000db8cff278adccf9e9b5da745b44e754fc4ee3c76", - "previousValue": "0x0000000000000000000000001804c8ab1f12e6bbf3894d4083f33e07309d1f38", - "reverted": false, - "slot": "0x0000000000000000000000000000000000000000000000000000000000000000" - } - ], - "value": 0 - }, - { - "accessor": "0x1804c8AB1F12E6bbf3894d4083f33e07309d1f38", - "account": "0xBb2180ebd78ce97360503434eD37fcf4a1Df61c3", - "chainInfo": { - "chainId": 31337, - "forkId": 0 - }, - "data": "0x8da5cb5b", - "deployedCode": "0x", - "initialized": true, - "kind": "StaticCall", - "newBalance": 0, - "oldBalance": 0, - "reverted": false, - "storageAccesses": [ - { - "account": "0xBb2180ebd78ce97360503434eD37fcf4a1Df61c3", - "isWrite": false, - "newValue": "0x000000000000000000000000db8cff278adccf9e9b5da745b44e754fc4ee3c76", - "previousValue": "0x000000000000000000000000db8cff278adccf9e9b5da745b44e754fc4ee3c76", - "reverted": false, - "slot": "0x0000000000000000000000000000000000000000000000000000000000000000" - } - ], - "value": 0 - }, - { - "accessor": "0x7FA9385bE102ac3EAc297483Dd6233D62b3e1496", - "account": "0x7109709ECfa91a80626fF3989D68f67F5b1DD12D", - "chainInfo": { - "chainId": 31337, - "forkId": 0 - }, - "data": "0x", - "deployedCode": "0x", - "initialized": true, - "kind": "Resume", - "newBalance": 0, - "oldBalance": 0, - "reverted": false, - "storageAccesses": [], - "value": 0 - }, - { - "accessor": "0x7FA9385bE102ac3EAc297483Dd6233D62b3e1496", - "account": "0x7109709ECfa91a80626fF3989D68f67F5b1DD12D", - "chainInfo": { - "chainId": 31337, - "forkId": 0 - }, - "data": "0x", - "deployedCode": "0x", - "initialized": true, - "kind": "Resume", - "newBalance": 0, - "oldBalance": 0, - "reverted": false, - "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": "0xA45db41D98295c8E260dc2000d2a119A11174C82", - "chainInfo": { - "chainId": 31337, - "forkId": 0 - }, - "data": "0x60806040523480156200001157600080fd5b50620000206000808062000026565b6200028f565b600054610100900460ff1615808015620000475750600054600160ff909116105b806200007757506200006430620001c160201b62001f071760201c565b15801562000077575060005460ff166001145b620000e05760405162461bcd60e51b815260206004820152602e60248201527f496e697469616c697a61626c653a20636f6e747261637420697320616c72656160448201526d191e481a5b9a5d1a585b1a5e995960921b60648201526084015b60405180910390fd5b6000805460ff19166001179055801562000104576000805461ff0019166101001790555b603680546001600160a01b03199081166001600160a01b03878116919091179092556037805490911685831617905560358054610100600160a81b03191661010085841602179055603254166200016a57603280546001600160a01b03191661dead1790555b62000174620001d0565b8015620001bb576000805461ff0019169055604051600181527f7f26b83ff96e1f2b6a682f133852f6798a09c465da95921460cefb38474024989060200160405180910390a15b50505050565b6001600160a01b03163b151590565b600054610100900460ff166200023d5760405162461bcd60e51b815260206004820152602b60248201527f496e697469616c697a61626c653a20636f6e7472616374206973206e6f74206960448201526a6e697469616c697a696e6760a81b6064820152608401620000d7565b600154600160c01b90046001600160401b03166000036200028d5760408051606081018252633b9aca0080825260006020830152436001600160401b031691909201819052600160c01b02176001555b565b615f24806200029f6000396000f3fe6080604052600436106101635760003560e01c80638c3152e9116100c0578063b69ef8a811610074578063cff0ab9611610059578063cff0ab961461044e578063e965084c146104ef578063e9e05c421461057b57600080fd5b8063b69ef8a81461040b578063c0c53b8b1461042e57600080fd5b80639bf62d82116100a55780639bf62d8214610375578063a14238e7146103a2578063a35d99df146103d257600080fd5b80638c3152e9146103285780639b5f694a1461034857600080fd5b806354fd4d50116101175780636dbffb78116100fc5780636dbffb78146102e857806371cfaa3f146103085780638b4c40b01461018857600080fd5b806354fd4d501461026d5780635c975abb146102c357600080fd5b806335e80ab31161014857806335e80ab314610206578063452a9320146102385780634870496f1461024d57600080fd5b8063149f2f221461018f57806333d7e2bd146101af57600080fd5b3661018a576101883334620186a0600060405180602001604052806000815250610589565b005b600080fd5b34801561019b57600080fd5b506101886101aa366004615344565b61062e565b3480156101bb57600080fd5b506037546101dc9073ffffffffffffffffffffffffffffffffffffffff1681565b60405173ffffffffffffffffffffffffffffffffffffffff90911681526020015b60405180910390f35b34801561021257600080fd5b506035546101dc90610100900473ffffffffffffffffffffffffffffffffffffffff1681565b34801561024457600080fd5b506101dc61086f565b34801561025957600080fd5b50610188610268366004615478565b610907565b34801561027957600080fd5b506102b66040518060400160405280600581526020017f322e372e3000000000000000000000000000000000000000000000000000000081525081565b6040516101fd91906155ca565b3480156102cf57600080fd5b506102d8610eb4565b60405190151581526020016101fd565b3480156102f457600080fd5b506102d86103033660046155dd565b610f47565b34801561031457600080fd5b50610188610323366004615605565b611002565b34801561033457600080fd5b5061018861034336600461564b565b6111c4565b34801561035457600080fd5b506036546101dc9073ffffffffffffffffffffffffffffffffffffffff1681565b34801561038157600080fd5b506032546101dc9073ffffffffffffffffffffffffffffffffffffffff1681565b3480156103ae57600080fd5b506102d86103bd3660046155dd565b60336020526000908152604090205460ff1681565b3480156103de57600080fd5b506103f26103ed366004615688565b611c46565b60405167ffffffffffffffff90911681526020016101fd565b34801561041757600080fd5b50610420611c5f565b6040519081526020016101fd565b34801561043a57600080fd5b506101886104493660046156a3565b611cb9565b34801561045a57600080fd5b506001546104b6906fffffffffffffffffffffffffffffffff81169067ffffffffffffffff7001000000000000000000000000000000008204811691780100000000000000000000000000000000000000000000000090041683565b604080516fffffffffffffffffffffffffffffffff909416845267ffffffffffffffff92831660208501529116908201526060016101fd565b3480156104fb57600080fd5b5061054d61050a3660046155dd565b603460205260009081526040902080546001909101546fffffffffffffffffffffffffffffffff8082169170010000000000000000000000000000000090041683565b604080519384526fffffffffffffffffffffffffffffffff92831660208501529116908201526060016101fd565b6101886105893660046156ee565b8260005a90506000610599611f23565b50905073ffffffffffffffffffffffffffffffffffffffff811673eeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeee148015906105d557503415155b1561060c576040517ff2365b5b00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b61061a883489898989611fc0565b50610625828261216c565b50505050505050565b8260005a9050600061063e611f23565b5090507fffffffffffffffffffffffff111111111111111111111111111111111111111273ffffffffffffffffffffffffffffffffffffffff8216016106b0576040517f0eaf3c0f00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b87603d60008282546106c2919061579a565b90915550506040517f70a0823100000000000000000000000000000000000000000000000000000000815230600482015260009073ffffffffffffffffffffffffffffffffffffffff8316906370a0823190602401602060405180830381865afa158015610734573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061075891906157b2565b905061077c73ffffffffffffffffffffffffffffffffffffffff831633308c612439565b610786898261579a565b6040517f70a0823100000000000000000000000000000000000000000000000000000000815230600482015273ffffffffffffffffffffffffffffffffffffffff8416906370a0823190602401602060405180830381865afa1580156107f0573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061081491906157b2565b1461084b576040517f90b8ec1800000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6108598a8a8a8a8a8a611fc0565b5050610865828261216c565b5050505050505050565b6000603560019054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1663452a93206040518163ffffffff1660e01b8152600401602060405180830381865afa1580156108de573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061090291906157cb565b905090565b61090f610eb4565b15610946576040517ff480973e00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b3073ffffffffffffffffffffffffffffffffffffffff16856040015173ffffffffffffffffffffffffffffffffffffffff16036109af576040517f13496fda00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6036546040517fa25ae5570000000000000000000000000000000000000000000000000000000081526004810186905260009173ffffffffffffffffffffffffffffffffffffffff169063a25ae55790602401606060405180830381865afa158015610a1f573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610a439190615808565b519050610a5d610a583686900386018661586d565b612515565b8114610af0576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602960248201527f4f7074696d69736d506f7274616c3a20696e76616c6964206f7574707574207260448201527f6f6f742070726f6f66000000000000000000000000000000000000000000000060648201526084015b60405180910390fd5b6000610afb87612571565b6000818152603460209081526040918290208251606081018452815481526001909101546fffffffffffffffffffffffffffffffff8082169383018490527001000000000000000000000000000000009091041692810192909252919250901580610c115750805160365460408084015190517fa25ae5570000000000000000000000000000000000000000000000000000000081526fffffffffffffffffffffffffffffffff909116600482015273ffffffffffffffffffffffffffffffffffffffff9091169063a25ae55790602401606060405180830381865afa158015610be9573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610c0d9190615808565b5114155b610c9d576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152603760248201527f4f7074696d69736d506f7274616c3a207769746864726177616c20686173682060448201527f68617320616c7265616479206265656e2070726f76656e0000000000000000006064820152608401610ae7565b60408051602081018490526000918101829052606001604080517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe081840301815282825280516020918201209083018190529250610d669101604080517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0818403018152828201909152600182527f0100000000000000000000000000000000000000000000000000000000000000602083015290610d5c888a6158d3565b8a604001356125a1565b610df2576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152603260248201527f4f7074696d69736d506f7274616c3a20696e76616c696420776974686472617760448201527f616c20696e636c7573696f6e2070726f6f6600000000000000000000000000006064820152608401610ae7565b604080516060810182528581526fffffffffffffffffffffffffffffffff42811660208084019182528c831684860190815260008981526034835286812095518655925190518416700100000000000000000000000000000000029316929092176001909301929092558b830151908c0151925173ffffffffffffffffffffffffffffffffffffffff918216939091169186917f67a6208cfcc0801d50f6cbe764733f4fddf66ac0b04442061a8a8c0cb6b63f629190a4505050505050505050565b6000603560019054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16635c975abb6040518163ffffffff1660e01b8152600401602060405180830381865afa158015610f23573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906109029190615957565b6036546040517fa25ae55700000000000000000000000000000000000000000000000000000000815260048101839052600091610ffc9173ffffffffffffffffffffffffffffffffffffffff9091169063a25ae55790602401606060405180830381865afa158015610fbd573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610fe19190615808565b602001516fffffffffffffffffffffffffffffffff166125c5565b92915050565b60375473ffffffffffffffffffffffffffffffffffffffff163314611053576040517f82b4290000000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b61105f6201388061266b565b60405173ffffffffffffffffffffffffffffffffffffffff8516602482015260ff8416604482015260648101839052608481018290526000907342000000000000000000000000000000000000159073deaddeaddeaddeaddeaddeaddeaddeaddead0001907fb3813568d9991fc951961fcb4c784893574240a28925604d09fc577c55bb7c3290849081906201388090829060a401604080517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0818403018152918152602080830180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff167f71cfaa3f00000000000000000000000000000000000000000000000000000000179052905161117c96959493929101615974565b604080517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0818403018152908290526111b4916155ca565b60405180910390a450505050565b565b6111cc610eb4565b15611203576040517ff480973e00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b60325473ffffffffffffffffffffffffffffffffffffffff1661dead14611256576040517f9396d15600000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b600061126182612571565b60008181526034602090815260408083208151606081018352815481526001909101546fffffffffffffffffffffffffffffffff8082169483018590527001000000000000000000000000000000009091041691810191909152929350900361134c576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152603260248201527f4f7074696d69736d506f7274616c3a207769746864726177616c20686173206e60448201527f6f74206265656e2070726f76656e2079657400000000000000000000000000006064820152608401610ae7565b603660009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1663887862726040518163ffffffff1660e01b8152600401602060405180830381865afa1580156113b9573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906113dd91906157b2565b81602001516fffffffffffffffffffffffffffffffff1610156114a8576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152604b60248201527f4f7074696d69736d506f7274616c3a207769746864726177616c2074696d657360448201527f74616d70206c657373207468616e204c32204f7261636c65207374617274696e60648201527f672074696d657374616d70000000000000000000000000000000000000000000608482015260a401610ae7565b6114c781602001516fffffffffffffffffffffffffffffffff166125c5565b611579576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152604560248201527f4f7074696d69736d506f7274616c3a2070726f76656e2077697468647261776160448201527f6c2066696e616c697a6174696f6e20706572696f6420686173206e6f7420656c60648201527f6170736564000000000000000000000000000000000000000000000000000000608482015260a401610ae7565b60365460408281015190517fa25ae5570000000000000000000000000000000000000000000000000000000081526fffffffffffffffffffffffffffffffff909116600482015260009173ffffffffffffffffffffffffffffffffffffffff169063a25ae55790602401606060405180830381865afa158015611600573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906116249190615808565b82518151919250146116de576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152604960248201527f4f7074696d69736d506f7274616c3a206f757470757420726f6f742070726f7660448201527f656e206973206e6f74207468652073616d652061732063757272656e74206f7560648201527f7470757420726f6f740000000000000000000000000000000000000000000000608482015260a401610ae7565b6116fd81602001516fffffffffffffffffffffffffffffffff166125c5565b6117af576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152604360248201527f4f7074696d69736d506f7274616c3a206f75747075742070726f706f73616c2060448201527f66696e616c697a6174696f6e20706572696f6420686173206e6f7420656c617060648201527f7365640000000000000000000000000000000000000000000000000000000000608482015260a401610ae7565b60008381526033602052604090205460ff161561184e576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152603560248201527f4f7074696d69736d506f7274616c3a207769746864726177616c20686173206160448201527f6c7265616479206265656e2066696e616c697a656400000000000000000000006064820152608401610ae7565b6000838152603360209081526040822080547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff001660011790558501516032805473ffffffffffffffffffffffffffffffffffffffff9092167fffffffffffffffffffffffff0000000000000000000000000000000000000000909216919091179055806118d9611f23565b5090507fffffffffffffffffffffffff111111111111111111111111111111111111111273ffffffffffffffffffffffffffffffffffffffff82160161193c576119358660400151876080015188606001518960a001516126cd565b9150611b8f565b8073ffffffffffffffffffffffffffffffffffffffff16866040015173ffffffffffffffffffffffffffffffffffffffff16036119a5576040517f13496fda00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b606086015115611b66578560600151603d60008282546119c591906159d9565b90915550506040517f70a0823100000000000000000000000000000000000000000000000000000000815230600482015260009073ffffffffffffffffffffffffffffffffffffffff8316906370a0823190602401602060405180830381865afa158015611a37573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611a5b91906157b2565b9050611a90876040015188606001518473ffffffffffffffffffffffffffffffffffffffff1661272b9092919063ffffffff16565b6060870151611a9f90826159d9565b6040517f70a0823100000000000000000000000000000000000000000000000000000000815230600482015273ffffffffffffffffffffffffffffffffffffffff8416906370a0823190602401602060405180830381865afa158015611b09573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611b2d91906157b2565b14611b64576040517f90b8ec1800000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b505b60a08601515115611b8a576119358660400151876080015160008960a001516126cd565b600191505b603280547fffffffffffffffffffffffff00000000000000000000000000000000000000001661dead17905560405185907fdb5c7652857aa163daadd670e116628fb42e869d8ac4251ef8971d9e5727df1b90611bf190851515815260200190565b60405180910390a281158015611c075750326001145b15611c3e576040517feeae4ed300000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b505050505050565b6000611c538260106159f0565b610ffc90615208615a20565b600080611c6a611f23565b5090507fffffffffffffffffffffffff111111111111111111111111111111111111111273ffffffffffffffffffffffffffffffffffffffff821601611cb1574791505090565b5050603d5490565b600054610100900460ff1615808015611cd95750600054600160ff909116105b80611cf35750303b158015611cf3575060005460ff166001145b611d7f576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602e60248201527f496e697469616c697a61626c653a20636f6e747261637420697320616c72656160448201527f647920696e697469616c697a65640000000000000000000000000000000000006064820152608401610ae7565b600080547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff001660011790558015611ddd57600080547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00ff166101001790555b603680547fffffffffffffffffffffffff000000000000000000000000000000000000000090811673ffffffffffffffffffffffffffffffffffffffff8781169190911790925560378054909116858316179055603580547fffffffffffffffffffffff0000000000000000000000000000000000000000ff166101008584160217905560325416611e9657603280547fffffffffffffffffffffffff00000000000000000000000000000000000000001661dead1790555b611e9e612786565b8015611f0157600080547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00ff169055604051600181527f7f26b83ff96e1f2b6a682f133852f6798a09c465da95921460cefb38474024989060200160405180910390a15b50505050565b73ffffffffffffffffffffffffffffffffffffffff163b151590565b603754604080517f4397dfef0000000000000000000000000000000000000000000000000000000081528151600093849373ffffffffffffffffffffffffffffffffffffffff90911692634397dfef92600480830193928290030181865afa158015611f93573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611fb79190615a4c565b90939092509050565b818015611fe2575073ffffffffffffffffffffffffffffffffffffffff861615155b15612019576040517f13496fda00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6120238151611c46565b67ffffffffffffffff168367ffffffffffffffff161015612070576040517f4929b80800000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6201d4c0815111156120ae576040517f73052b0f00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b333281146120cf575033731111000000000000000000000000000000001111015b600086868686866040516020016120ea959493929190615974565b604051602081830303815290604052905060008873ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff167fb3813568d9991fc951961fcb4c784893574240a28925604d09fc577c55bb7c328460405161215a91906155ca565b60405180910390a45050505050505050565b6001546000906121a2907801000000000000000000000000000000000000000000000000900467ffffffffffffffff16436159d9565b905060006121ae612899565b90506000816020015160ff16826000015163ffffffff166121cf9190615ab5565b9050821561230657600154600090612206908390700100000000000000000000000000000000900467ffffffffffffffff16615b1d565b90506000836040015160ff168361221d9190615b91565b60015461223d9084906fffffffffffffffffffffffffffffffff16615b91565b6122479190615ab5565b600154909150600090612298906122719084906fffffffffffffffffffffffffffffffff16615c4d565b866060015163ffffffff168760a001516fffffffffffffffffffffffffffffffff1661295a565b905060018611156122c7576122c461227182876040015160ff1660018a6122bf91906159d9565b612979565b90505b6fffffffffffffffffffffffffffffffff16780100000000000000000000000000000000000000000000000067ffffffffffffffff4316021760015550505b60018054869190601090612339908490700100000000000000000000000000000000900467ffffffffffffffff16615a20565b92506101000a81548167ffffffffffffffff021916908367ffffffffffffffff160217905550816000015163ffffffff16600160000160109054906101000a900467ffffffffffffffff1667ffffffffffffffff1613156123c6576040517f77ebef4d00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6001546000906123f2906fffffffffffffffffffffffffffffffff1667ffffffffffffffff8816615cc1565b9050600061240448633b9aca006129ce565b61240e9083615cfe565b905060005a61241d90886159d9565b9050808211156108655761086561243482846159d9565b6129e5565b60405173ffffffffffffffffffffffffffffffffffffffff80851660248301528316604482015260648101829052611f019085907f23b872dd00000000000000000000000000000000000000000000000000000000906084015b604080517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe08184030181529190526020810180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff167fffffffff0000000000000000000000000000000000000000000000000000000090931692909217909152612a0e565b60008160000151826020015183604001518460600151604051602001612554949392919093845260208401929092526040830152606082015260800190565b604051602081830303815290604052805190602001209050919050565b80516020808301516040808501516060860151608087015160a08801519351600097612554979096959101615d12565b6000806125ad86612b1a565b90506125bb81868686612b4c565b9695505050505050565b603654604080517ff4daa291000000000000000000000000000000000000000000000000000000008152905160009273ffffffffffffffffffffffffffffffffffffffff169163f4daa2919160048083019260209291908290030181865afa158015612635573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061265991906157b2565b612663908361579a565b421192915050565b6001805463ffffffff831691906010906126a4908490700100000000000000000000000000000000900467ffffffffffffffff16615a20565b92506101000a81548167ffffffffffffffff021916908367ffffffffffffffff16021790555050565b60008060006126dd866000612b7c565b905080612713576308c379a06000526020805278185361666543616c6c3a204e6f7420656e6f756768206761736058526064601cfd5b600080855160208701888b5af1979650505050505050565b60405173ffffffffffffffffffffffffffffffffffffffff83166024820152604481018290526127819084907fa9059cbb0000000000000000000000000000000000000000000000000000000090606401612493565b505050565b600054610100900460ff1661281d576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602b60248201527f496e697469616c697a61626c653a20636f6e7472616374206973206e6f74206960448201527f6e697469616c697a696e670000000000000000000000000000000000000000006064820152608401610ae7565b6001547801000000000000000000000000000000000000000000000000900467ffffffffffffffff166000036111c25760408051606081018252633b9aca00808252600060208301524367ffffffffffffffff169190920181905278010000000000000000000000000000000000000000000000000217600155565b6040805160c08082018352600080835260208301819052828401819052606083018190526080830181905260a083015260375483517fcc731b020000000000000000000000000000000000000000000000000000000081529351929373ffffffffffffffffffffffffffffffffffffffff9091169263cc731b02926004808401939192918290030181865afa158015612936573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906109029190615d7d565b600061296f6129698585612b9a565b83612baa565b90505b9392505050565b6000670de0b6b3a76400006129ba6129918583615ab5565b6129a390670de0b6b3a7640000615b1d565b6129b585670de0b6b3a7640000615b91565b612bb9565b6129c49086615b91565b61296f9190615ab5565b6000818310156129de5781612972565b5090919050565b6000805a90505b825a6129f890836159d9565b101561278157612a0782615e20565b91506129ec565b6000612a70826040518060400160405280602081526020017f5361666545524332303a206c6f772d6c6576656c2063616c6c206661696c65648152508573ffffffffffffffffffffffffffffffffffffffff16612bea9092919063ffffffff16565b8051909150156127815780806020019051810190612a8e9190615957565b612781576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602a60248201527f5361666545524332303a204552433230206f7065726174696f6e20646964206e60448201527f6f742073756363656564000000000000000000000000000000000000000000006064820152608401610ae7565b60608180519060200120604051602001612b3691815260200190565b6040516020818303038152906040529050919050565b6000612b7384612b5d878686612bf9565b8051602091820120825192909101919091201490565b95945050505050565b600080603f83619c4001026040850201603f5a021015949350505050565b6000818312156129de5781612972565b60008183126129de5781612972565b6000612972670de0b6b3a764000083612bd186613677565b612bdb9190615b91565b612be59190615ab5565b6138bb565b606061296f8484600085613afa565b60606000845111612c66576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601560248201527f4d65726b6c65547269653a20656d707479206b657900000000000000000000006044820152606401610ae7565b6000612c7184613c90565b90506000612c7e86613d7c565b9050600084604051602001612c9591815260200190565b60405160208183030381529060405290506000805b84518110156135ee576000858281518110612cc757612cc7615e58565b602002602001015190508451831115612d62576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602e60248201527f4d65726b6c65547269653a206b657920696e646578206578636565647320746f60448201527f74616c206b6579206c656e6774680000000000000000000000000000000000006064820152608401610ae7565b82600003612e1b5780518051602091820120604051612db092612d8a92910190815260200190565b604051602081830303815290604052858051602091820120825192909101919091201490565b612e16576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601d60248201527f4d65726b6c65547269653a20696e76616c696420726f6f7420686173680000006044820152606401610ae7565b612f72565b805151602011612ed15780518051602091820120604051612e4592612d8a92910190815260200190565b612e16576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602760248201527f4d65726b6c65547269653a20696e76616c6964206c6172676520696e7465726e60448201527f616c2068617368000000000000000000000000000000000000000000000000006064820152608401610ae7565b805184516020808701919091208251919092012014612f72576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602660248201527f4d65726b6c65547269653a20696e76616c696420696e7465726e616c206e6f6460448201527f65206861736800000000000000000000000000000000000000000000000000006064820152608401610ae7565b612f7e6010600161579a565b8160200151510361315a57845183036130f257612fb88160200151601081518110612fab57612fab615e58565b6020026020010151613ddf565b9650600087511161304b576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152603b60248201527f4d65726b6c65547269653a2076616c7565206c656e677468206d75737420626560448201527f2067726561746572207468616e207a65726f20286272616e63682900000000006064820152608401610ae7565b6001865161305991906159d9565b82146130e7576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152603a60248201527f4d65726b6c65547269653a2076616c7565206e6f6465206d757374206265206c60448201527f617374206e6f646520696e2070726f6f6620286272616e6368290000000000006064820152608401610ae7565b505050505050612972565b600085848151811061310657613106615e58565b602001015160f81c60f81b60f81c9050600082602001518260ff168151811061313157613131615e58565b6020026020010151905061314481613f3f565b955061315160018661579a565b945050506135db565b60028160200151510361355357600061317282613f64565b905060008160008151811061318957613189615e58565b016020015160f81c905060006131a0600283615e87565b6131ab906002615ea9565b905060006131bc848360ff16613f88565b905060006131ca8a89613f88565b905060006131d88383613fbe565b90508083511461326a576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152603a60248201527f4d65726b6c65547269653a20706174682072656d61696e646572206d7573742060448201527f736861726520616c6c206e6962626c65732077697468206b65790000000000006064820152608401610ae7565b60ff85166002148061327f575060ff85166003145b1561346e5780825114613314576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152603d60248201527f4d65726b6c65547269653a206b65792072656d61696e646572206d757374206260448201527f65206964656e746963616c20746f20706174682072656d61696e6465720000006064820152608401610ae7565b61332e8760200151600181518110612fab57612fab615e58565b9c5060008d51116133c1576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152603960248201527f4d65726b6c65547269653a2076616c7565206c656e677468206d75737420626560448201527f2067726561746572207468616e207a65726f20286c65616629000000000000006064820152608401610ae7565b60018c516133cf91906159d9565b881461345d576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152603860248201527f4d65726b6c65547269653a2076616c7565206e6f6465206d757374206265206c60448201527f617374206e6f646520696e2070726f6f6620286c6561662900000000000000006064820152608401610ae7565b505050505050505050505050612972565b60ff85161580613481575060ff85166001145b156134c0576134ad87602001516001815181106134a0576134a0615e58565b6020026020010151613f3f565b99506134b9818a61579a565b9850613548565b6040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152603260248201527f4d65726b6c65547269653a2072656365697665642061206e6f6465207769746860448201527f20616e20756e6b6e6f776e2070726566697800000000000000000000000000006064820152608401610ae7565b5050505050506135db565b6040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602860248201527f4d65726b6c65547269653a20726563656976656420616e20756e70617273656160448201527f626c65206e6f64650000000000000000000000000000000000000000000000006064820152608401610ae7565b50806135e681615e20565b915050612caa565b506040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602560248201527f4d65726b6c65547269653a2072616e206f7574206f662070726f6f6620656c6560448201527f6d656e74730000000000000000000000000000000000000000000000000000006064820152608401610ae7565b60008082136136e2576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152600960248201527f554e444546494e454400000000000000000000000000000000000000000000006044820152606401610ae7565b600060606136ef84614072565b03609f8181039490941b90931c6c465772b2bbbb5f824b15207a3081018102606090811d6d0388eaa27412d5aca026815d636e018202811d6d0df99ac502031bf953eff472fdcc018202811d6d13cdffb29d51d99322bdff5f2211018202811d6d0a0f742023def783a307a986912e018202811d6d01920d8043ca89b5239253284e42018202811d6c0b7a86d7375468fac667a0a527016c29508e458543d8aa4df2abee7883018302821d6d0139601a2efabe717e604cbb4894018302821d6d02247f7a7b6594320649aa03aba1018302821d7fffffffffffffffffffffffffffffffffffffff73c0c716a594e00d54e3c4cbc9018302821d7ffffffffffffffffffffffffffffffffffffffdc7b88c420e53a9890533129f6f01830290911d7fffffffffffffffffffffffffffffffffffffff465fda27eb4d63ded474e5f832019091027ffffffffffffffff5f6af8f7b3396644f18e157960000000000000000000000000105711340daa0d5f769dba1915cef59f0815a5506027d0267a36c0c95b3975ab3ee5b203a7614a3f75373f047d803ae7b6687f2b393909302929092017d57115e47018c7177eebf7cd370a3356a1b7863008a5ae8028c72b88642840160ae1d92915050565b60007ffffffffffffffffffffffffffffffffffffffffffffffffdb731c958f34d94c182136138ec57506000919050565b680755bf798b4a1bf1e5821261395e576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152600c60248201527f4558505f4f564552464c4f5700000000000000000000000000000000000000006044820152606401610ae7565b6503782dace9d9604e83901b059150600060606bb17217f7d1cf79abc9e3b39884821b056b80000000000000000000000001901d6bb17217f7d1cf79abc9e3b39881029093037fffffffffffffffffffffffffffffffffffffffdbf3ccf1604d263450f02a550481018102606090811d6d0277594991cfc85f6e2461837cd9018202811d7fffffffffffffffffffffffffffffffffffffe5adedaa1cb095af9e4da10e363c018202811d6db1bbb201f443cf962f1a1d3db4a5018202811d7ffffffffffffffffffffffffffffffffffffd38dc772608b0ae56cce01296c0eb018202811d6e05180bb14799ab47a8a8cb2a527d57016d02d16720577bd19bf614176fe9ea6c10fe68e7fd37d0007b713f765084018402831d9081019084017ffffffffffffffffffffffffffffffffffffffe2c69812cf03b0763fd454a8f7e010290911d6e0587f503bb6ea29d25fcb7401964500190910279d835ebba824c98fb31b83b2ca45c000000000000000000000000010574029d9dc38563c32e5c2f6dc192ee70ef65f9978af30260c3939093039290921c92915050565b606082471015613b8c576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602660248201527f416464726573733a20696e73756666696369656e742062616c616e636520666f60448201527f722063616c6c00000000000000000000000000000000000000000000000000006064820152608401610ae7565b73ffffffffffffffffffffffffffffffffffffffff85163b613c0a576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601d60248201527f416464726573733a2063616c6c20746f206e6f6e2d636f6e74726163740000006044820152606401610ae7565b6000808673ffffffffffffffffffffffffffffffffffffffff168587604051613c339190615ecc565b60006040518083038185875af1925050503d8060008114613c70576040519150601f19603f3d011682016040523d82523d6000602084013e613c75565b606091505b5091509150613c85828286614148565b979650505050505050565b80516060908067ffffffffffffffff811115613cae57613cae615238565b604051908082528060200260200182016040528015613cf357816020015b6040805180820190915260608082526020820152815260200190600190039081613ccc5790505b50915060005b81811015613d75576040518060400160405280858381518110613d1e57613d1e615e58565b60200260200101518152602001613d4d868481518110613d4057613d40615e58565b602002602001015161419b565b815250838281518110613d6257613d62615e58565b6020908102919091010152600101613cf9565b5050919050565b606080604051905082518060011b603f8101601f1916830160405280835250602084016020830160005b83811015613dd4578060011b82018184015160001a8060041c8253600f811660018301535050600101613da6565b509295945050505050565b60606000806000613def856141ae565b919450925090506000816001811115613e0a57613e0a615ee8565b14613e97576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152603960248201527f524c505265616465723a206465636f646564206974656d207479706520666f7260448201527f206279746573206973206e6f7420612064617461206974656d000000000000006064820152608401610ae7565b613ea1828461579a565b855114613f30576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152603460248201527f524c505265616465723a2062797465732076616c756520636f6e7461696e732060448201527f616e20696e76616c69642072656d61696e6465720000000000000000000000006064820152608401610ae7565b612b7385602001518484614c1b565b60606020826000015110613f5b57613f5682613ddf565b610ffc565b610ffc82614caf565b6060610ffc613f838360200151600081518110612fab57612fab615e58565b613d7c565b606082518210613fa75750604080516020810190915260008152610ffc565b6129728383848651613fb991906159d9565b614cc5565b6000808251845110613fd1578251613fd4565b83515b90505b808210801561405b5750828281518110613ff357613ff3615e58565b602001015160f81c60f81b7effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff191684838151811061403257614032615e58565b01602001517fff0000000000000000000000000000000000000000000000000000000000000016145b1561406b57816001019150613fd7565b5092915050565b60008082116140dd576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152600960248201527f554e444546494e454400000000000000000000000000000000000000000000006044820152606401610ae7565b5060016fffffffffffffffffffffffffffffffff821160071b82811c67ffffffffffffffff1060061b1782811c63ffffffff1060051b1782811c61ffff1060041b1782811c60ff10600390811b90911783811c600f1060021b1783811c909110821b1791821c111790565b60608315614157575081612972565b8251156141675782518084602001fd5b816040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610ae791906155ca565b6060610ffc6141a983614e9d565b614f86565b60008060008084600001511161426c576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152604a60248201527f524c505265616465723a206c656e677468206f6620616e20524c50206974656d60448201527f206d7573742062652067726561746572207468616e207a65726f20746f20626560648201527f206465636f6461626c6500000000000000000000000000000000000000000000608482015260a401610ae7565b6020840151805160001a607f8111614291576000600160009450945094505050614c14565b60b7811161449f5760006142a66080836159d9565b905080876000015111614361576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152604e60248201527f524c505265616465723a206c656e677468206f6620636f6e74656e74206d757360448201527f742062652067726561746572207468616e20737472696e67206c656e6774682060648201527f2873686f727420737472696e6729000000000000000000000000000000000000608482015260a401610ae7565b6001838101517fff000000000000000000000000000000000000000000000000000000000000001690821415806143da57507f80000000000000000000000000000000000000000000000000000000000000007fff00000000000000000000000000000000000000000000000000000000000000821610155b61448c576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152604d60248201527f524c505265616465723a20696e76616c6964207072656669782c2073696e676c60448201527f652062797465203c203078383020617265206e6f74207072656669786564202860648201527f73686f727420737472696e672900000000000000000000000000000000000000608482015260a401610ae7565b5060019550935060009250614c14915050565b60bf81116147ed5760006144b460b7836159d9565b90508087600001511161456f576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152605160248201527f524c505265616465723a206c656e677468206f6620636f6e74656e74206d757360448201527f74206265203e207468616e206c656e677468206f6620737472696e67206c656e60648201527f67746820286c6f6e6720737472696e6729000000000000000000000000000000608482015260a401610ae7565b60018301517fff0000000000000000000000000000000000000000000000000000000000000016600081900361464d576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152604a60248201527f524c505265616465723a206c656e677468206f6620636f6e74656e74206d757360448201527f74206e6f74206861766520616e79206c656164696e67207a65726f7320286c6f60648201527f6e6720737472696e672900000000000000000000000000000000000000000000608482015260a401610ae7565b600184015160088302610100031c60378111614711576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152604860248201527f524c505265616465723a206c656e677468206f6620636f6e74656e74206d757360448201527f742062652067726561746572207468616e20353520627974657320286c6f6e6760648201527f20737472696e6729000000000000000000000000000000000000000000000000608482015260a401610ae7565b61471b818461579a565b8951116147d0576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152604c60248201527f524c505265616465723a206c656e677468206f6620636f6e74656e74206d757360448201527f742062652067726561746572207468616e20746f74616c206c656e677468202860648201527f6c6f6e6720737472696e67290000000000000000000000000000000000000000608482015260a401610ae7565b6147db83600161579a565b9750955060009450614c149350505050565b60f781116148ce57600061480260c0836159d9565b9050808760000151116148bd576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152604a60248201527f524c505265616465723a206c656e677468206f6620636f6e74656e74206d757360448201527f742062652067726561746572207468616e206c697374206c656e67746820287360648201527f686f7274206c6973742900000000000000000000000000000000000000000000608482015260a401610ae7565b600195509350849250614c14915050565b60006148db60f7836159d9565b905080876000015111614996576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152604d60248201527f524c505265616465723a206c656e677468206f6620636f6e74656e74206d757360448201527f74206265203e207468616e206c656e677468206f66206c697374206c656e677460648201527f6820286c6f6e67206c6973742900000000000000000000000000000000000000608482015260a401610ae7565b60018301517fff00000000000000000000000000000000000000000000000000000000000000166000819003614a74576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152604860248201527f524c505265616465723a206c656e677468206f6620636f6e74656e74206d757360448201527f74206e6f74206861766520616e79206c656164696e67207a65726f7320286c6f60648201527f6e67206c69737429000000000000000000000000000000000000000000000000608482015260a401610ae7565b600184015160088302610100031c60378111614b38576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152604660248201527f524c505265616465723a206c656e677468206f6620636f6e74656e74206d757360448201527f742062652067726561746572207468616e20353520627974657320286c6f6e6760648201527f206c697374290000000000000000000000000000000000000000000000000000608482015260a401610ae7565b614b42818461579a565b895111614bf7576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152604a60248201527f524c505265616465723a206c656e677468206f6620636f6e74656e74206d757360448201527f742062652067726561746572207468616e20746f74616c206c656e677468202860648201527f6c6f6e67206c6973742900000000000000000000000000000000000000000000608482015260a401610ae7565b614c0283600161579a565b9750955060019450614c149350505050565b9193909250565b60608167ffffffffffffffff811115614c3657614c36615238565b6040519080825280601f01601f191660200182016040528015614c60576020820181803683370190505b5090508115612972576000614c75848661579a565b90506020820160005b84811015614c96578281015182820152602001614c7e565b84811115614ca5576000858301525b5050509392505050565b6060610ffc826020015160008460000151614c1b565b60608182601f011015614d34576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152600e60248201527f736c6963655f6f766572666c6f770000000000000000000000000000000000006044820152606401610ae7565b828284011015614da0576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152600e60248201527f736c6963655f6f766572666c6f770000000000000000000000000000000000006044820152606401610ae7565b81830184511015614e0d576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601160248201527f736c6963655f6f75744f66426f756e64730000000000000000000000000000006044820152606401610ae7565b606082158015614e2c5760405191506000825260208201604052614e94565b6040519150601f8416801560200281840101858101878315602002848b0101015b81831015614e65578051835260209283019201614e4d565b5050858452601f017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe016604052505b50949350505050565b60408051808201909152600080825260208201526000825111614f68576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152604a60248201527f524c505265616465723a206c656e677468206f6620616e20524c50206974656d60448201527f206d7573742062652067726561746572207468616e207a65726f20746f20626560648201527f206465636f6461626c6500000000000000000000000000000000000000000000608482015260a401610ae7565b50604080518082019091528151815260209182019181019190915290565b60606000806000614f96856141ae565b919450925090506001816001811115614fb157614fb1615ee8565b1461503e576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152603860248201527f524c505265616465723a206465636f646564206974656d207479706520666f7260448201527f206c697374206973206e6f742061206c697374206974656d00000000000000006064820152608401610ae7565b845161504a838561579a565b146150d7576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152603260248201527f524c505265616465723a206c697374206974656d2068617320616e20696e766160448201527f6c696420646174612072656d61696e64657200000000000000000000000000006064820152608401610ae7565b604080516020808252610420820190925290816020015b60408051808201909152600080825260208201528152602001906001900390816150ee5790505093506000835b86518110156151dc576000806151616040518060400160405280858c6000015161514591906159d9565b8152602001858c6020015161515a919061579a565b90526141ae565b50915091506040518060400160405280838361517d919061579a565b8152602001848b60200151615192919061579a565b8152508885815181106151a7576151a7615e58565b60209081029190910101526151bd60018561579a565b93506151c9818361579a565b6151d3908461579a565b9250505061511b565b50845250919392505050565b73ffffffffffffffffffffffffffffffffffffffff8116811461520a57600080fd5b50565b803567ffffffffffffffff8116811461522557600080fd5b919050565b801515811461520a57600080fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b604051601f82017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe016810167ffffffffffffffff811182821017156152ae576152ae615238565b604052919050565b600082601f8301126152c757600080fd5b813567ffffffffffffffff8111156152e1576152e1615238565b61531260207fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0601f84011601615267565b81815284602083860101111561532757600080fd5b816020850160208301376000918101602001919091529392505050565b60008060008060008060c0878903121561535d57600080fd5b8635615368816151e8565b955060208701359450604087013593506153846060880161520d565b925060808701356153948161522a565b915060a087013567ffffffffffffffff8111156153b057600080fd5b6153bc89828a016152b6565b9150509295509295509295565b600060c082840312156153db57600080fd5b60405160c0810167ffffffffffffffff82821081831117156153ff576153ff615238565b81604052829350843583526020850135915061541a826151e8565b81602084015260408501359150615430826151e8565b816040840152606085013560608401526080850135608084015260a085013591508082111561545e57600080fd5b5061546b858286016152b6565b60a0830152505092915050565b600080600080600085870360e081121561549157600080fd5b863567ffffffffffffffff808211156154a957600080fd5b6154b58a838b016153c9565b97506020890135965060807fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc0840112156154ee57600080fd5b60408901955060c089013592508083111561550857600080fd5b828901925089601f84011261551c57600080fd5b823591508082111561552d57600080fd5b508860208260051b840101111561554357600080fd5b959894975092955050506020019190565b60005b8381101561556f578181015183820152602001615557565b83811115611f015750506000910152565b60008151808452615598816020860160208601615554565b601f017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0169290920160200192915050565b6020815260006129726020830184615580565b6000602082840312156155ef57600080fd5b5035919050565b60ff8116811461520a57600080fd5b6000806000806080858703121561561b57600080fd5b8435615626816151e8565b93506020850135615636816155f6565b93969395505050506040820135916060013590565b60006020828403121561565d57600080fd5b813567ffffffffffffffff81111561567457600080fd5b615680848285016153c9565b949350505050565b60006020828403121561569a57600080fd5b6129728261520d565b6000806000606084860312156156b857600080fd5b83356156c3816151e8565b925060208401356156d3816151e8565b915060408401356156e3816151e8565b809150509250925092565b600080600080600060a0868803121561570657600080fd5b8535615711816151e8565b9450602086013593506157266040870161520d565b925060608601356157368161522a565b9150608086013567ffffffffffffffff81111561575257600080fd5b61575e888289016152b6565b9150509295509295909350565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b600082198211156157ad576157ad61576b565b500190565b6000602082840312156157c457600080fd5b5051919050565b6000602082840312156157dd57600080fd5b8151612972816151e8565b80516fffffffffffffffffffffffffffffffff8116811461522557600080fd5b60006060828403121561581a57600080fd5b6040516060810181811067ffffffffffffffff8211171561583d5761583d615238565b60405282518152615850602084016157e8565b6020820152615861604084016157e8565b60408201529392505050565b60006080828403121561587f57600080fd5b6040516080810181811067ffffffffffffffff821117156158a2576158a2615238565b8060405250823581526020830135602082015260408301356040820152606083013560608201528091505092915050565b600067ffffffffffffffff808411156158ee576158ee615238565b8360051b60206158ff818301615267565b86815291850191818101903684111561591757600080fd5b865b8481101561594b578035868111156159315760008081fd5b61593d36828b016152b6565b845250918301918301615919565b50979650505050505050565b60006020828403121561596957600080fd5b81516129728161522a565b8581528460208201527fffffffffffffffff0000000000000000000000000000000000000000000000008460c01b16604082015282151560f81b6048820152600082516159c8816049850160208701615554565b919091016049019695505050505050565b6000828210156159eb576159eb61576b565b500390565b600067ffffffffffffffff80831681851681830481118215151615615a1757615a1761576b565b02949350505050565b600067ffffffffffffffff808316818516808303821115615a4357615a4361576b565b01949350505050565b60008060408385031215615a5f57600080fd5b8251615a6a816151e8565b6020840151909250615a7b816155f6565b809150509250929050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601260045260246000fd5b600082615ac457615ac4615a86565b7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff83147f800000000000000000000000000000000000000000000000000000000000000083141615615b1857615b1861576b565b500590565b6000808312837f800000000000000000000000000000000000000000000000000000000000000001831281151615615b5757615b5761576b565b837f7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff018313811615615b8b57615b8b61576b565b50500390565b60007f7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff600084136000841385830485118282161615615bd257615bd261576b565b7f80000000000000000000000000000000000000000000000000000000000000006000871286820588128184161615615c0d57615c0d61576b565b60008712925087820587128484161615615c2957615c2961576b565b87850587128184161615615c3f57615c3f61576b565b505050929093029392505050565b6000808212827f7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff03841381151615615c8757615c8761576b565b827f8000000000000000000000000000000000000000000000000000000000000000038412811615615cbb57615cbb61576b565b50500190565b6000817fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0483118215151615615cf957615cf961576b565b500290565b600082615d0d57615d0d615a86565b500490565b868152600073ffffffffffffffffffffffffffffffffffffffff808816602084015280871660408401525084606083015283608083015260c060a0830152615d5d60c0830184615580565b98975050505050505050565b805163ffffffff8116811461522557600080fd5b600060c08284031215615d8f57600080fd5b60405160c0810181811067ffffffffffffffff82111715615db257615db2615238565b604052615dbe83615d69565b81526020830151615dce816155f6565b60208201526040830151615de1816155f6565b6040820152615df260608401615d69565b6060820152615e0360808401615d69565b6080820152615e1460a084016157e8565b60a08201529392505050565b60007fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff8203615e5157615e5161576b565b5060010190565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b600060ff831680615e9a57615e9a615a86565b8060ff84160691505092915050565b600060ff821660ff841680821015615ec357615ec361576b565b90039392505050565b60008251615ede818460208701615554565b9190910192915050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602160045260246000fdfea164736f6c634300080f000a", - "deployedCode": "0x6080604052600436106101635760003560e01c80638c3152e9116100c0578063b69ef8a811610074578063cff0ab9611610059578063cff0ab961461044e578063e965084c146104ef578063e9e05c421461057b57600080fd5b8063b69ef8a81461040b578063c0c53b8b1461042e57600080fd5b80639bf62d82116100a55780639bf62d8214610375578063a14238e7146103a2578063a35d99df146103d257600080fd5b80638c3152e9146103285780639b5f694a1461034857600080fd5b806354fd4d50116101175780636dbffb78116100fc5780636dbffb78146102e857806371cfaa3f146103085780638b4c40b01461018857600080fd5b806354fd4d501461026d5780635c975abb146102c357600080fd5b806335e80ab31161014857806335e80ab314610206578063452a9320146102385780634870496f1461024d57600080fd5b8063149f2f221461018f57806333d7e2bd146101af57600080fd5b3661018a576101883334620186a0600060405180602001604052806000815250610589565b005b600080fd5b34801561019b57600080fd5b506101886101aa366004615344565b61062e565b3480156101bb57600080fd5b506037546101dc9073ffffffffffffffffffffffffffffffffffffffff1681565b60405173ffffffffffffffffffffffffffffffffffffffff90911681526020015b60405180910390f35b34801561021257600080fd5b506035546101dc90610100900473ffffffffffffffffffffffffffffffffffffffff1681565b34801561024457600080fd5b506101dc61086f565b34801561025957600080fd5b50610188610268366004615478565b610907565b34801561027957600080fd5b506102b66040518060400160405280600581526020017f322e372e3000000000000000000000000000000000000000000000000000000081525081565b6040516101fd91906155ca565b3480156102cf57600080fd5b506102d8610eb4565b60405190151581526020016101fd565b3480156102f457600080fd5b506102d86103033660046155dd565b610f47565b34801561031457600080fd5b50610188610323366004615605565b611002565b34801561033457600080fd5b5061018861034336600461564b565b6111c4565b34801561035457600080fd5b506036546101dc9073ffffffffffffffffffffffffffffffffffffffff1681565b34801561038157600080fd5b506032546101dc9073ffffffffffffffffffffffffffffffffffffffff1681565b3480156103ae57600080fd5b506102d86103bd3660046155dd565b60336020526000908152604090205460ff1681565b3480156103de57600080fd5b506103f26103ed366004615688565b611c46565b60405167ffffffffffffffff90911681526020016101fd565b34801561041757600080fd5b50610420611c5f565b6040519081526020016101fd565b34801561043a57600080fd5b506101886104493660046156a3565b611cb9565b34801561045a57600080fd5b506001546104b6906fffffffffffffffffffffffffffffffff81169067ffffffffffffffff7001000000000000000000000000000000008204811691780100000000000000000000000000000000000000000000000090041683565b604080516fffffffffffffffffffffffffffffffff909416845267ffffffffffffffff92831660208501529116908201526060016101fd565b3480156104fb57600080fd5b5061054d61050a3660046155dd565b603460205260009081526040902080546001909101546fffffffffffffffffffffffffffffffff8082169170010000000000000000000000000000000090041683565b604080519384526fffffffffffffffffffffffffffffffff92831660208501529116908201526060016101fd565b6101886105893660046156ee565b8260005a90506000610599611f23565b50905073ffffffffffffffffffffffffffffffffffffffff811673eeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeee148015906105d557503415155b1561060c576040517ff2365b5b00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b61061a883489898989611fc0565b50610625828261216c565b50505050505050565b8260005a9050600061063e611f23565b5090507fffffffffffffffffffffffff111111111111111111111111111111111111111273ffffffffffffffffffffffffffffffffffffffff8216016106b0576040517f0eaf3c0f00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b87603d60008282546106c2919061579a565b90915550506040517f70a0823100000000000000000000000000000000000000000000000000000000815230600482015260009073ffffffffffffffffffffffffffffffffffffffff8316906370a0823190602401602060405180830381865afa158015610734573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061075891906157b2565b905061077c73ffffffffffffffffffffffffffffffffffffffff831633308c612439565b610786898261579a565b6040517f70a0823100000000000000000000000000000000000000000000000000000000815230600482015273ffffffffffffffffffffffffffffffffffffffff8416906370a0823190602401602060405180830381865afa1580156107f0573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061081491906157b2565b1461084b576040517f90b8ec1800000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6108598a8a8a8a8a8a611fc0565b5050610865828261216c565b5050505050505050565b6000603560019054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1663452a93206040518163ffffffff1660e01b8152600401602060405180830381865afa1580156108de573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061090291906157cb565b905090565b61090f610eb4565b15610946576040517ff480973e00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b3073ffffffffffffffffffffffffffffffffffffffff16856040015173ffffffffffffffffffffffffffffffffffffffff16036109af576040517f13496fda00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6036546040517fa25ae5570000000000000000000000000000000000000000000000000000000081526004810186905260009173ffffffffffffffffffffffffffffffffffffffff169063a25ae55790602401606060405180830381865afa158015610a1f573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610a439190615808565b519050610a5d610a583686900386018661586d565b612515565b8114610af0576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602960248201527f4f7074696d69736d506f7274616c3a20696e76616c6964206f7574707574207260448201527f6f6f742070726f6f66000000000000000000000000000000000000000000000060648201526084015b60405180910390fd5b6000610afb87612571565b6000818152603460209081526040918290208251606081018452815481526001909101546fffffffffffffffffffffffffffffffff8082169383018490527001000000000000000000000000000000009091041692810192909252919250901580610c115750805160365460408084015190517fa25ae5570000000000000000000000000000000000000000000000000000000081526fffffffffffffffffffffffffffffffff909116600482015273ffffffffffffffffffffffffffffffffffffffff9091169063a25ae55790602401606060405180830381865afa158015610be9573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610c0d9190615808565b5114155b610c9d576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152603760248201527f4f7074696d69736d506f7274616c3a207769746864726177616c20686173682060448201527f68617320616c7265616479206265656e2070726f76656e0000000000000000006064820152608401610ae7565b60408051602081018490526000918101829052606001604080517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe081840301815282825280516020918201209083018190529250610d669101604080517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0818403018152828201909152600182527f0100000000000000000000000000000000000000000000000000000000000000602083015290610d5c888a6158d3565b8a604001356125a1565b610df2576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152603260248201527f4f7074696d69736d506f7274616c3a20696e76616c696420776974686472617760448201527f616c20696e636c7573696f6e2070726f6f6600000000000000000000000000006064820152608401610ae7565b604080516060810182528581526fffffffffffffffffffffffffffffffff42811660208084019182528c831684860190815260008981526034835286812095518655925190518416700100000000000000000000000000000000029316929092176001909301929092558b830151908c0151925173ffffffffffffffffffffffffffffffffffffffff918216939091169186917f67a6208cfcc0801d50f6cbe764733f4fddf66ac0b04442061a8a8c0cb6b63f629190a4505050505050505050565b6000603560019054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16635c975abb6040518163ffffffff1660e01b8152600401602060405180830381865afa158015610f23573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906109029190615957565b6036546040517fa25ae55700000000000000000000000000000000000000000000000000000000815260048101839052600091610ffc9173ffffffffffffffffffffffffffffffffffffffff9091169063a25ae55790602401606060405180830381865afa158015610fbd573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610fe19190615808565b602001516fffffffffffffffffffffffffffffffff166125c5565b92915050565b60375473ffffffffffffffffffffffffffffffffffffffff163314611053576040517f82b4290000000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b61105f6201388061266b565b60405173ffffffffffffffffffffffffffffffffffffffff8516602482015260ff8416604482015260648101839052608481018290526000907342000000000000000000000000000000000000159073deaddeaddeaddeaddeaddeaddeaddeaddead0001907fb3813568d9991fc951961fcb4c784893574240a28925604d09fc577c55bb7c3290849081906201388090829060a401604080517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0818403018152918152602080830180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff167f71cfaa3f00000000000000000000000000000000000000000000000000000000179052905161117c96959493929101615974565b604080517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0818403018152908290526111b4916155ca565b60405180910390a450505050565b565b6111cc610eb4565b15611203576040517ff480973e00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b60325473ffffffffffffffffffffffffffffffffffffffff1661dead14611256576040517f9396d15600000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b600061126182612571565b60008181526034602090815260408083208151606081018352815481526001909101546fffffffffffffffffffffffffffffffff8082169483018590527001000000000000000000000000000000009091041691810191909152929350900361134c576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152603260248201527f4f7074696d69736d506f7274616c3a207769746864726177616c20686173206e60448201527f6f74206265656e2070726f76656e2079657400000000000000000000000000006064820152608401610ae7565b603660009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1663887862726040518163ffffffff1660e01b8152600401602060405180830381865afa1580156113b9573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906113dd91906157b2565b81602001516fffffffffffffffffffffffffffffffff1610156114a8576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152604b60248201527f4f7074696d69736d506f7274616c3a207769746864726177616c2074696d657360448201527f74616d70206c657373207468616e204c32204f7261636c65207374617274696e60648201527f672074696d657374616d70000000000000000000000000000000000000000000608482015260a401610ae7565b6114c781602001516fffffffffffffffffffffffffffffffff166125c5565b611579576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152604560248201527f4f7074696d69736d506f7274616c3a2070726f76656e2077697468647261776160448201527f6c2066696e616c697a6174696f6e20706572696f6420686173206e6f7420656c60648201527f6170736564000000000000000000000000000000000000000000000000000000608482015260a401610ae7565b60365460408281015190517fa25ae5570000000000000000000000000000000000000000000000000000000081526fffffffffffffffffffffffffffffffff909116600482015260009173ffffffffffffffffffffffffffffffffffffffff169063a25ae55790602401606060405180830381865afa158015611600573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906116249190615808565b82518151919250146116de576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152604960248201527f4f7074696d69736d506f7274616c3a206f757470757420726f6f742070726f7660448201527f656e206973206e6f74207468652073616d652061732063757272656e74206f7560648201527f7470757420726f6f740000000000000000000000000000000000000000000000608482015260a401610ae7565b6116fd81602001516fffffffffffffffffffffffffffffffff166125c5565b6117af576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152604360248201527f4f7074696d69736d506f7274616c3a206f75747075742070726f706f73616c2060448201527f66696e616c697a6174696f6e20706572696f6420686173206e6f7420656c617060648201527f7365640000000000000000000000000000000000000000000000000000000000608482015260a401610ae7565b60008381526033602052604090205460ff161561184e576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152603560248201527f4f7074696d69736d506f7274616c3a207769746864726177616c20686173206160448201527f6c7265616479206265656e2066696e616c697a656400000000000000000000006064820152608401610ae7565b6000838152603360209081526040822080547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff001660011790558501516032805473ffffffffffffffffffffffffffffffffffffffff9092167fffffffffffffffffffffffff0000000000000000000000000000000000000000909216919091179055806118d9611f23565b5090507fffffffffffffffffffffffff111111111111111111111111111111111111111273ffffffffffffffffffffffffffffffffffffffff82160161193c576119358660400151876080015188606001518960a001516126cd565b9150611b8f565b8073ffffffffffffffffffffffffffffffffffffffff16866040015173ffffffffffffffffffffffffffffffffffffffff16036119a5576040517f13496fda00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b606086015115611b66578560600151603d60008282546119c591906159d9565b90915550506040517f70a0823100000000000000000000000000000000000000000000000000000000815230600482015260009073ffffffffffffffffffffffffffffffffffffffff8316906370a0823190602401602060405180830381865afa158015611a37573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611a5b91906157b2565b9050611a90876040015188606001518473ffffffffffffffffffffffffffffffffffffffff1661272b9092919063ffffffff16565b6060870151611a9f90826159d9565b6040517f70a0823100000000000000000000000000000000000000000000000000000000815230600482015273ffffffffffffffffffffffffffffffffffffffff8416906370a0823190602401602060405180830381865afa158015611b09573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611b2d91906157b2565b14611b64576040517f90b8ec1800000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b505b60a08601515115611b8a576119358660400151876080015160008960a001516126cd565b600191505b603280547fffffffffffffffffffffffff00000000000000000000000000000000000000001661dead17905560405185907fdb5c7652857aa163daadd670e116628fb42e869d8ac4251ef8971d9e5727df1b90611bf190851515815260200190565b60405180910390a281158015611c075750326001145b15611c3e576040517feeae4ed300000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b505050505050565b6000611c538260106159f0565b610ffc90615208615a20565b600080611c6a611f23565b5090507fffffffffffffffffffffffff111111111111111111111111111111111111111273ffffffffffffffffffffffffffffffffffffffff821601611cb1574791505090565b5050603d5490565b600054610100900460ff1615808015611cd95750600054600160ff909116105b80611cf35750303b158015611cf3575060005460ff166001145b611d7f576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602e60248201527f496e697469616c697a61626c653a20636f6e747261637420697320616c72656160448201527f647920696e697469616c697a65640000000000000000000000000000000000006064820152608401610ae7565b600080547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff001660011790558015611ddd57600080547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00ff166101001790555b603680547fffffffffffffffffffffffff000000000000000000000000000000000000000090811673ffffffffffffffffffffffffffffffffffffffff8781169190911790925560378054909116858316179055603580547fffffffffffffffffffffff0000000000000000000000000000000000000000ff166101008584160217905560325416611e9657603280547fffffffffffffffffffffffff00000000000000000000000000000000000000001661dead1790555b611e9e612786565b8015611f0157600080547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00ff169055604051600181527f7f26b83ff96e1f2b6a682f133852f6798a09c465da95921460cefb38474024989060200160405180910390a15b50505050565b73ffffffffffffffffffffffffffffffffffffffff163b151590565b603754604080517f4397dfef0000000000000000000000000000000000000000000000000000000081528151600093849373ffffffffffffffffffffffffffffffffffffffff90911692634397dfef92600480830193928290030181865afa158015611f93573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611fb79190615a4c565b90939092509050565b818015611fe2575073ffffffffffffffffffffffffffffffffffffffff861615155b15612019576040517f13496fda00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6120238151611c46565b67ffffffffffffffff168367ffffffffffffffff161015612070576040517f4929b80800000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6201d4c0815111156120ae576040517f73052b0f00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b333281146120cf575033731111000000000000000000000000000000001111015b600086868686866040516020016120ea959493929190615974565b604051602081830303815290604052905060008873ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff167fb3813568d9991fc951961fcb4c784893574240a28925604d09fc577c55bb7c328460405161215a91906155ca565b60405180910390a45050505050505050565b6001546000906121a2907801000000000000000000000000000000000000000000000000900467ffffffffffffffff16436159d9565b905060006121ae612899565b90506000816020015160ff16826000015163ffffffff166121cf9190615ab5565b9050821561230657600154600090612206908390700100000000000000000000000000000000900467ffffffffffffffff16615b1d565b90506000836040015160ff168361221d9190615b91565b60015461223d9084906fffffffffffffffffffffffffffffffff16615b91565b6122479190615ab5565b600154909150600090612298906122719084906fffffffffffffffffffffffffffffffff16615c4d565b866060015163ffffffff168760a001516fffffffffffffffffffffffffffffffff1661295a565b905060018611156122c7576122c461227182876040015160ff1660018a6122bf91906159d9565b612979565b90505b6fffffffffffffffffffffffffffffffff16780100000000000000000000000000000000000000000000000067ffffffffffffffff4316021760015550505b60018054869190601090612339908490700100000000000000000000000000000000900467ffffffffffffffff16615a20565b92506101000a81548167ffffffffffffffff021916908367ffffffffffffffff160217905550816000015163ffffffff16600160000160109054906101000a900467ffffffffffffffff1667ffffffffffffffff1613156123c6576040517f77ebef4d00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6001546000906123f2906fffffffffffffffffffffffffffffffff1667ffffffffffffffff8816615cc1565b9050600061240448633b9aca006129ce565b61240e9083615cfe565b905060005a61241d90886159d9565b9050808211156108655761086561243482846159d9565b6129e5565b60405173ffffffffffffffffffffffffffffffffffffffff80851660248301528316604482015260648101829052611f019085907f23b872dd00000000000000000000000000000000000000000000000000000000906084015b604080517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe08184030181529190526020810180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff167fffffffff0000000000000000000000000000000000000000000000000000000090931692909217909152612a0e565b60008160000151826020015183604001518460600151604051602001612554949392919093845260208401929092526040830152606082015260800190565b604051602081830303815290604052805190602001209050919050565b80516020808301516040808501516060860151608087015160a08801519351600097612554979096959101615d12565b6000806125ad86612b1a565b90506125bb81868686612b4c565b9695505050505050565b603654604080517ff4daa291000000000000000000000000000000000000000000000000000000008152905160009273ffffffffffffffffffffffffffffffffffffffff169163f4daa2919160048083019260209291908290030181865afa158015612635573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061265991906157b2565b612663908361579a565b421192915050565b6001805463ffffffff831691906010906126a4908490700100000000000000000000000000000000900467ffffffffffffffff16615a20565b92506101000a81548167ffffffffffffffff021916908367ffffffffffffffff16021790555050565b60008060006126dd866000612b7c565b905080612713576308c379a06000526020805278185361666543616c6c3a204e6f7420656e6f756768206761736058526064601cfd5b600080855160208701888b5af1979650505050505050565b60405173ffffffffffffffffffffffffffffffffffffffff83166024820152604481018290526127819084907fa9059cbb0000000000000000000000000000000000000000000000000000000090606401612493565b505050565b600054610100900460ff1661281d576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602b60248201527f496e697469616c697a61626c653a20636f6e7472616374206973206e6f74206960448201527f6e697469616c697a696e670000000000000000000000000000000000000000006064820152608401610ae7565b6001547801000000000000000000000000000000000000000000000000900467ffffffffffffffff166000036111c25760408051606081018252633b9aca00808252600060208301524367ffffffffffffffff169190920181905278010000000000000000000000000000000000000000000000000217600155565b6040805160c08082018352600080835260208301819052828401819052606083018190526080830181905260a083015260375483517fcc731b020000000000000000000000000000000000000000000000000000000081529351929373ffffffffffffffffffffffffffffffffffffffff9091169263cc731b02926004808401939192918290030181865afa158015612936573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906109029190615d7d565b600061296f6129698585612b9a565b83612baa565b90505b9392505050565b6000670de0b6b3a76400006129ba6129918583615ab5565b6129a390670de0b6b3a7640000615b1d565b6129b585670de0b6b3a7640000615b91565b612bb9565b6129c49086615b91565b61296f9190615ab5565b6000818310156129de5781612972565b5090919050565b6000805a90505b825a6129f890836159d9565b101561278157612a0782615e20565b91506129ec565b6000612a70826040518060400160405280602081526020017f5361666545524332303a206c6f772d6c6576656c2063616c6c206661696c65648152508573ffffffffffffffffffffffffffffffffffffffff16612bea9092919063ffffffff16565b8051909150156127815780806020019051810190612a8e9190615957565b612781576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602a60248201527f5361666545524332303a204552433230206f7065726174696f6e20646964206e60448201527f6f742073756363656564000000000000000000000000000000000000000000006064820152608401610ae7565b60608180519060200120604051602001612b3691815260200190565b6040516020818303038152906040529050919050565b6000612b7384612b5d878686612bf9565b8051602091820120825192909101919091201490565b95945050505050565b600080603f83619c4001026040850201603f5a021015949350505050565b6000818312156129de5781612972565b60008183126129de5781612972565b6000612972670de0b6b3a764000083612bd186613677565b612bdb9190615b91565b612be59190615ab5565b6138bb565b606061296f8484600085613afa565b60606000845111612c66576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601560248201527f4d65726b6c65547269653a20656d707479206b657900000000000000000000006044820152606401610ae7565b6000612c7184613c90565b90506000612c7e86613d7c565b9050600084604051602001612c9591815260200190565b60405160208183030381529060405290506000805b84518110156135ee576000858281518110612cc757612cc7615e58565b602002602001015190508451831115612d62576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602e60248201527f4d65726b6c65547269653a206b657920696e646578206578636565647320746f60448201527f74616c206b6579206c656e6774680000000000000000000000000000000000006064820152608401610ae7565b82600003612e1b5780518051602091820120604051612db092612d8a92910190815260200190565b604051602081830303815290604052858051602091820120825192909101919091201490565b612e16576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601d60248201527f4d65726b6c65547269653a20696e76616c696420726f6f7420686173680000006044820152606401610ae7565b612f72565b805151602011612ed15780518051602091820120604051612e4592612d8a92910190815260200190565b612e16576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602760248201527f4d65726b6c65547269653a20696e76616c6964206c6172676520696e7465726e60448201527f616c2068617368000000000000000000000000000000000000000000000000006064820152608401610ae7565b805184516020808701919091208251919092012014612f72576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602660248201527f4d65726b6c65547269653a20696e76616c696420696e7465726e616c206e6f6460448201527f65206861736800000000000000000000000000000000000000000000000000006064820152608401610ae7565b612f7e6010600161579a565b8160200151510361315a57845183036130f257612fb88160200151601081518110612fab57612fab615e58565b6020026020010151613ddf565b9650600087511161304b576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152603b60248201527f4d65726b6c65547269653a2076616c7565206c656e677468206d75737420626560448201527f2067726561746572207468616e207a65726f20286272616e63682900000000006064820152608401610ae7565b6001865161305991906159d9565b82146130e7576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152603a60248201527f4d65726b6c65547269653a2076616c7565206e6f6465206d757374206265206c60448201527f617374206e6f646520696e2070726f6f6620286272616e6368290000000000006064820152608401610ae7565b505050505050612972565b600085848151811061310657613106615e58565b602001015160f81c60f81b60f81c9050600082602001518260ff168151811061313157613131615e58565b6020026020010151905061314481613f3f565b955061315160018661579a565b945050506135db565b60028160200151510361355357600061317282613f64565b905060008160008151811061318957613189615e58565b016020015160f81c905060006131a0600283615e87565b6131ab906002615ea9565b905060006131bc848360ff16613f88565b905060006131ca8a89613f88565b905060006131d88383613fbe565b90508083511461326a576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152603a60248201527f4d65726b6c65547269653a20706174682072656d61696e646572206d7573742060448201527f736861726520616c6c206e6962626c65732077697468206b65790000000000006064820152608401610ae7565b60ff85166002148061327f575060ff85166003145b1561346e5780825114613314576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152603d60248201527f4d65726b6c65547269653a206b65792072656d61696e646572206d757374206260448201527f65206964656e746963616c20746f20706174682072656d61696e6465720000006064820152608401610ae7565b61332e8760200151600181518110612fab57612fab615e58565b9c5060008d51116133c1576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152603960248201527f4d65726b6c65547269653a2076616c7565206c656e677468206d75737420626560448201527f2067726561746572207468616e207a65726f20286c65616629000000000000006064820152608401610ae7565b60018c516133cf91906159d9565b881461345d576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152603860248201527f4d65726b6c65547269653a2076616c7565206e6f6465206d757374206265206c60448201527f617374206e6f646520696e2070726f6f6620286c6561662900000000000000006064820152608401610ae7565b505050505050505050505050612972565b60ff85161580613481575060ff85166001145b156134c0576134ad87602001516001815181106134a0576134a0615e58565b6020026020010151613f3f565b99506134b9818a61579a565b9850613548565b6040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152603260248201527f4d65726b6c65547269653a2072656365697665642061206e6f6465207769746860448201527f20616e20756e6b6e6f776e2070726566697800000000000000000000000000006064820152608401610ae7565b5050505050506135db565b6040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602860248201527f4d65726b6c65547269653a20726563656976656420616e20756e70617273656160448201527f626c65206e6f64650000000000000000000000000000000000000000000000006064820152608401610ae7565b50806135e681615e20565b915050612caa565b506040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602560248201527f4d65726b6c65547269653a2072616e206f7574206f662070726f6f6620656c6560448201527f6d656e74730000000000000000000000000000000000000000000000000000006064820152608401610ae7565b60008082136136e2576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152600960248201527f554e444546494e454400000000000000000000000000000000000000000000006044820152606401610ae7565b600060606136ef84614072565b03609f8181039490941b90931c6c465772b2bbbb5f824b15207a3081018102606090811d6d0388eaa27412d5aca026815d636e018202811d6d0df99ac502031bf953eff472fdcc018202811d6d13cdffb29d51d99322bdff5f2211018202811d6d0a0f742023def783a307a986912e018202811d6d01920d8043ca89b5239253284e42018202811d6c0b7a86d7375468fac667a0a527016c29508e458543d8aa4df2abee7883018302821d6d0139601a2efabe717e604cbb4894018302821d6d02247f7a7b6594320649aa03aba1018302821d7fffffffffffffffffffffffffffffffffffffff73c0c716a594e00d54e3c4cbc9018302821d7ffffffffffffffffffffffffffffffffffffffdc7b88c420e53a9890533129f6f01830290911d7fffffffffffffffffffffffffffffffffffffff465fda27eb4d63ded474e5f832019091027ffffffffffffffff5f6af8f7b3396644f18e157960000000000000000000000000105711340daa0d5f769dba1915cef59f0815a5506027d0267a36c0c95b3975ab3ee5b203a7614a3f75373f047d803ae7b6687f2b393909302929092017d57115e47018c7177eebf7cd370a3356a1b7863008a5ae8028c72b88642840160ae1d92915050565b60007ffffffffffffffffffffffffffffffffffffffffffffffffdb731c958f34d94c182136138ec57506000919050565b680755bf798b4a1bf1e5821261395e576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152600c60248201527f4558505f4f564552464c4f5700000000000000000000000000000000000000006044820152606401610ae7565b6503782dace9d9604e83901b059150600060606bb17217f7d1cf79abc9e3b39884821b056b80000000000000000000000001901d6bb17217f7d1cf79abc9e3b39881029093037fffffffffffffffffffffffffffffffffffffffdbf3ccf1604d263450f02a550481018102606090811d6d0277594991cfc85f6e2461837cd9018202811d7fffffffffffffffffffffffffffffffffffffe5adedaa1cb095af9e4da10e363c018202811d6db1bbb201f443cf962f1a1d3db4a5018202811d7ffffffffffffffffffffffffffffffffffffd38dc772608b0ae56cce01296c0eb018202811d6e05180bb14799ab47a8a8cb2a527d57016d02d16720577bd19bf614176fe9ea6c10fe68e7fd37d0007b713f765084018402831d9081019084017ffffffffffffffffffffffffffffffffffffffe2c69812cf03b0763fd454a8f7e010290911d6e0587f503bb6ea29d25fcb7401964500190910279d835ebba824c98fb31b83b2ca45c000000000000000000000000010574029d9dc38563c32e5c2f6dc192ee70ef65f9978af30260c3939093039290921c92915050565b606082471015613b8c576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602660248201527f416464726573733a20696e73756666696369656e742062616c616e636520666f60448201527f722063616c6c00000000000000000000000000000000000000000000000000006064820152608401610ae7565b73ffffffffffffffffffffffffffffffffffffffff85163b613c0a576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601d60248201527f416464726573733a2063616c6c20746f206e6f6e2d636f6e74726163740000006044820152606401610ae7565b6000808673ffffffffffffffffffffffffffffffffffffffff168587604051613c339190615ecc565b60006040518083038185875af1925050503d8060008114613c70576040519150601f19603f3d011682016040523d82523d6000602084013e613c75565b606091505b5091509150613c85828286614148565b979650505050505050565b80516060908067ffffffffffffffff811115613cae57613cae615238565b604051908082528060200260200182016040528015613cf357816020015b6040805180820190915260608082526020820152815260200190600190039081613ccc5790505b50915060005b81811015613d75576040518060400160405280858381518110613d1e57613d1e615e58565b60200260200101518152602001613d4d868481518110613d4057613d40615e58565b602002602001015161419b565b815250838281518110613d6257613d62615e58565b6020908102919091010152600101613cf9565b5050919050565b606080604051905082518060011b603f8101601f1916830160405280835250602084016020830160005b83811015613dd4578060011b82018184015160001a8060041c8253600f811660018301535050600101613da6565b509295945050505050565b60606000806000613def856141ae565b919450925090506000816001811115613e0a57613e0a615ee8565b14613e97576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152603960248201527f524c505265616465723a206465636f646564206974656d207479706520666f7260448201527f206279746573206973206e6f7420612064617461206974656d000000000000006064820152608401610ae7565b613ea1828461579a565b855114613f30576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152603460248201527f524c505265616465723a2062797465732076616c756520636f6e7461696e732060448201527f616e20696e76616c69642072656d61696e6465720000000000000000000000006064820152608401610ae7565b612b7385602001518484614c1b565b60606020826000015110613f5b57613f5682613ddf565b610ffc565b610ffc82614caf565b6060610ffc613f838360200151600081518110612fab57612fab615e58565b613d7c565b606082518210613fa75750604080516020810190915260008152610ffc565b6129728383848651613fb991906159d9565b614cc5565b6000808251845110613fd1578251613fd4565b83515b90505b808210801561405b5750828281518110613ff357613ff3615e58565b602001015160f81c60f81b7effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff191684838151811061403257614032615e58565b01602001517fff0000000000000000000000000000000000000000000000000000000000000016145b1561406b57816001019150613fd7565b5092915050565b60008082116140dd576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152600960248201527f554e444546494e454400000000000000000000000000000000000000000000006044820152606401610ae7565b5060016fffffffffffffffffffffffffffffffff821160071b82811c67ffffffffffffffff1060061b1782811c63ffffffff1060051b1782811c61ffff1060041b1782811c60ff10600390811b90911783811c600f1060021b1783811c909110821b1791821c111790565b60608315614157575081612972565b8251156141675782518084602001fd5b816040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610ae791906155ca565b6060610ffc6141a983614e9d565b614f86565b60008060008084600001511161426c576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152604a60248201527f524c505265616465723a206c656e677468206f6620616e20524c50206974656d60448201527f206d7573742062652067726561746572207468616e207a65726f20746f20626560648201527f206465636f6461626c6500000000000000000000000000000000000000000000608482015260a401610ae7565b6020840151805160001a607f8111614291576000600160009450945094505050614c14565b60b7811161449f5760006142a66080836159d9565b905080876000015111614361576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152604e60248201527f524c505265616465723a206c656e677468206f6620636f6e74656e74206d757360448201527f742062652067726561746572207468616e20737472696e67206c656e6774682060648201527f2873686f727420737472696e6729000000000000000000000000000000000000608482015260a401610ae7565b6001838101517fff000000000000000000000000000000000000000000000000000000000000001690821415806143da57507f80000000000000000000000000000000000000000000000000000000000000007fff00000000000000000000000000000000000000000000000000000000000000821610155b61448c576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152604d60248201527f524c505265616465723a20696e76616c6964207072656669782c2073696e676c60448201527f652062797465203c203078383020617265206e6f74207072656669786564202860648201527f73686f727420737472696e672900000000000000000000000000000000000000608482015260a401610ae7565b5060019550935060009250614c14915050565b60bf81116147ed5760006144b460b7836159d9565b90508087600001511161456f576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152605160248201527f524c505265616465723a206c656e677468206f6620636f6e74656e74206d757360448201527f74206265203e207468616e206c656e677468206f6620737472696e67206c656e60648201527f67746820286c6f6e6720737472696e6729000000000000000000000000000000608482015260a401610ae7565b60018301517fff0000000000000000000000000000000000000000000000000000000000000016600081900361464d576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152604a60248201527f524c505265616465723a206c656e677468206f6620636f6e74656e74206d757360448201527f74206e6f74206861766520616e79206c656164696e67207a65726f7320286c6f60648201527f6e6720737472696e672900000000000000000000000000000000000000000000608482015260a401610ae7565b600184015160088302610100031c60378111614711576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152604860248201527f524c505265616465723a206c656e677468206f6620636f6e74656e74206d757360448201527f742062652067726561746572207468616e20353520627974657320286c6f6e6760648201527f20737472696e6729000000000000000000000000000000000000000000000000608482015260a401610ae7565b61471b818461579a565b8951116147d0576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152604c60248201527f524c505265616465723a206c656e677468206f6620636f6e74656e74206d757360448201527f742062652067726561746572207468616e20746f74616c206c656e677468202860648201527f6c6f6e6720737472696e67290000000000000000000000000000000000000000608482015260a401610ae7565b6147db83600161579a565b9750955060009450614c149350505050565b60f781116148ce57600061480260c0836159d9565b9050808760000151116148bd576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152604a60248201527f524c505265616465723a206c656e677468206f6620636f6e74656e74206d757360448201527f742062652067726561746572207468616e206c697374206c656e67746820287360648201527f686f7274206c6973742900000000000000000000000000000000000000000000608482015260a401610ae7565b600195509350849250614c14915050565b60006148db60f7836159d9565b905080876000015111614996576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152604d60248201527f524c505265616465723a206c656e677468206f6620636f6e74656e74206d757360448201527f74206265203e207468616e206c656e677468206f66206c697374206c656e677460648201527f6820286c6f6e67206c6973742900000000000000000000000000000000000000608482015260a401610ae7565b60018301517fff00000000000000000000000000000000000000000000000000000000000000166000819003614a74576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152604860248201527f524c505265616465723a206c656e677468206f6620636f6e74656e74206d757360448201527f74206e6f74206861766520616e79206c656164696e67207a65726f7320286c6f60648201527f6e67206c69737429000000000000000000000000000000000000000000000000608482015260a401610ae7565b600184015160088302610100031c60378111614b38576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152604660248201527f524c505265616465723a206c656e677468206f6620636f6e74656e74206d757360448201527f742062652067726561746572207468616e20353520627974657320286c6f6e6760648201527f206c697374290000000000000000000000000000000000000000000000000000608482015260a401610ae7565b614b42818461579a565b895111614bf7576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152604a60248201527f524c505265616465723a206c656e677468206f6620636f6e74656e74206d757360448201527f742062652067726561746572207468616e20746f74616c206c656e677468202860648201527f6c6f6e67206c6973742900000000000000000000000000000000000000000000608482015260a401610ae7565b614c0283600161579a565b9750955060019450614c149350505050565b9193909250565b60608167ffffffffffffffff811115614c3657614c36615238565b6040519080825280601f01601f191660200182016040528015614c60576020820181803683370190505b5090508115612972576000614c75848661579a565b90506020820160005b84811015614c96578281015182820152602001614c7e565b84811115614ca5576000858301525b5050509392505050565b6060610ffc826020015160008460000151614c1b565b60608182601f011015614d34576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152600e60248201527f736c6963655f6f766572666c6f770000000000000000000000000000000000006044820152606401610ae7565b828284011015614da0576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152600e60248201527f736c6963655f6f766572666c6f770000000000000000000000000000000000006044820152606401610ae7565b81830184511015614e0d576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601160248201527f736c6963655f6f75744f66426f756e64730000000000000000000000000000006044820152606401610ae7565b606082158015614e2c5760405191506000825260208201604052614e94565b6040519150601f8416801560200281840101858101878315602002848b0101015b81831015614e65578051835260209283019201614e4d565b5050858452601f017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe016604052505b50949350505050565b60408051808201909152600080825260208201526000825111614f68576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152604a60248201527f524c505265616465723a206c656e677468206f6620616e20524c50206974656d60448201527f206d7573742062652067726561746572207468616e207a65726f20746f20626560648201527f206465636f6461626c6500000000000000000000000000000000000000000000608482015260a401610ae7565b50604080518082019091528151815260209182019181019190915290565b60606000806000614f96856141ae565b919450925090506001816001811115614fb157614fb1615ee8565b1461503e576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152603860248201527f524c505265616465723a206465636f646564206974656d207479706520666f7260448201527f206c697374206973206e6f742061206c697374206974656d00000000000000006064820152608401610ae7565b845161504a838561579a565b146150d7576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152603260248201527f524c505265616465723a206c697374206974656d2068617320616e20696e766160448201527f6c696420646174612072656d61696e64657200000000000000000000000000006064820152608401610ae7565b604080516020808252610420820190925290816020015b60408051808201909152600080825260208201528152602001906001900390816150ee5790505093506000835b86518110156151dc576000806151616040518060400160405280858c6000015161514591906159d9565b8152602001858c6020015161515a919061579a565b90526141ae565b50915091506040518060400160405280838361517d919061579a565b8152602001848b60200151615192919061579a565b8152508885815181106151a7576151a7615e58565b60209081029190910101526151bd60018561579a565b93506151c9818361579a565b6151d3908461579a565b9250505061511b565b50845250919392505050565b73ffffffffffffffffffffffffffffffffffffffff8116811461520a57600080fd5b50565b803567ffffffffffffffff8116811461522557600080fd5b919050565b801515811461520a57600080fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b604051601f82017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe016810167ffffffffffffffff811182821017156152ae576152ae615238565b604052919050565b600082601f8301126152c757600080fd5b813567ffffffffffffffff8111156152e1576152e1615238565b61531260207fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0601f84011601615267565b81815284602083860101111561532757600080fd5b816020850160208301376000918101602001919091529392505050565b60008060008060008060c0878903121561535d57600080fd5b8635615368816151e8565b955060208701359450604087013593506153846060880161520d565b925060808701356153948161522a565b915060a087013567ffffffffffffffff8111156153b057600080fd5b6153bc89828a016152b6565b9150509295509295509295565b600060c082840312156153db57600080fd5b60405160c0810167ffffffffffffffff82821081831117156153ff576153ff615238565b81604052829350843583526020850135915061541a826151e8565b81602084015260408501359150615430826151e8565b816040840152606085013560608401526080850135608084015260a085013591508082111561545e57600080fd5b5061546b858286016152b6565b60a0830152505092915050565b600080600080600085870360e081121561549157600080fd5b863567ffffffffffffffff808211156154a957600080fd5b6154b58a838b016153c9565b97506020890135965060807fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc0840112156154ee57600080fd5b60408901955060c089013592508083111561550857600080fd5b828901925089601f84011261551c57600080fd5b823591508082111561552d57600080fd5b508860208260051b840101111561554357600080fd5b959894975092955050506020019190565b60005b8381101561556f578181015183820152602001615557565b83811115611f015750506000910152565b60008151808452615598816020860160208601615554565b601f017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0169290920160200192915050565b6020815260006129726020830184615580565b6000602082840312156155ef57600080fd5b5035919050565b60ff8116811461520a57600080fd5b6000806000806080858703121561561b57600080fd5b8435615626816151e8565b93506020850135615636816155f6565b93969395505050506040820135916060013590565b60006020828403121561565d57600080fd5b813567ffffffffffffffff81111561567457600080fd5b615680848285016153c9565b949350505050565b60006020828403121561569a57600080fd5b6129728261520d565b6000806000606084860312156156b857600080fd5b83356156c3816151e8565b925060208401356156d3816151e8565b915060408401356156e3816151e8565b809150509250925092565b600080600080600060a0868803121561570657600080fd5b8535615711816151e8565b9450602086013593506157266040870161520d565b925060608601356157368161522a565b9150608086013567ffffffffffffffff81111561575257600080fd5b61575e888289016152b6565b9150509295509295909350565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b600082198211156157ad576157ad61576b565b500190565b6000602082840312156157c457600080fd5b5051919050565b6000602082840312156157dd57600080fd5b8151612972816151e8565b80516fffffffffffffffffffffffffffffffff8116811461522557600080fd5b60006060828403121561581a57600080fd5b6040516060810181811067ffffffffffffffff8211171561583d5761583d615238565b60405282518152615850602084016157e8565b6020820152615861604084016157e8565b60408201529392505050565b60006080828403121561587f57600080fd5b6040516080810181811067ffffffffffffffff821117156158a2576158a2615238565b8060405250823581526020830135602082015260408301356040820152606083013560608201528091505092915050565b600067ffffffffffffffff808411156158ee576158ee615238565b8360051b60206158ff818301615267565b86815291850191818101903684111561591757600080fd5b865b8481101561594b578035868111156159315760008081fd5b61593d36828b016152b6565b845250918301918301615919565b50979650505050505050565b60006020828403121561596957600080fd5b81516129728161522a565b8581528460208201527fffffffffffffffff0000000000000000000000000000000000000000000000008460c01b16604082015282151560f81b6048820152600082516159c8816049850160208701615554565b919091016049019695505050505050565b6000828210156159eb576159eb61576b565b500390565b600067ffffffffffffffff80831681851681830481118215151615615a1757615a1761576b565b02949350505050565b600067ffffffffffffffff808316818516808303821115615a4357615a4361576b565b01949350505050565b60008060408385031215615a5f57600080fd5b8251615a6a816151e8565b6020840151909250615a7b816155f6565b809150509250929050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601260045260246000fd5b600082615ac457615ac4615a86565b7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff83147f800000000000000000000000000000000000000000000000000000000000000083141615615b1857615b1861576b565b500590565b6000808312837f800000000000000000000000000000000000000000000000000000000000000001831281151615615b5757615b5761576b565b837f7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff018313811615615b8b57615b8b61576b565b50500390565b60007f7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff600084136000841385830485118282161615615bd257615bd261576b565b7f80000000000000000000000000000000000000000000000000000000000000006000871286820588128184161615615c0d57615c0d61576b565b60008712925087820587128484161615615c2957615c2961576b565b87850587128184161615615c3f57615c3f61576b565b505050929093029392505050565b6000808212827f7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff03841381151615615c8757615c8761576b565b827f8000000000000000000000000000000000000000000000000000000000000000038412811615615cbb57615cbb61576b565b50500190565b6000817fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0483118215151615615cf957615cf961576b565b500290565b600082615d0d57615d0d615a86565b500490565b868152600073ffffffffffffffffffffffffffffffffffffffff808816602084015280871660408401525084606083015283608083015260c060a0830152615d5d60c0830184615580565b98975050505050505050565b805163ffffffff8116811461522557600080fd5b600060c08284031215615d8f57600080fd5b60405160c0810181811067ffffffffffffffff82111715615db257615db2615238565b604052615dbe83615d69565b81526020830151615dce816155f6565b60208201526040830151615de1816155f6565b6040820152615df260608401615d69565b6060820152615e0360808401615d69565b6080820152615e1460a084016157e8565b60a08201529392505050565b60007fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff8203615e5157615e5161576b565b5060010190565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b600060ff831680615e9a57615e9a615a86565b8060ff84160691505092915050565b600060ff821660ff841680821015615ec357615ec361576b565b90039392505050565b60008251615ede818460208701615554565b9190910192915050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602160045260246000fdfea164736f6c634300080f000a", - "initialized": true, - "kind": "Create", - "newBalance": 0, - "oldBalance": 0, - "reverted": false, - "storageAccesses": [ - { - "account": "0xA45db41D98295c8E260dc2000d2a119A11174C82", - "isWrite": false, - "newValue": "0x0000000000000000000000000000000000000000000000000000000000000000", - "previousValue": "0x0000000000000000000000000000000000000000000000000000000000000000", - "reverted": false, - "slot": "0x0000000000000000000000000000000000000000000000000000000000000000" - }, - { - "account": "0xA45db41D98295c8E260dc2000d2a119A11174C82", - "isWrite": false, - "newValue": "0x0000000000000000000000000000000000000000000000000000000000000000", - "previousValue": "0x0000000000000000000000000000000000000000000000000000000000000000", - "reverted": false, - "slot": "0x0000000000000000000000000000000000000000000000000000000000000000" - }, - { - "account": "0xA45db41D98295c8E260dc2000d2a119A11174C82", - "isWrite": false, - "newValue": "0x0000000000000000000000000000000000000000000000000000000000000000", - "previousValue": "0x0000000000000000000000000000000000000000000000000000000000000000", - "reverted": false, - "slot": "0x0000000000000000000000000000000000000000000000000000000000000000" - }, - { - "account": "0xA45db41D98295c8E260dc2000d2a119A11174C82", - "isWrite": true, - "newValue": "0x0000000000000000000000000000000000000000000000000000000000000001", - "previousValue": "0x0000000000000000000000000000000000000000000000000000000000000000", - "reverted": false, - "slot": "0x0000000000000000000000000000000000000000000000000000000000000000" - }, - { - "account": "0xA45db41D98295c8E260dc2000d2a119A11174C82", - "isWrite": false, - "newValue": "0x0000000000000000000000000000000000000000000000000000000000000001", - "previousValue": "0x0000000000000000000000000000000000000000000000000000000000000001", - "reverted": false, - "slot": "0x0000000000000000000000000000000000000000000000000000000000000000" - }, - { - "account": "0xA45db41D98295c8E260dc2000d2a119A11174C82", - "isWrite": true, - "newValue": "0x0000000000000000000000000000000000000000000000000000000000000101", - "previousValue": "0x0000000000000000000000000000000000000000000000000000000000000001", - "reverted": false, - "slot": "0x0000000000000000000000000000000000000000000000000000000000000000" - }, - { - "account": "0xA45db41D98295c8E260dc2000d2a119A11174C82", - "isWrite": false, - "newValue": "0x0000000000000000000000000000000000000000000000000000000000000000", - "previousValue": "0x0000000000000000000000000000000000000000000000000000000000000000", - "reverted": false, - "slot": "0x0000000000000000000000000000000000000000000000000000000000000036" - }, - { - "account": "0xA45db41D98295c8E260dc2000d2a119A11174C82", - "isWrite": true, - "newValue": "0x0000000000000000000000000000000000000000000000000000000000000000", - "previousValue": "0x0000000000000000000000000000000000000000000000000000000000000000", - "reverted": false, - "slot": "0x0000000000000000000000000000000000000000000000000000000000000036" - }, - { - "account": "0xA45db41D98295c8E260dc2000d2a119A11174C82", - "isWrite": false, - "newValue": "0x0000000000000000000000000000000000000000000000000000000000000000", - "previousValue": "0x0000000000000000000000000000000000000000000000000000000000000000", - "reverted": false, - "slot": "0x0000000000000000000000000000000000000000000000000000000000000037" - }, - { - "account": "0xA45db41D98295c8E260dc2000d2a119A11174C82", - "isWrite": true, - "newValue": "0x0000000000000000000000000000000000000000000000000000000000000000", - "previousValue": "0x0000000000000000000000000000000000000000000000000000000000000000", - "reverted": false, - "slot": "0x0000000000000000000000000000000000000000000000000000000000000037" - }, - { - "account": "0xA45db41D98295c8E260dc2000d2a119A11174C82", - "isWrite": false, - "newValue": "0x0000000000000000000000000000000000000000000000000000000000000000", - "previousValue": "0x0000000000000000000000000000000000000000000000000000000000000000", - "reverted": false, - "slot": "0x0000000000000000000000000000000000000000000000000000000000000035" - }, - { - "account": "0xA45db41D98295c8E260dc2000d2a119A11174C82", - "isWrite": true, - "newValue": "0x0000000000000000000000000000000000000000000000000000000000000000", - "previousValue": "0x0000000000000000000000000000000000000000000000000000000000000000", - "reverted": false, - "slot": "0x0000000000000000000000000000000000000000000000000000000000000035" - }, - { - "account": "0xA45db41D98295c8E260dc2000d2a119A11174C82", - "isWrite": false, - "newValue": "0x0000000000000000000000000000000000000000000000000000000000000000", - "previousValue": "0x0000000000000000000000000000000000000000000000000000000000000000", - "reverted": false, - "slot": "0x0000000000000000000000000000000000000000000000000000000000000032" - }, - { - "account": "0xA45db41D98295c8E260dc2000d2a119A11174C82", - "isWrite": false, - "newValue": "0x0000000000000000000000000000000000000000000000000000000000000000", - "previousValue": "0x0000000000000000000000000000000000000000000000000000000000000000", - "reverted": false, - "slot": "0x0000000000000000000000000000000000000000000000000000000000000032" - }, - { - "account": "0xA45db41D98295c8E260dc2000d2a119A11174C82", - "isWrite": true, - "newValue": "0x000000000000000000000000000000000000000000000000000000000000dead", - "previousValue": "0x0000000000000000000000000000000000000000000000000000000000000000", - "reverted": false, - "slot": "0x0000000000000000000000000000000000000000000000000000000000000032" - }, - { - "account": "0xA45db41D98295c8E260dc2000d2a119A11174C82", - "isWrite": false, - "newValue": "0x0000000000000000000000000000000000000000000000000000000000000101", - "previousValue": "0x0000000000000000000000000000000000000000000000000000000000000101", - "reverted": false, - "slot": "0x0000000000000000000000000000000000000000000000000000000000000000" - }, - { - "account": "0xA45db41D98295c8E260dc2000d2a119A11174C82", - "isWrite": false, - "newValue": "0x0000000000000000000000000000000000000000000000000000000000000000", - "previousValue": "0x0000000000000000000000000000000000000000000000000000000000000000", - "reverted": false, - "slot": "0x0000000000000000000000000000000000000000000000000000000000000001" - }, - { - "account": "0xA45db41D98295c8E260dc2000d2a119A11174C82", - "isWrite": true, - "newValue": "0x000000000000000100000000000000000000000000000000000000003b9aca00", - "previousValue": "0x0000000000000000000000000000000000000000000000000000000000000000", - "reverted": false, - "slot": "0x0000000000000000000000000000000000000000000000000000000000000001" - }, - { - "account": "0xA45db41D98295c8E260dc2000d2a119A11174C82", - "isWrite": false, - "newValue": "0x0000000000000000000000000000000000000000000000000000000000000101", - "previousValue": "0x0000000000000000000000000000000000000000000000000000000000000101", - "reverted": false, - "slot": "0x0000000000000000000000000000000000000000000000000000000000000000" - }, - { - "account": "0xA45db41D98295c8E260dc2000d2a119A11174C82", - "isWrite": true, - "newValue": "0x0000000000000000000000000000000000000000000000000000000000000001", - "previousValue": "0x0000000000000000000000000000000000000000000000000000000000000101", - "reverted": false, - "slot": "0x0000000000000000000000000000000000000000000000000000000000000000" - } - ], - "value": 0 - }, - { - "accessor": "0x7FA9385bE102ac3EAc297483Dd6233D62b3e1496", - "account": "0x7109709ECfa91a80626fF3989D68f67F5b1DD12D", - "chainInfo": { - "chainId": 31337, - "forkId": 0 - }, - "data": "0x", - "deployedCode": "0x", - "initialized": true, - "kind": "Resume", - "newBalance": 0, - "oldBalance": 0, - "reverted": false, - "storageAccesses": [], - "value": 0 - }, - { - "accessor": "0x1804c8AB1F12E6bbf3894d4083f33e07309d1f38", - "account": "0x9568d36E291c2C4c34fa5593fcE73715abEf6F9c", - "chainInfo": { - "chainId": 31337, - "forkId": 0 - }, - "data": "0xfa60f9b2", - "deployedCode": "0x", - "initialized": true, - "kind": "StaticCall", - "newBalance": 0, - "oldBalance": 0, - "reverted": false, - "storageAccesses": [ - { - "account": "0x9568d36E291c2C4c34fa5593fcE73715abEf6F9c", - "isWrite": false, - "newValue": "0x0000000000000000000000009965507d1a55bcc2695c58ba16fb37d819b0a4dc", - "previousValue": "0x0000000000000000000000009965507d1a55bcc2695c58ba16fb37d819b0a4dc", - "reverted": false, - "slot": "0x000000000000000000000000000000000000000000000000000000000000000f" - } - ], - "value": 0 - }, - { - "accessor": "0x7FA9385bE102ac3EAc297483Dd6233D62b3e1496", - "account": "0x9965507D1a55bcC2695C58ba16FB37d819B0A4dc", - "chainInfo": { - "chainId": 31337, - "forkId": 0 - }, - "data": "0x", - "deployedCode": "0x", - "initialized": false, - "kind": "Resume", - "newBalance": 0, - "oldBalance": 0, - "reverted": false, - "storageAccesses": [], - "value": 0 - }, - { - "accessor": "0x1804c8AB1F12E6bbf3894d4083f33e07309d1f38", - "account": "0xA45db41D98295c8E260dc2000d2a119A11174C82", - "chainInfo": { - "chainId": 31337, - "forkId": 0 - }, - "data": "0x9b5f694a", - "deployedCode": "0x", - "initialized": true, - "kind": "StaticCall", - "newBalance": 0, - "oldBalance": 0, - "reverted": false, - "storageAccesses": [ - { - "account": "0xA45db41D98295c8E260dc2000d2a119A11174C82", - "isWrite": false, - "newValue": "0x0000000000000000000000000000000000000000000000000000000000000000", - "previousValue": "0x0000000000000000000000000000000000000000000000000000000000000000", - "reverted": false, - "slot": "0x0000000000000000000000000000000000000000000000000000000000000036" - } - ], - "value": 0 - }, - { - "accessor": "0x1804c8AB1F12E6bbf3894d4083f33e07309d1f38", - "account": "0xA45db41D98295c8E260dc2000d2a119A11174C82", - "chainInfo": { - "chainId": 31337, - "forkId": 0 - }, - "data": "0x33d7e2bd", - "deployedCode": "0x", - "initialized": true, - "kind": "StaticCall", - "newBalance": 0, - "oldBalance": 0, - "reverted": false, - "storageAccesses": [ - { - "account": "0xA45db41D98295c8E260dc2000d2a119A11174C82", - "isWrite": false, - "newValue": "0x0000000000000000000000000000000000000000000000000000000000000000", - "previousValue": "0x0000000000000000000000000000000000000000000000000000000000000000", - "reverted": false, - "slot": "0x0000000000000000000000000000000000000000000000000000000000000037" - } - ], - "value": 0 - }, - { - "accessor": "0x1804c8AB1F12E6bbf3894d4083f33e07309d1f38", - "account": "0xA45db41D98295c8E260dc2000d2a119A11174C82", - "chainInfo": { - "chainId": 31337, - "forkId": 0 - }, - "data": "0x35e80ab3", - "deployedCode": "0x", - "initialized": true, - "kind": "StaticCall", - "newBalance": 0, - "oldBalance": 0, - "reverted": false, - "storageAccesses": [ - { - "account": "0xA45db41D98295c8E260dc2000d2a119A11174C82", - "isWrite": false, - "newValue": "0x0000000000000000000000000000000000000000000000000000000000000000", - "previousValue": "0x0000000000000000000000000000000000000000000000000000000000000000", - "reverted": false, - "slot": "0x0000000000000000000000000000000000000000000000000000000000000035" - } - ], - "value": 0 - }, - { - "accessor": "0x1804c8AB1F12E6bbf3894d4083f33e07309d1f38", - "account": "0xA45db41D98295c8E260dc2000d2a119A11174C82", - "chainInfo": { - "chainId": 31337, - "forkId": 0 - }, - "data": "0x9bf62d82", - "deployedCode": "0x", - "initialized": true, - "kind": "StaticCall", - "newBalance": 0, - "oldBalance": 0, - "reverted": false, - "storageAccesses": [ - { - "account": "0xA45db41D98295c8E260dc2000d2a119A11174C82", - "isWrite": false, - "newValue": "0x000000000000000000000000000000000000000000000000000000000000dead", - "previousValue": "0x000000000000000000000000000000000000000000000000000000000000dead", - "reverted": false, - "slot": "0x0000000000000000000000000000000000000000000000000000000000000032" - } - ], - "value": 0 - }, - { - "accessor": "0x7FA9385bE102ac3EAc297483Dd6233D62b3e1496", - "account": "0x7109709ECfa91a80626fF3989D68f67F5b1DD12D", - "chainInfo": { - "chainId": 31337, - "forkId": 0 - }, - "data": "0x", - "deployedCode": "0x", - "initialized": true, - "kind": "Resume", - "newBalance": 0, - "oldBalance": 0, - "reverted": false, - "storageAccesses": [], - "value": 0 - }, - { - "accessor": "0x7FA9385bE102ac3EAc297483Dd6233D62b3e1496", - "account": "0x7109709ECfa91a80626fF3989D68f67F5b1DD12D", - "chainInfo": { - "chainId": 31337, - "forkId": 0 - }, - "data": "0x", - "deployedCode": "0x", - "initialized": true, - "kind": "Resume", - "newBalance": 0, - "oldBalance": 0, - "reverted": false, - "storageAccesses": [], - "value": 0 - }, - { - "accessor": "0x1804c8AB1F12E6bbf3894d4083f33e07309d1f38", - "account": "0x4e59b44847b379578588920cA78FbF26c0B4956C", - "chainInfo": { - "chainId": 31337, - "forkId": 0 - }, - "data": "0x638627e586f5e36fe67a77519503a7c6da22f92b150d3c6055fd40bdcfe9ffd160806040523480156200001157600080fd5b50620000206000808062000026565b6200028e565b600054600160a81b900460ff16158080156200004f57506000546001600160a01b90910460ff16105b806200008657506200006c30620001c860201b620015b71760201c565b158015620000865750600054600160a01b900460ff166001145b620000ef5760405162461bcd60e51b815260206004820152602e60248201527f496e697469616c697a61626c653a20636f6e747261637420697320616c72656160448201526d191e481a5b9a5d1a585b1a5e995960921b60648201526084015b60405180910390fd5b6000805460ff60a01b1916600160a01b17905580156200011d576000805460ff60a81b1916600160a81b1790555b60fb80546001600160a01b038087166001600160a01b03199283161790925560fc805486841690831617905560fd80549285169290911691909117905562000179734200000000000000000000000000000000000007620001d7565b8015620001c2576000805460ff60a81b19169055604051600181527f7f26b83ff96e1f2b6a682f133852f6798a09c465da95921460cefb38474024989060200160405180910390a15b50505050565b6001600160a01b03163b151590565b600054600160a81b900460ff16620002465760405162461bcd60e51b815260206004820152602b60248201527f496e697469616c697a61626c653a20636f6e7472616374206973206e6f74206960448201526a6e697469616c697a696e6760a81b6064820152608401620000e6565b60cc546001600160a01b03166200026c5760cc80546001600160a01b03191661dead1790555b60cf80546001600160a01b0319166001600160a01b0392909216919091179055565b6121a3806200029e6000396000f3fe60806040526004361061018b5760003560e01c80636425666b116100d6578063b1b1b2091161007f578063d764ad0b11610059578063d764ad0b1461049b578063db505d80146104ae578063ecc70428146104db57600080fd5b8063b1b1b2091461042b578063b28ade251461045b578063c0c53b8b1461047b57600080fd5b80638cbeeef2116100b05780638cbeeef2146102d05780639fce812c146103d0578063a4e7f8bd146103fb57600080fd5b80636425666b146103775780636e296e45146103a457806383a74074146103b957600080fd5b80633dbb202b1161013857806354fd4d501161011257806354fd4d50146102e65780635644cfdf1461033c5780635c975abb1461035257600080fd5b80633dbb202b146102935780633f827a5a146102a85780634c1d6a69146102d057600080fd5b80632828d7e8116101695780632828d7e81461022457806333d7e2bd1461023957806335e80ab31461026657600080fd5b8063028f85f7146101905780630c568498146101c35780630ff754ea146101d8575b600080fd5b34801561019c57600080fd5b506101a5601081565b60405167ffffffffffffffff90911681526020015b60405180910390f35b3480156101cf57600080fd5b506101a5603f81565b3480156101e457600080fd5b5060fc5473ffffffffffffffffffffffffffffffffffffffff165b60405173ffffffffffffffffffffffffffffffffffffffff90911681526020016101ba565b34801561023057600080fd5b506101a5604081565b34801561024557600080fd5b5060fd546101ff9073ffffffffffffffffffffffffffffffffffffffff1681565b34801561027257600080fd5b5060fb546101ff9073ffffffffffffffffffffffffffffffffffffffff1681565b6102a66102a1366004611bdf565b610540565b005b3480156102b457600080fd5b506102bd600181565b60405161ffff90911681526020016101ba565b3480156102dc57600080fd5b506101a5619c4081565b3480156102f257600080fd5b5061032f6040518060400160405280600581526020017f322e342e3000000000000000000000000000000000000000000000000000000081525081565b6040516101ba9190611cb1565b34801561034857600080fd5b506101a561138881565b34801561035e57600080fd5b5061036761083d565b60405190151581526020016101ba565b34801561038357600080fd5b5060fc546101ff9073ffffffffffffffffffffffffffffffffffffffff1681565b3480156103b057600080fd5b506101ff6108d6565b3480156103c557600080fd5b506101a562030d4081565b3480156103dc57600080fd5b5060cf5473ffffffffffffffffffffffffffffffffffffffff166101ff565b34801561040757600080fd5b50610367610416366004611ccb565b60ce6020526000908152604090205460ff1681565b34801561043757600080fd5b50610367610446366004611ccb565b60cb6020526000908152604090205460ff1681565b34801561046757600080fd5b506101a5610476366004611ce4565b6109bd565b34801561048757600080fd5b506102a6610496366004611d38565b610a2b565b6102a66104a9366004611d83565b610ca2565b3480156104ba57600080fd5b5060cf546101ff9073ffffffffffffffffffffffffffffffffffffffff1681565b3480156104e757600080fd5b5061053260cd547dffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff167e010000000000000000000000000000000000000000000000000000000000001790565b6040519081526020016101ba565b6105486115d3565b156105e05734156105e0576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152603d60248201527f43726f7373446f6d61696e4d657373656e6765723a2063616e6e6f742073656e60448201527f642076616c7565207769746820637573746f6d2067617320746f6b656e00000060648201526084015b60405180910390fd5b60cf546107129073ffffffffffffffffffffffffffffffffffffffff166106088585856109bd565b347fd764ad0b0000000000000000000000000000000000000000000000000000000061067460cd547dffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff167e010000000000000000000000000000000000000000000000000000000000001790565b338a34898c8c6040516024016106909796959493929190611e52565b604080517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe08184030181529190526020810180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff167fffffffff0000000000000000000000000000000000000000000000000000000090931692909217909152611612565b8373ffffffffffffffffffffffffffffffffffffffff167fcb0f7ffd78f9aee47a248fae8db181db6eee833039123e026dcbff529522e52a33858561079760cd547dffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff167e010000000000000000000000000000000000000000000000000000000000001790565b866040516107a9959493929190611eb1565b60405180910390a260405134815233907f8ebb2ec2465bdb2a06a66fc37a0963af8a2a6a1479d81d56fdb8cbb98096d5469060200160405180910390a2505060cd80547dffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff808216600101167fffff0000000000000000000000000000000000000000000000000000000000009091161790555050565b60fb54604080517f5c975abb000000000000000000000000000000000000000000000000000000008152905160009273ffffffffffffffffffffffffffffffffffffffff1691635c975abb9160048083019260209291908290030181865afa1580156108ad573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906108d19190611eff565b905090565b60cc5460009073ffffffffffffffffffffffffffffffffffffffff167fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff2153016109a0576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152603560248201527f43726f7373446f6d61696e4d657373656e6765723a2078446f6d61696e4d657360448201527f7361676553656e646572206973206e6f7420736574000000000000000000000060648201526084016105d7565b5060cc5473ffffffffffffffffffffffffffffffffffffffff1690565b6000611388619c4080603f6109d9604063ffffffff8816611f50565b6109e39190611f80565b6109ee601088611f50565b6109fb9062030d40611fce565b610a059190611fce565b610a0f9190611fce565b610a199190611fce565b610a239190611fce565b949350505050565b6000547501000000000000000000000000000000000000000000900460ff1615808015610a76575060005460017401000000000000000000000000000000000000000090910460ff16105b80610aa85750303b158015610aa8575060005474010000000000000000000000000000000000000000900460ff166001145b610b34576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602e60248201527f496e697469616c697a61626c653a20636f6e747261637420697320616c72656160448201527f647920696e697469616c697a656400000000000000000000000000000000000060648201526084016105d7565b600080547fffffffffffffffffffffff00ffffffffffffffffffffffffffffffffffffffff16740100000000000000000000000000000000000000001790558015610bba57600080547fffffffffffffffffffff00ffffffffffffffffffffffffffffffffffffffffff1675010000000000000000000000000000000000000000001790555b60fb805473ffffffffffffffffffffffffffffffffffffffff8087167fffffffffffffffffffffffff00000000000000000000000000000000000000009283161790925560fc805486841690831617905560fd805492851692909116919091179055610c397342000000000000000000000000000000000000076116ab565b8015610c9c57600080547fffffffffffffffffffff00ffffffffffffffffffffffffffffffffffffffffff169055604051600181527f7f26b83ff96e1f2b6a682f133852f6798a09c465da95921460cefb38474024989060200160405180910390a15b50505050565b610caa61083d565b15610d11576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601c60248201527f43726f7373446f6d61696e4d657373656e6765723a207061757365640000000060448201526064016105d7565b60f087901c60028110610dcc576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152604d60248201527f43726f7373446f6d61696e4d657373656e6765723a206f6e6c7920766572736960448201527f6f6e2030206f722031206d657373616765732061726520737570706f7274656460648201527f20617420746869732074696d6500000000000000000000000000000000000000608482015260a4016105d7565b8061ffff16600003610ec1576000610e1d878986868080601f0160208091040260200160405190810160405280939291908181526020018383808284376000920191909152508f92506117e7915050565b600081815260cb602052604090205490915060ff1615610ebf576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152603760248201527f43726f7373446f6d61696e4d657373656e6765723a206c65676163792077697460448201527f6864726177616c20616c72656164792072656c6179656400000000000000000060648201526084016105d7565b505b6000610f07898989898989898080601f01602080910402602001604051908101604052809392919081815260200183838082843760009201919091525061180692505050565b9050610f11611829565b15610f4957853414610f2557610f25611ffa565b600081815260ce602052604090205460ff1615610f4457610f44611ffa565b61109b565b3415610ffd576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152605060248201527f43726f7373446f6d61696e4d657373656e6765723a2076616c7565206d75737460448201527f206265207a65726f20756e6c657373206d6573736167652069732066726f6d2060648201527f612073797374656d206164647265737300000000000000000000000000000000608482015260a4016105d7565b600081815260ce602052604090205460ff1661109b576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152603060248201527f43726f7373446f6d61696e4d657373656e6765723a206d65737361676520636160448201527f6e6e6f74206265207265706c617965640000000000000000000000000000000060648201526084016105d7565b6110a487611905565b15611157576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152604360248201527f43726f7373446f6d61696e4d657373656e6765723a2063616e6e6f742073656e60448201527f64206d65737361676520746f20626c6f636b65642073797374656d206164647260648201527f6573730000000000000000000000000000000000000000000000000000000000608482015260a4016105d7565b600081815260cb602052604090205460ff16156111f6576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152603660248201527f43726f7373446f6d61696e4d657373656e6765723a206d65737361676520686160448201527f7320616c7265616479206265656e2072656c617965640000000000000000000060648201526084016105d7565b61121785611208611388619c40611fce565b67ffffffffffffffff1661194b565b158061123d575060cc5473ffffffffffffffffffffffffffffffffffffffff1661dead14155b1561135657600081815260ce602052604080822080547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff001660011790555182917f99d0e048484baa1b1540b1367cb128acd7ab2946d1ed91ec10e3c85e4bf51b8f91a27fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff320161134f576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602d60248201527f43726f7373446f6d61696e4d657373656e6765723a206661696c656420746f2060448201527f72656c6179206d6573736167650000000000000000000000000000000000000060648201526084016105d7565b50506115ae565b60cc80547fffffffffffffffffffffffff00000000000000000000000000000000000000001673ffffffffffffffffffffffffffffffffffffffff8a1617905560006113e788619c405a6113aa9190612029565b8988888080601f01602080910402602001604051908101604052809392919081815260200183838082843760009201919091525061196992505050565b60cc80547fffffffffffffffffffffffff00000000000000000000000000000000000000001661dead1790559050801561149d57600082815260cb602052604090205460ff161561143a5761143a611ffa565b600082815260cb602052604080822080547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff001660011790555183917f4641df4a962071e12719d8c8c8e5ac7fc4d97b927346a3d7a335b1f7517e133c91a26115aa565b600082815260ce602052604080822080547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff001660011790555183917f99d0e048484baa1b1540b1367cb128acd7ab2946d1ed91ec10e3c85e4bf51b8f91a27fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff32016115aa576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602d60248201527f43726f7373446f6d61696e4d657373656e6765723a206661696c656420746f2060448201527f72656c6179206d6573736167650000000000000000000000000000000000000060648201526084016105d7565b5050505b50505050505050565b73ffffffffffffffffffffffffffffffffffffffff163b151590565b6000806115de611983565b5073ffffffffffffffffffffffffffffffffffffffff1673eeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeee141592915050565b60fc546040517fe9e05c4200000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff9091169063e9e05c42908490611673908890839089906000908990600401612040565b6000604051808303818588803b15801561168c57600080fd5b505af11580156116a0573d6000803e3d6000fd5b505050505050505050565b6000547501000000000000000000000000000000000000000000900460ff16611756576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602b60248201527f496e697469616c697a61626c653a20636f6e7472616374206973206e6f74206960448201527f6e697469616c697a696e6700000000000000000000000000000000000000000060648201526084016105d7565b60cc5473ffffffffffffffffffffffffffffffffffffffff166117a05760cc80547fffffffffffffffffffffffff00000000000000000000000000000000000000001661dead1790555b60cf80547fffffffffffffffffffffffff00000000000000000000000000000000000000001673ffffffffffffffffffffffffffffffffffffffff92909216919091179055565b60006117f585858585611a20565b805190602001209050949350505050565b6000611816878787878787611ab9565b8051906020012090509695505050505050565b60fc5460009073ffffffffffffffffffffffffffffffffffffffff16331480156108d1575060cf5460fc54604080517f9bf62d82000000000000000000000000000000000000000000000000000000008152905173ffffffffffffffffffffffffffffffffffffffff9384169390921691639bf62d82916004808201926020929091908290030181865afa1580156118c5573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906118e99190612098565b73ffffffffffffffffffffffffffffffffffffffff1614905090565b600073ffffffffffffffffffffffffffffffffffffffff8216301480611945575060fc5473ffffffffffffffffffffffffffffffffffffffff8381169116145b92915050565b600080603f83619c4001026040850201603f5a021015949350505050565b600080600080845160208601878a8af19695505050505050565b60fd54604080517f4397dfef0000000000000000000000000000000000000000000000000000000081528151600093849373ffffffffffffffffffffffffffffffffffffffff90911692634397dfef92600480830193928290030181865afa1580156119f3573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611a1791906120b5565b90939092509050565b606084848484604051602401611a3994939291906120f5565b604080517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe08184030181529190526020810180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff167fcbd4ece9000000000000000000000000000000000000000000000000000000001790529050949350505050565b6060868686868686604051602401611ad69695949392919061213f565b604080517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe08184030181529190526020810180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff167fd764ad0b0000000000000000000000000000000000000000000000000000000017905290509695505050505050565b73ffffffffffffffffffffffffffffffffffffffff81168114611b7a57600080fd5b50565b60008083601f840112611b8f57600080fd5b50813567ffffffffffffffff811115611ba757600080fd5b602083019150836020828501011115611bbf57600080fd5b9250929050565b803563ffffffff81168114611bda57600080fd5b919050565b60008060008060608587031215611bf557600080fd5b8435611c0081611b58565b9350602085013567ffffffffffffffff811115611c1c57600080fd5b611c2887828801611b7d565b9094509250611c3b905060408601611bc6565b905092959194509250565b6000815180845260005b81811015611c6c57602081850181015186830182015201611c50565b81811115611c7e576000602083870101525b50601f017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0169290920160200192915050565b602081526000611cc46020830184611c46565b9392505050565b600060208284031215611cdd57600080fd5b5035919050565b600080600060408486031215611cf957600080fd5b833567ffffffffffffffff811115611d1057600080fd5b611d1c86828701611b7d565b9094509250611d2f905060208501611bc6565b90509250925092565b600080600060608486031215611d4d57600080fd5b8335611d5881611b58565b92506020840135611d6881611b58565b91506040840135611d7881611b58565b809150509250925092565b600080600080600080600060c0888a031215611d9e57600080fd5b873596506020880135611db081611b58565b95506040880135611dc081611b58565b9450606088013593506080880135925060a088013567ffffffffffffffff811115611dea57600080fd5b611df68a828b01611b7d565b989b979a50959850939692959293505050565b8183528181602085013750600060208284010152600060207fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0601f840116840101905092915050565b878152600073ffffffffffffffffffffffffffffffffffffffff808916602084015280881660408401525085606083015263ffffffff8516608083015260c060a0830152611ea460c083018486611e09565b9998505050505050505050565b73ffffffffffffffffffffffffffffffffffffffff86168152608060208201526000611ee1608083018688611e09565b905083604083015263ffffffff831660608301529695505050505050565b600060208284031215611f1157600080fd5b81518015158114611cc457600080fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b600067ffffffffffffffff80831681851681830481118215151615611f7757611f77611f21565b02949350505050565b600067ffffffffffffffff80841680611fc2577f4e487b7100000000000000000000000000000000000000000000000000000000600052601260045260246000fd5b92169190910492915050565b600067ffffffffffffffff808316818516808303821115611ff157611ff1611f21565b01949350505050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052600160045260246000fd5b60008282101561203b5761203b611f21565b500390565b73ffffffffffffffffffffffffffffffffffffffff8616815284602082015267ffffffffffffffff84166040820152821515606082015260a06080820152600061208d60a0830184611c46565b979650505050505050565b6000602082840312156120aa57600080fd5b8151611cc481611b58565b600080604083850312156120c857600080fd5b82516120d381611b58565b602084015190925060ff811681146120ea57600080fd5b809150509250929050565b600073ffffffffffffffffffffffffffffffffffffffff80871683528086166020840152506080604083015261212e6080830185611c46565b905082606083015295945050505050565b868152600073ffffffffffffffffffffffffffffffffffffffff808816602084015280871660408401525084606083015283608083015260c060a083015261218a60c0830184611c46565b9897505050505050505056fea164736f6c634300080f000a", - "deployedCode": "0x", - "initialized": true, - "kind": "Call", - "newBalance": 0, - "oldBalance": 0, - "reverted": false, - "storageAccesses": [], - "value": 0 - }, - { - "accessor": "0x4e59b44847b379578588920cA78FbF26c0B4956C", - "account": "0xf3E6CBcbF1AE12Fc13Bc8B14FA8A67CbE147fD99", - "chainInfo": { - "chainId": 31337, - "forkId": 0 - }, - "data": "0x60806040523480156200001157600080fd5b50620000206000808062000026565b6200028e565b600054600160a81b900460ff16158080156200004f57506000546001600160a01b90910460ff16105b806200008657506200006c30620001c860201b620015b71760201c565b158015620000865750600054600160a01b900460ff166001145b620000ef5760405162461bcd60e51b815260206004820152602e60248201527f496e697469616c697a61626c653a20636f6e747261637420697320616c72656160448201526d191e481a5b9a5d1a585b1a5e995960921b60648201526084015b60405180910390fd5b6000805460ff60a01b1916600160a01b17905580156200011d576000805460ff60a81b1916600160a81b1790555b60fb80546001600160a01b038087166001600160a01b03199283161790925560fc805486841690831617905560fd80549285169290911691909117905562000179734200000000000000000000000000000000000007620001d7565b8015620001c2576000805460ff60a81b19169055604051600181527f7f26b83ff96e1f2b6a682f133852f6798a09c465da95921460cefb38474024989060200160405180910390a15b50505050565b6001600160a01b03163b151590565b600054600160a81b900460ff16620002465760405162461bcd60e51b815260206004820152602b60248201527f496e697469616c697a61626c653a20636f6e7472616374206973206e6f74206960448201526a6e697469616c697a696e6760a81b6064820152608401620000e6565b60cc546001600160a01b03166200026c5760cc80546001600160a01b03191661dead1790555b60cf80546001600160a01b0319166001600160a01b0392909216919091179055565b6121a3806200029e6000396000f3fe60806040526004361061018b5760003560e01c80636425666b116100d6578063b1b1b2091161007f578063d764ad0b11610059578063d764ad0b1461049b578063db505d80146104ae578063ecc70428146104db57600080fd5b8063b1b1b2091461042b578063b28ade251461045b578063c0c53b8b1461047b57600080fd5b80638cbeeef2116100b05780638cbeeef2146102d05780639fce812c146103d0578063a4e7f8bd146103fb57600080fd5b80636425666b146103775780636e296e45146103a457806383a74074146103b957600080fd5b80633dbb202b1161013857806354fd4d501161011257806354fd4d50146102e65780635644cfdf1461033c5780635c975abb1461035257600080fd5b80633dbb202b146102935780633f827a5a146102a85780634c1d6a69146102d057600080fd5b80632828d7e8116101695780632828d7e81461022457806333d7e2bd1461023957806335e80ab31461026657600080fd5b8063028f85f7146101905780630c568498146101c35780630ff754ea146101d8575b600080fd5b34801561019c57600080fd5b506101a5601081565b60405167ffffffffffffffff90911681526020015b60405180910390f35b3480156101cf57600080fd5b506101a5603f81565b3480156101e457600080fd5b5060fc5473ffffffffffffffffffffffffffffffffffffffff165b60405173ffffffffffffffffffffffffffffffffffffffff90911681526020016101ba565b34801561023057600080fd5b506101a5604081565b34801561024557600080fd5b5060fd546101ff9073ffffffffffffffffffffffffffffffffffffffff1681565b34801561027257600080fd5b5060fb546101ff9073ffffffffffffffffffffffffffffffffffffffff1681565b6102a66102a1366004611bdf565b610540565b005b3480156102b457600080fd5b506102bd600181565b60405161ffff90911681526020016101ba565b3480156102dc57600080fd5b506101a5619c4081565b3480156102f257600080fd5b5061032f6040518060400160405280600581526020017f322e342e3000000000000000000000000000000000000000000000000000000081525081565b6040516101ba9190611cb1565b34801561034857600080fd5b506101a561138881565b34801561035e57600080fd5b5061036761083d565b60405190151581526020016101ba565b34801561038357600080fd5b5060fc546101ff9073ffffffffffffffffffffffffffffffffffffffff1681565b3480156103b057600080fd5b506101ff6108d6565b3480156103c557600080fd5b506101a562030d4081565b3480156103dc57600080fd5b5060cf5473ffffffffffffffffffffffffffffffffffffffff166101ff565b34801561040757600080fd5b50610367610416366004611ccb565b60ce6020526000908152604090205460ff1681565b34801561043757600080fd5b50610367610446366004611ccb565b60cb6020526000908152604090205460ff1681565b34801561046757600080fd5b506101a5610476366004611ce4565b6109bd565b34801561048757600080fd5b506102a6610496366004611d38565b610a2b565b6102a66104a9366004611d83565b610ca2565b3480156104ba57600080fd5b5060cf546101ff9073ffffffffffffffffffffffffffffffffffffffff1681565b3480156104e757600080fd5b5061053260cd547dffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff167e010000000000000000000000000000000000000000000000000000000000001790565b6040519081526020016101ba565b6105486115d3565b156105e05734156105e0576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152603d60248201527f43726f7373446f6d61696e4d657373656e6765723a2063616e6e6f742073656e60448201527f642076616c7565207769746820637573746f6d2067617320746f6b656e00000060648201526084015b60405180910390fd5b60cf546107129073ffffffffffffffffffffffffffffffffffffffff166106088585856109bd565b347fd764ad0b0000000000000000000000000000000000000000000000000000000061067460cd547dffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff167e010000000000000000000000000000000000000000000000000000000000001790565b338a34898c8c6040516024016106909796959493929190611e52565b604080517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe08184030181529190526020810180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff167fffffffff0000000000000000000000000000000000000000000000000000000090931692909217909152611612565b8373ffffffffffffffffffffffffffffffffffffffff167fcb0f7ffd78f9aee47a248fae8db181db6eee833039123e026dcbff529522e52a33858561079760cd547dffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff167e010000000000000000000000000000000000000000000000000000000000001790565b866040516107a9959493929190611eb1565b60405180910390a260405134815233907f8ebb2ec2465bdb2a06a66fc37a0963af8a2a6a1479d81d56fdb8cbb98096d5469060200160405180910390a2505060cd80547dffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff808216600101167fffff0000000000000000000000000000000000000000000000000000000000009091161790555050565b60fb54604080517f5c975abb000000000000000000000000000000000000000000000000000000008152905160009273ffffffffffffffffffffffffffffffffffffffff1691635c975abb9160048083019260209291908290030181865afa1580156108ad573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906108d19190611eff565b905090565b60cc5460009073ffffffffffffffffffffffffffffffffffffffff167fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff2153016109a0576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152603560248201527f43726f7373446f6d61696e4d657373656e6765723a2078446f6d61696e4d657360448201527f7361676553656e646572206973206e6f7420736574000000000000000000000060648201526084016105d7565b5060cc5473ffffffffffffffffffffffffffffffffffffffff1690565b6000611388619c4080603f6109d9604063ffffffff8816611f50565b6109e39190611f80565b6109ee601088611f50565b6109fb9062030d40611fce565b610a059190611fce565b610a0f9190611fce565b610a199190611fce565b610a239190611fce565b949350505050565b6000547501000000000000000000000000000000000000000000900460ff1615808015610a76575060005460017401000000000000000000000000000000000000000090910460ff16105b80610aa85750303b158015610aa8575060005474010000000000000000000000000000000000000000900460ff166001145b610b34576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602e60248201527f496e697469616c697a61626c653a20636f6e747261637420697320616c72656160448201527f647920696e697469616c697a656400000000000000000000000000000000000060648201526084016105d7565b600080547fffffffffffffffffffffff00ffffffffffffffffffffffffffffffffffffffff16740100000000000000000000000000000000000000001790558015610bba57600080547fffffffffffffffffffff00ffffffffffffffffffffffffffffffffffffffffff1675010000000000000000000000000000000000000000001790555b60fb805473ffffffffffffffffffffffffffffffffffffffff8087167fffffffffffffffffffffffff00000000000000000000000000000000000000009283161790925560fc805486841690831617905560fd805492851692909116919091179055610c397342000000000000000000000000000000000000076116ab565b8015610c9c57600080547fffffffffffffffffffff00ffffffffffffffffffffffffffffffffffffffffff169055604051600181527f7f26b83ff96e1f2b6a682f133852f6798a09c465da95921460cefb38474024989060200160405180910390a15b50505050565b610caa61083d565b15610d11576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601c60248201527f43726f7373446f6d61696e4d657373656e6765723a207061757365640000000060448201526064016105d7565b60f087901c60028110610dcc576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152604d60248201527f43726f7373446f6d61696e4d657373656e6765723a206f6e6c7920766572736960448201527f6f6e2030206f722031206d657373616765732061726520737570706f7274656460648201527f20617420746869732074696d6500000000000000000000000000000000000000608482015260a4016105d7565b8061ffff16600003610ec1576000610e1d878986868080601f0160208091040260200160405190810160405280939291908181526020018383808284376000920191909152508f92506117e7915050565b600081815260cb602052604090205490915060ff1615610ebf576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152603760248201527f43726f7373446f6d61696e4d657373656e6765723a206c65676163792077697460448201527f6864726177616c20616c72656164792072656c6179656400000000000000000060648201526084016105d7565b505b6000610f07898989898989898080601f01602080910402602001604051908101604052809392919081815260200183838082843760009201919091525061180692505050565b9050610f11611829565b15610f4957853414610f2557610f25611ffa565b600081815260ce602052604090205460ff1615610f4457610f44611ffa565b61109b565b3415610ffd576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152605060248201527f43726f7373446f6d61696e4d657373656e6765723a2076616c7565206d75737460448201527f206265207a65726f20756e6c657373206d6573736167652069732066726f6d2060648201527f612073797374656d206164647265737300000000000000000000000000000000608482015260a4016105d7565b600081815260ce602052604090205460ff1661109b576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152603060248201527f43726f7373446f6d61696e4d657373656e6765723a206d65737361676520636160448201527f6e6e6f74206265207265706c617965640000000000000000000000000000000060648201526084016105d7565b6110a487611905565b15611157576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152604360248201527f43726f7373446f6d61696e4d657373656e6765723a2063616e6e6f742073656e60448201527f64206d65737361676520746f20626c6f636b65642073797374656d206164647260648201527f6573730000000000000000000000000000000000000000000000000000000000608482015260a4016105d7565b600081815260cb602052604090205460ff16156111f6576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152603660248201527f43726f7373446f6d61696e4d657373656e6765723a206d65737361676520686160448201527f7320616c7265616479206265656e2072656c617965640000000000000000000060648201526084016105d7565b61121785611208611388619c40611fce565b67ffffffffffffffff1661194b565b158061123d575060cc5473ffffffffffffffffffffffffffffffffffffffff1661dead14155b1561135657600081815260ce602052604080822080547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff001660011790555182917f99d0e048484baa1b1540b1367cb128acd7ab2946d1ed91ec10e3c85e4bf51b8f91a27fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff320161134f576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602d60248201527f43726f7373446f6d61696e4d657373656e6765723a206661696c656420746f2060448201527f72656c6179206d6573736167650000000000000000000000000000000000000060648201526084016105d7565b50506115ae565b60cc80547fffffffffffffffffffffffff00000000000000000000000000000000000000001673ffffffffffffffffffffffffffffffffffffffff8a1617905560006113e788619c405a6113aa9190612029565b8988888080601f01602080910402602001604051908101604052809392919081815260200183838082843760009201919091525061196992505050565b60cc80547fffffffffffffffffffffffff00000000000000000000000000000000000000001661dead1790559050801561149d57600082815260cb602052604090205460ff161561143a5761143a611ffa565b600082815260cb602052604080822080547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff001660011790555183917f4641df4a962071e12719d8c8c8e5ac7fc4d97b927346a3d7a335b1f7517e133c91a26115aa565b600082815260ce602052604080822080547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff001660011790555183917f99d0e048484baa1b1540b1367cb128acd7ab2946d1ed91ec10e3c85e4bf51b8f91a27fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff32016115aa576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602d60248201527f43726f7373446f6d61696e4d657373656e6765723a206661696c656420746f2060448201527f72656c6179206d6573736167650000000000000000000000000000000000000060648201526084016105d7565b5050505b50505050505050565b73ffffffffffffffffffffffffffffffffffffffff163b151590565b6000806115de611983565b5073ffffffffffffffffffffffffffffffffffffffff1673eeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeee141592915050565b60fc546040517fe9e05c4200000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff9091169063e9e05c42908490611673908890839089906000908990600401612040565b6000604051808303818588803b15801561168c57600080fd5b505af11580156116a0573d6000803e3d6000fd5b505050505050505050565b6000547501000000000000000000000000000000000000000000900460ff16611756576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602b60248201527f496e697469616c697a61626c653a20636f6e7472616374206973206e6f74206960448201527f6e697469616c697a696e6700000000000000000000000000000000000000000060648201526084016105d7565b60cc5473ffffffffffffffffffffffffffffffffffffffff166117a05760cc80547fffffffffffffffffffffffff00000000000000000000000000000000000000001661dead1790555b60cf80547fffffffffffffffffffffffff00000000000000000000000000000000000000001673ffffffffffffffffffffffffffffffffffffffff92909216919091179055565b60006117f585858585611a20565b805190602001209050949350505050565b6000611816878787878787611ab9565b8051906020012090509695505050505050565b60fc5460009073ffffffffffffffffffffffffffffffffffffffff16331480156108d1575060cf5460fc54604080517f9bf62d82000000000000000000000000000000000000000000000000000000008152905173ffffffffffffffffffffffffffffffffffffffff9384169390921691639bf62d82916004808201926020929091908290030181865afa1580156118c5573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906118e99190612098565b73ffffffffffffffffffffffffffffffffffffffff1614905090565b600073ffffffffffffffffffffffffffffffffffffffff8216301480611945575060fc5473ffffffffffffffffffffffffffffffffffffffff8381169116145b92915050565b600080603f83619c4001026040850201603f5a021015949350505050565b600080600080845160208601878a8af19695505050505050565b60fd54604080517f4397dfef0000000000000000000000000000000000000000000000000000000081528151600093849373ffffffffffffffffffffffffffffffffffffffff90911692634397dfef92600480830193928290030181865afa1580156119f3573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611a1791906120b5565b90939092509050565b606084848484604051602401611a3994939291906120f5565b604080517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe08184030181529190526020810180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff167fcbd4ece9000000000000000000000000000000000000000000000000000000001790529050949350505050565b6060868686868686604051602401611ad69695949392919061213f565b604080517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe08184030181529190526020810180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff167fd764ad0b0000000000000000000000000000000000000000000000000000000017905290509695505050505050565b73ffffffffffffffffffffffffffffffffffffffff81168114611b7a57600080fd5b50565b60008083601f840112611b8f57600080fd5b50813567ffffffffffffffff811115611ba757600080fd5b602083019150836020828501011115611bbf57600080fd5b9250929050565b803563ffffffff81168114611bda57600080fd5b919050565b60008060008060608587031215611bf557600080fd5b8435611c0081611b58565b9350602085013567ffffffffffffffff811115611c1c57600080fd5b611c2887828801611b7d565b9094509250611c3b905060408601611bc6565b905092959194509250565b6000815180845260005b81811015611c6c57602081850181015186830182015201611c50565b81811115611c7e576000602083870101525b50601f017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0169290920160200192915050565b602081526000611cc46020830184611c46565b9392505050565b600060208284031215611cdd57600080fd5b5035919050565b600080600060408486031215611cf957600080fd5b833567ffffffffffffffff811115611d1057600080fd5b611d1c86828701611b7d565b9094509250611d2f905060208501611bc6565b90509250925092565b600080600060608486031215611d4d57600080fd5b8335611d5881611b58565b92506020840135611d6881611b58565b91506040840135611d7881611b58565b809150509250925092565b600080600080600080600060c0888a031215611d9e57600080fd5b873596506020880135611db081611b58565b95506040880135611dc081611b58565b9450606088013593506080880135925060a088013567ffffffffffffffff811115611dea57600080fd5b611df68a828b01611b7d565b989b979a50959850939692959293505050565b8183528181602085013750600060208284010152600060207fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0601f840116840101905092915050565b878152600073ffffffffffffffffffffffffffffffffffffffff808916602084015280881660408401525085606083015263ffffffff8516608083015260c060a0830152611ea460c083018486611e09565b9998505050505050505050565b73ffffffffffffffffffffffffffffffffffffffff86168152608060208201526000611ee1608083018688611e09565b905083604083015263ffffffff831660608301529695505050505050565b600060208284031215611f1157600080fd5b81518015158114611cc457600080fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b600067ffffffffffffffff80831681851681830481118215151615611f7757611f77611f21565b02949350505050565b600067ffffffffffffffff80841680611fc2577f4e487b7100000000000000000000000000000000000000000000000000000000600052601260045260246000fd5b92169190910492915050565b600067ffffffffffffffff808316818516808303821115611ff157611ff1611f21565b01949350505050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052600160045260246000fd5b60008282101561203b5761203b611f21565b500390565b73ffffffffffffffffffffffffffffffffffffffff8616815284602082015267ffffffffffffffff84166040820152821515606082015260a06080820152600061208d60a0830184611c46565b979650505050505050565b6000602082840312156120aa57600080fd5b8151611cc481611b58565b600080604083850312156120c857600080fd5b82516120d381611b58565b602084015190925060ff811681146120ea57600080fd5b809150509250929050565b600073ffffffffffffffffffffffffffffffffffffffff80871683528086166020840152506080604083015261212e6080830185611c46565b905082606083015295945050505050565b868152600073ffffffffffffffffffffffffffffffffffffffff808816602084015280871660408401525084606083015283608083015260c060a083015261218a60c0830184611c46565b9897505050505050505056fea164736f6c634300080f000a", - "deployedCode": "0x60806040526004361061018b5760003560e01c80636425666b116100d6578063b1b1b2091161007f578063d764ad0b11610059578063d764ad0b1461049b578063db505d80146104ae578063ecc70428146104db57600080fd5b8063b1b1b2091461042b578063b28ade251461045b578063c0c53b8b1461047b57600080fd5b80638cbeeef2116100b05780638cbeeef2146102d05780639fce812c146103d0578063a4e7f8bd146103fb57600080fd5b80636425666b146103775780636e296e45146103a457806383a74074146103b957600080fd5b80633dbb202b1161013857806354fd4d501161011257806354fd4d50146102e65780635644cfdf1461033c5780635c975abb1461035257600080fd5b80633dbb202b146102935780633f827a5a146102a85780634c1d6a69146102d057600080fd5b80632828d7e8116101695780632828d7e81461022457806333d7e2bd1461023957806335e80ab31461026657600080fd5b8063028f85f7146101905780630c568498146101c35780630ff754ea146101d8575b600080fd5b34801561019c57600080fd5b506101a5601081565b60405167ffffffffffffffff90911681526020015b60405180910390f35b3480156101cf57600080fd5b506101a5603f81565b3480156101e457600080fd5b5060fc5473ffffffffffffffffffffffffffffffffffffffff165b60405173ffffffffffffffffffffffffffffffffffffffff90911681526020016101ba565b34801561023057600080fd5b506101a5604081565b34801561024557600080fd5b5060fd546101ff9073ffffffffffffffffffffffffffffffffffffffff1681565b34801561027257600080fd5b5060fb546101ff9073ffffffffffffffffffffffffffffffffffffffff1681565b6102a66102a1366004611bdf565b610540565b005b3480156102b457600080fd5b506102bd600181565b60405161ffff90911681526020016101ba565b3480156102dc57600080fd5b506101a5619c4081565b3480156102f257600080fd5b5061032f6040518060400160405280600581526020017f322e342e3000000000000000000000000000000000000000000000000000000081525081565b6040516101ba9190611cb1565b34801561034857600080fd5b506101a561138881565b34801561035e57600080fd5b5061036761083d565b60405190151581526020016101ba565b34801561038357600080fd5b5060fc546101ff9073ffffffffffffffffffffffffffffffffffffffff1681565b3480156103b057600080fd5b506101ff6108d6565b3480156103c557600080fd5b506101a562030d4081565b3480156103dc57600080fd5b5060cf5473ffffffffffffffffffffffffffffffffffffffff166101ff565b34801561040757600080fd5b50610367610416366004611ccb565b60ce6020526000908152604090205460ff1681565b34801561043757600080fd5b50610367610446366004611ccb565b60cb6020526000908152604090205460ff1681565b34801561046757600080fd5b506101a5610476366004611ce4565b6109bd565b34801561048757600080fd5b506102a6610496366004611d38565b610a2b565b6102a66104a9366004611d83565b610ca2565b3480156104ba57600080fd5b5060cf546101ff9073ffffffffffffffffffffffffffffffffffffffff1681565b3480156104e757600080fd5b5061053260cd547dffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff167e010000000000000000000000000000000000000000000000000000000000001790565b6040519081526020016101ba565b6105486115d3565b156105e05734156105e0576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152603d60248201527f43726f7373446f6d61696e4d657373656e6765723a2063616e6e6f742073656e60448201527f642076616c7565207769746820637573746f6d2067617320746f6b656e00000060648201526084015b60405180910390fd5b60cf546107129073ffffffffffffffffffffffffffffffffffffffff166106088585856109bd565b347fd764ad0b0000000000000000000000000000000000000000000000000000000061067460cd547dffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff167e010000000000000000000000000000000000000000000000000000000000001790565b338a34898c8c6040516024016106909796959493929190611e52565b604080517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe08184030181529190526020810180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff167fffffffff0000000000000000000000000000000000000000000000000000000090931692909217909152611612565b8373ffffffffffffffffffffffffffffffffffffffff167fcb0f7ffd78f9aee47a248fae8db181db6eee833039123e026dcbff529522e52a33858561079760cd547dffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff167e010000000000000000000000000000000000000000000000000000000000001790565b866040516107a9959493929190611eb1565b60405180910390a260405134815233907f8ebb2ec2465bdb2a06a66fc37a0963af8a2a6a1479d81d56fdb8cbb98096d5469060200160405180910390a2505060cd80547dffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff808216600101167fffff0000000000000000000000000000000000000000000000000000000000009091161790555050565b60fb54604080517f5c975abb000000000000000000000000000000000000000000000000000000008152905160009273ffffffffffffffffffffffffffffffffffffffff1691635c975abb9160048083019260209291908290030181865afa1580156108ad573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906108d19190611eff565b905090565b60cc5460009073ffffffffffffffffffffffffffffffffffffffff167fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff2153016109a0576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152603560248201527f43726f7373446f6d61696e4d657373656e6765723a2078446f6d61696e4d657360448201527f7361676553656e646572206973206e6f7420736574000000000000000000000060648201526084016105d7565b5060cc5473ffffffffffffffffffffffffffffffffffffffff1690565b6000611388619c4080603f6109d9604063ffffffff8816611f50565b6109e39190611f80565b6109ee601088611f50565b6109fb9062030d40611fce565b610a059190611fce565b610a0f9190611fce565b610a199190611fce565b610a239190611fce565b949350505050565b6000547501000000000000000000000000000000000000000000900460ff1615808015610a76575060005460017401000000000000000000000000000000000000000090910460ff16105b80610aa85750303b158015610aa8575060005474010000000000000000000000000000000000000000900460ff166001145b610b34576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602e60248201527f496e697469616c697a61626c653a20636f6e747261637420697320616c72656160448201527f647920696e697469616c697a656400000000000000000000000000000000000060648201526084016105d7565b600080547fffffffffffffffffffffff00ffffffffffffffffffffffffffffffffffffffff16740100000000000000000000000000000000000000001790558015610bba57600080547fffffffffffffffffffff00ffffffffffffffffffffffffffffffffffffffffff1675010000000000000000000000000000000000000000001790555b60fb805473ffffffffffffffffffffffffffffffffffffffff8087167fffffffffffffffffffffffff00000000000000000000000000000000000000009283161790925560fc805486841690831617905560fd805492851692909116919091179055610c397342000000000000000000000000000000000000076116ab565b8015610c9c57600080547fffffffffffffffffffff00ffffffffffffffffffffffffffffffffffffffffff169055604051600181527f7f26b83ff96e1f2b6a682f133852f6798a09c465da95921460cefb38474024989060200160405180910390a15b50505050565b610caa61083d565b15610d11576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601c60248201527f43726f7373446f6d61696e4d657373656e6765723a207061757365640000000060448201526064016105d7565b60f087901c60028110610dcc576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152604d60248201527f43726f7373446f6d61696e4d657373656e6765723a206f6e6c7920766572736960448201527f6f6e2030206f722031206d657373616765732061726520737570706f7274656460648201527f20617420746869732074696d6500000000000000000000000000000000000000608482015260a4016105d7565b8061ffff16600003610ec1576000610e1d878986868080601f0160208091040260200160405190810160405280939291908181526020018383808284376000920191909152508f92506117e7915050565b600081815260cb602052604090205490915060ff1615610ebf576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152603760248201527f43726f7373446f6d61696e4d657373656e6765723a206c65676163792077697460448201527f6864726177616c20616c72656164792072656c6179656400000000000000000060648201526084016105d7565b505b6000610f07898989898989898080601f01602080910402602001604051908101604052809392919081815260200183838082843760009201919091525061180692505050565b9050610f11611829565b15610f4957853414610f2557610f25611ffa565b600081815260ce602052604090205460ff1615610f4457610f44611ffa565b61109b565b3415610ffd576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152605060248201527f43726f7373446f6d61696e4d657373656e6765723a2076616c7565206d75737460448201527f206265207a65726f20756e6c657373206d6573736167652069732066726f6d2060648201527f612073797374656d206164647265737300000000000000000000000000000000608482015260a4016105d7565b600081815260ce602052604090205460ff1661109b576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152603060248201527f43726f7373446f6d61696e4d657373656e6765723a206d65737361676520636160448201527f6e6e6f74206265207265706c617965640000000000000000000000000000000060648201526084016105d7565b6110a487611905565b15611157576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152604360248201527f43726f7373446f6d61696e4d657373656e6765723a2063616e6e6f742073656e60448201527f64206d65737361676520746f20626c6f636b65642073797374656d206164647260648201527f6573730000000000000000000000000000000000000000000000000000000000608482015260a4016105d7565b600081815260cb602052604090205460ff16156111f6576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152603660248201527f43726f7373446f6d61696e4d657373656e6765723a206d65737361676520686160448201527f7320616c7265616479206265656e2072656c617965640000000000000000000060648201526084016105d7565b61121785611208611388619c40611fce565b67ffffffffffffffff1661194b565b158061123d575060cc5473ffffffffffffffffffffffffffffffffffffffff1661dead14155b1561135657600081815260ce602052604080822080547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff001660011790555182917f99d0e048484baa1b1540b1367cb128acd7ab2946d1ed91ec10e3c85e4bf51b8f91a27fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff320161134f576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602d60248201527f43726f7373446f6d61696e4d657373656e6765723a206661696c656420746f2060448201527f72656c6179206d6573736167650000000000000000000000000000000000000060648201526084016105d7565b50506115ae565b60cc80547fffffffffffffffffffffffff00000000000000000000000000000000000000001673ffffffffffffffffffffffffffffffffffffffff8a1617905560006113e788619c405a6113aa9190612029565b8988888080601f01602080910402602001604051908101604052809392919081815260200183838082843760009201919091525061196992505050565b60cc80547fffffffffffffffffffffffff00000000000000000000000000000000000000001661dead1790559050801561149d57600082815260cb602052604090205460ff161561143a5761143a611ffa565b600082815260cb602052604080822080547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff001660011790555183917f4641df4a962071e12719d8c8c8e5ac7fc4d97b927346a3d7a335b1f7517e133c91a26115aa565b600082815260ce602052604080822080547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff001660011790555183917f99d0e048484baa1b1540b1367cb128acd7ab2946d1ed91ec10e3c85e4bf51b8f91a27fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff32016115aa576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602d60248201527f43726f7373446f6d61696e4d657373656e6765723a206661696c656420746f2060448201527f72656c6179206d6573736167650000000000000000000000000000000000000060648201526084016105d7565b5050505b50505050505050565b73ffffffffffffffffffffffffffffffffffffffff163b151590565b6000806115de611983565b5073ffffffffffffffffffffffffffffffffffffffff1673eeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeee141592915050565b60fc546040517fe9e05c4200000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff9091169063e9e05c42908490611673908890839089906000908990600401612040565b6000604051808303818588803b15801561168c57600080fd5b505af11580156116a0573d6000803e3d6000fd5b505050505050505050565b6000547501000000000000000000000000000000000000000000900460ff16611756576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602b60248201527f496e697469616c697a61626c653a20636f6e7472616374206973206e6f74206960448201527f6e697469616c697a696e6700000000000000000000000000000000000000000060648201526084016105d7565b60cc5473ffffffffffffffffffffffffffffffffffffffff166117a05760cc80547fffffffffffffffffffffffff00000000000000000000000000000000000000001661dead1790555b60cf80547fffffffffffffffffffffffff00000000000000000000000000000000000000001673ffffffffffffffffffffffffffffffffffffffff92909216919091179055565b60006117f585858585611a20565b805190602001209050949350505050565b6000611816878787878787611ab9565b8051906020012090509695505050505050565b60fc5460009073ffffffffffffffffffffffffffffffffffffffff16331480156108d1575060cf5460fc54604080517f9bf62d82000000000000000000000000000000000000000000000000000000008152905173ffffffffffffffffffffffffffffffffffffffff9384169390921691639bf62d82916004808201926020929091908290030181865afa1580156118c5573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906118e99190612098565b73ffffffffffffffffffffffffffffffffffffffff1614905090565b600073ffffffffffffffffffffffffffffffffffffffff8216301480611945575060fc5473ffffffffffffffffffffffffffffffffffffffff8381169116145b92915050565b600080603f83619c4001026040850201603f5a021015949350505050565b600080600080845160208601878a8af19695505050505050565b60fd54604080517f4397dfef0000000000000000000000000000000000000000000000000000000081528151600093849373ffffffffffffffffffffffffffffffffffffffff90911692634397dfef92600480830193928290030181865afa1580156119f3573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611a1791906120b5565b90939092509050565b606084848484604051602401611a3994939291906120f5565b604080517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe08184030181529190526020810180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff167fcbd4ece9000000000000000000000000000000000000000000000000000000001790529050949350505050565b6060868686868686604051602401611ad69695949392919061213f565b604080517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe08184030181529190526020810180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff167fd764ad0b0000000000000000000000000000000000000000000000000000000017905290509695505050505050565b73ffffffffffffffffffffffffffffffffffffffff81168114611b7a57600080fd5b50565b60008083601f840112611b8f57600080fd5b50813567ffffffffffffffff811115611ba757600080fd5b602083019150836020828501011115611bbf57600080fd5b9250929050565b803563ffffffff81168114611bda57600080fd5b919050565b60008060008060608587031215611bf557600080fd5b8435611c0081611b58565b9350602085013567ffffffffffffffff811115611c1c57600080fd5b611c2887828801611b7d565b9094509250611c3b905060408601611bc6565b905092959194509250565b6000815180845260005b81811015611c6c57602081850181015186830182015201611c50565b81811115611c7e576000602083870101525b50601f017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0169290920160200192915050565b602081526000611cc46020830184611c46565b9392505050565b600060208284031215611cdd57600080fd5b5035919050565b600080600060408486031215611cf957600080fd5b833567ffffffffffffffff811115611d1057600080fd5b611d1c86828701611b7d565b9094509250611d2f905060208501611bc6565b90509250925092565b600080600060608486031215611d4d57600080fd5b8335611d5881611b58565b92506020840135611d6881611b58565b91506040840135611d7881611b58565b809150509250925092565b600080600080600080600060c0888a031215611d9e57600080fd5b873596506020880135611db081611b58565b95506040880135611dc081611b58565b9450606088013593506080880135925060a088013567ffffffffffffffff811115611dea57600080fd5b611df68a828b01611b7d565b989b979a50959850939692959293505050565b8183528181602085013750600060208284010152600060207fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0601f840116840101905092915050565b878152600073ffffffffffffffffffffffffffffffffffffffff808916602084015280881660408401525085606083015263ffffffff8516608083015260c060a0830152611ea460c083018486611e09565b9998505050505050505050565b73ffffffffffffffffffffffffffffffffffffffff86168152608060208201526000611ee1608083018688611e09565b905083604083015263ffffffff831660608301529695505050505050565b600060208284031215611f1157600080fd5b81518015158114611cc457600080fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b600067ffffffffffffffff80831681851681830481118215151615611f7757611f77611f21565b02949350505050565b600067ffffffffffffffff80841680611fc2577f4e487b7100000000000000000000000000000000000000000000000000000000600052601260045260246000fd5b92169190910492915050565b600067ffffffffffffffff808316818516808303821115611ff157611ff1611f21565b01949350505050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052600160045260246000fd5b60008282101561203b5761203b611f21565b500390565b73ffffffffffffffffffffffffffffffffffffffff8616815284602082015267ffffffffffffffff84166040820152821515606082015260a06080820152600061208d60a0830184611c46565b979650505050505050565b6000602082840312156120aa57600080fd5b8151611cc481611b58565b600080604083850312156120c857600080fd5b82516120d381611b58565b602084015190925060ff811681146120ea57600080fd5b809150509250929050565b600073ffffffffffffffffffffffffffffffffffffffff80871683528086166020840152506080604083015261212e6080830185611c46565b905082606083015295945050505050565b868152600073ffffffffffffffffffffffffffffffffffffffff808816602084015280871660408401525084606083015283608083015260c060a083015261218a60c0830184611c46565b9897505050505050505056fea164736f6c634300080f000a", - "initialized": true, - "kind": "Create", - "newBalance": 0, - "oldBalance": 0, - "reverted": false, - "storageAccesses": [ - { - "account": "0xf3E6CBcbF1AE12Fc13Bc8B14FA8A67CbE147fD99", - "isWrite": false, - "newValue": "0x0000000000000000000000000000000000000000000000000000000000000000", - "previousValue": "0x0000000000000000000000000000000000000000000000000000000000000000", - "reverted": false, - "slot": "0x0000000000000000000000000000000000000000000000000000000000000000" - }, - { - "account": "0xf3E6CBcbF1AE12Fc13Bc8B14FA8A67CbE147fD99", - "isWrite": false, - "newValue": "0x0000000000000000000000000000000000000000000000000000000000000000", - "previousValue": "0x0000000000000000000000000000000000000000000000000000000000000000", - "reverted": false, - "slot": "0x0000000000000000000000000000000000000000000000000000000000000000" - }, - { - "account": "0xf3E6CBcbF1AE12Fc13Bc8B14FA8A67CbE147fD99", - "isWrite": false, - "newValue": "0x0000000000000000000000000000000000000000000000000000000000000000", - "previousValue": "0x0000000000000000000000000000000000000000000000000000000000000000", - "reverted": false, - "slot": "0x0000000000000000000000000000000000000000000000000000000000000000" - }, - { - "account": "0xf3E6CBcbF1AE12Fc13Bc8B14FA8A67CbE147fD99", - "isWrite": true, - "newValue": "0x0000000000000000000000010000000000000000000000000000000000000000", - "previousValue": "0x0000000000000000000000000000000000000000000000000000000000000000", - "reverted": false, - "slot": "0x0000000000000000000000000000000000000000000000000000000000000000" - }, - { - "account": "0xf3E6CBcbF1AE12Fc13Bc8B14FA8A67CbE147fD99", - "isWrite": false, - "newValue": "0x0000000000000000000000010000000000000000000000000000000000000000", - "previousValue": "0x0000000000000000000000010000000000000000000000000000000000000000", - "reverted": false, - "slot": "0x0000000000000000000000000000000000000000000000000000000000000000" - }, - { - "account": "0xf3E6CBcbF1AE12Fc13Bc8B14FA8A67CbE147fD99", - "isWrite": true, - "newValue": "0x0000000000000000000001010000000000000000000000000000000000000000", - "previousValue": "0x0000000000000000000000010000000000000000000000000000000000000000", - "reverted": false, - "slot": "0x0000000000000000000000000000000000000000000000000000000000000000" - }, - { - "account": "0xf3E6CBcbF1AE12Fc13Bc8B14FA8A67CbE147fD99", - "isWrite": false, - "newValue": "0x0000000000000000000000000000000000000000000000000000000000000000", - "previousValue": "0x0000000000000000000000000000000000000000000000000000000000000000", - "reverted": false, - "slot": "0x00000000000000000000000000000000000000000000000000000000000000fb" - }, - { - "account": "0xf3E6CBcbF1AE12Fc13Bc8B14FA8A67CbE147fD99", - "isWrite": true, - "newValue": "0x0000000000000000000000000000000000000000000000000000000000000000", - "previousValue": "0x0000000000000000000000000000000000000000000000000000000000000000", - "reverted": false, - "slot": "0x00000000000000000000000000000000000000000000000000000000000000fb" - }, - { - "account": "0xf3E6CBcbF1AE12Fc13Bc8B14FA8A67CbE147fD99", - "isWrite": false, - "newValue": "0x0000000000000000000000000000000000000000000000000000000000000000", - "previousValue": "0x0000000000000000000000000000000000000000000000000000000000000000", - "reverted": false, - "slot": "0x00000000000000000000000000000000000000000000000000000000000000fc" - }, - { - "account": "0xf3E6CBcbF1AE12Fc13Bc8B14FA8A67CbE147fD99", - "isWrite": true, - "newValue": "0x0000000000000000000000000000000000000000000000000000000000000000", - "previousValue": "0x0000000000000000000000000000000000000000000000000000000000000000", - "reverted": false, - "slot": "0x00000000000000000000000000000000000000000000000000000000000000fc" - }, - { - "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", - "reverted": false, - "slot": "0x0000000000000000000000000000000000000000000000000000000000000000" - }, - { - "account": "0xf3E6CBcbF1AE12Fc13Bc8B14FA8A67CbE147fD99", - "isWrite": false, - "newValue": "0x0000000000000000000000000000000000000000000000000000000000000000", - "previousValue": "0x0000000000000000000000000000000000000000000000000000000000000000", - "reverted": false, - "slot": "0x00000000000000000000000000000000000000000000000000000000000000cc" - }, - { - "account": "0xf3E6CBcbF1AE12Fc13Bc8B14FA8A67CbE147fD99", - "isWrite": false, - "newValue": "0x0000000000000000000000000000000000000000000000000000000000000000", - "previousValue": "0x0000000000000000000000000000000000000000000000000000000000000000", - "reverted": false, - "slot": "0x00000000000000000000000000000000000000000000000000000000000000cc" - }, - { - "account": "0xf3E6CBcbF1AE12Fc13Bc8B14FA8A67CbE147fD99", - "isWrite": true, - "newValue": "0x000000000000000000000000000000000000000000000000000000000000dead", - "previousValue": "0x0000000000000000000000000000000000000000000000000000000000000000", - "reverted": false, - "slot": "0x00000000000000000000000000000000000000000000000000000000000000cc" - }, - { - "account": "0xf3E6CBcbF1AE12Fc13Bc8B14FA8A67CbE147fD99", - "isWrite": false, - "newValue": "0x0000000000000000000000000000000000000000000000000000000000000000", - "previousValue": "0x0000000000000000000000000000000000000000000000000000000000000000", - "reverted": false, - "slot": "0x00000000000000000000000000000000000000000000000000000000000000cf" - }, - { - "account": "0xf3E6CBcbF1AE12Fc13Bc8B14FA8A67CbE147fD99", - "isWrite": true, - "newValue": "0x0000000000000000000000004200000000000000000000000000000000000007", - "previousValue": "0x0000000000000000000000000000000000000000000000000000000000000000", - "reverted": false, - "slot": "0x00000000000000000000000000000000000000000000000000000000000000cf" - }, - { - "account": "0xf3E6CBcbF1AE12Fc13Bc8B14FA8A67CbE147fD99", - "isWrite": false, - "newValue": "0x0000000000000000000001010000000000000000000000000000000000000000", - "previousValue": "0x0000000000000000000001010000000000000000000000000000000000000000", - "reverted": false, - "slot": "0x0000000000000000000000000000000000000000000000000000000000000000" - }, - { - "account": "0xf3E6CBcbF1AE12Fc13Bc8B14FA8A67CbE147fD99", - "isWrite": true, - "newValue": "0x0000000000000000000000010000000000000000000000000000000000000000", - "previousValue": "0x0000000000000000000001010000000000000000000000000000000000000000", - "reverted": false, - "slot": "0x0000000000000000000000000000000000000000000000000000000000000000" - } - ], - "value": 0 - }, - { - "accessor": "0x7FA9385bE102ac3EAc297483Dd6233D62b3e1496", - "account": "0x7109709ECfa91a80626fF3989D68f67F5b1DD12D", - "chainInfo": { - "chainId": 31337, - "forkId": 0 - }, - "data": "0x", - "deployedCode": "0x", - "initialized": true, - "kind": "Resume", - "newBalance": 0, - "oldBalance": 0, - "reverted": false, - "storageAccesses": [], - "value": 0 - }, - { - "accessor": "0x1804c8AB1F12E6bbf3894d4083f33e07309d1f38", - "account": "0xf3E6CBcbF1AE12Fc13Bc8B14FA8A67CbE147fD99", - "chainInfo": { - "chainId": 31337, - "forkId": 0 - }, - "data": "0x9fce812c", - "deployedCode": "0x", - "initialized": true, - "kind": "StaticCall", - "newBalance": 0, - "oldBalance": 0, - "reverted": false, - "storageAccesses": [ - { - "account": "0xf3E6CBcbF1AE12Fc13Bc8B14FA8A67CbE147fD99", - "isWrite": false, - "newValue": "0x0000000000000000000000004200000000000000000000000000000000000007", - "previousValue": "0x0000000000000000000000004200000000000000000000000000000000000007", - "reverted": false, - "slot": "0x00000000000000000000000000000000000000000000000000000000000000cf" - } - ], - "value": 0 - }, - { - "accessor": "0x1804c8AB1F12E6bbf3894d4083f33e07309d1f38", - "account": "0xf3E6CBcbF1AE12Fc13Bc8B14FA8A67CbE147fD99", - "chainInfo": { - "chainId": 31337, - "forkId": 0 - }, - "data": "0xdb505d80", - "deployedCode": "0x", - "initialized": true, - "kind": "StaticCall", - "newBalance": 0, - "oldBalance": 0, - "reverted": false, - "storageAccesses": [ - { - "account": "0xf3E6CBcbF1AE12Fc13Bc8B14FA8A67CbE147fD99", - "isWrite": false, - "newValue": "0x0000000000000000000000004200000000000000000000000000000000000007", - "previousValue": "0x0000000000000000000000004200000000000000000000000000000000000007", - "reverted": false, - "slot": "0x00000000000000000000000000000000000000000000000000000000000000cf" - } - ], - "value": 0 - }, - { - "accessor": "0x1804c8AB1F12E6bbf3894d4083f33e07309d1f38", - "account": "0xf3E6CBcbF1AE12Fc13Bc8B14FA8A67CbE147fD99", - "chainInfo": { - "chainId": 31337, - "forkId": 0 - }, - "data": "0x0ff754ea", - "deployedCode": "0x", - "initialized": true, - "kind": "StaticCall", - "newBalance": 0, - "oldBalance": 0, - "reverted": false, - "storageAccesses": [ - { - "account": "0xf3E6CBcbF1AE12Fc13Bc8B14FA8A67CbE147fD99", - "isWrite": false, - "newValue": "0x0000000000000000000000000000000000000000000000000000000000000000", - "previousValue": "0x0000000000000000000000000000000000000000000000000000000000000000", - "reverted": false, - "slot": "0x00000000000000000000000000000000000000000000000000000000000000fc" - } - ], - "value": 0 - }, - { - "accessor": "0x1804c8AB1F12E6bbf3894d4083f33e07309d1f38", - "account": "0xf3E6CBcbF1AE12Fc13Bc8B14FA8A67CbE147fD99", - "chainInfo": { - "chainId": 31337, - "forkId": 0 - }, - "data": "0x6425666b", - "deployedCode": "0x", - "initialized": true, - "kind": "StaticCall", - "newBalance": 0, - "oldBalance": 0, - "reverted": false, - "storageAccesses": [ - { - "account": "0xf3E6CBcbF1AE12Fc13Bc8B14FA8A67CbE147fD99", - "isWrite": false, - "newValue": "0x0000000000000000000000000000000000000000000000000000000000000000", - "previousValue": "0x0000000000000000000000000000000000000000000000000000000000000000", - "reverted": false, - "slot": "0x00000000000000000000000000000000000000000000000000000000000000fc" - } - ], - "value": 0 - }, - { - "accessor": "0x1804c8AB1F12E6bbf3894d4083f33e07309d1f38", - "account": "0xf3E6CBcbF1AE12Fc13Bc8B14FA8A67CbE147fD99", - "chainInfo": { - "chainId": 31337, - "forkId": 0 - }, - "data": "0x35e80ab3", - "deployedCode": "0x", - "initialized": true, - "kind": "StaticCall", - "newBalance": 0, - "oldBalance": 0, - "reverted": false, - "storageAccesses": [ - { - "account": "0xf3E6CBcbF1AE12Fc13Bc8B14FA8A67CbE147fD99", - "isWrite": false, - "newValue": "0x0000000000000000000000000000000000000000000000000000000000000000", - "previousValue": "0x0000000000000000000000000000000000000000000000000000000000000000", - "reverted": false, - "slot": "0x00000000000000000000000000000000000000000000000000000000000000fb" - } - ], - "value": 0 - }, - { - "accessor": "0x7FA9385bE102ac3EAc297483Dd6233D62b3e1496", - "account": "0x7109709ECfa91a80626fF3989D68f67F5b1DD12D", - "chainInfo": { - "chainId": 31337, - "forkId": 0 - }, - "data": "0x", - "deployedCode": "0x", - "initialized": true, - "kind": "Resume", - "newBalance": 0, - "oldBalance": 0, - "reverted": false, - "storageAccesses": [], - "value": 0 - }, - { - "accessor": "0x7FA9385bE102ac3EAc297483Dd6233D62b3e1496", - "account": "0x7109709ECfa91a80626fF3989D68f67F5b1DD12D", - "chainInfo": { - "chainId": 31337, - "forkId": 0 - }, - "data": "0x", - "deployedCode": "0x", - "initialized": true, - "kind": "Resume", - "newBalance": 0, - "oldBalance": 0, - "reverted": false, - "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", - "chainInfo": { - "chainId": 31337, - "forkId": 0 - }, - "data": "0x60806040523480156200001157600080fd5b50620000256001806000808080806200002b565b62000328565b600054610100900460ff16158080156200004c5750600054600160ff909116105b806200007c575062000069306200031960201b6200135d1760201c565b1580156200007c575060005460ff166001145b620000e55760405162461bcd60e51b815260206004820152602e60248201527f496e697469616c697a61626c653a20636f6e747261637420697320616c72656160448201526d191e481a5b9a5d1a585b1a5e995960921b60648201526084015b60405180910390fd5b6000805460ff19166001179055801562000109576000805461ff0019166101001790555b60008811620001815760405162461bcd60e51b815260206004820152603a60248201527f4c324f75747075744f7261636c653a207375626d697373696f6e20696e74657260448201527f76616c206d7573742062652067726561746572207468616e20300000000000006064820152608401620000dc565b60008711620001f95760405162461bcd60e51b815260206004820152603460248201527f4c324f75747075744f7261636c653a204c3220626c6f636b2074696d65206d7560448201527f73742062652067726561746572207468616e20300000000000000000000000006064820152608401620000dc565b428511156200027f5760405162461bcd60e51b8152602060048201526044602482018190527f4c324f75747075744f7261636c653a207374617274696e67204c322074696d65908201527f7374616d70206d757374206265206c657373207468616e2063757272656e742060648201526374696d6560e01b608482015260a401620000dc565b6004889055600587905560018690556002859055600780546001600160a01b038087166001600160a01b0319928316179092556006805492861692909116919091179055600882905580156200030f576000805461ff0019169055604051600181527f7f26b83ff96e1f2b6a682f133852f6798a09c465da95921460cefb38474024989060200160405180910390a15b5050505050505050565b6001600160a01b03163b151590565b6115d580620003386000396000f3fe60806040526004361061018a5760003560e01c806389c44cbb116100d6578063ce5db8d61161007f578063dcec334811610059578063dcec33481461049b578063e1a41bcf146104b0578063f4daa291146104c657600080fd5b8063ce5db8d614610445578063cf8e5cf01461045b578063d1de856c1461047b57600080fd5b8063a25ae557116100b0578063a25ae55714610391578063a8e4fb90146103ed578063bffa7f0f1461041a57600080fd5b806389c44cbb1461034857806393991af3146103685780639aaab6481461037e57600080fd5b806369f16eec1161013857806370872aa51161011257806370872aa5146102fc5780637f00642014610312578063887862721461033257600080fd5b806369f16eec146102a75780636abcf563146102bc5780636b4d98dd146102d157600080fd5b8063529933df11610169578063529933df146101ea578063534db0e2146101ff57806354fd4d501461025157600080fd5b80622134cc1461018f5780631c89c97d146101b35780634599c788146101d5575b600080fd5b34801561019b57600080fd5b506005545b6040519081526020015b60405180910390f35b3480156101bf57600080fd5b506101d36101ce3660046113a2565b6104db565b005b3480156101e157600080fd5b506101a06108b6565b3480156101f657600080fd5b506004546101a0565b34801561020b57600080fd5b5060065461022c9073ffffffffffffffffffffffffffffffffffffffff1681565b60405173ffffffffffffffffffffffffffffffffffffffff90911681526020016101aa565b34801561025d57600080fd5b5061029a6040518060400160405280600581526020017f312e382e3000000000000000000000000000000000000000000000000000000081525081565b6040516101aa9190611405565b3480156102b357600080fd5b506101a0610929565b3480156102c857600080fd5b506003546101a0565b3480156102dd57600080fd5b5060065473ffffffffffffffffffffffffffffffffffffffff1661022c565b34801561030857600080fd5b506101a060015481565b34801561031e57600080fd5b506101a061032d366004611478565b61093b565b34801561033e57600080fd5b506101a060025481565b34801561035457600080fd5b506101d3610363366004611478565b610b4f565b34801561037457600080fd5b506101a060055481565b6101d361038c366004611491565b610de9565b34801561039d57600080fd5b506103b16103ac366004611478565b61124a565b60408051825181526020808401516fffffffffffffffffffffffffffffffff9081169183019190915292820151909216908201526060016101aa565b3480156103f957600080fd5b5060075461022c9073ffffffffffffffffffffffffffffffffffffffff1681565b34801561042657600080fd5b5060075473ffffffffffffffffffffffffffffffffffffffff1661022c565b34801561045157600080fd5b506101a060085481565b34801561046757600080fd5b506103b1610476366004611478565b6112de565b34801561048757600080fd5b506101a0610496366004611478565b611316565b3480156104a757600080fd5b506101a0611346565b3480156104bc57600080fd5b506101a060045481565b3480156104d257600080fd5b506008546101a0565b600054610100900460ff16158080156104fb5750600054600160ff909116105b806105155750303b158015610515575060005460ff166001145b6105a6576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602e60248201527f496e697469616c697a61626c653a20636f6e747261637420697320616c72656160448201527f647920696e697469616c697a656400000000000000000000000000000000000060648201526084015b60405180910390fd5b600080547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00166001179055801561060457600080547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00ff166101001790555b60008811610694576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152603a60248201527f4c324f75747075744f7261636c653a207375626d697373696f6e20696e74657260448201527f76616c206d7573742062652067726561746572207468616e2030000000000000606482015260840161059d565b60008711610724576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152603460248201527f4c324f75747075744f7261636c653a204c3220626c6f636b2074696d65206d7560448201527f73742062652067726561746572207468616e2030000000000000000000000000606482015260840161059d565b428511156107db576040517f08c379a0000000000000000000000000000000000000000000000000000000008152602060048201526044602482018190527f4c324f75747075744f7261636c653a207374617274696e67204c322074696d65908201527f7374616d70206d757374206265206c657373207468616e2063757272656e742060648201527f74696d6500000000000000000000000000000000000000000000000000000000608482015260a40161059d565b60048890556005879055600186905560028590556007805473ffffffffffffffffffffffffffffffffffffffff8087167fffffffffffffffffffffffff0000000000000000000000000000000000000000928316179092556006805492861692909116919091179055600882905580156108ac57600080547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00ff169055604051600181527f7f26b83ff96e1f2b6a682f133852f6798a09c465da95921460cefb38474024989060200160405180910390a15b5050505050505050565b6003546000901561092057600380546108d1906001906114f2565b815481106108e1576108e1611509565b600091825260209091206002909102016001015470010000000000000000000000000000000090046fffffffffffffffffffffffffffffffff16919050565b6001545b905090565b600354600090610924906001906114f2565b60006109456108b6565b8211156109fa576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152604860248201527f4c324f75747075744f7261636c653a2063616e6e6f7420676574206f7574707560448201527f7420666f72206120626c6f636b207468617420686173206e6f74206265656e2060648201527f70726f706f736564000000000000000000000000000000000000000000000000608482015260a40161059d565b600354610aaf576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152604660248201527f4c324f75747075744f7261636c653a2063616e6e6f7420676574206f7574707560448201527f74206173206e6f206f7574707574732068617665206265656e2070726f706f7360648201527f6564207965740000000000000000000000000000000000000000000000000000608482015260a40161059d565b6003546000905b80821015610b485760006002610acc8385611538565b610ad69190611550565b90508460038281548110610aec57610aec611509565b600091825260209091206002909102016001015470010000000000000000000000000000000090046fffffffffffffffffffffffffffffffff161015610b3e57610b37816001611538565b9250610b42565b8091505b50610ab6565b5092915050565b60065473ffffffffffffffffffffffffffffffffffffffff163314610bf6576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152603e60248201527f4c324f75747075744f7261636c653a206f6e6c7920746865206368616c6c656e60448201527f67657220616464726573732063616e2064656c657465206f7574707574730000606482015260840161059d565b6003548110610cad576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152604360248201527f4c324f75747075744f7261636c653a2063616e6e6f742064656c657465206f7560448201527f747075747320616674657220746865206c6174657374206f757470757420696e60648201527f6465780000000000000000000000000000000000000000000000000000000000608482015260a40161059d565b60085460038281548110610cc357610cc3611509565b6000918252602090912060016002909202010154610cf3906fffffffffffffffffffffffffffffffff16426114f2565b10610da6576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152604660248201527f4c324f75747075744f7261636c653a2063616e6e6f742064656c657465206f7560448201527f74707574732074686174206861766520616c7265616479206265656e2066696e60648201527f616c697a65640000000000000000000000000000000000000000000000000000608482015260a40161059d565b6000610db160035490565b90508160035581817f4ee37ac2c786ec85e87592d3c5c8a1dd66f8496dda3f125d9ea8ca5f657629b660405160405180910390a35050565b60075473ffffffffffffffffffffffffffffffffffffffff163314610eb6576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152604160248201527f4c324f75747075744f7261636c653a206f6e6c79207468652070726f706f736560448201527f7220616464726573732063616e2070726f706f7365206e6577206f757470757460648201527f7300000000000000000000000000000000000000000000000000000000000000608482015260a40161059d565b610ebe611346565b8314610f72576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152604860248201527f4c324f75747075744f7261636c653a20626c6f636b206e756d626572206d757360448201527f7420626520657175616c20746f206e65787420657870656374656420626c6f6360648201527f6b206e756d626572000000000000000000000000000000000000000000000000608482015260a40161059d565b42610f7c84611316565b10611009576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152603660248201527f4c324f75747075744f7261636c653a2063616e6e6f742070726f706f7365204c60448201527f32206f757470757420696e207468652066757475726500000000000000000000606482015260840161059d565b83611096576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152603a60248201527f4c324f75747075744f7261636c653a204c32206f75747075742070726f706f7360448201527f616c2063616e6e6f7420626520746865207a65726f2068617368000000000000606482015260840161059d565b81156111525781814014611152576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152604960248201527f4c324f75747075744f7261636c653a20626c6f636b206861736820646f65732060448201527f6e6f74206d61746368207468652068617368206174207468652065787065637460648201527f6564206865696768740000000000000000000000000000000000000000000000608482015260a40161059d565b8261115c60035490565b857fa7aaf2512769da4e444e3de247be2564225c2e7a8f74cfe528e46e17d24868e24260405161118e91815260200190565b60405180910390a45050604080516060810182529283526fffffffffffffffffffffffffffffffff4281166020850190815292811691840191825260038054600181018255600091909152935160029094027fc2575a0e9e593c00f959f8c92f12db2869c3395a3b0502d05e2516446f71f85b810194909455915190518216700100000000000000000000000000000000029116177fc2575a0e9e593c00f959f8c92f12db2869c3395a3b0502d05e2516446f71f85c90910155565b60408051606081018252600080825260208201819052918101919091526003828154811061127a5761127a611509565b600091825260209182902060408051606081018252600290930290910180548352600101546fffffffffffffffffffffffffffffffff8082169484019490945270010000000000000000000000000000000090049092169181019190915292915050565b604080516060810182526000808252602082018190529181019190915260036113068361093b565b8154811061127a5761127a611509565b60006005546001548361132991906114f2565b611333919061158b565b6002546113409190611538565b92915050565b60006004546113536108b6565b6109249190611538565b73ffffffffffffffffffffffffffffffffffffffff163b151590565b803573ffffffffffffffffffffffffffffffffffffffff8116811461139d57600080fd5b919050565b600080600080600080600060e0888a0312156113bd57600080fd5b873596506020880135955060408801359450606088013593506113e260808901611379565b92506113f060a08901611379565b915060c0880135905092959891949750929550565b600060208083528351808285015260005b8181101561143257858101830151858201604001528201611416565b81811115611444576000604083870101525b50601f017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe016929092016040019392505050565b60006020828403121561148a57600080fd5b5035919050565b600080600080608085870312156114a757600080fd5b5050823594602084013594506040840135936060013592509050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b600082821015611504576115046114c3565b500390565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b6000821982111561154b5761154b6114c3565b500190565b600082611586577f4e487b7100000000000000000000000000000000000000000000000000000000600052601260045260246000fd5b500490565b6000817fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff04831182151516156115c3576115c36114c3565b50029056fea164736f6c634300080f000a", - "deployedCode": "0x60806040526004361061018a5760003560e01c806389c44cbb116100d6578063ce5db8d61161007f578063dcec334811610059578063dcec33481461049b578063e1a41bcf146104b0578063f4daa291146104c657600080fd5b8063ce5db8d614610445578063cf8e5cf01461045b578063d1de856c1461047b57600080fd5b8063a25ae557116100b0578063a25ae55714610391578063a8e4fb90146103ed578063bffa7f0f1461041a57600080fd5b806389c44cbb1461034857806393991af3146103685780639aaab6481461037e57600080fd5b806369f16eec1161013857806370872aa51161011257806370872aa5146102fc5780637f00642014610312578063887862721461033257600080fd5b806369f16eec146102a75780636abcf563146102bc5780636b4d98dd146102d157600080fd5b8063529933df11610169578063529933df146101ea578063534db0e2146101ff57806354fd4d501461025157600080fd5b80622134cc1461018f5780631c89c97d146101b35780634599c788146101d5575b600080fd5b34801561019b57600080fd5b506005545b6040519081526020015b60405180910390f35b3480156101bf57600080fd5b506101d36101ce3660046113a2565b6104db565b005b3480156101e157600080fd5b506101a06108b6565b3480156101f657600080fd5b506004546101a0565b34801561020b57600080fd5b5060065461022c9073ffffffffffffffffffffffffffffffffffffffff1681565b60405173ffffffffffffffffffffffffffffffffffffffff90911681526020016101aa565b34801561025d57600080fd5b5061029a6040518060400160405280600581526020017f312e382e3000000000000000000000000000000000000000000000000000000081525081565b6040516101aa9190611405565b3480156102b357600080fd5b506101a0610929565b3480156102c857600080fd5b506003546101a0565b3480156102dd57600080fd5b5060065473ffffffffffffffffffffffffffffffffffffffff1661022c565b34801561030857600080fd5b506101a060015481565b34801561031e57600080fd5b506101a061032d366004611478565b61093b565b34801561033e57600080fd5b506101a060025481565b34801561035457600080fd5b506101d3610363366004611478565b610b4f565b34801561037457600080fd5b506101a060055481565b6101d361038c366004611491565b610de9565b34801561039d57600080fd5b506103b16103ac366004611478565b61124a565b60408051825181526020808401516fffffffffffffffffffffffffffffffff9081169183019190915292820151909216908201526060016101aa565b3480156103f957600080fd5b5060075461022c9073ffffffffffffffffffffffffffffffffffffffff1681565b34801561042657600080fd5b5060075473ffffffffffffffffffffffffffffffffffffffff1661022c565b34801561045157600080fd5b506101a060085481565b34801561046757600080fd5b506103b1610476366004611478565b6112de565b34801561048757600080fd5b506101a0610496366004611478565b611316565b3480156104a757600080fd5b506101a0611346565b3480156104bc57600080fd5b506101a060045481565b3480156104d257600080fd5b506008546101a0565b600054610100900460ff16158080156104fb5750600054600160ff909116105b806105155750303b158015610515575060005460ff166001145b6105a6576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602e60248201527f496e697469616c697a61626c653a20636f6e747261637420697320616c72656160448201527f647920696e697469616c697a656400000000000000000000000000000000000060648201526084015b60405180910390fd5b600080547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00166001179055801561060457600080547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00ff166101001790555b60008811610694576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152603a60248201527f4c324f75747075744f7261636c653a207375626d697373696f6e20696e74657260448201527f76616c206d7573742062652067726561746572207468616e2030000000000000606482015260840161059d565b60008711610724576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152603460248201527f4c324f75747075744f7261636c653a204c3220626c6f636b2074696d65206d7560448201527f73742062652067726561746572207468616e2030000000000000000000000000606482015260840161059d565b428511156107db576040517f08c379a0000000000000000000000000000000000000000000000000000000008152602060048201526044602482018190527f4c324f75747075744f7261636c653a207374617274696e67204c322074696d65908201527f7374616d70206d757374206265206c657373207468616e2063757272656e742060648201527f74696d6500000000000000000000000000000000000000000000000000000000608482015260a40161059d565b60048890556005879055600186905560028590556007805473ffffffffffffffffffffffffffffffffffffffff8087167fffffffffffffffffffffffff0000000000000000000000000000000000000000928316179092556006805492861692909116919091179055600882905580156108ac57600080547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00ff169055604051600181527f7f26b83ff96e1f2b6a682f133852f6798a09c465da95921460cefb38474024989060200160405180910390a15b5050505050505050565b6003546000901561092057600380546108d1906001906114f2565b815481106108e1576108e1611509565b600091825260209091206002909102016001015470010000000000000000000000000000000090046fffffffffffffffffffffffffffffffff16919050565b6001545b905090565b600354600090610924906001906114f2565b60006109456108b6565b8211156109fa576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152604860248201527f4c324f75747075744f7261636c653a2063616e6e6f7420676574206f7574707560448201527f7420666f72206120626c6f636b207468617420686173206e6f74206265656e2060648201527f70726f706f736564000000000000000000000000000000000000000000000000608482015260a40161059d565b600354610aaf576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152604660248201527f4c324f75747075744f7261636c653a2063616e6e6f7420676574206f7574707560448201527f74206173206e6f206f7574707574732068617665206265656e2070726f706f7360648201527f6564207965740000000000000000000000000000000000000000000000000000608482015260a40161059d565b6003546000905b80821015610b485760006002610acc8385611538565b610ad69190611550565b90508460038281548110610aec57610aec611509565b600091825260209091206002909102016001015470010000000000000000000000000000000090046fffffffffffffffffffffffffffffffff161015610b3e57610b37816001611538565b9250610b42565b8091505b50610ab6565b5092915050565b60065473ffffffffffffffffffffffffffffffffffffffff163314610bf6576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152603e60248201527f4c324f75747075744f7261636c653a206f6e6c7920746865206368616c6c656e60448201527f67657220616464726573732063616e2064656c657465206f7574707574730000606482015260840161059d565b6003548110610cad576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152604360248201527f4c324f75747075744f7261636c653a2063616e6e6f742064656c657465206f7560448201527f747075747320616674657220746865206c6174657374206f757470757420696e60648201527f6465780000000000000000000000000000000000000000000000000000000000608482015260a40161059d565b60085460038281548110610cc357610cc3611509565b6000918252602090912060016002909202010154610cf3906fffffffffffffffffffffffffffffffff16426114f2565b10610da6576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152604660248201527f4c324f75747075744f7261636c653a2063616e6e6f742064656c657465206f7560448201527f74707574732074686174206861766520616c7265616479206265656e2066696e60648201527f616c697a65640000000000000000000000000000000000000000000000000000608482015260a40161059d565b6000610db160035490565b90508160035581817f4ee37ac2c786ec85e87592d3c5c8a1dd66f8496dda3f125d9ea8ca5f657629b660405160405180910390a35050565b60075473ffffffffffffffffffffffffffffffffffffffff163314610eb6576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152604160248201527f4c324f75747075744f7261636c653a206f6e6c79207468652070726f706f736560448201527f7220616464726573732063616e2070726f706f7365206e6577206f757470757460648201527f7300000000000000000000000000000000000000000000000000000000000000608482015260a40161059d565b610ebe611346565b8314610f72576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152604860248201527f4c324f75747075744f7261636c653a20626c6f636b206e756d626572206d757360448201527f7420626520657175616c20746f206e65787420657870656374656420626c6f6360648201527f6b206e756d626572000000000000000000000000000000000000000000000000608482015260a40161059d565b42610f7c84611316565b10611009576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152603660248201527f4c324f75747075744f7261636c653a2063616e6e6f742070726f706f7365204c60448201527f32206f757470757420696e207468652066757475726500000000000000000000606482015260840161059d565b83611096576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152603a60248201527f4c324f75747075744f7261636c653a204c32206f75747075742070726f706f7360448201527f616c2063616e6e6f7420626520746865207a65726f2068617368000000000000606482015260840161059d565b81156111525781814014611152576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152604960248201527f4c324f75747075744f7261636c653a20626c6f636b206861736820646f65732060448201527f6e6f74206d61746368207468652068617368206174207468652065787065637460648201527f6564206865696768740000000000000000000000000000000000000000000000608482015260a40161059d565b8261115c60035490565b857fa7aaf2512769da4e444e3de247be2564225c2e7a8f74cfe528e46e17d24868e24260405161118e91815260200190565b60405180910390a45050604080516060810182529283526fffffffffffffffffffffffffffffffff4281166020850190815292811691840191825260038054600181018255600091909152935160029094027fc2575a0e9e593c00f959f8c92f12db2869c3395a3b0502d05e2516446f71f85b810194909455915190518216700100000000000000000000000000000000029116177fc2575a0e9e593c00f959f8c92f12db2869c3395a3b0502d05e2516446f71f85c90910155565b60408051606081018252600080825260208201819052918101919091526003828154811061127a5761127a611509565b600091825260209182902060408051606081018252600290930290910180548352600101546fffffffffffffffffffffffffffffffff8082169484019490945270010000000000000000000000000000000090049092169181019190915292915050565b604080516060810182526000808252602082018190529181019190915260036113068361093b565b8154811061127a5761127a611509565b60006005546001548361132991906114f2565b611333919061158b565b6002546113409190611538565b92915050565b60006004546113536108b6565b6109249190611538565b73ffffffffffffffffffffffffffffffffffffffff163b151590565b803573ffffffffffffffffffffffffffffffffffffffff8116811461139d57600080fd5b919050565b600080600080600080600060e0888a0312156113bd57600080fd5b873596506020880135955060408801359450606088013593506113e260808901611379565b92506113f060a08901611379565b915060c0880135905092959891949750929550565b600060208083528351808285015260005b8181101561143257858101830151858201604001528201611416565b81811115611444576000604083870101525b50601f017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe016929092016040019392505050565b60006020828403121561148a57600080fd5b5035919050565b600080600080608085870312156114a757600080fd5b5050823594602084013594506040840135936060013592509050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b600082821015611504576115046114c3565b500390565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b6000821982111561154b5761154b6114c3565b500190565b600082611586577f4e487b7100000000000000000000000000000000000000000000000000000000600052601260045260246000fd5b500490565b6000817fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff04831182151516156115c3576115c36114c3565b50029056fea164736f6c634300080f000a", - "initialized": true, - "kind": "Create", - "newBalance": 0, - "oldBalance": 0, - "reverted": false, - "storageAccesses": [ - { - "account": "0x19652082F846171168Daf378C4fD3ee85a0D4A60", - "isWrite": false, - "newValue": "0x0000000000000000000000000000000000000000000000000000000000000000", - "previousValue": "0x0000000000000000000000000000000000000000000000000000000000000000", - "reverted": false, - "slot": "0x0000000000000000000000000000000000000000000000000000000000000000" - }, - { - "account": "0x19652082F846171168Daf378C4fD3ee85a0D4A60", - "isWrite": false, - "newValue": "0x0000000000000000000000000000000000000000000000000000000000000000", - "previousValue": "0x0000000000000000000000000000000000000000000000000000000000000000", - "reverted": false, - "slot": "0x0000000000000000000000000000000000000000000000000000000000000000" - }, - { - "account": "0x19652082F846171168Daf378C4fD3ee85a0D4A60", - "isWrite": false, - "newValue": "0x0000000000000000000000000000000000000000000000000000000000000000", - "previousValue": "0x0000000000000000000000000000000000000000000000000000000000000000", - "reverted": false, - "slot": "0x0000000000000000000000000000000000000000000000000000000000000000" - }, - { - "account": "0x19652082F846171168Daf378C4fD3ee85a0D4A60", - "isWrite": true, - "newValue": "0x0000000000000000000000000000000000000000000000000000000000000001", - "previousValue": "0x0000000000000000000000000000000000000000000000000000000000000000", - "reverted": false, - "slot": "0x0000000000000000000000000000000000000000000000000000000000000000" - }, - { - "account": "0x19652082F846171168Daf378C4fD3ee85a0D4A60", - "isWrite": false, - "newValue": "0x0000000000000000000000000000000000000000000000000000000000000001", - "previousValue": "0x0000000000000000000000000000000000000000000000000000000000000001", - "reverted": false, - "slot": "0x0000000000000000000000000000000000000000000000000000000000000000" - }, - { - "account": "0x19652082F846171168Daf378C4fD3ee85a0D4A60", - "isWrite": true, - "newValue": "0x0000000000000000000000000000000000000000000000000000000000000101", - "previousValue": "0x0000000000000000000000000000000000000000000000000000000000000001", - "reverted": false, - "slot": "0x0000000000000000000000000000000000000000000000000000000000000000" - }, - { - "account": "0x19652082F846171168Daf378C4fD3ee85a0D4A60", - "isWrite": true, - "newValue": "0x0000000000000000000000000000000000000000000000000000000000000001", - "previousValue": "0x0000000000000000000000000000000000000000000000000000000000000000", - "reverted": false, - "slot": "0x0000000000000000000000000000000000000000000000000000000000000004" - }, - { - "account": "0x19652082F846171168Daf378C4fD3ee85a0D4A60", - "isWrite": true, - "newValue": "0x0000000000000000000000000000000000000000000000000000000000000001", - "previousValue": "0x0000000000000000000000000000000000000000000000000000000000000000", - "reverted": false, - "slot": "0x0000000000000000000000000000000000000000000000000000000000000005" - }, - { - "account": "0x19652082F846171168Daf378C4fD3ee85a0D4A60", - "isWrite": true, - "newValue": "0x0000000000000000000000000000000000000000000000000000000000000000", - "previousValue": "0x0000000000000000000000000000000000000000000000000000000000000000", - "reverted": false, - "slot": "0x0000000000000000000000000000000000000000000000000000000000000001" - }, - { - "account": "0x19652082F846171168Daf378C4fD3ee85a0D4A60", - "isWrite": true, - "newValue": "0x0000000000000000000000000000000000000000000000000000000000000000", - "previousValue": "0x0000000000000000000000000000000000000000000000000000000000000000", - "reverted": false, - "slot": "0x0000000000000000000000000000000000000000000000000000000000000002" - }, - { - "account": "0x19652082F846171168Daf378C4fD3ee85a0D4A60", - "isWrite": false, - "newValue": "0x0000000000000000000000000000000000000000000000000000000000000000", - "previousValue": "0x0000000000000000000000000000000000000000000000000000000000000000", - "reverted": false, - "slot": "0x0000000000000000000000000000000000000000000000000000000000000007" - }, - { - "account": "0x19652082F846171168Daf378C4fD3ee85a0D4A60", - "isWrite": true, - "newValue": "0x0000000000000000000000000000000000000000000000000000000000000000", - "previousValue": "0x0000000000000000000000000000000000000000000000000000000000000000", - "reverted": false, - "slot": "0x0000000000000000000000000000000000000000000000000000000000000007" - }, - { - "account": "0x19652082F846171168Daf378C4fD3ee85a0D4A60", - "isWrite": false, - "newValue": "0x0000000000000000000000000000000000000000000000000000000000000000", - "previousValue": "0x0000000000000000000000000000000000000000000000000000000000000000", - "reverted": false, - "slot": "0x0000000000000000000000000000000000000000000000000000000000000006" - }, - { - "account": "0x19652082F846171168Daf378C4fD3ee85a0D4A60", - "isWrite": true, - "newValue": "0x0000000000000000000000000000000000000000000000000000000000000000", - "previousValue": "0x0000000000000000000000000000000000000000000000000000000000000000", - "reverted": false, - "slot": "0x0000000000000000000000000000000000000000000000000000000000000006" - }, - { - "account": "0x19652082F846171168Daf378C4fD3ee85a0D4A60", - "isWrite": true, - "newValue": "0x0000000000000000000000000000000000000000000000000000000000000000", - "previousValue": "0x0000000000000000000000000000000000000000000000000000000000000000", - "reverted": false, - "slot": "0x0000000000000000000000000000000000000000000000000000000000000008" - }, - { - "account": "0x19652082F846171168Daf378C4fD3ee85a0D4A60", - "isWrite": false, - "newValue": "0x0000000000000000000000000000000000000000000000000000000000000101", - "previousValue": "0x0000000000000000000000000000000000000000000000000000000000000101", - "reverted": false, - "slot": "0x0000000000000000000000000000000000000000000000000000000000000000" - }, - { - "account": "0x19652082F846171168Daf378C4fD3ee85a0D4A60", - "isWrite": true, - "newValue": "0x0000000000000000000000000000000000000000000000000000000000000001", - "previousValue": "0x0000000000000000000000000000000000000000000000000000000000000101", - "reverted": false, - "slot": "0x0000000000000000000000000000000000000000000000000000000000000000" - } - ], - "value": 0 - }, - { - "accessor": "0x7FA9385bE102ac3EAc297483Dd6233D62b3e1496", - "account": "0x7109709ECfa91a80626fF3989D68f67F5b1DD12D", - "chainInfo": { - "chainId": 31337, - "forkId": 0 - }, - "data": "0x", - "deployedCode": "0x", - "initialized": true, - "kind": "Resume", - "newBalance": 0, - "oldBalance": 0, - "reverted": false, - "storageAccesses": [], - "value": 0 - }, - { - "accessor": "0x1804c8AB1F12E6bbf3894d4083f33e07309d1f38", - "account": "0x19652082F846171168Daf378C4fD3ee85a0D4A60", - "chainInfo": { - "chainId": 31337, - "forkId": 0 - }, - "data": "0x529933df", - "deployedCode": "0x", - "initialized": true, - "kind": "StaticCall", - "newBalance": 0, - "oldBalance": 0, - "reverted": false, - "storageAccesses": [ - { - "account": "0x19652082F846171168Daf378C4fD3ee85a0D4A60", - "isWrite": false, - "newValue": "0x0000000000000000000000000000000000000000000000000000000000000001", - "previousValue": "0x0000000000000000000000000000000000000000000000000000000000000001", - "reverted": false, - "slot": "0x0000000000000000000000000000000000000000000000000000000000000004" - } - ], - "value": 0 - }, - { - "accessor": "0x1804c8AB1F12E6bbf3894d4083f33e07309d1f38", - "account": "0x19652082F846171168Daf378C4fD3ee85a0D4A60", - "chainInfo": { - "chainId": 31337, - "forkId": 0 - }, - "data": "0xe1a41bcf", - "deployedCode": "0x", - "initialized": true, - "kind": "StaticCall", - "newBalance": 0, - "oldBalance": 0, - "reverted": false, - "storageAccesses": [ - { - "account": "0x19652082F846171168Daf378C4fD3ee85a0D4A60", - "isWrite": false, - "newValue": "0x0000000000000000000000000000000000000000000000000000000000000001", - "previousValue": "0x0000000000000000000000000000000000000000000000000000000000000001", - "reverted": false, - "slot": "0x0000000000000000000000000000000000000000000000000000000000000004" - } - ], - "value": 0 - }, - { - "accessor": "0x1804c8AB1F12E6bbf3894d4083f33e07309d1f38", - "account": "0x19652082F846171168Daf378C4fD3ee85a0D4A60", - "chainInfo": { - "chainId": 31337, - "forkId": 0 - }, - "data": "0x002134cc", - "deployedCode": "0x", - "initialized": true, - "kind": "StaticCall", - "newBalance": 0, - "oldBalance": 0, - "reverted": false, - "storageAccesses": [ - { - "account": "0x19652082F846171168Daf378C4fD3ee85a0D4A60", - "isWrite": false, - "newValue": "0x0000000000000000000000000000000000000000000000000000000000000001", - "previousValue": "0x0000000000000000000000000000000000000000000000000000000000000001", - "reverted": false, - "slot": "0x0000000000000000000000000000000000000000000000000000000000000005" - } - ], - "value": 0 - }, - { - "accessor": "0x1804c8AB1F12E6bbf3894d4083f33e07309d1f38", - "account": "0x19652082F846171168Daf378C4fD3ee85a0D4A60", - "chainInfo": { - "chainId": 31337, - "forkId": 0 - }, - "data": "0x93991af3", - "deployedCode": "0x", - "initialized": true, - "kind": "StaticCall", - "newBalance": 0, - "oldBalance": 0, - "reverted": false, - "storageAccesses": [ - { - "account": "0x19652082F846171168Daf378C4fD3ee85a0D4A60", - "isWrite": false, - "newValue": "0x0000000000000000000000000000000000000000000000000000000000000001", - "previousValue": "0x0000000000000000000000000000000000000000000000000000000000000001", - "reverted": false, - "slot": "0x0000000000000000000000000000000000000000000000000000000000000005" - } - ], - "value": 0 - }, - { - "accessor": "0x1804c8AB1F12E6bbf3894d4083f33e07309d1f38", - "account": "0x19652082F846171168Daf378C4fD3ee85a0D4A60", - "chainInfo": { - "chainId": 31337, - "forkId": 0 - }, - "data": "0xbffa7f0f", - "deployedCode": "0x", - "initialized": true, - "kind": "StaticCall", - "newBalance": 0, - "oldBalance": 0, - "reverted": false, - "storageAccesses": [ - { - "account": "0x19652082F846171168Daf378C4fD3ee85a0D4A60", - "isWrite": false, - "newValue": "0x0000000000000000000000000000000000000000000000000000000000000000", - "previousValue": "0x0000000000000000000000000000000000000000000000000000000000000000", - "reverted": false, - "slot": "0x0000000000000000000000000000000000000000000000000000000000000007" - } - ], - "value": 0 - }, - { - "accessor": "0x1804c8AB1F12E6bbf3894d4083f33e07309d1f38", - "account": "0x19652082F846171168Daf378C4fD3ee85a0D4A60", - "chainInfo": { - "chainId": 31337, - "forkId": 0 - }, - "data": "0xa8e4fb90", - "deployedCode": "0x", - "initialized": true, - "kind": "StaticCall", - "newBalance": 0, - "oldBalance": 0, - "reverted": false, - "storageAccesses": [ - { - "account": "0x19652082F846171168Daf378C4fD3ee85a0D4A60", - "isWrite": false, - "newValue": "0x0000000000000000000000000000000000000000000000000000000000000000", - "previousValue": "0x0000000000000000000000000000000000000000000000000000000000000000", - "reverted": false, - "slot": "0x0000000000000000000000000000000000000000000000000000000000000007" - } - ], - "value": 0 - }, - { - "accessor": "0x1804c8AB1F12E6bbf3894d4083f33e07309d1f38", - "account": "0x19652082F846171168Daf378C4fD3ee85a0D4A60", - "chainInfo": { - "chainId": 31337, - "forkId": 0 - }, - "data": "0x6b4d98dd", - "deployedCode": "0x", - "initialized": true, - "kind": "StaticCall", - "newBalance": 0, - "oldBalance": 0, - "reverted": false, - "storageAccesses": [ - { - "account": "0x19652082F846171168Daf378C4fD3ee85a0D4A60", - "isWrite": false, - "newValue": "0x0000000000000000000000000000000000000000000000000000000000000000", - "previousValue": "0x0000000000000000000000000000000000000000000000000000000000000000", - "reverted": false, - "slot": "0x0000000000000000000000000000000000000000000000000000000000000006" - } - ], - "value": 0 - }, - { - "accessor": "0x1804c8AB1F12E6bbf3894d4083f33e07309d1f38", - "account": "0x19652082F846171168Daf378C4fD3ee85a0D4A60", - "chainInfo": { - "chainId": 31337, - "forkId": 0 - }, - "data": "0x534db0e2", - "deployedCode": "0x", - "initialized": true, - "kind": "StaticCall", - "newBalance": 0, - "oldBalance": 0, - "reverted": false, - "storageAccesses": [ - { - "account": "0x19652082F846171168Daf378C4fD3ee85a0D4A60", - "isWrite": false, - "newValue": "0x0000000000000000000000000000000000000000000000000000000000000000", - "previousValue": "0x0000000000000000000000000000000000000000000000000000000000000000", - "reverted": false, - "slot": "0x0000000000000000000000000000000000000000000000000000000000000006" - } - ], - "value": 0 - }, - { - "accessor": "0x1804c8AB1F12E6bbf3894d4083f33e07309d1f38", - "account": "0x19652082F846171168Daf378C4fD3ee85a0D4A60", - "chainInfo": { - "chainId": 31337, - "forkId": 0 - }, - "data": "0xf4daa291", - "deployedCode": "0x", - "initialized": true, - "kind": "StaticCall", - "newBalance": 0, - "oldBalance": 0, - "reverted": false, - "storageAccesses": [ - { - "account": "0x19652082F846171168Daf378C4fD3ee85a0D4A60", - "isWrite": false, - "newValue": "0x0000000000000000000000000000000000000000000000000000000000000000", - "previousValue": "0x0000000000000000000000000000000000000000000000000000000000000000", - "reverted": false, - "slot": "0x0000000000000000000000000000000000000000000000000000000000000008" - } - ], - "value": 0 - }, - { - "accessor": "0x1804c8AB1F12E6bbf3894d4083f33e07309d1f38", - "account": "0x19652082F846171168Daf378C4fD3ee85a0D4A60", - "chainInfo": { - "chainId": 31337, - "forkId": 0 - }, - "data": "0xce5db8d6", - "deployedCode": "0x", - "initialized": true, - "kind": "StaticCall", - "newBalance": 0, - "oldBalance": 0, - "reverted": false, - "storageAccesses": [ - { - "account": "0x19652082F846171168Daf378C4fD3ee85a0D4A60", - "isWrite": false, - "newValue": "0x0000000000000000000000000000000000000000000000000000000000000000", - "previousValue": "0x0000000000000000000000000000000000000000000000000000000000000000", - "reverted": false, - "slot": "0x0000000000000000000000000000000000000000000000000000000000000008" - } - ], - "value": 0 - }, - { - "accessor": "0x1804c8AB1F12E6bbf3894d4083f33e07309d1f38", - "account": "0x19652082F846171168Daf378C4fD3ee85a0D4A60", - "chainInfo": { - "chainId": 31337, - "forkId": 0 - }, - "data": "0x70872aa5", - "deployedCode": "0x", - "initialized": true, - "kind": "StaticCall", - "newBalance": 0, - "oldBalance": 0, - "reverted": false, - "storageAccesses": [ - { - "account": "0x19652082F846171168Daf378C4fD3ee85a0D4A60", - "isWrite": false, - "newValue": "0x0000000000000000000000000000000000000000000000000000000000000000", - "previousValue": "0x0000000000000000000000000000000000000000000000000000000000000000", - "reverted": false, - "slot": "0x0000000000000000000000000000000000000000000000000000000000000001" - } - ], - "value": 0 - }, - { - "accessor": "0x1804c8AB1F12E6bbf3894d4083f33e07309d1f38", - "account": "0x19652082F846171168Daf378C4fD3ee85a0D4A60", - "chainInfo": { - "chainId": 31337, - "forkId": 0 - }, - "data": "0x88786272", - "deployedCode": "0x", - "initialized": true, - "kind": "StaticCall", - "newBalance": 0, - "oldBalance": 0, - "reverted": false, - "storageAccesses": [ - { - "account": "0x19652082F846171168Daf378C4fD3ee85a0D4A60", - "isWrite": false, - "newValue": "0x0000000000000000000000000000000000000000000000000000000000000000", - "previousValue": "0x0000000000000000000000000000000000000000000000000000000000000000", - "reverted": false, - "slot": "0x0000000000000000000000000000000000000000000000000000000000000002" - } - ], - "value": 0 - }, - { - "accessor": "0x7FA9385bE102ac3EAc297483Dd6233D62b3e1496", - "account": "0x7109709ECfa91a80626fF3989D68f67F5b1DD12D", - "chainInfo": { - "chainId": 31337, - "forkId": 0 - }, - "data": "0x", - "deployedCode": "0x", - "initialized": true, - "kind": "Resume", - "newBalance": 0, - "oldBalance": 0, - "reverted": false, - "storageAccesses": [], - "value": 0 - }, - { - "accessor": "0x7FA9385bE102ac3EAc297483Dd6233D62b3e1496", - "account": "0x7109709ECfa91a80626fF3989D68f67F5b1DD12D", - "chainInfo": { - "chainId": 31337, - "forkId": 0 - }, - "data": "0x", - "deployedCode": "0x", - "initialized": true, - "kind": "Resume", - "newBalance": 0, - "oldBalance": 0, - "reverted": false, - "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": "0x809abd1c13738dE7a76C85839779FCaa59FA32CE", - "chainInfo": { - "chainId": 31337, - "forkId": 0 - }, - "data": "0x60806040523480156200001157600080fd5b50620000496200003260016000805160206200398783398151915262001141565b60001b600019620000d160201b62000f441760201c565b6040805160c080820183526001808352602080840182905260028486015260006060808601829052608080870183905260a0808801849052885160e081018a528481529485018490529784018390529083018290528201819052948101859052918201849052620000cb9361dead9390928392839290918391908290620000d5565b6200136a565b9055565b600054610100900460ff1615808015620000f65750600054600160ff909116105b806200012657506200011330620004e660201b62000f481760201c565b15801562000126575060005460ff166001145b6200018f5760405162461bcd60e51b815260206004820152602e60248201527f496e697469616c697a61626c653a20636f6e747261637420697320616c72656160448201526d191e481a5b9a5d1a585b1a5e995960921b60648201526084015b60405180910390fd5b6000805460ff191660011790558015620001b3576000805461ff0019166101001790555b620001bd620004f5565b620001c88a6200055d565b620001d387620005dc565b620001df89896200062e565b620001ea8662000692565b620002217f65a7ed542fb37fe237fdfbdd70b31598523fe5b32879e307bae27a0bd9581c0886620000d160201b62000f441760201c565b620002676200025260017f71ac12829d66ee73d8d95bff50b3589745ce57edae70a3fb111a2342464dc59862001141565b60001b84620000d160201b62000f441760201c565b620002b16200029860017f383f291819e6d54073bc9a648251d97421076bdd101933c0c022219ce958063762001141565b60001b8360000151620000d160201b62000f441760201c565b620002fb620002e260017f46adcbebc6be8ce551740c29c47c8798210f23f7f4086c41752944352568d5a862001141565b60001b8360200151620000d160201b62000f441760201c565b620003456200032c60017f9904ba90dde5696cda05c9e0dab5cbaa0fea005ace4d11218a02ac668dad637762001141565b60001b8360400151620000d160201b62000f441760201c565b6200038f6200037660017f52322a25d9f59ea17656545543306b7aef62bc0cc53a0e65ccfa0c75b97aa90762001141565b60001b8360600151620000d160201b62000f441760201c565b620003c8620003af60016000805160206200396783398151915262001141565b60001b8360800151620000d160201b62000f441760201c565b62000412620003f960017fa04c5bb938ca6fc46d95553abf0a76345ce3e722a30bf4f74928b8e7d852320d62001141565b60001b8360a00151620000d160201b62000f441760201c565b6200041c6200072f565b60c08201516200042c90620007a0565b620004378462000a29565b6200044162000d6d565b6001600160401b0316866001600160401b03161015620004935760405162461bcd60e51b815260206004820152601f602482015260008051602062003907833981519152604482015260640162000186565b8015620004da576000805461ff0019169055604051600181527f7f26b83ff96e1f2b6a682f133852f6798a09c465da95921460cefb38474024989060200160405180910390a15b50505050505050505050565b6001600160a01b03163b151590565b600054610100900460ff16620005515760405162461bcd60e51b815260206004820152602b60248201526000805160206200394783398151915260448201526a6e697469616c697a696e6760a81b606482015260840162000186565b6200055b62000d9a565b565b6200056762000e01565b6001600160a01b038116620005ce5760405162461bcd60e51b815260206004820152602660248201527f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160448201526564647265737360d01b606482015260840162000186565b620005d98162000e5d565b50565b60678190556040805160208082018490528251808303909101815290820190915260005b600060008051602062003927833981519152836040516200062291906200118a565b60405180910390a35050565b60658290556066819055604080516020810184905290810182905260009060600160408051601f1981840301815291905290506001600060008051602062003927833981519152836040516200068591906200118a565b60405180910390a3505050565b6200069c62000d6d565b6001600160401b0316816001600160401b03161015620006ee5760405162461bcd60e51b815260206004820152601f602482015260008051602062003907833981519152604482015260640162000186565b606880546001600160401b0319166001600160401b038316908117909155604080516020808201939093528151808203909301835281019052600262000600565b620007636200074f60016000805160206200398783398151915262001141565b60001b62000eaf60201b620006d71760201c565b6000036200055b576200055b6200078b60016000805160206200398783398151915262001141565b60001b43620000d160201b62000f441760201c565b6001600160a01b03811615801590620007d657506001600160a01b03811673eeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeee14155b8015620007ea5750620007e862000eb3565b155b15620005d957601260ff16816001600160a01b031663313ce5676040518163ffffffff1660e01b8152600401602060405180830381865afa15801562000834573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906200085a9190620011bf565b60ff1614620008c35760405162461bcd60e51b815260206004820152602e60248201527f53797374656d436f6e6669673a2062616420646563696d616c73206f6620676160448201526d39903830bcb4b733903a37b5b2b760911b606482015260840162000186565b600062000943826001600160a01b03166306fdde036040518163ffffffff1660e01b8152600401600060405180830381865afa15801562000908573d6000803e3d6000fd5b505050506040513d6000823e601f3d908101601f1916820160405262000932919081019062001201565b62000ee760201b62000f641760201c565b905060006200098a836001600160a01b03166395d89b416040518163ffffffff1660e01b8152600401600060405180830381865afa15801562000908573d6000803e3d6000fd5b9050620009a6836012848462000f7f60201b620010071760201c565b620009b06200105b565b6040516371cfaa3f60e01b81526001600160a01b03858116600483015260126024830152604482018590526064820184905291909116906371cfaa3f90608401600060405180830381600087803b15801562000a0b57600080fd5b505af115801562000a20573d6000803e3d6000fd5b50505050505050565b8060a001516001600160801b0316816060015163ffffffff16111562000ab85760405162461bcd60e51b815260206004820152603560248201527f53797374656d436f6e6669673a206d696e206261736520666565206d7573742060448201527f6265206c657373207468616e206d617820626173650000000000000000000000606482015260840162000186565b6001816040015160ff161162000b295760405162461bcd60e51b815260206004820152602f60248201527f53797374656d436f6e6669673a2064656e6f6d696e61746f72206d757374206260448201526e65206c6172676572207468616e203160881b606482015260840162000186565b606854608082015182516001600160401b039092169162000b4b9190620012b9565b63ffffffff16111562000b905760405162461bcd60e51b815260206004820152601f602482015260008051602062003907833981519152604482015260640162000186565b6000816020015160ff161162000c015760405162461bcd60e51b815260206004820152602f60248201527f53797374656d436f6e6669673a20656c6173746963697479206d756c7469706c60448201526e06965722063616e6e6f74206265203608c1b606482015260840162000186565b8051602082015163ffffffff82169160ff9091169062000c23908290620012e4565b62000c2f919062001316565b63ffffffff161462000caa5760405162461bcd60e51b815260206004820152603760248201527f53797374656d436f6e6669673a20707265636973696f6e206c6f73732077697460448201527f6820746172676574207265736f75726365206c696d6974000000000000000000606482015260840162000186565b805160698054602084015160408501516060860151608087015160a09097015163ffffffff96871664ffffffffff199095169490941764010000000060ff948516021764ffffffffff60281b191665010000000000939092169290920263ffffffff60301b19161766010000000000009185169190910217600160501b600160f01b0319166a01000000000000000000009390941692909202600160701b600160f01b03191692909217600160701b6001600160801b0390921691909102179055565b60695460009062000d959063ffffffff6a010000000000000000000082048116911662001345565b905090565b600054610100900460ff1662000df65760405162461bcd60e51b815260206004820152602b60248201526000805160206200394783398151915260448201526a6e697469616c697a696e6760a81b606482015260840162000186565b6200055b3362000e5d565b6033546001600160a01b031633146200055b5760405162461bcd60e51b815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572604482015260640162000186565b603380546001600160a01b038381166001600160a01b0319831681179093556040519116919082907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e090600090a35050565b5490565b60008062000ec06200107d565b506001600160a01b031673eeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeee141592915050565b600060208251111562000f635760405162461bcd60e51b815260206004820152603660248201527f476173506179696e67546f6b656e3a20737472696e672063616e6e6f7420626560448201527f2067726561746572207468616e20333220627974657300000000000000000000606482015260840162000186565b62000f79826200109e60201b620010d91760201c565b92915050565b62000fc962000f9f6001600080516020620038e783398151915262001141565b60001b856001600160a01b031660a08660ff16901b1760001b620000d160201b62000f441760201c565b6200100f62000ffa60017f657c3582c29b3176614e3a33ddd1ec48352696a04e92b3c0566d72010fa8863d62001141565b60001b83620000d160201b62000f441760201c565b620010556200104060017fa48b38a4b44951360fbdcbfaaeae5ed6ae92585412e9841b70ec72ed8cd0576462001141565b60001b82620000d160201b62000f441760201c565b50505050565b600062000d956200074f60016000805160206200396783398151915262001141565b60008062001095620010c860201b620011021760201c565b90939092509050565b805160218110620010b75763ec92f9a36000526004601cfd5b9081015160209190910360031b1b90565b60008080620010ec6200074f6001600080516020620038e783398151915262001141565b6001600160a01b03811693509050826200111f575073eeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeee92601292509050565b60a081901c9150509091565b634e487b7160e01b600052601160045260246000fd5b6000828210156200115657620011566200112b565b500390565b60005b83811015620011785781810151838201526020016200115e565b83811115620010555750506000910152565b6020815260008251806020840152620011ab8160408501602087016200115b565b601f01601f19169190910160400192915050565b600060208284031215620011d257600080fd5b815160ff81168114620011e457600080fd5b9392505050565b634e487b7160e01b600052604160045260246000fd5b6000602082840312156200121457600080fd5b81516001600160401b03808211156200122c57600080fd5b818401915084601f8301126200124157600080fd5b815181811115620012565762001256620011eb565b604051601f8201601f19908116603f01168101908382118183101715620012815762001281620011eb565b816040528281528760208487010111156200129b57600080fd5b620012ae8360208301602088016200115b565b979650505050505050565b600063ffffffff808316818516808303821115620012db57620012db6200112b565b01949350505050565b600063ffffffff808416806200130a57634e487b7160e01b600052601260045260246000fd5b92169190910492915050565b600063ffffffff808316818516818304811182151516156200133c576200133c6200112b565b02949350505050565b60006001600160401b03828116848216808303821115620012db57620012db6200112b565b61256d806200137a6000396000f3fe608060405234801561001057600080fd5b50600436106102ad5760003560e01c80639b7d7f0a1161017b578063e0e2016d116100d8578063f45e65d81161008c578063f8c68de011610071578063f8c68de014610661578063fd32aa0f14610669578063ffa1ad741461067157600080fd5b8063f45e65d814610644578063f68016b71461064d57600080fd5b8063e81b2c6d116100bd578063e81b2c6d14610620578063f2b4e61714610629578063f2fde38b1461063157600080fd5b8063e0e2016d14610610578063e2a3285c1461061857600080fd5b8063c71973f61161012f578063cc731b0211610114578063cc731b02146104cc578063d844471514610600578063dac6e63a1461060857600080fd5b8063c71973f6146104a6578063c9b26f61146104b957600080fd5b8063b40a817c11610160578063b40a817c14610483578063bc49ce5f14610496578063c4e8ddfa1461049e57600080fd5b80639b7d7f0a14610473578063a71198691461047b57600080fd5b806348cd4cb111610229578063550fcdc9116101dd578063715018a6116101c2578063715018a61461043a5780638da5cb5b14610442578063935f029e1461046057600080fd5b8063550fcdc91461042a5780635d73369c1461043257600080fd5b80634c1e843d1161020e5780634c1e843d146103a75780634f16540b146103ba57806354fd4d50146103e157600080fd5b806348cd4cb11461037e5780634add321d1461038657600080fd5b806318d13918116102805780631fd19ee1116102655780631fd19ee11461032857806321326849146103305780634397dfef1461034857600080fd5b806318d139181461030b57806319f5cea81461032057600080fd5b806306c92657146102b2578063078f29cf146102cd5780630a49cb03146102fa5780630c18c16214610302575b600080fd5b6102ba610679565b6040519081526020015b60405180910390f35b6102d56106a7565b60405173ffffffffffffffffffffffffffffffffffffffff90911681526020016102c4565b6102d56106e0565b6102ba60655481565b61031e610319366004611fc4565b610710565b005b6102ba610724565b6102d561074f565b610338610779565b60405190151581526020016102c4565b6103506107b8565b6040805173ffffffffffffffffffffffffffffffffffffffff909316835260ff9091166020830152016102c4565b6102ba6107cc565b61038e6107fc565b60405167ffffffffffffffff90911681526020016102c4565b61031e6103b5366004612137565b610822565b6102ba7f65a7ed542fb37fe237fdfbdd70b31598523fe5b32879e307bae27a0bd9581c0881565b61041d6040518060400160405280600581526020017f322e312e3000000000000000000000000000000000000000000000000000000081525081565b6040516102c491906122ec565b61041d610c2d565b6102ba610c37565b61031e610c62565b60335473ffffffffffffffffffffffffffffffffffffffff166102d5565b61031e61046e3660046122ff565b610c76565b6102d5610c8c565b6102d5610cbc565b61031e610491366004612321565b610cec565b6102ba610cfd565b6102d5610d28565b61031e6104b436600461233c565b610d58565b61031e6104c7366004612358565b610d69565b6105906040805160c081018252600080825260208201819052918101829052606081018290526080810182905260a0810191909152506040805160c08101825260695463ffffffff8082168352640100000000820460ff9081166020850152650100000000008304169383019390935266010000000000008104831660608301526a0100000000000000000000810490921660808201526e0100000000000000000000000000009091046fffffffffffffffffffffffffffffffff1660a082015290565b6040516102c49190600060c08201905063ffffffff80845116835260ff602085015116602084015260ff6040850151166040840152806060850151166060840152806080850151166080840152506fffffffffffffffffffffffffffffffff60a08401511660a083015292915050565b61041d610d7a565b6102d5610d84565b6102ba610db4565b6102ba610ddf565b6102ba60675481565b6102d5610e0a565b61031e61063f366004611fc4565b610e3a565b6102ba60665481565b60685461038e9067ffffffffffffffff1681565b6102ba610eee565b6102ba610f19565b6102ba600081565b6106a460017fa04c5bb938ca6fc46d95553abf0a76345ce3e722a30bf4f74928b8e7d852320d6123a0565b81565b60006106db6106d760017f9904ba90dde5696cda05c9e0dab5cbaa0fea005ace4d11218a02ac668dad63776123a0565b5490565b905090565b60006106db6106d760017f4b6c74f9e688cb39801f2112c14a8c57232a3fc5202e1444126d4bce86eb19ad6123a0565b61071861117f565b61072181611200565b50565b6106a460017f46adcbebc6be8ce551740c29c47c8798210f23f7f4086c41752944352568d5a86123a0565b60006106db7f65a7ed542fb37fe237fdfbdd70b31598523fe5b32879e307bae27a0bd9581c085490565b6000806107846107b8565b5073ffffffffffffffffffffffffffffffffffffffff1673eeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeee141592915050565b6000806107c3611102565b90939092509050565b60006106db6106d760017fa11ee3ab75b40e88a0105e935d17cd36c8faee0138320d776c411291bdbbb1a06123a0565b6069546000906106db9063ffffffff6a01000000000000000000008204811691166123b7565b600054610100900460ff16158080156108425750600054600160ff909116105b8061085c5750303b15801561085c575060005460ff166001145b6108ed576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602e60248201527f496e697469616c697a61626c653a20636f6e747261637420697320616c72656160448201527f647920696e697469616c697a656400000000000000000000000000000000000060648201526084015b60405180910390fd5b600080547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00166001179055801561094b57600080547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00ff166101001790555b6109536112bd565b61095c8a610e3a565b6109658761135c565b61096f8989611384565b61097886611415565b6109a17f65a7ed542fb37fe237fdfbdd70b31598523fe5b32879e307bae27a0bd9581c08869055565b6109d46109cf60017f71ac12829d66ee73d8d95bff50b3589745ce57edae70a3fb111a2342464dc5986123a0565b849055565b610a08610a0260017f383f291819e6d54073bc9a648251d97421076bdd101933c0c022219ce95806376123a0565b83519055565b610a3f610a3660017f46adcbebc6be8ce551740c29c47c8798210f23f7f4086c41752944352568d5a86123a0565b60208401519055565b610a76610a6d60017f9904ba90dde5696cda05c9e0dab5cbaa0fea005ace4d11218a02ac668dad63776123a0565b60408401519055565b610aad610aa460017f52322a25d9f59ea17656545543306b7aef62bc0cc53a0e65ccfa0c75b97aa9076123a0565b60608401519055565b610ae4610adb60017f4b6c74f9e688cb39801f2112c14a8c57232a3fc5202e1444126d4bce86eb19ad6123a0565b60808401519055565b610b1b610b1260017fa04c5bb938ca6fc46d95553abf0a76345ce3e722a30bf4f74928b8e7d852320d6123a0565b60a08401519055565b610b236114f3565b610b308260c0015161155b565b610b3984611865565b610b416107fc565b67ffffffffffffffff168667ffffffffffffffff161015610bbe576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601f60248201527f53797374656d436f6e6669673a20676173206c696d697420746f6f206c6f770060448201526064016108e4565b8015610c2157600080547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00ff169055604051600181527f7f26b83ff96e1f2b6a682f133852f6798a09c465da95921460cefb38474024989060200160405180910390a15b50505050505050505050565b60606106db611cd9565b6106a460017f383f291819e6d54073bc9a648251d97421076bdd101933c0c022219ce95806376123a0565b610c6a61117f565b610c746000611d9a565b565b610c7e61117f565b610c888282611384565b5050565b60006106db6106d760017fa04c5bb938ca6fc46d95553abf0a76345ce3e722a30bf4f74928b8e7d852320d6123a0565b60006106db6106d760017f383f291819e6d54073bc9a648251d97421076bdd101933c0c022219ce95806376123a0565b610cf461117f565b61072181611415565b6106a460017f71ac12829d66ee73d8d95bff50b3589745ce57edae70a3fb111a2342464dc5986123a0565b60006106db6106d760017f46adcbebc6be8ce551740c29c47c8798210f23f7f4086c41752944352568d5a86123a0565b610d6061117f565b61072181611865565b610d7161117f565b6107218161135c565b60606106db611e11565b60006106db6106d760017f71ac12829d66ee73d8d95bff50b3589745ce57edae70a3fb111a2342464dc5986123a0565b6106a460017fa11ee3ab75b40e88a0105e935d17cd36c8faee0138320d776c411291bdbbb1a06123a0565b6106a460017f52322a25d9f59ea17656545543306b7aef62bc0cc53a0e65ccfa0c75b97aa9076123a0565b60006106db6106d760017f52322a25d9f59ea17656545543306b7aef62bc0cc53a0e65ccfa0c75b97aa9076123a0565b610e4261117f565b73ffffffffffffffffffffffffffffffffffffffff8116610ee5576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602660248201527f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160448201527f646472657373000000000000000000000000000000000000000000000000000060648201526084016108e4565b61072181611d9a565b6106a460017f9904ba90dde5696cda05c9e0dab5cbaa0fea005ace4d11218a02ac668dad63776123a0565b6106a460017f4b6c74f9e688cb39801f2112c14a8c57232a3fc5202e1444126d4bce86eb19ad6123a0565b9055565b73ffffffffffffffffffffffffffffffffffffffff163b151590565b6000602082511115610ff8576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152603660248201527f476173506179696e67546f6b656e3a20737472696e672063616e6e6f7420626560448201527f2067726561746572207468616e2033322062797465730000000000000000000060648201526084016108e4565b611001826110d9565b92915050565b61106d61103560017f04adb1412b2ddc16fcc0d4538d5c8f07cf9c83abecc6b41f6f69037b708fbcec6123a0565b74ff000000000000000000000000000000000000000060a086901b1673ffffffffffffffffffffffffffffffffffffffff8716179055565b6110a061109b60017f657c3582c29b3176614e3a33ddd1ec48352696a04e92b3c0566d72010fa8863d6123a0565b839055565b6110d36110ce60017fa48b38a4b44951360fbdcbfaaeae5ed6ae92585412e9841b70ec72ed8cd057646123a0565b829055565b50505050565b8051602181106110f15763ec92f9a36000526004601cfd5b9081015160209190910360031b1b90565b600080806111346106d760017f04adb1412b2ddc16fcc0d4538d5c8f07cf9c83abecc6b41f6f69037b708fbcec6123a0565b73ffffffffffffffffffffffffffffffffffffffff81169350905082611173575073eeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeee92601292509050565b60a081901c9150509091565b60335473ffffffffffffffffffffffffffffffffffffffff163314610c74576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e657260448201526064016108e4565b6112297f65a7ed542fb37fe237fdfbdd70b31598523fe5b32879e307bae27a0bd9581c08829055565b6040805173ffffffffffffffffffffffffffffffffffffffff8316602082015260009101604080517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0818403018152919052905060035b60007f1d2b0bda21d56b8bd12d4f94ebacffdfb35f5e226f84b461103bb8beab6353be836040516112b191906122ec565b60405180910390a35050565b600054610100900460ff16611354576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602b60248201527f496e697469616c697a61626c653a20636f6e7472616374206973206e6f74206960448201527f6e697469616c697a696e6700000000000000000000000000000000000000000060648201526084016108e4565b610c74611ec7565b6067819055604080516020808201849052825180830390910181529082019091526000611280565b606582905560668190556040805160208101849052908101829052600090606001604080517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe08184030181529190529050600160007f1d2b0bda21d56b8bd12d4f94ebacffdfb35f5e226f84b461103bb8beab6353be8360405161140891906122ec565b60405180910390a3505050565b61141d6107fc565b67ffffffffffffffff168167ffffffffffffffff16101561149a576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601f60248201527f53797374656d436f6e6669673a20676173206c696d697420746f6f206c6f770060448201526064016108e4565b606880547fffffffffffffffffffffffffffffffffffffffffffffffff00000000000000001667ffffffffffffffff83169081179091556040805160208082019390935281518082039093018352810190526002611280565b6115216106d760017fa11ee3ab75b40e88a0105e935d17cd36c8faee0138320d776c411291bdbbb1a06123a0565b600003610c7457610c7461155660017fa11ee3ab75b40e88a0105e935d17cd36c8faee0138320d776c411291bdbbb1a06123a0565b439055565b73ffffffffffffffffffffffffffffffffffffffff8116158015906115aa575073ffffffffffffffffffffffffffffffffffffffff811673eeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeee14155b80156115bb57506115b9610779565b155b1561072157601260ff168173ffffffffffffffffffffffffffffffffffffffff1663313ce5676040518163ffffffff1660e01b8152600401602060405180830381865afa158015611610573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061163491906123e3565b60ff16146116c4576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602e60248201527f53797374656d436f6e6669673a2062616420646563696d616c73206f6620676160448201527f7320706179696e6720746f6b656e00000000000000000000000000000000000060648201526084016108e4565b600061175f8273ffffffffffffffffffffffffffffffffffffffff166306fdde036040518163ffffffff1660e01b8152600401600060405180830381865afa158015611714573d6000803e3d6000fd5b505050506040513d6000823e601f3d9081017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe016820160405261175a9190810190612400565b610f64565b905060006117b18373ffffffffffffffffffffffffffffffffffffffff166395d89b416040518163ffffffff1660e01b8152600401600060405180830381865afa158015611714573d6000803e3d6000fd5b90506117c08360128484611007565b6117c86106e0565b6040517f71cfaa3f00000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff858116600483015260126024830152604482018590526064820184905291909116906371cfaa3f90608401600060405180830381600087803b15801561184857600080fd5b505af115801561185c573d6000803e3d6000fd5b50505050505050565b8060a001516fffffffffffffffffffffffffffffffff16816060015163ffffffff161115611915576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152603560248201527f53797374656d436f6e6669673a206d696e206261736520666565206d7573742060448201527f6265206c657373207468616e206d61782062617365000000000000000000000060648201526084016108e4565b6001816040015160ff16116119ac576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602f60248201527f53797374656d436f6e6669673a2064656e6f6d696e61746f72206d757374206260448201527f65206c6172676572207468616e2031000000000000000000000000000000000060648201526084016108e4565b6068546080820151825167ffffffffffffffff909216916119cd91906124cb565b63ffffffff161115611a3b576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601f60248201527f53797374656d436f6e6669673a20676173206c696d697420746f6f206c6f770060448201526064016108e4565b6000816020015160ff1611611ad2576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602f60248201527f53797374656d436f6e6669673a20656c6173746963697479206d756c7469706c60448201527f6965722063616e6e6f742062652030000000000000000000000000000000000060648201526084016108e4565b8051602082015163ffffffff82169160ff90911690611af29082906124ea565b611afc9190612534565b63ffffffff1614611b8f576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152603760248201527f53797374656d436f6e6669673a20707265636973696f6e206c6f73732077697460448201527f6820746172676574207265736f75726365206c696d697400000000000000000060648201526084016108e4565b805160698054602084015160408501516060860151608087015160a09097015163ffffffff9687167fffffffffffffffffffffffffffffffffffffffffffffffffffffff00000000009095169490941764010000000060ff94851602177fffffffffffffffffffffffffffffffffffffffffffff0000000000ffffffffff166501000000000093909216929092027fffffffffffffffffffffffffffffffffffffffffffff00000000ffffffffffff1617660100000000000091851691909102177fffff0000000000000000000000000000000000000000ffffffffffffffffffff166a010000000000000000000093909416929092027fffff00000000000000000000000000000000ffffffffffffffffffffffffffff16929092176e0100000000000000000000000000006fffffffffffffffffffffffffffffffff90921691909102179055565b60606000611ce5611102565b5090507fffffffffffffffffffffffff111111111111111111111111111111111111111273ffffffffffffffffffffffffffffffffffffffff821601611d5e57505060408051808201909152600381527f4554480000000000000000000000000000000000000000000000000000000000602082015290565b611d94611d8f6106d760017fa48b38a4b44951360fbdcbfaaeae5ed6ae92585412e9841b70ec72ed8cd057646123a0565b611f67565b91505090565b6033805473ffffffffffffffffffffffffffffffffffffffff8381167fffffffffffffffffffffffff0000000000000000000000000000000000000000831681179093556040519116919082907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e090600090a35050565b60606000611e1d611102565b5090507fffffffffffffffffffffffff111111111111111111111111111111111111111273ffffffffffffffffffffffffffffffffffffffff821601611e9657505060408051808201909152600581527f4574686572000000000000000000000000000000000000000000000000000000602082015290565b611d94611d8f6106d760017f657c3582c29b3176614e3a33ddd1ec48352696a04e92b3c0566d72010fa8863d6123a0565b600054610100900460ff16611f5e576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602b60248201527f496e697469616c697a61626c653a20636f6e7472616374206973206e6f74206960448201527f6e697469616c697a696e6700000000000000000000000000000000000000000060648201526084016108e4565b610c7433611d9a565b60405160005b82811a15611f7d57600101611f6d565b80825260208201838152600082820152505060408101604052919050565b803573ffffffffffffffffffffffffffffffffffffffff81168114611fbf57600080fd5b919050565b600060208284031215611fd657600080fd5b611fdf82611f9b565b9392505050565b803567ffffffffffffffff81168114611fbf57600080fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b60405160e0810167ffffffffffffffff8111828210171561205057612050611ffe565b60405290565b803563ffffffff81168114611fbf57600080fd5b60ff8116811461072157600080fd5b600060c0828403121561208b57600080fd5b60405160c0810181811067ffffffffffffffff821117156120ae576120ae611ffe565b6040529050806120bd83612056565b815260208301356120cd8161206a565b602082015260408301356120e08161206a565b60408201526120f160608401612056565b606082015261210260808401612056565b608082015260a08301356fffffffffffffffffffffffffffffffff8116811461212a57600080fd5b60a0919091015292915050565b6000806000806000806000806000898b0361028081121561215757600080fd5b6121608b611f9b565b995060208b0135985060408b0135975060608b0135965061218360808c01611fe6565b955061219160a08c01611f9b565b94506121a08c60c08d01612079565b93506121af6101808c01611f9b565b925060e07ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe60820112156121e157600080fd5b506121ea61202d565b6121f76101a08c01611f9b565b81526122066101c08c01611f9b565b60208201526122186101e08c01611f9b565b604082015261222a6102008c01611f9b565b606082015261223c6102208c01611f9b565b608082015261224e6102408c01611f9b565b60a08201526122606102608c01611f9b565b60c0820152809150509295985092959850929598565b60005b83811015612291578181015183820152602001612279565b838111156110d35750506000910152565b600081518084526122ba816020860160208601612276565b601f017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0169290920160200192915050565b602081526000611fdf60208301846122a2565b6000806040838503121561231257600080fd5b50508035926020909101359150565b60006020828403121561233357600080fd5b611fdf82611fe6565b600060c0828403121561234e57600080fd5b611fdf8383612079565b60006020828403121561236a57600080fd5b5035919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b6000828210156123b2576123b2612371565b500390565b600067ffffffffffffffff8083168185168083038211156123da576123da612371565b01949350505050565b6000602082840312156123f557600080fd5b8151611fdf8161206a565b60006020828403121561241257600080fd5b815167ffffffffffffffff8082111561242a57600080fd5b818401915084601f83011261243e57600080fd5b81518181111561245057612450611ffe565b604051601f82017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0908116603f0116810190838211818310171561249657612496611ffe565b816040528281528760208487010111156124af57600080fd5b6124c0836020830160208801612276565b979650505050505050565b600063ffffffff8083168185168083038211156123da576123da612371565b600063ffffffff80841680612528577f4e487b7100000000000000000000000000000000000000000000000000000000600052601260045260246000fd5b92169190910492915050565b600063ffffffff8083168185168183048111821515161561255757612557612371565b0294935050505056fea164736f6c634300080f000a04adb1412b2ddc16fcc0d4538d5c8f07cf9c83abecc6b41f6f69037b708fbcec53797374656d436f6e6669673a20676173206c696d697420746f6f206c6f77001d2b0bda21d56b8bd12d4f94ebacffdfb35f5e226f84b461103bb8beab6353be496e697469616c697a61626c653a20636f6e7472616374206973206e6f7420694b6c74f9e688cb39801f2112c14a8c57232a3fc5202e1444126d4bce86eb19ada11ee3ab75b40e88a0105e935d17cd36c8faee0138320d776c411291bdbbb1a0", - "deployedCode": "0x608060405234801561001057600080fd5b50600436106102ad5760003560e01c80639b7d7f0a1161017b578063e0e2016d116100d8578063f45e65d81161008c578063f8c68de011610071578063f8c68de014610661578063fd32aa0f14610669578063ffa1ad741461067157600080fd5b8063f45e65d814610644578063f68016b71461064d57600080fd5b8063e81b2c6d116100bd578063e81b2c6d14610620578063f2b4e61714610629578063f2fde38b1461063157600080fd5b8063e0e2016d14610610578063e2a3285c1461061857600080fd5b8063c71973f61161012f578063cc731b0211610114578063cc731b02146104cc578063d844471514610600578063dac6e63a1461060857600080fd5b8063c71973f6146104a6578063c9b26f61146104b957600080fd5b8063b40a817c11610160578063b40a817c14610483578063bc49ce5f14610496578063c4e8ddfa1461049e57600080fd5b80639b7d7f0a14610473578063a71198691461047b57600080fd5b806348cd4cb111610229578063550fcdc9116101dd578063715018a6116101c2578063715018a61461043a5780638da5cb5b14610442578063935f029e1461046057600080fd5b8063550fcdc91461042a5780635d73369c1461043257600080fd5b80634c1e843d1161020e5780634c1e843d146103a75780634f16540b146103ba57806354fd4d50146103e157600080fd5b806348cd4cb11461037e5780634add321d1461038657600080fd5b806318d13918116102805780631fd19ee1116102655780631fd19ee11461032857806321326849146103305780634397dfef1461034857600080fd5b806318d139181461030b57806319f5cea81461032057600080fd5b806306c92657146102b2578063078f29cf146102cd5780630a49cb03146102fa5780630c18c16214610302575b600080fd5b6102ba610679565b6040519081526020015b60405180910390f35b6102d56106a7565b60405173ffffffffffffffffffffffffffffffffffffffff90911681526020016102c4565b6102d56106e0565b6102ba60655481565b61031e610319366004611fc4565b610710565b005b6102ba610724565b6102d561074f565b610338610779565b60405190151581526020016102c4565b6103506107b8565b6040805173ffffffffffffffffffffffffffffffffffffffff909316835260ff9091166020830152016102c4565b6102ba6107cc565b61038e6107fc565b60405167ffffffffffffffff90911681526020016102c4565b61031e6103b5366004612137565b610822565b6102ba7f65a7ed542fb37fe237fdfbdd70b31598523fe5b32879e307bae27a0bd9581c0881565b61041d6040518060400160405280600581526020017f322e312e3000000000000000000000000000000000000000000000000000000081525081565b6040516102c491906122ec565b61041d610c2d565b6102ba610c37565b61031e610c62565b60335473ffffffffffffffffffffffffffffffffffffffff166102d5565b61031e61046e3660046122ff565b610c76565b6102d5610c8c565b6102d5610cbc565b61031e610491366004612321565b610cec565b6102ba610cfd565b6102d5610d28565b61031e6104b436600461233c565b610d58565b61031e6104c7366004612358565b610d69565b6105906040805160c081018252600080825260208201819052918101829052606081018290526080810182905260a0810191909152506040805160c08101825260695463ffffffff8082168352640100000000820460ff9081166020850152650100000000008304169383019390935266010000000000008104831660608301526a0100000000000000000000810490921660808201526e0100000000000000000000000000009091046fffffffffffffffffffffffffffffffff1660a082015290565b6040516102c49190600060c08201905063ffffffff80845116835260ff602085015116602084015260ff6040850151166040840152806060850151166060840152806080850151166080840152506fffffffffffffffffffffffffffffffff60a08401511660a083015292915050565b61041d610d7a565b6102d5610d84565b6102ba610db4565b6102ba610ddf565b6102ba60675481565b6102d5610e0a565b61031e61063f366004611fc4565b610e3a565b6102ba60665481565b60685461038e9067ffffffffffffffff1681565b6102ba610eee565b6102ba610f19565b6102ba600081565b6106a460017fa04c5bb938ca6fc46d95553abf0a76345ce3e722a30bf4f74928b8e7d852320d6123a0565b81565b60006106db6106d760017f9904ba90dde5696cda05c9e0dab5cbaa0fea005ace4d11218a02ac668dad63776123a0565b5490565b905090565b60006106db6106d760017f4b6c74f9e688cb39801f2112c14a8c57232a3fc5202e1444126d4bce86eb19ad6123a0565b61071861117f565b61072181611200565b50565b6106a460017f46adcbebc6be8ce551740c29c47c8798210f23f7f4086c41752944352568d5a86123a0565b60006106db7f65a7ed542fb37fe237fdfbdd70b31598523fe5b32879e307bae27a0bd9581c085490565b6000806107846107b8565b5073ffffffffffffffffffffffffffffffffffffffff1673eeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeee141592915050565b6000806107c3611102565b90939092509050565b60006106db6106d760017fa11ee3ab75b40e88a0105e935d17cd36c8faee0138320d776c411291bdbbb1a06123a0565b6069546000906106db9063ffffffff6a01000000000000000000008204811691166123b7565b600054610100900460ff16158080156108425750600054600160ff909116105b8061085c5750303b15801561085c575060005460ff166001145b6108ed576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602e60248201527f496e697469616c697a61626c653a20636f6e747261637420697320616c72656160448201527f647920696e697469616c697a656400000000000000000000000000000000000060648201526084015b60405180910390fd5b600080547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00166001179055801561094b57600080547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00ff166101001790555b6109536112bd565b61095c8a610e3a565b6109658761135c565b61096f8989611384565b61097886611415565b6109a17f65a7ed542fb37fe237fdfbdd70b31598523fe5b32879e307bae27a0bd9581c08869055565b6109d46109cf60017f71ac12829d66ee73d8d95bff50b3589745ce57edae70a3fb111a2342464dc5986123a0565b849055565b610a08610a0260017f383f291819e6d54073bc9a648251d97421076bdd101933c0c022219ce95806376123a0565b83519055565b610a3f610a3660017f46adcbebc6be8ce551740c29c47c8798210f23f7f4086c41752944352568d5a86123a0565b60208401519055565b610a76610a6d60017f9904ba90dde5696cda05c9e0dab5cbaa0fea005ace4d11218a02ac668dad63776123a0565b60408401519055565b610aad610aa460017f52322a25d9f59ea17656545543306b7aef62bc0cc53a0e65ccfa0c75b97aa9076123a0565b60608401519055565b610ae4610adb60017f4b6c74f9e688cb39801f2112c14a8c57232a3fc5202e1444126d4bce86eb19ad6123a0565b60808401519055565b610b1b610b1260017fa04c5bb938ca6fc46d95553abf0a76345ce3e722a30bf4f74928b8e7d852320d6123a0565b60a08401519055565b610b236114f3565b610b308260c0015161155b565b610b3984611865565b610b416107fc565b67ffffffffffffffff168667ffffffffffffffff161015610bbe576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601f60248201527f53797374656d436f6e6669673a20676173206c696d697420746f6f206c6f770060448201526064016108e4565b8015610c2157600080547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00ff169055604051600181527f7f26b83ff96e1f2b6a682f133852f6798a09c465da95921460cefb38474024989060200160405180910390a15b50505050505050505050565b60606106db611cd9565b6106a460017f383f291819e6d54073bc9a648251d97421076bdd101933c0c022219ce95806376123a0565b610c6a61117f565b610c746000611d9a565b565b610c7e61117f565b610c888282611384565b5050565b60006106db6106d760017fa04c5bb938ca6fc46d95553abf0a76345ce3e722a30bf4f74928b8e7d852320d6123a0565b60006106db6106d760017f383f291819e6d54073bc9a648251d97421076bdd101933c0c022219ce95806376123a0565b610cf461117f565b61072181611415565b6106a460017f71ac12829d66ee73d8d95bff50b3589745ce57edae70a3fb111a2342464dc5986123a0565b60006106db6106d760017f46adcbebc6be8ce551740c29c47c8798210f23f7f4086c41752944352568d5a86123a0565b610d6061117f565b61072181611865565b610d7161117f565b6107218161135c565b60606106db611e11565b60006106db6106d760017f71ac12829d66ee73d8d95bff50b3589745ce57edae70a3fb111a2342464dc5986123a0565b6106a460017fa11ee3ab75b40e88a0105e935d17cd36c8faee0138320d776c411291bdbbb1a06123a0565b6106a460017f52322a25d9f59ea17656545543306b7aef62bc0cc53a0e65ccfa0c75b97aa9076123a0565b60006106db6106d760017f52322a25d9f59ea17656545543306b7aef62bc0cc53a0e65ccfa0c75b97aa9076123a0565b610e4261117f565b73ffffffffffffffffffffffffffffffffffffffff8116610ee5576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602660248201527f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160448201527f646472657373000000000000000000000000000000000000000000000000000060648201526084016108e4565b61072181611d9a565b6106a460017f9904ba90dde5696cda05c9e0dab5cbaa0fea005ace4d11218a02ac668dad63776123a0565b6106a460017f4b6c74f9e688cb39801f2112c14a8c57232a3fc5202e1444126d4bce86eb19ad6123a0565b9055565b73ffffffffffffffffffffffffffffffffffffffff163b151590565b6000602082511115610ff8576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152603660248201527f476173506179696e67546f6b656e3a20737472696e672063616e6e6f7420626560448201527f2067726561746572207468616e2033322062797465730000000000000000000060648201526084016108e4565b611001826110d9565b92915050565b61106d61103560017f04adb1412b2ddc16fcc0d4538d5c8f07cf9c83abecc6b41f6f69037b708fbcec6123a0565b74ff000000000000000000000000000000000000000060a086901b1673ffffffffffffffffffffffffffffffffffffffff8716179055565b6110a061109b60017f657c3582c29b3176614e3a33ddd1ec48352696a04e92b3c0566d72010fa8863d6123a0565b839055565b6110d36110ce60017fa48b38a4b44951360fbdcbfaaeae5ed6ae92585412e9841b70ec72ed8cd057646123a0565b829055565b50505050565b8051602181106110f15763ec92f9a36000526004601cfd5b9081015160209190910360031b1b90565b600080806111346106d760017f04adb1412b2ddc16fcc0d4538d5c8f07cf9c83abecc6b41f6f69037b708fbcec6123a0565b73ffffffffffffffffffffffffffffffffffffffff81169350905082611173575073eeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeee92601292509050565b60a081901c9150509091565b60335473ffffffffffffffffffffffffffffffffffffffff163314610c74576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e657260448201526064016108e4565b6112297f65a7ed542fb37fe237fdfbdd70b31598523fe5b32879e307bae27a0bd9581c08829055565b6040805173ffffffffffffffffffffffffffffffffffffffff8316602082015260009101604080517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0818403018152919052905060035b60007f1d2b0bda21d56b8bd12d4f94ebacffdfb35f5e226f84b461103bb8beab6353be836040516112b191906122ec565b60405180910390a35050565b600054610100900460ff16611354576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602b60248201527f496e697469616c697a61626c653a20636f6e7472616374206973206e6f74206960448201527f6e697469616c697a696e6700000000000000000000000000000000000000000060648201526084016108e4565b610c74611ec7565b6067819055604080516020808201849052825180830390910181529082019091526000611280565b606582905560668190556040805160208101849052908101829052600090606001604080517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe08184030181529190529050600160007f1d2b0bda21d56b8bd12d4f94ebacffdfb35f5e226f84b461103bb8beab6353be8360405161140891906122ec565b60405180910390a3505050565b61141d6107fc565b67ffffffffffffffff168167ffffffffffffffff16101561149a576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601f60248201527f53797374656d436f6e6669673a20676173206c696d697420746f6f206c6f770060448201526064016108e4565b606880547fffffffffffffffffffffffffffffffffffffffffffffffff00000000000000001667ffffffffffffffff83169081179091556040805160208082019390935281518082039093018352810190526002611280565b6115216106d760017fa11ee3ab75b40e88a0105e935d17cd36c8faee0138320d776c411291bdbbb1a06123a0565b600003610c7457610c7461155660017fa11ee3ab75b40e88a0105e935d17cd36c8faee0138320d776c411291bdbbb1a06123a0565b439055565b73ffffffffffffffffffffffffffffffffffffffff8116158015906115aa575073ffffffffffffffffffffffffffffffffffffffff811673eeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeee14155b80156115bb57506115b9610779565b155b1561072157601260ff168173ffffffffffffffffffffffffffffffffffffffff1663313ce5676040518163ffffffff1660e01b8152600401602060405180830381865afa158015611610573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061163491906123e3565b60ff16146116c4576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602e60248201527f53797374656d436f6e6669673a2062616420646563696d616c73206f6620676160448201527f7320706179696e6720746f6b656e00000000000000000000000000000000000060648201526084016108e4565b600061175f8273ffffffffffffffffffffffffffffffffffffffff166306fdde036040518163ffffffff1660e01b8152600401600060405180830381865afa158015611714573d6000803e3d6000fd5b505050506040513d6000823e601f3d9081017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe016820160405261175a9190810190612400565b610f64565b905060006117b18373ffffffffffffffffffffffffffffffffffffffff166395d89b416040518163ffffffff1660e01b8152600401600060405180830381865afa158015611714573d6000803e3d6000fd5b90506117c08360128484611007565b6117c86106e0565b6040517f71cfaa3f00000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff858116600483015260126024830152604482018590526064820184905291909116906371cfaa3f90608401600060405180830381600087803b15801561184857600080fd5b505af115801561185c573d6000803e3d6000fd5b50505050505050565b8060a001516fffffffffffffffffffffffffffffffff16816060015163ffffffff161115611915576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152603560248201527f53797374656d436f6e6669673a206d696e206261736520666565206d7573742060448201527f6265206c657373207468616e206d61782062617365000000000000000000000060648201526084016108e4565b6001816040015160ff16116119ac576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602f60248201527f53797374656d436f6e6669673a2064656e6f6d696e61746f72206d757374206260448201527f65206c6172676572207468616e2031000000000000000000000000000000000060648201526084016108e4565b6068546080820151825167ffffffffffffffff909216916119cd91906124cb565b63ffffffff161115611a3b576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601f60248201527f53797374656d436f6e6669673a20676173206c696d697420746f6f206c6f770060448201526064016108e4565b6000816020015160ff1611611ad2576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602f60248201527f53797374656d436f6e6669673a20656c6173746963697479206d756c7469706c60448201527f6965722063616e6e6f742062652030000000000000000000000000000000000060648201526084016108e4565b8051602082015163ffffffff82169160ff90911690611af29082906124ea565b611afc9190612534565b63ffffffff1614611b8f576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152603760248201527f53797374656d436f6e6669673a20707265636973696f6e206c6f73732077697460448201527f6820746172676574207265736f75726365206c696d697400000000000000000060648201526084016108e4565b805160698054602084015160408501516060860151608087015160a09097015163ffffffff9687167fffffffffffffffffffffffffffffffffffffffffffffffffffffff00000000009095169490941764010000000060ff94851602177fffffffffffffffffffffffffffffffffffffffffffff0000000000ffffffffff166501000000000093909216929092027fffffffffffffffffffffffffffffffffffffffffffff00000000ffffffffffff1617660100000000000091851691909102177fffff0000000000000000000000000000000000000000ffffffffffffffffffff166a010000000000000000000093909416929092027fffff00000000000000000000000000000000ffffffffffffffffffffffffffff16929092176e0100000000000000000000000000006fffffffffffffffffffffffffffffffff90921691909102179055565b60606000611ce5611102565b5090507fffffffffffffffffffffffff111111111111111111111111111111111111111273ffffffffffffffffffffffffffffffffffffffff821601611d5e57505060408051808201909152600381527f4554480000000000000000000000000000000000000000000000000000000000602082015290565b611d94611d8f6106d760017fa48b38a4b44951360fbdcbfaaeae5ed6ae92585412e9841b70ec72ed8cd057646123a0565b611f67565b91505090565b6033805473ffffffffffffffffffffffffffffffffffffffff8381167fffffffffffffffffffffffff0000000000000000000000000000000000000000831681179093556040519116919082907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e090600090a35050565b60606000611e1d611102565b5090507fffffffffffffffffffffffff111111111111111111111111111111111111111273ffffffffffffffffffffffffffffffffffffffff821601611e9657505060408051808201909152600581527f4574686572000000000000000000000000000000000000000000000000000000602082015290565b611d94611d8f6106d760017f657c3582c29b3176614e3a33ddd1ec48352696a04e92b3c0566d72010fa8863d6123a0565b600054610100900460ff16611f5e576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602b60248201527f496e697469616c697a61626c653a20636f6e7472616374206973206e6f74206960448201527f6e697469616c697a696e6700000000000000000000000000000000000000000060648201526084016108e4565b610c7433611d9a565b60405160005b82811a15611f7d57600101611f6d565b80825260208201838152600082820152505060408101604052919050565b803573ffffffffffffffffffffffffffffffffffffffff81168114611fbf57600080fd5b919050565b600060208284031215611fd657600080fd5b611fdf82611f9b565b9392505050565b803567ffffffffffffffff81168114611fbf57600080fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b60405160e0810167ffffffffffffffff8111828210171561205057612050611ffe565b60405290565b803563ffffffff81168114611fbf57600080fd5b60ff8116811461072157600080fd5b600060c0828403121561208b57600080fd5b60405160c0810181811067ffffffffffffffff821117156120ae576120ae611ffe565b6040529050806120bd83612056565b815260208301356120cd8161206a565b602082015260408301356120e08161206a565b60408201526120f160608401612056565b606082015261210260808401612056565b608082015260a08301356fffffffffffffffffffffffffffffffff8116811461212a57600080fd5b60a0919091015292915050565b6000806000806000806000806000898b0361028081121561215757600080fd5b6121608b611f9b565b995060208b0135985060408b0135975060608b0135965061218360808c01611fe6565b955061219160a08c01611f9b565b94506121a08c60c08d01612079565b93506121af6101808c01611f9b565b925060e07ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe60820112156121e157600080fd5b506121ea61202d565b6121f76101a08c01611f9b565b81526122066101c08c01611f9b565b60208201526122186101e08c01611f9b565b604082015261222a6102008c01611f9b565b606082015261223c6102208c01611f9b565b608082015261224e6102408c01611f9b565b60a08201526122606102608c01611f9b565b60c0820152809150509295985092959850929598565b60005b83811015612291578181015183820152602001612279565b838111156110d35750506000910152565b600081518084526122ba816020860160208601612276565b601f017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0169290920160200192915050565b602081526000611fdf60208301846122a2565b6000806040838503121561231257600080fd5b50508035926020909101359150565b60006020828403121561233357600080fd5b611fdf82611fe6565b600060c0828403121561234e57600080fd5b611fdf8383612079565b60006020828403121561236a57600080fd5b5035919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b6000828210156123b2576123b2612371565b500390565b600067ffffffffffffffff8083168185168083038211156123da576123da612371565b01949350505050565b6000602082840312156123f557600080fd5b8151611fdf8161206a565b60006020828403121561241257600080fd5b815167ffffffffffffffff8082111561242a57600080fd5b818401915084601f83011261243e57600080fd5b81518181111561245057612450611ffe565b604051601f82017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0908116603f0116810190838211818310171561249657612496611ffe565b816040528281528760208487010111156124af57600080fd5b6124c0836020830160208801612276565b979650505050505050565b600063ffffffff8083168185168083038211156123da576123da612371565b600063ffffffff80841680612528577f4e487b7100000000000000000000000000000000000000000000000000000000600052601260045260246000fd5b92169190910492915050565b600063ffffffff8083168185168183048111821515161561255757612557612371565b0294935050505056fea164736f6c634300080f000a", - "initialized": true, - "kind": "Create", - "newBalance": 0, - "oldBalance": 0, - "reverted": false, - "storageAccesses": [ - { - "account": "0x809abd1c13738dE7a76C85839779FCaa59FA32CE", - "isWrite": true, - "newValue": "0xffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff", - "previousValue": "0x0000000000000000000000000000000000000000000000000000000000000000", - "reverted": false, - "slot": "0xa11ee3ab75b40e88a0105e935d17cd36c8faee0138320d776c411291bdbbb19f" - }, - { - "account": "0x809abd1c13738dE7a76C85839779FCaa59FA32CE", - "isWrite": false, - "newValue": "0x0000000000000000000000000000000000000000000000000000000000000000", - "previousValue": "0x0000000000000000000000000000000000000000000000000000000000000000", - "reverted": false, - "slot": "0x0000000000000000000000000000000000000000000000000000000000000000" - }, - { - "account": "0x809abd1c13738dE7a76C85839779FCaa59FA32CE", - "isWrite": false, - "newValue": "0x0000000000000000000000000000000000000000000000000000000000000000", - "previousValue": "0x0000000000000000000000000000000000000000000000000000000000000000", - "reverted": false, - "slot": "0x0000000000000000000000000000000000000000000000000000000000000000" - }, - { - "account": "0x809abd1c13738dE7a76C85839779FCaa59FA32CE", - "isWrite": false, - "newValue": "0x0000000000000000000000000000000000000000000000000000000000000000", - "previousValue": "0x0000000000000000000000000000000000000000000000000000000000000000", - "reverted": false, - "slot": "0x0000000000000000000000000000000000000000000000000000000000000000" - }, - { - "account": "0x809abd1c13738dE7a76C85839779FCaa59FA32CE", - "isWrite": true, - "newValue": "0x0000000000000000000000000000000000000000000000000000000000000001", - "previousValue": "0x0000000000000000000000000000000000000000000000000000000000000000", - "reverted": false, - "slot": "0x0000000000000000000000000000000000000000000000000000000000000000" - }, - { - "account": "0x809abd1c13738dE7a76C85839779FCaa59FA32CE", - "isWrite": false, - "newValue": "0x0000000000000000000000000000000000000000000000000000000000000001", - "previousValue": "0x0000000000000000000000000000000000000000000000000000000000000001", - "reverted": false, - "slot": "0x0000000000000000000000000000000000000000000000000000000000000000" - }, - { - "account": "0x809abd1c13738dE7a76C85839779FCaa59FA32CE", - "isWrite": true, - "newValue": "0x0000000000000000000000000000000000000000000000000000000000000101", - "previousValue": "0x0000000000000000000000000000000000000000000000000000000000000001", - "reverted": false, - "slot": "0x0000000000000000000000000000000000000000000000000000000000000000" - }, - { - "account": "0x809abd1c13738dE7a76C85839779FCaa59FA32CE", - "isWrite": false, - "newValue": "0x0000000000000000000000000000000000000000000000000000000000000101", - "previousValue": "0x0000000000000000000000000000000000000000000000000000000000000101", - "reverted": false, - "slot": "0x0000000000000000000000000000000000000000000000000000000000000000" - }, - { - "account": "0x809abd1c13738dE7a76C85839779FCaa59FA32CE", - "isWrite": false, - "newValue": "0x0000000000000000000000000000000000000000000000000000000000000101", - "previousValue": "0x0000000000000000000000000000000000000000000000000000000000000101", - "reverted": false, - "slot": "0x0000000000000000000000000000000000000000000000000000000000000000" - }, - { - "account": "0x809abd1c13738dE7a76C85839779FCaa59FA32CE", - "isWrite": false, - "newValue": "0x0000000000000000000000000000000000000000000000000000000000000000", - "previousValue": "0x0000000000000000000000000000000000000000000000000000000000000000", - "reverted": false, - "slot": "0x0000000000000000000000000000000000000000000000000000000000000033" - }, - { - "account": "0x809abd1c13738dE7a76C85839779FCaa59FA32CE", - "isWrite": true, - "newValue": "0x0000000000000000000000004e59b44847b379578588920ca78fbf26c0b4956c", - "previousValue": "0x0000000000000000000000000000000000000000000000000000000000000000", - "reverted": false, - "slot": "0x0000000000000000000000000000000000000000000000000000000000000033" - }, - { - "account": "0x809abd1c13738dE7a76C85839779FCaa59FA32CE", - "isWrite": false, - "newValue": "0x0000000000000000000000004e59b44847b379578588920ca78fbf26c0b4956c", - "previousValue": "0x0000000000000000000000004e59b44847b379578588920ca78fbf26c0b4956c", - "reverted": false, - "slot": "0x0000000000000000000000000000000000000000000000000000000000000033" - }, - { - "account": "0x809abd1c13738dE7a76C85839779FCaa59FA32CE", - "isWrite": false, - "newValue": "0x0000000000000000000000004e59b44847b379578588920ca78fbf26c0b4956c", - "previousValue": "0x0000000000000000000000004e59b44847b379578588920ca78fbf26c0b4956c", - "reverted": false, - "slot": "0x0000000000000000000000000000000000000000000000000000000000000033" - }, - { - "account": "0x809abd1c13738dE7a76C85839779FCaa59FA32CE", - "isWrite": true, - "newValue": "0x000000000000000000000000000000000000000000000000000000000000dead", - "previousValue": "0x0000000000000000000000004e59b44847b379578588920ca78fbf26c0b4956c", - "reverted": false, - "slot": "0x0000000000000000000000000000000000000000000000000000000000000033" - }, - { - "account": "0x809abd1c13738dE7a76C85839779FCaa59FA32CE", - "isWrite": true, - "newValue": "0x0000000000000000000000000000000000000000000000000000000000000000", - "previousValue": "0x0000000000000000000000000000000000000000000000000000000000000000", - "reverted": false, - "slot": "0x0000000000000000000000000000000000000000000000000000000000000067" - }, - { - "account": "0x809abd1c13738dE7a76C85839779FCaa59FA32CE", - "isWrite": true, - "newValue": "0x0000000000000000000000000000000000000000000000000000000000000000", - "previousValue": "0x0000000000000000000000000000000000000000000000000000000000000000", - "reverted": false, - "slot": "0x0000000000000000000000000000000000000000000000000000000000000065" - }, - { - "account": "0x809abd1c13738dE7a76C85839779FCaa59FA32CE", - "isWrite": true, - "newValue": "0x0000000000000000000000000000000000000000000000000000000000000000", - "previousValue": "0x0000000000000000000000000000000000000000000000000000000000000000", - "reverted": false, - "slot": "0x0000000000000000000000000000000000000000000000000000000000000066" - }, - { - "account": "0x809abd1c13738dE7a76C85839779FCaa59FA32CE", - "isWrite": false, - "newValue": "0x0000000000000000000000000000000000000000000000000000000000000000", - "previousValue": "0x0000000000000000000000000000000000000000000000000000000000000000", - "reverted": false, - "slot": "0x0000000000000000000000000000000000000000000000000000000000000069" - }, - { - "account": "0x809abd1c13738dE7a76C85839779FCaa59FA32CE", - "isWrite": false, - "newValue": "0x0000000000000000000000000000000000000000000000000000000000000000", - "previousValue": "0x0000000000000000000000000000000000000000000000000000000000000000", - "reverted": false, - "slot": "0x0000000000000000000000000000000000000000000000000000000000000068" - }, - { - "account": "0x809abd1c13738dE7a76C85839779FCaa59FA32CE", - "isWrite": true, - "newValue": "0x0000000000000000000000000000000000000000000000000000000000000001", - "previousValue": "0x0000000000000000000000000000000000000000000000000000000000000000", - "reverted": false, - "slot": "0x0000000000000000000000000000000000000000000000000000000000000068" - }, - { - "account": "0x809abd1c13738dE7a76C85839779FCaa59FA32CE", - "isWrite": true, - "newValue": "0x0000000000000000000000000000000000000000000000000000000000000000", - "previousValue": "0x0000000000000000000000000000000000000000000000000000000000000000", - "reverted": false, - "slot": "0x65a7ed542fb37fe237fdfbdd70b31598523fe5b32879e307bae27a0bd9581c08" - }, - { - "account": "0x809abd1c13738dE7a76C85839779FCaa59FA32CE", - "isWrite": true, - "newValue": "0x0000000000000000000000000000000000000000000000000000000000000000", - "previousValue": "0x0000000000000000000000000000000000000000000000000000000000000000", - "reverted": false, - "slot": "0x71ac12829d66ee73d8d95bff50b3589745ce57edae70a3fb111a2342464dc597" - }, - { - "account": "0x809abd1c13738dE7a76C85839779FCaa59FA32CE", - "isWrite": true, - "newValue": "0x0000000000000000000000000000000000000000000000000000000000000000", - "previousValue": "0x0000000000000000000000000000000000000000000000000000000000000000", - "reverted": false, - "slot": "0x383f291819e6d54073bc9a648251d97421076bdd101933c0c022219ce9580636" - }, - { - "account": "0x809abd1c13738dE7a76C85839779FCaa59FA32CE", - "isWrite": true, - "newValue": "0x0000000000000000000000000000000000000000000000000000000000000000", - "previousValue": "0x0000000000000000000000000000000000000000000000000000000000000000", - "reverted": false, - "slot": "0x46adcbebc6be8ce551740c29c47c8798210f23f7f4086c41752944352568d5a7" - }, - { - "account": "0x809abd1c13738dE7a76C85839779FCaa59FA32CE", - "isWrite": true, - "newValue": "0x0000000000000000000000000000000000000000000000000000000000000000", - "previousValue": "0x0000000000000000000000000000000000000000000000000000000000000000", - "reverted": false, - "slot": "0x9904ba90dde5696cda05c9e0dab5cbaa0fea005ace4d11218a02ac668dad6376" - }, - { - "account": "0x809abd1c13738dE7a76C85839779FCaa59FA32CE", - "isWrite": true, - "newValue": "0x0000000000000000000000000000000000000000000000000000000000000000", - "previousValue": "0x0000000000000000000000000000000000000000000000000000000000000000", - "reverted": false, - "slot": "0x52322a25d9f59ea17656545543306b7aef62bc0cc53a0e65ccfa0c75b97aa906" - }, - { - "account": "0x809abd1c13738dE7a76C85839779FCaa59FA32CE", - "isWrite": true, - "newValue": "0x0000000000000000000000000000000000000000000000000000000000000000", - "previousValue": "0x0000000000000000000000000000000000000000000000000000000000000000", - "reverted": false, - "slot": "0x4b6c74f9e688cb39801f2112c14a8c57232a3fc5202e1444126d4bce86eb19ac" - }, - { - "account": "0x809abd1c13738dE7a76C85839779FCaa59FA32CE", - "isWrite": true, - "newValue": "0x0000000000000000000000000000000000000000000000000000000000000000", - "previousValue": "0x0000000000000000000000000000000000000000000000000000000000000000", - "reverted": false, - "slot": "0xa04c5bb938ca6fc46d95553abf0a76345ce3e722a30bf4f74928b8e7d852320c" - }, - { - "account": "0x809abd1c13738dE7a76C85839779FCaa59FA32CE", - "isWrite": false, - "newValue": "0xffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff", - "previousValue": "0xffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff", - "reverted": false, - "slot": "0xa11ee3ab75b40e88a0105e935d17cd36c8faee0138320d776c411291bdbbb19f" - }, - { - "account": "0x809abd1c13738dE7a76C85839779FCaa59FA32CE", - "isWrite": false, - "newValue": "0x0000000000000000000000000000000000000000000000000000000000000001", - "previousValue": "0x0000000000000000000000000000000000000000000000000000000000000001", - "reverted": false, - "slot": "0x0000000000000000000000000000000000000000000000000000000000000068" - }, - { - "account": "0x809abd1c13738dE7a76C85839779FCaa59FA32CE", - "isWrite": false, - "newValue": "0x0000000000000000000000000000000000000000000000000000000000000000", - "previousValue": "0x0000000000000000000000000000000000000000000000000000000000000000", - "reverted": false, - "slot": "0x0000000000000000000000000000000000000000000000000000000000000069" - }, - { - "account": "0x809abd1c13738dE7a76C85839779FCaa59FA32CE", - "isWrite": true, - "newValue": "0x0000000000000000000000000000000000000000000000000000020100000001", - "previousValue": "0x0000000000000000000000000000000000000000000000000000000000000000", - "reverted": false, - "slot": "0x0000000000000000000000000000000000000000000000000000000000000069" - }, - { - "account": "0x809abd1c13738dE7a76C85839779FCaa59FA32CE", - "isWrite": false, - "newValue": "0x0000000000000000000000000000000000000000000000000000020100000001", - "previousValue": "0x0000000000000000000000000000000000000000000000000000020100000001", - "reverted": false, - "slot": "0x0000000000000000000000000000000000000000000000000000000000000069" - }, - { - "account": "0x809abd1c13738dE7a76C85839779FCaa59FA32CE", - "isWrite": false, - "newValue": "0x0000000000000000000000000000000000000000000000000000000000000101", - "previousValue": "0x0000000000000000000000000000000000000000000000000000000000000101", - "reverted": false, - "slot": "0x0000000000000000000000000000000000000000000000000000000000000000" - }, - { - "account": "0x809abd1c13738dE7a76C85839779FCaa59FA32CE", - "isWrite": true, - "newValue": "0x0000000000000000000000000000000000000000000000000000000000000001", - "previousValue": "0x0000000000000000000000000000000000000000000000000000000000000101", - "reverted": false, - "slot": "0x0000000000000000000000000000000000000000000000000000000000000000" - } - ], - "value": 0 - }, - { - "accessor": "0x7FA9385bE102ac3EAc297483Dd6233D62b3e1496", - "account": "0x7109709ECfa91a80626fF3989D68f67F5b1DD12D", - "chainInfo": { - "chainId": 31337, - "forkId": 0 - }, - "data": "0x", - "deployedCode": "0x", - "initialized": true, - "kind": "Resume", - "newBalance": 0, - "oldBalance": 0, - "reverted": false, - "storageAccesses": [], - "value": 0 - }, - { - "accessor": "0x1804c8AB1F12E6bbf3894d4083f33e07309d1f38", - "account": "0x809abd1c13738dE7a76C85839779FCaa59FA32CE", - "chainInfo": { - "chainId": 31337, - "forkId": 0 - }, - "data": "0xcc731b02", - "deployedCode": "0x", - "initialized": true, - "kind": "StaticCall", - "newBalance": 0, - "oldBalance": 0, - "reverted": false, - "storageAccesses": [ - { - "account": "0x809abd1c13738dE7a76C85839779FCaa59FA32CE", - "isWrite": false, - "newValue": "0x0000000000000000000000000000000000000000000000000000020100000001", - "previousValue": "0x0000000000000000000000000000000000000000000000000000020100000001", - "reverted": false, - "slot": "0x0000000000000000000000000000000000000000000000000000000000000069" - } - ], - "value": 0 - }, - { - "accessor": "0x1804c8AB1F12E6bbf3894d4083f33e07309d1f38", - "account": "0x809abd1c13738dE7a76C85839779FCaa59FA32CE", - "chainInfo": { - "chainId": 31337, - "forkId": 0 - }, - "data": "0x8da5cb5b", - "deployedCode": "0x", - "initialized": true, - "kind": "StaticCall", - "newBalance": 0, - "oldBalance": 0, - "reverted": false, - "storageAccesses": [ - { - "account": "0x809abd1c13738dE7a76C85839779FCaa59FA32CE", - "isWrite": false, - "newValue": "0x000000000000000000000000000000000000000000000000000000000000dead", - "previousValue": "0x000000000000000000000000000000000000000000000000000000000000dead", - "reverted": false, - "slot": "0x0000000000000000000000000000000000000000000000000000000000000033" - } - ], - "value": 0 - }, - { - "accessor": "0x1804c8AB1F12E6bbf3894d4083f33e07309d1f38", - "account": "0x809abd1c13738dE7a76C85839779FCaa59FA32CE", - "chainInfo": { - "chainId": 31337, - "forkId": 0 - }, - "data": "0x0c18c162", - "deployedCode": "0x", - "initialized": true, - "kind": "StaticCall", - "newBalance": 0, - "oldBalance": 0, - "reverted": false, - "storageAccesses": [ - { - "account": "0x809abd1c13738dE7a76C85839779FCaa59FA32CE", - "isWrite": false, - "newValue": "0x0000000000000000000000000000000000000000000000000000000000000000", - "previousValue": "0x0000000000000000000000000000000000000000000000000000000000000000", - "reverted": false, - "slot": "0x0000000000000000000000000000000000000000000000000000000000000065" - } - ], - "value": 0 - }, - { - "accessor": "0x1804c8AB1F12E6bbf3894d4083f33e07309d1f38", - "account": "0x809abd1c13738dE7a76C85839779FCaa59FA32CE", - "chainInfo": { - "chainId": 31337, - "forkId": 0 - }, - "data": "0xf45e65d8", - "deployedCode": "0x", - "initialized": true, - "kind": "StaticCall", - "newBalance": 0, - "oldBalance": 0, - "reverted": false, - "storageAccesses": [ - { - "account": "0x809abd1c13738dE7a76C85839779FCaa59FA32CE", - "isWrite": false, - "newValue": "0x0000000000000000000000000000000000000000000000000000000000000000", - "previousValue": "0x0000000000000000000000000000000000000000000000000000000000000000", - "reverted": false, - "slot": "0x0000000000000000000000000000000000000000000000000000000000000066" - } - ], - "value": 0 - }, - { - "accessor": "0x1804c8AB1F12E6bbf3894d4083f33e07309d1f38", - "account": "0x809abd1c13738dE7a76C85839779FCaa59FA32CE", - "chainInfo": { - "chainId": 31337, - "forkId": 0 - }, - "data": "0xe81b2c6d", - "deployedCode": "0x", - "initialized": true, - "kind": "StaticCall", - "newBalance": 0, - "oldBalance": 0, - "reverted": false, - "storageAccesses": [ - { - "account": "0x809abd1c13738dE7a76C85839779FCaa59FA32CE", - "isWrite": false, - "newValue": "0x0000000000000000000000000000000000000000000000000000000000000000", - "previousValue": "0x0000000000000000000000000000000000000000000000000000000000000000", - "reverted": false, - "slot": "0x0000000000000000000000000000000000000000000000000000000000000067" - } - ], - "value": 0 - }, - { - "accessor": "0x1804c8AB1F12E6bbf3894d4083f33e07309d1f38", - "account": "0x809abd1c13738dE7a76C85839779FCaa59FA32CE", - "chainInfo": { - "chainId": 31337, - "forkId": 0 - }, - "data": "0xf68016b7", - "deployedCode": "0x", - "initialized": true, - "kind": "StaticCall", - "newBalance": 0, - "oldBalance": 0, - "reverted": false, - "storageAccesses": [ - { - "account": "0x809abd1c13738dE7a76C85839779FCaa59FA32CE", - "isWrite": false, - "newValue": "0x0000000000000000000000000000000000000000000000000000000000000001", - "previousValue": "0x0000000000000000000000000000000000000000000000000000000000000001", - "reverted": false, - "slot": "0x0000000000000000000000000000000000000000000000000000000000000068" - } - ], - "value": 0 - }, - { - "accessor": "0x1804c8AB1F12E6bbf3894d4083f33e07309d1f38", - "account": "0x809abd1c13738dE7a76C85839779FCaa59FA32CE", - "chainInfo": { - "chainId": 31337, - "forkId": 0 - }, - "data": "0x1fd19ee1", - "deployedCode": "0x", - "initialized": true, - "kind": "StaticCall", - "newBalance": 0, - "oldBalance": 0, - "reverted": false, - "storageAccesses": [ - { - "account": "0x809abd1c13738dE7a76C85839779FCaa59FA32CE", - "isWrite": false, - "newValue": "0x0000000000000000000000000000000000000000000000000000000000000000", - "previousValue": "0x0000000000000000000000000000000000000000000000000000000000000000", - "reverted": false, - "slot": "0x65a7ed542fb37fe237fdfbdd70b31598523fe5b32879e307bae27a0bd9581c08" - } - ], - "value": 0 - }, - { - "accessor": "0x1804c8AB1F12E6bbf3894d4083f33e07309d1f38", - "account": "0x809abd1c13738dE7a76C85839779FCaa59FA32CE", - "chainInfo": { - "chainId": 31337, - "forkId": 0 - }, - "data": "0x48cd4cb1", - "deployedCode": "0x", - "initialized": true, - "kind": "StaticCall", - "newBalance": 0, - "oldBalance": 0, - "reverted": false, - "storageAccesses": [ - { - "account": "0x809abd1c13738dE7a76C85839779FCaa59FA32CE", - "isWrite": false, - "newValue": "0xffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff", - "previousValue": "0xffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff", - "reverted": false, - "slot": "0xa11ee3ab75b40e88a0105e935d17cd36c8faee0138320d776c411291bdbbb19f" - } - ], - "value": 0 - }, - { - "accessor": "0x1804c8AB1F12E6bbf3894d4083f33e07309d1f38", - "account": "0x809abd1c13738dE7a76C85839779FCaa59FA32CE", - "chainInfo": { - "chainId": 31337, - "forkId": 0 - }, - "data": "0xdac6e63a", - "deployedCode": "0x", - "initialized": true, - "kind": "StaticCall", - "newBalance": 0, - "oldBalance": 0, - "reverted": false, - "storageAccesses": [ - { - "account": "0x809abd1c13738dE7a76C85839779FCaa59FA32CE", - "isWrite": false, - "newValue": "0x0000000000000000000000000000000000000000000000000000000000000000", - "previousValue": "0x0000000000000000000000000000000000000000000000000000000000000000", - "reverted": false, - "slot": "0x71ac12829d66ee73d8d95bff50b3589745ce57edae70a3fb111a2342464dc597" - } - ], - "value": 0 - }, - { - "accessor": "0x1804c8AB1F12E6bbf3894d4083f33e07309d1f38", - "account": "0x809abd1c13738dE7a76C85839779FCaa59FA32CE", - "chainInfo": { - "chainId": 31337, - "forkId": 0 - }, - "data": "0xa7119869", - "deployedCode": "0x", - "initialized": true, - "kind": "StaticCall", - "newBalance": 0, - "oldBalance": 0, - "reverted": false, - "storageAccesses": [ - { - "account": "0x809abd1c13738dE7a76C85839779FCaa59FA32CE", - "isWrite": false, - "newValue": "0x0000000000000000000000000000000000000000000000000000000000000000", - "previousValue": "0x0000000000000000000000000000000000000000000000000000000000000000", - "reverted": false, - "slot": "0x383f291819e6d54073bc9a648251d97421076bdd101933c0c022219ce9580636" - } - ], - "value": 0 - }, - { - "accessor": "0x1804c8AB1F12E6bbf3894d4083f33e07309d1f38", - "account": "0x809abd1c13738dE7a76C85839779FCaa59FA32CE", - "chainInfo": { - "chainId": 31337, - "forkId": 0 - }, - "data": "0xc4e8ddfa", - "deployedCode": "0x", - "initialized": true, - "kind": "StaticCall", - "newBalance": 0, - "oldBalance": 0, - "reverted": false, - "storageAccesses": [ - { - "account": "0x809abd1c13738dE7a76C85839779FCaa59FA32CE", - "isWrite": false, - "newValue": "0x0000000000000000000000000000000000000000000000000000000000000000", - "previousValue": "0x0000000000000000000000000000000000000000000000000000000000000000", - "reverted": false, - "slot": "0x46adcbebc6be8ce551740c29c47c8798210f23f7f4086c41752944352568d5a7" - } - ], - "value": 0 - }, - { - "accessor": "0x1804c8AB1F12E6bbf3894d4083f33e07309d1f38", - "account": "0x809abd1c13738dE7a76C85839779FCaa59FA32CE", - "chainInfo": { - "chainId": 31337, - "forkId": 0 - }, - "data": "0x078f29cf", - "deployedCode": "0x", - "initialized": true, - "kind": "StaticCall", - "newBalance": 0, - "oldBalance": 0, - "reverted": false, - "storageAccesses": [ - { - "account": "0x809abd1c13738dE7a76C85839779FCaa59FA32CE", - "isWrite": false, - "newValue": "0x0000000000000000000000000000000000000000000000000000000000000000", - "previousValue": "0x0000000000000000000000000000000000000000000000000000000000000000", - "reverted": false, - "slot": "0x9904ba90dde5696cda05c9e0dab5cbaa0fea005ace4d11218a02ac668dad6376" - } - ], - "value": 0 - }, - { - "accessor": "0x1804c8AB1F12E6bbf3894d4083f33e07309d1f38", - "account": "0x809abd1c13738dE7a76C85839779FCaa59FA32CE", - "chainInfo": { - "chainId": 31337, - "forkId": 0 - }, - "data": "0xf2b4e617", - "deployedCode": "0x", - "initialized": true, - "kind": "StaticCall", - "newBalance": 0, - "oldBalance": 0, - "reverted": false, - "storageAccesses": [ - { - "account": "0x809abd1c13738dE7a76C85839779FCaa59FA32CE", - "isWrite": false, - "newValue": "0x0000000000000000000000000000000000000000000000000000000000000000", - "previousValue": "0x0000000000000000000000000000000000000000000000000000000000000000", - "reverted": false, - "slot": "0x52322a25d9f59ea17656545543306b7aef62bc0cc53a0e65ccfa0c75b97aa906" - } - ], - "value": 0 - }, - { - "accessor": "0x1804c8AB1F12E6bbf3894d4083f33e07309d1f38", - "account": "0x809abd1c13738dE7a76C85839779FCaa59FA32CE", - "chainInfo": { - "chainId": 31337, - "forkId": 0 - }, - "data": "0x0a49cb03", - "deployedCode": "0x", - "initialized": true, - "kind": "StaticCall", - "newBalance": 0, - "oldBalance": 0, - "reverted": false, - "storageAccesses": [ - { - "account": "0x809abd1c13738dE7a76C85839779FCaa59FA32CE", - "isWrite": false, - "newValue": "0x0000000000000000000000000000000000000000000000000000000000000000", - "previousValue": "0x0000000000000000000000000000000000000000000000000000000000000000", - "reverted": false, - "slot": "0x4b6c74f9e688cb39801f2112c14a8c57232a3fc5202e1444126d4bce86eb19ac" - } - ], - "value": 0 - }, - { - "accessor": "0x1804c8AB1F12E6bbf3894d4083f33e07309d1f38", - "account": "0x809abd1c13738dE7a76C85839779FCaa59FA32CE", - "chainInfo": { - "chainId": 31337, - "forkId": 0 - }, - "data": "0x9b7d7f0a", - "deployedCode": "0x", - "initialized": true, - "kind": "StaticCall", - "newBalance": 0, - "oldBalance": 0, - "reverted": false, - "storageAccesses": [ - { - "account": "0x809abd1c13738dE7a76C85839779FCaa59FA32CE", - "isWrite": false, - "newValue": "0x0000000000000000000000000000000000000000000000000000000000000000", - "previousValue": "0x0000000000000000000000000000000000000000000000000000000000000000", - "reverted": false, - "slot": "0xa04c5bb938ca6fc46d95553abf0a76345ce3e722a30bf4f74928b8e7d852320c" - } - ], - "value": 0 - }, - { - "accessor": "0x7FA9385bE102ac3EAc297483Dd6233D62b3e1496", - "account": "0x7109709ECfa91a80626fF3989D68f67F5b1DD12D", - "chainInfo": { - "chainId": 31337, - "forkId": 0 - }, - "data": "0x", - "deployedCode": "0x", - "initialized": true, - "kind": "Resume", - "newBalance": 0, - "oldBalance": 0, - "reverted": false, - "storageAccesses": [], - "value": 0 - }, - { - "accessor": "0x7FA9385bE102ac3EAc297483Dd6233D62b3e1496", - "account": "0x7109709ECfa91a80626fF3989D68f67F5b1DD12D", - "chainInfo": { - "chainId": 31337, - "forkId": 0 - }, - "data": "0x", - "deployedCode": "0x", - "initialized": true, - "kind": "Resume", - "newBalance": 0, - "oldBalance": 0, - "reverted": false, - "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": "0x04c50B398Cd4182428E79f7186b7C919cF17e86F", - "chainInfo": { - "chainId": 31337, - "forkId": 0 - }, - "data": "0x60806040523480156200001157600080fd5b50620000206000808062000026565b6200024b565b600054610100900460ff1615808015620000475750600054600160ff909116105b806200007757506200006430620001a160201b620005891760201c565b15801562000077575060005460ff166001145b620000e05760405162461bcd60e51b815260206004820152602e60248201527f496e697469616c697a61626c653a20636f6e747261637420697320616c72656160448201526d191e481a5b9a5d1a585b1a5e995960921b60648201526084015b60405180910390fd5b6000805460ff19166001179055801562000104576000805461ff0019166101001790555b603280546001600160a01b038086166001600160a01b03199283161790925560338054928516929091169190911790556200015484734200000000000000000000000000000000000010620001b0565b80156200019b576000805461ff0019169055604051600181527f7f26b83ff96e1f2b6a682f133852f6798a09c465da95921460cefb38474024989060200160405180910390a15b50505050565b6001600160a01b03163b151590565b600054610100900460ff166200021d5760405162461bcd60e51b815260206004820152602b60248201527f496e697469616c697a61626c653a20636f6e7472616374206973206e6f74206960448201526a6e697469616c697a696e6760a81b6064820152608401620000d7565b600380546001600160a01b039384166001600160a01b03199182161790915560048054929093169116179055565b612faf806200025b6000396000f3fe6080604052600436106101845760003560e01c80637f46ddb2116100d65780639a2ac6d51161007f578063c0c53b8b11610059578063c0c53b8b14610529578063c89701a214610549578063e11013dd1461057657600080fd5b80639a2ac6d5146104e3578063a9f9e675146104f6578063b1a1a8821461051657600080fd5b80638f601f66116100b05780638f601f661461047257806391c49bf814610407578063927ede2d146104b857600080fd5b80637f46ddb214610407578063838b252014610432578063870876231461045257600080fd5b806335e80ab31161013857806354fd4d501161011257806354fd4d501461036c57806358a997f6146103c25780635c975abb146103e257600080fd5b806335e80ab3146102f25780633cb747bf1461031f578063540abf731461034c57600080fd5b80631532ec34116101695780631532ec34146102755780631635f5fd1461028857806333d7e2bd1461029b57600080fd5b80630166a07a1461024257806309fc88431461026257600080fd5b3661023d57333b1561021d576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152603760248201527f5374616e646172644272696467653a2066756e6374696f6e2063616e206f6e6c60448201527f792062652063616c6c65642066726f6d20616e20454f4100000000000000000060648201526084015b60405180910390fd5b61023b333362030d40604051806020016040528060008152506105a5565b005b600080fd5b34801561024e57600080fd5b5061023b61025d366004612993565b6105b8565b61023b610270366004612a44565b6109d2565b61023b610283366004612a97565b610aa9565b61023b610296366004612a97565b610abd565b3480156102a757600080fd5b506033546102c89073ffffffffffffffffffffffffffffffffffffffff1681565b60405173ffffffffffffffffffffffffffffffffffffffff90911681526020015b60405180910390f35b3480156102fe57600080fd5b506032546102c89073ffffffffffffffffffffffffffffffffffffffff1681565b34801561032b57600080fd5b506003546102c89073ffffffffffffffffffffffffffffffffffffffff1681565b34801561035857600080fd5b5061023b610367366004612b0a565b61101b565b34801561037857600080fd5b506103b56040518060400160405280600581526020017f322e322e3000000000000000000000000000000000000000000000000000000081525081565b6040516102e99190612bf7565b3480156103ce57600080fd5b5061023b6103dd366004612c0a565b611060565b3480156103ee57600080fd5b506103f7611134565b60405190151581526020016102e9565b34801561041357600080fd5b5060045473ffffffffffffffffffffffffffffffffffffffff166102c8565b34801561043e57600080fd5b5061023b61044d366004612b0a565b6111cd565b34801561045e57600080fd5b5061023b61046d366004612c0a565b611212565b34801561047e57600080fd5b506104aa61048d366004612c8d565b600260209081526000928352604080842090915290825290205481565b6040519081526020016102e9565b3480156104c457600080fd5b5060035473ffffffffffffffffffffffffffffffffffffffff166102c8565b61023b6104f1366004612cc6565b6112e6565b34801561050257600080fd5b5061023b610511366004612993565b611328565b61023b610524366004612a44565b611337565b34801561053557600080fd5b5061023b610544366004612d29565b611408565b34801561055557600080fd5b506004546102c89073ffffffffffffffffffffffffffffffffffffffff1681565b61023b610584366004612cc6565b611607565b73ffffffffffffffffffffffffffffffffffffffff163b151590565b6105b2848434858561164a565b50505050565b60035473ffffffffffffffffffffffffffffffffffffffff163314801561068b575060048054600354604080517f6e296e45000000000000000000000000000000000000000000000000000000008152905173ffffffffffffffffffffffffffffffffffffffff938416949390921692636e296e459282820192602092908290030181865afa15801561064f573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906106739190612d74565b73ffffffffffffffffffffffffffffffffffffffff16145b61073d576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152604160248201527f5374616e646172644272696467653a2066756e6374696f6e2063616e206f6e6c60448201527f792062652063616c6c65642066726f6d20746865206f7468657220627269646760648201527f6500000000000000000000000000000000000000000000000000000000000000608482015260a401610214565b610745611134565b156107ac576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601660248201527f5374616e646172644272696467653a20706175736564000000000000000000006044820152606401610214565b6107b5876118a9565b15610903576107c4878761190b565b610876576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152604a60248201527f5374616e646172644272696467653a2077726f6e672072656d6f746520746f6b60448201527f656e20666f72204f7074696d69736d204d696e7461626c65204552433230206c60648201527f6f63616c20746f6b656e00000000000000000000000000000000000000000000608482015260a401610214565b6040517f40c10f1900000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff8581166004830152602482018590528816906340c10f1990604401600060405180830381600087803b1580156108e657600080fd5b505af11580156108fa573d6000803e3d6000fd5b50505050610985565b73ffffffffffffffffffffffffffffffffffffffff8088166000908152600260209081526040808320938a1683529290522054610941908490612dc0565b73ffffffffffffffffffffffffffffffffffffffff8089166000818152600260209081526040808320948c1683529390529190912091909155610985908585611a2b565b6109c9878787878787878080601f016020809104026020016040519081016040528093929190818152602001838380828437600092019190915250611aff92505050565b50505050505050565b333b15610a61576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152603760248201527f5374616e646172644272696467653a2066756e6374696f6e2063616e206f6e6c60448201527f792062652063616c6c65642066726f6d20616e20454f410000000000000000006064820152608401610214565b610aa43333348686868080601f01602080910402602001604051908101604052809392919081815260200183838082843760009201919091525061164a92505050565b505050565b610ab68585858585610abd565b5050505050565b60035473ffffffffffffffffffffffffffffffffffffffff1633148015610b90575060048054600354604080517f6e296e45000000000000000000000000000000000000000000000000000000008152905173ffffffffffffffffffffffffffffffffffffffff938416949390921692636e296e459282820192602092908290030181865afa158015610b54573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610b789190612d74565b73ffffffffffffffffffffffffffffffffffffffff16145b610c42576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152604160248201527f5374616e646172644272696467653a2066756e6374696f6e2063616e206f6e6c60448201527f792062652063616c6c65642066726f6d20746865206f7468657220627269646760648201527f6500000000000000000000000000000000000000000000000000000000000000608482015260a401610214565b610c4a611134565b15610cb1576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601660248201527f5374616e646172644272696467653a20706175736564000000000000000000006044820152606401610214565b610cb9611b8d565b15610d46576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152603760248201527f5374616e646172644272696467653a2063616e6e6f742062726964676520455460448201527f48207769746820637573746f6d2067617320746f6b656e0000000000000000006064820152608401610214565b823414610dd5576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152603a60248201527f5374616e646172644272696467653a20616d6f756e742073656e7420646f657360448201527f206e6f74206d6174636820616d6f756e742072657175697265640000000000006064820152608401610214565b3073ffffffffffffffffffffffffffffffffffffffff851603610e7a576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602360248201527f5374616e646172644272696467653a2063616e6e6f742073656e6420746f207360448201527f656c6600000000000000000000000000000000000000000000000000000000006064820152608401610214565b60035473ffffffffffffffffffffffffffffffffffffffff90811690851603610f25576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602860248201527f5374616e646172644272696467653a2063616e6e6f742073656e6420746f206d60448201527f657373656e6765720000000000000000000000000000000000000000000000006064820152608401610214565b610f6785858585858080601f016020809104026020016040519081016040528093929190818152602001838380828437600092019190915250611bcc92505050565b6000610f84855a8660405180602001604052806000815250611c3f565b905080611013576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602360248201527f5374616e646172644272696467653a20455448207472616e736665722066616960448201527f6c656400000000000000000000000000000000000000000000000000000000006064820152608401610214565b505050505050565b6109c987873388888888888080601f016020809104026020016040519081016040528093929190818152602001838380828437600092019190915250611c5992505050565b333b156110ef576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152603760248201527f5374616e646172644272696467653a2066756e6374696f6e2063616e206f6e6c60448201527f792062652063616c6c65642066726f6d20616e20454f410000000000000000006064820152608401610214565b61101386863333888888888080601f01602080910402602001604051908101604052809392919081815260200183838082843760009201919091525061201292505050565b603254604080517f5c975abb000000000000000000000000000000000000000000000000000000008152905160009273ffffffffffffffffffffffffffffffffffffffff1691635c975abb9160048083019260209291908290030181865afa1580156111a4573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906111c89190612dd7565b905090565b6109c987873388888888888080601f01602080910402602001604051908101604052809392919081815260200183838082843760009201919091525061201292505050565b333b156112a1576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152603760248201527f5374616e646172644272696467653a2066756e6374696f6e2063616e206f6e6c60448201527f792062652063616c6c65642066726f6d20616e20454f410000000000000000006064820152608401610214565b61101386863333888888888080601f016020809104026020016040519081016040528093929190818152602001838380828437600092019190915250611c5992505050565b6105b233858585858080601f0160208091040260200160405190810160405280939291908181526020018383808284376000920191909152506105a592505050565b6109c9878787878787876105b8565b333b156113c6576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152603760248201527f5374616e646172644272696467653a2066756e6374696f6e2063616e206f6e6c60448201527f792062652063616c6c65642066726f6d20616e20454f410000000000000000006064820152608401610214565b610aa433338585858080601f0160208091040260200160405190810160405280939291908181526020018383808284376000920191909152506105a592505050565b600054610100900460ff16158080156114285750600054600160ff909116105b806114425750303b158015611442575060005460ff166001145b6114ce576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602e60248201527f496e697469616c697a61626c653a20636f6e747261637420697320616c72656160448201527f647920696e697469616c697a65640000000000000000000000000000000000006064820152608401610214565b600080547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00166001179055801561152c57600080547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00ff166101001790555b6032805473ffffffffffffffffffffffffffffffffffffffff8086167fffffffffffffffffffffffff000000000000000000000000000000000000000092831617909255603380549285169290911691909117905561159f84734200000000000000000000000000000000000010612021565b80156105b257600080547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00ff169055604051600181527f7f26b83ff96e1f2b6a682f133852f6798a09c465da95921460cefb38474024989060200160405180910390a150505050565b6105b23385348686868080601f01602080910402602001604051908101604052809392919081815260200183838082843760009201919091525061164a92505050565b611652611b8d565b156116df576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152603760248201527f5374616e646172644272696467653a2063616e6e6f742062726964676520455460448201527f48207769746820637573746f6d2067617320746f6b656e0000000000000000006064820152608401610214565b82341461176e576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152603e60248201527f5374616e646172644272696467653a206272696467696e6720455448206d757360448201527f7420696e636c7564652073756666696369656e74204554482076616c756500006064820152608401610214565b61177a8585858461210b565b60035460045460405173ffffffffffffffffffffffffffffffffffffffff92831692633dbb202b9287929116907f1635f5fd00000000000000000000000000000000000000000000000000000000906117dd908b908b9086908a90602401612df9565b604080517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe08184030181529181526020820180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff167fffffffff000000000000000000000000000000000000000000000000000000009485161790525160e086901b909216825261187092918890600401612e42565b6000604051808303818588803b15801561188957600080fd5b505af115801561189d573d6000803e3d6000fd5b50505050505050505050565b60006118d5827f1d1d8b630000000000000000000000000000000000000000000000000000000061217e565b806119055750611905827fec4fc8e30000000000000000000000000000000000000000000000000000000061217e565b92915050565b6000611937837f1d1d8b630000000000000000000000000000000000000000000000000000000061217e565b156119e0578273ffffffffffffffffffffffffffffffffffffffff1663c01e1bd66040518163ffffffff1660e01b8152600401602060405180830381865afa158015611987573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906119ab9190612d74565b73ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff16149050611905565b8273ffffffffffffffffffffffffffffffffffffffff1663d6c0b2c46040518163ffffffff1660e01b8152600401602060405180830381865afa158015611987573d6000803e3d6000fd5b60405173ffffffffffffffffffffffffffffffffffffffff8316602482015260448101829052610aa49084907fa9059cbb00000000000000000000000000000000000000000000000000000000906064015b604080517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe08184030181529190526020810180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff167fffffffff00000000000000000000000000000000000000000000000000000000909316929092179091526121a1565b8373ffffffffffffffffffffffffffffffffffffffff168573ffffffffffffffffffffffffffffffffffffffff168773ffffffffffffffffffffffffffffffffffffffff167f3ceee06c1e37648fcbb6ed52e17b3e1f275a1f8c7b22a84b2b84732431e046b3868686604051611b7793929190612e87565b60405180910390a46110138686868686866122ad565b600080611b98612335565b5073ffffffffffffffffffffffffffffffffffffffff1673eeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeee141592915050565b8273ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff167f2ac69ee804d9a7a0984249f508dfab7cb2534b465b6ce1580f99a38ba9c5e6318484604051611c2b929190612ec5565b60405180910390a36105b2848484846123d2565b600080600080845160208601878a8af19695505050505050565b3415611ce7576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602160248201527f5374616e646172644272696467653a2063616e6e6f742073656e642076616c7560448201527f65000000000000000000000000000000000000000000000000000000000000006064820152608401610214565b611cf0876118a9565b15611e3e57611cff878761190b565b611db1576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152604a60248201527f5374616e646172644272696467653a2077726f6e672072656d6f746520746f6b60448201527f656e20666f72204f7074696d69736d204d696e7461626c65204552433230206c60648201527f6f63616c20746f6b656e00000000000000000000000000000000000000000000608482015260a401610214565b6040517f9dc29fac00000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff868116600483015260248201859052881690639dc29fac90604401600060405180830381600087803b158015611e2157600080fd5b505af1158015611e35573d6000803e3d6000fd5b50505050611ed2565b611e6073ffffffffffffffffffffffffffffffffffffffff881686308661243f565b73ffffffffffffffffffffffffffffffffffffffff8088166000908152600260209081526040808320938a1683529290522054611e9e908490612ede565b73ffffffffffffffffffffffffffffffffffffffff8089166000908152600260209081526040808320938b16835292905220555b611ee087878787878661249d565b60035460045460405173ffffffffffffffffffffffffffffffffffffffff92831692633dbb202b9216907f0166a07a0000000000000000000000000000000000000000000000000000000090611f44908b908d908c908c908c908b90602401612ef6565b604080517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe08184030181529181526020820180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff167fffffffff000000000000000000000000000000000000000000000000000000009485161790525160e085901b9092168252611fd792918790600401612e42565b600060405180830381600087803b158015611ff157600080fd5b505af1158015612005573d6000803e3d6000fd5b5050505050505050505050565b6109c987878787878787611c59565b600054610100900460ff166120b8576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602b60248201527f496e697469616c697a61626c653a20636f6e7472616374206973206e6f74206960448201527f6e697469616c697a696e670000000000000000000000000000000000000000006064820152608401610214565b6003805473ffffffffffffffffffffffffffffffffffffffff9384167fffffffffffffffffffffffff00000000000000000000000000000000000000009182161790915560048054929093169116179055565b8273ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff167f35d79ab81f2b2017e19afb5c5571778877782d7a8786f5907f93b0f4702f4f23848460405161216a929190612ec5565b60405180910390a36105b28484848461252b565b60006121898361258a565b801561219a575061219a83836125ee565b9392505050565b6000612203826040518060400160405280602081526020017f5361666545524332303a206c6f772d6c6576656c2063616c6c206661696c65648152508573ffffffffffffffffffffffffffffffffffffffff166126bd9092919063ffffffff16565b805190915015610aa457808060200190518101906122219190612dd7565b610aa4576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602a60248201527f5361666545524332303a204552433230206f7065726174696f6e20646964206e60448201527f6f742073756363656564000000000000000000000000000000000000000000006064820152608401610214565b8373ffffffffffffffffffffffffffffffffffffffff168573ffffffffffffffffffffffffffffffffffffffff168773ffffffffffffffffffffffffffffffffffffffff167fd59c65b35445225835c83f50b6ede06a7be047d22e357073e250d9af537518cd86868660405161232593929190612e87565b60405180910390a4505050505050565b603354604080517f4397dfef0000000000000000000000000000000000000000000000000000000081528151600093849373ffffffffffffffffffffffffffffffffffffffff90911692634397dfef92600480830193928290030181865afa1580156123a5573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906123c99190612f51565b90939092509050565b8273ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff167f31b2166ff604fc5672ea5df08a78081d2bc6d746cadce880747f3643d819e83d8484604051612431929190612ec5565b60405180910390a350505050565b60405173ffffffffffffffffffffffffffffffffffffffff808516602483015283166044820152606481018290526105b29085907f23b872dd0000000000000000000000000000000000000000000000000000000090608401611a7d565b8373ffffffffffffffffffffffffffffffffffffffff168573ffffffffffffffffffffffffffffffffffffffff168773ffffffffffffffffffffffffffffffffffffffff167f718594027abd4eaed59f95162563e0cc6d0e8d5b86b1c7be8b1b0ac3343d039686868660405161251593929190612e87565b60405180910390a46110138686868686866126d4565b8273ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff167f2849b43074093a05396b6f2a937dee8565b15a48a7b3d4bffb732a5017380af58484604051612431929190612ec5565b60006125b6827f01ffc9a7000000000000000000000000000000000000000000000000000000006125ee565b801561190557506125e7827fffffffff000000000000000000000000000000000000000000000000000000006125ee565b1592915050565b604080517fffffffff000000000000000000000000000000000000000000000000000000008316602480830191909152825180830390910181526044909101909152602080820180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff167f01ffc9a700000000000000000000000000000000000000000000000000000000178152825160009392849283928392918391908a617530fa92503d915060005190508280156126a6575060208210155b80156126b25750600081115b979650505050505050565b60606126cc848460008561274c565b949350505050565b8373ffffffffffffffffffffffffffffffffffffffff168573ffffffffffffffffffffffffffffffffffffffff168773ffffffffffffffffffffffffffffffffffffffff167f7ff126db8024424bbfd9826e8ab82ff59136289ea440b04b39a0df1b03b9cabf86868660405161232593929190612e87565b6060824710156127de576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602660248201527f416464726573733a20696e73756666696369656e742062616c616e636520666f60448201527f722063616c6c00000000000000000000000000000000000000000000000000006064820152608401610214565b73ffffffffffffffffffffffffffffffffffffffff85163b61285c576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601d60248201527f416464726573733a2063616c6c20746f206e6f6e2d636f6e74726163740000006044820152606401610214565b6000808673ffffffffffffffffffffffffffffffffffffffff1685876040516128859190612f86565b60006040518083038185875af1925050503d80600081146128c2576040519150601f19603f3d011682016040523d82523d6000602084013e6128c7565b606091505b50915091506126b2828286606083156128e157508161219a565b8251156128f15782518084602001fd5b816040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016102149190612bf7565b73ffffffffffffffffffffffffffffffffffffffff8116811461294757600080fd5b50565b60008083601f84011261295c57600080fd5b50813567ffffffffffffffff81111561297457600080fd5b60208301915083602082850101111561298c57600080fd5b9250929050565b600080600080600080600060c0888a0312156129ae57600080fd5b87356129b981612925565b965060208801356129c981612925565b955060408801356129d981612925565b945060608801356129e981612925565b93506080880135925060a088013567ffffffffffffffff811115612a0c57600080fd5b612a188a828b0161294a565b989b979a50959850939692959293505050565b803563ffffffff81168114612a3f57600080fd5b919050565b600080600060408486031215612a5957600080fd5b612a6284612a2b565b9250602084013567ffffffffffffffff811115612a7e57600080fd5b612a8a8682870161294a565b9497909650939450505050565b600080600080600060808688031215612aaf57600080fd5b8535612aba81612925565b94506020860135612aca81612925565b935060408601359250606086013567ffffffffffffffff811115612aed57600080fd5b612af98882890161294a565b969995985093965092949392505050565b600080600080600080600060c0888a031215612b2557600080fd5b8735612b3081612925565b96506020880135612b4081612925565b95506040880135612b5081612925565b945060608801359350612b6560808901612a2b565b925060a088013567ffffffffffffffff811115612a0c57600080fd5b60005b83811015612b9c578181015183820152602001612b84565b838111156105b25750506000910152565b60008151808452612bc5816020860160208601612b81565b601f017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0169290920160200192915050565b60208152600061219a6020830184612bad565b60008060008060008060a08789031215612c2357600080fd5b8635612c2e81612925565b95506020870135612c3e81612925565b945060408701359350612c5360608801612a2b565b9250608087013567ffffffffffffffff811115612c6f57600080fd5b612c7b89828a0161294a565b979a9699509497509295939492505050565b60008060408385031215612ca057600080fd5b8235612cab81612925565b91506020830135612cbb81612925565b809150509250929050565b60008060008060608587031215612cdc57600080fd5b8435612ce781612925565b9350612cf560208601612a2b565b9250604085013567ffffffffffffffff811115612d1157600080fd5b612d1d8782880161294a565b95989497509550505050565b600080600060608486031215612d3e57600080fd5b8335612d4981612925565b92506020840135612d5981612925565b91506040840135612d6981612925565b809150509250925092565b600060208284031215612d8657600080fd5b815161219a81612925565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b600082821015612dd257612dd2612d91565b500390565b600060208284031215612de957600080fd5b8151801515811461219a57600080fd5b600073ffffffffffffffffffffffffffffffffffffffff808716835280861660208401525083604083015260806060830152612e386080830184612bad565b9695505050505050565b73ffffffffffffffffffffffffffffffffffffffff84168152606060208201526000612e716060830185612bad565b905063ffffffff83166040830152949350505050565b73ffffffffffffffffffffffffffffffffffffffff84168152826020820152606060408201526000612ebc6060830184612bad565b95945050505050565b8281526040602082015260006126cc6040830184612bad565b60008219821115612ef157612ef1612d91565b500190565b600073ffffffffffffffffffffffffffffffffffffffff80891683528088166020840152808716604084015280861660608401525083608083015260c060a0830152612f4560c0830184612bad565b98975050505050505050565b60008060408385031215612f6457600080fd5b8251612f6f81612925565b602084015190925060ff81168114612cbb57600080fd5b60008251612f98818460208701612b81565b919091019291505056fea164736f6c634300080f000a", - "deployedCode": "0x6080604052600436106101845760003560e01c80637f46ddb2116100d65780639a2ac6d51161007f578063c0c53b8b11610059578063c0c53b8b14610529578063c89701a214610549578063e11013dd1461057657600080fd5b80639a2ac6d5146104e3578063a9f9e675146104f6578063b1a1a8821461051657600080fd5b80638f601f66116100b05780638f601f661461047257806391c49bf814610407578063927ede2d146104b857600080fd5b80637f46ddb214610407578063838b252014610432578063870876231461045257600080fd5b806335e80ab31161013857806354fd4d501161011257806354fd4d501461036c57806358a997f6146103c25780635c975abb146103e257600080fd5b806335e80ab3146102f25780633cb747bf1461031f578063540abf731461034c57600080fd5b80631532ec34116101695780631532ec34146102755780631635f5fd1461028857806333d7e2bd1461029b57600080fd5b80630166a07a1461024257806309fc88431461026257600080fd5b3661023d57333b1561021d576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152603760248201527f5374616e646172644272696467653a2066756e6374696f6e2063616e206f6e6c60448201527f792062652063616c6c65642066726f6d20616e20454f4100000000000000000060648201526084015b60405180910390fd5b61023b333362030d40604051806020016040528060008152506105a5565b005b600080fd5b34801561024e57600080fd5b5061023b61025d366004612993565b6105b8565b61023b610270366004612a44565b6109d2565b61023b610283366004612a97565b610aa9565b61023b610296366004612a97565b610abd565b3480156102a757600080fd5b506033546102c89073ffffffffffffffffffffffffffffffffffffffff1681565b60405173ffffffffffffffffffffffffffffffffffffffff90911681526020015b60405180910390f35b3480156102fe57600080fd5b506032546102c89073ffffffffffffffffffffffffffffffffffffffff1681565b34801561032b57600080fd5b506003546102c89073ffffffffffffffffffffffffffffffffffffffff1681565b34801561035857600080fd5b5061023b610367366004612b0a565b61101b565b34801561037857600080fd5b506103b56040518060400160405280600581526020017f322e322e3000000000000000000000000000000000000000000000000000000081525081565b6040516102e99190612bf7565b3480156103ce57600080fd5b5061023b6103dd366004612c0a565b611060565b3480156103ee57600080fd5b506103f7611134565b60405190151581526020016102e9565b34801561041357600080fd5b5060045473ffffffffffffffffffffffffffffffffffffffff166102c8565b34801561043e57600080fd5b5061023b61044d366004612b0a565b6111cd565b34801561045e57600080fd5b5061023b61046d366004612c0a565b611212565b34801561047e57600080fd5b506104aa61048d366004612c8d565b600260209081526000928352604080842090915290825290205481565b6040519081526020016102e9565b3480156104c457600080fd5b5060035473ffffffffffffffffffffffffffffffffffffffff166102c8565b61023b6104f1366004612cc6565b6112e6565b34801561050257600080fd5b5061023b610511366004612993565b611328565b61023b610524366004612a44565b611337565b34801561053557600080fd5b5061023b610544366004612d29565b611408565b34801561055557600080fd5b506004546102c89073ffffffffffffffffffffffffffffffffffffffff1681565b61023b610584366004612cc6565b611607565b73ffffffffffffffffffffffffffffffffffffffff163b151590565b6105b2848434858561164a565b50505050565b60035473ffffffffffffffffffffffffffffffffffffffff163314801561068b575060048054600354604080517f6e296e45000000000000000000000000000000000000000000000000000000008152905173ffffffffffffffffffffffffffffffffffffffff938416949390921692636e296e459282820192602092908290030181865afa15801561064f573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906106739190612d74565b73ffffffffffffffffffffffffffffffffffffffff16145b61073d576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152604160248201527f5374616e646172644272696467653a2066756e6374696f6e2063616e206f6e6c60448201527f792062652063616c6c65642066726f6d20746865206f7468657220627269646760648201527f6500000000000000000000000000000000000000000000000000000000000000608482015260a401610214565b610745611134565b156107ac576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601660248201527f5374616e646172644272696467653a20706175736564000000000000000000006044820152606401610214565b6107b5876118a9565b15610903576107c4878761190b565b610876576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152604a60248201527f5374616e646172644272696467653a2077726f6e672072656d6f746520746f6b60448201527f656e20666f72204f7074696d69736d204d696e7461626c65204552433230206c60648201527f6f63616c20746f6b656e00000000000000000000000000000000000000000000608482015260a401610214565b6040517f40c10f1900000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff8581166004830152602482018590528816906340c10f1990604401600060405180830381600087803b1580156108e657600080fd5b505af11580156108fa573d6000803e3d6000fd5b50505050610985565b73ffffffffffffffffffffffffffffffffffffffff8088166000908152600260209081526040808320938a1683529290522054610941908490612dc0565b73ffffffffffffffffffffffffffffffffffffffff8089166000818152600260209081526040808320948c1683529390529190912091909155610985908585611a2b565b6109c9878787878787878080601f016020809104026020016040519081016040528093929190818152602001838380828437600092019190915250611aff92505050565b50505050505050565b333b15610a61576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152603760248201527f5374616e646172644272696467653a2066756e6374696f6e2063616e206f6e6c60448201527f792062652063616c6c65642066726f6d20616e20454f410000000000000000006064820152608401610214565b610aa43333348686868080601f01602080910402602001604051908101604052809392919081815260200183838082843760009201919091525061164a92505050565b505050565b610ab68585858585610abd565b5050505050565b60035473ffffffffffffffffffffffffffffffffffffffff1633148015610b90575060048054600354604080517f6e296e45000000000000000000000000000000000000000000000000000000008152905173ffffffffffffffffffffffffffffffffffffffff938416949390921692636e296e459282820192602092908290030181865afa158015610b54573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610b789190612d74565b73ffffffffffffffffffffffffffffffffffffffff16145b610c42576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152604160248201527f5374616e646172644272696467653a2066756e6374696f6e2063616e206f6e6c60448201527f792062652063616c6c65642066726f6d20746865206f7468657220627269646760648201527f6500000000000000000000000000000000000000000000000000000000000000608482015260a401610214565b610c4a611134565b15610cb1576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601660248201527f5374616e646172644272696467653a20706175736564000000000000000000006044820152606401610214565b610cb9611b8d565b15610d46576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152603760248201527f5374616e646172644272696467653a2063616e6e6f742062726964676520455460448201527f48207769746820637573746f6d2067617320746f6b656e0000000000000000006064820152608401610214565b823414610dd5576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152603a60248201527f5374616e646172644272696467653a20616d6f756e742073656e7420646f657360448201527f206e6f74206d6174636820616d6f756e742072657175697265640000000000006064820152608401610214565b3073ffffffffffffffffffffffffffffffffffffffff851603610e7a576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602360248201527f5374616e646172644272696467653a2063616e6e6f742073656e6420746f207360448201527f656c6600000000000000000000000000000000000000000000000000000000006064820152608401610214565b60035473ffffffffffffffffffffffffffffffffffffffff90811690851603610f25576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602860248201527f5374616e646172644272696467653a2063616e6e6f742073656e6420746f206d60448201527f657373656e6765720000000000000000000000000000000000000000000000006064820152608401610214565b610f6785858585858080601f016020809104026020016040519081016040528093929190818152602001838380828437600092019190915250611bcc92505050565b6000610f84855a8660405180602001604052806000815250611c3f565b905080611013576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602360248201527f5374616e646172644272696467653a20455448207472616e736665722066616960448201527f6c656400000000000000000000000000000000000000000000000000000000006064820152608401610214565b505050505050565b6109c987873388888888888080601f016020809104026020016040519081016040528093929190818152602001838380828437600092019190915250611c5992505050565b333b156110ef576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152603760248201527f5374616e646172644272696467653a2066756e6374696f6e2063616e206f6e6c60448201527f792062652063616c6c65642066726f6d20616e20454f410000000000000000006064820152608401610214565b61101386863333888888888080601f01602080910402602001604051908101604052809392919081815260200183838082843760009201919091525061201292505050565b603254604080517f5c975abb000000000000000000000000000000000000000000000000000000008152905160009273ffffffffffffffffffffffffffffffffffffffff1691635c975abb9160048083019260209291908290030181865afa1580156111a4573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906111c89190612dd7565b905090565b6109c987873388888888888080601f01602080910402602001604051908101604052809392919081815260200183838082843760009201919091525061201292505050565b333b156112a1576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152603760248201527f5374616e646172644272696467653a2066756e6374696f6e2063616e206f6e6c60448201527f792062652063616c6c65642066726f6d20616e20454f410000000000000000006064820152608401610214565b61101386863333888888888080601f016020809104026020016040519081016040528093929190818152602001838380828437600092019190915250611c5992505050565b6105b233858585858080601f0160208091040260200160405190810160405280939291908181526020018383808284376000920191909152506105a592505050565b6109c9878787878787876105b8565b333b156113c6576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152603760248201527f5374616e646172644272696467653a2066756e6374696f6e2063616e206f6e6c60448201527f792062652063616c6c65642066726f6d20616e20454f410000000000000000006064820152608401610214565b610aa433338585858080601f0160208091040260200160405190810160405280939291908181526020018383808284376000920191909152506105a592505050565b600054610100900460ff16158080156114285750600054600160ff909116105b806114425750303b158015611442575060005460ff166001145b6114ce576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602e60248201527f496e697469616c697a61626c653a20636f6e747261637420697320616c72656160448201527f647920696e697469616c697a65640000000000000000000000000000000000006064820152608401610214565b600080547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00166001179055801561152c57600080547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00ff166101001790555b6032805473ffffffffffffffffffffffffffffffffffffffff8086167fffffffffffffffffffffffff000000000000000000000000000000000000000092831617909255603380549285169290911691909117905561159f84734200000000000000000000000000000000000010612021565b80156105b257600080547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00ff169055604051600181527f7f26b83ff96e1f2b6a682f133852f6798a09c465da95921460cefb38474024989060200160405180910390a150505050565b6105b23385348686868080601f01602080910402602001604051908101604052809392919081815260200183838082843760009201919091525061164a92505050565b611652611b8d565b156116df576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152603760248201527f5374616e646172644272696467653a2063616e6e6f742062726964676520455460448201527f48207769746820637573746f6d2067617320746f6b656e0000000000000000006064820152608401610214565b82341461176e576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152603e60248201527f5374616e646172644272696467653a206272696467696e6720455448206d757360448201527f7420696e636c7564652073756666696369656e74204554482076616c756500006064820152608401610214565b61177a8585858461210b565b60035460045460405173ffffffffffffffffffffffffffffffffffffffff92831692633dbb202b9287929116907f1635f5fd00000000000000000000000000000000000000000000000000000000906117dd908b908b9086908a90602401612df9565b604080517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe08184030181529181526020820180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff167fffffffff000000000000000000000000000000000000000000000000000000009485161790525160e086901b909216825261187092918890600401612e42565b6000604051808303818588803b15801561188957600080fd5b505af115801561189d573d6000803e3d6000fd5b50505050505050505050565b60006118d5827f1d1d8b630000000000000000000000000000000000000000000000000000000061217e565b806119055750611905827fec4fc8e30000000000000000000000000000000000000000000000000000000061217e565b92915050565b6000611937837f1d1d8b630000000000000000000000000000000000000000000000000000000061217e565b156119e0578273ffffffffffffffffffffffffffffffffffffffff1663c01e1bd66040518163ffffffff1660e01b8152600401602060405180830381865afa158015611987573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906119ab9190612d74565b73ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff16149050611905565b8273ffffffffffffffffffffffffffffffffffffffff1663d6c0b2c46040518163ffffffff1660e01b8152600401602060405180830381865afa158015611987573d6000803e3d6000fd5b60405173ffffffffffffffffffffffffffffffffffffffff8316602482015260448101829052610aa49084907fa9059cbb00000000000000000000000000000000000000000000000000000000906064015b604080517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe08184030181529190526020810180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff167fffffffff00000000000000000000000000000000000000000000000000000000909316929092179091526121a1565b8373ffffffffffffffffffffffffffffffffffffffff168573ffffffffffffffffffffffffffffffffffffffff168773ffffffffffffffffffffffffffffffffffffffff167f3ceee06c1e37648fcbb6ed52e17b3e1f275a1f8c7b22a84b2b84732431e046b3868686604051611b7793929190612e87565b60405180910390a46110138686868686866122ad565b600080611b98612335565b5073ffffffffffffffffffffffffffffffffffffffff1673eeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeee141592915050565b8273ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff167f2ac69ee804d9a7a0984249f508dfab7cb2534b465b6ce1580f99a38ba9c5e6318484604051611c2b929190612ec5565b60405180910390a36105b2848484846123d2565b600080600080845160208601878a8af19695505050505050565b3415611ce7576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602160248201527f5374616e646172644272696467653a2063616e6e6f742073656e642076616c7560448201527f65000000000000000000000000000000000000000000000000000000000000006064820152608401610214565b611cf0876118a9565b15611e3e57611cff878761190b565b611db1576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152604a60248201527f5374616e646172644272696467653a2077726f6e672072656d6f746520746f6b60448201527f656e20666f72204f7074696d69736d204d696e7461626c65204552433230206c60648201527f6f63616c20746f6b656e00000000000000000000000000000000000000000000608482015260a401610214565b6040517f9dc29fac00000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff868116600483015260248201859052881690639dc29fac90604401600060405180830381600087803b158015611e2157600080fd5b505af1158015611e35573d6000803e3d6000fd5b50505050611ed2565b611e6073ffffffffffffffffffffffffffffffffffffffff881686308661243f565b73ffffffffffffffffffffffffffffffffffffffff8088166000908152600260209081526040808320938a1683529290522054611e9e908490612ede565b73ffffffffffffffffffffffffffffffffffffffff8089166000908152600260209081526040808320938b16835292905220555b611ee087878787878661249d565b60035460045460405173ffffffffffffffffffffffffffffffffffffffff92831692633dbb202b9216907f0166a07a0000000000000000000000000000000000000000000000000000000090611f44908b908d908c908c908c908b90602401612ef6565b604080517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe08184030181529181526020820180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff167fffffffff000000000000000000000000000000000000000000000000000000009485161790525160e085901b9092168252611fd792918790600401612e42565b600060405180830381600087803b158015611ff157600080fd5b505af1158015612005573d6000803e3d6000fd5b5050505050505050505050565b6109c987878787878787611c59565b600054610100900460ff166120b8576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602b60248201527f496e697469616c697a61626c653a20636f6e7472616374206973206e6f74206960448201527f6e697469616c697a696e670000000000000000000000000000000000000000006064820152608401610214565b6003805473ffffffffffffffffffffffffffffffffffffffff9384167fffffffffffffffffffffffff00000000000000000000000000000000000000009182161790915560048054929093169116179055565b8273ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff167f35d79ab81f2b2017e19afb5c5571778877782d7a8786f5907f93b0f4702f4f23848460405161216a929190612ec5565b60405180910390a36105b28484848461252b565b60006121898361258a565b801561219a575061219a83836125ee565b9392505050565b6000612203826040518060400160405280602081526020017f5361666545524332303a206c6f772d6c6576656c2063616c6c206661696c65648152508573ffffffffffffffffffffffffffffffffffffffff166126bd9092919063ffffffff16565b805190915015610aa457808060200190518101906122219190612dd7565b610aa4576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602a60248201527f5361666545524332303a204552433230206f7065726174696f6e20646964206e60448201527f6f742073756363656564000000000000000000000000000000000000000000006064820152608401610214565b8373ffffffffffffffffffffffffffffffffffffffff168573ffffffffffffffffffffffffffffffffffffffff168773ffffffffffffffffffffffffffffffffffffffff167fd59c65b35445225835c83f50b6ede06a7be047d22e357073e250d9af537518cd86868660405161232593929190612e87565b60405180910390a4505050505050565b603354604080517f4397dfef0000000000000000000000000000000000000000000000000000000081528151600093849373ffffffffffffffffffffffffffffffffffffffff90911692634397dfef92600480830193928290030181865afa1580156123a5573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906123c99190612f51565b90939092509050565b8273ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff167f31b2166ff604fc5672ea5df08a78081d2bc6d746cadce880747f3643d819e83d8484604051612431929190612ec5565b60405180910390a350505050565b60405173ffffffffffffffffffffffffffffffffffffffff808516602483015283166044820152606481018290526105b29085907f23b872dd0000000000000000000000000000000000000000000000000000000090608401611a7d565b8373ffffffffffffffffffffffffffffffffffffffff168573ffffffffffffffffffffffffffffffffffffffff168773ffffffffffffffffffffffffffffffffffffffff167f718594027abd4eaed59f95162563e0cc6d0e8d5b86b1c7be8b1b0ac3343d039686868660405161251593929190612e87565b60405180910390a46110138686868686866126d4565b8273ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff167f2849b43074093a05396b6f2a937dee8565b15a48a7b3d4bffb732a5017380af58484604051612431929190612ec5565b60006125b6827f01ffc9a7000000000000000000000000000000000000000000000000000000006125ee565b801561190557506125e7827fffffffff000000000000000000000000000000000000000000000000000000006125ee565b1592915050565b604080517fffffffff000000000000000000000000000000000000000000000000000000008316602480830191909152825180830390910181526044909101909152602080820180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff167f01ffc9a700000000000000000000000000000000000000000000000000000000178152825160009392849283928392918391908a617530fa92503d915060005190508280156126a6575060208210155b80156126b25750600081115b979650505050505050565b60606126cc848460008561274c565b949350505050565b8373ffffffffffffffffffffffffffffffffffffffff168573ffffffffffffffffffffffffffffffffffffffff168773ffffffffffffffffffffffffffffffffffffffff167f7ff126db8024424bbfd9826e8ab82ff59136289ea440b04b39a0df1b03b9cabf86868660405161232593929190612e87565b6060824710156127de576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602660248201527f416464726573733a20696e73756666696369656e742062616c616e636520666f60448201527f722063616c6c00000000000000000000000000000000000000000000000000006064820152608401610214565b73ffffffffffffffffffffffffffffffffffffffff85163b61285c576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601d60248201527f416464726573733a2063616c6c20746f206e6f6e2d636f6e74726163740000006044820152606401610214565b6000808673ffffffffffffffffffffffffffffffffffffffff1685876040516128859190612f86565b60006040518083038185875af1925050503d80600081146128c2576040519150601f19603f3d011682016040523d82523d6000602084013e6128c7565b606091505b50915091506126b2828286606083156128e157508161219a565b8251156128f15782518084602001fd5b816040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016102149190612bf7565b73ffffffffffffffffffffffffffffffffffffffff8116811461294757600080fd5b50565b60008083601f84011261295c57600080fd5b50813567ffffffffffffffff81111561297457600080fd5b60208301915083602082850101111561298c57600080fd5b9250929050565b600080600080600080600060c0888a0312156129ae57600080fd5b87356129b981612925565b965060208801356129c981612925565b955060408801356129d981612925565b945060608801356129e981612925565b93506080880135925060a088013567ffffffffffffffff811115612a0c57600080fd5b612a188a828b0161294a565b989b979a50959850939692959293505050565b803563ffffffff81168114612a3f57600080fd5b919050565b600080600060408486031215612a5957600080fd5b612a6284612a2b565b9250602084013567ffffffffffffffff811115612a7e57600080fd5b612a8a8682870161294a565b9497909650939450505050565b600080600080600060808688031215612aaf57600080fd5b8535612aba81612925565b94506020860135612aca81612925565b935060408601359250606086013567ffffffffffffffff811115612aed57600080fd5b612af98882890161294a565b969995985093965092949392505050565b600080600080600080600060c0888a031215612b2557600080fd5b8735612b3081612925565b96506020880135612b4081612925565b95506040880135612b5081612925565b945060608801359350612b6560808901612a2b565b925060a088013567ffffffffffffffff811115612a0c57600080fd5b60005b83811015612b9c578181015183820152602001612b84565b838111156105b25750506000910152565b60008151808452612bc5816020860160208601612b81565b601f017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0169290920160200192915050565b60208152600061219a6020830184612bad565b60008060008060008060a08789031215612c2357600080fd5b8635612c2e81612925565b95506020870135612c3e81612925565b945060408701359350612c5360608801612a2b565b9250608087013567ffffffffffffffff811115612c6f57600080fd5b612c7b89828a0161294a565b979a9699509497509295939492505050565b60008060408385031215612ca057600080fd5b8235612cab81612925565b91506020830135612cbb81612925565b809150509250929050565b60008060008060608587031215612cdc57600080fd5b8435612ce781612925565b9350612cf560208601612a2b565b9250604085013567ffffffffffffffff811115612d1157600080fd5b612d1d8782880161294a565b95989497509550505050565b600080600060608486031215612d3e57600080fd5b8335612d4981612925565b92506020840135612d5981612925565b91506040840135612d6981612925565b809150509250925092565b600060208284031215612d8657600080fd5b815161219a81612925565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b600082821015612dd257612dd2612d91565b500390565b600060208284031215612de957600080fd5b8151801515811461219a57600080fd5b600073ffffffffffffffffffffffffffffffffffffffff808716835280861660208401525083604083015260806060830152612e386080830184612bad565b9695505050505050565b73ffffffffffffffffffffffffffffffffffffffff84168152606060208201526000612e716060830185612bad565b905063ffffffff83166040830152949350505050565b73ffffffffffffffffffffffffffffffffffffffff84168152826020820152606060408201526000612ebc6060830184612bad565b95945050505050565b8281526040602082015260006126cc6040830184612bad565b60008219821115612ef157612ef1612d91565b500190565b600073ffffffffffffffffffffffffffffffffffffffff80891683528088166020840152808716604084015280861660608401525083608083015260c060a0830152612f4560c0830184612bad565b98975050505050505050565b60008060408385031215612f6457600080fd5b8251612f6f81612925565b602084015190925060ff81168114612cbb57600080fd5b60008251612f98818460208701612b81565b919091019291505056fea164736f6c634300080f000a", - "initialized": true, - "kind": "Create", - "newBalance": 0, - "oldBalance": 0, - "reverted": false, - "storageAccesses": [ - { - "account": "0x04c50B398Cd4182428E79f7186b7C919cF17e86F", - "isWrite": false, - "newValue": "0x0000000000000000000000000000000000000000000000000000000000000000", - "previousValue": "0x0000000000000000000000000000000000000000000000000000000000000000", - "reverted": false, - "slot": "0x0000000000000000000000000000000000000000000000000000000000000000" - }, - { - "account": "0x04c50B398Cd4182428E79f7186b7C919cF17e86F", - "isWrite": false, - "newValue": "0x0000000000000000000000000000000000000000000000000000000000000000", - "previousValue": "0x0000000000000000000000000000000000000000000000000000000000000000", - "reverted": false, - "slot": "0x0000000000000000000000000000000000000000000000000000000000000000" - }, - { - "account": "0x04c50B398Cd4182428E79f7186b7C919cF17e86F", - "isWrite": false, - "newValue": "0x0000000000000000000000000000000000000000000000000000000000000000", - "previousValue": "0x0000000000000000000000000000000000000000000000000000000000000000", - "reverted": false, - "slot": "0x0000000000000000000000000000000000000000000000000000000000000000" - }, - { - "account": "0x04c50B398Cd4182428E79f7186b7C919cF17e86F", - "isWrite": true, - "newValue": "0x0000000000000000000000000000000000000000000000000000000000000001", - "previousValue": "0x0000000000000000000000000000000000000000000000000000000000000000", - "reverted": false, - "slot": "0x0000000000000000000000000000000000000000000000000000000000000000" - }, - { - "account": "0x04c50B398Cd4182428E79f7186b7C919cF17e86F", - "isWrite": false, - "newValue": "0x0000000000000000000000000000000000000000000000000000000000000001", - "previousValue": "0x0000000000000000000000000000000000000000000000000000000000000001", - "reverted": false, - "slot": "0x0000000000000000000000000000000000000000000000000000000000000000" - }, - { - "account": "0x04c50B398Cd4182428E79f7186b7C919cF17e86F", - "isWrite": true, - "newValue": "0x0000000000000000000000000000000000000000000000000000000000000101", - "previousValue": "0x0000000000000000000000000000000000000000000000000000000000000001", - "reverted": false, - "slot": "0x0000000000000000000000000000000000000000000000000000000000000000" - }, - { - "account": "0x04c50B398Cd4182428E79f7186b7C919cF17e86F", - "isWrite": false, - "newValue": "0x0000000000000000000000000000000000000000000000000000000000000000", - "previousValue": "0x0000000000000000000000000000000000000000000000000000000000000000", - "reverted": false, - "slot": "0x0000000000000000000000000000000000000000000000000000000000000032" - }, - { - "account": "0x04c50B398Cd4182428E79f7186b7C919cF17e86F", - "isWrite": true, - "newValue": "0x0000000000000000000000000000000000000000000000000000000000000000", - "previousValue": "0x0000000000000000000000000000000000000000000000000000000000000000", - "reverted": false, - "slot": "0x0000000000000000000000000000000000000000000000000000000000000032" - }, - { - "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", - "reverted": false, - "slot": "0x0000000000000000000000000000000000000000000000000000000000000000" - }, - { - "account": "0x04c50B398Cd4182428E79f7186b7C919cF17e86F", - "isWrite": false, - "newValue": "0x0000000000000000000000000000000000000000000000000000000000000000", - "previousValue": "0x0000000000000000000000000000000000000000000000000000000000000000", - "reverted": false, - "slot": "0x0000000000000000000000000000000000000000000000000000000000000003" - }, - { - "account": "0x04c50B398Cd4182428E79f7186b7C919cF17e86F", - "isWrite": true, - "newValue": "0x0000000000000000000000000000000000000000000000000000000000000000", - "previousValue": "0x0000000000000000000000000000000000000000000000000000000000000000", - "reverted": false, - "slot": "0x0000000000000000000000000000000000000000000000000000000000000003" - }, - { - "account": "0x04c50B398Cd4182428E79f7186b7C919cF17e86F", - "isWrite": false, - "newValue": "0x0000000000000000000000000000000000000000000000000000000000000000", - "previousValue": "0x0000000000000000000000000000000000000000000000000000000000000000", - "reverted": false, - "slot": "0x0000000000000000000000000000000000000000000000000000000000000004" - }, - { - "account": "0x04c50B398Cd4182428E79f7186b7C919cF17e86F", - "isWrite": true, - "newValue": "0x0000000000000000000000004200000000000000000000000000000000000010", - "previousValue": "0x0000000000000000000000000000000000000000000000000000000000000000", - "reverted": false, - "slot": "0x0000000000000000000000000000000000000000000000000000000000000004" - }, - { - "account": "0x04c50B398Cd4182428E79f7186b7C919cF17e86F", - "isWrite": false, - "newValue": "0x0000000000000000000000000000000000000000000000000000000000000101", - "previousValue": "0x0000000000000000000000000000000000000000000000000000000000000101", - "reverted": false, - "slot": "0x0000000000000000000000000000000000000000000000000000000000000000" - }, - { - "account": "0x04c50B398Cd4182428E79f7186b7C919cF17e86F", - "isWrite": true, - "newValue": "0x0000000000000000000000000000000000000000000000000000000000000001", - "previousValue": "0x0000000000000000000000000000000000000000000000000000000000000101", - "reverted": false, - "slot": "0x0000000000000000000000000000000000000000000000000000000000000000" - } - ], - "value": 0 - }, - { - "accessor": "0x7FA9385bE102ac3EAc297483Dd6233D62b3e1496", - "account": "0x7109709ECfa91a80626fF3989D68f67F5b1DD12D", - "chainInfo": { - "chainId": 31337, - "forkId": 0 - }, - "data": "0x", - "deployedCode": "0x", - "initialized": true, - "kind": "Resume", - "newBalance": 0, - "oldBalance": 0, - "reverted": false, - "storageAccesses": [], - "value": 0 - }, - { - "accessor": "0x1804c8AB1F12E6bbf3894d4083f33e07309d1f38", - "account": "0x04c50B398Cd4182428E79f7186b7C919cF17e86F", - "chainInfo": { - "chainId": 31337, - "forkId": 0 - }, - "data": "0x927ede2d", - "deployedCode": "0x", - "initialized": true, - "kind": "StaticCall", - "newBalance": 0, - "oldBalance": 0, - "reverted": false, - "storageAccesses": [ - { - "account": "0x04c50B398Cd4182428E79f7186b7C919cF17e86F", - "isWrite": false, - "newValue": "0x0000000000000000000000000000000000000000000000000000000000000000", - "previousValue": "0x0000000000000000000000000000000000000000000000000000000000000000", - "reverted": false, - "slot": "0x0000000000000000000000000000000000000000000000000000000000000003" - } - ], - "value": 0 - }, - { - "accessor": "0x1804c8AB1F12E6bbf3894d4083f33e07309d1f38", - "account": "0x04c50B398Cd4182428E79f7186b7C919cF17e86F", - "chainInfo": { - "chainId": 31337, - "forkId": 0 - }, - "data": "0x3cb747bf", - "deployedCode": "0x", - "initialized": true, - "kind": "StaticCall", - "newBalance": 0, - "oldBalance": 0, - "reverted": false, - "storageAccesses": [ - { - "account": "0x04c50B398Cd4182428E79f7186b7C919cF17e86F", - "isWrite": false, - "newValue": "0x0000000000000000000000000000000000000000000000000000000000000000", - "previousValue": "0x0000000000000000000000000000000000000000000000000000000000000000", - "reverted": false, - "slot": "0x0000000000000000000000000000000000000000000000000000000000000003" - } - ], - "value": 0 - }, - { - "accessor": "0x1804c8AB1F12E6bbf3894d4083f33e07309d1f38", - "account": "0x04c50B398Cd4182428E79f7186b7C919cF17e86F", - "chainInfo": { - "chainId": 31337, - "forkId": 0 - }, - "data": "0x7f46ddb2", - "deployedCode": "0x", - "initialized": true, - "kind": "StaticCall", - "newBalance": 0, - "oldBalance": 0, - "reverted": false, - "storageAccesses": [ - { - "account": "0x04c50B398Cd4182428E79f7186b7C919cF17e86F", - "isWrite": false, - "newValue": "0x0000000000000000000000004200000000000000000000000000000000000010", - "previousValue": "0x0000000000000000000000004200000000000000000000000000000000000010", - "reverted": false, - "slot": "0x0000000000000000000000000000000000000000000000000000000000000004" - } - ], - "value": 0 - }, - { - "accessor": "0x1804c8AB1F12E6bbf3894d4083f33e07309d1f38", - "account": "0x04c50B398Cd4182428E79f7186b7C919cF17e86F", - "chainInfo": { - "chainId": 31337, - "forkId": 0 - }, - "data": "0xc89701a2", - "deployedCode": "0x", - "initialized": true, - "kind": "StaticCall", - "newBalance": 0, - "oldBalance": 0, - "reverted": false, - "storageAccesses": [ - { - "account": "0x04c50B398Cd4182428E79f7186b7C919cF17e86F", - "isWrite": false, - "newValue": "0x0000000000000000000000004200000000000000000000000000000000000010", - "previousValue": "0x0000000000000000000000004200000000000000000000000000000000000010", - "reverted": false, - "slot": "0x0000000000000000000000000000000000000000000000000000000000000004" - } - ], - "value": 0 - }, - { - "accessor": "0x1804c8AB1F12E6bbf3894d4083f33e07309d1f38", - "account": "0x04c50B398Cd4182428E79f7186b7C919cF17e86F", - "chainInfo": { - "chainId": 31337, - "forkId": 0 - }, - "data": "0x35e80ab3", - "deployedCode": "0x", - "initialized": true, - "kind": "StaticCall", - "newBalance": 0, - "oldBalance": 0, - "reverted": false, - "storageAccesses": [ - { - "account": "0x04c50B398Cd4182428E79f7186b7C919cF17e86F", - "isWrite": false, - "newValue": "0x0000000000000000000000000000000000000000000000000000000000000000", - "previousValue": "0x0000000000000000000000000000000000000000000000000000000000000000", - "reverted": false, - "slot": "0x0000000000000000000000000000000000000000000000000000000000000032" - } - ], - "value": 0 - }, - { - "accessor": "0x7FA9385bE102ac3EAc297483Dd6233D62b3e1496", - "account": "0x7109709ECfa91a80626fF3989D68f67F5b1DD12D", - "chainInfo": { - "chainId": 31337, - "forkId": 0 - }, - "data": "0x", - "deployedCode": "0x", - "initialized": true, - "kind": "Resume", - "newBalance": 0, - "oldBalance": 0, - "reverted": false, - "storageAccesses": [], - "value": 0 - }, - { - "accessor": "0x7FA9385bE102ac3EAc297483Dd6233D62b3e1496", - "account": "0x7109709ECfa91a80626fF3989D68f67F5b1DD12D", - "chainInfo": { - "chainId": 31337, - "forkId": 0 - }, - "data": "0x", - "deployedCode": "0x", - "initialized": true, - "kind": "Resume", - "newBalance": 0, - "oldBalance": 0, - "reverted": false, - "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", - "chainInfo": { - "chainId": 31337, - "forkId": 0 - }, - "data": "0x60806040523480156200001157600080fd5b506200001f60008062000025565b62000234565b600054610100900460ff1615808015620000465750600054600160ff909116105b8062000076575062000063306200018a60201b62000b141760201c565b15801562000076575060005460ff166001145b620000df5760405162461bcd60e51b815260206004820152602e60248201527f496e697469616c697a61626c653a20636f6e747261637420697320616c72656160448201526d191e481a5b9a5d1a585b1a5e995960921b60648201526084015b60405180910390fd5b6000805460ff19166001179055801562000103576000805461ff0019166101001790555b603280546001600160a01b0319166001600160a01b0384161790556200013e8373420000000000000000000000000000000000001462000199565b801562000185576000805461ff0019169055604051600181527f7f26b83ff96e1f2b6a682f133852f6798a09c465da95921460cefb38474024989060200160405180910390a15b505050565b6001600160a01b03163b151590565b600054610100900460ff16620002065760405162461bcd60e51b815260206004820152602b60248201527f496e697469616c697a61626c653a20636f6e7472616374206973206e6f74206960448201526a6e697469616c697a696e6760a81b6064820152608401620000d6565b600180546001600160a01b039384166001600160a01b03199182161790915560028054929093169116179055565b6113e980620002446000396000f3fe608060405234801561001057600080fd5b50600436106100d45760003560e01c80635d93a3fc11610081578063927ede2d1161005b578063927ede2d14610231578063aa5574521461024f578063c89701a21461026257600080fd5b80635d93a3fc146101cc578063761f4493146102005780637f46ddb21461021357600080fd5b8063485cc955116100b2578063485cc9551461015857806354fd4d501461016b5780635c975abb146101b457600080fd5b806335e80ab3146100d95780633687011a146101235780633cb747bf14610138575b600080fd5b6032546100f99073ffffffffffffffffffffffffffffffffffffffff1681565b60405173ffffffffffffffffffffffffffffffffffffffff90911681526020015b60405180910390f35b610136610131366004610fe1565b610282565b005b6001546100f99073ffffffffffffffffffffffffffffffffffffffff1681565b610136610166366004611064565b61032e565b6101a76040518060400160405280600581526020017f322e312e3000000000000000000000000000000000000000000000000000000081525081565b60405161011a9190611108565b6101bc610518565b604051901515815260200161011a565b6101bc6101da366004611122565b603160209081526000938452604080852082529284528284209052825290205460ff1681565b61013661020e366004611163565b6105b1565b60025473ffffffffffffffffffffffffffffffffffffffff166100f9565b60015473ffffffffffffffffffffffffffffffffffffffff166100f9565b61013661025d3660046111fb565b610a58565b6002546100f99073ffffffffffffffffffffffffffffffffffffffff1681565b333b15610316576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602d60248201527f4552433732314272696467653a206163636f756e74206973206e6f742065787460448201527f65726e616c6c79206f776e65640000000000000000000000000000000000000060648201526084015b60405180910390fd5b6103268686333388888888610b30565b505050505050565b600054610100900460ff161580801561034e5750600054600160ff909116105b806103685750303b158015610368575060005460ff166001145b6103f4576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602e60248201527f496e697469616c697a61626c653a20636f6e747261637420697320616c72656160448201527f647920696e697469616c697a6564000000000000000000000000000000000000606482015260840161030d565b600080547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00166001179055801561045257600080547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00ff166101001790555b603280547fffffffffffffffffffffffff00000000000000000000000000000000000000001673ffffffffffffffffffffffffffffffffffffffff84161790556104b083734200000000000000000000000000000000000014610e70565b801561051357600080547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00ff169055604051600181527f7f26b83ff96e1f2b6a682f133852f6798a09c465da95921460cefb38474024989060200160405180910390a15b505050565b603254604080517f5c975abb000000000000000000000000000000000000000000000000000000008152905160009273ffffffffffffffffffffffffffffffffffffffff1691635c975abb9160048083019260209291908290030181865afa158015610588573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906105ac9190611272565b905090565b60015473ffffffffffffffffffffffffffffffffffffffff16331480156106865750600254600154604080517f6e296e45000000000000000000000000000000000000000000000000000000008152905173ffffffffffffffffffffffffffffffffffffffff9384169390921691636e296e45916004808201926020929091908290030181865afa15801561064a573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061066e9190611294565b73ffffffffffffffffffffffffffffffffffffffff16145b610712576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152603f60248201527f4552433732314272696467653a2066756e6374696f6e2063616e206f6e6c792060448201527f62652063616c6c65642066726f6d20746865206f746865722062726964676500606482015260840161030d565b61071a610518565b15610781576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601660248201527f4c314552433732314272696467653a2070617573656400000000000000000000604482015260640161030d565b3073ffffffffffffffffffffffffffffffffffffffff881603610826576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602a60248201527f4c314552433732314272696467653a206c6f63616c20746f6b656e2063616e6e60448201527f6f742062652073656c6600000000000000000000000000000000000000000000606482015260840161030d565b73ffffffffffffffffffffffffffffffffffffffff8088166000908152603160209081526040808320938a1683529281528282208683529052205460ff1615156001146108f5576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152603960248201527f4c314552433732314272696467653a20546f6b656e204944206973206e6f742060448201527f657363726f77656420696e20746865204c312042726964676500000000000000606482015260840161030d565b73ffffffffffffffffffffffffffffffffffffffff87811660008181526031602090815260408083208b8616845282528083208884529091529081902080547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00169055517f42842e0e000000000000000000000000000000000000000000000000000000008152306004820152918616602483015260448201859052906342842e0e90606401600060405180830381600087803b1580156109b557600080fd5b505af11580156109c9573d6000803e3d6000fd5b505050508473ffffffffffffffffffffffffffffffffffffffff168673ffffffffffffffffffffffffffffffffffffffff168873ffffffffffffffffffffffffffffffffffffffff167f1f39bf6707b5d608453e0ae4c067b562bcc4c85c0f562ef5d2c774d2e7f131ac87878787604051610a4794939291906112fa565b60405180910390a450505050505050565b73ffffffffffffffffffffffffffffffffffffffff8516610afb576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152603060248201527f4552433732314272696467653a206e667420726563697069656e742063616e6e60448201527f6f74206265206164647265737328302900000000000000000000000000000000606482015260840161030d565b610b0b8787338888888888610b30565b50505050505050565b73ffffffffffffffffffffffffffffffffffffffff163b151590565b73ffffffffffffffffffffffffffffffffffffffff8716610bd3576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152603160248201527f4c314552433732314272696467653a2072656d6f746520746f6b656e2063616e60448201527f6e6f742062652061646472657373283029000000000000000000000000000000606482015260840161030d565b600063761f449360e01b888a8989898888604051602401610bfa979695949392919061133a565b604080517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0818403018152918152602080830180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff167fffffffff00000000000000000000000000000000000000000000000000000000959095169490941790935273ffffffffffffffffffffffffffffffffffffffff8c81166000818152603186528381208e8416825286528381208b82529095529382902080547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0016600117905590517f23b872dd000000000000000000000000000000000000000000000000000000008152908a166004820152306024820152604481018890529092506323b872dd90606401600060405180830381600087803b158015610d3a57600080fd5b505af1158015610d4e573d6000803e3d6000fd5b50506001546002546040517f3dbb202b00000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff9283169450633dbb202b9350610db1929091169085908990600401611397565b600060405180830381600087803b158015610dcb57600080fd5b505af1158015610ddf573d6000803e3d6000fd5b505050508673ffffffffffffffffffffffffffffffffffffffff168873ffffffffffffffffffffffffffffffffffffffff168a73ffffffffffffffffffffffffffffffffffffffff167fb7460e2a880f256ebef3406116ff3eee0cee51ebccdc2a40698f87ebb2e9c1a589898888604051610e5d94939291906112fa565b60405180910390a4505050505050505050565b600054610100900460ff16610f07576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602b60248201527f496e697469616c697a61626c653a20636f6e7472616374206973206e6f74206960448201527f6e697469616c697a696e67000000000000000000000000000000000000000000606482015260840161030d565b6001805473ffffffffffffffffffffffffffffffffffffffff9384167fffffffffffffffffffffffff00000000000000000000000000000000000000009182161790915560028054929093169116179055565b73ffffffffffffffffffffffffffffffffffffffff81168114610f7c57600080fd5b50565b803563ffffffff81168114610f9357600080fd5b919050565b60008083601f840112610faa57600080fd5b50813567ffffffffffffffff811115610fc257600080fd5b602083019150836020828501011115610fda57600080fd5b9250929050565b60008060008060008060a08789031215610ffa57600080fd5b863561100581610f5a565b9550602087013561101581610f5a565b94506040870135935061102a60608801610f7f565b9250608087013567ffffffffffffffff81111561104657600080fd5b61105289828a01610f98565b979a9699509497509295939492505050565b6000806040838503121561107757600080fd5b823561108281610f5a565b9150602083013561109281610f5a565b809150509250929050565b6000815180845260005b818110156110c3576020818501810151868301820152016110a7565b818111156110d5576000602083870101525b50601f017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0169290920160200192915050565b60208152600061111b602083018461109d565b9392505050565b60008060006060848603121561113757600080fd5b833561114281610f5a565b9250602084013561115281610f5a565b929592945050506040919091013590565b600080600080600080600060c0888a03121561117e57600080fd5b873561118981610f5a565b9650602088013561119981610f5a565b955060408801356111a981610f5a565b945060608801356111b981610f5a565b93506080880135925060a088013567ffffffffffffffff8111156111dc57600080fd5b6111e88a828b01610f98565b989b979a50959850939692959293505050565b600080600080600080600060c0888a03121561121657600080fd5b873561122181610f5a565b9650602088013561123181610f5a565b9550604088013561124181610f5a565b94506060880135935061125660808901610f7f565b925060a088013567ffffffffffffffff8111156111dc57600080fd5b60006020828403121561128457600080fd5b8151801515811461111b57600080fd5b6000602082840312156112a657600080fd5b815161111b81610f5a565b8183528181602085013750600060208284010152600060207fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0601f840116840101905092915050565b73ffffffffffffffffffffffffffffffffffffffff851681528360208201526060604082015260006113306060830184866112b1565b9695505050505050565b600073ffffffffffffffffffffffffffffffffffffffff808a1683528089166020840152808816604084015280871660608401525084608083015260c060a083015261138a60c0830184866112b1565b9998505050505050505050565b73ffffffffffffffffffffffffffffffffffffffff841681526060602082015260006113c6606083018561109d565b905063ffffffff8316604083015294935050505056fea164736f6c634300080f000a", - "deployedCode": "0x608060405234801561001057600080fd5b50600436106100d45760003560e01c80635d93a3fc11610081578063927ede2d1161005b578063927ede2d14610231578063aa5574521461024f578063c89701a21461026257600080fd5b80635d93a3fc146101cc578063761f4493146102005780637f46ddb21461021357600080fd5b8063485cc955116100b2578063485cc9551461015857806354fd4d501461016b5780635c975abb146101b457600080fd5b806335e80ab3146100d95780633687011a146101235780633cb747bf14610138575b600080fd5b6032546100f99073ffffffffffffffffffffffffffffffffffffffff1681565b60405173ffffffffffffffffffffffffffffffffffffffff90911681526020015b60405180910390f35b610136610131366004610fe1565b610282565b005b6001546100f99073ffffffffffffffffffffffffffffffffffffffff1681565b610136610166366004611064565b61032e565b6101a76040518060400160405280600581526020017f322e312e3000000000000000000000000000000000000000000000000000000081525081565b60405161011a9190611108565b6101bc610518565b604051901515815260200161011a565b6101bc6101da366004611122565b603160209081526000938452604080852082529284528284209052825290205460ff1681565b61013661020e366004611163565b6105b1565b60025473ffffffffffffffffffffffffffffffffffffffff166100f9565b60015473ffffffffffffffffffffffffffffffffffffffff166100f9565b61013661025d3660046111fb565b610a58565b6002546100f99073ffffffffffffffffffffffffffffffffffffffff1681565b333b15610316576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602d60248201527f4552433732314272696467653a206163636f756e74206973206e6f742065787460448201527f65726e616c6c79206f776e65640000000000000000000000000000000000000060648201526084015b60405180910390fd5b6103268686333388888888610b30565b505050505050565b600054610100900460ff161580801561034e5750600054600160ff909116105b806103685750303b158015610368575060005460ff166001145b6103f4576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602e60248201527f496e697469616c697a61626c653a20636f6e747261637420697320616c72656160448201527f647920696e697469616c697a6564000000000000000000000000000000000000606482015260840161030d565b600080547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00166001179055801561045257600080547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00ff166101001790555b603280547fffffffffffffffffffffffff00000000000000000000000000000000000000001673ffffffffffffffffffffffffffffffffffffffff84161790556104b083734200000000000000000000000000000000000014610e70565b801561051357600080547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00ff169055604051600181527f7f26b83ff96e1f2b6a682f133852f6798a09c465da95921460cefb38474024989060200160405180910390a15b505050565b603254604080517f5c975abb000000000000000000000000000000000000000000000000000000008152905160009273ffffffffffffffffffffffffffffffffffffffff1691635c975abb9160048083019260209291908290030181865afa158015610588573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906105ac9190611272565b905090565b60015473ffffffffffffffffffffffffffffffffffffffff16331480156106865750600254600154604080517f6e296e45000000000000000000000000000000000000000000000000000000008152905173ffffffffffffffffffffffffffffffffffffffff9384169390921691636e296e45916004808201926020929091908290030181865afa15801561064a573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061066e9190611294565b73ffffffffffffffffffffffffffffffffffffffff16145b610712576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152603f60248201527f4552433732314272696467653a2066756e6374696f6e2063616e206f6e6c792060448201527f62652063616c6c65642066726f6d20746865206f746865722062726964676500606482015260840161030d565b61071a610518565b15610781576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601660248201527f4c314552433732314272696467653a2070617573656400000000000000000000604482015260640161030d565b3073ffffffffffffffffffffffffffffffffffffffff881603610826576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602a60248201527f4c314552433732314272696467653a206c6f63616c20746f6b656e2063616e6e60448201527f6f742062652073656c6600000000000000000000000000000000000000000000606482015260840161030d565b73ffffffffffffffffffffffffffffffffffffffff8088166000908152603160209081526040808320938a1683529281528282208683529052205460ff1615156001146108f5576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152603960248201527f4c314552433732314272696467653a20546f6b656e204944206973206e6f742060448201527f657363726f77656420696e20746865204c312042726964676500000000000000606482015260840161030d565b73ffffffffffffffffffffffffffffffffffffffff87811660008181526031602090815260408083208b8616845282528083208884529091529081902080547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00169055517f42842e0e000000000000000000000000000000000000000000000000000000008152306004820152918616602483015260448201859052906342842e0e90606401600060405180830381600087803b1580156109b557600080fd5b505af11580156109c9573d6000803e3d6000fd5b505050508473ffffffffffffffffffffffffffffffffffffffff168673ffffffffffffffffffffffffffffffffffffffff168873ffffffffffffffffffffffffffffffffffffffff167f1f39bf6707b5d608453e0ae4c067b562bcc4c85c0f562ef5d2c774d2e7f131ac87878787604051610a4794939291906112fa565b60405180910390a450505050505050565b73ffffffffffffffffffffffffffffffffffffffff8516610afb576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152603060248201527f4552433732314272696467653a206e667420726563697069656e742063616e6e60448201527f6f74206265206164647265737328302900000000000000000000000000000000606482015260840161030d565b610b0b8787338888888888610b30565b50505050505050565b73ffffffffffffffffffffffffffffffffffffffff163b151590565b73ffffffffffffffffffffffffffffffffffffffff8716610bd3576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152603160248201527f4c314552433732314272696467653a2072656d6f746520746f6b656e2063616e60448201527f6e6f742062652061646472657373283029000000000000000000000000000000606482015260840161030d565b600063761f449360e01b888a8989898888604051602401610bfa979695949392919061133a565b604080517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0818403018152918152602080830180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff167fffffffff00000000000000000000000000000000000000000000000000000000959095169490941790935273ffffffffffffffffffffffffffffffffffffffff8c81166000818152603186528381208e8416825286528381208b82529095529382902080547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0016600117905590517f23b872dd000000000000000000000000000000000000000000000000000000008152908a166004820152306024820152604481018890529092506323b872dd90606401600060405180830381600087803b158015610d3a57600080fd5b505af1158015610d4e573d6000803e3d6000fd5b50506001546002546040517f3dbb202b00000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff9283169450633dbb202b9350610db1929091169085908990600401611397565b600060405180830381600087803b158015610dcb57600080fd5b505af1158015610ddf573d6000803e3d6000fd5b505050508673ffffffffffffffffffffffffffffffffffffffff168873ffffffffffffffffffffffffffffffffffffffff168a73ffffffffffffffffffffffffffffffffffffffff167fb7460e2a880f256ebef3406116ff3eee0cee51ebccdc2a40698f87ebb2e9c1a589898888604051610e5d94939291906112fa565b60405180910390a4505050505050505050565b600054610100900460ff16610f07576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602b60248201527f496e697469616c697a61626c653a20636f6e7472616374206973206e6f74206960448201527f6e697469616c697a696e67000000000000000000000000000000000000000000606482015260840161030d565b6001805473ffffffffffffffffffffffffffffffffffffffff9384167fffffffffffffffffffffffff00000000000000000000000000000000000000009182161790915560028054929093169116179055565b73ffffffffffffffffffffffffffffffffffffffff81168114610f7c57600080fd5b50565b803563ffffffff81168114610f9357600080fd5b919050565b60008083601f840112610faa57600080fd5b50813567ffffffffffffffff811115610fc257600080fd5b602083019150836020828501011115610fda57600080fd5b9250929050565b60008060008060008060a08789031215610ffa57600080fd5b863561100581610f5a565b9550602087013561101581610f5a565b94506040870135935061102a60608801610f7f565b9250608087013567ffffffffffffffff81111561104657600080fd5b61105289828a01610f98565b979a9699509497509295939492505050565b6000806040838503121561107757600080fd5b823561108281610f5a565b9150602083013561109281610f5a565b809150509250929050565b6000815180845260005b818110156110c3576020818501810151868301820152016110a7565b818111156110d5576000602083870101525b50601f017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0169290920160200192915050565b60208152600061111b602083018461109d565b9392505050565b60008060006060848603121561113757600080fd5b833561114281610f5a565b9250602084013561115281610f5a565b929592945050506040919091013590565b600080600080600080600060c0888a03121561117e57600080fd5b873561118981610f5a565b9650602088013561119981610f5a565b955060408801356111a981610f5a565b945060608801356111b981610f5a565b93506080880135925060a088013567ffffffffffffffff8111156111dc57600080fd5b6111e88a828b01610f98565b989b979a50959850939692959293505050565b600080600080600080600060c0888a03121561121657600080fd5b873561122181610f5a565b9650602088013561123181610f5a565b9550604088013561124181610f5a565b94506060880135935061125660808901610f7f565b925060a088013567ffffffffffffffff8111156111dc57600080fd5b60006020828403121561128457600080fd5b8151801515811461111b57600080fd5b6000602082840312156112a657600080fd5b815161111b81610f5a565b8183528181602085013750600060208284010152600060207fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0601f840116840101905092915050565b73ffffffffffffffffffffffffffffffffffffffff851681528360208201526060604082015260006113306060830184866112b1565b9695505050505050565b600073ffffffffffffffffffffffffffffffffffffffff808a1683528089166020840152808816604084015280871660608401525084608083015260c060a083015261138a60c0830184866112b1565b9998505050505050505050565b73ffffffffffffffffffffffffffffffffffffffff841681526060602082015260006113c6606083018561109d565b905063ffffffff8316604083015294935050505056fea164736f6c634300080f000a", - "initialized": true, - "kind": "Create", - "newBalance": 0, - "oldBalance": 0, - "reverted": false, - "storageAccesses": [ - { - "account": "0x44637A4292E0CD2B17A55d5F6B2F05AFcAcD0586", - "isWrite": false, - "newValue": "0x0000000000000000000000000000000000000000000000000000000000000000", - "previousValue": "0x0000000000000000000000000000000000000000000000000000000000000000", - "reverted": false, - "slot": "0x0000000000000000000000000000000000000000000000000000000000000000" - }, - { - "account": "0x44637A4292E0CD2B17A55d5F6B2F05AFcAcD0586", - "isWrite": false, - "newValue": "0x0000000000000000000000000000000000000000000000000000000000000000", - "previousValue": "0x0000000000000000000000000000000000000000000000000000000000000000", - "reverted": false, - "slot": "0x0000000000000000000000000000000000000000000000000000000000000000" - }, - { - "account": "0x44637A4292E0CD2B17A55d5F6B2F05AFcAcD0586", - "isWrite": false, - "newValue": "0x0000000000000000000000000000000000000000000000000000000000000000", - "previousValue": "0x0000000000000000000000000000000000000000000000000000000000000000", - "reverted": false, - "slot": "0x0000000000000000000000000000000000000000000000000000000000000000" - }, - { - "account": "0x44637A4292E0CD2B17A55d5F6B2F05AFcAcD0586", - "isWrite": true, - "newValue": "0x0000000000000000000000000000000000000000000000000000000000000001", - "previousValue": "0x0000000000000000000000000000000000000000000000000000000000000000", - "reverted": false, - "slot": "0x0000000000000000000000000000000000000000000000000000000000000000" - }, - { - "account": "0x44637A4292E0CD2B17A55d5F6B2F05AFcAcD0586", - "isWrite": false, - "newValue": "0x0000000000000000000000000000000000000000000000000000000000000001", - "previousValue": "0x0000000000000000000000000000000000000000000000000000000000000001", - "reverted": false, - "slot": "0x0000000000000000000000000000000000000000000000000000000000000000" - }, - { - "account": "0x44637A4292E0CD2B17A55d5F6B2F05AFcAcD0586", - "isWrite": true, - "newValue": "0x0000000000000000000000000000000000000000000000000000000000000101", - "previousValue": "0x0000000000000000000000000000000000000000000000000000000000000001", - "reverted": false, - "slot": "0x0000000000000000000000000000000000000000000000000000000000000000" - }, - { - "account": "0x44637A4292E0CD2B17A55d5F6B2F05AFcAcD0586", - "isWrite": false, - "newValue": "0x0000000000000000000000000000000000000000000000000000000000000000", - "previousValue": "0x0000000000000000000000000000000000000000000000000000000000000000", - "reverted": false, - "slot": "0x0000000000000000000000000000000000000000000000000000000000000032" - }, - { - "account": "0x44637A4292E0CD2B17A55d5F6B2F05AFcAcD0586", - "isWrite": true, - "newValue": "0x0000000000000000000000000000000000000000000000000000000000000000", - "previousValue": "0x0000000000000000000000000000000000000000000000000000000000000000", - "reverted": false, - "slot": "0x0000000000000000000000000000000000000000000000000000000000000032" - }, - { - "account": "0x44637A4292E0CD2B17A55d5F6B2F05AFcAcD0586", - "isWrite": false, - "newValue": "0x0000000000000000000000000000000000000000000000000000000000000101", - "previousValue": "0x0000000000000000000000000000000000000000000000000000000000000101", - "reverted": false, - "slot": "0x0000000000000000000000000000000000000000000000000000000000000000" - }, - { - "account": "0x44637A4292E0CD2B17A55d5F6B2F05AFcAcD0586", - "isWrite": false, - "newValue": "0x0000000000000000000000000000000000000000000000000000000000000000", - "previousValue": "0x0000000000000000000000000000000000000000000000000000000000000000", - "reverted": false, - "slot": "0x0000000000000000000000000000000000000000000000000000000000000001" - }, - { - "account": "0x44637A4292E0CD2B17A55d5F6B2F05AFcAcD0586", - "isWrite": true, - "newValue": "0x0000000000000000000000000000000000000000000000000000000000000000", - "previousValue": "0x0000000000000000000000000000000000000000000000000000000000000000", - "reverted": false, - "slot": "0x0000000000000000000000000000000000000000000000000000000000000001" - }, - { - "account": "0x44637A4292E0CD2B17A55d5F6B2F05AFcAcD0586", - "isWrite": false, - "newValue": "0x0000000000000000000000000000000000000000000000000000000000000000", - "previousValue": "0x0000000000000000000000000000000000000000000000000000000000000000", - "reverted": false, - "slot": "0x0000000000000000000000000000000000000000000000000000000000000002" - }, - { - "account": "0x44637A4292E0CD2B17A55d5F6B2F05AFcAcD0586", - "isWrite": true, - "newValue": "0x0000000000000000000000004200000000000000000000000000000000000014", - "previousValue": "0x0000000000000000000000000000000000000000000000000000000000000000", - "reverted": false, - "slot": "0x0000000000000000000000000000000000000000000000000000000000000002" - }, - { - "account": "0x44637A4292E0CD2B17A55d5F6B2F05AFcAcD0586", - "isWrite": false, - "newValue": "0x0000000000000000000000000000000000000000000000000000000000000101", - "previousValue": "0x0000000000000000000000000000000000000000000000000000000000000101", - "reverted": false, - "slot": "0x0000000000000000000000000000000000000000000000000000000000000000" - }, - { - "account": "0x44637A4292E0CD2B17A55d5F6B2F05AFcAcD0586", - "isWrite": true, - "newValue": "0x0000000000000000000000000000000000000000000000000000000000000001", - "previousValue": "0x0000000000000000000000000000000000000000000000000000000000000101", - "reverted": false, - "slot": "0x0000000000000000000000000000000000000000000000000000000000000000" - } - ], - "value": 0 - }, - { - "accessor": "0x7FA9385bE102ac3EAc297483Dd6233D62b3e1496", - "account": "0x7109709ECfa91a80626fF3989D68f67F5b1DD12D", - "chainInfo": { - "chainId": 31337, - "forkId": 0 - }, - "data": "0x", - "deployedCode": "0x", - "initialized": true, - "kind": "Resume", - "newBalance": 0, - "oldBalance": 0, - "reverted": false, - "storageAccesses": [], - "value": 0 - }, - { - "accessor": "0x1804c8AB1F12E6bbf3894d4083f33e07309d1f38", - "account": "0x44637A4292E0CD2B17A55d5F6B2F05AFcAcD0586", - "chainInfo": { - "chainId": 31337, - "forkId": 0 - }, - "data": "0x7f46ddb2", - "deployedCode": "0x", - "initialized": true, - "kind": "StaticCall", - "newBalance": 0, - "oldBalance": 0, - "reverted": false, - "storageAccesses": [ - { - "account": "0x44637A4292E0CD2B17A55d5F6B2F05AFcAcD0586", - "isWrite": false, - "newValue": "0x0000000000000000000000004200000000000000000000000000000000000014", - "previousValue": "0x0000000000000000000000004200000000000000000000000000000000000014", - "reverted": false, - "slot": "0x0000000000000000000000000000000000000000000000000000000000000002" - } - ], - "value": 0 - }, - { - "accessor": "0x1804c8AB1F12E6bbf3894d4083f33e07309d1f38", - "account": "0x44637A4292E0CD2B17A55d5F6B2F05AFcAcD0586", - "chainInfo": { - "chainId": 31337, - "forkId": 0 - }, - "data": "0xc89701a2", - "deployedCode": "0x", - "initialized": true, - "kind": "StaticCall", - "newBalance": 0, - "oldBalance": 0, - "reverted": false, - "storageAccesses": [ - { - "account": "0x44637A4292E0CD2B17A55d5F6B2F05AFcAcD0586", - "isWrite": false, - "newValue": "0x0000000000000000000000004200000000000000000000000000000000000014", - "previousValue": "0x0000000000000000000000004200000000000000000000000000000000000014", - "reverted": false, - "slot": "0x0000000000000000000000000000000000000000000000000000000000000002" - } - ], - "value": 0 - }, - { - "accessor": "0x1804c8AB1F12E6bbf3894d4083f33e07309d1f38", - "account": "0x44637A4292E0CD2B17A55d5F6B2F05AFcAcD0586", - "chainInfo": { - "chainId": 31337, - "forkId": 0 - }, - "data": "0x927ede2d", - "deployedCode": "0x", - "initialized": true, - "kind": "StaticCall", - "newBalance": 0, - "oldBalance": 0, - "reverted": false, - "storageAccesses": [ - { - "account": "0x44637A4292E0CD2B17A55d5F6B2F05AFcAcD0586", - "isWrite": false, - "newValue": "0x0000000000000000000000000000000000000000000000000000000000000000", - "previousValue": "0x0000000000000000000000000000000000000000000000000000000000000000", - "reverted": false, - "slot": "0x0000000000000000000000000000000000000000000000000000000000000001" - } - ], - "value": 0 - }, - { - "accessor": "0x1804c8AB1F12E6bbf3894d4083f33e07309d1f38", - "account": "0x44637A4292E0CD2B17A55d5F6B2F05AFcAcD0586", - "chainInfo": { - "chainId": 31337, - "forkId": 0 - }, - "data": "0x3cb747bf", - "deployedCode": "0x", - "initialized": true, - "kind": "StaticCall", - "newBalance": 0, - "oldBalance": 0, - "reverted": false, - "storageAccesses": [ - { - "account": "0x44637A4292E0CD2B17A55d5F6B2F05AFcAcD0586", - "isWrite": false, - "newValue": "0x0000000000000000000000000000000000000000000000000000000000000000", - "previousValue": "0x0000000000000000000000000000000000000000000000000000000000000000", - "reverted": false, - "slot": "0x0000000000000000000000000000000000000000000000000000000000000001" - } - ], - "value": 0 - }, - { - "accessor": "0x1804c8AB1F12E6bbf3894d4083f33e07309d1f38", - "account": "0x44637A4292E0CD2B17A55d5F6B2F05AFcAcD0586", - "chainInfo": { - "chainId": 31337, - "forkId": 0 - }, - "data": "0x35e80ab3", - "deployedCode": "0x", - "initialized": true, - "kind": "StaticCall", - "newBalance": 0, - "oldBalance": 0, - "reverted": false, - "storageAccesses": [ - { - "account": "0x44637A4292E0CD2B17A55d5F6B2F05AFcAcD0586", - "isWrite": false, - "newValue": "0x0000000000000000000000000000000000000000000000000000000000000000", - "previousValue": "0x0000000000000000000000000000000000000000000000000000000000000000", - "reverted": false, - "slot": "0x0000000000000000000000000000000000000000000000000000000000000032" - } - ], - "value": 0 - }, - { - "accessor": "0x7FA9385bE102ac3EAc297483Dd6233D62b3e1496", - "account": "0x7109709ECfa91a80626fF3989D68f67F5b1DD12D", - "chainInfo": { - "chainId": 31337, - "forkId": 0 - }, - "data": "0x", - "deployedCode": "0x", - "initialized": true, - "kind": "Resume", - "newBalance": 0, - "oldBalance": 0, - "reverted": false, - "storageAccesses": [], - "value": 0 - }, - { - "accessor": "0x7FA9385bE102ac3EAc297483Dd6233D62b3e1496", - "account": "0x7109709ECfa91a80626fF3989D68f67F5b1DD12D", - "chainInfo": { - "chainId": 31337, - "forkId": 0 - }, - "data": "0x", - "deployedCode": "0x", - "initialized": true, - "kind": "Resume", - "newBalance": 0, - "oldBalance": 0, - "reverted": false, - "storageAccesses": [], - "value": 0 - }, - { - "accessor": "0x1804c8AB1F12E6bbf3894d4083f33e07309d1f38", - "account": "0x9568d36E291c2C4c34fa5593fcE73715abEf6F9c", - "chainInfo": { - "chainId": 31337, - "forkId": 0 - }, - "data": "0x68ea2a43", - "deployedCode": "0x", - "initialized": true, - "kind": "StaticCall", - "newBalance": 0, - "oldBalance": 0, - "reverted": false, - "storageAccesses": [ - { - "account": "0x9568d36E291c2C4c34fa5593fcE73715abEf6F9c", - "isWrite": false, - "newValue": "0x0000000000000000000000003c44cdddb6a900fa2b585dd299e03d12fa4293bc", - "previousValue": "0x0000000000000000000000003c44cdddb6a900fa2b585dd299e03d12fa4293bc", - "reverted": false, - "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 - }, - { - "accessor": "0x1804c8AB1F12E6bbf3894d4083f33e07309d1f38", - "account": "0x9568d36E291c2C4c34fa5593fcE73715abEf6F9c", - "chainInfo": { - "chainId": 31337, - "forkId": 0 - }, - "data": "0xd2354f20", - "deployedCode": "0x", - "initialized": true, - "kind": "StaticCall", - "newBalance": 0, - "oldBalance": 0, - "reverted": false, - "storageAccesses": [ - { - "account": "0x9568d36E291c2C4c34fa5593fcE73715abEf6F9c", - "isWrite": false, - "newValue": "0x0000000000000000000000009965507d1a55bcc2695c58ba16fb37d819b0a4dc", - "previousValue": "0x0000000000000000000000009965507d1a55bcc2695c58ba16fb37d819b0a4dc", - "reverted": false, - "slot": "0x000000000000000000000000000000000000000000000000000000000000000e" - } - ], - "value": 0 - }, - { - "accessor": "0x1804c8AB1F12E6bbf3894d4083f33e07309d1f38", - "account": "0x9568d36E291c2C4c34fa5593fcE73715abEf6F9c", - "chainInfo": { - "chainId": 31337, - "forkId": 0 - }, - "data": "0x81143a59", - "deployedCode": "0x", - "initialized": true, - "kind": "StaticCall", - "newBalance": 0, - "oldBalance": 0, - "reverted": false, - "storageAccesses": [ - { - "account": "0x9568d36E291c2C4c34fa5593fcE73715abEf6F9c", - "isWrite": false, - "newValue": "0x0000000000000000000000000000000000000000000000000000000000000834", - "previousValue": "0x0000000000000000000000000000000000000000000000000000000000000834", - "reverted": false, - "slot": "0x000000000000000000000000000000000000000000000000000000000000002d" - } - ], - "value": 0 - }, - { - "accessor": "0x1804c8AB1F12E6bbf3894d4083f33e07309d1f38", - "account": "0x9568d36E291c2C4c34fa5593fcE73715abEf6F9c", - "chainInfo": { - "chainId": 31337, - "forkId": 0 - }, - "data": "0x0ac77bb5", - "deployedCode": "0x", - "initialized": true, - "kind": "StaticCall", - "newBalance": 0, - "oldBalance": 0, - "reverted": false, - "storageAccesses": [ - { - "account": "0x9568d36E291c2C4c34fa5593fcE73715abEf6F9c", - "isWrite": false, - "newValue": "0x00000000000000000000000000000000000000000000000000000000000f4240", - "previousValue": "0x00000000000000000000000000000000000000000000000000000000000f4240", - "reverted": false, - "slot": "0x000000000000000000000000000000000000000000000000000000000000002e" - } - ], - "value": 0 - }, - { - "accessor": "0x1804c8AB1F12E6bbf3894d4083f33e07309d1f38", - "account": "0x9568d36E291c2C4c34fa5593fcE73715abEf6F9c", - "chainInfo": { - "chainId": 31337, - "forkId": 0 - }, - "data": "0x2dde36f5", - "deployedCode": "0x", - "initialized": true, - "kind": "StaticCall", - "newBalance": 0, - "oldBalance": 0, - "reverted": false, - "storageAccesses": [ - { - "account": "0x9568d36E291c2C4c34fa5593fcE73715abEf6F9c", - "isWrite": false, - "newValue": "0x00000000000000000000000000000000000000000000000000000000017d7840", - "previousValue": "0x00000000000000000000000000000000000000000000000000000000017d7840", - "reverted": false, - "slot": "0x000000000000000000000000000000000000000000000000000000000000002c" - } - ], - "value": 0 - }, - { - "accessor": "0x1804c8AB1F12E6bbf3894d4083f33e07309d1f38", - "account": "0x9568d36E291c2C4c34fa5593fcE73715abEf6F9c", - "chainInfo": { - "chainId": 31337, - "forkId": 0 - }, - "data": "0xe7d6cd42", - "deployedCode": "0x", - "initialized": true, - "kind": "StaticCall", - "newBalance": 0, - "oldBalance": 0, - "reverted": false, - "storageAccesses": [ - { - "account": "0x9568d36E291c2C4c34fa5593fcE73715abEf6F9c", - "isWrite": false, - "newValue": "0x0000000000000000000000009965507d1a55bcc2695c58ba16fb37d819b0a4dc", - "previousValue": "0x0000000000000000000000009965507d1a55bcc2695c58ba16fb37d819b0a4dc", - "reverted": false, - "slot": "0x0000000000000000000000000000000000000000000000000000000000000016" - } - ], - "value": 0 - }, - { - "accessor": "0x1804c8AB1F12E6bbf3894d4083f33e07309d1f38", - "account": "0x9568d36E291c2C4c34fa5593fcE73715abEf6F9c", - "chainInfo": { - "chainId": 31337, - "forkId": 0 - }, - "data": "0x9c16360f", - "deployedCode": "0x", - "initialized": true, - "kind": "StaticCall", - "newBalance": 0, - "oldBalance": 0, - "reverted": false, - "storageAccesses": [ - { - "account": "0x9568d36E291c2C4c34fa5593fcE73715abEf6F9c", - "isWrite": false, - "newValue": "0x000000000000000000000000ff00000000000000000000000000000000000000", - "previousValue": "0x000000000000000000000000ff00000000000000000000000000000000000000", - "reverted": false, - "slot": "0x0000000000000000000000000000000000000000000000000000000000000017" - } - ], - "value": 0 - }, - { - "accessor": "0x1804c8AB1F12E6bbf3894d4083f33e07309d1f38", - "account": "0x7d039be7F9b5190147621b02e82B250e1D748e02", - "chainInfo": { - "chainId": 31337, - "forkId": 0 - }, - "data": "0x6a761202000000000000000000000000db8cff278adccf9e9b5da745b44e754fc4ee3c760000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000014000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000004a000000000000000000000000000000000000000000000000000000000000003249623609d0000000000000000000000001c23a6d89f95ef3148bcda8e242cab145bf9c0e4000000000000000000000000809abd1c13738de7a76c85839779fcaa59fa32ce000000000000000000000000000000000000000000000000000000000000006000000000000000000000000000000000000000000000000000000000000002844c1e843d0000000000000000000000009965507d1a55bcc2695c58ba16fb37d819b0a4dc000000000000000000000000000000000000000000000000000000000000083400000000000000000000000000000000000000000000000000000000000f42400000000000000000000000003c44cdddb6a900fa2b585dd299e03d12fa4293bc00000000000000000000000000000000000000000000000000000000017d78400000000000000000000000009965507d1a55bcc2695c58ba16fb37d819b0a4dc0000000000000000000000000000000000000000000000000000000001312d00000000000000000000000000000000000000000000000000000000000000000a0000000000000000000000000000000000000000000000000000000000000008000000000000000000000000000000000000000000000000000000003b9aca0000000000000000000000000000000000000000000000000000000000000f424000000000000000000000000000000000ffffffffffffffffffffffffffffffff000000000000000000000000ff0000000000000000000000000000000000000000000000000000000000000020a42a5a785622c6ba2576b2d6e924aa82bfa11d000000000000000000000000def3bca8c80064589e6787477ffa7dd616b5574f0000000000000000000000000c8b5822b6e02cda722174f19a1439a7495a3fa60000000000000000000000000000000000000000000000000000000000000000000000000000000000000000978e3286eb805934215a88694d80b09aded68d900000000000000000000000000000000000000000000000000000000000000000000000000000000000000000eeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeee000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000410000000000000000000000001804c8ab1f12e6bbf3894d4083f33e07309d1f3800000000000000000000000000000000000000000000000000000000000000000100000000000000000000000000000000000000000000000000000000000000", - "deployedCode": "0x", - "initialized": true, - "kind": "Call", - "newBalance": 0, - "oldBalance": 0, - "reverted": false, - "storageAccesses": [ - { - "account": "0x7d039be7F9b5190147621b02e82B250e1D748e02", - "isWrite": false, - "newValue": "0x00000000000000000000000090193c961a926261b756d1e5bb255e67ff9498a1", - "previousValue": "0x00000000000000000000000090193c961a926261b756d1e5bb255e67ff9498a1", - "reverted": false, - "slot": "0x0000000000000000000000000000000000000000000000000000000000000000" - } - ], - "value": 0 - }, - { - "accessor": "0x1804c8AB1F12E6bbf3894d4083f33e07309d1f38", - "account": "0x90193C961A926261B756D1E5bb255e67ff9498A1", - "chainInfo": { - "chainId": 31337, - "forkId": 0 - }, - "data": "0x6a761202000000000000000000000000db8cff278adccf9e9b5da745b44e754fc4ee3c760000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000014000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000004a000000000000000000000000000000000000000000000000000000000000003249623609d0000000000000000000000001c23a6d89f95ef3148bcda8e242cab145bf9c0e4000000000000000000000000809abd1c13738de7a76c85839779fcaa59fa32ce000000000000000000000000000000000000000000000000000000000000006000000000000000000000000000000000000000000000000000000000000002844c1e843d0000000000000000000000009965507d1a55bcc2695c58ba16fb37d819b0a4dc000000000000000000000000000000000000000000000000000000000000083400000000000000000000000000000000000000000000000000000000000f42400000000000000000000000003c44cdddb6a900fa2b585dd299e03d12fa4293bc00000000000000000000000000000000000000000000000000000000017d78400000000000000000000000009965507d1a55bcc2695c58ba16fb37d819b0a4dc0000000000000000000000000000000000000000000000000000000001312d00000000000000000000000000000000000000000000000000000000000000000a0000000000000000000000000000000000000000000000000000000000000008000000000000000000000000000000000000000000000000000000003b9aca0000000000000000000000000000000000000000000000000000000000000f424000000000000000000000000000000000ffffffffffffffffffffffffffffffff000000000000000000000000ff0000000000000000000000000000000000000000000000000000000000000020a42a5a785622c6ba2576b2d6e924aa82bfa11d000000000000000000000000def3bca8c80064589e6787477ffa7dd616b5574f0000000000000000000000000c8b5822b6e02cda722174f19a1439a7495a3fa60000000000000000000000000000000000000000000000000000000000000000000000000000000000000000978e3286eb805934215a88694d80b09aded68d900000000000000000000000000000000000000000000000000000000000000000000000000000000000000000eeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeee000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000410000000000000000000000001804c8ab1f12e6bbf3894d4083f33e07309d1f3800000000000000000000000000000000000000000000000000000000000000000100000000000000000000000000000000000000000000000000000000000000", - "deployedCode": "0x", - "initialized": true, - "kind": "DelegateCall", - "newBalance": 0, - "oldBalance": 0, - "reverted": false, - "storageAccesses": [ - { - "account": "0x7d039be7F9b5190147621b02e82B250e1D748e02", - "isWrite": false, - "newValue": "0x0000000000000000000000000000000000000000000000000000000000000002", - "previousValue": "0x0000000000000000000000000000000000000000000000000000000000000002", - "reverted": false, - "slot": "0x0000000000000000000000000000000000000000000000000000000000000005" - }, - { - "account": "0x7d039be7F9b5190147621b02e82B250e1D748e02", - "isWrite": false, - "newValue": "0x0000000000000000000000000000000000000000000000000000000000000002", - "previousValue": "0x0000000000000000000000000000000000000000000000000000000000000002", - "reverted": false, - "slot": "0x0000000000000000000000000000000000000000000000000000000000000005" - }, - { - "account": "0x7d039be7F9b5190147621b02e82B250e1D748e02", - "isWrite": true, - "newValue": "0x0000000000000000000000000000000000000000000000000000000000000003", - "previousValue": "0x0000000000000000000000000000000000000000000000000000000000000002", - "reverted": false, - "slot": "0x0000000000000000000000000000000000000000000000000000000000000005" - }, - { - "account": "0x7d039be7F9b5190147621b02e82B250e1D748e02", - "isWrite": false, - "newValue": "0x0000000000000000000000000000000000000000000000000000000000000001", - "previousValue": "0x0000000000000000000000000000000000000000000000000000000000000001", - "reverted": false, - "slot": "0x0000000000000000000000000000000000000000000000000000000000000004" - }, - { - "account": "0x7d039be7F9b5190147621b02e82B250e1D748e02", - "isWrite": false, - "newValue": "0x0000000000000000000000000000000000000000000000000000000000000001", - "previousValue": "0x0000000000000000000000000000000000000000000000000000000000000001", - "reverted": false, - "slot": "0xd1b0d319c6526317dce66989b393dcfb4435c9a65e399a088b63bbf65d7aee32" - }, - { - "account": "0x7d039be7F9b5190147621b02e82B250e1D748e02", - "isWrite": false, - "newValue": "0x0000000000000000000000000000000000000000000000000000000000000000", - "previousValue": "0x0000000000000000000000000000000000000000000000000000000000000000", - "reverted": false, - "slot": "0x4a204f620c8c5ccdca3fd54d003badd85ba500436a431f0cbda4f558c93c34c8" - } - ], - "value": 0 - }, - { - "accessor": "0x7d039be7F9b5190147621b02e82B250e1D748e02", - "account": "0xDB8cFf278adCCF9E9b5da745B44E754fC4EE3C76", - "chainInfo": { - "chainId": 31337, - "forkId": 0 - }, - "data": "0x9623609d0000000000000000000000001c23a6d89f95ef3148bcda8e242cab145bf9c0e4000000000000000000000000809abd1c13738de7a76c85839779fcaa59fa32ce000000000000000000000000000000000000000000000000000000000000006000000000000000000000000000000000000000000000000000000000000002844c1e843d0000000000000000000000009965507d1a55bcc2695c58ba16fb37d819b0a4dc000000000000000000000000000000000000000000000000000000000000083400000000000000000000000000000000000000000000000000000000000f42400000000000000000000000003c44cdddb6a900fa2b585dd299e03d12fa4293bc00000000000000000000000000000000000000000000000000000000017d78400000000000000000000000009965507d1a55bcc2695c58ba16fb37d819b0a4dc0000000000000000000000000000000000000000000000000000000001312d00000000000000000000000000000000000000000000000000000000000000000a0000000000000000000000000000000000000000000000000000000000000008000000000000000000000000000000000000000000000000000000003b9aca0000000000000000000000000000000000000000000000000000000000000f424000000000000000000000000000000000ffffffffffffffffffffffffffffffff000000000000000000000000ff0000000000000000000000000000000000000000000000000000000000000020a42a5a785622c6ba2576b2d6e924aa82bfa11d000000000000000000000000def3bca8c80064589e6787477ffa7dd616b5574f0000000000000000000000000c8b5822b6e02cda722174f19a1439a7495a3fa60000000000000000000000000000000000000000000000000000000000000000000000000000000000000000978e3286eb805934215a88694d80b09aded68d900000000000000000000000000000000000000000000000000000000000000000000000000000000000000000eeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeee00000000000000000000000000000000000000000000000000000000", - "deployedCode": "0x", - "initialized": true, - "kind": "Call", - "newBalance": 0, - "oldBalance": 0, - "reverted": false, - "storageAccesses": [ - { - "account": "0xDB8cFf278adCCF9E9b5da745B44E754fC4EE3C76", - "isWrite": false, - "newValue": "0x0000000000000000000000007d039be7f9b5190147621b02e82b250e1d748e02", - "previousValue": "0x0000000000000000000000007d039be7f9b5190147621b02e82b250e1d748e02", - "reverted": false, - "slot": "0x0000000000000000000000000000000000000000000000000000000000000000" - }, - { - "account": "0xDB8cFf278adCCF9E9b5da745B44E754fC4EE3C76", - "isWrite": false, - "newValue": "0x0000000000000000000000000000000000000000000000000000000000000000", - "previousValue": "0x0000000000000000000000000000000000000000000000000000000000000000", - "reverted": false, - "slot": "0x727598a658f6983be3a9f29beef55aaee89ef8a176baeeacbe7edf5ff94a781b" - } - ], - "value": 0 - }, - { - "accessor": "0xDB8cFf278adCCF9E9b5da745B44E754fC4EE3C76", - "account": "0x1c23A6d89F95ef3148BCDA8E242cAb145bf9c0E4", - "chainInfo": { - "chainId": 31337, - "forkId": 0 - }, - "data": "0x4f1ef286000000000000000000000000809abd1c13738de7a76c85839779fcaa59fa32ce000000000000000000000000000000000000000000000000000000000000004000000000000000000000000000000000000000000000000000000000000002844c1e843d0000000000000000000000009965507d1a55bcc2695c58ba16fb37d819b0a4dc000000000000000000000000000000000000000000000000000000000000083400000000000000000000000000000000000000000000000000000000000f42400000000000000000000000003c44cdddb6a900fa2b585dd299e03d12fa4293bc00000000000000000000000000000000000000000000000000000000017d78400000000000000000000000009965507d1a55bcc2695c58ba16fb37d819b0a4dc0000000000000000000000000000000000000000000000000000000001312d00000000000000000000000000000000000000000000000000000000000000000a0000000000000000000000000000000000000000000000000000000000000008000000000000000000000000000000000000000000000000000000003b9aca0000000000000000000000000000000000000000000000000000000000000f424000000000000000000000000000000000ffffffffffffffffffffffffffffffff000000000000000000000000ff0000000000000000000000000000000000000000000000000000000000000020a42a5a785622c6ba2576b2d6e924aa82bfa11d000000000000000000000000def3bca8c80064589e6787477ffa7dd616b5574f0000000000000000000000000c8b5822b6e02cda722174f19a1439a7495a3fa60000000000000000000000000000000000000000000000000000000000000000000000000000000000000000978e3286eb805934215a88694d80b09aded68d900000000000000000000000000000000000000000000000000000000000000000000000000000000000000000eeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeee00000000000000000000000000000000000000000000000000000000", - "deployedCode": "0x", - "initialized": true, - "kind": "Call", - "newBalance": 0, - "oldBalance": 0, - "reverted": false, - "storageAccesses": [ - { - "account": "0x1c23A6d89F95ef3148BCDA8E242cAb145bf9c0E4", - "isWrite": false, - "newValue": "0x000000000000000000000000db8cff278adccf9e9b5da745b44e754fc4ee3c76", - "previousValue": "0x000000000000000000000000db8cff278adccf9e9b5da745b44e754fc4ee3c76", - "reverted": false, - "slot": "0xb53127684a568b3173ae13b9f8a6016e243e63b6e8ee1178d6a717850b5d6103" - }, - { - "account": "0x1c23A6d89F95ef3148BCDA8E242cAb145bf9c0E4", - "isWrite": true, - "newValue": "0x000000000000000000000000809abd1c13738de7a76c85839779fcaa59fa32ce", - "previousValue": "0x0000000000000000000000000000000000000000000000000000000000000000", - "reverted": false, - "slot": "0x360894a13ba1a3210667c828492db98dca3e2076cc3735a920a3ca505d382bbc" - } - ], - "value": 0 - }, - { - "accessor": "0xDB8cFf278adCCF9E9b5da745B44E754fC4EE3C76", - "account": "0x809abd1c13738dE7a76C85839779FCaa59FA32CE", - "chainInfo": { - "chainId": 31337, - "forkId": 0 - }, - "data": "0x4c1e843d0000000000000000000000009965507d1a55bcc2695c58ba16fb37d819b0a4dc000000000000000000000000000000000000000000000000000000000000083400000000000000000000000000000000000000000000000000000000000f42400000000000000000000000003c44cdddb6a900fa2b585dd299e03d12fa4293bc00000000000000000000000000000000000000000000000000000000017d78400000000000000000000000009965507d1a55bcc2695c58ba16fb37d819b0a4dc0000000000000000000000000000000000000000000000000000000001312d00000000000000000000000000000000000000000000000000000000000000000a0000000000000000000000000000000000000000000000000000000000000008000000000000000000000000000000000000000000000000000000003b9aca0000000000000000000000000000000000000000000000000000000000000f424000000000000000000000000000000000ffffffffffffffffffffffffffffffff000000000000000000000000ff0000000000000000000000000000000000000000000000000000000000000020a42a5a785622c6ba2576b2d6e924aa82bfa11d000000000000000000000000def3bca8c80064589e6787477ffa7dd616b5574f0000000000000000000000000c8b5822b6e02cda722174f19a1439a7495a3fa60000000000000000000000000000000000000000000000000000000000000000000000000000000000000000978e3286eb805934215a88694d80b09aded68d900000000000000000000000000000000000000000000000000000000000000000000000000000000000000000eeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeee", - "deployedCode": "0x", - "initialized": true, - "kind": "DelegateCall", - "newBalance": 0, - "oldBalance": 0, - "reverted": false, - "storageAccesses": [ - { - "account": "0x1c23A6d89F95ef3148BCDA8E242cAb145bf9c0E4", - "isWrite": false, - "newValue": "0x0000000000000000000000000000000000000000000000000000000000000000", - "previousValue": "0x0000000000000000000000000000000000000000000000000000000000000000", - "reverted": false, - "slot": "0x0000000000000000000000000000000000000000000000000000000000000000" - }, - { - "account": "0x1c23A6d89F95ef3148BCDA8E242cAb145bf9c0E4", - "isWrite": false, - "newValue": "0x0000000000000000000000000000000000000000000000000000000000000000", - "previousValue": "0x0000000000000000000000000000000000000000000000000000000000000000", - "reverted": false, - "slot": "0x0000000000000000000000000000000000000000000000000000000000000000" - }, - { - "account": "0x1c23A6d89F95ef3148BCDA8E242cAb145bf9c0E4", - "isWrite": false, - "newValue": "0x0000000000000000000000000000000000000000000000000000000000000000", - "previousValue": "0x0000000000000000000000000000000000000000000000000000000000000000", - "reverted": false, - "slot": "0x0000000000000000000000000000000000000000000000000000000000000000" - }, - { - "account": "0x1c23A6d89F95ef3148BCDA8E242cAb145bf9c0E4", - "isWrite": true, - "newValue": "0x0000000000000000000000000000000000000000000000000000000000000001", - "previousValue": "0x0000000000000000000000000000000000000000000000000000000000000000", - "reverted": false, - "slot": "0x0000000000000000000000000000000000000000000000000000000000000000" - }, - { - "account": "0x1c23A6d89F95ef3148BCDA8E242cAb145bf9c0E4", - "isWrite": false, - "newValue": "0x0000000000000000000000000000000000000000000000000000000000000001", - "previousValue": "0x0000000000000000000000000000000000000000000000000000000000000001", - "reverted": false, - "slot": "0x0000000000000000000000000000000000000000000000000000000000000000" - }, - { - "account": "0x1c23A6d89F95ef3148BCDA8E242cAb145bf9c0E4", - "isWrite": true, - "newValue": "0x0000000000000000000000000000000000000000000000000000000000000101", - "previousValue": "0x0000000000000000000000000000000000000000000000000000000000000001", - "reverted": false, - "slot": "0x0000000000000000000000000000000000000000000000000000000000000000" - }, - { - "account": "0x1c23A6d89F95ef3148BCDA8E242cAb145bf9c0E4", - "isWrite": false, - "newValue": "0x0000000000000000000000000000000000000000000000000000000000000101", - "previousValue": "0x0000000000000000000000000000000000000000000000000000000000000101", - "reverted": false, - "slot": "0x0000000000000000000000000000000000000000000000000000000000000000" - }, - { - "account": "0x1c23A6d89F95ef3148BCDA8E242cAb145bf9c0E4", - "isWrite": false, - "newValue": "0x0000000000000000000000000000000000000000000000000000000000000101", - "previousValue": "0x0000000000000000000000000000000000000000000000000000000000000101", - "reverted": false, - "slot": "0x0000000000000000000000000000000000000000000000000000000000000000" - }, - { - "account": "0x1c23A6d89F95ef3148BCDA8E242cAb145bf9c0E4", - "isWrite": false, - "newValue": "0x0000000000000000000000000000000000000000000000000000000000000000", - "previousValue": "0x0000000000000000000000000000000000000000000000000000000000000000", - "reverted": false, - "slot": "0x0000000000000000000000000000000000000000000000000000000000000033" - }, - { - "account": "0x1c23A6d89F95ef3148BCDA8E242cAb145bf9c0E4", - "isWrite": true, - "newValue": "0x000000000000000000000000db8cff278adccf9e9b5da745b44e754fc4ee3c76", - "previousValue": "0x0000000000000000000000000000000000000000000000000000000000000000", - "reverted": false, - "slot": "0x0000000000000000000000000000000000000000000000000000000000000033" - }, - { - "account": "0x1c23A6d89F95ef3148BCDA8E242cAb145bf9c0E4", - "isWrite": false, - "newValue": "0x000000000000000000000000db8cff278adccf9e9b5da745b44e754fc4ee3c76", - "previousValue": "0x000000000000000000000000db8cff278adccf9e9b5da745b44e754fc4ee3c76", - "reverted": false, - "slot": "0x0000000000000000000000000000000000000000000000000000000000000033" - }, - { - "account": "0x1c23A6d89F95ef3148BCDA8E242cAb145bf9c0E4", - "isWrite": false, - "newValue": "0x000000000000000000000000db8cff278adccf9e9b5da745b44e754fc4ee3c76", - "previousValue": "0x000000000000000000000000db8cff278adccf9e9b5da745b44e754fc4ee3c76", - "reverted": false, - "slot": "0x0000000000000000000000000000000000000000000000000000000000000033" - }, - { - "account": "0x1c23A6d89F95ef3148BCDA8E242cAb145bf9c0E4", - "isWrite": true, - "newValue": "0x0000000000000000000000009965507d1a55bcc2695c58ba16fb37d819b0a4dc", - "previousValue": "0x000000000000000000000000db8cff278adccf9e9b5da745b44e754fc4ee3c76", - "reverted": false, - "slot": "0x0000000000000000000000000000000000000000000000000000000000000033" - }, - { - "account": "0x1c23A6d89F95ef3148BCDA8E242cAb145bf9c0E4", - "isWrite": true, - "newValue": "0x0000000000000000000000003c44cdddb6a900fa2b585dd299e03d12fa4293bc", - "previousValue": "0x0000000000000000000000000000000000000000000000000000000000000000", - "reverted": false, - "slot": "0x0000000000000000000000000000000000000000000000000000000000000067" - }, - { - "account": "0x1c23A6d89F95ef3148BCDA8E242cAb145bf9c0E4", - "isWrite": true, - "newValue": "0x0000000000000000000000000000000000000000000000000000000000000834", - "previousValue": "0x0000000000000000000000000000000000000000000000000000000000000000", - "reverted": false, - "slot": "0x0000000000000000000000000000000000000000000000000000000000000065" - }, - { - "account": "0x1c23A6d89F95ef3148BCDA8E242cAb145bf9c0E4", - "isWrite": true, - "newValue": "0x00000000000000000000000000000000000000000000000000000000000f4240", - "previousValue": "0x0000000000000000000000000000000000000000000000000000000000000000", - "reverted": false, - "slot": "0x0000000000000000000000000000000000000000000000000000000000000066" - }, - { - "account": "0x1c23A6d89F95ef3148BCDA8E242cAb145bf9c0E4", - "isWrite": false, - "newValue": "0x0000000000000000000000000000000000000000000000000000000000000000", - "previousValue": "0x0000000000000000000000000000000000000000000000000000000000000000", - "reverted": false, - "slot": "0x0000000000000000000000000000000000000000000000000000000000000069" - }, - { - "account": "0x1c23A6d89F95ef3148BCDA8E242cAb145bf9c0E4", - "isWrite": false, - "newValue": "0x0000000000000000000000000000000000000000000000000000000000000000", - "previousValue": "0x0000000000000000000000000000000000000000000000000000000000000000", - "reverted": false, - "slot": "0x0000000000000000000000000000000000000000000000000000000000000068" - }, - { - "account": "0x1c23A6d89F95ef3148BCDA8E242cAb145bf9c0E4", - "isWrite": true, - "newValue": "0x00000000000000000000000000000000000000000000000000000000017d7840", - "previousValue": "0x0000000000000000000000000000000000000000000000000000000000000000", - "reverted": false, - "slot": "0x0000000000000000000000000000000000000000000000000000000000000068" - }, - { - "account": "0x1c23A6d89F95ef3148BCDA8E242cAb145bf9c0E4", - "isWrite": true, - "newValue": "0x0000000000000000000000009965507d1a55bcc2695c58ba16fb37d819b0a4dc", - "previousValue": "0x0000000000000000000000000000000000000000000000000000000000000000", - "reverted": false, - "slot": "0x65a7ed542fb37fe237fdfbdd70b31598523fe5b32879e307bae27a0bd9581c08" - }, - { - "account": "0x1c23A6d89F95ef3148BCDA8E242cAb145bf9c0E4", - "isWrite": true, - "newValue": "0x000000000000000000000000ff00000000000000000000000000000000000000", - "previousValue": "0x0000000000000000000000000000000000000000000000000000000000000000", - "reverted": false, - "slot": "0x71ac12829d66ee73d8d95bff50b3589745ce57edae70a3fb111a2342464dc597" - }, - { - "account": "0x1c23A6d89F95ef3148BCDA8E242cAb145bf9c0E4", - "isWrite": true, - "newValue": "0x00000000000000000000000020a42a5a785622c6ba2576b2d6e924aa82bfa11d", - "previousValue": "0x0000000000000000000000000000000000000000000000000000000000000000", - "reverted": false, - "slot": "0x383f291819e6d54073bc9a648251d97421076bdd101933c0c022219ce9580636" - }, - { - "account": "0x1c23A6d89F95ef3148BCDA8E242cAb145bf9c0E4", - "isWrite": true, - "newValue": "0x000000000000000000000000def3bca8c80064589e6787477ffa7dd616b5574f", - "previousValue": "0x0000000000000000000000000000000000000000000000000000000000000000", - "reverted": false, - "slot": "0x46adcbebc6be8ce551740c29c47c8798210f23f7f4086c41752944352568d5a7" - }, - { - "account": "0x1c23A6d89F95ef3148BCDA8E242cAb145bf9c0E4", - "isWrite": true, - "newValue": "0x0000000000000000000000000c8b5822b6e02cda722174f19a1439a7495a3fa6", - "previousValue": "0x0000000000000000000000000000000000000000000000000000000000000000", - "reverted": false, - "slot": "0x9904ba90dde5696cda05c9e0dab5cbaa0fea005ace4d11218a02ac668dad6376" - }, - { - "account": "0x1c23A6d89F95ef3148BCDA8E242cAb145bf9c0E4", - "isWrite": true, - "newValue": "0x0000000000000000000000000000000000000000000000000000000000000000", - "previousValue": "0x0000000000000000000000000000000000000000000000000000000000000000", - "reverted": false, - "slot": "0x52322a25d9f59ea17656545543306b7aef62bc0cc53a0e65ccfa0c75b97aa906" - }, - { - "account": "0x1c23A6d89F95ef3148BCDA8E242cAb145bf9c0E4", - "isWrite": true, - "newValue": "0x000000000000000000000000978e3286eb805934215a88694d80b09aded68d90", - "previousValue": "0x0000000000000000000000000000000000000000000000000000000000000000", - "reverted": false, - "slot": "0x4b6c74f9e688cb39801f2112c14a8c57232a3fc5202e1444126d4bce86eb19ac" - }, - { - "account": "0x1c23A6d89F95ef3148BCDA8E242cAb145bf9c0E4", - "isWrite": true, - "newValue": "0x0000000000000000000000000000000000000000000000000000000000000000", - "previousValue": "0x0000000000000000000000000000000000000000000000000000000000000000", - "reverted": false, - "slot": "0xa04c5bb938ca6fc46d95553abf0a76345ce3e722a30bf4f74928b8e7d852320c" - }, - { - "account": "0x1c23A6d89F95ef3148BCDA8E242cAb145bf9c0E4", - "isWrite": false, - "newValue": "0x0000000000000000000000000000000000000000000000000000000000000000", - "previousValue": "0x0000000000000000000000000000000000000000000000000000000000000000", - "reverted": false, - "slot": "0xa11ee3ab75b40e88a0105e935d17cd36c8faee0138320d776c411291bdbbb19f" - }, - { - "account": "0x1c23A6d89F95ef3148BCDA8E242cAb145bf9c0E4", - "isWrite": true, - "newValue": "0x0000000000000000000000000000000000000000000000000000000000000001", - "previousValue": "0x0000000000000000000000000000000000000000000000000000000000000000", - "reverted": false, - "slot": "0xa11ee3ab75b40e88a0105e935d17cd36c8faee0138320d776c411291bdbbb19f" - }, - { - "account": "0x1c23A6d89F95ef3148BCDA8E242cAb145bf9c0E4", - "isWrite": false, - "newValue": "0x00000000000000000000000000000000000000000000000000000000017d7840", - "previousValue": "0x00000000000000000000000000000000000000000000000000000000017d7840", - "reverted": false, - "slot": "0x0000000000000000000000000000000000000000000000000000000000000068" - }, - { - "account": "0x1c23A6d89F95ef3148BCDA8E242cAb145bf9c0E4", - "isWrite": false, - "newValue": "0x0000000000000000000000000000000000000000000000000000000000000000", - "previousValue": "0x0000000000000000000000000000000000000000000000000000000000000000", - "reverted": false, - "slot": "0x0000000000000000000000000000000000000000000000000000000000000069" - }, - { - "account": "0x1c23A6d89F95ef3148BCDA8E242cAb145bf9c0E4", - "isWrite": true, - "newValue": "0x0000ffffffffffffffffffffffffffffffff000f42403b9aca00080a01312d00", - "previousValue": "0x0000000000000000000000000000000000000000000000000000000000000000", - "reverted": false, - "slot": "0x0000000000000000000000000000000000000000000000000000000000000069" - }, - { - "account": "0x1c23A6d89F95ef3148BCDA8E242cAb145bf9c0E4", - "isWrite": false, - "newValue": "0x0000ffffffffffffffffffffffffffffffff000f42403b9aca00080a01312d00", - "previousValue": "0x0000ffffffffffffffffffffffffffffffff000f42403b9aca00080a01312d00", - "reverted": false, - "slot": "0x0000000000000000000000000000000000000000000000000000000000000069" - }, - { - "account": "0x1c23A6d89F95ef3148BCDA8E242cAb145bf9c0E4", - "isWrite": false, - "newValue": "0x0000000000000000000000000000000000000000000000000000000000000101", - "previousValue": "0x0000000000000000000000000000000000000000000000000000000000000101", - "reverted": false, - "slot": "0x0000000000000000000000000000000000000000000000000000000000000000" - }, - { - "account": "0x1c23A6d89F95ef3148BCDA8E242cAb145bf9c0E4", - "isWrite": true, - "newValue": "0x0000000000000000000000000000000000000000000000000000000000000001", - "previousValue": "0x0000000000000000000000000000000000000000000000000000000000000101", - "reverted": false, - "slot": "0x0000000000000000000000000000000000000000000000000000000000000000" - } - ], - "value": 0 - }, - { - "accessor": "0x1804c8AB1F12E6bbf3894d4083f33e07309d1f38", - "account": "0x1c23A6d89F95ef3148BCDA8E242cAb145bf9c0E4", - "chainInfo": { - "chainId": 31337, - "forkId": 0 - }, - "data": "0x54fd4d50", - "deployedCode": "0x", - "initialized": true, - "kind": "StaticCall", - "newBalance": 0, - "oldBalance": 0, - "reverted": false, - "storageAccesses": [ - { - "account": "0x1c23A6d89F95ef3148BCDA8E242cAb145bf9c0E4", - "isWrite": false, - "newValue": "0x000000000000000000000000809abd1c13738de7a76c85839779fcaa59fa32ce", - "previousValue": "0x000000000000000000000000809abd1c13738de7a76c85839779fcaa59fa32ce", - "reverted": false, - "slot": "0x360894a13ba1a3210667c828492db98dca3e2076cc3735a920a3ca505d382bbc" - } - ], - "value": 0 - }, - { - "accessor": "0x1804c8AB1F12E6bbf3894d4083f33e07309d1f38", - "account": "0x809abd1c13738dE7a76C85839779FCaa59FA32CE", - "chainInfo": { - "chainId": 31337, - "forkId": 0 - }, - "data": "0x54fd4d50", - "deployedCode": "0x", - "initialized": true, - "kind": "DelegateCall", - "newBalance": 0, - "oldBalance": 0, - "reverted": false, - "storageAccesses": [], - "value": 0 - }, - { - "accessor": "0x1804c8AB1F12E6bbf3894d4083f33e07309d1f38", - "account": "0x1c23A6d89F95ef3148BCDA8E242cAb145bf9c0E4", - "chainInfo": { - "chainId": 31337, - "forkId": 0 - }, - "data": "0xcc731b02", - "deployedCode": "0x", - "initialized": true, - "kind": "StaticCall", - "newBalance": 0, - "oldBalance": 0, - "reverted": false, - "storageAccesses": [ - { - "account": "0x1c23A6d89F95ef3148BCDA8E242cAb145bf9c0E4", - "isWrite": false, - "newValue": "0x000000000000000000000000809abd1c13738de7a76c85839779fcaa59fa32ce", - "previousValue": "0x000000000000000000000000809abd1c13738de7a76c85839779fcaa59fa32ce", - "reverted": false, - "slot": "0x360894a13ba1a3210667c828492db98dca3e2076cc3735a920a3ca505d382bbc" - } - ], - "value": 0 - }, - { - "accessor": "0x1804c8AB1F12E6bbf3894d4083f33e07309d1f38", - "account": "0x809abd1c13738dE7a76C85839779FCaa59FA32CE", - "chainInfo": { - "chainId": 31337, - "forkId": 0 - }, - "data": "0xcc731b02", - "deployedCode": "0x", - "initialized": true, - "kind": "DelegateCall", - "newBalance": 0, - "oldBalance": 0, - "reverted": false, - "storageAccesses": [ - { - "account": "0x1c23A6d89F95ef3148BCDA8E242cAb145bf9c0E4", - "isWrite": false, - "newValue": "0x0000ffffffffffffffffffffffffffffffff000f42403b9aca00080a01312d00", - "previousValue": "0x0000ffffffffffffffffffffffffffffffff000f42403b9aca00080a01312d00", - "reverted": false, - "slot": "0x0000000000000000000000000000000000000000000000000000000000000069" - } - ], - "value": 0 - }, - { - "accessor": "0x1804c8AB1F12E6bbf3894d4083f33e07309d1f38", - "account": "0x9568d36E291c2C4c34fa5593fcE73715abEf6F9c", - "chainInfo": { - "chainId": 31337, - "forkId": 0 - }, - "data": "0xd2354f20", - "deployedCode": "0x", - "initialized": true, - "kind": "StaticCall", - "newBalance": 0, - "oldBalance": 0, - "reverted": false, - "storageAccesses": [ - { - "account": "0x9568d36E291c2C4c34fa5593fcE73715abEf6F9c", - "isWrite": false, - "newValue": "0x0000000000000000000000009965507d1a55bcc2695c58ba16fb37d819b0a4dc", - "previousValue": "0x0000000000000000000000009965507d1a55bcc2695c58ba16fb37d819b0a4dc", - "reverted": false, - "slot": "0x000000000000000000000000000000000000000000000000000000000000000e" - } - ], - "value": 0 - }, - { - "accessor": "0x1804c8AB1F12E6bbf3894d4083f33e07309d1f38", - "account": "0x1c23A6d89F95ef3148BCDA8E242cAb145bf9c0E4", - "chainInfo": { - "chainId": 31337, - "forkId": 0 - }, - "data": "0x8da5cb5b", - "deployedCode": "0x", - "initialized": true, - "kind": "StaticCall", - "newBalance": 0, - "oldBalance": 0, - "reverted": false, - "storageAccesses": [ - { - "account": "0x1c23A6d89F95ef3148BCDA8E242cAb145bf9c0E4", - "isWrite": false, - "newValue": "0x000000000000000000000000809abd1c13738de7a76c85839779fcaa59fa32ce", - "previousValue": "0x000000000000000000000000809abd1c13738de7a76c85839779fcaa59fa32ce", - "reverted": false, - "slot": "0x360894a13ba1a3210667c828492db98dca3e2076cc3735a920a3ca505d382bbc" - } - ], - "value": 0 - }, - { - "accessor": "0x1804c8AB1F12E6bbf3894d4083f33e07309d1f38", - "account": "0x809abd1c13738dE7a76C85839779FCaa59FA32CE", - "chainInfo": { - "chainId": 31337, - "forkId": 0 - }, - "data": "0x8da5cb5b", - "deployedCode": "0x", - "initialized": true, - "kind": "DelegateCall", - "newBalance": 0, - "oldBalance": 0, - "reverted": false, - "storageAccesses": [ - { - "account": "0x1c23A6d89F95ef3148BCDA8E242cAb145bf9c0E4", - "isWrite": false, - "newValue": "0x0000000000000000000000009965507d1a55bcc2695c58ba16fb37d819b0a4dc", - "previousValue": "0x0000000000000000000000009965507d1a55bcc2695c58ba16fb37d819b0a4dc", - "reverted": false, - "slot": "0x0000000000000000000000000000000000000000000000000000000000000033" - } - ], - "value": 0 - }, - { - "accessor": "0x1804c8AB1F12E6bbf3894d4083f33e07309d1f38", - "account": "0x9568d36E291c2C4c34fa5593fcE73715abEf6F9c", - "chainInfo": { - "chainId": 31337, - "forkId": 0 - }, - "data": "0x81143a59", - "deployedCode": "0x", - "initialized": true, - "kind": "StaticCall", - "newBalance": 0, - "oldBalance": 0, - "reverted": false, - "storageAccesses": [ - { - "account": "0x9568d36E291c2C4c34fa5593fcE73715abEf6F9c", - "isWrite": false, - "newValue": "0x0000000000000000000000000000000000000000000000000000000000000834", - "previousValue": "0x0000000000000000000000000000000000000000000000000000000000000834", - "reverted": false, - "slot": "0x000000000000000000000000000000000000000000000000000000000000002d" - } - ], - "value": 0 - }, - { - "accessor": "0x1804c8AB1F12E6bbf3894d4083f33e07309d1f38", - "account": "0x1c23A6d89F95ef3148BCDA8E242cAb145bf9c0E4", - "chainInfo": { - "chainId": 31337, - "forkId": 0 - }, - "data": "0x0c18c162", - "deployedCode": "0x", - "initialized": true, - "kind": "StaticCall", - "newBalance": 0, - "oldBalance": 0, - "reverted": false, - "storageAccesses": [ - { - "account": "0x1c23A6d89F95ef3148BCDA8E242cAb145bf9c0E4", - "isWrite": false, - "newValue": "0x000000000000000000000000809abd1c13738de7a76c85839779fcaa59fa32ce", - "previousValue": "0x000000000000000000000000809abd1c13738de7a76c85839779fcaa59fa32ce", - "reverted": false, - "slot": "0x360894a13ba1a3210667c828492db98dca3e2076cc3735a920a3ca505d382bbc" - } - ], - "value": 0 - }, - { - "accessor": "0x1804c8AB1F12E6bbf3894d4083f33e07309d1f38", - "account": "0x809abd1c13738dE7a76C85839779FCaa59FA32CE", - "chainInfo": { - "chainId": 31337, - "forkId": 0 - }, - "data": "0x0c18c162", - "deployedCode": "0x", - "initialized": true, - "kind": "DelegateCall", - "newBalance": 0, - "oldBalance": 0, - "reverted": false, - "storageAccesses": [ - { - "account": "0x1c23A6d89F95ef3148BCDA8E242cAb145bf9c0E4", - "isWrite": false, - "newValue": "0x0000000000000000000000000000000000000000000000000000000000000834", - "previousValue": "0x0000000000000000000000000000000000000000000000000000000000000834", - "reverted": false, - "slot": "0x0000000000000000000000000000000000000000000000000000000000000065" - } - ], - "value": 0 - }, - { - "accessor": "0x1804c8AB1F12E6bbf3894d4083f33e07309d1f38", - "account": "0x9568d36E291c2C4c34fa5593fcE73715abEf6F9c", - "chainInfo": { - "chainId": 31337, - "forkId": 0 - }, - "data": "0x0ac77bb5", - "deployedCode": "0x", - "initialized": true, - "kind": "StaticCall", - "newBalance": 0, - "oldBalance": 0, - "reverted": false, - "storageAccesses": [ - { - "account": "0x9568d36E291c2C4c34fa5593fcE73715abEf6F9c", - "isWrite": false, - "newValue": "0x00000000000000000000000000000000000000000000000000000000000f4240", - "previousValue": "0x00000000000000000000000000000000000000000000000000000000000f4240", - "reverted": false, - "slot": "0x000000000000000000000000000000000000000000000000000000000000002e" - } - ], - "value": 0 - }, - { - "accessor": "0x1804c8AB1F12E6bbf3894d4083f33e07309d1f38", - "account": "0x1c23A6d89F95ef3148BCDA8E242cAb145bf9c0E4", - "chainInfo": { - "chainId": 31337, - "forkId": 0 - }, - "data": "0xf45e65d8", - "deployedCode": "0x", - "initialized": true, - "kind": "StaticCall", - "newBalance": 0, - "oldBalance": 0, - "reverted": false, - "storageAccesses": [ - { - "account": "0x1c23A6d89F95ef3148BCDA8E242cAb145bf9c0E4", - "isWrite": false, - "newValue": "0x000000000000000000000000809abd1c13738de7a76c85839779fcaa59fa32ce", - "previousValue": "0x000000000000000000000000809abd1c13738de7a76c85839779fcaa59fa32ce", - "reverted": false, - "slot": "0x360894a13ba1a3210667c828492db98dca3e2076cc3735a920a3ca505d382bbc" - } - ], - "value": 0 - }, - { - "accessor": "0x1804c8AB1F12E6bbf3894d4083f33e07309d1f38", - "account": "0x809abd1c13738dE7a76C85839779FCaa59FA32CE", - "chainInfo": { - "chainId": 31337, - "forkId": 0 - }, - "data": "0xf45e65d8", - "deployedCode": "0x", - "initialized": true, - "kind": "DelegateCall", - "newBalance": 0, - "oldBalance": 0, - "reverted": false, - "storageAccesses": [ - { - "account": "0x1c23A6d89F95ef3148BCDA8E242cAb145bf9c0E4", - "isWrite": false, - "newValue": "0x00000000000000000000000000000000000000000000000000000000000f4240", - "previousValue": "0x00000000000000000000000000000000000000000000000000000000000f4240", - "reverted": false, - "slot": "0x0000000000000000000000000000000000000000000000000000000000000066" - } - ], - "value": 0 - }, - { - "accessor": "0x1804c8AB1F12E6bbf3894d4083f33e07309d1f38", - "account": "0x9568d36E291c2C4c34fa5593fcE73715abEf6F9c", - "chainInfo": { - "chainId": 31337, - "forkId": 0 - }, - "data": "0x68ea2a43", - "deployedCode": "0x", - "initialized": true, - "kind": "StaticCall", - "newBalance": 0, - "oldBalance": 0, - "reverted": false, - "storageAccesses": [ - { - "account": "0x9568d36E291c2C4c34fa5593fcE73715abEf6F9c", - "isWrite": false, - "newValue": "0x0000000000000000000000003c44cdddb6a900fa2b585dd299e03d12fa4293bc", - "previousValue": "0x0000000000000000000000003c44cdddb6a900fa2b585dd299e03d12fa4293bc", - "reverted": false, - "slot": "0x0000000000000000000000000000000000000000000000000000000000000018" - } - ], - "value": 0 - }, - { - "accessor": "0x1804c8AB1F12E6bbf3894d4083f33e07309d1f38", - "account": "0x1c23A6d89F95ef3148BCDA8E242cAb145bf9c0E4", - "chainInfo": { - "chainId": 31337, - "forkId": 0 - }, - "data": "0xe81b2c6d", - "deployedCode": "0x", - "initialized": true, - "kind": "StaticCall", - "newBalance": 0, - "oldBalance": 0, - "reverted": false, - "storageAccesses": [ - { - "account": "0x1c23A6d89F95ef3148BCDA8E242cAb145bf9c0E4", - "isWrite": false, - "newValue": "0x000000000000000000000000809abd1c13738de7a76c85839779fcaa59fa32ce", - "previousValue": "0x000000000000000000000000809abd1c13738de7a76c85839779fcaa59fa32ce", - "reverted": false, - "slot": "0x360894a13ba1a3210667c828492db98dca3e2076cc3735a920a3ca505d382bbc" - } - ], - "value": 0 - }, - { - "accessor": "0x1804c8AB1F12E6bbf3894d4083f33e07309d1f38", - "account": "0x809abd1c13738dE7a76C85839779FCaa59FA32CE", - "chainInfo": { - "chainId": 31337, - "forkId": 0 - }, - "data": "0xe81b2c6d", - "deployedCode": "0x", - "initialized": true, - "kind": "DelegateCall", - "newBalance": 0, - "oldBalance": 0, - "reverted": false, - "storageAccesses": [ - { - "account": "0x1c23A6d89F95ef3148BCDA8E242cAb145bf9c0E4", - "isWrite": false, - "newValue": "0x0000000000000000000000003c44cdddb6a900fa2b585dd299e03d12fa4293bc", - "previousValue": "0x0000000000000000000000003c44cdddb6a900fa2b585dd299e03d12fa4293bc", - "reverted": false, - "slot": "0x0000000000000000000000000000000000000000000000000000000000000067" - } - ], - "value": 0 - }, - { - "accessor": "0x1804c8AB1F12E6bbf3894d4083f33e07309d1f38", - "account": "0x9568d36E291c2C4c34fa5593fcE73715abEf6F9c", - "chainInfo": { - "chainId": 31337, - "forkId": 0 - }, - "data": "0x2dde36f5", - "deployedCode": "0x", - "initialized": true, - "kind": "StaticCall", - "newBalance": 0, - "oldBalance": 0, - "reverted": false, - "storageAccesses": [ - { - "account": "0x9568d36E291c2C4c34fa5593fcE73715abEf6F9c", - "isWrite": false, - "newValue": "0x00000000000000000000000000000000000000000000000000000000017d7840", - "previousValue": "0x00000000000000000000000000000000000000000000000000000000017d7840", - "reverted": false, - "slot": "0x000000000000000000000000000000000000000000000000000000000000002c" - } - ], - "value": 0 - }, - { - "accessor": "0x1804c8AB1F12E6bbf3894d4083f33e07309d1f38", - "account": "0x1c23A6d89F95ef3148BCDA8E242cAb145bf9c0E4", - "chainInfo": { - "chainId": 31337, - "forkId": 0 - }, - "data": "0xf68016b7", - "deployedCode": "0x", - "initialized": true, - "kind": "StaticCall", - "newBalance": 0, - "oldBalance": 0, - "reverted": false, - "storageAccesses": [ - { - "account": "0x1c23A6d89F95ef3148BCDA8E242cAb145bf9c0E4", - "isWrite": false, - "newValue": "0x000000000000000000000000809abd1c13738de7a76c85839779fcaa59fa32ce", - "previousValue": "0x000000000000000000000000809abd1c13738de7a76c85839779fcaa59fa32ce", - "reverted": false, - "slot": "0x360894a13ba1a3210667c828492db98dca3e2076cc3735a920a3ca505d382bbc" - } - ], - "value": 0 - }, - { - "accessor": "0x1804c8AB1F12E6bbf3894d4083f33e07309d1f38", - "account": "0x809abd1c13738dE7a76C85839779FCaa59FA32CE", - "chainInfo": { - "chainId": 31337, - "forkId": 0 - }, - "data": "0xf68016b7", - "deployedCode": "0x", - "initialized": true, - "kind": "DelegateCall", - "newBalance": 0, - "oldBalance": 0, - "reverted": false, - "storageAccesses": [ - { - "account": "0x1c23A6d89F95ef3148BCDA8E242cAb145bf9c0E4", - "isWrite": false, - "newValue": "0x00000000000000000000000000000000000000000000000000000000017d7840", - "previousValue": "0x00000000000000000000000000000000000000000000000000000000017d7840", - "reverted": false, - "slot": "0x0000000000000000000000000000000000000000000000000000000000000068" - } - ], - "value": 0 - }, - { - "accessor": "0x1804c8AB1F12E6bbf3894d4083f33e07309d1f38", - "account": "0x9568d36E291c2C4c34fa5593fcE73715abEf6F9c", - "chainInfo": { - "chainId": 31337, - "forkId": 0 - }, - "data": "0xe7d6cd42", - "deployedCode": "0x", - "initialized": true, - "kind": "StaticCall", - "newBalance": 0, - "oldBalance": 0, - "reverted": false, - "storageAccesses": [ - { - "account": "0x9568d36E291c2C4c34fa5593fcE73715abEf6F9c", - "isWrite": false, - "newValue": "0x0000000000000000000000009965507d1a55bcc2695c58ba16fb37d819b0a4dc", - "previousValue": "0x0000000000000000000000009965507d1a55bcc2695c58ba16fb37d819b0a4dc", - "reverted": false, - "slot": "0x0000000000000000000000000000000000000000000000000000000000000016" - } - ], - "value": 0 - }, - { - "accessor": "0x1804c8AB1F12E6bbf3894d4083f33e07309d1f38", - "account": "0x1c23A6d89F95ef3148BCDA8E242cAb145bf9c0E4", - "chainInfo": { - "chainId": 31337, - "forkId": 0 - }, - "data": "0x1fd19ee1", - "deployedCode": "0x", - "initialized": true, - "kind": "StaticCall", - "newBalance": 0, - "oldBalance": 0, - "reverted": false, - "storageAccesses": [ - { - "account": "0x1c23A6d89F95ef3148BCDA8E242cAb145bf9c0E4", - "isWrite": false, - "newValue": "0x000000000000000000000000809abd1c13738de7a76c85839779fcaa59fa32ce", - "previousValue": "0x000000000000000000000000809abd1c13738de7a76c85839779fcaa59fa32ce", - "reverted": false, - "slot": "0x360894a13ba1a3210667c828492db98dca3e2076cc3735a920a3ca505d382bbc" - } - ], - "value": 0 - }, - { - "accessor": "0x1804c8AB1F12E6bbf3894d4083f33e07309d1f38", - "account": "0x809abd1c13738dE7a76C85839779FCaa59FA32CE", - "chainInfo": { - "chainId": 31337, - "forkId": 0 - }, - "data": "0x1fd19ee1", - "deployedCode": "0x", - "initialized": true, - "kind": "DelegateCall", - "newBalance": 0, - "oldBalance": 0, - "reverted": false, - "storageAccesses": [ - { - "account": "0x1c23A6d89F95ef3148BCDA8E242cAb145bf9c0E4", - "isWrite": false, - "newValue": "0x0000000000000000000000009965507d1a55bcc2695c58ba16fb37d819b0a4dc", - "previousValue": "0x0000000000000000000000009965507d1a55bcc2695c58ba16fb37d819b0a4dc", - "reverted": false, - "slot": "0x65a7ed542fb37fe237fdfbdd70b31598523fe5b32879e307bae27a0bd9581c08" - } - ], - "value": 0 - }, - { - "accessor": "0x1804c8AB1F12E6bbf3894d4083f33e07309d1f38", - "account": "0x9568d36E291c2C4c34fa5593fcE73715abEf6F9c", - "chainInfo": { - "chainId": 31337, - "forkId": 0 - }, - "data": "0x102c9aa4", - "deployedCode": "0x", - "initialized": true, - "kind": "StaticCall", - "newBalance": 0, - "oldBalance": 0, - "reverted": false, - "storageAccesses": [ - { - "account": "0x9568d36E291c2C4c34fa5593fcE73715abEf6F9c", - "isWrite": false, - "newValue": "0x0000000000000000000000000000000000000000000000000000000000000000", - "previousValue": "0x0000000000000000000000000000000000000000000000000000000000000000", - "reverted": false, - "slot": "0x000000000000000000000000000000000000000000000000000000000000003c" - } - ], - "value": 0 - }, - { - "accessor": "0x1804c8AB1F12E6bbf3894d4083f33e07309d1f38", - "account": "0x1c23A6d89F95ef3148BCDA8E242cAb145bf9c0E4", - "chainInfo": { - "chainId": 31337, - "forkId": 0 - }, - "data": "0x48cd4cb1", - "deployedCode": "0x", - "initialized": true, - "kind": "StaticCall", - "newBalance": 0, - "oldBalance": 0, - "reverted": false, - "storageAccesses": [ - { - "account": "0x1c23A6d89F95ef3148BCDA8E242cAb145bf9c0E4", - "isWrite": false, - "newValue": "0x000000000000000000000000809abd1c13738de7a76c85839779fcaa59fa32ce", - "previousValue": "0x000000000000000000000000809abd1c13738de7a76c85839779fcaa59fa32ce", - "reverted": false, - "slot": "0x360894a13ba1a3210667c828492db98dca3e2076cc3735a920a3ca505d382bbc" - } - ], - "value": 0 - }, - { - "accessor": "0x1804c8AB1F12E6bbf3894d4083f33e07309d1f38", - "account": "0x809abd1c13738dE7a76C85839779FCaa59FA32CE", - "chainInfo": { - "chainId": 31337, - "forkId": 0 - }, - "data": "0x48cd4cb1", - "deployedCode": "0x", - "initialized": true, - "kind": "DelegateCall", - "newBalance": 0, - "oldBalance": 0, - "reverted": false, - "storageAccesses": [ - { - "account": "0x1c23A6d89F95ef3148BCDA8E242cAb145bf9c0E4", - "isWrite": false, - "newValue": "0x0000000000000000000000000000000000000000000000000000000000000001", - "previousValue": "0x0000000000000000000000000000000000000000000000000000000000000001", - "reverted": false, - "slot": "0xa11ee3ab75b40e88a0105e935d17cd36c8faee0138320d776c411291bdbbb19f" - } - ], - "value": 0 - }, - { - "accessor": "0x1804c8AB1F12E6bbf3894d4083f33e07309d1f38", - "account": "0x9568d36E291c2C4c34fa5593fcE73715abEf6F9c", - "chainInfo": { - "chainId": 31337, - "forkId": 0 - }, - "data": "0x9c16360f", - "deployedCode": "0x", - "initialized": true, - "kind": "StaticCall", - "newBalance": 0, - "oldBalance": 0, - "reverted": false, - "storageAccesses": [ - { - "account": "0x9568d36E291c2C4c34fa5593fcE73715abEf6F9c", - "isWrite": false, - "newValue": "0x000000000000000000000000ff00000000000000000000000000000000000000", - "previousValue": "0x000000000000000000000000ff00000000000000000000000000000000000000", - "reverted": false, - "slot": "0x0000000000000000000000000000000000000000000000000000000000000017" - } - ], - "value": 0 - }, - { - "accessor": "0x1804c8AB1F12E6bbf3894d4083f33e07309d1f38", - "account": "0x1c23A6d89F95ef3148BCDA8E242cAb145bf9c0E4", - "chainInfo": { - "chainId": 31337, - "forkId": 0 - }, - "data": "0xdac6e63a", - "deployedCode": "0x", - "initialized": true, - "kind": "StaticCall", - "newBalance": 0, - "oldBalance": 0, - "reverted": false, - "storageAccesses": [ - { - "account": "0x1c23A6d89F95ef3148BCDA8E242cAb145bf9c0E4", - "isWrite": false, - "newValue": "0x000000000000000000000000809abd1c13738de7a76c85839779fcaa59fa32ce", - "previousValue": "0x000000000000000000000000809abd1c13738de7a76c85839779fcaa59fa32ce", - "reverted": false, - "slot": "0x360894a13ba1a3210667c828492db98dca3e2076cc3735a920a3ca505d382bbc" - } - ], - "value": 0 - }, - { - "accessor": "0x1804c8AB1F12E6bbf3894d4083f33e07309d1f38", - "account": "0x809abd1c13738dE7a76C85839779FCaa59FA32CE", - "chainInfo": { - "chainId": 31337, - "forkId": 0 - }, - "data": "0xdac6e63a", - "deployedCode": "0x", - "initialized": true, - "kind": "DelegateCall", - "newBalance": 0, - "oldBalance": 0, - "reverted": false, - "storageAccesses": [ - { - "account": "0x1c23A6d89F95ef3148BCDA8E242cAb145bf9c0E4", - "isWrite": false, - "newValue": "0x000000000000000000000000ff00000000000000000000000000000000000000", - "previousValue": "0x000000000000000000000000ff00000000000000000000000000000000000000", - "reverted": false, - "slot": "0x71ac12829d66ee73d8d95bff50b3589745ce57edae70a3fb111a2342464dc597" - } - ], - "value": 0 - }, - { - "accessor": "0x1804c8AB1F12E6bbf3894d4083f33e07309d1f38", - "account": "0x1c23A6d89F95ef3148BCDA8E242cAb145bf9c0E4", - "chainInfo": { - "chainId": 31337, - "forkId": 0 - }, - "data": "0xa7119869", - "deployedCode": "0x", - "initialized": true, - "kind": "StaticCall", - "newBalance": 0, - "oldBalance": 0, - "reverted": false, - "storageAccesses": [ - { - "account": "0x1c23A6d89F95ef3148BCDA8E242cAb145bf9c0E4", - "isWrite": false, - "newValue": "0x000000000000000000000000809abd1c13738de7a76c85839779fcaa59fa32ce", - "previousValue": "0x000000000000000000000000809abd1c13738de7a76c85839779fcaa59fa32ce", - "reverted": false, - "slot": "0x360894a13ba1a3210667c828492db98dca3e2076cc3735a920a3ca505d382bbc" - } - ], - "value": 0 - }, - { - "accessor": "0x1804c8AB1F12E6bbf3894d4083f33e07309d1f38", - "account": "0x809abd1c13738dE7a76C85839779FCaa59FA32CE", - "chainInfo": { - "chainId": 31337, - "forkId": 0 - }, - "data": "0xa7119869", - "deployedCode": "0x", - "initialized": true, - "kind": "DelegateCall", - "newBalance": 0, - "oldBalance": 0, - "reverted": false, - "storageAccesses": [ - { - "account": "0x1c23A6d89F95ef3148BCDA8E242cAb145bf9c0E4", - "isWrite": false, - "newValue": "0x00000000000000000000000020a42a5a785622c6ba2576b2d6e924aa82bfa11d", - "previousValue": "0x00000000000000000000000020a42a5a785622c6ba2576b2d6e924aa82bfa11d", - "reverted": false, - "slot": "0x383f291819e6d54073bc9a648251d97421076bdd101933c0c022219ce9580636" - } - ], - "value": 0 - }, - { - "accessor": "0x1804c8AB1F12E6bbf3894d4083f33e07309d1f38", - "account": "0x1c23A6d89F95ef3148BCDA8E242cAb145bf9c0E4", - "chainInfo": { - "chainId": 31337, - "forkId": 0 - }, - "data": "0xc4e8ddfa", - "deployedCode": "0x", - "initialized": true, - "kind": "StaticCall", - "newBalance": 0, - "oldBalance": 0, - "reverted": false, - "storageAccesses": [ - { - "account": "0x1c23A6d89F95ef3148BCDA8E242cAb145bf9c0E4", - "isWrite": false, - "newValue": "0x000000000000000000000000809abd1c13738de7a76c85839779fcaa59fa32ce", - "previousValue": "0x000000000000000000000000809abd1c13738de7a76c85839779fcaa59fa32ce", - "reverted": false, - "slot": "0x360894a13ba1a3210667c828492db98dca3e2076cc3735a920a3ca505d382bbc" - } - ], - "value": 0 - }, - { - "accessor": "0x1804c8AB1F12E6bbf3894d4083f33e07309d1f38", - "account": "0x809abd1c13738dE7a76C85839779FCaa59FA32CE", - "chainInfo": { - "chainId": 31337, - "forkId": 0 - }, - "data": "0xc4e8ddfa", - "deployedCode": "0x", - "initialized": true, - "kind": "DelegateCall", - "newBalance": 0, - "oldBalance": 0, - "reverted": false, - "storageAccesses": [ - { - "account": "0x1c23A6d89F95ef3148BCDA8E242cAb145bf9c0E4", - "isWrite": false, - "newValue": "0x000000000000000000000000def3bca8c80064589e6787477ffa7dd616b5574f", - "previousValue": "0x000000000000000000000000def3bca8c80064589e6787477ffa7dd616b5574f", - "reverted": false, - "slot": "0x46adcbebc6be8ce551740c29c47c8798210f23f7f4086c41752944352568d5a7" - } - ], - "value": 0 - }, - { - "accessor": "0x1804c8AB1F12E6bbf3894d4083f33e07309d1f38", - "account": "0x1c23A6d89F95ef3148BCDA8E242cAb145bf9c0E4", - "chainInfo": { - "chainId": 31337, - "forkId": 0 - }, - "data": "0x078f29cf", - "deployedCode": "0x", - "initialized": true, - "kind": "StaticCall", - "newBalance": 0, - "oldBalance": 0, - "reverted": false, - "storageAccesses": [ - { - "account": "0x1c23A6d89F95ef3148BCDA8E242cAb145bf9c0E4", - "isWrite": false, - "newValue": "0x000000000000000000000000809abd1c13738de7a76c85839779fcaa59fa32ce", - "previousValue": "0x000000000000000000000000809abd1c13738de7a76c85839779fcaa59fa32ce", - "reverted": false, - "slot": "0x360894a13ba1a3210667c828492db98dca3e2076cc3735a920a3ca505d382bbc" - } - ], - "value": 0 - }, - { - "accessor": "0x1804c8AB1F12E6bbf3894d4083f33e07309d1f38", - "account": "0x809abd1c13738dE7a76C85839779FCaa59FA32CE", - "chainInfo": { - "chainId": 31337, - "forkId": 0 - }, - "data": "0x078f29cf", - "deployedCode": "0x", - "initialized": true, - "kind": "DelegateCall", - "newBalance": 0, - "oldBalance": 0, - "reverted": false, - "storageAccesses": [ - { - "account": "0x1c23A6d89F95ef3148BCDA8E242cAb145bf9c0E4", - "isWrite": false, - "newValue": "0x0000000000000000000000000c8b5822b6e02cda722174f19a1439a7495a3fa6", - "previousValue": "0x0000000000000000000000000c8b5822b6e02cda722174f19a1439a7495a3fa6", - "reverted": false, - "slot": "0x9904ba90dde5696cda05c9e0dab5cbaa0fea005ace4d11218a02ac668dad6376" - } - ], - "value": 0 - }, - { - "accessor": "0x1804c8AB1F12E6bbf3894d4083f33e07309d1f38", - "account": "0x1c23A6d89F95ef3148BCDA8E242cAb145bf9c0E4", - "chainInfo": { - "chainId": 31337, - "forkId": 0 - }, - "data": "0xf2b4e617", - "deployedCode": "0x", - "initialized": true, - "kind": "StaticCall", - "newBalance": 0, - "oldBalance": 0, - "reverted": false, - "storageAccesses": [ - { - "account": "0x1c23A6d89F95ef3148BCDA8E242cAb145bf9c0E4", - "isWrite": false, - "newValue": "0x000000000000000000000000809abd1c13738de7a76c85839779fcaa59fa32ce", - "previousValue": "0x000000000000000000000000809abd1c13738de7a76c85839779fcaa59fa32ce", - "reverted": false, - "slot": "0x360894a13ba1a3210667c828492db98dca3e2076cc3735a920a3ca505d382bbc" - } - ], - "value": 0 - }, - { - "accessor": "0x1804c8AB1F12E6bbf3894d4083f33e07309d1f38", - "account": "0x809abd1c13738dE7a76C85839779FCaa59FA32CE", - "chainInfo": { - "chainId": 31337, - "forkId": 0 - }, - "data": "0xf2b4e617", - "deployedCode": "0x", - "initialized": true, - "kind": "DelegateCall", - "newBalance": 0, - "oldBalance": 0, - "reverted": false, - "storageAccesses": [ - { - "account": "0x1c23A6d89F95ef3148BCDA8E242cAb145bf9c0E4", - "isWrite": false, - "newValue": "0x0000000000000000000000000000000000000000000000000000000000000000", - "previousValue": "0x0000000000000000000000000000000000000000000000000000000000000000", - "reverted": false, - "slot": "0x52322a25d9f59ea17656545543306b7aef62bc0cc53a0e65ccfa0c75b97aa906" - } - ], - "value": 0 - }, - { - "accessor": "0x1804c8AB1F12E6bbf3894d4083f33e07309d1f38", - "account": "0x1c23A6d89F95ef3148BCDA8E242cAb145bf9c0E4", - "chainInfo": { - "chainId": 31337, - "forkId": 0 - }, - "data": "0x0a49cb03", - "deployedCode": "0x", - "initialized": true, - "kind": "StaticCall", - "newBalance": 0, - "oldBalance": 0, - "reverted": false, - "storageAccesses": [ - { - "account": "0x1c23A6d89F95ef3148BCDA8E242cAb145bf9c0E4", - "isWrite": false, - "newValue": "0x000000000000000000000000809abd1c13738de7a76c85839779fcaa59fa32ce", - "previousValue": "0x000000000000000000000000809abd1c13738de7a76c85839779fcaa59fa32ce", - "reverted": false, - "slot": "0x360894a13ba1a3210667c828492db98dca3e2076cc3735a920a3ca505d382bbc" - } - ], - "value": 0 - }, - { - "accessor": "0x1804c8AB1F12E6bbf3894d4083f33e07309d1f38", - "account": "0x809abd1c13738dE7a76C85839779FCaa59FA32CE", - "chainInfo": { - "chainId": 31337, - "forkId": 0 - }, - "data": "0x0a49cb03", - "deployedCode": "0x", - "initialized": true, - "kind": "DelegateCall", - "newBalance": 0, - "oldBalance": 0, - "reverted": false, - "storageAccesses": [ - { - "account": "0x1c23A6d89F95ef3148BCDA8E242cAb145bf9c0E4", - "isWrite": false, - "newValue": "0x000000000000000000000000978e3286eb805934215a88694d80b09aded68d90", - "previousValue": "0x000000000000000000000000978e3286eb805934215a88694d80b09aded68d90", - "reverted": false, - "slot": "0x4b6c74f9e688cb39801f2112c14a8c57232a3fc5202e1444126d4bce86eb19ac" - } - ], - "value": 0 - }, - { - "accessor": "0x1804c8AB1F12E6bbf3894d4083f33e07309d1f38", - "account": "0x1c23A6d89F95ef3148BCDA8E242cAb145bf9c0E4", - "chainInfo": { - "chainId": 31337, - "forkId": 0 - }, - "data": "0x9b7d7f0a", - "deployedCode": "0x", - "initialized": true, - "kind": "StaticCall", - "newBalance": 0, - "oldBalance": 0, - "reverted": false, - "storageAccesses": [ - { - "account": "0x1c23A6d89F95ef3148BCDA8E242cAb145bf9c0E4", - "isWrite": false, - "newValue": "0x000000000000000000000000809abd1c13738de7a76c85839779fcaa59fa32ce", - "previousValue": "0x000000000000000000000000809abd1c13738de7a76c85839779fcaa59fa32ce", - "reverted": false, - "slot": "0x360894a13ba1a3210667c828492db98dca3e2076cc3735a920a3ca505d382bbc" - } - ], - "value": 0 - }, - { - "accessor": "0x1804c8AB1F12E6bbf3894d4083f33e07309d1f38", - "account": "0x809abd1c13738dE7a76C85839779FCaa59FA32CE", - "chainInfo": { - "chainId": 31337, - "forkId": 0 - }, - "data": "0x9b7d7f0a", - "deployedCode": "0x", - "initialized": true, - "kind": "DelegateCall", - "newBalance": 0, - "oldBalance": 0, - "reverted": false, - "storageAccesses": [ - { - "account": "0x1c23A6d89F95ef3148BCDA8E242cAb145bf9c0E4", - "isWrite": false, - "newValue": "0x0000000000000000000000000000000000000000000000000000000000000000", - "previousValue": "0x0000000000000000000000000000000000000000000000000000000000000000", - "reverted": false, - "slot": "0xa04c5bb938ca6fc46d95553abf0a76345ce3e722a30bf4f74928b8e7d852320c" - } - ], - "value": 0 - }, - { - "accessor": "0x7FA9385bE102ac3EAc297483Dd6233D62b3e1496", - "account": "0x7109709ECfa91a80626fF3989D68f67F5b1DD12D", - "chainInfo": { - "chainId": 31337, - "forkId": 0 - }, - "data": "0x", - "deployedCode": "0x", - "initialized": true, - "kind": "Resume", - "newBalance": 0, - "oldBalance": 0, - "reverted": false, - "storageAccesses": [], - "value": 0 - }, - { - "accessor": "0x7FA9385bE102ac3EAc297483Dd6233D62b3e1496", - "account": "0x7109709ECfa91a80626fF3989D68f67F5b1DD12D", - "chainInfo": { - "chainId": 31337, - "forkId": 0 - }, - "data": "0x", - "deployedCode": "0x", - "initialized": true, - "kind": "Resume", - "newBalance": 0, - "oldBalance": 0, - "reverted": false, - "storageAccesses": [], - "value": 0 - }, - { - "accessor": "0x1804c8AB1F12E6bbf3894d4083f33e07309d1f38", - "account": "0xDB8cFf278adCCF9E9b5da745B44E754fC4EE3C76", - "chainInfo": { - "chainId": 31337, - "forkId": 0 - }, - "data": "0x6bd9f5160000000000000000000000000c8b5822b6e02cda722174f19a1439a7495a3fa6", - "deployedCode": "0x", - "initialized": true, - "kind": "StaticCall", - "newBalance": 0, - "oldBalance": 0, - "reverted": false, - "storageAccesses": [ - { - "account": "0xDB8cFf278adCCF9E9b5da745B44E754fC4EE3C76", - "isWrite": false, - "newValue": "0x0000000000000000000000000000000000000000000000000000000000000000", - "previousValue": "0x0000000000000000000000000000000000000000000000000000000000000000", - "reverted": false, - "slot": "0xa8f0d50211ac8ff1a40793a899dff3ced4762e0466f69b0078ab7b00d037835c" - } - ], - "value": 0 - }, - { - "accessor": "0x1804c8AB1F12E6bbf3894d4083f33e07309d1f38", - "account": "0x7d039be7F9b5190147621b02e82B250e1D748e02", - "chainInfo": { - "chainId": 31337, - "forkId": 0 - }, - "data": "0x6a761202000000000000000000000000db8cff278adccf9e9b5da745b44e754fc4ee3c760000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000014000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000001c000000000000000000000000000000000000000000000000000000000000000448d52d4a00000000000000000000000000c8b5822b6e02cda722174f19a1439a7495a3fa600000000000000000000000000000000000000000000000000000000000000010000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000410000000000000000000000001804c8ab1f12e6bbf3894d4083f33e07309d1f3800000000000000000000000000000000000000000000000000000000000000000100000000000000000000000000000000000000000000000000000000000000", - "deployedCode": "0x", - "initialized": true, - "kind": "Call", - "newBalance": 0, - "oldBalance": 0, - "reverted": false, - "storageAccesses": [ - { - "account": "0x7d039be7F9b5190147621b02e82B250e1D748e02", - "isWrite": false, - "newValue": "0x00000000000000000000000090193c961a926261b756d1e5bb255e67ff9498a1", - "previousValue": "0x00000000000000000000000090193c961a926261b756d1e5bb255e67ff9498a1", - "reverted": false, - "slot": "0x0000000000000000000000000000000000000000000000000000000000000000" - } - ], - "value": 0 - }, - { - "accessor": "0x1804c8AB1F12E6bbf3894d4083f33e07309d1f38", - "account": "0x90193C961A926261B756D1E5bb255e67ff9498A1", - "chainInfo": { - "chainId": 31337, - "forkId": 0 - }, - "data": "0x6a761202000000000000000000000000db8cff278adccf9e9b5da745b44e754fc4ee3c760000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000014000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000001c000000000000000000000000000000000000000000000000000000000000000448d52d4a00000000000000000000000000c8b5822b6e02cda722174f19a1439a7495a3fa600000000000000000000000000000000000000000000000000000000000000010000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000410000000000000000000000001804c8ab1f12e6bbf3894d4083f33e07309d1f3800000000000000000000000000000000000000000000000000000000000000000100000000000000000000000000000000000000000000000000000000000000", - "deployedCode": "0x", - "initialized": true, - "kind": "DelegateCall", - "newBalance": 0, - "oldBalance": 0, - "reverted": false, - "storageAccesses": [ - { - "account": "0x7d039be7F9b5190147621b02e82B250e1D748e02", - "isWrite": false, - "newValue": "0x0000000000000000000000000000000000000000000000000000000000000003", - "previousValue": "0x0000000000000000000000000000000000000000000000000000000000000003", - "reverted": false, - "slot": "0x0000000000000000000000000000000000000000000000000000000000000005" - }, - { - "account": "0x7d039be7F9b5190147621b02e82B250e1D748e02", - "isWrite": false, - "newValue": "0x0000000000000000000000000000000000000000000000000000000000000003", - "previousValue": "0x0000000000000000000000000000000000000000000000000000000000000003", - "reverted": false, - "slot": "0x0000000000000000000000000000000000000000000000000000000000000005" - }, - { - "account": "0x7d039be7F9b5190147621b02e82B250e1D748e02", - "isWrite": true, - "newValue": "0x0000000000000000000000000000000000000000000000000000000000000004", - "previousValue": "0x0000000000000000000000000000000000000000000000000000000000000003", - "reverted": false, - "slot": "0x0000000000000000000000000000000000000000000000000000000000000005" - }, - { - "account": "0x7d039be7F9b5190147621b02e82B250e1D748e02", - "isWrite": false, - "newValue": "0x0000000000000000000000000000000000000000000000000000000000000001", - "previousValue": "0x0000000000000000000000000000000000000000000000000000000000000001", - "reverted": false, - "slot": "0x0000000000000000000000000000000000000000000000000000000000000004" - }, - { - "account": "0x7d039be7F9b5190147621b02e82B250e1D748e02", - "isWrite": false, - "newValue": "0x0000000000000000000000000000000000000000000000000000000000000001", - "previousValue": "0x0000000000000000000000000000000000000000000000000000000000000001", - "reverted": false, - "slot": "0xd1b0d319c6526317dce66989b393dcfb4435c9a65e399a088b63bbf65d7aee32" - }, - { - "account": "0x7d039be7F9b5190147621b02e82B250e1D748e02", - "isWrite": false, - "newValue": "0x0000000000000000000000000000000000000000000000000000000000000000", - "previousValue": "0x0000000000000000000000000000000000000000000000000000000000000000", - "reverted": false, - "slot": "0x4a204f620c8c5ccdca3fd54d003badd85ba500436a431f0cbda4f558c93c34c8" - } - ], - "value": 0 - }, - { - "accessor": "0x7d039be7F9b5190147621b02e82B250e1D748e02", - "account": "0xDB8cFf278adCCF9E9b5da745B44E754fC4EE3C76", - "chainInfo": { - "chainId": 31337, - "forkId": 0 - }, - "data": "0x8d52d4a00000000000000000000000000c8b5822b6e02cda722174f19a1439a7495a3fa60000000000000000000000000000000000000000000000000000000000000001", - "deployedCode": "0x", - "initialized": true, - "kind": "Call", - "newBalance": 0, - "oldBalance": 0, - "reverted": false, - "storageAccesses": [ - { - "account": "0xDB8cFf278adCCF9E9b5da745B44E754fC4EE3C76", - "isWrite": false, - "newValue": "0x0000000000000000000000007d039be7f9b5190147621b02e82b250e1d748e02", - "previousValue": "0x0000000000000000000000007d039be7f9b5190147621b02e82b250e1d748e02", - "reverted": false, - "slot": "0x0000000000000000000000000000000000000000000000000000000000000000" - }, - { - "account": "0xDB8cFf278adCCF9E9b5da745B44E754fC4EE3C76", - "isWrite": false, - "newValue": "0x0000000000000000000000000000000000000000000000000000000000000000", - "previousValue": "0x0000000000000000000000000000000000000000000000000000000000000000", - "reverted": false, - "slot": "0xa8f0d50211ac8ff1a40793a899dff3ced4762e0466f69b0078ab7b00d037835c" - }, - { - "account": "0xDB8cFf278adCCF9E9b5da745B44E754fC4EE3C76", - "isWrite": true, - "newValue": "0x0000000000000000000000000000000000000000000000000000000000000001", - "previousValue": "0x0000000000000000000000000000000000000000000000000000000000000000", - "reverted": false, - "slot": "0xa8f0d50211ac8ff1a40793a899dff3ced4762e0466f69b0078ab7b00d037835c" - } - ], - "value": 0 - }, - { - "accessor": "0x1804c8AB1F12E6bbf3894d4083f33e07309d1f38", - "account": "0xDB8cFf278adCCF9E9b5da745B44E754fC4EE3C76", - "chainInfo": { - "chainId": 31337, - "forkId": 0 - }, - "data": "0x6bd9f5160000000000000000000000000c8b5822b6e02cda722174f19a1439a7495a3fa6", - "deployedCode": "0x", - "initialized": true, - "kind": "StaticCall", - "newBalance": 0, - "oldBalance": 0, - "reverted": false, - "storageAccesses": [ - { - "account": "0xDB8cFf278adCCF9E9b5da745B44E754fC4EE3C76", - "isWrite": false, - "newValue": "0x0000000000000000000000000000000000000000000000000000000000000001", - "previousValue": "0x0000000000000000000000000000000000000000000000000000000000000001", - "reverted": false, - "slot": "0xa8f0d50211ac8ff1a40793a899dff3ced4762e0466f69b0078ab7b00d037835c" - } - ], - "value": 0 - }, - { - "accessor": "0x1804c8AB1F12E6bbf3894d4083f33e07309d1f38", - "account": "0x7d039be7F9b5190147621b02e82B250e1D748e02", - "chainInfo": { - "chainId": 31337, - "forkId": 0 - }, - "data": "0x6a761202000000000000000000000000db8cff278adccf9e9b5da745b44e754fc4ee3c7600000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000140000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000028000000000000000000000000000000000000000000000000000000000000001049623609d0000000000000000000000000c8b5822b6e02cda722174f19a1439a7495a3fa600000000000000000000000004c50b398cd4182428e79f7186b7c919cf17e86f00000000000000000000000000000000000000000000000000000000000000600000000000000000000000000000000000000000000000000000000000000064c0c53b8b00000000000000000000000020a42a5a785622c6ba2576b2d6e924aa82bfa11d000000000000000000000000deb1e9a6be7baf84208bb6e10ac9f9bbe1d708090000000000000000000000001c23a6d89f95ef3148bcda8e242cab145bf9c0e4000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000410000000000000000000000001804c8ab1f12e6bbf3894d4083f33e07309d1f3800000000000000000000000000000000000000000000000000000000000000000100000000000000000000000000000000000000000000000000000000000000", - "deployedCode": "0x", - "initialized": true, - "kind": "Call", - "newBalance": 0, - "oldBalance": 0, - "reverted": false, - "storageAccesses": [ - { - "account": "0x7d039be7F9b5190147621b02e82B250e1D748e02", - "isWrite": false, - "newValue": "0x00000000000000000000000090193c961a926261b756d1e5bb255e67ff9498a1", - "previousValue": "0x00000000000000000000000090193c961a926261b756d1e5bb255e67ff9498a1", - "reverted": false, - "slot": "0x0000000000000000000000000000000000000000000000000000000000000000" - } - ], - "value": 0 - }, - { - "accessor": "0x1804c8AB1F12E6bbf3894d4083f33e07309d1f38", - "account": "0x90193C961A926261B756D1E5bb255e67ff9498A1", - "chainInfo": { - "chainId": 31337, - "forkId": 0 - }, - "data": "0x6a761202000000000000000000000000db8cff278adccf9e9b5da745b44e754fc4ee3c7600000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000140000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000028000000000000000000000000000000000000000000000000000000000000001049623609d0000000000000000000000000c8b5822b6e02cda722174f19a1439a7495a3fa600000000000000000000000004c50b398cd4182428e79f7186b7c919cf17e86f00000000000000000000000000000000000000000000000000000000000000600000000000000000000000000000000000000000000000000000000000000064c0c53b8b00000000000000000000000020a42a5a785622c6ba2576b2d6e924aa82bfa11d000000000000000000000000deb1e9a6be7baf84208bb6e10ac9f9bbe1d708090000000000000000000000001c23a6d89f95ef3148bcda8e242cab145bf9c0e4000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000410000000000000000000000001804c8ab1f12e6bbf3894d4083f33e07309d1f3800000000000000000000000000000000000000000000000000000000000000000100000000000000000000000000000000000000000000000000000000000000", - "deployedCode": "0x", - "initialized": true, - "kind": "DelegateCall", - "newBalance": 0, - "oldBalance": 0, - "reverted": false, - "storageAccesses": [ - { - "account": "0x7d039be7F9b5190147621b02e82B250e1D748e02", - "isWrite": false, - "newValue": "0x0000000000000000000000000000000000000000000000000000000000000004", - "previousValue": "0x0000000000000000000000000000000000000000000000000000000000000004", - "reverted": false, - "slot": "0x0000000000000000000000000000000000000000000000000000000000000005" - }, - { - "account": "0x7d039be7F9b5190147621b02e82B250e1D748e02", - "isWrite": false, - "newValue": "0x0000000000000000000000000000000000000000000000000000000000000004", - "previousValue": "0x0000000000000000000000000000000000000000000000000000000000000004", - "reverted": false, - "slot": "0x0000000000000000000000000000000000000000000000000000000000000005" - }, - { - "account": "0x7d039be7F9b5190147621b02e82B250e1D748e02", - "isWrite": true, - "newValue": "0x0000000000000000000000000000000000000000000000000000000000000005", - "previousValue": "0x0000000000000000000000000000000000000000000000000000000000000004", - "reverted": false, - "slot": "0x0000000000000000000000000000000000000000000000000000000000000005" - }, - { - "account": "0x7d039be7F9b5190147621b02e82B250e1D748e02", - "isWrite": false, - "newValue": "0x0000000000000000000000000000000000000000000000000000000000000001", - "previousValue": "0x0000000000000000000000000000000000000000000000000000000000000001", - "reverted": false, - "slot": "0x0000000000000000000000000000000000000000000000000000000000000004" - }, - { - "account": "0x7d039be7F9b5190147621b02e82B250e1D748e02", - "isWrite": false, - "newValue": "0x0000000000000000000000000000000000000000000000000000000000000001", - "previousValue": "0x0000000000000000000000000000000000000000000000000000000000000001", - "reverted": false, - "slot": "0xd1b0d319c6526317dce66989b393dcfb4435c9a65e399a088b63bbf65d7aee32" - }, - { - "account": "0x7d039be7F9b5190147621b02e82B250e1D748e02", - "isWrite": false, - "newValue": "0x0000000000000000000000000000000000000000000000000000000000000000", - "previousValue": "0x0000000000000000000000000000000000000000000000000000000000000000", - "reverted": false, - "slot": "0x4a204f620c8c5ccdca3fd54d003badd85ba500436a431f0cbda4f558c93c34c8" - } - ], - "value": 0 - }, - { - "accessor": "0x7d039be7F9b5190147621b02e82B250e1D748e02", - "account": "0xDB8cFf278adCCF9E9b5da745B44E754fC4EE3C76", - "chainInfo": { - "chainId": 31337, - "forkId": 0 - }, - "data": "0x9623609d0000000000000000000000000c8b5822b6e02cda722174f19a1439a7495a3fa600000000000000000000000004c50b398cd4182428e79f7186b7c919cf17e86f00000000000000000000000000000000000000000000000000000000000000600000000000000000000000000000000000000000000000000000000000000064c0c53b8b00000000000000000000000020a42a5a785622c6ba2576b2d6e924aa82bfa11d000000000000000000000000deb1e9a6be7baf84208bb6e10ac9f9bbe1d708090000000000000000000000001c23a6d89f95ef3148bcda8e242cab145bf9c0e400000000000000000000000000000000000000000000000000000000", - "deployedCode": "0x", - "initialized": true, - "kind": "Call", - "newBalance": 0, - "oldBalance": 0, - "reverted": false, - "storageAccesses": [ - { - "account": "0xDB8cFf278adCCF9E9b5da745B44E754fC4EE3C76", - "isWrite": false, - "newValue": "0x0000000000000000000000007d039be7f9b5190147621b02e82b250e1d748e02", - "previousValue": "0x0000000000000000000000007d039be7f9b5190147621b02e82b250e1d748e02", - "reverted": false, - "slot": "0x0000000000000000000000000000000000000000000000000000000000000000" - }, - { - "account": "0xDB8cFf278adCCF9E9b5da745B44E754fC4EE3C76", - "isWrite": false, - "newValue": "0x0000000000000000000000000000000000000000000000000000000000000001", - "previousValue": "0x0000000000000000000000000000000000000000000000000000000000000001", - "reverted": false, - "slot": "0xa8f0d50211ac8ff1a40793a899dff3ced4762e0466f69b0078ab7b00d037835c" - }, - { - "account": "0xDB8cFf278adCCF9E9b5da745B44E754fC4EE3C76", - "isWrite": false, - "newValue": "0x0000000000000000000000007d039be7f9b5190147621b02e82b250e1d748e02", - "previousValue": "0x0000000000000000000000007d039be7f9b5190147621b02e82b250e1d748e02", - "reverted": false, - "slot": "0x0000000000000000000000000000000000000000000000000000000000000000" - }, - { - "account": "0xDB8cFf278adCCF9E9b5da745B44E754fC4EE3C76", - "isWrite": false, - "newValue": "0x0000000000000000000000000000000000000000000000000000000000000001", - "previousValue": "0x0000000000000000000000000000000000000000000000000000000000000001", - "reverted": false, - "slot": "0xa8f0d50211ac8ff1a40793a899dff3ced4762e0466f69b0078ab7b00d037835c" - } - ], - "value": 0 - }, - { - "accessor": "0xDB8cFf278adCCF9E9b5da745B44E754fC4EE3C76", - "account": "0x0c8b5822b6e02CDa722174F19A1439A7495a3fA6", - "chainInfo": { - "chainId": 31337, - "forkId": 0 - }, - "data": "0x", - "deployedCode": "0x", - "initialized": true, - "kind": "Resume", - "newBalance": 0, - "oldBalance": 0, - "reverted": false, - "storageAccesses": [], - "value": 0 - }, - { - "accessor": "0xDB8cFf278adCCF9E9b5da745B44E754fC4EE3C76", - "account": "0x0c8b5822b6e02CDa722174F19A1439A7495a3fA6", - "chainInfo": { - "chainId": 31337, - "forkId": 0 - }, - "data": "0x9b0b0fda360894a13ba1a3210667c828492db98dca3e2076cc3735a920a3ca505d382bbc00000000000000000000000004c50b398cd4182428e79f7186b7c919cf17e86f", - "deployedCode": "0x", - "initialized": true, - "kind": "Call", - "newBalance": 0, - "oldBalance": 0, - "reverted": false, - "storageAccesses": [ - { - "account": "0x0c8b5822b6e02CDa722174F19A1439A7495a3fA6", - "isWrite": false, - "newValue": "0x000000000000000000000000db8cff278adccf9e9b5da745b44e754fc4ee3c76", - "previousValue": "0x000000000000000000000000db8cff278adccf9e9b5da745b44e754fc4ee3c76", - "reverted": false, - "slot": "0xb53127684a568b3173ae13b9f8a6016e243e63b6e8ee1178d6a717850b5d6103" - }, - { - "account": "0x0c8b5822b6e02CDa722174F19A1439A7495a3fA6", - "isWrite": true, - "newValue": "0x00000000000000000000000004c50b398cd4182428e79f7186b7c919cf17e86f", - "previousValue": "0x0000000000000000000000000000000000000000000000000000000000000000", - "reverted": false, - "slot": "0x360894a13ba1a3210667c828492db98dca3e2076cc3735a920a3ca505d382bbc" - } - ], - "value": 0 - }, - { - "accessor": "0xDB8cFf278adCCF9E9b5da745B44E754fC4EE3C76", - "account": "0x0c8b5822b6e02CDa722174F19A1439A7495a3fA6", - "chainInfo": { - "chainId": 31337, - "forkId": 0 - }, - "data": "0xc0c53b8b00000000000000000000000020a42a5a785622c6ba2576b2d6e924aa82bfa11d000000000000000000000000deb1e9a6be7baf84208bb6e10ac9f9bbe1d708090000000000000000000000001c23a6d89f95ef3148bcda8e242cab145bf9c0e4", - "deployedCode": "0x", - "initialized": true, - "kind": "Call", - "newBalance": 0, - "oldBalance": 0, - "reverted": false, - "storageAccesses": [ - { - "account": "0x0c8b5822b6e02CDa722174F19A1439A7495a3fA6", - "isWrite": false, - "newValue": "0x000000000000000000000000db8cff278adccf9e9b5da745b44e754fc4ee3c76", - "previousValue": "0x000000000000000000000000db8cff278adccf9e9b5da745b44e754fc4ee3c76", - "reverted": false, - "slot": "0xb53127684a568b3173ae13b9f8a6016e243e63b6e8ee1178d6a717850b5d6103" - } - ], - "value": 0 - }, - { - "accessor": "0x0c8b5822b6e02CDa722174F19A1439A7495a3fA6", - "account": "0xDB8cFf278adCCF9E9b5da745B44E754fC4EE3C76", - "chainInfo": { - "chainId": 31337, - "forkId": 0 - }, - "data": "0xb7947262", - "deployedCode": "0x", - "initialized": true, - "kind": "StaticCall", - "newBalance": 0, - "oldBalance": 0, - "reverted": false, - "storageAccesses": [ - { - "account": "0xDB8cFf278adCCF9E9b5da745B44E754fC4EE3C76", - "isWrite": false, - "newValue": "0x000000000000000000000000bb2180ebd78ce97360503434ed37fcf4a1df61c3", - "previousValue": "0x000000000000000000000000bb2180ebd78ce97360503434ed37fcf4a1df61c3", - "reverted": false, - "slot": "0x0000000000000000000000000000000000000000000000000000000000000003" - } - ], - "value": 0 - }, - { - "accessor": "0xDB8cFf278adCCF9E9b5da745B44E754fC4EE3C76", - "account": "0x0c8b5822b6e02CDa722174F19A1439A7495a3fA6", - "chainInfo": { - "chainId": 31337, - "forkId": 0 - }, - "data": "0x", - "deployedCode": "0x", - "initialized": true, - "kind": "Resume", - "newBalance": 0, - "oldBalance": 0, - "reverted": false, - "storageAccesses": [ - { - "account": "0x0c8b5822b6e02CDa722174F19A1439A7495a3fA6", - "isWrite": false, - "newValue": "0x00000000000000000000000004c50b398cd4182428e79f7186b7c919cf17e86f", - "previousValue": "0x00000000000000000000000004c50b398cd4182428e79f7186b7c919cf17e86f", - "reverted": false, - "slot": "0x360894a13ba1a3210667c828492db98dca3e2076cc3735a920a3ca505d382bbc" - } - ], - "value": 0 - }, - { - "accessor": "0xDB8cFf278adCCF9E9b5da745B44E754fC4EE3C76", - "account": "0x04c50B398Cd4182428E79f7186b7C919cF17e86F", - "chainInfo": { - "chainId": 31337, - "forkId": 0 - }, - "data": "0xc0c53b8b00000000000000000000000020a42a5a785622c6ba2576b2d6e924aa82bfa11d000000000000000000000000deb1e9a6be7baf84208bb6e10ac9f9bbe1d708090000000000000000000000001c23a6d89f95ef3148bcda8e242cab145bf9c0e4", - "deployedCode": "0x", - "initialized": true, - "kind": "DelegateCall", - "newBalance": 0, - "oldBalance": 0, - "reverted": false, - "storageAccesses": [ - { - "account": "0x0c8b5822b6e02CDa722174F19A1439A7495a3fA6", - "isWrite": false, - "newValue": "0x0000000000000000000000000000000000000000000000000000000000000000", - "previousValue": "0x0000000000000000000000000000000000000000000000000000000000000000", - "reverted": false, - "slot": "0x0000000000000000000000000000000000000000000000000000000000000000" - }, - { - "account": "0x0c8b5822b6e02CDa722174F19A1439A7495a3fA6", - "isWrite": false, - "newValue": "0x0000000000000000000000000000000000000000000000000000000000000000", - "previousValue": "0x0000000000000000000000000000000000000000000000000000000000000000", - "reverted": false, - "slot": "0x0000000000000000000000000000000000000000000000000000000000000000" - }, - { - "account": "0x0c8b5822b6e02CDa722174F19A1439A7495a3fA6", - "isWrite": false, - "newValue": "0x0000000000000000000000000000000000000000000000000000000000000000", - "previousValue": "0x0000000000000000000000000000000000000000000000000000000000000000", - "reverted": false, - "slot": "0x0000000000000000000000000000000000000000000000000000000000000000" - }, - { - "account": "0x0c8b5822b6e02CDa722174F19A1439A7495a3fA6", - "isWrite": true, - "newValue": "0x0000000000000000000000000000000000000000000000000000000000000001", - "previousValue": "0x0000000000000000000000000000000000000000000000000000000000000000", - "reverted": false, - "slot": "0x0000000000000000000000000000000000000000000000000000000000000000" - }, - { - "account": "0x0c8b5822b6e02CDa722174F19A1439A7495a3fA6", - "isWrite": false, - "newValue": "0x0000000000000000000000000000000000000000000000000000000000000001", - "previousValue": "0x0000000000000000000000000000000000000000000000000000000000000001", - "reverted": false, - "slot": "0x0000000000000000000000000000000000000000000000000000000000000000" - }, - { - "account": "0x0c8b5822b6e02CDa722174F19A1439A7495a3fA6", - "isWrite": true, - "newValue": "0x0000000000000000000000000000000000000000000000000000000000000101", - "previousValue": "0x0000000000000000000000000000000000000000000000000000000000000001", - "reverted": false, - "slot": "0x0000000000000000000000000000000000000000000000000000000000000000" - }, - { - "account": "0x0c8b5822b6e02CDa722174F19A1439A7495a3fA6", - "isWrite": false, - "newValue": "0x0000000000000000000000000000000000000000000000000000000000000000", - "previousValue": "0x0000000000000000000000000000000000000000000000000000000000000000", - "reverted": false, - "slot": "0x0000000000000000000000000000000000000000000000000000000000000032" - }, - { - "account": "0x0c8b5822b6e02CDa722174F19A1439A7495a3fA6", - "isWrite": true, - "newValue": "0x000000000000000000000000deb1e9a6be7baf84208bb6e10ac9f9bbe1d70809", - "previousValue": "0x0000000000000000000000000000000000000000000000000000000000000000", - "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, - "newValue": "0x0000000000000000000000000000000000000000000000000000000000000101", - "previousValue": "0x0000000000000000000000000000000000000000000000000000000000000101", - "reverted": false, - "slot": "0x0000000000000000000000000000000000000000000000000000000000000000" - }, - { - "account": "0x0c8b5822b6e02CDa722174F19A1439A7495a3fA6", - "isWrite": false, - "newValue": "0x0000000000000000000000000000000000000000000000000000000000000000", - "previousValue": "0x0000000000000000000000000000000000000000000000000000000000000000", - "reverted": false, - "slot": "0x0000000000000000000000000000000000000000000000000000000000000003" - }, - { - "account": "0x0c8b5822b6e02CDa722174F19A1439A7495a3fA6", - "isWrite": true, - "newValue": "0x00000000000000000000000020a42a5a785622c6ba2576b2d6e924aa82bfa11d", - "previousValue": "0x0000000000000000000000000000000000000000000000000000000000000000", - "reverted": false, - "slot": "0x0000000000000000000000000000000000000000000000000000000000000003" - }, - { - "account": "0x0c8b5822b6e02CDa722174F19A1439A7495a3fA6", - "isWrite": false, - "newValue": "0x0000000000000000000000000000000000000000000000000000000000000000", - "previousValue": "0x0000000000000000000000000000000000000000000000000000000000000000", - "reverted": false, - "slot": "0x0000000000000000000000000000000000000000000000000000000000000004" - }, - { - "account": "0x0c8b5822b6e02CDa722174F19A1439A7495a3fA6", - "isWrite": true, - "newValue": "0x0000000000000000000000004200000000000000000000000000000000000010", - "previousValue": "0x0000000000000000000000000000000000000000000000000000000000000000", - "reverted": false, - "slot": "0x0000000000000000000000000000000000000000000000000000000000000004" - }, - { - "account": "0x0c8b5822b6e02CDa722174F19A1439A7495a3fA6", - "isWrite": false, - "newValue": "0x0000000000000000000000000000000000000000000000000000000000000101", - "previousValue": "0x0000000000000000000000000000000000000000000000000000000000000101", - "reverted": false, - "slot": "0x0000000000000000000000000000000000000000000000000000000000000000" - }, - { - "account": "0x0c8b5822b6e02CDa722174F19A1439A7495a3fA6", - "isWrite": true, - "newValue": "0x0000000000000000000000000000000000000000000000000000000000000001", - "previousValue": "0x0000000000000000000000000000000000000000000000000000000000000101", - "reverted": false, - "slot": "0x0000000000000000000000000000000000000000000000000000000000000000" - } - ], - "value": 0 - }, - { - "accessor": "0x1804c8AB1F12E6bbf3894d4083f33e07309d1f38", - "account": "0x0c8b5822b6e02CDa722174F19A1439A7495a3fA6", - "chainInfo": { - "chainId": 31337, - "forkId": 0 - }, - "data": "0x54fd4d50", - "deployedCode": "0x", - "initialized": true, - "kind": "StaticCall", - "newBalance": 0, - "oldBalance": 0, - "reverted": false, - "storageAccesses": [ - { - "account": "0x0c8b5822b6e02CDa722174F19A1439A7495a3fA6", - "isWrite": false, - "newValue": "0x000000000000000000000000db8cff278adccf9e9b5da745b44e754fc4ee3c76", - "previousValue": "0x000000000000000000000000db8cff278adccf9e9b5da745b44e754fc4ee3c76", - "reverted": false, - "slot": "0xb53127684a568b3173ae13b9f8a6016e243e63b6e8ee1178d6a717850b5d6103" - } - ], - "value": 0 - }, - { - "accessor": "0x0c8b5822b6e02CDa722174F19A1439A7495a3fA6", - "account": "0xDB8cFf278adCCF9E9b5da745B44E754fC4EE3C76", - "chainInfo": { - "chainId": 31337, - "forkId": 0 - }, - "data": "0xb7947262", - "deployedCode": "0x", - "initialized": true, - "kind": "StaticCall", - "newBalance": 0, - "oldBalance": 0, - "reverted": false, - "storageAccesses": [ - { - "account": "0xDB8cFf278adCCF9E9b5da745B44E754fC4EE3C76", - "isWrite": false, - "newValue": "0x000000000000000000000000bb2180ebd78ce97360503434ed37fcf4a1df61c3", - "previousValue": "0x000000000000000000000000bb2180ebd78ce97360503434ed37fcf4a1df61c3", - "reverted": false, - "slot": "0x0000000000000000000000000000000000000000000000000000000000000003" - } - ], - "value": 0 - }, - { - "accessor": "0x1804c8AB1F12E6bbf3894d4083f33e07309d1f38", - "account": "0x0c8b5822b6e02CDa722174F19A1439A7495a3fA6", - "chainInfo": { - "chainId": 31337, - "forkId": 0 - }, - "data": "0x", - "deployedCode": "0x", - "initialized": true, - "kind": "Resume", - "newBalance": 0, - "oldBalance": 0, - "reverted": false, - "storageAccesses": [ - { - "account": "0x0c8b5822b6e02CDa722174F19A1439A7495a3fA6", - "isWrite": false, - "newValue": "0x00000000000000000000000004c50b398cd4182428e79f7186b7c919cf17e86f", - "previousValue": "0x00000000000000000000000004c50b398cd4182428e79f7186b7c919cf17e86f", - "reverted": false, - "slot": "0x360894a13ba1a3210667c828492db98dca3e2076cc3735a920a3ca505d382bbc" - } - ], - "value": 0 - }, - { - "accessor": "0x1804c8AB1F12E6bbf3894d4083f33e07309d1f38", - "account": "0x04c50B398Cd4182428E79f7186b7C919cF17e86F", - "chainInfo": { - "chainId": 31337, - "forkId": 0 - }, - "data": "0x54fd4d50", - "deployedCode": "0x", - "initialized": true, - "kind": "DelegateCall", - "newBalance": 0, - "oldBalance": 0, - "reverted": false, - "storageAccesses": [], - "value": 0 - }, - { - "accessor": "0x1804c8AB1F12E6bbf3894d4083f33e07309d1f38", - "account": "0x0c8b5822b6e02CDa722174F19A1439A7495a3fA6", - "chainInfo": { - "chainId": 31337, - "forkId": 0 - }, - "data": "0x927ede2d", - "deployedCode": "0x", - "initialized": true, - "kind": "StaticCall", - "newBalance": 0, - "oldBalance": 0, - "reverted": false, - "storageAccesses": [ - { - "account": "0x0c8b5822b6e02CDa722174F19A1439A7495a3fA6", - "isWrite": false, - "newValue": "0x000000000000000000000000db8cff278adccf9e9b5da745b44e754fc4ee3c76", - "previousValue": "0x000000000000000000000000db8cff278adccf9e9b5da745b44e754fc4ee3c76", - "reverted": false, - "slot": "0xb53127684a568b3173ae13b9f8a6016e243e63b6e8ee1178d6a717850b5d6103" - } - ], - "value": 0 - }, - { - "accessor": "0x0c8b5822b6e02CDa722174F19A1439A7495a3fA6", - "account": "0xDB8cFf278adCCF9E9b5da745B44E754fC4EE3C76", - "chainInfo": { - "chainId": 31337, - "forkId": 0 - }, - "data": "0xb7947262", - "deployedCode": "0x", - "initialized": true, - "kind": "StaticCall", - "newBalance": 0, - "oldBalance": 0, - "reverted": false, - "storageAccesses": [ - { - "account": "0xDB8cFf278adCCF9E9b5da745B44E754fC4EE3C76", - "isWrite": false, - "newValue": "0x000000000000000000000000bb2180ebd78ce97360503434ed37fcf4a1df61c3", - "previousValue": "0x000000000000000000000000bb2180ebd78ce97360503434ed37fcf4a1df61c3", - "reverted": false, - "slot": "0x0000000000000000000000000000000000000000000000000000000000000003" - } - ], - "value": 0 - }, - { - "accessor": "0x1804c8AB1F12E6bbf3894d4083f33e07309d1f38", - "account": "0x0c8b5822b6e02CDa722174F19A1439A7495a3fA6", - "chainInfo": { - "chainId": 31337, - "forkId": 0 - }, - "data": "0x", - "deployedCode": "0x", - "initialized": true, - "kind": "Resume", - "newBalance": 0, - "oldBalance": 0, - "reverted": false, - "storageAccesses": [ - { - "account": "0x0c8b5822b6e02CDa722174F19A1439A7495a3fA6", - "isWrite": false, - "newValue": "0x00000000000000000000000004c50b398cd4182428e79f7186b7c919cf17e86f", - "previousValue": "0x00000000000000000000000004c50b398cd4182428e79f7186b7c919cf17e86f", - "reverted": false, - "slot": "0x360894a13ba1a3210667c828492db98dca3e2076cc3735a920a3ca505d382bbc" - } - ], - "value": 0 - }, - { - "accessor": "0x1804c8AB1F12E6bbf3894d4083f33e07309d1f38", - "account": "0x04c50B398Cd4182428E79f7186b7C919cF17e86F", - "chainInfo": { - "chainId": 31337, - "forkId": 0 - }, - "data": "0x927ede2d", - "deployedCode": "0x", - "initialized": true, - "kind": "DelegateCall", - "newBalance": 0, - "oldBalance": 0, - "reverted": false, - "storageAccesses": [ - { - "account": "0x0c8b5822b6e02CDa722174F19A1439A7495a3fA6", - "isWrite": false, - "newValue": "0x00000000000000000000000020a42a5a785622c6ba2576b2d6e924aa82bfa11d", - "previousValue": "0x00000000000000000000000020a42a5a785622c6ba2576b2d6e924aa82bfa11d", - "reverted": false, - "slot": "0x0000000000000000000000000000000000000000000000000000000000000003" - } - ], - "value": 0 - }, - { - "accessor": "0x1804c8AB1F12E6bbf3894d4083f33e07309d1f38", - "account": "0x0c8b5822b6e02CDa722174F19A1439A7495a3fA6", - "chainInfo": { - "chainId": 31337, - "forkId": 0 - }, - "data": "0x3cb747bf", - "deployedCode": "0x", - "initialized": true, - "kind": "StaticCall", - "newBalance": 0, - "oldBalance": 0, - "reverted": false, - "storageAccesses": [ - { - "account": "0x0c8b5822b6e02CDa722174F19A1439A7495a3fA6", - "isWrite": false, - "newValue": "0x000000000000000000000000db8cff278adccf9e9b5da745b44e754fc4ee3c76", - "previousValue": "0x000000000000000000000000db8cff278adccf9e9b5da745b44e754fc4ee3c76", - "reverted": false, - "slot": "0xb53127684a568b3173ae13b9f8a6016e243e63b6e8ee1178d6a717850b5d6103" - } - ], - "value": 0 - }, - { - "accessor": "0x0c8b5822b6e02CDa722174F19A1439A7495a3fA6", - "account": "0xDB8cFf278adCCF9E9b5da745B44E754fC4EE3C76", - "chainInfo": { - "chainId": 31337, - "forkId": 0 - }, - "data": "0xb7947262", - "deployedCode": "0x", - "initialized": true, - "kind": "StaticCall", - "newBalance": 0, - "oldBalance": 0, - "reverted": false, - "storageAccesses": [ - { - "account": "0xDB8cFf278adCCF9E9b5da745B44E754fC4EE3C76", - "isWrite": false, - "newValue": "0x000000000000000000000000bb2180ebd78ce97360503434ed37fcf4a1df61c3", - "previousValue": "0x000000000000000000000000bb2180ebd78ce97360503434ed37fcf4a1df61c3", - "reverted": false, - "slot": "0x0000000000000000000000000000000000000000000000000000000000000003" - } - ], - "value": 0 - }, - { - "accessor": "0x1804c8AB1F12E6bbf3894d4083f33e07309d1f38", - "account": "0x0c8b5822b6e02CDa722174F19A1439A7495a3fA6", - "chainInfo": { - "chainId": 31337, - "forkId": 0 - }, - "data": "0x", - "deployedCode": "0x", - "initialized": true, - "kind": "Resume", - "newBalance": 0, - "oldBalance": 0, - "reverted": false, - "storageAccesses": [ - { - "account": "0x0c8b5822b6e02CDa722174F19A1439A7495a3fA6", - "isWrite": false, - "newValue": "0x00000000000000000000000004c50b398cd4182428e79f7186b7c919cf17e86f", - "previousValue": "0x00000000000000000000000004c50b398cd4182428e79f7186b7c919cf17e86f", - "reverted": false, - "slot": "0x360894a13ba1a3210667c828492db98dca3e2076cc3735a920a3ca505d382bbc" - } - ], - "value": 0 - }, - { - "accessor": "0x1804c8AB1F12E6bbf3894d4083f33e07309d1f38", - "account": "0x04c50B398Cd4182428E79f7186b7C919cF17e86F", - "chainInfo": { - "chainId": 31337, - "forkId": 0 - }, - "data": "0x3cb747bf", - "deployedCode": "0x", - "initialized": true, - "kind": "DelegateCall", - "newBalance": 0, - "oldBalance": 0, - "reverted": false, - "storageAccesses": [ - { - "account": "0x0c8b5822b6e02CDa722174F19A1439A7495a3fA6", - "isWrite": false, - "newValue": "0x00000000000000000000000020a42a5a785622c6ba2576b2d6e924aa82bfa11d", - "previousValue": "0x00000000000000000000000020a42a5a785622c6ba2576b2d6e924aa82bfa11d", - "reverted": false, - "slot": "0x0000000000000000000000000000000000000000000000000000000000000003" - } - ], - "value": 0 - }, - { - "accessor": "0x1804c8AB1F12E6bbf3894d4083f33e07309d1f38", - "account": "0x0c8b5822b6e02CDa722174F19A1439A7495a3fA6", - "chainInfo": { - "chainId": 31337, - "forkId": 0 - }, - "data": "0x7f46ddb2", - "deployedCode": "0x", - "initialized": true, - "kind": "StaticCall", - "newBalance": 0, - "oldBalance": 0, - "reverted": false, - "storageAccesses": [ - { - "account": "0x0c8b5822b6e02CDa722174F19A1439A7495a3fA6", - "isWrite": false, - "newValue": "0x000000000000000000000000db8cff278adccf9e9b5da745b44e754fc4ee3c76", - "previousValue": "0x000000000000000000000000db8cff278adccf9e9b5da745b44e754fc4ee3c76", - "reverted": false, - "slot": "0xb53127684a568b3173ae13b9f8a6016e243e63b6e8ee1178d6a717850b5d6103" - } - ], - "value": 0 - }, - { - "accessor": "0x0c8b5822b6e02CDa722174F19A1439A7495a3fA6", - "account": "0xDB8cFf278adCCF9E9b5da745B44E754fC4EE3C76", - "chainInfo": { - "chainId": 31337, - "forkId": 0 - }, - "data": "0xb7947262", - "deployedCode": "0x", - "initialized": true, - "kind": "StaticCall", - "newBalance": 0, - "oldBalance": 0, - "reverted": false, - "storageAccesses": [ - { - "account": "0xDB8cFf278adCCF9E9b5da745B44E754fC4EE3C76", - "isWrite": false, - "newValue": "0x000000000000000000000000bb2180ebd78ce97360503434ed37fcf4a1df61c3", - "previousValue": "0x000000000000000000000000bb2180ebd78ce97360503434ed37fcf4a1df61c3", - "reverted": false, - "slot": "0x0000000000000000000000000000000000000000000000000000000000000003" - } - ], - "value": 0 - }, - { - "accessor": "0x1804c8AB1F12E6bbf3894d4083f33e07309d1f38", - "account": "0x0c8b5822b6e02CDa722174F19A1439A7495a3fA6", - "chainInfo": { - "chainId": 31337, - "forkId": 0 - }, - "data": "0x", - "deployedCode": "0x", - "initialized": true, - "kind": "Resume", - "newBalance": 0, - "oldBalance": 0, - "reverted": false, - "storageAccesses": [ - { - "account": "0x0c8b5822b6e02CDa722174F19A1439A7495a3fA6", - "isWrite": false, - "newValue": "0x00000000000000000000000004c50b398cd4182428e79f7186b7c919cf17e86f", - "previousValue": "0x00000000000000000000000004c50b398cd4182428e79f7186b7c919cf17e86f", - "reverted": false, - "slot": "0x360894a13ba1a3210667c828492db98dca3e2076cc3735a920a3ca505d382bbc" - } - ], - "value": 0 - }, - { - "accessor": "0x1804c8AB1F12E6bbf3894d4083f33e07309d1f38", - "account": "0x04c50B398Cd4182428E79f7186b7C919cF17e86F", - "chainInfo": { - "chainId": 31337, - "forkId": 0 - }, - "data": "0x7f46ddb2", - "deployedCode": "0x", - "initialized": true, - "kind": "DelegateCall", - "newBalance": 0, - "oldBalance": 0, - "reverted": false, - "storageAccesses": [ - { - "account": "0x0c8b5822b6e02CDa722174F19A1439A7495a3fA6", - "isWrite": false, - "newValue": "0x0000000000000000000000004200000000000000000000000000000000000010", - "previousValue": "0x0000000000000000000000004200000000000000000000000000000000000010", - "reverted": false, - "slot": "0x0000000000000000000000000000000000000000000000000000000000000004" - } - ], - "value": 0 - }, - { - "accessor": "0x1804c8AB1F12E6bbf3894d4083f33e07309d1f38", - "account": "0x0c8b5822b6e02CDa722174F19A1439A7495a3fA6", - "chainInfo": { - "chainId": 31337, - "forkId": 0 - }, - "data": "0xc89701a2", - "deployedCode": "0x", - "initialized": true, - "kind": "StaticCall", - "newBalance": 0, - "oldBalance": 0, - "reverted": false, - "storageAccesses": [ - { - "account": "0x0c8b5822b6e02CDa722174F19A1439A7495a3fA6", - "isWrite": false, - "newValue": "0x000000000000000000000000db8cff278adccf9e9b5da745b44e754fc4ee3c76", - "previousValue": "0x000000000000000000000000db8cff278adccf9e9b5da745b44e754fc4ee3c76", - "reverted": false, - "slot": "0xb53127684a568b3173ae13b9f8a6016e243e63b6e8ee1178d6a717850b5d6103" - } - ], - "value": 0 - }, - { - "accessor": "0x0c8b5822b6e02CDa722174F19A1439A7495a3fA6", - "account": "0xDB8cFf278adCCF9E9b5da745B44E754fC4EE3C76", - "chainInfo": { - "chainId": 31337, - "forkId": 0 - }, - "data": "0xb7947262", - "deployedCode": "0x", - "initialized": true, - "kind": "StaticCall", - "newBalance": 0, - "oldBalance": 0, - "reverted": false, - "storageAccesses": [ - { - "account": "0xDB8cFf278adCCF9E9b5da745B44E754fC4EE3C76", - "isWrite": false, - "newValue": "0x000000000000000000000000bb2180ebd78ce97360503434ed37fcf4a1df61c3", - "previousValue": "0x000000000000000000000000bb2180ebd78ce97360503434ed37fcf4a1df61c3", - "reverted": false, - "slot": "0x0000000000000000000000000000000000000000000000000000000000000003" - } - ], - "value": 0 - }, - { - "accessor": "0x1804c8AB1F12E6bbf3894d4083f33e07309d1f38", - "account": "0x0c8b5822b6e02CDa722174F19A1439A7495a3fA6", - "chainInfo": { - "chainId": 31337, - "forkId": 0 - }, - "data": "0x", - "deployedCode": "0x", - "initialized": true, - "kind": "Resume", - "newBalance": 0, - "oldBalance": 0, - "reverted": false, - "storageAccesses": [ - { - "account": "0x0c8b5822b6e02CDa722174F19A1439A7495a3fA6", - "isWrite": false, - "newValue": "0x00000000000000000000000004c50b398cd4182428e79f7186b7c919cf17e86f", - "previousValue": "0x00000000000000000000000004c50b398cd4182428e79f7186b7c919cf17e86f", - "reverted": false, - "slot": "0x360894a13ba1a3210667c828492db98dca3e2076cc3735a920a3ca505d382bbc" - } - ], - "value": 0 - }, - { - "accessor": "0x1804c8AB1F12E6bbf3894d4083f33e07309d1f38", - "account": "0x04c50B398Cd4182428E79f7186b7C919cF17e86F", - "chainInfo": { - "chainId": 31337, - "forkId": 0 - }, - "data": "0xc89701a2", - "deployedCode": "0x", - "initialized": true, - "kind": "DelegateCall", - "newBalance": 0, - "oldBalance": 0, - "reverted": false, - "storageAccesses": [ - { - "account": "0x0c8b5822b6e02CDa722174F19A1439A7495a3fA6", - "isWrite": false, - "newValue": "0x0000000000000000000000004200000000000000000000000000000000000010", - "previousValue": "0x0000000000000000000000004200000000000000000000000000000000000010", - "reverted": false, - "slot": "0x0000000000000000000000000000000000000000000000000000000000000004" - } - ], - "value": 0 - }, - { - "accessor": "0x1804c8AB1F12E6bbf3894d4083f33e07309d1f38", - "account": "0x0c8b5822b6e02CDa722174F19A1439A7495a3fA6", - "chainInfo": { - "chainId": 31337, - "forkId": 0 - }, - "data": "0x35e80ab3", - "deployedCode": "0x", - "initialized": true, - "kind": "StaticCall", - "newBalance": 0, - "oldBalance": 0, - "reverted": false, - "storageAccesses": [ - { - "account": "0x0c8b5822b6e02CDa722174F19A1439A7495a3fA6", - "isWrite": false, - "newValue": "0x000000000000000000000000db8cff278adccf9e9b5da745b44e754fc4ee3c76", - "previousValue": "0x000000000000000000000000db8cff278adccf9e9b5da745b44e754fc4ee3c76", - "reverted": false, - "slot": "0xb53127684a568b3173ae13b9f8a6016e243e63b6e8ee1178d6a717850b5d6103" - } - ], - "value": 0 - }, - { - "accessor": "0x0c8b5822b6e02CDa722174F19A1439A7495a3fA6", - "account": "0xDB8cFf278adCCF9E9b5da745B44E754fC4EE3C76", - "chainInfo": { - "chainId": 31337, - "forkId": 0 - }, - "data": "0xb7947262", - "deployedCode": "0x", - "initialized": true, - "kind": "StaticCall", - "newBalance": 0, - "oldBalance": 0, - "reverted": false, - "storageAccesses": [ - { - "account": "0xDB8cFf278adCCF9E9b5da745B44E754fC4EE3C76", - "isWrite": false, - "newValue": "0x000000000000000000000000bb2180ebd78ce97360503434ed37fcf4a1df61c3", - "previousValue": "0x000000000000000000000000bb2180ebd78ce97360503434ed37fcf4a1df61c3", - "reverted": false, - "slot": "0x0000000000000000000000000000000000000000000000000000000000000003" - } - ], - "value": 0 - }, - { - "accessor": "0x1804c8AB1F12E6bbf3894d4083f33e07309d1f38", - "account": "0x0c8b5822b6e02CDa722174F19A1439A7495a3fA6", - "chainInfo": { - "chainId": 31337, - "forkId": 0 - }, - "data": "0x", - "deployedCode": "0x", - "initialized": true, - "kind": "Resume", - "newBalance": 0, - "oldBalance": 0, - "reverted": false, - "storageAccesses": [ - { - "account": "0x0c8b5822b6e02CDa722174F19A1439A7495a3fA6", - "isWrite": false, - "newValue": "0x00000000000000000000000004c50b398cd4182428e79f7186b7c919cf17e86f", - "previousValue": "0x00000000000000000000000004c50b398cd4182428e79f7186b7c919cf17e86f", - "reverted": false, - "slot": "0x360894a13ba1a3210667c828492db98dca3e2076cc3735a920a3ca505d382bbc" - } - ], - "value": 0 - }, - { - "accessor": "0x1804c8AB1F12E6bbf3894d4083f33e07309d1f38", - "account": "0x04c50B398Cd4182428E79f7186b7C919cF17e86F", - "chainInfo": { - "chainId": 31337, - "forkId": 0 - }, - "data": "0x35e80ab3", - "deployedCode": "0x", - "initialized": true, - "kind": "DelegateCall", - "newBalance": 0, - "oldBalance": 0, - "reverted": false, - "storageAccesses": [ - { - "account": "0x0c8b5822b6e02CDa722174F19A1439A7495a3fA6", - "isWrite": false, - "newValue": "0x000000000000000000000000deb1e9a6be7baf84208bb6e10ac9f9bbe1d70809", - "previousValue": "0x000000000000000000000000deb1e9a6be7baf84208bb6e10ac9f9bbe1d70809", - "reverted": false, - "slot": "0x0000000000000000000000000000000000000000000000000000000000000032" - } - ], - "value": 0 - }, - { - "accessor": "0x7FA9385bE102ac3EAc297483Dd6233D62b3e1496", - "account": "0x7109709ECfa91a80626fF3989D68f67F5b1DD12D", - "chainInfo": { - "chainId": 31337, - "forkId": 0 - }, - "data": "0x", - "deployedCode": "0x", - "initialized": true, - "kind": "Resume", - "newBalance": 0, - "oldBalance": 0, - "reverted": false, - "storageAccesses": [], - "value": 0 - }, - { - "accessor": "0x7FA9385bE102ac3EAc297483Dd6233D62b3e1496", - "account": "0x7109709ECfa91a80626fF3989D68f67F5b1DD12D", - "chainInfo": { - "chainId": 31337, - "forkId": 0 - }, - "data": "0x", - "deployedCode": "0x", - "initialized": true, - "kind": "Resume", - "newBalance": 0, - "oldBalance": 0, - "reverted": false, - "storageAccesses": [], - "value": 0 - }, - { - "accessor": "0x1804c8AB1F12E6bbf3894d4083f33e07309d1f38", - "account": "0x7d039be7F9b5190147621b02e82B250e1D748e02", - "chainInfo": { - "chainId": 31337, - "forkId": 0 - }, - "data": "0x6a761202000000000000000000000000db8cff278adccf9e9b5da745b44e754fc4ee3c7600000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000140000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000026000000000000000000000000000000000000000000000000000000000000000e49623609d000000000000000000000000def3bca8c80064589e6787477ffa7dd616b5574f00000000000000000000000044637a4292e0cd2b17a55d5f6b2f05afcacd058600000000000000000000000000000000000000000000000000000000000000600000000000000000000000000000000000000000000000000000000000000044485cc95500000000000000000000000020a42a5a785622c6ba2576b2d6e924aa82bfa11d000000000000000000000000deb1e9a6be7baf84208bb6e10ac9f9bbe1d70809000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000410000000000000000000000001804c8ab1f12e6bbf3894d4083f33e07309d1f3800000000000000000000000000000000000000000000000000000000000000000100000000000000000000000000000000000000000000000000000000000000", - "deployedCode": "0x", - "initialized": true, - "kind": "Call", - "newBalance": 0, - "oldBalance": 0, - "reverted": false, - "storageAccesses": [ - { - "account": "0x7d039be7F9b5190147621b02e82B250e1D748e02", - "isWrite": false, - "newValue": "0x00000000000000000000000090193c961a926261b756d1e5bb255e67ff9498a1", - "previousValue": "0x00000000000000000000000090193c961a926261b756d1e5bb255e67ff9498a1", - "reverted": false, - "slot": "0x0000000000000000000000000000000000000000000000000000000000000000" - } - ], - "value": 0 - }, - { - "accessor": "0x1804c8AB1F12E6bbf3894d4083f33e07309d1f38", - "account": "0x90193C961A926261B756D1E5bb255e67ff9498A1", - "chainInfo": { - "chainId": 31337, - "forkId": 0 - }, - "data": "0x6a761202000000000000000000000000db8cff278adccf9e9b5da745b44e754fc4ee3c7600000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000140000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000026000000000000000000000000000000000000000000000000000000000000000e49623609d000000000000000000000000def3bca8c80064589e6787477ffa7dd616b5574f00000000000000000000000044637a4292e0cd2b17a55d5f6b2f05afcacd058600000000000000000000000000000000000000000000000000000000000000600000000000000000000000000000000000000000000000000000000000000044485cc95500000000000000000000000020a42a5a785622c6ba2576b2d6e924aa82bfa11d000000000000000000000000deb1e9a6be7baf84208bb6e10ac9f9bbe1d70809000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000410000000000000000000000001804c8ab1f12e6bbf3894d4083f33e07309d1f3800000000000000000000000000000000000000000000000000000000000000000100000000000000000000000000000000000000000000000000000000000000", - "deployedCode": "0x", - "initialized": true, - "kind": "DelegateCall", - "newBalance": 0, - "oldBalance": 0, - "reverted": false, - "storageAccesses": [ - { - "account": "0x7d039be7F9b5190147621b02e82B250e1D748e02", - "isWrite": false, - "newValue": "0x0000000000000000000000000000000000000000000000000000000000000005", - "previousValue": "0x0000000000000000000000000000000000000000000000000000000000000005", - "reverted": false, - "slot": "0x0000000000000000000000000000000000000000000000000000000000000005" - }, - { - "account": "0x7d039be7F9b5190147621b02e82B250e1D748e02", - "isWrite": false, - "newValue": "0x0000000000000000000000000000000000000000000000000000000000000005", - "previousValue": "0x0000000000000000000000000000000000000000000000000000000000000005", - "reverted": false, - "slot": "0x0000000000000000000000000000000000000000000000000000000000000005" - }, - { - "account": "0x7d039be7F9b5190147621b02e82B250e1D748e02", - "isWrite": true, - "newValue": "0x0000000000000000000000000000000000000000000000000000000000000006", - "previousValue": "0x0000000000000000000000000000000000000000000000000000000000000005", - "reverted": false, - "slot": "0x0000000000000000000000000000000000000000000000000000000000000005" - }, - { - "account": "0x7d039be7F9b5190147621b02e82B250e1D748e02", - "isWrite": false, - "newValue": "0x0000000000000000000000000000000000000000000000000000000000000001", - "previousValue": "0x0000000000000000000000000000000000000000000000000000000000000001", - "reverted": false, - "slot": "0x0000000000000000000000000000000000000000000000000000000000000004" - }, - { - "account": "0x7d039be7F9b5190147621b02e82B250e1D748e02", - "isWrite": false, - "newValue": "0x0000000000000000000000000000000000000000000000000000000000000001", - "previousValue": "0x0000000000000000000000000000000000000000000000000000000000000001", - "reverted": false, - "slot": "0xd1b0d319c6526317dce66989b393dcfb4435c9a65e399a088b63bbf65d7aee32" - }, - { - "account": "0x7d039be7F9b5190147621b02e82B250e1D748e02", - "isWrite": false, - "newValue": "0x0000000000000000000000000000000000000000000000000000000000000000", - "previousValue": "0x0000000000000000000000000000000000000000000000000000000000000000", - "reverted": false, - "slot": "0x4a204f620c8c5ccdca3fd54d003badd85ba500436a431f0cbda4f558c93c34c8" - } - ], - "value": 0 - }, - { - "accessor": "0x7d039be7F9b5190147621b02e82B250e1D748e02", - "account": "0xDB8cFf278adCCF9E9b5da745B44E754fC4EE3C76", - "chainInfo": { - "chainId": 31337, - "forkId": 0 - }, - "data": "0x9623609d000000000000000000000000def3bca8c80064589e6787477ffa7dd616b5574f00000000000000000000000044637a4292e0cd2b17a55d5f6b2f05afcacd058600000000000000000000000000000000000000000000000000000000000000600000000000000000000000000000000000000000000000000000000000000044485cc95500000000000000000000000020a42a5a785622c6ba2576b2d6e924aa82bfa11d000000000000000000000000deb1e9a6be7baf84208bb6e10ac9f9bbe1d7080900000000000000000000000000000000000000000000000000000000", - "deployedCode": "0x", - "initialized": true, - "kind": "Call", - "newBalance": 0, - "oldBalance": 0, - "reverted": false, - "storageAccesses": [ - { - "account": "0xDB8cFf278adCCF9E9b5da745B44E754fC4EE3C76", - "isWrite": false, - "newValue": "0x0000000000000000000000007d039be7f9b5190147621b02e82b250e1d748e02", - "previousValue": "0x0000000000000000000000007d039be7f9b5190147621b02e82b250e1d748e02", - "reverted": false, - "slot": "0x0000000000000000000000000000000000000000000000000000000000000000" - }, - { - "account": "0xDB8cFf278adCCF9E9b5da745B44E754fC4EE3C76", - "isWrite": false, - "newValue": "0x0000000000000000000000000000000000000000000000000000000000000000", - "previousValue": "0x0000000000000000000000000000000000000000000000000000000000000000", - "reverted": false, - "slot": "0x191cda7b5a8219e0cc3bb6c2b45be830e3ba520f78e119446a476c4147fcc284" - } - ], - "value": 0 - }, - { - "accessor": "0xDB8cFf278adCCF9E9b5da745B44E754fC4EE3C76", - "account": "0xDeF3bca8c80064589E6787477FFa7Dd616B5574F", - "chainInfo": { - "chainId": 31337, - "forkId": 0 - }, - "data": "0x4f1ef28600000000000000000000000044637a4292e0cd2b17a55d5f6b2f05afcacd058600000000000000000000000000000000000000000000000000000000000000400000000000000000000000000000000000000000000000000000000000000044485cc95500000000000000000000000020a42a5a785622c6ba2576b2d6e924aa82bfa11d000000000000000000000000deb1e9a6be7baf84208bb6e10ac9f9bbe1d7080900000000000000000000000000000000000000000000000000000000", - "deployedCode": "0x", - "initialized": true, - "kind": "Call", - "newBalance": 0, - "oldBalance": 0, - "reverted": false, - "storageAccesses": [ - { - "account": "0xDeF3bca8c80064589E6787477FFa7Dd616B5574F", - "isWrite": false, - "newValue": "0x000000000000000000000000db8cff278adccf9e9b5da745b44e754fc4ee3c76", - "previousValue": "0x000000000000000000000000db8cff278adccf9e9b5da745b44e754fc4ee3c76", - "reverted": false, - "slot": "0xb53127684a568b3173ae13b9f8a6016e243e63b6e8ee1178d6a717850b5d6103" - }, - { - "account": "0xDeF3bca8c80064589E6787477FFa7Dd616B5574F", - "isWrite": true, - "newValue": "0x00000000000000000000000044637a4292e0cd2b17a55d5f6b2f05afcacd0586", - "previousValue": "0x0000000000000000000000000000000000000000000000000000000000000000", - "reverted": false, - "slot": "0x360894a13ba1a3210667c828492db98dca3e2076cc3735a920a3ca505d382bbc" - } - ], - "value": 0 - }, - { - "accessor": "0xDB8cFf278adCCF9E9b5da745B44E754fC4EE3C76", - "account": "0x44637A4292E0CD2B17A55d5F6B2F05AFcAcD0586", - "chainInfo": { - "chainId": 31337, - "forkId": 0 - }, - "data": "0x485cc95500000000000000000000000020a42a5a785622c6ba2576b2d6e924aa82bfa11d000000000000000000000000deb1e9a6be7baf84208bb6e10ac9f9bbe1d70809", - "deployedCode": "0x", - "initialized": true, - "kind": "DelegateCall", - "newBalance": 0, - "oldBalance": 0, - "reverted": false, - "storageAccesses": [ - { - "account": "0xDeF3bca8c80064589E6787477FFa7Dd616B5574F", - "isWrite": false, - "newValue": "0x0000000000000000000000000000000000000000000000000000000000000000", - "previousValue": "0x0000000000000000000000000000000000000000000000000000000000000000", - "reverted": false, - "slot": "0x0000000000000000000000000000000000000000000000000000000000000000" - }, - { - "account": "0xDeF3bca8c80064589E6787477FFa7Dd616B5574F", - "isWrite": false, - "newValue": "0x0000000000000000000000000000000000000000000000000000000000000000", - "previousValue": "0x0000000000000000000000000000000000000000000000000000000000000000", - "reverted": false, - "slot": "0x0000000000000000000000000000000000000000000000000000000000000000" - }, - { - "account": "0xDeF3bca8c80064589E6787477FFa7Dd616B5574F", - "isWrite": false, - "newValue": "0x0000000000000000000000000000000000000000000000000000000000000000", - "previousValue": "0x0000000000000000000000000000000000000000000000000000000000000000", - "reverted": false, - "slot": "0x0000000000000000000000000000000000000000000000000000000000000000" - }, - { - "account": "0xDeF3bca8c80064589E6787477FFa7Dd616B5574F", - "isWrite": true, - "newValue": "0x0000000000000000000000000000000000000000000000000000000000000001", - "previousValue": "0x0000000000000000000000000000000000000000000000000000000000000000", - "reverted": false, - "slot": "0x0000000000000000000000000000000000000000000000000000000000000000" - }, - { - "account": "0xDeF3bca8c80064589E6787477FFa7Dd616B5574F", - "isWrite": false, - "newValue": "0x0000000000000000000000000000000000000000000000000000000000000001", - "previousValue": "0x0000000000000000000000000000000000000000000000000000000000000001", - "reverted": false, - "slot": "0x0000000000000000000000000000000000000000000000000000000000000000" - }, - { - "account": "0xDeF3bca8c80064589E6787477FFa7Dd616B5574F", - "isWrite": true, - "newValue": "0x0000000000000000000000000000000000000000000000000000000000000101", - "previousValue": "0x0000000000000000000000000000000000000000000000000000000000000001", - "reverted": false, - "slot": "0x0000000000000000000000000000000000000000000000000000000000000000" - }, - { - "account": "0xDeF3bca8c80064589E6787477FFa7Dd616B5574F", - "isWrite": false, - "newValue": "0x0000000000000000000000000000000000000000000000000000000000000000", - "previousValue": "0x0000000000000000000000000000000000000000000000000000000000000000", - "reverted": false, - "slot": "0x0000000000000000000000000000000000000000000000000000000000000032" - }, - { - "account": "0xDeF3bca8c80064589E6787477FFa7Dd616B5574F", - "isWrite": true, - "newValue": "0x000000000000000000000000deb1e9a6be7baf84208bb6e10ac9f9bbe1d70809", - "previousValue": "0x0000000000000000000000000000000000000000000000000000000000000000", - "reverted": false, - "slot": "0x0000000000000000000000000000000000000000000000000000000000000032" - }, - { - "account": "0xDeF3bca8c80064589E6787477FFa7Dd616B5574F", - "isWrite": false, - "newValue": "0x0000000000000000000000000000000000000000000000000000000000000101", - "previousValue": "0x0000000000000000000000000000000000000000000000000000000000000101", - "reverted": false, - "slot": "0x0000000000000000000000000000000000000000000000000000000000000000" - }, - { - "account": "0xDeF3bca8c80064589E6787477FFa7Dd616B5574F", - "isWrite": false, - "newValue": "0x0000000000000000000000000000000000000000000000000000000000000000", - "previousValue": "0x0000000000000000000000000000000000000000000000000000000000000000", - "reverted": false, - "slot": "0x0000000000000000000000000000000000000000000000000000000000000001" - }, - { - "account": "0xDeF3bca8c80064589E6787477FFa7Dd616B5574F", - "isWrite": true, - "newValue": "0x00000000000000000000000020a42a5a785622c6ba2576b2d6e924aa82bfa11d", - "previousValue": "0x0000000000000000000000000000000000000000000000000000000000000000", - "reverted": false, - "slot": "0x0000000000000000000000000000000000000000000000000000000000000001" - }, - { - "account": "0xDeF3bca8c80064589E6787477FFa7Dd616B5574F", - "isWrite": false, - "newValue": "0x0000000000000000000000000000000000000000000000000000000000000000", - "previousValue": "0x0000000000000000000000000000000000000000000000000000000000000000", - "reverted": false, - "slot": "0x0000000000000000000000000000000000000000000000000000000000000002" - }, - { - "account": "0xDeF3bca8c80064589E6787477FFa7Dd616B5574F", - "isWrite": true, - "newValue": "0x0000000000000000000000004200000000000000000000000000000000000014", - "previousValue": "0x0000000000000000000000000000000000000000000000000000000000000000", - "reverted": false, - "slot": "0x0000000000000000000000000000000000000000000000000000000000000002" - }, - { - "account": "0xDeF3bca8c80064589E6787477FFa7Dd616B5574F", - "isWrite": false, - "newValue": "0x0000000000000000000000000000000000000000000000000000000000000101", - "previousValue": "0x0000000000000000000000000000000000000000000000000000000000000101", - "reverted": false, - "slot": "0x0000000000000000000000000000000000000000000000000000000000000000" - }, - { - "account": "0xDeF3bca8c80064589E6787477FFa7Dd616B5574F", - "isWrite": true, - "newValue": "0x0000000000000000000000000000000000000000000000000000000000000001", - "previousValue": "0x0000000000000000000000000000000000000000000000000000000000000101", - "reverted": false, - "slot": "0x0000000000000000000000000000000000000000000000000000000000000000" - } - ], - "value": 0 - }, - { - "accessor": "0x1804c8AB1F12E6bbf3894d4083f33e07309d1f38", - "account": "0xDeF3bca8c80064589E6787477FFa7Dd616B5574F", - "chainInfo": { - "chainId": 31337, - "forkId": 0 - }, - "data": "0x54fd4d50", - "deployedCode": "0x", - "initialized": true, - "kind": "StaticCall", - "newBalance": 0, - "oldBalance": 0, - "reverted": false, - "storageAccesses": [ - { - "account": "0xDeF3bca8c80064589E6787477FFa7Dd616B5574F", - "isWrite": false, - "newValue": "0x00000000000000000000000044637a4292e0cd2b17a55d5f6b2f05afcacd0586", - "previousValue": "0x00000000000000000000000044637a4292e0cd2b17a55d5f6b2f05afcacd0586", - "reverted": false, - "slot": "0x360894a13ba1a3210667c828492db98dca3e2076cc3735a920a3ca505d382bbc" - } - ], - "value": 0 - }, - { - "accessor": "0x1804c8AB1F12E6bbf3894d4083f33e07309d1f38", - "account": "0x44637A4292E0CD2B17A55d5F6B2F05AFcAcD0586", - "chainInfo": { - "chainId": 31337, - "forkId": 0 - }, - "data": "0x54fd4d50", - "deployedCode": "0x", - "initialized": true, - "kind": "DelegateCall", - "newBalance": 0, - "oldBalance": 0, - "reverted": false, - "storageAccesses": [], - "value": 0 - }, - { - "accessor": "0x1804c8AB1F12E6bbf3894d4083f33e07309d1f38", - "account": "0xDeF3bca8c80064589E6787477FFa7Dd616B5574F", - "chainInfo": { - "chainId": 31337, - "forkId": 0 - }, - "data": "0x7f46ddb2", - "deployedCode": "0x", - "initialized": true, - "kind": "StaticCall", - "newBalance": 0, - "oldBalance": 0, - "reverted": false, - "storageAccesses": [ - { - "account": "0xDeF3bca8c80064589E6787477FFa7Dd616B5574F", - "isWrite": false, - "newValue": "0x00000000000000000000000044637a4292e0cd2b17a55d5f6b2f05afcacd0586", - "previousValue": "0x00000000000000000000000044637a4292e0cd2b17a55d5f6b2f05afcacd0586", - "reverted": false, - "slot": "0x360894a13ba1a3210667c828492db98dca3e2076cc3735a920a3ca505d382bbc" - } - ], - "value": 0 - }, - { - "accessor": "0x1804c8AB1F12E6bbf3894d4083f33e07309d1f38", - "account": "0x44637A4292E0CD2B17A55d5F6B2F05AFcAcD0586", - "chainInfo": { - "chainId": 31337, - "forkId": 0 - }, - "data": "0x7f46ddb2", - "deployedCode": "0x", - "initialized": true, - "kind": "DelegateCall", - "newBalance": 0, - "oldBalance": 0, - "reverted": false, - "storageAccesses": [ - { - "account": "0xDeF3bca8c80064589E6787477FFa7Dd616B5574F", - "isWrite": false, - "newValue": "0x0000000000000000000000004200000000000000000000000000000000000014", - "previousValue": "0x0000000000000000000000004200000000000000000000000000000000000014", - "reverted": false, - "slot": "0x0000000000000000000000000000000000000000000000000000000000000002" - } - ], - "value": 0 - }, - { - "accessor": "0x1804c8AB1F12E6bbf3894d4083f33e07309d1f38", - "account": "0xDeF3bca8c80064589E6787477FFa7Dd616B5574F", - "chainInfo": { - "chainId": 31337, - "forkId": 0 - }, - "data": "0xc89701a2", - "deployedCode": "0x", - "initialized": true, - "kind": "StaticCall", - "newBalance": 0, - "oldBalance": 0, - "reverted": false, - "storageAccesses": [ - { - "account": "0xDeF3bca8c80064589E6787477FFa7Dd616B5574F", - "isWrite": false, - "newValue": "0x00000000000000000000000044637a4292e0cd2b17a55d5f6b2f05afcacd0586", - "previousValue": "0x00000000000000000000000044637a4292e0cd2b17a55d5f6b2f05afcacd0586", - "reverted": false, - "slot": "0x360894a13ba1a3210667c828492db98dca3e2076cc3735a920a3ca505d382bbc" - } - ], - "value": 0 - }, - { - "accessor": "0x1804c8AB1F12E6bbf3894d4083f33e07309d1f38", - "account": "0x44637A4292E0CD2B17A55d5F6B2F05AFcAcD0586", - "chainInfo": { - "chainId": 31337, - "forkId": 0 - }, - "data": "0xc89701a2", - "deployedCode": "0x", - "initialized": true, - "kind": "DelegateCall", - "newBalance": 0, - "oldBalance": 0, - "reverted": false, - "storageAccesses": [ - { - "account": "0xDeF3bca8c80064589E6787477FFa7Dd616B5574F", - "isWrite": false, - "newValue": "0x0000000000000000000000004200000000000000000000000000000000000014", - "previousValue": "0x0000000000000000000000004200000000000000000000000000000000000014", - "reverted": false, - "slot": "0x0000000000000000000000000000000000000000000000000000000000000002" - } - ], - "value": 0 - }, - { - "accessor": "0x1804c8AB1F12E6bbf3894d4083f33e07309d1f38", - "account": "0xDeF3bca8c80064589E6787477FFa7Dd616B5574F", - "chainInfo": { - "chainId": 31337, - "forkId": 0 - }, - "data": "0x927ede2d", - "deployedCode": "0x", - "initialized": true, - "kind": "StaticCall", - "newBalance": 0, - "oldBalance": 0, - "reverted": false, - "storageAccesses": [ - { - "account": "0xDeF3bca8c80064589E6787477FFa7Dd616B5574F", - "isWrite": false, - "newValue": "0x00000000000000000000000044637a4292e0cd2b17a55d5f6b2f05afcacd0586", - "previousValue": "0x00000000000000000000000044637a4292e0cd2b17a55d5f6b2f05afcacd0586", - "reverted": false, - "slot": "0x360894a13ba1a3210667c828492db98dca3e2076cc3735a920a3ca505d382bbc" - } - ], - "value": 0 - }, - { - "accessor": "0x1804c8AB1F12E6bbf3894d4083f33e07309d1f38", - "account": "0x44637A4292E0CD2B17A55d5F6B2F05AFcAcD0586", - "chainInfo": { - "chainId": 31337, - "forkId": 0 - }, - "data": "0x927ede2d", - "deployedCode": "0x", - "initialized": true, - "kind": "DelegateCall", - "newBalance": 0, - "oldBalance": 0, - "reverted": false, - "storageAccesses": [ - { - "account": "0xDeF3bca8c80064589E6787477FFa7Dd616B5574F", - "isWrite": false, - "newValue": "0x00000000000000000000000020a42a5a785622c6ba2576b2d6e924aa82bfa11d", - "previousValue": "0x00000000000000000000000020a42a5a785622c6ba2576b2d6e924aa82bfa11d", - "reverted": false, - "slot": "0x0000000000000000000000000000000000000000000000000000000000000001" - } - ], - "value": 0 - }, - { - "accessor": "0x1804c8AB1F12E6bbf3894d4083f33e07309d1f38", - "account": "0xDeF3bca8c80064589E6787477FFa7Dd616B5574F", - "chainInfo": { - "chainId": 31337, - "forkId": 0 - }, - "data": "0x3cb747bf", - "deployedCode": "0x", - "initialized": true, - "kind": "StaticCall", - "newBalance": 0, - "oldBalance": 0, - "reverted": false, - "storageAccesses": [ - { - "account": "0xDeF3bca8c80064589E6787477FFa7Dd616B5574F", - "isWrite": false, - "newValue": "0x00000000000000000000000044637a4292e0cd2b17a55d5f6b2f05afcacd0586", - "previousValue": "0x00000000000000000000000044637a4292e0cd2b17a55d5f6b2f05afcacd0586", - "reverted": false, - "slot": "0x360894a13ba1a3210667c828492db98dca3e2076cc3735a920a3ca505d382bbc" - } - ], - "value": 0 - }, - { - "accessor": "0x1804c8AB1F12E6bbf3894d4083f33e07309d1f38", - "account": "0x44637A4292E0CD2B17A55d5F6B2F05AFcAcD0586", - "chainInfo": { - "chainId": 31337, - "forkId": 0 - }, - "data": "0x3cb747bf", - "deployedCode": "0x", - "initialized": true, - "kind": "DelegateCall", - "newBalance": 0, - "oldBalance": 0, - "reverted": false, - "storageAccesses": [ - { - "account": "0xDeF3bca8c80064589E6787477FFa7Dd616B5574F", - "isWrite": false, - "newValue": "0x00000000000000000000000020a42a5a785622c6ba2576b2d6e924aa82bfa11d", - "previousValue": "0x00000000000000000000000020a42a5a785622c6ba2576b2d6e924aa82bfa11d", - "reverted": false, - "slot": "0x0000000000000000000000000000000000000000000000000000000000000001" - } - ], - "value": 0 - }, - { - "accessor": "0x1804c8AB1F12E6bbf3894d4083f33e07309d1f38", - "account": "0xDeF3bca8c80064589E6787477FFa7Dd616B5574F", - "chainInfo": { - "chainId": 31337, - "forkId": 0 - }, - "data": "0x35e80ab3", - "deployedCode": "0x", - "initialized": true, - "kind": "StaticCall", - "newBalance": 0, - "oldBalance": 0, - "reverted": false, - "storageAccesses": [ - { - "account": "0xDeF3bca8c80064589E6787477FFa7Dd616B5574F", - "isWrite": false, - "newValue": "0x00000000000000000000000044637a4292e0cd2b17a55d5f6b2f05afcacd0586", - "previousValue": "0x00000000000000000000000044637a4292e0cd2b17a55d5f6b2f05afcacd0586", - "reverted": false, - "slot": "0x360894a13ba1a3210667c828492db98dca3e2076cc3735a920a3ca505d382bbc" - } - ], - "value": 0 - }, - { - "accessor": "0x1804c8AB1F12E6bbf3894d4083f33e07309d1f38", - "account": "0x44637A4292E0CD2B17A55d5F6B2F05AFcAcD0586", - "chainInfo": { - "chainId": 31337, - "forkId": 0 - }, - "data": "0x35e80ab3", - "deployedCode": "0x", - "initialized": true, - "kind": "DelegateCall", - "newBalance": 0, - "oldBalance": 0, - "reverted": false, - "storageAccesses": [ - { - "account": "0xDeF3bca8c80064589E6787477FFa7Dd616B5574F", - "isWrite": false, - "newValue": "0x000000000000000000000000deb1e9a6be7baf84208bb6e10ac9f9bbe1d70809", - "previousValue": "0x000000000000000000000000deb1e9a6be7baf84208bb6e10ac9f9bbe1d70809", - "reverted": false, - "slot": "0x0000000000000000000000000000000000000000000000000000000000000032" - } - ], - "value": 0 - }, - { - "accessor": "0x7FA9385bE102ac3EAc297483Dd6233D62b3e1496", - "account": "0x7109709ECfa91a80626fF3989D68f67F5b1DD12D", - "chainInfo": { - "chainId": 31337, - "forkId": 0 - }, - "data": "0x", - "deployedCode": "0x", - "initialized": true, - "kind": "Resume", - "newBalance": 0, - "oldBalance": 0, - "reverted": false, - "storageAccesses": [], - "value": 0 - }, - { - "accessor": "0x7FA9385bE102ac3EAc297483Dd6233D62b3e1496", - "account": "0x7109709ECfa91a80626fF3989D68f67F5b1DD12D", - "chainInfo": { - "chainId": 31337, - "forkId": 0 - }, - "data": "0x", - "deployedCode": "0x", - "initialized": true, - "kind": "Resume", - "newBalance": 0, - "oldBalance": 0, - "reverted": false, - "storageAccesses": [], - "value": 0 - }, - { - "accessor": "0x1804c8AB1F12E6bbf3894d4083f33e07309d1f38", - "account": "0xDB8cFf278adCCF9E9b5da745B44E754fC4EE3C76", - "chainInfo": { - "chainId": 31337, - "forkId": 0 - }, - "data": "0x6bd9f51600000000000000000000000020a42a5a785622c6ba2576b2d6e924aa82bfa11d", - "deployedCode": "0x", - "initialized": true, - "kind": "StaticCall", - "newBalance": 0, - "oldBalance": 0, - "reverted": false, - "storageAccesses": [ - { - "account": "0xDB8cFf278adCCF9E9b5da745B44E754fC4EE3C76", - "isWrite": false, - "newValue": "0x0000000000000000000000000000000000000000000000000000000000000000", - "previousValue": "0x0000000000000000000000000000000000000000000000000000000000000000", - "reverted": false, - "slot": "0x540cf4e2f45b866b44f44bde51e109474016dc46a0670fbe1684ad8eaf90fdc3" - } - ], - "value": 0 - }, - { - "accessor": "0x1804c8AB1F12E6bbf3894d4083f33e07309d1f38", - "account": "0x7d039be7F9b5190147621b02e82B250e1D748e02", - "chainInfo": { - "chainId": 31337, - "forkId": 0 - }, - "data": "0x6a761202000000000000000000000000db8cff278adccf9e9b5da745b44e754fc4ee3c760000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000014000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000001c000000000000000000000000000000000000000000000000000000000000000448d52d4a000000000000000000000000020a42a5a785622c6ba2576b2d6e924aa82bfa11d00000000000000000000000000000000000000000000000000000000000000020000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000410000000000000000000000001804c8ab1f12e6bbf3894d4083f33e07309d1f3800000000000000000000000000000000000000000000000000000000000000000100000000000000000000000000000000000000000000000000000000000000", - "deployedCode": "0x", - "initialized": true, - "kind": "Call", - "newBalance": 0, - "oldBalance": 0, - "reverted": false, - "storageAccesses": [ - { - "account": "0x7d039be7F9b5190147621b02e82B250e1D748e02", - "isWrite": false, - "newValue": "0x00000000000000000000000090193c961a926261b756d1e5bb255e67ff9498a1", - "previousValue": "0x00000000000000000000000090193c961a926261b756d1e5bb255e67ff9498a1", - "reverted": false, - "slot": "0x0000000000000000000000000000000000000000000000000000000000000000" - } - ], - "value": 0 - }, - { - "accessor": "0x1804c8AB1F12E6bbf3894d4083f33e07309d1f38", - "account": "0x90193C961A926261B756D1E5bb255e67ff9498A1", - "chainInfo": { - "chainId": 31337, - "forkId": 0 - }, - "data": "0x6a761202000000000000000000000000db8cff278adccf9e9b5da745b44e754fc4ee3c760000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000014000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000001c000000000000000000000000000000000000000000000000000000000000000448d52d4a000000000000000000000000020a42a5a785622c6ba2576b2d6e924aa82bfa11d00000000000000000000000000000000000000000000000000000000000000020000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000410000000000000000000000001804c8ab1f12e6bbf3894d4083f33e07309d1f3800000000000000000000000000000000000000000000000000000000000000000100000000000000000000000000000000000000000000000000000000000000", - "deployedCode": "0x", - "initialized": true, - "kind": "DelegateCall", - "newBalance": 0, - "oldBalance": 0, - "reverted": false, - "storageAccesses": [ - { - "account": "0x7d039be7F9b5190147621b02e82B250e1D748e02", - "isWrite": false, - "newValue": "0x0000000000000000000000000000000000000000000000000000000000000006", - "previousValue": "0x0000000000000000000000000000000000000000000000000000000000000006", - "reverted": false, - "slot": "0x0000000000000000000000000000000000000000000000000000000000000005" - }, - { - "account": "0x7d039be7F9b5190147621b02e82B250e1D748e02", - "isWrite": false, - "newValue": "0x0000000000000000000000000000000000000000000000000000000000000006", - "previousValue": "0x0000000000000000000000000000000000000000000000000000000000000006", - "reverted": false, - "slot": "0x0000000000000000000000000000000000000000000000000000000000000005" - }, - { - "account": "0x7d039be7F9b5190147621b02e82B250e1D748e02", - "isWrite": true, - "newValue": "0x0000000000000000000000000000000000000000000000000000000000000007", - "previousValue": "0x0000000000000000000000000000000000000000000000000000000000000006", - "reverted": false, - "slot": "0x0000000000000000000000000000000000000000000000000000000000000005" - }, - { - "account": "0x7d039be7F9b5190147621b02e82B250e1D748e02", - "isWrite": false, - "newValue": "0x0000000000000000000000000000000000000000000000000000000000000001", - "previousValue": "0x0000000000000000000000000000000000000000000000000000000000000001", - "reverted": false, - "slot": "0x0000000000000000000000000000000000000000000000000000000000000004" - }, - { - "account": "0x7d039be7F9b5190147621b02e82B250e1D748e02", - "isWrite": false, - "newValue": "0x0000000000000000000000000000000000000000000000000000000000000001", - "previousValue": "0x0000000000000000000000000000000000000000000000000000000000000001", - "reverted": false, - "slot": "0xd1b0d319c6526317dce66989b393dcfb4435c9a65e399a088b63bbf65d7aee32" - }, - { - "account": "0x7d039be7F9b5190147621b02e82B250e1D748e02", - "isWrite": false, - "newValue": "0x0000000000000000000000000000000000000000000000000000000000000000", - "previousValue": "0x0000000000000000000000000000000000000000000000000000000000000000", - "reverted": false, - "slot": "0x4a204f620c8c5ccdca3fd54d003badd85ba500436a431f0cbda4f558c93c34c8" - } - ], - "value": 0 - }, - { - "accessor": "0x7d039be7F9b5190147621b02e82B250e1D748e02", - "account": "0xDB8cFf278adCCF9E9b5da745B44E754fC4EE3C76", - "chainInfo": { - "chainId": 31337, - "forkId": 0 - }, - "data": "0x8d52d4a000000000000000000000000020a42a5a785622c6ba2576b2d6e924aa82bfa11d0000000000000000000000000000000000000000000000000000000000000002", - "deployedCode": "0x", - "initialized": true, - "kind": "Call", - "newBalance": 0, - "oldBalance": 0, - "reverted": false, - "storageAccesses": [ - { - "account": "0xDB8cFf278adCCF9E9b5da745B44E754fC4EE3C76", - "isWrite": false, - "newValue": "0x0000000000000000000000007d039be7f9b5190147621b02e82b250e1d748e02", - "previousValue": "0x0000000000000000000000007d039be7f9b5190147621b02e82b250e1d748e02", - "reverted": false, - "slot": "0x0000000000000000000000000000000000000000000000000000000000000000" - }, - { - "account": "0xDB8cFf278adCCF9E9b5da745B44E754fC4EE3C76", - "isWrite": false, - "newValue": "0x0000000000000000000000000000000000000000000000000000000000000000", - "previousValue": "0x0000000000000000000000000000000000000000000000000000000000000000", - "reverted": false, - "slot": "0x540cf4e2f45b866b44f44bde51e109474016dc46a0670fbe1684ad8eaf90fdc3" - }, - { - "account": "0xDB8cFf278adCCF9E9b5da745B44E754fC4EE3C76", - "isWrite": true, - "newValue": "0x0000000000000000000000000000000000000000000000000000000000000002", - "previousValue": "0x0000000000000000000000000000000000000000000000000000000000000000", - "reverted": false, - "slot": "0x540cf4e2f45b866b44f44bde51e109474016dc46a0670fbe1684ad8eaf90fdc3" - } - ], - "value": 0 - }, - { - "accessor": "0x1804c8AB1F12E6bbf3894d4083f33e07309d1f38", - "account": "0xDB8cFf278adCCF9E9b5da745B44E754fC4EE3C76", - "chainInfo": { - "chainId": 31337, - "forkId": 0 - }, - "data": "0x6bd9f51600000000000000000000000020a42a5a785622c6ba2576b2d6e924aa82bfa11d", - "deployedCode": "0x", - "initialized": true, - "kind": "StaticCall", - "newBalance": 0, - "oldBalance": 0, - "reverted": false, - "storageAccesses": [ - { - "account": "0xDB8cFf278adCCF9E9b5da745B44E754fC4EE3C76", - "isWrite": false, - "newValue": "0x0000000000000000000000000000000000000000000000000000000000000002", - "previousValue": "0x0000000000000000000000000000000000000000000000000000000000000002", - "reverted": false, - "slot": "0x540cf4e2f45b866b44f44bde51e109474016dc46a0670fbe1684ad8eaf90fdc3" - } - ], - "value": 0 - }, - { - "accessor": "0x1804c8AB1F12E6bbf3894d4083f33e07309d1f38", - "account": "0xDB8cFf278adCCF9E9b5da745B44E754fC4EE3C76", - "chainInfo": { - "chainId": 31337, - "forkId": 0 - }, - "data": "0x238181ae000000000000000000000000f3e6cbcbf1ae12fc13bc8b14fa8a67cbe147fd99", - "deployedCode": "0x", - "initialized": true, - "kind": "StaticCall", - "newBalance": 0, - "oldBalance": 0, - "reverted": false, - "storageAccesses": [ - { - "account": "0xDB8cFf278adCCF9E9b5da745B44E754fC4EE3C76", - "isWrite": false, - "newValue": "0x0000000000000000000000000000000000000000000000000000000000000000", - "previousValue": "0x0000000000000000000000000000000000000000000000000000000000000000", - "reverted": false, - "slot": "0x130727a1e38e003a4a83c345938c34d2eb51450595da938f77fdc3d81ddefae9" - }, - { - "account": "0xDB8cFf278adCCF9E9b5da745B44E754fC4EE3C76", - "isWrite": false, - "newValue": "0x0000000000000000000000000000000000000000000000000000000000000000", - "previousValue": "0x0000000000000000000000000000000000000000000000000000000000000000", - "reverted": false, - "slot": "0x130727a1e38e003a4a83c345938c34d2eb51450595da938f77fdc3d81ddefae9" - } - ], - "value": 0 - }, - { - "accessor": "0x1804c8AB1F12E6bbf3894d4083f33e07309d1f38", - "account": "0x7d039be7F9b5190147621b02e82B250e1D748e02", - "chainInfo": { - "chainId": 31337, - "forkId": 0 - }, - "data": "0x6a761202000000000000000000000000db8cff278adccf9e9b5da745b44e754fc4ee3c760000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000014000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000002000000000000000000000000000000000000000000000000000000000000000084860f7cda00000000000000000000000020a42a5a785622c6ba2576b2d6e924aa82bfa11d0000000000000000000000000000000000000000000000000000000000000040000000000000000000000000000000000000000000000000000000000000001a4f564d5f4c3143726f7373446f6d61696e4d657373656e6765720000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000410000000000000000000000001804c8ab1f12e6bbf3894d4083f33e07309d1f3800000000000000000000000000000000000000000000000000000000000000000100000000000000000000000000000000000000000000000000000000000000", - "deployedCode": "0x", - "initialized": true, - "kind": "Call", - "newBalance": 0, - "oldBalance": 0, - "reverted": false, - "storageAccesses": [ - { - "account": "0x7d039be7F9b5190147621b02e82B250e1D748e02", - "isWrite": false, - "newValue": "0x00000000000000000000000090193c961a926261b756d1e5bb255e67ff9498a1", - "previousValue": "0x00000000000000000000000090193c961a926261b756d1e5bb255e67ff9498a1", - "reverted": false, - "slot": "0x0000000000000000000000000000000000000000000000000000000000000000" - } - ], - "value": 0 - }, - { - "accessor": "0x1804c8AB1F12E6bbf3894d4083f33e07309d1f38", - "account": "0x90193C961A926261B756D1E5bb255e67ff9498A1", - "chainInfo": { - "chainId": 31337, - "forkId": 0 - }, - "data": "0x6a761202000000000000000000000000db8cff278adccf9e9b5da745b44e754fc4ee3c760000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000014000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000002000000000000000000000000000000000000000000000000000000000000000084860f7cda00000000000000000000000020a42a5a785622c6ba2576b2d6e924aa82bfa11d0000000000000000000000000000000000000000000000000000000000000040000000000000000000000000000000000000000000000000000000000000001a4f564d5f4c3143726f7373446f6d61696e4d657373656e6765720000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000410000000000000000000000001804c8ab1f12e6bbf3894d4083f33e07309d1f3800000000000000000000000000000000000000000000000000000000000000000100000000000000000000000000000000000000000000000000000000000000", - "deployedCode": "0x", - "initialized": true, - "kind": "DelegateCall", - "newBalance": 0, - "oldBalance": 0, - "reverted": false, - "storageAccesses": [ - { - "account": "0x7d039be7F9b5190147621b02e82B250e1D748e02", - "isWrite": false, - "newValue": "0x0000000000000000000000000000000000000000000000000000000000000007", - "previousValue": "0x0000000000000000000000000000000000000000000000000000000000000007", - "reverted": false, - "slot": "0x0000000000000000000000000000000000000000000000000000000000000005" - }, - { - "account": "0x7d039be7F9b5190147621b02e82B250e1D748e02", - "isWrite": false, - "newValue": "0x0000000000000000000000000000000000000000000000000000000000000007", - "previousValue": "0x0000000000000000000000000000000000000000000000000000000000000007", - "reverted": false, - "slot": "0x0000000000000000000000000000000000000000000000000000000000000005" - }, - { - "account": "0x7d039be7F9b5190147621b02e82B250e1D748e02", - "isWrite": true, - "newValue": "0x0000000000000000000000000000000000000000000000000000000000000008", - "previousValue": "0x0000000000000000000000000000000000000000000000000000000000000007", - "reverted": false, - "slot": "0x0000000000000000000000000000000000000000000000000000000000000005" - }, - { - "account": "0x7d039be7F9b5190147621b02e82B250e1D748e02", - "isWrite": false, - "newValue": "0x0000000000000000000000000000000000000000000000000000000000000001", - "previousValue": "0x0000000000000000000000000000000000000000000000000000000000000001", - "reverted": false, - "slot": "0x0000000000000000000000000000000000000000000000000000000000000004" - }, - { - "account": "0x7d039be7F9b5190147621b02e82B250e1D748e02", - "isWrite": false, - "newValue": "0x0000000000000000000000000000000000000000000000000000000000000001", - "previousValue": "0x0000000000000000000000000000000000000000000000000000000000000001", - "reverted": false, - "slot": "0xd1b0d319c6526317dce66989b393dcfb4435c9a65e399a088b63bbf65d7aee32" - }, - { - "account": "0x7d039be7F9b5190147621b02e82B250e1D748e02", - "isWrite": false, - "newValue": "0x0000000000000000000000000000000000000000000000000000000000000000", - "previousValue": "0x0000000000000000000000000000000000000000000000000000000000000000", - "reverted": false, - "slot": "0x4a204f620c8c5ccdca3fd54d003badd85ba500436a431f0cbda4f558c93c34c8" - } - ], - "value": 0 - }, - { - "accessor": "0x7d039be7F9b5190147621b02e82B250e1D748e02", - "account": "0xDB8cFf278adCCF9E9b5da745B44E754fC4EE3C76", - "chainInfo": { - "chainId": 31337, - "forkId": 0 - }, - "data": "0x860f7cda00000000000000000000000020a42a5a785622c6ba2576b2d6e924aa82bfa11d0000000000000000000000000000000000000000000000000000000000000040000000000000000000000000000000000000000000000000000000000000001a4f564d5f4c3143726f7373446f6d61696e4d657373656e676572000000000000", - "deployedCode": "0x", - "initialized": true, - "kind": "Call", - "newBalance": 0, - "oldBalance": 0, - "reverted": false, - "storageAccesses": [ - { - "account": "0xDB8cFf278adCCF9E9b5da745B44E754fC4EE3C76", - "isWrite": false, - "newValue": "0x0000000000000000000000007d039be7f9b5190147621b02e82b250e1d748e02", - "previousValue": "0x0000000000000000000000007d039be7f9b5190147621b02e82b250e1d748e02", - "reverted": false, - "slot": "0x0000000000000000000000000000000000000000000000000000000000000000" - }, - { - "account": "0xDB8cFf278adCCF9E9b5da745B44E754fC4EE3C76", - "isWrite": false, - "newValue": "0x0000000000000000000000000000000000000000000000000000000000000000", - "previousValue": "0x0000000000000000000000000000000000000000000000000000000000000000", - "reverted": false, - "slot": "0x17eb2365d570ef4d1cc4abe9e522ed8632b11233db9c15f3c2c8aa32407b981b" - }, - { - "account": "0xDB8cFf278adCCF9E9b5da745B44E754fC4EE3C76", - "isWrite": true, - "newValue": "0x4f564d5f4c3143726f7373446f6d61696e4d657373656e676572000000000034", - "previousValue": "0x0000000000000000000000000000000000000000000000000000000000000000", - "reverted": false, - "slot": "0x17eb2365d570ef4d1cc4abe9e522ed8632b11233db9c15f3c2c8aa32407b981b" - } - ], - "value": 0 - }, - { - "accessor": "0x1804c8AB1F12E6bbf3894d4083f33e07309d1f38", - "account": "0xDB8cFf278adCCF9E9b5da745B44E754fC4EE3C76", - "chainInfo": { - "chainId": 31337, - "forkId": 0 - }, - "data": "0x238181ae00000000000000000000000020a42a5a785622c6ba2576b2d6e924aa82bfa11d", - "deployedCode": "0x", - "initialized": true, - "kind": "StaticCall", - "newBalance": 0, - "oldBalance": 0, - "reverted": false, - "storageAccesses": [ - { - "account": "0xDB8cFf278adCCF9E9b5da745B44E754fC4EE3C76", - "isWrite": false, - "newValue": "0x4f564d5f4c3143726f7373446f6d61696e4d657373656e676572000000000034", - "previousValue": "0x4f564d5f4c3143726f7373446f6d61696e4d657373656e676572000000000034", - "reverted": false, - "slot": "0x17eb2365d570ef4d1cc4abe9e522ed8632b11233db9c15f3c2c8aa32407b981b" - }, - { - "account": "0xDB8cFf278adCCF9E9b5da745B44E754fC4EE3C76", - "isWrite": false, - "newValue": "0x4f564d5f4c3143726f7373446f6d61696e4d657373656e676572000000000034", - "previousValue": "0x4f564d5f4c3143726f7373446f6d61696e4d657373656e676572000000000034", - "reverted": false, - "slot": "0x17eb2365d570ef4d1cc4abe9e522ed8632b11233db9c15f3c2c8aa32407b981b" - }, - { - "account": "0xDB8cFf278adCCF9E9b5da745B44E754fC4EE3C76", - "isWrite": false, - "newValue": "0x4f564d5f4c3143726f7373446f6d61696e4d657373656e676572000000000034", - "previousValue": "0x4f564d5f4c3143726f7373446f6d61696e4d657373656e676572000000000034", - "reverted": false, - "slot": "0x17eb2365d570ef4d1cc4abe9e522ed8632b11233db9c15f3c2c8aa32407b981b" - } - ], - "value": 0 - }, - { - "accessor": "0x1804c8AB1F12E6bbf3894d4083f33e07309d1f38", - "account": "0x7d039be7F9b5190147621b02e82B250e1D748e02", - "chainInfo": { - "chainId": 31337, - "forkId": 0 - }, - "data": "0x6a761202000000000000000000000000db8cff278adccf9e9b5da745b44e754fc4ee3c7600000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000140000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000028000000000000000000000000000000000000000000000000000000000000001049623609d00000000000000000000000020a42a5a785622c6ba2576b2d6e924aa82bfa11d000000000000000000000000f3e6cbcbf1ae12fc13bc8b14fa8a67cbe147fd9900000000000000000000000000000000000000000000000000000000000000600000000000000000000000000000000000000000000000000000000000000064c0c53b8b000000000000000000000000deb1e9a6be7baf84208bb6e10ac9f9bbe1d70809000000000000000000000000978e3286eb805934215a88694d80b09aded68d900000000000000000000000001c23a6d89f95ef3148bcda8e242cab145bf9c0e4000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000410000000000000000000000001804c8ab1f12e6bbf3894d4083f33e07309d1f3800000000000000000000000000000000000000000000000000000000000000000100000000000000000000000000000000000000000000000000000000000000", - "deployedCode": "0x", - "initialized": true, - "kind": "Call", - "newBalance": 0, - "oldBalance": 0, - "reverted": false, - "storageAccesses": [ - { - "account": "0x7d039be7F9b5190147621b02e82B250e1D748e02", - "isWrite": false, - "newValue": "0x00000000000000000000000090193c961a926261b756d1e5bb255e67ff9498a1", - "previousValue": "0x00000000000000000000000090193c961a926261b756d1e5bb255e67ff9498a1", - "reverted": false, - "slot": "0x0000000000000000000000000000000000000000000000000000000000000000" - } - ], - "value": 0 - }, - { - "accessor": "0x1804c8AB1F12E6bbf3894d4083f33e07309d1f38", - "account": "0x90193C961A926261B756D1E5bb255e67ff9498A1", - "chainInfo": { - "chainId": 31337, - "forkId": 0 - }, - "data": "0x6a761202000000000000000000000000db8cff278adccf9e9b5da745b44e754fc4ee3c7600000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000140000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000028000000000000000000000000000000000000000000000000000000000000001049623609d00000000000000000000000020a42a5a785622c6ba2576b2d6e924aa82bfa11d000000000000000000000000f3e6cbcbf1ae12fc13bc8b14fa8a67cbe147fd9900000000000000000000000000000000000000000000000000000000000000600000000000000000000000000000000000000000000000000000000000000064c0c53b8b000000000000000000000000deb1e9a6be7baf84208bb6e10ac9f9bbe1d70809000000000000000000000000978e3286eb805934215a88694d80b09aded68d900000000000000000000000001c23a6d89f95ef3148bcda8e242cab145bf9c0e4000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000410000000000000000000000001804c8ab1f12e6bbf3894d4083f33e07309d1f3800000000000000000000000000000000000000000000000000000000000000000100000000000000000000000000000000000000000000000000000000000000", - "deployedCode": "0x", - "initialized": true, - "kind": "DelegateCall", - "newBalance": 0, - "oldBalance": 0, - "reverted": false, - "storageAccesses": [ - { - "account": "0x7d039be7F9b5190147621b02e82B250e1D748e02", - "isWrite": false, - "newValue": "0x0000000000000000000000000000000000000000000000000000000000000008", - "previousValue": "0x0000000000000000000000000000000000000000000000000000000000000008", - "reverted": false, - "slot": "0x0000000000000000000000000000000000000000000000000000000000000005" - }, - { - "account": "0x7d039be7F9b5190147621b02e82B250e1D748e02", - "isWrite": false, - "newValue": "0x0000000000000000000000000000000000000000000000000000000000000008", - "previousValue": "0x0000000000000000000000000000000000000000000000000000000000000008", - "reverted": false, - "slot": "0x0000000000000000000000000000000000000000000000000000000000000005" - }, - { - "account": "0x7d039be7F9b5190147621b02e82B250e1D748e02", - "isWrite": true, - "newValue": "0x0000000000000000000000000000000000000000000000000000000000000009", - "previousValue": "0x0000000000000000000000000000000000000000000000000000000000000008", - "reverted": false, - "slot": "0x0000000000000000000000000000000000000000000000000000000000000005" - }, - { - "account": "0x7d039be7F9b5190147621b02e82B250e1D748e02", - "isWrite": false, - "newValue": "0x0000000000000000000000000000000000000000000000000000000000000001", - "previousValue": "0x0000000000000000000000000000000000000000000000000000000000000001", - "reverted": false, - "slot": "0x0000000000000000000000000000000000000000000000000000000000000004" - }, - { - "account": "0x7d039be7F9b5190147621b02e82B250e1D748e02", - "isWrite": false, - "newValue": "0x0000000000000000000000000000000000000000000000000000000000000001", - "previousValue": "0x0000000000000000000000000000000000000000000000000000000000000001", - "reverted": false, - "slot": "0xd1b0d319c6526317dce66989b393dcfb4435c9a65e399a088b63bbf65d7aee32" - }, - { - "account": "0x7d039be7F9b5190147621b02e82B250e1D748e02", - "isWrite": false, - "newValue": "0x0000000000000000000000000000000000000000000000000000000000000000", - "previousValue": "0x0000000000000000000000000000000000000000000000000000000000000000", - "reverted": false, - "slot": "0x4a204f620c8c5ccdca3fd54d003badd85ba500436a431f0cbda4f558c93c34c8" - } - ], - "value": 0 - }, - { - "accessor": "0x7d039be7F9b5190147621b02e82B250e1D748e02", - "account": "0xDB8cFf278adCCF9E9b5da745B44E754fC4EE3C76", - "chainInfo": { - "chainId": 31337, - "forkId": 0 - }, - "data": "0x9623609d00000000000000000000000020a42a5a785622c6ba2576b2d6e924aa82bfa11d000000000000000000000000f3e6cbcbf1ae12fc13bc8b14fa8a67cbe147fd9900000000000000000000000000000000000000000000000000000000000000600000000000000000000000000000000000000000000000000000000000000064c0c53b8b000000000000000000000000deb1e9a6be7baf84208bb6e10ac9f9bbe1d70809000000000000000000000000978e3286eb805934215a88694d80b09aded68d900000000000000000000000001c23a6d89f95ef3148bcda8e242cab145bf9c0e400000000000000000000000000000000000000000000000000000000", - "deployedCode": "0x", - "initialized": true, - "kind": "Call", - "newBalance": 0, - "oldBalance": 0, - "reverted": false, - "storageAccesses": [ - { - "account": "0xDB8cFf278adCCF9E9b5da745B44E754fC4EE3C76", - "isWrite": false, - "newValue": "0x0000000000000000000000007d039be7f9b5190147621b02e82b250e1d748e02", - "previousValue": "0x0000000000000000000000007d039be7f9b5190147621b02e82b250e1d748e02", - "reverted": false, - "slot": "0x0000000000000000000000000000000000000000000000000000000000000000" - }, - { - "account": "0xDB8cFf278adCCF9E9b5da745B44E754fC4EE3C76", - "isWrite": false, - "newValue": "0x0000000000000000000000000000000000000000000000000000000000000002", - "previousValue": "0x0000000000000000000000000000000000000000000000000000000000000002", - "reverted": false, - "slot": "0x540cf4e2f45b866b44f44bde51e109474016dc46a0670fbe1684ad8eaf90fdc3" - }, - { - "account": "0xDB8cFf278adCCF9E9b5da745B44E754fC4EE3C76", - "isWrite": false, - "newValue": "0x0000000000000000000000007d039be7f9b5190147621b02e82b250e1d748e02", - "previousValue": "0x0000000000000000000000007d039be7f9b5190147621b02e82b250e1d748e02", - "reverted": false, - "slot": "0x0000000000000000000000000000000000000000000000000000000000000000" - }, - { - "account": "0xDB8cFf278adCCF9E9b5da745B44E754fC4EE3C76", - "isWrite": false, - "newValue": "0x0000000000000000000000000000000000000000000000000000000000000002", - "previousValue": "0x0000000000000000000000000000000000000000000000000000000000000002", - "reverted": false, - "slot": "0x540cf4e2f45b866b44f44bde51e109474016dc46a0670fbe1684ad8eaf90fdc3" - }, - { - "account": "0xDB8cFf278adCCF9E9b5da745B44E754fC4EE3C76", - "isWrite": false, - "newValue": "0x4f564d5f4c3143726f7373446f6d61696e4d657373656e676572000000000034", - "previousValue": "0x4f564d5f4c3143726f7373446f6d61696e4d657373656e676572000000000034", - "reverted": false, - "slot": "0x17eb2365d570ef4d1cc4abe9e522ed8632b11233db9c15f3c2c8aa32407b981b" - }, - { - "account": "0xDB8cFf278adCCF9E9b5da745B44E754fC4EE3C76", - "isWrite": false, - "newValue": "0x4f564d5f4c3143726f7373446f6d61696e4d657373656e676572000000000034", - "previousValue": "0x4f564d5f4c3143726f7373446f6d61696e4d657373656e676572000000000034", - "reverted": false, - "slot": "0x17eb2365d570ef4d1cc4abe9e522ed8632b11233db9c15f3c2c8aa32407b981b" - }, - { - "account": "0xDB8cFf278adCCF9E9b5da745B44E754fC4EE3C76", - "isWrite": false, - "newValue": "0x4f564d5f4c3143726f7373446f6d61696e4d657373656e676572000000000034", - "previousValue": "0x4f564d5f4c3143726f7373446f6d61696e4d657373656e676572000000000034", - "reverted": false, - "slot": "0x17eb2365d570ef4d1cc4abe9e522ed8632b11233db9c15f3c2c8aa32407b981b" - }, - { - "account": "0xDB8cFf278adCCF9E9b5da745B44E754fC4EE3C76", - "isWrite": false, - "newValue": "0x000000000000000000000000bb2180ebd78ce97360503434ed37fcf4a1df61c3", - "previousValue": "0x000000000000000000000000bb2180ebd78ce97360503434ed37fcf4a1df61c3", - "reverted": false, - "slot": "0x0000000000000000000000000000000000000000000000000000000000000003" - } - ], - "value": 0 - }, - { - "accessor": "0xDB8cFf278adCCF9E9b5da745B44E754fC4EE3C76", - "account": "0xBb2180ebd78ce97360503434eD37fcf4a1Df61c3", - "chainInfo": { - "chainId": 31337, - "forkId": 0 - }, - "data": "0x", - "deployedCode": "0x", - "initialized": true, - "kind": "Resume", - "newBalance": 0, - "oldBalance": 0, - "reverted": false, - "storageAccesses": [], - "value": 0 - }, - { - "accessor": "0xDB8cFf278adCCF9E9b5da745B44E754fC4EE3C76", - "account": "0xBb2180ebd78ce97360503434eD37fcf4a1Df61c3", - "chainInfo": { - "chainId": 31337, - "forkId": 0 - }, - "data": "0x9b2ea4bd0000000000000000000000000000000000000000000000000000000000000040000000000000000000000000f3e6cbcbf1ae12fc13bc8b14fa8a67cbe147fd99000000000000000000000000000000000000000000000000000000000000001a4f564d5f4c3143726f7373446f6d61696e4d657373656e676572000000000000", - "deployedCode": "0x", - "initialized": true, - "kind": "Call", - "newBalance": 0, - "oldBalance": 0, - "reverted": false, - "storageAccesses": [ - { - "account": "0xBb2180ebd78ce97360503434eD37fcf4a1Df61c3", - "isWrite": false, - "newValue": "0x000000000000000000000000db8cff278adccf9e9b5da745b44e754fc4ee3c76", - "previousValue": "0x000000000000000000000000db8cff278adccf9e9b5da745b44e754fc4ee3c76", - "reverted": false, - "slot": "0x0000000000000000000000000000000000000000000000000000000000000000" - }, - { - "account": "0xBb2180ebd78ce97360503434eD37fcf4a1Df61c3", - "isWrite": false, - "newValue": "0x0000000000000000000000000000000000000000000000000000000000000000", - "previousValue": "0x0000000000000000000000000000000000000000000000000000000000000000", - "reverted": false, - "slot": "0x515216935740e67dfdda5cf8e248ea32b3277787818ab59153061ac875c9385e" - }, - { - "account": "0xBb2180ebd78ce97360503434eD37fcf4a1Df61c3", - "isWrite": true, - "newValue": "0x000000000000000000000000f3e6cbcbf1ae12fc13bc8b14fa8a67cbe147fd99", - "previousValue": "0x0000000000000000000000000000000000000000000000000000000000000000", - "reverted": false, - "slot": "0x515216935740e67dfdda5cf8e248ea32b3277787818ab59153061ac875c9385e" - } - ], - "value": 0 - }, - { - "accessor": "0xDB8cFf278adCCF9E9b5da745B44E754fC4EE3C76", - "account": "0x20A42a5a785622c6Ba2576B2D6e924aA82BFA11D", - "chainInfo": { - "chainId": 31337, - "forkId": 0 - }, - "data": "0xc0c53b8b000000000000000000000000deb1e9a6be7baf84208bb6e10ac9f9bbe1d70809000000000000000000000000978e3286eb805934215a88694d80b09aded68d900000000000000000000000001c23a6d89f95ef3148bcda8e242cab145bf9c0e4", - "deployedCode": "0x", - "initialized": true, - "kind": "Call", - "newBalance": 0, - "oldBalance": 0, - "reverted": false, - "storageAccesses": [ - { - "account": "0x20A42a5a785622c6Ba2576B2D6e924aA82BFA11D", - "isWrite": false, - "newValue": "0x000000000000000000000000bb2180ebd78ce97360503434ed37fcf4a1df61c3", - "previousValue": "0x000000000000000000000000bb2180ebd78ce97360503434ed37fcf4a1df61c3", - "reverted": false, - "slot": "0x540cf4e2f45b866b44f44bde51e109474016dc46a0670fbe1684ad8eaf90fdc3" - }, - { - "account": "0x20A42a5a785622c6Ba2576B2D6e924aA82BFA11D", - "isWrite": false, - "newValue": "0x4f564d5f4c3143726f7373446f6d61696e4d657373656e676572000000000034", - "previousValue": "0x4f564d5f4c3143726f7373446f6d61696e4d657373656e676572000000000034", - "reverted": false, - "slot": "0x4505be7acf20898edfef2b5289635349881ad9bf4b57316a74e81e2abec2be52" - } - ], - "value": 0 - }, - { - "accessor": "0x20A42a5a785622c6Ba2576B2D6e924aA82BFA11D", - "account": "0xBb2180ebd78ce97360503434eD37fcf4a1Df61c3", - "chainInfo": { - "chainId": 31337, - "forkId": 0 - }, - "data": "0xbf40fac10000000000000000000000000000000000000000000000000000000000000020000000000000000000000000000000000000000000000000000000000000001a4f564d5f4c3143726f7373446f6d61696e4d657373656e676572000000000000", - "deployedCode": "0x", - "initialized": true, - "kind": "StaticCall", - "newBalance": 0, - "oldBalance": 0, - "reverted": false, - "storageAccesses": [ - { - "account": "0xBb2180ebd78ce97360503434eD37fcf4a1Df61c3", - "isWrite": false, - "newValue": "0x000000000000000000000000f3e6cbcbf1ae12fc13bc8b14fa8a67cbe147fd99", - "previousValue": "0x000000000000000000000000f3e6cbcbf1ae12fc13bc8b14fa8a67cbe147fd99", - "reverted": false, - "slot": "0x515216935740e67dfdda5cf8e248ea32b3277787818ab59153061ac875c9385e" - } - ], - "value": 0 - }, - { - "accessor": "0xDB8cFf278adCCF9E9b5da745B44E754fC4EE3C76", - "account": "0xf3E6CBcbF1AE12Fc13Bc8B14FA8A67CbE147fD99", - "chainInfo": { - "chainId": 31337, - "forkId": 0 - }, - "data": "0xc0c53b8b000000000000000000000000deb1e9a6be7baf84208bb6e10ac9f9bbe1d70809000000000000000000000000978e3286eb805934215a88694d80b09aded68d900000000000000000000000001c23a6d89f95ef3148bcda8e242cab145bf9c0e4", - "deployedCode": "0x", - "initialized": true, - "kind": "DelegateCall", - "newBalance": 0, - "oldBalance": 0, - "reverted": false, - "storageAccesses": [ - { - "account": "0x20A42a5a785622c6Ba2576B2D6e924aA82BFA11D", - "isWrite": false, - "newValue": "0x0000000000000000000000000000000000000000000000000000000000000000", - "previousValue": "0x0000000000000000000000000000000000000000000000000000000000000000", - "reverted": false, - "slot": "0x0000000000000000000000000000000000000000000000000000000000000000" - }, - { - "account": "0x20A42a5a785622c6Ba2576B2D6e924aA82BFA11D", - "isWrite": false, - "newValue": "0x0000000000000000000000000000000000000000000000000000000000000000", - "previousValue": "0x0000000000000000000000000000000000000000000000000000000000000000", - "reverted": false, - "slot": "0x0000000000000000000000000000000000000000000000000000000000000000" - }, - { - "account": "0x20A42a5a785622c6Ba2576B2D6e924aA82BFA11D", - "isWrite": false, - "newValue": "0x0000000000000000000000000000000000000000000000000000000000000000", - "previousValue": "0x0000000000000000000000000000000000000000000000000000000000000000", - "reverted": false, - "slot": "0x0000000000000000000000000000000000000000000000000000000000000000" - }, - { - "account": "0x20A42a5a785622c6Ba2576B2D6e924aA82BFA11D", - "isWrite": true, - "newValue": "0x0000000000000000000000010000000000000000000000000000000000000000", - "previousValue": "0x0000000000000000000000000000000000000000000000000000000000000000", - "reverted": false, - "slot": "0x0000000000000000000000000000000000000000000000000000000000000000" - }, - { - "account": "0x20A42a5a785622c6Ba2576B2D6e924aA82BFA11D", - "isWrite": false, - "newValue": "0x0000000000000000000000010000000000000000000000000000000000000000", - "previousValue": "0x0000000000000000000000010000000000000000000000000000000000000000", - "reverted": false, - "slot": "0x0000000000000000000000000000000000000000000000000000000000000000" - }, - { - "account": "0x20A42a5a785622c6Ba2576B2D6e924aA82BFA11D", - "isWrite": true, - "newValue": "0x0000000000000000000001010000000000000000000000000000000000000000", - "previousValue": "0x0000000000000000000000010000000000000000000000000000000000000000", - "reverted": false, - "slot": "0x0000000000000000000000000000000000000000000000000000000000000000" - }, - { - "account": "0x20A42a5a785622c6Ba2576B2D6e924aA82BFA11D", - "isWrite": false, - "newValue": "0x0000000000000000000000000000000000000000000000000000000000000000", - "previousValue": "0x0000000000000000000000000000000000000000000000000000000000000000", - "reverted": false, - "slot": "0x00000000000000000000000000000000000000000000000000000000000000fb" - }, - { - "account": "0x20A42a5a785622c6Ba2576B2D6e924aA82BFA11D", - "isWrite": true, - "newValue": "0x000000000000000000000000deb1e9a6be7baf84208bb6e10ac9f9bbe1d70809", - "previousValue": "0x0000000000000000000000000000000000000000000000000000000000000000", - "reverted": false, - "slot": "0x00000000000000000000000000000000000000000000000000000000000000fb" - }, - { - "account": "0x20A42a5a785622c6Ba2576B2D6e924aA82BFA11D", - "isWrite": false, - "newValue": "0x0000000000000000000000000000000000000000000000000000000000000000", - "previousValue": "0x0000000000000000000000000000000000000000000000000000000000000000", - "reverted": false, - "slot": "0x00000000000000000000000000000000000000000000000000000000000000fc" - }, - { - "account": "0x20A42a5a785622c6Ba2576B2D6e924aA82BFA11D", - "isWrite": true, - "newValue": "0x000000000000000000000000978e3286eb805934215a88694d80b09aded68d90", - "previousValue": "0x0000000000000000000000000000000000000000000000000000000000000000", - "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, - "newValue": "0x0000000000000000000001010000000000000000000000000000000000000000", - "previousValue": "0x0000000000000000000001010000000000000000000000000000000000000000", - "reverted": false, - "slot": "0x0000000000000000000000000000000000000000000000000000000000000000" - }, - { - "account": "0x20A42a5a785622c6Ba2576B2D6e924aA82BFA11D", - "isWrite": false, - "newValue": "0x0000000000000000000000000000000000000000000000000000000000000000", - "previousValue": "0x0000000000000000000000000000000000000000000000000000000000000000", - "reverted": false, - "slot": "0x00000000000000000000000000000000000000000000000000000000000000cc" - }, - { - "account": "0x20A42a5a785622c6Ba2576B2D6e924aA82BFA11D", - "isWrite": false, - "newValue": "0x0000000000000000000000000000000000000000000000000000000000000000", - "previousValue": "0x0000000000000000000000000000000000000000000000000000000000000000", - "reverted": false, - "slot": "0x00000000000000000000000000000000000000000000000000000000000000cc" - }, - { - "account": "0x20A42a5a785622c6Ba2576B2D6e924aA82BFA11D", - "isWrite": true, - "newValue": "0x000000000000000000000000000000000000000000000000000000000000dead", - "previousValue": "0x0000000000000000000000000000000000000000000000000000000000000000", - "reverted": false, - "slot": "0x00000000000000000000000000000000000000000000000000000000000000cc" - }, - { - "account": "0x20A42a5a785622c6Ba2576B2D6e924aA82BFA11D", - "isWrite": false, - "newValue": "0x0000000000000000000000000000000000000000000000000000000000000000", - "previousValue": "0x0000000000000000000000000000000000000000000000000000000000000000", - "reverted": false, - "slot": "0x00000000000000000000000000000000000000000000000000000000000000cf" - }, - { - "account": "0x20A42a5a785622c6Ba2576B2D6e924aA82BFA11D", - "isWrite": true, - "newValue": "0x0000000000000000000000004200000000000000000000000000000000000007", - "previousValue": "0x0000000000000000000000000000000000000000000000000000000000000000", - "reverted": false, - "slot": "0x00000000000000000000000000000000000000000000000000000000000000cf" - }, - { - "account": "0x20A42a5a785622c6Ba2576B2D6e924aA82BFA11D", - "isWrite": false, - "newValue": "0x0000000000000000000001010000000000000000000000000000000000000000", - "previousValue": "0x0000000000000000000001010000000000000000000000000000000000000000", - "reverted": false, - "slot": "0x0000000000000000000000000000000000000000000000000000000000000000" - }, - { - "account": "0x20A42a5a785622c6Ba2576B2D6e924aA82BFA11D", - "isWrite": true, - "newValue": "0x0000000000000000000000010000000000000000000000000000000000000000", - "previousValue": "0x0000000000000000000001010000000000000000000000000000000000000000", - "reverted": false, - "slot": "0x0000000000000000000000000000000000000000000000000000000000000000" - } - ], - "value": 0 - }, - { - "accessor": "0x1804c8AB1F12E6bbf3894d4083f33e07309d1f38", - "account": "0x20A42a5a785622c6Ba2576B2D6e924aA82BFA11D", - "chainInfo": { - "chainId": 31337, - "forkId": 0 - }, - "data": "0x54fd4d50", - "deployedCode": "0x", - "initialized": true, - "kind": "StaticCall", - "newBalance": 0, - "oldBalance": 0, - "reverted": false, - "storageAccesses": [ - { - "account": "0x20A42a5a785622c6Ba2576B2D6e924aA82BFA11D", - "isWrite": false, - "newValue": "0x000000000000000000000000bb2180ebd78ce97360503434ed37fcf4a1df61c3", - "previousValue": "0x000000000000000000000000bb2180ebd78ce97360503434ed37fcf4a1df61c3", - "reverted": false, - "slot": "0x540cf4e2f45b866b44f44bde51e109474016dc46a0670fbe1684ad8eaf90fdc3" - }, - { - "account": "0x20A42a5a785622c6Ba2576B2D6e924aA82BFA11D", - "isWrite": false, - "newValue": "0x4f564d5f4c3143726f7373446f6d61696e4d657373656e676572000000000034", - "previousValue": "0x4f564d5f4c3143726f7373446f6d61696e4d657373656e676572000000000034", - "reverted": false, - "slot": "0x4505be7acf20898edfef2b5289635349881ad9bf4b57316a74e81e2abec2be52" - } - ], - "value": 0 - }, - { - "accessor": "0x20A42a5a785622c6Ba2576B2D6e924aA82BFA11D", - "account": "0xBb2180ebd78ce97360503434eD37fcf4a1Df61c3", - "chainInfo": { - "chainId": 31337, - "forkId": 0 - }, - "data": "0xbf40fac10000000000000000000000000000000000000000000000000000000000000020000000000000000000000000000000000000000000000000000000000000001a4f564d5f4c3143726f7373446f6d61696e4d657373656e676572000000000000", - "deployedCode": "0x", - "initialized": true, - "kind": "StaticCall", - "newBalance": 0, - "oldBalance": 0, - "reverted": false, - "storageAccesses": [ - { - "account": "0xBb2180ebd78ce97360503434eD37fcf4a1Df61c3", - "isWrite": false, - "newValue": "0x000000000000000000000000f3e6cbcbf1ae12fc13bc8b14fa8a67cbe147fd99", - "previousValue": "0x000000000000000000000000f3e6cbcbf1ae12fc13bc8b14fa8a67cbe147fd99", - "reverted": false, - "slot": "0x515216935740e67dfdda5cf8e248ea32b3277787818ab59153061ac875c9385e" - } - ], - "value": 0 - }, - { - "accessor": "0x1804c8AB1F12E6bbf3894d4083f33e07309d1f38", - "account": "0xf3E6CBcbF1AE12Fc13Bc8B14FA8A67CbE147fD99", - "chainInfo": { - "chainId": 31337, - "forkId": 0 - }, - "data": "0x54fd4d50", - "deployedCode": "0x", - "initialized": true, - "kind": "DelegateCall", - "newBalance": 0, - "oldBalance": 0, - "reverted": false, - "storageAccesses": [], - "value": 0 - }, - { - "accessor": "0x1804c8AB1F12E6bbf3894d4083f33e07309d1f38", - "account": "0x20A42a5a785622c6Ba2576B2D6e924aA82BFA11D", - "chainInfo": { - "chainId": 31337, - "forkId": 0 - }, - "data": "0x9fce812c", - "deployedCode": "0x", - "initialized": true, - "kind": "StaticCall", - "newBalance": 0, - "oldBalance": 0, - "reverted": false, - "storageAccesses": [ - { - "account": "0x20A42a5a785622c6Ba2576B2D6e924aA82BFA11D", - "isWrite": false, - "newValue": "0x000000000000000000000000bb2180ebd78ce97360503434ed37fcf4a1df61c3", - "previousValue": "0x000000000000000000000000bb2180ebd78ce97360503434ed37fcf4a1df61c3", - "reverted": false, - "slot": "0x540cf4e2f45b866b44f44bde51e109474016dc46a0670fbe1684ad8eaf90fdc3" - }, - { - "account": "0x20A42a5a785622c6Ba2576B2D6e924aA82BFA11D", - "isWrite": false, - "newValue": "0x4f564d5f4c3143726f7373446f6d61696e4d657373656e676572000000000034", - "previousValue": "0x4f564d5f4c3143726f7373446f6d61696e4d657373656e676572000000000034", - "reverted": false, - "slot": "0x4505be7acf20898edfef2b5289635349881ad9bf4b57316a74e81e2abec2be52" - } - ], - "value": 0 - }, - { - "accessor": "0x20A42a5a785622c6Ba2576B2D6e924aA82BFA11D", - "account": "0xBb2180ebd78ce97360503434eD37fcf4a1Df61c3", - "chainInfo": { - "chainId": 31337, - "forkId": 0 - }, - "data": "0xbf40fac10000000000000000000000000000000000000000000000000000000000000020000000000000000000000000000000000000000000000000000000000000001a4f564d5f4c3143726f7373446f6d61696e4d657373656e676572000000000000", - "deployedCode": "0x", - "initialized": true, - "kind": "StaticCall", - "newBalance": 0, - "oldBalance": 0, - "reverted": false, - "storageAccesses": [ - { - "account": "0xBb2180ebd78ce97360503434eD37fcf4a1Df61c3", - "isWrite": false, - "newValue": "0x000000000000000000000000f3e6cbcbf1ae12fc13bc8b14fa8a67cbe147fd99", - "previousValue": "0x000000000000000000000000f3e6cbcbf1ae12fc13bc8b14fa8a67cbe147fd99", - "reverted": false, - "slot": "0x515216935740e67dfdda5cf8e248ea32b3277787818ab59153061ac875c9385e" - } - ], - "value": 0 - }, - { - "accessor": "0x1804c8AB1F12E6bbf3894d4083f33e07309d1f38", - "account": "0xf3E6CBcbF1AE12Fc13Bc8B14FA8A67CbE147fD99", - "chainInfo": { - "chainId": 31337, - "forkId": 0 - }, - "data": "0x9fce812c", - "deployedCode": "0x", - "initialized": true, - "kind": "DelegateCall", - "newBalance": 0, - "oldBalance": 0, - "reverted": false, - "storageAccesses": [ - { - "account": "0x20A42a5a785622c6Ba2576B2D6e924aA82BFA11D", - "isWrite": false, - "newValue": "0x0000000000000000000000004200000000000000000000000000000000000007", - "previousValue": "0x0000000000000000000000004200000000000000000000000000000000000007", - "reverted": false, - "slot": "0x00000000000000000000000000000000000000000000000000000000000000cf" - } - ], - "value": 0 - }, - { - "accessor": "0x1804c8AB1F12E6bbf3894d4083f33e07309d1f38", - "account": "0x20A42a5a785622c6Ba2576B2D6e924aA82BFA11D", - "chainInfo": { - "chainId": 31337, - "forkId": 0 - }, - "data": "0xdb505d80", - "deployedCode": "0x", - "initialized": true, - "kind": "StaticCall", - "newBalance": 0, - "oldBalance": 0, - "reverted": false, - "storageAccesses": [ - { - "account": "0x20A42a5a785622c6Ba2576B2D6e924aA82BFA11D", - "isWrite": false, - "newValue": "0x000000000000000000000000bb2180ebd78ce97360503434ed37fcf4a1df61c3", - "previousValue": "0x000000000000000000000000bb2180ebd78ce97360503434ed37fcf4a1df61c3", - "reverted": false, - "slot": "0x540cf4e2f45b866b44f44bde51e109474016dc46a0670fbe1684ad8eaf90fdc3" - }, - { - "account": "0x20A42a5a785622c6Ba2576B2D6e924aA82BFA11D", - "isWrite": false, - "newValue": "0x4f564d5f4c3143726f7373446f6d61696e4d657373656e676572000000000034", - "previousValue": "0x4f564d5f4c3143726f7373446f6d61696e4d657373656e676572000000000034", - "reverted": false, - "slot": "0x4505be7acf20898edfef2b5289635349881ad9bf4b57316a74e81e2abec2be52" - } - ], - "value": 0 - }, - { - "accessor": "0x20A42a5a785622c6Ba2576B2D6e924aA82BFA11D", - "account": "0xBb2180ebd78ce97360503434eD37fcf4a1Df61c3", - "chainInfo": { - "chainId": 31337, - "forkId": 0 - }, - "data": "0xbf40fac10000000000000000000000000000000000000000000000000000000000000020000000000000000000000000000000000000000000000000000000000000001a4f564d5f4c3143726f7373446f6d61696e4d657373656e676572000000000000", - "deployedCode": "0x", - "initialized": true, - "kind": "StaticCall", - "newBalance": 0, - "oldBalance": 0, - "reverted": false, - "storageAccesses": [ - { - "account": "0xBb2180ebd78ce97360503434eD37fcf4a1Df61c3", - "isWrite": false, - "newValue": "0x000000000000000000000000f3e6cbcbf1ae12fc13bc8b14fa8a67cbe147fd99", - "previousValue": "0x000000000000000000000000f3e6cbcbf1ae12fc13bc8b14fa8a67cbe147fd99", - "reverted": false, - "slot": "0x515216935740e67dfdda5cf8e248ea32b3277787818ab59153061ac875c9385e" - } - ], - "value": 0 - }, - { - "accessor": "0x1804c8AB1F12E6bbf3894d4083f33e07309d1f38", - "account": "0xf3E6CBcbF1AE12Fc13Bc8B14FA8A67CbE147fD99", - "chainInfo": { - "chainId": 31337, - "forkId": 0 - }, - "data": "0xdb505d80", - "deployedCode": "0x", - "initialized": true, - "kind": "DelegateCall", - "newBalance": 0, - "oldBalance": 0, - "reverted": false, - "storageAccesses": [ - { - "account": "0x20A42a5a785622c6Ba2576B2D6e924aA82BFA11D", - "isWrite": false, - "newValue": "0x0000000000000000000000004200000000000000000000000000000000000007", - "previousValue": "0x0000000000000000000000004200000000000000000000000000000000000007", - "reverted": false, - "slot": "0x00000000000000000000000000000000000000000000000000000000000000cf" - } - ], - "value": 0 - }, - { - "accessor": "0x1804c8AB1F12E6bbf3894d4083f33e07309d1f38", - "account": "0x20A42a5a785622c6Ba2576B2D6e924aA82BFA11D", - "chainInfo": { - "chainId": 31337, - "forkId": 0 - }, - "data": "0x0ff754ea", - "deployedCode": "0x", - "initialized": true, - "kind": "StaticCall", - "newBalance": 0, - "oldBalance": 0, - "reverted": false, - "storageAccesses": [ - { - "account": "0x20A42a5a785622c6Ba2576B2D6e924aA82BFA11D", - "isWrite": false, - "newValue": "0x000000000000000000000000bb2180ebd78ce97360503434ed37fcf4a1df61c3", - "previousValue": "0x000000000000000000000000bb2180ebd78ce97360503434ed37fcf4a1df61c3", - "reverted": false, - "slot": "0x540cf4e2f45b866b44f44bde51e109474016dc46a0670fbe1684ad8eaf90fdc3" - }, - { - "account": "0x20A42a5a785622c6Ba2576B2D6e924aA82BFA11D", - "isWrite": false, - "newValue": "0x4f564d5f4c3143726f7373446f6d61696e4d657373656e676572000000000034", - "previousValue": "0x4f564d5f4c3143726f7373446f6d61696e4d657373656e676572000000000034", - "reverted": false, - "slot": "0x4505be7acf20898edfef2b5289635349881ad9bf4b57316a74e81e2abec2be52" - } - ], - "value": 0 - }, - { - "accessor": "0x20A42a5a785622c6Ba2576B2D6e924aA82BFA11D", - "account": "0xBb2180ebd78ce97360503434eD37fcf4a1Df61c3", - "chainInfo": { - "chainId": 31337, - "forkId": 0 - }, - "data": "0xbf40fac10000000000000000000000000000000000000000000000000000000000000020000000000000000000000000000000000000000000000000000000000000001a4f564d5f4c3143726f7373446f6d61696e4d657373656e676572000000000000", - "deployedCode": "0x", - "initialized": true, - "kind": "StaticCall", - "newBalance": 0, - "oldBalance": 0, - "reverted": false, - "storageAccesses": [ - { - "account": "0xBb2180ebd78ce97360503434eD37fcf4a1Df61c3", - "isWrite": false, - "newValue": "0x000000000000000000000000f3e6cbcbf1ae12fc13bc8b14fa8a67cbe147fd99", - "previousValue": "0x000000000000000000000000f3e6cbcbf1ae12fc13bc8b14fa8a67cbe147fd99", - "reverted": false, - "slot": "0x515216935740e67dfdda5cf8e248ea32b3277787818ab59153061ac875c9385e" - } - ], - "value": 0 - }, - { - "accessor": "0x1804c8AB1F12E6bbf3894d4083f33e07309d1f38", - "account": "0xf3E6CBcbF1AE12Fc13Bc8B14FA8A67CbE147fD99", - "chainInfo": { - "chainId": 31337, - "forkId": 0 - }, - "data": "0x0ff754ea", - "deployedCode": "0x", - "initialized": true, - "kind": "DelegateCall", - "newBalance": 0, - "oldBalance": 0, - "reverted": false, - "storageAccesses": [ - { - "account": "0x20A42a5a785622c6Ba2576B2D6e924aA82BFA11D", - "isWrite": false, - "newValue": "0x000000000000000000000000978e3286eb805934215a88694d80b09aded68d90", - "previousValue": "0x000000000000000000000000978e3286eb805934215a88694d80b09aded68d90", - "reverted": false, - "slot": "0x00000000000000000000000000000000000000000000000000000000000000fc" - } - ], - "value": 0 - }, - { - "accessor": "0x1804c8AB1F12E6bbf3894d4083f33e07309d1f38", - "account": "0x20A42a5a785622c6Ba2576B2D6e924aA82BFA11D", - "chainInfo": { - "chainId": 31337, - "forkId": 0 - }, - "data": "0x6425666b", - "deployedCode": "0x", - "initialized": true, - "kind": "StaticCall", - "newBalance": 0, - "oldBalance": 0, - "reverted": false, - "storageAccesses": [ - { - "account": "0x20A42a5a785622c6Ba2576B2D6e924aA82BFA11D", - "isWrite": false, - "newValue": "0x000000000000000000000000bb2180ebd78ce97360503434ed37fcf4a1df61c3", - "previousValue": "0x000000000000000000000000bb2180ebd78ce97360503434ed37fcf4a1df61c3", - "reverted": false, - "slot": "0x540cf4e2f45b866b44f44bde51e109474016dc46a0670fbe1684ad8eaf90fdc3" - }, - { - "account": "0x20A42a5a785622c6Ba2576B2D6e924aA82BFA11D", - "isWrite": false, - "newValue": "0x4f564d5f4c3143726f7373446f6d61696e4d657373656e676572000000000034", - "previousValue": "0x4f564d5f4c3143726f7373446f6d61696e4d657373656e676572000000000034", - "reverted": false, - "slot": "0x4505be7acf20898edfef2b5289635349881ad9bf4b57316a74e81e2abec2be52" - } - ], - "value": 0 - }, - { - "accessor": "0x20A42a5a785622c6Ba2576B2D6e924aA82BFA11D", - "account": "0xBb2180ebd78ce97360503434eD37fcf4a1Df61c3", - "chainInfo": { - "chainId": 31337, - "forkId": 0 - }, - "data": "0xbf40fac10000000000000000000000000000000000000000000000000000000000000020000000000000000000000000000000000000000000000000000000000000001a4f564d5f4c3143726f7373446f6d61696e4d657373656e676572000000000000", - "deployedCode": "0x", - "initialized": true, - "kind": "StaticCall", - "newBalance": 0, - "oldBalance": 0, - "reverted": false, - "storageAccesses": [ - { - "account": "0xBb2180ebd78ce97360503434eD37fcf4a1Df61c3", - "isWrite": false, - "newValue": "0x000000000000000000000000f3e6cbcbf1ae12fc13bc8b14fa8a67cbe147fd99", - "previousValue": "0x000000000000000000000000f3e6cbcbf1ae12fc13bc8b14fa8a67cbe147fd99", - "reverted": false, - "slot": "0x515216935740e67dfdda5cf8e248ea32b3277787818ab59153061ac875c9385e" - } - ], - "value": 0 - }, - { - "accessor": "0x1804c8AB1F12E6bbf3894d4083f33e07309d1f38", - "account": "0xf3E6CBcbF1AE12Fc13Bc8B14FA8A67CbE147fD99", - "chainInfo": { - "chainId": 31337, - "forkId": 0 - }, - "data": "0x6425666b", - "deployedCode": "0x", - "initialized": true, - "kind": "DelegateCall", - "newBalance": 0, - "oldBalance": 0, - "reverted": false, - "storageAccesses": [ - { - "account": "0x20A42a5a785622c6Ba2576B2D6e924aA82BFA11D", - "isWrite": false, - "newValue": "0x000000000000000000000000978e3286eb805934215a88694d80b09aded68d90", - "previousValue": "0x000000000000000000000000978e3286eb805934215a88694d80b09aded68d90", - "reverted": false, - "slot": "0x00000000000000000000000000000000000000000000000000000000000000fc" - } - ], - "value": 0 - }, - { - "accessor": "0x1804c8AB1F12E6bbf3894d4083f33e07309d1f38", - "account": "0x20A42a5a785622c6Ba2576B2D6e924aA82BFA11D", - "chainInfo": { - "chainId": 31337, - "forkId": 0 - }, - "data": "0x35e80ab3", - "deployedCode": "0x", - "initialized": true, - "kind": "StaticCall", - "newBalance": 0, - "oldBalance": 0, - "reverted": false, - "storageAccesses": [ - { - "account": "0x20A42a5a785622c6Ba2576B2D6e924aA82BFA11D", - "isWrite": false, - "newValue": "0x000000000000000000000000bb2180ebd78ce97360503434ed37fcf4a1df61c3", - "previousValue": "0x000000000000000000000000bb2180ebd78ce97360503434ed37fcf4a1df61c3", - "reverted": false, - "slot": "0x540cf4e2f45b866b44f44bde51e109474016dc46a0670fbe1684ad8eaf90fdc3" - }, - { - "account": "0x20A42a5a785622c6Ba2576B2D6e924aA82BFA11D", - "isWrite": false, - "newValue": "0x4f564d5f4c3143726f7373446f6d61696e4d657373656e676572000000000034", - "previousValue": "0x4f564d5f4c3143726f7373446f6d61696e4d657373656e676572000000000034", - "reverted": false, - "slot": "0x4505be7acf20898edfef2b5289635349881ad9bf4b57316a74e81e2abec2be52" - } - ], - "value": 0 - }, - { - "accessor": "0x20A42a5a785622c6Ba2576B2D6e924aA82BFA11D", - "account": "0xBb2180ebd78ce97360503434eD37fcf4a1Df61c3", - "chainInfo": { - "chainId": 31337, - "forkId": 0 - }, - "data": "0xbf40fac10000000000000000000000000000000000000000000000000000000000000020000000000000000000000000000000000000000000000000000000000000001a4f564d5f4c3143726f7373446f6d61696e4d657373656e676572000000000000", - "deployedCode": "0x", - "initialized": true, - "kind": "StaticCall", - "newBalance": 0, - "oldBalance": 0, - "reverted": false, - "storageAccesses": [ - { - "account": "0xBb2180ebd78ce97360503434eD37fcf4a1Df61c3", - "isWrite": false, - "newValue": "0x000000000000000000000000f3e6cbcbf1ae12fc13bc8b14fa8a67cbe147fd99", - "previousValue": "0x000000000000000000000000f3e6cbcbf1ae12fc13bc8b14fa8a67cbe147fd99", - "reverted": false, - "slot": "0x515216935740e67dfdda5cf8e248ea32b3277787818ab59153061ac875c9385e" - } - ], - "value": 0 - }, - { - "accessor": "0x1804c8AB1F12E6bbf3894d4083f33e07309d1f38", - "account": "0xf3E6CBcbF1AE12Fc13Bc8B14FA8A67CbE147fD99", - "chainInfo": { - "chainId": 31337, - "forkId": 0 - }, - "data": "0x35e80ab3", - "deployedCode": "0x", - "initialized": true, - "kind": "DelegateCall", - "newBalance": 0, - "oldBalance": 0, - "reverted": false, - "storageAccesses": [ - { - "account": "0x20A42a5a785622c6Ba2576B2D6e924aA82BFA11D", - "isWrite": false, - "newValue": "0x000000000000000000000000deb1e9a6be7baf84208bb6e10ac9f9bbe1d70809", - "previousValue": "0x000000000000000000000000deb1e9a6be7baf84208bb6e10ac9f9bbe1d70809", - "reverted": false, - "slot": "0x00000000000000000000000000000000000000000000000000000000000000fb" - } - ], - "value": 0 - }, - { - "accessor": "0x7FA9385bE102ac3EAc297483Dd6233D62b3e1496", - "account": "0x7109709ECfa91a80626fF3989D68f67F5b1DD12D", - "chainInfo": { - "chainId": 31337, - "forkId": 0 - }, - "data": "0x", - "deployedCode": "0x", - "initialized": true, - "kind": "Resume", - "newBalance": 0, - "oldBalance": 0, - "reverted": false, - "storageAccesses": [], - "value": 0 - }, - { - "accessor": "0x7FA9385bE102ac3EAc297483Dd6233D62b3e1496", - "account": "0x7109709ECfa91a80626fF3989D68f67F5b1DD12D", - "chainInfo": { - "chainId": 31337, - "forkId": 0 - }, - "data": "0x", - "deployedCode": "0x", - "initialized": true, - "kind": "Resume", - "newBalance": 0, - "oldBalance": 0, - "reverted": false, - "storageAccesses": [], - "value": 0 - }, - { - "accessor": "0x1804c8AB1F12E6bbf3894d4083f33e07309d1f38", - "account": "0x7d039be7F9b5190147621b02e82B250e1D748e02", - "chainInfo": { - "chainId": 31337, - "forkId": 0 - }, - "data": "0x6a761202000000000000000000000000db8cff278adccf9e9b5da745b44e754fc4ee3c7600000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000140000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000028000000000000000000000000000000000000000000000000000000000000001049623609d000000000000000000000000978e3286eb805934215a88694d80b09aded68d90000000000000000000000000a45db41d98295c8e260dc2000d2a119a11174c8200000000000000000000000000000000000000000000000000000000000000600000000000000000000000000000000000000000000000000000000000000064c0c53b8b0000000000000000000000008b71b41d4dbeb2b6821d44692d3facaaf77480bb0000000000000000000000001c23a6d89f95ef3148bcda8e242cab145bf9c0e4000000000000000000000000deb1e9a6be7baf84208bb6e10ac9f9bbe1d70809000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000410000000000000000000000001804c8ab1f12e6bbf3894d4083f33e07309d1f3800000000000000000000000000000000000000000000000000000000000000000100000000000000000000000000000000000000000000000000000000000000", - "deployedCode": "0x", - "initialized": true, - "kind": "Call", - "newBalance": 0, - "oldBalance": 0, - "reverted": false, - "storageAccesses": [ - { - "account": "0x7d039be7F9b5190147621b02e82B250e1D748e02", - "isWrite": false, - "newValue": "0x00000000000000000000000090193c961a926261b756d1e5bb255e67ff9498a1", - "previousValue": "0x00000000000000000000000090193c961a926261b756d1e5bb255e67ff9498a1", - "reverted": false, - "slot": "0x0000000000000000000000000000000000000000000000000000000000000000" - } - ], - "value": 0 - }, - { - "accessor": "0x1804c8AB1F12E6bbf3894d4083f33e07309d1f38", - "account": "0x90193C961A926261B756D1E5bb255e67ff9498A1", - "chainInfo": { - "chainId": 31337, - "forkId": 0 - }, - "data": "0x6a761202000000000000000000000000db8cff278adccf9e9b5da745b44e754fc4ee3c7600000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000140000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000028000000000000000000000000000000000000000000000000000000000000001049623609d000000000000000000000000978e3286eb805934215a88694d80b09aded68d90000000000000000000000000a45db41d98295c8e260dc2000d2a119a11174c8200000000000000000000000000000000000000000000000000000000000000600000000000000000000000000000000000000000000000000000000000000064c0c53b8b0000000000000000000000008b71b41d4dbeb2b6821d44692d3facaaf77480bb0000000000000000000000001c23a6d89f95ef3148bcda8e242cab145bf9c0e4000000000000000000000000deb1e9a6be7baf84208bb6e10ac9f9bbe1d70809000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000410000000000000000000000001804c8ab1f12e6bbf3894d4083f33e07309d1f3800000000000000000000000000000000000000000000000000000000000000000100000000000000000000000000000000000000000000000000000000000000", - "deployedCode": "0x", - "initialized": true, - "kind": "DelegateCall", - "newBalance": 0, - "oldBalance": 0, - "reverted": false, - "storageAccesses": [ - { - "account": "0x7d039be7F9b5190147621b02e82B250e1D748e02", - "isWrite": false, - "newValue": "0x0000000000000000000000000000000000000000000000000000000000000009", - "previousValue": "0x0000000000000000000000000000000000000000000000000000000000000009", - "reverted": false, - "slot": "0x0000000000000000000000000000000000000000000000000000000000000005" - }, - { - "account": "0x7d039be7F9b5190147621b02e82B250e1D748e02", - "isWrite": false, - "newValue": "0x0000000000000000000000000000000000000000000000000000000000000009", - "previousValue": "0x0000000000000000000000000000000000000000000000000000000000000009", - "reverted": false, - "slot": "0x0000000000000000000000000000000000000000000000000000000000000005" - }, - { - "account": "0x7d039be7F9b5190147621b02e82B250e1D748e02", - "isWrite": true, - "newValue": "0x000000000000000000000000000000000000000000000000000000000000000a", - "previousValue": "0x0000000000000000000000000000000000000000000000000000000000000009", - "reverted": false, - "slot": "0x0000000000000000000000000000000000000000000000000000000000000005" - }, - { - "account": "0x7d039be7F9b5190147621b02e82B250e1D748e02", - "isWrite": false, - "newValue": "0x0000000000000000000000000000000000000000000000000000000000000001", - "previousValue": "0x0000000000000000000000000000000000000000000000000000000000000001", - "reverted": false, - "slot": "0x0000000000000000000000000000000000000000000000000000000000000004" - }, - { - "account": "0x7d039be7F9b5190147621b02e82B250e1D748e02", - "isWrite": false, - "newValue": "0x0000000000000000000000000000000000000000000000000000000000000001", - "previousValue": "0x0000000000000000000000000000000000000000000000000000000000000001", - "reverted": false, - "slot": "0xd1b0d319c6526317dce66989b393dcfb4435c9a65e399a088b63bbf65d7aee32" - }, - { - "account": "0x7d039be7F9b5190147621b02e82B250e1D748e02", - "isWrite": false, - "newValue": "0x0000000000000000000000000000000000000000000000000000000000000000", - "previousValue": "0x0000000000000000000000000000000000000000000000000000000000000000", - "reverted": false, - "slot": "0x4a204f620c8c5ccdca3fd54d003badd85ba500436a431f0cbda4f558c93c34c8" - } - ], - "value": 0 - }, - { - "accessor": "0x7d039be7F9b5190147621b02e82B250e1D748e02", - "account": "0xDB8cFf278adCCF9E9b5da745B44E754fC4EE3C76", - "chainInfo": { - "chainId": 31337, - "forkId": 0 - }, - "data": "0x9623609d000000000000000000000000978e3286eb805934215a88694d80b09aded68d90000000000000000000000000a45db41d98295c8e260dc2000d2a119a11174c8200000000000000000000000000000000000000000000000000000000000000600000000000000000000000000000000000000000000000000000000000000064c0c53b8b0000000000000000000000008b71b41d4dbeb2b6821d44692d3facaaf77480bb0000000000000000000000001c23a6d89f95ef3148bcda8e242cab145bf9c0e4000000000000000000000000deb1e9a6be7baf84208bb6e10ac9f9bbe1d7080900000000000000000000000000000000000000000000000000000000", - "deployedCode": "0x", - "initialized": true, - "kind": "Call", - "newBalance": 0, - "oldBalance": 0, - "reverted": false, - "storageAccesses": [ - { - "account": "0xDB8cFf278adCCF9E9b5da745B44E754fC4EE3C76", - "isWrite": false, - "newValue": "0x0000000000000000000000007d039be7f9b5190147621b02e82b250e1d748e02", - "previousValue": "0x0000000000000000000000007d039be7f9b5190147621b02e82b250e1d748e02", - "reverted": false, - "slot": "0x0000000000000000000000000000000000000000000000000000000000000000" - }, - { - "account": "0xDB8cFf278adCCF9E9b5da745B44E754fC4EE3C76", - "isWrite": false, - "newValue": "0x0000000000000000000000000000000000000000000000000000000000000000", - "previousValue": "0x0000000000000000000000000000000000000000000000000000000000000000", - "reverted": false, - "slot": "0x9302c2c5f397028777ab180924fb28ceaf3af9b6a91b43410c4c0afe36476877" - } - ], - "value": 0 - }, - { - "accessor": "0xDB8cFf278adCCF9E9b5da745B44E754fC4EE3C76", - "account": "0x978e3286EB805934215a88694d80b09aDed68D90", - "chainInfo": { - "chainId": 31337, - "forkId": 0 - }, - "data": "0x4f1ef286000000000000000000000000a45db41d98295c8e260dc2000d2a119a11174c8200000000000000000000000000000000000000000000000000000000000000400000000000000000000000000000000000000000000000000000000000000064c0c53b8b0000000000000000000000008b71b41d4dbeb2b6821d44692d3facaaf77480bb0000000000000000000000001c23a6d89f95ef3148bcda8e242cab145bf9c0e4000000000000000000000000deb1e9a6be7baf84208bb6e10ac9f9bbe1d7080900000000000000000000000000000000000000000000000000000000", - "deployedCode": "0x", - "initialized": true, - "kind": "Call", - "newBalance": 0, - "oldBalance": 0, - "reverted": false, - "storageAccesses": [ - { - "account": "0x978e3286EB805934215a88694d80b09aDed68D90", - "isWrite": false, - "newValue": "0x000000000000000000000000db8cff278adccf9e9b5da745b44e754fc4ee3c76", - "previousValue": "0x000000000000000000000000db8cff278adccf9e9b5da745b44e754fc4ee3c76", - "reverted": false, - "slot": "0xb53127684a568b3173ae13b9f8a6016e243e63b6e8ee1178d6a717850b5d6103" - }, - { - "account": "0x978e3286EB805934215a88694d80b09aDed68D90", - "isWrite": true, - "newValue": "0x000000000000000000000000a45db41d98295c8e260dc2000d2a119a11174c82", - "previousValue": "0x0000000000000000000000000000000000000000000000000000000000000000", - "reverted": false, - "slot": "0x360894a13ba1a3210667c828492db98dca3e2076cc3735a920a3ca505d382bbc" - } - ], - "value": 0 - }, - { - "accessor": "0xDB8cFf278adCCF9E9b5da745B44E754fC4EE3C76", - "account": "0xA45db41D98295c8E260dc2000d2a119A11174C82", - "chainInfo": { - "chainId": 31337, - "forkId": 0 - }, - "data": "0xc0c53b8b0000000000000000000000008b71b41d4dbeb2b6821d44692d3facaaf77480bb0000000000000000000000001c23a6d89f95ef3148bcda8e242cab145bf9c0e4000000000000000000000000deb1e9a6be7baf84208bb6e10ac9f9bbe1d70809", - "deployedCode": "0x", - "initialized": true, - "kind": "DelegateCall", - "newBalance": 0, - "oldBalance": 0, - "reverted": false, - "storageAccesses": [ - { - "account": "0x978e3286EB805934215a88694d80b09aDed68D90", - "isWrite": false, - "newValue": "0x0000000000000000000000000000000000000000000000000000000000000000", - "previousValue": "0x0000000000000000000000000000000000000000000000000000000000000000", - "reverted": false, - "slot": "0x0000000000000000000000000000000000000000000000000000000000000000" - }, - { - "account": "0x978e3286EB805934215a88694d80b09aDed68D90", - "isWrite": false, - "newValue": "0x0000000000000000000000000000000000000000000000000000000000000000", - "previousValue": "0x0000000000000000000000000000000000000000000000000000000000000000", - "reverted": false, - "slot": "0x0000000000000000000000000000000000000000000000000000000000000000" - }, - { - "account": "0x978e3286EB805934215a88694d80b09aDed68D90", - "isWrite": false, - "newValue": "0x0000000000000000000000000000000000000000000000000000000000000000", - "previousValue": "0x0000000000000000000000000000000000000000000000000000000000000000", - "reverted": false, - "slot": "0x0000000000000000000000000000000000000000000000000000000000000000" - }, - { - "account": "0x978e3286EB805934215a88694d80b09aDed68D90", - "isWrite": true, - "newValue": "0x0000000000000000000000000000000000000000000000000000000000000001", - "previousValue": "0x0000000000000000000000000000000000000000000000000000000000000000", - "reverted": false, - "slot": "0x0000000000000000000000000000000000000000000000000000000000000000" - }, - { - "account": "0x978e3286EB805934215a88694d80b09aDed68D90", - "isWrite": false, - "newValue": "0x0000000000000000000000000000000000000000000000000000000000000001", - "previousValue": "0x0000000000000000000000000000000000000000000000000000000000000001", - "reverted": false, - "slot": "0x0000000000000000000000000000000000000000000000000000000000000000" - }, - { - "account": "0x978e3286EB805934215a88694d80b09aDed68D90", - "isWrite": true, - "newValue": "0x0000000000000000000000000000000000000000000000000000000000000101", - "previousValue": "0x0000000000000000000000000000000000000000000000000000000000000001", - "reverted": false, - "slot": "0x0000000000000000000000000000000000000000000000000000000000000000" - }, - { - "account": "0x978e3286EB805934215a88694d80b09aDed68D90", - "isWrite": false, - "newValue": "0x0000000000000000000000000000000000000000000000000000000000000000", - "previousValue": "0x0000000000000000000000000000000000000000000000000000000000000000", - "reverted": false, - "slot": "0x0000000000000000000000000000000000000000000000000000000000000036" - }, - { - "account": "0x978e3286EB805934215a88694d80b09aDed68D90", - "isWrite": true, - "newValue": "0x0000000000000000000000008b71b41d4dbeb2b6821d44692d3facaaf77480bb", - "previousValue": "0x0000000000000000000000000000000000000000000000000000000000000000", - "reverted": false, - "slot": "0x0000000000000000000000000000000000000000000000000000000000000036" - }, - { - "account": "0x978e3286EB805934215a88694d80b09aDed68D90", - "isWrite": false, - "newValue": "0x0000000000000000000000000000000000000000000000000000000000000000", - "previousValue": "0x0000000000000000000000000000000000000000000000000000000000000000", - "reverted": false, - "slot": "0x0000000000000000000000000000000000000000000000000000000000000037" - }, - { - "account": "0x978e3286EB805934215a88694d80b09aDed68D90", - "isWrite": true, - "newValue": "0x0000000000000000000000001c23a6d89f95ef3148bcda8e242cab145bf9c0e4", - "previousValue": "0x0000000000000000000000000000000000000000000000000000000000000000", - "reverted": false, - "slot": "0x0000000000000000000000000000000000000000000000000000000000000037" - }, - { - "account": "0x978e3286EB805934215a88694d80b09aDed68D90", - "isWrite": false, - "newValue": "0x0000000000000000000000000000000000000000000000000000000000000000", - "previousValue": "0x0000000000000000000000000000000000000000000000000000000000000000", - "reverted": false, - "slot": "0x0000000000000000000000000000000000000000000000000000000000000035" - }, - { - "account": "0x978e3286EB805934215a88694d80b09aDed68D90", - "isWrite": true, - "newValue": "0x0000000000000000000000deb1e9a6be7baf84208bb6e10ac9f9bbe1d7080900", - "previousValue": "0x0000000000000000000000000000000000000000000000000000000000000000", - "reverted": false, - "slot": "0x0000000000000000000000000000000000000000000000000000000000000035" - }, - { - "account": "0x978e3286EB805934215a88694d80b09aDed68D90", - "isWrite": false, - "newValue": "0x0000000000000000000000000000000000000000000000000000000000000000", - "previousValue": "0x0000000000000000000000000000000000000000000000000000000000000000", - "reverted": false, - "slot": "0x0000000000000000000000000000000000000000000000000000000000000032" - }, - { - "account": "0x978e3286EB805934215a88694d80b09aDed68D90", - "isWrite": false, - "newValue": "0x0000000000000000000000000000000000000000000000000000000000000000", - "previousValue": "0x0000000000000000000000000000000000000000000000000000000000000000", - "reverted": false, - "slot": "0x0000000000000000000000000000000000000000000000000000000000000032" - }, - { - "account": "0x978e3286EB805934215a88694d80b09aDed68D90", - "isWrite": true, - "newValue": "0x000000000000000000000000000000000000000000000000000000000000dead", - "previousValue": "0x0000000000000000000000000000000000000000000000000000000000000000", - "reverted": false, - "slot": "0x0000000000000000000000000000000000000000000000000000000000000032" - }, - { - "account": "0x978e3286EB805934215a88694d80b09aDed68D90", - "isWrite": false, - "newValue": "0x0000000000000000000000000000000000000000000000000000000000000101", - "previousValue": "0x0000000000000000000000000000000000000000000000000000000000000101", - "reverted": false, - "slot": "0x0000000000000000000000000000000000000000000000000000000000000000" - }, - { - "account": "0x978e3286EB805934215a88694d80b09aDed68D90", - "isWrite": false, - "newValue": "0x0000000000000000000000000000000000000000000000000000000000000000", - "previousValue": "0x0000000000000000000000000000000000000000000000000000000000000000", - "reverted": false, - "slot": "0x0000000000000000000000000000000000000000000000000000000000000001" - }, - { - "account": "0x978e3286EB805934215a88694d80b09aDed68D90", - "isWrite": true, - "newValue": "0x000000000000000100000000000000000000000000000000000000003b9aca00", - "previousValue": "0x0000000000000000000000000000000000000000000000000000000000000000", - "reverted": false, - "slot": "0x0000000000000000000000000000000000000000000000000000000000000001" - }, - { - "account": "0x978e3286EB805934215a88694d80b09aDed68D90", - "isWrite": false, - "newValue": "0x0000000000000000000000000000000000000000000000000000000000000101", - "previousValue": "0x0000000000000000000000000000000000000000000000000000000000000101", - "reverted": false, - "slot": "0x0000000000000000000000000000000000000000000000000000000000000000" - }, - { - "account": "0x978e3286EB805934215a88694d80b09aDed68D90", - "isWrite": true, - "newValue": "0x0000000000000000000000000000000000000000000000000000000000000001", - "previousValue": "0x0000000000000000000000000000000000000000000000000000000000000101", - "reverted": false, - "slot": "0x0000000000000000000000000000000000000000000000000000000000000000" - } - ], - "value": 0 - }, - { - "accessor": "0x1804c8AB1F12E6bbf3894d4083f33e07309d1f38", - "account": "0x978e3286EB805934215a88694d80b09aDed68D90", - "chainInfo": { - "chainId": 31337, - "forkId": 0 - }, - "data": "0x54fd4d50", - "deployedCode": "0x", - "initialized": true, - "kind": "StaticCall", - "newBalance": 0, - "oldBalance": 0, - "reverted": false, - "storageAccesses": [ - { - "account": "0x978e3286EB805934215a88694d80b09aDed68D90", - "isWrite": false, - "newValue": "0x000000000000000000000000a45db41d98295c8e260dc2000d2a119a11174c82", - "previousValue": "0x000000000000000000000000a45db41d98295c8e260dc2000d2a119a11174c82", - "reverted": false, - "slot": "0x360894a13ba1a3210667c828492db98dca3e2076cc3735a920a3ca505d382bbc" - } - ], - "value": 0 - }, - { - "accessor": "0x1804c8AB1F12E6bbf3894d4083f33e07309d1f38", - "account": "0xA45db41D98295c8E260dc2000d2a119A11174C82", - "chainInfo": { - "chainId": 31337, - "forkId": 0 - }, - "data": "0x54fd4d50", - "deployedCode": "0x", - "initialized": true, - "kind": "DelegateCall", - "newBalance": 0, - "oldBalance": 0, - "reverted": false, - "storageAccesses": [], - "value": 0 - }, - { - "accessor": "0x1804c8AB1F12E6bbf3894d4083f33e07309d1f38", - "account": "0x9568d36E291c2C4c34fa5593fcE73715abEf6F9c", - "chainInfo": { - "chainId": 31337, - "forkId": 0 - }, - "data": "0xfa60f9b2", - "deployedCode": "0x", - "initialized": true, - "kind": "StaticCall", - "newBalance": 0, - "oldBalance": 0, - "reverted": false, - "storageAccesses": [ - { - "account": "0x9568d36E291c2C4c34fa5593fcE73715abEf6F9c", - "isWrite": false, - "newValue": "0x0000000000000000000000009965507d1a55bcc2695c58ba16fb37d819b0a4dc", - "previousValue": "0x0000000000000000000000009965507d1a55bcc2695c58ba16fb37d819b0a4dc", - "reverted": false, - "slot": "0x000000000000000000000000000000000000000000000000000000000000000f" - } - ], - "value": 0 - }, - { - "accessor": "0x7FA9385bE102ac3EAc297483Dd6233D62b3e1496", - "account": "0x9965507D1a55bcC2695C58ba16FB37d819B0A4dc", - "chainInfo": { - "chainId": 31337, - "forkId": 0 - }, - "data": "0x", - "deployedCode": "0x", - "initialized": false, - "kind": "Resume", - "newBalance": 0, - "oldBalance": 0, - "reverted": false, - "storageAccesses": [], - "value": 0 - }, - { - "accessor": "0x1804c8AB1F12E6bbf3894d4083f33e07309d1f38", - "account": "0x978e3286EB805934215a88694d80b09aDed68D90", - "chainInfo": { - "chainId": 31337, - "forkId": 0 - }, - "data": "0x9b5f694a", - "deployedCode": "0x", - "initialized": true, - "kind": "StaticCall", - "newBalance": 0, - "oldBalance": 0, - "reverted": false, - "storageAccesses": [ - { - "account": "0x978e3286EB805934215a88694d80b09aDed68D90", - "isWrite": false, - "newValue": "0x000000000000000000000000a45db41d98295c8e260dc2000d2a119a11174c82", - "previousValue": "0x000000000000000000000000a45db41d98295c8e260dc2000d2a119a11174c82", - "reverted": false, - "slot": "0x360894a13ba1a3210667c828492db98dca3e2076cc3735a920a3ca505d382bbc" - } - ], - "value": 0 - }, - { - "accessor": "0x1804c8AB1F12E6bbf3894d4083f33e07309d1f38", - "account": "0xA45db41D98295c8E260dc2000d2a119A11174C82", - "chainInfo": { - "chainId": 31337, - "forkId": 0 - }, - "data": "0x9b5f694a", - "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", - "chainInfo": { - "chainId": 31337, - "forkId": 0 - }, - "data": "0x33d7e2bd", - "deployedCode": "0x", - "initialized": true, - "kind": "StaticCall", - "newBalance": 0, - "oldBalance": 0, - "reverted": false, - "storageAccesses": [ - { - "account": "0x978e3286EB805934215a88694d80b09aDed68D90", - "isWrite": false, - "newValue": "0x000000000000000000000000a45db41d98295c8e260dc2000d2a119a11174c82", - "previousValue": "0x000000000000000000000000a45db41d98295c8e260dc2000d2a119a11174c82", - "reverted": false, - "slot": "0x360894a13ba1a3210667c828492db98dca3e2076cc3735a920a3ca505d382bbc" - } - ], - "value": 0 - }, - { - "accessor": "0x1804c8AB1F12E6bbf3894d4083f33e07309d1f38", - "account": "0xA45db41D98295c8E260dc2000d2a119A11174C82", - "chainInfo": { - "chainId": 31337, - "forkId": 0 - }, - "data": "0x33d7e2bd", - "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", - "chainInfo": { - "chainId": 31337, - "forkId": 0 - }, - "data": "0x452a9320", - "deployedCode": "0x", - "initialized": true, - "kind": "StaticCall", - "newBalance": 0, - "oldBalance": 0, - "reverted": false, - "storageAccesses": [ - { - "account": "0x978e3286EB805934215a88694d80b09aDed68D90", - "isWrite": false, - "newValue": "0x000000000000000000000000a45db41d98295c8e260dc2000d2a119a11174c82", - "previousValue": "0x000000000000000000000000a45db41d98295c8e260dc2000d2a119a11174c82", - "reverted": false, - "slot": "0x360894a13ba1a3210667c828492db98dca3e2076cc3735a920a3ca505d382bbc" - } - ], - "value": 0 - }, - { - "accessor": "0x1804c8AB1F12E6bbf3894d4083f33e07309d1f38", - "account": "0xA45db41D98295c8E260dc2000d2a119A11174C82", - "chainInfo": { - "chainId": 31337, - "forkId": 0 - }, - "data": "0x452a9320", - "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", - "chainInfo": { - "chainId": 31337, - "forkId": 0 - }, - "data": "0x35e80ab3", - "deployedCode": "0x", - "initialized": true, - "kind": "StaticCall", - "newBalance": 0, - "oldBalance": 0, - "reverted": false, - "storageAccesses": [ - { - "account": "0x978e3286EB805934215a88694d80b09aDed68D90", - "isWrite": false, - "newValue": "0x000000000000000000000000a45db41d98295c8e260dc2000d2a119a11174c82", - "previousValue": "0x000000000000000000000000a45db41d98295c8e260dc2000d2a119a11174c82", - "reverted": false, - "slot": "0x360894a13ba1a3210667c828492db98dca3e2076cc3735a920a3ca505d382bbc" - } - ], - "value": 0 - }, - { - "accessor": "0x1804c8AB1F12E6bbf3894d4083f33e07309d1f38", - "account": "0xA45db41D98295c8E260dc2000d2a119A11174C82", - "chainInfo": { - "chainId": 31337, - "forkId": 0 - }, - "data": "0x35e80ab3", - "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": "0x1804c8AB1F12E6bbf3894d4083f33e07309d1f38", - "account": "0xDEb1E9a6Be7Baf84208BB6E10aC9F9bbE1D70809", - "chainInfo": { - "chainId": 31337, - "forkId": 0 - }, - "data": "0x5c975abb", - "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": "0x1804c8AB1F12E6bbf3894d4083f33e07309d1f38", - "account": "0x068E44eB31e111028c41598E4535be7468674D0A", - "chainInfo": { - "chainId": 31337, - "forkId": 0 - }, - "data": "0x5c975abb", - "deployedCode": "0x", - "initialized": true, - "kind": "DelegateCall", - "newBalance": 0, - "oldBalance": 0, - "reverted": false, - "storageAccesses": [ - { - "account": "0xDEb1E9a6Be7Baf84208BB6E10aC9F9bbE1D70809", - "isWrite": false, - "newValue": "0x0000000000000000000000000000000000000000000000000000000000000000", - "previousValue": "0x0000000000000000000000000000000000000000000000000000000000000000", - "reverted": false, - "slot": "0x54176ff9944c4784e5857ec4e5ef560a462c483bf534eda43f91bb01a470b1b6" - } - ], - "value": 0 - }, - { - "accessor": "0x1804c8AB1F12E6bbf3894d4083f33e07309d1f38", - "account": "0x978e3286EB805934215a88694d80b09aDed68D90", - "chainInfo": { - "chainId": 31337, - "forkId": 0 - }, - "data": "0x5c975abb", - "deployedCode": "0x", - "initialized": true, - "kind": "StaticCall", - "newBalance": 0, - "oldBalance": 0, - "reverted": false, - "storageAccesses": [ - { - "account": "0x978e3286EB805934215a88694d80b09aDed68D90", - "isWrite": false, - "newValue": "0x000000000000000000000000a45db41d98295c8e260dc2000d2a119a11174c82", - "previousValue": "0x000000000000000000000000a45db41d98295c8e260dc2000d2a119a11174c82", - "reverted": false, - "slot": "0x360894a13ba1a3210667c828492db98dca3e2076cc3735a920a3ca505d382bbc" - } - ], - "value": 0 - }, - { - "accessor": "0x1804c8AB1F12E6bbf3894d4083f33e07309d1f38", - "account": "0xA45db41D98295c8E260dc2000d2a119A11174C82", - "chainInfo": { - "chainId": 31337, - "forkId": 0 - }, - "data": "0x5c975abb", - "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": "0x5c975abb", - "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": "0x5c975abb", - "deployedCode": "0x", - "initialized": true, - "kind": "DelegateCall", - "newBalance": 0, - "oldBalance": 0, - "reverted": false, - "storageAccesses": [ - { - "account": "0xDEb1E9a6Be7Baf84208BB6E10aC9F9bbE1D70809", - "isWrite": false, - "newValue": "0x0000000000000000000000000000000000000000000000000000000000000000", - "previousValue": "0x0000000000000000000000000000000000000000000000000000000000000000", - "reverted": false, - "slot": "0x54176ff9944c4784e5857ec4e5ef560a462c483bf534eda43f91bb01a470b1b6" - } - ], - "value": 0 - }, - { - "accessor": "0x1804c8AB1F12E6bbf3894d4083f33e07309d1f38", - "account": "0x978e3286EB805934215a88694d80b09aDed68D90", - "chainInfo": { - "chainId": 31337, - "forkId": 0 - }, - "data": "0x9bf62d82", - "deployedCode": "0x", - "initialized": true, - "kind": "StaticCall", - "newBalance": 0, - "oldBalance": 0, - "reverted": false, - "storageAccesses": [ - { - "account": "0x978e3286EB805934215a88694d80b09aDed68D90", - "isWrite": false, - "newValue": "0x000000000000000000000000a45db41d98295c8e260dc2000d2a119a11174c82", - "previousValue": "0x000000000000000000000000a45db41d98295c8e260dc2000d2a119a11174c82", - "reverted": false, - "slot": "0x360894a13ba1a3210667c828492db98dca3e2076cc3735a920a3ca505d382bbc" - } - ], - "value": 0 - }, - { - "accessor": "0x1804c8AB1F12E6bbf3894d4083f33e07309d1f38", - "account": "0xA45db41D98295c8E260dc2000d2a119A11174C82", - "chainInfo": { - "chainId": 31337, - "forkId": 0 - }, - "data": "0x9bf62d82", - "deployedCode": "0x", - "initialized": true, - "kind": "DelegateCall", - "newBalance": 0, - "oldBalance": 0, - "reverted": false, - "storageAccesses": [ - { - "account": "0x978e3286EB805934215a88694d80b09aDed68D90", - "isWrite": false, - "newValue": "0x000000000000000000000000000000000000000000000000000000000000dead", - "previousValue": "0x000000000000000000000000000000000000000000000000000000000000dead", - "reverted": false, - "slot": "0x0000000000000000000000000000000000000000000000000000000000000032" - } - ], - "value": 0 - }, - { - "accessor": "0x7FA9385bE102ac3EAc297483Dd6233D62b3e1496", - "account": "0x7109709ECfa91a80626fF3989D68f67F5b1DD12D", - "chainInfo": { - "chainId": 31337, - "forkId": 0 - }, - "data": "0x", - "deployedCode": "0x", - "initialized": true, - "kind": "Resume", - "newBalance": 0, - "oldBalance": 0, - "reverted": false, - "storageAccesses": [], - "value": 0 - } - ] -} diff --git a/packages/contracts-bedrock/snapshots/storageLayout/AnchorStateRegistry.json b/packages/contracts-bedrock/snapshots/storageLayout/AnchorStateRegistry.json index 5da4030ae426..3900f4552584 100644 --- a/packages/contracts-bedrock/snapshots/storageLayout/AnchorStateRegistry.json +++ b/packages/contracts-bedrock/snapshots/storageLayout/AnchorStateRegistry.json @@ -19,5 +19,12 @@ "offset": 0, "slot": "1", "type": "mapping(GameType => struct OutputRoot)" + }, + { + "bytes": "20", + "label": "superchainConfig", + "offset": 0, + "slot": "2", + "type": "contract ISuperchainConfig" } ] \ No newline at end of file diff --git a/packages/contracts-bedrock/snapshots/storageLayout/BaseFeeVault.json b/packages/contracts-bedrock/snapshots/storageLayout/BaseFeeVault.json index ee2c5925c712..93c5a7ec8a6b 100644 --- a/packages/contracts-bedrock/snapshots/storageLayout/BaseFeeVault.json +++ b/packages/contracts-bedrock/snapshots/storageLayout/BaseFeeVault.json @@ -5,5 +5,12 @@ "offset": 0, "slot": "0", "type": "uint256" + }, + { + "bytes": "1536", + "label": "__gap", + "offset": 0, + "slot": "1", + "type": "uint256[48]" } ] \ No newline at end of file diff --git a/packages/contracts-bedrock/snapshots/storageLayout/CheckBalanceLow.json b/packages/contracts-bedrock/snapshots/storageLayout/CheckBalanceLow.json index 0637a088a01e..4ef856b3dfde 100644 --- a/packages/contracts-bedrock/snapshots/storageLayout/CheckBalanceLow.json +++ b/packages/contracts-bedrock/snapshots/storageLayout/CheckBalanceLow.json @@ -1 +1,9 @@ -[] \ No newline at end of file +[ + { + "bytes": "32", + "label": "name", + "offset": 0, + "slot": "0", + "type": "string" + } +] \ No newline at end of file diff --git a/packages/contracts-bedrock/snapshots/storageLayout/CheckGelatoLow.json b/packages/contracts-bedrock/snapshots/storageLayout/CheckGelatoLow.json index 0637a088a01e..4ef856b3dfde 100644 --- a/packages/contracts-bedrock/snapshots/storageLayout/CheckGelatoLow.json +++ b/packages/contracts-bedrock/snapshots/storageLayout/CheckGelatoLow.json @@ -1 +1,9 @@ -[] \ No newline at end of file +[ + { + "bytes": "32", + "label": "name", + "offset": 0, + "slot": "0", + "type": "string" + } +] \ No newline at end of file diff --git a/packages/contracts-bedrock/snapshots/storageLayout/CheckSecrets.json b/packages/contracts-bedrock/snapshots/storageLayout/CheckSecrets.json index accf9c6d643b..c62f1663e8db 100644 --- a/packages/contracts-bedrock/snapshots/storageLayout/CheckSecrets.json +++ b/packages/contracts-bedrock/snapshots/storageLayout/CheckSecrets.json @@ -1,9 +1,16 @@ [ { "bytes": "32", - "label": "revealedSecrets", + "label": "name", "offset": 0, "slot": "0", + "type": "string" + }, + { + "bytes": "32", + "label": "revealedSecrets", + "offset": 0, + "slot": "1", "type": "mapping(bytes32 => uint256)" } ] \ No newline at end of file diff --git a/packages/contracts-bedrock/snapshots/storageLayout/CheckTrue.json b/packages/contracts-bedrock/snapshots/storageLayout/CheckTrue.json index 0637a088a01e..4ef856b3dfde 100644 --- a/packages/contracts-bedrock/snapshots/storageLayout/CheckTrue.json +++ b/packages/contracts-bedrock/snapshots/storageLayout/CheckTrue.json @@ -1 +1,9 @@ -[] \ No newline at end of file +[ + { + "bytes": "32", + "label": "name", + "offset": 0, + "slot": "0", + "type": "string" + } +] \ No newline at end of file diff --git a/packages/contracts-bedrock/snapshots/storageLayout/DelayedWETH.json b/packages/contracts-bedrock/snapshots/storageLayout/DelayedWETH.json index efc43f45893c..4e8b771cd9bb 100644 --- a/packages/contracts-bedrock/snapshots/storageLayout/DelayedWETH.json +++ b/packages/contracts-bedrock/snapshots/storageLayout/DelayedWETH.json @@ -53,13 +53,13 @@ "label": "withdrawals", "offset": 0, "slot": "103", - "type": "mapping(address => mapping(address => struct IDelayedWETH.WithdrawalRequest))" + "type": "mapping(address => mapping(address => struct DelayedWETH.WithdrawalRequest))" }, { "bytes": "20", "label": "config", "offset": 0, "slot": "104", - "type": "contract SuperchainConfig" + "type": "contract ISuperchainConfig" } ] \ No newline at end of file diff --git a/packages/contracts-bedrock/snapshots/storageLayout/Drippie.json b/packages/contracts-bedrock/snapshots/storageLayout/Drippie.json index 77b669eec61e..fdba84d03121 100644 --- a/packages/contracts-bedrock/snapshots/storageLayout/Drippie.json +++ b/packages/contracts-bedrock/snapshots/storageLayout/Drippie.json @@ -12,5 +12,12 @@ "offset": 0, "slot": "1", "type": "mapping(string => struct Drippie.DripState)" + }, + { + "bytes": "32", + "label": "created", + "offset": 0, + "slot": "2", + "type": "string[]" } ] \ No newline at end of file diff --git a/packages/contracts-bedrock/snapshots/storageLayout/ETHLiquidity.json b/packages/contracts-bedrock/snapshots/storageLayout/ETHLiquidity.json new file mode 100644 index 000000000000..0637a088a01e --- /dev/null +++ b/packages/contracts-bedrock/snapshots/storageLayout/ETHLiquidity.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 f87fa588ed9c..ec02f23d2e6d 100644 --- a/packages/contracts-bedrock/snapshots/storageLayout/FaultDisputeGame.json +++ b/packages/contracts-bedrock/snapshots/storageLayout/FaultDisputeGame.json @@ -46,7 +46,7 @@ "label": "claimData", "offset": 0, "slot": "2", - "type": "struct IFaultDisputeGame.ClaimData[]" + "type": "struct FaultDisputeGame.ClaimData[]" }, { "bytes": "32", @@ -81,7 +81,7 @@ "label": "resolutionCheckpoints", "offset": 0, "slot": "7", - "type": "mapping(uint256 => struct IFaultDisputeGame.ResolutionCheckpoint)" + "type": "mapping(uint256 => struct FaultDisputeGame.ResolutionCheckpoint)" }, { "bytes": "64", diff --git a/packages/contracts-bedrock/snapshots/storageLayout/L1BlockInterop.json b/packages/contracts-bedrock/snapshots/storageLayout/L1BlockInterop.json deleted file mode 100644 index ab3e6fdd4c2e..000000000000 --- a/packages/contracts-bedrock/snapshots/storageLayout/L1BlockInterop.json +++ /dev/null @@ -1,86 +0,0 @@ -[ - { - "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": "32", - "label": "dependencySet", - "offset": 0, - "slot": "8", - "type": "uint256[]" - } -] \ No newline at end of file diff --git a/packages/contracts-bedrock/snapshots/storageLayout/L1BlockIsthmus.json b/packages/contracts-bedrock/snapshots/storageLayout/L1BlockIsthmus.json new file mode 100644 index 000000000000..14ee2ff9609a --- /dev/null +++ b/packages/contracts-bedrock/snapshots/storageLayout/L1BlockIsthmus.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 5c88be3ca9ae..c68ec541baba 100644 --- a/packages/contracts-bedrock/snapshots/storageLayout/L1CrossDomainMessenger.json +++ b/packages/contracts-bedrock/snapshots/storageLayout/L1CrossDomainMessenger.json @@ -130,20 +130,20 @@ "label": "superchainConfig", "offset": 0, "slot": "251", - "type": "contract SuperchainConfig" + "type": "contract ISuperchainConfig" }, { "bytes": "20", "label": "portal", "offset": 0, "slot": "252", - "type": "contract OptimismPortal" + "type": "contract IOptimismPortal" }, { "bytes": "20", "label": "systemConfig", "offset": 0, "slot": "253", - "type": "contract SystemConfig" + "type": "contract ISystemConfig" } ] \ No newline at end of file diff --git a/packages/contracts-bedrock/snapshots/storageLayout/L1ERC721Bridge.json b/packages/contracts-bedrock/snapshots/storageLayout/L1ERC721Bridge.json index c384762b3ba2..2c14ad25904b 100644 --- a/packages/contracts-bedrock/snapshots/storageLayout/L1ERC721Bridge.json +++ b/packages/contracts-bedrock/snapshots/storageLayout/L1ERC721Bridge.json @@ -25,14 +25,14 @@ "label": "messenger", "offset": 0, "slot": "1", - "type": "contract CrossDomainMessenger" + "type": "contract ICrossDomainMessenger" }, { "bytes": "20", "label": "otherBridge", "offset": 0, "slot": "2", - "type": "contract StandardBridge" + "type": "contract ERC721Bridge" }, { "bytes": "1472", @@ -53,6 +53,6 @@ "label": "superchainConfig", "offset": 0, "slot": "50", - "type": "contract SuperchainConfig" + "type": "contract ISuperchainConfig" } ] \ No newline at end of file diff --git a/packages/contracts-bedrock/snapshots/storageLayout/L1FeeVault.json b/packages/contracts-bedrock/snapshots/storageLayout/L1FeeVault.json index ee2c5925c712..93c5a7ec8a6b 100644 --- a/packages/contracts-bedrock/snapshots/storageLayout/L1FeeVault.json +++ b/packages/contracts-bedrock/snapshots/storageLayout/L1FeeVault.json @@ -5,5 +5,12 @@ "offset": 0, "slot": "0", "type": "uint256" + }, + { + "bytes": "1536", + "label": "__gap", + "offset": 0, + "slot": "1", + "type": "uint256[48]" } ] \ 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 1ed5eac5d183..5562a214e4fe 100644 --- a/packages/contracts-bedrock/snapshots/storageLayout/L1StandardBridge.json +++ b/packages/contracts-bedrock/snapshots/storageLayout/L1StandardBridge.json @@ -39,7 +39,7 @@ "label": "messenger", "offset": 0, "slot": "3", - "type": "contract CrossDomainMessenger" + "type": "contract ICrossDomainMessenger" }, { "bytes": "20", @@ -60,13 +60,13 @@ "label": "superchainConfig", "offset": 0, "slot": "50", - "type": "contract SuperchainConfig" + "type": "contract ISuperchainConfig" }, { "bytes": "20", "label": "systemConfig", "offset": 0, "slot": "51", - "type": "contract SystemConfig" + "type": "contract ISystemConfig" } ] \ No newline at end of file diff --git a/packages/contracts-bedrock/snapshots/storageLayout/L2ERC721Bridge.json b/packages/contracts-bedrock/snapshots/storageLayout/L2ERC721Bridge.json index 46d4aea469b7..546b37ba6398 100644 --- a/packages/contracts-bedrock/snapshots/storageLayout/L2ERC721Bridge.json +++ b/packages/contracts-bedrock/snapshots/storageLayout/L2ERC721Bridge.json @@ -25,14 +25,14 @@ "label": "messenger", "offset": 0, "slot": "1", - "type": "contract CrossDomainMessenger" + "type": "contract ICrossDomainMessenger" }, { "bytes": "20", "label": "otherBridge", "offset": 0, "slot": "2", - "type": "contract StandardBridge" + "type": "contract ERC721Bridge" }, { "bytes": "1472", diff --git a/packages/contracts-bedrock/snapshots/storageLayout/L2StandardBridge.json b/packages/contracts-bedrock/snapshots/storageLayout/L2StandardBridge.json index f5effc6ae799..c6ccc0fc2e03 100644 --- a/packages/contracts-bedrock/snapshots/storageLayout/L2StandardBridge.json +++ b/packages/contracts-bedrock/snapshots/storageLayout/L2StandardBridge.json @@ -39,7 +39,7 @@ "label": "messenger", "offset": 0, "slot": "3", - "type": "contract CrossDomainMessenger" + "type": "contract ICrossDomainMessenger" }, { "bytes": "20", diff --git a/packages/contracts-bedrock/snapshots/storageLayout/L2StandardBridgeInterop.json b/packages/contracts-bedrock/snapshots/storageLayout/L2StandardBridgeInterop.json new file mode 100644 index 000000000000..c6ccc0fc2e03 --- /dev/null +++ b/packages/contracts-bedrock/snapshots/storageLayout/L2StandardBridgeInterop.json @@ -0,0 +1,58 @@ +[ + { + "bytes": "1", + "label": "_initialized", + "offset": 0, + "slot": "0", + "type": "uint8" + }, + { + "bytes": "1", + "label": "_initializing", + "offset": 1, + "slot": "0", + "type": "bool" + }, + { + "bytes": "30", + "label": "spacer_0_2_30", + "offset": 2, + "slot": "0", + "type": "bytes30" + }, + { + "bytes": "20", + "label": "spacer_1_0_20", + "offset": 0, + "slot": "1", + "type": "address" + }, + { + "bytes": "32", + "label": "deposits", + "offset": 0, + "slot": "2", + "type": "mapping(address => mapping(address => uint256))" + }, + { + "bytes": "20", + "label": "messenger", + "offset": 0, + "slot": "3", + "type": "contract ICrossDomainMessenger" + }, + { + "bytes": "20", + "label": "otherBridge", + "offset": 0, + "slot": "4", + "type": "contract StandardBridge" + }, + { + "bytes": "1440", + "label": "__gap", + "offset": 0, + "slot": "5", + "type": "uint256[45]" + } +] \ No newline at end of file diff --git a/packages/contracts-bedrock/snapshots/storageLayout/MIPS2.json b/packages/contracts-bedrock/snapshots/storageLayout/MIPS2.json new file mode 100644 index 000000000000..0637a088a01e --- /dev/null +++ b/packages/contracts-bedrock/snapshots/storageLayout/MIPS2.json @@ -0,0 +1 @@ +[] \ No newline at end of file diff --git a/packages/contracts-bedrock/snapshots/storageLayout/OPStackManager.json b/packages/contracts-bedrock/snapshots/storageLayout/OPStackManager.json new file mode 100644 index 000000000000..881871a50dd1 --- /dev/null +++ b/packages/contracts-bedrock/snapshots/storageLayout/OPStackManager.json @@ -0,0 +1,44 @@ +[ + { + "bytes": "1", + "label": "_initialized", + "offset": 0, + "slot": "0", + "type": "uint8" + }, + { + "bytes": "1", + "label": "_initializing", + "offset": 1, + "slot": "0", + "type": "bool" + }, + { + "bytes": "192", + "label": "blueprint", + "offset": 0, + "slot": "1", + "type": "struct OPStackManager.Blueprints" + }, + { + "bytes": "32", + "label": "latestRelease", + "offset": 0, + "slot": "7", + "type": "string" + }, + { + "bytes": "32", + "label": "implementations", + "offset": 0, + "slot": "8", + "type": "mapping(string => mapping(string => struct OPStackManager.Implementation))" + }, + { + "bytes": "32", + "label": "systemConfigs", + "offset": 0, + "slot": "9", + "type": "mapping(uint256 => contract SystemConfig)" + } +] \ No newline at end of file diff --git a/packages/contracts-bedrock/snapshots/storageLayout/OPStackManagerInterop.json b/packages/contracts-bedrock/snapshots/storageLayout/OPStackManagerInterop.json new file mode 100644 index 000000000000..881871a50dd1 --- /dev/null +++ b/packages/contracts-bedrock/snapshots/storageLayout/OPStackManagerInterop.json @@ -0,0 +1,44 @@ +[ + { + "bytes": "1", + "label": "_initialized", + "offset": 0, + "slot": "0", + "type": "uint8" + }, + { + "bytes": "1", + "label": "_initializing", + "offset": 1, + "slot": "0", + "type": "bool" + }, + { + "bytes": "192", + "label": "blueprint", + "offset": 0, + "slot": "1", + "type": "struct OPStackManager.Blueprints" + }, + { + "bytes": "32", + "label": "latestRelease", + "offset": 0, + "slot": "7", + "type": "string" + }, + { + "bytes": "32", + "label": "implementations", + "offset": 0, + "slot": "8", + "type": "mapping(string => mapping(string => struct OPStackManager.Implementation))" + }, + { + "bytes": "32", + "label": "systemConfigs", + "offset": 0, + "slot": "9", + "type": "mapping(uint256 => contract SystemConfig)" + } +] \ No newline at end of file diff --git a/packages/contracts-bedrock/snapshots/storageLayout/OptimismMintableERC20.json b/packages/contracts-bedrock/snapshots/storageLayout/OptimismMintableERC20.json index 418a98546cf7..2ad020cb1c4f 100644 --- a/packages/contracts-bedrock/snapshots/storageLayout/OptimismMintableERC20.json +++ b/packages/contracts-bedrock/snapshots/storageLayout/OptimismMintableERC20.json @@ -33,5 +33,19 @@ "offset": 0, "slot": "4", "type": "string" + }, + { + "bytes": "32", + "label": "_nonces", + "offset": 0, + "slot": "5", + "type": "mapping(address => struct Counters.Counter)" + }, + { + "bytes": "32", + "label": "_PERMIT_TYPEHASH_DEPRECATED_SLOT", + "offset": 0, + "slot": "6", + "type": "bytes32" } ] \ No newline at end of file diff --git a/packages/contracts-bedrock/snapshots/storageLayout/OptimismMintableERC20Factory.json b/packages/contracts-bedrock/snapshots/storageLayout/OptimismMintableERC20Factory.json index c39454b5e3eb..94c133d105d2 100644 --- a/packages/contracts-bedrock/snapshots/storageLayout/OptimismMintableERC20Factory.json +++ b/packages/contracts-bedrock/snapshots/storageLayout/OptimismMintableERC20Factory.json @@ -28,10 +28,17 @@ "type": "address" }, { - "bytes": "1568", - "label": "__gap", + "bytes": "32", + "label": "deployments", "offset": 0, "slot": "2", - "type": "uint256[49]" + "type": "mapping(address => address)" + }, + { + "bytes": "1536", + "label": "__gap", + "offset": 0, + "slot": "3", + "type": "uint256[48]" } ] \ 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 6eff1d1a0790..d129ef1b87e3 100644 --- a/packages/contracts-bedrock/snapshots/storageLayout/OptimismPortal.json +++ b/packages/contracts-bedrock/snapshots/storageLayout/OptimismPortal.json @@ -60,21 +60,21 @@ "label": "superchainConfig", "offset": 1, "slot": "53", - "type": "contract SuperchainConfig" + "type": "contract ISuperchainConfig" }, { "bytes": "20", "label": "l2Oracle", "offset": 0, "slot": "54", - "type": "contract L2OutputOracle" + "type": "contract IL2OutputOracle" }, { "bytes": "20", "label": "systemConfig", "offset": 0, "slot": "55", - "type": "contract SystemConfig" + "type": "contract ISystemConfig" }, { "bytes": "20", diff --git a/packages/contracts-bedrock/snapshots/storageLayout/OptimismPortal2.json b/packages/contracts-bedrock/snapshots/storageLayout/OptimismPortal2.json index ac6f991c9a8e..0fdd65b3e88f 100644 --- a/packages/contracts-bedrock/snapshots/storageLayout/OptimismPortal2.json +++ b/packages/contracts-bedrock/snapshots/storageLayout/OptimismPortal2.json @@ -60,7 +60,7 @@ "label": "superchainConfig", "offset": 1, "slot": "53", - "type": "contract SuperchainConfig" + "type": "contract ISuperchainConfig" }, { "bytes": "20", @@ -74,14 +74,14 @@ "label": "systemConfig", "offset": 0, "slot": "55", - "type": "contract SystemConfig" + "type": "contract ISystemConfig" }, { "bytes": "20", "label": "disputeGameFactory", "offset": 0, "slot": "56", - "type": "contract DisputeGameFactory" + "type": "contract IDisputeGameFactory" }, { "bytes": "32", @@ -120,9 +120,9 @@ }, { "bytes": "32", - "label": "spacer_61_0_32", + "label": "_balance", "offset": 0, "slot": "61", - "type": "bytes32" + "type": "uint256" } ] \ 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..0fdd65b3e88f --- /dev/null +++ b/packages/contracts-bedrock/snapshots/storageLayout/OptimismPortalInterop.json @@ -0,0 +1,128 @@ +[ + { + "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": "spacer_52_0_32", + "offset": 0, + "slot": "52", + "type": "bytes32" + }, + { + "bytes": "1", + "label": "spacer_53_0_1", + "offset": 0, + "slot": "53", + "type": "bool" + }, + { + "bytes": "20", + "label": "superchainConfig", + "offset": 1, + "slot": "53", + "type": "contract ISuperchainConfig" + }, + { + "bytes": "20", + "label": "spacer_54_0_20", + "offset": 0, + "slot": "54", + "type": "address" + }, + { + "bytes": "20", + "label": "systemConfig", + "offset": 0, + "slot": "55", + "type": "contract ISystemConfig" + }, + { + "bytes": "20", + "label": "disputeGameFactory", + "offset": 0, + "slot": "56", + "type": "contract IDisputeGameFactory" + }, + { + "bytes": "32", + "label": "provenWithdrawals", + "offset": 0, + "slot": "57", + "type": "mapping(bytes32 => mapping(address => struct OptimismPortal2.ProvenWithdrawal))" + }, + { + "bytes": "32", + "label": "disputeGameBlacklist", + "offset": 0, + "slot": "58", + "type": "mapping(contract IDisputeGame => bool)" + }, + { + "bytes": "4", + "label": "respectedGameType", + "offset": 0, + "slot": "59", + "type": "GameType" + }, + { + "bytes": "8", + "label": "respectedGameTypeUpdatedAt", + "offset": 4, + "slot": "59", + "type": "uint64" + }, + { + "bytes": "32", + "label": "proofSubmitters", + "offset": 0, + "slot": "60", + "type": "mapping(bytes32 => address[])" + }, + { + "bytes": "32", + "label": "_balance", + "offset": 0, + "slot": "61", + "type": "uint256" + } +] \ No newline at end of file diff --git a/packages/contracts-bedrock/snapshots/storageLayout/OptimismSuperchainERC20.json b/packages/contracts-bedrock/snapshots/storageLayout/OptimismSuperchainERC20.json new file mode 100644 index 000000000000..0637a088a01e --- /dev/null +++ b/packages/contracts-bedrock/snapshots/storageLayout/OptimismSuperchainERC20.json @@ -0,0 +1 @@ +[] \ No newline at end of file diff --git a/packages/contracts-bedrock/snapshots/storageLayout/OptimismSuperchainERC20Beacon.json b/packages/contracts-bedrock/snapshots/storageLayout/OptimismSuperchainERC20Beacon.json new file mode 100644 index 000000000000..0637a088a01e --- /dev/null +++ b/packages/contracts-bedrock/snapshots/storageLayout/OptimismSuperchainERC20Beacon.json @@ -0,0 +1 @@ +[] \ No newline at end of file diff --git a/packages/contracts-bedrock/snapshots/storageLayout/OptimismSuperchainERC20Factory.json b/packages/contracts-bedrock/snapshots/storageLayout/OptimismSuperchainERC20Factory.json new file mode 100644 index 000000000000..3dd455fbc1bd --- /dev/null +++ b/packages/contracts-bedrock/snapshots/storageLayout/OptimismSuperchainERC20Factory.json @@ -0,0 +1,9 @@ +[ + { + "bytes": "32", + "label": "deployments", + "offset": 0, + "slot": "0", + "type": "mapping(address => address)" + } +] \ 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 f87fa588ed9c..ec02f23d2e6d 100644 --- a/packages/contracts-bedrock/snapshots/storageLayout/PermissionedDisputeGame.json +++ b/packages/contracts-bedrock/snapshots/storageLayout/PermissionedDisputeGame.json @@ -46,7 +46,7 @@ "label": "claimData", "offset": 0, "slot": "2", - "type": "struct IFaultDisputeGame.ClaimData[]" + "type": "struct FaultDisputeGame.ClaimData[]" }, { "bytes": "32", @@ -81,7 +81,7 @@ "label": "resolutionCheckpoints", "offset": 0, "slot": "7", - "type": "mapping(uint256 => struct IFaultDisputeGame.ResolutionCheckpoint)" + "type": "mapping(uint256 => struct FaultDisputeGame.ResolutionCheckpoint)" }, { "bytes": "64", diff --git a/packages/contracts-bedrock/snapshots/storageLayout/SequencerFeeVault.json b/packages/contracts-bedrock/snapshots/storageLayout/SequencerFeeVault.json index ee2c5925c712..93c5a7ec8a6b 100644 --- a/packages/contracts-bedrock/snapshots/storageLayout/SequencerFeeVault.json +++ b/packages/contracts-bedrock/snapshots/storageLayout/SequencerFeeVault.json @@ -5,5 +5,12 @@ "offset": 0, "slot": "0", "type": "uint256" + }, + { + "bytes": "1536", + "label": "__gap", + "offset": 0, + "slot": "1", + "type": "uint256[48]" } ] \ No newline at end of file diff --git a/packages/contracts-bedrock/snapshots/storageLayout/SuperchainWETH.json b/packages/contracts-bedrock/snapshots/storageLayout/SuperchainWETH.json new file mode 100644 index 000000000000..ac5f38a75a04 --- /dev/null +++ b/packages/contracts-bedrock/snapshots/storageLayout/SuperchainWETH.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/SystemConfig.json b/packages/contracts-bedrock/snapshots/storageLayout/SystemConfig.json index 648245156248..b0946e1bc4db 100644 --- a/packages/contracts-bedrock/snapshots/storageLayout/SystemConfig.json +++ b/packages/contracts-bedrock/snapshots/storageLayout/SystemConfig.json @@ -81,6 +81,6 @@ "label": "_resourceConfig", "offset": 0, "slot": "105", - "type": "struct ResourceMetering.ResourceConfig" + "type": "struct IResourceMetering.ResourceConfig" } ] \ No newline at end of file diff --git a/packages/contracts-bedrock/snapshots/storageLayout/SystemConfigInterop.json b/packages/contracts-bedrock/snapshots/storageLayout/SystemConfigInterop.json new file mode 100644 index 000000000000..b0946e1bc4db --- /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 IResourceMetering.ResourceConfig" + } +] \ No newline at end of file diff --git a/packages/contracts-bedrock/src/EAS/EAS.sol b/packages/contracts-bedrock/src/EAS/EAS.sol index f4872eeed26e..384ffdd0eb02 100644 --- a/packages/contracts-bedrock/src/EAS/EAS.sol +++ b/packages/contracts-bedrock/src/EAS/EAS.sol @@ -2,7 +2,7 @@ pragma solidity 0.8.19; import { Address } from "@openzeppelin/contracts/utils/Address.sol"; -import { ISemver } from "src/universal/ISemver.sol"; +import { ISemver } from "src/universal/interfaces/ISemver.sol"; import { Predeploys } from "src/libraries/Predeploys.sol"; import { EIP1271Verifier } from "src/EAS/eip1271/EIP1271Verifier.sol"; import { ISchemaResolver } from "src/EAS/resolver/ISchemaResolver.sol"; @@ -40,7 +40,7 @@ struct AttestationsResult { bytes32[] uids; // UIDs of the new attestations. } -/// @custom:proxied +/// @custom:proxied true /// @custom:predeploy 0x4200000000000000000000000000000000000021 /// @title EAS /// @notice The Ethereum Attestation Service protocol. @@ -80,8 +80,8 @@ contract EAS is IEAS, ISemver, EIP1271Verifier { uint256[MAX_GAP - 3] private __gap; /// @notice Semantic version. - /// @custom:semver 1.4.0 - string public constant version = "1.4.0"; + /// @custom:semver 1.4.1-beta.1 + string public constant version = "1.4.1-beta.1"; /// @dev Creates a new EAS instance. constructor() EIP1271Verifier("EAS", "1.3.0") { } diff --git a/packages/contracts-bedrock/src/EAS/SchemaRegistry.sol b/packages/contracts-bedrock/src/EAS/SchemaRegistry.sol index e6f5ee3c4d90..cfed1a928dba 100644 --- a/packages/contracts-bedrock/src/EAS/SchemaRegistry.sol +++ b/packages/contracts-bedrock/src/EAS/SchemaRegistry.sol @@ -1,12 +1,12 @@ // SPDX-License-Identifier: MIT pragma solidity 0.8.19; -import { ISemver } from "src/universal/ISemver.sol"; +import { ISemver } from "src/universal/interfaces/ISemver.sol"; import { ISchemaResolver } from "src/EAS/resolver/ISchemaResolver.sol"; import { EMPTY_UID, MAX_GAP } from "src/EAS/Common.sol"; import { ISchemaRegistry, SchemaRecord } from "src/EAS/ISchemaRegistry.sol"; -/// @custom:proxied +/// @custom:proxied true /// @custom:predeploy 0x4200000000000000000000000000000000000020 /// @title SchemaRegistry /// @notice The global attestation schemas for the Ethereum Attestation Service protocol. @@ -20,8 +20,8 @@ contract SchemaRegistry is ISchemaRegistry, ISemver { uint256[MAX_GAP - 1] private __gap; /// @notice Semantic version. - /// @custom:semver 1.3.0 - string public constant version = "1.3.0"; + /// @custom:semver 1.3.1-beta.1 + string public constant version = "1.3.1-beta.1"; /// @inheritdoc ISchemaRegistry function register(string calldata schema, ISchemaResolver resolver, bool revocable) external returns (bytes32) { diff --git a/packages/contracts-bedrock/src/L1/DataAvailabilityChallenge.sol b/packages/contracts-bedrock/src/L1/DataAvailabilityChallenge.sol index 84ba91b8fa98..1bb0d1bf6680 100644 --- a/packages/contracts-bedrock/src/L1/DataAvailabilityChallenge.sol +++ b/packages/contracts-bedrock/src/L1/DataAvailabilityChallenge.sol @@ -1,10 +1,15 @@ // SPDX-License-Identifier: MIT pragma solidity 0.8.15; +// Contracts import { OwnableUpgradeable } from "@openzeppelin/contracts-upgradeable/access/OwnableUpgradeable.sol"; -import { ISemver } from "src/universal/ISemver.sol"; + +// Libraries import { SafeCall } from "src/libraries/SafeCall.sol"; +// Interfaces +import { ISemver } from "src/universal/interfaces/ISemver.sol"; + /// @dev An enum representing the status of a DA challenge. enum ChallengeStatus { Uninitialized, @@ -29,6 +34,7 @@ struct Challenge { uint256 resolvedBlock; } +/// @custom:proxied true /// @title DataAvailabilityChallenge /// @notice This contract enables data availability of a data commitment at a given block number to be challenged. /// To challenge a commitment, the challenger must first post a bond (bondSize). @@ -88,8 +94,8 @@ contract DataAvailabilityChallenge is OwnableUpgradeable, ISemver { event BalanceChanged(address account, uint256 balance); /// @notice Semantic version. - /// @custom:semver 1.0.0 - string public constant version = "1.0.0"; + /// @custom:semver 1.0.1-beta.1 + string public constant version = "1.0.1-beta.1"; /// @notice The fixed cost of resolving a challenge. /// @dev The value is estimated by measuring the cost of resolving with `bytes(0)` diff --git a/packages/contracts-bedrock/src/L1/DelayedVetoable.sol b/packages/contracts-bedrock/src/L1/DelayedVetoable.sol index abb40b9ce90f..ad45b4c9b20a 100644 --- a/packages/contracts-bedrock/src/L1/DelayedVetoable.sol +++ b/packages/contracts-bedrock/src/L1/DelayedVetoable.sol @@ -1,7 +1,8 @@ // SPDX-License-Identifier: MIT pragma solidity 0.8.15; -import { ISemver } from "src/universal/ISemver.sol"; +// Interfaces +import { ISemver } from "src/universal/interfaces/ISemver.sol"; /// @title DelayedVetoable /// @notice This contract enables a delay before a call is forwarded to a target contract, and during the delay period @@ -68,8 +69,8 @@ contract DelayedVetoable is ISemver { } /// @notice Semantic version. - /// @custom:semver 1.0.0 - string public constant version = "1.0.0"; + /// @custom:semver 1.0.1-beta.1 + string public constant version = "1.0.1-beta.1"; /// @notice Sets the target admin during contract deployment. /// @param vetoer_ Address of the vetoer. diff --git a/packages/contracts-bedrock/src/L1/L1CrossDomainMessenger.sol b/packages/contracts-bedrock/src/L1/L1CrossDomainMessenger.sol index 4aaf2bd31156..8df4d9bfe765 100644 --- a/packages/contracts-bedrock/src/L1/L1CrossDomainMessenger.sol +++ b/packages/contracts-bedrock/src/L1/L1CrossDomainMessenger.sol @@ -1,39 +1,44 @@ // SPDX-License-Identifier: MIT pragma solidity 0.8.15; -import { Predeploys } from "src/libraries/Predeploys.sol"; -import { OptimismPortal } from "src/L1/OptimismPortal.sol"; +// Contracts 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 +// Libraries +import { Predeploys } from "src/libraries/Predeploys.sol"; + +// Interfaces +import { ISemver } from "src/universal/interfaces/ISemver.sol"; +import { ISuperchainConfig } from "src/L1/interfaces/ISuperchainConfig.sol"; +import { ISystemConfig } from "src/L1/interfaces/ISystemConfig.sol"; +import { IOptimismPortal } from "src/L1/interfaces/IOptimismPortal.sol"; + +/// @custom:proxied true /// @title L1CrossDomainMessenger /// @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. contract L1CrossDomainMessenger is CrossDomainMessenger, ISemver { /// @notice Contract of the SuperchainConfig. - SuperchainConfig public superchainConfig; + ISuperchainConfig public superchainConfig; /// @notice Contract of the OptimismPortal. /// @custom:network-specific - OptimismPortal public portal; + IOptimismPortal public portal; /// @notice Address of the SystemConfig contract. - SystemConfig public systemConfig; + ISystemConfig public systemConfig; /// @notice Semantic version. - /// @custom:semver 2.4.0 - string public constant version = "2.4.0"; + /// @custom:semver 2.4.1-beta.1 + string public constant version = "2.4.1-beta.1"; /// @notice Constructs the L1CrossDomainMessenger contract. constructor() CrossDomainMessenger() { initialize({ - _superchainConfig: SuperchainConfig(address(0)), - _portal: OptimismPortal(payable(address(0))), - _systemConfig: SystemConfig(address(0)) + _superchainConfig: ISuperchainConfig(address(0)), + _portal: IOptimismPortal(payable(address(0))), + _systemConfig: ISystemConfig(address(0)) }); } @@ -42,9 +47,9 @@ contract L1CrossDomainMessenger is CrossDomainMessenger, ISemver { /// @param _portal Contract of the OptimismPortal contract on this network. /// @param _systemConfig Contract of the SystemConfig contract on this network. function initialize( - SuperchainConfig _superchainConfig, - OptimismPortal _portal, - SystemConfig _systemConfig + ISuperchainConfig _superchainConfig, + IOptimismPortal _portal, + ISystemConfig _systemConfig ) public initializer @@ -64,7 +69,7 @@ contract L1CrossDomainMessenger is CrossDomainMessenger, ISemver { /// Public getter is legacy and will be removed in the future. Use `portal()` instead. /// @return Contract of the OptimismPortal on this chain. /// @custom:legacy - function PORTAL() external view returns (OptimismPortal) { + function PORTAL() external view returns (IOptimismPortal) { return portal; } diff --git a/packages/contracts-bedrock/src/L1/L1ERC721Bridge.sol b/packages/contracts-bedrock/src/L1/L1ERC721Bridge.sol index c4e62c7f9b51..46e7e9f71b4c 100644 --- a/packages/contracts-bedrock/src/L1/L1ERC721Bridge.sol +++ b/packages/contracts-bedrock/src/L1/L1ERC721Bridge.sol @@ -1,16 +1,21 @@ // SPDX-License-Identifier: MIT pragma solidity 0.8.15; +// Contracts import { ERC721Bridge } from "src/universal/ERC721Bridge.sol"; -import { IERC721 } from "@openzeppelin/contracts/token/ERC721/IERC721.sol"; -import { L2ERC721Bridge } from "src/L2/L2ERC721Bridge.sol"; -import { ISemver } from "src/universal/ISemver.sol"; + +// Libraries import { Predeploys } from "src/libraries/Predeploys.sol"; -import { CrossDomainMessenger } from "src/universal/CrossDomainMessenger.sol"; -import { StandardBridge } from "src/universal/StandardBridge.sol"; import { Constants } from "src/libraries/Constants.sol"; -import { SuperchainConfig } from "src/L1/SuperchainConfig.sol"; +// Interfaces +import { IERC721 } from "@openzeppelin/contracts/token/ERC721/IERC721.sol"; +import { ISemver } from "src/universal/interfaces/ISemver.sol"; +import { ICrossDomainMessenger } from "src/universal/interfaces/ICrossDomainMessenger.sol"; +import { ISuperchainConfig } from "src/L1/interfaces/ISuperchainConfig.sol"; +import { IL2ERC721Bridge } from "src/L2/interfaces/IL2ERC721Bridge.sol"; + +/// @custom:proxied true /// @title L1ERC721Bridge /// @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 @@ -21,26 +26,23 @@ contract L1ERC721Bridge is ERC721Bridge, ISemver { mapping(address => mapping(address => mapping(uint256 => bool))) public deposits; /// @notice Address of the SuperchainConfig contract. - SuperchainConfig public superchainConfig; + ISuperchainConfig public superchainConfig; /// @notice Semantic version. - /// @custom:semver 2.1.0 - string public constant version = "2.1.0"; + /// @custom:semver 2.1.1-beta.3 + string public constant version = "2.1.1-beta.3"; /// @notice Constructs the L1ERC721Bridge contract. constructor() ERC721Bridge() { - initialize({ _messenger: CrossDomainMessenger(address(0)), _superchainConfig: SuperchainConfig(address(0)) }); + initialize({ _messenger: ICrossDomainMessenger(address(0)), _superchainConfig: ISuperchainConfig(address(0)) }); } /// @notice Initializes the contract. /// @param _messenger Contract of the CrossDomainMessenger on this network. /// @param _superchainConfig Contract of the SuperchainConfig contract on this network. - function initialize(CrossDomainMessenger _messenger, SuperchainConfig _superchainConfig) public initializer { + function initialize(ICrossDomainMessenger _messenger, ISuperchainConfig _superchainConfig) public initializer { superchainConfig = _superchainConfig; - __ERC721Bridge_init({ - _messenger: _messenger, - _otherBridge: StandardBridge(payable(Predeploys.L2_ERC721_BRIDGE)) - }); + __ERC721Bridge_init({ _messenger: _messenger, _otherBridge: ERC721Bridge(payable(Predeploys.L2_ERC721_BRIDGE)) }); } /// @inheritdoc ERC721Bridge @@ -107,7 +109,7 @@ contract L1ERC721Bridge is ERC721Bridge, ISemver { // Construct calldata for _l2Token.finalizeBridgeERC721(_to, _tokenId) bytes memory message = abi.encodeWithSelector( - L2ERC721Bridge.finalizeBridgeERC721.selector, _remoteToken, _localToken, _from, _to, _tokenId, _extraData + IL2ERC721Bridge.finalizeBridgeERC721.selector, _remoteToken, _localToken, _from, _to, _tokenId, _extraData ); // Lock token into bridge diff --git a/packages/contracts-bedrock/src/L1/L1StandardBridge.sol b/packages/contracts-bedrock/src/L1/L1StandardBridge.sol index 757c140c56e4..6dd648f0d541 100644 --- a/packages/contracts-bedrock/src/L1/L1StandardBridge.sol +++ b/packages/contracts-bedrock/src/L1/L1StandardBridge.sol @@ -1,15 +1,19 @@ // SPDX-License-Identifier: MIT pragma solidity 0.8.15; -import { Predeploys } from "src/libraries/Predeploys.sol"; +// Contracts 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 { OptimismPortal } from "src/L1/OptimismPortal.sol"; -import { SystemConfig } from "src/L1/SystemConfig.sol"; -/// @custom:proxied +// Libraries +import { Predeploys } from "src/libraries/Predeploys.sol"; + +// Interfaces +import { ISemver } from "src/universal/interfaces/ISemver.sol"; +import { ICrossDomainMessenger } from "src/universal/interfaces/ICrossDomainMessenger.sol"; +import { ISuperchainConfig } from "src/L1/interfaces/ISuperchainConfig.sol"; +import { ISystemConfig } from "src/L1/interfaces/ISystemConfig.sol"; + +/// @custom:proxied true /// @title L1StandardBridge /// @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 @@ -71,21 +75,21 @@ contract L1StandardBridge is StandardBridge, ISemver { ); /// @notice Semantic version. - /// @custom:semver 2.2.0 - string public constant version = "2.2.0"; + /// @custom:semver 2.2.1-beta.1 + string public constant version = "2.2.1-beta.1"; /// @notice Address of the SuperchainConfig contract. - SuperchainConfig public superchainConfig; + ISuperchainConfig public superchainConfig; /// @notice Address of the SystemConfig contract. - SystemConfig public systemConfig; + ISystemConfig public systemConfig; /// @notice Constructs the L1StandardBridge contract. constructor() StandardBridge() { initialize({ - _messenger: CrossDomainMessenger(address(0)), - _superchainConfig: SuperchainConfig(address(0)), - _systemConfig: SystemConfig(address(0)) + _messenger: ICrossDomainMessenger(address(0)), + _superchainConfig: ISuperchainConfig(address(0)), + _systemConfig: ISystemConfig(address(0)) }); } @@ -93,9 +97,9 @@ contract L1StandardBridge is StandardBridge, ISemver { /// @param _messenger Contract for the CrossDomainMessenger on this network. /// @param _superchainConfig Contract for the SuperchainConfig on this network. function initialize( - CrossDomainMessenger _messenger, - SuperchainConfig _superchainConfig, - SystemConfig _systemConfig + ICrossDomainMessenger _messenger, + ISuperchainConfig _superchainConfig, + ISystemConfig _systemConfig ) public initializer diff --git a/packages/contracts-bedrock/src/L1/L2OutputOracle.sol b/packages/contracts-bedrock/src/L1/L2OutputOracle.sol index fe2c7dd7c8ef..fb8d681227bf 100644 --- a/packages/contracts-bedrock/src/L1/L2OutputOracle.sol +++ b/packages/contracts-bedrock/src/L1/L2OutputOracle.sol @@ -1,12 +1,17 @@ // SPDX-License-Identifier: MIT pragma solidity 0.8.15; +// Contracts import { Initializable } from "@openzeppelin/contracts/proxy/utils/Initializable.sol"; -import { ISemver } from "src/universal/ISemver.sol"; + +// Libraries import { Types } from "src/libraries/Types.sol"; import { Constants } from "src/libraries/Constants.sol"; -/// @custom:proxied +// Interfaces +import { ISemver } from "src/universal/interfaces/ISemver.sol"; + +/// @custom:proxied true /// @title L2OutputOracle /// @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 @@ -56,8 +61,8 @@ contract L2OutputOracle is Initializable, ISemver { event OutputsDeleted(uint256 indexed prevNextOutputIndex, uint256 indexed newNextOutputIndex); /// @notice Semantic version. - /// @custom:semver 1.8.0 - string public constant version = "1.8.0"; + /// @custom:semver 1.8.1-beta.1 + string public constant version = "1.8.1-beta.1"; /// @notice Constructs the L2OutputOracle contract. Initializes variables to the same values as /// in the getting-started config. diff --git a/packages/contracts-bedrock/src/L1/OPStackManager.sol b/packages/contracts-bedrock/src/L1/OPStackManager.sol new file mode 100644 index 000000000000..f7d71233005e --- /dev/null +++ b/packages/contracts-bedrock/src/L1/OPStackManager.sol @@ -0,0 +1,554 @@ +// SPDX-License-Identifier: MIT +pragma solidity 0.8.15; + +import { Blueprint } from "src/libraries/Blueprint.sol"; +import { Constants } from "src/libraries/Constants.sol"; + +import { Initializable } from "@openzeppelin/contracts/proxy/utils/Initializable.sol"; + +import { ISemver } from "src/universal/interfaces/ISemver.sol"; +import { IResourceMetering } from "src/L1/interfaces/IResourceMetering.sol"; + +import { Proxy } from "src/universal/Proxy.sol"; +import { ProxyAdmin } from "src/universal/ProxyAdmin.sol"; +import { SuperchainConfig } from "src/L1/SuperchainConfig.sol"; +import { ProtocolVersions } from "src/L1/ProtocolVersions.sol"; + +import { L1ChugSplashProxy } from "src/legacy/L1ChugSplashProxy.sol"; +import { ResolvedDelegateProxy } from "src/legacy/ResolvedDelegateProxy.sol"; +import { AddressManager } from "src/legacy/AddressManager.sol"; + +import { DelayedWETH } from "src/dispute/DelayedWETH.sol"; +import { DisputeGameFactory } from "src/dispute/DisputeGameFactory.sol"; +import { AnchorStateRegistry } from "src/dispute/AnchorStateRegistry.sol"; +import { FaultDisputeGame } from "src/dispute/FaultDisputeGame.sol"; +import { PermissionedDisputeGame } from "src/dispute/PermissionedDisputeGame.sol"; +import { GameTypes } from "src/dispute/lib/Types.sol"; + +import { SuperchainConfig } from "src/L1/SuperchainConfig.sol"; +import { ProtocolVersions } from "src/L1/ProtocolVersions.sol"; +import { OptimismPortal2 } from "src/L1/OptimismPortal2.sol"; +import { SystemConfig } from "src/L1/SystemConfig.sol"; +import { ResourceMetering } from "src/L1/ResourceMetering.sol"; +import { L1CrossDomainMessenger } from "src/L1/L1CrossDomainMessenger.sol"; +import { L1ERC721Bridge } from "src/L1/L1ERC721Bridge.sol"; +import { L1StandardBridge } from "src/L1/L1StandardBridge.sol"; +import { OptimismMintableERC20Factory } from "src/universal/OptimismMintableERC20Factory.sol"; + +/// @custom:proxied true +contract OPStackManager is ISemver, Initializable { + // -------- Structs -------- + + /// @notice Represents the roles that can be set when deploying a standard OP Stack chain. + struct Roles { + address opChainProxyAdminOwner; + address systemConfigOwner; + address batcher; + address unsafeBlockSigner; + address proposer; + address challenger; + } + + /// @notice The full set of inputs to deploy a new OP Stack chain. + struct DeployInput { + Roles roles; + uint32 basefeeScalar; + uint32 blobBasefeeScalar; + uint256 l2ChainId; + // The correct type is AnchorStateRegistry.StartingAnchorRoot[] memory, + // but OP Deployer does not yet support structs. + bytes startingAnchorRoots; + } + + /// @notice The full set of outputs from deploying a new OP Stack chain. + struct DeployOutput { + ProxyAdmin opChainProxyAdmin; + AddressManager addressManager; + L1ERC721Bridge l1ERC721BridgeProxy; + SystemConfig systemConfigProxy; + OptimismMintableERC20Factory optimismMintableERC20FactoryProxy; + L1StandardBridge l1StandardBridgeProxy; + L1CrossDomainMessenger l1CrossDomainMessengerProxy; + // Fault proof contracts below. + OptimismPortal2 optimismPortalProxy; + DisputeGameFactory disputeGameFactoryProxy; + AnchorStateRegistry anchorStateRegistryProxy; + AnchorStateRegistry anchorStateRegistryImpl; + FaultDisputeGame faultDisputeGame; + PermissionedDisputeGame permissionedDisputeGame; + DelayedWETH delayedWETHPermissionedGameProxy; + DelayedWETH delayedWETHPermissionlessGameProxy; + } + + /// @notice The logic address and initializer selector for an implementation contract. + struct Implementation { + address logic; // Address containing the deployed logic contract. + bytes4 initializer; // Function selector for the initializer. + } + + /// @notice Used to set the implementation for a contract by mapping a contract + /// name to the implementation data. + struct ImplementationSetter { + string name; // Contract name. + Implementation info; // Implementation to set. + } + + /// @notice Addresses of ERC-5202 Blueprint contracts. There are used for deploying full size + /// contracts, to reduce the code size of this factory contract. If it deployed full contracts + /// using the `new Proxy()` syntax, the code size would get large fast, since this contract would + /// contain the bytecode of every contract it deploys. Therefore we instead use Blueprints to + /// reduce the code size of this contract. + struct Blueprints { + address addressManager; + address proxy; + address proxyAdmin; + address l1ChugSplashProxy; + address resolvedDelegateProxy; + address anchorStateRegistry; + } + + /// @notice Inputs required when initializing the OPStackManager. To avoid 'StackTooDeep' errors, + /// all necessary inputs (excluding immutables) for initialization are bundled together in this struct. + struct InitializerInputs { + Blueprints blueprints; + ImplementationSetter[] setters; + string release; + bool isLatest; + } + + // -------- Constants and Variables -------- + + /// @custom:semver 1.0.0-beta.4 + string public constant version = "1.0.0-beta.4"; + + /// @notice Address of the SuperchainConfig contract shared by all chains. + SuperchainConfig public immutable superchainConfig; + + /// @notice Address of the ProtocolVersions contract shared by all chains. + ProtocolVersions public immutable protocolVersions; + + /// @notice Addresses of the Blueprint contracts. + /// This is internal because if public the autogenerated getter method would return a tuple of + /// addresses, but we want it to return a struct. This is also set via `initialize` because + /// we can't make this an immutable variable as it is a non-value type. + Blueprints internal blueprint; + + /// @notice The latest release of the OP Stack Manager, as a string of the format `op-contracts/vX.Y.Z`. + string public latestRelease; + + /// @notice Maps a release version to a contract name to it's implementation data. + mapping(string => mapping(string => Implementation)) public implementations; + + /// @notice Maps an L2 Chain ID to the SystemConfig for that chain. + mapping(uint256 => SystemConfig) public systemConfigs; + + // -------- Events -------- + + /// @notice Emitted when a new OP Stack chain is deployed. + /// @param l2ChainId The chain ID of the new chain. + /// @param systemConfig The address of the new chain's SystemConfig contract. + event Deployed(uint256 indexed l2ChainId, SystemConfig indexed systemConfig); + + // -------- Errors -------- + + /// @notice Thrown when an address is the zero address. + error AddressNotFound(address who); + + /// @notice Throw when a contract address has no code. + error AddressHasNoCode(address who); + + /// @notice Thrown when a release version is already set. + error AlreadyReleased(); + + /// @notice Thrown when an invalid `l2ChainId` is provided to `deploy`. + error InvalidChainId(); + + /// @notice Thrown when a role's address is not valid. + error InvalidRoleAddress(string role); + + /// @notice Thrown when the latest release is not set upon initialization. + error LatestReleaseNotSet(); + + // -------- Methods -------- + + /// @notice OPSM is proxied. Therefore the `initialize` function replaces most constructor logic for this contract. + + constructor(SuperchainConfig _superchainConfig, ProtocolVersions _protocolVersions) { + assertValidContractAddress(address(_superchainConfig)); + assertValidContractAddress(address(_protocolVersions)); + superchainConfig = _superchainConfig; + protocolVersions = _protocolVersions; + _disableInitializers(); + } + + function initialize(InitializerInputs memory _initializerInputs) public initializer { + if (_initializerInputs.isLatest) latestRelease = _initializerInputs.release; + if (keccak256(bytes(latestRelease)) == keccak256("")) revert LatestReleaseNotSet(); + + for (uint256 i = 0; i < _initializerInputs.setters.length; i++) { + ImplementationSetter memory setter = _initializerInputs.setters[i]; + Implementation storage impl = implementations[_initializerInputs.release][setter.name]; + if (impl.logic != address(0)) revert AlreadyReleased(); + + impl.initializer = setter.info.initializer; + impl.logic = setter.info.logic; + } + + blueprint = _initializerInputs.blueprints; + } + + function deploy(DeployInput calldata _input) external returns (DeployOutput memory) { + assertValidInputs(_input); + + // TODO Determine how we want to choose salt, e.g. are we concerned about chain ID squatting + // since this approach means a chain ID can only be used once. + uint256 l2ChainId = _input.l2ChainId; + bytes32 salt = bytes32(_input.l2ChainId); + DeployOutput memory output; + + // -------- TODO: Placeholders -------- + // For contracts we don't yet deploy, we set the outputs to dummy proxies so they have code to pass assertions. + // We do these first, that way the disputeGameFactoryProxy is set when passed to the SystemConfig input. + output.faultDisputeGame = FaultDisputeGame(deployProxy(l2ChainId, output.opChainProxyAdmin, "5")); + output.permissionedDisputeGame = PermissionedDisputeGame(deployProxy(l2ChainId, output.opChainProxyAdmin, "6")); + output.delayedWETHPermissionedGameProxy = + DelayedWETH(payable(deployProxy(l2ChainId, output.opChainProxyAdmin, "7"))); + output.delayedWETHPermissionlessGameProxy = + DelayedWETH(payable(deployProxy(l2ChainId, output.opChainProxyAdmin, "8"))); + + // -------- Deploy Chain Singletons -------- + + // The ProxyAdmin is the owner of all proxies for the chain. We temporarily set the owner to + // this contract, and then transfer ownership to the specified owner at the end of deployment. + // The AddressManager is used to store the implementation for the L1CrossDomainMessenger + // due to it's usage of the legacy ResolvedDelegateProxy. + output.addressManager = AddressManager(Blueprint.deployFrom(blueprint.addressManager, salt)); + output.opChainProxyAdmin = + ProxyAdmin(Blueprint.deployFrom(blueprint.proxyAdmin, salt, abi.encode(address(this)))); + output.opChainProxyAdmin.setAddressManager(output.addressManager); + + // -------- Deploy Proxy Contracts -------- + + // Deploy ERC-1967 proxied contracts. + output.l1ERC721BridgeProxy = L1ERC721Bridge(deployProxy(l2ChainId, output.opChainProxyAdmin, "L1ERC721Bridge")); + output.optimismPortalProxy = + OptimismPortal2(payable(deployProxy(l2ChainId, output.opChainProxyAdmin, "OptimismPortal"))); + output.systemConfigProxy = SystemConfig(deployProxy(l2ChainId, output.opChainProxyAdmin, "SystemConfig")); + output.optimismMintableERC20FactoryProxy = OptimismMintableERC20Factory( + deployProxy(l2ChainId, output.opChainProxyAdmin, "OptimismMintableERC20Factory") + ); + output.disputeGameFactoryProxy = + DisputeGameFactory(deployProxy(l2ChainId, output.opChainProxyAdmin, "DisputeGameFactory")); + output.anchorStateRegistryProxy = + AnchorStateRegistry(deployProxy(l2ChainId, output.opChainProxyAdmin, "AnchorStateRegistry")); + + // Deploy legacy proxied contracts. + output.l1StandardBridgeProxy = L1StandardBridge( + payable(Blueprint.deployFrom(blueprint.l1ChugSplashProxy, salt, abi.encode(output.opChainProxyAdmin))) + ); + output.opChainProxyAdmin.setProxyType(address(output.l1StandardBridgeProxy), ProxyAdmin.ProxyType.CHUGSPLASH); + + string memory contractName = "OVM_L1CrossDomainMessenger"; + output.l1CrossDomainMessengerProxy = L1CrossDomainMessenger( + Blueprint.deployFrom(blueprint.resolvedDelegateProxy, salt, abi.encode(output.addressManager, contractName)) + ); + output.opChainProxyAdmin.setProxyType( + address(output.l1CrossDomainMessengerProxy), ProxyAdmin.ProxyType.RESOLVED + ); + output.opChainProxyAdmin.setImplementationName(address(output.l1CrossDomainMessengerProxy), contractName); + + // Now that all proxies are deployed, we can transfer ownership of the AddressManager to the ProxyAdmin. + output.addressManager.transferOwnership(address(output.opChainProxyAdmin)); + + // The AnchorStateRegistry Implementation is not MCP Ready, and therefore requires an implementation per chain. + // It must be deployed after the DisputeGameFactoryProxy so that it can be provided as a constructor argument. + output.anchorStateRegistryImpl = AnchorStateRegistry( + Blueprint.deployFrom(blueprint.anchorStateRegistry, salt, abi.encode(output.disputeGameFactoryProxy)) + ); + + // -------- Set and Initialize Proxy Implementations -------- + Implementation memory impl; + bytes memory data; + + impl = getLatestImplementation("L1ERC721Bridge"); + data = encodeL1ERC721BridgeInitializer(impl.initializer, output); + upgradeAndCall(output.opChainProxyAdmin, address(output.l1ERC721BridgeProxy), impl.logic, data); + + impl = getLatestImplementation("OptimismPortal"); + data = encodeOptimismPortalInitializer(impl.initializer, output); + upgradeAndCall(output.opChainProxyAdmin, address(output.optimismPortalProxy), impl.logic, data); + + impl = getLatestImplementation("SystemConfig"); + data = encodeSystemConfigInitializer(impl.initializer, _input, output); + upgradeAndCall(output.opChainProxyAdmin, address(output.systemConfigProxy), impl.logic, data); + + impl = getLatestImplementation("OptimismMintableERC20Factory"); + data = encodeOptimismMintableERC20FactoryInitializer(impl.initializer, output); + upgradeAndCall(output.opChainProxyAdmin, address(output.optimismMintableERC20FactoryProxy), impl.logic, data); + + impl = getLatestImplementation("L1CrossDomainMessenger"); + data = encodeL1CrossDomainMessengerInitializer(impl.initializer, output); + upgradeAndCall(output.opChainProxyAdmin, address(output.l1CrossDomainMessengerProxy), impl.logic, data); + + impl = getLatestImplementation("L1StandardBridge"); + data = encodeL1StandardBridgeInitializer(impl.initializer, output); + upgradeAndCall(output.opChainProxyAdmin, address(output.l1StandardBridgeProxy), impl.logic, data); + + // TODO: also call setImplementation() once the dispute games are deployed. + impl = getLatestImplementation("DisputeGameFactory"); + data = encodeDisputeGameFactoryInitializer(impl.initializer, _input); + upgradeAndCall(output.opChainProxyAdmin, address(output.disputeGameFactoryProxy), impl.logic, data); + + impl.logic = address(output.anchorStateRegistryImpl); + impl.initializer = AnchorStateRegistry.initialize.selector; + data = encodeAnchorStateRegistryInitializer(impl.initializer, _input); + upgradeAndCall(output.opChainProxyAdmin, address(output.anchorStateRegistryProxy), impl.logic, data); + + // -------- Finalize Deployment -------- + // Transfer ownership of the ProxyAdmin from this contract to the specified owner. + output.opChainProxyAdmin.transferOwnership(_input.roles.opChainProxyAdminOwner); + + return output; + } + + // -------- Utilities -------- + + /// @notice Verifies that all inputs are valid and reverts if any are invalid. + /// Typically the proxy admin owner is expected to have code, but this is not enforced here. + function assertValidInputs(DeployInput calldata _input) internal view { + if (_input.l2ChainId == 0 || _input.l2ChainId == block.chainid) revert InvalidChainId(); + + if (_input.roles.opChainProxyAdminOwner == address(0)) revert InvalidRoleAddress("opChainProxyAdminOwner"); + if (_input.roles.systemConfigOwner == address(0)) revert InvalidRoleAddress("systemConfigOwner"); + if (_input.roles.batcher == address(0)) revert InvalidRoleAddress("batcher"); + if (_input.roles.unsafeBlockSigner == address(0)) revert InvalidRoleAddress("unsafeBlockSigner"); + if (_input.roles.proposer == address(0)) revert InvalidRoleAddress("proposer"); + if (_input.roles.challenger == address(0)) revert InvalidRoleAddress("challenger"); + } + + /// @notice Maps an L2 chain ID to an L1 batch inbox address as defined by the standard + /// configuration's convention. This convention is `versionByte || keccak256(bytes32(chainId))[:19]`, + /// where || denotes concatenation`, versionByte is 0x00, and chainId is a uint256. + /// https://specs.optimism.io/protocol/configurability.html#consensus-parameters + function chainIdToBatchInboxAddress(uint256 _l2ChainId) public pure returns (address) { + bytes1 versionByte = 0x00; + bytes32 hashedChainId = keccak256(bytes.concat(bytes32(_l2ChainId))); + bytes19 first19Bytes = bytes19(hashedChainId); + return address(uint160(bytes20(bytes.concat(versionByte, first19Bytes)))); + } + + /// @notice Deterministically deploys a new proxy contract owned by the provided ProxyAdmin. + /// The salt is computed as a function of the L2 chain ID and the contract name. This is required + /// because we deploy many identical proxies, so they each require a unique salt for determinism. + function deployProxy( + uint256 _l2ChainId, + ProxyAdmin _proxyAdmin, + string memory _contractName + ) + internal + returns (address) + { + bytes32 salt = keccak256(abi.encode(_l2ChainId, _contractName)); + return Blueprint.deployFrom(blueprint.proxy, salt, abi.encode(_proxyAdmin)); + } + + /// @notice Returns the implementation data for a contract name. Makes a copy of the internal + // Implementation struct in storage to prevent accidental mutation of the internal data. + function getLatestImplementation(string memory _name) internal view returns (Implementation memory) { + Implementation storage impl = implementations[latestRelease][_name]; + return Implementation({ logic: impl.logic, initializer: impl.initializer }); + } + + // -------- Initializer Encoding -------- + + /// @notice Helper method for encoding the L1ERC721Bridge initializer data. + function encodeL1ERC721BridgeInitializer( + bytes4 _selector, + DeployOutput memory _output + ) + internal + view + virtual + returns (bytes memory) + { + return abi.encodeWithSelector(_selector, _output.l1CrossDomainMessengerProxy, superchainConfig); + } + + /// @notice Helper method for encoding the OptimismPortal initializer data. + function encodeOptimismPortalInitializer( + bytes4 _selector, + DeployOutput memory _output + ) + internal + view + virtual + returns (bytes memory) + { + _output; + // TODO make GameTypes.CANNON an input once FPs are supported + return abi.encodeWithSelector( + _selector, _output.disputeGameFactoryProxy, _output.systemConfigProxy, superchainConfig, GameTypes.CANNON + ); + } + + /// @notice Helper method for encoding the SystemConfig initializer data. + function encodeSystemConfigInitializer( + bytes4 selector, + DeployInput memory _input, + DeployOutput memory _output + ) + internal + view + virtual + returns (bytes memory) + { + (ResourceMetering.ResourceConfig memory referenceResourceConfig, SystemConfig.Addresses memory opChainAddrs) = + defaultSystemConfigParams(selector, _input, _output); + + return abi.encodeWithSelector( + selector, + _input.roles.systemConfigOwner, + _input.basefeeScalar, + _input.blobBasefeeScalar, + bytes32(uint256(uint160(_input.roles.batcher))), // batcherHash + 30_000_000, // gasLimit, TODO should this be an input? + _input.roles.unsafeBlockSigner, + referenceResourceConfig, + chainIdToBatchInboxAddress(_input.l2ChainId), + opChainAddrs + ); + } + + /// @notice Helper method for encoding the OptimismMintableERC20Factory initializer data. + function encodeOptimismMintableERC20FactoryInitializer( + bytes4 _selector, + DeployOutput memory _output + ) + internal + pure + virtual + returns (bytes memory) + { + return abi.encodeWithSelector(_selector, _output.l1StandardBridgeProxy); + } + + /// @notice Helper method for encoding the L1CrossDomainMessenger initializer data. + function encodeL1CrossDomainMessengerInitializer( + bytes4 _selector, + DeployOutput memory _output + ) + internal + view + virtual + returns (bytes memory) + { + return + abi.encodeWithSelector(_selector, superchainConfig, _output.optimismPortalProxy, _output.systemConfigProxy); + } + + /// @notice Helper method for encoding the L1StandardBridge initializer data. + function encodeL1StandardBridgeInitializer( + bytes4 _selector, + DeployOutput memory _output + ) + internal + view + virtual + returns (bytes memory) + { + return abi.encodeWithSelector( + _selector, _output.l1CrossDomainMessengerProxy, superchainConfig, _output.systemConfigProxy + ); + } + + function encodeDisputeGameFactoryInitializer( + bytes4 _selector, + DeployInput memory _input + ) + internal + view + virtual + returns (bytes memory) + { + return abi.encodeWithSelector(_selector, _input.roles.opChainProxyAdminOwner); + } + + function encodeAnchorStateRegistryInitializer( + bytes4 _selector, + DeployInput memory _input + ) + internal + view + virtual + returns (bytes memory) + { + // this line fails in the op-deployer tests because it is not passing in any data + AnchorStateRegistry.StartingAnchorRoot[] memory startingAnchorRoots = + abi.decode(_input.startingAnchorRoots, (AnchorStateRegistry.StartingAnchorRoot[])); + return abi.encodeWithSelector(_selector, startingAnchorRoots, superchainConfig); + } + + /// @notice Returns default, standard config arguments for the SystemConfig initializer. + /// This is used by subclasses to reduce code duplication. + function defaultSystemConfigParams( + bytes4, /* selector */ + DeployInput memory, /* _input */ + DeployOutput memory _output + ) + internal + view + virtual + returns (ResourceMetering.ResourceConfig memory resourceConfig_, SystemConfig.Addresses memory opChainAddrs_) + { + // We use assembly to easily convert from IResourceMetering.ResourceConfig to ResourceMetering.ResourceConfig. + // This is required because we have not yet fully migrated the codebase to be interface-based. + IResourceMetering.ResourceConfig memory resourceConfig = Constants.DEFAULT_RESOURCE_CONFIG(); + assembly ("memory-safe") { + resourceConfig_ := resourceConfig + } + + opChainAddrs_ = SystemConfig.Addresses({ + l1CrossDomainMessenger: address(_output.l1CrossDomainMessengerProxy), + l1ERC721Bridge: address(_output.l1ERC721BridgeProxy), + l1StandardBridge: address(_output.l1StandardBridgeProxy), + disputeGameFactory: address(_output.disputeGameFactoryProxy), + optimismPortal: address(_output.optimismPortalProxy), + optimismMintableERC20Factory: address(_output.optimismMintableERC20FactoryProxy), + gasPayingToken: Constants.ETHER + }); + + assertValidContractAddress(opChainAddrs_.l1CrossDomainMessenger); + assertValidContractAddress(opChainAddrs_.l1ERC721Bridge); + assertValidContractAddress(opChainAddrs_.l1StandardBridge); + assertValidContractAddress(opChainAddrs_.disputeGameFactory); + assertValidContractAddress(opChainAddrs_.optimismPortal); + assertValidContractAddress(opChainAddrs_.optimismMintableERC20Factory); + } + + /// @notice Makes an external call to the target to initialize the proxy with the specified data. + /// First performs safety checks to ensure the target, implementation, and proxy admin are valid. + function upgradeAndCall( + ProxyAdmin _proxyAdmin, + address _target, + address _implementation, + bytes memory _data + ) + internal + { + assertValidContractAddress(address(_proxyAdmin)); + assertValidContractAddress(_target); + assertValidContractAddress(_implementation); + + _proxyAdmin.upgradeAndCall(payable(address(_target)), _implementation, _data); + } + + function assertValidContractAddress(address _who) internal view { + if (_who == address(0)) revert AddressNotFound(_who); + if (_who.code.length == 0) revert AddressHasNoCode(_who); + } + + /// @notice Returns the blueprint contract addresses. + function blueprints() public view returns (Blueprints memory) { + return blueprint; + } +} diff --git a/packages/contracts-bedrock/src/L1/OPStackManagerInterop.sol b/packages/contracts-bedrock/src/L1/OPStackManagerInterop.sol new file mode 100644 index 000000000000..0a4a88625c9d --- /dev/null +++ b/packages/contracts-bedrock/src/L1/OPStackManagerInterop.sol @@ -0,0 +1,57 @@ +// SPDX-License-Identifier: MIT +pragma solidity 0.8.15; + +import { OPStackManager } from "src/L1/OPStackManager.sol"; +import { SuperchainConfig } from "src/L1/SuperchainConfig.sol"; +import { ProtocolVersions } from "src/L1/ProtocolVersions.sol"; +import { ResourceMetering } from "src/L1/ResourceMetering.sol"; +import { SystemConfig } from "src/L1/SystemConfig.sol"; +import { SystemConfigInterop } from "src/L1/SystemConfigInterop.sol"; + +/// @custom:proxied true +contract OPStackManagerInterop is OPStackManager { + constructor( + SuperchainConfig _superchainConfig, + ProtocolVersions _protocolVersions + ) + OPStackManager(_superchainConfig, _protocolVersions) + { } + + // The `SystemConfigInterop` contract has an extra `address _dependencyManager` argument + // that we must account for. + function encodeSystemConfigInitializer( + bytes4 selector, + DeployInput memory _input, + DeployOutput memory _output + ) + internal + view + virtual + override + returns (bytes memory) + { + (ResourceMetering.ResourceConfig memory referenceResourceConfig, SystemConfig.Addresses memory opChainAddrs) = + defaultSystemConfigParams(selector, _input, _output); + + // TODO For now we assume that the dependency manager is the same as the proxy admin owner. + // This is currently undefined since it's not part of the standard config, so we may need + // to update where this value is pulled from in the future. To support a different dependency + // manager in this contract without an invasive change of redefining the `Roles` struct, + // we will make the change described in https://github.com/ethereum-optimism/optimism/issues/11783. + address dependencyManager = address(_input.roles.opChainProxyAdminOwner); + + return abi.encodeWithSelector( + selector, + _input.roles.systemConfigOwner, + _input.basefeeScalar, + _input.blobBasefeeScalar, + bytes32(uint256(uint160(_input.roles.batcher))), // batcherHash + 30_000_000, // gasLimit TODO make this configurable? + _input.roles.unsafeBlockSigner, + referenceResourceConfig, + chainIdToBatchInboxAddress(_input.l2ChainId), + opChainAddrs, + dependencyManager + ); + } +} diff --git a/packages/contracts-bedrock/src/L1/OptimismPortal.sol b/packages/contracts-bedrock/src/L1/OptimismPortal.sol index b1d3b975cf45..885f37574212 100644 --- a/packages/contracts-bedrock/src/L1/OptimismPortal.sol +++ b/packages/contracts-bedrock/src/L1/OptimismPortal.sol @@ -1,25 +1,31 @@ // SPDX-License-Identifier: MIT pragma solidity 0.8.15; +// Contracts import { Initializable } from "@openzeppelin/contracts/proxy/utils/Initializable.sol"; +import { ResourceMetering } from "src/L1/ResourceMetering.sol"; + +// Libraries +import { SafeERC20 } from "@openzeppelin/contracts/token/ERC20/utils/SafeERC20.sol"; import { SafeCall } from "src/libraries/SafeCall.sol"; -import { L2OutputOracle } from "src/L1/L2OutputOracle.sol"; -import { SystemConfig } from "src/L1/SystemConfig.sol"; -import { SuperchainConfig } from "src/L1/SuperchainConfig.sol"; import { Constants } from "src/libraries/Constants.sol"; import { Types } from "src/libraries/Types.sol"; import { Hashing } from "src/libraries/Hashing.sol"; 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 { 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 { AddressAliasHelper } from "src/vendor/AddressAliasHelper.sol"; import "src/libraries/PortalErrors.sol"; -/// @custom:proxied +// Interfaces +import { IERC20 } from "@openzeppelin/contracts/token/ERC20/IERC20.sol"; +import { ISemver } from "src/universal/interfaces/ISemver.sol"; +import { IL2OutputOracle } from "src/L1/interfaces/IL2OutputOracle.sol"; +import { ISystemConfig } from "src/L1/interfaces/ISystemConfig.sol"; +import { IResourceMetering } from "src/L1/interfaces/IResourceMetering.sol"; +import { ISuperchainConfig } from "src/L1/interfaces/ISuperchainConfig.sol"; +import { IL1Block } from "src/L2/interfaces/IL1Block.sol"; + +/// @custom:proxied true /// @title OptimismPortal /// @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. @@ -64,15 +70,15 @@ contract OptimismPortal is Initializable, ResourceMetering, ISemver { bool private spacer_53_0_1; /// @notice Contract of the Superchain Config. - SuperchainConfig public superchainConfig; + ISuperchainConfig public superchainConfig; /// @notice Contract of the L2OutputOracle. /// @custom:network-specific - L2OutputOracle public l2Oracle; + IL2OutputOracle public l2Oracle; /// @notice Contract of the SystemConfig. /// @custom:network-specific - SystemConfig public systemConfig; + ISystemConfig public systemConfig; /// @custom:spacer disputeGameFactory /// @notice Spacer for backwards compatibility. @@ -128,15 +134,17 @@ contract OptimismPortal is Initializable, ResourceMetering, ISemver { } /// @notice Semantic version. - /// @custom:semver 2.8.0 - string public constant version = "2.8.0"; + /// @custom:semver 2.8.1-beta.3 + function version() public pure virtual returns (string memory) { + return "2.8.1-beta.3"; + } /// @notice Constructs the OptimismPortal contract. constructor() { initialize({ - _l2Oracle: L2OutputOracle(address(0)), - _systemConfig: SystemConfig(address(0)), - _superchainConfig: SuperchainConfig(address(0)) + _l2Oracle: IL2OutputOracle(address(0)), + _systemConfig: ISystemConfig(address(0)), + _superchainConfig: ISuperchainConfig(address(0)) }); } @@ -145,9 +153,9 @@ contract OptimismPortal is Initializable, ResourceMetering, ISemver { /// @param _systemConfig Contract of the SystemConfig. /// @param _superchainConfig Contract of the SuperchainConfig. function initialize( - L2OutputOracle _l2Oracle, - SystemConfig _systemConfig, - SuperchainConfig _superchainConfig + IL2OutputOracle _l2Oracle, + ISystemConfig _systemConfig, + ISuperchainConfig _superchainConfig ) public initializer @@ -220,8 +228,16 @@ contract OptimismPortal is Initializable, ResourceMetering, ISemver { /// Used internally by the ResourceMetering contract. /// The SystemConfig is the source of truth for the resource config. /// @return ResourceMetering ResourceConfig - function _resourceConfig() internal view override returns (ResourceMetering.ResourceConfig memory) { - return systemConfig.resourceConfig(); + function _resourceConfig() internal view override returns (ResourceConfig memory) { + IResourceMetering.ResourceConfig memory config = systemConfig.resourceConfig(); + return ResourceConfig({ + maxResourceLimit: config.maxResourceLimit, + elasticityMultiplier: config.elasticityMultiplier, + baseFeeMaxChangeDenominator: config.baseFeeMaxChangeDenominator, + minimumBaseFee: config.minimumBaseFee, + systemTxMaxGas: config.systemTxMaxGas, + maximumBaseFee: config.maximumBaseFee + }); } /// @notice Proves a withdrawal transaction. @@ -576,7 +592,7 @@ contract OptimismPortal is Initializable, ResourceMetering, ISemver { uint256(0), // value uint64(SYSTEM_DEPOSIT_GAS_LIMIT), // gasLimit false, // isCreation, - abi.encodeCall(L1Block.setGasPayingToken, (_token, _decimals, _name, _symbol)) + abi.encodeCall(IL1Block.setGasPayingToken, (_token, _decimals, _name, _symbol)) ) ); } diff --git a/packages/contracts-bedrock/src/L1/OptimismPortal2.sol b/packages/contracts-bedrock/src/L1/OptimismPortal2.sol index 385a6ca63f01..3a75269a2020 100644 --- a/packages/contracts-bedrock/src/L1/OptimismPortal2.sol +++ b/packages/contracts-bedrock/src/L1/OptimismPortal2.sol @@ -1,29 +1,41 @@ // SPDX-License-Identifier: MIT pragma solidity 0.8.15; +// Contracts import { Initializable } from "@openzeppelin/contracts/proxy/utils/Initializable.sol"; +import { ResourceMetering } from "src/L1/ResourceMetering.sol"; + +// Libraries +import { SafeERC20 } from "@openzeppelin/contracts/token/ERC20/utils/SafeERC20.sol"; import { SafeCall } from "src/libraries/SafeCall.sol"; -import { DisputeGameFactory, IDisputeGame } from "src/dispute/DisputeGameFactory.sol"; -import { SystemConfig } from "src/L1/SystemConfig.sol"; -import { SuperchainConfig } from "src/L1/SuperchainConfig.sol"; import { Constants } from "src/libraries/Constants.sol"; import { Types } from "src/libraries/Types.sol"; import { Hashing } from "src/libraries/Hashing.sol"; import { SecureMerkleTrie } from "src/libraries/trie/SecureMerkleTrie.sol"; +import { Predeploys } from "src/libraries/Predeploys.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 "src/libraries/PortalErrors.sol"; import "src/dispute/lib/Types.sol"; -/// @custom:proxied +// Interfaces +import { IERC20 } from "@openzeppelin/contracts/token/ERC20/IERC20.sol"; +import { ISemver } from "src/universal/interfaces/ISemver.sol"; +import { ISystemConfig } from "src/L1/interfaces/ISystemConfig.sol"; +import { IResourceMetering } from "src/L1/interfaces/IResourceMetering.sol"; +import { ISuperchainConfig } from "src/L1/interfaces/ISuperchainConfig.sol"; +import { IDisputeGameFactory } from "src/dispute/interfaces/IDisputeGameFactory.sol"; +import { IDisputeGame } from "src/dispute/interfaces/IDisputeGame.sol"; +import { IL1Block } from "src/L2/interfaces/IL1Block.sol"; + +/// @custom:proxied true /// @title OptimismPortal2 /// @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 OptimismPortal2 is Initializable, ResourceMetering, ISemver { + /// @notice Allows for interactions with non standard ERC20 tokens. + using SafeERC20 for IERC20; + /// @notice Represents a proven withdrawal. /// @custom:field disputeGameProxy The address of the dispute game proxy that the withdrawal was proven against. /// @custom:field timestamp Timestamp at whcih the withdrawal was proven. @@ -45,6 +57,9 @@ contract OptimismPortal2 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,7 +79,7 @@ contract OptimismPortal2 is Initializable, ResourceMetering, ISemver { bool private spacer_53_0_1; /// @notice Contract of the Superchain Config. - SuperchainConfig public superchainConfig; + ISuperchainConfig public superchainConfig; /// @custom:legacy /// @custom:spacer l2Oracle @@ -73,11 +88,11 @@ contract OptimismPortal2 is Initializable, ResourceMetering, ISemver { /// @notice Contract of the SystemConfig. /// @custom:network-specific - SystemConfig public systemConfig; + ISystemConfig public systemConfig; /// @notice Address of the DisputeGameFactory. /// @custom:network-specific - DisputeGameFactory public disputeGameFactory; + IDisputeGameFactory public disputeGameFactory; /// @notice A mapping of withdrawal hashes to proof submitters to `ProvenWithdrawal` data. mapping(bytes32 => mapping(address => ProvenWithdrawal)) public provenWithdrawals; @@ -91,12 +106,21 @@ 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. + /// @notice Mapping of withdrawal hashes to addresses that have submitted a proof for the + /// withdrawal. Original OptimismPortal contract only allowed one proof to be submitted + /// for any given withdrawal hash. Fault Proofs version of this contract must allow + /// multiple proofs for the same withdrawal hash to prevent a malicious user from + /// blocking other withdrawals by proving them against invalid proposals. Submitters + /// are tracked in an array to simplify the off-chain process of determining which + /// proof submission should be used when finalizing a withdrawal. mapping(bytes32 => address[]) public proofSubmitters; - /// @custom:spacer _balance (custom gas token) - /// @notice Spacer for forwards compatibility. - bytes32 private spacer_61_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 @@ -140,8 +164,10 @@ contract OptimismPortal2 is Initializable, ResourceMetering, ISemver { } /// @notice Semantic version. - /// @custom:semver 3.10.0 - string public constant version = "3.10.0"; + /// @custom:semver 3.11.0-beta.5 + function version() public pure virtual returns (string memory) { + return "3.11.0-beta.5"; + } /// @notice Constructs the OptimismPortal contract. constructor(uint256 _proofMaturityDelaySeconds, uint256 _disputeGameFinalityDelaySeconds) { @@ -149,9 +175,9 @@ contract OptimismPortal2 is Initializable, ResourceMetering, ISemver { DISPUTE_GAME_FINALITY_DELAY_SECONDS = _disputeGameFinalityDelaySeconds; initialize({ - _disputeGameFactory: DisputeGameFactory(address(0)), - _systemConfig: SystemConfig(address(0)), - _superchainConfig: SuperchainConfig(address(0)), + _disputeGameFactory: IDisputeGameFactory(address(0)), + _systemConfig: ISystemConfig(address(0)), + _superchainConfig: ISuperchainConfig(address(0)), _initialRespectedGameType: GameType.wrap(0) }); } @@ -161,9 +187,9 @@ contract OptimismPortal2 is Initializable, ResourceMetering, ISemver { /// @param _systemConfig Contract of the SystemConfig. /// @param _superchainConfig Contract of the SuperchainConfig. function initialize( - DisputeGameFactory _disputeGameFactory, - SystemConfig _systemConfig, - SuperchainConfig _superchainConfig, + IDisputeGameFactory _disputeGameFactory, + ISystemConfig _systemConfig, + ISuperchainConfig _superchainConfig, GameType _initialRespectedGameType ) public @@ -189,6 +215,16 @@ contract OptimismPortal2 is Initializable, ResourceMetering, ISemver { __ResourceMetering_init(); } + /// @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. /// Public getter is legacy and will be removed in the future. Use `SuperchainConfig.guardian()` instead. /// @return Address of the guardian. @@ -238,12 +274,20 @@ contract OptimismPortal2 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. - /// @return ResourceMetering ResourceConfig - function _resourceConfig() internal view override returns (ResourceMetering.ResourceConfig memory) { - return systemConfig.resourceConfig(); + /// @return config_ ResourceMetering ResourceConfig + function _resourceConfig() internal view override returns (ResourceMetering.ResourceConfig memory config_) { + IResourceMetering.ResourceConfig memory config = systemConfig.resourceConfig(); + assembly ("memory-safe") { + config_ := config + } } /// @notice Proves a withdrawal transaction. @@ -263,30 +307,24 @@ contract OptimismPortal2 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(); // Fetch the dispute game proxy from the `DisputeGameFactory` contract. (GameType gameType,, IDisputeGame gameProxy) = disputeGameFactory.gameAtIndex(_disputeGameIndex); Claim outputRoot = gameProxy.rootClaim(); // The game type of the dispute game must be the respected game type. - require(gameType.raw() == respectedGameType.raw(), "OptimismPortal: invalid game type"); + if (gameType.raw() != respectedGameType.raw()) revert InvalidGameType(); // Verify that the output root can be generated with the elements in the proof. - require( - outputRoot.raw() == Hashing.hashOutputRootProof(_outputRootProof), - "OptimismPortal: invalid output root proof" - ); + if (outputRoot.raw() != Hashing.hashOutputRootProof(_outputRootProof)) revert InvalidProof(); // Load the ProvenWithdrawal into memory, using the withdrawal hash as a unique identifier. bytes32 withdrawalHash = Hashing.hashWithdrawal(_tx); // We do not allow for proving withdrawals against dispute games that have resolved against the favor // of the root claim. - require( - gameProxy.status() != GameStatus.CHALLENGER_WINS, - "OptimismPortal: cannot prove against invalid dispute games" - ); + if (gameProxy.status() == GameStatus.CHALLENGER_WINS) revert InvalidDisputeGame(); // Compute the storage slot of the withdrawal hash in the L2ToL1MessagePasser contract. // Refer to the Solidity documentation for more information on how storage layouts are @@ -302,15 +340,14 @@ contract OptimismPortal2 is Initializable, ResourceMetering, ISemver { // on L2. If this is true, under the assumption that the SecureMerkleTrie does not have // bugs, then we know that this withdrawal was actually triggered on L2 and can therefore // be relayed on L1. - require( + if ( SecureMerkleTrie.verifyInclusionProof({ _key: abi.encode(storageKey), _value: hex"01", _proof: _withdrawalProof, _root: _outputRootProof.messagePasserStorageRoot - }), - "OptimismPortal: invalid withdrawal inclusion proof" - ); + }) == false + ) revert InvalidMerkleProof(); // 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 @@ -346,9 +383,7 @@ contract OptimismPortal2 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(); // Compute the withdrawal hash. bytes32 withdrawalHash = Hashing.hashWithdrawal(_tx); @@ -362,14 +397,50 @@ contract OptimismPortal2 is Initializable, ResourceMetering, ISemver { // Set the l2Sender so contracts know who triggered this withdrawal on L2. 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; @@ -386,6 +457,55 @@ contract OptimismPortal2 is Initializable, ResourceMetering, ISemver { } } + /// @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 /// 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 @@ -405,6 +525,36 @@ contract OptimismPortal2 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. @@ -429,13 +579,38 @@ contract OptimismPortal2 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(IL1Block.setGasPayingToken, (_token, _decimals, _name, _symbol)) + ) + ); + } + /// @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 { @@ -463,15 +638,12 @@ contract OptimismPortal2 is Initializable, ResourceMetering, ISemver { IDisputeGame disputeGameProxy = provenWithdrawal.disputeGameProxy; // The dispute game must not be blacklisted. - require(!disputeGameBlacklist[disputeGameProxy], "OptimismPortal: dispute game has been blacklisted"); + if (disputeGameBlacklist[disputeGameProxy]) revert Blacklisted(); // 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 by proof submitter address yet" - ); + if (provenWithdrawal.timestamp == 0) revert Unproven(); uint64 createdAt = disputeGameProxy.createdAt().raw(); @@ -492,15 +664,12 @@ contract OptimismPortal2 is Initializable, ResourceMetering, ISemver { // A proven withdrawal must wait until the dispute game it was proven against has been // resolved in favor of the root claim (the output proposal). This is to prevent users // from finalizing withdrawals proven against non-finalized output roots. - require( - disputeGameProxy.status() == GameStatus.DEFENDER_WINS, - "OptimismPortal: output proposal has not been validated" - ); + if (disputeGameProxy.status() != GameStatus.DEFENDER_WINS) revert ProposalNotValidated(); // The game type of the dispute game must be the respected game type. This was also checked in // `proveWithdrawalTransaction`, but we check it again in case the respected game type has changed since // the withdrawal was proven. - require(disputeGameProxy.gameType().raw() == respectedGameType.raw(), "OptimismPortal: invalid game type"); + if (disputeGameProxy.gameType().raw() != respectedGameType.raw()) revert InvalidGameType(); // The game must have been created after `respectedGameTypeUpdatedAt`. This is to prevent users from creating // invalid disputes against a deployed game type while the off-chain challenge agents are not watching. @@ -518,7 +687,7 @@ 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"); + if (finalizedWithdrawals[_withdrawalHash]) revert AlreadyFinalized(); } /// @notice External getter for the number of proof submitters for a withdrawal hash. diff --git a/packages/contracts-bedrock/src/L1/OptimismPortalInterop.sol b/packages/contracts-bedrock/src/L1/OptimismPortalInterop.sol new file mode 100644 index 000000000000..fd33c5286ebd --- /dev/null +++ b/packages/contracts-bedrock/src/L1/OptimismPortalInterop.sol @@ -0,0 +1,55 @@ +// SPDX-License-Identifier: MIT +pragma solidity 0.8.15; + +// Contracts +import { OptimismPortal2 } from "src/L1/OptimismPortal2.sol"; +import { L1BlockIsthmus, ConfigType } from "src/L2/L1BlockIsthmus.sol"; + +// Libraries +import { Predeploys } from "src/libraries/Predeploys.sol"; +import { Constants } from "src/libraries/Constants.sol"; +import "src/libraries/PortalErrors.sol"; + +/// @custom:proxied true +/// @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 OptimismPortal2 { + constructor( + uint256 _proofMaturityDelaySeconds, + uint256 _disputeGameFinalityDelaySeconds + ) + OptimismPortal2(_proofMaturityDelaySeconds, _disputeGameFinalityDelaySeconds) + { } + + /// @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(L1BlockIsthmus.setConfig, (_type, _value)) + ) + ); + } +} diff --git a/packages/contracts-bedrock/src/L1/ProtocolVersions.sol b/packages/contracts-bedrock/src/L1/ProtocolVersions.sol index d3f06b27730b..f988d43e1697 100644 --- a/packages/contracts-bedrock/src/L1/ProtocolVersions.sol +++ b/packages/contracts-bedrock/src/L1/ProtocolVersions.sol @@ -2,13 +2,14 @@ pragma solidity 0.8.15; import { OwnableUpgradeable } from "@openzeppelin/contracts-upgradeable/access/OwnableUpgradeable.sol"; -import { ISemver } from "src/universal/ISemver.sol"; +import { ISemver } from "src/universal/interfaces/ISemver.sol"; import { Storage } from "src/libraries/Storage.sol"; import { Constants } from "src/libraries/Constants.sol"; /// @notice ProtocolVersion is a numeric identifier of the protocol version. type ProtocolVersion is uint256; +/// @custom:proxied true /// @title ProtocolVersions /// @notice The ProtocolVersions contract is used to manage superchain protocol version information. contract ProtocolVersions is OwnableUpgradeable, ISemver { @@ -36,8 +37,8 @@ contract ProtocolVersions is OwnableUpgradeable, ISemver { event ConfigUpdate(uint256 indexed version, UpdateType indexed updateType, bytes data); /// @notice Semantic version. - /// @custom:semver 1.0.0 - string public constant version = "1.0.0"; + /// @custom:semver 1.0.1-beta.1 + string public constant version = "1.0.1-beta.1"; /// @notice Constructs the ProtocolVersion contract. Cannot set /// the owner to `address(0)` due to the Ownable contract's diff --git a/packages/contracts-bedrock/src/L1/ResourceMetering.sol b/packages/contracts-bedrock/src/L1/ResourceMetering.sol index feeabe14ee17..196a1573d7e4 100644 --- a/packages/contracts-bedrock/src/L1/ResourceMetering.sol +++ b/packages/contracts-bedrock/src/L1/ResourceMetering.sol @@ -1,7 +1,10 @@ // SPDX-License-Identifier: MIT pragma solidity 0.8.15; +// Contracts import { Initializable } from "@openzeppelin/contracts/proxy/utils/Initializable.sol"; + +// Libraries import { Math } from "@openzeppelin/contracts/utils/math/Math.sol"; import { Burn } from "src/libraries/Burn.sol"; import { Arithmetic } from "src/libraries/Arithmetic.sol"; diff --git a/packages/contracts-bedrock/src/L1/SuperchainConfig.sol b/packages/contracts-bedrock/src/L1/SuperchainConfig.sol index 954e1b5df3c7..51b13936c81b 100644 --- a/packages/contracts-bedrock/src/L1/SuperchainConfig.sol +++ b/packages/contracts-bedrock/src/L1/SuperchainConfig.sol @@ -2,9 +2,10 @@ pragma solidity 0.8.15; import { Initializable } from "@openzeppelin/contracts/proxy/utils/Initializable.sol"; -import { ISemver } from "src/universal/ISemver.sol"; +import { ISemver } from "src/universal/interfaces/ISemver.sol"; import { Storage } from "src/libraries/Storage.sol"; +/// @custom:proxied true /// @custom:audit none This contracts is not yet audited. /// @title SuperchainConfig /// @notice The SuperchainConfig contract is used to manage configuration of global superchain values. @@ -35,8 +36,8 @@ contract SuperchainConfig is Initializable, ISemver { event ConfigUpdate(UpdateType indexed updateType, bytes data); /// @notice Semantic version. - /// @custom:semver 1.1.0 - string public constant version = "1.1.0"; + /// @custom:semver 1.1.1-beta.1 + string public constant version = "1.1.1-beta.1"; /// @notice Constructs the SuperchainConfig contract. constructor() { diff --git a/packages/contracts-bedrock/src/L1/SystemConfig.sol b/packages/contracts-bedrock/src/L1/SystemConfig.sol index 806852c58ccf..032cb3227984 100644 --- a/packages/contracts-bedrock/src/L1/SystemConfig.sol +++ b/packages/contracts-bedrock/src/L1/SystemConfig.sol @@ -1,15 +1,21 @@ // SPDX-License-Identifier: MIT pragma solidity 0.8.15; +// Contracts import { OwnableUpgradeable } from "@openzeppelin/contracts-upgradeable/access/OwnableUpgradeable.sol"; -import { ISemver } from "src/universal/ISemver.sol"; -import { ResourceMetering } from "src/L1/ResourceMetering.sol"; +import { ERC20 } from "@openzeppelin/contracts/token/ERC20/ERC20.sol"; + +// Libraries 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"; +// Interfaces +import { ISemver } from "src/universal/interfaces/ISemver.sol"; +import { IOptimismPortal } from "src/L1/interfaces/IOptimismPortal.sol"; +import { IResourceMetering } from "src/L1/interfaces/IResourceMetering.sol"; + +/// @custom:proxied true /// @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 @@ -115,7 +121,7 @@ contract SystemConfig is OwnableUpgradeable, ISemver, IGasToken { /// @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. - ResourceMetering.ResourceConfig internal _resourceConfig; + IResourceMetering.ResourceConfig internal _resourceConfig; /// @notice Emitted when configuration is updated. /// @param version SystemConfig version. @@ -124,8 +130,10 @@ contract SystemConfig is OwnableUpgradeable, ISemver, IGasToken { event ConfigUpdate(uint256 indexed version, UpdateType indexed updateType, bytes data); /// @notice Semantic version. - /// @custom:semver 2.3.0-beta.1 - string public constant version = "2.3.0-beta.1"; + /// @custom:semver 2.3.0-beta.3 + function version() public pure virtual returns (string memory) { + return "2.3.0-beta.3"; + } /// @notice Constructs the SystemConfig contract. Cannot set /// the owner to `address(0)` due to the Ownable contract's @@ -141,7 +149,7 @@ contract SystemConfig is OwnableUpgradeable, ISemver, IGasToken { _batcherHash: bytes32(0), _gasLimit: 1, _unsafeBlockSigner: address(0), - _config: ResourceMetering.ResourceConfig({ + _config: IResourceMetering.ResourceConfig({ maxResourceLimit: 1, elasticityMultiplier: 1, baseFeeMaxChangeDenominator: 2, @@ -181,7 +189,7 @@ contract SystemConfig is OwnableUpgradeable, ISemver, IGasToken { bytes32 _batcherHash, uint64 _gasLimit, address _unsafeBlockSigner, - ResourceMetering.ResourceConfig memory _config, + IResourceMetering.ResourceConfig memory _config, address _batchInbox, SystemConfig.Addresses memory _addresses ) @@ -305,7 +313,7 @@ contract SystemConfig is OwnableUpgradeable, ISemver, IGasToken { /// 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 { + 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" @@ -315,7 +323,7 @@ contract SystemConfig is OwnableUpgradeable, ISemver, IGasToken { // 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({ + IOptimismPortal(payable(optimismPortal())).setGasPayingToken({ _token: _token, _decimals: GAS_PAYING_TOKEN_DECIMALS, _name: name, @@ -430,7 +438,7 @@ contract SystemConfig is OwnableUpgradeable, ISemver, IGasToken { /// @notice A getter for the resource config. /// Ensures that the struct is returned instead of a tuple. /// @return ResourceConfig - function resourceConfig() external view returns (ResourceMetering.ResourceConfig memory) { + function resourceConfig() external view returns (IResourceMetering.ResourceConfig memory) { return _resourceConfig; } @@ -439,7 +447,7 @@ contract SystemConfig is OwnableUpgradeable, ISemver, IGasToken { /// 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 { + function _setResourceConfig(IResourceMetering.ResourceConfig memory _config) internal { // Min base fee must be less than or equal to max base fee. require( _config.minimumBaseFee <= _config.maximumBaseFee, "SystemConfig: min base fee must be less than max base" diff --git a/packages/contracts-bedrock/src/L1/SystemConfigInterop.sol b/packages/contracts-bedrock/src/L1/SystemConfigInterop.sol new file mode 100644 index 000000000000..ee5b052e04ec --- /dev/null +++ b/packages/contracts-bedrock/src/L1/SystemConfigInterop.sol @@ -0,0 +1,127 @@ +// SPDX-License-Identifier: MIT +pragma solidity 0.8.15; + +// Contracts +import { ERC20 } from "@openzeppelin/contracts/token/ERC20/ERC20.sol"; +import { IOptimismPortalInterop as IOptimismPortal } from "src/L1/interfaces/IOptimismPortalInterop.sol"; +import { SystemConfig } from "src/L1/SystemConfig.sol"; +import { ConfigType } from "src/L2/L1BlockIsthmus.sol"; + +// Libraries +import { Constants } from "src/libraries/Constants.sol"; +import { GasPayingToken } from "src/libraries/GasPayingToken.sol"; +import { StaticConfig } from "src/libraries/StaticConfig.sol"; +import { Storage } from "src/libraries/Storage.sol"; + +// Interfaces +import { IResourceMetering } from "src/L1/interfaces/IResourceMetering.sol"; + +/// @custom:proxied true +/// @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 { + /// @notice Storage slot where the dependency manager address is stored + /// @dev Equal to bytes32(uint256(keccak256("systemconfig.dependencymanager")) - 1) + bytes32 internal constant DEPENDENCY_MANAGER_SLOT = + 0x1708e077affb93e89be2665fb0fb72581be66f84dc00d25fed755ae911905b1c; + + /// @notice Initializer. + /// @param _owner Initial owner of the contract. + /// @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. + /// @param _config Initial ResourceConfig. + /// @param _batchInbox Batch inbox address. An identifier for the op-node to find + /// canonical data. + /// @param _addresses Set of L1 contract addresses. These should be the proxies. + /// @param _dependencyManager The addressed allowed to add/remove from the dependency set + function initialize( + address _owner, + uint32 _basefeeScalar, + uint32 _blobbasefeeScalar, + bytes32 _batcherHash, + uint64 _gasLimit, + address _unsafeBlockSigner, + IResourceMetering.ResourceConfig memory _config, + address _batchInbox, + SystemConfig.Addresses memory _addresses, + address _dependencyManager + ) + external + { + // This method has an initializer modifier, and will revert if already initialized. + initialize({ + _owner: _owner, + _basefeeScalar: _basefeeScalar, + _blobbasefeeScalar: _blobbasefeeScalar, + _batcherHash: _batcherHash, + _gasLimit: _gasLimit, + _unsafeBlockSigner: _unsafeBlockSigner, + _config: _config, + _batchInbox: _batchInbox, + _addresses: _addresses + }); + Storage.setAddress(DEPENDENCY_MANAGER_SLOT, _dependencyManager); + } + + /// @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 }); + IOptimismPortal(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 dependency manager. + /// @param _chainId Chain ID of chain to add. + function addDependency(uint256 _chainId) external { + require(msg.sender == dependencyManager(), "SystemConfig: caller is not the dependency manager"); + IOptimismPortal(payable(optimismPortal())).setConfig( + ConfigType.ADD_DEPENDENCY, StaticConfig.encodeAddDependency(_chainId) + ); + } + + /// @notice Removes a chain from the interop dependency set. Can only be called by the dependency manager + /// @param _chainId Chain ID of the chain to remove. + function removeDependency(uint256 _chainId) external { + require(msg.sender == dependencyManager(), "SystemConfig: caller is not the dependency manager"); + IOptimismPortal(payable(optimismPortal())).setConfig( + ConfigType.REMOVE_DEPENDENCY, StaticConfig.encodeRemoveDependency(_chainId) + ); + } + + /// @notice getter for the dependency manager address + function dependencyManager() public view returns (address) { + return Storage.getAddress(DEPENDENCY_MANAGER_SLOT); + } +} diff --git a/packages/contracts-bedrock/src/L1/interfaces/IDataAvailabilityChallenge.sol b/packages/contracts-bedrock/src/L1/interfaces/IDataAvailabilityChallenge.sol new file mode 100644 index 000000000000..db3c1680e6c5 --- /dev/null +++ b/packages/contracts-bedrock/src/L1/interfaces/IDataAvailabilityChallenge.sol @@ -0,0 +1,94 @@ +// SPDX-License-Identifier: MIT +pragma solidity ^0.8.0; + +enum ChallengeStatus { + Uninitialized, + Active, + Resolved, + Expired +} + +enum CommitmentType { + Keccak256 +} + +struct Challenge { + address challenger; + uint256 lockedBond; + uint256 startBlock; + uint256 resolvedBlock; +} + +interface IDataAvailabilityChallenge { + error BondTooLow(uint256 balance, uint256 required); + error ChallengeExists(); + error ChallengeNotActive(); + error ChallengeNotExpired(); + error ChallengeWindowNotOpen(); + error InvalidCommitmentLength(uint8 commitmentType, uint256 expectedLength, uint256 actualLength); + error InvalidInputData(bytes providedDataCommitment, bytes expectedCommitment); + error InvalidResolverRefundPercentage(uint256 invalidResolverRefundPercentage); + error UnknownCommitmentType(uint8 commitmentType); + error WithdrawalFailed(); + + event BalanceChanged(address account, uint256 balance); + event ChallengeStatusChanged( + uint256 indexed challengedBlockNumber, bytes challengedCommitment, ChallengeStatus status + ); + event Initialized(uint8 version); + event OwnershipTransferred(address indexed previousOwner, address indexed newOwner); + event RequiredBondSizeChanged(uint256 challengeWindow); + event ResolverRefundPercentageChanged(uint256 resolverRefundPercentage); + + receive() external payable; + + function balances(address) external view returns (uint256); + function bondSize() external view returns (uint256); + function challenge(uint256 challengedBlockNumber, bytes memory challengedCommitment) external payable; + function challengeWindow() external view returns (uint256); + function deposit() external payable; + function fixedResolutionCost() external view returns (uint256); + function getChallenge( + uint256 challengedBlockNumber, + bytes memory challengedCommitment + ) + external + view + returns (Challenge memory); + function getChallengeStatus( + uint256 challengedBlockNumber, + bytes memory challengedCommitment + ) + external + view + returns (ChallengeStatus); + function initialize( + address _owner, + uint256 _challengeWindow, + uint256 _resolveWindow, + uint256 _bondSize, + uint256 _resolverRefundPercentage + ) + external; + function owner() external view returns (address); + function renounceOwnership() external; + function resolve( + uint256 challengedBlockNumber, + bytes memory challengedCommitment, + bytes memory resolveData + ) + external; + function resolveWindow() external view returns (uint256); + function resolverRefundPercentage() external view returns (uint256); + function setBondSize(uint256 _bondSize) external; + function setResolverRefundPercentage(uint256 _resolverRefundPercentage) external; + function transferOwnership(address newOwner) external; + function unlockBond(uint256 challengedBlockNumber, bytes memory challengedCommitment) external; + function validateCommitment(bytes memory commitment) external pure; + function variableResolutionCost() external view returns (uint256); + function variableResolutionCostPrecision() external view returns (uint256); + function version() external view returns (string memory); + function withdraw() external; + + function __constructor__() external; +} diff --git a/packages/contracts-bedrock/src/L1/interfaces/IDelayedVetoable.sol b/packages/contracts-bedrock/src/L1/interfaces/IDelayedVetoable.sol new file mode 100644 index 000000000000..0bea81fed34b --- /dev/null +++ b/packages/contracts-bedrock/src/L1/interfaces/IDelayedVetoable.sol @@ -0,0 +1,23 @@ +// SPDX-License-Identifier: MIT +pragma solidity ^0.8.0; + +interface IDelayedVetoable { + error ForwardingEarly(); + error Unauthorized(address expected, address actual); + + event DelayActivated(uint256 delay); + event Forwarded(bytes32 indexed callHash, bytes data); + event Initiated(bytes32 indexed callHash, bytes data); + event Vetoed(bytes32 indexed callHash, bytes data); + + fallback() external; + + function delay() external returns (uint256 delay_); + function initiator() external returns (address initiator_); + function queuedAt(bytes32 callHash) external returns (uint256 queuedAt_); + function target() external returns (address target_); + function version() external view returns (string memory); + function vetoer() external returns (address vetoer_); + + function __constructor__(address vetoer_, address initiator_, address target_, uint256 operatingDelay_) external; +} diff --git a/packages/contracts-bedrock/src/L1/interfaces/IL1CrossDomainMessenger.sol b/packages/contracts-bedrock/src/L1/interfaces/IL1CrossDomainMessenger.sol new file mode 100644 index 000000000000..bb92e723c7c3 --- /dev/null +++ b/packages/contracts-bedrock/src/L1/interfaces/IL1CrossDomainMessenger.sol @@ -0,0 +1,21 @@ +// SPDX-License-Identifier: MIT +pragma solidity ^0.8.0; + +import { ICrossDomainMessenger } from "src/universal/interfaces/ICrossDomainMessenger.sol"; +import { ISuperchainConfig } from "src/L1/interfaces/ISuperchainConfig.sol"; +import { IOptimismPortal } from "src/L1/interfaces/IOptimismPortal.sol"; +import { ISystemConfig } from "src/L1/interfaces/ISystemConfig.sol"; + +interface IL1CrossDomainMessenger is ICrossDomainMessenger { + function PORTAL() external view returns (address); + function initialize( + ISuperchainConfig _superchainConfig, + IOptimismPortal _portal, + ISystemConfig _systemConfig + ) + external; + function portal() external view returns (address); + function superchainConfig() external view returns (address); + function systemConfig() external view returns (address); + function version() external view returns (string memory); +} diff --git a/packages/contracts-bedrock/src/L1/interfaces/IL1ERC721Bridge.sol b/packages/contracts-bedrock/src/L1/interfaces/IL1ERC721Bridge.sol new file mode 100644 index 000000000000..fd64f40fe5ac --- /dev/null +++ b/packages/contracts-bedrock/src/L1/interfaces/IL1ERC721Bridge.sol @@ -0,0 +1,40 @@ +// SPDX-License-Identifier: MIT +pragma solidity ^0.8.0; + +import { IERC721Bridge } from "src/universal/interfaces/IERC721Bridge.sol"; +import { ICrossDomainMessenger } from "src/universal/interfaces/ICrossDomainMessenger.sol"; +import { ISuperchainConfig } from "src/L1/interfaces/ISuperchainConfig.sol"; + +interface IL1ERC721Bridge is IERC721Bridge { + function bridgeERC721( + address _localToken, + address _remoteToken, + uint256 _tokenId, + uint32 _minGasLimit, + bytes memory _extraData + ) + external; + function bridgeERC721To( + address _localToken, + address _remoteToken, + address _to, + uint256 _tokenId, + uint32 _minGasLimit, + bytes memory _extraData + ) + external; + function deposits(address, address, uint256) external view returns (bool); + function finalizeBridgeERC721( + address _localToken, + address _remoteToken, + address _from, + address _to, + uint256 _tokenId, + bytes memory _extraData + ) + external; + function initialize(ICrossDomainMessenger _messenger, ISuperchainConfig _superchainConfig) external; + function paused() external view returns (bool); + function superchainConfig() external view returns (ISuperchainConfig); + function version() external view returns (string memory); +} diff --git a/packages/contracts-bedrock/src/L1/interfaces/IL1StandardBridge.sol b/packages/contracts-bedrock/src/L1/interfaces/IL1StandardBridge.sol new file mode 100644 index 000000000000..119c8c1f1d8e --- /dev/null +++ b/packages/contracts-bedrock/src/L1/interfaces/IL1StandardBridge.sol @@ -0,0 +1,75 @@ +// SPDX-License-Identifier: MIT +pragma solidity ^0.8.0; + +import { IStandardBridge } from "src/universal/interfaces/IStandardBridge.sol"; +import { ICrossDomainMessenger } from "src/universal/interfaces/ICrossDomainMessenger.sol"; +import { ISuperchainConfig } from "src/L1/interfaces/ISuperchainConfig.sol"; +import { ISystemConfig } from "src/L1/interfaces/ISystemConfig.sol"; + +interface IL1StandardBridge is IStandardBridge { + event ERC20DepositInitiated( + address indexed l1Token, + address indexed l2Token, + address indexed from, + address to, + uint256 amount, + bytes extraData + ); + event ERC20WithdrawalFinalized( + address indexed l1Token, + address indexed l2Token, + address indexed from, + address to, + uint256 amount, + bytes extraData + ); + event ETHDepositInitiated(address indexed from, address indexed to, uint256 amount, bytes extraData); + event ETHWithdrawalFinalized(address indexed from, address indexed to, uint256 amount, bytes extraData); + + function depositERC20( + address _l1Token, + address _l2Token, + uint256 _amount, + uint32 _minGasLimit, + bytes memory _extraData + ) + external; + function depositERC20To( + address _l1Token, + address _l2Token, + address _to, + uint256 _amount, + uint32 _minGasLimit, + bytes memory _extraData + ) + external; + function depositETH(uint32 _minGasLimit, bytes memory _extraData) external payable; + function depositETHTo(address _to, uint32 _minGasLimit, bytes memory _extraData) external payable; + function finalizeERC20Withdrawal( + address _l1Token, + address _l2Token, + address _from, + address _to, + uint256 _amount, + bytes memory _extraData + ) + external; + function finalizeETHWithdrawal( + address _from, + address _to, + uint256 _amount, + bytes memory _extraData + ) + external + payable; + function initialize( + ICrossDomainMessenger _messenger, + ISuperchainConfig _superchainConfig, + ISystemConfig _systemConfig + ) + external; + function l2TokenBridge() external view returns (address); + function superchainConfig() external view returns (ISuperchainConfig); + function systemConfig() external view returns (ISystemConfig); + function version() external view returns (string memory); +} diff --git a/packages/contracts-bedrock/src/L1/interfaces/IL2OutputOracle.sol b/packages/contracts-bedrock/src/L1/interfaces/IL2OutputOracle.sol new file mode 100644 index 000000000000..408c53c85156 --- /dev/null +++ b/packages/contracts-bedrock/src/L1/interfaces/IL2OutputOracle.sol @@ -0,0 +1,55 @@ +// SPDX-License-Identifier: MIT +pragma solidity ^0.8.0; + +import { Types } from "src/libraries/Types.sol"; + +interface IL2OutputOracle { + event Initialized(uint8 version); + event OutputProposed( + bytes32 indexed outputRoot, uint256 indexed l2OutputIndex, uint256 indexed l2BlockNumber, uint256 l1Timestamp + ); + event OutputsDeleted(uint256 indexed prevNextOutputIndex, uint256 indexed newNextOutputIndex); + + function CHALLENGER() external view returns (address); + function FINALIZATION_PERIOD_SECONDS() external view returns (uint256); + function L2_BLOCK_TIME() external view returns (uint256); + function PROPOSER() external view returns (address); + function SUBMISSION_INTERVAL() external view returns (uint256); + function challenger() external view returns (address); + function computeL2Timestamp(uint256 _l2BlockNumber) external view returns (uint256); + function deleteL2Outputs(uint256 _l2OutputIndex) external; + function finalizationPeriodSeconds() external view returns (uint256); + function getL2Output(uint256 _l2OutputIndex) external view returns (Types.OutputProposal memory); + function getL2OutputAfter(uint256 _l2BlockNumber) external view returns (Types.OutputProposal memory); + function getL2OutputIndexAfter(uint256 _l2BlockNumber) external view returns (uint256); + function initialize( + uint256 _submissionInterval, + uint256 _l2BlockTime, + uint256 _startingBlockNumber, + uint256 _startingTimestamp, + address _proposer, + address _challenger, + uint256 _finalizationPeriodSeconds + ) + external; + function l2BlockTime() external view returns (uint256); + function latestBlockNumber() external view returns (uint256); + function latestOutputIndex() external view returns (uint256); + function nextBlockNumber() external view returns (uint256); + function nextOutputIndex() external view returns (uint256); + function proposeL2Output( + bytes32 _outputRoot, + uint256 _l2BlockNumber, + bytes32 _l1BlockHash, + uint256 _l1BlockNumber + ) + external + payable; + function proposer() external view returns (address); + function startingBlockNumber() external view returns (uint256); + function startingTimestamp() external view returns (uint256); + function submissionInterval() external view returns (uint256); + function version() external view returns (string memory); + + function __constructor__() external; +} diff --git a/packages/contracts-bedrock/src/L1/interfaces/IOptimismPortal.sol b/packages/contracts-bedrock/src/L1/interfaces/IOptimismPortal.sol new file mode 100644 index 000000000000..e80bad00b910 --- /dev/null +++ b/packages/contracts-bedrock/src/L1/interfaces/IOptimismPortal.sol @@ -0,0 +1,85 @@ +// SPDX-License-Identifier: MIT +pragma solidity ^0.8.0; + +import { Types } from "src/libraries/Types.sol"; +import { ISystemConfig } from "src/L1/interfaces/ISystemConfig.sol"; +import { ISuperchainConfig } from "src/L1/interfaces/ISuperchainConfig.sol"; +import { IL2OutputOracle } from "src/L1/interfaces/IL2OutputOracle.sol"; + +interface IOptimismPortal { + error BadTarget(); + error CallPaused(); + error ContentLengthMismatch(); + error EmptyItem(); + error GasEstimation(); + error InvalidDataRemainder(); + error InvalidHeader(); + error LargeCalldata(); + error NoValue(); + error NonReentrant(); + error OnlyCustomGasToken(); + error OutOfGas(); + error SmallGasLimit(); + error TransferFailed(); + error Unauthorized(); + error UnexpectedList(); + error UnexpectedString(); + + event Initialized(uint8 version); + event TransactionDeposited(address indexed from, address indexed to, uint256 indexed version, bytes opaqueData); + event WithdrawalFinalized(bytes32 indexed withdrawalHash, bool success); + event WithdrawalProven(bytes32 indexed withdrawalHash, address indexed from, address indexed to); + + receive() external payable; + + function balance() external view returns (uint256); + function depositERC20Transaction( + address _to, + uint256 _mint, + uint256 _value, + uint64 _gasLimit, + bool _isCreation, + bytes memory _data + ) + external; + function depositTransaction( + address _to, + uint256 _value, + uint64 _gasLimit, + bool _isCreation, + bytes memory _data + ) + external + payable; + function donateETH() external payable; + function finalizeWithdrawalTransaction(Types.WithdrawalTransaction memory _tx) external; + function finalizedWithdrawals(bytes32) external view returns (bool); + function guardian() external view returns (address); + function initialize( + IL2OutputOracle _l2Oracle, + ISystemConfig _systemConfig, + ISuperchainConfig _superchainConfig + ) + external; + function isOutputFinalized(uint256 _l2OutputIndex) external view returns (bool); + function l2Oracle() external view returns (IL2OutputOracle); + function l2Sender() external view returns (address); + function minimumGasLimit(uint64 _byteCount) external pure returns (uint64); + function params() external view returns (uint128 prevBaseFee, uint64 prevBoughtGas, uint64 prevBlockNum); + function paused() external view returns (bool paused_); + function proveWithdrawalTransaction( + Types.WithdrawalTransaction memory _tx, + uint256 _l2OutputIndex, + Types.OutputRootProof memory _outputRootProof, + bytes[] memory _withdrawalProof + ) + external; + function provenWithdrawals(bytes32) + external + view + returns (bytes32 outputRoot, uint128 timestamp, uint128 l2OutputIndex); + function setGasPayingToken(address _token, uint8 _decimals, bytes32 _name, bytes32 _symbol) external; + function superchainConfig() external view returns (ISuperchainConfig); + function systemConfig() external view returns (ISystemConfig); + function version() external pure returns (string memory); +} diff --git a/packages/contracts-bedrock/src/L1/interfaces/IOptimismPortal2.sol b/packages/contracts-bedrock/src/L1/interfaces/IOptimismPortal2.sol new file mode 100644 index 000000000000..551bd2832b05 --- /dev/null +++ b/packages/contracts-bedrock/src/L1/interfaces/IOptimismPortal2.sol @@ -0,0 +1,118 @@ +// SPDX-License-Identifier: MIT +pragma solidity ^0.8.0; + +import { Types } from "src/libraries/Types.sol"; +import { GameType, Timestamp } from "src/dispute/lib/LibUDT.sol"; +import { IDisputeGame } from "src/dispute/interfaces/IDisputeGame.sol"; +import { IDisputeGameFactory } from "src/dispute/interfaces/IDisputeGameFactory.sol"; +import { ISystemConfig } from "src/L1/interfaces/ISystemConfig.sol"; +import { ISuperchainConfig } from "src/L1/interfaces/ISuperchainConfig.sol"; + +interface IOptimismPortal2 { + error AlreadyFinalized(); + error BadTarget(); + error Blacklisted(); + error CallPaused(); + error ContentLengthMismatch(); + error EmptyItem(); + error GasEstimation(); + error InvalidDataRemainder(); + error InvalidDisputeGame(); + error InvalidGameType(); + error InvalidHeader(); + error InvalidMerkleProof(); + error InvalidProof(); + error LargeCalldata(); + error NoValue(); + error NonReentrant(); + error OnlyCustomGasToken(); + error OutOfGas(); + error ProposalNotValidated(); + error SmallGasLimit(); + error TransferFailed(); + error Unauthorized(); + error UnexpectedList(); + error UnexpectedString(); + error Unproven(); + + event DisputeGameBlacklisted(IDisputeGame indexed disputeGame); + event Initialized(uint8 version); + event RespectedGameTypeSet(GameType indexed newGameType, Timestamp indexed updatedAt); + event TransactionDeposited(address indexed from, address indexed to, uint256 indexed version, bytes opaqueData); + 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); + + receive() external payable; + + function balance() external view returns (uint256); + function blacklistDisputeGame(IDisputeGame _disputeGame) external; + function checkWithdrawal(bytes32 _withdrawalHash, address _proofSubmitter) external view; + function depositERC20Transaction( + address _to, + uint256 _mint, + uint256 _value, + uint64 _gasLimit, + bool _isCreation, + bytes memory _data + ) + external; + function depositTransaction( + address _to, + uint256 _value, + uint64 _gasLimit, + bool _isCreation, + bytes memory _data + ) + external + payable; + function disputeGameBlacklist(IDisputeGame) external view returns (bool); + function disputeGameFactory() external view returns (IDisputeGameFactory); + function disputeGameFinalityDelaySeconds() external view returns (uint256); + function donateETH() external payable; + function finalizeWithdrawalTransaction(Types.WithdrawalTransaction memory _tx) external; + function finalizeWithdrawalTransactionExternalProof( + Types.WithdrawalTransaction memory _tx, + address _proofSubmitter + ) + external; + function finalizedWithdrawals(bytes32) external view returns (bool); + function guardian() external view returns (address); + function initialize( + IDisputeGameFactory _disputeGameFactory, + ISystemConfig _systemConfig, + ISuperchainConfig _superchainConfig, + GameType _initialRespectedGameType + ) + external; + function l2Sender() external view returns (address); + function minimumGasLimit(uint64 _byteCount) external pure returns (uint64); + function numProofSubmitters(bytes32 _withdrawalHash) external view returns (uint256); + function params() external view returns (uint128 prevBaseFee, uint64 prevBoughtGas, uint64 prevBlockNum); + function paused() external view returns (bool); + function proofMaturityDelaySeconds() external view returns (uint256); + function proofSubmitters(bytes32, uint256) external view returns (address); + function proveWithdrawalTransaction( + Types.WithdrawalTransaction memory _tx, + uint256 _disputeGameIndex, + Types.OutputRootProof memory _outputRootProof, + bytes[] memory _withdrawalProof + ) + external; + function provenWithdrawals( + bytes32, + address + ) + external + view + returns (IDisputeGame disputeGameProxy, uint64 timestamp); + function respectedGameType() external view returns (GameType); + function respectedGameTypeUpdatedAt() external view returns (uint64); + function setGasPayingToken(address _token, uint8 _decimals, bytes32 _name, bytes32 _symbol) external; + function setRespectedGameType(GameType _gameType) external; + function superchainConfig() external view returns (ISuperchainConfig); + function systemConfig() external view returns (ISystemConfig); + function version() external pure returns (string memory); + + function __constructor__(uint256 _proofMaturityDelaySeconds, uint256 _disputeGameFinalityDelaySeconds) external; +} diff --git a/packages/contracts-bedrock/src/L1/interfaces/IOptimismPortalInterop.sol b/packages/contracts-bedrock/src/L1/interfaces/IOptimismPortalInterop.sol new file mode 100644 index 000000000000..682518897362 --- /dev/null +++ b/packages/contracts-bedrock/src/L1/interfaces/IOptimismPortalInterop.sol @@ -0,0 +1,120 @@ +// SPDX-License-Identifier: MIT +pragma solidity ^0.8.0; + +import { Types } from "src/libraries/Types.sol"; +import { GameType, Timestamp } from "src/dispute/lib/LibUDT.sol"; +import { IDisputeGame } from "src/dispute/interfaces/IDisputeGame.sol"; +import { IDisputeGameFactory } from "src/dispute/interfaces/IDisputeGameFactory.sol"; +import { ISystemConfig } from "src/L1/interfaces/ISystemConfig.sol"; +import { ISuperchainConfig } from "src/L1/interfaces/ISuperchainConfig.sol"; +import { ConfigType } from "src/L2/L1BlockIsthmus.sol"; + +interface IOptimismPortalInterop { + error AlreadyFinalized(); + error BadTarget(); + error Blacklisted(); + error CallPaused(); + error ContentLengthMismatch(); + error EmptyItem(); + error GasEstimation(); + error InvalidDataRemainder(); + error InvalidDisputeGame(); + error InvalidGameType(); + error InvalidHeader(); + error InvalidMerkleProof(); + error InvalidProof(); + error LargeCalldata(); + error NoValue(); + error NonReentrant(); + error OnlyCustomGasToken(); + error OutOfGas(); + error ProposalNotValidated(); + error SmallGasLimit(); + error TransferFailed(); + error Unauthorized(); + error UnexpectedList(); + error UnexpectedString(); + error Unproven(); + + event DisputeGameBlacklisted(IDisputeGame indexed disputeGame); + event Initialized(uint8 version); + event RespectedGameTypeSet(GameType indexed newGameType, Timestamp indexed updatedAt); + event TransactionDeposited(address indexed from, address indexed to, uint256 indexed version, bytes opaqueData); + 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); + + receive() external payable; + + function balance() external view returns (uint256); + function blacklistDisputeGame(IDisputeGame _disputeGame) external; + function checkWithdrawal(bytes32 _withdrawalHash, address _proofSubmitter) external view; + function depositERC20Transaction( + address _to, + uint256 _mint, + uint256 _value, + uint64 _gasLimit, + bool _isCreation, + bytes memory _data + ) + external; + function depositTransaction( + address _to, + uint256 _value, + uint64 _gasLimit, + bool _isCreation, + bytes memory _data + ) + external + payable; + function disputeGameBlacklist(IDisputeGame) external view returns (bool); + function disputeGameFactory() external view returns (IDisputeGameFactory); + function disputeGameFinalityDelaySeconds() external view returns (uint256); + function donateETH() external payable; + function finalizeWithdrawalTransaction(Types.WithdrawalTransaction memory _tx) external; + function finalizeWithdrawalTransactionExternalProof( + Types.WithdrawalTransaction memory _tx, + address _proofSubmitter + ) + external; + function finalizedWithdrawals(bytes32) external view returns (bool); + function guardian() external view returns (address); + function initialize( + IDisputeGameFactory _disputeGameFactory, + ISystemConfig _systemConfig, + ISuperchainConfig _superchainConfig, + GameType _initialRespectedGameType + ) + external; + function l2Sender() external view returns (address); + function minimumGasLimit(uint64 _byteCount) external pure returns (uint64); + function numProofSubmitters(bytes32 _withdrawalHash) external view returns (uint256); + function params() external view returns (uint128 prevBaseFee, uint64 prevBoughtGas, uint64 prevBlockNum); + function paused() external view returns (bool); + function proofMaturityDelaySeconds() external view returns (uint256); + function proofSubmitters(bytes32, uint256) external view returns (address); + function proveWithdrawalTransaction( + Types.WithdrawalTransaction memory _tx, + uint256 _disputeGameIndex, + Types.OutputRootProof memory _outputRootProof, + bytes[] memory _withdrawalProof + ) + external; + function provenWithdrawals( + bytes32, + address + ) + external + view + returns (IDisputeGame disputeGameProxy, uint64 timestamp); + function respectedGameType() external view returns (GameType); + function respectedGameTypeUpdatedAt() external view returns (uint64); + function setConfig(ConfigType _type, bytes memory _value) external; + function setGasPayingToken(address _token, uint8 _decimals, bytes32 _name, bytes32 _symbol) external; + function setRespectedGameType(GameType _gameType) external; + function superchainConfig() external view returns (ISuperchainConfig); + function systemConfig() external view returns (ISystemConfig); + function version() external pure returns (string memory); + + function __constructor__(uint256 _proofMaturityDelaySeconds, uint256 _disputeGameFinalityDelaySeconds) external; +} diff --git a/packages/contracts-bedrock/src/L1/interfaces/IProtocolVersions.sol b/packages/contracts-bedrock/src/L1/interfaces/IProtocolVersions.sol new file mode 100644 index 000000000000..aa2de51d4846 --- /dev/null +++ b/packages/contracts-bedrock/src/L1/interfaces/IProtocolVersions.sol @@ -0,0 +1,30 @@ +// SPDX-License-Identifier: MIT +pragma solidity ^0.8.0; + +type ProtocolVersion is uint256; + +interface IProtocolVersions { + enum UpdateType { + REQUIRED_PROTOCOL_VERSION, + RECOMMENDED_PROTOCOL_VERSION + } + + event ConfigUpdate(uint256 indexed version, UpdateType indexed updateType, bytes data); + event Initialized(uint8 version); + event OwnershipTransferred(address indexed previousOwner, address indexed newOwner); + + function RECOMMENDED_SLOT() external view returns (bytes32); + function REQUIRED_SLOT() external view returns (bytes32); + function VERSION() external view returns (uint256); + function initialize(address _owner, ProtocolVersion _required, ProtocolVersion _recommended) external; + function owner() external view returns (address); + function recommended() external view returns (ProtocolVersion out_); + function renounceOwnership() external; + function required() external view returns (ProtocolVersion out_); + function setRecommended(ProtocolVersion _recommended) external; + function setRequired(ProtocolVersion _required) external; + function transferOwnership(address newOwner) external; + function version() external view returns (string memory); + + function __constructor__() external; +} diff --git a/packages/contracts-bedrock/src/L1/interfaces/IResourceMetering.sol b/packages/contracts-bedrock/src/L1/interfaces/IResourceMetering.sol new file mode 100644 index 000000000000..4a4ccc133bb8 --- /dev/null +++ b/packages/contracts-bedrock/src/L1/interfaces/IResourceMetering.sol @@ -0,0 +1,25 @@ +// SPDX-License-Identifier: MIT +pragma solidity ^0.8.0; + +interface IResourceMetering { + struct ResourceParams { + uint128 prevBaseFee; + uint64 prevBoughtGas; + uint64 prevBlockNum; + } + + struct ResourceConfig { + uint32 maxResourceLimit; + uint8 elasticityMultiplier; + uint8 baseFeeMaxChangeDenominator; + uint32 minimumBaseFee; + uint32 systemTxMaxGas; + uint128 maximumBaseFee; + } + + error OutOfGas(); + + event Initialized(uint8 version); + + function params() external view returns (uint128 prevBaseFee, uint64 prevBoughtGas, uint64 prevBlockNum); +} diff --git a/packages/contracts-bedrock/src/L1/interfaces/ISuperchainConfig.sol b/packages/contracts-bedrock/src/L1/interfaces/ISuperchainConfig.sol new file mode 100644 index 000000000000..dc83893958b0 --- /dev/null +++ b/packages/contracts-bedrock/src/L1/interfaces/ISuperchainConfig.sol @@ -0,0 +1,24 @@ +// SPDX-License-Identifier: MIT +pragma solidity ^0.8.0; + +interface ISuperchainConfig { + enum UpdateType { + GUARDIAN + } + + event ConfigUpdate(UpdateType indexed updateType, bytes data); + event Initialized(uint8 version); + event Paused(string identifier); + event Unpaused(); + + function GUARDIAN_SLOT() external view returns (bytes32); + function PAUSED_SLOT() external view returns (bytes32); + function guardian() external view returns (address guardian_); + function initialize(address _guardian, bool _paused) external; + function pause(string memory _identifier) external; + function paused() external view returns (bool paused_); + function unpause() external; + function version() external view returns (string memory); + + function __constructor__() external; +} diff --git a/packages/contracts-bedrock/src/L1/interfaces/ISystemConfig.sol b/packages/contracts-bedrock/src/L1/interfaces/ISystemConfig.sol new file mode 100644 index 000000000000..59ae98668cf0 --- /dev/null +++ b/packages/contracts-bedrock/src/L1/interfaces/ISystemConfig.sol @@ -0,0 +1,83 @@ +// SPDX-License-Identifier: MIT +pragma solidity ^0.8.0; + +import { IResourceMetering } from "src/L1/interfaces/IResourceMetering.sol"; + +interface ISystemConfig { + enum UpdateType { + BATCHER, + GAS_CONFIG, + GAS_LIMIT, + UNSAFE_BLOCK_SIGNER + } + + struct Addresses { + address l1CrossDomainMessenger; + address l1ERC721Bridge; + address l1StandardBridge; + address disputeGameFactory; + address optimismPortal; + address optimismMintableERC20Factory; + address gasPayingToken; + } + + event ConfigUpdate(uint256 indexed version, UpdateType indexed updateType, bytes data); + event Initialized(uint8 version); + event OwnershipTransferred(address indexed previousOwner, address indexed newOwner); + + function BATCH_INBOX_SLOT() external view returns (bytes32); + function DISPUTE_GAME_FACTORY_SLOT() external view returns (bytes32); + function L1_CROSS_DOMAIN_MESSENGER_SLOT() external view returns (bytes32); + function L1_ERC_721_BRIDGE_SLOT() external view returns (bytes32); + function L1_STANDARD_BRIDGE_SLOT() external view returns (bytes32); + function OPTIMISM_MINTABLE_ERC20_FACTORY_SLOT() external view returns (bytes32); + function OPTIMISM_PORTAL_SLOT() external view returns (bytes32); + function START_BLOCK_SLOT() external view returns (bytes32); + function UNSAFE_BLOCK_SIGNER_SLOT() external view returns (bytes32); + function VERSION() external view returns (uint256); + function basefeeScalar() external view returns (uint32); + function batchInbox() external view returns (address addr_); + function batcherHash() external view returns (bytes32); + function blobbasefeeScalar() external view returns (uint32); + function disputeGameFactory() external view returns (address addr_); + function gasLimit() external view returns (uint64); + function gasPayingToken() external view returns (address addr_, uint8 decimals_); + function gasPayingTokenName() external view returns (string memory name_); + function gasPayingTokenSymbol() external view returns (string memory symbol_); + function initialize( + address _owner, + uint32 _basefeeScalar, + uint32 _blobbasefeeScalar, + bytes32 _batcherHash, + uint64 _gasLimit, + address _unsafeBlockSigner, + IResourceMetering.ResourceConfig memory _config, + address _batchInbox, + Addresses memory _addresses + ) + external; + function isCustomGasToken() external view returns (bool); + function l1CrossDomainMessenger() external view returns (address addr_); + function l1ERC721Bridge() external view returns (address addr_); + function l1StandardBridge() external view returns (address addr_); + function maximumGasLimit() external pure returns (uint64); + function minimumGasLimit() external view returns (uint64); + function optimismMintableERC20Factory() external view returns (address addr_); + function optimismPortal() external view returns (address addr_); + function overhead() external view returns (uint256); + function owner() external view returns (address); + function renounceOwnership() external; + function resourceConfig() external view returns (IResourceMetering.ResourceConfig memory); + function scalar() external view returns (uint256); + function setBatcherHash(bytes32 _batcherHash) external; + function setGasConfig(uint256 _overhead, uint256 _scalar) external; + function setGasConfigEcotone(uint32 _basefeeScalar, uint32 _blobbasefeeScalar) external; + function setGasLimit(uint64 _gasLimit) external; + function setUnsafeBlockSigner(address _unsafeBlockSigner) external; + function startBlock() external view returns (uint256 startBlock_); + function transferOwnership(address newOwner) external; + function unsafeBlockSigner() external view returns (address addr_); + function version() external pure returns (string memory); + + function __constructor__() external; +} diff --git a/packages/contracts-bedrock/src/L1/interfaces/ISystemConfigInterop.sol b/packages/contracts-bedrock/src/L1/interfaces/ISystemConfigInterop.sol new file mode 100644 index 000000000000..cffa30dd3efc --- /dev/null +++ b/packages/contracts-bedrock/src/L1/interfaces/ISystemConfigInterop.sol @@ -0,0 +1,82 @@ +// SPDX-License-Identifier: MIT +pragma solidity ^0.8.0; + +import { ISystemConfig } from "src/L1/interfaces/ISystemConfig.sol"; +import { IResourceMetering } from "src/L1/interfaces/IResourceMetering.sol"; + +interface ISystemConfigInterop { + event ConfigUpdate(uint256 indexed version, ISystemConfig.UpdateType indexed updateType, bytes data); + event Initialized(uint8 version); + event OwnershipTransferred(address indexed previousOwner, address indexed newOwner); + + function BATCH_INBOX_SLOT() external view returns (bytes32); + function DISPUTE_GAME_FACTORY_SLOT() external view returns (bytes32); + function L1_CROSS_DOMAIN_MESSENGER_SLOT() external view returns (bytes32); + function L1_ERC_721_BRIDGE_SLOT() external view returns (bytes32); + function L1_STANDARD_BRIDGE_SLOT() external view returns (bytes32); + function OPTIMISM_MINTABLE_ERC20_FACTORY_SLOT() external view returns (bytes32); + function OPTIMISM_PORTAL_SLOT() external view returns (bytes32); + function START_BLOCK_SLOT() external view returns (bytes32); + function UNSAFE_BLOCK_SIGNER_SLOT() external view returns (bytes32); + function VERSION() external view returns (uint256); + function basefeeScalar() external view returns (uint32); + function batchInbox() external view returns (address addr_); + function batcherHash() external view returns (bytes32); + function blobbasefeeScalar() external view returns (uint32); + function disputeGameFactory() external view returns (address addr_); + function gasLimit() external view returns (uint64); + function gasPayingToken() external view returns (address addr_, uint8 decimals_); + function gasPayingTokenName() external view returns (string memory name_); + function gasPayingTokenSymbol() external view returns (string memory symbol_); + function initialize( + address _owner, + uint32 _basefeeScalar, + uint32 _blobbasefeeScalar, + bytes32 _batcherHash, + uint64 _gasLimit, + address _unsafeBlockSigner, + IResourceMetering.ResourceConfig memory _config, + address _batchInbox, + ISystemConfig.Addresses memory _addresses + ) + external; + function isCustomGasToken() external view returns (bool); + function l1CrossDomainMessenger() external view returns (address addr_); + function l1ERC721Bridge() external view returns (address addr_); + function l1StandardBridge() external view returns (address addr_); + function maximumGasLimit() external pure returns (uint64); + function minimumGasLimit() external view returns (uint64); + function optimismMintableERC20Factory() external view returns (address addr_); + function optimismPortal() external view returns (address addr_); + function overhead() external view returns (uint256); + function owner() external view returns (address); + function renounceOwnership() external; + function resourceConfig() external view returns (IResourceMetering.ResourceConfig memory); + function scalar() external view returns (uint256); + function setBatcherHash(bytes32 _batcherHash) external; + function setGasConfig(uint256 _overhead, uint256 _scalar) external; + function setGasConfigEcotone(uint32 _basefeeScalar, uint32 _blobbasefeeScalar) external; + function setGasLimit(uint64 _gasLimit) external; + function setUnsafeBlockSigner(address _unsafeBlockSigner) external; + function startBlock() external view returns (uint256 startBlock_); + function transferOwnership(address newOwner) external; + function unsafeBlockSigner() external view returns (address addr_); + + function addDependency(uint256 _chainId) external; + function removeDependency(uint256 _chainId) external; + function dependencyManager() external view returns (address); + function initialize( + address _owner, + uint32 _basefeeScalar, + uint32 _blobbasefeeScalar, + bytes32 _batcherHash, + uint64 _gasLimit, + address _unsafeBlockSigner, + IResourceMetering.ResourceConfig memory _config, + address _batchInbox, + ISystemConfig.Addresses memory _addresses, + address _dependencyManager + ) + external; + function version() external pure returns (string memory); +} diff --git a/packages/contracts-bedrock/src/L2/BaseFeeVault.sol b/packages/contracts-bedrock/src/L2/BaseFeeVault.sol index e5313d93ace4..2ae63efd599b 100644 --- a/packages/contracts-bedrock/src/L2/BaseFeeVault.sol +++ b/packages/contracts-bedrock/src/L2/BaseFeeVault.sol @@ -1,17 +1,17 @@ // SPDX-License-Identifier: MIT pragma solidity 0.8.15; -import { ISemver } from "src/universal/ISemver.sol"; +import { ISemver } from "src/universal/interfaces/ISemver.sol"; import { FeeVault } from "src/universal/FeeVault.sol"; -/// @custom:proxied +/// @custom:proxied true /// @custom:predeploy 0x4200000000000000000000000000000000000019 /// @title BaseFeeVault /// @notice The BaseFeeVault accumulates the base fee that is paid by transactions. contract BaseFeeVault is FeeVault, ISemver { /// @notice Semantic version. - /// @custom:semver 1.4.1 - string public constant version = "1.4.1"; + /// @custom:semver 1.5.0-beta.2 + string public constant version = "1.5.0-beta.2"; /// @notice Constructs the BaseFeeVault contract. /// @param _recipient Wallet that will receive the fees. diff --git a/packages/contracts-bedrock/src/L2/CrossDomainOwnable2.sol b/packages/contracts-bedrock/src/L2/CrossDomainOwnable2.sol index ce14229c9b51..0711daffce3e 100644 --- a/packages/contracts-bedrock/src/L2/CrossDomainOwnable2.sol +++ b/packages/contracts-bedrock/src/L2/CrossDomainOwnable2.sol @@ -1,10 +1,15 @@ // SPDX-License-Identifier: MIT pragma solidity ^0.8.0; -import { Predeploys } from "src/libraries/Predeploys.sol"; -import { L2CrossDomainMessenger } from "src/L2/L2CrossDomainMessenger.sol"; +// Contracts import { Ownable } from "@openzeppelin/contracts/access/Ownable.sol"; +// Libraries +import { Predeploys } from "src/libraries/Predeploys.sol"; + +// Interfaces +import { IL2CrossDomainMessenger } from "src/L2/interfaces/IL2CrossDomainMessenger.sol"; + /// @title CrossDomainOwnable2 /// @notice This contract extends the OpenZeppelin `Ownable` contract for L2 contracts to be owned /// by contracts on L1. Note that this contract is meant to be used with systems that use @@ -15,7 +20,7 @@ abstract contract CrossDomainOwnable2 is Ownable { /// `xDomainMessageSender` is the owner of the contract. This value is set to the caller /// of the L1CrossDomainMessenger. function _checkOwner() internal view override { - L2CrossDomainMessenger messenger = L2CrossDomainMessenger(Predeploys.L2_CROSS_DOMAIN_MESSENGER); + IL2CrossDomainMessenger messenger = IL2CrossDomainMessenger(Predeploys.L2_CROSS_DOMAIN_MESSENGER); require(msg.sender == address(messenger), "CrossDomainOwnable2: caller is not the messenger"); diff --git a/packages/contracts-bedrock/src/L2/CrossDomainOwnable3.sol b/packages/contracts-bedrock/src/L2/CrossDomainOwnable3.sol index 2e4ef7a17c2a..e940a026df05 100644 --- a/packages/contracts-bedrock/src/L2/CrossDomainOwnable3.sol +++ b/packages/contracts-bedrock/src/L2/CrossDomainOwnable3.sol @@ -1,10 +1,15 @@ // SPDX-License-Identifier: MIT pragma solidity ^0.8.0; -import { Predeploys } from "src/libraries/Predeploys.sol"; -import { L2CrossDomainMessenger } from "src/L2/L2CrossDomainMessenger.sol"; +// Contracts import { Ownable } from "@openzeppelin/contracts/access/Ownable.sol"; +// Libraries +import { Predeploys } from "src/libraries/Predeploys.sol"; + +// Interfaces +import { IL2CrossDomainMessenger } from "src/L2/interfaces/IL2CrossDomainMessenger.sol"; + /// @title CrossDomainOwnable3 /// @notice This contract extends the OpenZeppelin `Ownable` contract for L2 contracts to be owned /// by contracts on either L1 or L2. Note that this contract is meant to be used with @@ -42,7 +47,7 @@ abstract contract CrossDomainOwnable3 is Ownable { if (isLocal) { require(owner() == msg.sender, "CrossDomainOwnable3: caller is not the owner"); } else { - L2CrossDomainMessenger messenger = L2CrossDomainMessenger(Predeploys.L2_CROSS_DOMAIN_MESSENGER); + IL2CrossDomainMessenger messenger = IL2CrossDomainMessenger(Predeploys.L2_CROSS_DOMAIN_MESSENGER); require(msg.sender == address(messenger), "CrossDomainOwnable3: caller is not the messenger"); diff --git a/packages/contracts-bedrock/src/L2/CrossL2Inbox.sol b/packages/contracts-bedrock/src/L2/CrossL2Inbox.sol index c6075f787fdf..6f86717c4e4d 100644 --- a/packages/contracts-bedrock/src/L2/CrossL2Inbox.sol +++ b/packages/contracts-bedrock/src/L2/CrossL2Inbox.sol @@ -3,18 +3,17 @@ 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); -} +import { ISemver } from "src/universal/interfaces/ISemver.sol"; +import { ICrossL2Inbox } from "src/L2/interfaces/ICrossL2Inbox.sol"; +import { SafeCall } from "src/libraries/SafeCall.sol"; +import { IDependencySet } from "src/L2/interfaces/IDependencySet.sol"; +import { IL1BlockIsthmus } from "src/L2/interfaces/IL1BlockIsthmus.sol"; + +/// @notice Thrown when the caller is not DEPOSITOR_ACCOUNT when calling `setInteropStart()` +error NotDepositor(); + +/// @notice Thrown when attempting to set interop start when it's already set. +error InteropStartAlreadySet(); /// @notice Thrown when a non-written transient storage slot is attempted to be read from. error NotEntered(); @@ -28,12 +27,19 @@ error InvalidChainId(); /// @notice Thrown when trying to execute a cross chain message and the target call fails. error TargetCallFailed(); -/// @custom:proxied +/// @notice Thrown when trying to execute a cross chain message on a deposit transaction. +error NoExecutingDeposits(); + +/// @custom:proxied true /// @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 Storage slot that the interop start timestamp is stored at. + /// Equal to bytes32(uint256(keccak256("crossl2inbox.interopstart")) - 1) + bytes32 internal constant INTEROP_START_SLOT = 0x5c769ee0ee8887661922049dc52480bb60322d765161507707dd9b190af5c149; + /// @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; @@ -54,20 +60,40 @@ contract CrossL2Inbox is ICrossL2Inbox, ISemver, TransientReentrancyAware { /// Equal to bytes32(uint256(keccak256("crossl2inbox.identifier.chainid")) - 1) bytes32 internal constant CHAINID_SLOT = 0x6e0446e8b5098b8c8193f964f1b567ec3a2bdaeba33d36acb85c1f1d3f92d313; + /// @notice The address that represents the system caller responsible for L1 attributes + /// transactions. + address internal constant DEPOSITOR_ACCOUNT = 0xDeaDDEaDDeAdDeAdDEAdDEaddeAddEAdDEAd0001; + /// @notice Semantic version. - /// @custom:semver 1.0.0 - string public constant version = "1.0.0"; + /// @custom:semver 1.0.0-beta.6 + string public constant version = "1.0.0-beta.6"; /// @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(); - _; + /// @param msgHash Hash of message payload being executed. + /// @param id Encoded Identifier of the message. + event ExecutingMessage(bytes32 indexed msgHash, Identifier id); + + /// @notice Sets the Interop Start Timestamp for this chain. Can only be performed once and when the caller is the + /// DEPOSITOR_ACCOUNT. + function setInteropStart() external { + // Check that caller is the DEPOSITOR_ACCOUNT + if (msg.sender != DEPOSITOR_ACCOUNT) revert NotDepositor(); + + // Check that it has not been set already + if (interopStart() != 0) revert InteropStartAlreadySet(); + + // Set Interop Start to block.timestamp + assembly { + sstore(INTEROP_START_SLOT, timestamp()) + } + } + + /// @notice Returns the interop start timestamp. + /// @return interopStart_ interop start timestamp. + function interopStart() public view returns (uint256 interopStart_) { + assembly { + interopStart_ := sload(INTEROP_START_SLOT) + } } /// @notice Returns the origin address of the Identifier. If not entered, reverts. @@ -113,21 +139,46 @@ contract CrossL2Inbox is ICrossL2Inbox, ISemver, TransientReentrancyAware { payable reentrantAware { - if (_id.timestamp > block.timestamp) revert InvalidTimestamp(); - if (!IDependencySet(Predeploys.L1_BLOCK_ATTRIBUTES).isInDependencySet(_id.chainId)) { - revert InvalidChainId(); - } + // We need to know if this is being called on a depositTx + if (IL1BlockIsthmus(Predeploys.L1_BLOCK_ATTRIBUTES).isDeposit()) revert NoExecutingDeposits(); + + // Check the Identifier. + _checkIdentifier(_id); // Store the Identifier in transient storage. _storeIdentifier(_id); // Call the target account with the message payload. - bool success = _callWithAllGas(_target, _message); + bool success = SafeCall.call(_target, msg.value, _message); // Revert if the target call failed. if (!success) revert TargetCallFailed(); - emit ExecutingMessage(abi.encode(_id), _message); + emit ExecutingMessage(keccak256(_message), _id); + } + + /// @notice Validates a cross chain message on the destination chain + /// and emits an ExecutingMessage event. This function is useful + /// for applications that understand the schema of the _message payload and want to + /// process it in a custom way. + /// @param _id Identifier of the message. + /// @param _msgHash Hash of the message payload to call target with. + function validateMessage(Identifier calldata _id, bytes32 _msgHash) external { + // Check the Identifier. + _checkIdentifier(_id); + + emit ExecutingMessage(_msgHash, _id); + } + + /// @notice Validates that for a given cross chain message identifier, + /// it's timestamp is not in the future and the source chainId + /// is in the destination chain's dependency set. + /// @param _id Identifier of the message. + function _checkIdentifier(Identifier calldata _id) internal view { + if (_id.timestamp > block.timestamp || _id.timestamp <= interopStart()) revert InvalidTimestamp(); + if (!IDependencySet(Predeploys.L1_BLOCK_ATTRIBUTES).isInDependencySet(_id.chainId)) { + revert InvalidChainId(); + } } /// @notice Stores the Identifier in transient storage. @@ -139,23 +190,4 @@ contract CrossL2Inbox is ICrossL2Inbox, ISemver, TransientReentrancyAware { 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/ETHLiquidity.sol b/packages/contracts-bedrock/src/L2/ETHLiquidity.sol new file mode 100644 index 000000000000..6118288df77d --- /dev/null +++ b/packages/contracts-bedrock/src/L2/ETHLiquidity.sol @@ -0,0 +1,44 @@ +// SPDX-License-Identifier: MIT +pragma solidity 0.8.15; + +// Contracts +import { SafeSend } from "src/universal/SafeSend.sol"; + +// Libraries +import { Unauthorized, NotCustomGasToken } from "src/libraries/errors/CommonErrors.sol"; +import { Predeploys } from "src/libraries/Predeploys.sol"; + +// Interfaces +import { ISemver } from "src/universal/interfaces/ISemver.sol"; +import { IL1Block } from "src/L2/interfaces/IL1Block.sol"; + +/// @title ETHLiquidity +/// @notice The ETHLiquidity contract allows other contracts to access ETH liquidity without +/// needing to modify the EVM to generate new ETH. +contract ETHLiquidity is ISemver { + /// @notice Emitted when an address burns ETH liquidity. + event LiquidityBurned(address indexed caller, uint256 value); + + /// @notice Emitted when an address mints ETH liquidity. + event LiquidityMinted(address indexed caller, uint256 value); + + /// @notice Semantic version. + /// @custom:semver 1.0.0-beta.3 + string public constant version = "1.0.0-beta.3"; + + /// @notice Allows an address to lock ETH liquidity into this contract. + function burn() external payable { + if (msg.sender != Predeploys.SUPERCHAIN_WETH) revert Unauthorized(); + if (IL1Block(Predeploys.L1_BLOCK_ATTRIBUTES).isCustomGasToken()) revert NotCustomGasToken(); + emit LiquidityBurned(msg.sender, msg.value); + } + + /// @notice Allows an address to unlock ETH liquidity from this contract. + /// @param _amount The amount of liquidity to unlock. + function mint(uint256 _amount) external { + if (msg.sender != Predeploys.SUPERCHAIN_WETH) revert Unauthorized(); + if (IL1Block(Predeploys.L1_BLOCK_ATTRIBUTES).isCustomGasToken()) revert NotCustomGasToken(); + new SafeSend{ value: _amount }(payable(msg.sender)); + emit LiquidityMinted(msg.sender, _amount); + } +} diff --git a/packages/contracts-bedrock/src/L2/GasPriceOracle.sol b/packages/contracts-bedrock/src/L2/GasPriceOracle.sol index 79c3eb431503..862e4bb07913 100644 --- a/packages/contracts-bedrock/src/L2/GasPriceOracle.sol +++ b/packages/contracts-bedrock/src/L2/GasPriceOracle.sol @@ -1,13 +1,16 @@ // SPDX-License-Identifier: MIT pragma solidity 0.8.15; -import { ISemver } from "src/universal/ISemver.sol"; +// Libraries +import { LibZip } from "@solady/utils/LibZip.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 +// Interfaces +import { ISemver } from "src/universal/interfaces/ISemver.sol"; +import { IL1Block } from "src/L2/interfaces/IL1Block.sol"; + +/// @custom:proxied true /// @custom:predeploy 0x420000000000000000000000000000000000000F /// @title GasPriceOracle /// @notice This contract maintains the variables responsible for computing the L1 portion of the @@ -26,8 +29,8 @@ contract GasPriceOracle is ISemver { uint256 public constant DECIMALS = 6; /// @notice Semantic version. - /// @custom:semver 1.3.0 - string public constant version = "1.3.0"; + /// @custom:semver 1.3.1-beta.2 + string public constant version = "1.3.1-beta.2"; /// @notice This is the intercept value for the linear regression used to estimate the final size of the /// compressed transaction. @@ -114,7 +117,7 @@ contract GasPriceOracle is ISemver { /// @return Current fee overhead. function overhead() public view returns (uint256) { require(!isEcotone, "GasPriceOracle: overhead() is deprecated"); - return L1Block(Predeploys.L1_BLOCK_ATTRIBUTES).l1FeeOverhead(); + return IL1Block(Predeploys.L1_BLOCK_ATTRIBUTES).l1FeeOverhead(); } /// @custom:legacy @@ -122,31 +125,31 @@ contract GasPriceOracle is ISemver { /// @return Current fee scalar. function scalar() public view returns (uint256) { require(!isEcotone, "GasPriceOracle: scalar() is deprecated"); - return L1Block(Predeploys.L1_BLOCK_ATTRIBUTES).l1FeeScalar(); + return IL1Block(Predeploys.L1_BLOCK_ATTRIBUTES).l1FeeScalar(); } /// @notice Retrieves the latest known L1 base fee. /// @return Latest known L1 base fee. function l1BaseFee() public view returns (uint256) { - return L1Block(Predeploys.L1_BLOCK_ATTRIBUTES).basefee(); + return IL1Block(Predeploys.L1_BLOCK_ATTRIBUTES).basefee(); } /// @notice Retrieves the current blob base fee. /// @return Current blob base fee. function blobBaseFee() public view returns (uint256) { - return L1Block(Predeploys.L1_BLOCK_ATTRIBUTES).blobBaseFee(); + return IL1Block(Predeploys.L1_BLOCK_ATTRIBUTES).blobBaseFee(); } /// @notice Retrieves the current base fee scalar. /// @return Current base fee scalar. function baseFeeScalar() public view returns (uint32) { - return L1Block(Predeploys.L1_BLOCK_ATTRIBUTES).baseFeeScalar(); + return IL1Block(Predeploys.L1_BLOCK_ATTRIBUTES).baseFeeScalar(); } /// @notice Retrieves the current blob base fee scalar. /// @return Current blob base fee scalar. function blobBaseFeeScalar() public view returns (uint32) { - return L1Block(Predeploys.L1_BLOCK_ATTRIBUTES).blobBaseFeeScalar(); + return IL1Block(Predeploys.L1_BLOCK_ATTRIBUTES).blobBaseFeeScalar(); } /// @custom:legacy @@ -173,7 +176,7 @@ contract GasPriceOracle is ISemver { if (isEcotone) { return l1GasUsed; } - return l1GasUsed + L1Block(Predeploys.L1_BLOCK_ATTRIBUTES).l1FeeOverhead(); + return l1GasUsed + IL1Block(Predeploys.L1_BLOCK_ATTRIBUTES).l1FeeOverhead(); } /// @notice Computation of the L1 portion of the fee for Bedrock. @@ -181,8 +184,8 @@ contract GasPriceOracle is ISemver { /// @return L1 fee that should be paid for the tx function _getL1FeeBedrock(bytes memory _data) internal view returns (uint256) { uint256 l1GasUsed = _getCalldataGas(_data); - uint256 fee = (l1GasUsed + L1Block(Predeploys.L1_BLOCK_ATTRIBUTES).l1FeeOverhead()) * l1BaseFee() - * L1Block(Predeploys.L1_BLOCK_ATTRIBUTES).l1FeeScalar(); + uint256 fee = (l1GasUsed + IL1Block(Predeploys.L1_BLOCK_ATTRIBUTES).l1FeeOverhead()) * l1BaseFee() + * IL1Block(Predeploys.L1_BLOCK_ATTRIBUTES).l1FeeScalar(); return fee / (10 ** DECIMALS); } diff --git a/packages/contracts-bedrock/src/L2/ICrossL2Inbox.sol b/packages/contracts-bedrock/src/L2/ICrossL2Inbox.sol deleted file mode 100644 index 25cc116c1da0..000000000000 --- a/packages/contracts-bedrock/src/L2/ICrossL2Inbox.sol +++ /dev/null @@ -1,47 +0,0 @@ -// 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 deleted file mode 100644 index 19a627ff9a30..000000000000 --- a/packages/contracts-bedrock/src/L2/IL2ToL2CrossDomainMessenger.sol +++ /dev/null @@ -1,43 +0,0 @@ -// 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 1737c580cec4..9a263c915af6 100644 --- a/packages/contracts-bedrock/src/L2/L1Block.sol +++ b/packages/contracts-bedrock/src/L2/L1Block.sol @@ -1,11 +1,12 @@ // SPDX-License-Identifier: MIT pragma solidity 0.8.15; -import { ISemver } from "src/universal/ISemver.sol"; +import { ISemver } from "src/universal/interfaces/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:proxied true /// @custom:predeploy 0x4200000000000000000000000000000000000015 /// @title L1Block /// @notice The L1Block predeploy gives users access to information about the last known L1 block. @@ -13,9 +14,6 @@ import { GasPayingToken, IGasToken } from "src/libraries/GasPayingToken.sol"; /// 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, IGasToken { - /// @notice Error returns when a non-depositor account tries to set L1 block values. - error NotDepositor(); - /// @notice Event emitted when the gas paying token is set. event GasPayingTokenSet(address indexed token, uint8 indexed decimals, bytes32 name, bytes32 symbol); @@ -59,9 +57,9 @@ contract L1Block is ISemver, IGasToken { /// @notice The latest L1 blob base fee. uint256 public blobBaseFee; - /// @custom:semver 1.4.0 + /// @custom:semver 1.5.1-beta.2 function version() public pure virtual returns (string memory) { - return "1.4.0"; + return "1.5.1-beta.2"; } /// @notice Returns the gas paying token, its decimals, name and symbol. @@ -140,7 +138,23 @@ contract L1Block is ISemver, IGasToken { /// 7. _blobBaseFee L1 blob base fee. /// 8. _hash L1 blockhash. /// 9. _batcherHash Versioned hash to authenticate batcher by. - function setL1BlockValuesEcotone() external { + function setL1BlockValuesEcotone() public { + _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. + function _setL1BlockValuesEcotone() internal { address depositor = DEPOSITOR_ACCOUNT(); assembly { // Revert if the caller is not the depositor account. diff --git a/packages/contracts-bedrock/src/L2/L1BlockInterop.sol b/packages/contracts-bedrock/src/L2/L1BlockInterop.sol deleted file mode 100644 index ea0d29e856cb..000000000000 --- a/packages/contracts-bedrock/src/L2/L1BlockInterop.sol +++ /dev/null @@ -1,109 +0,0 @@ -// SPDX-License-Identifier: MIT -pragma solidity 0.8.15; - -import { L1Block } from "src/L2/L1Block.sol"; - -/// @notice Thrown when a non-depositor account attempts to set L1 block values. -error NotDepositor(); - -/// @notice Thrown when dependencySetSize does not match the length of the dependency set. -error DependencySetSizeMismatch(); - -/// @custom:proxied -/// @custom:predeploy 0x4200000000000000000000000000000000000015 -/// @title L1BlockInterop -/// @notice Interop extenstions of L1Block. -contract L1BlockInterop is L1Block { - /// @notice The chain IDs of the interop dependency set. - uint256[] public dependencySet; - - /// @custom:semver 1.3.0+interop - function version() public pure override returns (string memory) { - return string.concat(super.version(), "+interop"); - } - - /// @notice Updates the L1 block values for an Interop 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. - /// 10. _dependencySetSize Size of the interop dependency set. - /// 11. _dependencySet Array of chain IDs for the interop dependency set. - function setL1BlockValuesInterop() external { - address depositor = DEPOSITOR_ACCOUNT(); - assembly { - // Revert if the caller is not the 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 - } - // sequencenum (uint64), blobBaseFeeScalar (uint32), baseFeeScalar (uint32) - sstore(sequenceNumber.slot, shr(128, calldataload(4))) - // number (uint64) and timestamp (uint64) - sstore(number.slot, shr(128, calldataload(20))) - sstore(basefee.slot, calldataload(36)) // uint256 - sstore(blobBaseFee.slot, calldataload(68)) // uint256 - sstore(hash.slot, calldataload(100)) // bytes32 - sstore(batcherHash.slot, calldataload(132)) // bytes32 - - // Load dependencySetSize from calldata (at offset 164 after calldata for setL1BlockValuesEcotone ends) - let dependencySetSize_ := shr(248, calldataload(164)) - - // Revert if dependencySetSize_ doesn't match the length of dependencySet in calldata - if xor(add(165, mul(dependencySetSize_, 0x20)), calldatasize()) { - mstore(0x00, 0x44165b6a) // 0x44165b6a is the 4-byte selector of "DependencySetSizeMismatch()" - revert(0x1C, 0x04) // returns the stored 4-byte selector from above - } - - // Use memory to hash and get the start index of dependencySet - mstore(0x00, dependencySet.slot) - let dependencySetStartIndex := keccak256(0x00, 0x20) - - // Iterate over calldata dependencySet and write to store dependencySet - for { let i := 0 } lt(i, dependencySetSize_) { i := add(i, 1) } { - // Load value from calldata and write to storage (dependencySet) at index - let val := calldataload(add(165, mul(i, 0x20))) - sstore(add(dependencySetStartIndex, i), val) - } - - // Update length of dependencySet array - sstore(dependencySet.slot, dependencySetSize_) - } - } - - /// @notice Returns true if a chain ID is in the interop dependency set and false otherwise. - /// Every chain ID is in the interop dependency set of itself. - /// @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) { - // Every chain ID is in the interop dependency set of itself. - if (_chainId == block.chainid) { - return true; - } - - uint256 length = dependencySet.length; - for (uint256 i = 0; i < length;) { - if (dependencySet[i] == _chainId) { - return true; - } - unchecked { - i++; - } - } - - return false; - } - - /// @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); - } -} diff --git a/packages/contracts-bedrock/src/L2/L1BlockIsthmus.sol b/packages/contracts-bedrock/src/L2/L1BlockIsthmus.sol new file mode 100644 index 000000000000..c9643659030e --- /dev/null +++ b/packages/contracts-bedrock/src/L2/L1BlockIsthmus.sol @@ -0,0 +1,145 @@ +// SPDX-License-Identifier: MIT +pragma solidity 0.8.15; + +// Contracts +import { L1Block } from "src/L2/L1Block.sol"; + +// Libraries +import { EnumerableSet } from "@openzeppelin/contracts/utils/structs/EnumerableSet.sol"; +import { GasPayingToken } from "src/libraries/GasPayingToken.sol"; +import { StaticConfig } from "src/libraries/StaticConfig.sol"; +import { Predeploys } from "src/libraries/Predeploys.sol"; +import "src/libraries/L1BlockErrors.sol"; + +/// @notice Enum representing different types of configurations that can be set on L1BlockIsthmus. +/// @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 true +/// @custom:predeploy 0x4200000000000000000000000000000000000015 +/// @title L1BlockIsthmus +/// @notice Isthmus extenstions of L1Block. +contract L1BlockIsthmus 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; + + /// @notice Storage slot that the isDeposit is stored at. + /// This is a custom slot that is not part of the standard storage layout. + /// keccak256(abi.encode(uint256(keccak256("l1Block.identifier.isDeposit")) - 1)) & ~bytes32(uint256(0xff)) + uint256 internal constant IS_DEPOSIT_SLOT = 0x921bd3a089295c6e5540e8fba8195448d253efd6f2e3e495b499b627dc36a300; + + /// @custom:semver +isthmus + function version() public pure override returns (string memory) { + return string.concat(super.version(), "+isthmus"); + } + + /// @notice Returns whether the call was triggered from a a deposit or not. + /// @notice This function is only callable by the CrossL2Inbox contract. + function isDeposit() external view returns (bool isDeposit_) { + if (msg.sender != Predeploys.CROSS_L2_INBOX) revert NotCrossL2Inbox(); + assembly { + isDeposit_ := sload(IS_DEPOSIT_SLOT) + } + } + + /// @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 Updates the `isDeposit` flag and sets the L1 block values for an Isthmus upgraded chain. + /// It updates the L1 block values through the `setL1BlockValuesEcotone` function. + /// It forwards the calldata to the internally-used `setL1BlockValuesEcotone` function. + function setL1BlockValuesIsthmus() external { + // Set the isDeposit flag to true. + assembly { + sstore(IS_DEPOSIT_SLOT, 1) + } + + _setL1BlockValuesEcotone(); + } + + /// @notice Resets the isDeposit flag. + /// Should only be called by the depositor account after the deposits are complete. + function depositsComplete() external { + if (msg.sender != DEPOSITOR_ACCOUNT()) revert NotDepositor(); + + // Set the isDeposit flag to false. + assembly { + sstore(IS_DEPOSIT_SLOT, 0) + } + } + + /// @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/L1FeeVault.sol b/packages/contracts-bedrock/src/L2/L1FeeVault.sol index b815dbfbbf79..d62db2a25c3b 100644 --- a/packages/contracts-bedrock/src/L2/L1FeeVault.sol +++ b/packages/contracts-bedrock/src/L2/L1FeeVault.sol @@ -1,17 +1,17 @@ // SPDX-License-Identifier: MIT pragma solidity 0.8.15; -import { ISemver } from "src/universal/ISemver.sol"; +import { ISemver } from "src/universal/interfaces/ISemver.sol"; import { FeeVault } from "src/universal/FeeVault.sol"; -/// @custom:proxied +/// @custom:proxied true /// @custom:predeploy 0x420000000000000000000000000000000000001A /// @title L1FeeVault /// @notice The L1FeeVault accumulates the L1 portion of the transaction fees. contract L1FeeVault is FeeVault, ISemver { /// @notice Semantic version. - /// @custom:semver 1.4.1 - string public constant version = "1.4.1"; + /// @custom:semver 1.5.0-beta.2 + string public constant version = "1.5.0-beta.2"; /// @notice Constructs the L1FeeVault contract. /// @param _recipient Wallet that will receive the fees. diff --git a/packages/contracts-bedrock/src/L2/L2CrossDomainMessenger.sol b/packages/contracts-bedrock/src/L2/L2CrossDomainMessenger.sol index d504b2d40d32..bbfc82578ab6 100644 --- a/packages/contracts-bedrock/src/L2/L2CrossDomainMessenger.sol +++ b/packages/contracts-bedrock/src/L2/L2CrossDomainMessenger.sol @@ -1,24 +1,29 @@ // SPDX-License-Identifier: MIT pragma solidity 0.8.15; +// Contracts +import { CrossDomainMessenger } from "src/universal/CrossDomainMessenger.sol"; + +// Libraries import { AddressAliasHelper } from "src/vendor/AddressAliasHelper.sol"; import { Predeploys } from "src/libraries/Predeploys.sol"; -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 +// Interfaces +import { ISemver } from "src/universal/interfaces/ISemver.sol"; +import { IL2ToL1MessagePasser } from "src/L2/interfaces/IL2ToL1MessagePasser.sol"; +import { IL1Block } from "src/L2/interfaces/IL1Block.sol"; + +/// @custom:proxied true /// @custom:predeploy 0x4200000000000000000000000000000000000007 /// @title L2CrossDomainMessenger /// @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. contract L2CrossDomainMessenger is CrossDomainMessenger, ISemver { - /// @custom:semver 2.1.0 - string public constant version = "2.1.0"; + /// @custom:semver 2.1.1-beta.3 + string public constant version = "2.1.1-beta.3"; /// @notice Constructs the L2CrossDomainMessenger contract. constructor() CrossDomainMessenger() { @@ -41,14 +46,14 @@ contract L2CrossDomainMessenger is CrossDomainMessenger, ISemver { /// @inheritdoc CrossDomainMessenger function _sendMessage(address _to, uint64 _gasLimit, uint256 _value, bytes memory _data) internal override { - L2ToL1MessagePasser(payable(Predeploys.L2_TO_L1_MESSAGE_PASSER)).initiateWithdrawal{ value: _value }( + IL2ToL1MessagePasser(payable(Predeploys.L2_TO_L1_MESSAGE_PASSER)).initiateWithdrawal{ value: _value }( _to, _gasLimit, _data ); } /// @inheritdoc CrossDomainMessenger function gasPayingToken() internal view override returns (address addr_, uint8 decimals_) { - (addr_, decimals_) = L1Block(Predeploys.L1_BLOCK_ATTRIBUTES).gasPayingToken(); + (addr_, decimals_) = IL1Block(Predeploys.L1_BLOCK_ATTRIBUTES).gasPayingToken(); } /// @inheritdoc CrossDomainMessenger diff --git a/packages/contracts-bedrock/src/L2/L2ERC721Bridge.sol b/packages/contracts-bedrock/src/L2/L2ERC721Bridge.sol index ee68427acb17..4f3231c677f0 100644 --- a/packages/contracts-bedrock/src/L2/L2ERC721Bridge.sol +++ b/packages/contracts-bedrock/src/L2/L2ERC721Bridge.sol @@ -1,16 +1,22 @@ // SPDX-License-Identifier: MIT pragma solidity 0.8.15; +// Contracts import { ERC721Bridge } from "src/universal/ERC721Bridge.sol"; + +// Libraries import { ERC165Checker } from "@openzeppelin/contracts/utils/introspection/ERC165Checker.sol"; -import { L1ERC721Bridge } from "src/L1/L1ERC721Bridge.sol"; -import { IOptimismMintableERC721 } from "src/universal/IOptimismMintableERC721.sol"; -import { CrossDomainMessenger } from "src/universal/CrossDomainMessenger.sol"; -import { StandardBridge } from "src/universal/StandardBridge.sol"; -import { ISemver } from "src/universal/ISemver.sol"; import { Constants } from "src/libraries/Constants.sol"; import { Predeploys } from "src/libraries/Predeploys.sol"; +// Interfaces +import { IL1ERC721Bridge } from "src/L1/interfaces/IL1ERC721Bridge.sol"; +import { IOptimismMintableERC721 } from "src/universal/interfaces/IOptimismMintableERC721.sol"; +import { ICrossDomainMessenger } from "src/universal/interfaces/ICrossDomainMessenger.sol"; +import { ISemver } from "src/universal/interfaces/ISemver.sol"; + +/// @custom:proxied true +/// @custom:predeploy 0x4200000000000000000000000000000000000014 /// @title L2ERC721Bridge /// @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 @@ -21,8 +27,8 @@ import { Predeploys } from "src/libraries/Predeploys.sol"; /// wait for the one-week challenge period to elapse before their Optimism-native NFT /// can be refunded on L2. contract L2ERC721Bridge is ERC721Bridge, ISemver { - /// @custom:semver 1.7.0 - string public constant version = "1.7.0"; + /// @custom:semver 1.7.1-beta.2 + string public constant version = "1.7.1-beta.2"; /// @notice Constructs the L2ERC721Bridge contract. constructor() ERC721Bridge() { @@ -33,8 +39,8 @@ contract L2ERC721Bridge is ERC721Bridge, ISemver { /// @param _l1ERC721Bridge Address of the ERC721 bridge contract on the other network. function initialize(address payable _l1ERC721Bridge) public initializer { __ERC721Bridge_init({ - _messenger: CrossDomainMessenger(Predeploys.L2_CROSS_DOMAIN_MESSENGER), - _otherBridge: StandardBridge(_l1ERC721Bridge) + _messenger: ICrossDomainMessenger(Predeploys.L2_CROSS_DOMAIN_MESSENGER), + _otherBridge: ERC721Bridge(_l1ERC721Bridge) }); } @@ -113,7 +119,7 @@ contract L2ERC721Bridge is ERC721Bridge, ISemver { IOptimismMintableERC721(_localToken).burn(_from, _tokenId); bytes memory message = abi.encodeWithSelector( - L1ERC721Bridge.finalizeBridgeERC721.selector, remoteToken, _localToken, _from, _to, _tokenId, _extraData + IL1ERC721Bridge.finalizeBridgeERC721.selector, remoteToken, _localToken, _from, _to, _tokenId, _extraData ); // Send message to L1 bridge diff --git a/packages/contracts-bedrock/src/L2/L2StandardBridge.sol b/packages/contracts-bedrock/src/L2/L2StandardBridge.sol index 1472d0fd9e86..1c7e2e307cc3 100644 --- a/packages/contracts-bedrock/src/L2/L2StandardBridge.sol +++ b/packages/contracts-bedrock/src/L2/L2StandardBridge.sol @@ -1,14 +1,19 @@ // SPDX-License-Identifier: MIT pragma solidity 0.8.15; -import { Predeploys } from "src/libraries/Predeploys.sol"; +// Contracts 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 { L1Block } from "src/L2/L1Block.sol"; -/// @custom:proxied +// Libraries +import { Predeploys } from "src/libraries/Predeploys.sol"; + +// Interfaces +import { ISemver } from "src/universal/interfaces/ISemver.sol"; +import { ICrossDomainMessenger } from "src/universal/interfaces/ICrossDomainMessenger.sol"; +import { IL1Block } from "src/L2/interfaces/IL1Block.sol"; + +/// @custom:proxied true /// @custom:predeploy 0x4200000000000000000000000000000000000010 /// @title L2StandardBridge /// @notice The L2StandardBridge is responsible for transfering ETH and ERC20 tokens between L1 and @@ -52,8 +57,11 @@ contract L2StandardBridge is StandardBridge, ISemver { bytes extraData ); - /// @custom:semver 1.10.0 - string public constant version = "1.10.0"; + /// @notice Semantic version. + /// @custom:semver 1.11.1-beta.2 + function version() public pure virtual returns (string memory) { + return "1.11.1-beta.2"; + } /// @notice Constructs the L2StandardBridge contract. constructor() StandardBridge() { @@ -64,7 +72,7 @@ contract L2StandardBridge is StandardBridge, ISemver { /// @param _otherBridge Contract for the corresponding bridge on the other chain. function initialize(StandardBridge _otherBridge) public initializer { __StandardBridge_init({ - _messenger: CrossDomainMessenger(Predeploys.L2_CROSS_DOMAIN_MESSENGER), + _messenger: ICrossDomainMessenger(Predeploys.L2_CROSS_DOMAIN_MESSENGER), _otherBridge: _otherBridge }); } @@ -78,7 +86,7 @@ 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(); + (addr_, decimals_) = IL1Block(Predeploys.L1_BLOCK_ATTRIBUTES).gasPayingToken(); } /// @custom:legacy diff --git a/packages/contracts-bedrock/src/L2/L2StandardBridgeInterop.sol b/packages/contracts-bedrock/src/L2/L2StandardBridgeInterop.sol new file mode 100644 index 000000000000..be6c9e4c878d --- /dev/null +++ b/packages/contracts-bedrock/src/L2/L2StandardBridgeInterop.sol @@ -0,0 +1,100 @@ +// SPDX-License-Identifier: MIT +pragma solidity 0.8.15; + +// Contracts +import { L2StandardBridge } from "src/L2/L2StandardBridge.sol"; + +// Libraries +import { Predeploys } from "src/libraries/Predeploys.sol"; + +// Interfaces +import { IERC20 } from "@openzeppelin/contracts/token/ERC20/IERC20.sol"; +import { IERC20Metadata } from "@openzeppelin/contracts/token/ERC20/extensions/IERC20Metadata.sol"; +import { IOptimismERC20Factory } from "src/L2/interfaces/IOptimismERC20Factory.sol"; + +/// @notice Thrown when the decimals of the tokens are not the same. +error InvalidDecimals(); + +/// @notice Thrown when the legacy address is not found in the OptimismMintableERC20Factory. +error InvalidLegacyERC20Address(); + +/// @notice Thrown when the SuperchainERC20 address is not found in the SuperchainERC20Factory. +error InvalidSuperchainERC20Address(); + +/// @notice Thrown when the remote addresses of the tokens are not the same. +error InvalidTokenPair(); + +/// TODO: Define a better naming convention for this interface. +/// @notice Interface for minting and burning tokens in the L2StandardBridge. +/// Used for StandardL2ERC20, OptimismMintableERC20 and OptimismSuperchainERC20. +interface MintableAndBurnable is IERC20 { + function mint(address, uint256) external; + function burn(address, uint256) external; +} + +/// @custom:proxied true +/// @custom:predeploy 0x4200000000000000000000000000000000000010 +/// @title L2StandardBridgeInterop +/// @notice The L2StandardBridgeInterop is an extension of the L2StandardBridge that allows for +/// the conversion of tokens between legacy tokens (OptimismMintableERC20 or StandardL2ERC20) +/// and SuperchainERC20 tokens. +contract L2StandardBridgeInterop is L2StandardBridge { + /// @notice Emitted when a conversion is made. + /// @param from The token being converted from. + /// @param to The token being converted to. + /// @param caller The caller of the conversion. + /// @param amount The amount of tokens being converted. + event Converted(address indexed from, address indexed to, address indexed caller, uint256 amount); + + /// @notice Semantic version. + /// @custom:semver +interop + function version() public pure override returns (string memory) { + return string.concat(super.version(), "+interop"); + } + + /// @notice Converts `amount` of `from` token to `to` token. + /// @param _from The token being converted from. + /// @param _to The token being converted to. + /// @param _amount The amount of tokens being converted. + function convert(address _from, address _to, uint256 _amount) external { + _validatePair(_from, _to); + + MintableAndBurnable(_from).burn(msg.sender, _amount); + MintableAndBurnable(_to).mint(msg.sender, _amount); + + emit Converted(_from, _to, msg.sender, _amount); + } + + /// @notice Validates the pair of tokens. + /// @param _from The token being converted from. + /// @param _to The token being converted to. + function _validatePair(address _from, address _to) internal view { + // 1. Decimals check + if (IERC20Metadata(_from).decimals() != IERC20Metadata(_to).decimals()) revert InvalidDecimals(); + + // Order tokens for factory validation + if (_isOptimismMintableERC20(_from)) { + _validateFactories(_from, _to); + } else { + _validateFactories(_to, _from); + } + } + + /// @notice Validates that the tokens are deployed by the correct factory. + /// @param _legacyAddr The legacy token address (OptimismMintableERC20 or StandardL2ERC20). + /// @param _superAddr The SuperchainERC20 address. + function _validateFactories(address _legacyAddr, address _superAddr) internal view { + // 2. Valid legacy check + address _legacyRemoteToken = + IOptimismERC20Factory(Predeploys.OPTIMISM_MINTABLE_ERC20_FACTORY).deployments(_legacyAddr); + if (_legacyRemoteToken == address(0)) revert InvalidLegacyERC20Address(); + + // 3. Valid SuperchainERC20 check + address _superRemoteToken = + IOptimismERC20Factory(Predeploys.OPTIMISM_SUPERCHAIN_ERC20_FACTORY).deployments(_superAddr); + if (_superRemoteToken == address(0)) revert InvalidSuperchainERC20Address(); + + // 4. Same remote address check + if (_legacyRemoteToken != _superRemoteToken) revert InvalidTokenPair(); + } +} diff --git a/packages/contracts-bedrock/src/L2/L2ToL1MessagePasser.sol b/packages/contracts-bedrock/src/L2/L2ToL1MessagePasser.sol index 8c764e999271..94b8213983e1 100644 --- a/packages/contracts-bedrock/src/L2/L2ToL1MessagePasser.sol +++ b/packages/contracts-bedrock/src/L2/L2ToL1MessagePasser.sol @@ -5,9 +5,9 @@ import { Types } from "src/libraries/Types.sol"; import { Hashing } from "src/libraries/Hashing.sol"; import { Encoding } from "src/libraries/Encoding.sol"; import { Burn } from "src/libraries/Burn.sol"; -import { ISemver } from "src/universal/ISemver.sol"; +import { ISemver } from "src/universal/interfaces/ISemver.sol"; -/// @custom:proxied +/// @custom:proxied true /// @custom:predeploy 0x4200000000000000000000000000000000000016 /// @title L2ToL1MessagePasser /// @notice The L2ToL1MessagePasser is a dedicated contract where messages that are being sent from @@ -48,8 +48,8 @@ contract L2ToL1MessagePasser is ISemver { /// @param amount Amount of ETh that was burned. event WithdrawerBalanceBurnt(uint256 indexed amount); - /// @custom:semver 1.1.0 - string public constant version = "1.1.0"; + /// @custom:semver 1.1.1-beta.1 + string public constant version = "1.1.1-beta.1"; /// @notice Allows users to withdraw ETH by sending directly to this contract. receive() external payable { diff --git a/packages/contracts-bedrock/src/L2/L2ToL2CrossDomainMessenger.sol b/packages/contracts-bedrock/src/L2/L2ToL2CrossDomainMessenger.sol index 46601bd2f7fc..4570e8191ca6 100644 --- a/packages/contracts-bedrock/src/L2/L2ToL2CrossDomainMessenger.sol +++ b/packages/contracts-bedrock/src/L2/L2ToL2CrossDomainMessenger.sol @@ -4,8 +4,10 @@ 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"; +import { IL2ToL2CrossDomainMessenger } from "src/L2/interfaces/IL2ToL2CrossDomainMessenger.sol"; +import { ISemver } from "src/universal/interfaces/ISemver.sol"; +import { SafeCall } from "src/libraries/SafeCall.sol"; +import { TransientReentrancyAware } from "src/libraries/TransientContext.sol"; /// @notice Thrown when a non-written slot in transient storage is attempted to be read from. error NotEntered(); @@ -34,17 +36,13 @@ error MessageAlreadyRelayed(); /// @notice Thrown when a reentrant call is detected. error ReentrantCall(); -/// @custom:proxied +/// @custom:proxied true /// @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; - +contract L2ToL2CrossDomainMessenger is IL2ToL2CrossDomainMessenger, ISemver, TransientReentrancyAware { /// @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 = @@ -59,8 +57,8 @@ contract L2ToL2CrossDomainMessenger is IL2ToL2CrossDomainMessenger, ISemver { uint16 public constant messageVersion = uint16(0); /// @notice Semantic version. - /// @custom:semver 1.0.0 - string public constant version = "1.0.0"; + /// @custom:semver 1.0.0-beta.4 + string public constant version = "1.0.0-beta.4"; /// @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. @@ -71,10 +69,6 @@ contract L2ToL2CrossDomainMessenger is IL2ToL2CrossDomainMessenger, ISemver { /// 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); @@ -83,25 +77,6 @@ contract L2ToL2CrossDomainMessenger is IL2ToL2CrossDomainMessenger, ISemver { /// @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) { @@ -124,7 +99,7 @@ contract L2ToL2CrossDomainMessenger is IL2ToL2CrossDomainMessenger, ISemver { /// @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 { + function sendMessage(uint256 _destination, address _target, bytes calldata _message) external { 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(); @@ -133,7 +108,9 @@ contract L2ToL2CrossDomainMessenger is IL2ToL2CrossDomainMessenger, ISemver { L2ToL2CrossDomainMessenger.relayMessage, (_destination, block.chainid, messageNonce(), msg.sender, _target, _message) ); - emit SentMessage(data); + assembly { + log0(add(data, 0x20), mload(data)) + } msgNonce++; } @@ -175,7 +152,7 @@ contract L2ToL2CrossDomainMessenger is IL2ToL2CrossDomainMessenger, ISemver { _storeMessageMetadata(_source, _sender); - bool success = _callWithAllGas(_target, _message); + bool success = SafeCall.call(_target, msg.value, _message); if (success) { successfulMessages[messageHash] = true; @@ -194,16 +171,6 @@ contract L2ToL2CrossDomainMessenger is IL2ToL2CrossDomainMessenger, ISemver { 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. @@ -213,23 +180,4 @@ contract L2ToL2CrossDomainMessenger is IL2ToL2CrossDomainMessenger, ISemver { 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/OptimismSuperchainERC20.sol b/packages/contracts-bedrock/src/L2/OptimismSuperchainERC20.sol new file mode 100644 index 000000000000..81cef632bfbe --- /dev/null +++ b/packages/contracts-bedrock/src/L2/OptimismSuperchainERC20.sol @@ -0,0 +1,149 @@ +// SPDX-License-Identifier: MIT +pragma solidity 0.8.25; + +import { IOptimismSuperchainERC20Extension } from "src/L2/interfaces/IOptimismSuperchainERC20.sol"; +import { IL2ToL2CrossDomainMessenger } from "src/L2/interfaces/IL2ToL2CrossDomainMessenger.sol"; +import { ISemver } from "src/universal/interfaces/ISemver.sol"; +import { Predeploys } from "src/libraries/Predeploys.sol"; +import { ERC20 } from "@solady/tokens/ERC20.sol"; +import { SuperchainERC20 } from "src/L2/SuperchainERC20.sol"; +import { Initializable } from "@openzeppelin/contracts-v5/proxy/utils/Initializable.sol"; +import { ERC165 } from "@openzeppelin/contracts-v5/utils/introspection/ERC165.sol"; + +/// @notice Thrown when attempting to mint or burn tokens and the function caller is not the StandardBridge. +error OnlyBridge(); + +/// @custom:proxied true +/// @title OptimismSuperchainERC20 +/// @notice OptimismSuperchainERC20 is a standard extension of the base ERC20 token contract that unifies ERC20 token +/// bridging to make it fungible across the Superchain. This construction allows the L2StandardBridge to burn +/// and mint tokens. This makes it possible to convert a valid OptimismMintableERC20 token to a SuperchainERC20 +/// token, turning it fungible and interoperable across the superchain. Likewise, it also enables the inverse +/// conversion path. +/// Moreover, it builds on top of the L2ToL2CrossDomainMessenger for both replay protection and domain binding. +contract OptimismSuperchainERC20 is + IOptimismSuperchainERC20Extension, + SuperchainERC20, + ISemver, + Initializable, + ERC165 +{ + /// @notice Address of the StandardBridge Predeploy. + address internal constant BRIDGE = Predeploys.L2_STANDARD_BRIDGE; + + /// @notice Storage slot that the OptimismSuperchainERC20Metadata struct is stored at. + /// keccak256(abi.encode(uint256(keccak256("optimismSuperchainERC20.metadata")) - 1)) & ~bytes32(uint256(0xff)); + bytes32 internal constant OPTIMISM_SUPERCHAIN_ERC20_METADATA_SLOT = + 0x07f04e84143df95a6373fcf376312ae41da81a193a3089073a54f47a74d8fb00; + + /// @notice Storage struct for the OptimismSuperchainERC20 metadata. + /// @custom:storage-location erc7201:optimismSuperchainERC20.metadata + struct OptimismSuperchainERC20Metadata { + /// @notice Address of the corresponding version of this token on the remote chain. + address remoteToken; + /// @notice Name of the token + string name; + /// @notice Symbol of the token + string symbol; + /// @notice Decimals of the token + uint8 decimals; + } + + /// @notice Returns the storage for the OptimismSuperchainERC20Metadata. + function _getStorage() private pure returns (OptimismSuperchainERC20Metadata storage _storage) { + assembly { + _storage.slot := OPTIMISM_SUPERCHAIN_ERC20_METADATA_SLOT + } + } + + /// @notice A modifier that only allows the bridge to call + modifier onlyBridge() { + if (msg.sender != BRIDGE) revert OnlyBridge(); + _; + } + + /// @notice Semantic version. + /// @custom:semver 1.0.0-beta.2 + string public constant version = "1.0.0-beta.2"; + + /// @notice Constructs the OptimismSuperchainERC20 contract. + constructor() { + _disableInitializers(); + } + + /// @notice Initializes the contract. + /// @param _remoteToken Address of the corresponding remote token. + /// @param _name ERC20 name. + /// @param _symbol ERC20 symbol. + /// @param _decimals ERC20 decimals. + function initialize( + address _remoteToken, + string memory _name, + string memory _symbol, + uint8 _decimals + ) + external + initializer + { + OptimismSuperchainERC20Metadata storage _storage = _getStorage(); + _storage.remoteToken = _remoteToken; + _storage.name = _name; + _storage.symbol = _symbol; + _storage.decimals = _decimals; + } + + /// @notice Allows the L2StandardBridge to mint tokens. + /// @param _to Address to mint tokens to. + /// @param _amount Amount of tokens to mint. + function mint(address _to, uint256 _amount) external virtual onlyBridge { + if (_to == address(0)) revert ZeroAddress(); + + _mint(_to, _amount); + + emit Mint(_to, _amount); + } + + /// @notice Allows the L2StandardBridge to burn tokens. + /// @param _from Address to burn tokens from. + /// @param _amount Amount of tokens to burn. + function burn(address _from, uint256 _amount) external virtual onlyBridge { + if (_from == address(0)) revert ZeroAddress(); + + _burn(_from, _amount); + + emit Burn(_from, _amount); + } + + /// @notice Returns the address of the corresponding version of this token on the remote chain. + function remoteToken() public view override returns (address) { + return _getStorage().remoteToken; + } + + /// @notice Returns the name of the token. + function name() public view virtual override returns (string memory) { + return _getStorage().name; + } + + /// @notice Returns the symbol of the token. + function symbol() public view virtual override returns (string memory) { + return _getStorage().symbol; + } + + /// @notice 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}. + function decimals() public view override returns (uint8) { + return _getStorage().decimals; + } + + /// @notice ERC165 interface check function. + /// @param _interfaceId Interface ID to check. + /// @return Whether or not the interface is supported by this contract. + function supportsInterface(bytes4 _interfaceId) public view virtual override returns (bool) { + return + _interfaceId == type(IOptimismSuperchainERC20Extension).interfaceId || super.supportsInterface(_interfaceId); + } +} diff --git a/packages/contracts-bedrock/src/L2/OptimismSuperchainERC20Beacon.sol b/packages/contracts-bedrock/src/L2/OptimismSuperchainERC20Beacon.sol new file mode 100644 index 000000000000..d1160819a2ec --- /dev/null +++ b/packages/contracts-bedrock/src/L2/OptimismSuperchainERC20Beacon.sol @@ -0,0 +1,27 @@ +// SPDX-License-Identifier: MIT +pragma solidity 0.8.15; + +import { IBeacon } from "@openzeppelin/contracts/proxy/beacon/IBeacon.sol"; +import { ISemver } from "src/universal/interfaces/ISemver.sol"; + +/// @custom:proxied +/// @custom:predeployed 0x4200000000000000000000000000000000000027 +/// @title OptimismSuperchainERC20Beacon +/// @notice OptimismSuperchainERC20Beacon is the beacon proxy for the OptimismSuperchainERC20 implementation. +contract OptimismSuperchainERC20Beacon is IBeacon, ISemver { + /// @notice Address of the OptimismSuperchainERC20 implementation. + address internal immutable IMPLEMENTATION; + + /// @notice Semantic version. + /// @custom:semver 1.0.0-beta.1 + string public constant version = "1.0.0-beta.1"; + + constructor(address _implementation) { + IMPLEMENTATION = _implementation; + } + + /// @inheritdoc IBeacon + function implementation() external view override returns (address) { + return IMPLEMENTATION; + } +} diff --git a/packages/contracts-bedrock/src/L2/OptimismSuperchainERC20Factory.sol b/packages/contracts-bedrock/src/L2/OptimismSuperchainERC20Factory.sol new file mode 100644 index 000000000000..426510159720 --- /dev/null +++ b/packages/contracts-bedrock/src/L2/OptimismSuperchainERC20Factory.sol @@ -0,0 +1,62 @@ +// SPDX-License-Identifier: MIT +pragma solidity 0.8.25; + +import { IOptimismERC20Factory } from "src/L2/interfaces/IOptimismERC20Factory.sol"; +import { ISemver } from "src/universal/interfaces/ISemver.sol"; +import { OptimismSuperchainERC20 } from "src/L2/OptimismSuperchainERC20.sol"; +import { Predeploys } from "src/libraries/Predeploys.sol"; +import { BeaconProxy } from "@openzeppelin/contracts-v5/proxy/beacon/BeaconProxy.sol"; +import { CREATE3 } from "@rari-capital/solmate/src/utils/CREATE3.sol"; + +/// @custom:proxied +/// @custom:predeployed 0x4200000000000000000000000000000000000026 +/// @title OptimismSuperchainERC20Factory +/// @notice OptimismSuperchainERC20Factory is a factory contract that deploys OptimismSuperchainERC20 Beacon Proxies +/// using CREATE3. +contract OptimismSuperchainERC20Factory is IOptimismERC20Factory, ISemver { + /// @notice Mapping of the deployed OptimismSuperchainERC20 to the remote token address. + /// This is used to keep track of the token deployments. + mapping(address superchainToken => address remoteToken) public deployments; + + /// @notice Emitted when an OptimismSuperchainERC20 is deployed. + /// @param superchainToken Address of the SuperchainERC20 deployment. + /// @param remoteToken Address of the corresponding token on the remote chain. + /// @param deployer Address of the account that deployed the token. + event OptimismSuperchainERC20Created( + address indexed superchainToken, address indexed remoteToken, address deployer + ); + + /// @notice Semantic version. + /// @custom:semver 1.0.0-beta.1 + string public constant version = "1.0.0-beta.1"; + + /// @notice Deploys a OptimismSuperchainERC20 Beacon Proxy using CREATE3. + /// @param _remoteToken Address of the remote token. + /// @param _name Name of the OptimismSuperchainERC20. + /// @param _symbol Symbol of the OptimismSuperchainERC20. + /// @param _decimals Decimals of the OptimismSuperchainERC20. + /// @return _superchainERC20 Address of the OptimismSuperchainERC20 deployment. + function deploy( + address _remoteToken, + string memory _name, + string memory _symbol, + uint8 _decimals + ) + external + returns (address _superchainERC20) + { + bytes memory initCallData = + abi.encodeCall(OptimismSuperchainERC20.initialize, (_remoteToken, _name, _symbol, _decimals)); + + bytes memory creationCode = bytes.concat( + type(BeaconProxy).creationCode, abi.encode(Predeploys.OPTIMISM_SUPERCHAIN_ERC20_BEACON, initCallData) + ); + + bytes32 salt = keccak256(abi.encode(_remoteToken, _name, _symbol, _decimals)); + _superchainERC20 = CREATE3.deploy({ salt: salt, creationCode: creationCode, value: 0 }); + + deployments[_superchainERC20] = _remoteToken; + + emit OptimismSuperchainERC20Created(_superchainERC20, _remoteToken, msg.sender); + } +} diff --git a/packages/contracts-bedrock/src/L2/SequencerFeeVault.sol b/packages/contracts-bedrock/src/L2/SequencerFeeVault.sol index 5f2c329db192..fecbb7e1b7cd 100644 --- a/packages/contracts-bedrock/src/L2/SequencerFeeVault.sol +++ b/packages/contracts-bedrock/src/L2/SequencerFeeVault.sol @@ -1,17 +1,17 @@ // SPDX-License-Identifier: MIT pragma solidity 0.8.15; -import { ISemver } from "src/universal/ISemver.sol"; +import { ISemver } from "src/universal/interfaces/ISemver.sol"; import { FeeVault } from "src/universal/FeeVault.sol"; -/// @custom:proxied +/// @custom:proxied true /// @custom:predeploy 0x4200000000000000000000000000000000000011 /// @title SequencerFeeVault /// @notice The SequencerFeeVault is the contract that holds any fees paid to the Sequencer during /// transaction processing and block production. contract SequencerFeeVault is FeeVault, ISemver { - /// @custom:semver 1.4.1 - string public constant version = "1.4.1"; + /// @custom:semver 1.5.0-beta.2 + string public constant version = "1.5.0-beta.2"; /// @notice Constructs the SequencerFeeVault contract. /// @param _recipient Wallet that will receive the fees. diff --git a/packages/contracts-bedrock/src/L2/SuperchainERC20.sol b/packages/contracts-bedrock/src/L2/SuperchainERC20.sol new file mode 100644 index 000000000000..e20b375ff891 --- /dev/null +++ b/packages/contracts-bedrock/src/L2/SuperchainERC20.sol @@ -0,0 +1,49 @@ +// SPDX-License-Identifier: MIT +pragma solidity 0.8.25; + +import { ISuperchainERC20Extensions, ISuperchainERC20Errors } from "src/L2/interfaces/ISuperchainERC20.sol"; +import { ERC20 } from "@solady/tokens/ERC20.sol"; +import { IL2ToL2CrossDomainMessenger } from "src/L2/interfaces/IL2ToL2CrossDomainMessenger.sol"; +import { Predeploys } from "src/libraries/Predeploys.sol"; + +/// @title SuperchainERC20 +/// @notice SuperchainERC20 is a standard extension of the base ERC20 token contract that unifies ERC20 token +/// bridging to make it fungible across the Superchain. It builds on top of the L2ToL2CrossDomainMessenger for +/// both replay protection and domain binding. +abstract contract SuperchainERC20 is ISuperchainERC20Extensions, ISuperchainERC20Errors, ERC20 { + /// @notice Address of the L2ToL2CrossDomainMessenger Predeploy. + address internal constant MESSENGER = Predeploys.L2_TO_L2_CROSS_DOMAIN_MESSENGER; + + /// @notice Sends tokens to some target address on another chain. + /// @param _to Address to send tokens to. + /// @param _amount Amount of tokens to send. + /// @param _chainId Chain ID of the destination chain. + function sendERC20(address _to, uint256 _amount, uint256 _chainId) external virtual { + if (_to == address(0)) revert ZeroAddress(); + + _burn(msg.sender, _amount); + + bytes memory _message = abi.encodeCall(this.relayERC20, (msg.sender, _to, _amount)); + IL2ToL2CrossDomainMessenger(MESSENGER).sendMessage(_chainId, address(this), _message); + + emit SendERC20(msg.sender, _to, _amount, _chainId); + } + + /// @notice Relays tokens received from another chain. + /// @param _from Address of the msg.sender of sendERC20 on the source chain. + /// @param _to Address to relay tokens to. + /// @param _amount Amount of tokens to relay. + function relayERC20(address _from, address _to, uint256 _amount) external virtual { + if (msg.sender != MESSENGER) revert CallerNotL2ToL2CrossDomainMessenger(); + + if (IL2ToL2CrossDomainMessenger(MESSENGER).crossDomainMessageSender() != address(this)) { + revert InvalidCrossDomainSender(); + } + + uint256 source = IL2ToL2CrossDomainMessenger(MESSENGER).crossDomainMessageSource(); + + _mint(_to, _amount); + + emit RelayERC20(_from, _to, _amount, source); + } +} diff --git a/packages/contracts-bedrock/src/L2/SuperchainWETH.sol b/packages/contracts-bedrock/src/L2/SuperchainWETH.sol new file mode 100644 index 000000000000..a672918ffea1 --- /dev/null +++ b/packages/contracts-bedrock/src/L2/SuperchainWETH.sol @@ -0,0 +1,98 @@ +// SPDX-License-Identifier: MIT +pragma solidity 0.8.15; + +// Contracts +import { WETH98 } from "src/universal/WETH98.sol"; + +// Libraries +import { Unauthorized, NotCustomGasToken } from "src/libraries/errors/CommonErrors.sol"; +import { Predeploys } from "src/libraries/Predeploys.sol"; + +// Interfaces +import { ISemver } from "src/universal/interfaces/ISemver.sol"; +import { IL2ToL2CrossDomainMessenger } from "src/L2/interfaces/IL2ToL2CrossDomainMessenger.sol"; +import { ISuperchainERC20Extensions } from "src/L2/interfaces/ISuperchainERC20.sol"; +import { IL1Block } from "src/L2/interfaces/IL1Block.sol"; +import { IETHLiquidity } from "src/L2/interfaces/IETHLiquidity.sol"; + +/// @title SuperchainWETH +/// @notice SuperchainWETH is a version of WETH that can be freely transfrered between chains +/// within the superchain. SuperchainWETH can be converted into native ETH on chains that +/// do not use a custom gas token. +contract SuperchainWETH is WETH98, ISuperchainERC20Extensions, ISemver { + /// @notice Semantic version. + /// @custom:semver 1.0.0-beta.4 + string public constant version = "1.0.0-beta.4"; + + /// @inheritdoc WETH98 + function deposit() public payable override { + if (IL1Block(Predeploys.L1_BLOCK_ATTRIBUTES).isCustomGasToken()) revert NotCustomGasToken(); + super.deposit(); + } + + /// @inheritdoc WETH98 + function withdraw(uint256 wad) public override { + if (IL1Block(Predeploys.L1_BLOCK_ATTRIBUTES).isCustomGasToken()) revert NotCustomGasToken(); + super.withdraw(wad); + } + + /// @inheritdoc ISuperchainERC20Extensions + function sendERC20(address dst, uint256 wad, uint256 chainId) public { + // Burn from user's balance. + _burn(msg.sender, wad); + + // Burn to ETHLiquidity contract. + if (!IL1Block(Predeploys.L1_BLOCK_ATTRIBUTES).isCustomGasToken()) { + IETHLiquidity(Predeploys.ETH_LIQUIDITY).burn{ value: wad }(); + } + + // Send message to other chain. + IL2ToL2CrossDomainMessenger(Predeploys.L2_TO_L2_CROSS_DOMAIN_MESSENGER).sendMessage({ + _destination: chainId, + _target: address(this), + _message: abi.encodeCall(this.relayERC20, (msg.sender, dst, wad)) + }); + + // Emit event. + emit SendERC20(msg.sender, dst, wad, chainId); + } + + /// @inheritdoc ISuperchainERC20Extensions + function relayERC20(address from, address dst, uint256 wad) external { + // Receive message from other chain. + IL2ToL2CrossDomainMessenger messenger = IL2ToL2CrossDomainMessenger(Predeploys.L2_TO_L2_CROSS_DOMAIN_MESSENGER); + if (msg.sender != address(messenger)) revert Unauthorized(); + if (messenger.crossDomainMessageSender() != address(this)) revert Unauthorized(); + + // Mint from ETHLiquidity contract. + if (!IL1Block(Predeploys.L1_BLOCK_ATTRIBUTES).isCustomGasToken()) { + IETHLiquidity(Predeploys.ETH_LIQUIDITY).mint(wad); + } + + // Get source chain ID. + uint256 source = messenger.crossDomainMessageSource(); + + // Mint to user's balance. + _mint(dst, wad); + + // Emit event. + emit RelayERC20(from, dst, wad, source); + } + + /// @notice Mints WETH to an address. + /// @param guy The address to mint WETH to. + /// @param wad The amount of WETH to mint. + function _mint(address guy, uint256 wad) internal { + balanceOf[guy] += wad; + emit Transfer(address(0), guy, wad); + } + + /// @notice Burns WETH from an address. + /// @param guy The address to burn WETH from. + /// @param wad The amount of WETH to burn. + function _burn(address guy, uint256 wad) internal { + require(balanceOf[guy] >= wad); + balanceOf[guy] -= wad; + emit Transfer(guy, address(0), wad); + } +} diff --git a/packages/contracts-bedrock/src/L2/WETH.sol b/packages/contracts-bedrock/src/L2/WETH.sol index 42b957f45e95..fb24f0747338 100644 --- a/packages/contracts-bedrock/src/L2/WETH.sol +++ b/packages/contracts-bedrock/src/L2/WETH.sol @@ -1,26 +1,31 @@ // SPDX-License-Identifier: MIT pragma solidity 0.8.15; -import { WETH98 } from "src/dispute/weth/WETH98.sol"; +// Contracts +import { WETH98 } from "src/universal/WETH98.sol"; + +// Libraries import { Predeploys } from "src/libraries/Predeploys.sol"; -import { L1Block } from "src/L2/L1Block.sol"; -import { ISemver } from "src/universal/ISemver.sol"; + +// Interfaces +import { ISemver } from "src/universal/interfaces/ISemver.sol"; +import { IL1Block } from "src/L2/interfaces/IL1Block.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"; + /// @custom:semver 1.1.0-beta.2 + string public constant version = "1.1.0-beta.2"; /// @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()); + name_ = string.concat("Wrapped ", IL1Block(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()); + symbol_ = string.concat("W", IL1Block(Predeploys.L1_BLOCK_ATTRIBUTES).gasPayingTokenSymbol()); } } diff --git a/packages/contracts-bedrock/src/L2/interfaces/IBaseFeeVault.sol b/packages/contracts-bedrock/src/L2/interfaces/IBaseFeeVault.sol new file mode 100644 index 000000000000..9843189bdb14 --- /dev/null +++ b/packages/contracts-bedrock/src/L2/interfaces/IBaseFeeVault.sol @@ -0,0 +1,15 @@ +// SPDX-License-Identifier: MIT +pragma solidity ^0.8.0; + +import { IFeeVault } from "src/universal/interfaces/IFeeVault.sol"; + +interface IBaseFeeVault is IFeeVault { + function version() external view returns (string memory); + + function __constructor__( + address _recipient, + uint256 _minWithdrawalAmount, + WithdrawalNetwork _withdrawalNetwork + ) + external; +} diff --git a/packages/contracts-bedrock/src/L2/interfaces/ICrossL2Inbox.sol b/packages/contracts-bedrock/src/L2/interfaces/ICrossL2Inbox.sol new file mode 100644 index 000000000000..3d8fa8a471a8 --- /dev/null +++ b/packages/contracts-bedrock/src/L2/interfaces/ICrossL2Inbox.sol @@ -0,0 +1,59 @@ +// 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 interop start timestamp. + /// @return interopStart_ interop start timestamp. + function interopStart() external view returns (uint256 interopStart_); + + /// @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; + + /// @notice Validates a cross chain message on the destination chain + /// and emits an ExecutingMessage event. This function is useful + /// for applications that understand the schema of the _message payload and want to + /// process it in a custom way. + /// @param _id Identifier of the message. + /// @param _msgHash Hash of the message payload to call target with. + function validateMessage(Identifier calldata _id, bytes32 _msgHash) external; +} diff --git a/packages/contracts-bedrock/src/L2/interfaces/IDependencySet.sol b/packages/contracts-bedrock/src/L2/interfaces/IDependencySet.sol new file mode 100644 index 000000000000..fb294bee8d19 --- /dev/null +++ b/packages/contracts-bedrock/src/L2/interfaces/IDependencySet.sol @@ -0,0 +1,12 @@ +// SPDX-License-Identifier: MIT +pragma solidity ^0.8.0; + +/// @title IDependencySet +/// @notice Interface for L1Block with only `isInDependencySet(uint256)` method. +interface IDependencySet { + /// @notice Returns true if 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); +} diff --git a/packages/contracts-bedrock/src/L2/interfaces/IETHLiquidity.sol b/packages/contracts-bedrock/src/L2/interfaces/IETHLiquidity.sol new file mode 100644 index 000000000000..de463f543b71 --- /dev/null +++ b/packages/contracts-bedrock/src/L2/interfaces/IETHLiquidity.sol @@ -0,0 +1,14 @@ +// SPDX-License-Identifier: MIT +pragma solidity ^0.8.0; + +interface IETHLiquidity { + error NotCustomGasToken(); + error Unauthorized(); + + event LiquidityBurned(address indexed caller, uint256 value); + event LiquidityMinted(address indexed caller, uint256 value); + + function burn() external payable; + function mint(uint256 _amount) external; + function version() external view returns (string memory); +} diff --git a/packages/contracts-bedrock/src/L2/interfaces/IGasPriceOracle.sol b/packages/contracts-bedrock/src/L2/interfaces/IGasPriceOracle.sol new file mode 100644 index 000000000000..4ab0ef854c8a --- /dev/null +++ b/packages/contracts-bedrock/src/L2/interfaces/IGasPriceOracle.sol @@ -0,0 +1,23 @@ +// SPDX-License-Identifier: MIT +pragma solidity ^0.8.0; + +interface IGasPriceOracle { + function DECIMALS() external view returns (uint256); + function baseFee() external view returns (uint256); + function baseFeeScalar() external view returns (uint32); + function blobBaseFee() external view returns (uint256); + function blobBaseFeeScalar() external view returns (uint32); + function decimals() external pure returns (uint256); + function gasPrice() external view returns (uint256); + function getL1Fee(bytes memory _data) external view returns (uint256); + function getL1FeeUpperBound(uint256 _unsignedTxSize) external view returns (uint256); + function getL1GasUsed(bytes memory _data) external view returns (uint256); + function isEcotone() external view returns (bool); + function isFjord() external view returns (bool); + function l1BaseFee() external view returns (uint256); + function overhead() external view returns (uint256); + function scalar() external view returns (uint256); + function setEcotone() external; + function setFjord() external; + function version() external view returns (string memory); +} diff --git a/packages/contracts-bedrock/src/L2/interfaces/IL1Block.sol b/packages/contracts-bedrock/src/L2/interfaces/IL1Block.sol new file mode 100644 index 000000000000..6ef4c2984ae4 --- /dev/null +++ b/packages/contracts-bedrock/src/L2/interfaces/IL1Block.sol @@ -0,0 +1,39 @@ +// SPDX-License-Identifier: MIT +pragma solidity ^0.8.0; + +interface IL1Block { + error NotDepositor(); + + event GasPayingTokenSet(address indexed token, uint8 indexed decimals, bytes32 name, bytes32 symbol); + + function DEPOSITOR_ACCOUNT() external pure returns (address addr_); + function baseFeeScalar() external view returns (uint32); + function basefee() external view returns (uint256); + function batcherHash() external view returns (bytes32); + function blobBaseFee() external view returns (uint256); + function blobBaseFeeScalar() external view returns (uint32); + function gasPayingToken() external view returns (address addr_, uint8 decimals_); + function gasPayingTokenName() external view returns (string memory name_); + function gasPayingTokenSymbol() external view returns (string memory symbol_); + function hash() external view returns (bytes32); + function isCustomGasToken() external view returns (bool); + function l1FeeOverhead() external view returns (uint256); + function l1FeeScalar() external view returns (uint256); + function number() external view returns (uint64); + function sequenceNumber() external view returns (uint64); + function setGasPayingToken(address _token, uint8 _decimals, bytes32 _name, bytes32 _symbol) external; + function setL1BlockValues( + uint64 _number, + uint64 _timestamp, + uint256 _basefee, + bytes32 _hash, + uint64 _sequenceNumber, + bytes32 _batcherHash, + uint256 _l1FeeOverhead, + uint256 _l1FeeScalar + ) + external; + function setL1BlockValuesEcotone() external; + function timestamp() external view returns (uint64); + function version() external pure returns (string memory); +} diff --git a/packages/contracts-bedrock/src/L2/interfaces/IL1BlockIsthmus.sol b/packages/contracts-bedrock/src/L2/interfaces/IL1BlockIsthmus.sol new file mode 100644 index 000000000000..7ff15eda51b0 --- /dev/null +++ b/packages/contracts-bedrock/src/L2/interfaces/IL1BlockIsthmus.sol @@ -0,0 +1,58 @@ +// SPDX-License-Identifier: MIT +pragma solidity ^0.8.0; + +enum ConfigType { + SET_GAS_PAYING_TOKEN, + ADD_DEPENDENCY, + REMOVE_DEPENDENCY +} + +interface IL1BlockIsthmus { + error AlreadyDependency(); + error CantRemovedDependency(); + error DependencySetSizeTooLarge(); + error NotCrossL2Inbox(); + error NotDependency(); + error NotDepositor(); + + event DependencyAdded(uint256 indexed chainId); + event DependencyRemoved(uint256 indexed chainId); + event GasPayingTokenSet(address indexed token, uint8 indexed decimals, bytes32 name, bytes32 symbol); + + function DEPOSITOR_ACCOUNT() external pure returns (address addr_); + function baseFeeScalar() external view returns (uint32); + function basefee() external view returns (uint256); + function batcherHash() external view returns (bytes32); + function blobBaseFee() external view returns (uint256); + function blobBaseFeeScalar() external view returns (uint32); + function dependencySetSize() external view returns (uint8); + function depositsComplete() external; + function gasPayingToken() external view returns (address addr_, uint8 decimals_); + function gasPayingTokenName() external view returns (string memory name_); + function gasPayingTokenSymbol() external view returns (string memory symbol_); + function hash() external view returns (bytes32); + function isCustomGasToken() external view returns (bool); + function isDeposit() external view returns (bool isDeposit_); + function isInDependencySet(uint256 _chainId) external view returns (bool); + function l1FeeOverhead() external view returns (uint256); + function l1FeeScalar() external view returns (uint256); + function number() external view returns (uint64); + function sequenceNumber() external view returns (uint64); + function setConfig(ConfigType _type, bytes memory _value) external; + function setGasPayingToken(address _token, uint8 _decimals, bytes32 _name, bytes32 _symbol) external; + function setL1BlockValues( + uint64 _number, + uint64 _timestamp, + uint256 _basefee, + bytes32 _hash, + uint64 _sequenceNumber, + bytes32 _batcherHash, + uint256 _l1FeeOverhead, + uint256 _l1FeeScalar + ) + external; + function setL1BlockValuesEcotone() external; + function setL1BlockValuesIsthmus() external; + function timestamp() external view returns (uint64); + function version() external pure returns (string memory); +} diff --git a/packages/contracts-bedrock/src/L2/interfaces/IL1FeeVault.sol b/packages/contracts-bedrock/src/L2/interfaces/IL1FeeVault.sol new file mode 100644 index 000000000000..89ac3b782fca --- /dev/null +++ b/packages/contracts-bedrock/src/L2/interfaces/IL1FeeVault.sol @@ -0,0 +1,15 @@ +// SPDX-License-Identifier: MIT +pragma solidity ^0.8.0; + +import { IFeeVault } from "src/universal/interfaces/IFeeVault.sol"; + +interface IL1FeeVault is IFeeVault { + function version() external view returns (string memory); + + function __constructor__( + address _recipient, + uint256 _minWithdrawalAmount, + WithdrawalNetwork _withdrawalNetwork + ) + external; +} diff --git a/packages/contracts-bedrock/src/L2/interfaces/IL2CrossDomainMessenger.sol b/packages/contracts-bedrock/src/L2/interfaces/IL2CrossDomainMessenger.sol new file mode 100644 index 000000000000..1cb49f674ec0 --- /dev/null +++ b/packages/contracts-bedrock/src/L2/interfaces/IL2CrossDomainMessenger.sol @@ -0,0 +1,13 @@ +// SPDX-License-Identifier: MIT +pragma solidity ^0.8.0; + +import { ICrossDomainMessenger } from "src/universal/interfaces/ICrossDomainMessenger.sol"; + +interface IL2CrossDomainMessenger is ICrossDomainMessenger { + function MESSAGE_VERSION() external view returns (uint16); + function initialize(ICrossDomainMessenger _l1CrossDomainMessenger) external; + function l1CrossDomainMessenger() external view returns (ICrossDomainMessenger); + function version() external view returns (string memory); + + function __constructor__() external; +} diff --git a/packages/contracts-bedrock/src/L2/interfaces/IL2ERC721Bridge.sol b/packages/contracts-bedrock/src/L2/interfaces/IL2ERC721Bridge.sol new file mode 100644 index 000000000000..a760ce1d803c --- /dev/null +++ b/packages/contracts-bedrock/src/L2/interfaces/IL2ERC721Bridge.sol @@ -0,0 +1,20 @@ +// SPDX-License-Identifier: MIT +pragma solidity ^0.8.0; + +import { IERC721Bridge } from "src/universal/interfaces/IERC721Bridge.sol"; + +interface IL2ERC721Bridge is IERC721Bridge { + function finalizeBridgeERC721( + address _localToken, + address _remoteToken, + address _from, + address _to, + uint256 _tokenId, + bytes memory _extraData + ) + external; + function initialize(address payable _l1ERC721Bridge) external; + function version() external view returns (string memory); + + function __constructor__() external; +} diff --git a/packages/contracts-bedrock/src/L2/interfaces/IL2StandardBridge.sol b/packages/contracts-bedrock/src/L2/interfaces/IL2StandardBridge.sol new file mode 100644 index 000000000000..9f9ce1a85621 --- /dev/null +++ b/packages/contracts-bedrock/src/L2/interfaces/IL2StandardBridge.sol @@ -0,0 +1,48 @@ +// SPDX-License-Identifier: MIT +pragma solidity ^0.8.0; + +import { IStandardBridge } from "src/universal/interfaces/IStandardBridge.sol"; + +interface IL2StandardBridge is IStandardBridge { + event DepositFinalized( + address indexed l1Token, + address indexed l2Token, + address indexed from, + address to, + uint256 amount, + bytes extraData + ); + event WithdrawalInitiated( + address indexed l1Token, + address indexed l2Token, + address indexed from, + address to, + uint256 amount, + bytes extraData + ); + + receive() external payable; + + function initialize(IStandardBridge _otherBridge) external; + function l1TokenBridge() external view returns (address); + function version() external pure returns (string memory); + function withdraw( + address _l2Token, + uint256 _amount, + uint32 _minGasLimit, + bytes memory _extraData + ) + external + payable; + function withdrawTo( + address _l2Token, + address _to, + uint256 _amount, + uint32 _minGasLimit, + bytes memory _extraData + ) + external + payable; + + function __constructor__() external; +} diff --git a/packages/contracts-bedrock/src/L2/interfaces/IL2StandardBridgeInterop.sol b/packages/contracts-bedrock/src/L2/interfaces/IL2StandardBridgeInterop.sol new file mode 100644 index 000000000000..227b48881fa6 --- /dev/null +++ b/packages/contracts-bedrock/src/L2/interfaces/IL2StandardBridgeInterop.sol @@ -0,0 +1,98 @@ +// SPDX-License-Identifier: MIT +pragma solidity ^0.8.0; + +import { IERC20 } from "@openzeppelin/contracts/token/ERC20/IERC20.sol"; +import { IStandardBridge } from "src/universal/interfaces/IStandardBridge.sol"; +import { ICrossDomainMessenger } from "src/universal/interfaces/ICrossDomainMessenger.sol"; + +interface IMintableAndBurnable is IERC20 { + function mint(address, uint256) external; + function burn(address, uint256) external; +} + +interface IL2StandardBridgeInterop is IStandardBridge { + error InvalidDecimals(); + error InvalidLegacyERC20Address(); + error InvalidSuperchainERC20Address(); + error InvalidTokenPair(); + + event Converted(address indexed from, address indexed to, address indexed caller, uint256 amount); + + receive() external payable; + + event DepositFinalized( + address indexed l1Token, + address indexed l2Token, + address indexed from, + address to, + uint256 amount, + bytes extraData + ); + event WithdrawalInitiated( + address indexed l1Token, + address indexed l2Token, + address indexed from, + address to, + uint256 amount, + bytes extraData + ); + + function MESSENGER() external view returns (ICrossDomainMessenger); + function OTHER_BRIDGE() external view returns (IStandardBridge); + function bridgeERC20( + address _localToken, + address _remoteToken, + uint256 _amount, + uint32 _minGasLimit, + bytes memory _extraData + ) + external; + function bridgeERC20To( + address _localToken, + address _remoteToken, + address _to, + uint256 _amount, + uint32 _minGasLimit, + bytes memory _extraData + ) + external; + function bridgeETH(uint32 _minGasLimit, bytes memory _extraData) external payable; + function bridgeETHTo(address _to, uint32 _minGasLimit, bytes memory _extraData) external payable; + function deposits(address, address) external view returns (uint256); + function finalizeBridgeERC20( + address _localToken, + address _remoteToken, + address _from, + address _to, + uint256 _amount, + bytes memory _extraData + ) + external; + function finalizeBridgeETH(address _from, address _to, uint256 _amount, bytes memory _extraData) external payable; + function messenger() external view returns (ICrossDomainMessenger); + function otherBridge() external view returns (IStandardBridge); + function paused() external view returns (bool); + + function initialize(IStandardBridge _otherBridge) external; + function l1TokenBridge() external view returns (address); + function withdraw( + address _l2Token, + uint256 _amount, + uint32 _minGasLimit, + bytes memory _extraData + ) + external + payable; + function withdrawTo( + address _l2Token, + address _to, + uint256 _amount, + uint32 _minGasLimit, + bytes memory _extraData + ) + external + payable; + + function convert(address _from, address _to, uint256 _amount) external; + function version() external pure returns (string memory); +} diff --git a/packages/contracts-bedrock/src/L2/interfaces/IL2ToL1MessagePasser.sol b/packages/contracts-bedrock/src/L2/interfaces/IL2ToL1MessagePasser.sol new file mode 100644 index 000000000000..751cf51a40db --- /dev/null +++ b/packages/contracts-bedrock/src/L2/interfaces/IL2ToL1MessagePasser.sol @@ -0,0 +1,24 @@ +// SPDX-License-Identifier: MIT +pragma solidity ^0.8.0; + +interface IL2ToL1MessagePasser { + event MessagePassed( + uint256 indexed nonce, + address indexed sender, + address indexed target, + uint256 value, + uint256 gasLimit, + bytes data, + bytes32 withdrawalHash + ); + event WithdrawerBalanceBurnt(uint256 indexed amount); + + receive() external payable; + + function MESSAGE_VERSION() external view returns (uint16); + function burn() external; + function initiateWithdrawal(address _target, uint256 _gasLimit, bytes memory _data) external payable; + function messageNonce() external view returns (uint256); + function sentMessages(bytes32) external view returns (bool); + function version() external view returns (string memory); +} diff --git a/packages/contracts-bedrock/src/L2/interfaces/IL2ToL2CrossDomainMessenger.sol b/packages/contracts-bedrock/src/L2/interfaces/IL2ToL2CrossDomainMessenger.sol new file mode 100644 index 000000000000..cb8d1952de65 --- /dev/null +++ b/packages/contracts-bedrock/src/L2/interfaces/IL2ToL2CrossDomainMessenger.sol @@ -0,0 +1,56 @@ +// SPDX-License-Identifier: MIT +pragma solidity ^0.8.0; + +/// @title IL2ToL2CrossDomainMessenger +/// @notice Interface for the L2ToL2CrossDomainMessenger contract. +interface IL2ToL2CrossDomainMessenger { + /// @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. + /// @param _msgHash message hash to check. + /// @return Returns true if the message corresponding to the `_msgHash` was successfully relayed. + function successfulMessages(bytes32 _msgHash) external view returns (bool); + + /// @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() external view returns (uint256); + + /// @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; + + /// @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/interfaces/IOptimismERC20Factory.sol b/packages/contracts-bedrock/src/L2/interfaces/IOptimismERC20Factory.sol new file mode 100644 index 000000000000..5e0040aa83cf --- /dev/null +++ b/packages/contracts-bedrock/src/L2/interfaces/IOptimismERC20Factory.sol @@ -0,0 +1,12 @@ +// SPDX-License-Identifier: MIT +pragma solidity ^0.8.0; + +/// @title IOptimismERC20Factory +/// @notice Generic interface for IOptimismMintableERC20Factory and ISuperchainERC20Factory. Used to +/// determine if a ERC20 contract is deployed by a factory. +interface IOptimismERC20Factory { + /// @notice Checks if a ERC20 token is deployed by the factory. + /// @param _localToken The address of the ERC20 token to check the deployment. + /// @return _remoteToken The address of the remote token if it is deployed or `address(0)` if not. + function deployments(address _localToken) external view returns (address _remoteToken); +} diff --git a/packages/contracts-bedrock/src/L2/interfaces/IOptimismSuperchainERC20.sol b/packages/contracts-bedrock/src/L2/interfaces/IOptimismSuperchainERC20.sol new file mode 100644 index 000000000000..5f537c1f51ec --- /dev/null +++ b/packages/contracts-bedrock/src/L2/interfaces/IOptimismSuperchainERC20.sol @@ -0,0 +1,39 @@ +// SPDX-License-Identifier: MIT +pragma solidity ^0.8.0; + +// Interfaces +import { IERC20Solady } from "src/vendor/interfaces/IERC20Solady.sol"; +import { ISuperchainERC20Extensions, ISuperchainERC20Errors } from "src/L2/interfaces/ISuperchainERC20.sol"; + +/// @title IOptimismSuperchainERC20Extension +/// @notice This interface is available on the OptimismSuperchainERC20 contract. +/// We declare it as a separate interface so that it can be used in +/// custom implementations of SuperchainERC20. +interface IOptimismSuperchainERC20Extension is ISuperchainERC20Extensions, ISuperchainERC20Errors { + /// @notice Emitted whenever tokens are minted for an account. + /// @param account Address of the account tokens are being minted for. + /// @param amount Amount of tokens minted. + event Mint(address indexed account, uint256 amount); + + /// @notice Emitted whenever tokens are burned from an account. + /// @param account Address of the account tokens are being burned from. + /// @param amount Amount of tokens burned. + event Burn(address indexed account, uint256 amount); + + /// @notice Allows the L2StandardBridge to mint tokens. + /// @param _to Address to mint tokens to. + /// @param _amount Amount of tokens to mint. + function mint(address _to, uint256 _amount) external; + + /// @notice Allows the L2StandardBridge to burn tokens. + /// @param _from Address to burn tokens from. + /// @param _amount Amount of tokens to burn. + function burn(address _from, uint256 _amount) external; + + /// @notice Returns the address of the corresponding version of this token on the remote chain. + function remoteToken() external view returns (address); +} + +/// @title IOptimismSuperchainERC20 +/// @notice Combines Solady's ERC20 interface with the OptimismSuperchainERC20Extension interface. +interface IOptimismSuperchainERC20 is IERC20Solady, IOptimismSuperchainERC20Extension { } diff --git a/packages/contracts-bedrock/src/L2/interfaces/ISequencerFeeVault.sol b/packages/contracts-bedrock/src/L2/interfaces/ISequencerFeeVault.sol new file mode 100644 index 000000000000..1987d07bb7f7 --- /dev/null +++ b/packages/contracts-bedrock/src/L2/interfaces/ISequencerFeeVault.sol @@ -0,0 +1,16 @@ +// SPDX-License-Identifier: MIT +pragma solidity ^0.8.0; + +import { IFeeVault } from "src/universal/interfaces/IFeeVault.sol"; + +interface ISequencerFeeVault is IFeeVault { + function version() external view returns (string memory); + function l1FeeWallet() external view returns (address); + + function __constructor__( + address _recipient, + uint256 _minWithdrawalAmount, + WithdrawalNetwork _withdrawalNetwork + ) + external; +} diff --git a/packages/contracts-bedrock/src/L2/interfaces/ISuperchainERC20.sol b/packages/contracts-bedrock/src/L2/interfaces/ISuperchainERC20.sol new file mode 100644 index 000000000000..fee6a2c2f7bd --- /dev/null +++ b/packages/contracts-bedrock/src/L2/interfaces/ISuperchainERC20.sol @@ -0,0 +1,56 @@ +// SPDX-License-Identifier: MIT +pragma solidity ^0.8.0; + +// Interfaces +import { IERC20Solady } from "src/vendor/interfaces/IERC20Solady.sol"; + +/// @title ISuperchainERC20Extensions +/// @notice Interface for the extensions to the ERC20 standard that are used by SuperchainERC20. +/// Exists in case developers are already importing the ERC20 interface separately and +/// importing the full SuperchainERC20 interface would cause conflicting imports. +interface ISuperchainERC20Extensions { + /// @notice Emitted when tokens are sent from one chain to another. + /// @param from Address of the sender. + /// @param to Address of the recipient. + /// @param amount Number of tokens sent. + /// @param destination Chain ID of the destination chain. + event SendERC20(address indexed from, address indexed to, uint256 amount, uint256 destination); + + /// @notice Emitted whenever tokens are successfully relayed on this chain. + /// @param from Address of the msg.sender of sendERC20 on the source chain. + /// @param to Address of the recipient. + /// @param amount Amount of tokens relayed. + /// @param source Chain ID of the source chain. + event RelayERC20(address indexed from, address indexed to, uint256 amount, uint256 source); + + /// @notice Sends tokens to some target address on another chain. + /// @param _to Address to send tokens to. + /// @param _amount Amount of tokens to send. + /// @param _chainId Chain ID of the destination chain. + function sendERC20(address _to, uint256 _amount, uint256 _chainId) external; + + /// @notice Relays tokens received from another chain. + /// @param _from Address of the msg.sender of sendERC20 on the source chain. + /// @param _to Address to relay tokens to. + /// @param _amount Amount of tokens to relay. + function relayERC20(address _from, address _to, uint256 _amount) external; +} + +/// @title ISuperchainERC20Errors +/// @notice Interface containing the errors added in the SuperchainERC20 implementation. +interface ISuperchainERC20Errors { + /// @notice Thrown when attempting to relay a message and the function caller (msg.sender) is not + /// L2ToL2CrossDomainMessenger. + error CallerNotL2ToL2CrossDomainMessenger(); + + /// @notice Thrown when attempting to relay a message and the cross domain message sender is not this + /// SuperchainERC20. + error InvalidCrossDomainSender(); + + /// @notice Thrown when attempting to perform an operation and the account is the zero address. + error ZeroAddress(); +} + +/// @title ISuperchainERC20 +/// @notice Combines Solady's ERC20 interface with the SuperchainERC20Extensions interface. +interface ISuperchainERC20 is IERC20Solady, ISuperchainERC20Extensions, ISuperchainERC20Errors { } diff --git a/packages/contracts-bedrock/src/L2/interfaces/ISuperchainWETH.sol b/packages/contracts-bedrock/src/L2/interfaces/ISuperchainWETH.sol new file mode 100644 index 000000000000..7c755e11e869 --- /dev/null +++ b/packages/contracts-bedrock/src/L2/interfaces/ISuperchainWETH.sol @@ -0,0 +1,33 @@ +// SPDX-License-Identifier: MIT +pragma solidity ^0.8.0; + +interface ISuperchainWETH { + error NotCustomGasToken(); + error Unauthorized(); + + event Approval(address indexed src, address indexed guy, uint256 wad); + event Deposit(address indexed dst, uint256 wad); + event RelayERC20(address indexed from, address indexed to, uint256 amount, uint256 source); + event SendERC20(address indexed from, address indexed to, uint256 amount, uint256 destination); + event Transfer(address indexed src, address indexed dst, uint256 wad); + event Withdrawal(address indexed src, uint256 wad); + + fallback() external payable; + + receive() external payable; + + function allowance(address, address) external view returns (uint256); + function approve(address guy, uint256 wad) external returns (bool); + function balanceOf(address) external view returns (uint256); + function decimals() external view returns (uint8); + function deposit() external payable; + function name() external view returns (string memory); + function relayERC20(address from, address dst, uint256 wad) external; + function sendERC20(address dst, uint256 wad, uint256 chainId) external; + function symbol() external view returns (string memory); + function totalSupply() external view returns (uint256); + function transfer(address dst, uint256 wad) external returns (bool); + function transferFrom(address src, address dst, uint256 wad) external returns (bool); + function version() external view returns (string memory); + function withdraw(uint256 wad) external; +} diff --git a/packages/contracts-bedrock/src/Safe/DeputyGuardianModule.sol b/packages/contracts-bedrock/src/Safe/DeputyGuardianModule.sol deleted file mode 100644 index d88fe317f9a8..000000000000 --- a/packages/contracts-bedrock/src/Safe/DeputyGuardianModule.sol +++ /dev/null @@ -1,144 +0,0 @@ -// 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/cannon/MIPS.sol b/packages/contracts-bedrock/src/cannon/MIPS.sol index b47fb9313f7e..f1d216c8e6de 100644 --- a/packages/contracts-bedrock/src/cannon/MIPS.sol +++ b/packages/contracts-bedrock/src/cannon/MIPS.sol @@ -1,9 +1,14 @@ // SPDX-License-Identifier: MIT pragma solidity 0.8.15; -import { ISemver } from "src/universal/ISemver.sol"; +import { ISemver } from "src/universal/interfaces/ISemver.sol"; import { IPreimageOracle } from "./interfaces/IPreimageOracle.sol"; import { PreimageKeyLib } from "./PreimageKeyLib.sol"; +import { MIPSInstructions as ins } from "src/cannon/libraries/MIPSInstructions.sol"; +import { MIPSSyscalls as sys } from "src/cannon/libraries/MIPSSyscalls.sol"; +import { MIPSState as st } from "src/cannon/libraries/MIPSState.sol"; +import { MIPSMemory } from "src/cannon/libraries/MIPSMemory.sol"; +import { InvalidRMWInstruction } from "src/cannon/libraries/CannonErrors.sol"; /// @title MIPS /// @notice The MIPS contract emulates a single MIPS instruction. @@ -39,27 +44,16 @@ contract MIPS is ISemver { uint32[32] registers; } - /// @notice Start of the data segment. - uint32 public constant BRK_START = 0x40000000; - /// @notice The semantic version of the MIPS contract. - /// @custom:semver 1.0.1 - string public constant version = "1.0.1"; - - uint32 internal constant FD_STDIN = 0; - uint32 internal constant FD_STDOUT = 1; - uint32 internal constant FD_STDERR = 2; - uint32 internal constant FD_HINT_READ = 3; - uint32 internal constant FD_HINT_WRITE = 4; - uint32 internal constant FD_PREIMAGE_READ = 5; - uint32 internal constant FD_PREIMAGE_WRITE = 6; - - uint32 internal constant EBADF = 0x9; - uint32 internal constant EINVAL = 0x16; + /// @custom:semver 1.1.1-beta.4 + string public constant version = "1.1.1-beta.4"; /// @notice The preimage oracle contract. IPreimageOracle internal immutable ORACLE; + // The offset of the start of proof calldata (_proof.offset) in the step() function + uint256 internal constant STEP_PROOF_OFFSET = 420; + /// @param _oracle The address of the preimage oracle contract. constructor(IPreimageOracle _oracle) { ORACLE = _oracle; @@ -71,16 +65,6 @@ contract MIPS is ISemver { oracle_ = ORACLE; } - /// @notice Extends the value leftwards with its most significant bit (sign extension). - function SE(uint32 _dat, uint32 _idx) internal pure returns (uint32 out_) { - unchecked { - bool isSigned = (_dat >> (_idx - 1)) != 0; - uint256 signed = ((1 << (32 - _idx)) - 1) << _idx; - uint256 mask = (1 << _idx) - 1; - return uint32(_dat & mask | (isSigned ? signed : 0)); - } - } - /// @notice Computes the hash of the MIPS state. /// @return out_ The hashed MIPS state. function outputState() internal returns (bytes32 out_) { @@ -115,6 +99,14 @@ contract MIPS is ISemver { from, to := copyMem(from, to, 8) // step from := add(from, 32) // offset to registers + // Verify that the value of exited is valid (0 or 1) + if gt(exited, 1) { + // revert InvalidExitedValue(); + let ptr := mload(0x40) + mstore(ptr, shl(224, 0x0136cc76)) + revert(ptr, 0x04) + } + // Copy registers for { let i := 0 } lt(i, 32) { i := add(i, 1) } { from, to := copyMem(from, to, 4) } @@ -156,481 +148,60 @@ contract MIPS is ISemver { state := 0x80 } - // Load the syscall number from the registers - uint32 syscall_no = state.registers[2]; + // Load the syscall numbers and args from the registers + (uint32 syscall_no, uint32 a0, uint32 a1, uint32 a2,) = sys.getSyscallArgs(state.registers); + uint32 v0 = 0; uint32 v1 = 0; - // Load the syscall arguments from the registers - uint32 a0 = state.registers[4]; - uint32 a1 = state.registers[5]; - uint32 a2 = state.registers[6]; - - // mmap: Allocates a page from the heap. - if (syscall_no == 4090) { - uint32 sz = a1; - if (sz & 4095 != 0) { - // adjust size to align with page size - sz += 4096 - (sz & 4095); - } - if (a0 == 0) { - v0 = state.heap; - state.heap += sz; - } else { - v0 = a0; - } - } - // brk: Returns a fixed address for the program break at 0x40000000 - else if (syscall_no == 4045) { - v0 = BRK_START; - } - // clone (not supported) returns 1 - else if (syscall_no == 4120) { + if (syscall_no == sys.SYS_MMAP) { + (v0, v1, state.heap) = sys.handleSysMmap(a0, a1, state.heap); + } else if (syscall_no == sys.SYS_BRK) { + // brk: Returns a fixed address for the program break at 0x40000000 + v0 = sys.PROGRAM_BREAK; + } else if (syscall_no == sys.SYS_CLONE) { + // clone (not supported) returns 1 v0 = 1; - } - // exit group: Sets the Exited and ExitCode states to true and argument 0. - else if (syscall_no == 4246) { + } else if (syscall_no == sys.SYS_EXIT_GROUP) { + // exit group: Sets the Exited and ExitCode states to true and argument 0. state.exited = true; state.exitCode = uint8(a0); return outputState(); - } - // read: Like Linux read syscall. Splits unaligned reads into aligned reads. - else if (syscall_no == 4003) { - // args: a0 = fd, a1 = addr, a2 = count - // returns: v0 = read, v1 = err code - if (a0 == FD_STDIN) { - // Leave v0 and v1 zero: read nothing, no error - } - // pre-image oracle read - else if (a0 == FD_PREIMAGE_READ) { - // verify proof 1 is correct, and get the existing memory. - uint32 mem = readMem(a1 & 0xFFffFFfc, 1); // mask the addr to align it to 4 bytes - bytes32 preimageKey = state.preimageKey; - // If the preimage key is a local key, localize it in the context of the caller. - if (uint8(preimageKey[0]) == 1) { - preimageKey = PreimageKeyLib.localize(preimageKey, _localContext); - } - (bytes32 dat, uint256 datLen) = ORACLE.readPreimage(preimageKey, state.preimageOffset); - - // Transform data for writing to memory - // We use assembly for more precise ops, and no var count limit - assembly { - let alignment := and(a1, 3) // the read might not start at an aligned address - let space := sub(4, alignment) // remaining space in memory word - if lt(space, datLen) { datLen := space } // if less space than data, shorten data - if lt(a2, datLen) { datLen := a2 } // if requested to read less, read less - dat := shr(sub(256, mul(datLen, 8)), dat) // right-align data - dat := shl(mul(sub(sub(4, datLen), alignment), 8), dat) // position data to insert into memory - // word - let mask := sub(shl(mul(sub(4, alignment), 8), 1), 1) // mask all bytes after start - let suffixMask := sub(shl(mul(sub(sub(4, alignment), datLen), 8), 1), 1) // mask of all bytes - // starting from end, maybe none - mask := and(mask, not(suffixMask)) // reduce mask to just cover the data we insert - mem := or(and(mem, not(mask)), dat) // clear masked part of original memory, and insert data - } - - // Write memory back - writeMem(a1 & 0xFFffFFfc, 1, mem); - state.preimageOffset += uint32(datLen); - v0 = uint32(datLen); - } - // hint response - else if (a0 == FD_HINT_READ) { - // Don't read into memory, just say we read it all - // The result is ignored anyway - v0 = a2; - } else { - v0 = 0xFFffFFff; - v1 = EBADF; - } - } - // write: like Linux write syscall. Splits unaligned writes into aligned writes. - else if (syscall_no == 4004) { - // args: a0 = fd, a1 = addr, a2 = count - // returns: v0 = written, v1 = err code - if (a0 == FD_STDOUT || a0 == FD_STDERR || a0 == FD_HINT_WRITE) { - v0 = a2; // tell program we have written everything - } - // pre-image oracle - else if (a0 == FD_PREIMAGE_WRITE) { - uint32 mem = readMem(a1 & 0xFFffFFfc, 1); // mask the addr to align it to 4 bytes - bytes32 key = state.preimageKey; - - // Construct pre-image key from memory - // We use assembly for more precise ops, and no var count limit - assembly { - let alignment := and(a1, 3) // the read might not start at an aligned address - let space := sub(4, alignment) // remaining space in memory word - if lt(space, a2) { a2 := space } // if less space than data, shorten data - key := shl(mul(a2, 8), key) // shift key, make space for new info - let mask := sub(shl(mul(a2, 8), 1), 1) // mask for extracting value from memory - mem := and(shr(mul(sub(space, a2), 8), mem), mask) // align value to right, mask it - key := or(key, mem) // insert into key - } - - // Write pre-image key to oracle - state.preimageKey = key; - state.preimageOffset = 0; // reset offset, to read new pre-image data from the start - v0 = a2; - } else { - v0 = 0xFFffFFff; - v1 = EBADF; - } - } - // fcntl: Like linux fcntl syscall, but only supports minimal file-descriptor control commands, - // to retrieve the file-descriptor R/W flags. - else if (syscall_no == 4055) { - // fcntl - // args: a0 = fd, a1 = cmd - if (a1 == 3) { - // F_GETFL: get file descriptor flags - if (a0 == FD_STDIN || a0 == FD_PREIMAGE_READ || a0 == FD_HINT_READ) { - v0 = 0; // O_RDONLY - } else if (a0 == FD_STDOUT || a0 == FD_STDERR || a0 == FD_PREIMAGE_WRITE || a0 == FD_HINT_WRITE) { - v0 = 1; // O_WRONLY - } else { - v0 = 0xFFffFFff; - v1 = EBADF; - } - } else { - v0 = 0xFFffFFff; - v1 = EINVAL; // cmd not recognized by this kernel - } - } + } else if (syscall_no == sys.SYS_READ) { + sys.SysReadParams memory args = sys.SysReadParams({ + a0: a0, + a1: a1, + a2: a2, + preimageKey: state.preimageKey, + preimageOffset: state.preimageOffset, + localContext: _localContext, + oracle: ORACLE, + proofOffset: MIPSMemory.memoryProofOffset(STEP_PROOF_OFFSET, 1), + memRoot: state.memRoot + }); + (v0, v1, state.preimageOffset, state.memRoot,,) = sys.handleSysRead(args); + } else if (syscall_no == sys.SYS_WRITE) { + (v0, v1, state.preimageKey, state.preimageOffset) = sys.handleSysWrite({ + _a0: a0, + _a1: a1, + _a2: a2, + _preimageKey: state.preimageKey, + _preimageOffset: state.preimageOffset, + _proofOffset: MIPSMemory.memoryProofOffset(STEP_PROOF_OFFSET, 1), + _memRoot: state.memRoot + }); + } else if (syscall_no == sys.SYS_FCNTL) { + (v0, v1) = sys.handleSysFcntl(a0, a1); + } + + st.CpuScalars memory cpu = getCpuScalars(state); + sys.handleSyscallUpdates(cpu, state.registers, v0, v1); + setStateCpuScalars(state, cpu); - // Write the results back to the state registers - state.registers[2] = v0; - state.registers[7] = v1; - - // Update the PC and nextPC - state.pc = state.nextPC; - state.nextPC = state.nextPC + 4; - - out_ = outputState(); - } - } - - /// @notice Handles a branch instruction, updating the MIPS state PC where needed. - /// @param _opcode The opcode of the branch instruction. - /// @param _insn The instruction to be executed. - /// @param _rtReg The register to be used for the branch. - /// @param _rs The register to be compared with the branch register. - /// @return out_ The hashed MIPS state. - function handleBranch(uint32 _opcode, uint32 _insn, uint32 _rtReg, uint32 _rs) internal returns (bytes32 out_) { - unchecked { - // Load state from memory - State memory state; - assembly { - state := 0x80 - } - - bool shouldBranch = false; - - if (state.nextPC != state.pc + 4) { - revert("branch in delay slot"); - } - - // beq/bne: Branch on equal / not equal - if (_opcode == 4 || _opcode == 5) { - uint32 rt = state.registers[_rtReg]; - shouldBranch = (_rs == rt && _opcode == 4) || (_rs != rt && _opcode == 5); - } - // blez: Branches if instruction is less than or equal to zero - else if (_opcode == 6) { - shouldBranch = int32(_rs) <= 0; - } - // bgtz: Branches if instruction is greater than zero - else if (_opcode == 7) { - shouldBranch = int32(_rs) > 0; - } - // bltz/bgez: Branch on less than zero / greater than or equal to zero - else if (_opcode == 1) { - // regimm - uint32 rtv = ((_insn >> 16) & 0x1F); - if (rtv == 0) { - shouldBranch = int32(_rs) < 0; - } - if (rtv == 1) { - shouldBranch = int32(_rs) >= 0; - } - } - - // Update the state's previous PC - uint32 prevPC = state.pc; - - // Execute the delay slot first - state.pc = state.nextPC; - - // If we should branch, update the PC to the branch target - // Otherwise, proceed to the next instruction - if (shouldBranch) { - state.nextPC = prevPC + 4 + (SE(_insn & 0xFFFF, 16) << 2); - } else { - state.nextPC = state.nextPC + 4; - } - - // Return the hash of the resulting state out_ = outputState(); } } - /// @notice Handles HI and LO register instructions. - /// @param _func The function code of the instruction. - /// @param _rs The value of the RS register. - /// @param _rt The value of the RT register. - /// @param _storeReg The register to store the result in. - /// @return out_ The hashed MIPS state. - function handleHiLo(uint32 _func, uint32 _rs, uint32 _rt, uint32 _storeReg) internal returns (bytes32 out_) { - unchecked { - // Load state from memory - State memory state; - assembly { - state := 0x80 - } - - uint32 val; - - // mfhi: Move the contents of the HI register into the destination - if (_func == 0x10) { - val = state.hi; - } - // mthi: Move the contents of the source into the HI register - else if (_func == 0x11) { - state.hi = _rs; - } - // mflo: Move the contents of the LO register into the destination - else if (_func == 0x12) { - val = state.lo; - } - // mtlo: Move the contents of the source into the LO register - else if (_func == 0x13) { - state.lo = _rs; - } - // mult: Multiplies `rs` by `rt` and stores the result in HI and LO registers - else if (_func == 0x18) { - uint64 acc = uint64(int64(int32(_rs)) * int64(int32(_rt))); - state.hi = uint32(acc >> 32); - state.lo = uint32(acc); - } - // multu: Unsigned multiplies `rs` by `rt` and stores the result in HI and LO registers - else if (_func == 0x19) { - uint64 acc = uint64(uint64(_rs) * uint64(_rt)); - state.hi = uint32(acc >> 32); - state.lo = uint32(acc); - } - // div: Divides `rs` by `rt`. - // 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)); - } - // divu: Unsigned divides `rs` by `rt`. - // 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; - } - - // Store the result in the destination register, if applicable - if (_storeReg != 0) { - state.registers[_storeReg] = val; - } - - // Update the PC - state.pc = state.nextPC; - state.nextPC = state.nextPC + 4; - - // Return the hash of the resulting state - out_ = outputState(); - } - } - - /// @notice Handles a jump instruction, updating the MIPS state PC where needed. - /// @param _linkReg The register to store the link to the instruction after the delay slot instruction. - /// @param _dest The destination to jump to. - /// @return out_ The hashed MIPS state. - function handleJump(uint32 _linkReg, uint32 _dest) internal returns (bytes32 out_) { - unchecked { - // Load state from memory. - State memory state; - assembly { - state := 0x80 - } - - if (state.nextPC != state.pc + 4) { - revert("jump in delay slot"); - } - - // Update the next PC to the jump destination. - uint32 prevPC = state.pc; - state.pc = state.nextPC; - state.nextPC = _dest; - - // Update the link-register to the instruction after the delay slot instruction. - if (_linkReg != 0) { - state.registers[_linkReg] = prevPC + 8; - } - - // Return the hash of the resulting state. - out_ = outputState(); - } - } - - /// @notice Handles a storing a value into a register. - /// @param _storeReg The register to store the value into. - /// @param _val The value to store. - /// @param _conditional Whether or not the store is conditional. - /// @return out_ The hashed MIPS state. - function handleRd(uint32 _storeReg, uint32 _val, bool _conditional) internal returns (bytes32 out_) { - unchecked { - // Load state from memory. - State memory state; - assembly { - state := 0x80 - } - - // The destination register must be valid. - require(_storeReg < 32, "valid register"); - - // Never write to reg 0, and it can be conditional (movz, movn). - if (_storeReg != 0 && _conditional) { - state.registers[_storeReg] = _val; - } - - // Update the PC. - state.pc = state.nextPC; - state.nextPC = state.nextPC + 4; - - // Return the hash of the resulting state. - out_ = outputState(); - } - } - - /// @notice Computes the offset of the proof in the calldata. - /// @param _proofIndex The index of the proof in the calldata. - /// @return offset_ The offset of the proof in the calldata. - function proofOffset(uint8 _proofIndex) internal pure returns (uint256 offset_) { - unchecked { - // A proof of 32 bit memory, with 32-byte leaf values, is (32-5)=27 bytes32 entries. - // And the leaf value itself needs to be encoded as well. And proof.offset == 420 - offset_ = 420 + (uint256(_proofIndex) * (28 * 32)); - uint256 s = 0; - assembly { - s := calldatasize() - } - require(s >= (offset_ + 28 * 32), "check that there is enough calldata"); - return offset_; - } - } - - /// @notice Reads a 32-bit value from memory. - /// @param _addr The address to read from. - /// @param _proofIndex The index of the proof in the calldata. - /// @return out_ The hashed MIPS state. - function readMem(uint32 _addr, uint8 _proofIndex) internal pure returns (uint32 out_) { - unchecked { - // Compute the offset of the proof in the calldata. - uint256 offset = proofOffset(_proofIndex); - - assembly { - // Validate the address alignement. - if and(_addr, 3) { revert(0, 0) } - - // Load the leaf value. - let leaf := calldataload(offset) - offset := add(offset, 32) - - // Convenience function to hash two nodes together in scratch space. - function hashPair(a, b) -> h { - mstore(0, a) - mstore(32, b) - h := keccak256(0, 64) - } - - // Start with the leaf node. - // Work back up by combining with siblings, to reconstruct the root. - let path := shr(5, _addr) - let node := leaf - for { let i := 0 } lt(i, 27) { i := add(i, 1) } { - let sibling := calldataload(offset) - offset := add(offset, 32) - switch and(shr(i, path), 1) - case 0 { node := hashPair(node, sibling) } - case 1 { node := hashPair(sibling, node) } - } - - // Load the memory root from the first field of state. - let memRoot := mload(0x80) - - // Verify the root matches. - if iszero(eq(node, memRoot)) { - mstore(0, 0x0badf00d) - revert(0, 32) - } - - // Bits to shift = (32 - 4 - (addr % 32)) * 8 - let shamt := shl(3, sub(sub(32, 4), and(_addr, 31))) - out_ := and(shr(shamt, leaf), 0xFFffFFff) - } - } - } - - /// @notice Writes a 32-bit value to memory. - /// This function first overwrites the part of the leaf. - /// Then it recomputes the memory merkle root. - /// @param _addr The address to write to. - /// @param _proofIndex The index of the proof in the calldata. - /// @param _val The value to write. - function writeMem(uint32 _addr, uint8 _proofIndex, uint32 _val) internal pure { - unchecked { - // Compute the offset of the proof in the calldata. - uint256 offset = proofOffset(_proofIndex); - - assembly { - // Validate the address alignement. - if and(_addr, 3) { revert(0, 0) } - - // Load the leaf value. - let leaf := calldataload(offset) - let shamt := shl(3, sub(sub(32, 4), and(_addr, 31))) - - // Mask out 4 bytes, and OR in the value - leaf := or(and(leaf, not(shl(shamt, 0xFFffFFff))), shl(shamt, _val)) - offset := add(offset, 32) - - // Convenience function to hash two nodes together in scratch space. - function hashPair(a, b) -> h { - mstore(0, a) - mstore(32, b) - h := keccak256(0, 64) - } - - // Start with the leaf node. - // Work back up by combining with siblings, to reconstruct the root. - let path := shr(5, _addr) - let node := leaf - for { let i := 0 } lt(i, 27) { i := add(i, 1) } { - let sibling := calldataload(offset) - offset := add(offset, 32) - switch and(shr(i, path), 1) - case 0 { node := hashPair(node, sibling) } - case 1 { node := hashPair(sibling, node) } - } - - // Store the new memory root in the first field of state. - mstore(0x80, node) - } - } - } - /// @notice Executes a single step of the vm. /// Will revert if any required input state is missing. /// @param _stateData The encoded state witness data. @@ -655,7 +226,7 @@ contract MIPS is ISemver { // 32*4+4=132 expected state data offset revert(0, 0) } - if iszero(eq(_proof.offset, 420)) { + if iszero(eq(_proof.offset, STEP_PROOF_OFFSET)) { // 132+32+256=420 expected proof offset revert(0, 0) } @@ -681,10 +252,24 @@ contract MIPS is ISemver { c, m := putField(c, m, 4) // heap c, m := putField(c, m, 1) // exitCode c, m := putField(c, m, 1) // exited + let exited := mload(sub(m, 32)) c, m := putField(c, m, 8) // step + // Verify that the value of exited is valid (0 or 1) + if gt(exited, 1) { + // revert InvalidExitedValue(); + let ptr := mload(0x40) + mstore(ptr, shl(224, 0x0136cc76)) + revert(ptr, 0x04) + } + + // Compiler should have done this already + if iszero(eq(mload(m), add(m, 32))) { + // expected registers offset check + revert(0, 0) + } + // Unpack register calldata into memory - mstore(m, add(m, 32)) // offset to registers m := add(m, 32) for { let i := 0 } lt(i, 32) { i := add(i, 1) } { c, m := putField(c, m, 4) } } @@ -697,364 +282,77 @@ contract MIPS is ISemver { state.step += 1; // instruction fetch - uint32 insn = readMem(state.pc, 0); - uint32 opcode = insn >> 26; // 6-bits - - // j-type j/jal - if (opcode == 2 || opcode == 3) { - // Take top 4 bits of the next PC (its 256 MB region), and concatenate with the 26-bit offset - uint32 target = (state.nextPC & 0xF0000000) | (insn & 0x03FFFFFF) << 2; - return handleJump(opcode == 2 ? 0 : 31, target); - } - - // register fetch - uint32 rs; // source register 1 value - uint32 rt; // source register 2 / temp value - uint32 rtReg = (insn >> 16) & 0x1F; - - // R-type or I-type (stores rt) - rs = state.registers[(insn >> 21) & 0x1F]; - uint32 rdReg = rtReg; - - if (opcode == 0 || opcode == 0x1c) { - // R-type (stores rd) - rt = state.registers[rtReg]; - rdReg = (insn >> 11) & 0x1F; - } else if (opcode < 0x20) { - // rt is SignExtImm - // don't sign extend for andi, ori, xori - if (opcode == 0xC || opcode == 0xD || opcode == 0xe) { - // ZeroExtImm - rt = insn & 0xFFFF; - } else { - // SignExtImm - rt = SE(insn & 0xFFFF, 16); - } - } else if (opcode >= 0x28 || opcode == 0x22 || opcode == 0x26) { - // store rt value with store - rt = state.registers[rtReg]; - - // store actual rt with lwl and lwr - rdReg = rtReg; - } - - if ((opcode >= 4 && opcode < 8) || opcode == 1) { - return handleBranch(opcode, insn, rtReg, rs); - } - - uint32 storeAddr = 0xFF_FF_FF_FF; - // memory fetch (all I-type) - // we do the load for stores also - uint32 mem; - if (opcode >= 0x20) { - // M[R[rs]+SignExtImm] - rs += SE(insn & 0xFFFF, 16); - uint32 addr = rs & 0xFFFFFFFC; - mem = readMem(addr, 1); - if (opcode >= 0x28 && opcode != 0x30) { - // store - storeAddr = addr; - // store opcodes don't write back to a register - rdReg = 0; - } - } - - // ALU - uint32 val = execute(insn, rs, rt, mem) & 0xffFFffFF; // swr outputs more than 4 bytes without the mask - - uint32 func = insn & 0x3f; // 6-bits - if (opcode == 0 && func >= 8 && func < 0x1c) { - if (func == 8 || func == 9) { - // jr/jalr - return handleJump(func == 8 ? 0 : rdReg, rs); - } - - if (func == 0xa) { - // movz - return handleRd(rdReg, rs, rt == 0); - } - if (func == 0xb) { - // movn - return handleRd(rdReg, rs, rt != 0); - } - - // syscall (can read and write) - if (func == 0xC) { - return handleSyscall(_localContext); - } - - // lo and hi registers - // can write back - if (func >= 0x10 && func < 0x1c) { - return handleHiLo(func, rs, rt, rdReg); - } - } + uint256 insnProofOffset = MIPSMemory.memoryProofOffset(STEP_PROOF_OFFSET, 0); + (uint32 insn, uint32 opcode, uint32 fun) = + ins.getInstructionDetails(state.pc, state.memRoot, insnProofOffset); + + // Handle syscall separately + // syscall (can read and write) + if (opcode == 0 && fun == 0xC) { + return handleSyscall(_localContext); + } + + // Handle RMW (read-modify-write) ops + if (opcode == ins.OP_LOAD_LINKED || opcode == ins.OP_STORE_CONDITIONAL) { + return handleRMWOps(state, insn, opcode); + } + + // Exec the rest of the step logic + st.CpuScalars memory cpu = getCpuScalars(state); + ins.CoreStepLogicParams memory coreStepArgs = ins.CoreStepLogicParams({ + cpu: cpu, + registers: state.registers, + memRoot: state.memRoot, + memProofOffset: MIPSMemory.memoryProofOffset(STEP_PROOF_OFFSET, 1), + insn: insn, + opcode: opcode, + fun: fun + }); + (state.memRoot,,) = ins.execMipsCoreStepLogic(coreStepArgs); + setStateCpuScalars(state, cpu); + + return outputState(); + } + } - // stupid sc, write a 1 to rt - if (opcode == 0x38 && rtReg != 0) { - state.registers[rtReg] = 1; + function handleRMWOps(State memory _state, uint32 _insn, uint32 _opcode) internal returns (bytes32) { + unchecked { + uint32 baseReg = (_insn >> 21) & 0x1F; + uint32 base = _state.registers[baseReg]; + uint32 rtReg = (_insn >> 16) & 0x1F; + uint32 offset = ins.signExtendImmediate(_insn); + + uint32 effAddr = (base + offset) & 0xFFFFFFFC; + uint256 memProofOffset = MIPSMemory.memoryProofOffset(STEP_PROOF_OFFSET, 1); + uint32 mem = MIPSMemory.readMem(_state.memRoot, effAddr, memProofOffset); + + uint32 retVal; + if (_opcode == ins.OP_LOAD_LINKED) { + retVal = mem; + } else if (_opcode == ins.OP_STORE_CONDITIONAL) { + uint32 val = _state.registers[rtReg]; + _state.memRoot = MIPSMemory.writeMem(effAddr, memProofOffset, val); + retVal = 1; // 1 for success + } else { + revert InvalidRMWInstruction(); } - // write memory - if (storeAddr != 0xFF_FF_FF_FF) { - writeMem(storeAddr, 1, val); - } + st.CpuScalars memory cpu = getCpuScalars(_state); + ins.handleRd(cpu, _state.registers, rtReg, retVal, true); + setStateCpuScalars(_state, cpu); - // write back the value to destination register - return handleRd(rdReg, val, true); + return outputState(); } } - /// @notice Execute an instruction. - function execute(uint32 insn, uint32 rs, uint32 rt, uint32 mem) internal pure returns (uint32 out) { - unchecked { - uint32 opcode = insn >> 26; // 6-bits - - if (opcode == 0 || (opcode >= 8 && opcode < 0xF)) { - uint32 func = insn & 0x3f; // 6-bits - assembly { - // transform ArithLogI to SPECIAL - switch opcode - // addi - case 0x8 { func := 0x20 } - // addiu - case 0x9 { func := 0x21 } - // stli - case 0xA { func := 0x2A } - // sltiu - case 0xB { func := 0x2B } - // andi - case 0xC { func := 0x24 } - // ori - case 0xD { func := 0x25 } - // xori - case 0xE { func := 0x26 } - } + function getCpuScalars(State memory _state) internal pure returns (st.CpuScalars memory) { + return st.CpuScalars({ pc: _state.pc, nextPC: _state.nextPC, lo: _state.lo, hi: _state.hi }); + } - // sll - if (func == 0x00) { - return rt << ((insn >> 6) & 0x1F); - } - // srl - else if (func == 0x02) { - return rt >> ((insn >> 6) & 0x1F); - } - // sra - else if (func == 0x03) { - uint32 shamt = (insn >> 6) & 0x1F; - return SE(rt >> shamt, 32 - shamt); - } - // sllv - else if (func == 0x04) { - return rt << (rs & 0x1F); - } - // srlv - else if (func == 0x6) { - return rt >> (rs & 0x1F); - } - // srav - else if (func == 0x07) { - return SE(rt >> rs, 32 - rs); - } - // functs in range [0x8, 0x1b] are handled specially by other functions - // Explicitly enumerate each funct in range to reduce code diff against Go Vm - // jr - else if (func == 0x08) { - return rs; - } - // jalr - else if (func == 0x09) { - return rs; - } - // movz - else if (func == 0x0a) { - return rs; - } - // movn - else if (func == 0x0b) { - return rs; - } - // syscall - else if (func == 0x0c) { - return rs; - } - // 0x0d - break not supported - // sync - else if (func == 0x0f) { - return rs; - } - // mfhi - else if (func == 0x10) { - return rs; - } - // mthi - else if (func == 0x11) { - return rs; - } - // mflo - else if (func == 0x12) { - return rs; - } - // mtlo - else if (func == 0x13) { - return rs; - } - // mult - else if (func == 0x18) { - return rs; - } - // multu - else if (func == 0x19) { - return rs; - } - // div - else if (func == 0x1a) { - return rs; - } - // divu - else if (func == 0x1b) { - return rs; - } - // The rest includes transformed R-type arith imm instructions - // add - else if (func == 0x20) { - return (rs + rt); - } - // addu - else if (func == 0x21) { - return (rs + rt); - } - // sub - else if (func == 0x22) { - return (rs - rt); - } - // subu - else if (func == 0x23) { - return (rs - rt); - } - // and - else if (func == 0x24) { - return (rs & rt); - } - // or - else if (func == 0x25) { - return (rs | rt); - } - // xor - else if (func == 0x26) { - return (rs ^ rt); - } - // nor - else if (func == 0x27) { - return ~(rs | rt); - } - // slti - else if (func == 0x2a) { - return int32(rs) < int32(rt) ? 1 : 0; - } - // sltiu - else if (func == 0x2b) { - return rs < rt ? 1 : 0; - } else { - revert("invalid instruction"); - } - } else { - // SPECIAL2 - if (opcode == 0x1C) { - uint32 func = insn & 0x3f; // 6-bits - // mul - if (func == 0x2) { - return uint32(int32(rs) * int32(rt)); - } - // clz, clo - else if (func == 0x20 || func == 0x21) { - if (func == 0x20) { - rs = ~rs; - } - uint32 i = 0; - while (rs & 0x80000000 != 0) { - i++; - rs <<= 1; - } - return i; - } - } - // lui - else if (opcode == 0x0F) { - return rt << 16; - } - // lb - else if (opcode == 0x20) { - return SE((mem >> (24 - (rs & 3) * 8)) & 0xFF, 8); - } - // lh - else if (opcode == 0x21) { - return SE((mem >> (16 - (rs & 2) * 8)) & 0xFFFF, 16); - } - // lwl - else if (opcode == 0x22) { - uint32 val = mem << ((rs & 3) * 8); - uint32 mask = uint32(0xFFFFFFFF) << ((rs & 3) * 8); - return (rt & ~mask) | val; - } - // lw - else if (opcode == 0x23) { - return mem; - } - // lbu - else if (opcode == 0x24) { - return (mem >> (24 - (rs & 3) * 8)) & 0xFF; - } - // lhu - else if (opcode == 0x25) { - return (mem >> (16 - (rs & 2) * 8)) & 0xFFFF; - } - // lwr - else if (opcode == 0x26) { - uint32 val = mem >> (24 - (rs & 3) * 8); - uint32 mask = uint32(0xFFFFFFFF) >> (24 - (rs & 3) * 8); - return (rt & ~mask) | val; - } - // sb - else if (opcode == 0x28) { - uint32 val = (rt & 0xFF) << (24 - (rs & 3) * 8); - uint32 mask = 0xFFFFFFFF ^ uint32(0xFF << (24 - (rs & 3) * 8)); - return (mem & mask) | val; - } - // sh - else if (opcode == 0x29) { - uint32 val = (rt & 0xFFFF) << (16 - (rs & 2) * 8); - uint32 mask = 0xFFFFFFFF ^ uint32(0xFFFF << (16 - (rs & 2) * 8)); - return (mem & mask) | val; - } - // swl - else if (opcode == 0x2a) { - uint32 val = rt >> ((rs & 3) * 8); - uint32 mask = uint32(0xFFFFFFFF) >> ((rs & 3) * 8); - return (mem & ~mask) | val; - } - // sw - else if (opcode == 0x2b) { - return rt; - } - // swr - else if (opcode == 0x2e) { - uint32 val = rt << (24 - (rs & 3) * 8); - uint32 mask = uint32(0xFFFFFFFF) << (24 - (rs & 3) * 8); - return (mem & ~mask) | val; - } - // ll - else if (opcode == 0x30) { - return mem; - } - // sc - else if (opcode == 0x38) { - return rt; - } else { - revert("invalid instruction"); - } - } - revert("invalid instruction"); - } + function setStateCpuScalars(State memory _state, st.CpuScalars memory _cpu) internal pure { + _state.pc = _cpu.pc; + _state.nextPC = _cpu.nextPC; + _state.lo = _cpu.lo; + _state.hi = _cpu.hi; } } diff --git a/packages/contracts-bedrock/src/cannon/MIPS2.sol b/packages/contracts-bedrock/src/cannon/MIPS2.sol new file mode 100644 index 000000000000..45811d9b46c8 --- /dev/null +++ b/packages/contracts-bedrock/src/cannon/MIPS2.sol @@ -0,0 +1,889 @@ +// SPDX-License-Identifier: MIT +pragma solidity 0.8.15; + +import { ISemver } from "src/universal/interfaces/ISemver.sol"; +import { IPreimageOracle } from "./interfaces/IPreimageOracle.sol"; +import { MIPSMemory } from "src/cannon/libraries/MIPSMemory.sol"; +import { MIPSSyscalls as sys } from "src/cannon/libraries/MIPSSyscalls.sol"; +import { MIPSState as st } from "src/cannon/libraries/MIPSState.sol"; +import { MIPSInstructions as ins } from "src/cannon/libraries/MIPSInstructions.sol"; +import { VMStatuses } from "src/dispute/lib/Types.sol"; +import { + InvalidMemoryProof, InvalidRMWInstruction, InvalidSecondMemoryProof +} from "src/cannon/libraries/CannonErrors.sol"; + +/// @title MIPS2 +/// @notice The MIPS2 contract emulates a single MIPS instruction. +/// It differs from MIPS.sol in that it supports multi-threading. +contract MIPS2 is ISemver { + /// @notice The thread context. + /// Total state size: 4 + 1 + 1 + 4 + 4 + 8 + 4 + 4 + 4 + 4 + 32 * 4 = 166 bytes + struct ThreadState { + // metadata + uint32 threadID; + uint8 exitCode; + bool exited; + // state + uint32 futexAddr; + uint32 futexVal; + uint64 futexTimeoutStep; + uint32 pc; + uint32 nextPC; + uint32 lo; + uint32 hi; + uint32[32] registers; + } + + /// @notice Stores the VM state. + /// Total state size: 32 + 32 + 4 + 4 + 1 + 4 + 4 + 1 + 1 + 8 + 8 + 4 + 1 + 32 + 32 + 4 = 172 bytes + /// If nextPC != pc + 4, then the VM is executing a branch/jump delay slot. + struct State { + bytes32 memRoot; + bytes32 preimageKey; + uint32 preimageOffset; + uint32 heap; + bool llReservationActive; + uint32 llAddress; + uint32 llOwnerThread; + uint8 exitCode; + bool exited; + uint64 step; + uint64 stepsSinceLastContextSwitch; + uint32 wakeup; + bool traverseRight; + bytes32 leftThreadStack; + bytes32 rightThreadStack; + uint32 nextThreadID; + } + + /// @notice The semantic version of the MIPS2 contract. + /// @custom:semver 1.0.0-beta.10 + string public constant version = "1.0.0-beta.10"; + + /// @notice The preimage oracle contract. + IPreimageOracle internal immutable ORACLE; + + // The offset of the start of proof calldata (_threadWitness.offset) in the step() function + uint256 internal constant THREAD_PROOF_OFFSET = 356; + + // The offset of the start of proof calldata (_memProof.offset) in the step() function + uint256 internal constant MEM_PROOF_OFFSET = THREAD_PROOF_OFFSET + 166 + 32; + + // The empty thread root - keccak256(bytes32(0) ++ bytes32(0)) + bytes32 internal constant EMPTY_THREAD_ROOT = hex"ad3228b676f7d3cd4284a5443f17f1962b36e491b30a40b2405849e597ba5fb5"; + + // State memory offset allocated during step + uint256 internal constant STATE_MEM_OFFSET = 0x80; + + // ThreadState memory offset allocated during step + uint256 internal constant TC_MEM_OFFSET = 0x280; + + /// @param _oracle The address of the preimage oracle contract. + constructor(IPreimageOracle _oracle) { + ORACLE = _oracle; + } + + /// @notice Getter for the pre-image oracle contract. + /// @return oracle_ The IPreimageOracle contract. + function oracle() external view returns (IPreimageOracle oracle_) { + oracle_ = ORACLE; + } + + /// @notice Executes a single step of the multi-threaded vm. + /// Will revert if any required input state is missing. + /// @param _stateData The encoded state witness data. + /// @param _proof The encoded proof data: <<thread_context, inner_root>, <memory proof>. + /// Contains the thread context witness and the memory proof data for leaves within the MIPS VM's + /// memory. + /// The thread context witness is a packed tuple of the thread context and the immediate inner root of + /// the current thread stack. + /// @param _localContext The local key context for the preimage oracle. Optional, can be set as a constant + /// if the caller only requires one set of local keys. + function step(bytes calldata _stateData, bytes calldata _proof, bytes32 _localContext) public returns (bytes32) { + unchecked { + State memory state; + ThreadState memory thread; + uint32 exited; + assembly { + if iszero(eq(state, STATE_MEM_OFFSET)) { + // expected state mem offset check + revert(0, 0) + } + if iszero(eq(thread, TC_MEM_OFFSET)) { + // expected thread mem offset check + revert(0, 0) + } + if iszero(eq(mload(0x40), shl(5, 63))) { + // 4 + 16 state slots + 43 thread slots = 63 expected memory check + revert(0, 0) + } + if iszero(eq(_stateData.offset, 132)) { + // 32*4+4=132 expected state data offset + revert(0, 0) + } + if iszero(eq(_proof.offset, THREAD_PROOF_OFFSET)) { + // _stateData.offset+192+32=356 expected thread proof offset + revert(0, 0) + } + + function putField(callOffset, memOffset, size) -> callOffsetOut, memOffsetOut { + // calldata is packed, thus starting left-aligned, shift-right to pad and right-align + let w := shr(shl(3, sub(32, size)), calldataload(callOffset)) + mstore(memOffset, w) + callOffsetOut := add(callOffset, size) + memOffsetOut := add(memOffset, 32) + } + + // Unpack state from calldata into memory + let c := _stateData.offset // calldata offset + let m := STATE_MEM_OFFSET // mem offset + c, m := putField(c, m, 32) // memRoot + c, m := putField(c, m, 32) // preimageKey + c, m := putField(c, m, 4) // preimageOffset + c, m := putField(c, m, 4) // heap + c, m := putField(c, m, 1) // llReservationActive + c, m := putField(c, m, 4) // llAddress + c, m := putField(c, m, 4) // llOwnerThread + c, m := putField(c, m, 1) // exitCode + c, m := putField(c, m, 1) // exited + exited := mload(sub(m, 32)) + c, m := putField(c, m, 8) // step + c, m := putField(c, m, 8) // stepsSinceLastContextSwitch + c, m := putField(c, m, 4) // wakeup + c, m := putField(c, m, 1) // traverseRight + c, m := putField(c, m, 32) // leftThreadStack + c, m := putField(c, m, 32) // rightThreadStack + c, m := putField(c, m, 4) // nextThreadID + } + st.assertExitedIsValid(exited); + + if (state.exited) { + // thread state is unchanged + return outputState(); + } + + if (state.leftThreadStack == EMPTY_THREAD_ROOT && state.rightThreadStack == EMPTY_THREAD_ROOT) { + revert("MIPS2: illegal vm state"); + } + + state.step += 1; + + setThreadStateFromCalldata(thread); + validateCalldataThreadWitness(state, thread); + + // Search for the first thread blocked by the wakeup call, if wakeup is set + // Don't allow regular execution until we resolved if we have woken up any thread. + if (state.wakeup != sys.FUTEX_EMPTY_ADDR) { + if (state.wakeup == thread.futexAddr) { + // completed wake traversal + // resume execution on woken up thread + state.wakeup = sys.FUTEX_EMPTY_ADDR; + return outputState(); + } else { + bool traversingRight = state.traverseRight; + bool changedDirections = preemptThread(state, thread); + if (traversingRight && changedDirections) { + // then we've completed wake traversal + // resume thread execution + state.wakeup = sys.FUTEX_EMPTY_ADDR; + } + return outputState(); + } + } + + if (thread.exited) { + popThread(state); + return outputState(); + } + + // check if thread is blocked on a futex + if (thread.futexAddr != sys.FUTEX_EMPTY_ADDR) { + // if set, then check futex + // check timeout first + if (state.step > thread.futexTimeoutStep) { + // timeout! Allow execution + return onWaitComplete(state, thread, true); + } else { + uint32 mem = MIPSMemory.readMem( + state.memRoot, thread.futexAddr & 0xFFffFFfc, MIPSMemory.memoryProofOffset(MEM_PROOF_OFFSET, 1) + ); + if (thread.futexVal == mem) { + // still got expected value, continue sleeping, try next thread. + preemptThread(state, thread); + return outputState(); + } else { + // wake thread up, the value at its address changed! + // Userspace can turn thread back to sleep if it was too sporadic. + return onWaitComplete(state, thread, false); + } + } + } + + if (state.stepsSinceLastContextSwitch >= sys.SCHED_QUANTUM) { + preemptThread(state, thread); + return outputState(); + } + state.stepsSinceLastContextSwitch += 1; + + // instruction fetch + uint256 insnProofOffset = MIPSMemory.memoryProofOffset(MEM_PROOF_OFFSET, 0); + (uint32 insn, uint32 opcode, uint32 fun) = + ins.getInstructionDetails(thread.pc, state.memRoot, insnProofOffset); + + // Handle syscall separately + // syscall (can read and write) + if (opcode == 0 && fun == 0xC) { + return handleSyscall(_localContext); + } + + // Handle RMW (read-modify-write) ops + if (opcode == ins.OP_LOAD_LINKED || opcode == ins.OP_STORE_CONDITIONAL) { + return handleRMWOps(state, thread, insn, opcode); + } + + // Exec the rest of the step logic + st.CpuScalars memory cpu = getCpuScalars(thread); + ins.CoreStepLogicParams memory coreStepArgs = ins.CoreStepLogicParams({ + cpu: cpu, + registers: thread.registers, + memRoot: state.memRoot, + memProofOffset: MIPSMemory.memoryProofOffset(MEM_PROOF_OFFSET, 1), + insn: insn, + opcode: opcode, + fun: fun + }); + bool memUpdated; + uint32 memAddr; + (state.memRoot, memUpdated, memAddr) = ins.execMipsCoreStepLogic(coreStepArgs); + setStateCpuScalars(thread, cpu); + updateCurrentThreadRoot(); + if (memUpdated) { + handleMemoryUpdate(state, memAddr); + } + + return outputState(); + } + } + + function handleMemoryUpdate(State memory _state, uint32 _memAddr) internal pure { + if (_memAddr == _state.llAddress) { + // Reserved address was modified, clear the reservation + clearLLMemoryReservation(_state); + } + } + + function clearLLMemoryReservation(State memory _state) internal pure { + _state.llReservationActive = false; + _state.llAddress = 0; + _state.llOwnerThread = 0; + } + + function handleRMWOps( + State memory _state, + ThreadState memory _thread, + uint32 _insn, + uint32 _opcode + ) + internal + returns (bytes32) + { + unchecked { + uint32 baseReg = (_insn >> 21) & 0x1F; + uint32 base = _thread.registers[baseReg]; + uint32 rtReg = (_insn >> 16) & 0x1F; + uint32 offset = ins.signExtendImmediate(_insn); + + uint32 effAddr = (base + offset) & 0xFFFFFFFC; + uint256 memProofOffset = MIPSMemory.memoryProofOffset(MEM_PROOF_OFFSET, 1); + uint32 mem = MIPSMemory.readMem(_state.memRoot, effAddr, memProofOffset); + + uint32 retVal = 0; + uint32 threadId = _thread.threadID; + if (_opcode == ins.OP_LOAD_LINKED) { + retVal = mem; + _state.llReservationActive = true; + _state.llAddress = effAddr; + _state.llOwnerThread = threadId; + } else if (_opcode == ins.OP_STORE_CONDITIONAL) { + // Check if our memory reservation is still intact + if (_state.llReservationActive && _state.llOwnerThread == threadId && _state.llAddress == effAddr) { + // Complete atomic update: set memory and return 1 for success + clearLLMemoryReservation(_state); + uint32 val = _thread.registers[rtReg]; + _state.memRoot = MIPSMemory.writeMem(effAddr, memProofOffset, val); + retVal = 1; + } else { + // Atomic update failed, return 0 for failure + retVal = 0; + } + } else { + revert InvalidRMWInstruction(); + } + + st.CpuScalars memory cpu = getCpuScalars(_thread); + ins.handleRd(cpu, _thread.registers, rtReg, retVal, true); + setStateCpuScalars(_thread, cpu); + updateCurrentThreadRoot(); + + return outputState(); + } + } + + function handleSyscall(bytes32 _localContext) internal returns (bytes32 out_) { + unchecked { + // Load state from memory offsets to reduce stack pressure + State memory state; + ThreadState memory thread; + assembly { + state := STATE_MEM_OFFSET + thread := TC_MEM_OFFSET + } + + // Load the syscall numbers and args from the registers + (uint32 syscall_no, uint32 a0, uint32 a1, uint32 a2, uint32 a3) = sys.getSyscallArgs(thread.registers); + // Syscalls that are unimplemented but known return with v0=0 and v1=0 + uint32 v0 = 0; + uint32 v1 = 0; + + if (syscall_no == sys.SYS_MMAP) { + (v0, v1, state.heap) = sys.handleSysMmap(a0, a1, state.heap); + } else if (syscall_no == sys.SYS_BRK) { + // brk: Returns a fixed address for the program break at 0x40000000 + v0 = sys.PROGRAM_BREAK; + } else if (syscall_no == sys.SYS_CLONE) { + if (sys.VALID_SYS_CLONE_FLAGS != a0) { + state.exited = true; + state.exitCode = VMStatuses.PANIC.raw(); + return outputState(); + } + v0 = state.nextThreadID; + v1 = 0; + ThreadState memory newThread; + newThread.threadID = state.nextThreadID; + newThread.exitCode = 0; + newThread.exited = false; + newThread.futexAddr = sys.FUTEX_EMPTY_ADDR; + newThread.futexVal = 0; + newThread.futexTimeoutStep = 0; + newThread.pc = thread.nextPC; + newThread.nextPC = thread.nextPC + 4; + newThread.lo = thread.lo; + newThread.hi = thread.hi; + for (uint256 i; i < 32; i++) { + newThread.registers[i] = thread.registers[i]; + } + newThread.registers[29] = a1; // set stack pointer + // the child will perceive a 0 value as returned value instead, and no error + newThread.registers[2] = 0; + newThread.registers[7] = 0; + state.nextThreadID++; + + // Preempt this thread for the new one. But not before updating PCs + st.CpuScalars memory cpu0 = getCpuScalars(thread); + sys.handleSyscallUpdates(cpu0, thread.registers, v0, v1); + setStateCpuScalars(thread, cpu0); + updateCurrentThreadRoot(); + pushThread(state, newThread); + return outputState(); + } else if (syscall_no == sys.SYS_EXIT_GROUP) { + // exit group: Sets the Exited and ExitCode states to true and argument 0. + state.exited = true; + state.exitCode = uint8(a0); + updateCurrentThreadRoot(); + return outputState(); + } else if (syscall_no == sys.SYS_READ) { + sys.SysReadParams memory args = sys.SysReadParams({ + a0: a0, + a1: a1, + a2: a2, + preimageKey: state.preimageKey, + preimageOffset: state.preimageOffset, + localContext: _localContext, + oracle: ORACLE, + proofOffset: MIPSMemory.memoryProofOffset(MEM_PROOF_OFFSET, 1), + memRoot: state.memRoot + }); + // Encapsulate execution to avoid stack-too-deep error + (v0, v1) = execSysRead(state, args); + } else if (syscall_no == sys.SYS_WRITE) { + (v0, v1, state.preimageKey, state.preimageOffset) = sys.handleSysWrite({ + _a0: a0, + _a1: a1, + _a2: a2, + _preimageKey: state.preimageKey, + _preimageOffset: state.preimageOffset, + _proofOffset: MIPSMemory.memoryProofOffset(MEM_PROOF_OFFSET, 1), + _memRoot: state.memRoot + }); + } else if (syscall_no == sys.SYS_FCNTL) { + (v0, v1) = sys.handleSysFcntl(a0, a1); + } else if (syscall_no == sys.SYS_GETTID) { + v0 = thread.threadID; + v1 = 0; + } else if (syscall_no == sys.SYS_EXIT) { + thread.exited = true; + thread.exitCode = uint8(a0); + if (lastThreadRemaining(state)) { + state.exited = true; + state.exitCode = uint8(a0); + } + updateCurrentThreadRoot(); + return outputState(); + } else if (syscall_no == sys.SYS_FUTEX) { + // args: a0 = addr, a1 = op, a2 = val, a3 = timeout + uint32 effAddr = a0 & 0xFFffFFfc; + if (a1 == sys.FUTEX_WAIT_PRIVATE) { + uint32 mem = + MIPSMemory.readMem(state.memRoot, effAddr, MIPSMemory.memoryProofOffset(MEM_PROOF_OFFSET, 1)); + if (mem != a2) { + v0 = sys.SYS_ERROR_SIGNAL; + v1 = sys.EAGAIN; + } else { + thread.futexAddr = effAddr; + thread.futexVal = a2; + thread.futexTimeoutStep = a3 == 0 ? sys.FUTEX_NO_TIMEOUT : state.step + sys.FUTEX_TIMEOUT_STEPS; + // Leave cpu scalars as-is. This instruction will be completed by `onWaitComplete` + updateCurrentThreadRoot(); + return outputState(); + } + } else if (a1 == sys.FUTEX_WAKE_PRIVATE) { + // Trigger thread traversal starting from the left stack until we find one waiting on the wakeup + // address + state.wakeup = effAddr; + // Don't indicate to the program that we've woken up a waiting thread, as there are no guarantees. + // The woken up thread should indicate this in userspace. + v0 = 0; + v1 = 0; + st.CpuScalars memory cpu0 = getCpuScalars(thread); + sys.handleSyscallUpdates(cpu0, thread.registers, v0, v1); + setStateCpuScalars(thread, cpu0); + preemptThread(state, thread); + state.traverseRight = state.leftThreadStack == EMPTY_THREAD_ROOT; + return outputState(); + } else { + v0 = sys.SYS_ERROR_SIGNAL; + v1 = sys.EINVAL; + } + } else if (syscall_no == sys.SYS_SCHED_YIELD || syscall_no == sys.SYS_NANOSLEEP) { + v0 = 0; + v1 = 0; + st.CpuScalars memory cpu0 = getCpuScalars(thread); + sys.handleSyscallUpdates(cpu0, thread.registers, v0, v1); + setStateCpuScalars(thread, cpu0); + preemptThread(state, thread); + return outputState(); + } else if (syscall_no == sys.SYS_OPEN) { + v0 = sys.SYS_ERROR_SIGNAL; + v1 = sys.EBADF; + } else if (syscall_no == sys.SYS_CLOCKGETTIME) { + if (a0 == sys.CLOCK_GETTIME_REALTIME_FLAG || a0 == sys.CLOCK_GETTIME_MONOTONIC_FLAG) { + v0 = 0; + v1 = 0; + uint32 secs = 0; + uint32 nsecs = 0; + if (a0 == sys.CLOCK_GETTIME_MONOTONIC_FLAG) { + secs = uint32(state.step / sys.HZ); + nsecs = uint32((state.step % sys.HZ) * (1_000_000_000 / sys.HZ)); + } + uint32 effAddr = a1 & 0xFFffFFfc; + // First verify the effAddr path + if ( + !MIPSMemory.isValidProof( + state.memRoot, effAddr, MIPSMemory.memoryProofOffset(MEM_PROOF_OFFSET, 1) + ) + ) { + revert InvalidMemoryProof(); + } + // Recompute the new root after updating effAddr + state.memRoot = + MIPSMemory.writeMem(effAddr, MIPSMemory.memoryProofOffset(MEM_PROOF_OFFSET, 1), secs); + handleMemoryUpdate(state, effAddr); + // Verify the second memory proof against the newly computed root + if ( + !MIPSMemory.isValidProof( + state.memRoot, effAddr + 4, MIPSMemory.memoryProofOffset(MEM_PROOF_OFFSET, 2) + ) + ) { + revert InvalidSecondMemoryProof(); + } + state.memRoot = + MIPSMemory.writeMem(effAddr + 4, MIPSMemory.memoryProofOffset(MEM_PROOF_OFFSET, 2), nsecs); + handleMemoryUpdate(state, effAddr + 4); + } else { + v0 = sys.SYS_ERROR_SIGNAL; + v1 = sys.EINVAL; + } + } else if (syscall_no == sys.SYS_GETPID) { + v0 = 0; + v1 = 0; + } else if (syscall_no == sys.SYS_MUNMAP) { + // ignored + } else if (syscall_no == sys.SYS_GETAFFINITY) { + // ignored + } else if (syscall_no == sys.SYS_MADVISE) { + // ignored + } else if (syscall_no == sys.SYS_RTSIGPROCMASK) { + // ignored + } else if (syscall_no == sys.SYS_SIGALTSTACK) { + // ignored + } else if (syscall_no == sys.SYS_RTSIGACTION) { + // ignored + } else if (syscall_no == sys.SYS_PRLIMIT64) { + // ignored + } else if (syscall_no == sys.SYS_CLOSE) { + // ignored + } else if (syscall_no == sys.SYS_PREAD64) { + // ignored + } else if (syscall_no == sys.SYS_FSTAT64) { + // ignored + } else if (syscall_no == sys.SYS_OPENAT) { + // ignored + } else if (syscall_no == sys.SYS_READLINK) { + // ignored + } else if (syscall_no == sys.SYS_READLINKAT) { + // ignored + } else if (syscall_no == sys.SYS_IOCTL) { + // ignored + } else if (syscall_no == sys.SYS_EPOLLCREATE1) { + // ignored + } else if (syscall_no == sys.SYS_PIPE2) { + // ignored + } else if (syscall_no == sys.SYS_EPOLLCTL) { + // ignored + } else if (syscall_no == sys.SYS_EPOLLPWAIT) { + // ignored + } else if (syscall_no == sys.SYS_GETRANDOM) { + // ignored + } else if (syscall_no == sys.SYS_UNAME) { + // ignored + } else if (syscall_no == sys.SYS_STAT64) { + // ignored + } else if (syscall_no == sys.SYS_GETUID) { + // ignored + } else if (syscall_no == sys.SYS_GETGID) { + // ignored + } else if (syscall_no == sys.SYS_LLSEEK) { + // ignored + } else if (syscall_no == sys.SYS_MINCORE) { + // ignored + } else if (syscall_no == sys.SYS_TGKILL) { + // ignored + } else if (syscall_no == sys.SYS_SETITIMER) { + // ignored + } else if (syscall_no == sys.SYS_TIMERCREATE) { + // ignored + } else if (syscall_no == sys.SYS_TIMERSETTIME) { + // ignored + } else if (syscall_no == sys.SYS_TIMERDELETE) { + // ignored + } else { + revert("MIPS2: unimplemented syscall"); + } + + st.CpuScalars memory cpu = getCpuScalars(thread); + sys.handleSyscallUpdates(cpu, thread.registers, v0, v1); + setStateCpuScalars(thread, cpu); + + updateCurrentThreadRoot(); + out_ = outputState(); + } + } + + function execSysRead( + State memory _state, + sys.SysReadParams memory _args + ) + internal + view + returns (uint32 v0, uint32 v1) + { + bool memUpdated; + uint32 memAddr; + (v0, v1, _state.preimageOffset, _state.memRoot, memUpdated, memAddr) = sys.handleSysRead(_args); + if (memUpdated) { + handleMemoryUpdate(_state, memAddr); + } + } + + /// @notice Computes the hash of the MIPS state. + /// @return out_ The hashed MIPS state. + function outputState() internal returns (bytes32 out_) { + uint32 exited; + assembly { + // copies 'size' bytes, right-aligned in word at 'from', to 'to', incl. trailing data + function copyMem(from, to, size) -> fromOut, toOut { + mstore(to, mload(add(from, sub(32, size)))) + fromOut := add(from, 32) + toOut := add(to, size) + } + + // From points to the MIPS State + let from := STATE_MEM_OFFSET + + // Copy to the free memory pointer + let start := mload(0x40) + let to := start + + // Copy state to free memory + from, to := copyMem(from, to, 32) // memRoot + from, to := copyMem(from, to, 32) // preimageKey + from, to := copyMem(from, to, 4) // preimageOffset + from, to := copyMem(from, to, 4) // heap + from, to := copyMem(from, to, 1) // llReservationActive + from, to := copyMem(from, to, 4) // llAddress + from, to := copyMem(from, to, 4) // llOwnerThread + let exitCode := mload(from) + from, to := copyMem(from, to, 1) // exitCode + exited := mload(from) + from, to := copyMem(from, to, 1) // exited + from, to := copyMem(from, to, 8) // step + from, to := copyMem(from, to, 8) // stepsSinceLastContextSwitch + from, to := copyMem(from, to, 4) // wakeup + from, to := copyMem(from, to, 1) // traverseRight + from, to := copyMem(from, to, 32) // leftThreadStack + from, to := copyMem(from, to, 32) // rightThreadStack + from, to := copyMem(from, to, 4) // nextThreadID + + // Clean up end of memory + mstore(to, 0) + + // Log the resulting MIPS state, for debugging + log0(start, sub(to, start)) + + // Determine the VM status + let status := 0 + switch exited + case 1 { + switch exitCode + // VMStatusValid + case 0 { status := 0 } + // VMStatusInvalid + case 1 { status := 1 } + // VMStatusPanic + default { status := 2 } + } + // VMStatusUnfinished + default { status := 3 } + + // Compute the hash of the resulting MIPS state and set the status byte + out_ := keccak256(start, sub(to, start)) + out_ := or(and(not(shl(248, 0xFF)), out_), shl(248, status)) + } + + st.assertExitedIsValid(exited); + } + + /// @notice Updates the current thread stack root via inner thread root in calldata + function updateCurrentThreadRoot() internal pure { + State memory state; + ThreadState memory thread; + assembly { + state := STATE_MEM_OFFSET + thread := TC_MEM_OFFSET + } + bytes32 updatedRoot = computeThreadRoot(loadCalldataInnerThreadRoot(), thread); + if (state.traverseRight) { + state.rightThreadStack = updatedRoot; + } else { + state.leftThreadStack = updatedRoot; + } + } + + /// @notice Completes the FUTEX_WAIT syscall. + function onWaitComplete( + State memory _state, + ThreadState memory _thread, + bool _isTimedOut + ) + internal + returns (bytes32 out_) + { + // Clear the futex state + _thread.futexAddr = sys.FUTEX_EMPTY_ADDR; + _thread.futexVal = 0; + _thread.futexTimeoutStep = 0; + + // Complete the FUTEX_WAIT syscall + uint32 v0 = _isTimedOut ? sys.SYS_ERROR_SIGNAL : 0; + // set errno + uint32 v1 = _isTimedOut ? sys.ETIMEDOUT : 0; + st.CpuScalars memory cpu = getCpuScalars(_thread); + sys.handleSyscallUpdates(cpu, _thread.registers, v0, v1); + setStateCpuScalars(_thread, cpu); + + _state.wakeup = sys.FUTEX_EMPTY_ADDR; + updateCurrentThreadRoot(); + out_ = outputState(); + } + + /// @notice Preempts the current thread for another and updates the VM state. + /// It reads the inner thread root from calldata to update the current thread stack root. + function preemptThread( + State memory _state, + ThreadState memory _thread + ) + internal + pure + returns (bool _changedDirections) + { + // pop thread from the current stack and push to the other stack + if (_state.traverseRight) { + require(_state.rightThreadStack != EMPTY_THREAD_ROOT, "empty right thread stack"); + _state.rightThreadStack = loadCalldataInnerThreadRoot(); + _state.leftThreadStack = computeThreadRoot(_state.leftThreadStack, _thread); + } else { + require(_state.leftThreadStack != EMPTY_THREAD_ROOT, "empty left thread stack"); + _state.leftThreadStack = loadCalldataInnerThreadRoot(); + _state.rightThreadStack = computeThreadRoot(_state.rightThreadStack, _thread); + } + bytes32 current = _state.traverseRight ? _state.rightThreadStack : _state.leftThreadStack; + if (current == EMPTY_THREAD_ROOT) { + _state.traverseRight = !_state.traverseRight; + _changedDirections = true; + } + _state.stepsSinceLastContextSwitch = 0; + } + + /// @notice Pushes a thread to the current thread stack. + function pushThread(State memory _state, ThreadState memory _thread) internal pure { + if (_state.traverseRight) { + _state.rightThreadStack = computeThreadRoot(_state.rightThreadStack, _thread); + } else { + _state.leftThreadStack = computeThreadRoot(_state.leftThreadStack, _thread); + } + _state.stepsSinceLastContextSwitch = 0; + } + + /// @notice Removes the current thread from the stack. + function popThread(State memory _state) internal pure { + if (_state.traverseRight) { + _state.rightThreadStack = loadCalldataInnerThreadRoot(); + } else { + _state.leftThreadStack = loadCalldataInnerThreadRoot(); + } + bytes32 current = _state.traverseRight ? _state.rightThreadStack : _state.leftThreadStack; + if (current == EMPTY_THREAD_ROOT) { + _state.traverseRight = !_state.traverseRight; + } + _state.stepsSinceLastContextSwitch = 0; + } + + /// @notice Returns true if the number of threads is 1 + function lastThreadRemaining(State memory _state) internal pure returns (bool out_) { + bytes32 inactiveStack = _state.traverseRight ? _state.leftThreadStack : _state.rightThreadStack; + bool currentStackIsAlmostEmpty = loadCalldataInnerThreadRoot() == EMPTY_THREAD_ROOT; + return inactiveStack == EMPTY_THREAD_ROOT && currentStackIsAlmostEmpty; + } + + function computeThreadRoot(bytes32 _currentRoot, ThreadState memory _thread) internal pure returns (bytes32 _out) { + // w_i = hash(w_0 ++ hash(thread)) + bytes32 threadRoot = outputThreadState(_thread); + _out = keccak256(abi.encodePacked(_currentRoot, threadRoot)); + } + + function outputThreadState(ThreadState memory _thread) internal pure returns (bytes32 out_) { + assembly { + // copies 'size' bytes, right-aligned in word at 'from', to 'to', incl. trailing data + function copyMem(from, to, size) -> fromOut, toOut { + mstore(to, mload(add(from, sub(32, size)))) + fromOut := add(from, 32) + toOut := add(to, size) + } + + // From points to the ThreadState + let from := _thread + + // Copy to the free memory pointer + let start := mload(0x40) + let to := start + + // Copy state to free memory + from, to := copyMem(from, to, 4) // threadID + from, to := copyMem(from, to, 1) // exitCode + from, to := copyMem(from, to, 1) // exited + from, to := copyMem(from, to, 4) // futexAddr + from, to := copyMem(from, to, 4) // futexVal + from, to := copyMem(from, to, 8) // futexTimeoutStep + from, to := copyMem(from, to, 4) // pc + from, to := copyMem(from, to, 4) // nextPC + from, to := copyMem(from, to, 4) // lo + from, to := copyMem(from, to, 4) // hi + from := mload(from) // offset to registers + // Copy registers + for { let i := 0 } lt(i, 32) { i := add(i, 1) } { from, to := copyMem(from, to, 4) } + + // Clean up end of memory + mstore(to, 0) + + // Compute the hash of the resulting ThreadState + out_ := keccak256(start, sub(to, start)) + } + } + + function getCpuScalars(ThreadState memory _tc) internal pure returns (st.CpuScalars memory cpu_) { + cpu_ = st.CpuScalars({ pc: _tc.pc, nextPC: _tc.nextPC, lo: _tc.lo, hi: _tc.hi }); + } + + function setStateCpuScalars(ThreadState memory _tc, st.CpuScalars memory _cpu) internal pure { + _tc.pc = _cpu.pc; + _tc.nextPC = _cpu.nextPC; + _tc.lo = _cpu.lo; + _tc.hi = _cpu.hi; + } + + /// @notice Validates the thread witness in calldata against the current thread. + function validateCalldataThreadWitness(State memory _state, ThreadState memory _thread) internal pure { + bytes32 witnessRoot = computeThreadRoot(loadCalldataInnerThreadRoot(), _thread); + bytes32 expectedRoot = _state.traverseRight ? _state.rightThreadStack : _state.leftThreadStack; + require(expectedRoot == witnessRoot, "invalid thread witness"); + } + + /// @notice Sets the thread context from calldata. + function setThreadStateFromCalldata(ThreadState memory _thread) internal pure { + uint256 s = 0; + assembly { + s := calldatasize() + } + // verify we have enough calldata + require(s >= (THREAD_PROOF_OFFSET + 166), "insufficient calldata for thread witness"); + + unchecked { + assembly { + function putField(callOffset, memOffset, size) -> callOffsetOut, memOffsetOut { + // calldata is packed, thus starting left-aligned, shift-right to pad and right-align + let w := shr(shl(3, sub(32, size)), calldataload(callOffset)) + mstore(memOffset, w) + callOffsetOut := add(callOffset, size) + memOffsetOut := add(memOffset, 32) + } + + let c := THREAD_PROOF_OFFSET + let m := _thread + c, m := putField(c, m, 4) // threadID + c, m := putField(c, m, 1) // exitCode + c, m := putField(c, m, 1) // exited + c, m := putField(c, m, 4) // futexAddr + c, m := putField(c, m, 4) // futexVal + c, m := putField(c, m, 8) // futexTimeoutStep + c, m := putField(c, m, 4) // pc + c, m := putField(c, m, 4) // nextPC + c, m := putField(c, m, 4) // lo + c, m := putField(c, m, 4) // hi + m := mload(m) // offset to registers + // Unpack register calldata into memory + for { let i := 0 } lt(i, 32) { i := add(i, 1) } { c, m := putField(c, m, 4) } + } + } + } + + /// @notice Loads the inner root for the current thread hash onion from calldata. + function loadCalldataInnerThreadRoot() internal pure returns (bytes32 innerThreadRoot_) { + uint256 s = 0; + assembly { + s := calldatasize() + innerThreadRoot_ := calldataload(add(THREAD_PROOF_OFFSET, 166)) + } + // verify we have enough calldata + require(s >= (THREAD_PROOF_OFFSET + 198), "insufficient calldata for thread witness"); // 166 + 32 + } +} diff --git a/packages/contracts-bedrock/src/cannon/PreimageOracle.sol b/packages/contracts-bedrock/src/cannon/PreimageOracle.sol index 77dcfc20c403..c3fbc2b498ad 100644 --- a/packages/contracts-bedrock/src/cannon/PreimageOracle.sol +++ b/packages/contracts-bedrock/src/cannon/PreimageOracle.sol @@ -2,7 +2,7 @@ pragma solidity 0.8.15; import { IPreimageOracle } from "./interfaces/IPreimageOracle.sol"; -import { ISemver } from "src/universal/ISemver.sol"; +import { ISemver } from "src/universal/interfaces/ISemver.sol"; import { PreimageKeyLib } from "./PreimageKeyLib.sol"; import { LibKeccak } from "@lib-keccak/LibKeccak.sol"; import "src/cannon/libraries/CannonErrors.sol"; @@ -27,10 +27,12 @@ contract PreimageOracle is IPreimageOracle, ISemver { uint256 public constant KECCAK_TREE_DEPTH = 16; /// @notice The maximum number of keccak blocks that can fit into the merkle tree. uint256 public constant MAX_LEAF_COUNT = 2 ** KECCAK_TREE_DEPTH - 1; + /// @notice The reserved gas for precompile call setup. + uint256 public constant PRECOMPILE_CALL_RESERVED_GAS = 100_000; /// @notice The semantic version of the Preimage Oracle contract. - /// @custom:semver 1.0.0 - string public constant version = "1.0.0"; + /// @custom:semver 1.1.3-beta.2 + string public constant version = "1.1.3-beta.2"; //////////////////////////////////////////////////////////////// // Authorized Preimage Parts // @@ -90,6 +92,11 @@ contract PreimageOracle is IPreimageOracle, ISemver { MIN_LPP_SIZE_BYTES = _minProposalSize; CHALLENGE_PERIOD = _challengePeriod; + // Make sure challenge period fits within uint64 so that it can safely be used within the + // FaultDisputeGame contract to compute clock extensions. Adding this check is simpler than + // changing the existing contract ABI. + require(_challengePeriod <= type(uint64).max, "challenge period too large"); + // Compute hashes in empty sparse Merkle tree. The first hash is not set, and kept as zero as the identity. for (uint256 height = 0; height < KECCAK_TREE_DEPTH - 1; height++) { zeroHashes[height + 1] = keccak256(abi.encodePacked(zeroHashes[height], zeroHashes[height])); @@ -131,7 +138,7 @@ contract PreimageOracle is IPreimageOracle, ISemver { key_ = PreimageKeyLib.localizeIdent(_ident, _localContext); // Revert if the given part offset is not within bounds. - if (_partOffset > _size + 8 || _size > 32) { + if (_partOffset >= _size + 8 || _size > 32) { revert PartOffsetOOB(); } @@ -332,7 +339,14 @@ contract PreimageOracle is IPreimageOracle, ISemver { } /// @inheritdoc IPreimageOracle - function loadPrecompilePreimagePart(uint256 _partOffset, address _precompile, bytes calldata _input) external { + function loadPrecompilePreimagePart( + uint256 _partOffset, + address _precompile, + uint64 _requiredGas, + bytes calldata _input + ) + external + { bytes32 res; bytes32 key; bytes32 part; @@ -341,21 +355,32 @@ contract PreimageOracle is IPreimageOracle, ISemver { // we leave solidity slots 0x40 and 0x60 untouched, and everything after as scratch-memory. let ptr := 0x80 - // copy precompile address and input into memory - // len(sig) + len(_partOffset) + address-offset-in-slot - calldatacopy(ptr, 48, 20) - calldatacopy(add(20, ptr), _input.offset, _input.length) + // copy precompile address, requiredGas, and input into memory to compute the key + mstore(ptr, shl(96, _precompile)) + mstore(add(ptr, 20), shl(192, _requiredGas)) + calldatacopy(add(28, ptr), _input.offset, _input.length) // compute the hash - let h := keccak256(ptr, add(20, _input.length)) + let h := keccak256(ptr, add(28, _input.length)) // mask out prefix byte, replace with type 6 byte key := or(and(h, not(shl(248, 0xFF))), shl(248, 0x06)) + // Check if the precompile call has at least the required gas. + // This assumes there are no further memory expansion costs until after the staticall on the precompile + // Also assumes that the gas expended in setting up the staticcall is less than PRECOMPILE_CALL_RESERVED_GAS + // require(gas() >= (requiredGas * 64 / 63) + reservedGas) + if lt(mul(gas(), 63), add(mul(_requiredGas, 64), mul(PRECOMPILE_CALL_RESERVED_GAS, 63))) { + // Store "NotEnoughGas()" + mstore(0, 0xdd629f86) + revert(0x1c, 4) + } + // Call the precompile to get the result. + // SAFETY: Given the above gas check, the staticall cannot fail due to insufficient gas. res := staticcall( gas(), // forward all gas _precompile, - add(20, ptr), // input ptr + add(28, ptr), // input ptr _input.length, 0x0, // Unused as we don't copy anything 0x00 // don't copy anything @@ -429,6 +454,10 @@ contract PreimageOracle is IPreimageOracle, ISemver { // Initialize the proposal metadata. LPPMetaData metaData = proposalMetadata[msg.sender][_uuid]; + + // Revert if the proposal has already been initialized. 0-size preimages are *not* allowed. + if (metaData.claimedSize() != 0) revert AlreadyInitialized(); + proposalMetadata[msg.sender][_uuid] = metaData.setPartOffset(_partOffset).setClaimedSize(_claimedSize); proposals.push(LargePreimageProposalKeys(msg.sender, _uuid)); @@ -484,7 +513,7 @@ contract PreimageOracle is IPreimageOracle, ISemver { let inputPtr := add(input, 0x20) // The input length must be a multiple of 136 bytes - // The input lenth / 136 must be equal to the number of state commitments. + // The input length / 136 must be equal to the number of state commitments. if or(mod(inputLen, 136), iszero(eq(_stateCommitments.length, div(inputLen, 136)))) { // Store "InvalidInputSize()" error selector mstore(0x00, 0x7b1daf1) @@ -653,6 +682,9 @@ contract PreimageOracle is IPreimageOracle, ISemver { // Check if the proposal was countered. if (metaData.countered()) revert BadProposal(); + // Check if the proposal has been finalized at all. + if (metaData.timestamp() == 0) revert ActiveProposal(); + // Check if the challenge period has passed since the proposal was finalized. if (block.timestamp - metaData.timestamp() <= CHALLENGE_PERIOD) revert ActiveProposal(); diff --git a/packages/contracts-bedrock/src/cannon/interfaces/IMIPS.sol b/packages/contracts-bedrock/src/cannon/interfaces/IMIPS.sol new file mode 100644 index 000000000000..75f4e50f3ba3 --- /dev/null +++ b/packages/contracts-bedrock/src/cannon/interfaces/IMIPS.sol @@ -0,0 +1,17 @@ +// SPDX-License-Identifier: MIT +pragma solidity ^0.8.0; + +import { ISemver } from "src/universal/interfaces/ISemver.sol"; +import { IPreimageOracle } from "src/cannon/interfaces/IPreimageOracle.sol"; + +/// @title IMIPS +/// @notice Interface for the MIPS contract. +interface IMIPS is ISemver { + error InvalidMemoryProof(); + error InvalidRMWInstruction(); + + function oracle() external view returns (IPreimageOracle oracle_); + function step(bytes memory _stateData, bytes memory _proof, bytes32 _localContext) external returns (bytes32); + + function __constructor__(IPreimageOracle _oracle) external; +} diff --git a/packages/contracts-bedrock/src/cannon/interfaces/IMIPS2.sol b/packages/contracts-bedrock/src/cannon/interfaces/IMIPS2.sol new file mode 100644 index 000000000000..8f57c0f63695 --- /dev/null +++ b/packages/contracts-bedrock/src/cannon/interfaces/IMIPS2.sol @@ -0,0 +1,19 @@ +// SPDX-License-Identifier: MIT +pragma solidity ^0.8.0; + +import { ISemver } from "src/universal/interfaces/ISemver.sol"; +import { IPreimageOracle } from "src/cannon/interfaces/IPreimageOracle.sol"; + +/// @title IMIPS2 +/// @notice Interface for the MIPS2 contract. +interface IMIPS2 is ISemver { + error InvalidExitedValue(); + error InvalidMemoryProof(); + error InvalidSecondMemoryProof(); + error InvalidRMWInstruction(); + + function oracle() external view returns (IPreimageOracle oracle_); + function step(bytes memory _stateData, bytes memory _proof, bytes32 _localContext) external returns (bytes32); + + function __constructor__(IPreimageOracle _oracle) external; +} diff --git a/packages/contracts-bedrock/src/cannon/interfaces/IPreimageOracle.sol b/packages/contracts-bedrock/src/cannon/interfaces/IPreimageOracle.sol index 7c4a57b257bd..79ee56f821c9 100644 --- a/packages/contracts-bedrock/src/cannon/interfaces/IPreimageOracle.sol +++ b/packages/contracts-bedrock/src/cannon/interfaces/IPreimageOracle.sol @@ -1,9 +1,13 @@ // SPDX-License-Identifier: MIT -pragma solidity 0.8.15; +pragma solidity ^0.8.0; /// @title IPreimageOracle /// @notice Interface for a preimage oracle. interface IPreimageOracle { + /// @notice Returns the length of the large preimage proposal challenge period. + /// @return challengePeriod_ The length of the challenge period in seconds. + function challengePeriod() external view returns (uint256 challengePeriod_); + /// @notice Reads a preimage from the oracle. /// @param _key The key of the preimage to read. /// @param _offset The offset of the preimage to read. @@ -75,6 +79,13 @@ interface IPreimageOracle { /// The preimage key is `6 ++ keccak256(precompile ++ input)[1:]`. /// @param _partOffset The offset of the precompile result being loaded. /// @param _precompile The precompile address + /// @param _requiredGas The gas required to fully execute an L1 precompile. /// @param _input The input to the precompile call. - function loadPrecompilePreimagePart(uint256 _partOffset, address _precompile, bytes calldata _input) external; + function loadPrecompilePreimagePart( + uint256 _partOffset, + address _precompile, + uint64 _requiredGas, + bytes calldata _input + ) + external; } diff --git a/packages/contracts-bedrock/src/cannon/libraries/CannonErrors.sol b/packages/contracts-bedrock/src/cannon/libraries/CannonErrors.sol index 621c0609a879..3649852cec6f 100644 --- a/packages/contracts-bedrock/src/cannon/libraries/CannonErrors.sol +++ b/packages/contracts-bedrock/src/cannon/libraries/CannonErrors.sol @@ -4,6 +4,9 @@ pragma solidity 0.8.15; /// @notice Thrown when a passed part offset is out of bounds. error PartOffsetOOB(); +/// @notice Thrown when insufficient gas is provided when loading precompile preimages. +error NotEnoughGas(); + /// @notice Thrown when a merkle proof fails to verify. error InvalidProof(); @@ -37,6 +40,9 @@ error BadProposal(); /// @notice Thrown when attempting to add leaves to a preimage proposal that has not been initialized. error NotInitialized(); +/// @notice Thrown when attempting to re-initialize an existing large preimage proposal. +error AlreadyInitialized(); + /// @notice Thrown when the caller of a function is not an EOA. error NotEOA(); @@ -45,3 +51,15 @@ error InsufficientBond(); /// @notice Thrown when a bond transfer fails. error BondTransferFailed(); + +/// @notice Thrown when the value of the exited boolean is not 0 or 1. +error InvalidExitedValue(); + +/// @notice Thrown when reading an invalid memory +error InvalidMemoryProof(); + +/// @notice Thrown when the second memory location is invalid +error InvalidSecondMemoryProof(); + +/// @notice Thrown when an RMW instruction is expected, but a different instruction is provided. +error InvalidRMWInstruction(); diff --git a/packages/contracts-bedrock/src/cannon/libraries/MIPSInstructions.sol b/packages/contracts-bedrock/src/cannon/libraries/MIPSInstructions.sol new file mode 100644 index 000000000000..a2402531c82d --- /dev/null +++ b/packages/contracts-bedrock/src/cannon/libraries/MIPSInstructions.sol @@ -0,0 +1,664 @@ +// SPDX-License-Identifier: MIT +pragma solidity 0.8.15; + +import { MIPSMemory } from "src/cannon/libraries/MIPSMemory.sol"; +import { MIPSState as st } from "src/cannon/libraries/MIPSState.sol"; + +library MIPSInstructions { + uint32 internal constant OP_LOAD_LINKED = 0x30; + uint32 internal constant OP_STORE_CONDITIONAL = 0x38; + + struct CoreStepLogicParams { + /// @param opcode The opcode value parsed from insn_. + st.CpuScalars cpu; + /// @param registers The CPU registers. + uint32[32] registers; + /// @param memRoot The current merkle root of the memory. + bytes32 memRoot; + /// @param memProofOffset The offset in calldata specify where the memory merkle proof is located. + uint256 memProofOffset; + /// @param insn The current 32-bit instruction at the pc. + uint32 insn; + /// @param cpu The CPU scalar fields. + uint32 opcode; + /// @param fun The function value parsed from insn_. + uint32 fun; + } + + /// @param _pc The program counter. + /// @param _memRoot The current memory root. + /// @param _insnProofOffset The calldata offset of the memory proof for the current instruction. + /// @return insn_ The current 32-bit instruction at the pc. + /// @return opcode_ The opcode value parsed from insn_. + /// @return fun_ The function value parsed from insn_. + function getInstructionDetails( + uint32 _pc, + bytes32 _memRoot, + uint256 _insnProofOffset + ) + internal + pure + returns (uint32 insn_, uint32 opcode_, uint32 fun_) + { + unchecked { + insn_ = MIPSMemory.readMem(_memRoot, _pc, _insnProofOffset); + opcode_ = insn_ >> 26; // First 6-bits + fun_ = insn_ & 0x3f; // Last 6-bits + + return (insn_, opcode_, fun_); + } + } + + /// @notice Execute core MIPS step logic. + /// @return newMemRoot_ The updated merkle root of memory after any modifications, may be unchanged. + /// @return memUpdated_ True if memory was modified. + /// @return memAddr_ Holds the memory address that was updated if memUpdated_ is true. + function execMipsCoreStepLogic(CoreStepLogicParams memory _args) + internal + pure + returns (bytes32 newMemRoot_, bool memUpdated_, uint32 memAddr_) + { + unchecked { + newMemRoot_ = _args.memRoot; + memUpdated_ = false; + memAddr_ = 0; + + // j-type j/jal + if (_args.opcode == 2 || _args.opcode == 3) { + // Take top 4 bits of the next PC (its 256 MB region), and concatenate with the 26-bit offset + uint32 target = (_args.cpu.nextPC & 0xF0000000) | (_args.insn & 0x03FFFFFF) << 2; + handleJump(_args.cpu, _args.registers, _args.opcode == 2 ? 0 : 31, target); + return (newMemRoot_, memUpdated_, memAddr_); + } + + // register fetch + uint32 rs = 0; // source register 1 value + uint32 rt = 0; // source register 2 / temp value + uint32 rtReg = (_args.insn >> 16) & 0x1F; + + // R-type or I-type (stores rt) + rs = _args.registers[(_args.insn >> 21) & 0x1F]; + uint32 rdReg = rtReg; + + if (_args.opcode == 0 || _args.opcode == 0x1c) { + // R-type (stores rd) + rt = _args.registers[rtReg]; + rdReg = (_args.insn >> 11) & 0x1F; + } else if (_args.opcode < 0x20) { + // rt is SignExtImm + // don't sign extend for andi, ori, xori + if (_args.opcode == 0xC || _args.opcode == 0xD || _args.opcode == 0xe) { + // ZeroExtImm + rt = _args.insn & 0xFFFF; + } else { + // SignExtImm + rt = signExtend(_args.insn & 0xFFFF, 16); + } + } else if (_args.opcode >= 0x28 || _args.opcode == 0x22 || _args.opcode == 0x26) { + // store rt value with store + rt = _args.registers[rtReg]; + + // store actual rt with lwl and lwr + rdReg = rtReg; + } + + if ((_args.opcode >= 4 && _args.opcode < 8) || _args.opcode == 1) { + handleBranch({ + _cpu: _args.cpu, + _registers: _args.registers, + _opcode: _args.opcode, + _insn: _args.insn, + _rtReg: rtReg, + _rs: rs + }); + return (newMemRoot_, memUpdated_, memAddr_); + } + + uint32 storeAddr = 0xFF_FF_FF_FF; + // memory fetch (all I-type) + // we do the load for stores also + uint32 mem = 0; + if (_args.opcode >= 0x20) { + // M[R[rs]+SignExtImm] + rs += signExtend(_args.insn & 0xFFFF, 16); + uint32 addr = rs & 0xFFFFFFFC; + mem = MIPSMemory.readMem(_args.memRoot, addr, _args.memProofOffset); + if (_args.opcode >= 0x28) { + // store + storeAddr = addr; + // store opcodes don't write back to a register + rdReg = 0; + } + } + + // ALU + // Note: swr outputs more than 4 bytes without the mask 0xffFFffFF + uint32 val = executeMipsInstruction(_args.insn, _args.opcode, _args.fun, rs, rt, mem) & 0xffFFffFF; + + if (_args.opcode == 0 && _args.fun >= 8 && _args.fun < 0x1c) { + if (_args.fun == 8 || _args.fun == 9) { + // jr/jalr + handleJump(_args.cpu, _args.registers, _args.fun == 8 ? 0 : rdReg, rs); + return (newMemRoot_, memUpdated_, memAddr_); + } + + if (_args.fun == 0xa) { + // movz + handleRd(_args.cpu, _args.registers, rdReg, rs, rt == 0); + return (newMemRoot_, memUpdated_, memAddr_); + } + if (_args.fun == 0xb) { + // movn + handleRd(_args.cpu, _args.registers, rdReg, rs, rt != 0); + return (newMemRoot_, memUpdated_, memAddr_); + } + + // lo and hi registers + // can write back + if (_args.fun >= 0x10 && _args.fun < 0x1c) { + handleHiLo({ + _cpu: _args.cpu, + _registers: _args.registers, + _fun: _args.fun, + _rs: rs, + _rt: rt, + _storeReg: rdReg + }); + return (newMemRoot_, memUpdated_, memAddr_); + } + } + + // write memory + if (storeAddr != 0xFF_FF_FF_FF) { + newMemRoot_ = MIPSMemory.writeMem(storeAddr, _args.memProofOffset, val); + memUpdated_ = true; + memAddr_ = storeAddr; + } + + // write back the value to destination register + handleRd(_args.cpu, _args.registers, rdReg, val, true); + + return (newMemRoot_, memUpdated_, memAddr_); + } + } + + function signExtendImmediate(uint32 _insn) internal pure returns (uint32 offset_) { + unchecked { + return signExtend(_insn & 0xFFFF, 16); + } + } + + /// @notice Execute an instruction. + function executeMipsInstruction( + uint32 _insn, + uint32 _opcode, + uint32 _fun, + uint32 _rs, + uint32 _rt, + uint32 _mem + ) + internal + pure + returns (uint32 out_) + { + unchecked { + if (_opcode == 0 || (_opcode >= 8 && _opcode < 0xF)) { + assembly { + // transform ArithLogI to SPECIAL + switch _opcode + // addi + case 0x8 { _fun := 0x20 } + // addiu + case 0x9 { _fun := 0x21 } + // stli + case 0xA { _fun := 0x2A } + // sltiu + case 0xB { _fun := 0x2B } + // andi + case 0xC { _fun := 0x24 } + // ori + case 0xD { _fun := 0x25 } + // xori + case 0xE { _fun := 0x26 } + } + + // sll + if (_fun == 0x00) { + return _rt << ((_insn >> 6) & 0x1F); + } + // srl + else if (_fun == 0x02) { + return _rt >> ((_insn >> 6) & 0x1F); + } + // sra + else if (_fun == 0x03) { + uint32 shamt = (_insn >> 6) & 0x1F; + return signExtend(_rt >> shamt, 32 - shamt); + } + // sllv + else if (_fun == 0x04) { + return _rt << (_rs & 0x1F); + } + // srlv + else if (_fun == 0x6) { + return _rt >> (_rs & 0x1F); + } + // srav + else if (_fun == 0x07) { + // shamt here is different than the typical shamt which comes from the + // instruction itself, here it comes from the rs register + uint32 shamt = _rs & 0x1F; + return signExtend(_rt >> shamt, 32 - shamt); + } + // functs in range [0x8, 0x1b] are handled specially by other functions + // Explicitly enumerate each funct in range to reduce code diff against Go Vm + // jr + else if (_fun == 0x08) { + return _rs; + } + // jalr + else if (_fun == 0x09) { + return _rs; + } + // movz + else if (_fun == 0x0a) { + return _rs; + } + // movn + else if (_fun == 0x0b) { + return _rs; + } + // syscall + else if (_fun == 0x0c) { + return _rs; + } + // 0x0d - break not supported + // sync + else if (_fun == 0x0f) { + return _rs; + } + // mfhi + else if (_fun == 0x10) { + return _rs; + } + // mthi + else if (_fun == 0x11) { + return _rs; + } + // mflo + else if (_fun == 0x12) { + return _rs; + } + // mtlo + else if (_fun == 0x13) { + return _rs; + } + // mult + else if (_fun == 0x18) { + return _rs; + } + // multu + else if (_fun == 0x19) { + return _rs; + } + // div + else if (_fun == 0x1a) { + return _rs; + } + // divu + else if (_fun == 0x1b) { + return _rs; + } + // The rest includes transformed R-type arith imm instructions + // add + else if (_fun == 0x20) { + return (_rs + _rt); + } + // addu + else if (_fun == 0x21) { + return (_rs + _rt); + } + // sub + else if (_fun == 0x22) { + return (_rs - _rt); + } + // subu + else if (_fun == 0x23) { + return (_rs - _rt); + } + // and + else if (_fun == 0x24) { + return (_rs & _rt); + } + // or + else if (_fun == 0x25) { + return (_rs | _rt); + } + // xor + else if (_fun == 0x26) { + return (_rs ^ _rt); + } + // nor + else if (_fun == 0x27) { + return ~(_rs | _rt); + } + // slti + else if (_fun == 0x2a) { + return int32(_rs) < int32(_rt) ? 1 : 0; + } + // sltiu + else if (_fun == 0x2b) { + return _rs < _rt ? 1 : 0; + } else { + revert("invalid instruction"); + } + } else { + // SPECIAL2 + if (_opcode == 0x1C) { + // mul + if (_fun == 0x2) { + return uint32(int32(_rs) * int32(_rt)); + } + // clz, clo + else if (_fun == 0x20 || _fun == 0x21) { + if (_fun == 0x20) { + _rs = ~_rs; + } + uint32 i = 0; + while (_rs & 0x80000000 != 0) { + i++; + _rs <<= 1; + } + return i; + } + } + // lui + else if (_opcode == 0x0F) { + return _rt << 16; + } + // lb + else if (_opcode == 0x20) { + return signExtend((_mem >> (24 - (_rs & 3) * 8)) & 0xFF, 8); + } + // lh + else if (_opcode == 0x21) { + return signExtend((_mem >> (16 - (_rs & 2) * 8)) & 0xFFFF, 16); + } + // lwl + else if (_opcode == 0x22) { + uint32 val = _mem << ((_rs & 3) * 8); + uint32 mask = uint32(0xFFFFFFFF) << ((_rs & 3) * 8); + return (_rt & ~mask) | val; + } + // lw + else if (_opcode == 0x23) { + return _mem; + } + // lbu + else if (_opcode == 0x24) { + return (_mem >> (24 - (_rs & 3) * 8)) & 0xFF; + } + // lhu + else if (_opcode == 0x25) { + return (_mem >> (16 - (_rs & 2) * 8)) & 0xFFFF; + } + // lwr + else if (_opcode == 0x26) { + uint32 val = _mem >> (24 - (_rs & 3) * 8); + uint32 mask = uint32(0xFFFFFFFF) >> (24 - (_rs & 3) * 8); + return (_rt & ~mask) | val; + } + // sb + else if (_opcode == 0x28) { + uint32 val = (_rt & 0xFF) << (24 - (_rs & 3) * 8); + uint32 mask = 0xFFFFFFFF ^ uint32(0xFF << (24 - (_rs & 3) * 8)); + return (_mem & mask) | val; + } + // sh + else if (_opcode == 0x29) { + uint32 val = (_rt & 0xFFFF) << (16 - (_rs & 2) * 8); + uint32 mask = 0xFFFFFFFF ^ uint32(0xFFFF << (16 - (_rs & 2) * 8)); + return (_mem & mask) | val; + } + // swl + else if (_opcode == 0x2a) { + uint32 val = _rt >> ((_rs & 3) * 8); + uint32 mask = uint32(0xFFFFFFFF) >> ((_rs & 3) * 8); + return (_mem & ~mask) | val; + } + // sw + else if (_opcode == 0x2b) { + return _rt; + } + // swr + else if (_opcode == 0x2e) { + uint32 val = _rt << (24 - (_rs & 3) * 8); + uint32 mask = uint32(0xFFFFFFFF) << (24 - (_rs & 3) * 8); + return (_mem & ~mask) | val; + } else { + revert("invalid instruction"); + } + } + revert("invalid instruction"); + } + } + + /// @notice Extends the value leftwards with its most significant bit (sign extension). + function signExtend(uint32 _dat, uint32 _idx) internal pure returns (uint32 out_) { + unchecked { + bool isSigned = (_dat >> (_idx - 1)) != 0; + uint256 signed = ((1 << (32 - _idx)) - 1) << _idx; + uint256 mask = (1 << _idx) - 1; + return uint32(_dat & mask | (isSigned ? signed : 0)); + } + } + + /// @notice Handles a branch instruction, updating the MIPS state PC where needed. + /// @param _cpu Holds the state of cpu scalars pc, nextPC, hi, lo. + /// @param _registers Holds the current state of the cpu registers. + /// @param _opcode The opcode of the branch instruction. + /// @param _insn The instruction to be executed. + /// @param _rtReg The register to be used for the branch. + /// @param _rs The register to be compared with the branch register. + function handleBranch( + st.CpuScalars memory _cpu, + uint32[32] memory _registers, + uint32 _opcode, + uint32 _insn, + uint32 _rtReg, + uint32 _rs + ) + internal + pure + { + unchecked { + bool shouldBranch = false; + + if (_cpu.nextPC != _cpu.pc + 4) { + revert("branch in delay slot"); + } + + // beq/bne: Branch on equal / not equal + if (_opcode == 4 || _opcode == 5) { + uint32 rt = _registers[_rtReg]; + shouldBranch = (_rs == rt && _opcode == 4) || (_rs != rt && _opcode == 5); + } + // blez: Branches if instruction is less than or equal to zero + else if (_opcode == 6) { + shouldBranch = int32(_rs) <= 0; + } + // bgtz: Branches if instruction is greater than zero + else if (_opcode == 7) { + shouldBranch = int32(_rs) > 0; + } + // bltz/bgez: Branch on less than zero / greater than or equal to zero + else if (_opcode == 1) { + // regimm + uint32 rtv = ((_insn >> 16) & 0x1F); + if (rtv == 0) { + shouldBranch = int32(_rs) < 0; + } + if (rtv == 1) { + shouldBranch = int32(_rs) >= 0; + } + } + + // Update the state's previous PC + uint32 prevPC = _cpu.pc; + + // Execute the delay slot first + _cpu.pc = _cpu.nextPC; + + // If we should branch, update the PC to the branch target + // Otherwise, proceed to the next instruction + if (shouldBranch) { + _cpu.nextPC = prevPC + 4 + (signExtend(_insn & 0xFFFF, 16) << 2); + } else { + _cpu.nextPC = _cpu.nextPC + 4; + } + } + } + + /// @notice Handles HI and LO register instructions. + /// @param _cpu Holds the state of cpu scalars pc, nextPC, hi, lo. + /// @param _registers Holds the current state of the cpu registers. + /// @param _fun The function code of the instruction. + /// @param _rs The value of the RS register. + /// @param _rt The value of the RT register. + /// @param _storeReg The register to store the result in. + function handleHiLo( + st.CpuScalars memory _cpu, + uint32[32] memory _registers, + uint32 _fun, + uint32 _rs, + uint32 _rt, + uint32 _storeReg + ) + internal + pure + { + unchecked { + uint32 val = 0; + + // mfhi: Move the contents of the HI register into the destination + if (_fun == 0x10) { + val = _cpu.hi; + } + // mthi: Move the contents of the source into the HI register + else if (_fun == 0x11) { + _cpu.hi = _rs; + } + // mflo: Move the contents of the LO register into the destination + else if (_fun == 0x12) { + val = _cpu.lo; + } + // mtlo: Move the contents of the source into the LO register + else if (_fun == 0x13) { + _cpu.lo = _rs; + } + // mult: Multiplies `rs` by `rt` and stores the result in HI and LO registers + else if (_fun == 0x18) { + uint64 acc = uint64(int64(int32(_rs)) * int64(int32(_rt))); + _cpu.hi = uint32(acc >> 32); + _cpu.lo = uint32(acc); + } + // multu: Unsigned multiplies `rs` by `rt` and stores the result in HI and LO registers + else if (_fun == 0x19) { + uint64 acc = uint64(uint64(_rs) * uint64(_rt)); + _cpu.hi = uint32(acc >> 32); + _cpu.lo = uint32(acc); + } + // div: Divides `rs` by `rt`. + // Stores the quotient in LO + // And the remainder in HI + else if (_fun == 0x1a) { + if (int32(_rt) == 0) { + revert("MIPS: division by zero"); + } + _cpu.hi = uint32(int32(_rs) % int32(_rt)); + _cpu.lo = uint32(int32(_rs) / int32(_rt)); + } + // divu: Unsigned divides `rs` by `rt`. + // Stores the quotient in LO + // And the remainder in HI + else if (_fun == 0x1b) { + if (_rt == 0) { + revert("MIPS: division by zero"); + } + _cpu.hi = _rs % _rt; + _cpu.lo = _rs / _rt; + } + + // Store the result in the destination register, if applicable + if (_storeReg != 0) { + _registers[_storeReg] = val; + } + + // Update the PC + _cpu.pc = _cpu.nextPC; + _cpu.nextPC = _cpu.nextPC + 4; + } + } + + /// @notice Handles a jump instruction, updating the MIPS state PC where needed. + /// @param _cpu Holds the state of cpu scalars pc, nextPC, hi, lo. + /// @param _registers Holds the current state of the cpu registers. + /// @param _linkReg The register to store the link to the instruction after the delay slot instruction. + /// @param _dest The destination to jump to. + function handleJump( + st.CpuScalars memory _cpu, + uint32[32] memory _registers, + uint32 _linkReg, + uint32 _dest + ) + internal + pure + { + unchecked { + if (_cpu.nextPC != _cpu.pc + 4) { + revert("jump in delay slot"); + } + + // Update the next PC to the jump destination. + uint32 prevPC = _cpu.pc; + _cpu.pc = _cpu.nextPC; + _cpu.nextPC = _dest; + + // Update the link-register to the instruction after the delay slot instruction. + if (_linkReg != 0) { + _registers[_linkReg] = prevPC + 8; + } + } + } + + /// @notice Handles a storing a value into a register. + /// @param _cpu Holds the state of cpu scalars pc, nextPC, hi, lo. + /// @param _registers Holds the current state of the cpu registers. + /// @param _storeReg The register to store the value into. + /// @param _val The value to store. + /// @param _conditional Whether or not the store is conditional. + function handleRd( + st.CpuScalars memory _cpu, + uint32[32] memory _registers, + uint32 _storeReg, + uint32 _val, + bool _conditional + ) + internal + pure + { + unchecked { + // The destination register must be valid. + require(_storeReg < 32, "valid register"); + + // Never write to reg 0, and it can be conditional (movz, movn). + if (_storeReg != 0 && _conditional) { + _registers[_storeReg] = _val; + } + + // Update the PC. + _cpu.pc = _cpu.nextPC; + _cpu.nextPC = _cpu.nextPC + 4; + } + } +} diff --git a/packages/contracts-bedrock/src/cannon/libraries/MIPSMemory.sol b/packages/contracts-bedrock/src/cannon/libraries/MIPSMemory.sol new file mode 100644 index 000000000000..e88f51438ef4 --- /dev/null +++ b/packages/contracts-bedrock/src/cannon/libraries/MIPSMemory.sol @@ -0,0 +1,157 @@ +// SPDX-License-Identifier: MIT +pragma solidity 0.8.15; + +import "src/cannon/libraries/CannonErrors.sol"; + +library MIPSMemory { + /// @notice Reads a 32-bit value from memory. + /// @param _memRoot The current memory root + /// @param _addr The address to read from. + /// @param _proofOffset The offset of the memory proof in calldata. + /// @return out_ The hashed MIPS state. + function readMem(bytes32 _memRoot, uint32 _addr, uint256 _proofOffset) internal pure returns (uint32 out_) { + bool valid; + (out_, valid) = readMemUnchecked(_memRoot, _addr, _proofOffset); + if (!valid) { + revert InvalidMemoryProof(); + } + } + + /// @notice Reads a 32-bit value from memory. + /// @param _memRoot The current memory root + /// @param _addr The address to read from. + /// @param _proofOffset The offset of the memory proof in calldata. + /// @return out_ The hashed MIPS state. + /// valid_ Whether the proof is valid. + function readMemUnchecked( + bytes32 _memRoot, + uint32 _addr, + uint256 _proofOffset + ) + internal + pure + returns (uint32 out_, bool valid_) + { + unchecked { + validateMemoryProofAvailability(_proofOffset); + assembly { + // Validate the address alignement. + if and(_addr, 3) { revert(0, 0) } + + // Load the leaf value. + let leaf := calldataload(_proofOffset) + _proofOffset := add(_proofOffset, 32) + + // Convenience function to hash two nodes together in scratch space. + function hashPair(a, b) -> h { + mstore(0, a) + mstore(32, b) + h := keccak256(0, 64) + } + + // Start with the leaf node. + // Work back up by combining with siblings, to reconstruct the root. + let path := shr(5, _addr) + let node := leaf + for { let i := 0 } lt(i, 27) { i := add(i, 1) } { + let sibling := calldataload(_proofOffset) + _proofOffset := add(_proofOffset, 32) + switch and(shr(i, path), 1) + case 0 { node := hashPair(node, sibling) } + case 1 { node := hashPair(sibling, node) } + } + + // Verify the root matches. + valid_ := eq(node, _memRoot) + if valid_ { + // Bits to shift = (32 - 4 - (addr % 32)) * 8 + let shamt := shl(3, sub(sub(32, 4), and(_addr, 31))) + out_ := and(shr(shamt, leaf), 0xFFffFFff) + } + } + } + } + + /// @notice Writes a 32-bit value to memory. + /// This function first overwrites the part of the leaf. + /// Then it recomputes the memory merkle root. + /// @param _addr The address to write to. + /// @param _proofOffset The offset of the memory proof in calldata. + /// @param _val The value to write. + /// @return newMemRoot_ The new memory root after modification + function writeMem(uint32 _addr, uint256 _proofOffset, uint32 _val) internal pure returns (bytes32 newMemRoot_) { + unchecked { + validateMemoryProofAvailability(_proofOffset); + assembly { + // Validate the address alignement. + if and(_addr, 3) { revert(0, 0) } + + // Load the leaf value. + let leaf := calldataload(_proofOffset) + let shamt := shl(3, sub(sub(32, 4), and(_addr, 31))) + + // Mask out 4 bytes, and OR in the value + leaf := or(and(leaf, not(shl(shamt, 0xFFffFFff))), shl(shamt, _val)) + _proofOffset := add(_proofOffset, 32) + + // Convenience function to hash two nodes together in scratch space. + function hashPair(a, b) -> h { + mstore(0, a) + mstore(32, b) + h := keccak256(0, 64) + } + + // Start with the leaf node. + // Work back up by combining with siblings, to reconstruct the root. + let path := shr(5, _addr) + let node := leaf + for { let i := 0 } lt(i, 27) { i := add(i, 1) } { + let sibling := calldataload(_proofOffset) + _proofOffset := add(_proofOffset, 32) + switch and(shr(i, path), 1) + case 0 { node := hashPair(node, sibling) } + case 1 { node := hashPair(sibling, node) } + } + + newMemRoot_ := node + } + return newMemRoot_; + } + } + + /// @notice Verifies a memory proof. + /// @param _memRoot The expected memory root + /// @param _addr The _addr proven. + /// @param _proofOffset The offset of the memory proof in calldata. + /// @return valid_ True iff it is a valid proof. + function isValidProof(bytes32 _memRoot, uint32 _addr, uint256 _proofOffset) internal pure returns (bool valid_) { + (, valid_) = readMemUnchecked(_memRoot, _addr, _proofOffset); + } + + /// @notice Computes the offset of a memory proof in the calldata. + /// @param _proofDataOffset The offset of the set of all memory proof data within calldata (proof.offset) + /// Equal to the offset of the first memory proof (at _proofIndex 0). + /// @param _proofIndex The index of the proof in the calldata. + /// @return offset_ The offset of the memory proof at the given _proofIndex in the calldata. + function memoryProofOffset(uint256 _proofDataOffset, uint8 _proofIndex) internal pure returns (uint256 offset_) { + unchecked { + // A proof of 32 bit memory, with 32-byte leaf values, is (32-5)=27 bytes32 entries. + // And the leaf value itself needs to be encoded as well: (27 + 1) = 28 bytes32 entries. + offset_ = _proofDataOffset + (uint256(_proofIndex) * (28 * 32)); + return offset_; + } + } + + /// @notice Validates that enough calldata is available to hold a full memory proof at the given offset + /// @param _proofStartOffset The index of the first byte of the target memory proof in calldata + function validateMemoryProofAvailability(uint256 _proofStartOffset) internal pure { + unchecked { + uint256 s = 0; + assembly { + s := calldatasize() + } + // A memory proof consists of 28 bytes32 values - verify we have enough calldata + require(s >= (_proofStartOffset + 28 * 32), "check that there is enough calldata"); + } + } +} diff --git a/packages/contracts-bedrock/src/cannon/libraries/MIPSState.sol b/packages/contracts-bedrock/src/cannon/libraries/MIPSState.sol new file mode 100644 index 000000000000..2f76a2e0dda5 --- /dev/null +++ b/packages/contracts-bedrock/src/cannon/libraries/MIPSState.sol @@ -0,0 +1,19 @@ +// SPDX-License-Identifier: MIT +pragma solidity 0.8.15; + +import { InvalidExitedValue } from "src/cannon/libraries/CannonErrors.sol"; + +library MIPSState { + struct CpuScalars { + uint32 pc; + uint32 nextPC; + uint32 lo; + uint32 hi; + } + + function assertExitedIsValid(uint32 exited) internal pure { + if (exited > 1) { + revert InvalidExitedValue(); + } + } +} diff --git a/packages/contracts-bedrock/src/cannon/libraries/MIPSSyscalls.sol b/packages/contracts-bedrock/src/cannon/libraries/MIPSSyscalls.sol new file mode 100644 index 000000000000..a835b6feef58 --- /dev/null +++ b/packages/contracts-bedrock/src/cannon/libraries/MIPSSyscalls.sol @@ -0,0 +1,396 @@ +// SPDX-License-Identifier: MIT +pragma solidity 0.8.15; + +import { MIPSMemory } from "src/cannon/libraries/MIPSMemory.sol"; +import { MIPSState as st } from "src/cannon/libraries/MIPSState.sol"; +import { IPreimageOracle } from "src/cannon/interfaces/IPreimageOracle.sol"; +import { PreimageKeyLib } from "src/cannon/PreimageKeyLib.sol"; + +library MIPSSyscalls { + struct SysReadParams { + /// @param _a0 The file descriptor. + uint32 a0; + /// @param _a1 The memory location where data should be read to. + uint32 a1; + /// @param _a2 The number of bytes to read from the file + uint32 a2; + /// @param _preimageKey The key of the preimage to read. + bytes32 preimageKey; + /// @param _preimageOffset The offset of the preimage to read. + uint32 preimageOffset; + /// @param _localContext The local context for the preimage key. + bytes32 localContext; + /// @param _oracle The address of the preimage oracle. + IPreimageOracle oracle; + /// @param _proofOffset The offset of the memory proof in calldata. + uint256 proofOffset; + /// @param _memRoot The current memory root. + bytes32 memRoot; + } + + uint32 internal constant SYS_MMAP = 4090; + uint32 internal constant SYS_BRK = 4045; + uint32 internal constant SYS_CLONE = 4120; + uint32 internal constant SYS_EXIT_GROUP = 4246; + uint32 internal constant SYS_READ = 4003; + uint32 internal constant SYS_WRITE = 4004; + uint32 internal constant SYS_FCNTL = 4055; + uint32 internal constant SYS_EXIT = 4001; + uint32 internal constant SYS_SCHED_YIELD = 4162; + uint32 internal constant SYS_GETTID = 4222; + uint32 internal constant SYS_FUTEX = 4238; + uint32 internal constant SYS_OPEN = 4005; + uint32 internal constant SYS_NANOSLEEP = 4166; + uint32 internal constant SYS_CLOCKGETTIME = 4263; + uint32 internal constant SYS_GETPID = 4020; + // unused syscalls + uint32 internal constant SYS_MUNMAP = 4091; + uint32 internal constant SYS_GETAFFINITY = 4240; + uint32 internal constant SYS_MADVISE = 4218; + uint32 internal constant SYS_RTSIGPROCMASK = 4195; + uint32 internal constant SYS_SIGALTSTACK = 4206; + uint32 internal constant SYS_RTSIGACTION = 4194; + uint32 internal constant SYS_PRLIMIT64 = 4338; + uint32 internal constant SYS_CLOSE = 4006; + uint32 internal constant SYS_PREAD64 = 4200; + uint32 internal constant SYS_FSTAT64 = 4215; + uint32 internal constant SYS_OPENAT = 4288; + uint32 internal constant SYS_READLINK = 4085; + uint32 internal constant SYS_READLINKAT = 4298; + uint32 internal constant SYS_IOCTL = 4054; + uint32 internal constant SYS_EPOLLCREATE1 = 4326; + uint32 internal constant SYS_PIPE2 = 4328; + uint32 internal constant SYS_EPOLLCTL = 4249; + uint32 internal constant SYS_EPOLLPWAIT = 4313; + uint32 internal constant SYS_GETRANDOM = 4353; + uint32 internal constant SYS_UNAME = 4122; + uint32 internal constant SYS_STAT64 = 4213; + uint32 internal constant SYS_GETUID = 4024; + uint32 internal constant SYS_GETGID = 4047; + uint32 internal constant SYS_LLSEEK = 4140; + uint32 internal constant SYS_MINCORE = 4217; + uint32 internal constant SYS_TGKILL = 4266; + + // profiling-related syscalls - ignored + uint32 internal constant SYS_SETITIMER = 4104; + uint32 internal constant SYS_TIMERCREATE = 4257; + uint32 internal constant SYS_TIMERSETTIME = 4258; + uint32 internal constant SYS_TIMERDELETE = 4261; + + uint32 internal constant FD_STDIN = 0; + uint32 internal constant FD_STDOUT = 1; + uint32 internal constant FD_STDERR = 2; + uint32 internal constant FD_HINT_READ = 3; + uint32 internal constant FD_HINT_WRITE = 4; + uint32 internal constant FD_PREIMAGE_READ = 5; + uint32 internal constant FD_PREIMAGE_WRITE = 6; + + uint32 internal constant SYS_ERROR_SIGNAL = 0xFF_FF_FF_FF; + uint32 internal constant EBADF = 0x9; + uint32 internal constant EINVAL = 0x16; + uint32 internal constant EAGAIN = 0xb; + uint32 internal constant ETIMEDOUT = 0x91; + + uint32 internal constant FUTEX_WAIT_PRIVATE = 128; + uint32 internal constant FUTEX_WAKE_PRIVATE = 129; + uint32 internal constant FUTEX_TIMEOUT_STEPS = 10000; + uint64 internal constant FUTEX_NO_TIMEOUT = type(uint64).max; + uint32 internal constant FUTEX_EMPTY_ADDR = 0xFF_FF_FF_FF; + + uint32 internal constant SCHED_QUANTUM = 100_000; + uint32 internal constant HZ = 10_000_000; + uint32 internal constant CLOCK_GETTIME_REALTIME_FLAG = 0; + uint32 internal constant CLOCK_GETTIME_MONOTONIC_FLAG = 1; + /// @notice Start of the data segment. + uint32 internal constant PROGRAM_BREAK = 0x40000000; + uint32 internal constant HEAP_END = 0x60000000; + + // SYS_CLONE flags + uint32 internal constant CLONE_VM = 0x100; + uint32 internal constant CLONE_FS = 0x200; + uint32 internal constant CLONE_FILES = 0x400; + uint32 internal constant CLONE_SIGHAND = 0x800; + uint32 internal constant CLONE_PTRACE = 0x2000; + uint32 internal constant CLONE_VFORK = 0x4000; + uint32 internal constant CLONE_PARENT = 0x8000; + uint32 internal constant CLONE_THREAD = 0x10000; + uint32 internal constant CLONE_NEWNS = 0x20000; + uint32 internal constant CLONE_SYSVSEM = 0x40000; + uint32 internal constant CLONE_SETTLS = 0x80000; + uint32 internal constant CLONE_PARENTSETTID = 0x100000; + uint32 internal constant CLONE_CHILDCLEARTID = 0x200000; + uint32 internal constant CLONE_UNTRACED = 0x800000; + uint32 internal constant CLONE_CHILDSETTID = 0x1000000; + uint32 internal constant CLONE_STOPPED = 0x2000000; + uint32 internal constant CLONE_NEWUTS = 0x4000000; + uint32 internal constant CLONE_NEWIPC = 0x8000000; + uint32 internal constant VALID_SYS_CLONE_FLAGS = + CLONE_VM | CLONE_FS | CLONE_FILES | CLONE_SIGHAND | CLONE_SYSVSEM | CLONE_THREAD; + + /// @notice Extract syscall num and arguments from registers. + /// @param _registers The cpu registers. + /// @return sysCallNum_ The syscall number. + /// @return a0_ The first argument available to the syscall operation. + /// @return a1_ The second argument available to the syscall operation. + /// @return a2_ The third argument available to the syscall operation. + /// @return a3_ The fourth argument available to the syscall operation. + function getSyscallArgs(uint32[32] memory _registers) + internal + pure + returns (uint32 sysCallNum_, uint32 a0_, uint32 a1_, uint32 a2_, uint32 a3_) + { + unchecked { + sysCallNum_ = _registers[2]; + + a0_ = _registers[4]; + a1_ = _registers[5]; + a2_ = _registers[6]; + a3_ = _registers[7]; + + return (sysCallNum_, a0_, a1_, a2_, a3_); + } + } + + /// @notice Like a Linux mmap syscall. Allocates a page from the heap. + /// @param _a0 The address for the new mapping + /// @param _a1 The size of the new mapping + /// @param _heap The current value of the heap pointer + /// @return v0_ The address of the new mapping + /// @return v1_ Unused error code (0) + /// @return newHeap_ The new value for the heap, may be unchanged + function handleSysMmap( + uint32 _a0, + uint32 _a1, + uint32 _heap + ) + internal + pure + returns (uint32 v0_, uint32 v1_, uint32 newHeap_) + { + unchecked { + v1_ = uint32(0); + newHeap_ = _heap; + + uint32 sz = _a1; + if (sz & 4095 != 0) { + // adjust size to align with page size + sz += 4096 - (sz & 4095); + } + if (_a0 == 0) { + v0_ = _heap; + newHeap_ += sz; + // Fail if new heap exceeds memory limit, newHeap overflows to low memory, or sz overflows + if (newHeap_ > HEAP_END || newHeap_ < _heap || sz < _a1) { + v0_ = SYS_ERROR_SIGNAL; + v1_ = EINVAL; + return (v0_, v1_, _heap); + } + } else { + v0_ = _a0; + } + + return (v0_, v1_, newHeap_); + } + } + + /// @notice Like a Linux read syscall. Splits unaligned reads into aligned reads. + /// Args are provided as a struct to reduce stack pressure. + /// @return v0_ The number of bytes read, -1 on error. + /// @return v1_ The error code, 0 if there is no error. + /// @return newPreimageOffset_ The new value for the preimage offset. + /// @return newMemRoot_ The new memory root. + function handleSysRead(SysReadParams memory _args) + internal + view + returns ( + uint32 v0_, + uint32 v1_, + uint32 newPreimageOffset_, + bytes32 newMemRoot_, + bool memUpdated_, + uint32 memAddr_ + ) + { + unchecked { + v0_ = uint32(0); + v1_ = uint32(0); + newMemRoot_ = _args.memRoot; + newPreimageOffset_ = _args.preimageOffset; + memUpdated_ = false; + memAddr_ = 0; + + // args: _a0 = fd, _a1 = addr, _a2 = count + // returns: v0_ = read, v1_ = err code + if (_args.a0 == FD_STDIN) { + // Leave v0_ and v1_ zero: read nothing, no error + } + // pre-image oracle read + else if (_args.a0 == FD_PREIMAGE_READ) { + uint32 effAddr = _args.a1 & 0xFFffFFfc; + // verify proof is correct, and get the existing memory. + // mask the addr to align it to 4 bytes + uint32 mem = MIPSMemory.readMem(_args.memRoot, effAddr, _args.proofOffset); + // If the preimage key is a local key, localize it in the context of the caller. + if (uint8(_args.preimageKey[0]) == 1) { + _args.preimageKey = PreimageKeyLib.localize(_args.preimageKey, _args.localContext); + } + (bytes32 dat, uint256 datLen) = _args.oracle.readPreimage(_args.preimageKey, _args.preimageOffset); + + // Transform data for writing to memory + // We use assembly for more precise ops, and no var count limit + uint32 a1 = _args.a1; + uint32 a2 = _args.a2; + assembly { + let alignment := and(a1, 3) // the read might not start at an aligned address + let space := sub(4, alignment) // remaining space in memory word + if lt(space, datLen) { datLen := space } // if less space than data, shorten data + if lt(a2, datLen) { datLen := a2 } // if requested to read less, read less + dat := shr(sub(256, mul(datLen, 8)), dat) // right-align data + dat := shl(mul(sub(sub(4, datLen), alignment), 8), dat) // position data to insert into memory + // word + let mask := sub(shl(mul(sub(4, alignment), 8), 1), 1) // mask all bytes after start + let suffixMask := sub(shl(mul(sub(sub(4, alignment), datLen), 8), 1), 1) // mask of all bytes + // starting from end, maybe none + mask := and(mask, not(suffixMask)) // reduce mask to just cover the data we insert + mem := or(and(mem, not(mask)), dat) // clear masked part of original memory, and insert data + } + + // Write memory back + newMemRoot_ = MIPSMemory.writeMem(effAddr, _args.proofOffset, mem); + memUpdated_ = true; + memAddr_ = effAddr; + newPreimageOffset_ += uint32(datLen); + v0_ = uint32(datLen); + } + // hint response + else if (_args.a0 == FD_HINT_READ) { + // Don't read into memory, just say we read it all + // The result is ignored anyway + v0_ = _args.a2; + } else { + v0_ = 0xFFffFFff; + v1_ = EBADF; + } + + return (v0_, v1_, newPreimageOffset_, newMemRoot_, memUpdated_, memAddr_); + } + } + + /// @notice Like a Linux write syscall. Splits unaligned writes into aligned writes. + /// @param _a0 The file descriptor. + /// @param _a1 The memory address to read from. + /// @param _a2 The number of bytes to read. + /// @param _preimageKey The current preimaageKey. + /// @param _preimageOffset The current preimageOffset. + /// @param _proofOffset The offset of the memory proof in calldata. + /// @param _memRoot The current memory root. + /// @return v0_ The number of bytes written, or -1 on error. + /// @return v1_ The error code, or 0 if empty. + /// @return newPreimageKey_ The new preimageKey. + /// @return newPreimageOffset_ The new preimageOffset. + function handleSysWrite( + uint32 _a0, + uint32 _a1, + uint32 _a2, + bytes32 _preimageKey, + uint32 _preimageOffset, + uint256 _proofOffset, + bytes32 _memRoot + ) + internal + pure + returns (uint32 v0_, uint32 v1_, bytes32 newPreimageKey_, uint32 newPreimageOffset_) + { + unchecked { + // args: _a0 = fd, _a1 = addr, _a2 = count + // returns: v0_ = written, v1_ = err code + v0_ = uint32(0); + v1_ = uint32(0); + newPreimageKey_ = _preimageKey; + newPreimageOffset_ = _preimageOffset; + + if (_a0 == FD_STDOUT || _a0 == FD_STDERR || _a0 == FD_HINT_WRITE) { + v0_ = _a2; // tell program we have written everything + } + // pre-image oracle + else if (_a0 == FD_PREIMAGE_WRITE) { + // mask the addr to align it to 4 bytes + uint32 mem = MIPSMemory.readMem(_memRoot, _a1 & 0xFFffFFfc, _proofOffset); + bytes32 key = _preimageKey; + + // Construct pre-image key from memory + // We use assembly for more precise ops, and no var count limit + assembly { + let alignment := and(_a1, 3) // the read might not start at an aligned address + let space := sub(4, alignment) // remaining space in memory word + if lt(space, _a2) { _a2 := space } // if less space than data, shorten data + key := shl(mul(_a2, 8), key) // shift key, make space for new info + let mask := sub(shl(mul(_a2, 8), 1), 1) // mask for extracting value from memory + mem := and(shr(mul(sub(space, _a2), 8), mem), mask) // align value to right, mask it + key := or(key, mem) // insert into key + } + + // Write pre-image key to oracle + newPreimageKey_ = key; + newPreimageOffset_ = 0; // reset offset, to read new pre-image data from the start + v0_ = _a2; + } else { + v0_ = 0xFFffFFff; + v1_ = EBADF; + } + + return (v0_, v1_, newPreimageKey_, newPreimageOffset_); + } + } + + /// @notice Like Linux fcntl (file control) syscall, but only supports minimal file-descriptor control commands, to + /// retrieve the file-descriptor R/W flags. + /// @param _a0 The file descriptor. + /// @param _a1 The control command. + /// @param v0_ The file status flag (only supported command is F_GETFL), or -1 on error. + /// @param v1_ An error number, or 0 if there is no error. + function handleSysFcntl(uint32 _a0, uint32 _a1) internal pure returns (uint32 v0_, uint32 v1_) { + unchecked { + v0_ = uint32(0); + v1_ = uint32(0); + + // args: _a0 = fd, _a1 = cmd + if (_a1 == 3) { + // F_GETFL: get file descriptor flags + if (_a0 == FD_STDIN || _a0 == FD_PREIMAGE_READ || _a0 == FD_HINT_READ) { + v0_ = 0; // O_RDONLY + } else if (_a0 == FD_STDOUT || _a0 == FD_STDERR || _a0 == FD_PREIMAGE_WRITE || _a0 == FD_HINT_WRITE) { + v0_ = 1; // O_WRONLY + } else { + v0_ = 0xFFffFFff; + v1_ = EBADF; + } + } else { + v0_ = 0xFFffFFff; + v1_ = EINVAL; // cmd not recognized by this kernel + } + + return (v0_, v1_); + } + } + + function handleSyscallUpdates( + st.CpuScalars memory _cpu, + uint32[32] memory _registers, + uint32 _v0, + uint32 _v1 + ) + internal + pure + { + unchecked { + // Write the results back to the state registers + _registers[2] = _v0; + _registers[7] = _v1; + + // Update the PC and nextPC + _cpu.pc = _cpu.nextPC; + _cpu.nextPC = _cpu.nextPC + 4; + } + } +} diff --git a/packages/contracts-bedrock/src/dispute/AnchorStateRegistry.sol b/packages/contracts-bedrock/src/dispute/AnchorStateRegistry.sol index c1f95f3df135..5486d83f7684 100644 --- a/packages/contracts-bedrock/src/dispute/AnchorStateRegistry.sol +++ b/packages/contracts-bedrock/src/dispute/AnchorStateRegistry.sol @@ -1,22 +1,28 @@ // SPDX-License-Identifier: MIT pragma solidity 0.8.15; +// Contracts import { Initializable } from "@openzeppelin/contracts/proxy/utils/Initializable.sol"; -import { ISemver } from "src/universal/ISemver.sol"; -import { IAnchorStateRegistry } from "src/dispute/interfaces/IAnchorStateRegistry.sol"; +// Libraries +import "src/dispute/lib/Types.sol"; +import { Unauthorized } from "src/libraries/errors/CommonErrors.sol"; +import { UnregisteredGame, InvalidGameStatus } from "src/dispute/lib/Errors.sol"; + +// Interfaces +import { ISemver } from "src/universal/interfaces/ISemver.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 { ISuperchainConfig } from "src/L1/interfaces/ISuperchainConfig.sol"; -import "src/dispute/lib/Types.sol"; - +/// @custom:proxied true /// @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 { +contract AnchorStateRegistry is Initializable, ISemver { /// @notice Describes an initial anchor state for a game type. struct StartingAnchorRoot { GameType gameType; @@ -24,38 +30,50 @@ contract AnchorStateRegistry is Initializable, IAnchorStateRegistry, ISemver { } /// @notice Semantic version. - /// @custom:semver 1.0.0 - string public constant version = "1.0.0"; + /// @custom:semver 2.0.1-beta.3 + string public constant version = "2.0.1-beta.3"; /// @notice DisputeGameFactory address. IDisputeGameFactory internal immutable DISPUTE_GAME_FACTORY; - /// @inheritdoc IAnchorStateRegistry + /// @notice Returns the anchor state for the given game type. mapping(GameType => OutputRoot) public anchors; + /// @notice Address of the SuperchainConfig contract. + ISuperchainConfig public superchainConfig; + /// @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)); + _disableInitializers(); } /// @notice Initializes the contract. /// @param _startingAnchorRoots An array of starting anchor roots. - function initialize(StartingAnchorRoot[] memory _startingAnchorRoots) public initializer { + /// @param _superchainConfig The address of the SuperchainConfig contract. + function initialize( + StartingAnchorRoot[] memory _startingAnchorRoots, + ISuperchainConfig _superchainConfig + ) + public + initializer + { for (uint256 i = 0; i < _startingAnchorRoots.length; i++) { StartingAnchorRoot memory startingAnchorRoot = _startingAnchorRoots[i]; anchors[startingAnchorRoot.gameType] = startingAnchorRoot.outputRoot; } + superchainConfig = _superchainConfig; } - /// @inheritdoc IAnchorStateRegistry + /// @notice Returns the DisputeGameFactory address. + /// @return DisputeGameFactory address. function disputeGameFactory() external view returns (IDisputeGameFactory) { return DISPUTE_GAME_FACTORY; } - /// @inheritdoc IAnchorStateRegistry + /// @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 { // Grab the game and game data. IFaultDisputeGame game = IFaultDisputeGame(msg.sender); @@ -67,10 +85,7 @@ contract AnchorStateRegistry is Initializable, IAnchorStateRegistry, ISemver { 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" - ); + if (address(factoryRegisteredGame) != address(game)) revert UnregisteredGame(); // No need to update anything if the anchor state is already newer. if (game.l2BlockNumber() <= anchors[gameType].l2BlockNumber) { @@ -85,4 +100,28 @@ contract AnchorStateRegistry is Initializable, IAnchorStateRegistry, ISemver { // Actually update the anchor state. anchors[gameType] = OutputRoot({ l2BlockNumber: game.l2BlockNumber(), root: Hash.wrap(game.rootClaim().raw()) }); } + + /// @notice Sets the anchor state given the game. + /// @param _game The game to set the anchor state for. + function setAnchorState(IFaultDisputeGame _game) external { + if (msg.sender != superchainConfig.guardian()) revert Unauthorized(); + + // Get the metadata of the game. + (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. + if (address(factoryRegisteredGame) != address(_game)) revert UnregisteredGame(); + + // The game must have resolved in favor of the root claim. + if (_game.status() != GameStatus.DEFENDER_WINS) revert InvalidGameStatus(); + + // Update the anchor. + anchors[gameType] = + OutputRoot({ l2BlockNumber: _game.l2BlockNumber(), root: Hash.wrap(_game.rootClaim().raw()) }); + } } diff --git a/packages/contracts-bedrock/src/dispute/DelayedWETH.sol b/packages/contracts-bedrock/src/dispute/DelayedWETH.sol new file mode 100644 index 000000000000..42b6022d12fe --- /dev/null +++ b/packages/contracts-bedrock/src/dispute/DelayedWETH.sol @@ -0,0 +1,118 @@ +// SPDX-License-Identifier: MIT +pragma solidity 0.8.15; + +// Contracts +import { OwnableUpgradeable } from "@openzeppelin/contracts-upgradeable/access/OwnableUpgradeable.sol"; +import { WETH98 } from "src/universal/WETH98.sol"; + +// Interfaces +import { ISemver } from "src/universal/interfaces/ISemver.sol"; +import { ISuperchainConfig } from "src/L1/interfaces/ISuperchainConfig.sol"; + +/// @custom:proxied true +/// @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. +contract DelayedWETH is OwnableUpgradeable, WETH98, ISemver { + /// @notice Represents a withdrawal request. + struct WithdrawalRequest { + uint256 amount; + uint256 timestamp; + } + + /// @notice Emitted when an unwrap is started. + /// @param src The address that started the unwrap. + /// @param wad The amount of WETH that was unwrapped. + event Unwrap(address indexed src, uint256 wad); + + /// @notice Semantic version. + /// @custom:semver 1.2.0-beta.2 + string public constant version = "1.2.0-beta.2"; + + /// @notice Returns a withdrawal request for the given address. + mapping(address => mapping(address => WithdrawalRequest)) public withdrawals; + + /// @notice Withdrawal delay in seconds. + uint256 internal immutable DELAY_SECONDS; + + /// @notice Address of the SuperchainConfig contract. + ISuperchainConfig public config; + + /// @param _delay The delay for withdrawals in seconds. + constructor(uint256 _delay) { + DELAY_SECONDS = _delay; + initialize({ _owner: address(0), _config: ISuperchainConfig(address(0)) }); + } + + /// @notice Initializes the contract. + /// @param _owner The address of the owner. + /// @param _config Address of the SuperchainConfig contract. + function initialize(address _owner, ISuperchainConfig _config) public initializer { + __Ownable_init(); + _transferOwnership(_owner); + config = _config; + } + + /// @notice Returns the withdrawal delay in seconds. + /// @return The withdrawal delay in seconds. + function delay() external view returns (uint256) { + return DELAY_SECONDS; + } + + /// @notice Unlocks withdrawals for the sender's account, after a time delay. + /// @param _guy Sub-account to unlock. + /// @param _wad The amount of WETH to unlock. + 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. + WithdrawalRequest storage wd = withdrawals[msg.sender][_guy]; + wd.timestamp = block.timestamp; + wd.amount += _wad; + } + + /// @notice Withdraws an amount of ETH. + /// @param _wad The amount of ETH to withdraw. + function withdraw(uint256 _wad) public override { + withdraw(msg.sender, _wad); + } + + /// @notice Extension to withdrawal, must provide a sub-account to withdraw from. + /// @param _guy Sub-account to withdraw from. + /// @param _wad The amount of WETH to withdraw. + function withdraw(address _guy, uint256 _wad) public { + require(!config.paused(), "DelayedWETH: contract is paused"); + WithdrawalRequest storage wd = withdrawals[msg.sender][_guy]; + require(wd.amount >= _wad, "DelayedWETH: insufficient unlocked withdrawal"); + require(wd.timestamp > 0, "DelayedWETH: withdrawal not unlocked"); + require(wd.timestamp + DELAY_SECONDS <= block.timestamp, "DelayedWETH: withdrawal delay not met"); + wd.amount -= _wad; + super.withdraw(_wad); + } + + /// @notice Allows the owner to recover from error cases by pulling ETH out of the contract. + /// @param _wad The amount of WETH to recover. + function recover(uint256 _wad) external { + require(msg.sender == owner(), "DelayedWETH: not owner"); + uint256 amount = _wad < address(this).balance ? _wad : address(this).balance; + (bool success,) = payable(msg.sender).call{ value: amount }(hex""); + require(success, "DelayedWETH: recover failed"); + } + + /// @notice Allows the owner to recover from error cases by pulling ETH from a specific owner. + /// @param _guy The address to recover the WETH from. + /// @param _wad The amount of WETH to recover. + function hold(address _guy, uint256 _wad) external { + require(msg.sender == owner(), "DelayedWETH: not owner"); + allowance[_guy][msg.sender] = _wad; + emit Approval(_guy, msg.sender, _wad); + } +} diff --git a/packages/contracts-bedrock/src/dispute/DisputeGameFactory.sol b/packages/contracts-bedrock/src/dispute/DisputeGameFactory.sol index 55d25abb9224..dee8dd75ec60 100644 --- a/packages/contracts-bedrock/src/dispute/DisputeGameFactory.sol +++ b/packages/contracts-bedrock/src/dispute/DisputeGameFactory.sol @@ -1,33 +1,62 @@ // SPDX-License-Identifier: MIT pragma solidity 0.8.15; -import { LibClone } from "@solady/utils/LibClone.sol"; +// Contracts 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"; +// Libraries +import { LibClone } from "@solady/utils/LibClone.sol"; import "src/dispute/lib/Types.sol"; import "src/dispute/lib/Errors.sol"; +// Interfaces +import { ISemver } from "src/universal/interfaces/ISemver.sol"; +import { IDisputeGame } from "src/dispute/interfaces/IDisputeGame.sol"; + +/// @custom:proxied true /// @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 to make offchain discoverability of playable /// dispute games easier. -contract DisputeGameFactory is OwnableUpgradeable, IDisputeGameFactory, ISemver { +contract DisputeGameFactory is OwnableUpgradeable, ISemver { /// @dev Allows for the creation of clone proxies with immutable arguments. using LibClone for address; + /// @notice Emitted when a new dispute game is created + /// @param disputeProxy The address of the dispute game proxy + /// @param gameType The type of the dispute game proxy's implementation + /// @param rootClaim The root claim of the dispute game + event DisputeGameCreated(address indexed disputeProxy, GameType indexed gameType, Claim indexed rootClaim); + + /// @notice Emitted when a new game implementation added to the factory + /// @param impl The implementation contract for the given `GameType`. + /// @param gameType The type of the DisputeGame. + event ImplementationSet(address indexed impl, GameType indexed gameType); + + /// @notice Emitted when a game type's initialization bond is updated + /// @param gameType The type of the DisputeGame. + /// @param newBond The new bond (in wei) for initializing the game type. + event InitBondUpdated(GameType indexed gameType, uint256 indexed newBond); + + /// @notice Information about a dispute game found in a `findLatestGames` search. + struct GameSearchResult { + uint256 index; + GameId metadata; + Timestamp timestamp; + Claim rootClaim; + bytes extraData; + } + /// @notice Semantic version. - /// @custom:semver 1.0.0 - string public constant version = "1.0.0"; + /// @custom:semver 1.0.1-beta.2 + string public constant version = "1.0.1-beta.2"; - /// @inheritdoc IDisputeGameFactory + /// @notice `gameImpls` is a mapping that maps `GameType`s to their respective + /// `IDisputeGame` implementations. mapping(GameType => IDisputeGame) public gameImpls; - /// @inheritdoc IDisputeGameFactory + /// @notice Returns the required bonds for initializing a dispute game of the given type. mapping(GameType => uint256) public initBonds; /// @notice Mapping of a hash of `gameType || rootClaim || extraData` to the deployed `IDisputeGame` clone (where @@ -50,12 +79,21 @@ contract DisputeGameFactory is OwnableUpgradeable, IDisputeGameFactory, ISemver _transferOwnership(_owner); } - /// @inheritdoc IDisputeGameFactory + /// @notice The total number of dispute games created by this factory. + /// @return gameCount_ The total number of dispute games created by this factory. function gameCount() external view returns (uint256 gameCount_) { gameCount_ = _disputeGameList.length; } - /// @inheritdoc IDisputeGameFactory + /// @notice `games` queries an internal mapping that maps the hash of + /// `gameType ++ rootClaim ++ extraData` to the deployed `DisputeGame` clone. + /// @dev `++` equates to concatenation. + /// @param _gameType The type of the DisputeGame - used to decide the proxy implementation + /// @param _rootClaim The root claim of the DisputeGame. + /// @param _extraData Any extra data that should be provided to the created dispute game. + /// @return proxy_ The clone of the `DisputeGame` created with the given parameters. + /// Returns `address(0)` if nonexistent. + /// @return timestamp_ The timestamp of the creation of the dispute game. function games( GameType _gameType, Claim _rootClaim, @@ -70,7 +108,13 @@ contract DisputeGameFactory is OwnableUpgradeable, IDisputeGameFactory, ISemver (proxy_, timestamp_) = (IDisputeGame(proxy), timestamp); } - /// @inheritdoc IDisputeGameFactory + /// @notice `gameAtIndex` returns the dispute game contract address and its creation timestamp + /// at the given index. Each created dispute game increments the underlying index. + /// @param _index The index of the dispute game. + /// @return gameType_ The type of the DisputeGame - used to decide the proxy implementation. + /// @return timestamp_ The timestamp of the creation of the dispute game. + /// @return proxy_ The clone of the `DisputeGame` created with the given parameters. + /// Returns `address(0)` if nonexistent. function gameAtIndex(uint256 _index) external view @@ -80,7 +124,11 @@ contract DisputeGameFactory is OwnableUpgradeable, IDisputeGameFactory, ISemver (gameType_, timestamp_, proxy_) = (gameType, timestamp, IDisputeGame(proxy)); } - /// @inheritdoc IDisputeGameFactory + /// @notice Creates a new DisputeGame proxy contract. + /// @param _gameType The type of the DisputeGame - used to decide the proxy implementation. + /// @param _rootClaim The root claim of the DisputeGame. + /// @param _extraData Any extra data that should be provided to the created dispute game. + /// @return proxy_ The address of the created DisputeGame proxy. function create( GameType _gameType, Claim _rootClaim, @@ -131,7 +179,13 @@ contract DisputeGameFactory is OwnableUpgradeable, IDisputeGameFactory, ISemver emit DisputeGameCreated(address(proxy_), _gameType, _rootClaim); } - /// @inheritdoc IDisputeGameFactory + /// @notice Returns a unique identifier for the given dispute game parameters. + /// @dev Hashes the concatenation of `gameType . rootClaim . extraData` + /// without expanding memory. + /// @param _gameType The type of the DisputeGame. + /// @param _rootClaim The root claim of the DisputeGame. + /// @param _extraData Any extra data that should be provided to the created dispute game. + /// @return uuid_ The unique identifier for the given dispute game parameters. function getGameUUID( GameType _gameType, Claim _rootClaim, @@ -144,7 +198,11 @@ contract DisputeGameFactory is OwnableUpgradeable, IDisputeGameFactory, ISemver uuid_ = Hash.wrap(keccak256(abi.encode(_gameType, _rootClaim, _extraData))); } - /// @inheritdoc IDisputeGameFactory + /// @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`. + /// @param _gameType The type of game to find. + /// @param _start The index to start the reverse search from. + /// @param _n The number of games to find. function findLatestGames( GameType _gameType, uint256 _start, @@ -195,13 +253,19 @@ contract DisputeGameFactory is OwnableUpgradeable, IDisputeGameFactory, ISemver } } - /// @inheritdoc IDisputeGameFactory + /// @notice Sets the implementation contract for a specific `GameType`. + /// @dev May only be called by the `owner`. + /// @param _gameType The type of the DisputeGame. + /// @param _impl The implementation contract for the given `GameType`. function setImplementation(GameType _gameType, IDisputeGame _impl) external onlyOwner { gameImpls[_gameType] = _impl; emit ImplementationSet(address(_impl), _gameType); } - /// @inheritdoc IDisputeGameFactory + /// @notice Sets the bond (in wei) for initializing a game type. + /// @dev May only be called by the `owner`. + /// @param _gameType The type of the DisputeGame. + /// @param _initBond The bond (in wei) for initializing a game type. function setInitBond(GameType _gameType, uint256 _initBond) external onlyOwner { initBonds[_gameType] = _initBond; emit InitBondUpdated(_gameType, _initBond); diff --git a/packages/contracts-bedrock/src/dispute/FaultDisputeGame.sol b/packages/contracts-bedrock/src/dispute/FaultDisputeGame.sol index ab559147ed17..a11cdd9be0c8 100644 --- a/packages/contracts-bedrock/src/dispute/FaultDisputeGame.sol +++ b/packages/contracts-bedrock/src/dispute/FaultDisputeGame.sol @@ -1,28 +1,63 @@ // SPDX-License-Identifier: MIT pragma solidity 0.8.15; +// Libraries +import { Math } from "@openzeppelin/contracts/utils/math/Math.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 "@solady/utils/Clone.sol"; -import { Types } from "src/libraries/Types.sol"; -import { ISemver } from "src/universal/ISemver.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"; +// Interfaces +import { ISemver } from "src/universal/interfaces/ISemver.sol"; +import { IDelayedWETH } from "src/dispute/interfaces/IDelayedWETH.sol"; +import { IDisputeGame } from "src/dispute/interfaces/IDisputeGame.sol"; +import { IBigStepper, IPreimageOracle } from "src/dispute/interfaces/IBigStepper.sol"; +import { IAnchorStateRegistry } from "src/dispute/interfaces/IAnchorStateRegistry.sol"; + /// @title FaultDisputeGame /// @notice An implementation of the `IFaultDisputeGame` interface. -contract FaultDisputeGame is IFaultDisputeGame, Clone, ISemver { +contract FaultDisputeGame is Clone, ISemver { + //////////////////////////////////////////////////////////////// + // Structs // + //////////////////////////////////////////////////////////////// + + /// @notice The `ClaimData` struct represents the data associated with a Claim. + struct ClaimData { + uint32 parentIndex; + address counteredBy; + address claimant; + uint128 bond; + Claim claim; + Position position; + 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; + } + + //////////////////////////////////////////////////////////////// + // Events // + //////////////////////////////////////////////////////////////// + + /// @notice Emitted when the game is resolved. + /// @param status The status of the game after resolution. + event Resolved(GameStatus indexed status); + + /// @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 + /// @param claimant The address of the claimant + event Move(uint256 indexed parentIndex, Claim indexed claim, address indexed claimant); + //////////////////////////////////////////////////////////////// // State Vars // //////////////////////////////////////////////////////////////// @@ -69,8 +104,8 @@ contract FaultDisputeGame is IFaultDisputeGame, Clone, ISemver { uint256 internal constant HEADER_BLOCK_NUMBER_INDEX = 8; /// @notice Semantic version. - /// @custom:semver 1.2.0 - string public constant version = "1.2.0"; + /// @custom:semver 1.3.1-beta.3 + string public constant version = "1.3.1-beta.3"; /// @notice The starting timestamp of the game Timestamp public createdAt; @@ -78,7 +113,7 @@ contract FaultDisputeGame is IFaultDisputeGame, Clone, ISemver { /// @notice The timestamp of the game's global resolution. Timestamp public resolvedAt; - /// @inheritdoc IDisputeGame + /// @notice Returns the current status of the game. GameStatus public status; /// @notice Flag for the `initialize` function to prevent re-initialization. @@ -136,11 +171,35 @@ contract FaultDisputeGame is IFaultDisputeGame, Clone, ISemver { ) { // 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(); + // The split depth plus one cannot be greater than or equal to the max game depth. We add + // an additional depth to the split depth to avoid a bug in trace ancestor lookup. We know + // that the case where the split depth is the max value for uint256 is equivalent to the + // second check though we do need to check it explicitly to avoid an overflow. + if (_splitDepth == type(uint256).max || _splitDepth + 1 >= _maxGameDepth) revert InvalidSplitDepth(); + + // The split depth cannot be 0 or 1 to stay in bounds of clock extension arithmetic. + if (_splitDepth < 2) revert InvalidSplitDepth(); + + // The PreimageOracle challenge period must fit into uint64 so we can safely use it here. + // Runtime check was added instead of changing the ABI since the contract is already + // deployed in production. We perform the same check within the PreimageOracle for the + // benefit of developers but also perform this check here defensively. + if (_vm.oracle().challengePeriod() > type(uint64).max) revert InvalidChallengePeriod(); + + // Determine the maximum clock extension which is either the split depth extension or the + // maximum game depth extension depending on the configuration of these contracts. + uint256 splitDepthExtension = uint256(_clockExtension.raw()) * 2; + uint256 maxGameDepthExtension = uint256(_clockExtension.raw()) + uint256(_vm.oracle().challengePeriod()); + uint256 maxClockExtension = Math.max(splitDepthExtension, maxGameDepthExtension); + + // The maximum clock extension must fit into a uint64. + if (maxClockExtension > type(uint64).max) revert InvalidClockExtension(); + + // The maximum clock extension may not be greater than the maximum clock duration. + if (uint64(maxClockExtension) > _maxClockDuration.raw()) revert InvalidClockExtension(); + + // Set up initial game state. GAME_TYPE = _gameType; ABSOLUTE_PRESTATE = _absolutePrestate; MAX_GAME_DEPTH = _maxGameDepth; @@ -153,7 +212,8 @@ contract FaultDisputeGame is IFaultDisputeGame, Clone, ISemver { L2_CHAIN_ID = _l2ChainId; } - /// @inheritdoc IInitializable + /// @notice Initializes the contract. + /// @dev This function may only be called once. function initialize() public payable virtual { // SAFETY: Any revert in this function will bubble up to the DisputeGameFactory and // prevent the game from being created. @@ -230,7 +290,17 @@ contract FaultDisputeGame is IFaultDisputeGame, Clone, ISemver { // `IFaultDisputeGame` impl // //////////////////////////////////////////////////////////////// - /// @inheritdoc IFaultDisputeGame + /// @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 + /// a step in the fault proof program on-chain. The interface of the fault proof + /// processor contract should adhere to the `IBigStepper` interface. + /// @param _claimIndex The index of the challenged claim within `claimData`. + /// @param _isAttack Whether or not the step is an attack or a defense. + /// @param _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. + /// @param _proof Proof to access memory nodes in the VM's merkle state tree. function step( uint256 _claimIndex, bool _isAttack, @@ -368,17 +438,29 @@ contract FaultDisputeGame is IFaultDisputeGame, Clone, ISemver { // 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); + // Clock extension is a mechanism that automatically extends the clock for a potential + // grandchild claim when there would be less than the clock extension time left if a player + // is forced to inherit another team's clock when countering a freeloader claim. Exact + // amount of clock extension time depends exactly where we are within the game. + uint64 actualExtension; + if (nextPositionDepth == MAX_GAME_DEPTH - 1) { + // If the next position is `MAX_GAME_DEPTH - 1` then we're about to execute a step. Our + // clock extension must therefore account for the LPP challenge period in addition to + // the standard clock extension. + actualExtension = CLOCK_EXTENSION.raw() + uint64(VM.oracle().challengePeriod()); + } else if (nextPositionDepth == SPLIT_DEPTH - 1) { + // If the next position is `SPLIT_DEPTH - 1` then we're about to begin an execution + // trace bisection and we need to give extra time for the off-chain challenge agent to + // be able to generate the initial instruction trace on the native FPVM. + actualExtension = CLOCK_EXTENSION.raw() * 2; + } else { + // Otherwise, we just use the standard clock extension. + actualExtension = CLOCK_EXTENSION.raw(); + } + + // Check if we need to apply the clock extension. + if (nextDuration.raw() > MAX_CLOCK_DURATION.raw() - actualExtension) { + nextDuration = Duration.wrap(MAX_CLOCK_DURATION.raw() - actualExtension); } // Construct the next clock with the new duration and the current block timestamp. @@ -415,17 +497,28 @@ contract FaultDisputeGame is IFaultDisputeGame, Clone, ISemver { emit Move(_challengeIndex, _claim, msg.sender); } - /// @inheritdoc IFaultDisputeGame + /// @notice Attack a disagreed upon `Claim`. + /// @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(Claim _disputed, uint256 _parentIndex, Claim _claim) external payable { move(_disputed, _parentIndex, _claim, true); } - /// @inheritdoc IFaultDisputeGame + /// @notice Defend an agreed upon `Claim`. + /// @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(Claim _disputed, uint256 _parentIndex, Claim _claim) external payable { move(_disputed, _parentIndex, _claim, false); } - /// @inheritdoc IFaultDisputeGame + /// @notice Posts the requested local data to the VM's `PreimageOralce`. + /// @param _ident The local identifier of the data to post. + /// @param _execLeafIdx The index of the leaf claim in an execution subgame that requires the local data for a step. + /// @param _partOffset The offset of the data to post. 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(); @@ -452,6 +545,9 @@ contract FaultDisputeGame is IFaultDisputeGame, Clone, ISemver { // block number. uint256 l2Number = startingOutputRoot.l2BlockNumber + disputedPos.traceIndex(SPLIT_DEPTH) + 1; + // Choose the minimum between the `l2BlockNumber` claim and the bisected-to L2 block number. + l2Number = l2Number < l2BlockNumber() ? l2Number : l2BlockNumber(); + 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. @@ -461,7 +557,10 @@ contract FaultDisputeGame is IFaultDisputeGame, Clone, ISemver { } } - /// @inheritdoc IFaultDisputeGame + /// @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) public view returns (uint256 numRemainingChildren_) { ResolutionCheckpoint storage checkpoint = resolutionCheckpoints[_claimIndex]; uint256[] storage challengeIndices = subgames[_claimIndex]; @@ -470,17 +569,17 @@ contract FaultDisputeGame is IFaultDisputeGame, Clone, ISemver { numRemainingChildren_ = challengeIndicesLen - checkpoint.subgameIndex; } - /// @inheritdoc IFaultDisputeGame + /// @notice The l2BlockNumber of the disputed output root in the `L2OutputOracle`. function l2BlockNumber() public pure returns (uint256 l2BlockNumber_) { l2BlockNumber_ = _getArgUint256(0x54); } - /// @inheritdoc IFaultDisputeGame + /// @notice Only the starting block number of the game. function startingBlockNumber() external view returns (uint256 startingBlockNumber_) { startingBlockNumber_ = startingOutputRoot.l2BlockNumber; } - /// @inheritdoc IFaultDisputeGame + /// @notice Starting output root and block number of the game. function startingRootHash() external view returns (Hash startingRootHash_) { startingRootHash_ = startingOutputRoot.root; } @@ -537,7 +636,12 @@ contract FaultDisputeGame is IFaultDisputeGame, Clone, ISemver { // `IDisputeGame` impl // //////////////////////////////////////////////////////////////// - /// @inheritdoc IDisputeGame + /// @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. + /// @dev May only be called if the `status` is `IN_PROGRESS`. + /// @return status_ The status of the game after resolution. function resolve() external returns (GameStatus status_) { // INVARIANT: Resolution cannot occur unless the game is currently in progress. if (status != GameStatus.IN_PROGRESS) revert GameNotInProgress(); @@ -556,7 +660,17 @@ contract FaultDisputeGame is IFaultDisputeGame, Clone, ISemver { ANCHOR_STATE_REGISTRY.tryUpdateAnchorState(); } - /// @inheritdoc IFaultDisputeGame + /// @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. + /// @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 { // INVARIANT: Resolution cannot occur unless the game is currently in progress. if (status != GameStatus.IN_PROGRESS) revert GameNotInProgress(); @@ -658,34 +772,51 @@ contract FaultDisputeGame is IFaultDisputeGame, Clone, ISemver { } } - /// @inheritdoc IDisputeGame - function gameType() public view override returns (GameType gameType_) { + /// @notice Getter for the game type. + /// @dev The reference impl should be entirely different depending on the type (fault, validity) + /// i.e. The game type should indicate the security model. + /// @return gameType_ The type of proof system being used. + function gameType() public view returns (GameType gameType_) { gameType_ = GAME_TYPE; } - /// @inheritdoc IDisputeGame + /// @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() public pure returns (address creator_) { creator_ = _getArgAddress(0x00); } - /// @inheritdoc IDisputeGame + /// @notice Getter for the root claim. + /// @dev `clones-with-immutable-args` argument #2 + /// @return rootClaim_ The root claim of the DisputeGame. function rootClaim() public pure returns (Claim rootClaim_) { rootClaim_ = Claim.wrap(_getArgBytes32(0x14)); } - /// @inheritdoc IDisputeGame + /// @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() public pure returns (Hash l1Head_) { l1Head_ = Hash.wrap(_getArgBytes32(0x34)); } - /// @inheritdoc IDisputeGame + /// @notice Getter for the extra data. + /// @dev `clones-with-immutable-args` argument #4 + /// @return extraData_ Any extra data supplied to the dispute game contract by the creator. 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 + /// @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. + /// @return gameType_ The type of proof system being used. + /// @return rootClaim_ The root claim of the DisputeGame. + /// @return extraData_ Any extra data supplied to the dispute game contract by the creator. function gameData() external view returns (GameType gameType_, Claim rootClaim_, bytes memory extraData_) { gameType_ = gameType(); rootClaim_ = rootClaim(); diff --git a/packages/contracts-bedrock/src/dispute/PermissionedDisputeGame.sol b/packages/contracts-bedrock/src/dispute/PermissionedDisputeGame.sol index 8e6741552489..abd8a8896cc3 100644 --- a/packages/contracts-bedrock/src/dispute/PermissionedDisputeGame.sol +++ b/packages/contracts-bedrock/src/dispute/PermissionedDisputeGame.sol @@ -1,12 +1,18 @@ // SPDX-License-Identifier: MIT 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"; +// Contracts +import { FaultDisputeGame } from "src/dispute/FaultDisputeGame.sol"; + +// Libraries import "src/dispute/lib/Types.sol"; import "src/dispute/lib/Errors.sol"; +// Interfaces +import { IDelayedWETH } from "src/dispute/interfaces/IDelayedWETH.sol"; +import { IAnchorStateRegistry } from "src/dispute/interfaces/IAnchorStateRegistry.sol"; +import { IBigStepper } from "src/dispute/interfaces/IBigStepper.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. @@ -73,7 +79,7 @@ contract PermissionedDisputeGame is FaultDisputeGame { CHALLENGER = _challenger; } - /// @inheritdoc IFaultDisputeGame + /// @inheritdoc FaultDisputeGame function step( uint256 _claimIndex, bool _isAttack, @@ -106,7 +112,7 @@ contract PermissionedDisputeGame is FaultDisputeGame { super.move(_disputed, _challengeIndex, _claim, _isAttack); } - /// @inheritdoc IInitializable + /// @notice Initializes the contract. function initialize() public payable override { // The creator of the dispute game must be the proposer EOA. if (tx.origin != PROPOSER) revert BadAuth(); diff --git a/packages/contracts-bedrock/src/dispute/interfaces/IAnchorStateRegistry.sol b/packages/contracts-bedrock/src/dispute/interfaces/IAnchorStateRegistry.sol index 2294a76ef303..28c544c0d408 100644 --- a/packages/contracts-bedrock/src/dispute/interfaces/IAnchorStateRegistry.sol +++ b/packages/contracts-bedrock/src/dispute/interfaces/IAnchorStateRegistry.sol @@ -1,24 +1,34 @@ // SPDX-License-Identifier: MIT pragma solidity ^0.8.0; +import { IFaultDisputeGame } from "src/dispute/interfaces/IFaultDisputeGame.sol"; import { IDisputeGameFactory } from "src/dispute/interfaces/IDisputeGameFactory.sol"; - +import { ISuperchainConfig } from "src/L1/interfaces/ISuperchainConfig.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); + struct StartingAnchorRoot { + GameType gameType; + OutputRoot outputRoot; + } - /// @notice Returns the DisputeGameFactory address. - /// @return DisputeGameFactory address. - function disputeGameFactory() external view returns (IDisputeGameFactory); + error InvalidGameStatus(); + error Unauthorized(); + error UnregisteredGame(); + + event Initialized(uint8 version); - /// @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 anchors(GameType) external view returns (Hash root, uint256 l2BlockNumber); + function disputeGameFactory() external view returns (IDisputeGameFactory); + function initialize( + StartingAnchorRoot[] memory _startingAnchorRoots, + ISuperchainConfig _superchainConfig + ) + external; + function setAnchorState(IFaultDisputeGame _game) external; + function superchainConfig() external view returns (ISuperchainConfig); function tryUpdateAnchorState() external; + function version() external view returns (string memory); + + function __constructor__(IDisputeGameFactory _disputeGameFactory) external; } diff --git a/packages/contracts-bedrock/src/dispute/interfaces/IDelayedWETH.sol b/packages/contracts-bedrock/src/dispute/interfaces/IDelayedWETH.sol index 80b90c69b860..7a7b36052f3d 100644 --- a/packages/contracts-bedrock/src/dispute/interfaces/IDelayedWETH.sol +++ b/packages/contracts-bedrock/src/dispute/interfaces/IDelayedWETH.sol @@ -1,48 +1,30 @@ // SPDX-License-Identifier: MIT pragma solidity ^0.8.0; -import { IWETH } from "src/dispute/interfaces/IWETH.sol"; +import { IWETH } from "src/universal/interfaces/IWETH.sol"; +import { ISuperchainConfig } from "src/L1/interfaces/ISuperchainConfig.sol"; -/// @title IDelayedWETH -/// @notice Interface for the DelayedWETH contract. interface IDelayedWETH is IWETH { - /// @notice Represents a withdrawal request. struct WithdrawalRequest { uint256 amount; uint256 timestamp; } - /// @notice Emitted when an unwrap is started. - /// @param src The address that started the unwrap. - /// @param wad The amount of WETH that was unwrapped. event Unwrap(address indexed src, uint256 wad); - /// @notice Returns the withdrawal delay in seconds. - /// @return The withdrawal delay in seconds. - function delay() external view returns (uint256); - - /// @notice Returns a withdrawal request for the given address. - /// @param _owner The address to query the withdrawal request of. - /// @param _guy Sub-account to query the withdrawal request of. - /// @return The withdrawal request for the given address-subaccount pair. - function withdrawals(address _owner, address _guy) external view returns (uint256, uint256); + fallback() external payable; + receive() external payable; - /// @notice Unlocks withdrawals for the sender's account, after a time delay. - /// @param _guy Sub-account to unlock. - /// @param _wad The amount of WETH to unlock. + function config() external view returns (ISuperchainConfig); + function delay() external view returns (uint256); + function hold(address _guy, uint256 _wad) external; + function initialize(address _owner, ISuperchainConfig _config) external; + function owner() external view returns (address); + function recover(uint256 _wad) external; + function transferOwnership(address newOwner) external; + function renounceOwnership() external; function unlock(address _guy, uint256 _wad) external; - - /// @notice Extension to withdrawal, must provide a sub-account to withdraw from. - /// @param _guy Sub-account to withdraw from. - /// @param _wad The amount of WETH to withdraw. function withdraw(address _guy, uint256 _wad) external; - - /// @notice Allows the owner to recover from error cases by pulling ETH out of the contract. - /// @param _wad The amount of WETH to recover. - function recover(uint256 _wad) external; - - /// @notice Allows the owner to recover from error cases by pulling ETH from a specific owner. - /// @param _guy The address to recover the WETH from. - /// @param _wad The amount of WETH to recover. - function hold(address _guy, uint256 _wad) external; + function withdrawals(address _owner, address _guy) external view returns (uint256, uint256); + function version() external view returns (string memory); } diff --git a/packages/contracts-bedrock/src/dispute/interfaces/IDisputeGame.sol b/packages/contracts-bedrock/src/dispute/interfaces/IDisputeGame.sol index 7e9389b4ddaf..f5a650202d0c 100644 --- a/packages/contracts-bedrock/src/dispute/interfaces/IDisputeGame.sol +++ b/packages/contracts-bedrock/src/dispute/interfaces/IDisputeGame.sol @@ -2,68 +2,19 @@ pragma solidity ^0.8.0; import { IInitializable } from "src/dispute/interfaces/IInitializable.sol"; - import "src/dispute/lib/Types.sol"; -/// @title IDisputeGame -/// @notice The generic interface for a DisputeGame contract. interface IDisputeGame is IInitializable { - /// @notice Emitted when the game is resolved. - /// @param status The status of the game after resolution. event Resolved(GameStatus indexed status); - /// @notice Returns the timestamp that the DisputeGame contract was created at. - /// @return createdAt_ The timestamp that the DisputeGame contract was created at. - function createdAt() external view returns (Timestamp createdAt_); - - /// @notice Returns the timestamp that the DisputeGame contract was resolved at. - /// @return resolvedAt_ The timestamp that the DisputeGame contract was resolved at. - function resolvedAt() external view returns (Timestamp resolvedAt_); - - /// @notice Returns the current status of the game. - /// @return status_ The current status of the game. - function status() external view returns (GameStatus status_); - - /// @notice Getter for the game type. - /// @dev The reference impl should be entirely different depending on the type (fault, validity) - /// i.e. The game type should indicate the security model. - /// @return gameType_ The type of proof system being used. + function createdAt() external view returns (Timestamp); + function resolvedAt() external view returns (Timestamp); + function status() external view returns (GameStatus); function gameType() external view returns (GameType gameType_); - - /// @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 #4 - /// @return extraData_ Any extra data supplied to the dispute game contract by the creator. function extraData() external pure returns (bytes memory extraData_); - - /// @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. - /// @dev May only be called if the `status` is `IN_PROGRESS`. - /// @return status_ The status of the game after resolution. function resolve() external returns (GameStatus status_); - - /// @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. - /// @return gameType_ The type of proof system being used. - /// @return rootClaim_ The root claim of the DisputeGame. - /// @return extraData_ Any extra data supplied to the dispute game contract by the creator. function gameData() external view returns (GameType gameType_, Claim rootClaim_, bytes memory extraData_); } diff --git a/packages/contracts-bedrock/src/dispute/interfaces/IDisputeGameFactory.sol b/packages/contracts-bedrock/src/dispute/interfaces/IDisputeGameFactory.sol index 5021de04d62a..1e70cbbb05bf 100644 --- a/packages/contracts-bedrock/src/dispute/interfaces/IDisputeGameFactory.sol +++ b/packages/contracts-bedrock/src/dispute/interfaces/IDisputeGameFactory.sol @@ -1,30 +1,10 @@ // SPDX-License-Identifier: MIT pragma solidity ^0.8.0; -import { IDisputeGame } from "./IDisputeGame.sol"; - +import { IDisputeGame } from "src/dispute/interfaces/IDisputeGame.sol"; import "src/dispute/lib/Types.sol"; -/// @title IDisputeGameFactory -/// @notice The interface for a DisputeGameFactory contract. interface IDisputeGameFactory { - /// @notice Emitted when a new dispute game is created - /// @param disputeProxy The address of the dispute game proxy - /// @param gameType The type of the dispute game proxy's implementation - /// @param rootClaim The root claim of the dispute game - event DisputeGameCreated(address indexed disputeProxy, GameType indexed gameType, Claim indexed rootClaim); - - /// @notice Emitted when a new game implementation added to the factory - /// @param impl The implementation contract for the given `GameType`. - /// @param gameType The type of the DisputeGame. - event ImplementationSet(address indexed impl, GameType indexed gameType); - - /// @notice Emitted when a game type's initialization bond is updated - /// @param gameType The type of the DisputeGame. - /// @param newBond The new bond (in wei) for initializing the game type. - event InitBondUpdated(GameType indexed gameType, uint256 indexed newBond); - - /// @notice Information about a dispute game found in a `findLatestGames` search. struct GameSearchResult { uint256 index; GameId metadata; @@ -33,85 +13,46 @@ interface IDisputeGameFactory { bytes extraData; } - /// @notice The total number of dispute games created by this factory. - /// @return gameCount_ The total number of dispute games created by this factory. - function gameCount() external view returns (uint256 gameCount_); + error GameAlreadyExists(Hash uuid); + error IncorrectBondAmount(); + error NoImplementation(GameType gameType); - /// @notice `games` queries an internal mapping that maps the hash of - /// `gameType ++ rootClaim ++ extraData` to the deployed `DisputeGame` clone. - /// @dev `++` equates to concatenation. - /// @param _gameType The type of the DisputeGame - used to decide the proxy implementation - /// @param _rootClaim The root claim of the DisputeGame. - /// @param _extraData Any extra data that should be provided to the created dispute game. - /// @return proxy_ The clone of the `DisputeGame` created with the given parameters. - /// Returns `address(0)` if nonexistent. - /// @return timestamp_ The timestamp of the creation of the dispute game. - function games( + event DisputeGameCreated(address indexed disputeProxy, GameType indexed gameType, Claim indexed rootClaim); + event ImplementationSet(address indexed impl, GameType indexed gameType); + event InitBondUpdated(GameType indexed gameType, uint256 indexed newBond); + event Initialized(uint8 version); + event OwnershipTransferred(address indexed previousOwner, address indexed newOwner); + + function create( GameType _gameType, Claim _rootClaim, - bytes calldata _extraData + bytes memory _extraData + ) + external + payable + returns (IDisputeGame proxy_); + function findLatestGames( + GameType _gameType, + uint256 _start, + uint256 _n ) external view - returns (IDisputeGame proxy_, Timestamp timestamp_); - - /// @notice `gameAtIndex` returns the dispute game contract address and its creation timestamp - /// at the given index. Each created dispute game increments the underlying index. - /// @param _index The index of the dispute game. - /// @return gameType_ The type of the DisputeGame - used to decide the proxy implementation. - /// @return timestamp_ The timestamp of the creation of the dispute game. - /// @return proxy_ The clone of the `DisputeGame` created with the given parameters. - /// Returns `address(0)` if nonexistent. + returns (GameSearchResult[] memory games_); function gameAtIndex(uint256 _index) external view returns (GameType gameType_, Timestamp timestamp_, IDisputeGame proxy_); - - /// @notice `gameImpls` is a mapping that maps `GameType`s to their respective - /// `IDisputeGame` implementations. - /// @param _gameType The type of the dispute game. - /// @return impl_ The address of the implementation of the game type. - /// Will be cloned on creation of a new dispute game with the given `gameType`. - function gameImpls(GameType _gameType) external view returns (IDisputeGame impl_); - - /// @notice Returns the required bonds for initializing a dispute game of the given type. - /// @param _gameType The type of the dispute game. - /// @return bond_ The required bond for initializing a dispute game of the given type. - function initBonds(GameType _gameType) external view returns (uint256 bond_); - - /// @notice Creates a new DisputeGame proxy contract. - /// @param _gameType The type of the DisputeGame - used to decide the proxy implementation. - /// @param _rootClaim The root claim of the DisputeGame. - /// @param _extraData Any extra data that should be provided to the created dispute game. - /// @return proxy_ The address of the created DisputeGame proxy. - function create( + function gameCount() external view returns (uint256 gameCount_); + function gameImpls(GameType) external view returns (IDisputeGame); + function games( GameType _gameType, Claim _rootClaim, - bytes calldata _extraData + bytes memory _extraData ) external - payable - returns (IDisputeGame proxy_); - - /// @notice Sets the implementation contract for a specific `GameType`. - /// @dev May only be called by the `owner`. - /// @param _gameType The type of the DisputeGame. - /// @param _impl The implementation contract for the given `GameType`. - function setImplementation(GameType _gameType, IDisputeGame _impl) external; - - /// @notice Sets the bond (in wei) for initializing a game type. - /// @dev May only be called by the `owner`. - /// @param _gameType The type of the DisputeGame. - /// @param _initBond The bond (in wei) for initializing a game type. - function setInitBond(GameType _gameType, uint256 _initBond) external; - - /// @notice Returns a unique identifier for the given dispute game parameters. - /// @dev Hashes the concatenation of `gameType . rootClaim . extraData` - /// without expanding memory. - /// @param _gameType The type of the DisputeGame. - /// @param _rootClaim The root claim of the DisputeGame. - /// @param _extraData Any extra data that should be provided to the created dispute game. - /// @return uuid_ The unique identifier for the given dispute game parameters. + view + returns (IDisputeGame proxy_, Timestamp timestamp_); function getGameUUID( GameType _gameType, Claim _rootClaim, @@ -120,18 +61,14 @@ interface IDisputeGameFactory { external pure returns (Hash uuid_); + function initBonds(GameType) external view returns (uint256); + function initialize(address _owner) external; + function owner() external view returns (address); + function renounceOwnership() external; + function setImplementation(GameType _gameType, IDisputeGame _impl) external; + function setInitBond(GameType _gameType, uint256 _initBond) external; + function transferOwnership(address newOwner) external; + function version() external view returns (string memory); - /// @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`. - /// @param _gameType The type of game to find. - /// @param _start The index to start the reverse search from. - /// @param _n The number of games to find. - function findLatestGames( - GameType _gameType, - uint256 _start, - uint256 _n - ) - external - view - returns (GameSearchResult[] memory games_); + function __constructor__() external; } diff --git a/packages/contracts-bedrock/src/dispute/interfaces/IFaultDisputeGame.sol b/packages/contracts-bedrock/src/dispute/interfaces/IFaultDisputeGame.sol index 43de378ac06d..379c4fcb6a48 100644 --- a/packages/contracts-bedrock/src/dispute/interfaces/IFaultDisputeGame.sol +++ b/packages/contracts-bedrock/src/dispute/interfaces/IFaultDisputeGame.sol @@ -1,14 +1,14 @@ // SPDX-License-Identifier: MIT pragma solidity ^0.8.0; -import { IDisputeGame } from "./IDisputeGame.sol"; - +import { IDisputeGame } from "src/dispute/interfaces/IDisputeGame.sol"; +import { IDelayedWETH } from "src/dispute/interfaces/IDelayedWETH.sol"; +import { IAnchorStateRegistry } from "src/dispute/interfaces/IAnchorStateRegistry.sol"; +import { IBigStepper } from "src/dispute/interfaces/IBigStepper.sol"; +import { Types } from "src/libraries/Types.sol"; import "src/dispute/lib/Types.sol"; -/// @title IFaultDisputeGame -/// @notice The interface for a fault proof backed dispute game. interface IFaultDisputeGame is IDisputeGame { - /// @notice The `ClaimData` struct represents the data associated with a Claim. struct ClaimData { uint32 parentIndex; address counteredBy; @@ -19,7 +19,6 @@ 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; @@ -27,73 +26,104 @@ interface IFaultDisputeGame is IDisputeGame { 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 - /// @param claimant The address of the claimant + error AlreadyInitialized(); + error AnchorRootNotFound(); + error BlockNumberMatches(); + error BondTransferFailed(); + error CannotDefendRootClaim(); + error ClaimAboveSplit(); + error ClaimAlreadyExists(); + error ClaimAlreadyResolved(); + error ClockNotExpired(); + error ClockTimeExceeded(); + error ContentLengthMismatch(); + error DuplicateStep(); + error EmptyItem(); + error GameDepthExceeded(); + error GameNotInProgress(); + error IncorrectBondAmount(); + error InvalidChallengePeriod(); + error InvalidClockExtension(); + error InvalidDataRemainder(); + error InvalidDisputedClaimIndex(); + error InvalidHeader(); + error InvalidHeaderRLP(); + error InvalidLocalIdent(); + error InvalidOutputRootProof(); + error InvalidParent(); + error InvalidPrestate(); + error InvalidSplitDepth(); + error L2BlockNumberChallenged(); + error MaxDepthTooLarge(); + error NoCreditToClaim(); + error OutOfOrderResolution(); + error UnexpectedList(); + error UnexpectedRootClaim(Claim rootClaim); + error UnexpectedString(); + error ValidStep(); + event Move(uint256 indexed parentIndex, Claim indexed claim, address indexed claimant); - /// @notice Attack a disagreed upon `Claim`. - /// @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 absolutePrestate() external view returns (Claim absolutePrestate_); + function addLocalData(uint256 _ident, uint256 _execLeafIdx, uint256 _partOffset) external; + function anchorStateRegistry() external view returns (IAnchorStateRegistry registry_); function attack(Claim _disputed, uint256 _parentIndex, Claim _claim) external payable; - - /// @notice Defend an agreed upon `Claim`. - /// @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 challengeRootL2Block(Types.OutputRootProof memory _outputRootProof, bytes memory _headerRLP) external; + function claimCredit(address _recipient) external; + function claimData(uint256) + external + view + returns ( + uint32 parentIndex, + address counteredBy, + address claimant, + uint128 bond, + Claim claim, + Position position, + Clock clock + ); + function claimDataLen() external view returns (uint256 len_); + function claims(Hash) external view returns (bool); + function clockExtension() external view returns (Duration clockExtension_); + function credit(address) external view returns (uint256); 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 - /// a step in the fault proof program on-chain. The interface of the fault proof - /// processor contract should adhere to the `IBigStepper` interface. - /// @param _claimIndex The index of the challenged claim within `claimData`. - /// @param _isAttack Whether or not the step is an attack or a defense. - /// @param _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. - /// @param _proof Proof to access memory nodes in the VM's merkle state tree. - function step(uint256 _claimIndex, bool _isAttack, bytes calldata _stateData, bytes calldata _proof) external; - - /// @notice Posts the requested local data to the VM's `PreimageOralce`. - /// @param _ident The local identifier of the data to post. - /// @param _execLeafIdx The index of the leaf claim in an execution subgame that requires the local data for a step. - /// @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. `_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. - /// @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 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 getChallengerDuration(uint256 _claimIndex) external view returns (Duration duration_); 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 getRequiredBond(Position _position) external view returns (uint256 requiredBond_); + function l2BlockNumber() external pure returns (uint256 l2BlockNumber_); + function l2BlockNumberChallenged() external view returns (bool); + function l2BlockNumberChallenger() external view returns (address); + function l2ChainId() external view returns (uint256 l2ChainId_); + function maxClockDuration() external view returns (Duration maxClockDuration_); + function maxGameDepth() external view returns (uint256 maxGameDepth_); + function move(Claim _disputed, uint256 _challengeIndex, Claim _claim, bool _isAttack) external payable; + function resolutionCheckpoints(uint256) + external + view + returns (bool initialCheckpointComplete, uint32 subgameIndex, Position leftmostPosition, address counteredBy); + function resolveClaim(uint256 _claimIndex, uint256 _numToResolve) external; + function resolvedSubgames(uint256) external view returns (bool); + function splitDepth() external view returns (uint256 splitDepth_); function startingBlockNumber() external view returns (uint256 startingBlockNumber_); - - /// @notice Only the starting output root of the game. + function startingOutputRoot() external view returns (Hash root, uint256 l2BlockNumber); function startingRootHash() external view returns (Hash startingRootHash_); + function step(uint256 _claimIndex, bool _isAttack, bytes memory _stateData, bytes memory _proof) external; + function subgames(uint256, uint256) external view returns (uint256); + function version() external view returns (string memory); + function vm() external view returns (IBigStepper vm_); + function weth() external view returns (IDelayedWETH weth_); + + function __constructor__( + GameType _gameType, + Claim _absolutePrestate, + uint256 _maxGameDepth, + uint256 _splitDepth, + Duration _clockExtension, + Duration _maxClockDuration, + IBigStepper _vm, + IDelayedWETH _weth, + IAnchorStateRegistry _anchorStateRegistry, + uint256 _l2ChainId + ) + external; } diff --git a/packages/contracts-bedrock/src/dispute/interfaces/IInitializable.sol b/packages/contracts-bedrock/src/dispute/interfaces/IInitializable.sol index 5968b45f9bfb..a3bb74b82f3a 100644 --- a/packages/contracts-bedrock/src/dispute/interfaces/IInitializable.sol +++ b/packages/contracts-bedrock/src/dispute/interfaces/IInitializable.sol @@ -1,10 +1,6 @@ // SPDX-License-Identifier: MIT pragma solidity ^0.8.0; -/// @title IInitializable -/// @notice An interface for initializable contracts. interface IInitializable { - /// @notice Initializes the contract. - /// @dev This function may only be called once. function initialize() external payable; } diff --git a/packages/contracts-bedrock/src/dispute/interfaces/IPermissionedDisputeGame.sol b/packages/contracts-bedrock/src/dispute/interfaces/IPermissionedDisputeGame.sol new file mode 100644 index 000000000000..5fda4e9163b2 --- /dev/null +++ b/packages/contracts-bedrock/src/dispute/interfaces/IPermissionedDisputeGame.sol @@ -0,0 +1,137 @@ +// SPDX-License-Identifier: MIT +pragma solidity ^0.8.0; + +import { Types } from "src/libraries/Types.sol"; +import "src/dispute/lib/Types.sol"; + +import { IAnchorStateRegistry } from "src/dispute/interfaces/IAnchorStateRegistry.sol"; +import { IDelayedWETH } from "src/dispute/interfaces/IDelayedWETH.sol"; +import { IBigStepper } from "src/dispute/interfaces/IBigStepper.sol"; +import { IDisputeGame } from "src/dispute/interfaces/IDisputeGame.sol"; + +interface IPermissionedDisputeGame is IDisputeGame { + struct ClaimData { + uint32 parentIndex; + address counteredBy; + address claimant; + uint128 bond; + Claim claim; + Position position; + Clock clock; + } + + struct ResolutionCheckpoint { + bool initialCheckpointComplete; + uint32 subgameIndex; + Position leftmostPosition; + address counteredBy; + } + + error AlreadyInitialized(); + error AnchorRootNotFound(); + error BlockNumberMatches(); + error BondTransferFailed(); + error CannotDefendRootClaim(); + error ClaimAboveSplit(); + error ClaimAlreadyExists(); + error ClaimAlreadyResolved(); + error ClockNotExpired(); + error ClockTimeExceeded(); + error ContentLengthMismatch(); + error DuplicateStep(); + error EmptyItem(); + error GameDepthExceeded(); + error GameNotInProgress(); + error IncorrectBondAmount(); + error InvalidChallengePeriod(); + error InvalidClockExtension(); + error InvalidDataRemainder(); + error InvalidDisputedClaimIndex(); + error InvalidHeader(); + error InvalidHeaderRLP(); + error InvalidLocalIdent(); + error InvalidOutputRootProof(); + error InvalidParent(); + error InvalidPrestate(); + error InvalidSplitDepth(); + error L2BlockNumberChallenged(); + error MaxDepthTooLarge(); + error NoCreditToClaim(); + error OutOfOrderResolution(); + error UnexpectedList(); + error UnexpectedRootClaim(Claim rootClaim); + error UnexpectedString(); + error ValidStep(); + + event Move(uint256 indexed parentIndex, Claim indexed claim, address indexed claimant); + + function absolutePrestate() external view returns (Claim absolutePrestate_); + function addLocalData(uint256 _ident, uint256 _execLeafIdx, uint256 _partOffset) external; + function anchorStateRegistry() external view returns (IAnchorStateRegistry registry_); + function attack(Claim _disputed, uint256 _parentIndex, Claim _claim) external payable; + function challengeRootL2Block(Types.OutputRootProof memory _outputRootProof, bytes memory _headerRLP) external; + function claimCredit(address _recipient) external; + function claimData(uint256) + external + view + returns ( + uint32 parentIndex, + address counteredBy, + address claimant, + uint128 bond, + Claim claim, + Position position, + Clock clock + ); + function claimDataLen() external view returns (uint256 len_); + function claims(Hash) external view returns (bool); + function clockExtension() external view returns (Duration clockExtension_); + function credit(address) external view returns (uint256); + function defend(Claim _disputed, uint256 _parentIndex, Claim _claim) external payable; + function getChallengerDuration(uint256 _claimIndex) external view returns (Duration duration_); + function getNumToResolve(uint256 _claimIndex) external view returns (uint256 numRemainingChildren_); + function getRequiredBond(Position _position) external view returns (uint256 requiredBond_); + function l2BlockNumber() external pure returns (uint256 l2BlockNumber_); + function l2BlockNumberChallenged() external view returns (bool); + function l2BlockNumberChallenger() external view returns (address); + function l2ChainId() external view returns (uint256 l2ChainId_); + function maxClockDuration() external view returns (Duration maxClockDuration_); + function maxGameDepth() external view returns (uint256 maxGameDepth_); + function move(Claim _disputed, uint256 _challengeIndex, Claim _claim, bool _isAttack) external payable; + function resolutionCheckpoints(uint256) + external + view + returns (bool initialCheckpointComplete, uint32 subgameIndex, Position leftmostPosition, address counteredBy); + function resolveClaim(uint256 _claimIndex, uint256 _numToResolve) external; + function resolvedSubgames(uint256) external view returns (bool); + function splitDepth() external view returns (uint256 splitDepth_); + function startingBlockNumber() external view returns (uint256 startingBlockNumber_); + function startingOutputRoot() external view returns (Hash root, uint256 l2BlockNumber); + function startingRootHash() external view returns (Hash startingRootHash_); + function step(uint256 _claimIndex, bool _isAttack, bytes memory _stateData, bytes memory _proof) external; + function subgames(uint256, uint256) external view returns (uint256); + function version() external view returns (string memory); + function vm() external view returns (IBigStepper vm_); + function weth() external view returns (IDelayedWETH weth_); + + error BadAuth(); + + function proposer() external view returns (address proposer_); + function challenger() external view returns (address challenger_); + + function __constructor__( + GameType _gameType, + Claim _absolutePrestate, + uint256 _maxGameDepth, + uint256 _splitDepth, + Duration _clockExtension, + Duration _maxClockDuration, + IBigStepper _vm, + IDelayedWETH _weth, + IAnchorStateRegistry _anchorStateRegistry, + uint256 _l2ChainId, + address _proposer, + address _challenger + ) + external; +} diff --git a/packages/contracts-bedrock/src/dispute/lib/Errors.sol b/packages/contracts-bedrock/src/dispute/lib/Errors.sol index 9a3237b32d2c..6cd1d1d073f4 100644 --- a/packages/contracts-bedrock/src/dispute/lib/Errors.sol +++ b/packages/contracts-bedrock/src/dispute/lib/Errors.sol @@ -94,6 +94,9 @@ 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 PreimageOracle challenge period is too high. +error InvalidChallengePeriod(); + /// @notice Thrown on deployment if the max depth is greater than `LibPosition.` error MaxDepthTooLarge(); @@ -123,3 +126,13 @@ error L2BlockNumberChallenged(); /// @notice Thrown when an unauthorized address attempts to interact with the game. error BadAuth(); + +//////////////////////////////////////////////////////////////// +// `AnchorStateRegistry` Errors // +//////////////////////////////////////////////////////////////// + +/// @notice Thrown when attempting to set an anchor state using an unregistered game. +error UnregisteredGame(); + +/// @notice Thrown when attempting to set an anchor state using an invalid game result. +error InvalidGameStatus(); diff --git a/packages/contracts-bedrock/src/dispute/lib/Types.sol b/packages/contracts-bedrock/src/dispute/lib/Types.sol index a5866699d066..8d86e6e25387 100644 --- a/packages/contracts-bedrock/src/dispute/lib/Types.sol +++ b/packages/contracts-bedrock/src/dispute/lib/Types.sol @@ -33,6 +33,10 @@ library GameTypes { /// @notice A dispute game type the uses the asterisc VM GameType internal constant ASTERISC = GameType.wrap(2); + /// @notice A dispute game type with short game duration for testing withdrawals. + /// Not intended for production use. + GameType internal constant FAST = GameType.wrap(254); + /// @notice A dispute game type that uses an alphabet vm. /// Not intended for production use. GameType internal constant ALPHABET = GameType.wrap(255); diff --git a/packages/contracts-bedrock/src/dispute/weth/DelayedWETH.sol b/packages/contracts-bedrock/src/dispute/weth/DelayedWETH.sol deleted file mode 100644 index c8a3f8f03262..000000000000 --- a/packages/contracts-bedrock/src/dispute/weth/DelayedWETH.sol +++ /dev/null @@ -1,97 +0,0 @@ -// SPDX-License-Identifier: MIT -pragma solidity 0.8.15; - -import { OwnableUpgradeable } from "@openzeppelin/contracts-upgradeable/access/OwnableUpgradeable.sol"; -import { ISemver } from "src/universal/ISemver.sol"; - -import { IDelayedWETH } from "src/dispute/interfaces/IDelayedWETH.sol"; -import { IWETH } from "src/dispute/interfaces/IWETH.sol"; -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. -contract DelayedWETH is OwnableUpgradeable, WETH98, IDelayedWETH, ISemver { - /// @notice Semantic version. - /// @custom:semver 1.0.0 - string public constant version = "1.0.0"; - - /// @inheritdoc IDelayedWETH - mapping(address => mapping(address => WithdrawalRequest)) public withdrawals; - - /// @notice Withdrawal delay in seconds. - uint256 internal immutable DELAY_SECONDS; - - /// @notice Address of the SuperchainConfig contract. - SuperchainConfig public config; - - /// @param _delay The delay for withdrawals in seconds. - constructor(uint256 _delay) { - DELAY_SECONDS = _delay; - initialize({ _owner: address(0), _config: SuperchainConfig(address(0)) }); - } - - /// @notice Initializes the contract. - /// @param _owner The address of the owner. - /// @param _config Address of the SuperchainConfig contract. - function initialize(address _owner, SuperchainConfig _config) public initializer { - __Ownable_init(); - _transferOwnership(_owner); - config = _config; - } - - /// @inheritdoc IDelayedWETH - function delay() external view returns (uint256) { - return DELAY_SECONDS; - } - - /// @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. - WithdrawalRequest storage wd = withdrawals[msg.sender][_guy]; - wd.timestamp = block.timestamp; - wd.amount += _wad; - } - - /// @inheritdoc IWETH - function withdraw(uint256 _wad) public override(WETH98, IWETH) { - withdraw(msg.sender, _wad); - } - - /// @inheritdoc IDelayedWETH - function withdraw(address _guy, uint256 _wad) public { - require(!config.paused(), "DelayedWETH: contract is paused"); - WithdrawalRequest storage wd = withdrawals[msg.sender][_guy]; - require(wd.amount >= _wad, "DelayedWETH: insufficient unlocked withdrawal"); - require(wd.timestamp > 0, "DelayedWETH: withdrawal not unlocked"); - require(wd.timestamp + DELAY_SECONDS <= block.timestamp, "DelayedWETH: withdrawal delay not met"); - wd.amount -= _wad; - super.withdraw(_wad); - } - - /// @inheritdoc IDelayedWETH - function recover(uint256 _wad) external { - require(msg.sender == owner(), "DelayedWETH: not owner"); - 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[_guy][msg.sender] = _wad; - emit Approval(_guy, msg.sender, _wad); - } -} diff --git a/packages/contracts-bedrock/src/governance/MintManager.sol b/packages/contracts-bedrock/src/governance/MintManager.sol index d9feae71dfb3..57abeece6b62 100644 --- a/packages/contracts-bedrock/src/governance/MintManager.sol +++ b/packages/contracts-bedrock/src/governance/MintManager.sol @@ -1,8 +1,11 @@ // SPDX-License-Identifier: MIT pragma solidity 0.8.15; +// Contracts import "@openzeppelin/contracts/access/Ownable.sol"; -import "./GovernanceToken.sol"; + +// Interfaces +import { IGovernanceToken } from "src/governance/interfaces/IGovernanceToken.sol"; /// @title MintManager /// @notice Set as `owner` of the governance token and responsible for the token inflation @@ -11,7 +14,7 @@ import "./GovernanceToken.sol"; /// token supply. Upgradable to allow changes in the inflation schedule. contract MintManager is Ownable { /// @notice The GovernanceToken that the MintManager can mint tokens - GovernanceToken public immutable governanceToken; + IGovernanceToken public immutable governanceToken; /// @notice The amount of tokens that can be minted per year. /// The value is a fixed point number with 4 decimals. @@ -32,7 +35,7 @@ contract MintManager is Ownable { /// @param _governanceToken The governance token this contract can mint tokens of. constructor(address _upgrader, address _governanceToken) { transferOwnership(_upgrader); - governanceToken = GovernanceToken(_governanceToken); + governanceToken = IGovernanceToken(_governanceToken); } /// @notice Only the token owner is allowed to mint a certain amount of the diff --git a/packages/contracts-bedrock/src/governance/interfaces/IGovernanceToken.sol b/packages/contracts-bedrock/src/governance/interfaces/IGovernanceToken.sol new file mode 100644 index 000000000000..04a0490adc9b --- /dev/null +++ b/packages/contracts-bedrock/src/governance/interfaces/IGovernanceToken.sol @@ -0,0 +1,52 @@ +// SPDX-License-Identifier: MIT +pragma solidity ^0.8.0; + +import { ERC20Votes } from "@openzeppelin/contracts/token/ERC20/extensions/ERC20Votes.sol"; + +interface IGovernanceToken { + event Approval(address indexed owner, address indexed spender, uint256 value); + event DelegateChanged(address indexed delegator, address indexed fromDelegate, address indexed toDelegate); + event DelegateVotesChanged(address indexed delegate, uint256 previousBalance, uint256 newBalance); + event OwnershipTransferred(address indexed previousOwner, address indexed newOwner); + event Transfer(address indexed from, address indexed to, uint256 value); + + function DOMAIN_SEPARATOR() external view returns (bytes32); + function allowance(address owner, address spender) external view returns (uint256); + function approve(address spender, uint256 amount) external returns (bool); + function balanceOf(address account) external view returns (uint256); + function burn(uint256 amount) external; + function burnFrom(address account, uint256 amount) external; + function checkpoints(address account, uint32 pos) external view returns (ERC20Votes.Checkpoint memory); + function decimals() external view returns (uint8); + function decreaseAllowance(address spender, uint256 subtractedValue) external returns (bool); + function delegate(address delegatee) external; + function delegateBySig(address delegatee, uint256 nonce, uint256 expiry, uint8 v, bytes32 r, bytes32 s) external; + function delegates(address account) external view returns (address); + function getPastTotalSupply(uint256 blockNumber) external view returns (uint256); + function getPastVotes(address account, uint256 blockNumber) external view returns (uint256); + function getVotes(address account) external view returns (uint256); + function increaseAllowance(address spender, uint256 addedValue) external returns (bool); + function mint(address _account, uint256 _amount) external; + function name() external view returns (string memory); + function nonces(address owner) external view returns (uint256); + function numCheckpoints(address account) external view returns (uint32); + function owner() external view returns (address); + function permit( + address owner, + address spender, + uint256 value, + uint256 deadline, + uint8 v, + bytes32 r, + bytes32 s + ) + external; + function renounceOwnership() external; + function symbol() external view returns (string memory); + function totalSupply() external view returns (uint256); + function transfer(address to, uint256 amount) external returns (bool); + function transferFrom(address from, address to, uint256 amount) external returns (bool); + function transferOwnership(address newOwner) external; + + function __constructor__() external; +} diff --git a/packages/contracts-bedrock/src/governance/interfaces/IMintManager.sol b/packages/contracts-bedrock/src/governance/interfaces/IMintManager.sol new file mode 100644 index 000000000000..e769f3042e53 --- /dev/null +++ b/packages/contracts-bedrock/src/governance/interfaces/IMintManager.sol @@ -0,0 +1,21 @@ +// SPDX-License-Identifier: MIT +pragma solidity ^0.8.0; + +import { IGovernanceToken } from "src/governance/interfaces/IGovernanceToken.sol"; + +interface IMintManager { + event OwnershipTransferred(address indexed previousOwner, address indexed newOwner); + + function DENOMINATOR() external view returns (uint256); + function MINT_CAP() external view returns (uint256); + function MINT_PERIOD() external view returns (uint256); + function governanceToken() external view returns (IGovernanceToken); + function mint(address _account, uint256 _amount) external; + function mintPermittedAfter() external view returns (uint256); + function owner() external view returns (address); + function renounceOwnership() external; + function transferOwnership(address newOwner) external; + function upgrade(address _newMintManager) external; + + function __constructor__(address _upgrader, address _governanceToken) external; +} diff --git a/packages/contracts-bedrock/src/legacy/AddressManager.sol b/packages/contracts-bedrock/src/legacy/AddressManager.sol index 6029a1142c12..daaac412e0a0 100644 --- a/packages/contracts-bedrock/src/legacy/AddressManager.sol +++ b/packages/contracts-bedrock/src/legacy/AddressManager.sol @@ -3,7 +3,7 @@ pragma solidity 0.8.15; import { Ownable } from "@openzeppelin/contracts/access/Ownable.sol"; -/// @custom:legacy +/// @custom:legacy true /// @title AddressManager /// @notice AddressManager is a legacy contract that was used in the old version of the Optimism /// system to manage a registry of string names to addresses. We now use a more standard diff --git a/packages/contracts-bedrock/src/legacy/DeployerWhitelist.sol b/packages/contracts-bedrock/src/legacy/DeployerWhitelist.sol index 11585791655f..a7a6313edf4b 100644 --- a/packages/contracts-bedrock/src/legacy/DeployerWhitelist.sol +++ b/packages/contracts-bedrock/src/legacy/DeployerWhitelist.sol @@ -1,10 +1,10 @@ // SPDX-License-Identifier: MIT pragma solidity 0.8.15; -import { ISemver } from "src/universal/ISemver.sol"; +import { ISemver } from "src/universal/interfaces/ISemver.sol"; -/// @custom:legacy -/// @custom:proxied +/// @custom:legacy true +/// @custom:proxied true /// @custom:predeployed 0x4200000000000000000000000000000000000002 /// @title DeployerWhitelist /// @notice DeployerWhitelist is a legacy contract that was originally used to act as a whitelist of @@ -41,8 +41,8 @@ contract DeployerWhitelist is ISemver { } /// @notice Semantic version. - /// @custom:semver 1.1.0 - string public constant version = "1.1.0"; + /// @custom:semver 1.1.1-beta.1 + string public constant version = "1.1.1-beta.1"; /// @notice Adds or removes an address from the deployment whitelist. /// @param _deployer Address to update permissions for. diff --git a/packages/contracts-bedrock/src/legacy/L1BlockNumber.sol b/packages/contracts-bedrock/src/legacy/L1BlockNumber.sol index 8bd2e2a8f315..19a595a3fad3 100644 --- a/packages/contracts-bedrock/src/legacy/L1BlockNumber.sol +++ b/packages/contracts-bedrock/src/legacy/L1BlockNumber.sol @@ -1,12 +1,15 @@ // SPDX-License-Identifier: MIT pragma solidity 0.8.15; -import { L1Block } from "src/L2/L1Block.sol"; +// Libraries import { Predeploys } from "src/libraries/Predeploys.sol"; -import { ISemver } from "src/universal/ISemver.sol"; -/// @custom:legacy -/// @custom:proxied +// Interfaces +import { ISemver } from "src/universal/interfaces/ISemver.sol"; +import { IL1Block } from "src/L2/interfaces/IL1Block.sol"; + +/// @custom:legacy true +/// @custom:proxied true /// @custom:predeploy 0x4200000000000000000000000000000000000013 /// @title L1BlockNumber /// @notice L1BlockNumber is a legacy contract that fills the roll of the OVM_L1BlockNumber contract @@ -15,8 +18,8 @@ import { ISemver } from "src/universal/ISemver.sol"; /// contract instead. contract L1BlockNumber is ISemver { /// @notice Semantic version. - /// @custom:semver 1.1.0 - string public constant version = "1.1.0"; + /// @custom:semver 1.1.1-beta.2 + string public constant version = "1.1.1-beta.2"; /// @notice Returns the L1 block number. receive() external payable { @@ -39,6 +42,6 @@ contract L1BlockNumber is ISemver { /// @notice Retrieves the latest L1 block number. /// @return Latest L1 block number. function getL1BlockNumber() public view returns (uint256) { - return L1Block(Predeploys.L1_BLOCK_ATTRIBUTES).number(); + return IL1Block(Predeploys.L1_BLOCK_ATTRIBUTES).number(); } } diff --git a/packages/contracts-bedrock/src/legacy/L1ChugSplashProxy.sol b/packages/contracts-bedrock/src/legacy/L1ChugSplashProxy.sol index 4f3f7509c9fd..28125a23f90f 100644 --- a/packages/contracts-bedrock/src/legacy/L1ChugSplashProxy.sol +++ b/packages/contracts-bedrock/src/legacy/L1ChugSplashProxy.sol @@ -2,13 +2,9 @@ pragma solidity 0.8.15; import { Constants } from "src/libraries/Constants.sol"; +import { IL1ChugSplashDeployer } from "src/legacy/interfaces/IL1ChugSplashProxy.sol"; -/// @title IL1ChugSplashDeployer -interface IL1ChugSplashDeployer { - function isUpgrading() external view returns (bool); -} - -/// @custom:legacy +/// @custom:legacy true /// @title L1ChugSplashProxy /// @notice Basic ChugSplash proxy contract for L1. Very close to being a normal proxy but has added /// functions `setCode` and `setStorage` for changing the code or storage of the contract. diff --git a/packages/contracts-bedrock/src/legacy/LegacyMessagePasser.sol b/packages/contracts-bedrock/src/legacy/LegacyMessagePasser.sol index caf5e6a23322..b90d1263f7a9 100644 --- a/packages/contracts-bedrock/src/legacy/LegacyMessagePasser.sol +++ b/packages/contracts-bedrock/src/legacy/LegacyMessagePasser.sol @@ -1,10 +1,10 @@ // SPDX-License-Identifier: MIT pragma solidity 0.8.15; -import { ISemver } from "src/universal/ISemver.sol"; +import { ISemver } from "src/universal/interfaces/ISemver.sol"; -/// @custom:legacy -/// @custom:proxied +/// @custom:legacy true +/// @custom:proxied true /// @custom:predeploy 0x4200000000000000000000000000000000000000 /// @title LegacyMessagePasser /// @notice The LegacyMessagePasser was the low-level mechanism used to send messages from L2 to L1 @@ -14,8 +14,8 @@ contract LegacyMessagePasser is ISemver { mapping(bytes32 => bool) public sentMessages; /// @notice Semantic version. - /// @custom:semver 1.1.0 - string public constant version = "1.1.0"; + /// @custom:semver 1.1.1-beta.1 + string public constant version = "1.1.1-beta.1"; /// @notice Passes a message to L1. /// @param _message Message to pass to L1. diff --git a/packages/contracts-bedrock/src/legacy/ResolvedDelegateProxy.sol b/packages/contracts-bedrock/src/legacy/ResolvedDelegateProxy.sol index c735339a6bb8..3005456570ff 100644 --- a/packages/contracts-bedrock/src/legacy/ResolvedDelegateProxy.sol +++ b/packages/contracts-bedrock/src/legacy/ResolvedDelegateProxy.sol @@ -3,7 +3,7 @@ pragma solidity 0.8.15; import { AddressManager } from "src/legacy/AddressManager.sol"; -/// @custom:legacy +/// @custom:legacy true /// @title ResolvedDelegateProxy /// @notice ResolvedDelegateProxy is a legacy proxy contract that makes use of the AddressManager to /// resolve the implementation address. We're maintaining this contract for backwards diff --git a/packages/contracts-bedrock/src/legacy/interfaces/IAddressManager.sol b/packages/contracts-bedrock/src/legacy/interfaces/IAddressManager.sol new file mode 100644 index 000000000000..3fae2cbab430 --- /dev/null +++ b/packages/contracts-bedrock/src/legacy/interfaces/IAddressManager.sol @@ -0,0 +1,13 @@ +// SPDX-License-Identifier: MIT +pragma solidity ^0.8.0; + +import { IOwnable } from "src/universal/interfaces/IOwnable.sol"; + +/// @title IAddressManager +/// @notice Interface for the AddressManager contract. +interface IAddressManager is IOwnable { + event AddressSet(string indexed name, address newAddress, address oldAddress); + + function getAddress(string memory _name) external view returns (address); + function setAddress(string memory _name, address _address) external; +} diff --git a/packages/contracts-bedrock/src/legacy/interfaces/IDeployerWhitelist.sol b/packages/contracts-bedrock/src/legacy/interfaces/IDeployerWhitelist.sol new file mode 100644 index 000000000000..050748f1786e --- /dev/null +++ b/packages/contracts-bedrock/src/legacy/interfaces/IDeployerWhitelist.sol @@ -0,0 +1,20 @@ +// SPDX-License-Identifier: MIT +pragma solidity ^0.8.0; + +import { ISemver } from "src/universal/interfaces/ISemver.sol"; + +/// @title IDeployerWhitelist +/// @notice Interface for the DeployerWhitelist contract. +interface IDeployerWhitelist { + event OwnerChanged(address oldOwner, address newOwner); + event WhitelistDisabled(address oldOwner); + event WhitelistStatusChanged(address deployer, bool whitelisted); + + function enableArbitraryContractDeployment() external; + function isDeployerAllowed(address _deployer) external view returns (bool); + function owner() external view returns (address); + function setOwner(address _owner) external; + function setWhitelistedDeployer(address _deployer, bool _isWhitelisted) external; + function version() external view returns (string memory); + function whitelist(address) external view returns (bool); +} diff --git a/packages/contracts-bedrock/src/legacy/interfaces/IL1BlockNumber.sol b/packages/contracts-bedrock/src/legacy/interfaces/IL1BlockNumber.sol new file mode 100644 index 000000000000..7634cc67c690 --- /dev/null +++ b/packages/contracts-bedrock/src/legacy/interfaces/IL1BlockNumber.sol @@ -0,0 +1,14 @@ +// SPDX-License-Identifier: MIT +pragma solidity ^0.8.0; + +import { ISemver } from "src/universal/interfaces/ISemver.sol"; + +/// @title IL1BlockNumber +/// @notice Interface for the L1BlockNumber contract. +interface IL1BlockNumber is ISemver { + fallback() external payable; + + receive() external payable; + + function getL1BlockNumber() external view returns (uint256); +} diff --git a/packages/contracts-bedrock/src/legacy/interfaces/IL1ChugSplashProxy.sol b/packages/contracts-bedrock/src/legacy/interfaces/IL1ChugSplashProxy.sol new file mode 100644 index 000000000000..863c89906751 --- /dev/null +++ b/packages/contracts-bedrock/src/legacy/interfaces/IL1ChugSplashProxy.sol @@ -0,0 +1,30 @@ +// SPDX-License-Identifier: MIT +pragma solidity ^0.8.0; + +/// @title IL1ChugSplashProxy +/// @notice Interface for the L1ChugSplashProxy contract. +interface IL1ChugSplashProxy { + fallback() external payable; + + receive() external payable; + + function getImplementation() external returns (address); + function getOwner() external returns (address); + function setCode(bytes memory _code) external; + function setOwner(address _owner) external; + function setStorage(bytes32 _key, bytes32 _value) external; + + function __constructor__(address _owner) external; +} + +/// @title IStaticL1ChugSplashProxy +/// @notice IStaticL1ChugSplashProxy is a static version of the ChugSplash proxy interface. +interface IStaticL1ChugSplashProxy { + function getImplementation() external view returns (address); + function getOwner() external view returns (address); +} + +/// @title IL1ChugSplashDeployer +interface IL1ChugSplashDeployer { + function isUpgrading() external view returns (bool); +} diff --git a/packages/contracts-bedrock/src/legacy/interfaces/ILegacyMessagePasser.sol b/packages/contracts-bedrock/src/legacy/interfaces/ILegacyMessagePasser.sol new file mode 100644 index 000000000000..a5fde0fdb65d --- /dev/null +++ b/packages/contracts-bedrock/src/legacy/interfaces/ILegacyMessagePasser.sol @@ -0,0 +1,11 @@ +// SPDX-License-Identifier: MIT +pragma solidity ^0.8.0; + +import { ISemver } from "src/universal/interfaces/ISemver.sol"; + +/// @title ILegacyMessagePasser +/// @notice Interface for the LegacyMessagePasser contract. +interface ILegacyMessagePasser is ISemver { + function passMessageToL1(bytes memory _message) external; + function sentMessages(bytes32) external view returns (bool); +} diff --git a/packages/contracts-bedrock/src/legacy/interfaces/IResolvedDelegateProxy.sol b/packages/contracts-bedrock/src/legacy/interfaces/IResolvedDelegateProxy.sol new file mode 100644 index 000000000000..abeb3817d9be --- /dev/null +++ b/packages/contracts-bedrock/src/legacy/interfaces/IResolvedDelegateProxy.sol @@ -0,0 +1,8 @@ +// SPDX-License-Identifier: MIT +pragma solidity ^0.8.0; + +/// @title IResolvedDelegateProxy +/// @notice Interface for the ResolvedDelegateProxy contract. +interface IResolvedDelegateProxy { + fallback() external payable; +} diff --git a/packages/contracts-bedrock/src/libraries/Blueprint.sol b/packages/contracts-bedrock/src/libraries/Blueprint.sol new file mode 100644 index 000000000000..2e0979e1c6bf --- /dev/null +++ b/packages/contracts-bedrock/src/libraries/Blueprint.sol @@ -0,0 +1,124 @@ +// SPDX-License-Identifier: MIT +pragma solidity ^0.8.0; + +/// @notice Methods for working with ERC-5202 blueprint contracts. +/// https://eips.ethereum.org/EIPS/eip-5202 +library Blueprint { + /// @notice The structure of a blueprint contract per ERC-5202. + struct Preamble { + uint8 ercVersion; + bytes preambleData; + bytes initcode; + } + + /// @notice Thrown when converting a bytes array to a uint256 and the bytes array is too long. + error BytesArrayTooLong(); + + /// @notice Throw when contract deployment fails. + error DeploymentFailed(); + + /// @notice Thrown when parsing a blueprint preamble and the resulting initcode is empty. + error EmptyInitcode(); + + /// @notice Thrown when parsing a blueprint preamble and the bytecode does not contain the expected prefix bytes. + error NotABlueprint(); + + /// @notice Thrown when parsing a blueprint preamble and the reserved bits are set. + error ReservedBitsSet(); + + /// @notice Thrown when parsing a blueprint preamble and the preamble data is not empty. + /// We do not use the preamble data, so it's expected to be empty. + error UnexpectedPreambleData(bytes data); + + /// @notice Thrown during deployment if the ERC version is not supported. + error UnsupportedERCVersion(uint8 version); + + /// @notice Takes the desired initcode for a blueprint as a parameter, and returns EVM code + /// which will deploy a corresponding blueprint contract (with no data section). Based on the + /// reference implementation in https://eips.ethereum.org/EIPS/eip-5202. + function blueprintDeployerBytecode(bytes memory _initcode) internal pure returns (bytes memory) { + // Check that the initcode is not empty. + if (_initcode.length == 0) revert EmptyInitcode(); + + bytes memory blueprintPreamble = hex"FE7100"; // ERC-5202 preamble. + bytes memory blueprintBytecode = bytes.concat(blueprintPreamble, _initcode); + + // The length of the deployed code in bytes. + bytes2 lenBytes = bytes2(uint16(blueprintBytecode.length)); + + // Copy <blueprintBytecode> to memory and `RETURN` it per EVM creation semantics. + // PUSH2 <len> RETURNDATASIZE DUP2 PUSH1 10 RETURNDATASIZE CODECOPY RETURN + bytes memory deployBytecode = bytes.concat(hex"61", lenBytes, hex"3d81600a3d39f3"); + + return bytes.concat(deployBytecode, blueprintBytecode); + } + + /// @notice Given bytecode as a sequence of bytes, parse the blueprint preamble and deconstruct + /// the bytecode into the ERC version, preamble data and initcode. Reverts if the bytecode is + /// not a valid blueprint contract according to ERC-5202. + function parseBlueprintPreamble(bytes memory _bytecode) internal pure returns (Preamble memory) { + if (_bytecode.length < 2 || _bytecode[0] != 0xFE || _bytecode[1] != 0x71) { + revert NotABlueprint(); + } + + uint8 ercVersion = uint8(_bytecode[2] & 0xFC) >> 2; + uint8 nLengthBytes = uint8(_bytecode[2] & 0x03); + if (nLengthBytes == 0x03) revert ReservedBitsSet(); + + uint256 dataLength = 0; + if (nLengthBytes > 0) { + bytes memory lengthBytes = new bytes(nLengthBytes); + for (uint256 i = 0; i < nLengthBytes; i++) { + lengthBytes[i] = _bytecode[3 + i]; + } + dataLength = bytesToUint(lengthBytes); + } + + bytes memory preambleData = new bytes(dataLength); + if (nLengthBytes != 0) { + uint256 dataStart = 3 + nLengthBytes; + for (uint256 i = 0; i < dataLength; i++) { + preambleData[i] = _bytecode[dataStart + i]; + } + } + + uint256 initcodeStart = 3 + nLengthBytes + dataLength; + bytes memory initcode = new bytes(_bytecode.length - initcodeStart); + for (uint256 i = 0; i < initcode.length; i++) { + initcode[i] = _bytecode[initcodeStart + i]; + } + if (initcode.length == 0) revert EmptyInitcode(); + + return Preamble(ercVersion, preambleData, initcode); + } + + /// @notice Parses the code at the given `_target` as a blueprint and deploys the resulting initcode. + /// This version of `deployFrom` is used when the initcode requires no constructor arguments. + function deployFrom(address _target, bytes32 _salt) internal returns (address) { + return deployFrom(_target, _salt, new bytes(0)); + } + + /// @notice Parses the code at the given `_target` as a blueprint and deploys the resulting initcode + /// with the given `_data` appended, i.e. `_data` is the ABI-encoded constructor arguments. + function deployFrom(address _target, bytes32 _salt, bytes memory _data) internal returns (address newContract_) { + Preamble memory preamble = parseBlueprintPreamble(address(_target).code); + if (preamble.ercVersion != 0) revert UnsupportedERCVersion(preamble.ercVersion); + if (preamble.preambleData.length != 0) revert UnexpectedPreambleData(preamble.preambleData); + + bytes memory initcode = bytes.concat(preamble.initcode, _data); + assembly ("memory-safe") { + newContract_ := create2(0, add(initcode, 0x20), mload(initcode), _salt) + } + if (newContract_ == address(0)) revert DeploymentFailed(); + } + + /// @notice Convert a bytes array to a uint256. + function bytesToUint(bytes memory _b) internal pure returns (uint256) { + if (_b.length > 32) revert BytesArrayTooLong(); + uint256 number; + for (uint256 i = 0; i < _b.length; i++) { + number = number + uint256(uint8(_b[i])) * (2 ** (8 * (_b.length - (i + 1)))); + } + return number; + } +} diff --git a/packages/contracts-bedrock/src/libraries/Constants.sol b/packages/contracts-bedrock/src/libraries/Constants.sol index e86010421d34..1cbd61d21a5e 100644 --- a/packages/contracts-bedrock/src/libraries/Constants.sol +++ b/packages/contracts-bedrock/src/libraries/Constants.sol @@ -1,7 +1,7 @@ // SPDX-License-Identifier: MIT pragma solidity ^0.8.0; -import { ResourceMetering } from "src/L1/ResourceMetering.sol"; +import { IResourceMetering } from "src/L1/interfaces/IResourceMetering.sol"; /// @title Constants /// @notice Constants is a library for storing constants. Simple! Don't put everything in here, just @@ -39,8 +39,8 @@ library Constants { /// @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) { - ResourceMetering.ResourceConfig memory config = ResourceMetering.ResourceConfig({ + function DEFAULT_RESOURCE_CONFIG() internal pure returns (IResourceMetering.ResourceConfig memory) { + IResourceMetering.ResourceConfig memory config = IResourceMetering.ResourceConfig({ maxResourceLimit: 20_000_000, elasticityMultiplier: 10, baseFeeMaxChangeDenominator: 8, diff --git a/packages/contracts-bedrock/src/libraries/Encoding.sol b/packages/contracts-bedrock/src/libraries/Encoding.sol index dae9486c7c63..7ab1a285841f 100644 --- a/packages/contracts-bedrock/src/libraries/Encoding.sol +++ b/packages/contracts-bedrock/src/libraries/Encoding.sol @@ -184,8 +184,7 @@ library Encoding { /// @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( + function encodeSetL1BlockValuesIsthmus( uint32 _baseFeeScalar, uint32 _blobBaseFeeScalar, uint64 _sequenceNumber, @@ -194,18 +193,13 @@ library Encoding { uint256 _baseFee, uint256 _blobBaseFee, bytes32 _hash, - bytes32 _batcherHash, - uint256[] memory _dependencySet + bytes32 _batcherHash ) 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()")); + bytes4 functionSignature = bytes4(keccak256("setL1BlockValuesIsthmus()")); return abi.encodePacked( functionSignature, _baseFeeScalar, @@ -216,9 +210,7 @@ library Encoding { _baseFee, _blobBaseFee, _hash, - _batcherHash, - uint8(_dependencySet.length), - _dependencySet + _batcherHash ); } } diff --git a/packages/contracts-bedrock/src/libraries/L1BlockErrors.sol b/packages/contracts-bedrock/src/libraries/L1BlockErrors.sol new file mode 100644 index 000000000000..44e156e158c0 --- /dev/null +++ b/packages/contracts-bedrock/src/libraries/L1BlockErrors.sol @@ -0,0 +1,20 @@ +// 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 non-cross L2 Inbox sender tries to call the `isDeposit()` method. +error NotCrossL2Inbox(); + +/// @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 index 0ec300370f20..a68f50328b58 100644 --- a/packages/contracts-bedrock/src/libraries/PortalErrors.sol +++ b/packages/contracts-bedrock/src/libraries/PortalErrors.sol @@ -22,3 +22,19 @@ error CallPaused(); error GasEstimation(); /// @notice Error for when a method is being reentered. error NonReentrant(); +/// @notice Error for invalid proof. +error InvalidProof(); +/// @notice Error for invalid game type. +error InvalidGameType(); +/// @notice Error for an invalid dispute game. +error InvalidDisputeGame(); +/// @notice Error for an invalid merkle proof. +error InvalidMerkleProof(); +/// @notice Error for when a dispute game has been blacklisted. +error Blacklisted(); +/// @notice Error for when trying to withdrawal without first proven. +error Unproven(); +/// @notice Error for when a proposal is not validated. +error ProposalNotValidated(); +/// @notice Error for when a withdrawal has already been finalized. +error AlreadyFinalized(); diff --git a/packages/contracts-bedrock/src/libraries/Predeploys.sol b/packages/contracts-bedrock/src/libraries/Predeploys.sol index 23b9994541a9..3de0c2cad0de 100644 --- a/packages/contracts-bedrock/src/libraries/Predeploys.sol +++ b/packages/contracts-bedrock/src/libraries/Predeploys.sol @@ -92,6 +92,22 @@ library Predeploys { /// @notice Address of the L2ToL2CrossDomainMessenger predeploy. address internal constant L2_TO_L2_CROSS_DOMAIN_MESSENGER = 0x4200000000000000000000000000000000000023; + /// @notice Address of the SuperchainWETH predeploy. + address internal constant SUPERCHAIN_WETH = 0x4200000000000000000000000000000000000024; + + /// @notice Address of the ETHLiquidity predeploy. + address internal constant ETH_LIQUIDITY = 0x4200000000000000000000000000000000000025; + + /// @notice Address of the OptimismSuperchainERC20Factory predeploy. + address internal constant OPTIMISM_SUPERCHAIN_ERC20_FACTORY = 0x4200000000000000000000000000000000000026; + + /// @notice Address of the OptimismSuperchainERC20Beacon predeploy. + address internal constant OPTIMISM_SUPERCHAIN_ERC20_BEACON = 0x4200000000000000000000000000000000000027; + + // TODO: Precalculate the address of the implementation contract + /// @notice Arbitrary address of the OptimismSuperchainERC20 implementation contract. + address internal constant OPTIMISM_SUPERCHAIN_ERC20 = 0xB9415c6cA93bdC545D4c5177512FCC22EFa38F28; + /// @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"); @@ -118,6 +134,10 @@ library Predeploys { if (_addr == LEGACY_ERC20_ETH) return "LegacyERC20ETH"; if (_addr == CROSS_L2_INBOX) return "CrossL2Inbox"; if (_addr == L2_TO_L2_CROSS_DOMAIN_MESSENGER) return "L2ToL2CrossDomainMessenger"; + if (_addr == SUPERCHAIN_WETH) return "SuperchainWETH"; + if (_addr == ETH_LIQUIDITY) return "ETHLiquidity"; + if (_addr == OPTIMISM_SUPERCHAIN_ERC20_FACTORY) return "OptimismSuperchainERC20Factory"; + if (_addr == OPTIMISM_SUPERCHAIN_ERC20_BEACON) return "OptimismSuperchainERC20Beacon"; if (_addr == SOUL_GAS_TOKEN) return "SoulGasToken"; revert("Predeploys: unnamed predeploy"); } @@ -136,7 +156,9 @@ library Predeploys { || _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) - || _addr == SOUL_GAS_TOKEN; + || (_useInterop && _addr == SUPERCHAIN_WETH) || (_useInterop && _addr == ETH_LIQUIDITY) + || (_useInterop && _addr == OPTIMISM_SUPERCHAIN_ERC20_FACTORY) + || (_useInterop && _addr == OPTIMISM_SUPERCHAIN_ERC20_BEACON) || _addr == SOUL_GAS_TOKEN; } function isPredeployNamespace(address _addr) internal pure returns (bool) { diff --git a/packages/contracts-bedrock/src/libraries/Preinstalls.sol b/packages/contracts-bedrock/src/libraries/Preinstalls.sol index 7c245545c869..db886f57f10a 100644 --- a/packages/contracts-bedrock/src/libraries/Preinstalls.sol +++ b/packages/contracts-bedrock/src/libraries/Preinstalls.sol @@ -32,11 +32,20 @@ library Preinstalls { /// @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 SenderCreator_v060 predeploy. + address internal constant SenderCreator_v060 = 0x7fc98430eAEdbb6070B35B39D798725049088348; - /// @notice Address of the EntryPoint predeploy. - address internal constant EntryPoint = 0x5FF137D4b0FDCD49DcA30c7CF57E578a026d2789; + /// @notice Address of the EntryPoint_v060 predeploy. + address internal constant EntryPoint_v060 = 0x5FF137D4b0FDCD49DcA30c7CF57E578a026d2789; + + /// @notice Address of the SenderCreator_v070 predeploy. + address internal constant SenderCreator_v070 = 0xEFC2c1444eBCC4Db75e7613d20C6a62fF67A167C; + + /// @notice Address of the EntryPoint_v070 predeploy. + address internal constant EntryPoint_v070 = 0x0000000071727De22E5E9d8BAf0edAc6f37da032; + + /// @notice Address of the CreateX predeploy. + address internal constant CreateX = 0xba5Ed099633D3B313e4D5F7bdc1305d3c28ba5Ed; /// @notice Address of beacon block roots contract, introduced in the Cancun upgrade. /// See BEACON_ROOTS_ADDRESS in EIP-4788. @@ -81,12 +90,21 @@ library Preinstalls { bytes internal constant MultiSend_v130Code = hex"60806040526004361061001e5760003560e01c80638d80ff0a14610023575b600080fd5b6100dc6004803603602081101561003957600080fd5b810190808035906020019064010000000081111561005657600080fd5b82018360208201111561006857600080fd5b8035906020019184600183028401116401000000008311171561008a57600080fd5b91908080601f016020809104026020016040519081016040528093929190818152602001838380828437600081840152601f19601f8201169050808301925050505050505091929192905050506100de565b005b7f000000000000000000000000998739bfdaadde7c933b942a68053933098f9eda73ffffffffffffffffffffffffffffffffffffffff163073ffffffffffffffffffffffffffffffffffffffff161415610183576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260308152602001806102106030913960400191505060405180910390fd5b805160205b8181101561020a578083015160f81c6001820184015160601c6015830185015160358401860151605585018701600085600081146101cd57600181146101dd576101e8565b6000808585888a5af191506101e8565b6000808585895af491505b5060008114156101f757600080fd5b8260550187019650505050505050610188565b50505056fe4d756c746953656e642073686f756c64206f6e6c792062652063616c6c6564207669612064656c656761746563616c6ca26469706673582212205c784303626eec02b71940b551976170b500a8a36cc5adcbeb2c19751a76d05464736f6c63430007060033"; - bytes internal constant SenderCreatorCode = + bytes internal constant SenderCreator_v060Code = hex"6080604052600436101561001257600080fd5b6000803560e01c63570e1a361461002857600080fd5b346100c95760207ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc3601126100c95760043567ffffffffffffffff918282116100c957366023830112156100c95781600401359283116100c95736602484840101116100c9576100c561009e84602485016100fc565b60405173ffffffffffffffffffffffffffffffffffffffff90911681529081906020820190565b0390f35b80fd5b507f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b90806014116101bb5767ffffffffffffffff917fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffec82018381116101cd575b604051937fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0603f81600b8701160116850190858210908211176101c0575b604052808452602084019036848401116101bb576020946000600c819682946014880187378301015251923560601c5af19060005191156101b557565b60009150565b600080fd5b6101c86100cc565b610178565b6101d56100cc565b61013a56fea26469706673582212201927e80b76ab9b71c952137dd676621a9fdf520c25928815636594036eb1c40364736f6c63430008110033"; - bytes internal constant EntryPointCode = + bytes internal constant EntryPoint_v060Code = hex"60806040526004361015610023575b361561001957600080fd5b610021615531565b005b60003560e01c80630396cb60146101b35780630bd28e3b146101aa5780631b2e01b8146101a15780631d732756146101985780631fad948c1461018f578063205c28781461018657806335567e1a1461017d5780634b1d7cf5146101745780635287ce121461016b57806370a08231146101625780638f41ec5a14610159578063957122ab146101505780639b249f6914610147578063a61935311461013e578063b760faf914610135578063bb9fe6bf1461012c578063c23a5cea14610123578063d6383f941461011a578063ee219423146101115763fc7e286d0361000e5761010c611bcd565b61000e565b5061010c6119b5565b5061010c61184d565b5061010c6116b4565b5061010c611536565b5061010c6114f7565b5061010c6114d6565b5061010c611337565b5061010c611164565b5061010c611129565b5061010c6110a4565b5061010c610f54565b5061010c610bf8565b5061010c610b33565b5061010c610994565b5061010c6108ba565b5061010c6106e7565b5061010c610467565b5061010c610385565b5060207ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc3601126103595760043563ffffffff8116808203610359576103547fa5ae833d0bb1dcd632d98a8b70973e8516812898e19bf27b70071ebc8dc52c01916102716102413373ffffffffffffffffffffffffffffffffffffffff166000526000602052604060002090565b9161024d811515615697565b61026a610261600185015463ffffffff1690565b63ffffffff1690565b11156156fc565b54926103366dffffffffffffffffffffffffffff946102f461029834888460781c166121d5565b966102a4881515615761565b6102b0818911156157c6565b6102d4816102bc6105ec565b941684906dffffffffffffffffffffffffffff169052565b6001602084015287166dffffffffffffffffffffffffffff166040830152565b63ffffffff83166060820152600060808201526103313373ffffffffffffffffffffffffffffffffffffffff166000526000602052604060002090565b61582b565b6040805194855263ffffffff90911660208501523393918291820190565b0390a2005b600080fd5b6024359077ffffffffffffffffffffffffffffffffffffffffffffffff8216820361035957565b50346103595760207ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc3601126103595760043577ffffffffffffffffffffffffffffffffffffffffffffffff81168103610359576104149033600052600160205260406000209077ffffffffffffffffffffffffffffffffffffffffffffffff16600052602052604060002090565b61041e8154612491565b9055005b73ffffffffffffffffffffffffffffffffffffffff81160361035957565b6024359061044d82610422565b565b60c4359061044d82610422565b359061044d82610422565b50346103595760407ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc3601126103595760206104fc6004356104a881610422565b73ffffffffffffffffffffffffffffffffffffffff6104c561035e565b91166000526001835260406000209077ffffffffffffffffffffffffffffffffffffffffffffffff16600052602052604060002090565b54604051908152f35b507f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b60a0810190811067ffffffffffffffff82111761055157604052565b610559610505565b604052565b610100810190811067ffffffffffffffff82111761055157604052565b67ffffffffffffffff811161055157604052565b6060810190811067ffffffffffffffff82111761055157604052565b90601f7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0910116810190811067ffffffffffffffff82111761055157604052565b6040519061044d82610535565b6040519060c0820182811067ffffffffffffffff82111761055157604052565b604051906040820182811067ffffffffffffffff82111761055157604052565b7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0601f60209267ffffffffffffffff8111610675575b01160190565b61067d610505565b61066f565b92919261068e82610639565b9161069c60405193846105ab565b829481845281830111610359578281602093846000960137010152565b9181601f840112156103595782359167ffffffffffffffff8311610359576020838186019501011161035957565b5034610359576101c07ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc3601126103595767ffffffffffffffff60043581811161035957366023820112156103595761074a903690602481600401359101610682565b907fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffdc36016101808112610359576101006040519161078783610535565b12610359576040516107988161055e565b6107a0610440565b815260443560208201526064356040820152608435606082015260a43560808201526107ca61044f565b60a082015260e43560c08201526101043560e082015281526101243560208201526101443560408201526101643560608201526101843560808201526101a4359182116103595761083e9261082661082e9336906004016106b9565b9290916128b1565b6040519081529081906020820190565b0390f35b9060407ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc8301126103595760043567ffffffffffffffff9283821161035957806023830112156103595781600401359384116103595760248460051b830101116103595760240191906024356108b781610422565b90565b5034610359576108c936610842565b6108d4929192611e3a565b6108dd83611d2d565b60005b84811061095d57506000927fbb47ee3e183a558b1a2ff0874b079f3fc5478b7454eacf2bfc5af2ff5878f9728480a183915b85831061092d576109238585611ed7565b6100216001600255565b909193600190610953610941878987611dec565b61094b8886611dca565b51908861233f565b0194019190610912565b8061098b610984610972600194869896611dca565b5161097e848a88611dec565b84613448565b9083612f30565b019290926108e0565b50346103595760407ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc360112610359576004356109d081610422565b6024359060009133835282602052604083206dffffffffffffffffffffffffffff81541692838311610ad557848373ffffffffffffffffffffffffffffffffffffffff829593610a788496610a3f610a2c8798610ad29c6121c0565b6dffffffffffffffffffffffffffff1690565b6dffffffffffffffffffffffffffff167fffffffffffffffffffffffffffffffffffff0000000000000000000000000000825416179055565b6040805173ffffffffffffffffffffffffffffffffffffffff831681526020810185905233917fd1c19fbcd4551a5edfb66d43d2e337c04837afda3482b42bdf569a8fccdae5fb91a2165af1610acc611ea7565b50615ba2565b80f35b60646040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601960248201527f576974686472617720616d6f756e7420746f6f206c61726765000000000000006044820152fd5b50346103595760407ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc360112610359576020600435610b7181610422565b73ffffffffffffffffffffffffffffffffffffffff610b8e61035e565b911660005260018252610bc98160406000209077ffffffffffffffffffffffffffffffffffffffffffffffff16600052602052604060002090565b547fffffffffffffffffffffffffffffffffffffffffffffffff00000000000000006040519260401b16178152f35b503461035957610c0736610842565b610c0f611e3a565b6000805b838210610df657610c249150611d2d565b7fbb47ee3e183a558b1a2ff0874b079f3fc5478b7454eacf2bfc5af2ff5878f972600080a16000805b848110610d5c57505060008093815b818110610c9357610923868660007f575ff3acadd5ab348fe1855e217e0f3678f8d767d7494c9f9fefbee2e17cca4d8180a2611ed7565b610cf7610ca182848a6124cb565b610ccc610cb3610cb36020840161256d565b73ffffffffffffffffffffffffffffffffffffffff1690565b7f575ff3acadd5ab348fe1855e217e0f3678f8d767d7494c9f9fefbee2e17cca4d600080a280612519565b906000915b808310610d1457505050610d0f90612491565b610c5c565b90919497610d4f610d49610d5592610d438c8b610d3c82610d368e8b8d611dec565b92611dca565b519161233f565b906121d5565b99612491565b95612491565b9190610cfc565b610d678186886124cb565b6020610d7f610d768380612519565b9290930161256d565b9173ffffffffffffffffffffffffffffffffffffffff60009316905b828410610db45750505050610daf90612491565b610c4d565b90919294610d4f81610de985610de2610dd0610dee968d611dca565b51610ddc8c8b8a611dec565b85613448565b908b613148565b612491565b929190610d9b565b610e018285876124cb565b90610e0c8280612519565b92610e1c610cb36020830161256d565b9173ffffffffffffffffffffffffffffffffffffffff8316610e416001821415612577565b610e62575b505050610e5c91610e56916121d5565b91612491565b90610c13565b909592610e7b6040999693999895989788810190611fc8565b92908a3b156103595789938b918a5193849283927fe3563a4f00000000000000000000000000000000000000000000000000000000845260049e8f850193610ec294612711565b03815a93600094fa9081610f3b575b50610f255786517f86a9f75000000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff8a16818a0190815281906020010390fd5b0390fd5b9497509295509093509181610e56610e5c610e46565b80610f48610f4e9261057b565b8061111e565b38610ed1565b50346103595760207ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc3601126103595761083e73ffffffffffffffffffffffffffffffffffffffff600435610fa881610422565b608060409283928351610fba81610535565b60009381858093528260208201528287820152826060820152015216815280602052209061104965ffffffffffff6001835194610ff686610535565b80546dffffffffffffffffffffffffffff8082168852607082901c60ff161515602089015260789190911c1685870152015463ffffffff8116606086015260201c16608084019065ffffffffffff169052565b5191829182919091608065ffffffffffff8160a08401956dffffffffffffffffffffffffffff808251168652602082015115156020870152604082015116604086015263ffffffff6060820151166060860152015116910152565b50346103595760207ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc3601126103595773ffffffffffffffffffffffffffffffffffffffff6004356110f581610422565b16600052600060205260206dffffffffffffffffffffffffffff60406000205416604051908152f35b600091031261035957565b50346103595760007ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc36011261035957602060405160018152f35b50346103595760607ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc36011261035957600467ffffffffffffffff8135818111610359576111b590369084016106b9565b9050602435916111c483610422565b604435908111610359576111db90369085016106b9565b92909115908161132d575b506112c6576014821015611236575b610f21836040519182917f08c379a0000000000000000000000000000000000000000000000000000000008352820160409060208152600060208201520190565b6112466112529261124c92612b88565b90612b96565b60601c90565b3b1561125f5738806111f5565b610f21906040519182917f08c379a0000000000000000000000000000000000000000000000000000000008352820160609060208152601b60208201527f41413330207061796d6173746572206e6f74206465706c6f796564000000000060408201520190565b610f21836040519182917f08c379a0000000000000000000000000000000000000000000000000000000008352820160609060208152601960208201527f41413230206163636f756e74206e6f74206465706c6f7965640000000000000060408201520190565b90503b15386111e6565b50346103595760207ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc3601126103595760043567ffffffffffffffff81116103595761138960249136906004016106b9565b906113bf6040519283927f570e1a3600000000000000000000000000000000000000000000000000000000845260048401612d2c565b0360208273ffffffffffffffffffffffffffffffffffffffff92816000857f0000000000000000000000007fc98430eaedbb6070b35b39d798725049088348165af1918215611471575b600092611441575b50604051917f6ca7b806000000000000000000000000000000000000000000000000000000008352166004820152fd5b61146391925060203d811161146a575b61145b81836105ab565b810190612d17565b9038611411565b503d611451565b611479612183565b611409565b90816101609103126103595790565b60207ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc820112610359576004359067ffffffffffffffff8211610359576108b79160040161147e565b50346103595760206114ef6114ea3661148d565b612a0c565b604051908152f35b5060207ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc3601126103595761002160043561153181610422565b61562b565b5034610359576000807ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc3601126116b1573381528060205260408120600181019063ffffffff825416908115611653576115f06115b5611618936115a76115a2855460ff9060701c1690565b61598f565b65ffffffffffff42166159f4565b84547fffffffffffffffffffffffffffffffffffffffffffff000000000000ffffffff16602082901b69ffffffffffff000000001617909455565b7fffffffffffffffffffffffffffffffffff00ffffffffffffffffffffffffffff8154169055565b60405165ffffffffffff91909116815233907ffa9b3c14cc825c412c9ed81b3ba365a5b459439403f18829e572ed53a4180f0a90602090a280f35b60646040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152600a60248201527f6e6f74207374616b6564000000000000000000000000000000000000000000006044820152fd5b80fd5b50346103595760207ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc360112610359576004356116f081610422565b610ad273ffffffffffffffffffffffffffffffffffffffff6117323373ffffffffffffffffffffffffffffffffffffffff166000526000602052604060002090565b926117ea611755610a2c86546dffffffffffffffffffffffffffff9060781c1690565b94611761861515615a0e565b6117c26001820161179a65ffffffffffff611786835465ffffffffffff9060201c1690565b16611792811515615a73565b421015615ad8565b80547fffffffffffffffffffffffffffffffffffffffffffff00000000000000000000169055565b7fffffff0000000000000000000000000000ffffffffffffffffffffffffffffff8154169055565b6040805173ffffffffffffffffffffffffffffffffffffffff831681526020810186905233917fb7c918e0e249f999e965cafeb6c664271b3f4317d296461500e71da39f0cbda391a2600080809581948294165af1611847611ea7565b50615b3d565b50346103595760607ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc3601126103595767ffffffffffffffff6004358181116103595761189e90369060040161147e565b602435916118ab83610422565b604435908111610359576118c6610f219136906004016106b9565b6118ce611caa565b6118d785612e2b565b6118ea6118e48287613240565b906153ba565b946118fa826000924384526121e2565b96438252819360609573ffffffffffffffffffffffffffffffffffffffff8316611981575b50505050608001519361194e6040611940602084015165ffffffffffff1690565b92015165ffffffffffff1690565b906040519687967f8b7ac980000000000000000000000000000000000000000000000000000000008852600488016127e1565b8395508394965061199b60409492939451809481936127d3565b03925af19060806119aa611ea7565b92919038808061191f565b5034610359576119c43661148d565b6119cc611caa565b6119d582612e2b565b6119df8183613240565b825160a00151919391611a0c9073ffffffffffffffffffffffffffffffffffffffff166154dc565b6154dc565b90611a30611a07855173ffffffffffffffffffffffffffffffffffffffff90511690565b94611a39612b50565b50611a68611a4c60409586810190611fc8565b90600060148310611bc55750611246611a079261124c92612b88565b91611a72916153ba565b805173ffffffffffffffffffffffffffffffffffffffff169073ffffffffffffffffffffffffffffffffffffffff821660018114916080880151978781015191886020820151611ac79065ffffffffffff1690565b91015165ffffffffffff16916060015192611ae06105f9565b9a8b5260208b0152841515898b015265ffffffffffff1660608a015265ffffffffffff16608089015260a088015215159081611bbc575b50611b515750610f2192519485947fe0cff05f00000000000000000000000000000000000000000000000000000000865260048601612cbd565b9190610f2193611b60846154dc565b611b87611b6b610619565b73ffffffffffffffffffffffffffffffffffffffff9096168652565b6020850152519586957ffaecb4e400000000000000000000000000000000000000000000000000000000875260048701612c2b565b90501538611b17565b9150506154dc565b50346103595760207ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc3601126103595773ffffffffffffffffffffffffffffffffffffffff600435611c1e81610422565b16600052600060205260a0604060002065ffffffffffff60018254920154604051926dffffffffffffffffffffffffffff90818116855260ff8160701c161515602086015260781c16604084015263ffffffff8116606084015260201c166080820152f35b60209067ffffffffffffffff8111611c9d575b60051b0190565b611ca5610505565b611c96565b60405190611cb782610535565b604051608083610100830167ffffffffffffffff811184821017611d20575b60405260009283815283602082015283604082015283606082015283838201528360a08201528360c08201528360e082015281528260208201528260408201528260608201520152565b611d28610505565b611cd6565b90611d3782611c83565b611d4460405191826105ab565b8281527fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0611d728294611c83565b019060005b828110611d8357505050565b602090611d8e611caa565b82828501015201611d77565b507f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b6020918151811015611ddf575b60051b010190565b611de7611d9a565b611dd7565b9190811015611e2d575b60051b810135907ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffea181360301821215610359570190565b611e35611d9a565b611df6565b6002805414611e495760028055565b60646040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601f60248201527f5265656e7472616e637947756172643a207265656e7472616e742063616c6c006044820152fd5b3d15611ed2573d90611eb882610639565b91611ec660405193846105ab565b82523d6000602084013e565b606090565b73ffffffffffffffffffffffffffffffffffffffff168015611f6a57600080809381935af1611f04611ea7565b5015611f0c57565b60646040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601f60248201527f41413931206661696c65642073656e6420746f2062656e6566696369617279006044820152fd5b60646040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601860248201527f4141393020696e76616c69642062656e656669636961727900000000000000006044820152fd5b9035907fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe181360301821215610359570180359067ffffffffffffffff82116103595760200191813603831361035957565b90816020910312610359575190565b601f82602094937fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0938186528686013760008582860101520116010190565b60005b83811061207a5750506000910152565b818101518382015260200161206a565b907fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0601f6020936120c681518092818752878088019101612067565b0116010190565b906120e76080916108b796946101c0808652850191612028565b9360e0815173ffffffffffffffffffffffffffffffffffffffff80825116602087015260208201516040870152604082015160608701526060820151858701528482015160a087015260a08201511660c086015260c081015182860152015161010084015260208101516101208401526040810151610140840152606081015161016084015201516101808201526101a081840391015261208a565b506040513d6000823e3d90fd5b507f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b919082039182116121cd57565b61044d612190565b919082018092116121cd57565b905a918160206121fb6060830151936060810190611fc8565b906122348560405195869485947f1d732756000000000000000000000000000000000000000000000000000000008652600486016120cd565b03816000305af16000918161230f575b50612308575060206000803e7fdeaddead000000000000000000000000000000000000000000000000000000006000511461229b5761229561228a6108b7945a906121c0565b6080840151906121d5565b91614afc565b6040517f220266b600000000000000000000000000000000000000000000000000000000815280610f21600482016080906000815260406020820152600f60408201527f41413935206f7574206f6620676173000000000000000000000000000000000060608201520190565b9250505090565b61233191925060203d8111612338575b61232981836105ab565b810190612019565b9038612244565b503d61231f565b909291925a9380602061235b6060830151946060810190611fc8565b906123948660405195869485947f1d732756000000000000000000000000000000000000000000000000000000008652600486016120cd565b03816000305af160009181612471575b5061246a575060206000803e7fdeaddead00000000000000000000000000000000000000000000000000000000600051146123fc576123f66123eb6108b795965a906121c0565b6080830151906121d5565b92614ddf565b610f21836040519182917f220266b600000000000000000000000000000000000000000000000000000000835260048301608091815260406020820152600f60408201527f41413935206f7574206f6620676173000000000000000000000000000000000060608201520190565b9450505050565b61248a91925060203d81116123385761232981836105ab565b90386123a4565b6001907fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff81146124bf570190565b6124c7612190565b0190565b919081101561250c575b60051b810135907fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffa181360301821215610359570190565b612514611d9a565b6124d5565b9035907fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe181360301821215610359570180359067ffffffffffffffff821161035957602001918160051b3603831361035957565b356108b781610422565b1561257e57565b60646040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601760248201527f4141393620696e76616c69642061676772656761746f720000000000000000006044820152fd5b90357fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe18236030181121561035957016020813591019167ffffffffffffffff821161035957813603831361035957565b6108b7916126578161263d8461045c565b73ffffffffffffffffffffffffffffffffffffffff169052565b602082013560208201526126f26126a361268861267760408601866125dc565b610160806040880152860191612028565b61269560608601866125dc565b908583036060870152612028565b6080840135608084015260a084013560a084015260c084013560c084015260e084013560e084015261010080850135908401526101206126e5818601866125dc565b9185840390860152612028565b9161270361014091828101906125dc565b929091818503910152612028565b949391929083604087016040885252606086019360608160051b8801019482600090815b848310612754575050505050508460206108b795968503910152612028565b9091929394977fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffa08b820301855288357ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffea1843603018112156127cf57600191846127bd920161262c565b98602090810196950193019190612735565b8280fd5b908092918237016000815290565b9290936108b796959260c0958552602085015265ffffffffffff8092166040850152166060830152151560808201528160a0820152019061208a565b1561282457565b60646040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601760248201527f4141393220696e7465726e616c2063616c6c206f6e6c790000000000000000006044820152fd5b9060406108b79260008152816020820152019061208a565b6040906108b793928152816020820152019061208a565b909291925a936128c230331461281d565b8151946040860151955a6113886060830151890101116129e2576108b7966000958051612909575b50505090612903915a9003608084015101943691610682565b91615047565b612938916129349161292f855173ffffffffffffffffffffffffffffffffffffffff1690565b615c12565b1590565b612944575b80806128ea565b61290392919450612953615c24565b908151612967575b5050600193909161293d565b7f1c4fada7374c0a9ee8841fc38afe82932dc0f8e69012e927f061a8bae611a20173ffffffffffffffffffffffffffffffffffffffff6020870151926129d860206129c6835173ffffffffffffffffffffffffffffffffffffffff1690565b9201519560405193849316968361289a565b0390a3388061295b565b7fdeaddead0000000000000000000000000000000000000000000000000000000060005260206000fd5b612a22612a1c6040830183611fc8565b90615c07565b90612a33612a1c6060830183611fc8565b90612ae9612a48612a1c610120840184611fc8565b60405194859360208501956101008201359260e08301359260c08101359260a08201359260808301359273ffffffffffffffffffffffffffffffffffffffff60208201359135168c9693909a9998959261012098959273ffffffffffffffffffffffffffffffffffffffff6101408a019d168952602089015260408801526060870152608086015260a085015260c084015260e08301526101008201520152565b0391612b1b7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0938481018352826105ab565b51902060408051602081019283523091810191909152466060820152608092830181529091612b4a90826105ab565b51902090565b604051906040820182811067ffffffffffffffff821117612b7b575b60405260006020838281520152565b612b83610505565b612b6c565b906014116103595790601490565b7fffffffffffffffffffffffffffffffffffffffff0000000000000000000000009035818116939260148110612bcb57505050565b60140360031b82901b16169150565b9060c060a06108b793805184526020810151602085015260408101511515604085015265ffffffffffff80606083015116606086015260808201511660808501520151918160a0820152019061208a565b9294612c8c61044d95612c7a610100959998612c68612c54602097610140808c528b0190612bda565b9b878a019060208091805184520151910152565b80516060890152602001516080880152565b805160a08701526020015160c0860152565b73ffffffffffffffffffffffffffffffffffffffff81511660e0850152015191019060208091805184520151910152565b612d0661044d94612cf4612cdf60a0959998969960e0865260e0860190612bda565b98602085019060208091805184520151910152565b80516060840152602001516080830152565b019060208091805184520151910152565b9081602091031261035957516108b781610422565b9160206108b7938181520191612028565b90612d6c73ffffffffffffffffffffffffffffffffffffffff916108b797959694606085526060850191612028565b941660208201526040818503910152612028565b60009060033d11612d8d57565b905060046000803e60005160e01c90565b600060443d106108b7576040517ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc91823d016004833e815167ffffffffffffffff918282113d602484011117612e1a57818401948551938411612e22573d85010160208487010111612e1a57506108b7929101602001906105ab565b949350505050565b50949350505050565b612e386040820182611fc8565b612e50612e448461256d565b93610120810190611fc8565b9290303b1561035957600093612e949160405196879586957f957122ab00000000000000000000000000000000000000000000000000000000875260048701612d3d565b0381305afa9081612f1d575b5061044d576001612eaf612d80565b6308c379a014612ec8575b612ec057565b61044d612183565b612ed0612d9e565b80612edc575b50612eba565b80516000925015612ed657610f21906040519182917f220266b600000000000000000000000000000000000000000000000000000000835260048301612882565b80610f48612f2a9261057b565b38612ea0565b9190612f3b9061317f565b73ffffffffffffffffffffffffffffffffffffffff929183166130da5761306c57612f659061317f565b9116612ffe57612f725750565b604080517f220266b600000000000000000000000000000000000000000000000000000000815260048101929092526024820152602160448201527f41413332207061796d61737465722065787069726564206f72206e6f7420647560648201527f6500000000000000000000000000000000000000000000000000000000000000608482015260a490fd5b610f21826040519182917f220266b600000000000000000000000000000000000000000000000000000000835260048301608091815260406020820152601460408201527f41413334207369676e6174757265206572726f7200000000000000000000000060608201520190565b610f21836040519182917f220266b600000000000000000000000000000000000000000000000000000000835260048301608091815260406020820152601760408201527f414132322065787069726564206f72206e6f742064756500000000000000000060608201520190565b610f21846040519182917f220266b600000000000000000000000000000000000000000000000000000000835260048301608091815260406020820152601460408201527f41413234207369676e6174757265206572726f7200000000000000000000000060608201520190565b9291906131549061317f565b909273ffffffffffffffffffffffffffffffffffffffff808095169116036130da5761306c57612f65905b80156131d25761318e9061535f565b73ffffffffffffffffffffffffffffffffffffffff65ffffffffffff8060408401511642119081156131c2575b5091511691565b90506020830151164210386131bb565b50600090600090565b156131e257565b60646040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601860248201527f41413934206761732076616c756573206f766572666c6f7700000000000000006044820152fd5b916000915a9381519061325382826136b3565b61325c81612a0c565b602084015261329a6effffffffffffffffffffffffffffff60808401516060850151176040850151176101008401359060e0850135171711156131db565b6132a382613775565b6132ae818584613836565b97906132df6129346132d4875173ffffffffffffffffffffffffffffffffffffffff1690565b60208801519061546c565b6133db576132ec43600052565b73ffffffffffffffffffffffffffffffffffffffff61332460a0606097015173ffffffffffffffffffffffffffffffffffffffff1690565b166133c1575b505a810360a0840135106133545760809360c092604087015260608601525a900391013501910152565b6040517f220266b600000000000000000000000000000000000000000000000000000000815280610f21600482016080906000815260406020820152601e60408201527f41413430206f76657220766572696669636174696f6e4761734c696d6974000060608201520190565b909350816133d2929750858461455c565b9590923861332a565b6040517f220266b600000000000000000000000000000000000000000000000000000000815280610f21600482016080906000815260406020820152601a60408201527f4141323520696e76616c6964206163636f756e74206e6f6e636500000000000060608201520190565b9290916000925a825161345b81846136b3565b61346483612a0c565b60208501526134a26effffffffffffffffffffffffffffff60808301516060840151176040840151176101008601359060e0870135171711156131db565b6134ab81613775565b6134b78186868b613ba2565b98906134e86129346134dd865173ffffffffffffffffffffffffffffffffffffffff1690565b60208701519061546c565b6135e0576134f543600052565b73ffffffffffffffffffffffffffffffffffffffff61352d60a0606096015173ffffffffffffffffffffffffffffffffffffffff1690565b166135c5575b505a840360a08601351061355f5750604085015260608401526080919060c0905a900391013501910152565b604080517f220266b600000000000000000000000000000000000000000000000000000000815260048101929092526024820152601e60448201527f41413430206f76657220766572696669636174696f6e4761734c696d697400006064820152608490fd5b909250816135d79298508686856147ef565b96909138613533565b610f21826040519182917f220266b600000000000000000000000000000000000000000000000000000000835260048301608091815260406020820152601a60408201527f4141323520696e76616c6964206163636f756e74206e6f6e636500000000000060608201520190565b1561365557565b60646040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601d60248201527f4141393320696e76616c6964207061796d6173746572416e64446174610000006044820152fd5b613725906136dd6136c38261256d565b73ffffffffffffffffffffffffffffffffffffffff168452565b602081013560208401526080810135604084015260a0810135606084015260c0810135608084015260e081013560c084015261010081013560e0840152610120810190611fc8565b90811561376a5761374f61124c6112468460a09461374a601461044d9998101561364e565b612b88565b73ffffffffffffffffffffffffffffffffffffffff16910152565b505060a06000910152565b60a081015173ffffffffffffffffffffffffffffffffffffffff16156137b75760c060035b60ff60408401519116606084015102016080830151019101510290565b60c0600161379a565b6137d86040929594939560608352606083019061262c565b9460208201520152565b9061044d602f60405180947f414132332072657665727465643a20000000000000000000000000000000000060208301526138268151809260208686019101612067565b810103600f8101855201836105ab565b916000926000925a936139046020835193613865855173ffffffffffffffffffffffffffffffffffffffff1690565b9561387d6138766040830183611fc8565b9084613e0d565b60a086015173ffffffffffffffffffffffffffffffffffffffff16906138a243600052565b85809373ffffffffffffffffffffffffffffffffffffffff809416159889613b3a575b60600151908601516040517f3a871cdd0000000000000000000000000000000000000000000000000000000081529788968795869390600485016137c0565b03938a1690f1829181613b1a575b50613b115750600190613923612d80565b6308c379a014613abd575b50613a50575b613941575b50505a900391565b61396b9073ffffffffffffffffffffffffffffffffffffffff166000526000602052604060002090565b613986610a2c82546dffffffffffffffffffffffffffff1690565b8083116139e3576139dc926dffffffffffffffffffffffffffff9103166dffffffffffffffffffffffffffff167fffffffffffffffffffffffffffffffffffff0000000000000000000000000000825416179055565b3880613939565b6040517f220266b600000000000000000000000000000000000000000000000000000000815280610f21600482016080906000815260406020820152601760408201527f41413231206469646e2774207061792070726566756e6400000000000000000060608201520190565b6040517f220266b600000000000000000000000000000000000000000000000000000000815280610f21600482016080906000815260406020820152601660408201527f4141323320726576657274656420286f72204f4f47290000000000000000000060608201520190565b613ac5612d9e565b9081613ad1575061392e565b610f2191613adf91506137e2565b6040519182917f220266b600000000000000000000000000000000000000000000000000000000835260048301612882565b95506139349050565b613b3391925060203d81116123385761232981836105ab565b9038613912565b9450613b80610a2c613b6c8c73ffffffffffffffffffffffffffffffffffffffff166000526000602052604060002090565b546dffffffffffffffffffffffffffff1690565b8b811115613b975750856060835b969150506138c5565b606087918d03613b8e565b90926000936000935a94613beb6020835193613bd2855173ffffffffffffffffffffffffffffffffffffffff1690565b9561387d613be36040830183611fc8565b90848c61412b565b03938a1690f1829181613ded575b50613de45750600190613c0a612d80565b6308c379a014613d8e575b50613d20575b613c29575b5050505a900391565b613c539073ffffffffffffffffffffffffffffffffffffffff166000526000602052604060002090565b91613c6f610a2c84546dffffffffffffffffffffffffffff1690565b90818311613cba575082547fffffffffffffffffffffffffffffffffffff0000000000000000000000000000169190036dffffffffffffffffffffffffffff16179055388080613c20565b604080517f220266b600000000000000000000000000000000000000000000000000000000815260048101929092526024820152601760448201527f41413231206469646e2774207061792070726566756e640000000000000000006064820152608490fd5b610f21846040519182917f220266b600000000000000000000000000000000000000000000000000000000835260048301608091815260406020820152601660408201527f4141323320726576657274656420286f72204f4f47290000000000000000000060608201520190565b613d96612d9e565b9081613da25750613c15565b8691613dae91506137e2565b90610f216040519283927f220266b60000000000000000000000000000000000000000000000000000000084526004840161289a565b9650613c1b9050565b613e0691925060203d81116123385761232981836105ab565b9038613bf9565b909180613e1957505050565b81515173ffffffffffffffffffffffffffffffffffffffff1692833b6140be57606083510151604051907f570e1a3600000000000000000000000000000000000000000000000000000000825260208280613e78878760048401612d2c565b0381600073ffffffffffffffffffffffffffffffffffffffff95867f0000000000000000000000007fc98430eaedbb6070b35b39d7987250490883481690f19182156140b1575b600092614091575b508082169586156140245716809503613fb7573b15613f4a5761124c6112467fd51a9c61267aa6196961883ecf5ff2da6619c37dac0fa92122513fb32c032d2d93613f1193612b88565b602083810151935160a001516040805173ffffffffffffffffffffffffffffffffffffffff9485168152939091169183019190915290a3565b6040517f220266b600000000000000000000000000000000000000000000000000000000815280610f21600482016080906000815260406020820152602060408201527f4141313520696e6974436f6465206d757374206372656174652073656e64657260608201520190565b6040517f220266b600000000000000000000000000000000000000000000000000000000815280610f21600482016080906000815260406020820152602060408201527f4141313420696e6974436f6465206d7573742072657475726e2073656e64657260608201520190565b6040517f220266b600000000000000000000000000000000000000000000000000000000815280610f21600482016080906000815260406020820152601b60408201527f4141313320696e6974436f6465206661696c6564206f72204f4f47000000000060608201520190565b6140aa91925060203d811161146a5761145b81836105ab565b9038613ec7565b6140b9612183565b613ebf565b6040517f220266b600000000000000000000000000000000000000000000000000000000815280610f21600482016080906000815260406020820152601f60408201527f414131302073656e64657220616c726561647920636f6e73747275637465640060608201520190565b9290918161413a575b50505050565b82515173ffffffffffffffffffffffffffffffffffffffff1693843b6143e257606084510151604051907f570e1a3600000000000000000000000000000000000000000000000000000000825260208280614199888860048401612d2c565b0381600073ffffffffffffffffffffffffffffffffffffffff95867f0000000000000000000000007fc98430eaedbb6070b35b39d7987250490883481690f19182156143d5575b6000926143b5575b5080821696871561434757168096036142d9573b15614273575061124c6112467fd51a9c61267aa6196961883ecf5ff2da6619c37dac0fa92122513fb32c032d2d9361423393612b88565b602083810151935160a001516040805173ffffffffffffffffffffffffffffffffffffffff9485168152939091169183019190915290a338808080614134565b604080517f220266b600000000000000000000000000000000000000000000000000000000815260048101929092526024820152602060448201527f4141313520696e6974436f6465206d757374206372656174652073656e6465726064820152608490fd5b610f21826040519182917f220266b600000000000000000000000000000000000000000000000000000000835260048301608091815260406020820152602060408201527f4141313420696e6974436f6465206d7573742072657475726e2073656e64657260608201520190565b610f21846040519182917f220266b600000000000000000000000000000000000000000000000000000000835260048301608091815260406020820152601b60408201527f4141313320696e6974436f6465206661696c6564206f72204f4f47000000000060608201520190565b6143ce91925060203d811161146a5761145b81836105ab565b90386141e8565b6143dd612183565b6141e0565b604080517f220266b600000000000000000000000000000000000000000000000000000000815260048101929092526024820152601f60448201527f414131302073656e64657220616c726561647920636f6e7374727563746564006064820152608490fd5b1561444f57565b60646040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601f60248201527f4141343120746f6f206c6974746c6520766572696669636174696f6e476173006044820152fd5b919060408382031261035957825167ffffffffffffffff81116103595783019080601f83011215610359578151916144e483610639565b916144f260405193846105ab565b838352602084830101116103595760209261451291848085019101612067565b92015190565b9061044d602f60405180947f414133332072657665727465643a20000000000000000000000000000000000060208301526138268151809260208686019101612067565b93919260609460009460009380519261459b60a08a86015195614580888811614448565b015173ffffffffffffffffffffffffffffffffffffffff1690565b916145c68373ffffffffffffffffffffffffffffffffffffffff166000526000602052604060002090565b946145e2610a2c87546dffffffffffffffffffffffffffff1690565b968588106147825773ffffffffffffffffffffffffffffffffffffffff60208a98946146588a966dffffffffffffffffffffffffffff8b6146919e03166dffffffffffffffffffffffffffff167fffffffffffffffffffffffffffffffffffff0000000000000000000000000000825416179055565b015194604051998a98899788937ff465c77e000000000000000000000000000000000000000000000000000000008552600485016137c0565b0395169103f190818391849361475c575b506147555750506001906146b4612d80565b6308c379a014614733575b506146c657565b6040517f220266b600000000000000000000000000000000000000000000000000000000815280610f21600482016080906000815260406020820152601660408201527f4141333320726576657274656420286f72204f4f47290000000000000000000060608201520190565b61473b612d9e565b908161474757506146bf565b610f2191613adf9150614518565b9450925050565b90925061477b91503d8085833e61477381836105ab565b8101906144ad565b91386146a2565b6040517f220266b600000000000000000000000000000000000000000000000000000000815280610f21600482016080906000815260406020820152601e60408201527f41413331207061796d6173746572206465706f73697420746f6f206c6f77000060608201520190565b91949293909360609560009560009382519061481660a08b84015193614580848611614448565b936148418573ffffffffffffffffffffffffffffffffffffffff166000526000602052604060002090565b61485c610a2c82546dffffffffffffffffffffffffffff1690565b8781106149b7579273ffffffffffffffffffffffffffffffffffffffff60208a989693946146588a966dffffffffffffffffffffffffffff8d6148d69e9c9a03166dffffffffffffffffffffffffffff167fffffffffffffffffffffffffffffffffffff0000000000000000000000000000825416179055565b0395169103f1908183918493614999575b506149915750506001906148f9612d80565b6308c379a014614972575b5061490c5750565b604080517f220266b600000000000000000000000000000000000000000000000000000000815260048101929092526024820152601660448201527f4141333320726576657274656420286f72204f4f4729000000000000000000006064820152608490fd5b61497a612d9e565b90816149865750614904565b613dae925050614518565b955093505050565b9092506149b091503d8085833e61477381836105ab565b91386148e7565b610f218a6040519182917f220266b600000000000000000000000000000000000000000000000000000000835260048301608091815260406020820152601e60408201527f41413331207061796d6173746572206465706f73697420746f6f206c6f77000060608201520190565b60031115614a2f57565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602160045260246000fd5b929190614a7c6040916002865260606020870152606086019061208a565b930152565b939291906003811015614a2f57604091614a7c91865260606020870152606086019061208a565b9061044d603660405180947f4141353020706f73744f702072657665727465643a20000000000000000000006020830152614aec8151809260208686019101612067565b81010360168101855201836105ab565b929190925a93600091805191614b1183615318565b9260a0810195614b35875173ffffffffffffffffffffffffffffffffffffffff1690565b73ffffffffffffffffffffffffffffffffffffffff93908481169081614ca457505050614b76825173ffffffffffffffffffffffffffffffffffffffff1690565b985b5a90030193840297604084019089825110614c37577f49628fd1471006c1482da88028e9ce4dbb080b815c9b0344d39e5a8e6ec1419f94614bc26020928c614c329551039061553a565b015194896020614c04614be9865173ffffffffffffffffffffffffffffffffffffffff1690565b9a5173ffffffffffffffffffffffffffffffffffffffff1690565b9401519785604051968796169a16988590949392606092608083019683521515602083015260408201520152565b0390a4565b6040517f220266b600000000000000000000000000000000000000000000000000000000815280610f21600482016080906000815260406020820152602060408201527f414135312070726566756e642062656c6f772061637475616c476173436f737460608201520190565b9a918051614cb4575b5050614b78565b6060850151600099509091803b15614ddb579189918983614d07956040518097819682957fa9a234090000000000000000000000000000000000000000000000000000000084528c029060048401614a5e565b0393f19081614dc8575b50614dc3576001614d20612d80565b6308c379a014614da4575b614d37575b3880614cad565b6040517f220266b600000000000000000000000000000000000000000000000000000000815280610f21600482016080906000815260406020820152601260408201527f4141353020706f73744f7020726576657274000000000000000000000000000060608201520190565b614dac612d9e565b80614db75750614d2b565b613adf610f2191614aa8565b614d30565b80610f48614dd59261057b565b38614d11565b8980fd5b9392915a90600092805190614df382615318565b9360a0830196614e17885173ffffffffffffffffffffffffffffffffffffffff1690565b73ffffffffffffffffffffffffffffffffffffffff95908681169081614f0d57505050614e58845173ffffffffffffffffffffffffffffffffffffffff1690565b915b5a9003019485029860408301908a825110614ea757507f49628fd1471006c1482da88028e9ce4dbb080b815c9b0344d39e5a8e6ec1419f949392614bc2614c32938c60209451039061553a565b604080517f220266b600000000000000000000000000000000000000000000000000000000815260048101929092526024820152602060448201527f414135312070726566756e642062656c6f772061637475616c476173436f73746064820152608490fd5b93918051614f1d575b5050614e5a565b606087015160009a509091803b1561504357918a918a83614f70956040518097819682957fa9a234090000000000000000000000000000000000000000000000000000000084528c029060048401614a5e565b0393f19081615030575b5061502b576001614f89612d80565b6308c379a01461500e575b614fa0575b3880614f16565b610f218b6040519182917f220266b600000000000000000000000000000000000000000000000000000000835260048301608091815260406020820152601260408201527f4141353020706f73744f7020726576657274000000000000000000000000000060608201520190565b615016612d9e565b806150215750614f94565b613dae8d91614aa8565b614f99565b80610f4861503d9261057b565b38614f7a565b8a80fd5b909392915a9480519161505983615318565b9260a081019561507d875173ffffffffffffffffffffffffffffffffffffffff1690565b73ffffffffffffffffffffffffffffffffffffffff938185169182615165575050506150bd825173ffffffffffffffffffffffffffffffffffffffff1690565b985b5a90030193840297604084019089825110614c37577f49628fd1471006c1482da88028e9ce4dbb080b815c9b0344d39e5a8e6ec1419f946151096020928c614c329551039061553a565b61511288614a25565b015194896020615139614be9865173ffffffffffffffffffffffffffffffffffffffff1690565b940151604080519182529815602082015297880152606087015290821695909116939081906080820190565b9a918151615175575b50506150bf565b8784026151818a614a25565b60028a1461520c576060860151823b15610359576151d493600080948d604051978896879586937fa9a2340900000000000000000000000000000000000000000000000000000000855260048501614a81565b0393f180156151ff575b6151ec575b505b388061516e565b80610f486151f99261057b565b386151e3565b615207612183565b6151de565b6060860151823b156103595761525793600080948d604051978896879586937fa9a2340900000000000000000000000000000000000000000000000000000000855260048501614a81565b0393f19081615305575b50615300576001615270612d80565b6308c379a0146152ed575b156151e5576040517f220266b600000000000000000000000000000000000000000000000000000000815280610f21600482016080906000815260406020820152601260408201527f4141353020706f73744f7020726576657274000000000000000000000000000060608201520190565b6152f5612d9e565b80614db7575061527b565b6151e5565b80610f486153129261057b565b38615261565b60e060c082015191015180821461533c57480180821015615337575090565b905090565b5090565b6040519061534d8261058f565b60006040838281528260208201520152565b615367615340565b5065ffffffffffff808260a01c1680156153b3575b604051926153898461058f565b73ffffffffffffffffffffffffffffffffffffffff8116845260d01c602084015216604082015290565b508061537c565b6153cf6153d5916153c9615340565b5061535f565b9161535f565b9073ffffffffffffffffffffffffffffffffffffffff9182825116928315615461575b65ffffffffffff928391826040816020850151169301511693836040816020840151169201511690808410615459575b50808511615451575b506040519561543f8761058f565b16855216602084015216604082015290565b935038615431565b925038615428565b8151811693506153f8565b73ffffffffffffffffffffffffffffffffffffffff16600052600160205267ffffffffffffffff6154c88260401c60406000209077ffffffffffffffffffffffffffffffffffffffffffffffff16600052602052604060002090565b918254926154d584612491565b9055161490565b9073ffffffffffffffffffffffffffffffffffffffff6154fa612b50565b9216600052600060205263ffffffff600160406000206dffffffffffffffffffffffffffff815460781c1685520154166020830152565b61044d3361562b565b73ffffffffffffffffffffffffffffffffffffffff16600052600060205260406000206dffffffffffffffffffffffffffff8082541692830180931161561e575b8083116155c05761044d92166dffffffffffffffffffffffffffff167fffffffffffffffffffffffffffffffffffff0000000000000000000000000000825416179055565b60646040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601060248201527f6465706f736974206f766572666c6f77000000000000000000000000000000006044820152fd5b615626612190565b61557b565b73ffffffffffffffffffffffffffffffffffffffff9061564b348261553a565b168060005260006020527f2da466a7b24304f47e87fa2e1e5a81b9831ce54fec19055ce277ca2f39ba42c460206dffffffffffffffffffffffffffff60406000205416604051908152a2565b1561569e57565b60646040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601a60248201527f6d757374207370656369667920756e7374616b652064656c61790000000000006044820152fd5b1561570357565b60646040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601c60248201527f63616e6e6f7420646563726561736520756e7374616b652074696d65000000006044820152fd5b1561576857565b60646040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601260248201527f6e6f207374616b652073706563696669656400000000000000000000000000006044820152fd5b156157cd57565b60646040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152600e60248201527f7374616b65206f766572666c6f770000000000000000000000000000000000006044820152fd5b9065ffffffffffff6080600161044d9461588b6dffffffffffffffffffffffffffff86511682906dffffffffffffffffffffffffffff167fffffffffffffffffffffffffffffffffffff0000000000000000000000000000825416179055565b602085015115156eff000000000000000000000000000082549160701b16807fffffffffffffffffffffffffffffffffff00ffffffffffffffffffffffffffff83161783557fffffff000000000000000000000000000000ffffffffffffffffffffffffffff7cffffffffffffffffffffffffffff000000000000000000000000000000604089015160781b16921617178155019263ffffffff6060820151167fffffffffffffffffffffffffffffffffffffffffffffffffffffffff000000008554161784550151167fffffffffffffffffffffffffffffffffffffffffffff000000000000ffffffff69ffffffffffff0000000083549260201b169116179055565b1561599657565b60646040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601160248201527f616c726561647920756e7374616b696e670000000000000000000000000000006044820152fd5b91909165ffffffffffff808094169116019182116121cd57565b15615a1557565b60646040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601460248201527f4e6f207374616b6520746f2077697468647261770000000000000000000000006044820152fd5b15615a7a57565b60646040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601d60248201527f6d7573742063616c6c20756e6c6f636b5374616b6528292066697273740000006044820152fd5b15615adf57565b60646040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601b60248201527f5374616b65207769746864726177616c206973206e6f742064756500000000006044820152fd5b15615b4457565b60646040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601860248201527f6661696c656420746f207769746864726177207374616b6500000000000000006044820152fd5b15615ba957565b60646040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601260248201527f6661696c656420746f20776974686472617700000000000000000000000000006044820152fd5b816040519182372090565b9060009283809360208451940192f190565b3d610800808211615c4b575b50604051906020818301016040528082526000602083013e90565b905038615c3056fea2646970667358221220a706d8b02d7086d80e9330811f5af84b2614abdc5e9a1f2260126070a31d7cee64736f6c63430008110033"; + bytes internal constant SenderCreator_v070Code = + hex"6080600436101561000f57600080fd5b6000803560e01c63570e1a361461002557600080fd5b3461018a5760207ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc36011261018a576004359167ffffffffffffffff9081841161018657366023850112156101865783600401358281116101825736602482870101116101825780601411610182577fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffec810192808411610155577fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0603f81600b8501160116830190838210908211176101555792846024819482600c60209a968b9960405286845289840196603889018837830101525193013560601c5af1908051911561014d575b5073ffffffffffffffffffffffffffffffffffffffff60405191168152f35b90503861012e565b6024857f4e487b710000000000000000000000000000000000000000000000000000000081526041600452fd5b8380fd5b8280fd5b80fdfea26469706673582212207adef8895ad3393b02fab10a111d85ea80ff35366aa43995f4ea20e67f29200664736f6c63430008170033"; + + bytes internal constant EntryPoint_v070Code = + hex"60806040526004361015610024575b361561001957600080fd5b61002233612748565b005b60003560e01c806242dc5314611b0057806301ffc9a7146119ae5780630396cb60146116765780630bd28e3b146115fa5780631b2e01b814611566578063205c2878146113d157806322cdde4c1461136b57806335567e1a146112b35780635287ce12146111a557806370a0823114611140578063765e827f14610e82578063850aaf6214610dc35780639b249f6914610c74578063b760faf914610c3a578063bb9fe6bf14610a68578063c23a5cea146107c4578063dbed18e0146101a15763fc7e286d0361000e573461019c5760207ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc36011261019c5773ffffffffffffffffffffffffffffffffffffffff61013a61229f565b16600052600060205260a0604060002065ffffffffffff6001825492015460405192835260ff8116151560208401526dffffffffffffffffffffffffffff8160081c16604084015263ffffffff8160781c16606084015260981c166080820152f35b600080fd5b3461019c576101af36612317565b906101b86129bd565b60009160005b82811061056f57506101d08493612588565b6000805b8481106102fc5750507fbb47ee3e183a558b1a2ff0874b079f3fc5478b7454eacf2bfc5af2ff5878f972600080a16000809360005b81811061024757610240868660007f575ff3acadd5ab348fe1855e217e0f3678f8d767d7494c9f9fefbee2e17cca4d8180a2613ba7565b6001600255005b6102a261025582848a612796565b73ffffffffffffffffffffffffffffffffffffffff6102766020830161282a565b167f575ff3acadd5ab348fe1855e217e0f3678f8d767d7494c9f9fefbee2e17cca4d600080a2806127d6565b906000915b8083106102b957505050600101610209565b909194976102f36102ed6001926102e78c8b6102e0826102da8e8b8d61269d565b9261265a565b5191613597565b90612409565b99612416565b950191906102a7565b6020610309828789612796565b61031f61031682806127d6565b9390920161282a565b9160009273ffffffffffffffffffffffffffffffffffffffff8091165b8285106103505750505050506001016101d4565b909192939561037f83610378610366848c61265a565b516103728b898b61269d565b856129f6565b9290613dd7565b9116840361050a576104a5576103958491613dd7565b9116610440576103b5576103aa600191612416565b96019392919061033c565b60a487604051907f220266b6000000000000000000000000000000000000000000000000000000008252600482015260406024820152602160448201527f41413332207061796d61737465722065787069726564206f72206e6f7420647560648201527f65000000000000000000000000000000000000000000000000000000000000006084820152fd5b608488604051907f220266b6000000000000000000000000000000000000000000000000000000008252600482015260406024820152601460448201527f41413334207369676e6174757265206572726f720000000000000000000000006064820152fd5b608488604051907f220266b6000000000000000000000000000000000000000000000000000000008252600482015260406024820152601760448201527f414132322065787069726564206f72206e6f74206475650000000000000000006064820152fd5b608489604051907f220266b6000000000000000000000000000000000000000000000000000000008252600482015260406024820152601460448201527f41413234207369676e6174757265206572726f720000000000000000000000006064820152fd5b61057a818487612796565b9361058585806127d6565b919095602073ffffffffffffffffffffffffffffffffffffffff6105aa82840161282a565b1697600192838a1461076657896105da575b5050505060019293949550906105d191612409565b939291016101be565b8060406105e892019061284b565b918a3b1561019c57929391906040519485937f2dd8113300000000000000000000000000000000000000000000000000000000855288604486016040600488015252606490818601918a60051b8701019680936000915b8c83106106e657505050505050838392610684927ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc8560009803016024860152612709565b03818a5afa90816106d7575b506106c657602486604051907f86a9f7500000000000000000000000000000000000000000000000000000000082526004820152fd5b93945084936105d1600189806105bc565b6106e0906121bd565b88610690565b91939596977fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff9c908a9294969a0301865288357ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffee18336030181121561019c57836107538793858394016128ec565b9a0196019301909189979695949261063f565b606483604051907f08c379a00000000000000000000000000000000000000000000000000000000082526004820152601760248201527f4141393620696e76616c69642061676772656761746f720000000000000000006044820152fd5b3461019c576020807ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc36011261019c576107fc61229f565b33600052600082526001604060002001908154916dffffffffffffffffffffffffffff8360081c16928315610a0a5765ffffffffffff8160981c1680156109ac57421061094e5760009373ffffffffffffffffffffffffffffffffffffffff859485947fffffffffffffff000000000000000000000000000000000000000000000000ff86951690556040517fb7c918e0e249f999e965cafeb6c664271b3f4317d296461500e71da39f0cbda33391806108da8786836020909392919373ffffffffffffffffffffffffffffffffffffffff60408201951681520152565b0390a2165af16108e8612450565b50156108f057005b606490604051907f08c379a00000000000000000000000000000000000000000000000000000000082526004820152601860248201527f6661696c656420746f207769746864726177207374616b6500000000000000006044820152fd5b606485604051907f08c379a00000000000000000000000000000000000000000000000000000000082526004820152601b60248201527f5374616b65207769746864726177616c206973206e6f742064756500000000006044820152fd5b606486604051907f08c379a00000000000000000000000000000000000000000000000000000000082526004820152601d60248201527f6d7573742063616c6c20756e6c6f636b5374616b6528292066697273740000006044820152fd5b606485604051907f08c379a00000000000000000000000000000000000000000000000000000000082526004820152601460248201527f4e6f207374616b6520746f2077697468647261770000000000000000000000006044820152fd5b3461019c5760007ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc36011261019c573360005260006020526001604060002001805463ffffffff8160781c16908115610bdc5760ff1615610b7e5765ffffffffffff908142160191818311610b4f5780547fffffffffffffff000000000000ffffffffffffffffffffffffffffffffffff001678ffffffffffff00000000000000000000000000000000000000609885901b161790556040519116815233907ffa9b3c14cc825c412c9ed81b3ba365a5b459439403f18829e572ed53a4180f0a90602090a2005b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b60646040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601160248201527f616c726561647920756e7374616b696e670000000000000000000000000000006044820152fd5b60646040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152600a60248201527f6e6f74207374616b6564000000000000000000000000000000000000000000006044820152fd5b60207ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc36011261019c57610022610c6f61229f565b612748565b3461019c5760207ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc36011261019c5760043567ffffffffffffffff811161019c576020610cc8610d1b9236906004016122c2565b919073ffffffffffffffffffffffffffffffffffffffff9260405194859283927f570e1a360000000000000000000000000000000000000000000000000000000084528560048501526024840191612709565b03816000857f000000000000000000000000efc2c1444ebcc4db75e7613d20c6a62ff67a167c165af1908115610db757602492600092610d86575b50604051917f6ca7b806000000000000000000000000000000000000000000000000000000008352166004820152fd5b610da991925060203d602011610db0575b610da181836121ed565b8101906126dd565b9083610d56565b503d610d97565b6040513d6000823e3d90fd5b3461019c5760407ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc36011261019c57610dfa61229f565b60243567ffffffffffffffff811161019c57600091610e1e839236906004016122c2565b90816040519283928337810184815203915af4610e39612450565b90610e7e6040519283927f99410554000000000000000000000000000000000000000000000000000000008452151560048401526040602484015260448301906123c6565b0390fd5b3461019c57610e9036612317565b610e9b9291926129bd565b610ea483612588565b60005b848110610f1c57506000927fbb47ee3e183a558b1a2ff0874b079f3fc5478b7454eacf2bfc5af2ff5878f972600080a16000915b858310610eec576102408585613ba7565b909193600190610f12610f0087898761269d565b610f0a888661265a565b519088613597565b0194019190610edb565b610f47610f40610f2e8385979561265a565b51610f3a84898761269d565b846129f6565b9190613dd7565b73ffffffffffffffffffffffffffffffffffffffff929183166110db5761107657610f7190613dd7565b911661101157610f8657600101929092610ea7565b60a490604051907f220266b6000000000000000000000000000000000000000000000000000000008252600482015260406024820152602160448201527f41413332207061796d61737465722065787069726564206f72206e6f7420647560648201527f65000000000000000000000000000000000000000000000000000000000000006084820152fd5b608482604051907f220266b6000000000000000000000000000000000000000000000000000000008252600482015260406024820152601460448201527f41413334207369676e6174757265206572726f720000000000000000000000006064820152fd5b608483604051907f220266b6000000000000000000000000000000000000000000000000000000008252600482015260406024820152601760448201527f414132322065787069726564206f72206e6f74206475650000000000000000006064820152fd5b608484604051907f220266b6000000000000000000000000000000000000000000000000000000008252600482015260406024820152601460448201527f41413234207369676e6174757265206572726f720000000000000000000000006064820152fd5b3461019c5760207ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc36011261019c5773ffffffffffffffffffffffffffffffffffffffff61118c61229f565b1660005260006020526020604060002054604051908152f35b3461019c5760207ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc36011261019c5773ffffffffffffffffffffffffffffffffffffffff6111f161229f565b6000608060405161120181612155565b828152826020820152826040820152826060820152015216600052600060205260a06040600020608060405161123681612155565b6001835493848352015490602081019060ff8316151582526dffffffffffffffffffffffffffff60408201818560081c16815263ffffffff936060840193858760781c16855265ffffffffffff978891019660981c1686526040519788525115156020880152511660408601525116606084015251166080820152f35b3461019c5760407ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc36011261019c5760206112ec61229f565b73ffffffffffffffffffffffffffffffffffffffff6113096122f0565b911660005260018252604060002077ffffffffffffffffffffffffffffffffffffffffffffffff821660005282526040600020547fffffffffffffffffffffffffffffffffffffffffffffffff00000000000000006040519260401b16178152f35b3461019c577ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc60208136011261019c576004359067ffffffffffffffff821161019c5761012090823603011261019c576113c9602091600401612480565b604051908152f35b3461019c5760407ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc36011261019c5761140861229f565b60243590336000526000602052604060002090815491828411611508576000808573ffffffffffffffffffffffffffffffffffffffff8295839561144c848a612443565b90556040805173ffffffffffffffffffffffffffffffffffffffff831681526020810185905233917fd1c19fbcd4551a5edfb66d43d2e337c04837afda3482b42bdf569a8fccdae5fb91a2165af16114a2612450565b50156114aa57005b60646040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601260248201527f6661696c656420746f20776974686472617700000000000000000000000000006044820152fd5b60646040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601960248201527f576974686472617720616d6f756e7420746f6f206c61726765000000000000006044820152fd5b3461019c5760407ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc36011261019c5761159d61229f565b73ffffffffffffffffffffffffffffffffffffffff6115ba6122f0565b9116600052600160205277ffffffffffffffffffffffffffffffffffffffffffffffff604060002091166000526020526020604060002054604051908152f35b3461019c5760207ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc36011261019c5760043577ffffffffffffffffffffffffffffffffffffffffffffffff811680910361019c5733600052600160205260406000209060005260205260406000206116728154612416565b9055005b6020807ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc36011261019c5760043563ffffffff9182821680920361019c5733600052600081526040600020928215611950576001840154908160781c1683106118f2576116f86dffffffffffffffffffffffffffff9182349160081c16612409565b93841561189457818511611836579065ffffffffffff61180592546040519061172082612155565b8152848101926001845260408201908816815260608201878152600160808401936000855233600052600089526040600020905181550194511515917fffffffffffffffffffffffffff0000000000000000000000000000000000000060ff72ffffffff0000000000000000000000000000006effffffffffffffffffffffffffff008954945160081b16945160781b1694169116171717835551167fffffffffffffff000000000000ffffffffffffffffffffffffffffffffffffff78ffffffffffff0000000000000000000000000000000000000083549260981b169116179055565b6040519283528201527fa5ae833d0bb1dcd632d98a8b70973e8516812898e19bf27b70071ebc8dc52c0160403392a2005b606483604051907f08c379a00000000000000000000000000000000000000000000000000000000082526004820152600e60248201527f7374616b65206f766572666c6f770000000000000000000000000000000000006044820152fd5b606483604051907f08c379a00000000000000000000000000000000000000000000000000000000082526004820152601260248201527f6e6f207374616b652073706563696669656400000000000000000000000000006044820152fd5b606482604051907f08c379a00000000000000000000000000000000000000000000000000000000082526004820152601c60248201527f63616e6e6f7420646563726561736520756e7374616b652074696d65000000006044820152fd5b606482604051907f08c379a00000000000000000000000000000000000000000000000000000000082526004820152601a60248201527f6d757374207370656369667920756e7374616b652064656c61790000000000006044820152fd5b3461019c5760207ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc36011261019c576004357fffffffff00000000000000000000000000000000000000000000000000000000811680910361019c57807f60fc6b6e0000000000000000000000000000000000000000000000000000000060209214908115611ad6575b8115611aac575b8115611a82575b8115611a58575b506040519015158152f35b7f01ffc9a70000000000000000000000000000000000000000000000000000000091501482611a4d565b7f3e84f0210000000000000000000000000000000000000000000000000000000081149150611a46565b7fcf28ef970000000000000000000000000000000000000000000000000000000081149150611a3f565b7f915074d80000000000000000000000000000000000000000000000000000000081149150611a38565b3461019c576102007ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc36011261019c5767ffffffffffffffff60043581811161019c573660238201121561019c57611b62903690602481600401359101612268565b7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffdc36016101c0811261019c5761014060405191611b9e83612155565b1261019c5760405192611bb0846121a0565b60243573ffffffffffffffffffffffffffffffffffffffff8116810361019c578452602093604435858201526064356040820152608435606082015260a435608082015260c43560a082015260e43560c08201526101043573ffffffffffffffffffffffffffffffffffffffff8116810361019c5760e08201526101243561010082015261014435610120820152825261016435848301526101843560408301526101a43560608301526101c43560808301526101e43590811161019c57611c7c9036906004016122c2565b905a3033036120f7578351606081015195603f5a0260061c61271060a0840151890101116120ce5760009681519182611ff0575b5050505090611cca915a9003608085015101923691612268565b925a90600094845193611cdc85613ccc565b9173ffffffffffffffffffffffffffffffffffffffff60e0870151168015600014611ea957505073ffffffffffffffffffffffffffffffffffffffff855116935b5a9003019360a06060820151910151016080860151850390818111611e95575b50508302604085015192818410600014611dce5750506003811015611da157600203611d79576113c99293508093611d7481613d65565b613cf6565b5050507fdeadaa51000000000000000000000000000000000000000000000000000000008152fd5b6024857f4e487b710000000000000000000000000000000000000000000000000000000081526021600452fd5b81611dde92979396940390613c98565b506003841015611e6857507f49628fd1471006c1482da88028e9ce4dbb080b815c9b0344d39e5a8e6ec1419f60808683015192519473ffffffffffffffffffffffffffffffffffffffff865116948873ffffffffffffffffffffffffffffffffffffffff60e0890151169701519160405192835215898301528760408301526060820152a46113c9565b807f4e487b7100000000000000000000000000000000000000000000000000000000602492526021600452fd5b6064919003600a0204909301928780611d3d565b8095918051611eba575b5050611d1d565b6003861015611fc1576002860315611eb35760a088015190823b1561019c57600091611f2491836040519586809581947f7c627b210000000000000000000000000000000000000000000000000000000083528d60048401526080602484015260848301906123c6565b8b8b0260448301528b60648301520393f19081611fad575b50611fa65787893d610800808211611f9e575b506040519282828501016040528184528284013e610e7e6040519283927fad7954bc000000000000000000000000000000000000000000000000000000008452600484015260248301906123c6565b905083611f4f565b8980611eb3565b611fb89199506121bd565b6000978a611f3c565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602160045260246000fd5b91600092918380938c73ffffffffffffffffffffffffffffffffffffffff885116910192f115612023575b808080611cb0565b611cca929195503d6108008082116120c6575b5060405190888183010160405280825260008983013e805161205f575b5050600194909161201b565b7f1c4fada7374c0a9ee8841fc38afe82932dc0f8e69012e927f061a8bae611a20188870151918973ffffffffffffffffffffffffffffffffffffffff8551169401516120bc604051928392835260408d84015260408301906123c6565b0390a38680612053565b905088612036565b877fdeaddead000000000000000000000000000000000000000000000000000000006000526000fd5b606486604051907f08c379a00000000000000000000000000000000000000000000000000000000082526004820152601760248201527f4141393220696e7465726e616c2063616c6c206f6e6c790000000000000000006044820152fd5b60a0810190811067ffffffffffffffff82111761217157604052565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b610140810190811067ffffffffffffffff82111761217157604052565b67ffffffffffffffff811161217157604052565b6060810190811067ffffffffffffffff82111761217157604052565b90601f7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0910116810190811067ffffffffffffffff82111761217157604052565b67ffffffffffffffff811161217157601f017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe01660200190565b9291926122748261222e565b9161228260405193846121ed565b82948184528183011161019c578281602093846000960137010152565b6004359073ffffffffffffffffffffffffffffffffffffffff8216820361019c57565b9181601f8401121561019c5782359167ffffffffffffffff831161019c576020838186019501011161019c57565b6024359077ffffffffffffffffffffffffffffffffffffffffffffffff8216820361019c57565b9060407ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc83011261019c5760043567ffffffffffffffff9283821161019c578060238301121561019c57816004013593841161019c5760248460051b8301011161019c57602401919060243573ffffffffffffffffffffffffffffffffffffffff8116810361019c5790565b60005b8381106123b65750506000910152565b81810151838201526020016123a6565b907fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0601f602093612402815180928187528780880191016123a3565b0116010190565b91908201809211610b4f57565b7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff8114610b4f5760010190565b91908203918211610b4f57565b3d1561247b573d906124618261222e565b9161246f60405193846121ed565b82523d6000602084013e565b606090565b604061248e8183018361284b565b90818351918237206124a3606084018461284b565b90818451918237209260c06124bb60e083018361284b565b908186519182372091845195602087019473ffffffffffffffffffffffffffffffffffffffff833516865260208301358789015260608801526080870152608081013560a087015260a081013582870152013560e08501526101009081850152835261012083019167ffffffffffffffff918484108385111761217157838252845190206101408501908152306101608601524661018086015260608452936101a00191821183831017612171575251902090565b67ffffffffffffffff81116121715760051b60200190565b9061259282612570565b6040906125a260405191826121ed565b8381527fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe06125d08295612570565b019160005b8381106125e25750505050565b60209082516125f081612155565b83516125fb816121a0565b600081526000849181838201528187820152816060818184015260809282848201528260a08201528260c08201528260e082015282610100820152826101208201528652818587015281898701528501528301528286010152016125d5565b805182101561266e5760209160051b010190565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b919081101561266e5760051b810135907ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffee18136030182121561019c570190565b9081602091031261019c575173ffffffffffffffffffffffffffffffffffffffff8116810361019c5790565b601f82602094937fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0938186528686013760008582860101520116010190565b7f2da466a7b24304f47e87fa2e1e5a81b9831ce54fec19055ce277ca2f39ba42c4602073ffffffffffffffffffffffffffffffffffffffff61278a3485613c98565b936040519485521692a2565b919081101561266e5760051b810135907fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffa18136030182121561019c570190565b9035907fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe18136030182121561019c570180359067ffffffffffffffff821161019c57602001918160051b3603831361019c57565b3573ffffffffffffffffffffffffffffffffffffffff8116810361019c5790565b9035907fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe18136030182121561019c570180359067ffffffffffffffff821161019c5760200191813603831361019c57565b90357fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe18236030181121561019c57016020813591019167ffffffffffffffff821161019c57813603831361019c57565b61012091813573ffffffffffffffffffffffffffffffffffffffff811680910361019c576129626129476129ba9561299b93855260208601356020860152612937604087018761289c565b9091806040880152860191612709565b612954606086018661289c565b908583036060870152612709565b6080840135608084015260a084013560a084015260c084013560c084015261298d60e085018561289c565b9084830360e0860152612709565b916129ac610100918281019061289c565b929091818503910152612709565b90565b60028054146129cc5760028055565b60046040517f3ee5aeb5000000000000000000000000000000000000000000000000000000008152fd5b926000905a93805194843573ffffffffffffffffffffffffffffffffffffffff811680910361019c5786526020850135602087015260808501356fffffffffffffffffffffffffffffffff90818116606089015260801c604088015260a086013560c088015260c086013590811661010088015260801c610120870152612a8060e086018661284b565b801561357b576034811061351d578060141161019c578060241161019c5760341161019c57602481013560801c60a0880152601481013560801c60808801523560601c60e08701525b612ad285612480565b60208301526040860151946effffffffffffffffffffffffffffff8660c08901511760608901511760808901511760a0890151176101008901511761012089015117116134bf57604087015160608801510160808801510160a08801510160c0880151016101008801510296835173ffffffffffffffffffffffffffffffffffffffff81511690612b66604085018561284b565b806131e4575b505060e0015173ffffffffffffffffffffffffffffffffffffffff1690600082156131ac575b6020612bd7918b828a01516000868a604051978896879586937f19822f7c00000000000000000000000000000000000000000000000000000000855260048501613db5565b0393f160009181613178575b50612c8b573d8c610800808311612c83575b50604051916020818401016040528083526000602084013e610e7e6040519283927f65c8fd4d000000000000000000000000000000000000000000000000000000008452600484015260606024840152600d60648401527f4141323320726576657274656400000000000000000000000000000000000000608484015260a0604484015260a48301906123c6565b915082612bf5565b9a92939495969798999a91156130f2575b509773ffffffffffffffffffffffffffffffffffffffff835116602084015190600052600160205260406000208160401c60005260205267ffffffffffffffff604060002091825492612cee84612416565b9055160361308d575a8503116130285773ffffffffffffffffffffffffffffffffffffffff60e0606093015116612d42575b509060a09184959697986040608096015260608601520135905a900301910152565b969550505a9683519773ffffffffffffffffffffffffffffffffffffffff60e08a01511680600052600060205260406000208054848110612fc3576080612dcd9a9b9c600093878094039055015192602089015183604051809d819582947f52b7512c0000000000000000000000000000000000000000000000000000000084528c60048501613db5565b039286f1978860009160009a612f36575b50612e86573d8b610800808311612e7e575b50604051916020818401016040528083526000602084013e610e7e6040519283927f65c8fd4d000000000000000000000000000000000000000000000000000000008452600484015260606024840152600d60648401527f4141333320726576657274656400000000000000000000000000000000000000608484015260a0604484015260a48301906123c6565b915082612df0565b9991929394959697989998925a900311612eab57509096959094939291906080612d20565b60a490604051907f220266b6000000000000000000000000000000000000000000000000000000008252600482015260406024820152602760448201527f41413336206f766572207061796d6173746572566572696669636174696f6e4760648201527f61734c696d6974000000000000000000000000000000000000000000000000006084820152fd5b915098503d90816000823e612f4b82826121ed565b604081838101031261019c5780519067ffffffffffffffff821161019c57828101601f83830101121561019c578181015191612f868361222e565b93612f9460405195866121ed565b838552820160208483850101011161019c57602092612fba9184808701918501016123a3565b01519838612dde565b60848b604051907f220266b6000000000000000000000000000000000000000000000000000000008252600482015260406024820152601e60448201527f41413331207061796d6173746572206465706f73697420746f6f206c6f7700006064820152fd5b608490604051907f220266b6000000000000000000000000000000000000000000000000000000008252600482015260406024820152601e60448201527f41413236206f76657220766572696669636174696f6e4761734c696d697400006064820152fd5b608482604051907f220266b6000000000000000000000000000000000000000000000000000000008252600482015260406024820152601a60448201527f4141323520696e76616c6964206163636f756e74206e6f6e63650000000000006064820152fd5b600052600060205260406000208054808c11613113578b9003905538612c9c565b608484604051907f220266b6000000000000000000000000000000000000000000000000000000008252600482015260406024820152601760448201527f41413231206469646e2774207061792070726566756e640000000000000000006064820152fd5b9091506020813d6020116131a4575b81613194602093836121ed565b8101031261019c57519038612be3565b3d9150613187565b508060005260006020526040600020548a81116000146131d75750612bd7602060005b915050612b92565b6020612bd7918c036131cf565b833b61345a57604088510151602060405180927f570e1a360000000000000000000000000000000000000000000000000000000082528260048301528160008161323260248201898b612709565b039273ffffffffffffffffffffffffffffffffffffffff7f000000000000000000000000efc2c1444ebcc4db75e7613d20c6a62ff67a167c1690f1908115610db75760009161343b575b5073ffffffffffffffffffffffffffffffffffffffff811680156133d6578503613371573b1561330c5760141161019c5773ffffffffffffffffffffffffffffffffffffffff9183887fd51a9c61267aa6196961883ecf5ff2da6619c37dac0fa92122513fb32c032d2d604060e0958787602086015195510151168251913560601c82526020820152a391612b6c565b60848d604051907f220266b6000000000000000000000000000000000000000000000000000000008252600482015260406024820152602060448201527f4141313520696e6974436f6465206d757374206372656174652073656e6465726064820152fd5b60848e604051907f220266b6000000000000000000000000000000000000000000000000000000008252600482015260406024820152602060448201527f4141313420696e6974436f6465206d7573742072657475726e2073656e6465726064820152fd5b60848f604051907f220266b6000000000000000000000000000000000000000000000000000000008252600482015260406024820152601b60448201527f4141313320696e6974436f6465206661696c6564206f72204f4f4700000000006064820152fd5b613454915060203d602011610db057610da181836121ed565b3861327c565b60848d604051907f220266b6000000000000000000000000000000000000000000000000000000008252600482015260406024820152601f60448201527f414131302073656e64657220616c726561647920636f6e7374727563746564006064820152fd5b60646040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601860248201527f41413934206761732076616c756573206f766572666c6f7700000000000000006044820152fd5b60646040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601d60248201527f4141393320696e76616c6964207061796d6173746572416e64446174610000006044820152fd5b5050600060e087015260006080870152600060a0870152612ac9565b9092915a906060810151916040928351967fffffffff00000000000000000000000000000000000000000000000000000000886135d7606084018461284b565b600060038211613b9f575b7f8dd7712f0000000000000000000000000000000000000000000000000000000094168403613a445750505061379d6000926136b292602088015161363a8a5193849360208501528b602485015260648401906128ec565b90604483015203906136727fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0928381018352826121ed565b61379189519485927e42dc5300000000000000000000000000000000000000000000000000000000602085015261020060248501526102248401906123c6565b613760604484018b60806101a091805173ffffffffffffffffffffffffffffffffffffffff808251168652602082015160208701526040820151604087015260608201516060870152838201518487015260a082015160a087015260c082015160c087015260e08201511660e0860152610100808201519086015261012080910151908501526020810151610140850152604081015161016085015260608101516101808501520151910152565b7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffdc83820301610204840152876123c6565b039081018352826121ed565b6020918183809351910182305af1600051988652156137bf575b505050505050565b909192939495965060003d8214613a3a575b7fdeaddead00000000000000000000000000000000000000000000000000000000810361385b57608487878051917f220266b600000000000000000000000000000000000000000000000000000000835260048301526024820152600f60448201527f41413935206f7574206f662067617300000000000000000000000000000000006064820152fd5b7fdeadaa510000000000000000000000000000000000000000000000000000000091929395949650146000146138c55750506138a961389e6138b8935a90612443565b608085015190612409565b9083015183611d748295613d65565b905b3880808080806137b7565b909261395290828601518651907ff62676f440ff169a3a9afdbf812e89e7f95975ee8e5c31214ffdef631c5f479273ffffffffffffffffffffffffffffffffffffffff9580878551169401516139483d610800808211613a32575b508a519084818301018c5280825260008583013e8a805194859485528401528a8301906123c6565b0390a35a90612443565b916139636080860193845190612409565b926000905a94829488519761397789613ccc565b948260e08b0151168015600014613a1857505050875116955b5a9003019560a06060820151910151019051860390818111613a04575b5050840290850151928184106000146139de57505080611e68575090816139d89293611d7481613d65565b906138ba565b6139ee9082849397950390613c98565b50611e68575090826139ff92613cf6565b6139d8565b6064919003600a02049094019338806139ad565b90919892509751613a2a575b50613990565b955038613a24565b905038613920565b8181803e516137d1565b613b97945082935090613a8c917e42dc53000000000000000000000000000000000000000000000000000000006020613b6b9501526102006024860152610224850191612709565b613b3a604484018860806101a091805173ffffffffffffffffffffffffffffffffffffffff808251168652602082015160208701526040820151604087015260608201516060870152838201518487015260a082015160a087015260c082015160c087015260e08201511660e0860152610100808201519086015261012080910151908501526020810151610140850152604081015161016085015260608101516101808501520151910152565b7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffdc83820301610204840152846123c6565b037fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe081018952886121ed565b60008761379d565b5081356135e2565b73ffffffffffffffffffffffffffffffffffffffff168015613c3a57600080809381935af1613bd4612450565b5015613bdc57565b60646040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601f60248201527f41413931206661696c65642073656e6420746f2062656e6566696369617279006044820152fd5b60646040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601860248201527f4141393020696e76616c69642062656e656669636961727900000000000000006044820152fd5b73ffffffffffffffffffffffffffffffffffffffff166000526000602052613cc66040600020918254612409565b80915590565b610120610100820151910151808214613cf257480180821015613ced575090565b905090565b5090565b9190917f49628fd1471006c1482da88028e9ce4dbb080b815c9b0344d39e5a8e6ec1419f6080602083015192519473ffffffffffffffffffffffffffffffffffffffff946020868851169660e089015116970151916040519283526000602084015260408301526060820152a4565b60208101519051907f67b4fa9642f42120bf031f3051d1824b0fe25627945b27b8a6a65d5761d5482e60208073ffffffffffffffffffffffffffffffffffffffff855116940151604051908152a3565b613dcd604092959493956060835260608301906128ec565b9460208201520152565b8015613e6457600060408051613dec816121d1565b828152826020820152015273ffffffffffffffffffffffffffffffffffffffff811690604065ffffffffffff91828160a01c16908115613e5c575b60d01c92825191613e37836121d1565b8583528460208401521691829101524211908115613e5457509091565b905042109091565b839150613e27565b5060009060009056fea2646970667358221220b094fd69f04977ae9458e5ba422d01cd2d20dbcfca0992ff37f19aa07deec25464736f6c63430008170033"; + + bytes internal constant CreateXCode = + hex"60806040526004361061018a5760003560e01c806381503da1116100d6578063d323826a1161007f578063e96deee411610059578063e96deee414610395578063f5745aba146103a8578063f9664498146103bb57600080fd5b8063d323826a1461034f578063ddda0acb1461036f578063e437252a1461038257600080fd5b80639c36a286116100b05780639c36a28614610316578063a7db93f214610329578063c3fe107b1461033c57600080fd5b806381503da1146102d0578063890c283b146102e357806398e810771461030357600080fd5b80632f990e3f116101385780636cec2536116101125780636cec25361461027d57806374637a7a1461029d5780637f565360146102bd57600080fd5b80632f990e3f1461023757806331a7c8c81461024a57806342d654fc1461025d57600080fd5b806327fe18221161016957806327fe1822146101f15780632852527a1461020457806328ddd0461461021757600080fd5b8062d84acb1461018f57806326307668146101cb57806326a32fc7146101de575b600080fd5b6101a261019d366004612915565b6103ce565b60405173ffffffffffffffffffffffffffffffffffffffff909116815260200160405180910390f35b6101a26101d9366004612994565b6103e6565b6101a26101ec3660046129db565b610452565b6101a26101ff3660046129db565b6104de565b6101a2610212366004612a39565b610539565b34801561022357600080fd5b506101a2610232366004612a90565b6106fe565b6101a2610245366004612aa9565b61072a565b6101a2610258366004612aa9565b6107bb565b34801561026957600080fd5b506101a2610278366004612b1e565b6107c9565b34801561028957600080fd5b506101a2610298366004612a90565b610823565b3480156102a957600080fd5b506101a26102b8366004612b4a565b61084f565b6101a26102cb3660046129db565b611162565b6101a26102de366004612b74565b6111e8565b3480156102ef57600080fd5b506101a26102fe366004612bac565b611276565b6101a2610311366004612bce565b6112a3565b6101a2610324366004612994565b611505565b6101a2610337366004612c49565b6116f1565b6101a261034a366004612aa9565b611964565b34801561035b57600080fd5b506101a261036a366004612cd9565b6119ed565b6101a261037d366004612c49565b611a17565b6101a2610390366004612bce565b611e0c565b6101a26103a3366004612915565b611e95565b6101a26103b6366004612bce565b611ea4565b6101a26103c9366004612b74565b611f2d565b60006103dd8585858533611a17565b95945050505050565b6000806103f2846120db565b90508083516020850134f59150610408826123d3565b604051819073ffffffffffffffffffffffffffffffffffffffff8416907fb8fda7e00c6b06a2b54e58521bc5894fee35f1090e5a3bb6390bfe2b98b497f790600090a35092915050565b60006104d86104d260408051437fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe08101406020830152419282019290925260608101919091524260808201524460a08201524660c08201523360e08201526000906101000160405160208183030381529060405280519060200120905090565b836103e6565b92915050565b600081516020830134f090506104f3816123d3565b60405173ffffffffffffffffffffffffffffffffffffffff8216907f4db17dd5e4732fb6da34a148104a592783ca119a1e7bb8829eba6cbadef0b51190600090a2919050565b600080610545856120db565b905060008460601b90506040517f3d602d80600a3d3981f3363d3d373d3d3d363d7300000000000000000000000081528160148201527f5af43d82803e903d91602b57fd5bf300000000000000000000000000000000006028820152826037826000f593505073ffffffffffffffffffffffffffffffffffffffff8316610635576040517fc05cee7a00000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff7f000000000000000000000000ba5ed099633d3b313e4d5f7bdc1305d3c28ba5ed1660048201526024015b60405180910390fd5b604051829073ffffffffffffffffffffffffffffffffffffffff8516907fb8fda7e00c6b06a2b54e58521bc5894fee35f1090e5a3bb6390bfe2b98b497f790600090a36000808473ffffffffffffffffffffffffffffffffffffffff1634876040516106a19190612d29565b60006040518083038185875af1925050503d80600081146106de576040519150601f19603f3d011682016040523d82523d6000602084013e6106e3565b606091505b50915091506106f382828961247d565b505050509392505050565b60006104d87f000000000000000000000000ba5ed099633d3b313e4d5f7bdc1305d3c28ba5ed8361084f565b60006107b36107aa60408051437fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe08101406020830152419282019290925260608101919091524260808201524460a08201524660c08201523360e08201526000906101000160405160208183030381529060405280519060200120905090565b85858533611a17565b949350505050565b60006107b3848484336112a3565b60006040518260005260ff600b53836020527f21c35dbe1b344a2488cf3321d6ce542f8e9f305544ff09e4993a62319a497c1f6040526055600b20601452806040525061d694600052600160345350506017601e20919050565b60006104d8827f000000000000000000000000ba5ed099633d3b313e4d5f7bdc1305d3c28ba5ed6107c9565b600060607f9400000000000000000000000000000000000000000000000000000000000000610887600167ffffffffffffffff612d45565b67ffffffffffffffff16841115610902576040517f3c55ab3b00000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff7f000000000000000000000000ba5ed099633d3b313e4d5f7bdc1305d3c28ba5ed16600482015260240161062c565b836000036109c7576040517fd60000000000000000000000000000000000000000000000000000000000000060208201527fff00000000000000000000000000000000000000000000000000000000000000821660218201527fffffffffffffffffffffffffffffffffffffffff000000000000000000000000606087901b1660228201527f800000000000000000000000000000000000000000000000000000000000000060368201526037015b6040516020818303038152906040529150611152565b607f8411610a60576040517fd60000000000000000000000000000000000000000000000000000000000000060208201527fff0000000000000000000000000000000000000000000000000000000000000080831660218301527fffffffffffffffffffffffffffffffffffffffff000000000000000000000000606088901b16602283015260f886901b1660368201526037016109b1565b60ff8411610b1f576040517fd70000000000000000000000000000000000000000000000000000000000000060208201527fff0000000000000000000000000000000000000000000000000000000000000080831660218301527fffffffffffffffffffffffffffffffffffffffff000000000000000000000000606088901b1660228301527f8100000000000000000000000000000000000000000000000000000000000000603683015260f886901b1660378201526038016109b1565b61ffff8411610bff576040517fd80000000000000000000000000000000000000000000000000000000000000060208201527fff00000000000000000000000000000000000000000000000000000000000000821660218201527fffffffffffffffffffffffffffffffffffffffff000000000000000000000000606087901b1660228201527f820000000000000000000000000000000000000000000000000000000000000060368201527fffff00000000000000000000000000000000000000000000000000000000000060f086901b1660378201526039016109b1565b62ffffff8411610ce0576040517fd90000000000000000000000000000000000000000000000000000000000000060208201527fff00000000000000000000000000000000000000000000000000000000000000821660218201527fffffffffffffffffffffffffffffffffffffffff000000000000000000000000606087901b1660228201527f830000000000000000000000000000000000000000000000000000000000000060368201527fffffff000000000000000000000000000000000000000000000000000000000060e886901b166037820152603a016109b1565b63ffffffff8411610dc2576040517fda0000000000000000000000000000000000000000000000000000000000000060208201527fff00000000000000000000000000000000000000000000000000000000000000821660218201527fffffffffffffffffffffffffffffffffffffffff000000000000000000000000606087901b1660228201527f840000000000000000000000000000000000000000000000000000000000000060368201527fffffffff0000000000000000000000000000000000000000000000000000000060e086901b166037820152603b016109b1565b64ffffffffff8411610ea5576040517fdb0000000000000000000000000000000000000000000000000000000000000060208201527fff00000000000000000000000000000000000000000000000000000000000000821660218201527fffffffffffffffffffffffffffffffffffffffff000000000000000000000000606087901b1660228201527f850000000000000000000000000000000000000000000000000000000000000060368201527fffffffffff00000000000000000000000000000000000000000000000000000060d886901b166037820152603c016109b1565b65ffffffffffff8411610f89576040517fdc0000000000000000000000000000000000000000000000000000000000000060208201527fff00000000000000000000000000000000000000000000000000000000000000821660218201527fffffffffffffffffffffffffffffffffffffffff000000000000000000000000606087901b1660228201527f860000000000000000000000000000000000000000000000000000000000000060368201527fffffffffffff000000000000000000000000000000000000000000000000000060d086901b166037820152603d016109b1565b66ffffffffffffff841161106e576040517fdd0000000000000000000000000000000000000000000000000000000000000060208201527fff00000000000000000000000000000000000000000000000000000000000000821660218201527fffffffffffffffffffffffffffffffffffffffff000000000000000000000000606087901b1660228201527f870000000000000000000000000000000000000000000000000000000000000060368201527fffffffffffffff0000000000000000000000000000000000000000000000000060c886901b166037820152603e016109b1565b6040517fde0000000000000000000000000000000000000000000000000000000000000060208201527fff00000000000000000000000000000000000000000000000000000000000000821660218201527fffffffffffffffffffffffffffffffffffffffff000000000000000000000000606087901b1660228201527f880000000000000000000000000000000000000000000000000000000000000060368201527fffffffffffffffff00000000000000000000000000000000000000000000000060c086901b166037820152603f0160405160208183030381529060405291505b5080516020909101209392505050565b60006104d86111e260408051437fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe08101406020830152419282019290925260608101919091524260808201524460a08201524660c08201523360e08201526000906101000160405160208183030381529060405280519060200120905090565b83611505565b600061126f61126860408051437fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe08101406020830152419282019290925260608101919091524260808201524460a08201524660c08201523360e08201526000906101000160405160208183030381529060405280519060200120905090565b8484610539565b9392505050565b600061126f83837f000000000000000000000000ba5ed099633d3b313e4d5f7bdc1305d3c28ba5ed6119ed565b60008451602086018451f090506112b9816123d3565b60405173ffffffffffffffffffffffffffffffffffffffff8216907f4db17dd5e4732fb6da34a148104a592783ca119a1e7bb8829eba6cbadef0b51190600090a26000808273ffffffffffffffffffffffffffffffffffffffff168560200151876040516113279190612d29565b60006040518083038185875af1925050503d8060008114611364576040519150601f19603f3d011682016040523d82523d6000602084013e611369565b606091505b5091509150816113c9577f000000000000000000000000ba5ed099633d3b313e4d5f7bdc1305d3c28ba5ed816040517fa57ca23900000000000000000000000000000000000000000000000000000000815260040161062c929190612d94565b73ffffffffffffffffffffffffffffffffffffffff7f000000000000000000000000ba5ed099633d3b313e4d5f7bdc1305d3c28ba5ed1631156114fb578373ffffffffffffffffffffffffffffffffffffffff167f000000000000000000000000ba5ed099633d3b313e4d5f7bdc1305d3c28ba5ed73ffffffffffffffffffffffffffffffffffffffff163160405160006040518083038185875af1925050503d8060008114611495576040519150601f19603f3d011682016040523d82523d6000602084013e61149a565b606091505b509092509050816114fb577f000000000000000000000000ba5ed099633d3b313e4d5f7bdc1305d3c28ba5ed816040517fc2b3f44500000000000000000000000000000000000000000000000000000000815260040161062c929190612d94565b5050949350505050565b600080611511846120db565b905060006040518060400160405280601081526020017f67363d3d37363d34f03d5260086018f30000000000000000000000000000000081525090506000828251602084016000f5905073ffffffffffffffffffffffffffffffffffffffff81166115e0576040517fc05cee7a00000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff7f000000000000000000000000ba5ed099633d3b313e4d5f7bdc1305d3c28ba5ed16600482015260240161062c565b604051839073ffffffffffffffffffffffffffffffffffffffff8316907f2feea65dd4e9f9cbd86b74b7734210c59a1b2981b5b137bd0ee3e208200c906790600090a361162c83610823565b935060008173ffffffffffffffffffffffffffffffffffffffff1634876040516116569190612d29565b60006040518083038185875af1925050503d8060008114611693576040519150601f19603f3d011682016040523d82523d6000602084013e611698565b606091505b505090506116a681866124ff565b60405173ffffffffffffffffffffffffffffffffffffffff8616907f4db17dd5e4732fb6da34a148104a592783ca119a1e7bb8829eba6cbadef0b51190600090a25050505092915050565b6000806116fd876120db565b9050808651602088018651f59150611714826123d3565b604051819073ffffffffffffffffffffffffffffffffffffffff8416907fb8fda7e00c6b06a2b54e58521bc5894fee35f1090e5a3bb6390bfe2b98b497f790600090a36000808373ffffffffffffffffffffffffffffffffffffffff168660200151886040516117849190612d29565b60006040518083038185875af1925050503d80600081146117c1576040519150601f19603f3d011682016040523d82523d6000602084013e6117c6565b606091505b509150915081611826577f000000000000000000000000ba5ed099633d3b313e4d5f7bdc1305d3c28ba5ed816040517fa57ca23900000000000000000000000000000000000000000000000000000000815260040161062c929190612d94565b73ffffffffffffffffffffffffffffffffffffffff7f000000000000000000000000ba5ed099633d3b313e4d5f7bdc1305d3c28ba5ed163115611958578473ffffffffffffffffffffffffffffffffffffffff167f000000000000000000000000ba5ed099633d3b313e4d5f7bdc1305d3c28ba5ed73ffffffffffffffffffffffffffffffffffffffff163160405160006040518083038185875af1925050503d80600081146118f2576040519150601f19603f3d011682016040523d82523d6000602084013e6118f7565b606091505b50909250905081611958577f000000000000000000000000ba5ed099633d3b313e4d5f7bdc1305d3c28ba5ed816040517fc2b3f44500000000000000000000000000000000000000000000000000000000815260040161062c929190612d94565b50505095945050505050565b60006107b36119e460408051437fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe08101406020830152419282019290925260608101919091524260808201524460a08201524660c08201523360e08201526000906101000160405160208183030381529060405280519060200120905090565b858585336116f1565b6000604051836040820152846020820152828152600b8101905060ff815360559020949350505050565b600080611a23876120db565b905060006040518060400160405280601081526020017f67363d3d37363d34f03d5260086018f30000000000000000000000000000000081525090506000828251602084016000f5905073ffffffffffffffffffffffffffffffffffffffff8116611af2576040517fc05cee7a00000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff7f000000000000000000000000ba5ed099633d3b313e4d5f7bdc1305d3c28ba5ed16600482015260240161062c565b604051839073ffffffffffffffffffffffffffffffffffffffff8316907f2feea65dd4e9f9cbd86b74b7734210c59a1b2981b5b137bd0ee3e208200c906790600090a3611b3e83610823565b935060008173ffffffffffffffffffffffffffffffffffffffff1687600001518a604051611b6c9190612d29565b60006040518083038185875af1925050503d8060008114611ba9576040519150601f19603f3d011682016040523d82523d6000602084013e611bae565b606091505b50509050611bbc81866124ff565b60405173ffffffffffffffffffffffffffffffffffffffff8616907f4db17dd5e4732fb6da34a148104a592783ca119a1e7bb8829eba6cbadef0b51190600090a260608573ffffffffffffffffffffffffffffffffffffffff1688602001518a604051611c299190612d29565b60006040518083038185875af1925050503d8060008114611c66576040519150601f19603f3d011682016040523d82523d6000602084013e611c6b565b606091505b50909250905081611ccc577f000000000000000000000000ba5ed099633d3b313e4d5f7bdc1305d3c28ba5ed816040517fa57ca23900000000000000000000000000000000000000000000000000000000815260040161062c929190612d94565b73ffffffffffffffffffffffffffffffffffffffff7f000000000000000000000000ba5ed099633d3b313e4d5f7bdc1305d3c28ba5ed163115611dfe578673ffffffffffffffffffffffffffffffffffffffff167f000000000000000000000000ba5ed099633d3b313e4d5f7bdc1305d3c28ba5ed73ffffffffffffffffffffffffffffffffffffffff163160405160006040518083038185875af1925050503d8060008114611d98576040519150601f19603f3d011682016040523d82523d6000602084013e611d9d565b606091505b50909250905081611dfe577f000000000000000000000000ba5ed099633d3b313e4d5f7bdc1305d3c28ba5ed816040517fc2b3f44500000000000000000000000000000000000000000000000000000000815260040161062c929190612d94565b505050505095945050505050565b60006103dd611e8c60408051437fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe08101406020830152419282019290925260608101919091524260808201524460a08201524660c08201523360e08201526000906101000160405160208183030381529060405280519060200120905090565b868686866116f1565b60006103dd85858585336116f1565b60006103dd611f2460408051437fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe08101406020830152419282019290925260608101919091524260808201524460a08201524660c08201523360e08201526000906101000160405160208183030381529060405280519060200120905090565b86868686611a17565b6000808360601b90506040517f3d602d80600a3d3981f3363d3d373d3d3d363d7300000000000000000000000081528160148201527f5af43d82803e903d91602b57fd5bf3000000000000000000000000000000000060288201526037816000f092505073ffffffffffffffffffffffffffffffffffffffff8216612016576040517fc05cee7a00000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff7f000000000000000000000000ba5ed099633d3b313e4d5f7bdc1305d3c28ba5ed16600482015260240161062c565b60405173ffffffffffffffffffffffffffffffffffffffff8316907f4db17dd5e4732fb6da34a148104a592783ca119a1e7bb8829eba6cbadef0b51190600090a26000808373ffffffffffffffffffffffffffffffffffffffff1634866040516120809190612d29565b60006040518083038185875af1925050503d80600081146120bd576040519150601f19603f3d011682016040523d82523d6000602084013e6120c2565b606091505b50915091506120d282828861247d565b50505092915050565b60008060006120e9846125b3565b9092509050600082600281111561210257612102612e02565b1480156121205750600081600281111561211e5761211e612e02565b145b1561215e57604080513360208201524691810191909152606081018590526080016040516020818303038152906040528051906020012092506123cc565b600082600281111561217257612172612e02565b1480156121905750600181600281111561218e5761218e612e02565b145b156121b0576121a9338560009182526020526040902090565b92506123cc565b60008260028111156121c4576121c4612e02565b03612233576040517f13b3a2a100000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff7f000000000000000000000000ba5ed099633d3b313e4d5f7bdc1305d3c28ba5ed16600482015260240161062c565b600182600281111561224757612247612e02565b1480156122655750600081600281111561226357612263612e02565b145b1561227e576121a9468560009182526020526040902090565b600182600281111561229257612292612e02565b1480156122b0575060028160028111156122ae576122ae612e02565b145b1561231f576040517f13b3a2a100000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff7f000000000000000000000000ba5ed099633d3b313e4d5f7bdc1305d3c28ba5ed16600482015260240161062c565b61239a60408051437fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe08101406020830152419282019290925260608101919091524260808201524460a08201524660c08201523360e08201526000906101000160405160208183030381529060405280519060200120905090565b84036123a657836123c9565b604080516020810186905201604051602081830303815290604052805190602001205b92505b5050919050565b73ffffffffffffffffffffffffffffffffffffffff8116158061240b575073ffffffffffffffffffffffffffffffffffffffff81163b155b1561247a576040517fc05cee7a00000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff7f000000000000000000000000ba5ed099633d3b313e4d5f7bdc1305d3c28ba5ed16600482015260240161062c565b50565b82158061249f575073ffffffffffffffffffffffffffffffffffffffff81163b155b156124fa577f000000000000000000000000ba5ed099633d3b313e4d5f7bdc1305d3c28ba5ed826040517fa57ca23900000000000000000000000000000000000000000000000000000000815260040161062c929190612d94565b505050565b811580612520575073ffffffffffffffffffffffffffffffffffffffff8116155b80612540575073ffffffffffffffffffffffffffffffffffffffff81163b155b156125af576040517fc05cee7a00000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff7f000000000000000000000000ba5ed099633d3b313e4d5f7bdc1305d3c28ba5ed16600482015260240161062c565b5050565b600080606083901c3314801561261057508260141a60f81b7effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff19167f0100000000000000000000000000000000000000000000000000000000000000145b1561262057506000905080915091565b606083901c3314801561265a57507fff00000000000000000000000000000000000000000000000000000000000000601484901a60f81b16155b1561266b5750600090506001915091565b33606084901c036126825750600090506002915091565b606083901c1580156126db57508260141a60f81b7effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff19167f0100000000000000000000000000000000000000000000000000000000000000145b156126ec5750600190506000915091565b606083901c15801561272557507fff00000000000000000000000000000000000000000000000000000000000000601484901a60f81b16155b1561273557506001905080915091565b606083901c61274a5750600190506002915091565b8260141a60f81b7effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff19167f0100000000000000000000000000000000000000000000000000000000000000036127a55750600290506000915091565b8260141a60f81b7effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff19166000036127e15750600290506001915091565b506002905080915091565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b600082601f83011261282c57600080fd5b813567ffffffffffffffff80821115612847576128476127ec565b604051601f83017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0908116603f0116810190828211818310171561288d5761288d6127ec565b816040528381528660208588010111156128a657600080fd5b836020870160208301376000602085830101528094505050505092915050565b6000604082840312156128d857600080fd5b6040516040810181811067ffffffffffffffff821117156128fb576128fb6127ec565b604052823581526020928301359281019290925250919050565b60008060008060a0858703121561292b57600080fd5b84359350602085013567ffffffffffffffff8082111561294a57600080fd5b6129568883890161281b565b9450604087013591508082111561296c57600080fd5b506129798782880161281b565b92505061298986606087016128c6565b905092959194509250565b600080604083850312156129a757600080fd5b82359150602083013567ffffffffffffffff8111156129c557600080fd5b6129d18582860161281b565b9150509250929050565b6000602082840312156129ed57600080fd5b813567ffffffffffffffff811115612a0457600080fd5b6107b38482850161281b565b803573ffffffffffffffffffffffffffffffffffffffff81168114612a3457600080fd5b919050565b600080600060608486031215612a4e57600080fd5b83359250612a5e60208501612a10565b9150604084013567ffffffffffffffff811115612a7a57600080fd5b612a868682870161281b565b9150509250925092565b600060208284031215612aa257600080fd5b5035919050565b600080600060808486031215612abe57600080fd5b833567ffffffffffffffff80821115612ad657600080fd5b612ae28783880161281b565b94506020860135915080821115612af857600080fd5b50612b058682870161281b565b925050612b1585604086016128c6565b90509250925092565b60008060408385031215612b3157600080fd5b82359150612b4160208401612a10565b90509250929050565b60008060408385031215612b5d57600080fd5b612b6683612a10565b946020939093013593505050565b60008060408385031215612b8757600080fd5b612b9083612a10565b9150602083013567ffffffffffffffff8111156129c557600080fd5b60008060408385031215612bbf57600080fd5b50508035926020909101359150565b60008060008060a08587031215612be457600080fd5b843567ffffffffffffffff80821115612bfc57600080fd5b612c088883890161281b565b95506020870135915080821115612c1e57600080fd5b50612c2b8782880161281b565b935050612c3b86604087016128c6565b915061298960808601612a10565b600080600080600060c08688031215612c6157600080fd5b85359450602086013567ffffffffffffffff80821115612c8057600080fd5b612c8c89838a0161281b565b95506040880135915080821115612ca257600080fd5b50612caf8882890161281b565b935050612cbf87606088016128c6565b9150612ccd60a08701612a10565b90509295509295909350565b600080600060608486031215612cee57600080fd5b8335925060208401359150612b1560408501612a10565b60005b83811015612d20578181015183820152602001612d08565b50506000910152565b60008251612d3b818460208701612d05565b9190910192915050565b67ffffffffffffffff828116828216039080821115612d8d577f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b5092915050565b73ffffffffffffffffffffffffffffffffffffffff831681526040602082015260008251806040840152612dcf816060850160208701612d05565b601f017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe016919091016060019392505050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602160045260246000fdfea164736f6c6343000817000a"; + bytes internal constant BeaconBlockRootsCode = hex"3373fffffffffffffffffffffffffffffffffffffffe14604d57602036146024575f5ffd5b5f35801560495762001fff810690815414603c575f5ffd5b62001fff01545f5260205ff35b5f5ffd5b62001fff42064281555f359062001fff015500"; @@ -99,11 +117,14 @@ library Preinstalls { 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 == SenderCreator_v060) return SenderCreator_v060Code; + if (_addr == EntryPoint_v060) return EntryPoint_v060Code; + if (_addr == SenderCreator_v070) return SenderCreator_v070Code; + if (_addr == EntryPoint_v070) return EntryPoint_v070Code; if (_addr == Permit2) return getPermit2Code(_chainID); if (_addr == BeaconBlockRoots) return BeaconBlockRootsCode; + if (_addr == CreateX) return CreateXCode; revert("Preinstalls: unknown preinstall"); } @@ -119,9 +140,12 @@ library Preinstalls { 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 == SenderCreator_v060) return "SenderCreator_v060"; + if (_addr == EntryPoint_v060) return "EntryPoint_v060"; + if (_addr == SenderCreator_v070) return "SenderCreator_v070"; + if (_addr == EntryPoint_v070) return "EntryPoint_v070"; if (_addr == BeaconBlockRoots) return "BeaconBlockRoots"; + if (_addr == CreateX) return "CreateX"; revert("Preinstalls: unnamed preinstall"); } diff --git a/packages/contracts-bedrock/src/libraries/SafeCall.sol b/packages/contracts-bedrock/src/libraries/SafeCall.sol index cfa3512ace53..a8ae9ec8be32 100644 --- a/packages/contracts-bedrock/src/libraries/SafeCall.sol +++ b/packages/contracts-bedrock/src/libraries/SafeCall.sol @@ -1,5 +1,5 @@ // SPDX-License-Identifier: MIT -pragma solidity 0.8.15; +pragma solidity ^0.8.0; /// @title SafeCall /// @notice Perform low level safe calls @@ -9,10 +9,9 @@ library SafeCall { /// @param _target Address to call /// @param _gas Amount of gas to pass to the call /// @param _value Amount of value to pass to the call - function send(address _target, uint256 _gas, uint256 _value) internal returns (bool) { - bool _success; + function send(address _target, uint256 _gas, uint256 _value) internal returns (bool success_) { assembly { - _success := + success_ := call( _gas, // gas _target, // recipient @@ -23,7 +22,13 @@ library SafeCall { 0 // outlen ) } - return _success; + } + + /// @notice Perform a low level call with all gas without copying any returndata + /// @param _target Address to call + /// @param _value Amount of value to pass to the call + function send(address _target, uint256 _value) internal returns (bool success_) { + success_ = send(_target, gasleft(), _value); } /// @notice Perform a low level call without copying any returndata @@ -31,10 +36,17 @@ library SafeCall { /// @param _gas Amount of gas to pass to the call /// @param _value Amount of value to pass to the call /// @param _calldata Calldata to pass to the call - function call(address _target, uint256 _gas, uint256 _value, bytes memory _calldata) internal returns (bool) { - bool _success; + function call( + address _target, + uint256 _gas, + uint256 _value, + bytes memory _calldata + ) + internal + returns (bool success_) + { assembly { - _success := + success_ := call( _gas, // gas _target, // recipient @@ -45,7 +57,21 @@ library SafeCall { 0 // outlen ) } - return _success; + } + + /// @notice Perform a low level call without copying any returndata + /// @param _target Address to call + /// @param _value Amount of value to pass to the call + /// @param _calldata Calldata to pass to the call + function call(address _target, uint256 _value, bytes memory _calldata) internal returns (bool success_) { + success_ = call({ _target: _target, _gas: gasleft(), _value: _value, _calldata: _calldata }); + } + + /// @notice Perform a low level call without copying any returndata + /// @param _target Address to call + /// @param _calldata Calldata to pass to the call + function call(address _target, bytes memory _calldata) internal returns (bool success_) { + success_ = call({ _target: _target, _gas: gasleft(), _value: 0, _calldata: _calldata }); } /// @notice Helper function to determine if there is sufficient gas remaining within the context 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 index 4dfb92070d6b..afc852787cf2 100644 --- a/packages/contracts-bedrock/src/libraries/TransientContext.sol +++ b/packages/contracts-bedrock/src/libraries/TransientContext.sol @@ -61,10 +61,55 @@ library TransientContext { /// @notice Reentrancy-aware modifier for transient storage, which increments and /// decrements the call depth when entering and exiting a function. contract TransientReentrancyAware { + /// @notice Thrown when a non-written transient storage slot is attempted to be read from. + error NotEntered(); + + /// @notice Thrown when a reentrant call is detected. + error ReentrantCall(); + + /// @notice Storage slot for `entered` value. + /// Equal to bytes32(uint256(keccak256("transientreentrancyaware.entered")) - 1) + bytes32 internal constant ENTERED_SLOT = 0xf13569814868ede994184d5a425471fb19e869768a33421cb701a2ba3d420c0a; + /// @notice Modifier to make a function reentrancy-aware. modifier reentrantAware() { TransientContext.increment(); _; TransientContext.decrement(); } + + /// @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 notEntered() { + if (TransientContext.callDepth() == 0) revert NotEntered(); + _; + } + + /// @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 whether the contract is currently entered or not. + /// @return entered_ True if the contract is entered, and false otherwise. + function _entered() internal view returns (bool entered_) { + assembly { + let value := tload(ENTERED_SLOT) + entered_ := gt(value, 0) + } + } } diff --git a/packages/contracts-bedrock/src/libraries/errors/CommonErrors.sol b/packages/contracts-bedrock/src/libraries/errors/CommonErrors.sol new file mode 100644 index 000000000000..eee6cc699489 --- /dev/null +++ b/packages/contracts-bedrock/src/libraries/errors/CommonErrors.sol @@ -0,0 +1,14 @@ +// SPDX-License-Identifier: MIT +pragma solidity ^0.8.0; + +/// @notice Error for an unauthorized CALLER. +error Unauthorized(); + +/// @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 is called that only works when NOT using a custom gas token. +error NotCustomGasToken(); + +/// @notice Error for when a transfer via call fails. +error TransferFailed(); diff --git a/packages/contracts-bedrock/src/libraries/rlp/RLPErrors.sol b/packages/contracts-bedrock/src/libraries/rlp/RLPErrors.sol index f7a9cdb091c4..c2ce80a6cc73 100644 --- a/packages/contracts-bedrock/src/libraries/rlp/RLPErrors.sol +++ b/packages/contracts-bedrock/src/libraries/rlp/RLPErrors.sol @@ -1,5 +1,5 @@ // SPDX-License-Identifier: MIT -pragma solidity 0.8.15; +pragma solidity ^0.8.0; /// @notice The length of an RLP item must be greater than zero to be decodable error EmptyItem(); diff --git a/packages/contracts-bedrock/src/periphery/drippie/Drippie.sol b/packages/contracts-bedrock/src/periphery/drippie/Drippie.sol index 05a2141803b5..014694813e46 100644 --- a/packages/contracts-bedrock/src/periphery/drippie/Drippie.sol +++ b/packages/contracts-bedrock/src/periphery/drippie/Drippie.sol @@ -76,6 +76,11 @@ contract Drippie is AssetReceiver { /// @notice Maps from drip names to drip states. mapping(string => DripState) public drips; + /// @notice Array of created drips. Used so offchain services can easily iterate over all drips + /// without resorting to event queries. Convenience feature and shouldn't really be + /// used onchain because the array will grow indefinitely. + string[] public created; + //// @param _owner Initial contract owner. constructor(address _owner) AssetReceiver(_owner) { } @@ -112,6 +117,9 @@ contract Drippie is AssetReceiver { state.config.actions.push(_config.actions[i]); } + // Add the name of the drip to the array of created drips. + created.push(_name); + // Tell the world! emit DripCreated(_name, _name, _config); } @@ -251,4 +259,17 @@ contract Drippie is AssetReceiver { function getDripStatus(string calldata _name) public view returns (DripStatus) { return drips[_name].status; } + + /// @notice Returns the interval of a given drip. + /// @param _name Drip to check. + /// @return Interval of the given drip. + function getDripInterval(string calldata _name) public view returns (uint256) { + return drips[_name].config.interval; + } + + /// @notice Returns the number of created drips. + /// @return Number of created drips. + function getDripCount() public view returns (uint256) { + return created.length; + } } diff --git a/packages/contracts-bedrock/src/periphery/drippie/IDripCheck.sol b/packages/contracts-bedrock/src/periphery/drippie/IDripCheck.sol index 624fd763fbd1..4e3195f4215b 100644 --- a/packages/contracts-bedrock/src/periphery/drippie/IDripCheck.sol +++ b/packages/contracts-bedrock/src/periphery/drippie/IDripCheck.sol @@ -7,6 +7,10 @@ interface IDripCheck { // possible to easily encode parameters on the client side. Solidity does not support generics // so it's not possible to do this with explicit typing. + /// @notice Returns the name of the drip check. + /// @return name_ The name of the drip check. + function name() external view returns (string memory name_); + /// @notice Checks whether a drip should be executable. /// @param _params Encoded parameters for the drip check. /// @return execute_ Whether the drip should be executed. diff --git a/packages/contracts-bedrock/src/periphery/drippie/dripchecks/CheckBalanceLow.sol b/packages/contracts-bedrock/src/periphery/drippie/dripchecks/CheckBalanceLow.sol index 8319be7b9382..ff7121051c76 100644 --- a/packages/contracts-bedrock/src/periphery/drippie/dripchecks/CheckBalanceLow.sol +++ b/packages/contracts-bedrock/src/periphery/drippie/dripchecks/CheckBalanceLow.sol @@ -15,6 +15,9 @@ contract CheckBalanceLow is IDripCheck { /// @param params Parameters to encode. event _EventToExposeStructInABI__Params(Params params); + /// @inheritdoc IDripCheck + string public name = "CheckBalanceLow"; + /// @inheritdoc IDripCheck function check(bytes memory _params) external view returns (bool execute_) { Params memory params = abi.decode(_params, (Params)); diff --git a/packages/contracts-bedrock/src/periphery/drippie/dripchecks/CheckGelatoLow.sol b/packages/contracts-bedrock/src/periphery/drippie/dripchecks/CheckGelatoLow.sol index d4ddb8584782..a5ef463f89e6 100644 --- a/packages/contracts-bedrock/src/periphery/drippie/dripchecks/CheckGelatoLow.sol +++ b/packages/contracts-bedrock/src/periphery/drippie/dripchecks/CheckGelatoLow.sol @@ -2,10 +2,7 @@ pragma solidity 0.8.15; import { IDripCheck } from "../IDripCheck.sol"; - -interface IGelatoTreasury { - function userTokenBalance(address _user, address _token) external view returns (uint256); -} +import { IGelatoTreasury } from "src/vendor/interfaces/IGelatoTreasury.sol"; /// @title CheckGelatoLow /// @notice DripCheck for checking if an account's Gelato ETH balance is below some threshold. @@ -20,15 +17,26 @@ contract CheckGelatoLow is IDripCheck { /// @param params Parameters to encode. event _EventToExposeStructInABI__Params(Params params); + /// @inheritdoc IDripCheck + string public name = "CheckGelatoLow"; + /// @inheritdoc IDripCheck function check(bytes memory _params) external view returns (bool execute_) { Params memory params = abi.decode(_params, (Params)); - // Check GelatoTreasury ETH balance is below threshold. - execute_ = IGelatoTreasury(params.treasury).userTokenBalance( - params.recipient, - // Gelato represents ETH as 0xeeeee....eeeee - 0xEeeeeEeeeEeEeeEeEeEeeEEEeeeeEeeeeeeeEEeE - ) < params.threshold; + // Gelato represents ETH as 0xeeeee....eeeee. + address eth = 0xEeeeeEeeeEeEeeEeEeEeeEEEeeeeEeeeeeeeEEeE; + + // Get the total deposited amount. + uint256 deposited = IGelatoTreasury(params.treasury).totalDepositedAmount(params.recipient, eth); + + // Get the total withdrawn amount. + uint256 withdrawn = IGelatoTreasury(params.treasury).totalWithdrawnAmount(params.recipient, eth); + + // Figure out the current balance. + uint256 balance = deposited - withdrawn; + + // Check if the balance is below the threshold. + execute_ = balance < params.threshold; } } diff --git a/packages/contracts-bedrock/src/periphery/drippie/dripchecks/CheckSecrets.sol b/packages/contracts-bedrock/src/periphery/drippie/dripchecks/CheckSecrets.sol index f008f62cb5d9..5cfc4251b456 100644 --- a/packages/contracts-bedrock/src/periphery/drippie/dripchecks/CheckSecrets.sol +++ b/packages/contracts-bedrock/src/periphery/drippie/dripchecks/CheckSecrets.sol @@ -21,6 +21,9 @@ contract CheckSecrets is IDripCheck { /// @notice Event emitted when a secret is revealed. event SecretRevealed(bytes32 indexed secretHash, bytes secret); + /// @inheritdoc IDripCheck + string public name = "CheckSecrets"; + /// @notice Keeps track of when secrets were revealed. mapping(bytes32 => uint256) public revealedSecrets; diff --git a/packages/contracts-bedrock/src/periphery/drippie/dripchecks/CheckTrue.sol b/packages/contracts-bedrock/src/periphery/drippie/dripchecks/CheckTrue.sol index 22af8abeff2c..1ce7138945c3 100644 --- a/packages/contracts-bedrock/src/periphery/drippie/dripchecks/CheckTrue.sol +++ b/packages/contracts-bedrock/src/periphery/drippie/dripchecks/CheckTrue.sol @@ -6,6 +6,9 @@ import { IDripCheck } from "../IDripCheck.sol"; /// @title CheckTrue /// @notice DripCheck that always returns true. contract CheckTrue is IDripCheck { + /// @inheritdoc IDripCheck + string public name = "CheckTrue"; + /// @inheritdoc IDripCheck function check(bytes memory) external pure returns (bool execute_) { execute_ = true; diff --git a/packages/contracts-bedrock/src/periphery/faucet/Faucet.sol b/packages/contracts-bedrock/src/periphery/faucet/Faucet.sol index e23e6869c335..cce6a83b3e13 100644 --- a/packages/contracts-bedrock/src/periphery/faucet/Faucet.sol +++ b/packages/contracts-bedrock/src/periphery/faucet/Faucet.sol @@ -1,16 +1,9 @@ // SPDX-License-Identifier: MIT pragma solidity 0.8.15; -import { IFaucetAuthModule } from "./authmodules/IFaucetAuthModule.sol"; - -/// @title SafeSend -/// @notice Sends ETH to a recipient account without triggering any code. -contract SafeSend { - /// @param _recipient Account to send ETH to. - constructor(address payable _recipient) payable { - selfdestruct(_recipient); - } -} +import { IFaucetAuthModule } from "src/periphery/faucet/authmodules/IFaucetAuthModule.sol"; +import { SafeCall } from "src/libraries/SafeCall.sol"; +import { SafeSend } from "src/universal/SafeSend.sol"; /// @title Faucet /// @notice Faucet contract that drips ETH to users. @@ -25,7 +18,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 +108,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/periphery/faucet/authmodules/IFaucetAuthModule.sol b/packages/contracts-bedrock/src/periphery/faucet/authmodules/IFaucetAuthModule.sol index 5bef4c8c705a..a94071dd2bef 100644 --- a/packages/contracts-bedrock/src/periphery/faucet/authmodules/IFaucetAuthModule.sol +++ b/packages/contracts-bedrock/src/periphery/faucet/authmodules/IFaucetAuthModule.sol @@ -1,5 +1,5 @@ // SPDX-License-Identifier: MIT -pragma solidity 0.8.15; +pragma solidity ^0.8.0; import { Faucet } from "../Faucet.sol"; diff --git a/packages/contracts-bedrock/src/periphery/op-nft/AttestationStation.sol b/packages/contracts-bedrock/src/periphery/op-nft/AttestationStation.sol index b9af730a71d4..4d15862d4358 100644 --- a/packages/contracts-bedrock/src/periphery/op-nft/AttestationStation.sol +++ b/packages/contracts-bedrock/src/periphery/op-nft/AttestationStation.sol @@ -1,7 +1,7 @@ // SPDX-License-Identifier: MIT pragma solidity 0.8.15; -import { ISemver } from "src/universal/ISemver.sol"; +import { ISemver } from "src/universal/interfaces/ISemver.sol"; /// @title AttestationStation /// @author Optimism Collective @@ -29,8 +29,8 @@ contract AttestationStation is ISemver { event AttestationCreated(address indexed creator, address indexed about, bytes32 indexed key, bytes val); /// @notice Semantic version. - /// @custom:semver 1.2.0 - string public constant version = "1.2.0"; + /// @custom:semver 1.2.1-beta.1 + string public constant version = "1.2.1-beta.1"; /// @notice Allows anyone to create an attestation. /// @param _about Address that the attestation is about. diff --git a/packages/contracts-bedrock/src/periphery/op-nft/Optimist.sol b/packages/contracts-bedrock/src/periphery/op-nft/Optimist.sol index 74d04b087d86..b15c0f00044c 100644 --- a/packages/contracts-bedrock/src/periphery/op-nft/Optimist.sol +++ b/packages/contracts-bedrock/src/periphery/op-nft/Optimist.sol @@ -1,7 +1,7 @@ // SPDX-License-Identifier: MIT pragma solidity 0.8.15; -import { ISemver } from "src/universal/ISemver.sol"; +import { ISemver } from "src/universal/interfaces/ISemver.sol"; import { ERC721BurnableUpgradeable } from "@openzeppelin/contracts-upgradeable/token/ERC721/extensions/ERC721BurnableUpgradeable.sol"; import { AttestationStation } from "src/periphery/op-nft/AttestationStation.sol"; @@ -26,8 +26,8 @@ contract Optimist is ERC721BurnableUpgradeable, ISemver { OptimistAllowlist public immutable OPTIMIST_ALLOWLIST; /// @notice Semantic version. - /// @custom:semver 2.1.0 - string public constant version = "2.1.0"; + /// @custom:semver 2.1.1-beta.1 + string public constant version = "2.1.1-beta.1"; /// @param _name Token name. /// @param _symbol Token symbol. diff --git a/packages/contracts-bedrock/src/periphery/op-nft/OptimistAllowlist.sol b/packages/contracts-bedrock/src/periphery/op-nft/OptimistAllowlist.sol index b8212a37c674..ffa46116a4c5 100644 --- a/packages/contracts-bedrock/src/periphery/op-nft/OptimistAllowlist.sol +++ b/packages/contracts-bedrock/src/periphery/op-nft/OptimistAllowlist.sol @@ -1,7 +1,7 @@ // SPDX-License-Identifier: MIT pragma solidity 0.8.15; -import { ISemver } from "src/universal/ISemver.sol"; +import { ISemver } from "src/universal/interfaces/ISemver.sol"; import { AttestationStation } from "src/periphery/op-nft/AttestationStation.sol"; import { OptimistConstants } from "src/periphery/op-nft/libraries/OptimistConstants.sol"; @@ -31,8 +31,8 @@ contract OptimistAllowlist is ISemver { address public immutable OPTIMIST_INVITER; /// @notice Semantic version. - /// @custom:semver 1.1.0 - string public constant version = "1.1.0"; + /// @custom:semver 1.1.1-beta.1 + string public constant version = "1.1.1-beta.1"; /// @param _attestationStation Address of the AttestationStation contract. /// @param _allowlistAttestor Address of the allowlist attestor. diff --git a/packages/contracts-bedrock/src/periphery/op-nft/OptimistInviter.sol b/packages/contracts-bedrock/src/periphery/op-nft/OptimistInviter.sol index 222405d77c33..ae0ab9d92657 100644 --- a/packages/contracts-bedrock/src/periphery/op-nft/OptimistInviter.sol +++ b/packages/contracts-bedrock/src/periphery/op-nft/OptimistInviter.sol @@ -2,7 +2,7 @@ pragma solidity 0.8.15; import { OptimistConstants } from "src/periphery/op-nft/libraries/OptimistConstants.sol"; -import { ISemver } from "src/universal/ISemver.sol"; +import { ISemver } from "src/universal/interfaces/ISemver.sol"; import { AttestationStation } from "src/periphery/op-nft/AttestationStation.sol"; import { SignatureChecker } from "@openzeppelin/contracts/utils/cryptography/SignatureChecker.sol"; import { EIP712Upgradeable } from "@openzeppelin/contracts-upgradeable/utils/cryptography/draft-EIP712Upgradeable.sol"; @@ -88,8 +88,8 @@ contract OptimistInviter is ISemver, EIP712Upgradeable { mapping(address => uint256) public inviteCounts; /// @notice Semantic version. - /// @custom:semver 1.1.0 - string public constant version = "1.1.0"; + /// @custom:semver 1.1.1-beta.1 + string public constant version = "1.1.1-beta.1"; /// @param _inviteGranter Address of the invite granter. /// @param _attestationStation Address of the AttestationStation contract. diff --git a/packages/contracts-bedrock/src/safe/DeputyGuardianModule.sol b/packages/contracts-bedrock/src/safe/DeputyGuardianModule.sol new file mode 100644 index 000000000000..0882910d5072 --- /dev/null +++ b/packages/contracts-bedrock/src/safe/DeputyGuardianModule.sol @@ -0,0 +1,165 @@ +// SPDX-License-Identifier: MIT +pragma solidity 0.8.15; + +// Safe +import { GnosisSafe as Safe } from "safe-contracts/GnosisSafe.sol"; +import { Enum } from "safe-contracts/common/Enum.sol"; + +// Libraries +import { Unauthorized } from "src/libraries/PortalErrors.sol"; +import "src/dispute/lib/Types.sol"; + +// Interfaces +import { IAnchorStateRegistry } from "src/dispute/interfaces/IAnchorStateRegistry.sol"; +import { IFaultDisputeGame } from "src/dispute/interfaces/IFaultDisputeGame.sol"; +import { ISuperchainConfig } from "src/L1/interfaces/ISuperchainConfig.sol"; +import { IOptimismPortal2 } from "src/L1/interfaces/IOptimismPortal2.sol"; +import { IDisputeGame } from "src/dispute/interfaces/IDisputeGame.sol"; +import { ISemver } from "src/universal/interfaces/ISemver.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 + ISuperchainConfig internal immutable SUPERCHAIN_CONFIG; + + /// @notice The deputy guardian's address + address internal immutable DEPUTY_GUARDIAN; + + /// @notice Semantic version. + /// @custom:semver 2.0.1-beta.3 + string public constant version = "2.0.1-beta.3"; + + // Constructor to initialize the Safe and baseModule instances + constructor(Safe _safe, ISuperchainConfig _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 (ISuperchainConfig 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 `setAnchorState()` on the `AnchorStateRegistry` contract. + /// Only the deputy guardian can call this function. + /// @param _registry The `IAnchorStateRegistry` contract instance. + /// @param _game The `IFaultDisputeGame` contract instance. + function setAnchorState(IAnchorStateRegistry _registry, IFaultDisputeGame _game) external { + _onlyDeputyGuardian(); + + bytes memory data = abi.encodeCall(IAnchorStateRegistry.setAnchorState, (_game)); + (bool success, bytes memory returnData) = + SAFE.execTransactionFromModuleReturnData(address(_registry), 0, data, Enum.Operation.Call); + if (!success) { + revert ExecutionFailed(string(returnData)); + } + } + + /// @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(IOptimismPortal2 _portal, IDisputeGame _game) external { + _onlyDeputyGuardian(); + + bytes memory data = abi.encodeCall(IOptimismPortal2.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(IOptimismPortal2 _portal, GameType _gameType) external { + _onlyDeputyGuardian(); + + bytes memory data = abi.encodeCall(IOptimismPortal2.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 similarity index 96% rename from packages/contracts-bedrock/src/Safe/LivenessGuard.sol rename to packages/contracts-bedrock/src/safe/LivenessGuard.sol index 59b431de126a..d4fe5c98c89b 100644 --- a/packages/contracts-bedrock/src/Safe/LivenessGuard.sol +++ b/packages/contracts-bedrock/src/safe/LivenessGuard.sol @@ -3,9 +3,9 @@ pragma solidity 0.8.15; 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 { SafeSigners } from "src/safe/SafeSigners.sol"; import { Enum } from "safe-contracts/common/Enum.sol"; -import { ISemver } from "src/universal/ISemver.sol"; +import { ISemver } from "src/universal/interfaces/ISemver.sol"; import { EnumerableSet } from "@openzeppelin/contracts/utils/structs/EnumerableSet.sol"; /// @title LivenessGuard @@ -25,8 +25,8 @@ contract LivenessGuard is ISemver, BaseGuard { event OwnerRecorded(address owner); /// @notice Semantic version. - /// @custom:semver 1.0.0 - string public constant version = "1.0.0"; + /// @custom:semver 1.0.1-beta.1 + string public constant version = "1.0.1-beta.1"; /// @notice The safe account for which this contract will be the guard. Safe internal immutable SAFE; diff --git a/packages/contracts-bedrock/src/Safe/LivenessModule.sol b/packages/contracts-bedrock/src/safe/LivenessModule.sol similarity index 98% rename from packages/contracts-bedrock/src/Safe/LivenessModule.sol rename to packages/contracts-bedrock/src/safe/LivenessModule.sol index 17ec33f1a884..cd41c6e2dd53 100644 --- a/packages/contracts-bedrock/src/Safe/LivenessModule.sol +++ b/packages/contracts-bedrock/src/safe/LivenessModule.sol @@ -4,8 +4,8 @@ pragma solidity 0.8.15; 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"; -import { ISemver } from "src/universal/ISemver.sol"; +import { LivenessGuard } from "src/safe/LivenessGuard.sol"; +import { ISemver } from "src/universal/interfaces/ISemver.sol"; /// @title LivenessModule /// @notice This module is intended to be used in conjunction with the LivenessGuard. In the event @@ -53,8 +53,8 @@ contract LivenessModule is ISemver { uint256 internal constant GUARD_STORAGE_SLOT = 0x4a204f620c8c5ccdca3fd54d003badd85ba500436a431f0cbda4f558c93c34c8; /// @notice Semantic version. - /// @custom:semver 1.1.0 - string public constant version = "1.2.0"; + /// @custom:semver 1.2.1-beta.1 + string public constant version = "1.2.1-beta.1"; // Constructor to initialize the Safe and baseModule instances constructor( diff --git a/packages/contracts-bedrock/src/Safe/SafeSigners.sol b/packages/contracts-bedrock/src/safe/SafeSigners.sol similarity index 100% rename from packages/contracts-bedrock/src/Safe/SafeSigners.sol rename to packages/contracts-bedrock/src/safe/SafeSigners.sol diff --git a/packages/contracts-bedrock/src/universal/ERC721Bridge.sol b/packages/contracts-bedrock/src/universal/ERC721Bridge.sol index d62c612fca1a..52217fab713c 100644 --- a/packages/contracts-bedrock/src/universal/ERC721Bridge.sol +++ b/packages/contracts-bedrock/src/universal/ERC721Bridge.sol @@ -1,9 +1,7 @@ // SPDX-License-Identifier: MIT pragma solidity 0.8.15; -import { CrossDomainMessenger } from "src/universal/CrossDomainMessenger.sol"; -import { StandardBridge } from "src/universal/StandardBridge.sol"; -import { SuperchainConfig } from "src/L1/SuperchainConfig.sol"; +import { ICrossDomainMessenger } from "src/universal/interfaces/ICrossDomainMessenger.sol"; import { Address } from "@openzeppelin/contracts/utils/Address.sol"; import { Initializable } from "@openzeppelin/contracts/proxy/utils/Initializable.sol"; @@ -16,11 +14,11 @@ abstract contract ERC721Bridge is Initializable { /// @notice Messenger contract on this domain. /// @custom:network-specific - CrossDomainMessenger public messenger; + ICrossDomainMessenger public messenger; /// @notice Contract of the bridge on the other network. /// @custom:network-specific - StandardBridge public otherBridge; + ERC721Bridge public otherBridge; /// @notice Reserve extra slots (to a total of 50) in the storage layout for future upgrades. uint256[46] private __gap; @@ -70,8 +68,8 @@ abstract contract ERC721Bridge is Initializable { /// @param _messenger Contract of the CrossDomainMessenger on this network. /// @param _otherBridge Contract of the ERC721 bridge on the other network. function __ERC721Bridge_init( - CrossDomainMessenger _messenger, - StandardBridge _otherBridge + ICrossDomainMessenger _messenger, + ERC721Bridge _otherBridge ) internal onlyInitializing @@ -84,7 +82,7 @@ abstract contract ERC721Bridge is Initializable { /// Public getter is legacy and will be removed in the future. Use `messenger` instead. /// @return Messenger contract on this domain. /// @custom:legacy - function MESSENGER() external view returns (CrossDomainMessenger) { + function MESSENGER() external view returns (ICrossDomainMessenger) { return messenger; } @@ -92,7 +90,7 @@ abstract contract ERC721Bridge is Initializable { /// Public getter is legacy and will be removed in the future. Use `otherBridge` instead. /// @return Contract of the bridge on the other network. /// @custom:legacy - function OTHER_BRIDGE() external view returns (StandardBridge) { + function OTHER_BRIDGE() external view returns (ERC721Bridge) { return otherBridge; } diff --git a/packages/contracts-bedrock/src/universal/FeeVault.sol b/packages/contracts-bedrock/src/universal/FeeVault.sol index 626251c7a971..542cd88447a4 100644 --- a/packages/contracts-bedrock/src/universal/FeeVault.sol +++ b/packages/contracts-bedrock/src/universal/FeeVault.sol @@ -1,9 +1,13 @@ // SPDX-License-Identifier: MIT pragma solidity 0.8.15; -import { L2StandardBridge } from "src/L2/L2StandardBridge.sol"; +// Libraries +import { SafeCall } from "src/libraries/SafeCall.sol"; import { Predeploys } from "src/libraries/Predeploys.sol"; +// Interfaces +import { IL2ToL1MessagePasser } from "src/L2/interfaces/IL2ToL1MessagePasser.sol"; + /// @title FeeVault /// @notice The FeeVault contract contains the basic logic for the various different vault contracts /// used to hold fee revenue generated by the L2 system. @@ -17,20 +21,32 @@ abstract contract FeeVault { } /// @notice Minimum balance before a withdrawal can be triggered. + /// Use the `minWithdrawalAmount()` getter as this is deprecated + /// and is subject to be removed in the future. + /// @custom:legacy uint256 public immutable MIN_WITHDRAWAL_AMOUNT; - /// @notice Wallet that will receive the fees. + /// @notice Account that will receive the fees. Can be located on L1 or L2. + /// Use the `recipient()` getter as this is deprecated + /// and is subject to be removed in the future. + /// @custom:legacy address public immutable RECIPIENT; - /// @notice Network which the RECIPIENT will receive fees on. + /// @notice Network which the recipient will receive fees on. + /// Use the `withdrawalNetwork()` getter as this is deprecated + /// and is subject to be removed in the future. + /// @custom:legacy WithdrawalNetwork public immutable WITHDRAWAL_NETWORK; /// @notice The minimum gas limit for the FeeVault withdrawal transaction. - uint32 internal constant WITHDRAWAL_MIN_GAS = 35_000; + uint32 internal constant WITHDRAWAL_MIN_GAS = 400_000; /// @notice Total amount of wei processed by the contract. uint256 public totalProcessed; + /// @notice Reserve extra slots in the storage layout for future upgrades. + uint256[48] private __gap; + /// @notice Emitted each time a withdrawal occurs. This event will be deprecated /// in favor of the Withdrawal event containing the WithdrawalNetwork parameter. /// @param value Amount that was withdrawn (in wei). @@ -57,6 +73,21 @@ abstract contract FeeVault { /// @notice Allow the contract to receive ETH. receive() external payable { } + /// @notice Minimum balance before a withdrawal can be triggered. + function minWithdrawalAmount() public view returns (uint256 amount_) { + amount_ = MIN_WITHDRAWAL_AMOUNT; + } + + /// @notice Account that will receive the fees. Can be located on L1 or L2. + function recipient() public view returns (address recipient_) { + recipient_ = RECIPIENT; + } + + /// @notice Network which the recipient will receive fees on. + function withdrawalNetwork() public view returns (WithdrawalNetwork network_) { + network_ = WITHDRAWAL_NETWORK; + } + /// @notice Triggers a withdrawal of funds to the fee wallet on L1 or L2. function withdraw() external { require( @@ -71,12 +102,14 @@ abstract contract FeeVault { emit Withdrawal(value, RECIPIENT, msg.sender, WITHDRAWAL_NETWORK); if (WITHDRAWAL_NETWORK == WithdrawalNetwork.L2) { - (bool success,) = RECIPIENT.call{ value: value }(hex""); + bool success = SafeCall.send(RECIPIENT, value); require(success, "FeeVault: failed to send ETH to L2 fee recipient"); } else { - L2StandardBridge(payable(Predeploys.L2_STANDARD_BRIDGE)).bridgeETHTo{ value: value }( - RECIPIENT, WITHDRAWAL_MIN_GAS, bytes("") - ); + IL2ToL1MessagePasser(payable(Predeploys.L2_TO_L1_MESSAGE_PASSER)).initiateWithdrawal{ value: value }({ + _target: RECIPIENT, + _gasLimit: WITHDRAWAL_MIN_GAS, + _data: hex"" + }); } } } diff --git a/packages/contracts-bedrock/src/universal/OptimismMintableERC20.sol b/packages/contracts-bedrock/src/universal/OptimismMintableERC20.sol index 43ddd65424f8..838a21af5662 100644 --- a/packages/contracts-bedrock/src/universal/OptimismMintableERC20.sol +++ b/packages/contracts-bedrock/src/universal/OptimismMintableERC20.sol @@ -2,9 +2,11 @@ pragma solidity 0.8.15; import { ERC20 } from "@openzeppelin/contracts/token/ERC20/ERC20.sol"; +import { ERC20Permit } from "@openzeppelin/contracts/token/ERC20/extensions/draft-ERC20Permit.sol"; import { IERC165 } from "@openzeppelin/contracts/utils/introspection/IERC165.sol"; -import { ILegacyMintableERC20, IOptimismMintableERC20 } from "src/universal/IOptimismMintableERC20.sol"; -import { ISemver } from "src/universal/ISemver.sol"; +import { ILegacyMintableERC20, IOptimismMintableERC20 } from "src/universal/interfaces/IOptimismMintableERC20.sol"; +import { ISemver } from "src/universal/interfaces/ISemver.sol"; +import { Preinstalls } from "src/libraries/Preinstalls.sol"; /// @title OptimismMintableERC20 /// @notice OptimismMintableERC20 is a standard extension of the base ERC20 token contract designed @@ -12,7 +14,7 @@ import { ISemver } from "src/universal/ISemver.sol"; /// 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. -contract OptimismMintableERC20 is IOptimismMintableERC20, ILegacyMintableERC20, ERC20, ISemver { +contract OptimismMintableERC20 is IOptimismMintableERC20, ILegacyMintableERC20, ERC20Permit, ISemver { /// @notice Address of the corresponding version of this token on the remote chain. address public immutable REMOTE_TOKEN; @@ -39,8 +41,16 @@ contract OptimismMintableERC20 is IOptimismMintableERC20, ILegacyMintableERC20, } /// @notice Semantic version. - /// @custom:semver 1.3.0 - string public constant version = "1.3.0"; + /// @custom:semver 1.4.0-beta.1 + string public constant version = "1.4.0-beta.1"; + + /// @notice Getter function for the permit2 address. It deterministically deployed + /// so it will always be at the same address. It is also included as a preinstall, + /// so it exists in the genesis state of chains. + /// @return Address of permit2 on this network. + function PERMIT2() public pure returns (address) { + return Preinstalls.Permit2; + } /// @param _bridge Address of the L2 standard bridge. /// @param _remoteToken Address of the corresponding L1 token. @@ -54,12 +64,35 @@ contract OptimismMintableERC20 is IOptimismMintableERC20, ILegacyMintableERC20, uint8 _decimals ) ERC20(_name, _symbol) + ERC20Permit(_name) { REMOTE_TOKEN = _remoteToken; BRIDGE = _bridge; DECIMALS = _decimals; } + /// @dev 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}. + function decimals() public view override returns (uint8) { + return DECIMALS; + } + + /// @notice Returns the allowance for a spender on the owner's tokens. + /// If the spender is the permit2 address, returns the maximum uint256 value. + /// @param _owner owner of the tokens. + /// @param _spender spender of the tokens. + /// @return Allowance for the spender. + function allowance(address _owner, address _spender) public view override returns (uint256) { + if (_spender == PERMIT2()) { + return type(uint256).max; + } + return super.allowance(_owner, _spender); + } + /// @notice Allows the StandardBridge on this network to mint tokens. /// @param _to Address to mint tokens to. /// @param _amount Amount of tokens to mint. @@ -127,14 +160,4 @@ contract OptimismMintableERC20 is IOptimismMintableERC20, ILegacyMintableERC20, function bridge() public view returns (address) { return BRIDGE; } - - /// @dev 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}. - function decimals() public view override returns (uint8) { - return DECIMALS; - } } diff --git a/packages/contracts-bedrock/src/universal/OptimismMintableERC20Factory.sol b/packages/contracts-bedrock/src/universal/OptimismMintableERC20Factory.sol index 6e7baf31f1fb..e179c6408dad 100644 --- a/packages/contracts-bedrock/src/universal/OptimismMintableERC20Factory.sol +++ b/packages/contracts-bedrock/src/universal/OptimismMintableERC20Factory.sol @@ -2,17 +2,18 @@ pragma solidity 0.8.15; import { OptimismMintableERC20 } from "src/universal/OptimismMintableERC20.sol"; -import { ISemver } from "src/universal/ISemver.sol"; +import { ISemver } from "src/universal/interfaces/ISemver.sol"; import { Initializable } from "@openzeppelin/contracts/proxy/utils/Initializable.sol"; +import { IOptimismERC20Factory } from "src/L2/interfaces/IOptimismERC20Factory.sol"; -/// @custom:proxied +/// @custom:proxied true /// @custom:predeployed 0x4200000000000000000000000000000000000012 /// @title OptimismMintableERC20Factory /// @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. -contract OptimismMintableERC20Factory is ISemver, Initializable { +contract OptimismMintableERC20Factory is ISemver, Initializable, IOptimismERC20Factory { /// @custom:spacer OptimismMintableERC20Factory's initializer slot spacing /// @notice Spacer to avoid packing into the initializer slot bytes30 private spacer_0_2_30; @@ -21,10 +22,14 @@ contract OptimismMintableERC20Factory is ISemver, Initializable { /// @custom:network-specific address public bridge; + /// @notice Mapping of local token address to remote token address. + /// This is used to keep track of the token deployments. + mapping(address => address) public deployments; + /// @notice Reserve extra slots in the storage layout for future upgrades. - /// A gap size of 49 was chosen here, so that the first slot used in a child contract - /// would be 1 plus a multiple of 50. - uint256[49] private __gap; + /// A gap size of 48 was chosen here, so that the first slot used in a child contract + /// would be a multiple of 50. + uint256[48] private __gap; /// @custom:legacy /// @notice Emitted whenever a new OptimismMintableERC20 is created. Legacy version of the newer @@ -43,8 +48,8 @@ contract OptimismMintableERC20Factory is ISemver, Initializable { /// the OptimismMintableERC20 token contract since this contract /// is responsible for deploying OptimismMintableERC20 contracts. /// @notice Semantic version. - /// @custom:semver 1.9.0 - string public constant version = "1.9.0"; + /// @custom:semver 1.10.1-beta.3 + string public constant version = "1.10.1-beta.3"; /// @notice Constructs the OptimismMintableERC20Factory contract. constructor() { @@ -117,9 +122,12 @@ contract OptimismMintableERC20Factory is ISemver, Initializable { require(_remoteToken != address(0), "OptimismMintableERC20Factory: must provide remote token address"); bytes32 salt = keccak256(abi.encode(_remoteToken, _name, _symbol, _decimals)); + address localToken = address(new OptimismMintableERC20{ salt: salt }(bridge, _remoteToken, _name, _symbol, _decimals)); + deployments[localToken] = _remoteToken; + // Emit the old event too for legacy support. emit StandardL2TokenCreated(_remoteToken, localToken); diff --git a/packages/contracts-bedrock/src/universal/OptimismMintableERC721.sol b/packages/contracts-bedrock/src/universal/OptimismMintableERC721.sol index 025b5b14bde3..955a34072205 100644 --- a/packages/contracts-bedrock/src/universal/OptimismMintableERC721.sol +++ b/packages/contracts-bedrock/src/universal/OptimismMintableERC721.sol @@ -5,8 +5,8 @@ import { ERC721Enumerable } from "@openzeppelin/contracts/token/ERC721/extension import { ERC721 } from "@openzeppelin/contracts/token/ERC721/ERC721.sol"; import { IERC165 } from "@openzeppelin/contracts/utils/introspection/IERC165.sol"; import { Strings } from "@openzeppelin/contracts/utils/Strings.sol"; -import { IOptimismMintableERC721 } from "src/universal/IOptimismMintableERC721.sol"; -import { ISemver } from "src/universal/ISemver.sol"; +import { IOptimismMintableERC721 } from "src/universal/interfaces/IOptimismMintableERC721.sol"; +import { ISemver } from "src/universal/interfaces/ISemver.sol"; /// @title OptimismMintableERC721 /// @notice This contract is the remote representation for some token that lives on another network, @@ -32,8 +32,8 @@ contract OptimismMintableERC721 is ERC721Enumerable, IOptimismMintableERC721, IS } /// @notice Semantic version. - /// @custom:semver 1.3.0 - string public constant version = "1.3.0"; + /// @custom:semver 1.3.1-beta.2 + string public constant version = "1.3.1-beta.2"; /// @param _bridge Address of the bridge on this network. /// @param _remoteChainId Chain ID where the remote token is deployed. diff --git a/packages/contracts-bedrock/src/universal/OptimismMintableERC721Factory.sol b/packages/contracts-bedrock/src/universal/OptimismMintableERC721Factory.sol index 9d9cd62c48d6..e9bc81524f86 100644 --- a/packages/contracts-bedrock/src/universal/OptimismMintableERC721Factory.sol +++ b/packages/contracts-bedrock/src/universal/OptimismMintableERC721Factory.sol @@ -2,7 +2,7 @@ pragma solidity 0.8.15; import { OptimismMintableERC721 } from "src/universal/OptimismMintableERC721.sol"; -import { ISemver } from "src/universal/ISemver.sol"; +import { ISemver } from "src/universal/interfaces/ISemver.sol"; /// @title OptimismMintableERC721Factory /// @notice Factory contract for creating OptimismMintableERC721 contracts. @@ -23,8 +23,8 @@ contract OptimismMintableERC721Factory is ISemver { event OptimismMintableERC721Created(address indexed localToken, address indexed remoteToken, address deployer); /// @notice Semantic version. - /// @custom:semver 1.4.0 - string public constant version = "1.4.0"; + /// @custom:semver 1.4.1-beta.2 + string public constant version = "1.4.1-beta.2"; /// @notice The semver MUST be bumped any time that there is a change in /// the OptimismMintableERC721 token contract since this contract diff --git a/packages/contracts-bedrock/src/universal/ProxyAdmin.sol b/packages/contracts-bedrock/src/universal/ProxyAdmin.sol index 8558d421bb46..e554345d4264 100644 --- a/packages/contracts-bedrock/src/universal/ProxyAdmin.sol +++ b/packages/contracts-bedrock/src/universal/ProxyAdmin.sol @@ -6,22 +6,8 @@ import { Proxy } from "src/universal/Proxy.sol"; import { AddressManager } from "src/legacy/AddressManager.sol"; import { L1ChugSplashProxy } from "src/legacy/L1ChugSplashProxy.sol"; import { Constants } from "src/libraries/Constants.sol"; - -/// @title IStaticERC1967Proxy -/// @notice IStaticERC1967Proxy is a static version of the ERC1967 proxy interface. -interface IStaticERC1967Proxy { - function implementation() external view returns (address); - - function admin() external view returns (address); -} - -/// @title IStaticL1ChugSplashProxy -/// @notice IStaticL1ChugSplashProxy is a static version of the ChugSplash proxy interface. -interface IStaticL1ChugSplashProxy { - function getImplementation() external view returns (address); - - function getOwner() external view returns (address); -} +import { IStaticERC1967Proxy } from "src/universal/interfaces/IStaticERC1967Proxy.sol"; +import { IStaticL1ChugSplashProxy } from "src/legacy/interfaces/IL1ChugSplashProxy.sol"; /// @title ProxyAdmin /// @notice This is an auxiliary contract meant to be assigned as the admin of an ERC1967 Proxy, diff --git a/packages/contracts-bedrock/src/universal/SafeSend.sol b/packages/contracts-bedrock/src/universal/SafeSend.sol new file mode 100644 index 000000000000..4e99c6678d85 --- /dev/null +++ b/packages/contracts-bedrock/src/universal/SafeSend.sol @@ -0,0 +1,11 @@ +// SPDX-License-Identifier: MIT +pragma solidity ^0.8.0; + +/// @title SafeSend +/// @notice Sends ETH to a recipient account without triggering any code. +contract SafeSend { + /// @param _recipient Account to send ETH to. + constructor(address payable _recipient) payable { + selfdestruct(_recipient); + } +} diff --git a/packages/contracts-bedrock/src/universal/StandardBridge.sol b/packages/contracts-bedrock/src/universal/StandardBridge.sol index 140aba531e61..476d3ba54c93 100644 --- a/packages/contracts-bedrock/src/universal/StandardBridge.sol +++ b/packages/contracts-bedrock/src/universal/StandardBridge.sol @@ -6,8 +6,8 @@ import { ERC165Checker } from "@openzeppelin/contracts/utils/introspection/ERC16 import { Address } from "@openzeppelin/contracts/utils/Address.sol"; import { SafeERC20 } from "@openzeppelin/contracts/token/ERC20/utils/SafeERC20.sol"; import { SafeCall } from "src/libraries/SafeCall.sol"; -import { IOptimismMintableERC20, ILegacyMintableERC20 } from "src/universal/IOptimismMintableERC20.sol"; -import { CrossDomainMessenger } from "src/universal/CrossDomainMessenger.sol"; +import { IOptimismMintableERC20, ILegacyMintableERC20 } from "src/universal/interfaces/IOptimismMintableERC20.sol"; +import { ICrossDomainMessenger } from "src/universal/interfaces/ICrossDomainMessenger.sol"; import { OptimismMintableERC20 } from "src/universal/OptimismMintableERC20.sol"; import { Initializable } from "@openzeppelin/contracts/proxy/utils/Initializable.sol"; import { Constants } from "src/libraries/Constants.sol"; @@ -38,7 +38,7 @@ abstract contract StandardBridge is Initializable { /// @notice Messenger contract on this domain. /// @custom:network-specific - CrossDomainMessenger public messenger; + ICrossDomainMessenger public messenger; /// @notice Corresponding bridge on the other domain. /// @custom:network-specific @@ -116,7 +116,7 @@ abstract contract StandardBridge is Initializable { /// @param _messenger Contract for CrossDomainMessenger on this network. /// @param _otherBridge Contract for the other StandardBridge contract. function __StandardBridge_init( - CrossDomainMessenger _messenger, + ICrossDomainMessenger _messenger, StandardBridge _otherBridge ) internal @@ -143,7 +143,7 @@ abstract contract StandardBridge is Initializable { /// Public getter is legacy and will be removed in the future. Use `messenger` instead. /// @return Contract of the messenger on this domain. /// @custom:legacy - function MESSENGER() external view returns (CrossDomainMessenger) { + function MESSENGER() external view returns (ICrossDomainMessenger) { return messenger; } diff --git a/packages/contracts-bedrock/src/universal/StorageSetter.sol b/packages/contracts-bedrock/src/universal/StorageSetter.sol index 53b8ab2affd5..b7f7614b4ea0 100644 --- a/packages/contracts-bedrock/src/universal/StorageSetter.sol +++ b/packages/contracts-bedrock/src/universal/StorageSetter.sol @@ -1,7 +1,7 @@ // SPDX-License-Identifier: MIT pragma solidity 0.8.15; -import { ISemver } from "src/universal/ISemver.sol"; +import { ISemver } from "src/universal/interfaces/ISemver.sol"; import { Storage } from "src/libraries/Storage.sol"; /// @title StorageSetter @@ -16,8 +16,8 @@ contract StorageSetter is ISemver { } /// @notice Semantic version. - /// @custom:semver 1.2.0 - string public constant version = "1.2.0"; + /// @custom:semver 1.2.1-beta.1 + string public constant version = "1.2.1-beta.1"; /// @notice Stores a bytes32 `_value` at `_slot`. Any storage slots that /// are packed should be set through this interface. diff --git a/packages/contracts-bedrock/src/dispute/weth/WETH98.sol b/packages/contracts-bedrock/src/universal/WETH98.sol similarity index 96% rename from packages/contracts-bedrock/src/dispute/weth/WETH98.sol rename to packages/contracts-bedrock/src/universal/WETH98.sol index f95699a3bf93..5665e5f9210f 100644 --- a/packages/contracts-bedrock/src/dispute/weth/WETH98.sol +++ b/packages/contracts-bedrock/src/universal/WETH98.sol @@ -19,7 +19,7 @@ pragma solidity 0.8.15; -import { IWETH } from "src/dispute/interfaces/IWETH.sol"; +import { IWETH } from "src/universal/interfaces/IWETH.sol"; /// @title WETH98 /// @notice WETH98 is a version of WETH9 upgraded for Solidity 0.8.x. @@ -50,7 +50,7 @@ contract WETH98 is IWETH { } /// @inheritdoc IWETH - function deposit() public payable { + function deposit() public payable virtual { balanceOf[msg.sender] += msg.value; emit Deposit(msg.sender, msg.value); } diff --git a/packages/contracts-bedrock/src/universal/interfaces/ICrossDomainMessenger.sol b/packages/contracts-bedrock/src/universal/interfaces/ICrossDomainMessenger.sol new file mode 100644 index 000000000000..ed2fb20ea453 --- /dev/null +++ b/packages/contracts-bedrock/src/universal/interfaces/ICrossDomainMessenger.sol @@ -0,0 +1,38 @@ +// SPDX-License-Identifier: MIT +pragma solidity ^0.8.0; + +interface ICrossDomainMessenger { + event FailedRelayedMessage(bytes32 indexed msgHash); + event Initialized(uint8 version); + event RelayedMessage(bytes32 indexed msgHash); + event SentMessage(address indexed target, address sender, bytes message, uint256 messageNonce, uint256 gasLimit); + event SentMessageExtension1(address indexed sender, uint256 value); + + function MESSAGE_VERSION() external view returns (uint16); + function MIN_GAS_CALLDATA_OVERHEAD() external view returns (uint64); + function MIN_GAS_DYNAMIC_OVERHEAD_DENOMINATOR() external view returns (uint64); + function MIN_GAS_DYNAMIC_OVERHEAD_NUMERATOR() external view returns (uint64); + function OTHER_MESSENGER() external view returns (ICrossDomainMessenger); + function RELAY_CALL_OVERHEAD() external view returns (uint64); + function RELAY_CONSTANT_OVERHEAD() external view returns (uint64); + function RELAY_GAS_CHECK_BUFFER() external view returns (uint64); + function RELAY_RESERVED_GAS() external view returns (uint64); + function baseGas(bytes memory _message, uint32 _minGasLimit) external pure returns (uint64); + function failedMessages(bytes32) external view returns (bool); + function messageNonce() external view returns (uint256); + function otherMessenger() external view returns (ICrossDomainMessenger); + function paused() external view returns (bool); + function relayMessage( + uint256 _nonce, + address _sender, + address _target, + uint256 _value, + uint256 _minGasLimit, + bytes memory _message + ) + external + payable; + function sendMessage(address _target, bytes memory _message, uint32 _minGasLimit) external payable; + function successfulMessages(bytes32) external view returns (bool); + function xDomainMessageSender() external view returns (address); +} diff --git a/packages/contracts-bedrock/src/universal/interfaces/IEIP712.sol b/packages/contracts-bedrock/src/universal/interfaces/IEIP712.sol new file mode 100644 index 000000000000..b05a49cb01ea --- /dev/null +++ b/packages/contracts-bedrock/src/universal/interfaces/IEIP712.sol @@ -0,0 +1,7 @@ +// SPDX-License-Identifier: MIT +pragma solidity ^0.8.0; + +/// @title IEIP712 +interface IEIP712 { + function DOMAIN_SEPARATOR() external view returns (bytes32); +} diff --git a/packages/contracts-bedrock/src/universal/interfaces/IERC721Bridge.sol b/packages/contracts-bedrock/src/universal/interfaces/IERC721Bridge.sol new file mode 100644 index 000000000000..ccb2d5f0a483 --- /dev/null +++ b/packages/contracts-bedrock/src/universal/interfaces/IERC721Bridge.sol @@ -0,0 +1,47 @@ +// SPDX-License-Identifier: MIT +pragma solidity ^0.8.0; + +import { ICrossDomainMessenger } from "src/universal/interfaces/ICrossDomainMessenger.sol"; + +interface IERC721Bridge { + event ERC721BridgeFinalized( + address indexed localToken, + address indexed remoteToken, + address indexed from, + address to, + uint256 tokenId, + bytes extraData + ); + event ERC721BridgeInitiated( + address indexed localToken, + address indexed remoteToken, + address indexed from, + address to, + uint256 tokenId, + bytes extraData + ); + event Initialized(uint8 version); + + function MESSENGER() external view returns (ICrossDomainMessenger); + function OTHER_BRIDGE() external view returns (IERC721Bridge); + function bridgeERC721( + address _localToken, + address _remoteToken, + uint256 _tokenId, + uint32 _minGasLimit, + bytes memory _extraData + ) + external; + function bridgeERC721To( + address _localToken, + address _remoteToken, + address _to, + uint256 _tokenId, + uint32 _minGasLimit, + bytes memory _extraData + ) + external; + function messenger() external view returns (ICrossDomainMessenger); + function otherBridge() external view returns (IERC721Bridge); + function paused() external view returns (bool); +} diff --git a/packages/contracts-bedrock/src/universal/interfaces/IFeeVault.sol b/packages/contracts-bedrock/src/universal/interfaces/IFeeVault.sol new file mode 100644 index 000000000000..1742a0029c7d --- /dev/null +++ b/packages/contracts-bedrock/src/universal/interfaces/IFeeVault.sol @@ -0,0 +1,23 @@ +// SPDX-License-Identifier: MIT +pragma solidity ^0.8.0; + +interface IFeeVault { + enum WithdrawalNetwork { + L1, + L2 + } + + event Withdrawal(uint256 value, address to, address from); + event Withdrawal(uint256 value, address to, address from, WithdrawalNetwork withdrawalNetwork); + + receive() external payable; + + function MIN_WITHDRAWAL_AMOUNT() external view returns (uint256); + function RECIPIENT() external view returns (address); + function WITHDRAWAL_NETWORK() external view returns (WithdrawalNetwork); + function minWithdrawalAmount() external view returns (uint256 amount_); + function recipient() external view returns (address recipient_); + function totalProcessed() external view returns (uint256); + function withdraw() external; + function withdrawalNetwork() external view returns (WithdrawalNetwork network_); +} diff --git a/packages/contracts-bedrock/src/universal/IOptimismMintableERC20.sol b/packages/contracts-bedrock/src/universal/interfaces/IOptimismMintableERC20.sol similarity index 100% rename from packages/contracts-bedrock/src/universal/IOptimismMintableERC20.sol rename to packages/contracts-bedrock/src/universal/interfaces/IOptimismMintableERC20.sol diff --git a/packages/contracts-bedrock/src/universal/interfaces/IOptimismMintableERC20Factory.sol b/packages/contracts-bedrock/src/universal/interfaces/IOptimismMintableERC20Factory.sol new file mode 100644 index 000000000000..91f6eba6c175 --- /dev/null +++ b/packages/contracts-bedrock/src/universal/interfaces/IOptimismMintableERC20Factory.sol @@ -0,0 +1,38 @@ +// SPDX-License-Identifier: MIT +pragma solidity ^0.8.0; + +interface IOptimismMintableERC20Factory { + event Initialized(uint8 version); + event OptimismMintableERC20Created(address indexed localToken, address indexed remoteToken, address deployer); + event StandardL2TokenCreated(address indexed remoteToken, address indexed localToken); + + function BRIDGE() external view returns (address); + function bridge() external view returns (address); + function createOptimismMintableERC20( + address _remoteToken, + string memory _name, + string memory _symbol + ) + external + returns (address); + function createOptimismMintableERC20WithDecimals( + address _remoteToken, + string memory _name, + string memory _symbol, + uint8 _decimals + ) + external + returns (address); + function createStandardL2Token( + address _remoteToken, + string memory _name, + string memory _symbol + ) + external + returns (address); + function deployments(address) external view returns (address); + function initialize(address _bridge) external; + function version() external view returns (string memory); + + function __constructor__() external; +} diff --git a/packages/contracts-bedrock/src/universal/IOptimismMintableERC721.sol b/packages/contracts-bedrock/src/universal/interfaces/IOptimismMintableERC721.sol similarity index 100% rename from packages/contracts-bedrock/src/universal/IOptimismMintableERC721.sol rename to packages/contracts-bedrock/src/universal/interfaces/IOptimismMintableERC721.sol diff --git a/packages/contracts-bedrock/src/universal/interfaces/IOwnable.sol b/packages/contracts-bedrock/src/universal/interfaces/IOwnable.sol new file mode 100644 index 000000000000..968ad63a7652 --- /dev/null +++ b/packages/contracts-bedrock/src/universal/interfaces/IOwnable.sol @@ -0,0 +1,12 @@ +// SPDX-License-Identifier: MIT +pragma solidity ^0.8.0; + +/// @title IOwnable +/// @notice Interface for Ownable. +interface IOwnable { + event OwnershipTransferred(address indexed previousOwner, address indexed newOwner); + + function owner() external view returns (address); + function renounceOwnership() external; + function transferOwnership(address newOwner) external; // nosemgrep: sol-style-input-arg-fmt. +} diff --git a/packages/contracts-bedrock/src/universal/ISemver.sol b/packages/contracts-bedrock/src/universal/interfaces/ISemver.sol similarity index 100% rename from packages/contracts-bedrock/src/universal/ISemver.sol rename to packages/contracts-bedrock/src/universal/interfaces/ISemver.sol diff --git a/packages/contracts-bedrock/src/universal/interfaces/IStandardBridge.sol b/packages/contracts-bedrock/src/universal/interfaces/IStandardBridge.sol new file mode 100644 index 000000000000..b92aae27503b --- /dev/null +++ b/packages/contracts-bedrock/src/universal/interfaces/IStandardBridge.sol @@ -0,0 +1,64 @@ +// SPDX-License-Identifier: MIT +pragma solidity ^0.8.0; + +import { ICrossDomainMessenger } from "src/universal/interfaces/ICrossDomainMessenger.sol"; + +interface IStandardBridge { + event ERC20BridgeFinalized( + address indexed localToken, + address indexed remoteToken, + address indexed from, + address to, + uint256 amount, + bytes extraData + ); + event ERC20BridgeInitiated( + address indexed localToken, + address indexed remoteToken, + address indexed from, + address to, + uint256 amount, + bytes extraData + ); + event ETHBridgeFinalized(address indexed from, address indexed to, uint256 amount, bytes extraData); + event ETHBridgeInitiated(address indexed from, address indexed to, uint256 amount, bytes extraData); + event Initialized(uint8 version); + + receive() external payable; + + function MESSENGER() external view returns (ICrossDomainMessenger); + function OTHER_BRIDGE() external view returns (IStandardBridge); + function bridgeERC20( + address _localToken, + address _remoteToken, + uint256 _amount, + uint32 _minGasLimit, + bytes memory _extraData + ) + external; + function bridgeERC20To( + address _localToken, + address _remoteToken, + address _to, + uint256 _amount, + uint32 _minGasLimit, + bytes memory _extraData + ) + external; + function bridgeETH(uint32 _minGasLimit, bytes memory _extraData) external payable; + function bridgeETHTo(address _to, uint32 _minGasLimit, bytes memory _extraData) external payable; + function deposits(address, address) external view returns (uint256); + function finalizeBridgeERC20( + address _localToken, + address _remoteToken, + address _from, + address _to, + uint256 _amount, + bytes memory _extraData + ) + external; + function finalizeBridgeETH(address _from, address _to, uint256 _amount, bytes memory _extraData) external payable; + function messenger() external view returns (ICrossDomainMessenger); + function otherBridge() external view returns (IStandardBridge); + function paused() external view returns (bool); +} diff --git a/packages/contracts-bedrock/src/universal/interfaces/IStaticERC1967Proxy.sol b/packages/contracts-bedrock/src/universal/interfaces/IStaticERC1967Proxy.sol new file mode 100644 index 000000000000..511f2be7b4f2 --- /dev/null +++ b/packages/contracts-bedrock/src/universal/interfaces/IStaticERC1967Proxy.sol @@ -0,0 +1,9 @@ +// SPDX-License-Identifier: MIT +pragma solidity ^0.8.0; + +/// @title IStaticERC1967Proxy +/// @notice IStaticERC1967Proxy is a static version of the ERC1967 proxy interface. +interface IStaticERC1967Proxy { + function implementation() external view returns (address); + function admin() external view returns (address); +} diff --git a/packages/contracts-bedrock/src/dispute/interfaces/IWETH.sol b/packages/contracts-bedrock/src/universal/interfaces/IWETH.sol similarity index 100% rename from packages/contracts-bedrock/src/dispute/interfaces/IWETH.sol rename to packages/contracts-bedrock/src/universal/interfaces/IWETH.sol diff --git a/packages/contracts-bedrock/src/vendor/interfaces/IERC20Solady.sol b/packages/contracts-bedrock/src/vendor/interfaces/IERC20Solady.sol new file mode 100644 index 000000000000..1e696ad23ac3 --- /dev/null +++ b/packages/contracts-bedrock/src/vendor/interfaces/IERC20Solady.sol @@ -0,0 +1,95 @@ +// SPDX-License-Identifier: MIT +pragma solidity ^0.8.0; + +interface IERC20Solady { + /// @dev The total supply has overflowed. + error TotalSupplyOverflow(); + + /// @dev The allowance has overflowed. + error AllowanceOverflow(); + + /// @dev The allowance has underflowed. + error AllowanceUnderflow(); + + /// @dev Insufficient balance. + error InsufficientBalance(); + + /// @dev Insufficient allowance. + error InsufficientAllowance(); + + /// @dev The permit is invalid. + error InvalidPermit(); + + /// @dev The permit has expired. + error PermitExpired(); + + /// @dev Emitted when `amount` tokens is transferred from `from` to `to`. + event Transfer(address indexed from, address indexed to, uint256 amount); + + /// @dev Emitted when `amount` tokens is approved by `owner` to be used by `spender`. + event Approval(address indexed owner, address indexed spender, uint256 amount); + + /// @dev Returns the name of the token. + function name() external view returns (string memory); + + /// @dev Returns the symbol of the token. + function symbol() external view returns (string memory); + + /// @dev Returns the decimals places of the token. + function decimals() external view returns (uint8); + + /// @dev Returns the amount of tokens in existence. + function totalSupply() external view returns (uint256 result); + + /// @dev Returns the amount of tokens owned by `owner` + function balanceOf(address owner) external view returns (uint256 result); + + /// @dev Returns the amount of tokens that `spender` can spend on behalf of `owner`. + function allowance(address owner, address spender) external view returns (uint256 result); + + /// @dev Sets `amount` as the allowance of `spender` over the caller's tokens. + /// + /// Emits a {Approval} event. + function approve(address spender, uint256 amount) external returns (bool); + + /// @dev Transfer `amount` tokens from the caller to `to`. + /// + /// Requirements: + /// - `from` must at least have `amount`. + /// + /// Emits a {Transfer} event. + function transfer(address to, uint256 amount) external returns (bool); + + /// @dev Transfers `amount` tokens from `from` to `to`. + /// + /// Note: Does not update the allowance if it is the maximum uint256 value. + /// + /// Requirements: + /// - `from` must at least have `amount`. + /// - The caller must have at least `amount` of allowance to transfer the tokens of `from`. + /// + /// Emits a {Transfer} event. + function transferFrom(address from, address to, uint256 amount) external returns (bool); + + /// @dev Returns the current nonce for `owner`. + /// This value is used to compute the signature for EIP-2612 permit. + function nonces(address owner) external view returns (uint256 result); + + /// @dev Sets `value` as the allowance of `spender` over the tokens of `owner`, + /// authorized by a signed approval by `owner`. + /// + /// Emits a {Approval} event. + function permit( + address owner, + address spender, + uint256 value, + uint256 deadline, + uint8 v, + bytes32 r, + bytes32 s + ) + external; + + /// @dev Returns the EIP-712 domain separator for the EIP-2612 permit. + function DOMAIN_SEPARATOR() external view returns (bytes32 result); +} diff --git a/packages/contracts-bedrock/src/vendor/interfaces/IGelatoTreasury.sol b/packages/contracts-bedrock/src/vendor/interfaces/IGelatoTreasury.sol new file mode 100644 index 000000000000..8438948f850d --- /dev/null +++ b/packages/contracts-bedrock/src/vendor/interfaces/IGelatoTreasury.sol @@ -0,0 +1,9 @@ +// SPDX-License-Identifier: MIT +pragma solidity ^0.8.0; + +/// @title IGelatoTreasury +/// @notice Interface for the GelatoTreasury contract. +interface IGelatoTreasury { + function totalDepositedAmount(address _user, address _token) external view returns (uint256); + function totalWithdrawnAmount(address _user, address _token) external view returns (uint256); +} diff --git a/packages/contracts-bedrock/test/BenchmarkTest.t.sol b/packages/contracts-bedrock/test/BenchmarkTest.t.sol index 4722107a314f..063ed6944946 100644 --- a/packages/contracts-bedrock/test/BenchmarkTest.t.sol +++ b/packages/contracts-bedrock/test/BenchmarkTest.t.sol @@ -1,14 +1,20 @@ // SPDX-License-Identifier: MIT pragma solidity 0.8.15; -// Testing utilities +// Testing import { Test } from "forge-std/Test.sol"; import { Vm } from "forge-std/Vm.sol"; import { CommonTest } from "test/setup/CommonTest.sol"; import { Bridge_Initializer } from "test/setup/Bridge_Initializer.sol"; -import { CrossDomainMessenger } from "src/universal/CrossDomainMessenger.sol"; -import { ResourceMetering } from "src/L1/ResourceMetering.sol"; + +// Libraries import { Types } from "src/libraries/Types.sol"; +import { SafeCall } from "src/libraries/SafeCall.sol"; +import { L1BlockIsthmus } from "src/L2/L1BlockIsthmus.sol"; +import { Encoding } from "src/libraries/Encoding.sol"; + +// Interfaces +import { ICrossDomainMessenger } from "src/universal/interfaces/ICrossDomainMessenger.sol"; // Free function for setting the prevBaseFee param in the OptimismPortal. function setPrevBaseFee(Vm _vm, address _op, uint128 _prevBaseFee) { @@ -179,7 +185,7 @@ contract GasBenchMark_L1StandardBridge_Finalize is Bridge_Initializer { deal(address(L1Token), address(l1StandardBridge), 100, true); vm.mockCall( address(l1StandardBridge.messenger()), - abi.encodeWithSelector(CrossDomainMessenger.xDomainMessageSender.selector), + abi.encodeWithSelector(ICrossDomainMessenger.xDomainMessageSender.selector), abi.encode(address(l1StandardBridge.OTHER_BRIDGE())) ); vm.startPrank(address(l1StandardBridge.messenger())); @@ -209,3 +215,101 @@ contract GasBenchMark_L2OutputOracle is CommonTest { l2OutputOracle.proposeL2Output(nonZeroHash, nextBlockNumber, 0, 0); } } + +contract GasBenchMark_L1Block is CommonTest { + address depositor; + bytes setValuesCalldata; + + function setUp() public virtual override { + super.setUp(); + depositor = l1Block.DEPOSITOR_ACCOUNT(); + setValuesCalldata = Encoding.encodeSetL1BlockValuesEcotone( + type(uint32).max, + type(uint32).max, + type(uint64).max, + type(uint64).max, + type(uint64).max, + type(uint256).max, + type(uint256).max, + keccak256(abi.encode(1)), + bytes32(type(uint256).max) + ); + vm.startPrank(depositor); + } +} + +contract GasBenchMark_L1Block_SetValuesEcotone is GasBenchMark_L1Block { + function test_setL1BlockValuesEcotone_benchmark() external { + SafeCall.call({ _target: address(l1Block), _calldata: setValuesCalldata }); + } +} + +contract GasBenchMark_L1Block_SetValuesEcotone_Warm is GasBenchMark_L1Block { + function setUp() public virtual override { + SafeCall.call({ _target: address(l1Block), _calldata: setValuesCalldata }); + } + + function test_setL1BlockValuesEcotone_benchmark() external { + SafeCall.call({ _target: address(l1Block), _calldata: setValuesCalldata }); + } +} + +contract GasBenchMark_L1BlockIsthmus is GasBenchMark_L1Block { + L1BlockIsthmus l1BlockIsthmus; + + function setUp() public virtual override { + super.setUp(); + l1BlockIsthmus = new L1BlockIsthmus(); + setValuesCalldata = Encoding.encodeSetL1BlockValuesIsthmus( + type(uint32).max, + type(uint32).max, + type(uint64).max, + type(uint64).max, + type(uint64).max, + type(uint256).max, + type(uint256).max, + keccak256(abi.encode(1)), + bytes32(type(uint256).max) + ); + } +} + +contract GasBenchMark_L1BlockIsthmus_SetValuesIsthmus is GasBenchMark_L1BlockIsthmus { + function test_setL1BlockValuesIsthmus_benchmark() external { + SafeCall.call({ _target: address(l1BlockIsthmus), _calldata: setValuesCalldata }); + } +} + +contract GasBenchMark_L1BlockIsthmus_SetValuesIsthmus_Warm is GasBenchMark_L1BlockIsthmus { + function setUp() public virtual override { + SafeCall.call({ _target: address(l1BlockIsthmus), _calldata: setValuesCalldata }); + } + + function test_setL1BlockValuesIsthmus_benchmark() external { + SafeCall.call({ _target: address(l1BlockIsthmus), _calldata: setValuesCalldata }); + } +} + +contract GasBenchMark_L1BlockIsthmus_DepositsComplete is GasBenchMark_L1BlockIsthmus { + function test_depositsComplete_benchmark() external { + SafeCall.call({ + _target: address(l1BlockIsthmus), + _calldata: abi.encodeWithSelector(l1BlockIsthmus.depositsComplete.selector) + }); + } +} + +contract GasBenchMark_L1BlockIsthmus_DepositsComplete_Warm is GasBenchMark_L1BlockIsthmus { + function setUp() public virtual override { + super.setUp(); + // Set the isDeposit flag to true so then we can benchmark when it is reset. + SafeCall.call({ _target: address(l1BlockIsthmus), _calldata: setValuesCalldata }); + } + + function test_depositsComplete_benchmark() external { + SafeCall.call({ + _target: address(l1BlockIsthmus), + _calldata: abi.encodeWithSelector(l1BlockIsthmus.depositsComplete.selector) + }); + } +} diff --git a/packages/contracts-bedrock/test/DeployAuthSystem.t.sol b/packages/contracts-bedrock/test/DeployAuthSystem.t.sol new file mode 100644 index 000000000000..19985ef490b9 --- /dev/null +++ b/packages/contracts-bedrock/test/DeployAuthSystem.t.sol @@ -0,0 +1,159 @@ +// SPDX-License-Identifier: MIT +pragma solidity 0.8.15; + +import { Test, stdStorage, StdStorage } from "forge-std/Test.sol"; +import { stdToml } from "forge-std/StdToml.sol"; +import { Solarray } from "scripts/libraries/Solarray.sol"; + +import { DeployAuthSystemInput, DeployAuthSystem, DeployAuthSystemOutput } from "scripts/DeployAuthSystem.s.sol"; + +contract DeployAuthSystemInput_Test is Test { + DeployAuthSystemInput dasi; + + uint256 threshold = 5; + address[] owners; + + function setUp() public { + dasi = new DeployAuthSystemInput(); + address[] memory _owners = Solarray.addresses( + 0x1111111111111111111111111111111111111111, + 0x2222222222222222222222222222222222222222, + 0x3333333333333333333333333333333333333333, + 0x4444444444444444444444444444444444444444, + 0x5555555555555555555555555555555555555555, + 0x6666666666666666666666666666666666666666, + 0x7777777777777777777777777777777777777777 + ); + + for (uint256 i = 0; i < _owners.length; i++) { + owners.push(_owners[i]); + } + } + + function test_getters_whenNotSet_revert() public { + vm.expectRevert("DeployAuthSystemInput: threshold not set"); + dasi.threshold(); + + vm.expectRevert("DeployAuthSystemInput: owners not set"); + dasi.owners(); + } + + function test_setters_ownerAlreadySet_revert() public { + dasi.set(dasi.owners.selector, owners); + + vm.expectRevert("DeployAuthSystemInput: owners already set"); + dasi.set(dasi.owners.selector, owners); + } +} + +contract DeployAuthSystemOutput_Test is Test { + using stdToml for string; + + DeployAuthSystemOutput daso; + + function setUp() public { + daso = new DeployAuthSystemOutput(); + } + + function test_set_succeeds() public { + address safeAddr = makeAddr("safe"); + + vm.etch(safeAddr, hex"01"); + + daso.set(daso.safe.selector, safeAddr); + + assertEq(safeAddr, address(daso.safe()), "100"); + } + + function test_getter_whenNotSet_reverts() public { + vm.expectRevert("DeployUtils: zero address"); + daso.safe(); + } + + function test_getter_whenAddrHasNoCode_reverts() public { + address emptyAddr = makeAddr("emptyAddr"); + bytes memory expectedErr = bytes(string.concat("DeployUtils: no code at ", vm.toString(emptyAddr))); + + daso.set(daso.safe.selector, emptyAddr); + vm.expectRevert(expectedErr); + daso.safe(); + } +} + +contract DeployAuthSystem_Test is Test { + using stdStorage for StdStorage; + + DeployAuthSystem deployAuthSystem; + DeployAuthSystemInput dasi; + DeployAuthSystemOutput daso; + + // Define default input variables for testing. + uint256 defaultThreshold = 5; + uint256 defaultOwnersLength = 7; + address[] defaultOwners; + + function setUp() public { + deployAuthSystem = new DeployAuthSystem(); + (dasi, daso) = deployAuthSystem.etchIOContracts(); + for (uint256 i = 0; i < defaultOwnersLength; i++) { + defaultOwners.push(makeAddr(string.concat("owner", vm.toString(i)))); + } + } + + function hash(bytes32 _seed, uint256 _i) internal pure returns (bytes32) { + return keccak256(abi.encode(_seed, _i)); + } + + function testFuzz_run_memory_succeeds(bytes32 _seed) public { + address[] memory _owners = Solarray.addresses( + address(uint160(uint256(hash(_seed, 0)))), + address(uint160(uint256(hash(_seed, 1)))), + address(uint160(uint256(hash(_seed, 2)))), + address(uint160(uint256(hash(_seed, 3)))), + address(uint160(uint256(hash(_seed, 4)))), + address(uint160(uint256(hash(_seed, 5)))), + address(uint160(uint256(hash(_seed, 6)))) + ); + + uint256 threshold = bound(uint256(_seed), 1, _owners.length - 1); + + dasi.set(dasi.owners.selector, _owners); + dasi.set(dasi.threshold.selector, threshold); + + deployAuthSystem.run(dasi, daso); + + assertNotEq(address(daso.safe()), address(0), "100"); + assertEq(daso.safe().getThreshold(), threshold, "200"); + // TODO: the getOwners() method requires iterating over the owners linked list. + // Since we're not yet performing a proper deployment of the Safe, this call will revert. + // assertEq(daso.safe().getOwners().length, _owners.length, "300"); + + // Architecture assertions. + // TODO: these will become relevant as we add more contracts to the auth system, and need to test their + // relationships. + + daso.checkOutput(); + } + + function test_run_NullInput_reverts() public { + dasi.set(dasi.owners.selector, defaultOwners); + dasi.set(dasi.threshold.selector, defaultThreshold); + + // Zero out the owners length slot + uint256 slot = 9; + vm.store(address(dasi), bytes32(uint256(9)), bytes32(0)); + vm.expectRevert("DeployAuthSystemInput: owners not set"); + deployAuthSystem.run(dasi, daso); + vm.store(address(dasi), bytes32(uint256(9)), bytes32(defaultOwnersLength)); + + slot = zeroOutSlotForSelector(dasi.threshold.selector); + vm.expectRevert("DeployAuthSystemInput: threshold not set"); + deployAuthSystem.run(dasi, daso); + vm.store(address(dasi), bytes32(slot), bytes32(defaultThreshold)); + } + + function zeroOutSlotForSelector(bytes4 _selector) internal returns (uint256 slot_) { + slot_ = stdstore.enable_packed_slots().target(address(dasi)).sig(_selector).find(); + vm.store(address(dasi), bytes32(slot_), bytes32(0)); + } +} diff --git a/packages/contracts-bedrock/test/DeployImplementations.t.sol b/packages/contracts-bedrock/test/DeployImplementations.t.sol new file mode 100644 index 000000000000..957eb2830435 --- /dev/null +++ b/packages/contracts-bedrock/test/DeployImplementations.t.sol @@ -0,0 +1,348 @@ +// SPDX-License-Identifier: MIT +pragma solidity 0.8.15; + +import { Test, stdStorage, StdStorage } from "forge-std/Test.sol"; + +import { DelayedWETH } from "src/dispute/DelayedWETH.sol"; +import { PreimageOracle } from "src/cannon/PreimageOracle.sol"; +import { MIPS } from "src/cannon/MIPS.sol"; +import { DisputeGameFactory } from "src/dispute/DisputeGameFactory.sol"; + +import { SuperchainConfig } from "src/L1/SuperchainConfig.sol"; +import { ProtocolVersions } from "src/L1/ProtocolVersions.sol"; +import { OPStackManager } from "src/L1/OPStackManager.sol"; +import { OptimismPortal2 } from "src/L1/OptimismPortal2.sol"; +import { SystemConfig } from "src/L1/SystemConfig.sol"; +import { L1CrossDomainMessenger } from "src/L1/L1CrossDomainMessenger.sol"; +import { L1ERC721Bridge } from "src/L1/L1ERC721Bridge.sol"; +import { L1StandardBridge } from "src/L1/L1StandardBridge.sol"; +import { OptimismMintableERC20Factory } from "src/universal/OptimismMintableERC20Factory.sol"; +import { ProxyAdmin } from "src/universal/ProxyAdmin.sol"; +import { Proxy } from "src/universal/Proxy.sol"; + +import { + DeployImplementationsInput, + DeployImplementations, + DeployImplementationsInterop, + DeployImplementationsOutput +} from "scripts/DeployImplementations.s.sol"; + +contract DeployImplementationsInput_Test is Test { + DeployImplementationsInput dii; + + uint256 withdrawalDelaySeconds = 100; + uint256 minProposalSizeBytes = 200; + uint256 challengePeriodSeconds = 300; + uint256 proofMaturityDelaySeconds = 400; + uint256 disputeGameFinalityDelaySeconds = 500; + string release = "op-contracts/latest"; + SuperchainConfig superchainConfigProxy = SuperchainConfig(makeAddr("superchainConfigProxy")); + ProtocolVersions protocolVersionsProxy = ProtocolVersions(makeAddr("protocolVersionsProxy")); + + function setUp() public { + dii = new DeployImplementationsInput(); + } + + function test_getters_whenNotSet_revert() public { + vm.expectRevert("DeployImplementationsInput: not set"); + dii.withdrawalDelaySeconds(); + + vm.expectRevert("DeployImplementationsInput: not set"); + dii.minProposalSizeBytes(); + + vm.expectRevert("DeployImplementationsInput: not set"); + dii.challengePeriodSeconds(); + + vm.expectRevert("DeployImplementationsInput: not set"); + dii.proofMaturityDelaySeconds(); + + vm.expectRevert("DeployImplementationsInput: not set"); + dii.disputeGameFinalityDelaySeconds(); + + vm.expectRevert("DeployImplementationsInput: not set"); + dii.release(); + + vm.expectRevert("DeployImplementationsInput: not set"); + dii.superchainConfigProxy(); + + vm.expectRevert("DeployImplementationsInput: not set"); + dii.protocolVersionsProxy(); + + vm.expectRevert("DeployImplementationsInput: not set"); + dii.superchainProxyAdmin(); + } + + function test_superchainProxyAdmin_whenNotSet_reverts() public { + vm.expectRevert("DeployImplementationsInput: not set"); + dii.superchainProxyAdmin(); + + dii.set(dii.superchainConfigProxy.selector, address(superchainConfigProxy)); + vm.expectRevert(); + dii.superchainProxyAdmin(); + + Proxy noAdminProxy = new Proxy(address(0)); + dii.set(dii.superchainConfigProxy.selector, address(noAdminProxy)); + vm.expectRevert("DeployImplementationsInput: not set"); + dii.superchainProxyAdmin(); + } + + function test_superchainProxyAdmin_succeeds() public { + Proxy proxyWithAdminSet = new Proxy(msg.sender); + dii.set(dii.superchainConfigProxy.selector, address(proxyWithAdminSet)); + ProxyAdmin proxyAdmin = dii.superchainProxyAdmin(); + assertEq(address(msg.sender), address(proxyAdmin), "100"); + } +} + +contract DeployImplementationsOutput_Test is Test { + DeployImplementationsOutput dio; + + function setUp() public { + dio = new DeployImplementationsOutput(); + } + + function test_set_succeeds() public { + Proxy proxy = new Proxy(address(0)); + address opsmImpl = address(makeAddr("opsmImpl")); + vm.prank(address(0)); + proxy.upgradeTo(opsmImpl); + + OPStackManager opsmProxy = OPStackManager(address(proxy)); + OptimismPortal2 optimismPortalImpl = OptimismPortal2(payable(makeAddr("optimismPortalImpl"))); + DelayedWETH delayedWETHImpl = DelayedWETH(payable(makeAddr("delayedWETHImpl"))); + PreimageOracle preimageOracleSingleton = PreimageOracle(makeAddr("preimageOracleSingleton")); + MIPS mipsSingleton = MIPS(makeAddr("mipsSingleton")); + SystemConfig systemConfigImpl = SystemConfig(makeAddr("systemConfigImpl")); + L1CrossDomainMessenger l1CrossDomainMessengerImpl = + L1CrossDomainMessenger(makeAddr("l1CrossDomainMessengerImpl")); + L1ERC721Bridge l1ERC721BridgeImpl = L1ERC721Bridge(makeAddr("l1ERC721BridgeImpl")); + L1StandardBridge l1StandardBridgeImpl = L1StandardBridge(payable(makeAddr("l1StandardBridgeImpl"))); + OptimismMintableERC20Factory optimismMintableERC20FactoryImpl = + OptimismMintableERC20Factory(makeAddr("optimismMintableERC20FactoryImpl")); + DisputeGameFactory disputeGameFactoryImpl = DisputeGameFactory(makeAddr("disputeGameFactoryImpl")); + + vm.etch(address(opsmProxy), address(opsmProxy).code); + vm.etch(address(opsmImpl), hex"01"); + vm.etch(address(optimismPortalImpl), hex"01"); + vm.etch(address(delayedWETHImpl), hex"01"); + vm.etch(address(preimageOracleSingleton), hex"01"); + vm.etch(address(mipsSingleton), hex"01"); + vm.etch(address(systemConfigImpl), hex"01"); + vm.etch(address(l1CrossDomainMessengerImpl), hex"01"); + vm.etch(address(l1ERC721BridgeImpl), hex"01"); + vm.etch(address(l1StandardBridgeImpl), hex"01"); + vm.etch(address(optimismMintableERC20FactoryImpl), hex"01"); + vm.etch(address(disputeGameFactoryImpl), hex"01"); + dio.set(dio.opsmProxy.selector, address(opsmProxy)); + dio.set(dio.optimismPortalImpl.selector, address(optimismPortalImpl)); + dio.set(dio.delayedWETHImpl.selector, address(delayedWETHImpl)); + dio.set(dio.preimageOracleSingleton.selector, address(preimageOracleSingleton)); + dio.set(dio.mipsSingleton.selector, address(mipsSingleton)); + dio.set(dio.systemConfigImpl.selector, address(systemConfigImpl)); + dio.set(dio.l1CrossDomainMessengerImpl.selector, address(l1CrossDomainMessengerImpl)); + dio.set(dio.l1ERC721BridgeImpl.selector, address(l1ERC721BridgeImpl)); + dio.set(dio.l1StandardBridgeImpl.selector, address(l1StandardBridgeImpl)); + dio.set(dio.optimismMintableERC20FactoryImpl.selector, address(optimismMintableERC20FactoryImpl)); + dio.set(dio.disputeGameFactoryImpl.selector, address(disputeGameFactoryImpl)); + + assertEq(address(opsmProxy), address(dio.opsmProxy()), "50"); + assertEq(address(optimismPortalImpl), address(dio.optimismPortalImpl()), "100"); + assertEq(address(delayedWETHImpl), address(dio.delayedWETHImpl()), "200"); + assertEq(address(preimageOracleSingleton), address(dio.preimageOracleSingleton()), "300"); + assertEq(address(mipsSingleton), address(dio.mipsSingleton()), "400"); + assertEq(address(systemConfigImpl), address(dio.systemConfigImpl()), "500"); + assertEq(address(l1CrossDomainMessengerImpl), address(dio.l1CrossDomainMessengerImpl()), "600"); + assertEq(address(l1ERC721BridgeImpl), address(dio.l1ERC721BridgeImpl()), "700"); + assertEq(address(l1StandardBridgeImpl), address(dio.l1StandardBridgeImpl()), "800"); + assertEq(address(optimismMintableERC20FactoryImpl), address(dio.optimismMintableERC20FactoryImpl()), "900"); + assertEq(address(disputeGameFactoryImpl), address(dio.disputeGameFactoryImpl()), "950"); + } + + function test_getters_whenNotSet_revert() public { + bytes memory expectedErr = "DeployUtils: zero address"; + + vm.expectRevert(expectedErr); + dio.optimismPortalImpl(); + + vm.expectRevert(expectedErr); + dio.delayedWETHImpl(); + + vm.expectRevert(expectedErr); + dio.preimageOracleSingleton(); + + vm.expectRevert(expectedErr); + dio.mipsSingleton(); + + vm.expectRevert(expectedErr); + dio.systemConfigImpl(); + + vm.expectRevert(expectedErr); + dio.l1CrossDomainMessengerImpl(); + + vm.expectRevert(expectedErr); + dio.l1ERC721BridgeImpl(); + + vm.expectRevert(expectedErr); + dio.l1StandardBridgeImpl(); + + vm.expectRevert(expectedErr); + dio.optimismMintableERC20FactoryImpl(); + + vm.expectRevert(expectedErr); + dio.disputeGameFactoryImpl(); + } + + function test_getters_whenAddrHasNoCode_reverts() public { + address emptyAddr = makeAddr("emptyAddr"); + bytes memory expectedErr = bytes(string.concat("DeployUtils: no code at ", vm.toString(emptyAddr))); + + dio.set(dio.optimismPortalImpl.selector, emptyAddr); + vm.expectRevert(expectedErr); + dio.optimismPortalImpl(); + + dio.set(dio.delayedWETHImpl.selector, emptyAddr); + vm.expectRevert(expectedErr); + dio.delayedWETHImpl(); + + dio.set(dio.preimageOracleSingleton.selector, emptyAddr); + vm.expectRevert(expectedErr); + dio.preimageOracleSingleton(); + + dio.set(dio.mipsSingleton.selector, emptyAddr); + vm.expectRevert(expectedErr); + dio.mipsSingleton(); + + dio.set(dio.systemConfigImpl.selector, emptyAddr); + vm.expectRevert(expectedErr); + dio.systemConfigImpl(); + + dio.set(dio.l1CrossDomainMessengerImpl.selector, emptyAddr); + vm.expectRevert(expectedErr); + dio.l1CrossDomainMessengerImpl(); + + dio.set(dio.l1ERC721BridgeImpl.selector, emptyAddr); + vm.expectRevert(expectedErr); + dio.l1ERC721BridgeImpl(); + + dio.set(dio.l1StandardBridgeImpl.selector, emptyAddr); + vm.expectRevert(expectedErr); + dio.l1StandardBridgeImpl(); + + dio.set(dio.optimismMintableERC20FactoryImpl.selector, emptyAddr); + vm.expectRevert(expectedErr); + dio.optimismMintableERC20FactoryImpl(); + } +} + +contract DeployImplementations_Test is Test { + using stdStorage for StdStorage; + + DeployImplementations deployImplementations; + DeployImplementationsInput dii; + DeployImplementationsOutput dio; + + // Define default inputs for testing. + uint256 withdrawalDelaySeconds = 100; + uint256 minProposalSizeBytes = 200; + uint256 challengePeriodSeconds = 300; + uint256 proofMaturityDelaySeconds = 400; + uint256 disputeGameFinalityDelaySeconds = 500; + string release = "op-contracts/latest"; + SuperchainConfig superchainConfigProxy = SuperchainConfig(makeAddr("superchainConfigProxy")); + ProtocolVersions protocolVersionsProxy = ProtocolVersions(makeAddr("protocolVersionsProxy")); + + function setUp() public virtual { + deployImplementations = new DeployImplementations(); + (dii, dio) = deployImplementations.etchIOContracts(); + } + + // By deploying the `DeployImplementations` contract with this virtual function, we provide a + // hook that child contracts can override to return a different implementation of the contract. + // This lets us test e.g. the `DeployImplementationsInterop` contract without duplicating test code. + function createDeployImplementationsContract() internal virtual returns (DeployImplementations) { + return new DeployImplementations(); + } + + function hash(bytes32 _seed, uint256 _i) internal pure returns (bytes32) { + return keccak256(abi.encode(_seed, _i)); + } + + function testFuzz_run_memory_succeeds(bytes32 _seed) public { + withdrawalDelaySeconds = uint256(hash(_seed, 0)); + minProposalSizeBytes = uint256(hash(_seed, 1)); + challengePeriodSeconds = bound(uint256(hash(_seed, 2)), 0, type(uint64).max); + proofMaturityDelaySeconds = uint256(hash(_seed, 3)); + disputeGameFinalityDelaySeconds = uint256(hash(_seed, 4)); + release = string(bytes.concat(hash(_seed, 5))); + protocolVersionsProxy = ProtocolVersions(address(uint160(uint256(hash(_seed, 7))))); + + // Must configure the ProxyAdmin contract which is used to upgrade the OPSM's proxy contract. + ProxyAdmin superchainProxyAdmin = new ProxyAdmin(msg.sender); + superchainConfigProxy = SuperchainConfig(address(new Proxy(payable(address(superchainProxyAdmin))))); + + SuperchainConfig superchainConfigImpl = SuperchainConfig(address(uint160(uint256(hash(_seed, 6))))); + vm.prank(address(superchainProxyAdmin)); + Proxy(payable(address(superchainConfigProxy))).upgradeTo(address(superchainConfigImpl)); + + vm.etch(address(superchainProxyAdmin), address(superchainProxyAdmin).code); + vm.etch(address(superchainConfigProxy), address(superchainConfigProxy).code); + vm.etch(address(protocolVersionsProxy), hex"01"); + + dii.set(dii.withdrawalDelaySeconds.selector, withdrawalDelaySeconds); + dii.set(dii.minProposalSizeBytes.selector, minProposalSizeBytes); + dii.set(dii.challengePeriodSeconds.selector, challengePeriodSeconds); + dii.set(dii.proofMaturityDelaySeconds.selector, proofMaturityDelaySeconds); + dii.set(dii.disputeGameFinalityDelaySeconds.selector, disputeGameFinalityDelaySeconds); + dii.set(dii.release.selector, release); + dii.set(dii.superchainConfigProxy.selector, address(superchainConfigProxy)); + dii.set(dii.protocolVersionsProxy.selector, address(protocolVersionsProxy)); + + deployImplementations.run(dii, dio); + + // Assert that individual input fields were properly set based on the inputs. + assertEq(withdrawalDelaySeconds, dii.withdrawalDelaySeconds(), "100"); + assertEq(minProposalSizeBytes, dii.minProposalSizeBytes(), "200"); + assertEq(challengePeriodSeconds, dii.challengePeriodSeconds(), "300"); + assertEq(proofMaturityDelaySeconds, dii.proofMaturityDelaySeconds(), "400"); + assertEq(disputeGameFinalityDelaySeconds, dii.disputeGameFinalityDelaySeconds(), "500"); + assertEq(release, dii.release(), "525"); + assertEq(address(superchainConfigProxy), address(dii.superchainConfigProxy()), "550"); + assertEq(address(protocolVersionsProxy), address(dii.protocolVersionsProxy()), "575"); + assertEq(address(superchainProxyAdmin), address(dii.superchainProxyAdmin()), "580"); + + // Architecture assertions. + assertEq(address(dio.mipsSingleton().oracle()), address(dio.preimageOracleSingleton()), "600"); + + // Ensure that `checkOutput` passes. This is called by the `run` function during execution, + // so this just acts as a sanity check. It reverts on failure. + dio.checkOutput(dii); + } + + function testFuzz_run_largeChallengePeriodSeconds_reverts(uint256 _challengePeriodSeconds) public { + // Set the defaults. + dii.set(dii.withdrawalDelaySeconds.selector, withdrawalDelaySeconds); + dii.set(dii.minProposalSizeBytes.selector, minProposalSizeBytes); + dii.set(dii.challengePeriodSeconds.selector, challengePeriodSeconds); + dii.set(dii.proofMaturityDelaySeconds.selector, proofMaturityDelaySeconds); + dii.set(dii.disputeGameFinalityDelaySeconds.selector, disputeGameFinalityDelaySeconds); + dii.set(dii.release.selector, release); + dii.set(dii.superchainConfigProxy.selector, address(superchainConfigProxy)); + dii.set(dii.protocolVersionsProxy.selector, address(protocolVersionsProxy)); + + // Set the challenge period to a value that is too large, using vm.store because the setter + // method won't allow it. + challengePeriodSeconds = bound(_challengePeriodSeconds, uint256(type(uint64).max) + 1, type(uint256).max); + uint256 slot = + stdstore.enable_packed_slots().target(address(dii)).sig(dii.challengePeriodSeconds.selector).find(); + vm.store(address(dii), bytes32(slot), bytes32(challengePeriodSeconds)); + + vm.expectRevert("DeployImplementationsInput: challengePeriodSeconds too large"); + deployImplementations.run(dii, dio); + } +} + +contract DeployImplementationsInterop_Test is DeployImplementations_Test { + function createDeployImplementationsContract() internal override returns (DeployImplementations) { + return new DeployImplementationsInterop(); + } +} diff --git a/packages/contracts-bedrock/test/DeployOPChain.t.sol b/packages/contracts-bedrock/test/DeployOPChain.t.sol new file mode 100644 index 000000000000..ef8fc06cc626 --- /dev/null +++ b/packages/contracts-bedrock/test/DeployOPChain.t.sol @@ -0,0 +1,489 @@ +// SPDX-License-Identifier: MIT +pragma solidity 0.8.15; + +import { Test } from "forge-std/Test.sol"; + +import { DeploySuperchainInput, DeploySuperchain, DeploySuperchainOutput } from "scripts/DeploySuperchain.s.sol"; +import { + DeployImplementationsInput, + DeployImplementations, + DeployImplementationsInterop, + DeployImplementationsOutput +} from "scripts/DeployImplementations.s.sol"; +import { DeployOPChainInput, DeployOPChain, DeployOPChainOutput } from "scripts/DeployOPChain.s.sol"; + +import { ProxyAdmin } from "src/universal/ProxyAdmin.sol"; + +import { AddressManager } from "src/legacy/AddressManager.sol"; +import { DelayedWETH } from "src/dispute/DelayedWETH.sol"; +import { DisputeGameFactory } from "src/dispute/DisputeGameFactory.sol"; +import { AnchorStateRegistry } from "src/dispute/AnchorStateRegistry.sol"; +import { FaultDisputeGame } from "src/dispute/FaultDisputeGame.sol"; +import { PermissionedDisputeGame } from "src/dispute/PermissionedDisputeGame.sol"; + +import { SuperchainConfig } from "src/L1/SuperchainConfig.sol"; +import { ProtocolVersions, ProtocolVersion } from "src/L1/ProtocolVersions.sol"; +import { OPStackManager } from "src/L1/OPStackManager.sol"; +import { OptimismPortal2 } from "src/L1/OptimismPortal2.sol"; +import { SystemConfig } from "src/L1/SystemConfig.sol"; +import { L1CrossDomainMessenger } from "src/L1/L1CrossDomainMessenger.sol"; +import { L1ERC721Bridge } from "src/L1/L1ERC721Bridge.sol"; +import { L1StandardBridge } from "src/L1/L1StandardBridge.sol"; +import { OptimismMintableERC20Factory } from "src/universal/OptimismMintableERC20Factory.sol"; + +import { GameType, GameTypes, Hash, OutputRoot } from "src/dispute/lib/Types.sol"; + +contract DeployOPChainInput_Test is Test { + DeployOPChainInput doi; + + // Define defaults. + address opChainProxyAdminOwner = makeAddr("opChainProxyAdminOwner"); + address systemConfigOwner = makeAddr("systemConfigOwner"); + address batcher = makeAddr("batcher"); + address unsafeBlockSigner = makeAddr("unsafeBlockSigner"); + address proposer = makeAddr("proposer"); + address challenger = makeAddr("challenger"); + uint32 basefeeScalar = 100; + uint32 blobBaseFeeScalar = 200; + uint256 l2ChainId = 300; + OPStackManager opsm = OPStackManager(makeAddr("opsm")); + + function setUp() public { + doi = new DeployOPChainInput(); + } + + function test_set_succeeds() public { + doi.set(doi.opChainProxyAdminOwner.selector, opChainProxyAdminOwner); + doi.set(doi.systemConfigOwner.selector, systemConfigOwner); + doi.set(doi.batcher.selector, batcher); + doi.set(doi.unsafeBlockSigner.selector, unsafeBlockSigner); + doi.set(doi.proposer.selector, proposer); + doi.set(doi.challenger.selector, challenger); + doi.set(doi.basefeeScalar.selector, basefeeScalar); + doi.set(doi.blobBaseFeeScalar.selector, blobBaseFeeScalar); + doi.set(doi.l2ChainId.selector, l2ChainId); + doi.set(doi.opsmProxy.selector, address(opsm)); + // Compare the default inputs to the getter methods. + assertEq(opChainProxyAdminOwner, doi.opChainProxyAdminOwner(), "200"); + assertEq(systemConfigOwner, doi.systemConfigOwner(), "300"); + assertEq(batcher, doi.batcher(), "400"); + assertEq(unsafeBlockSigner, doi.unsafeBlockSigner(), "500"); + assertEq(proposer, doi.proposer(), "600"); + assertEq(challenger, doi.challenger(), "700"); + assertEq(basefeeScalar, doi.basefeeScalar(), "800"); + assertEq(blobBaseFeeScalar, doi.blobBaseFeeScalar(), "900"); + assertEq(l2ChainId, doi.l2ChainId(), "1000"); + assertEq(address(opsm), address(doi.opsmProxy()), "1100"); + } + + function test_getters_whenNotSet_revert() public { + bytes memory expectedErr = "DeployOPChainInput: not set"; + + vm.expectRevert(expectedErr); + doi.opChainProxyAdminOwner(); + + vm.expectRevert(expectedErr); + doi.systemConfigOwner(); + + vm.expectRevert(expectedErr); + doi.batcher(); + + vm.expectRevert(expectedErr); + doi.unsafeBlockSigner(); + + vm.expectRevert(expectedErr); + doi.proposer(); + + vm.expectRevert(expectedErr); + doi.challenger(); + + vm.expectRevert(expectedErr); + doi.basefeeScalar(); + + vm.expectRevert(expectedErr); + doi.blobBaseFeeScalar(); + + vm.expectRevert(expectedErr); + doi.l2ChainId(); + } +} + +contract DeployOPChainOutput_Test is Test { + DeployOPChainOutput doo; + + // Define default outputs to set. + // We set these in storage because doing it locally in test_set_succeeds results in stack too deep. + ProxyAdmin opChainProxyAdmin = ProxyAdmin(makeAddr("optimismPortal2Impl")); + AddressManager addressManager = AddressManager(makeAddr("delayedWETHImpl")); + L1ERC721Bridge l1ERC721BridgeProxy = L1ERC721Bridge(makeAddr("l1ERC721BridgeProxy")); + SystemConfig systemConfigProxy = SystemConfig(makeAddr("systemConfigProxy")); + OptimismMintableERC20Factory optimismMintableERC20FactoryProxy = + OptimismMintableERC20Factory(makeAddr("optimismMintableERC20FactoryProxy")); + L1StandardBridge l1StandardBridgeProxy = L1StandardBridge(payable(makeAddr("l1StandardBridgeProxy"))); + L1CrossDomainMessenger l1CrossDomainMessengerProxy = L1CrossDomainMessenger(makeAddr("l1CrossDomainMessengerProxy")); + OptimismPortal2 optimismPortalProxy = OptimismPortal2(payable(makeAddr("optimismPortalProxy"))); + DisputeGameFactory disputeGameFactoryProxy = DisputeGameFactory(makeAddr("disputeGameFactoryProxy")); + AnchorStateRegistry anchorStateRegistryProxy = AnchorStateRegistry(makeAddr("anchorStateRegistryProxy")); + AnchorStateRegistry anchorStateRegistryImpl = AnchorStateRegistry(makeAddr("anchorStateRegistryImpl")); + FaultDisputeGame faultDisputeGame = FaultDisputeGame(makeAddr("faultDisputeGame")); + PermissionedDisputeGame permissionedDisputeGame = PermissionedDisputeGame(makeAddr("permissionedDisputeGame")); + DelayedWETH delayedWETHPermissionedGameProxy = DelayedWETH(payable(makeAddr("delayedWETHPermissionedGameProxy"))); + DelayedWETH delayedWETHPermissionlessGameProxy = + DelayedWETH(payable(makeAddr("delayedWETHPermissionlessGameProxy"))); + + function setUp() public { + doo = new DeployOPChainOutput(); + } + + function test_set_succeeds() public { + vm.etch(address(opChainProxyAdmin), hex"01"); + vm.etch(address(addressManager), hex"01"); + vm.etch(address(l1ERC721BridgeProxy), hex"01"); + vm.etch(address(systemConfigProxy), hex"01"); + vm.etch(address(optimismMintableERC20FactoryProxy), hex"01"); + vm.etch(address(l1StandardBridgeProxy), hex"01"); + vm.etch(address(l1CrossDomainMessengerProxy), hex"01"); + vm.etch(address(optimismPortalProxy), hex"01"); + vm.etch(address(disputeGameFactoryProxy), hex"01"); + vm.etch(address(anchorStateRegistryProxy), hex"01"); + vm.etch(address(anchorStateRegistryImpl), hex"01"); + vm.etch(address(faultDisputeGame), hex"01"); + vm.etch(address(permissionedDisputeGame), hex"01"); + vm.etch(address(delayedWETHPermissionedGameProxy), hex"01"); + vm.etch(address(delayedWETHPermissionlessGameProxy), hex"01"); + + doo.set(doo.opChainProxyAdmin.selector, address(opChainProxyAdmin)); + doo.set(doo.addressManager.selector, address(addressManager)); + doo.set(doo.l1ERC721BridgeProxy.selector, address(l1ERC721BridgeProxy)); + doo.set(doo.systemConfigProxy.selector, address(systemConfigProxy)); + doo.set(doo.optimismMintableERC20FactoryProxy.selector, address(optimismMintableERC20FactoryProxy)); + doo.set(doo.l1StandardBridgeProxy.selector, address(l1StandardBridgeProxy)); + doo.set(doo.l1CrossDomainMessengerProxy.selector, address(l1CrossDomainMessengerProxy)); + doo.set(doo.optimismPortalProxy.selector, address(optimismPortalProxy)); + doo.set(doo.disputeGameFactoryProxy.selector, address(disputeGameFactoryProxy)); + doo.set(doo.anchorStateRegistryProxy.selector, address(anchorStateRegistryProxy)); + doo.set(doo.anchorStateRegistryImpl.selector, address(anchorStateRegistryImpl)); + doo.set(doo.faultDisputeGame.selector, address(faultDisputeGame)); + doo.set(doo.permissionedDisputeGame.selector, address(permissionedDisputeGame)); + doo.set(doo.delayedWETHPermissionedGameProxy.selector, address(delayedWETHPermissionedGameProxy)); + doo.set(doo.delayedWETHPermissionlessGameProxy.selector, address(delayedWETHPermissionlessGameProxy)); + + assertEq(address(opChainProxyAdmin), address(doo.opChainProxyAdmin()), "100"); + assertEq(address(addressManager), address(doo.addressManager()), "200"); + assertEq(address(l1ERC721BridgeProxy), address(doo.l1ERC721BridgeProxy()), "300"); + assertEq(address(systemConfigProxy), address(doo.systemConfigProxy()), "400"); + assertEq(address(optimismMintableERC20FactoryProxy), address(doo.optimismMintableERC20FactoryProxy()), "500"); + assertEq(address(l1StandardBridgeProxy), address(doo.l1StandardBridgeProxy()), "600"); + assertEq(address(l1CrossDomainMessengerProxy), address(doo.l1CrossDomainMessengerProxy()), "700"); + assertEq(address(optimismPortalProxy), address(doo.optimismPortalProxy()), "800"); + assertEq(address(disputeGameFactoryProxy), address(doo.disputeGameFactoryProxy()), "900"); + assertEq(address(anchorStateRegistryProxy), address(doo.anchorStateRegistryProxy()), "1100"); + assertEq(address(anchorStateRegistryImpl), address(doo.anchorStateRegistryImpl()), "1200"); + assertEq(address(faultDisputeGame), address(doo.faultDisputeGame()), "1300"); + assertEq(address(permissionedDisputeGame), address(doo.permissionedDisputeGame()), "1400"); + assertEq(address(delayedWETHPermissionedGameProxy), address(doo.delayedWETHPermissionedGameProxy()), "1500"); + assertEq(address(delayedWETHPermissionlessGameProxy), address(doo.delayedWETHPermissionlessGameProxy()), "1600"); + } + + function test_getters_whenNotSet_revert() public { + bytes memory expectedErr = "DeployUtils: zero address"; + + vm.expectRevert(expectedErr); + doo.opChainProxyAdmin(); + + vm.expectRevert(expectedErr); + doo.addressManager(); + + vm.expectRevert(expectedErr); + doo.l1ERC721BridgeProxy(); + + vm.expectRevert(expectedErr); + doo.systemConfigProxy(); + + vm.expectRevert(expectedErr); + doo.optimismMintableERC20FactoryProxy(); + + vm.expectRevert(expectedErr); + doo.l1StandardBridgeProxy(); + + vm.expectRevert(expectedErr); + doo.l1CrossDomainMessengerProxy(); + + vm.expectRevert(expectedErr); + doo.optimismPortalProxy(); + + vm.expectRevert(expectedErr); + doo.disputeGameFactoryProxy(); + + vm.expectRevert(expectedErr); + doo.anchorStateRegistryProxy(); + + vm.expectRevert(expectedErr); + doo.anchorStateRegistryImpl(); + + vm.expectRevert(expectedErr); + doo.faultDisputeGame(); + + vm.expectRevert(expectedErr); + doo.permissionedDisputeGame(); + + vm.expectRevert(expectedErr); + doo.delayedWETHPermissionedGameProxy(); + + vm.expectRevert(expectedErr); + doo.delayedWETHPermissionlessGameProxy(); + } + + function test_getters_whenAddrHasNoCode_reverts() public { + address emptyAddr = makeAddr("emptyAddr"); + bytes memory expectedErr = bytes(string.concat("DeployUtils: no code at ", vm.toString(emptyAddr))); + + doo.set(doo.opChainProxyAdmin.selector, emptyAddr); + vm.expectRevert(expectedErr); + doo.opChainProxyAdmin(); + + doo.set(doo.addressManager.selector, emptyAddr); + vm.expectRevert(expectedErr); + doo.addressManager(); + + doo.set(doo.l1ERC721BridgeProxy.selector, emptyAddr); + vm.expectRevert(expectedErr); + doo.l1ERC721BridgeProxy(); + + doo.set(doo.systemConfigProxy.selector, emptyAddr); + vm.expectRevert(expectedErr); + doo.systemConfigProxy(); + + doo.set(doo.optimismMintableERC20FactoryProxy.selector, emptyAddr); + vm.expectRevert(expectedErr); + doo.optimismMintableERC20FactoryProxy(); + + doo.set(doo.l1StandardBridgeProxy.selector, emptyAddr); + vm.expectRevert(expectedErr); + doo.l1StandardBridgeProxy(); + + doo.set(doo.l1CrossDomainMessengerProxy.selector, emptyAddr); + vm.expectRevert(expectedErr); + doo.l1CrossDomainMessengerProxy(); + + doo.set(doo.optimismPortalProxy.selector, emptyAddr); + vm.expectRevert(expectedErr); + doo.optimismPortalProxy(); + + doo.set(doo.disputeGameFactoryProxy.selector, emptyAddr); + vm.expectRevert(expectedErr); + doo.disputeGameFactoryProxy(); + + doo.set(doo.anchorStateRegistryProxy.selector, emptyAddr); + vm.expectRevert(expectedErr); + doo.anchorStateRegistryProxy(); + + doo.set(doo.anchorStateRegistryImpl.selector, emptyAddr); + vm.expectRevert(expectedErr); + doo.anchorStateRegistryImpl(); + + doo.set(doo.faultDisputeGame.selector, emptyAddr); + vm.expectRevert(expectedErr); + doo.faultDisputeGame(); + + doo.set(doo.permissionedDisputeGame.selector, emptyAddr); + vm.expectRevert(expectedErr); + doo.permissionedDisputeGame(); + + doo.set(doo.delayedWETHPermissionedGameProxy.selector, emptyAddr); + vm.expectRevert(expectedErr); + doo.delayedWETHPermissionedGameProxy(); + + doo.set(doo.delayedWETHPermissionlessGameProxy.selector, emptyAddr); + vm.expectRevert(expectedErr); + doo.delayedWETHPermissionlessGameProxy(); + } +} + +// To mimic a production environment, we default to integration tests here that actually run the +// DeploySuperchain and DeployImplementations scripts. +contract DeployOPChain_TestBase is Test { + DeployOPChain deployOPChain; + DeployOPChainInput doi; + DeployOPChainOutput doo; + + // Define default inputs for DeploySuperchain. + address proxyAdminOwner = makeAddr("defaultProxyAdminOwner"); + address protocolVersionsOwner = makeAddr("defaultProtocolVersionsOwner"); + address guardian = makeAddr("defaultGuardian"); + bool paused = false; + ProtocolVersion requiredProtocolVersion = ProtocolVersion.wrap(1); + ProtocolVersion recommendedProtocolVersion = ProtocolVersion.wrap(2); + + // Define default inputs for DeployImplementations. + // `superchainConfigProxy` and `protocolVersionsProxy` are set during `setUp` since they are + // outputs of the previous step. + uint256 withdrawalDelaySeconds = 100; + uint256 minProposalSizeBytes = 200; + uint256 challengePeriodSeconds = 300; + uint256 proofMaturityDelaySeconds = 400; + uint256 disputeGameFinalityDelaySeconds = 500; + string release = "op-contracts/latest"; + SuperchainConfig superchainConfigProxy; + ProtocolVersions protocolVersionsProxy; + + // Define default inputs for DeployOPChain. + // `opsm` is set during `setUp` since it is an output of the previous step. + address opChainProxyAdminOwner = makeAddr("defaultOPChainProxyAdminOwner"); + address systemConfigOwner = makeAddr("defaultSystemConfigOwner"); + address batcher = makeAddr("defaultBatcher"); + address unsafeBlockSigner = makeAddr("defaultUnsafeBlockSigner"); + address proposer = makeAddr("defaultProposer"); + address challenger = makeAddr("defaultChallenger"); + uint32 basefeeScalar = 100; + uint32 blobBaseFeeScalar = 200; + uint256 l2ChainId = 300; + AnchorStateRegistry.StartingAnchorRoot[] startingAnchorRoots; + OPStackManager opsm = OPStackManager(address(0)); + + function setUp() public virtual { + // Set defaults for reference types + uint256 cannonBlock = 400; + uint256 permissionedBlock = 500; + startingAnchorRoots.push( + AnchorStateRegistry.StartingAnchorRoot({ + gameType: GameTypes.CANNON, + outputRoot: OutputRoot({ root: Hash.wrap(keccak256("defaultOutputRootCannon")), l2BlockNumber: cannonBlock }) + }) + ); + startingAnchorRoots.push( + AnchorStateRegistry.StartingAnchorRoot({ + gameType: GameTypes.PERMISSIONED_CANNON, + outputRoot: OutputRoot({ + root: Hash.wrap(keccak256("defaultOutputRootPermissioned")), + l2BlockNumber: permissionedBlock + }) + }) + ); + + // Initialize deploy scripts. + DeploySuperchain deploySuperchain = new DeploySuperchain(); + (DeploySuperchainInput dsi, DeploySuperchainOutput dso) = deploySuperchain.etchIOContracts(); + dsi.set(dsi.proxyAdminOwner.selector, proxyAdminOwner); + dsi.set(dsi.protocolVersionsOwner.selector, protocolVersionsOwner); + dsi.set(dsi.guardian.selector, guardian); + dsi.set(dsi.paused.selector, paused); + dsi.set(dsi.requiredProtocolVersion.selector, requiredProtocolVersion); + dsi.set(dsi.recommendedProtocolVersion.selector, recommendedProtocolVersion); + + DeployImplementations deployImplementations = createDeployImplementationsContract(); + (DeployImplementationsInput dii, DeployImplementationsOutput dio) = deployImplementations.etchIOContracts(); + + deployOPChain = new DeployOPChain(); + (doi, doo) = deployOPChain.etchIOContracts(); + + // Deploy the superchain contracts. + deploySuperchain.run(dsi, dso); + + // Populate the inputs for DeployImplementations based on the output of DeploySuperchain. + superchainConfigProxy = dso.superchainConfigProxy(); + protocolVersionsProxy = dso.protocolVersionsProxy(); + + // Deploy the implementations. + dii.set(dii.withdrawalDelaySeconds.selector, withdrawalDelaySeconds); + dii.set(dii.minProposalSizeBytes.selector, minProposalSizeBytes); + dii.set(dii.challengePeriodSeconds.selector, challengePeriodSeconds); + dii.set(dii.proofMaturityDelaySeconds.selector, proofMaturityDelaySeconds); + dii.set(dii.disputeGameFinalityDelaySeconds.selector, disputeGameFinalityDelaySeconds); + dii.set(dii.release.selector, release); + dii.set(dii.superchainConfigProxy.selector, address(superchainConfigProxy)); + dii.set(dii.protocolVersionsProxy.selector, address(protocolVersionsProxy)); + deployImplementations.run(dii, dio); + + // Set the OPStackManager input for DeployOPChain. + opsm = dio.opsmProxy(); + } + + // See the function of the same name in the `DeployImplementations_Test` contract of + // `DeployImplementations.t.sol` for more details on why we use this method. + function createDeployImplementationsContract() internal virtual returns (DeployImplementations) { + return new DeployImplementations(); + } +} + +contract DeployOPChain_Test is DeployOPChain_TestBase { + function hash(bytes32 _seed, uint256 _i) internal pure returns (bytes32) { + return keccak256(abi.encode(_seed, _i)); + } + + function testFuzz_run_memory_succeed(bytes32 _seed) public { + opChainProxyAdminOwner = address(uint160(uint256(hash(_seed, 0)))); + systemConfigOwner = address(uint160(uint256(hash(_seed, 1)))); + batcher = address(uint160(uint256(hash(_seed, 2)))); + unsafeBlockSigner = address(uint160(uint256(hash(_seed, 3)))); + proposer = address(uint160(uint256(hash(_seed, 4)))); + challenger = address(uint160(uint256(hash(_seed, 5)))); + basefeeScalar = uint32(uint256(hash(_seed, 6))); + blobBaseFeeScalar = uint32(uint256(hash(_seed, 7))); + l2ChainId = uint256(hash(_seed, 8)); + + // Set the initial anchor states. The typical usage we expect is to pass in one root per game type. + uint256 cannonBlock = uint256(hash(_seed, 9)); + uint256 permissionedBlock = uint256(hash(_seed, 10)); + startingAnchorRoots.push( + AnchorStateRegistry.StartingAnchorRoot({ + gameType: GameTypes.CANNON, + outputRoot: OutputRoot({ root: Hash.wrap(keccak256(abi.encode(_seed, 11))), l2BlockNumber: cannonBlock }) + }) + ); + startingAnchorRoots.push( + AnchorStateRegistry.StartingAnchorRoot({ + gameType: GameTypes.PERMISSIONED_CANNON, + outputRoot: OutputRoot({ + root: Hash.wrap(keccak256(abi.encode(_seed, 12))), + l2BlockNumber: permissionedBlock + }) + }) + ); + + doi.set(doi.opChainProxyAdminOwner.selector, opChainProxyAdminOwner); + doi.set(doi.systemConfigOwner.selector, systemConfigOwner); + doi.set(doi.batcher.selector, batcher); + doi.set(doi.unsafeBlockSigner.selector, unsafeBlockSigner); + doi.set(doi.proposer.selector, proposer); + doi.set(doi.challenger.selector, challenger); + doi.set(doi.basefeeScalar.selector, basefeeScalar); + doi.set(doi.blobBaseFeeScalar.selector, blobBaseFeeScalar); + doi.set(doi.l2ChainId.selector, l2ChainId); + doi.set(doi.opsmProxy.selector, address(opsm)); // Not fuzzed since it must be an actual instance. + + deployOPChain.run(doi, doo); + + // TODO Add fault proof contract assertions below once OPSM fully supports them. + + // Assert that individual input fields were properly set based on the inputs. + assertEq(opChainProxyAdminOwner, doi.opChainProxyAdminOwner(), "100"); + assertEq(systemConfigOwner, doi.systemConfigOwner(), "200"); + assertEq(batcher, doi.batcher(), "300"); + assertEq(unsafeBlockSigner, doi.unsafeBlockSigner(), "400"); + assertEq(proposer, doi.proposer(), "500"); + assertEq(challenger, doi.challenger(), "600"); + assertEq(basefeeScalar, doi.basefeeScalar(), "700"); + assertEq(blobBaseFeeScalar, doi.blobBaseFeeScalar(), "800"); + assertEq(l2ChainId, doi.l2ChainId(), "900"); + + // Assert inputs were properly passed through to the contract initializers. + assertEq(address(doo.opChainProxyAdmin().owner()), opChainProxyAdminOwner, "2100"); + assertEq(address(doo.systemConfigProxy().owner()), systemConfigOwner, "2200"); + address batcherActual = address(uint160(uint256(doo.systemConfigProxy().batcherHash()))); + assertEq(batcherActual, batcher, "2300"); + assertEq(address(doo.systemConfigProxy().unsafeBlockSigner()), unsafeBlockSigner, "2400"); + // assertEq(address(...proposer()), proposer, "2500"); // TODO once we deploy dispute games. + // assertEq(address(...challenger()), challenger, "2600"); // TODO once we deploy dispute games. + + // Most architecture assertions are handled within the OP Stack Manager itself and therefore + // we only assert on the things that are not visible onchain. + // TODO add these assertions: AddressManager, Proxy, ProxyAdmin, etc. + } +} + +contract DeployOPChain_Test_Interop is DeployOPChain_Test { + function createDeployImplementationsContract() internal override returns (DeployImplementations) { + return new DeployImplementationsInterop(); + } +} diff --git a/packages/contracts-bedrock/test/DeploySuperchain.t.sol b/packages/contracts-bedrock/test/DeploySuperchain.t.sol new file mode 100644 index 000000000000..4b51aae0f3d6 --- /dev/null +++ b/packages/contracts-bedrock/test/DeploySuperchain.t.sol @@ -0,0 +1,241 @@ +// SPDX-License-Identifier: MIT +pragma solidity 0.8.15; + +import { Test, stdStorage, StdStorage } from "forge-std/Test.sol"; +import { stdToml } from "forge-std/StdToml.sol"; + +import { ProxyAdmin } from "src/universal/ProxyAdmin.sol"; +import { Proxy } from "src/universal/Proxy.sol"; +import { SuperchainConfig } from "src/L1/SuperchainConfig.sol"; +import { ProtocolVersions, ProtocolVersion } from "src/L1/ProtocolVersions.sol"; +import { DeploySuperchainInput, DeploySuperchain, DeploySuperchainOutput } from "scripts/DeploySuperchain.s.sol"; + +contract DeploySuperchainInput_Test is Test { + DeploySuperchainInput dsi; + + address proxyAdminOwner = makeAddr("defaultProxyAdminOwner"); + address protocolVersionsOwner = makeAddr("defaultProtocolVersionsOwner"); + address guardian = makeAddr("defaultGuardian"); + bool paused = false; + ProtocolVersion requiredProtocolVersion = ProtocolVersion.wrap(1); + ProtocolVersion recommendedProtocolVersion = ProtocolVersion.wrap(2); + + function setUp() public { + dsi = new DeploySuperchainInput(); + } + + function test_getters_whenNotSet_revert() public { + vm.expectRevert("DeploySuperchainInput: proxyAdminOwner not set"); + dsi.proxyAdminOwner(); + + vm.expectRevert("DeploySuperchainInput: protocolVersionsOwner not set"); + dsi.protocolVersionsOwner(); + + vm.expectRevert("DeploySuperchainInput: guardian not set"); + dsi.guardian(); + + vm.expectRevert("DeploySuperchainInput: requiredProtocolVersion not set"); + dsi.requiredProtocolVersion(); + + vm.expectRevert("DeploySuperchainInput: recommendedProtocolVersion not set"); + dsi.recommendedProtocolVersion(); + } +} + +contract DeploySuperchainOutput_Test is Test { + using stdToml for string; + + DeploySuperchainOutput dso; + + function setUp() public { + dso = new DeploySuperchainOutput(); + } + + function test_set_succeeds() public { + // We don't fuzz, because we need code at the address, and we can't etch code if the fuzzer + // provides precompiles, so we end up with a lot of boilerplate logic to get valid inputs. + // Hardcoding a concrete set of valid addresses is simpler and still sufficient. + ProxyAdmin superchainProxyAdmin = ProxyAdmin(makeAddr("superchainProxyAdmin")); + SuperchainConfig superchainConfigImpl = SuperchainConfig(makeAddr("superchainConfigImpl")); + SuperchainConfig superchainConfigProxy = SuperchainConfig(makeAddr("superchainConfigProxy")); + ProtocolVersions protocolVersionsImpl = ProtocolVersions(makeAddr("protocolVersionsImpl")); + ProtocolVersions protocolVersionsProxy = ProtocolVersions(makeAddr("protocolVersionsProxy")); + + // Ensure each address has code, since these are expected to be contracts. + vm.etch(address(superchainProxyAdmin), hex"01"); + vm.etch(address(superchainConfigImpl), hex"01"); + vm.etch(address(superchainConfigProxy), hex"01"); + vm.etch(address(protocolVersionsImpl), hex"01"); + vm.etch(address(protocolVersionsProxy), hex"01"); + + // Set the output data. + dso.set(dso.superchainProxyAdmin.selector, address(superchainProxyAdmin)); + dso.set(dso.superchainConfigImpl.selector, address(superchainConfigImpl)); + dso.set(dso.superchainConfigProxy.selector, address(superchainConfigProxy)); + dso.set(dso.protocolVersionsImpl.selector, address(protocolVersionsImpl)); + dso.set(dso.protocolVersionsProxy.selector, address(protocolVersionsProxy)); + + // Compare the test data to the getter methods. + assertEq(address(superchainProxyAdmin), address(dso.superchainProxyAdmin()), "100"); + assertEq(address(superchainConfigImpl), address(dso.superchainConfigImpl()), "200"); + assertEq(address(superchainConfigProxy), address(dso.superchainConfigProxy()), "300"); + assertEq(address(protocolVersionsImpl), address(dso.protocolVersionsImpl()), "400"); + assertEq(address(protocolVersionsProxy), address(dso.protocolVersionsProxy()), "500"); + } + + function test_getters_whenNotSet_revert() public { + vm.expectRevert("DeployUtils: zero address"); + dso.superchainConfigImpl(); + + vm.expectRevert("DeployUtils: zero address"); + dso.superchainConfigProxy(); + + vm.expectRevert("DeployUtils: zero address"); + dso.protocolVersionsImpl(); + + vm.expectRevert("DeployUtils: zero address"); + dso.protocolVersionsProxy(); + } + + function test_getters_whenAddrHasNoCode_reverts() public { + address emptyAddr = makeAddr("emptyAddr"); + bytes memory expectedErr = bytes(string.concat("DeployUtils: no code at ", vm.toString(emptyAddr))); + + dso.set(dso.superchainConfigImpl.selector, emptyAddr); + vm.expectRevert(expectedErr); + dso.superchainConfigImpl(); + + dso.set(dso.superchainConfigProxy.selector, emptyAddr); + vm.expectRevert(expectedErr); + dso.superchainConfigProxy(); + + dso.set(dso.protocolVersionsImpl.selector, emptyAddr); + vm.expectRevert(expectedErr); + dso.protocolVersionsImpl(); + + dso.set(dso.protocolVersionsProxy.selector, emptyAddr); + vm.expectRevert(expectedErr); + dso.protocolVersionsProxy(); + } +} + +contract DeploySuperchain_Test is Test { + using stdStorage for StdStorage; + + DeploySuperchain deploySuperchain; + DeploySuperchainInput dsi; + DeploySuperchainOutput dso; + + // Define default input variables for testing. + address defaultProxyAdminOwner = makeAddr("defaultProxyAdminOwner"); + address defaultProtocolVersionsOwner = makeAddr("defaultProtocolVersionsOwner"); + address defaultGuardian = makeAddr("defaultGuardian"); + bool defaultPaused = false; + ProtocolVersion defaultRequiredProtocolVersion = ProtocolVersion.wrap(1); + ProtocolVersion defaultRecommendedProtocolVersion = ProtocolVersion.wrap(2); + + function setUp() public { + deploySuperchain = new DeploySuperchain(); + (dsi, dso) = deploySuperchain.etchIOContracts(); + } + + function unwrap(ProtocolVersion _pv) internal pure returns (uint256) { + return ProtocolVersion.unwrap(_pv); + } + + function hash(bytes32 _seed, uint256 _i) internal pure returns (bytes32) { + return keccak256(abi.encode(_seed, _i)); + } + + function testFuzz_run_memory_succeeds(bytes32 _seed) public { + // Generate random input values from the seed. This doesn't give us the benefit of the forge + // fuzzer's dictionary, but that's ok because we are just testing that values are set and + // passed correctly. + address proxyAdminOwner = address(uint160(uint256(hash(_seed, 0)))); + address protocolVersionsOwner = address(uint160(uint256(hash(_seed, 1)))); + address guardian = address(uint160(uint256(hash(_seed, 2)))); + bool paused = bool(uint8(uint256(hash(_seed, 3))) % 2 == 0); + ProtocolVersion requiredProtocolVersion = ProtocolVersion.wrap(uint256(hash(_seed, 4))); + ProtocolVersion recommendedProtocolVersion = ProtocolVersion.wrap(uint256(hash(_seed, 5))); + + // Set the input values on the input contract. + dsi.set(dsi.proxyAdminOwner.selector, proxyAdminOwner); + dsi.set(dsi.protocolVersionsOwner.selector, protocolVersionsOwner); + dsi.set(dsi.guardian.selector, guardian); + dsi.set(dsi.paused.selector, paused); + dsi.set(dsi.requiredProtocolVersion.selector, requiredProtocolVersion); + dsi.set(dsi.recommendedProtocolVersion.selector, recommendedProtocolVersion); + + // Run the deployment script. + deploySuperchain.run(dsi, dso); + + // Assert inputs were properly passed through to the contract initializers. + assertEq(address(dso.superchainProxyAdmin().owner()), proxyAdminOwner, "100"); + assertEq(address(dso.protocolVersionsProxy().owner()), protocolVersionsOwner, "200"); + assertEq(address(dso.superchainConfigProxy().guardian()), guardian, "300"); + assertEq(dso.superchainConfigProxy().paused(), paused, "400"); + assertEq(unwrap(dso.protocolVersionsProxy().required()), unwrap(requiredProtocolVersion), "500"); + assertEq(unwrap(dso.protocolVersionsProxy().recommended()), unwrap(recommendedProtocolVersion), "600"); + + // Architecture assertions. + // We prank as the zero address due to the Proxy's `proxyCallIfNotAdmin` modifier. + Proxy superchainConfigProxy = Proxy(payable(address(dso.superchainConfigProxy()))); + Proxy protocolVersionsProxy = Proxy(payable(address(dso.protocolVersionsProxy()))); + + vm.startPrank(address(0)); + assertEq(superchainConfigProxy.implementation(), address(dso.superchainConfigImpl()), "700"); + assertEq(protocolVersionsProxy.implementation(), address(dso.protocolVersionsImpl()), "800"); + assertEq(superchainConfigProxy.admin(), protocolVersionsProxy.admin(), "900"); + assertEq(superchainConfigProxy.admin(), address(dso.superchainProxyAdmin()), "1000"); + vm.stopPrank(); + + // Ensure that `checkOutput` passes. This is called by the `run` function during execution, + // so this just acts as a sanity check. It reverts on failure. + dso.checkOutput(dsi); + } + + function test_run_NullInput_reverts() public { + // Set default values for all inputs. + dsi.set(dsi.proxyAdminOwner.selector, defaultProxyAdminOwner); + dsi.set(dsi.protocolVersionsOwner.selector, defaultProtocolVersionsOwner); + dsi.set(dsi.guardian.selector, defaultGuardian); + dsi.set(dsi.paused.selector, defaultPaused); + dsi.set(dsi.requiredProtocolVersion.selector, defaultRequiredProtocolVersion); + dsi.set(dsi.recommendedProtocolVersion.selector, defaultRecommendedProtocolVersion); + + // Assert over each role being set to the zero address. We aren't allowed to use the setter + // methods to set the zero address, so we use StdStorage. We can't use the `checked_write` + // method, because it does a final call to test that the value was set correctly, but for us + // that would revert. Therefore we use StdStorage to find the slot, then we write to it. + uint256 slot = zeroOutSlotForSelector(dsi.proxyAdminOwner.selector); + vm.expectRevert("DeploySuperchainInput: proxyAdminOwner not set"); + deploySuperchain.run(dsi, dso); + // Restore the value we just tested. + vm.store(address(dsi), bytes32(slot), bytes32(uint256(uint160(defaultProxyAdminOwner)))); + + slot = zeroOutSlotForSelector(dsi.protocolVersionsOwner.selector); + vm.expectRevert("DeploySuperchainInput: protocolVersionsOwner not set"); + deploySuperchain.run(dsi, dso); + vm.store(address(dsi), bytes32(slot), bytes32(uint256(uint160(defaultProtocolVersionsOwner)))); + + slot = zeroOutSlotForSelector(dsi.guardian.selector); + vm.expectRevert("DeploySuperchainInput: guardian not set"); + deploySuperchain.run(dsi, dso); + vm.store(address(dsi), bytes32(slot), bytes32(uint256(uint160(defaultGuardian)))); + + slot = zeroOutSlotForSelector(dsi.requiredProtocolVersion.selector); + vm.expectRevert("DeploySuperchainInput: requiredProtocolVersion not set"); + deploySuperchain.run(dsi, dso); + vm.store(address(dsi), bytes32(slot), bytes32(unwrap(defaultRequiredProtocolVersion))); + + slot = zeroOutSlotForSelector(dsi.recommendedProtocolVersion.selector); + vm.expectRevert("DeploySuperchainInput: recommendedProtocolVersion not set"); + deploySuperchain.run(dsi, dso); + vm.store(address(dsi), bytes32(slot), bytes32(unwrap(defaultRecommendedProtocolVersion))); + } + + function zeroOutSlotForSelector(bytes4 _selector) internal returns (uint256 slot_) { + slot_ = stdstore.enable_packed_slots().target(address(dsi)).sig(_selector).find(); + vm.store(address(dsi), bytes32(slot_), bytes32(0)); + } +} diff --git a/packages/contracts-bedrock/test/ExtendedPause.t.sol b/packages/contracts-bedrock/test/ExtendedPause.t.sol index 93e207ac6e9d..df6e9d39132b 100644 --- a/packages/contracts-bedrock/test/ExtendedPause.t.sol +++ b/packages/contracts-bedrock/test/ExtendedPause.t.sol @@ -2,7 +2,6 @@ pragma solidity 0.8.15; import { CommonTest } from "test/setup/CommonTest.sol"; -import { SuperchainConfig } from "src/L1/SuperchainConfig.sol"; /// @dev These tests are somewhat redundant with tests in the SuperchainConfig and other pausable contracts, however /// it is worthwhile to pull them into one location to ensure that the behavior is consistent. diff --git a/packages/contracts-bedrock/test/L1/DataAvailabilityChallenge.t.sol b/packages/contracts-bedrock/test/L1/DataAvailabilityChallenge.t.sol index 34e98be77bae..5304cf797449 100644 --- a/packages/contracts-bedrock/test/L1/DataAvailabilityChallenge.t.sol +++ b/packages/contracts-bedrock/test/L1/DataAvailabilityChallenge.t.sol @@ -2,18 +2,19 @@ pragma solidity 0.8.15; import { - DataAvailabilityChallenge, + IDataAvailabilityChallenge, ChallengeStatus, Challenge, - CommitmentType, - computeCommitmentKeccak256 -} from "src/L1/DataAvailabilityChallenge.sol"; + CommitmentType +} from "src/L1/interfaces/IDataAvailabilityChallenge.sol"; +import { computeCommitmentKeccak256 } from "src/L1/DataAvailabilityChallenge.sol"; import { Proxy } from "src/universal/Proxy.sol"; import { CommonTest } from "test/setup/CommonTest.sol"; +import { Preinstalls } from "src/libraries/Preinstalls.sol"; contract DataAvailabilityChallengeTest is CommonTest { function setUp() public virtual override { - super.enablePlasma(); + super.enableAltDA(); super.setUp(); } @@ -33,6 +34,8 @@ contract DataAvailabilityChallengeTest is CommonTest { function testWithdraw(address sender, uint256 amount) public { assumePayable(sender); assumeNotPrecompile(sender); + // EntryPoint will revert if using amount > type(uint112).max. + vm.assume(sender != Preinstalls.EntryPoint_v060); vm.assume(sender != address(dataAvailabilityChallenge)); vm.assume(sender.balance == 0); vm.deal(sender, amount); @@ -145,7 +148,9 @@ contract DataAvailabilityChallengeTest is CommonTest { uint256 actualBond = requiredBond - 1; dataAvailabilityChallenge.deposit{ value: actualBond }(); - vm.expectRevert(abi.encodeWithSelector(DataAvailabilityChallenge.BondTooLow.selector, actualBond, requiredBond)); + vm.expectRevert( + abi.encodeWithSelector(IDataAvailabilityChallenge.BondTooLow.selector, actualBond, requiredBond) + ); dataAvailabilityChallenge.challenge(0, computeCommitmentKeccak256("some hash")); } @@ -160,7 +165,7 @@ contract DataAvailabilityChallengeTest is CommonTest { // Second challenge of the same hash/blockNumber fails dataAvailabilityChallenge.deposit{ value: dataAvailabilityChallenge.bondSize() }(); - vm.expectRevert(abi.encodeWithSelector(DataAvailabilityChallenge.ChallengeExists.selector)); + vm.expectRevert(abi.encodeWithSelector(IDataAvailabilityChallenge.ChallengeExists.selector)); dataAvailabilityChallenge.challenge(0, challengedCommitment); // Challenge succeed if the challenged block number is different @@ -181,7 +186,7 @@ contract DataAvailabilityChallengeTest is CommonTest { // Challenge fails because the current block number must be after the challenged block dataAvailabilityChallenge.deposit{ value: dataAvailabilityChallenge.bondSize() }(); - vm.expectRevert(abi.encodeWithSelector(DataAvailabilityChallenge.ChallengeWindowNotOpen.selector)); + vm.expectRevert(abi.encodeWithSelector(IDataAvailabilityChallenge.ChallengeWindowNotOpen.selector)); dataAvailabilityChallenge.challenge(challengedBlockNumber, challengedCommitment); } @@ -194,7 +199,7 @@ contract DataAvailabilityChallengeTest is CommonTest { // Challenge fails because the block number is after the challenge window dataAvailabilityChallenge.deposit{ value: dataAvailabilityChallenge.bondSize() }(); - vm.expectRevert(abi.encodeWithSelector(DataAvailabilityChallenge.ChallengeWindowNotOpen.selector)); + vm.expectRevert(abi.encodeWithSelector(IDataAvailabilityChallenge.ChallengeWindowNotOpen.selector)); dataAvailabilityChallenge.challenge(challengedBlockNumber, challengedCommitment); } @@ -287,7 +292,7 @@ contract DataAvailabilityChallengeTest is CommonTest { vm.roll(challengedBlockNumber + 1); // Resolving a non-existent challenge fails - vm.expectRevert(abi.encodeWithSelector(DataAvailabilityChallenge.ChallengeNotActive.selector)); + vm.expectRevert(abi.encodeWithSelector(IDataAvailabilityChallenge.ChallengeNotActive.selector)); dataAvailabilityChallenge.resolve(challengedBlockNumber, computeCommitmentKeccak256(preImage), preImage); } @@ -307,7 +312,7 @@ contract DataAvailabilityChallengeTest is CommonTest { dataAvailabilityChallenge.resolve(challengedBlockNumber, challengedCommitment, preImage); // Resolving an already resolved challenge fails - vm.expectRevert(abi.encodeWithSelector(DataAvailabilityChallenge.ChallengeNotActive.selector)); + vm.expectRevert(abi.encodeWithSelector(IDataAvailabilityChallenge.ChallengeNotActive.selector)); dataAvailabilityChallenge.resolve(challengedBlockNumber, challengedCommitment, preImage); } @@ -327,7 +332,7 @@ contract DataAvailabilityChallengeTest is CommonTest { vm.roll(block.number + dataAvailabilityChallenge.resolveWindow() + 1); // Resolving an expired challenge fails - vm.expectRevert(abi.encodeWithSelector(DataAvailabilityChallenge.ChallengeNotActive.selector)); + vm.expectRevert(abi.encodeWithSelector(IDataAvailabilityChallenge.ChallengeNotActive.selector)); dataAvailabilityChallenge.resolve(challengedBlockNumber, challengedCommitment, preImage); } @@ -347,7 +352,7 @@ contract DataAvailabilityChallengeTest is CommonTest { vm.roll(block.number + dataAvailabilityChallenge.resolveWindow() + 1); // Resolve the challenge - vm.expectRevert(abi.encodeWithSelector(DataAvailabilityChallenge.ChallengeNotActive.selector)); + vm.expectRevert(abi.encodeWithSelector(IDataAvailabilityChallenge.ChallengeNotActive.selector)); dataAvailabilityChallenge.resolve(challengedBlockNumber, challengedCommitment, preImage); } @@ -405,7 +410,7 @@ contract DataAvailabilityChallengeTest is CommonTest { vm.roll(challengedBlockNumber + 1); // Unlock a bond of a non-existent challenge fails - vm.expectRevert(abi.encodeWithSelector(DataAvailabilityChallenge.ChallengeNotExpired.selector)); + vm.expectRevert(abi.encodeWithSelector(IDataAvailabilityChallenge.ChallengeNotExpired.selector)); dataAvailabilityChallenge.unlockBond(challengedBlockNumber, challengedCommitment); } @@ -425,7 +430,7 @@ contract DataAvailabilityChallengeTest is CommonTest { dataAvailabilityChallenge.resolve(challengedBlockNumber, challengedCommitment, preImage); // Attempting to unlock a bond of a resolved challenge fails - vm.expectRevert(abi.encodeWithSelector(DataAvailabilityChallenge.ChallengeNotExpired.selector)); + vm.expectRevert(abi.encodeWithSelector(IDataAvailabilityChallenge.ChallengeNotExpired.selector)); dataAvailabilityChallenge.unlockBond(challengedBlockNumber, challengedCommitment); } @@ -469,7 +474,7 @@ contract DataAvailabilityChallengeTest is CommonTest { vm.roll(block.number + dataAvailabilityChallenge.resolveWindow() - 1); // Expiring the challenge before the resolve window closes fails - vm.expectRevert(abi.encodeWithSelector(DataAvailabilityChallenge.ChallengeNotExpired.selector)); + vm.expectRevert(abi.encodeWithSelector(IDataAvailabilityChallenge.ChallengeNotExpired.selector)); dataAvailabilityChallenge.unlockBond(challengedBlockNumber, challengedCommitment); } @@ -480,7 +485,9 @@ contract DataAvailabilityChallengeTest is CommonTest { // Expect the challenge to fail because the bond is too low bytes memory challengedCommitment = computeCommitmentKeccak256("some hash"); - vm.expectRevert(abi.encodeWithSelector(DataAvailabilityChallenge.BondTooLow.selector, actualBond, requiredBond)); + vm.expectRevert( + abi.encodeWithSelector(IDataAvailabilityChallenge.BondTooLow.selector, actualBond, requiredBond) + ); dataAvailabilityChallenge.challenge(0, challengedCommitment); // Reduce the required bond @@ -500,7 +507,9 @@ contract DataAvailabilityChallengeTest is CommonTest { function testSetResolverRefundPercentageFail() public { address owner = dataAvailabilityChallenge.owner(); - vm.expectRevert(abi.encodeWithSelector(DataAvailabilityChallenge.InvalidResolverRefundPercentage.selector, 101)); + vm.expectRevert( + abi.encodeWithSelector(IDataAvailabilityChallenge.InvalidResolverRefundPercentage.selector, 101) + ); vm.prank(owner); dataAvailabilityChallenge.setResolverRefundPercentage(101); } @@ -520,13 +529,13 @@ contract DataAvailabilityChallengeTest is CommonTest { dataAvailabilityChallenge.validateCommitment(validCommitment); // Should revert if the commitment type is unknown - vm.expectRevert(abi.encodeWithSelector(DataAvailabilityChallenge.UnknownCommitmentType.selector, uint8(1))); + vm.expectRevert(abi.encodeWithSelector(IDataAvailabilityChallenge.UnknownCommitmentType.selector, uint8(1))); bytes memory unknownType = abi.encodePacked(uint8(1), keccak256("test")); dataAvailabilityChallenge.validateCommitment(unknownType); // Should revert if the commitment length does not match vm.expectRevert( - abi.encodeWithSelector(DataAvailabilityChallenge.InvalidCommitmentLength.selector, uint8(0), 33, 34) + abi.encodeWithSelector(IDataAvailabilityChallenge.InvalidCommitmentLength.selector, uint8(0), 33, 34) ); bytes memory invalidLength = abi.encodePacked(CommitmentType.Keccak256, keccak256("test"), "x"); dataAvailabilityChallenge.validateCommitment(invalidLength); diff --git a/packages/contracts-bedrock/test/L1/DelayedVetoable.t.sol b/packages/contracts-bedrock/test/L1/DelayedVetoable.t.sol index 5e67a7ba5cf9..8c35ced064d5 100644 --- a/packages/contracts-bedrock/test/L1/DelayedVetoable.t.sol +++ b/packages/contracts-bedrock/test/L1/DelayedVetoable.t.sol @@ -3,6 +3,7 @@ pragma solidity 0.8.15; import { Test } from "forge-std/Test.sol"; import { DelayedVetoable } from "src/L1/DelayedVetoable.sol"; +import { IDelayedVetoable } from "src/L1/interfaces/IDelayedVetoable.sol"; contract DelayedVetoable_Init is Test { error Unauthorized(address expected, address actual); @@ -16,7 +17,7 @@ contract DelayedVetoable_Init is Test { address initiator; address vetoer; uint256 operatingDelay = 14 days; - DelayedVetoable delayedVetoable; + IDelayedVetoable delayedVetoable; function setUp() public { initiator = makeAddr("initiator"); @@ -25,12 +26,16 @@ contract DelayedVetoable_Init is Test { vm.deal(initiator, 10000 ether); vm.deal(vetoer, 10000 ether); - delayedVetoable = new DelayedVetoable({ - initiator_: initiator, - vetoer_: vetoer, - target_: address(target), - operatingDelay_: operatingDelay - }); + delayedVetoable = IDelayedVetoable( + address( + new DelayedVetoable({ + initiator_: initiator, + vetoer_: vetoer, + target_: address(target), + operatingDelay_: operatingDelay + }) + ) + ); // Most tests will use the operating delay, so we call as the initiator with null data // to set the delay. For tests that need to use the initial zero delay, we'll modify the diff --git a/packages/contracts-bedrock/test/L1/L1CrossDomainMessenger.t.sol b/packages/contracts-bedrock/test/L1/L1CrossDomainMessenger.t.sol index 3f585f795762..8740c09d38ca 100644 --- a/packages/contracts-bedrock/test/L1/L1CrossDomainMessenger.t.sol +++ b/packages/contracts-bedrock/test/L1/L1CrossDomainMessenger.t.sol @@ -13,10 +13,10 @@ import { Encoding } from "src/libraries/Encoding.sol"; import { Constants } from "src/libraries/Constants.sol"; // Target contract dependencies -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"; +import { IL1CrossDomainMessenger } from "src/L1/interfaces/IL1CrossDomainMessenger.sol"; +import { IOptimismPortal } from "src/L1/interfaces/IOptimismPortal.sol"; +import { ISuperchainConfig } from "src/L1/interfaces/ISuperchainConfig.sol"; +import { ISystemConfig } from "src/L1/interfaces/ISystemConfig.sol"; contract L1CrossDomainMessenger_Test is Bridge_Initializer { /// @dev The receiver address @@ -29,7 +29,7 @@ contract L1CrossDomainMessenger_Test is Bridge_Initializer { /// @notice Marked virtual to be overridden in /// test/kontrol/deployment/DeploymentSummary.t.sol function test_constructor_succeeds() external virtual { - L1CrossDomainMessenger impl = L1CrossDomainMessenger(deploy.mustGetAddress("L1CrossDomainMessenger")); + IL1CrossDomainMessenger impl = IL1CrossDomainMessenger(deploy.mustGetAddress("L1CrossDomainMessenger")); assertEq(address(impl.superchainConfig()), address(0)); assertEq(address(impl.PORTAL()), address(0)); assertEq(address(impl.portal()), address(0)); @@ -60,7 +60,7 @@ contract L1CrossDomainMessenger_Test is Bridge_Initializer { vm.expectCall( address(optimismPortal), abi.encodeWithSelector( - OptimismPortal.depositTransaction.selector, + IOptimismPortal.depositTransaction.selector, Predeploys.L2_CROSS_DOMAIN_MESSENGER, 0, l1CrossDomainMessenger.baseGas(hex"ff", 100), @@ -605,7 +605,7 @@ contract L1CrossDomainMessenger_Test is Bridge_Initializer { /// @dev Tests that the superchain config is called by the messengers paused function function test_pause_callsSuperchainConfig_succeeds() external { - vm.expectCall(address(superchainConfig), abi.encodeWithSelector(SuperchainConfig.paused.selector)); + vm.expectCall(address(superchainConfig), abi.encodeWithSelector(ISuperchainConfig.paused.selector)); l1CrossDomainMessenger.paused(); } @@ -632,7 +632,7 @@ contract L1CrossDomainMessenger_Test is Bridge_Initializer { vm.expectCall( address(optimismPortal), abi.encodeWithSelector( - OptimismPortal.depositTransaction.selector, + IOptimismPortal.depositTransaction.selector, Predeploys.L2_CROSS_DOMAIN_MESSENGER, 0, l1CrossDomainMessenger.baseGas(hex"ff", 100), @@ -770,7 +770,7 @@ contract L1CrossDomainMessenger_ReinitReentryTest is Bridge_Initializer { // call the initializer function l1CrossDomainMessenger.initialize( - SuperchainConfig(superchainConfig), OptimismPortal(optimismPortal), SystemConfig(systemConfig) + ISuperchainConfig(superchainConfig), IOptimismPortal(optimismPortal), ISystemConfig(systemConfig) ); // attempt to re-replay the withdrawal diff --git a/packages/contracts-bedrock/test/L1/L1ERC721Bridge.t.sol b/packages/contracts-bedrock/test/L1/L1ERC721Bridge.t.sol index 3c8abcb4843d..44feddc5031d 100644 --- a/packages/contracts-bedrock/test/L1/L1ERC721Bridge.t.sol +++ b/packages/contracts-bedrock/test/L1/L1ERC721Bridge.t.sol @@ -1,18 +1,20 @@ // SPDX-License-Identifier: MIT pragma solidity 0.8.15; -// Testing utilities +// Testing import { Bridge_Initializer } from "test/setup/Bridge_Initializer.sol"; + +// Contracts import { ERC721 } from "@openzeppelin/contracts/token/ERC721/ERC721.sol"; -// Target contract dependencies -import { L2ERC721Bridge } from "src/L2/L2ERC721Bridge.sol"; +// Libraries import { Predeploys } from "src/libraries/Predeploys.sol"; -import { SuperchainConfig } from "src/L1/SuperchainConfig.sol"; -import { CrossDomainMessenger } from "src/universal/CrossDomainMessenger.sol"; -// Target contract -import { L1ERC721Bridge } from "src/L1/L1ERC721Bridge.sol"; +// Interfaces +import { ISuperchainConfig } from "src/L1/interfaces/ISuperchainConfig.sol"; +import { ICrossDomainMessenger } from "src/universal/interfaces/ICrossDomainMessenger.sol"; +import { IL1ERC721Bridge } from "src/L1/interfaces/IL1ERC721Bridge.sol"; +import { IL2ERC721Bridge } from "src/L2/interfaces/IL2ERC721Bridge.sol"; /// @dev Test ERC721 contract. contract TestERC721 is ERC721 { @@ -67,7 +69,7 @@ contract L1ERC721Bridge_Test is Bridge_Initializer { /// @notice Marked virtual to be overridden in /// test/kontrol/deployment/DeploymentSummary.t.sol function test_constructor_succeeds() public virtual { - L1ERC721Bridge impl = L1ERC721Bridge(deploy.mustGetAddress("L1ERC721Bridge")); + IL1ERC721Bridge impl = IL1ERC721Bridge(deploy.mustGetAddress("L1ERC721Bridge")); assertEq(address(impl.MESSENGER()), address(0)); assertEq(address(impl.messenger()), address(0)); assertEq(address(impl.OTHER_BRIDGE()), Predeploys.L2_ERC721_BRIDGE); @@ -94,7 +96,7 @@ contract L1ERC721Bridge_Test is Bridge_Initializer { ( address(l2ERC721Bridge), abi.encodeCall( - L2ERC721Bridge.finalizeBridgeERC721, + IL2ERC721Bridge.finalizeBridgeERC721, (address(remoteToken), address(localToken), alice, alice, tokenId, hex"5678") ), 1234 @@ -175,7 +177,7 @@ contract L1ERC721Bridge_Test is Bridge_Initializer { ( address(Predeploys.L2_ERC721_BRIDGE), abi.encodeCall( - L2ERC721Bridge.finalizeBridgeERC721, + IL2ERC721Bridge.finalizeBridgeERC721, (address(remoteToken), address(localToken), alice, bob, tokenId, hex"5678") ), 1234 @@ -323,7 +325,7 @@ contract L1ERC721Bridge_Pause_Test is Bridge_Initializer { /// @dev Ensures that the `paused` function of the bridge contract actually calls the `paused` function of the /// `superchainConfig`. function test_pause_callsSuperchainConfig_succeeds() external { - vm.expectCall(address(superchainConfig), abi.encodeWithSelector(SuperchainConfig.paused.selector)); + vm.expectCall(address(superchainConfig), abi.encodeWithSelector(ISuperchainConfig.paused.selector)); l1ERC721Bridge.paused(); } @@ -352,7 +354,7 @@ contract L1ERC721Bridge_Pause_TestFail is Bridge_Initializer { vm.mockCall( address(l1ERC721Bridge.messenger()), - abi.encodeWithSelector(CrossDomainMessenger.xDomainMessageSender.selector), + abi.encodeWithSelector(ICrossDomainMessenger.xDomainMessageSender.selector), abi.encode(address(l1ERC721Bridge.otherBridge())) ); } diff --git a/packages/contracts-bedrock/test/L1/L1StandardBridge.t.sol b/packages/contracts-bedrock/test/L1/L1StandardBridge.t.sol index d01fb1c26048..abe7196070e8 100644 --- a/packages/contracts-bedrock/test/L1/L1StandardBridge.t.sol +++ b/packages/contracts-bedrock/test/L1/L1StandardBridge.t.sol @@ -1,33 +1,32 @@ // SPDX-License-Identifier: MIT pragma solidity 0.8.15; -// Testing utilities +// Testing import { stdStorage, StdStorage } from "forge-std/Test.sol"; -import { ERC20 } from "@openzeppelin/contracts/token/ERC20/ERC20.sol"; import { Bridge_Initializer } from "test/setup/Bridge_Initializer.sol"; +// Contracts +import { ERC20 } from "@openzeppelin/contracts/token/ERC20/ERC20.sol"; +import { StandardBridge } from "src/universal/StandardBridge.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"; -import { L1StandardBridge } from "src/L1/L1StandardBridge.sol"; -import { L2StandardBridge } from "src/L2/L2StandardBridge.sol"; -import { CrossDomainMessenger } from "src/universal/CrossDomainMessenger.sol"; -import { SuperchainConfig } from "src/L1/SuperchainConfig.sol"; import { AddressAliasHelper } from "src/vendor/AddressAliasHelper.sol"; -// Target contract -import { OptimismPortal } from "src/L1/OptimismPortal.sol"; +// Interfaces +import { ICrossDomainMessenger } from "src/universal/interfaces/ICrossDomainMessenger.sol"; +import { ISuperchainConfig } from "src/L1/interfaces/ISuperchainConfig.sol"; +import { IOptimismPortal } from "src/L1/interfaces/IOptimismPortal.sol"; +import { IL1StandardBridge } from "src/L1/interfaces/IL1StandardBridge.sol"; contract L1StandardBridge_Getter_Test is Bridge_Initializer { /// @dev Test that the accessors return the correct initialized values. function test_getters_succeeds() external view { assert(l1StandardBridge.l2TokenBridge() == address(l2StandardBridge)); - assert(l1StandardBridge.OTHER_BRIDGE() == l2StandardBridge); - assert(l1StandardBridge.messenger() == l1CrossDomainMessenger); - assert(l1StandardBridge.MESSENGER() == l1CrossDomainMessenger); + assert(address(l1StandardBridge.OTHER_BRIDGE()) == address(l2StandardBridge)); + assert(address(l1StandardBridge.messenger()) == address(l1CrossDomainMessenger)); + assert(address(l1StandardBridge.MESSENGER()) == address(l1CrossDomainMessenger)); assert(l1StandardBridge.superchainConfig() == superchainConfig); assert(l1StandardBridge.systemConfig() == systemConfig); } @@ -38,7 +37,7 @@ contract L1StandardBridge_Initialize_Test is Bridge_Initializer { /// @notice Marked virtual to be overridden in /// test/kontrol/deployment/DeploymentSummary.t.sol function test_constructor_succeeds() external virtual { - L1StandardBridge impl = L1StandardBridge(deploy.mustGetAddress("L1StandardBridge")); + IL1StandardBridge impl = IL1StandardBridge(deploy.mustGetAddress("L1StandardBridge")); assertEq(address(impl.superchainConfig()), address(0)); assertEq(address(impl.MESSENGER()), address(0)); assertEq(address(impl.messenger()), address(0)); @@ -70,7 +69,7 @@ contract L1StandardBridge_Pause_Test is Bridge_Initializer { /// @dev Ensures that the `paused` function of the bridge contract actually calls the `paused` function of the /// `superchainConfig`. function test_pause_callsSuperchainConfig_succeeds() external { - vm.expectCall(address(superchainConfig), abi.encodeWithSelector(SuperchainConfig.paused.selector)); + vm.expectCall(address(superchainConfig), abi.encodeWithSelector(ISuperchainConfig.paused.selector)); l1StandardBridge.paused(); } @@ -101,7 +100,7 @@ contract L1StandardBridge_Pause_TestFail is Bridge_Initializer { vm.mockCall( address(l1StandardBridge.messenger()), - abi.encodeWithSelector(CrossDomainMessenger.xDomainMessageSender.selector), + abi.encodeWithSelector(ICrossDomainMessenger.xDomainMessageSender.selector), abi.encode(address(l1StandardBridge.otherBridge())) ); } @@ -176,7 +175,7 @@ contract L1StandardBridge_Receive_Test is Bridge_Initializer { vm.expectCall( address(l1CrossDomainMessenger), abi.encodeWithSelector( - CrossDomainMessenger.sendMessage.selector, + ICrossDomainMessenger.sendMessage.selector, address(l2StandardBridge), abi.encodeWithSelector(StandardBridge.finalizeBridgeETH.selector, alice, alice, 100, hex""), 200_000 @@ -235,11 +234,13 @@ contract PreBridgeETH is Bridge_Initializer { vm.expectCall( address(l1CrossDomainMessenger), value, - abi.encodeWithSelector(CrossDomainMessenger.sendMessage.selector, address(l2StandardBridge), message, 50000) + abi.encodeWithSelector( + ICrossDomainMessenger.sendMessage.selector, address(l2StandardBridge), message, 50000 + ) ); bytes memory innerMessage = abi.encodeWithSelector( - CrossDomainMessenger.relayMessage.selector, + ICrossDomainMessenger.relayMessage.selector, nonce, address(l1StandardBridge), address(l2StandardBridge), @@ -253,7 +254,7 @@ contract PreBridgeETH is Bridge_Initializer { address(optimismPortal), value, abi.encodeWithSelector( - OptimismPortal.depositTransaction.selector, + IOptimismPortal.depositTransaction.selector, address(l2CrossDomainMessenger), value, baseGas, @@ -375,11 +376,13 @@ contract PreBridgeETHTo is Bridge_Initializer { // L1CrossDomainMessenger.sendMessage vm.expectCall( address(l1CrossDomainMessenger), - abi.encodeWithSelector(CrossDomainMessenger.sendMessage.selector, address(l2StandardBridge), message, 60000) + abi.encodeWithSelector( + ICrossDomainMessenger.sendMessage.selector, address(l2StandardBridge), message, 60000 + ) ); bytes memory innerMessage = abi.encodeWithSelector( - CrossDomainMessenger.relayMessage.selector, + ICrossDomainMessenger.relayMessage.selector, nonce, address(l1StandardBridge), address(l2StandardBridge), @@ -392,7 +395,7 @@ contract PreBridgeETHTo is Bridge_Initializer { vm.expectCall( address(optimismPortal), abi.encodeWithSelector( - OptimismPortal.depositTransaction.selector, + IOptimismPortal.depositTransaction.selector, address(l2CrossDomainMessenger), value, baseGas, @@ -527,11 +530,13 @@ contract L1StandardBridge_DepositERC20_Test is Bridge_Initializer { // the L1 bridge should call L1CrossDomainMessenger.sendMessage vm.expectCall( address(l1CrossDomainMessenger), - abi.encodeWithSelector(CrossDomainMessenger.sendMessage.selector, address(l2StandardBridge), message, 10000) + abi.encodeWithSelector( + ICrossDomainMessenger.sendMessage.selector, address(l2StandardBridge), message, 10000 + ) ); bytes memory innerMessage = abi.encodeWithSelector( - CrossDomainMessenger.relayMessage.selector, + ICrossDomainMessenger.relayMessage.selector, nonce, address(l1StandardBridge), address(l2StandardBridge), @@ -544,7 +549,7 @@ contract L1StandardBridge_DepositERC20_Test is Bridge_Initializer { vm.expectCall( address(optimismPortal), abi.encodeWithSelector( - OptimismPortal.depositTransaction.selector, + IOptimismPortal.depositTransaction.selector, address(l2CrossDomainMessenger), 0, baseGas, @@ -610,7 +615,7 @@ contract L1StandardBridge_DepositERC20To_Test is Bridge_Initializer { ); bytes memory innerMessage = abi.encodeWithSelector( - CrossDomainMessenger.relayMessage.selector, + ICrossDomainMessenger.relayMessage.selector, nonce, address(l1StandardBridge), address(l2StandardBridge), @@ -649,13 +654,15 @@ contract L1StandardBridge_DepositERC20To_Test is Bridge_Initializer { // the L1 bridge should call L1CrossDomainMessenger.sendMessage vm.expectCall( address(l1CrossDomainMessenger), - abi.encodeWithSelector(CrossDomainMessenger.sendMessage.selector, address(l2StandardBridge), message, 10000) + abi.encodeWithSelector( + ICrossDomainMessenger.sendMessage.selector, address(l2StandardBridge), message, 10000 + ) ); // The L1 XDM should call OptimismPortal.depositTransaction vm.expectCall( address(optimismPortal), abi.encodeWithSelector( - OptimismPortal.depositTransaction.selector, + IOptimismPortal.depositTransaction.selector, address(l2CrossDomainMessenger), 0, baseGas, @@ -694,7 +701,7 @@ contract L1StandardBridge_FinalizeETHWithdrawal_Test is Bridge_Initializer { vm.mockCall( address(l1StandardBridge.messenger()), - abi.encodeWithSelector(CrossDomainMessenger.xDomainMessageSender.selector), + abi.encodeWithSelector(ICrossDomainMessenger.xDomainMessageSender.selector), abi.encode(address(l1StandardBridge.OTHER_BRIDGE())) ); // ensure that the messenger has ETH to call with @@ -720,7 +727,7 @@ contract L1StandardBridge_FinalizeETHWithdrawal_TestFail is Bridge_Initializer { ); vm.mockCall( address(l1StandardBridge.messenger()), - abi.encodeWithSelector(CrossDomainMessenger.xDomainMessageSender.selector), + abi.encodeWithSelector(ICrossDomainMessenger.xDomainMessageSender.selector), abi.encode(address(l1StandardBridge.OTHER_BRIDGE())) ); vm.deal(address(l1StandardBridge.messenger()), _value); @@ -759,7 +766,7 @@ contract L1StandardBridge_FinalizeERC20Withdrawal_Test is Bridge_Initializer { vm.mockCall( address(l1StandardBridge.messenger()), - abi.encodeWithSelector(CrossDomainMessenger.xDomainMessageSender.selector), + abi.encodeWithSelector(ICrossDomainMessenger.xDomainMessageSender.selector), abi.encode(address(l1StandardBridge.OTHER_BRIDGE())) ); vm.prank(address(l1StandardBridge.messenger())); @@ -775,7 +782,7 @@ contract L1StandardBridge_FinalizeERC20Withdrawal_TestFail is Bridge_Initializer function test_finalizeERC20Withdrawal_notMessenger_reverts() external { vm.mockCall( address(l1StandardBridge.messenger()), - abi.encodeWithSelector(CrossDomainMessenger.xDomainMessageSender.selector), + abi.encodeWithSelector(ICrossDomainMessenger.xDomainMessageSender.selector), abi.encode(address(l1StandardBridge.OTHER_BRIDGE())) ); vm.prank(address(28)); @@ -787,7 +794,7 @@ contract L1StandardBridge_FinalizeERC20Withdrawal_TestFail is Bridge_Initializer function test_finalizeERC20Withdrawal_notOtherBridge_reverts() external { vm.mockCall( address(l1StandardBridge.messenger()), - abi.encodeWithSelector(CrossDomainMessenger.xDomainMessageSender.selector), + abi.encodeWithSelector(ICrossDomainMessenger.xDomainMessageSender.selector), abi.encode(address(address(0))) ); vm.prank(address(l1StandardBridge.messenger())); @@ -802,7 +809,7 @@ contract L1StandardBridge_FinalizeBridgeETH_Test is Bridge_Initializer { address messenger = address(l1StandardBridge.messenger()); vm.mockCall( messenger, - abi.encodeWithSelector(CrossDomainMessenger.xDomainMessageSender.selector), + abi.encodeWithSelector(ICrossDomainMessenger.xDomainMessageSender.selector), abi.encode(address(l1StandardBridge.OTHER_BRIDGE())) ); vm.deal(messenger, 100); @@ -820,7 +827,7 @@ contract L1StandardBridge_FinalizeBridgeETH_TestFail is Bridge_Initializer { function testFuzz_finalizeBridgeETH_customGasToken_reverts(uint256 _value, bytes calldata _extraData) external { vm.mockCall( address(l1StandardBridge.messenger()), - abi.encodeWithSelector(CrossDomainMessenger.xDomainMessageSender.selector), + abi.encodeWithSelector(ICrossDomainMessenger.xDomainMessageSender.selector), abi.encode(address(l1StandardBridge.OTHER_BRIDGE())) ); vm.deal(address(l1CrossDomainMessenger), _value); @@ -838,7 +845,7 @@ contract L1StandardBridge_FinalizeBridgeETH_TestFail is Bridge_Initializer { address messenger = address(l1StandardBridge.messenger()); vm.mockCall( messenger, - abi.encodeWithSelector(CrossDomainMessenger.xDomainMessageSender.selector), + abi.encodeWithSelector(ICrossDomainMessenger.xDomainMessageSender.selector), abi.encode(address(l1StandardBridge.OTHER_BRIDGE())) ); vm.deal(messenger, 100); @@ -852,7 +859,7 @@ contract L1StandardBridge_FinalizeBridgeETH_TestFail is Bridge_Initializer { address messenger = address(l1StandardBridge.messenger()); vm.mockCall( messenger, - abi.encodeWithSelector(CrossDomainMessenger.xDomainMessageSender.selector), + abi.encodeWithSelector(ICrossDomainMessenger.xDomainMessageSender.selector), abi.encode(address(l1StandardBridge.OTHER_BRIDGE())) ); vm.deal(messenger, 100); @@ -866,7 +873,7 @@ contract L1StandardBridge_FinalizeBridgeETH_TestFail is Bridge_Initializer { address messenger = address(l1StandardBridge.messenger()); vm.mockCall( messenger, - abi.encodeWithSelector(CrossDomainMessenger.xDomainMessageSender.selector), + abi.encodeWithSelector(ICrossDomainMessenger.xDomainMessageSender.selector), abi.encode(address(l1StandardBridge.OTHER_BRIDGE())) ); vm.deal(messenger, 100); diff --git a/packages/contracts-bedrock/test/L1/L2OutputOracle.t.sol b/packages/contracts-bedrock/test/L1/L2OutputOracle.t.sol index 3d89809e9b30..7acca0fae187 100644 --- a/packages/contracts-bedrock/test/L1/L2OutputOracle.t.sol +++ b/packages/contracts-bedrock/test/L1/L2OutputOracle.t.sol @@ -16,11 +16,12 @@ import { Proxy } from "src/universal/Proxy.sol"; // Target contract import { L2OutputOracle } from "src/L1/L2OutputOracle.sol"; +import { IL2OutputOracle } from "src/L1/interfaces/IL2OutputOracle.sol"; contract L2OutputOracle_constructor_Test is CommonTest { /// @dev Tests that constructor sets the initial values correctly. function test_constructor_succeeds() external { - L2OutputOracle oracleImpl = new L2OutputOracle(); + IL2OutputOracle oracleImpl = IL2OutputOracle(address(new L2OutputOracle())); assertEq(oracleImpl.SUBMISSION_INTERVAL(), 1); assertEq(oracleImpl.submissionInterval(), 1); diff --git a/packages/contracts-bedrock/test/L1/OPStackManager.t.sol b/packages/contracts-bedrock/test/L1/OPStackManager.t.sol new file mode 100644 index 000000000000..6d9d7d134c33 --- /dev/null +++ b/packages/contracts-bedrock/test/L1/OPStackManager.t.sol @@ -0,0 +1,120 @@ +// SPDX-License-Identifier: MIT +pragma solidity 0.8.15; + +import { Test, stdStorage, StdStorage } from "forge-std/Test.sol"; + +import { DeployOPChainInput } from "scripts/DeployOPChain.s.sol"; +import { DeployOPChain_TestBase } from "test/DeployOPChain.t.sol"; + +import { OPStackManager } from "src/L1/OPStackManager.sol"; +import { SuperchainConfig } from "src/L1/SuperchainConfig.sol"; +import { ProtocolVersions } from "src/L1/ProtocolVersions.sol"; + +// Exposes internal functions for testing. +contract OPStackManager_Harness is OPStackManager { + constructor( + SuperchainConfig _superchainConfig, + ProtocolVersions _protocolVersions + ) + OPStackManager(_superchainConfig, _protocolVersions) + { } + + function chainIdToBatchInboxAddress_exposed(uint256 l2ChainId) public pure returns (address) { + return super.chainIdToBatchInboxAddress(l2ChainId); + } +} + +// Unlike other test suites, we intentionally do not inherit from CommonTest or Setup. This is +// because OPStackManager acts as a deploy script, so we start from a clean slate here and +// work OPStackManager's deployment into the existing test setup, instead of using the existing +// test setup to deploy OPStackManager. We do however inherit from DeployOPChain_TestBase so +// we can use its setup to deploy the implementations similarly to how a real deployment would +// happen. +contract OPStackManager_Deploy_Test is DeployOPChain_TestBase { + using stdStorage for StdStorage; + + function setUp() public override { + DeployOPChain_TestBase.setUp(); + + doi.set(doi.opChainProxyAdminOwner.selector, opChainProxyAdminOwner); + doi.set(doi.systemConfigOwner.selector, systemConfigOwner); + doi.set(doi.batcher.selector, batcher); + doi.set(doi.unsafeBlockSigner.selector, unsafeBlockSigner); + doi.set(doi.proposer.selector, proposer); + doi.set(doi.challenger.selector, challenger); + doi.set(doi.basefeeScalar.selector, basefeeScalar); + doi.set(doi.blobBaseFeeScalar.selector, blobBaseFeeScalar); + doi.set(doi.l2ChainId.selector, l2ChainId); + doi.set(doi.opsmProxy.selector, address(opsm)); + } + + // This helper function is used to convert the input struct type defined in DeployOPChain.s.sol + // to the input struct type defined in OPStackManager.sol. + function toOPSMDeployInput(DeployOPChainInput _doi) internal view returns (OPStackManager.DeployInput memory) { + return OPStackManager.DeployInput({ + roles: OPStackManager.Roles({ + opChainProxyAdminOwner: _doi.opChainProxyAdminOwner(), + systemConfigOwner: _doi.systemConfigOwner(), + batcher: _doi.batcher(), + unsafeBlockSigner: _doi.unsafeBlockSigner(), + proposer: _doi.proposer(), + challenger: _doi.challenger() + }), + basefeeScalar: _doi.basefeeScalar(), + blobBasefeeScalar: _doi.blobBaseFeeScalar(), + l2ChainId: _doi.l2ChainId(), + startingAnchorRoots: _doi.startingAnchorRoots() + }); + } + + function test_deploy_l2ChainIdEqualsZero_reverts() public { + OPStackManager.DeployInput memory deployInput = toOPSMDeployInput(doi); + deployInput.l2ChainId = 0; + vm.expectRevert(OPStackManager.InvalidChainId.selector); + opsm.deploy(deployInput); + } + + function test_deploy_l2ChainIdEqualsCurrentChainId_reverts() public { + OPStackManager.DeployInput memory deployInput = toOPSMDeployInput(doi); + deployInput.l2ChainId = block.chainid; + + vm.expectRevert(OPStackManager.InvalidChainId.selector); + opsm.deploy(deployInput); + } + + function test_deploy_succeeds() public { + opsm.deploy(toOPSMDeployInput(doi)); + } +} + +// These tests use the harness which exposes internal functions for testing. +contract OPStackManager_InternalMethods_Test is Test { + OPStackManager_Harness opsmHarness; + + function setUp() public { + SuperchainConfig superchainConfigProxy = SuperchainConfig(makeAddr("superchainConfig")); + ProtocolVersions protocolVersionsProxy = ProtocolVersions(makeAddr("protocolVersions")); + vm.etch(address(superchainConfigProxy), hex"01"); + vm.etch(address(protocolVersionsProxy), hex"01"); + + opsmHarness = new OPStackManager_Harness({ + _superchainConfig: superchainConfigProxy, + _protocolVersions: protocolVersionsProxy + }); + } + + function test_calculatesBatchInboxAddress_succeeds() public view { + // These test vectors were calculated manually: + // 1. Compute the bytes32 encoding of the chainId: bytes32(uint256(chainId)); + // 2. Hash it and manually take the first 19 bytes, and prefixed it with 0x00. + uint256 chainId = 1234; + address expected = 0x0017FA14b0d73Aa6A26D6b8720c1c84b50984f5C; + address actual = opsmHarness.chainIdToBatchInboxAddress_exposed(chainId); + vm.assertEq(expected, actual); + + chainId = type(uint256).max; + expected = 0x00a9C584056064687E149968cBaB758a3376D22A; + actual = opsmHarness.chainIdToBatchInboxAddress_exposed(chainId); + vm.assertEq(expected, actual); + } +} diff --git a/packages/contracts-bedrock/test/L1/OptimismPortal.t.sol b/packages/contracts-bedrock/test/L1/OptimismPortal.t.sol index 474c052a4016..0472c0781ce8 100644 --- a/packages/contracts-bedrock/test/L1/OptimismPortal.t.sol +++ b/packages/contracts-bedrock/test/L1/OptimismPortal.t.sol @@ -1,34 +1,33 @@ // SPDX-License-Identifier: MIT pragma solidity 0.8.15; -// Testing utilities +// Testing import { stdError } from "forge-std/Test.sol"; import { VmSafe } from "forge-std/Vm.sol"; - +import { MockERC20 } from "solmate/test/utils/mocks/MockERC20.sol"; import { CommonTest } from "test/setup/CommonTest.sol"; import { NextImpl } from "test/mocks/NextImpl.sol"; import { EIP1967Helper } from "test/mocks/EIP1967Helper.sol"; +// Contracts +import { Proxy } from "src/universal/Proxy.sol"; +import { SuperchainConfig } from "src/L1/SuperchainConfig.sol"; + // Libraries import { Types } from "src/libraries/Types.sol"; import { Hashing } from "src/libraries/Hashing.sol"; import { Constants } from "src/libraries/Constants.sol"; - -// Target contract dependencies -import { Proxy } from "src/universal/Proxy.sol"; -import { ResourceMetering } from "src/L1/ResourceMetering.sol"; -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"; +// Interfaces +import { IResourceMetering } from "src/L1/interfaces/IResourceMetering.sol"; +import { IL2OutputOracle } from "src/L1/interfaces/IL2OutputOracle.sol"; +import { IL1Block } from "src/L2/interfaces/IL1Block.sol"; +import { IOptimismPortal } from "src/L1/interfaces/IOptimismPortal.sol"; + contract OptimismPortal_Test is CommonTest { address depositor; @@ -43,7 +42,7 @@ contract OptimismPortal_Test is CommonTest { /// @notice Marked virtual to be overridden in /// test/kontrol/deployment/DeploymentSummary.t.sol function test_constructor_succeeds() external virtual { - OptimismPortal opImpl = OptimismPortal(payable(deploy.mustGetAddress("OptimismPortal"))); + IOptimismPortal opImpl = IOptimismPortal(payable(deploy.mustGetAddress("OptimismPortal"))); assertEq(address(opImpl.l2Oracle()), address(0)); assertEq(address(opImpl.systemConfig()), address(0)); assertEq(address(opImpl.superchainConfig()), address(0)); @@ -170,7 +169,7 @@ contract OptimismPortal_Test is CommonTest { _to = address(0); } vm.assume(_data.length <= 120_000); - ResourceMetering.ResourceConfig memory rcfg = systemConfig.resourceConfig(); + IResourceMetering.ResourceConfig memory rcfg = systemConfig.resourceConfig(); _gasLimit = uint64(bound(_gasLimit, optimismPortal.minimumGasLimit(uint64(_data.length)), rcfg.maxResourceLimit)); @@ -403,7 +402,7 @@ contract OptimismPortal_Test is CommonTest { uint256 ts = block.timestamp; vm.mockCall( address(optimismPortal.l2Oracle()), - abi.encodeWithSelector(L2OutputOracle.getL2Output.selector), + abi.encodeWithSelector(IL2OutputOracle.getL2Output.selector), abi.encode(Types.OutputProposal(bytes32(uint256(1)), uint128(ts), uint128(startingBlockNumber))) ); @@ -463,7 +462,7 @@ contract OptimismPortal_Test is CommonTest { uint256(0), // value uint64(200_000), // gasLimit false, // isCreation, - abi.encodeCall(L1Block.setGasPayingToken, (_token, _decimals, _name, _symbol)) + abi.encodeCall(IL1Block.setGasPayingToken, (_token, _decimals, _name, _symbol)) ) ); @@ -498,7 +497,7 @@ contract OptimismPortal_Test is CommonTest { _value: 0, _gasLimit: 200_000, _isCreation: false, - _data: abi.encodeCall(L1Block.setGasPayingToken, (_token, 18, name, symbol)) + _data: abi.encodeCall(IL1Block.setGasPayingToken, (_token, 18, name, symbol)) }); VmSafe.Log[] memory logs = vm.getRecordedLogs(); @@ -831,7 +830,7 @@ contract OptimismPortal_FinalizeWithdrawal_Test is CommonTest { // this case we just use bytes32(uint256(1)). vm.mockCall( address(optimismPortal.l2Oracle()), - abi.encodeWithSelector(L2OutputOracle.getL2Output.selector), + abi.encodeWithSelector(IL2OutputOracle.getL2Output.selector), abi.encode(bytes32(uint256(1)), _proposedBlockNumber) ); @@ -886,7 +885,7 @@ contract OptimismPortal_FinalizeWithdrawal_Test is CommonTest { // to finalize the withdrawal. vm.mockCall( address(optimismPortal.l2Oracle()), - abi.encodeWithSelector(L2OutputOracle.getL2Output.selector), + abi.encodeWithSelector(IL2OutputOracle.getL2Output.selector), abi.encode( Types.OutputProposal(bytes32(uint256(0)), uint128(block.timestamp), uint128(_proposedBlockNumber)) ) @@ -917,7 +916,7 @@ contract OptimismPortal_FinalizeWithdrawal_Test is CommonTest { // finalization period. vm.mockCall( address(optimismPortal.l2Oracle()), - abi.encodeWithSelector(L2OutputOracle.getL2Output.selector), + abi.encodeWithSelector(IL2OutputOracle.getL2Output.selector), abi.encode(Types.OutputProposal(_outputRoot, uint128(block.timestamp + 1), uint128(_proposedBlockNumber))) ); @@ -953,7 +952,7 @@ contract OptimismPortal_FinalizeWithdrawal_Test is CommonTest { uint256 recentTimestamp = block.timestamp - 1; vm.mockCall( address(optimismPortal.l2Oracle()), - abi.encodeWithSelector(L2OutputOracle.getL2Output.selector), + abi.encodeWithSelector(IL2OutputOracle.getL2Output.selector), abi.encode(Types.OutputProposal(_outputRoot, uint128(recentTimestamp), uint128(_proposedBlockNumber))) ); @@ -1005,7 +1004,7 @@ contract OptimismPortal_FinalizeWithdrawal_Test is CommonTest { vm.mockCall( address(optimismPortal.l2Oracle()), - abi.encodeWithSelector(L2OutputOracle.getL2Output.selector), + abi.encodeWithSelector(IL2OutputOracle.getL2Output.selector), abi.encode( Types.OutputProposal( Hashing.hashOutputRootProof(outputRootProof), @@ -1054,7 +1053,7 @@ contract OptimismPortal_FinalizeWithdrawal_Test is CommonTest { uint256 finalizedTimestamp = block.timestamp - l2OutputOracle.FINALIZATION_PERIOD_SECONDS() - 1; vm.mockCall( address(optimismPortal.l2Oracle()), - abi.encodeWithSelector(L2OutputOracle.getL2Output.selector), + abi.encodeWithSelector(IL2OutputOracle.getL2Output.selector), abi.encode(Types.OutputProposal(outputRoot, uint128(finalizedTimestamp), uint128(_proposedBlockNumber))) ); @@ -1156,7 +1155,7 @@ contract OptimismPortalUpgradeable_Test is CommonTest { /// @dev Tests that the proxy is initialized correctly. function test_params_initValuesOnProxy_succeeds() external view { (uint128 prevBaseFee, uint64 prevBoughtGas, uint64 prevBlockNum) = optimismPortal.params(); - ResourceMetering.ResourceConfig memory rcfg = systemConfig.resourceConfig(); + IResourceMetering.ResourceConfig memory rcfg = systemConfig.resourceConfig(); assertEq(prevBaseFee, rcfg.minimumBaseFee); assertEq(prevBoughtGas, 0); @@ -1211,24 +1210,36 @@ contract OptimismPortalResourceFuzz_Test is CommonTest { { // Get the set system gas limit uint64 gasLimit = systemConfig.gasLimit(); + // Bound resource config _maxResourceLimit = uint32(bound(_maxResourceLimit, 21000, MAX_GAS_LIMIT / 8)); _gasLimit = uint64(bound(_gasLimit, 21000, _maxResourceLimit)); _prevBaseFee = uint128(bound(_prevBaseFee, 0, 3 gwei)); + _prevBoughtGas = uint64(bound(_prevBoughtGas, 0, _maxResourceLimit - _gasLimit)); + _blockDiff = uint8(bound(_blockDiff, 0, 3)); + _baseFeeMaxChangeDenominator = uint8(bound(_baseFeeMaxChangeDenominator, 2, type(uint8).max)); + _elasticityMultiplier = uint8(bound(_elasticityMultiplier, 1, type(uint8).max)); + // Prevent values that would cause reverts vm.assume(gasLimit >= _gasLimit); vm.assume(_minimumBaseFee < _maximumBaseFee); - vm.assume(_baseFeeMaxChangeDenominator > 1); vm.assume(uint256(_maxResourceLimit) + uint256(_systemTxMaxGas) <= gasLimit); - vm.assume(_elasticityMultiplier > 0); vm.assume(((_maxResourceLimit / _elasticityMultiplier) * _elasticityMultiplier) == _maxResourceLimit); - _prevBoughtGas = uint64(bound(_prevBoughtGas, 0, _maxResourceLimit - _gasLimit)); - _blockDiff = uint8(bound(_blockDiff, 0, 3)); + + // Base fee can increase quickly and mean that we can't buy the amount of gas we want. + // Here we add a VM assumption to bound the potential increase. + // Compute the maximum possible increase in base fee. + uint256 maxPercentIncrease = uint256(_elasticityMultiplier - 1) * 100 / uint256(_baseFeeMaxChangeDenominator); + // Assume that we have enough gas to burn. + // Compute the maximum amount of gas we'd need to burn. + // Assume we need 1/5 of our gas to do other stuff. + vm.assume(_prevBaseFee * maxPercentIncrease * _gasLimit / 100 < MAX_GAS_LIMIT * 4 / 5); + // Pick a pseudorandom block number vm.roll(uint256(keccak256(abi.encode(_blockDiff))) % uint256(type(uint16).max) + uint256(_blockDiff)); // Create a resource config to mock the call to the system config with - ResourceMetering.ResourceConfig memory rcfg = ResourceMetering.ResourceConfig({ + IResourceMetering.ResourceConfig memory rcfg = IResourceMetering.ResourceConfig({ maxResourceLimit: _maxResourceLimit, elasticityMultiplier: _elasticityMultiplier, baseFeeMaxChangeDenominator: _baseFeeMaxChangeDenominator, @@ -1287,7 +1298,7 @@ contract OptimismPortalWithMockERC20_Test is OptimismPortal_FinalizeWithdrawal_T _to = address(0); } vm.assume(_data.length <= 120_000); - ResourceMetering.ResourceConfig memory rcfg = systemConfig.resourceConfig(); + IResourceMetering.ResourceConfig memory rcfg = systemConfig.resourceConfig(); _gasLimit = uint64(bound(_gasLimit, optimismPortal.minimumGasLimit(uint64(_data.length)), rcfg.maxResourceLimit)); @@ -1502,7 +1513,7 @@ contract OptimismPortalWithMockERC20_Test is OptimismPortal_FinalizeWithdrawal_T _to = address(0); } vm.assume(_data.length <= 120_000); - ResourceMetering.ResourceConfig memory rcfg = systemConfig.resourceConfig(); + IResourceMetering.ResourceConfig memory rcfg = systemConfig.resourceConfig(); _gasLimit = uint64(bound(_gasLimit, optimismPortal.minimumGasLimit(uint64(_data.length)), rcfg.maxResourceLimit)); diff --git a/packages/contracts-bedrock/test/L1/OptimismPortal2.t.sol b/packages/contracts-bedrock/test/L1/OptimismPortal2.t.sol index 257d2799b441..c131995c1a6b 100644 --- a/packages/contracts-bedrock/test/L1/OptimismPortal2.t.sol +++ b/packages/contracts-bedrock/test/L1/OptimismPortal2.t.sol @@ -1,30 +1,35 @@ // SPDX-License-Identifier: MIT pragma solidity 0.8.15; -// Testing utilities +// Testing import { stdError } from "forge-std/Test.sol"; - +import { VmSafe } from "forge-std/Vm.sol"; +import { MockERC20 } from "solmate/test/utils/mocks/MockERC20.sol"; import { CommonTest } from "test/setup/CommonTest.sol"; import { NextImpl } from "test/mocks/NextImpl.sol"; import { EIP1967Helper } from "test/mocks/EIP1967Helper.sol"; +// Contracts +import { Proxy } from "src/universal/Proxy.sol"; +import { SuperchainConfig } from "src/L1/SuperchainConfig.sol"; + // Libraries import { Types } from "src/libraries/Types.sol"; import { Hashing } from "src/libraries/Hashing.sol"; import { Constants } from "src/libraries/Constants.sol"; - -// Target contract dependencies -import { Proxy } from "src/universal/Proxy.sol"; -import { ResourceMetering } from "src/L1/ResourceMetering.sol"; +import { Predeploys } from "src/libraries/Predeploys.sol"; +import { GasPayingToken } from "src/libraries/GasPayingToken.sol"; import { AddressAliasHelper } from "src/vendor/AddressAliasHelper.sol"; -import { SystemConfig } from "src/L1/SystemConfig.sol"; -import { SuperchainConfig } from "src/L1/SuperchainConfig.sol"; -import { OptimismPortal2 } from "src/L1/OptimismPortal2.sol"; - -import { FaultDisputeGame, IDisputeGame } from "src/dispute/FaultDisputeGame.sol"; import "src/dispute/lib/Types.sol"; import "src/libraries/PortalErrors.sol"; +// Interfaces +import { IResourceMetering } from "src/L1/interfaces/IResourceMetering.sol"; +import { IL1Block } from "src/L2/interfaces/IL1Block.sol"; +import { IOptimismPortal2 } from "src/L1/interfaces/IOptimismPortal2.sol"; +import { IDisputeGame } from "src/dispute/interfaces/IDisputeGame.sol"; +import { IFaultDisputeGame } from "src/dispute/interfaces/IFaultDisputeGame.sol"; + contract OptimismPortal2_Test is CommonTest { address depositor; @@ -32,6 +37,12 @@ contract OptimismPortal2_Test is CommonTest { super.enableFaultProofs(); super.setUp(); + // zero out contracts that should not be used + assembly { + sstore(l2OutputOracle.slot, 0) + sstore(optimismPortal.slot, 0) + } + depositor = makeAddr("depositor"); } @@ -39,7 +50,7 @@ contract OptimismPortal2_Test is CommonTest { /// @notice Marked virtual to be overridden in /// test/kontrol/deployment/DeploymentSummary.t.sol function test_constructor_succeeds() external virtual { - OptimismPortal2 opImpl = OptimismPortal2(payable(deploy.mustGetAddress("OptimismPortal2"))); + IOptimismPortal2 opImpl = IOptimismPortal2(payable(deploy.mustGetAddress("OptimismPortal2"))); assertEq(address(opImpl.disputeGameFactory()), address(0)); assertEq(address(opImpl.systemConfig()), address(0)); assertEq(address(opImpl.superchainConfig()), address(0)); @@ -286,13 +297,134 @@ contract OptimismPortal2_Test is CommonTest { }); assertEq(address(optimismPortal2).balance, _mint); } + + /// @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(optimismPortal2)); + emit TransactionDeposited( + 0xDeaDDEaDDeAdDeAdDEAdDEaddeAddEAdDEAd0001, + Predeploys.L1_BLOCK_ATTRIBUTES, + 0, + abi.encodePacked( + uint256(0), // mint + uint256(0), // value + uint64(200_000), // gasLimit + false, // isCreation, + abi.encodeCall(IL1Block.setGasPayingToken, (_token, _decimals, _name, _symbol)) + ) + ); + + vm.prank(address(systemConfig)); + optimismPortal2.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)); + optimismPortal2.setGasPayingToken({ _token: _token, _decimals: 18, _name: name, _symbol: symbol }); + + vm.prank(Constants.DEPOSITOR_ACCOUNT, Constants.DEPOSITOR_ACCOUNT); + optimismPortal2.depositTransaction({ + _to: Predeploys.L1_BLOCK_ATTRIBUTES, + _value: 0, + _gasLimit: 200_000, + _isCreation: false, + _data: abi.encodeCall(IL1Block.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); + optimismPortal2.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); + optimismPortal2.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(optimismPortal2), bytes32(uint256(61)), bytes32(type(uint256).max)); + assertEq(optimismPortal2.balance(), type(uint256).max); + + vm.expectRevert(stdError.arithmeticError); + optimismPortal2.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(optimismPortal2), _amount); + + // Check that the balance has been correctly updated + assertEq(optimismPortal2.balance(), address(optimismPortal2).balance); + } } contract OptimismPortal2_FinalizeWithdrawal_Test is CommonTest { // Reusable default values for a test withdrawal Types.WithdrawalTransaction _defaultTx; - FaultDisputeGame game; + IFaultDisputeGame game; uint256 _proposedGameIndex; uint256 _proposedBlockNumber; bytes32 _stateRoot; @@ -313,8 +445,8 @@ contract OptimismPortal2_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); @@ -329,9 +461,9 @@ contract OptimismPortal2_FinalizeWithdrawal_Test is CommonTest { } /// @dev Setup the system for a ready-to-use state. - function setUp() public override { + function setUp() public virtual override { _proposedBlockNumber = 0xFF; - game = FaultDisputeGame( + game = IFaultDisputeGame( payable( address( disputeGameFactory.create( @@ -351,7 +483,7 @@ contract OptimismPortal2_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. optimismPortal2.finalizeWithdrawalTransaction(_defaultTx); @@ -414,7 +546,7 @@ contract OptimismPortal2_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(optimismPortal2); - vm.expectRevert("OptimismPortal: you cannot send messages to the portal contract"); + vm.expectRevert(BadTarget.selector); optimismPortal2.proveWithdrawalTransaction({ _tx: _defaultTx, _disputeGameIndex: _proposedGameIndex, @@ -427,7 +559,7 @@ contract OptimismPortal2_FinalizeWithdrawal_Test is CommonTest { function test_proveWithdrawalTransaction_onInvalidOutputRootProof_reverts() external { // Modify the version to invalidate the withdrawal proof. _outputRootProof.version = bytes32(uint256(1)); - vm.expectRevert("OptimismPortal: invalid output root proof"); + vm.expectRevert(InvalidProof.selector); optimismPortal2.proveWithdrawalTransaction({ _tx: _defaultTx, _disputeGameIndex: _proposedGameIndex, @@ -452,9 +584,9 @@ contract OptimismPortal2_FinalizeWithdrawal_Test is CommonTest { /// @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); + vm.expectEmit(address(optimismPortal2)); emit WithdrawalProven(_withdrawalHash, alice, bob); - vm.expectEmit(true, true, true, true); + vm.expectEmit(address(optimismPortal2)); emit WithdrawalProvenExtension1(_withdrawalHash, address(this)); optimismPortal2.proveWithdrawalTransaction({ _tx: _defaultTx, @@ -471,7 +603,7 @@ contract OptimismPortal2_FinalizeWithdrawal_Test is CommonTest { 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"); + vm.expectRevert(InvalidDisputeGame.selector); optimismPortal2.proveWithdrawalTransaction({ _tx: _defaultTx, _disputeGameIndex: _proposedGameIndex, @@ -489,7 +621,7 @@ contract OptimismPortal2_FinalizeWithdrawal_Test is CommonTest { abi.encode(GameType.wrap(0xFF), Timestamp.wrap(uint64(block.timestamp)), IDisputeGame(address(game))) ); - vm.expectRevert("OptimismPortal: invalid game type"); + vm.expectRevert(InvalidGameType.selector); optimismPortal2.proveWithdrawalTransaction({ _tx: _defaultTx, _disputeGameIndex: _proposedGameIndex, @@ -664,19 +796,19 @@ contract OptimismPortal2_FinalizeWithdrawal_Test is CommonTest { emit WithdrawalFinalized(_withdrawalHash, true); optimismPortal2.finalizeWithdrawalTransactionExternalProof(_defaultTx, address(0xb0b)); - vm.expectRevert("OptimismPortal: withdrawal has already been finalized"); + vm.expectRevert(AlreadyFinalized.selector); optimismPortal2.finalizeWithdrawalTransactionExternalProof(_defaultTx, address(this)); assert(address(bob).balance == bobBalanceBefore + 100); } /// @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); + vm.expectEmit(address(optimismPortal2)); emit WithdrawalProven(_withdrawalHash, alice, bob); - vm.expectEmit(true, true, true, true); + vm.expectEmit(address(optimismPortal2)); emit WithdrawalProvenExtension1(_withdrawalHash, address(this)); optimismPortal2.proveWithdrawalTransaction({ _tx: _defaultTx, @@ -747,7 +879,7 @@ contract OptimismPortal2_FinalizeWithdrawal_Test is CommonTest { // Ensure both proofs are registered successfully. assertEq(optimismPortal2.numProofSubmitters(_withdrawalHash), 2); - vm.expectRevert("OptimismPortal: output proposal has not been validated"); + vm.expectRevert(ProposalNotValidated.selector); vm.prank(address(0xb0b)); optimismPortal2.finalizeWithdrawalTransaction(_defaultTx); @@ -758,6 +890,30 @@ contract OptimismPortal2_FinalizeWithdrawal_Test is CommonTest { assert(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) + ); + + optimismPortal2.proveWithdrawalTransaction({ + _tx: _defaultTx, + _disputeGameIndex: _proposedGameIndex, + _outputRootProof: _outputRootProof, + _withdrawalProof: _withdrawalProof + }); + + // Warp to after the finalization period + game.resolveClaim(0, 0); + game.resolve(); + vm.warp(block.timestamp + optimismPortal2.proofMaturityDelaySeconds() + 1); + + vm.expectRevert(BadTarget.selector); + optimismPortal2.finalizeWithdrawalTransaction(_defaultTx); + } + /// @dev Tests that `finalizeWithdrawalTransaction` reverts if the contract is paused. function test_finalizeWithdrawalTransaction_paused_reverts() external { vm.prank(optimismPortal2.guardian()); @@ -771,7 +927,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 by proof submitter address yet"); + vm.expectRevert(Unproven.selector); optimismPortal2.finalizeWithdrawalTransaction(_defaultTx); assert(address(bob).balance == bobBalanceBefore); @@ -782,9 +938,9 @@ contract OptimismPortal2_FinalizeWithdrawal_Test is CommonTest { function test_finalizeWithdrawalTransaction_ifWithdrawalProofNotOldEnough_reverts() external { uint256 bobBalanceBefore = address(bob).balance; - vm.expectEmit(true, true, true, true); + vm.expectEmit(address(optimismPortal2)); emit WithdrawalProven(_withdrawalHash, alice, bob); - vm.expectEmit(true, true, true, true); + vm.expectEmit(address(optimismPortal2)); emit WithdrawalProvenExtension1(_withdrawalHash, address(this)); optimismPortal2.proveWithdrawalTransaction({ _tx: _defaultTx, @@ -851,7 +1007,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 validated"); + vm.expectRevert(ProposalNotValidated.selector); optimismPortal2.finalizeWithdrawalTransaction(_defaultTx); // Ensure that bob's balance has remained the same @@ -909,7 +1065,7 @@ contract OptimismPortal2_FinalizeWithdrawal_Test is CommonTest { emit WithdrawalFinalized(_withdrawalHash, true); optimismPortal2.finalizeWithdrawalTransaction(_defaultTx); - vm.expectRevert("OptimismPortal: withdrawal has already been finalized"); + vm.expectRevert(AlreadyFinalized.selector); optimismPortal2.finalizeWithdrawalTransaction(_defaultTx); } @@ -1102,7 +1258,7 @@ contract OptimismPortal2_FinalizeWithdrawal_Test is CommonTest { vm.warp(block.timestamp + optimismPortal2.proofMaturityDelaySeconds() + 1); - vm.expectRevert("OptimismPortal: dispute game has been blacklisted"); + vm.expectRevert(Blacklisted.selector); optimismPortal2.finalizeWithdrawalTransaction(_defaultTx); } @@ -1162,16 +1318,16 @@ contract OptimismPortal2_FinalizeWithdrawal_Test is CommonTest { vm.prank(optimismPortal2.guardian()); optimismPortal2.setRespectedGameType(GameType.wrap(0xFF)); - vm.expectRevert("OptimismPortal: invalid game type"); + vm.expectRevert(InvalidGameType.selector); optimismPortal2.finalizeWithdrawalTransaction(_defaultTx); } /// @dev Tests that `finalizeWithdrawalTransaction` reverts if the respected game type was updated after the /// dispute game was created. function test_finalizeWithdrawalTransaction_gameOlderThanRespectedGameTypeUpdate_reverts() external { - vm.expectEmit(true, true, true, true); + vm.expectEmit(address(optimismPortal2)); emit WithdrawalProven(_withdrawalHash, alice, bob); - vm.expectEmit(true, true, true, true); + vm.expectEmit(address(optimismPortal2)); emit WithdrawalProvenExtension1(_withdrawalHash, address(this)); optimismPortal2.proveWithdrawalTransaction({ _tx: _defaultTx, @@ -1220,7 +1376,7 @@ 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 validated"); + vm.expectRevert(ProposalNotValidated.selector); optimismPortal2.finalizeWithdrawalTransaction(_defaultTx); // Finalize the dispute game and attempt to finalize the withdrawal again. This should also fail, since the @@ -1248,7 +1404,7 @@ contract OptimismPortal2_Upgradeable_Test is CommonTest { /// @dev Tests that the proxy is initialized correctly. function test_params_initValuesOnProxy_succeeds() external view { (uint128 prevBaseFee, uint64 prevBoughtGas, uint64 prevBlockNum) = optimismPortal2.params(); - ResourceMetering.ResourceConfig memory rcfg = systemConfig.resourceConfig(); + IResourceMetering.ResourceConfig memory rcfg = systemConfig.resourceConfig(); assertEq(prevBaseFee, rcfg.minimumBaseFee); assertEq(prevBoughtGas, 0); @@ -1308,24 +1464,37 @@ contract OptimismPortal2_ResourceFuzz_Test is CommonTest { { // Get the set system gas limit uint64 gasLimit = systemConfig.gasLimit(); + // Bound resource config _maxResourceLimit = uint32(bound(_maxResourceLimit, 21000, MAX_GAS_LIMIT / 8)); _gasLimit = uint64(bound(_gasLimit, 21000, _maxResourceLimit)); _prevBaseFee = uint128(bound(_prevBaseFee, 0, 3 gwei)); + _prevBoughtGas = uint64(bound(_prevBoughtGas, 0, _maxResourceLimit - _gasLimit)); + _blockDiff = uint8(bound(_blockDiff, 0, 3)); + _baseFeeMaxChangeDenominator = uint8(bound(_baseFeeMaxChangeDenominator, 2, type(uint8).max)); + _elasticityMultiplier = uint8(bound(_elasticityMultiplier, 1, type(uint8).max)); + // Prevent values that would cause reverts vm.assume(gasLimit >= _gasLimit); vm.assume(_minimumBaseFee < _maximumBaseFee); vm.assume(_baseFeeMaxChangeDenominator > 1); vm.assume(uint256(_maxResourceLimit) + uint256(_systemTxMaxGas) <= gasLimit); - vm.assume(_elasticityMultiplier > 0); vm.assume(((_maxResourceLimit / _elasticityMultiplier) * _elasticityMultiplier) == _maxResourceLimit); - _prevBoughtGas = uint64(bound(_prevBoughtGas, 0, _maxResourceLimit - _gasLimit)); - _blockDiff = uint8(bound(_blockDiff, 0, 3)); + + // Base fee can increase quickly and mean that we can't buy the amount of gas we want. + // Here we add a VM assumption to bound the potential increase. + // Compute the maximum possible increase in base fee. + uint256 maxPercentIncrease = uint256(_elasticityMultiplier - 1) * 100 / uint256(_baseFeeMaxChangeDenominator); + // Assume that we have enough gas to burn. + // Compute the maximum amount of gas we'd need to burn. + // Assume we need 1/5 of our gas to do other stuff. + vm.assume(_prevBaseFee * maxPercentIncrease * _gasLimit / 100 < MAX_GAS_LIMIT * 4 / 5); + // Pick a pseudorandom block number vm.roll(uint256(keccak256(abi.encode(_blockDiff))) % uint256(type(uint16).max) + uint256(_blockDiff)); // Create a resource config to mock the call to the system config with - ResourceMetering.ResourceConfig memory rcfg = ResourceMetering.ResourceConfig({ + IResourceMetering.ResourceConfig memory rcfg = IResourceMetering.ResourceConfig({ maxResourceLimit: _maxResourceLimit, elasticityMultiplier: _elasticityMultiplier, baseFeeMaxChangeDenominator: _baseFeeMaxChangeDenominator, @@ -1360,3 +1529,333 @@ contract OptimismPortal2_ResourceFuzz_Test is CommonTest { }); } } + +contract OptimismPortal2WithMockERC20_Test is OptimismPortal2_FinalizeWithdrawal_Test { + MockERC20 token; + + function setUp() public virtual 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); + IResourceMetering.ResourceConfig memory rcfg = systemConfig.resourceConfig(); + _gasLimit = + uint64(bound(_gasLimit, optimismPortal2.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(optimismPortal2), _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(optimismPortal2)); + 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(optimismPortal2)), _mint); + assertEq(optimismPortal2.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 + optimismPortal2.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(optimismPortal2), 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 = optimismPortal2.minimumGasLimit(0); + + vm.expectRevert(TransferFailed.selector); + + // Deposit the token into the portal + optimismPortal2.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 = optimismPortal2.minimumGasLimit(0); + + vm.expectRevert(BadTarget.selector); + // Deposit the token into the portal + optimismPortal2.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 + optimismPortal2.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 = optimismPortal2.minimumGasLimit(120_001); + vm.expectRevert(LargeCalldata.selector); + // Deposit the token into the portal + optimismPortal2.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(optimismPortal2), _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 + optimismPortal2.depositERC20Transaction(address(0), _amount, 0, optimismPortal.minimumGasLimit(0), false, ""); + + // Check that the balance has been correctly updated + assertEq(optimismPortal2.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(optimismPortal2), _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 + optimismPortal2.depositERC20Transaction( + address(bob), _defaultTx.value, 0, optimismPortal.minimumGasLimit(0), false, "" + ); + + assertEq(optimismPortal2.balance(), _defaultTx.value); + + vm.expectEmit(address(optimismPortal2)); + emit WithdrawalProven(_withdrawalHash, alice, bob); + optimismPortal2.proveWithdrawalTransaction({ + _tx: _defaultTx, + _disputeGameIndex: _proposedGameIndex, + _outputRootProof: _outputRootProof, + _withdrawalProof: _withdrawalProof + }); + + // Warp past the finalization period. + game.resolveClaim(0, 0); + game.resolve(); + vm.warp(block.timestamp + optimismPortal2.proofMaturityDelaySeconds() + 1); + + vm.expectEmit(address(optimismPortal2)); + 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) + ); + + optimismPortal2.finalizeWithdrawalTransaction(_defaultTx); + + assertEq(optimismPortal2.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); + IResourceMetering.ResourceConfig memory rcfg = systemConfig.resourceConfig(); + _gasLimit = + uint64(bound(_gasLimit, optimismPortal2.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(optimismPortal2)); + emit TransactionDeposited( + _from, // from + _to, + uint256(0), // DEPOSIT_VERSION + opaqueData + ); + + // Deposit the token into the portal + optimismPortal2.depositTransaction(_to, _value, _gasLimit, _isCreation, _data); + + // Assert final balance equals the deposited amount + assertEq(token.balanceOf(address(optimismPortal2)), 0); + assertEq(optimismPortal2.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 + optimismPortal2.depositTransaction{ value: 100 }(address(0), 0, 0, false, ""); + } +} 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..6e0235774df6 --- /dev/null +++ b/packages/contracts-bedrock/test/L1/OptimismPortalInterop.t.sol @@ -0,0 +1,101 @@ +// 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"; +import "src/libraries/PortalErrors.sol"; + +// Target contract dependencies +import "src/libraries/PortalErrors.sol"; +import { OptimismPortalInterop } from "src/L1/OptimismPortalInterop.sol"; +import { L1BlockIsthmus, ConfigType } from "src/L2/L1BlockIsthmus.sol"; + +// Interfaces +import { IOptimismPortalInterop } from "src/L1/interfaces/IOptimismPortalInterop.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(L1BlockIsthmus.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(L1BlockIsthmus.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(L1BlockIsthmus.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 (IOptimismPortalInterop) { + return IOptimismPortalInterop(payable(address(optimismPortal))); + } +} diff --git a/packages/contracts-bedrock/test/L1/ProtocolVersions.t.sol b/packages/contracts-bedrock/test/L1/ProtocolVersions.t.sol index 235654d38af6..957d2b914f38 100644 --- a/packages/contracts-bedrock/test/L1/ProtocolVersions.t.sol +++ b/packages/contracts-bedrock/test/L1/ProtocolVersions.t.sol @@ -12,10 +12,10 @@ import { Constants } from "src/libraries/Constants.sol"; import { Proxy } from "src/universal/Proxy.sol"; // Target contract -import { ProtocolVersions, ProtocolVersion } from "src/L1/ProtocolVersions.sol"; +import { IProtocolVersions, ProtocolVersion } from "src/L1/interfaces/IProtocolVersions.sol"; contract ProtocolVersions_Init is CommonTest { - event ConfigUpdate(uint256 indexed version, ProtocolVersions.UpdateType indexed updateType, bytes data); + event ConfigUpdate(uint256 indexed version, IProtocolVersions.UpdateType indexed updateType, bytes data); ProtocolVersion required; ProtocolVersion recommended; @@ -30,7 +30,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 view { - ProtocolVersions protocolVersionsImpl = ProtocolVersions(deploy.mustGetAddress("ProtocolVersions")); + IProtocolVersions protocolVersionsImpl = IProtocolVersions(deploy.mustGetAddress("ProtocolVersions")); address owner = deploy.cfg().finalSystemOwner(); assertEq(ProtocolVersion.unwrap(protocolVersions.required()), ProtocolVersion.unwrap(required)); @@ -44,7 +44,7 @@ contract ProtocolVersions_Initialize_Test is ProtocolVersions_Init { /// @dev Ensures that the events are emitted during initialization. function test_initialize_events_succeeds() external { - ProtocolVersions protocolVersionsImpl = ProtocolVersions(deploy.mustGetAddress("ProtocolVersions")); + IProtocolVersions protocolVersionsImpl = IProtocolVersions(deploy.mustGetAddress("ProtocolVersions")); assertEq(protocolVersionsImpl.owner(), address(0xdEad)); // Wipe out the initialized slot so the proxy can be initialized again @@ -52,15 +52,15 @@ contract ProtocolVersions_Initialize_Test is ProtocolVersions_Init { // The order depends here vm.expectEmit(true, true, true, true, address(protocolVersions)); - emit ConfigUpdate(0, ProtocolVersions.UpdateType.REQUIRED_PROTOCOL_VERSION, abi.encode(required)); + emit ConfigUpdate(0, IProtocolVersions.UpdateType.REQUIRED_PROTOCOL_VERSION, abi.encode(required)); vm.expectEmit(true, true, true, true, address(protocolVersions)); - emit ConfigUpdate(0, ProtocolVersions.UpdateType.RECOMMENDED_PROTOCOL_VERSION, abi.encode(recommended)); + emit ConfigUpdate(0, IProtocolVersions.UpdateType.RECOMMENDED_PROTOCOL_VERSION, abi.encode(recommended)); vm.prank(EIP1967Helper.getAdmin(address(protocolVersions))); Proxy(payable(address(protocolVersions))).upgradeToAndCall( address(protocolVersionsImpl), abi.encodeCall( - ProtocolVersions.initialize, + IProtocolVersions.initialize, ( alice, // _owner required, // _required @@ -89,7 +89,7 @@ contract ProtocolVersions_Setters_Test is ProtocolVersions_Init { /// @dev Tests that `setRequired` updates the required protocol version successfully. function testFuzz_setRequired_succeeds(uint256 _version) external { vm.expectEmit(true, true, true, true); - emit ConfigUpdate(0, ProtocolVersions.UpdateType.REQUIRED_PROTOCOL_VERSION, abi.encode(_version)); + emit ConfigUpdate(0, IProtocolVersions.UpdateType.REQUIRED_PROTOCOL_VERSION, abi.encode(_version)); vm.prank(protocolVersions.owner()); protocolVersions.setRequired(ProtocolVersion.wrap(_version)); @@ -99,7 +99,7 @@ contract ProtocolVersions_Setters_Test is ProtocolVersions_Init { /// @dev Tests that `setRecommended` updates the recommended protocol version successfully. function testFuzz_setRecommended_succeeds(uint256 _version) external { vm.expectEmit(true, true, true, true); - emit ConfigUpdate(0, ProtocolVersions.UpdateType.RECOMMENDED_PROTOCOL_VERSION, abi.encode(_version)); + emit ConfigUpdate(0, IProtocolVersions.UpdateType.RECOMMENDED_PROTOCOL_VERSION, abi.encode(_version)); vm.prank(protocolVersions.owner()); protocolVersions.setRecommended(ProtocolVersion.wrap(_version)); diff --git a/packages/contracts-bedrock/test/L1/ResourceMetering.t.sol b/packages/contracts-bedrock/test/L1/ResourceMetering.t.sol index 63b208b9c255..f315b5212fd6 100644 --- a/packages/contracts-bedrock/test/L1/ResourceMetering.t.sol +++ b/packages/contracts-bedrock/test/L1/ResourceMetering.t.sol @@ -12,13 +12,22 @@ import { Proxy } from "src/universal/Proxy.sol"; // Target contract import { ResourceMetering } from "src/L1/ResourceMetering.sol"; +import { IResourceMetering } from "src/L1/interfaces/IResourceMetering.sol"; contract MeterUser is ResourceMetering { ResourceMetering.ResourceConfig public innerConfig; constructor() { initialize(); - innerConfig = Constants.DEFAULT_RESOURCE_CONFIG(); + IResourceMetering.ResourceConfig memory rcfg = Constants.DEFAULT_RESOURCE_CONFIG(); + innerConfig = ResourceMetering.ResourceConfig({ + maxResourceLimit: rcfg.maxResourceLimit, + elasticityMultiplier: rcfg.elasticityMultiplier, + baseFeeMaxChangeDenominator: rcfg.baseFeeMaxChangeDenominator, + minimumBaseFee: rcfg.minimumBaseFee, + systemTxMaxGas: rcfg.systemTxMaxGas, + maximumBaseFee: rcfg.maximumBaseFee + }); } function initialize() public initializer { @@ -231,7 +240,15 @@ contract CustomMeterUser is ResourceMetering { } function _resourceConfig() internal pure override returns (ResourceMetering.ResourceConfig memory) { - return Constants.DEFAULT_RESOURCE_CONFIG(); + IResourceMetering.ResourceConfig memory rcfg = Constants.DEFAULT_RESOURCE_CONFIG(); + return ResourceMetering.ResourceConfig({ + maxResourceLimit: rcfg.maxResourceLimit, + elasticityMultiplier: rcfg.elasticityMultiplier, + baseFeeMaxChangeDenominator: rcfg.baseFeeMaxChangeDenominator, + minimumBaseFee: rcfg.minimumBaseFee, + systemTxMaxGas: rcfg.systemTxMaxGas, + maximumBaseFee: rcfg.maximumBaseFee + }); } function use(uint64 _amount) public returns (uint256) { @@ -281,7 +298,13 @@ contract ArtifactResourceMetering_Test is Test { /// @dev Generates a CSV file. No more than the L1 block gas limit should /// be supplied to the `meter` function to avoid long execution time. + /// This test is skipped because there is no need to run it every time. + /// It generates a CSV file on disk that can be used to analyze the + /// gas usage and cost of the `ResourceMetering` contract. The next time + /// that the gas usage needs to be analyzed, the skip may be removed. function test_meter_generateArtifact_succeeds() external { + vm.skip({ skipTest: true }); + vm.writeLine( outfile, "prevBaseFee,prevBoughtGas,prevBlockNumDiff,l1BaseFee,requestedGas,gasConsumed,ethPrice,usdCost,success" diff --git a/packages/contracts-bedrock/test/L1/SuperchainConfig.t.sol b/packages/contracts-bedrock/test/L1/SuperchainConfig.t.sol index 97b25f3f611a..409bb0003941 100644 --- a/packages/contracts-bedrock/test/L1/SuperchainConfig.t.sol +++ b/packages/contracts-bedrock/test/L1/SuperchainConfig.t.sol @@ -12,6 +12,7 @@ import { Proxy } from "src/universal/Proxy.sol"; // Target contract import { SuperchainConfig } from "src/L1/SuperchainConfig.sol"; +import { ISuperchainConfig } from "src/L1/interfaces/ISuperchainConfig.sol"; contract SuperchainConfig_Init_Test is CommonTest { /// @dev Tests that initialization sets the correct values. These are defined in CommonTest.sol. @@ -23,16 +24,16 @@ contract SuperchainConfig_Init_Test is CommonTest { /// @dev Tests that it can be intialized as paused. function test_initialize_paused_succeeds() external { Proxy newProxy = new Proxy(alice); - SuperchainConfig newImpl = new SuperchainConfig(); + ISuperchainConfig newImpl = ISuperchainConfig(address(new SuperchainConfig())); vm.startPrank(alice); newProxy.upgradeToAndCall( address(newImpl), - abi.encodeWithSelector(SuperchainConfig.initialize.selector, deploy.cfg().superchainConfigGuardian(), true) + abi.encodeWithSelector(ISuperchainConfig.initialize.selector, deploy.cfg().superchainConfigGuardian(), true) ); - assertTrue(SuperchainConfig(address(newProxy)).paused()); - assertEq(SuperchainConfig(address(newProxy)).guardian(), deploy.cfg().superchainConfigGuardian()); + assertTrue(ISuperchainConfig(address(newProxy)).paused()); + assertEq(ISuperchainConfig(address(newProxy)).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 9b48f354d248..ddfafc0edb2f 100644 --- a/packages/contracts-bedrock/test/L1/SystemConfig.t.sol +++ b/packages/contracts-bedrock/test/L1/SystemConfig.t.sol @@ -1,26 +1,26 @@ // SPDX-License-Identifier: MIT pragma solidity 0.8.15; -// Testing utilities +// Testing import { CommonTest } from "test/setup/CommonTest.sol"; +import { EIP1967Helper } from "test/mocks/EIP1967Helper.sol"; + +// Contracts import { ERC20 } from "@openzeppelin/contracts/token/ERC20/ERC20.sol"; +import { Proxy } from "src/universal/Proxy.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"; +// Interfaces +import { IResourceMetering } from "src/L1/interfaces/IResourceMetering.sol"; +import { ISystemConfig } from "src/L1/interfaces/ISystemConfig.sol"; +import { IL1Block } from "src/L2/interfaces/IL1Block.sol"; contract SystemConfig_Init is CommonTest { - event ConfigUpdate(uint256 indexed version, SystemConfig.UpdateType indexed updateType, bytes data); + event ConfigUpdate(uint256 indexed version, ISystemConfig.UpdateType indexed updateType, bytes data); } contract SystemConfig_Initialize_Test is SystemConfig_Init { @@ -49,7 +49,7 @@ contract SystemConfig_Initialize_Test is SystemConfig_Init { /// @dev Tests that constructor sets the correct values. function test_constructor_succeeds() external view { - SystemConfig impl = SystemConfig(systemConfigImpl); + ISystemConfig impl = ISystemConfig(systemConfigImpl); assertEq(impl.owner(), address(0xdEaD)); assertEq(impl.overhead(), 0); assertEq(impl.scalar(), uint256(0x01) << 248); @@ -58,7 +58,7 @@ contract SystemConfig_Initialize_Test is SystemConfig_Init { assertEq(impl.unsafeBlockSigner(), address(0)); assertEq(impl.basefeeScalar(), 0); assertEq(impl.blobbasefeeScalar(), 0); - ResourceMetering.ResourceConfig memory actual = impl.resourceConfig(); + IResourceMetering.ResourceConfig memory actual = impl.resourceConfig(); assertEq(actual.maxResourceLimit, 1); assertEq(actual.elasticityMultiplier, 1); assertEq(actual.baseFeeMaxChangeDenominator, 2); @@ -91,8 +91,8 @@ contract SystemConfig_Initialize_Test is SystemConfig_Init { 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(); + IResourceMetering.ResourceConfig memory rcfg = Constants.DEFAULT_RESOURCE_CONFIG(); + IResourceMetering.ResourceConfig memory actual = systemConfig.resourceConfig(); assertEq(actual.maxResourceLimit, rcfg.maxResourceLimit); assertEq(actual.elasticityMultiplier, rcfg.elasticityMultiplier); assertEq(actual.baseFeeMaxChangeDenominator, rcfg.baseFeeMaxChangeDenominator); @@ -138,7 +138,7 @@ contract SystemConfig_Initialize_TestFail is SystemConfig_Initialize_Test { _unsafeBlockSigner: address(1), _config: Constants.DEFAULT_RESOURCE_CONFIG(), _batchInbox: address(0), - _addresses: SystemConfig.Addresses({ + _addresses: ISystemConfig.Addresses({ l1CrossDomainMessenger: address(0), l1ERC721Bridge: address(0), l1StandardBridge: address(0), @@ -168,7 +168,7 @@ contract SystemConfig_Initialize_TestFail is SystemConfig_Initialize_Test { _unsafeBlockSigner: address(1), _config: Constants.DEFAULT_RESOURCE_CONFIG(), _batchInbox: address(0), - _addresses: SystemConfig.Addresses({ + _addresses: ISystemConfig.Addresses({ l1CrossDomainMessenger: address(0), l1ERC721Bridge: address(0), l1StandardBridge: address(0), @@ -199,7 +199,7 @@ contract SystemConfig_Initialize_TestFail is SystemConfig_Initialize_Test { _unsafeBlockSigner: address(1), _config: Constants.DEFAULT_RESOURCE_CONFIG(), _batchInbox: address(0), - _addresses: SystemConfig.Addresses({ + _addresses: ISystemConfig.Addresses({ l1CrossDomainMessenger: address(0), l1ERC721Bridge: address(0), l1StandardBridge: address(0), @@ -217,7 +217,7 @@ 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 { - ResourceMetering.ResourceConfig memory config = ResourceMetering.ResourceConfig({ + IResourceMetering.ResourceConfig memory config = IResourceMetering.ResourceConfig({ maxResourceLimit: 20_000_000, elasticityMultiplier: 10, baseFeeMaxChangeDenominator: 8, @@ -231,7 +231,7 @@ contract SystemConfig_Init_ResourceConfig is SystemConfig_Init { /// @dev Tests that `setResourceConfig` reverts if the baseFeeMaxChangeDenominator /// is zero. function test_setResourceConfig_zeroDenominator_reverts() external { - ResourceMetering.ResourceConfig memory config = ResourceMetering.ResourceConfig({ + IResourceMetering.ResourceConfig memory config = IResourceMetering.ResourceConfig({ maxResourceLimit: 20_000_000, elasticityMultiplier: 10, baseFeeMaxChangeDenominator: 0, @@ -246,7 +246,7 @@ contract SystemConfig_Init_ResourceConfig is SystemConfig_Init { function test_setResourceConfig_lowGasLimit_reverts() external { uint64 gasLimit = systemConfig.gasLimit(); - ResourceMetering.ResourceConfig memory config = ResourceMetering.ResourceConfig({ + IResourceMetering.ResourceConfig memory config = IResourceMetering.ResourceConfig({ maxResourceLimit: uint32(gasLimit), elasticityMultiplier: 10, baseFeeMaxChangeDenominator: 8, @@ -260,7 +260,7 @@ contract SystemConfig_Init_ResourceConfig is SystemConfig_Init { /// @dev Tests that `setResourceConfig` reverts if the elasticity multiplier /// and max resource limit are configured such that there is a loss of precision. function test_setResourceConfig_badPrecision_reverts() external { - ResourceMetering.ResourceConfig memory config = ResourceMetering.ResourceConfig({ + IResourceMetering.ResourceConfig memory config = IResourceMetering.ResourceConfig({ maxResourceLimit: 20_000_000, elasticityMultiplier: 11, baseFeeMaxChangeDenominator: 8, @@ -274,7 +274,7 @@ contract SystemConfig_Init_ResourceConfig is SystemConfig_Init { /// @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, + IResourceMetering.ResourceConfig memory config, string memory revertMessage ) internal @@ -294,7 +294,7 @@ contract SystemConfig_Init_ResourceConfig is SystemConfig_Init { _unsafeBlockSigner: address(0), _config: config, _batchInbox: address(0), - _addresses: SystemConfig.Addresses({ + _addresses: ISystemConfig.Addresses({ l1CrossDomainMessenger: address(0), l1ERC721Bridge: address(0), l1StandardBridge: address(0), @@ -332,7 +332,7 @@ contract SystemConfig_Init_CustomGasToken is SystemConfig_Init { _unsafeBlockSigner: address(1), _config: Constants.DEFAULT_RESOURCE_CONFIG(), _batchInbox: address(0), - _addresses: SystemConfig.Addresses({ + _addresses: ISystemConfig.Addresses({ l1CrossDomainMessenger: address(0), l1ERC721Bridge: address(0), disputeGameFactory: address(0), @@ -467,7 +467,7 @@ contract SystemConfig_Init_CustomGasToken is SystemConfig_Init { uint256(0), // value uint64(200_000), // gasLimit false, // isCreation, - abi.encodeCall(L1Block.setGasPayingToken, (address(token), 18, bytes32("Silly"), bytes32("SIL"))) + abi.encodeCall(IL1Block.setGasPayingToken, (address(token), 18, bytes32("Silly"), bytes32("SIL"))) ) ); @@ -533,7 +533,7 @@ 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(address(systemConfig)); - emit ConfigUpdate(0, SystemConfig.UpdateType.BATCHER, abi.encode(newBatcherHash)); + emit ConfigUpdate(0, ISystemConfig.UpdateType.BATCHER, abi.encode(newBatcherHash)); vm.prank(systemConfig.owner()); systemConfig.setBatcherHash(newBatcherHash); @@ -545,7 +545,7 @@ contract SystemConfig_Setters_Test is SystemConfig_Init { // 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)); + emit ConfigUpdate(0, ISystemConfig.UpdateType.GAS_CONFIG, abi.encode(newOverhead, newScalar)); vm.prank(systemConfig.owner()); systemConfig.setGasConfig(newOverhead, newScalar); @@ -558,7 +558,7 @@ contract SystemConfig_Setters_Test is SystemConfig_Init { ffi.encodeScalarEcotone({ _basefeeScalar: _basefeeScalar, _blobbasefeeScalar: _blobbasefeeScalar }); vm.expectEmit(address(systemConfig)); - emit ConfigUpdate(0, SystemConfig.UpdateType.GAS_CONFIG, abi.encode(systemConfig.overhead(), encoded)); + emit ConfigUpdate(0, ISystemConfig.UpdateType.GAS_CONFIG, abi.encode(systemConfig.overhead(), encoded)); vm.prank(systemConfig.owner()); systemConfig.setGasConfigEcotone({ _basefeeScalar: _basefeeScalar, _blobbasefeeScalar: _blobbasefeeScalar }); @@ -578,7 +578,7 @@ contract SystemConfig_Setters_Test is SystemConfig_Init { newGasLimit = uint64(bound(uint256(newGasLimit), uint256(minimumGasLimit), uint256(maximumGasLimit))); vm.expectEmit(address(systemConfig)); - emit ConfigUpdate(0, SystemConfig.UpdateType.GAS_LIMIT, abi.encode(newGasLimit)); + emit ConfigUpdate(0, ISystemConfig.UpdateType.GAS_LIMIT, abi.encode(newGasLimit)); vm.prank(systemConfig.owner()); systemConfig.setGasLimit(newGasLimit); @@ -588,7 +588,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(address(systemConfig)); - emit ConfigUpdate(0, SystemConfig.UpdateType.UNSAFE_BLOCK_SIGNER, abi.encode(newUnsafeSigner)); + emit ConfigUpdate(0, ISystemConfig.UpdateType.UNSAFE_BLOCK_SIGNER, abi.encode(newUnsafeSigner)); vm.prank(systemConfig.owner()); systemConfig.setUnsafeBlockSigner(newUnsafeSigner); 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..6cd3c8b3145c --- /dev/null +++ b/packages/contracts-bedrock/test/L1/SystemConfigInterop.t.sol @@ -0,0 +1,140 @@ +// SPDX-License-Identifier: MIT +pragma solidity 0.8.15; + +// Testing +import { CommonTest } from "test/setup/CommonTest.sol"; + +// Contracts +import { ERC20 } from "@openzeppelin/contracts/token/ERC20/ERC20.sol"; +import { ConfigType } from "src/L2/L1BlockIsthmus.sol"; + +// Libraries +import { Constants } from "src/libraries/Constants.sol"; +import { StaticConfig } from "src/libraries/StaticConfig.sol"; +import { GasPayingToken } from "src/libraries/GasPayingToken.sol"; + +// Interfaces +import { ISystemConfig } from "src/L1/interfaces/ISystemConfig.sol"; +import { ISystemConfigInterop } from "src/L1/interfaces/ISystemConfigInterop.sol"; +import { IOptimismPortalInterop } from "src/L1/interfaces/IOptimismPortalInterop.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( + IOptimismPortalInterop.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( + IOptimismPortalInterop.setConfig, + (ConfigType.ADD_DEPENDENCY, StaticConfig.encodeAddDependency(_chainId)) + ) + ); + + vm.prank(_systemConfigInterop().dependencyManager()); + _systemConfigInterop().addDependency(_chainId); + } + + /// @dev Tests that adding a dependency as not the dependency manager reverts. + function testFuzz_addDependency_notDependencyManager_reverts(uint256 _chainId) public { + vm.expectRevert("SystemConfig: caller is not the dependency manager"); + _systemConfigInterop().addDependency(_chainId); + } + + /// @dev Tests that a dependency can be removed. + function testFuzz_removeDependency_succeeds(uint256 _chainId) public { + vm.expectCall( + address(optimismPortal), + abi.encodeCall( + IOptimismPortalInterop.setConfig, + (ConfigType.REMOVE_DEPENDENCY, StaticConfig.encodeRemoveDependency(_chainId)) + ) + ); + + vm.prank(_systemConfigInterop().dependencyManager()); + _systemConfigInterop().removeDependency(_chainId); + } + + /// @dev Tests that removing a dependency as not the dependency manager reverts. + function testFuzz_removeDependency_notDependencyManager_reverts(uint256 _chainId) public { + vm.expectRevert("SystemConfig: caller is not the dependency manager"); + _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: ISystemConfig.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 (ISystemConfigInterop) { + return ISystemConfigInterop(address(systemConfig)); + } +} diff --git a/packages/contracts-bedrock/test/L2/CrossL2Inbox.t.sol b/packages/contracts-bedrock/test/L2/CrossL2Inbox.t.sol index 32e8840ab6a3..99704860c00d 100644 --- a/packages/contracts-bedrock/test/L2/CrossL2Inbox.t.sol +++ b/packages/contracts-bedrock/test/L2/CrossL2Inbox.t.sol @@ -9,8 +9,18 @@ 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"; +import { + CrossL2Inbox, + NotEntered, + NoExecutingDeposits, + InvalidTimestamp, + InvalidChainId, + TargetCallFailed, + NotDepositor, + InteropStartAlreadySet +} from "src/L2/CrossL2Inbox.sol"; +import { IL1BlockIsthmus } from "src/L2/interfaces/IL1BlockIsthmus.sol"; +import { ICrossL2Inbox } from "src/L2/interfaces/ICrossL2Inbox.sol"; /// @title CrossL2InboxWithModifiableTransientStorage /// @dev CrossL2Inbox contract with methods to modify the transient storage. @@ -58,9 +68,20 @@ contract CrossL2InboxTest is Test { /// @dev Selector for the `isInDependencySet` method of the L1Block contract. bytes4 constant L1BlockIsInDependencySetSelector = bytes4(keccak256("isInDependencySet(uint256)")); + /// @dev Storage slot that the interop start timestamp is stored at. + /// Equal to bytes32(uint256(keccak256("crossl2inbox.interopstart")) - 1) + bytes32 internal constant INTEROP_START_SLOT = bytes32(uint256(keccak256("crossl2inbox.interopstart")) - 1); + /// @dev CrossL2Inbox contract instance. CrossL2Inbox crossL2Inbox; + // interop start timestamp + uint256 interopStartTime = 420; + + /// @dev The address that represents the system caller responsible for L1 attributes + /// transactions. + address internal constant DEPOSITOR_ACCOUNT = 0xDeaDDEaDDeAdDeAdDEAdDEaddeAddEAdDEAd0001; + /// @dev Sets up the test suite. function setUp() public { // Deploy the L2ToL2CrossDomainMessenger contract @@ -68,6 +89,56 @@ contract CrossL2InboxTest is Test { crossL2Inbox = CrossL2Inbox(Predeploys.CROSS_L2_INBOX); } + modifier setInteropStart() { + // Set interop start + vm.store(address(crossL2Inbox), INTEROP_START_SLOT, bytes32(interopStartTime)); + + // Set timestamp to be after interop start + vm.warp(interopStartTime + 1 hours); + + _; + } + + /// @dev Tests that the setInteropStart function updates the INTEROP_START_SLOT storage slot correctly + function testFuzz_setInteropStart_succeeds(uint256 time) external { + // Jump to time. + vm.warp(time); + + // Impersonate the depositor account. + vm.prank(DEPOSITOR_ACCOUNT); + + // Set interop start. + crossL2Inbox.setInteropStart(); + + // Check that the storage slot was set correctly and the public getter function returns the right value. + assertEq(crossL2Inbox.interopStart(), time); + assertEq(uint256(vm.load(address(crossL2Inbox), INTEROP_START_SLOT)), time); + } + + /// @dev Tests that the setInteropStart function reverts when the caller is not the DEPOSITOR_ACCOUNT. + function test_setInteropStart_notDepositorAccount_reverts() external { + // Expect revert with OnlyDepositorAccount selector + vm.expectRevert(NotDepositor.selector); + + // Call setInteropStart function + crossL2Inbox.setInteropStart(); + } + + /// @dev Tests that the setInteropStart function reverts if called when already set + function test_setInteropStart_interopStartAlreadySet_reverts() external { + // Impersonate the depositor account. + vm.startPrank(DEPOSITOR_ACCOUNT); + + // Call setInteropStart function + crossL2Inbox.setInteropStart(); + + // Expect revert with InteropStartAlreadySet selector if called a second time + vm.expectRevert(InteropStartAlreadySet.selector); + + // Call setInteropStart function again + crossL2Inbox.setInteropStart(); + } + /// @dev Tests that the `executeMessage` function succeeds. function testFuzz_executeMessage_succeeds( ICrossL2Inbox.Identifier memory _id, @@ -77,13 +148,22 @@ contract CrossL2InboxTest is Test { ) external payable + setInteropStart { - // 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 id's timestamp is valid (less than or equal to the current block timestamp and greater than + // interop start time) + _id.timestamp = bound(_id.timestamp, interopStartTime + 1, block.timestamp); // Ensure that the target call is payable if value is sent if (_value > 0) assumePayable(_target); + // Ensure is not a deposit transaction + vm.mockCall({ + callee: Predeploys.L1_BLOCK_ATTRIBUTES, + data: abi.encodeWithSelector(IL1BlockIsthmus.isDeposit.selector), + returnData: abi.encode(false) + }); + // Ensure that the target call does not revert vm.mockCall({ callee: _target, msgValue: _value, data: _message, returnData: abi.encode(true) }); @@ -102,7 +182,7 @@ contract CrossL2InboxTest is Test { // Look for the emit ExecutingMessage event vm.expectEmit(Predeploys.CROSS_L2_INBOX); - emit CrossL2Inbox.ExecutingMessage(abi.encode(_id), _message); + emit CrossL2Inbox.ExecutingMessage(keccak256(_message), _id); // Call the executeMessage function crossL2Inbox.executeMessage{ value: _value }({ _id: _id, _target: _target, _message: _message }); @@ -132,10 +212,19 @@ contract CrossL2InboxTest is Test { ) external payable + setInteropStart { - // 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 the ids' timestamp are valid (less than or equal to the current block timestamp and greater than + // interop start time) + _id1.timestamp = bound(_id1.timestamp, interopStartTime + 1, block.timestamp); + _id2.timestamp = bound(_id2.timestamp, interopStartTime + 1, block.timestamp); + + // Ensure is not a deposit transaction + vm.mockCall({ + callee: Predeploys.L1_BLOCK_ATTRIBUTES, + data: abi.encodeWithSelector(IL1BlockIsthmus.isDeposit.selector), + returnData: abi.encode(false) + }); // Ensure that id1's chain ID is in the dependency set vm.mockCall({ @@ -181,6 +270,32 @@ contract CrossL2InboxTest is Test { assertEq(crossL2Inbox.chainId(), _id2.chainId); } + /// @dev Tests that the `executeMessage` function reverts if the transaction comes from a deposit. + function testFuzz_executeMessage_isDeposit_reverts( + ICrossL2Inbox.Identifier calldata _id, + address _target, + bytes calldata _message, + uint256 _value + ) + external + { + // Ensure it is a deposit transaction + vm.mockCall({ + callee: Predeploys.L1_BLOCK_ATTRIBUTES, + data: abi.encodeWithSelector(IL1BlockIsthmus.isDeposit.selector), + returnData: abi.encode(true) + }); + + // Ensure that the contract has enough balance to send with value + vm.deal(address(this), _value); + + // Expect a revert with the NoExecutingDeposits selector + vm.expectRevert(NoExecutingDeposits.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 an invalid timestamp. function testFuzz_executeMessage_invalidTimestamp_reverts( ICrossL2Inbox.Identifier calldata _id, @@ -189,13 +304,52 @@ contract CrossL2InboxTest is Test { uint256 _value ) external + setInteropStart { // Ensure that the id's timestamp is invalid (greater than the current block timestamp) vm.assume(_id.timestamp > block.timestamp); + // Ensure is not a deposit transaction + vm.mockCall({ + callee: Predeploys.L1_BLOCK_ATTRIBUTES, + data: abi.encodeWithSelector(IL1BlockIsthmus.isDeposit.selector), + 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 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 timestamp earlier + /// than INTEROP_START timestamp + function testFuzz_executeMessage_invalidTimestamp_interopStart_reverts( + ICrossL2Inbox.Identifier memory _id, + address _target, + bytes calldata _message, + uint256 _value + ) + external + setInteropStart + { + // Ensure that the id's timestamp is invalid (less than or equal to interopStartTime) + _id.timestamp = bound(_id.timestamp, 0, crossL2Inbox.interopStart()); + // Ensure that the contract has enough balance to send with value vm.deal(address(this), _value); + // Ensure is not a deposit transaction + vm.mockCall({ + callee: Predeploys.L1_BLOCK_ATTRIBUTES, + data: abi.encodeWithSelector(IL1BlockIsthmus.isDeposit.selector), + returnData: abi.encode(false) + }); + // Expect a revert with the InvalidTimestamp selector vm.expectRevert(InvalidTimestamp.selector); @@ -212,9 +366,18 @@ contract CrossL2InboxTest is Test { uint256 _value ) external + setInteropStart { - // 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 id's timestamp is valid (less than or equal to the current block timestamp and greater than + // interop start time) + _id.timestamp = bound(_id.timestamp, interopStartTime + 1, block.timestamp); + + // Ensure is not a deposit transaction + vm.mockCall({ + callee: Predeploys.L1_BLOCK_ATTRIBUTES, + data: abi.encodeWithSelector(IL1BlockIsthmus.isDeposit.selector), + returnData: abi.encode(false) + }); // Ensure that the chain ID is NOT in the dependency set vm.mockCall({ @@ -241,9 +404,11 @@ contract CrossL2InboxTest is Test { uint256 _value ) external + setInteropStart { - // 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 id's timestamp is valid (less than or equal to the current block timestamp and greater than + // interop start time) + _id.timestamp = bound(_id.timestamp, interopStartTime + 1, block.timestamp); // Ensure that the target call is payable if value is sent if (_value > 0) assumePayable(_target); @@ -251,6 +416,13 @@ contract CrossL2InboxTest is Test { // Ensure that the target call reverts vm.mockCallRevert({ callee: _target, msgValue: _value, data: _message, revertData: abi.encode(false) }); + // Ensure is not a deposit transaction + vm.mockCall({ + callee: Predeploys.L1_BLOCK_ATTRIBUTES, + data: abi.encodeWithSelector(IL1BlockIsthmus.isDeposit.selector), + returnData: abi.encode(false) + }); + // Ensure that the chain ID is in the dependency set vm.mockCall({ callee: Predeploys.L1_BLOCK_ATTRIBUTES, @@ -271,6 +443,97 @@ contract CrossL2InboxTest is Test { crossL2Inbox.executeMessage{ value: _value }({ _id: _id, _target: _target, _message: _message }); } + function testFuzz_validateMessage_succeeds( + ICrossL2Inbox.Identifier memory _id, + bytes32 _messageHash + ) + external + setInteropStart + { + // Ensure that the id's timestamp is valid (less than or equal to the current block timestamp and greater than + // interop start time) + _id.timestamp = bound(_id.timestamp, interopStartTime + 1, block.timestamp); + + // 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) + }); + + // Look for the emit ExecutingMessage event + vm.expectEmit(Predeploys.CROSS_L2_INBOX); + emit CrossL2Inbox.ExecutingMessage(_messageHash, _id); + + // Call the validateMessage function + crossL2Inbox.validateMessage(_id, _messageHash); + } + + /// @dev Tests that the `validateMessage` function reverts when called with an identifier with a timestamp later + /// than current block.timestamp. + function testFuzz_validateMessage_invalidTimestamp_reverts( + ICrossL2Inbox.Identifier calldata _id, + bytes32 _messageHash + ) + external + setInteropStart + { + // Ensure that the id's timestamp is invalid (greater than the current block timestamp) + vm.assume(_id.timestamp > block.timestamp); + + // Expect a revert with the InvalidTimestamp selector + vm.expectRevert(InvalidTimestamp.selector); + + // Call the validateMessage function + crossL2Inbox.validateMessage(_id, _messageHash); + } + + /// @dev Tests that the `validateMessage` function reverts when called with an identifier with a timestamp earlier + /// than INTEROP_START timestamp + function testFuzz_validateMessage_invalidTimestamp_interopStart_reverts( + ICrossL2Inbox.Identifier memory _id, + bytes32 _messageHash + ) + external + setInteropStart + { + // Ensure that the id's timestamp is invalid (less than or equal to interopStartTime) + _id.timestamp = bound(_id.timestamp, 0, crossL2Inbox.interopStart()); + + // Expect a revert with the InvalidTimestamp selector + vm.expectRevert(InvalidTimestamp.selector); + + // Call the validateMessage function + crossL2Inbox.validateMessage(_id, _messageHash); + } + + /// @dev Tests that the `validateMessage` function reverts when called with an identifier with a chain ID not in the + /// dependency set. + function testFuzz_validateMessage_invalidChainId_reverts( + ICrossL2Inbox.Identifier memory _id, + bytes32 _messageHash + ) + external + setInteropStart + { + // Ensure that the timestamp is valid (less than or equal to the current block timestamp and greater than + // interopStartTime) + _id.timestamp = bound(_id.timestamp, interopStartTime + 1, 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) + }); + + // Expect a revert with the InvalidChainId selector + vm.expectRevert(InvalidChainId.selector); + + // Call the validateMessage function + crossL2Inbox.validateMessage(_id, _messageHash); + } + /// @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 diff --git a/packages/contracts-bedrock/test/L2/ETHLiquidity.t.sol b/packages/contracts-bedrock/test/L2/ETHLiquidity.t.sol new file mode 100644 index 000000000000..d9d2d92a8928 --- /dev/null +++ b/packages/contracts-bedrock/test/L2/ETHLiquidity.t.sol @@ -0,0 +1,180 @@ +// SPDX-License-Identifier: MIT +pragma solidity 0.8.15; + +// Testing utilities +import { CommonTest } from "test/setup/CommonTest.sol"; + +// Error imports +import { Unauthorized, NotCustomGasToken } from "src/libraries/errors/CommonErrors.sol"; + +/// @title ETHLiquidity_Test +/// @notice Contract for testing the ETHLiquidity contract. +contract ETHLiquidity_Test is CommonTest { + /// @notice Emitted when an address burns ETH liquidity. + event LiquidityBurned(address indexed caller, uint256 value); + + /// @notice Emitted when an address mints ETH liquidity. + event LiquidityMinted(address indexed caller, uint256 value); + + /// @notice The starting balance of the ETHLiquidity contract. + uint256 public constant STARTING_LIQUIDITY_BALANCE = type(uint248).max; + + /// @notice Test setup. + function setUp() public virtual override { + super.enableInterop(); + super.setUp(); + } + + /// @notice Tests that contract is set up with the correct starting balance. + function test_setup_succeeds() public view { + // Assert + assertEq(address(ethLiquidity).balance, STARTING_LIQUIDITY_BALANCE); + } + + /// @notice Tests that the burn function can always be called by an authorized caller. + /// @param _amount Amount of ETH (in wei) to call the burn function with. + function testFuzz_burn_fromAuthorizedCaller_succeeds(uint256 _amount) public { + // Assume + _amount = bound(_amount, 0, type(uint248).max - 1); + + // Arrange + vm.deal(address(superchainWeth), _amount); + + // Act + vm.expectEmit(address(ethLiquidity)); + emit LiquidityBurned(address(superchainWeth), _amount); + vm.prank(address(superchainWeth)); + ethLiquidity.burn{ value: _amount }(); + + // Assert + assertEq(address(superchainWeth).balance, 0); + assertEq(address(ethLiquidity).balance, STARTING_LIQUIDITY_BALANCE + _amount); + } + + /// @notice Tests that the burn function always reverts when called by an unauthorized caller. + /// @param _amount Amount of ETH (in wei) to call the burn function with. + /// @param _caller Address of the caller to call the burn function with. + function testFuzz_burn_fromUnauthorizedCaller_fails(uint256 _amount, address _caller) public { + // Assume + vm.assume(_caller != address(superchainWeth)); + vm.assume(_caller != address(ethLiquidity)); + _amount = bound(_amount, 0, type(uint248).max - 1); + + // Arrange + vm.deal(_caller, _amount); + + // Act + vm.prank(_caller); + vm.expectRevert(Unauthorized.selector); + ethLiquidity.burn{ value: _amount }(); + + // Assert + assertEq(_caller.balance, _amount); + assertEq(address(ethLiquidity).balance, STARTING_LIQUIDITY_BALANCE); + } + + /// @notice Tests that the burn function reverts when called on a custom gas token chain. + /// @param _amount Amount of ETH (in wei) to call the burn function with. + function testFuzz_burn_fromCustomGasTokenChain_fails(uint256 _amount) public { + // Assume + _amount = bound(_amount, 0, type(uint248).max - 1); + + // Arrange + vm.deal(address(superchainWeth), _amount); + vm.mockCall(address(l1Block), abi.encodeCall(l1Block.isCustomGasToken, ()), abi.encode(true)); + + // Act + vm.prank(address(superchainWeth)); + vm.expectRevert(NotCustomGasToken.selector); + ethLiquidity.burn{ value: _amount }(); + + // Assert + assertEq(address(superchainWeth).balance, _amount); + assertEq(address(ethLiquidity).balance, STARTING_LIQUIDITY_BALANCE); + } + + /// @notice Tests that the mint function fails when the amount requested is greater than the + /// available balance. In practice this should never happen because the starting + /// balance is expected to be uint248 wei, the total ETH supply is far less than that + /// amount, and the only contract that pulls from here is the SuperchainWETH contract + /// which will always burn ETH somewhere before minting it somewhere else. It needs to + /// be a system-wide invariant that this condition is never triggered in the first + /// place but it is the behavior we expect if it does happen. + function test_mint_moreThanAvailableBalance_fails() public { + // Arrange + uint256 amount = STARTING_LIQUIDITY_BALANCE + 1; + + // Act + vm.expectRevert(); + ethLiquidity.mint(amount); + + // Assert + assertEq(address(superchainWeth).balance, 0); + assertEq(address(ethLiquidity).balance, STARTING_LIQUIDITY_BALANCE); + assertEq(superchainWeth.balanceOf(address(ethLiquidity)), 0); + } + + /// @notice Tests that the mint function can always be called by an authorized caller. + /// @param _amount Amount of ETH (in wei) to call the mint function with. + function testFuzz_mint_fromAuthorizedCaller_succeeds(uint256 _amount) public { + // Assume + _amount = bound(_amount, 0, type(uint248).max - 1); + + // Arrange + // Nothing to arrange. + + // Act + vm.expectEmit(address(ethLiquidity)); + emit LiquidityMinted(address(superchainWeth), _amount); + vm.prank(address(superchainWeth)); + ethLiquidity.mint(_amount); + + // Assert + assertEq(address(superchainWeth).balance, _amount); + assertEq(address(ethLiquidity).balance, STARTING_LIQUIDITY_BALANCE - _amount); + assertEq(superchainWeth.balanceOf(address(ethLiquidity)), 0); + } + + /// @notice Tests that the mint function always reverts when called by an unauthorized caller. + /// @param _amount Amount of ETH (in wei) to call the mint function with. + /// @param _caller Address of the caller to call the mint function with. + function testFuzz_mint_fromUnauthorizedCaller_fails(uint256 _amount, address _caller) public { + // Assume + vm.assume(_caller != address(superchainWeth)); + vm.assume(address(_caller).balance == 0); + _amount = bound(_amount, 0, type(uint248).max - 1); + + // Arrange + // Nothing to arrange. + + // Act + vm.prank(_caller); + vm.expectRevert(Unauthorized.selector); + ethLiquidity.mint(_amount); + + // Assert + assertEq(_caller.balance, 0); + assertEq(address(ethLiquidity).balance, STARTING_LIQUIDITY_BALANCE); + assertEq(superchainWeth.balanceOf(address(ethLiquidity)), 0); + } + + /// @notice Tests that the mint function reverts when called on a custom gas token chain. + /// @param _amount Amount of ETH (in wei) to call the mint function with. + function testFuzz_mint_fromCustomGasTokenChain_fails(uint256 _amount) public { + // Assume + _amount = bound(_amount, 0, type(uint248).max - 1); + + // Arrange + vm.mockCall(address(l1Block), abi.encodeCall(l1Block.isCustomGasToken, ()), abi.encode(true)); + + // Act + vm.prank(address(superchainWeth)); + vm.expectRevert(NotCustomGasToken.selector); + ethLiquidity.mint(_amount); + + // Assert + assertEq(address(superchainWeth).balance, 0); + assertEq(address(ethLiquidity).balance, STARTING_LIQUIDITY_BALANCE); + assertEq(superchainWeth.balanceOf(address(ethLiquidity)), 0); + } +} diff --git a/packages/contracts-bedrock/test/L2/GasPriceOracle.t.sol b/packages/contracts-bedrock/test/L2/GasPriceOracle.t.sol index 3b04804fb0e2..f81d96b040f4 100644 --- a/packages/contracts-bedrock/test/L2/GasPriceOracle.t.sol +++ b/packages/contracts-bedrock/test/L2/GasPriceOracle.t.sol @@ -3,7 +3,7 @@ pragma solidity 0.8.15; // Testing utilities import { CommonTest } from "test/setup/CommonTest.sol"; -import { OutputMode } from "scripts/L2Genesis.s.sol"; +import { Fork } from "scripts/libraries/Config.sol"; // Libraries import { Encoding } from "src/libraries/Encoding.sol"; @@ -39,7 +39,7 @@ 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; + l2Fork = Fork.DELTA; super.setUp(); assertEq(gasPriceOracle.isEcotone(), false); @@ -120,7 +120,7 @@ contract GasPriceOracleBedrock_Test is GasPriceOracle_Test { contract GasPriceOracleEcotone_Test is GasPriceOracle_Test { /// @dev Sets up the test suite. function setUp() public virtual override { - l2OutputMode = OutputMode.LOCAL_ECOTONE; // activate ecotone + l2Fork = Fork.ECOTONE; super.setUp(); assertEq(gasPriceOracle.isEcotone(), true); @@ -213,7 +213,7 @@ contract GasPriceOracleEcotone_Test is GasPriceOracle_Test { contract GasPriceOracleFjordActive_Test is GasPriceOracle_Test { /// @dev Sets up the test suite. function setUp() public virtual override { - l2OutputMode = OutputMode.LOCAL_LATEST; // activate fjord + l2Fork = Fork.FJORD; super.setUp(); bytes memory calldataPacked = Encoding.encodeSetL1BlockValuesEcotone( diff --git a/packages/contracts-bedrock/test/L2/L1Block.t.sol b/packages/contracts-bedrock/test/L2/L1Block.t.sol index 16e8ca630845..28924ac95149 100644 --- a/packages/contracts-bedrock/test/L2/L1Block.t.sol +++ b/packages/contracts-bedrock/test/L2/L1Block.t.sol @@ -1,15 +1,13 @@ // SPDX-License-Identifier: MIT pragma solidity 0.8.15; -// Testing utilities +// Testing 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; @@ -256,7 +254,7 @@ contract L1BlockCustomGasToken_Test is L1BlockTest { } function test_setGasPayingToken_isDepositor_reverts() external { - vm.expectRevert(L1Block.NotDepositor.selector); + 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 deleted file mode 100644 index 85ed4c9fbe71..000000000000 --- a/packages/contracts-bedrock/test/L2/L1BlockInterop.t.sol +++ /dev/null @@ -1,234 +0,0 @@ -// SPDX-License-Identifier: MIT -pragma solidity 0.8.15; - -import { Test } from "forge-std/Test.sol"; -import { Encoding } from "src/libraries/Encoding.sol"; -import { L1BlockInterop, DependencySetSizeMismatch, NotDepositor } from "src/L2/L1BlockInterop.sol"; - -contract L1BlockInteropTest is Test { - L1BlockInterop l1Block; - address depositor; - - function setUp() public { - l1Block = new L1BlockInterop(); - depositor = l1Block.DEPOSITOR_ACCOUNT(); - } - - /// @dev Tests that setL1BlockValuesInterop updates the values appropriately. - function testFuzz_setL1BlockValuesInterop_succeeds( - uint32 _baseFeeScalar, - uint32 _blobBaseFeeScalar, - uint64 _sequenceNumber, - uint64 _timestamp, - uint64 _number, - uint256 _baseFee, - uint256 _blobBaseFee, - bytes32 _hash, - bytes32 _batcherHash, - uint256[] calldata _dependencySet - ) - external - { - vm.assume(_dependencySet.length <= type(uint8).max); - vm.assume(uint160(uint256(_batcherHash)) == uint256(_batcherHash)); - - bytes memory functionCallDataPacked = Encoding.encodeSetL1BlockValuesInterop({ - _baseFeeScalar: _baseFeeScalar, - _blobBaseFeeScalar: _blobBaseFeeScalar, - _sequenceNumber: _sequenceNumber, - _timestamp: _timestamp, - _number: _number, - _baseFee: _baseFee, - _blobBaseFee: _blobBaseFee, - _hash: _hash, - _batcherHash: _batcherHash, - _dependencySet: _dependencySet - }); - - vm.prank(depositor); - (bool success,) = address(l1Block).call(functionCallDataPacked); - assertTrue(success, "Function call failed"); - - assertEq(l1Block.baseFeeScalar(), _baseFeeScalar); - assertEq(l1Block.blobBaseFeeScalar(), _blobBaseFeeScalar); - assertEq(l1Block.sequenceNumber(), _sequenceNumber); - assertEq(l1Block.timestamp(), _timestamp); - assertEq(l1Block.number(), _number); - assertEq(l1Block.basefee(), _baseFee); - assertEq(l1Block.blobBaseFee(), _blobBaseFee); - assertEq(l1Block.hash(), _hash); - assertEq(l1Block.batcherHash(), _batcherHash); - assertEq(l1Block.dependencySetSize(), _dependencySet.length); - for (uint256 i = 0; i < _dependencySet.length; i++) { - assertEq(l1Block.dependencySet(i), _dependencySet[i]); - assertTrue(l1Block.isInDependencySet(_dependencySet[i])); - } - - // ensure we didn't accidentally pollute the 128 bits of the sequencenum+scalars slot that - // should be empty - bytes32 scalarsSlot = vm.load(address(l1Block), bytes32(uint256(3))); - bytes32 mask128 = hex"FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00000000000000000000000000000000"; - - assertEq(0, scalarsSlot & mask128); - - // ensure we didn't accidentally pollute the 128 bits of the number & timestamp slot that - // should be empty - bytes32 numberTimestampSlot = vm.load(address(l1Block), bytes32(uint256(0))); - assertEq(0, numberTimestampSlot & mask128); - } - - /// @dev Tests that `setL1BlockValuesInterop` succeeds if sender address is the depositor - function test_setL1BlockValuesInterop_isDepositor_succeeds() external { - bytes memory functionCallDataPacked = Encoding.encodeSetL1BlockValuesInterop({ - _baseFeeScalar: type(uint32).max, - _blobBaseFeeScalar: type(uint32).max, - _sequenceNumber: type(uint64).max, - _timestamp: type(uint64).max, - _number: type(uint64).max, - _baseFee: type(uint256).max, - _blobBaseFee: type(uint256).max, - _hash: bytes32(type(uint256).max), - _batcherHash: bytes32(0), - _dependencySet: new uint256[](0) - }); - - vm.prank(depositor); - (bool success,) = address(l1Block).call(functionCallDataPacked); - assertTrue(success, "function call failed"); - } - - /// @dev Tests that `setL1BlockValuesInterop` reverts if sender address is not the depositor - function test_setL1BlockValuesInterop_isDepositor_reverts() external { - bytes memory functionCallDataPacked = Encoding.encodeSetL1BlockValuesInterop({ - _baseFeeScalar: type(uint32).max, - _blobBaseFeeScalar: type(uint32).max, - _sequenceNumber: type(uint64).max, - _timestamp: type(uint64).max, - _number: type(uint64).max, - _baseFee: type(uint256).max, - _blobBaseFee: type(uint256).max, - _hash: bytes32(type(uint256).max), - _batcherHash: bytes32(0), - _dependencySet: new uint256[](0) - }); - - (bool success, bytes memory data) = address(l1Block).call(functionCallDataPacked); - assertTrue(!success, "function call should have failed"); - // make sure return value is the expected function selector for "NotDepositor()" - assertEq(bytes4(data), NotDepositor.selector); - } - - /// @dev Tests that `setL1BlockValuesInterop` reverts if _dependencySetSize is not the same as - /// the length of _dependencySet. (bad path) - function testFuzz_setL1BlockValuesInterop_dependencySetSizeMatch_reverts( - uint8 _notDependencySetSize, - uint256[] calldata _dependencySet - ) - external - { - vm.assume(_dependencySet.length <= type(uint8).max); - vm.assume(_notDependencySetSize != _dependencySet.length); - - bytes memory functionCallDataPacked = abi.encodePacked( - bytes4(keccak256("setL1BlockValuesInterop()")), - type(uint32).max, - type(uint32).max, - type(uint64).max, - type(uint64).max, - type(uint64).max, - type(uint256).max, - type(uint256).max, - bytes32(type(uint256).max), - bytes32(type(uint256).max), - _notDependencySetSize, - _dependencySet - ); - - vm.prank(depositor); - (bool success, bytes memory data) = address(l1Block).call(functionCallDataPacked); - assertTrue(!success, "function call should have failed"); - // make sure return value is the expected function selector for "DependencySetSizeMismatch()" - assertEq(bytes4(data), DependencySetSizeMismatch.selector); - } - - /// @dev Tests that an arbitrary dependency set can be set and that ìsInDependencySet returns - /// the expected results. - function testFuzz_isInDependencySet_succeeds( - uint32 _baseFeeScalar, - uint32 _blobBaseFeeScalar, - uint64 _sequenceNumber, - uint64 _timestamp, - uint64 _number, - uint256 _baseFee, - uint256 _blobBaseFee, - bytes32 _hash, - bytes32 _batcherHash, - uint256[] calldata _dependencySet - ) - external - { - vm.assume(_dependencySet.length <= type(uint8).max); - vm.assume(uint160(uint256(_batcherHash)) == uint256(_batcherHash)); - - bytes memory functionCallDataPacked = Encoding.encodeSetL1BlockValuesInterop({ - _baseFeeScalar: _baseFeeScalar, - _blobBaseFeeScalar: _blobBaseFeeScalar, - _sequenceNumber: _sequenceNumber, - _timestamp: _timestamp, - _number: _number, - _baseFee: _baseFee, - _blobBaseFee: _blobBaseFee, - _hash: _hash, - _batcherHash: _batcherHash, - _dependencySet: _dependencySet - }); - - vm.prank(depositor); - (bool success,) = address(l1Block).call(functionCallDataPacked); - assertTrue(success, "Function call failed"); - - assertEq(l1Block.dependencySetSize(), _dependencySet.length); - - for (uint256 i = 0; i < _dependencySet.length; i++) { - assertTrue(l1Block.isInDependencySet(_dependencySet[i])); - } - } - - /// @dev Tests that `isInDependencySet` returns true when the current chain ID is passed as the input - function test_isInDependencySet_isChainId_succeeds() external view { - assertTrue(l1Block.isInDependencySet(block.chainid)); - } - - /// @dev Tests that `isInDependencySet` reverts when the input chain ID is not in the dependency set - function testFuzz_isInDependencySet_reverts(uint256 _chainId) external { - vm.assume(_chainId != 1); - - uint256[] memory dependencySet = new uint256[](1); - dependencySet[0] = 1; - - bytes memory functionCallDataPacked = Encoding.encodeSetL1BlockValuesInterop({ - _baseFeeScalar: 0, - _blobBaseFeeScalar: 0, - _sequenceNumber: 0, - _timestamp: 0, - _number: 0, - _baseFee: 0, - _blobBaseFee: 0, - _hash: bytes32(0), - _batcherHash: bytes32(0), - _dependencySet: dependencySet - }); - - vm.prank(depositor); - (bool success,) = address(l1Block).call(functionCallDataPacked); - assertTrue(success, "Function call failed"); - - assertFalse(l1Block.isInDependencySet(_chainId)); - } - - /// @dev Tests that `isInDependencySet` returns false when the dependency set is empty - function testFuzz_isInDependencySet_dependencySetEmpty_succeeds(uint256 _chainId) external view { - assertTrue(l1Block.dependencySetSize() == 0); - assertFalse(l1Block.isInDependencySet(_chainId)); - } -} diff --git a/packages/contracts-bedrock/test/L2/L1BlockIsthmus.t.sol b/packages/contracts-bedrock/test/L2/L1BlockIsthmus.t.sol new file mode 100644 index 000000000000..1c2407dd73ab --- /dev/null +++ b/packages/contracts-bedrock/test/L2/L1BlockIsthmus.t.sol @@ -0,0 +1,312 @@ +// 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 { L1BlockIsthmus, ConfigType } from "src/L2/L1BlockIsthmus.sol"; +import { Predeploys } from "src/libraries/Predeploys.sol"; +import "src/libraries/L1BlockErrors.sol"; + +contract L1BlockIsthmusTest 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(_l1BlockIsthmus().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); + + _l1BlockIsthmus().setConfig(ConfigType.ADD_DEPENDENCY, StaticConfig.encodeAddDependency(_chainId)); + + assertTrue(_l1BlockIsthmus().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(_l1BlockIsthmus().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(_l1BlockIsthmus().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(_l1BlockIsthmus().dependencySetSize(), 0); + + assertFalse(_l1BlockIsthmus().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; + _l1BlockIsthmus().setConfig(ConfigType.ADD_DEPENDENCY, StaticConfig.encodeAddDependency(i)); + uniqueCount++; + } + + assertEq(_l1BlockIsthmus().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(_l1BlockIsthmus().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 }); + + _l1BlockIsthmus().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); + _l1BlockIsthmus().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); + + _l1BlockIsthmus().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); + _l1BlockIsthmus().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); + + _l1BlockIsthmus().setConfig(ConfigType.ADD_DEPENDENCY, StaticConfig.encodeAddDependency(_chainId)); + + vm.expectRevert(AlreadyDependency.selector); + _l1BlockIsthmus().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); + _l1BlockIsthmus().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++) { + _l1BlockIsthmus().setConfig(ConfigType.ADD_DEPENDENCY, StaticConfig.encodeAddDependency(i)); + } + + assertEq(_l1BlockIsthmus().dependencySetSize(), type(uint8).max); + + vm.expectRevert(DependencySetSizeTooLarge.selector); + _l1BlockIsthmus().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 + _l1BlockIsthmus().setConfig(ConfigType.ADD_DEPENDENCY, StaticConfig.encodeAddDependency(_chainId)); + + vm.expectEmit(address(l1Block)); + emit DependencyRemoved(_chainId); + + _l1BlockIsthmus().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); + _l1BlockIsthmus().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); + _l1BlockIsthmus().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); + _l1BlockIsthmus().setConfig(ConfigType.REMOVE_DEPENDENCY, StaticConfig.encodeRemoveDependency(_chainId)); + } + + /// @dev Returns the L1BlockIsthmus instance. + function _l1BlockIsthmus() internal view returns (L1BlockIsthmus) { + return L1BlockIsthmus(address(l1Block)); + } +} + +contract L1BlockIsthmusIsDeposit_Test is L1BlockIsthmusTest { + /// @dev Tests that `isDeposit` reverts if the caller is not the cross L2 inbox. + function test_isDeposit_notCrossL2Inbox_reverts(address _caller) external { + vm.assume(_caller != Predeploys.CROSS_L2_INBOX); + vm.expectRevert(NotCrossL2Inbox.selector); + _l1BlockIsthmus().isDeposit(); + } + + /// @dev Tests that `isDeposit` always returns the correct value. + function test_isDeposit_succeeds() external { + // Assert is false if the value is not updated + vm.prank(Predeploys.CROSS_L2_INBOX); + assertEq(_l1BlockIsthmus().isDeposit(), false); + + /// @dev Assuming that `setL1BlockValuesIsthmus` will set the proper value. That function is tested as well + vm.prank(_l1BlockIsthmus().DEPOSITOR_ACCOUNT()); + _l1BlockIsthmus().setL1BlockValuesIsthmus(); + + // Assert is true if the value is updated + vm.prank(Predeploys.CROSS_L2_INBOX); + assertEq(_l1BlockIsthmus().isDeposit(), true); + } +} + +contract L1BlockIsthmusSetL1BlockValuesIsthmus_Test is L1BlockIsthmusTest { + /// @dev Tests that `setL1BlockValuesIsthmus` reverts if sender address is not the depositor + function test_setL1BlockValuesIsthmus_notDepositor_reverts(address _caller) external { + vm.assume(_caller != _l1BlockIsthmus().DEPOSITOR_ACCOUNT()); + vm.prank(_caller); + vm.expectRevert(NotDepositor.selector); + _l1BlockIsthmus().setL1BlockValuesIsthmus(); + } + + /// @dev Tests that `setL1BlockValuesIsthmus` succeeds if sender address is the depositor + function test_setL1BlockValuesIsthmus_succeeds( + uint32 baseFeeScalar, + uint32 blobBaseFeeScalar, + uint64 sequenceNumber, + uint64 timestamp, + uint64 number, + uint256 baseFee, + uint256 blobBaseFee, + bytes32 hash, + bytes32 batcherHash + ) + external + { + // Ensure the `isDepositTransaction` flag is false before calling `setL1BlockValuesIsthmus` + vm.prank(Predeploys.CROSS_L2_INBOX); + assertEq(_l1BlockIsthmus().isDeposit(), false); + + bytes memory setValuesEcotoneCalldata = abi.encodePacked( + baseFeeScalar, blobBaseFeeScalar, sequenceNumber, timestamp, number, baseFee, blobBaseFee, hash, batcherHash + ); + + vm.prank(_l1BlockIsthmus().DEPOSITOR_ACCOUNT()); + (bool success,) = address(l1Block).call( + abi.encodePacked(L1BlockIsthmus.setL1BlockValuesIsthmus.selector, setValuesEcotoneCalldata) + ); + assertTrue(success, "function call failed"); + + // Assert that the `isDepositTransaction` flag was properly set to true + vm.prank(Predeploys.CROSS_L2_INBOX); + assertEq(_l1BlockIsthmus().isDeposit(), true); + + // Assert `setL1BlockValuesEcotone` was properly called, forwarding the calldata to it + assertEq(_l1BlockIsthmus().baseFeeScalar(), baseFeeScalar, "base fee scalar not properly set"); + assertEq(_l1BlockIsthmus().blobBaseFeeScalar(), blobBaseFeeScalar, "blob base fee scalar not properly set"); + assertEq(_l1BlockIsthmus().sequenceNumber(), sequenceNumber, "sequence number not properly set"); + assertEq(_l1BlockIsthmus().timestamp(), timestamp, "timestamp not properly set"); + assertEq(_l1BlockIsthmus().number(), number, "number not properly set"); + assertEq(_l1BlockIsthmus().basefee(), baseFee, "base fee not properly set"); + assertEq(_l1BlockIsthmus().blobBaseFee(), blobBaseFee, "blob base fee not properly set"); + assertEq(_l1BlockIsthmus().hash(), hash, "hash not properly set"); + assertEq(_l1BlockIsthmus().batcherHash(), batcherHash, "batcher hash not properly set"); + } +} + +contract L1BlockDepositsComplete_Test is L1BlockIsthmusTest { + // @dev Tests that `depositsComplete` reverts if the caller is not the depositor. + function test_deposits_is_depositor_reverts(address _caller) external { + vm.assume(_caller != _l1BlockIsthmus().DEPOSITOR_ACCOUNT()); + vm.expectRevert(NotDepositor.selector); + _l1BlockIsthmus().depositsComplete(); + } + + // @dev Tests that `depositsComplete` succeeds if the caller is the depositor. + function test_depositsComplete_succeeds() external { + // Set the `isDeposit` flag to true + vm.prank(_l1BlockIsthmus().DEPOSITOR_ACCOUNT()); + _l1BlockIsthmus().setL1BlockValuesIsthmus(); + + // Assert that the `isDeposit` flag was properly set to true + vm.prank(Predeploys.CROSS_L2_INBOX); + assertTrue(_l1BlockIsthmus().isDeposit()); + + // Call `depositsComplete` + vm.prank(_l1BlockIsthmus().DEPOSITOR_ACCOUNT()); + _l1BlockIsthmus().depositsComplete(); + + // Assert that the `isDeposit` flag was properly set to false + /// @dev Assuming that `isDeposit()` wil return the proper value. That function is tested as well + vm.prank(Predeploys.CROSS_L2_INBOX); + assertEq(_l1BlockIsthmus().isDeposit(), false); + } +} diff --git a/packages/contracts-bedrock/test/L2/L2CrossDomainMessenger.t.sol b/packages/contracts-bedrock/test/L2/L2CrossDomainMessenger.t.sol index c3805b991261..1c13ece264fc 100644 --- a/packages/contracts-bedrock/test/L2/L2CrossDomainMessenger.t.sol +++ b/packages/contracts-bedrock/test/L2/L2CrossDomainMessenger.t.sol @@ -1,7 +1,7 @@ // SPDX-License-Identifier: MIT pragma solidity 0.8.15; -// Testing utilities +// Testing import { Bridge_Initializer } from "test/setup/Bridge_Initializer.sol"; import { Reverter, ConfigurableCaller } from "test/mocks/Callers.sol"; import { EIP1967Helper } from "test/mocks/EIP1967Helper.sol"; @@ -11,12 +11,11 @@ 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"; + +// Interfaces +import { IL2CrossDomainMessenger } from "src/L2/interfaces/IL2CrossDomainMessenger.sol"; +import { IL2ToL1MessagePasser } from "src/L2/interfaces/IL2ToL1MessagePasser.sol"; contract L2CrossDomainMessenger_Test is Bridge_Initializer { /// @dev Receiver address for testing @@ -24,8 +23,8 @@ contract L2CrossDomainMessenger_Test is Bridge_Initializer { /// @dev Tests that the implementation is initialized correctly. function test_constructor_succeeds() external view { - L2CrossDomainMessenger impl = - L2CrossDomainMessenger(EIP1967Helper.getImplementation(deploy.mustGetAddress("L2CrossDomainMessenger"))); + IL2CrossDomainMessenger impl = + IL2CrossDomainMessenger(EIP1967Helper.getImplementation(deploy.mustGetAddress("L2CrossDomainMessenger"))); assertEq(address(impl.OTHER_MESSENGER()), address(0)); assertEq(address(impl.otherMessenger()), address(0)); assertEq(address(impl.l1CrossDomainMessenger()), address(0)); @@ -51,7 +50,7 @@ contract L2CrossDomainMessenger_Test is Bridge_Initializer { vm.expectCall( address(l2ToL1MessagePasser), abi.encodeWithSelector( - L2ToL1MessagePasser.initiateWithdrawal.selector, + IL2ToL1MessagePasser.initiateWithdrawal.selector, address(l1CrossDomainMessenger), l2CrossDomainMessenger.baseGas(hex"ff", 100), xDomainCallData @@ -239,7 +238,7 @@ contract L2CrossDomainMessenger_Test is Bridge_Initializer { vm.expectCall( address(l2ToL1MessagePasser), abi.encodeWithSelector( - L2ToL1MessagePasser.initiateWithdrawal.selector, + IL2ToL1MessagePasser.initiateWithdrawal.selector, address(l1CrossDomainMessenger), l2CrossDomainMessenger.baseGas(hex"ff", 100), xDomainCallData diff --git a/packages/contracts-bedrock/test/L2/L2ERC721Bridge.t.sol b/packages/contracts-bedrock/test/L2/L2ERC721Bridge.t.sol index b7a3e96bc44b..664655f38a3b 100644 --- a/packages/contracts-bedrock/test/L2/L2ERC721Bridge.t.sol +++ b/packages/contracts-bedrock/test/L2/L2ERC721Bridge.t.sol @@ -1,18 +1,17 @@ // SPDX-License-Identifier: MIT pragma solidity 0.8.15; +// Testing import { console } from "forge-std/console.sol"; - -// Testing utilities import { Bridge_Initializer } from "test/setup/Bridge_Initializer.sol"; -// Target contract dependencies +// Contracts import { ERC721 } from "@openzeppelin/contracts/token/ERC721/ERC721.sol"; -import { L1ERC721Bridge } from "src/L1/L1ERC721Bridge.sol"; import { OptimismMintableERC721 } from "src/universal/OptimismMintableERC721.sol"; -// Target contract -import { L2ERC721Bridge } from "src/L2/L2ERC721Bridge.sol"; +// Interfaces +import { IL1ERC721Bridge } from "src/L1/interfaces/IL1ERC721Bridge.sol"; +import { IL2ERC721Bridge } from "src/L2/interfaces/IL2ERC721Bridge.sol"; contract TestERC721 is ERC721 { constructor() ERC721("Test", "TST") { } @@ -98,7 +97,7 @@ contract L2ERC721Bridge_Test is Bridge_Initializer { ( address(l1ERC721Bridge), abi.encodeCall( - L2ERC721Bridge.finalizeBridgeERC721, + IL2ERC721Bridge.finalizeBridgeERC721, (address(remoteToken), address(localToken), alice, alice, tokenId, hex"5678") ), 1234 @@ -175,7 +174,7 @@ contract L2ERC721Bridge_Test is Bridge_Initializer { ( address(l1ERC721Bridge), abi.encodeCall( - L1ERC721Bridge.finalizeBridgeERC721, + IL1ERC721Bridge.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 e07fc0086bd8..3a173e9743b4 100644 --- a/packages/contracts-bedrock/test/L2/L2StandardBridge.t.sol +++ b/packages/contracts-bedrock/test/L2/L2StandardBridge.t.sol @@ -1,33 +1,33 @@ // SPDX-License-Identifier: MIT pragma solidity 0.8.15; -// Testing utilities +// Testing +import { stdStorage, StdStorage } from "forge-std/Test.sol"; import { EIP1967Helper } from "test/mocks/EIP1967Helper.sol"; - -// Target contract is imported by the `Bridge_Initializer` import { Bridge_Initializer } from "test/setup/Bridge_Initializer.sol"; -import { stdStorage, StdStorage } from "forge-std/Test.sol"; -import { CrossDomainMessenger } from "src/universal/CrossDomainMessenger.sol"; -import { L2ToL1MessagePasser } from "src/L2/L2ToL1MessagePasser.sol"; + +// Contracts import { ERC20 } from "@openzeppelin/contracts/token/ERC20/ERC20.sol"; +import { OptimismMintableERC20 } from "src/universal/OptimismMintableERC20.sol"; // Libraries +import { Predeploys } from "src/libraries/Predeploys.sol"; import { Hashing } from "src/libraries/Hashing.sol"; import { Types } from "src/libraries/Types.sol"; -// Target contract dependencies -import { L2StandardBridge } from "src/L2/L2StandardBridge.sol"; -import { Predeploys } from "src/libraries/Predeploys.sol"; -import { StandardBridge } from "src/universal/StandardBridge.sol"; -import { OptimismMintableERC20 } from "src/universal/OptimismMintableERC20.sol"; +// Interfaces +import { ICrossDomainMessenger } from "src/universal/interfaces/ICrossDomainMessenger.sol"; +import { IStandardBridge } from "src/universal/interfaces/IStandardBridge.sol"; +import { IL2ToL1MessagePasser } from "src/L2/interfaces/IL2ToL1MessagePasser.sol"; +import { IL2StandardBridge } from "src/L2/interfaces/IL2StandardBridge.sol"; 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 view { - L2StandardBridge impl = - L2StandardBridge(payable(EIP1967Helper.getImplementation(deploy.mustGetAddress("L2StandardBridge")))); + IL2StandardBridge impl = + IL2StandardBridge(payable(EIP1967Helper.getImplementation(deploy.mustGetAddress("L2StandardBridge")))); // 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"); @@ -57,10 +57,10 @@ contract L2StandardBridge_Test is Bridge_Initializer { uint256 nonce = l2CrossDomainMessenger.messageNonce(); bytes memory message = - abi.encodeWithSelector(StandardBridge.finalizeBridgeETH.selector, alice, alice, 100, hex""); + abi.encodeWithSelector(IStandardBridge.finalizeBridgeETH.selector, alice, alice, 100, hex""); uint64 baseGas = l2CrossDomainMessenger.baseGas(message, 200_000); bytes memory withdrawalData = abi.encodeWithSelector( - CrossDomainMessenger.relayMessage.selector, + ICrossDomainMessenger.relayMessage.selector, nonce, address(l2StandardBridge), address(l1StandardBridge), @@ -108,7 +108,7 @@ contract L2StandardBridge_Test is Bridge_Initializer { vm.expectCall( address(l2CrossDomainMessenger), abi.encodeWithSelector( - CrossDomainMessenger.sendMessage.selector, + ICrossDomainMessenger.sendMessage.selector, address(l1StandardBridge), message, 200_000 // StandardBridge's RECEIVE_DEFAULT_GAS_LIMIT @@ -118,7 +118,7 @@ contract L2StandardBridge_Test is Bridge_Initializer { vm.expectCall( Predeploys.L2_TO_L1_MESSAGE_PASSER, abi.encodeWithSelector( - L2ToL1MessagePasser.initiateWithdrawal.selector, + IL2ToL1MessagePasser.initiateWithdrawal.selector, address(l1CrossDomainMessenger), baseGas, withdrawalData @@ -278,11 +278,11 @@ contract PreBridgeERC20 is Bridge_Initializer { assertEq(ERC20(_l2Token).balanceOf(alice), 100); uint256 nonce = l2CrossDomainMessenger.messageNonce(); bytes memory message = abi.encodeWithSelector( - StandardBridge.finalizeBridgeERC20.selector, address(L1Token), _l2Token, alice, alice, 100, hex"" + IStandardBridge.finalizeBridgeERC20.selector, address(L1Token), _l2Token, alice, alice, 100, hex"" ); uint64 baseGas = l2CrossDomainMessenger.baseGas(message, 1000); bytes memory withdrawalData = abi.encodeWithSelector( - CrossDomainMessenger.relayMessage.selector, + ICrossDomainMessenger.relayMessage.selector, nonce, address(l2StandardBridge), address(l1StandardBridge), @@ -317,13 +317,13 @@ contract PreBridgeERC20 is Bridge_Initializer { vm.expectCall( address(l2CrossDomainMessenger), - abi.encodeWithSelector(CrossDomainMessenger.sendMessage.selector, address(l1StandardBridge), message, 1000) + abi.encodeWithSelector(ICrossDomainMessenger.sendMessage.selector, address(l1StandardBridge), message, 1000) ); vm.expectCall( Predeploys.L2_TO_L1_MESSAGE_PASSER, abi.encodeWithSelector( - L2ToL1MessagePasser.initiateWithdrawal.selector, + IL2ToL1MessagePasser.initiateWithdrawal.selector, address(l1CrossDomainMessenger), baseGas, withdrawalData @@ -416,11 +416,11 @@ contract PreBridgeERC20To is Bridge_Initializer { assertEq(ERC20(L2Token).balanceOf(alice), 100); uint256 nonce = l2CrossDomainMessenger.messageNonce(); bytes memory message = abi.encodeWithSelector( - StandardBridge.finalizeBridgeERC20.selector, address(L1Token), _l2Token, alice, bob, 100, hex"" + IStandardBridge.finalizeBridgeERC20.selector, address(L1Token), _l2Token, alice, bob, 100, hex"" ); uint64 baseGas = l2CrossDomainMessenger.baseGas(message, 1000); bytes memory withdrawalData = abi.encodeWithSelector( - CrossDomainMessenger.relayMessage.selector, + ICrossDomainMessenger.relayMessage.selector, nonce, address(l2StandardBridge), address(l1StandardBridge), @@ -480,13 +480,13 @@ contract PreBridgeERC20To is Bridge_Initializer { vm.expectCall( address(l2CrossDomainMessenger), - abi.encodeWithSelector(CrossDomainMessenger.sendMessage.selector, address(l1StandardBridge), message, 1000) + abi.encodeWithSelector(ICrossDomainMessenger.sendMessage.selector, address(l1StandardBridge), message, 1000) ); vm.expectCall( Predeploys.L2_TO_L1_MESSAGE_PASSER, abi.encodeWithSelector( - L2ToL1MessagePasser.initiateWithdrawal.selector, + IL2ToL1MessagePasser.initiateWithdrawal.selector, address(l1CrossDomainMessenger), baseGas, withdrawalData @@ -524,7 +524,7 @@ contract L2StandardBridge_Bridge_Test is Bridge_Initializer { function test_finalizeBridgeETH_sendToSelf_reverts() external { vm.mockCall( address(l2StandardBridge.messenger()), - abi.encodeWithSelector(CrossDomainMessenger.xDomainMessageSender.selector), + abi.encodeWithSelector(ICrossDomainMessenger.xDomainMessageSender.selector), abi.encode(address(l2StandardBridge.OTHER_BRIDGE())) ); vm.deal(address(l2CrossDomainMessenger), 100); @@ -537,7 +537,7 @@ contract L2StandardBridge_Bridge_Test is Bridge_Initializer { function test_finalizeBridgeETH_sendToMessenger_reverts() external { vm.mockCall( address(l2StandardBridge.messenger()), - abi.encodeWithSelector(CrossDomainMessenger.xDomainMessageSender.selector), + abi.encodeWithSelector(ICrossDomainMessenger.xDomainMessageSender.selector), abi.encode(address(l2StandardBridge.OTHER_BRIDGE())) ); vm.deal(address(l2CrossDomainMessenger), 100); @@ -551,7 +551,7 @@ contract L2StandardBridge_Bridge_Test is Bridge_Initializer { uint256 nonce = l2CrossDomainMessenger.messageNonce(); bytes memory message = - abi.encodeWithSelector(StandardBridge.finalizeBridgeETH.selector, alice, alice, _value, _extraData); + abi.encodeWithSelector(IStandardBridge.finalizeBridgeETH.selector, alice, alice, _value, _extraData); vm.expectCall( address(l2StandardBridge), @@ -563,7 +563,7 @@ contract L2StandardBridge_Bridge_Test is Bridge_Initializer { address(l2CrossDomainMessenger), _value, abi.encodeWithSelector( - CrossDomainMessenger.sendMessage.selector, address(l1StandardBridge), message, _minGasLimit + ICrossDomainMessenger.sendMessage.selector, address(l1StandardBridge), message, _minGasLimit ) ); @@ -604,14 +604,14 @@ contract L2StandardBridge_Bridge_Test is Bridge_Initializer { ); bytes memory message = - abi.encodeWithSelector(StandardBridge.finalizeBridgeETH.selector, alice, bob, _value, _extraData); + abi.encodeWithSelector(IStandardBridge.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 + ICrossDomainMessenger.sendMessage.selector, address(l1StandardBridge), message, _minGasLimit ) ); @@ -654,7 +654,7 @@ contract L2StandardBridge_FinalizeBridgeETH_Test is Bridge_Initializer { address messenger = address(l2StandardBridge.messenger()); vm.mockCall( messenger, - abi.encodeWithSelector(CrossDomainMessenger.xDomainMessageSender.selector), + abi.encodeWithSelector(ICrossDomainMessenger.xDomainMessageSender.selector), abi.encode(address(l2StandardBridge.OTHER_BRIDGE())) ); vm.deal(messenger, 100); @@ -674,7 +674,7 @@ contract L2StandardBridge_FinalizeBridgeETH_Test is Bridge_Initializer { address messenger = address(l2StandardBridge.messenger()); vm.mockCall( messenger, - abi.encodeWithSelector(CrossDomainMessenger.xDomainMessageSender.selector), + abi.encodeWithSelector(ICrossDomainMessenger.xDomainMessageSender.selector), abi.encode(address(l2StandardBridge.OTHER_BRIDGE())) ); vm.deal(address(l2CrossDomainMessenger), 1); diff --git a/packages/contracts-bedrock/test/L2/L2StandardBridgeInterop.t.sol b/packages/contracts-bedrock/test/L2/L2StandardBridgeInterop.t.sol new file mode 100644 index 000000000000..db8ca94e37c8 --- /dev/null +++ b/packages/contracts-bedrock/test/L2/L2StandardBridgeInterop.t.sol @@ -0,0 +1,369 @@ +// SPDX-License-Identifier: MIT +pragma solidity 0.8.15; + +// Testing +import { Bridge_Initializer } from "test/setup/Bridge_Initializer.sol"; + +// Libraries +// TODO: Replace Predeploys.OPTIMISM_SUPERCHAIN_ERC20_FACTORY with optimismSuperchainERC20Factory +import { Predeploys } from "src/libraries/Predeploys.sol"; + +// Interfaces +import { IL2StandardBridgeInterop, IMintableAndBurnable } from "src/L2/interfaces/IL2StandardBridgeInterop.sol"; +import { IERC20Metadata } from "@openzeppelin/contracts/token/ERC20/extensions/IERC20Metadata.sol"; +import { IERC165 } from "@openzeppelin/contracts/utils/introspection/IERC165.sol"; +import { IOptimismMintableERC20 } from "src/universal/interfaces/IOptimismMintableERC20.sol"; +import { ILegacyMintableERC20 } from "src/universal/OptimismMintableERC20.sol"; +import { IOptimismERC20Factory } from "src/L2/interfaces/IOptimismERC20Factory.sol"; + +contract L2StandardBridgeInterop_Test is Bridge_Initializer { + /// @notice Emitted when a conversion is made. + event Converted(address indexed from, address indexed to, address indexed caller, uint256 amount); + + /// @notice Test setup. + function setUp() public virtual override { + super.enableInterop(); + super.setUp(); + } + + /// @notice Helper function to setup a mock and expect a call to it. + function _mockAndExpect(address _receiver, bytes memory _calldata, bytes memory _returned) internal { + vm.mockCall(_receiver, _calldata, _returned); + vm.expectCall(_receiver, _calldata); + } + + /// @notice Mock ERC20 decimals + function _mockDecimals(address _token, uint8 _decimals) internal { + _mockAndExpect(_token, abi.encodeWithSelector(IERC20Metadata.decimals.selector), abi.encode(_decimals)); + } + + /// @notice Mock ERC165 interface + function _mockInterface(address _token, bytes4 _interfaceId, bool _supported) internal { + _mockAndExpect( + _token, abi.encodeWithSelector(IERC165.supportsInterface.selector, _interfaceId), abi.encode(_supported) + ); + } + + /// @notice Mock factory deployment + function _mockDeployments(address _factory, address _token, address _deployed) internal { + _mockAndExpect( + _factory, abi.encodeWithSelector(IOptimismERC20Factory.deployments.selector, _token), abi.encode(_deployed) + ); + } + + /// @notice Assume a valid address for fuzzing + function _assumeAddress(address _address) internal { + assumeAddressIsNot(_address, AddressType.Precompile, AddressType.ForgeAddress); + } +} + +/// @notice Test suite when converting from a legacy token to a SuperchainERC20 token +contract L2StandardBridgeInterop_LegacyToSuper_Test is L2StandardBridgeInterop_Test { + /// @notice Set up the test for converting from a legacy token to a SuperchainERC20 token + function _setUpLegacyToSuper(address _from, address _to) internal { + // Assume + _assumeAddress(_from); + _assumeAddress(_to); + + // Mock same decimals + _mockDecimals(_from, 18); + _mockDecimals(_to, 18); + + // Mock `_from` to be a legacy address + _mockInterface(_from, type(IERC165).interfaceId, true); + _mockInterface(_from, type(ILegacyMintableERC20).interfaceId, true); + } + + /// @notice Test that the `convert` function with different decimals reverts + function testFuzz_convert_differentDecimals_reverts( + address _from, + uint8 _decimalsFrom, + address _to, + uint8 _decimalsTo, + uint256 _amount + ) + public + { + // Assume + _assumeAddress(_from); + _assumeAddress(_to); + vm.assume(_decimalsFrom != _decimalsTo); + vm.assume(_from != _to); + + // Arrange + // Mock the tokens to have different decimals + _mockDecimals(_from, _decimalsFrom); + _mockDecimals(_to, _decimalsTo); + + // Expect the revert with `InvalidDecimals` selector + vm.expectRevert(IL2StandardBridgeInterop.InvalidDecimals.selector); + + // Act + l2StandardBridge.convert(_from, _to, _amount); + } + + /// @notice Test that the `convert` function with an invalid legacy ERC20 address reverts + function testFuzz_convert_invalidLegacyERC20Address_reverts(address _from, address _to, uint256 _amount) public { + // Arrange + _setUpLegacyToSuper(_from, _to); + + // Mock the legacy factory to return address(0) + _mockDeployments(address(l2OptimismMintableERC20Factory), _from, address(0)); + + // Expect the revert with `InvalidLegacyERC20Address` selector + vm.expectRevert(IL2StandardBridgeInterop.InvalidLegacyERC20Address.selector); + + // Act + l2StandardBridge.convert(_from, _to, _amount); + } + + /// @notice Test that the `convert` function with an invalid superchain ERC20 address reverts + function testFuzz_convert_invalidSuperchainERC20Address_reverts( + address _from, + address _to, + uint256 _amount, + address _remoteToken + ) + public + { + // Assume + vm.assume(_remoteToken != address(0)); + + // Arrange + _setUpLegacyToSuper(_from, _to); + + // Mock the legacy factory to return `_remoteToken` + _mockDeployments(address(l2OptimismMintableERC20Factory), _from, _remoteToken); + + // Mock the superchain factory to return address(0) + _mockDeployments(address(l2OptimismSuperchainERC20Factory), _to, address(0)); + + // Expect the revert with `InvalidSuperchainERC20Address` selector + vm.expectRevert(IL2StandardBridgeInterop.InvalidSuperchainERC20Address.selector); + + // Act + l2StandardBridge.convert(_from, _to, _amount); + } + + /// @notice Test that the `convert` function with different remote tokens reverts + function testFuzz_convert_differentRemoteAddresses_reverts( + address _from, + address _to, + uint256 _amount, + address _fromRemoteToken, + address _toRemoteToken + ) + public + { + // Assume + vm.assume(_fromRemoteToken != address(0)); + vm.assume(_toRemoteToken != address(0)); + vm.assume(_fromRemoteToken != _toRemoteToken); + + // Arrange + _setUpLegacyToSuper(_from, _to); + + // Mock the legacy factory to return `_fromRemoteToken` + _mockDeployments(address(l2OptimismMintableERC20Factory), _from, _fromRemoteToken); + + // Mock the superchain factory to return `_toRemoteToken` + _mockDeployments(address(l2OptimismSuperchainERC20Factory), _to, _toRemoteToken); + + // Expect the revert with `InvalidTokenPair` selector + vm.expectRevert(IL2StandardBridgeInterop.InvalidTokenPair.selector); + + // Act + l2StandardBridge.convert(_from, _to, _amount); + } + + /// @notice Test that the `convert` function succeeds + function testFuzz_convert_succeeds( + address _caller, + address _from, + address _to, + uint256 _amount, + address _remoteToken + ) + public + { + // Assume + vm.assume(_remoteToken != address(0)); + + // Arrange + _setUpLegacyToSuper(_from, _to); + + // Mock the legacy and superchain factory to return `_remoteToken` + _mockDeployments(address(l2OptimismMintableERC20Factory), _from, _remoteToken); + _mockDeployments(address(l2OptimismSuperchainERC20Factory), _to, _remoteToken); + + // Expect the `Converted` event to be emitted + vm.expectEmit(address(l2StandardBridge)); + emit Converted(_from, _to, _caller, _amount); + + // Mock and expect the `burn` and `mint` functions + _mockAndExpect( + _from, abi.encodeWithSelector(IMintableAndBurnable.burn.selector, _caller, _amount), abi.encode() + ); + _mockAndExpect(_to, abi.encodeWithSelector(IMintableAndBurnable.mint.selector, _caller, _amount), abi.encode()); + + // Act + vm.prank(_caller); + l2StandardBridge.convert(_from, _to, _amount); + } +} + +/// @notice Test suite when converting from a SuperchainERC20 token to a legacy token +contract L2StandardBridgeInterop_SuperToLegacy_Test is L2StandardBridgeInterop_Test { + /// @notice Set up the test for converting from a SuperchainERC20 token to a legacy token + function _setUpSuperToLegacy(address _from, address _to) internal { + // Assume + _assumeAddress(_from); + _assumeAddress(_to); + + // Mock same decimals + _mockDecimals(_from, 18); + _mockDecimals(_to, 18); + + // Mock `_from` so it is not a LegacyMintableERC20 address + _mockInterface(_from, type(IERC165).interfaceId, true); + _mockInterface(_from, type(ILegacyMintableERC20).interfaceId, false); + _mockInterface(_from, type(IOptimismMintableERC20).interfaceId, false); + } + + /// @notice Test that the `convert` function with different decimals reverts + function testFuzz_convert_differentDecimals_reverts( + address _from, + uint8 _decimalsFrom, + address _to, + uint8 _decimalsTo, + uint256 _amount + ) + public + { + // Assume + _assumeAddress(_from); + _assumeAddress(_to); + vm.assume(_decimalsFrom != _decimalsTo); + vm.assume(_from != _to); + + // Arrange + // Mock the tokens to have different decimals + _mockDecimals(_from, _decimalsFrom); + _mockDecimals(_to, _decimalsTo); + + // Expect the revert with `InvalidDecimals` selector + vm.expectRevert(IL2StandardBridgeInterop.InvalidDecimals.selector); + + // Act + l2StandardBridge.convert(_from, _to, _amount); + } + + /// @notice Test that the `convert` function with an invalid legacy ERC20 address reverts + function testFuzz_convert_invalidLegacyERC20Address_reverts(address _from, address _to, uint256 _amount) public { + // Arrange + _setUpSuperToLegacy(_from, _to); + + // Mock the legacy factory to return address(0) + _mockDeployments(address(l2OptimismMintableERC20Factory), _to, address(0)); + + // Expect the revert with `InvalidLegacyERC20Address` selector + vm.expectRevert(IL2StandardBridgeInterop.InvalidLegacyERC20Address.selector); + + // Act + l2StandardBridge.convert(_from, _to, _amount); + } + + /// @notice Test that the `convert` function with an invalid superchain ERC20 address reverts + function testFuzz_convert_invalidSuperchainERC20Address_reverts( + address _from, + address _to, + uint256 _amount, + address _remoteToken + ) + public + { + // Assume + vm.assume(_remoteToken != address(0)); + + // Arrange + _setUpSuperToLegacy(_from, _to); + + // Mock the legacy factory to return `_remoteToken` + _mockDeployments(address(l2OptimismMintableERC20Factory), _to, _remoteToken); + + // Mock the superchain factory to return address(0) + _mockDeployments(address(l2OptimismSuperchainERC20Factory), _from, address(0)); + + // Expect the revert with `InvalidSuperchainERC20Address` selector + vm.expectRevert(IL2StandardBridgeInterop.InvalidSuperchainERC20Address.selector); + + // Act + l2StandardBridge.convert(_from, _to, _amount); + } + + /// @notice Test that the `convert` function with different remote tokens reverts + function testFuzz_convert_differentRemoteAddresses_reverts( + address _from, + address _to, + uint256 _amount, + address _fromRemoteToken, + address _toRemoteToken + ) + public + { + // Assume + vm.assume(_fromRemoteToken != address(0)); + vm.assume(_toRemoteToken != address(0)); + vm.assume(_fromRemoteToken != _toRemoteToken); + + // Arrange + _setUpSuperToLegacy(_from, _to); + + // Mock the legacy factory to return `_fromRemoteToken` + _mockDeployments(address(l2OptimismMintableERC20Factory), _to, _fromRemoteToken); + + // Mock the superchain factory to return `_toRemoteToken` + _mockDeployments(address(l2OptimismSuperchainERC20Factory), _from, _toRemoteToken); + + // Expect the revert with `InvalidTokenPair` selector + vm.expectRevert(IL2StandardBridgeInterop.InvalidTokenPair.selector); + + // Act + l2StandardBridge.convert(_from, _to, _amount); + } + + /// @notice Test that the `convert` function succeeds + function testFuzz_convert_succeeds( + address _caller, + address _from, + address _to, + uint256 _amount, + address _remoteToken + ) + public + { + // Assume + vm.assume(_remoteToken != address(0)); + + // Arrange + _setUpSuperToLegacy(_from, _to); + + // Mock the legacy and superchain factory to return `_remoteToken` + _mockDeployments(address(l2OptimismMintableERC20Factory), _to, _remoteToken); + _mockDeployments(address(l2OptimismSuperchainERC20Factory), _from, _remoteToken); + + // Expect the `Converted` event to be emitted + vm.expectEmit(address(l2StandardBridge)); + emit Converted(_from, _to, _caller, _amount); + + // Mock and expect the `burn` and `mint` functions + _mockAndExpect( + _from, abi.encodeWithSelector(IMintableAndBurnable.burn.selector, _caller, _amount), abi.encode() + ); + _mockAndExpect(_to, abi.encodeWithSelector(IMintableAndBurnable.mint.selector, _caller, _amount), abi.encode()); + + // Act + vm.prank(_caller); + l2StandardBridge.convert(_from, _to, _amount); + } +} diff --git a/packages/contracts-bedrock/test/L2/L2ToL2CrossDomainMessenger.t.sol b/packages/contracts-bedrock/test/L2/L2ToL2CrossDomainMessenger.t.sol index 1478d8dabc04..66b0b7e83209 100644 --- a/packages/contracts-bedrock/test/L2/L2ToL2CrossDomainMessenger.t.sol +++ b/packages/contracts-bedrock/test/L2/L2ToL2CrossDomainMessenger.t.sol @@ -75,15 +75,8 @@ contract L2ToL2CrossDomainMessengerTest is Test { 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 - { + /// @dev Tests that `sendMessage` succeeds and emits the correct event. + function testFuzz_sendMessage_succeeds(uint256 _destination, address _target, bytes calldata _message) external { // Ensure the destination is not the same as the source, otherwise the function will revert vm.assume(_destination != block.chainid); @@ -93,24 +86,17 @@ contract L2ToL2CrossDomainMessengerTest is Test { // 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 - }); + l2ToL2CrossDomainMessenger.sendMessage({ _destination: _destination, _target: _target, _message: _message }); - // Check that the SentMessage event was emitted with the correct parameters + // Check that the event was emitted with the correct parameters Vm.Log[] memory logs = vm.getRecordedLogs(); assertEq(logs.length, 1); assertEq( - abi.decode(logs[0].data, (bytes)), + logs[0].data, abi.encodeCall( L2ToL2CrossDomainMessenger.relayMessage, (_destination, block.chainid, messageNonce, address(this), _target, _message) @@ -121,6 +107,36 @@ contract L2ToL2CrossDomainMessengerTest is Test { assertEq(l2ToL2CrossDomainMessenger.messageNonce(), messageNonce + 1); } + /// @dev Tests that the `sendMessage` function reverts when sending a ETH + function testFuzz_sendMessage_nonPayable_reverts( + 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); + + // Ensure that _value is greater than 0 + vm.assume(_value > 0); + + // Add sufficient value to the contract to send the message with + vm.deal(address(this), _value); + + // Call the sendMessage function with value to provoke revert + (bool success,) = address(l2ToL2CrossDomainMessenger).call{ value: _value }( + abi.encodeCall(l2ToL2CrossDomainMessenger.sendMessage, (_destination, _target, _message)) + ); + + // Check that the function reverts + assertFalse(success); + } + /// @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 @@ -178,8 +194,12 @@ contract L2ToL2CrossDomainMessengerTest is Test { ) external { + // Ensure that the target contract is not a Forge contract. + assumeNotForgeAddress(_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); + vm.assume(_target != Predeploys.CROSS_L2_INBOX); + vm.assume(_target != Predeploys.L2_TO_L2_CROSS_DOMAIN_MESSENGER); // Ensure that the target call is payable if value is sent if (_value > 0) assumePayable(_target); diff --git a/packages/contracts-bedrock/test/L2/OptimismSuperchainERC20.t.sol b/packages/contracts-bedrock/test/L2/OptimismSuperchainERC20.t.sol new file mode 100644 index 000000000000..b8de1468421b --- /dev/null +++ b/packages/contracts-bedrock/test/L2/OptimismSuperchainERC20.t.sol @@ -0,0 +1,391 @@ +// SPDX-License-Identifier: MIT +pragma solidity 0.8.25; + +// Testing utilities +import { Test } from "forge-std/Test.sol"; +import { EIP1967Helper } from "test/mocks/EIP1967Helper.sol"; + +// Libraries +import { Predeploys } from "src/libraries/Predeploys.sol"; +import { IERC20 } from "@openzeppelin/contracts-v5/token/ERC20/IERC20.sol"; +import { IL2ToL2CrossDomainMessenger } from "src/L2/interfaces/IL2ToL2CrossDomainMessenger.sol"; +import { ERC1967Proxy } from "@openzeppelin/contracts-v5/proxy/ERC1967/ERC1967Proxy.sol"; +import { Initializable } from "@openzeppelin/contracts-v5/proxy/utils/Initializable.sol"; +import { IERC165 } from "@openzeppelin/contracts-v5/utils/introspection/IERC165.sol"; +import { IBeacon } from "@openzeppelin/contracts-v5/proxy/beacon/IBeacon.sol"; +import { BeaconProxy } from "@openzeppelin/contracts-v5/proxy/beacon/BeaconProxy.sol"; + +// Target contract +import { + OptimismSuperchainERC20, IOptimismSuperchainERC20Extension, OnlyBridge +} from "src/L2/OptimismSuperchainERC20.sol"; + +// SuperchainERC20 Interfaces +import { ISuperchainERC20Extensions, ISuperchainERC20Errors } from "src/L2/interfaces/ISuperchainERC20.sol"; + +/// @title OptimismSuperchainERC20Test +/// @notice Contract for testing the OptimismSuperchainERC20 contract. +contract OptimismSuperchainERC20Test is Test { + address internal constant ZERO_ADDRESS = address(0); + address internal constant REMOTE_TOKEN = address(0x123); + string internal constant NAME = "OptimismSuperchainERC20"; + string internal constant SYMBOL = "SCE"; + uint8 internal constant DECIMALS = 18; + address internal constant BRIDGE = Predeploys.L2_STANDARD_BRIDGE; + address internal constant MESSENGER = Predeploys.L2_TO_L2_CROSS_DOMAIN_MESSENGER; + + OptimismSuperchainERC20 public superchainERC20Impl; + OptimismSuperchainERC20 public superchainERC20; + + /// @notice Sets up the test suite. + function setUp() public { + superchainERC20Impl = new OptimismSuperchainERC20(); + + // Deploy the OptimismSuperchainERC20Beacon contract + _deployBeacon(); + + superchainERC20 = _deploySuperchainERC20Proxy(REMOTE_TOKEN, NAME, SYMBOL, DECIMALS); + } + + /// @notice Deploy the OptimismSuperchainERC20Beacon predeploy contract + function _deployBeacon() internal { + // Deploy the OptimismSuperchainERC20Beacon implementation + address _addr = Predeploys.OPTIMISM_SUPERCHAIN_ERC20_BEACON; + address _impl = Predeploys.predeployToCodeNamespace(_addr); + vm.etch(_impl, vm.getDeployedCode("OptimismSuperchainERC20Beacon.sol:OptimismSuperchainERC20Beacon")); + + // Deploy the ERC1967Proxy contract at the Predeploy + bytes memory code = vm.getDeployedCode("universal/Proxy.sol:Proxy"); + vm.etch(_addr, code); + EIP1967Helper.setAdmin(_addr, Predeploys.PROXY_ADMIN); + EIP1967Helper.setImplementation(_addr, _impl); + + // Mock implementation address + vm.mockCall( + _impl, abi.encodeWithSelector(IBeacon.implementation.selector), abi.encode(address(superchainERC20Impl)) + ); + } + + /// @notice Helper function to deploy a proxy of the OptimismSuperchainERC20 contract. + function _deploySuperchainERC20Proxy( + address _remoteToken, + string memory _name, + string memory _symbol, + uint8 _decimals + ) + internal + returns (OptimismSuperchainERC20) + { + return OptimismSuperchainERC20( + address( + new BeaconProxy( + Predeploys.OPTIMISM_SUPERCHAIN_ERC20_BEACON, + abi.encodeCall(OptimismSuperchainERC20.initialize, (_remoteToken, _name, _symbol, _decimals)) + ) + ) + ); + } + + /// @notice Helper function to setup a mock and expect a call to it. + function _mockAndExpect(address _receiver, bytes memory _calldata, bytes memory _returned) internal { + vm.mockCall(_receiver, _calldata, _returned); + vm.expectCall(_receiver, _calldata); + } + + /// @notice Test that the contract's `initializer` sets the correct values. + function test_initializer_succeeds() public view { + assertEq(superchainERC20.name(), NAME); + assertEq(superchainERC20.symbol(), SYMBOL); + assertEq(superchainERC20.decimals(), DECIMALS); + assertEq(superchainERC20.remoteToken(), REMOTE_TOKEN); + } + + /// @notice Tests the `initialize` function reverts when the contract is already initialized. + function testFuzz_initializer_reverts( + address _remoteToken, + string memory _name, + string memory _symbol, + uint8 _decimals + ) + public + { + // Expect the revert with `InvalidInitialization` selector + vm.expectRevert(Initializable.InvalidInitialization.selector); + + // Call the `initialize` function again + superchainERC20.initialize(_remoteToken, _name, _symbol, _decimals); + } + + /// @notice Tests the `mint` function reverts when the caller is not the bridge. + function testFuzz_mint_callerNotBridge_reverts(address _caller, address _to, uint256 _amount) public { + // Ensure the caller is not the bridge + vm.assume(_caller != BRIDGE); + + // Expect the revert with `OnlyBridge` selector + vm.expectRevert(OnlyBridge.selector); + + // Call the `mint` function with the non-bridge caller + vm.prank(_caller); + superchainERC20.mint(_to, _amount); + } + + /// @notice Tests the `mint` function reverts when the amount is zero. + function testFuzz_mint_zeroAddressTo_reverts(uint256 _amount) public { + // Expect the revert with `ZeroAddress` selector + vm.expectRevert(ISuperchainERC20Errors.ZeroAddress.selector); + + // Call the `mint` function with the zero address + vm.prank(BRIDGE); + superchainERC20.mint({ _to: ZERO_ADDRESS, _amount: _amount }); + } + + /// @notice Tests the `mint` succeeds and emits the `Mint` event. + function testFuzz_mint_succeeds(address _to, uint256 _amount) public { + // Ensure `_to` is not the zero address + vm.assume(_to != ZERO_ADDRESS); + + // Get the total supply and balance of `_to` before the mint to compare later on the assertions + uint256 _totalSupplyBefore = superchainERC20.totalSupply(); + uint256 _toBalanceBefore = superchainERC20.balanceOf(_to); + + // Look for the emit of the `Transfer` event + vm.expectEmit(address(superchainERC20)); + emit IERC20.Transfer(ZERO_ADDRESS, _to, _amount); + + // Look for the emit of the `Mint` event + vm.expectEmit(address(superchainERC20)); + emit IOptimismSuperchainERC20Extension.Mint(_to, _amount); + + // Call the `mint` function with the bridge caller + vm.prank(BRIDGE); + superchainERC20.mint(_to, _amount); + + // Check the total supply and balance of `_to` after the mint were updated correctly + assertEq(superchainERC20.totalSupply(), _totalSupplyBefore + _amount); + assertEq(superchainERC20.balanceOf(_to), _toBalanceBefore + _amount); + } + + /// @notice Tests the `burn` function reverts when the caller is not the bridge. + function testFuzz_burn_callerNotBridge_reverts(address _caller, address _from, uint256 _amount) public { + // Ensure the caller is not the bridge + vm.assume(_caller != BRIDGE); + + // Expect the revert with `OnlyBridge` selector + vm.expectRevert(OnlyBridge.selector); + + // Call the `burn` function with the non-bridge caller + vm.prank(_caller); + superchainERC20.burn(_from, _amount); + } + + /// @notice Tests the `burn` function reverts when the amount is zero. + function testFuzz_burn_zeroAddressFrom_reverts(uint256 _amount) public { + // Expect the revert with `ZeroAddress` selector + vm.expectRevert(ISuperchainERC20Errors.ZeroAddress.selector); + + // Call the `burn` function with the zero address + vm.prank(BRIDGE); + superchainERC20.burn({ _from: ZERO_ADDRESS, _amount: _amount }); + } + + /// @notice Tests the `burn` burns the amount and emits the `Burn` event. + function testFuzz_burn_succeeds(address _from, uint256 _amount) public { + // Ensure `_from` is not the zero address + vm.assume(_from != ZERO_ADDRESS); + + // Mint some tokens to `_from` so then they can be burned + vm.prank(BRIDGE); + superchainERC20.mint(_from, _amount); + + // Get the total supply and balance of `_from` before the burn to compare later on the assertions + uint256 _totalSupplyBefore = superchainERC20.totalSupply(); + uint256 _fromBalanceBefore = superchainERC20.balanceOf(_from); + + // Look for the emit of the `Transfer` event + vm.expectEmit(address(superchainERC20)); + emit IERC20.Transfer(_from, ZERO_ADDRESS, _amount); + + // Look for the emit of the `Burn` event + vm.expectEmit(address(superchainERC20)); + emit IOptimismSuperchainERC20Extension.Burn(_from, _amount); + + // Call the `burn` function with the bridge caller + vm.prank(BRIDGE); + superchainERC20.burn(_from, _amount); + + // Check the total supply and balance of `_from` after the burn were updated correctly + assertEq(superchainERC20.totalSupply(), _totalSupplyBefore - _amount); + assertEq(superchainERC20.balanceOf(_from), _fromBalanceBefore - _amount); + } + + /// @notice Tests the `sendERC20` function reverts when the `_to` address is the zero address. + function testFuzz_sendERC20_zeroAddressTo_reverts(uint256 _amount, uint256 _chainId) public { + // Expect the revert with `ZeroAddress` selector + vm.expectRevert(ISuperchainERC20Errors.ZeroAddress.selector); + + // Call the `sendERC20` function with the zero address + vm.prank(BRIDGE); + superchainERC20.sendERC20({ _to: ZERO_ADDRESS, _amount: _amount, _chainId: _chainId }); + } + + /// @notice Tests the `sendERC20` function burns the sender tokens, sends the message, and emits the `SendERC20` + /// event. + function testFuzz_sendERC20_succeeds(address _sender, address _to, uint256 _amount, uint256 _chainId) external { + // Ensure `_sender` is not the zero address + vm.assume(_sender != ZERO_ADDRESS); + vm.assume(_to != ZERO_ADDRESS); + + // Mint some tokens to the sender so then they can be sent + vm.prank(BRIDGE); + superchainERC20.mint(_sender, _amount); + + // Get the total supply and balance of `_sender` before the send to compare later on the assertions + uint256 _totalSupplyBefore = superchainERC20.totalSupply(); + uint256 _senderBalanceBefore = superchainERC20.balanceOf(_sender); + + // Look for the emit of the `Transfer` event + vm.expectEmit(address(superchainERC20)); + emit IERC20.Transfer(_sender, ZERO_ADDRESS, _amount); + + // Look for the emit of the `SendERC20` event + vm.expectEmit(address(superchainERC20)); + emit ISuperchainERC20Extensions.SendERC20(_sender, _to, _amount, _chainId); + + // Mock the call over the `sendMessage` function and expect it to be called properly + bytes memory _message = abi.encodeCall(superchainERC20.relayERC20, (_sender, _to, _amount)); + _mockAndExpect( + MESSENGER, + abi.encodeWithSelector( + IL2ToL2CrossDomainMessenger.sendMessage.selector, _chainId, address(superchainERC20), _message + ), + abi.encode("") + ); + + // Call the `sendERC20` function + vm.prank(_sender); + superchainERC20.sendERC20(_to, _amount, _chainId); + + // Check the total supply and balance of `_sender` after the send were updated correctly + assertEq(superchainERC20.totalSupply(), _totalSupplyBefore - _amount); + assertEq(superchainERC20.balanceOf(_sender), _senderBalanceBefore - _amount); + } + + /// @notice Tests the `relayERC20` function reverts when the caller is not the L2ToL2CrossDomainMessenger. + function testFuzz_relayERC20_notMessenger_reverts(address _caller, address _to, uint256 _amount) public { + // Ensure the caller is not the messenger + vm.assume(_caller != MESSENGER); + vm.assume(_to != ZERO_ADDRESS); + + // Expect the revert with `CallerNotL2ToL2CrossDomainMessenger` selector + vm.expectRevert(ISuperchainERC20Errors.CallerNotL2ToL2CrossDomainMessenger.selector); + + // Call the `relayERC20` function with the non-messenger caller + vm.prank(_caller); + superchainERC20.relayERC20(_caller, _to, _amount); + } + + /// @notice Tests the `relayERC20` function reverts when the `crossDomainMessageSender` that sent the message is not + /// the same SuperchainERC20 address. + function testFuzz_relayERC20_notCrossDomainSender_reverts( + address _crossDomainMessageSender, + address _to, + uint256 _amount + ) + public + { + vm.assume(_to != ZERO_ADDRESS); + vm.assume(_crossDomainMessageSender != address(superchainERC20)); + + // Mock the call over the `crossDomainMessageSender` function setting a wrong sender + vm.mockCall( + MESSENGER, + abi.encodeWithSelector(IL2ToL2CrossDomainMessenger.crossDomainMessageSender.selector), + abi.encode(_crossDomainMessageSender) + ); + + // Expect the revert with `InvalidCrossDomainSender` selector + vm.expectRevert(ISuperchainERC20Errors.InvalidCrossDomainSender.selector); + + // Call the `relayERC20` function with the sender caller + vm.prank(MESSENGER); + superchainERC20.relayERC20(_crossDomainMessageSender, _to, _amount); + } + + /// @notice Tests the `relayERC20` mints the proper amount and emits the `RelayERC20` event. + function testFuzz_relayERC20_succeeds(address _from, address _to, uint256 _amount, uint256 _source) public { + vm.assume(_from != ZERO_ADDRESS); + vm.assume(_to != ZERO_ADDRESS); + + // Mock the call over the `crossDomainMessageSender` function setting the same address as value + _mockAndExpect( + MESSENGER, + abi.encodeWithSelector(IL2ToL2CrossDomainMessenger.crossDomainMessageSender.selector), + abi.encode(address(superchainERC20)) + ); + + // Mock the call over the `crossDomainMessageSource` function setting the source chain ID as value + _mockAndExpect( + MESSENGER, + abi.encodeWithSelector(IL2ToL2CrossDomainMessenger.crossDomainMessageSource.selector), + abi.encode(_source) + ); + + // Get the total supply and balance of `_to` before the relay to compare later on the assertions + uint256 _totalSupplyBefore = superchainERC20.totalSupply(); + uint256 _toBalanceBefore = superchainERC20.balanceOf(_to); + + // Look for the emit of the `Transfer` event + vm.expectEmit(address(superchainERC20)); + emit IERC20.Transfer(ZERO_ADDRESS, _to, _amount); + + // Look for the emit of the `RelayERC20` event + vm.expectEmit(address(superchainERC20)); + emit ISuperchainERC20Extensions.RelayERC20(_from, _to, _amount, _source); + + // Call the `relayERC20` function with the messenger caller + vm.prank(MESSENGER); + superchainERC20.relayERC20(_from, _to, _amount); + + // Check the total supply and balance of `_to` after the relay were updated correctly + assertEq(superchainERC20.totalSupply(), _totalSupplyBefore + _amount); + assertEq(superchainERC20.balanceOf(_to), _toBalanceBefore + _amount); + } + + /// @notice Tests the `decimals` function always returns the correct value. + function testFuzz_decimals_succeeds(uint8 _decimals) public { + OptimismSuperchainERC20 _newSuperchainERC20 = _deploySuperchainERC20Proxy(REMOTE_TOKEN, NAME, SYMBOL, _decimals); + assertEq(_newSuperchainERC20.decimals(), _decimals); + } + + /// @notice Tests the `REMOTE_TOKEN` function always returns the correct value. + function testFuzz_remoteToken_succeeds(address _remoteToken) public { + OptimismSuperchainERC20 _newSuperchainERC20 = _deploySuperchainERC20Proxy(_remoteToken, NAME, SYMBOL, DECIMALS); + assertEq(_newSuperchainERC20.remoteToken(), _remoteToken); + } + + /// @notice Tests the `name` function always returns the correct value. + function testFuzz_name_succeeds(string memory _name) public { + OptimismSuperchainERC20 _newSuperchainERC20 = _deploySuperchainERC20Proxy(REMOTE_TOKEN, _name, SYMBOL, DECIMALS); + assertEq(_newSuperchainERC20.name(), _name); + } + + /// @notice Tests the `symbol` function always returns the correct value. + function testFuzz_symbol_succeeds(string memory _symbol) public { + OptimismSuperchainERC20 _newSuperchainERC20 = _deploySuperchainERC20Proxy(REMOTE_TOKEN, NAME, _symbol, DECIMALS); + assertEq(_newSuperchainERC20.symbol(), _symbol); + } + + /// @notice Tests that the `supportsInterface` function returns true for the `IOptimismSuperchainERC20` interface. + function test_supportInterface_succeeds() public view { + assertTrue(superchainERC20.supportsInterface(type(IERC165).interfaceId)); + assertTrue(superchainERC20.supportsInterface(type(IOptimismSuperchainERC20Extension).interfaceId)); + } + + /// @notice Tests that the `supportsInterface` function returns false for any other interface than the + /// `IOptimismSuperchainERC20` one. + function testFuzz_supportInterface_returnFalse(bytes4 _interfaceId) public view { + vm.assume(_interfaceId != type(IERC165).interfaceId); + vm.assume(_interfaceId != type(IOptimismSuperchainERC20Extension).interfaceId); + assertFalse(superchainERC20.supportsInterface(_interfaceId)); + } +} diff --git a/packages/contracts-bedrock/test/L2/OptimismSuperchainERC20Factory.t.sol b/packages/contracts-bedrock/test/L2/OptimismSuperchainERC20Factory.t.sol new file mode 100644 index 000000000000..3951ebf7452e --- /dev/null +++ b/packages/contracts-bedrock/test/L2/OptimismSuperchainERC20Factory.t.sol @@ -0,0 +1,111 @@ +// SPDX-License-Identifier: MIT +pragma solidity 0.8.25; + +// Testing utilities +import { Test } from "forge-std/Test.sol"; +import { EIP1967Helper } from "test/mocks/EIP1967Helper.sol"; + +// Libraries +import { Predeploys } from "src/libraries/Predeploys.sol"; +import { CREATE3, Bytes32AddressLib } from "@rari-capital/solmate/src/utils/CREATE3.sol"; +import { IBeacon } from "@openzeppelin/contracts-v5/proxy/beacon/IBeacon.sol"; + +// Target contract +import { OptimismSuperchainERC20Factory, OptimismSuperchainERC20 } from "src/L2/OptimismSuperchainERC20Factory.sol"; + +/// @title OptimismSuperchainERC20FactoryTest +/// @notice Contract for testing the OptimismSuperchainERC20Factory contract. +contract OptimismSuperchainERC20FactoryTest is Test { + using Bytes32AddressLib for bytes32; + + OptimismSuperchainERC20 public superchainERC20Impl; + OptimismSuperchainERC20Factory public superchainERC20Factory; + + /// @notice Sets up the test suite. + function setUp() public { + superchainERC20Impl = new OptimismSuperchainERC20(); + + // Deploy the OptimismSuperchainERC20Beacon contract + _deployBeacon(); + + superchainERC20Factory = new OptimismSuperchainERC20Factory(); + } + + /// @notice Deploy the OptimismSuperchainERC20Beacon predeploy contract + function _deployBeacon() internal { + // Deploy the OptimismSuperchainERC20Beacon implementation + address _addr = Predeploys.OPTIMISM_SUPERCHAIN_ERC20_BEACON; + address _impl = Predeploys.predeployToCodeNamespace(_addr); + vm.etch(_impl, vm.getDeployedCode("OptimismSuperchainERC20Beacon.sol:OptimismSuperchainERC20Beacon")); + + // Deploy the ERC1967Proxy contract at the Predeploy + bytes memory code = vm.getDeployedCode("universal/Proxy.sol:Proxy"); + vm.etch(_addr, code); + EIP1967Helper.setAdmin(_addr, Predeploys.PROXY_ADMIN); + EIP1967Helper.setImplementation(_addr, _impl); + + // Mock implementation address + vm.mockCall( + _impl, abi.encodeWithSelector(IBeacon.implementation.selector), abi.encode(address(superchainERC20Impl)) + ); + } + + /// @notice Test that calling `deploy` with valid parameters succeeds. + function test_deploy_succeeds( + address _caller, + address _remoteToken, + string memory _name, + string memory _symbol, + uint8 _decimals + ) + public + { + // Arrange + bytes32 salt = keccak256(abi.encode(_remoteToken, _name, _symbol, _decimals)); + address deployment = _calculateTokenAddress(salt, address(superchainERC20Factory)); + + vm.expectEmit(address(superchainERC20Factory)); + emit OptimismSuperchainERC20Factory.OptimismSuperchainERC20Created(deployment, _remoteToken, _caller); + + // Act + vm.prank(_caller); + address addr = superchainERC20Factory.deploy(_remoteToken, _name, _symbol, _decimals); + + // Assert + assertTrue(addr == deployment); + assertTrue(OptimismSuperchainERC20(deployment).decimals() == _decimals); + assertTrue(OptimismSuperchainERC20(deployment).remoteToken() == _remoteToken); + assertEq(OptimismSuperchainERC20(deployment).name(), _name); + assertEq(OptimismSuperchainERC20(deployment).symbol(), _symbol); + assertEq(superchainERC20Factory.deployments(deployment), _remoteToken); + } + + /// @notice Test that calling `deploy` with the same parameters twice reverts. + function test_deploy_sameTwice_reverts( + address _caller, + address _remoteToken, + string memory _name, + string memory _symbol, + uint8 _decimals + ) + external + { + // Arrange + vm.prank(_caller); + superchainERC20Factory.deploy(_remoteToken, _name, _symbol, _decimals); + + vm.expectRevert(bytes("DEPLOYMENT_FAILED")); + + // Act + vm.prank(_caller); + superchainERC20Factory.deploy(_remoteToken, _name, _symbol, _decimals); + } + + /// @notice Precalculates the address of the token contract using CREATE3. + function _calculateTokenAddress(bytes32 _salt, address _deployer) internal pure returns (address) { + address proxy = + keccak256(abi.encodePacked(bytes1(0xFF), _deployer, _salt, CREATE3.PROXY_BYTECODE_HASH)).fromLast20Bytes(); + + return keccak256(abi.encodePacked(hex"d694", proxy, hex"01")).fromLast20Bytes(); + } +} diff --git a/packages/contracts-bedrock/test/L2/SequencerFeeVault.t.sol b/packages/contracts-bedrock/test/L2/SequencerFeeVault.t.sol index de759a4fd9fb..1367e00bbc9c 100644 --- a/packages/contracts-bedrock/test/L2/SequencerFeeVault.t.sol +++ b/packages/contracts-bedrock/test/L2/SequencerFeeVault.t.sol @@ -1,21 +1,20 @@ // SPDX-License-Identifier: MIT pragma solidity 0.8.15; -// Testing utilities +// Testing import { CommonTest } from "test/setup/CommonTest.sol"; import { Reverter } from "test/mocks/Callers.sol"; -import { StandardBridge } from "src/universal/StandardBridge.sol"; import { EIP1967Helper } from "test/mocks/EIP1967Helper.sol"; -// Libraries -import { Predeploys } from "src/libraries/Predeploys.sol"; - -// Target contract dependencies +// Contracts import { FeeVault } from "src/universal/FeeVault.sol"; - -// Target contract import { SequencerFeeVault } from "src/L2/SequencerFeeVault.sol"; +// Libraries +import { Hashing } from "src/libraries/Hashing.sol"; +import { Types } from "src/libraries/Types.sol"; +import { Predeploys } from "src/libraries/Predeploys.sol"; + contract SequencerFeeVault_Test is CommonTest { address recipient; @@ -25,14 +24,15 @@ contract SequencerFeeVault_Test is CommonTest { recipient = deploy.cfg().sequencerFeeVaultRecipient(); } - /// @dev Tests that the minimum withdrawal amount is correct. - 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 view { assertEq(sequencerFeeVault.l1FeeWallet(), recipient); + assertEq(sequencerFeeVault.RECIPIENT(), recipient); + assertEq(sequencerFeeVault.recipient(), recipient); + assertEq(sequencerFeeVault.MIN_WITHDRAWAL_AMOUNT(), deploy.cfg().sequencerFeeVaultMinimumWithdrawalAmount()); + assertEq(sequencerFeeVault.minWithdrawalAmount(), deploy.cfg().sequencerFeeVaultMinimumWithdrawalAmount()); + assertEq(uint8(sequencerFeeVault.WITHDRAWAL_NETWORK()), uint8(FeeVault.WithdrawalNetwork.L1)); + assertEq(uint8(sequencerFeeVault.withdrawalNetwork()), uint8(FeeVault.WithdrawalNetwork.L1)); } /// @dev Tests that the fee vault is able to receive ETH. @@ -64,21 +64,31 @@ contract SequencerFeeVault_Test is CommonTest { assertEq(sequencerFeeVault.totalProcessed(), 0); vm.expectEmit(address(Predeploys.SEQUENCER_FEE_WALLET)); - emit Withdrawal(address(sequencerFeeVault).balance, sequencerFeeVault.RECIPIENT(), address(this)); + emit Withdrawal(address(sequencerFeeVault).balance, recipient, address(this)); vm.expectEmit(address(Predeploys.SEQUENCER_FEE_WALLET)); - emit Withdrawal( - address(sequencerFeeVault).balance, - sequencerFeeVault.RECIPIENT(), - address(this), - FeeVault.WithdrawalNetwork.L1 - ); + emit Withdrawal(address(sequencerFeeVault).balance, recipient, address(this), FeeVault.WithdrawalNetwork.L1); // The entire vault's balance is withdrawn - vm.expectCall( - Predeploys.L2_STANDARD_BRIDGE, - address(sequencerFeeVault).balance, - abi.encodeWithSelector( - StandardBridge.bridgeETHTo.selector, sequencerFeeVault.l1FeeWallet(), 35_000, bytes("") + vm.expectCall(Predeploys.L2_TO_L1_MESSAGE_PASSER, address(sequencerFeeVault).balance, hex""); + + // The message is passed to the correct recipient + vm.expectEmit(Predeploys.L2_TO_L1_MESSAGE_PASSER); + emit MessagePassed( + l2ToL1MessagePasser.messageNonce(), + address(sequencerFeeVault), + recipient, + amount, + 400_000, + hex"", + Hashing.hashWithdrawal( + Types.WithdrawalTransaction({ + nonce: l2ToL1MessagePasser.messageNonce(), + sender: address(sequencerFeeVault), + target: recipient, + value: amount, + gasLimit: 400_000, + data: hex"" + }) ) ); diff --git a/packages/contracts-bedrock/test/L2/SuperchainERC20.t.sol b/packages/contracts-bedrock/test/L2/SuperchainERC20.t.sol new file mode 100644 index 000000000000..66b20c1b911a --- /dev/null +++ b/packages/contracts-bedrock/test/L2/SuperchainERC20.t.sol @@ -0,0 +1,223 @@ +// 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 { IERC20 } from "@openzeppelin/contracts-v5/token/ERC20/IERC20.sol"; +import { IL2ToL2CrossDomainMessenger } from "src/L2/interfaces/IL2ToL2CrossDomainMessenger.sol"; + +// Target contract +import { SuperchainERC20 } from "src/L2/SuperchainERC20.sol"; +import { ISuperchainERC20Extensions, ISuperchainERC20Errors } from "src/L2/interfaces/ISuperchainERC20.sol"; + +/// @notice Mock contract for the SuperchainERC20 contract so tests can mint tokens. +contract SuperchainERC20Mock is SuperchainERC20 { + string private _name; + string private _symbol; + uint8 private _decimals; + + constructor(string memory __name, string memory __symbol, uint8 __decimals) { + _name = __name; + _symbol = __symbol; + _decimals = __decimals; + } + + function mint(address _account, uint256 _amount) public { + _mint(_account, _amount); + } + + function name() public view virtual override returns (string memory) { + return _name; + } + + function symbol() public view virtual override returns (string memory) { + return _symbol; + } + + function decimals() public view virtual override returns (uint8) { + return _decimals; + } +} +/// @title SuperchainERC20Test +/// @notice Contract for testing the SuperchainERC20 contract. + +contract SuperchainERC20Test is Test { + address internal constant ZERO_ADDRESS = address(0); + string internal constant NAME = "SuperchainERC20"; + string internal constant SYMBOL = "SCE"; + uint8 internal constant DECIMALS = 18; + address internal constant MESSENGER = Predeploys.L2_TO_L2_CROSS_DOMAIN_MESSENGER; + + SuperchainERC20 public superchainERC20Impl; + SuperchainERC20Mock public superchainERC20; + + /// @notice Sets up the test suite. + function setUp() public { + superchainERC20 = new SuperchainERC20Mock(NAME, SYMBOL, DECIMALS); + } + + /// @notice Helper function to setup a mock and expect a call to it. + function _mockAndExpect(address _receiver, bytes memory _calldata, bytes memory _returned) internal { + vm.mockCall(_receiver, _calldata, _returned); + vm.expectCall(_receiver, _calldata); + } + + /// @notice Test that the contract's `constructor` sets the correct values. + function test_constructor_succeeds() public view { + assertEq(superchainERC20.name(), NAME); + assertEq(superchainERC20.symbol(), SYMBOL); + assertEq(superchainERC20.decimals(), DECIMALS); + } + + /// @notice Tests the `sendERC20` function reverts when the `_to` address is the zero address. + function testFuzz_sendERC20_zeroAddressTo_reverts(uint256 _amount, uint256 _chainId) public { + // Expect the revert with `ZeroAddress` selector + vm.expectRevert(ISuperchainERC20Errors.ZeroAddress.selector); + + // Call the `sendERC20` function with the zero address + superchainERC20.sendERC20({ _to: ZERO_ADDRESS, _amount: _amount, _chainId: _chainId }); + } + + /// @notice Tests the `sendERC20` function burns the sender tokens, sends the message, and emits the `SendERC20` + /// event. + function testFuzz_sendERC20_succeeds(address _sender, address _to, uint256 _amount, uint256 _chainId) external { + // Ensure `_sender` is not the zero address + vm.assume(_sender != ZERO_ADDRESS); + vm.assume(_to != ZERO_ADDRESS); + + // Mint some tokens to the sender so then they can be sent + superchainERC20.mint(_sender, _amount); + + // Get the total supply and balance of `_sender` before the send to compare later on the assertions + uint256 _totalSupplyBefore = superchainERC20.totalSupply(); + uint256 _senderBalanceBefore = superchainERC20.balanceOf(_sender); + + // Look for the emit of the `Transfer` event + vm.expectEmit(address(superchainERC20)); + emit IERC20.Transfer(_sender, ZERO_ADDRESS, _amount); + + // Look for the emit of the `SendERC20` event + vm.expectEmit(address(superchainERC20)); + emit ISuperchainERC20Extensions.SendERC20(_sender, _to, _amount, _chainId); + + // Mock the call over the `sendMessage` function and expect it to be called properly + bytes memory _message = abi.encodeCall(superchainERC20.relayERC20, (_sender, _to, _amount)); + _mockAndExpect( + MESSENGER, + abi.encodeWithSelector( + IL2ToL2CrossDomainMessenger.sendMessage.selector, _chainId, address(superchainERC20), _message + ), + abi.encode("") + ); + + // Call the `sendERC20` function + vm.prank(_sender); + superchainERC20.sendERC20(_to, _amount, _chainId); + + // Check the total supply and balance of `_sender` after the send were updated correctly + assertEq(superchainERC20.totalSupply(), _totalSupplyBefore - _amount); + assertEq(superchainERC20.balanceOf(_sender), _senderBalanceBefore - _amount); + } + + /// @notice Tests the `relayERC20` function reverts when the caller is not the L2ToL2CrossDomainMessenger. + function testFuzz_relayERC20_notMessenger_reverts(address _caller, address _to, uint256 _amount) public { + // Ensure the caller is not the messenger + vm.assume(_caller != MESSENGER); + vm.assume(_to != ZERO_ADDRESS); + + // Expect the revert with `CallerNotL2ToL2CrossDomainMessenger` selector + vm.expectRevert(ISuperchainERC20Errors.CallerNotL2ToL2CrossDomainMessenger.selector); + + // Call the `relayERC20` function with the non-messenger caller + vm.prank(_caller); + superchainERC20.relayERC20(_caller, _to, _amount); + } + + /// @notice Tests the `relayERC20` function reverts when the `crossDomainMessageSender` that sent the message is not + /// the same SuperchainERC20 address. + function testFuzz_relayERC20_notCrossDomainSender_reverts( + address _crossDomainMessageSender, + address _to, + uint256 _amount + ) + public + { + vm.assume(_to != ZERO_ADDRESS); + vm.assume(_crossDomainMessageSender != address(superchainERC20)); + + // Mock the call over the `crossDomainMessageSender` function setting a wrong sender + vm.mockCall( + MESSENGER, + abi.encodeWithSelector(IL2ToL2CrossDomainMessenger.crossDomainMessageSender.selector), + abi.encode(_crossDomainMessageSender) + ); + + // Expect the revert with `InvalidCrossDomainSender` selector + vm.expectRevert(ISuperchainERC20Errors.InvalidCrossDomainSender.selector); + + // Call the `relayERC20` function with the sender caller + vm.prank(MESSENGER); + superchainERC20.relayERC20(_crossDomainMessageSender, _to, _amount); + } + + /// @notice Tests the `relayERC20` mints the proper amount and emits the `RelayERC20` event. + function testFuzz_relayERC20_succeeds(address _from, address _to, uint256 _amount, uint256 _source) public { + vm.assume(_from != ZERO_ADDRESS); + vm.assume(_to != ZERO_ADDRESS); + + // Mock the call over the `crossDomainMessageSender` function setting the same address as value + _mockAndExpect( + MESSENGER, + abi.encodeWithSelector(IL2ToL2CrossDomainMessenger.crossDomainMessageSender.selector), + abi.encode(address(superchainERC20)) + ); + + // Mock the call over the `crossDomainMessageSource` function setting the source chain ID as value + _mockAndExpect( + MESSENGER, + abi.encodeWithSelector(IL2ToL2CrossDomainMessenger.crossDomainMessageSource.selector), + abi.encode(_source) + ); + + // Get the total supply and balance of `_to` before the relay to compare later on the assertions + uint256 _totalSupplyBefore = superchainERC20.totalSupply(); + uint256 _toBalanceBefore = superchainERC20.balanceOf(_to); + + // Look for the emit of the `Transfer` event + vm.expectEmit(address(superchainERC20)); + emit IERC20.Transfer(ZERO_ADDRESS, _to, _amount); + + // Look for the emit of the `RelayERC20` event + vm.expectEmit(address(superchainERC20)); + emit ISuperchainERC20Extensions.RelayERC20(_from, _to, _amount, _source); + + // Call the `relayERC20` function with the messenger caller + vm.prank(MESSENGER); + superchainERC20.relayERC20(_from, _to, _amount); + + // Check the total supply and balance of `_to` after the relay were updated correctly + assertEq(superchainERC20.totalSupply(), _totalSupplyBefore + _amount); + assertEq(superchainERC20.balanceOf(_to), _toBalanceBefore + _amount); + } + + /// @notice Tests the `name` function always returns the correct value. + function testFuzz_name_succeeds(string memory _name) public { + SuperchainERC20 _newSuperchainERC20 = new SuperchainERC20Mock(_name, SYMBOL, DECIMALS); + assertEq(_newSuperchainERC20.name(), _name); + } + + /// @notice Tests the `symbol` function always returns the correct value. + function testFuzz_symbol_succeeds(string memory _symbol) public { + SuperchainERC20 _newSuperchainERC20 = new SuperchainERC20Mock(NAME, _symbol, DECIMALS); + assertEq(_newSuperchainERC20.symbol(), _symbol); + } + + /// @notice Tests the `decimals` function always returns the correct value. + function testFuzz_decimals_succeeds(uint8 _decimals) public { + SuperchainERC20 _newSuperchainERC20 = new SuperchainERC20Mock(NAME, SYMBOL, _decimals); + assertEq(_newSuperchainERC20.decimals(), _decimals); + } +} diff --git a/packages/contracts-bedrock/test/L2/SuperchainWETH.t.sol b/packages/contracts-bedrock/test/L2/SuperchainWETH.t.sol new file mode 100644 index 000000000000..361e982d7324 --- /dev/null +++ b/packages/contracts-bedrock/test/L2/SuperchainWETH.t.sol @@ -0,0 +1,356 @@ +// SPDX-License-Identifier: MIT +pragma solidity 0.8.15; + +// Testing +import { CommonTest } from "test/setup/CommonTest.sol"; + +// Libraries +import { Predeploys } from "src/libraries/Predeploys.sol"; +import { Unauthorized, NotCustomGasToken } from "src/libraries/errors/CommonErrors.sol"; + +// Interfaces +import { IL2ToL2CrossDomainMessenger } from "src/L2/interfaces/IL2ToL2CrossDomainMessenger.sol"; +import { IETHLiquidity } from "src/L2/interfaces/IETHLiquidity.sol"; + +/// @title SuperchainWETH_Test +/// @notice Contract for testing the SuperchainWETH contract. +contract SuperchainWETH_Test is CommonTest { + /// @notice Emitted when a transfer is made. + event Transfer(address indexed src, address indexed dst, uint256 wad); + + /// @notice Emitted when a deposit is made. + event Deposit(address indexed dst, uint256 wad); + + /// @notice Emitted when a withdrawal is made. + event Withdrawal(address indexed src, uint256 wad); + + /// @notice Emitted when an ERC20 is sent. + event SendERC20(address indexed _from, address indexed _to, uint256 _amount, uint256 _chainId); + + /// @notice Emitted when an ERC20 send is relayed. + event RelayERC20(address indexed _from, address indexed _to, uint256 _amount, uint256 _source); + + /// @notice Test setup. + function setUp() public virtual override { + super.enableInterop(); + super.setUp(); + } + + /// @notice Tests that the deposit function can be called on a non-custom gas token chain. + /// @param _amount The amount of WETH to send. + function testFuzz_deposit_fromNonCustomGasTokenChain_succeeds(uint256 _amount) public { + // Assume + _amount = bound(_amount, 0, type(uint248).max - 1); + + // Arrange + vm.deal(alice, _amount); + + // Act + vm.expectEmit(address(superchainWeth)); + emit Deposit(alice, _amount); + vm.prank(alice); + superchainWeth.deposit{ value: _amount }(); + + // Assert + assertEq(alice.balance, 0); + assertEq(superchainWeth.balanceOf(alice), _amount); + } + + /// @notice Tests that the deposit function reverts when called on a custom gas token chain. + /// @param _amount The amount of WETH to send. + function testFuzz_deposit_fromCustomGasTokenChain_fails(uint256 _amount) public { + // Assume + _amount = bound(_amount, 0, type(uint248).max - 1); + + // Arrange + vm.deal(address(alice), _amount); + vm.mockCall(address(l1Block), abi.encodeCall(l1Block.isCustomGasToken, ()), abi.encode(true)); + + // Act + vm.prank(alice); + vm.expectRevert(NotCustomGasToken.selector); + superchainWeth.deposit{ value: _amount }(); + + // Assert + assertEq(alice.balance, _amount); + assertEq(superchainWeth.balanceOf(alice), 0); + } + + /// @notice Tests that the withdraw function can be called on a non-custom gas token chain. + /// @param _amount The amount of WETH to send. + function testFuzz_withdraw_fromNonCustomGasTokenChain_succeeds(uint256 _amount) public { + // Assume + _amount = bound(_amount, 0, type(uint248).max - 1); + + // Arrange + vm.deal(alice, _amount); + vm.prank(alice); + superchainWeth.deposit{ value: _amount }(); + + // Act + vm.expectEmit(address(superchainWeth)); + emit Withdrawal(alice, _amount); + vm.prank(alice); + superchainWeth.withdraw(_amount); + + // Assert + assertEq(alice.balance, _amount); + assertEq(superchainWeth.balanceOf(alice), 0); + } + + /// @notice Tests that the withdraw function reverts when called on a custom gas token chain. + /// @param _amount The amount of WETH to send. + function testFuzz_withdraw_fromCustomGasTokenChain_fails(uint256 _amount) public { + // Assume + _amount = bound(_amount, 0, type(uint248).max - 1); + + // Arrange + vm.deal(alice, _amount); + vm.prank(alice); + superchainWeth.deposit{ value: _amount }(); + vm.mockCall(address(l1Block), abi.encodeCall(l1Block.isCustomGasToken, ()), abi.encode(true)); + + // Act + vm.prank(alice); + vm.expectRevert(NotCustomGasToken.selector); + superchainWeth.withdraw(_amount); + + // Assert + assertEq(alice.balance, 0); + assertEq(superchainWeth.balanceOf(alice), _amount); + } + + /// @notice Tests that the sendERC20 function always succeeds when called with a sufficient + /// balance no matter the sender, amount, recipient, or chain ID. + /// @param _amount The amount of WETH to send. + /// @param _caller The address of the caller. + /// @param _recipient The address of the recipient. + /// @param _chainId The chain ID to send the WETH to. + function testFuzz_sendERC20_sufficientBalance_succeeds( + uint256 _amount, + address _caller, + address _recipient, + uint256 _chainId + ) + public + { + // Assume + vm.assume(_chainId != block.chainid); + vm.assume(_caller != address(ethLiquidity)); + vm.assume(_caller != address(superchainWeth)); + _amount = bound(_amount, 0, type(uint248).max - 1); + + // Arrange + vm.deal(_caller, _amount); + vm.prank(_caller); + superchainWeth.deposit{ value: _amount }(); + + // Act + vm.expectEmit(address(superchainWeth)); + emit Transfer(_caller, address(0), _amount); + vm.expectEmit(address(superchainWeth)); + emit SendERC20(_caller, _recipient, _amount, _chainId); + vm.expectCall(Predeploys.ETH_LIQUIDITY, abi.encodeCall(IETHLiquidity.burn, ()), 1); + vm.expectCall( + Predeploys.L2_TO_L2_CROSS_DOMAIN_MESSENGER, + abi.encodeCall( + IL2ToL2CrossDomainMessenger.sendMessage, + ( + _chainId, + address(superchainWeth), + abi.encodeCall(superchainWeth.relayERC20, (_caller, _recipient, _amount)) + ) + ), + 1 + ); + vm.prank(_caller); + superchainWeth.sendERC20(_recipient, _amount, _chainId); + + // Assert + assertEq(_caller.balance, 0); + assertEq(superchainWeth.balanceOf(_caller), 0); + } + + /// @notice Tests that the sendERC20 function can be called with a sufficient balance on a + /// custom gas token chain. Also tests that the proper calls are made and the proper + /// events are emitted but ETH is not burned via the ETHLiquidity contract. + /// @param _amount The amount of WETH to send. + /// @param _chainId The chain ID to send the WETH to. + function testFuzz_sendERC20_sufficientFromCustomGasTokenChain_succeeds(uint256 _amount, uint256 _chainId) public { + // Assume + vm.assume(_chainId != block.chainid); + _amount = bound(_amount, 0, type(uint248).max - 1); + + // Arrange + vm.deal(alice, _amount); + vm.prank(alice); + superchainWeth.deposit{ value: _amount }(); + vm.mockCall(address(l1Block), abi.encodeCall(l1Block.isCustomGasToken, ()), abi.encode(true)); + + // Act + vm.expectEmit(address(superchainWeth)); + emit Transfer(alice, address(0), _amount); + vm.expectEmit(address(superchainWeth)); + emit SendERC20(alice, bob, _amount, _chainId); + vm.expectCall(Predeploys.ETH_LIQUIDITY, abi.encodeCall(IETHLiquidity.burn, ()), 0); + vm.expectCall( + Predeploys.L2_TO_L2_CROSS_DOMAIN_MESSENGER, + abi.encodeCall( + IL2ToL2CrossDomainMessenger.sendMessage, + (_chainId, address(superchainWeth), abi.encodeCall(superchainWeth.relayERC20, (alice, bob, _amount))) + ), + 1 + ); + vm.prank(alice); + superchainWeth.sendERC20(bob, _amount, _chainId); + + // Assert + assertEq(alice.balance, 0); + assertEq(superchainWeth.balanceOf(alice), 0); + } + + /// @notice Tests that the sendERC20 function reverts when called with insufficient balance. + /// @param _amount The amount of WETH to send. + /// @param _chainId The chain ID to send the WETH to. + function testFuzz_sendERC20_insufficientBalance_fails(uint256 _amount, uint256 _chainId) public { + // Assume + vm.assume(_chainId != block.chainid); + _amount = bound(_amount, 0, type(uint248).max - 1); + + // Arrange + vm.deal(alice, _amount); + vm.prank(alice); + superchainWeth.deposit{ value: _amount }(); + + // Act + vm.expectRevert(); + superchainWeth.sendERC20(bob, _amount + 1, _chainId); + + // Assert + assertEq(alice.balance, 0); + assertEq(superchainWeth.balanceOf(alice), _amount); + } + + /// @notice Tests that the relayERC20 function can be called from the + /// L2ToL2CrossDomainMessenger as long as the crossDomainMessageSender is the + /// SuperchainWETH contract. + /// @param _amount The amount of WETH to send. + function testFuzz_relayERC20_fromMessenger_succeeds(address _sender, uint256 _amount, uint256 _chainId) public { + // Assume + vm.assume(_chainId != block.chainid); + vm.assume(_sender != address(ethLiquidity)); + vm.assume(_sender != address(superchainWeth)); + _amount = bound(_amount, 0, type(uint248).max - 1); + + // Arrange + vm.mockCall( + Predeploys.L2_TO_L2_CROSS_DOMAIN_MESSENGER, + abi.encodeCall(IL2ToL2CrossDomainMessenger.crossDomainMessageSender, ()), + abi.encode(address(superchainWeth)) + ); + vm.mockCall( + Predeploys.L2_TO_L2_CROSS_DOMAIN_MESSENGER, + abi.encodeCall(IL2ToL2CrossDomainMessenger.crossDomainMessageSource, ()), + abi.encode(_chainId) + ); + + // Act + vm.expectEmit(address(superchainWeth)); + emit RelayERC20(_sender, bob, _amount, _chainId); + vm.expectCall(Predeploys.ETH_LIQUIDITY, abi.encodeCall(IETHLiquidity.mint, (_amount)), 1); + vm.prank(Predeploys.L2_TO_L2_CROSS_DOMAIN_MESSENGER); + superchainWeth.relayERC20(_sender, bob, _amount); + + // Assert + assertEq(address(superchainWeth).balance, _amount); + assertEq(superchainWeth.balanceOf(bob), _amount); + } + + /// @notice Tests that the relayERC20 function can be called from the + /// L2ToL2CrossDomainMessenger as long as the crossDomainMessageSender is the + /// SuperchainWETH contract, even when the chain is a custom gas token chain. Shows + /// that ETH is not minted in this case but the SuperchainWETH balance is updated. + /// @param _amount The amount of WETH to send. + function testFuzz_relayERC20_fromMessengerCustomGasTokenChain_succeeds( + address _sender, + uint256 _amount, + uint256 _chainId + ) + public + { + // Assume + vm.assume(_chainId != block.chainid); + vm.assume(_sender != address(ethLiquidity)); + vm.assume(_sender != address(superchainWeth)); + _amount = bound(_amount, 0, type(uint248).max - 1); + + // Arrange + vm.mockCall( + Predeploys.L2_TO_L2_CROSS_DOMAIN_MESSENGER, + abi.encodeCall(IL2ToL2CrossDomainMessenger.crossDomainMessageSender, ()), + abi.encode(address(superchainWeth)) + ); + vm.mockCall( + Predeploys.L2_TO_L2_CROSS_DOMAIN_MESSENGER, + abi.encodeCall(IL2ToL2CrossDomainMessenger.crossDomainMessageSource, ()), + abi.encode(_chainId) + ); + vm.mockCall(address(l1Block), abi.encodeCall(l1Block.isCustomGasToken, ()), abi.encode(true)); + + // Act + vm.expectEmit(address(superchainWeth)); + emit RelayERC20(_sender, bob, _amount, _chainId); + vm.expectCall(Predeploys.ETH_LIQUIDITY, abi.encodeCall(IETHLiquidity.mint, (_amount)), 0); + vm.prank(Predeploys.L2_TO_L2_CROSS_DOMAIN_MESSENGER); + superchainWeth.relayERC20(_sender, bob, _amount); + + // Assert + assertEq(address(superchainWeth).balance, 0); + assertEq(superchainWeth.balanceOf(bob), _amount); + } + + /// @notice Tests that the relayERC20 function reverts when not called from the + /// L2ToL2CrossDomainMessenger. + /// @param _amount The amount of WETH to send. + function testFuzz_relayERC20_notFromMessenger_fails(address _sender, uint256 _amount) public { + // Assume + _amount = bound(_amount, 0, type(uint248).max - 1); + + // Arrange + // Nothing to arrange. + + // Act + vm.expectRevert(Unauthorized.selector); + vm.prank(alice); + superchainWeth.relayERC20(_sender, bob, _amount); + + // Assert + assertEq(address(superchainWeth).balance, 0); + assertEq(superchainWeth.balanceOf(bob), 0); + } + + /// @notice Tests that the relayERC20 function reverts when called from the + /// L2ToL2CrossDomainMessenger but the crossDomainMessageSender is not the + /// SuperchainWETH contract. + /// @param _amount The amount of WETH to send. + function testFuzz_relayERC20_fromMessengerNotFromSuperchainWETH_fails(address _sender, uint256 _amount) public { + // Assume + _amount = bound(_amount, 0, type(uint248).max - 1); + + // Arrange + vm.mockCall( + Predeploys.L2_TO_L2_CROSS_DOMAIN_MESSENGER, + abi.encodeCall(IL2ToL2CrossDomainMessenger.crossDomainMessageSender, ()), + abi.encode(address(alice)) + ); + + // Act + vm.expectRevert(Unauthorized.selector); + vm.prank(Predeploys.L2_TO_L2_CROSS_DOMAIN_MESSENGER); + superchainWeth.relayERC20(_sender, bob, _amount); + + // Assert + assertEq(address(superchainWeth).balance, 0); + assertEq(superchainWeth.balanceOf(bob), 0); + } +} diff --git a/packages/contracts-bedrock/test/L2Genesis.t.sol b/packages/contracts-bedrock/test/L2Genesis.t.sol index 551e01088947..ee993fe1110c 100644 --- a/packages/contracts-bedrock/test/L2Genesis.t.sol +++ b/packages/contracts-bedrock/test/L2Genesis.t.sol @@ -2,9 +2,10 @@ pragma solidity 0.8.15; import { Test } from "forge-std/Test.sol"; -import { L2Genesis, OutputMode, L1Dependencies } from "scripts/L2Genesis.s.sol"; +import { L2Genesis, L1Dependencies } from "scripts/L2Genesis.s.sol"; import { Predeploys } from "src/libraries/Predeploys.sol"; import { Constants } from "src/libraries/Constants.sol"; +import { Process } from "scripts/libraries/Process.sol"; /// @title L2GenesisTest /// @notice Test suite for L2Genesis script. @@ -25,7 +26,7 @@ contract L2GenesisTest is Test { commands[0] = "bash"; commands[1] = "-c"; commands[2] = "mktemp"; - bytes memory result = vm.ffi(commands); + bytes memory result = Process.run(commands); return string(result); } @@ -36,7 +37,7 @@ contract L2GenesisTest is Test { commands[0] = "bash"; commands[1] = "-c"; commands[2] = string.concat("rm ", path); - vm.ffi(commands); + Process.run({ _command: commands, _allowEmpty: true }); } /// @notice Returns the number of top level keys in a JSON object at a given @@ -46,7 +47,7 @@ contract L2GenesisTest is Test { 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)); + return abi.decode(Process.run(commands), (uint256)); } /// @notice Helper function to run a function with a temporary dump file. @@ -63,7 +64,7 @@ contract L2GenesisTest is Test { commands[1] = "-c"; commands[2] = string.concat("jq -r '.[\"", vm.toLowercase(vm.toString(_addr)), "\"].storage | length' < ", _path); - return vm.parseUint(string(vm.ffi(commands))); + return vm.parseUint(string(Process.run(commands))); } /// @notice Returns the number of accounts that contain particular code at a given path to a genesis file. @@ -79,7 +80,7 @@ contract L2GenesisTest is Test { path, " | xargs cast abi-encode 'f(uint256)'" ); - return abi.decode(vm.ffi(commands), (uint256)); + return abi.decode(Process.run(commands), (uint256)); } /// @notice Returns the number of accounts that have a particular slot set. @@ -94,7 +95,7 @@ contract L2GenesisTest is Test { path, " | xargs cast abi-encode 'f(uint256)'" ); - return abi.decode(vm.ffi(commands), (uint256)); + return abi.decode(Process.run(commands), (uint256)); } /// @notice Returns the number of accounts that have a particular slot set to a particular value. @@ -118,7 +119,7 @@ contract L2GenesisTest is Test { path, " | xargs cast abi-encode 'f(uint256)'" ); - return abi.decode(vm.ffi(commands), (uint256)); + return abi.decode(Process.run(commands), (uint256)); } /// @notice Tests the genesis predeploys setup using a temp file for the case where useInterop is false. @@ -149,8 +150,8 @@ contract L2GenesisTest is Test { // 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); + // 23 proxies have the implementation set if useInterop is true and 17 if useInterop is false + assertEq(getPredeployCountWithSlotSet(_path, Constants.PROXY_IMPLEMENTATION_ADDRESS), _useInterop ? 23 : 17); // All proxies except 2 have the proxy 1967 admin slot set to the proxy admin assertEq( @@ -180,14 +181,14 @@ contract L2GenesisTest is Test { /// @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.runWithLatestLocal(_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 += 21; // predeploy implementations (excl. legacy erc20-style eth and legacy message sender) expected += 256; // precompiles - expected += 12; // preinstalls + expected += 13; // preinstalls expected += 1; // 4788 deployer account // 16 prefunded dev accounts are excluded assertEq(expected, getJSONKeyCount(_path), "key count check"); diff --git a/packages/contracts-bedrock/test/Predeploys.t.sol b/packages/contracts-bedrock/test/Predeploys.t.sol index edcae4cdd01f..9cd1b78caf1a 100644 --- a/packages/contracts-bedrock/test/Predeploys.t.sol +++ b/packages/contracts-bedrock/test/Predeploys.t.sol @@ -2,32 +2,26 @@ pragma solidity 0.8.15; import { CommonTest } from "test/setup/CommonTest.sol"; -import { ForgeArtifacts } from "scripts/ForgeArtifacts.sol"; +import { ForgeArtifacts } from "scripts/libraries/ForgeArtifacts.sol"; import { EIP1967Helper } from "test/mocks/EIP1967Helper.sol"; import { Predeploys } from "src/libraries/Predeploys.sol"; /// @title PredeploysTest -contract PredeploysTest is CommonTest { +contract PredeploysBaseTest is CommonTest { ////////////////////////////////////////////////////// /// Internal helpers ////////////////////////////////////////////////////// - /// @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.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 - || _addr == Predeploys.SOUL_GAS_TOKEN; + /// @dev Returns true if the address is an interop predeploy. + function _isInterop(address _addr) internal pure returns (bool) { + return _addr == Predeploys.CROSS_L2_INBOX || _addr == Predeploys.L2_TO_L2_CROSS_DOMAIN_MESSENGER + || _addr == Predeploys.SUPERCHAIN_WETH || _addr == Predeploys.ETH_LIQUIDITY + || _addr == Predeploys.OPTIMISM_SUPERCHAIN_ERC20_FACTORY || _addr == Predeploys.OPTIMISM_SUPERCHAIN_ERC20_BEACON; } - /// @dev Returns true if the address is not proxied. - function _notProxied(address _addr) internal pure returns (bool) { - return _addr == Predeploys.GOVERNANCE_TOKEN || _addr == Predeploys.WETH; + /// @dev Returns true if the address is a predeploy that has a different code in the interop mode. + function _interopCodeDiffer(address _addr) internal pure returns (bool) { + return _addr == Predeploys.L1_BLOCK_ATTRIBUTES || _addr == Predeploys.L2_STANDARD_BRIDGE; } /// @dev Returns true if the account is not meant to be in the L2 genesis anymore. @@ -35,22 +29,18 @@ contract PredeploysTest is CommonTest { return _addr == Predeploys.L1_MESSAGE_SENDER; } + /// @dev Returns true if the predeploy is initializable. 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 || _addr == Predeploys.SOUL_GAS_TOKEN - ); + return _addr == Predeploys.L2_CROSS_DOMAIN_MESSENGER || _addr == Predeploys.L2_STANDARD_BRIDGE + || _addr == Predeploys.L2_ERC721_BRIDGE || _addr == Predeploys.OPTIMISM_MINTABLE_ERC20_FACTORY + || _addr == Predeploys.SOUL_GAS_TOKEN; } + /// @dev Returns true if the predeploy uses immutables. 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; + || _addr == Predeploys.GOVERNANCE_TOKEN || _addr == Predeploys.OPTIMISM_SUPERCHAIN_ERC20_BEACON; } function test_predeployToCodeNamespace() external pure { @@ -68,9 +58,7 @@ contract PredeploysTest is CommonTest { ); } - /// @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 { + function _test_predeploys(bool _useInterop) internal { uint256 count = 2048; uint160 prefix = uint160(0x420) << 148; @@ -78,23 +66,25 @@ contract PredeploysTest is CommonTest { for (uint256 i = 0; i < count; i++) { address addr = address(prefix | uint160(i)); - bytes memory code = addr.code; - assertTrue(code.length > 0); - address implAddr = Predeploys.predeployToCodeNamespace(addr); if (_isOmitted(addr)) { assertEq(implAddr.code.length, 0, "must have no code"); continue; } - bool isPredeploy = _isPredeploy(addr); + + bool isPredeploy = Predeploys.isSupportedPredeploy(addr, _useInterop); + + bytes memory code = addr.code; + if (isPredeploy) assertTrue(code.length > 0); + + bool proxied = Predeploys.notProxied(addr) == false; 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"); + if (proxied) 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"); @@ -119,7 +109,7 @@ contract PredeploysTest is CommonTest { string.concat("Implementation mismatch for ", vm.toString(addr)) ); assertNotEq(implAddr.code.length, 0, "predeploy implementation account must have code"); - if (!_usesImmutables(addr)) { + if (!_usesImmutables(addr) && !_interopCodeDiffer(addr)) { // can't check bytecode if it's modified with immutables in genesis. assertEq(implAddr.code, supposedCode, "proxy implementation contract should match contract source"); } @@ -130,3 +120,25 @@ contract PredeploysTest is CommonTest { } } } + +contract PredeploysTest is PredeploysBaseTest { + /// @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 { + _test_predeploys(false); + } +} + +contract PredeploysInteropTest is PredeploysBaseTest { + /// @notice Test setup. Enabling interop to get all predeploys. + function setUp() public virtual override { + super.enableInterop(); + super.setUp(); + } + + /// @dev Tests that the predeploy addresses are set correctly. They have code + /// and the proxied accounts have the correct admin. Using interop. + function test_predeploys_succeeds() external { + _test_predeploys(true); + } +} diff --git a/packages/contracts-bedrock/test/Preinstalls.t.sol b/packages/contracts-bedrock/test/Preinstalls.t.sol index 1fa31a0cfb0f..9154dfc064c6 100644 --- a/packages/contracts-bedrock/test/Preinstalls.t.sol +++ b/packages/contracts-bedrock/test/Preinstalls.t.sol @@ -5,10 +5,7 @@ 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); -} +import { IEIP712 } from "src/universal/interfaces/IEIP712.sol"; /// @title PreinstallsTest contract PreinstallsTest is CommonTest { @@ -98,16 +95,28 @@ contract PreinstallsTest is CommonTest { vm.chainId(pre); } - function test_preinstall_senderCreator_succeeds() external view { - assertPreinstall(Preinstalls.SenderCreator, Preinstalls.SenderCreatorCode); + function test_preinstall_senderCreatorv060_succeeds() external view { + assertPreinstall(Preinstalls.SenderCreator_v060, Preinstalls.SenderCreator_v060Code); + } + + function test_preinstall_entrypointv060_succeeds() external view { + assertPreinstall(Preinstalls.EntryPoint_v060, Preinstalls.EntryPoint_v060Code); } - function test_preinstall_entrypoint_succeeds() external view { - assertPreinstall(Preinstalls.EntryPoint, Preinstalls.EntryPointCode); + function test_preinstall_senderCreatorv070_succeeds() external view { + assertPreinstall(Preinstalls.SenderCreator_v070, Preinstalls.SenderCreator_v070Code); + } + + function test_preinstall_entrypointv070_succeeds() external view { + assertPreinstall(Preinstalls.EntryPoint_v070, Preinstalls.EntryPoint_v070Code); } function test_preinstall_beaconBlockRoots_succeeds() external view { assertPreinstall(Preinstalls.BeaconBlockRoots, Preinstalls.BeaconBlockRootsCode); assertEq(vm.getNonce(Preinstalls.BeaconBlockRootsSender), 1, "4788 sender must have nonce=1"); } + + function test_preinstall_createX_succeeds() external view { + assertPreinstall(Preinstalls.CreateX, Preinstalls.CreateXCode); + } } diff --git a/packages/contracts-bedrock/test/Specs.t.sol b/packages/contracts-bedrock/test/Specs.t.sol index e8ac18e7adfc..cb67549d4c9c 100644 --- a/packages/contracts-bedrock/test/Specs.t.sol +++ b/packages/contracts-bedrock/test/Specs.t.sol @@ -1,15 +1,24 @@ // SPDX-License-Identifier: MIT pragma solidity ^0.8.15; +// Testing import { CommonTest } from "test/setup/CommonTest.sol"; -import { Executables } from "scripts/Executables.sol"; import { console2 as console } from "forge-std/console2.sol"; -import { ProtocolVersions } from "src/L1/ProtocolVersions.sol"; -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, Abi, AbiEntry } from "scripts/ForgeArtifacts.sol"; + +// Scripts +import { Executables } from "scripts/libraries/Executables.sol"; +import { ForgeArtifacts, Abi, AbiEntry } from "scripts/libraries/ForgeArtifacts.sol"; + +// Contracts +import { OPStackManager } from "src/L1/OPStackManager.sol"; + +// Interfaces +import { IOptimismPortal } from "src/L1/interfaces/IOptimismPortal.sol"; +import { IOptimismPortal2 } from "src/L1/interfaces/IOptimismPortal2.sol"; +import { IOptimismPortalInterop } from "src/L1/interfaces/IOptimismPortalInterop.sol"; +import { ISystemConfig } from "src/L1/interfaces/ISystemConfig.sol"; +import { IDataAvailabilityChallenge } from "src/L1/interfaces/IDataAvailabilityChallenge.sol"; +import { IProtocolVersions } from "src/L1/interfaces/IProtocolVersions.sol"; /// @title Specification_Test /// @dev Specifies common security properties of entrypoints to L1 contracts, including authorization and @@ -24,13 +33,17 @@ contract Specification_Test is CommonTest { CHALLENGER, SYSTEMCONFIGOWNER, GUARDIAN, + DEPUTYGUARDIAN, MESSENGER, L1PROXYADMINOWNER, GOVERNANCETOKENOWNER, MINTMANAGEROWNER, DATAAVAILABILITYCHALLENGEOWNER, DISPUTEGAMEFACTORYOWNER, - DELAYEDWETHOWNER + DELAYEDWETHOWNER, + COUNCILSAFE, + COUNCILSAFEOWNER, + DEPENDENCYMANAGER } /// @notice Represents the specification of a function. @@ -46,7 +59,9 @@ contract Specification_Test is CommonTest { } mapping(string => mapping(bytes4 => Spec)) specs; + mapping(Role => Spec[]) public specsByRole; mapping(string => uint256) public numEntries; + uint256 numSpecs; function setUp() public override { super.setUp(); @@ -72,25 +87,25 @@ contract Specification_Test is CommonTest { _addSpec({ _name: "DataAvailabilityChallenge", _sel: _getSel("resolveWindow()") }); _addSpec({ _name: "DataAvailabilityChallenge", _sel: _getSel("resolverRefundPercentage()") }); _addSpec({ _name: "DataAvailabilityChallenge", _sel: _getSel("balances(address)") }); - _addSpec({ _name: "DataAvailabilityChallenge", _sel: DataAvailabilityChallenge.initialize.selector }); + _addSpec({ _name: "DataAvailabilityChallenge", _sel: IDataAvailabilityChallenge.initialize.selector }); _addSpec({ _name: "DataAvailabilityChallenge", - _sel: DataAvailabilityChallenge.setBondSize.selector, + _sel: IDataAvailabilityChallenge.setBondSize.selector, _auth: Role.DATAAVAILABILITYCHALLENGEOWNER }); _addSpec({ _name: "DataAvailabilityChallenge", - _sel: DataAvailabilityChallenge.setResolverRefundPercentage.selector, + _sel: IDataAvailabilityChallenge.setResolverRefundPercentage.selector, _auth: Role.DATAAVAILABILITYCHALLENGEOWNER }); - _addSpec({ _name: "DataAvailabilityChallenge", _sel: DataAvailabilityChallenge.deposit.selector }); - _addSpec({ _name: "DataAvailabilityChallenge", _sel: DataAvailabilityChallenge.withdraw.selector }); - _addSpec({ _name: "DataAvailabilityChallenge", _sel: DataAvailabilityChallenge.getChallenge.selector }); - _addSpec({ _name: "DataAvailabilityChallenge", _sel: DataAvailabilityChallenge.getChallengeStatus.selector }); - _addSpec({ _name: "DataAvailabilityChallenge", _sel: DataAvailabilityChallenge.validateCommitment.selector }); - _addSpec({ _name: "DataAvailabilityChallenge", _sel: DataAvailabilityChallenge.challenge.selector }); - _addSpec({ _name: "DataAvailabilityChallenge", _sel: DataAvailabilityChallenge.resolve.selector }); - _addSpec({ _name: "DataAvailabilityChallenge", _sel: DataAvailabilityChallenge.unlockBond.selector }); + _addSpec({ _name: "DataAvailabilityChallenge", _sel: IDataAvailabilityChallenge.deposit.selector }); + _addSpec({ _name: "DataAvailabilityChallenge", _sel: IDataAvailabilityChallenge.withdraw.selector }); + _addSpec({ _name: "DataAvailabilityChallenge", _sel: IDataAvailabilityChallenge.getChallenge.selector }); + _addSpec({ _name: "DataAvailabilityChallenge", _sel: IDataAvailabilityChallenge.getChallengeStatus.selector }); + _addSpec({ _name: "DataAvailabilityChallenge", _sel: IDataAvailabilityChallenge.validateCommitment.selector }); + _addSpec({ _name: "DataAvailabilityChallenge", _sel: IDataAvailabilityChallenge.challenge.selector }); + _addSpec({ _name: "DataAvailabilityChallenge", _sel: IDataAvailabilityChallenge.resolve.selector }); + _addSpec({ _name: "DataAvailabilityChallenge", _sel: IDataAvailabilityChallenge.unlockBond.selector }); // DelayedVetoable _addSpec({ _name: "DelayedVetoable", _sel: _getSel("delay()") }); @@ -119,8 +134,6 @@ contract Specification_Test is CommonTest { _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)"), @@ -202,8 +215,6 @@ contract Specification_Test is CommonTest { _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 @@ -244,7 +255,7 @@ contract Specification_Test is CommonTest { _addSpec({ _name: "OptimismPortal", _sel: _getSel("donateETH()") }); _addSpec({ _name: "OptimismPortal", - _sel: OptimismPortal.finalizeWithdrawalTransaction.selector, + _sel: IOptimismPortal.finalizeWithdrawalTransaction.selector, _pausable: true }); _addSpec({ _name: "OptimismPortal", _sel: _getSel("finalizedWithdrawals(bytes32)") }); @@ -256,30 +267,93 @@ contract Specification_Test is CommonTest { _addSpec({ _name: "OptimismPortal", _sel: _getSel("minimumGasLimit(uint64)") }); _addSpec({ _name: "OptimismPortal", _sel: _getSel("params()") }); _addSpec({ _name: "OptimismPortal", _sel: _getSel("paused()") }); - _addSpec({ _name: "OptimismPortal", _sel: OptimismPortal.proveWithdrawalTransaction.selector, _pausable: true }); + _addSpec({ _name: "OptimismPortal", _sel: IOptimismPortal.proveWithdrawalTransaction.selector, _pausable: true }); _addSpec({ _name: "OptimismPortal", _sel: _getSel("provenWithdrawals(bytes32)") }); _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)") }); + // OptimismPortalInterop + _addSpec({ + _name: "OptimismPortalInterop", + _sel: _getSel("depositTransaction(address,uint256,uint64,bool,bytes)") + }); + _addSpec({ _name: "OptimismPortalInterop", _sel: _getSel("donateETH()") }); + _addSpec({ + _name: "OptimismPortalInterop", + _sel: IOptimismPortal2.finalizeWithdrawalTransaction.selector, + _pausable: true + }); + _addSpec({ + _name: "OptimismPortalInterop", + _sel: IOptimismPortal2.finalizeWithdrawalTransactionExternalProof.selector, + _pausable: true + }); + _addSpec({ _name: "OptimismPortalInterop", _sel: _getSel("finalizedWithdrawals(bytes32)") }); + _addSpec({ _name: "OptimismPortalInterop", _sel: _getSel("guardian()") }); + _addSpec({ _name: "OptimismPortalInterop", _sel: _getSel("initialize(address,address,address,uint32)") }); + _addSpec({ _name: "OptimismPortalInterop", _sel: _getSel("l2Sender()") }); + _addSpec({ _name: "OptimismPortalInterop", _sel: _getSel("minimumGasLimit(uint64)") }); + _addSpec({ _name: "OptimismPortalInterop", _sel: _getSel("params()") }); + _addSpec({ _name: "OptimismPortalInterop", _sel: _getSel("paused()") }); + _addSpec({ + _name: "OptimismPortalInterop", + _sel: IOptimismPortal2.proveWithdrawalTransaction.selector, + _pausable: true + }); + _addSpec({ _name: "OptimismPortalInterop", _sel: _getSel("provenWithdrawals(bytes32,address)") }); + _addSpec({ _name: "OptimismPortalInterop", _sel: _getSel("superchainConfig()") }); + _addSpec({ _name: "OptimismPortalInterop", _sel: _getSel("systemConfig()") }); + _addSpec({ _name: "OptimismPortalInterop", _sel: _getSel("version()") }); + _addSpec({ _name: "OptimismPortalInterop", _sel: _getSel("disputeGameFactory()") }); + _addSpec({ _name: "OptimismPortalInterop", _sel: _getSel("disputeGameBlacklist(address)") }); + _addSpec({ _name: "OptimismPortalInterop", _sel: _getSel("respectedGameType()") }); + // Comment out the auth to not disturb the testDeputyGuardianAuth test. This code is not meant to run in + // production, + // and will be merged into the OptimismPortal2 contract itself in the future. + _addSpec({ + _name: "OptimismPortalInterop", + _sel: _getSel("blacklistDisputeGame(address)") /*, _auth: Role.GUARDIAN*/ + }); + _addSpec({ + _name: "OptimismPortalInterop", + _sel: _getSel("setRespectedGameType(uint32)") /*, _auth: Role.GUARDIAN*/ + }); + _addSpec({ _name: "OptimismPortalInterop", _sel: _getSel("checkWithdrawal(bytes32,address)") }); + _addSpec({ _name: "OptimismPortalInterop", _sel: _getSel("proofMaturityDelaySeconds()") }); + _addSpec({ _name: "OptimismPortalInterop", _sel: _getSel("disputeGameFinalityDelaySeconds()") }); + _addSpec({ _name: "OptimismPortalInterop", _sel: _getSel("respectedGameTypeUpdatedAt()") }); + _addSpec({ _name: "OptimismPortalInterop", _sel: _getSel("proofSubmitters(bytes32,uint256)") }); + _addSpec({ _name: "OptimismPortalInterop", _sel: _getSel("numProofSubmitters(bytes32)") }); + _addSpec({ _name: "OptimismPortalInterop", _sel: _getSel("balance()") }); + _addSpec({ + _name: "OptimismPortalInterop", + _sel: _getSel("depositERC20Transaction(address,uint256,uint256,uint64,bool,bytes)") + }); + _addSpec({ _name: "OptimismPortalInterop", _sel: _getSel("setGasPayingToken(address,uint8,bytes32,bytes32)") }); + _addSpec({ + _name: "OptimismPortalInterop", + _sel: IOptimismPortalInterop.setConfig.selector, + _auth: Role.SYSTEMCONFIGOWNER + }); + // OptimismPortal2 _addSpec({ _name: "OptimismPortal2", _sel: _getSel("depositTransaction(address,uint256,uint64,bool,bytes)") }); _addSpec({ _name: "OptimismPortal2", _sel: _getSel("donateETH()") }); _addSpec({ _name: "OptimismPortal2", - _sel: OptimismPortal2.finalizeWithdrawalTransaction.selector, + _sel: IOptimismPortal2.finalizeWithdrawalTransaction.selector, _pausable: true }); _addSpec({ _name: "OptimismPortal2", - _sel: OptimismPortal2.finalizeWithdrawalTransactionExternalProof.selector, + _sel: IOptimismPortal2.finalizeWithdrawalTransactionExternalProof.selector, _pausable: true }); _addSpec({ _name: "OptimismPortal2", _sel: _getSel("finalizedWithdrawals(bytes32)") }); @@ -289,7 +363,11 @@ contract Specification_Test is CommonTest { _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: IOptimismPortal2.proveWithdrawalTransaction.selector, + _pausable: true + }); _addSpec({ _name: "OptimismPortal2", _sel: _getSel("provenWithdrawals(bytes32,address)") }); _addSpec({ _name: "OptimismPortal2", _sel: _getSel("superchainConfig()") }); _addSpec({ _name: "OptimismPortal2", _sel: _getSel("systemConfig()") }); @@ -305,24 +383,30 @@ contract Specification_Test is CommonTest { _addSpec({ _name: "OptimismPortal2", _sel: _getSel("respectedGameTypeUpdatedAt()") }); _addSpec({ _name: "OptimismPortal2", _sel: _getSel("proofSubmitters(bytes32,uint256)") }); _addSpec({ _name: "OptimismPortal2", _sel: _getSel("numProofSubmitters(bytes32)") }); + _addSpec({ _name: "OptimismPortal2", _sel: _getSel("balance()") }); + _addSpec({ + _name: "OptimismPortal2", + _sel: _getSel("depositERC20Transaction(address,uint256,uint256,uint64,bool,bytes)") + }); + _addSpec({ _name: "OptimismPortal2", _sel: _getSel("setGasPayingToken(address,uint8,bytes32,bytes32)") }); // ProtocolVersions _addSpec({ _name: "ProtocolVersions", _sel: _getSel("RECOMMENDED_SLOT()") }); _addSpec({ _name: "ProtocolVersions", _sel: _getSel("REQUIRED_SLOT()") }); _addSpec({ _name: "ProtocolVersions", _sel: _getSel("VERSION()") }); - _addSpec({ _name: "ProtocolVersions", _sel: ProtocolVersions.initialize.selector }); + _addSpec({ _name: "ProtocolVersions", _sel: IProtocolVersions.initialize.selector }); _addSpec({ _name: "ProtocolVersions", _sel: _getSel("owner()") }); - _addSpec({ _name: "ProtocolVersions", _sel: ProtocolVersions.recommended.selector }); + _addSpec({ _name: "ProtocolVersions", _sel: IProtocolVersions.recommended.selector }); _addSpec({ _name: "ProtocolVersions", _sel: _getSel("renounceOwnership()"), _auth: Role.SYSTEMCONFIGOWNER }); - _addSpec({ _name: "ProtocolVersions", _sel: ProtocolVersions.required.selector }); + _addSpec({ _name: "ProtocolVersions", _sel: IProtocolVersions.required.selector }); _addSpec({ _name: "ProtocolVersions", - _sel: ProtocolVersions.setRequired.selector, + _sel: IProtocolVersions.setRequired.selector, _auth: Role.SYSTEMCONFIGOWNER }); _addSpec({ _name: "ProtocolVersions", - _sel: ProtocolVersions.setRecommended.selector, + _sel: IProtocolVersions.setRecommended.selector, _auth: Role.SYSTEMCONFIGOWNER }); _addSpec({ _name: "ProtocolVersions", _sel: _getSel("transferOwnership(address)") }); @@ -347,28 +431,27 @@ contract Specification_Test is CommonTest { _addSpec({ _name: "SystemConfig", _sel: _getSel("VERSION()") }); _addSpec({ _name: "SystemConfig", _sel: _getSel("batcherHash()") }); _addSpec({ _name: "SystemConfig", _sel: _getSel("gasLimit()") }); - _addSpec({ _name: "SystemConfig", _sel: SystemConfig.initialize.selector }); - _addSpec({ _name: "SystemConfig", _sel: SystemConfig.minimumGasLimit.selector }); + _addSpec({ _name: "SystemConfig", _sel: ISystemConfig.initialize.selector }); + _addSpec({ _name: "SystemConfig", _sel: ISystemConfig.minimumGasLimit.selector }); _addSpec({ _name: "SystemConfig", _sel: _getSel("overhead()") }); _addSpec({ _name: "SystemConfig", _sel: _getSel("owner()") }); _addSpec({ _name: "SystemConfig", _sel: _getSel("renounceOwnership()"), _auth: Role.SYSTEMCONFIGOWNER }); - _addSpec({ _name: "SystemConfig", _sel: SystemConfig.resourceConfig.selector }); + _addSpec({ _name: "SystemConfig", _sel: ISystemConfig.resourceConfig.selector }); _addSpec({ _name: "SystemConfig", _sel: _getSel("scalar()") }); - _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: ISystemConfig.setBatcherHash.selector, _auth: Role.SYSTEMCONFIGOWNER }); + _addSpec({ _name: "SystemConfig", _sel: ISystemConfig.setGasConfig.selector, _auth: Role.SYSTEMCONFIGOWNER }); + _addSpec({ _name: "SystemConfig", _sel: ISystemConfig.setGasLimit.selector, _auth: Role.SYSTEMCONFIGOWNER }); _addSpec({ _name: "SystemConfig", - _sel: SystemConfig.setUnsafeBlockSigner.selector, + _sel: ISystemConfig.setUnsafeBlockSigner.selector, _auth: Role.SYSTEMCONFIGOWNER }); _addSpec({ _name: "SystemConfig", _sel: _getSel("transferOwnership(address)"), _auth: Role.SYSTEMCONFIGOWNER }); - _addSpec({ _name: "SystemConfig", _sel: SystemConfig.unsafeBlockSigner.selector }); + _addSpec({ _name: "SystemConfig", _sel: ISystemConfig.unsafeBlockSigner.selector }); _addSpec({ _name: "SystemConfig", _sel: _getSel("version()") }); _addSpec({ _name: "SystemConfig", _sel: _getSel("l1CrossDomainMessenger()") }); _addSpec({ _name: "SystemConfig", _sel: _getSel("l1ERC721Bridge()") }); _addSpec({ _name: "SystemConfig", _sel: _getSel("l1StandardBridge()") }); - _addSpec({ _name: "SystemConfig", _sel: _getSel("l2OutputOracle()") }); _addSpec({ _name: "SystemConfig", _sel: _getSel("optimismPortal()") }); _addSpec({ _name: "SystemConfig", _sel: _getSel("optimismMintableERC20Factory()") }); _addSpec({ _name: "SystemConfig", _sel: _getSel("batchInbox()") }); @@ -376,7 +459,6 @@ contract Specification_Test is CommonTest { _addSpec({ _name: "SystemConfig", _sel: _getSel("L1_CROSS_DOMAIN_MESSENGER_SLOT()") }); _addSpec({ _name: "SystemConfig", _sel: _getSel("L1_ERC_721_BRIDGE_SLOT()") }); _addSpec({ _name: "SystemConfig", _sel: _getSel("L1_STANDARD_BRIDGE_SLOT()") }); - _addSpec({ _name: "SystemConfig", _sel: _getSel("L2_OUTPUT_ORACLE_SLOT()") }); _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()") }); @@ -384,6 +466,97 @@ contract Specification_Test is CommonTest { _addSpec({ _name: "SystemConfig", _sel: _getSel("gasPayingTokenName()") }); _addSpec({ _name: "SystemConfig", _sel: _getSel("gasPayingTokenSymbol()") }); _addSpec({ _name: "SystemConfig", _sel: _getSel("isCustomGasToken()") }); + _addSpec({ _name: "SystemConfig", _sel: _getSel("DISPUTE_GAME_FACTORY_SLOT()") }); + _addSpec({ _name: "SystemConfig", _sel: _getSel("disputeGameFactory()") }); + _addSpec({ + _name: "SystemConfig", + _sel: _getSel("setGasConfigEcotone(uint32,uint32)"), + _auth: Role.SYSTEMCONFIGOWNER + }); + _addSpec({ _name: "SystemConfig", _sel: _getSel("basefeeScalar()") }); + _addSpec({ _name: "SystemConfig", _sel: _getSel("blobbasefeeScalar()") }); + _addSpec({ _name: "SystemConfig", _sel: _getSel("maximumGasLimit()") }); + + // SystemConfigInterop + _addSpec({ _name: "SystemConfigInterop", _sel: _getSel("UNSAFE_BLOCK_SIGNER_SLOT()") }); + _addSpec({ _name: "SystemConfigInterop", _sel: _getSel("START_BLOCK_SLOT()") }); + _addSpec({ _name: "SystemConfigInterop", _sel: _getSel("VERSION()") }); + _addSpec({ _name: "SystemConfigInterop", _sel: _getSel("batcherHash()") }); + _addSpec({ _name: "SystemConfigInterop", _sel: _getSel("gasLimit()") }); + _addSpec({ _name: "SystemConfigInterop", _sel: ISystemConfig.initialize.selector }); + _addSpec({ _name: "SystemConfigInterop", _sel: ISystemConfig.minimumGasLimit.selector }); + _addSpec({ _name: "SystemConfigInterop", _sel: _getSel("overhead()") }); + _addSpec({ _name: "SystemConfigInterop", _sel: _getSel("owner()") }); + _addSpec({ _name: "SystemConfigInterop", _sel: _getSel("renounceOwnership()"), _auth: Role.SYSTEMCONFIGOWNER }); + _addSpec({ _name: "SystemConfigInterop", _sel: ISystemConfig.resourceConfig.selector }); + _addSpec({ _name: "SystemConfigInterop", _sel: _getSel("scalar()") }); + _addSpec({ + _name: "SystemConfigInterop", + _sel: ISystemConfig.setBatcherHash.selector, + _auth: Role.SYSTEMCONFIGOWNER + }); + _addSpec({ + _name: "SystemConfigInterop", + _sel: ISystemConfig.setGasConfig.selector, + _auth: Role.SYSTEMCONFIGOWNER + }); + _addSpec({ + _name: "SystemConfigInterop", + _sel: ISystemConfig.setGasLimit.selector, + _auth: Role.SYSTEMCONFIGOWNER + }); + _addSpec({ + _name: "SystemConfigInterop", + _sel: ISystemConfig.setUnsafeBlockSigner.selector, + _auth: Role.SYSTEMCONFIGOWNER + }); + _addSpec({ + _name: "SystemConfigInterop", + _sel: _getSel("transferOwnership(address)"), + _auth: Role.SYSTEMCONFIGOWNER + }); + _addSpec({ _name: "SystemConfigInterop", _sel: ISystemConfig.unsafeBlockSigner.selector }); + _addSpec({ _name: "SystemConfigInterop", _sel: _getSel("version()") }); + _addSpec({ _name: "SystemConfigInterop", _sel: _getSel("l1CrossDomainMessenger()") }); + _addSpec({ _name: "SystemConfigInterop", _sel: _getSel("l1ERC721Bridge()") }); + _addSpec({ _name: "SystemConfigInterop", _sel: _getSel("l1StandardBridge()") }); + _addSpec({ _name: "SystemConfigInterop", _sel: _getSel("optimismPortal()") }); + _addSpec({ _name: "SystemConfigInterop", _sel: _getSel("optimismMintableERC20Factory()") }); + _addSpec({ _name: "SystemConfigInterop", _sel: _getSel("batchInbox()") }); + _addSpec({ _name: "SystemConfigInterop", _sel: _getSel("startBlock()") }); + _addSpec({ _name: "SystemConfigInterop", _sel: _getSel("L1_CROSS_DOMAIN_MESSENGER_SLOT()") }); + _addSpec({ _name: "SystemConfigInterop", _sel: _getSel("L1_ERC_721_BRIDGE_SLOT()") }); + _addSpec({ _name: "SystemConfigInterop", _sel: _getSel("L1_STANDARD_BRIDGE_SLOT()") }); + _addSpec({ _name: "SystemConfigInterop", _sel: _getSel("OPTIMISM_PORTAL_SLOT()") }); + _addSpec({ _name: "SystemConfigInterop", _sel: _getSel("OPTIMISM_MINTABLE_ERC20_FACTORY_SLOT()") }); + _addSpec({ _name: "SystemConfigInterop", _sel: _getSel("BATCH_INBOX_SLOT()") }); + _addSpec({ _name: "SystemConfigInterop", _sel: _getSel("gasPayingToken()") }); + _addSpec({ _name: "SystemConfigInterop", _sel: _getSel("gasPayingTokenName()") }); + _addSpec({ _name: "SystemConfigInterop", _sel: _getSel("gasPayingTokenSymbol()") }); + _addSpec({ _name: "SystemConfigInterop", _sel: _getSel("isCustomGasToken()") }); + _addSpec({ _name: "SystemConfigInterop", _sel: _getSel("DISPUTE_GAME_FACTORY_SLOT()") }); + _addSpec({ _name: "SystemConfigInterop", _sel: _getSel("disputeGameFactory()") }); + _addSpec({ + _name: "SystemConfigInterop", + _sel: _getSel("setGasConfigEcotone(uint32,uint32)"), + _auth: Role.SYSTEMCONFIGOWNER + }); + _addSpec({ _name: "SystemConfigInterop", _sel: _getSel("basefeeScalar()") }); + _addSpec({ _name: "SystemConfigInterop", _sel: _getSel("blobbasefeeScalar()") }); + _addSpec({ _name: "SystemConfigInterop", _sel: _getSel("maximumGasLimit()") }); + _addSpec({ _name: "SystemConfigInterop", _sel: _getSel("addDependency(uint256)"), _auth: Role.DEPENDENCYMANAGER }); + _addSpec({ + _name: "SystemConfigInterop", + _sel: _getSel("removeDependency(uint256)"), + _auth: Role.DEPENDENCYMANAGER + }); + _addSpec({ _name: "SystemConfigInterop", _sel: _getSel("dependencyManager()") }); + _addSpec({ + _name: "SystemConfigInterop", + _sel: _getSel( + "initialize(address,uint32,uint32,bytes32,uint64,address,(uint32,uint8,uint8,uint32,uint32,uint128),address,(address,address,address,address,address,address,address),address)" + ) + }); // ProxyAdmin _addSpec({ _name: "ProxyAdmin", _sel: _getSel("addressManager()") }); @@ -467,15 +640,26 @@ contract Specification_Test is CommonTest { // 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("initialize((uint32,(bytes32,uint256))[],address)") }); _addSpec({ _name: "AnchorStateRegistry", _sel: _getSel("tryUpdateAnchorState()") }); + _addSpec({ _name: "AnchorStateRegistry", _sel: _getSel("setAnchorState(address)"), _auth: Role.GUARDIAN }); _addSpec({ _name: "AnchorStateRegistry", _sel: _getSel("version()") }); + _addSpec({ _name: "AnchorStateRegistry", _sel: _getSel("superchainConfig()") }); // 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("attack(bytes32,uint256,bytes32)"), + _auth: Role.CHALLENGER + }); + _addSpec({ + _name: "PermissionedDisputeGame", + _sel: _getSel("challengeRootL2Block((bytes32,bytes32,bytes32,bytes32),bytes)"), + _auth: Role.CHALLENGER + }); _addSpec({ _name: "PermissionedDisputeGame", _sel: _getSel("challenger()") }); _addSpec({ _name: "PermissionedDisputeGame", _sel: _getSel("claimCredit(address)") }); _addSpec({ _name: "PermissionedDisputeGame", _sel: _getSel("claimData(uint256)") }); @@ -484,27 +668,35 @@ contract Specification_Test is CommonTest { _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("defend(bytes32,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("getNumToResolve(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("l2BlockNumberChallenged()") }); + _addSpec({ _name: "PermissionedDisputeGame", _sel: _getSel("l2BlockNumberChallenger()") }); _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)"), + _sel: _getSel("move(bytes32,uint256,bytes32,bool)"), _auth: Role.CHALLENGER }); _addSpec({ _name: "PermissionedDisputeGame", _sel: _getSel("proposer()") }); + _addSpec({ _name: "PermissionedDisputeGame", _sel: _getSel("resolutionCheckpoints(uint256)") }); _addSpec({ _name: "PermissionedDisputeGame", _sel: _getSel("resolve()") }); - _addSpec({ _name: "PermissionedDisputeGame", _sel: _getSel("resolveClaim(uint256)") }); + _addSpec({ _name: "PermissionedDisputeGame", _sel: _getSel("resolveClaim(uint256,uint256)") }); _addSpec({ _name: "PermissionedDisputeGame", _sel: _getSel("resolvedAt()") }); _addSpec({ _name: "PermissionedDisputeGame", _sel: _getSel("resolvedSubgames(uint256)") }); _addSpec({ _name: "PermissionedDisputeGame", _sel: _getSel("rootClaim()") }); @@ -527,8 +719,11 @@ contract Specification_Test is CommonTest { _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("attack(bytes32,uint256,bytes32)") }); + _addSpec({ + _name: "FaultDisputeGame", + _sel: _getSel("challengeRootL2Block((bytes32,bytes32,bytes32,bytes32),bytes)") + }); _addSpec({ _name: "FaultDisputeGame", _sel: _getSel("claimCredit(address)") }); _addSpec({ _name: "FaultDisputeGame", _sel: _getSel("claimData(uint256)") }); _addSpec({ _name: "FaultDisputeGame", _sel: _getSel("claimDataLen()") }); @@ -536,7 +731,7 @@ contract Specification_Test is CommonTest { _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("defend(bytes32,uint256,bytes32)") }); _addSpec({ _name: "FaultDisputeGame", _sel: _getSel("extraData()") }); _addSpec({ _name: "FaultDisputeGame", _sel: _getSel("gameCreator()") }); _addSpec({ _name: "FaultDisputeGame", _sel: _getSel("gameData()") }); @@ -546,11 +741,13 @@ contract Specification_Test is CommonTest { _addSpec({ _name: "FaultDisputeGame", _sel: _getSel("initialize()") }); _addSpec({ _name: "FaultDisputeGame", _sel: _getSel("l1Head()") }); _addSpec({ _name: "FaultDisputeGame", _sel: _getSel("l2BlockNumber()") }); + _addSpec({ _name: "FaultDisputeGame", _sel: _getSel("l2BlockNumberChallenged()") }); + _addSpec({ _name: "FaultDisputeGame", _sel: _getSel("l2BlockNumberChallenger()") }); _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("move(bytes32,uint256,bytes32,bool)") }); + _addSpec({ _name: "FaultDisputeGame", _sel: _getSel("resolutionCheckpoints(uint256)") }); _addSpec({ _name: "FaultDisputeGame", _sel: _getSel("resolve()") }); _addSpec({ _name: "FaultDisputeGame", _sel: _getSel("getNumToResolve(uint256)") }); _addSpec({ _name: "FaultDisputeGame", _sel: _getSel("resolveClaim(uint256,uint256)") }); @@ -587,9 +784,13 @@ contract Specification_Test is CommonTest { _addSpec({ _name: "DisputeGameFactory", _sel: _getSel("setImplementation(uint32,address)"), - _auth: Role.GUARDIAN + _auth: Role.DISPUTEGAMEFACTORYOWNER + }); + _addSpec({ + _name: "DisputeGameFactory", + _sel: _getSel("setInitBond(uint32,uint256)"), + _auth: Role.DISPUTEGAMEFACTORYOWNER }); - _addSpec({ _name: "DisputeGameFactory", _sel: _getSel("setInitBond(uint32,uint256)"), _auth: Role.GUARDIAN }); _addSpec({ _name: "DisputeGameFactory", _sel: _getSel("transferOwnership(address)"), @@ -605,11 +806,11 @@ contract Specification_Test is CommonTest { _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("hold(address,uint256)"), _auth: Role.DELAYEDWETHOWNER }); _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("recover(uint256)"), _auth: Role.DELAYEDWETHOWNER }); _addSpec({ _name: "DelayedWETH", _sel: _getSel("renounceOwnership()"), _auth: Role.DELAYEDWETHOWNER }); _addSpec({ _name: "DelayedWETH", _sel: _getSel("symbol()") }); _addSpec({ _name: "DelayedWETH", _sel: _getSel("totalSupply()") }); @@ -634,6 +835,80 @@ contract Specification_Test is CommonTest { _addSpec({ _name: "WETH98", _sel: _getSel("transfer(address,uint256)") }); _addSpec({ _name: "WETH98", _sel: _getSel("transferFrom(address,address,uint256)") }); _addSpec({ _name: "WETH98", _sel: _getSel("withdraw(uint256)") }); + + // OPStackManager + _addSpec({ _name: "OPStackManager", _sel: _getSel("version()") }); + _addSpec({ _name: "OPStackManager", _sel: _getSel("superchainConfig()") }); + _addSpec({ _name: "OPStackManager", _sel: _getSel("protocolVersions()") }); + _addSpec({ _name: "OPStackManager", _sel: _getSel("latestRelease()") }); + _addSpec({ _name: "OPStackManager", _sel: _getSel("implementations(string,string)") }); + _addSpec({ _name: "OPStackManager", _sel: _getSel("systemConfigs(uint256)") }); + _addSpec({ _name: "OPStackManager", _sel: OPStackManager.initialize.selector }); + _addSpec({ _name: "OPStackManager", _sel: OPStackManager.deploy.selector }); + _addSpec({ _name: "OPStackManager", _sel: OPStackManager.blueprints.selector }); + _addSpec({ _name: "OPStackManager", _sel: OPStackManager.chainIdToBatchInboxAddress.selector }); + + // OPStackManagerInterop + _addSpec({ _name: "OPStackManagerInterop", _sel: _getSel("version()") }); + _addSpec({ _name: "OPStackManagerInterop", _sel: _getSel("superchainConfig()") }); + _addSpec({ _name: "OPStackManagerInterop", _sel: _getSel("protocolVersions()") }); + _addSpec({ _name: "OPStackManagerInterop", _sel: _getSel("latestRelease()") }); + _addSpec({ _name: "OPStackManagerInterop", _sel: _getSel("implementations(string,string)") }); + _addSpec({ _name: "OPStackManagerInterop", _sel: _getSel("systemConfigs(uint256)") }); + _addSpec({ _name: "OPStackManagerInterop", _sel: OPStackManager.initialize.selector }); + _addSpec({ _name: "OPStackManagerInterop", _sel: OPStackManager.deploy.selector }); + _addSpec({ _name: "OPStackManagerInterop", _sel: OPStackManager.blueprints.selector }); + _addSpec({ _name: "OPStackManagerInterop", _sel: OPStackManager.chainIdToBatchInboxAddress.selector }); + + // DeputyGuardianModule + _addSpec({ + _name: "DeputyGuardianModule", + _sel: _getSel("blacklistDisputeGame(address,address)"), + _auth: Role.DEPUTYGUARDIAN + }); + _addSpec({ + _name: "DeputyGuardianModule", + _sel: _getSel("setRespectedGameType(address,uint32)"), + _auth: Role.DEPUTYGUARDIAN + }); + _addSpec({ + _name: "DeputyGuardianModule", + _sel: _getSel("setAnchorState(address,address)"), + _auth: Role.DEPUTYGUARDIAN + }); + _addSpec({ _name: "DeputyGuardianModule", _sel: _getSel("pause()"), _auth: Role.DEPUTYGUARDIAN }); + _addSpec({ _name: "DeputyGuardianModule", _sel: _getSel("unpause()"), _auth: Role.DEPUTYGUARDIAN }); + _addSpec({ _name: "DeputyGuardianModule", _sel: _getSel("deputyGuardian()") }); + _addSpec({ _name: "DeputyGuardianModule", _sel: _getSel("safe()") }); + _addSpec({ _name: "DeputyGuardianModule", _sel: _getSel("superchainConfig()") }); + _addSpec({ _name: "DeputyGuardianModule", _sel: _getSel("version()") }); + + // LivenessGuard + _addSpec({ _name: "LivenessGuard", _sel: _getSel("checkAfterExecution(bytes32,bool)"), _auth: Role.COUNCILSAFE }); + _addSpec({ + _name: "LivenessGuard", + _sel: _getSel( + "checkTransaction(address,uint256,bytes,uint8,uint256,uint256,uint256,address,address,bytes,address)" + ), + _auth: Role.COUNCILSAFE + }); + _addSpec({ _name: "LivenessGuard", _sel: _getSel("lastLive(address)") }); + _addSpec({ _name: "LivenessGuard", _sel: _getSel("safe()") }); + _addSpec({ _name: "LivenessGuard", _sel: _getSel("showLiveness()"), _auth: Role.COUNCILSAFEOWNER }); + _addSpec({ _name: "LivenessGuard", _sel: _getSel("version()") }); + + // LivenessModule + _addSpec({ _name: "LivenessModule", _sel: _getSel("canRemove(address)") }); + _addSpec({ _name: "LivenessModule", _sel: _getSel("fallbackOwner()") }); + _addSpec({ _name: "LivenessModule", _sel: _getSel("getRequiredThreshold(uint256)") }); + _addSpec({ _name: "LivenessModule", _sel: _getSel("livenessGuard()") }); + _addSpec({ _name: "LivenessModule", _sel: _getSel("livenessInterval()") }); + _addSpec({ _name: "LivenessModule", _sel: _getSel("minOwners()") }); + _addSpec({ _name: "LivenessModule", _sel: _getSel("ownershipTransferredToFallback()") }); + _addSpec({ _name: "LivenessModule", _sel: _getSel("removeOwners(address[],address[])") }); + _addSpec({ _name: "LivenessModule", _sel: _getSel("safe()") }); + _addSpec({ _name: "LivenessModule", _sel: _getSel("thresholdPercentage()") }); + _addSpec({ _name: "LivenessModule", _sel: _getSel("version()") }); } /// @dev Computes the selector from a function signature. @@ -643,8 +918,11 @@ contract Specification_Test is CommonTest { /// @dev Adds a spec for a function. function _addSpec(string memory _name, bytes4 _sel, Role _auth, bool _pausable) internal { - specs[_name][_sel] = Spec({ name: _name, sel: _sel, auth: _auth, pausable: _pausable }); + Spec memory spec = Spec({ name: _name, sel: _sel, auth: _auth, pausable: _pausable }); + specs[_name][_sel] = spec; numEntries[_name]++; + specsByRole[_auth].push(spec); + numSpecs++; } /// @dev Adds a spec for a function with no auth. @@ -664,11 +942,17 @@ contract Specification_Test is CommonTest { /// @notice Ensures that there's an auth spec for every L1 contract function. function testContractAuth() public { - string[] memory pathExcludes = new string[](1); + string[] memory pathExcludes = new string[](5); pathExcludes[0] = "src/dispute/interfaces/*"; - Abi[] memory abis = - ForgeArtifacts.getContractFunctionAbis("src/{L1,dispute,governance,universal/ProxyAdmin.sol}", pathExcludes); - + pathExcludes[1] = "src/dispute/lib/*"; + pathExcludes[2] = "src/safe/SafeSigners.sol"; + pathExcludes[3] = "src/L1/interfaces/*"; + pathExcludes[4] = "src/governance/interfaces/*"; + Abi[] memory abis = ForgeArtifacts.getContractFunctionAbis( + "src/{L1,dispute,governance,safe,universal/ProxyAdmin.sol,universal/WETH98.sol}", pathExcludes + ); + + uint256 numCheckedEntries = 0; for (uint256 i = 0; i < abis.length; i++) { string memory contractName = abis[i].contractName; assertEq( @@ -694,7 +978,42 @@ contract Specification_Test is CommonTest { spec.sel, string.concat("Specification_Test: invalid ABI ", contractName, "::", abiEntry.fnName) ); + numCheckedEntries++; } } + assertEq(numSpecs, numCheckedEntries, "Some specs were not checked"); + } + + /// @dev Asserts that two roles are equal by comparing their uint256 representations. + function _assertRolesEq(Role leftRole, Role rightRole) internal pure { + assertEq(uint256(leftRole), uint256(rightRole)); + } + + /// @notice Ensures that the DeputyGuardian is authorized to take all Guardian actions. + function testDeputyGuardianAuth() public view { + assertEq(specsByRole[Role.DEPUTYGUARDIAN].length, specsByRole[Role.GUARDIAN].length); + assertEq(specsByRole[Role.DEPUTYGUARDIAN].length, 5); + + mapping(bytes4 => Spec) storage dgmFuncSpecs = specs["DeputyGuardianModule"]; + mapping(bytes4 => Spec) storage superchainConfigFuncSpecs = specs["SuperchainConfig"]; + mapping(bytes4 => Spec) storage portal2FuncSpecs = specs["OptimismPortal2"]; + mapping(bytes4 => Spec) storage anchorRegFuncSpecs = specs["AnchorStateRegistry"]; + + // Ensure that for each of the DeputyGuardianModule's methods there is a corresponding method on another + // system contract authed to the Guardian role. + _assertRolesEq(dgmFuncSpecs[_getSel("pause()")].auth, Role.DEPUTYGUARDIAN); + _assertRolesEq(superchainConfigFuncSpecs[_getSel("pause(string)")].auth, Role.GUARDIAN); + + _assertRolesEq(dgmFuncSpecs[_getSel("unpause()")].auth, Role.DEPUTYGUARDIAN); + _assertRolesEq(superchainConfigFuncSpecs[_getSel("unpause()")].auth, Role.GUARDIAN); + + _assertRolesEq(dgmFuncSpecs[_getSel("blacklistDisputeGame(address,address)")].auth, Role.DEPUTYGUARDIAN); + _assertRolesEq(portal2FuncSpecs[_getSel("blacklistDisputeGame(address)")].auth, Role.GUARDIAN); + + _assertRolesEq(dgmFuncSpecs[_getSel("setRespectedGameType(address,uint32)")].auth, Role.DEPUTYGUARDIAN); + _assertRolesEq(portal2FuncSpecs[_getSel("setRespectedGameType(uint32)")].auth, Role.GUARDIAN); + + _assertRolesEq(dgmFuncSpecs[_getSel("setAnchorState(address,address)")].auth, Role.DEPUTYGUARDIAN); + _assertRolesEq(anchorRegFuncSpecs[_getSel("setAnchorState(address)")].auth, Role.GUARDIAN); } } diff --git a/packages/contracts-bedrock/test/actors/FaultDisputeActors.sol b/packages/contracts-bedrock/test/actors/FaultDisputeActors.sol index 181fc87266ac..20f18eddc3c0 100644 --- a/packages/contracts-bedrock/test/actors/FaultDisputeActors.sol +++ b/packages/contracts-bedrock/test/actors/FaultDisputeActors.sol @@ -1,13 +1,15 @@ // SPDX-License-Identifier: MIT pragma solidity ^0.8.15; +// Testing import { CommonBase } from "forge-std/Base.sol"; -import { FaultDisputeGame } from "src/dispute/FaultDisputeGame.sol"; -import { IFaultDisputeGame } from "src/dispute/interfaces/IFaultDisputeGame.sol"; - +// Libraries import "src/dispute/lib/Types.sol"; +// Interfaces +import { IFaultDisputeGame } from "src/dispute/interfaces/IFaultDisputeGame.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 @@ -15,7 +17,7 @@ import "src/dispute/lib/Types.sol"; /// it suggests. abstract contract GameSolver is CommonBase { /// @notice The `FaultDisputeGame` proxy that the `GameSolver` will be solving. - FaultDisputeGame public immutable GAME; + IFaultDisputeGame public immutable GAME; /// @notice The split depth of the game uint256 internal immutable SPLIT_DEPTH; /// @notice The max depth of the game @@ -55,7 +57,7 @@ abstract contract GameSolver is CommonBase { } constructor( - FaultDisputeGame _gameProxy, + IFaultDisputeGame _gameProxy, uint256[] memory _l2Outputs, bytes memory _trace, bytes memory _preStateData @@ -89,7 +91,7 @@ contract HonestGameSolver is GameSolver { } constructor( - FaultDisputeGame _gameProxy, + IFaultDisputeGame _gameProxy, uint256[] memory _l2Outputs, bytes memory _trace, bytes memory _preStateData @@ -223,7 +225,7 @@ contract HonestGameSolver is GameSolver { move_ = Move({ kind: isAttack ? MoveKind.Attack : MoveKind.Defend, value: bond, - data: abi.encodeCall(FaultDisputeGame.move, (disputed, _challengeIndex, claimAt(_movePos), isAttack)) + data: abi.encodeCall(IFaultDisputeGame.move, (disputed, _challengeIndex, claimAt(_movePos), isAttack)) }); } @@ -263,7 +265,7 @@ contract HonestGameSolver is GameSolver { move_ = Move({ kind: MoveKind.Step, value: 0, - data: abi.encodeCall(FaultDisputeGame.step, (_challengeIndex, isAttack, preStateTrace, hex"")) + data: abi.encodeCall(IFaultDisputeGame.step, (_challengeIndex, isAttack, preStateTrace, hex"")) }); } @@ -366,10 +368,10 @@ abstract contract DisputeActor { /// 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; + IFaultDisputeGame public immutable GAME; constructor( - FaultDisputeGame _gameProxy, + IFaultDisputeGame _gameProxy, uint256[] memory _l2Outputs, bytes memory _trace, bytes memory _preStateData diff --git a/packages/contracts-bedrock/test/cannon/MIPS.t.sol b/packages/contracts-bedrock/test/cannon/MIPS.t.sol index f62aaceac4f5..9aafbdb5421d 100644 --- a/packages/contracts-bedrock/test/cannon/MIPS.t.sol +++ b/packages/contracts-bedrock/test/cannon/MIPS.t.sol @@ -4,6 +4,9 @@ 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 { MIPSInstructions } from "src/cannon/libraries/MIPSInstructions.sol"; +import { MIPSSyscalls as sys } from "src/cannon/libraries/MIPSSyscalls.sol"; +import { InvalidExitedValue, InvalidMemoryProof } from "src/cannon/libraries/CannonErrors.sol"; import "src/dispute/lib/Types.sol"; contract MIPS_Test is CommonTest { @@ -19,6 +22,26 @@ contract MIPS_Test is CommonTest { vm.label(address(mips), "MIPS"); } + /// @notice Used to debug step() behavior given a specific input. + /// This is useful to more easily debug non-forge tests. + /// For example, in cannon/mipsevm/evm_test.go step input can be pulled here: + /// https://github.com/ethereum-optimism/optimism/blob/1f64dd6db5561f3bb76ed1d1ffdaff0cde9b7c4b/cannon/mipsevm/evm_test.go#L80-L80 + function test_step_debug_succeeds() external { + bytes memory oracleInput = + hex"e15926110000000000000000000000000000000000000000000000000000000000000008000000000000000000000000000000000000000000000000000000000000004000000000000000000000000000000000000000000000000000000000000000081234567898765432000000000000000000000000000000000000000000000000"; + (bool oracleSuccess,) = address(oracle).call(oracleInput); + assertTrue(oracleSuccess); + + bytes memory input = + hex"e14ced3200000000000000000000000000000000000000000000000000000000000000600000000000000000000000000000000000000000000000000000000000000180000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000e2d0637506e48299469d82d71a947c6771e7d3eaa3db30b44b30b3ac6ba6596c79029df7322a2404a59aebdffb81ab72dd22cc4459131675e63231b2c693676cf100000008f1f85ff4f1f85ff82ad7bda1e5acea1049e0bfd000001f5b0412ffd341c045e665389becadf100000fa3c64fbd7f000000050000ff00000000015b3d97166d1aec28829f3dd43d8cf1f9358e4103b16d09d466e2c7c048ea3ba1aef3141e700270581aa0b75b50e34fc926bb2d83bb3938f8506d442d5e545ba3a5d214515c11955d8ad50cfb04a6a0e484a2a29f1d688138c1883f289a45a6d5d9c37ebe000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000070000000000000000000000000000000000000000000000000c00000000000000000000000000000000000000000000000000000000000000000000000000000000ad3228b676f7d3cd4284a5443f17f1962b36e491b30a40b2405849e597ba5fb5b4c11951957c6f8f642c4af61cd6b24640fec6dc7fc607ee8206a99e92410d3021ddb9a356815c3fac1026b6dec5df3124afbadb485c9ba5a3e3398a04b7ba85e58769b32a1beaf1ea27375a44095a0d1fb664ce2dd358e7fcbfb78c26a193440eb01ebfc9ed27500cd4dfc979272d1f0913cc9f66540d7e8005811109e1cf2d887c22bd8750d34016ac3c66b5ff102dacdd73f6b014e710b51e8022af9a1968ffd70157e48063fc33c97a050f7f640233bf646cc98d9524c6b92bcf3ab56f839867cc5f7f196b93bae1e27e6320742445d290f2263827498b54fec539f756afcefad4e508c098b9a7e1d8feb19955fb02ba9675585078710969d3440f5054e0f9dc3e7fe016e050eff260334f18a5d4fe391d82092319f5964f2e2eb7c1c3a5f8b13a49e282f609c317a833fb8d976d11517c571d1221a265d25af778ecf8923490c6ceeb450aecdc82e28293031d10c7d73bf85e57bf041a97360aa2c5d99cc1df82d9c4b87413eae2ef048f94b4d3554cea73d92b0f7af96e0271c691e2bb5c67add7c6caf302256adedf7ab114da0acfe870d449a3a489f781d659e8beccda7bce9f4e8618b6bd2f4132ce798cdc7a60e7e1460a7299e3c6342a579626d22733e50f526ec2fa19a22b31e8ed50f23cd1fdf94c9154ed3a7609a2f1ff981fe1d3b5c807b281e4683cc6d6315cf95b9ade8641defcb32372f1c126e398ef7a5a2dce0a8a7f68bb74560f8f71837c2c2ebbcbf7fffb42ae1896f13f7c7479a0b46a28b6f55540f89444f63de0378e3d121be09e06cc9ded1c20e65876d36aa0c65e9645644786b620e2dd2ad648ddfcbf4a7e5b1a3a4ecfe7f64667a3f0b7e2f4418588ed35a2458cffeb39b93d26f18d2ab13bdce6aee58e7b99359ec2dfd95a9c16dc00d6ef18b7933a6f8dc65ccb55667138776f7dea101070dc8796e3774df84f40ae0c8229d0d6069e5c8f39a7c299677a09d367fc7b05e3bc380ee652cdc72595f74c7b1043d0e1ffbab734648c838dfb0527d971b602bc216c9619ef0abf5ac974a1ed57f4050aa510dd9c74f508277b39d7973bb2dfccc5eeb0618df7a66599e9dd7409a7d8de62e29bea7821f0f19cfb783952bff507c87eba2365ffffffff000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000ad3228b676f7d3cd4284a5443f17f1962b36e491b30a40b2405849e597ba5fb5b4c11951957c6f8f642c4af61cd6b24640fec6dc7fc607ee8206a99e92410d3021ddb9a356815c3fac1026b6dec5df3124afbadb485c9ba5a3e3398a04b7ba85e58769b32a1beaf1ea27375a44095a0d1fb664ce2dd358e7fcbfb78c26a193440eb01ebfc9ed27500cd4dfc979272d1f0913cc9f66540d7e8005811109e1cf2d887c22bd8750d34016ac3c66b5ff102dacdd73f6b014e710b51e8022af9a1968ffd70157e48063fc33c97a050f7f640233bf646cc98d9524c6b92bcf3ab56f839867cc5f7f196b93bae1e27e6320742445d290f2263827498b54fec539f756afcefad4e508c098b9a7e1d8feb19955fb02ba9675585078710969d3440f5054e0f9dc3e7fe016e050eff260334f18a5d4fe391d82092319f5964f2e2eb7c1c3a5f8b13a49e282f609c317a833fb8d976d11517c571d1221a265d25af778ecf8923490c6ceeb450aecdc82e28293031d10c7d73bf85e57bf041a97360aa2c5d99cc1df82d9c4b87413eae2ef048f94b4d3554cea73d92b0f7af96e0271c691e2bb5c67add7c6caf302256adedf7ab114da0acfe870d449a3a489f781d659e8beccda7bce9f4e8618b6bd2f4132ce798cdc7a60e7e1460a7299e3c6342a579626d22733e50f526ec2fa19a22b31e8ed50f23cd1fdf94c9154ed3a7609a2f1ff981fe1d3b5c807b281e4683cc6d6315cf95b9ade8641defcb32372f1c126e398ef7a5a2dce0a8a7f68bb74560f8f71837c2c2ebbcbf7fffb42ae1896f13f7c7479a0b46a28b6f55540f89444f63de0378e3d121be09e06cc9ded1c20e65876d36aa0c65e9645644786b620e2dd2ad648ddfcbf4a7e5b1a3a4ecfe7f64667a3f0b7e2f4418588ed35a2458cffeb39b93d26f18d2ab13bdce6aee58e7b99359ec2dfd95a9c16dc00d6ef18b7933a6f8dc65ccb55667138776f7dea101070dc8796e3774df84f40ae0c8229d0d6069e5c8f39a7c299677a09d367fc7b05e3bc380ee652cdc72595f74c7b1043d0e1ffbab734648c838dfb0527d971b602bc216c9619ef0abf5ac974a1ed57f4050aa510dd9c74f508277b39d7973bb2dfccc5eeb0618d53cee4e252442dad999b85c644aa0a6fd8bca90f35f1a5ae696cb8d9eb5a35be"; + (bool success, bytes memory retVal) = address(mips).call(input); + bytes memory expectedRetVal = hex"03dacdac4e61d89774a305dd0828063706ad878bb6353c0c2cd787d1e5cddd67"; + + assertTrue(success); + assertEq(retVal.length, 32, "Expect a bytes32 hash of the post-state to be returned"); + assertEq(retVal, expectedRetVal); + } + function test_step_abi_succeeds() external { uint32[32] memory registers; registers[16] = 0xbfff0000; @@ -43,6 +66,32 @@ contract MIPS_Test is CommonTest { assertNotEq(postState, bytes32(0)); } + /// @notice Tests that the mips step function fails when the value of the exited field is + /// invalid (anything greater than 1). + function test_step_invalidExitedValue_fails() external { + // Bound to invalid exited values. + for (uint8 exited = 2; exited <= type(uint8).max && exited != 0;) { + // Rest of this stuff doesn't matter very much, just setting up some state to edit. + // Here just using the parameters for the ADD test below. + uint32 insn = encodespec(17, 18, 8, 0x20); + (MIPS.State memory state, bytes memory proof) = constructMIPSState(0, insn, 0x4, 0); + + // Compute the encoded state and manipulate it. + bytes memory enc = encodeState(state); + assembly { + // Push offset by an additional 32 bytes (0x20) to account for length prefix + mstore8(add(add(enc, 0x20), 89), exited) + } + + // Call the step function and expect a revert. + vm.expectRevert(InvalidExitedValue.selector); + mips.step(enc, proof, 0); + unchecked { + exited++; + } + } + } + function test_add_succeeds() external { uint32 insn = encodespec(17, 18, 8, 0x20); // add t0, s1, s2 (MIPS.State memory state, bytes memory proof) = constructMIPSState(0, insn, 0x4, 0); @@ -1226,15 +1275,46 @@ contract MIPS_Test is CommonTest { function test_srav_succeeds() external { uint32 insn = encodespec(0xa, 0x9, 0x8, 7); // srav t0, t1, t2 (MIPS.State memory state, bytes memory proof) = constructMIPSState(0, insn, 0x4, 0); - state.registers[9] = 0x20_00; // t1 - state.registers[10] = 4; // t2 + state.registers[9] = 0xdeafbeef; // t1 + state.registers[10] = 12; // t2 MIPS.State memory expect; expect.memRoot = state.memRoot; expect.pc = state.nextPC; expect.nextPC = state.nextPC + 4; expect.step = state.step + 1; - expect.registers[8] = state.registers[9] >> state.registers[10]; // t0 + expect.registers[8] = 0xfffdeafb; // t0 + expect.registers[9] = state.registers[9]; + expect.registers[10] = state.registers[10]; + + bytes memory enc = encodeState(state); + bytes32 postState = mips.step(enc, proof, 0); + assertEq(postState, outputState(expect), "unexpected post state"); + } + + /// @notice Tests that the SRAV instruction succeeds when it includes extra bits in the shift + /// amount beyond the lower 5 bits that are actually used for the shift. Extra bits + /// need to be ignored but the instruction should still succeed. + /// @param _rs Value to set in the shift register $rs. + function testFuzz_srav_withExtraBits_succeeds(uint32 _rs) external { + // Assume + // Force _rs to have more than 5 bits set. + _rs = uint32(bound(uint256(_rs), 0x20, type(uint32).max)); + + uint32 insn = encodespec(0xa, 0x9, 0x8, 7); // srav t0, t1, t2 + (MIPS.State memory state, bytes memory proof) = constructMIPSState(0, insn, 0x4, 0); + state.registers[9] = 0xdeadbeef; // t1 + state.registers[10] = _rs; // t2 + + // Calculate shamt + uint32 shamt = state.registers[10] & 0x1F; + + MIPS.State memory expect; + expect.memRoot = state.memRoot; + expect.pc = state.nextPC; + expect.nextPC = state.nextPC + 4; + expect.step = state.step + 1; + expect.registers[8] = MIPSInstructions.signExtend(state.registers[9] >> shamt, 32 - shamt); // t0 expect.registers[9] = state.registers[9]; expect.registers[10] = state.registers[10]; @@ -1411,6 +1491,64 @@ contract MIPS_Test is CommonTest { assertEq(postState, outputState(expect), "unexpected post state"); } + function test_mmap_succeeds_justWithinMemLimit() external { + uint32 insn = 0x0000000c; // syscall + (bytes32 memRoot, bytes memory proof) = ffi.getCannonMemoryProof(0, insn); + + MIPS.State memory state; + state.memRoot = memRoot; + state.nextPC = 4; + state.heap = sys.HEAP_END - 4096; // Set up to increase heap to its limit + state.registers[2] = 4090; // mmap syscall + state.registers[4] = 0x0; // a0 + state.registers[5] = 4095; // a1 + bytes memory encodedState = encodeState(state); + + MIPS.State memory expect; + expect.memRoot = state.memRoot; + // assert page allocation is aligned to 4k + expect.step = state.step + 1; + expect.pc = state.nextPC; + expect.nextPC = state.nextPC + 4; + expect.heap = sys.HEAP_END; + expect.registers[2] = state.heap; // Return the old heap value + expect.registers[7] = 0; // No error + expect.registers[4] = state.registers[4]; // a0 + expect.registers[5] = state.registers[5]; // a1 + + bytes32 postState = mips.step(encodedState, proof, 0); + assertEq(postState, outputState(expect), "unexpected post state"); + } + + function test_mmap_fails() external { + uint32 insn = 0x0000000c; // syscall + (bytes32 memRoot, bytes memory proof) = ffi.getCannonMemoryProof(0, insn); + + MIPS.State memory state; + state.memRoot = memRoot; + state.nextPC = 4; + state.heap = sys.HEAP_END - 4096; // Set up to increase heap beyond its limit + state.registers[2] = 4090; // mmap syscall + state.registers[4] = 0x0; // a0 + state.registers[5] = 4097; // a1 + bytes memory encodedState = encodeState(state); + + MIPS.State memory expect; + expect.memRoot = state.memRoot; + // assert page allocation is aligned to 4k + expect.step = state.step + 1; + expect.pc = state.nextPC; + expect.nextPC = state.nextPC + 4; + expect.heap = state.heap; + expect.registers[2] = sys.SYS_ERROR_SIGNAL; // signal an stdError + expect.registers[7] = sys.EINVAL; // Return error value + expect.registers[4] = state.registers[4]; // a0 + expect.registers[5] = state.registers[5]; // a1 + + bytes32 postState = mips.step(encodedState, proof, 0); + assertEq(postState, outputState(expect), "unexpected post state"); + } + function test_brk_succeeds() external { uint32 insn = 0x0000000c; // syscall (MIPS.State memory state, bytes memory proof) = constructMIPSState(0, insn, 0x4, 0); @@ -1470,7 +1608,7 @@ contract MIPS_Test is CommonTest { function test_fcntl_succeeds() external { uint32 insn = 0x0000000c; // syscall (MIPS.State memory state, bytes memory proof) = constructMIPSState(0, insn, 0x4, 0); - state.registers[2] = 4055; // fnctl syscall + state.registers[2] = 4055; // fcntl syscall state.registers[4] = 0x0; // a0 state.registers[5] = 0x3; // a1 @@ -1527,7 +1665,26 @@ contract MIPS_Test is CommonTest { for (uint256 i = 0; i < proof.length; i++) { proof[i] = 0x0; } - vm.expectRevert(hex"000000000000000000000000000000000000000000000000000000000badf00d"); + vm.expectRevert(InvalidMemoryProof.selector); + mips.step(encodeState(state), proof, 0); + } + + function test_invalid_root_different_leaf_fails() external { + uint32 insn = 0x0000000c; // syscall + + // Initialize the state, though for the proof, use valid proofs for the instruction + // and the memory address, but for a different leaf that does not contain the + // instruction @ pc nor the memory address being read. + uint32 pc = 0; + MIPS.State memory state; + bytes memory proof; + (state.memRoot, proof) = ffi.getCannonMemoryProofWrongLeaf(pc, insn, 0x4, 0); + state.pc = pc; + state.nextPC = pc + 4; + state.registers[2] = 4246; // exit_group syscall + state.registers[4] = 0x5; // a0 + + vm.expectRevert(InvalidMemoryProof.selector); mips.step(encodeState(state), proof, 0); } diff --git a/packages/contracts-bedrock/test/cannon/MIPS2.t.sol b/packages/contracts-bedrock/test/cannon/MIPS2.t.sol new file mode 100644 index 000000000000..4c02d7a0bdd1 --- /dev/null +++ b/packages/contracts-bedrock/test/cannon/MIPS2.t.sol @@ -0,0 +1,2846 @@ +// SPDX-License-Identifier: MIT +pragma solidity 0.8.15; + +import { CommonTest } from "test/setup/CommonTest.sol"; +import { MIPS2 } from "src/cannon/MIPS2.sol"; +import { PreimageOracle } from "src/cannon/PreimageOracle.sol"; +import { MIPSSyscalls as sys } from "src/cannon/libraries/MIPSSyscalls.sol"; +import { MIPSInstructions as ins } from "src/cannon/libraries/MIPSInstructions.sol"; +import "src/dispute/lib/Types.sol"; +import { InvalidExitedValue, InvalidMemoryProof, InvalidSecondMemoryProof } from "src/cannon/libraries/CannonErrors.sol"; + +contract ThreadStack { + bytes32 internal constant EMPTY_THREAD_ROOT = hex"ad3228b676f7d3cd4284a5443f17f1962b36e491b30a40b2405849e597ba5fb5"; + + struct Entry { + MIPS2.ThreadState thread; + bytes32 root; + } + + Entry[] internal stack; + + constructor() { + stack.push(); + stack[stack.length - 1].root = EMPTY_THREAD_ROOT; + } + + function root() public view returns (bytes32) { + return stack[stack.length - 1].root; + } + + function inner(uint256 _i) public view returns (bytes32 root_) { + root_ = stack[stack.length - 1 - _i].root; + } + + function top() public view returns (MIPS2.ThreadState memory thread_) { + thread_ = peek(0); + } + + function peek(uint256 _i) public view returns (MIPS2.ThreadState memory thread_) { + thread_ = stack[stack.length - 1 - _i].thread; + } + + function push(MIPS2.ThreadState memory _thread) public { + _push(_thread); + } + + function pop() public { + stack.pop(); + } + + function replace(MIPS2.ThreadState memory _thread) public { + stack.pop(); + _push(_thread); + } + + function _push(MIPS2.ThreadState memory _thread) internal { + bytes32 newRoot = keccak256(abi.encodePacked(stack[stack.length - 1].root, keccak256(encodeThread(_thread)))); + stack.push(Entry(_thread, newRoot)); + } +} + +contract Threading { + ThreadStack public left; + ThreadStack public right; + bool public traverseRight; + uint32 public nextThreadID; + + constructor() { + left = new ThreadStack(); + right = new ThreadStack(); + traverseRight = false; + } + + function createThread() public returns (MIPS2.ThreadState memory thread_) { + thread_.threadID = nextThreadID; + if (traverseRight) { + right.push(thread_); + } else { + left.push(thread_); + } + nextThreadID += 1; + } + + function current() public view returns (MIPS2.ThreadState memory out_) { + if (traverseRight) { + out_ = right.top(); + } else { + out_ = left.top(); + } + } + + function replaceCurrent(MIPS2.ThreadState memory _thread) public { + if (traverseRight) { + right.replace(_thread); + } else { + left.replace(_thread); + } + } + + function witness() public view returns (bytes memory out_) { + if (traverseRight) { + out_ = abi.encodePacked(encodeThread(right.top()), right.inner(1)); + } else { + out_ = abi.encodePacked(encodeThread(left.top()), left.inner(1)); + } + } + + function setTraverseRight(bool _traverseRight) public { + traverseRight = _traverseRight; + } +} + +contract MIPS2_Test is CommonTest { + MIPS2 internal mips; + PreimageOracle internal oracle; + Threading internal threading; + + // keccak256(bytes32(0) ++ bytes32(0)) + bytes32 internal constant EMPTY_THREAD_ROOT = hex"ad3228b676f7d3cd4284a5443f17f1962b36e491b30a40b2405849e597ba5fb5"; + + uint32 internal constant A0_REG = 4; + uint32 internal constant A1_REG = 5; + uint32 internal constant A2_REG = 6; + uint32 internal constant A3_REG = 7; + uint32 internal constant SP_REG = 29; + + function setUp() public virtual override { + super.setUp(); + oracle = new PreimageOracle(0, 0); + mips = new MIPS2(oracle); + threading = new Threading(); + vm.store(address(mips), 0x0, bytes32(abi.encode(address(oracle)))); + vm.label(address(oracle), "PreimageOracle"); + vm.label(address(mips), "MIPS2"); + vm.label(address(threading), "Threading"); + } + + /// @notice Used to debug step() behavior given a specific input. + /// This is useful to more easily debug non-forge tests. + /// For example, in cannon/mipsevm/evm_test.go step input can be pulled here: + /// https://github.com/ethereum-optimism/optimism/blob/1f64dd6db5561f3bb76ed1d1ffdaff0cde9b7c4b/cannon/mipsevm/evm_test.go#L80-L80 + function test_mips2_step_debug_succeeds() external { + bytes memory input = + hex"e14ced3200000000000000000000000000000000000000000000000000000000000000600000000000000000000000000000000000000000000000000000000000000140000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000acab5a39c6f974b22302e96dcdef1815483eaf580639bb1ee7ac98267afac2bf1ac041d3ff12045b73c86e4ff95ff662a5eee82abdf44a2d0b75fb180daf48a79e3143a81fa7c3d90b000000000000000000000078fc2ffac2fd940100000000000080c8ffffffff006504aeffb6e08baf3f85da5476a9160fa8f9f188a722fdd29268b0cbaf596736ad3228b676f7d3cd4284a5443f17f1962b36e491b30a40b2405849e597ba5fb500000001000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000007c6000000000000ffffffff000000000000000000000000f1f85ff4f1f85ff8506d442dbb3938f83eb60825a7ecbff2000010185e1a31f600050f0000000064a7c3d90be5acea102ad7bda149e0bfd0e7111c77d98b335645e665389becadf140ef999cc64fbd7f04799e85c97dadc5cca510bd5b3d97166d1aec28829f3dd43d8cf1f9358e4103b16d09d466e2c7c048ea3ba1aef3141e700270581aa0b75b50e34fc926bb2d83ad3228b676f7d3cd4284a5443f17f1962b36e491b30a40b2405849e597ba5fb500000000000000000000000000000000000000000000000c00000000000000000000000000000000000000000000000000000000000000000000000000000000ad3228b676f7d3cd4284a5443f17f1962b36e491b30a40b2405849e597ba5fb5b4c11951957c6f8f642c4af61cd6b24640fec6dc7fc607ee8206a99e92410d3021ddb9a356815c3fac1026b6dec5df3124afbadb485c9ba5a3e3398a04b7ba85e58769b32a1beaf1ea27375a44095a0d1fb664ce2dd358e7fcbfb78c26a193440eb01ebfc9ed27500cd4dfc979272d1f0913cc9f66540d7e8005811109e1cf2d887c22bd8750d34016ac3c66b5ff102dacdd73f6b014e710b51e8022af9a1968ffd70157e48063fc33c97a050f7f640233bf646cc98d9524c6b92bcf3ab56f839867cc5f7f196b93bae1e27e6320742445d290f2263827498b54fec539f756afcefad4e508c098b9a7e1d8feb19955fb02ba9675585078710969d3440f5054e0f9dc3e7fe016e050eff260334f18a5d4fe391d82092319f5964f2e2eb7c1c3a5f8b13a49e282f609c317a833fb8d976d11517c571d1221a265d25af778ecf8923490c6ceeb450aecdc82e28293031d10c7d73bf85e57bf041a97360aa2c5d99cc1df82d9c4b87413eae2ef048f94b4d3554cea73d92b0f7af96e0271c691e2bb5c67add7c6caf302256adedf7ab114da0acfe870d449a3a489f781d659e8beccda7bce9f4e8618b6bd2f4132ce798cdc7a60e7e1460a7299e3c6342a579626d22733e50f526ec2fa19a22b31e8ed50f23cd1fdf94c9154ed3a7609a2f1ff981fe1d3b5c807b281e4683cc6d6315cf95b9ade8641defcb32372f1c126e398ef7a5a2dce0a8a7f68bb74560f8f71837c2c2ebbcbf7fffb42ae1896f13f7c7479a0b46a28b6f55540f89444f63de0378e3d121be09e06cc9ded1c20e65876d36aa0c65e9645644786b620e2dd2ad648ddfcbf4a7e5b1a3a4ecfe7f64667a3f0b7e2f4418588ed35a2458cffeb39b93d26f18d2ab13bdce6aee58e7b99359ec2dfd95a9c16dc00d6ef18b7933a6f8dc65ccb55667138776f7dea101070dc8796e3774df84f40ae0c8229d0d6069e5c8f39a7c299677a09d367fc7b05e3bc380ee652cdc72595f74c7b1043d0e1ffbab734648c838dfb0527d971b602bc216c9619ef0abf5ac974a1ed57f4050aa510dd9c74f508277b39d7973bb2dfccc5eeb0618db8cd74046ff337f0a7bf2c8e03e10f642c1886798d71806ab1e888d9e5ee87d000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000"; + (bool success, bytes memory retVal) = address(mips).call(input); + bytes memory expectedRetVal = hex"0335fe4205f8443eefa7ac4541197874224df35e8536158c2fc2d5c8c2d2adb4"; + + assertTrue(success); + assertEq(retVal.length, 32, "Expect a bytes32 hash of the post-state to be returned"); + assertEq(retVal, expectedRetVal); + } + + function test_stepABI_succeeds() public { + uint32[32] memory registers; + registers[0] = 0xdeadbeef; + registers[16] = 0xbfff0000; + registers[31] = 0x0badf00d; + MIPS2.ThreadState memory thread = MIPS2.ThreadState({ + threadID: 0, + exitCode: 0, + exited: false, + futexAddr: sys.FUTEX_EMPTY_ADDR, + futexVal: 0, + futexTimeoutStep: 0, + pc: 4, + nextPC: 8, + lo: 0, + hi: 0, + registers: registers + }); + bytes memory encodedThread = encodeThread(thread); + bytes memory threadWitness = abi.encodePacked(encodedThread, EMPTY_THREAD_ROOT); + bytes32 threadRoot = keccak256(abi.encodePacked(EMPTY_THREAD_ROOT, keccak256(encodedThread))); + + MIPS2.State memory state = MIPS2.State({ + memRoot: hex"30be14bdf94d7a93989a6263f1e116943dc052d584730cae844bf330dfddce2f", + preimageKey: bytes32(0), + preimageOffset: 0, + heap: 0, + llReservationActive: false, + llAddress: 0, + llOwnerThread: 0, + exitCode: 0, + exited: false, + step: 1, + stepsSinceLastContextSwitch: 1, + wakeup: sys.FUTEX_EMPTY_ADDR, + traverseRight: false, + leftThreadStack: threadRoot, + rightThreadStack: EMPTY_THREAD_ROOT, + nextThreadID: 1 + }); + bytes memory memProof = + hex"3c10bfff3610fff0341100013c08ffff3508fffd34090003010950202d420001ae020008ae11000403e000080000000000000000000000000000000000000000ad3228b676f7d3cd4284a5443f17f1962b36e491b30a40b2405849e597ba5fb5b4c11951957c6f8f642c4af61cd6b24640fec6dc7fc607ee8206a99e92410d3021ddb9a356815c3fac1026b6dec5df3124afbadb485c9ba5a3e3398a04b7ba85e58769b32a1beaf1ea27375a44095a0d1fb664ce2dd358e7fcbfb78c26a193440eb01ebfc9ed27500cd4dfc979272d1f0913cc9f66540d7e8005811109e1cf2d887c22bd8750d34016ac3c66b5ff102dacdd73f6b014e710b51e8022af9a1968ffd70157e48063fc33c97a050f7f640233bf646cc98d9524c6b92bcf3ab56f839867cc5f7f196b93bae1e27e6320742445d290f2263827498b54fec539f756afcefad4e508c098b9a7e1d8feb19955fb02ba9675585078710969d3440f5054e0f9dc3e7fe016e050eff260334f18a5d4fe391d82092319f5964f2e2eb7c1c3a5f8b13a49e282f609c317a833fb8d976d11517c571d1221a265d25af778ecf8923490c6ceeb450aecdc82e28293031d10c7d73bf85e57bf041a97360aa2c5d99cc1df82d9c4b87413eae2ef048f94b4d3554cea73d92b0f7af96e0271c691e2bb5c67add7c6caf302256adedf7ab114da0acfe870d449a3a489f781d659e8beccda7bce9f4e8618b6bd2f4132ce798cdc7a60e7e1460a7299e3c6342a579626d22733e50f526ec2fa19a22b31e8ed50f23cd1fdf94c9154ed3a7609a2f1ff981fe1d3b5c807b281e4683cc6d6315cf95b9ade8641defcb32372f1c126e398ef7a5a2dce0a8a7f68bb74560f8f71837c2c2ebbcbf7fffb42ae1896f13f7c7479a0b46a28b6f55540f89444f63de0378e3d121be09e06cc9ded1c20e65876d36aa0c65e9645644786b620e2dd2ad648ddfcbf4a7e5b1a3a4ecfe7f64667a3f0b7e2f4418588ed35a2458cffeb39b93d26f18d2ab13bdce6aee58e7b99359ec2dfd95a9c16dc00d6ef18b7933a6f8dc65ccb55667138776f7dea101070dc8796e3774df84f40ae0c8229d0d6069e5c8f39a7c299677a09d367fc7b05e3bc380ee652cdc72595f74c7b1043d0e1ffbab734648c838dfb0527d971b602bc216c9619ef0abf5ac974a1ed57f4050aa510dd9c74f508277b39d7973bb2dfccc5eeb0618db8cd74046ff337f0a7bf2c8e03e10f642c1886798d71806ab1e888d9e5ee87d00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000"; + bytes32 post = mips.step(encodeState(state), bytes.concat(threadWitness, memProof), 0); + assertNotEq(post, bytes32(0)); + } + + /// @notice Tests that the mips step function fails when the value of the exited field is + /// invalid (anything greater than 1). + function test_step_invalidExitedValueInState_fails() external { + // Bound to invalid exited values. + for (uint8 exited = 2; exited <= type(uint8).max && exited != 0;) { + // Setup state + uint32 insn = encodespec(17, 18, 8, 0x20); // Arbitrary instruction: add t0, s1, s2 + (MIPS2.State memory state, MIPS2.ThreadState memory thread, bytes memory memProof) = + constructMIPSState(0, insn, 0x4, 0); + + // Set up step data + bytes memory encodedThread = encodeThread(thread); + bytes memory threadWitness = abi.encodePacked(encodedThread, EMPTY_THREAD_ROOT); + bytes memory proofData = bytes.concat(threadWitness, memProof); + bytes memory stateData = encodeState(state); + assembly { + // Manipulate state data + // Push offset by an additional 32 bytes (0x20) to account for length prefix + mstore8(add(add(stateData, 0x20), 82), exited) + } + + // Call the step function and expect a revert. + vm.expectRevert(InvalidExitedValue.selector); + mips.step(stateData, proofData, 0); + unchecked { + exited++; + } + } + } + + function test_invalidThreadWitness_reverts() public { + MIPS2.State memory state; + MIPS2.ThreadState memory thread; + bytes memory memProof; + bytes memory witness = abi.encodePacked(encodeThread(thread), EMPTY_THREAD_ROOT); + vm.expectRevert("invalid thread witness"); + mips.step(encodeState(state), bytes.concat(witness, memProof), 0); + } + + function test_syscallNanosleep_succeeds() public { + uint32 insn = 0x0000000c; // syscall + (MIPS2.State memory state, MIPS2.ThreadState memory thread, bytes memory memProof) = + constructMIPSState(0, insn, 0x4, 0); + thread.registers[2] = sys.SYS_NANOSLEEP; + thread.registers[7] = 0xdead; // should be reset to a zero errno + bytes memory threadWitness = abi.encodePacked(encodeThread(thread), EMPTY_THREAD_ROOT); + updateThreadStacks(state, thread); + + MIPS2.ThreadState memory expectThread = copyThread(thread); + expectThread.pc = thread.nextPC; + expectThread.nextPC = thread.nextPC + 4; + expectThread.registers[2] = 0x0; + expectThread.registers[7] = 0x0; + MIPS2.State memory expect = copyState(state); + expect.step = state.step + 1; + expect.stepsSinceLastContextSwitch = 0; + expect.leftThreadStack = EMPTY_THREAD_ROOT; + expect.rightThreadStack = keccak256(abi.encodePacked(EMPTY_THREAD_ROOT, keccak256(encodeThread(expectThread)))); + expect.traverseRight = true; + + bytes32 postState = mips.step(encodeState(state), bytes.concat(threadWitness, memProof), 0); + assertEq(postState, outputState(expect), "unexpected post state"); + } + + function test_syscallSchedYield_succeeds() public { + uint32 insn = 0x0000000c; // syscall + (MIPS2.State memory state, MIPS2.ThreadState memory thread, bytes memory memProof) = + constructMIPSState(0, insn, 0x4, 0); + thread.registers[2] = sys.SYS_SCHED_YIELD; + thread.registers[7] = 0xdead; // should be reset to a zero errno + bytes memory threadWitness = abi.encodePacked(encodeThread(thread), EMPTY_THREAD_ROOT); + updateThreadStacks(state, thread); + + MIPS2.ThreadState memory expectThread = copyThread(thread); + expectThread.pc = thread.nextPC; + expectThread.nextPC = thread.nextPC + 4; + expectThread.registers[2] = 0x0; + expectThread.registers[7] = 0x0; + MIPS2.State memory expect = copyState(state); + expect.step = state.step + 1; + expect.stepsSinceLastContextSwitch = 0; + expect.leftThreadStack = EMPTY_THREAD_ROOT; + expect.rightThreadStack = keccak256(abi.encodePacked(EMPTY_THREAD_ROOT, keccak256(encodeThread(expectThread)))); + expect.traverseRight = true; + + bytes32 postState = mips.step(encodeState(state), bytes.concat(threadWitness, memProof), 0); + assertEq(postState, outputState(expect), "unexpected post state"); + } + + function test_syscallGetTID_succeeds() public { + uint32 insn = 0x0000000c; // syscall + (MIPS2.State memory state, MIPS2.ThreadState memory thread, bytes memory memProof) = + constructMIPSState(0, insn, 0x4, 0); + thread.threadID = 0xbeef; + thread.registers[2] = sys.SYS_GETTID; + thread.registers[7] = 0xdead; + bytes memory threadWitness = abi.encodePacked(encodeThread(thread), EMPTY_THREAD_ROOT); + updateThreadStacks(state, thread); + + MIPS2.ThreadState memory expectThread = copyThread(thread); + expectThread.pc = thread.nextPC; + expectThread.nextPC = thread.nextPC + 4; + expectThread.registers[2] = 0xbeef; + expectThread.registers[7] = 0x0; // errno + MIPS2.State memory expect = copyState(state); + expect.step = state.step + 1; + expect.stepsSinceLastContextSwitch = state.stepsSinceLastContextSwitch + 1; + expect.leftThreadStack = keccak256(abi.encodePacked(EMPTY_THREAD_ROOT, keccak256(encodeThread(expectThread)))); + + bytes32 postState = mips.step(encodeState(state), bytes.concat(threadWitness, memProof), 0); + assertEq(postState, outputState(expect), "unexpected post state"); + } + + function test_syscallClone_succeeds() public { + uint32 insn = 0x0000000c; // syscall + uint32 sp = 0xdead; + + (MIPS2.State memory state, MIPS2.ThreadState memory thread, bytes memory memProof) = + constructMIPSState(0, insn, 0x4, 0); + thread.registers[2] = sys.SYS_CLONE; + thread.registers[A0_REG] = sys.VALID_SYS_CLONE_FLAGS; + thread.registers[A1_REG] = sp; + bytes memory threadWitness = abi.encodePacked(encodeThread(thread), EMPTY_THREAD_ROOT); + updateThreadStacks(state, thread); + + MIPS2.ThreadState memory expectThread = copyThread(thread); + expectThread.pc = thread.nextPC; + expectThread.nextPC = thread.nextPC + 4; + expectThread.registers[2] = state.nextThreadID; + expectThread.registers[7] = 0; + + MIPS2.ThreadState memory newThread = copyThread(thread); + newThread.threadID = 1; + newThread.futexAddr = sys.FUTEX_EMPTY_ADDR; + newThread.futexVal = 0; + newThread.futexTimeoutStep = 0; + newThread.pc = thread.nextPC; + newThread.nextPC = thread.nextPC + 4; + newThread.registers[2] = 0; + newThread.registers[7] = 0; + newThread.registers[SP_REG] = sp; + + MIPS2.State memory expect = copyState(state); + expect.step = state.step + 1; + expect.nextThreadID = 2; + expect.stepsSinceLastContextSwitch = 0; + bytes32 innerThreadRoot = keccak256(abi.encodePacked(EMPTY_THREAD_ROOT, keccak256(encodeThread(expectThread)))); + expect.leftThreadStack = keccak256(abi.encodePacked(innerThreadRoot, keccak256(encodeThread(newThread)))); + + bytes32 postState = mips.step(encodeState(state), bytes.concat(threadWitness, memProof), 0); + assertEq(postState, outputState(expect), "unexpected post state"); + } + + /// @dev Static unit test asserting the VM exits successfully for a clone syscall with invalid clone flags. + function test_syscallClone_invalidCloneFlags_succeeds() public { + uint32 insn = 0x0000000c; // syscall + uint32 sp = 0xdead; + + (MIPS2.State memory state, MIPS2.ThreadState memory thread, bytes memory memProof) = + constructMIPSState(0, insn, 0x4, 0); + thread.registers[2] = sys.SYS_CLONE; + thread.registers[A0_REG] = 0xdead; // invalid flag + thread.registers[A1_REG] = sp; + bytes memory threadWitness = abi.encodePacked(encodeThread(thread), EMPTY_THREAD_ROOT); + updateThreadStacks(state, thread); + + MIPS2.ThreadState memory expectThread = copyThread(thread); + expectThread.pc = thread.nextPC; + expectThread.nextPC = thread.nextPC + 4; + expectThread.registers[2] = state.nextThreadID; + expectThread.registers[7] = 0; + + MIPS2.State memory expect = copyState(state); + expect.step = state.step + 1; + expect.stepsSinceLastContextSwitch = state.step + 1; + expect.exited = true; + expect.exitCode = VMStatuses.PANIC.raw(); + + bytes32 postState = mips.step(encodeState(state), bytes.concat(threadWitness, memProof), 0); + assertEq(postState, outputState(expect), "unexpected post state"); + } + + /// @dev Static unit test asserting successful futex wait syscall behavior with a timeout argument + function test_syscallFutexWaitTimeout_succeeds() public { + uint32 futexAddr = 0x1000; + uint32 futexVal = 0xAA_AA_AA_AA; + uint32 timeout = 1; + + uint32 insn = 0x0000000c; // syscall + (MIPS2.State memory state, MIPS2.ThreadState memory thread, bytes memory memProof) = + constructMIPSState(0, insn, futexAddr, futexVal); + thread.registers[2] = sys.SYS_FUTEX; + thread.registers[A0_REG] = futexAddr; + thread.registers[A1_REG] = sys.FUTEX_WAIT_PRIVATE; + thread.registers[A2_REG] = futexVal; + thread.registers[A3_REG] = timeout; + threading.createThread(); + threading.replaceCurrent(thread); + bytes memory threadWitness = threading.witness(); + finalizeThreadingState(threading, state); + + // FUTEX_WAIT + MIPS2.ThreadState memory expectThread = copyThread(thread); + expectThread.futexAddr = futexAddr; + expectThread.futexVal = futexVal; + expectThread.futexTimeoutStep = state.step + 1 + sys.FUTEX_TIMEOUT_STEPS; + threading.replaceCurrent(expectThread); + + MIPS2.State memory expect = copyState(state); + expect.step = state.step + 1; + expect.stepsSinceLastContextSwitch = state.stepsSinceLastContextSwitch + 1; + finalizeThreadingState(threading, expect); + + bytes32 postState = mips.step(encodeState(state), bytes.concat(threadWitness, memProof), 0); + assertEq(postState, outputState(expect), "unexpected post state"); + } + + /// @dev Static unit test asserting successful futex wait syscall behavior with a zero timeout argument + function test_syscallFutexWaitNoTimeout_succeeds() public { + uint32 futexAddr = 0x1000; + uint32 futexVal = 0xAA_AA_AA_AA; + uint32 timeout = 0; + + uint32 insn = 0x0000000c; // syscall + (MIPS2.State memory state, MIPS2.ThreadState memory thread, bytes memory memProof) = + constructMIPSState(0, insn, futexAddr, futexVal); + thread.registers[2] = sys.SYS_FUTEX; + thread.registers[A0_REG] = futexAddr; + thread.registers[A1_REG] = sys.FUTEX_WAIT_PRIVATE; + thread.registers[A2_REG] = futexVal; + thread.registers[A3_REG] = timeout; + threading.createThread(); + threading.replaceCurrent(thread); + bytes memory threadWitness = threading.witness(); + finalizeThreadingState(threading, state); + + // FUTEX_WAIT + MIPS2.ThreadState memory expectThread = copyThread(thread); + expectThread.futexAddr = futexAddr; + expectThread.futexVal = futexVal; + expectThread.futexTimeoutStep = sys.FUTEX_NO_TIMEOUT; + threading.replaceCurrent(expectThread); + + MIPS2.State memory expect = copyState(state); + expect.step = state.step + 1; + expect.stepsSinceLastContextSwitch = state.stepsSinceLastContextSwitch + 1; + finalizeThreadingState(threading, expect); + + bytes32 postState = mips.step(encodeState(state), bytes.concat(threadWitness, memProof), 0); + assertEq(postState, outputState(expect), "unexpected post state"); + } + + /// @dev Static unit test asserting unsuccessful spurious futex wait syscall + function test_syscallFutexWaitErrno_succeeds() public { + uint32 futexAddr = 0x1000; + uint32 futexVal = 0xAA_AA_AA_AA; + + uint32 insn = 0x0000000c; // syscall + (MIPS2.State memory state, MIPS2.ThreadState memory thread, bytes memory memProof) = + constructMIPSState(0, insn, futexAddr, futexVal); + thread.registers[2] = sys.SYS_FUTEX; + thread.registers[A0_REG] = futexAddr; + thread.registers[A1_REG] = sys.FUTEX_WAIT_PRIVATE; + thread.registers[A2_REG] = 0xBB_BB_BB_BB; + thread.registers[A3_REG] = 0; // timeout + threading.createThread(); + threading.replaceCurrent(thread); + bytes memory threadWitness = threading.witness(); + finalizeThreadingState(threading, state); + + // FUTEX_WAIT + MIPS2.ThreadState memory expectThread = copyThread(thread); + expectThread.pc = thread.nextPC; + expectThread.nextPC = thread.nextPC + 4; + expectThread.futexAddr = sys.FUTEX_EMPTY_ADDR; + expectThread.registers[2] = sys.SYS_ERROR_SIGNAL; + expectThread.registers[7] = sys.EAGAIN; // errno + threading.replaceCurrent(expectThread); + + MIPS2.State memory expect = copyState(state); + expect.step = state.step + 1; + expect.stepsSinceLastContextSwitch = state.stepsSinceLastContextSwitch + 1; + finalizeThreadingState(threading, expect); + + bytes32 postState = mips.step(encodeState(state), bytes.concat(threadWitness, memProof), 0); + assertEq(postState, outputState(expect), "unexpected post state"); + } + + function test_syscallFutexWake_succeeds() public { + uint32 futexAddr = 0x1000; + uint32 insn = 0x0000000c; // syscall + (MIPS2.State memory state, MIPS2.ThreadState memory thread, bytes memory memProof) = + constructMIPSState(0, insn, futexAddr, 0xAA_AA_AA_AA); + thread.threadID = threading.nextThreadID(); + thread.registers[2] = sys.SYS_FUTEX; + thread.registers[A0_REG] = futexAddr; + thread.registers[A1_REG] = sys.FUTEX_WAKE_PRIVATE; + thread.registers[A2_REG] = 1000; // ignored + thread.registers[7] = 0xbeef; // non-zero value to check if it is cleared + threading.createThread(); + threading.replaceCurrent(thread); + bytes memory threadWitness = threading.witness(); + finalizeThreadingState(threading, state); + + // FUTEX_WAKE + threading.left().pop(); + MIPS2.ThreadState memory expectThread = copyThread(thread); + expectThread.pc = thread.nextPC; + expectThread.nextPC = thread.nextPC + 4; + expectThread.registers[2] = 0x0; + expectThread.registers[7] = 0x0; // errno + threading.right().push(expectThread); + + MIPS2.State memory expect = copyState(state); + expect.wakeup = futexAddr; + expect.step = state.step + 1; + expect.stepsSinceLastContextSwitch = 0; + expect.traverseRight = true; + finalizeThreadingState(threading, expect); + + bytes32 postState = mips.step(encodeState(state), bytes.concat(threadWitness, memProof), 0); + assertEq(postState, outputState(expect), "unexpected post state"); + } + + /// @dev Static unit test asserting behavior of exit syscall when there are multiple threads present + function test_syscallExit_multipleThreads_succeeds() public { + uint32 insn = 0x0000000c; // syscall + uint8 exitCode = 4; + + MIPS2.ThreadState memory threadA = threading.createThread(); + threadA.futexAddr = sys.FUTEX_EMPTY_ADDR; + threadA.pc = 0x1000; + threadA.nextPC = 0x1004; + threading.replaceCurrent(threadA); + + MIPS2.ThreadState memory threadB = threading.createThread(); + threadB.futexAddr = sys.FUTEX_EMPTY_ADDR; + threadB.pc = 0x100; + threadB.nextPC = 0x104; + threadB.registers[2] = sys.SYS_EXIT; + threadB.registers[A0_REG] = exitCode; + threading.replaceCurrent(threadB); + bytes memory threadWitness = threading.witness(); + + MIPS2.State memory state; + bytes memory memProof; + (state.memRoot, memProof) = ffi.getCannonMemoryProof(threadB.pc, insn, 0, 0); + state.step = 20; + state.stepsSinceLastContextSwitch = 10; + state.wakeup = sys.FUTEX_EMPTY_ADDR; + finalizeThreadingState(threading, state); + + // state updates + MIPS2.ThreadState memory expectThread = copyThread(threadB); + expectThread.exited = true; + expectThread.exitCode = exitCode; + threading.replaceCurrent(expectThread); + MIPS2.State memory expect = copyState(state); + expect.step = state.step + 1; + expect.stepsSinceLastContextSwitch = state.stepsSinceLastContextSwitch + 1; + finalizeThreadingState(threading, expect); + + bytes32 postState = mips.step(encodeState(state), bytes.concat(threadWitness, memProof), 0); + assertEq(postState, outputState(expect), "unexpected post state"); + } + + /// @dev Static unit test asserting behavior of exit syscall when is a single thread left + function test_syscallExit_lastThread_succeeds() public { + uint32 insn = 0x0000000c; // syscall + uint8 exitCode = 4; + + MIPS2.ThreadState memory thread = threading.createThread(); + thread.futexAddr = sys.FUTEX_EMPTY_ADDR; + thread.pc = 0x1000; + thread.nextPC = 0x1004; + thread.registers[2] = sys.SYS_EXIT; + thread.registers[A0_REG] = exitCode; + threading.replaceCurrent(thread); + bytes memory threadWitness = threading.witness(); + + MIPS2.State memory state; + bytes memory memProof; + (state.memRoot, memProof) = ffi.getCannonMemoryProof(thread.pc, insn, 0, 0); + state.step = 20; + state.stepsSinceLastContextSwitch = 10; + state.wakeup = sys.FUTEX_EMPTY_ADDR; + finalizeThreadingState(threading, state); + + // state updates + MIPS2.ThreadState memory expectThread = copyThread(thread); + expectThread.exited = true; + expectThread.exitCode = exitCode; + threading.replaceCurrent(expectThread); + MIPS2.State memory expect = copyState(state); + expect.step = state.step + 1; + expect.stepsSinceLastContextSwitch = state.stepsSinceLastContextSwitch + 1; + expect.exited = true; + expect.exitCode = exitCode; + finalizeThreadingState(threading, expect); + + bytes32 postState = mips.step(encodeState(state), bytes.concat(threadWitness, memProof), 0); + assertEq(postState, outputState(expect), "unexpected post state"); + } + + function test_syscallGetPid_succeeds() public { + uint32 insn = 0x0000000c; // syscall + (MIPS2.State memory state, MIPS2.ThreadState memory thread, bytes memory memProof) = + constructMIPSState(0, insn, 0x4, 0); + thread.registers[2] = sys.SYS_GETPID; + thread.registers[7] = 0xdead; + bytes memory threadWitness = abi.encodePacked(encodeThread(thread), EMPTY_THREAD_ROOT); + updateThreadStacks(state, thread); + + MIPS2.ThreadState memory expectThread = copyThread(thread); + expectThread.pc = thread.nextPC; + expectThread.nextPC = thread.nextPC + 4; + expectThread.registers[2] = 0x0; + expectThread.registers[7] = 0x0; + MIPS2.State memory expect = copyState(state); + expect.step = state.step + 1; + expect.stepsSinceLastContextSwitch = state.stepsSinceLastContextSwitch + 1; + expect.leftThreadStack = keccak256(abi.encodePacked(EMPTY_THREAD_ROOT, keccak256(encodeThread(expectThread)))); + + bytes32 postState = mips.step(encodeState(state), bytes.concat(threadWitness, memProof), 0); + assertEq(postState, outputState(expect), "unexpected post state"); + } + + /// @dev static unit test asserting that clock_gettime syscall for monotonic time succeeds + function test_syscallClockGettimeMonotonic_succeeds() public { + _test_syscallClockGettime_succeeds(sys.CLOCK_GETTIME_MONOTONIC_FLAG); + } + + /// @dev static unit test asserting that clock_gettime syscall for real time succeeds + function test_syscallClockGettimeRealtime_succeeds() public { + _test_syscallClockGettime_succeeds(sys.CLOCK_GETTIME_REALTIME_FLAG); + } + + function _test_syscallClockGettime_succeeds(uint32 clkid) internal { + uint32 pc = 0; + uint32 insn = 0x0000000c; // syscall + uint32 timespecAddr = 0xb000; + (MIPS2.State memory state, MIPS2.ThreadState memory thread, bytes memory insnAndMemProof) = + constructMIPSState(pc, insn, timespecAddr, 0xbad); + state.step = 100_000_004; + thread.registers[2] = sys.SYS_CLOCKGETTIME; + thread.registers[A0_REG] = clkid; + thread.registers[A1_REG] = timespecAddr; + thread.registers[7] = 0xdead; + + uint32 secs = 0; + uint32 nsecs = 0; + if (clkid == sys.CLOCK_GETTIME_MONOTONIC_FLAG) { + secs = 10; + nsecs = 500; + } + bytes memory threadWitness = abi.encodePacked(encodeThread(thread), EMPTY_THREAD_ROOT); + updateThreadStacks(state, thread); + (, bytes memory memProof2) = ffi.getCannonMemoryProof2(pc, insn, timespecAddr, secs, timespecAddr + 4); + + MIPS2.State memory expect = copyState(state); + (expect.memRoot,) = ffi.getCannonMemoryProof(pc, insn, timespecAddr, secs, timespecAddr + 4, nsecs); + expect.step = state.step + 1; + expect.stepsSinceLastContextSwitch = state.stepsSinceLastContextSwitch + 1; + MIPS2.ThreadState memory expectThread = copyThread(thread); + expectThread.pc = thread.nextPC; + expectThread.nextPC = thread.nextPC + 4; + expectThread.registers[2] = 0x0; + expectThread.registers[7] = 0x0; + expect.leftThreadStack = keccak256(abi.encodePacked(EMPTY_THREAD_ROOT, keccak256(encodeThread(expectThread)))); + + bytes32 postState = mips.step(encodeState(state), bytes.concat(threadWitness, insnAndMemProof, memProof2), 0); + assertEq(postState, outputState(expect), "unexpected post state"); + } + + /// @dev static unit test asserting that clock_gettime syscall for monotonic time succeeds in writing to an + /// unaligned address + function test_syscallClockGettimeMonotonicUnaligned_succeeds() public { + _test_syscallClockGettimeUnaligned_succeeds(sys.CLOCK_GETTIME_MONOTONIC_FLAG); + } + + /// @dev static unit test asserting that clock_gettime syscall for real time succeeds in writing to an + /// unaligned address + function test_syscallClockGettimeRealtimeUnaligned_succeeds() public { + _test_syscallClockGettimeUnaligned_succeeds(sys.CLOCK_GETTIME_REALTIME_FLAG); + } + + function _test_syscallClockGettimeUnaligned_succeeds(uint32 clkid) internal { + uint32 pc = 0; + uint32 insn = 0x0000000c; // syscall + uint32 timespecAddr = 0xb001; + uint32 timespecAddrAligned = 0xb000; + (MIPS2.State memory state, MIPS2.ThreadState memory thread, bytes memory insnAndMemProof) = + constructMIPSState(pc, insn, timespecAddrAligned, 0xbad); + state.step = 100_000_004; + thread.registers[2] = sys.SYS_CLOCKGETTIME; + thread.registers[A0_REG] = clkid; + thread.registers[A1_REG] = timespecAddr; + thread.registers[7] = 0xdead; + + uint32 secs = 0; + uint32 nsecs = 0; + if (clkid == sys.CLOCK_GETTIME_MONOTONIC_FLAG) { + secs = 10; + nsecs = 500; + } + bytes memory threadWitness = abi.encodePacked(encodeThread(thread), EMPTY_THREAD_ROOT); + updateThreadStacks(state, thread); + (, bytes memory memProof2) = + ffi.getCannonMemoryProof2(pc, insn, timespecAddrAligned, secs, timespecAddrAligned + 4); + + MIPS2.State memory expect = copyState(state); + (expect.memRoot,) = + ffi.getCannonMemoryProof(pc, insn, timespecAddrAligned, secs, timespecAddrAligned + 4, nsecs); + expect.step = state.step + 1; + expect.stepsSinceLastContextSwitch = state.stepsSinceLastContextSwitch + 1; + MIPS2.ThreadState memory expectThread = copyThread(thread); + expectThread.pc = thread.nextPC; + expectThread.nextPC = thread.nextPC + 4; + expectThread.registers[2] = 0x0; + expectThread.registers[7] = 0x0; + expect.leftThreadStack = keccak256(abi.encodePacked(EMPTY_THREAD_ROOT, keccak256(encodeThread(expectThread)))); + + bytes32 postState = mips.step(encodeState(state), bytes.concat(threadWitness, insnAndMemProof, memProof2), 0); + assertEq(postState, outputState(expect), "unexpected post state"); + } + + /// @dev Test asserting that an clock_gettime monotonic syscall reverts on an invalid memory proof + function test_syscallClockGettimeMonotonicInvalidProof_reverts() public { + _test_syscallClockGettimeInvalidProof_reverts(sys.CLOCK_GETTIME_MONOTONIC_FLAG); + } + + /// @dev Test asserting that an clock_gettime realtime syscall reverts on an invalid memory proof + function test_syscallClockGettimeRealtimeInvalidProof_reverts() public { + _test_syscallClockGettimeInvalidProof_reverts(sys.CLOCK_GETTIME_REALTIME_FLAG); + } + + function _test_syscallClockGettimeInvalidProof_reverts(uint32 clkid) internal { + // NOTE: too slow to run this test under the forge fuzzer. + for (uint256 proofIndex = 896 + (32 * 2); proofIndex < 896 * 2; proofIndex += 32) { + // proofIndex points to a leaf in the index in the memory proof (in insnAndMemProof) that will be zeroed. + // Note that the second leaf in the memory proof is already zeroed because it's the sibling of the first + // memory write. So start from the third leaf. + + uint32 secs = 0; + if (clkid == sys.CLOCK_GETTIME_MONOTONIC_FLAG) { + secs = 10; + } + uint32 pc = 0; + uint32 insn = 0x0000000c; // syscall + uint32 timespecAddr = 0xb000; + (MIPS2.State memory state, MIPS2.ThreadState memory thread, bytes memory insnAndMemProof) = + constructMIPSState(pc, insn, timespecAddr, 0xbad); + state.step = 100_000_004; + thread.registers[2] = sys.SYS_CLOCKGETTIME; + thread.registers[A0_REG] = sys.CLOCK_GETTIME_MONOTONIC_FLAG; + thread.registers[A1_REG] = timespecAddr; + thread.registers[7] = 0xdead; + bytes memory threadWitness = abi.encodePacked(encodeThread(thread), EMPTY_THREAD_ROOT); + updateThreadStacks(state, thread); + (, bytes memory memProof2) = ffi.getCannonMemoryProof2(pc, insn, timespecAddr, secs, timespecAddr + 4); + + bytes memory invalidInsnAndMemProof = new bytes(insnAndMemProof.length); + for (uint256 i = 0; i < invalidInsnAndMemProof.length; i++) { + // clear the 32-byte insn leaf + if (i >= proofIndex && i < proofIndex + 32) { + invalidInsnAndMemProof[i] = 0x0; + } else { + invalidInsnAndMemProof[i] = insnAndMemProof[i]; + } + } + vm.expectRevert(InvalidMemoryProof.selector); + mips.step(encodeState(state), bytes.concat(threadWitness, invalidInsnAndMemProof, memProof2), 0); + + (, bytes memory invalidMemProof2) = + ffi.getCannonMemoryProof2(pc, insn, timespecAddr, secs + 1, timespecAddr + 4); + vm.expectRevert(InvalidSecondMemoryProof.selector); + mips.step(encodeState(state), bytes.concat(threadWitness, insnAndMemProof, invalidMemProof2), 0); + } + } + + /// @dev static unit test asserting that clock_gettime syscall for non-realtime, non-monotonic time succeeds + function test_syscallClockGettimeOtherFlags_succeeds() public { + uint32 pc = 0; + uint32 insn = 0x0000000c; // syscall + uint32 timespecAddr = 0xb000; + (MIPS2.State memory state, MIPS2.ThreadState memory thread, bytes memory insnAndMemProof) = + constructMIPSState(pc, insn, timespecAddr, 0xbad); + state.step = (sys.HZ * 10 + 5) - 1; + thread.registers[2] = sys.SYS_CLOCKGETTIME; + thread.registers[A0_REG] = sys.CLOCK_GETTIME_MONOTONIC_FLAG + 1; + thread.registers[A1_REG] = timespecAddr; + thread.registers[7] = 0xdead; + bytes memory threadWitness = abi.encodePacked(encodeThread(thread), EMPTY_THREAD_ROOT); + updateThreadStacks(state, thread); + + MIPS2.ThreadState memory expectThread = copyThread(thread); + expectThread.pc = thread.nextPC; + expectThread.nextPC = thread.nextPC + 4; + expectThread.registers[2] = sys.SYS_ERROR_SIGNAL; + expectThread.registers[7] = sys.EINVAL; + MIPS2.State memory expect = copyState(state); + expect.step = state.step + 1; + expect.stepsSinceLastContextSwitch = state.stepsSinceLastContextSwitch + 1; + expect.leftThreadStack = keccak256(abi.encodePacked(EMPTY_THREAD_ROOT, keccak256(encodeThread(expectThread)))); + + bytes32 postState = mips.step(encodeState(state), bytes.concat(threadWitness, insnAndMemProof), 0); + assertEq(postState, outputState(expect), "unexpected post state"); + } + + /// @dev Static unit test asserting that VM preempts threads after a certain number of steps + function test_threadQuantumSchedule_succeeds() public { + MIPS2.ThreadState memory threadA = threading.createThread(); + threadA.threadID = 0; + threadA.futexAddr = sys.FUTEX_EMPTY_ADDR; + threading.replaceCurrent(threadA); + MIPS2.ThreadState memory threadB = threading.createThread(); + threadB.futexAddr = sys.FUTEX_EMPTY_ADDR; + threading.replaceCurrent(threadB); + MIPS2.State memory state; + state.wakeup = sys.FUTEX_EMPTY_ADDR; + state.stepsSinceLastContextSwitch = sys.SCHED_QUANTUM; + finalizeThreadingState(threading, state); + bytes memory threadWitness = threading.witness(); + + // Preempt the current thread after the quantum + threading.left().pop(); + threading.right().push(threadB); + + MIPS2.State memory expect = copyState(state); + expect.step = state.step + 1; + expect.stepsSinceLastContextSwitch = 0; + finalizeThreadingState(threading, expect); + + bytes memory memProof; // unused + bytes32 postState = mips.step(encodeState(state), bytes.concat(threadWitness, memProof), 0); + assertEq(postState, outputState(expect), "unexpected post state"); + } + + /// @dev Static unit test asserting thread left traversal without wakeups + function test_threadTraverseLeft_succeeds() public { + MIPS2.State memory state; + state.wakeup = sys.FUTEX_EMPTY_ADDR; + state.step = 10; + state.stepsSinceLastContextSwitch = 0; + finalizeThreadingState(threading, state); + + uint32 pc = 0x4000; + uint32 insn = 0x0000000c; // syscall + bytes memory memProof; + (state.memRoot, memProof) = ffi.getCannonMemoryProof(pc, insn); + + // Create a few threads + for (uint256 i = 0; i < 3; i++) { + MIPS2.ThreadState memory thread = threading.createThread(); + thread.pc = pc; + thread.nextPC = pc + 4; + thread.futexAddr = sys.FUTEX_EMPTY_ADDR; + thread.registers[2] = sys.SYS_NANOSLEEP; + threading.replaceCurrent(thread); + } + finalizeThreadingState(threading, state); + + // Traverse left + for (uint256 i = 0; i < 3; i++) { + MIPS2.ThreadState memory currentThread = threading.current(); + bytes memory threadWitness = threading.witness(); + + // thread stack updates + currentThread.pc = currentThread.nextPC; + currentThread.nextPC = currentThread.nextPC + 4; + currentThread.registers[2] = 0x0; + currentThread.registers[7] = 0x0; + threading.left().pop(); + threading.right().push(currentThread); + + MIPS2.State memory expect = copyState(state); + expect.step = state.step + 1; + expect.stepsSinceLastContextSwitch = 0; + finalizeThreadingState(threading, expect); + expect.traverseRight = i == 2; + + bytes32 postState = mips.step(encodeState(state), bytes.concat(threadWitness, memProof), 0); + assertEq(postState, outputState(expect), "unexpected post state"); + + state = expect; + } + } + + /// @dev Static unit test asserting thread right traversal without wakeups + function test_threadTraverseRight_succeeds() public { + threading.setTraverseRight(true); + + MIPS2.State memory state; + state.wakeup = sys.FUTEX_EMPTY_ADDR; + state.step = 10; + state.stepsSinceLastContextSwitch = 0; + state.traverseRight = true; + finalizeThreadingState(threading, state); + + uint32 pc = 0x4000; + uint32 insn = 0x0000000c; // syscall + bytes memory memProof; + (state.memRoot, memProof) = ffi.getCannonMemoryProof(pc, insn); + + // Create a few threads + for (uint256 i = 0; i < 3; i++) { + MIPS2.ThreadState memory thread = threading.createThread(); + thread.pc = pc; + thread.nextPC = pc + 4; + thread.futexAddr = sys.FUTEX_EMPTY_ADDR; + thread.registers[2] = sys.SYS_NANOSLEEP; + threading.replaceCurrent(thread); + } + finalizeThreadingState(threading, state); + + for (uint256 i = 0; i < 3; i++) { + MIPS2.ThreadState memory currentThread = threading.current(); + bytes memory threadWitness = threading.witness(); + + // thread stack updates + currentThread.pc = currentThread.nextPC; + currentThread.nextPC = currentThread.nextPC + 4; + currentThread.registers[2] = 0x0; + currentThread.registers[7] = 0x0; + threading.right().pop(); + threading.left().push(currentThread); + + MIPS2.State memory expect = copyState(state); + expect.step = state.step + 1; + expect.stepsSinceLastContextSwitch = 0; + finalizeThreadingState(threading, expect); + expect.traverseRight = i != 2; + + bytes32 postState = mips.step(encodeState(state), bytes.concat(threadWitness, memProof), 0); + assertEq(postState, outputState(expect), "unexpected post state"); + + state = expect; + } + } + + /// @dev static unit test asserting state transition of a spurious wakeup + function test_wakeupPreemptsThread_succeeds() public { + threading.createThread(); + threading.createThread(); + MIPS2.ThreadState memory threadB = threading.current(); + threadB.futexAddr = 0xdead; + threading.replaceCurrent(threadB); + bytes memory threadWitness = threading.witness(); + + MIPS2.State memory state; + state.wakeup = 0xabba; + finalizeThreadingState(threading, state); + + // Preempt the current thread on spurious wakeup + threading.left().pop(); + threading.right().push(threadB); + + MIPS2.State memory expect = copyState(state); + expect.step = state.step + 1; + expect.stepsSinceLastContextSwitch = 0; + finalizeThreadingState(threading, expect); + + bytes memory memProof; + bytes32 postState = mips.step(encodeState(state), bytes.concat(threadWitness, memProof), 0); + assertEq(postState, outputState(expect), "unexpected post state"); + } + + /// @dev Static unit test asserting successful wakeup traversal when no threads are ready to wake + function test_threadWakeupFullTraversalNoWakeup_succeeds() public { + MIPS2.State memory state; + state.wakeup = 0x1000; + state.step = 10; + state.stepsSinceLastContextSwitch = 10; + finalizeThreadingState(threading, state); + + // Create a few threads that are not waiting to wake + for (uint256 i = 0; i < 3; i++) { + MIPS2.ThreadState memory thread = threading.createThread(); + thread.futexAddr = sys.FUTEX_EMPTY_ADDR; + threading.replaceCurrent(thread); + } + finalizeThreadingState(threading, state); + + // Traverse left + for (uint256 i = 0; i < 3; i++) { + MIPS2.ThreadState memory currentThread = threading.current(); + + bytes memory memProof; + (state.memRoot, memProof) = ffi.getCannonMemoryProof(currentThread.pc, 0); + bytes memory threadWitness = threading.witness(); + + // We should preempt the current thread + threading.left().pop(); + threading.right().push(currentThread); + + MIPS2.State memory expect = copyState(state); + expect.step = state.step + 1; + expect.stepsSinceLastContextSwitch = 0; + finalizeThreadingState(threading, expect); + expect.traverseRight = i == 2; + + bytes32 postState = mips.step(encodeState(state), bytes.concat(threadWitness, memProof), 0); + assertEq(postState, outputState(expect), "unexpected post state"); + + state = expect; + } + + // Traverse right + threading.setTraverseRight(true); + for (uint256 i = 0; i < 3; i++) { + MIPS2.ThreadState memory currentThread = threading.current(); + + bytes memory memProof; + (state.memRoot, memProof) = ffi.getCannonMemoryProof(currentThread.pc, 0); + bytes memory threadWitness = threading.witness(); + + // We should preempt the current thread + threading.right().pop(); + threading.left().push(currentThread); + + MIPS2.State memory expect = copyState(state); + expect.step = state.step + 1; + expect.stepsSinceLastContextSwitch = 0; + finalizeThreadingState(threading, expect); + expect.traverseRight = true; + if (i == 2) { + // When we reach the last thread, we should clear the wakeup and resume normal execution + expect.traverseRight = false; + expect.wakeup = sys.FUTEX_EMPTY_ADDR; + } + + bytes32 postState = mips.step(encodeState(state), bytes.concat(threadWitness, memProof), 0); + assertEq(postState, outputState(expect), "unexpected post state"); + + state = expect; + } + } + + /// @dev static unit test asserting state transition of an empty right thread stack + /// This occurs during wakeup traversal + function test_wakeup_traversalEnds_succeeds() public { + threading.setTraverseRight(true); + MIPS2.ThreadState memory thread = threading.createThread(); + MIPS2.State memory state; + state.traverseRight = true; + state.wakeup = 0x1000; + state.stepsSinceLastContextSwitch = 10; + finalizeThreadingState(threading, state); + bytes memory threadWitness = threading.witness(); + + // state changes + threading.right().pop(); + threading.left().push(thread); + MIPS2.State memory expect = copyState(state); + expect.step = state.step + 1; + // Note that this does not change. The next thread scheduled (on the left stack) was the last thread on the + // right stack. + expect.stepsSinceLastContextSwitch = 0; + expect.wakeup = sys.FUTEX_EMPTY_ADDR; + expect.traverseRight = false; + finalizeThreadingState(threading, expect); + + bytes memory memProof; // unused + bytes32 postState = mips.step(encodeState(state), bytes.concat(threadWitness, memProof), 0); + assertEq(postState, outputState(expect), "unexpected post state"); + } + + /// @dev static unit test asserting state transition of completion of a timed-out futex waiter + function test_futexTimeoutCompletion_succeeds() public { + threading.createThread(); + threading.createThread(); + MIPS2.ThreadState memory threadB = threading.current(); + threadB.futexAddr = 0x1000; + threadB.futexVal = 0xdead; + threadB.futexTimeoutStep = 10; + threading.replaceCurrent(threadB); + bytes memory threadWitness = threading.witness(); + + MIPS2.State memory state; + state.wakeup = sys.FUTEX_EMPTY_ADDR; + state.step = 10; + state.stepsSinceLastContextSwitch = 10; // must be unchanged + finalizeThreadingState(threading, state); + + // Resume the current blocked thread on futex timeout + MIPS2.ThreadState memory expectThread = copyThread(threadB); + expectThread.pc = threadB.nextPC; + expectThread.nextPC = threadB.nextPC + 4; + expectThread.futexAddr = sys.FUTEX_EMPTY_ADDR; + expectThread.futexVal = 0x0; + expectThread.futexTimeoutStep = 0; + expectThread.registers[2] = sys.SYS_ERROR_SIGNAL; + expectThread.registers[7] = sys.ETIMEDOUT; + threading.replaceCurrent(expectThread); + MIPS2.State memory expect = copyState(state); + expect.step = state.step + 1; + expect.wakeup = sys.FUTEX_EMPTY_ADDR; + finalizeThreadingState(threading, expect); + + bytes memory memProof; + bytes32 postState = mips.step(encodeState(state), bytes.concat(threadWitness, memProof), 0); + assertEq(postState, outputState(expect), "unexpected post state"); + } + + /// @dev Static unit test asserting wakeup where the current thread is ready to be woken up + function testFuzz_wakeupWaiter_succeeds( + uint32 _wakeup, + uint32 _futexVal, + uint32 _futexTimeoutStep, + bool _threadExited + ) + public + { + vm.assume(_wakeup != sys.FUTEX_EMPTY_ADDR); + + threading.createThread(); + threading.createThread(); + MIPS2.ThreadState memory threadB = threading.current(); + + threadB.futexAddr = _wakeup; + threadB.futexVal = _futexVal; + threadB.futexTimeoutStep = _futexTimeoutStep; + // A thread exit cannot interrupt wakeup traversal. thread.exited during wakeup is technically not a valid + // state. + // But we fuzz this anyways to ensure the VM only traverses threads during wakeup + threadB.exited = _threadExited; + threadB.exitCode = _threadExited ? 1 : 0; + threading.replaceCurrent(threadB); + bytes memory threadWitness = threading.witness(); + + MIPS2.State memory state; + bytes memory memProof; // unused + state.wakeup = _wakeup; + state.step = 10; + state.stepsSinceLastContextSwitch = 20; // must be unchanged + finalizeThreadingState(threading, state); + + // Resume the current thread that is blocked + MIPS2.ThreadState memory expectThread = copyThread(threadB); + // no changes on thread since we're in wakeup traversal + threading.replaceCurrent(expectThread); + + MIPS2.State memory expect = copyState(state); + expect.step = state.step + 1; + expect.wakeup = sys.FUTEX_EMPTY_ADDR; + finalizeThreadingState(threading, expect); + + bytes32 postState = mips.step(encodeState(state), bytes.concat(threadWitness, memProof), 0); + assertEq(postState, outputState(expect), "unexpected post state"); + } + + /// @dev Static unit test asserting wakeup where the current thread isn't ready + function testFuzz_wakeupNonWaiter_succeeds( + uint32 _wakeup, + uint32 _futexAddr, + uint32 _futexVal, + uint32 _futexTimeoutStep, + bool _threadExited + ) + public + { + vm.assume(_wakeup != sys.FUTEX_EMPTY_ADDR); + vm.assume(_wakeup != _futexAddr); + + threading.createThread(); + threading.createThread(); + MIPS2.ThreadState memory threadB = threading.current(); + threadB.futexAddr = _futexAddr; + threadB.futexVal = _futexVal; + threadB.futexTimeoutStep = _futexTimeoutStep; + threadB.exited = _threadExited; + threadB.exitCode = _threadExited ? 1 : 0; + threading.replaceCurrent(threadB); + bytes memory threadWitness = threading.witness(); + + MIPS2.State memory state; + bytes memory memProof; // unused + state.wakeup = _wakeup; + state.step = 10; + state.stepsSinceLastContextSwitch = 20; + finalizeThreadingState(threading, state); + + // state changes + MIPS2.ThreadState memory expectThread = copyThread(threadB); + // thread internal state is unchanged since we're in wakeup traversal + threading.replaceCurrent(expectThread); + threading.left().pop(); + threading.right().push(expectThread); + + MIPS2.State memory expect = copyState(state); + expect.step = state.step + 1; + expect.stepsSinceLastContextSwitch = 0; + finalizeThreadingState(threading, expect); + + bytes32 postState = mips.step(encodeState(state), bytes.concat(threadWitness, memProof), 0); + assertEq(postState, outputState(expect), "unexpected post state"); + } + + /// @dev static unit test asserting state transition of completion of a non-timed-out futex waiter + function test_futexNoTimeoutCompletion_succeeds() public { + threading.createThread(); + threading.createThread(); + MIPS2.ThreadState memory threadB = threading.current(); + threadB.futexAddr = 0x1000; + threadB.futexVal = 0xdead; + threadB.futexTimeoutStep = 100; + threading.replaceCurrent(threadB); + bytes memory threadWitness = threading.witness(); + + MIPS2.State memory state; + bytes memory memProof; + (state.memRoot, memProof) = ffi.getCannonMemoryProof(0, 0, threadB.futexAddr, threadB.futexVal + 1); + state.wakeup = sys.FUTEX_EMPTY_ADDR; + state.step = 10; + state.stepsSinceLastContextSwitch = 10; // must be unchanged + finalizeThreadingState(threading, state); + + // Resume the current thread that is blocked + MIPS2.ThreadState memory expectThread = copyThread(threadB); + expectThread.pc = threadB.nextPC; + expectThread.nextPC = threadB.nextPC + 4; + expectThread.futexAddr = sys.FUTEX_EMPTY_ADDR; + expectThread.futexVal = 0x0; + expectThread.futexTimeoutStep = 0; + expectThread.registers[2] = 0; + expectThread.registers[7] = 0; // errno + threading.replaceCurrent(expectThread); + + MIPS2.State memory expect = copyState(state); + expect.step = state.step + 1; + expect.wakeup = sys.FUTEX_EMPTY_ADDR; + finalizeThreadingState(threading, expect); + + bytes32 postState = mips.step(encodeState(state), bytes.concat(threadWitness, memProof), 0); + assertEq(postState, outputState(expect), "unexpected post state"); + } + + /// @dev static unit test asserting state transition of futex waiter that isn't ready + function test_futexNoTimeoutPreemptsThread_succeeds() public { + threading.createThread(); + threading.createThread(); + MIPS2.ThreadState memory threadB = threading.current(); + threadB.futexAddr = 0x1000; + threadB.futexVal = 0xdead; + threadB.futexTimeoutStep = sys.FUTEX_NO_TIMEOUT; + threading.replaceCurrent(threadB); + bytes memory threadWitness = threading.witness(); + + MIPS2.State memory state; + bytes memory memProof; + (state.memRoot, memProof) = ffi.getCannonMemoryProof(0, 0, threadB.futexAddr, threadB.futexVal); + state.wakeup = sys.FUTEX_EMPTY_ADDR; + state.stepsSinceLastContextSwitch = 10; + finalizeThreadingState(threading, state); + + // Expect the thread to be moved from the left to right stack + threading.left().pop(); + threading.right().push(threadB); + MIPS2.State memory expect = copyState(state); + expect.step = state.step + 1; + expect.stepsSinceLastContextSwitch = 0; + finalizeThreadingState(threading, expect); + + bytes32 postState = mips.step(encodeState(state), bytes.concat(threadWitness, memProof), 0); + assertEq(postState, outputState(expect), "unexpected post state"); + } + + /// @dev Static unit test asserting VM behavior when the current thread has exited + function test_threadExit_succeeds() public { + threading.createThread(); + threading.createThread(); + MIPS2.ThreadState memory threadB = threading.current(); + threadB.exited = true; + threading.replaceCurrent(threadB); + bytes memory threadWitness = threading.witness(); + + MIPS2.State memory state; + state.wakeup = sys.FUTEX_EMPTY_ADDR; + state.stepsSinceLastContextSwitch = 10; + finalizeThreadingState(threading, state); + + // Expect the thread to be popped from the left stack + threading.left().pop(); + MIPS2.State memory expect = copyState(state); + expect.stepsSinceLastContextSwitch = 0; + expect.step = state.step + 1; + finalizeThreadingState(threading, expect); + + bytes32 postState = mips.step(encodeState(state), threadWitness, 0); + assertEq(postState, outputState(expect), "unexpected post state"); + } + + /// @dev Static unit test asserting VM behavior when the current thread has exited and the current thread stack is + /// almost empty + function test_threadExit_swapStacks_succeeds() public { + threading.setTraverseRight(true); + threading.createThread(); + threading.setTraverseRight(false); + threading.createThread(); + MIPS2.ThreadState memory threadL = threading.current(); + threadL.exited = true; + threading.replaceCurrent(threadL); + bytes memory threadWitness = threading.witness(); + + MIPS2.State memory state; + state.wakeup = sys.FUTEX_EMPTY_ADDR; + state.stepsSinceLastContextSwitch = 10; + finalizeThreadingState(threading, state); + + threading.left().pop(); + MIPS2.State memory expect = copyState(state); + expect.stepsSinceLastContextSwitch = 0; + expect.step = state.step + 1; + expect.traverseRight = true; + finalizeThreadingState(threading, expect); + + bytes32 postState = mips.step(encodeState(state), threadWitness, 0); + assertEq(postState, outputState(expect), "unexpected post state"); + } + + function test_mmap_succeeds_simple() external { + uint32 insn = 0x0000000c; // syscall + (MIPS2.State memory state, MIPS2.ThreadState memory thread, bytes memory memProof) = + constructMIPSState(0, insn, 0x4, 0); + + state.heap = 4096; + thread.nextPC = 4; + thread.registers[2] = sys.SYS_MMAP; // syscall num + thread.registers[4] = 0x0; // a0 + thread.registers[5] = 4095; // a1 + updateThreadStacks(state, thread); + + // Set up step data + bytes memory threadWitness = abi.encodePacked(encodeThread(thread), EMPTY_THREAD_ROOT); + bytes memory encodedState = encodeState(state); + + MIPS2.State memory expect = copyState(state); + MIPS2.ThreadState memory expectThread = copyThread(thread); + expect.memRoot = state.memRoot; + expect.step = state.step + 1; + expect.stepsSinceLastContextSwitch = state.stepsSinceLastContextSwitch + 1; + expect.heap = state.heap + 4096; + expectThread.pc = thread.nextPC; + expectThread.nextPC = thread.nextPC + 4; + expectThread.registers[2] = state.heap; // return old heap + expectThread.registers[7] = 0; // No error + updateThreadStacks(expect, expectThread); + + bytes32 postState = mips.step(encodedState, bytes.concat(threadWitness, memProof), 0); + assertEq(postState, outputState(expect), "unexpected post state"); + } + + function test_mmap_succeeds_justWithinMemLimit() external { + uint32 insn = 0x0000000c; // syscall + (MIPS2.State memory state, MIPS2.ThreadState memory thread, bytes memory memProof) = + constructMIPSState(0, insn, 0x4, 0); + + state.heap = sys.HEAP_END - 4096; // Set up to increase heap to its limit + thread.nextPC = 4; + thread.registers[2] = sys.SYS_MMAP; // syscall num + thread.registers[4] = 0x0; // a0 + thread.registers[5] = 4095; // a1 + updateThreadStacks(state, thread); + + // Set up step data + bytes memory threadWitness = abi.encodePacked(encodeThread(thread), EMPTY_THREAD_ROOT); + bytes memory encodedState = encodeState(state); + + MIPS2.State memory expect = copyState(state); + MIPS2.ThreadState memory expectThread = copyThread(thread); + expect.memRoot = state.memRoot; + expect.step += 1; + expect.stepsSinceLastContextSwitch += 1; + expect.heap = sys.HEAP_END; + expectThread.pc = thread.nextPC; + expectThread.nextPC = thread.nextPC + 4; + expectThread.registers[2] = state.heap; // Return the old heap value + expectThread.registers[7] = 0; // No error + updateThreadStacks(expect, expectThread); + + bytes32 postState = mips.step(encodedState, bytes.concat(threadWitness, memProof), 0); + assertEq(postState, outputState(expect), "unexpected post state"); + } + + function test_mmap_fails() external { + uint32 insn = 0x0000000c; // syscall + (MIPS2.State memory state, MIPS2.ThreadState memory thread, bytes memory memProof) = + constructMIPSState(0, insn, 0x4, 0); + + state.heap = sys.HEAP_END - 4096; // Set up to increase heap beyond its limit + thread.nextPC = 4; + thread.registers[2] = sys.SYS_MMAP; // syscall num + thread.registers[4] = 0x0; // a0 + thread.registers[5] = 4097; // a1 + updateThreadStacks(state, thread); + + // Set up step data + bytes memory threadWitness = abi.encodePacked(encodeThread(thread), EMPTY_THREAD_ROOT); + bytes memory encodedState = encodeState(state); + + MIPS2.State memory expect = copyState(state); + MIPS2.ThreadState memory expectThread = copyThread(thread); + expect.memRoot = state.memRoot; + expect.step += 1; + expect.stepsSinceLastContextSwitch += 1; + expectThread.pc = thread.nextPC; + expectThread.nextPC = thread.nextPC + 4; + expectThread.registers[2] = sys.SYS_ERROR_SIGNAL; // signal an stdError + expectThread.registers[7] = sys.EINVAL; // Return error value + expectThread.registers[4] = thread.registers[4]; // a0 + expectThread.registers[5] = thread.registers[5]; // a1 + updateThreadStacks(expect, expectThread); + + bytes32 postState = mips.step(encodedState, bytes.concat(threadWitness, memProof), 0); + assertEq(postState, outputState(expect), "unexpected post state"); + } + + function test_srav_succeeds() external { + uint32 insn = encodespec(0xa, 0x9, 0x8, 7); // srav t0, t1, t2 + (MIPS2.State memory state, MIPS2.ThreadState memory thread, bytes memory memProof) = + constructMIPSState(0, insn, 0x4, 0); + thread.registers[9] = 0xdeafbeef; // t1 + thread.registers[10] = 12; // t2 + updateThreadStacks(state, thread); + + // Set up step data + bytes memory threadWitness = abi.encodePacked(encodeThread(thread), EMPTY_THREAD_ROOT); + bytes memory encodedState = encodeState(state); + + MIPS2.State memory expect = copyState(state); + MIPS2.ThreadState memory expectThread = copyThread(thread); + expect.memRoot = state.memRoot; + expect.step += 1; + expect.stepsSinceLastContextSwitch += 1; + expectThread.pc = thread.nextPC; + expectThread.nextPC = thread.nextPC + 4; + expectThread.registers[8] = 0xfffdeafb; // t0 + updateThreadStacks(expect, expectThread); + + bytes32 postState = mips.step(encodedState, bytes.concat(threadWitness, memProof), 0); + assertEq(postState, outputState(expect), "unexpected post state"); + } + + /// @notice Tests that the SRAV instruction succeeds when it includes extra bits in the shift + /// amount beyond the lower 5 bits that are actually used for the shift. Extra bits + /// need to be ignored but the instruction should still succeed. + /// @param _rs Value to set in the shift register $rs. + function testFuzz_srav_withExtraBits_succeeds(uint32 _rs) external { + // Assume + // Force _rs to have more than 5 bits set. + _rs = uint32(bound(uint256(_rs), 0x20, type(uint32).max)); + + uint32 insn = encodespec(0xa, 0x9, 0x8, 7); // srav t0, t1, t2 + (MIPS2.State memory state, MIPS2.ThreadState memory thread, bytes memory memProof) = + constructMIPSState(0, insn, 0x4, 0); + thread.registers[9] = 0xdeadbeef; // t1 + thread.registers[10] = _rs; // t2 + updateThreadStacks(state, thread); + + // Set up step data + bytes memory threadWitness = abi.encodePacked(encodeThread(thread), EMPTY_THREAD_ROOT); + bytes memory encodedState = encodeState(state); + + // Calculate shamt + uint32 shamt = thread.registers[10] & 0x1F; + + MIPS2.State memory expect = copyState(state); + MIPS2.ThreadState memory expectThread = copyThread(thread); + expect.memRoot = state.memRoot; + expect.step += 1; + expect.stepsSinceLastContextSwitch += 1; + expectThread.pc = thread.nextPC; + expectThread.nextPC = thread.nextPC + 4; + expectThread.registers[8] = ins.signExtend(thread.registers[9] >> shamt, 32 - shamt); // t0 + updateThreadStacks(expect, expectThread); + + bytes32 postState = mips.step(encodedState, bytes.concat(threadWitness, memProof), 0); + assertEq(postState, outputState(expect), "unexpected post state"); + } + + function test_add_succeeds() public { + uint32 insn = encodespec(17, 18, 8, 0x20); // add t0, s1, s2 + (MIPS2.State memory state, MIPS2.ThreadState memory thread, bytes memory memProof) = + constructMIPSState(0, insn, 0x4, 0); + thread.registers[17] = 12; + thread.registers[18] = 20; + bytes memory threadWitness = abi.encodePacked(encodeThread(thread), EMPTY_THREAD_ROOT); + updateThreadStacks(state, thread); + + uint32 result = thread.registers[17] + thread.registers[18]; // t0 + MIPS2.State memory expect = arithmeticPostState(state, thread, 8, /* t0 */ result); + + bytes32 postState = mips.step(encodeState(state), bytes.concat(threadWitness, memProof), 0); + assertEq(postState, outputState(expect), "unexpected post state"); + } + + function test_addu_succeeds() public { + uint32 insn = encodespec(17, 18, 8, 0x21); // addu t0, s1, s2 + (MIPS2.State memory state, MIPS2.ThreadState memory thread, bytes memory memProof) = + constructMIPSState(0, insn, 0x4, 0); + thread.registers[17] = 12; + thread.registers[18] = 20; + bytes memory threadWitness = abi.encodePacked(encodeThread(thread), EMPTY_THREAD_ROOT); + updateThreadStacks(state, thread); + + uint32 result = thread.registers[17] + thread.registers[18]; // t0 + MIPS2.State memory expect = arithmeticPostState(state, thread, 8, /* t0 */ result); + + bytes32 postState = mips.step(encodeState(state), bytes.concat(threadWitness, memProof), 0); + assertEq(postState, outputState(expect), "unexpected post state"); + } + + function test_addi_succeeds() public { + uint16 imm = 40; + uint32 insn = encodeitype(0x8, 17, 8, imm); // addi t0, s1, 40 + (MIPS2.State memory state, MIPS2.ThreadState memory thread, bytes memory memProof) = + constructMIPSState(0, insn, 0x4, 0); + thread.registers[8] = 1; // t0 + thread.registers[17] = 4; // t1 + updateThreadStacks(state, thread); + + uint32 result = thread.registers[17] + imm; // t0 + MIPS2.State memory expect = arithmeticPostState(state, thread, 8, /* t0 */ result); + + bytes32 postState = mips.step( + encodeState(state), bytes.concat(abi.encodePacked(encodeThread(thread), EMPTY_THREAD_ROOT), memProof), 0 + ); + assertEq(postState, outputState(expect), "unexpected post state"); + } + + function test_addiSign_succeeds() public { + uint16 imm = 0xfffe; // -2 + uint32 insn = encodeitype(0x8, 17, 8, imm); // addi t0, s1, 40 + (MIPS2.State memory state, MIPS2.ThreadState memory thread, bytes memory memProof) = + constructMIPSState(0, insn, 0x4, 0); + thread.registers[8] = 1; // s0 + thread.registers[17] = 2; // s1 + bytes memory threadWitness = abi.encodePacked(encodeThread(thread), EMPTY_THREAD_ROOT); + updateThreadStacks(state, thread); + + uint32 result = 0; // t0 + MIPS2.State memory expect = arithmeticPostState(state, thread, 8, /* t0 */ result); + + bytes32 postState = mips.step(encodeState(state), bytes.concat(threadWitness, memProof), 0); + assertEq(postState, outputState(expect), "unexpected post state"); + } + + function test_addui_succeeds() public { + // copy the existing corresponding test in MIPS.t.sol and adapt for MIPS2 + uint16 imm = 40; + uint32 insn = encodeitype(0x9, 17, 8, imm); // addui t0, s1, 40 + (MIPS2.State memory state, MIPS2.ThreadState memory thread, bytes memory memProof) = + constructMIPSState(0, insn, 0x4, 0); + thread.registers[8] = 1; // t0 + thread.registers[17] = 4; // t1 + updateThreadStacks(state, thread); + + uint32 result = thread.registers[17] + imm; // t0 + MIPS2.State memory expect = arithmeticPostState(state, thread, 8, /* t0 */ result); + + bytes32 postState = mips.step( + encodeState(state), bytes.concat(abi.encodePacked(encodeThread(thread), EMPTY_THREAD_ROOT), memProof), 0 + ); + assertEq(postState, outputState(expect), "unexpected post state"); + } + + function test_sub_succeeds() public { + uint32 insn = encodespec(17, 18, 8, 0x22); // sub t0, s1, s2 + (MIPS2.State memory state, MIPS2.ThreadState memory thread, bytes memory memProof) = + constructMIPSState(0, insn, 0x4, 0); + thread.registers[17] = 20; + thread.registers[18] = 12; + bytes memory threadWitness = abi.encodePacked(encodeThread(thread), EMPTY_THREAD_ROOT); + updateThreadStacks(state, thread); + + uint32 result = thread.registers[17] - thread.registers[18]; // t0 + MIPS2.State memory expect = arithmeticPostState(state, thread, 8, /* t0 */ result); + + bytes32 postState = mips.step(encodeState(state), bytes.concat(threadWitness, memProof), 0); + assertEq(postState, outputState(expect), "unexpected post state"); + } + + function test_subu_succeeds() public { + uint32 insn = encodespec(17, 18, 8, 0x23); // subu t0, s1, s2 + (MIPS2.State memory state, MIPS2.ThreadState memory thread, bytes memory memProof) = + constructMIPSState(0, insn, 0x4, 0); + thread.registers[17] = 20; + thread.registers[18] = 12; + bytes memory threadWitness = abi.encodePacked(encodeThread(thread), EMPTY_THREAD_ROOT); + updateThreadStacks(state, thread); + + uint32 result = thread.registers[17] - thread.registers[18]; // t0 + MIPS2.State memory expect = arithmeticPostState(state, thread, 8, /* t0 */ result); + + bytes32 postState = mips.step(encodeState(state), bytes.concat(threadWitness, memProof), 0); + assertEq(postState, outputState(expect), "unexpected post state"); + } + + function test_and_succeeds() public { + uint32 insn = encodespec(17, 18, 8, 0x24); // and t0, s1, s2 + (MIPS2.State memory state, MIPS2.ThreadState memory thread, bytes memory memProof) = + constructMIPSState(0, insn, 0x4, 0); + thread.registers[17] = 1200; + thread.registers[18] = 490; + bytes memory threadWitness = abi.encodePacked(encodeThread(thread), EMPTY_THREAD_ROOT); + updateThreadStacks(state, thread); + + uint32 result = thread.registers[17] & thread.registers[18]; // t0 + MIPS2.State memory expect = arithmeticPostState(state, thread, 8, /* t0 */ result); + + bytes32 postState = mips.step(encodeState(state), bytes.concat(threadWitness, memProof), 0); + assertEq(postState, outputState(expect), "unexpected post state"); + } + + function test_andi_succeeds() public { + uint16 imm = 40; + uint32 insn = encodeitype(0xc, 17, 8, imm); // andi t0, s1, 40 + (MIPS2.State memory state, MIPS2.ThreadState memory thread, bytes memory memProof) = + constructMIPSState(0, insn, 0x4, 0); + thread.registers[8] = 1; // t0 + thread.registers[17] = 4; // s1 + bytes memory threadWitness = abi.encodePacked(encodeThread(thread), EMPTY_THREAD_ROOT); + updateThreadStacks(state, thread); + + uint32 result = thread.registers[17] & imm; // t0 + MIPS2.State memory expect = arithmeticPostState(state, thread, 8, /* t0 */ result); + + bytes32 postState = mips.step(encodeState(state), bytes.concat(threadWitness, memProof), 0); + assertEq(postState, outputState(expect), "unexpected post state"); + } + + function test_or_succeeds() public { + uint32 insn = encodespec(17, 18, 8, 0x25); // or t0, s1, s2 + (MIPS2.State memory state, MIPS2.ThreadState memory thread, bytes memory memProof) = + constructMIPSState(0, insn, 0x4, 0); + thread.registers[17] = 1200; + thread.registers[18] = 490; + bytes memory threadWitness = abi.encodePacked(encodeThread(thread), EMPTY_THREAD_ROOT); + updateThreadStacks(state, thread); + + uint32 result = thread.registers[17] | thread.registers[18]; // t0 + MIPS2.State memory expect = arithmeticPostState(state, thread, 8, /* t0 */ result); + + bytes32 postState = mips.step(encodeState(state), bytes.concat(threadWitness, memProof), 0); + assertEq(postState, outputState(expect), "unexpected post state"); + } + + function test_ori_succeeds() public { + uint16 imm = 40; + uint32 insn = encodeitype(0xd, 17, 8, imm); // ori t0, s1, 40 + (MIPS2.State memory state, MIPS2.ThreadState memory thread, bytes memory memProof) = + constructMIPSState(0, insn, 0x4, 0); + thread.registers[8] = 1; // t0 + thread.registers[17] = 4; // s1 + bytes memory threadWitness = abi.encodePacked(encodeThread(thread), EMPTY_THREAD_ROOT); + updateThreadStacks(state, thread); + + uint32 result = thread.registers[17] | imm; // t0 + MIPS2.State memory expect = arithmeticPostState(state, thread, 8, /* t0 */ result); + + bytes32 postState = mips.step(encodeState(state), bytes.concat(threadWitness, memProof), 0); + assertEq(postState, outputState(expect), "unexpected post state"); + } + + function test_xor_succeeds() public { + uint32 insn = encodespec(17, 18, 8, 0x26); // xor t0, s1, s2 + (MIPS2.State memory state, MIPS2.ThreadState memory thread, bytes memory memProof) = + constructMIPSState(0, insn, 0x4, 0); + thread.registers[17] = 1200; + thread.registers[18] = 490; + bytes memory threadWitness = abi.encodePacked(encodeThread(thread), EMPTY_THREAD_ROOT); + updateThreadStacks(state, thread); + + uint32 result = thread.registers[17] ^ thread.registers[18]; // t0 + MIPS2.State memory expect = arithmeticPostState(state, thread, 8, /* t0 */ result); + + bytes32 postState = mips.step(encodeState(state), bytes.concat(threadWitness, memProof), 0); + assertEq(postState, outputState(expect), "unexpected post state"); + } + + function test_xori_succeeds() public { + uint16 imm = 40; + uint32 insn = encodeitype(0xe, 17, 8, imm); // xori t0, s1, 40 + (MIPS2.State memory state, MIPS2.ThreadState memory thread, bytes memory memProof) = + constructMIPSState(0, insn, 0x4, 0); + thread.registers[8] = 1; // t0 + thread.registers[17] = 4; // s1 + bytes memory threadWitness = abi.encodePacked(encodeThread(thread), EMPTY_THREAD_ROOT); + updateThreadStacks(state, thread); + + uint32 result = thread.registers[17] ^ imm; // t0 + MIPS2.State memory expect = arithmeticPostState(state, thread, 8, /* t0 */ result); + + bytes32 postState = mips.step(encodeState(state), bytes.concat(threadWitness, memProof), 0); + assertEq(postState, outputState(expect), "unexpected post state"); + } + + function test_nor_succeeds() public { + uint32 insn = encodespec(17, 18, 8, 0x27); // nor t0, s1, s2 + (MIPS2.State memory state, MIPS2.ThreadState memory thread, bytes memory memProof) = + constructMIPSState(0, insn, 0x4, 0); + thread.registers[17] = 1200; + thread.registers[18] = 490; + bytes memory threadWitness = abi.encodePacked(encodeThread(thread), EMPTY_THREAD_ROOT); + updateThreadStacks(state, thread); + + uint32 result = ~(thread.registers[17] | thread.registers[18]); // t0 + MIPS2.State memory expect = arithmeticPostState(state, thread, 8, /* t0 */ result); + + bytes32 postState = mips.step(encodeState(state), bytes.concat(threadWitness, memProof), 0); + assertEq(postState, outputState(expect), "unexpected post state"); + } + + function test_slt_succeeds() public { + uint32 insn = encodespec(17, 18, 8, 0x2a); // slt t0, s1, s2 + (MIPS2.State memory state, MIPS2.ThreadState memory thread, bytes memory memProof) = + constructMIPSState(0, insn, 0x4, 0); + thread.registers[17] = 0xFF_FF_FF_FE; // -2 + thread.registers[18] = 5; + bytes memory threadWitness = abi.encodePacked(encodeThread(thread), EMPTY_THREAD_ROOT); + updateThreadStacks(state, thread); + + uint32 result = 1; // t0 + MIPS2.State memory expect = arithmeticPostState(state, thread, 8, /* t0 */ result); + + bytes32 postState = mips.step(encodeState(state), bytes.concat(threadWitness, memProof), 0); + assertEq(postState, outputState(expect), "unexpected post state"); + + // swap operands and check again + uint32 tmp = thread.registers[17]; + thread.registers[17] = thread.registers[18]; + thread.registers[18] = tmp; + threadWitness = abi.encodePacked(encodeThread(thread), EMPTY_THREAD_ROOT); + updateThreadStacks(state, thread); + + result = 0; // t0 + expect = arithmeticPostState(state, thread, 8, /* t0 */ result); + postState = mips.step(encodeState(state), bytes.concat(threadWitness, memProof), 0); + assertEq(postState, outputState(expect), "unexpected post state"); + } + + function test_sltu_succeeds() public { + uint32 insn = encodespec(17, 18, 8, 0x2b); // sltu t0, s1, s2 + (MIPS2.State memory state, MIPS2.ThreadState memory thread, bytes memory memProof) = + constructMIPSState(0, insn, 0x4, 0); + thread.registers[17] = 1200; + thread.registers[18] = 490; + bytes memory threadWitness = abi.encodePacked(encodeThread(thread), EMPTY_THREAD_ROOT); + updateThreadStacks(state, thread); + + uint32 result = thread.registers[17] < thread.registers[18] ? 1 : 0; // t0 + MIPS2.State memory expect = arithmeticPostState(state, thread, 8, /* t0 */ result); + + bytes32 postState = mips.step(encodeState(state), bytes.concat(threadWitness, memProof), 0); + assertEq(postState, outputState(expect), "unexpected post state"); + } + + function test_lb_succeeds() public { + uint32 t1 = 0x100; + uint32 insn = encodeitype(0x20, 0x9, 0x8, 0x4); // lb $t0, 4($t1) + (MIPS2.State memory state, MIPS2.ThreadState memory thread, bytes memory memProof) = + constructMIPSState(0, insn, t1 + 4, 0x12_00_00_00); + thread.registers[8] = 0; // t0 + thread.registers[9] = t1; + bytes memory threadWitness = abi.encodePacked(encodeThread(thread), EMPTY_THREAD_ROOT); + updateThreadStacks(state, thread); + + uint32 result = 0x12; // t0 + MIPS2.State memory expect = arithmeticPostState(state, thread, 8, /* t0 */ result); + + bytes32 postState = mips.step(encodeState(state), bytes.concat(threadWitness, memProof), 0); + assertEq(postState, outputState(expect), "unexpected post state"); + } + + function test_lh_succeeds() public { + uint32 t1 = 0x100; + uint32 val = 0x12_23_00_00; + uint32 insn = encodeitype(0x21, 0x9, 0x8, 0x4); // lh $t0, 4($t1) + (MIPS2.State memory state, MIPS2.ThreadState memory thread, bytes memory memProof) = + constructMIPSState(0, insn, t1 + 4, val); + thread.registers[8] = 0; // t0 + thread.registers[9] = t1; + bytes memory threadWitness = abi.encodePacked(encodeThread(thread), EMPTY_THREAD_ROOT); + updateThreadStacks(state, thread); + + uint32 result = 0x12_23; // t0 + MIPS2.State memory expect = arithmeticPostState(state, thread, 8, /* t0 */ result); + + bytes32 postState = mips.step(encodeState(state), bytes.concat(threadWitness, memProof), 0); + assertEq(postState, outputState(expect), "unexpected post state"); + } + + function test_lw_succeeds() public { + uint32 t1 = 0x100; + uint32 val = 0x12_23_45_67; + uint32 insn = encodeitype(0x23, 0x9, 0x8, 0x4); // lw $t0, 4($t1) + (MIPS2.State memory state, MIPS2.ThreadState memory thread, bytes memory memProof) = + constructMIPSState(0, insn, t1 + 4, val); + thread.registers[8] = 0; // t0 + thread.registers[9] = t1; + bytes memory threadWitness = abi.encodePacked(encodeThread(thread), EMPTY_THREAD_ROOT); + updateThreadStacks(state, thread); + + uint32 result = val; // t0 + MIPS2.State memory expect = arithmeticPostState(state, thread, 8, /* t0 */ result); + + bytes32 postState = mips.step(encodeState(state), bytes.concat(threadWitness, memProof), 0); + assertEq(postState, outputState(expect), "unexpected post state"); + } + + function test_lbu_succeeds() public { + uint32 t1 = 0x100; + uint32 insn = encodeitype(0x24, 0x9, 0x8, 0x4); // lbu $t0, 4($t1) + (MIPS2.State memory state, MIPS2.ThreadState memory thread, bytes memory memProof) = + constructMIPSState(0, insn, t1 + 4, 0x12_23_00_00); + thread.registers[8] = 0; // t0 + thread.registers[9] = t1; + bytes memory threadWitness = abi.encodePacked(encodeThread(thread), EMPTY_THREAD_ROOT); + updateThreadStacks(state, thread); + + uint32 result = 0x12; // t0 + MIPS2.State memory expect = arithmeticPostState(state, thread, 8, /* t0 */ result); + + bytes32 postState = mips.step(encodeState(state), bytes.concat(threadWitness, memProof), 0); + assertEq(postState, outputState(expect), "unexpected post state"); + } + + function test_lhu_succeeds() public { + uint32 t1 = 0x100; + uint32 insn = encodeitype(0x25, 0x9, 0x8, 0x4); // lhu $t0, 4($t1) + (MIPS2.State memory state, MIPS2.ThreadState memory thread, bytes memory memProof) = + constructMIPSState(0, insn, t1 + 4, 0x12_23_00_00); + thread.registers[8] = 0; // t0 + thread.registers[9] = t1; + bytes memory threadWitness = abi.encodePacked(encodeThread(thread), EMPTY_THREAD_ROOT); + updateThreadStacks(state, thread); + + uint32 result = 0x12_23; // t0 + MIPS2.State memory expect = arithmeticPostState(state, thread, 8, /* t0 */ result); + + bytes32 postState = mips.step(encodeState(state), bytes.concat(threadWitness, memProof), 0); + assertEq(postState, outputState(expect), "unexpected post state"); + } + + function test_lwl_succeeds() public { + uint32 t1 = 0x100; + uint32 insn = encodeitype(0x22, 0x9, 0x8, 0x4); // lwl $t0, 4($t1) + (MIPS2.State memory state, MIPS2.ThreadState memory thread, bytes memory memProof) = + constructMIPSState(0, insn, t1 + 4, 0x12_34_56_78); + thread.registers[8] = 0xaa_bb_cc_dd; // t0 + thread.registers[9] = t1; + bytes memory threadWitness = abi.encodePacked(encodeThread(thread), EMPTY_THREAD_ROOT); + updateThreadStacks(state, thread); + + thread.registers[8] = 0x12_34_56_78; // t0 + MIPS2.State memory expect = arithmeticPostState(state, thread, 8, /* t0 */ thread.registers[8]); + + bytes32 postState = mips.step(encodeState(state), bytes.concat(threadWitness, memProof), 0); + assertEq(postState, outputState(expect), "unexpected post state"); + } + + function test_lwl_unaligned_succeeds() public { + uint32 t1 = 0x100; + uint32 insn = encodeitype(0x22, 0x9, 0x8, 0x5); // lwl $t0, 5($t1) + (MIPS2.State memory state, MIPS2.ThreadState memory thread, bytes memory memProof) = + constructMIPSState(0, insn, t1 + 4, 0x12_34_56_78); + thread.registers[8] = 0x34_56_78_dd; // t0 + thread.registers[9] = t1; // t0 + bytes memory threadWitness = abi.encodePacked(encodeThread(thread), EMPTY_THREAD_ROOT); + (state.memRoot, memProof) = ffi.getCannonMemoryProof(0, insn, t1 + 4, 0x12_34_56_78); + updateThreadStacks(state, thread); + + MIPS2.State memory expect = arithmeticPostState(state, thread, 8, /* t0 */ thread.registers[8]); + bytes32 postState = mips.step(encodeState(state), bytes.concat(threadWitness, memProof), 0); + assertEq(postState, outputState(expect), "unexpected post state"); + } + + function test_lwr_succeeds() public { + uint32 t1 = 0x100; + uint32 insn = encodeitype(0x26, 0x9, 0x8, 0x4); // lwr $t0, 4($t1) + (MIPS2.State memory state, MIPS2.ThreadState memory thread, bytes memory memProof) = + constructMIPSState(0, insn, t1 + 4, 0x12_34_56_78); + thread.registers[8] = 0xaa_bb_cc_dd; // t0 + thread.registers[9] = t1; + bytes memory threadWitness = abi.encodePacked(encodeThread(thread), EMPTY_THREAD_ROOT); + updateThreadStacks(state, thread); + + thread.registers[8] = 0xaa_bb_cc_12; // t0 + MIPS2.State memory expect = arithmeticPostState(state, thread, 8, /* t0 */ thread.registers[8]); + + bytes32 postState = mips.step(encodeState(state), bytes.concat(threadWitness, memProof), 0); + assertEq(postState, outputState(expect), "unexpected post state"); + } + + function test_lwr_unaligned_succeeds() public { + uint32 t1 = 0x100; + uint32 insn = encodeitype(0x26, 0x9, 0x8, 0x5); // lwr $t0, 5($t1) + (MIPS2.State memory state, MIPS2.ThreadState memory thread, bytes memory memProof) = + constructMIPSState(0, insn, t1 + 4, 0x12_34_56_78); + thread.registers[8] = 0xaa_bb_cc_dd; // t0 + thread.registers[9] = t1; + bytes memory threadWitness = abi.encodePacked(encodeThread(thread), EMPTY_THREAD_ROOT); + (state.memRoot, memProof) = ffi.getCannonMemoryProof(0, insn, t1 + 4, 0x12_34_56_78); + updateThreadStacks(state, thread); + + thread.registers[8] = 0xaa_bb_12_34; // t0 + MIPS2.State memory expect = arithmeticPostState(state, thread, 8, /* t0 */ thread.registers[8]); + + bytes32 postState = mips.step(encodeState(state), bytes.concat(threadWitness, memProof), 0); + assertEq(postState, outputState(expect), "unexpected post state"); + } + + function test_sb_succeeds() public { + uint32 t1 = 0x100; + uint32 insn = encodeitype(0x28, 0x9, 0x8, 0x4); // sb $t0, 4($t1) + // note. cannon memory is zero-initialized. mem[t+4] = 0 is a no-op + (MIPS2.State memory state, MIPS2.ThreadState memory thread, bytes memory memProof) = + constructMIPSState(0, insn, t1 + 4, 0); + thread.registers[8] = 0xaa_bb_cc_dd; // t0 + thread.registers[9] = t1; + bytes memory threadWitness = abi.encodePacked(encodeThread(thread), EMPTY_THREAD_ROOT); + updateThreadStacks(state, thread); + + MIPS2.State memory expect = arithmeticPostState(state, thread, 8, /* t0 */ thread.registers[8]); + (expect.memRoot,) = ffi.getCannonMemoryProof(0, insn, t1 + 4, 0xdd_00_00_00); + + bytes32 postState = mips.step(encodeState(state), bytes.concat(threadWitness, memProof), 0); + assertEq(postState, outputState(expect), "unexpected post state"); + } + + function test_sh_succeeds() public { + uint32 t1 = 0x100; + uint32 insn = encodeitype(0x29, 0x9, 0x8, 0x4); // sh $t0, 4($t1) + (MIPS2.State memory state, MIPS2.ThreadState memory thread, bytes memory memProof) = + constructMIPSState(0, insn, t1 + 4, 0); + thread.registers[8] = 0xaa_bb_cc_dd; // t0 + thread.registers[9] = t1; + bytes memory threadWitness = abi.encodePacked(encodeThread(thread), EMPTY_THREAD_ROOT); + updateThreadStacks(state, thread); + + MIPS2.State memory expect = arithmeticPostState(state, thread, 8, /* t0 */ thread.registers[8]); + (expect.memRoot,) = ffi.getCannonMemoryProof(0, insn, t1 + 4, 0xcc_dd_00_00); + + bytes32 postState = mips.step(encodeState(state), bytes.concat(threadWitness, memProof), 0); + assertEq(postState, outputState(expect), "unexpected post state"); + } + + function test_swl_succeeds() public { + uint32 t1 = 0x100; + uint32 insn = encodeitype(0x2a, 0x9, 0x8, 0x4); // swl $t0, 4($t1) + (MIPS2.State memory state, MIPS2.ThreadState memory thread, bytes memory memProof) = + constructMIPSState(0, insn, t1 + 4, 0); + thread.registers[8] = 0xaa_bb_cc_dd; // t0 + thread.registers[9] = t1; + bytes memory threadWitness = abi.encodePacked(encodeThread(thread), EMPTY_THREAD_ROOT); + updateThreadStacks(state, thread); + + MIPS2.State memory expect = arithmeticPostState(state, thread, 8, /* t0 */ thread.registers[8]); + (expect.memRoot,) = ffi.getCannonMemoryProof(0, insn, t1 + 4, 0xaa_bb_cc_dd); + + bytes32 postState = mips.step(encodeState(state), bytes.concat(threadWitness, memProof), 0); + assertEq(postState, outputState(expect), "unexpected post state"); + } + + function test_sw_succeeds() public { + uint32 t1 = 0x100; + uint32 insn = encodeitype(0x2b, 0x9, 0x8, 0x4); // sw $t0, 4($t1) + (MIPS2.State memory state, MIPS2.ThreadState memory thread, bytes memory memProof) = + constructMIPSState(0, insn, t1 + 4, 0); + thread.registers[8] = 0xaa_bb_cc_dd; // t0 + thread.registers[9] = t1; + bytes memory threadWitness = abi.encodePacked(encodeThread(thread), EMPTY_THREAD_ROOT); + updateThreadStacks(state, thread); + + MIPS2.State memory expect = arithmeticPostState(state, thread, 8, /* t0 */ thread.registers[8]); + (expect.memRoot,) = ffi.getCannonMemoryProof(0, insn, t1 + 4, 0xaa_bb_cc_dd); + + bytes32 postState = mips.step(encodeState(state), bytes.concat(threadWitness, memProof), 0); + assertEq(postState, outputState(expect), "unexpected post state"); + } + + function test_swr_succeeds() public { + uint32 t1 = 0x100; + uint32 insn = encodeitype(0x2e, 0x9, 0x8, 0x5); // swr $t0, 5($t1) + (MIPS2.State memory state, MIPS2.ThreadState memory thread, bytes memory memProof) = + constructMIPSState(0, insn, t1 + 4, 0); + thread.registers[8] = 0xaa_bb_cc_dd; // t0 + thread.registers[9] = t1; + bytes memory threadWitness = abi.encodePacked(encodeThread(thread), EMPTY_THREAD_ROOT); + updateThreadStacks(state, thread); + + MIPS2.State memory expect = arithmeticPostState(state, thread, 8, /* t0 */ thread.registers[8]); + (expect.memRoot,) = ffi.getCannonMemoryProof(0, insn, t1 + 4, 0xcc_dd_00_00); + + bytes32 postState = mips.step(encodeState(state), bytes.concat(threadWitness, memProof), 0); + assertEq(postState, outputState(expect), "unexpected post state"); + } + + function test_ll_succeeds() public { + uint32 base = 0x100; + uint32 memVal = 0x12_23_45_67; + uint16 offset = 0x4; + uint32 effAddr = base + offset; + uint32 insn = encodeitype(0x30, 0x9, 0x8, offset); // ll baseReg, rtReg, offset + + (MIPS2.State memory state, MIPS2.ThreadState memory thread, bytes memory memProof) = + constructMIPSState(0, insn, effAddr, memVal); + thread.registers[8] = 0; // rtReg + thread.registers[9] = base; + bytes memory threadWitness = abi.encodePacked(encodeThread(thread), EMPTY_THREAD_ROOT); + updateThreadStacks(state, thread); + + MIPS2.State memory expect = arithmeticPostState(state, thread, 8, memVal); + expect.llReservationActive = true; + expect.llAddress = effAddr; + expect.llOwnerThread = thread.threadID; + + bytes32 postState = mips.step(encodeState(state), bytes.concat(threadWitness, memProof), 0); + assertEq(postState, outputState(expect), "unexpected post state"); + } + + function test_sc_succeeds() public { + uint32 base = 0x100; + uint16 offset = 0x4; + uint32 effAddr = base + offset; + uint32 writeMemVal = 0xaa_bb_cc_dd; + uint32 insn = encodeitype(0x38, 0x9, 0x8, offset); // ll baseReg, rtReg, offset + + (MIPS2.State memory state, MIPS2.ThreadState memory thread, bytes memory memProof) = + constructMIPSState(0, insn, effAddr, 0); + state.llReservationActive = true; + state.llAddress = effAddr; + state.llOwnerThread = thread.threadID; + thread.registers[8] = writeMemVal; + thread.registers[9] = base; + bytes memory threadWitness = abi.encodePacked(encodeThread(thread), EMPTY_THREAD_ROOT); + updateThreadStacks(state, thread); + + MIPS2.State memory expect = arithmeticPostState(state, thread, 8, 0x1); + (expect.memRoot,) = ffi.getCannonMemoryProof(0, insn, effAddr, writeMemVal); + expect.llReservationActive = false; + expect.llAddress = 0; + expect.llOwnerThread = 0; + + bytes32 postState = mips.step(encodeState(state), bytes.concat(threadWitness, memProof), 0); + assertEq(postState, outputState(expect), "unexpected post state"); + } + + function test_movn_succeeds() public { + uint32 insn = encodespec(0x9, 0xa, 0x8, 0xb); // movn $t0, $t1, $t2 + (MIPS2.State memory state, MIPS2.ThreadState memory thread, bytes memory memProof) = + constructMIPSState(0, insn, 0x4, 0); + thread.registers[8] = 0xa; // t0 + thread.registers[9] = 0xb; // t1 + thread.registers[10] = 0x1; // t2 + bytes memory threadWitness = abi.encodePacked(encodeThread(thread), EMPTY_THREAD_ROOT); + updateThreadStacks(state, thread); + + uint32 result = thread.registers[9]; // t1 + MIPS2.State memory expect = arithmeticPostState(state, thread, 8, /* t0 */ result); + bytes32 postState = mips.step(encodeState(state), bytes.concat(threadWitness, memProof), 0); + assertEq(postState, outputState(expect), "unexpected post state"); + + thread.registers[10] = 0x0; // t2 + updateThreadStacks(state, thread); + expect = arithmeticPostState(state, thread, 8, /* t0 */ thread.registers[8]); + threadWitness = abi.encodePacked(encodeThread(thread), EMPTY_THREAD_ROOT); + postState = mips.step(encodeState(state), bytes.concat(threadWitness, memProof), 0); + assertEq(postState, outputState(expect), "unexpected post state"); + } + + function test_movz_succeeds() public { + uint32 insn = encodespec(0x9, 0xa, 0x8, 0xa); // movz $t0, $t1, $t2 + (MIPS2.State memory state, MIPS2.ThreadState memory thread, bytes memory memProof) = + constructMIPSState(0, insn, 0x4, 0); + thread.registers[8] = 0xa; // t0 + thread.registers[9] = 0xb; // t1 + thread.registers[10] = 0x0; // t2 + bytes memory threadWitness = abi.encodePacked(encodeThread(thread), EMPTY_THREAD_ROOT); + updateThreadStacks(state, thread); + + uint32 result = thread.registers[9]; // t1 + MIPS2.State memory expect = arithmeticPostState(state, thread, 8, /* t0 */ result); + bytes32 postState = mips.step(encodeState(state), bytes.concat(threadWitness, memProof), 0); + assertEq(postState, outputState(expect), "unexpected post state"); + + thread.registers[10] = 0x1; // t2 + updateThreadStacks(state, thread); + expect = arithmeticPostState(state, thread, 8, /* t0 */ thread.registers[8]); + threadWitness = abi.encodePacked(encodeThread(thread), EMPTY_THREAD_ROOT); + postState = mips.step(encodeState(state), bytes.concat(threadWitness, memProof), 0); + assertEq(postState, outputState(expect), "unexpected post state"); + } + + function test_mflo_succeeds() public { + uint32 insn = encodespec(0x0, 0x0, 0x8, 0x12); // mflo $t0 + (MIPS2.State memory state, MIPS2.ThreadState memory thread, bytes memory memProof) = + constructMIPSState(0, insn, 0x4, 0); + thread.lo = 0xdeadbeef; + bytes memory threadWitness = abi.encodePacked(encodeThread(thread), EMPTY_THREAD_ROOT); + updateThreadStacks(state, thread); + + MIPS2.State memory expect = arithmeticPostState(state, thread, 8, /* t0 */ thread.lo); + + bytes32 postState = mips.step(encodeState(state), bytes.concat(threadWitness, memProof), 0); + assertEq(postState, outputState(expect), "unexpected post state"); + } + + function test_mfhi_succeeds() public { + uint32 insn = encodespec(0x0, 0x0, 0x8, 0x10); // mfhi $t0 + (MIPS2.State memory state, MIPS2.ThreadState memory thread, bytes memory memProof) = + constructMIPSState(0, insn, 0x4, 0); + thread.hi = 0xdeadbeef; + bytes memory threadWitness = abi.encodePacked(encodeThread(thread), EMPTY_THREAD_ROOT); + updateThreadStacks(state, thread); + + MIPS2.State memory expect = arithmeticPostState(state, thread, 8, /* t0 */ thread.hi); + + bytes32 postState = mips.step(encodeState(state), bytes.concat(threadWitness, memProof), 0); + assertEq(postState, outputState(expect), "unexpected post state"); + } + + function test_mthi_succeeds() public { + uint32 insn = encodespec(0x8, 0x0, 0x0, 0x11); // mthi $t0 + (MIPS2.State memory state, MIPS2.ThreadState memory thread, bytes memory memProof) = + constructMIPSState(0, insn, 0x4, 0); + thread.registers[8] = 0xdeadbeef; // t0 + bytes memory threadWitness = abi.encodePacked(encodeThread(thread), EMPTY_THREAD_ROOT); + updateThreadStacks(state, thread); + + thread.hi = thread.registers[8]; + MIPS2.State memory expect = arithmeticPostState(state, thread, 8, /* t0 */ thread.registers[8]); + + bytes32 postState = mips.step(encodeState(state), bytes.concat(threadWitness, memProof), 0); + assertEq(postState, outputState(expect), "unexpected post state"); + } + + function test_mtlo_succeeds() public { + uint32 insn = encodespec(0x8, 0x0, 0x0, 0x13); // mtlo $t0 + (MIPS2.State memory state, MIPS2.ThreadState memory thread, bytes memory memProof) = + constructMIPSState(0, insn, 0x4, 0); + thread.registers[8] = 0xdeadbeef; // t0 + bytes memory threadWitness = abi.encodePacked(encodeThread(thread), EMPTY_THREAD_ROOT); + updateThreadStacks(state, thread); + + thread.lo = thread.registers[8]; + MIPS2.State memory expect = arithmeticPostState(state, thread, 8, /* t0 */ thread.registers[8]); + + bytes32 postState = mips.step(encodeState(state), bytes.concat(threadWitness, memProof), 0); + assertEq(postState, outputState(expect), "unexpected post state"); + } + + function test_mul_succeeds() public { + uint32 insn = encodespec2(0x9, 0xa, 0x8, 0x2); // mul t0, t1, t2 + (MIPS2.State memory state, MIPS2.ThreadState memory thread, bytes memory memProof) = + constructMIPSState(0, insn, 0x4, 0); + thread.registers[9] = 5; // t1 + thread.registers[10] = 2; // t2 + bytes memory threadWitness = abi.encodePacked(encodeThread(thread), EMPTY_THREAD_ROOT); + updateThreadStacks(state, thread); + + uint32 result = thread.registers[9] * thread.registers[10]; // t0 + MIPS2.State memory expect = arithmeticPostState(state, thread, 8, /* t0 */ result); + + bytes32 postState = mips.step(encodeState(state), bytes.concat(threadWitness, memProof), 0); + assertEq(postState, outputState(expect), "unexpected post state"); + } + + function test_mult_succeeds() public { + uint32 insn = encodespec(0x9, 0xa, 0x0, 0x18); // mult t1, t2 + (MIPS2.State memory state, MIPS2.ThreadState memory thread, bytes memory memProof) = + constructMIPSState(0, insn, 0x4, 0); + thread.registers[9] = 0x0F_FF_00_00; // t1 + thread.registers[10] = 100; // t2 + bytes memory threadWitness = abi.encodePacked(encodeThread(thread), EMPTY_THREAD_ROOT); + updateThreadStacks(state, thread); + + uint32 loResult = 0x3F_9C_00_00; + uint32 hiResult = 0x6; + thread.lo = loResult; + thread.hi = hiResult; + MIPS2.State memory expect = arithmeticPostState(state, thread, 0, /* t0 */ 0); // no update on t0 + + bytes32 postState = mips.step(encodeState(state), bytes.concat(threadWitness, memProof), 0); + assertEq(postState, outputState(expect), "unexpected post state"); + } + + function test_multu_succeeds() public { + uint32 insn = encodespec(0x9, 0xa, 0x0, 0x19); // multu t1, t2 + (MIPS2.State memory state, MIPS2.ThreadState memory thread, bytes memory memProof) = + constructMIPSState(0, insn, 0x4, 0); + thread.registers[9] = 0x0F_FF_00_00; // t1 + thread.registers[10] = 100; // t2 + bytes memory threadWitness = abi.encodePacked(encodeThread(thread), EMPTY_THREAD_ROOT); + updateThreadStacks(state, thread); + + uint32 loResult = 0x3F_9C_00_00; + uint32 hiResult = 0x6; + thread.lo = loResult; + thread.hi = hiResult; + MIPS2.State memory expect = arithmeticPostState(state, thread, 0, /* t0 */ 0); // no update on t0 + + bytes32 postState = mips.step(encodeState(state), bytes.concat(threadWitness, memProof), 0); + assertEq(postState, outputState(expect), "unexpected post state"); + } + + function test_div_succeeds() public { + uint32 insn = encodespec(0x9, 0xa, 0x0, 0x1a); // div t1, t2 + (MIPS2.State memory state, MIPS2.ThreadState memory thread, bytes memory memProof) = + constructMIPSState(0, insn, 0x4, 0); + thread.registers[9] = 5; // t1 + thread.registers[10] = 2; // t2 + bytes memory threadWitness = abi.encodePacked(encodeThread(thread), EMPTY_THREAD_ROOT); + updateThreadStacks(state, thread); + + thread.lo = 2; + thread.hi = 1; + MIPS2.State memory expect = arithmeticPostState(state, thread, 0, /* t0 */ 0); // no update on t0 + + bytes32 postState = mips.step(encodeState(state), bytes.concat(threadWitness, memProof), 0); + assertEq(postState, outputState(expect), "unexpected post state"); + } + + function test_divu_succeeds() public { + uint32 insn = encodespec(0x9, 0xa, 0x0, 0x1b); // divu t1, t2 + (MIPS2.State memory state, MIPS2.ThreadState memory thread, bytes memory memProof) = + constructMIPSState(0, insn, 0x4, 0); + thread.registers[9] = 5; // t1 + thread.registers[10] = 2; // t2 + bytes memory threadWitness = abi.encodePacked(encodeThread(thread), EMPTY_THREAD_ROOT); + updateThreadStacks(state, thread); + + thread.lo = 2; + thread.hi = 1; + MIPS2.State memory expect = arithmeticPostState(state, thread, 0, /* t0 */ 0); // no update on t0 + + bytes32 postState = mips.step(encodeState(state), bytes.concat(threadWitness, memProof), 0); + assertEq(postState, outputState(expect), "unexpected post state"); + } + + function test_div_byZero_fails() public { + uint32 insn = encodespec(0x9, 0xa, 0x0, 0x1a); // div t1, t2 + (MIPS2.State memory state, MIPS2.ThreadState memory thread, bytes memory memProof) = + constructMIPSState(0, insn, 0x4, 0); + thread.registers[9] = 5; // t1 + thread.registers[10] = 0; // t2 + bytes memory threadWitness = abi.encodePacked(encodeThread(thread), EMPTY_THREAD_ROOT); + updateThreadStacks(state, thread); + + vm.expectRevert("MIPS: division by zero"); + mips.step(encodeState(state), bytes.concat(threadWitness, memProof), 0); + } + + function test_divu_byZero_fails() public { + uint32 insn = encodespec(0x9, 0xa, 0x0, 0x1b); // divu t1, t2 + (MIPS2.State memory state, MIPS2.ThreadState memory thread, bytes memory memProof) = + constructMIPSState(0, insn, 0x4, 0); + thread.registers[9] = 5; // t1 + thread.registers[10] = 0; // t2 + bytes memory threadWitness = abi.encodePacked(encodeThread(thread), EMPTY_THREAD_ROOT); + updateThreadStacks(state, thread); + + vm.expectRevert("MIPS: division by zero"); + mips.step(encodeState(state), bytes.concat(threadWitness, memProof), 0); + } + + function test_beq_succeeds() public { + uint16 boff = 0x10; + uint32 insn = encodeitype(0x4, 0x9, 0x8, boff); // beq $t0, $t1, 16 + (MIPS2.State memory state, MIPS2.ThreadState memory thread, bytes memory memProof) = + constructMIPSState(0, insn, 0x4, 0); + thread.registers[8] = 0xdeadbeef; // t0 + thread.registers[9] = 0xdeadbeef; // t1 + bytes memory threadWitness = abi.encodePacked(encodeThread(thread), EMPTY_THREAD_ROOT); + updateThreadStacks(state, thread); + + MIPS2.State memory expect = controlFlowPostState(state, thread, thread.nextPC + (uint32(boff) << 2)); + + bytes32 postState = mips.step(encodeState(state), bytes.concat(threadWitness, memProof), 0); + assertEq(postState, outputState(expect), "unexpected post state"); + } + + function test_beq_notTaken_succeeds() public { + uint16 boff = 0x10; + uint32 insn = encodeitype(0x4, 0x9, 0x8, boff); // beq $t0, $t1, 16 + (MIPS2.State memory state, MIPS2.ThreadState memory thread, bytes memory memProof) = + constructMIPSState(0, insn, 0x4, 0); + thread.registers[8] = 0xaa; // t0 + thread.registers[9] = 0xdeadbeef; // t1 + bytes memory threadWitness = abi.encodePacked(encodeThread(thread), EMPTY_THREAD_ROOT); + updateThreadStacks(state, thread); + + MIPS2.State memory expect = controlFlowPostState(state, thread, thread.nextPC + 4); + + bytes32 postState = mips.step(encodeState(state), bytes.concat(threadWitness, memProof), 0); + assertEq(postState, outputState(expect), "unexpected post state"); + } + + function test_bne_succeeds() public { + uint16 boff = 0x10; + uint32 insn = encodeitype(0x5, 0x9, 0x8, boff); // bne $t0, $t1, 16 + (MIPS2.State memory state, MIPS2.ThreadState memory thread, bytes memory memProof) = + constructMIPSState(0, insn, 0x4, 0); + thread.registers[8] = 0xdeadbeef; // t0 + thread.registers[9] = 0xaa; // t1 + bytes memory threadWitness = abi.encodePacked(encodeThread(thread), EMPTY_THREAD_ROOT); + updateThreadStacks(state, thread); + + MIPS2.State memory expect = controlFlowPostState(state, thread, thread.nextPC + (uint32(boff) << 2)); + + bytes32 postState = mips.step(encodeState(state), bytes.concat(threadWitness, memProof), 0); + assertEq(postState, outputState(expect), "unexpected post state"); + } + + function test_blez_succeeds() public { + uint16 boff = 0x10; + uint32 insn = encodeitype(0x6, 0x8, 0x0, boff); // blez $t0, 16 + (MIPS2.State memory state, MIPS2.ThreadState memory thread, bytes memory memProof) = + constructMIPSState(0, insn, 0x4, 0); + thread.registers[8] = 0; // t0 + bytes memory threadWitness = abi.encodePacked(encodeThread(thread), EMPTY_THREAD_ROOT); + updateThreadStacks(state, thread); + + MIPS2.State memory expect = controlFlowPostState(state, thread, thread.nextPC + (uint32(boff) << 2)); + + bytes32 postState = mips.step(encodeState(state), bytes.concat(threadWitness, memProof), 0); + assertEq(postState, outputState(expect), "unexpected post state"); + } + + function test_bgtz_succeeds() public { + uint16 boff = 0xa0; + uint32 insn = encodeitype(0x7, 0x8, 0x0, boff); // bgtz $t0, 0xa0 + (MIPS2.State memory state, MIPS2.ThreadState memory thread, bytes memory memProof) = + constructMIPSState(0, insn, 0x4, 0); + thread.registers[8] = 1; // t0 + bytes memory threadWitness = abi.encodePacked(encodeThread(thread), EMPTY_THREAD_ROOT); + updateThreadStacks(state, thread); + + MIPS2.State memory expect = controlFlowPostState(state, thread, thread.nextPC + (uint32(boff) << 2)); + + bytes32 postState = mips.step(encodeState(state), bytes.concat(threadWitness, memProof), 0); + assertEq(postState, outputState(expect), "unexpected post state"); + } + + function test_bltz_succeeds() public { + uint16 boff = 0x10; + uint32 insn = encodeitype(0x1, 0x8, 0x0, boff); // bltz $t0, 16 + (MIPS2.State memory state, MIPS2.ThreadState memory thread, bytes memory memProof) = + constructMIPSState(0, insn, 0x4, 0); + thread.registers[8] = 0xF0_00_00_00; // t0 + bytes memory threadWitness = abi.encodePacked(encodeThread(thread), EMPTY_THREAD_ROOT); + updateThreadStacks(state, thread); + + MIPS2.State memory expect = controlFlowPostState(state, thread, thread.nextPC + (uint32(boff) << 2)); + + bytes32 postState = mips.step(encodeState(state), bytes.concat(threadWitness, memProof), 0); + assertEq(postState, outputState(expect), "unexpected post state"); + } + + function test_bgez_succeeds() public { + uint16 boff = 0x10; + uint32 insn = encodeitype(0x1, 0x8, 0x1, boff); // bgez $t0, 16 + (MIPS2.State memory state, MIPS2.ThreadState memory thread, bytes memory memProof) = + constructMIPSState(0, insn, 0x4, 0); + thread.registers[8] = 0x00_00_00_01; // t0 + bytes memory threadWitness = abi.encodePacked(encodeThread(thread), EMPTY_THREAD_ROOT); + updateThreadStacks(state, thread); + + MIPS2.State memory expect = controlFlowPostState(state, thread, thread.nextPC + (uint32(boff) << 2)); + + bytes32 postState = mips.step(encodeState(state), bytes.concat(threadWitness, memProof), 0); + assertEq(postState, outputState(expect), "unexpected post state"); + } + + function test_jump_succeeds() public { + uint32 label = 0x02_00_00_02; // set the 26th bit to assert no sign extension + uint32 insn = uint32(0x08_00_00_00) | label; // j label + (MIPS2.State memory state, MIPS2.ThreadState memory thread, bytes memory memProof) = + constructMIPSState(0, insn, 0x4, 0); + bytes memory threadWitness = abi.encodePacked(encodeThread(thread), EMPTY_THREAD_ROOT); + updateThreadStacks(state, thread); + + MIPS2.State memory expect = controlFlowPostState(state, thread, label << 2); + + bytes32 postState = mips.step(encodeState(state), bytes.concat(threadWitness, memProof), 0); + assertEq(postState, outputState(expect), "unexpected post state"); + } + + function test_jump_nonzeroRegion_succeeds() public { + uint32 pcRegion1 = 0x10000000; + uint32 label = 0x2; + uint32 insn = uint32(0x08_00_00_00) | label; // j label + (MIPS2.State memory state, MIPS2.ThreadState memory thread, bytes memory memProof) = + constructMIPSState(pcRegion1, insn, 0x4, 0); + bytes memory threadWitness = abi.encodePacked(encodeThread(thread), EMPTY_THREAD_ROOT); + updateThreadStacks(state, thread); + + MIPS2.State memory expect = + controlFlowPostState(state, thread, (thread.nextPC & 0xF0_00_00_00) | (uint32(label) << 2)); + + bytes32 postState = mips.step(encodeState(state), bytes.concat(threadWitness, memProof), 0); + assertEq(postState, outputState(expect), "unexpected post state"); + } + + function test_jal_succeeds() public { + uint32 label = 0x02_00_00_02; // set the 26th bit to assert no sign extension + uint32 insn = uint32(0x0c_00_00_00) | label; // jal label + (MIPS2.State memory state, MIPS2.ThreadState memory thread, bytes memory memProof) = + constructMIPSState(0, insn, 0x4, 0); + bytes memory threadWitness = abi.encodePacked(encodeThread(thread), EMPTY_THREAD_ROOT); + updateThreadStacks(state, thread); + + thread.registers[31] = thread.pc + 8; // ra + MIPS2.State memory expect = controlFlowPostState(state, thread, label << 2); + + bytes32 postState = mips.step(encodeState(state), bytes.concat(threadWitness, memProof), 0); + assertEq(postState, outputState(expect), "unexpected post state"); + } + + function test_jal_nonzeroRegion_succeeds() public { + uint32 pcRegion1 = 0x10000000; + uint32 label = 0x2; + uint32 insn = uint32(0x0c_00_00_00) | label; // jal label + (MIPS2.State memory state, MIPS2.ThreadState memory thread, bytes memory memProof) = + constructMIPSState(pcRegion1, insn, 0x4, 0); + bytes memory threadWitness = abi.encodePacked(encodeThread(thread), EMPTY_THREAD_ROOT); + updateThreadStacks(state, thread); + + thread.registers[31] = thread.pc + 8; // ra + MIPS2.State memory expect = + controlFlowPostState(state, thread, (thread.nextPC & 0xF0_00_00_00) | (uint32(label) << 2)); + + bytes32 postState = mips.step(encodeState(state), bytes.concat(threadWitness, memProof), 0); + assertEq(postState, outputState(expect), "unexpected post state"); + } + + function test_jr_succeeds() public { + uint16 tgt = 0x34; + uint32 insn = encodespec(0x8, 0, 0, 0x8); // jr t0 + (MIPS2.State memory state, MIPS2.ThreadState memory thread, bytes memory memProof) = + constructMIPSState(0, insn, 0x4, 0); + thread.registers[8] = tgt; // t0 + bytes memory threadWitness = abi.encodePacked(encodeThread(thread), EMPTY_THREAD_ROOT); + updateThreadStacks(state, thread); + + MIPS2.State memory expect = controlFlowPostState(state, thread, tgt); + + bytes32 postState = mips.step(encodeState(state), bytes.concat(threadWitness, memProof), 0); + assertEq(postState, outputState(expect), "unexpected post state"); + } + + function test_jalr_succeeds() public { + uint16 tgt = 0x34; + uint32 insn = encodespec(0x8, 0, 0x9, 0x9); // jalr t1, t0 + (MIPS2.State memory state, MIPS2.ThreadState memory thread, bytes memory memProof) = + constructMIPSState(0, insn, 0x4, 0); + thread.registers[8] = tgt; // t0 + bytes memory threadWitness = abi.encodePacked(encodeThread(thread), EMPTY_THREAD_ROOT); + updateThreadStacks(state, thread); + + thread.registers[9] = thread.pc + 8; // t1 + MIPS2.State memory expect = controlFlowPostState(state, thread, tgt); + + bytes32 postState = mips.step(encodeState(state), bytes.concat(threadWitness, memProof), 0); + assertEq(postState, outputState(expect), "unexpected post state"); + } + + function test_sll_succeeds() external { + uint8 shiftamt = 4; + uint32 insn = encodespec(0x0, 0x9, 0x8, uint16(shiftamt) << 6); // sll t0, t1, 3 + (MIPS2.State memory state, MIPS2.ThreadState memory thread, bytes memory memProof) = + constructMIPSState(0, insn, 0x4, 0); + thread.registers[9] = 0x20; // t1 + updateThreadStacks(state, thread); + + uint32 result = thread.registers[9] << shiftamt; + MIPS2.State memory expect = arithmeticPostState(state, thread, 8, /* t0 */ result); + + bytes32 postState = mips.step( + encodeState(state), bytes.concat(abi.encodePacked(encodeThread(thread), EMPTY_THREAD_ROOT), memProof), 0 + ); + assertEq(postState, outputState(expect), "unexpected post state"); + } + + function test_srl_succeeds() external { + uint8 shiftamt = 4; + uint32 insn = encodespec(0x0, 0x9, 0x8, uint16(shiftamt) << 6 | 2); // srl t0, t1, 3 + (MIPS2.State memory state, MIPS2.ThreadState memory thread, bytes memory memProof) = + constructMIPSState(0, insn, 0x4, 0); + thread.registers[9] = 0x20; // t1 + updateThreadStacks(state, thread); + + uint32 result = thread.registers[9] >> shiftamt; + MIPS2.State memory expect = arithmeticPostState(state, thread, 8, /* t0 */ result); + + bytes32 postState = mips.step( + encodeState(state), bytes.concat(abi.encodePacked(encodeThread(thread), EMPTY_THREAD_ROOT), memProof), 0 + ); + assertEq(postState, outputState(expect), "unexpected post state"); + } + + function test_sra_succeeds() external { + uint8 shiftamt = 4; + uint32 insn = encodespec(0x0, 0x9, 0x8, uint16(shiftamt) << 6 | 3); // sra t0, t1, 3 + (MIPS2.State memory state, MIPS2.ThreadState memory thread, bytes memory memProof) = + constructMIPSState(0, insn, 0x4, 0); + thread.registers[9] = 0x80_00_00_20; // t1 + updateThreadStacks(state, thread); + + uint32 result = 0xF8_00_00_02; // 4 shifts while preserving sign bit + MIPS2.State memory expect = arithmeticPostState(state, thread, 8, /* t0 */ result); + + bytes32 postState = mips.step( + encodeState(state), bytes.concat(abi.encodePacked(encodeThread(thread), EMPTY_THREAD_ROOT), memProof), 0 + ); + assertEq(postState, outputState(expect), "unexpected post state"); + } + + function test_sllv_succeeds() external { + uint32 insn = encodespec(0xa, 0x9, 0x8, 4); // sllv t0, t1, t2 + (MIPS2.State memory state, MIPS2.ThreadState memory thread, bytes memory memProof) = + constructMIPSState(0, insn, 0x4, 0); + thread.registers[9] = 0x20; // t1 + thread.registers[10] = 4; // t2 + updateThreadStacks(state, thread); + + uint32 result = thread.registers[9] << thread.registers[10]; + MIPS2.State memory expect = arithmeticPostState(state, thread, 8, /* t0 */ result); + + bytes32 postState = mips.step( + encodeState(state), bytes.concat(abi.encodePacked(encodeThread(thread), EMPTY_THREAD_ROOT), memProof), 0 + ); + assertEq(postState, outputState(expect), "unexpected post state"); + } + + function test_srlv_succeeds() external { + uint32 insn = encodespec(0xa, 0x9, 0x8, 6); // srlv t0, t1, t2 + (MIPS2.State memory state, MIPS2.ThreadState memory thread, bytes memory memProof) = + constructMIPSState(0, insn, 0x4, 0); + thread.registers[9] = 0x20_00; // t1 + thread.registers[10] = 4; // t2 + updateThreadStacks(state, thread); + + uint32 result = thread.registers[9] >> thread.registers[10]; + MIPS2.State memory expect = arithmeticPostState(state, thread, 8, /* t0 */ result); + + bytes32 postState = mips.step( + encodeState(state), bytes.concat(abi.encodePacked(encodeThread(thread), EMPTY_THREAD_ROOT), memProof), 0 + ); + assertEq(postState, outputState(expect), "unexpected post state"); + } + + function test_lui_succeeds() external { + uint32 insn = encodeitype(0xf, 0x0, 0x8, 0x4); // lui $t0, 0x04 + (MIPS2.State memory state, MIPS2.ThreadState memory thread, bytes memory memProof) = + constructMIPSState(0, insn, 0x4, 0); + updateThreadStacks(state, thread); + + MIPS2.State memory expect = arithmeticPostState(state, thread, 8, /* t0 */ 0x00_04_00_00); + bytes32 postState = mips.step( + encodeState(state), bytes.concat(abi.encodePacked(encodeThread(thread), EMPTY_THREAD_ROOT), memProof), 0 + ); + assertEq(postState, outputState(expect), "unexpected post state"); + } + + function test_clo_succeeds() external { + uint32 insn = encodespec2(0x9, 0x0, 0x8, 0x21); // clo t0, t1 + (MIPS2.State memory state, MIPS2.ThreadState memory thread, bytes memory memProof) = + constructMIPSState(0, insn, 0x4, 0); + thread.registers[9] = 0xFF_00_00_00; // t1 + updateThreadStacks(state, thread); + + MIPS2.State memory expect = arithmeticPostState(state, thread, 8, /* t0 */ 8); + bytes32 postState = mips.step( + encodeState(state), bytes.concat(abi.encodePacked(encodeThread(thread), EMPTY_THREAD_ROOT), memProof), 0 + ); + assertEq(postState, outputState(expect), "unexpected post state"); + } + + function test_clz_succeeds() external { + uint32 insn = encodespec2(0x9, 0x0, 0x8, 0x20); // clz t0, t1 + (MIPS2.State memory state, MIPS2.ThreadState memory thread, bytes memory memProof) = + constructMIPSState(0, insn, 0x4, 0); + thread.registers[9] = 0x00_00_F0_00; // t1 + updateThreadStacks(state, thread); + + MIPS2.State memory expect = arithmeticPostState(state, thread, 8, /* t0 */ 16); + bytes32 postState = mips.step( + encodeState(state), bytes.concat(abi.encodePacked(encodeThread(thread), EMPTY_THREAD_ROOT), memProof), 0 + ); + assertEq(postState, outputState(expect), "unexpected post state"); + } + + function test_preimage_read_succeeds() external { + uint32 pc = 0x0; + uint32 insn = 0x0000000c; // syscall + uint32 a1 = 0x4; + uint32 a1_val = 0x0000abba; + (MIPS2.State memory state, MIPS2.ThreadState memory thread, bytes memory memProof) = + constructMIPSState(0, insn, a1, a1_val); + state.preimageKey = bytes32(uint256(1) << 248 | 0x01); + state.preimageOffset = 8; // start reading past the pre-image length prefix + thread.registers[2] = 4003; // read syscall + thread.registers[4] = 5; // fd + thread.registers[5] = a1; // addr + thread.registers[6] = 4; // count + threading.createThread(); + threading.replaceCurrent(thread); + bytes memory threadWitness = threading.witness(); + finalizeThreadingState(threading, state); + + MIPS2.ThreadState memory expectThread = copyThread(thread); + expectThread.pc = thread.nextPC; + expectThread.nextPC = thread.nextPC + 4; + expectThread.registers[2] = 4; // return + expectThread.registers[7] = 0; // errno + threading.replaceCurrent(expectThread); + + // prime the pre-image oracle + bytes32 word = bytes32(uint256(0xdeadbeef) << 224); + uint8 size = 4; + uint8 partOffset = 8; + oracle.loadLocalData(uint256(state.preimageKey), 0, word, size, partOffset); + + MIPS2.State memory expect = copyState(state); + expect.preimageOffset += 4; + expect.step = state.step + 1; + expect.stepsSinceLastContextSwitch = state.stepsSinceLastContextSwitch + 1; + // recompute merkle root of written pre-image + (expect.memRoot,) = ffi.getCannonMemoryProof(pc, insn, a1, 0xdeadbeef); + finalizeThreadingState(threading, expect); + + bytes32 postState = mips.step(encodeState(state), bytes.concat(threadWitness, memProof), 0); + assertEq(postState, outputState(expect), "unexpected post state"); + } + + function test_preimage_write_succeeds() external { + uint32 insn = 0x0000000c; // syscall + uint32 a1 = 0x4; + uint32 a1_val = 0x0000abba; + (MIPS2.State memory state, MIPS2.ThreadState memory thread, bytes memory memProof) = + constructMIPSState(0, insn, a1, a1_val); + state.preimageKey = bytes32(0); + state.preimageOffset = 1; + thread.registers[2] = 4004; // write syscall + thread.registers[4] = 6; // fd + thread.registers[5] = a1; // addr + thread.registers[6] = 4; // count + threading.createThread(); + threading.replaceCurrent(thread); + bytes memory threadWitness = threading.witness(); + finalizeThreadingState(threading, state); + + MIPS2.ThreadState memory expectThread = copyThread(thread); + expectThread.pc = thread.nextPC; + expectThread.nextPC = thread.nextPC + 4; + expectThread.registers[2] = 4; // return + expectThread.registers[7] = 0; // errno + threading.replaceCurrent(expectThread); + + MIPS2.State memory expect = copyState(state); + expect.preimageKey = bytes32(uint256(0xabba)); + expect.preimageOffset = 0; + expect.step = state.step + 1; + expect.stepsSinceLastContextSwitch = state.stepsSinceLastContextSwitch + 1; + finalizeThreadingState(threading, expect); + + bytes32 postState = mips.step(encodeState(state), bytes.concat(threadWitness, memProof), 0); + assertEq(postState, outputState(expect), "unexpected post state"); + } + + /// @dev Modifies the MIPS2 State based on threading state + function finalizeThreadingState(Threading _threading, MIPS2.State memory _state) internal view { + _state.leftThreadStack = _threading.left().root(); + _state.rightThreadStack = _threading.right().root(); + _state.nextThreadID = uint32(_threading.nextThreadID()); + } + + /// @dev constructs a generic MIPS2 state for single-threaded execution. + function constructMIPSState( + uint32 pc, + uint32 insn, + uint32 addr, + uint32 val + ) + internal + returns (MIPS2.State memory state_, MIPS2.ThreadState memory thread_, bytes memory proof_) + { + (state_.memRoot, proof_) = ffi.getCannonMemoryProof(pc, insn, addr, val); + state_.nextThreadID = 1; + state_.wakeup = sys.FUTEX_EMPTY_ADDR; + thread_.pc = pc; + thread_.nextPC = pc + 4; + thread_.futexAddr = sys.FUTEX_EMPTY_ADDR; + state_.leftThreadStack = keccak256(abi.encodePacked(EMPTY_THREAD_ROOT, keccak256(encodeThread(thread_)))); + state_.rightThreadStack = EMPTY_THREAD_ROOT; + } + + /// @dev Updates the state stack roots with a single thread + function updateThreadStacks(MIPS2.State memory _state, MIPS2.ThreadState memory _thread) internal pure { + if (_state.traverseRight) { + _state.rightThreadStack = keccak256(abi.encodePacked(EMPTY_THREAD_ROOT, keccak256(encodeThread(_thread)))); + } else { + _state.leftThreadStack = keccak256(abi.encodePacked(EMPTY_THREAD_ROOT, keccak256(encodeThread(_thread)))); + } + } + + /// @dev Constructs a post-state after an arithmetic or logical instruction + function arithmeticPostState( + MIPS2.State memory _state, + MIPS2.ThreadState memory _thread, + uint32 reg, + uint32 regVal + ) + internal + pure + returns (MIPS2.State memory out_) + { + MIPS2.ThreadState memory expectThread = copyThread(_thread); + expectThread.pc = _thread.nextPC; + expectThread.nextPC = _thread.nextPC + 4; + expectThread.registers[reg] = regVal; + + out_ = copyState(_state); + out_.step = _state.step + 1; + out_.stepsSinceLastContextSwitch = _state.stepsSinceLastContextSwitch + 1; + out_.leftThreadStack = keccak256(abi.encodePacked(EMPTY_THREAD_ROOT, keccak256(encodeThread(expectThread)))); + } + + /// @dev Constructs a post-state after a branch instruction + function controlFlowPostState( + MIPS2.State memory _state, + MIPS2.ThreadState memory _thread, + uint32 branchTarget + ) + internal + pure + returns (MIPS2.State memory out_) + { + MIPS2.ThreadState memory expectThread = copyThread(_thread); + expectThread.pc = _thread.nextPC; + expectThread.nextPC = branchTarget; + + out_ = copyState(_state); + out_.step = _state.step + 1; + out_.stepsSinceLastContextSwitch = _state.stepsSinceLastContextSwitch + 1; + out_.leftThreadStack = keccak256(abi.encodePacked(EMPTY_THREAD_ROOT, keccak256(encodeThread(expectThread)))); + } + + function encodeState(MIPS2.State memory _state) internal pure returns (bytes memory) { + // Split up encoding to get around stack-too-deep error + return abi.encodePacked(encodeStateA(_state), encodeStateB(_state)); + } + + function encodeStateA(MIPS2.State memory _state) internal pure returns (bytes memory) { + return abi.encodePacked( + _state.memRoot, + _state.preimageKey, + _state.preimageOffset, + _state.heap, + _state.llReservationActive, + _state.llAddress, + _state.llOwnerThread, + _state.exitCode, + _state.exited, + _state.step, + _state.stepsSinceLastContextSwitch, + _state.wakeup, + _state.traverseRight, + _state.leftThreadStack + ); + } + + function encodeStateB(MIPS2.State memory _state) internal pure returns (bytes memory) { + return abi.encodePacked(_state.rightThreadStack, _state.nextThreadID); + } + + function copyState(MIPS2.State memory _state) internal pure returns (MIPS2.State memory out_) { + bytes memory data = abi.encode(_state); + return abi.decode(data, (MIPS2.State)); + } + + function copyThread(MIPS2.ThreadState memory _thread) internal pure returns (MIPS2.ThreadState memory out_) { + bytes memory data = abi.encode(_thread); + return abi.decode(data, (MIPS2.ThreadState)); + } + + /// @dev MIPS VM status codes: + /// 0. Exited with success (Valid) + /// 1. Exited with success (Invalid) + /// 2. Exited with failure (Panic) + /// 3. Unfinished + function vmStatus(MIPS2.State memory state) internal pure returns (VMStatus out_) { + if (!state.exited) { + return VMStatuses.UNFINISHED; + } else if (state.exitCode == 0) { + return VMStatuses.VALID; + } else if (state.exitCode == 1) { + return VMStatuses.INVALID; + } else { + return VMStatuses.PANIC; + } + } + + event ExpectedOutputState(bytes encoded, MIPS2.State state); + + function outputState(MIPS2.State memory state) internal returns (bytes32 out_) { + bytes memory enc = encodeState(state); + emit ExpectedOutputState(enc, state); + VMStatus status = vmStatus(state); + out_ = keccak256(enc); + assembly { + out_ := or(and(not(shl(248, 0xFF)), out_), shl(248, status)) + } + } + + function encodeitype(uint8 opcode, uint8 rs, uint8 rt, uint16 imm) internal pure returns (uint32 insn) { + insn = uint32(opcode) << 26 | uint32(rs) << 21 | uint32(rt) << 16 | imm; + } + + function encodespec(uint8 rs, uint8 rt, uint8 rd, uint16 funct) internal pure returns (uint32 insn) { + insn = uint32(rs) << 21 | uint32(rt) << 16 | uint32(rd) << 11 | uint32(funct); + } + + function encodespec2(uint8 rs, uint8 rt, uint8 rd, uint8 funct) internal pure returns (uint32 insn) { + insn = uint32(28) << 26 | uint32(rs) << 21 | uint32(rt) << 16 | uint32(rd) << 11 | uint32(funct); + } +} + +function encodeThread(MIPS2.ThreadState memory _thread) pure returns (bytes memory) { + bytes memory registers; + for (uint256 i = 0; i < _thread.registers.length; i++) { + registers = bytes.concat(registers, abi.encodePacked(_thread.registers[i])); + } + return abi.encodePacked( + _thread.threadID, + _thread.exitCode, + _thread.exited, + _thread.futexAddr, + _thread.futexVal, + _thread.futexTimeoutStep, + _thread.pc, + _thread.nextPC, + _thread.lo, + _thread.hi, + registers + ); +} diff --git a/packages/contracts-bedrock/test/cannon/PreimageOracle.t.sol b/packages/contracts-bedrock/test/cannon/PreimageOracle.t.sol index 5c8709ae9687..902f22b41ad5 100644 --- a/packages/contracts-bedrock/test/cannon/PreimageOracle.t.sol +++ b/packages/contracts-bedrock/test/cannon/PreimageOracle.t.sol @@ -7,6 +7,7 @@ import { PreimageOracle } from "src/cannon/PreimageOracle.sol"; import { PreimageKeyLib } from "src/cannon/PreimageKeyLib.sol"; import { LibKeccak } from "@lib-keccak/LibKeccak.sol"; import { Bytes } from "src/libraries/Bytes.sol"; +import { Process } from "scripts/libraries/Process.sol"; import "src/cannon/libraries/CannonErrors.sol"; import "src/cannon/libraries/CannonTypes.sol"; @@ -19,6 +20,14 @@ contract PreimageOracle_Test is Test { vm.label(address(oracle), "PreimageOracle"); } + /// @notice Tests that the challenge period cannot be made too large. + /// @param _challengePeriod The challenge period to test. + function testFuzz_constructor_challengePeriodTooLarge_reverts(uint256 _challengePeriod) public { + _challengePeriod = bound(_challengePeriod, uint256(type(uint64).max) + 1, type(uint256).max); + vm.expectRevert("challenge period too large"); + new PreimageOracle(0, _challengePeriod); + } + /// @notice Test the pre-image key computation with a known pre-image. function test_keccak256PreimageKey_succeeds() public pure { bytes memory preimage = hex"deadbeef"; @@ -91,8 +100,8 @@ contract PreimageOracle_Test is Test { { // Bound the size to [0, 32] size = bound(size, 0, 32); - // Bound the part offset to [0, size + 8] - partOffset = bound(partOffset, 0, size + 8); + // Bound the part offset to [0, size + 8) + partOffset = bound(partOffset, 0, size + 7); // Load the local data into the preimage oracle under the test contract's context. bytes32 contextKey = oracle.loadLocalData(ident, localContext, word, uint8(size), uint8(partOffset)); @@ -177,8 +186,9 @@ contract PreimageOracle_Test is Test { bytes memory input = hex"deadbeef"; uint256 offset = 0; address precompile = address(bytes20(uint160(0x02))); // sha256 - bytes32 key = precompilePreimageKey(precompile, input); - oracle.loadPrecompilePreimagePart(offset, precompile, input); + uint64 gas = 72; + bytes32 key = precompilePreimageKey(precompile, gas, input); + oracle.loadPrecompilePreimagePart(offset, precompile, gas, input); bytes32 part = oracle.preimageParts(key, offset); // size prefix - 1-byte result + 32-byte sha return data @@ -202,8 +212,9 @@ contract PreimageOracle_Test is Test { bytes memory input = hex"deadbeef"; uint256 offset = 9; address precompile = address(bytes20(uint160(0x02))); // sha256 - bytes32 key = precompilePreimageKey(precompile, input); - oracle.loadPrecompilePreimagePart(offset, precompile, input); + uint64 gas = 72; + bytes32 key = precompilePreimageKey(precompile, gas, input); + oracle.loadPrecompilePreimagePart(offset, precompile, gas, input); bytes32 part = oracle.preimageParts(key, offset); // 32-byte sha return data @@ -223,8 +234,9 @@ contract PreimageOracle_Test is Test { bytes memory input = new bytes(193); // invalid input to induce a failed precompile call uint256 offset = 0; address precompile = address(bytes20(uint160(0x08))); // bn256Pairing - bytes32 key = precompilePreimageKey(precompile, input); - oracle.loadPrecompilePreimagePart(offset, precompile, input); + uint64 gas = 72; + bytes32 key = precompilePreimageKey(precompile, gas, input); + oracle.loadPrecompilePreimagePart(offset, precompile, gas, input); bytes32 part = oracle.preimageParts(key, offset); // size prefix - 1-byte result + 0-byte sha return data @@ -248,8 +260,9 @@ contract PreimageOracle_Test is Test { bytes memory input = hex"deadbeef"; uint256 offset = 41; // 8-byte prefix + 1-byte result + 32-byte sha return data address precompile = address(bytes20(uint160(0x02))); // sha256 + uint64 gas = 72; vm.expectRevert(PartOffsetOOB.selector); - oracle.loadPrecompilePreimagePart(offset, precompile, input); + oracle.loadPrecompilePreimagePart(offset, precompile, gas, input); } /// @notice Tests that a global precompile result cannot be set with an out-of-bounds offset. @@ -257,8 +270,34 @@ contract PreimageOracle_Test is Test { bytes memory input = hex"deadbeef"; uint256 offset = 42; address precompile = address(bytes20(uint160(0x02))); // sha256 + uint64 gas = 72; vm.expectRevert(PartOffsetOOB.selector); - oracle.loadPrecompilePreimagePart(offset, precompile, input); + oracle.loadPrecompilePreimagePart(offset, precompile, gas, input); + } + + /// @notice Tests that a global precompile load succeeds on a variety of gas inputs. + function testFuzz_loadPrecompilePreimagePart_withVaryingGas_succeeds(uint64 _gas) public { + uint64 requiredGas = 100_000; + bytes memory input = hex"deadbeef"; + address precompile = address(uint160(0xdeadbeef)); + vm.mockCall(precompile, input, hex"abba"); + uint256 offset = 0; + uint64 minGas = uint64(bound(_gas, requiredGas * 3, 20_000_000)); + vm.expectCallMinGas(precompile, 0, requiredGas, input); + oracle.loadPrecompilePreimagePart{ gas: minGas }(offset, precompile, requiredGas, input); + } + + /// @notice Tests that a global precompile load succeeds on insufficient gas. + function test_loadPrecompilePreimagePart_withInsufficientGas_reverts() public { + uint64 requiredGas = 1_000_000; + bytes memory input = hex"deadbeef"; + uint256 offset = 0; + address precompile = address(uint160(0xdeadbeef)); + // This gas is sufficient to reach the gas checks in `loadPrecompilePreimagePart` but not enough to pass those + // checks + uint64 insufficientGas = requiredGas * 63 / 64; + vm.expectRevert(NotEnoughGas.selector); + oracle.loadPrecompilePreimagePart{ gas: insufficientGas }(offset, precompile, requiredGas, input); } } @@ -311,6 +350,17 @@ contract PreimageOracle_LargePreimageProposals_Test is Test { oracle.initLPP{ value: bondSize }(TEST_UUID, 0, uint32(data.length)); } + /// @notice Tests that the `initLPP` function reverts if the proposal has already been initialized. + function test_initLPP_alreadyInitialized_reverts() public { + // Initialize the proposal. + uint256 bondSize = oracle.MIN_BOND_SIZE(); + oracle.initLPP{ value: bondSize }(TEST_UUID, 0, uint32(500)); + + // Re-initialize the proposal. + vm.expectRevert(AlreadyInitialized.selector); + oracle.initLPP{ value: bondSize }(TEST_UUID, 0, uint32(500)); + } + /// @notice Gas snapshot for `addLeaves` function test_addLeaves_gasSnapshot() public { // Allocate the preimage data. @@ -598,6 +648,63 @@ contract PreimageOracle_LargePreimageProposals_Test is Test { }); } + /// @notice Tests that a proposal cannot be squeezed if the proposal has not been finalized. + function test_squeeze_notFinalized_reverts() public { + // Allocate the preimage data. + bytes memory data = new bytes(136); + for (uint256 i; i < data.length; i++) { + data[i] = 0xFF; + } + + // Initialize the proposal. + oracle.initLPP{ value: oracle.MIN_BOND_SIZE() }(TEST_UUID, 0, uint32(data.length)); + + // Generate the padded input data. + // Since the data is 136 bytes, which is exactly one keccak block, we will add one extra + // keccak block of empty padding to the input data. We need to do this here because the + // addLeavesLPP function will normally perform this padding internally when _finalize is + // set to true but we're explicitly testing the case where _finalize is not true. + bytes memory paddedData = new bytes(136 * 2); + for (uint256 i; i < data.length; i++) { + paddedData[i] = data[i]; + } + + // Add the leaves to the tree (2 keccak blocks.) + LibKeccak.StateMatrix memory stateMatrix; + bytes32[] memory stateCommitments = _generateStateCommitments(stateMatrix, data); + oracle.addLeavesLPP(TEST_UUID, 0, paddedData, stateCommitments, false); + + // Construct the leaf preimage data for the blocks added. + LibKeccak.StateMatrix memory matrix; + PreimageOracle.Leaf[] memory leaves = _generateLeaves(matrix, data); + + // Create a proof array with 16 elements. + bytes32[] memory preProof = new bytes32[](16); + preProof[0] = _hashLeaf(leaves[1]); + bytes32[] memory postProof = new bytes32[](16); + postProof[0] = _hashLeaf(leaves[0]); + for (uint256 i = 1; i < preProof.length; i++) { + bytes32 zeroHash = oracle.zeroHashes(i); + preProof[i] = zeroHash; + postProof[i] = zeroHash; + } + + // Warp past the challenge period. + vm.warp(block.timestamp + oracle.challengePeriod() + 1 seconds); + + // Finalize the proposal. + vm.expectRevert(ActiveProposal.selector); + oracle.squeezeLPP({ + _claimant: address(this), + _uuid: TEST_UUID, + _stateMatrix: _stateMatrixAtBlockIndex(data, 1), + _preState: leaves[0], + _preStateProof: preProof, + _postState: leaves[1], + _postStateProof: postProof + }); + } + /// @notice Tests that a proposal cannot be finalized until it has passed the challenge period. function test_squeeze_challengePeriodActive_reverts() public { // Allocate the preimage data. @@ -753,7 +860,7 @@ contract PreimageOracle_LargePreimageProposals_Test is Test { /// @notice Tests that squeezing a large preimage proposal after the challenge period has passed always succeeds and /// persists the correct data. - function testFuzz_squeeze_succeeds(uint256 _numBlocks, uint32 _partOffset) public { + function testFuzz_squeezeLPP_succeeds(uint256 _numBlocks, uint32 _partOffset) public { _numBlocks = bound(_numBlocks, 1, 2 ** 8); _partOffset = uint32(bound(_partOffset, 0, _numBlocks * LibKeccak.BLOCK_SIZE_BYTES + 8 - 1)); @@ -1346,7 +1453,7 @@ contract PreimageOracle_LargePreimageProposals_Test is Test { commands[2] = "gen_proof"; commands[3] = vm.toString(abi.encodePacked(leaves)); commands[4] = vm.toString(_leafIdx); - (root_, proof_) = abi.decode(vm.ffi(commands), (bytes32, bytes32[])); + (root_, proof_) = abi.decode(Process.run(commands), (bytes32, bytes32[])); } fallback() external payable { } @@ -1362,9 +1469,9 @@ function _setStatusByte(bytes32 _hash, uint8 _status) pure returns (bytes32 out_ } /// @notice Computes a precompile key for a given precompile address and input. -function precompilePreimageKey(address _precompile, bytes memory _input) pure returns (bytes32 key_) { - bytes memory p = abi.encodePacked(_precompile, _input); - uint256 sz = 20 + _input.length; +function precompilePreimageKey(address _precompile, uint64 _gas, bytes memory _input) pure returns (bytes32 key_) { + bytes memory p = abi.encodePacked(_precompile, _gas, _input); + uint256 sz = 20 + 8 + _input.length; assembly { let h := keccak256(add(0x20, p), sz) // Mask out prefix byte, replace with type 6 byte diff --git a/packages/contracts-bedrock/test/dispute/AnchorStateRegistry.t.sol b/packages/contracts-bedrock/test/dispute/AnchorStateRegistry.t.sol index 4f9cb3c8115e..b5dbac76f6c6 100644 --- a/packages/contracts-bedrock/test/dispute/AnchorStateRegistry.t.sol +++ b/packages/contracts-bedrock/test/dispute/AnchorStateRegistry.t.sol @@ -1,12 +1,14 @@ // SPDX-License-Identifier: MIT pragma solidity ^0.8.15; -import "src/dispute/lib/Types.sol"; -import "src/dispute/lib/Errors.sol"; - +// Testing import { Test } from "forge-std/Test.sol"; import { FaultDisputeGame_Init, _changeClaimStatus } from "test/dispute/FaultDisputeGame.t.sol"; +// Libraries +import "src/dispute/lib/Types.sol"; +import "src/dispute/lib/Errors.sol"; + contract AnchorStateRegistry_Init is FaultDisputeGame_Init { function setUp() public virtual override { // Duplicating the initialization/setup logic of FaultDisputeGame_Test. @@ -124,7 +126,7 @@ contract AnchorStateRegistry_TryUpdateAnchorState_Test is AnchorStateRegistry_In // Try to update the anchor state. vm.prank(address(gameProxy)); - vm.expectRevert("AnchorStateRegistry: fault dispute game not registered with factory"); + vm.expectRevert(UnregisteredGame.selector); anchorStateRegistry.tryUpdateAnchorState(); // Confirm that the anchor state has not updated. @@ -132,4 +134,88 @@ contract AnchorStateRegistry_TryUpdateAnchorState_Test is AnchorStateRegistry_In assertEq(updatedL2BlockNumber, l2BlockNumber); assertEq(updatedRoot.raw(), root.raw()); } + + function test_setAnchorState_invalidGame_fails() public { + // Confirm that the anchor state is older than the game state. + (Hash root, uint256 l2BlockNumber) = anchorStateRegistry.anchors(gameProxy.gameType()); + require(l2BlockNumber < gameProxy.l2BlockNumber(), "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(superchainConfig.guardian()); + vm.expectRevert(UnregisteredGame.selector); + anchorStateRegistry.setAnchorState(gameProxy); + + // 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 setting the anchor state fails if the challenger wins. + function test_setAnchorState_challengerWins_fails() public { + (Hash root, uint256 l2BlockNumber) = anchorStateRegistry.anchors(gameProxy.gameType()); + + // Mock the state that we want. + vm.mockCall( + address(gameProxy), + abi.encodeWithSelector(gameProxy.status.selector), + abi.encode(GameStatus.CHALLENGER_WINS) + ); + + // Set the anchor state. + vm.prank(superchainConfig.guardian()); + vm.expectRevert(InvalidGameStatus.selector); + anchorStateRegistry.setAnchorState(gameProxy); + + // 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 setting the anchor state fails if the game is in progress. + function test_setAnchorState_gameInProgress_fails() public { + (Hash root, uint256 l2BlockNumber) = anchorStateRegistry.anchors(gameProxy.gameType()); + + // Mock the state that we want. + vm.mockCall( + address(gameProxy), abi.encodeWithSelector(gameProxy.status.selector), abi.encode(GameStatus.IN_PROGRESS) + ); + + // Set the anchor state. + vm.prank(superchainConfig.guardian()); + vm.expectRevert(InvalidGameStatus.selector); + anchorStateRegistry.setAnchorState(gameProxy); + + // 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 setting the anchor state succeeds. + function test_setAnchorState_succeeds() public { + // Mock the state that we want. + vm.mockCall( + address(gameProxy), abi.encodeWithSelector(gameProxy.status.selector), abi.encode(GameStatus.DEFENDER_WINS) + ); + + // Set the anchor state. + vm.prank(superchainConfig.guardian()); + anchorStateRegistry.setAnchorState(gameProxy); + + // Confirm that the anchor state has updated. + (Hash updatedRoot, uint256 updatedL2BlockNumber) = anchorStateRegistry.anchors(gameProxy.gameType()); + assertEq(updatedL2BlockNumber, gameProxy.l2BlockNumber()); + assertEq(updatedRoot.raw(), gameProxy.rootClaim().raw()); + } } diff --git a/packages/contracts-bedrock/test/dispute/DelayedWETH.t.sol b/packages/contracts-bedrock/test/dispute/DelayedWETH.t.sol index 0e0922f825c4..bde1e1b9f893 100644 --- a/packages/contracts-bedrock/test/dispute/DelayedWETH.t.sol +++ b/packages/contracts-bedrock/test/dispute/DelayedWETH.t.sol @@ -1,16 +1,15 @@ // SPDX-License-Identifier: MIT pragma solidity ^0.8.15; -import "src/dispute/lib/Types.sol"; -import "src/dispute/lib/Errors.sol"; - +// Testing import { Test } from "forge-std/Test.sol"; -import { DisputeGameFactory, IDisputeGameFactory } from "src/dispute/DisputeGameFactory.sol"; -import { IDisputeGame } from "src/dispute/interfaces/IDisputeGame.sol"; -import { DelayedWETH } from "src/dispute/weth/DelayedWETH.sol"; -import { Proxy } from "src/universal/Proxy.sol"; import { CommonTest } from "test/setup/CommonTest.sol"; +// Libraries +import { Burn } from "src/libraries/Burn.sol"; +import "src/dispute/lib/Types.sol"; +import "src/dispute/lib/Errors.sol"; + contract DelayedWETH_Init is CommonTest { event Approval(address indexed src, address indexed guy, uint256 wad); event Transfer(address indexed src, address indexed dst, uint256 wad); @@ -45,7 +44,7 @@ contract DelayedWETH_Unlock_Test is DelayedWETH_Init { assertEq(timestamp, block.timestamp); } - /// @dev TEsts that unlocking twice is successful and timestamp/amount is updated. + /// @dev Tests that unlocking twice is successful and timestamp/amount is updated. function test_unlock_twice_succeeds() public { // Unlock once. uint256 ts = block.timestamp; @@ -170,24 +169,35 @@ 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 { + /// @dev Tests that recovering WETH succeeds. Makes sure that doing so succeeds with any amount + /// of ETH in the contract and any amount of gas used in the fallback function up to a + /// maximum of 20,000,000 gas. Owner contract should never be using that much gas but we + /// might as well set a very large upper bound for ourselves. + /// @param _amount Amount of WETH to recover. + /// @param _fallbackGasUsage Amount of gas to use in the fallback function. + function testFuzz_recover_succeeds(uint256 _amount, uint256 _fallbackGasUsage) public { + // Assume + _fallbackGasUsage = bound(_fallbackGasUsage, 0, 20000000); + + // Set up the gas burner. + FallbackGasUser gasUser = new FallbackGasUser(_fallbackGasUsage); + // Transfer ownership to alice. - delayedWeth.transferOwnership(alice); + delayedWeth.transferOwnership(address(gasUser)); // Give the contract some WETH to recover. - vm.deal(address(delayedWeth), 1 ether); + vm.deal(address(delayedWeth), _amount); // Record the initial balance. - uint256 initialBalance = address(alice).balance; + uint256 initialBalance = address(gasUser).balance; // Recover the WETH. - vm.prank(alice); - delayedWeth.recover(1 ether); + vm.prank(address(gasUser)); + delayedWeth.recover(_amount); // Verify the WETH was recovered. assertEq(address(delayedWeth).balance, 0); - assertEq(address(alice).balance, initialBalance + 1 ether); + assertEq(address(gasUser).balance, initialBalance + _amount); } /// @dev Tests that recovering WETH by non-owner fails. @@ -219,6 +229,23 @@ contract DelayedWETH_Recover_Test is DelayedWETH_Init { assertEq(address(delayedWeth).balance, 0); assertEq(address(alice).balance, initialBalance + 0.5 ether); } + + /// @dev Tests that recover reverts when recipient reverts. + function test_recover_whenRecipientReverts_fails() public { + // Set up the reverter. + FallbackReverter reverter = new FallbackReverter(); + + // Transfer ownership to the reverter. + delayedWeth.transferOwnership(address(reverter)); + + // Give the contract some WETH to recover. + vm.deal(address(delayedWeth), 1 ether); + + // Recover fails. + vm.expectRevert("DelayedWETH: recover failed"); + vm.prank(address(reverter)); + delayedWeth.recover(1 ether); + } } contract DelayedWETH_Hold_Test is DelayedWETH_Init { @@ -255,3 +282,39 @@ contract DelayedWETH_Hold_Test is DelayedWETH_Init { delayedWeth.hold(bob, 1 ether); } } + +/// @title FallbackGasUser +/// @notice Contract that burns gas in the fallback function. +contract FallbackGasUser { + /// @notice Amount of gas to use in the fallback function. + uint256 public gas; + + /// @param _gas Amount of gas to use in the fallback function. + constructor(uint256 _gas) { + gas = _gas; + } + + /// @notice Burn gas on fallback; + fallback() external payable { + Burn.gas(gas); + } + + /// @notice Burn gas on receive. + receive() external payable { + Burn.gas(gas); + } +} + +/// @title FallbackReverter +/// @notice Contract that reverts in the fallback function. +contract FallbackReverter { + /// @notice Revert on fallback. + fallback() external payable { + revert("FallbackReverter: revert"); + } + + /// @notice Revert on receive. + receive() external payable { + revert("FallbackReverter: revert"); + } +} diff --git a/packages/contracts-bedrock/test/dispute/DisputeGameFactory.t.sol b/packages/contracts-bedrock/test/dispute/DisputeGameFactory.t.sol index 09a087fb5d77..6c3ed2a18944 100644 --- a/packages/contracts-bedrock/test/dispute/DisputeGameFactory.t.sol +++ b/packages/contracts-bedrock/test/dispute/DisputeGameFactory.t.sol @@ -1,14 +1,20 @@ // SPDX-License-Identifier: MIT pragma solidity ^0.8.15; +// Testing +import { Test } from "forge-std/Test.sol"; +import { CommonTest } from "test/setup/CommonTest.sol"; + +// Contracts +import { Proxy } from "src/universal/Proxy.sol"; + +// Libraries 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"; +// Interfaces +import { IDisputeGameFactory } from "src/dispute/interfaces/IDisputeGameFactory.sol"; import { IDisputeGame } from "src/dispute/interfaces/IDisputeGame.sol"; -import { Proxy } from "src/universal/Proxy.sol"; -import { CommonTest } from "test/setup/CommonTest.sol"; contract DisputeGameFactory_Init is CommonTest { FakeClone fakeClone; diff --git a/packages/contracts-bedrock/test/dispute/FaultDisputeGame.t.sol b/packages/contracts-bedrock/test/dispute/FaultDisputeGame.t.sol index 81e24d08b0eb..bc6537e460e4 100644 --- a/packages/contracts-bedrock/test/dispute/FaultDisputeGame.t.sol +++ b/packages/contracts-bedrock/test/dispute/FaultDisputeGame.t.sol @@ -1,35 +1,41 @@ // SPDX-License-Identifier: MIT pragma solidity ^0.8.15; +// Testing 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, IDisputeGame } from "src/dispute/FaultDisputeGame.sol"; -import { DelayedWETH } from "src/dispute/weth/DelayedWETH.sol"; +import { AlphabetVM } from "test/mocks/AlphabetVM.sol"; + +// Contracts import { PreimageOracle } from "src/cannon/PreimageOracle.sol"; +import { FaultDisputeGame } from "src/dispute/FaultDisputeGame.sol"; +import { DisputeActor, HonestDisputeActor } from "test/actors/FaultDisputeActors.sol"; -import "src/dispute/lib/Types.sol"; -import "src/dispute/lib/Errors.sol"; +// Libraries 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 "src/dispute/lib/Types.sol"; +import "src/dispute/lib/Errors.sol"; + +// Interfaces +import { IDisputeGame } from "src/dispute/interfaces/IDisputeGame.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"; +import { IFaultDisputeGame } from "src/dispute/interfaces/IFaultDisputeGame.sol"; +import { IDelayedWETH } from "src/dispute/interfaces/IDelayedWETH.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; + IFaultDisputeGame internal gameImpl; /// @dev The `Clone` proxy of the game. - FaultDisputeGame internal gameProxy; + IFaultDisputeGame internal gameProxy; /// @dev The extra data passed to the game for initialization. bytes internal extraData; @@ -45,26 +51,33 @@ contract FaultDisputeGame_Init is DisputeGameFactory_Init { // Set the extra data for the game creation extraData = abi.encode(l2BlockNumber); - AlphabetVM _vm = new AlphabetVM(absolutePrestate, new PreimageOracle(0, 0)); + // Set preimage oracle challenge period to something arbitrary (4 seconds) just so we can + // actually test the clock extensions later on. This is not a realistic value. + PreimageOracle oracle = new PreimageOracle(0, 4); + AlphabetVM _vm = new AlphabetVM(absolutePrestate, oracle); // 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 - }); + gameImpl = IFaultDisputeGame( + address( + 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)))); + gameProxy = IFaultDisputeGame(payable(address(disputeGameFactory.create(GAME_TYPE, rootClaim, extraData)))); // Check immutables assertEq(gameProxy.gameType().raw(), GAME_TYPE.raw()); @@ -122,7 +135,38 @@ contract FaultDisputeGame_Test is FaultDisputeGame_Init { _clockExtension: Duration.wrap(3 hours), _maxClockDuration: Duration.wrap(3.5 days), _vm: alphabetVM, - _weth: DelayedWETH(payable(address(0))), + _weth: IDelayedWETH(payable(address(0))), + _anchorStateRegistry: IAnchorStateRegistry(address(0)), + _l2ChainId: 10 + }); + } + + /// @dev Tests that the constructor of the `FaultDisputeGame` reverts when the challenge period + // of the preimage oracle being used by the game's VM is too large. + /// @param _challengePeriod The challenge period of the preimage oracle. + function testFuzz_constructor_oracleChallengePeriodTooLarge_reverts(uint256 _challengePeriod) public { + _challengePeriod = bound(_challengePeriod, uint256(type(uint64).max) + 1, type(uint256).max); + + PreimageOracle oracle = new PreimageOracle(0, 0); + AlphabetVM alphabetVM = new AlphabetVM(absolutePrestate, oracle); + + // PreimageOracle constructor will revert if the challenge period is too large, so we need + // to mock the call to pretend this is a bugged implementation where the challenge period + // is allowed to be too large. + vm.mockCall( + address(oracle), abi.encodeWithSelector(oracle.challengePeriod.selector), abi.encode(_challengePeriod) + ); + + vm.expectRevert(InvalidChallengePeriod.selector); + 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: alphabetVM, + _weth: IDelayedWETH(payable(address(0))), _anchorStateRegistry: IAnchorStateRegistry(address(0)), _l2ChainId: 10 }); @@ -133,7 +177,30 @@ contract FaultDisputeGame_Test is FaultDisputeGame_Init { 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); + uint256 maxGameDepth = 2 ** 3; + _splitDepth = bound(_splitDepth, maxGameDepth - 1, type(uint256).max); + vm.expectRevert(InvalidSplitDepth.selector); + new FaultDisputeGame({ + _gameType: GAME_TYPE, + _absolutePrestate: absolutePrestate, + _maxGameDepth: maxGameDepth, + _splitDepth: _splitDepth, + _clockExtension: Duration.wrap(3 hours), + _maxClockDuration: Duration.wrap(3.5 days), + _vm: alphabetVM, + _weth: IDelayedWETH(payable(address(0))), + _anchorStateRegistry: IAnchorStateRegistry(address(0)), + _l2ChainId: 10 + }); + } + + /// @dev Tests that the constructor of the `FaultDisputeGame` reverts when the `_splitDepth` + /// parameter is less than the minimum split depth (currently 2). + function testFuzz_constructor_lowSplitDepth_reverts(uint256 _splitDepth) public { + AlphabetVM alphabetVM = new AlphabetVM(absolutePrestate, new PreimageOracle(0, 0)); + + uint256 minSplitDepth = 2; + _splitDepth = bound(_splitDepth, 0, minSplitDepth - 1); vm.expectRevert(InvalidSplitDepth.selector); new FaultDisputeGame({ _gameType: GAME_TYPE, @@ -143,14 +210,14 @@ contract FaultDisputeGame_Test is FaultDisputeGame_Init { _clockExtension: Duration.wrap(3 hours), _maxClockDuration: Duration.wrap(3.5 days), _vm: alphabetVM, - _weth: DelayedWETH(payable(address(0))), + _weth: IDelayedWETH(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. + /// @dev Tests that the constructor of the `FaultDisputeGame` reverts when clock extension * 2 is greater than + /// the max clock duration. function testFuzz_constructor_clockExtensionTooLong_reverts( uint64 _maxClockDuration, uint64 _clockExtension @@ -159,8 +226,11 @@ contract FaultDisputeGame_Test is FaultDisputeGame_Init { { 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)); + // Force the clock extension * 2 to be greater than the max clock duration, but keep things within + // bounds of the uint64 type. + _maxClockDuration = uint64(bound(_maxClockDuration, 0, type(uint64).max / 2 - 1)); + _clockExtension = uint64(bound(_clockExtension, _maxClockDuration / 2 + 1, type(uint64).max / 2)); + vm.expectRevert(InvalidClockExtension.selector); new FaultDisputeGame({ _gameType: GAME_TYPE, @@ -170,7 +240,7 @@ contract FaultDisputeGame_Test is FaultDisputeGame_Init { _clockExtension: Duration.wrap(_clockExtension), _maxClockDuration: Duration.wrap(_maxClockDuration), _vm: alphabetVM, - _weth: DelayedWETH(payable(address(0))), + _weth: IDelayedWETH(payable(address(0))), _anchorStateRegistry: IAnchorStateRegistry(address(0)), _l2ChainId: 10 }); @@ -218,7 +288,7 @@ contract FaultDisputeGame_Test is FaultDisputeGame_Init { Claim claim = _dummyClaim(); vm.expectRevert(abi.encodeWithSelector(UnexpectedRootClaim.selector, claim)); gameProxy = - FaultDisputeGame(payable(address(disputeGameFactory.create(GAME_TYPE, claim, abi.encode(_blockNumber))))); + IFaultDisputeGame(payable(address(disputeGameFactory.create(GAME_TYPE, claim, abi.encode(_blockNumber))))); } /// @dev Tests that the proxy receives ETH from the dispute game factory. @@ -227,7 +297,7 @@ contract FaultDisputeGame_Test is FaultDisputeGame_Init { vm.deal(address(this), _value); assertEq(address(gameProxy).balance, 0); - gameProxy = FaultDisputeGame( + gameProxy = IFaultDisputeGame( payable(address(disputeGameFactory.create{ value: _value }(GAME_TYPE, ROOT_CLAIM, abi.encode(1)))) ); assertEq(address(gameProxy).balance, 0); @@ -255,7 +325,7 @@ contract FaultDisputeGame_Test is FaultDisputeGame_Init { Claim claim = _dummyClaim(); vm.expectRevert(abi.encodeWithSelector(BadExtraData.selector)); - gameProxy = FaultDisputeGame(payable(address(disputeGameFactory.create(GAME_TYPE, claim, _extraData)))); + gameProxy = IFaultDisputeGame(payable(address(disputeGameFactory.create(GAME_TYPE, claim, _extraData)))); } /// @dev Tests that the game is initialized with the correct data. @@ -456,47 +526,126 @@ contract FaultDisputeGame_Test is FaultDisputeGame_Init { 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 { + /// @dev Tests that the standard clock extension is triggered for a move that is not the + /// split depth or the max game depth. + function test_move_standardClockExtension_succeeds() public { (,,,,,, Clock clock) = gameProxy.claimData(0); assertEq(clock.raw(), LibClock.wrap(Duration.wrap(0), Timestamp.wrap(uint64(block.timestamp))).raw()); + uint256 bond; + Claim disputed; 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); + // Warp ahead so that the next move will trigger a clock extension. We warp to the very + // first timestamp where a clock extension should be triggered. + vm.warp(block.timestamp + halfGameDuration - clockExtension + 1 seconds); + + // Execute a move that should cause a clock extension. + bond = _getRequiredBond(0); + (,,,, disputed,,) = gameProxy.claimData(0); gameProxy.attack{ value: bond }(disputed, 0, claim); (,,,,,, clock) = gameProxy.claimData(1); + + // The clock should have been pushed back to the clock extension time. 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); + // Warp ahead again so that clock extensions will also trigger for the other team. Here we + // only warp to the clockExtension time because we'll be warping ahead by one second during + // each additional move. + vm.warp(block.timestamp + halfGameDuration - clockExtension); + + // Work our way down to the split depth. for (uint256 i = 1; i < splitDepth - 2; i++) { + // Warp ahead by one second so that the next move will trigger a clock extension. + vm.warp(block.timestamp + 1 seconds); + + // Execute a move that should cause a clock extension. bond = _getRequiredBond(i); (,,,, disputed,,) = gameProxy.claimData(i); gameProxy.attack{ value: bond }(disputed, i, claim); + (,,,,,, clock) = gameProxy.claimData(i + 1); + + // The clock should have been pushed back to the clock extension time. + assertEq(clock.duration().raw(), halfGameDuration - clockExtension); } + } - // Warp ahead 1 seconds to have `clockExtension - 1 seconds` left on the next move's clock. - vm.warp(block.timestamp + 1 seconds); + function test_move_splitDepthClockExtension_succeeds() public { + (,,,,,, Clock clock) = gameProxy.claimData(0); + assertEq(clock.raw(), LibClock.wrap(Duration.wrap(0), Timestamp.wrap(uint64(block.timestamp))).raw()); + + uint256 bond; + Claim disputed; + Claim claim = _dummyClaim(); + uint256 splitDepth = gameProxy.splitDepth(); + uint64 halfGameDuration = gameProxy.maxClockDuration().raw(); + uint64 clockExtension = gameProxy.clockExtension().raw(); - // 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. + // Work our way down to the split depth without moving ahead in time, we don't care about + // the exact clock here, just don't want take the clock below the clock extension time that + // we're trying to test here. + for (uint256 i = 0; i < splitDepth - 2; i++) { + bond = _getRequiredBond(i); + (,,,, disputed,,) = gameProxy.claimData(i); + gameProxy.attack{ value: bond }(disputed, i, claim); + } + + // Warp ahead to the very first timestamp where a clock extension should be triggered. + vm.warp(block.timestamp + halfGameDuration - clockExtension * 2 + 1 seconds); + + // Execute a move that should cause a clock extension. bond = _getRequiredBond(splitDepth - 2); (,,,, disputed,,) = gameProxy.claimData(splitDepth - 2); gameProxy.attack{ value: bond }(disputed, splitDepth - 2, claim); (,,,,,, clock) = gameProxy.claimData(splitDepth - 1); + + // The clock should have been pushed back to the clock extension time. assertEq(clock.duration().raw(), halfGameDuration - clockExtension * 2); } + function test_move_maxGameDepthClockExtension_succeeds() public { + (,,,,,, Clock clock) = gameProxy.claimData(0); + assertEq(clock.raw(), LibClock.wrap(Duration.wrap(0), Timestamp.wrap(uint64(block.timestamp))).raw()); + + uint256 bond; + Claim disputed; + Claim claim = _dummyClaim(); + uint256 splitDepth = gameProxy.splitDepth(); + uint64 halfGameDuration = gameProxy.maxClockDuration().raw(); + uint64 clockExtension = gameProxy.clockExtension().raw(); + + // Work our way down to the split depth without moving ahead in time, we don't care about + // the exact clock here, just don't want take the clock below the clock extension time that + // we're trying to test here. + for (uint256 i = 0; i < gameProxy.maxGameDepth() - 2; i++) { + bond = _getRequiredBond(i); + (,,,, disputed,,) = gameProxy.claimData(i); + gameProxy.attack{ value: bond }(disputed, i, claim); + + // Change the claim status when we're crossing the split depth. + if (i == splitDepth - 2) { + claim = _changeClaimStatus(claim, VMStatuses.PANIC); + } + } + + // Warp ahead to the very first timestamp where a clock extension should be triggered. + vm.warp(block.timestamp + halfGameDuration - (clockExtension + gameProxy.vm().oracle().challengePeriod()) + 1); + + // Execute a move that should cause a clock extension. + bond = _getRequiredBond(gameProxy.maxGameDepth() - 2); + (,,,, disputed,,) = gameProxy.claimData(gameProxy.maxGameDepth() - 2); + gameProxy.attack{ value: bond }(disputed, gameProxy.maxGameDepth() - 2, claim); + (,,,,,, clock) = gameProxy.claimData(gameProxy.maxGameDepth() - 1); + + // The clock should have been pushed back to the clock extension time. + assertEq( + clock.duration().raw(), halfGameDuration - (clockExtension + gameProxy.vm().oracle().challengePeriod()) + ); + } + /// @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 { @@ -846,6 +995,38 @@ contract FaultDisputeGame_Test is FaultDisputeGame_Init { gameProxy.step(8, true, claimData5, hex""); } + /// @dev Tests that successfully step with true defend claim when there is a true defend claim(claim7) in the + /// middle of the dispute game. + function test_stepDefendDummyClaim_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 claimData7 = abi.encode(7, 7); + Claim postState_ = Claim.wrap(gameImpl.vm().step(claimData7, hex"", bytes32(0))); + + (,,,, disputed,,) = gameProxy.claimData(5); + gameProxy.attack{ value: _getRequiredBond(5) }(disputed, 5, _dummyClaim()); + (,,,, disputed,,) = gameProxy.claimData(6); + gameProxy.defend{ value: _getRequiredBond(6) }(disputed, 6, postState_); + (,,,, disputed,,) = gameProxy.claimData(7); + + gameProxy.attack{ value: _getRequiredBond(7) }(disputed, 7, Claim.wrap(keccak256(claimData7))); + gameProxy.addLocalData(LocalPreimageKey.DISPUTED_L2_BLOCK_NUMBER, 8, 0); + gameProxy.step(8, false, claimData7, 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 { @@ -1653,6 +1834,70 @@ contract FaultDisputeGame_Test is FaultDisputeGame_Init { } } + /// @dev Tests that the L2 block number claim is favored over the bisected-to block when adding data + /// + function test_addLocalData_l2BlockNumberExtension_succeeds() public { + // Deploy a new dispute game with a L2 block number claim of 8. This is directly in the middle of + // the leaves in our output bisection test tree, at SPLIT_DEPTH = 2 ** 2 + FaultDisputeGame game = FaultDisputeGame( + address(disputeGameFactory.create(GAME_TYPE, Claim.wrap(bytes32(uint256(0xFF))), abi.encode(uint256(8)))) + ); + + // Get a claim below the split depth so that we can add local data for an execution trace subgame. + { + Claim disputed; + Position parent; + Position pos; + + for (uint256 i; i < 4; i++) { + (,,,,, parent,) = game.claimData(i); + pos = parent.move(true); + uint256 bond = game.getRequiredBond(pos); + + (,,,, disputed,,) = game.claimData(i); + if (i == 0) { + game.attack{ value: bond }(disputed, i, Claim.wrap(bytes32(i))); + } else { + game.defend{ value: bond }(disputed, i, Claim.wrap(bytes32(i))); + } + } + (,,,,, parent,) = game.claimData(4); + pos = parent.move(true); + uint256 lastBond = game.getRequiredBond(pos); + (,,,, disputed,,) = game.claimData(4); + game.defend{ value: lastBond }(disputed, 4, _changeClaimStatus(ROOT_CLAIM, VMStatuses.INVALID)); + } + + // Expected start/disputed claims + bytes32 startingClaim = bytes32(uint256(3)); + Position startingPos = LibPosition.wrap(4, 14); + bytes32 disputedClaim = bytes32(uint256(0xFF)); + Position disputedPos = LibPosition.wrap(0, 0); + + // Expected local data. This should be `l2BlockNumber`, and not the actual bisected-to block, + // as we choose the minimum between the two. + bytes32 expectedNumber = bytes32(uint256(8 << 0xC0)); + uint256 expectedLen = 8; + uint256 l2NumberIdent = LocalPreimageKey.DISPUTED_L2_BLOCK_NUMBER; + + // Compute the preimage key for the local data + bytes32 localContext = keccak256(abi.encode(startingClaim, startingPos, disputedClaim, disputedPos)); + bytes32 rawKey = keccak256(abi.encode(l2NumberIdent | (1 << 248), address(game), localContext)); + bytes32 key = bytes32((uint256(rawKey) & ~uint256(0xFF << 248)) | (1 << 248)); + + IPreimageOracle oracle = IPreimageOracle(address(game.vm().oracle())); + game.addLocalData(l2NumberIdent, 5, 0); + + (bytes32 dat, uint256 datLen) = oracle.readPreimage(key, 0); + assertEq(dat >> 0xC0, bytes32(expectedLen)); + assertEq(datLen, expectedLen + 8); + + game.addLocalData(l2NumberIdent, 5, 8); + (dat, datLen) = oracle.readPreimage(key, 8); + assertEq(dat, expectedNumber); + 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 { @@ -2333,10 +2578,10 @@ contract FaultDispute_1v1_Actors_Test is FaultDisputeGame_Init { contract ClaimCreditReenter { Vm internal immutable vm; - FaultDisputeGame internal immutable GAME; + IFaultDisputeGame internal immutable GAME; uint256 public numCalls; - constructor(FaultDisputeGame _gameProxy, Vm _vm) { + constructor(IFaultDisputeGame _gameProxy, Vm _vm) { GAME = _gameProxy; vm = _vm; } diff --git a/packages/contracts-bedrock/test/dispute/PermissionedDisputeGame.t.sol b/packages/contracts-bedrock/test/dispute/PermissionedDisputeGame.t.sol index 5d3fc6f70f79..8a3639b71cdf 100644 --- a/packages/contracts-bedrock/test/dispute/PermissionedDisputeGame.t.sol +++ b/packages/contracts-bedrock/test/dispute/PermissionedDisputeGame.t.sol @@ -1,25 +1,26 @@ // SPDX-License-Identifier: MIT pragma solidity ^0.8.15; +// Testing 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 { AlphabetVM } from "test/mocks/AlphabetVM.sol"; + +// Contracts import { PermissionedDisputeGame } from "src/dispute/PermissionedDisputeGame.sol"; -import { DelayedWETH } from "src/dispute/weth/DelayedWETH.sol"; -import { L2OutputOracle } from "src/L1/L2OutputOracle.sol"; import { PreimageOracle } from "src/cannon/PreimageOracle.sol"; -import { PreimageKeyLib } from "src/cannon/PreimageKeyLib.sol"; +import { DelayedWETH } from "src/dispute/DelayedWETH.sol"; +// Libraries +import { Types } from "src/libraries/Types.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"; -import { IBigStepper, IPreimageOracle } from "src/dispute/interfaces/IBigStepper.sol"; -import { AlphabetVM } from "test/mocks/AlphabetVM.sol"; -import { DisputeActor, HonestDisputeActor } from "test/actors/FaultDisputeActors.sol"; +// Interfaces +import { IBigStepper, IPreimageOracle } from "src/dispute/interfaces/IBigStepper.sol"; +import { IDelayedWETH } from "src/dispute/interfaces/IDelayedWETH.sol"; +import { IPermissionedDisputeGame } from "src/dispute/interfaces/IPermissionedDisputeGame.sol"; contract PermissionedDisputeGame_Init is DisputeGameFactory_Init { /// @dev The type of the game being tested. @@ -30,9 +31,9 @@ contract PermissionedDisputeGame_Init is DisputeGameFactory_Init { address internal constant CHALLENGER = address(0xfacadec); /// @dev The implementation of the game. - PermissionedDisputeGame internal gameImpl; + IPermissionedDisputeGame internal gameImpl; /// @dev The `Clone` proxy of the game. - PermissionedDisputeGame internal gameProxy; + IPermissionedDisputeGame internal gameProxy; /// @dev The extra data passed to the game for initialization. bytes internal extraData; @@ -49,29 +50,33 @@ contract PermissionedDisputeGame_Init is DisputeGameFactory_Init { AlphabetVM _vm = new AlphabetVM(absolutePrestate, new PreimageOracle(0, 0)); // Use a 7 day delayed WETH to simulate withdrawals. - DelayedWETH _weth = new DelayedWETH(7 days); + IDelayedWETH _weth = IDelayedWETH(payable(new DelayedWETH(7 days))); // Deploy an implementation of the fault game - gameImpl = new PermissionedDisputeGame({ - _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: _weth, - _anchorStateRegistry: anchorStateRegistry, - _l2ChainId: 10, - _proposer: PROPOSER, - _challenger: CHALLENGER - }); + gameImpl = IPermissionedDisputeGame( + address( + new PermissionedDisputeGame({ + _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: _weth, + _anchorStateRegistry: anchorStateRegistry, + _l2ChainId: 10, + _proposer: PROPOSER, + _challenger: CHALLENGER + }) + ) + ); // Register the game implementation with the factory. disputeGameFactory.setImplementation(GAME_TYPE, gameImpl); // Create a new game. vm.prank(PROPOSER, PROPOSER); gameProxy = - PermissionedDisputeGame(payable(address(disputeGameFactory.create(GAME_TYPE, rootClaim, extraData)))); + IPermissionedDisputeGame(payable(address(disputeGameFactory.create(GAME_TYPE, rootClaim, extraData)))); // Check immutables assertEq(gameProxy.proposer(), PROPOSER); diff --git a/packages/contracts-bedrock/test/dispute/WETH98.t.sol b/packages/contracts-bedrock/test/dispute/WETH98.t.sol index 6573a9d005c5..a248e1901885 100644 --- a/packages/contracts-bedrock/test/dispute/WETH98.t.sol +++ b/packages/contracts-bedrock/test/dispute/WETH98.t.sol @@ -1,7 +1,11 @@ +// SPDX-License-Identifier: MIT pragma solidity 0.8.15; +// Testing import { Test } from "forge-std/Test.sol"; -import { WETH98 } from "src/dispute/weth/WETH98.sol"; + +// Contracts +import { WETH98 } from "src/universal/WETH98.sol"; contract WETH98_Test is Test { event Approval(address indexed src, address indexed guy, uint256 wad); diff --git a/packages/contracts-bedrock/test/fixtures/test-deploy-auth-system-in.toml b/packages/contracts-bedrock/test/fixtures/test-deploy-auth-system-in.toml new file mode 100644 index 000000000000..4f0df83e1af2 --- /dev/null +++ b/packages/contracts-bedrock/test/fixtures/test-deploy-auth-system-in.toml @@ -0,0 +1,11 @@ +[safe] +threshold = 5 +owners = [ + "0x1111111111111111111111111111111111111111", + "0x2222222222222222222222222222222222222222", + "0x3333333333333333333333333333333333333333", + "0x4444444444444444444444444444444444444444", + "0x5555555555555555555555555555555555555555", + "0x6666666666666666666666666666666666666666", + "0x7777777777777777777777777777777777777777" +] diff --git a/packages/contracts-bedrock/test/fixtures/test-deploy-auth-system-out.toml b/packages/contracts-bedrock/test/fixtures/test-deploy-auth-system-out.toml new file mode 100644 index 000000000000..35465cae1942 --- /dev/null +++ b/packages/contracts-bedrock/test/fixtures/test-deploy-auth-system-out.toml @@ -0,0 +1 @@ +safe = "0xDC93f9959c0F9c3849461B6468B4592a19567E09" diff --git a/packages/contracts-bedrock/test/fixtures/test-deploy-superchain-in.toml b/packages/contracts-bedrock/test/fixtures/test-deploy-superchain-in.toml new file mode 100644 index 000000000000..0900e71635d7 --- /dev/null +++ b/packages/contracts-bedrock/test/fixtures/test-deploy-superchain-in.toml @@ -0,0 +1,8 @@ +paused = false +requiredProtocolVersion = 1 +recommendedProtocolVersion = 2 + +[roles] +proxyAdminOwner = "0x51f0348a9fA2aAbaB45E82825Fbd13d406e04497" +protocolVersionsOwner = "0xeEB4cc05dC0dE43c465f97cfc703D165418CA93A" +guardian = "0xE5DbA98c65F4B9EB0aeEBb3674fE64f88509a1eC" diff --git a/packages/contracts-bedrock/test/fixtures/test-deploy-superchain-out.toml b/packages/contracts-bedrock/test/fixtures/test-deploy-superchain-out.toml new file mode 100644 index 000000000000..ceb558a79d5a --- /dev/null +++ b/packages/contracts-bedrock/test/fixtures/test-deploy-superchain-out.toml @@ -0,0 +1,5 @@ +protocolVersionsImpl = "0x5991A2dF15A8F6A256D3Ec51E99254Cd3fb576A9" +protocolVersionsProxy = "0x1d1499e622D69689cdf9004d05Ec547d650Ff211" +superchainConfigImpl = "0xF62849F9A0B5Bf2913b396098F7c7019b51A820a" +superchainConfigProxy = "0xc7183455a4C133Ae270771860664b6B7ec320bB1" +superchainProxyAdmin = "0x2e234DAe75C793f67A35089C9d99245E1C58470b" diff --git a/packages/contracts-bedrock/test/governance/MintManager.t.sol b/packages/contracts-bedrock/test/governance/MintManager.t.sol index 690fa15c0d25..4c008863ed69 100644 --- a/packages/contracts-bedrock/test/governance/MintManager.t.sol +++ b/packages/contracts-bedrock/test/governance/MintManager.t.sol @@ -1,30 +1,32 @@ // SPDX-License-Identifier: MIT pragma solidity 0.8.15; -// Testing utilities +// Testing import { CommonTest } from "test/setup/CommonTest.sol"; -// Target contract dependencies +// Contracts import { GovernanceToken } from "src/governance/GovernanceToken.sol"; - -// Target contract import { MintManager } from "src/governance/MintManager.sol"; +// Interfaces +import { IGovernanceToken } from "src/governance/interfaces/IGovernanceToken.sol"; +import { IMintManager } from "src/governance/interfaces/IMintManager.sol"; + contract MintManager_Initializer is CommonTest { address constant owner = address(0x1234); address constant rando = address(0x5678); - GovernanceToken internal gov; - MintManager internal manager; + IGovernanceToken internal gov; + IMintManager internal manager; /// @dev Sets up the test suite. function setUp() public virtual override { super.setUp(); vm.prank(owner); - gov = new GovernanceToken(); + gov = IGovernanceToken(address(new GovernanceToken())); vm.prank(owner); - manager = new MintManager(owner, address(gov)); + manager = IMintManager(address(new MintManager(owner, address(gov)))); vm.prank(owner); gov.transferOwnership(address(manager)); diff --git a/packages/contracts-bedrock/test/invariants/CrossDomainMessenger.t.sol b/packages/contracts-bedrock/test/invariants/CrossDomainMessenger.t.sol index b0b64253493b..08a0c0027763 100644 --- a/packages/contracts-bedrock/test/invariants/CrossDomainMessenger.t.sol +++ b/packages/contracts-bedrock/test/invariants/CrossDomainMessenger.t.sol @@ -3,8 +3,8 @@ pragma solidity 0.8.15; import { StdUtils } from "forge-std/StdUtils.sol"; import { Vm } from "forge-std/Vm.sol"; -import { OptimismPortal } from "src/L1/OptimismPortal.sol"; -import { L1CrossDomainMessenger } from "src/L1/L1CrossDomainMessenger.sol"; +import { IOptimismPortal } from "src/L1/interfaces/IOptimismPortal.sol"; +import { IL1CrossDomainMessenger } from "src/L1/interfaces/IL1CrossDomainMessenger.sol"; import { Bridge_Initializer } from "test/setup/Bridge_Initializer.sol"; import { Predeploys } from "src/libraries/Predeploys.sol"; import { Constants } from "src/libraries/Constants.sol"; @@ -20,12 +20,12 @@ contract RelayActor is StdUtils { bytes32[] public hashes; bool public reverted = false; - OptimismPortal op; - L1CrossDomainMessenger xdm; + IOptimismPortal op; + IL1CrossDomainMessenger xdm; Vm vm; bool doFail; - constructor(OptimismPortal _op, L1CrossDomainMessenger _xdm, Vm _vm, bool _doFail) { + constructor(IOptimismPortal _op, IL1CrossDomainMessenger _xdm, Vm _vm, bool _doFail) { op = _op; xdm = _xdm; vm = _vm; diff --git a/packages/contracts-bedrock/test/invariants/ETHLiquidity.t.sol b/packages/contracts-bedrock/test/invariants/ETHLiquidity.t.sol new file mode 100644 index 000000000000..8d1221a792c1 --- /dev/null +++ b/packages/contracts-bedrock/test/invariants/ETHLiquidity.t.sol @@ -0,0 +1,89 @@ +// SPDX-License-Identifier: MIT +pragma solidity 0.8.15; + +// Testing +import { StdUtils } from "forge-std/Test.sol"; +import { Vm } from "forge-std/Vm.sol"; +import { CommonTest } from "test/setup/CommonTest.sol"; + +// Libraries +import { Predeploys } from "src/libraries/Predeploys.sol"; + +// Interfaces +import { IETHLiquidity } from "src/L2/interfaces/IETHLiquidity.sol"; + +/// @title ETHLiquidity_User +/// @notice Actor contract that interacts with the ETHLiquidity contract. Always pretends to be the +/// SuperchainWETH contract since it's the only contract that can use ETHLiquidity. +contract ETHLiquidity_User is StdUtils { + /// @notice Flag to indicate if the test has failed. + bool public failed = false; + + /// @notice The Vm contract. + Vm internal vm; + + /// @notice The ETHLiquidity contract. + IETHLiquidity internal liquidity; + + /// @param _vm The Vm contract. + /// @param _liquidity The ETHLiquidity contract. + /// @param _balance The initial balance of the contract. + constructor(Vm _vm, IETHLiquidity _liquidity, uint256 _balance) { + vm = _vm; + liquidity = _liquidity; + vm.deal(Predeploys.SUPERCHAIN_WETH, _balance); + } + + /// @notice Mint ETH liquidity. + /// @param _amount The amount of ETH to mint. + function mint(uint256 _amount) public { + vm.prank(Predeploys.SUPERCHAIN_WETH); + liquidity.mint(_amount); + } + + /// @notice Burn ETH liquidity. + /// @param _amount The amount of ETH to burn. + function burn(uint256 _amount) public { + vm.prank(Predeploys.SUPERCHAIN_WETH); + liquidity.burn{ value: _amount }(); + } +} + +/// @title ETHLiquidity_MintBurn_Invariant +/// @notice Invariant that checks that minting/burning ETH liquidity does not cause the actor's +/// balance to magically increase beyond the starting balance. +contract ETHLiquidity_MintBurn_Invariant is CommonTest { + /// @notice Starting balance of the contract. + uint256 internal constant STARTING_BALANCE = type(uint248).max; + + /// @notice The ETHLiquidity_User actor. + ETHLiquidity_User internal actor; + + /// @notice Test setup. + function setUp() public override { + super.enableInterop(); + super.setUp(); + + // Create a new ETHLiquidity_User actor. + actor = new ETHLiquidity_User(vm, ethLiquidity, STARTING_BALANCE); + + // Set the target contract. + targetContract(address(actor)); + + // Set the target selectors. + bytes4[] memory selectors = new bytes4[](2); + selectors[0] = actor.mint.selector; + selectors[1] = actor.burn.selector; + FuzzSelector memory selector = FuzzSelector({ addr: address(actor), selectors: selectors }); + targetSelector(selector); + } + + /// @notice Invariant that checks that repeatedly minting/burning does not cause the actor's + /// balance to increase beyond the starting balance. + /// @custom:invariant Calls to mint/burn repeatedly should never cause the actor's balance to + /// increase beyond the starting balance. + function invariant_mintburn_maintainsBalance() public view { + // Assert that the actor's balance has not somehow increased. + assertLe(address(actor).balance, type(uint248).max); + } +} diff --git a/packages/contracts-bedrock/test/invariants/FaultDisputeGame.t.sol b/packages/contracts-bedrock/test/invariants/FaultDisputeGame.t.sol index 295b9f315abf..49bf2a106bbf 100644 --- a/packages/contracts-bedrock/test/invariants/FaultDisputeGame.t.sol +++ b/packages/contracts-bedrock/test/invariants/FaultDisputeGame.t.sol @@ -1,14 +1,18 @@ // SPDX-License-Identifier: MIT pragma solidity 0.8.15; +// Testing import { Vm } from "forge-std/Vm.sol"; import { StdUtils } from "forge-std/StdUtils.sol"; -import { FaultDisputeGame } from "src/dispute/FaultDisputeGame.sol"; import { FaultDisputeGame_Init } from "test/dispute/FaultDisputeGame.t.sol"; +// Libraries import "src/dispute/lib/Types.sol"; import "src/dispute/lib/Errors.sol"; +// Interfaces +import { IFaultDisputeGame } from "src/dispute/interfaces/IFaultDisputeGame.sol"; + contract FaultDisputeGame_Solvency_Invariant is FaultDisputeGame_Init { Claim internal constant ROOT_CLAIM = Claim.wrap(bytes32(uint256(10))); Claim internal constant ABSOLUTE_PRESTATE = Claim.wrap(bytes32((uint256(3) << 248) | uint256(0))); @@ -73,12 +77,12 @@ contract FaultDisputeGame_Solvency_Invariant is FaultDisputeGame_Init { } contract RandomClaimActor is StdUtils { - FaultDisputeGame internal immutable GAME; + IFaultDisputeGame internal immutable GAME; Vm internal immutable VM; uint256 public totalBonded; - constructor(FaultDisputeGame _gameProxy, Vm _vm) { + constructor(IFaultDisputeGame _gameProxy, Vm _vm) { GAME = _gameProxy; VM = _vm; } diff --git a/packages/contracts-bedrock/test/invariants/InvariantTest.sol b/packages/contracts-bedrock/test/invariants/InvariantTest.sol index a188bcdf27a0..eea6c158b357 100644 --- a/packages/contracts-bedrock/test/invariants/InvariantTest.sol +++ b/packages/contracts-bedrock/test/invariants/InvariantTest.sol @@ -2,7 +2,7 @@ pragma solidity 0.8.15; import { FFIInterface } from "test/setup/FFIInterface.sol"; -import { Deploy } from "scripts/Deploy.s.sol"; +import { Deploy } from "scripts/deploy/Deploy.s.sol"; import { Test } from "forge-std/Test.sol"; /// @title InvariantTest diff --git a/packages/contracts-bedrock/test/invariants/L2OutputOracle.t.sol b/packages/contracts-bedrock/test/invariants/L2OutputOracle.t.sol index 5152d7688be2..95eac249a5ba 100644 --- a/packages/contracts-bedrock/test/invariants/L2OutputOracle.t.sol +++ b/packages/contracts-bedrock/test/invariants/L2OutputOracle.t.sol @@ -2,14 +2,14 @@ pragma solidity 0.8.15; import { CommonTest } from "test/setup/CommonTest.sol"; -import { L2OutputOracle } from "src/L1/L2OutputOracle.sol"; +import { IL2OutputOracle } from "src/L1/interfaces/IL2OutputOracle.sol"; import { Vm } from "forge-std/Vm.sol"; contract L2OutputOracle_Proposer { - L2OutputOracle internal oracle; + IL2OutputOracle internal oracle; Vm internal vm; - constructor(L2OutputOracle _oracle, Vm _vm) { + constructor(IL2OutputOracle _oracle, Vm _vm) { oracle = _oracle; vm = _vm; } @@ -36,7 +36,7 @@ contract L2OutputOracle_MonotonicBlockNumIncrease_Invariant is CommonTest { super.setUp(); // Create a proposer actor. - actor = new L2OutputOracle_Proposer(l2OutputOracle, vm); + actor = new L2OutputOracle_Proposer(IL2OutputOracle(address(l2OutputOracle)), vm); // Set the target contract to the proposer actor. targetContract(address(actor)); diff --git a/packages/contracts-bedrock/test/invariants/OptimismPortal.t.sol b/packages/contracts-bedrock/test/invariants/OptimismPortal.t.sol index 804de4320286..8e5319d9aeb6 100644 --- a/packages/contracts-bedrock/test/invariants/OptimismPortal.t.sol +++ b/packages/contracts-bedrock/test/invariants/OptimismPortal.t.sol @@ -4,9 +4,9 @@ pragma solidity 0.8.15; import { StdUtils } from "forge-std/Test.sol"; import { Vm } from "forge-std/Vm.sol"; -import { OptimismPortal } from "src/L1/OptimismPortal.sol"; -import { L2OutputOracle } from "src/L1/L2OutputOracle.sol"; +import { IOptimismPortal } from "src/L1/interfaces/IOptimismPortal.sol"; import { ResourceMetering } from "src/L1/ResourceMetering.sol"; +import { IResourceMetering } from "src/L1/interfaces/IResourceMetering.sol"; import { Constants } from "src/libraries/Constants.sol"; import { CommonTest } from "test/setup/CommonTest.sol"; @@ -15,10 +15,10 @@ import { Types } from "src/libraries/Types.sol"; contract OptimismPortal_Depositor is StdUtils, ResourceMetering { Vm internal vm; - OptimismPortal internal portal; + IOptimismPortal internal portal; bool public failedToComplete; - constructor(Vm _vm, OptimismPortal _portal) { + constructor(Vm _vm, IOptimismPortal _portal) { vm = _vm; portal = _portal; initialize(); @@ -32,9 +32,11 @@ contract OptimismPortal_Depositor is StdUtils, ResourceMetering { return _resourceConfig(); } - function _resourceConfig() internal pure override returns (ResourceMetering.ResourceConfig memory) { - ResourceMetering.ResourceConfig memory rcfg = Constants.DEFAULT_RESOURCE_CONFIG(); - return rcfg; + function _resourceConfig() internal pure override returns (ResourceMetering.ResourceConfig memory config_) { + IResourceMetering.ResourceConfig memory rcfg = Constants.DEFAULT_RESOURCE_CONFIG(); + assembly ("memory-safe") { + config_ := rcfg + } } // A test intended to identify any unexpected halting conditions diff --git a/packages/contracts-bedrock/test/invariants/OptimismPortal2.t.sol b/packages/contracts-bedrock/test/invariants/OptimismPortal2.t.sol index bffc3a3b4259..dec4525a0094 100644 --- a/packages/contracts-bedrock/test/invariants/OptimismPortal2.t.sol +++ b/packages/contracts-bedrock/test/invariants/OptimismPortal2.t.sol @@ -1,28 +1,32 @@ // SPDX-License-Identifier: MIT pragma solidity 0.8.15; +// Testing import { StdUtils } from "forge-std/Test.sol"; import { Vm } from "forge-std/Vm.sol"; +import { CommonTest } from "test/setup/CommonTest.sol"; +import { EIP1967Helper } from "test/mocks/EIP1967Helper.sol"; -import { OptimismPortal2 } from "src/L1/OptimismPortal2.sol"; -import { AddressAliasHelper } from "src/vendor/AddressAliasHelper.sol"; -import { SystemConfig } from "src/L1/SystemConfig.sol"; +// Contracts import { ResourceMetering } from "src/L1/ResourceMetering.sol"; -import { Constants } from "src/libraries/Constants.sol"; -import { CommonTest } from "test/setup/CommonTest.sol"; -import { EIP1967Helper } from "test/mocks/EIP1967Helper.sol"; +// Libraries +import { Constants } from "src/libraries/Constants.sol"; import { Types } from "src/libraries/Types.sol"; - -import { FaultDisputeGame } from "src/dispute/FaultDisputeGame.sol"; import "src/dispute/lib/Types.sol"; +import "src/libraries/PortalErrors.sol"; + +// Interfaces +import { IOptimismPortal2 } from "src/L1/interfaces/IOptimismPortal2.sol"; +import { IResourceMetering } from "src/L1/interfaces/IResourceMetering.sol"; +import { IFaultDisputeGame } from "src/dispute/interfaces/IFaultDisputeGame.sol"; contract OptimismPortal2_Depositor is StdUtils, ResourceMetering { Vm internal vm; - OptimismPortal2 internal portal; + IOptimismPortal2 internal portal; bool public failedToComplete; - constructor(Vm _vm, OptimismPortal2 _portal) { + constructor(Vm _vm, IOptimismPortal2 _portal) { vm = _vm; portal = _portal; initialize(); @@ -36,9 +40,11 @@ contract OptimismPortal2_Depositor is StdUtils, ResourceMetering { return _resourceConfig(); } - function _resourceConfig() internal pure override returns (ResourceMetering.ResourceConfig memory) { - ResourceMetering.ResourceConfig memory rcfg = Constants.DEFAULT_RESOURCE_CONFIG(); - return rcfg; + function _resourceConfig() internal pure override returns (ResourceMetering.ResourceConfig memory config_) { + IResourceMetering.ResourceConfig memory rcfg = Constants.DEFAULT_RESOURCE_CONFIG(); + assembly ("memory-safe") { + config_ := rcfg + } } // A test intended to identify any unexpected halting conditions @@ -115,7 +121,7 @@ contract OptimismPortal2_Invariant_Harness is CommonTest { // Create a dispute game with the output root we've proposed. _proposedBlockNumber = 0xFF; - FaultDisputeGame game = FaultDisputeGame( + IFaultDisputeGame game = IFaultDisputeGame( payable( address( disputeGameFactory.create( @@ -209,7 +215,7 @@ contract OptimismPortal2_CannotFinalizeTwice is OptimismPortal2_Invariant_Harnes /// Ensures that there is no chain of calls that can be made that allows a withdrawal to be /// finalized twice. function invariant_cannotFinalizeTwice() external { - vm.expectRevert("OptimismPortal: withdrawal has already been finalized"); + vm.expectRevert(AlreadyFinalized.selector); optimismPortal2.finalizeWithdrawalTransaction(_defaultTx); } } diff --git a/packages/contracts-bedrock/test/invariants/OptimismSuperchainERC20/OptimismSuperchainERC20.t.sol b/packages/contracts-bedrock/test/invariants/OptimismSuperchainERC20/OptimismSuperchainERC20.t.sol new file mode 100644 index 000000000000..d90e90a2f811 --- /dev/null +++ b/packages/contracts-bedrock/test/invariants/OptimismSuperchainERC20/OptimismSuperchainERC20.t.sol @@ -0,0 +1,83 @@ +// SPDX-License-Identifier: MIT +pragma solidity 0.8.25; + +// Testing utilities +import { Test, StdUtils, Vm } from "forge-std/Test.sol"; +import { StdInvariant } from "forge-std/StdInvariant.sol"; +import { StdAssertions } from "forge-std/StdAssertions.sol"; +import { EIP1967Helper } from "test/mocks/EIP1967Helper.sol"; + +// Libraries +import { Predeploys } from "src/libraries/Predeploys.sol"; +import { OptimismSuperchainERC20 } from "src/L2/OptimismSuperchainERC20.sol"; +import { IL2ToL2CrossDomainMessenger } from "src/L2/interfaces/IL2ToL2CrossDomainMessenger.sol"; +import { ProtocolGuided } from "./fuzz/Protocol.guided.t.sol"; +import { ProtocolUnguided } from "./fuzz/Protocol.unguided.t.sol"; +import { HandlerGetters } from "./helpers/HandlerGetters.t.sol"; +import { MockL2ToL2CrossDomainMessenger } from "./helpers/MockL2ToL2CrossDomainMessenger.t.sol"; + +contract OptimismSuperchainERC20Handler is HandlerGetters, ProtocolGuided, ProtocolUnguided { } + +contract OptimismSuperchainERC20Properties is Test { + OptimismSuperchainERC20Handler internal handler; + MockL2ToL2CrossDomainMessenger internal constant MESSENGER = + MockL2ToL2CrossDomainMessenger(Predeploys.L2_TO_L2_CROSS_DOMAIN_MESSENGER); + + function setUp() public { + handler = new OptimismSuperchainERC20Handler(); + targetContract(address(handler)); + } + + // TODO: will need rework after + // - `convert` + /// @custom:invariant sum of supertoken total supply across all chains is always <= to convert(legacy, super)- + /// convert(super, legacy) + function invariant_totalSupplyAcrossChainsEqualsMintsMinusFundsInTransit() external view { + // iterate over unique deploy salts aka supertokens that are supposed to be compatible with each other + for (uint256 deploySaltIndex = 0; deploySaltIndex < handler.deploySaltsLength(); deploySaltIndex++) { + uint256 totalSupply = 0; + (bytes32 currentSalt, uint256 trackedSupply) = handler.totalSupplyAcrossChainsAtIndex(deploySaltIndex); + uint256 fundsInTransit = handler.tokensInTransitForDeploySalt(currentSalt); + // and then over all the (mocked) chain ids where that supertoken could be deployed + for (uint256 validChainId = 0; validChainId < handler.MAX_CHAINS(); validChainId++) { + address supertoken = MESSENGER.superTokenAddresses(validChainId, currentSalt); + if (supertoken != address(0)) { + totalSupply += OptimismSuperchainERC20(supertoken).totalSupply(); + } + } + assertEq(trackedSupply, totalSupply + fundsInTransit); + } + } + + // TODO: will need rework after + // - `convert` + /// @custom:invariant sum of supertoken total supply across all chains is equal to convert(legacy, super)- + /// convert(super, legacy) when all when all cross-chain messages are processed + function invariant_totalSupplyAcrossChainsEqualsMintsWhenQueueIsEmpty() external view { + if (MESSENGER.messageQueueLength() != 0) { + return; + } + // iterate over unique deploy salts aka supertokens that are supposed to be compatible with each other + for (uint256 deploySaltIndex = 0; deploySaltIndex < handler.deploySaltsLength(); deploySaltIndex++) { + uint256 totalSupply = 0; + (bytes32 currentSalt, uint256 trackedSupply) = handler.totalSupplyAcrossChainsAtIndex(deploySaltIndex); + // and then over all the (mocked) chain ids where that supertoken could be deployed + for (uint256 validChainId = 0; validChainId < handler.MAX_CHAINS(); validChainId++) { + address supertoken = MESSENGER.superTokenAddresses(validChainId, currentSalt); + if (supertoken != address(0)) { + totalSupply += OptimismSuperchainERC20(supertoken).totalSupply(); + } + } + assertEq(trackedSupply, totalSupply); + } + } + + /// @custom:invariant many other assertion mode invariants are also defined under + /// `test/invariants/OptimismSuperchainERC20/fuzz/` . + /// + /// since setting`fail_on_revert=false` also ignores StdAssertion failures, this invariant explicitly asks the + /// handler for assertion test failures + function invariant_handlerAssertions() external view { + assertFalse(handler.failed()); + } +} diff --git a/packages/contracts-bedrock/test/invariants/OptimismSuperchainERC20/PROPERTIES.md b/packages/contracts-bedrock/test/invariants/OptimismSuperchainERC20/PROPERTIES.md new file mode 100644 index 000000000000..18970855ca46 --- /dev/null +++ b/packages/contracts-bedrock/test/invariants/OptimismSuperchainERC20/PROPERTIES.md @@ -0,0 +1,82 @@ +# Supertoken advanced testing + +## Milestones + +The supertoken ecosystem consists of not just the supertoken contract, but the required changes to other contracts for liquidity to reach the former. + +Considering only the supertoken contract is merged into the `develop` branch, and work for the other components is still in progress, we define three milestones for the testing campaign: + +- SupERC20: concerned with only the supertoken contract, the first one to be implemented +- Factories: covers the above + the development of `OptimismSuperchainERC20Factory` and required changes to `OptimismMintableERC20Factory` +- Liquidity Migration: includes the `convert` function on the `L2StandardBridgeInterop` to migrate liquidity from legacy tokens into supertokens + +## Definitions + +- *legacy token:* an OptimismMintableERC20 or L2StandardERC20 token on the suprechain that has either been deployed by the factory after the liquidity migration upgrade to the latter, or has been deployed before it **but** added to factory’s `deployments` mapping as part of the upgrade. This testing campaign is not concerned with tokens on L1 or not listed in the factory’s `deployments` mapping. +- *supertoken:* a SuperchainERC20 contract deployed by the `OptimismSuperchainERC20Factory` + +# Ecosystem properties + +legend: + +- `[ ]`: property not yet tested +- `**[ ]**`: property not yet tested, dev/research team has asked for extra focus on it +- `[X]`: tested/proven property +- `[~]`: partially tested/proven property +- `:(`: property won't be tested due to some limitation + +## Unit test + +| id | milestone | description | tested | +| --- | --- | --- | --- | +| 0 | Factories | supertoken token address does not depend on the executing chain’s chainID | [ ] | +| 1 | Factories | supertoken token address depends on remote token, name, symbol and decimals | [ ] | +| 2 | Liquidity Migration | convert() should only allow converting legacy tokens to supertoken and viceversa | [ ] | +| 3 | Liquidity Migration | convert() only allows migrations between tokens representing the same remote asset | [ ] | +| 4 | Liquidity Migration | convert() only allows migrations from tokens with the same decimals | [ ] | +| 5 | Liquidity Migration | convert() burns the same amount of legacy token that it mints of supertoken, and viceversa | [ ] | +| 25 | SupERC20 | supertokens can't be reinitialized | [x] | + +## Valid state + +| id | milestone | description | tested | +| --- | --- | --- | --- | +| 6 | SupERC20 | calls to sendERC20 succeed as long as caller has enough balance | [x] | +| 7 | SupERC20 | calls to relayERC20 always succeed as long as the cross-domain caller is valid | [~] | + +## Variable transition + +| id | milestone | description | tested | +| --- | --- | --- | --- | +| 8 | SupERC20 | sendERC20 with a value of zero does not modify accounting | [x] | +| 9 | SupERC20 | relayERC20 with a value of zero does not modify accounting | [x] | +| 10 | SupERC20 | sendERC20 decreases the token's totalSupply in the source chain exactly by the input amount | [x] | +| 26 | SupERC20 | sendERC20 decreases the sender's balance in the source chain exactly by the input amount | [x] | +| 27 | SupERC20 | relayERC20 increases sender's balance in the destination chain exactly by the input amount | [x] | +| 11 | SupERC20 | relayERC20 increases the token's totalSupply in the destination chain exactly by the input amount | [ ] | +| 12 | Liquidity Migration | supertoken total supply only increases on calls to mint() by the L2toL2StandardBridge | [~] | +| 13 | Liquidity Migration | supertoken total supply only decreases on calls to burn() by the L2toL2StandardBridge | [ ] | +| 14 | SupERC20 | supertoken total supply starts at zero | [x] | +| 15 | Factories | deploying a supertoken registers its remote token in the factory | [ ] | +| 16 | Factories | deploying an OptimismMintableERC20 registers its remote token in the factory | [ ] | + +## High level + +| id | milestone | description | tested | +| --- | --- | --- | --- | +| 17 | Liquidity Migration | only calls to convert(legacy, super) can increase a supertoken’s total supply across chains | [ ] | +| 18 | Liquidity Migration | only calls to convert(super, legacy) can decrease a supertoken’s total supply across chains | [ ] | +| 19 | Liquidity Migration | sum of supertoken total supply across all chains is always <= to convert(legacy, super)- convert(super, legacy) | [~] | +| 20 | SupERC20 | tokens sendERC20-ed on a source chain to a destination chain can be relayERC20-ed on it as long as the source chain is in the dependency set of the destination chain | [ ] | +| 21 | Liquidity Migration | sum of supertoken total supply across all chains is = to convert(legacy, super)- convert(super, legacy) when all cross-chain messages are processed | [~] | + +## Atomic bridging pseudo-properties + +As another layer of defense, the following properties are defined which assume bridging operations to be atomic (that is, the sequencer and L2Inbox and CrossDomainMessenger contracts are fully abstracted away, `sendERC20` triggering the `relayERC20` call on the same transaction) +It’s worth noting that these properties will not hold for a live system + +| id | milestone | description | tested | +| --- | --- | --- | --- | +| 22 | SupERC20 | sendERC20 decreases sender balance in source chain and increases receiver balance in destination chain exactly by the input amount | [x] | +| 23 | SupERC20 | sendERC20 decreases total supply in source chain and increases it in destination chain exactly by the input amount | [x] | +| 24 | Liquidity Migration | sum of supertoken total supply across all chains is always equal to convert(legacy, super)- convert(super, legacy) | [~] | diff --git a/packages/contracts-bedrock/test/invariants/OptimismSuperchainERC20/fuzz/Protocol.guided.t.sol b/packages/contracts-bedrock/test/invariants/OptimismSuperchainERC20/fuzz/Protocol.guided.t.sol new file mode 100644 index 000000000000..536a4ea7025a --- /dev/null +++ b/packages/contracts-bedrock/test/invariants/OptimismSuperchainERC20/fuzz/Protocol.guided.t.sol @@ -0,0 +1,211 @@ +// SPDX-License-Identifier: MIT +pragma solidity ^0.8.25; + +import { MockL2ToL2CrossDomainMessenger } from "../helpers/MockL2ToL2CrossDomainMessenger.t.sol"; +import { OptimismSuperchainERC20 } from "src/L2/OptimismSuperchainERC20.sol"; +import { ProtocolHandler } from "../handlers/Protocol.t.sol"; +import { EnumerableMap } from "@openzeppelin/contracts/utils/structs/EnumerableMap.sol"; +import { CompatibleAssert } from "../helpers/CompatibleAssert.t.sol"; + +contract ProtocolGuided is ProtocolHandler, CompatibleAssert { + using EnumerableMap for EnumerableMap.Bytes32ToUintMap; + /// @notice deploy a new supertoken with deploy salt determined by params, to the given (of course mocked) chainId + /// @custom:property-id 14 + /// @custom:property supertoken total supply starts at zero + + function fuzz_deployNewSupertoken( + TokenDeployParams memory params, + uint256 chainId + ) + external + validateTokenDeployParams(params) + { + chainId = bound(chainId, 0, MAX_CHAINS - 1); + OptimismSuperchainERC20 supertoken = _deploySupertoken( + remoteTokens[params.remoteTokenIndex], + WORDS[params.nameIndex], + WORDS[params.symbolIndex], + DECIMALS[params.decimalsIndex], + chainId + ); + // 14 + compatibleAssert(supertoken.totalSupply() == 0); + } + + /// @custom:property-id 6 + /// @custom:property calls to sendERC20 succeed as long as caller has enough balance + /// @custom:property-id 22 + /// @custom:property sendERC20 decreases sender balance in source chain and increases receiver balance in + /// destination chain exactly by the input amount + /// @custom:property-id 23 + /// @custom:property sendERC20 decreases total supply in source chain and increases it in destination chain exactly + /// by the input amount + function fuzz_bridgeSupertokenAtomic( + uint256 fromIndex, + uint256 recipientIndex, + uint256 destinationChainId, + uint256 amount + ) + public + withActor(msg.sender) + { + destinationChainId = bound(destinationChainId, 0, MAX_CHAINS - 1); + fromIndex = bound(fromIndex, 0, allSuperTokens.length - 1); + address recipient = getActorByRawIndex(recipientIndex); + OptimismSuperchainERC20 sourceToken = OptimismSuperchainERC20(allSuperTokens[fromIndex]); + OptimismSuperchainERC20 destinationToken = + MESSENGER.crossChainMessageReceiver(address(sourceToken), destinationChainId); + uint256 sourceBalanceBefore = sourceToken.balanceOf(currentActor()); + uint256 sourceSupplyBefore = sourceToken.totalSupply(); + uint256 destinationBalanceBefore = destinationToken.balanceOf(recipient); + uint256 destinationSupplyBefore = destinationToken.totalSupply(); + + MESSENGER.setAtomic(true); + vm.prank(currentActor()); + try sourceToken.sendERC20(recipient, amount, destinationChainId) { + MESSENGER.setAtomic(false); + uint256 sourceBalanceAfter = sourceToken.balanceOf(currentActor()); + uint256 destinationBalanceAfter = destinationToken.balanceOf(recipient); + // no free mint + compatibleAssert( + sourceBalanceBefore + destinationBalanceBefore == sourceBalanceAfter + destinationBalanceAfter + ); + // 22 + compatibleAssert(sourceBalanceBefore - amount == sourceBalanceAfter); + compatibleAssert(destinationBalanceBefore + amount == destinationBalanceAfter); + uint256 sourceSupplyAfter = sourceToken.totalSupply(); + uint256 destinationSupplyAfter = destinationToken.totalSupply(); + // 23 + compatibleAssert(sourceSupplyBefore - amount == sourceSupplyAfter); + compatibleAssert(destinationSupplyBefore + amount == destinationSupplyAfter); + } catch { + MESSENGER.setAtomic(false); + // 6 + compatibleAssert(address(destinationToken) == address(sourceToken) || sourceBalanceBefore < amount); + } + } + + /// @custom:property-id 6 + /// @custom:property calls to sendERC20 succeed as long as caller has enough balance + /// @custom:property-id 26 + /// @custom:property sendERC20 decreases sender balance in source chain exactly by the input amount + /// @custom:property-id 10 + /// @custom:property sendERC20 decreases total supply in source chain exactly by the input amount + function fuzz_sendERC20( + uint256 fromIndex, + uint256 recipientIndex, + uint256 destinationChainId, + uint256 amount + ) + public + withActor(msg.sender) + { + destinationChainId = bound(destinationChainId, 0, MAX_CHAINS - 1); + fromIndex = bound(fromIndex, 0, allSuperTokens.length - 1); + address recipient = getActorByRawIndex(recipientIndex); + OptimismSuperchainERC20 sourceToken = OptimismSuperchainERC20(allSuperTokens[fromIndex]); + OptimismSuperchainERC20 destinationToken = + MESSENGER.crossChainMessageReceiver(address(sourceToken), destinationChainId); + bytes32 deploySalt = MESSENGER.superTokenInitDeploySalts(address(sourceToken)); + uint256 sourceBalanceBefore = sourceToken.balanceOf(currentActor()); + uint256 sourceSupplyBefore = sourceToken.totalSupply(); + + vm.prank(currentActor()); + try sourceToken.sendERC20(recipient, amount, destinationChainId) { + (, uint256 currentlyInTransit) = ghost_tokensInTransit.tryGet(deploySalt); + ghost_tokensInTransit.set(deploySalt, currentlyInTransit + amount); + // 26 + uint256 sourceBalanceAfter = sourceToken.balanceOf(currentActor()); + compatibleAssert(sourceBalanceBefore - amount == sourceBalanceAfter); + // 10 + uint256 sourceSupplyAfter = sourceToken.totalSupply(); + compatibleAssert(sourceSupplyBefore - amount == sourceSupplyAfter); + } catch { + // 6 + compatibleAssert(address(destinationToken) == address(sourceToken) || sourceBalanceBefore < amount); + } + } + + /// @custom:property-id 11 + /// @custom:property relayERC20 increases the token's totalSupply in the destination chain exactly by the input + /// amount + /// @custom:property-id 27 + /// @custom:property relayERC20 increases sender's balance in the destination chain exactly by the input amount + /// @custom:property-id 7 + /// @custom:property calls to relayERC20 always succeed as long as the cross-domain caller is valid + function fuzz_relayERC20(uint256 messageIndex) external { + MockL2ToL2CrossDomainMessenger.CrossChainMessage memory messageToRelay = MESSENGER.messageQueue(messageIndex); + OptimismSuperchainERC20 destinationToken = OptimismSuperchainERC20(messageToRelay.crossDomainMessageSender); + uint256 destinationSupplyBefore = destinationToken.totalSupply(); + uint256 destinationBalanceBefore = destinationToken.balanceOf(messageToRelay.recipient); + + try MESSENGER.relayMessageFromQueue(messageIndex) { + bytes32 deploySalt = MESSENGER.superTokenInitDeploySalts(address(destinationToken)); + (bool success, uint256 currentlyInTransit) = ghost_tokensInTransit.tryGet(deploySalt); + // if sendERC20 didnt intialize this, then test suite is broken + compatibleAssert(success); + ghost_tokensInTransit.set(deploySalt, currentlyInTransit - messageToRelay.amount); + // 11 + compatibleAssert(destinationSupplyBefore + messageToRelay.amount == destinationToken.totalSupply()); + // 27 + compatibleAssert( + destinationBalanceBefore + messageToRelay.amount == destinationToken.balanceOf(messageToRelay.recipient) + ); + } catch { + // 7 + compatibleAssert(false); + } + } + + /// @custom:property-id 8 + /// @custom:property calls to sendERC20 with a value of zero dont modify accounting + // @notice is a subset of fuzz_sendERC20, so we'll just call it + // instead of re-implementing it. Keeping the function for visibility of the property. + function fuzz_sendZeroDoesNotModifyAccounting( + uint256 fromIndex, + uint256 recipientIndex, + uint256 destinationChainId + ) + external + { + fuzz_sendERC20(fromIndex, recipientIndex, destinationChainId, 0); + } + + /// @custom:property-id 9 + /// @custom:property calls to relayERC20 with a value of zero dont modify accounting + /// @custom:property-id 7 + /// @custom:property calls to relayERC20 always succeed as long as the cross-domain caller is valid + /// @notice cant call fuzz_RelayERC20 internally since that pops a + /// random message, which we cannot guarantee has a value of zero + function fuzz_relayZeroDoesNotModifyAccounting( + uint256 fromIndex, + uint256 recipientIndex + ) + external + withActor(msg.sender) + { + fromIndex = bound(fromIndex, 0, allSuperTokens.length - 1); + address recipient = getActorByRawIndex(recipientIndex); + OptimismSuperchainERC20 token = OptimismSuperchainERC20(allSuperTokens[fromIndex]); + uint256 balanceSenderBefore = token.balanceOf(currentActor()); + uint256 balanceRecipientBefore = token.balanceOf(recipient); + uint256 supplyBefore = token.totalSupply(); + + MESSENGER.setCrossDomainMessageSender(address(token)); + vm.prank(address(MESSENGER)); + try token.relayERC20(currentActor(), recipient, 0) { + MESSENGER.setCrossDomainMessageSender(address(0)); + } catch { + // should not revert because of 7, and if it *does* revert, I want the test suite + // to discard the sequence instead of potentially getting another + // error due to the crossDomainMessageSender being manually set + compatibleAssert(false); + } + uint256 balanceSenderAfter = token.balanceOf(currentActor()); + uint256 balanceRecipeintAfter = token.balanceOf(recipient); + uint256 supplyAfter = token.totalSupply(); + compatibleAssert(balanceSenderBefore == balanceSenderAfter); + compatibleAssert(balanceRecipientBefore == balanceRecipeintAfter); + compatibleAssert(supplyBefore == supplyAfter); + } +} diff --git a/packages/contracts-bedrock/test/invariants/OptimismSuperchainERC20/fuzz/Protocol.unguided.t.sol b/packages/contracts-bedrock/test/invariants/OptimismSuperchainERC20/fuzz/Protocol.unguided.t.sol new file mode 100644 index 000000000000..90cad38baa99 --- /dev/null +++ b/packages/contracts-bedrock/test/invariants/OptimismSuperchainERC20/fuzz/Protocol.unguided.t.sol @@ -0,0 +1,137 @@ +// SPDX-License-Identifier: MIT +pragma solidity ^0.8.25; + +import { ProtocolHandler } from "../handlers/Protocol.t.sol"; +import { EnumerableMap } from "@openzeppelin/contracts/utils/structs/EnumerableMap.sol"; +import { OptimismSuperchainERC20 } from "src/L2/OptimismSuperchainERC20.sol"; +import { CompatibleAssert } from "../helpers/CompatibleAssert.t.sol"; + +// TODO: add fuzz_sendERC20 when we implement non-atomic bridging +contract ProtocolUnguided is ProtocolHandler, CompatibleAssert { + using EnumerableMap for EnumerableMap.Bytes32ToUintMap; + + /// @custom:property-id 7 + /// @custom:property calls to relayERC20 always succeed as long as the cross-domain caller is valid + /// @notice this ensures actors cant simply call relayERC20 and get tokens, no matter the system state + /// but there's still some possible work on how hard we can bork the system state with handlers calling + /// the L2ToL2CrossDomainMessenger or bridge directly (pending on non-atomic bridging) + function fuzz_relayERC20( + uint256 tokenIndex, + address sender, + address crossDomainMessageSender, + address recipient, + uint256 amount + ) + external + { + MESSENGER.setCrossDomainMessageSender(crossDomainMessageSender); + address token = allSuperTokens[bound(tokenIndex, 0, allSuperTokens.length)]; + vm.prank(sender); + try OptimismSuperchainERC20(token).relayERC20(sender, recipient, amount) { + MESSENGER.setCrossDomainMessageSender(address(0)); + compatibleAssert(sender == address(MESSENGER)); + compatibleAssert(crossDomainMessageSender == token); + // this increases the supply across chains without a call to + // `mint` by the MESSENGER, so it kind of breaks an invariant, but + // let's walk around that: + bytes32 salt = MESSENGER.superTokenInitDeploySalts(token); + (, uint256 currentValue) = ghost_totalSupplyAcrossChains.tryGet(salt); + ghost_totalSupplyAcrossChains.set(salt, currentValue + amount); + } catch { + compatibleAssert(sender != address(MESSENGER) || crossDomainMessageSender != token); + MESSENGER.setCrossDomainMessageSender(address(0)); + } + } + + /// @custom:property-id 6 + /// @custom:property calls to sendERC20 succeed as long as caller has enough balance + /// @custom:property-id 26 + /// @custom:property sendERC20 decreases sender balance in source chain exactly by the input amount + /// @custom:property-id 10 + /// @custom:property sendERC20 decreases total supply in source chain exactly by the input amount + function fuzz_sendERC20( + address sender, + address recipient, + uint256 fromIndex, + uint256 destinationChainId, + uint256 amount + ) + public + { + destinationChainId = bound(destinationChainId, 0, MAX_CHAINS - 1); + OptimismSuperchainERC20 sourceToken = OptimismSuperchainERC20(allSuperTokens[fromIndex]); + OptimismSuperchainERC20 destinationToken = + MESSENGER.crossChainMessageReceiver(address(sourceToken), destinationChainId); + bytes32 deploySalt = MESSENGER.superTokenInitDeploySalts(address(sourceToken)); + uint256 sourceBalanceBefore = sourceToken.balanceOf(sender); + uint256 sourceSupplyBefore = sourceToken.totalSupply(); + + vm.prank(sender); + try sourceToken.sendERC20(recipient, amount, destinationChainId) { + (, uint256 currentlyInTransit) = ghost_tokensInTransit.tryGet(deploySalt); + ghost_tokensInTransit.set(deploySalt, currentlyInTransit + amount); + // 26 + uint256 sourceBalanceAfter = sourceToken.balanceOf(sender); + compatibleAssert(sourceBalanceBefore - amount == sourceBalanceAfter); + // 10 + uint256 sourceSupplyAfter = sourceToken.totalSupply(); + compatibleAssert(sourceSupplyBefore - amount == sourceSupplyAfter); + } catch { + // 6 + compatibleAssert(address(destinationToken) == address(sourceToken) || sourceBalanceBefore < amount); + } + } + + /// @custom:property-id 12 + /// @custom:property supertoken total supply only increases on calls to mint() by the L2toL2StandardBridge + function fuzz_mint(uint256 tokenIndex, address to, address sender, uint256 amount) external { + address token = allSuperTokens[bound(tokenIndex, 0, allSuperTokens.length)]; + bytes32 salt = MESSENGER.superTokenInitDeploySalts(token); + amount = bound(amount, 0, type(uint256).max - OptimismSuperchainERC20(token).totalSupply()); + vm.prank(sender); + try OptimismSuperchainERC20(token).mint(to, amount) { + compatibleAssert(sender == BRIDGE); + (, uint256 currentValue) = ghost_totalSupplyAcrossChains.tryGet(salt); + ghost_totalSupplyAcrossChains.set(salt, currentValue + amount); + } catch { + compatibleAssert(sender != BRIDGE || to == address(0)); + } + } + + /// @custom:property-id 13 + /// @custom:property supertoken total supply only increases on calls to mint() by the L2toL2StandardBridge + function fuzz_burn(uint256 tokenIndex, address from, address sender, uint256 amount) external { + address token = allSuperTokens[bound(tokenIndex, 0, allSuperTokens.length)]; + bytes32 salt = MESSENGER.superTokenInitDeploySalts(token); + uint256 senderBalance = OptimismSuperchainERC20(token).balanceOf(sender); + vm.prank(sender); + try OptimismSuperchainERC20(token).burn(from, amount) { + compatibleAssert(sender == BRIDGE); + (, uint256 currentValue) = ghost_totalSupplyAcrossChains.tryGet(salt); + ghost_totalSupplyAcrossChains.set(salt, currentValue - amount); + } catch { + compatibleAssert(sender != BRIDGE || senderBalance < amount); + } + } + + /// @custom:property-id 25 + /// @custom:property supertokens can't be reinitialized + function fuzz_initialize( + address sender, + uint256 tokenIndex, + address remoteToken, + string memory name, + string memory symbol, + uint8 decimals + ) + external + { + vm.prank(sender); + // revert is possible in bound, but is not part of the external call + try OptimismSuperchainERC20(allSuperTokens[bound(tokenIndex, 0, allSuperTokens.length)]).initialize( + remoteToken, name, symbol, decimals + ) { + compatibleAssert(false); + } catch { } + } +} diff --git a/packages/contracts-bedrock/test/invariants/OptimismSuperchainERC20/handlers/Protocol.t.sol b/packages/contracts-bedrock/test/invariants/OptimismSuperchainERC20/handlers/Protocol.t.sol new file mode 100644 index 000000000000..921495b467ab --- /dev/null +++ b/packages/contracts-bedrock/test/invariants/OptimismSuperchainERC20/handlers/Protocol.t.sol @@ -0,0 +1,177 @@ +// SPDX-License-Identifier: MIT +pragma solidity ^0.8.25; + +import { TestBase } from "forge-std/Base.sol"; +import { StdUtils } from "forge-std/StdUtils.sol"; + +import { ERC1967Proxy } from "@openzeppelin/contracts-v5/proxy/ERC1967/ERC1967Proxy.sol"; +import { EnumerableMap } from "@openzeppelin/contracts/utils/structs/EnumerableMap.sol"; +import { OptimismSuperchainERC20 } from "src/L2/OptimismSuperchainERC20.sol"; +import { OptimismSuperchainERC20ForToBProperties } from "../helpers/OptimismSuperchainERC20ForToBProperties.t.sol"; +import { Predeploys } from "src/libraries/Predeploys.sol"; +import { MockL2ToL2CrossDomainMessenger } from "../helpers/MockL2ToL2CrossDomainMessenger.t.sol"; +import { Actors } from "../helpers/Actors.t.sol"; + +contract ProtocolHandler is TestBase, StdUtils, Actors { + using EnumerableMap for EnumerableMap.Bytes32ToUintMap; + + uint8 public constant MAX_CHAINS = 4; + uint8 internal constant INITIAL_TOKENS = 1; + uint8 internal constant INITIAL_SUPERTOKENS = 1; + uint8 internal constant SUPERTOKEN_INITIAL_MINT = 100; + address internal constant BRIDGE = Predeploys.L2_STANDARD_BRIDGE; + MockL2ToL2CrossDomainMessenger internal constant MESSENGER = + MockL2ToL2CrossDomainMessenger(Predeploys.L2_TO_L2_CROSS_DOMAIN_MESSENGER); + OptimismSuperchainERC20 internal superchainERC20Impl; + // NOTE: having more options for this enables the fuzzer to configure + // different supertokens for the same remote token + string[] internal WORDS = ["TOKENS"]; + uint8[] internal DECIMALS = [6, 18]; + + struct TokenDeployParams { + uint8 remoteTokenIndex; + uint8 nameIndex; + uint8 symbolIndex; + uint8 decimalsIndex; + } + + address[] internal remoteTokens; + address[] internal allSuperTokens; + + /// @notice 'real' deploy salt => total supply sum across chains + EnumerableMap.Bytes32ToUintMap internal ghost_totalSupplyAcrossChains; + /// @notice 'real' deploy salt => tokens sendERC20'd but not yet relayERC20'd + EnumerableMap.Bytes32ToUintMap internal ghost_tokensInTransit; + + constructor() { + vm.etch(address(MESSENGER), address(new MockL2ToL2CrossDomainMessenger()).code); + superchainERC20Impl = new OptimismSuperchainERC20ForToBProperties(); + for (uint256 remoteTokenIndex; remoteTokenIndex < INITIAL_TOKENS; remoteTokenIndex++) { + _deployRemoteToken(); + for (uint256 supertokenChainId; supertokenChainId < INITIAL_SUPERTOKENS; supertokenChainId++) { + _deploySupertoken(remoteTokens[remoteTokenIndex], WORDS[0], WORDS[0], DECIMALS[0], supertokenChainId); + } + } + // integrate with all ToB properties using address(this) as the sender + addActor(address(this)); + } + + /// @notice the deploy params are _indexes_ to pick from a pre-defined array of options and limit + /// the amount of supertokens for a given remoteAsset that are incompatible between them, as + /// two supertokens have to share decimals, name, symbol and remoteAsset to be considered + /// the same asset, and therefore bridgable. + modifier validateTokenDeployParams(TokenDeployParams memory params) { + params.remoteTokenIndex = uint8(bound(params.remoteTokenIndex, 0, remoteTokens.length - 1)); + params.nameIndex = uint8(bound(params.nameIndex, 0, WORDS.length - 1)); + params.symbolIndex = uint8(bound(params.symbolIndex, 0, WORDS.length - 1)); + params.decimalsIndex = uint8(bound(params.decimalsIndex, 0, DECIMALS.length - 1)); + _; + } + + function handler_mockNewRemoteToken() external { + _deployRemoteToken(); + } + + /// @notice pick one already-deployed supertoken and mint an arbitrary amount of it + /// necessary so there is something to be bridged :D + /// TODO: will be replaced when testing the factories and `convert()` + function handler_mintSupertoken(uint256 index, uint96 amount) external withActor(msg.sender) { + index = bound(index, 0, allSuperTokens.length - 1); + address addr = allSuperTokens[index]; + vm.prank(BRIDGE); + OptimismSuperchainERC20(addr).mint(currentActor(), amount); + // currentValue will be zero if key is not present + (, uint256 currentValue) = ghost_totalSupplyAcrossChains.tryGet(MESSENGER.superTokenInitDeploySalts(addr)); + ghost_totalSupplyAcrossChains.set(MESSENGER.superTokenInitDeploySalts(addr), currentValue + amount); + } + + /// @notice The ToB properties don't preclude the need for this since they + /// always use address(this) as the caller, which won't get any balance + /// until it's transferred to it somehow + function handler_supERC20Transfer( + uint256 tokenIndex, + uint256 toIndex, + uint256 amount + ) + external + withActor(msg.sender) + { + vm.prank(currentActor()); + OptimismSuperchainERC20(allSuperTokens[bound(tokenIndex, 0, allSuperTokens.length)]).transfer( + getActorByRawIndex(toIndex), amount + ); + } + + function handler_supERC20TransferFrom( + uint256 tokenIndex, + uint256 fromIndex, + uint256 toIndex, + uint256 amount + ) + external + withActor(msg.sender) + { + vm.prank(currentActor()); + OptimismSuperchainERC20(allSuperTokens[bound(tokenIndex, 0, allSuperTokens.length)]).transferFrom( + getActorByRawIndex(fromIndex), getActorByRawIndex(toIndex), amount + ); + } + + function handler_supERC20Approve( + uint256 tokenIndex, + uint256 spenderIndex, + uint256 amount + ) + external + withActor(msg.sender) + { + vm.prank(currentActor()); + OptimismSuperchainERC20(allSuperTokens[bound(tokenIndex, 0, allSuperTokens.length)]).approve( + getActorByRawIndex(spenderIndex), amount + ); + } + + /// @notice deploy a remote token, that supertokens will be a representation of. They are never called, so there + /// is no need to actually deploy a contract for them + function _deployRemoteToken() internal { + // make sure they don't conflict with predeploys/preinstalls/precompiles/other tokens + remoteTokens.push(address(uint160(1000 + remoteTokens.length))); + } + + /// @notice deploy a new supertoken representing remoteToken + /// remoteToken, name, symbol and decimals determine the 'real' deploy salt + /// and supertokens sharing it are interoperable between them + /// we however use the chainId as part of the deploy salt to mock the ability of + /// supertokens to exist on different chains on a single EVM. + function _deploySupertoken( + address remoteToken, + string memory name, + string memory symbol, + uint8 decimals, + uint256 chainId + ) + internal + returns (OptimismSuperchainERC20 supertoken) + { + // this salt would be used in production. Tokens sharing it will be bridgable with each other + bytes32 realSalt = keccak256(abi.encode(remoteToken, name, symbol, decimals)); + // Foundry invariant erroneously show other unrelated invariant breaking + // when this deployment fails due to a create2 collision, so we revert eagerly instead + require(MESSENGER.superTokenAddresses(chainId, realSalt) == address(0), "skip duplicate deployment"); + + // what we use in the tests to walk around two contracts needing two different addresses + // tbf we could be using CREATE1, but this feels more verbose + bytes32 hackySalt = keccak256(abi.encode(remoteToken, name, symbol, decimals, chainId)); + supertoken = OptimismSuperchainERC20( + address( + // TODO: Use the SuperchainERC20 Beacon Proxy + new ERC1967Proxy{ salt: hackySalt }( + address(superchainERC20Impl), + abi.encodeCall(OptimismSuperchainERC20.initialize, (remoteToken, name, symbol, decimals)) + ) + ) + ); + MESSENGER.registerSupertoken(realSalt, chainId, address(supertoken)); + allSuperTokens.push(address(supertoken)); + } +} diff --git a/packages/contracts-bedrock/test/invariants/OptimismSuperchainERC20/helpers/Actors.t.sol b/packages/contracts-bedrock/test/invariants/OptimismSuperchainERC20/helpers/Actors.t.sol new file mode 100644 index 000000000000..3a7400667518 --- /dev/null +++ b/packages/contracts-bedrock/test/invariants/OptimismSuperchainERC20/helpers/Actors.t.sol @@ -0,0 +1,38 @@ +// SPDX-License-Identifier: MIT +pragma solidity ^0.8.25; + +import { StdUtils } from "forge-std/StdUtils.sol"; + +/// @notice helper for tracking actors, taking advantage of the fuzzer already using several `msg.sender`s +contract Actors is StdUtils { + mapping(address => bool) private _isActor; + address[] private _actors; + address private _currentActor; + + /// @notice register an actor if it's not already registered + /// usually called with msg.sender as a parameter, to track the actors + /// already provided by the fuzzer + modifier withActor(address who) { + addActor(who); + _currentActor = who; + _; + } + + function addActor(address who) internal { + if (!_isActor[who]) { + _isActor[who] = true; + _actors.push(who); + } + } + + /// @notice get the currently configured actor, should equal msg.sender + function currentActor() internal view returns (address) { + return _currentActor; + } + + /// @notice get one of the actors by index, useful to get another random + /// actor than the one set as currentActor, to perform operations between them + function getActorByRawIndex(uint256 rawIndex) internal view returns (address) { + return _actors[bound(rawIndex, 0, _actors.length - 1)]; + } +} diff --git a/packages/contracts-bedrock/test/invariants/OptimismSuperchainERC20/helpers/CompatibleAssert.t.sol b/packages/contracts-bedrock/test/invariants/OptimismSuperchainERC20/helpers/CompatibleAssert.t.sol new file mode 100644 index 000000000000..4e69c94c8585 --- /dev/null +++ b/packages/contracts-bedrock/test/invariants/OptimismSuperchainERC20/helpers/CompatibleAssert.t.sol @@ -0,0 +1,28 @@ +// SPDX-License-Identifier: GPL-3 +pragma solidity ^0.8.24; + +import { console } from "forge-std/console.sol"; + +/// @title CompatibleAssert +/// @notice meant to add compatibility between medusa assertion tests and +/// foundry invariant test's required architecture +contract CompatibleAssert { + bool public failed; + + function compatibleAssert(bool condition) internal { + compatibleAssert(condition, ""); + } + + function compatibleAssert(bool condition, string memory message) internal { + if (!condition) { + if (bytes(message).length != 0) console.log("Assertion failed: ", message); + else console.log("Assertion failed"); + + // for foundry to call & check + failed = true; + + // for medusa + assert(false); + } + } +} diff --git a/packages/contracts-bedrock/test/invariants/OptimismSuperchainERC20/helpers/HandlerGetters.t.sol b/packages/contracts-bedrock/test/invariants/OptimismSuperchainERC20/helpers/HandlerGetters.t.sol new file mode 100644 index 000000000000..b081aa48c6bb --- /dev/null +++ b/packages/contracts-bedrock/test/invariants/OptimismSuperchainERC20/helpers/HandlerGetters.t.sol @@ -0,0 +1,22 @@ +// SPDX-License-Identifier: GPL-3 +pragma solidity ^0.8.24; + +import { ProtocolHandler } from "../handlers/Protocol.t.sol"; +import { EnumerableMap } from "@openzeppelin/contracts/utils/structs/EnumerableMap.sol"; + +contract HandlerGetters is ProtocolHandler { + using EnumerableMap for EnumerableMap.Bytes32ToUintMap; + + function deploySaltsLength() external view returns (uint256 length) { + return ghost_totalSupplyAcrossChains.length(); + } + + function totalSupplyAcrossChainsAtIndex(uint256 index) external view returns (bytes32 salt, uint256 supply) { + return ghost_totalSupplyAcrossChains.at(index); + } + + function tokensInTransitForDeploySalt(bytes32 salt) external view returns (uint256 amount) { + (, amount) = ghost_tokensInTransit.tryGet(salt); + return amount; + } +} diff --git a/packages/contracts-bedrock/test/invariants/OptimismSuperchainERC20/helpers/MockL2ToL2CrossDomainMessenger.t.sol b/packages/contracts-bedrock/test/invariants/OptimismSuperchainERC20/helpers/MockL2ToL2CrossDomainMessenger.t.sol new file mode 100644 index 000000000000..6eb1c30e6799 --- /dev/null +++ b/packages/contracts-bedrock/test/invariants/OptimismSuperchainERC20/helpers/MockL2ToL2CrossDomainMessenger.t.sol @@ -0,0 +1,118 @@ +// SPDX-License-Identifier: MIT +pragma solidity ^0.8.25; + +import { OptimismSuperchainERC20 } from "src/L2/OptimismSuperchainERC20.sol"; +import { SafeCall } from "src/libraries/SafeCall.sol"; + +contract MockL2ToL2CrossDomainMessenger { + //////////////////////// + // type definitions // + //////////////////////// + struct CrossChainMessage { + address crossDomainMessageSender; + address crossDomainMessageSource; + bytes payload; + address recipient; + uint256 amount; + } + + ///////////////////////////////////////////////////////// + // State vars mocking the L2toL2CrossDomainMessenger // + ///////////////////////////////////////////////////////// + address public crossDomainMessageSender; + address public crossDomainMessageSource; + + /////////////////////////////////////////////////// + // Helpers for cross-chain interaction mocking // + /////////////////////////////////////////////////// + mapping(address supertoken => bytes32 deploySalt) public superTokenInitDeploySalts; + mapping(uint256 chainId => mapping(bytes32 deploySalt => address supertoken)) public superTokenAddresses; + + CrossChainMessage[] private _messageQueue; + bool private _atomic; + + function messageQueue(uint256 rawIndex) external view returns (CrossChainMessage memory) { + return _messageQueue[rawIndex % _messageQueue.length]; + } + + function crossChainMessageReceiver( + address sender, + uint256 destinationChainId + ) + external + view + returns (OptimismSuperchainERC20) + { + return OptimismSuperchainERC20(superTokenAddresses[destinationChainId][superTokenInitDeploySalts[sender]]); + } + + function setCrossDomainMessageSender(address sender) external { + crossDomainMessageSender = sender; + } + + function registerSupertoken(bytes32 deploySalt, uint256 chainId, address token) external { + superTokenAddresses[chainId][deploySalt] = token; + superTokenInitDeploySalts[token] = deploySalt; + } + + function messageQueueLength() public view returns (uint256) { + return _messageQueue.length; + } + + function setAtomic(bool atomic) public { + _atomic = atomic; + } + + function relayMessageFromQueue(uint256 rawIndex) public { + uint256 index = rawIndex % _messageQueue.length; + CrossChainMessage memory message = _messageQueue[index]; + _messageQueue[index] = _messageQueue[_messageQueue.length - 1]; + _messageQueue.pop(); + _relayMessage(message); + } + + function _relayMessage(CrossChainMessage memory message) internal { + crossDomainMessageSender = message.crossDomainMessageSender; + crossDomainMessageSource = message.crossDomainMessageSource; + SafeCall.call(crossDomainMessageSender, 0, message.payload); + crossDomainMessageSender = address(0); + crossDomainMessageSource = address(0); + } + + //////////////////////////////////////////////////////// + // Functions mocking the L2toL2CrossDomainMessenger // + //////////////////////////////////////////////////////// + + /// @notice recipient will not be used since in normal execution it's the same + /// address on a different chain, but here we have to compute it to mock + /// cross-chain messaging + function sendMessage(uint256 chainId, address, /*recipient*/ bytes calldata data) external { + address crossChainRecipient = superTokenAddresses[chainId][superTokenInitDeploySalts[msg.sender]]; + if (crossChainRecipient == msg.sender) { + require(false, "same chain"); + } + (address recipient, uint256 amount) = _decodePayload(data); + + CrossChainMessage memory message = CrossChainMessage({ + crossDomainMessageSender: crossChainRecipient, + crossDomainMessageSource: msg.sender, + payload: data, + recipient: recipient, + amount: amount + }); + + if (_atomic) { + _relayMessage(message); + } else { + _messageQueue.push(message); + } + } + + //////////////////////// + // Internal helpers // + //////////////////////// + + function _decodePayload(bytes calldata payload) internal pure returns (address recipient, uint256 amount) { + (, recipient, amount) = abi.decode(payload[4:], (address, address, uint256)); + } +} diff --git a/packages/contracts-bedrock/test/invariants/OptimismSuperchainERC20/helpers/OptimismSuperchainERC20ForToBProperties.t.sol b/packages/contracts-bedrock/test/invariants/OptimismSuperchainERC20/helpers/OptimismSuperchainERC20ForToBProperties.t.sol new file mode 100644 index 000000000000..9f80cda92fcc --- /dev/null +++ b/packages/contracts-bedrock/test/invariants/OptimismSuperchainERC20/helpers/OptimismSuperchainERC20ForToBProperties.t.sol @@ -0,0 +1,12 @@ +// SPDX-License-Identifier: AGPL-3 +pragma solidity ^0.8.25; + +import { OptimismSuperchainERC20 } from "src/L2/OptimismSuperchainERC20.sol"; + +contract OptimismSuperchainERC20ForToBProperties is OptimismSuperchainERC20 { + /// @notice This is used by CryticERC20ExternalBasicProperties (only used + /// in Medusa testing campaign)to know which properties to test, and + /// remains here so Medusa and Foundry test campaigns can use a single + /// setup + bool public constant isMintableOrBurnable = true; +} diff --git a/packages/contracts-bedrock/test/invariants/ResourceMetering.t.sol b/packages/contracts-bedrock/test/invariants/ResourceMetering.t.sol index 39e54590efbb..4652f9b9e36e 100644 --- a/packages/contracts-bedrock/test/invariants/ResourceMetering.t.sol +++ b/packages/contracts-bedrock/test/invariants/ResourceMetering.t.sol @@ -8,6 +8,7 @@ import { StdInvariant } from "forge-std/StdInvariant.sol"; import { Arithmetic } from "src/libraries/Arithmetic.sol"; import { ResourceMetering } from "src/L1/ResourceMetering.sol"; +import { IResourceMetering } from "src/L1/interfaces/IResourceMetering.sol"; import { Constants } from "src/libraries/Constants.sol"; import { InvariantTest } from "test/invariants/InvariantTest.sol"; @@ -35,9 +36,11 @@ contract ResourceMetering_User is StdUtils, ResourceMetering { return _resourceConfig(); } - function _resourceConfig() internal pure override returns (ResourceMetering.ResourceConfig memory) { - ResourceMetering.ResourceConfig memory rcfg = Constants.DEFAULT_RESOURCE_CONFIG(); - return rcfg; + function _resourceConfig() internal pure override returns (ResourceMetering.ResourceConfig memory config_) { + IResourceMetering.ResourceConfig memory rcfg = Constants.DEFAULT_RESOURCE_CONFIG(); + assembly ("memory-safe") { + config_ := rcfg + } } /// @notice Takes the necessary parameters to allow us to burn arbitrary amounts of gas to test diff --git a/packages/contracts-bedrock/test/invariants/SuperchainWETH.t.sol b/packages/contracts-bedrock/test/invariants/SuperchainWETH.t.sol new file mode 100644 index 000000000000..1e761b7ea162 --- /dev/null +++ b/packages/contracts-bedrock/test/invariants/SuperchainWETH.t.sol @@ -0,0 +1,190 @@ +// SPDX-License-Identifier: MIT +pragma solidity 0.8.15; + +// Testing +import { StdUtils } from "forge-std/Test.sol"; +import { Vm } from "forge-std/Vm.sol"; +import { CommonTest } from "test/setup/CommonTest.sol"; + +// Libraries +import { Predeploys } from "src/libraries/Predeploys.sol"; + +// Interfaces +import { ISuperchainWETH } from "src/L2/interfaces/ISuperchainWETH.sol"; +import { IL2ToL2CrossDomainMessenger } from "src/L2/interfaces/IL2ToL2CrossDomainMessenger.sol"; + +/// @title SuperchainWETH_User +/// @notice Actor contract that interacts with the SuperchainWETH contract. +contract SuperchainWETH_User is StdUtils { + /// @notice Cross domain message data. + struct MessageData { + bytes32 id; + uint256 amount; + } + + /// @notice Flag to indicate if the test has failed. + bool public failed = false; + + /// @notice The Vm contract. + Vm internal vm; + + /// @notice The SuperchainWETH contract. + ISuperchainWETH internal weth; + + /// @notice Mapping of sent messages. + mapping(bytes32 => bool) internal sent; + + /// @notice Array of unrelayed messages. + MessageData[] internal unrelayed; + + /// @param _vm The Vm contract. + /// @param _weth The SuperchainWETH contract. + /// @param _balance The initial balance of the contract. + constructor(Vm _vm, ISuperchainWETH _weth, uint256 _balance) { + vm = _vm; + weth = _weth; + vm.deal(address(this), _balance); + } + + /// @notice Allow the contract to receive ETH. + receive() external payable { } + + /// @notice Deposit ETH into the contract. + /// @param _amount The amount of ETH to deposit. + function deposit(uint256 _amount) public { + // Bound deposit amount to our ETH balance. + _amount = bound(_amount, 0, address(this).balance); + + // Deposit the amount. + try weth.deposit{ value: _amount }() { + // Success. + } catch { + failed = true; + } + } + + /// @notice Withdraw ETH from the contract. + /// @param _amount The amount of ETH to withdraw. + function withdraw(uint256 _amount) public { + // Bound withdraw amount to our WETH balance. + _amount = bound(_amount, 0, weth.balanceOf(address(this))); + + // Withdraw the amount. + try weth.withdraw(_amount) { + // Success. + } catch { + failed = true; + } + } + + /// @notice Send ERC20 tokens to another chain. + /// @param _amount The amount of ERC20 tokens to send. + /// @param _chainId The chain ID to send the tokens to. + /// @param _messageId The message ID. + function sendERC20(uint256 _amount, uint256 _chainId, bytes32 _messageId) public { + // Make sure we aren't reusing a message ID. + if (sent[_messageId]) { + return; + } + + // Bound send amount to our WETH balance. + _amount = bound(_amount, 0, weth.balanceOf(address(this))); + + // Prevent receiving chain ID from being the same as the current chain ID. + _chainId = _chainId == block.chainid ? _chainId + 1 : _chainId; + + // Send the amount. + try weth.sendERC20(address(this), _amount, _chainId) { + // Success. + } catch { + failed = true; + } + + // Mark message as sent. + sent[_messageId] = true; + unrelayed.push(MessageData({ id: _messageId, amount: _amount })); + } + + /// @notice Relay a message from another chain. + function relayMessage(uint256 _source) public { + // Make sure there are unrelayed messages. + if (unrelayed.length == 0) { + return; + } + + // Grab the latest unrelayed message. + MessageData memory message = unrelayed[unrelayed.length - 1]; + + // Simulate the cross-domain message. + // Make sure the cross-domain message sender is set to this contract. + vm.mockCall( + Predeploys.L2_TO_L2_CROSS_DOMAIN_MESSENGER, + abi.encodeCall(IL2ToL2CrossDomainMessenger.crossDomainMessageSender, ()), + abi.encode(address(weth)) + ); + + // Simulate the cross-domain message source to any chain. + vm.mockCall( + Predeploys.L2_TO_L2_CROSS_DOMAIN_MESSENGER, + abi.encodeCall(IL2ToL2CrossDomainMessenger.crossDomainMessageSource, ()), + abi.encode(_source) + ); + + // Prank the relayERC20 function. + // Balance will just go back to our own account. + vm.prank(Predeploys.L2_TO_L2_CROSS_DOMAIN_MESSENGER); + try weth.relayERC20(address(this), address(this), message.amount) { + // Success. + } catch { + failed = true; + } + + // Remove the message from the unrelayed list. + unrelayed.pop(); + } +} + +/// @title SuperchainWETH_SendSucceeds_Invariant +/// @notice Invariant test that checks that sending WETH always succeeds if the actor has a +/// sufficient balance to do so and that the actor's balance does not increase out of +/// nowhere. +contract SuperchainWETH_SendSucceeds_Invariant is CommonTest { + /// @notice Starting balance of the contract. + uint256 internal constant STARTING_BALANCE = type(uint248).max; + + /// @notice The SuperchainWETH_User actor. + SuperchainWETH_User internal actor; + + /// @notice Test setup. + function setUp() public override { + super.enableInterop(); + super.setUp(); + + // Create a new SuperchainWETH_User actor. + actor = new SuperchainWETH_User(vm, superchainWeth, STARTING_BALANCE); + + // Set the target contract. + targetContract(address(actor)); + + // Set the target selectors. + bytes4[] memory selectors = new bytes4[](4); + selectors[0] = actor.deposit.selector; + selectors[1] = actor.withdraw.selector; + selectors[2] = actor.sendERC20.selector; + selectors[3] = actor.relayMessage.selector; + FuzzSelector memory selector = FuzzSelector({ addr: address(actor), selectors: selectors }); + targetSelector(selector); + } + + /// @notice Invariant that checks that sending WETH always succeeds. + /// @custom:invariant Calls to sendERC20 should always succeed as long as the actor has less + /// than uint248 wei which is much greater than the total ETH supply. Actor's + /// balance should also not increase out of nowhere. + function invariant_sendERC20_succeeds() public view { + // Assert that the actor has not failed to send WETH. + assertEq(actor.failed(), false); + + // Assert that the actor's balance has not somehow increased. + assertLe(address(actor).balance, STARTING_BALANCE); + } +} diff --git a/packages/contracts-bedrock/test/invariants/SystemConfig.t.sol b/packages/contracts-bedrock/test/invariants/SystemConfig.t.sol index 8419113917f4..1321499462b7 100644 --- a/packages/contracts-bedrock/test/invariants/SystemConfig.t.sol +++ b/packages/contracts-bedrock/test/invariants/SystemConfig.t.sol @@ -3,15 +3,16 @@ pragma solidity 0.8.15; import { Test } from "forge-std/Test.sol"; import { SystemConfig } from "src/L1/SystemConfig.sol"; +import { ISystemConfig } from "src/L1/interfaces/ISystemConfig.sol"; import { Proxy } from "src/universal/Proxy.sol"; import { Constants } from "src/libraries/Constants.sol"; contract SystemConfig_GasLimitBoundaries_Invariant is Test { - SystemConfig public config; + ISystemConfig public config; function setUp() external { Proxy proxy = new Proxy(msg.sender); - SystemConfig configImpl = new SystemConfig(); + ISystemConfig configImpl = ISystemConfig(address(new SystemConfig())); vm.prank(msg.sender); proxy.upgradeToAndCall( @@ -27,7 +28,7 @@ contract SystemConfig_GasLimitBoundaries_Invariant is Test { address(1), // unsafe block signer Constants.DEFAULT_RESOURCE_CONFIG(), address(0), // _batchInbox - SystemConfig.Addresses({ // _addrs + ISystemConfig.Addresses({ // _addrs l1CrossDomainMessenger: address(0), l1ERC721Bridge: address(0), l1StandardBridge: address(0), @@ -40,7 +41,7 @@ contract SystemConfig_GasLimitBoundaries_Invariant is Test { ) ); - config = SystemConfig(address(proxy)); + config = ISystemConfig(address(proxy)); // Set the target contract to the `config` targetContract(address(config)); diff --git a/packages/contracts-bedrock/test/kontrol/README.md b/packages/contracts-bedrock/test/kontrol/README.md index ccf8781fce0b..0a6dcec7c79b 100644 --- a/packages/contracts-bedrock/test/kontrol/README.md +++ b/packages/contracts-bedrock/test/kontrol/README.md @@ -36,8 +36,7 @@ The directory is structured as follows <pre> ├── <a href="./pausability-lemmas.md">pausability-lemmas.md</a>: File containing the necessary lemmas for this project ├── <a href="./deployment">deployment</a>: Custom deploy sequence for Kontrol proofs and tests for its <a href="https://github.com/runtimeverification/kontrol/pull/271">fast summarization</a> -│ ├── <a href="./deployment/KontrolDeployment.sol">KontrolDeployment.sol</a>: Simplified deployment sequence for Kontrol proofs -│ └── <a href="./deployment/DeploymentSummary.t.sol">DeploymentSummary.t.sol</a>: Tests for the summarization of custom deployment +│ ├── <a href="./deployment/KontrolDeployment.sol">KontrolDeployment.sol</a>: Deployment sequence for Kontrol proofs ├── <a href="./proofs">proofs</a>: Where the proofs (tests) themselves live │ ├── *.k.sol</a>: Symbolic property tests for contracts │ ├── <a href="./proofs/interfaces">interfaces</a>: Interface files for src contracts, to avoid unnecessary compilation of contracts @@ -51,8 +50,8 @@ The directory is structured as follows ### Installation 1. `cd` to the root of this repo. -2. Install Foundry by running `pnpm install:foundry`. This installs `foundryup`, the foundry toolchain installer, then installs the required foundry version. -3. Install Kontrol by running `pnpm install:kontrol`. This installs `kup`, the package manager for RV tools, then installs the required kontrol version. +2. Install Foundry by running `just install-foundry`. This installs `foundryup`, the foundry toolchain installer, then installs the required foundry version. +3. Install Kontrol by running `just install-kontrol`. This installs `kup`, the package manager for RV tools, then installs the required kontrol version. 4. Install Docker. ## Usage @@ -72,7 +71,7 @@ First, generate a deployment summary contract from the deploy script in [`Kontro 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. +[`KontrolDeployment.sol`](./deployment/KontrolDeployment.sol) contains the deployment sequence required by the proofs. The [`make-summary-deployment.sh`](./scripts/make-summary-deployment.sh) script will generate a JSON state diff. This state diff is used in two ways by Kontrol. First, Kontrol generates a summary contract recreating the state diffs recorded in the JSON. This contract is used to test that the information contained in the generated JSON is correct and aids in the specification of the symbolic property tests. The generation of this contract is also handled by the `make-summary-deployment.sh` script. Second, the state diff JSON is used to load the post-deployment state directly into Kontrol when running the proofs. @@ -111,12 +110,10 @@ These are the instructions to add a new proof to this project. If all functions #### Make Kontrol aware of the new contract being tested -The `runKontrolDeployment` function of [`KontrolDeployment`](./deployment/KontrolDeployment.sol) partially reproduces the deployment process laid out in the `_run` function of [`Deploy.s.sol`](../../scripts/Deploy.s.sol). `runKontrolDeployment` has the `stateDiff` modifier to make use of [Foundry's state diff cheatcodes](https://book.getfoundry.sh/cheatcodes/start-state-diff-recording). Kontrol utilizes the JSON resulting from this modifier for two purposes: +The `runKontrolDeployment` function of [`KontrolDeployment`](./deployment/KontrolDeployment.sol) reproduces the deployment process laid out in the `_run` function of [`Deploy.s.sol`](../../scripts/deploy/Deploy.s.sol). `runKontrolDeployment` has the `stateDiff` modifier to make use of [Foundry's state diff cheatcodes](https://book.getfoundry.sh/cheatcodes/start-state-diff-recording). Kontrol utilizes the JSON resulting from this modifier for two purposes: 1. Load all the state updates generated by `runKontrolDeployment` as the initial configuration for all proofs, effectively offloading the computation of the deployment process to `forge` and thus improving performance. 2. Produce the [`DeploymentSummary`](./proofs/utils/DeploymentSummary.sol) script contract to test that the produced JSON contains correct updates. -Hence, in order to write a proof for a contract which is not present in `KontrolDeployment` it must be added there first. To add a new contract, properly inspect the above-mentioned `_run` function and place the corresponding deployment steps of the contract appropriately within the `runKontrolDeployment` function. - Once new deployment steps have been added to `runKontrolDeployment` the state-diff files have to [be rebuilt](#build-deployment-summary). #### Include existing tests on the new state-diff recorded bytecode @@ -173,7 +170,7 @@ As described in [Execute Proofs](#execute-proofs), there's a `script` mode for s ### Deployment Summary Process As mentioned above, a deployment summary contract is first generated before executing the proofs. -This is because the proof execution leverages Kontrol's [fast summarization](https://github.com/runtimeverification/kontrol/pull/271) feature, which allows loading the post-`setUp` state directly into Kontrol. +This is because the proof execution leverages Kontrol's [fast summarization](https://github.com/runtimeverification/kontrol/tree/master/docs/external-computation) feature, which allows loading the post-`setUp` state directly into Kontrol. This provides a significant reduction in proof execution time, as it avoids the need to execute the deployment script every time the proofs are run. All code executed in Kontrol—even when execution is concrete and not symbolic—is significantly slower than in Foundry, due to the mathematical representation of the EVM in Kontrol. @@ -184,7 +181,7 @@ This project uses two different [`foundry.toml` profiles](../../foundry.toml), ` - `kdeploy`: Used by [`make-summary-deployment.sh`](./scripts/make-summary-deployment.sh) to generate the [`DeploymentSummary.sol`](./proofs/utils/DeploymentSummary.sol) contract based on execution of the [`KontrolDeployment.sol`](./deployment/KontrolDeployment.sol) contract using Foundry's state diff recording cheatcodes. This is where all necessary [`src/L1`](../../src/L1) files are compiled with their bytecode saved into the [`DeploymentSummaryCode.sol`](./proofs/utils/DeploymentSummaryCode.sol) file, which is inherited by `DeploymentSummary`. -- `kprove`: Used by the [`run-kontrol.sh`](./scrpts/run-kontrol.sh) script to execute proofs, which can be run once a `DeploymentSummary.sol` contract is present. This profile's `src` and `script` paths point to a test folder because we only want to compile what is in the `test/kontrol/proofs` folder, since that folder contains all bytecode and proofs. +- `kprove`: Used by the [`run-kontrol.sh`](./scripts/run-kontrol.sh) script to execute proofs, which can be run once a `DeploymentSummary.sol` contract is present. This profile's `src` and `script` paths point to a test folder because we only want to compile what is in the `test/kontrol/proofs` folder, since that folder contains all bytecode and proofs. The `make-summary-deployment.sh` scripts saves off the generated JSON state diff to `snapshots/state-diff/Kontrol-Deploy.json`, and is run as part of the `snapshots` script in `package.json`. Therefore, the snapshots CI check will fail if the committed Kontrol state diff is out of sync. @@ -192,6 +189,63 @@ Note that the CI check only compares the JSON state diff, not the generated `Dep This is for simplicity, as those three files will be in sync upon successful execution of the `make-summary-deployment.sh` script. We commit the `DeploymentSummary.sol` and `DeploymentSummaryCode.sol` contracts, because forge fails to build if those contracts are not present—it is simpler to commit these autogenerated files than to workaround their absence in forge builds. -During `make-summary-deployment.sh`, the `mustGetAddress` usage in `Deploy.s.sol` is temporarily replaced by `getAddress`—the former reverts if the deployed contract does not exist, while the latter returns the zero address. -This is required because the deploy script in `KontrolDeployment.sol` is does not fully reproduce all deployments in `Deploy.s.sol`, so the `mustGetAddress` usage would cause the script to revert since some contracts are not deployed. -`KontrolDeployment.sol` is a simplified, minimal deployment sequence for Kontrol proofs, and is not intended to be a full deployment sequence for the contracts in `contracts-bedrock`. +### Kontrol Proof Execution using KaaS (Kontrol as a Service) & CI Integration + +To execute compute intensive Symbolic Kontrol proofs in a CI pipeline, we leverage KaaS (Kontrol as a Service) & CircleCI. +On each execution a status is returned to the commit checks the execution was run from. The checks for a commit provides a "Details" link to the execution KCFG arrtifacts and kontrol proof summary results. See below for further infromation on how to fetch these artifacts from the summary using the Github API. + +A high level overview of the CI Setup is defined in CircleCI and configured within [.circleci/config.yml](../../../../.circleci/config.yml). The CirlceCI flow calls on the Github API to execute Kontrol test proofs utilzing the [test scripts](scripts/run-kontrol.sh) in this repo. CircleCI is configured with a Github fine-grained token provided by Runtime Verification to leverage better machines than available in CircleCI to run Kontrol proofs. The token needed is stored in the CircleCI project as a secret. + +The proofs can be run manually using the Github Fine-grained token and providing the appropriate parameters outlind in the below Github API call. +```bash + curl -X POST \ + -H "Accept: application/vnd.github+json" \ + -H "Authorization: Bearer $RV_COMPUTE_TOKEN" \ + https://api.github.com/repos/runtimeverification/optimism-ci/actions/workflows/optimism-ci.yaml/dispatches \ + -d '{ + "ref": "master", + "inputs": { + "branch_name": "<<pipeline.git.branch>>", + "extra_args": "script", + "statuses_sha": "<< pipeline.git.revision >>", + "org": "ethereum-optimism", + "repository": "optimism" + } + }' +``` +NOTE: Making this call manually and providng a sha will overrite an existing statuses sha commit. It will not remove the history from RV's end but will be removed from the commit checks table in a PR or in the commit statuses. + +Parameters to be replaced are: +- **RV_COMPUTE_TOKEN**: The token used to authenticate to the KaaS service. +- **pipeline.git.branch**: The branch on which to run the proof. +- **pipeline.git.revision**: The commit hash for the proof execution. +- **org**: The organization under which to run the proof. +- **repository**: The repository for the proof execution. + +Artifacts are produced after execution is finished and posted to the summary page. Two artifacts are expected: +- `kontrol_prove_report.xml` -- This is a Kontrol Generated JUnit XML Report containing results and performance data. +- `Kontrol Results Folder.zip` -- This contains artifacts produced by kontrol during execution that can be used for debugging. This is expected on pass or failure of a proof run. + +To Fetch the artifacts of the execution from KaaS, you can either manually navigate to the summary page using the 'Details' link. Or you can use the GitHub API to pull the artifacts. +Method 1: GitHub's `gh` CLI tool +- gh run download RUN_ID + +Method 2: [Github API](https://docs.github.com/en/rest/actions/artifacts?apiVersion=2022-11-28) +List the artifacts for a run: +- GET /repos/{owner}/{repo}/actions/runs/{run_id}/artifacts -- See [documentaiton](httpshttps://docs.github.com/en/rest/actions/artifacts?apiVersion=2022-11-28#list-workflow-run-artifacts) for more details +```bash +curl -L \ + -H "Accept: application/vnd.github+json" \ + -H "Authorization: Bearer <RV_COMPUTE_TOKEN>" \ + -H "X-GitHub-Api-Version: 2022-11-28" \ + https://api.github.com/repos/runtimeverification/optimism-ci/actions/runs/RUN_ID/artifacts +``` +Then Download the artifacts: +- GET /repos/{owner}/{repo}/actions/artifacts/{artifact_id} -- See [documentaiton](https://docs.github.com/en/rest/actions/artifacts?apiVersion=2022-11-28#download-an-artifact) for more details +```bash +curl -L \ + -H "Accept: application/vnd.github+json" \ + -H "Authorization: Bearer <RV_COMPUTE_TOKEN>" \ + -H "X-GitHub-Api-Version: 2022-11-28" \ + https://api.github.com/repos/runtimeverification/optimism-ci/actions/artifacts/ARTIFACT_ID/ARCHIVE_FORMAT +``` diff --git a/packages/contracts-bedrock/test/kontrol/deployment/DeploymentSummary.t.sol b/packages/contracts-bedrock/test/kontrol/deployment/DeploymentSummary.t.sol deleted file mode 100644 index c9c351e143e3..000000000000 --- a/packages/contracts-bedrock/test/kontrol/deployment/DeploymentSummary.t.sol +++ /dev/null @@ -1,254 +0,0 @@ -// 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 { L2OutputOracle } from "src/L1/L2OutputOracle.sol"; -import { SystemConfig } from "src/L1/SystemConfig.sol"; -import { SuperchainConfig } from "src/L1/SuperchainConfig.sol"; -import { OptimismPortal } from "src/L1/OptimismPortal.sol"; -import { L1CrossDomainMessenger } from "src/L1/L1CrossDomainMessenger.sol"; -import { DeploymentSummary } from "../proofs/utils/DeploymentSummary.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 { OptimismPortal_Test } from "test/L1/OptimismPortal.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 DeploymentSummary_TestOptimismPortal is DeploymentSummary, OptimismPortal_Test { - /// @notice super.setUp is not called on purpose - function setUp() public override { - // Recreate Deployment Summary state changes - DeploymentSummary deploymentSummary = new DeploymentSummary(); - deploymentSummary.recreateDeployment(); - - // Set summary addresses - optimismPortal = OptimismPortal(payable(optimismPortalProxyAddress)); - superchainConfig = SuperchainConfig(superchainConfigProxyAddress); - l2OutputOracle = L2OutputOracle(l2OutputOracleProxyAddress); - 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"))); - OptimismPortal opImpl = OptimismPortal(payable(optimismPortalAddress)); - assertEq(address(opImpl.l2Oracle()), 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(optimismPortal.l2Oracle()), address(l2OutputOracle)); - assertEq(address(optimismPortal.systemConfig()), address(systemConfig)); - assertEq(optimismPortal.guardian(), guardian); - assertEq(address(optimismPortal.superchainConfig()), address(superchainConfig)); - assertEq(optimismPortal.l2Sender(), Constants.DEFAULT_L2_SENDER); - assertEq(optimismPortal.paused(), false); - } - - /// @notice This test is overridden because `KontrolDeployment` doesn't initialize - /// the L2OutputOracle, which is needed in this test - function test_simple_isOutputFinalized_succeeds() external override { } - - /// @notice This test is overridden because `KontrolDeployment` doesn't initialize - /// the L2OutputOracle, which is needed in this test - function test_isOutputFinalized_succeeds() external override { } -} - -contract DeploymentSummary_TestL1CrossDomainMessenger is DeploymentSummary, L1CrossDomainMessenger_Test { - /// @notice super.setUp is not called on purpose - function setUp() public override { - // Recreate Deployment Summary state changes - DeploymentSummary deploymentSummary = new DeploymentSummary(); - deploymentSummary.recreateDeployment(); - - // Set summary addresses - optimismPortal = OptimismPortal(payable(optimismPortalProxyAddress)); - superchainConfig = SuperchainConfig(superchainConfigProxyAddress); - l2OutputOracle = L2OutputOracle(l2OutputOracleProxyAddress); - systemConfig = SystemConfig(systemConfigProxyAddress); - l1CrossDomainMessenger = L1CrossDomainMessenger(l1CrossDomainMessengerProxyAddress); - - // Set up utilized addresses - 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 { - // L1CrossDomainMessenger impl = L1CrossDomainMessenger(deploy.mustGetAddress("L1CrossDomainMessenger")); - L1CrossDomainMessenger impl = L1CrossDomainMessenger(l1CrossDomainMessengerAddress); - assertEq(address(impl.superchainConfig()), address(0)); - assertEq(address(impl.PORTAL()), address(0)); - assertEq(address(impl.portal()), address(0)); - assertEq(address(impl.OTHER_MESSENGER()), Predeploys.L2_CROSS_DOMAIN_MESSENGER); - assertEq(address(impl.otherMessenger()), Predeploys.L2_CROSS_DOMAIN_MESSENGER); - } - - /// @notice This test is overridden because `KontrolDeployment` doesn't deploy - /// L2CrossDomainMessenger, which is needed in this test - function test_relayMessage_v2_reverts() external override { } -} - -contract DeploymentSummary_TestL1ERC721Bridge is DeploymentSummary, L1ERC721Bridge_Test { - /// @notice super.setUp is not called on purpose - function setUp() public override { - // Recreate Deployment Summary state changes - DeploymentSummary deploymentSummary = new DeploymentSummary(); - deploymentSummary.recreateDeployment(); - - // Set summary addresses - optimismPortal = OptimismPortal(payable(optimismPortalProxyAddress)); - superchainConfig = SuperchainConfig(superchainConfigProxyAddress); - l2OutputOracle = L2OutputOracle(l2OutputOracleProxyAddress); - systemConfig = SystemConfig(systemConfigProxyAddress); - l1CrossDomainMessenger = L1CrossDomainMessenger(l1CrossDomainMessengerProxyAddress); - l1ERC721Bridge = L1ERC721Bridge(l1ERC721BridgeProxyAddress); - - // Set up utilized addresses - alice = makeAddr("alice"); - bob = makeAddr("bob"); - vm.deal(alice, 10000 ether); - vm.deal(bob, 10000 ether); - - // Bridge_Initializer setUp - L1Token = new ERC20("Native L1 Token", "L1T"); - - LegacyL2Token = new LegacyMintableERC20({ - _l2Bridge: address(l2StandardBridge), - _l1Token: address(L1Token), - _name: string.concat("LegacyL2-", L1Token.name()), - _symbol: string.concat("LegacyL2-", L1Token.symbol()) - }); - vm.label(address(LegacyL2Token), "LegacyMintableERC20"); - - // Deploy the L2 ERC20 now - // L2Token = OptimismMintableERC20( - // l2OptimismMintableERC20Factory.createStandardL2Token( - // address(L1Token), - // string(abi.encodePacked("L2-", L1Token.name())), - // string(abi.encodePacked("L2-", L1Token.symbol())) - // ) - // ); - - // BadL2Token = OptimismMintableERC20( - // l2OptimismMintableERC20Factory.createStandardL2Token( - // address(1), - // string(abi.encodePacked("L2-", L1Token.name())), - // string(abi.encodePacked("L2-", L1Token.symbol())) - // ) - // ); - - NativeL2Token = new ERC20("Native L2 Token", "L2T"); - - // RemoteL1Token = OptimismMintableERC20( - // l1OptimismMintableERC20Factory.createStandardL2Token( - // address(NativeL2Token), - // string(abi.encodePacked("L1-", NativeL2Token.name())), - // string(abi.encodePacked("L1-", NativeL2Token.symbol())) - // ) - // ); - - // BadL1Token = OptimismMintableERC20( - // l1OptimismMintableERC20Factory.createStandardL2Token( - // address(1), - // string(abi.encodePacked("L1-", NativeL2Token.name())), - // string(abi.encodePacked("L1-", NativeL2Token.symbol())) - // ) - // ); - - // L1ERC721Bridge_Test setUp - localToken = new TestERC721(); - remoteToken = new TestERC721(); - - // Mint alice a token. - localToken.mint(alice, tokenId); - - // Approve the bridge to transfer the token. - vm.prank(alice); - localToken.approve(address(l1ERC721Bridge), tokenId); - } - - /// @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 view override { - // L1ERC721Bridge impl = L1ERC721Bridge(deploy.mustGetAddress("L1ERC721Bridge")); - L1ERC721Bridge impl = L1ERC721Bridge(l1ERC721BridgeAddress); - assertEq(address(impl.MESSENGER()), address(0)); - assertEq(address(impl.messenger()), address(0)); - assertEq(address(impl.OTHER_BRIDGE()), Predeploys.L2_ERC721_BRIDGE); - assertEq(address(impl.otherBridge()), Predeploys.L2_ERC721_BRIDGE); - assertEq(address(impl.superchainConfig()), address(0)); - } -} - -contract DeploymentSummary_TestL1StandardBridge is - DeploymentSummary, - L1StandardBridge_Getter_Test, - L1StandardBridge_Initialize_Test, - L1StandardBridge_Pause_Test -{ - /// @notice super.setUp is not called on purpose - function setUp() public override { - // Recreate Deployment Summary state changes - DeploymentSummary deploymentSummary = new DeploymentSummary(); - deploymentSummary.recreateDeployment(); - - // Set summary addresses - optimismPortal = OptimismPortal(payable(optimismPortalProxyAddress)); - superchainConfig = SuperchainConfig(superchainConfigProxyAddress); - l2OutputOracle = L2OutputOracle(l2OutputOracleProxyAddress); - systemConfig = SystemConfig(systemConfigProxyAddress); - l1CrossDomainMessenger = L1CrossDomainMessenger(l1CrossDomainMessengerProxyAddress); - l1ERC721Bridge = L1ERC721Bridge(l1ERC721BridgeProxyAddress); - l1StandardBridge = L1StandardBridge(payable(l1StandardBridgeProxyAddress)); - } - - /// @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 { - // L1StandardBridge impl = L1StandardBridge(deploy.mustGetAddress("L1StandardBridge")); - L1StandardBridge impl = L1StandardBridge(payable(l1StandardBridgeAddress)); - assertEq(address(impl.superchainConfig()), address(0)); - assertEq(address(impl.MESSENGER()), address(0)); - assertEq(address(impl.messenger()), address(0)); - assertEq(address(impl.OTHER_BRIDGE()), Predeploys.L2_STANDARD_BRIDGE); - assertEq(address(impl.otherBridge()), Predeploys.L2_STANDARD_BRIDGE); - assertEq(address(l2StandardBridge), Predeploys.L2_STANDARD_BRIDGE); - } -} diff --git a/packages/contracts-bedrock/test/kontrol/deployment/DeploymentSummaryFaultProofs.t.sol b/packages/contracts-bedrock/test/kontrol/deployment/DeploymentSummaryFaultProofs.t.sol deleted file mode 100644 index 2f96f3145119..000000000000 --- a/packages/contracts-bedrock/test/kontrol/deployment/DeploymentSummaryFaultProofs.t.sol +++ /dev/null @@ -1,77 +0,0 @@ -// 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 4b8ef355727c..7853b0a4d3dd 100644 --- a/packages/contracts-bedrock/test/kontrol/deployment/KontrolDeployment.sol +++ b/packages/contracts-bedrock/test/kontrol/deployment/KontrolDeployment.sol @@ -1,77 +1,15 @@ // SPDX-License-Identifier: MIT pragma solidity ^0.8.0; -import { Deploy } from "scripts/Deploy.s.sol"; +import { Deploy } from "scripts/deploy/Deploy.s.sol"; contract KontrolDeployment is Deploy { - function runKontrolDeployment() public stateDiff { - deploySafe("SystemOwnerSafe"); - setupSuperchain(); - - // deployProxies(); - deployERC1967Proxy("OptimismPortalProxy"); - deployERC1967Proxy("L2OutputOracleProxy"); - deployERC1967Proxy("SystemConfigProxy"); - deployL1StandardBridgeProxy(); - deployL1CrossDomainMessengerProxy(); - deployERC1967Proxy("L1ERC721BridgeProxy"); - transferAddressManagerOwnership(); // to the ProxyAdmin - - // deployImplementations(); - deployOptimismPortal(); - deployL1CrossDomainMessenger(); - deployL2OutputOracle(); - deploySystemConfig(); - deployL1StandardBridge(); - deployL1ERC721Bridge(); - - // initializeImplementations(); - initializeSystemConfig(); - initializeL1StandardBridge(); - initializeL1ERC721Bridge(); - initializeL1CrossDomainMessenger(); - initializeOptimismPortal(); + function runKontrolDeployment() public { + runWithStateDiff(); } - 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 }); + function runKontrolDeploymentFaultProofs() public { + cfg.setUseFaultProofs(true); + runWithStateDiff(); } } diff --git a/packages/contracts-bedrock/test/kontrol/pausability-lemmas.md b/packages/contracts-bedrock/test/kontrol/pausability-lemmas.md index a522a5709e61..890c6cb95772 100644 --- a/packages/contracts-bedrock/test/kontrol/pausability-lemmas.md +++ b/packages/contracts-bedrock/test/kontrol/pausability-lemmas.md @@ -22,7 +22,7 @@ module PAUSABILITY-LEMMAS ## Arithmetic -Lemmas on arithmetic reasoning. Specifically, on: cancellativity, inequalites in which the two sides are of different signs; and the rounding-up mechanism of the Solidity compiler (expressed through `notMaxUInt5 &Int ( X +Int 31 )`, which rounds up `X` to the nearest multiple of 32). +Lemmas on arithmetic reasoning. Specifically, on: cancellativity, inequalities in which the two sides are of different signs; and the rounding-up mechanism of the Solidity compiler (expressed through `notMaxUInt5 &Int ( X +Int 31 )`, which rounds up `X` to the nearest multiple of 32). ```k // Cancellativity #1 @@ -202,17 +202,17 @@ The summary lemma is as follows, with commentary inlined: // Various well-formedness constraints. In particular, the maxBytesLength-related ones are present to // remove various chops that would otherwise creep into the execution, and are reasonable since byte // arrays in actual programs would never reach that size. - andBool 0 <=Int PCOUNT - andBool 0 <=Int LENGTH andBool LENGTH <Int maxBytesLength - andBool 0 <=Int SRC andBool SRC <Int maxBytesLength - andBool 0 <=Int DEST andBool DEST <Int maxBytesLength - andBool #sizeWordStack(WS) <=Int 1015 - - andBool SRC +Int LENGTH <=Int DEST // No overlap between source and destination - andBool DEST <=Int lengthBytes(LM) // Destination starts within current memory + andThenBool 0 <=Int PCOUNT + andThenBool 0 <=Int LENGTH andThenBool LENGTH <Int maxBytesLength + andThenBool 0 <=Int SRC andThenBool SRC <Int maxBytesLength + andThenBool 0 <=Int DEST andThenBool DEST <Int maxBytesLength + andThenBool #sizeWordStack(WS) <=Int 1015 + andThenBool SRC +Int LENGTH <=Int DEST // No overlap between source and destination + andThenBool DEST <=Int lengthBytes(LM) // Destination starts within current memory + andThenBool PCOUNT +Int 51 <Int lengthBytes(JUMPDESTS) // We're not look outside of the JUMPDESTs bytearray // All JUMPDESTs in the program are valid - andBool (PCOUNT +Int 2) in JUMPDESTS andBool (PCOUNT +Int 32) in JUMPDESTS andBool (PCOUNT +Int 51) in JUMPDESTS - andBool PCOUNT +Int 51 <Int 2 ^Int 16 // and fit into two bytes + andThenBool JUMPDESTS[PCOUNT +Int 2] ==Int 1 andThenBool JUMPDESTS[PCOUNT +Int 32] ==Int 1 andThenBool JUMPDESTS[PCOUNT +Int 51] ==Int 1 + andThenBool PCOUNT +Int 51 <Int 2 ^Int 16 // and fit into two bytes [priority(30), concrete(JUMPDESTS, PROGRAM, PCOUNT), preserves-definedness] endmodule diff --git a/packages/contracts-bedrock/test/kontrol/proofs/OptimismPortal.k.sol b/packages/contracts-bedrock/test/kontrol/proofs/OptimismPortal.k.sol index 10a6d1045745..969c69349ae4 100644 --- a/packages/contracts-bedrock/test/kontrol/proofs/OptimismPortal.k.sol +++ b/packages/contracts-bedrock/test/kontrol/proofs/OptimismPortal.k.sol @@ -28,10 +28,7 @@ contract OptimismPortalKontrol is DeploymentSummary, KontrolUtils { 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)); + vm.expectRevert(CallPaused.selector); optimismPortal.finalizeWithdrawalTransaction(_tx); } @@ -52,10 +49,7 @@ contract OptimismPortalKontrol is DeploymentSummary, KontrolUtils { 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)); + vm.expectRevert(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 index e32f6771342a..18a1b579417a 100644 --- a/packages/contracts-bedrock/test/kontrol/proofs/OptimismPortal2.k.sol +++ b/packages/contracts-bedrock/test/kontrol/proofs/OptimismPortal2.k.sol @@ -28,10 +28,7 @@ contract OptimismPortal2Kontrol is DeploymentSummaryFaultProofs, KontrolUtils { 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)); + vm.expectRevert(CallPaused.selector); optimismPortal.finalizeWithdrawalTransaction(_tx); } @@ -52,10 +49,7 @@ contract OptimismPortal2Kontrol is DeploymentSummaryFaultProofs, KontrolUtils { 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)); + vm.expectRevert(CallPaused.selector); optimismPortal.proveWithdrawalTransaction(_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 a3d3c7dda2d0..2fa5057acbd7 100644 --- a/packages/contracts-bedrock/test/kontrol/proofs/utils/DeploymentSummary.sol +++ b/packages/contracts-bedrock/test/kontrol/proofs/utils/DeploymentSummary.sol @@ -12,27 +12,41 @@ contract DeploymentSummary is DeploymentSummaryCode { 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 l1CrossDomainMessengerAddress = 0xf3E6CBcbF1AE12Fc13Bc8B14FA8A67CbE147fD99; - address internal constant l1CrossDomainMessengerProxyAddress = 0x20A42a5a785622c6Ba2576B2D6e924aA82BFA11D; - address internal constant l1ERC721BridgeAddress = 0x44637A4292E0CD2B17A55d5F6B2F05AFcAcD0586; - address internal constant l1ERC721BridgeProxyAddress = 0xDeF3bca8c80064589E6787477FFa7Dd616B5574F; - address internal constant l1StandardBridgeAddress = 0x04c50B398Cd4182428E79f7186b7C919cF17e86F; - address internal constant l1StandardBridgeProxyAddress = 0x0c8b5822b6e02CDa722174F19A1439A7495a3fA6; - address internal constant l2OutputOracleAddress = 0x19652082F846171168Daf378C4fD3ee85a0D4A60; - address internal constant l2OutputOracleProxyAddress = 0x8B71b41D4dBEb2b6821d44692d3fACAAf77480Bb; - address internal constant optimismPortalAddress = 0xFc9AD479AC641888D36EE5Dc265bcD3ecceBDc58; - address internal constant optimismPortalProxyAddress = 0x978e3286EB805934215a88694d80b09aDed68D90; - 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 = 0x1182f45ae539e18534cbCC222c1C3D972B5Ba24D; - address internal constant systemConfigProxyAddress = 0x1c23A6d89F95ef3148BCDA8E242cAb145bf9c0E4; - address internal constant systemOwnerSafeAddress = 0x7d039be7F9b5190147621b02e82B250e1D748e02; + address internal constant addressManagerAddress = 0x50EEf481cae4250d252Ae577A09bF514f224C6C4; + address internal constant anchorStateRegistryAddress = 0xdEC4D949Cf1A2e824eE4F8B12064e166b96171dD; + address internal constant anchorStateRegistryProxyAddress = 0x970670459734a83899773A0fd45941B5afC1200e; + address internal constant delayedWETHAddress = 0xe49cED258137CC5E18fB9ABA2Aa14069263D8f49; + address internal constant delayedWETHProxyAddress = 0xEF179756ea6525AFade217cA5aB0b1b5CfE0fd92; + address internal constant disputeGameFactoryAddress = 0x8efDa795511CBBdfFC9eeca1a5bF30f5B1E1ef9E; + address internal constant disputeGameFactoryProxyAddress = 0x5207CfA0166E8de0FCdFd78B4d17b68587bE306d; + address internal constant l1CrossDomainMessengerAddress = 0x357B6CdA94109749a0dA475ac1BFd395a61eb908; + address internal constant l1CrossDomainMessengerProxyAddress = 0xDeF3bca8c80064589E6787477FFa7Dd616B5574F; + address internal constant l1ERC721BridgeAddress = 0xA4BD7E58A30ED0477fe7372883d09bF86619Bb66; + address internal constant l1ERC721BridgeProxyAddress = 0xD31598c909d9C935a9e35bA70d9a3DD47d4D5865; + address internal constant l1StandardBridgeAddress = 0x6cb2c88ABCd6391F9496f44BE27d5D3b247E0159; + address internal constant l1StandardBridgeProxyAddress = 0x20A42a5a785622c6Ba2576B2D6e924aA82BFA11D; + address internal constant l2OutputOracleAddress = 0x60d37db59d0D14f7EA5c7425A2C03244E08B162D; + address internal constant l2OutputOracleProxyAddress = 0x39Af23E00F1e662025aA01b0cEdA19542B78DF99; + address internal constant mipsAddress = 0x180CBe2EBb9F37D3a3C542DDc2546Fd160555a73; + address internal constant optimismMintableERC20FactoryAddress = 0x79c3114E5f89266e2C8842871Bce16D4e5076b1e; + address internal constant optimismMintableERC20FactoryProxyAddress = 0xc7B87b2b892EA5C3CfF47168881FE168C00377FB; + address internal constant optimismPortalAddress = 0xb5A42f01EF5068F82C11fa1c4F9bBD4c8D346961; + address internal constant optimismPortal2Address = 0x150581358018524994Fc29800b1783637943b103; + address internal constant optimismPortalProxyAddress = 0x1c23A6d89F95ef3148BCDA8E242cAb145bf9c0E4; + address internal constant permissionedDelayedWETHProxyAddress = 0xd6EAF4c146261653EE059077B78ED088Add54309; + address internal constant preimageOracleAddress = 0x7A9Eab4CE99d157AeE7A02E95b366E972a2D5b0b; + address internal constant protocolVersionsAddress = 0xa99F1ab91821747b76Ec0cDFA38368DF4Ba06E84; + address internal constant protocolVersionsProxyAddress = 0x4C52a6277b1B84121b3072C0c92b6Be0b7CC10F1; + address internal constant proxyAdminAddress = 0x62c20Aa1e0272312BC100b4e23B4DC1Ed96dD7D1; + address internal constant safeProxyFactoryAddress = 0xA8452Ec99ce0C64f20701dB7dD3abDb607c00496; + address internal constant safeSingletonAddress = 0xBb2180ebd78ce97360503434eD37fcf4a1Df61c3; + address internal constant superchainConfigAddress = 0xDAf629c26abd7a84B6330c369887053B75dB2AF2; + address internal constant superchainConfigProxyAddress = 0x4f559F30f5eB88D635FDe1548C4267DB8FaB0351; + address internal constant systemConfigAddress = 0xd9CEcA938f039e427Edf626FA1f377d23A6b60c9; + address internal constant systemConfigProxyAddress = 0x0c8b5822b6e02CDa722174F19A1439A7495a3fA6; + address internal constant systemOwnerSafeAddress = 0x7C0c8a15773ED7B50E7c738D1aF4c5e3a2b210BD; + address internal constant acc33Address = 0xb6b1579AA54e2F61e621a40d5F2704D717B3544F; + address internal constant acc34Address = 0x59B99034FBdd5E554661a2100cB2b6b7C5d495F8; function recreateDeployment() public { bytes32 slot; @@ -44,7 +58,7 @@ contract DeploymentSummary is DeploymentSummaryCode { vm.store(safeSingletonAddress, slot, value); vm.etch(systemOwnerSafeAddress, systemOwnerSafeCode); slot = hex"0000000000000000000000000000000000000000000000000000000000000000"; - value = hex"00000000000000000000000090193c961a926261b756d1e5bb255e67ff9498a1"; + value = hex"000000000000000000000000bb2180ebd78ce97360503434ed37fcf4a1df61c3"; vm.store(systemOwnerSafeAddress, slot, value); slot = hex"e90b7bceb6e7df5418fb78d8ee546e97c83a08bbccc01a0644d599ccd2a7c2e0"; value = hex"0000000000000000000000001804c8ab1f12e6bbf3894d4083f33e07309d1f38"; @@ -70,14 +84,14 @@ contract DeploymentSummary is DeploymentSummaryCode { value = hex"0000000000000000000000001804c8ab1f12e6bbf3894d4083f33e07309d1f38"; vm.store(proxyAdminAddress, slot, value); slot = hex"0000000000000000000000000000000000000000000000000000000000000003"; - value = hex"000000000000000000000000bb2180ebd78ce97360503434ed37fcf4a1df61c3"; + value = hex"00000000000000000000000050eef481cae4250d252ae577a09bf514f224c6c4"; vm.store(proxyAdminAddress, slot, value); slot = hex"0000000000000000000000000000000000000000000000000000000000000000"; - value = hex"0000000000000000000000007d039be7f9b5190147621b02e82b250e1d748e02"; + value = hex"0000000000000000000000007c0c8a15773ed7b50e7c738d1af4c5e3a2b210bd"; vm.store(proxyAdminAddress, slot, value); vm.etch(superchainConfigProxyAddress, superchainConfigProxyCode); slot = hex"b53127684a568b3173ae13b9f8a6016e243e63b6e8ee1178d6a717850b5d6103"; - value = hex"000000000000000000000000db8cff278adccf9e9b5da745b44e754fc4ee3c76"; + value = hex"00000000000000000000000062c20aa1e0272312bc100b4e23b4dc1ed96dd7d1"; vm.store(superchainConfigProxyAddress, slot, value); vm.etch(superchainConfigAddress, superchainConfigCode); slot = hex"0000000000000000000000000000000000000000000000000000000000000000"; @@ -93,7 +107,7 @@ contract DeploymentSummary is DeploymentSummaryCode { value = hex"0000000000000000000000000000000000000000000000000000000000000001"; vm.store(systemOwnerSafeAddress, slot, value); slot = hex"360894a13ba1a3210667c828492db98dca3e2076cc3735a920a3ca505d382bbc"; - value = hex"000000000000000000000000068e44eb31e111028c41598e4535be7468674d0a"; + value = hex"000000000000000000000000daf629c26abd7a84b6330c369887053b75db2af2"; vm.store(superchainConfigProxyAddress, slot, value); slot = hex"0000000000000000000000000000000000000000000000000000000000000000"; value = hex"0000000000000000000000000000000000000000000000000000000000000001"; @@ -109,7 +123,7 @@ contract DeploymentSummary is DeploymentSummaryCode { vm.store(superchainConfigProxyAddress, slot, value); vm.etch(protocolVersionsProxyAddress, protocolVersionsProxyCode); slot = hex"b53127684a568b3173ae13b9f8a6016e243e63b6e8ee1178d6a717850b5d6103"; - value = hex"000000000000000000000000db8cff278adccf9e9b5da745b44e754fc4ee3c76"; + value = hex"00000000000000000000000062c20aa1e0272312bc100b4e23b4dc1ed96dd7d1"; vm.store(protocolVersionsProxyAddress, slot, value); vm.etch(protocolVersionsAddress, protocolVersionsCode); slot = hex"0000000000000000000000000000000000000000000000000000000000000000"; @@ -131,7 +145,7 @@ contract DeploymentSummary is DeploymentSummaryCode { value = hex"0000000000000000000000000000000000000000000000000000000000000002"; vm.store(systemOwnerSafeAddress, slot, value); slot = hex"360894a13ba1a3210667c828492db98dca3e2076cc3735a920a3ca505d382bbc"; - value = hex"000000000000000000000000fbfd64a6c0257f613fefce050aa30ecc3e3d7c3f"; + value = hex"000000000000000000000000a99f1ab91821747b76ec0cdfa38368df4ba06e84"; vm.store(protocolVersionsProxyAddress, slot, value); slot = hex"0000000000000000000000000000000000000000000000000000000000000000"; value = hex"0000000000000000000000000000000000000000000000000000000000000001"; @@ -140,7 +154,7 @@ contract DeploymentSummary is DeploymentSummaryCode { value = hex"0000000000000000000000000000000000000000000000000000000000000101"; vm.store(protocolVersionsProxyAddress, slot, value); slot = hex"0000000000000000000000000000000000000000000000000000000000000033"; - value = hex"000000000000000000000000db8cff278adccf9e9b5da745b44e754fc4ee3c76"; + value = hex"00000000000000000000000062c20aa1e0272312bc100b4e23b4dc1ed96dd7d1"; vm.store(protocolVersionsProxyAddress, slot, value); slot = hex"0000000000000000000000000000000000000000000000000000000000000033"; value = hex"0000000000000000000000009965507d1a55bcc2695c58ba16fb37d819b0a4dc"; @@ -150,50 +164,54 @@ contract DeploymentSummary is DeploymentSummaryCode { vm.store(protocolVersionsProxyAddress, slot, value); vm.etch(optimismPortalProxyAddress, optimismPortalProxyCode); slot = hex"b53127684a568b3173ae13b9f8a6016e243e63b6e8ee1178d6a717850b5d6103"; - value = hex"000000000000000000000000db8cff278adccf9e9b5da745b44e754fc4ee3c76"; + value = hex"00000000000000000000000062c20aa1e0272312bc100b4e23b4dc1ed96dd7d1"; vm.store(optimismPortalProxyAddress, slot, value); - vm.etch(l2OutputOracleProxyAddress, l2OutputOracleProxyCode); - slot = hex"b53127684a568b3173ae13b9f8a6016e243e63b6e8ee1178d6a717850b5d6103"; - value = hex"000000000000000000000000db8cff278adccf9e9b5da745b44e754fc4ee3c76"; - vm.store(l2OutputOracleProxyAddress, slot, value); vm.etch(systemConfigProxyAddress, systemConfigProxyCode); slot = hex"b53127684a568b3173ae13b9f8a6016e243e63b6e8ee1178d6a717850b5d6103"; - value = hex"000000000000000000000000db8cff278adccf9e9b5da745b44e754fc4ee3c76"; + value = hex"00000000000000000000000062c20aa1e0272312bc100b4e23b4dc1ed96dd7d1"; vm.store(systemConfigProxyAddress, slot, value); vm.etch(l1StandardBridgeProxyAddress, l1StandardBridgeProxyCode); slot = hex"b53127684a568b3173ae13b9f8a6016e243e63b6e8ee1178d6a717850b5d6103"; - value = hex"000000000000000000000000db8cff278adccf9e9b5da745b44e754fc4ee3c76"; + value = hex"00000000000000000000000062c20aa1e0272312bc100b4e23b4dc1ed96dd7d1"; vm.store(l1StandardBridgeProxyAddress, slot, value); vm.etch(l1CrossDomainMessengerProxyAddress, l1CrossDomainMessengerProxyCode); - slot = hex"540cf4e2f45b866b44f44bde51e109474016dc46a0670fbe1684ad8eaf90fdc3"; - value = hex"000000000000000000000000bb2180ebd78ce97360503434ed37fcf4a1df61c3"; + slot = hex"191cda7b5a8219e0cc3bb6c2b45be830e3ba520f78e119446a476c4147fcc284"; + value = hex"00000000000000000000000050eef481cae4250d252ae577a09bf514f224c6c4"; vm.store(l1CrossDomainMessengerProxyAddress, slot, value); - slot = hex"4505be7acf20898edfef2b5289635349881ad9bf4b57316a74e81e2abec2be52"; + slot = hex"6822ddba83a78589c753bb747cf4919773ec1d36eeb0bb2a09d64b6d87adda0b"; value = hex"4f564d5f4c3143726f7373446f6d61696e4d657373656e676572000000000034"; vm.store(l1CrossDomainMessengerProxyAddress, slot, value); + vm.etch(optimismMintableERC20FactoryProxyAddress, optimismMintableERC20FactoryProxyCode); + slot = hex"b53127684a568b3173ae13b9f8a6016e243e63b6e8ee1178d6a717850b5d6103"; + value = hex"00000000000000000000000062c20aa1e0272312bc100b4e23b4dc1ed96dd7d1"; + vm.store(optimismMintableERC20FactoryProxyAddress, slot, value); vm.etch(l1ERC721BridgeProxyAddress, l1ERC721BridgeProxyCode); slot = hex"b53127684a568b3173ae13b9f8a6016e243e63b6e8ee1178d6a717850b5d6103"; - value = hex"000000000000000000000000db8cff278adccf9e9b5da745b44e754fc4ee3c76"; + value = hex"00000000000000000000000062c20aa1e0272312bc100b4e23b4dc1ed96dd7d1"; vm.store(l1ERC721BridgeProxyAddress, slot, value); + vm.etch(disputeGameFactoryProxyAddress, disputeGameFactoryProxyCode); + slot = hex"b53127684a568b3173ae13b9f8a6016e243e63b6e8ee1178d6a717850b5d6103"; + value = hex"00000000000000000000000062c20aa1e0272312bc100b4e23b4dc1ed96dd7d1"; + vm.store(disputeGameFactoryProxyAddress, slot, value); + vm.etch(l2OutputOracleProxyAddress, l2OutputOracleProxyCode); + slot = hex"b53127684a568b3173ae13b9f8a6016e243e63b6e8ee1178d6a717850b5d6103"; + value = hex"00000000000000000000000062c20aa1e0272312bc100b4e23b4dc1ed96dd7d1"; + vm.store(l2OutputOracleProxyAddress, slot, value); + vm.etch(delayedWETHProxyAddress, delayedWETHProxyCode); + slot = hex"b53127684a568b3173ae13b9f8a6016e243e63b6e8ee1178d6a717850b5d6103"; + value = hex"00000000000000000000000062c20aa1e0272312bc100b4e23b4dc1ed96dd7d1"; + vm.store(delayedWETHProxyAddress, slot, value); + vm.etch(permissionedDelayedWETHProxyAddress, permissionedDelayedWETHProxyCode); + slot = hex"b53127684a568b3173ae13b9f8a6016e243e63b6e8ee1178d6a717850b5d6103"; + value = hex"00000000000000000000000062c20aa1e0272312bc100b4e23b4dc1ed96dd7d1"; + vm.store(permissionedDelayedWETHProxyAddress, slot, value); + vm.etch(anchorStateRegistryProxyAddress, anchorStateRegistryProxyCode); + slot = hex"b53127684a568b3173ae13b9f8a6016e243e63b6e8ee1178d6a717850b5d6103"; + value = hex"00000000000000000000000062c20aa1e0272312bc100b4e23b4dc1ed96dd7d1"; + vm.store(anchorStateRegistryProxyAddress, slot, value); slot = hex"0000000000000000000000000000000000000000000000000000000000000000"; - value = hex"000000000000000000000000db8cff278adccf9e9b5da745b44e754fc4ee3c76"; + value = hex"00000000000000000000000062c20aa1e0272312bc100b4e23b4dc1ed96dd7d1"; vm.store(addressManagerAddress, slot, value); - vm.etch(optimismPortalAddress, optimismPortalCode); - slot = hex"0000000000000000000000000000000000000000000000000000000000000000"; - value = hex"0000000000000000000000000000000000000000000000000000000000000001"; - vm.store(optimismPortalAddress, slot, value); - slot = hex"0000000000000000000000000000000000000000000000000000000000000000"; - value = hex"0000000000000000000000000000000000000000000000000000000000000101"; - vm.store(optimismPortalAddress, slot, value); - slot = hex"0000000000000000000000000000000000000000000000000000000000000032"; - value = hex"000000000000000000000000000000000000000000000000000000000000dead"; - vm.store(optimismPortalAddress, slot, value); - slot = hex"0000000000000000000000000000000000000000000000000000000000000001"; - value = hex"000000000000000100000000000000000000000000000000000000003b9aca00"; - vm.store(optimismPortalAddress, slot, value); - slot = hex"0000000000000000000000000000000000000000000000000000000000000000"; - value = hex"0000000000000000000000000000000000000000000000000000000000000001"; - vm.store(optimismPortalAddress, slot, value); vm.etch(l1CrossDomainMessengerAddress, l1CrossDomainMessengerCode); slot = hex"0000000000000000000000000000000000000000000000000000000000000000"; value = hex"0000000000000000000000010000000000000000000000000000000000000000"; @@ -210,22 +228,16 @@ contract DeploymentSummary is DeploymentSummaryCode { slot = hex"0000000000000000000000000000000000000000000000000000000000000000"; value = hex"0000000000000000000000010000000000000000000000000000000000000000"; vm.store(l1CrossDomainMessengerAddress, slot, value); - vm.etch(l2OutputOracleAddress, l2OutputOracleCode); + vm.etch(optimismMintableERC20FactoryAddress, optimismMintableERC20FactoryCode); slot = hex"0000000000000000000000000000000000000000000000000000000000000000"; value = hex"0000000000000000000000000000000000000000000000000000000000000001"; - vm.store(l2OutputOracleAddress, slot, value); + vm.store(optimismMintableERC20FactoryAddress, slot, value); slot = hex"0000000000000000000000000000000000000000000000000000000000000000"; value = hex"0000000000000000000000000000000000000000000000000000000000000101"; - vm.store(l2OutputOracleAddress, slot, value); - slot = hex"0000000000000000000000000000000000000000000000000000000000000004"; - value = hex"0000000000000000000000000000000000000000000000000000000000000001"; - vm.store(l2OutputOracleAddress, slot, value); - slot = hex"0000000000000000000000000000000000000000000000000000000000000005"; - value = hex"0000000000000000000000000000000000000000000000000000000000000001"; - vm.store(l2OutputOracleAddress, slot, value); + vm.store(optimismMintableERC20FactoryAddress, slot, value); slot = hex"0000000000000000000000000000000000000000000000000000000000000000"; value = hex"0000000000000000000000000000000000000000000000000000000000000001"; - vm.store(l2OutputOracleAddress, slot, value); + vm.store(optimismMintableERC20FactoryAddress, slot, value); vm.etch(systemConfigAddress, systemConfigCode); slot = hex"a11ee3ab75b40e88a0105e935d17cd36c8faee0138320d776c411291bdbbb19f"; value = hex"ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff"; @@ -280,11 +292,175 @@ contract DeploymentSummary is DeploymentSummaryCode { slot = hex"0000000000000000000000000000000000000000000000000000000000000000"; value = hex"0000000000000000000000000000000000000000000000000000000000000001"; vm.store(l1ERC721BridgeAddress, slot, value); + vm.etch(optimismPortalAddress, optimismPortalCode); + slot = hex"0000000000000000000000000000000000000000000000000000000000000000"; + value = hex"0000000000000000000000000000000000000000000000000000000000000001"; + vm.store(optimismPortalAddress, slot, value); + slot = hex"0000000000000000000000000000000000000000000000000000000000000000"; + value = hex"0000000000000000000000000000000000000000000000000000000000000101"; + vm.store(optimismPortalAddress, slot, value); + slot = hex"0000000000000000000000000000000000000000000000000000000000000032"; + value = hex"000000000000000000000000000000000000000000000000000000000000dead"; + vm.store(optimismPortalAddress, slot, value); + slot = hex"0000000000000000000000000000000000000000000000000000000000000001"; + value = hex"000000000000000100000000000000000000000000000000000000003b9aca00"; + vm.store(optimismPortalAddress, slot, value); + slot = hex"0000000000000000000000000000000000000000000000000000000000000000"; + value = hex"0000000000000000000000000000000000000000000000000000000000000001"; + vm.store(optimismPortalAddress, slot, value); + vm.etch(l2OutputOracleAddress, l2OutputOracleCode); + slot = hex"0000000000000000000000000000000000000000000000000000000000000000"; + value = hex"0000000000000000000000000000000000000000000000000000000000000001"; + vm.store(l2OutputOracleAddress, slot, value); + slot = hex"0000000000000000000000000000000000000000000000000000000000000000"; + value = hex"0000000000000000000000000000000000000000000000000000000000000101"; + vm.store(l2OutputOracleAddress, slot, value); + slot = hex"0000000000000000000000000000000000000000000000000000000000000004"; + value = hex"0000000000000000000000000000000000000000000000000000000000000001"; + vm.store(l2OutputOracleAddress, slot, value); + slot = hex"0000000000000000000000000000000000000000000000000000000000000005"; + value = hex"0000000000000000000000000000000000000000000000000000000000000001"; + vm.store(l2OutputOracleAddress, slot, value); + slot = hex"0000000000000000000000000000000000000000000000000000000000000000"; + value = hex"0000000000000000000000000000000000000000000000000000000000000001"; + vm.store(l2OutputOracleAddress, 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(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"00000000000000000000000000000000000000000000000000000000000000ff"; + vm.store(anchorStateRegistryAddress, slot, value); slot = hex"0000000000000000000000000000000000000000000000000000000000000005"; value = hex"0000000000000000000000000000000000000000000000000000000000000003"; vm.store(systemOwnerSafeAddress, slot, value); slot = hex"360894a13ba1a3210667c828492db98dca3e2076cc3735a920a3ca505d382bbc"; - value = hex"0000000000000000000000001182f45ae539e18534cbcc222c1c3d972b5ba24d"; + value = hex"000000000000000000000000b5a42f01ef5068f82c11fa1c4f9bbd4c8d346961"; + 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"0000000000000000000000000000000000000000000000000000000000000036"; + value = hex"00000000000000000000000039af23e00f1e662025aa01b0ceda19542b78df99"; + vm.store(optimismPortalProxyAddress, slot, value); + slot = hex"0000000000000000000000000000000000000000000000000000000000000037"; + value = hex"0000000000000000000000000c8b5822b6e02cda722174f19a1439a7495a3fa6"; + vm.store(optimismPortalProxyAddress, slot, value); + slot = hex"0000000000000000000000000000000000000000000000000000000000000035"; + value = hex"00000000000000000000004f559f30f5eb88d635fde1548c4267db8fab035100"; + vm.store(optimismPortalProxyAddress, slot, value); + slot = hex"0000000000000000000000000000000000000000000000000000000000000032"; + value = hex"000000000000000000000000000000000000000000000000000000000000dead"; + 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); + slot = hex"0000000000000000000000000000000000000000000000000000000000000005"; + value = hex"0000000000000000000000000000000000000000000000000000000000000004"; + vm.store(systemOwnerSafeAddress, slot, value); + slot = hex"360894a13ba1a3210667c828492db98dca3e2076cc3735a920a3ca505d382bbc"; + value = hex"000000000000000000000000d9ceca938f039e427edf626fa1f377d23a6b60c9"; vm.store(systemConfigProxyAddress, slot, value); slot = hex"0000000000000000000000000000000000000000000000000000000000000000"; value = hex"0000000000000000000000000000000000000000000000000000000000000001"; @@ -293,7 +469,7 @@ contract DeploymentSummary is DeploymentSummaryCode { value = hex"0000000000000000000000000000000000000000000000000000000000000101"; vm.store(systemConfigProxyAddress, slot, value); slot = hex"0000000000000000000000000000000000000000000000000000000000000033"; - value = hex"000000000000000000000000db8cff278adccf9e9b5da745b44e754fc4ee3c76"; + value = hex"00000000000000000000000062c20aa1e0272312bc100b4e23b4dc1ed96dd7d1"; vm.store(systemConfigProxyAddress, slot, value); slot = hex"0000000000000000000000000000000000000000000000000000000000000033"; value = hex"0000000000000000000000009965507d1a55bcc2695c58ba16fb37d819b0a4dc"; @@ -317,16 +493,22 @@ contract DeploymentSummary is DeploymentSummaryCode { value = hex"000000000000000000000000ff00000000000000000000000000000000000000"; vm.store(systemConfigProxyAddress, slot, value); slot = hex"383f291819e6d54073bc9a648251d97421076bdd101933c0c022219ce9580636"; - value = hex"00000000000000000000000020a42a5a785622c6ba2576b2d6e924aa82bfa11d"; + value = hex"000000000000000000000000def3bca8c80064589e6787477ffa7dd616b5574f"; vm.store(systemConfigProxyAddress, slot, value); slot = hex"46adcbebc6be8ce551740c29c47c8798210f23f7f4086c41752944352568d5a7"; - value = hex"000000000000000000000000def3bca8c80064589e6787477ffa7dd616b5574f"; + value = hex"000000000000000000000000d31598c909d9c935a9e35ba70d9a3dd47d4d5865"; vm.store(systemConfigProxyAddress, slot, value); slot = hex"9904ba90dde5696cda05c9e0dab5cbaa0fea005ace4d11218a02ac668dad6376"; - value = hex"0000000000000000000000000c8b5822b6e02cda722174f19a1439a7495a3fa6"; + value = hex"00000000000000000000000020a42a5a785622c6ba2576b2d6e924aa82bfa11d"; + vm.store(systemConfigProxyAddress, slot, value); + slot = hex"52322a25d9f59ea17656545543306b7aef62bc0cc53a0e65ccfa0c75b97aa906"; + value = hex"0000000000000000000000005207cfa0166e8de0fcdfd78b4d17b68587be306d"; vm.store(systemConfigProxyAddress, slot, value); slot = hex"4b6c74f9e688cb39801f2112c14a8c57232a3fc5202e1444126d4bce86eb19ac"; - value = hex"000000000000000000000000978e3286eb805934215a88694d80b09aded68d90"; + value = hex"0000000000000000000000001c23a6d89f95ef3148bcda8e242cab145bf9c0e4"; + vm.store(systemConfigProxyAddress, slot, value); + slot = hex"a04c5bb938ca6fc46d95553abf0a76345ce3e722a30bf4f74928b8e7d852320c"; + value = hex"000000000000000000000000c7b87b2b892ea5c3cff47168881fe168c00377fb"; vm.store(systemConfigProxyAddress, slot, value); slot = hex"a11ee3ab75b40e88a0105e935d17cd36c8faee0138320d776c411291bdbbb19f"; value = hex"0000000000000000000000000000000000000000000000000000000000000001"; @@ -338,16 +520,16 @@ contract DeploymentSummary is DeploymentSummaryCode { value = hex"0000000000000000000000000000000000000000000000000000000000000001"; vm.store(systemConfigProxyAddress, slot, value); slot = hex"0000000000000000000000000000000000000000000000000000000000000005"; - value = hex"0000000000000000000000000000000000000000000000000000000000000004"; + value = hex"0000000000000000000000000000000000000000000000000000000000000005"; vm.store(systemOwnerSafeAddress, slot, value); - slot = hex"a8f0d50211ac8ff1a40793a899dff3ced4762e0466f69b0078ab7b00d037835c"; + slot = hex"540cf4e2f45b866b44f44bde51e109474016dc46a0670fbe1684ad8eaf90fdc3"; value = hex"0000000000000000000000000000000000000000000000000000000000000001"; vm.store(proxyAdminAddress, slot, value); slot = hex"0000000000000000000000000000000000000000000000000000000000000005"; - value = hex"0000000000000000000000000000000000000000000000000000000000000005"; + value = hex"0000000000000000000000000000000000000000000000000000000000000006"; vm.store(systemOwnerSafeAddress, slot, value); slot = hex"360894a13ba1a3210667c828492db98dca3e2076cc3735a920a3ca505d382bbc"; - value = hex"00000000000000000000000004c50b398cd4182428e79f7186b7c919cf17e86f"; + value = hex"0000000000000000000000006cb2c88abcd6391f9496f44be27d5d3b247e0159"; vm.store(l1StandardBridgeProxyAddress, slot, value); slot = hex"0000000000000000000000000000000000000000000000000000000000000000"; value = hex"0000000000000000000000000000000000000000000000000000000000000001"; @@ -356,13 +538,13 @@ contract DeploymentSummary is DeploymentSummaryCode { value = hex"0000000000000000000000000000000000000000000000000000000000000101"; vm.store(l1StandardBridgeProxyAddress, slot, value); slot = hex"0000000000000000000000000000000000000000000000000000000000000032"; - value = hex"000000000000000000000000deb1e9a6be7baf84208bb6e10ac9f9bbe1d70809"; + value = hex"0000000000000000000000004f559f30f5eb88d635fde1548c4267db8fab0351"; vm.store(l1StandardBridgeProxyAddress, slot, value); slot = hex"0000000000000000000000000000000000000000000000000000000000000033"; - value = hex"0000000000000000000000001c23a6d89f95ef3148bcda8e242cab145bf9c0e4"; + value = hex"0000000000000000000000000c8b5822b6e02cda722174f19a1439a7495a3fa6"; vm.store(l1StandardBridgeProxyAddress, slot, value); slot = hex"0000000000000000000000000000000000000000000000000000000000000003"; - value = hex"00000000000000000000000020a42a5a785622c6ba2576b2d6e924aa82bfa11d"; + value = hex"000000000000000000000000def3bca8c80064589e6787477ffa7dd616b5574f"; vm.store(l1StandardBridgeProxyAddress, slot, value); slot = hex"0000000000000000000000000000000000000000000000000000000000000004"; value = hex"0000000000000000000000004200000000000000000000000000000000000010"; @@ -371,10 +553,10 @@ contract DeploymentSummary is DeploymentSummaryCode { value = hex"0000000000000000000000000000000000000000000000000000000000000001"; vm.store(l1StandardBridgeProxyAddress, slot, value); slot = hex"0000000000000000000000000000000000000000000000000000000000000005"; - value = hex"0000000000000000000000000000000000000000000000000000000000000006"; + value = hex"0000000000000000000000000000000000000000000000000000000000000007"; vm.store(systemOwnerSafeAddress, slot, value); slot = hex"360894a13ba1a3210667c828492db98dca3e2076cc3735a920a3ca505d382bbc"; - value = hex"00000000000000000000000044637a4292e0cd2b17a55d5f6b2f05afcacd0586"; + value = hex"000000000000000000000000a4bd7e58a30ed0477fe7372883d09bf86619bb66"; vm.store(l1ERC721BridgeProxyAddress, slot, value); slot = hex"0000000000000000000000000000000000000000000000000000000000000000"; value = hex"0000000000000000000000000000000000000000000000000000000000000001"; @@ -383,10 +565,10 @@ contract DeploymentSummary is DeploymentSummaryCode { value = hex"0000000000000000000000000000000000000000000000000000000000000101"; vm.store(l1ERC721BridgeProxyAddress, slot, value); slot = hex"0000000000000000000000000000000000000000000000000000000000000032"; - value = hex"000000000000000000000000deb1e9a6be7baf84208bb6e10ac9f9bbe1d70809"; + value = hex"0000000000000000000000004f559f30f5eb88d635fde1548c4267db8fab0351"; vm.store(l1ERC721BridgeProxyAddress, slot, value); slot = hex"0000000000000000000000000000000000000000000000000000000000000001"; - value = hex"00000000000000000000000020a42a5a785622c6ba2576b2d6e924aa82bfa11d"; + value = hex"000000000000000000000000def3bca8c80064589e6787477ffa7dd616b5574f"; vm.store(l1ERC721BridgeProxyAddress, slot, value); slot = hex"0000000000000000000000000000000000000000000000000000000000000002"; value = hex"0000000000000000000000004200000000000000000000000000000000000014"; @@ -395,22 +577,40 @@ contract DeploymentSummary is DeploymentSummaryCode { value = hex"0000000000000000000000000000000000000000000000000000000000000001"; vm.store(l1ERC721BridgeProxyAddress, slot, value); slot = hex"0000000000000000000000000000000000000000000000000000000000000005"; - value = hex"0000000000000000000000000000000000000000000000000000000000000007"; + value = hex"0000000000000000000000000000000000000000000000000000000000000008"; vm.store(systemOwnerSafeAddress, slot, value); - slot = hex"540cf4e2f45b866b44f44bde51e109474016dc46a0670fbe1684ad8eaf90fdc3"; + slot = hex"360894a13ba1a3210667c828492db98dca3e2076cc3735a920a3ca505d382bbc"; + value = hex"00000000000000000000000079c3114e5f89266e2c8842871bce16d4e5076b1e"; + vm.store(optimismMintableERC20FactoryProxyAddress, slot, value); + slot = hex"0000000000000000000000000000000000000000000000000000000000000000"; + value = hex"0000000000000000000000000000000000000000000000000000000000000001"; + vm.store(optimismMintableERC20FactoryProxyAddress, slot, value); + slot = hex"0000000000000000000000000000000000000000000000000000000000000000"; + value = hex"0000000000000000000000000000000000000000000000000000000000000101"; + vm.store(optimismMintableERC20FactoryProxyAddress, slot, value); + slot = hex"0000000000000000000000000000000000000000000000000000000000000001"; + value = hex"00000000000000000000000020a42a5a785622c6ba2576b2d6e924aa82bfa11d"; + vm.store(optimismMintableERC20FactoryProxyAddress, slot, value); + slot = hex"0000000000000000000000000000000000000000000000000000000000000000"; + value = hex"0000000000000000000000000000000000000000000000000000000000000001"; + vm.store(optimismMintableERC20FactoryProxyAddress, slot, value); + slot = hex"0000000000000000000000000000000000000000000000000000000000000005"; + value = hex"0000000000000000000000000000000000000000000000000000000000000009"; + vm.store(systemOwnerSafeAddress, slot, value); + slot = hex"191cda7b5a8219e0cc3bb6c2b45be830e3ba520f78e119446a476c4147fcc284"; value = hex"0000000000000000000000000000000000000000000000000000000000000002"; vm.store(proxyAdminAddress, slot, value); slot = hex"0000000000000000000000000000000000000000000000000000000000000005"; - value = hex"0000000000000000000000000000000000000000000000000000000000000008"; + value = hex"000000000000000000000000000000000000000000000000000000000000000a"; vm.store(systemOwnerSafeAddress, slot, value); - slot = hex"17eb2365d570ef4d1cc4abe9e522ed8632b11233db9c15f3c2c8aa32407b981b"; + slot = hex"89a8cb4d9b6f179480a9e676431122d6ba6a5fb2aa9462528e7e48e497a5c045"; value = hex"4f564d5f4c3143726f7373446f6d61696e4d657373656e676572000000000034"; vm.store(proxyAdminAddress, slot, value); slot = hex"0000000000000000000000000000000000000000000000000000000000000005"; - value = hex"0000000000000000000000000000000000000000000000000000000000000009"; + value = hex"000000000000000000000000000000000000000000000000000000000000000b"; vm.store(systemOwnerSafeAddress, slot, value); slot = hex"515216935740e67dfdda5cf8e248ea32b3277787818ab59153061ac875c9385e"; - value = hex"000000000000000000000000f3e6cbcbf1ae12fc13bc8b14fa8a67cbe147fd99"; + value = hex"000000000000000000000000357b6cda94109749a0da475ac1bfd395a61eb908"; vm.store(addressManagerAddress, slot, value); slot = hex"0000000000000000000000000000000000000000000000000000000000000000"; value = hex"0000000000000000000000010000000000000000000000000000000000000000"; @@ -419,13 +619,13 @@ contract DeploymentSummary is DeploymentSummaryCode { value = hex"0000000000000000000001010000000000000000000000000000000000000000"; vm.store(l1CrossDomainMessengerProxyAddress, slot, value); slot = hex"00000000000000000000000000000000000000000000000000000000000000fb"; - value = hex"000000000000000000000000deb1e9a6be7baf84208bb6e10ac9f9bbe1d70809"; + value = hex"0000000000000000000000004f559f30f5eb88d635fde1548c4267db8fab0351"; vm.store(l1CrossDomainMessengerProxyAddress, slot, value); slot = hex"00000000000000000000000000000000000000000000000000000000000000fc"; - value = hex"000000000000000000000000978e3286eb805934215a88694d80b09aded68d90"; + value = hex"0000000000000000000000001c23a6d89f95ef3148bcda8e242cab145bf9c0e4"; vm.store(l1CrossDomainMessengerProxyAddress, slot, value); slot = hex"00000000000000000000000000000000000000000000000000000000000000fd"; - value = hex"0000000000000000000000001c23a6d89f95ef3148bcda8e242cab145bf9c0e4"; + value = hex"0000000000000000000000000c8b5822b6e02cda722174f19a1439a7495a3fa6"; vm.store(l1CrossDomainMessengerProxyAddress, slot, value); slot = hex"00000000000000000000000000000000000000000000000000000000000000cc"; value = hex"000000000000000000000000000000000000000000000000000000000000dead"; @@ -437,34 +637,156 @@ contract DeploymentSummary is DeploymentSummaryCode { value = hex"0000000000000000000000010000000000000000000000000000000000000000"; vm.store(l1CrossDomainMessengerProxyAddress, slot, value); slot = hex"0000000000000000000000000000000000000000000000000000000000000005"; - value = hex"000000000000000000000000000000000000000000000000000000000000000a"; + value = hex"000000000000000000000000000000000000000000000000000000000000000c"; vm.store(systemOwnerSafeAddress, slot, value); slot = hex"360894a13ba1a3210667c828492db98dca3e2076cc3735a920a3ca505d382bbc"; - value = hex"000000000000000000000000fc9ad479ac641888d36ee5dc265bcd3eccebdc58"; - vm.store(optimismPortalProxyAddress, slot, value); + value = hex"00000000000000000000000060d37db59d0d14f7ea5c7425a2c03244e08b162d"; + vm.store(l2OutputOracleProxyAddress, slot, value); slot = hex"0000000000000000000000000000000000000000000000000000000000000000"; value = hex"0000000000000000000000000000000000000000000000000000000000000001"; - vm.store(optimismPortalProxyAddress, slot, value); + vm.store(l2OutputOracleProxyAddress, slot, value); slot = hex"0000000000000000000000000000000000000000000000000000000000000000"; value = hex"0000000000000000000000000000000000000000000000000000000000000101"; - vm.store(optimismPortalProxyAddress, slot, value); - slot = hex"0000000000000000000000000000000000000000000000000000000000000036"; - value = hex"0000000000000000000000008b71b41d4dbeb2b6821d44692d3facaaf77480bb"; - vm.store(optimismPortalProxyAddress, slot, value); - slot = hex"0000000000000000000000000000000000000000000000000000000000000037"; - value = hex"0000000000000000000000001c23a6d89f95ef3148bcda8e242cab145bf9c0e4"; - 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); + vm.store(l2OutputOracleProxyAddress, slot, value); + slot = hex"0000000000000000000000000000000000000000000000000000000000000004"; + value = hex"0000000000000000000000000000000000000000000000000000000000000006"; + vm.store(l2OutputOracleProxyAddress, slot, value); + slot = hex"0000000000000000000000000000000000000000000000000000000000000005"; + value = hex"0000000000000000000000000000000000000000000000000000000000000002"; + vm.store(l2OutputOracleProxyAddress, slot, value); slot = hex"0000000000000000000000000000000000000000000000000000000000000001"; - value = hex"000000000000000100000000000000000000000000000000000000003b9aca00"; - vm.store(optimismPortalProxyAddress, slot, value); + value = hex"0000000000000000000000000000000000000000000000000000000000000001"; + vm.store(l2OutputOracleProxyAddress, slot, value); + slot = hex"0000000000000000000000000000000000000000000000000000000000000002"; + value = hex"0000000000000000000000000000000000000000000000000000000000000001"; + vm.store(l2OutputOracleProxyAddress, slot, value); + slot = hex"0000000000000000000000000000000000000000000000000000000000000007"; + value = hex"00000000000000000000000070997970c51812dc3a010c7d01b50e0d17dc79c8"; + vm.store(l2OutputOracleProxyAddress, slot, value); + slot = hex"0000000000000000000000000000000000000000000000000000000000000006"; + value = hex"0000000000000000000000006925b8704ff96dee942623d6fb5e946ef5884b63"; + vm.store(l2OutputOracleProxyAddress, slot, value); + slot = hex"0000000000000000000000000000000000000000000000000000000000000008"; + value = hex"0000000000000000000000000000000000000000000000000000000000000024"; + vm.store(l2OutputOracleProxyAddress, slot, value); slot = hex"0000000000000000000000000000000000000000000000000000000000000000"; value = hex"0000000000000000000000000000000000000000000000000000000000000001"; - vm.store(optimismPortalProxyAddress, slot, value); + vm.store(l2OutputOracleProxyAddress, slot, value); + slot = hex"0000000000000000000000000000000000000000000000000000000000000005"; + value = hex"000000000000000000000000000000000000000000000000000000000000000d"; + vm.store(systemOwnerSafeAddress, slot, value); + slot = hex"360894a13ba1a3210667c828492db98dca3e2076cc3735a920a3ca505d382bbc"; + value = hex"0000000000000000000000008efda795511cbbdffc9eeca1a5bf30f5b1e1ef9e"; + 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"00000000000000000000000062c20aa1e0272312bc100b4e23b4dc1ed96dd7d1"; + 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"000000000000000000000000000000000000000000000000000000000000000e"; + vm.store(systemOwnerSafeAddress, slot, value); + slot = hex"360894a13ba1a3210667c828492db98dca3e2076cc3735a920a3ca505d382bbc"; + value = hex"000000000000000000000000e49ced258137cc5e18fb9aba2aa14069263d8f49"; + 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"00000000000000000000000062c20aa1e0272312bc100b4e23b4dc1ed96dd7d1"; + vm.store(delayedWETHProxyAddress, slot, value); + slot = hex"0000000000000000000000000000000000000000000000000000000000000033"; + value = hex"0000000000000000000000001804c8ab1f12e6bbf3894d4083f33e07309d1f38"; + vm.store(delayedWETHProxyAddress, slot, value); + slot = hex"0000000000000000000000000000000000000000000000000000000000000068"; + value = hex"0000000000000000000000004f559f30f5eb88d635fde1548c4267db8fab0351"; + vm.store(delayedWETHProxyAddress, slot, value); + slot = hex"0000000000000000000000000000000000000000000000000000000000000000"; + value = hex"0000000000000000000000000000000000000000000000000000000000000001"; + vm.store(delayedWETHProxyAddress, slot, value); + slot = hex"0000000000000000000000000000000000000000000000000000000000000005"; + value = hex"000000000000000000000000000000000000000000000000000000000000000f"; + vm.store(systemOwnerSafeAddress, slot, value); + slot = hex"360894a13ba1a3210667c828492db98dca3e2076cc3735a920a3ca505d382bbc"; + value = hex"000000000000000000000000e49ced258137cc5e18fb9aba2aa14069263d8f49"; + vm.store(permissionedDelayedWETHProxyAddress, slot, value); + slot = hex"0000000000000000000000000000000000000000000000000000000000000000"; + value = hex"0000000000000000000000000000000000000000000000000000000000000001"; + vm.store(permissionedDelayedWETHProxyAddress, slot, value); + slot = hex"0000000000000000000000000000000000000000000000000000000000000000"; + value = hex"0000000000000000000000000000000000000000000000000000000000000101"; + vm.store(permissionedDelayedWETHProxyAddress, slot, value); + slot = hex"0000000000000000000000000000000000000000000000000000000000000033"; + value = hex"00000000000000000000000062c20aa1e0272312bc100b4e23b4dc1ed96dd7d1"; + vm.store(permissionedDelayedWETHProxyAddress, slot, value); + slot = hex"0000000000000000000000000000000000000000000000000000000000000033"; + value = hex"0000000000000000000000001804c8ab1f12e6bbf3894d4083f33e07309d1f38"; + vm.store(permissionedDelayedWETHProxyAddress, slot, value); + slot = hex"0000000000000000000000000000000000000000000000000000000000000068"; + value = hex"0000000000000000000000004f559f30f5eb88d635fde1548c4267db8fab0351"; + vm.store(permissionedDelayedWETHProxyAddress, slot, value); + slot = hex"0000000000000000000000000000000000000000000000000000000000000000"; + value = hex"0000000000000000000000000000000000000000000000000000000000000001"; + vm.store(permissionedDelayedWETHProxyAddress, slot, value); + slot = hex"0000000000000000000000000000000000000000000000000000000000000005"; + value = hex"0000000000000000000000000000000000000000000000000000000000000010"; + vm.store(systemOwnerSafeAddress, slot, value); + slot = hex"360894a13ba1a3210667c828492db98dca3e2076cc3735a920a3ca505d382bbc"; + value = hex"000000000000000000000000dec4d949cf1a2e824ee4f8b12064e166b96171dd"; + 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"1d32deecea32fd1365d10df47fc6666a05871102e61a115a5c569bca7e5de14d"; + value = hex"deadbeefdeadbeefdeadbeefdeadbeefdeadbeefdeadbeefdeadbeefdeadbeef"; + vm.store(anchorStateRegistryProxyAddress, slot, value); + slot = hex"0000000000000000000000000000000000000000000000000000000000000002"; + value = hex"0000000000000000000000004f559f30f5eb88d635fde1548c4267db8fab0351"; + vm.store(anchorStateRegistryProxyAddress, slot, value); + slot = hex"0000000000000000000000000000000000000000000000000000000000000000"; + value = hex"0000000000000000000000000000000000000000000000000000000000000001"; + vm.store(anchorStateRegistryProxyAddress, slot, value); + vm.etch(acc33Address, acc33Code); + slot = hex"ffdfc1249c027f9191656349feb0761381bb32c9f557e01f419fd08754bf5a1b"; + value = hex"000000000000000000000000b6b1579aa54e2f61e621a40d5f2704d717b3544f"; + vm.store(disputeGameFactoryProxyAddress, slot, value); + vm.etch(acc34Address, acc34Code); + slot = hex"4d5a9bd2e41301728d41c8e705190becb4e74abe869f75bdb405b63716a35f9e"; + value = hex"00000000000000000000000059b99034fbdd5e554661a2100cb2b6b7c5d495f8"; + vm.store(disputeGameFactoryProxyAddress, slot, value); + slot = hex"0000000000000000000000000000000000000000000000000000000000000033"; + value = hex"0000000000000000000000007c0c8a15773ed7b50e7c738d1af4c5e3a2b210bd"; + vm.store(disputeGameFactoryProxyAddress, slot, value); + slot = hex"0000000000000000000000000000000000000000000000000000000000000033"; + value = hex"0000000000000000000000007c0c8a15773ed7b50e7c738d1af4c5e3a2b210bd"; + vm.store(delayedWETHProxyAddress, slot, value); } } diff --git a/packages/contracts-bedrock/test/kontrol/proofs/utils/DeploymentSummaryCode.sol b/packages/contracts-bedrock/test/kontrol/proofs/utils/DeploymentSummaryCode.sol index 5ca540ac2d9f..153fef71fb87 100644 --- a/packages/contracts-bedrock/test/kontrol/proofs/utils/DeploymentSummaryCode.sol +++ b/packages/contracts-bedrock/test/kontrol/proofs/utils/DeploymentSummaryCode.sol @@ -17,33 +17,61 @@ contract DeploymentSummaryCode { bytes internal constant superchainConfigProxyCode = hex"60806040526004361061005e5760003560e01c80635c60da1b116100435780635c60da1b146100be5780638f283970146100f8578063f851a440146101185761006d565b80633659cfe6146100755780634f1ef286146100955761006d565b3661006d5761006b61012d565b005b61006b61012d565b34801561008157600080fd5b5061006b6100903660046106dd565b610224565b6100a86100a33660046106f8565b610296565b6040516100b5919061077b565b60405180910390f35b3480156100ca57600080fd5b506100d3610419565b60405173ffffffffffffffffffffffffffffffffffffffff90911681526020016100b5565b34801561010457600080fd5b5061006b6101133660046106dd565b6104b0565b34801561012457600080fd5b506100d3610517565b60006101577f360894a13ba1a3210667c828492db98dca3e2076cc3735a920a3ca505d382bbc5490565b905073ffffffffffffffffffffffffffffffffffffffff8116610201576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602560248201527f50726f78793a20696d706c656d656e746174696f6e206e6f7420696e6974696160448201527f6c697a656400000000000000000000000000000000000000000000000000000060648201526084015b60405180910390fd5b3660008037600080366000845af43d6000803e8061021e573d6000fd5b503d6000f35b7fb53127684a568b3173ae13b9f8a6016e243e63b6e8ee1178d6a717850b5d61035473ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff16148061027d575033155b1561028e5761028b816105a3565b50565b61028b61012d565b60606102c07fb53127684a568b3173ae13b9f8a6016e243e63b6e8ee1178d6a717850b5d61035490565b73ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff1614806102f7575033155b1561040a57610305846105a3565b6000808573ffffffffffffffffffffffffffffffffffffffff16858560405161032f9291906107ee565b600060405180830381855af49150503d806000811461036a576040519150601f19603f3d011682016040523d82523d6000602084013e61036f565b606091505b509150915081610401576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152603960248201527f50726f78793a2064656c656761746563616c6c20746f206e657720696d706c6560448201527f6d656e746174696f6e20636f6e7472616374206661696c65640000000000000060648201526084016101f8565b91506104129050565b61041261012d565b9392505050565b60006104437fb53127684a568b3173ae13b9f8a6016e243e63b6e8ee1178d6a717850b5d61035490565b73ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff16148061047a575033155b156104a557507f360894a13ba1a3210667c828492db98dca3e2076cc3735a920a3ca505d382bbc5490565b6104ad61012d565b90565b7fb53127684a568b3173ae13b9f8a6016e243e63b6e8ee1178d6a717850b5d61035473ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff161480610509575033155b1561028e5761028b8161060c565b60006105417fb53127684a568b3173ae13b9f8a6016e243e63b6e8ee1178d6a717850b5d61035490565b73ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff161480610578575033155b156104a557507fb53127684a568b3173ae13b9f8a6016e243e63b6e8ee1178d6a717850b5d61035490565b7f360894a13ba1a3210667c828492db98dca3e2076cc3735a920a3ca505d382bbc81815560405173ffffffffffffffffffffffffffffffffffffffff8316907fbc7cd75a20ee27fd9adebab32041f755214dbc6bffa90cc0225b39da2e5c2d3b90600090a25050565b60006106367fb53127684a568b3173ae13b9f8a6016e243e63b6e8ee1178d6a717850b5d61035490565b7fb53127684a568b3173ae13b9f8a6016e243e63b6e8ee1178d6a717850b5d61038381556040805173ffffffffffffffffffffffffffffffffffffffff80851682528616602082015292935090917f7e644d79422f17c01e4894b5f4f588d331ebfa28653d42ae832dc59e38c9798f910160405180910390a1505050565b803573ffffffffffffffffffffffffffffffffffffffff811681146106d857600080fd5b919050565b6000602082840312156106ef57600080fd5b610412826106b4565b60008060006040848603121561070d57600080fd5b610716846106b4565b9250602084013567ffffffffffffffff8082111561073357600080fd5b818601915086601f83011261074757600080fd5b81358181111561075657600080fd5b87602082850101111561076857600080fd5b6020830194508093505050509250925092565b600060208083528351808285015260005b818110156107a85785810183015185820160400152820161078c565b818111156107ba576000604083870101525b50601f017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe016929092016040019392505050565b818382376000910190815291905056fea164736f6c634300080f000a"; bytes internal constant superchainConfigCode = - hex"608060405234801561001057600080fd5b50600436106100885760003560e01c80635c975abb1161005b5780635c975abb146101255780636da663551461013d5780637fbf7b6a14610150578063c23a451a1461016657600080fd5b80633f4ba83a1461008d578063400ada7514610097578063452a9320146100aa57806354fd4d50146100dc575b600080fd5b61009561016e565b005b6100956100a5366004610746565b610294565b6100b261046d565b60405173ffffffffffffffffffffffffffffffffffffffff90911681526020015b60405180910390f35b6101186040518060400160405280600581526020017f312e312e3000000000000000000000000000000000000000000000000000000081525081565b6040516100d39190610808565b61012d6104a6565b60405190151581526020016100d3565b61009561014b366004610851565b6104d6565b6101586105a4565b6040519081526020016100d3565b6101586105d2565b61017661046d565b73ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff1614610235576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602b60248201527f5375706572636861696e436f6e6669673a206f6e6c7920677561726469616e2060448201527f63616e20756e706175736500000000000000000000000000000000000000000060648201526084015b60405180910390fd5b61026961026360017f54176ff9944c4784e5857ec4e5ef560a462c483bf534eda43f91bb01a470b1b7610920565b60009055565b6040517fa45f47fdea8a1efdd9029a5691c7f759c32b7c698632b563573e155625d1693390600090a1565b600054610100900460ff16158080156102b45750600054600160ff909116105b806102ce5750303b1580156102ce575060005460ff166001145b61035a576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602e60248201527f496e697469616c697a61626c653a20636f6e747261637420697320616c72656160448201527f647920696e697469616c697a6564000000000000000000000000000000000000606482015260840161022c565b600080547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0016600117905580156103b857600080547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00ff166101001790555b6103c18361061d565b8115610405576104056040518060400160405280601281526020017f496e697469616c697a65722070617573656400000000000000000000000000008152506106d8565b801561046857600080547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00ff169055604051600181527f7f26b83ff96e1f2b6a682f133852f6798a09c465da95921460cefb38474024989060200160405180910390a15b505050565b60006104a161049d60017fd30e835d3f35624761057ff5b27d558f97bd5be034621e62240e5c0b784abe69610920565b5490565b905090565b60006104a161049d60017f54176ff9944c4784e5857ec4e5ef560a462c483bf534eda43f91bb01a470b1b7610920565b6104de61046d565b73ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff1614610598576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602960248201527f5375706572636861696e436f6e6669673a206f6e6c7920677561726469616e2060448201527f63616e2070617573650000000000000000000000000000000000000000000000606482015260840161022c565b6105a1816106d8565b50565b6105cf60017f54176ff9944c4784e5857ec4e5ef560a462c483bf534eda43f91bb01a470b1b7610920565b81565b6105cf60017fd30e835d3f35624761057ff5b27d558f97bd5be034621e62240e5c0b784abe69610920565b73ffffffffffffffffffffffffffffffffffffffff163b151590565b9055565b61065061064b60017fd30e835d3f35624761057ff5b27d558f97bd5be034621e62240e5c0b784abe69610920565b829055565b60006040805173ffffffffffffffffffffffffffffffffffffffff841660208201527f7b743789cff01dafdeae47739925425aab5dfd02d0c8229e4a508bcd2b9f42bb9101604080517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0818403018152908290526106cd91610808565b60405180910390a250565b61070c61070660017f54176ff9944c4784e5857ec4e5ef560a462c483bf534eda43f91bb01a470b1b7610920565b60019055565b7fc32e6d5d6d1de257f64eac19ddb1f700ba13527983849c9486b1ab007ea283818160405161073b9190610808565b60405180910390a150565b6000806040838503121561075957600080fd5b823573ffffffffffffffffffffffffffffffffffffffff8116811461077d57600080fd5b91506020830135801515811461079257600080fd5b809150509250929050565b6000815180845260005b818110156107c3576020818501810151868301820152016107a7565b818111156107d5576000602083870101525b50601f017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0169290920160200192915050565b60208152600061081b602083018461079d565b9392505050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b60006020828403121561086357600080fd5b813567ffffffffffffffff8082111561087b57600080fd5b818401915084601f83011261088f57600080fd5b8135818111156108a1576108a1610822565b604051601f82017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0908116603f011681019083821181831017156108e7576108e7610822565b8160405282815287602084870101111561090057600080fd5b826020860160208301376000928101602001929092525095945050505050565b600082821015610959577f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b50039056fea164736f6c634300080f000a"; + hex"608060405234801561001057600080fd5b50600436106100885760003560e01c80635c975abb1161005b5780635c975abb146101255780636da663551461013d5780637fbf7b6a14610150578063c23a451a1461016657600080fd5b80633f4ba83a1461008d578063400ada7514610097578063452a9320146100aa57806354fd4d50146100dc575b600080fd5b61009561016e565b005b6100956100a5366004610746565b610294565b6100b261046d565b60405173ffffffffffffffffffffffffffffffffffffffff90911681526020015b60405180910390f35b6101186040518060400160405280600c81526020017f312e312e312d626574612e31000000000000000000000000000000000000000081525081565b6040516100d39190610808565b61012d6104a6565b60405190151581526020016100d3565b61009561014b366004610851565b6104d6565b6101586105a4565b6040519081526020016100d3565b6101586105d2565b61017661046d565b73ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff1614610235576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602b60248201527f5375706572636861696e436f6e6669673a206f6e6c7920677561726469616e2060448201527f63616e20756e706175736500000000000000000000000000000000000000000060648201526084015b60405180910390fd5b61026961026360017f54176ff9944c4784e5857ec4e5ef560a462c483bf534eda43f91bb01a470b1b7610920565b60009055565b6040517fa45f47fdea8a1efdd9029a5691c7f759c32b7c698632b563573e155625d1693390600090a1565b600054610100900460ff16158080156102b45750600054600160ff909116105b806102ce5750303b1580156102ce575060005460ff166001145b61035a576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602e60248201527f496e697469616c697a61626c653a20636f6e747261637420697320616c72656160448201527f647920696e697469616c697a6564000000000000000000000000000000000000606482015260840161022c565b600080547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0016600117905580156103b857600080547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00ff166101001790555b6103c18361061d565b8115610405576104056040518060400160405280601281526020017f496e697469616c697a65722070617573656400000000000000000000000000008152506106d8565b801561046857600080547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00ff169055604051600181527f7f26b83ff96e1f2b6a682f133852f6798a09c465da95921460cefb38474024989060200160405180910390a15b505050565b60006104a161049d60017fd30e835d3f35624761057ff5b27d558f97bd5be034621e62240e5c0b784abe69610920565b5490565b905090565b60006104a161049d60017f54176ff9944c4784e5857ec4e5ef560a462c483bf534eda43f91bb01a470b1b7610920565b6104de61046d565b73ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff1614610598576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602960248201527f5375706572636861696e436f6e6669673a206f6e6c7920677561726469616e2060448201527f63616e2070617573650000000000000000000000000000000000000000000000606482015260840161022c565b6105a1816106d8565b50565b6105cf60017f54176ff9944c4784e5857ec4e5ef560a462c483bf534eda43f91bb01a470b1b7610920565b81565b6105cf60017fd30e835d3f35624761057ff5b27d558f97bd5be034621e62240e5c0b784abe69610920565b73ffffffffffffffffffffffffffffffffffffffff163b151590565b9055565b61065061064b60017fd30e835d3f35624761057ff5b27d558f97bd5be034621e62240e5c0b784abe69610920565b829055565b60006040805173ffffffffffffffffffffffffffffffffffffffff841660208201527f7b743789cff01dafdeae47739925425aab5dfd02d0c8229e4a508bcd2b9f42bb9101604080517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0818403018152908290526106cd91610808565b60405180910390a250565b61070c61070660017f54176ff9944c4784e5857ec4e5ef560a462c483bf534eda43f91bb01a470b1b7610920565b60019055565b7fc32e6d5d6d1de257f64eac19ddb1f700ba13527983849c9486b1ab007ea283818160405161073b9190610808565b60405180910390a150565b6000806040838503121561075957600080fd5b823573ffffffffffffffffffffffffffffffffffffffff8116811461077d57600080fd5b91506020830135801515811461079257600080fd5b809150509250929050565b6000815180845260005b818110156107c3576020818501810151868301820152016107a7565b818111156107d5576000602083870101525b50601f017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0169290920160200192915050565b60208152600061081b602083018461079d565b9392505050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b60006020828403121561086357600080fd5b813567ffffffffffffffff8082111561087b57600080fd5b818401915084601f83011261088f57600080fd5b8135818111156108a1576108a1610822565b604051601f82017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0908116603f011681019083821181831017156108e7576108e7610822565b8160405282815287602084870101111561090057600080fd5b826020860160208301376000928101602001929092525095945050505050565b600082821015610959577f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b50039056fea164736f6c634300080f000a"; bytes internal constant protocolVersionsProxyCode = hex"60806040526004361061005e5760003560e01c80635c60da1b116100435780635c60da1b146100be5780638f283970146100f8578063f851a440146101185761006d565b80633659cfe6146100755780634f1ef286146100955761006d565b3661006d5761006b61012d565b005b61006b61012d565b34801561008157600080fd5b5061006b6100903660046106dd565b610224565b6100a86100a33660046106f8565b610296565b6040516100b5919061077b565b60405180910390f35b3480156100ca57600080fd5b506100d3610419565b60405173ffffffffffffffffffffffffffffffffffffffff90911681526020016100b5565b34801561010457600080fd5b5061006b6101133660046106dd565b6104b0565b34801561012457600080fd5b506100d3610517565b60006101577f360894a13ba1a3210667c828492db98dca3e2076cc3735a920a3ca505d382bbc5490565b905073ffffffffffffffffffffffffffffffffffffffff8116610201576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602560248201527f50726f78793a20696d706c656d656e746174696f6e206e6f7420696e6974696160448201527f6c697a656400000000000000000000000000000000000000000000000000000060648201526084015b60405180910390fd5b3660008037600080366000845af43d6000803e8061021e573d6000fd5b503d6000f35b7fb53127684a568b3173ae13b9f8a6016e243e63b6e8ee1178d6a717850b5d61035473ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff16148061027d575033155b1561028e5761028b816105a3565b50565b61028b61012d565b60606102c07fb53127684a568b3173ae13b9f8a6016e243e63b6e8ee1178d6a717850b5d61035490565b73ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff1614806102f7575033155b1561040a57610305846105a3565b6000808573ffffffffffffffffffffffffffffffffffffffff16858560405161032f9291906107ee565b600060405180830381855af49150503d806000811461036a576040519150601f19603f3d011682016040523d82523d6000602084013e61036f565b606091505b509150915081610401576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152603960248201527f50726f78793a2064656c656761746563616c6c20746f206e657720696d706c6560448201527f6d656e746174696f6e20636f6e7472616374206661696c65640000000000000060648201526084016101f8565b91506104129050565b61041261012d565b9392505050565b60006104437fb53127684a568b3173ae13b9f8a6016e243e63b6e8ee1178d6a717850b5d61035490565b73ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff16148061047a575033155b156104a557507f360894a13ba1a3210667c828492db98dca3e2076cc3735a920a3ca505d382bbc5490565b6104ad61012d565b90565b7fb53127684a568b3173ae13b9f8a6016e243e63b6e8ee1178d6a717850b5d61035473ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff161480610509575033155b1561028e5761028b8161060c565b60006105417fb53127684a568b3173ae13b9f8a6016e243e63b6e8ee1178d6a717850b5d61035490565b73ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff161480610578575033155b156104a557507fb53127684a568b3173ae13b9f8a6016e243e63b6e8ee1178d6a717850b5d61035490565b7f360894a13ba1a3210667c828492db98dca3e2076cc3735a920a3ca505d382bbc81815560405173ffffffffffffffffffffffffffffffffffffffff8316907fbc7cd75a20ee27fd9adebab32041f755214dbc6bffa90cc0225b39da2e5c2d3b90600090a25050565b60006106367fb53127684a568b3173ae13b9f8a6016e243e63b6e8ee1178d6a717850b5d61035490565b7fb53127684a568b3173ae13b9f8a6016e243e63b6e8ee1178d6a717850b5d61038381556040805173ffffffffffffffffffffffffffffffffffffffff80851682528616602082015292935090917f7e644d79422f17c01e4894b5f4f588d331ebfa28653d42ae832dc59e38c9798f910160405180910390a1505050565b803573ffffffffffffffffffffffffffffffffffffffff811681146106d857600080fd5b919050565b6000602082840312156106ef57600080fd5b610412826106b4565b60008060006040848603121561070d57600080fd5b610716846106b4565b9250602084013567ffffffffffffffff8082111561073357600080fd5b818601915086601f83011261074757600080fd5b81358181111561075657600080fd5b87602082850101111561076857600080fd5b6020830194508093505050509250925092565b600060208083528351808285015260005b818110156107a85785810183015185820160400152820161078c565b818111156107ba576000604083870101525b50601f017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe016929092016040019392505050565b818382376000910190815291905056fea164736f6c634300080f000a"; bytes internal constant protocolVersionsCode = - hex"608060405234801561001057600080fd5b50600436106100d45760003560e01c80638da5cb5b11610081578063f2fde38b1161005b578063f2fde38b146101b8578063f7d12760146101cb578063ffa1ad74146101d357600080fd5b80638da5cb5b14610180578063d798b1ac146101a8578063dc8452cd146101b057600080fd5b80635fd579af116100b25780635fd579af14610152578063715018a6146101655780637a1ac61e1461016d57600080fd5b80630457d6f2146100d9578063206a8300146100ee57806354fd4d5014610109575b600080fd5b6100ec6100e73660046108c3565b6101db565b005b6100f66101ef565b6040519081526020015b60405180910390f35b6101456040518060400160405280600581526020017f312e302e3000000000000000000000000000000000000000000000000000000081525081565b6040516101009190610947565b6100ec6101603660046108c3565b61021d565b6100ec61022e565b6100ec61017b36600461098a565b610242565b60335460405173ffffffffffffffffffffffffffffffffffffffff9091168152602001610100565b6100f66103f7565b6100f6610430565b6100ec6101c63660046109bd565b610460565b6100f6610514565b6100f6600081565b6101e361055f565b6101ec816105e0565b50565b61021a60017f4aaefe95bd84fd3f32700cf3b7566bc944b73138e41958b5785826df2aecace16109d8565b81565b61022561055f565b6101ec81610698565b61023661055f565b6102406000610712565b565b600054610100900460ff16158080156102625750600054600160ff909116105b8061027c5750303b15801561027c575060005460ff166001145b61030d576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602e60248201527f496e697469616c697a61626c653a20636f6e747261637420697320616c72656160448201527f647920696e697469616c697a656400000000000000000000000000000000000060648201526084015b60405180910390fd5b600080547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00166001179055801561036b57600080547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00ff166101001790555b610373610789565b61037c84610460565b610385836105e0565b61038e82610698565b80156103f157600080547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00ff169055604051600181527f7f26b83ff96e1f2b6a682f133852f6798a09c465da95921460cefb38474024989060200160405180910390a15b50505050565b600061042b61042760017fe314dfc40f0025322aacc0ba8ef420b62fb3b702cf01e0cdf3d829117ac2ff1b6109d8565b5490565b905090565b600061042b61042760017f4aaefe95bd84fd3f32700cf3b7566bc944b73138e41958b5785826df2aecace16109d8565b61046861055f565b73ffffffffffffffffffffffffffffffffffffffff811661050b576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602660248201527f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160448201527f64647265737300000000000000000000000000000000000000000000000000006064820152608401610304565b6101ec81610712565b61021a60017fe314dfc40f0025322aacc0ba8ef420b62fb3b702cf01e0cdf3d829117ac2ff1b6109d8565b73ffffffffffffffffffffffffffffffffffffffff163b151590565b9055565b60335473ffffffffffffffffffffffffffffffffffffffff163314610240576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e65726044820152606401610304565b61061361060e60017f4aaefe95bd84fd3f32700cf3b7566bc944b73138e41958b5785826df2aecace16109d8565b829055565b60008160405160200161062891815260200190565b604080517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0818403018152919052905060005b60007f1d2b0bda21d56b8bd12d4f94ebacffdfb35f5e226f84b461103bb8beab6353be8360405161068c9190610947565b60405180910390a35050565b6106c661060e60017fe314dfc40f0025322aacc0ba8ef420b62fb3b702cf01e0cdf3d829117ac2ff1b6109d8565b6000816040516020016106db91815260200190565b604080517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe08184030181529190529050600161065b565b6033805473ffffffffffffffffffffffffffffffffffffffff8381167fffffffffffffffffffffffff0000000000000000000000000000000000000000831681179093556040519116919082907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e090600090a35050565b600054610100900460ff16610820576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602b60248201527f496e697469616c697a61626c653a20636f6e7472616374206973206e6f74206960448201527f6e697469616c697a696e670000000000000000000000000000000000000000006064820152608401610304565b610240600054610100900460ff166108ba576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602b60248201527f496e697469616c697a61626c653a20636f6e7472616374206973206e6f74206960448201527f6e697469616c697a696e670000000000000000000000000000000000000000006064820152608401610304565b61024033610712565b6000602082840312156108d557600080fd5b5035919050565b6000815180845260005b81811015610902576020818501810151868301820152016108e6565b81811115610914576000602083870101525b50601f017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0169290920160200192915050565b60208152600061095a60208301846108dc565b9392505050565b803573ffffffffffffffffffffffffffffffffffffffff8116811461098557600080fd5b919050565b60008060006060848603121561099f57600080fd5b6109a884610961565b95602085013595506040909401359392505050565b6000602082840312156109cf57600080fd5b61095a82610961565b600082821015610a11577f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b50039056fea164736f6c634300080f000a"; + hex"608060405234801561001057600080fd5b50600436106100d45760003560e01c80638da5cb5b11610081578063f2fde38b1161005b578063f2fde38b146101b8578063f7d12760146101cb578063ffa1ad74146101d357600080fd5b80638da5cb5b14610180578063d798b1ac146101a8578063dc8452cd146101b057600080fd5b80635fd579af116100b25780635fd579af14610152578063715018a6146101655780637a1ac61e1461016d57600080fd5b80630457d6f2146100d9578063206a8300146100ee57806354fd4d5014610109575b600080fd5b6100ec6100e73660046108c3565b6101db565b005b6100f66101ef565b6040519081526020015b60405180910390f35b6101456040518060400160405280600c81526020017f312e302e312d626574612e31000000000000000000000000000000000000000081525081565b6040516101009190610947565b6100ec6101603660046108c3565b61021d565b6100ec61022e565b6100ec61017b36600461098a565b610242565b60335460405173ffffffffffffffffffffffffffffffffffffffff9091168152602001610100565b6100f66103f7565b6100f6610430565b6100ec6101c63660046109bd565b610460565b6100f6610514565b6100f6600081565b6101e361055f565b6101ec816105e0565b50565b61021a60017f4aaefe95bd84fd3f32700cf3b7566bc944b73138e41958b5785826df2aecace16109d8565b81565b61022561055f565b6101ec81610698565b61023661055f565b6102406000610712565b565b600054610100900460ff16158080156102625750600054600160ff909116105b8061027c5750303b15801561027c575060005460ff166001145b61030d576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602e60248201527f496e697469616c697a61626c653a20636f6e747261637420697320616c72656160448201527f647920696e697469616c697a656400000000000000000000000000000000000060648201526084015b60405180910390fd5b600080547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00166001179055801561036b57600080547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00ff166101001790555b610373610789565b61037c84610460565b610385836105e0565b61038e82610698565b80156103f157600080547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00ff169055604051600181527f7f26b83ff96e1f2b6a682f133852f6798a09c465da95921460cefb38474024989060200160405180910390a15b50505050565b600061042b61042760017fe314dfc40f0025322aacc0ba8ef420b62fb3b702cf01e0cdf3d829117ac2ff1b6109d8565b5490565b905090565b600061042b61042760017f4aaefe95bd84fd3f32700cf3b7566bc944b73138e41958b5785826df2aecace16109d8565b61046861055f565b73ffffffffffffffffffffffffffffffffffffffff811661050b576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602660248201527f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160448201527f64647265737300000000000000000000000000000000000000000000000000006064820152608401610304565b6101ec81610712565b61021a60017fe314dfc40f0025322aacc0ba8ef420b62fb3b702cf01e0cdf3d829117ac2ff1b6109d8565b73ffffffffffffffffffffffffffffffffffffffff163b151590565b9055565b60335473ffffffffffffffffffffffffffffffffffffffff163314610240576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e65726044820152606401610304565b61061361060e60017f4aaefe95bd84fd3f32700cf3b7566bc944b73138e41958b5785826df2aecace16109d8565b829055565b60008160405160200161062891815260200190565b604080517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0818403018152919052905060005b60007f1d2b0bda21d56b8bd12d4f94ebacffdfb35f5e226f84b461103bb8beab6353be8360405161068c9190610947565b60405180910390a35050565b6106c661060e60017fe314dfc40f0025322aacc0ba8ef420b62fb3b702cf01e0cdf3d829117ac2ff1b6109d8565b6000816040516020016106db91815260200190565b604080517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe08184030181529190529050600161065b565b6033805473ffffffffffffffffffffffffffffffffffffffff8381167fffffffffffffffffffffffff0000000000000000000000000000000000000000831681179093556040519116919082907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e090600090a35050565b600054610100900460ff16610820576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602b60248201527f496e697469616c697a61626c653a20636f6e7472616374206973206e6f74206960448201527f6e697469616c697a696e670000000000000000000000000000000000000000006064820152608401610304565b610240600054610100900460ff166108ba576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602b60248201527f496e697469616c697a61626c653a20636f6e7472616374206973206e6f74206960448201527f6e697469616c697a696e670000000000000000000000000000000000000000006064820152608401610304565b61024033610712565b6000602082840312156108d557600080fd5b5035919050565b6000815180845260005b81811015610902576020818501810151868301820152016108e6565b81811115610914576000602083870101525b50601f017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0169290920160200192915050565b60208152600061095a60208301846108dc565b9392505050565b803573ffffffffffffffffffffffffffffffffffffffff8116811461098557600080fd5b919050565b60008060006060848603121561099f57600080fd5b6109a884610961565b95602085013595506040909401359392505050565b6000602082840312156109cf57600080fd5b61095a82610961565b600082821015610a11577f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b50039056fea164736f6c634300080f000a"; bytes internal constant optimismPortalProxyCode = hex"60806040526004361061005e5760003560e01c80635c60da1b116100435780635c60da1b146100be5780638f283970146100f8578063f851a440146101185761006d565b80633659cfe6146100755780634f1ef286146100955761006d565b3661006d5761006b61012d565b005b61006b61012d565b34801561008157600080fd5b5061006b6100903660046106dd565b610224565b6100a86100a33660046106f8565b610296565b6040516100b5919061077b565b60405180910390f35b3480156100ca57600080fd5b506100d3610419565b60405173ffffffffffffffffffffffffffffffffffffffff90911681526020016100b5565b34801561010457600080fd5b5061006b6101133660046106dd565b6104b0565b34801561012457600080fd5b506100d3610517565b60006101577f360894a13ba1a3210667c828492db98dca3e2076cc3735a920a3ca505d382bbc5490565b905073ffffffffffffffffffffffffffffffffffffffff8116610201576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602560248201527f50726f78793a20696d706c656d656e746174696f6e206e6f7420696e6974696160448201527f6c697a656400000000000000000000000000000000000000000000000000000060648201526084015b60405180910390fd5b3660008037600080366000845af43d6000803e8061021e573d6000fd5b503d6000f35b7fb53127684a568b3173ae13b9f8a6016e243e63b6e8ee1178d6a717850b5d61035473ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff16148061027d575033155b1561028e5761028b816105a3565b50565b61028b61012d565b60606102c07fb53127684a568b3173ae13b9f8a6016e243e63b6e8ee1178d6a717850b5d61035490565b73ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff1614806102f7575033155b1561040a57610305846105a3565b6000808573ffffffffffffffffffffffffffffffffffffffff16858560405161032f9291906107ee565b600060405180830381855af49150503d806000811461036a576040519150601f19603f3d011682016040523d82523d6000602084013e61036f565b606091505b509150915081610401576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152603960248201527f50726f78793a2064656c656761746563616c6c20746f206e657720696d706c6560448201527f6d656e746174696f6e20636f6e7472616374206661696c65640000000000000060648201526084016101f8565b91506104129050565b61041261012d565b9392505050565b60006104437fb53127684a568b3173ae13b9f8a6016e243e63b6e8ee1178d6a717850b5d61035490565b73ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff16148061047a575033155b156104a557507f360894a13ba1a3210667c828492db98dca3e2076cc3735a920a3ca505d382bbc5490565b6104ad61012d565b90565b7fb53127684a568b3173ae13b9f8a6016e243e63b6e8ee1178d6a717850b5d61035473ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff161480610509575033155b1561028e5761028b8161060c565b60006105417fb53127684a568b3173ae13b9f8a6016e243e63b6e8ee1178d6a717850b5d61035490565b73ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff161480610578575033155b156104a557507fb53127684a568b3173ae13b9f8a6016e243e63b6e8ee1178d6a717850b5d61035490565b7f360894a13ba1a3210667c828492db98dca3e2076cc3735a920a3ca505d382bbc81815560405173ffffffffffffffffffffffffffffffffffffffff8316907fbc7cd75a20ee27fd9adebab32041f755214dbc6bffa90cc0225b39da2e5c2d3b90600090a25050565b60006106367fb53127684a568b3173ae13b9f8a6016e243e63b6e8ee1178d6a717850b5d61035490565b7fb53127684a568b3173ae13b9f8a6016e243e63b6e8ee1178d6a717850b5d61038381556040805173ffffffffffffffffffffffffffffffffffffffff80851682528616602082015292935090917f7e644d79422f17c01e4894b5f4f588d331ebfa28653d42ae832dc59e38c9798f910160405180910390a1505050565b803573ffffffffffffffffffffffffffffffffffffffff811681146106d857600080fd5b919050565b6000602082840312156106ef57600080fd5b610412826106b4565b60008060006040848603121561070d57600080fd5b610716846106b4565b9250602084013567ffffffffffffffff8082111561073357600080fd5b818601915086601f83011261074757600080fd5b81358181111561075657600080fd5b87602082850101111561076857600080fd5b6020830194508093505050509250925092565b600060208083528351808285015260005b818110156107a85785810183015185820160400152820161078c565b818111156107ba576000604083870101525b50601f017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe016929092016040019392505050565b818382376000910190815291905056fea164736f6c634300080f000a"; - bytes internal constant l2OutputOracleProxyCode = - hex"60806040526004361061005e5760003560e01c80635c60da1b116100435780635c60da1b146100be5780638f283970146100f8578063f851a440146101185761006d565b80633659cfe6146100755780634f1ef286146100955761006d565b3661006d5761006b61012d565b005b61006b61012d565b34801561008157600080fd5b5061006b6100903660046106dd565b610224565b6100a86100a33660046106f8565b610296565b6040516100b5919061077b565b60405180910390f35b3480156100ca57600080fd5b506100d3610419565b60405173ffffffffffffffffffffffffffffffffffffffff90911681526020016100b5565b34801561010457600080fd5b5061006b6101133660046106dd565b6104b0565b34801561012457600080fd5b506100d3610517565b60006101577f360894a13ba1a3210667c828492db98dca3e2076cc3735a920a3ca505d382bbc5490565b905073ffffffffffffffffffffffffffffffffffffffff8116610201576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602560248201527f50726f78793a20696d706c656d656e746174696f6e206e6f7420696e6974696160448201527f6c697a656400000000000000000000000000000000000000000000000000000060648201526084015b60405180910390fd5b3660008037600080366000845af43d6000803e8061021e573d6000fd5b503d6000f35b7fb53127684a568b3173ae13b9f8a6016e243e63b6e8ee1178d6a717850b5d61035473ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff16148061027d575033155b1561028e5761028b816105a3565b50565b61028b61012d565b60606102c07fb53127684a568b3173ae13b9f8a6016e243e63b6e8ee1178d6a717850b5d61035490565b73ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff1614806102f7575033155b1561040a57610305846105a3565b6000808573ffffffffffffffffffffffffffffffffffffffff16858560405161032f9291906107ee565b600060405180830381855af49150503d806000811461036a576040519150601f19603f3d011682016040523d82523d6000602084013e61036f565b606091505b509150915081610401576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152603960248201527f50726f78793a2064656c656761746563616c6c20746f206e657720696d706c6560448201527f6d656e746174696f6e20636f6e7472616374206661696c65640000000000000060648201526084016101f8565b91506104129050565b61041261012d565b9392505050565b60006104437fb53127684a568b3173ae13b9f8a6016e243e63b6e8ee1178d6a717850b5d61035490565b73ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff16148061047a575033155b156104a557507f360894a13ba1a3210667c828492db98dca3e2076cc3735a920a3ca505d382bbc5490565b6104ad61012d565b90565b7fb53127684a568b3173ae13b9f8a6016e243e63b6e8ee1178d6a717850b5d61035473ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff161480610509575033155b1561028e5761028b8161060c565b60006105417fb53127684a568b3173ae13b9f8a6016e243e63b6e8ee1178d6a717850b5d61035490565b73ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff161480610578575033155b156104a557507fb53127684a568b3173ae13b9f8a6016e243e63b6e8ee1178d6a717850b5d61035490565b7f360894a13ba1a3210667c828492db98dca3e2076cc3735a920a3ca505d382bbc81815560405173ffffffffffffffffffffffffffffffffffffffff8316907fbc7cd75a20ee27fd9adebab32041f755214dbc6bffa90cc0225b39da2e5c2d3b90600090a25050565b60006106367fb53127684a568b3173ae13b9f8a6016e243e63b6e8ee1178d6a717850b5d61035490565b7fb53127684a568b3173ae13b9f8a6016e243e63b6e8ee1178d6a717850b5d61038381556040805173ffffffffffffffffffffffffffffffffffffffff80851682528616602082015292935090917f7e644d79422f17c01e4894b5f4f588d331ebfa28653d42ae832dc59e38c9798f910160405180910390a1505050565b803573ffffffffffffffffffffffffffffffffffffffff811681146106d857600080fd5b919050565b6000602082840312156106ef57600080fd5b610412826106b4565b60008060006040848603121561070d57600080fd5b610716846106b4565b9250602084013567ffffffffffffffff8082111561073357600080fd5b818601915086601f83011261074757600080fd5b81358181111561075657600080fd5b87602082850101111561076857600080fd5b6020830194508093505050509250925092565b600060208083528351808285015260005b818110156107a85785810183015185820160400152820161078c565b818111156107ba576000604083870101525b50601f017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe016929092016040019392505050565b818382376000910190815291905056fea164736f6c634300080f000a"; bytes internal constant systemConfigProxyCode = hex"60806040526004361061005e5760003560e01c80635c60da1b116100435780635c60da1b146100be5780638f283970146100f8578063f851a440146101185761006d565b80633659cfe6146100755780634f1ef286146100955761006d565b3661006d5761006b61012d565b005b61006b61012d565b34801561008157600080fd5b5061006b6100903660046106dd565b610224565b6100a86100a33660046106f8565b610296565b6040516100b5919061077b565b60405180910390f35b3480156100ca57600080fd5b506100d3610419565b60405173ffffffffffffffffffffffffffffffffffffffff90911681526020016100b5565b34801561010457600080fd5b5061006b6101133660046106dd565b6104b0565b34801561012457600080fd5b506100d3610517565b60006101577f360894a13ba1a3210667c828492db98dca3e2076cc3735a920a3ca505d382bbc5490565b905073ffffffffffffffffffffffffffffffffffffffff8116610201576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602560248201527f50726f78793a20696d706c656d656e746174696f6e206e6f7420696e6974696160448201527f6c697a656400000000000000000000000000000000000000000000000000000060648201526084015b60405180910390fd5b3660008037600080366000845af43d6000803e8061021e573d6000fd5b503d6000f35b7fb53127684a568b3173ae13b9f8a6016e243e63b6e8ee1178d6a717850b5d61035473ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff16148061027d575033155b1561028e5761028b816105a3565b50565b61028b61012d565b60606102c07fb53127684a568b3173ae13b9f8a6016e243e63b6e8ee1178d6a717850b5d61035490565b73ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff1614806102f7575033155b1561040a57610305846105a3565b6000808573ffffffffffffffffffffffffffffffffffffffff16858560405161032f9291906107ee565b600060405180830381855af49150503d806000811461036a576040519150601f19603f3d011682016040523d82523d6000602084013e61036f565b606091505b509150915081610401576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152603960248201527f50726f78793a2064656c656761746563616c6c20746f206e657720696d706c6560448201527f6d656e746174696f6e20636f6e7472616374206661696c65640000000000000060648201526084016101f8565b91506104129050565b61041261012d565b9392505050565b60006104437fb53127684a568b3173ae13b9f8a6016e243e63b6e8ee1178d6a717850b5d61035490565b73ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff16148061047a575033155b156104a557507f360894a13ba1a3210667c828492db98dca3e2076cc3735a920a3ca505d382bbc5490565b6104ad61012d565b90565b7fb53127684a568b3173ae13b9f8a6016e243e63b6e8ee1178d6a717850b5d61035473ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff161480610509575033155b1561028e5761028b8161060c565b60006105417fb53127684a568b3173ae13b9f8a6016e243e63b6e8ee1178d6a717850b5d61035490565b73ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff161480610578575033155b156104a557507fb53127684a568b3173ae13b9f8a6016e243e63b6e8ee1178d6a717850b5d61035490565b7f360894a13ba1a3210667c828492db98dca3e2076cc3735a920a3ca505d382bbc81815560405173ffffffffffffffffffffffffffffffffffffffff8316907fbc7cd75a20ee27fd9adebab32041f755214dbc6bffa90cc0225b39da2e5c2d3b90600090a25050565b60006106367fb53127684a568b3173ae13b9f8a6016e243e63b6e8ee1178d6a717850b5d61035490565b7fb53127684a568b3173ae13b9f8a6016e243e63b6e8ee1178d6a717850b5d61038381556040805173ffffffffffffffffffffffffffffffffffffffff80851682528616602082015292935090917f7e644d79422f17c01e4894b5f4f588d331ebfa28653d42ae832dc59e38c9798f910160405180910390a1505050565b803573ffffffffffffffffffffffffffffffffffffffff811681146106d857600080fd5b919050565b6000602082840312156106ef57600080fd5b610412826106b4565b60008060006040848603121561070d57600080fd5b610716846106b4565b9250602084013567ffffffffffffffff8082111561073357600080fd5b818601915086601f83011261074757600080fd5b81358181111561075657600080fd5b87602082850101111561076857600080fd5b6020830194508093505050509250925092565b600060208083528351808285015260005b818110156107a85785810183015185820160400152820161078c565b818111156107ba576000604083870101525b50601f017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe016929092016040019392505050565b818382376000910190815291905056fea164736f6c634300080f000a"; bytes internal constant l1StandardBridgeProxyCode = hex"60806040526004361061005e5760003560e01c8063893d20e811610043578063893d20e8146100b55780639b0b0fda146100f3578063aaf10f42146101135761006d565b806313af4035146100755780636c5d4ad0146100955761006d565b3661006d5761006b610128565b005b61006b610128565b34801561008157600080fd5b5061006b6100903660046107a2565b6103cb565b3480156100a157600080fd5b5061006b6100b036600461080e565b61045c565b3480156100c157600080fd5b506100ca610611565b60405173ffffffffffffffffffffffffffffffffffffffff909116815260200160405180910390f35b3480156100ff57600080fd5b5061006b61010e3660046108dd565b6106a8565b34801561011f57600080fd5b506100ca610716565b60006101527fb53127684a568b3173ae13b9f8a6016e243e63b6e8ee1178d6a717850b5d61035490565b60408051600481526024810182526020810180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff167fb7947262000000000000000000000000000000000000000000000000000000001790529051919250600091829173ffffffffffffffffffffffffffffffffffffffff8516916101d4919061093a565b600060405180830381855afa9150503d806000811461020f576040519150601f19603f3d011682016040523d82523d6000602084013e610214565b606091505b5091509150818015610227575080516020145b156102d9576000818060200190518101906102429190610946565b905080156102d7576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152603560248201527f4c314368756753706c61736850726f78793a2073797374656d2069732063757260448201527f72656e746c79206265696e67207570677261646564000000000000000000000060648201526084015b60405180910390fd5b505b60006103037f360894a13ba1a3210667c828492db98dca3e2076cc3735a920a3ca505d382bbc5490565b905073ffffffffffffffffffffffffffffffffffffffff81166103a8576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152603060248201527f4c314368756753706c61736850726f78793a20696d706c656d656e746174696f60448201527f6e206973206e6f7420736574207965740000000000000000000000000000000060648201526084016102ce565b3660008037600080366000845af43d6000803e806103c5573d6000fd5b503d6000f35b7fb53127684a568b3173ae13b9f8a6016e243e63b6e8ee1178d6a717850b5d61035473ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff161480610424575033155b1561045457610451817fb53127684a568b3173ae13b9f8a6016e243e63b6e8ee1178d6a717850b5d610355565b50565b610451610128565b7fb53127684a568b3173ae13b9f8a6016e243e63b6e8ee1178d6a717850b5d61035473ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff1614806104b5575033155b156104545760006104e47f360894a13ba1a3210667c828492db98dca3e2076cc3735a920a3ca505d382bbc5490565b9050803f82516020840120036104f8575050565b60405160009061052e907f600d380380600d6000396000f30000000000000000000000000000000000000090859060200161095f565b604051602081830303815290604052905060008151602083016000f084516020860120909150813f146105e3576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152603260248201527f4c314368756753706c61736850726f78793a20636f646520776173206e6f742060448201527f636f72726563746c79206465706c6f796564000000000000000000000000000060648201526084016102ce565b61060b817f360894a13ba1a3210667c828492db98dca3e2076cc3735a920a3ca505d382bbc55565b50505050565b600061063b7fb53127684a568b3173ae13b9f8a6016e243e63b6e8ee1178d6a717850b5d61035490565b73ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff161480610672575033155b1561069d57507fb53127684a568b3173ae13b9f8a6016e243e63b6e8ee1178d6a717850b5d61035490565b6106a5610128565b90565b7fb53127684a568b3173ae13b9f8a6016e243e63b6e8ee1178d6a717850b5d61035473ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff161480610701575033155b1561070a579055565b610712610128565b5050565b60006107407fb53127684a568b3173ae13b9f8a6016e243e63b6e8ee1178d6a717850b5d61035490565b73ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff161480610777575033155b1561069d57507f360894a13ba1a3210667c828492db98dca3e2076cc3735a920a3ca505d382bbc5490565b6000602082840312156107b457600080fd5b813573ffffffffffffffffffffffffffffffffffffffff811681146107d857600080fd5b9392505050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b60006020828403121561082057600080fd5b813567ffffffffffffffff8082111561083857600080fd5b818401915084601f83011261084c57600080fd5b81358181111561085e5761085e6107df565b604051601f82017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0908116603f011681019083821181831017156108a4576108a46107df565b816040528281528760208487010111156108bd57600080fd5b826020860160208301376000928101602001929092525095945050505050565b600080604083850312156108f057600080fd5b50508035926020909101359150565b6000815160005b818110156109205760208185018101518683015201610906565b8181111561092f576000828601525b509290920192915050565b60006107d882846108ff565b60006020828403121561095857600080fd5b5051919050565b7fffffffffffffffffffffffffff00000000000000000000000000000000000000831681526000610993600d8301846108ff565b94935050505056fea164736f6c634300080f000a"; bytes internal constant l1CrossDomainMessengerProxyCode = hex"608060408181523060009081526001602090815282822054908290529181207fbf40fac1000000000000000000000000000000000000000000000000000000009093529173ffffffffffffffffffffffffffffffffffffffff9091169063bf40fac19061006d9060846101e2565b602060405180830381865afa15801561008a573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906100ae91906102c5565b905073ffffffffffffffffffffffffffffffffffffffff8116610157576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152603960248201527f5265736f6c76656444656c656761746550726f78793a2074617267657420616460448201527f6472657373206d75737420626520696e697469616c697a656400000000000000606482015260840160405180910390fd5b6000808273ffffffffffffffffffffffffffffffffffffffff16600036604051610182929190610302565b600060405180830381855af49150503d80600081146101bd576040519150601f19603f3d011682016040523d82523d6000602084013e6101c2565b606091505b5090925090508115156001036101da57805160208201f35b805160208201fd5b600060208083526000845481600182811c91508083168061020457607f831692505b858310810361023a577f4e487b710000000000000000000000000000000000000000000000000000000085526022600452602485fd5b878601838152602001818015610257576001811461028b576102b6565b7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff008616825284151560051b820196506102b6565b60008b81526020902060005b868110156102b057815484820152908501908901610297565b83019750505b50949998505050505050505050565b6000602082840312156102d757600080fd5b815173ffffffffffffffffffffffffffffffffffffffff811681146102fb57600080fd5b9392505050565b818382376000910190815291905056fea164736f6c634300080f000a"; + bytes internal constant optimismMintableERC20FactoryProxyCode = + hex"60806040526004361061005e5760003560e01c80635c60da1b116100435780635c60da1b146100be5780638f283970146100f8578063f851a440146101185761006d565b80633659cfe6146100755780634f1ef286146100955761006d565b3661006d5761006b61012d565b005b61006b61012d565b34801561008157600080fd5b5061006b6100903660046106dd565b610224565b6100a86100a33660046106f8565b610296565b6040516100b5919061077b565b60405180910390f35b3480156100ca57600080fd5b506100d3610419565b60405173ffffffffffffffffffffffffffffffffffffffff90911681526020016100b5565b34801561010457600080fd5b5061006b6101133660046106dd565b6104b0565b34801561012457600080fd5b506100d3610517565b60006101577f360894a13ba1a3210667c828492db98dca3e2076cc3735a920a3ca505d382bbc5490565b905073ffffffffffffffffffffffffffffffffffffffff8116610201576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602560248201527f50726f78793a20696d706c656d656e746174696f6e206e6f7420696e6974696160448201527f6c697a656400000000000000000000000000000000000000000000000000000060648201526084015b60405180910390fd5b3660008037600080366000845af43d6000803e8061021e573d6000fd5b503d6000f35b7fb53127684a568b3173ae13b9f8a6016e243e63b6e8ee1178d6a717850b5d61035473ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff16148061027d575033155b1561028e5761028b816105a3565b50565b61028b61012d565b60606102c07fb53127684a568b3173ae13b9f8a6016e243e63b6e8ee1178d6a717850b5d61035490565b73ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff1614806102f7575033155b1561040a57610305846105a3565b6000808573ffffffffffffffffffffffffffffffffffffffff16858560405161032f9291906107ee565b600060405180830381855af49150503d806000811461036a576040519150601f19603f3d011682016040523d82523d6000602084013e61036f565b606091505b509150915081610401576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152603960248201527f50726f78793a2064656c656761746563616c6c20746f206e657720696d706c6560448201527f6d656e746174696f6e20636f6e7472616374206661696c65640000000000000060648201526084016101f8565b91506104129050565b61041261012d565b9392505050565b60006104437fb53127684a568b3173ae13b9f8a6016e243e63b6e8ee1178d6a717850b5d61035490565b73ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff16148061047a575033155b156104a557507f360894a13ba1a3210667c828492db98dca3e2076cc3735a920a3ca505d382bbc5490565b6104ad61012d565b90565b7fb53127684a568b3173ae13b9f8a6016e243e63b6e8ee1178d6a717850b5d61035473ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff161480610509575033155b1561028e5761028b8161060c565b60006105417fb53127684a568b3173ae13b9f8a6016e243e63b6e8ee1178d6a717850b5d61035490565b73ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff161480610578575033155b156104a557507fb53127684a568b3173ae13b9f8a6016e243e63b6e8ee1178d6a717850b5d61035490565b7f360894a13ba1a3210667c828492db98dca3e2076cc3735a920a3ca505d382bbc81815560405173ffffffffffffffffffffffffffffffffffffffff8316907fbc7cd75a20ee27fd9adebab32041f755214dbc6bffa90cc0225b39da2e5c2d3b90600090a25050565b60006106367fb53127684a568b3173ae13b9f8a6016e243e63b6e8ee1178d6a717850b5d61035490565b7fb53127684a568b3173ae13b9f8a6016e243e63b6e8ee1178d6a717850b5d61038381556040805173ffffffffffffffffffffffffffffffffffffffff80851682528616602082015292935090917f7e644d79422f17c01e4894b5f4f588d331ebfa28653d42ae832dc59e38c9798f910160405180910390a1505050565b803573ffffffffffffffffffffffffffffffffffffffff811681146106d857600080fd5b919050565b6000602082840312156106ef57600080fd5b610412826106b4565b60008060006040848603121561070d57600080fd5b610716846106b4565b9250602084013567ffffffffffffffff8082111561073357600080fd5b818601915086601f83011261074757600080fd5b81358181111561075657600080fd5b87602082850101111561076857600080fd5b6020830194508093505050509250925092565b600060208083528351808285015260005b818110156107a85785810183015185820160400152820161078c565b818111156107ba576000604083870101525b50601f017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe016929092016040019392505050565b818382376000910190815291905056fea164736f6c634300080f000a"; bytes internal constant l1ERC721BridgeProxyCode = hex"60806040526004361061005e5760003560e01c80635c60da1b116100435780635c60da1b146100be5780638f283970146100f8578063f851a440146101185761006d565b80633659cfe6146100755780634f1ef286146100955761006d565b3661006d5761006b61012d565b005b61006b61012d565b34801561008157600080fd5b5061006b6100903660046106dd565b610224565b6100a86100a33660046106f8565b610296565b6040516100b5919061077b565b60405180910390f35b3480156100ca57600080fd5b506100d3610419565b60405173ffffffffffffffffffffffffffffffffffffffff90911681526020016100b5565b34801561010457600080fd5b5061006b6101133660046106dd565b6104b0565b34801561012457600080fd5b506100d3610517565b60006101577f360894a13ba1a3210667c828492db98dca3e2076cc3735a920a3ca505d382bbc5490565b905073ffffffffffffffffffffffffffffffffffffffff8116610201576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602560248201527f50726f78793a20696d706c656d656e746174696f6e206e6f7420696e6974696160448201527f6c697a656400000000000000000000000000000000000000000000000000000060648201526084015b60405180910390fd5b3660008037600080366000845af43d6000803e8061021e573d6000fd5b503d6000f35b7fb53127684a568b3173ae13b9f8a6016e243e63b6e8ee1178d6a717850b5d61035473ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff16148061027d575033155b1561028e5761028b816105a3565b50565b61028b61012d565b60606102c07fb53127684a568b3173ae13b9f8a6016e243e63b6e8ee1178d6a717850b5d61035490565b73ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff1614806102f7575033155b1561040a57610305846105a3565b6000808573ffffffffffffffffffffffffffffffffffffffff16858560405161032f9291906107ee565b600060405180830381855af49150503d806000811461036a576040519150601f19603f3d011682016040523d82523d6000602084013e61036f565b606091505b509150915081610401576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152603960248201527f50726f78793a2064656c656761746563616c6c20746f206e657720696d706c6560448201527f6d656e746174696f6e20636f6e7472616374206661696c65640000000000000060648201526084016101f8565b91506104129050565b61041261012d565b9392505050565b60006104437fb53127684a568b3173ae13b9f8a6016e243e63b6e8ee1178d6a717850b5d61035490565b73ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff16148061047a575033155b156104a557507f360894a13ba1a3210667c828492db98dca3e2076cc3735a920a3ca505d382bbc5490565b6104ad61012d565b90565b7fb53127684a568b3173ae13b9f8a6016e243e63b6e8ee1178d6a717850b5d61035473ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff161480610509575033155b1561028e5761028b8161060c565b60006105417fb53127684a568b3173ae13b9f8a6016e243e63b6e8ee1178d6a717850b5d61035490565b73ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff161480610578575033155b156104a557507fb53127684a568b3173ae13b9f8a6016e243e63b6e8ee1178d6a717850b5d61035490565b7f360894a13ba1a3210667c828492db98dca3e2076cc3735a920a3ca505d382bbc81815560405173ffffffffffffffffffffffffffffffffffffffff8316907fbc7cd75a20ee27fd9adebab32041f755214dbc6bffa90cc0225b39da2e5c2d3b90600090a25050565b60006106367fb53127684a568b3173ae13b9f8a6016e243e63b6e8ee1178d6a717850b5d61035490565b7fb53127684a568b3173ae13b9f8a6016e243e63b6e8ee1178d6a717850b5d61038381556040805173ffffffffffffffffffffffffffffffffffffffff80851682528616602082015292935090917f7e644d79422f17c01e4894b5f4f588d331ebfa28653d42ae832dc59e38c9798f910160405180910390a1505050565b803573ffffffffffffffffffffffffffffffffffffffff811681146106d857600080fd5b919050565b6000602082840312156106ef57600080fd5b610412826106b4565b60008060006040848603121561070d57600080fd5b610716846106b4565b9250602084013567ffffffffffffffff8082111561073357600080fd5b818601915086601f83011261074757600080fd5b81358181111561075657600080fd5b87602082850101111561076857600080fd5b6020830194508093505050509250925092565b600060208083528351808285015260005b818110156107a85785810183015185820160400152820161078c565b818111156107ba576000604083870101525b50601f017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe016929092016040019392505050565b818382376000910190815291905056fea164736f6c634300080f000a"; - bytes internal constant optimismPortalCode = - hex"6080604052600436106101635760003560e01c80638c3152e9116100c0578063b69ef8a811610074578063cff0ab9611610059578063cff0ab961461044e578063e965084c146104ef578063e9e05c421461057b57600080fd5b8063b69ef8a81461040b578063c0c53b8b1461042e57600080fd5b80639bf62d82116100a55780639bf62d8214610375578063a14238e7146103a2578063a35d99df146103d257600080fd5b80638c3152e9146103285780639b5f694a1461034857600080fd5b806354fd4d50116101175780636dbffb78116100fc5780636dbffb78146102e857806371cfaa3f146103085780638b4c40b01461018857600080fd5b806354fd4d501461026d5780635c975abb146102c357600080fd5b806335e80ab31161014857806335e80ab314610206578063452a9320146102385780634870496f1461024d57600080fd5b8063149f2f221461018f57806333d7e2bd146101af57600080fd5b3661018a576101883334620186a0600060405180602001604052806000815250610589565b005b600080fd5b34801561019b57600080fd5b506101886101aa366004614ba1565b61062e565b3480156101bb57600080fd5b506037546101dc9073ffffffffffffffffffffffffffffffffffffffff1681565b60405173ffffffffffffffffffffffffffffffffffffffff90911681526020015b60405180910390f35b34801561021257600080fd5b506035546101dc90610100900473ffffffffffffffffffffffffffffffffffffffff1681565b34801561024457600080fd5b506101dc61086f565b34801561025957600080fd5b50610188610268366004614cd5565b610907565b34801561027957600080fd5b506102b66040518060400160405280600581526020017f322e382e3000000000000000000000000000000000000000000000000000000081525081565b6040516101fd9190614e27565b3480156102cf57600080fd5b506102d8610eb4565b60405190151581526020016101fd565b3480156102f457600080fd5b506102d8610303366004614e3a565b610f47565b34801561031457600080fd5b50610188610323366004614e62565b611002565b34801561033457600080fd5b50610188610343366004614ea8565b6111c4565b34801561035457600080fd5b506036546101dc9073ffffffffffffffffffffffffffffffffffffffff1681565b34801561038157600080fd5b506032546101dc9073ffffffffffffffffffffffffffffffffffffffff1681565b3480156103ae57600080fd5b506102d86103bd366004614e3a565b60336020526000908152604090205460ff1681565b3480156103de57600080fd5b506103f26103ed366004614ee5565b611c46565b60405167ffffffffffffffff90911681526020016101fd565b34801561041757600080fd5b50610420611c5f565b6040519081526020016101fd565b34801561043a57600080fd5b50610188610449366004614f00565b611cb9565b34801561045a57600080fd5b506001546104b6906fffffffffffffffffffffffffffffffff81169067ffffffffffffffff7001000000000000000000000000000000008204811691780100000000000000000000000000000000000000000000000090041683565b604080516fffffffffffffffffffffffffffffffff909416845267ffffffffffffffff92831660208501529116908201526060016101fd565b3480156104fb57600080fd5b5061054d61050a366004614e3a565b603460205260009081526040902080546001909101546fffffffffffffffffffffffffffffffff8082169170010000000000000000000000000000000090041683565b604080519384526fffffffffffffffffffffffffffffffff92831660208501529116908201526060016101fd565b610188610589366004614f4b565b8260005a90506000610599611f23565b50905073ffffffffffffffffffffffffffffffffffffffff811673eeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeee148015906105d557503415155b1561060c576040517ff2365b5b00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b61061a883489898989611fc0565b50610625828261216c565b50505050505050565b8260005a9050600061063e611f23565b5090507fffffffffffffffffffffffff111111111111111111111111111111111111111273ffffffffffffffffffffffffffffffffffffffff8216016106b0576040517f0eaf3c0f00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b87603d60008282546106c29190614ff7565b90915550506040517f70a0823100000000000000000000000000000000000000000000000000000000815230600482015260009073ffffffffffffffffffffffffffffffffffffffff8316906370a0823190602401602060405180830381865afa158015610734573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610758919061500f565b905061077c73ffffffffffffffffffffffffffffffffffffffff831633308c612439565b6107868982614ff7565b6040517f70a0823100000000000000000000000000000000000000000000000000000000815230600482015273ffffffffffffffffffffffffffffffffffffffff8416906370a0823190602401602060405180830381865afa1580156107f0573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610814919061500f565b1461084b576040517f90b8ec1800000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6108598a8a8a8a8a8a611fc0565b5050610865828261216c565b5050505050505050565b6000603560019054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1663452a93206040518163ffffffff1660e01b8152600401602060405180830381865afa1580156108de573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906109029190615028565b905090565b61090f610eb4565b15610946576040517ff480973e00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b3073ffffffffffffffffffffffffffffffffffffffff16856040015173ffffffffffffffffffffffffffffffffffffffff16036109af576040517f13496fda00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6036546040517fa25ae5570000000000000000000000000000000000000000000000000000000081526004810186905260009173ffffffffffffffffffffffffffffffffffffffff169063a25ae55790602401606060405180830381865afa158015610a1f573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610a439190615065565b519050610a5d610a58368690038601866150ca565b612515565b8114610af0576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602960248201527f4f7074696d69736d506f7274616c3a20696e76616c6964206f7574707574207260448201527f6f6f742070726f6f66000000000000000000000000000000000000000000000060648201526084015b60405180910390fd5b6000610afb87612571565b6000818152603460209081526040918290208251606081018452815481526001909101546fffffffffffffffffffffffffffffffff8082169383018490527001000000000000000000000000000000009091041692810192909252919250901580610c115750805160365460408084015190517fa25ae5570000000000000000000000000000000000000000000000000000000081526fffffffffffffffffffffffffffffffff909116600482015273ffffffffffffffffffffffffffffffffffffffff9091169063a25ae55790602401606060405180830381865afa158015610be9573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610c0d9190615065565b5114155b610c9d576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152603760248201527f4f7074696d69736d506f7274616c3a207769746864726177616c20686173682060448201527f68617320616c7265616479206265656e2070726f76656e0000000000000000006064820152608401610ae7565b60408051602081018490526000918101829052606001604080517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe081840301815282825280516020918201209083018190529250610d669101604080517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0818403018152828201909152600182527f0100000000000000000000000000000000000000000000000000000000000000602083015290610d5c888a615130565b8a604001356125a1565b610df2576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152603260248201527f4f7074696d69736d506f7274616c3a20696e76616c696420776974686472617760448201527f616c20696e636c7573696f6e2070726f6f6600000000000000000000000000006064820152608401610ae7565b604080516060810182528581526fffffffffffffffffffffffffffffffff42811660208084019182528c831684860190815260008981526034835286812095518655925190518416700100000000000000000000000000000000029316929092176001909301929092558b830151908c0151925173ffffffffffffffffffffffffffffffffffffffff918216939091169186917f67a6208cfcc0801d50f6cbe764733f4fddf66ac0b04442061a8a8c0cb6b63f629190a4505050505050505050565b6000603560019054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16635c975abb6040518163ffffffff1660e01b8152600401602060405180830381865afa158015610f23573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061090291906151b4565b6036546040517fa25ae55700000000000000000000000000000000000000000000000000000000815260048101839052600091610ffc9173ffffffffffffffffffffffffffffffffffffffff9091169063a25ae55790602401606060405180830381865afa158015610fbd573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610fe19190615065565b602001516fffffffffffffffffffffffffffffffff166125c5565b92915050565b60375473ffffffffffffffffffffffffffffffffffffffff163314611053576040517f82b4290000000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b61105f62030d4061266b565b60405173ffffffffffffffffffffffffffffffffffffffff8516602482015260ff8416604482015260648101839052608481018290526000907342000000000000000000000000000000000000159073deaddeaddeaddeaddeaddeaddeaddeaddead0001907fb3813568d9991fc951961fcb4c784893574240a28925604d09fc577c55bb7c32908490819062030d4090829060a401604080517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0818403018152918152602080830180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff167f71cfaa3f00000000000000000000000000000000000000000000000000000000179052905161117c969594939291016151d1565b604080517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0818403018152908290526111b491614e27565b60405180910390a450505050565b565b6111cc610eb4565b15611203576040517ff480973e00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b60325473ffffffffffffffffffffffffffffffffffffffff1661dead14611256576040517f9396d15600000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b600061126182612571565b60008181526034602090815260408083208151606081018352815481526001909101546fffffffffffffffffffffffffffffffff8082169483018590527001000000000000000000000000000000009091041691810191909152929350900361134c576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152603260248201527f4f7074696d69736d506f7274616c3a207769746864726177616c20686173206e60448201527f6f74206265656e2070726f76656e2079657400000000000000000000000000006064820152608401610ae7565b603660009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1663887862726040518163ffffffff1660e01b8152600401602060405180830381865afa1580156113b9573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906113dd919061500f565b81602001516fffffffffffffffffffffffffffffffff1610156114a8576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152604b60248201527f4f7074696d69736d506f7274616c3a207769746864726177616c2074696d657360448201527f74616d70206c657373207468616e204c32204f7261636c65207374617274696e60648201527f672074696d657374616d70000000000000000000000000000000000000000000608482015260a401610ae7565b6114c781602001516fffffffffffffffffffffffffffffffff166125c5565b611579576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152604560248201527f4f7074696d69736d506f7274616c3a2070726f76656e2077697468647261776160448201527f6c2066696e616c697a6174696f6e20706572696f6420686173206e6f7420656c60648201527f6170736564000000000000000000000000000000000000000000000000000000608482015260a401610ae7565b60365460408281015190517fa25ae5570000000000000000000000000000000000000000000000000000000081526fffffffffffffffffffffffffffffffff909116600482015260009173ffffffffffffffffffffffffffffffffffffffff169063a25ae55790602401606060405180830381865afa158015611600573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906116249190615065565b82518151919250146116de576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152604960248201527f4f7074696d69736d506f7274616c3a206f757470757420726f6f742070726f7660448201527f656e206973206e6f74207468652073616d652061732063757272656e74206f7560648201527f7470757420726f6f740000000000000000000000000000000000000000000000608482015260a401610ae7565b6116fd81602001516fffffffffffffffffffffffffffffffff166125c5565b6117af576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152604360248201527f4f7074696d69736d506f7274616c3a206f75747075742070726f706f73616c2060448201527f66696e616c697a6174696f6e20706572696f6420686173206e6f7420656c617060648201527f7365640000000000000000000000000000000000000000000000000000000000608482015260a401610ae7565b60008381526033602052604090205460ff161561184e576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152603560248201527f4f7074696d69736d506f7274616c3a207769746864726177616c20686173206160448201527f6c7265616479206265656e2066696e616c697a656400000000000000000000006064820152608401610ae7565b6000838152603360209081526040822080547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff001660011790558501516032805473ffffffffffffffffffffffffffffffffffffffff9092167fffffffffffffffffffffffff0000000000000000000000000000000000000000909216919091179055806118d9611f23565b5090507fffffffffffffffffffffffff111111111111111111111111111111111111111273ffffffffffffffffffffffffffffffffffffffff82160161193c576119358660400151876080015188606001518960a001516126cd565b9150611b8f565b8073ffffffffffffffffffffffffffffffffffffffff16866040015173ffffffffffffffffffffffffffffffffffffffff16036119a5576040517f13496fda00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b606086015115611b66578560600151603d60008282546119c59190615236565b90915550506040517f70a0823100000000000000000000000000000000000000000000000000000000815230600482015260009073ffffffffffffffffffffffffffffffffffffffff8316906370a0823190602401602060405180830381865afa158015611a37573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611a5b919061500f565b9050611a90876040015188606001518473ffffffffffffffffffffffffffffffffffffffff1661272b9092919063ffffffff16565b6060870151611a9f9082615236565b6040517f70a0823100000000000000000000000000000000000000000000000000000000815230600482015273ffffffffffffffffffffffffffffffffffffffff8416906370a0823190602401602060405180830381865afa158015611b09573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611b2d919061500f565b14611b64576040517f90b8ec1800000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b505b60a08601515115611b8a576119358660400151876080015160008960a001516126cd565b600191505b603280547fffffffffffffffffffffffff00000000000000000000000000000000000000001661dead17905560405185907fdb5c7652857aa163daadd670e116628fb42e869d8ac4251ef8971d9e5727df1b90611bf190851515815260200190565b60405180910390a281158015611c075750326001145b15611c3e576040517feeae4ed300000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b505050505050565b6000611c5382601061524d565b610ffc9061520861527d565b600080611c6a611f23565b5090507fffffffffffffffffffffffff111111111111111111111111111111111111111273ffffffffffffffffffffffffffffffffffffffff821601611cb1574791505090565b5050603d5490565b600054610100900460ff1615808015611cd95750600054600160ff909116105b80611cf35750303b158015611cf3575060005460ff166001145b611d7f576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602e60248201527f496e697469616c697a61626c653a20636f6e747261637420697320616c72656160448201527f647920696e697469616c697a65640000000000000000000000000000000000006064820152608401610ae7565b600080547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff001660011790558015611ddd57600080547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00ff166101001790555b603680547fffffffffffffffffffffffff000000000000000000000000000000000000000090811673ffffffffffffffffffffffffffffffffffffffff8781169190911790925560378054909116858316179055603580547fffffffffffffffffffffff0000000000000000000000000000000000000000ff166101008584160217905560325416611e9657603280547fffffffffffffffffffffffff00000000000000000000000000000000000000001661dead1790555b611e9e612786565b8015611f0157600080547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00ff169055604051600181527f7f26b83ff96e1f2b6a682f133852f6798a09c465da95921460cefb38474024989060200160405180910390a15b50505050565b73ffffffffffffffffffffffffffffffffffffffff163b151590565b603754604080517f4397dfef0000000000000000000000000000000000000000000000000000000081528151600093849373ffffffffffffffffffffffffffffffffffffffff90911692634397dfef92600480830193928290030181865afa158015611f93573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611fb791906152a9565b90939092509050565b818015611fe2575073ffffffffffffffffffffffffffffffffffffffff861615155b15612019576040517f13496fda00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6120238151611c46565b67ffffffffffffffff168367ffffffffffffffff161015612070576040517f4929b80800000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6201d4c0815111156120ae576040517f73052b0f00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b333281146120cf575033731111000000000000000000000000000000001111015b600086868686866040516020016120ea9594939291906151d1565b604051602081830303815290604052905060008873ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff167fb3813568d9991fc951961fcb4c784893574240a28925604d09fc577c55bb7c328460405161215a9190614e27565b60405180910390a45050505050505050565b6001546000906121a2907801000000000000000000000000000000000000000000000000900467ffffffffffffffff1643615236565b905060006121ae612899565b90506000816020015160ff16826000015163ffffffff166121cf9190615312565b9050821561230657600154600090612206908390700100000000000000000000000000000000900467ffffffffffffffff1661537a565b90506000836040015160ff168361221d91906153ee565b60015461223d9084906fffffffffffffffffffffffffffffffff166153ee565b6122479190615312565b600154909150600090612298906122719084906fffffffffffffffffffffffffffffffff166154aa565b866060015163ffffffff168760a001516fffffffffffffffffffffffffffffffff1661295a565b905060018611156122c7576122c461227182876040015160ff1660018a6122bf9190615236565b612979565b90505b6fffffffffffffffffffffffffffffffff16780100000000000000000000000000000000000000000000000067ffffffffffffffff4316021760015550505b60018054869190601090612339908490700100000000000000000000000000000000900467ffffffffffffffff1661527d565b92506101000a81548167ffffffffffffffff021916908367ffffffffffffffff160217905550816000015163ffffffff16600160000160109054906101000a900467ffffffffffffffff1667ffffffffffffffff1613156123c6576040517f77ebef4d00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6001546000906123f2906fffffffffffffffffffffffffffffffff1667ffffffffffffffff881661551e565b9050600061240448633b9aca006129ce565b61240e908361555b565b905060005a61241d9088615236565b905080821115610865576108656124348284615236565b6129e5565b60405173ffffffffffffffffffffffffffffffffffffffff80851660248301528316604482015260648101829052611f019085907f23b872dd00000000000000000000000000000000000000000000000000000000906084015b604080517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe08184030181529190526020810180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff167fffffffff0000000000000000000000000000000000000000000000000000000090931692909217909152612a0e565b60008160000151826020015183604001518460600151604051602001612554949392919093845260208401929092526040830152606082015260800190565b604051602081830303815290604052805190602001209050919050565b80516020808301516040808501516060860151608087015160a0880151935160009761255497909695910161556f565b6000806125ad86612b1a565b90506125bb81868686612b4c565b9695505050505050565b603654604080517ff4daa291000000000000000000000000000000000000000000000000000000008152905160009273ffffffffffffffffffffffffffffffffffffffff169163f4daa2919160048083019260209291908290030181865afa158015612635573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190612659919061500f565b6126639083614ff7565b421192915050565b6001805463ffffffff831691906010906126a4908490700100000000000000000000000000000000900467ffffffffffffffff1661527d565b92506101000a81548167ffffffffffffffff021916908367ffffffffffffffff16021790555050565b60008060006126dd866000612b7c565b905080612713576308c379a06000526020805278185361666543616c6c3a204e6f7420656e6f756768206761736058526064601cfd5b600080855160208701888b5af1979650505050505050565b60405173ffffffffffffffffffffffffffffffffffffffff83166024820152604481018290526127819084907fa9059cbb0000000000000000000000000000000000000000000000000000000090606401612493565b505050565b600054610100900460ff1661281d576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602b60248201527f496e697469616c697a61626c653a20636f6e7472616374206973206e6f74206960448201527f6e697469616c697a696e670000000000000000000000000000000000000000006064820152608401610ae7565b6001547801000000000000000000000000000000000000000000000000900467ffffffffffffffff166000036111c25760408051606081018252633b9aca00808252600060208301524367ffffffffffffffff169190920181905278010000000000000000000000000000000000000000000000000217600155565b6040805160c08082018352600080835260208301819052828401819052606083018190526080830181905260a083015260375483517fcc731b020000000000000000000000000000000000000000000000000000000081529351929373ffffffffffffffffffffffffffffffffffffffff9091169263cc731b02926004808401939192918290030181865afa158015612936573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061090291906155da565b600061296f6129698585612b9a565b83612baa565b90505b9392505050565b6000670de0b6b3a76400006129ba6129918583615312565b6129a390670de0b6b3a764000061537a565b6129b585670de0b6b3a76400006153ee565b612bb9565b6129c490866153ee565b61296f9190615312565b6000818310156129de5781612972565b5090919050565b6000805a90505b825a6129f89083615236565b101561278157612a078261567d565b91506129ec565b6000612a70826040518060400160405280602081526020017f5361666545524332303a206c6f772d6c6576656c2063616c6c206661696c65648152508573ffffffffffffffffffffffffffffffffffffffff16612bea9092919063ffffffff16565b8051909150156127815780806020019051810190612a8e91906151b4565b612781576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602a60248201527f5361666545524332303a204552433230206f7065726174696f6e20646964206e60448201527f6f742073756363656564000000000000000000000000000000000000000000006064820152608401610ae7565b60608180519060200120604051602001612b3691815260200190565b6040516020818303038152906040529050919050565b6000612b7384612b5d878686612bf9565b8051602091820120825192909101919091201490565b95945050505050565b600080603f83619c4001026040850201603f5a021015949350505050565b6000818312156129de5781612972565b60008183126129de5781612972565b6000612972670de0b6b3a764000083612bd186613677565b612bdb91906153ee565b612be59190615312565b6138bb565b606061296f8484600085613afa565b60606000845111612c66576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601560248201527f4d65726b6c65547269653a20656d707479206b657900000000000000000000006044820152606401610ae7565b6000612c7184613c90565b90506000612c7e86613d7c565b9050600084604051602001612c9591815260200190565b60405160208183030381529060405290506000805b84518110156135ee576000858281518110612cc757612cc76156b5565b602002602001015190508451831115612d62576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602e60248201527f4d65726b6c65547269653a206b657920696e646578206578636565647320746f60448201527f74616c206b6579206c656e6774680000000000000000000000000000000000006064820152608401610ae7565b82600003612e1b5780518051602091820120604051612db092612d8a92910190815260200190565b604051602081830303815290604052858051602091820120825192909101919091201490565b612e16576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601d60248201527f4d65726b6c65547269653a20696e76616c696420726f6f7420686173680000006044820152606401610ae7565b612f72565b805151602011612ed15780518051602091820120604051612e4592612d8a92910190815260200190565b612e16576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602760248201527f4d65726b6c65547269653a20696e76616c6964206c6172676520696e7465726e60448201527f616c2068617368000000000000000000000000000000000000000000000000006064820152608401610ae7565b805184516020808701919091208251919092012014612f72576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602660248201527f4d65726b6c65547269653a20696e76616c696420696e7465726e616c206e6f6460448201527f65206861736800000000000000000000000000000000000000000000000000006064820152608401610ae7565b612f7e60106001614ff7565b8160200151510361315a57845183036130f257612fb88160200151601081518110612fab57612fab6156b5565b6020026020010151613ddf565b9650600087511161304b576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152603b60248201527f4d65726b6c65547269653a2076616c7565206c656e677468206d75737420626560448201527f2067726561746572207468616e207a65726f20286272616e63682900000000006064820152608401610ae7565b600186516130599190615236565b82146130e7576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152603a60248201527f4d65726b6c65547269653a2076616c7565206e6f6465206d757374206265206c60448201527f617374206e6f646520696e2070726f6f6620286272616e6368290000000000006064820152608401610ae7565b505050505050612972565b6000858481518110613106576131066156b5565b602001015160f81c60f81b60f81c9050600082602001518260ff1681518110613131576131316156b5565b6020026020010151905061314481613e93565b9550613151600186614ff7565b945050506135db565b60028160200151510361355357600061317282613eb8565b9050600081600081518110613189576131896156b5565b016020015160f81c905060006131a06002836156e4565b6131ab906002615706565b905060006131bc848360ff16613edc565b905060006131ca8a89613edc565b905060006131d88383613f12565b90508083511461326a576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152603a60248201527f4d65726b6c65547269653a20706174682072656d61696e646572206d7573742060448201527f736861726520616c6c206e6962626c65732077697468206b65790000000000006064820152608401610ae7565b60ff85166002148061327f575060ff85166003145b1561346e5780825114613314576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152603d60248201527f4d65726b6c65547269653a206b65792072656d61696e646572206d757374206260448201527f65206964656e746963616c20746f20706174682072656d61696e6465720000006064820152608401610ae7565b61332e8760200151600181518110612fab57612fab6156b5565b9c5060008d51116133c1576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152603960248201527f4d65726b6c65547269653a2076616c7565206c656e677468206d75737420626560448201527f2067726561746572207468616e207a65726f20286c65616629000000000000006064820152608401610ae7565b60018c516133cf9190615236565b881461345d576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152603860248201527f4d65726b6c65547269653a2076616c7565206e6f6465206d757374206265206c60448201527f617374206e6f646520696e2070726f6f6620286c6561662900000000000000006064820152608401610ae7565b505050505050505050505050612972565b60ff85161580613481575060ff85166001145b156134c0576134ad87602001516001815181106134a0576134a06156b5565b6020026020010151613e93565b99506134b9818a614ff7565b9850613548565b6040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152603260248201527f4d65726b6c65547269653a2072656365697665642061206e6f6465207769746860448201527f20616e20756e6b6e6f776e2070726566697800000000000000000000000000006064820152608401610ae7565b5050505050506135db565b6040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602860248201527f4d65726b6c65547269653a20726563656976656420616e20756e70617273656160448201527f626c65206e6f64650000000000000000000000000000000000000000000000006064820152608401610ae7565b50806135e68161567d565b915050612caa565b506040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602560248201527f4d65726b6c65547269653a2072616e206f7574206f662070726f6f6620656c6560448201527f6d656e74730000000000000000000000000000000000000000000000000000006064820152608401610ae7565b60008082136136e2576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152600960248201527f554e444546494e454400000000000000000000000000000000000000000000006044820152606401610ae7565b600060606136ef84613fc6565b03609f8181039490941b90931c6c465772b2bbbb5f824b15207a3081018102606090811d6d0388eaa27412d5aca026815d636e018202811d6d0df99ac502031bf953eff472fdcc018202811d6d13cdffb29d51d99322bdff5f2211018202811d6d0a0f742023def783a307a986912e018202811d6d01920d8043ca89b5239253284e42018202811d6c0b7a86d7375468fac667a0a527016c29508e458543d8aa4df2abee7883018302821d6d0139601a2efabe717e604cbb4894018302821d6d02247f7a7b6594320649aa03aba1018302821d7fffffffffffffffffffffffffffffffffffffff73c0c716a594e00d54e3c4cbc9018302821d7ffffffffffffffffffffffffffffffffffffffdc7b88c420e53a9890533129f6f01830290911d7fffffffffffffffffffffffffffffffffffffff465fda27eb4d63ded474e5f832019091027ffffffffffffffff5f6af8f7b3396644f18e157960000000000000000000000000105711340daa0d5f769dba1915cef59f0815a5506027d0267a36c0c95b3975ab3ee5b203a7614a3f75373f047d803ae7b6687f2b393909302929092017d57115e47018c7177eebf7cd370a3356a1b7863008a5ae8028c72b88642840160ae1d92915050565b60007ffffffffffffffffffffffffffffffffffffffffffffffffdb731c958f34d94c182136138ec57506000919050565b680755bf798b4a1bf1e5821261395e576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152600c60248201527f4558505f4f564552464c4f5700000000000000000000000000000000000000006044820152606401610ae7565b6503782dace9d9604e83901b059150600060606bb17217f7d1cf79abc9e3b39884821b056b80000000000000000000000001901d6bb17217f7d1cf79abc9e3b39881029093037fffffffffffffffffffffffffffffffffffffffdbf3ccf1604d263450f02a550481018102606090811d6d0277594991cfc85f6e2461837cd9018202811d7fffffffffffffffffffffffffffffffffffffe5adedaa1cb095af9e4da10e363c018202811d6db1bbb201f443cf962f1a1d3db4a5018202811d7ffffffffffffffffffffffffffffffffffffd38dc772608b0ae56cce01296c0eb018202811d6e05180bb14799ab47a8a8cb2a527d57016d02d16720577bd19bf614176fe9ea6c10fe68e7fd37d0007b713f765084018402831d9081019084017ffffffffffffffffffffffffffffffffffffffe2c69812cf03b0763fd454a8f7e010290911d6e0587f503bb6ea29d25fcb7401964500190910279d835ebba824c98fb31b83b2ca45c000000000000000000000000010574029d9dc38563c32e5c2f6dc192ee70ef65f9978af30260c3939093039290921c92915050565b606082471015613b8c576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602660248201527f416464726573733a20696e73756666696369656e742062616c616e636520666f60448201527f722063616c6c00000000000000000000000000000000000000000000000000006064820152608401610ae7565b73ffffffffffffffffffffffffffffffffffffffff85163b613c0a576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601d60248201527f416464726573733a2063616c6c20746f206e6f6e2d636f6e74726163740000006044820152606401610ae7565b6000808673ffffffffffffffffffffffffffffffffffffffff168587604051613c339190615729565b60006040518083038185875af1925050503d8060008114613c70576040519150601f19603f3d011682016040523d82523d6000602084013e613c75565b606091505b5091509150613c8582828661409c565b979650505050505050565b80516060908067ffffffffffffffff811115613cae57613cae614a95565b604051908082528060200260200182016040528015613cf357816020015b6040805180820190915260608082526020820152815260200190600190039081613ccc5790505b50915060005b81811015613d75576040518060400160405280858381518110613d1e57613d1e6156b5565b60200260200101518152602001613d4d868481518110613d4057613d406156b5565b60200260200101516140ef565b815250838281518110613d6257613d626156b5565b6020908102919091010152600101613cf9565b5050919050565b606080604051905082518060011b603f8101601f1916830160405280835250602084016020830160005b83811015613dd4578060011b82018184015160001a8060041c8253600f811660018301535050600101613da6565b509295945050505050565b60606000806000613def85614102565b919450925090506000816001811115613e0a57613e0a615745565b14613e41576040517f1ff9b2e400000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b613e4b8284614ff7565b855114613e84576040517f5c5537b800000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b612b73856020015184846145a0565b60606020826000015110613eaf57613eaa82613ddf565b610ffc565b610ffc82614634565b6060610ffc613ed78360200151600081518110612fab57612fab6156b5565b613d7c565b606082518210613efb5750604080516020810190915260008152610ffc565b6129728383848651613f0d9190615236565b61464a565b6000808251845110613f25578251613f28565b83515b90505b8082108015613faf5750828281518110613f4757613f476156b5565b602001015160f81c60f81b7effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916848381518110613f8657613f866156b5565b01602001517fff0000000000000000000000000000000000000000000000000000000000000016145b15613fbf57816001019150613f2b565b5092915050565b6000808211614031576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152600960248201527f554e444546494e454400000000000000000000000000000000000000000000006044820152606401610ae7565b5060016fffffffffffffffffffffffffffffffff821160071b82811c67ffffffffffffffff1060061b1782811c63ffffffff1060051b1782811c61ffff1060041b1782811c60ff10600390811b90911783811c600f1060021b1783811c909110821b1791821c111790565b606083156140ab575081612972565b8251156140bb5782518084602001fd5b816040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610ae79190614e27565b6060610ffc6140fd83614822565b61488f565b60008060008360000151600003614145576040517f5ab458fb00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6020840151805160001a607f811161416a576000600160009450945094505050614599565b60b7811161428057600061417f608083615236565b9050808760000151116141be576040517f66c9448500000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6001838101517fff0000000000000000000000000000000000000000000000000000000000000016908214801561423657507f80000000000000000000000000000000000000000000000000000000000000007fff000000000000000000000000000000000000000000000000000000000000008216105b1561426d576040517fbabb01dd00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b5060019550935060009250614599915050565b60bf81116143de57600061429560b783615236565b9050808760000151116142d4576040517f66c9448500000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b60018301517fff00000000000000000000000000000000000000000000000000000000000000166000819003614336576040517fbabb01dd00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b600184015160088302610100031c6037811161437e576040517fbabb01dd00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6143888184614ff7565b8951116143c1576040517f66c9448500000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6143cc836001614ff7565b97509550600094506145999350505050565b60f781116144435760006143f360c083615236565b905080876000015111614432576040517f66c9448500000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b600195509350849250614599915050565b600061445060f783615236565b90508087600001511161448f576040517f66c9448500000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b60018301517fff000000000000000000000000000000000000000000000000000000000000001660008190036144f1576040517fbabb01dd00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b600184015160088302610100031c60378111614539576040517fbabb01dd00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6145438184614ff7565b89511161457c576040517f66c9448500000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b614587836001614ff7565b97509550600194506145999350505050565b9193909250565b60608167ffffffffffffffff8111156145bb576145bb614a95565b6040519080825280601f01601f1916602001820160405280156145e5576020820181803683370190505b50905081156129725760006145fa8486614ff7565b90506020820160005b8481101561461b578281015182820152602001614603565b8481111561462a576000858301525b5050509392505050565b6060610ffc8260200151600084600001516145a0565b60608182601f0110156146b9576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152600e60248201527f736c6963655f6f766572666c6f770000000000000000000000000000000000006044820152606401610ae7565b828284011015614725576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152600e60248201527f736c6963655f6f766572666c6f770000000000000000000000000000000000006044820152606401610ae7565b81830184511015614792576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601160248201527f736c6963655f6f75744f66426f756e64730000000000000000000000000000006044820152606401610ae7565b6060821580156147b15760405191506000825260208201604052614819565b6040519150601f8416801560200281840101858101878315602002848b0101015b818310156147ea5780518352602092830192016147d2565b5050858452601f017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe016604052505b50949350505050565b60408051808201909152600080825260208201528151600003614871576040517f5ab458fb00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b50604080518082019091528151815260209182019181019190915290565b6060600080600061489f85614102565b9194509250905060018160018111156148ba576148ba615745565b146148f1576040517f4b9c6abe00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b84516148fd8385614ff7565b14614934576040517f5c5537b800000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b604080516020808252610420820190925290816020015b604080518082019091526000808252602082015281526020019060019003908161494b5790505093506000835b8651811015614a39576000806149be6040518060400160405280858c600001516149a29190615236565b8152602001858c602001516149b79190614ff7565b9052614102565b5091509150604051806040016040528083836149da9190614ff7565b8152602001848b602001516149ef9190614ff7565b815250888581518110614a0457614a046156b5565b6020908102919091010152614a1a600185614ff7565b9350614a268183614ff7565b614a309084614ff7565b92505050614978565b50845250919392505050565b73ffffffffffffffffffffffffffffffffffffffff81168114614a6757600080fd5b50565b803567ffffffffffffffff81168114614a8257600080fd5b919050565b8015158114614a6757600080fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b604051601f82017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe016810167ffffffffffffffff81118282101715614b0b57614b0b614a95565b604052919050565b600082601f830112614b2457600080fd5b813567ffffffffffffffff811115614b3e57614b3e614a95565b614b6f60207fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0601f84011601614ac4565b818152846020838601011115614b8457600080fd5b816020850160208301376000918101602001919091529392505050565b60008060008060008060c08789031215614bba57600080fd5b8635614bc581614a45565b95506020870135945060408701359350614be160608801614a6a565b92506080870135614bf181614a87565b915060a087013567ffffffffffffffff811115614c0d57600080fd5b614c1989828a01614b13565b9150509295509295509295565b600060c08284031215614c3857600080fd5b60405160c0810167ffffffffffffffff8282108183111715614c5c57614c5c614a95565b816040528293508435835260208501359150614c7782614a45565b81602084015260408501359150614c8d82614a45565b816040840152606085013560608401526080850135608084015260a0850135915080821115614cbb57600080fd5b50614cc885828601614b13565b60a0830152505092915050565b600080600080600085870360e0811215614cee57600080fd5b863567ffffffffffffffff80821115614d0657600080fd5b614d128a838b01614c26565b97506020890135965060807fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc084011215614d4b57600080fd5b60408901955060c0890135925080831115614d6557600080fd5b828901925089601f840112614d7957600080fd5b8235915080821115614d8a57600080fd5b508860208260051b8401011115614da057600080fd5b959894975092955050506020019190565b60005b83811015614dcc578181015183820152602001614db4565b83811115611f015750506000910152565b60008151808452614df5816020860160208601614db1565b601f017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0169290920160200192915050565b6020815260006129726020830184614ddd565b600060208284031215614e4c57600080fd5b5035919050565b60ff81168114614a6757600080fd5b60008060008060808587031215614e7857600080fd5b8435614e8381614a45565b93506020850135614e9381614e53565b93969395505050506040820135916060013590565b600060208284031215614eba57600080fd5b813567ffffffffffffffff811115614ed157600080fd5b614edd84828501614c26565b949350505050565b600060208284031215614ef757600080fd5b61297282614a6a565b600080600060608486031215614f1557600080fd5b8335614f2081614a45565b92506020840135614f3081614a45565b91506040840135614f4081614a45565b809150509250925092565b600080600080600060a08688031215614f6357600080fd5b8535614f6e81614a45565b945060208601359350614f8360408701614a6a565b92506060860135614f9381614a87565b9150608086013567ffffffffffffffff811115614faf57600080fd5b614fbb88828901614b13565b9150509295509295909350565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b6000821982111561500a5761500a614fc8565b500190565b60006020828403121561502157600080fd5b5051919050565b60006020828403121561503a57600080fd5b815161297281614a45565b80516fffffffffffffffffffffffffffffffff81168114614a8257600080fd5b60006060828403121561507757600080fd5b6040516060810181811067ffffffffffffffff8211171561509a5761509a614a95565b604052825181526150ad60208401615045565b60208201526150be60408401615045565b60408201529392505050565b6000608082840312156150dc57600080fd5b6040516080810181811067ffffffffffffffff821117156150ff576150ff614a95565b8060405250823581526020830135602082015260408301356040820152606083013560608201528091505092915050565b600067ffffffffffffffff8084111561514b5761514b614a95565b8360051b602061515c818301614ac4565b86815291850191818101903684111561517457600080fd5b865b848110156151a85780358681111561518e5760008081fd5b61519a36828b01614b13565b845250918301918301615176565b50979650505050505050565b6000602082840312156151c657600080fd5b815161297281614a87565b8581528460208201527fffffffffffffffff0000000000000000000000000000000000000000000000008460c01b16604082015282151560f81b604882015260008251615225816049850160208701614db1565b919091016049019695505050505050565b60008282101561524857615248614fc8565b500390565b600067ffffffffffffffff8083168185168183048111821515161561527457615274614fc8565b02949350505050565b600067ffffffffffffffff8083168185168083038211156152a0576152a0614fc8565b01949350505050565b600080604083850312156152bc57600080fd5b82516152c781614a45565b60208401519092506152d881614e53565b809150509250929050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601260045260246000fd5b600082615321576153216152e3565b7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff83147f80000000000000000000000000000000000000000000000000000000000000008314161561537557615375614fc8565b500590565b6000808312837f8000000000000000000000000000000000000000000000000000000000000000018312811516156153b4576153b4614fc8565b837f7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0183138116156153e8576153e8614fc8565b50500390565b60007f7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff60008413600084138583048511828216161561542f5761542f614fc8565b7f8000000000000000000000000000000000000000000000000000000000000000600087128682058812818416161561546a5761546a614fc8565b6000871292508782058712848416161561548657615486614fc8565b8785058712818416161561549c5761549c614fc8565b505050929093029392505050565b6000808212827f7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff038413811516156154e4576154e4614fc8565b827f800000000000000000000000000000000000000000000000000000000000000003841281161561551857615518614fc8565b50500190565b6000817fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff048311821515161561555657615556614fc8565b500290565b60008261556a5761556a6152e3565b500490565b868152600073ffffffffffffffffffffffffffffffffffffffff808816602084015280871660408401525084606083015283608083015260c060a08301526155ba60c0830184614ddd565b98975050505050505050565b805163ffffffff81168114614a8257600080fd5b600060c082840312156155ec57600080fd5b60405160c0810181811067ffffffffffffffff8211171561560f5761560f614a95565b60405261561b836155c6565b8152602083015161562b81614e53565b6020820152604083015161563e81614e53565b604082015261564f606084016155c6565b6060820152615660608084016155c6565b608082015261567160a08401615045565b60a08201529392505050565b60007fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff82036156ae576156ae614fc8565b5060010190565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b600060ff8316806156f7576156f76152e3565b8060ff84160691505092915050565b600060ff821660ff84168082101561572057615720614fc8565b90039392505050565b6000825161573b818460208701614db1565b9190910192915050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602160045260246000fdfea164736f6c634300080f000a"; + bytes internal constant disputeGameFactoryProxyCode = + hex"60806040526004361061005e5760003560e01c80635c60da1b116100435780635c60da1b146100be5780638f283970146100f8578063f851a440146101185761006d565b80633659cfe6146100755780634f1ef286146100955761006d565b3661006d5761006b61012d565b005b61006b61012d565b34801561008157600080fd5b5061006b6100903660046106dd565b610224565b6100a86100a33660046106f8565b610296565b6040516100b5919061077b565b60405180910390f35b3480156100ca57600080fd5b506100d3610419565b60405173ffffffffffffffffffffffffffffffffffffffff90911681526020016100b5565b34801561010457600080fd5b5061006b6101133660046106dd565b6104b0565b34801561012457600080fd5b506100d3610517565b60006101577f360894a13ba1a3210667c828492db98dca3e2076cc3735a920a3ca505d382bbc5490565b905073ffffffffffffffffffffffffffffffffffffffff8116610201576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602560248201527f50726f78793a20696d706c656d656e746174696f6e206e6f7420696e6974696160448201527f6c697a656400000000000000000000000000000000000000000000000000000060648201526084015b60405180910390fd5b3660008037600080366000845af43d6000803e8061021e573d6000fd5b503d6000f35b7fb53127684a568b3173ae13b9f8a6016e243e63b6e8ee1178d6a717850b5d61035473ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff16148061027d575033155b1561028e5761028b816105a3565b50565b61028b61012d565b60606102c07fb53127684a568b3173ae13b9f8a6016e243e63b6e8ee1178d6a717850b5d61035490565b73ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff1614806102f7575033155b1561040a57610305846105a3565b6000808573ffffffffffffffffffffffffffffffffffffffff16858560405161032f9291906107ee565b600060405180830381855af49150503d806000811461036a576040519150601f19603f3d011682016040523d82523d6000602084013e61036f565b606091505b509150915081610401576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152603960248201527f50726f78793a2064656c656761746563616c6c20746f206e657720696d706c6560448201527f6d656e746174696f6e20636f6e7472616374206661696c65640000000000000060648201526084016101f8565b91506104129050565b61041261012d565b9392505050565b60006104437fb53127684a568b3173ae13b9f8a6016e243e63b6e8ee1178d6a717850b5d61035490565b73ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff16148061047a575033155b156104a557507f360894a13ba1a3210667c828492db98dca3e2076cc3735a920a3ca505d382bbc5490565b6104ad61012d565b90565b7fb53127684a568b3173ae13b9f8a6016e243e63b6e8ee1178d6a717850b5d61035473ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff161480610509575033155b1561028e5761028b8161060c565b60006105417fb53127684a568b3173ae13b9f8a6016e243e63b6e8ee1178d6a717850b5d61035490565b73ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff161480610578575033155b156104a557507fb53127684a568b3173ae13b9f8a6016e243e63b6e8ee1178d6a717850b5d61035490565b7f360894a13ba1a3210667c828492db98dca3e2076cc3735a920a3ca505d382bbc81815560405173ffffffffffffffffffffffffffffffffffffffff8316907fbc7cd75a20ee27fd9adebab32041f755214dbc6bffa90cc0225b39da2e5c2d3b90600090a25050565b60006106367fb53127684a568b3173ae13b9f8a6016e243e63b6e8ee1178d6a717850b5d61035490565b7fb53127684a568b3173ae13b9f8a6016e243e63b6e8ee1178d6a717850b5d61038381556040805173ffffffffffffffffffffffffffffffffffffffff80851682528616602082015292935090917f7e644d79422f17c01e4894b5f4f588d331ebfa28653d42ae832dc59e38c9798f910160405180910390a1505050565b803573ffffffffffffffffffffffffffffffffffffffff811681146106d857600080fd5b919050565b6000602082840312156106ef57600080fd5b610412826106b4565b60008060006040848603121561070d57600080fd5b610716846106b4565b9250602084013567ffffffffffffffff8082111561073357600080fd5b818601915086601f83011261074757600080fd5b81358181111561075657600080fd5b87602082850101111561076857600080fd5b6020830194508093505050509250925092565b600060208083528351808285015260005b818110156107a85785810183015185820160400152820161078c565b818111156107ba576000604083870101525b50601f017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe016929092016040019392505050565b818382376000910190815291905056fea164736f6c634300080f000a"; + bytes internal constant l2OutputOracleProxyCode = + hex"60806040526004361061005e5760003560e01c80635c60da1b116100435780635c60da1b146100be5780638f283970146100f8578063f851a440146101185761006d565b80633659cfe6146100755780634f1ef286146100955761006d565b3661006d5761006b61012d565b005b61006b61012d565b34801561008157600080fd5b5061006b6100903660046106dd565b610224565b6100a86100a33660046106f8565b610296565b6040516100b5919061077b565b60405180910390f35b3480156100ca57600080fd5b506100d3610419565b60405173ffffffffffffffffffffffffffffffffffffffff90911681526020016100b5565b34801561010457600080fd5b5061006b6101133660046106dd565b6104b0565b34801561012457600080fd5b506100d3610517565b60006101577f360894a13ba1a3210667c828492db98dca3e2076cc3735a920a3ca505d382bbc5490565b905073ffffffffffffffffffffffffffffffffffffffff8116610201576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602560248201527f50726f78793a20696d706c656d656e746174696f6e206e6f7420696e6974696160448201527f6c697a656400000000000000000000000000000000000000000000000000000060648201526084015b60405180910390fd5b3660008037600080366000845af43d6000803e8061021e573d6000fd5b503d6000f35b7fb53127684a568b3173ae13b9f8a6016e243e63b6e8ee1178d6a717850b5d61035473ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff16148061027d575033155b1561028e5761028b816105a3565b50565b61028b61012d565b60606102c07fb53127684a568b3173ae13b9f8a6016e243e63b6e8ee1178d6a717850b5d61035490565b73ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff1614806102f7575033155b1561040a57610305846105a3565b6000808573ffffffffffffffffffffffffffffffffffffffff16858560405161032f9291906107ee565b600060405180830381855af49150503d806000811461036a576040519150601f19603f3d011682016040523d82523d6000602084013e61036f565b606091505b509150915081610401576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152603960248201527f50726f78793a2064656c656761746563616c6c20746f206e657720696d706c6560448201527f6d656e746174696f6e20636f6e7472616374206661696c65640000000000000060648201526084016101f8565b91506104129050565b61041261012d565b9392505050565b60006104437fb53127684a568b3173ae13b9f8a6016e243e63b6e8ee1178d6a717850b5d61035490565b73ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff16148061047a575033155b156104a557507f360894a13ba1a3210667c828492db98dca3e2076cc3735a920a3ca505d382bbc5490565b6104ad61012d565b90565b7fb53127684a568b3173ae13b9f8a6016e243e63b6e8ee1178d6a717850b5d61035473ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff161480610509575033155b1561028e5761028b8161060c565b60006105417fb53127684a568b3173ae13b9f8a6016e243e63b6e8ee1178d6a717850b5d61035490565b73ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff161480610578575033155b156104a557507fb53127684a568b3173ae13b9f8a6016e243e63b6e8ee1178d6a717850b5d61035490565b7f360894a13ba1a3210667c828492db98dca3e2076cc3735a920a3ca505d382bbc81815560405173ffffffffffffffffffffffffffffffffffffffff8316907fbc7cd75a20ee27fd9adebab32041f755214dbc6bffa90cc0225b39da2e5c2d3b90600090a25050565b60006106367fb53127684a568b3173ae13b9f8a6016e243e63b6e8ee1178d6a717850b5d61035490565b7fb53127684a568b3173ae13b9f8a6016e243e63b6e8ee1178d6a717850b5d61038381556040805173ffffffffffffffffffffffffffffffffffffffff80851682528616602082015292935090917f7e644d79422f17c01e4894b5f4f588d331ebfa28653d42ae832dc59e38c9798f910160405180910390a1505050565b803573ffffffffffffffffffffffffffffffffffffffff811681146106d857600080fd5b919050565b6000602082840312156106ef57600080fd5b610412826106b4565b60008060006040848603121561070d57600080fd5b610716846106b4565b9250602084013567ffffffffffffffff8082111561073357600080fd5b818601915086601f83011261074757600080fd5b81358181111561075657600080fd5b87602082850101111561076857600080fd5b6020830194508093505050509250925092565b600060208083528351808285015260005b818110156107a85785810183015185820160400152820161078c565b818111156107ba576000604083870101525b50601f017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe016929092016040019392505050565b818382376000910190815291905056fea164736f6c634300080f000a"; + bytes internal constant delayedWETHProxyCode = + hex"60806040526004361061005e5760003560e01c80635c60da1b116100435780635c60da1b146100be5780638f283970146100f8578063f851a440146101185761006d565b80633659cfe6146100755780634f1ef286146100955761006d565b3661006d5761006b61012d565b005b61006b61012d565b34801561008157600080fd5b5061006b6100903660046106dd565b610224565b6100a86100a33660046106f8565b610296565b6040516100b5919061077b565b60405180910390f35b3480156100ca57600080fd5b506100d3610419565b60405173ffffffffffffffffffffffffffffffffffffffff90911681526020016100b5565b34801561010457600080fd5b5061006b6101133660046106dd565b6104b0565b34801561012457600080fd5b506100d3610517565b60006101577f360894a13ba1a3210667c828492db98dca3e2076cc3735a920a3ca505d382bbc5490565b905073ffffffffffffffffffffffffffffffffffffffff8116610201576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602560248201527f50726f78793a20696d706c656d656e746174696f6e206e6f7420696e6974696160448201527f6c697a656400000000000000000000000000000000000000000000000000000060648201526084015b60405180910390fd5b3660008037600080366000845af43d6000803e8061021e573d6000fd5b503d6000f35b7fb53127684a568b3173ae13b9f8a6016e243e63b6e8ee1178d6a717850b5d61035473ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff16148061027d575033155b1561028e5761028b816105a3565b50565b61028b61012d565b60606102c07fb53127684a568b3173ae13b9f8a6016e243e63b6e8ee1178d6a717850b5d61035490565b73ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff1614806102f7575033155b1561040a57610305846105a3565b6000808573ffffffffffffffffffffffffffffffffffffffff16858560405161032f9291906107ee565b600060405180830381855af49150503d806000811461036a576040519150601f19603f3d011682016040523d82523d6000602084013e61036f565b606091505b509150915081610401576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152603960248201527f50726f78793a2064656c656761746563616c6c20746f206e657720696d706c6560448201527f6d656e746174696f6e20636f6e7472616374206661696c65640000000000000060648201526084016101f8565b91506104129050565b61041261012d565b9392505050565b60006104437fb53127684a568b3173ae13b9f8a6016e243e63b6e8ee1178d6a717850b5d61035490565b73ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff16148061047a575033155b156104a557507f360894a13ba1a3210667c828492db98dca3e2076cc3735a920a3ca505d382bbc5490565b6104ad61012d565b90565b7fb53127684a568b3173ae13b9f8a6016e243e63b6e8ee1178d6a717850b5d61035473ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff161480610509575033155b1561028e5761028b8161060c565b60006105417fb53127684a568b3173ae13b9f8a6016e243e63b6e8ee1178d6a717850b5d61035490565b73ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff161480610578575033155b156104a557507fb53127684a568b3173ae13b9f8a6016e243e63b6e8ee1178d6a717850b5d61035490565b7f360894a13ba1a3210667c828492db98dca3e2076cc3735a920a3ca505d382bbc81815560405173ffffffffffffffffffffffffffffffffffffffff8316907fbc7cd75a20ee27fd9adebab32041f755214dbc6bffa90cc0225b39da2e5c2d3b90600090a25050565b60006106367fb53127684a568b3173ae13b9f8a6016e243e63b6e8ee1178d6a717850b5d61035490565b7fb53127684a568b3173ae13b9f8a6016e243e63b6e8ee1178d6a717850b5d61038381556040805173ffffffffffffffffffffffffffffffffffffffff80851682528616602082015292935090917f7e644d79422f17c01e4894b5f4f588d331ebfa28653d42ae832dc59e38c9798f910160405180910390a1505050565b803573ffffffffffffffffffffffffffffffffffffffff811681146106d857600080fd5b919050565b6000602082840312156106ef57600080fd5b610412826106b4565b60008060006040848603121561070d57600080fd5b610716846106b4565b9250602084013567ffffffffffffffff8082111561073357600080fd5b818601915086601f83011261074757600080fd5b81358181111561075657600080fd5b87602082850101111561076857600080fd5b6020830194508093505050509250925092565b600060208083528351808285015260005b818110156107a85785810183015185820160400152820161078c565b818111156107ba576000604083870101525b50601f017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe016929092016040019392505050565b818382376000910190815291905056fea164736f6c634300080f000a"; + bytes internal constant permissionedDelayedWETHProxyCode = + hex"60806040526004361061005e5760003560e01c80635c60da1b116100435780635c60da1b146100be5780638f283970146100f8578063f851a440146101185761006d565b80633659cfe6146100755780634f1ef286146100955761006d565b3661006d5761006b61012d565b005b61006b61012d565b34801561008157600080fd5b5061006b6100903660046106dd565b610224565b6100a86100a33660046106f8565b610296565b6040516100b5919061077b565b60405180910390f35b3480156100ca57600080fd5b506100d3610419565b60405173ffffffffffffffffffffffffffffffffffffffff90911681526020016100b5565b34801561010457600080fd5b5061006b6101133660046106dd565b6104b0565b34801561012457600080fd5b506100d3610517565b60006101577f360894a13ba1a3210667c828492db98dca3e2076cc3735a920a3ca505d382bbc5490565b905073ffffffffffffffffffffffffffffffffffffffff8116610201576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602560248201527f50726f78793a20696d706c656d656e746174696f6e206e6f7420696e6974696160448201527f6c697a656400000000000000000000000000000000000000000000000000000060648201526084015b60405180910390fd5b3660008037600080366000845af43d6000803e8061021e573d6000fd5b503d6000f35b7fb53127684a568b3173ae13b9f8a6016e243e63b6e8ee1178d6a717850b5d61035473ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff16148061027d575033155b1561028e5761028b816105a3565b50565b61028b61012d565b60606102c07fb53127684a568b3173ae13b9f8a6016e243e63b6e8ee1178d6a717850b5d61035490565b73ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff1614806102f7575033155b1561040a57610305846105a3565b6000808573ffffffffffffffffffffffffffffffffffffffff16858560405161032f9291906107ee565b600060405180830381855af49150503d806000811461036a576040519150601f19603f3d011682016040523d82523d6000602084013e61036f565b606091505b509150915081610401576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152603960248201527f50726f78793a2064656c656761746563616c6c20746f206e657720696d706c6560448201527f6d656e746174696f6e20636f6e7472616374206661696c65640000000000000060648201526084016101f8565b91506104129050565b61041261012d565b9392505050565b60006104437fb53127684a568b3173ae13b9f8a6016e243e63b6e8ee1178d6a717850b5d61035490565b73ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff16148061047a575033155b156104a557507f360894a13ba1a3210667c828492db98dca3e2076cc3735a920a3ca505d382bbc5490565b6104ad61012d565b90565b7fb53127684a568b3173ae13b9f8a6016e243e63b6e8ee1178d6a717850b5d61035473ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff161480610509575033155b1561028e5761028b8161060c565b60006105417fb53127684a568b3173ae13b9f8a6016e243e63b6e8ee1178d6a717850b5d61035490565b73ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff161480610578575033155b156104a557507fb53127684a568b3173ae13b9f8a6016e243e63b6e8ee1178d6a717850b5d61035490565b7f360894a13ba1a3210667c828492db98dca3e2076cc3735a920a3ca505d382bbc81815560405173ffffffffffffffffffffffffffffffffffffffff8316907fbc7cd75a20ee27fd9adebab32041f755214dbc6bffa90cc0225b39da2e5c2d3b90600090a25050565b60006106367fb53127684a568b3173ae13b9f8a6016e243e63b6e8ee1178d6a717850b5d61035490565b7fb53127684a568b3173ae13b9f8a6016e243e63b6e8ee1178d6a717850b5d61038381556040805173ffffffffffffffffffffffffffffffffffffffff80851682528616602082015292935090917f7e644d79422f17c01e4894b5f4f588d331ebfa28653d42ae832dc59e38c9798f910160405180910390a1505050565b803573ffffffffffffffffffffffffffffffffffffffff811681146106d857600080fd5b919050565b6000602082840312156106ef57600080fd5b610412826106b4565b60008060006040848603121561070d57600080fd5b610716846106b4565b9250602084013567ffffffffffffffff8082111561073357600080fd5b818601915086601f83011261074757600080fd5b81358181111561075657600080fd5b87602082850101111561076857600080fd5b6020830194508093505050509250925092565b600060208083528351808285015260005b818110156107a85785810183015185820160400152820161078c565b818111156107ba576000604083870101525b50601f017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe016929092016040019392505050565b818382376000910190815291905056fea164736f6c634300080f000a"; + bytes internal constant anchorStateRegistryProxyCode = + hex"60806040526004361061005e5760003560e01c80635c60da1b116100435780635c60da1b146100be5780638f283970146100f8578063f851a440146101185761006d565b80633659cfe6146100755780634f1ef286146100955761006d565b3661006d5761006b61012d565b005b61006b61012d565b34801561008157600080fd5b5061006b6100903660046106dd565b610224565b6100a86100a33660046106f8565b610296565b6040516100b5919061077b565b60405180910390f35b3480156100ca57600080fd5b506100d3610419565b60405173ffffffffffffffffffffffffffffffffffffffff90911681526020016100b5565b34801561010457600080fd5b5061006b6101133660046106dd565b6104b0565b34801561012457600080fd5b506100d3610517565b60006101577f360894a13ba1a3210667c828492db98dca3e2076cc3735a920a3ca505d382bbc5490565b905073ffffffffffffffffffffffffffffffffffffffff8116610201576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602560248201527f50726f78793a20696d706c656d656e746174696f6e206e6f7420696e6974696160448201527f6c697a656400000000000000000000000000000000000000000000000000000060648201526084015b60405180910390fd5b3660008037600080366000845af43d6000803e8061021e573d6000fd5b503d6000f35b7fb53127684a568b3173ae13b9f8a6016e243e63b6e8ee1178d6a717850b5d61035473ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff16148061027d575033155b1561028e5761028b816105a3565b50565b61028b61012d565b60606102c07fb53127684a568b3173ae13b9f8a6016e243e63b6e8ee1178d6a717850b5d61035490565b73ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff1614806102f7575033155b1561040a57610305846105a3565b6000808573ffffffffffffffffffffffffffffffffffffffff16858560405161032f9291906107ee565b600060405180830381855af49150503d806000811461036a576040519150601f19603f3d011682016040523d82523d6000602084013e61036f565b606091505b509150915081610401576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152603960248201527f50726f78793a2064656c656761746563616c6c20746f206e657720696d706c6560448201527f6d656e746174696f6e20636f6e7472616374206661696c65640000000000000060648201526084016101f8565b91506104129050565b61041261012d565b9392505050565b60006104437fb53127684a568b3173ae13b9f8a6016e243e63b6e8ee1178d6a717850b5d61035490565b73ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff16148061047a575033155b156104a557507f360894a13ba1a3210667c828492db98dca3e2076cc3735a920a3ca505d382bbc5490565b6104ad61012d565b90565b7fb53127684a568b3173ae13b9f8a6016e243e63b6e8ee1178d6a717850b5d61035473ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff161480610509575033155b1561028e5761028b8161060c565b60006105417fb53127684a568b3173ae13b9f8a6016e243e63b6e8ee1178d6a717850b5d61035490565b73ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff161480610578575033155b156104a557507fb53127684a568b3173ae13b9f8a6016e243e63b6e8ee1178d6a717850b5d61035490565b7f360894a13ba1a3210667c828492db98dca3e2076cc3735a920a3ca505d382bbc81815560405173ffffffffffffffffffffffffffffffffffffffff8316907fbc7cd75a20ee27fd9adebab32041f755214dbc6bffa90cc0225b39da2e5c2d3b90600090a25050565b60006106367fb53127684a568b3173ae13b9f8a6016e243e63b6e8ee1178d6a717850b5d61035490565b7fb53127684a568b3173ae13b9f8a6016e243e63b6e8ee1178d6a717850b5d61038381556040805173ffffffffffffffffffffffffffffffffffffffff80851682528616602082015292935090917f7e644d79422f17c01e4894b5f4f588d331ebfa28653d42ae832dc59e38c9798f910160405180910390a1505050565b803573ffffffffffffffffffffffffffffffffffffffff811681146106d857600080fd5b919050565b6000602082840312156106ef57600080fd5b610412826106b4565b60008060006040848603121561070d57600080fd5b610716846106b4565b9250602084013567ffffffffffffffff8082111561073357600080fd5b818601915086601f83011261074757600080fd5b81358181111561075657600080fd5b87602082850101111561076857600080fd5b6020830194508093505050509250925092565b600060208083528351808285015260005b818110156107a85785810183015185820160400152820161078c565b818111156107ba576000604083870101525b50601f017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe016929092016040019392505050565b818382376000910190815291905056fea164736f6c634300080f000a"; bytes internal constant l1CrossDomainMessengerCode = - hex"60806040526004361061018b5760003560e01c80636425666b116100d6578063b1b1b2091161007f578063d764ad0b11610059578063d764ad0b1461049b578063db505d80146104ae578063ecc70428146104db57600080fd5b8063b1b1b2091461042b578063b28ade251461045b578063c0c53b8b1461047b57600080fd5b80638cbeeef2116100b05780638cbeeef2146102d05780639fce812c146103d0578063a4e7f8bd146103fb57600080fd5b80636425666b146103775780636e296e45146103a457806383a74074146103b957600080fd5b80633dbb202b1161013857806354fd4d501161011257806354fd4d50146102e65780635644cfdf1461033c5780635c975abb1461035257600080fd5b80633dbb202b146102935780633f827a5a146102a85780634c1d6a69146102d057600080fd5b80632828d7e8116101695780632828d7e81461022457806333d7e2bd1461023957806335e80ab31461026657600080fd5b8063028f85f7146101905780630c568498146101c35780630ff754ea146101d8575b600080fd5b34801561019c57600080fd5b506101a5601081565b60405167ffffffffffffffff90911681526020015b60405180910390f35b3480156101cf57600080fd5b506101a5603f81565b3480156101e457600080fd5b5060fc5473ffffffffffffffffffffffffffffffffffffffff165b60405173ffffffffffffffffffffffffffffffffffffffff90911681526020016101ba565b34801561023057600080fd5b506101a5604081565b34801561024557600080fd5b5060fd546101ff9073ffffffffffffffffffffffffffffffffffffffff1681565b34801561027257600080fd5b5060fb546101ff9073ffffffffffffffffffffffffffffffffffffffff1681565b6102a66102a1366004611bdf565b610540565b005b3480156102b457600080fd5b506102bd600181565b60405161ffff90911681526020016101ba565b3480156102dc57600080fd5b506101a5619c4081565b3480156102f257600080fd5b5061032f6040518060400160405280600581526020017f322e342e3000000000000000000000000000000000000000000000000000000081525081565b6040516101ba9190611cb1565b34801561034857600080fd5b506101a561138881565b34801561035e57600080fd5b5061036761083d565b60405190151581526020016101ba565b34801561038357600080fd5b5060fc546101ff9073ffffffffffffffffffffffffffffffffffffffff1681565b3480156103b057600080fd5b506101ff6108d6565b3480156103c557600080fd5b506101a562030d4081565b3480156103dc57600080fd5b5060cf5473ffffffffffffffffffffffffffffffffffffffff166101ff565b34801561040757600080fd5b50610367610416366004611ccb565b60ce6020526000908152604090205460ff1681565b34801561043757600080fd5b50610367610446366004611ccb565b60cb6020526000908152604090205460ff1681565b34801561046757600080fd5b506101a5610476366004611ce4565b6109bd565b34801561048757600080fd5b506102a6610496366004611d38565b610a2b565b6102a66104a9366004611d83565b610ca2565b3480156104ba57600080fd5b5060cf546101ff9073ffffffffffffffffffffffffffffffffffffffff1681565b3480156104e757600080fd5b5061053260cd547dffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff167e010000000000000000000000000000000000000000000000000000000000001790565b6040519081526020016101ba565b6105486115d3565b156105e05734156105e0576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152603d60248201527f43726f7373446f6d61696e4d657373656e6765723a2063616e6e6f742073656e60448201527f642076616c7565207769746820637573746f6d2067617320746f6b656e00000060648201526084015b60405180910390fd5b60cf546107129073ffffffffffffffffffffffffffffffffffffffff166106088585856109bd565b347fd764ad0b0000000000000000000000000000000000000000000000000000000061067460cd547dffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff167e010000000000000000000000000000000000000000000000000000000000001790565b338a34898c8c6040516024016106909796959493929190611e52565b604080517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe08184030181529190526020810180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff167fffffffff0000000000000000000000000000000000000000000000000000000090931692909217909152611612565b8373ffffffffffffffffffffffffffffffffffffffff167fcb0f7ffd78f9aee47a248fae8db181db6eee833039123e026dcbff529522e52a33858561079760cd547dffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff167e010000000000000000000000000000000000000000000000000000000000001790565b866040516107a9959493929190611eb1565b60405180910390a260405134815233907f8ebb2ec2465bdb2a06a66fc37a0963af8a2a6a1479d81d56fdb8cbb98096d5469060200160405180910390a2505060cd80547dffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff808216600101167fffff0000000000000000000000000000000000000000000000000000000000009091161790555050565b60fb54604080517f5c975abb000000000000000000000000000000000000000000000000000000008152905160009273ffffffffffffffffffffffffffffffffffffffff1691635c975abb9160048083019260209291908290030181865afa1580156108ad573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906108d19190611eff565b905090565b60cc5460009073ffffffffffffffffffffffffffffffffffffffff167fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff2153016109a0576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152603560248201527f43726f7373446f6d61696e4d657373656e6765723a2078446f6d61696e4d657360448201527f7361676553656e646572206973206e6f7420736574000000000000000000000060648201526084016105d7565b5060cc5473ffffffffffffffffffffffffffffffffffffffff1690565b6000611388619c4080603f6109d9604063ffffffff8816611f50565b6109e39190611f80565b6109ee601088611f50565b6109fb9062030d40611fce565b610a059190611fce565b610a0f9190611fce565b610a199190611fce565b610a239190611fce565b949350505050565b6000547501000000000000000000000000000000000000000000900460ff1615808015610a76575060005460017401000000000000000000000000000000000000000090910460ff16105b80610aa85750303b158015610aa8575060005474010000000000000000000000000000000000000000900460ff166001145b610b34576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602e60248201527f496e697469616c697a61626c653a20636f6e747261637420697320616c72656160448201527f647920696e697469616c697a656400000000000000000000000000000000000060648201526084016105d7565b600080547fffffffffffffffffffffff00ffffffffffffffffffffffffffffffffffffffff16740100000000000000000000000000000000000000001790558015610bba57600080547fffffffffffffffffffff00ffffffffffffffffffffffffffffffffffffffffff1675010000000000000000000000000000000000000000001790555b60fb805473ffffffffffffffffffffffffffffffffffffffff8087167fffffffffffffffffffffffff00000000000000000000000000000000000000009283161790925560fc805486841690831617905560fd805492851692909116919091179055610c397342000000000000000000000000000000000000076116ab565b8015610c9c57600080547fffffffffffffffffffff00ffffffffffffffffffffffffffffffffffffffffff169055604051600181527f7f26b83ff96e1f2b6a682f133852f6798a09c465da95921460cefb38474024989060200160405180910390a15b50505050565b610caa61083d565b15610d11576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601c60248201527f43726f7373446f6d61696e4d657373656e6765723a207061757365640000000060448201526064016105d7565b60f087901c60028110610dcc576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152604d60248201527f43726f7373446f6d61696e4d657373656e6765723a206f6e6c7920766572736960448201527f6f6e2030206f722031206d657373616765732061726520737570706f7274656460648201527f20617420746869732074696d6500000000000000000000000000000000000000608482015260a4016105d7565b8061ffff16600003610ec1576000610e1d878986868080601f0160208091040260200160405190810160405280939291908181526020018383808284376000920191909152508f92506117e7915050565b600081815260cb602052604090205490915060ff1615610ebf576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152603760248201527f43726f7373446f6d61696e4d657373656e6765723a206c65676163792077697460448201527f6864726177616c20616c72656164792072656c6179656400000000000000000060648201526084016105d7565b505b6000610f07898989898989898080601f01602080910402602001604051908101604052809392919081815260200183838082843760009201919091525061180692505050565b9050610f11611829565b15610f4957853414610f2557610f25611ffa565b600081815260ce602052604090205460ff1615610f4457610f44611ffa565b61109b565b3415610ffd576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152605060248201527f43726f7373446f6d61696e4d657373656e6765723a2076616c7565206d75737460448201527f206265207a65726f20756e6c657373206d6573736167652069732066726f6d2060648201527f612073797374656d206164647265737300000000000000000000000000000000608482015260a4016105d7565b600081815260ce602052604090205460ff1661109b576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152603060248201527f43726f7373446f6d61696e4d657373656e6765723a206d65737361676520636160448201527f6e6e6f74206265207265706c617965640000000000000000000000000000000060648201526084016105d7565b6110a487611905565b15611157576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152604360248201527f43726f7373446f6d61696e4d657373656e6765723a2063616e6e6f742073656e60448201527f64206d65737361676520746f20626c6f636b65642073797374656d206164647260648201527f6573730000000000000000000000000000000000000000000000000000000000608482015260a4016105d7565b600081815260cb602052604090205460ff16156111f6576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152603660248201527f43726f7373446f6d61696e4d657373656e6765723a206d65737361676520686160448201527f7320616c7265616479206265656e2072656c617965640000000000000000000060648201526084016105d7565b61121785611208611388619c40611fce565b67ffffffffffffffff1661194b565b158061123d575060cc5473ffffffffffffffffffffffffffffffffffffffff1661dead14155b1561135657600081815260ce602052604080822080547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff001660011790555182917f99d0e048484baa1b1540b1367cb128acd7ab2946d1ed91ec10e3c85e4bf51b8f91a27fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff320161134f576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602d60248201527f43726f7373446f6d61696e4d657373656e6765723a206661696c656420746f2060448201527f72656c6179206d6573736167650000000000000000000000000000000000000060648201526084016105d7565b50506115ae565b60cc80547fffffffffffffffffffffffff00000000000000000000000000000000000000001673ffffffffffffffffffffffffffffffffffffffff8a1617905560006113e788619c405a6113aa9190612029565b8988888080601f01602080910402602001604051908101604052809392919081815260200183838082843760009201919091525061196992505050565b60cc80547fffffffffffffffffffffffff00000000000000000000000000000000000000001661dead1790559050801561149d57600082815260cb602052604090205460ff161561143a5761143a611ffa565b600082815260cb602052604080822080547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff001660011790555183917f4641df4a962071e12719d8c8c8e5ac7fc4d97b927346a3d7a335b1f7517e133c91a26115aa565b600082815260ce602052604080822080547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff001660011790555183917f99d0e048484baa1b1540b1367cb128acd7ab2946d1ed91ec10e3c85e4bf51b8f91a27fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff32016115aa576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602d60248201527f43726f7373446f6d61696e4d657373656e6765723a206661696c656420746f2060448201527f72656c6179206d6573736167650000000000000000000000000000000000000060648201526084016105d7565b5050505b50505050505050565b73ffffffffffffffffffffffffffffffffffffffff163b151590565b6000806115de611983565b5073ffffffffffffffffffffffffffffffffffffffff1673eeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeee141592915050565b60fc546040517fe9e05c4200000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff9091169063e9e05c42908490611673908890839089906000908990600401612040565b6000604051808303818588803b15801561168c57600080fd5b505af11580156116a0573d6000803e3d6000fd5b505050505050505050565b6000547501000000000000000000000000000000000000000000900460ff16611756576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602b60248201527f496e697469616c697a61626c653a20636f6e7472616374206973206e6f74206960448201527f6e697469616c697a696e6700000000000000000000000000000000000000000060648201526084016105d7565b60cc5473ffffffffffffffffffffffffffffffffffffffff166117a05760cc80547fffffffffffffffffffffffff00000000000000000000000000000000000000001661dead1790555b60cf80547fffffffffffffffffffffffff00000000000000000000000000000000000000001673ffffffffffffffffffffffffffffffffffffffff92909216919091179055565b60006117f585858585611a20565b805190602001209050949350505050565b6000611816878787878787611ab9565b8051906020012090509695505050505050565b60fc5460009073ffffffffffffffffffffffffffffffffffffffff16331480156108d1575060cf5460fc54604080517f9bf62d82000000000000000000000000000000000000000000000000000000008152905173ffffffffffffffffffffffffffffffffffffffff9384169390921691639bf62d82916004808201926020929091908290030181865afa1580156118c5573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906118e99190612098565b73ffffffffffffffffffffffffffffffffffffffff1614905090565b600073ffffffffffffffffffffffffffffffffffffffff8216301480611945575060fc5473ffffffffffffffffffffffffffffffffffffffff8381169116145b92915050565b600080603f83619c4001026040850201603f5a021015949350505050565b600080600080845160208601878a8af19695505050505050565b60fd54604080517f4397dfef0000000000000000000000000000000000000000000000000000000081528151600093849373ffffffffffffffffffffffffffffffffffffffff90911692634397dfef92600480830193928290030181865afa1580156119f3573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611a1791906120b5565b90939092509050565b606084848484604051602401611a3994939291906120f5565b604080517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe08184030181529190526020810180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff167fcbd4ece9000000000000000000000000000000000000000000000000000000001790529050949350505050565b6060868686868686604051602401611ad69695949392919061213f565b604080517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe08184030181529190526020810180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff167fd764ad0b0000000000000000000000000000000000000000000000000000000017905290509695505050505050565b73ffffffffffffffffffffffffffffffffffffffff81168114611b7a57600080fd5b50565b60008083601f840112611b8f57600080fd5b50813567ffffffffffffffff811115611ba757600080fd5b602083019150836020828501011115611bbf57600080fd5b9250929050565b803563ffffffff81168114611bda57600080fd5b919050565b60008060008060608587031215611bf557600080fd5b8435611c0081611b58565b9350602085013567ffffffffffffffff811115611c1c57600080fd5b611c2887828801611b7d565b9094509250611c3b905060408601611bc6565b905092959194509250565b6000815180845260005b81811015611c6c57602081850181015186830182015201611c50565b81811115611c7e576000602083870101525b50601f017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0169290920160200192915050565b602081526000611cc46020830184611c46565b9392505050565b600060208284031215611cdd57600080fd5b5035919050565b600080600060408486031215611cf957600080fd5b833567ffffffffffffffff811115611d1057600080fd5b611d1c86828701611b7d565b9094509250611d2f905060208501611bc6565b90509250925092565b600080600060608486031215611d4d57600080fd5b8335611d5881611b58565b92506020840135611d6881611b58565b91506040840135611d7881611b58565b809150509250925092565b600080600080600080600060c0888a031215611d9e57600080fd5b873596506020880135611db081611b58565b95506040880135611dc081611b58565b9450606088013593506080880135925060a088013567ffffffffffffffff811115611dea57600080fd5b611df68a828b01611b7d565b989b979a50959850939692959293505050565b8183528181602085013750600060208284010152600060207fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0601f840116840101905092915050565b878152600073ffffffffffffffffffffffffffffffffffffffff808916602084015280881660408401525085606083015263ffffffff8516608083015260c060a0830152611ea460c083018486611e09565b9998505050505050505050565b73ffffffffffffffffffffffffffffffffffffffff86168152608060208201526000611ee1608083018688611e09565b905083604083015263ffffffff831660608301529695505050505050565b600060208284031215611f1157600080fd5b81518015158114611cc457600080fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b600067ffffffffffffffff80831681851681830481118215151615611f7757611f77611f21565b02949350505050565b600067ffffffffffffffff80841680611fc2577f4e487b7100000000000000000000000000000000000000000000000000000000600052601260045260246000fd5b92169190910492915050565b600067ffffffffffffffff808316818516808303821115611ff157611ff1611f21565b01949350505050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052600160045260246000fd5b60008282101561203b5761203b611f21565b500390565b73ffffffffffffffffffffffffffffffffffffffff8616815284602082015267ffffffffffffffff84166040820152821515606082015260a06080820152600061208d60a0830184611c46565b979650505050505050565b6000602082840312156120aa57600080fd5b8151611cc481611b58565b600080604083850312156120c857600080fd5b82516120d381611b58565b602084015190925060ff811681146120ea57600080fd5b809150509250929050565b600073ffffffffffffffffffffffffffffffffffffffff80871683528086166020840152506080604083015261212e6080830185611c46565b905082606083015295945050505050565b868152600073ffffffffffffffffffffffffffffffffffffffff808816602084015280871660408401525084606083015283608083015260c060a083015261218a60c0830184611c46565b9897505050505050505056fea164736f6c634300080f000a"; - bytes internal constant l2OutputOracleCode = - hex"60806040526004361061018a5760003560e01c806389c44cbb116100d6578063ce5db8d61161007f578063dcec334811610059578063dcec33481461049b578063e1a41bcf146104b0578063f4daa291146104c657600080fd5b8063ce5db8d614610445578063cf8e5cf01461045b578063d1de856c1461047b57600080fd5b8063a25ae557116100b0578063a25ae55714610391578063a8e4fb90146103ed578063bffa7f0f1461041a57600080fd5b806389c44cbb1461034857806393991af3146103685780639aaab6481461037e57600080fd5b806369f16eec1161013857806370872aa51161011257806370872aa5146102fc5780637f00642014610312578063887862721461033257600080fd5b806369f16eec146102a75780636abcf563146102bc5780636b4d98dd146102d157600080fd5b8063529933df11610169578063529933df146101ea578063534db0e2146101ff57806354fd4d501461025157600080fd5b80622134cc1461018f5780631c89c97d146101b35780634599c788146101d5575b600080fd5b34801561019b57600080fd5b506005545b6040519081526020015b60405180910390f35b3480156101bf57600080fd5b506101d36101ce3660046113a2565b6104db565b005b3480156101e157600080fd5b506101a06108b6565b3480156101f657600080fd5b506004546101a0565b34801561020b57600080fd5b5060065461022c9073ffffffffffffffffffffffffffffffffffffffff1681565b60405173ffffffffffffffffffffffffffffffffffffffff90911681526020016101aa565b34801561025d57600080fd5b5061029a6040518060400160405280600581526020017f312e382e3000000000000000000000000000000000000000000000000000000081525081565b6040516101aa9190611405565b3480156102b357600080fd5b506101a0610929565b3480156102c857600080fd5b506003546101a0565b3480156102dd57600080fd5b5060065473ffffffffffffffffffffffffffffffffffffffff1661022c565b34801561030857600080fd5b506101a060015481565b34801561031e57600080fd5b506101a061032d366004611478565b61093b565b34801561033e57600080fd5b506101a060025481565b34801561035457600080fd5b506101d3610363366004611478565b610b4f565b34801561037457600080fd5b506101a060055481565b6101d361038c366004611491565b610de9565b34801561039d57600080fd5b506103b16103ac366004611478565b61124a565b60408051825181526020808401516fffffffffffffffffffffffffffffffff9081169183019190915292820151909216908201526060016101aa565b3480156103f957600080fd5b5060075461022c9073ffffffffffffffffffffffffffffffffffffffff1681565b34801561042657600080fd5b5060075473ffffffffffffffffffffffffffffffffffffffff1661022c565b34801561045157600080fd5b506101a060085481565b34801561046757600080fd5b506103b1610476366004611478565b6112de565b34801561048757600080fd5b506101a0610496366004611478565b611316565b3480156104a757600080fd5b506101a0611346565b3480156104bc57600080fd5b506101a060045481565b3480156104d257600080fd5b506008546101a0565b600054610100900460ff16158080156104fb5750600054600160ff909116105b806105155750303b158015610515575060005460ff166001145b6105a6576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602e60248201527f496e697469616c697a61626c653a20636f6e747261637420697320616c72656160448201527f647920696e697469616c697a656400000000000000000000000000000000000060648201526084015b60405180910390fd5b600080547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00166001179055801561060457600080547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00ff166101001790555b60008811610694576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152603a60248201527f4c324f75747075744f7261636c653a207375626d697373696f6e20696e74657260448201527f76616c206d7573742062652067726561746572207468616e2030000000000000606482015260840161059d565b60008711610724576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152603460248201527f4c324f75747075744f7261636c653a204c3220626c6f636b2074696d65206d7560448201527f73742062652067726561746572207468616e2030000000000000000000000000606482015260840161059d565b428511156107db576040517f08c379a0000000000000000000000000000000000000000000000000000000008152602060048201526044602482018190527f4c324f75747075744f7261636c653a207374617274696e67204c322074696d65908201527f7374616d70206d757374206265206c657373207468616e2063757272656e742060648201527f74696d6500000000000000000000000000000000000000000000000000000000608482015260a40161059d565b60048890556005879055600186905560028590556007805473ffffffffffffffffffffffffffffffffffffffff8087167fffffffffffffffffffffffff0000000000000000000000000000000000000000928316179092556006805492861692909116919091179055600882905580156108ac57600080547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00ff169055604051600181527f7f26b83ff96e1f2b6a682f133852f6798a09c465da95921460cefb38474024989060200160405180910390a15b5050505050505050565b6003546000901561092057600380546108d1906001906114f2565b815481106108e1576108e1611509565b600091825260209091206002909102016001015470010000000000000000000000000000000090046fffffffffffffffffffffffffffffffff16919050565b6001545b905090565b600354600090610924906001906114f2565b60006109456108b6565b8211156109fa576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152604860248201527f4c324f75747075744f7261636c653a2063616e6e6f7420676574206f7574707560448201527f7420666f72206120626c6f636b207468617420686173206e6f74206265656e2060648201527f70726f706f736564000000000000000000000000000000000000000000000000608482015260a40161059d565b600354610aaf576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152604660248201527f4c324f75747075744f7261636c653a2063616e6e6f7420676574206f7574707560448201527f74206173206e6f206f7574707574732068617665206265656e2070726f706f7360648201527f6564207965740000000000000000000000000000000000000000000000000000608482015260a40161059d565b6003546000905b80821015610b485760006002610acc8385611538565b610ad69190611550565b90508460038281548110610aec57610aec611509565b600091825260209091206002909102016001015470010000000000000000000000000000000090046fffffffffffffffffffffffffffffffff161015610b3e57610b37816001611538565b9250610b42565b8091505b50610ab6565b5092915050565b60065473ffffffffffffffffffffffffffffffffffffffff163314610bf6576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152603e60248201527f4c324f75747075744f7261636c653a206f6e6c7920746865206368616c6c656e60448201527f67657220616464726573732063616e2064656c657465206f7574707574730000606482015260840161059d565b6003548110610cad576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152604360248201527f4c324f75747075744f7261636c653a2063616e6e6f742064656c657465206f7560448201527f747075747320616674657220746865206c6174657374206f757470757420696e60648201527f6465780000000000000000000000000000000000000000000000000000000000608482015260a40161059d565b60085460038281548110610cc357610cc3611509565b6000918252602090912060016002909202010154610cf3906fffffffffffffffffffffffffffffffff16426114f2565b10610da6576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152604660248201527f4c324f75747075744f7261636c653a2063616e6e6f742064656c657465206f7560448201527f74707574732074686174206861766520616c7265616479206265656e2066696e60648201527f616c697a65640000000000000000000000000000000000000000000000000000608482015260a40161059d565b6000610db160035490565b90508160035581817f4ee37ac2c786ec85e87592d3c5c8a1dd66f8496dda3f125d9ea8ca5f657629b660405160405180910390a35050565b60075473ffffffffffffffffffffffffffffffffffffffff163314610eb6576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152604160248201527f4c324f75747075744f7261636c653a206f6e6c79207468652070726f706f736560448201527f7220616464726573732063616e2070726f706f7365206e6577206f757470757460648201527f7300000000000000000000000000000000000000000000000000000000000000608482015260a40161059d565b610ebe611346565b8314610f72576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152604860248201527f4c324f75747075744f7261636c653a20626c6f636b206e756d626572206d757360448201527f7420626520657175616c20746f206e65787420657870656374656420626c6f6360648201527f6b206e756d626572000000000000000000000000000000000000000000000000608482015260a40161059d565b42610f7c84611316565b10611009576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152603660248201527f4c324f75747075744f7261636c653a2063616e6e6f742070726f706f7365204c60448201527f32206f757470757420696e207468652066757475726500000000000000000000606482015260840161059d565b83611096576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152603a60248201527f4c324f75747075744f7261636c653a204c32206f75747075742070726f706f7360448201527f616c2063616e6e6f7420626520746865207a65726f2068617368000000000000606482015260840161059d565b81156111525781814014611152576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152604960248201527f4c324f75747075744f7261636c653a20626c6f636b206861736820646f65732060448201527f6e6f74206d61746368207468652068617368206174207468652065787065637460648201527f6564206865696768740000000000000000000000000000000000000000000000608482015260a40161059d565b8261115c60035490565b857fa7aaf2512769da4e444e3de247be2564225c2e7a8f74cfe528e46e17d24868e24260405161118e91815260200190565b60405180910390a45050604080516060810182529283526fffffffffffffffffffffffffffffffff4281166020850190815292811691840191825260038054600181018255600091909152935160029094027fc2575a0e9e593c00f959f8c92f12db2869c3395a3b0502d05e2516446f71f85b810194909455915190518216700100000000000000000000000000000000029116177fc2575a0e9e593c00f959f8c92f12db2869c3395a3b0502d05e2516446f71f85c90910155565b60408051606081018252600080825260208201819052918101919091526003828154811061127a5761127a611509565b600091825260209182902060408051606081018252600290930290910180548352600101546fffffffffffffffffffffffffffffffff8082169484019490945270010000000000000000000000000000000090049092169181019190915292915050565b604080516060810182526000808252602082018190529181019190915260036113068361093b565b8154811061127a5761127a611509565b60006005546001548361132991906114f2565b611333919061158b565b6002546113409190611538565b92915050565b60006004546113536108b6565b6109249190611538565b73ffffffffffffffffffffffffffffffffffffffff163b151590565b803573ffffffffffffffffffffffffffffffffffffffff8116811461139d57600080fd5b919050565b600080600080600080600060e0888a0312156113bd57600080fd5b873596506020880135955060408801359450606088013593506113e260808901611379565b92506113f060a08901611379565b915060c0880135905092959891949750929550565b600060208083528351808285015260005b8181101561143257858101830151858201604001528201611416565b81811115611444576000604083870101525b50601f017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe016929092016040019392505050565b60006020828403121561148a57600080fd5b5035919050565b600080600080608085870312156114a757600080fd5b5050823594602084013594506040840135936060013592509050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b600082821015611504576115046114c3565b500390565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b6000821982111561154b5761154b6114c3565b500190565b600082611586577f4e487b7100000000000000000000000000000000000000000000000000000000600052601260045260246000fd5b500490565b6000817fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff04831182151516156115c3576115c36114c3565b50029056fea164736f6c634300080f000a"; + hex"60806040526004361061018b5760003560e01c80636425666b116100d6578063b1b1b2091161007f578063d764ad0b11610059578063d764ad0b1461049b578063db505d80146104ae578063ecc70428146104db57600080fd5b8063b1b1b2091461042b578063b28ade251461045b578063c0c53b8b1461047b57600080fd5b80638cbeeef2116100b05780638cbeeef2146102d05780639fce812c146103d0578063a4e7f8bd146103fb57600080fd5b80636425666b146103775780636e296e45146103a457806383a74074146103b957600080fd5b80633dbb202b1161013857806354fd4d501161011257806354fd4d50146102e65780635644cfdf1461033c5780635c975abb1461035257600080fd5b80633dbb202b146102935780633f827a5a146102a85780634c1d6a69146102d057600080fd5b80632828d7e8116101695780632828d7e81461022457806333d7e2bd1461023957806335e80ab31461026657600080fd5b8063028f85f7146101905780630c568498146101c35780630ff754ea146101d8575b600080fd5b34801561019c57600080fd5b506101a5601081565b60405167ffffffffffffffff90911681526020015b60405180910390f35b3480156101cf57600080fd5b506101a5603f81565b3480156101e457600080fd5b5060fc5473ffffffffffffffffffffffffffffffffffffffff165b60405173ffffffffffffffffffffffffffffffffffffffff90911681526020016101ba565b34801561023057600080fd5b506101a5604081565b34801561024557600080fd5b5060fd546101ff9073ffffffffffffffffffffffffffffffffffffffff1681565b34801561027257600080fd5b5060fb546101ff9073ffffffffffffffffffffffffffffffffffffffff1681565b6102a66102a1366004611bdd565b610540565b005b3480156102b457600080fd5b506102bd600181565b60405161ffff90911681526020016101ba565b3480156102dc57600080fd5b506101a5619c4081565b3480156102f257600080fd5b5061032f6040518060400160405280600c81526020017f322e342e312d626574612e31000000000000000000000000000000000000000081525081565b6040516101ba9190611caf565b34801561034857600080fd5b506101a561138881565b34801561035e57600080fd5b5061036761083d565b60405190151581526020016101ba565b34801561038357600080fd5b5060fc546101ff9073ffffffffffffffffffffffffffffffffffffffff1681565b3480156103b057600080fd5b506101ff6108d6565b3480156103c557600080fd5b506101a562030d4081565b3480156103dc57600080fd5b5060cf5473ffffffffffffffffffffffffffffffffffffffff166101ff565b34801561040757600080fd5b50610367610416366004611cc9565b60ce6020526000908152604090205460ff1681565b34801561043757600080fd5b50610367610446366004611cc9565b60cb6020526000908152604090205460ff1681565b34801561046757600080fd5b506101a5610476366004611ce2565b6109bd565b34801561048757600080fd5b506102a6610496366004611d36565b610a2b565b6102a66104a9366004611d81565b610ca2565b3480156104ba57600080fd5b5060cf546101ff9073ffffffffffffffffffffffffffffffffffffffff1681565b3480156104e757600080fd5b5061053260cd547dffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff167e010000000000000000000000000000000000000000000000000000000000001790565b6040519081526020016101ba565b6105486115d3565b156105e05734156105e0576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152603d60248201527f43726f7373446f6d61696e4d657373656e6765723a2063616e6e6f742073656e60448201527f642076616c7565207769746820637573746f6d2067617320746f6b656e00000060648201526084015b60405180910390fd5b60cf546107129073ffffffffffffffffffffffffffffffffffffffff166106088585856109bd565b347fd764ad0b0000000000000000000000000000000000000000000000000000000061067460cd547dffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff167e010000000000000000000000000000000000000000000000000000000000001790565b338a34898c8c6040516024016106909796959493929190611e50565b604080517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe08184030181529190526020810180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff167fffffffff0000000000000000000000000000000000000000000000000000000090931692909217909152611612565b8373ffffffffffffffffffffffffffffffffffffffff167fcb0f7ffd78f9aee47a248fae8db181db6eee833039123e026dcbff529522e52a33858561079760cd547dffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff167e010000000000000000000000000000000000000000000000000000000000001790565b866040516107a9959493929190611eaf565b60405180910390a260405134815233907f8ebb2ec2465bdb2a06a66fc37a0963af8a2a6a1479d81d56fdb8cbb98096d5469060200160405180910390a2505060cd80547dffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff808216600101167fffff0000000000000000000000000000000000000000000000000000000000009091161790555050565b60fb54604080517f5c975abb000000000000000000000000000000000000000000000000000000008152905160009273ffffffffffffffffffffffffffffffffffffffff1691635c975abb9160048083019260209291908290030181865afa1580156108ad573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906108d19190611efd565b905090565b60cc5460009073ffffffffffffffffffffffffffffffffffffffff167fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff2153016109a0576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152603560248201527f43726f7373446f6d61696e4d657373656e6765723a2078446f6d61696e4d657360448201527f7361676553656e646572206973206e6f7420736574000000000000000000000060648201526084016105d7565b5060cc5473ffffffffffffffffffffffffffffffffffffffff1690565b6000611388619c4080603f6109d9604063ffffffff8816611f4e565b6109e39190611f7e565b6109ee601088611f4e565b6109fb9062030d40611fcc565b610a059190611fcc565b610a0f9190611fcc565b610a199190611fcc565b610a239190611fcc565b949350505050565b6000547501000000000000000000000000000000000000000000900460ff1615808015610a76575060005460017401000000000000000000000000000000000000000090910460ff16105b80610aa85750303b158015610aa8575060005474010000000000000000000000000000000000000000900460ff166001145b610b34576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602e60248201527f496e697469616c697a61626c653a20636f6e747261637420697320616c72656160448201527f647920696e697469616c697a656400000000000000000000000000000000000060648201526084016105d7565b600080547fffffffffffffffffffffff00ffffffffffffffffffffffffffffffffffffffff16740100000000000000000000000000000000000000001790558015610bba57600080547fffffffffffffffffffff00ffffffffffffffffffffffffffffffffffffffffff1675010000000000000000000000000000000000000000001790555b60fb805473ffffffffffffffffffffffffffffffffffffffff8087167fffffffffffffffffffffffff00000000000000000000000000000000000000009283161790925560fc805486841690831617905560fd805492851692909116919091179055610c397342000000000000000000000000000000000000076116ab565b8015610c9c57600080547fffffffffffffffffffff00ffffffffffffffffffffffffffffffffffffffffff169055604051600181527f7f26b83ff96e1f2b6a682f133852f6798a09c465da95921460cefb38474024989060200160405180910390a15b50505050565b610caa61083d565b15610d11576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601c60248201527f43726f7373446f6d61696e4d657373656e6765723a207061757365640000000060448201526064016105d7565b60f087901c60028110610dcc576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152604d60248201527f43726f7373446f6d61696e4d657373656e6765723a206f6e6c7920766572736960448201527f6f6e2030206f722031206d657373616765732061726520737570706f7274656460648201527f20617420746869732074696d6500000000000000000000000000000000000000608482015260a4016105d7565b8061ffff16600003610ec1576000610e1d878986868080601f0160208091040260200160405190810160405280939291908181526020018383808284376000920191909152508f92506117e7915050565b600081815260cb602052604090205490915060ff1615610ebf576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152603760248201527f43726f7373446f6d61696e4d657373656e6765723a206c65676163792077697460448201527f6864726177616c20616c72656164792072656c6179656400000000000000000060648201526084016105d7565b505b6000610f07898989898989898080601f01602080910402602001604051908101604052809392919081815260200183838082843760009201919091525061180692505050565b9050610f11611829565b15610f4957853414610f2557610f25611ff8565b600081815260ce602052604090205460ff1615610f4457610f44611ff8565b61109b565b3415610ffd576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152605060248201527f43726f7373446f6d61696e4d657373656e6765723a2076616c7565206d75737460448201527f206265207a65726f20756e6c657373206d6573736167652069732066726f6d2060648201527f612073797374656d206164647265737300000000000000000000000000000000608482015260a4016105d7565b600081815260ce602052604090205460ff1661109b576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152603060248201527f43726f7373446f6d61696e4d657373656e6765723a206d65737361676520636160448201527f6e6e6f74206265207265706c617965640000000000000000000000000000000060648201526084016105d7565b6110a487611905565b15611157576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152604360248201527f43726f7373446f6d61696e4d657373656e6765723a2063616e6e6f742073656e60448201527f64206d65737361676520746f20626c6f636b65642073797374656d206164647260648201527f6573730000000000000000000000000000000000000000000000000000000000608482015260a4016105d7565b600081815260cb602052604090205460ff16156111f6576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152603660248201527f43726f7373446f6d61696e4d657373656e6765723a206d65737361676520686160448201527f7320616c7265616479206265656e2072656c617965640000000000000000000060648201526084016105d7565b61121785611208611388619c40611fcc565b67ffffffffffffffff1661194b565b158061123d575060cc5473ffffffffffffffffffffffffffffffffffffffff1661dead14155b1561135657600081815260ce602052604080822080547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff001660011790555182917f99d0e048484baa1b1540b1367cb128acd7ab2946d1ed91ec10e3c85e4bf51b8f91a27fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff320161134f576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602d60248201527f43726f7373446f6d61696e4d657373656e6765723a206661696c656420746f2060448201527f72656c6179206d6573736167650000000000000000000000000000000000000060648201526084016105d7565b50506115ae565b60cc80547fffffffffffffffffffffffff00000000000000000000000000000000000000001673ffffffffffffffffffffffffffffffffffffffff8a1617905560006113e788619c405a6113aa9190612027565b8988888080601f01602080910402602001604051908101604052809392919081815260200183838082843760009201919091525061196992505050565b60cc80547fffffffffffffffffffffffff00000000000000000000000000000000000000001661dead1790559050801561149d57600082815260cb602052604090205460ff161561143a5761143a611ff8565b600082815260cb602052604080822080547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff001660011790555183917f4641df4a962071e12719d8c8c8e5ac7fc4d97b927346a3d7a335b1f7517e133c91a26115aa565b600082815260ce602052604080822080547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff001660011790555183917f99d0e048484baa1b1540b1367cb128acd7ab2946d1ed91ec10e3c85e4bf51b8f91a27fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff32016115aa576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602d60248201527f43726f7373446f6d61696e4d657373656e6765723a206661696c656420746f2060448201527f72656c6179206d6573736167650000000000000000000000000000000000000060648201526084016105d7565b5050505b50505050505050565b73ffffffffffffffffffffffffffffffffffffffff163b151590565b6000806115de611981565b5073ffffffffffffffffffffffffffffffffffffffff1673eeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeee141592915050565b60fc546040517fe9e05c4200000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff9091169063e9e05c4290849061167390889083908990600090899060040161203e565b6000604051808303818588803b15801561168c57600080fd5b505af11580156116a0573d6000803e3d6000fd5b505050505050505050565b6000547501000000000000000000000000000000000000000000900460ff16611756576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602b60248201527f496e697469616c697a61626c653a20636f6e7472616374206973206e6f74206960448201527f6e697469616c697a696e6700000000000000000000000000000000000000000060648201526084016105d7565b60cc5473ffffffffffffffffffffffffffffffffffffffff166117a05760cc80547fffffffffffffffffffffffff00000000000000000000000000000000000000001661dead1790555b60cf80547fffffffffffffffffffffffff00000000000000000000000000000000000000001673ffffffffffffffffffffffffffffffffffffffff92909216919091179055565b60006117f585858585611a1e565b805190602001209050949350505050565b6000611816878787878787611ab7565b8051906020012090509695505050505050565b60fc5460009073ffffffffffffffffffffffffffffffffffffffff16331480156108d1575060cf5460fc54604080517f9bf62d82000000000000000000000000000000000000000000000000000000008152905173ffffffffffffffffffffffffffffffffffffffff9384169390921691639bf62d82916004808201926020929091908290030181865afa1580156118c5573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906118e99190612096565b73ffffffffffffffffffffffffffffffffffffffff1614905090565b600073ffffffffffffffffffffffffffffffffffffffff8216301480611945575060fc5473ffffffffffffffffffffffffffffffffffffffff8381169116145b92915050565b600080603f83619c4001026040850201603f5a021015949350505050565b6000806000835160208501868989f195945050505050565b60fd54604080517f4397dfef0000000000000000000000000000000000000000000000000000000081528151600093849373ffffffffffffffffffffffffffffffffffffffff90911692634397dfef92600480830193928290030181865afa1580156119f1573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611a1591906120b3565b90939092509050565b606084848484604051602401611a3794939291906120f3565b604080517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe08184030181529190526020810180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff167fcbd4ece9000000000000000000000000000000000000000000000000000000001790529050949350505050565b6060868686868686604051602401611ad49695949392919061213d565b604080517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe08184030181529190526020810180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff167fd764ad0b0000000000000000000000000000000000000000000000000000000017905290509695505050505050565b73ffffffffffffffffffffffffffffffffffffffff81168114611b7857600080fd5b50565b60008083601f840112611b8d57600080fd5b50813567ffffffffffffffff811115611ba557600080fd5b602083019150836020828501011115611bbd57600080fd5b9250929050565b803563ffffffff81168114611bd857600080fd5b919050565b60008060008060608587031215611bf357600080fd5b8435611bfe81611b56565b9350602085013567ffffffffffffffff811115611c1a57600080fd5b611c2687828801611b7b565b9094509250611c39905060408601611bc4565b905092959194509250565b6000815180845260005b81811015611c6a57602081850181015186830182015201611c4e565b81811115611c7c576000602083870101525b50601f017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0169290920160200192915050565b602081526000611cc26020830184611c44565b9392505050565b600060208284031215611cdb57600080fd5b5035919050565b600080600060408486031215611cf757600080fd5b833567ffffffffffffffff811115611d0e57600080fd5b611d1a86828701611b7b565b9094509250611d2d905060208501611bc4565b90509250925092565b600080600060608486031215611d4b57600080fd5b8335611d5681611b56565b92506020840135611d6681611b56565b91506040840135611d7681611b56565b809150509250925092565b600080600080600080600060c0888a031215611d9c57600080fd5b873596506020880135611dae81611b56565b95506040880135611dbe81611b56565b9450606088013593506080880135925060a088013567ffffffffffffffff811115611de857600080fd5b611df48a828b01611b7b565b989b979a50959850939692959293505050565b8183528181602085013750600060208284010152600060207fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0601f840116840101905092915050565b878152600073ffffffffffffffffffffffffffffffffffffffff808916602084015280881660408401525085606083015263ffffffff8516608083015260c060a0830152611ea260c083018486611e07565b9998505050505050505050565b73ffffffffffffffffffffffffffffffffffffffff86168152608060208201526000611edf608083018688611e07565b905083604083015263ffffffff831660608301529695505050505050565b600060208284031215611f0f57600080fd5b81518015158114611cc257600080fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b600067ffffffffffffffff80831681851681830481118215151615611f7557611f75611f1f565b02949350505050565b600067ffffffffffffffff80841680611fc0577f4e487b7100000000000000000000000000000000000000000000000000000000600052601260045260246000fd5b92169190910492915050565b600067ffffffffffffffff808316818516808303821115611fef57611fef611f1f565b01949350505050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052600160045260246000fd5b60008282101561203957612039611f1f565b500390565b73ffffffffffffffffffffffffffffffffffffffff8616815284602082015267ffffffffffffffff84166040820152821515606082015260a06080820152600061208b60a0830184611c44565b979650505050505050565b6000602082840312156120a857600080fd5b8151611cc281611b56565b600080604083850312156120c657600080fd5b82516120d181611b56565b602084015190925060ff811681146120e857600080fd5b809150509250929050565b600073ffffffffffffffffffffffffffffffffffffffff80871683528086166020840152506080604083015261212c6080830185611c44565b905082606083015295945050505050565b868152600073ffffffffffffffffffffffffffffffffffffffff808816602084015280871660408401525084606083015283608083015260c060a083015261218860c0830184611c44565b9897505050505050505056fea164736f6c634300080f000a"; + bytes internal constant optimismMintableERC20FactoryCode = + hex"60806040523480156200001157600080fd5b5060043610620000935760003560e01c8063c4d66de81162000062578063c4d66de81462000175578063ce5ac90f146200018e578063e78cea9214620001a5578063ee9a31a214620001c657600080fd5b8063316b3739146200009857806354fd4d5014620000fb578063896f93d114620001475780638cf0629c146200015e575b600080fd5b620000d1620000a936600462000652565b60026020526000908152604090205473ffffffffffffffffffffffffffffffffffffffff1681565b60405173ffffffffffffffffffffffffffffffffffffffff90911681526020015b60405180910390f35b620001386040518060400160405280600d81526020017f312e31302e312d626574612e310000000000000000000000000000000000000081525081565b604051620000f29190620006e5565b620000d162000158366004620007dc565b620001e5565b620000d16200016f36600462000859565b620001fc565b6200018c6200018636600462000652565b6200041b565b005b620000d16200019f366004620007dc565b620005ed565b600154620000d19073ffffffffffffffffffffffffffffffffffffffff1681565b60015473ffffffffffffffffffffffffffffffffffffffff16620000d1565b6000620001f4848484620005ed565b949350505050565b600073ffffffffffffffffffffffffffffffffffffffff8516620002a7576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152603f60248201527f4f7074696d69736d4d696e7461626c654552433230466163746f72793a206d7560448201527f73742070726f766964652072656d6f746520746f6b656e20616464726573730060648201526084015b60405180910390fd5b600085858585604051602001620002c29493929190620008f0565b604051602081830303815290604052805190602001209050600081600160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff168888888860405162000312906200061a565b620003229594939291906200094a565b8190604051809103906000f590508015801562000343573d6000803e3d6000fd5b5073ffffffffffffffffffffffffffffffffffffffff81811660008181526002602052604080822080547fffffffffffffffffffffffff000000000000000000000000000000000000000016948d1694851790555193945090927fceeb8e7d520d7f3b65fc11a262b91066940193b05d4f93df07cfdced0eb551cf9190a360405133815273ffffffffffffffffffffffffffffffffffffffff80891691908316907f52fe89dd5930f343d25650b62fd367bae47088bcddffd2a88350a6ecdd620cdb9060200160405180910390a39695505050505050565b600054610100900460ff16158080156200043c5750600054600160ff909116105b80620004585750303b15801562000458575060005460ff166001145b620004e6576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602e60248201527f496e697469616c697a61626c653a20636f6e747261637420697320616c72656160448201527f647920696e697469616c697a656400000000000000000000000000000000000060648201526084016200029e565b600080547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0016600117905580156200054557600080547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00ff166101001790555b600180547fffffffffffffffffffffffff00000000000000000000000000000000000000001673ffffffffffffffffffffffffffffffffffffffff84161790558015620005e957600080547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00ff169055604051600181527f7f26b83ff96e1f2b6a682f133852f6798a09c465da95921460cefb38474024989060200160405180910390a15b5050565b6000620001f48484846012620001fc565b73ffffffffffffffffffffffffffffffffffffffff163b151590565b61178a80620009b083390190565b803573ffffffffffffffffffffffffffffffffffffffff811681146200064d57600080fd5b919050565b6000602082840312156200066557600080fd5b620006708262000628565b9392505050565b6000815180845260005b818110156200069f5760208185018101518683018201520162000681565b81811115620006b2576000602083870101525b50601f017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0169290920160200192915050565b60208152600062000670602083018462000677565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b600082601f8301126200073b57600080fd5b813567ffffffffffffffff80821115620007595762000759620006fa565b604051601f83017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0908116603f01168101908282118183101715620007a257620007a2620006fa565b81604052838152866020858801011115620007bc57600080fd5b836020870160208301376000602085830101528094505050505092915050565b600080600060608486031215620007f257600080fd5b620007fd8462000628565b9250602084013567ffffffffffffffff808211156200081b57600080fd5b620008298783880162000729565b935060408601359150808211156200084057600080fd5b506200084f8682870162000729565b9150509250925092565b600080600080608085870312156200087057600080fd5b6200087b8562000628565b9350602085013567ffffffffffffffff808211156200089957600080fd5b620008a78883890162000729565b94506040870135915080821115620008be57600080fd5b50620008cd8782880162000729565b925050606085013560ff81168114620008e557600080fd5b939692955090935050565b73ffffffffffffffffffffffffffffffffffffffff8516815260806020820152600062000921608083018662000677565b828103604084015262000935818662000677565b91505060ff8316606083015295945050505050565b600073ffffffffffffffffffffffffffffffffffffffff808816835280871660208401525060a060408301526200098560a083018662000677565b828103606084015262000999818662000677565b91505060ff83166080830152969550505050505056fe60e06040523480156200001157600080fd5b506040516200178a3803806200178a833981016040819052620000349162000163565b828260036200004483826200029e565b5060046200005382826200029e565b5050506001600160a01b039384166080529390921660a052505060ff1660c0526200036a565b80516001600160a01b03811681146200009157600080fd5b919050565b634e487b7160e01b600052604160045260246000fd5b600082601f830112620000be57600080fd5b81516001600160401b0380821115620000db57620000db62000096565b604051601f8301601f19908116603f0116810190828211818310171562000106576200010662000096565b816040528381526020925086838588010111156200012357600080fd5b600091505b8382101562000147578582018301518183018401529082019062000128565b83821115620001595760008385830101525b9695505050505050565b600080600080600060a086880312156200017c57600080fd5b620001878662000079565b9450620001976020870162000079565b60408701519094506001600160401b0380821115620001b557600080fd5b620001c389838a01620000ac565b94506060880151915080821115620001da57600080fd5b50620001e988828901620000ac565b925050608086015160ff811681146200020157600080fd5b809150509295509295909350565b600181811c908216806200022457607f821691505b6020821081036200024557634e487b7160e01b600052602260045260246000fd5b50919050565b601f8211156200029957600081815260208120601f850160051c81016020861015620002745750805b601f850160051c820191505b81811015620002955782815560010162000280565b5050505b505050565b81516001600160401b03811115620002ba57620002ba62000096565b620002d281620002cb84546200020f565b846200024b565b602080601f8311600181146200030a5760008415620002f15750858301515b600019600386901b1c1916600185901b17855562000295565b600085815260208120601f198616915b828110156200033b578886015182559484019460019091019084016200031a565b50858210156200035a5787850151600019600388901b60f8161c191681555b5050505050600190811b01905550565b60805160a05160c0516113d4620003b6600039600061024401526000818161034b015281816103e001528181610625015261075c0152600081816101a9015261037101526113d46000f3fe608060405234801561001057600080fd5b50600436106101775760003560e01c806370a08231116100d8578063ae1f6aaf1161008c578063dd62ed3e11610066578063dd62ed3e14610395578063e78cea9214610349578063ee9a31a2146103db57600080fd5b8063ae1f6aaf14610349578063c01e1bd61461036f578063d6c0b2c41461036f57600080fd5b80639dc29fac116100bd5780639dc29fac14610310578063a457c2d714610323578063a9059cbb1461033657600080fd5b806370a08231146102d257806395d89b411461030857600080fd5b806323b872dd1161012f5780633950935111610114578063395093511461026e57806340c10f191461028157806354fd4d501461029657600080fd5b806323b872dd1461022a578063313ce5671461023d57600080fd5b806306fdde031161016057806306fdde03146101f0578063095ea7b31461020557806318160ddd1461021857600080fd5b806301ffc9a71461017c578063033964be146101a4575b600080fd5b61018f61018a36600461117d565b610402565b60405190151581526020015b60405180910390f35b6101cb7f000000000000000000000000000000000000000000000000000000000000000081565b60405173ffffffffffffffffffffffffffffffffffffffff909116815260200161019b565b6101f86104f3565b60405161019b91906111c6565b61018f610213366004611262565b610585565b6002545b60405190815260200161019b565b61018f61023836600461128c565b61059d565b60405160ff7f000000000000000000000000000000000000000000000000000000000000000016815260200161019b565b61018f61027c366004611262565b6105c1565b61029461028f366004611262565b61060d565b005b6101f86040518060400160405280600c81526020017f312e332e312d626574612e31000000000000000000000000000000000000000081525081565b61021c6102e03660046112c8565b73ffffffffffffffffffffffffffffffffffffffff1660009081526020819052604090205490565b6101f8610735565b61029461031e366004611262565b610744565b61018f610331366004611262565b61085b565b61018f610344366004611262565b61092c565b7f00000000000000000000000000000000000000000000000000000000000000006101cb565b7f00000000000000000000000000000000000000000000000000000000000000006101cb565b61021c6103a33660046112e3565b73ffffffffffffffffffffffffffffffffffffffff918216600090815260016020908152604080832093909416825291909152205490565b6101cb7f000000000000000000000000000000000000000000000000000000000000000081565b60007f01ffc9a7000000000000000000000000000000000000000000000000000000007f1d1d8b63000000000000000000000000000000000000000000000000000000007fec4fc8e3000000000000000000000000000000000000000000000000000000007fffffffff0000000000000000000000000000000000000000000000000000000085168314806104bb57507fffffffff00000000000000000000000000000000000000000000000000000000858116908316145b806104ea57507fffffffff00000000000000000000000000000000000000000000000000000000858116908216145b95945050505050565b60606003805461050290611316565b80601f016020809104026020016040519081016040528092919081815260200182805461052e90611316565b801561057b5780601f106105505761010080835404028352916020019161057b565b820191906000526020600020905b81548152906001019060200180831161055e57829003601f168201915b5050505050905090565b60003361059381858561093a565b5060019392505050565b6000336105ab858285610aee565b6105b6858585610bc5565b506001949350505050565b33600081815260016020908152604080832073ffffffffffffffffffffffffffffffffffffffff871684529091528120549091906105939082908690610608908790611398565b61093a565b3373ffffffffffffffffffffffffffffffffffffffff7f000000000000000000000000000000000000000000000000000000000000000016146106d7576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152603460248201527f4f7074696d69736d4d696e7461626c6545524332303a206f6e6c79206272696460448201527f67652063616e206d696e7420616e64206275726e00000000000000000000000060648201526084015b60405180910390fd5b6106e18282610e78565b8173ffffffffffffffffffffffffffffffffffffffff167f0f6798a560793a54c3bcfe86a93cde1e73087d944c0ea20544137d41213968858260405161072991815260200190565b60405180910390a25050565b60606004805461050290611316565b3373ffffffffffffffffffffffffffffffffffffffff7f00000000000000000000000000000000000000000000000000000000000000001614610809576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152603460248201527f4f7074696d69736d4d696e7461626c6545524332303a206f6e6c79206272696460448201527f67652063616e206d696e7420616e64206275726e00000000000000000000000060648201526084016106ce565b6108138282610f98565b8173ffffffffffffffffffffffffffffffffffffffff167fcc16f5dbb4873280815c1ee09dbd06736cffcc184412cf7a71a0fdb75d397ca58260405161072991815260200190565b33600081815260016020908152604080832073ffffffffffffffffffffffffffffffffffffffff871684529091528120549091908381101561091f576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602560248201527f45524332303a2064656372656173656420616c6c6f77616e63652062656c6f7760448201527f207a65726f00000000000000000000000000000000000000000000000000000060648201526084016106ce565b6105b6828686840361093a565b600033610593818585610bc5565b73ffffffffffffffffffffffffffffffffffffffff83166109dc576040517f08c379a0000000000000000000000000000000000000000000000000000000008152602060048201526024808201527f45524332303a20617070726f76652066726f6d20746865207a65726f2061646460448201527f726573730000000000000000000000000000000000000000000000000000000060648201526084016106ce565b73ffffffffffffffffffffffffffffffffffffffff8216610a7f576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602260248201527f45524332303a20617070726f766520746f20746865207a65726f20616464726560448201527f737300000000000000000000000000000000000000000000000000000000000060648201526084016106ce565b73ffffffffffffffffffffffffffffffffffffffff83811660008181526001602090815260408083209487168084529482529182902085905590518481527f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92591015b60405180910390a3505050565b73ffffffffffffffffffffffffffffffffffffffff8381166000908152600160209081526040808320938616835292905220547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff8114610bbf5781811015610bb2576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601d60248201527f45524332303a20696e73756666696369656e7420616c6c6f77616e636500000060448201526064016106ce565b610bbf848484840361093a565b50505050565b73ffffffffffffffffffffffffffffffffffffffff8316610c68576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602560248201527f45524332303a207472616e736665722066726f6d20746865207a65726f20616460448201527f647265737300000000000000000000000000000000000000000000000000000060648201526084016106ce565b73ffffffffffffffffffffffffffffffffffffffff8216610d0b576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602360248201527f45524332303a207472616e7366657220746f20746865207a65726f206164647260448201527f657373000000000000000000000000000000000000000000000000000000000060648201526084016106ce565b73ffffffffffffffffffffffffffffffffffffffff831660009081526020819052604090205481811015610dc1576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602660248201527f45524332303a207472616e7366657220616d6f756e742065786365656473206260448201527f616c616e6365000000000000000000000000000000000000000000000000000060648201526084016106ce565b73ffffffffffffffffffffffffffffffffffffffff808516600090815260208190526040808220858503905591851681529081208054849290610e05908490611398565b925050819055508273ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef84604051610e6b91815260200190565b60405180910390a3610bbf565b73ffffffffffffffffffffffffffffffffffffffff8216610ef5576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601f60248201527f45524332303a206d696e7420746f20746865207a65726f20616464726573730060448201526064016106ce565b8060026000828254610f079190611398565b909155505073ffffffffffffffffffffffffffffffffffffffff821660009081526020819052604081208054839290610f41908490611398565b909155505060405181815273ffffffffffffffffffffffffffffffffffffffff8316906000907fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef9060200160405180910390a35050565b73ffffffffffffffffffffffffffffffffffffffff821661103b576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602160248201527f45524332303a206275726e2066726f6d20746865207a65726f2061646472657360448201527f730000000000000000000000000000000000000000000000000000000000000060648201526084016106ce565b73ffffffffffffffffffffffffffffffffffffffff8216600090815260208190526040902054818110156110f1576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602260248201527f45524332303a206275726e20616d6f756e7420657863656564732062616c616e60448201527f636500000000000000000000000000000000000000000000000000000000000060648201526084016106ce565b73ffffffffffffffffffffffffffffffffffffffff8316600090815260208190526040812083830390556002805484929061112d9084906113b0565b909155505060405182815260009073ffffffffffffffffffffffffffffffffffffffff8516907fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef90602001610ae1565b60006020828403121561118f57600080fd5b81357fffffffff00000000000000000000000000000000000000000000000000000000811681146111bf57600080fd5b9392505050565b600060208083528351808285015260005b818110156111f3578581018301518582016040015282016111d7565b81811115611205576000604083870101525b50601f017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe016929092016040019392505050565b803573ffffffffffffffffffffffffffffffffffffffff8116811461125d57600080fd5b919050565b6000806040838503121561127557600080fd5b61127e83611239565b946020939093013593505050565b6000806000606084860312156112a157600080fd5b6112aa84611239565b92506112b860208501611239565b9150604084013590509250925092565b6000602082840312156112da57600080fd5b6111bf82611239565b600080604083850312156112f657600080fd5b6112ff83611239565b915061130d60208401611239565b90509250929050565b600181811c9082168061132a57607f821691505b602082108103611363577f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b50919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b600082198211156113ab576113ab611369565b500190565b6000828210156113c2576113c2611369565b50039056fea164736f6c634300080f000aa164736f6c634300080f000a"; bytes internal constant systemConfigCode = - hex"608060405234801561001057600080fd5b50600436106102de5760003560e01c8063a711986911610186578063e0e2016d116100e3578063f2fde38b11610097578063f8c68de011610071578063f8c68de0146106e9578063fd32aa0f146106f1578063ffa1ad74146106f957600080fd5b8063f2fde38b146106b9578063f45e65d8146106cc578063f68016b7146106d557600080fd5b8063e81b2c6d116100c8578063e81b2c6d14610688578063ec70751714610691578063f2b4e617146106b157600080fd5b8063e0e2016d14610678578063e2a3285c1461068057600080fd5b8063c9b26f611161013a578063d84447151161011f578063d844471514610655578063dac6e63a1461065d578063db9040fa1461066557600080fd5b8063c9b26f611461050e578063cc731b021461052157600080fd5b8063bc49ce5f1161016b578063bc49ce5f146104cd578063bfb14fb7146104d5578063c4e8ddfa1461050657600080fd5b8063a7119869146104b2578063b40a817c146104ba57600080fd5b80634397dfef1161023f578063550fcdc9116101f35780638da5cb5b116101cd5780638da5cb5b14610479578063935f029e146104975780639b7d7f0a146104aa57600080fd5b8063550fcdc9146104615780635d73369c14610469578063715018a61461047157600080fd5b80634add321d116102245780634add321d146103e95780634f16540b146103f157806354fd4d501461041857600080fd5b80634397dfef146103ab57806348cd4cb1146103e157600080fd5b806318d13918116102965780631fd19ee11161027b5780631fd19ee114610378578063213268491461038057806321d7fde51461039857600080fd5b806318d139181461035b57806319f5cea81461037057600080fd5b80630a49cb03116102c75780630a49cb031461032b5780630ae14b1b146103335780630c18c1621461035257600080fd5b806306c92657146102e3578063078f29cf146102fe575b600080fd5b6102eb610701565b6040519081526020015b60405180910390f35b61030661072f565b60405173ffffffffffffffffffffffffffffffffffffffff90911681526020016102f5565b610306610768565b630bebc2005b60405167ffffffffffffffff90911681526020016102f5565b6102eb60655481565b61036e610369366004612248565b610798565b005b6102eb6107ac565b6103066107d7565b610388610801565b60405190151581526020016102f5565b61036e6103a636600461227e565b610840565b6103b3610856565b6040805173ffffffffffffffffffffffffffffffffffffffff909316835260ff9091166020830152016102f5565b6102eb61086a565b61033961089a565b6102eb7f65a7ed542fb37fe237fdfbdd70b31598523fe5b32879e307bae27a0bd9581c0881565b6104546040518060400160405280600c81526020017f322e332e302d626574612e31000000000000000000000000000000000000000081525081565b6040516102f59190612327565b6104546108c0565b6102eb6108ca565b61036e6108f5565b60335473ffffffffffffffffffffffffffffffffffffffff16610306565b61036e6104a536600461233a565b610909565b61030661091b565b61030661094b565b61036e6104c8366004612374565b61097b565b6102eb61098c565b6068546104f19068010000000000000000900463ffffffff1681565b60405163ffffffff90911681526020016102f5565b6103066109b7565b61036e61051c36600461238f565b6109e7565b6105e56040805160c081018252600080825260208201819052918101829052606081018290526080810182905260a0810191909152506040805160c08101825260695463ffffffff8082168352640100000000820460ff9081166020850152650100000000008304169383019390935266010000000000008104831660608301526a0100000000000000000000810490921660808201526e0100000000000000000000000000009091046fffffffffffffffffffffffffffffffff1660a082015290565b6040516102f59190600060c08201905063ffffffff80845116835260ff602085015116602084015260ff6040850151166040840152806060850151166060840152806080850151166080840152506fffffffffffffffffffffffffffffffff60a08401511660a083015292915050565b6104546109f8565b610306610a02565b61036e6106733660046124c2565b610a32565b6102eb610e3d565b6102eb610e68565b6102eb60675481565b6068546104f1906c01000000000000000000000000900463ffffffff1681565b610306610e93565b61036e6106c7366004612248565b610ec3565b6102eb60665481565b6068546103399067ffffffffffffffff1681565b6102eb610f77565b6102eb610fa2565b6102eb600081565b61072c60017fa04c5bb938ca6fc46d95553abf0a76345ce3e722a30bf4f74928b8e7d852320d612644565b81565b600061076361075f60017f9904ba90dde5696cda05c9e0dab5cbaa0fea005ace4d11218a02ac668dad6377612644565b5490565b905090565b600061076361075f60017f4b6c74f9e688cb39801f2112c14a8c57232a3fc5202e1444126d4bce86eb19ad612644565b6107a0611208565b6107a981611289565b50565b61072c60017f46adcbebc6be8ce551740c29c47c8798210f23f7f4086c41752944352568d5a8612644565b60006107637f65a7ed542fb37fe237fdfbdd70b31598523fe5b32879e307bae27a0bd9581c085490565b60008061080c610856565b5073ffffffffffffffffffffffffffffffffffffffff1673eeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeee141592915050565b610848611208565b6108528282611346565b5050565b60008061086161118b565b90939092509050565b600061076361075f60017fa11ee3ab75b40e88a0105e935d17cd36c8faee0138320d776c411291bdbbb1a0612644565b6069546000906107639063ffffffff6a010000000000000000000082048116911661265b565b6060610763611484565b61072c60017f383f291819e6d54073bc9a648251d97421076bdd101933c0c022219ce9580637612644565b6108fd611208565b6109076000611545565b565b610911611208565b61085282826115bc565b600061076361075f60017fa04c5bb938ca6fc46d95553abf0a76345ce3e722a30bf4f74928b8e7d852320d612644565b600061076361075f60017f383f291819e6d54073bc9a648251d97421076bdd101933c0c022219ce9580637612644565b610983611208565b6107a981611692565b61072c60017f71ac12829d66ee73d8d95bff50b3589745ce57edae70a3fb111a2342464dc598612644565b600061076361075f60017f46adcbebc6be8ce551740c29c47c8798210f23f7f4086c41752944352568d5a8612644565b6109ef611208565b6107a9816117e8565b6060610763611810565b600061076361075f60017f71ac12829d66ee73d8d95bff50b3589745ce57edae70a3fb111a2342464dc598612644565b600054610100900460ff1615808015610a525750600054600160ff909116105b80610a6c5750303b158015610a6c575060005460ff166001145b610afd576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602e60248201527f496e697469616c697a61626c653a20636f6e747261637420697320616c72656160448201527f647920696e697469616c697a656400000000000000000000000000000000000060648201526084015b60405180910390fd5b600080547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff001660011790558015610b5b57600080547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00ff166101001790555b610b636118c6565b610b6c8a610ec3565b610b75876117e8565b610b7f8989611346565b610b8886611692565b610bb17f65a7ed542fb37fe237fdfbdd70b31598523fe5b32879e307bae27a0bd9581c08869055565b610be4610bdf60017f71ac12829d66ee73d8d95bff50b3589745ce57edae70a3fb111a2342464dc598612644565b849055565b610c18610c1260017f383f291819e6d54073bc9a648251d97421076bdd101933c0c022219ce9580637612644565b83519055565b610c4f610c4660017f46adcbebc6be8ce551740c29c47c8798210f23f7f4086c41752944352568d5a8612644565b60208401519055565b610c86610c7d60017f9904ba90dde5696cda05c9e0dab5cbaa0fea005ace4d11218a02ac668dad6377612644565b60408401519055565b610cbd610cb460017f52322a25d9f59ea17656545543306b7aef62bc0cc53a0e65ccfa0c75b97aa907612644565b60608401519055565b610cf4610ceb60017f4b6c74f9e688cb39801f2112c14a8c57232a3fc5202e1444126d4bce86eb19ad612644565b60808401519055565b610d2b610d2260017fa04c5bb938ca6fc46d95553abf0a76345ce3e722a30bf4f74928b8e7d852320d612644565b60a08401519055565b610d33611965565b610d408260c001516119cd565b610d4984611cd7565b610d5161089a565b67ffffffffffffffff168667ffffffffffffffff161015610dce576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601f60248201527f53797374656d436f6e6669673a20676173206c696d697420746f6f206c6f77006044820152606401610af4565b8015610e3157600080547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00ff169055604051600181527f7f26b83ff96e1f2b6a682f133852f6798a09c465da95921460cefb38474024989060200160405180910390a15b50505050505050505050565b61072c60017fa11ee3ab75b40e88a0105e935d17cd36c8faee0138320d776c411291bdbbb1a0612644565b61072c60017f52322a25d9f59ea17656545543306b7aef62bc0cc53a0e65ccfa0c75b97aa907612644565b600061076361075f60017f52322a25d9f59ea17656545543306b7aef62bc0cc53a0e65ccfa0c75b97aa907612644565b610ecb611208565b73ffffffffffffffffffffffffffffffffffffffff8116610f6e576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602660248201527f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160448201527f64647265737300000000000000000000000000000000000000000000000000006064820152608401610af4565b6107a981611545565b61072c60017f9904ba90dde5696cda05c9e0dab5cbaa0fea005ace4d11218a02ac668dad6377612644565b61072c60017f4b6c74f9e688cb39801f2112c14a8c57232a3fc5202e1444126d4bce86eb19ad612644565b9055565b73ffffffffffffffffffffffffffffffffffffffff163b151590565b6000602082511115611081576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152603660248201527f476173506179696e67546f6b656e3a20737472696e672063616e6e6f7420626560448201527f2067726561746572207468616e203332206279746573000000000000000000006064820152608401610af4565b61108a82611162565b92915050565b6110f66110be60017f04adb1412b2ddc16fcc0d4538d5c8f07cf9c83abecc6b41f6f69037b708fbcec612644565b74ff000000000000000000000000000000000000000060a086901b1673ffffffffffffffffffffffffffffffffffffffff8716179055565b61112961112460017f657c3582c29b3176614e3a33ddd1ec48352696a04e92b3c0566d72010fa8863d612644565b839055565b61115c61115760017fa48b38a4b44951360fbdcbfaaeae5ed6ae92585412e9841b70ec72ed8cd05764612644565b829055565b50505050565b80516021811061117a5763ec92f9a36000526004601cfd5b9081015160209190910360031b1b90565b600080806111bd61075f60017f04adb1412b2ddc16fcc0d4538d5c8f07cf9c83abecc6b41f6f69037b708fbcec612644565b73ffffffffffffffffffffffffffffffffffffffff811693509050826111fc575073eeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeee92601292509050565b60a081901c9150509091565b60335473ffffffffffffffffffffffffffffffffffffffff163314610907576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e65726044820152606401610af4565b6112b27f65a7ed542fb37fe237fdfbdd70b31598523fe5b32879e307bae27a0bd9581c08829055565b6040805173ffffffffffffffffffffffffffffffffffffffff8316602082015260009101604080517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0818403018152919052905060035b60007f1d2b0bda21d56b8bd12d4f94ebacffdfb35f5e226f84b461103bb8beab6353be8360405161133a9190612327565b60405180910390a35050565b606880547fffffffffffffffffffffffffffffffff0000000000000000ffffffffffffffff166801000000000000000063ffffffff8581169182027fffffffffffffffffffffffffffffffff00000000ffffffffffffffffffffffff16929092176c0100000000000000000000000092851692909202919091179091557f0100000000000000000000000000000000000000000000000000000000000000602083811b67ffffffff000000001690921717606681905560655460408051938401919091528201526000906060015b604080517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe08184030181529190529050600160007f1d2b0bda21d56b8bd12d4f94ebacffdfb35f5e226f84b461103bb8beab6353be836040516114779190612327565b60405180910390a3505050565b6060600061149061118b565b5090507fffffffffffffffffffffffff111111111111111111111111111111111111111273ffffffffffffffffffffffffffffffffffffffff82160161150957505060408051808201909152600381527f4554480000000000000000000000000000000000000000000000000000000000602082015290565b61153f61153a61075f60017fa48b38a4b44951360fbdcbfaaeae5ed6ae92585412e9841b70ec72ed8cd05764612644565b61214b565b91505090565b6033805473ffffffffffffffffffffffffffffffffffffffff8381167fffffffffffffffffffffffff0000000000000000000000000000000000000000831681179093556040519116919082907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e090600090a35050565b7fff0000000000000000000000000000000000000000000000000000000000000081161561166c576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602160248201527f53797374656d436f6e6669673a207363616c61722065786365656473206d617860448201527f2e000000000000000000000000000000000000000000000000000000000000006064820152608401610af4565b606582905560668190556040805160208101849052908101829052600090606001611414565b61169a61089a565b67ffffffffffffffff168167ffffffffffffffff161015611717576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601f60248201527f53797374656d436f6e6669673a20676173206c696d697420746f6f206c6f77006044820152606401610af4565b630bebc20067ffffffffffffffff8216111561178f576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820181905260248201527f53797374656d436f6e6669673a20676173206c696d697420746f6f20686967686044820152606401610af4565b606880547fffffffffffffffffffffffffffffffffffffffffffffffff00000000000000001667ffffffffffffffff83169081179091556040805160208082019390935281518082039093018352810190526002611309565b6067819055604080516020808201849052825180830390910181529082019091526000611309565b6060600061181c61118b565b5090507fffffffffffffffffffffffff111111111111111111111111111111111111111273ffffffffffffffffffffffffffffffffffffffff82160161189557505060408051808201909152600581527f4574686572000000000000000000000000000000000000000000000000000000602082015290565b61153f61153a61075f60017f657c3582c29b3176614e3a33ddd1ec48352696a04e92b3c0566d72010fa8863d612644565b600054610100900460ff1661195d576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602b60248201527f496e697469616c697a61626c653a20636f6e7472616374206973206e6f74206960448201527f6e697469616c697a696e670000000000000000000000000000000000000000006064820152608401610af4565b61090761217f565b61199361075f60017fa11ee3ab75b40e88a0105e935d17cd36c8faee0138320d776c411291bdbbb1a0612644565b600003610907576109076119c860017fa11ee3ab75b40e88a0105e935d17cd36c8faee0138320d776c411291bdbbb1a0612644565b439055565b73ffffffffffffffffffffffffffffffffffffffff811615801590611a1c575073ffffffffffffffffffffffffffffffffffffffff811673eeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeee14155b8015611a2d5750611a2b610801565b155b156107a957601260ff168173ffffffffffffffffffffffffffffffffffffffff1663313ce5676040518163ffffffff1660e01b8152600401602060405180830381865afa158015611a82573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611aa69190612687565b60ff1614611b36576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602e60248201527f53797374656d436f6e6669673a2062616420646563696d616c73206f6620676160448201527f7320706179696e6720746f6b656e0000000000000000000000000000000000006064820152608401610af4565b6000611bd18273ffffffffffffffffffffffffffffffffffffffff166306fdde036040518163ffffffff1660e01b8152600401600060405180830381865afa158015611b86573d6000803e3d6000fd5b505050506040513d6000823e601f3d9081017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0168201604052611bcc91908101906126a4565b610fed565b90506000611c238373ffffffffffffffffffffffffffffffffffffffff166395d89b416040518163ffffffff1660e01b8152600401600060405180830381865afa158015611b86573d6000803e3d6000fd5b9050611c328360128484611090565b611c3a610768565b6040517f71cfaa3f00000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff858116600483015260126024830152604482018590526064820184905291909116906371cfaa3f90608401600060405180830381600087803b158015611cba57600080fd5b505af1158015611cce573d6000803e3d6000fd5b50505050505050565b8060a001516fffffffffffffffffffffffffffffffff16816060015163ffffffff161115611d87576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152603560248201527f53797374656d436f6e6669673a206d696e206261736520666565206d7573742060448201527f6265206c657373207468616e206d6178206261736500000000000000000000006064820152608401610af4565b6001816040015160ff1611611e1e576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602f60248201527f53797374656d436f6e6669673a2064656e6f6d696e61746f72206d757374206260448201527f65206c6172676572207468616e203100000000000000000000000000000000006064820152608401610af4565b6068546080820151825167ffffffffffffffff90921691611e3f919061276f565b63ffffffff161115611ead576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601f60248201527f53797374656d436f6e6669673a20676173206c696d697420746f6f206c6f77006044820152606401610af4565b6000816020015160ff1611611f44576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602f60248201527f53797374656d436f6e6669673a20656c6173746963697479206d756c7469706c60448201527f6965722063616e6e6f74206265203000000000000000000000000000000000006064820152608401610af4565b8051602082015163ffffffff82169160ff90911690611f6490829061278e565b611f6e91906127d8565b63ffffffff1614612001576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152603760248201527f53797374656d436f6e6669673a20707265636973696f6e206c6f73732077697460448201527f6820746172676574207265736f75726365206c696d69740000000000000000006064820152608401610af4565b805160698054602084015160408501516060860151608087015160a09097015163ffffffff9687167fffffffffffffffffffffffffffffffffffffffffffffffffffffff00000000009095169490941764010000000060ff94851602177fffffffffffffffffffffffffffffffffffffffffffff0000000000ffffffffff166501000000000093909216929092027fffffffffffffffffffffffffffffffffffffffffffff00000000ffffffffffff1617660100000000000091851691909102177fffff0000000000000000000000000000000000000000ffffffffffffffffffff166a010000000000000000000093909416929092027fffff00000000000000000000000000000000ffffffffffffffffffffffffffff16929092176e0100000000000000000000000000006fffffffffffffffffffffffffffffffff90921691909102179055565b60405160005b82811a1561216157600101612151565b80825260208201838152600082820152505060408101604052919050565b600054610100900460ff16612216576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602b60248201527f496e697469616c697a61626c653a20636f6e7472616374206973206e6f74206960448201527f6e697469616c697a696e670000000000000000000000000000000000000000006064820152608401610af4565b61090733611545565b803573ffffffffffffffffffffffffffffffffffffffff8116811461224357600080fd5b919050565b60006020828403121561225a57600080fd5b6122638261221f565b9392505050565b803563ffffffff8116811461224357600080fd5b6000806040838503121561229157600080fd5b61229a8361226a565b91506122a86020840161226a565b90509250929050565b60005b838110156122cc5781810151838201526020016122b4565b8381111561115c5750506000910152565b600081518084526122f58160208601602086016122b1565b601f017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0169290920160200192915050565b60208152600061226360208301846122dd565b6000806040838503121561234d57600080fd5b50508035926020909101359150565b803567ffffffffffffffff8116811461224357600080fd5b60006020828403121561238657600080fd5b6122638261235c565b6000602082840312156123a157600080fd5b5035919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b60405160c0810167ffffffffffffffff811182821017156123fa576123fa6123a8565b60405290565b60ff811681146107a957600080fd5b600060e0828403121561242157600080fd5b60405160e0810181811067ffffffffffffffff82111715612444576124446123a8565b6040529050806124538361221f565b81526124616020840161221f565b60208201526124726040840161221f565b60408201526124836060840161221f565b60608201526124946080840161221f565b60808201526124a560a0840161221f565b60a08201526124b660c0840161221f565b60c08201525092915050565b6000806000806000806000806000898b036102808112156124e257600080fd5b6124eb8b61221f565b99506124f960208c0161226a565b985061250760408c0161226a565b975060608b0135965061251c60808c0161235c565b955061252a60a08c0161221f565b945060c07fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff408201121561255c57600080fd5b506125656123d7565b61257160c08c0161226a565b815260e08b013561258181612400565b60208201526101008b013561259581612400565b60408201526125a76101208c0161226a565b60608201526125b96101408c0161226a565b60808201526101608b01356fffffffffffffffffffffffffffffffff811681146125e257600080fd5b60a082015292506125f66101808b0161221f565b91506126068b6101a08c0161240f565b90509295985092959850929598565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b60008282101561265657612656612615565b500390565b600067ffffffffffffffff80831681851680830382111561267e5761267e612615565b01949350505050565b60006020828403121561269957600080fd5b815161226381612400565b6000602082840312156126b657600080fd5b815167ffffffffffffffff808211156126ce57600080fd5b818401915084601f8301126126e257600080fd5b8151818111156126f4576126f46123a8565b604051601f82017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0908116603f0116810190838211818310171561273a5761273a6123a8565b8160405282815287602084870101111561275357600080fd5b6127648360208301602088016122b1565b979650505050505050565b600063ffffffff80831681851680830382111561267e5761267e612615565b600063ffffffff808416806127cc577f4e487b7100000000000000000000000000000000000000000000000000000000600052601260045260246000fd5b92169190910492915050565b600063ffffffff808316818516818304811182151516156127fb576127fb612615565b0294935050505056fea164736f6c634300080f000a"; + hex"608060405234801561001057600080fd5b50600436106102de5760003560e01c8063a711986911610186578063e0e2016d116100e3578063f2fde38b11610097578063f8c68de011610071578063f8c68de0146106e2578063fd32aa0f146106ea578063ffa1ad74146106f257600080fd5b8063f2fde38b146106b2578063f45e65d8146106c5578063f68016b7146106ce57600080fd5b8063e81b2c6d116100c8578063e81b2c6d14610681578063ec7075171461068a578063f2b4e617146106aa57600080fd5b8063e0e2016d14610671578063e2a3285c1461067957600080fd5b8063c9b26f611161013a578063d84447151161011f578063d84447151461064e578063dac6e63a14610656578063db9040fa1461065e57600080fd5b8063c9b26f6114610507578063cc731b021461051a57600080fd5b8063bc49ce5f1161016b578063bc49ce5f146104c6578063bfb14fb7146104ce578063c4e8ddfa146104ff57600080fd5b8063a7119869146104ab578063b40a817c146104b357600080fd5b80634397dfef1161023f578063550fcdc9116101f35780638da5cb5b116101cd5780638da5cb5b14610472578063935f029e146104905780639b7d7f0a146104a357600080fd5b8063550fcdc91461045a5780635d73369c14610462578063715018a61461046a57600080fd5b80634add321d116102245780634add321d146103e95780634f16540b146103f157806354fd4d501461041857600080fd5b80634397dfef146103ab57806348cd4cb1146103e157600080fd5b806318d13918116102965780631fd19ee11161027b5780631fd19ee114610378578063213268491461038057806321d7fde51461039857600080fd5b806318d139181461035b57806319f5cea81461037057600080fd5b80630a49cb03116102c75780630a49cb031461032b5780630ae14b1b146103335780630c18c1621461035257600080fd5b806306c92657146102e3578063078f29cf146102fe575b600080fd5b6102eb6106fa565b6040519081526020015b60405180910390f35b610306610728565b60405173ffffffffffffffffffffffffffffffffffffffff90911681526020016102f5565b610306610761565b630bebc2005b60405167ffffffffffffffff90911681526020016102f5565b6102eb60655481565b61036e610369366004612241565b610791565b005b6102eb6107a5565b6103066107d0565b6103886107fa565b60405190151581526020016102f5565b61036e6103a6366004612277565b610839565b6103b361084f565b6040805173ffffffffffffffffffffffffffffffffffffffff909316835260ff9091166020830152016102f5565b6102eb610863565b610339610893565b6102eb7f65a7ed542fb37fe237fdfbdd70b31598523fe5b32879e307bae27a0bd9581c0881565b60408051808201909152600c81527f322e332e302d626574612e33000000000000000000000000000000000000000060208201525b6040516102f59190612320565b61044d6108b9565b6102eb6108c3565b61036e6108ee565b60335473ffffffffffffffffffffffffffffffffffffffff16610306565b61036e61049e366004612333565b610902565b610306610914565b610306610944565b61036e6104c136600461236d565b610974565b6102eb610985565b6068546104ea9068010000000000000000900463ffffffff1681565b60405163ffffffff90911681526020016102f5565b6103066109b0565b61036e610515366004612388565b6109e0565b6105de6040805160c081018252600080825260208201819052918101829052606081018290526080810182905260a0810191909152506040805160c08101825260695463ffffffff8082168352640100000000820460ff9081166020850152650100000000008304169383019390935266010000000000008104831660608301526a0100000000000000000000810490921660808201526e0100000000000000000000000000009091046fffffffffffffffffffffffffffffffff1660a082015290565b6040516102f59190600060c08201905063ffffffff80845116835260ff602085015116602084015260ff6040850151166040840152806060850151166060840152806080850151166080840152506fffffffffffffffffffffffffffffffff60a08401511660a083015292915050565b61044d6109f1565b6103066109fb565b61036e61066c3660046124bb565b610a2b565b6102eb610e36565b6102eb610e61565b6102eb60675481565b6068546104ea906c01000000000000000000000000900463ffffffff1681565b610306610e8c565b61036e6106c0366004612241565b610ebc565b6102eb60665481565b6068546103399067ffffffffffffffff1681565b6102eb610f70565b6102eb610f9b565b6102eb600081565b61072560017fa04c5bb938ca6fc46d95553abf0a76345ce3e722a30bf4f74928b8e7d852320d61263d565b81565b600061075c61075860017f9904ba90dde5696cda05c9e0dab5cbaa0fea005ace4d11218a02ac668dad637761263d565b5490565b905090565b600061075c61075860017f4b6c74f9e688cb39801f2112c14a8c57232a3fc5202e1444126d4bce86eb19ad61263d565b610799611201565b6107a281611282565b50565b61072560017f46adcbebc6be8ce551740c29c47c8798210f23f7f4086c41752944352568d5a861263d565b600061075c7f65a7ed542fb37fe237fdfbdd70b31598523fe5b32879e307bae27a0bd9581c085490565b60008061080561084f565b5073ffffffffffffffffffffffffffffffffffffffff1673eeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeee141592915050565b610841611201565b61084b828261133f565b5050565b60008061085a611184565b90939092509050565b600061075c61075860017fa11ee3ab75b40e88a0105e935d17cd36c8faee0138320d776c411291bdbbb1a061263d565b60695460009061075c9063ffffffff6a0100000000000000000000820481169116612654565b606061075c61147d565b61072560017f383f291819e6d54073bc9a648251d97421076bdd101933c0c022219ce958063761263d565b6108f6611201565b610900600061153e565b565b61090a611201565b61084b82826115b5565b600061075c61075860017fa04c5bb938ca6fc46d95553abf0a76345ce3e722a30bf4f74928b8e7d852320d61263d565b600061075c61075860017f383f291819e6d54073bc9a648251d97421076bdd101933c0c022219ce958063761263d565b61097c611201565b6107a28161168b565b61072560017f71ac12829d66ee73d8d95bff50b3589745ce57edae70a3fb111a2342464dc59861263d565b600061075c61075860017f46adcbebc6be8ce551740c29c47c8798210f23f7f4086c41752944352568d5a861263d565b6109e8611201565b6107a2816117e1565b606061075c611809565b600061075c61075860017f71ac12829d66ee73d8d95bff50b3589745ce57edae70a3fb111a2342464dc59861263d565b600054610100900460ff1615808015610a4b5750600054600160ff909116105b80610a655750303b158015610a65575060005460ff166001145b610af6576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602e60248201527f496e697469616c697a61626c653a20636f6e747261637420697320616c72656160448201527f647920696e697469616c697a656400000000000000000000000000000000000060648201526084015b60405180910390fd5b600080547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff001660011790558015610b5457600080547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00ff166101001790555b610b5c6118bf565b610b658a610ebc565b610b6e876117e1565b610b78898961133f565b610b818661168b565b610baa7f65a7ed542fb37fe237fdfbdd70b31598523fe5b32879e307bae27a0bd9581c08869055565b610bdd610bd860017f71ac12829d66ee73d8d95bff50b3589745ce57edae70a3fb111a2342464dc59861263d565b849055565b610c11610c0b60017f383f291819e6d54073bc9a648251d97421076bdd101933c0c022219ce958063761263d565b83519055565b610c48610c3f60017f46adcbebc6be8ce551740c29c47c8798210f23f7f4086c41752944352568d5a861263d565b60208401519055565b610c7f610c7660017f9904ba90dde5696cda05c9e0dab5cbaa0fea005ace4d11218a02ac668dad637761263d565b60408401519055565b610cb6610cad60017f52322a25d9f59ea17656545543306b7aef62bc0cc53a0e65ccfa0c75b97aa90761263d565b60608401519055565b610ced610ce460017f4b6c74f9e688cb39801f2112c14a8c57232a3fc5202e1444126d4bce86eb19ad61263d565b60808401519055565b610d24610d1b60017fa04c5bb938ca6fc46d95553abf0a76345ce3e722a30bf4f74928b8e7d852320d61263d565b60a08401519055565b610d2c61195e565b610d398260c001516119c6565b610d4284611cd0565b610d4a610893565b67ffffffffffffffff168667ffffffffffffffff161015610dc7576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601f60248201527f53797374656d436f6e6669673a20676173206c696d697420746f6f206c6f77006044820152606401610aed565b8015610e2a57600080547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00ff169055604051600181527f7f26b83ff96e1f2b6a682f133852f6798a09c465da95921460cefb38474024989060200160405180910390a15b50505050505050505050565b61072560017fa11ee3ab75b40e88a0105e935d17cd36c8faee0138320d776c411291bdbbb1a061263d565b61072560017f52322a25d9f59ea17656545543306b7aef62bc0cc53a0e65ccfa0c75b97aa90761263d565b600061075c61075860017f52322a25d9f59ea17656545543306b7aef62bc0cc53a0e65ccfa0c75b97aa90761263d565b610ec4611201565b73ffffffffffffffffffffffffffffffffffffffff8116610f67576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602660248201527f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160448201527f64647265737300000000000000000000000000000000000000000000000000006064820152608401610aed565b6107a28161153e565b61072560017f9904ba90dde5696cda05c9e0dab5cbaa0fea005ace4d11218a02ac668dad637761263d565b61072560017f4b6c74f9e688cb39801f2112c14a8c57232a3fc5202e1444126d4bce86eb19ad61263d565b9055565b73ffffffffffffffffffffffffffffffffffffffff163b151590565b600060208251111561107a576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152603660248201527f476173506179696e67546f6b656e3a20737472696e672063616e6e6f7420626560448201527f2067726561746572207468616e203332206279746573000000000000000000006064820152608401610aed565b6110838261115b565b92915050565b6110ef6110b760017f04adb1412b2ddc16fcc0d4538d5c8f07cf9c83abecc6b41f6f69037b708fbcec61263d565b74ff000000000000000000000000000000000000000060a086901b1673ffffffffffffffffffffffffffffffffffffffff8716179055565b61112261111d60017f657c3582c29b3176614e3a33ddd1ec48352696a04e92b3c0566d72010fa8863d61263d565b839055565b61115561115060017fa48b38a4b44951360fbdcbfaaeae5ed6ae92585412e9841b70ec72ed8cd0576461263d565b829055565b50505050565b8051602181106111735763ec92f9a36000526004601cfd5b9081015160209190910360031b1b90565b600080806111b661075860017f04adb1412b2ddc16fcc0d4538d5c8f07cf9c83abecc6b41f6f69037b708fbcec61263d565b73ffffffffffffffffffffffffffffffffffffffff811693509050826111f5575073eeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeee92601292509050565b60a081901c9150509091565b60335473ffffffffffffffffffffffffffffffffffffffff163314610900576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e65726044820152606401610aed565b6112ab7f65a7ed542fb37fe237fdfbdd70b31598523fe5b32879e307bae27a0bd9581c08829055565b6040805173ffffffffffffffffffffffffffffffffffffffff8316602082015260009101604080517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0818403018152919052905060035b60007f1d2b0bda21d56b8bd12d4f94ebacffdfb35f5e226f84b461103bb8beab6353be836040516113339190612320565b60405180910390a35050565b606880547fffffffffffffffffffffffffffffffff0000000000000000ffffffffffffffff166801000000000000000063ffffffff8581169182027fffffffffffffffffffffffffffffffff00000000ffffffffffffffffffffffff16929092176c0100000000000000000000000092851692909202919091179091557f0100000000000000000000000000000000000000000000000000000000000000602083811b67ffffffff000000001690921717606681905560655460408051938401919091528201526000906060015b604080517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe08184030181529190529050600160007f1d2b0bda21d56b8bd12d4f94ebacffdfb35f5e226f84b461103bb8beab6353be836040516114709190612320565b60405180910390a3505050565b60606000611489611184565b5090507fffffffffffffffffffffffff111111111111111111111111111111111111111273ffffffffffffffffffffffffffffffffffffffff82160161150257505060408051808201909152600381527f4554480000000000000000000000000000000000000000000000000000000000602082015290565b61153861153361075860017fa48b38a4b44951360fbdcbfaaeae5ed6ae92585412e9841b70ec72ed8cd0576461263d565b612144565b91505090565b6033805473ffffffffffffffffffffffffffffffffffffffff8381167fffffffffffffffffffffffff0000000000000000000000000000000000000000831681179093556040519116919082907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e090600090a35050565b7fff00000000000000000000000000000000000000000000000000000000000000811615611665576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602160248201527f53797374656d436f6e6669673a207363616c61722065786365656473206d617860448201527f2e000000000000000000000000000000000000000000000000000000000000006064820152608401610aed565b60658290556066819055604080516020810184905290810182905260009060600161140d565b611693610893565b67ffffffffffffffff168167ffffffffffffffff161015611710576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601f60248201527f53797374656d436f6e6669673a20676173206c696d697420746f6f206c6f77006044820152606401610aed565b630bebc20067ffffffffffffffff82161115611788576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820181905260248201527f53797374656d436f6e6669673a20676173206c696d697420746f6f20686967686044820152606401610aed565b606880547fffffffffffffffffffffffffffffffffffffffffffffffff00000000000000001667ffffffffffffffff83169081179091556040805160208082019390935281518082039093018352810190526002611302565b6067819055604080516020808201849052825180830390910181529082019091526000611302565b60606000611815611184565b5090507fffffffffffffffffffffffff111111111111111111111111111111111111111273ffffffffffffffffffffffffffffffffffffffff82160161188e57505060408051808201909152600581527f4574686572000000000000000000000000000000000000000000000000000000602082015290565b61153861153361075860017f657c3582c29b3176614e3a33ddd1ec48352696a04e92b3c0566d72010fa8863d61263d565b600054610100900460ff16611956576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602b60248201527f496e697469616c697a61626c653a20636f6e7472616374206973206e6f74206960448201527f6e697469616c697a696e670000000000000000000000000000000000000000006064820152608401610aed565b610900612178565b61198c61075860017fa11ee3ab75b40e88a0105e935d17cd36c8faee0138320d776c411291bdbbb1a061263d565b600003610900576109006119c160017fa11ee3ab75b40e88a0105e935d17cd36c8faee0138320d776c411291bdbbb1a061263d565b439055565b73ffffffffffffffffffffffffffffffffffffffff811615801590611a15575073ffffffffffffffffffffffffffffffffffffffff811673eeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeee14155b8015611a265750611a246107fa565b155b156107a257601260ff168173ffffffffffffffffffffffffffffffffffffffff1663313ce5676040518163ffffffff1660e01b8152600401602060405180830381865afa158015611a7b573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611a9f9190612680565b60ff1614611b2f576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602e60248201527f53797374656d436f6e6669673a2062616420646563696d616c73206f6620676160448201527f7320706179696e6720746f6b656e0000000000000000000000000000000000006064820152608401610aed565b6000611bca8273ffffffffffffffffffffffffffffffffffffffff166306fdde036040518163ffffffff1660e01b8152600401600060405180830381865afa158015611b7f573d6000803e3d6000fd5b505050506040513d6000823e601f3d9081017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0168201604052611bc5919081019061269d565b610fe6565b90506000611c1c8373ffffffffffffffffffffffffffffffffffffffff166395d89b416040518163ffffffff1660e01b8152600401600060405180830381865afa158015611b7f573d6000803e3d6000fd5b9050611c2b8360128484611089565b611c33610761565b6040517f71cfaa3f00000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff858116600483015260126024830152604482018590526064820184905291909116906371cfaa3f90608401600060405180830381600087803b158015611cb357600080fd5b505af1158015611cc7573d6000803e3d6000fd5b50505050505050565b8060a001516fffffffffffffffffffffffffffffffff16816060015163ffffffff161115611d80576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152603560248201527f53797374656d436f6e6669673a206d696e206261736520666565206d7573742060448201527f6265206c657373207468616e206d6178206261736500000000000000000000006064820152608401610aed565b6001816040015160ff1611611e17576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602f60248201527f53797374656d436f6e6669673a2064656e6f6d696e61746f72206d757374206260448201527f65206c6172676572207468616e203100000000000000000000000000000000006064820152608401610aed565b6068546080820151825167ffffffffffffffff90921691611e389190612768565b63ffffffff161115611ea6576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601f60248201527f53797374656d436f6e6669673a20676173206c696d697420746f6f206c6f77006044820152606401610aed565b6000816020015160ff1611611f3d576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602f60248201527f53797374656d436f6e6669673a20656c6173746963697479206d756c7469706c60448201527f6965722063616e6e6f74206265203000000000000000000000000000000000006064820152608401610aed565b8051602082015163ffffffff82169160ff90911690611f5d908290612787565b611f6791906127d1565b63ffffffff1614611ffa576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152603760248201527f53797374656d436f6e6669673a20707265636973696f6e206c6f73732077697460448201527f6820746172676574207265736f75726365206c696d69740000000000000000006064820152608401610aed565b805160698054602084015160408501516060860151608087015160a09097015163ffffffff9687167fffffffffffffffffffffffffffffffffffffffffffffffffffffff00000000009095169490941764010000000060ff94851602177fffffffffffffffffffffffffffffffffffffffffffff0000000000ffffffffff166501000000000093909216929092027fffffffffffffffffffffffffffffffffffffffffffff00000000ffffffffffff1617660100000000000091851691909102177fffff0000000000000000000000000000000000000000ffffffffffffffffffff166a010000000000000000000093909416929092027fffff00000000000000000000000000000000ffffffffffffffffffffffffffff16929092176e0100000000000000000000000000006fffffffffffffffffffffffffffffffff90921691909102179055565b60405160005b82811a1561215a5760010161214a565b80825260208201838152600082820152505060408101604052919050565b600054610100900460ff1661220f576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602b60248201527f496e697469616c697a61626c653a20636f6e7472616374206973206e6f74206960448201527f6e697469616c697a696e670000000000000000000000000000000000000000006064820152608401610aed565b6109003361153e565b803573ffffffffffffffffffffffffffffffffffffffff8116811461223c57600080fd5b919050565b60006020828403121561225357600080fd5b61225c82612218565b9392505050565b803563ffffffff8116811461223c57600080fd5b6000806040838503121561228a57600080fd5b61229383612263565b91506122a160208401612263565b90509250929050565b60005b838110156122c55781810151838201526020016122ad565b838111156111555750506000910152565b600081518084526122ee8160208601602086016122aa565b601f017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0169290920160200192915050565b60208152600061225c60208301846122d6565b6000806040838503121561234657600080fd5b50508035926020909101359150565b803567ffffffffffffffff8116811461223c57600080fd5b60006020828403121561237f57600080fd5b61225c82612355565b60006020828403121561239a57600080fd5b5035919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b60405160c0810167ffffffffffffffff811182821017156123f3576123f36123a1565b60405290565b60ff811681146107a257600080fd5b600060e0828403121561241a57600080fd5b60405160e0810181811067ffffffffffffffff8211171561243d5761243d6123a1565b60405290508061244c83612218565b815261245a60208401612218565b602082015261246b60408401612218565b604082015261247c60608401612218565b606082015261248d60808401612218565b608082015261249e60a08401612218565b60a08201526124af60c08401612218565b60c08201525092915050565b6000806000806000806000806000898b036102808112156124db57600080fd5b6124e48b612218565b99506124f260208c01612263565b985061250060408c01612263565b975060608b0135965061251560808c01612355565b955061252360a08c01612218565b945060c07fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff408201121561255557600080fd5b5061255e6123d0565b61256a60c08c01612263565b815260e08b013561257a816123f9565b60208201526101008b013561258e816123f9565b60408201526125a06101208c01612263565b60608201526125b26101408c01612263565b60808201526101608b01356fffffffffffffffffffffffffffffffff811681146125db57600080fd5b60a082015292506125ef6101808b01612218565b91506125ff8b6101a08c01612408565b90509295985092959850929598565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b60008282101561264f5761264f61260e565b500390565b600067ffffffffffffffff8083168185168083038211156126775761267761260e565b01949350505050565b60006020828403121561269257600080fd5b815161225c816123f9565b6000602082840312156126af57600080fd5b815167ffffffffffffffff808211156126c757600080fd5b818401915084601f8301126126db57600080fd5b8151818111156126ed576126ed6123a1565b604051601f82017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0908116603f01168101908382118183101715612733576127336123a1565b8160405282815287602084870101111561274c57600080fd5b61275d8360208301602088016122aa565b979650505050505050565b600063ffffffff8083168185168083038211156126775761267761260e565b600063ffffffff808416806127c5577f4e487b7100000000000000000000000000000000000000000000000000000000600052601260045260246000fd5b92169190910492915050565b600063ffffffff808316818516818304811182151516156127f4576127f461260e565b0294935050505056fea164736f6c634300080f000a"; bytes internal constant l1StandardBridgeCode = - hex"6080604052600436106101845760003560e01c80637f46ddb2116100d65780639a2ac6d51161007f578063c0c53b8b11610059578063c0c53b8b14610529578063c89701a214610549578063e11013dd1461057657600080fd5b80639a2ac6d5146104e3578063a9f9e675146104f6578063b1a1a8821461051657600080fd5b80638f601f66116100b05780638f601f661461047257806391c49bf814610407578063927ede2d146104b857600080fd5b80637f46ddb214610407578063838b252014610432578063870876231461045257600080fd5b806335e80ab31161013857806354fd4d501161011257806354fd4d501461036c57806358a997f6146103c25780635c975abb146103e257600080fd5b806335e80ab3146102f25780633cb747bf1461031f578063540abf731461034c57600080fd5b80631532ec34116101695780631532ec34146102755780631635f5fd1461028857806333d7e2bd1461029b57600080fd5b80630166a07a1461024257806309fc88431461026257600080fd5b3661023d57333b1561021d576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152603760248201527f5374616e646172644272696467653a2066756e6374696f6e2063616e206f6e6c60448201527f792062652063616c6c65642066726f6d20616e20454f4100000000000000000060648201526084015b60405180910390fd5b61023b333362030d40604051806020016040528060008152506105a5565b005b600080fd5b34801561024e57600080fd5b5061023b61025d366004612993565b6105b8565b61023b610270366004612a44565b6109d2565b61023b610283366004612a97565b610aa9565b61023b610296366004612a97565b610abd565b3480156102a757600080fd5b506033546102c89073ffffffffffffffffffffffffffffffffffffffff1681565b60405173ffffffffffffffffffffffffffffffffffffffff90911681526020015b60405180910390f35b3480156102fe57600080fd5b506032546102c89073ffffffffffffffffffffffffffffffffffffffff1681565b34801561032b57600080fd5b506003546102c89073ffffffffffffffffffffffffffffffffffffffff1681565b34801561035857600080fd5b5061023b610367366004612b0a565b61101b565b34801561037857600080fd5b506103b56040518060400160405280600581526020017f322e322e3000000000000000000000000000000000000000000000000000000081525081565b6040516102e99190612bf7565b3480156103ce57600080fd5b5061023b6103dd366004612c0a565b611060565b3480156103ee57600080fd5b506103f7611134565b60405190151581526020016102e9565b34801561041357600080fd5b5060045473ffffffffffffffffffffffffffffffffffffffff166102c8565b34801561043e57600080fd5b5061023b61044d366004612b0a565b6111cd565b34801561045e57600080fd5b5061023b61046d366004612c0a565b611212565b34801561047e57600080fd5b506104aa61048d366004612c8d565b600260209081526000928352604080842090915290825290205481565b6040519081526020016102e9565b3480156104c457600080fd5b5060035473ffffffffffffffffffffffffffffffffffffffff166102c8565b61023b6104f1366004612cc6565b6112e6565b34801561050257600080fd5b5061023b610511366004612993565b611328565b61023b610524366004612a44565b611337565b34801561053557600080fd5b5061023b610544366004612d29565b611408565b34801561055557600080fd5b506004546102c89073ffffffffffffffffffffffffffffffffffffffff1681565b61023b610584366004612cc6565b611607565b73ffffffffffffffffffffffffffffffffffffffff163b151590565b6105b2848434858561164a565b50505050565b60035473ffffffffffffffffffffffffffffffffffffffff163314801561068b575060048054600354604080517f6e296e45000000000000000000000000000000000000000000000000000000008152905173ffffffffffffffffffffffffffffffffffffffff938416949390921692636e296e459282820192602092908290030181865afa15801561064f573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906106739190612d74565b73ffffffffffffffffffffffffffffffffffffffff16145b61073d576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152604160248201527f5374616e646172644272696467653a2066756e6374696f6e2063616e206f6e6c60448201527f792062652063616c6c65642066726f6d20746865206f7468657220627269646760648201527f6500000000000000000000000000000000000000000000000000000000000000608482015260a401610214565b610745611134565b156107ac576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601660248201527f5374616e646172644272696467653a20706175736564000000000000000000006044820152606401610214565b6107b5876118a9565b15610903576107c4878761190b565b610876576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152604a60248201527f5374616e646172644272696467653a2077726f6e672072656d6f746520746f6b60448201527f656e20666f72204f7074696d69736d204d696e7461626c65204552433230206c60648201527f6f63616c20746f6b656e00000000000000000000000000000000000000000000608482015260a401610214565b6040517f40c10f1900000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff8581166004830152602482018590528816906340c10f1990604401600060405180830381600087803b1580156108e657600080fd5b505af11580156108fa573d6000803e3d6000fd5b50505050610985565b73ffffffffffffffffffffffffffffffffffffffff8088166000908152600260209081526040808320938a1683529290522054610941908490612dc0565b73ffffffffffffffffffffffffffffffffffffffff8089166000818152600260209081526040808320948c1683529390529190912091909155610985908585611a2b565b6109c9878787878787878080601f016020809104026020016040519081016040528093929190818152602001838380828437600092019190915250611aff92505050565b50505050505050565b333b15610a61576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152603760248201527f5374616e646172644272696467653a2066756e6374696f6e2063616e206f6e6c60448201527f792062652063616c6c65642066726f6d20616e20454f410000000000000000006064820152608401610214565b610aa43333348686868080601f01602080910402602001604051908101604052809392919081815260200183838082843760009201919091525061164a92505050565b505050565b610ab68585858585610abd565b5050505050565b60035473ffffffffffffffffffffffffffffffffffffffff1633148015610b90575060048054600354604080517f6e296e45000000000000000000000000000000000000000000000000000000008152905173ffffffffffffffffffffffffffffffffffffffff938416949390921692636e296e459282820192602092908290030181865afa158015610b54573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610b789190612d74565b73ffffffffffffffffffffffffffffffffffffffff16145b610c42576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152604160248201527f5374616e646172644272696467653a2066756e6374696f6e2063616e206f6e6c60448201527f792062652063616c6c65642066726f6d20746865206f7468657220627269646760648201527f6500000000000000000000000000000000000000000000000000000000000000608482015260a401610214565b610c4a611134565b15610cb1576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601660248201527f5374616e646172644272696467653a20706175736564000000000000000000006044820152606401610214565b610cb9611b8d565b15610d46576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152603760248201527f5374616e646172644272696467653a2063616e6e6f742062726964676520455460448201527f48207769746820637573746f6d2067617320746f6b656e0000000000000000006064820152608401610214565b823414610dd5576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152603a60248201527f5374616e646172644272696467653a20616d6f756e742073656e7420646f657360448201527f206e6f74206d6174636820616d6f756e742072657175697265640000000000006064820152608401610214565b3073ffffffffffffffffffffffffffffffffffffffff851603610e7a576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602360248201527f5374616e646172644272696467653a2063616e6e6f742073656e6420746f207360448201527f656c6600000000000000000000000000000000000000000000000000000000006064820152608401610214565b60035473ffffffffffffffffffffffffffffffffffffffff90811690851603610f25576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602860248201527f5374616e646172644272696467653a2063616e6e6f742073656e6420746f206d60448201527f657373656e6765720000000000000000000000000000000000000000000000006064820152608401610214565b610f6785858585858080601f016020809104026020016040519081016040528093929190818152602001838380828437600092019190915250611bcc92505050565b6000610f84855a8660405180602001604052806000815250611c3f565b905080611013576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602360248201527f5374616e646172644272696467653a20455448207472616e736665722066616960448201527f6c656400000000000000000000000000000000000000000000000000000000006064820152608401610214565b505050505050565b6109c987873388888888888080601f016020809104026020016040519081016040528093929190818152602001838380828437600092019190915250611c5992505050565b333b156110ef576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152603760248201527f5374616e646172644272696467653a2066756e6374696f6e2063616e206f6e6c60448201527f792062652063616c6c65642066726f6d20616e20454f410000000000000000006064820152608401610214565b61101386863333888888888080601f01602080910402602001604051908101604052809392919081815260200183838082843760009201919091525061201292505050565b603254604080517f5c975abb000000000000000000000000000000000000000000000000000000008152905160009273ffffffffffffffffffffffffffffffffffffffff1691635c975abb9160048083019260209291908290030181865afa1580156111a4573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906111c89190612dd7565b905090565b6109c987873388888888888080601f01602080910402602001604051908101604052809392919081815260200183838082843760009201919091525061201292505050565b333b156112a1576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152603760248201527f5374616e646172644272696467653a2066756e6374696f6e2063616e206f6e6c60448201527f792062652063616c6c65642066726f6d20616e20454f410000000000000000006064820152608401610214565b61101386863333888888888080601f016020809104026020016040519081016040528093929190818152602001838380828437600092019190915250611c5992505050565b6105b233858585858080601f0160208091040260200160405190810160405280939291908181526020018383808284376000920191909152506105a592505050565b6109c9878787878787876105b8565b333b156113c6576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152603760248201527f5374616e646172644272696467653a2066756e6374696f6e2063616e206f6e6c60448201527f792062652063616c6c65642066726f6d20616e20454f410000000000000000006064820152608401610214565b610aa433338585858080601f0160208091040260200160405190810160405280939291908181526020018383808284376000920191909152506105a592505050565b600054610100900460ff16158080156114285750600054600160ff909116105b806114425750303b158015611442575060005460ff166001145b6114ce576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602e60248201527f496e697469616c697a61626c653a20636f6e747261637420697320616c72656160448201527f647920696e697469616c697a65640000000000000000000000000000000000006064820152608401610214565b600080547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00166001179055801561152c57600080547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00ff166101001790555b6032805473ffffffffffffffffffffffffffffffffffffffff8086167fffffffffffffffffffffffff000000000000000000000000000000000000000092831617909255603380549285169290911691909117905561159f84734200000000000000000000000000000000000010612021565b80156105b257600080547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00ff169055604051600181527f7f26b83ff96e1f2b6a682f133852f6798a09c465da95921460cefb38474024989060200160405180910390a150505050565b6105b23385348686868080601f01602080910402602001604051908101604052809392919081815260200183838082843760009201919091525061164a92505050565b611652611b8d565b156116df576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152603760248201527f5374616e646172644272696467653a2063616e6e6f742062726964676520455460448201527f48207769746820637573746f6d2067617320746f6b656e0000000000000000006064820152608401610214565b82341461176e576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152603e60248201527f5374616e646172644272696467653a206272696467696e6720455448206d757360448201527f7420696e636c7564652073756666696369656e74204554482076616c756500006064820152608401610214565b61177a8585858461210b565b60035460045460405173ffffffffffffffffffffffffffffffffffffffff92831692633dbb202b9287929116907f1635f5fd00000000000000000000000000000000000000000000000000000000906117dd908b908b9086908a90602401612df9565b604080517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe08184030181529181526020820180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff167fffffffff000000000000000000000000000000000000000000000000000000009485161790525160e086901b909216825261187092918890600401612e42565b6000604051808303818588803b15801561188957600080fd5b505af115801561189d573d6000803e3d6000fd5b50505050505050505050565b60006118d5827f1d1d8b630000000000000000000000000000000000000000000000000000000061217e565b806119055750611905827fec4fc8e30000000000000000000000000000000000000000000000000000000061217e565b92915050565b6000611937837f1d1d8b630000000000000000000000000000000000000000000000000000000061217e565b156119e0578273ffffffffffffffffffffffffffffffffffffffff1663c01e1bd66040518163ffffffff1660e01b8152600401602060405180830381865afa158015611987573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906119ab9190612d74565b73ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff16149050611905565b8273ffffffffffffffffffffffffffffffffffffffff1663d6c0b2c46040518163ffffffff1660e01b8152600401602060405180830381865afa158015611987573d6000803e3d6000fd5b60405173ffffffffffffffffffffffffffffffffffffffff8316602482015260448101829052610aa49084907fa9059cbb00000000000000000000000000000000000000000000000000000000906064015b604080517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe08184030181529190526020810180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff167fffffffff00000000000000000000000000000000000000000000000000000000909316929092179091526121a1565b8373ffffffffffffffffffffffffffffffffffffffff168573ffffffffffffffffffffffffffffffffffffffff168773ffffffffffffffffffffffffffffffffffffffff167f3ceee06c1e37648fcbb6ed52e17b3e1f275a1f8c7b22a84b2b84732431e046b3868686604051611b7793929190612e87565b60405180910390a46110138686868686866122ad565b600080611b98612335565b5073ffffffffffffffffffffffffffffffffffffffff1673eeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeee141592915050565b8273ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff167f2ac69ee804d9a7a0984249f508dfab7cb2534b465b6ce1580f99a38ba9c5e6318484604051611c2b929190612ec5565b60405180910390a36105b2848484846123d2565b600080600080845160208601878a8af19695505050505050565b3415611ce7576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602160248201527f5374616e646172644272696467653a2063616e6e6f742073656e642076616c7560448201527f65000000000000000000000000000000000000000000000000000000000000006064820152608401610214565b611cf0876118a9565b15611e3e57611cff878761190b565b611db1576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152604a60248201527f5374616e646172644272696467653a2077726f6e672072656d6f746520746f6b60448201527f656e20666f72204f7074696d69736d204d696e7461626c65204552433230206c60648201527f6f63616c20746f6b656e00000000000000000000000000000000000000000000608482015260a401610214565b6040517f9dc29fac00000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff868116600483015260248201859052881690639dc29fac90604401600060405180830381600087803b158015611e2157600080fd5b505af1158015611e35573d6000803e3d6000fd5b50505050611ed2565b611e6073ffffffffffffffffffffffffffffffffffffffff881686308661243f565b73ffffffffffffffffffffffffffffffffffffffff8088166000908152600260209081526040808320938a1683529290522054611e9e908490612ede565b73ffffffffffffffffffffffffffffffffffffffff8089166000908152600260209081526040808320938b16835292905220555b611ee087878787878661249d565b60035460045460405173ffffffffffffffffffffffffffffffffffffffff92831692633dbb202b9216907f0166a07a0000000000000000000000000000000000000000000000000000000090611f44908b908d908c908c908c908b90602401612ef6565b604080517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe08184030181529181526020820180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff167fffffffff000000000000000000000000000000000000000000000000000000009485161790525160e085901b9092168252611fd792918790600401612e42565b600060405180830381600087803b158015611ff157600080fd5b505af1158015612005573d6000803e3d6000fd5b5050505050505050505050565b6109c987878787878787611c59565b600054610100900460ff166120b8576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602b60248201527f496e697469616c697a61626c653a20636f6e7472616374206973206e6f74206960448201527f6e697469616c697a696e670000000000000000000000000000000000000000006064820152608401610214565b6003805473ffffffffffffffffffffffffffffffffffffffff9384167fffffffffffffffffffffffff00000000000000000000000000000000000000009182161790915560048054929093169116179055565b8273ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff167f35d79ab81f2b2017e19afb5c5571778877782d7a8786f5907f93b0f4702f4f23848460405161216a929190612ec5565b60405180910390a36105b28484848461252b565b60006121898361258a565b801561219a575061219a83836125ee565b9392505050565b6000612203826040518060400160405280602081526020017f5361666545524332303a206c6f772d6c6576656c2063616c6c206661696c65648152508573ffffffffffffffffffffffffffffffffffffffff166126bd9092919063ffffffff16565b805190915015610aa457808060200190518101906122219190612dd7565b610aa4576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602a60248201527f5361666545524332303a204552433230206f7065726174696f6e20646964206e60448201527f6f742073756363656564000000000000000000000000000000000000000000006064820152608401610214565b8373ffffffffffffffffffffffffffffffffffffffff168573ffffffffffffffffffffffffffffffffffffffff168773ffffffffffffffffffffffffffffffffffffffff167fd59c65b35445225835c83f50b6ede06a7be047d22e357073e250d9af537518cd86868660405161232593929190612e87565b60405180910390a4505050505050565b603354604080517f4397dfef0000000000000000000000000000000000000000000000000000000081528151600093849373ffffffffffffffffffffffffffffffffffffffff90911692634397dfef92600480830193928290030181865afa1580156123a5573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906123c99190612f51565b90939092509050565b8273ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff167f31b2166ff604fc5672ea5df08a78081d2bc6d746cadce880747f3643d819e83d8484604051612431929190612ec5565b60405180910390a350505050565b60405173ffffffffffffffffffffffffffffffffffffffff808516602483015283166044820152606481018290526105b29085907f23b872dd0000000000000000000000000000000000000000000000000000000090608401611a7d565b8373ffffffffffffffffffffffffffffffffffffffff168573ffffffffffffffffffffffffffffffffffffffff168773ffffffffffffffffffffffffffffffffffffffff167f718594027abd4eaed59f95162563e0cc6d0e8d5b86b1c7be8b1b0ac3343d039686868660405161251593929190612e87565b60405180910390a46110138686868686866126d4565b8273ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff167f2849b43074093a05396b6f2a937dee8565b15a48a7b3d4bffb732a5017380af58484604051612431929190612ec5565b60006125b6827f01ffc9a7000000000000000000000000000000000000000000000000000000006125ee565b801561190557506125e7827fffffffff000000000000000000000000000000000000000000000000000000006125ee565b1592915050565b604080517fffffffff000000000000000000000000000000000000000000000000000000008316602480830191909152825180830390910181526044909101909152602080820180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff167f01ffc9a700000000000000000000000000000000000000000000000000000000178152825160009392849283928392918391908a617530fa92503d915060005190508280156126a6575060208210155b80156126b25750600081115b979650505050505050565b60606126cc848460008561274c565b949350505050565b8373ffffffffffffffffffffffffffffffffffffffff168573ffffffffffffffffffffffffffffffffffffffff168773ffffffffffffffffffffffffffffffffffffffff167f7ff126db8024424bbfd9826e8ab82ff59136289ea440b04b39a0df1b03b9cabf86868660405161232593929190612e87565b6060824710156127de576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602660248201527f416464726573733a20696e73756666696369656e742062616c616e636520666f60448201527f722063616c6c00000000000000000000000000000000000000000000000000006064820152608401610214565b73ffffffffffffffffffffffffffffffffffffffff85163b61285c576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601d60248201527f416464726573733a2063616c6c20746f206e6f6e2d636f6e74726163740000006044820152606401610214565b6000808673ffffffffffffffffffffffffffffffffffffffff1685876040516128859190612f86565b60006040518083038185875af1925050503d80600081146128c2576040519150601f19603f3d011682016040523d82523d6000602084013e6128c7565b606091505b50915091506126b2828286606083156128e157508161219a565b8251156128f15782518084602001fd5b816040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016102149190612bf7565b73ffffffffffffffffffffffffffffffffffffffff8116811461294757600080fd5b50565b60008083601f84011261295c57600080fd5b50813567ffffffffffffffff81111561297457600080fd5b60208301915083602082850101111561298c57600080fd5b9250929050565b600080600080600080600060c0888a0312156129ae57600080fd5b87356129b981612925565b965060208801356129c981612925565b955060408801356129d981612925565b945060608801356129e981612925565b93506080880135925060a088013567ffffffffffffffff811115612a0c57600080fd5b612a188a828b0161294a565b989b979a50959850939692959293505050565b803563ffffffff81168114612a3f57600080fd5b919050565b600080600060408486031215612a5957600080fd5b612a6284612a2b565b9250602084013567ffffffffffffffff811115612a7e57600080fd5b612a8a8682870161294a565b9497909650939450505050565b600080600080600060808688031215612aaf57600080fd5b8535612aba81612925565b94506020860135612aca81612925565b935060408601359250606086013567ffffffffffffffff811115612aed57600080fd5b612af98882890161294a565b969995985093965092949392505050565b600080600080600080600060c0888a031215612b2557600080fd5b8735612b3081612925565b96506020880135612b4081612925565b95506040880135612b5081612925565b945060608801359350612b6560808901612a2b565b925060a088013567ffffffffffffffff811115612a0c57600080fd5b60005b83811015612b9c578181015183820152602001612b84565b838111156105b25750506000910152565b60008151808452612bc5816020860160208601612b81565b601f017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0169290920160200192915050565b60208152600061219a6020830184612bad565b60008060008060008060a08789031215612c2357600080fd5b8635612c2e81612925565b95506020870135612c3e81612925565b945060408701359350612c5360608801612a2b565b9250608087013567ffffffffffffffff811115612c6f57600080fd5b612c7b89828a0161294a565b979a9699509497509295939492505050565b60008060408385031215612ca057600080fd5b8235612cab81612925565b91506020830135612cbb81612925565b809150509250929050565b60008060008060608587031215612cdc57600080fd5b8435612ce781612925565b9350612cf560208601612a2b565b9250604085013567ffffffffffffffff811115612d1157600080fd5b612d1d8782880161294a565b95989497509550505050565b600080600060608486031215612d3e57600080fd5b8335612d4981612925565b92506020840135612d5981612925565b91506040840135612d6981612925565b809150509250925092565b600060208284031215612d8657600080fd5b815161219a81612925565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b600082821015612dd257612dd2612d91565b500390565b600060208284031215612de957600080fd5b8151801515811461219a57600080fd5b600073ffffffffffffffffffffffffffffffffffffffff808716835280861660208401525083604083015260806060830152612e386080830184612bad565b9695505050505050565b73ffffffffffffffffffffffffffffffffffffffff84168152606060208201526000612e716060830185612bad565b905063ffffffff83166040830152949350505050565b73ffffffffffffffffffffffffffffffffffffffff84168152826020820152606060408201526000612ebc6060830184612bad565b95945050505050565b8281526040602082015260006126cc6040830184612bad565b60008219821115612ef157612ef1612d91565b500190565b600073ffffffffffffffffffffffffffffffffffffffff80891683528088166020840152808716604084015280861660608401525083608083015260c060a0830152612f4560c0830184612bad565b98975050505050505050565b60008060408385031215612f6457600080fd5b8251612f6f81612925565b602084015190925060ff81168114612cbb57600080fd5b60008251612f98818460208701612b81565b919091019291505056fea164736f6c634300080f000a"; + hex"6080604052600436106101845760003560e01c80637f46ddb2116100d65780639a2ac6d51161007f578063c0c53b8b11610059578063c0c53b8b14610529578063c89701a214610549578063e11013dd1461057657600080fd5b80639a2ac6d5146104e3578063a9f9e675146104f6578063b1a1a8821461051657600080fd5b80638f601f66116100b05780638f601f661461047257806391c49bf814610407578063927ede2d146104b857600080fd5b80637f46ddb214610407578063838b252014610432578063870876231461045257600080fd5b806335e80ab31161013857806354fd4d501161011257806354fd4d501461036c57806358a997f6146103c25780635c975abb146103e257600080fd5b806335e80ab3146102f25780633cb747bf1461031f578063540abf731461034c57600080fd5b80631532ec34116101695780631532ec34146102755780631635f5fd1461028857806333d7e2bd1461029b57600080fd5b80630166a07a1461024257806309fc88431461026257600080fd5b3661023d57333b1561021d576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152603760248201527f5374616e646172644272696467653a2066756e6374696f6e2063616e206f6e6c60448201527f792062652063616c6c65642066726f6d20616e20454f4100000000000000000060648201526084015b60405180910390fd5b61023b333362030d40604051806020016040528060008152506105a5565b005b600080fd5b34801561024e57600080fd5b5061023b61025d366004612991565b6105b8565b61023b610270366004612a42565b6109d2565b61023b610283366004612a95565b610aa9565b61023b610296366004612a95565b610abd565b3480156102a757600080fd5b506033546102c89073ffffffffffffffffffffffffffffffffffffffff1681565b60405173ffffffffffffffffffffffffffffffffffffffff90911681526020015b60405180910390f35b3480156102fe57600080fd5b506032546102c89073ffffffffffffffffffffffffffffffffffffffff1681565b34801561032b57600080fd5b506003546102c89073ffffffffffffffffffffffffffffffffffffffff1681565b34801561035857600080fd5b5061023b610367366004612b08565b61101b565b34801561037857600080fd5b506103b56040518060400160405280600c81526020017f322e322e312d626574612e31000000000000000000000000000000000000000081525081565b6040516102e99190612bf5565b3480156103ce57600080fd5b5061023b6103dd366004612c08565b611060565b3480156103ee57600080fd5b506103f7611134565b60405190151581526020016102e9565b34801561041357600080fd5b5060045473ffffffffffffffffffffffffffffffffffffffff166102c8565b34801561043e57600080fd5b5061023b61044d366004612b08565b6111cd565b34801561045e57600080fd5b5061023b61046d366004612c08565b611212565b34801561047e57600080fd5b506104aa61048d366004612c8b565b600260209081526000928352604080842090915290825290205481565b6040519081526020016102e9565b3480156104c457600080fd5b5060035473ffffffffffffffffffffffffffffffffffffffff166102c8565b61023b6104f1366004612cc4565b6112e6565b34801561050257600080fd5b5061023b610511366004612991565b611328565b61023b610524366004612a42565b611337565b34801561053557600080fd5b5061023b610544366004612d27565b611408565b34801561055557600080fd5b506004546102c89073ffffffffffffffffffffffffffffffffffffffff1681565b61023b610584366004612cc4565b611607565b73ffffffffffffffffffffffffffffffffffffffff163b151590565b6105b2848434858561164a565b50505050565b60035473ffffffffffffffffffffffffffffffffffffffff163314801561068b575060048054600354604080517f6e296e45000000000000000000000000000000000000000000000000000000008152905173ffffffffffffffffffffffffffffffffffffffff938416949390921692636e296e459282820192602092908290030181865afa15801561064f573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906106739190612d72565b73ffffffffffffffffffffffffffffffffffffffff16145b61073d576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152604160248201527f5374616e646172644272696467653a2066756e6374696f6e2063616e206f6e6c60448201527f792062652063616c6c65642066726f6d20746865206f7468657220627269646760648201527f6500000000000000000000000000000000000000000000000000000000000000608482015260a401610214565b610745611134565b156107ac576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601660248201527f5374616e646172644272696467653a20706175736564000000000000000000006044820152606401610214565b6107b5876118a9565b15610903576107c4878761190b565b610876576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152604a60248201527f5374616e646172644272696467653a2077726f6e672072656d6f746520746f6b60448201527f656e20666f72204f7074696d69736d204d696e7461626c65204552433230206c60648201527f6f63616c20746f6b656e00000000000000000000000000000000000000000000608482015260a401610214565b6040517f40c10f1900000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff8581166004830152602482018590528816906340c10f1990604401600060405180830381600087803b1580156108e657600080fd5b505af11580156108fa573d6000803e3d6000fd5b50505050610985565b73ffffffffffffffffffffffffffffffffffffffff8088166000908152600260209081526040808320938a1683529290522054610941908490612dbe565b73ffffffffffffffffffffffffffffffffffffffff8089166000818152600260209081526040808320948c1683529390529190912091909155610985908585611a2b565b6109c9878787878787878080601f016020809104026020016040519081016040528093929190818152602001838380828437600092019190915250611aff92505050565b50505050505050565b333b15610a61576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152603760248201527f5374616e646172644272696467653a2066756e6374696f6e2063616e206f6e6c60448201527f792062652063616c6c65642066726f6d20616e20454f410000000000000000006064820152608401610214565b610aa43333348686868080601f01602080910402602001604051908101604052809392919081815260200183838082843760009201919091525061164a92505050565b505050565b610ab68585858585610abd565b5050505050565b60035473ffffffffffffffffffffffffffffffffffffffff1633148015610b90575060048054600354604080517f6e296e45000000000000000000000000000000000000000000000000000000008152905173ffffffffffffffffffffffffffffffffffffffff938416949390921692636e296e459282820192602092908290030181865afa158015610b54573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610b789190612d72565b73ffffffffffffffffffffffffffffffffffffffff16145b610c42576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152604160248201527f5374616e646172644272696467653a2066756e6374696f6e2063616e206f6e6c60448201527f792062652063616c6c65642066726f6d20746865206f7468657220627269646760648201527f6500000000000000000000000000000000000000000000000000000000000000608482015260a401610214565b610c4a611134565b15610cb1576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601660248201527f5374616e646172644272696467653a20706175736564000000000000000000006044820152606401610214565b610cb9611b8d565b15610d46576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152603760248201527f5374616e646172644272696467653a2063616e6e6f742062726964676520455460448201527f48207769746820637573746f6d2067617320746f6b656e0000000000000000006064820152608401610214565b823414610dd5576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152603a60248201527f5374616e646172644272696467653a20616d6f756e742073656e7420646f657360448201527f206e6f74206d6174636820616d6f756e742072657175697265640000000000006064820152608401610214565b3073ffffffffffffffffffffffffffffffffffffffff851603610e7a576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602360248201527f5374616e646172644272696467653a2063616e6e6f742073656e6420746f207360448201527f656c6600000000000000000000000000000000000000000000000000000000006064820152608401610214565b60035473ffffffffffffffffffffffffffffffffffffffff90811690851603610f25576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602860248201527f5374616e646172644272696467653a2063616e6e6f742073656e6420746f206d60448201527f657373656e6765720000000000000000000000000000000000000000000000006064820152608401610214565b610f6785858585858080601f016020809104026020016040519081016040528093929190818152602001838380828437600092019190915250611bcc92505050565b6000610f84855a8660405180602001604052806000815250611c3f565b905080611013576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602360248201527f5374616e646172644272696467653a20455448207472616e736665722066616960448201527f6c656400000000000000000000000000000000000000000000000000000000006064820152608401610214565b505050505050565b6109c987873388888888888080601f016020809104026020016040519081016040528093929190818152602001838380828437600092019190915250611c5792505050565b333b156110ef576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152603760248201527f5374616e646172644272696467653a2066756e6374696f6e2063616e206f6e6c60448201527f792062652063616c6c65642066726f6d20616e20454f410000000000000000006064820152608401610214565b61101386863333888888888080601f01602080910402602001604051908101604052809392919081815260200183838082843760009201919091525061201092505050565b603254604080517f5c975abb000000000000000000000000000000000000000000000000000000008152905160009273ffffffffffffffffffffffffffffffffffffffff1691635c975abb9160048083019260209291908290030181865afa1580156111a4573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906111c89190612dd5565b905090565b6109c987873388888888888080601f01602080910402602001604051908101604052809392919081815260200183838082843760009201919091525061201092505050565b333b156112a1576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152603760248201527f5374616e646172644272696467653a2066756e6374696f6e2063616e206f6e6c60448201527f792062652063616c6c65642066726f6d20616e20454f410000000000000000006064820152608401610214565b61101386863333888888888080601f016020809104026020016040519081016040528093929190818152602001838380828437600092019190915250611c5792505050565b6105b233858585858080601f0160208091040260200160405190810160405280939291908181526020018383808284376000920191909152506105a592505050565b6109c9878787878787876105b8565b333b156113c6576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152603760248201527f5374616e646172644272696467653a2066756e6374696f6e2063616e206f6e6c60448201527f792062652063616c6c65642066726f6d20616e20454f410000000000000000006064820152608401610214565b610aa433338585858080601f0160208091040260200160405190810160405280939291908181526020018383808284376000920191909152506105a592505050565b600054610100900460ff16158080156114285750600054600160ff909116105b806114425750303b158015611442575060005460ff166001145b6114ce576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602e60248201527f496e697469616c697a61626c653a20636f6e747261637420697320616c72656160448201527f647920696e697469616c697a65640000000000000000000000000000000000006064820152608401610214565b600080547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00166001179055801561152c57600080547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00ff166101001790555b6032805473ffffffffffffffffffffffffffffffffffffffff8086167fffffffffffffffffffffffff000000000000000000000000000000000000000092831617909255603380549285169290911691909117905561159f8473420000000000000000000000000000000000001061201f565b80156105b257600080547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00ff169055604051600181527f7f26b83ff96e1f2b6a682f133852f6798a09c465da95921460cefb38474024989060200160405180910390a150505050565b6105b23385348686868080601f01602080910402602001604051908101604052809392919081815260200183838082843760009201919091525061164a92505050565b611652611b8d565b156116df576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152603760248201527f5374616e646172644272696467653a2063616e6e6f742062726964676520455460448201527f48207769746820637573746f6d2067617320746f6b656e0000000000000000006064820152608401610214565b82341461176e576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152603e60248201527f5374616e646172644272696467653a206272696467696e6720455448206d757360448201527f7420696e636c7564652073756666696369656e74204554482076616c756500006064820152608401610214565b61177a85858584612109565b60035460045460405173ffffffffffffffffffffffffffffffffffffffff92831692633dbb202b9287929116907f1635f5fd00000000000000000000000000000000000000000000000000000000906117dd908b908b9086908a90602401612df7565b604080517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe08184030181529181526020820180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff167fffffffff000000000000000000000000000000000000000000000000000000009485161790525160e086901b909216825261187092918890600401612e40565b6000604051808303818588803b15801561188957600080fd5b505af115801561189d573d6000803e3d6000fd5b50505050505050505050565b60006118d5827f1d1d8b630000000000000000000000000000000000000000000000000000000061217c565b806119055750611905827fec4fc8e30000000000000000000000000000000000000000000000000000000061217c565b92915050565b6000611937837f1d1d8b630000000000000000000000000000000000000000000000000000000061217c565b156119e0578273ffffffffffffffffffffffffffffffffffffffff1663c01e1bd66040518163ffffffff1660e01b8152600401602060405180830381865afa158015611987573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906119ab9190612d72565b73ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff16149050611905565b8273ffffffffffffffffffffffffffffffffffffffff1663d6c0b2c46040518163ffffffff1660e01b8152600401602060405180830381865afa158015611987573d6000803e3d6000fd5b60405173ffffffffffffffffffffffffffffffffffffffff8316602482015260448101829052610aa49084907fa9059cbb00000000000000000000000000000000000000000000000000000000906064015b604080517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe08184030181529190526020810180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff167fffffffff000000000000000000000000000000000000000000000000000000009093169290921790915261219f565b8373ffffffffffffffffffffffffffffffffffffffff168573ffffffffffffffffffffffffffffffffffffffff168773ffffffffffffffffffffffffffffffffffffffff167f3ceee06c1e37648fcbb6ed52e17b3e1f275a1f8c7b22a84b2b84732431e046b3868686604051611b7793929190612e85565b60405180910390a46110138686868686866122ab565b600080611b98612333565b5073ffffffffffffffffffffffffffffffffffffffff1673eeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeee141592915050565b8273ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff167f2ac69ee804d9a7a0984249f508dfab7cb2534b465b6ce1580f99a38ba9c5e6318484604051611c2b929190612ec3565b60405180910390a36105b2848484846123d0565b6000806000835160208501868989f195945050505050565b3415611ce5576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602160248201527f5374616e646172644272696467653a2063616e6e6f742073656e642076616c7560448201527f65000000000000000000000000000000000000000000000000000000000000006064820152608401610214565b611cee876118a9565b15611e3c57611cfd878761190b565b611daf576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152604a60248201527f5374616e646172644272696467653a2077726f6e672072656d6f746520746f6b60448201527f656e20666f72204f7074696d69736d204d696e7461626c65204552433230206c60648201527f6f63616c20746f6b656e00000000000000000000000000000000000000000000608482015260a401610214565b6040517f9dc29fac00000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff868116600483015260248201859052881690639dc29fac90604401600060405180830381600087803b158015611e1f57600080fd5b505af1158015611e33573d6000803e3d6000fd5b50505050611ed0565b611e5e73ffffffffffffffffffffffffffffffffffffffff881686308661243d565b73ffffffffffffffffffffffffffffffffffffffff8088166000908152600260209081526040808320938a1683529290522054611e9c908490612edc565b73ffffffffffffffffffffffffffffffffffffffff8089166000908152600260209081526040808320938b16835292905220555b611ede87878787878661249b565b60035460045460405173ffffffffffffffffffffffffffffffffffffffff92831692633dbb202b9216907f0166a07a0000000000000000000000000000000000000000000000000000000090611f42908b908d908c908c908c908b90602401612ef4565b604080517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe08184030181529181526020820180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff167fffffffff000000000000000000000000000000000000000000000000000000009485161790525160e085901b9092168252611fd592918790600401612e40565b600060405180830381600087803b158015611fef57600080fd5b505af1158015612003573d6000803e3d6000fd5b5050505050505050505050565b6109c987878787878787611c57565b600054610100900460ff166120b6576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602b60248201527f496e697469616c697a61626c653a20636f6e7472616374206973206e6f74206960448201527f6e697469616c697a696e670000000000000000000000000000000000000000006064820152608401610214565b6003805473ffffffffffffffffffffffffffffffffffffffff9384167fffffffffffffffffffffffff00000000000000000000000000000000000000009182161790915560048054929093169116179055565b8273ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff167f35d79ab81f2b2017e19afb5c5571778877782d7a8786f5907f93b0f4702f4f238484604051612168929190612ec3565b60405180910390a36105b284848484612529565b600061218783612588565b8015612198575061219883836125ec565b9392505050565b6000612201826040518060400160405280602081526020017f5361666545524332303a206c6f772d6c6576656c2063616c6c206661696c65648152508573ffffffffffffffffffffffffffffffffffffffff166126bb9092919063ffffffff16565b805190915015610aa4578080602001905181019061221f9190612dd5565b610aa4576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602a60248201527f5361666545524332303a204552433230206f7065726174696f6e20646964206e60448201527f6f742073756363656564000000000000000000000000000000000000000000006064820152608401610214565b8373ffffffffffffffffffffffffffffffffffffffff168573ffffffffffffffffffffffffffffffffffffffff168773ffffffffffffffffffffffffffffffffffffffff167fd59c65b35445225835c83f50b6ede06a7be047d22e357073e250d9af537518cd86868660405161232393929190612e85565b60405180910390a4505050505050565b603354604080517f4397dfef0000000000000000000000000000000000000000000000000000000081528151600093849373ffffffffffffffffffffffffffffffffffffffff90911692634397dfef92600480830193928290030181865afa1580156123a3573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906123c79190612f4f565b90939092509050565b8273ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff167f31b2166ff604fc5672ea5df08a78081d2bc6d746cadce880747f3643d819e83d848460405161242f929190612ec3565b60405180910390a350505050565b60405173ffffffffffffffffffffffffffffffffffffffff808516602483015283166044820152606481018290526105b29085907f23b872dd0000000000000000000000000000000000000000000000000000000090608401611a7d565b8373ffffffffffffffffffffffffffffffffffffffff168573ffffffffffffffffffffffffffffffffffffffff168773ffffffffffffffffffffffffffffffffffffffff167f718594027abd4eaed59f95162563e0cc6d0e8d5b86b1c7be8b1b0ac3343d039686868660405161251393929190612e85565b60405180910390a46110138686868686866126d2565b8273ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff167f2849b43074093a05396b6f2a937dee8565b15a48a7b3d4bffb732a5017380af5848460405161242f929190612ec3565b60006125b4827f01ffc9a7000000000000000000000000000000000000000000000000000000006125ec565b801561190557506125e5827fffffffff000000000000000000000000000000000000000000000000000000006125ec565b1592915050565b604080517fffffffff000000000000000000000000000000000000000000000000000000008316602480830191909152825180830390910181526044909101909152602080820180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff167f01ffc9a700000000000000000000000000000000000000000000000000000000178152825160009392849283928392918391908a617530fa92503d915060005190508280156126a4575060208210155b80156126b05750600081115b979650505050505050565b60606126ca848460008561274a565b949350505050565b8373ffffffffffffffffffffffffffffffffffffffff168573ffffffffffffffffffffffffffffffffffffffff168773ffffffffffffffffffffffffffffffffffffffff167f7ff126db8024424bbfd9826e8ab82ff59136289ea440b04b39a0df1b03b9cabf86868660405161232393929190612e85565b6060824710156127dc576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602660248201527f416464726573733a20696e73756666696369656e742062616c616e636520666f60448201527f722063616c6c00000000000000000000000000000000000000000000000000006064820152608401610214565b73ffffffffffffffffffffffffffffffffffffffff85163b61285a576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601d60248201527f416464726573733a2063616c6c20746f206e6f6e2d636f6e74726163740000006044820152606401610214565b6000808673ffffffffffffffffffffffffffffffffffffffff1685876040516128839190612f84565b60006040518083038185875af1925050503d80600081146128c0576040519150601f19603f3d011682016040523d82523d6000602084013e6128c5565b606091505b50915091506126b0828286606083156128df575081612198565b8251156128ef5782518084602001fd5b816040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016102149190612bf5565b73ffffffffffffffffffffffffffffffffffffffff8116811461294557600080fd5b50565b60008083601f84011261295a57600080fd5b50813567ffffffffffffffff81111561297257600080fd5b60208301915083602082850101111561298a57600080fd5b9250929050565b600080600080600080600060c0888a0312156129ac57600080fd5b87356129b781612923565b965060208801356129c781612923565b955060408801356129d781612923565b945060608801356129e781612923565b93506080880135925060a088013567ffffffffffffffff811115612a0a57600080fd5b612a168a828b01612948565b989b979a50959850939692959293505050565b803563ffffffff81168114612a3d57600080fd5b919050565b600080600060408486031215612a5757600080fd5b612a6084612a29565b9250602084013567ffffffffffffffff811115612a7c57600080fd5b612a8886828701612948565b9497909650939450505050565b600080600080600060808688031215612aad57600080fd5b8535612ab881612923565b94506020860135612ac881612923565b935060408601359250606086013567ffffffffffffffff811115612aeb57600080fd5b612af788828901612948565b969995985093965092949392505050565b600080600080600080600060c0888a031215612b2357600080fd5b8735612b2e81612923565b96506020880135612b3e81612923565b95506040880135612b4e81612923565b945060608801359350612b6360808901612a29565b925060a088013567ffffffffffffffff811115612a0a57600080fd5b60005b83811015612b9a578181015183820152602001612b82565b838111156105b25750506000910152565b60008151808452612bc3816020860160208601612b7f565b601f017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0169290920160200192915050565b6020815260006121986020830184612bab565b60008060008060008060a08789031215612c2157600080fd5b8635612c2c81612923565b95506020870135612c3c81612923565b945060408701359350612c5160608801612a29565b9250608087013567ffffffffffffffff811115612c6d57600080fd5b612c7989828a01612948565b979a9699509497509295939492505050565b60008060408385031215612c9e57600080fd5b8235612ca981612923565b91506020830135612cb981612923565b809150509250929050565b60008060008060608587031215612cda57600080fd5b8435612ce581612923565b9350612cf360208601612a29565b9250604085013567ffffffffffffffff811115612d0f57600080fd5b612d1b87828801612948565b95989497509550505050565b600080600060608486031215612d3c57600080fd5b8335612d4781612923565b92506020840135612d5781612923565b91506040840135612d6781612923565b809150509250925092565b600060208284031215612d8457600080fd5b815161219881612923565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b600082821015612dd057612dd0612d8f565b500390565b600060208284031215612de757600080fd5b8151801515811461219857600080fd5b600073ffffffffffffffffffffffffffffffffffffffff808716835280861660208401525083604083015260806060830152612e366080830184612bab565b9695505050505050565b73ffffffffffffffffffffffffffffffffffffffff84168152606060208201526000612e6f6060830185612bab565b905063ffffffff83166040830152949350505050565b73ffffffffffffffffffffffffffffffffffffffff84168152826020820152606060408201526000612eba6060830184612bab565b95945050505050565b8281526040602082015260006126ca6040830184612bab565b60008219821115612eef57612eef612d8f565b500190565b600073ffffffffffffffffffffffffffffffffffffffff80891683528088166020840152808716604084015280861660608401525083608083015260c060a0830152612f4360c0830184612bab565b98975050505050505050565b60008060408385031215612f6257600080fd5b8251612f6d81612923565b602084015190925060ff81168114612cb957600080fd5b60008251612f96818460208701612b7f565b919091019291505056fea164736f6c634300080f000a"; bytes internal constant l1ERC721BridgeCode = - hex"608060405234801561001057600080fd5b50600436106100d45760003560e01c80635d93a3fc11610081578063927ede2d1161005b578063927ede2d14610231578063aa5574521461024f578063c89701a21461026257600080fd5b80635d93a3fc146101cc578063761f4493146102005780637f46ddb21461021357600080fd5b8063485cc955116100b2578063485cc9551461015857806354fd4d501461016b5780635c975abb146101b457600080fd5b806335e80ab3146100d95780633687011a146101235780633cb747bf14610138575b600080fd5b6032546100f99073ffffffffffffffffffffffffffffffffffffffff1681565b60405173ffffffffffffffffffffffffffffffffffffffff90911681526020015b60405180910390f35b610136610131366004610fe1565b610282565b005b6001546100f99073ffffffffffffffffffffffffffffffffffffffff1681565b610136610166366004611064565b61032e565b6101a76040518060400160405280600581526020017f322e312e3000000000000000000000000000000000000000000000000000000081525081565b60405161011a9190611108565b6101bc610518565b604051901515815260200161011a565b6101bc6101da366004611122565b603160209081526000938452604080852082529284528284209052825290205460ff1681565b61013661020e366004611163565b6105b1565b60025473ffffffffffffffffffffffffffffffffffffffff166100f9565b60015473ffffffffffffffffffffffffffffffffffffffff166100f9565b61013661025d3660046111fb565b610a58565b6002546100f99073ffffffffffffffffffffffffffffffffffffffff1681565b333b15610316576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602d60248201527f4552433732314272696467653a206163636f756e74206973206e6f742065787460448201527f65726e616c6c79206f776e65640000000000000000000000000000000000000060648201526084015b60405180910390fd5b6103268686333388888888610b30565b505050505050565b600054610100900460ff161580801561034e5750600054600160ff909116105b806103685750303b158015610368575060005460ff166001145b6103f4576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602e60248201527f496e697469616c697a61626c653a20636f6e747261637420697320616c72656160448201527f647920696e697469616c697a6564000000000000000000000000000000000000606482015260840161030d565b600080547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00166001179055801561045257600080547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00ff166101001790555b603280547fffffffffffffffffffffffff00000000000000000000000000000000000000001673ffffffffffffffffffffffffffffffffffffffff84161790556104b083734200000000000000000000000000000000000014610e70565b801561051357600080547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00ff169055604051600181527f7f26b83ff96e1f2b6a682f133852f6798a09c465da95921460cefb38474024989060200160405180910390a15b505050565b603254604080517f5c975abb000000000000000000000000000000000000000000000000000000008152905160009273ffffffffffffffffffffffffffffffffffffffff1691635c975abb9160048083019260209291908290030181865afa158015610588573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906105ac9190611272565b905090565b60015473ffffffffffffffffffffffffffffffffffffffff16331480156106865750600254600154604080517f6e296e45000000000000000000000000000000000000000000000000000000008152905173ffffffffffffffffffffffffffffffffffffffff9384169390921691636e296e45916004808201926020929091908290030181865afa15801561064a573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061066e9190611294565b73ffffffffffffffffffffffffffffffffffffffff16145b610712576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152603f60248201527f4552433732314272696467653a2066756e6374696f6e2063616e206f6e6c792060448201527f62652063616c6c65642066726f6d20746865206f746865722062726964676500606482015260840161030d565b61071a610518565b15610781576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601660248201527f4c314552433732314272696467653a2070617573656400000000000000000000604482015260640161030d565b3073ffffffffffffffffffffffffffffffffffffffff881603610826576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602a60248201527f4c314552433732314272696467653a206c6f63616c20746f6b656e2063616e6e60448201527f6f742062652073656c6600000000000000000000000000000000000000000000606482015260840161030d565b73ffffffffffffffffffffffffffffffffffffffff8088166000908152603160209081526040808320938a1683529281528282208683529052205460ff1615156001146108f5576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152603960248201527f4c314552433732314272696467653a20546f6b656e204944206973206e6f742060448201527f657363726f77656420696e20746865204c312042726964676500000000000000606482015260840161030d565b73ffffffffffffffffffffffffffffffffffffffff87811660008181526031602090815260408083208b8616845282528083208884529091529081902080547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00169055517f42842e0e000000000000000000000000000000000000000000000000000000008152306004820152918616602483015260448201859052906342842e0e90606401600060405180830381600087803b1580156109b557600080fd5b505af11580156109c9573d6000803e3d6000fd5b505050508473ffffffffffffffffffffffffffffffffffffffff168673ffffffffffffffffffffffffffffffffffffffff168873ffffffffffffffffffffffffffffffffffffffff167f1f39bf6707b5d608453e0ae4c067b562bcc4c85c0f562ef5d2c774d2e7f131ac87878787604051610a4794939291906112fa565b60405180910390a450505050505050565b73ffffffffffffffffffffffffffffffffffffffff8516610afb576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152603060248201527f4552433732314272696467653a206e667420726563697069656e742063616e6e60448201527f6f74206265206164647265737328302900000000000000000000000000000000606482015260840161030d565b610b0b8787338888888888610b30565b50505050505050565b73ffffffffffffffffffffffffffffffffffffffff163b151590565b73ffffffffffffffffffffffffffffffffffffffff8716610bd3576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152603160248201527f4c314552433732314272696467653a2072656d6f746520746f6b656e2063616e60448201527f6e6f742062652061646472657373283029000000000000000000000000000000606482015260840161030d565b600063761f449360e01b888a8989898888604051602401610bfa979695949392919061133a565b604080517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0818403018152918152602080830180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff167fffffffff00000000000000000000000000000000000000000000000000000000959095169490941790935273ffffffffffffffffffffffffffffffffffffffff8c81166000818152603186528381208e8416825286528381208b82529095529382902080547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0016600117905590517f23b872dd000000000000000000000000000000000000000000000000000000008152908a166004820152306024820152604481018890529092506323b872dd90606401600060405180830381600087803b158015610d3a57600080fd5b505af1158015610d4e573d6000803e3d6000fd5b50506001546002546040517f3dbb202b00000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff9283169450633dbb202b9350610db1929091169085908990600401611397565b600060405180830381600087803b158015610dcb57600080fd5b505af1158015610ddf573d6000803e3d6000fd5b505050508673ffffffffffffffffffffffffffffffffffffffff168873ffffffffffffffffffffffffffffffffffffffff168a73ffffffffffffffffffffffffffffffffffffffff167fb7460e2a880f256ebef3406116ff3eee0cee51ebccdc2a40698f87ebb2e9c1a589898888604051610e5d94939291906112fa565b60405180910390a4505050505050505050565b600054610100900460ff16610f07576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602b60248201527f496e697469616c697a61626c653a20636f6e7472616374206973206e6f74206960448201527f6e697469616c697a696e67000000000000000000000000000000000000000000606482015260840161030d565b6001805473ffffffffffffffffffffffffffffffffffffffff9384167fffffffffffffffffffffffff00000000000000000000000000000000000000009182161790915560028054929093169116179055565b73ffffffffffffffffffffffffffffffffffffffff81168114610f7c57600080fd5b50565b803563ffffffff81168114610f9357600080fd5b919050565b60008083601f840112610faa57600080fd5b50813567ffffffffffffffff811115610fc257600080fd5b602083019150836020828501011115610fda57600080fd5b9250929050565b60008060008060008060a08789031215610ffa57600080fd5b863561100581610f5a565b9550602087013561101581610f5a565b94506040870135935061102a60608801610f7f565b9250608087013567ffffffffffffffff81111561104657600080fd5b61105289828a01610f98565b979a9699509497509295939492505050565b6000806040838503121561107757600080fd5b823561108281610f5a565b9150602083013561109281610f5a565b809150509250929050565b6000815180845260005b818110156110c3576020818501810151868301820152016110a7565b818111156110d5576000602083870101525b50601f017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0169290920160200192915050565b60208152600061111b602083018461109d565b9392505050565b60008060006060848603121561113757600080fd5b833561114281610f5a565b9250602084013561115281610f5a565b929592945050506040919091013590565b600080600080600080600060c0888a03121561117e57600080fd5b873561118981610f5a565b9650602088013561119981610f5a565b955060408801356111a981610f5a565b945060608801356111b981610f5a565b93506080880135925060a088013567ffffffffffffffff8111156111dc57600080fd5b6111e88a828b01610f98565b989b979a50959850939692959293505050565b600080600080600080600060c0888a03121561121657600080fd5b873561122181610f5a565b9650602088013561123181610f5a565b9550604088013561124181610f5a565b94506060880135935061125660808901610f7f565b925060a088013567ffffffffffffffff8111156111dc57600080fd5b60006020828403121561128457600080fd5b8151801515811461111b57600080fd5b6000602082840312156112a657600080fd5b815161111b81610f5a565b8183528181602085013750600060208284010152600060207fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0601f840116840101905092915050565b73ffffffffffffffffffffffffffffffffffffffff851681528360208201526060604082015260006113306060830184866112b1565b9695505050505050565b600073ffffffffffffffffffffffffffffffffffffffff808a1683528089166020840152808816604084015280871660608401525084608083015260c060a083015261138a60c0830184866112b1565b9998505050505050505050565b73ffffffffffffffffffffffffffffffffffffffff841681526060602082015260006113c6606083018561109d565b905063ffffffff8316604083015294935050505056fea164736f6c634300080f000a"; + hex"608060405234801561001057600080fd5b50600436106100d45760003560e01c80635d93a3fc11610081578063927ede2d1161005b578063927ede2d14610231578063aa5574521461024f578063c89701a21461026257600080fd5b80635d93a3fc146101cc578063761f4493146102005780637f46ddb21461021357600080fd5b8063485cc955116100b2578063485cc9551461015857806354fd4d501461016b5780635c975abb146101b457600080fd5b806335e80ab3146100d95780633687011a146101235780633cb747bf14610138575b600080fd5b6032546100f99073ffffffffffffffffffffffffffffffffffffffff1681565b60405173ffffffffffffffffffffffffffffffffffffffff90911681526020015b60405180910390f35b610136610131366004610fe1565b610282565b005b6001546100f99073ffffffffffffffffffffffffffffffffffffffff1681565b610136610166366004611064565b61032e565b6101a76040518060400160405280600c81526020017f322e312e312d626574612e32000000000000000000000000000000000000000081525081565b60405161011a9190611108565b6101bc610518565b604051901515815260200161011a565b6101bc6101da366004611122565b603160209081526000938452604080852082529284528284209052825290205460ff1681565b61013661020e366004611163565b6105b1565b60025473ffffffffffffffffffffffffffffffffffffffff166100f9565b60015473ffffffffffffffffffffffffffffffffffffffff166100f9565b61013661025d3660046111fb565b610a58565b6002546100f99073ffffffffffffffffffffffffffffffffffffffff1681565b333b15610316576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602d60248201527f4552433732314272696467653a206163636f756e74206973206e6f742065787460448201527f65726e616c6c79206f776e65640000000000000000000000000000000000000060648201526084015b60405180910390fd5b6103268686333388888888610b30565b505050505050565b600054610100900460ff161580801561034e5750600054600160ff909116105b806103685750303b158015610368575060005460ff166001145b6103f4576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602e60248201527f496e697469616c697a61626c653a20636f6e747261637420697320616c72656160448201527f647920696e697469616c697a6564000000000000000000000000000000000000606482015260840161030d565b600080547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00166001179055801561045257600080547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00ff166101001790555b603280547fffffffffffffffffffffffff00000000000000000000000000000000000000001673ffffffffffffffffffffffffffffffffffffffff84161790556104b083734200000000000000000000000000000000000014610e70565b801561051357600080547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00ff169055604051600181527f7f26b83ff96e1f2b6a682f133852f6798a09c465da95921460cefb38474024989060200160405180910390a15b505050565b603254604080517f5c975abb000000000000000000000000000000000000000000000000000000008152905160009273ffffffffffffffffffffffffffffffffffffffff1691635c975abb9160048083019260209291908290030181865afa158015610588573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906105ac9190611272565b905090565b60015473ffffffffffffffffffffffffffffffffffffffff16331480156106865750600254600154604080517f6e296e45000000000000000000000000000000000000000000000000000000008152905173ffffffffffffffffffffffffffffffffffffffff9384169390921691636e296e45916004808201926020929091908290030181865afa15801561064a573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061066e9190611294565b73ffffffffffffffffffffffffffffffffffffffff16145b610712576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152603f60248201527f4552433732314272696467653a2066756e6374696f6e2063616e206f6e6c792060448201527f62652063616c6c65642066726f6d20746865206f746865722062726964676500606482015260840161030d565b61071a610518565b15610781576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601660248201527f4c314552433732314272696467653a2070617573656400000000000000000000604482015260640161030d565b3073ffffffffffffffffffffffffffffffffffffffff881603610826576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602a60248201527f4c314552433732314272696467653a206c6f63616c20746f6b656e2063616e6e60448201527f6f742062652073656c6600000000000000000000000000000000000000000000606482015260840161030d565b73ffffffffffffffffffffffffffffffffffffffff8088166000908152603160209081526040808320938a1683529281528282208683529052205460ff1615156001146108f5576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152603960248201527f4c314552433732314272696467653a20546f6b656e204944206973206e6f742060448201527f657363726f77656420696e20746865204c312042726964676500000000000000606482015260840161030d565b73ffffffffffffffffffffffffffffffffffffffff87811660008181526031602090815260408083208b8616845282528083208884529091529081902080547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00169055517f42842e0e000000000000000000000000000000000000000000000000000000008152306004820152918616602483015260448201859052906342842e0e90606401600060405180830381600087803b1580156109b557600080fd5b505af11580156109c9573d6000803e3d6000fd5b505050508473ffffffffffffffffffffffffffffffffffffffff168673ffffffffffffffffffffffffffffffffffffffff168873ffffffffffffffffffffffffffffffffffffffff167f1f39bf6707b5d608453e0ae4c067b562bcc4c85c0f562ef5d2c774d2e7f131ac87878787604051610a4794939291906112fa565b60405180910390a450505050505050565b73ffffffffffffffffffffffffffffffffffffffff8516610afb576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152603060248201527f4552433732314272696467653a206e667420726563697069656e742063616e6e60448201527f6f74206265206164647265737328302900000000000000000000000000000000606482015260840161030d565b610b0b8787338888888888610b30565b50505050505050565b73ffffffffffffffffffffffffffffffffffffffff163b151590565b73ffffffffffffffffffffffffffffffffffffffff8716610bd3576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152603160248201527f4c314552433732314272696467653a2072656d6f746520746f6b656e2063616e60448201527f6e6f742062652061646472657373283029000000000000000000000000000000606482015260840161030d565b600063761f449360e01b888a8989898888604051602401610bfa979695949392919061133a565b604080517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0818403018152918152602080830180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff167fffffffff00000000000000000000000000000000000000000000000000000000959095169490941790935273ffffffffffffffffffffffffffffffffffffffff8c81166000818152603186528381208e8416825286528381208b82529095529382902080547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0016600117905590517f23b872dd000000000000000000000000000000000000000000000000000000008152908a166004820152306024820152604481018890529092506323b872dd90606401600060405180830381600087803b158015610d3a57600080fd5b505af1158015610d4e573d6000803e3d6000fd5b50506001546002546040517f3dbb202b00000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff9283169450633dbb202b9350610db1929091169085908990600401611397565b600060405180830381600087803b158015610dcb57600080fd5b505af1158015610ddf573d6000803e3d6000fd5b505050508673ffffffffffffffffffffffffffffffffffffffff168873ffffffffffffffffffffffffffffffffffffffff168a73ffffffffffffffffffffffffffffffffffffffff167fb7460e2a880f256ebef3406116ff3eee0cee51ebccdc2a40698f87ebb2e9c1a589898888604051610e5d94939291906112fa565b60405180910390a4505050505050505050565b600054610100900460ff16610f07576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602b60248201527f496e697469616c697a61626c653a20636f6e7472616374206973206e6f74206960448201527f6e697469616c697a696e67000000000000000000000000000000000000000000606482015260840161030d565b6001805473ffffffffffffffffffffffffffffffffffffffff9384167fffffffffffffffffffffffff00000000000000000000000000000000000000009182161790915560028054929093169116179055565b73ffffffffffffffffffffffffffffffffffffffff81168114610f7c57600080fd5b50565b803563ffffffff81168114610f9357600080fd5b919050565b60008083601f840112610faa57600080fd5b50813567ffffffffffffffff811115610fc257600080fd5b602083019150836020828501011115610fda57600080fd5b9250929050565b60008060008060008060a08789031215610ffa57600080fd5b863561100581610f5a565b9550602087013561101581610f5a565b94506040870135935061102a60608801610f7f565b9250608087013567ffffffffffffffff81111561104657600080fd5b61105289828a01610f98565b979a9699509497509295939492505050565b6000806040838503121561107757600080fd5b823561108281610f5a565b9150602083013561109281610f5a565b809150509250929050565b6000815180845260005b818110156110c3576020818501810151868301820152016110a7565b818111156110d5576000602083870101525b50601f017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0169290920160200192915050565b60208152600061111b602083018461109d565b9392505050565b60008060006060848603121561113757600080fd5b833561114281610f5a565b9250602084013561115281610f5a565b929592945050506040919091013590565b600080600080600080600060c0888a03121561117e57600080fd5b873561118981610f5a565b9650602088013561119981610f5a565b955060408801356111a981610f5a565b945060608801356111b981610f5a565b93506080880135925060a088013567ffffffffffffffff8111156111dc57600080fd5b6111e88a828b01610f98565b989b979a50959850939692959293505050565b600080600080600080600060c0888a03121561121657600080fd5b873561122181610f5a565b9650602088013561123181610f5a565b9550604088013561124181610f5a565b94506060880135935061125660808901610f7f565b925060a088013567ffffffffffffffff8111156111dc57600080fd5b60006020828403121561128457600080fd5b8151801515811461111b57600080fd5b6000602082840312156112a657600080fd5b815161111b81610f5a565b8183528181602085013750600060208284010152600060207fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0601f840116840101905092915050565b73ffffffffffffffffffffffffffffffffffffffff851681528360208201526060604082015260006113306060830184866112b1565b9695505050505050565b600073ffffffffffffffffffffffffffffffffffffffff808a1683528089166020840152808816604084015280871660608401525084608083015260c060a083015261138a60c0830184866112b1565b9998505050505050505050565b73ffffffffffffffffffffffffffffffffffffffff841681526060602082015260006113c6606083018561109d565b905063ffffffff8316604083015294935050505056fea164736f6c634300080f000a"; + bytes internal constant optimismPortalCode = + hex"6080604052600436106101635760003560e01c80638c3152e9116100c0578063b69ef8a811610074578063cff0ab9611610059578063cff0ab9614610444578063e965084c146104e5578063e9e05c421461057157600080fd5b8063b69ef8a814610401578063c0c53b8b1461042457600080fd5b80639bf62d82116100a55780639bf62d821461036b578063a14238e714610398578063a35d99df146103c857600080fd5b80638c3152e91461031e5780639b5f694a1461033e57600080fd5b806354fd4d50116101175780636dbffb78116100fc5780636dbffb78146102de57806371cfaa3f146102fe5780638b4c40b01461018857600080fd5b806354fd4d501461026d5780635c975abb146102b957600080fd5b806335e80ab31161014857806335e80ab314610206578063452a9320146102385780634870496f1461024d57600080fd5b8063149f2f221461018f57806333d7e2bd146101af57600080fd5b3661018a576101883334620186a060006040518060200160405280600081525061057f565b005b600080fd5b34801561019b57600080fd5b506101886101aa366004614c13565b610624565b3480156101bb57600080fd5b506037546101dc9073ffffffffffffffffffffffffffffffffffffffff1681565b60405173ffffffffffffffffffffffffffffffffffffffff90911681526020015b60405180910390f35b34801561021257600080fd5b506035546101dc90610100900473ffffffffffffffffffffffffffffffffffffffff1681565b34801561024457600080fd5b506101dc610865565b34801561025957600080fd5b50610188610268366004614d47565b6108fd565b34801561027957600080fd5b50604080518082018252600c81527f322e382e312d626574612e320000000000000000000000000000000000000000602082015290516101fd9190614e99565b3480156102c557600080fd5b506102ce610eaa565b60405190151581526020016101fd565b3480156102ea57600080fd5b506102ce6102f9366004614eac565b610f3d565b34801561030a57600080fd5b50610188610319366004614ed4565b610ff8565b34801561032a57600080fd5b50610188610339366004614f1a565b6111ba565b34801561034a57600080fd5b506036546101dc9073ffffffffffffffffffffffffffffffffffffffff1681565b34801561037757600080fd5b506032546101dc9073ffffffffffffffffffffffffffffffffffffffff1681565b3480156103a457600080fd5b506102ce6103b3366004614eac565b60336020526000908152604090205460ff1681565b3480156103d457600080fd5b506103e86103e3366004614f57565b611c3c565b60405167ffffffffffffffff90911681526020016101fd565b34801561040d57600080fd5b50610416611c55565b6040519081526020016101fd565b34801561043057600080fd5b5061018861043f366004614f72565b611caf565b34801561045057600080fd5b506001546104ac906fffffffffffffffffffffffffffffffff81169067ffffffffffffffff7001000000000000000000000000000000008204811691780100000000000000000000000000000000000000000000000090041683565b604080516fffffffffffffffffffffffffffffffff909416845267ffffffffffffffff92831660208501529116908201526060016101fd565b3480156104f157600080fd5b50610543610500366004614eac565b603460205260009081526040902080546001909101546fffffffffffffffffffffffffffffffff8082169170010000000000000000000000000000000090041683565b604080519384526fffffffffffffffffffffffffffffffff92831660208501529116908201526060016101fd565b61018861057f366004614fbd565b8260005a9050600061058f611f19565b50905073ffffffffffffffffffffffffffffffffffffffff811673eeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeee148015906105cb57503415155b15610602576040517ff2365b5b00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b610610883489898989611fb6565b5061061b8282612162565b50505050505050565b8260005a90506000610634611f19565b5090507fffffffffffffffffffffffff111111111111111111111111111111111111111273ffffffffffffffffffffffffffffffffffffffff8216016106a6576040517f0eaf3c0f00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b87603d60008282546106b89190615069565b90915550506040517f70a0823100000000000000000000000000000000000000000000000000000000815230600482015260009073ffffffffffffffffffffffffffffffffffffffff8316906370a0823190602401602060405180830381865afa15801561072a573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061074e9190615081565b905061077273ffffffffffffffffffffffffffffffffffffffff831633308c61242f565b61077c8982615069565b6040517f70a0823100000000000000000000000000000000000000000000000000000000815230600482015273ffffffffffffffffffffffffffffffffffffffff8416906370a0823190602401602060405180830381865afa1580156107e6573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061080a9190615081565b14610841576040517f90b8ec1800000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b61084f8a8a8a8a8a8a611fb6565b505061085b8282612162565b5050505050505050565b6000603560019054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1663452a93206040518163ffffffff1660e01b8152600401602060405180830381865afa1580156108d4573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906108f8919061509a565b905090565b610905610eaa565b1561093c576040517ff480973e00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b3073ffffffffffffffffffffffffffffffffffffffff16856040015173ffffffffffffffffffffffffffffffffffffffff16036109a5576040517f13496fda00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6036546040517fa25ae5570000000000000000000000000000000000000000000000000000000081526004810186905260009173ffffffffffffffffffffffffffffffffffffffff169063a25ae55790602401606060405180830381865afa158015610a15573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610a3991906150d7565b519050610a53610a4e3686900386018661513c565b61250b565b8114610ae6576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602960248201527f4f7074696d69736d506f7274616c3a20696e76616c6964206f7574707574207260448201527f6f6f742070726f6f66000000000000000000000000000000000000000000000060648201526084015b60405180910390fd5b6000610af187612567565b6000818152603460209081526040918290208251606081018452815481526001909101546fffffffffffffffffffffffffffffffff8082169383018490527001000000000000000000000000000000009091041692810192909252919250901580610c075750805160365460408084015190517fa25ae5570000000000000000000000000000000000000000000000000000000081526fffffffffffffffffffffffffffffffff909116600482015273ffffffffffffffffffffffffffffffffffffffff9091169063a25ae55790602401606060405180830381865afa158015610bdf573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610c0391906150d7565b5114155b610c93576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152603760248201527f4f7074696d69736d506f7274616c3a207769746864726177616c20686173682060448201527f68617320616c7265616479206265656e2070726f76656e0000000000000000006064820152608401610add565b60408051602081018490526000918101829052606001604080517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe081840301815282825280516020918201209083018190529250610d5c9101604080517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0818403018152828201909152600182527f0100000000000000000000000000000000000000000000000000000000000000602083015290610d52888a6151a2565b8a60400135612597565b610de8576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152603260248201527f4f7074696d69736d506f7274616c3a20696e76616c696420776974686472617760448201527f616c20696e636c7573696f6e2070726f6f6600000000000000000000000000006064820152608401610add565b604080516060810182528581526fffffffffffffffffffffffffffffffff42811660208084019182528c831684860190815260008981526034835286812095518655925190518416700100000000000000000000000000000000029316929092176001909301929092558b830151908c0151925173ffffffffffffffffffffffffffffffffffffffff918216939091169186917f67a6208cfcc0801d50f6cbe764733f4fddf66ac0b04442061a8a8c0cb6b63f629190a4505050505050505050565b6000603560019054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16635c975abb6040518163ffffffff1660e01b8152600401602060405180830381865afa158015610f19573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906108f89190615226565b6036546040517fa25ae55700000000000000000000000000000000000000000000000000000000815260048101839052600091610ff29173ffffffffffffffffffffffffffffffffffffffff9091169063a25ae55790602401606060405180830381865afa158015610fb3573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610fd791906150d7565b602001516fffffffffffffffffffffffffffffffff166125bb565b92915050565b60375473ffffffffffffffffffffffffffffffffffffffff163314611049576040517f82b4290000000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b61105562030d40612661565b60405173ffffffffffffffffffffffffffffffffffffffff8516602482015260ff8416604482015260648101839052608481018290526000907342000000000000000000000000000000000000159073deaddeaddeaddeaddeaddeaddeaddeaddead0001907fb3813568d9991fc951961fcb4c784893574240a28925604d09fc577c55bb7c32908490819062030d4090829060a401604080517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0818403018152918152602080830180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff167f71cfaa3f00000000000000000000000000000000000000000000000000000000179052905161117296959493929101615243565b604080517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0818403018152908290526111aa91614e99565b60405180910390a450505050565b565b6111c2610eaa565b156111f9576040517ff480973e00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b60325473ffffffffffffffffffffffffffffffffffffffff1661dead1461124c576040517f9396d15600000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b600061125782612567565b60008181526034602090815260408083208151606081018352815481526001909101546fffffffffffffffffffffffffffffffff80821694830185905270010000000000000000000000000000000090910416918101919091529293509003611342576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152603260248201527f4f7074696d69736d506f7274616c3a207769746864726177616c20686173206e60448201527f6f74206265656e2070726f76656e2079657400000000000000000000000000006064820152608401610add565b603660009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1663887862726040518163ffffffff1660e01b8152600401602060405180830381865afa1580156113af573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906113d39190615081565b81602001516fffffffffffffffffffffffffffffffff16101561149e576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152604b60248201527f4f7074696d69736d506f7274616c3a207769746864726177616c2074696d657360448201527f74616d70206c657373207468616e204c32204f7261636c65207374617274696e60648201527f672074696d657374616d70000000000000000000000000000000000000000000608482015260a401610add565b6114bd81602001516fffffffffffffffffffffffffffffffff166125bb565b61156f576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152604560248201527f4f7074696d69736d506f7274616c3a2070726f76656e2077697468647261776160448201527f6c2066696e616c697a6174696f6e20706572696f6420686173206e6f7420656c60648201527f6170736564000000000000000000000000000000000000000000000000000000608482015260a401610add565b60365460408281015190517fa25ae5570000000000000000000000000000000000000000000000000000000081526fffffffffffffffffffffffffffffffff909116600482015260009173ffffffffffffffffffffffffffffffffffffffff169063a25ae55790602401606060405180830381865afa1580156115f6573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061161a91906150d7565b82518151919250146116d4576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152604960248201527f4f7074696d69736d506f7274616c3a206f757470757420726f6f742070726f7660448201527f656e206973206e6f74207468652073616d652061732063757272656e74206f7560648201527f7470757420726f6f740000000000000000000000000000000000000000000000608482015260a401610add565b6116f381602001516fffffffffffffffffffffffffffffffff166125bb565b6117a5576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152604360248201527f4f7074696d69736d506f7274616c3a206f75747075742070726f706f73616c2060448201527f66696e616c697a6174696f6e20706572696f6420686173206e6f7420656c617060648201527f7365640000000000000000000000000000000000000000000000000000000000608482015260a401610add565b60008381526033602052604090205460ff1615611844576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152603560248201527f4f7074696d69736d506f7274616c3a207769746864726177616c20686173206160448201527f6c7265616479206265656e2066696e616c697a656400000000000000000000006064820152608401610add565b6000838152603360209081526040822080547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff001660011790558501516032805473ffffffffffffffffffffffffffffffffffffffff9092167fffffffffffffffffffffffff0000000000000000000000000000000000000000909216919091179055806118cf611f19565b5090507fffffffffffffffffffffffff111111111111111111111111111111111111111273ffffffffffffffffffffffffffffffffffffffff8216016119325761192b8660400151876080015188606001518960a001516126c3565b9150611b85565b8073ffffffffffffffffffffffffffffffffffffffff16866040015173ffffffffffffffffffffffffffffffffffffffff160361199b576040517f13496fda00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b606086015115611b5c578560600151603d60008282546119bb91906152a8565b90915550506040517f70a0823100000000000000000000000000000000000000000000000000000000815230600482015260009073ffffffffffffffffffffffffffffffffffffffff8316906370a0823190602401602060405180830381865afa158015611a2d573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611a519190615081565b9050611a86876040015188606001518473ffffffffffffffffffffffffffffffffffffffff166127219092919063ffffffff16565b6060870151611a9590826152a8565b6040517f70a0823100000000000000000000000000000000000000000000000000000000815230600482015273ffffffffffffffffffffffffffffffffffffffff8416906370a0823190602401602060405180830381865afa158015611aff573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611b239190615081565b14611b5a576040517f90b8ec1800000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b505b60a08601515115611b805761192b8660400151876080015160008960a001516126c3565b600191505b603280547fffffffffffffffffffffffff00000000000000000000000000000000000000001661dead17905560405185907fdb5c7652857aa163daadd670e116628fb42e869d8ac4251ef8971d9e5727df1b90611be790851515815260200190565b60405180910390a281158015611bfd5750326001145b15611c34576040517feeae4ed300000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b505050505050565b6000611c498260106152bf565b610ff2906152086152ef565b600080611c60611f19565b5090507fffffffffffffffffffffffff111111111111111111111111111111111111111273ffffffffffffffffffffffffffffffffffffffff821601611ca7574791505090565b5050603d5490565b600054610100900460ff1615808015611ccf5750600054600160ff909116105b80611ce95750303b158015611ce9575060005460ff166001145b611d75576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602e60248201527f496e697469616c697a61626c653a20636f6e747261637420697320616c72656160448201527f647920696e697469616c697a65640000000000000000000000000000000000006064820152608401610add565b600080547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff001660011790558015611dd357600080547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00ff166101001790555b603680547fffffffffffffffffffffffff000000000000000000000000000000000000000090811673ffffffffffffffffffffffffffffffffffffffff8781169190911790925560378054909116858316179055603580547fffffffffffffffffffffff0000000000000000000000000000000000000000ff166101008584160217905560325416611e8c57603280547fffffffffffffffffffffffff00000000000000000000000000000000000000001661dead1790555b611e9461277c565b8015611ef757600080547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00ff169055604051600181527f7f26b83ff96e1f2b6a682f133852f6798a09c465da95921460cefb38474024989060200160405180910390a15b50505050565b73ffffffffffffffffffffffffffffffffffffffff163b151590565b603754604080517f4397dfef0000000000000000000000000000000000000000000000000000000081528151600093849373ffffffffffffffffffffffffffffffffffffffff90911692634397dfef92600480830193928290030181865afa158015611f89573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611fad919061531b565b90939092509050565b818015611fd8575073ffffffffffffffffffffffffffffffffffffffff861615155b1561200f576040517f13496fda00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6120198151611c3c565b67ffffffffffffffff168367ffffffffffffffff161015612066576040517f4929b80800000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6201d4c0815111156120a4576040517f73052b0f00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b333281146120c5575033731111000000000000000000000000000000001111015b600086868686866040516020016120e0959493929190615243565b604051602081830303815290604052905060008873ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff167fb3813568d9991fc951961fcb4c784893574240a28925604d09fc577c55bb7c32846040516121509190614e99565b60405180910390a45050505050505050565b600154600090612198907801000000000000000000000000000000000000000000000000900467ffffffffffffffff16436152a8565b905060006121a461288f565b90506000816020015160ff16826000015163ffffffff166121c59190615384565b905082156122fc576001546000906121fc908390700100000000000000000000000000000000900467ffffffffffffffff166153ec565b90506000836040015160ff16836122139190615460565b6001546122339084906fffffffffffffffffffffffffffffffff16615460565b61223d9190615384565b60015490915060009061228e906122679084906fffffffffffffffffffffffffffffffff1661551c565b866060015163ffffffff168760a001516fffffffffffffffffffffffffffffffff166129cc565b905060018611156122bd576122ba61226782876040015160ff1660018a6122b591906152a8565b6129eb565b90505b6fffffffffffffffffffffffffffffffff16780100000000000000000000000000000000000000000000000067ffffffffffffffff4316021760015550505b6001805486919060109061232f908490700100000000000000000000000000000000900467ffffffffffffffff166152ef565b92506101000a81548167ffffffffffffffff021916908367ffffffffffffffff160217905550816000015163ffffffff16600160000160109054906101000a900467ffffffffffffffff1667ffffffffffffffff1613156123bc576040517f77ebef4d00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6001546000906123e8906fffffffffffffffffffffffffffffffff1667ffffffffffffffff8816615590565b905060006123fa48633b9aca00612a40565b61240490836155cd565b905060005a61241390886152a8565b90508082111561085b5761085b61242a82846152a8565b612a57565b60405173ffffffffffffffffffffffffffffffffffffffff80851660248301528316604482015260648101829052611ef79085907f23b872dd00000000000000000000000000000000000000000000000000000000906084015b604080517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe08184030181529190526020810180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff167fffffffff0000000000000000000000000000000000000000000000000000000090931692909217909152612a80565b6000816000015182602001518360400151846060015160405160200161254a949392919093845260208401929092526040830152606082015260800190565b604051602081830303815290604052805190602001209050919050565b80516020808301516040808501516060860151608087015160a0880151935160009761254a9790969591016155e1565b6000806125a386612b8c565b90506125b181868686612bbe565b9695505050505050565b603654604080517ff4daa291000000000000000000000000000000000000000000000000000000008152905160009273ffffffffffffffffffffffffffffffffffffffff169163f4daa2919160048083019260209291908290030181865afa15801561262b573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061264f9190615081565b6126599083615069565b421192915050565b6001805463ffffffff8316919060109061269a908490700100000000000000000000000000000000900467ffffffffffffffff166152ef565b92506101000a81548167ffffffffffffffff021916908367ffffffffffffffff16021790555050565b60008060006126d3866000612bee565b905080612709576308c379a06000526020805278185361666543616c6c3a204e6f7420656e6f756768206761736058526064601cfd5b600080855160208701888b5af1979650505050505050565b60405173ffffffffffffffffffffffffffffffffffffffff83166024820152604481018290526127779084907fa9059cbb0000000000000000000000000000000000000000000000000000000090606401612489565b505050565b600054610100900460ff16612813576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602b60248201527f496e697469616c697a61626c653a20636f6e7472616374206973206e6f74206960448201527f6e697469616c697a696e670000000000000000000000000000000000000000006064820152608401610add565b6001547801000000000000000000000000000000000000000000000000900467ffffffffffffffff166000036111b85760408051606081018252633b9aca00808252600060208301524367ffffffffffffffff169190920181905278010000000000000000000000000000000000000000000000000217600155565b6040805160c081018252600080825260208201819052918101829052606081018290526080810182905260a0810191909152603754604080517fcc731b02000000000000000000000000000000000000000000000000000000008152905160009273ffffffffffffffffffffffffffffffffffffffff169163cc731b029160048083019260c09291908290030181865afa158015612931573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190612955919061564c565b90506040518060c00160405280826000015163ffffffff168152602001826020015160ff168152602001826040015160ff168152602001826060015163ffffffff168152602001826080015163ffffffff1681526020018260a001516fffffffffffffffffffffffffffffffff1681525091505090565b60006129e16129db8585612c0c565b83612c1c565b90505b9392505050565b6000670de0b6b3a7640000612a2c612a038583615384565b612a1590670de0b6b3a76400006153ec565b612a2785670de0b6b3a7640000615460565b612c2b565b612a369086615460565b6129e19190615384565b600081831015612a5057816129e4565b5090919050565b6000805a90505b825a612a6a90836152a8565b101561277757612a79826156ef565b9150612a5e565b6000612ae2826040518060400160405280602081526020017f5361666545524332303a206c6f772d6c6576656c2063616c6c206661696c65648152508573ffffffffffffffffffffffffffffffffffffffff16612c5c9092919063ffffffff16565b8051909150156127775780806020019051810190612b009190615226565b612777576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602a60248201527f5361666545524332303a204552433230206f7065726174696f6e20646964206e60448201527f6f742073756363656564000000000000000000000000000000000000000000006064820152608401610add565b60608180519060200120604051602001612ba891815260200190565b6040516020818303038152906040529050919050565b6000612be584612bcf878686612c6b565b8051602091820120825192909101919091201490565b95945050505050565b600080603f83619c4001026040850201603f5a021015949350505050565b600081831215612a5057816129e4565b6000818312612a5057816129e4565b60006129e4670de0b6b3a764000083612c43866136e9565b612c4d9190615460565b612c579190615384565b61392d565b60606129e18484600085613b6c565b60606000845111612cd8576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601560248201527f4d65726b6c65547269653a20656d707479206b657900000000000000000000006044820152606401610add565b6000612ce384613d02565b90506000612cf086613dee565b9050600084604051602001612d0791815260200190565b60405160208183030381529060405290506000805b8451811015613660576000858281518110612d3957612d39615727565b602002602001015190508451831115612dd4576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602e60248201527f4d65726b6c65547269653a206b657920696e646578206578636565647320746f60448201527f74616c206b6579206c656e6774680000000000000000000000000000000000006064820152608401610add565b82600003612e8d5780518051602091820120604051612e2292612dfc92910190815260200190565b604051602081830303815290604052858051602091820120825192909101919091201490565b612e88576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601d60248201527f4d65726b6c65547269653a20696e76616c696420726f6f7420686173680000006044820152606401610add565b612fe4565b805151602011612f435780518051602091820120604051612eb792612dfc92910190815260200190565b612e88576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602760248201527f4d65726b6c65547269653a20696e76616c6964206c6172676520696e7465726e60448201527f616c2068617368000000000000000000000000000000000000000000000000006064820152608401610add565b805184516020808701919091208251919092012014612fe4576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602660248201527f4d65726b6c65547269653a20696e76616c696420696e7465726e616c206e6f6460448201527f65206861736800000000000000000000000000000000000000000000000000006064820152608401610add565b612ff060106001615069565b816020015151036131cc57845183036131645761302a816020015160108151811061301d5761301d615727565b6020026020010151613e51565b965060008751116130bd576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152603b60248201527f4d65726b6c65547269653a2076616c7565206c656e677468206d75737420626560448201527f2067726561746572207468616e207a65726f20286272616e63682900000000006064820152608401610add565b600186516130cb91906152a8565b8214613159576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152603a60248201527f4d65726b6c65547269653a2076616c7565206e6f6465206d757374206265206c60448201527f617374206e6f646520696e2070726f6f6620286272616e6368290000000000006064820152608401610add565b5050505050506129e4565b600085848151811061317857613178615727565b602001015160f81c60f81b60f81c9050600082602001518260ff16815181106131a3576131a3615727565b602002602001015190506131b681613f05565b95506131c3600186615069565b9450505061364d565b6002816020015151036135c55760006131e482613f2a565b90506000816000815181106131fb576131fb615727565b016020015160f81c90506000613212600283615756565b61321d906002615778565b9050600061322e848360ff16613f4e565b9050600061323c8a89613f4e565b9050600061324a8383613f84565b9050808351146132dc576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152603a60248201527f4d65726b6c65547269653a20706174682072656d61696e646572206d7573742060448201527f736861726520616c6c206e6962626c65732077697468206b65790000000000006064820152608401610add565b60ff8516600214806132f1575060ff85166003145b156134e05780825114613386576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152603d60248201527f4d65726b6c65547269653a206b65792072656d61696e646572206d757374206260448201527f65206964656e746963616c20746f20706174682072656d61696e6465720000006064820152608401610add565b6133a0876020015160018151811061301d5761301d615727565b9c5060008d5111613433576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152603960248201527f4d65726b6c65547269653a2076616c7565206c656e677468206d75737420626560448201527f2067726561746572207468616e207a65726f20286c65616629000000000000006064820152608401610add565b60018c5161344191906152a8565b88146134cf576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152603860248201527f4d65726b6c65547269653a2076616c7565206e6f6465206d757374206265206c60448201527f617374206e6f646520696e2070726f6f6620286c6561662900000000000000006064820152608401610add565b5050505050505050505050506129e4565b60ff851615806134f3575060ff85166001145b156135325761351f876020015160018151811061351257613512615727565b6020026020010151613f05565b995061352b818a615069565b98506135ba565b6040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152603260248201527f4d65726b6c65547269653a2072656365697665642061206e6f6465207769746860448201527f20616e20756e6b6e6f776e2070726566697800000000000000000000000000006064820152608401610add565b50505050505061364d565b6040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602860248201527f4d65726b6c65547269653a20726563656976656420616e20756e70617273656160448201527f626c65206e6f64650000000000000000000000000000000000000000000000006064820152608401610add565b5080613658816156ef565b915050612d1c565b506040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602560248201527f4d65726b6c65547269653a2072616e206f7574206f662070726f6f6620656c6560448201527f6d656e74730000000000000000000000000000000000000000000000000000006064820152608401610add565b6000808213613754576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152600960248201527f554e444546494e454400000000000000000000000000000000000000000000006044820152606401610add565b6000606061376184614038565b03609f8181039490941b90931c6c465772b2bbbb5f824b15207a3081018102606090811d6d0388eaa27412d5aca026815d636e018202811d6d0df99ac502031bf953eff472fdcc018202811d6d13cdffb29d51d99322bdff5f2211018202811d6d0a0f742023def783a307a986912e018202811d6d01920d8043ca89b5239253284e42018202811d6c0b7a86d7375468fac667a0a527016c29508e458543d8aa4df2abee7883018302821d6d0139601a2efabe717e604cbb4894018302821d6d02247f7a7b6594320649aa03aba1018302821d7fffffffffffffffffffffffffffffffffffffff73c0c716a594e00d54e3c4cbc9018302821d7ffffffffffffffffffffffffffffffffffffffdc7b88c420e53a9890533129f6f01830290911d7fffffffffffffffffffffffffffffffffffffff465fda27eb4d63ded474e5f832019091027ffffffffffffffff5f6af8f7b3396644f18e157960000000000000000000000000105711340daa0d5f769dba1915cef59f0815a5506027d0267a36c0c95b3975ab3ee5b203a7614a3f75373f047d803ae7b6687f2b393909302929092017d57115e47018c7177eebf7cd370a3356a1b7863008a5ae8028c72b88642840160ae1d92915050565b60007ffffffffffffffffffffffffffffffffffffffffffffffffdb731c958f34d94c1821361395e57506000919050565b680755bf798b4a1bf1e582126139d0576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152600c60248201527f4558505f4f564552464c4f5700000000000000000000000000000000000000006044820152606401610add565b6503782dace9d9604e83901b059150600060606bb17217f7d1cf79abc9e3b39884821b056b80000000000000000000000001901d6bb17217f7d1cf79abc9e3b39881029093037fffffffffffffffffffffffffffffffffffffffdbf3ccf1604d263450f02a550481018102606090811d6d0277594991cfc85f6e2461837cd9018202811d7fffffffffffffffffffffffffffffffffffffe5adedaa1cb095af9e4da10e363c018202811d6db1bbb201f443cf962f1a1d3db4a5018202811d7ffffffffffffffffffffffffffffffffffffd38dc772608b0ae56cce01296c0eb018202811d6e05180bb14799ab47a8a8cb2a527d57016d02d16720577bd19bf614176fe9ea6c10fe68e7fd37d0007b713f765084018402831d9081019084017ffffffffffffffffffffffffffffffffffffffe2c69812cf03b0763fd454a8f7e010290911d6e0587f503bb6ea29d25fcb7401964500190910279d835ebba824c98fb31b83b2ca45c000000000000000000000000010574029d9dc38563c32e5c2f6dc192ee70ef65f9978af30260c3939093039290921c92915050565b606082471015613bfe576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602660248201527f416464726573733a20696e73756666696369656e742062616c616e636520666f60448201527f722063616c6c00000000000000000000000000000000000000000000000000006064820152608401610add565b73ffffffffffffffffffffffffffffffffffffffff85163b613c7c576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601d60248201527f416464726573733a2063616c6c20746f206e6f6e2d636f6e74726163740000006044820152606401610add565b6000808673ffffffffffffffffffffffffffffffffffffffff168587604051613ca5919061579b565b60006040518083038185875af1925050503d8060008114613ce2576040519150601f19603f3d011682016040523d82523d6000602084013e613ce7565b606091505b5091509150613cf782828661410e565b979650505050505050565b80516060908067ffffffffffffffff811115613d2057613d20614b07565b604051908082528060200260200182016040528015613d6557816020015b6040805180820190915260608082526020820152815260200190600190039081613d3e5790505b50915060005b81811015613de7576040518060400160405280858381518110613d9057613d90615727565b60200260200101518152602001613dbf868481518110613db257613db2615727565b6020026020010151614161565b815250838281518110613dd457613dd4615727565b6020908102919091010152600101613d6b565b5050919050565b606080604051905082518060011b603f8101601f1916830160405280835250602084016020830160005b83811015613e46578060011b82018184015160001a8060041c8253600f811660018301535050600101613e18565b509295945050505050565b60606000806000613e6185614174565b919450925090506000816001811115613e7c57613e7c6157b7565b14613eb3576040517f1ff9b2e400000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b613ebd8284615069565b855114613ef6576040517f5c5537b800000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b612be585602001518484614612565b60606020826000015110613f2157613f1c82613e51565b610ff2565b610ff2826146a6565b6060610ff2613f49836020015160008151811061301d5761301d615727565b613dee565b606082518210613f6d5750604080516020810190915260008152610ff2565b6129e48383848651613f7f91906152a8565b6146bc565b6000808251845110613f97578251613f9a565b83515b90505b80821080156140215750828281518110613fb957613fb9615727565b602001015160f81c60f81b7effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916848381518110613ff857613ff8615727565b01602001517fff0000000000000000000000000000000000000000000000000000000000000016145b1561403157816001019150613f9d565b5092915050565b60008082116140a3576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152600960248201527f554e444546494e454400000000000000000000000000000000000000000000006044820152606401610add565b5060016fffffffffffffffffffffffffffffffff821160071b82811c67ffffffffffffffff1060061b1782811c63ffffffff1060051b1782811c61ffff1060041b1782811c60ff10600390811b90911783811c600f1060021b1783811c909110821b1791821c111790565b6060831561411d5750816129e4565b82511561412d5782518084602001fd5b816040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610add9190614e99565b6060610ff261416f83614894565b614901565b600080600083600001516000036141b7576040517f5ab458fb00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6020840151805160001a607f81116141dc57600060016000945094509450505061460b565b60b781116142f25760006141f16080836152a8565b905080876000015111614230576040517f66c9448500000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6001838101517fff000000000000000000000000000000000000000000000000000000000000001690821480156142a857507f80000000000000000000000000000000000000000000000000000000000000007fff000000000000000000000000000000000000000000000000000000000000008216105b156142df576040517fbabb01dd00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b506001955093506000925061460b915050565b60bf811161445057600061430760b7836152a8565b905080876000015111614346576040517f66c9448500000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b60018301517fff000000000000000000000000000000000000000000000000000000000000001660008190036143a8576040517fbabb01dd00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b600184015160088302610100031c603781116143f0576040517fbabb01dd00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6143fa8184615069565b895111614433576040517f66c9448500000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b61443e836001615069565b975095506000945061460b9350505050565b60f781116144b557600061446560c0836152a8565b9050808760000151116144a4576040517f66c9448500000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b60019550935084925061460b915050565b60006144c260f7836152a8565b905080876000015111614501576040517f66c9448500000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b60018301517fff00000000000000000000000000000000000000000000000000000000000000166000819003614563576040517fbabb01dd00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b600184015160088302610100031c603781116145ab576040517fbabb01dd00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6145b58184615069565b8951116145ee576040517f66c9448500000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6145f9836001615069565b975095506001945061460b9350505050565b9193909250565b60608167ffffffffffffffff81111561462d5761462d614b07565b6040519080825280601f01601f191660200182016040528015614657576020820181803683370190505b50905081156129e457600061466c8486615069565b90506020820160005b8481101561468d578281015182820152602001614675565b8481111561469c576000858301525b5050509392505050565b6060610ff2826020015160008460000151614612565b60608182601f01101561472b576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152600e60248201527f736c6963655f6f766572666c6f770000000000000000000000000000000000006044820152606401610add565b828284011015614797576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152600e60248201527f736c6963655f6f766572666c6f770000000000000000000000000000000000006044820152606401610add565b81830184511015614804576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601160248201527f736c6963655f6f75744f66426f756e64730000000000000000000000000000006044820152606401610add565b606082158015614823576040519150600082526020820160405261488b565b6040519150601f8416801560200281840101858101878315602002848b0101015b8183101561485c578051835260209283019201614844565b5050858452601f017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe016604052505b50949350505050565b604080518082019091526000808252602082015281516000036148e3576040517f5ab458fb00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b50604080518082019091528151815260209182019181019190915290565b6060600080600061491185614174565b91945092509050600181600181111561492c5761492c6157b7565b14614963576040517f4b9c6abe00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b845161496f8385615069565b146149a6576040517f5c5537b800000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b604080516020808252610420820190925290816020015b60408051808201909152600080825260208201528152602001906001900390816149bd5790505093506000835b8651811015614aab57600080614a306040518060400160405280858c60000151614a1491906152a8565b8152602001858c60200151614a299190615069565b9052614174565b509150915060405180604001604052808383614a4c9190615069565b8152602001848b60200151614a619190615069565b815250888581518110614a7657614a76615727565b6020908102919091010152614a8c600185615069565b9350614a988183615069565b614aa29084615069565b925050506149ea565b50845250919392505050565b73ffffffffffffffffffffffffffffffffffffffff81168114614ad957600080fd5b50565b803567ffffffffffffffff81168114614af457600080fd5b919050565b8015158114614ad957600080fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b604051601f82017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe016810167ffffffffffffffff81118282101715614b7d57614b7d614b07565b604052919050565b600082601f830112614b9657600080fd5b813567ffffffffffffffff811115614bb057614bb0614b07565b614be160207fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0601f84011601614b36565b818152846020838601011115614bf657600080fd5b816020850160208301376000918101602001919091529392505050565b60008060008060008060c08789031215614c2c57600080fd5b8635614c3781614ab7565b95506020870135945060408701359350614c5360608801614adc565b92506080870135614c6381614af9565b915060a087013567ffffffffffffffff811115614c7f57600080fd5b614c8b89828a01614b85565b9150509295509295509295565b600060c08284031215614caa57600080fd5b60405160c0810167ffffffffffffffff8282108183111715614cce57614cce614b07565b816040528293508435835260208501359150614ce982614ab7565b81602084015260408501359150614cff82614ab7565b816040840152606085013560608401526080850135608084015260a0850135915080821115614d2d57600080fd5b50614d3a85828601614b85565b60a0830152505092915050565b600080600080600085870360e0811215614d6057600080fd5b863567ffffffffffffffff80821115614d7857600080fd5b614d848a838b01614c98565b97506020890135965060807fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc084011215614dbd57600080fd5b60408901955060c0890135925080831115614dd757600080fd5b828901925089601f840112614deb57600080fd5b8235915080821115614dfc57600080fd5b508860208260051b8401011115614e1257600080fd5b959894975092955050506020019190565b60005b83811015614e3e578181015183820152602001614e26565b83811115611ef75750506000910152565b60008151808452614e67816020860160208601614e23565b601f017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0169290920160200192915050565b6020815260006129e46020830184614e4f565b600060208284031215614ebe57600080fd5b5035919050565b60ff81168114614ad957600080fd5b60008060008060808587031215614eea57600080fd5b8435614ef581614ab7565b93506020850135614f0581614ec5565b93969395505050506040820135916060013590565b600060208284031215614f2c57600080fd5b813567ffffffffffffffff811115614f4357600080fd5b614f4f84828501614c98565b949350505050565b600060208284031215614f6957600080fd5b6129e482614adc565b600080600060608486031215614f8757600080fd5b8335614f9281614ab7565b92506020840135614fa281614ab7565b91506040840135614fb281614ab7565b809150509250925092565b600080600080600060a08688031215614fd557600080fd5b8535614fe081614ab7565b945060208601359350614ff560408701614adc565b9250606086013561500581614af9565b9150608086013567ffffffffffffffff81111561502157600080fd5b61502d88828901614b85565b9150509295509295909350565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b6000821982111561507c5761507c61503a565b500190565b60006020828403121561509357600080fd5b5051919050565b6000602082840312156150ac57600080fd5b81516129e481614ab7565b80516fffffffffffffffffffffffffffffffff81168114614af457600080fd5b6000606082840312156150e957600080fd5b6040516060810181811067ffffffffffffffff8211171561510c5761510c614b07565b6040528251815261511f602084016150b7565b6020820152615130604084016150b7565b60408201529392505050565b60006080828403121561514e57600080fd5b6040516080810181811067ffffffffffffffff8211171561517157615171614b07565b8060405250823581526020830135602082015260408301356040820152606083013560608201528091505092915050565b600067ffffffffffffffff808411156151bd576151bd614b07565b8360051b60206151ce818301614b36565b8681529185019181810190368411156151e657600080fd5b865b8481101561521a578035868111156152005760008081fd5b61520c36828b01614b85565b8452509183019183016151e8565b50979650505050505050565b60006020828403121561523857600080fd5b81516129e481614af9565b8581528460208201527fffffffffffffffff0000000000000000000000000000000000000000000000008460c01b16604082015282151560f81b604882015260008251615297816049850160208701614e23565b919091016049019695505050505050565b6000828210156152ba576152ba61503a565b500390565b600067ffffffffffffffff808316818516818304811182151516156152e6576152e661503a565b02949350505050565b600067ffffffffffffffff8083168185168083038211156153125761531261503a565b01949350505050565b6000806040838503121561532e57600080fd5b825161533981614ab7565b602084015190925061534a81614ec5565b809150509250929050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601260045260246000fd5b60008261539357615393615355565b7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff83147f8000000000000000000000000000000000000000000000000000000000000000831416156153e7576153e761503a565b500590565b6000808312837f8000000000000000000000000000000000000000000000000000000000000000018312811516156154265761542661503a565b837f7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff01831381161561545a5761545a61503a565b50500390565b60007f7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff6000841360008413858304851182821616156154a1576154a161503a565b7f800000000000000000000000000000000000000000000000000000000000000060008712868205881281841616156154dc576154dc61503a565b600087129250878205871284841616156154f8576154f861503a565b8785058712818416161561550e5761550e61503a565b505050929093029392505050565b6000808212827f7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff038413811516156155565761555661503a565b827f800000000000000000000000000000000000000000000000000000000000000003841281161561558a5761558a61503a565b50500190565b6000817fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff04831182151516156155c8576155c861503a565b500290565b6000826155dc576155dc615355565b500490565b868152600073ffffffffffffffffffffffffffffffffffffffff808816602084015280871660408401525084606083015283608083015260c060a083015261562c60c0830184614e4f565b98975050505050505050565b805163ffffffff81168114614af457600080fd5b600060c0828403121561565e57600080fd5b60405160c0810181811067ffffffffffffffff8211171561568157615681614b07565b60405261568d83615638565b8152602083015161569d81614ec5565b602082015260408301516156b081614ec5565b60408201526156c160608401615638565b60608201526156d260808401615638565b60808201526156e360a084016150b7565b60a08201529392505050565b60007fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff82036157205761572061503a565b5060010190565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b600060ff83168061576957615769615355565b8060ff84160691505092915050565b600060ff821660ff8416808210156157925761579261503a565b90039392505050565b600082516157ad818460208701614e23565b9190910192915050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602160045260246000fdfea164736f6c634300080f000a"; + bytes internal constant l2OutputOracleCode = + hex"60806040526004361061018a5760003560e01c806389c44cbb116100d6578063ce5db8d61161007f578063dcec334811610059578063dcec33481461049b578063e1a41bcf146104b0578063f4daa291146104c657600080fd5b8063ce5db8d614610445578063cf8e5cf01461045b578063d1de856c1461047b57600080fd5b8063a25ae557116100b0578063a25ae55714610391578063a8e4fb90146103ed578063bffa7f0f1461041a57600080fd5b806389c44cbb1461034857806393991af3146103685780639aaab6481461037e57600080fd5b806369f16eec1161013857806370872aa51161011257806370872aa5146102fc5780637f00642014610312578063887862721461033257600080fd5b806369f16eec146102a75780636abcf563146102bc5780636b4d98dd146102d157600080fd5b8063529933df11610169578063529933df146101ea578063534db0e2146101ff57806354fd4d501461025157600080fd5b80622134cc1461018f5780631c89c97d146101b35780634599c788146101d5575b600080fd5b34801561019b57600080fd5b506005545b6040519081526020015b60405180910390f35b3480156101bf57600080fd5b506101d36101ce3660046113a2565b6104db565b005b3480156101e157600080fd5b506101a06108b6565b3480156101f657600080fd5b506004546101a0565b34801561020b57600080fd5b5060065461022c9073ffffffffffffffffffffffffffffffffffffffff1681565b60405173ffffffffffffffffffffffffffffffffffffffff90911681526020016101aa565b34801561025d57600080fd5b5061029a6040518060400160405280600c81526020017f312e382e312d626574612e31000000000000000000000000000000000000000081525081565b6040516101aa9190611405565b3480156102b357600080fd5b506101a0610929565b3480156102c857600080fd5b506003546101a0565b3480156102dd57600080fd5b5060065473ffffffffffffffffffffffffffffffffffffffff1661022c565b34801561030857600080fd5b506101a060015481565b34801561031e57600080fd5b506101a061032d366004611478565b61093b565b34801561033e57600080fd5b506101a060025481565b34801561035457600080fd5b506101d3610363366004611478565b610b4f565b34801561037457600080fd5b506101a060055481565b6101d361038c366004611491565b610de9565b34801561039d57600080fd5b506103b16103ac366004611478565b61124a565b60408051825181526020808401516fffffffffffffffffffffffffffffffff9081169183019190915292820151909216908201526060016101aa565b3480156103f957600080fd5b5060075461022c9073ffffffffffffffffffffffffffffffffffffffff1681565b34801561042657600080fd5b5060075473ffffffffffffffffffffffffffffffffffffffff1661022c565b34801561045157600080fd5b506101a060085481565b34801561046757600080fd5b506103b1610476366004611478565b6112de565b34801561048757600080fd5b506101a0610496366004611478565b611316565b3480156104a757600080fd5b506101a0611346565b3480156104bc57600080fd5b506101a060045481565b3480156104d257600080fd5b506008546101a0565b600054610100900460ff16158080156104fb5750600054600160ff909116105b806105155750303b158015610515575060005460ff166001145b6105a6576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602e60248201527f496e697469616c697a61626c653a20636f6e747261637420697320616c72656160448201527f647920696e697469616c697a656400000000000000000000000000000000000060648201526084015b60405180910390fd5b600080547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00166001179055801561060457600080547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00ff166101001790555b60008811610694576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152603a60248201527f4c324f75747075744f7261636c653a207375626d697373696f6e20696e74657260448201527f76616c206d7573742062652067726561746572207468616e2030000000000000606482015260840161059d565b60008711610724576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152603460248201527f4c324f75747075744f7261636c653a204c3220626c6f636b2074696d65206d7560448201527f73742062652067726561746572207468616e2030000000000000000000000000606482015260840161059d565b428511156107db576040517f08c379a0000000000000000000000000000000000000000000000000000000008152602060048201526044602482018190527f4c324f75747075744f7261636c653a207374617274696e67204c322074696d65908201527f7374616d70206d757374206265206c657373207468616e2063757272656e742060648201527f74696d6500000000000000000000000000000000000000000000000000000000608482015260a40161059d565b60048890556005879055600186905560028590556007805473ffffffffffffffffffffffffffffffffffffffff8087167fffffffffffffffffffffffff0000000000000000000000000000000000000000928316179092556006805492861692909116919091179055600882905580156108ac57600080547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00ff169055604051600181527f7f26b83ff96e1f2b6a682f133852f6798a09c465da95921460cefb38474024989060200160405180910390a15b5050505050505050565b6003546000901561092057600380546108d1906001906114f2565b815481106108e1576108e1611509565b600091825260209091206002909102016001015470010000000000000000000000000000000090046fffffffffffffffffffffffffffffffff16919050565b6001545b905090565b600354600090610924906001906114f2565b60006109456108b6565b8211156109fa576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152604860248201527f4c324f75747075744f7261636c653a2063616e6e6f7420676574206f7574707560448201527f7420666f72206120626c6f636b207468617420686173206e6f74206265656e2060648201527f70726f706f736564000000000000000000000000000000000000000000000000608482015260a40161059d565b600354610aaf576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152604660248201527f4c324f75747075744f7261636c653a2063616e6e6f7420676574206f7574707560448201527f74206173206e6f206f7574707574732068617665206265656e2070726f706f7360648201527f6564207965740000000000000000000000000000000000000000000000000000608482015260a40161059d565b6003546000905b80821015610b485760006002610acc8385611538565b610ad69190611550565b90508460038281548110610aec57610aec611509565b600091825260209091206002909102016001015470010000000000000000000000000000000090046fffffffffffffffffffffffffffffffff161015610b3e57610b37816001611538565b9250610b42565b8091505b50610ab6565b5092915050565b60065473ffffffffffffffffffffffffffffffffffffffff163314610bf6576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152603e60248201527f4c324f75747075744f7261636c653a206f6e6c7920746865206368616c6c656e60448201527f67657220616464726573732063616e2064656c657465206f7574707574730000606482015260840161059d565b6003548110610cad576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152604360248201527f4c324f75747075744f7261636c653a2063616e6e6f742064656c657465206f7560448201527f747075747320616674657220746865206c6174657374206f757470757420696e60648201527f6465780000000000000000000000000000000000000000000000000000000000608482015260a40161059d565b60085460038281548110610cc357610cc3611509565b6000918252602090912060016002909202010154610cf3906fffffffffffffffffffffffffffffffff16426114f2565b10610da6576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152604660248201527f4c324f75747075744f7261636c653a2063616e6e6f742064656c657465206f7560448201527f74707574732074686174206861766520616c7265616479206265656e2066696e60648201527f616c697a65640000000000000000000000000000000000000000000000000000608482015260a40161059d565b6000610db160035490565b90508160035581817f4ee37ac2c786ec85e87592d3c5c8a1dd66f8496dda3f125d9ea8ca5f657629b660405160405180910390a35050565b60075473ffffffffffffffffffffffffffffffffffffffff163314610eb6576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152604160248201527f4c324f75747075744f7261636c653a206f6e6c79207468652070726f706f736560448201527f7220616464726573732063616e2070726f706f7365206e6577206f757470757460648201527f7300000000000000000000000000000000000000000000000000000000000000608482015260a40161059d565b610ebe611346565b8314610f72576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152604860248201527f4c324f75747075744f7261636c653a20626c6f636b206e756d626572206d757360448201527f7420626520657175616c20746f206e65787420657870656374656420626c6f6360648201527f6b206e756d626572000000000000000000000000000000000000000000000000608482015260a40161059d565b42610f7c84611316565b10611009576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152603660248201527f4c324f75747075744f7261636c653a2063616e6e6f742070726f706f7365204c60448201527f32206f757470757420696e207468652066757475726500000000000000000000606482015260840161059d565b83611096576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152603a60248201527f4c324f75747075744f7261636c653a204c32206f75747075742070726f706f7360448201527f616c2063616e6e6f7420626520746865207a65726f2068617368000000000000606482015260840161059d565b81156111525781814014611152576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152604960248201527f4c324f75747075744f7261636c653a20626c6f636b206861736820646f65732060448201527f6e6f74206d61746368207468652068617368206174207468652065787065637460648201527f6564206865696768740000000000000000000000000000000000000000000000608482015260a40161059d565b8261115c60035490565b857fa7aaf2512769da4e444e3de247be2564225c2e7a8f74cfe528e46e17d24868e24260405161118e91815260200190565b60405180910390a45050604080516060810182529283526fffffffffffffffffffffffffffffffff4281166020850190815292811691840191825260038054600181018255600091909152935160029094027fc2575a0e9e593c00f959f8c92f12db2869c3395a3b0502d05e2516446f71f85b810194909455915190518216700100000000000000000000000000000000029116177fc2575a0e9e593c00f959f8c92f12db2869c3395a3b0502d05e2516446f71f85c90910155565b60408051606081018252600080825260208201819052918101919091526003828154811061127a5761127a611509565b600091825260209182902060408051606081018252600290930290910180548352600101546fffffffffffffffffffffffffffffffff8082169484019490945270010000000000000000000000000000000090049092169181019190915292915050565b604080516060810182526000808252602082018190529181019190915260036113068361093b565b8154811061127a5761127a611509565b60006005546001548361132991906114f2565b611333919061158b565b6002546113409190611538565b92915050565b60006004546113536108b6565b6109249190611538565b73ffffffffffffffffffffffffffffffffffffffff163b151590565b803573ffffffffffffffffffffffffffffffffffffffff8116811461139d57600080fd5b919050565b600080600080600080600060e0888a0312156113bd57600080fd5b873596506020880135955060408801359450606088013593506113e260808901611379565b92506113f060a08901611379565b915060c0880135905092959891949750929550565b600060208083528351808285015260005b8181101561143257858101830151858201604001528201611416565b81811115611444576000604083870101525b50601f017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe016929092016040019392505050565b60006020828403121561148a57600080fd5b5035919050565b600080600080608085870312156114a757600080fd5b5050823594602084013594506040840135936060013592509050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b600082821015611504576115046114c3565b500390565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b6000821982111561154b5761154b6114c3565b500190565b600082611586577f4e487b7100000000000000000000000000000000000000000000000000000000600052601260045260246000fd5b500490565b6000817fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff04831182151516156115c3576115c36114c3565b50029056fea164736f6c634300080f000a"; + bytes internal constant optimismPortal2Code = + hex"6080604052600436106101d15760003560e01c80637fc48504116100f7578063a35d99df11610095578063bf653a5c11610064578063bf653a5c14610697578063cff0ab96146106ca578063e9e05c421461076b578063f2b4e6171461077e57600080fd5b8063a35d99df1461059b578063a3860f48146105bb578063b69ef8a8146105db578063bb2c727e146105f057600080fd5b80638e819e54116100d15780638e819e54146104eb578063952b27971461050b5780639bf62d821461053e578063a14238e71461056b57600080fd5b80637fc48504146104ab5780638b4c40b0146101f65780638c3152e9146104cb57600080fd5b80634870496f1161016f5780635c975abb1161013e5780635c975abb1461043657806371c1566e1461044b57806371cfaa3f1461046b5780637d6be8dc1461048b57600080fd5b80634870496f1461034d5780634fd0434c1461036d578063513747ab146103af57806354fd4d50146103ea57600080fd5b80633c9f397c116101ab5780633c9f397c146102a657806343ca1c50146102d8578063452a9320146102f857806345884d321461030d57600080fd5b8063149f2f22146101fd57806333d7e2bd1461021d57806335e80ab31461027457600080fd5b366101f8576101f63334620186a06000604051806020016040528060008152506107ab565b005b600080fd5b34801561020957600080fd5b506101f6610218366004614feb565b610850565b34801561022957600080fd5b5060375461024a9073ffffffffffffffffffffffffffffffffffffffff1681565b60405173ffffffffffffffffffffffffffffffffffffffff90911681526020015b60405180910390f35b34801561028057600080fd5b5060355461024a90610100900473ffffffffffffffffffffffffffffffffffffffff1681565b3480156102b257600080fd5b50603b546102c39063ffffffff1681565b60405163ffffffff909116815260200161026b565b3480156102e457600080fd5b506101f66102f3366004615121565b610a91565b34801561030457600080fd5b5061024a610f31565b34801561031957600080fd5b5061033d610328366004615173565b603a6020526000908152604090205460ff1681565b604051901515815260200161026b565b34801561035957600080fd5b506101f6610368366004615190565b610fc9565b34801561037957600080fd5b50603b5461039690640100000000900467ffffffffffffffff1681565b60405167ffffffffffffffff909116815260200161026b565b3480156103bb57600080fd5b506103dc6103ca36600461526c565b6000908152603c602052604090205490565b60405190815260200161026b565b3480156103f657600080fd5b50604080518082018252600d81527f332e31312e302d626574612e33000000000000000000000000000000000000006020820152905161026b91906152fb565b34801561044257600080fd5b5061033d611531565b34801561045757600080fd5b506101f661046636600461530e565b6115c4565b34801561047757600080fd5b506101f6610486366004615342565b611c7f565b34801561049757600080fd5b506101f66104a6366004615173565b611e3f565b3480156104b757600080fd5b506101f66104c636600461539a565b611f22565b3480156104d757600080fd5b506101f66104e63660046153b7565b61200e565b3480156104f757600080fd5b506101f66105063660046153f4565b61205a565b34801561051757600080fd5b507f00000000000000000000000000000000000000000000000000000000000000066103dc565b34801561054a57600080fd5b5060325461024a9073ffffffffffffffffffffffffffffffffffffffff1681565b34801561057757600080fd5b5061033d61058636600461526c565b60336020526000908152604090205460ff1681565b3480156105a757600080fd5b506103966105b6366004615450565b61230f565b3480156105c757600080fd5b5061024a6105d636600461546d565b61232e565b3480156105e757600080fd5b506103dc612373565b3480156105fc57600080fd5b5061066261060b36600461530e565b603960209081526000928352604080842090915290825290205473ffffffffffffffffffffffffffffffffffffffff81169074010000000000000000000000000000000000000000900467ffffffffffffffff1682565b6040805173ffffffffffffffffffffffffffffffffffffffff909316835267ffffffffffffffff90911660208301520161026b565b3480156106a357600080fd5b507f000000000000000000000000000000000000000000000000000000000000000c6103dc565b3480156106d657600080fd5b50600154610732906fffffffffffffffffffffffffffffffff81169067ffffffffffffffff7001000000000000000000000000000000008204811691780100000000000000000000000000000000000000000000000090041683565b604080516fffffffffffffffffffffffffffffffff909416845267ffffffffffffffff928316602085015291169082015260600161026b565b6101f661077936600461548f565b6107ab565b34801561078a57600080fd5b5060385461024a9073ffffffffffffffffffffffffffffffffffffffff1681565b8260005a905060006107bb6123e9565b50905073ffffffffffffffffffffffffffffffffffffffff811673eeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeee148015906107f757503415155b1561082e576040517ff2365b5b00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b61083c883489898989612486565b506108478282612632565b50505050505050565b8260005a905060006108606123e9565b5090507fffffffffffffffffffffffff111111111111111111111111111111111111111273ffffffffffffffffffffffffffffffffffffffff8216016108d2576040517f0eaf3c0f00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b87603d60008282546108e4919061553d565b90915550506040517f70a0823100000000000000000000000000000000000000000000000000000000815230600482015260009073ffffffffffffffffffffffffffffffffffffffff8316906370a0823190602401602060405180830381865afa158015610956573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061097a9190615555565b905061099e73ffffffffffffffffffffffffffffffffffffffff831633308c6128ff565b6109a8898261553d565b6040517f70a0823100000000000000000000000000000000000000000000000000000000815230600482015273ffffffffffffffffffffffffffffffffffffffff8416906370a0823190602401602060405180830381865afa158015610a12573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610a369190615555565b14610a6d576040517f90b8ec1800000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b610a7b8a8a8a8a8a8a612486565b5050610a878282612632565b5050505050505050565b610a99611531565b15610ad0576040517ff480973e00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b60325473ffffffffffffffffffffffffffffffffffffffff1661dead14610b23576040517f9396d15600000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6000610b2e836129e1565b9050610b3a81836115c4565b6000818152603360209081526040822080547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff001660011790558401516032805473ffffffffffffffffffffffffffffffffffffffff9092167fffffffffffffffffffffffff000000000000000000000000000000000000000090921691909117905580610bc56123e9565b5090507fffffffffffffffffffffffff111111111111111111111111111111111111111273ffffffffffffffffffffffffffffffffffffffff821601610c2857610c218560400151866080015187606001518860a00151612a2e565b9150610e7b565b8073ffffffffffffffffffffffffffffffffffffffff16856040015173ffffffffffffffffffffffffffffffffffffffff1603610c91576040517f13496fda00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b606085015115610e52578460600151603d6000828254610cb1919061556e565b90915550506040517f70a0823100000000000000000000000000000000000000000000000000000000815230600482015260009073ffffffffffffffffffffffffffffffffffffffff8316906370a0823190602401602060405180830381865afa158015610d23573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610d479190615555565b9050610d7c866040015187606001518473ffffffffffffffffffffffffffffffffffffffff16612a8c9092919063ffffffff16565b6060860151610d8b908261556e565b6040517f70a0823100000000000000000000000000000000000000000000000000000000815230600482015273ffffffffffffffffffffffffffffffffffffffff8416906370a0823190602401602060405180830381865afa158015610df5573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610e199190615555565b14610e50576040517f90b8ec1800000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b505b60a08501515115610e7657610c218560400151866080015160008860a00151612a2e565b600191505b603280547fffffffffffffffffffffffff00000000000000000000000000000000000000001661dead17905560405183907fdb5c7652857aa163daadd670e116628fb42e869d8ac4251ef8971d9e5727df1b90610edd90851515815260200190565b60405180910390a281158015610ef35750326001145b15610f2a576040517feeae4ed300000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b5050505050565b6000603560019054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1663452a93206040518163ffffffff1660e01b8152600401602060405180830381865afa158015610fa0573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610fc49190615585565b905090565b610fd1611531565b15611008576040517ff480973e00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b3073ffffffffffffffffffffffffffffffffffffffff16856040015173ffffffffffffffffffffffffffffffffffffffff1603611071576040517f13496fda00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6038546040517fbb8aa1fc00000000000000000000000000000000000000000000000000000000815260048101869052600091829173ffffffffffffffffffffffffffffffffffffffff9091169063bb8aa1fc90602401606060405180830381865afa1580156110e5573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061110991906155a2565b925050915060008173ffffffffffffffffffffffffffffffffffffffff1663bcef3b556040518163ffffffff1660e01b8152600401602060405180830381865afa15801561115b573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061117f9190615555565b603b5490915063ffffffff8481169116146111c6576040517f27a10cc200000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6111dd6111d8368890038801886155ef565b612ae7565b8114611215576040517f09bde33900000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6000611220896129e1565b905060018373ffffffffffffffffffffffffffffffffffffffff1663200d2ed26040518163ffffffff1660e01b8152600401602060405180830381865afa15801561126f573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906112939190615684565b60028111156112a4576112a4615655565b036112db576040517fd357347400000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b60408051602081018390526000918101829052606001604080517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0818403018152828252805160209182012090830181905292506113a49101604080517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0818403018152828201909152600182527f010000000000000000000000000000000000000000000000000000000000000060208301529061139a898b6156a5565b8b60400135612b26565b15156000036113df576040517fb05e92fa00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b60408051808201825273ffffffffffffffffffffffffffffffffffffffff808716825267ffffffffffffffff4281166020808501918252600088815260398252868120338252825286812095518654935190941674010000000000000000000000000000000000000000027fffffffff0000000000000000000000000000000000000000000000000000000090931693851693909317919091179093558d840151928e01519351928216939091169185917f67a6208cfcc0801d50f6cbe764733f4fddf66ac0b04442061a8a8c0cb6b63f6291a4604051339083907f798f9f13695f8f045aa5f80ed8efebb695f3c7fe65da381969f2f28bf3c60b9790600090a3506000908152603c602090815260408220805460018101825590835291200180547fffffffffffffffffffffffff000000000000000000000000000000000000000016331790555050505050505050565b6000603560019054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16635c975abb6040518163ffffffff1660e01b8152600401602060405180830381865afa1580156115a0573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610fc49190615729565b600082815260396020908152604080832073ffffffffffffffffffffffffffffffffffffffff85811685529083528184208251808401845290549182168082527401000000000000000000000000000000000000000090920467ffffffffffffffff1681850152818552603a90935292205490919060ff1615611673576040517f09550c7700000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b816020015167ffffffffffffffff166000036116bb576040517f94efd49b00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b600061173c8273ffffffffffffffffffffffffffffffffffffffff1663cf09e0d06040518163ffffffff1660e01b8152600401602060405180830381865afa15801561170b573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061172f9190615746565b67ffffffffffffffff1690565b90508067ffffffffffffffff16836020015167ffffffffffffffff1611611810576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152604e60248201527f4f7074696d69736d506f7274616c3a207769746864726177616c2074696d657360448201527f74616d70206c657373207468616e20646973707574652067616d65206372656160648201527f74696f6e2074696d657374616d70000000000000000000000000000000000000608482015260a4015b60405180910390fd5b7f000000000000000000000000000000000000000000000000000000000000000c836020015167ffffffffffffffff164261184b919061556e565b116118d8576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152603560248201527f4f7074696d69736d506f7274616c3a2070726f76656e2077697468647261776160448201527f6c20686173206e6f74206d6174757265642079657400000000000000000000006064820152608401611807565b60028273ffffffffffffffffffffffffffffffffffffffff1663200d2ed26040518163ffffffff1660e01b8152600401602060405180830381865afa158015611925573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906119499190615684565b600281111561195a5761195a615655565b14611991576040517fa080a3c400000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b603b5463ffffffff1663ffffffff16611a1b8373ffffffffffffffffffffffffffffffffffffffff1663bbdc02db6040518163ffffffff1660e01b8152600401602060405180830381865afa1580156119ee573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611a129190615763565b63ffffffff1690565b63ffffffff1614611a58576040517f27a10cc200000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b603b5467ffffffffffffffff64010000000090910481169082161015611b26576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152604b60248201527f4f7074696d69736d506f7274616c3a20646973707574652067616d652063726560448201527f61746564206265666f7265207265737065637465642067616d6520747970652060648201527f7761732075706461746564000000000000000000000000000000000000000000608482015260a401611807565b7f0000000000000000000000000000000000000000000000000000000000000006611b958373ffffffffffffffffffffffffffffffffffffffff166319effeb46040518163ffffffff1660e01b8152600401602060405180830381865afa15801561170b573d6000803e3d6000fd5b611ba99067ffffffffffffffff164261556e565b11611c36576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602a60248201527f4f7074696d69736d506f7274616c3a206f75747075742070726f706f73616c2060448201527f696e206169722d676170000000000000000000000000000000000000000000006064820152608401611807565b60008581526033602052604090205460ff1615610f2a576040517f475a253500000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b60375473ffffffffffffffffffffffffffffffffffffffff163314611cd0576040517f82b4290000000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b611cdc62030d40612b4a565b60405173ffffffffffffffffffffffffffffffffffffffff8516602482015260ff8416604482015260648101839052608481018290526000907342000000000000000000000000000000000000159073deaddeaddeaddeaddeaddeaddeaddeaddead0001907fb3813568d9991fc951961fcb4c784893574240a28925604d09fc577c55bb7c32908490819062030d4090829060a401604080517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0818403018152918152602080830180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff167f71cfaa3f000000000000000000000000000000000000000000000000000000001790529051611df996959493929101615780565b604080517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe081840301815290829052611e31916152fb565b60405180910390a450505050565b611e47610f31565b73ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff1614611eab576040517f82b4290000000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b73ffffffffffffffffffffffffffffffffffffffff81166000818152603a602052604080822080547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00166001179055517f192c289026d59a41a27f5aea08f3969b57931b0589202d14f4368cded95d3cda9190a250565b611f2a610f31565b73ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff1614611f8e576040517f82b4290000000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b603b805463ffffffff83167fffffffffffffffffffffffffffffffffffffffff00000000000000000000000090911681176401000000004267ffffffffffffffff90811682029290921793849055604051930416917f049fe9dd413cdf037cce27011cc1790c753118272f3630e6e8bdfa5e8208176090600090a350565b565b612016611531565b1561204d576040517ff480973e00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6120578133610a91565b50565b600054610100900460ff161580801561207a5750600054600160ff909116105b806120945750303b158015612094575060005460ff166001145b612120576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602e60248201527f496e697469616c697a61626c653a20636f6e747261637420697320616c72656160448201527f647920696e697469616c697a65640000000000000000000000000000000000006064820152608401611807565b600080547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00166001179055801561217e57600080547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00ff166101001790555b603880547fffffffffffffffffffffffff000000000000000000000000000000000000000090811673ffffffffffffffffffffffffffffffffffffffff8881169190911790925560378054909116868316179055603580547fffffffffffffffffffffff0000000000000000000000000000000000000000ff16610100868416021790556032541661229e576032805461dead7fffffffffffffffffffffffff0000000000000000000000000000000000000000909116179055603b80547fffffffffffffffffffffffffffffffffffffffff000000000000000000000000166401000000004267ffffffffffffffff16027fffffffffffffffffffffffffffffffffffffffffffffffffffffffff00000000161763ffffffff84161790555b6122a6612bac565b8015610f2a57600080547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00ff169055604051600181527f7f26b83ff96e1f2b6a682f133852f6798a09c465da95921460cefb38474024989060200160405180910390a15050505050565b600061231c8260106157e5565b61232890615208615815565b92915050565b603c602052816000526040600020818154811061234a57600080fd5b60009182526020909120015473ffffffffffffffffffffffffffffffffffffffff169150829050565b60008061237e6123e9565b5090507fffffffffffffffffffffffff111111111111111111111111111111111111111273ffffffffffffffffffffffffffffffffffffffff8216016123c5574791505090565b5050603d5490565b73ffffffffffffffffffffffffffffffffffffffff163b151590565b603754604080517f4397dfef0000000000000000000000000000000000000000000000000000000081528151600093849373ffffffffffffffffffffffffffffffffffffffff90911692634397dfef92600480830193928290030181865afa158015612459573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061247d9190615841565b90939092509050565b8180156124a8575073ffffffffffffffffffffffffffffffffffffffff861615155b156124df576040517f13496fda00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6124e9815161230f565b67ffffffffffffffff168367ffffffffffffffff161015612536576040517f4929b80800000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6201d4c081511115612574576040517f73052b0f00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b33328114612595575033731111000000000000000000000000000000001111015b600086868686866040516020016125b0959493929190615780565b604051602081830303815290604052905060008873ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff167fb3813568d9991fc951961fcb4c784893574240a28925604d09fc577c55bb7c328460405161262091906152fb565b60405180910390a45050505050505050565b600154600090612668907801000000000000000000000000000000000000000000000000900467ffffffffffffffff164361556e565b90506000612674612cbf565b90506000816020015160ff16826000015163ffffffff16612695919061589f565b905082156127cc576001546000906126cc908390700100000000000000000000000000000000900467ffffffffffffffff16615907565b90506000836040015160ff16836126e3919061597b565b6001546127039084906fffffffffffffffffffffffffffffffff1661597b565b61270d919061589f565b60015490915060009061275e906127379084906fffffffffffffffffffffffffffffffff16615a37565b866060015163ffffffff168760a001516fffffffffffffffffffffffffffffffff16612d85565b9050600186111561278d5761278a61273782876040015160ff1660018a612785919061556e565b612da4565b90505b6fffffffffffffffffffffffffffffffff16780100000000000000000000000000000000000000000000000067ffffffffffffffff4316021760015550505b600180548691906010906127ff908490700100000000000000000000000000000000900467ffffffffffffffff16615815565b92506101000a81548167ffffffffffffffff021916908367ffffffffffffffff160217905550816000015163ffffffff16600160000160109054906101000a900467ffffffffffffffff1667ffffffffffffffff16131561288c576040517f77ebef4d00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6001546000906128b8906fffffffffffffffffffffffffffffffff1667ffffffffffffffff8816615aab565b905060006128ca48633b9aca00612df9565b6128d49083615ae8565b905060005a6128e3908861556e565b905080821115610a8757610a876128fa828461556e565b612e10565b60405173ffffffffffffffffffffffffffffffffffffffff808516602483015283166044820152606481018290526129db9085907f23b872dd00000000000000000000000000000000000000000000000000000000906084015b604080517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe08184030181529190526020810180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff167fffffffff0000000000000000000000000000000000000000000000000000000090931692909217909152612e39565b50505050565b80516020808301516040808501516060860151608087015160a08801519351600097612a11979096959101615afc565b604051602081830303815290604052805190602001209050919050565b6000806000612a3e866000612f45565b905080612a74576308c379a06000526020805278185361666543616c6c3a204e6f7420656e6f756768206761736058526064601cfd5b600080855160208701888b5af1979650505050505050565b60405173ffffffffffffffffffffffffffffffffffffffff8316602482015260448101829052612ae29084907fa9059cbb0000000000000000000000000000000000000000000000000000000090606401612959565b505050565b60008160000151826020015183604001518460600151604051602001612a11949392919093845260208401929092526040830152606082015260800190565b600080612b3286612f63565b9050612b4081868686612f95565b9695505050505050565b6001805463ffffffff83169190601090612b83908490700100000000000000000000000000000000900467ffffffffffffffff16615815565b92506101000a81548167ffffffffffffffff021916908367ffffffffffffffff16021790555050565b600054610100900460ff16612c43576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602b60248201527f496e697469616c697a61626c653a20636f6e7472616374206973206e6f74206960448201527f6e697469616c697a696e670000000000000000000000000000000000000000006064820152608401611807565b6001547801000000000000000000000000000000000000000000000000900467ffffffffffffffff1660000361200c5760408051606081018252633b9aca00808252600060208301524367ffffffffffffffff169190920181905278010000000000000000000000000000000000000000000000000217600155565b6040805160c081018252600080825260208201819052918101829052606081018290526080810182905260a0810191909152603754604080517fcc731b02000000000000000000000000000000000000000000000000000000008152905160009273ffffffffffffffffffffffffffffffffffffffff169163cc731b029160048083019260c09291908290030181865afa158015612d61573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906123289190615b53565b6000612d9a612d948585612fc5565b83612fd5565b90505b9392505050565b6000670de0b6b3a7640000612de5612dbc858361589f565b612dce90670de0b6b3a7640000615907565b612de085670de0b6b3a764000061597b565b612fe4565b612def908661597b565b612d9a919061589f565b600081831015612e095781612d9d565b5090919050565b6000805a90505b825a612e23908361556e565b1015612ae257612e3282615bf5565b9150612e17565b6000612e9b826040518060400160405280602081526020017f5361666545524332303a206c6f772d6c6576656c2063616c6c206661696c65648152508573ffffffffffffffffffffffffffffffffffffffff166130159092919063ffffffff16565b805190915015612ae25780806020019051810190612eb99190615729565b612ae2576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602a60248201527f5361666545524332303a204552433230206f7065726174696f6e20646964206e60448201527f6f742073756363656564000000000000000000000000000000000000000000006064820152608401611807565b600080603f83619c4001026040850201603f5a021015949350505050565b60608180519060200120604051602001612f7f91815260200190565b6040516020818303038152906040529050919050565b6000612fbc84612fa6878686613024565b8051602091820120825192909101919091201490565b95945050505050565b600081831215612e095781612d9d565b6000818312612e095781612d9d565b6000612d9d670de0b6b3a764000083612ffc86613aa2565b613006919061597b565b613010919061589f565b613ce6565b6060612d9a8484600085613f25565b60606000845111613091576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601560248201527f4d65726b6c65547269653a20656d707479206b657900000000000000000000006044820152606401611807565b600061309c846140bb565b905060006130a9866141a7565b90506000846040516020016130c091815260200190565b60405160208183030381529060405290506000805b8451811015613a195760008582815181106130f2576130f2615c2d565b60200260200101519050845183111561318d576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602e60248201527f4d65726b6c65547269653a206b657920696e646578206578636565647320746f60448201527f74616c206b6579206c656e6774680000000000000000000000000000000000006064820152608401611807565b8260000361324657805180516020918201206040516131db926131b592910190815260200190565b604051602081830303815290604052858051602091820120825192909101919091201490565b613241576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601d60248201527f4d65726b6c65547269653a20696e76616c696420726f6f7420686173680000006044820152606401611807565b61339d565b8051516020116132fc5780518051602091820120604051613270926131b592910190815260200190565b613241576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602760248201527f4d65726b6c65547269653a20696e76616c6964206c6172676520696e7465726e60448201527f616c2068617368000000000000000000000000000000000000000000000000006064820152608401611807565b80518451602080870191909120825191909201201461339d576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602660248201527f4d65726b6c65547269653a20696e76616c696420696e7465726e616c206e6f6460448201527f65206861736800000000000000000000000000000000000000000000000000006064820152608401611807565b6133a96010600161553d565b81602001515103613585578451830361351d576133e381602001516010815181106133d6576133d6615c2d565b602002602001015161420a565b96506000875111613476576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152603b60248201527f4d65726b6c65547269653a2076616c7565206c656e677468206d75737420626560448201527f2067726561746572207468616e207a65726f20286272616e63682900000000006064820152608401611807565b60018651613484919061556e565b8214613512576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152603a60248201527f4d65726b6c65547269653a2076616c7565206e6f6465206d757374206265206c60448201527f617374206e6f646520696e2070726f6f6620286272616e6368290000000000006064820152608401611807565b505050505050612d9d565b600085848151811061353157613531615c2d565b602001015160f81c60f81b60f81c9050600082602001518260ff168151811061355c5761355c615c2d565b6020026020010151905061356f816142be565b955061357c60018661553d565b94505050613a06565b60028160200151510361397e57600061359d826142e3565b90506000816000815181106135b4576135b4615c2d565b016020015160f81c905060006135cb600283615c5c565b6135d6906002615c7e565b905060006135e7848360ff16614307565b905060006135f58a89614307565b90506000613603838361433d565b905080835114613695576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152603a60248201527f4d65726b6c65547269653a20706174682072656d61696e646572206d7573742060448201527f736861726520616c6c206e6962626c65732077697468206b65790000000000006064820152608401611807565b60ff8516600214806136aa575060ff85166003145b15613899578082511461373f576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152603d60248201527f4d65726b6c65547269653a206b65792072656d61696e646572206d757374206260448201527f65206964656e746963616c20746f20706174682072656d61696e6465720000006064820152608401611807565b61375987602001516001815181106133d6576133d6615c2d565b9c5060008d51116137ec576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152603960248201527f4d65726b6c65547269653a2076616c7565206c656e677468206d75737420626560448201527f2067726561746572207468616e207a65726f20286c65616629000000000000006064820152608401611807565b60018c516137fa919061556e565b8814613888576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152603860248201527f4d65726b6c65547269653a2076616c7565206e6f6465206d757374206265206c60448201527f617374206e6f646520696e2070726f6f6620286c6561662900000000000000006064820152608401611807565b505050505050505050505050612d9d565b60ff851615806138ac575060ff85166001145b156138eb576138d887602001516001815181106138cb576138cb615c2d565b60200260200101516142be565b99506138e4818a61553d565b9850613973565b6040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152603260248201527f4d65726b6c65547269653a2072656365697665642061206e6f6465207769746860448201527f20616e20756e6b6e6f776e2070726566697800000000000000000000000000006064820152608401611807565b505050505050613a06565b6040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602860248201527f4d65726b6c65547269653a20726563656976656420616e20756e70617273656160448201527f626c65206e6f64650000000000000000000000000000000000000000000000006064820152608401611807565b5080613a1181615bf5565b9150506130d5565b506040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602560248201527f4d65726b6c65547269653a2072616e206f7574206f662070726f6f6620656c6560448201527f6d656e74730000000000000000000000000000000000000000000000000000006064820152608401611807565b6000808213613b0d576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152600960248201527f554e444546494e454400000000000000000000000000000000000000000000006044820152606401611807565b60006060613b1a846143f1565b03609f8181039490941b90931c6c465772b2bbbb5f824b15207a3081018102606090811d6d0388eaa27412d5aca026815d636e018202811d6d0df99ac502031bf953eff472fdcc018202811d6d13cdffb29d51d99322bdff5f2211018202811d6d0a0f742023def783a307a986912e018202811d6d01920d8043ca89b5239253284e42018202811d6c0b7a86d7375468fac667a0a527016c29508e458543d8aa4df2abee7883018302821d6d0139601a2efabe717e604cbb4894018302821d6d02247f7a7b6594320649aa03aba1018302821d7fffffffffffffffffffffffffffffffffffffff73c0c716a594e00d54e3c4cbc9018302821d7ffffffffffffffffffffffffffffffffffffffdc7b88c420e53a9890533129f6f01830290911d7fffffffffffffffffffffffffffffffffffffff465fda27eb4d63ded474e5f832019091027ffffffffffffffff5f6af8f7b3396644f18e157960000000000000000000000000105711340daa0d5f769dba1915cef59f0815a5506027d0267a36c0c95b3975ab3ee5b203a7614a3f75373f047d803ae7b6687f2b393909302929092017d57115e47018c7177eebf7cd370a3356a1b7863008a5ae8028c72b88642840160ae1d92915050565b60007ffffffffffffffffffffffffffffffffffffffffffffffffdb731c958f34d94c18213613d1757506000919050565b680755bf798b4a1bf1e58212613d89576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152600c60248201527f4558505f4f564552464c4f5700000000000000000000000000000000000000006044820152606401611807565b6503782dace9d9604e83901b059150600060606bb17217f7d1cf79abc9e3b39884821b056b80000000000000000000000001901d6bb17217f7d1cf79abc9e3b39881029093037fffffffffffffffffffffffffffffffffffffffdbf3ccf1604d263450f02a550481018102606090811d6d0277594991cfc85f6e2461837cd9018202811d7fffffffffffffffffffffffffffffffffffffe5adedaa1cb095af9e4da10e363c018202811d6db1bbb201f443cf962f1a1d3db4a5018202811d7ffffffffffffffffffffffffffffffffffffd38dc772608b0ae56cce01296c0eb018202811d6e05180bb14799ab47a8a8cb2a527d57016d02d16720577bd19bf614176fe9ea6c10fe68e7fd37d0007b713f765084018402831d9081019084017ffffffffffffffffffffffffffffffffffffffe2c69812cf03b0763fd454a8f7e010290911d6e0587f503bb6ea29d25fcb7401964500190910279d835ebba824c98fb31b83b2ca45c000000000000000000000000010574029d9dc38563c32e5c2f6dc192ee70ef65f9978af30260c3939093039290921c92915050565b606082471015613fb7576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602660248201527f416464726573733a20696e73756666696369656e742062616c616e636520666f60448201527f722063616c6c00000000000000000000000000000000000000000000000000006064820152608401611807565b73ffffffffffffffffffffffffffffffffffffffff85163b614035576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601d60248201527f416464726573733a2063616c6c20746f206e6f6e2d636f6e74726163740000006044820152606401611807565b6000808673ffffffffffffffffffffffffffffffffffffffff16858760405161405e9190615ca1565b60006040518083038185875af1925050503d806000811461409b576040519150601f19603f3d011682016040523d82523d6000602084013e6140a0565b606091505b50915091506140b08282866144c7565b979650505050505050565b80516060908067ffffffffffffffff8111156140d9576140d9614eb6565b60405190808252806020026020018201604052801561411e57816020015b60408051808201909152606080825260208201528152602001906001900390816140f75790505b50915060005b818110156141a057604051806040016040528085838151811061414957614149615c2d565b6020026020010151815260200161417886848151811061416b5761416b615c2d565b602002602001015161451a565b81525083828151811061418d5761418d615c2d565b6020908102919091010152600101614124565b5050919050565b606080604051905082518060011b603f8101601f1916830160405280835250602084016020830160005b838110156141ff578060011b82018184015160001a8060041c8253600f8116600183015350506001016141d1565b509295945050505050565b6060600080600061421a8561452d565b91945092509050600081600181111561423557614235615655565b1461426c576040517f1ff9b2e400000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b614276828461553d565b8551146142af576040517f5c5537b800000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b612fbc856020015184846149cb565b606060208260000151106142da576142d58261420a565b612328565b61232882614a5f565b606061232861430283602001516000815181106133d6576133d6615c2d565b6141a7565b6060825182106143265750604080516020810190915260008152612328565b612d9d8383848651614338919061556e565b614a75565b6000808251845110614350578251614353565b83515b90505b80821080156143da575082828151811061437257614372615c2d565b602001015160f81c60f81b7effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff19168483815181106143b1576143b1615c2d565b01602001517fff0000000000000000000000000000000000000000000000000000000000000016145b156143ea57816001019150614356565b5092915050565b600080821161445c576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152600960248201527f554e444546494e454400000000000000000000000000000000000000000000006044820152606401611807565b5060016fffffffffffffffffffffffffffffffff821160071b82811c67ffffffffffffffff1060061b1782811c63ffffffff1060051b1782811c61ffff1060041b1782811c60ff10600390811b90911783811c600f1060021b1783811c909110821b1791821c111790565b606083156144d6575081612d9d565b8251156144e65782518084602001fd5b816040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161180791906152fb565b606061232861452883614c4d565b614cba565b60008060008360000151600003614570576040517f5ab458fb00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6020840151805160001a607f81116145955760006001600094509450945050506149c4565b60b781116146ab5760006145aa60808361556e565b9050808760000151116145e9576040517f66c9448500000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6001838101517fff0000000000000000000000000000000000000000000000000000000000000016908214801561466157507f80000000000000000000000000000000000000000000000000000000000000007fff000000000000000000000000000000000000000000000000000000000000008216105b15614698576040517fbabb01dd00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b50600195509350600092506149c4915050565b60bf81116148095760006146c060b78361556e565b9050808760000151116146ff576040517f66c9448500000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b60018301517fff00000000000000000000000000000000000000000000000000000000000000166000819003614761576040517fbabb01dd00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b600184015160088302610100031c603781116147a9576040517fbabb01dd00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6147b3818461553d565b8951116147ec576040517f66c9448500000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6147f783600161553d565b97509550600094506149c49350505050565b60f7811161486e57600061481e60c08361556e565b90508087600001511161485d576040517f66c9448500000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6001955093508492506149c4915050565b600061487b60f78361556e565b9050808760000151116148ba576040517f66c9448500000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b60018301517fff0000000000000000000000000000000000000000000000000000000000000016600081900361491c576040517fbabb01dd00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b600184015160088302610100031c60378111614964576040517fbabb01dd00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b61496e818461553d565b8951116149a7576040517f66c9448500000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6149b283600161553d565b97509550600194506149c49350505050565b9193909250565b60608167ffffffffffffffff8111156149e6576149e6614eb6565b6040519080825280601f01601f191660200182016040528015614a10576020820181803683370190505b5090508115612d9d576000614a25848661553d565b90506020820160005b84811015614a46578281015182820152602001614a2e565b84811115614a55576000858301525b5050509392505050565b60606123288260200151600084600001516149cb565b60608182601f011015614ae4576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152600e60248201527f736c6963655f6f766572666c6f770000000000000000000000000000000000006044820152606401611807565b828284011015614b50576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152600e60248201527f736c6963655f6f766572666c6f770000000000000000000000000000000000006044820152606401611807565b81830184511015614bbd576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601160248201527f736c6963655f6f75744f66426f756e64730000000000000000000000000000006044820152606401611807565b606082158015614bdc5760405191506000825260208201604052614c44565b6040519150601f8416801560200281840101858101878315602002848b0101015b81831015614c15578051835260209283019201614bfd565b5050858452601f017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe016604052505b50949350505050565b60408051808201909152600080825260208201528151600003614c9c576040517f5ab458fb00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b50604080518082019091528151815260209182019181019190915290565b60606000806000614cca8561452d565b919450925090506001816001811115614ce557614ce5615655565b14614d1c576040517f4b9c6abe00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b8451614d28838561553d565b14614d5f576040517f5c5537b800000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b604080516020808252610420820190925290816020015b6040805180820190915260008082526020820152815260200190600190039081614d765790505093506000835b8651811015614e6457600080614de96040518060400160405280858c60000151614dcd919061556e565b8152602001858c60200151614de2919061553d565b905261452d565b509150915060405180604001604052808383614e05919061553d565b8152602001848b60200151614e1a919061553d565b815250888581518110614e2f57614e2f615c2d565b6020908102919091010152614e4560018561553d565b9350614e51818361553d565b614e5b908461553d565b92505050614da3565b50845250919392505050565b73ffffffffffffffffffffffffffffffffffffffff8116811461205757600080fd5b67ffffffffffffffff8116811461205757600080fd5b801515811461205757600080fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b60405160c0810167ffffffffffffffff81118282101715614f0857614f08614eb6565b60405290565b604051601f82017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe016810167ffffffffffffffff81118282101715614f5557614f55614eb6565b604052919050565b600082601f830112614f6e57600080fd5b813567ffffffffffffffff811115614f8857614f88614eb6565b614fb960207fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0601f84011601614f0e565b818152846020838601011115614fce57600080fd5b816020850160208301376000918101602001919091529392505050565b60008060008060008060c0878903121561500457600080fd5b863561500f81614e70565b95506020870135945060408701359350606087013561502d81614e92565b9250608087013561503d81614ea8565b915060a087013567ffffffffffffffff81111561505957600080fd5b61506589828a01614f5d565b9150509295509295509295565b600060c0828403121561508457600080fd5b60405160c0810167ffffffffffffffff82821081831117156150a8576150a8614eb6565b8160405282935084358352602085013591506150c382614e70565b816020840152604085013591506150d982614e70565b816040840152606085013560608401526080850135608084015260a085013591508082111561510757600080fd5b5061511485828601614f5d565b60a0830152505092915050565b6000806040838503121561513457600080fd5b823567ffffffffffffffff81111561514b57600080fd5b61515785828601615072565b925050602083013561516881614e70565b809150509250929050565b60006020828403121561518557600080fd5b8135612d9d81614e70565b600080600080600085870360e08112156151a957600080fd5b863567ffffffffffffffff808211156151c157600080fd5b6151cd8a838b01615072565b97506020890135965060807fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc08401121561520657600080fd5b60408901955060c089013592508083111561522057600080fd5b828901925089601f84011261523457600080fd5b823591508082111561524557600080fd5b508860208260051b840101111561525b57600080fd5b959894975092955050506020019190565b60006020828403121561527e57600080fd5b5035919050565b60005b838110156152a0578181015183820152602001615288565b838111156129db5750506000910152565b600081518084526152c9816020860160208601615285565b601f017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0169290920160200192915050565b602081526000612d9d60208301846152b1565b6000806040838503121561532157600080fd5b82359150602083013561516881614e70565b60ff8116811461205757600080fd5b6000806000806080858703121561535857600080fd5b843561536381614e70565b9350602085013561537381615333565b93969395505050506040820135916060013590565b63ffffffff8116811461205757600080fd5b6000602082840312156153ac57600080fd5b8135612d9d81615388565b6000602082840312156153c957600080fd5b813567ffffffffffffffff8111156153e057600080fd5b6153ec84828501615072565b949350505050565b6000806000806080858703121561540a57600080fd5b843561541581614e70565b9350602085013561542581614e70565b9250604085013561543581614e70565b9150606085013561544581615388565b939692955090935050565b60006020828403121561546257600080fd5b8135612d9d81614e92565b6000806040838503121561548057600080fd5b50508035926020909101359150565b600080600080600060a086880312156154a757600080fd5b85356154b281614e70565b94506020860135935060408601356154c981614e92565b925060608601356154d981614ea8565b9150608086013567ffffffffffffffff8111156154f557600080fd5b61550188828901614f5d565b9150509295509295909350565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b600082198211156155505761555061550e565b500190565b60006020828403121561556757600080fd5b5051919050565b6000828210156155805761558061550e565b500390565b60006020828403121561559757600080fd5b8151612d9d81614e70565b6000806000606084860312156155b757600080fd5b83516155c281615388565b60208501519093506155d381614e92565b60408501519092506155e481614e70565b809150509250925092565b60006080828403121561560157600080fd5b6040516080810181811067ffffffffffffffff8211171561562457615624614eb6565b8060405250823581526020830135602082015260408301356040820152606083013560608201528091505092915050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602160045260246000fd5b60006020828403121561569657600080fd5b815160038110612d9d57600080fd5b600067ffffffffffffffff808411156156c0576156c0614eb6565b8360051b60206156d1818301614f0e565b8681529185019181810190368411156156e957600080fd5b865b8481101561571d578035868111156157035760008081fd5b61570f36828b01614f5d565b8452509183019183016156eb565b50979650505050505050565b60006020828403121561573b57600080fd5b8151612d9d81614ea8565b60006020828403121561575857600080fd5b8151612d9d81614e92565b60006020828403121561577557600080fd5b8151612d9d81615388565b8581528460208201527fffffffffffffffff0000000000000000000000000000000000000000000000008460c01b16604082015282151560f81b6048820152600082516157d4816049850160208701615285565b919091016049019695505050505050565b600067ffffffffffffffff8083168185168183048111821515161561580c5761580c61550e565b02949350505050565b600067ffffffffffffffff8083168185168083038211156158385761583861550e565b01949350505050565b6000806040838503121561585457600080fd5b825161585f81614e70565b602084015190925061516881615333565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601260045260246000fd5b6000826158ae576158ae615870565b7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff83147f8000000000000000000000000000000000000000000000000000000000000000831416156159025761590261550e565b500590565b6000808312837f8000000000000000000000000000000000000000000000000000000000000000018312811516156159415761594161550e565b837f7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0183138116156159755761597561550e565b50500390565b60007f7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff6000841360008413858304851182821616156159bc576159bc61550e565b7f800000000000000000000000000000000000000000000000000000000000000060008712868205881281841616156159f7576159f761550e565b60008712925087820587128484161615615a1357615a1361550e565b87850587128184161615615a2957615a2961550e565b505050929093029392505050565b6000808212827f7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff03841381151615615a7157615a7161550e565b827f8000000000000000000000000000000000000000000000000000000000000000038412811615615aa557615aa561550e565b50500190565b6000817fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0483118215151615615ae357615ae361550e565b500290565b600082615af757615af7615870565b500490565b868152600073ffffffffffffffffffffffffffffffffffffffff808816602084015280871660408401525084606083015283608083015260c060a0830152615b4760c08301846152b1565b98975050505050505050565b600060c08284031215615b6557600080fd5b615b6d614ee5565b8251615b7881615388565b81526020830151615b8881615333565b60208201526040830151615b9b81615333565b60408201526060830151615bae81615388565b60608201526080830151615bc181615388565b608082015260a08301516fffffffffffffffffffffffffffffffff81168114615be957600080fd5b60a08201529392505050565b60007fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff8203615c2657615c2661550e565b5060010190565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b600060ff831680615c6f57615c6f615870565b8060ff84160691505092915050565b600060ff821660ff841680821015615c9857615c9861550e565b90039392505050565b60008251615cb3818460208701615285565b919091019291505056fea164736f6c634300080f000a"; + bytes internal constant disputeGameFactoryCode = + hex"6080604052600436106100e85760003560e01c80636593dc6e1161008a57806396cd97201161005957806396cd972014610313578063bb8aa1fc14610333578063c4d66de814610394578063f2fde38b146103b457600080fd5b80636593dc6e14610293578063715018a6146102c057806382ecf2f6146102d55780638da5cb5b146102e857600080fd5b8063254bd683116100c6578063254bd6831461019c5780634d1975b4146101c957806354fd4d50146101e85780635f0150cb1461023e57600080fd5b806314f6b1a3146100ed5780631b685b9e1461010f5780631e3342401461017c575b600080fd5b3480156100f957600080fd5b5061010d6101083660046110c6565b6103d4565b005b34801561011b57600080fd5b5061015261012a3660046110fd565b60656020526000908152604090205473ffffffffffffffffffffffffffffffffffffffff1681565b60405173ffffffffffffffffffffffffffffffffffffffff90911681526020015b60405180910390f35b34801561018857600080fd5b5061010d610197366004611118565b61045e565b3480156101a857600080fd5b506101bc6101b7366004611142565b6104aa565b60405161017391906111ef565b3480156101d557600080fd5b506068545b604051908152602001610173565b3480156101f457600080fd5b506102316040518060400160405280600c81526020017f312e302e312d626574612e31000000000000000000000000000000000000000081525081565b60405161017391906112ac565b34801561024a57600080fd5b5061025e6102593660046112bf565b6106ee565b6040805173ffffffffffffffffffffffffffffffffffffffff909316835267ffffffffffffffff909116602083015201610173565b34801561029f57600080fd5b506101da6102ae3660046110fd565b60666020526000908152604090205481565b3480156102cc57600080fd5b5061010d610741565b6101526102e33660046112bf565b610755565b3480156102f457600080fd5b5060335473ffffffffffffffffffffffffffffffffffffffff16610152565b34801561031f57600080fd5b506101da61032e3660046112bf565b6109ef565b34801561033f57600080fd5b5061035361034e366004611346565b610a28565b6040805163ffffffff909416845267ffffffffffffffff909216602084015273ffffffffffffffffffffffffffffffffffffffff1690820152606001610173565b3480156103a057600080fd5b5061010d6103af36600461135f565b610a91565b3480156103c057600080fd5b5061010d6103cf36600461135f565b610c2d565b6103dc610d00565b63ffffffff821660008181526065602052604080822080547fffffffffffffffffffffffff00000000000000000000000000000000000000001673ffffffffffffffffffffffffffffffffffffffff8616908117909155905190917fff513d80e2c7fa487608f70a618dfbc0cf415699dc69588c747e8c71566c88de91a35050565b610466610d00565b63ffffffff8216600081815260666020526040808220849055518392917f74d6665c4b26d5596a5aa13d3014e0c06af4d322075a797f87b03cd4c5bc91ca91a35050565b606854606090831015806104bc575081155b6106e7575060408051600583901b8101602001909152825b8381116106e5576000606882815481106104f0576104f061137c565b600091825260209091200154905060e081901c60a082901c67ffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff831663ffffffff891683036106b6576001865101865260008173ffffffffffffffffffffffffffffffffffffffff1663609d33346040518163ffffffff1660e01b8152600401600060405180830381865afa15801561058a573d6000803e3d6000fd5b505050506040513d6000823e601f3d9081017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe01682016040526105d091908101906113da565b905060008273ffffffffffffffffffffffffffffffffffffffff1663bcef3b556040518163ffffffff1660e01b8152600401602060405180830381865afa15801561061f573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061064391906114a5565b90506040518060a001604052808881526020018781526020018567ffffffffffffffff168152602001828152602001838152508860018a5161068591906114be565b815181106106955761069561137c565b6020026020010181905250888851106106b3575050505050506106e5565b50505b50507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff90920191506104d49050565b505b9392505050565b60008060006106ff878787876109ef565b60009081526067602052604090205473ffffffffffffffffffffffffffffffffffffffff81169860a09190911c67ffffffffffffffff16975095505050505050565b610749610d00565b6107536000610d81565b565b63ffffffff841660009081526065602052604081205473ffffffffffffffffffffffffffffffffffffffff16806107c5576040517f031c6de400000000000000000000000000000000000000000000000000000000815263ffffffff871660048201526024015b60405180910390fd5b63ffffffff86166000908152606660205260409020543414610813576040517f8620aa1900000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b60006108206001436114be565b40905061088a338783888860405160200161083f9594939291906114fc565b604080517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe081840301815291905273ffffffffffffffffffffffffffffffffffffffff841690610df8565b92508273ffffffffffffffffffffffffffffffffffffffff16638129fc1c346040518263ffffffff1660e01b81526004016000604051808303818588803b1580156108d457600080fd5b505af11580156108e8573d6000803e3d6000fd5b505050505060006108fb888888886109ef565b60008181526067602052604090205490915015610947576040517f014f6fe5000000000000000000000000000000000000000000000000000000008152600481018290526024016107bc565b60004260a01b60e08a901b178517600083815260676020526040808220839055606880546001810182559083527fa2153420d844928b4421650203c77babc8b33d7f2e7b450e2966db0c220977530183905551919250899163ffffffff8c169173ffffffffffffffffffffffffffffffffffffffff8916917f5b565efe82411da98814f356d0e7bcb8f0219b8d970307c5afb4a6903a8b2e359190a450505050949350505050565b600084848484604051602001610a089493929190611549565b604051602081830303815290604052805190602001209050949350505050565b600080600080600080610a8160688881548110610a4757610a4761137c565b906000526020600020015460e081901c9160a082901c67ffffffffffffffff169173ffffffffffffffffffffffffffffffffffffffff1690565b9199909850909650945050505050565b600054610100900460ff1615808015610ab15750600054600160ff909116105b80610acb5750303b158015610acb575060005460ff166001145b610b57576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602e60248201527f496e697469616c697a61626c653a20636f6e747261637420697320616c72656160448201527f647920696e697469616c697a656400000000000000000000000000000000000060648201526084016107bc565b600080547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff001660011790558015610bb557600080547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00ff166101001790555b610bbd610e06565b610bc682610d81565b8015610c2957600080547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00ff169055604051600181527f7f26b83ff96e1f2b6a682f133852f6798a09c465da95921460cefb38474024989060200160405180910390a15b5050565b610c35610d00565b73ffffffffffffffffffffffffffffffffffffffff8116610cd8576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602660248201527f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160448201527f646472657373000000000000000000000000000000000000000000000000000060648201526084016107bc565b610ce181610d81565b50565b73ffffffffffffffffffffffffffffffffffffffff163b151590565b60335473ffffffffffffffffffffffffffffffffffffffff163314610753576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e657260448201526064016107bc565b6033805473ffffffffffffffffffffffffffffffffffffffff8381167fffffffffffffffffffffffff0000000000000000000000000000000000000000831681179093556040519116919082907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e090600090a35050565b60006106e760008484610ea5565b600054610100900460ff16610e9d576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602b60248201527f496e697469616c697a61626c653a20636f6e7472616374206973206e6f74206960448201527f6e697469616c697a696e6700000000000000000000000000000000000000000060648201526084016107bc565b610753610feb565b600060608203516040830351602084035184518060208701018051600283016c5af43d3d93803e606057fd5bf3895289600d8a035278593da1005b363d3d373d3d3d3d610000806062363936013d738160481b1760218a03527f9e4ac34f21c619cefc926c8bd93b54bf5a39c7ab2127a895af1cc0691d7e3dff603a8a035272fd6100003d81600a3d39f336602c57343d527f6062820160781b1761ff9e82106059018a03528060f01b8352606c8101604c8a038cf097505086610f715763301164256000526004601cfd5b905285527fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe08501527fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc08401527fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffa09092019190915292915050565b600054610100900460ff16611082576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602b60248201527f496e697469616c697a61626c653a20636f6e7472616374206973206e6f74206960448201527f6e697469616c697a696e6700000000000000000000000000000000000000000060648201526084016107bc565b61075333610d81565b803563ffffffff8116811461109f57600080fd5b919050565b73ffffffffffffffffffffffffffffffffffffffff81168114610ce157600080fd5b600080604083850312156110d957600080fd5b6110e28361108b565b915060208301356110f2816110a4565b809150509250929050565b60006020828403121561110f57600080fd5b6106e78261108b565b6000806040838503121561112b57600080fd5b6111348361108b565b946020939093013593505050565b60008060006060848603121561115757600080fd5b6111608461108b565b95602085013595506040909401359392505050565b60005b83811015611190578181015183820152602001611178565b8381111561119f576000848401525b50505050565b600081518084526111bd816020860160208601611175565b601f017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0169290920160200192915050565b60006020808301818452808551808352604092508286019150828160051b87010184880160005b8381101561129e578883037fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc001855281518051845287810151888501528681015167ffffffffffffffff16878501526060808201519085015260809081015160a09185018290529061128a818601836111a5565b968901969450505090860190600101611216565b509098975050505050505050565b6020815260006106e760208301846111a5565b600080600080606085870312156112d557600080fd5b6112de8561108b565b935060208501359250604085013567ffffffffffffffff8082111561130257600080fd5b818701915087601f83011261131657600080fd5b81358181111561132557600080fd5b88602082850101111561133757600080fd5b95989497505060200194505050565b60006020828403121561135857600080fd5b5035919050565b60006020828403121561137157600080fd5b81356106e7816110a4565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b6000602082840312156113ec57600080fd5b815167ffffffffffffffff8082111561140457600080fd5b818401915084601f83011261141857600080fd5b81518181111561142a5761142a6113ab565b604051601f82017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0908116603f01168101908382118183101715611470576114706113ab565b8160405282815287602084870101111561148957600080fd5b61149a836020830160208801611175565b979650505050505050565b6000602082840312156114b757600080fd5b5051919050565b6000828210156114f7577f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b500390565b7fffffffffffffffffffffffffffffffffffffffff0000000000000000000000008660601b1681528460148201528360348201528183605483013760009101605401908152949350505050565b63ffffffff8516815283602082015260606040820152816060820152818360808301376000818301608090810191909152601f9092017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0160101939250505056fea164736f6c634300080f000a"; + bytes internal constant delayedWETHCode = + hex"6080604052600436106101845760003560e01c8063715018a6116100d6578063a9059cbb1161007f578063dd62ed3e11610059578063dd62ed3e1461051c578063f2fde38b14610554578063f3fef3a31461057457610193565b8063a9059cbb146104a8578063cd47bde1146104c8578063d0e30db01461019357610193565b80638da5cb5b116100b05780638da5cb5b1461041757806395d89b4114610442578063977a5ec51461048857610193565b8063715018a61461039057806379502c55146103a55780637eee288d146103f757610193565b80632e1a7d4d1161013857806354fd4d501161011257806354fd4d50146102e75780636a42b8f81461033057806370a082311461036357610193565b80632e1a7d4d14610280578063313ce567146102a0578063485cc955146102c757610193565b80630ca35682116101695780630ca356821461022357806318160ddd1461024357806323b872dd1461026057610193565b806306fdde031461019b578063095ea7b3146101f357610193565b3661019357610191610594565b005b610191610594565b3480156101a757600080fd5b5060408051808201909152600d81527f577261707065642045746865720000000000000000000000000000000000000060208201525b6040516101ea91906113fd565b60405180910390f35b3480156101ff57600080fd5b5061021361020e366004611492565b6105ef565b60405190151581526020016101ea565b34801561022f57600080fd5b5061019161023e3660046114be565b610668565b34801561024f57600080fd5b50475b6040519081526020016101ea565b34801561026c57600080fd5b5061021361027b3660046114d7565b6107b9565b34801561028c57600080fd5b5061019161029b3660046114be565b6109d0565b3480156102ac57600080fd5b506102b5601281565b60405160ff90911681526020016101ea565b3480156102d357600080fd5b506101916102e2366004611518565b6109dd565b3480156102f357600080fd5b506101dd6040518060400160405280600c81526020017f312e312e312d626574612e32000000000000000000000000000000000000000081525081565b34801561033c57600080fd5b507f0000000000000000000000000000000000000000000000000000000000093a80610252565b34801561036f57600080fd5b5061025261037e366004611551565b60656020526000908152604090205481565b34801561039c57600080fd5b50610191610bb9565b3480156103b157600080fd5b506068546103d29073ffffffffffffffffffffffffffffffffffffffff1681565b60405173ffffffffffffffffffffffffffffffffffffffff90911681526020016101ea565b34801561040357600080fd5b50610191610412366004611492565b610bcd565b34801561042357600080fd5b5060335473ffffffffffffffffffffffffffffffffffffffff166103d2565b34801561044e57600080fd5b5060408051808201909152600481527f574554480000000000000000000000000000000000000000000000000000000060208201526101dd565b34801561049457600080fd5b506101916104a3366004611492565b610c21565b3480156104b457600080fd5b506102136104c3366004611492565b610d0e565b3480156104d457600080fd5b506105076104e3366004611518565b60676020908152600092835260408084209091529082529020805460019091015482565b604080519283526020830191909152016101ea565b34801561052857600080fd5b50610252610537366004611518565b606660209081526000928352604080842090915290825290205481565b34801561056057600080fd5b5061019161056f366004611551565b610d22565b34801561058057600080fd5b5061019161058f366004611492565b610dd6565b33600090815260656020526040812080543492906105b390849061159d565b909155505060405134815233907fe1fffcc4923d04b559f4d29a8bfc6cda04eb5b0d3c460751c2402c5c5cc9109c9060200160405180910390a2565b33600081815260666020908152604080832073ffffffffffffffffffffffffffffffffffffffff8716808552925280832085905551919290917f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b925906106579086815260200190565b60405180910390a350600192915050565b60335473ffffffffffffffffffffffffffffffffffffffff1633146106ee576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601660248201527f44656c61796564574554483a206e6f74206f776e65720000000000000000000060448201526064015b60405180910390fd5b60004782106106fd57476106ff565b815b604051909150600090339083908381818185875af1925050503d8060008114610744576040519150601f19603f3d011682016040523d82523d6000602084013e610749565b606091505b50509050806107b4576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601b60248201527f44656c61796564574554483a207265636f766572206661696c6564000000000060448201526064016106e5565b505050565b73ffffffffffffffffffffffffffffffffffffffff83166000908152606560205260408120548211156107eb57600080fd5b73ffffffffffffffffffffffffffffffffffffffff84163314801590610861575073ffffffffffffffffffffffffffffffffffffffff841660009081526066602090815260408083203384529091529020547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff14155b156108e95773ffffffffffffffffffffffffffffffffffffffff841660009081526066602090815260408083203384529091529020548211156108a357600080fd5b73ffffffffffffffffffffffffffffffffffffffff84166000908152606660209081526040808320338452909152812080548492906108e39084906115b5565b90915550505b73ffffffffffffffffffffffffffffffffffffffff84166000908152606560205260408120805484929061091e9084906115b5565b909155505073ffffffffffffffffffffffffffffffffffffffff83166000908152606560205260408120805484929061095890849061159d565b925050819055508273ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef846040516109be91815260200190565b60405180910390a35060019392505050565b6109da3382610dd6565b50565b600054610100900460ff16158080156109fd5750600054600160ff909116105b80610a175750303b158015610a17575060005460ff166001145b610aa3576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602e60248201527f496e697469616c697a61626c653a20636f6e747261637420697320616c72656160448201527f647920696e697469616c697a656400000000000000000000000000000000000060648201526084016106e5565b600080547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff001660011790558015610b0157600080547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00ff166101001790555b610b09611120565b610b12836111bf565b606880547fffffffffffffffffffffffff00000000000000000000000000000000000000001673ffffffffffffffffffffffffffffffffffffffff841617905580156107b457600080547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00ff169055604051600181527f7f26b83ff96e1f2b6a682f133852f6798a09c465da95921460cefb38474024989060200160405180910390a1505050565b610bc1611236565b610bcb60006111bf565b565b33600090815260676020908152604080832073ffffffffffffffffffffffffffffffffffffffff861684529091528120426001820155805490918391839190610c1790849061159d565b9091555050505050565b60335473ffffffffffffffffffffffffffffffffffffffff163314610ca2576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601660248201527f44656c61796564574554483a206e6f74206f776e65720000000000000000000060448201526064016106e5565b73ffffffffffffffffffffffffffffffffffffffff821660008181526066602090815260408083203380855290835292819020859055518481529192917f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b925910160405180910390a35050565b6000610d1b3384846107b9565b9392505050565b610d2a611236565b73ffffffffffffffffffffffffffffffffffffffff8116610dcd576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602660248201527f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160448201527f646472657373000000000000000000000000000000000000000000000000000060648201526084016106e5565b6109da816111bf565b606860009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16635c975abb6040518163ffffffff1660e01b8152600401602060405180830381865afa158015610e43573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610e6791906115cc565b15610ece576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601f60248201527f44656c61796564574554483a20636f6e7472616374206973207061757365640060448201526064016106e5565b33600090815260676020908152604080832073ffffffffffffffffffffffffffffffffffffffff8616845290915290208054821115610f8f576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602d60248201527f44656c61796564574554483a20696e73756666696369656e7420756e6c6f636b60448201527f6564207769746864726177616c0000000000000000000000000000000000000060648201526084016106e5565b6000816001015411611022576040517f08c379a0000000000000000000000000000000000000000000000000000000008152602060048201526024808201527f44656c61796564574554483a207769746864726177616c206e6f7420756e6c6f60448201527f636b65640000000000000000000000000000000000000000000000000000000060648201526084016106e5565b427f0000000000000000000000000000000000000000000000000000000000093a808260010154611053919061159d565b11156110e1576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602560248201527f44656c61796564574554483a207769746864726177616c2064656c6179206e6f60448201527f74206d657400000000000000000000000000000000000000000000000000000060648201526084016106e5565b818160000160008282546110f591906115b5565b909155506107b49050826112b7565b73ffffffffffffffffffffffffffffffffffffffff163b151590565b600054610100900460ff166111b7576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602b60248201527f496e697469616c697a61626c653a20636f6e7472616374206973206e6f74206960448201527f6e697469616c697a696e6700000000000000000000000000000000000000000060648201526084016106e5565b610bcb61135d565b6033805473ffffffffffffffffffffffffffffffffffffffff8381167fffffffffffffffffffffffff0000000000000000000000000000000000000000831681179093556040519116919082907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e090600090a35050565b60335473ffffffffffffffffffffffffffffffffffffffff163314610bcb576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e657260448201526064016106e5565b336000908152606560205260409020548111156112d357600080fd5b33600090815260656020526040812080548392906112f29084906115b5565b9091555050604051339082156108fc029083906000818181858888f19350505050158015611324573d6000803e3d6000fd5b5060405181815233907f7fcf532c15f0a6db0bd6d0e038bea71d30d808c7d98cb3bf7268a95bf5081b659060200160405180910390a250565b600054610100900460ff166113f4576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602b60248201527f496e697469616c697a61626c653a20636f6e7472616374206973206e6f74206960448201527f6e697469616c697a696e6700000000000000000000000000000000000000000060648201526084016106e5565b610bcb336111bf565b600060208083528351808285015260005b8181101561142a5785810183015185820160400152820161140e565b8181111561143c576000604083870101525b50601f017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe016929092016040019392505050565b73ffffffffffffffffffffffffffffffffffffffff811681146109da57600080fd5b600080604083850312156114a557600080fd5b82356114b081611470565b946020939093013593505050565b6000602082840312156114d057600080fd5b5035919050565b6000806000606084860312156114ec57600080fd5b83356114f781611470565b9250602084013561150781611470565b929592945050506040919091013590565b6000806040838503121561152b57600080fd5b823561153681611470565b9150602083013561154681611470565b809150509250929050565b60006020828403121561156357600080fd5b8135610d1b81611470565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b600082198211156115b0576115b061156e565b500190565b6000828210156115c7576115c761156e565b500390565b6000602082840312156115de57600080fd5b81518015158114610d1b57600080fdfea164736f6c634300080f000a"; + bytes internal constant preimageOracleCode = + hex"6080604052600436106101d85760003560e01c80639d53a64811610102578063ddcd58de11610095578063ec5efcbc11610064578063ec5efcbc14610681578063f3f480d9146106a1578063faf37bc7146106d4578063fef2b4ed146106e757600080fd5b8063ddcd58de146105d4578063e03110e11461060c578063e159261114610641578063ea7139501461066157600080fd5b8063b5e7154c116100d1578063b5e7154c14610555578063d18534b51461056c578063da35c6641461058c578063dd24f9bf146105a157600080fd5b80639d53a6481461048e5780639d7e8769146104dd578063b2e67ba8146104fd578063b4801e611461053557600080fd5b806361238bde1161017a5780637ac54767116101495780637ac54767146103ca5780638542cf50146103ea578063882856ef146104355780638dc4be111461046e57600080fd5b806361238bde1461031e5780636551927b146103565780637051472e1461038e5780637917de1d146103aa57600080fd5b80633909af5c116101b65780633909af5c146102715780634d52b4c91461029357806352f0f3ad146102a857806354fd4d50146102c857600080fd5b8063013cf08b146101dd5780630359a5631461022e5780632055b36b1461025c575b600080fd5b3480156101e957600080fd5b506101fd6101f8366004612e29565b610714565b6040805173ffffffffffffffffffffffffffffffffffffffff90931683526020830191909152015b60405180910390f35b34801561023a57600080fd5b5061024e610249366004612e6b565b610759565b604051908152602001610225565b34801561026857600080fd5b5061024e601081565b34801561027d57600080fd5b5061029161028c366004613073565b610891565b005b34801561029f57600080fd5b5061024e610ae8565b3480156102b457600080fd5b5061024e6102c336600461315f565b610b03565b3480156102d457600080fd5b506103116040518060400160405280600c81526020017f312e312e332d626574612e32000000000000000000000000000000000000000081525081565b60405161022591906131c6565b34801561032a57600080fd5b5061024e610339366004613217565b600160209081526000928352604080842090915290825290205481565b34801561036257600080fd5b5061024e610371366004612e6b565b601560209081526000928352604080842090915290825290205481565b34801561039a57600080fd5b5061024e6703782dace9d9000081565b3480156103b657600080fd5b506102916103c536600461327b565b610bd9565b3480156103d657600080fd5b5061024e6103e5366004612e29565b6110dc565b3480156103f657600080fd5b50610425610405366004613217565b600260209081526000928352604080842090915290825290205460ff1681565b6040519015158152602001610225565b34801561044157600080fd5b50610455610450366004613317565b6110f3565b60405167ffffffffffffffff9091168152602001610225565b34801561047a57600080fd5b5061029161048936600461334a565b61114d565b34801561049a57600080fd5b5061024e6104a9366004612e6b565b73ffffffffffffffffffffffffffffffffffffffff9091166000908152601860209081526040808320938352929052205490565b3480156104e957600080fd5b506102916104f8366004613396565b611248565b34801561050957600080fd5b5061024e610518366004612e6b565b601760209081526000928352604080842090915290825290205481565b34801561054157600080fd5b5061024e610550366004613317565b6113ff565b34801561056157600080fd5b5061024e620186a081565b34801561057857600080fd5b50610291610587366004613073565b611431565b34801561059857600080fd5b5060135461024e565b3480156105ad57600080fd5b507f000000000000000000000000000000000000000000000000000000000000271061024e565b3480156105e057600080fd5b5061024e6105ef366004612e6b565b601660209081526000928352604080842090915290825290205481565b34801561061857600080fd5b5061062c610627366004613217565b611840565b60408051928352602083019190915201610225565b34801561064d57600080fd5b5061029161065c36600461334a565b611931565b34801561066d57600080fd5b5061029161067c366004613422565b611a39565b34801561068d57600080fd5b5061029161069c366004613491565b611b98565b3480156106ad57600080fd5b507f000000000000000000000000000000000000000000000000000000000000007861024e565b6102916106e2366004613519565b611d1e565b3480156106f357600080fd5b5061024e610702366004612e29565b60006020819052908152604090205481565b6013818154811061072457600080fd5b60009182526020909120600290910201805460019091015473ffffffffffffffffffffffffffffffffffffffff909116915082565b73ffffffffffffffffffffffffffffffffffffffff82166000908152601560209081526040808320848452909152812054819061079c9060601c63ffffffff1690565b63ffffffff16905060005b6010811015610889578160011660010361082f5773ffffffffffffffffffffffffffffffffffffffff85166000908152601460209081526040808320878452909152902081601081106107fc576107fc613555565b01546040805160208101929092528101849052606001604051602081830303815290604052805190602001209250610870565b826003826010811061084357610843613555565b01546040805160208101939093528201526060016040516020818303038152906040528051906020012092505b60019190911c9080610881816135b3565b9150506107a7565b505092915050565b600061089d8a8a610759565b90506108c086868360208b01356108bb6108b68d6135eb565b611fea565b61202a565b80156108de57506108de83838360208801356108bb6108b68a6135eb565b610914576040517f09bde33900000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b86604001358860405160200161092a91906136ba565b6040516020818303038152906040528051906020012014610977576040517f1968a90200000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b83602001358760200135600161098d91906136f8565b146109c4576040517f9a3b119900000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b610a0c886109d28680613710565b8080601f01602080910402602001604051908101604052809392919081815260200183838082843760009201919091525061208b92505050565b610a15886121e6565b836040013588604051602001610a2b91906136ba565b6040516020818303038152906040528051906020012003610a78576040517f9843145b00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b73ffffffffffffffffffffffffffffffffffffffff8a1660009081526015602090815260408083208c8452909152902080547fffffffffffffffffffffffffffffffffffffffffffffffff0000000000000000166001179055610adc8a8a3361298e565b50505050505050505050565b6001610af660106002613897565b610b0091906138a3565b81565b6000610b0f8686612a47565b9050610b1c8360086136f8565b82101580610b2a5750602083115b15610b61576040517ffe25498700000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6000602081815260c085901b82526008959095528251828252600286526040808320858452875280832080547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff001660019081179091558484528752808320948352938652838220558181529384905292205592915050565b60608115610bf257610beb8686612af4565b9050610c2c565b85858080601f0160208091040260200160405190810160405280939291908181526020018383808284376000920191909152509293505050505b3360009081526014602090815260408083208b845290915280822081516102008101928390529160109082845b815481526020019060010190808311610c5957505050505090506000601560003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008b81526020019081526020016000205490506000610cda8260601c63ffffffff1690565b63ffffffff169050333214610d1b576040517fba092d1600000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b610d2b8260801c63ffffffff1690565b63ffffffff16600003610d6a576040517f87138d5c00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b610d748260c01c90565b67ffffffffffffffff1615610db5576040517f475a253500000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b898114610dee576040517f60f95d5a00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b610dfb89898d8886612b6d565b83516020850160888204881415608883061715610e20576307b1daf16000526004601cfd5b60405160c8810160405260005b83811015610ed0578083018051835260208101516020840152604081015160408401526060810151606084015260808101516080840152508460888301526088810460051b8b013560a883015260c882206001860195508560005b610200811015610ec5576001821615610ea55782818b0152610ec5565b8981015160009081526020938452604090209260019290921c9101610e88565b505050608801610e2d565b50505050600160106002610ee49190613897565b610eee91906138a3565b811115610f27576040517f6229572300000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b610f9c610f3a8360401c63ffffffff1690565b610f4a9063ffffffff168a6136f8565b60401b7fffffffffffffffffffffffffffffffffffffffff00000000ffffffffffffffff606084901b167fffffffffffffffffffffffffffffffff0000000000000000ffffffffffffffff8516171790565b915084156110295777ffffffffffffffffffffffffffffffffffffffffffffffff82164260c01b179150610fd68260801c63ffffffff1690565b63ffffffff16610fec8360401c63ffffffff1690565b63ffffffff1614611029576040517f7b1dafd100000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b3360009081526014602090815260408083208e8452909152902061104f90846010612d9f565b503360008181526018602090815260408083208f8452825280832080546001810182559084528284206004820401805460039092166008026101000a67ffffffffffffffff818102199093164390931602919091179055838352601582528083208f8452909152812084905560609190911b81523690601437366014016000a05050505050505050505050565b600381601081106110ec57600080fd5b0154905081565b6018602052826000526040600020602052816000526040600020818154811061111b57600080fd5b906000526020600020906004918282040191900660080292509250509054906101000a900467ffffffffffffffff1681565b60443560008060088301861061116b5763fe2549876000526004601cfd5b60c083901b60805260888386823786600882030151915060206000858360025afa90508061119857600080fd5b50600080517effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff167f0400000000000000000000000000000000000000000000000000000000000000178082526002602090815260408084208a8552825280842080547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff001660019081179091558385528252808420998452988152888320939093558152908190529490942055505050565b600080603087600037602060006030600060025afa806112705763f91129696000526004601cfd5b6000517effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff167f010000000000000000000000000000000000000000000000000000000000000017608081815260a08c905260c08b905260308a60e037603088609083013760008060c083600a5afa9250826112f2576309bde3396000526004601cfd5b602886106113085763fe2549876000526004601cfd5b6000602882015278200000000000000000000000000000000000000000000000008152600881018b905285810151935060308a8237603081019b909b52505060509098207effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff167f0500000000000000000000000000000000000000000000000000000000000000176000818152600260209081526040808320868452825280832080547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0016600190811790915584845282528083209583529481528482209a909a559081528089529190912096909655505050505050565b6014602052826000526040600020602052816000526040600020816010811061142757600080fd5b0154925083915050565b73ffffffffffffffffffffffffffffffffffffffff891660009081526015602090815260408083208b845290915290205467ffffffffffffffff8116156114a4576040517fc334f06900000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6114ae8160c01c90565b67ffffffffffffffff166000036114f1576040517f55d4cbf900000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b7f000000000000000000000000000000000000000000000000000000000000007861151c8260c01c90565b6115309067ffffffffffffffff16426138a3565b11611567576040517f55d4cbf900000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b60006115738b8b610759565b905061158c87878360208c01356108bb6108b68e6135eb565b80156115aa57506115aa84848360208901356108bb6108b68b6135eb565b6115e0576040517f09bde33900000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b8760400135896040516020016115f691906136ba565b6040516020818303038152906040528051906020012014611643576040517f1968a90200000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b84602001358860200135600161165991906136f8565b14158061168b575060016116738360601c63ffffffff1690565b61167d91906138ba565b63ffffffff16856020013514155b156116c2576040517f9a3b119900000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6116d0896109d28780613710565b6116d9896121e6565b60006116e48a612cc0565b7effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff167f0200000000000000000000000000000000000000000000000000000000000000179050600061173b8460a01c63ffffffff1690565b67ffffffffffffffff169050600160026000848152602001908152602001600020600083815260200190815260200160002060006101000a81548160ff021916908315150217905550601760008e73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008d8152602001908152602001600020546001600084815260200190815260200160002060008381526020019081526020016000208190555061180d8460801c63ffffffff1690565b600083815260208190526040902063ffffffff9190911690556118318d8d8161298e565b50505050505050505050505050565b6000828152600260209081526040808320848452909152812054819060ff166118c9576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601460248201527f7072652d696d616765206d757374206578697374000000000000000000000000604482015260640160405180910390fd5b50600083815260208181526040909120546118e58160086136f8565b6118f08560206136f8565b1061190e57836119018260086136f8565b61190b91906138a3565b91505b506000938452600160209081526040808620948652939052919092205492909150565b60443560008060088301861061194f5763fe2549876000526004601cfd5b60c083901b6080526088838682378087017ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff80151908490207effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff167f02000000000000000000000000000000000000000000000000000000000000001760008181526002602090815260408083208b8452825280832080547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0016600190811790915584845282528083209a83529981528982209390935590815290819052959095209190915550505050565b60008060008060808860601b81528760c01b6014820152858782601c0137601c860181207effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff167f0600000000000000000000000000000000000000000000000000000000000000179350604088026260216001603f5a021015611ac35763dd629f866000526004601cfd5b6000808783601c018c5afa94503d6001019150600882018a10611aee5763fe2549876000526004601cfd5b60c082901b81526008018481533d6000600183013e89017ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff8015160008481526002602090815260408083208d8452825280832080547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0016600190811790915587845282528083209c83529b81528b8220929092559384528390529790912096909655505050505050565b6000611ba48686610759565b9050611bbd83838360208801356108bb6108b68a6135eb565b611bf3576040517f09bde33900000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b602084013515611c2f576040517f9a3b119900000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b611c37612ddd565b611c45816109d28780613710565b611c4e816121e6565b846040013581604051602001611c6491906136ba565b6040516020818303038152906040528051906020012003611cb1576040517f9843145b00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b73ffffffffffffffffffffffffffffffffffffffff87166000908152601560209081526040808320898452909152902080547fffffffffffffffffffffffffffffffffffffffffffffffff0000000000000000166001179055611d1587873361298e565b50505050505050565b6703782dace9d90000341015611d60576040517fe92c469f00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b333214611d99576040517fba092d1600000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b611da48160086138df565b63ffffffff168263ffffffff1610611de8576040517ffe25498700000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b7f00000000000000000000000000000000000000000000000000000000000027108163ffffffff161015611e48576040517f7b1dafd100000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b336000908152601560209081526040808320868452909152902054611e738160801c63ffffffff1690565b63ffffffff1615611eb0576040517f0dc149f000000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b608082901b7fffffffffffffffffffffffff00000000ffffffffffffffffffffffffffffffff60a085901b167fffffffffffffffff0000000000000000ffffffffffffffffffffffffffffffff83161717336000818152601560209081526040808320898452825280832094909455835180850185528381528082018981526013805460018101825590855291517f66de8ffda797e3de9c05e8fc57b3bf0ec28a930d40b0d285d93c06501cf6a090600290930292830180547fffffffffffffffffffffffff00000000000000000000000000000000000000001673ffffffffffffffffffffffffffffffffffffffff909216919091179055517f66de8ffda797e3de9c05e8fc57b3bf0ec28a930d40b0d285d93c06501cf6a0919091015591815260168252828120968152959052909320349055505050565b600081600001518260200151836040015160405160200161200d93929190613907565b604051602081830303815290604052805190602001209050919050565b60008160005b601081101561207e578060051b880135600186831c16600181146120635760008481526020839052604090209350612074565b600082815260208590526040902093505b5050600101612030565b5090931495945050505050565b608881511461209957600080fd5b602081016020830161211a565b8260031b8201518060001a8160011a60081b178160021a60101b8260031a60181b17178160041a60201b8260051a60281b178260061a60301b8360071a60381b1717179050612114816120ff868560059190911b015190565b1867ffffffffffffffff16600586901b840152565b50505050565b612126600083836120a6565b612132600183836120a6565b61213e600283836120a6565b61214a600383836120a6565b612156600483836120a6565b612162600583836120a6565b61216e600683836120a6565b61217a600783836120a6565b612186600883836120a6565b612192600983836120a6565b61219e600a83836120a6565b6121aa600b83836120a6565b6121b6600c83836120a6565b6121c2600d83836120a6565b6121ce600e83836120a6565b6121da600f83836120a6565b612114601083836120a6565b6040805178010000000000008082800000000000808a8000000080008000602082015279808b00000000800000018000000080008081800000000000800991810191909152788a00000000000000880000000080008009000000008000000a60608201527b8000808b800000000000008b8000000000008089800000000000800360808201527f80000000000080028000000000000080000000000000800a800000008000000a60a08201527f800000008000808180000000000080800000000080000001800000008000800860c082015260009060e0016040516020818303038152906040529050602082016020820161286e565b6102808101516101e082015161014083015160a0840151845118189118186102a082015161020083015161016084015160c0850151602086015118189118186102c083015161022084015161018085015160e0860151604087015118189118186102e08401516102408501516101a0860151610100870151606088015118189118186103008501516102608601516101c0870151610120880151608089015118189118188084603f1c6123998660011b67ffffffffffffffff1690565b18188584603f1c6123b48660011b67ffffffffffffffff1690565b18188584603f1c6123cf8660011b67ffffffffffffffff1690565b181895508483603f1c6123ec8560011b67ffffffffffffffff1690565b181894508387603f1c6124098960011b67ffffffffffffffff1690565b60208b01518b51861867ffffffffffffffff168c5291189190911897508118600181901b603f9190911c18935060c08801518118601481901c602c9190911b1867ffffffffffffffff1660208901526101208801518718602c81901c60149190911b1867ffffffffffffffff1660c08901526102c08801518618600381901c603d9190911b1867ffffffffffffffff166101208901526101c08801518718601981901c60279190911b1867ffffffffffffffff166102c08901526102808801518218602e81901c60129190911b1867ffffffffffffffff166101c089015260408801518618600281901c603e9190911b1867ffffffffffffffff166102808901526101808801518618601581901c602b9190911b1867ffffffffffffffff1660408901526101a08801518518602781901c60199190911b1867ffffffffffffffff166101808901526102608801518718603881901c60089190911b1867ffffffffffffffff166101a08901526102e08801518518600881901c60389190911b1867ffffffffffffffff166102608901526101e08801518218601781901c60299190911b1867ffffffffffffffff166102e089015260808801518718602581901c601b9190911b1867ffffffffffffffff166101e08901526103008801518718603281901c600e9190911b1867ffffffffffffffff1660808901526102a08801518118603e81901c60029190911b1867ffffffffffffffff166103008901526101008801518518600981901c60379190911b1867ffffffffffffffff166102a08901526102008801518118601381901c602d9190911b1867ffffffffffffffff1661010089015260a08801518218601c81901c60249190911b1867ffffffffffffffff1661020089015260608801518518602481901c601c9190911b1867ffffffffffffffff1660a08901526102408801518518602b81901c60159190911b1867ffffffffffffffff1660608901526102208801518618603181901c600f9190911b1867ffffffffffffffff166102408901526101608801518118603681901c600a9190911b1867ffffffffffffffff166102208901525060e08701518518603a81901c60069190911b1867ffffffffffffffff166101608801526101408701518118603d81901c60039190911b1867ffffffffffffffff1660e0880152505067ffffffffffffffff81166101408601525b5050505050565b600582811b8201805160018501831b8401805160028701851b8601805160038901871b8801805160048b0190981b8901805167ffffffffffffffff861985168918811690995283198a16861889169096528819861683188816909352841986168818871690528419831684189095169052919391929190611d15565b612808600082612781565b612813600582612781565b61281e600a82612781565b612829600f82612781565b612834601482612781565b50565b612840816122dc565b612849816127fd565b600383901b820151815160c09190911c9061211490821867ffffffffffffffff168352565b61287a60008284612837565b61288660018284612837565b61289260028284612837565b61289e60038284612837565b6128aa60048284612837565b6128b660058284612837565b6128c260068284612837565b6128ce60078284612837565b6128da60088284612837565b6128e660098284612837565b6128f2600a8284612837565b6128fe600b8284612837565b61290a600c8284612837565b612916600d8284612837565b612922600e8284612837565b61292e600f8284612837565b61293a60108284612837565b61294660118284612837565b61295260128284612837565b61295e60138284612837565b61296a60148284612837565b61297660158284612837565b61298260168284612837565b61211460178284612837565b73ffffffffffffffffffffffffffffffffffffffff83811660009081526016602090815260408083208684529091528082208054908390559051909284169083908381818185875af1925050503d8060008114612a07576040519150601f19603f3d011682016040523d82523d6000602084013e612a0c565b606091505b505090508061277a576040517f83e6cc6b00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b7f01000000000000000000000000000000000000000000000000000000000000007effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff831617612aed818360408051600093845233602052918152606090922091527effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff167f01000000000000000000000000000000000000000000000000000000000000001790565b9392505050565b6060604051905081602082018181018286833760888306808015612b3d5760888290038501848101848103803687375060806001820353506001845160001a1784538652612b54565b608836843760018353608060878401536088850186525b5050505050601f19603f82510116810160405292915050565b6000612b7f8260a01c63ffffffff1690565b67ffffffffffffffff1690506000612b9d8360801c63ffffffff1690565b63ffffffff1690506000612bb78460401c63ffffffff1690565b63ffffffff169050600883108015612bcd575080155b15612c015760c082901b6000908152883560085283513382526017602090815260408084208a855290915290912055612cb6565b60088310158015612c1f575080612c196008856138a3565b93508310155b8015612c335750612c3087826136f8565b83105b15612cb6576000612c4482856138a3565b905087612c528260206136f8565b10158015612c5e575085155b15612c95576040517ffe25498700000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b3360009081526017602090815260408083208a845290915290209089013590555b5050505050505050565b6000612d43565b66ff00ff00ff00ff8160081c1667ff00ff00ff00ff00612cf18360081b67ffffffffffffffff1690565b1617905065ffff0000ffff8160101c1667ffff0000ffff0000612d1e8360101b67ffffffffffffffff1690565b1617905060008160201c612d3c8360201b67ffffffffffffffff1690565b1792915050565b60808201516020830190612d5b90612cc7565b612cc7565b6040820151612d6990612cc7565b60401b17612d81612d5660018460059190911b015190565b825160809190911b90612d9390612cc7565b60c01b17179392505050565b8260108101928215612dcd579160200282015b82811115612dcd578251825591602001919060010190612db2565b50612dd9929150612df5565b5090565b6040518060200160405280612df0612e0a565b905290565b5b80821115612dd95760008155600101612df6565b6040518061032001604052806019906020820280368337509192915050565b600060208284031215612e3b57600080fd5b5035919050565b803573ffffffffffffffffffffffffffffffffffffffff81168114612e6657600080fd5b919050565b60008060408385031215612e7e57600080fd5b612e8783612e42565b946020939093013593505050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b604051610320810167ffffffffffffffff81118282101715612ee857612ee8612e95565b60405290565b6040516060810167ffffffffffffffff81118282101715612ee857612ee8612e95565b604051601f82017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe016810167ffffffffffffffff81118282101715612f5857612f58612e95565b604052919050565b803567ffffffffffffffff81168114612e6657600080fd5b6000610320808385031215612f8c57600080fd5b604051602080820182811067ffffffffffffffff82111715612fb057612fb0612e95565b806040525081935085601f860112612fc757600080fd5b612fcf612ec4565b928501928087851115612fe157600080fd5b865b8581101561300157612ff481612f60565b8352918301918301612fe3565b509092525091949350505050565b60006060828403121561302157600080fd5b50919050565b60008083601f84011261303957600080fd5b50813567ffffffffffffffff81111561305157600080fd5b6020830191508360208260051b850101111561306c57600080fd5b9250929050565b60008060008060008060008060006103e08a8c03121561309257600080fd5b61309b8a612e42565b985060208a013597506130b18b60408c01612f78565b96506103608a013567ffffffffffffffff808211156130cf57600080fd5b6130db8d838e0161300f565b97506103808c01359150808211156130f257600080fd5b6130fe8d838e01613027565b90975095506103a08c013591508082111561311857600080fd5b6131248d838e0161300f565b94506103c08c013591508082111561313b57600080fd5b506131488c828d01613027565b915080935050809150509295985092959850929598565b600080600080600060a0868803121561317757600080fd5b505083359560208501359550604085013594606081013594506080013592509050565b60005b838110156131b557818101518382015260200161319d565b838111156121145750506000910152565b60208152600082518060208401526131e581604085016020870161319a565b601f017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0169190910160400192915050565b6000806040838503121561322a57600080fd5b50508035926020909101359150565b60008083601f84011261324b57600080fd5b50813567ffffffffffffffff81111561326357600080fd5b60208301915083602082850101111561306c57600080fd5b600080600080600080600060a0888a03121561329657600080fd5b8735965060208801359550604088013567ffffffffffffffff808211156132bc57600080fd5b6132c88b838c01613239565b909750955060608a01359150808211156132e157600080fd5b506132ee8a828b01613027565b9094509250506080880135801515811461330757600080fd5b8091505092959891949750929550565b60008060006060848603121561332c57600080fd5b61333584612e42565b95602085013595506040909401359392505050565b60008060006040848603121561335f57600080fd5b83359250602084013567ffffffffffffffff81111561337d57600080fd5b61338986828701613239565b9497909650939450505050565b600080600080600080600060a0888a0312156133b157600080fd5b8735965060208801359550604088013567ffffffffffffffff808211156133d757600080fd5b6133e38b838c01613239565b909750955060608a01359150808211156133fc57600080fd5b506134098a828b01613239565b989b979a50959894979596608090950135949350505050565b60008060008060006080868803121561343a57600080fd5b8535945061344a60208701612e42565b935061345860408701612f60565b9250606086013567ffffffffffffffff81111561347457600080fd5b61348088828901613239565b969995985093965092949392505050565b6000806000806000608086880312156134a957600080fd5b6134b286612e42565b945060208601359350604086013567ffffffffffffffff808211156134d657600080fd5b6134e289838a0161300f565b945060608801359150808211156134f857600080fd5b5061348088828901613027565b803563ffffffff81168114612e6657600080fd5b60008060006060848603121561352e57600080fd5b8335925061353e60208501613505565b915061354c60408501613505565b90509250925092565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b60007fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff82036135e4576135e4613584565b5060010190565b6000606082360312156135fd57600080fd5b613605612eee565b823567ffffffffffffffff8082111561361d57600080fd5b9084019036601f83011261363057600080fd5b813560208282111561364457613644612e95565b613674817fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0601f85011601612f11565b9250818352368183860101111561368a57600080fd5b81818501828501376000918301810191909152908352848101359083015250604092830135928101929092525090565b81516103208201908260005b60198110156136ef57825167ffffffffffffffff168252602092830192909101906001016136c6565b50505092915050565b6000821982111561370b5761370b613584565b500190565b60008083357fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe184360301811261374557600080fd5b83018035915067ffffffffffffffff82111561376057600080fd5b60200191503681900382131561306c57600080fd5b600181815b808511156137ce57817fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff048211156137b4576137b4613584565b808516156137c157918102915b93841c939080029061377a565b509250929050565b6000826137e557506001613891565b816137f257506000613891565b816001811461380857600281146138125761382e565b6001915050613891565b60ff84111561382357613823613584565b50506001821b613891565b5060208310610133831016604e8410600b8410161715613851575081810a613891565b61385b8383613775565b807fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0482111561388d5761388d613584565b0290505b92915050565b6000612aed83836137d6565b6000828210156138b5576138b5613584565b500390565b600063ffffffff838116908316818110156138d7576138d7613584565b039392505050565b600063ffffffff8083168185168083038211156138fe576138fe613584565b01949350505050565b6000845161391981846020890161319a565b9190910192835250602082015260400191905056fea164736f6c634300080f000a"; + bytes internal constant mipsCode = + hex"608060405234801561001057600080fd5b50600436106100415760003560e01c806354fd4d50146100465780637dc0d1d014610098578063e14ced32146100dc575b600080fd5b6100826040518060400160405280600c81526020017f312e312e312d626574612e33000000000000000000000000000000000000000081525081565b60405161008f9190612237565b60405180910390f35b60405173ffffffffffffffffffffffffffffffffffffffff7f0000000000000000000000007a9eab4ce99d157aee7a02e95b366e972a2d5b0b16815260200161008f565b6100ef6100ea3660046122ec565b6100fd565b60405190815260200161008f565b60006101076121ad565b6080811461011457600080fd5b6040516106001461012457600080fd5b6084871461013157600080fd5b6101a4851461013f57600080fd5b8635608052602087013560a052604087013560e090811c60c09081526044890135821c82526048890135821c61010052604c890135821c610120526050890135821c61014052605489013590911c61016052605888013560f890811c610180526059890135901c6101a0819052605a89013590911c6101c05260628801906101e09060018111156101f5576040517f0136cc76000000000000000000000000000000000000000000000000000000008152600481fd5b506020810181511461020657600080fd5b60200160005b602081101561023057823560e01c825260049092019160209091019060010161020c565b5050508061012001511561024e576102466103a6565b91505061039d565b6101408101805160010167ffffffffffffffff16905260006101a49050600080600061028385606001518660000151866104f7565b9250925092508163ffffffff1660001480156102a557508063ffffffff16600c145b156102bf576102b387610521565b9550505050505061039d565b6000610339866040805160808101825260008082526020820181905291810182905260608101919091526040518060800160405280836060015163ffffffff168152602001836080015163ffffffff1681526020018360a0015163ffffffff1681526020018360c0015163ffffffff168152509050919050565b6101608701518751919250610356918391906105248888886108f9565b8652805163ffffffff9081166060808901919091526020830151821660808901526040830151821660a08901528201511660c08701526103946103a6565b96505050505050505b95945050505050565b60408051608051815260a051602082015260dc519181019190915260fc51604482015261011c51604882015261013c51604c82015261015c51605082015261017c5160548201526101805161019f5160588301526101a0516101bf5160598401526101d851605a8401526000926102009290916062830191906001811115610453576040517f0136cc76000000000000000000000000000000000000000000000000000000008152600481fd5b60005b602081101561047a57601c8601518452602090950194600490930192600101610456565b506000835283830384a060009450806001811461049a57600395506104c2565b8280156104b257600181146104bb57600296506104c0565b600096506104c0565b600196505b505b50505081900390207effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1660f89190911b17919050565b6000806000610507858786610cdf565b925050603f601a83901c8116915082165b93509350939050565b600061052b6121ad565b608090506000806000806105628561016001516040810151608082015160a083015160c084015160e0909401519294919390929091565b509350935093509350600080610ffa63ffffffff168663ffffffff16036105a75761059285858960e00151610d31565b63ffffffff1660e08a01529092509050610808565b7ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff03363ffffffff8716016105e05763400000009150610808565b7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffefe863ffffffff8716016106165760019150610808565b7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffef6a63ffffffff87160161066a57600161012088015260ff851661010088015261065d6103a6565b9998505050505050505050565b7ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff05d63ffffffff8716016107665760006040518061012001604052808763ffffffff1681526020018663ffffffff1681526020018563ffffffff16815260200189602001518152602001896040015163ffffffff1681526020018b81526020017f0000000000000000000000007a9eab4ce99d157aee7a02e95b366e972a2d5b0b73ffffffffffffffffffffffffffffffffffffffff1681526020016107386101a4600160ff16610380020190565b81528951602090910152905061074d81610dc5565b8b5263ffffffff1660408b015290935091506108089050565b7ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff05c63ffffffff8716016107cb57602087015160408801516107b1918791879187916105248d5161103d565b63ffffffff1660408b015260208a01529092509050610808565b7ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff02963ffffffff871601610808576108028585611133565b90925090505b6000610882886040805160808101825260008082526020820181905291810182905260608101919091526040518060800160405280836060015163ffffffff168152602001836080015163ffffffff1681526020018360a0015163ffffffff1681526020018360c0015163ffffffff168152509050919050565b61016089015163ffffffff85811660408084019190915285821660e0909301929092526020830180518083168086526004909101831682526060808e01919091529051821660808d015291830151811660a08c0152908201511660c08a015290506108eb6103a6565b9a9950505050505050505050565b84600263ffffffff8416148061091557508263ffffffff166003145b156109675760006002856303ffffff1663ffffffff16901b896020015163f00000001617905061096189898663ffffffff1660021461095557601f610958565b60005b60ff16846111e8565b50610cd4565b600080601f601087901c8116908a90601589901c166020811061098c5761098c612360565b602002015192508063ffffffff871615806109ad57508663ffffffff16601c145b156109df578a8263ffffffff16602081106109ca576109ca612360565b6020020151925050601f600b88901c16610a96565b60208763ffffffff161015610a41578663ffffffff16600c1480610a0957508663ffffffff16600d145b80610a1a57508663ffffffff16600e145b15610a2b578761ffff169250610a96565b610a3a8861ffff1660106112c0565b9250610a96565b60288763ffffffff16101580610a5d57508663ffffffff166022145b80610a6e57508663ffffffff166026145b15610a96578a8263ffffffff1660208110610a8b57610a8b612360565b602002015192508190505b60048763ffffffff1610158015610ab3575060088763ffffffff16105b80610ac457508663ffffffff166001145b15610ae057610ad78c8c898b8689611333565b50505050610cd4565b63ffffffff6000602089831610610b4557610b008a61ffff1660106112c0565b9095019463fffffffc8616610b168d828e610cdf565b915060288a63ffffffff1610158015610b3657508963ffffffff16603014155b15610b4357809250600093505b505b6000610b558b8b8b8a8a87611521565b63ffffffff1690508963ffffffff166000148015610b7a575060088963ffffffff1610155b8015610b8c5750601c8963ffffffff16105b15610c54578863ffffffff1660081480610bac57508863ffffffff166009145b15610bdf57610bd38f8f8b63ffffffff16600814610bca5786610bcd565b60005b8a6111e8565b50505050505050610cd4565b8863ffffffff16600a03610c0157610bd38f8f868a63ffffffff8b1615611c3e565b8863ffffffff16600b03610c2457610bd38f8f868a63ffffffff8b161515611c3e565b60108963ffffffff1610158015610c415750601c8963ffffffff16105b15610c5457610bd38f8f8b8a8a89611d0e565b8963ffffffff166038148015610c6f575063ffffffff851615155b15610c9f5760018e8663ffffffff1660208110610c8e57610c8e612360565b63ffffffff90921660209290920201525b8263ffffffff1663ffffffff14610cbe57610cbb838d83611fc7565b97505b610ccc8f8f86846001611c3e565b505050505050505b979650505050505050565b600080610ced858585612069565b909250905080610d29576040517f8e77b2b700000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b509392505050565b6000808284610fff811615610d4b57610fff811661100003015b8663ffffffff16600003610db75784935090810190636000000063ffffffff83161180610d8357508463ffffffff168263ffffffff16105b80610d9957508563ffffffff168163ffffffff16105b15610db2575063ffffffff925060169150839050610518565b610dbb565b8693505b5093509350939050565b6101008101516080820151825160009283929163ffffffff161561103657845163ffffffff167ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffb01610ff0576000610e31866101000151876020015163fffffffc168860e00151610cdf565b606087015190915060001a600103610eb357610ead86606001518760a0015160408051600093845233602052918152606090922091527effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff167f01000000000000000000000000000000000000000000000000000000000000001790565b60608701525b6000808760c0015173ffffffffffffffffffffffffffffffffffffffff1663e03110e189606001518a608001516040518363ffffffff1660e01b8152600401610f0c92919091825263ffffffff16602082015260400190565b6040805180830381865afa158015610f28573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610f4c919061238f565b60208a015160408b01519294509092509060038216600481900384811015610f72578094505b5083821015610f7f578193505b8460088502610100031c9450846008828660040303021b9450600180600883600403021b036001806008878560040303021b03915081198116905085811988161796505050610fdd8a6020015163fffffffc168b60e0015187611fc7565b9298505050938601939250611036915050565b845163ffffffff167ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffd0161102a5784604001519350611036565b63ffffffff9350600992505b9193509193565b600080858563ffffffff8b166001148061105d575063ffffffff8b166002145b8061106e575063ffffffff8b166004145b1561107b57889350611125565b7ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffa63ffffffff8c16016111195760006110bb868c63fffffffc1689610cdf565b90508860038c166004038b8110156110d157809b505b8b965086900360089081029290921c7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff600193880293841b0116911b17915060009050611125565b63ffffffff9350600992505b975097509750979350505050565b60008063ffffffff83166003036111d65763ffffffff8416158061115d575063ffffffff84166005145b8061116e575063ffffffff84166003145b1561117c57600091506111e1565b63ffffffff841660011480611197575063ffffffff84166002145b806111a8575063ffffffff84166006145b806111b9575063ffffffff84166004145b156111c757600191506111e1565b5063ffffffff905060096111e1565b5063ffffffff905060165b9250929050565b836000015160040163ffffffff16846020015163ffffffff161461126d576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601260248201527f6a756d7020696e2064656c617920736c6f74000000000000000000000000000060448201526064015b60405180910390fd5b835160208501805163ffffffff90811687528381169091528316156112b95780600801848463ffffffff16602081106112a8576112a8612360565b63ffffffff90921660209290920201525b5050505050565b600063ffffffff8381167fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff80850183169190911c821615159160016020869003821681901b830191861691821b92911b018261131d57600061131f565b815b90861663ffffffff16179250505092915050565b6000866000015160040163ffffffff16876020015163ffffffff16146113b5576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601460248201527f6272616e636820696e2064656c617920736c6f740000000000000000000000006044820152606401611264565b8463ffffffff16600414806113d057508463ffffffff166005145b15611447576000868463ffffffff16602081106113ef576113ef612360565b602002015190508063ffffffff168363ffffffff1614801561141757508563ffffffff166004145b8061143f57508063ffffffff168363ffffffff161415801561143f57508563ffffffff166005145b9150506114c4565b8463ffffffff166006036114645760008260030b131590506114c4565b8463ffffffff166007036114805760008260030b1390506114c4565b8463ffffffff166001036114c457601f601085901c1660008190036114a95760008360030b1291505b8063ffffffff166001036114c25760008360030b121591505b505b8651602088015163ffffffff16885281156115055760026114ea8661ffff1660106112c0565b63ffffffff90811690911b8201600401166020890152611517565b60208801805160040163ffffffff1690525b5050505050505050565b600063ffffffff8616158061154e575060088663ffffffff161015801561154e5750600f8663ffffffff16105b1561194e578560088114611591576009811461159a57600a81146115a357600b81146115ac57600c81146115b557600d81146115be57600e81146115c7576115cc565b602095506115cc565b602195506115cc565b602a95506115cc565b602b95506115cc565b602495506115cc565b602595506115cc565b602695505b508463ffffffff166000036115f1575063ffffffff8216601f600688901c161b611c34565b8463ffffffff16600203611615575063ffffffff8216601f600688901c161c611c34565b8463ffffffff1660030361164957601f600688901c1661164163ffffffff8516821c60208390036112c0565b915050611c34565b8463ffffffff16600403611669575063ffffffff8216601f84161b611c34565b8463ffffffff16600603611689575063ffffffff8216601f84161c611c34565b8463ffffffff166007036116b157601f841661164163ffffffff8516821c60208390036112c0565b8463ffffffff166008036116c6575082611c34565b8463ffffffff166009036116db575082611c34565b8463ffffffff16600a036116f0575082611c34565b8463ffffffff16600b03611705575082611c34565b8463ffffffff16600c0361171a575082611c34565b8463ffffffff16600f0361172f575082611c34565b8463ffffffff16601003611744575082611c34565b8463ffffffff16601103611759575082611c34565b8463ffffffff1660120361176e575082611c34565b8463ffffffff16601303611783575082611c34565b8463ffffffff16601803611798575082611c34565b8463ffffffff166019036117ad575082611c34565b8463ffffffff16601a036117c2575082611c34565b8463ffffffff16601b036117d7575082611c34565b8463ffffffff166020036117ee5750828201611c34565b8463ffffffff166021036118055750828201611c34565b8463ffffffff1660220361181c5750818303611c34565b8463ffffffff166023036118335750818303611c34565b8463ffffffff1660240361184a5750828216611c34565b8463ffffffff166025036118615750828217611c34565b8463ffffffff166026036118785750828218611c34565b8463ffffffff16602703611890575082821719611c34565b8463ffffffff16602a036118bf578260030b8460030b126118b25760006118b5565b60015b60ff169050611c34565b8463ffffffff16602b036118e7578263ffffffff168463ffffffff16106118b25760006118b5565b6040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601360248201527f696e76616c696420696e737472756374696f6e000000000000000000000000006044820152606401611264565b6118e7565b8563ffffffff16601c036119ce578463ffffffff166002036119735750828202611c34565b8463ffffffff166020148061198e57508463ffffffff166021145b15611949578463ffffffff166020036119a5579219925b60005b63800000008516156119c7576401fffffffe600195861b1694016119a8565b9050611c34565b8563ffffffff16600f036119ef575065ffffffff0000601083901b16611c34565b8563ffffffff16602003611a23576119c78460031660080260180363ffffffff168363ffffffff16901c60ff1660086112c0565b8563ffffffff16602103611a58576119c78460021660080260100363ffffffff168363ffffffff16901c61ffff1660106112c0565b8563ffffffff16602203611a86575063ffffffff60086003851602811681811b198416918316901b17611c34565b8563ffffffff16602303611a9b575080611c34565b8563ffffffff16602403611acc578360031660080260180363ffffffff168263ffffffff16901c60ff169050611c34565b8563ffffffff16602503611afe578360021660080260100363ffffffff168263ffffffff16901c61ffff169050611c34565b8563ffffffff16602603611b2f575063ffffffff60086003851602601803811681811c198416918316901c17611c34565b8563ffffffff16602803611b64575060ff63ffffffff60086003861602601803811682811b9091188316918416901b17611c34565b8563ffffffff16602903611b9a575061ffff63ffffffff60086002861602601003811682811b9091188316918416901b17611c34565b8563ffffffff16602a03611bc8575063ffffffff60086003851602811681811c198316918416901c17611c34565b8563ffffffff16602b03611bdd575081611c34565b8563ffffffff16602e03611c0e575063ffffffff60086003851602601803811681811b198316918416901b17611c34565b8563ffffffff16603003611c23575080611c34565b8563ffffffff166038036118e75750815b9695505050505050565b60208363ffffffff1610611cae576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152600e60248201527f76616c69642072656769737465720000000000000000000000000000000000006044820152606401611264565b63ffffffff831615801590611cc05750805b15611cef5781848463ffffffff1660208110611cde57611cde612360565b63ffffffff90921660209290920201525b5050505060208101805163ffffffff8082169093526004019091169052565b60008463ffffffff16601003611d2957506060860151611f6f565b8463ffffffff16601103611d485763ffffffff84166060880152611f6f565b8463ffffffff16601203611d6157506040860151611f6f565b8463ffffffff16601303611d805763ffffffff84166040880152611f6f565b8463ffffffff16601803611db45763ffffffff600385810b9085900b02602081901c821660608a0152166040880152611f6f565b8463ffffffff16601903611de55763ffffffff84811681851602602081901c821660608a0152166040880152611f6f565b8463ffffffff16601a03611ea8578260030b600003611e60576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601660248201527f4d4950533a206469766973696f6e206279207a65726f000000000000000000006044820152606401611264565b8260030b8460030b81611e7557611e756123b3565b0763ffffffff166060880152600383810b9085900b81611e9757611e976123b3565b0563ffffffff166040880152611f6f565b8463ffffffff16601b03611f6f578263ffffffff16600003611f26576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601660248201527f4d4950533a206469766973696f6e206279207a65726f000000000000000000006044820152606401611264565b8263ffffffff168463ffffffff1681611f4157611f416123b3565b0663ffffffff908116606089015283811690851681611f6257611f626123b3565b0463ffffffff1660408801525b63ffffffff821615611fa55780868363ffffffff1660208110611f9457611f94612360565b63ffffffff90921660209290920201525b50505060208401805163ffffffff808216909652600401909416909352505050565b6000611fd283612114565b6003841615611fe057600080fd5b6020830192601f8516601c0360031b83811b913563ffffffff90911b1916178460051c60005b601b81101561205e5760208601953582821c600116801561202e576001811461204357612054565b60008581526020839052604090209450612054565b600082815260208690526040902094505b5050600101612006565b509095945050505050565b60008061207583612114565b600384161561208357600080fd5b6020830192358460051c8160005b601b8110156120e95760208701963583821c60011680156120b957600181146120ce576120df565b600084815260208390526040902093506120df565b600082815260208590526040902093505b5050600101612091565b508714925050811561210b57601f8516601c0360031b81901c63ffffffff1692505b50935093915050565b3661038082018110156121a9576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602360248201527f636865636b207468617420746865726520697320656e6f7567682063616c6c6460448201527f61746100000000000000000000000000000000000000000000000000000000006064820152608401611264565b5050565b6040805161018081018252600080825260208201819052918101829052606081018290526080810182905260a0810182905260c0810182905260e08101829052610100810182905261012081018290526101408101919091526101608101612213612218565b905290565b6040518061040001604052806020906020820280368337509192915050565b600060208083528351808285015260005b8181101561226457858101830151858201604001528201612248565b81811115612276576000604083870101525b50601f017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe016929092016040019392505050565b60008083601f8401126122bc57600080fd5b50813567ffffffffffffffff8111156122d457600080fd5b6020830191508360208285010111156111e157600080fd5b60008060008060006060868803121561230457600080fd5b853567ffffffffffffffff8082111561231c57600080fd5b61232889838a016122aa565b9097509550602088013591508082111561234157600080fd5b5061234e888289016122aa565b96999598509660400135949350505050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b600080604083850312156123a257600080fd5b505080516020909101519092909150565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601260045260246000fdfea164736f6c634300080f000a"; + bytes internal constant anchorStateRegistryCode = + hex"608060405234801561001057600080fd5b506004361061007d5760003560e01c80635e05fbd01161005b5780635e05fbd01461012a5780637258a8071461013d578063838c2d1e14610179578063f2b4e6171461018157600080fd5b806317cf21a91461008257806335e80ab31461009757806354fd4d50146100e1575b600080fd5b610095610090366004610b4c565b6101a7565b005b6002546100b79073ffffffffffffffffffffffffffffffffffffffff1681565b60405173ffffffffffffffffffffffffffffffffffffffff90911681526020015b60405180910390f35b61011d6040518060400160405280600c81526020017f322e302e312d626574612e32000000000000000000000000000000000000000081525081565b6040516100d89190610bea565b610095610138366004610cc6565b61061c565b61016461014b366004610df0565b6001602081905260009182526040909120805491015482565b604080519283526020830191909152016100d8565b610095610853565b7f0000000000000000000000005207cfa0166e8de0fcdfd78b4d17b68587be306d6100b7565b600260009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1663452a93206040518163ffffffff1660e01b8152600401602060405180830381865afa158015610214573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906102389190610e0d565b73ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff161461029c576040517f82b4290000000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b60008060008373ffffffffffffffffffffffffffffffffffffffff1663fa24f7436040518163ffffffff1660e01b8152600401600060405180830381865afa1580156102ec573d6000803e3d6000fd5b505050506040513d6000823e601f3d9081017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe01682016040526103329190810190610e2a565b92509250925060007f0000000000000000000000005207cfa0166e8de0fcdfd78b4d17b68587be306d73ffffffffffffffffffffffffffffffffffffffff16635f0150cb8585856040518463ffffffff1660e01b815260040161039793929190610efb565b6040805180830381865afa1580156103b3573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906103d79190610f29565b5090508473ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff161461043f576040517f6b0f689100000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b60028573ffffffffffffffffffffffffffffffffffffffff1663200d2ed26040518163ffffffff1660e01b8152600401602060405180830381865afa15801561048c573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906104b09190610f9f565b60028111156104c1576104c1610f70565b146104f8576040517f8f8af25f00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b60405180604001604052806105788773ffffffffffffffffffffffffffffffffffffffff1663bcef3b556040518163ffffffff1660e01b8152600401602060405180830381865afa158015610551573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906105759190610fc0565b90565b81526020018673ffffffffffffffffffffffffffffffffffffffff16638b85902b6040518163ffffffff1660e01b8152600401602060405180830381865afa1580156105c8573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906105ec9190610fc0565b905263ffffffff909416600090815260016020818152604090922086518155959091015194019390935550505050565b600054610100900460ff161580801561063c5750600054600160ff909116105b806106565750303b158015610656575060005460ff166001145b6106e6576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602e60248201527f496e697469616c697a61626c653a20636f6e747261637420697320616c72656160448201527f647920696e697469616c697a6564000000000000000000000000000000000000606482015260840160405180910390fd5b600080547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00166001179055801561074457600080547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00ff166101001790555b60005b83518110156107aa57600084828151811061076457610764610fd9565b60209081029190910181015180820151905163ffffffff1660009081526001808452604090912082518155919092015191015550806107a281611008565b915050610747565b50600280547fffffffffffffffffffffffff00000000000000000000000000000000000000001673ffffffffffffffffffffffffffffffffffffffff8416179055801561084e57600080547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00ff169055604051600181527f7f26b83ff96e1f2b6a682f133852f6798a09c465da95921460cefb38474024989060200160405180910390a15b505050565b600033905060008060008373ffffffffffffffffffffffffffffffffffffffff1663fa24f7436040518163ffffffff1660e01b8152600401600060405180830381865afa1580156108a8573d6000803e3d6000fd5b505050506040513d6000823e601f3d9081017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe01682016040526108ee9190810190610e2a565b92509250925060007f0000000000000000000000005207cfa0166e8de0fcdfd78b4d17b68587be306d73ffffffffffffffffffffffffffffffffffffffff16635f0150cb8585856040518463ffffffff1660e01b815260040161095393929190610efb565b6040805180830381865afa15801561096f573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906109939190610f29565b5090508473ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff16146109fb576040517f6b0f689100000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b600160008563ffffffff1663ffffffff168152602001908152602001600020600101548573ffffffffffffffffffffffffffffffffffffffff16638b85902b6040518163ffffffff1660e01b8152600401602060405180830381865afa158015610a69573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610a8d9190610fc0565b11610a99575050505050565b60028573ffffffffffffffffffffffffffffffffffffffff1663200d2ed26040518163ffffffff1660e01b8152600401602060405180830381865afa158015610ae6573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610b0a9190610f9f565b6002811115610b1b57610b1b610f70565b146104f8575050505050565b73ffffffffffffffffffffffffffffffffffffffff81168114610b4957600080fd5b50565b600060208284031215610b5e57600080fd5b8135610b6981610b27565b9392505050565b60005b83811015610b8b578181015183820152602001610b73565b83811115610b9a576000848401525b50505050565b60008151808452610bb8816020860160208601610b70565b601f017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0169290920160200192915050565b602081526000610b696020830184610ba0565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b6040805190810167ffffffffffffffff81118282101715610c4f57610c4f610bfd565b60405290565b604051601f82017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe016810167ffffffffffffffff81118282101715610c9c57610c9c610bfd565b604052919050565b63ffffffff81168114610b4957600080fd5b8035610cc181610b27565b919050565b6000806040808486031215610cda57600080fd5b833567ffffffffffffffff80821115610cf257600080fd5b818601915086601f830112610d0657600080fd5b8135602082821115610d1a57610d1a610bfd565b610d28818360051b01610c55565b8281528181019350606092830285018201928a841115610d4757600080fd5b948201945b83861015610dd457858b0381811215610d655760008081fd5b610d6d610c2c565b8735610d7881610ca4565b81527fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe08201891315610daa5760008081fd5b610db2610c2c565b8886013581528989013586820152818601528652509485019493820193610d4c565b509650610de2888201610cb6565b955050505050509250929050565b600060208284031215610e0257600080fd5b8135610b6981610ca4565b600060208284031215610e1f57600080fd5b8151610b6981610b27565b600080600060608486031215610e3f57600080fd5b8351610e4a81610ca4565b60208501516040860151919450925067ffffffffffffffff80821115610e6f57600080fd5b818601915086601f830112610e8357600080fd5b815181811115610e9557610e95610bfd565b610ec660207fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0601f84011601610c55565b9150808252876020828501011115610edd57600080fd5b610eee816020840160208601610b70565b5080925050509250925092565b63ffffffff84168152826020820152606060408201526000610f206060830184610ba0565b95945050505050565b60008060408385031215610f3c57600080fd5b8251610f4781610b27565b602084015190925067ffffffffffffffff81168114610f6557600080fd5b809150509250929050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602160045260246000fd5b600060208284031215610fb157600080fd5b815160038110610b6957600080fd5b600060208284031215610fd257600080fd5b5051919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b60007fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff8203611060577f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b506001019056fea164736f6c634300080f000a"; + bytes internal constant acc33Code = + hex"6080604052600436106102f25760003560e01c806370872aa51161018f578063c6f0308c116100e1578063ec5e63081161008a578063fa24f74311610064578063fa24f74314610b18578063fa315aa914610b3c578063fe2bbeb214610b6f57600080fd5b8063ec5e630814610a95578063eff0f59214610ac8578063f8f43ff614610af857600080fd5b8063d6ae3cd5116100bb578063d6ae3cd514610a0f578063d8cc1a3c14610a42578063dabd396d14610a6257600080fd5b8063c6f0308c14610937578063cf09e0d0146109c1578063d5d44d80146109e257600080fd5b80638d450a9511610143578063bcef3b551161011d578063bcef3b55146108b7578063bd8da956146108f7578063c395e1ca1461091757600080fd5b80638d450a9514610777578063a445ece6146107aa578063bbdc02db1461087657600080fd5b80638129fc1c116101745780638129fc1c1461071a5780638980e0cc146107225780638b85902b1461073757600080fd5b806370872aa5146106f25780637b0f0adc1461070757600080fd5b80633fc8cef3116102485780635c0cba33116101fc5780636361506d116101d65780636361506d1461066c5780636b6716c0146106ac5780636f034409146106df57600080fd5b80635c0cba3314610604578063609d33341461063757806360e274641461064c57600080fd5b806354fd4d501161022d57806354fd4d501461055e57806357da950e146105b45780635a5fa2d9146105e457600080fd5b80633fc8cef314610518578063472777c61461054b57600080fd5b80632810e1d6116102aa57806337b1b2291161028457806337b1b229146104655780633a768463146104a55780633e3ac912146104d857600080fd5b80632810e1d6146103de5780632ad69aeb146103f357806330dbe5701461041357600080fd5b806319effeb4116102db57806319effeb414610339578063200d2ed21461038457806325fc2ace146103bf57600080fd5b806301935130146102f757806303c2924d14610319575b600080fd5b34801561030357600080fd5b506103176103123660046154e2565b610b9f565b005b34801561032557600080fd5b5061031761033436600461553d565b610ec0565b34801561034557600080fd5b506000546103669068010000000000000000900467ffffffffffffffff1681565b60405167ffffffffffffffff90911681526020015b60405180910390f35b34801561039057600080fd5b506000546103b290700100000000000000000000000000000000900460ff1681565b60405161037b919061558e565b3480156103cb57600080fd5b506008545b60405190815260200161037b565b3480156103ea57600080fd5b506103b2611566565b3480156103ff57600080fd5b506103d061040e36600461553d565b61180b565b34801561041f57600080fd5b506001546104409073ffffffffffffffffffffffffffffffffffffffff1681565b60405173ffffffffffffffffffffffffffffffffffffffff909116815260200161037b565b34801561047157600080fd5b50367ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe81013560f01c90033560601c610440565b3480156104b157600080fd5b507f000000000000000000000000180cbe2ebb9f37d3a3c542ddc2546fd160555a73610440565b3480156104e457600080fd5b50600054610508907201000000000000000000000000000000000000900460ff1681565b604051901515815260200161037b565b34801561052457600080fd5b507f000000000000000000000000ef179756ea6525afade217ca5ab0b1b5cfe0fd92610440565b6103176105593660046155cf565b611841565b34801561056a57600080fd5b506105a76040518060400160405280600c81526020017f312e332e312d626574612e32000000000000000000000000000000000000000081525081565b60405161037b9190615666565b3480156105c057600080fd5b506008546009546105cf919082565b6040805192835260208301919091520161037b565b3480156105f057600080fd5b506103d06105ff366004615679565b611853565b34801561061057600080fd5b507f000000000000000000000000970670459734a83899773a0fd45941b5afc1200e610440565b34801561064357600080fd5b506105a761188d565b34801561065857600080fd5b506103176106673660046156b7565b61189b565b34801561067857600080fd5b50367ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe81013560f01c9003603401356103d0565b3480156106b857600080fd5b507f0000000000000000000000000000000000000000000000000000000000000000610366565b6103176106ed3660046156e9565b611a42565b3480156106fe57600080fd5b506009546103d0565b6103176107153660046155cf565b61251b565b610317612528565b34801561072e57600080fd5b506002546103d0565b34801561074357600080fd5b50367ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe81013560f01c9003605401356103d0565b34801561078357600080fd5b507f00000000000000000000000000000000000000000000000000000000000000006103d0565b3480156107b657600080fd5b506108226107c5366004615679565b6007602052600090815260409020805460019091015460ff821691610100810463ffffffff1691650100000000009091046fffffffffffffffffffffffffffffffff169073ffffffffffffffffffffffffffffffffffffffff1684565b60408051941515855263ffffffff90931660208501526fffffffffffffffffffffffffffffffff9091169183019190915273ffffffffffffffffffffffffffffffffffffffff16606082015260800161037b565b34801561088257600080fd5b5060405163ffffffff7f000000000000000000000000000000000000000000000000000000000000000016815260200161037b565b3480156108c357600080fd5b50367ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe81013560f01c9003601401356103d0565b34801561090357600080fd5b50610366610912366004615679565b612a81565b34801561092357600080fd5b506103d0610932366004615728565b612c60565b34801561094357600080fd5b50610957610952366004615679565b612e43565b6040805163ffffffff909816885273ffffffffffffffffffffffffffffffffffffffff968716602089015295909416948601949094526fffffffffffffffffffffffffffffffff9182166060860152608085015291821660a08401521660c082015260e00161037b565b3480156109cd57600080fd5b506000546103669067ffffffffffffffff1681565b3480156109ee57600080fd5b506103d06109fd3660046156b7565b60036020526000908152604090205481565b348015610a1b57600080fd5b507f00000000000000000000000000000000000000000000000000000000000003856103d0565b348015610a4e57600080fd5b50610317610a5d36600461575a565b612eda565b348015610a6e57600080fd5b507f00000000000000000000000000000000000000000000000000000000000004b0610366565b348015610aa157600080fd5b507f00000000000000000000000000000000000000000000000000000000000000046103d0565b348015610ad457600080fd5b50610508610ae3366004615679565b60046020526000908152604090205460ff1681565b348015610b0457600080fd5b50610317610b133660046155cf565b613509565b348015610b2457600080fd5b50610b2d6139c6565b60405161037b939291906157e4565b348015610b4857600080fd5b507f00000000000000000000000000000000000000000000000000000000000000086103d0565b348015610b7b57600080fd5b50610508610b8a366004615679565b60066020526000908152604090205460ff1681565b60008054700100000000000000000000000000000000900460ff166002811115610bcb57610bcb61555f565b14610c02576040517f67fe195000000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6000547201000000000000000000000000000000000000900460ff1615610c55576040517f0ea2e75200000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b610c8c367ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe81013560f01c90036014013590565b90565b610ca3610c9e36869003860186615838565b613a41565b14610cda576040517f9cc00b5b00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b82606001358282604051610cef9291906158c5565b604051809103902014610d2e576040517fd81d583b00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6000610d77610d7284848080601f016020809104026020016040519081016040528093929190818152602001838380828437600092019190915250613a9d92505050565b613b0a565b90506000610d9e82600881518110610d9157610d916158d5565b6020026020010151613cc0565b9050602081511115610ddc576040517fd81d583b00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b602081810151825190910360031b1c367ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe81013560f01c9003605401358103610e51576040517fb8ed883000000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b5050600180547fffffffffffffffffffffffff000000000000000000000000000000000000000016331790555050600080547fffffffffffffffffffffffffff00ffffffffffffffffffffffffffffffffffff1672010000000000000000000000000000000000001790555050565b60008054700100000000000000000000000000000000900460ff166002811115610eec57610eec61555f565b14610f23576040517f67fe195000000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b600060028381548110610f3857610f386158d5565b906000526020600020906005020190506000610f5384612a81565b905067ffffffffffffffff7f00000000000000000000000000000000000000000000000000000000000004b081169082161015610fbc576040517ff2440b5300000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b60008481526006602052604090205460ff1615611005576040517ff1a9458100000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b600084815260056020526040902080548015801561102257508515155b156110bd578354640100000000900473ffffffffffffffffffffffffffffffffffffffff16600081156110555781611071565b600186015473ffffffffffffffffffffffffffffffffffffffff165b905061107d8187613d74565b50505060009485525050600660205250506040902080547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00166001179055565b6000868152600760209081526040918290208251608081018452815460ff81161515808352610100820463ffffffff16948301949094526501000000000090046fffffffffffffffffffffffffffffffff16938101939093526001015473ffffffffffffffffffffffffffffffffffffffff166060830152611160576fffffffffffffffffffffffffffffffff6040820152600181526000869003611160578195505b600086826020015163ffffffff166111789190615933565b90506000838211611189578161118b565b835b602084015190915063ffffffff165b818110156112d75760008682815481106111b6576111b66158d5565b6000918252602080832090910154808352600690915260409091205490915060ff1661120e576040517f9a07664600000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b600060028281548110611223576112236158d5565b600091825260209091206005909102018054909150640100000000900473ffffffffffffffffffffffffffffffffffffffff161580156112805750600481015460408701516fffffffffffffffffffffffffffffffff9182169116115b156112c257600181015473ffffffffffffffffffffffffffffffffffffffff16606087015260048101546fffffffffffffffffffffffffffffffff1660408701525b505080806112cf9061594b565b91505061119a565b5063ffffffff818116602085810191825260008c81526007909152604090819020865181549351928801517fffffffffffffffffffffffffffffffffffffffffffffffffffffff00000000009094169015157fffffffffffffffffffffffffffffffffffffffffffffffffffffff00000000ff161761010092909416918202939093177fffffffffffffffffffffff00000000000000000000000000000000ffffffffff16650100000000006fffffffffffffffffffffffffffffffff909316929092029190911782556060850151600190920180547fffffffffffffffffffffffff00000000000000000000000000000000000000001673ffffffffffffffffffffffffffffffffffffffff9093169290921790915584900361155b57606083015160008a815260066020526040902080547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff001660011790558915801561145757506000547201000000000000000000000000000000000000900460ff165b156114cc5760015473ffffffffffffffffffffffffffffffffffffffff1661147f818a613d74565b885473ffffffffffffffffffffffffffffffffffffffff909116640100000000027fffffffffffffffff0000000000000000000000000000000000000000ffffffff909116178855611559565b61151373ffffffffffffffffffffffffffffffffffffffff8216156114f1578161150d565b600189015473ffffffffffffffffffffffffffffffffffffffff165b89613d74565b87547fffffffffffffffff0000000000000000000000000000000000000000ffffffff1664010000000073ffffffffffffffffffffffffffffffffffffffff8316021788555b505b505050505050505050565b600080600054700100000000000000000000000000000000900460ff1660028111156115945761159461555f565b146115cb576040517f67fe195000000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6000805260066020527f54cdd369e4e8a8515e52ca72ec816c2101831ad1f18bf44102ed171459c9b4f85460ff1661162f576040517f9a07664600000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff16600260008154811061165b5761165b6158d5565b6000918252602090912060059091020154640100000000900473ffffffffffffffffffffffffffffffffffffffff1614611696576001611699565b60025b6000805467ffffffffffffffff421668010000000000000000027fffffffffffffffffffffffffffffffff0000000000000000ffffffffffffffff82168117835592935083927fffffffffffffffffffffffffffffff00ffffffffffffffffffffffffffffffff167fffffffffffffffffffffffffffffff000000000000000000ffffffffffffffff9091161770010000000000000000000000000000000083600281111561174a5761174a61555f565b02179055600281111561175f5761175f61555f565b6040517f5e186f09b9c93491f14e277eea7faa5de6a2d4bda75a79af7a3684fbfb42da6090600090a27f000000000000000000000000970670459734a83899773a0fd45941b5afc1200e73ffffffffffffffffffffffffffffffffffffffff1663838c2d1e6040518163ffffffff1660e01b8152600401600060405180830381600087803b1580156117f057600080fd5b505af1158015611804573d6000803e3d6000fd5b5050505090565b6005602052816000526040600020818154811061182757600080fd5b90600052602060002001600091509150505481565b905090565b61184e8383836001611a42565b505050565b6000818152600760209081526040808320600590925282208054825461188490610100900463ffffffff1682615983565b95945050505050565b606061183c60546020613e75565b73ffffffffffffffffffffffffffffffffffffffff8116600090815260036020526040812080549082905590819003611900576040517f17bfe5f700000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6040517ff3fef3a300000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff8381166004830152602482018390527f000000000000000000000000ef179756ea6525afade217ca5ab0b1b5cfe0fd92169063f3fef3a390604401600060405180830381600087803b15801561199057600080fd5b505af11580156119a4573d6000803e3d6000fd5b5050505060008273ffffffffffffffffffffffffffffffffffffffff168260405160006040518083038185875af1925050503d8060008114611a02576040519150601f19603f3d011682016040523d82523d6000602084013e611a07565b606091505b505090508061184e576040517f83e6cc6b00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b60008054700100000000000000000000000000000000900460ff166002811115611a6e57611a6e61555f565b14611aa5576040517f67fe195000000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b600060028481548110611aba57611aba6158d5565b60009182526020918290206040805160e0810182526005909302909101805463ffffffff8116845273ffffffffffffffffffffffffffffffffffffffff64010000000090910481169484019490945260018101549093169082015260028201546fffffffffffffffffffffffffffffffff908116606083015260038301546080830181905260049093015480821660a084015270010000000000000000000000000000000090041660c082015291508514611ba1576040517f3014033200000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b60a0810151600083156fffffffffffffffffffffffffffffffff83161760011b90506000611c61826fffffffffffffffffffffffffffffffff167e09010a0d15021d0b0e10121619031e080c141c0f111807131b17061a05041f7f07c4acdd0000000000000000000000000000000000000000000000000000000067ffffffffffffffff831160061b83811c63ffffffff1060051b1792831c600181901c17600281901c17600481901c17600881901c17601081901c170260fb1c1a1790565b60ff169050861580611c9c5750611c997f00000000000000000000000000000000000000000000000000000000000000046002615933565b81145b8015611ca6575084155b15611cdd576040517fa42637bc00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6000547201000000000000000000000000000000000000900460ff168015611d03575086155b15611d3a576040517f0ea2e75200000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b7f0000000000000000000000000000000000000000000000000000000000000008811115611d94576040517f56f57b2b00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b611dbf7f00000000000000000000000000000000000000000000000000000000000000046001615933565b8103611dd157611dd186888588613ec7565b34611ddb83612c60565b14611e12576040517f8620aa1900000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6000611e1d88612a81565b905067ffffffffffffffff7f00000000000000000000000000000000000000000000000000000000000004b0811690821603611e85576040517f3381d11400000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6000611eb260017f0000000000000000000000000000000000000000000000000000000000000008615983565b8303611ff0577f000000000000000000000000180cbe2ebb9f37d3a3c542ddc2546fd160555a7373ffffffffffffffffffffffffffffffffffffffff16637dc0d1d06040518163ffffffff1660e01b8152600401602060405180830381865afa158015611f23573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611f47919061599a565b73ffffffffffffffffffffffffffffffffffffffff1663f3f480d96040518163ffffffff1660e01b8152600401602060405180830381865afa158015611f91573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611fb591906159b7565b611fe9907f000000000000000000000000000000000000000000000000000000000000000067ffffffffffffffff166159d0565b9050612083565b61201b60017f0000000000000000000000000000000000000000000000000000000000000004615983565b830361205657611fe97f000000000000000000000000000000000000000000000000000000000000000067ffffffffffffffff1660026159fc565b507f000000000000000000000000000000000000000000000000000000000000000067ffffffffffffffff165b6120b7817f00000000000000000000000000000000000000000000000000000000000004b067ffffffffffffffff16615a2c565b67ffffffffffffffff166120d28367ffffffffffffffff1690565b67ffffffffffffffff16111561211957612116817f00000000000000000000000000000000000000000000000000000000000004b067ffffffffffffffff16615a2c565b91505b6000604083901b421760008a8152608087901b6fffffffffffffffffffffffffffffffff8d1617602052604081209192509060008181526004602052604090205490915060ff1615612197576040517f80497e3b00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b60016004600083815260200190815260200160002060006101000a81548160ff02191690831515021790555060026040518060e001604052808d63ffffffff168152602001600073ffffffffffffffffffffffffffffffffffffffff1681526020013373ffffffffffffffffffffffffffffffffffffffff168152602001346fffffffffffffffffffffffffffffffff1681526020018c8152602001886fffffffffffffffffffffffffffffffff168152602001846fffffffffffffffffffffffffffffffff16815250908060018154018082558091505060019003906000526020600020906005020160009091909190915060008201518160000160006101000a81548163ffffffff021916908363ffffffff16021790555060208201518160000160046101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555060408201518160010160006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555060608201518160020160006101000a8154816fffffffffffffffffffffffffffffffff02191690836fffffffffffffffffffffffffffffffff1602179055506080820151816003015560a08201518160040160006101000a8154816fffffffffffffffffffffffffffffffff02191690836fffffffffffffffffffffffffffffffff16021790555060c08201518160040160106101000a8154816fffffffffffffffffffffffffffffffff02191690836fffffffffffffffffffffffffffffffff1602179055505050600560008c8152602001908152602001600020600160028054905061242d9190615983565b81546001810183556000928352602083200155604080517fd0e30db0000000000000000000000000000000000000000000000000000000008152905173ffffffffffffffffffffffffffffffffffffffff7f000000000000000000000000ef179756ea6525afade217ca5ab0b1b5cfe0fd92169263d0e30db09234926004808301939282900301818588803b1580156124c557600080fd5b505af11580156124d9573d6000803e3d6000fd5b50506040513393508d92508e91507f9b3245740ec3b155098a55be84957a4da13eaf7f14a8bc6f53126c0b9350f2be90600090a4505050505050505050505050565b61184e8383836000611a42565b60005471010000000000000000000000000000000000900460ff161561257a576040517f0dc149f000000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6040517f7258a80700000000000000000000000000000000000000000000000000000000815263ffffffff7f0000000000000000000000000000000000000000000000000000000000000000166004820152600090819073ffffffffffffffffffffffffffffffffffffffff7f000000000000000000000000970670459734a83899773a0fd45941b5afc1200e1690637258a807906024016040805180830381865afa15801561262e573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906126529190615a55565b90925090508161268e576040517f6a6bc3b200000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b604080518082019091528281526020018190526008829055600981905536607a146126c157639824bdab6000526004601cfd5b80367ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe81013560f01c9003605401351161275b576040517ff40239db000000000000000000000000000000000000000000000000000000008152367ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe81013560f01c90036014013560048201526024015b60405180910390fd5b6040805160e08101825263ffffffff8082526000602083018181527ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe369081013560f01c90038035606090811c868801908152346fffffffffffffffffffffffffffffffff81811693890193845260149094013560808901908152600160a08a0181815242871660c08c019081526002805493840181558a529a5160059092027f405787fa12a823e0f2b7631cc41b3ba8828b3321ca811111fa75cd3aa3bb5ace81018054995173ffffffffffffffffffffffffffffffffffffffff908116640100000000027fffffffffffffffff000000000000000000000000000000000000000000000000909b1694909c16939093179890981790915592517f405787fa12a823e0f2b7631cc41b3ba8828b3321ca811111fa75cd3aa3bb5acf87018054918a167fffffffffffffffffffffffff000000000000000000000000000000000000000090921691909117905592517f405787fa12a823e0f2b7631cc41b3ba8828b3321ca811111fa75cd3aa3bb5ad0860180549186167fffffffffffffffffffffffffffffffff0000000000000000000000000000000090921691909117905591517f405787fa12a823e0f2b7631cc41b3ba8828b3321ca811111fa75cd3aa3bb5ad185015551955182167001000000000000000000000000000000000295909116949094177f405787fa12a823e0f2b7631cc41b3ba8828b3321ca811111fa75cd3aa3bb5ad29091015580547fffffffffffffffffffffffffffff00ffffffffffffffffffffffffffffffffff167101000000000000000000000000000000000017815583517fd0e30db000000000000000000000000000000000000000000000000000000000815293517f000000000000000000000000ef179756ea6525afade217ca5ab0b1b5cfe0fd929092169363d0e30db093926004828101939282900301818588803b158015612a3057600080fd5b505af1158015612a44573d6000803e3d6000fd5b5050600080547fffffffffffffffffffffffffffffffffffffffffffffffff0000000000000000164267ffffffffffffffff161790555050505050565b600080600054700100000000000000000000000000000000900460ff166002811115612aaf57612aaf61555f565b14612ae6576040517f67fe195000000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b600060028381548110612afb57612afb6158d5565b600091825260208220600590910201805490925063ffffffff90811614612b6a57815460028054909163ffffffff16908110612b3957612b396158d5565b906000526020600020906005020160040160109054906101000a90046fffffffffffffffffffffffffffffffff1690505b6004820154600090612ba290700100000000000000000000000000000000900467ffffffffffffffff165b67ffffffffffffffff1690565b612bb69067ffffffffffffffff1642615983565b612bd5612b95846fffffffffffffffffffffffffffffffff1660401c90565b67ffffffffffffffff16612be99190615933565b905067ffffffffffffffff7f00000000000000000000000000000000000000000000000000000000000004b01667ffffffffffffffff168167ffffffffffffffff1611612c365780611884565b7f00000000000000000000000000000000000000000000000000000000000004b095945050505050565b600080612cff836fffffffffffffffffffffffffffffffff167e09010a0d15021d0b0e10121619031e080c141c0f111807131b17061a05041f7f07c4acdd0000000000000000000000000000000000000000000000000000000067ffffffffffffffff831160061b83811c63ffffffff1060051b1792831c600181901c17600281901c17600481901c17600881901c17601081901c170260fb1c1a1790565b60ff1690507f0000000000000000000000000000000000000000000000000000000000000008811115612d5e576040517f56f57b2b00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b642e90edd00062061a806311e1a3006000612d798383615aa8565b9050670de0b6b3a76400006000612db0827f0000000000000000000000000000000000000000000000000000000000000008615abc565b90506000612dce612dc9670de0b6b3a764000086615abc565b614078565b90506000612ddc84846142d3565b90506000612dea8383614322565b90506000612df782614350565b90506000612e1682612e11670de0b6b3a76400008f615abc565b614538565b90506000612e248b83614322565b9050612e30818d615abc565b9f9e505050505050505050505050505050565b60028181548110612e5357600080fd5b60009182526020909120600590910201805460018201546002830154600384015460049094015463ffffffff8416955064010000000090930473ffffffffffffffffffffffffffffffffffffffff908116949216926fffffffffffffffffffffffffffffffff91821692918082169170010000000000000000000000000000000090041687565b60008054700100000000000000000000000000000000900460ff166002811115612f0657612f0661555f565b14612f3d576040517f67fe195000000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b600060028781548110612f5257612f526158d5565b6000918252602082206005919091020160048101549092506fffffffffffffffffffffffffffffffff16908715821760011b9050612fb17f00000000000000000000000000000000000000000000000000000000000000086001615933565b61304d826fffffffffffffffffffffffffffffffff167e09010a0d15021d0b0e10121619031e080c141c0f111807131b17061a05041f7f07c4acdd0000000000000000000000000000000000000000000000000000000067ffffffffffffffff831160061b83811c63ffffffff1060051b1792831c600181901c17600281901c17600481901c17600881901c17601081901c170260fb1c1a1790565b60ff1614613087576040517f5f53dd9800000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b600080891561317e576130da7f00000000000000000000000000000000000000000000000000000000000000047f0000000000000000000000000000000000000000000000000000000000000008615983565b6001901b6130f9846fffffffffffffffffffffffffffffffff16614569565b6fffffffffffffffffffffffffffffffff166131159190615af9565b156131525761314961313a60016fffffffffffffffffffffffffffffffff8716615b0d565b865463ffffffff166000614608565b60030154613174565b7f00000000000000000000000000000000000000000000000000000000000000005b91508490506131a8565b600385015491506131a561313a6fffffffffffffffffffffffffffffffff86166001615b36565b90505b600882901b60088a8a6040516131bf9291906158c5565b6040518091039020901b14613200576040517f696550ff00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b600061320b8c6146ec565b9050600061321a836003015490565b6040517fe14ced320000000000000000000000000000000000000000000000000000000081527f000000000000000000000000180cbe2ebb9f37d3a3c542ddc2546fd160555a7373ffffffffffffffffffffffffffffffffffffffff169063e14ced3290613294908f908f908f908f908a90600401615baa565b6020604051808303816000875af11580156132b3573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906132d791906159b7565b600485015491149150600090600290613382906fffffffffffffffffffffffffffffffff167e09010a0d15021d0b0e10121619031e080c141c0f111807131b17061a05041f7f07c4acdd0000000000000000000000000000000000000000000000000000000067ffffffffffffffff831160061b83811c63ffffffff1060051b1792831c600181901c17600281901c17600481901c17600881901c17601081901c170260fb1c1a1790565b61341e896fffffffffffffffffffffffffffffffff167e09010a0d15021d0b0e10121619031e080c141c0f111807131b17061a05041f7f07c4acdd0000000000000000000000000000000000000000000000000000000067ffffffffffffffff831160061b83811c63ffffffff1060051b1792831c600181901c17600281901c17600481901c17600881901c17601081901c170260fb1c1a1790565b6134289190615be4565b6134329190615c07565b60ff161590508115158103613473576040517ffb4e40dd00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b8754640100000000900473ffffffffffffffffffffffffffffffffffffffff16156134ca576040517f9071e6af00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b505085547fffffffffffffffff0000000000000000000000000000000000000000ffffffff163364010000000002179095555050505050505050505050565b60008054700100000000000000000000000000000000900460ff1660028111156135355761353561555f565b1461356c576040517f67fe195000000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b60008060008061357b8661471b565b9350935093509350600061359185858585614b24565b905060007f000000000000000000000000180cbe2ebb9f37d3a3c542ddc2546fd160555a7373ffffffffffffffffffffffffffffffffffffffff16637dc0d1d06040518163ffffffff1660e01b8152600401602060405180830381865afa158015613600573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190613624919061599a565b90506001890361371c5773ffffffffffffffffffffffffffffffffffffffff81166352f0f3ad8a84613680367ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe81013560f01c90036034013590565b6040517fffffffff0000000000000000000000000000000000000000000000000000000060e086901b16815260048101939093526024830191909152604482015260206064820152608481018a905260a4015b6020604051808303816000875af11580156136f2573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061371691906159b7565b5061155b565b600289036137485773ffffffffffffffffffffffffffffffffffffffff81166352f0f3ad8a8489613680565b600389036137745773ffffffffffffffffffffffffffffffffffffffff81166352f0f3ad8a8487613680565b600489036138fb5760006137ba6fffffffffffffffffffffffffffffffff85167f0000000000000000000000000000000000000000000000000000000000000004614bde565b6009546137c79190615933565b6137d2906001615933565b9050367ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe81013560f01c900360540135811061383b57367ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe81013560f01c90036054013561383d565b805b905073ffffffffffffffffffffffffffffffffffffffff82166352f0f3ad8b8560405160e084901b7fffffffff000000000000000000000000000000000000000000000000000000001681526004810192909252602482015260c084901b604482015260086064820152608481018b905260a4016020604051808303816000875af11580156138d0573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906138f491906159b7565b505061155b565b60058903613994576040517f52f0f3ad000000000000000000000000000000000000000000000000000000008152600481018a9052602481018390527f000000000000000000000000000000000000000000000000000000000000038560c01b6044820152600860648201526084810188905273ffffffffffffffffffffffffffffffffffffffff8216906352f0f3ad9060a4016136d3565b6040517fff137e6500000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b7f0000000000000000000000000000000000000000000000000000000000000000367ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe81013560f01c9003601401356060613a1f61188d565b9050909192565b600081831015613a365781613a38565b825b90505b92915050565b60008160000151826020015183604001518460600151604051602001613a80949392919093845260208401929092526040830152606082015260800190565b604051602081830303815290604052805190602001209050919050565b60408051808201909152600080825260208201528151600003613aec576040517f5ab458fb00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b50604080518082019091528151815260209182019181019190915290565b60606000806000613b1a85614c8c565b919450925090506001816001811115613b3557613b3561555f565b14613b6c576040517f4b9c6abe00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b8451613b788385615933565b14613baf576040517f5c5537b800000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b604080516020808252610420820190925290816020015b6040805180820190915260008082526020820152815260200190600190039081613bc65790505093506000835b8651811015613cb457600080613c396040518060400160405280858c60000151613c1d9190615983565b8152602001858c60200151613c329190615933565b9052614c8c565b509150915060405180604001604052808383613c559190615933565b8152602001848b60200151613c6a9190615933565b815250888581518110613c7f57613c7f6158d5565b6020908102919091010152613c95600185615933565b9350613ca18183615933565b613cab9084615933565b92505050613bf3565b50845250919392505050565b60606000806000613cd085614c8c565b919450925090506000816001811115613ceb57613ceb61555f565b14613d22576040517f1ff9b2e400000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b613d2c8284615933565b855114613d65576040517f5c5537b800000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6118848560200151848461512a565b600281015473ffffffffffffffffffffffffffffffffffffffff8316600090815260036020526040812080546fffffffffffffffffffffffffffffffff90931692839290613dc3908490615933565b90915550506040517f7eee288d00000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff8481166004830152602482018390527f000000000000000000000000ef179756ea6525afade217ca5ab0b1b5cfe0fd921690637eee288d90604401600060405180830381600087803b158015613e5857600080fd5b505af1158015613e6c573d6000803e3d6000fd5b50505050505050565b604051818152367ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe81013560f01c90038284820160208401378260208301016000815260208101604052505092915050565b6000613ee66fffffffffffffffffffffffffffffffff84166001615b36565b90506000613ef682866001614608565b9050600086901a8380613fe25750613f2f60027f0000000000000000000000000000000000000000000000000000000000000004615af9565b6004830154600290613fd3906fffffffffffffffffffffffffffffffff167e09010a0d15021d0b0e10121619031e080c141c0f111807131b17061a05041f7f07c4acdd0000000000000000000000000000000000000000000000000000000067ffffffffffffffff831160061b83811c63ffffffff1060051b1792831c600181901c17600281901c17600481901c17600881901c17601081901c170260fb1c1a1790565b613fdd9190615c07565b60ff16145b1561403a5760ff811660011480613ffc575060ff81166002145b614035576040517ff40239db00000000000000000000000000000000000000000000000000000000815260048101889052602401612752565b613e6c565b60ff811615613e6c576040517ff40239db00000000000000000000000000000000000000000000000000000000815260048101889052602401612752565b6fffffffffffffffffffffffffffffffff811160071b81811c67ffffffffffffffff1060061b1781811c63ffffffff1060051b1781811c61ffff1060041b1781811c60ff1060031b17600082136140d757631615e6386000526004601cfd5b7ff8f9f9faf9fdfafbf9fdfcfdfafbfcfef9fafdfafcfcfbfefafafcfbffffffff6f8421084210842108cc6318c6db6d54be83831c1c601f161a1890811b609f90811c6c465772b2bbbb5f824b15207a3081018102606090811d6d0388eaa27412d5aca026815d636e018202811d6d0df99ac502031bf953eff472fdcc018202811d6d13cdffb29d51d99322bdff5f2211018202811d6d0a0f742023def783a307a986912e018202811d6d01920d8043ca89b5239253284e42018202811d6c0b7a86d7375468fac667a0a527016c29508e458543d8aa4df2abee7883018302821d6d0139601a2efabe717e604cbb4894018302821d6d02247f7a7b6594320649aa03aba1018302821d7fffffffffffffffffffffffffffffffffffffff73c0c716a594e00d54e3c4cbc9018302821d7ffffffffffffffffffffffffffffffffffffffdc7b88c420e53a9890533129f6f01830290911d7fffffffffffffffffffffffffffffffffffffff465fda27eb4d63ded474e5f832019091027ffffffffffffffff5f6af8f7b3396644f18e157960000000000000000000000000105711340daa0d5f769dba1915cef59f0815a5506029190037d0267a36c0c95b3975ab3ee5b203a7614a3f75373f047d803ae7b6687f2b302017d57115e47018c7177eebf7cd370a3356a1b7863008a5ae8028c72b88642840160ae1d90565b60007812725dd1d243aba0e75fe645cc4873f9e65afe688c928e1f218311670de0b6b3a76400000215820261431057637c5f487d6000526004601cfd5b50670de0b6b3a7640000919091020490565b6000816000190483118202156143405763bac65e5b6000526004601cfd5b50670de0b6b3a764000091020490565b60007ffffffffffffffffffffffffffffffffffffffffffffffffdc0d0570925a462d7821361437e57919050565b680755bf798b4a1bf1e5821261439c5763a37bfec96000526004601cfd5b6503782dace9d9604e83901b059150600060606bb17217f7d1cf79abc9e3b39884821b056b80000000000000000000000001901d6bb17217f7d1cf79abc9e3b39881029093037fffffffffffffffffffffffffffffffffffffffdbf3ccf1604d263450f02a550481018102606090811d6d0277594991cfc85f6e2461837cd9018202811d7fffffffffffffffffffffffffffffffffffffe5adedaa1cb095af9e4da10e363c018202811d6db1bbb201f443cf962f1a1d3db4a5018202811d7ffffffffffffffffffffffffffffffffffffd38dc772608b0ae56cce01296c0eb018202811d6e05180bb14799ab47a8a8cb2a527d57016d02d16720577bd19bf614176fe9ea6c10fe68e7fd37d0007b713f765084018402831d9081019084017ffffffffffffffffffffffffffffffffffffffe2c69812cf03b0763fd454a8f7e010290911d6e0587f503bb6ea29d25fcb7401964500190910279d835ebba824c98fb31b83b2ca45c000000000000000000000000010574029d9dc38563c32e5c2f6dc192ee70ef65f9978af30260c3939093039290921c92915050565b6000613a38670de0b6b3a76400008361455086614078565b61455a9190615c29565b6145649190615ce5565b614350565b6000806145f6837e09010a0d15021d0b0e10121619031e080c141c0f111807131b17061a05041f7f07c4acdd0000000000000000000000000000000000000000000000000000000067ffffffffffffffff831160061b83811c63ffffffff1060051b1792831c600181901c17600281901c17600481901c17600881901c17601081901c170260fb1c1a1790565b600160ff919091161b90920392915050565b600080826146515761464c6fffffffffffffffffffffffffffffffff86167f00000000000000000000000000000000000000000000000000000000000000046151bf565b61466c565b61466c856fffffffffffffffffffffffffffffffff1661534b565b905060028481548110614681576146816158d5565b906000526020600020906005020191505b60048201546fffffffffffffffffffffffffffffffff8281169116146146e457815460028054909163ffffffff169081106146cf576146cf6158d5565b90600052602060002090600502019150614692565b509392505050565b60008060008060006146fd8661471b565b935093509350935061471184848484614b24565b9695505050505050565b600080600080600085905060006002828154811061473b5761473b6158d5565b600091825260209091206004600590920201908101549091507f000000000000000000000000000000000000000000000000000000000000000490614812906fffffffffffffffffffffffffffffffff167e09010a0d15021d0b0e10121619031e080c141c0f111807131b17061a05041f7f07c4acdd0000000000000000000000000000000000000000000000000000000067ffffffffffffffff831160061b83811c63ffffffff1060051b1792831c600181901c17600281901c17600481901c17600881901c17601081901c170260fb1c1a1790565b60ff161161484c576040517fb34b5c2200000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6000815b60048301547f000000000000000000000000000000000000000000000000000000000000000490614913906fffffffffffffffffffffffffffffffff167e09010a0d15021d0b0e10121619031e080c141c0f111807131b17061a05041f7f07c4acdd0000000000000000000000000000000000000000000000000000000067ffffffffffffffff831160061b83811c63ffffffff1060051b1792831c600181901c17600281901c17600481901c17600881901c17601081901c170260fb1c1a1790565b60ff16925082111561498857825463ffffffff166149527f00000000000000000000000000000000000000000000000000000000000000046001615933565b830361495c578391505b6002818154811061496f5761496f6158d5565b9060005260206000209060050201935080945050614850565b600481810154908401546fffffffffffffffffffffffffffffffff91821691166000816fffffffffffffffffffffffffffffffff166149f16149dc856fffffffffffffffffffffffffffffffff1660011c90565b6fffffffffffffffffffffffffffffffff1690565b6fffffffffffffffffffffffffffffffff161490508015614ac0576000614a29836fffffffffffffffffffffffffffffffff16614569565b6fffffffffffffffffffffffffffffffff161115614a94576000614a6b614a6360016fffffffffffffffffffffffffffffffff8616615b0d565b896001614608565b6003810154600490910154909c506fffffffffffffffffffffffffffffffff169a50614a9a9050565b6008549a505b600386015460048701549099506fffffffffffffffffffffffffffffffff169750614b16565b6000614ae2614a636fffffffffffffffffffffffffffffffff85166001615b36565b6003808901546004808b015492840154930154909e506fffffffffffffffffffffffffffffffff9182169d50919b50169850505b505050505050509193509193565b60006fffffffffffffffffffffffffffffffff841615614b915760408051602081018790526fffffffffffffffffffffffffffffffff8087169282019290925260608101859052908316608082015260a00160405160208183030381529060405280519060200120611884565b8282604051602001614bbf9291909182526fffffffffffffffffffffffffffffffff16602082015260400190565b6040516020818303038152906040528051906020012095945050505050565b600080614c6b847e09010a0d15021d0b0e10121619031e080c141c0f111807131b17061a05041f7f07c4acdd0000000000000000000000000000000000000000000000000000000067ffffffffffffffff831160061b83811c63ffffffff1060051b1792831c600181901c17600281901c17600481901c17600881901c17601081901c170260fb1c1a1790565b60ff1690508083036001841b600180831b0386831b17039250505092915050565b60008060008360000151600003614ccf576040517f5ab458fb00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6020840151805160001a607f8111614cf4576000600160009450945094505050615123565b60b78111614e0a576000614d09608083615983565b905080876000015111614d48576040517f66c9448500000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6001838101517fff00000000000000000000000000000000000000000000000000000000000000169082148015614dc057507f80000000000000000000000000000000000000000000000000000000000000007fff000000000000000000000000000000000000000000000000000000000000008216105b15614df7576040517fbabb01dd00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b5060019550935060009250615123915050565b60bf8111614f68576000614e1f60b783615983565b905080876000015111614e5e576040517f66c9448500000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b60018301517fff00000000000000000000000000000000000000000000000000000000000000166000819003614ec0576040517fbabb01dd00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b600184015160088302610100031c60378111614f08576040517fbabb01dd00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b614f128184615933565b895111614f4b576040517f66c9448500000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b614f56836001615933565b97509550600094506151239350505050565b60f78111614fcd576000614f7d60c083615983565b905080876000015111614fbc576040517f66c9448500000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b600195509350849250615123915050565b6000614fda60f783615983565b905080876000015111615019576040517f66c9448500000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b60018301517fff0000000000000000000000000000000000000000000000000000000000000016600081900361507b576040517fbabb01dd00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b600184015160088302610100031c603781116150c3576040517fbabb01dd00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6150cd8184615933565b895111615106576040517f66c9448500000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b615111836001615933565b97509550600194506151239350505050565b9193909250565b60608167ffffffffffffffff81111561514557615145615809565b6040519080825280601f01601f19166020018201604052801561516f576020820181803683370190505b50905081156151b85760006151848486615933565b90506020820160005b848110156151a557828101518282015260200161518d565b848111156151b4576000858301525b5050505b9392505050565b60008161525e846fffffffffffffffffffffffffffffffff167e09010a0d15021d0b0e10121619031e080c141c0f111807131b17061a05041f7f07c4acdd0000000000000000000000000000000000000000000000000000000067ffffffffffffffff831160061b83811c63ffffffff1060051b1792831c600181901c17600281901c17600481901c17600881901c17601081901c170260fb1c1a1790565b60ff16116152745763b34b5c226000526004601cfd5b61527d8361534b565b90508161531c826fffffffffffffffffffffffffffffffff167e09010a0d15021d0b0e10121619031e080c141c0f111807131b17061a05041f7f07c4acdd0000000000000000000000000000000000000000000000000000000067ffffffffffffffff831160061b83811c63ffffffff1060051b1792831c600181901c17600281901c17600481901c17600881901c17601081901c170260fb1c1a1790565b60ff1611613a3b57613a38615332836001615933565b6fffffffffffffffffffffffffffffffff8316906153f0565b600081196001830116816153df827e09010a0d15021d0b0e10121619031e080c141c0f111807131b17061a05041f7f07c4acdd0000000000000000000000000000000000000000000000000000000067ffffffffffffffff831160061b83811c63ffffffff1060051b1792831c600181901c17600281901c17600481901c17600881901c17601081901c170260fb1c1a1790565b60ff169390931c8015179392505050565b60008061547d847e09010a0d15021d0b0e10121619031e080c141c0f111807131b17061a05041f7f07c4acdd0000000000000000000000000000000000000000000000000000000067ffffffffffffffff831160061b83811c63ffffffff1060051b1792831c600181901c17600281901c17600481901c17600881901c17601081901c170260fb1c1a1790565b60ff169050808303600180821b0385821b179250505092915050565b60008083601f8401126154ab57600080fd5b50813567ffffffffffffffff8111156154c357600080fd5b6020830191508360208285010111156154db57600080fd5b9250929050565b600080600083850360a08112156154f857600080fd5b608081121561550657600080fd5b50839250608084013567ffffffffffffffff81111561552457600080fd5b61553086828701615499565b9497909650939450505050565b6000806040838503121561555057600080fd5b50508035926020909101359150565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602160045260246000fd5b60208101600383106155c9577f4e487b7100000000000000000000000000000000000000000000000000000000600052602160045260246000fd5b91905290565b6000806000606084860312156155e457600080fd5b505081359360208301359350604090920135919050565b6000815180845260005b8181101561562157602081850181015186830182015201615605565b81811115615633576000602083870101525b50601f017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0169290920160200192915050565b602081526000613a3860208301846155fb565b60006020828403121561568b57600080fd5b5035919050565b73ffffffffffffffffffffffffffffffffffffffff811681146156b457600080fd5b50565b6000602082840312156156c957600080fd5b81356151b881615692565b803580151581146156e457600080fd5b919050565b600080600080608085870312156156ff57600080fd5b84359350602085013592506040850135915061571d606086016156d4565b905092959194509250565b60006020828403121561573a57600080fd5b81356fffffffffffffffffffffffffffffffff811681146151b857600080fd5b6000806000806000806080878903121561577357600080fd5b86359550615783602088016156d4565b9450604087013567ffffffffffffffff808211156157a057600080fd5b6157ac8a838b01615499565b909650945060608901359150808211156157c557600080fd5b506157d289828a01615499565b979a9699509497509295939492505050565b63ffffffff8416815282602082015260606040820152600061188460608301846155fb565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b60006080828403121561584a57600080fd5b6040516080810181811067ffffffffffffffff82111715615894577f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b8060405250823581526020830135602082015260408301356040820152606083013560608201528091505092915050565b8183823760009101908152919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b6000821982111561594657615946615904565b500190565b60007fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff820361597c5761597c615904565b5060010190565b60008282101561599557615995615904565b500390565b6000602082840312156159ac57600080fd5b81516151b881615692565b6000602082840312156159c957600080fd5b5051919050565b600067ffffffffffffffff8083168185168083038211156159f3576159f3615904565b01949350505050565b600067ffffffffffffffff80831681851681830481118215151615615a2357615a23615904565b02949350505050565b600067ffffffffffffffff83811690831681811015615a4d57615a4d615904565b039392505050565b60008060408385031215615a6857600080fd5b505080516020909101519092909150565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601260045260246000fd5b600082615ab757615ab7615a79565b500490565b6000817fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0483118215151615615af457615af4615904565b500290565b600082615b0857615b08615a79565b500690565b60006fffffffffffffffffffffffffffffffff83811690831681811015615a4d57615a4d615904565b60006fffffffffffffffffffffffffffffffff8083168185168083038211156159f3576159f3615904565b8183528181602085013750600060208284010152600060207fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0601f840116840101905092915050565b606081526000615bbe606083018789615b61565b8281036020840152615bd1818688615b61565b9150508260408301529695505050505050565b600060ff821660ff841680821015615bfe57615bfe615904565b90039392505050565b600060ff831680615c1a57615c1a615a79565b8060ff84160691505092915050565b60007f7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff600084136000841385830485118282161615615c6a57615c6a615904565b7f80000000000000000000000000000000000000000000000000000000000000006000871286820588128184161615615ca557615ca5615904565b60008712925087820587128484161615615cc157615cc1615904565b87850587128184161615615cd757615cd7615904565b505050929093029392505050565b600082615cf457615cf4615a79565b7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff83147f800000000000000000000000000000000000000000000000000000000000000083141615615d4857615d48615904565b50059056fea164736f6c634300080f000a"; + bytes internal constant acc34Code = + hex"6080604052600436106103085760003560e01c806370872aa51161019a578063c6f0308c116100e1578063ec5e63081161008a578063fa24f74311610064578063fa24f74314610b94578063fa315aa914610bb8578063fe2bbeb214610beb57600080fd5b8063ec5e630814610b11578063eff0f59214610b44578063f8f43ff614610b7457600080fd5b8063d6ae3cd5116100bb578063d6ae3cd514610a8b578063d8cc1a3c14610abe578063dabd396d14610ade57600080fd5b8063c6f0308c146109b3578063cf09e0d014610a3d578063d5d44d8014610a5e57600080fd5b8063a445ece611610143578063bcef3b551161011d578063bcef3b5514610933578063bd8da95614610973578063c395e1ca1461099357600080fd5b8063a445ece6146107f3578063a8e4fb90146108bf578063bbdc02db146108f257600080fd5b80638980e0cc116101745780638980e0cc1461076b5780638b85902b146107805780638d450a95146107c057600080fd5b806370872aa51461073b5780637b0f0adc146107505780638129fc1c1461076357600080fd5b80633fc8cef31161025e5780635c0cba33116102075780636361506d116101e15780636361506d146106b55780636b6716c0146106f55780636f0344091461072857600080fd5b80635c0cba331461064d578063609d33341461068057806360e274641461069557600080fd5b806354fd4d501161023857806354fd4d50146105a757806357da950e146105fd5780635a5fa2d91461062d57600080fd5b80633fc8cef31461052e578063472777c614610561578063534db0e21461057457600080fd5b80632810e1d6116102c057806337b1b2291161029a57806337b1b2291461047b5780633a768463146104bb5780633e3ac912146104ee57600080fd5b80632810e1d6146103f45780632ad69aeb1461040957806330dbe5701461042957600080fd5b806319effeb4116102f157806319effeb41461034f578063200d2ed21461039a57806325fc2ace146103d557600080fd5b8063019351301461030d57806303c2924d1461032f575b600080fd5b34801561031957600080fd5b5061032d61032836600461575d565b610c1b565b005b34801561033b57600080fd5b5061032d61034a3660046157b8565b610f3c565b34801561035b57600080fd5b5060005461037c9068010000000000000000900467ffffffffffffffff1681565b60405167ffffffffffffffff90911681526020015b60405180910390f35b3480156103a657600080fd5b506000546103c890700100000000000000000000000000000000900460ff1681565b6040516103919190615809565b3480156103e157600080fd5b506008545b604051908152602001610391565b34801561040057600080fd5b506103c86115e2565b34801561041557600080fd5b506103e66104243660046157b8565b611887565b34801561043557600080fd5b506001546104569073ffffffffffffffffffffffffffffffffffffffff1681565b60405173ffffffffffffffffffffffffffffffffffffffff9091168152602001610391565b34801561048757600080fd5b50367ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe81013560f01c90033560601c610456565b3480156104c757600080fd5b507f000000000000000000000000180cbe2ebb9f37d3a3c542ddc2546fd160555a73610456565b3480156104fa57600080fd5b5060005461051e907201000000000000000000000000000000000000900460ff1681565b6040519015158152602001610391565b34801561053a57600080fd5b507f000000000000000000000000d6eaf4c146261653ee059077b78ed088add54309610456565b61032d61056f36600461584a565b6118bd565b34801561058057600080fd5b507f0000000000000000000000006925b8704ff96dee942623d6fb5e946ef5884b63610456565b3480156105b357600080fd5b506105f06040518060400160405280600c81526020017f312e332e312d626574612e32000000000000000000000000000000000000000081525081565b60405161039191906158e1565b34801561060957600080fd5b50600854600954610618919082565b60408051928352602083019190915201610391565b34801561063957600080fd5b506103e66106483660046158f4565b6118cf565b34801561065957600080fd5b507f000000000000000000000000970670459734a83899773a0fd45941b5afc1200e610456565b34801561068c57600080fd5b506105f0611909565b3480156106a157600080fd5b5061032d6106b0366004615932565b611917565b3480156106c157600080fd5b50367ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe81013560f01c9003603401356103e6565b34801561070157600080fd5b507f000000000000000000000000000000000000000000000000000000000000000061037c565b61032d610736366004615964565b611abe565b34801561074757600080fd5b506009546103e6565b61032d61075e36600461584a565b611b7f565b61032d611b8c565b34801561077757600080fd5b506002546103e6565b34801561078c57600080fd5b50367ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe81013560f01c9003605401356103e6565b3480156107cc57600080fd5b507f00000000000000000000000000000000000000000000000000000000000000006103e6565b3480156107ff57600080fd5b5061086b61080e3660046158f4565b6007602052600090815260409020805460019091015460ff821691610100810463ffffffff1691650100000000009091046fffffffffffffffffffffffffffffffff169073ffffffffffffffffffffffffffffffffffffffff1684565b60408051941515855263ffffffff90931660208501526fffffffffffffffffffffffffffffffff9091169183019190915273ffffffffffffffffffffffffffffffffffffffff166060820152608001610391565b3480156108cb57600080fd5b507f00000000000000000000000070997970c51812dc3a010c7d01b50e0d17dc79c8610456565b3480156108fe57600080fd5b5060405163ffffffff7f0000000000000000000000000000000000000000000000000000000000000001168152602001610391565b34801561093f57600080fd5b50367ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe81013560f01c9003601401356103e6565b34801561097f57600080fd5b5061037c61098e3660046158f4565b611c05565b34801561099f57600080fd5b506103e66109ae3660046159a3565b611de4565b3480156109bf57600080fd5b506109d36109ce3660046158f4565b611fc7565b6040805163ffffffff909816885273ffffffffffffffffffffffffffffffffffffffff968716602089015295909416948601949094526fffffffffffffffffffffffffffffffff9182166060860152608085015291821660a08401521660c082015260e001610391565b348015610a4957600080fd5b5060005461037c9067ffffffffffffffff1681565b348015610a6a57600080fd5b506103e6610a79366004615932565b60036020526000908152604090205481565b348015610a9757600080fd5b507f00000000000000000000000000000000000000000000000000000000000003856103e6565b348015610aca57600080fd5b5061032d610ad93660046159d5565b61205e565b348015610aea57600080fd5b507f00000000000000000000000000000000000000000000000000000000000004b061037c565b348015610b1d57600080fd5b507f00000000000000000000000000000000000000000000000000000000000000046103e6565b348015610b5057600080fd5b5061051e610b5f3660046158f4565b60046020526000908152604090205460ff1681565b348015610b8057600080fd5b5061032d610b8f36600461584a565b612123565b348015610ba057600080fd5b50610ba96125e0565b60405161039193929190615a5f565b348015610bc457600080fd5b507f00000000000000000000000000000000000000000000000000000000000000086103e6565b348015610bf757600080fd5b5061051e610c063660046158f4565b60066020526000908152604090205460ff1681565b60008054700100000000000000000000000000000000900460ff166002811115610c4757610c476157da565b14610c7e576040517f67fe195000000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6000547201000000000000000000000000000000000000900460ff1615610cd1576040517f0ea2e75200000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b610d08367ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe81013560f01c90036014013590565b90565b610d1f610d1a36869003860186615ab3565b61265b565b14610d56576040517f9cc00b5b00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b82606001358282604051610d6b929190615b40565b604051809103902014610daa576040517fd81d583b00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6000610df3610dee84848080601f0160208091040260200160405190810160405280939291908181526020018383808284376000920191909152506126b792505050565b612724565b90506000610e1a82600881518110610e0d57610e0d615b50565b60200260200101516128da565b9050602081511115610e58576040517fd81d583b00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b602081810151825190910360031b1c367ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe81013560f01c9003605401358103610ecd576040517fb8ed883000000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b5050600180547fffffffffffffffffffffffff000000000000000000000000000000000000000016331790555050600080547fffffffffffffffffffffffffff00ffffffffffffffffffffffffffffffffffff1672010000000000000000000000000000000000001790555050565b60008054700100000000000000000000000000000000900460ff166002811115610f6857610f686157da565b14610f9f576040517f67fe195000000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b600060028381548110610fb457610fb4615b50565b906000526020600020906005020190506000610fcf84611c05565b905067ffffffffffffffff7f00000000000000000000000000000000000000000000000000000000000004b081169082161015611038576040517ff2440b5300000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b60008481526006602052604090205460ff1615611081576040517ff1a9458100000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b600084815260056020526040902080548015801561109e57508515155b15611139578354640100000000900473ffffffffffffffffffffffffffffffffffffffff16600081156110d157816110ed565b600186015473ffffffffffffffffffffffffffffffffffffffff165b90506110f9818761298e565b50505060009485525050600660205250506040902080547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00166001179055565b6000868152600760209081526040918290208251608081018452815460ff81161515808352610100820463ffffffff16948301949094526501000000000090046fffffffffffffffffffffffffffffffff16938101939093526001015473ffffffffffffffffffffffffffffffffffffffff1660608301526111dc576fffffffffffffffffffffffffffffffff60408201526001815260008690036111dc578195505b600086826020015163ffffffff166111f49190615bae565b905060008382116112055781611207565b835b602084015190915063ffffffff165b8181101561135357600086828154811061123257611232615b50565b6000918252602080832090910154808352600690915260409091205490915060ff1661128a576040517f9a07664600000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b60006002828154811061129f5761129f615b50565b600091825260209091206005909102018054909150640100000000900473ffffffffffffffffffffffffffffffffffffffff161580156112fc5750600481015460408701516fffffffffffffffffffffffffffffffff9182169116115b1561133e57600181015473ffffffffffffffffffffffffffffffffffffffff16606087015260048101546fffffffffffffffffffffffffffffffff1660408701525b5050808061134b90615bc6565b915050611216565b5063ffffffff818116602085810191825260008c81526007909152604090819020865181549351928801517fffffffffffffffffffffffffffffffffffffffffffffffffffffff00000000009094169015157fffffffffffffffffffffffffffffffffffffffffffffffffffffff00000000ff161761010092909416918202939093177fffffffffffffffffffffff00000000000000000000000000000000ffffffffff16650100000000006fffffffffffffffffffffffffffffffff909316929092029190911782556060850151600190920180547fffffffffffffffffffffffff00000000000000000000000000000000000000001673ffffffffffffffffffffffffffffffffffffffff909316929092179091558490036115d757606083015160008a815260066020526040902080547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00166001179055891580156114d357506000547201000000000000000000000000000000000000900460ff165b156115485760015473ffffffffffffffffffffffffffffffffffffffff166114fb818a61298e565b885473ffffffffffffffffffffffffffffffffffffffff909116640100000000027fffffffffffffffff0000000000000000000000000000000000000000ffffffff9091161788556115d5565b61158f73ffffffffffffffffffffffffffffffffffffffff82161561156d5781611589565b600189015473ffffffffffffffffffffffffffffffffffffffff165b8961298e565b87547fffffffffffffffff0000000000000000000000000000000000000000ffffffff1664010000000073ffffffffffffffffffffffffffffffffffffffff8316021788555b505b505050505050505050565b600080600054700100000000000000000000000000000000900460ff166002811115611610576116106157da565b14611647576040517f67fe195000000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6000805260066020527f54cdd369e4e8a8515e52ca72ec816c2101831ad1f18bf44102ed171459c9b4f85460ff166116ab576040517f9a07664600000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff1660026000815481106116d7576116d7615b50565b6000918252602090912060059091020154640100000000900473ffffffffffffffffffffffffffffffffffffffff1614611712576001611715565b60025b6000805467ffffffffffffffff421668010000000000000000027fffffffffffffffffffffffffffffffff0000000000000000ffffffffffffffff82168117835592935083927fffffffffffffffffffffffffffffff00ffffffffffffffffffffffffffffffff167fffffffffffffffffffffffffffffff000000000000000000ffffffffffffffff909116177001000000000000000000000000000000008360028111156117c6576117c66157da565b0217905560028111156117db576117db6157da565b6040517f5e186f09b9c93491f14e277eea7faa5de6a2d4bda75a79af7a3684fbfb42da6090600090a27f000000000000000000000000970670459734a83899773a0fd45941b5afc1200e73ffffffffffffffffffffffffffffffffffffffff1663838c2d1e6040518163ffffffff1660e01b8152600401600060405180830381600087803b15801561186c57600080fd5b505af1158015611880573d6000803e3d6000fd5b5050505090565b600560205281600052604060002081815481106118a357600080fd5b90600052602060002001600091509150505481565b905090565b6118ca8383836001611abe565b505050565b6000818152600760209081526040808320600590925282208054825461190090610100900463ffffffff1682615bfe565b95945050505050565b60606118b860546020612a8f565b73ffffffffffffffffffffffffffffffffffffffff811660009081526003602052604081208054908290559081900361197c576040517f17bfe5f700000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6040517ff3fef3a300000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff8381166004830152602482018390527f000000000000000000000000d6eaf4c146261653ee059077b78ed088add54309169063f3fef3a390604401600060405180830381600087803b158015611a0c57600080fd5b505af1158015611a20573d6000803e3d6000fd5b5050505060008273ffffffffffffffffffffffffffffffffffffffff168260405160006040518083038185875af1925050503d8060008114611a7e576040519150601f19603f3d011682016040523d82523d6000602084013e611a83565b606091505b50509050806118ca576040517f83e6cc6b00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b3373ffffffffffffffffffffffffffffffffffffffff7f00000000000000000000000070997970c51812dc3a010c7d01b50e0d17dc79c8161480611b3757503373ffffffffffffffffffffffffffffffffffffffff7f0000000000000000000000006925b8704ff96dee942623d6fb5e946ef5884b6316145b611b6d576040517fd386ef3e00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b611b7984848484612ae1565b50505050565b6118ca8383836000611abe565b3273ffffffffffffffffffffffffffffffffffffffff7f00000000000000000000000070997970c51812dc3a010c7d01b50e0d17dc79c81614611bfb576040517fd386ef3e00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b611c036135ba565b565b600080600054700100000000000000000000000000000000900460ff166002811115611c3357611c336157da565b14611c6a576040517f67fe195000000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b600060028381548110611c7f57611c7f615b50565b600091825260208220600590910201805490925063ffffffff90811614611cee57815460028054909163ffffffff16908110611cbd57611cbd615b50565b906000526020600020906005020160040160109054906101000a90046fffffffffffffffffffffffffffffffff1690505b6004820154600090611d2690700100000000000000000000000000000000900467ffffffffffffffff165b67ffffffffffffffff1690565b611d3a9067ffffffffffffffff1642615bfe565b611d59611d19846fffffffffffffffffffffffffffffffff1660401c90565b67ffffffffffffffff16611d6d9190615bae565b905067ffffffffffffffff7f00000000000000000000000000000000000000000000000000000000000004b01667ffffffffffffffff168167ffffffffffffffff1611611dba5780611900565b7f00000000000000000000000000000000000000000000000000000000000004b095945050505050565b600080611e83836fffffffffffffffffffffffffffffffff167e09010a0d15021d0b0e10121619031e080c141c0f111807131b17061a05041f7f07c4acdd0000000000000000000000000000000000000000000000000000000067ffffffffffffffff831160061b83811c63ffffffff1060051b1792831c600181901c17600281901c17600481901c17600881901c17601081901c170260fb1c1a1790565b60ff1690507f0000000000000000000000000000000000000000000000000000000000000008811115611ee2576040517f56f57b2b00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b642e90edd00062061a806311e1a3006000611efd8383615c44565b9050670de0b6b3a76400006000611f34827f0000000000000000000000000000000000000000000000000000000000000008615c58565b90506000611f52611f4d670de0b6b3a764000086615c58565b613b13565b90506000611f608484613d6e565b90506000611f6e8383613dbd565b90506000611f7b82613deb565b90506000611f9a82611f95670de0b6b3a76400008f615c58565b613fd3565b90506000611fa88b83613dbd565b9050611fb4818d615c58565b9f9e505050505050505050505050505050565b60028181548110611fd757600080fd5b60009182526020909120600590910201805460018201546002830154600384015460049094015463ffffffff8416955064010000000090930473ffffffffffffffffffffffffffffffffffffffff908116949216926fffffffffffffffffffffffffffffffff91821692918082169170010000000000000000000000000000000090041687565b3373ffffffffffffffffffffffffffffffffffffffff7f00000000000000000000000070997970c51812dc3a010c7d01b50e0d17dc79c81614806120d757503373ffffffffffffffffffffffffffffffffffffffff7f0000000000000000000000006925b8704ff96dee942623d6fb5e946ef5884b6316145b61210d576040517fd386ef3e00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b61211b868686868686614004565b505050505050565b60008054700100000000000000000000000000000000900460ff16600281111561214f5761214f6157da565b14612186576040517f67fe195000000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b60008060008061219586614633565b935093509350935060006121ab85858585614a3c565b905060007f000000000000000000000000180cbe2ebb9f37d3a3c542ddc2546fd160555a7373ffffffffffffffffffffffffffffffffffffffff16637dc0d1d06040518163ffffffff1660e01b8152600401602060405180830381865afa15801561221a573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061223e9190615c95565b9050600189036123365773ffffffffffffffffffffffffffffffffffffffff81166352f0f3ad8a8461229a367ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe81013560f01c90036034013590565b6040517fffffffff0000000000000000000000000000000000000000000000000000000060e086901b16815260048101939093526024830191909152604482015260206064820152608481018a905260a4015b6020604051808303816000875af115801561230c573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906123309190615cb2565b506115d7565b600289036123625773ffffffffffffffffffffffffffffffffffffffff81166352f0f3ad8a848961229a565b6003890361238e5773ffffffffffffffffffffffffffffffffffffffff81166352f0f3ad8a848761229a565b600489036125155760006123d46fffffffffffffffffffffffffffffffff85167f0000000000000000000000000000000000000000000000000000000000000004614af6565b6009546123e19190615bae565b6123ec906001615bae565b9050367ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe81013560f01c900360540135811061245557367ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe81013560f01c900360540135612457565b805b905073ffffffffffffffffffffffffffffffffffffffff82166352f0f3ad8b8560405160e084901b7fffffffff000000000000000000000000000000000000000000000000000000001681526004810192909252602482015260c084901b604482015260086064820152608481018b905260a4016020604051808303816000875af11580156124ea573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061250e9190615cb2565b50506115d7565b600589036125ae576040517f52f0f3ad000000000000000000000000000000000000000000000000000000008152600481018a9052602481018390527f000000000000000000000000000000000000000000000000000000000000038560c01b6044820152600860648201526084810188905273ffffffffffffffffffffffffffffffffffffffff8216906352f0f3ad9060a4016122ed565b6040517fff137e6500000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b7f0000000000000000000000000000000000000000000000000000000000000001367ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe81013560f01c9003601401356060612639611909565b9050909192565b6000818310156126505781612652565b825b90505b92915050565b6000816000015182602001518360400151846060015160405160200161269a949392919093845260208401929092526040830152606082015260800190565b604051602081830303815290604052805190602001209050919050565b60408051808201909152600080825260208201528151600003612706576040517f5ab458fb00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b50604080518082019091528151815260209182019181019190915290565b6060600080600061273485614ba4565b91945092509050600181600181111561274f5761274f6157da565b14612786576040517f4b9c6abe00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b84516127928385615bae565b146127c9576040517f5c5537b800000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b604080516020808252610420820190925290816020015b60408051808201909152600080825260208201528152602001906001900390816127e05790505093506000835b86518110156128ce576000806128536040518060400160405280858c600001516128379190615bfe565b8152602001858c6020015161284c9190615bae565b9052614ba4565b50915091506040518060400160405280838361286f9190615bae565b8152602001848b602001516128849190615bae565b81525088858151811061289957612899615b50565b60209081029190910101526128af600185615bae565b93506128bb8183615bae565b6128c59084615bae565b9250505061280d565b50845250919392505050565b606060008060006128ea85614ba4565b919450925090506000816001811115612905576129056157da565b1461293c576040517f1ff9b2e400000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6129468284615bae565b85511461297f576040517f5c5537b800000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b61190085602001518484615042565b600281015473ffffffffffffffffffffffffffffffffffffffff8316600090815260036020526040812080546fffffffffffffffffffffffffffffffff909316928392906129dd908490615bae565b90915550506040517f7eee288d00000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff8481166004830152602482018390527f000000000000000000000000d6eaf4c146261653ee059077b78ed088add543091690637eee288d90604401600060405180830381600087803b158015612a7257600080fd5b505af1158015612a86573d6000803e3d6000fd5b50505050505050565b604051818152367ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe81013560f01c90038284820160208401378260208301016000815260208101604052505092915050565b60008054700100000000000000000000000000000000900460ff166002811115612b0d57612b0d6157da565b14612b44576040517f67fe195000000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b600060028481548110612b5957612b59615b50565b60009182526020918290206040805160e0810182526005909302909101805463ffffffff8116845273ffffffffffffffffffffffffffffffffffffffff64010000000090910481169484019490945260018101549093169082015260028201546fffffffffffffffffffffffffffffffff908116606083015260038301546080830181905260049093015480821660a084015270010000000000000000000000000000000090041660c082015291508514612c40576040517f3014033200000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b60a0810151600083156fffffffffffffffffffffffffffffffff83161760011b90506000612d00826fffffffffffffffffffffffffffffffff167e09010a0d15021d0b0e10121619031e080c141c0f111807131b17061a05041f7f07c4acdd0000000000000000000000000000000000000000000000000000000067ffffffffffffffff831160061b83811c63ffffffff1060051b1792831c600181901c17600281901c17600481901c17600881901c17601081901c170260fb1c1a1790565b60ff169050861580612d3b5750612d387f00000000000000000000000000000000000000000000000000000000000000046002615bae565b81145b8015612d45575084155b15612d7c576040517fa42637bc00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6000547201000000000000000000000000000000000000900460ff168015612da2575086155b15612dd9576040517f0ea2e75200000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b7f0000000000000000000000000000000000000000000000000000000000000008811115612e33576040517f56f57b2b00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b612e5e7f00000000000000000000000000000000000000000000000000000000000000046001615bae565b8103612e7057612e70868885886150d7565b34612e7a83611de4565b14612eb1576040517f8620aa1900000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6000612ebc88611c05565b905067ffffffffffffffff7f00000000000000000000000000000000000000000000000000000000000004b0811690821603612f24576040517f3381d11400000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6000612f5160017f0000000000000000000000000000000000000000000000000000000000000008615bfe565b830361308f577f000000000000000000000000180cbe2ebb9f37d3a3c542ddc2546fd160555a7373ffffffffffffffffffffffffffffffffffffffff16637dc0d1d06040518163ffffffff1660e01b8152600401602060405180830381865afa158015612fc2573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190612fe69190615c95565b73ffffffffffffffffffffffffffffffffffffffff1663f3f480d96040518163ffffffff1660e01b8152600401602060405180830381865afa158015613030573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906130549190615cb2565b613088907f000000000000000000000000000000000000000000000000000000000000000067ffffffffffffffff16615ccb565b9050613122565b6130ba60017f0000000000000000000000000000000000000000000000000000000000000004615bfe565b83036130f5576130887f000000000000000000000000000000000000000000000000000000000000000067ffffffffffffffff166002615cf7565b507f000000000000000000000000000000000000000000000000000000000000000067ffffffffffffffff165b613156817f00000000000000000000000000000000000000000000000000000000000004b067ffffffffffffffff16615d27565b67ffffffffffffffff166131718367ffffffffffffffff1690565b67ffffffffffffffff1611156131b8576131b5817f00000000000000000000000000000000000000000000000000000000000004b067ffffffffffffffff16615d27565b91505b6000604083901b421760008a8152608087901b6fffffffffffffffffffffffffffffffff8d1617602052604081209192509060008181526004602052604090205490915060ff1615613236576040517f80497e3b00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b60016004600083815260200190815260200160002060006101000a81548160ff02191690831515021790555060026040518060e001604052808d63ffffffff168152602001600073ffffffffffffffffffffffffffffffffffffffff1681526020013373ffffffffffffffffffffffffffffffffffffffff168152602001346fffffffffffffffffffffffffffffffff1681526020018c8152602001886fffffffffffffffffffffffffffffffff168152602001846fffffffffffffffffffffffffffffffff16815250908060018154018082558091505060019003906000526020600020906005020160009091909190915060008201518160000160006101000a81548163ffffffff021916908363ffffffff16021790555060208201518160000160046101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555060408201518160010160006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555060608201518160020160006101000a8154816fffffffffffffffffffffffffffffffff02191690836fffffffffffffffffffffffffffffffff1602179055506080820151816003015560a08201518160040160006101000a8154816fffffffffffffffffffffffffffffffff02191690836fffffffffffffffffffffffffffffffff16021790555060c08201518160040160106101000a8154816fffffffffffffffffffffffffffffffff02191690836fffffffffffffffffffffffffffffffff1602179055505050600560008c815260200190815260200160002060016002805490506134cc9190615bfe565b81546001810183556000928352602083200155604080517fd0e30db0000000000000000000000000000000000000000000000000000000008152905173ffffffffffffffffffffffffffffffffffffffff7f000000000000000000000000d6eaf4c146261653ee059077b78ed088add54309169263d0e30db09234926004808301939282900301818588803b15801561356457600080fd5b505af1158015613578573d6000803e3d6000fd5b50506040513393508d92508e91507f9b3245740ec3b155098a55be84957a4da13eaf7f14a8bc6f53126c0b9350f2be90600090a4505050505050505050505050565b60005471010000000000000000000000000000000000900460ff161561360c576040517f0dc149f000000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6040517f7258a80700000000000000000000000000000000000000000000000000000000815263ffffffff7f0000000000000000000000000000000000000000000000000000000000000001166004820152600090819073ffffffffffffffffffffffffffffffffffffffff7f000000000000000000000000970670459734a83899773a0fd45941b5afc1200e1690637258a807906024016040805180830381865afa1580156136c0573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906136e49190615d50565b909250905081613720576040517f6a6bc3b200000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b604080518082019091528281526020018190526008829055600981905536607a1461375357639824bdab6000526004601cfd5b80367ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe81013560f01c900360540135116137ed576040517ff40239db000000000000000000000000000000000000000000000000000000008152367ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe81013560f01c90036014013560048201526024015b60405180910390fd5b6040805160e08101825263ffffffff8082526000602083018181527ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe369081013560f01c90038035606090811c868801908152346fffffffffffffffffffffffffffffffff81811693890193845260149094013560808901908152600160a08a0181815242871660c08c019081526002805493840181558a529a5160059092027f405787fa12a823e0f2b7631cc41b3ba8828b3321ca811111fa75cd3aa3bb5ace81018054995173ffffffffffffffffffffffffffffffffffffffff908116640100000000027fffffffffffffffff000000000000000000000000000000000000000000000000909b1694909c16939093179890981790915592517f405787fa12a823e0f2b7631cc41b3ba8828b3321ca811111fa75cd3aa3bb5acf87018054918a167fffffffffffffffffffffffff000000000000000000000000000000000000000090921691909117905592517f405787fa12a823e0f2b7631cc41b3ba8828b3321ca811111fa75cd3aa3bb5ad0860180549186167fffffffffffffffffffffffffffffffff0000000000000000000000000000000090921691909117905591517f405787fa12a823e0f2b7631cc41b3ba8828b3321ca811111fa75cd3aa3bb5ad185015551955182167001000000000000000000000000000000000295909116949094177f405787fa12a823e0f2b7631cc41b3ba8828b3321ca811111fa75cd3aa3bb5ad29091015580547fffffffffffffffffffffffffffff00ffffffffffffffffffffffffffffffffff167101000000000000000000000000000000000017815583517fd0e30db000000000000000000000000000000000000000000000000000000000815293517f000000000000000000000000d6eaf4c146261653ee059077b78ed088add543099092169363d0e30db093926004828101939282900301818588803b158015613ac257600080fd5b505af1158015613ad6573d6000803e3d6000fd5b5050600080547fffffffffffffffffffffffffffffffffffffffffffffffff0000000000000000164267ffffffffffffffff161790555050505050565b6fffffffffffffffffffffffffffffffff811160071b81811c67ffffffffffffffff1060061b1781811c63ffffffff1060051b1781811c61ffff1060041b1781811c60ff1060031b1760008213613b7257631615e6386000526004601cfd5b7ff8f9f9faf9fdfafbf9fdfcfdfafbfcfef9fafdfafcfcfbfefafafcfbffffffff6f8421084210842108cc6318c6db6d54be83831c1c601f161a1890811b609f90811c6c465772b2bbbb5f824b15207a3081018102606090811d6d0388eaa27412d5aca026815d636e018202811d6d0df99ac502031bf953eff472fdcc018202811d6d13cdffb29d51d99322bdff5f2211018202811d6d0a0f742023def783a307a986912e018202811d6d01920d8043ca89b5239253284e42018202811d6c0b7a86d7375468fac667a0a527016c29508e458543d8aa4df2abee7883018302821d6d0139601a2efabe717e604cbb4894018302821d6d02247f7a7b6594320649aa03aba1018302821d7fffffffffffffffffffffffffffffffffffffff73c0c716a594e00d54e3c4cbc9018302821d7ffffffffffffffffffffffffffffffffffffffdc7b88c420e53a9890533129f6f01830290911d7fffffffffffffffffffffffffffffffffffffff465fda27eb4d63ded474e5f832019091027ffffffffffffffff5f6af8f7b3396644f18e157960000000000000000000000000105711340daa0d5f769dba1915cef59f0815a5506029190037d0267a36c0c95b3975ab3ee5b203a7614a3f75373f047d803ae7b6687f2b302017d57115e47018c7177eebf7cd370a3356a1b7863008a5ae8028c72b88642840160ae1d90565b60007812725dd1d243aba0e75fe645cc4873f9e65afe688c928e1f218311670de0b6b3a764000002158202613dab57637c5f487d6000526004601cfd5b50670de0b6b3a7640000919091020490565b600081600019048311820215613ddb5763bac65e5b6000526004601cfd5b50670de0b6b3a764000091020490565b60007ffffffffffffffffffffffffffffffffffffffffffffffffdc0d0570925a462d78213613e1957919050565b680755bf798b4a1bf1e58212613e375763a37bfec96000526004601cfd5b6503782dace9d9604e83901b059150600060606bb17217f7d1cf79abc9e3b39884821b056b80000000000000000000000001901d6bb17217f7d1cf79abc9e3b39881029093037fffffffffffffffffffffffffffffffffffffffdbf3ccf1604d263450f02a550481018102606090811d6d0277594991cfc85f6e2461837cd9018202811d7fffffffffffffffffffffffffffffffffffffe5adedaa1cb095af9e4da10e363c018202811d6db1bbb201f443cf962f1a1d3db4a5018202811d7ffffffffffffffffffffffffffffffffffffd38dc772608b0ae56cce01296c0eb018202811d6e05180bb14799ab47a8a8cb2a527d57016d02d16720577bd19bf614176fe9ea6c10fe68e7fd37d0007b713f765084018402831d9081019084017ffffffffffffffffffffffffffffffffffffffe2c69812cf03b0763fd454a8f7e010290911d6e0587f503bb6ea29d25fcb7401964500190910279d835ebba824c98fb31b83b2ca45c000000000000000000000000010574029d9dc38563c32e5c2f6dc192ee70ef65f9978af30260c3939093039290921c92915050565b6000612652670de0b6b3a764000083613feb86613b13565b613ff59190615d74565b613fff9190615e30565b613deb565b60008054700100000000000000000000000000000000900460ff166002811115614030576140306157da565b14614067576040517f67fe195000000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b60006002878154811061407c5761407c615b50565b6000918252602082206005919091020160048101549092506fffffffffffffffffffffffffffffffff16908715821760011b90506140db7f00000000000000000000000000000000000000000000000000000000000000086001615bae565b614177826fffffffffffffffffffffffffffffffff167e09010a0d15021d0b0e10121619031e080c141c0f111807131b17061a05041f7f07c4acdd0000000000000000000000000000000000000000000000000000000067ffffffffffffffff831160061b83811c63ffffffff1060051b1792831c600181901c17600281901c17600481901c17600881901c17601081901c170260fb1c1a1790565b60ff16146141b1576040517f5f53dd9800000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b60008089156142a8576142047f00000000000000000000000000000000000000000000000000000000000000047f0000000000000000000000000000000000000000000000000000000000000008615bfe565b6001901b614223846fffffffffffffffffffffffffffffffff16615288565b6fffffffffffffffffffffffffffffffff1661423f9190615e98565b1561427c5761427361426460016fffffffffffffffffffffffffffffffff8716615eac565b865463ffffffff166000615327565b6003015461429e565b7f00000000000000000000000000000000000000000000000000000000000000005b91508490506142d2565b600385015491506142cf6142646fffffffffffffffffffffffffffffffff86166001615ed5565b90505b600882901b60088a8a6040516142e9929190615b40565b6040518091039020901b1461432a576040517f696550ff00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b60006143358c61540b565b90506000614344836003015490565b6040517fe14ced320000000000000000000000000000000000000000000000000000000081527f000000000000000000000000180cbe2ebb9f37d3a3c542ddc2546fd160555a7373ffffffffffffffffffffffffffffffffffffffff169063e14ced32906143be908f908f908f908f908a90600401615f49565b6020604051808303816000875af11580156143dd573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906144019190615cb2565b6004850154911491506000906002906144ac906fffffffffffffffffffffffffffffffff167e09010a0d15021d0b0e10121619031e080c141c0f111807131b17061a05041f7f07c4acdd0000000000000000000000000000000000000000000000000000000067ffffffffffffffff831160061b83811c63ffffffff1060051b1792831c600181901c17600281901c17600481901c17600881901c17601081901c170260fb1c1a1790565b614548896fffffffffffffffffffffffffffffffff167e09010a0d15021d0b0e10121619031e080c141c0f111807131b17061a05041f7f07c4acdd0000000000000000000000000000000000000000000000000000000067ffffffffffffffff831160061b83811c63ffffffff1060051b1792831c600181901c17600281901c17600481901c17600881901c17601081901c170260fb1c1a1790565b6145529190615f83565b61455c9190615fa6565b60ff16159050811515810361459d576040517ffb4e40dd00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b8754640100000000900473ffffffffffffffffffffffffffffffffffffffff16156145f4576040517f9071e6af00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b505085547fffffffffffffffff0000000000000000000000000000000000000000ffffffff163364010000000002179095555050505050505050505050565b600080600080600085905060006002828154811061465357614653615b50565b600091825260209091206004600590920201908101549091507f00000000000000000000000000000000000000000000000000000000000000049061472a906fffffffffffffffffffffffffffffffff167e09010a0d15021d0b0e10121619031e080c141c0f111807131b17061a05041f7f07c4acdd0000000000000000000000000000000000000000000000000000000067ffffffffffffffff831160061b83811c63ffffffff1060051b1792831c600181901c17600281901c17600481901c17600881901c17601081901c170260fb1c1a1790565b60ff1611614764576040517fb34b5c2200000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6000815b60048301547f00000000000000000000000000000000000000000000000000000000000000049061482b906fffffffffffffffffffffffffffffffff167e09010a0d15021d0b0e10121619031e080c141c0f111807131b17061a05041f7f07c4acdd0000000000000000000000000000000000000000000000000000000067ffffffffffffffff831160061b83811c63ffffffff1060051b1792831c600181901c17600281901c17600481901c17600881901c17601081901c170260fb1c1a1790565b60ff1692508211156148a057825463ffffffff1661486a7f00000000000000000000000000000000000000000000000000000000000000046001615bae565b8303614874578391505b6002818154811061488757614887615b50565b9060005260206000209060050201935080945050614768565b600481810154908401546fffffffffffffffffffffffffffffffff91821691166000816fffffffffffffffffffffffffffffffff166149096148f4856fffffffffffffffffffffffffffffffff1660011c90565b6fffffffffffffffffffffffffffffffff1690565b6fffffffffffffffffffffffffffffffff1614905080156149d8576000614941836fffffffffffffffffffffffffffffffff16615288565b6fffffffffffffffffffffffffffffffff1611156149ac57600061498361497b60016fffffffffffffffffffffffffffffffff8616615eac565b896001615327565b6003810154600490910154909c506fffffffffffffffffffffffffffffffff169a506149b29050565b6008549a505b600386015460048701549099506fffffffffffffffffffffffffffffffff169750614a2e565b60006149fa61497b6fffffffffffffffffffffffffffffffff85166001615ed5565b6003808901546004808b015492840154930154909e506fffffffffffffffffffffffffffffffff9182169d50919b50169850505b505050505050509193509193565b60006fffffffffffffffffffffffffffffffff841615614aa95760408051602081018790526fffffffffffffffffffffffffffffffff8087169282019290925260608101859052908316608082015260a00160405160208183030381529060405280519060200120611900565b8282604051602001614ad79291909182526fffffffffffffffffffffffffffffffff16602082015260400190565b6040516020818303038152906040528051906020012095945050505050565b600080614b83847e09010a0d15021d0b0e10121619031e080c141c0f111807131b17061a05041f7f07c4acdd0000000000000000000000000000000000000000000000000000000067ffffffffffffffff831160061b83811c63ffffffff1060051b1792831c600181901c17600281901c17600481901c17600881901c17601081901c170260fb1c1a1790565b60ff1690508083036001841b600180831b0386831b17039250505092915050565b60008060008360000151600003614be7576040517f5ab458fb00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6020840151805160001a607f8111614c0c57600060016000945094509450505061503b565b60b78111614d22576000614c21608083615bfe565b905080876000015111614c60576040517f66c9448500000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6001838101517fff00000000000000000000000000000000000000000000000000000000000000169082148015614cd857507f80000000000000000000000000000000000000000000000000000000000000007fff000000000000000000000000000000000000000000000000000000000000008216105b15614d0f576040517fbabb01dd00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b506001955093506000925061503b915050565b60bf8111614e80576000614d3760b783615bfe565b905080876000015111614d76576040517f66c9448500000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b60018301517fff00000000000000000000000000000000000000000000000000000000000000166000819003614dd8576040517fbabb01dd00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b600184015160088302610100031c60378111614e20576040517fbabb01dd00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b614e2a8184615bae565b895111614e63576040517f66c9448500000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b614e6e836001615bae565b975095506000945061503b9350505050565b60f78111614ee5576000614e9560c083615bfe565b905080876000015111614ed4576040517f66c9448500000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b60019550935084925061503b915050565b6000614ef260f783615bfe565b905080876000015111614f31576040517f66c9448500000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b60018301517fff00000000000000000000000000000000000000000000000000000000000000166000819003614f93576040517fbabb01dd00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b600184015160088302610100031c60378111614fdb576040517fbabb01dd00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b614fe58184615bae565b89511161501e576040517f66c9448500000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b615029836001615bae565b975095506001945061503b9350505050565b9193909250565b60608167ffffffffffffffff81111561505d5761505d615a84565b6040519080825280601f01601f191660200182016040528015615087576020820181803683370190505b50905081156150d057600061509c8486615bae565b90506020820160005b848110156150bd5782810151828201526020016150a5565b848111156150cc576000858301525b5050505b9392505050565b60006150f66fffffffffffffffffffffffffffffffff84166001615ed5565b9050600061510682866001615327565b9050600086901a83806151f2575061513f60027f0000000000000000000000000000000000000000000000000000000000000004615e98565b60048301546002906151e3906fffffffffffffffffffffffffffffffff167e09010a0d15021d0b0e10121619031e080c141c0f111807131b17061a05041f7f07c4acdd0000000000000000000000000000000000000000000000000000000067ffffffffffffffff831160061b83811c63ffffffff1060051b1792831c600181901c17600281901c17600481901c17600881901c17601081901c170260fb1c1a1790565b6151ed9190615fa6565b60ff16145b1561524a5760ff81166001148061520c575060ff81166002145b615245576040517ff40239db000000000000000000000000000000000000000000000000000000008152600481018890526024016137e4565b612a86565b60ff811615612a86576040517ff40239db000000000000000000000000000000000000000000000000000000008152600481018890526024016137e4565b600080615315837e09010a0d15021d0b0e10121619031e080c141c0f111807131b17061a05041f7f07c4acdd0000000000000000000000000000000000000000000000000000000067ffffffffffffffff831160061b83811c63ffffffff1060051b1792831c600181901c17600281901c17600481901c17600881901c17601081901c170260fb1c1a1790565b600160ff919091161b90920392915050565b600080826153705761536b6fffffffffffffffffffffffffffffffff86167f000000000000000000000000000000000000000000000000000000000000000461543a565b61538b565b61538b856fffffffffffffffffffffffffffffffff166155c6565b9050600284815481106153a0576153a0615b50565b906000526020600020906005020191505b60048201546fffffffffffffffffffffffffffffffff82811691161461540357815460028054909163ffffffff169081106153ee576153ee615b50565b906000526020600020906005020191506153b1565b509392505050565b600080600080600061541c86614633565b935093509350935061543084848484614a3c565b9695505050505050565b6000816154d9846fffffffffffffffffffffffffffffffff167e09010a0d15021d0b0e10121619031e080c141c0f111807131b17061a05041f7f07c4acdd0000000000000000000000000000000000000000000000000000000067ffffffffffffffff831160061b83811c63ffffffff1060051b1792831c600181901c17600281901c17600481901c17600881901c17601081901c170260fb1c1a1790565b60ff16116154ef5763b34b5c226000526004601cfd5b6154f8836155c6565b905081615597826fffffffffffffffffffffffffffffffff167e09010a0d15021d0b0e10121619031e080c141c0f111807131b17061a05041f7f07c4acdd0000000000000000000000000000000000000000000000000000000067ffffffffffffffff831160061b83811c63ffffffff1060051b1792831c600181901c17600281901c17600481901c17600881901c17601081901c170260fb1c1a1790565b60ff1611612655576126526155ad836001615bae565b6fffffffffffffffffffffffffffffffff83169061566b565b6000811960018301168161565a827e09010a0d15021d0b0e10121619031e080c141c0f111807131b17061a05041f7f07c4acdd0000000000000000000000000000000000000000000000000000000067ffffffffffffffff831160061b83811c63ffffffff1060051b1792831c600181901c17600281901c17600481901c17600881901c17601081901c170260fb1c1a1790565b60ff169390931c8015179392505050565b6000806156f8847e09010a0d15021d0b0e10121619031e080c141c0f111807131b17061a05041f7f07c4acdd0000000000000000000000000000000000000000000000000000000067ffffffffffffffff831160061b83811c63ffffffff1060051b1792831c600181901c17600281901c17600481901c17600881901c17601081901c170260fb1c1a1790565b60ff169050808303600180821b0385821b179250505092915050565b60008083601f84011261572657600080fd5b50813567ffffffffffffffff81111561573e57600080fd5b60208301915083602082850101111561575657600080fd5b9250929050565b600080600083850360a081121561577357600080fd5b608081121561578157600080fd5b50839250608084013567ffffffffffffffff81111561579f57600080fd5b6157ab86828701615714565b9497909650939450505050565b600080604083850312156157cb57600080fd5b50508035926020909101359150565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602160045260246000fd5b6020810160038310615844577f4e487b7100000000000000000000000000000000000000000000000000000000600052602160045260246000fd5b91905290565b60008060006060848603121561585f57600080fd5b505081359360208301359350604090920135919050565b6000815180845260005b8181101561589c57602081850181015186830182015201615880565b818111156158ae576000602083870101525b50601f017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0169290920160200192915050565b6020815260006126526020830184615876565b60006020828403121561590657600080fd5b5035919050565b73ffffffffffffffffffffffffffffffffffffffff8116811461592f57600080fd5b50565b60006020828403121561594457600080fd5b81356150d08161590d565b8035801515811461595f57600080fd5b919050565b6000806000806080858703121561597a57600080fd5b8435935060208501359250604085013591506159986060860161594f565b905092959194509250565b6000602082840312156159b557600080fd5b81356fffffffffffffffffffffffffffffffff811681146150d057600080fd5b600080600080600080608087890312156159ee57600080fd5b863595506159fe6020880161594f565b9450604087013567ffffffffffffffff80821115615a1b57600080fd5b615a278a838b01615714565b90965094506060890135915080821115615a4057600080fd5b50615a4d89828a01615714565b979a9699509497509295939492505050565b63ffffffff841681528260208201526060604082015260006119006060830184615876565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b600060808284031215615ac557600080fd5b6040516080810181811067ffffffffffffffff82111715615b0f577f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b8060405250823581526020830135602082015260408301356040820152606083013560608201528091505092915050565b8183823760009101908152919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b60008219821115615bc157615bc1615b7f565b500190565b60007fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff8203615bf757615bf7615b7f565b5060010190565b600082821015615c1057615c10615b7f565b500390565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601260045260246000fd5b600082615c5357615c53615c15565b500490565b6000817fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0483118215151615615c9057615c90615b7f565b500290565b600060208284031215615ca757600080fd5b81516150d08161590d565b600060208284031215615cc457600080fd5b5051919050565b600067ffffffffffffffff808316818516808303821115615cee57615cee615b7f565b01949350505050565b600067ffffffffffffffff80831681851681830481118215151615615d1e57615d1e615b7f565b02949350505050565b600067ffffffffffffffff83811690831681811015615d4857615d48615b7f565b039392505050565b60008060408385031215615d6357600080fd5b505080516020909101519092909150565b60007f7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff600084136000841385830485118282161615615db557615db5615b7f565b7f80000000000000000000000000000000000000000000000000000000000000006000871286820588128184161615615df057615df0615b7f565b60008712925087820587128484161615615e0c57615e0c615b7f565b87850587128184161615615e2257615e22615b7f565b505050929093029392505050565b600082615e3f57615e3f615c15565b7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff83147f800000000000000000000000000000000000000000000000000000000000000083141615615e9357615e93615b7f565b500590565b600082615ea757615ea7615c15565b500690565b60006fffffffffffffffffffffffffffffffff83811690831681811015615d4857615d48615b7f565b60006fffffffffffffffffffffffffffffffff808316818516808303821115615cee57615cee615b7f565b8183528181602085013750600060208284010152600060207fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0601f840116840101905092915050565b606081526000615f5d606083018789615f00565b8281036020840152615f70818688615f00565b9150508260408301529695505050505050565b600060ff821660ff841680821015615f9d57615f9d615b7f565b90039392505050565b600060ff831680615fb957615fb9615c15565b8060ff8416069150509291505056fea164736f6c634300080f000a"; } diff --git a/packages/contracts-bedrock/test/kontrol/proofs/utils/DeploymentSummaryFaultProofs.sol b/packages/contracts-bedrock/test/kontrol/proofs/utils/DeploymentSummaryFaultProofs.sol index 0cc9355659d5..3b54141df2d7 100644 --- a/packages/contracts-bedrock/test/kontrol/proofs/utils/DeploymentSummaryFaultProofs.sol +++ b/packages/contracts-bedrock/test/kontrol/proofs/utils/DeploymentSummaryFaultProofs.sol @@ -12,35 +12,41 @@ contract DeploymentSummaryFaultProofs is DeploymentSummaryFaultProofsCode { 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 addressManagerAddress = 0x50EEf481cae4250d252Ae577A09bF514f224C6C4; + address internal constant anchorStateRegistryAddress = 0xdEC4D949Cf1A2e824eE4F8B12064e166b96171dD; + address internal constant anchorStateRegistryProxyAddress = 0x970670459734a83899773A0fd45941B5afC1200e; + address internal constant delayedWETHAddress = 0xe49cED258137CC5E18fB9ABA2Aa14069263D8f49; + address internal constant delayedWETHProxyAddress = 0xEF179756ea6525AFade217cA5aB0b1b5CfE0fd92; + address internal constant disputeGameFactoryAddress = 0x8efDa795511CBBdfFC9eeca1a5bF30f5B1E1ef9E; + address internal constant disputeGameFactoryProxyAddress = 0x5207CfA0166E8de0FCdFd78B4d17b68587bE306d; + address internal constant l1CrossDomainMessengerAddress = 0x357B6CdA94109749a0dA475ac1BFd395a61eb908; + address internal constant l1CrossDomainMessengerProxyAddress = 0xDeF3bca8c80064589E6787477FFa7Dd616B5574F; + address internal constant l1ERC721BridgeAddress = 0xA4BD7E58A30ED0477fe7372883d09bF86619Bb66; 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 = 0x1182f45ae539e18534cbCC222c1C3D972B5Ba24D; - address internal constant systemConfigProxyAddress = 0x20A42a5a785622c6Ba2576B2D6e924aA82BFA11D; - address internal constant systemOwnerSafeAddress = 0x7d039be7F9b5190147621b02e82B250e1D748e02; - address internal constant acc27Address = 0x12e721c390F5728200a26BBEf206A5F4F7E991f3; - address internal constant acc28Address = 0x2abb7CBB720020ee3C9ecf3915D14B6d1886A577; + address internal constant l1StandardBridgeAddress = 0x6cb2c88ABCd6391F9496f44BE27d5D3b247E0159; + address internal constant l1StandardBridgeProxyAddress = 0x20A42a5a785622c6Ba2576B2D6e924aA82BFA11D; + address internal constant l2OutputOracleAddress = 0x60d37db59d0D14f7EA5c7425A2C03244E08B162D; + address internal constant l2OutputOracleProxyAddress = 0x39Af23E00F1e662025aA01b0cEdA19542B78DF99; + address internal constant mipsAddress = 0x180CBe2EBb9F37D3a3C542DDc2546Fd160555a73; + address internal constant optimismMintableERC20FactoryAddress = 0x79c3114E5f89266e2C8842871Bce16D4e5076b1e; + address internal constant optimismMintableERC20FactoryProxyAddress = 0xc7B87b2b892EA5C3CfF47168881FE168C00377FB; + address internal constant optimismPortalAddress = 0xb5A42f01EF5068F82C11fa1c4F9bBD4c8D346961; + address internal constant optimismPortal2Address = 0x150581358018524994Fc29800b1783637943b103; + address internal constant optimismPortalProxyAddress = 0x1c23A6d89F95ef3148BCDA8E242cAb145bf9c0E4; + address internal constant permissionedDelayedWETHProxyAddress = 0xd6EAF4c146261653EE059077B78ED088Add54309; + address internal constant preimageOracleAddress = 0x7A9Eab4CE99d157AeE7A02E95b366E972a2D5b0b; + address internal constant protocolVersionsAddress = 0xa99F1ab91821747b76Ec0cDFA38368DF4Ba06E84; + address internal constant protocolVersionsProxyAddress = 0x4C52a6277b1B84121b3072C0c92b6Be0b7CC10F1; + address internal constant proxyAdminAddress = 0x62c20Aa1e0272312BC100b4e23B4DC1Ed96dD7D1; + address internal constant safeProxyFactoryAddress = 0xA8452Ec99ce0C64f20701dB7dD3abDb607c00496; + address internal constant safeSingletonAddress = 0xBb2180ebd78ce97360503434eD37fcf4a1Df61c3; + address internal constant superchainConfigAddress = 0xDAf629c26abd7a84B6330c369887053B75dB2AF2; + address internal constant superchainConfigProxyAddress = 0x4f559F30f5eB88D635FDe1548C4267DB8FaB0351; + address internal constant systemConfigAddress = 0xd9CEcA938f039e427Edf626FA1f377d23A6b60c9; + address internal constant systemConfigProxyAddress = 0x0c8b5822b6e02CDa722174F19A1439A7495a3fA6; + address internal constant systemOwnerSafeAddress = 0x7C0c8a15773ED7B50E7c738D1aF4c5e3a2b210BD; + address internal constant acc33Address = 0xb6b1579AA54e2F61e621a40d5F2704D717B3544F; + address internal constant acc34Address = 0x59B99034FBdd5E554661a2100cB2b6b7C5d495F8; function recreateDeployment() public { bytes32 slot; @@ -52,7 +58,7 @@ contract DeploymentSummaryFaultProofs is DeploymentSummaryFaultProofsCode { vm.store(safeSingletonAddress, slot, value); vm.etch(systemOwnerSafeAddress, systemOwnerSafeCode); slot = hex"0000000000000000000000000000000000000000000000000000000000000000"; - value = hex"00000000000000000000000090193c961a926261b756d1e5bb255e67ff9498a1"; + value = hex"000000000000000000000000bb2180ebd78ce97360503434ed37fcf4a1df61c3"; vm.store(systemOwnerSafeAddress, slot, value); slot = hex"e90b7bceb6e7df5418fb78d8ee546e97c83a08bbccc01a0644d599ccd2a7c2e0"; value = hex"0000000000000000000000001804c8ab1f12e6bbf3894d4083f33e07309d1f38"; @@ -78,14 +84,14 @@ contract DeploymentSummaryFaultProofs is DeploymentSummaryFaultProofsCode { value = hex"0000000000000000000000001804c8ab1f12e6bbf3894d4083f33e07309d1f38"; vm.store(proxyAdminAddress, slot, value); slot = hex"0000000000000000000000000000000000000000000000000000000000000003"; - value = hex"000000000000000000000000bb2180ebd78ce97360503434ed37fcf4a1df61c3"; + value = hex"00000000000000000000000050eef481cae4250d252ae577a09bf514f224c6c4"; vm.store(proxyAdminAddress, slot, value); slot = hex"0000000000000000000000000000000000000000000000000000000000000000"; - value = hex"0000000000000000000000007d039be7f9b5190147621b02e82b250e1d748e02"; + value = hex"0000000000000000000000007c0c8a15773ed7b50e7c738d1af4c5e3a2b210bd"; vm.store(proxyAdminAddress, slot, value); vm.etch(superchainConfigProxyAddress, superchainConfigProxyCode); slot = hex"b53127684a568b3173ae13b9f8a6016e243e63b6e8ee1178d6a717850b5d6103"; - value = hex"000000000000000000000000db8cff278adccf9e9b5da745b44e754fc4ee3c76"; + value = hex"00000000000000000000000062c20aa1e0272312bc100b4e23b4dc1ed96dd7d1"; vm.store(superchainConfigProxyAddress, slot, value); vm.etch(superchainConfigAddress, superchainConfigCode); slot = hex"0000000000000000000000000000000000000000000000000000000000000000"; @@ -101,7 +107,7 @@ contract DeploymentSummaryFaultProofs is DeploymentSummaryFaultProofsCode { value = hex"0000000000000000000000000000000000000000000000000000000000000001"; vm.store(systemOwnerSafeAddress, slot, value); slot = hex"360894a13ba1a3210667c828492db98dca3e2076cc3735a920a3ca505d382bbc"; - value = hex"000000000000000000000000068e44eb31e111028c41598e4535be7468674d0a"; + value = hex"000000000000000000000000daf629c26abd7a84b6330c369887053b75db2af2"; vm.store(superchainConfigProxyAddress, slot, value); slot = hex"0000000000000000000000000000000000000000000000000000000000000000"; value = hex"0000000000000000000000000000000000000000000000000000000000000001"; @@ -117,7 +123,7 @@ contract DeploymentSummaryFaultProofs is DeploymentSummaryFaultProofsCode { vm.store(superchainConfigProxyAddress, slot, value); vm.etch(protocolVersionsProxyAddress, protocolVersionsProxyCode); slot = hex"b53127684a568b3173ae13b9f8a6016e243e63b6e8ee1178d6a717850b5d6103"; - value = hex"000000000000000000000000db8cff278adccf9e9b5da745b44e754fc4ee3c76"; + value = hex"00000000000000000000000062c20aa1e0272312bc100b4e23b4dc1ed96dd7d1"; vm.store(protocolVersionsProxyAddress, slot, value); vm.etch(protocolVersionsAddress, protocolVersionsCode); slot = hex"0000000000000000000000000000000000000000000000000000000000000000"; @@ -139,7 +145,7 @@ contract DeploymentSummaryFaultProofs is DeploymentSummaryFaultProofsCode { value = hex"0000000000000000000000000000000000000000000000000000000000000002"; vm.store(systemOwnerSafeAddress, slot, value); slot = hex"360894a13ba1a3210667c828492db98dca3e2076cc3735a920a3ca505d382bbc"; - value = hex"000000000000000000000000fbfd64a6c0257f613fefce050aa30ecc3e3d7c3f"; + value = hex"000000000000000000000000a99f1ab91821747b76ec0cdfa38368df4ba06e84"; vm.store(protocolVersionsProxyAddress, slot, value); slot = hex"0000000000000000000000000000000000000000000000000000000000000000"; value = hex"0000000000000000000000000000000000000000000000000000000000000001"; @@ -148,7 +154,7 @@ contract DeploymentSummaryFaultProofs is DeploymentSummaryFaultProofsCode { value = hex"0000000000000000000000000000000000000000000000000000000000000101"; vm.store(protocolVersionsProxyAddress, slot, value); slot = hex"0000000000000000000000000000000000000000000000000000000000000033"; - value = hex"000000000000000000000000db8cff278adccf9e9b5da745b44e754fc4ee3c76"; + value = hex"00000000000000000000000062c20aa1e0272312bc100b4e23b4dc1ed96dd7d1"; vm.store(protocolVersionsProxyAddress, slot, value); slot = hex"0000000000000000000000000000000000000000000000000000000000000033"; value = hex"0000000000000000000000009965507d1a55bcc2695c58ba16fb37d819b0a4dc"; @@ -158,61 +164,54 @@ contract DeploymentSummaryFaultProofs is DeploymentSummaryFaultProofsCode { vm.store(protocolVersionsProxyAddress, slot, value); vm.etch(optimismPortalProxyAddress, optimismPortalProxyCode); slot = hex"b53127684a568b3173ae13b9f8a6016e243e63b6e8ee1178d6a717850b5d6103"; - value = hex"000000000000000000000000db8cff278adccf9e9b5da745b44e754fc4ee3c76"; + value = hex"00000000000000000000000062c20aa1e0272312bc100b4e23b4dc1ed96dd7d1"; 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"; + value = hex"00000000000000000000000062c20aa1e0272312bc100b4e23b4dc1ed96dd7d1"; vm.store(systemConfigProxyAddress, slot, value); vm.etch(l1StandardBridgeProxyAddress, l1StandardBridgeProxyCode); slot = hex"b53127684a568b3173ae13b9f8a6016e243e63b6e8ee1178d6a717850b5d6103"; - value = hex"000000000000000000000000db8cff278adccf9e9b5da745b44e754fc4ee3c76"; + value = hex"00000000000000000000000062c20aa1e0272312bc100b4e23b4dc1ed96dd7d1"; vm.store(l1StandardBridgeProxyAddress, slot, value); vm.etch(l1CrossDomainMessengerProxyAddress, l1CrossDomainMessengerProxyCode); - slot = hex"f6cecbacbfeb99e6ab0f02c22fd8a103f8837deb80af03d481ac5bc8d5475f58"; - value = hex"000000000000000000000000bb2180ebd78ce97360503434ed37fcf4a1df61c3"; + slot = hex"191cda7b5a8219e0cc3bb6c2b45be830e3ba520f78e119446a476c4147fcc284"; + value = hex"00000000000000000000000050eef481cae4250d252ae577a09bf514f224c6c4"; vm.store(l1CrossDomainMessengerProxyAddress, slot, value); - slot = hex"ceb2ac3d439ba35adb9a3f2ba6c37d15a264e79156ee79334f5d4c00090812d2"; + slot = hex"6822ddba83a78589c753bb747cf4919773ec1d36eeb0bb2a09d64b6d87adda0b"; value = hex"4f564d5f4c3143726f7373446f6d61696e4d657373656e676572000000000034"; vm.store(l1CrossDomainMessengerProxyAddress, slot, value); + vm.etch(optimismMintableERC20FactoryProxyAddress, optimismMintableERC20FactoryProxyCode); + slot = hex"b53127684a568b3173ae13b9f8a6016e243e63b6e8ee1178d6a717850b5d6103"; + value = hex"00000000000000000000000062c20aa1e0272312bc100b4e23b4dc1ed96dd7d1"; + vm.store(optimismMintableERC20FactoryProxyAddress, slot, value); vm.etch(l1ERC721BridgeProxyAddress, l1ERC721BridgeProxyCode); slot = hex"b53127684a568b3173ae13b9f8a6016e243e63b6e8ee1178d6a717850b5d6103"; - value = hex"000000000000000000000000db8cff278adccf9e9b5da745b44e754fc4ee3c76"; + value = hex"00000000000000000000000062c20aa1e0272312bc100b4e23b4dc1ed96dd7d1"; vm.store(l1ERC721BridgeProxyAddress, slot, value); + vm.etch(disputeGameFactoryProxyAddress, disputeGameFactoryProxyCode); + slot = hex"b53127684a568b3173ae13b9f8a6016e243e63b6e8ee1178d6a717850b5d6103"; + value = hex"00000000000000000000000062c20aa1e0272312bc100b4e23b4dc1ed96dd7d1"; + vm.store(disputeGameFactoryProxyAddress, slot, value); + vm.etch(l2OutputOracleProxyAddress, l2OutputOracleProxyCode); + slot = hex"b53127684a568b3173ae13b9f8a6016e243e63b6e8ee1178d6a717850b5d6103"; + value = hex"00000000000000000000000062c20aa1e0272312bc100b4e23b4dc1ed96dd7d1"; + vm.store(l2OutputOracleProxyAddress, slot, value); + vm.etch(delayedWETHProxyAddress, delayedWETHProxyCode); + slot = hex"b53127684a568b3173ae13b9f8a6016e243e63b6e8ee1178d6a717850b5d6103"; + value = hex"00000000000000000000000062c20aa1e0272312bc100b4e23b4dc1ed96dd7d1"; + vm.store(delayedWETHProxyAddress, slot, value); + vm.etch(permissionedDelayedWETHProxyAddress, permissionedDelayedWETHProxyCode); + slot = hex"b53127684a568b3173ae13b9f8a6016e243e63b6e8ee1178d6a717850b5d6103"; + value = hex"00000000000000000000000062c20aa1e0272312bc100b4e23b4dc1ed96dd7d1"; + vm.store(permissionedDelayedWETHProxyAddress, slot, value); + vm.etch(anchorStateRegistryProxyAddress, anchorStateRegistryProxyCode); + slot = hex"b53127684a568b3173ae13b9f8a6016e243e63b6e8ee1178d6a717850b5d6103"; + value = hex"00000000000000000000000062c20aa1e0272312bc100b4e23b4dc1ed96dd7d1"; + vm.store(anchorStateRegistryProxyAddress, slot, value); slot = hex"0000000000000000000000000000000000000000000000000000000000000000"; - value = hex"000000000000000000000000db8cff278adccf9e9b5da745b44e754fc4ee3c76"; + value = hex"00000000000000000000000062c20aa1e0272312bc100b4e23b4dc1ed96dd7d1"; 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"; @@ -229,6 +228,16 @@ contract DeploymentSummaryFaultProofs is DeploymentSummaryFaultProofsCode { slot = hex"0000000000000000000000000000000000000000000000000000000000000000"; value = hex"0000000000000000000000010000000000000000000000000000000000000000"; vm.store(l1CrossDomainMessengerAddress, slot, value); + vm.etch(optimismMintableERC20FactoryAddress, optimismMintableERC20FactoryCode); + slot = hex"0000000000000000000000000000000000000000000000000000000000000000"; + value = hex"0000000000000000000000000000000000000000000000000000000000000001"; + vm.store(optimismMintableERC20FactoryAddress, slot, value); + slot = hex"0000000000000000000000000000000000000000000000000000000000000000"; + value = hex"0000000000000000000000000000000000000000000000000000000000000101"; + vm.store(optimismMintableERC20FactoryAddress, slot, value); + slot = hex"0000000000000000000000000000000000000000000000000000000000000000"; + value = hex"0000000000000000000000000000000000000000000000000000000000000001"; + vm.store(optimismMintableERC20FactoryAddress, slot, value); vm.etch(systemConfigAddress, systemConfigCode); slot = hex"a11ee3ab75b40e88a0105e935d17cd36c8faee0138320d776c411291bdbbb19f"; value = hex"ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff"; @@ -283,6 +292,57 @@ contract DeploymentSummaryFaultProofs is DeploymentSummaryFaultProofsCode { slot = hex"0000000000000000000000000000000000000000000000000000000000000000"; value = hex"0000000000000000000000000000000000000000000000000000000000000001"; vm.store(l1ERC721BridgeAddress, slot, value); + vm.etch(optimismPortalAddress, optimismPortalCode); + slot = hex"0000000000000000000000000000000000000000000000000000000000000000"; + value = hex"0000000000000000000000000000000000000000000000000000000000000001"; + vm.store(optimismPortalAddress, slot, value); + slot = hex"0000000000000000000000000000000000000000000000000000000000000000"; + value = hex"0000000000000000000000000000000000000000000000000000000000000101"; + vm.store(optimismPortalAddress, slot, value); + slot = hex"0000000000000000000000000000000000000000000000000000000000000032"; + value = hex"000000000000000000000000000000000000000000000000000000000000dead"; + vm.store(optimismPortalAddress, slot, value); + slot = hex"0000000000000000000000000000000000000000000000000000000000000001"; + value = hex"000000000000000100000000000000000000000000000000000000003b9aca00"; + vm.store(optimismPortalAddress, slot, value); + slot = hex"0000000000000000000000000000000000000000000000000000000000000000"; + value = hex"0000000000000000000000000000000000000000000000000000000000000001"; + vm.store(optimismPortalAddress, slot, value); + vm.etch(l2OutputOracleAddress, l2OutputOracleCode); + slot = hex"0000000000000000000000000000000000000000000000000000000000000000"; + value = hex"0000000000000000000000000000000000000000000000000000000000000001"; + vm.store(l2OutputOracleAddress, slot, value); + slot = hex"0000000000000000000000000000000000000000000000000000000000000000"; + value = hex"0000000000000000000000000000000000000000000000000000000000000101"; + vm.store(l2OutputOracleAddress, slot, value); + slot = hex"0000000000000000000000000000000000000000000000000000000000000004"; + value = hex"0000000000000000000000000000000000000000000000000000000000000001"; + vm.store(l2OutputOracleAddress, slot, value); + slot = hex"0000000000000000000000000000000000000000000000000000000000000005"; + value = hex"0000000000000000000000000000000000000000000000000000000000000001"; + vm.store(l2OutputOracleAddress, slot, value); + slot = hex"0000000000000000000000000000000000000000000000000000000000000000"; + value = hex"0000000000000000000000000000000000000000000000000000000000000001"; + vm.store(l2OutputOracleAddress, 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(disputeGameFactoryAddress, disputeGameFactoryCode); slot = hex"0000000000000000000000000000000000000000000000000000000000000000"; value = hex"0000000000000000000000000000000000000000000000000000000000000001"; @@ -364,19 +424,46 @@ contract DeploymentSummaryFaultProofs is DeploymentSummaryFaultProofsCode { vm.etch(mipsAddress, mipsCode); vm.etch(anchorStateRegistryAddress, anchorStateRegistryCode); slot = hex"0000000000000000000000000000000000000000000000000000000000000000"; - value = hex"0000000000000000000000000000000000000000000000000000000000000001"; + value = hex"00000000000000000000000000000000000000000000000000000000000000ff"; vm.store(anchorStateRegistryAddress, slot, value); + slot = hex"0000000000000000000000000000000000000000000000000000000000000005"; + value = hex"0000000000000000000000000000000000000000000000000000000000000003"; + vm.store(systemOwnerSafeAddress, slot, value); + slot = hex"360894a13ba1a3210667c828492db98dca3e2076cc3735a920a3ca505d382bbc"; + value = hex"000000000000000000000000150581358018524994fc29800b1783637943b103"; + vm.store(optimismPortalProxyAddress, slot, value); + slot = hex"0000000000000000000000000000000000000000000000000000000000000000"; + value = hex"0000000000000000000000000000000000000000000000000000000000000001"; + vm.store(optimismPortalProxyAddress, slot, value); slot = hex"0000000000000000000000000000000000000000000000000000000000000000"; value = hex"0000000000000000000000000000000000000000000000000000000000000101"; - vm.store(anchorStateRegistryAddress, slot, value); + vm.store(optimismPortalProxyAddress, slot, value); + slot = hex"0000000000000000000000000000000000000000000000000000000000000038"; + value = hex"0000000000000000000000005207cfa0166e8de0fcdfd78b4d17b68587be306d"; + vm.store(optimismPortalProxyAddress, slot, value); + slot = hex"0000000000000000000000000000000000000000000000000000000000000037"; + value = hex"0000000000000000000000000c8b5822b6e02cda722174f19a1439a7495a3fa6"; + vm.store(optimismPortalProxyAddress, slot, value); + slot = hex"0000000000000000000000000000000000000000000000000000000000000035"; + value = hex"00000000000000000000004f559f30f5eb88d635fde1548c4267db8fab035100"; + 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(anchorStateRegistryAddress, slot, value); + vm.store(optimismPortalProxyAddress, slot, value); slot = hex"0000000000000000000000000000000000000000000000000000000000000005"; - value = hex"0000000000000000000000000000000000000000000000000000000000000003"; + value = hex"0000000000000000000000000000000000000000000000000000000000000004"; vm.store(systemOwnerSafeAddress, slot, value); slot = hex"360894a13ba1a3210667c828492db98dca3e2076cc3735a920a3ca505d382bbc"; - value = hex"0000000000000000000000001182f45ae539e18534cbcc222c1c3d972b5ba24d"; + value = hex"000000000000000000000000d9ceca938f039e427edf626fa1f377d23a6b60c9"; vm.store(systemConfigProxyAddress, slot, value); slot = hex"0000000000000000000000000000000000000000000000000000000000000000"; value = hex"0000000000000000000000000000000000000000000000000000000000000001"; @@ -385,7 +472,7 @@ contract DeploymentSummaryFaultProofs is DeploymentSummaryFaultProofsCode { value = hex"0000000000000000000000000000000000000000000000000000000000000101"; vm.store(systemConfigProxyAddress, slot, value); slot = hex"0000000000000000000000000000000000000000000000000000000000000033"; - value = hex"000000000000000000000000db8cff278adccf9e9b5da745b44e754fc4ee3c76"; + value = hex"00000000000000000000000062c20aa1e0272312bc100b4e23b4dc1ed96dd7d1"; vm.store(systemConfigProxyAddress, slot, value); slot = hex"0000000000000000000000000000000000000000000000000000000000000033"; value = hex"0000000000000000000000009965507d1a55bcc2695c58ba16fb37d819b0a4dc"; @@ -409,19 +496,22 @@ contract DeploymentSummaryFaultProofs is DeploymentSummaryFaultProofsCode { value = hex"000000000000000000000000ff00000000000000000000000000000000000000"; vm.store(systemConfigProxyAddress, slot, value); slot = hex"383f291819e6d54073bc9a648251d97421076bdd101933c0c022219ce9580636"; - value = hex"000000000000000000000000c7b87b2b892ea5c3cff47168881fe168c00377fb"; + value = hex"000000000000000000000000def3bca8c80064589e6787477ffa7dd616b5574f"; vm.store(systemConfigProxyAddress, slot, value); slot = hex"46adcbebc6be8ce551740c29c47c8798210f23f7f4086c41752944352568d5a7"; value = hex"000000000000000000000000d31598c909d9c935a9e35ba70d9a3dd47d4d5865"; vm.store(systemConfigProxyAddress, slot, value); slot = hex"9904ba90dde5696cda05c9e0dab5cbaa0fea005ace4d11218a02ac668dad6376"; - value = hex"000000000000000000000000def3bca8c80064589e6787477ffa7dd616b5574f"; + value = hex"00000000000000000000000020a42a5a785622c6ba2576b2d6e924aa82bfa11d"; vm.store(systemConfigProxyAddress, slot, value); slot = hex"52322a25d9f59ea17656545543306b7aef62bc0cc53a0e65ccfa0c75b97aa906"; - value = hex"0000000000000000000000008b71b41d4dbeb2b6821d44692d3facaaf77480bb"; + value = hex"0000000000000000000000005207cfa0166e8de0fcdfd78b4d17b68587be306d"; vm.store(systemConfigProxyAddress, slot, value); slot = hex"4b6c74f9e688cb39801f2112c14a8c57232a3fc5202e1444126d4bce86eb19ac"; - value = hex"000000000000000000000000978e3286eb805934215a88694d80b09aded68d90"; + value = hex"0000000000000000000000001c23a6d89f95ef3148bcda8e242cab145bf9c0e4"; + vm.store(systemConfigProxyAddress, slot, value); + slot = hex"a04c5bb938ca6fc46d95553abf0a76345ce3e722a30bf4f74928b8e7d852320c"; + value = hex"000000000000000000000000c7b87b2b892ea5c3cff47168881fe168c00377fb"; vm.store(systemConfigProxyAddress, slot, value); slot = hex"a11ee3ab75b40e88a0105e935d17cd36c8faee0138320d776c411291bdbbb19f"; value = hex"0000000000000000000000000000000000000000000000000000000000000001"; @@ -433,16 +523,16 @@ contract DeploymentSummaryFaultProofs is DeploymentSummaryFaultProofsCode { value = hex"0000000000000000000000000000000000000000000000000000000000000001"; vm.store(systemConfigProxyAddress, slot, value); slot = hex"0000000000000000000000000000000000000000000000000000000000000005"; - value = hex"0000000000000000000000000000000000000000000000000000000000000004"; + value = hex"0000000000000000000000000000000000000000000000000000000000000005"; vm.store(systemOwnerSafeAddress, slot, value); - slot = hex"191cda7b5a8219e0cc3bb6c2b45be830e3ba520f78e119446a476c4147fcc284"; + slot = hex"540cf4e2f45b866b44f44bde51e109474016dc46a0670fbe1684ad8eaf90fdc3"; value = hex"0000000000000000000000000000000000000000000000000000000000000001"; vm.store(proxyAdminAddress, slot, value); slot = hex"0000000000000000000000000000000000000000000000000000000000000005"; - value = hex"0000000000000000000000000000000000000000000000000000000000000005"; + value = hex"0000000000000000000000000000000000000000000000000000000000000006"; vm.store(systemOwnerSafeAddress, slot, value); slot = hex"360894a13ba1a3210667c828492db98dca3e2076cc3735a920a3ca505d382bbc"; - value = hex"00000000000000000000000004c50b398cd4182428e79f7186b7c919cf17e86f"; + value = hex"0000000000000000000000006cb2c88abcd6391f9496f44be27d5d3b247e0159"; vm.store(l1StandardBridgeProxyAddress, slot, value); slot = hex"0000000000000000000000000000000000000000000000000000000000000000"; value = hex"0000000000000000000000000000000000000000000000000000000000000001"; @@ -451,13 +541,13 @@ contract DeploymentSummaryFaultProofs is DeploymentSummaryFaultProofsCode { value = hex"0000000000000000000000000000000000000000000000000000000000000101"; vm.store(l1StandardBridgeProxyAddress, slot, value); slot = hex"0000000000000000000000000000000000000000000000000000000000000032"; - value = hex"000000000000000000000000deb1e9a6be7baf84208bb6e10ac9f9bbe1d70809"; + value = hex"0000000000000000000000004f559f30f5eb88d635fde1548c4267db8fab0351"; vm.store(l1StandardBridgeProxyAddress, slot, value); slot = hex"0000000000000000000000000000000000000000000000000000000000000033"; - value = hex"00000000000000000000000020a42a5a785622c6ba2576b2d6e924aa82bfa11d"; + value = hex"0000000000000000000000000c8b5822b6e02cda722174f19a1439a7495a3fa6"; vm.store(l1StandardBridgeProxyAddress, slot, value); slot = hex"0000000000000000000000000000000000000000000000000000000000000003"; - value = hex"000000000000000000000000c7b87b2b892ea5c3cff47168881fe168c00377fb"; + value = hex"000000000000000000000000def3bca8c80064589e6787477ffa7dd616b5574f"; vm.store(l1StandardBridgeProxyAddress, slot, value); slot = hex"0000000000000000000000000000000000000000000000000000000000000004"; value = hex"0000000000000000000000004200000000000000000000000000000000000010"; @@ -466,10 +556,10 @@ contract DeploymentSummaryFaultProofs is DeploymentSummaryFaultProofsCode { value = hex"0000000000000000000000000000000000000000000000000000000000000001"; vm.store(l1StandardBridgeProxyAddress, slot, value); slot = hex"0000000000000000000000000000000000000000000000000000000000000005"; - value = hex"0000000000000000000000000000000000000000000000000000000000000006"; + value = hex"0000000000000000000000000000000000000000000000000000000000000007"; vm.store(systemOwnerSafeAddress, slot, value); slot = hex"360894a13ba1a3210667c828492db98dca3e2076cc3735a920a3ca505d382bbc"; - value = hex"00000000000000000000000044637a4292e0cd2b17a55d5f6b2f05afcacd0586"; + value = hex"000000000000000000000000a4bd7e58a30ed0477fe7372883d09bf86619bb66"; vm.store(l1ERC721BridgeProxyAddress, slot, value); slot = hex"0000000000000000000000000000000000000000000000000000000000000000"; value = hex"0000000000000000000000000000000000000000000000000000000000000001"; @@ -478,10 +568,10 @@ contract DeploymentSummaryFaultProofs is DeploymentSummaryFaultProofsCode { value = hex"0000000000000000000000000000000000000000000000000000000000000101"; vm.store(l1ERC721BridgeProxyAddress, slot, value); slot = hex"0000000000000000000000000000000000000000000000000000000000000032"; - value = hex"000000000000000000000000deb1e9a6be7baf84208bb6e10ac9f9bbe1d70809"; + value = hex"0000000000000000000000004f559f30f5eb88d635fde1548c4267db8fab0351"; vm.store(l1ERC721BridgeProxyAddress, slot, value); slot = hex"0000000000000000000000000000000000000000000000000000000000000001"; - value = hex"000000000000000000000000c7b87b2b892ea5c3cff47168881fe168c00377fb"; + value = hex"000000000000000000000000def3bca8c80064589e6787477ffa7dd616b5574f"; vm.store(l1ERC721BridgeProxyAddress, slot, value); slot = hex"0000000000000000000000000000000000000000000000000000000000000002"; value = hex"0000000000000000000000004200000000000000000000000000000000000014"; @@ -490,22 +580,40 @@ contract DeploymentSummaryFaultProofs is DeploymentSummaryFaultProofsCode { value = hex"0000000000000000000000000000000000000000000000000000000000000001"; vm.store(l1ERC721BridgeProxyAddress, slot, value); slot = hex"0000000000000000000000000000000000000000000000000000000000000005"; - value = hex"0000000000000000000000000000000000000000000000000000000000000007"; + value = hex"0000000000000000000000000000000000000000000000000000000000000008"; + vm.store(systemOwnerSafeAddress, slot, value); + slot = hex"360894a13ba1a3210667c828492db98dca3e2076cc3735a920a3ca505d382bbc"; + value = hex"00000000000000000000000079c3114e5f89266e2c8842871bce16d4e5076b1e"; + vm.store(optimismMintableERC20FactoryProxyAddress, slot, value); + slot = hex"0000000000000000000000000000000000000000000000000000000000000000"; + value = hex"0000000000000000000000000000000000000000000000000000000000000001"; + vm.store(optimismMintableERC20FactoryProxyAddress, slot, value); + slot = hex"0000000000000000000000000000000000000000000000000000000000000000"; + value = hex"0000000000000000000000000000000000000000000000000000000000000101"; + vm.store(optimismMintableERC20FactoryProxyAddress, slot, value); + slot = hex"0000000000000000000000000000000000000000000000000000000000000001"; + value = hex"00000000000000000000000020a42a5a785622c6ba2576b2d6e924aa82bfa11d"; + vm.store(optimismMintableERC20FactoryProxyAddress, slot, value); + slot = hex"0000000000000000000000000000000000000000000000000000000000000000"; + value = hex"0000000000000000000000000000000000000000000000000000000000000001"; + vm.store(optimismMintableERC20FactoryProxyAddress, slot, value); + slot = hex"0000000000000000000000000000000000000000000000000000000000000005"; + value = hex"0000000000000000000000000000000000000000000000000000000000000009"; vm.store(systemOwnerSafeAddress, slot, value); - slot = hex"f6cecbacbfeb99e6ab0f02c22fd8a103f8837deb80af03d481ac5bc8d5475f58"; + slot = hex"191cda7b5a8219e0cc3bb6c2b45be830e3ba520f78e119446a476c4147fcc284"; value = hex"0000000000000000000000000000000000000000000000000000000000000002"; vm.store(proxyAdminAddress, slot, value); slot = hex"0000000000000000000000000000000000000000000000000000000000000005"; - value = hex"0000000000000000000000000000000000000000000000000000000000000008"; + value = hex"000000000000000000000000000000000000000000000000000000000000000a"; vm.store(systemOwnerSafeAddress, slot, value); - slot = hex"63c92109b91ecf3318ee316da9fdb1378fd8d900f912b2029945ff91daa463bf"; + slot = hex"89a8cb4d9b6f179480a9e676431122d6ba6a5fb2aa9462528e7e48e497a5c045"; value = hex"4f564d5f4c3143726f7373446f6d61696e4d657373656e676572000000000034"; vm.store(proxyAdminAddress, slot, value); slot = hex"0000000000000000000000000000000000000000000000000000000000000005"; - value = hex"0000000000000000000000000000000000000000000000000000000000000009"; + value = hex"000000000000000000000000000000000000000000000000000000000000000b"; vm.store(systemOwnerSafeAddress, slot, value); slot = hex"515216935740e67dfdda5cf8e248ea32b3277787818ab59153061ac875c9385e"; - value = hex"000000000000000000000000f3e6cbcbf1ae12fc13bc8b14fa8a67cbe147fd99"; + value = hex"000000000000000000000000357b6cda94109749a0da475ac1bfd395a61eb908"; vm.store(addressManagerAddress, slot, value); slot = hex"0000000000000000000000000000000000000000000000000000000000000000"; value = hex"0000000000000000000000010000000000000000000000000000000000000000"; @@ -514,13 +622,13 @@ contract DeploymentSummaryFaultProofs is DeploymentSummaryFaultProofsCode { value = hex"0000000000000000000001010000000000000000000000000000000000000000"; vm.store(l1CrossDomainMessengerProxyAddress, slot, value); slot = hex"00000000000000000000000000000000000000000000000000000000000000fb"; - value = hex"000000000000000000000000deb1e9a6be7baf84208bb6e10ac9f9bbe1d70809"; + value = hex"0000000000000000000000004f559f30f5eb88d635fde1548c4267db8fab0351"; vm.store(l1CrossDomainMessengerProxyAddress, slot, value); slot = hex"00000000000000000000000000000000000000000000000000000000000000fc"; - value = hex"000000000000000000000000978e3286eb805934215a88694d80b09aded68d90"; + value = hex"0000000000000000000000001c23a6d89f95ef3148bcda8e242cab145bf9c0e4"; vm.store(l1CrossDomainMessengerProxyAddress, slot, value); slot = hex"00000000000000000000000000000000000000000000000000000000000000fd"; - value = hex"00000000000000000000000020a42a5a785622c6ba2576b2d6e924aa82bfa11d"; + value = hex"0000000000000000000000000c8b5822b6e02cda722174f19a1439a7495a3fa6"; vm.store(l1CrossDomainMessengerProxyAddress, slot, value); slot = hex"00000000000000000000000000000000000000000000000000000000000000cc"; value = hex"000000000000000000000000000000000000000000000000000000000000dead"; @@ -532,10 +640,46 @@ contract DeploymentSummaryFaultProofs is DeploymentSummaryFaultProofsCode { value = hex"0000000000000000000000010000000000000000000000000000000000000000"; vm.store(l1CrossDomainMessengerProxyAddress, slot, value); slot = hex"0000000000000000000000000000000000000000000000000000000000000005"; - value = hex"000000000000000000000000000000000000000000000000000000000000000a"; + value = hex"000000000000000000000000000000000000000000000000000000000000000c"; + vm.store(systemOwnerSafeAddress, slot, value); + slot = hex"360894a13ba1a3210667c828492db98dca3e2076cc3735a920a3ca505d382bbc"; + value = hex"00000000000000000000000060d37db59d0d14f7ea5c7425a2c03244e08b162d"; + vm.store(l2OutputOracleProxyAddress, slot, value); + slot = hex"0000000000000000000000000000000000000000000000000000000000000000"; + value = hex"0000000000000000000000000000000000000000000000000000000000000001"; + vm.store(l2OutputOracleProxyAddress, slot, value); + slot = hex"0000000000000000000000000000000000000000000000000000000000000000"; + value = hex"0000000000000000000000000000000000000000000000000000000000000101"; + vm.store(l2OutputOracleProxyAddress, slot, value); + slot = hex"0000000000000000000000000000000000000000000000000000000000000004"; + value = hex"0000000000000000000000000000000000000000000000000000000000000006"; + vm.store(l2OutputOracleProxyAddress, slot, value); + slot = hex"0000000000000000000000000000000000000000000000000000000000000005"; + value = hex"0000000000000000000000000000000000000000000000000000000000000002"; + vm.store(l2OutputOracleProxyAddress, slot, value); + slot = hex"0000000000000000000000000000000000000000000000000000000000000001"; + value = hex"0000000000000000000000000000000000000000000000000000000000000001"; + vm.store(l2OutputOracleProxyAddress, slot, value); + slot = hex"0000000000000000000000000000000000000000000000000000000000000002"; + value = hex"0000000000000000000000000000000000000000000000000000000000000001"; + vm.store(l2OutputOracleProxyAddress, slot, value); + slot = hex"0000000000000000000000000000000000000000000000000000000000000007"; + value = hex"00000000000000000000000070997970c51812dc3a010c7d01b50e0d17dc79c8"; + vm.store(l2OutputOracleProxyAddress, slot, value); + slot = hex"0000000000000000000000000000000000000000000000000000000000000006"; + value = hex"0000000000000000000000006925b8704ff96dee942623d6fb5e946ef5884b63"; + vm.store(l2OutputOracleProxyAddress, slot, value); + slot = hex"0000000000000000000000000000000000000000000000000000000000000008"; + value = hex"0000000000000000000000000000000000000000000000000000000000000024"; + vm.store(l2OutputOracleProxyAddress, slot, value); + slot = hex"0000000000000000000000000000000000000000000000000000000000000000"; + value = hex"0000000000000000000000000000000000000000000000000000000000000001"; + vm.store(l2OutputOracleProxyAddress, slot, value); + slot = hex"0000000000000000000000000000000000000000000000000000000000000005"; + value = hex"000000000000000000000000000000000000000000000000000000000000000d"; vm.store(systemOwnerSafeAddress, slot, value); slot = hex"360894a13ba1a3210667c828492db98dca3e2076cc3735a920a3ca505d382bbc"; - value = hex"00000000000000000000000020b168142354cee65a32f6d8cf3033e592299765"; + value = hex"0000000000000000000000008efda795511cbbdffc9eeca1a5bf30f5b1e1ef9e"; vm.store(disputeGameFactoryProxyAddress, slot, value); slot = hex"0000000000000000000000000000000000000000000000000000000000000000"; value = hex"0000000000000000000000000000000000000000000000000000000000000001"; @@ -544,7 +688,7 @@ contract DeploymentSummaryFaultProofs is DeploymentSummaryFaultProofsCode { value = hex"0000000000000000000000000000000000000000000000000000000000000101"; vm.store(disputeGameFactoryProxyAddress, slot, value); slot = hex"0000000000000000000000000000000000000000000000000000000000000033"; - value = hex"000000000000000000000000db8cff278adccf9e9b5da745b44e754fc4ee3c76"; + value = hex"00000000000000000000000062c20aa1e0272312bc100b4e23b4dc1ed96dd7d1"; vm.store(disputeGameFactoryProxyAddress, slot, value); slot = hex"0000000000000000000000000000000000000000000000000000000000000033"; value = hex"0000000000000000000000001804c8ab1f12e6bbf3894d4083f33e07309d1f38"; @@ -553,10 +697,10 @@ contract DeploymentSummaryFaultProofs is DeploymentSummaryFaultProofsCode { value = hex"0000000000000000000000000000000000000000000000000000000000000001"; vm.store(disputeGameFactoryProxyAddress, slot, value); slot = hex"0000000000000000000000000000000000000000000000000000000000000005"; - value = hex"000000000000000000000000000000000000000000000000000000000000000b"; + value = hex"000000000000000000000000000000000000000000000000000000000000000e"; vm.store(systemOwnerSafeAddress, slot, value); slot = hex"360894a13ba1a3210667c828492db98dca3e2076cc3735a920a3ca505d382bbc"; - value = hex"00000000000000000000000049bbff1629824a1e7993ab5c17afa45d24ab28c9"; + value = hex"000000000000000000000000e49ced258137cc5e18fb9aba2aa14069263d8f49"; vm.store(delayedWETHProxyAddress, slot, value); slot = hex"0000000000000000000000000000000000000000000000000000000000000000"; value = hex"0000000000000000000000000000000000000000000000000000000000000001"; @@ -565,22 +709,46 @@ contract DeploymentSummaryFaultProofs is DeploymentSummaryFaultProofsCode { value = hex"0000000000000000000000000000000000000000000000000000000000000101"; vm.store(delayedWETHProxyAddress, slot, value); slot = hex"0000000000000000000000000000000000000000000000000000000000000033"; - value = hex"000000000000000000000000db8cff278adccf9e9b5da745b44e754fc4ee3c76"; + value = hex"00000000000000000000000062c20aa1e0272312bc100b4e23b4dc1ed96dd7d1"; vm.store(delayedWETHProxyAddress, slot, value); slot = hex"0000000000000000000000000000000000000000000000000000000000000033"; value = hex"0000000000000000000000001804c8ab1f12e6bbf3894d4083f33e07309d1f38"; vm.store(delayedWETHProxyAddress, slot, value); slot = hex"0000000000000000000000000000000000000000000000000000000000000068"; - value = hex"000000000000000000000000deb1e9a6be7baf84208bb6e10ac9f9bbe1d70809"; + value = hex"0000000000000000000000004f559f30f5eb88d635fde1548c4267db8fab0351"; vm.store(delayedWETHProxyAddress, slot, value); slot = hex"0000000000000000000000000000000000000000000000000000000000000000"; value = hex"0000000000000000000000000000000000000000000000000000000000000001"; vm.store(delayedWETHProxyAddress, slot, value); slot = hex"0000000000000000000000000000000000000000000000000000000000000005"; - value = hex"000000000000000000000000000000000000000000000000000000000000000c"; + value = hex"000000000000000000000000000000000000000000000000000000000000000f"; vm.store(systemOwnerSafeAddress, slot, value); slot = hex"360894a13ba1a3210667c828492db98dca3e2076cc3735a920a3ca505d382bbc"; - value = hex"000000000000000000000000f74482139d1564b826994875cf6632eb5b134b25"; + value = hex"000000000000000000000000e49ced258137cc5e18fb9aba2aa14069263d8f49"; + vm.store(permissionedDelayedWETHProxyAddress, slot, value); + slot = hex"0000000000000000000000000000000000000000000000000000000000000000"; + value = hex"0000000000000000000000000000000000000000000000000000000000000001"; + vm.store(permissionedDelayedWETHProxyAddress, slot, value); + slot = hex"0000000000000000000000000000000000000000000000000000000000000000"; + value = hex"0000000000000000000000000000000000000000000000000000000000000101"; + vm.store(permissionedDelayedWETHProxyAddress, slot, value); + slot = hex"0000000000000000000000000000000000000000000000000000000000000033"; + value = hex"00000000000000000000000062c20aa1e0272312bc100b4e23b4dc1ed96dd7d1"; + vm.store(permissionedDelayedWETHProxyAddress, slot, value); + slot = hex"0000000000000000000000000000000000000000000000000000000000000033"; + value = hex"0000000000000000000000001804c8ab1f12e6bbf3894d4083f33e07309d1f38"; + vm.store(permissionedDelayedWETHProxyAddress, slot, value); + slot = hex"0000000000000000000000000000000000000000000000000000000000000068"; + value = hex"0000000000000000000000004f559f30f5eb88d635fde1548c4267db8fab0351"; + vm.store(permissionedDelayedWETHProxyAddress, slot, value); + slot = hex"0000000000000000000000000000000000000000000000000000000000000000"; + value = hex"0000000000000000000000000000000000000000000000000000000000000001"; + vm.store(permissionedDelayedWETHProxyAddress, slot, value); + slot = hex"0000000000000000000000000000000000000000000000000000000000000005"; + value = hex"0000000000000000000000000000000000000000000000000000000000000010"; + vm.store(systemOwnerSafeAddress, slot, value); + slot = hex"360894a13ba1a3210667c828492db98dca3e2076cc3735a920a3ca505d382bbc"; + value = hex"000000000000000000000000dec4d949cf1a2e824ee4f8b12064e166b96171dd"; vm.store(anchorStateRegistryProxyAddress, slot, value); slot = hex"0000000000000000000000000000000000000000000000000000000000000000"; value = hex"0000000000000000000000000000000000000000000000000000000000000001"; @@ -600,49 +768,28 @@ contract DeploymentSummaryFaultProofs is DeploymentSummaryFaultProofsCode { slot = hex"d9d16d34ffb15ba3a3d852f0d403e2ce1d691fb54de27ac87cd2f993f3ec330f"; value = hex"deadbeefdeadbeefdeadbeefdeadbeefdeadbeefdeadbeefdeadbeefdeadbeef"; vm.store(anchorStateRegistryProxyAddress, slot, value); - slot = hex"0000000000000000000000000000000000000000000000000000000000000000"; - value = hex"0000000000000000000000000000000000000000000000000000000000000001"; + slot = hex"1d32deecea32fd1365d10df47fc6666a05871102e61a115a5c569bca7e5de14d"; + value = hex"deadbeefdeadbeefdeadbeefdeadbeefdeadbeefdeadbeefdeadbeefdeadbeef"; + vm.store(anchorStateRegistryProxyAddress, slot, value); + slot = hex"0000000000000000000000000000000000000000000000000000000000000002"; + value = hex"0000000000000000000000004f559f30f5eb88d635fde1548c4267db8fab0351"; 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); + vm.store(anchorStateRegistryProxyAddress, slot, value); + vm.etch(acc33Address, acc33Code); slot = hex"ffdfc1249c027f9191656349feb0761381bb32c9f557e01f419fd08754bf5a1b"; - value = hex"00000000000000000000000012e721c390f5728200a26bbef206a5f4f7e991f3"; + value = hex"000000000000000000000000b6b1579aa54e2f61e621a40d5f2704d717b3544f"; vm.store(disputeGameFactoryProxyAddress, slot, value); - vm.etch(acc28Address, acc28Code); + vm.etch(acc34Address, acc34Code); slot = hex"4d5a9bd2e41301728d41c8e705190becb4e74abe869f75bdb405b63716a35f9e"; - value = hex"0000000000000000000000002abb7cbb720020ee3c9ecf3915d14b6d1886a577"; + value = hex"00000000000000000000000059b99034fbdd5e554661a2100cb2b6b7c5d495f8"; vm.store(disputeGameFactoryProxyAddress, slot, value); + slot = hex"0000000000000000000000000000000000000000000000000000000000000033"; + value = hex"0000000000000000000000007c0c8a15773ed7b50e7c738d1af4c5e3a2b210bd"; + vm.store(disputeGameFactoryProxyAddress, slot, value); + slot = hex"0000000000000000000000000000000000000000000000000000000000000033"; + value = hex"0000000000000000000000007c0c8a15773ed7b50e7c738d1af4c5e3a2b210bd"; + vm.store(delayedWETHProxyAddress, slot, value); } } diff --git a/packages/contracts-bedrock/test/kontrol/proofs/utils/DeploymentSummaryFaultProofsCode.sol b/packages/contracts-bedrock/test/kontrol/proofs/utils/DeploymentSummaryFaultProofsCode.sol index 50fd7a7e9ea4..a2809e334863 100644 --- a/packages/contracts-bedrock/test/kontrol/proofs/utils/DeploymentSummaryFaultProofsCode.sol +++ b/packages/contracts-bedrock/test/kontrol/proofs/utils/DeploymentSummaryFaultProofsCode.sol @@ -17,49 +17,61 @@ contract DeploymentSummaryFaultProofsCode { bytes internal constant superchainConfigProxyCode = hex"60806040526004361061005e5760003560e01c80635c60da1b116100435780635c60da1b146100be5780638f283970146100f8578063f851a440146101185761006d565b80633659cfe6146100755780634f1ef286146100955761006d565b3661006d5761006b61012d565b005b61006b61012d565b34801561008157600080fd5b5061006b6100903660046106dd565b610224565b6100a86100a33660046106f8565b610296565b6040516100b5919061077b565b60405180910390f35b3480156100ca57600080fd5b506100d3610419565b60405173ffffffffffffffffffffffffffffffffffffffff90911681526020016100b5565b34801561010457600080fd5b5061006b6101133660046106dd565b6104b0565b34801561012457600080fd5b506100d3610517565b60006101577f360894a13ba1a3210667c828492db98dca3e2076cc3735a920a3ca505d382bbc5490565b905073ffffffffffffffffffffffffffffffffffffffff8116610201576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602560248201527f50726f78793a20696d706c656d656e746174696f6e206e6f7420696e6974696160448201527f6c697a656400000000000000000000000000000000000000000000000000000060648201526084015b60405180910390fd5b3660008037600080366000845af43d6000803e8061021e573d6000fd5b503d6000f35b7fb53127684a568b3173ae13b9f8a6016e243e63b6e8ee1178d6a717850b5d61035473ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff16148061027d575033155b1561028e5761028b816105a3565b50565b61028b61012d565b60606102c07fb53127684a568b3173ae13b9f8a6016e243e63b6e8ee1178d6a717850b5d61035490565b73ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff1614806102f7575033155b1561040a57610305846105a3565b6000808573ffffffffffffffffffffffffffffffffffffffff16858560405161032f9291906107ee565b600060405180830381855af49150503d806000811461036a576040519150601f19603f3d011682016040523d82523d6000602084013e61036f565b606091505b509150915081610401576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152603960248201527f50726f78793a2064656c656761746563616c6c20746f206e657720696d706c6560448201527f6d656e746174696f6e20636f6e7472616374206661696c65640000000000000060648201526084016101f8565b91506104129050565b61041261012d565b9392505050565b60006104437fb53127684a568b3173ae13b9f8a6016e243e63b6e8ee1178d6a717850b5d61035490565b73ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff16148061047a575033155b156104a557507f360894a13ba1a3210667c828492db98dca3e2076cc3735a920a3ca505d382bbc5490565b6104ad61012d565b90565b7fb53127684a568b3173ae13b9f8a6016e243e63b6e8ee1178d6a717850b5d61035473ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff161480610509575033155b1561028e5761028b8161060c565b60006105417fb53127684a568b3173ae13b9f8a6016e243e63b6e8ee1178d6a717850b5d61035490565b73ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff161480610578575033155b156104a557507fb53127684a568b3173ae13b9f8a6016e243e63b6e8ee1178d6a717850b5d61035490565b7f360894a13ba1a3210667c828492db98dca3e2076cc3735a920a3ca505d382bbc81815560405173ffffffffffffffffffffffffffffffffffffffff8316907fbc7cd75a20ee27fd9adebab32041f755214dbc6bffa90cc0225b39da2e5c2d3b90600090a25050565b60006106367fb53127684a568b3173ae13b9f8a6016e243e63b6e8ee1178d6a717850b5d61035490565b7fb53127684a568b3173ae13b9f8a6016e243e63b6e8ee1178d6a717850b5d61038381556040805173ffffffffffffffffffffffffffffffffffffffff80851682528616602082015292935090917f7e644d79422f17c01e4894b5f4f588d331ebfa28653d42ae832dc59e38c9798f910160405180910390a1505050565b803573ffffffffffffffffffffffffffffffffffffffff811681146106d857600080fd5b919050565b6000602082840312156106ef57600080fd5b610412826106b4565b60008060006040848603121561070d57600080fd5b610716846106b4565b9250602084013567ffffffffffffffff8082111561073357600080fd5b818601915086601f83011261074757600080fd5b81358181111561075657600080fd5b87602082850101111561076857600080fd5b6020830194508093505050509250925092565b600060208083528351808285015260005b818110156107a85785810183015185820160400152820161078c565b818111156107ba576000604083870101525b50601f017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe016929092016040019392505050565b818382376000910190815291905056fea164736f6c634300080f000a"; bytes internal constant superchainConfigCode = - hex"608060405234801561001057600080fd5b50600436106100885760003560e01c80635c975abb1161005b5780635c975abb146101255780636da663551461013d5780637fbf7b6a14610150578063c23a451a1461016657600080fd5b80633f4ba83a1461008d578063400ada7514610097578063452a9320146100aa57806354fd4d50146100dc575b600080fd5b61009561016e565b005b6100956100a5366004610746565b610294565b6100b261046d565b60405173ffffffffffffffffffffffffffffffffffffffff90911681526020015b60405180910390f35b6101186040518060400160405280600581526020017f312e312e3000000000000000000000000000000000000000000000000000000081525081565b6040516100d39190610808565b61012d6104a6565b60405190151581526020016100d3565b61009561014b366004610851565b6104d6565b6101586105a4565b6040519081526020016100d3565b6101586105d2565b61017661046d565b73ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff1614610235576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602b60248201527f5375706572636861696e436f6e6669673a206f6e6c7920677561726469616e2060448201527f63616e20756e706175736500000000000000000000000000000000000000000060648201526084015b60405180910390fd5b61026961026360017f54176ff9944c4784e5857ec4e5ef560a462c483bf534eda43f91bb01a470b1b7610920565b60009055565b6040517fa45f47fdea8a1efdd9029a5691c7f759c32b7c698632b563573e155625d1693390600090a1565b600054610100900460ff16158080156102b45750600054600160ff909116105b806102ce5750303b1580156102ce575060005460ff166001145b61035a576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602e60248201527f496e697469616c697a61626c653a20636f6e747261637420697320616c72656160448201527f647920696e697469616c697a6564000000000000000000000000000000000000606482015260840161022c565b600080547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0016600117905580156103b857600080547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00ff166101001790555b6103c18361061d565b8115610405576104056040518060400160405280601281526020017f496e697469616c697a65722070617573656400000000000000000000000000008152506106d8565b801561046857600080547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00ff169055604051600181527f7f26b83ff96e1f2b6a682f133852f6798a09c465da95921460cefb38474024989060200160405180910390a15b505050565b60006104a161049d60017fd30e835d3f35624761057ff5b27d558f97bd5be034621e62240e5c0b784abe69610920565b5490565b905090565b60006104a161049d60017f54176ff9944c4784e5857ec4e5ef560a462c483bf534eda43f91bb01a470b1b7610920565b6104de61046d565b73ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff1614610598576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602960248201527f5375706572636861696e436f6e6669673a206f6e6c7920677561726469616e2060448201527f63616e2070617573650000000000000000000000000000000000000000000000606482015260840161022c565b6105a1816106d8565b50565b6105cf60017f54176ff9944c4784e5857ec4e5ef560a462c483bf534eda43f91bb01a470b1b7610920565b81565b6105cf60017fd30e835d3f35624761057ff5b27d558f97bd5be034621e62240e5c0b784abe69610920565b73ffffffffffffffffffffffffffffffffffffffff163b151590565b9055565b61065061064b60017fd30e835d3f35624761057ff5b27d558f97bd5be034621e62240e5c0b784abe69610920565b829055565b60006040805173ffffffffffffffffffffffffffffffffffffffff841660208201527f7b743789cff01dafdeae47739925425aab5dfd02d0c8229e4a508bcd2b9f42bb9101604080517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0818403018152908290526106cd91610808565b60405180910390a250565b61070c61070660017f54176ff9944c4784e5857ec4e5ef560a462c483bf534eda43f91bb01a470b1b7610920565b60019055565b7fc32e6d5d6d1de257f64eac19ddb1f700ba13527983849c9486b1ab007ea283818160405161073b9190610808565b60405180910390a150565b6000806040838503121561075957600080fd5b823573ffffffffffffffffffffffffffffffffffffffff8116811461077d57600080fd5b91506020830135801515811461079257600080fd5b809150509250929050565b6000815180845260005b818110156107c3576020818501810151868301820152016107a7565b818111156107d5576000602083870101525b50601f017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0169290920160200192915050565b60208152600061081b602083018461079d565b9392505050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b60006020828403121561086357600080fd5b813567ffffffffffffffff8082111561087b57600080fd5b818401915084601f83011261088f57600080fd5b8135818111156108a1576108a1610822565b604051601f82017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0908116603f011681019083821181831017156108e7576108e7610822565b8160405282815287602084870101111561090057600080fd5b826020860160208301376000928101602001929092525095945050505050565b600082821015610959577f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b50039056fea164736f6c634300080f000a"; + hex"608060405234801561001057600080fd5b50600436106100885760003560e01c80635c975abb1161005b5780635c975abb146101255780636da663551461013d5780637fbf7b6a14610150578063c23a451a1461016657600080fd5b80633f4ba83a1461008d578063400ada7514610097578063452a9320146100aa57806354fd4d50146100dc575b600080fd5b61009561016e565b005b6100956100a5366004610746565b610294565b6100b261046d565b60405173ffffffffffffffffffffffffffffffffffffffff90911681526020015b60405180910390f35b6101186040518060400160405280600c81526020017f312e312e312d626574612e31000000000000000000000000000000000000000081525081565b6040516100d39190610808565b61012d6104a6565b60405190151581526020016100d3565b61009561014b366004610851565b6104d6565b6101586105a4565b6040519081526020016100d3565b6101586105d2565b61017661046d565b73ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff1614610235576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602b60248201527f5375706572636861696e436f6e6669673a206f6e6c7920677561726469616e2060448201527f63616e20756e706175736500000000000000000000000000000000000000000060648201526084015b60405180910390fd5b61026961026360017f54176ff9944c4784e5857ec4e5ef560a462c483bf534eda43f91bb01a470b1b7610920565b60009055565b6040517fa45f47fdea8a1efdd9029a5691c7f759c32b7c698632b563573e155625d1693390600090a1565b600054610100900460ff16158080156102b45750600054600160ff909116105b806102ce5750303b1580156102ce575060005460ff166001145b61035a576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602e60248201527f496e697469616c697a61626c653a20636f6e747261637420697320616c72656160448201527f647920696e697469616c697a6564000000000000000000000000000000000000606482015260840161022c565b600080547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0016600117905580156103b857600080547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00ff166101001790555b6103c18361061d565b8115610405576104056040518060400160405280601281526020017f496e697469616c697a65722070617573656400000000000000000000000000008152506106d8565b801561046857600080547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00ff169055604051600181527f7f26b83ff96e1f2b6a682f133852f6798a09c465da95921460cefb38474024989060200160405180910390a15b505050565b60006104a161049d60017fd30e835d3f35624761057ff5b27d558f97bd5be034621e62240e5c0b784abe69610920565b5490565b905090565b60006104a161049d60017f54176ff9944c4784e5857ec4e5ef560a462c483bf534eda43f91bb01a470b1b7610920565b6104de61046d565b73ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff1614610598576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602960248201527f5375706572636861696e436f6e6669673a206f6e6c7920677561726469616e2060448201527f63616e2070617573650000000000000000000000000000000000000000000000606482015260840161022c565b6105a1816106d8565b50565b6105cf60017f54176ff9944c4784e5857ec4e5ef560a462c483bf534eda43f91bb01a470b1b7610920565b81565b6105cf60017fd30e835d3f35624761057ff5b27d558f97bd5be034621e62240e5c0b784abe69610920565b73ffffffffffffffffffffffffffffffffffffffff163b151590565b9055565b61065061064b60017fd30e835d3f35624761057ff5b27d558f97bd5be034621e62240e5c0b784abe69610920565b829055565b60006040805173ffffffffffffffffffffffffffffffffffffffff841660208201527f7b743789cff01dafdeae47739925425aab5dfd02d0c8229e4a508bcd2b9f42bb9101604080517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0818403018152908290526106cd91610808565b60405180910390a250565b61070c61070660017f54176ff9944c4784e5857ec4e5ef560a462c483bf534eda43f91bb01a470b1b7610920565b60019055565b7fc32e6d5d6d1de257f64eac19ddb1f700ba13527983849c9486b1ab007ea283818160405161073b9190610808565b60405180910390a150565b6000806040838503121561075957600080fd5b823573ffffffffffffffffffffffffffffffffffffffff8116811461077d57600080fd5b91506020830135801515811461079257600080fd5b809150509250929050565b6000815180845260005b818110156107c3576020818501810151868301820152016107a7565b818111156107d5576000602083870101525b50601f017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0169290920160200192915050565b60208152600061081b602083018461079d565b9392505050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b60006020828403121561086357600080fd5b813567ffffffffffffffff8082111561087b57600080fd5b818401915084601f83011261088f57600080fd5b8135818111156108a1576108a1610822565b604051601f82017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0908116603f011681019083821181831017156108e7576108e7610822565b8160405282815287602084870101111561090057600080fd5b826020860160208301376000928101602001929092525095945050505050565b600082821015610959577f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b50039056fea164736f6c634300080f000a"; bytes internal constant protocolVersionsProxyCode = hex"60806040526004361061005e5760003560e01c80635c60da1b116100435780635c60da1b146100be5780638f283970146100f8578063f851a440146101185761006d565b80633659cfe6146100755780634f1ef286146100955761006d565b3661006d5761006b61012d565b005b61006b61012d565b34801561008157600080fd5b5061006b6100903660046106dd565b610224565b6100a86100a33660046106f8565b610296565b6040516100b5919061077b565b60405180910390f35b3480156100ca57600080fd5b506100d3610419565b60405173ffffffffffffffffffffffffffffffffffffffff90911681526020016100b5565b34801561010457600080fd5b5061006b6101133660046106dd565b6104b0565b34801561012457600080fd5b506100d3610517565b60006101577f360894a13ba1a3210667c828492db98dca3e2076cc3735a920a3ca505d382bbc5490565b905073ffffffffffffffffffffffffffffffffffffffff8116610201576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602560248201527f50726f78793a20696d706c656d656e746174696f6e206e6f7420696e6974696160448201527f6c697a656400000000000000000000000000000000000000000000000000000060648201526084015b60405180910390fd5b3660008037600080366000845af43d6000803e8061021e573d6000fd5b503d6000f35b7fb53127684a568b3173ae13b9f8a6016e243e63b6e8ee1178d6a717850b5d61035473ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff16148061027d575033155b1561028e5761028b816105a3565b50565b61028b61012d565b60606102c07fb53127684a568b3173ae13b9f8a6016e243e63b6e8ee1178d6a717850b5d61035490565b73ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff1614806102f7575033155b1561040a57610305846105a3565b6000808573ffffffffffffffffffffffffffffffffffffffff16858560405161032f9291906107ee565b600060405180830381855af49150503d806000811461036a576040519150601f19603f3d011682016040523d82523d6000602084013e61036f565b606091505b509150915081610401576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152603960248201527f50726f78793a2064656c656761746563616c6c20746f206e657720696d706c6560448201527f6d656e746174696f6e20636f6e7472616374206661696c65640000000000000060648201526084016101f8565b91506104129050565b61041261012d565b9392505050565b60006104437fb53127684a568b3173ae13b9f8a6016e243e63b6e8ee1178d6a717850b5d61035490565b73ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff16148061047a575033155b156104a557507f360894a13ba1a3210667c828492db98dca3e2076cc3735a920a3ca505d382bbc5490565b6104ad61012d565b90565b7fb53127684a568b3173ae13b9f8a6016e243e63b6e8ee1178d6a717850b5d61035473ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff161480610509575033155b1561028e5761028b8161060c565b60006105417fb53127684a568b3173ae13b9f8a6016e243e63b6e8ee1178d6a717850b5d61035490565b73ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff161480610578575033155b156104a557507fb53127684a568b3173ae13b9f8a6016e243e63b6e8ee1178d6a717850b5d61035490565b7f360894a13ba1a3210667c828492db98dca3e2076cc3735a920a3ca505d382bbc81815560405173ffffffffffffffffffffffffffffffffffffffff8316907fbc7cd75a20ee27fd9adebab32041f755214dbc6bffa90cc0225b39da2e5c2d3b90600090a25050565b60006106367fb53127684a568b3173ae13b9f8a6016e243e63b6e8ee1178d6a717850b5d61035490565b7fb53127684a568b3173ae13b9f8a6016e243e63b6e8ee1178d6a717850b5d61038381556040805173ffffffffffffffffffffffffffffffffffffffff80851682528616602082015292935090917f7e644d79422f17c01e4894b5f4f588d331ebfa28653d42ae832dc59e38c9798f910160405180910390a1505050565b803573ffffffffffffffffffffffffffffffffffffffff811681146106d857600080fd5b919050565b6000602082840312156106ef57600080fd5b610412826106b4565b60008060006040848603121561070d57600080fd5b610716846106b4565b9250602084013567ffffffffffffffff8082111561073357600080fd5b818601915086601f83011261074757600080fd5b81358181111561075657600080fd5b87602082850101111561076857600080fd5b6020830194508093505050509250925092565b600060208083528351808285015260005b818110156107a85785810183015185820160400152820161078c565b818111156107ba576000604083870101525b50601f017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe016929092016040019392505050565b818382376000910190815291905056fea164736f6c634300080f000a"; bytes internal constant protocolVersionsCode = - hex"608060405234801561001057600080fd5b50600436106100d45760003560e01c80638da5cb5b11610081578063f2fde38b1161005b578063f2fde38b146101b8578063f7d12760146101cb578063ffa1ad74146101d357600080fd5b80638da5cb5b14610180578063d798b1ac146101a8578063dc8452cd146101b057600080fd5b80635fd579af116100b25780635fd579af14610152578063715018a6146101655780637a1ac61e1461016d57600080fd5b80630457d6f2146100d9578063206a8300146100ee57806354fd4d5014610109575b600080fd5b6100ec6100e73660046108c3565b6101db565b005b6100f66101ef565b6040519081526020015b60405180910390f35b6101456040518060400160405280600581526020017f312e302e3000000000000000000000000000000000000000000000000000000081525081565b6040516101009190610947565b6100ec6101603660046108c3565b61021d565b6100ec61022e565b6100ec61017b36600461098a565b610242565b60335460405173ffffffffffffffffffffffffffffffffffffffff9091168152602001610100565b6100f66103f7565b6100f6610430565b6100ec6101c63660046109bd565b610460565b6100f6610514565b6100f6600081565b6101e361055f565b6101ec816105e0565b50565b61021a60017f4aaefe95bd84fd3f32700cf3b7566bc944b73138e41958b5785826df2aecace16109d8565b81565b61022561055f565b6101ec81610698565b61023661055f565b6102406000610712565b565b600054610100900460ff16158080156102625750600054600160ff909116105b8061027c5750303b15801561027c575060005460ff166001145b61030d576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602e60248201527f496e697469616c697a61626c653a20636f6e747261637420697320616c72656160448201527f647920696e697469616c697a656400000000000000000000000000000000000060648201526084015b60405180910390fd5b600080547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00166001179055801561036b57600080547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00ff166101001790555b610373610789565b61037c84610460565b610385836105e0565b61038e82610698565b80156103f157600080547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00ff169055604051600181527f7f26b83ff96e1f2b6a682f133852f6798a09c465da95921460cefb38474024989060200160405180910390a15b50505050565b600061042b61042760017fe314dfc40f0025322aacc0ba8ef420b62fb3b702cf01e0cdf3d829117ac2ff1b6109d8565b5490565b905090565b600061042b61042760017f4aaefe95bd84fd3f32700cf3b7566bc944b73138e41958b5785826df2aecace16109d8565b61046861055f565b73ffffffffffffffffffffffffffffffffffffffff811661050b576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602660248201527f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160448201527f64647265737300000000000000000000000000000000000000000000000000006064820152608401610304565b6101ec81610712565b61021a60017fe314dfc40f0025322aacc0ba8ef420b62fb3b702cf01e0cdf3d829117ac2ff1b6109d8565b73ffffffffffffffffffffffffffffffffffffffff163b151590565b9055565b60335473ffffffffffffffffffffffffffffffffffffffff163314610240576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e65726044820152606401610304565b61061361060e60017f4aaefe95bd84fd3f32700cf3b7566bc944b73138e41958b5785826df2aecace16109d8565b829055565b60008160405160200161062891815260200190565b604080517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0818403018152919052905060005b60007f1d2b0bda21d56b8bd12d4f94ebacffdfb35f5e226f84b461103bb8beab6353be8360405161068c9190610947565b60405180910390a35050565b6106c661060e60017fe314dfc40f0025322aacc0ba8ef420b62fb3b702cf01e0cdf3d829117ac2ff1b6109d8565b6000816040516020016106db91815260200190565b604080517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe08184030181529190529050600161065b565b6033805473ffffffffffffffffffffffffffffffffffffffff8381167fffffffffffffffffffffffff0000000000000000000000000000000000000000831681179093556040519116919082907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e090600090a35050565b600054610100900460ff16610820576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602b60248201527f496e697469616c697a61626c653a20636f6e7472616374206973206e6f74206960448201527f6e697469616c697a696e670000000000000000000000000000000000000000006064820152608401610304565b610240600054610100900460ff166108ba576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602b60248201527f496e697469616c697a61626c653a20636f6e7472616374206973206e6f74206960448201527f6e697469616c697a696e670000000000000000000000000000000000000000006064820152608401610304565b61024033610712565b6000602082840312156108d557600080fd5b5035919050565b6000815180845260005b81811015610902576020818501810151868301820152016108e6565b81811115610914576000602083870101525b50601f017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0169290920160200192915050565b60208152600061095a60208301846108dc565b9392505050565b803573ffffffffffffffffffffffffffffffffffffffff8116811461098557600080fd5b919050565b60008060006060848603121561099f57600080fd5b6109a884610961565b95602085013595506040909401359392505050565b6000602082840312156109cf57600080fd5b61095a82610961565b600082821015610a11577f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b50039056fea164736f6c634300080f000a"; + hex"608060405234801561001057600080fd5b50600436106100d45760003560e01c80638da5cb5b11610081578063f2fde38b1161005b578063f2fde38b146101b8578063f7d12760146101cb578063ffa1ad74146101d357600080fd5b80638da5cb5b14610180578063d798b1ac146101a8578063dc8452cd146101b057600080fd5b80635fd579af116100b25780635fd579af14610152578063715018a6146101655780637a1ac61e1461016d57600080fd5b80630457d6f2146100d9578063206a8300146100ee57806354fd4d5014610109575b600080fd5b6100ec6100e73660046108c3565b6101db565b005b6100f66101ef565b6040519081526020015b60405180910390f35b6101456040518060400160405280600c81526020017f312e302e312d626574612e31000000000000000000000000000000000000000081525081565b6040516101009190610947565b6100ec6101603660046108c3565b61021d565b6100ec61022e565b6100ec61017b36600461098a565b610242565b60335460405173ffffffffffffffffffffffffffffffffffffffff9091168152602001610100565b6100f66103f7565b6100f6610430565b6100ec6101c63660046109bd565b610460565b6100f6610514565b6100f6600081565b6101e361055f565b6101ec816105e0565b50565b61021a60017f4aaefe95bd84fd3f32700cf3b7566bc944b73138e41958b5785826df2aecace16109d8565b81565b61022561055f565b6101ec81610698565b61023661055f565b6102406000610712565b565b600054610100900460ff16158080156102625750600054600160ff909116105b8061027c5750303b15801561027c575060005460ff166001145b61030d576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602e60248201527f496e697469616c697a61626c653a20636f6e747261637420697320616c72656160448201527f647920696e697469616c697a656400000000000000000000000000000000000060648201526084015b60405180910390fd5b600080547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00166001179055801561036b57600080547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00ff166101001790555b610373610789565b61037c84610460565b610385836105e0565b61038e82610698565b80156103f157600080547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00ff169055604051600181527f7f26b83ff96e1f2b6a682f133852f6798a09c465da95921460cefb38474024989060200160405180910390a15b50505050565b600061042b61042760017fe314dfc40f0025322aacc0ba8ef420b62fb3b702cf01e0cdf3d829117ac2ff1b6109d8565b5490565b905090565b600061042b61042760017f4aaefe95bd84fd3f32700cf3b7566bc944b73138e41958b5785826df2aecace16109d8565b61046861055f565b73ffffffffffffffffffffffffffffffffffffffff811661050b576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602660248201527f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160448201527f64647265737300000000000000000000000000000000000000000000000000006064820152608401610304565b6101ec81610712565b61021a60017fe314dfc40f0025322aacc0ba8ef420b62fb3b702cf01e0cdf3d829117ac2ff1b6109d8565b73ffffffffffffffffffffffffffffffffffffffff163b151590565b9055565b60335473ffffffffffffffffffffffffffffffffffffffff163314610240576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e65726044820152606401610304565b61061361060e60017f4aaefe95bd84fd3f32700cf3b7566bc944b73138e41958b5785826df2aecace16109d8565b829055565b60008160405160200161062891815260200190565b604080517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0818403018152919052905060005b60007f1d2b0bda21d56b8bd12d4f94ebacffdfb35f5e226f84b461103bb8beab6353be8360405161068c9190610947565b60405180910390a35050565b6106c661060e60017fe314dfc40f0025322aacc0ba8ef420b62fb3b702cf01e0cdf3d829117ac2ff1b6109d8565b6000816040516020016106db91815260200190565b604080517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe08184030181529190529050600161065b565b6033805473ffffffffffffffffffffffffffffffffffffffff8381167fffffffffffffffffffffffff0000000000000000000000000000000000000000831681179093556040519116919082907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e090600090a35050565b600054610100900460ff16610820576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602b60248201527f496e697469616c697a61626c653a20636f6e7472616374206973206e6f74206960448201527f6e697469616c697a696e670000000000000000000000000000000000000000006064820152608401610304565b610240600054610100900460ff166108ba576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602b60248201527f496e697469616c697a61626c653a20636f6e7472616374206973206e6f74206960448201527f6e697469616c697a696e670000000000000000000000000000000000000000006064820152608401610304565b61024033610712565b6000602082840312156108d557600080fd5b5035919050565b6000815180845260005b81811015610902576020818501810151868301820152016108e6565b81811115610914576000602083870101525b50601f017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0169290920160200192915050565b60208152600061095a60208301846108dc565b9392505050565b803573ffffffffffffffffffffffffffffffffffffffff8116811461098557600080fd5b919050565b60008060006060848603121561099f57600080fd5b6109a884610961565b95602085013595506040909401359392505050565b6000602082840312156109cf57600080fd5b61095a82610961565b600082821015610a11577f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b50039056fea164736f6c634300080f000a"; 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 optimismMintableERC20FactoryProxyCode = + hex"60806040526004361061005e5760003560e01c80635c60da1b116100435780635c60da1b146100be5780638f283970146100f8578063f851a440146101185761006d565b80633659cfe6146100755780634f1ef286146100955761006d565b3661006d5761006b61012d565b005b61006b61012d565b34801561008157600080fd5b5061006b6100903660046106dd565b610224565b6100a86100a33660046106f8565b610296565b6040516100b5919061077b565b60405180910390f35b3480156100ca57600080fd5b506100d3610419565b60405173ffffffffffffffffffffffffffffffffffffffff90911681526020016100b5565b34801561010457600080fd5b5061006b6101133660046106dd565b6104b0565b34801561012457600080fd5b506100d3610517565b60006101577f360894a13ba1a3210667c828492db98dca3e2076cc3735a920a3ca505d382bbc5490565b905073ffffffffffffffffffffffffffffffffffffffff8116610201576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602560248201527f50726f78793a20696d706c656d656e746174696f6e206e6f7420696e6974696160448201527f6c697a656400000000000000000000000000000000000000000000000000000060648201526084015b60405180910390fd5b3660008037600080366000845af43d6000803e8061021e573d6000fd5b503d6000f35b7fb53127684a568b3173ae13b9f8a6016e243e63b6e8ee1178d6a717850b5d61035473ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff16148061027d575033155b1561028e5761028b816105a3565b50565b61028b61012d565b60606102c07fb53127684a568b3173ae13b9f8a6016e243e63b6e8ee1178d6a717850b5d61035490565b73ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff1614806102f7575033155b1561040a57610305846105a3565b6000808573ffffffffffffffffffffffffffffffffffffffff16858560405161032f9291906107ee565b600060405180830381855af49150503d806000811461036a576040519150601f19603f3d011682016040523d82523d6000602084013e61036f565b606091505b509150915081610401576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152603960248201527f50726f78793a2064656c656761746563616c6c20746f206e657720696d706c6560448201527f6d656e746174696f6e20636f6e7472616374206661696c65640000000000000060648201526084016101f8565b91506104129050565b61041261012d565b9392505050565b60006104437fb53127684a568b3173ae13b9f8a6016e243e63b6e8ee1178d6a717850b5d61035490565b73ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff16148061047a575033155b156104a557507f360894a13ba1a3210667c828492db98dca3e2076cc3735a920a3ca505d382bbc5490565b6104ad61012d565b90565b7fb53127684a568b3173ae13b9f8a6016e243e63b6e8ee1178d6a717850b5d61035473ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff161480610509575033155b1561028e5761028b8161060c565b60006105417fb53127684a568b3173ae13b9f8a6016e243e63b6e8ee1178d6a717850b5d61035490565b73ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff161480610578575033155b156104a557507fb53127684a568b3173ae13b9f8a6016e243e63b6e8ee1178d6a717850b5d61035490565b7f360894a13ba1a3210667c828492db98dca3e2076cc3735a920a3ca505d382bbc81815560405173ffffffffffffffffffffffffffffffffffffffff8316907fbc7cd75a20ee27fd9adebab32041f755214dbc6bffa90cc0225b39da2e5c2d3b90600090a25050565b60006106367fb53127684a568b3173ae13b9f8a6016e243e63b6e8ee1178d6a717850b5d61035490565b7fb53127684a568b3173ae13b9f8a6016e243e63b6e8ee1178d6a717850b5d61038381556040805173ffffffffffffffffffffffffffffffffffffffff80851682528616602082015292935090917f7e644d79422f17c01e4894b5f4f588d331ebfa28653d42ae832dc59e38c9798f910160405180910390a1505050565b803573ffffffffffffffffffffffffffffffffffffffff811681146106d857600080fd5b919050565b6000602082840312156106ef57600080fd5b610412826106b4565b60008060006040848603121561070d57600080fd5b610716846106b4565b9250602084013567ffffffffffffffff8082111561073357600080fd5b818601915086601f83011261074757600080fd5b81358181111561075657600080fd5b87602082850101111561076857600080fd5b6020830194508093505050509250925092565b600060208083528351808285015260005b818110156107a85785810183015185820160400152820161078c565b818111156107ba576000604083870101525b50601f017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe016929092016040019392505050565b818382376000910190815291905056fea164736f6c634300080f000a"; bytes internal constant l1ERC721BridgeProxyCode = hex"60806040526004361061005e5760003560e01c80635c60da1b116100435780635c60da1b146100be5780638f283970146100f8578063f851a440146101185761006d565b80633659cfe6146100755780634f1ef286146100955761006d565b3661006d5761006b61012d565b005b61006b61012d565b34801561008157600080fd5b5061006b6100903660046106dd565b610224565b6100a86100a33660046106f8565b610296565b6040516100b5919061077b565b60405180910390f35b3480156100ca57600080fd5b506100d3610419565b60405173ffffffffffffffffffffffffffffffffffffffff90911681526020016100b5565b34801561010457600080fd5b5061006b6101133660046106dd565b6104b0565b34801561012457600080fd5b506100d3610517565b60006101577f360894a13ba1a3210667c828492db98dca3e2076cc3735a920a3ca505d382bbc5490565b905073ffffffffffffffffffffffffffffffffffffffff8116610201576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602560248201527f50726f78793a20696d706c656d656e746174696f6e206e6f7420696e6974696160448201527f6c697a656400000000000000000000000000000000000000000000000000000060648201526084015b60405180910390fd5b3660008037600080366000845af43d6000803e8061021e573d6000fd5b503d6000f35b7fb53127684a568b3173ae13b9f8a6016e243e63b6e8ee1178d6a717850b5d61035473ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff16148061027d575033155b1561028e5761028b816105a3565b50565b61028b61012d565b60606102c07fb53127684a568b3173ae13b9f8a6016e243e63b6e8ee1178d6a717850b5d61035490565b73ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff1614806102f7575033155b1561040a57610305846105a3565b6000808573ffffffffffffffffffffffffffffffffffffffff16858560405161032f9291906107ee565b600060405180830381855af49150503d806000811461036a576040519150601f19603f3d011682016040523d82523d6000602084013e61036f565b606091505b509150915081610401576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152603960248201527f50726f78793a2064656c656761746563616c6c20746f206e657720696d706c6560448201527f6d656e746174696f6e20636f6e7472616374206661696c65640000000000000060648201526084016101f8565b91506104129050565b61041261012d565b9392505050565b60006104437fb53127684a568b3173ae13b9f8a6016e243e63b6e8ee1178d6a717850b5d61035490565b73ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff16148061047a575033155b156104a557507f360894a13ba1a3210667c828492db98dca3e2076cc3735a920a3ca505d382bbc5490565b6104ad61012d565b90565b7fb53127684a568b3173ae13b9f8a6016e243e63b6e8ee1178d6a717850b5d61035473ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff161480610509575033155b1561028e5761028b8161060c565b60006105417fb53127684a568b3173ae13b9f8a6016e243e63b6e8ee1178d6a717850b5d61035490565b73ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff161480610578575033155b156104a557507fb53127684a568b3173ae13b9f8a6016e243e63b6e8ee1178d6a717850b5d61035490565b7f360894a13ba1a3210667c828492db98dca3e2076cc3735a920a3ca505d382bbc81815560405173ffffffffffffffffffffffffffffffffffffffff8316907fbc7cd75a20ee27fd9adebab32041f755214dbc6bffa90cc0225b39da2e5c2d3b90600090a25050565b60006106367fb53127684a568b3173ae13b9f8a6016e243e63b6e8ee1178d6a717850b5d61035490565b7fb53127684a568b3173ae13b9f8a6016e243e63b6e8ee1178d6a717850b5d61038381556040805173ffffffffffffffffffffffffffffffffffffffff80851682528616602082015292935090917f7e644d79422f17c01e4894b5f4f588d331ebfa28653d42ae832dc59e38c9798f910160405180910390a1505050565b803573ffffffffffffffffffffffffffffffffffffffff811681146106d857600080fd5b919050565b6000602082840312156106ef57600080fd5b610412826106b4565b60008060006040848603121561070d57600080fd5b610716846106b4565b9250602084013567ffffffffffffffff8082111561073357600080fd5b818601915086601f83011261074757600080fd5b81358181111561075657600080fd5b87602082850101111561076857600080fd5b6020830194508093505050509250925092565b600060208083528351808285015260005b818110156107a85785810183015185820160400152820161078c565b818111156107ba576000604083870101525b50601f017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe016929092016040019392505050565b818382376000910190815291905056fea164736f6c634300080f000a"; - bytes internal constant optimismPortal2Code = - hex"6080604052600436106101b05760003560e01c80637fc48504116100ec578063a35d99df1161008a578063bf653a5c11610064578063bf653a5c1461062b578063cff0ab961461065e578063e9e05c42146106ff578063f2b4e6171461071257600080fd5b8063a35d99df14610544578063a3860f4814610564578063bb2c727e1461058457600080fd5b80638e819e54116100c65780638e819e5414610494578063952b2797146104b45780639bf62d82146104e7578063a14238e71461051457600080fd5b80637fc48504146104545780638b4c40b0146101d55780638c3152e91461047457600080fd5b80634870496f1161015957806354fd4d501161013357806354fd4d50146103a95780635c975abb146103ff57806371c1566e146104145780637d6be8dc1461043457600080fd5b80634870496f1461030c5780634fd0434c1461032c578063513747ab1461036e57600080fd5b806343ca1c501161018a57806343ca1c5014610297578063452a9320146102b757806345884d32146102cc57600080fd5b806333d7e2bd146101dc57806335e80ab3146102335780633c9f397c1461026557600080fd5b366101d7576101d53334620186a060006040518060200160405280600081525061073f565b005b600080fd5b3480156101e857600080fd5b506037546102099073ffffffffffffffffffffffffffffffffffffffff1681565b60405173ffffffffffffffffffffffffffffffffffffffff90911681526020015b60405180910390f35b34801561023f57600080fd5b5060355461020990610100900473ffffffffffffffffffffffffffffffffffffffff1681565b34801561027157600080fd5b50603b546102829063ffffffff1681565b60405163ffffffff909116815260200161022a565b3480156102a357600080fd5b506101d56102b23660046146f9565b6108fc565b3480156102c357600080fd5b50610209610b5a565b3480156102d857600080fd5b506102fc6102e736600461474b565b603a6020526000908152604090205460ff1681565b604051901515815260200161022a565b34801561031857600080fd5b506101d5610327366004614768565b610bf2565b34801561033857600080fd5b50603b5461035590640100000000900467ffffffffffffffff1681565b60405167ffffffffffffffff909116815260200161022a565b34801561037a57600080fd5b5061039b610389366004614844565b6000908152603c602052604090205490565b60405190815260200161022a565b3480156103b557600080fd5b506103f26040518060400160405280600681526020017f332e31302e30000000000000000000000000000000000000000000000000000081525081565b60405161022a91906148d3565b34801561040b57600080fd5b506102fc611303565b34801561042057600080fd5b506101d561042f3660046148e6565b611396565b34801561044057600080fd5b506101d561044f36600461474b565b611c27565b34801561046057600080fd5b506101d561046f36600461491d565b611d0a565b34801561048057600080fd5b506101d561048f36600461493a565b611df6565b3480156104a057600080fd5b506101d56104af366004614977565b611e42565b3480156104c057600080fd5b507f000000000000000000000000000000000000000000000000000000000000000661039b565b3480156104f357600080fd5b506032546102099073ffffffffffffffffffffffffffffffffffffffff1681565b34801561052057600080fd5b506102fc61052f366004614844565b60336020526000908152604090205460ff1681565b34801561055057600080fd5b5061035561055f3660046149e9565b6120f7565b34801561057057600080fd5b5061020961057f366004614a06565b612116565b34801561059057600080fd5b506105f661059f3660046148e6565b603960209081526000928352604080842090915290825290205473ffffffffffffffffffffffffffffffffffffffff81169074010000000000000000000000000000000000000000900467ffffffffffffffff1682565b6040805173ffffffffffffffffffffffffffffffffffffffff909316835267ffffffffffffffff90911660208301520161022a565b34801561063757600080fd5b507f000000000000000000000000000000000000000000000000000000000000000c61039b565b34801561066a57600080fd5b506001546106c6906fffffffffffffffffffffffffffffffff81169067ffffffffffffffff7001000000000000000000000000000000008204811691780100000000000000000000000000000000000000000000000090041683565b604080516fffffffffffffffffffffffffffffffff909416845267ffffffffffffffff928316602085015291169082015260600161022a565b6101d561070d366004614a36565b61073f565b34801561071e57600080fd5b506038546102099073ffffffffffffffffffffffffffffffffffffffff1681565b8260005a9050838015610767575073ffffffffffffffffffffffffffffffffffffffff871615155b1561079e576040517f13496fda00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6107a883516120f7565b67ffffffffffffffff168567ffffffffffffffff1610156107f5576040517f4929b80800000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6201d4c083511115610833576040517f73052b0f00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b33328114610854575033731111000000000000000000000000000000001111015b6000348888888860405160200161086f959493929190614ab5565b604051602081830303815290604052905060008973ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff167fb3813568d9991fc951961fcb4c784893574240a28925604d09fc577c55bb7c32846040516108df91906148d3565b60405180910390a450506108f38282612177565b50505050505050565b610904611303565b1561093b576040517ff480973e00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b60325473ffffffffffffffffffffffffffffffffffffffff1661dead146109e9576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152603f60248201527f4f7074696d69736d506f7274616c3a2063616e206f6e6c79207472696767657260448201527f206f6e65207769746864726177616c20706572207472616e73616374696f6e0060648201526084015b60405180910390fd5b60006109f48361244e565b9050610a008183611396565b600081815260336020908152604080832080547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00166001179055908501516032805473ffffffffffffffffffffffffffffffffffffffff9092167fffffffffffffffffffffffff00000000000000000000000000000000000000009092169190911790558401516080850151606086015160a0870151610aa29392919061249b565b603280547fffffffffffffffffffffffff00000000000000000000000000000000000000001661dead17905560405190915082907fdb5c7652857aa163daadd670e116628fb42e869d8ac4251ef8971d9e5727df1b90610b0790841515815260200190565b60405180910390a280158015610b1d5750326001145b15610b54576040517feeae4ed300000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b50505050565b6000603560019054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1663452a93206040518163ffffffff1660e01b8152600401602060405180830381865afa158015610bc9573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610bed9190614b1a565b905090565b610bfa611303565b15610c31576040517ff480973e00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b3073ffffffffffffffffffffffffffffffffffffffff16856040015173ffffffffffffffffffffffffffffffffffffffff1603610cf0576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152603f60248201527f4f7074696d69736d506f7274616c3a20796f752063616e6e6f742073656e642060448201527f6d6573736167657320746f2074686520706f7274616c20636f6e74726163740060648201526084016109e0565b6038546040517fbb8aa1fc00000000000000000000000000000000000000000000000000000000815260048101869052600091829173ffffffffffffffffffffffffffffffffffffffff9091169063bb8aa1fc90602401606060405180830381865afa158015610d64573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610d889190614b37565b925050915060008173ffffffffffffffffffffffffffffffffffffffff1663bcef3b556040518163ffffffff1660e01b8152600401602060405180830381865afa158015610dda573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610dfe9190614b84565b603b5490915063ffffffff848116911614610e9b576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602160248201527f4f7074696d69736d506f7274616c3a20696e76616c69642067616d652074797060448201527f650000000000000000000000000000000000000000000000000000000000000060648201526084016109e0565b610eb2610ead36889003880188614b9d565b6124f9565b8114610f40576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602960248201527f4f7074696d69736d506f7274616c3a20696e76616c6964206f7574707574207260448201527f6f6f742070726f6f66000000000000000000000000000000000000000000000060648201526084016109e0565b6000610f4b8961244e565b905060018373ffffffffffffffffffffffffffffffffffffffff1663200d2ed26040518163ffffffff1660e01b8152600401602060405180830381865afa158015610f9a573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610fbe9190614c32565b6002811115610fcf57610fcf614c03565b0361105c576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152603a60248201527f4f7074696d69736d506f7274616c3a2063616e6e6f742070726f76652061676160448201527f696e737420696e76616c696420646973707574652067616d657300000000000060648201526084016109e0565b60408051602081018390526000918101829052606001604080517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0818403018152828252805160209182012090830181905292506111259101604080517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0818403018152828201909152600182527f010000000000000000000000000000000000000000000000000000000000000060208301529061111b898b614c53565b8b60400135612538565b6111b1576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152603260248201527f4f7074696d69736d506f7274616c3a20696e76616c696420776974686472617760448201527f616c20696e636c7573696f6e2070726f6f66000000000000000000000000000060648201526084016109e0565b60408051808201825273ffffffffffffffffffffffffffffffffffffffff808716825267ffffffffffffffff4281166020808501918252600088815260398252868120338252825286812095518654935190941674010000000000000000000000000000000000000000027fffffffff0000000000000000000000000000000000000000000000000000000090931693851693909317919091179093558d840151928e01519351928216939091169185917f67a6208cfcc0801d50f6cbe764733f4fddf66ac0b04442061a8a8c0cb6b63f6291a4604051339083907f798f9f13695f8f045aa5f80ed8efebb695f3c7fe65da381969f2f28bf3c60b9790600090a3506000908152603c602090815260408220805460018101825590835291200180547fffffffffffffffffffffffff000000000000000000000000000000000000000016331790555050505050505050565b6000603560019054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16635c975abb6040518163ffffffff1660e01b8152600401602060405180830381865afa158015611372573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610bed9190614cd7565b600082815260396020908152604080832073ffffffffffffffffffffffffffffffffffffffff85811685529083528184208251808401845290549182168082527401000000000000000000000000000000000000000090920467ffffffffffffffff1681850152818552603a90935292205490919060ff161561149b576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152603160248201527f4f7074696d69736d506f7274616c3a20646973707574652067616d652068617360448201527f206265656e20626c61636b6c697374656400000000000000000000000000000060648201526084016109e0565b816020015167ffffffffffffffff1660000361155f576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152604d60248201527f4f7074696d69736d506f7274616c3a207769746864726177616c20686173206e60448201527f6f74206265656e2070726f76656e2062792070726f6f66207375626d6974746560648201527f7220616464726573732079657400000000000000000000000000000000000000608482015260a4016109e0565b60006115e08273ffffffffffffffffffffffffffffffffffffffff1663cf09e0d06040518163ffffffff1660e01b8152600401602060405180830381865afa1580156115af573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906115d39190614cf4565b67ffffffffffffffff1690565b90508067ffffffffffffffff16836020015167ffffffffffffffff16116116af576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152604e60248201527f4f7074696d69736d506f7274616c3a207769746864726177616c2074696d657360448201527f74616d70206c657373207468616e20646973707574652067616d65206372656160648201527f74696f6e2074696d657374616d70000000000000000000000000000000000000608482015260a4016109e0565b7f000000000000000000000000000000000000000000000000000000000000000c836020015167ffffffffffffffff16426116ea9190614d40565b11611777576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152603560248201527f4f7074696d69736d506f7274616c3a2070726f76656e2077697468647261776160448201527f6c20686173206e6f74206d61747572656420796574000000000000000000000060648201526084016109e0565b60028273ffffffffffffffffffffffffffffffffffffffff1663200d2ed26040518163ffffffff1660e01b8152600401602060405180830381865afa1580156117c4573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906117e89190614c32565b60028111156117f9576117f9614c03565b14611886576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152603660248201527f4f7074696d69736d506f7274616c3a206f75747075742070726f706f73616c2060448201527f686173206e6f74206265656e2076616c6964617465640000000000000000000060648201526084016109e0565b603b5463ffffffff1663ffffffff166119108373ffffffffffffffffffffffffffffffffffffffff1663bbdc02db6040518163ffffffff1660e01b8152600401602060405180830381865afa1580156118e3573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906119079190614d57565b63ffffffff1690565b63ffffffff16146119a3576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602160248201527f4f7074696d69736d506f7274616c3a20696e76616c69642067616d652074797060448201527f650000000000000000000000000000000000000000000000000000000000000060648201526084016109e0565b603b5467ffffffffffffffff64010000000090910481169082161015611a71576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152604b60248201527f4f7074696d69736d506f7274616c3a20646973707574652067616d652063726560448201527f61746564206265666f7265207265737065637465642067616d6520747970652060648201527f7761732075706461746564000000000000000000000000000000000000000000608482015260a4016109e0565b7f0000000000000000000000000000000000000000000000000000000000000006611ae08373ffffffffffffffffffffffffffffffffffffffff166319effeb46040518163ffffffff1660e01b8152600401602060405180830381865afa1580156115af573d6000803e3d6000fd5b611af49067ffffffffffffffff1642614d40565b11611b81576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602a60248201527f4f7074696d69736d506f7274616c3a206f75747075742070726f706f73616c2060448201527f696e206169722d6761700000000000000000000000000000000000000000000060648201526084016109e0565b60008581526033602052604090205460ff1615611c20576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152603560248201527f4f7074696d69736d506f7274616c3a207769746864726177616c20686173206160448201527f6c7265616479206265656e2066696e616c697a6564000000000000000000000060648201526084016109e0565b5050505050565b611c2f610b5a565b73ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff1614611c93576040517f82b4290000000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b73ffffffffffffffffffffffffffffffffffffffff81166000818152603a602052604080822080547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00166001179055517f192c289026d59a41a27f5aea08f3969b57931b0589202d14f4368cded95d3cda9190a250565b611d12610b5a565b73ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff1614611d76576040517f82b4290000000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b603b805463ffffffff83167fffffffffffffffffffffffffffffffffffffffff00000000000000000000000090911681176401000000004267ffffffffffffffff90811682029290921793849055604051930416917f049fe9dd413cdf037cce27011cc1790c753118272f3630e6e8bdfa5e8208176090600090a350565b565b611dfe611303565b15611e35576040517ff480973e00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b611e3f81336108fc565b50565b600054610100900460ff1615808015611e625750600054600160ff909116105b80611e7c5750303b158015611e7c575060005460ff166001145b611f08576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602e60248201527f496e697469616c697a61626c653a20636f6e747261637420697320616c72656160448201527f647920696e697469616c697a656400000000000000000000000000000000000060648201526084016109e0565b600080547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff001660011790558015611f6657600080547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00ff166101001790555b603880547fffffffffffffffffffffffff000000000000000000000000000000000000000090811673ffffffffffffffffffffffffffffffffffffffff8881169190911790925560378054909116868316179055603580547fffffffffffffffffffffff0000000000000000000000000000000000000000ff166101008684160217905560325416612086576032805461dead7fffffffffffffffffffffffff0000000000000000000000000000000000000000909116179055603b80547fffffffffffffffffffffffffffffffffffffffff000000000000000000000000166401000000004267ffffffffffffffff16027fffffffffffffffffffffffffffffffffffffffffffffffffffffffff00000000161763ffffffff84161790555b61208e61255c565b8015611c2057600080547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00ff169055604051600181527f7f26b83ff96e1f2b6a682f133852f6798a09c465da95921460cefb38474024989060200160405180910390a15050505050565b6000612104826010614d74565b61211090615208614da4565b92915050565b603c602052816000526040600020818154811061213257600080fd5b60009182526020909120015473ffffffffffffffffffffffffffffffffffffffff169150829050565b73ffffffffffffffffffffffffffffffffffffffff163b151590565b6001546000906121ad907801000000000000000000000000000000000000000000000000900467ffffffffffffffff1643614d40565b905060006121b961266f565b90506000816020015160ff16826000015163ffffffff166121da9190614dff565b9050821561231157600154600090612211908390700100000000000000000000000000000000900467ffffffffffffffff16614e67565b90506000836040015160ff16836122289190614edb565b6001546122489084906fffffffffffffffffffffffffffffffff16614edb565b6122529190614dff565b6001549091506000906122a39061227c9084906fffffffffffffffffffffffffffffffff16614f97565b866060015163ffffffff168760a001516fffffffffffffffffffffffffffffffff16612730565b905060018611156122d2576122cf61227c82876040015160ff1660018a6122ca9190614d40565b61274f565b90505b6fffffffffffffffffffffffffffffffff16780100000000000000000000000000000000000000000000000067ffffffffffffffff4316021760015550505b60018054869190601090612344908490700100000000000000000000000000000000900467ffffffffffffffff16614da4565b92506101000a81548167ffffffffffffffff021916908367ffffffffffffffff160217905550816000015163ffffffff16600160000160109054906101000a900467ffffffffffffffff1667ffffffffffffffff1613156123d1576040517f77ebef4d00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6001546000906123fd906fffffffffffffffffffffffffffffffff1667ffffffffffffffff881661500b565b9050600061240f48633b9aca006127a4565b6124199083615048565b905060005a6124289088614d40565b9050808211156124445761244461243f8284614d40565b6127bb565b5050505050505050565b80516020808301516040808501516060860151608087015160a0880151935160009761247e97909695910161505c565b604051602081830303815290604052805190602001209050919050565b60008060006124ab8660006127e9565b9050806124e1576308c379a06000526020805278185361666543616c6c3a204e6f7420656e6f756768206761736058526064601cfd5b600080855160208701888b5af1979650505050505050565b6000816000015182602001518360400151846060015160405160200161247e949392919093845260208401929092526040830152606082015260800190565b60008061254486612807565b905061255281868686612839565b9695505050505050565b600054610100900460ff166125f3576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602b60248201527f496e697469616c697a61626c653a20636f6e7472616374206973206e6f74206960448201527f6e697469616c697a696e6700000000000000000000000000000000000000000060648201526084016109e0565b6001547801000000000000000000000000000000000000000000000000900467ffffffffffffffff16600003611df45760408051606081018252633b9aca00808252600060208301524367ffffffffffffffff169190920181905278010000000000000000000000000000000000000000000000000217600155565b6040805160c08082018352600080835260208301819052828401819052606083018190526080830181905260a083015260375483517fcc731b020000000000000000000000000000000000000000000000000000000081529351929373ffffffffffffffffffffffffffffffffffffffff9091169263cc731b02926004808401939192918290030181865afa15801561270c573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610bed91906150c9565b600061274561273f8585612869565b83612879565b90505b9392505050565b6000670de0b6b3a76400006127906127678583614dff565b61277990670de0b6b3a7640000614e67565b61278b85670de0b6b3a7640000614edb565b612888565b61279a9086614edb565b6127459190614dff565b6000818310156127b45781612748565b5090919050565b6000805a90505b825a6127ce9083614d40565b10156127e4576127dd82615185565b91506127c2565b505050565b600080603f83619c4001026040850201603f5a021015949350505050565b6060818051906020012060405160200161282391815260200190565b6040516020818303038152906040529050919050565b60006128608461284a8786866128b9565b8051602091820120825192909101919091201490565b95945050505050565b6000818312156127b45781612748565b60008183126127b45781612748565b6000612748670de0b6b3a7640000836128a086613337565b6128aa9190614edb565b6128b49190614dff565b61357b565b60606000845111612926576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601560248201527f4d65726b6c65547269653a20656d707479206b6579000000000000000000000060448201526064016109e0565b6000612931846137ba565b9050600061293e866138a6565b905060008460405160200161295591815260200190565b60405160208183030381529060405290506000805b84518110156132ae576000858281518110612987576129876151bd565b602002602001015190508451831115612a22576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602e60248201527f4d65726b6c65547269653a206b657920696e646578206578636565647320746f60448201527f74616c206b6579206c656e67746800000000000000000000000000000000000060648201526084016109e0565b82600003612adb5780518051602091820120604051612a7092612a4a92910190815260200190565b604051602081830303815290604052858051602091820120825192909101919091201490565b612ad6576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601d60248201527f4d65726b6c65547269653a20696e76616c696420726f6f74206861736800000060448201526064016109e0565b612c32565b805151602011612b915780518051602091820120604051612b0592612a4a92910190815260200190565b612ad6576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602760248201527f4d65726b6c65547269653a20696e76616c6964206c6172676520696e7465726e60448201527f616c20686173680000000000000000000000000000000000000000000000000060648201526084016109e0565b805184516020808701919091208251919092012014612c32576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602660248201527f4d65726b6c65547269653a20696e76616c696420696e7465726e616c206e6f6460448201527f652068617368000000000000000000000000000000000000000000000000000060648201526084016109e0565b612c3e601060016151ec565b81602001515103612e1a5784518303612db257612c788160200151601081518110612c6b57612c6b6151bd565b6020026020010151613909565b96506000875111612d0b576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152603b60248201527f4d65726b6c65547269653a2076616c7565206c656e677468206d75737420626560448201527f2067726561746572207468616e207a65726f20286272616e636829000000000060648201526084016109e0565b60018651612d199190614d40565b8214612da7576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152603a60248201527f4d65726b6c65547269653a2076616c7565206e6f6465206d757374206265206c60448201527f617374206e6f646520696e2070726f6f6620286272616e63682900000000000060648201526084016109e0565b505050505050612748565b6000858481518110612dc657612dc66151bd565b602001015160f81c60f81b60f81c9050600082602001518260ff1681518110612df157612df16151bd565b60200260200101519050612e04816139bd565b9550612e116001866151ec565b9450505061329b565b600281602001515103613213576000612e32826139e2565b9050600081600081518110612e4957612e496151bd565b016020015160f81c90506000612e60600283615204565b612e6b906002615226565b90506000612e7c848360ff16613a06565b90506000612e8a8a89613a06565b90506000612e988383613a3c565b905080835114612f2a576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152603a60248201527f4d65726b6c65547269653a20706174682072656d61696e646572206d7573742060448201527f736861726520616c6c206e6962626c65732077697468206b657900000000000060648201526084016109e0565b60ff851660021480612f3f575060ff85166003145b1561312e5780825114612fd4576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152603d60248201527f4d65726b6c65547269653a206b65792072656d61696e646572206d757374206260448201527f65206964656e746963616c20746f20706174682072656d61696e64657200000060648201526084016109e0565b612fee8760200151600181518110612c6b57612c6b6151bd565b9c5060008d5111613081576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152603960248201527f4d65726b6c65547269653a2076616c7565206c656e677468206d75737420626560448201527f2067726561746572207468616e207a65726f20286c656166290000000000000060648201526084016109e0565b60018c5161308f9190614d40565b881461311d576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152603860248201527f4d65726b6c65547269653a2076616c7565206e6f6465206d757374206265206c60448201527f617374206e6f646520696e2070726f6f6620286c65616629000000000000000060648201526084016109e0565b505050505050505050505050612748565b60ff85161580613141575060ff85166001145b156131805761316d8760200151600181518110613160576131606151bd565b60200260200101516139bd565b9950613179818a6151ec565b9850613208565b6040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152603260248201527f4d65726b6c65547269653a2072656365697665642061206e6f6465207769746860448201527f20616e20756e6b6e6f776e20707265666978000000000000000000000000000060648201526084016109e0565b50505050505061329b565b6040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602860248201527f4d65726b6c65547269653a20726563656976656420616e20756e70617273656160448201527f626c65206e6f646500000000000000000000000000000000000000000000000060648201526084016109e0565b50806132a681615185565b91505061296a565b506040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602560248201527f4d65726b6c65547269653a2072616e206f7574206f662070726f6f6620656c6560448201527f6d656e747300000000000000000000000000000000000000000000000000000060648201526084016109e0565b60008082136133a2576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152600960248201527f554e444546494e4544000000000000000000000000000000000000000000000060448201526064016109e0565b600060606133af84613af0565b03609f8181039490941b90931c6c465772b2bbbb5f824b15207a3081018102606090811d6d0388eaa27412d5aca026815d636e018202811d6d0df99ac502031bf953eff472fdcc018202811d6d13cdffb29d51d99322bdff5f2211018202811d6d0a0f742023def783a307a986912e018202811d6d01920d8043ca89b5239253284e42018202811d6c0b7a86d7375468fac667a0a527016c29508e458543d8aa4df2abee7883018302821d6d0139601a2efabe717e604cbb4894018302821d6d02247f7a7b6594320649aa03aba1018302821d7fffffffffffffffffffffffffffffffffffffff73c0c716a594e00d54e3c4cbc9018302821d7ffffffffffffffffffffffffffffffffffffffdc7b88c420e53a9890533129f6f01830290911d7fffffffffffffffffffffffffffffffffffffff465fda27eb4d63ded474e5f832019091027ffffffffffffffff5f6af8f7b3396644f18e157960000000000000000000000000105711340daa0d5f769dba1915cef59f0815a5506027d0267a36c0c95b3975ab3ee5b203a7614a3f75373f047d803ae7b6687f2b393909302929092017d57115e47018c7177eebf7cd370a3356a1b7863008a5ae8028c72b88642840160ae1d92915050565b60007ffffffffffffffffffffffffffffffffffffffffffffffffdb731c958f34d94c182136135ac57506000919050565b680755bf798b4a1bf1e5821261361e576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152600c60248201527f4558505f4f564552464c4f57000000000000000000000000000000000000000060448201526064016109e0565b6503782dace9d9604e83901b059150600060606bb17217f7d1cf79abc9e3b39884821b056b80000000000000000000000001901d6bb17217f7d1cf79abc9e3b39881029093037fffffffffffffffffffffffffffffffffffffffdbf3ccf1604d263450f02a550481018102606090811d6d0277594991cfc85f6e2461837cd9018202811d7fffffffffffffffffffffffffffffffffffffe5adedaa1cb095af9e4da10e363c018202811d6db1bbb201f443cf962f1a1d3db4a5018202811d7ffffffffffffffffffffffffffffffffffffd38dc772608b0ae56cce01296c0eb018202811d6e05180bb14799ab47a8a8cb2a527d57016d02d16720577bd19bf614176fe9ea6c10fe68e7fd37d0007b713f765084018402831d9081019084017ffffffffffffffffffffffffffffffffffffffe2c69812cf03b0763fd454a8f7e010290911d6e0587f503bb6ea29d25fcb7401964500190910279d835ebba824c98fb31b83b2ca45c000000000000000000000000010574029d9dc38563c32e5c2f6dc192ee70ef65f9978af30260c3939093039290921c92915050565b80516060908067ffffffffffffffff8111156137d8576137d861451c565b60405190808252806020026020018201604052801561381d57816020015b60408051808201909152606080825260208201528152602001906001900390816137f65790505b50915060005b8181101561389f576040518060400160405280858381518110613848576138486151bd565b6020026020010151815260200161387786848151811061386a5761386a6151bd565b6020026020010151613bc6565b81525083828151811061388c5761388c6151bd565b6020908102919091010152600101613823565b5050919050565b606080604051905082518060011b603f8101601f1916830160405280835250602084016020830160005b838110156138fe578060011b82018184015160001a8060041c8253600f8116600183015350506001016138d0565b509295945050505050565b6060600080600061391985613bd9565b91945092509050600081600181111561393457613934614c03565b1461396b576040517f1ff9b2e400000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b61397582846151ec565b8551146139ae576040517f5c5537b800000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b61286085602001518484614077565b606060208260000151106139d9576139d482613909565b612110565b6121108261410b565b6060612110613a018360200151600081518110612c6b57612c6b6151bd565b6138a6565b606082518210613a255750604080516020810190915260008152612110565b6127488383848651613a379190614d40565b614121565b6000808251845110613a4f578251613a52565b83515b90505b8082108015613ad95750828281518110613a7157613a716151bd565b602001015160f81c60f81b7effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916848381518110613ab057613ab06151bd565b01602001517fff0000000000000000000000000000000000000000000000000000000000000016145b15613ae957816001019150613a55565b5092915050565b6000808211613b5b576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152600960248201527f554e444546494e4544000000000000000000000000000000000000000000000060448201526064016109e0565b5060016fffffffffffffffffffffffffffffffff821160071b82811c67ffffffffffffffff1060061b1782811c63ffffffff1060051b1782811c61ffff1060041b1782811c60ff10600390811b90911783811c600f1060021b1783811c909110821b1791821c111790565b6060612110613bd4836142f9565b614366565b60008060008360000151600003613c1c576040517f5ab458fb00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6020840151805160001a607f8111613c41576000600160009450945094505050614070565b60b78111613d57576000613c56608083614d40565b905080876000015111613c95576040517f66c9448500000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6001838101517fff00000000000000000000000000000000000000000000000000000000000000169082148015613d0d57507f80000000000000000000000000000000000000000000000000000000000000007fff000000000000000000000000000000000000000000000000000000000000008216105b15613d44576040517fbabb01dd00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b5060019550935060009250614070915050565b60bf8111613eb5576000613d6c60b783614d40565b905080876000015111613dab576040517f66c9448500000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b60018301517fff00000000000000000000000000000000000000000000000000000000000000166000819003613e0d576040517fbabb01dd00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b600184015160088302610100031c60378111613e55576040517fbabb01dd00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b613e5f81846151ec565b895111613e98576040517f66c9448500000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b613ea38360016151ec565b97509550600094506140709350505050565b60f78111613f1a576000613eca60c083614d40565b905080876000015111613f09576040517f66c9448500000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b600195509350849250614070915050565b6000613f2760f783614d40565b905080876000015111613f66576040517f66c9448500000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b60018301517fff00000000000000000000000000000000000000000000000000000000000000166000819003613fc8576040517fbabb01dd00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b600184015160088302610100031c60378111614010576040517fbabb01dd00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b61401a81846151ec565b895111614053576040517f66c9448500000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b61405e8360016151ec565b97509550600194506140709350505050565b9193909250565b60608167ffffffffffffffff8111156140925761409261451c565b6040519080825280601f01601f1916602001820160405280156140bc576020820181803683370190505b50905081156127485760006140d184866151ec565b90506020820160005b848110156140f25782810151828201526020016140da565b84811115614101576000858301525b5050509392505050565b6060612110826020015160008460000151614077565b60608182601f011015614190576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152600e60248201527f736c6963655f6f766572666c6f7700000000000000000000000000000000000060448201526064016109e0565b8282840110156141fc576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152600e60248201527f736c6963655f6f766572666c6f7700000000000000000000000000000000000060448201526064016109e0565b81830184511015614269576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601160248201527f736c6963655f6f75744f66426f756e647300000000000000000000000000000060448201526064016109e0565b60608215801561428857604051915060008252602082016040526142f0565b6040519150601f8416801560200281840101858101878315602002848b0101015b818310156142c15780518352602092830192016142a9565b5050858452601f017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe016604052505b50949350505050565b60408051808201909152600080825260208201528151600003614348576040517f5ab458fb00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b50604080518082019091528151815260209182019181019190915290565b6060600080600061437685613bd9565b91945092509050600181600181111561439157614391614c03565b146143c8576040517f4b9c6abe00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b84516143d483856151ec565b1461440b576040517f5c5537b800000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b604080516020808252610420820190925290816020015b60408051808201909152600080825260208201528152602001906001900390816144225790505093506000835b8651811015614510576000806144956040518060400160405280858c600001516144799190614d40565b8152602001858c6020015161448e91906151ec565b9052613bd9565b5091509150604051806040016040528083836144b191906151ec565b8152602001848b602001516144c691906151ec565b8152508885815181106144db576144db6151bd565b60209081029190910101526144f16001856151ec565b93506144fd81836151ec565b61450790846151ec565b9250505061444f565b50845250919392505050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b604051601f82017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe016810167ffffffffffffffff811182821017156145925761459261451c565b604052919050565b73ffffffffffffffffffffffffffffffffffffffff81168114611e3f57600080fd5b600082601f8301126145cd57600080fd5b813567ffffffffffffffff8111156145e7576145e761451c565b61461860207fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0601f8401160161454b565b81815284602083860101111561462d57600080fd5b816020850160208301376000918101602001919091529392505050565b600060c0828403121561465c57600080fd5b60405160c0810167ffffffffffffffff82821081831117156146805761468061451c565b81604052829350843583526020850135915061469b8261459a565b816020840152604085013591506146b18261459a565b816040840152606085013560608401526080850135608084015260a08501359150808211156146df57600080fd5b506146ec858286016145bc565b60a0830152505092915050565b6000806040838503121561470c57600080fd5b823567ffffffffffffffff81111561472357600080fd5b61472f8582860161464a565b92505060208301356147408161459a565b809150509250929050565b60006020828403121561475d57600080fd5b81356127488161459a565b600080600080600085870360e081121561478157600080fd5b863567ffffffffffffffff8082111561479957600080fd5b6147a58a838b0161464a565b97506020890135965060807fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc0840112156147de57600080fd5b60408901955060c08901359250808311156147f857600080fd5b828901925089601f84011261480c57600080fd5b823591508082111561481d57600080fd5b508860208260051b840101111561483357600080fd5b959894975092955050506020019190565b60006020828403121561485657600080fd5b5035919050565b60005b83811015614878578181015183820152602001614860565b83811115610b545750506000910152565b600081518084526148a181602086016020860161485d565b601f017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0169290920160200192915050565b6020815260006127486020830184614889565b600080604083850312156148f957600080fd5b8235915060208301356147408161459a565b63ffffffff81168114611e3f57600080fd5b60006020828403121561492f57600080fd5b81356127488161490b565b60006020828403121561494c57600080fd5b813567ffffffffffffffff81111561496357600080fd5b61496f8482850161464a565b949350505050565b6000806000806080858703121561498d57600080fd5b84356149988161459a565b935060208501356149a88161459a565b925060408501356149b88161459a565b915060608501356149c88161490b565b939692955090935050565b67ffffffffffffffff81168114611e3f57600080fd5b6000602082840312156149fb57600080fd5b8135612748816149d3565b60008060408385031215614a1957600080fd5b50508035926020909101359150565b8015158114611e3f57600080fd5b600080600080600060a08688031215614a4e57600080fd5b8535614a598161459a565b9450602086013593506040860135614a70816149d3565b92506060860135614a8081614a28565b9150608086013567ffffffffffffffff811115614a9c57600080fd5b614aa8888289016145bc565b9150509295509295909350565b8581528460208201527fffffffffffffffff0000000000000000000000000000000000000000000000008460c01b16604082015282151560f81b604882015260008251614b0981604985016020870161485d565b919091016049019695505050505050565b600060208284031215614b2c57600080fd5b81516127488161459a565b600080600060608486031215614b4c57600080fd5b8351614b578161490b565b6020850151909350614b68816149d3565b6040850151909250614b798161459a565b809150509250925092565b600060208284031215614b9657600080fd5b5051919050565b600060808284031215614baf57600080fd5b6040516080810181811067ffffffffffffffff82111715614bd257614bd261451c565b8060405250823581526020830135602082015260408301356040820152606083013560608201528091505092915050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602160045260246000fd5b600060208284031215614c4457600080fd5b81516003811061274857600080fd5b600067ffffffffffffffff80841115614c6e57614c6e61451c565b8360051b6020614c7f81830161454b565b868152918501918181019036841115614c9757600080fd5b865b84811015614ccb57803586811115614cb15760008081fd5b614cbd36828b016145bc565b845250918301918301614c99565b50979650505050505050565b600060208284031215614ce957600080fd5b815161274881614a28565b600060208284031215614d0657600080fd5b8151612748816149d3565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b600082821015614d5257614d52614d11565b500390565b600060208284031215614d6957600080fd5b81516127488161490b565b600067ffffffffffffffff80831681851681830481118215151615614d9b57614d9b614d11565b02949350505050565b600067ffffffffffffffff808316818516808303821115614dc757614dc7614d11565b01949350505050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601260045260246000fd5b600082614e0e57614e0e614dd0565b7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff83147f800000000000000000000000000000000000000000000000000000000000000083141615614e6257614e62614d11565b500590565b6000808312837f800000000000000000000000000000000000000000000000000000000000000001831281151615614ea157614ea1614d11565b837f7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff018313811615614ed557614ed5614d11565b50500390565b60007f7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff600084136000841385830485118282161615614f1c57614f1c614d11565b7f80000000000000000000000000000000000000000000000000000000000000006000871286820588128184161615614f5757614f57614d11565b60008712925087820587128484161615614f7357614f73614d11565b87850587128184161615614f8957614f89614d11565b505050929093029392505050565b6000808212827f7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff03841381151615614fd157614fd1614d11565b827f800000000000000000000000000000000000000000000000000000000000000003841281161561500557615005614d11565b50500190565b6000817fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff048311821515161561504357615043614d11565b500290565b60008261505757615057614dd0565b500490565b868152600073ffffffffffffffffffffffffffffffffffffffff808816602084015280871660408401525084606083015283608083015260c060a08301526150a760c0830184614889565b98975050505050505050565b805160ff811681146150c457600080fd5b919050565b600060c082840312156150db57600080fd5b60405160c0810181811067ffffffffffffffff821117156150fe576150fe61451c565b604052825161510c8161490b565b815261511a602084016150b3565b602082015261512b604084016150b3565b6040820152606083015161513e8161490b565b606082015260808301516151518161490b565b608082015260a08301516fffffffffffffffffffffffffffffffff8116811461517957600080fd5b60a08201529392505050565b60007fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff82036151b6576151b6614d11565b5060010190565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b600082198211156151ff576151ff614d11565b500190565b600060ff83168061521757615217614dd0565b8060ff84160691505092915050565b600060ff821660ff84168082101561524057615240614d11565b9003939250505056fea164736f6c634300080f000a"; + bytes internal constant disputeGameFactoryProxyCode = + hex"60806040526004361061005e5760003560e01c80635c60da1b116100435780635c60da1b146100be5780638f283970146100f8578063f851a440146101185761006d565b80633659cfe6146100755780634f1ef286146100955761006d565b3661006d5761006b61012d565b005b61006b61012d565b34801561008157600080fd5b5061006b6100903660046106dd565b610224565b6100a86100a33660046106f8565b610296565b6040516100b5919061077b565b60405180910390f35b3480156100ca57600080fd5b506100d3610419565b60405173ffffffffffffffffffffffffffffffffffffffff90911681526020016100b5565b34801561010457600080fd5b5061006b6101133660046106dd565b6104b0565b34801561012457600080fd5b506100d3610517565b60006101577f360894a13ba1a3210667c828492db98dca3e2076cc3735a920a3ca505d382bbc5490565b905073ffffffffffffffffffffffffffffffffffffffff8116610201576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602560248201527f50726f78793a20696d706c656d656e746174696f6e206e6f7420696e6974696160448201527f6c697a656400000000000000000000000000000000000000000000000000000060648201526084015b60405180910390fd5b3660008037600080366000845af43d6000803e8061021e573d6000fd5b503d6000f35b7fb53127684a568b3173ae13b9f8a6016e243e63b6e8ee1178d6a717850b5d61035473ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff16148061027d575033155b1561028e5761028b816105a3565b50565b61028b61012d565b60606102c07fb53127684a568b3173ae13b9f8a6016e243e63b6e8ee1178d6a717850b5d61035490565b73ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff1614806102f7575033155b1561040a57610305846105a3565b6000808573ffffffffffffffffffffffffffffffffffffffff16858560405161032f9291906107ee565b600060405180830381855af49150503d806000811461036a576040519150601f19603f3d011682016040523d82523d6000602084013e61036f565b606091505b509150915081610401576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152603960248201527f50726f78793a2064656c656761746563616c6c20746f206e657720696d706c6560448201527f6d656e746174696f6e20636f6e7472616374206661696c65640000000000000060648201526084016101f8565b91506104129050565b61041261012d565b9392505050565b60006104437fb53127684a568b3173ae13b9f8a6016e243e63b6e8ee1178d6a717850b5d61035490565b73ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff16148061047a575033155b156104a557507f360894a13ba1a3210667c828492db98dca3e2076cc3735a920a3ca505d382bbc5490565b6104ad61012d565b90565b7fb53127684a568b3173ae13b9f8a6016e243e63b6e8ee1178d6a717850b5d61035473ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff161480610509575033155b1561028e5761028b8161060c565b60006105417fb53127684a568b3173ae13b9f8a6016e243e63b6e8ee1178d6a717850b5d61035490565b73ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff161480610578575033155b156104a557507fb53127684a568b3173ae13b9f8a6016e243e63b6e8ee1178d6a717850b5d61035490565b7f360894a13ba1a3210667c828492db98dca3e2076cc3735a920a3ca505d382bbc81815560405173ffffffffffffffffffffffffffffffffffffffff8316907fbc7cd75a20ee27fd9adebab32041f755214dbc6bffa90cc0225b39da2e5c2d3b90600090a25050565b60006106367fb53127684a568b3173ae13b9f8a6016e243e63b6e8ee1178d6a717850b5d61035490565b7fb53127684a568b3173ae13b9f8a6016e243e63b6e8ee1178d6a717850b5d61038381556040805173ffffffffffffffffffffffffffffffffffffffff80851682528616602082015292935090917f7e644d79422f17c01e4894b5f4f588d331ebfa28653d42ae832dc59e38c9798f910160405180910390a1505050565b803573ffffffffffffffffffffffffffffffffffffffff811681146106d857600080fd5b919050565b6000602082840312156106ef57600080fd5b610412826106b4565b60008060006040848603121561070d57600080fd5b610716846106b4565b9250602084013567ffffffffffffffff8082111561073357600080fd5b818601915086601f83011261074757600080fd5b81358181111561075657600080fd5b87602082850101111561076857600080fd5b6020830194508093505050509250925092565b600060208083528351808285015260005b818110156107a85785810183015185820160400152820161078c565b818111156107ba576000604083870101525b50601f017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe016929092016040019392505050565b818382376000910190815291905056fea164736f6c634300080f000a"; + bytes internal constant l2OutputOracleProxyCode = + hex"60806040526004361061005e5760003560e01c80635c60da1b116100435780635c60da1b146100be5780638f283970146100f8578063f851a440146101185761006d565b80633659cfe6146100755780634f1ef286146100955761006d565b3661006d5761006b61012d565b005b61006b61012d565b34801561008157600080fd5b5061006b6100903660046106dd565b610224565b6100a86100a33660046106f8565b610296565b6040516100b5919061077b565b60405180910390f35b3480156100ca57600080fd5b506100d3610419565b60405173ffffffffffffffffffffffffffffffffffffffff90911681526020016100b5565b34801561010457600080fd5b5061006b6101133660046106dd565b6104b0565b34801561012457600080fd5b506100d3610517565b60006101577f360894a13ba1a3210667c828492db98dca3e2076cc3735a920a3ca505d382bbc5490565b905073ffffffffffffffffffffffffffffffffffffffff8116610201576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602560248201527f50726f78793a20696d706c656d656e746174696f6e206e6f7420696e6974696160448201527f6c697a656400000000000000000000000000000000000000000000000000000060648201526084015b60405180910390fd5b3660008037600080366000845af43d6000803e8061021e573d6000fd5b503d6000f35b7fb53127684a568b3173ae13b9f8a6016e243e63b6e8ee1178d6a717850b5d61035473ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff16148061027d575033155b1561028e5761028b816105a3565b50565b61028b61012d565b60606102c07fb53127684a568b3173ae13b9f8a6016e243e63b6e8ee1178d6a717850b5d61035490565b73ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff1614806102f7575033155b1561040a57610305846105a3565b6000808573ffffffffffffffffffffffffffffffffffffffff16858560405161032f9291906107ee565b600060405180830381855af49150503d806000811461036a576040519150601f19603f3d011682016040523d82523d6000602084013e61036f565b606091505b509150915081610401576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152603960248201527f50726f78793a2064656c656761746563616c6c20746f206e657720696d706c6560448201527f6d656e746174696f6e20636f6e7472616374206661696c65640000000000000060648201526084016101f8565b91506104129050565b61041261012d565b9392505050565b60006104437fb53127684a568b3173ae13b9f8a6016e243e63b6e8ee1178d6a717850b5d61035490565b73ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff16148061047a575033155b156104a557507f360894a13ba1a3210667c828492db98dca3e2076cc3735a920a3ca505d382bbc5490565b6104ad61012d565b90565b7fb53127684a568b3173ae13b9f8a6016e243e63b6e8ee1178d6a717850b5d61035473ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff161480610509575033155b1561028e5761028b8161060c565b60006105417fb53127684a568b3173ae13b9f8a6016e243e63b6e8ee1178d6a717850b5d61035490565b73ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff161480610578575033155b156104a557507fb53127684a568b3173ae13b9f8a6016e243e63b6e8ee1178d6a717850b5d61035490565b7f360894a13ba1a3210667c828492db98dca3e2076cc3735a920a3ca505d382bbc81815560405173ffffffffffffffffffffffffffffffffffffffff8316907fbc7cd75a20ee27fd9adebab32041f755214dbc6bffa90cc0225b39da2e5c2d3b90600090a25050565b60006106367fb53127684a568b3173ae13b9f8a6016e243e63b6e8ee1178d6a717850b5d61035490565b7fb53127684a568b3173ae13b9f8a6016e243e63b6e8ee1178d6a717850b5d61038381556040805173ffffffffffffffffffffffffffffffffffffffff80851682528616602082015292935090917f7e644d79422f17c01e4894b5f4f588d331ebfa28653d42ae832dc59e38c9798f910160405180910390a1505050565b803573ffffffffffffffffffffffffffffffffffffffff811681146106d857600080fd5b919050565b6000602082840312156106ef57600080fd5b610412826106b4565b60008060006040848603121561070d57600080fd5b610716846106b4565b9250602084013567ffffffffffffffff8082111561073357600080fd5b818601915086601f83011261074757600080fd5b81358181111561075657600080fd5b87602082850101111561076857600080fd5b6020830194508093505050509250925092565b600060208083528351808285015260005b818110156107a85785810183015185820160400152820161078c565b818111156107ba576000604083870101525b50601f017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe016929092016040019392505050565b818382376000910190815291905056fea164736f6c634300080f000a"; + bytes internal constant delayedWETHProxyCode = + hex"60806040526004361061005e5760003560e01c80635c60da1b116100435780635c60da1b146100be5780638f283970146100f8578063f851a440146101185761006d565b80633659cfe6146100755780634f1ef286146100955761006d565b3661006d5761006b61012d565b005b61006b61012d565b34801561008157600080fd5b5061006b6100903660046106dd565b610224565b6100a86100a33660046106f8565b610296565b6040516100b5919061077b565b60405180910390f35b3480156100ca57600080fd5b506100d3610419565b60405173ffffffffffffffffffffffffffffffffffffffff90911681526020016100b5565b34801561010457600080fd5b5061006b6101133660046106dd565b6104b0565b34801561012457600080fd5b506100d3610517565b60006101577f360894a13ba1a3210667c828492db98dca3e2076cc3735a920a3ca505d382bbc5490565b905073ffffffffffffffffffffffffffffffffffffffff8116610201576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602560248201527f50726f78793a20696d706c656d656e746174696f6e206e6f7420696e6974696160448201527f6c697a656400000000000000000000000000000000000000000000000000000060648201526084015b60405180910390fd5b3660008037600080366000845af43d6000803e8061021e573d6000fd5b503d6000f35b7fb53127684a568b3173ae13b9f8a6016e243e63b6e8ee1178d6a717850b5d61035473ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff16148061027d575033155b1561028e5761028b816105a3565b50565b61028b61012d565b60606102c07fb53127684a568b3173ae13b9f8a6016e243e63b6e8ee1178d6a717850b5d61035490565b73ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff1614806102f7575033155b1561040a57610305846105a3565b6000808573ffffffffffffffffffffffffffffffffffffffff16858560405161032f9291906107ee565b600060405180830381855af49150503d806000811461036a576040519150601f19603f3d011682016040523d82523d6000602084013e61036f565b606091505b509150915081610401576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152603960248201527f50726f78793a2064656c656761746563616c6c20746f206e657720696d706c6560448201527f6d656e746174696f6e20636f6e7472616374206661696c65640000000000000060648201526084016101f8565b91506104129050565b61041261012d565b9392505050565b60006104437fb53127684a568b3173ae13b9f8a6016e243e63b6e8ee1178d6a717850b5d61035490565b73ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff16148061047a575033155b156104a557507f360894a13ba1a3210667c828492db98dca3e2076cc3735a920a3ca505d382bbc5490565b6104ad61012d565b90565b7fb53127684a568b3173ae13b9f8a6016e243e63b6e8ee1178d6a717850b5d61035473ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff161480610509575033155b1561028e5761028b8161060c565b60006105417fb53127684a568b3173ae13b9f8a6016e243e63b6e8ee1178d6a717850b5d61035490565b73ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff161480610578575033155b156104a557507fb53127684a568b3173ae13b9f8a6016e243e63b6e8ee1178d6a717850b5d61035490565b7f360894a13ba1a3210667c828492db98dca3e2076cc3735a920a3ca505d382bbc81815560405173ffffffffffffffffffffffffffffffffffffffff8316907fbc7cd75a20ee27fd9adebab32041f755214dbc6bffa90cc0225b39da2e5c2d3b90600090a25050565b60006106367fb53127684a568b3173ae13b9f8a6016e243e63b6e8ee1178d6a717850b5d61035490565b7fb53127684a568b3173ae13b9f8a6016e243e63b6e8ee1178d6a717850b5d61038381556040805173ffffffffffffffffffffffffffffffffffffffff80851682528616602082015292935090917f7e644d79422f17c01e4894b5f4f588d331ebfa28653d42ae832dc59e38c9798f910160405180910390a1505050565b803573ffffffffffffffffffffffffffffffffffffffff811681146106d857600080fd5b919050565b6000602082840312156106ef57600080fd5b610412826106b4565b60008060006040848603121561070d57600080fd5b610716846106b4565b9250602084013567ffffffffffffffff8082111561073357600080fd5b818601915086601f83011261074757600080fd5b81358181111561075657600080fd5b87602082850101111561076857600080fd5b6020830194508093505050509250925092565b600060208083528351808285015260005b818110156107a85785810183015185820160400152820161078c565b818111156107ba576000604083870101525b50601f017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe016929092016040019392505050565b818382376000910190815291905056fea164736f6c634300080f000a"; + bytes internal constant permissionedDelayedWETHProxyCode = + hex"60806040526004361061005e5760003560e01c80635c60da1b116100435780635c60da1b146100be5780638f283970146100f8578063f851a440146101185761006d565b80633659cfe6146100755780634f1ef286146100955761006d565b3661006d5761006b61012d565b005b61006b61012d565b34801561008157600080fd5b5061006b6100903660046106dd565b610224565b6100a86100a33660046106f8565b610296565b6040516100b5919061077b565b60405180910390f35b3480156100ca57600080fd5b506100d3610419565b60405173ffffffffffffffffffffffffffffffffffffffff90911681526020016100b5565b34801561010457600080fd5b5061006b6101133660046106dd565b6104b0565b34801561012457600080fd5b506100d3610517565b60006101577f360894a13ba1a3210667c828492db98dca3e2076cc3735a920a3ca505d382bbc5490565b905073ffffffffffffffffffffffffffffffffffffffff8116610201576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602560248201527f50726f78793a20696d706c656d656e746174696f6e206e6f7420696e6974696160448201527f6c697a656400000000000000000000000000000000000000000000000000000060648201526084015b60405180910390fd5b3660008037600080366000845af43d6000803e8061021e573d6000fd5b503d6000f35b7fb53127684a568b3173ae13b9f8a6016e243e63b6e8ee1178d6a717850b5d61035473ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff16148061027d575033155b1561028e5761028b816105a3565b50565b61028b61012d565b60606102c07fb53127684a568b3173ae13b9f8a6016e243e63b6e8ee1178d6a717850b5d61035490565b73ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff1614806102f7575033155b1561040a57610305846105a3565b6000808573ffffffffffffffffffffffffffffffffffffffff16858560405161032f9291906107ee565b600060405180830381855af49150503d806000811461036a576040519150601f19603f3d011682016040523d82523d6000602084013e61036f565b606091505b509150915081610401576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152603960248201527f50726f78793a2064656c656761746563616c6c20746f206e657720696d706c6560448201527f6d656e746174696f6e20636f6e7472616374206661696c65640000000000000060648201526084016101f8565b91506104129050565b61041261012d565b9392505050565b60006104437fb53127684a568b3173ae13b9f8a6016e243e63b6e8ee1178d6a717850b5d61035490565b73ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff16148061047a575033155b156104a557507f360894a13ba1a3210667c828492db98dca3e2076cc3735a920a3ca505d382bbc5490565b6104ad61012d565b90565b7fb53127684a568b3173ae13b9f8a6016e243e63b6e8ee1178d6a717850b5d61035473ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff161480610509575033155b1561028e5761028b8161060c565b60006105417fb53127684a568b3173ae13b9f8a6016e243e63b6e8ee1178d6a717850b5d61035490565b73ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff161480610578575033155b156104a557507fb53127684a568b3173ae13b9f8a6016e243e63b6e8ee1178d6a717850b5d61035490565b7f360894a13ba1a3210667c828492db98dca3e2076cc3735a920a3ca505d382bbc81815560405173ffffffffffffffffffffffffffffffffffffffff8316907fbc7cd75a20ee27fd9adebab32041f755214dbc6bffa90cc0225b39da2e5c2d3b90600090a25050565b60006106367fb53127684a568b3173ae13b9f8a6016e243e63b6e8ee1178d6a717850b5d61035490565b7fb53127684a568b3173ae13b9f8a6016e243e63b6e8ee1178d6a717850b5d61038381556040805173ffffffffffffffffffffffffffffffffffffffff80851682528616602082015292935090917f7e644d79422f17c01e4894b5f4f588d331ebfa28653d42ae832dc59e38c9798f910160405180910390a1505050565b803573ffffffffffffffffffffffffffffffffffffffff811681146106d857600080fd5b919050565b6000602082840312156106ef57600080fd5b610412826106b4565b60008060006040848603121561070d57600080fd5b610716846106b4565b9250602084013567ffffffffffffffff8082111561073357600080fd5b818601915086601f83011261074757600080fd5b81358181111561075657600080fd5b87602082850101111561076857600080fd5b6020830194508093505050509250925092565b600060208083528351808285015260005b818110156107a85785810183015185820160400152820161078c565b818111156107ba576000604083870101525b50601f017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe016929092016040019392505050565b818382376000910190815291905056fea164736f6c634300080f000a"; + bytes internal constant anchorStateRegistryProxyCode = + hex"60806040526004361061005e5760003560e01c80635c60da1b116100435780635c60da1b146100be5780638f283970146100f8578063f851a440146101185761006d565b80633659cfe6146100755780634f1ef286146100955761006d565b3661006d5761006b61012d565b005b61006b61012d565b34801561008157600080fd5b5061006b6100903660046106dd565b610224565b6100a86100a33660046106f8565b610296565b6040516100b5919061077b565b60405180910390f35b3480156100ca57600080fd5b506100d3610419565b60405173ffffffffffffffffffffffffffffffffffffffff90911681526020016100b5565b34801561010457600080fd5b5061006b6101133660046106dd565b6104b0565b34801561012457600080fd5b506100d3610517565b60006101577f360894a13ba1a3210667c828492db98dca3e2076cc3735a920a3ca505d382bbc5490565b905073ffffffffffffffffffffffffffffffffffffffff8116610201576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602560248201527f50726f78793a20696d706c656d656e746174696f6e206e6f7420696e6974696160448201527f6c697a656400000000000000000000000000000000000000000000000000000060648201526084015b60405180910390fd5b3660008037600080366000845af43d6000803e8061021e573d6000fd5b503d6000f35b7fb53127684a568b3173ae13b9f8a6016e243e63b6e8ee1178d6a717850b5d61035473ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff16148061027d575033155b1561028e5761028b816105a3565b50565b61028b61012d565b60606102c07fb53127684a568b3173ae13b9f8a6016e243e63b6e8ee1178d6a717850b5d61035490565b73ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff1614806102f7575033155b1561040a57610305846105a3565b6000808573ffffffffffffffffffffffffffffffffffffffff16858560405161032f9291906107ee565b600060405180830381855af49150503d806000811461036a576040519150601f19603f3d011682016040523d82523d6000602084013e61036f565b606091505b509150915081610401576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152603960248201527f50726f78793a2064656c656761746563616c6c20746f206e657720696d706c6560448201527f6d656e746174696f6e20636f6e7472616374206661696c65640000000000000060648201526084016101f8565b91506104129050565b61041261012d565b9392505050565b60006104437fb53127684a568b3173ae13b9f8a6016e243e63b6e8ee1178d6a717850b5d61035490565b73ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff16148061047a575033155b156104a557507f360894a13ba1a3210667c828492db98dca3e2076cc3735a920a3ca505d382bbc5490565b6104ad61012d565b90565b7fb53127684a568b3173ae13b9f8a6016e243e63b6e8ee1178d6a717850b5d61035473ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff161480610509575033155b1561028e5761028b8161060c565b60006105417fb53127684a568b3173ae13b9f8a6016e243e63b6e8ee1178d6a717850b5d61035490565b73ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff161480610578575033155b156104a557507fb53127684a568b3173ae13b9f8a6016e243e63b6e8ee1178d6a717850b5d61035490565b7f360894a13ba1a3210667c828492db98dca3e2076cc3735a920a3ca505d382bbc81815560405173ffffffffffffffffffffffffffffffffffffffff8316907fbc7cd75a20ee27fd9adebab32041f755214dbc6bffa90cc0225b39da2e5c2d3b90600090a25050565b60006106367fb53127684a568b3173ae13b9f8a6016e243e63b6e8ee1178d6a717850b5d61035490565b7fb53127684a568b3173ae13b9f8a6016e243e63b6e8ee1178d6a717850b5d61038381556040805173ffffffffffffffffffffffffffffffffffffffff80851682528616602082015292935090917f7e644d79422f17c01e4894b5f4f588d331ebfa28653d42ae832dc59e38c9798f910160405180910390a1505050565b803573ffffffffffffffffffffffffffffffffffffffff811681146106d857600080fd5b919050565b6000602082840312156106ef57600080fd5b610412826106b4565b60008060006040848603121561070d57600080fd5b610716846106b4565b9250602084013567ffffffffffffffff8082111561073357600080fd5b818601915086601f83011261074757600080fd5b81358181111561075657600080fd5b87602082850101111561076857600080fd5b6020830194508093505050509250925092565b600060208083528351808285015260005b818110156107a85785810183015185820160400152820161078c565b818111156107ba576000604083870101525b50601f017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe016929092016040019392505050565b818382376000910190815291905056fea164736f6c634300080f000a"; bytes internal constant l1CrossDomainMessengerCode = - hex"60806040526004361061018b5760003560e01c80636425666b116100d6578063b1b1b2091161007f578063d764ad0b11610059578063d764ad0b1461049b578063db505d80146104ae578063ecc70428146104db57600080fd5b8063b1b1b2091461042b578063b28ade251461045b578063c0c53b8b1461047b57600080fd5b80638cbeeef2116100b05780638cbeeef2146102d05780639fce812c146103d0578063a4e7f8bd146103fb57600080fd5b80636425666b146103775780636e296e45146103a457806383a74074146103b957600080fd5b80633dbb202b1161013857806354fd4d501161011257806354fd4d50146102e65780635644cfdf1461033c5780635c975abb1461035257600080fd5b80633dbb202b146102935780633f827a5a146102a85780634c1d6a69146102d057600080fd5b80632828d7e8116101695780632828d7e81461022457806333d7e2bd1461023957806335e80ab31461026657600080fd5b8063028f85f7146101905780630c568498146101c35780630ff754ea146101d8575b600080fd5b34801561019c57600080fd5b506101a5601081565b60405167ffffffffffffffff90911681526020015b60405180910390f35b3480156101cf57600080fd5b506101a5603f81565b3480156101e457600080fd5b5060fc5473ffffffffffffffffffffffffffffffffffffffff165b60405173ffffffffffffffffffffffffffffffffffffffff90911681526020016101ba565b34801561023057600080fd5b506101a5604081565b34801561024557600080fd5b5060fd546101ff9073ffffffffffffffffffffffffffffffffffffffff1681565b34801561027257600080fd5b5060fb546101ff9073ffffffffffffffffffffffffffffffffffffffff1681565b6102a66102a1366004611bdf565b610540565b005b3480156102b457600080fd5b506102bd600181565b60405161ffff90911681526020016101ba565b3480156102dc57600080fd5b506101a5619c4081565b3480156102f257600080fd5b5061032f6040518060400160405280600581526020017f322e342e3000000000000000000000000000000000000000000000000000000081525081565b6040516101ba9190611cb1565b34801561034857600080fd5b506101a561138881565b34801561035e57600080fd5b5061036761083d565b60405190151581526020016101ba565b34801561038357600080fd5b5060fc546101ff9073ffffffffffffffffffffffffffffffffffffffff1681565b3480156103b057600080fd5b506101ff6108d6565b3480156103c557600080fd5b506101a562030d4081565b3480156103dc57600080fd5b5060cf5473ffffffffffffffffffffffffffffffffffffffff166101ff565b34801561040757600080fd5b50610367610416366004611ccb565b60ce6020526000908152604090205460ff1681565b34801561043757600080fd5b50610367610446366004611ccb565b60cb6020526000908152604090205460ff1681565b34801561046757600080fd5b506101a5610476366004611ce4565b6109bd565b34801561048757600080fd5b506102a6610496366004611d38565b610a2b565b6102a66104a9366004611d83565b610ca2565b3480156104ba57600080fd5b5060cf546101ff9073ffffffffffffffffffffffffffffffffffffffff1681565b3480156104e757600080fd5b5061053260cd547dffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff167e010000000000000000000000000000000000000000000000000000000000001790565b6040519081526020016101ba565b6105486115d3565b156105e05734156105e0576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152603d60248201527f43726f7373446f6d61696e4d657373656e6765723a2063616e6e6f742073656e60448201527f642076616c7565207769746820637573746f6d2067617320746f6b656e00000060648201526084015b60405180910390fd5b60cf546107129073ffffffffffffffffffffffffffffffffffffffff166106088585856109bd565b347fd764ad0b0000000000000000000000000000000000000000000000000000000061067460cd547dffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff167e010000000000000000000000000000000000000000000000000000000000001790565b338a34898c8c6040516024016106909796959493929190611e52565b604080517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe08184030181529190526020810180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff167fffffffff0000000000000000000000000000000000000000000000000000000090931692909217909152611612565b8373ffffffffffffffffffffffffffffffffffffffff167fcb0f7ffd78f9aee47a248fae8db181db6eee833039123e026dcbff529522e52a33858561079760cd547dffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff167e010000000000000000000000000000000000000000000000000000000000001790565b866040516107a9959493929190611eb1565b60405180910390a260405134815233907f8ebb2ec2465bdb2a06a66fc37a0963af8a2a6a1479d81d56fdb8cbb98096d5469060200160405180910390a2505060cd80547dffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff808216600101167fffff0000000000000000000000000000000000000000000000000000000000009091161790555050565b60fb54604080517f5c975abb000000000000000000000000000000000000000000000000000000008152905160009273ffffffffffffffffffffffffffffffffffffffff1691635c975abb9160048083019260209291908290030181865afa1580156108ad573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906108d19190611eff565b905090565b60cc5460009073ffffffffffffffffffffffffffffffffffffffff167fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff2153016109a0576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152603560248201527f43726f7373446f6d61696e4d657373656e6765723a2078446f6d61696e4d657360448201527f7361676553656e646572206973206e6f7420736574000000000000000000000060648201526084016105d7565b5060cc5473ffffffffffffffffffffffffffffffffffffffff1690565b6000611388619c4080603f6109d9604063ffffffff8816611f50565b6109e39190611f80565b6109ee601088611f50565b6109fb9062030d40611fce565b610a059190611fce565b610a0f9190611fce565b610a199190611fce565b610a239190611fce565b949350505050565b6000547501000000000000000000000000000000000000000000900460ff1615808015610a76575060005460017401000000000000000000000000000000000000000090910460ff16105b80610aa85750303b158015610aa8575060005474010000000000000000000000000000000000000000900460ff166001145b610b34576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602e60248201527f496e697469616c697a61626c653a20636f6e747261637420697320616c72656160448201527f647920696e697469616c697a656400000000000000000000000000000000000060648201526084016105d7565b600080547fffffffffffffffffffffff00ffffffffffffffffffffffffffffffffffffffff16740100000000000000000000000000000000000000001790558015610bba57600080547fffffffffffffffffffff00ffffffffffffffffffffffffffffffffffffffffff1675010000000000000000000000000000000000000000001790555b60fb805473ffffffffffffffffffffffffffffffffffffffff8087167fffffffffffffffffffffffff00000000000000000000000000000000000000009283161790925560fc805486841690831617905560fd805492851692909116919091179055610c397342000000000000000000000000000000000000076116ab565b8015610c9c57600080547fffffffffffffffffffff00ffffffffffffffffffffffffffffffffffffffffff169055604051600181527f7f26b83ff96e1f2b6a682f133852f6798a09c465da95921460cefb38474024989060200160405180910390a15b50505050565b610caa61083d565b15610d11576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601c60248201527f43726f7373446f6d61696e4d657373656e6765723a207061757365640000000060448201526064016105d7565b60f087901c60028110610dcc576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152604d60248201527f43726f7373446f6d61696e4d657373656e6765723a206f6e6c7920766572736960448201527f6f6e2030206f722031206d657373616765732061726520737570706f7274656460648201527f20617420746869732074696d6500000000000000000000000000000000000000608482015260a4016105d7565b8061ffff16600003610ec1576000610e1d878986868080601f0160208091040260200160405190810160405280939291908181526020018383808284376000920191909152508f92506117e7915050565b600081815260cb602052604090205490915060ff1615610ebf576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152603760248201527f43726f7373446f6d61696e4d657373656e6765723a206c65676163792077697460448201527f6864726177616c20616c72656164792072656c6179656400000000000000000060648201526084016105d7565b505b6000610f07898989898989898080601f01602080910402602001604051908101604052809392919081815260200183838082843760009201919091525061180692505050565b9050610f11611829565b15610f4957853414610f2557610f25611ffa565b600081815260ce602052604090205460ff1615610f4457610f44611ffa565b61109b565b3415610ffd576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152605060248201527f43726f7373446f6d61696e4d657373656e6765723a2076616c7565206d75737460448201527f206265207a65726f20756e6c657373206d6573736167652069732066726f6d2060648201527f612073797374656d206164647265737300000000000000000000000000000000608482015260a4016105d7565b600081815260ce602052604090205460ff1661109b576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152603060248201527f43726f7373446f6d61696e4d657373656e6765723a206d65737361676520636160448201527f6e6e6f74206265207265706c617965640000000000000000000000000000000060648201526084016105d7565b6110a487611905565b15611157576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152604360248201527f43726f7373446f6d61696e4d657373656e6765723a2063616e6e6f742073656e60448201527f64206d65737361676520746f20626c6f636b65642073797374656d206164647260648201527f6573730000000000000000000000000000000000000000000000000000000000608482015260a4016105d7565b600081815260cb602052604090205460ff16156111f6576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152603660248201527f43726f7373446f6d61696e4d657373656e6765723a206d65737361676520686160448201527f7320616c7265616479206265656e2072656c617965640000000000000000000060648201526084016105d7565b61121785611208611388619c40611fce565b67ffffffffffffffff1661194b565b158061123d575060cc5473ffffffffffffffffffffffffffffffffffffffff1661dead14155b1561135657600081815260ce602052604080822080547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff001660011790555182917f99d0e048484baa1b1540b1367cb128acd7ab2946d1ed91ec10e3c85e4bf51b8f91a27fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff320161134f576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602d60248201527f43726f7373446f6d61696e4d657373656e6765723a206661696c656420746f2060448201527f72656c6179206d6573736167650000000000000000000000000000000000000060648201526084016105d7565b50506115ae565b60cc80547fffffffffffffffffffffffff00000000000000000000000000000000000000001673ffffffffffffffffffffffffffffffffffffffff8a1617905560006113e788619c405a6113aa9190612029565b8988888080601f01602080910402602001604051908101604052809392919081815260200183838082843760009201919091525061196992505050565b60cc80547fffffffffffffffffffffffff00000000000000000000000000000000000000001661dead1790559050801561149d57600082815260cb602052604090205460ff161561143a5761143a611ffa565b600082815260cb602052604080822080547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff001660011790555183917f4641df4a962071e12719d8c8c8e5ac7fc4d97b927346a3d7a335b1f7517e133c91a26115aa565b600082815260ce602052604080822080547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff001660011790555183917f99d0e048484baa1b1540b1367cb128acd7ab2946d1ed91ec10e3c85e4bf51b8f91a27fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff32016115aa576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602d60248201527f43726f7373446f6d61696e4d657373656e6765723a206661696c656420746f2060448201527f72656c6179206d6573736167650000000000000000000000000000000000000060648201526084016105d7565b5050505b50505050505050565b73ffffffffffffffffffffffffffffffffffffffff163b151590565b6000806115de611983565b5073ffffffffffffffffffffffffffffffffffffffff1673eeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeee141592915050565b60fc546040517fe9e05c4200000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff9091169063e9e05c42908490611673908890839089906000908990600401612040565b6000604051808303818588803b15801561168c57600080fd5b505af11580156116a0573d6000803e3d6000fd5b505050505050505050565b6000547501000000000000000000000000000000000000000000900460ff16611756576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602b60248201527f496e697469616c697a61626c653a20636f6e7472616374206973206e6f74206960448201527f6e697469616c697a696e6700000000000000000000000000000000000000000060648201526084016105d7565b60cc5473ffffffffffffffffffffffffffffffffffffffff166117a05760cc80547fffffffffffffffffffffffff00000000000000000000000000000000000000001661dead1790555b60cf80547fffffffffffffffffffffffff00000000000000000000000000000000000000001673ffffffffffffffffffffffffffffffffffffffff92909216919091179055565b60006117f585858585611a20565b805190602001209050949350505050565b6000611816878787878787611ab9565b8051906020012090509695505050505050565b60fc5460009073ffffffffffffffffffffffffffffffffffffffff16331480156108d1575060cf5460fc54604080517f9bf62d82000000000000000000000000000000000000000000000000000000008152905173ffffffffffffffffffffffffffffffffffffffff9384169390921691639bf62d82916004808201926020929091908290030181865afa1580156118c5573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906118e99190612098565b73ffffffffffffffffffffffffffffffffffffffff1614905090565b600073ffffffffffffffffffffffffffffffffffffffff8216301480611945575060fc5473ffffffffffffffffffffffffffffffffffffffff8381169116145b92915050565b600080603f83619c4001026040850201603f5a021015949350505050565b600080600080845160208601878a8af19695505050505050565b60fd54604080517f4397dfef0000000000000000000000000000000000000000000000000000000081528151600093849373ffffffffffffffffffffffffffffffffffffffff90911692634397dfef92600480830193928290030181865afa1580156119f3573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611a1791906120b5565b90939092509050565b606084848484604051602401611a3994939291906120f5565b604080517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe08184030181529190526020810180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff167fcbd4ece9000000000000000000000000000000000000000000000000000000001790529050949350505050565b6060868686868686604051602401611ad69695949392919061213f565b604080517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe08184030181529190526020810180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff167fd764ad0b0000000000000000000000000000000000000000000000000000000017905290509695505050505050565b73ffffffffffffffffffffffffffffffffffffffff81168114611b7a57600080fd5b50565b60008083601f840112611b8f57600080fd5b50813567ffffffffffffffff811115611ba757600080fd5b602083019150836020828501011115611bbf57600080fd5b9250929050565b803563ffffffff81168114611bda57600080fd5b919050565b60008060008060608587031215611bf557600080fd5b8435611c0081611b58565b9350602085013567ffffffffffffffff811115611c1c57600080fd5b611c2887828801611b7d565b9094509250611c3b905060408601611bc6565b905092959194509250565b6000815180845260005b81811015611c6c57602081850181015186830182015201611c50565b81811115611c7e576000602083870101525b50601f017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0169290920160200192915050565b602081526000611cc46020830184611c46565b9392505050565b600060208284031215611cdd57600080fd5b5035919050565b600080600060408486031215611cf957600080fd5b833567ffffffffffffffff811115611d1057600080fd5b611d1c86828701611b7d565b9094509250611d2f905060208501611bc6565b90509250925092565b600080600060608486031215611d4d57600080fd5b8335611d5881611b58565b92506020840135611d6881611b58565b91506040840135611d7881611b58565b809150509250925092565b600080600080600080600060c0888a031215611d9e57600080fd5b873596506020880135611db081611b58565b95506040880135611dc081611b58565b9450606088013593506080880135925060a088013567ffffffffffffffff811115611dea57600080fd5b611df68a828b01611b7d565b989b979a50959850939692959293505050565b8183528181602085013750600060208284010152600060207fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0601f840116840101905092915050565b878152600073ffffffffffffffffffffffffffffffffffffffff808916602084015280881660408401525085606083015263ffffffff8516608083015260c060a0830152611ea460c083018486611e09565b9998505050505050505050565b73ffffffffffffffffffffffffffffffffffffffff86168152608060208201526000611ee1608083018688611e09565b905083604083015263ffffffff831660608301529695505050505050565b600060208284031215611f1157600080fd5b81518015158114611cc457600080fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b600067ffffffffffffffff80831681851681830481118215151615611f7757611f77611f21565b02949350505050565b600067ffffffffffffffff80841680611fc2577f4e487b7100000000000000000000000000000000000000000000000000000000600052601260045260246000fd5b92169190910492915050565b600067ffffffffffffffff808316818516808303821115611ff157611ff1611f21565b01949350505050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052600160045260246000fd5b60008282101561203b5761203b611f21565b500390565b73ffffffffffffffffffffffffffffffffffffffff8616815284602082015267ffffffffffffffff84166040820152821515606082015260a06080820152600061208d60a0830184611c46565b979650505050505050565b6000602082840312156120aa57600080fd5b8151611cc481611b58565b600080604083850312156120c857600080fd5b82516120d381611b58565b602084015190925060ff811681146120ea57600080fd5b809150509250929050565b600073ffffffffffffffffffffffffffffffffffffffff80871683528086166020840152506080604083015261212e6080830185611c46565b905082606083015295945050505050565b868152600073ffffffffffffffffffffffffffffffffffffffff808816602084015280871660408401525084606083015283608083015260c060a083015261218a60c0830184611c46565b9897505050505050505056fea164736f6c634300080f000a"; + hex"60806040526004361061018b5760003560e01c80636425666b116100d6578063b1b1b2091161007f578063d764ad0b11610059578063d764ad0b1461049b578063db505d80146104ae578063ecc70428146104db57600080fd5b8063b1b1b2091461042b578063b28ade251461045b578063c0c53b8b1461047b57600080fd5b80638cbeeef2116100b05780638cbeeef2146102d05780639fce812c146103d0578063a4e7f8bd146103fb57600080fd5b80636425666b146103775780636e296e45146103a457806383a74074146103b957600080fd5b80633dbb202b1161013857806354fd4d501161011257806354fd4d50146102e65780635644cfdf1461033c5780635c975abb1461035257600080fd5b80633dbb202b146102935780633f827a5a146102a85780634c1d6a69146102d057600080fd5b80632828d7e8116101695780632828d7e81461022457806333d7e2bd1461023957806335e80ab31461026657600080fd5b8063028f85f7146101905780630c568498146101c35780630ff754ea146101d8575b600080fd5b34801561019c57600080fd5b506101a5601081565b60405167ffffffffffffffff90911681526020015b60405180910390f35b3480156101cf57600080fd5b506101a5603f81565b3480156101e457600080fd5b5060fc5473ffffffffffffffffffffffffffffffffffffffff165b60405173ffffffffffffffffffffffffffffffffffffffff90911681526020016101ba565b34801561023057600080fd5b506101a5604081565b34801561024557600080fd5b5060fd546101ff9073ffffffffffffffffffffffffffffffffffffffff1681565b34801561027257600080fd5b5060fb546101ff9073ffffffffffffffffffffffffffffffffffffffff1681565b6102a66102a1366004611bdd565b610540565b005b3480156102b457600080fd5b506102bd600181565b60405161ffff90911681526020016101ba565b3480156102dc57600080fd5b506101a5619c4081565b3480156102f257600080fd5b5061032f6040518060400160405280600c81526020017f322e342e312d626574612e31000000000000000000000000000000000000000081525081565b6040516101ba9190611caf565b34801561034857600080fd5b506101a561138881565b34801561035e57600080fd5b5061036761083d565b60405190151581526020016101ba565b34801561038357600080fd5b5060fc546101ff9073ffffffffffffffffffffffffffffffffffffffff1681565b3480156103b057600080fd5b506101ff6108d6565b3480156103c557600080fd5b506101a562030d4081565b3480156103dc57600080fd5b5060cf5473ffffffffffffffffffffffffffffffffffffffff166101ff565b34801561040757600080fd5b50610367610416366004611cc9565b60ce6020526000908152604090205460ff1681565b34801561043757600080fd5b50610367610446366004611cc9565b60cb6020526000908152604090205460ff1681565b34801561046757600080fd5b506101a5610476366004611ce2565b6109bd565b34801561048757600080fd5b506102a6610496366004611d36565b610a2b565b6102a66104a9366004611d81565b610ca2565b3480156104ba57600080fd5b5060cf546101ff9073ffffffffffffffffffffffffffffffffffffffff1681565b3480156104e757600080fd5b5061053260cd547dffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff167e010000000000000000000000000000000000000000000000000000000000001790565b6040519081526020016101ba565b6105486115d3565b156105e05734156105e0576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152603d60248201527f43726f7373446f6d61696e4d657373656e6765723a2063616e6e6f742073656e60448201527f642076616c7565207769746820637573746f6d2067617320746f6b656e00000060648201526084015b60405180910390fd5b60cf546107129073ffffffffffffffffffffffffffffffffffffffff166106088585856109bd565b347fd764ad0b0000000000000000000000000000000000000000000000000000000061067460cd547dffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff167e010000000000000000000000000000000000000000000000000000000000001790565b338a34898c8c6040516024016106909796959493929190611e50565b604080517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe08184030181529190526020810180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff167fffffffff0000000000000000000000000000000000000000000000000000000090931692909217909152611612565b8373ffffffffffffffffffffffffffffffffffffffff167fcb0f7ffd78f9aee47a248fae8db181db6eee833039123e026dcbff529522e52a33858561079760cd547dffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff167e010000000000000000000000000000000000000000000000000000000000001790565b866040516107a9959493929190611eaf565b60405180910390a260405134815233907f8ebb2ec2465bdb2a06a66fc37a0963af8a2a6a1479d81d56fdb8cbb98096d5469060200160405180910390a2505060cd80547dffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff808216600101167fffff0000000000000000000000000000000000000000000000000000000000009091161790555050565b60fb54604080517f5c975abb000000000000000000000000000000000000000000000000000000008152905160009273ffffffffffffffffffffffffffffffffffffffff1691635c975abb9160048083019260209291908290030181865afa1580156108ad573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906108d19190611efd565b905090565b60cc5460009073ffffffffffffffffffffffffffffffffffffffff167fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff2153016109a0576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152603560248201527f43726f7373446f6d61696e4d657373656e6765723a2078446f6d61696e4d657360448201527f7361676553656e646572206973206e6f7420736574000000000000000000000060648201526084016105d7565b5060cc5473ffffffffffffffffffffffffffffffffffffffff1690565b6000611388619c4080603f6109d9604063ffffffff8816611f4e565b6109e39190611f7e565b6109ee601088611f4e565b6109fb9062030d40611fcc565b610a059190611fcc565b610a0f9190611fcc565b610a199190611fcc565b610a239190611fcc565b949350505050565b6000547501000000000000000000000000000000000000000000900460ff1615808015610a76575060005460017401000000000000000000000000000000000000000090910460ff16105b80610aa85750303b158015610aa8575060005474010000000000000000000000000000000000000000900460ff166001145b610b34576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602e60248201527f496e697469616c697a61626c653a20636f6e747261637420697320616c72656160448201527f647920696e697469616c697a656400000000000000000000000000000000000060648201526084016105d7565b600080547fffffffffffffffffffffff00ffffffffffffffffffffffffffffffffffffffff16740100000000000000000000000000000000000000001790558015610bba57600080547fffffffffffffffffffff00ffffffffffffffffffffffffffffffffffffffffff1675010000000000000000000000000000000000000000001790555b60fb805473ffffffffffffffffffffffffffffffffffffffff8087167fffffffffffffffffffffffff00000000000000000000000000000000000000009283161790925560fc805486841690831617905560fd805492851692909116919091179055610c397342000000000000000000000000000000000000076116ab565b8015610c9c57600080547fffffffffffffffffffff00ffffffffffffffffffffffffffffffffffffffffff169055604051600181527f7f26b83ff96e1f2b6a682f133852f6798a09c465da95921460cefb38474024989060200160405180910390a15b50505050565b610caa61083d565b15610d11576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601c60248201527f43726f7373446f6d61696e4d657373656e6765723a207061757365640000000060448201526064016105d7565b60f087901c60028110610dcc576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152604d60248201527f43726f7373446f6d61696e4d657373656e6765723a206f6e6c7920766572736960448201527f6f6e2030206f722031206d657373616765732061726520737570706f7274656460648201527f20617420746869732074696d6500000000000000000000000000000000000000608482015260a4016105d7565b8061ffff16600003610ec1576000610e1d878986868080601f0160208091040260200160405190810160405280939291908181526020018383808284376000920191909152508f92506117e7915050565b600081815260cb602052604090205490915060ff1615610ebf576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152603760248201527f43726f7373446f6d61696e4d657373656e6765723a206c65676163792077697460448201527f6864726177616c20616c72656164792072656c6179656400000000000000000060648201526084016105d7565b505b6000610f07898989898989898080601f01602080910402602001604051908101604052809392919081815260200183838082843760009201919091525061180692505050565b9050610f11611829565b15610f4957853414610f2557610f25611ff8565b600081815260ce602052604090205460ff1615610f4457610f44611ff8565b61109b565b3415610ffd576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152605060248201527f43726f7373446f6d61696e4d657373656e6765723a2076616c7565206d75737460448201527f206265207a65726f20756e6c657373206d6573736167652069732066726f6d2060648201527f612073797374656d206164647265737300000000000000000000000000000000608482015260a4016105d7565b600081815260ce602052604090205460ff1661109b576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152603060248201527f43726f7373446f6d61696e4d657373656e6765723a206d65737361676520636160448201527f6e6e6f74206265207265706c617965640000000000000000000000000000000060648201526084016105d7565b6110a487611905565b15611157576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152604360248201527f43726f7373446f6d61696e4d657373656e6765723a2063616e6e6f742073656e60448201527f64206d65737361676520746f20626c6f636b65642073797374656d206164647260648201527f6573730000000000000000000000000000000000000000000000000000000000608482015260a4016105d7565b600081815260cb602052604090205460ff16156111f6576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152603660248201527f43726f7373446f6d61696e4d657373656e6765723a206d65737361676520686160448201527f7320616c7265616479206265656e2072656c617965640000000000000000000060648201526084016105d7565b61121785611208611388619c40611fcc565b67ffffffffffffffff1661194b565b158061123d575060cc5473ffffffffffffffffffffffffffffffffffffffff1661dead14155b1561135657600081815260ce602052604080822080547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff001660011790555182917f99d0e048484baa1b1540b1367cb128acd7ab2946d1ed91ec10e3c85e4bf51b8f91a27fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff320161134f576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602d60248201527f43726f7373446f6d61696e4d657373656e6765723a206661696c656420746f2060448201527f72656c6179206d6573736167650000000000000000000000000000000000000060648201526084016105d7565b50506115ae565b60cc80547fffffffffffffffffffffffff00000000000000000000000000000000000000001673ffffffffffffffffffffffffffffffffffffffff8a1617905560006113e788619c405a6113aa9190612027565b8988888080601f01602080910402602001604051908101604052809392919081815260200183838082843760009201919091525061196992505050565b60cc80547fffffffffffffffffffffffff00000000000000000000000000000000000000001661dead1790559050801561149d57600082815260cb602052604090205460ff161561143a5761143a611ff8565b600082815260cb602052604080822080547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff001660011790555183917f4641df4a962071e12719d8c8c8e5ac7fc4d97b927346a3d7a335b1f7517e133c91a26115aa565b600082815260ce602052604080822080547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff001660011790555183917f99d0e048484baa1b1540b1367cb128acd7ab2946d1ed91ec10e3c85e4bf51b8f91a27fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff32016115aa576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602d60248201527f43726f7373446f6d61696e4d657373656e6765723a206661696c656420746f2060448201527f72656c6179206d6573736167650000000000000000000000000000000000000060648201526084016105d7565b5050505b50505050505050565b73ffffffffffffffffffffffffffffffffffffffff163b151590565b6000806115de611981565b5073ffffffffffffffffffffffffffffffffffffffff1673eeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeee141592915050565b60fc546040517fe9e05c4200000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff9091169063e9e05c4290849061167390889083908990600090899060040161203e565b6000604051808303818588803b15801561168c57600080fd5b505af11580156116a0573d6000803e3d6000fd5b505050505050505050565b6000547501000000000000000000000000000000000000000000900460ff16611756576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602b60248201527f496e697469616c697a61626c653a20636f6e7472616374206973206e6f74206960448201527f6e697469616c697a696e6700000000000000000000000000000000000000000060648201526084016105d7565b60cc5473ffffffffffffffffffffffffffffffffffffffff166117a05760cc80547fffffffffffffffffffffffff00000000000000000000000000000000000000001661dead1790555b60cf80547fffffffffffffffffffffffff00000000000000000000000000000000000000001673ffffffffffffffffffffffffffffffffffffffff92909216919091179055565b60006117f585858585611a1e565b805190602001209050949350505050565b6000611816878787878787611ab7565b8051906020012090509695505050505050565b60fc5460009073ffffffffffffffffffffffffffffffffffffffff16331480156108d1575060cf5460fc54604080517f9bf62d82000000000000000000000000000000000000000000000000000000008152905173ffffffffffffffffffffffffffffffffffffffff9384169390921691639bf62d82916004808201926020929091908290030181865afa1580156118c5573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906118e99190612096565b73ffffffffffffffffffffffffffffffffffffffff1614905090565b600073ffffffffffffffffffffffffffffffffffffffff8216301480611945575060fc5473ffffffffffffffffffffffffffffffffffffffff8381169116145b92915050565b600080603f83619c4001026040850201603f5a021015949350505050565b6000806000835160208501868989f195945050505050565b60fd54604080517f4397dfef0000000000000000000000000000000000000000000000000000000081528151600093849373ffffffffffffffffffffffffffffffffffffffff90911692634397dfef92600480830193928290030181865afa1580156119f1573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611a1591906120b3565b90939092509050565b606084848484604051602401611a3794939291906120f3565b604080517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe08184030181529190526020810180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff167fcbd4ece9000000000000000000000000000000000000000000000000000000001790529050949350505050565b6060868686868686604051602401611ad49695949392919061213d565b604080517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe08184030181529190526020810180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff167fd764ad0b0000000000000000000000000000000000000000000000000000000017905290509695505050505050565b73ffffffffffffffffffffffffffffffffffffffff81168114611b7857600080fd5b50565b60008083601f840112611b8d57600080fd5b50813567ffffffffffffffff811115611ba557600080fd5b602083019150836020828501011115611bbd57600080fd5b9250929050565b803563ffffffff81168114611bd857600080fd5b919050565b60008060008060608587031215611bf357600080fd5b8435611bfe81611b56565b9350602085013567ffffffffffffffff811115611c1a57600080fd5b611c2687828801611b7b565b9094509250611c39905060408601611bc4565b905092959194509250565b6000815180845260005b81811015611c6a57602081850181015186830182015201611c4e565b81811115611c7c576000602083870101525b50601f017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0169290920160200192915050565b602081526000611cc26020830184611c44565b9392505050565b600060208284031215611cdb57600080fd5b5035919050565b600080600060408486031215611cf757600080fd5b833567ffffffffffffffff811115611d0e57600080fd5b611d1a86828701611b7b565b9094509250611d2d905060208501611bc4565b90509250925092565b600080600060608486031215611d4b57600080fd5b8335611d5681611b56565b92506020840135611d6681611b56565b91506040840135611d7681611b56565b809150509250925092565b600080600080600080600060c0888a031215611d9c57600080fd5b873596506020880135611dae81611b56565b95506040880135611dbe81611b56565b9450606088013593506080880135925060a088013567ffffffffffffffff811115611de857600080fd5b611df48a828b01611b7b565b989b979a50959850939692959293505050565b8183528181602085013750600060208284010152600060207fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0601f840116840101905092915050565b878152600073ffffffffffffffffffffffffffffffffffffffff808916602084015280881660408401525085606083015263ffffffff8516608083015260c060a0830152611ea260c083018486611e07565b9998505050505050505050565b73ffffffffffffffffffffffffffffffffffffffff86168152608060208201526000611edf608083018688611e07565b905083604083015263ffffffff831660608301529695505050505050565b600060208284031215611f0f57600080fd5b81518015158114611cc257600080fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b600067ffffffffffffffff80831681851681830481118215151615611f7557611f75611f1f565b02949350505050565b600067ffffffffffffffff80841680611fc0577f4e487b7100000000000000000000000000000000000000000000000000000000600052601260045260246000fd5b92169190910492915050565b600067ffffffffffffffff808316818516808303821115611fef57611fef611f1f565b01949350505050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052600160045260246000fd5b60008282101561203957612039611f1f565b500390565b73ffffffffffffffffffffffffffffffffffffffff8616815284602082015267ffffffffffffffff84166040820152821515606082015260a06080820152600061208b60a0830184611c44565b979650505050505050565b6000602082840312156120a857600080fd5b8151611cc281611b56565b600080604083850312156120c657600080fd5b82516120d181611b56565b602084015190925060ff811681146120e857600080fd5b809150509250929050565b600073ffffffffffffffffffffffffffffffffffffffff80871683528086166020840152506080604083015261212c6080830185611c44565b905082606083015295945050505050565b868152600073ffffffffffffffffffffffffffffffffffffffff808816602084015280871660408401525084606083015283608083015260c060a083015261218860c0830184611c44565b9897505050505050505056fea164736f6c634300080f000a"; + bytes internal constant optimismMintableERC20FactoryCode = + hex"60806040523480156200001157600080fd5b5060043610620000935760003560e01c8063c4d66de81162000062578063c4d66de81462000175578063ce5ac90f146200018e578063e78cea9214620001a5578063ee9a31a214620001c657600080fd5b8063316b3739146200009857806354fd4d5014620000fb578063896f93d114620001475780638cf0629c146200015e575b600080fd5b620000d1620000a936600462000652565b60026020526000908152604090205473ffffffffffffffffffffffffffffffffffffffff1681565b60405173ffffffffffffffffffffffffffffffffffffffff90911681526020015b60405180910390f35b620001386040518060400160405280600d81526020017f312e31302e312d626574612e310000000000000000000000000000000000000081525081565b604051620000f29190620006e5565b620000d162000158366004620007dc565b620001e5565b620000d16200016f36600462000859565b620001fc565b6200018c6200018636600462000652565b6200041b565b005b620000d16200019f366004620007dc565b620005ed565b600154620000d19073ffffffffffffffffffffffffffffffffffffffff1681565b60015473ffffffffffffffffffffffffffffffffffffffff16620000d1565b6000620001f4848484620005ed565b949350505050565b600073ffffffffffffffffffffffffffffffffffffffff8516620002a7576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152603f60248201527f4f7074696d69736d4d696e7461626c654552433230466163746f72793a206d7560448201527f73742070726f766964652072656d6f746520746f6b656e20616464726573730060648201526084015b60405180910390fd5b600085858585604051602001620002c29493929190620008f0565b604051602081830303815290604052805190602001209050600081600160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff168888888860405162000312906200061a565b620003229594939291906200094a565b8190604051809103906000f590508015801562000343573d6000803e3d6000fd5b5073ffffffffffffffffffffffffffffffffffffffff81811660008181526002602052604080822080547fffffffffffffffffffffffff000000000000000000000000000000000000000016948d1694851790555193945090927fceeb8e7d520d7f3b65fc11a262b91066940193b05d4f93df07cfdced0eb551cf9190a360405133815273ffffffffffffffffffffffffffffffffffffffff80891691908316907f52fe89dd5930f343d25650b62fd367bae47088bcddffd2a88350a6ecdd620cdb9060200160405180910390a39695505050505050565b600054610100900460ff16158080156200043c5750600054600160ff909116105b80620004585750303b15801562000458575060005460ff166001145b620004e6576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602e60248201527f496e697469616c697a61626c653a20636f6e747261637420697320616c72656160448201527f647920696e697469616c697a656400000000000000000000000000000000000060648201526084016200029e565b600080547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0016600117905580156200054557600080547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00ff166101001790555b600180547fffffffffffffffffffffffff00000000000000000000000000000000000000001673ffffffffffffffffffffffffffffffffffffffff84161790558015620005e957600080547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00ff169055604051600181527f7f26b83ff96e1f2b6a682f133852f6798a09c465da95921460cefb38474024989060200160405180910390a15b5050565b6000620001f48484846012620001fc565b73ffffffffffffffffffffffffffffffffffffffff163b151590565b61178a80620009b083390190565b803573ffffffffffffffffffffffffffffffffffffffff811681146200064d57600080fd5b919050565b6000602082840312156200066557600080fd5b620006708262000628565b9392505050565b6000815180845260005b818110156200069f5760208185018101518683018201520162000681565b81811115620006b2576000602083870101525b50601f017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0169290920160200192915050565b60208152600062000670602083018462000677565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b600082601f8301126200073b57600080fd5b813567ffffffffffffffff80821115620007595762000759620006fa565b604051601f83017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0908116603f01168101908282118183101715620007a257620007a2620006fa565b81604052838152866020858801011115620007bc57600080fd5b836020870160208301376000602085830101528094505050505092915050565b600080600060608486031215620007f257600080fd5b620007fd8462000628565b9250602084013567ffffffffffffffff808211156200081b57600080fd5b620008298783880162000729565b935060408601359150808211156200084057600080fd5b506200084f8682870162000729565b9150509250925092565b600080600080608085870312156200087057600080fd5b6200087b8562000628565b9350602085013567ffffffffffffffff808211156200089957600080fd5b620008a78883890162000729565b94506040870135915080821115620008be57600080fd5b50620008cd8782880162000729565b925050606085013560ff81168114620008e557600080fd5b939692955090935050565b73ffffffffffffffffffffffffffffffffffffffff8516815260806020820152600062000921608083018662000677565b828103604084015262000935818662000677565b91505060ff8316606083015295945050505050565b600073ffffffffffffffffffffffffffffffffffffffff808816835280871660208401525060a060408301526200098560a083018662000677565b828103606084015262000999818662000677565b91505060ff83166080830152969550505050505056fe60e06040523480156200001157600080fd5b506040516200178a3803806200178a833981016040819052620000349162000163565b828260036200004483826200029e565b5060046200005382826200029e565b5050506001600160a01b039384166080529390921660a052505060ff1660c0526200036a565b80516001600160a01b03811681146200009157600080fd5b919050565b634e487b7160e01b600052604160045260246000fd5b600082601f830112620000be57600080fd5b81516001600160401b0380821115620000db57620000db62000096565b604051601f8301601f19908116603f0116810190828211818310171562000106576200010662000096565b816040528381526020925086838588010111156200012357600080fd5b600091505b8382101562000147578582018301518183018401529082019062000128565b83821115620001595760008385830101525b9695505050505050565b600080600080600060a086880312156200017c57600080fd5b620001878662000079565b9450620001976020870162000079565b60408701519094506001600160401b0380821115620001b557600080fd5b620001c389838a01620000ac565b94506060880151915080821115620001da57600080fd5b50620001e988828901620000ac565b925050608086015160ff811681146200020157600080fd5b809150509295509295909350565b600181811c908216806200022457607f821691505b6020821081036200024557634e487b7160e01b600052602260045260246000fd5b50919050565b601f8211156200029957600081815260208120601f850160051c81016020861015620002745750805b601f850160051c820191505b81811015620002955782815560010162000280565b5050505b505050565b81516001600160401b03811115620002ba57620002ba62000096565b620002d281620002cb84546200020f565b846200024b565b602080601f8311600181146200030a5760008415620002f15750858301515b600019600386901b1c1916600185901b17855562000295565b600085815260208120601f198616915b828110156200033b578886015182559484019460019091019084016200031a565b50858210156200035a5787850151600019600388901b60f8161c191681555b5050505050600190811b01905550565b60805160a05160c0516113d4620003b6600039600061024401526000818161034b015281816103e001528181610625015261075c0152600081816101a9015261037101526113d46000f3fe608060405234801561001057600080fd5b50600436106101775760003560e01c806370a08231116100d8578063ae1f6aaf1161008c578063dd62ed3e11610066578063dd62ed3e14610395578063e78cea9214610349578063ee9a31a2146103db57600080fd5b8063ae1f6aaf14610349578063c01e1bd61461036f578063d6c0b2c41461036f57600080fd5b80639dc29fac116100bd5780639dc29fac14610310578063a457c2d714610323578063a9059cbb1461033657600080fd5b806370a08231146102d257806395d89b411461030857600080fd5b806323b872dd1161012f5780633950935111610114578063395093511461026e57806340c10f191461028157806354fd4d501461029657600080fd5b806323b872dd1461022a578063313ce5671461023d57600080fd5b806306fdde031161016057806306fdde03146101f0578063095ea7b31461020557806318160ddd1461021857600080fd5b806301ffc9a71461017c578063033964be146101a4575b600080fd5b61018f61018a36600461117d565b610402565b60405190151581526020015b60405180910390f35b6101cb7f000000000000000000000000000000000000000000000000000000000000000081565b60405173ffffffffffffffffffffffffffffffffffffffff909116815260200161019b565b6101f86104f3565b60405161019b91906111c6565b61018f610213366004611262565b610585565b6002545b60405190815260200161019b565b61018f61023836600461128c565b61059d565b60405160ff7f000000000000000000000000000000000000000000000000000000000000000016815260200161019b565b61018f61027c366004611262565b6105c1565b61029461028f366004611262565b61060d565b005b6101f86040518060400160405280600c81526020017f312e332e312d626574612e31000000000000000000000000000000000000000081525081565b61021c6102e03660046112c8565b73ffffffffffffffffffffffffffffffffffffffff1660009081526020819052604090205490565b6101f8610735565b61029461031e366004611262565b610744565b61018f610331366004611262565b61085b565b61018f610344366004611262565b61092c565b7f00000000000000000000000000000000000000000000000000000000000000006101cb565b7f00000000000000000000000000000000000000000000000000000000000000006101cb565b61021c6103a33660046112e3565b73ffffffffffffffffffffffffffffffffffffffff918216600090815260016020908152604080832093909416825291909152205490565b6101cb7f000000000000000000000000000000000000000000000000000000000000000081565b60007f01ffc9a7000000000000000000000000000000000000000000000000000000007f1d1d8b63000000000000000000000000000000000000000000000000000000007fec4fc8e3000000000000000000000000000000000000000000000000000000007fffffffff0000000000000000000000000000000000000000000000000000000085168314806104bb57507fffffffff00000000000000000000000000000000000000000000000000000000858116908316145b806104ea57507fffffffff00000000000000000000000000000000000000000000000000000000858116908216145b95945050505050565b60606003805461050290611316565b80601f016020809104026020016040519081016040528092919081815260200182805461052e90611316565b801561057b5780601f106105505761010080835404028352916020019161057b565b820191906000526020600020905b81548152906001019060200180831161055e57829003601f168201915b5050505050905090565b60003361059381858561093a565b5060019392505050565b6000336105ab858285610aee565b6105b6858585610bc5565b506001949350505050565b33600081815260016020908152604080832073ffffffffffffffffffffffffffffffffffffffff871684529091528120549091906105939082908690610608908790611398565b61093a565b3373ffffffffffffffffffffffffffffffffffffffff7f000000000000000000000000000000000000000000000000000000000000000016146106d7576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152603460248201527f4f7074696d69736d4d696e7461626c6545524332303a206f6e6c79206272696460448201527f67652063616e206d696e7420616e64206275726e00000000000000000000000060648201526084015b60405180910390fd5b6106e18282610e78565b8173ffffffffffffffffffffffffffffffffffffffff167f0f6798a560793a54c3bcfe86a93cde1e73087d944c0ea20544137d41213968858260405161072991815260200190565b60405180910390a25050565b60606004805461050290611316565b3373ffffffffffffffffffffffffffffffffffffffff7f00000000000000000000000000000000000000000000000000000000000000001614610809576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152603460248201527f4f7074696d69736d4d696e7461626c6545524332303a206f6e6c79206272696460448201527f67652063616e206d696e7420616e64206275726e00000000000000000000000060648201526084016106ce565b6108138282610f98565b8173ffffffffffffffffffffffffffffffffffffffff167fcc16f5dbb4873280815c1ee09dbd06736cffcc184412cf7a71a0fdb75d397ca58260405161072991815260200190565b33600081815260016020908152604080832073ffffffffffffffffffffffffffffffffffffffff871684529091528120549091908381101561091f576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602560248201527f45524332303a2064656372656173656420616c6c6f77616e63652062656c6f7760448201527f207a65726f00000000000000000000000000000000000000000000000000000060648201526084016106ce565b6105b6828686840361093a565b600033610593818585610bc5565b73ffffffffffffffffffffffffffffffffffffffff83166109dc576040517f08c379a0000000000000000000000000000000000000000000000000000000008152602060048201526024808201527f45524332303a20617070726f76652066726f6d20746865207a65726f2061646460448201527f726573730000000000000000000000000000000000000000000000000000000060648201526084016106ce565b73ffffffffffffffffffffffffffffffffffffffff8216610a7f576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602260248201527f45524332303a20617070726f766520746f20746865207a65726f20616464726560448201527f737300000000000000000000000000000000000000000000000000000000000060648201526084016106ce565b73ffffffffffffffffffffffffffffffffffffffff83811660008181526001602090815260408083209487168084529482529182902085905590518481527f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92591015b60405180910390a3505050565b73ffffffffffffffffffffffffffffffffffffffff8381166000908152600160209081526040808320938616835292905220547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff8114610bbf5781811015610bb2576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601d60248201527f45524332303a20696e73756666696369656e7420616c6c6f77616e636500000060448201526064016106ce565b610bbf848484840361093a565b50505050565b73ffffffffffffffffffffffffffffffffffffffff8316610c68576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602560248201527f45524332303a207472616e736665722066726f6d20746865207a65726f20616460448201527f647265737300000000000000000000000000000000000000000000000000000060648201526084016106ce565b73ffffffffffffffffffffffffffffffffffffffff8216610d0b576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602360248201527f45524332303a207472616e7366657220746f20746865207a65726f206164647260448201527f657373000000000000000000000000000000000000000000000000000000000060648201526084016106ce565b73ffffffffffffffffffffffffffffffffffffffff831660009081526020819052604090205481811015610dc1576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602660248201527f45524332303a207472616e7366657220616d6f756e742065786365656473206260448201527f616c616e6365000000000000000000000000000000000000000000000000000060648201526084016106ce565b73ffffffffffffffffffffffffffffffffffffffff808516600090815260208190526040808220858503905591851681529081208054849290610e05908490611398565b925050819055508273ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef84604051610e6b91815260200190565b60405180910390a3610bbf565b73ffffffffffffffffffffffffffffffffffffffff8216610ef5576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601f60248201527f45524332303a206d696e7420746f20746865207a65726f20616464726573730060448201526064016106ce565b8060026000828254610f079190611398565b909155505073ffffffffffffffffffffffffffffffffffffffff821660009081526020819052604081208054839290610f41908490611398565b909155505060405181815273ffffffffffffffffffffffffffffffffffffffff8316906000907fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef9060200160405180910390a35050565b73ffffffffffffffffffffffffffffffffffffffff821661103b576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602160248201527f45524332303a206275726e2066726f6d20746865207a65726f2061646472657360448201527f730000000000000000000000000000000000000000000000000000000000000060648201526084016106ce565b73ffffffffffffffffffffffffffffffffffffffff8216600090815260208190526040902054818110156110f1576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602260248201527f45524332303a206275726e20616d6f756e7420657863656564732062616c616e60448201527f636500000000000000000000000000000000000000000000000000000000000060648201526084016106ce565b73ffffffffffffffffffffffffffffffffffffffff8316600090815260208190526040812083830390556002805484929061112d9084906113b0565b909155505060405182815260009073ffffffffffffffffffffffffffffffffffffffff8516907fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef90602001610ae1565b60006020828403121561118f57600080fd5b81357fffffffff00000000000000000000000000000000000000000000000000000000811681146111bf57600080fd5b9392505050565b600060208083528351808285015260005b818110156111f3578581018301518582016040015282016111d7565b81811115611205576000604083870101525b50601f017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe016929092016040019392505050565b803573ffffffffffffffffffffffffffffffffffffffff8116811461125d57600080fd5b919050565b6000806040838503121561127557600080fd5b61127e83611239565b946020939093013593505050565b6000806000606084860312156112a157600080fd5b6112aa84611239565b92506112b860208501611239565b9150604084013590509250925092565b6000602082840312156112da57600080fd5b6111bf82611239565b600080604083850312156112f657600080fd5b6112ff83611239565b915061130d60208401611239565b90509250929050565b600181811c9082168061132a57607f821691505b602082108103611363577f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b50919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b600082198211156113ab576113ab611369565b500190565b6000828210156113c2576113c2611369565b50039056fea164736f6c634300080f000aa164736f6c634300080f000a"; bytes internal constant systemConfigCode = - hex"608060405234801561001057600080fd5b50600436106102de5760003560e01c8063a711986911610186578063e0e2016d116100e3578063f2fde38b11610097578063f8c68de011610071578063f8c68de0146106e9578063fd32aa0f146106f1578063ffa1ad74146106f957600080fd5b8063f2fde38b146106b9578063f45e65d8146106cc578063f68016b7146106d557600080fd5b8063e81b2c6d116100c8578063e81b2c6d14610688578063ec70751714610691578063f2b4e617146106b157600080fd5b8063e0e2016d14610678578063e2a3285c1461068057600080fd5b8063c9b26f611161013a578063d84447151161011f578063d844471514610655578063dac6e63a1461065d578063db9040fa1461066557600080fd5b8063c9b26f611461050e578063cc731b021461052157600080fd5b8063bc49ce5f1161016b578063bc49ce5f146104cd578063bfb14fb7146104d5578063c4e8ddfa1461050657600080fd5b8063a7119869146104b2578063b40a817c146104ba57600080fd5b80634397dfef1161023f578063550fcdc9116101f35780638da5cb5b116101cd5780638da5cb5b14610479578063935f029e146104975780639b7d7f0a146104aa57600080fd5b8063550fcdc9146104615780635d73369c14610469578063715018a61461047157600080fd5b80634add321d116102245780634add321d146103e95780634f16540b146103f157806354fd4d501461041857600080fd5b80634397dfef146103ab57806348cd4cb1146103e157600080fd5b806318d13918116102965780631fd19ee11161027b5780631fd19ee114610378578063213268491461038057806321d7fde51461039857600080fd5b806318d139181461035b57806319f5cea81461037057600080fd5b80630a49cb03116102c75780630a49cb031461032b5780630ae14b1b146103335780630c18c1621461035257600080fd5b806306c92657146102e3578063078f29cf146102fe575b600080fd5b6102eb610701565b6040519081526020015b60405180910390f35b61030661072f565b60405173ffffffffffffffffffffffffffffffffffffffff90911681526020016102f5565b610306610768565b630bebc2005b60405167ffffffffffffffff90911681526020016102f5565b6102eb60655481565b61036e610369366004612248565b610798565b005b6102eb6107ac565b6103066107d7565b610388610801565b60405190151581526020016102f5565b61036e6103a636600461227e565b610840565b6103b3610856565b6040805173ffffffffffffffffffffffffffffffffffffffff909316835260ff9091166020830152016102f5565b6102eb61086a565b61033961089a565b6102eb7f65a7ed542fb37fe237fdfbdd70b31598523fe5b32879e307bae27a0bd9581c0881565b6104546040518060400160405280600c81526020017f322e332e302d626574612e31000000000000000000000000000000000000000081525081565b6040516102f59190612327565b6104546108c0565b6102eb6108ca565b61036e6108f5565b60335473ffffffffffffffffffffffffffffffffffffffff16610306565b61036e6104a536600461233a565b610909565b61030661091b565b61030661094b565b61036e6104c8366004612374565b61097b565b6102eb61098c565b6068546104f19068010000000000000000900463ffffffff1681565b60405163ffffffff90911681526020016102f5565b6103066109b7565b61036e61051c36600461238f565b6109e7565b6105e56040805160c081018252600080825260208201819052918101829052606081018290526080810182905260a0810191909152506040805160c08101825260695463ffffffff8082168352640100000000820460ff9081166020850152650100000000008304169383019390935266010000000000008104831660608301526a0100000000000000000000810490921660808201526e0100000000000000000000000000009091046fffffffffffffffffffffffffffffffff1660a082015290565b6040516102f59190600060c08201905063ffffffff80845116835260ff602085015116602084015260ff6040850151166040840152806060850151166060840152806080850151166080840152506fffffffffffffffffffffffffffffffff60a08401511660a083015292915050565b6104546109f8565b610306610a02565b61036e6106733660046124c2565b610a32565b6102eb610e3d565b6102eb610e68565b6102eb60675481565b6068546104f1906c01000000000000000000000000900463ffffffff1681565b610306610e93565b61036e6106c7366004612248565b610ec3565b6102eb60665481565b6068546103399067ffffffffffffffff1681565b6102eb610f77565b6102eb610fa2565b6102eb600081565b61072c60017fa04c5bb938ca6fc46d95553abf0a76345ce3e722a30bf4f74928b8e7d852320d612644565b81565b600061076361075f60017f9904ba90dde5696cda05c9e0dab5cbaa0fea005ace4d11218a02ac668dad6377612644565b5490565b905090565b600061076361075f60017f4b6c74f9e688cb39801f2112c14a8c57232a3fc5202e1444126d4bce86eb19ad612644565b6107a0611208565b6107a981611289565b50565b61072c60017f46adcbebc6be8ce551740c29c47c8798210f23f7f4086c41752944352568d5a8612644565b60006107637f65a7ed542fb37fe237fdfbdd70b31598523fe5b32879e307bae27a0bd9581c085490565b60008061080c610856565b5073ffffffffffffffffffffffffffffffffffffffff1673eeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeee141592915050565b610848611208565b6108528282611346565b5050565b60008061086161118b565b90939092509050565b600061076361075f60017fa11ee3ab75b40e88a0105e935d17cd36c8faee0138320d776c411291bdbbb1a0612644565b6069546000906107639063ffffffff6a010000000000000000000082048116911661265b565b6060610763611484565b61072c60017f383f291819e6d54073bc9a648251d97421076bdd101933c0c022219ce9580637612644565b6108fd611208565b6109076000611545565b565b610911611208565b61085282826115bc565b600061076361075f60017fa04c5bb938ca6fc46d95553abf0a76345ce3e722a30bf4f74928b8e7d852320d612644565b600061076361075f60017f383f291819e6d54073bc9a648251d97421076bdd101933c0c022219ce9580637612644565b610983611208565b6107a981611692565b61072c60017f71ac12829d66ee73d8d95bff50b3589745ce57edae70a3fb111a2342464dc598612644565b600061076361075f60017f46adcbebc6be8ce551740c29c47c8798210f23f7f4086c41752944352568d5a8612644565b6109ef611208565b6107a9816117e8565b6060610763611810565b600061076361075f60017f71ac12829d66ee73d8d95bff50b3589745ce57edae70a3fb111a2342464dc598612644565b600054610100900460ff1615808015610a525750600054600160ff909116105b80610a6c5750303b158015610a6c575060005460ff166001145b610afd576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602e60248201527f496e697469616c697a61626c653a20636f6e747261637420697320616c72656160448201527f647920696e697469616c697a656400000000000000000000000000000000000060648201526084015b60405180910390fd5b600080547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff001660011790558015610b5b57600080547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00ff166101001790555b610b636118c6565b610b6c8a610ec3565b610b75876117e8565b610b7f8989611346565b610b8886611692565b610bb17f65a7ed542fb37fe237fdfbdd70b31598523fe5b32879e307bae27a0bd9581c08869055565b610be4610bdf60017f71ac12829d66ee73d8d95bff50b3589745ce57edae70a3fb111a2342464dc598612644565b849055565b610c18610c1260017f383f291819e6d54073bc9a648251d97421076bdd101933c0c022219ce9580637612644565b83519055565b610c4f610c4660017f46adcbebc6be8ce551740c29c47c8798210f23f7f4086c41752944352568d5a8612644565b60208401519055565b610c86610c7d60017f9904ba90dde5696cda05c9e0dab5cbaa0fea005ace4d11218a02ac668dad6377612644565b60408401519055565b610cbd610cb460017f52322a25d9f59ea17656545543306b7aef62bc0cc53a0e65ccfa0c75b97aa907612644565b60608401519055565b610cf4610ceb60017f4b6c74f9e688cb39801f2112c14a8c57232a3fc5202e1444126d4bce86eb19ad612644565b60808401519055565b610d2b610d2260017fa04c5bb938ca6fc46d95553abf0a76345ce3e722a30bf4f74928b8e7d852320d612644565b60a08401519055565b610d33611965565b610d408260c001516119cd565b610d4984611cd7565b610d5161089a565b67ffffffffffffffff168667ffffffffffffffff161015610dce576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601f60248201527f53797374656d436f6e6669673a20676173206c696d697420746f6f206c6f77006044820152606401610af4565b8015610e3157600080547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00ff169055604051600181527f7f26b83ff96e1f2b6a682f133852f6798a09c465da95921460cefb38474024989060200160405180910390a15b50505050505050505050565b61072c60017fa11ee3ab75b40e88a0105e935d17cd36c8faee0138320d776c411291bdbbb1a0612644565b61072c60017f52322a25d9f59ea17656545543306b7aef62bc0cc53a0e65ccfa0c75b97aa907612644565b600061076361075f60017f52322a25d9f59ea17656545543306b7aef62bc0cc53a0e65ccfa0c75b97aa907612644565b610ecb611208565b73ffffffffffffffffffffffffffffffffffffffff8116610f6e576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602660248201527f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160448201527f64647265737300000000000000000000000000000000000000000000000000006064820152608401610af4565b6107a981611545565b61072c60017f9904ba90dde5696cda05c9e0dab5cbaa0fea005ace4d11218a02ac668dad6377612644565b61072c60017f4b6c74f9e688cb39801f2112c14a8c57232a3fc5202e1444126d4bce86eb19ad612644565b9055565b73ffffffffffffffffffffffffffffffffffffffff163b151590565b6000602082511115611081576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152603660248201527f476173506179696e67546f6b656e3a20737472696e672063616e6e6f7420626560448201527f2067726561746572207468616e203332206279746573000000000000000000006064820152608401610af4565b61108a82611162565b92915050565b6110f66110be60017f04adb1412b2ddc16fcc0d4538d5c8f07cf9c83abecc6b41f6f69037b708fbcec612644565b74ff000000000000000000000000000000000000000060a086901b1673ffffffffffffffffffffffffffffffffffffffff8716179055565b61112961112460017f657c3582c29b3176614e3a33ddd1ec48352696a04e92b3c0566d72010fa8863d612644565b839055565b61115c61115760017fa48b38a4b44951360fbdcbfaaeae5ed6ae92585412e9841b70ec72ed8cd05764612644565b829055565b50505050565b80516021811061117a5763ec92f9a36000526004601cfd5b9081015160209190910360031b1b90565b600080806111bd61075f60017f04adb1412b2ddc16fcc0d4538d5c8f07cf9c83abecc6b41f6f69037b708fbcec612644565b73ffffffffffffffffffffffffffffffffffffffff811693509050826111fc575073eeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeee92601292509050565b60a081901c9150509091565b60335473ffffffffffffffffffffffffffffffffffffffff163314610907576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e65726044820152606401610af4565b6112b27f65a7ed542fb37fe237fdfbdd70b31598523fe5b32879e307bae27a0bd9581c08829055565b6040805173ffffffffffffffffffffffffffffffffffffffff8316602082015260009101604080517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0818403018152919052905060035b60007f1d2b0bda21d56b8bd12d4f94ebacffdfb35f5e226f84b461103bb8beab6353be8360405161133a9190612327565b60405180910390a35050565b606880547fffffffffffffffffffffffffffffffff0000000000000000ffffffffffffffff166801000000000000000063ffffffff8581169182027fffffffffffffffffffffffffffffffff00000000ffffffffffffffffffffffff16929092176c0100000000000000000000000092851692909202919091179091557f0100000000000000000000000000000000000000000000000000000000000000602083811b67ffffffff000000001690921717606681905560655460408051938401919091528201526000906060015b604080517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe08184030181529190529050600160007f1d2b0bda21d56b8bd12d4f94ebacffdfb35f5e226f84b461103bb8beab6353be836040516114779190612327565b60405180910390a3505050565b6060600061149061118b565b5090507fffffffffffffffffffffffff111111111111111111111111111111111111111273ffffffffffffffffffffffffffffffffffffffff82160161150957505060408051808201909152600381527f4554480000000000000000000000000000000000000000000000000000000000602082015290565b61153f61153a61075f60017fa48b38a4b44951360fbdcbfaaeae5ed6ae92585412e9841b70ec72ed8cd05764612644565b61214b565b91505090565b6033805473ffffffffffffffffffffffffffffffffffffffff8381167fffffffffffffffffffffffff0000000000000000000000000000000000000000831681179093556040519116919082907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e090600090a35050565b7fff0000000000000000000000000000000000000000000000000000000000000081161561166c576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602160248201527f53797374656d436f6e6669673a207363616c61722065786365656473206d617860448201527f2e000000000000000000000000000000000000000000000000000000000000006064820152608401610af4565b606582905560668190556040805160208101849052908101829052600090606001611414565b61169a61089a565b67ffffffffffffffff168167ffffffffffffffff161015611717576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601f60248201527f53797374656d436f6e6669673a20676173206c696d697420746f6f206c6f77006044820152606401610af4565b630bebc20067ffffffffffffffff8216111561178f576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820181905260248201527f53797374656d436f6e6669673a20676173206c696d697420746f6f20686967686044820152606401610af4565b606880547fffffffffffffffffffffffffffffffffffffffffffffffff00000000000000001667ffffffffffffffff83169081179091556040805160208082019390935281518082039093018352810190526002611309565b6067819055604080516020808201849052825180830390910181529082019091526000611309565b6060600061181c61118b565b5090507fffffffffffffffffffffffff111111111111111111111111111111111111111273ffffffffffffffffffffffffffffffffffffffff82160161189557505060408051808201909152600581527f4574686572000000000000000000000000000000000000000000000000000000602082015290565b61153f61153a61075f60017f657c3582c29b3176614e3a33ddd1ec48352696a04e92b3c0566d72010fa8863d612644565b600054610100900460ff1661195d576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602b60248201527f496e697469616c697a61626c653a20636f6e7472616374206973206e6f74206960448201527f6e697469616c697a696e670000000000000000000000000000000000000000006064820152608401610af4565b61090761217f565b61199361075f60017fa11ee3ab75b40e88a0105e935d17cd36c8faee0138320d776c411291bdbbb1a0612644565b600003610907576109076119c860017fa11ee3ab75b40e88a0105e935d17cd36c8faee0138320d776c411291bdbbb1a0612644565b439055565b73ffffffffffffffffffffffffffffffffffffffff811615801590611a1c575073ffffffffffffffffffffffffffffffffffffffff811673eeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeee14155b8015611a2d5750611a2b610801565b155b156107a957601260ff168173ffffffffffffffffffffffffffffffffffffffff1663313ce5676040518163ffffffff1660e01b8152600401602060405180830381865afa158015611a82573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611aa69190612687565b60ff1614611b36576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602e60248201527f53797374656d436f6e6669673a2062616420646563696d616c73206f6620676160448201527f7320706179696e6720746f6b656e0000000000000000000000000000000000006064820152608401610af4565b6000611bd18273ffffffffffffffffffffffffffffffffffffffff166306fdde036040518163ffffffff1660e01b8152600401600060405180830381865afa158015611b86573d6000803e3d6000fd5b505050506040513d6000823e601f3d9081017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0168201604052611bcc91908101906126a4565b610fed565b90506000611c238373ffffffffffffffffffffffffffffffffffffffff166395d89b416040518163ffffffff1660e01b8152600401600060405180830381865afa158015611b86573d6000803e3d6000fd5b9050611c328360128484611090565b611c3a610768565b6040517f71cfaa3f00000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff858116600483015260126024830152604482018590526064820184905291909116906371cfaa3f90608401600060405180830381600087803b158015611cba57600080fd5b505af1158015611cce573d6000803e3d6000fd5b50505050505050565b8060a001516fffffffffffffffffffffffffffffffff16816060015163ffffffff161115611d87576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152603560248201527f53797374656d436f6e6669673a206d696e206261736520666565206d7573742060448201527f6265206c657373207468616e206d6178206261736500000000000000000000006064820152608401610af4565b6001816040015160ff1611611e1e576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602f60248201527f53797374656d436f6e6669673a2064656e6f6d696e61746f72206d757374206260448201527f65206c6172676572207468616e203100000000000000000000000000000000006064820152608401610af4565b6068546080820151825167ffffffffffffffff90921691611e3f919061276f565b63ffffffff161115611ead576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601f60248201527f53797374656d436f6e6669673a20676173206c696d697420746f6f206c6f77006044820152606401610af4565b6000816020015160ff1611611f44576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602f60248201527f53797374656d436f6e6669673a20656c6173746963697479206d756c7469706c60448201527f6965722063616e6e6f74206265203000000000000000000000000000000000006064820152608401610af4565b8051602082015163ffffffff82169160ff90911690611f6490829061278e565b611f6e91906127d8565b63ffffffff1614612001576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152603760248201527f53797374656d436f6e6669673a20707265636973696f6e206c6f73732077697460448201527f6820746172676574207265736f75726365206c696d69740000000000000000006064820152608401610af4565b805160698054602084015160408501516060860151608087015160a09097015163ffffffff9687167fffffffffffffffffffffffffffffffffffffffffffffffffffffff00000000009095169490941764010000000060ff94851602177fffffffffffffffffffffffffffffffffffffffffffff0000000000ffffffffff166501000000000093909216929092027fffffffffffffffffffffffffffffffffffffffffffff00000000ffffffffffff1617660100000000000091851691909102177fffff0000000000000000000000000000000000000000ffffffffffffffffffff166a010000000000000000000093909416929092027fffff00000000000000000000000000000000ffffffffffffffffffffffffffff16929092176e0100000000000000000000000000006fffffffffffffffffffffffffffffffff90921691909102179055565b60405160005b82811a1561216157600101612151565b80825260208201838152600082820152505060408101604052919050565b600054610100900460ff16612216576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602b60248201527f496e697469616c697a61626c653a20636f6e7472616374206973206e6f74206960448201527f6e697469616c697a696e670000000000000000000000000000000000000000006064820152608401610af4565b61090733611545565b803573ffffffffffffffffffffffffffffffffffffffff8116811461224357600080fd5b919050565b60006020828403121561225a57600080fd5b6122638261221f565b9392505050565b803563ffffffff8116811461224357600080fd5b6000806040838503121561229157600080fd5b61229a8361226a565b91506122a86020840161226a565b90509250929050565b60005b838110156122cc5781810151838201526020016122b4565b8381111561115c5750506000910152565b600081518084526122f58160208601602086016122b1565b601f017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0169290920160200192915050565b60208152600061226360208301846122dd565b6000806040838503121561234d57600080fd5b50508035926020909101359150565b803567ffffffffffffffff8116811461224357600080fd5b60006020828403121561238657600080fd5b6122638261235c565b6000602082840312156123a157600080fd5b5035919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b60405160c0810167ffffffffffffffff811182821017156123fa576123fa6123a8565b60405290565b60ff811681146107a957600080fd5b600060e0828403121561242157600080fd5b60405160e0810181811067ffffffffffffffff82111715612444576124446123a8565b6040529050806124538361221f565b81526124616020840161221f565b60208201526124726040840161221f565b60408201526124836060840161221f565b60608201526124946080840161221f565b60808201526124a560a0840161221f565b60a08201526124b660c0840161221f565b60c08201525092915050565b6000806000806000806000806000898b036102808112156124e257600080fd5b6124eb8b61221f565b99506124f960208c0161226a565b985061250760408c0161226a565b975060608b0135965061251c60808c0161235c565b955061252a60a08c0161221f565b945060c07fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff408201121561255c57600080fd5b506125656123d7565b61257160c08c0161226a565b815260e08b013561258181612400565b60208201526101008b013561259581612400565b60408201526125a76101208c0161226a565b60608201526125b96101408c0161226a565b60808201526101608b01356fffffffffffffffffffffffffffffffff811681146125e257600080fd5b60a082015292506125f66101808b0161221f565b91506126068b6101a08c0161240f565b90509295985092959850929598565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b60008282101561265657612656612615565b500390565b600067ffffffffffffffff80831681851680830382111561267e5761267e612615565b01949350505050565b60006020828403121561269957600080fd5b815161226381612400565b6000602082840312156126b657600080fd5b815167ffffffffffffffff808211156126ce57600080fd5b818401915084601f8301126126e257600080fd5b8151818111156126f4576126f46123a8565b604051601f82017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0908116603f0116810190838211818310171561273a5761273a6123a8565b8160405282815287602084870101111561275357600080fd5b6127648360208301602088016122b1565b979650505050505050565b600063ffffffff80831681851680830382111561267e5761267e612615565b600063ffffffff808416806127cc577f4e487b7100000000000000000000000000000000000000000000000000000000600052601260045260246000fd5b92169190910492915050565b600063ffffffff808316818516818304811182151516156127fb576127fb612615565b0294935050505056fea164736f6c634300080f000a"; + hex"608060405234801561001057600080fd5b50600436106102de5760003560e01c8063a711986911610186578063e0e2016d116100e3578063f2fde38b11610097578063f8c68de011610071578063f8c68de0146106e2578063fd32aa0f146106ea578063ffa1ad74146106f257600080fd5b8063f2fde38b146106b2578063f45e65d8146106c5578063f68016b7146106ce57600080fd5b8063e81b2c6d116100c8578063e81b2c6d14610681578063ec7075171461068a578063f2b4e617146106aa57600080fd5b8063e0e2016d14610671578063e2a3285c1461067957600080fd5b8063c9b26f611161013a578063d84447151161011f578063d84447151461064e578063dac6e63a14610656578063db9040fa1461065e57600080fd5b8063c9b26f6114610507578063cc731b021461051a57600080fd5b8063bc49ce5f1161016b578063bc49ce5f146104c6578063bfb14fb7146104ce578063c4e8ddfa146104ff57600080fd5b8063a7119869146104ab578063b40a817c146104b357600080fd5b80634397dfef1161023f578063550fcdc9116101f35780638da5cb5b116101cd5780638da5cb5b14610472578063935f029e146104905780639b7d7f0a146104a357600080fd5b8063550fcdc91461045a5780635d73369c14610462578063715018a61461046a57600080fd5b80634add321d116102245780634add321d146103e95780634f16540b146103f157806354fd4d501461041857600080fd5b80634397dfef146103ab57806348cd4cb1146103e157600080fd5b806318d13918116102965780631fd19ee11161027b5780631fd19ee114610378578063213268491461038057806321d7fde51461039857600080fd5b806318d139181461035b57806319f5cea81461037057600080fd5b80630a49cb03116102c75780630a49cb031461032b5780630ae14b1b146103335780630c18c1621461035257600080fd5b806306c92657146102e3578063078f29cf146102fe575b600080fd5b6102eb6106fa565b6040519081526020015b60405180910390f35b610306610728565b60405173ffffffffffffffffffffffffffffffffffffffff90911681526020016102f5565b610306610761565b630bebc2005b60405167ffffffffffffffff90911681526020016102f5565b6102eb60655481565b61036e610369366004612241565b610791565b005b6102eb6107a5565b6103066107d0565b6103886107fa565b60405190151581526020016102f5565b61036e6103a6366004612277565b610839565b6103b361084f565b6040805173ffffffffffffffffffffffffffffffffffffffff909316835260ff9091166020830152016102f5565b6102eb610863565b610339610893565b6102eb7f65a7ed542fb37fe237fdfbdd70b31598523fe5b32879e307bae27a0bd9581c0881565b60408051808201909152600c81527f322e332e302d626574612e33000000000000000000000000000000000000000060208201525b6040516102f59190612320565b61044d6108b9565b6102eb6108c3565b61036e6108ee565b60335473ffffffffffffffffffffffffffffffffffffffff16610306565b61036e61049e366004612333565b610902565b610306610914565b610306610944565b61036e6104c136600461236d565b610974565b6102eb610985565b6068546104ea9068010000000000000000900463ffffffff1681565b60405163ffffffff90911681526020016102f5565b6103066109b0565b61036e610515366004612388565b6109e0565b6105de6040805160c081018252600080825260208201819052918101829052606081018290526080810182905260a0810191909152506040805160c08101825260695463ffffffff8082168352640100000000820460ff9081166020850152650100000000008304169383019390935266010000000000008104831660608301526a0100000000000000000000810490921660808201526e0100000000000000000000000000009091046fffffffffffffffffffffffffffffffff1660a082015290565b6040516102f59190600060c08201905063ffffffff80845116835260ff602085015116602084015260ff6040850151166040840152806060850151166060840152806080850151166080840152506fffffffffffffffffffffffffffffffff60a08401511660a083015292915050565b61044d6109f1565b6103066109fb565b61036e61066c3660046124bb565b610a2b565b6102eb610e36565b6102eb610e61565b6102eb60675481565b6068546104ea906c01000000000000000000000000900463ffffffff1681565b610306610e8c565b61036e6106c0366004612241565b610ebc565b6102eb60665481565b6068546103399067ffffffffffffffff1681565b6102eb610f70565b6102eb610f9b565b6102eb600081565b61072560017fa04c5bb938ca6fc46d95553abf0a76345ce3e722a30bf4f74928b8e7d852320d61263d565b81565b600061075c61075860017f9904ba90dde5696cda05c9e0dab5cbaa0fea005ace4d11218a02ac668dad637761263d565b5490565b905090565b600061075c61075860017f4b6c74f9e688cb39801f2112c14a8c57232a3fc5202e1444126d4bce86eb19ad61263d565b610799611201565b6107a281611282565b50565b61072560017f46adcbebc6be8ce551740c29c47c8798210f23f7f4086c41752944352568d5a861263d565b600061075c7f65a7ed542fb37fe237fdfbdd70b31598523fe5b32879e307bae27a0bd9581c085490565b60008061080561084f565b5073ffffffffffffffffffffffffffffffffffffffff1673eeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeee141592915050565b610841611201565b61084b828261133f565b5050565b60008061085a611184565b90939092509050565b600061075c61075860017fa11ee3ab75b40e88a0105e935d17cd36c8faee0138320d776c411291bdbbb1a061263d565b60695460009061075c9063ffffffff6a0100000000000000000000820481169116612654565b606061075c61147d565b61072560017f383f291819e6d54073bc9a648251d97421076bdd101933c0c022219ce958063761263d565b6108f6611201565b610900600061153e565b565b61090a611201565b61084b82826115b5565b600061075c61075860017fa04c5bb938ca6fc46d95553abf0a76345ce3e722a30bf4f74928b8e7d852320d61263d565b600061075c61075860017f383f291819e6d54073bc9a648251d97421076bdd101933c0c022219ce958063761263d565b61097c611201565b6107a28161168b565b61072560017f71ac12829d66ee73d8d95bff50b3589745ce57edae70a3fb111a2342464dc59861263d565b600061075c61075860017f46adcbebc6be8ce551740c29c47c8798210f23f7f4086c41752944352568d5a861263d565b6109e8611201565b6107a2816117e1565b606061075c611809565b600061075c61075860017f71ac12829d66ee73d8d95bff50b3589745ce57edae70a3fb111a2342464dc59861263d565b600054610100900460ff1615808015610a4b5750600054600160ff909116105b80610a655750303b158015610a65575060005460ff166001145b610af6576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602e60248201527f496e697469616c697a61626c653a20636f6e747261637420697320616c72656160448201527f647920696e697469616c697a656400000000000000000000000000000000000060648201526084015b60405180910390fd5b600080547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff001660011790558015610b5457600080547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00ff166101001790555b610b5c6118bf565b610b658a610ebc565b610b6e876117e1565b610b78898961133f565b610b818661168b565b610baa7f65a7ed542fb37fe237fdfbdd70b31598523fe5b32879e307bae27a0bd9581c08869055565b610bdd610bd860017f71ac12829d66ee73d8d95bff50b3589745ce57edae70a3fb111a2342464dc59861263d565b849055565b610c11610c0b60017f383f291819e6d54073bc9a648251d97421076bdd101933c0c022219ce958063761263d565b83519055565b610c48610c3f60017f46adcbebc6be8ce551740c29c47c8798210f23f7f4086c41752944352568d5a861263d565b60208401519055565b610c7f610c7660017f9904ba90dde5696cda05c9e0dab5cbaa0fea005ace4d11218a02ac668dad637761263d565b60408401519055565b610cb6610cad60017f52322a25d9f59ea17656545543306b7aef62bc0cc53a0e65ccfa0c75b97aa90761263d565b60608401519055565b610ced610ce460017f4b6c74f9e688cb39801f2112c14a8c57232a3fc5202e1444126d4bce86eb19ad61263d565b60808401519055565b610d24610d1b60017fa04c5bb938ca6fc46d95553abf0a76345ce3e722a30bf4f74928b8e7d852320d61263d565b60a08401519055565b610d2c61195e565b610d398260c001516119c6565b610d4284611cd0565b610d4a610893565b67ffffffffffffffff168667ffffffffffffffff161015610dc7576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601f60248201527f53797374656d436f6e6669673a20676173206c696d697420746f6f206c6f77006044820152606401610aed565b8015610e2a57600080547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00ff169055604051600181527f7f26b83ff96e1f2b6a682f133852f6798a09c465da95921460cefb38474024989060200160405180910390a15b50505050505050505050565b61072560017fa11ee3ab75b40e88a0105e935d17cd36c8faee0138320d776c411291bdbbb1a061263d565b61072560017f52322a25d9f59ea17656545543306b7aef62bc0cc53a0e65ccfa0c75b97aa90761263d565b600061075c61075860017f52322a25d9f59ea17656545543306b7aef62bc0cc53a0e65ccfa0c75b97aa90761263d565b610ec4611201565b73ffffffffffffffffffffffffffffffffffffffff8116610f67576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602660248201527f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160448201527f64647265737300000000000000000000000000000000000000000000000000006064820152608401610aed565b6107a28161153e565b61072560017f9904ba90dde5696cda05c9e0dab5cbaa0fea005ace4d11218a02ac668dad637761263d565b61072560017f4b6c74f9e688cb39801f2112c14a8c57232a3fc5202e1444126d4bce86eb19ad61263d565b9055565b73ffffffffffffffffffffffffffffffffffffffff163b151590565b600060208251111561107a576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152603660248201527f476173506179696e67546f6b656e3a20737472696e672063616e6e6f7420626560448201527f2067726561746572207468616e203332206279746573000000000000000000006064820152608401610aed565b6110838261115b565b92915050565b6110ef6110b760017f04adb1412b2ddc16fcc0d4538d5c8f07cf9c83abecc6b41f6f69037b708fbcec61263d565b74ff000000000000000000000000000000000000000060a086901b1673ffffffffffffffffffffffffffffffffffffffff8716179055565b61112261111d60017f657c3582c29b3176614e3a33ddd1ec48352696a04e92b3c0566d72010fa8863d61263d565b839055565b61115561115060017fa48b38a4b44951360fbdcbfaaeae5ed6ae92585412e9841b70ec72ed8cd0576461263d565b829055565b50505050565b8051602181106111735763ec92f9a36000526004601cfd5b9081015160209190910360031b1b90565b600080806111b661075860017f04adb1412b2ddc16fcc0d4538d5c8f07cf9c83abecc6b41f6f69037b708fbcec61263d565b73ffffffffffffffffffffffffffffffffffffffff811693509050826111f5575073eeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeee92601292509050565b60a081901c9150509091565b60335473ffffffffffffffffffffffffffffffffffffffff163314610900576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e65726044820152606401610aed565b6112ab7f65a7ed542fb37fe237fdfbdd70b31598523fe5b32879e307bae27a0bd9581c08829055565b6040805173ffffffffffffffffffffffffffffffffffffffff8316602082015260009101604080517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0818403018152919052905060035b60007f1d2b0bda21d56b8bd12d4f94ebacffdfb35f5e226f84b461103bb8beab6353be836040516113339190612320565b60405180910390a35050565b606880547fffffffffffffffffffffffffffffffff0000000000000000ffffffffffffffff166801000000000000000063ffffffff8581169182027fffffffffffffffffffffffffffffffff00000000ffffffffffffffffffffffff16929092176c0100000000000000000000000092851692909202919091179091557f0100000000000000000000000000000000000000000000000000000000000000602083811b67ffffffff000000001690921717606681905560655460408051938401919091528201526000906060015b604080517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe08184030181529190529050600160007f1d2b0bda21d56b8bd12d4f94ebacffdfb35f5e226f84b461103bb8beab6353be836040516114709190612320565b60405180910390a3505050565b60606000611489611184565b5090507fffffffffffffffffffffffff111111111111111111111111111111111111111273ffffffffffffffffffffffffffffffffffffffff82160161150257505060408051808201909152600381527f4554480000000000000000000000000000000000000000000000000000000000602082015290565b61153861153361075860017fa48b38a4b44951360fbdcbfaaeae5ed6ae92585412e9841b70ec72ed8cd0576461263d565b612144565b91505090565b6033805473ffffffffffffffffffffffffffffffffffffffff8381167fffffffffffffffffffffffff0000000000000000000000000000000000000000831681179093556040519116919082907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e090600090a35050565b7fff00000000000000000000000000000000000000000000000000000000000000811615611665576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602160248201527f53797374656d436f6e6669673a207363616c61722065786365656473206d617860448201527f2e000000000000000000000000000000000000000000000000000000000000006064820152608401610aed565b60658290556066819055604080516020810184905290810182905260009060600161140d565b611693610893565b67ffffffffffffffff168167ffffffffffffffff161015611710576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601f60248201527f53797374656d436f6e6669673a20676173206c696d697420746f6f206c6f77006044820152606401610aed565b630bebc20067ffffffffffffffff82161115611788576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820181905260248201527f53797374656d436f6e6669673a20676173206c696d697420746f6f20686967686044820152606401610aed565b606880547fffffffffffffffffffffffffffffffffffffffffffffffff00000000000000001667ffffffffffffffff83169081179091556040805160208082019390935281518082039093018352810190526002611302565b6067819055604080516020808201849052825180830390910181529082019091526000611302565b60606000611815611184565b5090507fffffffffffffffffffffffff111111111111111111111111111111111111111273ffffffffffffffffffffffffffffffffffffffff82160161188e57505060408051808201909152600581527f4574686572000000000000000000000000000000000000000000000000000000602082015290565b61153861153361075860017f657c3582c29b3176614e3a33ddd1ec48352696a04e92b3c0566d72010fa8863d61263d565b600054610100900460ff16611956576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602b60248201527f496e697469616c697a61626c653a20636f6e7472616374206973206e6f74206960448201527f6e697469616c697a696e670000000000000000000000000000000000000000006064820152608401610aed565b610900612178565b61198c61075860017fa11ee3ab75b40e88a0105e935d17cd36c8faee0138320d776c411291bdbbb1a061263d565b600003610900576109006119c160017fa11ee3ab75b40e88a0105e935d17cd36c8faee0138320d776c411291bdbbb1a061263d565b439055565b73ffffffffffffffffffffffffffffffffffffffff811615801590611a15575073ffffffffffffffffffffffffffffffffffffffff811673eeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeee14155b8015611a265750611a246107fa565b155b156107a257601260ff168173ffffffffffffffffffffffffffffffffffffffff1663313ce5676040518163ffffffff1660e01b8152600401602060405180830381865afa158015611a7b573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611a9f9190612680565b60ff1614611b2f576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602e60248201527f53797374656d436f6e6669673a2062616420646563696d616c73206f6620676160448201527f7320706179696e6720746f6b656e0000000000000000000000000000000000006064820152608401610aed565b6000611bca8273ffffffffffffffffffffffffffffffffffffffff166306fdde036040518163ffffffff1660e01b8152600401600060405180830381865afa158015611b7f573d6000803e3d6000fd5b505050506040513d6000823e601f3d9081017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0168201604052611bc5919081019061269d565b610fe6565b90506000611c1c8373ffffffffffffffffffffffffffffffffffffffff166395d89b416040518163ffffffff1660e01b8152600401600060405180830381865afa158015611b7f573d6000803e3d6000fd5b9050611c2b8360128484611089565b611c33610761565b6040517f71cfaa3f00000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff858116600483015260126024830152604482018590526064820184905291909116906371cfaa3f90608401600060405180830381600087803b158015611cb357600080fd5b505af1158015611cc7573d6000803e3d6000fd5b50505050505050565b8060a001516fffffffffffffffffffffffffffffffff16816060015163ffffffff161115611d80576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152603560248201527f53797374656d436f6e6669673a206d696e206261736520666565206d7573742060448201527f6265206c657373207468616e206d6178206261736500000000000000000000006064820152608401610aed565b6001816040015160ff1611611e17576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602f60248201527f53797374656d436f6e6669673a2064656e6f6d696e61746f72206d757374206260448201527f65206c6172676572207468616e203100000000000000000000000000000000006064820152608401610aed565b6068546080820151825167ffffffffffffffff90921691611e389190612768565b63ffffffff161115611ea6576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601f60248201527f53797374656d436f6e6669673a20676173206c696d697420746f6f206c6f77006044820152606401610aed565b6000816020015160ff1611611f3d576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602f60248201527f53797374656d436f6e6669673a20656c6173746963697479206d756c7469706c60448201527f6965722063616e6e6f74206265203000000000000000000000000000000000006064820152608401610aed565b8051602082015163ffffffff82169160ff90911690611f5d908290612787565b611f6791906127d1565b63ffffffff1614611ffa576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152603760248201527f53797374656d436f6e6669673a20707265636973696f6e206c6f73732077697460448201527f6820746172676574207265736f75726365206c696d69740000000000000000006064820152608401610aed565b805160698054602084015160408501516060860151608087015160a09097015163ffffffff9687167fffffffffffffffffffffffffffffffffffffffffffffffffffffff00000000009095169490941764010000000060ff94851602177fffffffffffffffffffffffffffffffffffffffffffff0000000000ffffffffff166501000000000093909216929092027fffffffffffffffffffffffffffffffffffffffffffff00000000ffffffffffff1617660100000000000091851691909102177fffff0000000000000000000000000000000000000000ffffffffffffffffffff166a010000000000000000000093909416929092027fffff00000000000000000000000000000000ffffffffffffffffffffffffffff16929092176e0100000000000000000000000000006fffffffffffffffffffffffffffffffff90921691909102179055565b60405160005b82811a1561215a5760010161214a565b80825260208201838152600082820152505060408101604052919050565b600054610100900460ff1661220f576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602b60248201527f496e697469616c697a61626c653a20636f6e7472616374206973206e6f74206960448201527f6e697469616c697a696e670000000000000000000000000000000000000000006064820152608401610aed565b6109003361153e565b803573ffffffffffffffffffffffffffffffffffffffff8116811461223c57600080fd5b919050565b60006020828403121561225357600080fd5b61225c82612218565b9392505050565b803563ffffffff8116811461223c57600080fd5b6000806040838503121561228a57600080fd5b61229383612263565b91506122a160208401612263565b90509250929050565b60005b838110156122c55781810151838201526020016122ad565b838111156111555750506000910152565b600081518084526122ee8160208601602086016122aa565b601f017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0169290920160200192915050565b60208152600061225c60208301846122d6565b6000806040838503121561234657600080fd5b50508035926020909101359150565b803567ffffffffffffffff8116811461223c57600080fd5b60006020828403121561237f57600080fd5b61225c82612355565b60006020828403121561239a57600080fd5b5035919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b60405160c0810167ffffffffffffffff811182821017156123f3576123f36123a1565b60405290565b60ff811681146107a257600080fd5b600060e0828403121561241a57600080fd5b60405160e0810181811067ffffffffffffffff8211171561243d5761243d6123a1565b60405290508061244c83612218565b815261245a60208401612218565b602082015261246b60408401612218565b604082015261247c60608401612218565b606082015261248d60808401612218565b608082015261249e60a08401612218565b60a08201526124af60c08401612218565b60c08201525092915050565b6000806000806000806000806000898b036102808112156124db57600080fd5b6124e48b612218565b99506124f260208c01612263565b985061250060408c01612263565b975060608b0135965061251560808c01612355565b955061252360a08c01612218565b945060c07fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff408201121561255557600080fd5b5061255e6123d0565b61256a60c08c01612263565b815260e08b013561257a816123f9565b60208201526101008b013561258e816123f9565b60408201526125a06101208c01612263565b60608201526125b26101408c01612263565b60808201526101608b01356fffffffffffffffffffffffffffffffff811681146125db57600080fd5b60a082015292506125ef6101808b01612218565b91506125ff8b6101a08c01612408565b90509295985092959850929598565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b60008282101561264f5761264f61260e565b500390565b600067ffffffffffffffff8083168185168083038211156126775761267761260e565b01949350505050565b60006020828403121561269257600080fd5b815161225c816123f9565b6000602082840312156126af57600080fd5b815167ffffffffffffffff808211156126c757600080fd5b818401915084601f8301126126db57600080fd5b8151818111156126ed576126ed6123a1565b604051601f82017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0908116603f01168101908382118183101715612733576127336123a1565b8160405282815287602084870101111561274c57600080fd5b61275d8360208301602088016122aa565b979650505050505050565b600063ffffffff8083168185168083038211156126775761267761260e565b600063ffffffff808416806127c5577f4e487b7100000000000000000000000000000000000000000000000000000000600052601260045260246000fd5b92169190910492915050565b600063ffffffff808316818516818304811182151516156127f4576127f461260e565b0294935050505056fea164736f6c634300080f000a"; bytes internal constant l1StandardBridgeCode = - hex"6080604052600436106101845760003560e01c80637f46ddb2116100d65780639a2ac6d51161007f578063c0c53b8b11610059578063c0c53b8b14610529578063c89701a214610549578063e11013dd1461057657600080fd5b80639a2ac6d5146104e3578063a9f9e675146104f6578063b1a1a8821461051657600080fd5b80638f601f66116100b05780638f601f661461047257806391c49bf814610407578063927ede2d146104b857600080fd5b80637f46ddb214610407578063838b252014610432578063870876231461045257600080fd5b806335e80ab31161013857806354fd4d501161011257806354fd4d501461036c57806358a997f6146103c25780635c975abb146103e257600080fd5b806335e80ab3146102f25780633cb747bf1461031f578063540abf731461034c57600080fd5b80631532ec34116101695780631532ec34146102755780631635f5fd1461028857806333d7e2bd1461029b57600080fd5b80630166a07a1461024257806309fc88431461026257600080fd5b3661023d57333b1561021d576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152603760248201527f5374616e646172644272696467653a2066756e6374696f6e2063616e206f6e6c60448201527f792062652063616c6c65642066726f6d20616e20454f4100000000000000000060648201526084015b60405180910390fd5b61023b333362030d40604051806020016040528060008152506105a5565b005b600080fd5b34801561024e57600080fd5b5061023b61025d366004612993565b6105b8565b61023b610270366004612a44565b6109d2565b61023b610283366004612a97565b610aa9565b61023b610296366004612a97565b610abd565b3480156102a757600080fd5b506033546102c89073ffffffffffffffffffffffffffffffffffffffff1681565b60405173ffffffffffffffffffffffffffffffffffffffff90911681526020015b60405180910390f35b3480156102fe57600080fd5b506032546102c89073ffffffffffffffffffffffffffffffffffffffff1681565b34801561032b57600080fd5b506003546102c89073ffffffffffffffffffffffffffffffffffffffff1681565b34801561035857600080fd5b5061023b610367366004612b0a565b61101b565b34801561037857600080fd5b506103b56040518060400160405280600581526020017f322e322e3000000000000000000000000000000000000000000000000000000081525081565b6040516102e99190612bf7565b3480156103ce57600080fd5b5061023b6103dd366004612c0a565b611060565b3480156103ee57600080fd5b506103f7611134565b60405190151581526020016102e9565b34801561041357600080fd5b5060045473ffffffffffffffffffffffffffffffffffffffff166102c8565b34801561043e57600080fd5b5061023b61044d366004612b0a565b6111cd565b34801561045e57600080fd5b5061023b61046d366004612c0a565b611212565b34801561047e57600080fd5b506104aa61048d366004612c8d565b600260209081526000928352604080842090915290825290205481565b6040519081526020016102e9565b3480156104c457600080fd5b5060035473ffffffffffffffffffffffffffffffffffffffff166102c8565b61023b6104f1366004612cc6565b6112e6565b34801561050257600080fd5b5061023b610511366004612993565b611328565b61023b610524366004612a44565b611337565b34801561053557600080fd5b5061023b610544366004612d29565b611408565b34801561055557600080fd5b506004546102c89073ffffffffffffffffffffffffffffffffffffffff1681565b61023b610584366004612cc6565b611607565b73ffffffffffffffffffffffffffffffffffffffff163b151590565b6105b2848434858561164a565b50505050565b60035473ffffffffffffffffffffffffffffffffffffffff163314801561068b575060048054600354604080517f6e296e45000000000000000000000000000000000000000000000000000000008152905173ffffffffffffffffffffffffffffffffffffffff938416949390921692636e296e459282820192602092908290030181865afa15801561064f573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906106739190612d74565b73ffffffffffffffffffffffffffffffffffffffff16145b61073d576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152604160248201527f5374616e646172644272696467653a2066756e6374696f6e2063616e206f6e6c60448201527f792062652063616c6c65642066726f6d20746865206f7468657220627269646760648201527f6500000000000000000000000000000000000000000000000000000000000000608482015260a401610214565b610745611134565b156107ac576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601660248201527f5374616e646172644272696467653a20706175736564000000000000000000006044820152606401610214565b6107b5876118a9565b15610903576107c4878761190b565b610876576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152604a60248201527f5374616e646172644272696467653a2077726f6e672072656d6f746520746f6b60448201527f656e20666f72204f7074696d69736d204d696e7461626c65204552433230206c60648201527f6f63616c20746f6b656e00000000000000000000000000000000000000000000608482015260a401610214565b6040517f40c10f1900000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff8581166004830152602482018590528816906340c10f1990604401600060405180830381600087803b1580156108e657600080fd5b505af11580156108fa573d6000803e3d6000fd5b50505050610985565b73ffffffffffffffffffffffffffffffffffffffff8088166000908152600260209081526040808320938a1683529290522054610941908490612dc0565b73ffffffffffffffffffffffffffffffffffffffff8089166000818152600260209081526040808320948c1683529390529190912091909155610985908585611a2b565b6109c9878787878787878080601f016020809104026020016040519081016040528093929190818152602001838380828437600092019190915250611aff92505050565b50505050505050565b333b15610a61576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152603760248201527f5374616e646172644272696467653a2066756e6374696f6e2063616e206f6e6c60448201527f792062652063616c6c65642066726f6d20616e20454f410000000000000000006064820152608401610214565b610aa43333348686868080601f01602080910402602001604051908101604052809392919081815260200183838082843760009201919091525061164a92505050565b505050565b610ab68585858585610abd565b5050505050565b60035473ffffffffffffffffffffffffffffffffffffffff1633148015610b90575060048054600354604080517f6e296e45000000000000000000000000000000000000000000000000000000008152905173ffffffffffffffffffffffffffffffffffffffff938416949390921692636e296e459282820192602092908290030181865afa158015610b54573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610b789190612d74565b73ffffffffffffffffffffffffffffffffffffffff16145b610c42576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152604160248201527f5374616e646172644272696467653a2066756e6374696f6e2063616e206f6e6c60448201527f792062652063616c6c65642066726f6d20746865206f7468657220627269646760648201527f6500000000000000000000000000000000000000000000000000000000000000608482015260a401610214565b610c4a611134565b15610cb1576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601660248201527f5374616e646172644272696467653a20706175736564000000000000000000006044820152606401610214565b610cb9611b8d565b15610d46576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152603760248201527f5374616e646172644272696467653a2063616e6e6f742062726964676520455460448201527f48207769746820637573746f6d2067617320746f6b656e0000000000000000006064820152608401610214565b823414610dd5576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152603a60248201527f5374616e646172644272696467653a20616d6f756e742073656e7420646f657360448201527f206e6f74206d6174636820616d6f756e742072657175697265640000000000006064820152608401610214565b3073ffffffffffffffffffffffffffffffffffffffff851603610e7a576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602360248201527f5374616e646172644272696467653a2063616e6e6f742073656e6420746f207360448201527f656c6600000000000000000000000000000000000000000000000000000000006064820152608401610214565b60035473ffffffffffffffffffffffffffffffffffffffff90811690851603610f25576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602860248201527f5374616e646172644272696467653a2063616e6e6f742073656e6420746f206d60448201527f657373656e6765720000000000000000000000000000000000000000000000006064820152608401610214565b610f6785858585858080601f016020809104026020016040519081016040528093929190818152602001838380828437600092019190915250611bcc92505050565b6000610f84855a8660405180602001604052806000815250611c3f565b905080611013576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602360248201527f5374616e646172644272696467653a20455448207472616e736665722066616960448201527f6c656400000000000000000000000000000000000000000000000000000000006064820152608401610214565b505050505050565b6109c987873388888888888080601f016020809104026020016040519081016040528093929190818152602001838380828437600092019190915250611c5992505050565b333b156110ef576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152603760248201527f5374616e646172644272696467653a2066756e6374696f6e2063616e206f6e6c60448201527f792062652063616c6c65642066726f6d20616e20454f410000000000000000006064820152608401610214565b61101386863333888888888080601f01602080910402602001604051908101604052809392919081815260200183838082843760009201919091525061201292505050565b603254604080517f5c975abb000000000000000000000000000000000000000000000000000000008152905160009273ffffffffffffffffffffffffffffffffffffffff1691635c975abb9160048083019260209291908290030181865afa1580156111a4573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906111c89190612dd7565b905090565b6109c987873388888888888080601f01602080910402602001604051908101604052809392919081815260200183838082843760009201919091525061201292505050565b333b156112a1576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152603760248201527f5374616e646172644272696467653a2066756e6374696f6e2063616e206f6e6c60448201527f792062652063616c6c65642066726f6d20616e20454f410000000000000000006064820152608401610214565b61101386863333888888888080601f016020809104026020016040519081016040528093929190818152602001838380828437600092019190915250611c5992505050565b6105b233858585858080601f0160208091040260200160405190810160405280939291908181526020018383808284376000920191909152506105a592505050565b6109c9878787878787876105b8565b333b156113c6576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152603760248201527f5374616e646172644272696467653a2066756e6374696f6e2063616e206f6e6c60448201527f792062652063616c6c65642066726f6d20616e20454f410000000000000000006064820152608401610214565b610aa433338585858080601f0160208091040260200160405190810160405280939291908181526020018383808284376000920191909152506105a592505050565b600054610100900460ff16158080156114285750600054600160ff909116105b806114425750303b158015611442575060005460ff166001145b6114ce576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602e60248201527f496e697469616c697a61626c653a20636f6e747261637420697320616c72656160448201527f647920696e697469616c697a65640000000000000000000000000000000000006064820152608401610214565b600080547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00166001179055801561152c57600080547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00ff166101001790555b6032805473ffffffffffffffffffffffffffffffffffffffff8086167fffffffffffffffffffffffff000000000000000000000000000000000000000092831617909255603380549285169290911691909117905561159f84734200000000000000000000000000000000000010612021565b80156105b257600080547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00ff169055604051600181527f7f26b83ff96e1f2b6a682f133852f6798a09c465da95921460cefb38474024989060200160405180910390a150505050565b6105b23385348686868080601f01602080910402602001604051908101604052809392919081815260200183838082843760009201919091525061164a92505050565b611652611b8d565b156116df576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152603760248201527f5374616e646172644272696467653a2063616e6e6f742062726964676520455460448201527f48207769746820637573746f6d2067617320746f6b656e0000000000000000006064820152608401610214565b82341461176e576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152603e60248201527f5374616e646172644272696467653a206272696467696e6720455448206d757360448201527f7420696e636c7564652073756666696369656e74204554482076616c756500006064820152608401610214565b61177a8585858461210b565b60035460045460405173ffffffffffffffffffffffffffffffffffffffff92831692633dbb202b9287929116907f1635f5fd00000000000000000000000000000000000000000000000000000000906117dd908b908b9086908a90602401612df9565b604080517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe08184030181529181526020820180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff167fffffffff000000000000000000000000000000000000000000000000000000009485161790525160e086901b909216825261187092918890600401612e42565b6000604051808303818588803b15801561188957600080fd5b505af115801561189d573d6000803e3d6000fd5b50505050505050505050565b60006118d5827f1d1d8b630000000000000000000000000000000000000000000000000000000061217e565b806119055750611905827fec4fc8e30000000000000000000000000000000000000000000000000000000061217e565b92915050565b6000611937837f1d1d8b630000000000000000000000000000000000000000000000000000000061217e565b156119e0578273ffffffffffffffffffffffffffffffffffffffff1663c01e1bd66040518163ffffffff1660e01b8152600401602060405180830381865afa158015611987573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906119ab9190612d74565b73ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff16149050611905565b8273ffffffffffffffffffffffffffffffffffffffff1663d6c0b2c46040518163ffffffff1660e01b8152600401602060405180830381865afa158015611987573d6000803e3d6000fd5b60405173ffffffffffffffffffffffffffffffffffffffff8316602482015260448101829052610aa49084907fa9059cbb00000000000000000000000000000000000000000000000000000000906064015b604080517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe08184030181529190526020810180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff167fffffffff00000000000000000000000000000000000000000000000000000000909316929092179091526121a1565b8373ffffffffffffffffffffffffffffffffffffffff168573ffffffffffffffffffffffffffffffffffffffff168773ffffffffffffffffffffffffffffffffffffffff167f3ceee06c1e37648fcbb6ed52e17b3e1f275a1f8c7b22a84b2b84732431e046b3868686604051611b7793929190612e87565b60405180910390a46110138686868686866122ad565b600080611b98612335565b5073ffffffffffffffffffffffffffffffffffffffff1673eeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeee141592915050565b8273ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff167f2ac69ee804d9a7a0984249f508dfab7cb2534b465b6ce1580f99a38ba9c5e6318484604051611c2b929190612ec5565b60405180910390a36105b2848484846123d2565b600080600080845160208601878a8af19695505050505050565b3415611ce7576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602160248201527f5374616e646172644272696467653a2063616e6e6f742073656e642076616c7560448201527f65000000000000000000000000000000000000000000000000000000000000006064820152608401610214565b611cf0876118a9565b15611e3e57611cff878761190b565b611db1576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152604a60248201527f5374616e646172644272696467653a2077726f6e672072656d6f746520746f6b60448201527f656e20666f72204f7074696d69736d204d696e7461626c65204552433230206c60648201527f6f63616c20746f6b656e00000000000000000000000000000000000000000000608482015260a401610214565b6040517f9dc29fac00000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff868116600483015260248201859052881690639dc29fac90604401600060405180830381600087803b158015611e2157600080fd5b505af1158015611e35573d6000803e3d6000fd5b50505050611ed2565b611e6073ffffffffffffffffffffffffffffffffffffffff881686308661243f565b73ffffffffffffffffffffffffffffffffffffffff8088166000908152600260209081526040808320938a1683529290522054611e9e908490612ede565b73ffffffffffffffffffffffffffffffffffffffff8089166000908152600260209081526040808320938b16835292905220555b611ee087878787878661249d565b60035460045460405173ffffffffffffffffffffffffffffffffffffffff92831692633dbb202b9216907f0166a07a0000000000000000000000000000000000000000000000000000000090611f44908b908d908c908c908c908b90602401612ef6565b604080517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe08184030181529181526020820180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff167fffffffff000000000000000000000000000000000000000000000000000000009485161790525160e085901b9092168252611fd792918790600401612e42565b600060405180830381600087803b158015611ff157600080fd5b505af1158015612005573d6000803e3d6000fd5b5050505050505050505050565b6109c987878787878787611c59565b600054610100900460ff166120b8576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602b60248201527f496e697469616c697a61626c653a20636f6e7472616374206973206e6f74206960448201527f6e697469616c697a696e670000000000000000000000000000000000000000006064820152608401610214565b6003805473ffffffffffffffffffffffffffffffffffffffff9384167fffffffffffffffffffffffff00000000000000000000000000000000000000009182161790915560048054929093169116179055565b8273ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff167f35d79ab81f2b2017e19afb5c5571778877782d7a8786f5907f93b0f4702f4f23848460405161216a929190612ec5565b60405180910390a36105b28484848461252b565b60006121898361258a565b801561219a575061219a83836125ee565b9392505050565b6000612203826040518060400160405280602081526020017f5361666545524332303a206c6f772d6c6576656c2063616c6c206661696c65648152508573ffffffffffffffffffffffffffffffffffffffff166126bd9092919063ffffffff16565b805190915015610aa457808060200190518101906122219190612dd7565b610aa4576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602a60248201527f5361666545524332303a204552433230206f7065726174696f6e20646964206e60448201527f6f742073756363656564000000000000000000000000000000000000000000006064820152608401610214565b8373ffffffffffffffffffffffffffffffffffffffff168573ffffffffffffffffffffffffffffffffffffffff168773ffffffffffffffffffffffffffffffffffffffff167fd59c65b35445225835c83f50b6ede06a7be047d22e357073e250d9af537518cd86868660405161232593929190612e87565b60405180910390a4505050505050565b603354604080517f4397dfef0000000000000000000000000000000000000000000000000000000081528151600093849373ffffffffffffffffffffffffffffffffffffffff90911692634397dfef92600480830193928290030181865afa1580156123a5573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906123c99190612f51565b90939092509050565b8273ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff167f31b2166ff604fc5672ea5df08a78081d2bc6d746cadce880747f3643d819e83d8484604051612431929190612ec5565b60405180910390a350505050565b60405173ffffffffffffffffffffffffffffffffffffffff808516602483015283166044820152606481018290526105b29085907f23b872dd0000000000000000000000000000000000000000000000000000000090608401611a7d565b8373ffffffffffffffffffffffffffffffffffffffff168573ffffffffffffffffffffffffffffffffffffffff168773ffffffffffffffffffffffffffffffffffffffff167f718594027abd4eaed59f95162563e0cc6d0e8d5b86b1c7be8b1b0ac3343d039686868660405161251593929190612e87565b60405180910390a46110138686868686866126d4565b8273ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff167f2849b43074093a05396b6f2a937dee8565b15a48a7b3d4bffb732a5017380af58484604051612431929190612ec5565b60006125b6827f01ffc9a7000000000000000000000000000000000000000000000000000000006125ee565b801561190557506125e7827fffffffff000000000000000000000000000000000000000000000000000000006125ee565b1592915050565b604080517fffffffff000000000000000000000000000000000000000000000000000000008316602480830191909152825180830390910181526044909101909152602080820180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff167f01ffc9a700000000000000000000000000000000000000000000000000000000178152825160009392849283928392918391908a617530fa92503d915060005190508280156126a6575060208210155b80156126b25750600081115b979650505050505050565b60606126cc848460008561274c565b949350505050565b8373ffffffffffffffffffffffffffffffffffffffff168573ffffffffffffffffffffffffffffffffffffffff168773ffffffffffffffffffffffffffffffffffffffff167f7ff126db8024424bbfd9826e8ab82ff59136289ea440b04b39a0df1b03b9cabf86868660405161232593929190612e87565b6060824710156127de576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602660248201527f416464726573733a20696e73756666696369656e742062616c616e636520666f60448201527f722063616c6c00000000000000000000000000000000000000000000000000006064820152608401610214565b73ffffffffffffffffffffffffffffffffffffffff85163b61285c576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601d60248201527f416464726573733a2063616c6c20746f206e6f6e2d636f6e74726163740000006044820152606401610214565b6000808673ffffffffffffffffffffffffffffffffffffffff1685876040516128859190612f86565b60006040518083038185875af1925050503d80600081146128c2576040519150601f19603f3d011682016040523d82523d6000602084013e6128c7565b606091505b50915091506126b2828286606083156128e157508161219a565b8251156128f15782518084602001fd5b816040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016102149190612bf7565b73ffffffffffffffffffffffffffffffffffffffff8116811461294757600080fd5b50565b60008083601f84011261295c57600080fd5b50813567ffffffffffffffff81111561297457600080fd5b60208301915083602082850101111561298c57600080fd5b9250929050565b600080600080600080600060c0888a0312156129ae57600080fd5b87356129b981612925565b965060208801356129c981612925565b955060408801356129d981612925565b945060608801356129e981612925565b93506080880135925060a088013567ffffffffffffffff811115612a0c57600080fd5b612a188a828b0161294a565b989b979a50959850939692959293505050565b803563ffffffff81168114612a3f57600080fd5b919050565b600080600060408486031215612a5957600080fd5b612a6284612a2b565b9250602084013567ffffffffffffffff811115612a7e57600080fd5b612a8a8682870161294a565b9497909650939450505050565b600080600080600060808688031215612aaf57600080fd5b8535612aba81612925565b94506020860135612aca81612925565b935060408601359250606086013567ffffffffffffffff811115612aed57600080fd5b612af98882890161294a565b969995985093965092949392505050565b600080600080600080600060c0888a031215612b2557600080fd5b8735612b3081612925565b96506020880135612b4081612925565b95506040880135612b5081612925565b945060608801359350612b6560808901612a2b565b925060a088013567ffffffffffffffff811115612a0c57600080fd5b60005b83811015612b9c578181015183820152602001612b84565b838111156105b25750506000910152565b60008151808452612bc5816020860160208601612b81565b601f017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0169290920160200192915050565b60208152600061219a6020830184612bad565b60008060008060008060a08789031215612c2357600080fd5b8635612c2e81612925565b95506020870135612c3e81612925565b945060408701359350612c5360608801612a2b565b9250608087013567ffffffffffffffff811115612c6f57600080fd5b612c7b89828a0161294a565b979a9699509497509295939492505050565b60008060408385031215612ca057600080fd5b8235612cab81612925565b91506020830135612cbb81612925565b809150509250929050565b60008060008060608587031215612cdc57600080fd5b8435612ce781612925565b9350612cf560208601612a2b565b9250604085013567ffffffffffffffff811115612d1157600080fd5b612d1d8782880161294a565b95989497509550505050565b600080600060608486031215612d3e57600080fd5b8335612d4981612925565b92506020840135612d5981612925565b91506040840135612d6981612925565b809150509250925092565b600060208284031215612d8657600080fd5b815161219a81612925565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b600082821015612dd257612dd2612d91565b500390565b600060208284031215612de957600080fd5b8151801515811461219a57600080fd5b600073ffffffffffffffffffffffffffffffffffffffff808716835280861660208401525083604083015260806060830152612e386080830184612bad565b9695505050505050565b73ffffffffffffffffffffffffffffffffffffffff84168152606060208201526000612e716060830185612bad565b905063ffffffff83166040830152949350505050565b73ffffffffffffffffffffffffffffffffffffffff84168152826020820152606060408201526000612ebc6060830184612bad565b95945050505050565b8281526040602082015260006126cc6040830184612bad565b60008219821115612ef157612ef1612d91565b500190565b600073ffffffffffffffffffffffffffffffffffffffff80891683528088166020840152808716604084015280861660608401525083608083015260c060a0830152612f4560c0830184612bad565b98975050505050505050565b60008060408385031215612f6457600080fd5b8251612f6f81612925565b602084015190925060ff81168114612cbb57600080fd5b60008251612f98818460208701612b81565b919091019291505056fea164736f6c634300080f000a"; + hex"6080604052600436106101845760003560e01c80637f46ddb2116100d65780639a2ac6d51161007f578063c0c53b8b11610059578063c0c53b8b14610529578063c89701a214610549578063e11013dd1461057657600080fd5b80639a2ac6d5146104e3578063a9f9e675146104f6578063b1a1a8821461051657600080fd5b80638f601f66116100b05780638f601f661461047257806391c49bf814610407578063927ede2d146104b857600080fd5b80637f46ddb214610407578063838b252014610432578063870876231461045257600080fd5b806335e80ab31161013857806354fd4d501161011257806354fd4d501461036c57806358a997f6146103c25780635c975abb146103e257600080fd5b806335e80ab3146102f25780633cb747bf1461031f578063540abf731461034c57600080fd5b80631532ec34116101695780631532ec34146102755780631635f5fd1461028857806333d7e2bd1461029b57600080fd5b80630166a07a1461024257806309fc88431461026257600080fd5b3661023d57333b1561021d576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152603760248201527f5374616e646172644272696467653a2066756e6374696f6e2063616e206f6e6c60448201527f792062652063616c6c65642066726f6d20616e20454f4100000000000000000060648201526084015b60405180910390fd5b61023b333362030d40604051806020016040528060008152506105a5565b005b600080fd5b34801561024e57600080fd5b5061023b61025d366004612991565b6105b8565b61023b610270366004612a42565b6109d2565b61023b610283366004612a95565b610aa9565b61023b610296366004612a95565b610abd565b3480156102a757600080fd5b506033546102c89073ffffffffffffffffffffffffffffffffffffffff1681565b60405173ffffffffffffffffffffffffffffffffffffffff90911681526020015b60405180910390f35b3480156102fe57600080fd5b506032546102c89073ffffffffffffffffffffffffffffffffffffffff1681565b34801561032b57600080fd5b506003546102c89073ffffffffffffffffffffffffffffffffffffffff1681565b34801561035857600080fd5b5061023b610367366004612b08565b61101b565b34801561037857600080fd5b506103b56040518060400160405280600c81526020017f322e322e312d626574612e31000000000000000000000000000000000000000081525081565b6040516102e99190612bf5565b3480156103ce57600080fd5b5061023b6103dd366004612c08565b611060565b3480156103ee57600080fd5b506103f7611134565b60405190151581526020016102e9565b34801561041357600080fd5b5060045473ffffffffffffffffffffffffffffffffffffffff166102c8565b34801561043e57600080fd5b5061023b61044d366004612b08565b6111cd565b34801561045e57600080fd5b5061023b61046d366004612c08565b611212565b34801561047e57600080fd5b506104aa61048d366004612c8b565b600260209081526000928352604080842090915290825290205481565b6040519081526020016102e9565b3480156104c457600080fd5b5060035473ffffffffffffffffffffffffffffffffffffffff166102c8565b61023b6104f1366004612cc4565b6112e6565b34801561050257600080fd5b5061023b610511366004612991565b611328565b61023b610524366004612a42565b611337565b34801561053557600080fd5b5061023b610544366004612d27565b611408565b34801561055557600080fd5b506004546102c89073ffffffffffffffffffffffffffffffffffffffff1681565b61023b610584366004612cc4565b611607565b73ffffffffffffffffffffffffffffffffffffffff163b151590565b6105b2848434858561164a565b50505050565b60035473ffffffffffffffffffffffffffffffffffffffff163314801561068b575060048054600354604080517f6e296e45000000000000000000000000000000000000000000000000000000008152905173ffffffffffffffffffffffffffffffffffffffff938416949390921692636e296e459282820192602092908290030181865afa15801561064f573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906106739190612d72565b73ffffffffffffffffffffffffffffffffffffffff16145b61073d576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152604160248201527f5374616e646172644272696467653a2066756e6374696f6e2063616e206f6e6c60448201527f792062652063616c6c65642066726f6d20746865206f7468657220627269646760648201527f6500000000000000000000000000000000000000000000000000000000000000608482015260a401610214565b610745611134565b156107ac576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601660248201527f5374616e646172644272696467653a20706175736564000000000000000000006044820152606401610214565b6107b5876118a9565b15610903576107c4878761190b565b610876576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152604a60248201527f5374616e646172644272696467653a2077726f6e672072656d6f746520746f6b60448201527f656e20666f72204f7074696d69736d204d696e7461626c65204552433230206c60648201527f6f63616c20746f6b656e00000000000000000000000000000000000000000000608482015260a401610214565b6040517f40c10f1900000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff8581166004830152602482018590528816906340c10f1990604401600060405180830381600087803b1580156108e657600080fd5b505af11580156108fa573d6000803e3d6000fd5b50505050610985565b73ffffffffffffffffffffffffffffffffffffffff8088166000908152600260209081526040808320938a1683529290522054610941908490612dbe565b73ffffffffffffffffffffffffffffffffffffffff8089166000818152600260209081526040808320948c1683529390529190912091909155610985908585611a2b565b6109c9878787878787878080601f016020809104026020016040519081016040528093929190818152602001838380828437600092019190915250611aff92505050565b50505050505050565b333b15610a61576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152603760248201527f5374616e646172644272696467653a2066756e6374696f6e2063616e206f6e6c60448201527f792062652063616c6c65642066726f6d20616e20454f410000000000000000006064820152608401610214565b610aa43333348686868080601f01602080910402602001604051908101604052809392919081815260200183838082843760009201919091525061164a92505050565b505050565b610ab68585858585610abd565b5050505050565b60035473ffffffffffffffffffffffffffffffffffffffff1633148015610b90575060048054600354604080517f6e296e45000000000000000000000000000000000000000000000000000000008152905173ffffffffffffffffffffffffffffffffffffffff938416949390921692636e296e459282820192602092908290030181865afa158015610b54573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610b789190612d72565b73ffffffffffffffffffffffffffffffffffffffff16145b610c42576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152604160248201527f5374616e646172644272696467653a2066756e6374696f6e2063616e206f6e6c60448201527f792062652063616c6c65642066726f6d20746865206f7468657220627269646760648201527f6500000000000000000000000000000000000000000000000000000000000000608482015260a401610214565b610c4a611134565b15610cb1576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601660248201527f5374616e646172644272696467653a20706175736564000000000000000000006044820152606401610214565b610cb9611b8d565b15610d46576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152603760248201527f5374616e646172644272696467653a2063616e6e6f742062726964676520455460448201527f48207769746820637573746f6d2067617320746f6b656e0000000000000000006064820152608401610214565b823414610dd5576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152603a60248201527f5374616e646172644272696467653a20616d6f756e742073656e7420646f657360448201527f206e6f74206d6174636820616d6f756e742072657175697265640000000000006064820152608401610214565b3073ffffffffffffffffffffffffffffffffffffffff851603610e7a576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602360248201527f5374616e646172644272696467653a2063616e6e6f742073656e6420746f207360448201527f656c6600000000000000000000000000000000000000000000000000000000006064820152608401610214565b60035473ffffffffffffffffffffffffffffffffffffffff90811690851603610f25576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602860248201527f5374616e646172644272696467653a2063616e6e6f742073656e6420746f206d60448201527f657373656e6765720000000000000000000000000000000000000000000000006064820152608401610214565b610f6785858585858080601f016020809104026020016040519081016040528093929190818152602001838380828437600092019190915250611bcc92505050565b6000610f84855a8660405180602001604052806000815250611c3f565b905080611013576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602360248201527f5374616e646172644272696467653a20455448207472616e736665722066616960448201527f6c656400000000000000000000000000000000000000000000000000000000006064820152608401610214565b505050505050565b6109c987873388888888888080601f016020809104026020016040519081016040528093929190818152602001838380828437600092019190915250611c5792505050565b333b156110ef576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152603760248201527f5374616e646172644272696467653a2066756e6374696f6e2063616e206f6e6c60448201527f792062652063616c6c65642066726f6d20616e20454f410000000000000000006064820152608401610214565b61101386863333888888888080601f01602080910402602001604051908101604052809392919081815260200183838082843760009201919091525061201092505050565b603254604080517f5c975abb000000000000000000000000000000000000000000000000000000008152905160009273ffffffffffffffffffffffffffffffffffffffff1691635c975abb9160048083019260209291908290030181865afa1580156111a4573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906111c89190612dd5565b905090565b6109c987873388888888888080601f01602080910402602001604051908101604052809392919081815260200183838082843760009201919091525061201092505050565b333b156112a1576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152603760248201527f5374616e646172644272696467653a2066756e6374696f6e2063616e206f6e6c60448201527f792062652063616c6c65642066726f6d20616e20454f410000000000000000006064820152608401610214565b61101386863333888888888080601f016020809104026020016040519081016040528093929190818152602001838380828437600092019190915250611c5792505050565b6105b233858585858080601f0160208091040260200160405190810160405280939291908181526020018383808284376000920191909152506105a592505050565b6109c9878787878787876105b8565b333b156113c6576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152603760248201527f5374616e646172644272696467653a2066756e6374696f6e2063616e206f6e6c60448201527f792062652063616c6c65642066726f6d20616e20454f410000000000000000006064820152608401610214565b610aa433338585858080601f0160208091040260200160405190810160405280939291908181526020018383808284376000920191909152506105a592505050565b600054610100900460ff16158080156114285750600054600160ff909116105b806114425750303b158015611442575060005460ff166001145b6114ce576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602e60248201527f496e697469616c697a61626c653a20636f6e747261637420697320616c72656160448201527f647920696e697469616c697a65640000000000000000000000000000000000006064820152608401610214565b600080547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00166001179055801561152c57600080547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00ff166101001790555b6032805473ffffffffffffffffffffffffffffffffffffffff8086167fffffffffffffffffffffffff000000000000000000000000000000000000000092831617909255603380549285169290911691909117905561159f8473420000000000000000000000000000000000001061201f565b80156105b257600080547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00ff169055604051600181527f7f26b83ff96e1f2b6a682f133852f6798a09c465da95921460cefb38474024989060200160405180910390a150505050565b6105b23385348686868080601f01602080910402602001604051908101604052809392919081815260200183838082843760009201919091525061164a92505050565b611652611b8d565b156116df576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152603760248201527f5374616e646172644272696467653a2063616e6e6f742062726964676520455460448201527f48207769746820637573746f6d2067617320746f6b656e0000000000000000006064820152608401610214565b82341461176e576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152603e60248201527f5374616e646172644272696467653a206272696467696e6720455448206d757360448201527f7420696e636c7564652073756666696369656e74204554482076616c756500006064820152608401610214565b61177a85858584612109565b60035460045460405173ffffffffffffffffffffffffffffffffffffffff92831692633dbb202b9287929116907f1635f5fd00000000000000000000000000000000000000000000000000000000906117dd908b908b9086908a90602401612df7565b604080517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe08184030181529181526020820180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff167fffffffff000000000000000000000000000000000000000000000000000000009485161790525160e086901b909216825261187092918890600401612e40565b6000604051808303818588803b15801561188957600080fd5b505af115801561189d573d6000803e3d6000fd5b50505050505050505050565b60006118d5827f1d1d8b630000000000000000000000000000000000000000000000000000000061217c565b806119055750611905827fec4fc8e30000000000000000000000000000000000000000000000000000000061217c565b92915050565b6000611937837f1d1d8b630000000000000000000000000000000000000000000000000000000061217c565b156119e0578273ffffffffffffffffffffffffffffffffffffffff1663c01e1bd66040518163ffffffff1660e01b8152600401602060405180830381865afa158015611987573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906119ab9190612d72565b73ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff16149050611905565b8273ffffffffffffffffffffffffffffffffffffffff1663d6c0b2c46040518163ffffffff1660e01b8152600401602060405180830381865afa158015611987573d6000803e3d6000fd5b60405173ffffffffffffffffffffffffffffffffffffffff8316602482015260448101829052610aa49084907fa9059cbb00000000000000000000000000000000000000000000000000000000906064015b604080517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe08184030181529190526020810180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff167fffffffff000000000000000000000000000000000000000000000000000000009093169290921790915261219f565b8373ffffffffffffffffffffffffffffffffffffffff168573ffffffffffffffffffffffffffffffffffffffff168773ffffffffffffffffffffffffffffffffffffffff167f3ceee06c1e37648fcbb6ed52e17b3e1f275a1f8c7b22a84b2b84732431e046b3868686604051611b7793929190612e85565b60405180910390a46110138686868686866122ab565b600080611b98612333565b5073ffffffffffffffffffffffffffffffffffffffff1673eeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeee141592915050565b8273ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff167f2ac69ee804d9a7a0984249f508dfab7cb2534b465b6ce1580f99a38ba9c5e6318484604051611c2b929190612ec3565b60405180910390a36105b2848484846123d0565b6000806000835160208501868989f195945050505050565b3415611ce5576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602160248201527f5374616e646172644272696467653a2063616e6e6f742073656e642076616c7560448201527f65000000000000000000000000000000000000000000000000000000000000006064820152608401610214565b611cee876118a9565b15611e3c57611cfd878761190b565b611daf576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152604a60248201527f5374616e646172644272696467653a2077726f6e672072656d6f746520746f6b60448201527f656e20666f72204f7074696d69736d204d696e7461626c65204552433230206c60648201527f6f63616c20746f6b656e00000000000000000000000000000000000000000000608482015260a401610214565b6040517f9dc29fac00000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff868116600483015260248201859052881690639dc29fac90604401600060405180830381600087803b158015611e1f57600080fd5b505af1158015611e33573d6000803e3d6000fd5b50505050611ed0565b611e5e73ffffffffffffffffffffffffffffffffffffffff881686308661243d565b73ffffffffffffffffffffffffffffffffffffffff8088166000908152600260209081526040808320938a1683529290522054611e9c908490612edc565b73ffffffffffffffffffffffffffffffffffffffff8089166000908152600260209081526040808320938b16835292905220555b611ede87878787878661249b565b60035460045460405173ffffffffffffffffffffffffffffffffffffffff92831692633dbb202b9216907f0166a07a0000000000000000000000000000000000000000000000000000000090611f42908b908d908c908c908c908b90602401612ef4565b604080517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe08184030181529181526020820180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff167fffffffff000000000000000000000000000000000000000000000000000000009485161790525160e085901b9092168252611fd592918790600401612e40565b600060405180830381600087803b158015611fef57600080fd5b505af1158015612003573d6000803e3d6000fd5b5050505050505050505050565b6109c987878787878787611c57565b600054610100900460ff166120b6576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602b60248201527f496e697469616c697a61626c653a20636f6e7472616374206973206e6f74206960448201527f6e697469616c697a696e670000000000000000000000000000000000000000006064820152608401610214565b6003805473ffffffffffffffffffffffffffffffffffffffff9384167fffffffffffffffffffffffff00000000000000000000000000000000000000009182161790915560048054929093169116179055565b8273ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff167f35d79ab81f2b2017e19afb5c5571778877782d7a8786f5907f93b0f4702f4f238484604051612168929190612ec3565b60405180910390a36105b284848484612529565b600061218783612588565b8015612198575061219883836125ec565b9392505050565b6000612201826040518060400160405280602081526020017f5361666545524332303a206c6f772d6c6576656c2063616c6c206661696c65648152508573ffffffffffffffffffffffffffffffffffffffff166126bb9092919063ffffffff16565b805190915015610aa4578080602001905181019061221f9190612dd5565b610aa4576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602a60248201527f5361666545524332303a204552433230206f7065726174696f6e20646964206e60448201527f6f742073756363656564000000000000000000000000000000000000000000006064820152608401610214565b8373ffffffffffffffffffffffffffffffffffffffff168573ffffffffffffffffffffffffffffffffffffffff168773ffffffffffffffffffffffffffffffffffffffff167fd59c65b35445225835c83f50b6ede06a7be047d22e357073e250d9af537518cd86868660405161232393929190612e85565b60405180910390a4505050505050565b603354604080517f4397dfef0000000000000000000000000000000000000000000000000000000081528151600093849373ffffffffffffffffffffffffffffffffffffffff90911692634397dfef92600480830193928290030181865afa1580156123a3573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906123c79190612f4f565b90939092509050565b8273ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff167f31b2166ff604fc5672ea5df08a78081d2bc6d746cadce880747f3643d819e83d848460405161242f929190612ec3565b60405180910390a350505050565b60405173ffffffffffffffffffffffffffffffffffffffff808516602483015283166044820152606481018290526105b29085907f23b872dd0000000000000000000000000000000000000000000000000000000090608401611a7d565b8373ffffffffffffffffffffffffffffffffffffffff168573ffffffffffffffffffffffffffffffffffffffff168773ffffffffffffffffffffffffffffffffffffffff167f718594027abd4eaed59f95162563e0cc6d0e8d5b86b1c7be8b1b0ac3343d039686868660405161251393929190612e85565b60405180910390a46110138686868686866126d2565b8273ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff167f2849b43074093a05396b6f2a937dee8565b15a48a7b3d4bffb732a5017380af5848460405161242f929190612ec3565b60006125b4827f01ffc9a7000000000000000000000000000000000000000000000000000000006125ec565b801561190557506125e5827fffffffff000000000000000000000000000000000000000000000000000000006125ec565b1592915050565b604080517fffffffff000000000000000000000000000000000000000000000000000000008316602480830191909152825180830390910181526044909101909152602080820180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff167f01ffc9a700000000000000000000000000000000000000000000000000000000178152825160009392849283928392918391908a617530fa92503d915060005190508280156126a4575060208210155b80156126b05750600081115b979650505050505050565b60606126ca848460008561274a565b949350505050565b8373ffffffffffffffffffffffffffffffffffffffff168573ffffffffffffffffffffffffffffffffffffffff168773ffffffffffffffffffffffffffffffffffffffff167f7ff126db8024424bbfd9826e8ab82ff59136289ea440b04b39a0df1b03b9cabf86868660405161232393929190612e85565b6060824710156127dc576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602660248201527f416464726573733a20696e73756666696369656e742062616c616e636520666f60448201527f722063616c6c00000000000000000000000000000000000000000000000000006064820152608401610214565b73ffffffffffffffffffffffffffffffffffffffff85163b61285a576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601d60248201527f416464726573733a2063616c6c20746f206e6f6e2d636f6e74726163740000006044820152606401610214565b6000808673ffffffffffffffffffffffffffffffffffffffff1685876040516128839190612f84565b60006040518083038185875af1925050503d80600081146128c0576040519150601f19603f3d011682016040523d82523d6000602084013e6128c5565b606091505b50915091506126b0828286606083156128df575081612198565b8251156128ef5782518084602001fd5b816040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016102149190612bf5565b73ffffffffffffffffffffffffffffffffffffffff8116811461294557600080fd5b50565b60008083601f84011261295a57600080fd5b50813567ffffffffffffffff81111561297257600080fd5b60208301915083602082850101111561298a57600080fd5b9250929050565b600080600080600080600060c0888a0312156129ac57600080fd5b87356129b781612923565b965060208801356129c781612923565b955060408801356129d781612923565b945060608801356129e781612923565b93506080880135925060a088013567ffffffffffffffff811115612a0a57600080fd5b612a168a828b01612948565b989b979a50959850939692959293505050565b803563ffffffff81168114612a3d57600080fd5b919050565b600080600060408486031215612a5757600080fd5b612a6084612a29565b9250602084013567ffffffffffffffff811115612a7c57600080fd5b612a8886828701612948565b9497909650939450505050565b600080600080600060808688031215612aad57600080fd5b8535612ab881612923565b94506020860135612ac881612923565b935060408601359250606086013567ffffffffffffffff811115612aeb57600080fd5b612af788828901612948565b969995985093965092949392505050565b600080600080600080600060c0888a031215612b2357600080fd5b8735612b2e81612923565b96506020880135612b3e81612923565b95506040880135612b4e81612923565b945060608801359350612b6360808901612a29565b925060a088013567ffffffffffffffff811115612a0a57600080fd5b60005b83811015612b9a578181015183820152602001612b82565b838111156105b25750506000910152565b60008151808452612bc3816020860160208601612b7f565b601f017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0169290920160200192915050565b6020815260006121986020830184612bab565b60008060008060008060a08789031215612c2157600080fd5b8635612c2c81612923565b95506020870135612c3c81612923565b945060408701359350612c5160608801612a29565b9250608087013567ffffffffffffffff811115612c6d57600080fd5b612c7989828a01612948565b979a9699509497509295939492505050565b60008060408385031215612c9e57600080fd5b8235612ca981612923565b91506020830135612cb981612923565b809150509250929050565b60008060008060608587031215612cda57600080fd5b8435612ce581612923565b9350612cf360208601612a29565b9250604085013567ffffffffffffffff811115612d0f57600080fd5b612d1b87828801612948565b95989497509550505050565b600080600060608486031215612d3c57600080fd5b8335612d4781612923565b92506020840135612d5781612923565b91506040840135612d6781612923565b809150509250925092565b600060208284031215612d8457600080fd5b815161219881612923565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b600082821015612dd057612dd0612d8f565b500390565b600060208284031215612de757600080fd5b8151801515811461219857600080fd5b600073ffffffffffffffffffffffffffffffffffffffff808716835280861660208401525083604083015260806060830152612e366080830184612bab565b9695505050505050565b73ffffffffffffffffffffffffffffffffffffffff84168152606060208201526000612e6f6060830185612bab565b905063ffffffff83166040830152949350505050565b73ffffffffffffffffffffffffffffffffffffffff84168152826020820152606060408201526000612eba6060830184612bab565b95945050505050565b8281526040602082015260006126ca6040830184612bab565b60008219821115612eef57612eef612d8f565b500190565b600073ffffffffffffffffffffffffffffffffffffffff80891683528088166020840152808716604084015280861660608401525083608083015260c060a0830152612f4360c0830184612bab565b98975050505050505050565b60008060408385031215612f6257600080fd5b8251612f6d81612923565b602084015190925060ff81168114612cb957600080fd5b60008251612f96818460208701612b7f565b919091019291505056fea164736f6c634300080f000a"; bytes internal constant l1ERC721BridgeCode = - hex"608060405234801561001057600080fd5b50600436106100d45760003560e01c80635d93a3fc11610081578063927ede2d1161005b578063927ede2d14610231578063aa5574521461024f578063c89701a21461026257600080fd5b80635d93a3fc146101cc578063761f4493146102005780637f46ddb21461021357600080fd5b8063485cc955116100b2578063485cc9551461015857806354fd4d501461016b5780635c975abb146101b457600080fd5b806335e80ab3146100d95780633687011a146101235780633cb747bf14610138575b600080fd5b6032546100f99073ffffffffffffffffffffffffffffffffffffffff1681565b60405173ffffffffffffffffffffffffffffffffffffffff90911681526020015b60405180910390f35b610136610131366004610fe1565b610282565b005b6001546100f99073ffffffffffffffffffffffffffffffffffffffff1681565b610136610166366004611064565b61032e565b6101a76040518060400160405280600581526020017f322e312e3000000000000000000000000000000000000000000000000000000081525081565b60405161011a9190611108565b6101bc610518565b604051901515815260200161011a565b6101bc6101da366004611122565b603160209081526000938452604080852082529284528284209052825290205460ff1681565b61013661020e366004611163565b6105b1565b60025473ffffffffffffffffffffffffffffffffffffffff166100f9565b60015473ffffffffffffffffffffffffffffffffffffffff166100f9565b61013661025d3660046111fb565b610a58565b6002546100f99073ffffffffffffffffffffffffffffffffffffffff1681565b333b15610316576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602d60248201527f4552433732314272696467653a206163636f756e74206973206e6f742065787460448201527f65726e616c6c79206f776e65640000000000000000000000000000000000000060648201526084015b60405180910390fd5b6103268686333388888888610b30565b505050505050565b600054610100900460ff161580801561034e5750600054600160ff909116105b806103685750303b158015610368575060005460ff166001145b6103f4576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602e60248201527f496e697469616c697a61626c653a20636f6e747261637420697320616c72656160448201527f647920696e697469616c697a6564000000000000000000000000000000000000606482015260840161030d565b600080547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00166001179055801561045257600080547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00ff166101001790555b603280547fffffffffffffffffffffffff00000000000000000000000000000000000000001673ffffffffffffffffffffffffffffffffffffffff84161790556104b083734200000000000000000000000000000000000014610e70565b801561051357600080547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00ff169055604051600181527f7f26b83ff96e1f2b6a682f133852f6798a09c465da95921460cefb38474024989060200160405180910390a15b505050565b603254604080517f5c975abb000000000000000000000000000000000000000000000000000000008152905160009273ffffffffffffffffffffffffffffffffffffffff1691635c975abb9160048083019260209291908290030181865afa158015610588573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906105ac9190611272565b905090565b60015473ffffffffffffffffffffffffffffffffffffffff16331480156106865750600254600154604080517f6e296e45000000000000000000000000000000000000000000000000000000008152905173ffffffffffffffffffffffffffffffffffffffff9384169390921691636e296e45916004808201926020929091908290030181865afa15801561064a573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061066e9190611294565b73ffffffffffffffffffffffffffffffffffffffff16145b610712576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152603f60248201527f4552433732314272696467653a2066756e6374696f6e2063616e206f6e6c792060448201527f62652063616c6c65642066726f6d20746865206f746865722062726964676500606482015260840161030d565b61071a610518565b15610781576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601660248201527f4c314552433732314272696467653a2070617573656400000000000000000000604482015260640161030d565b3073ffffffffffffffffffffffffffffffffffffffff881603610826576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602a60248201527f4c314552433732314272696467653a206c6f63616c20746f6b656e2063616e6e60448201527f6f742062652073656c6600000000000000000000000000000000000000000000606482015260840161030d565b73ffffffffffffffffffffffffffffffffffffffff8088166000908152603160209081526040808320938a1683529281528282208683529052205460ff1615156001146108f5576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152603960248201527f4c314552433732314272696467653a20546f6b656e204944206973206e6f742060448201527f657363726f77656420696e20746865204c312042726964676500000000000000606482015260840161030d565b73ffffffffffffffffffffffffffffffffffffffff87811660008181526031602090815260408083208b8616845282528083208884529091529081902080547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00169055517f42842e0e000000000000000000000000000000000000000000000000000000008152306004820152918616602483015260448201859052906342842e0e90606401600060405180830381600087803b1580156109b557600080fd5b505af11580156109c9573d6000803e3d6000fd5b505050508473ffffffffffffffffffffffffffffffffffffffff168673ffffffffffffffffffffffffffffffffffffffff168873ffffffffffffffffffffffffffffffffffffffff167f1f39bf6707b5d608453e0ae4c067b562bcc4c85c0f562ef5d2c774d2e7f131ac87878787604051610a4794939291906112fa565b60405180910390a450505050505050565b73ffffffffffffffffffffffffffffffffffffffff8516610afb576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152603060248201527f4552433732314272696467653a206e667420726563697069656e742063616e6e60448201527f6f74206265206164647265737328302900000000000000000000000000000000606482015260840161030d565b610b0b8787338888888888610b30565b50505050505050565b73ffffffffffffffffffffffffffffffffffffffff163b151590565b73ffffffffffffffffffffffffffffffffffffffff8716610bd3576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152603160248201527f4c314552433732314272696467653a2072656d6f746520746f6b656e2063616e60448201527f6e6f742062652061646472657373283029000000000000000000000000000000606482015260840161030d565b600063761f449360e01b888a8989898888604051602401610bfa979695949392919061133a565b604080517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0818403018152918152602080830180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff167fffffffff00000000000000000000000000000000000000000000000000000000959095169490941790935273ffffffffffffffffffffffffffffffffffffffff8c81166000818152603186528381208e8416825286528381208b82529095529382902080547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0016600117905590517f23b872dd000000000000000000000000000000000000000000000000000000008152908a166004820152306024820152604481018890529092506323b872dd90606401600060405180830381600087803b158015610d3a57600080fd5b505af1158015610d4e573d6000803e3d6000fd5b50506001546002546040517f3dbb202b00000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff9283169450633dbb202b9350610db1929091169085908990600401611397565b600060405180830381600087803b158015610dcb57600080fd5b505af1158015610ddf573d6000803e3d6000fd5b505050508673ffffffffffffffffffffffffffffffffffffffff168873ffffffffffffffffffffffffffffffffffffffff168a73ffffffffffffffffffffffffffffffffffffffff167fb7460e2a880f256ebef3406116ff3eee0cee51ebccdc2a40698f87ebb2e9c1a589898888604051610e5d94939291906112fa565b60405180910390a4505050505050505050565b600054610100900460ff16610f07576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602b60248201527f496e697469616c697a61626c653a20636f6e7472616374206973206e6f74206960448201527f6e697469616c697a696e67000000000000000000000000000000000000000000606482015260840161030d565b6001805473ffffffffffffffffffffffffffffffffffffffff9384167fffffffffffffffffffffffff00000000000000000000000000000000000000009182161790915560028054929093169116179055565b73ffffffffffffffffffffffffffffffffffffffff81168114610f7c57600080fd5b50565b803563ffffffff81168114610f9357600080fd5b919050565b60008083601f840112610faa57600080fd5b50813567ffffffffffffffff811115610fc257600080fd5b602083019150836020828501011115610fda57600080fd5b9250929050565b60008060008060008060a08789031215610ffa57600080fd5b863561100581610f5a565b9550602087013561101581610f5a565b94506040870135935061102a60608801610f7f565b9250608087013567ffffffffffffffff81111561104657600080fd5b61105289828a01610f98565b979a9699509497509295939492505050565b6000806040838503121561107757600080fd5b823561108281610f5a565b9150602083013561109281610f5a565b809150509250929050565b6000815180845260005b818110156110c3576020818501810151868301820152016110a7565b818111156110d5576000602083870101525b50601f017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0169290920160200192915050565b60208152600061111b602083018461109d565b9392505050565b60008060006060848603121561113757600080fd5b833561114281610f5a565b9250602084013561115281610f5a565b929592945050506040919091013590565b600080600080600080600060c0888a03121561117e57600080fd5b873561118981610f5a565b9650602088013561119981610f5a565b955060408801356111a981610f5a565b945060608801356111b981610f5a565b93506080880135925060a088013567ffffffffffffffff8111156111dc57600080fd5b6111e88a828b01610f98565b989b979a50959850939692959293505050565b600080600080600080600060c0888a03121561121657600080fd5b873561122181610f5a565b9650602088013561123181610f5a565b9550604088013561124181610f5a565b94506060880135935061125660808901610f7f565b925060a088013567ffffffffffffffff8111156111dc57600080fd5b60006020828403121561128457600080fd5b8151801515811461111b57600080fd5b6000602082840312156112a657600080fd5b815161111b81610f5a565b8183528181602085013750600060208284010152600060207fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0601f840116840101905092915050565b73ffffffffffffffffffffffffffffffffffffffff851681528360208201526060604082015260006113306060830184866112b1565b9695505050505050565b600073ffffffffffffffffffffffffffffffffffffffff808a1683528089166020840152808816604084015280871660608401525084608083015260c060a083015261138a60c0830184866112b1565b9998505050505050505050565b73ffffffffffffffffffffffffffffffffffffffff841681526060602082015260006113c6606083018561109d565b905063ffffffff8316604083015294935050505056fea164736f6c634300080f000a"; + hex"608060405234801561001057600080fd5b50600436106100d45760003560e01c80635d93a3fc11610081578063927ede2d1161005b578063927ede2d14610231578063aa5574521461024f578063c89701a21461026257600080fd5b80635d93a3fc146101cc578063761f4493146102005780637f46ddb21461021357600080fd5b8063485cc955116100b2578063485cc9551461015857806354fd4d501461016b5780635c975abb146101b457600080fd5b806335e80ab3146100d95780633687011a146101235780633cb747bf14610138575b600080fd5b6032546100f99073ffffffffffffffffffffffffffffffffffffffff1681565b60405173ffffffffffffffffffffffffffffffffffffffff90911681526020015b60405180910390f35b610136610131366004610fe1565b610282565b005b6001546100f99073ffffffffffffffffffffffffffffffffffffffff1681565b610136610166366004611064565b61032e565b6101a76040518060400160405280600c81526020017f322e312e312d626574612e32000000000000000000000000000000000000000081525081565b60405161011a9190611108565b6101bc610518565b604051901515815260200161011a565b6101bc6101da366004611122565b603160209081526000938452604080852082529284528284209052825290205460ff1681565b61013661020e366004611163565b6105b1565b60025473ffffffffffffffffffffffffffffffffffffffff166100f9565b60015473ffffffffffffffffffffffffffffffffffffffff166100f9565b61013661025d3660046111fb565b610a58565b6002546100f99073ffffffffffffffffffffffffffffffffffffffff1681565b333b15610316576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602d60248201527f4552433732314272696467653a206163636f756e74206973206e6f742065787460448201527f65726e616c6c79206f776e65640000000000000000000000000000000000000060648201526084015b60405180910390fd5b6103268686333388888888610b30565b505050505050565b600054610100900460ff161580801561034e5750600054600160ff909116105b806103685750303b158015610368575060005460ff166001145b6103f4576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602e60248201527f496e697469616c697a61626c653a20636f6e747261637420697320616c72656160448201527f647920696e697469616c697a6564000000000000000000000000000000000000606482015260840161030d565b600080547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00166001179055801561045257600080547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00ff166101001790555b603280547fffffffffffffffffffffffff00000000000000000000000000000000000000001673ffffffffffffffffffffffffffffffffffffffff84161790556104b083734200000000000000000000000000000000000014610e70565b801561051357600080547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00ff169055604051600181527f7f26b83ff96e1f2b6a682f133852f6798a09c465da95921460cefb38474024989060200160405180910390a15b505050565b603254604080517f5c975abb000000000000000000000000000000000000000000000000000000008152905160009273ffffffffffffffffffffffffffffffffffffffff1691635c975abb9160048083019260209291908290030181865afa158015610588573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906105ac9190611272565b905090565b60015473ffffffffffffffffffffffffffffffffffffffff16331480156106865750600254600154604080517f6e296e45000000000000000000000000000000000000000000000000000000008152905173ffffffffffffffffffffffffffffffffffffffff9384169390921691636e296e45916004808201926020929091908290030181865afa15801561064a573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061066e9190611294565b73ffffffffffffffffffffffffffffffffffffffff16145b610712576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152603f60248201527f4552433732314272696467653a2066756e6374696f6e2063616e206f6e6c792060448201527f62652063616c6c65642066726f6d20746865206f746865722062726964676500606482015260840161030d565b61071a610518565b15610781576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601660248201527f4c314552433732314272696467653a2070617573656400000000000000000000604482015260640161030d565b3073ffffffffffffffffffffffffffffffffffffffff881603610826576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602a60248201527f4c314552433732314272696467653a206c6f63616c20746f6b656e2063616e6e60448201527f6f742062652073656c6600000000000000000000000000000000000000000000606482015260840161030d565b73ffffffffffffffffffffffffffffffffffffffff8088166000908152603160209081526040808320938a1683529281528282208683529052205460ff1615156001146108f5576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152603960248201527f4c314552433732314272696467653a20546f6b656e204944206973206e6f742060448201527f657363726f77656420696e20746865204c312042726964676500000000000000606482015260840161030d565b73ffffffffffffffffffffffffffffffffffffffff87811660008181526031602090815260408083208b8616845282528083208884529091529081902080547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00169055517f42842e0e000000000000000000000000000000000000000000000000000000008152306004820152918616602483015260448201859052906342842e0e90606401600060405180830381600087803b1580156109b557600080fd5b505af11580156109c9573d6000803e3d6000fd5b505050508473ffffffffffffffffffffffffffffffffffffffff168673ffffffffffffffffffffffffffffffffffffffff168873ffffffffffffffffffffffffffffffffffffffff167f1f39bf6707b5d608453e0ae4c067b562bcc4c85c0f562ef5d2c774d2e7f131ac87878787604051610a4794939291906112fa565b60405180910390a450505050505050565b73ffffffffffffffffffffffffffffffffffffffff8516610afb576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152603060248201527f4552433732314272696467653a206e667420726563697069656e742063616e6e60448201527f6f74206265206164647265737328302900000000000000000000000000000000606482015260840161030d565b610b0b8787338888888888610b30565b50505050505050565b73ffffffffffffffffffffffffffffffffffffffff163b151590565b73ffffffffffffffffffffffffffffffffffffffff8716610bd3576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152603160248201527f4c314552433732314272696467653a2072656d6f746520746f6b656e2063616e60448201527f6e6f742062652061646472657373283029000000000000000000000000000000606482015260840161030d565b600063761f449360e01b888a8989898888604051602401610bfa979695949392919061133a565b604080517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0818403018152918152602080830180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff167fffffffff00000000000000000000000000000000000000000000000000000000959095169490941790935273ffffffffffffffffffffffffffffffffffffffff8c81166000818152603186528381208e8416825286528381208b82529095529382902080547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0016600117905590517f23b872dd000000000000000000000000000000000000000000000000000000008152908a166004820152306024820152604481018890529092506323b872dd90606401600060405180830381600087803b158015610d3a57600080fd5b505af1158015610d4e573d6000803e3d6000fd5b50506001546002546040517f3dbb202b00000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff9283169450633dbb202b9350610db1929091169085908990600401611397565b600060405180830381600087803b158015610dcb57600080fd5b505af1158015610ddf573d6000803e3d6000fd5b505050508673ffffffffffffffffffffffffffffffffffffffff168873ffffffffffffffffffffffffffffffffffffffff168a73ffffffffffffffffffffffffffffffffffffffff167fb7460e2a880f256ebef3406116ff3eee0cee51ebccdc2a40698f87ebb2e9c1a589898888604051610e5d94939291906112fa565b60405180910390a4505050505050505050565b600054610100900460ff16610f07576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602b60248201527f496e697469616c697a61626c653a20636f6e7472616374206973206e6f74206960448201527f6e697469616c697a696e67000000000000000000000000000000000000000000606482015260840161030d565b6001805473ffffffffffffffffffffffffffffffffffffffff9384167fffffffffffffffffffffffff00000000000000000000000000000000000000009182161790915560028054929093169116179055565b73ffffffffffffffffffffffffffffffffffffffff81168114610f7c57600080fd5b50565b803563ffffffff81168114610f9357600080fd5b919050565b60008083601f840112610faa57600080fd5b50813567ffffffffffffffff811115610fc257600080fd5b602083019150836020828501011115610fda57600080fd5b9250929050565b60008060008060008060a08789031215610ffa57600080fd5b863561100581610f5a565b9550602087013561101581610f5a565b94506040870135935061102a60608801610f7f565b9250608087013567ffffffffffffffff81111561104657600080fd5b61105289828a01610f98565b979a9699509497509295939492505050565b6000806040838503121561107757600080fd5b823561108281610f5a565b9150602083013561109281610f5a565b809150509250929050565b6000815180845260005b818110156110c3576020818501810151868301820152016110a7565b818111156110d5576000602083870101525b50601f017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0169290920160200192915050565b60208152600061111b602083018461109d565b9392505050565b60008060006060848603121561113757600080fd5b833561114281610f5a565b9250602084013561115281610f5a565b929592945050506040919091013590565b600080600080600080600060c0888a03121561117e57600080fd5b873561118981610f5a565b9650602088013561119981610f5a565b955060408801356111a981610f5a565b945060608801356111b981610f5a565b93506080880135925060a088013567ffffffffffffffff8111156111dc57600080fd5b6111e88a828b01610f98565b989b979a50959850939692959293505050565b600080600080600080600060c0888a03121561121657600080fd5b873561122181610f5a565b9650602088013561123181610f5a565b9550604088013561124181610f5a565b94506060880135935061125660808901610f7f565b925060a088013567ffffffffffffffff8111156111dc57600080fd5b60006020828403121561128457600080fd5b8151801515811461111b57600080fd5b6000602082840312156112a657600080fd5b815161111b81610f5a565b8183528181602085013750600060208284010152600060207fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0601f840116840101905092915050565b73ffffffffffffffffffffffffffffffffffffffff851681528360208201526060604082015260006113306060830184866112b1565b9695505050505050565b600073ffffffffffffffffffffffffffffffffffffffff808a1683528089166020840152808816604084015280871660608401525084608083015260c060a083015261138a60c0830184866112b1565b9998505050505050505050565b73ffffffffffffffffffffffffffffffffffffffff841681526060602082015260006113c6606083018561109d565b905063ffffffff8316604083015294935050505056fea164736f6c634300080f000a"; + bytes internal constant optimismPortalCode = + hex"6080604052600436106101635760003560e01c80638c3152e9116100c0578063b69ef8a811610074578063cff0ab9611610059578063cff0ab9614610444578063e965084c146104e5578063e9e05c421461057157600080fd5b8063b69ef8a814610401578063c0c53b8b1461042457600080fd5b80639bf62d82116100a55780639bf62d821461036b578063a14238e714610398578063a35d99df146103c857600080fd5b80638c3152e91461031e5780639b5f694a1461033e57600080fd5b806354fd4d50116101175780636dbffb78116100fc5780636dbffb78146102de57806371cfaa3f146102fe5780638b4c40b01461018857600080fd5b806354fd4d501461026d5780635c975abb146102b957600080fd5b806335e80ab31161014857806335e80ab314610206578063452a9320146102385780634870496f1461024d57600080fd5b8063149f2f221461018f57806333d7e2bd146101af57600080fd5b3661018a576101883334620186a060006040518060200160405280600081525061057f565b005b600080fd5b34801561019b57600080fd5b506101886101aa366004614c13565b610624565b3480156101bb57600080fd5b506037546101dc9073ffffffffffffffffffffffffffffffffffffffff1681565b60405173ffffffffffffffffffffffffffffffffffffffff90911681526020015b60405180910390f35b34801561021257600080fd5b506035546101dc90610100900473ffffffffffffffffffffffffffffffffffffffff1681565b34801561024457600080fd5b506101dc610865565b34801561025957600080fd5b50610188610268366004614d47565b6108fd565b34801561027957600080fd5b50604080518082018252600c81527f322e382e312d626574612e320000000000000000000000000000000000000000602082015290516101fd9190614e99565b3480156102c557600080fd5b506102ce610eaa565b60405190151581526020016101fd565b3480156102ea57600080fd5b506102ce6102f9366004614eac565b610f3d565b34801561030a57600080fd5b50610188610319366004614ed4565b610ff8565b34801561032a57600080fd5b50610188610339366004614f1a565b6111ba565b34801561034a57600080fd5b506036546101dc9073ffffffffffffffffffffffffffffffffffffffff1681565b34801561037757600080fd5b506032546101dc9073ffffffffffffffffffffffffffffffffffffffff1681565b3480156103a457600080fd5b506102ce6103b3366004614eac565b60336020526000908152604090205460ff1681565b3480156103d457600080fd5b506103e86103e3366004614f57565b611c3c565b60405167ffffffffffffffff90911681526020016101fd565b34801561040d57600080fd5b50610416611c55565b6040519081526020016101fd565b34801561043057600080fd5b5061018861043f366004614f72565b611caf565b34801561045057600080fd5b506001546104ac906fffffffffffffffffffffffffffffffff81169067ffffffffffffffff7001000000000000000000000000000000008204811691780100000000000000000000000000000000000000000000000090041683565b604080516fffffffffffffffffffffffffffffffff909416845267ffffffffffffffff92831660208501529116908201526060016101fd565b3480156104f157600080fd5b50610543610500366004614eac565b603460205260009081526040902080546001909101546fffffffffffffffffffffffffffffffff8082169170010000000000000000000000000000000090041683565b604080519384526fffffffffffffffffffffffffffffffff92831660208501529116908201526060016101fd565b61018861057f366004614fbd565b8260005a9050600061058f611f19565b50905073ffffffffffffffffffffffffffffffffffffffff811673eeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeee148015906105cb57503415155b15610602576040517ff2365b5b00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b610610883489898989611fb6565b5061061b8282612162565b50505050505050565b8260005a90506000610634611f19565b5090507fffffffffffffffffffffffff111111111111111111111111111111111111111273ffffffffffffffffffffffffffffffffffffffff8216016106a6576040517f0eaf3c0f00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b87603d60008282546106b89190615069565b90915550506040517f70a0823100000000000000000000000000000000000000000000000000000000815230600482015260009073ffffffffffffffffffffffffffffffffffffffff8316906370a0823190602401602060405180830381865afa15801561072a573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061074e9190615081565b905061077273ffffffffffffffffffffffffffffffffffffffff831633308c61242f565b61077c8982615069565b6040517f70a0823100000000000000000000000000000000000000000000000000000000815230600482015273ffffffffffffffffffffffffffffffffffffffff8416906370a0823190602401602060405180830381865afa1580156107e6573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061080a9190615081565b14610841576040517f90b8ec1800000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b61084f8a8a8a8a8a8a611fb6565b505061085b8282612162565b5050505050505050565b6000603560019054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1663452a93206040518163ffffffff1660e01b8152600401602060405180830381865afa1580156108d4573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906108f8919061509a565b905090565b610905610eaa565b1561093c576040517ff480973e00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b3073ffffffffffffffffffffffffffffffffffffffff16856040015173ffffffffffffffffffffffffffffffffffffffff16036109a5576040517f13496fda00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6036546040517fa25ae5570000000000000000000000000000000000000000000000000000000081526004810186905260009173ffffffffffffffffffffffffffffffffffffffff169063a25ae55790602401606060405180830381865afa158015610a15573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610a3991906150d7565b519050610a53610a4e3686900386018661513c565b61250b565b8114610ae6576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602960248201527f4f7074696d69736d506f7274616c3a20696e76616c6964206f7574707574207260448201527f6f6f742070726f6f66000000000000000000000000000000000000000000000060648201526084015b60405180910390fd5b6000610af187612567565b6000818152603460209081526040918290208251606081018452815481526001909101546fffffffffffffffffffffffffffffffff8082169383018490527001000000000000000000000000000000009091041692810192909252919250901580610c075750805160365460408084015190517fa25ae5570000000000000000000000000000000000000000000000000000000081526fffffffffffffffffffffffffffffffff909116600482015273ffffffffffffffffffffffffffffffffffffffff9091169063a25ae55790602401606060405180830381865afa158015610bdf573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610c0391906150d7565b5114155b610c93576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152603760248201527f4f7074696d69736d506f7274616c3a207769746864726177616c20686173682060448201527f68617320616c7265616479206265656e2070726f76656e0000000000000000006064820152608401610add565b60408051602081018490526000918101829052606001604080517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe081840301815282825280516020918201209083018190529250610d5c9101604080517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0818403018152828201909152600182527f0100000000000000000000000000000000000000000000000000000000000000602083015290610d52888a6151a2565b8a60400135612597565b610de8576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152603260248201527f4f7074696d69736d506f7274616c3a20696e76616c696420776974686472617760448201527f616c20696e636c7573696f6e2070726f6f6600000000000000000000000000006064820152608401610add565b604080516060810182528581526fffffffffffffffffffffffffffffffff42811660208084019182528c831684860190815260008981526034835286812095518655925190518416700100000000000000000000000000000000029316929092176001909301929092558b830151908c0151925173ffffffffffffffffffffffffffffffffffffffff918216939091169186917f67a6208cfcc0801d50f6cbe764733f4fddf66ac0b04442061a8a8c0cb6b63f629190a4505050505050505050565b6000603560019054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16635c975abb6040518163ffffffff1660e01b8152600401602060405180830381865afa158015610f19573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906108f89190615226565b6036546040517fa25ae55700000000000000000000000000000000000000000000000000000000815260048101839052600091610ff29173ffffffffffffffffffffffffffffffffffffffff9091169063a25ae55790602401606060405180830381865afa158015610fb3573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610fd791906150d7565b602001516fffffffffffffffffffffffffffffffff166125bb565b92915050565b60375473ffffffffffffffffffffffffffffffffffffffff163314611049576040517f82b4290000000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b61105562030d40612661565b60405173ffffffffffffffffffffffffffffffffffffffff8516602482015260ff8416604482015260648101839052608481018290526000907342000000000000000000000000000000000000159073deaddeaddeaddeaddeaddeaddeaddeaddead0001907fb3813568d9991fc951961fcb4c784893574240a28925604d09fc577c55bb7c32908490819062030d4090829060a401604080517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0818403018152918152602080830180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff167f71cfaa3f00000000000000000000000000000000000000000000000000000000179052905161117296959493929101615243565b604080517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0818403018152908290526111aa91614e99565b60405180910390a450505050565b565b6111c2610eaa565b156111f9576040517ff480973e00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b60325473ffffffffffffffffffffffffffffffffffffffff1661dead1461124c576040517f9396d15600000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b600061125782612567565b60008181526034602090815260408083208151606081018352815481526001909101546fffffffffffffffffffffffffffffffff80821694830185905270010000000000000000000000000000000090910416918101919091529293509003611342576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152603260248201527f4f7074696d69736d506f7274616c3a207769746864726177616c20686173206e60448201527f6f74206265656e2070726f76656e2079657400000000000000000000000000006064820152608401610add565b603660009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1663887862726040518163ffffffff1660e01b8152600401602060405180830381865afa1580156113af573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906113d39190615081565b81602001516fffffffffffffffffffffffffffffffff16101561149e576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152604b60248201527f4f7074696d69736d506f7274616c3a207769746864726177616c2074696d657360448201527f74616d70206c657373207468616e204c32204f7261636c65207374617274696e60648201527f672074696d657374616d70000000000000000000000000000000000000000000608482015260a401610add565b6114bd81602001516fffffffffffffffffffffffffffffffff166125bb565b61156f576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152604560248201527f4f7074696d69736d506f7274616c3a2070726f76656e2077697468647261776160448201527f6c2066696e616c697a6174696f6e20706572696f6420686173206e6f7420656c60648201527f6170736564000000000000000000000000000000000000000000000000000000608482015260a401610add565b60365460408281015190517fa25ae5570000000000000000000000000000000000000000000000000000000081526fffffffffffffffffffffffffffffffff909116600482015260009173ffffffffffffffffffffffffffffffffffffffff169063a25ae55790602401606060405180830381865afa1580156115f6573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061161a91906150d7565b82518151919250146116d4576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152604960248201527f4f7074696d69736d506f7274616c3a206f757470757420726f6f742070726f7660448201527f656e206973206e6f74207468652073616d652061732063757272656e74206f7560648201527f7470757420726f6f740000000000000000000000000000000000000000000000608482015260a401610add565b6116f381602001516fffffffffffffffffffffffffffffffff166125bb565b6117a5576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152604360248201527f4f7074696d69736d506f7274616c3a206f75747075742070726f706f73616c2060448201527f66696e616c697a6174696f6e20706572696f6420686173206e6f7420656c617060648201527f7365640000000000000000000000000000000000000000000000000000000000608482015260a401610add565b60008381526033602052604090205460ff1615611844576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152603560248201527f4f7074696d69736d506f7274616c3a207769746864726177616c20686173206160448201527f6c7265616479206265656e2066696e616c697a656400000000000000000000006064820152608401610add565b6000838152603360209081526040822080547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff001660011790558501516032805473ffffffffffffffffffffffffffffffffffffffff9092167fffffffffffffffffffffffff0000000000000000000000000000000000000000909216919091179055806118cf611f19565b5090507fffffffffffffffffffffffff111111111111111111111111111111111111111273ffffffffffffffffffffffffffffffffffffffff8216016119325761192b8660400151876080015188606001518960a001516126c3565b9150611b85565b8073ffffffffffffffffffffffffffffffffffffffff16866040015173ffffffffffffffffffffffffffffffffffffffff160361199b576040517f13496fda00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b606086015115611b5c578560600151603d60008282546119bb91906152a8565b90915550506040517f70a0823100000000000000000000000000000000000000000000000000000000815230600482015260009073ffffffffffffffffffffffffffffffffffffffff8316906370a0823190602401602060405180830381865afa158015611a2d573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611a519190615081565b9050611a86876040015188606001518473ffffffffffffffffffffffffffffffffffffffff166127219092919063ffffffff16565b6060870151611a9590826152a8565b6040517f70a0823100000000000000000000000000000000000000000000000000000000815230600482015273ffffffffffffffffffffffffffffffffffffffff8416906370a0823190602401602060405180830381865afa158015611aff573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611b239190615081565b14611b5a576040517f90b8ec1800000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b505b60a08601515115611b805761192b8660400151876080015160008960a001516126c3565b600191505b603280547fffffffffffffffffffffffff00000000000000000000000000000000000000001661dead17905560405185907fdb5c7652857aa163daadd670e116628fb42e869d8ac4251ef8971d9e5727df1b90611be790851515815260200190565b60405180910390a281158015611bfd5750326001145b15611c34576040517feeae4ed300000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b505050505050565b6000611c498260106152bf565b610ff2906152086152ef565b600080611c60611f19565b5090507fffffffffffffffffffffffff111111111111111111111111111111111111111273ffffffffffffffffffffffffffffffffffffffff821601611ca7574791505090565b5050603d5490565b600054610100900460ff1615808015611ccf5750600054600160ff909116105b80611ce95750303b158015611ce9575060005460ff166001145b611d75576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602e60248201527f496e697469616c697a61626c653a20636f6e747261637420697320616c72656160448201527f647920696e697469616c697a65640000000000000000000000000000000000006064820152608401610add565b600080547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff001660011790558015611dd357600080547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00ff166101001790555b603680547fffffffffffffffffffffffff000000000000000000000000000000000000000090811673ffffffffffffffffffffffffffffffffffffffff8781169190911790925560378054909116858316179055603580547fffffffffffffffffffffff0000000000000000000000000000000000000000ff166101008584160217905560325416611e8c57603280547fffffffffffffffffffffffff00000000000000000000000000000000000000001661dead1790555b611e9461277c565b8015611ef757600080547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00ff169055604051600181527f7f26b83ff96e1f2b6a682f133852f6798a09c465da95921460cefb38474024989060200160405180910390a15b50505050565b73ffffffffffffffffffffffffffffffffffffffff163b151590565b603754604080517f4397dfef0000000000000000000000000000000000000000000000000000000081528151600093849373ffffffffffffffffffffffffffffffffffffffff90911692634397dfef92600480830193928290030181865afa158015611f89573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611fad919061531b565b90939092509050565b818015611fd8575073ffffffffffffffffffffffffffffffffffffffff861615155b1561200f576040517f13496fda00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6120198151611c3c565b67ffffffffffffffff168367ffffffffffffffff161015612066576040517f4929b80800000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6201d4c0815111156120a4576040517f73052b0f00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b333281146120c5575033731111000000000000000000000000000000001111015b600086868686866040516020016120e0959493929190615243565b604051602081830303815290604052905060008873ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff167fb3813568d9991fc951961fcb4c784893574240a28925604d09fc577c55bb7c32846040516121509190614e99565b60405180910390a45050505050505050565b600154600090612198907801000000000000000000000000000000000000000000000000900467ffffffffffffffff16436152a8565b905060006121a461288f565b90506000816020015160ff16826000015163ffffffff166121c59190615384565b905082156122fc576001546000906121fc908390700100000000000000000000000000000000900467ffffffffffffffff166153ec565b90506000836040015160ff16836122139190615460565b6001546122339084906fffffffffffffffffffffffffffffffff16615460565b61223d9190615384565b60015490915060009061228e906122679084906fffffffffffffffffffffffffffffffff1661551c565b866060015163ffffffff168760a001516fffffffffffffffffffffffffffffffff166129cc565b905060018611156122bd576122ba61226782876040015160ff1660018a6122b591906152a8565b6129eb565b90505b6fffffffffffffffffffffffffffffffff16780100000000000000000000000000000000000000000000000067ffffffffffffffff4316021760015550505b6001805486919060109061232f908490700100000000000000000000000000000000900467ffffffffffffffff166152ef565b92506101000a81548167ffffffffffffffff021916908367ffffffffffffffff160217905550816000015163ffffffff16600160000160109054906101000a900467ffffffffffffffff1667ffffffffffffffff1613156123bc576040517f77ebef4d00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6001546000906123e8906fffffffffffffffffffffffffffffffff1667ffffffffffffffff8816615590565b905060006123fa48633b9aca00612a40565b61240490836155cd565b905060005a61241390886152a8565b90508082111561085b5761085b61242a82846152a8565b612a57565b60405173ffffffffffffffffffffffffffffffffffffffff80851660248301528316604482015260648101829052611ef79085907f23b872dd00000000000000000000000000000000000000000000000000000000906084015b604080517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe08184030181529190526020810180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff167fffffffff0000000000000000000000000000000000000000000000000000000090931692909217909152612a80565b6000816000015182602001518360400151846060015160405160200161254a949392919093845260208401929092526040830152606082015260800190565b604051602081830303815290604052805190602001209050919050565b80516020808301516040808501516060860151608087015160a0880151935160009761254a9790969591016155e1565b6000806125a386612b8c565b90506125b181868686612bbe565b9695505050505050565b603654604080517ff4daa291000000000000000000000000000000000000000000000000000000008152905160009273ffffffffffffffffffffffffffffffffffffffff169163f4daa2919160048083019260209291908290030181865afa15801561262b573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061264f9190615081565b6126599083615069565b421192915050565b6001805463ffffffff8316919060109061269a908490700100000000000000000000000000000000900467ffffffffffffffff166152ef565b92506101000a81548167ffffffffffffffff021916908367ffffffffffffffff16021790555050565b60008060006126d3866000612bee565b905080612709576308c379a06000526020805278185361666543616c6c3a204e6f7420656e6f756768206761736058526064601cfd5b600080855160208701888b5af1979650505050505050565b60405173ffffffffffffffffffffffffffffffffffffffff83166024820152604481018290526127779084907fa9059cbb0000000000000000000000000000000000000000000000000000000090606401612489565b505050565b600054610100900460ff16612813576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602b60248201527f496e697469616c697a61626c653a20636f6e7472616374206973206e6f74206960448201527f6e697469616c697a696e670000000000000000000000000000000000000000006064820152608401610add565b6001547801000000000000000000000000000000000000000000000000900467ffffffffffffffff166000036111b85760408051606081018252633b9aca00808252600060208301524367ffffffffffffffff169190920181905278010000000000000000000000000000000000000000000000000217600155565b6040805160c081018252600080825260208201819052918101829052606081018290526080810182905260a0810191909152603754604080517fcc731b02000000000000000000000000000000000000000000000000000000008152905160009273ffffffffffffffffffffffffffffffffffffffff169163cc731b029160048083019260c09291908290030181865afa158015612931573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190612955919061564c565b90506040518060c00160405280826000015163ffffffff168152602001826020015160ff168152602001826040015160ff168152602001826060015163ffffffff168152602001826080015163ffffffff1681526020018260a001516fffffffffffffffffffffffffffffffff1681525091505090565b60006129e16129db8585612c0c565b83612c1c565b90505b9392505050565b6000670de0b6b3a7640000612a2c612a038583615384565b612a1590670de0b6b3a76400006153ec565b612a2785670de0b6b3a7640000615460565b612c2b565b612a369086615460565b6129e19190615384565b600081831015612a5057816129e4565b5090919050565b6000805a90505b825a612a6a90836152a8565b101561277757612a79826156ef565b9150612a5e565b6000612ae2826040518060400160405280602081526020017f5361666545524332303a206c6f772d6c6576656c2063616c6c206661696c65648152508573ffffffffffffffffffffffffffffffffffffffff16612c5c9092919063ffffffff16565b8051909150156127775780806020019051810190612b009190615226565b612777576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602a60248201527f5361666545524332303a204552433230206f7065726174696f6e20646964206e60448201527f6f742073756363656564000000000000000000000000000000000000000000006064820152608401610add565b60608180519060200120604051602001612ba891815260200190565b6040516020818303038152906040529050919050565b6000612be584612bcf878686612c6b565b8051602091820120825192909101919091201490565b95945050505050565b600080603f83619c4001026040850201603f5a021015949350505050565b600081831215612a5057816129e4565b6000818312612a5057816129e4565b60006129e4670de0b6b3a764000083612c43866136e9565b612c4d9190615460565b612c579190615384565b61392d565b60606129e18484600085613b6c565b60606000845111612cd8576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601560248201527f4d65726b6c65547269653a20656d707479206b657900000000000000000000006044820152606401610add565b6000612ce384613d02565b90506000612cf086613dee565b9050600084604051602001612d0791815260200190565b60405160208183030381529060405290506000805b8451811015613660576000858281518110612d3957612d39615727565b602002602001015190508451831115612dd4576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602e60248201527f4d65726b6c65547269653a206b657920696e646578206578636565647320746f60448201527f74616c206b6579206c656e6774680000000000000000000000000000000000006064820152608401610add565b82600003612e8d5780518051602091820120604051612e2292612dfc92910190815260200190565b604051602081830303815290604052858051602091820120825192909101919091201490565b612e88576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601d60248201527f4d65726b6c65547269653a20696e76616c696420726f6f7420686173680000006044820152606401610add565b612fe4565b805151602011612f435780518051602091820120604051612eb792612dfc92910190815260200190565b612e88576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602760248201527f4d65726b6c65547269653a20696e76616c6964206c6172676520696e7465726e60448201527f616c2068617368000000000000000000000000000000000000000000000000006064820152608401610add565b805184516020808701919091208251919092012014612fe4576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602660248201527f4d65726b6c65547269653a20696e76616c696420696e7465726e616c206e6f6460448201527f65206861736800000000000000000000000000000000000000000000000000006064820152608401610add565b612ff060106001615069565b816020015151036131cc57845183036131645761302a816020015160108151811061301d5761301d615727565b6020026020010151613e51565b965060008751116130bd576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152603b60248201527f4d65726b6c65547269653a2076616c7565206c656e677468206d75737420626560448201527f2067726561746572207468616e207a65726f20286272616e63682900000000006064820152608401610add565b600186516130cb91906152a8565b8214613159576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152603a60248201527f4d65726b6c65547269653a2076616c7565206e6f6465206d757374206265206c60448201527f617374206e6f646520696e2070726f6f6620286272616e6368290000000000006064820152608401610add565b5050505050506129e4565b600085848151811061317857613178615727565b602001015160f81c60f81b60f81c9050600082602001518260ff16815181106131a3576131a3615727565b602002602001015190506131b681613f05565b95506131c3600186615069565b9450505061364d565b6002816020015151036135c55760006131e482613f2a565b90506000816000815181106131fb576131fb615727565b016020015160f81c90506000613212600283615756565b61321d906002615778565b9050600061322e848360ff16613f4e565b9050600061323c8a89613f4e565b9050600061324a8383613f84565b9050808351146132dc576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152603a60248201527f4d65726b6c65547269653a20706174682072656d61696e646572206d7573742060448201527f736861726520616c6c206e6962626c65732077697468206b65790000000000006064820152608401610add565b60ff8516600214806132f1575060ff85166003145b156134e05780825114613386576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152603d60248201527f4d65726b6c65547269653a206b65792072656d61696e646572206d757374206260448201527f65206964656e746963616c20746f20706174682072656d61696e6465720000006064820152608401610add565b6133a0876020015160018151811061301d5761301d615727565b9c5060008d5111613433576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152603960248201527f4d65726b6c65547269653a2076616c7565206c656e677468206d75737420626560448201527f2067726561746572207468616e207a65726f20286c65616629000000000000006064820152608401610add565b60018c5161344191906152a8565b88146134cf576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152603860248201527f4d65726b6c65547269653a2076616c7565206e6f6465206d757374206265206c60448201527f617374206e6f646520696e2070726f6f6620286c6561662900000000000000006064820152608401610add565b5050505050505050505050506129e4565b60ff851615806134f3575060ff85166001145b156135325761351f876020015160018151811061351257613512615727565b6020026020010151613f05565b995061352b818a615069565b98506135ba565b6040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152603260248201527f4d65726b6c65547269653a2072656365697665642061206e6f6465207769746860448201527f20616e20756e6b6e6f776e2070726566697800000000000000000000000000006064820152608401610add565b50505050505061364d565b6040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602860248201527f4d65726b6c65547269653a20726563656976656420616e20756e70617273656160448201527f626c65206e6f64650000000000000000000000000000000000000000000000006064820152608401610add565b5080613658816156ef565b915050612d1c565b506040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602560248201527f4d65726b6c65547269653a2072616e206f7574206f662070726f6f6620656c6560448201527f6d656e74730000000000000000000000000000000000000000000000000000006064820152608401610add565b6000808213613754576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152600960248201527f554e444546494e454400000000000000000000000000000000000000000000006044820152606401610add565b6000606061376184614038565b03609f8181039490941b90931c6c465772b2bbbb5f824b15207a3081018102606090811d6d0388eaa27412d5aca026815d636e018202811d6d0df99ac502031bf953eff472fdcc018202811d6d13cdffb29d51d99322bdff5f2211018202811d6d0a0f742023def783a307a986912e018202811d6d01920d8043ca89b5239253284e42018202811d6c0b7a86d7375468fac667a0a527016c29508e458543d8aa4df2abee7883018302821d6d0139601a2efabe717e604cbb4894018302821d6d02247f7a7b6594320649aa03aba1018302821d7fffffffffffffffffffffffffffffffffffffff73c0c716a594e00d54e3c4cbc9018302821d7ffffffffffffffffffffffffffffffffffffffdc7b88c420e53a9890533129f6f01830290911d7fffffffffffffffffffffffffffffffffffffff465fda27eb4d63ded474e5f832019091027ffffffffffffffff5f6af8f7b3396644f18e157960000000000000000000000000105711340daa0d5f769dba1915cef59f0815a5506027d0267a36c0c95b3975ab3ee5b203a7614a3f75373f047d803ae7b6687f2b393909302929092017d57115e47018c7177eebf7cd370a3356a1b7863008a5ae8028c72b88642840160ae1d92915050565b60007ffffffffffffffffffffffffffffffffffffffffffffffffdb731c958f34d94c1821361395e57506000919050565b680755bf798b4a1bf1e582126139d0576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152600c60248201527f4558505f4f564552464c4f5700000000000000000000000000000000000000006044820152606401610add565b6503782dace9d9604e83901b059150600060606bb17217f7d1cf79abc9e3b39884821b056b80000000000000000000000001901d6bb17217f7d1cf79abc9e3b39881029093037fffffffffffffffffffffffffffffffffffffffdbf3ccf1604d263450f02a550481018102606090811d6d0277594991cfc85f6e2461837cd9018202811d7fffffffffffffffffffffffffffffffffffffe5adedaa1cb095af9e4da10e363c018202811d6db1bbb201f443cf962f1a1d3db4a5018202811d7ffffffffffffffffffffffffffffffffffffd38dc772608b0ae56cce01296c0eb018202811d6e05180bb14799ab47a8a8cb2a527d57016d02d16720577bd19bf614176fe9ea6c10fe68e7fd37d0007b713f765084018402831d9081019084017ffffffffffffffffffffffffffffffffffffffe2c69812cf03b0763fd454a8f7e010290911d6e0587f503bb6ea29d25fcb7401964500190910279d835ebba824c98fb31b83b2ca45c000000000000000000000000010574029d9dc38563c32e5c2f6dc192ee70ef65f9978af30260c3939093039290921c92915050565b606082471015613bfe576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602660248201527f416464726573733a20696e73756666696369656e742062616c616e636520666f60448201527f722063616c6c00000000000000000000000000000000000000000000000000006064820152608401610add565b73ffffffffffffffffffffffffffffffffffffffff85163b613c7c576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601d60248201527f416464726573733a2063616c6c20746f206e6f6e2d636f6e74726163740000006044820152606401610add565b6000808673ffffffffffffffffffffffffffffffffffffffff168587604051613ca5919061579b565b60006040518083038185875af1925050503d8060008114613ce2576040519150601f19603f3d011682016040523d82523d6000602084013e613ce7565b606091505b5091509150613cf782828661410e565b979650505050505050565b80516060908067ffffffffffffffff811115613d2057613d20614b07565b604051908082528060200260200182016040528015613d6557816020015b6040805180820190915260608082526020820152815260200190600190039081613d3e5790505b50915060005b81811015613de7576040518060400160405280858381518110613d9057613d90615727565b60200260200101518152602001613dbf868481518110613db257613db2615727565b6020026020010151614161565b815250838281518110613dd457613dd4615727565b6020908102919091010152600101613d6b565b5050919050565b606080604051905082518060011b603f8101601f1916830160405280835250602084016020830160005b83811015613e46578060011b82018184015160001a8060041c8253600f811660018301535050600101613e18565b509295945050505050565b60606000806000613e6185614174565b919450925090506000816001811115613e7c57613e7c6157b7565b14613eb3576040517f1ff9b2e400000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b613ebd8284615069565b855114613ef6576040517f5c5537b800000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b612be585602001518484614612565b60606020826000015110613f2157613f1c82613e51565b610ff2565b610ff2826146a6565b6060610ff2613f49836020015160008151811061301d5761301d615727565b613dee565b606082518210613f6d5750604080516020810190915260008152610ff2565b6129e48383848651613f7f91906152a8565b6146bc565b6000808251845110613f97578251613f9a565b83515b90505b80821080156140215750828281518110613fb957613fb9615727565b602001015160f81c60f81b7effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916848381518110613ff857613ff8615727565b01602001517fff0000000000000000000000000000000000000000000000000000000000000016145b1561403157816001019150613f9d565b5092915050565b60008082116140a3576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152600960248201527f554e444546494e454400000000000000000000000000000000000000000000006044820152606401610add565b5060016fffffffffffffffffffffffffffffffff821160071b82811c67ffffffffffffffff1060061b1782811c63ffffffff1060051b1782811c61ffff1060041b1782811c60ff10600390811b90911783811c600f1060021b1783811c909110821b1791821c111790565b6060831561411d5750816129e4565b82511561412d5782518084602001fd5b816040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610add9190614e99565b6060610ff261416f83614894565b614901565b600080600083600001516000036141b7576040517f5ab458fb00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6020840151805160001a607f81116141dc57600060016000945094509450505061460b565b60b781116142f25760006141f16080836152a8565b905080876000015111614230576040517f66c9448500000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6001838101517fff000000000000000000000000000000000000000000000000000000000000001690821480156142a857507f80000000000000000000000000000000000000000000000000000000000000007fff000000000000000000000000000000000000000000000000000000000000008216105b156142df576040517fbabb01dd00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b506001955093506000925061460b915050565b60bf811161445057600061430760b7836152a8565b905080876000015111614346576040517f66c9448500000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b60018301517fff000000000000000000000000000000000000000000000000000000000000001660008190036143a8576040517fbabb01dd00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b600184015160088302610100031c603781116143f0576040517fbabb01dd00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6143fa8184615069565b895111614433576040517f66c9448500000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b61443e836001615069565b975095506000945061460b9350505050565b60f781116144b557600061446560c0836152a8565b9050808760000151116144a4576040517f66c9448500000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b60019550935084925061460b915050565b60006144c260f7836152a8565b905080876000015111614501576040517f66c9448500000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b60018301517fff00000000000000000000000000000000000000000000000000000000000000166000819003614563576040517fbabb01dd00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b600184015160088302610100031c603781116145ab576040517fbabb01dd00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6145b58184615069565b8951116145ee576040517f66c9448500000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6145f9836001615069565b975095506001945061460b9350505050565b9193909250565b60608167ffffffffffffffff81111561462d5761462d614b07565b6040519080825280601f01601f191660200182016040528015614657576020820181803683370190505b50905081156129e457600061466c8486615069565b90506020820160005b8481101561468d578281015182820152602001614675565b8481111561469c576000858301525b5050509392505050565b6060610ff2826020015160008460000151614612565b60608182601f01101561472b576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152600e60248201527f736c6963655f6f766572666c6f770000000000000000000000000000000000006044820152606401610add565b828284011015614797576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152600e60248201527f736c6963655f6f766572666c6f770000000000000000000000000000000000006044820152606401610add565b81830184511015614804576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601160248201527f736c6963655f6f75744f66426f756e64730000000000000000000000000000006044820152606401610add565b606082158015614823576040519150600082526020820160405261488b565b6040519150601f8416801560200281840101858101878315602002848b0101015b8183101561485c578051835260209283019201614844565b5050858452601f017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe016604052505b50949350505050565b604080518082019091526000808252602082015281516000036148e3576040517f5ab458fb00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b50604080518082019091528151815260209182019181019190915290565b6060600080600061491185614174565b91945092509050600181600181111561492c5761492c6157b7565b14614963576040517f4b9c6abe00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b845161496f8385615069565b146149a6576040517f5c5537b800000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b604080516020808252610420820190925290816020015b60408051808201909152600080825260208201528152602001906001900390816149bd5790505093506000835b8651811015614aab57600080614a306040518060400160405280858c60000151614a1491906152a8565b8152602001858c60200151614a299190615069565b9052614174565b509150915060405180604001604052808383614a4c9190615069565b8152602001848b60200151614a619190615069565b815250888581518110614a7657614a76615727565b6020908102919091010152614a8c600185615069565b9350614a988183615069565b614aa29084615069565b925050506149ea565b50845250919392505050565b73ffffffffffffffffffffffffffffffffffffffff81168114614ad957600080fd5b50565b803567ffffffffffffffff81168114614af457600080fd5b919050565b8015158114614ad957600080fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b604051601f82017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe016810167ffffffffffffffff81118282101715614b7d57614b7d614b07565b604052919050565b600082601f830112614b9657600080fd5b813567ffffffffffffffff811115614bb057614bb0614b07565b614be160207fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0601f84011601614b36565b818152846020838601011115614bf657600080fd5b816020850160208301376000918101602001919091529392505050565b60008060008060008060c08789031215614c2c57600080fd5b8635614c3781614ab7565b95506020870135945060408701359350614c5360608801614adc565b92506080870135614c6381614af9565b915060a087013567ffffffffffffffff811115614c7f57600080fd5b614c8b89828a01614b85565b9150509295509295509295565b600060c08284031215614caa57600080fd5b60405160c0810167ffffffffffffffff8282108183111715614cce57614cce614b07565b816040528293508435835260208501359150614ce982614ab7565b81602084015260408501359150614cff82614ab7565b816040840152606085013560608401526080850135608084015260a0850135915080821115614d2d57600080fd5b50614d3a85828601614b85565b60a0830152505092915050565b600080600080600085870360e0811215614d6057600080fd5b863567ffffffffffffffff80821115614d7857600080fd5b614d848a838b01614c98565b97506020890135965060807fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc084011215614dbd57600080fd5b60408901955060c0890135925080831115614dd757600080fd5b828901925089601f840112614deb57600080fd5b8235915080821115614dfc57600080fd5b508860208260051b8401011115614e1257600080fd5b959894975092955050506020019190565b60005b83811015614e3e578181015183820152602001614e26565b83811115611ef75750506000910152565b60008151808452614e67816020860160208601614e23565b601f017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0169290920160200192915050565b6020815260006129e46020830184614e4f565b600060208284031215614ebe57600080fd5b5035919050565b60ff81168114614ad957600080fd5b60008060008060808587031215614eea57600080fd5b8435614ef581614ab7565b93506020850135614f0581614ec5565b93969395505050506040820135916060013590565b600060208284031215614f2c57600080fd5b813567ffffffffffffffff811115614f4357600080fd5b614f4f84828501614c98565b949350505050565b600060208284031215614f6957600080fd5b6129e482614adc565b600080600060608486031215614f8757600080fd5b8335614f9281614ab7565b92506020840135614fa281614ab7565b91506040840135614fb281614ab7565b809150509250925092565b600080600080600060a08688031215614fd557600080fd5b8535614fe081614ab7565b945060208601359350614ff560408701614adc565b9250606086013561500581614af9565b9150608086013567ffffffffffffffff81111561502157600080fd5b61502d88828901614b85565b9150509295509295909350565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b6000821982111561507c5761507c61503a565b500190565b60006020828403121561509357600080fd5b5051919050565b6000602082840312156150ac57600080fd5b81516129e481614ab7565b80516fffffffffffffffffffffffffffffffff81168114614af457600080fd5b6000606082840312156150e957600080fd5b6040516060810181811067ffffffffffffffff8211171561510c5761510c614b07565b6040528251815261511f602084016150b7565b6020820152615130604084016150b7565b60408201529392505050565b60006080828403121561514e57600080fd5b6040516080810181811067ffffffffffffffff8211171561517157615171614b07565b8060405250823581526020830135602082015260408301356040820152606083013560608201528091505092915050565b600067ffffffffffffffff808411156151bd576151bd614b07565b8360051b60206151ce818301614b36565b8681529185019181810190368411156151e657600080fd5b865b8481101561521a578035868111156152005760008081fd5b61520c36828b01614b85565b8452509183019183016151e8565b50979650505050505050565b60006020828403121561523857600080fd5b81516129e481614af9565b8581528460208201527fffffffffffffffff0000000000000000000000000000000000000000000000008460c01b16604082015282151560f81b604882015260008251615297816049850160208701614e23565b919091016049019695505050505050565b6000828210156152ba576152ba61503a565b500390565b600067ffffffffffffffff808316818516818304811182151516156152e6576152e661503a565b02949350505050565b600067ffffffffffffffff8083168185168083038211156153125761531261503a565b01949350505050565b6000806040838503121561532e57600080fd5b825161533981614ab7565b602084015190925061534a81614ec5565b809150509250929050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601260045260246000fd5b60008261539357615393615355565b7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff83147f8000000000000000000000000000000000000000000000000000000000000000831416156153e7576153e761503a565b500590565b6000808312837f8000000000000000000000000000000000000000000000000000000000000000018312811516156154265761542661503a565b837f7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff01831381161561545a5761545a61503a565b50500390565b60007f7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff6000841360008413858304851182821616156154a1576154a161503a565b7f800000000000000000000000000000000000000000000000000000000000000060008712868205881281841616156154dc576154dc61503a565b600087129250878205871284841616156154f8576154f861503a565b8785058712818416161561550e5761550e61503a565b505050929093029392505050565b6000808212827f7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff038413811516156155565761555661503a565b827f800000000000000000000000000000000000000000000000000000000000000003841281161561558a5761558a61503a565b50500190565b6000817fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff04831182151516156155c8576155c861503a565b500290565b6000826155dc576155dc615355565b500490565b868152600073ffffffffffffffffffffffffffffffffffffffff808816602084015280871660408401525084606083015283608083015260c060a083015261562c60c0830184614e4f565b98975050505050505050565b805163ffffffff81168114614af457600080fd5b600060c0828403121561565e57600080fd5b60405160c0810181811067ffffffffffffffff8211171561568157615681614b07565b60405261568d83615638565b8152602083015161569d81614ec5565b602082015260408301516156b081614ec5565b60408201526156c160608401615638565b60608201526156d260808401615638565b60808201526156e360a084016150b7565b60a08201529392505050565b60007fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff82036157205761572061503a565b5060010190565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b600060ff83168061576957615769615355565b8060ff84160691505092915050565b600060ff821660ff8416808210156157925761579261503a565b90039392505050565b600082516157ad818460208701614e23565b9190910192915050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602160045260246000fdfea164736f6c634300080f000a"; + bytes internal constant l2OutputOracleCode = + hex"60806040526004361061018a5760003560e01c806389c44cbb116100d6578063ce5db8d61161007f578063dcec334811610059578063dcec33481461049b578063e1a41bcf146104b0578063f4daa291146104c657600080fd5b8063ce5db8d614610445578063cf8e5cf01461045b578063d1de856c1461047b57600080fd5b8063a25ae557116100b0578063a25ae55714610391578063a8e4fb90146103ed578063bffa7f0f1461041a57600080fd5b806389c44cbb1461034857806393991af3146103685780639aaab6481461037e57600080fd5b806369f16eec1161013857806370872aa51161011257806370872aa5146102fc5780637f00642014610312578063887862721461033257600080fd5b806369f16eec146102a75780636abcf563146102bc5780636b4d98dd146102d157600080fd5b8063529933df11610169578063529933df146101ea578063534db0e2146101ff57806354fd4d501461025157600080fd5b80622134cc1461018f5780631c89c97d146101b35780634599c788146101d5575b600080fd5b34801561019b57600080fd5b506005545b6040519081526020015b60405180910390f35b3480156101bf57600080fd5b506101d36101ce3660046113a2565b6104db565b005b3480156101e157600080fd5b506101a06108b6565b3480156101f657600080fd5b506004546101a0565b34801561020b57600080fd5b5060065461022c9073ffffffffffffffffffffffffffffffffffffffff1681565b60405173ffffffffffffffffffffffffffffffffffffffff90911681526020016101aa565b34801561025d57600080fd5b5061029a6040518060400160405280600c81526020017f312e382e312d626574612e31000000000000000000000000000000000000000081525081565b6040516101aa9190611405565b3480156102b357600080fd5b506101a0610929565b3480156102c857600080fd5b506003546101a0565b3480156102dd57600080fd5b5060065473ffffffffffffffffffffffffffffffffffffffff1661022c565b34801561030857600080fd5b506101a060015481565b34801561031e57600080fd5b506101a061032d366004611478565b61093b565b34801561033e57600080fd5b506101a060025481565b34801561035457600080fd5b506101d3610363366004611478565b610b4f565b34801561037457600080fd5b506101a060055481565b6101d361038c366004611491565b610de9565b34801561039d57600080fd5b506103b16103ac366004611478565b61124a565b60408051825181526020808401516fffffffffffffffffffffffffffffffff9081169183019190915292820151909216908201526060016101aa565b3480156103f957600080fd5b5060075461022c9073ffffffffffffffffffffffffffffffffffffffff1681565b34801561042657600080fd5b5060075473ffffffffffffffffffffffffffffffffffffffff1661022c565b34801561045157600080fd5b506101a060085481565b34801561046757600080fd5b506103b1610476366004611478565b6112de565b34801561048757600080fd5b506101a0610496366004611478565b611316565b3480156104a757600080fd5b506101a0611346565b3480156104bc57600080fd5b506101a060045481565b3480156104d257600080fd5b506008546101a0565b600054610100900460ff16158080156104fb5750600054600160ff909116105b806105155750303b158015610515575060005460ff166001145b6105a6576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602e60248201527f496e697469616c697a61626c653a20636f6e747261637420697320616c72656160448201527f647920696e697469616c697a656400000000000000000000000000000000000060648201526084015b60405180910390fd5b600080547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00166001179055801561060457600080547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00ff166101001790555b60008811610694576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152603a60248201527f4c324f75747075744f7261636c653a207375626d697373696f6e20696e74657260448201527f76616c206d7573742062652067726561746572207468616e2030000000000000606482015260840161059d565b60008711610724576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152603460248201527f4c324f75747075744f7261636c653a204c3220626c6f636b2074696d65206d7560448201527f73742062652067726561746572207468616e2030000000000000000000000000606482015260840161059d565b428511156107db576040517f08c379a0000000000000000000000000000000000000000000000000000000008152602060048201526044602482018190527f4c324f75747075744f7261636c653a207374617274696e67204c322074696d65908201527f7374616d70206d757374206265206c657373207468616e2063757272656e742060648201527f74696d6500000000000000000000000000000000000000000000000000000000608482015260a40161059d565b60048890556005879055600186905560028590556007805473ffffffffffffffffffffffffffffffffffffffff8087167fffffffffffffffffffffffff0000000000000000000000000000000000000000928316179092556006805492861692909116919091179055600882905580156108ac57600080547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00ff169055604051600181527f7f26b83ff96e1f2b6a682f133852f6798a09c465da95921460cefb38474024989060200160405180910390a15b5050505050505050565b6003546000901561092057600380546108d1906001906114f2565b815481106108e1576108e1611509565b600091825260209091206002909102016001015470010000000000000000000000000000000090046fffffffffffffffffffffffffffffffff16919050565b6001545b905090565b600354600090610924906001906114f2565b60006109456108b6565b8211156109fa576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152604860248201527f4c324f75747075744f7261636c653a2063616e6e6f7420676574206f7574707560448201527f7420666f72206120626c6f636b207468617420686173206e6f74206265656e2060648201527f70726f706f736564000000000000000000000000000000000000000000000000608482015260a40161059d565b600354610aaf576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152604660248201527f4c324f75747075744f7261636c653a2063616e6e6f7420676574206f7574707560448201527f74206173206e6f206f7574707574732068617665206265656e2070726f706f7360648201527f6564207965740000000000000000000000000000000000000000000000000000608482015260a40161059d565b6003546000905b80821015610b485760006002610acc8385611538565b610ad69190611550565b90508460038281548110610aec57610aec611509565b600091825260209091206002909102016001015470010000000000000000000000000000000090046fffffffffffffffffffffffffffffffff161015610b3e57610b37816001611538565b9250610b42565b8091505b50610ab6565b5092915050565b60065473ffffffffffffffffffffffffffffffffffffffff163314610bf6576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152603e60248201527f4c324f75747075744f7261636c653a206f6e6c7920746865206368616c6c656e60448201527f67657220616464726573732063616e2064656c657465206f7574707574730000606482015260840161059d565b6003548110610cad576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152604360248201527f4c324f75747075744f7261636c653a2063616e6e6f742064656c657465206f7560448201527f747075747320616674657220746865206c6174657374206f757470757420696e60648201527f6465780000000000000000000000000000000000000000000000000000000000608482015260a40161059d565b60085460038281548110610cc357610cc3611509565b6000918252602090912060016002909202010154610cf3906fffffffffffffffffffffffffffffffff16426114f2565b10610da6576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152604660248201527f4c324f75747075744f7261636c653a2063616e6e6f742064656c657465206f7560448201527f74707574732074686174206861766520616c7265616479206265656e2066696e60648201527f616c697a65640000000000000000000000000000000000000000000000000000608482015260a40161059d565b6000610db160035490565b90508160035581817f4ee37ac2c786ec85e87592d3c5c8a1dd66f8496dda3f125d9ea8ca5f657629b660405160405180910390a35050565b60075473ffffffffffffffffffffffffffffffffffffffff163314610eb6576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152604160248201527f4c324f75747075744f7261636c653a206f6e6c79207468652070726f706f736560448201527f7220616464726573732063616e2070726f706f7365206e6577206f757470757460648201527f7300000000000000000000000000000000000000000000000000000000000000608482015260a40161059d565b610ebe611346565b8314610f72576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152604860248201527f4c324f75747075744f7261636c653a20626c6f636b206e756d626572206d757360448201527f7420626520657175616c20746f206e65787420657870656374656420626c6f6360648201527f6b206e756d626572000000000000000000000000000000000000000000000000608482015260a40161059d565b42610f7c84611316565b10611009576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152603660248201527f4c324f75747075744f7261636c653a2063616e6e6f742070726f706f7365204c60448201527f32206f757470757420696e207468652066757475726500000000000000000000606482015260840161059d565b83611096576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152603a60248201527f4c324f75747075744f7261636c653a204c32206f75747075742070726f706f7360448201527f616c2063616e6e6f7420626520746865207a65726f2068617368000000000000606482015260840161059d565b81156111525781814014611152576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152604960248201527f4c324f75747075744f7261636c653a20626c6f636b206861736820646f65732060448201527f6e6f74206d61746368207468652068617368206174207468652065787065637460648201527f6564206865696768740000000000000000000000000000000000000000000000608482015260a40161059d565b8261115c60035490565b857fa7aaf2512769da4e444e3de247be2564225c2e7a8f74cfe528e46e17d24868e24260405161118e91815260200190565b60405180910390a45050604080516060810182529283526fffffffffffffffffffffffffffffffff4281166020850190815292811691840191825260038054600181018255600091909152935160029094027fc2575a0e9e593c00f959f8c92f12db2869c3395a3b0502d05e2516446f71f85b810194909455915190518216700100000000000000000000000000000000029116177fc2575a0e9e593c00f959f8c92f12db2869c3395a3b0502d05e2516446f71f85c90910155565b60408051606081018252600080825260208201819052918101919091526003828154811061127a5761127a611509565b600091825260209182902060408051606081018252600290930290910180548352600101546fffffffffffffffffffffffffffffffff8082169484019490945270010000000000000000000000000000000090049092169181019190915292915050565b604080516060810182526000808252602082018190529181019190915260036113068361093b565b8154811061127a5761127a611509565b60006005546001548361132991906114f2565b611333919061158b565b6002546113409190611538565b92915050565b60006004546113536108b6565b6109249190611538565b73ffffffffffffffffffffffffffffffffffffffff163b151590565b803573ffffffffffffffffffffffffffffffffffffffff8116811461139d57600080fd5b919050565b600080600080600080600060e0888a0312156113bd57600080fd5b873596506020880135955060408801359450606088013593506113e260808901611379565b92506113f060a08901611379565b915060c0880135905092959891949750929550565b600060208083528351808285015260005b8181101561143257858101830151858201604001528201611416565b81811115611444576000604083870101525b50601f017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe016929092016040019392505050565b60006020828403121561148a57600080fd5b5035919050565b600080600080608085870312156114a757600080fd5b5050823594602084013594506040840135936060013592509050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b600082821015611504576115046114c3565b500390565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b6000821982111561154b5761154b6114c3565b500190565b600082611586577f4e487b7100000000000000000000000000000000000000000000000000000000600052601260045260246000fd5b500490565b6000817fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff04831182151516156115c3576115c36114c3565b50029056fea164736f6c634300080f000a"; + bytes internal constant optimismPortal2Code = + hex"6080604052600436106101d15760003560e01c80637fc48504116100f7578063a35d99df11610095578063bf653a5c11610064578063bf653a5c14610697578063cff0ab96146106ca578063e9e05c421461076b578063f2b4e6171461077e57600080fd5b8063a35d99df1461059b578063a3860f48146105bb578063b69ef8a8146105db578063bb2c727e146105f057600080fd5b80638e819e54116100d15780638e819e54146104eb578063952b27971461050b5780639bf62d821461053e578063a14238e71461056b57600080fd5b80637fc48504146104ab5780638b4c40b0146101f65780638c3152e9146104cb57600080fd5b80634870496f1161016f5780635c975abb1161013e5780635c975abb1461043657806371c1566e1461044b57806371cfaa3f1461046b5780637d6be8dc1461048b57600080fd5b80634870496f1461034d5780634fd0434c1461036d578063513747ab146103af57806354fd4d50146103ea57600080fd5b80633c9f397c116101ab5780633c9f397c146102a657806343ca1c50146102d8578063452a9320146102f857806345884d321461030d57600080fd5b8063149f2f22146101fd57806333d7e2bd1461021d57806335e80ab31461027457600080fd5b366101f8576101f63334620186a06000604051806020016040528060008152506107ab565b005b600080fd5b34801561020957600080fd5b506101f6610218366004614feb565b610850565b34801561022957600080fd5b5060375461024a9073ffffffffffffffffffffffffffffffffffffffff1681565b60405173ffffffffffffffffffffffffffffffffffffffff90911681526020015b60405180910390f35b34801561028057600080fd5b5060355461024a90610100900473ffffffffffffffffffffffffffffffffffffffff1681565b3480156102b257600080fd5b50603b546102c39063ffffffff1681565b60405163ffffffff909116815260200161026b565b3480156102e457600080fd5b506101f66102f3366004615121565b610a91565b34801561030457600080fd5b5061024a610f31565b34801561031957600080fd5b5061033d610328366004615173565b603a6020526000908152604090205460ff1681565b604051901515815260200161026b565b34801561035957600080fd5b506101f6610368366004615190565b610fc9565b34801561037957600080fd5b50603b5461039690640100000000900467ffffffffffffffff1681565b60405167ffffffffffffffff909116815260200161026b565b3480156103bb57600080fd5b506103dc6103ca36600461526c565b6000908152603c602052604090205490565b60405190815260200161026b565b3480156103f657600080fd5b50604080518082018252600d81527f332e31312e302d626574612e33000000000000000000000000000000000000006020820152905161026b91906152fb565b34801561044257600080fd5b5061033d611531565b34801561045757600080fd5b506101f661046636600461530e565b6115c4565b34801561047757600080fd5b506101f6610486366004615342565b611c7f565b34801561049757600080fd5b506101f66104a6366004615173565b611e3f565b3480156104b757600080fd5b506101f66104c636600461539a565b611f22565b3480156104d757600080fd5b506101f66104e63660046153b7565b61200e565b3480156104f757600080fd5b506101f66105063660046153f4565b61205a565b34801561051757600080fd5b507f00000000000000000000000000000000000000000000000000000000000000066103dc565b34801561054a57600080fd5b5060325461024a9073ffffffffffffffffffffffffffffffffffffffff1681565b34801561057757600080fd5b5061033d61058636600461526c565b60336020526000908152604090205460ff1681565b3480156105a757600080fd5b506103966105b6366004615450565b61230f565b3480156105c757600080fd5b5061024a6105d636600461546d565b61232e565b3480156105e757600080fd5b506103dc612373565b3480156105fc57600080fd5b5061066261060b36600461530e565b603960209081526000928352604080842090915290825290205473ffffffffffffffffffffffffffffffffffffffff81169074010000000000000000000000000000000000000000900467ffffffffffffffff1682565b6040805173ffffffffffffffffffffffffffffffffffffffff909316835267ffffffffffffffff90911660208301520161026b565b3480156106a357600080fd5b507f000000000000000000000000000000000000000000000000000000000000000c6103dc565b3480156106d657600080fd5b50600154610732906fffffffffffffffffffffffffffffffff81169067ffffffffffffffff7001000000000000000000000000000000008204811691780100000000000000000000000000000000000000000000000090041683565b604080516fffffffffffffffffffffffffffffffff909416845267ffffffffffffffff928316602085015291169082015260600161026b565b6101f661077936600461548f565b6107ab565b34801561078a57600080fd5b5060385461024a9073ffffffffffffffffffffffffffffffffffffffff1681565b8260005a905060006107bb6123e9565b50905073ffffffffffffffffffffffffffffffffffffffff811673eeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeee148015906107f757503415155b1561082e576040517ff2365b5b00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b61083c883489898989612486565b506108478282612632565b50505050505050565b8260005a905060006108606123e9565b5090507fffffffffffffffffffffffff111111111111111111111111111111111111111273ffffffffffffffffffffffffffffffffffffffff8216016108d2576040517f0eaf3c0f00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b87603d60008282546108e4919061553d565b90915550506040517f70a0823100000000000000000000000000000000000000000000000000000000815230600482015260009073ffffffffffffffffffffffffffffffffffffffff8316906370a0823190602401602060405180830381865afa158015610956573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061097a9190615555565b905061099e73ffffffffffffffffffffffffffffffffffffffff831633308c6128ff565b6109a8898261553d565b6040517f70a0823100000000000000000000000000000000000000000000000000000000815230600482015273ffffffffffffffffffffffffffffffffffffffff8416906370a0823190602401602060405180830381865afa158015610a12573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610a369190615555565b14610a6d576040517f90b8ec1800000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b610a7b8a8a8a8a8a8a612486565b5050610a878282612632565b5050505050505050565b610a99611531565b15610ad0576040517ff480973e00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b60325473ffffffffffffffffffffffffffffffffffffffff1661dead14610b23576040517f9396d15600000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6000610b2e836129e1565b9050610b3a81836115c4565b6000818152603360209081526040822080547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff001660011790558401516032805473ffffffffffffffffffffffffffffffffffffffff9092167fffffffffffffffffffffffff000000000000000000000000000000000000000090921691909117905580610bc56123e9565b5090507fffffffffffffffffffffffff111111111111111111111111111111111111111273ffffffffffffffffffffffffffffffffffffffff821601610c2857610c218560400151866080015187606001518860a00151612a2e565b9150610e7b565b8073ffffffffffffffffffffffffffffffffffffffff16856040015173ffffffffffffffffffffffffffffffffffffffff1603610c91576040517f13496fda00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b606085015115610e52578460600151603d6000828254610cb1919061556e565b90915550506040517f70a0823100000000000000000000000000000000000000000000000000000000815230600482015260009073ffffffffffffffffffffffffffffffffffffffff8316906370a0823190602401602060405180830381865afa158015610d23573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610d479190615555565b9050610d7c866040015187606001518473ffffffffffffffffffffffffffffffffffffffff16612a8c9092919063ffffffff16565b6060860151610d8b908261556e565b6040517f70a0823100000000000000000000000000000000000000000000000000000000815230600482015273ffffffffffffffffffffffffffffffffffffffff8416906370a0823190602401602060405180830381865afa158015610df5573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610e199190615555565b14610e50576040517f90b8ec1800000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b505b60a08501515115610e7657610c218560400151866080015160008860a00151612a2e565b600191505b603280547fffffffffffffffffffffffff00000000000000000000000000000000000000001661dead17905560405183907fdb5c7652857aa163daadd670e116628fb42e869d8ac4251ef8971d9e5727df1b90610edd90851515815260200190565b60405180910390a281158015610ef35750326001145b15610f2a576040517feeae4ed300000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b5050505050565b6000603560019054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1663452a93206040518163ffffffff1660e01b8152600401602060405180830381865afa158015610fa0573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610fc49190615585565b905090565b610fd1611531565b15611008576040517ff480973e00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b3073ffffffffffffffffffffffffffffffffffffffff16856040015173ffffffffffffffffffffffffffffffffffffffff1603611071576040517f13496fda00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6038546040517fbb8aa1fc00000000000000000000000000000000000000000000000000000000815260048101869052600091829173ffffffffffffffffffffffffffffffffffffffff9091169063bb8aa1fc90602401606060405180830381865afa1580156110e5573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061110991906155a2565b925050915060008173ffffffffffffffffffffffffffffffffffffffff1663bcef3b556040518163ffffffff1660e01b8152600401602060405180830381865afa15801561115b573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061117f9190615555565b603b5490915063ffffffff8481169116146111c6576040517f27a10cc200000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6111dd6111d8368890038801886155ef565b612ae7565b8114611215576040517f09bde33900000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6000611220896129e1565b905060018373ffffffffffffffffffffffffffffffffffffffff1663200d2ed26040518163ffffffff1660e01b8152600401602060405180830381865afa15801561126f573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906112939190615684565b60028111156112a4576112a4615655565b036112db576040517fd357347400000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b60408051602081018390526000918101829052606001604080517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0818403018152828252805160209182012090830181905292506113a49101604080517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0818403018152828201909152600182527f010000000000000000000000000000000000000000000000000000000000000060208301529061139a898b6156a5565b8b60400135612b26565b15156000036113df576040517fb05e92fa00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b60408051808201825273ffffffffffffffffffffffffffffffffffffffff808716825267ffffffffffffffff4281166020808501918252600088815260398252868120338252825286812095518654935190941674010000000000000000000000000000000000000000027fffffffff0000000000000000000000000000000000000000000000000000000090931693851693909317919091179093558d840151928e01519351928216939091169185917f67a6208cfcc0801d50f6cbe764733f4fddf66ac0b04442061a8a8c0cb6b63f6291a4604051339083907f798f9f13695f8f045aa5f80ed8efebb695f3c7fe65da381969f2f28bf3c60b9790600090a3506000908152603c602090815260408220805460018101825590835291200180547fffffffffffffffffffffffff000000000000000000000000000000000000000016331790555050505050505050565b6000603560019054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16635c975abb6040518163ffffffff1660e01b8152600401602060405180830381865afa1580156115a0573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610fc49190615729565b600082815260396020908152604080832073ffffffffffffffffffffffffffffffffffffffff85811685529083528184208251808401845290549182168082527401000000000000000000000000000000000000000090920467ffffffffffffffff1681850152818552603a90935292205490919060ff1615611673576040517f09550c7700000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b816020015167ffffffffffffffff166000036116bb576040517f94efd49b00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b600061173c8273ffffffffffffffffffffffffffffffffffffffff1663cf09e0d06040518163ffffffff1660e01b8152600401602060405180830381865afa15801561170b573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061172f9190615746565b67ffffffffffffffff1690565b90508067ffffffffffffffff16836020015167ffffffffffffffff1611611810576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152604e60248201527f4f7074696d69736d506f7274616c3a207769746864726177616c2074696d657360448201527f74616d70206c657373207468616e20646973707574652067616d65206372656160648201527f74696f6e2074696d657374616d70000000000000000000000000000000000000608482015260a4015b60405180910390fd5b7f000000000000000000000000000000000000000000000000000000000000000c836020015167ffffffffffffffff164261184b919061556e565b116118d8576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152603560248201527f4f7074696d69736d506f7274616c3a2070726f76656e2077697468647261776160448201527f6c20686173206e6f74206d6174757265642079657400000000000000000000006064820152608401611807565b60028273ffffffffffffffffffffffffffffffffffffffff1663200d2ed26040518163ffffffff1660e01b8152600401602060405180830381865afa158015611925573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906119499190615684565b600281111561195a5761195a615655565b14611991576040517fa080a3c400000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b603b5463ffffffff1663ffffffff16611a1b8373ffffffffffffffffffffffffffffffffffffffff1663bbdc02db6040518163ffffffff1660e01b8152600401602060405180830381865afa1580156119ee573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611a129190615763565b63ffffffff1690565b63ffffffff1614611a58576040517f27a10cc200000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b603b5467ffffffffffffffff64010000000090910481169082161015611b26576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152604b60248201527f4f7074696d69736d506f7274616c3a20646973707574652067616d652063726560448201527f61746564206265666f7265207265737065637465642067616d6520747970652060648201527f7761732075706461746564000000000000000000000000000000000000000000608482015260a401611807565b7f0000000000000000000000000000000000000000000000000000000000000006611b958373ffffffffffffffffffffffffffffffffffffffff166319effeb46040518163ffffffff1660e01b8152600401602060405180830381865afa15801561170b573d6000803e3d6000fd5b611ba99067ffffffffffffffff164261556e565b11611c36576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602a60248201527f4f7074696d69736d506f7274616c3a206f75747075742070726f706f73616c2060448201527f696e206169722d676170000000000000000000000000000000000000000000006064820152608401611807565b60008581526033602052604090205460ff1615610f2a576040517f475a253500000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b60375473ffffffffffffffffffffffffffffffffffffffff163314611cd0576040517f82b4290000000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b611cdc62030d40612b4a565b60405173ffffffffffffffffffffffffffffffffffffffff8516602482015260ff8416604482015260648101839052608481018290526000907342000000000000000000000000000000000000159073deaddeaddeaddeaddeaddeaddeaddeaddead0001907fb3813568d9991fc951961fcb4c784893574240a28925604d09fc577c55bb7c32908490819062030d4090829060a401604080517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0818403018152918152602080830180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff167f71cfaa3f000000000000000000000000000000000000000000000000000000001790529051611df996959493929101615780565b604080517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe081840301815290829052611e31916152fb565b60405180910390a450505050565b611e47610f31565b73ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff1614611eab576040517f82b4290000000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b73ffffffffffffffffffffffffffffffffffffffff81166000818152603a602052604080822080547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00166001179055517f192c289026d59a41a27f5aea08f3969b57931b0589202d14f4368cded95d3cda9190a250565b611f2a610f31565b73ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff1614611f8e576040517f82b4290000000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b603b805463ffffffff83167fffffffffffffffffffffffffffffffffffffffff00000000000000000000000090911681176401000000004267ffffffffffffffff90811682029290921793849055604051930416917f049fe9dd413cdf037cce27011cc1790c753118272f3630e6e8bdfa5e8208176090600090a350565b565b612016611531565b1561204d576040517ff480973e00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6120578133610a91565b50565b600054610100900460ff161580801561207a5750600054600160ff909116105b806120945750303b158015612094575060005460ff166001145b612120576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602e60248201527f496e697469616c697a61626c653a20636f6e747261637420697320616c72656160448201527f647920696e697469616c697a65640000000000000000000000000000000000006064820152608401611807565b600080547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00166001179055801561217e57600080547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00ff166101001790555b603880547fffffffffffffffffffffffff000000000000000000000000000000000000000090811673ffffffffffffffffffffffffffffffffffffffff8881169190911790925560378054909116868316179055603580547fffffffffffffffffffffff0000000000000000000000000000000000000000ff16610100868416021790556032541661229e576032805461dead7fffffffffffffffffffffffff0000000000000000000000000000000000000000909116179055603b80547fffffffffffffffffffffffffffffffffffffffff000000000000000000000000166401000000004267ffffffffffffffff16027fffffffffffffffffffffffffffffffffffffffffffffffffffffffff00000000161763ffffffff84161790555b6122a6612bac565b8015610f2a57600080547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00ff169055604051600181527f7f26b83ff96e1f2b6a682f133852f6798a09c465da95921460cefb38474024989060200160405180910390a15050505050565b600061231c8260106157e5565b61232890615208615815565b92915050565b603c602052816000526040600020818154811061234a57600080fd5b60009182526020909120015473ffffffffffffffffffffffffffffffffffffffff169150829050565b60008061237e6123e9565b5090507fffffffffffffffffffffffff111111111111111111111111111111111111111273ffffffffffffffffffffffffffffffffffffffff8216016123c5574791505090565b5050603d5490565b73ffffffffffffffffffffffffffffffffffffffff163b151590565b603754604080517f4397dfef0000000000000000000000000000000000000000000000000000000081528151600093849373ffffffffffffffffffffffffffffffffffffffff90911692634397dfef92600480830193928290030181865afa158015612459573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061247d9190615841565b90939092509050565b8180156124a8575073ffffffffffffffffffffffffffffffffffffffff861615155b156124df576040517f13496fda00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6124e9815161230f565b67ffffffffffffffff168367ffffffffffffffff161015612536576040517f4929b80800000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6201d4c081511115612574576040517f73052b0f00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b33328114612595575033731111000000000000000000000000000000001111015b600086868686866040516020016125b0959493929190615780565b604051602081830303815290604052905060008873ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff167fb3813568d9991fc951961fcb4c784893574240a28925604d09fc577c55bb7c328460405161262091906152fb565b60405180910390a45050505050505050565b600154600090612668907801000000000000000000000000000000000000000000000000900467ffffffffffffffff164361556e565b90506000612674612cbf565b90506000816020015160ff16826000015163ffffffff16612695919061589f565b905082156127cc576001546000906126cc908390700100000000000000000000000000000000900467ffffffffffffffff16615907565b90506000836040015160ff16836126e3919061597b565b6001546127039084906fffffffffffffffffffffffffffffffff1661597b565b61270d919061589f565b60015490915060009061275e906127379084906fffffffffffffffffffffffffffffffff16615a37565b866060015163ffffffff168760a001516fffffffffffffffffffffffffffffffff16612d85565b9050600186111561278d5761278a61273782876040015160ff1660018a612785919061556e565b612da4565b90505b6fffffffffffffffffffffffffffffffff16780100000000000000000000000000000000000000000000000067ffffffffffffffff4316021760015550505b600180548691906010906127ff908490700100000000000000000000000000000000900467ffffffffffffffff16615815565b92506101000a81548167ffffffffffffffff021916908367ffffffffffffffff160217905550816000015163ffffffff16600160000160109054906101000a900467ffffffffffffffff1667ffffffffffffffff16131561288c576040517f77ebef4d00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6001546000906128b8906fffffffffffffffffffffffffffffffff1667ffffffffffffffff8816615aab565b905060006128ca48633b9aca00612df9565b6128d49083615ae8565b905060005a6128e3908861556e565b905080821115610a8757610a876128fa828461556e565b612e10565b60405173ffffffffffffffffffffffffffffffffffffffff808516602483015283166044820152606481018290526129db9085907f23b872dd00000000000000000000000000000000000000000000000000000000906084015b604080517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe08184030181529190526020810180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff167fffffffff0000000000000000000000000000000000000000000000000000000090931692909217909152612e39565b50505050565b80516020808301516040808501516060860151608087015160a08801519351600097612a11979096959101615afc565b604051602081830303815290604052805190602001209050919050565b6000806000612a3e866000612f45565b905080612a74576308c379a06000526020805278185361666543616c6c3a204e6f7420656e6f756768206761736058526064601cfd5b600080855160208701888b5af1979650505050505050565b60405173ffffffffffffffffffffffffffffffffffffffff8316602482015260448101829052612ae29084907fa9059cbb0000000000000000000000000000000000000000000000000000000090606401612959565b505050565b60008160000151826020015183604001518460600151604051602001612a11949392919093845260208401929092526040830152606082015260800190565b600080612b3286612f63565b9050612b4081868686612f95565b9695505050505050565b6001805463ffffffff83169190601090612b83908490700100000000000000000000000000000000900467ffffffffffffffff16615815565b92506101000a81548167ffffffffffffffff021916908367ffffffffffffffff16021790555050565b600054610100900460ff16612c43576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602b60248201527f496e697469616c697a61626c653a20636f6e7472616374206973206e6f74206960448201527f6e697469616c697a696e670000000000000000000000000000000000000000006064820152608401611807565b6001547801000000000000000000000000000000000000000000000000900467ffffffffffffffff1660000361200c5760408051606081018252633b9aca00808252600060208301524367ffffffffffffffff169190920181905278010000000000000000000000000000000000000000000000000217600155565b6040805160c081018252600080825260208201819052918101829052606081018290526080810182905260a0810191909152603754604080517fcc731b02000000000000000000000000000000000000000000000000000000008152905160009273ffffffffffffffffffffffffffffffffffffffff169163cc731b029160048083019260c09291908290030181865afa158015612d61573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906123289190615b53565b6000612d9a612d948585612fc5565b83612fd5565b90505b9392505050565b6000670de0b6b3a7640000612de5612dbc858361589f565b612dce90670de0b6b3a7640000615907565b612de085670de0b6b3a764000061597b565b612fe4565b612def908661597b565b612d9a919061589f565b600081831015612e095781612d9d565b5090919050565b6000805a90505b825a612e23908361556e565b1015612ae257612e3282615bf5565b9150612e17565b6000612e9b826040518060400160405280602081526020017f5361666545524332303a206c6f772d6c6576656c2063616c6c206661696c65648152508573ffffffffffffffffffffffffffffffffffffffff166130159092919063ffffffff16565b805190915015612ae25780806020019051810190612eb99190615729565b612ae2576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602a60248201527f5361666545524332303a204552433230206f7065726174696f6e20646964206e60448201527f6f742073756363656564000000000000000000000000000000000000000000006064820152608401611807565b600080603f83619c4001026040850201603f5a021015949350505050565b60608180519060200120604051602001612f7f91815260200190565b6040516020818303038152906040529050919050565b6000612fbc84612fa6878686613024565b8051602091820120825192909101919091201490565b95945050505050565b600081831215612e095781612d9d565b6000818312612e095781612d9d565b6000612d9d670de0b6b3a764000083612ffc86613aa2565b613006919061597b565b613010919061589f565b613ce6565b6060612d9a8484600085613f25565b60606000845111613091576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601560248201527f4d65726b6c65547269653a20656d707479206b657900000000000000000000006044820152606401611807565b600061309c846140bb565b905060006130a9866141a7565b90506000846040516020016130c091815260200190565b60405160208183030381529060405290506000805b8451811015613a195760008582815181106130f2576130f2615c2d565b60200260200101519050845183111561318d576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602e60248201527f4d65726b6c65547269653a206b657920696e646578206578636565647320746f60448201527f74616c206b6579206c656e6774680000000000000000000000000000000000006064820152608401611807565b8260000361324657805180516020918201206040516131db926131b592910190815260200190565b604051602081830303815290604052858051602091820120825192909101919091201490565b613241576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601d60248201527f4d65726b6c65547269653a20696e76616c696420726f6f7420686173680000006044820152606401611807565b61339d565b8051516020116132fc5780518051602091820120604051613270926131b592910190815260200190565b613241576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602760248201527f4d65726b6c65547269653a20696e76616c6964206c6172676520696e7465726e60448201527f616c2068617368000000000000000000000000000000000000000000000000006064820152608401611807565b80518451602080870191909120825191909201201461339d576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602660248201527f4d65726b6c65547269653a20696e76616c696420696e7465726e616c206e6f6460448201527f65206861736800000000000000000000000000000000000000000000000000006064820152608401611807565b6133a96010600161553d565b81602001515103613585578451830361351d576133e381602001516010815181106133d6576133d6615c2d565b602002602001015161420a565b96506000875111613476576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152603b60248201527f4d65726b6c65547269653a2076616c7565206c656e677468206d75737420626560448201527f2067726561746572207468616e207a65726f20286272616e63682900000000006064820152608401611807565b60018651613484919061556e565b8214613512576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152603a60248201527f4d65726b6c65547269653a2076616c7565206e6f6465206d757374206265206c60448201527f617374206e6f646520696e2070726f6f6620286272616e6368290000000000006064820152608401611807565b505050505050612d9d565b600085848151811061353157613531615c2d565b602001015160f81c60f81b60f81c9050600082602001518260ff168151811061355c5761355c615c2d565b6020026020010151905061356f816142be565b955061357c60018661553d565b94505050613a06565b60028160200151510361397e57600061359d826142e3565b90506000816000815181106135b4576135b4615c2d565b016020015160f81c905060006135cb600283615c5c565b6135d6906002615c7e565b905060006135e7848360ff16614307565b905060006135f58a89614307565b90506000613603838361433d565b905080835114613695576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152603a60248201527f4d65726b6c65547269653a20706174682072656d61696e646572206d7573742060448201527f736861726520616c6c206e6962626c65732077697468206b65790000000000006064820152608401611807565b60ff8516600214806136aa575060ff85166003145b15613899578082511461373f576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152603d60248201527f4d65726b6c65547269653a206b65792072656d61696e646572206d757374206260448201527f65206964656e746963616c20746f20706174682072656d61696e6465720000006064820152608401611807565b61375987602001516001815181106133d6576133d6615c2d565b9c5060008d51116137ec576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152603960248201527f4d65726b6c65547269653a2076616c7565206c656e677468206d75737420626560448201527f2067726561746572207468616e207a65726f20286c65616629000000000000006064820152608401611807565b60018c516137fa919061556e565b8814613888576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152603860248201527f4d65726b6c65547269653a2076616c7565206e6f6465206d757374206265206c60448201527f617374206e6f646520696e2070726f6f6620286c6561662900000000000000006064820152608401611807565b505050505050505050505050612d9d565b60ff851615806138ac575060ff85166001145b156138eb576138d887602001516001815181106138cb576138cb615c2d565b60200260200101516142be565b99506138e4818a61553d565b9850613973565b6040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152603260248201527f4d65726b6c65547269653a2072656365697665642061206e6f6465207769746860448201527f20616e20756e6b6e6f776e2070726566697800000000000000000000000000006064820152608401611807565b505050505050613a06565b6040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602860248201527f4d65726b6c65547269653a20726563656976656420616e20756e70617273656160448201527f626c65206e6f64650000000000000000000000000000000000000000000000006064820152608401611807565b5080613a1181615bf5565b9150506130d5565b506040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602560248201527f4d65726b6c65547269653a2072616e206f7574206f662070726f6f6620656c6560448201527f6d656e74730000000000000000000000000000000000000000000000000000006064820152608401611807565b6000808213613b0d576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152600960248201527f554e444546494e454400000000000000000000000000000000000000000000006044820152606401611807565b60006060613b1a846143f1565b03609f8181039490941b90931c6c465772b2bbbb5f824b15207a3081018102606090811d6d0388eaa27412d5aca026815d636e018202811d6d0df99ac502031bf953eff472fdcc018202811d6d13cdffb29d51d99322bdff5f2211018202811d6d0a0f742023def783a307a986912e018202811d6d01920d8043ca89b5239253284e42018202811d6c0b7a86d7375468fac667a0a527016c29508e458543d8aa4df2abee7883018302821d6d0139601a2efabe717e604cbb4894018302821d6d02247f7a7b6594320649aa03aba1018302821d7fffffffffffffffffffffffffffffffffffffff73c0c716a594e00d54e3c4cbc9018302821d7ffffffffffffffffffffffffffffffffffffffdc7b88c420e53a9890533129f6f01830290911d7fffffffffffffffffffffffffffffffffffffff465fda27eb4d63ded474e5f832019091027ffffffffffffffff5f6af8f7b3396644f18e157960000000000000000000000000105711340daa0d5f769dba1915cef59f0815a5506027d0267a36c0c95b3975ab3ee5b203a7614a3f75373f047d803ae7b6687f2b393909302929092017d57115e47018c7177eebf7cd370a3356a1b7863008a5ae8028c72b88642840160ae1d92915050565b60007ffffffffffffffffffffffffffffffffffffffffffffffffdb731c958f34d94c18213613d1757506000919050565b680755bf798b4a1bf1e58212613d89576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152600c60248201527f4558505f4f564552464c4f5700000000000000000000000000000000000000006044820152606401611807565b6503782dace9d9604e83901b059150600060606bb17217f7d1cf79abc9e3b39884821b056b80000000000000000000000001901d6bb17217f7d1cf79abc9e3b39881029093037fffffffffffffffffffffffffffffffffffffffdbf3ccf1604d263450f02a550481018102606090811d6d0277594991cfc85f6e2461837cd9018202811d7fffffffffffffffffffffffffffffffffffffe5adedaa1cb095af9e4da10e363c018202811d6db1bbb201f443cf962f1a1d3db4a5018202811d7ffffffffffffffffffffffffffffffffffffd38dc772608b0ae56cce01296c0eb018202811d6e05180bb14799ab47a8a8cb2a527d57016d02d16720577bd19bf614176fe9ea6c10fe68e7fd37d0007b713f765084018402831d9081019084017ffffffffffffffffffffffffffffffffffffffe2c69812cf03b0763fd454a8f7e010290911d6e0587f503bb6ea29d25fcb7401964500190910279d835ebba824c98fb31b83b2ca45c000000000000000000000000010574029d9dc38563c32e5c2f6dc192ee70ef65f9978af30260c3939093039290921c92915050565b606082471015613fb7576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602660248201527f416464726573733a20696e73756666696369656e742062616c616e636520666f60448201527f722063616c6c00000000000000000000000000000000000000000000000000006064820152608401611807565b73ffffffffffffffffffffffffffffffffffffffff85163b614035576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601d60248201527f416464726573733a2063616c6c20746f206e6f6e2d636f6e74726163740000006044820152606401611807565b6000808673ffffffffffffffffffffffffffffffffffffffff16858760405161405e9190615ca1565b60006040518083038185875af1925050503d806000811461409b576040519150601f19603f3d011682016040523d82523d6000602084013e6140a0565b606091505b50915091506140b08282866144c7565b979650505050505050565b80516060908067ffffffffffffffff8111156140d9576140d9614eb6565b60405190808252806020026020018201604052801561411e57816020015b60408051808201909152606080825260208201528152602001906001900390816140f75790505b50915060005b818110156141a057604051806040016040528085838151811061414957614149615c2d565b6020026020010151815260200161417886848151811061416b5761416b615c2d565b602002602001015161451a565b81525083828151811061418d5761418d615c2d565b6020908102919091010152600101614124565b5050919050565b606080604051905082518060011b603f8101601f1916830160405280835250602084016020830160005b838110156141ff578060011b82018184015160001a8060041c8253600f8116600183015350506001016141d1565b509295945050505050565b6060600080600061421a8561452d565b91945092509050600081600181111561423557614235615655565b1461426c576040517f1ff9b2e400000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b614276828461553d565b8551146142af576040517f5c5537b800000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b612fbc856020015184846149cb565b606060208260000151106142da576142d58261420a565b612328565b61232882614a5f565b606061232861430283602001516000815181106133d6576133d6615c2d565b6141a7565b6060825182106143265750604080516020810190915260008152612328565b612d9d8383848651614338919061556e565b614a75565b6000808251845110614350578251614353565b83515b90505b80821080156143da575082828151811061437257614372615c2d565b602001015160f81c60f81b7effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff19168483815181106143b1576143b1615c2d565b01602001517fff0000000000000000000000000000000000000000000000000000000000000016145b156143ea57816001019150614356565b5092915050565b600080821161445c576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152600960248201527f554e444546494e454400000000000000000000000000000000000000000000006044820152606401611807565b5060016fffffffffffffffffffffffffffffffff821160071b82811c67ffffffffffffffff1060061b1782811c63ffffffff1060051b1782811c61ffff1060041b1782811c60ff10600390811b90911783811c600f1060021b1783811c909110821b1791821c111790565b606083156144d6575081612d9d565b8251156144e65782518084602001fd5b816040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161180791906152fb565b606061232861452883614c4d565b614cba565b60008060008360000151600003614570576040517f5ab458fb00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6020840151805160001a607f81116145955760006001600094509450945050506149c4565b60b781116146ab5760006145aa60808361556e565b9050808760000151116145e9576040517f66c9448500000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6001838101517fff0000000000000000000000000000000000000000000000000000000000000016908214801561466157507f80000000000000000000000000000000000000000000000000000000000000007fff000000000000000000000000000000000000000000000000000000000000008216105b15614698576040517fbabb01dd00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b50600195509350600092506149c4915050565b60bf81116148095760006146c060b78361556e565b9050808760000151116146ff576040517f66c9448500000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b60018301517fff00000000000000000000000000000000000000000000000000000000000000166000819003614761576040517fbabb01dd00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b600184015160088302610100031c603781116147a9576040517fbabb01dd00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6147b3818461553d565b8951116147ec576040517f66c9448500000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6147f783600161553d565b97509550600094506149c49350505050565b60f7811161486e57600061481e60c08361556e565b90508087600001511161485d576040517f66c9448500000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6001955093508492506149c4915050565b600061487b60f78361556e565b9050808760000151116148ba576040517f66c9448500000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b60018301517fff0000000000000000000000000000000000000000000000000000000000000016600081900361491c576040517fbabb01dd00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b600184015160088302610100031c60378111614964576040517fbabb01dd00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b61496e818461553d565b8951116149a7576040517f66c9448500000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6149b283600161553d565b97509550600194506149c49350505050565b9193909250565b60608167ffffffffffffffff8111156149e6576149e6614eb6565b6040519080825280601f01601f191660200182016040528015614a10576020820181803683370190505b5090508115612d9d576000614a25848661553d565b90506020820160005b84811015614a46578281015182820152602001614a2e565b84811115614a55576000858301525b5050509392505050565b60606123288260200151600084600001516149cb565b60608182601f011015614ae4576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152600e60248201527f736c6963655f6f766572666c6f770000000000000000000000000000000000006044820152606401611807565b828284011015614b50576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152600e60248201527f736c6963655f6f766572666c6f770000000000000000000000000000000000006044820152606401611807565b81830184511015614bbd576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601160248201527f736c6963655f6f75744f66426f756e64730000000000000000000000000000006044820152606401611807565b606082158015614bdc5760405191506000825260208201604052614c44565b6040519150601f8416801560200281840101858101878315602002848b0101015b81831015614c15578051835260209283019201614bfd565b5050858452601f017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe016604052505b50949350505050565b60408051808201909152600080825260208201528151600003614c9c576040517f5ab458fb00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b50604080518082019091528151815260209182019181019190915290565b60606000806000614cca8561452d565b919450925090506001816001811115614ce557614ce5615655565b14614d1c576040517f4b9c6abe00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b8451614d28838561553d565b14614d5f576040517f5c5537b800000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b604080516020808252610420820190925290816020015b6040805180820190915260008082526020820152815260200190600190039081614d765790505093506000835b8651811015614e6457600080614de96040518060400160405280858c60000151614dcd919061556e565b8152602001858c60200151614de2919061553d565b905261452d565b509150915060405180604001604052808383614e05919061553d565b8152602001848b60200151614e1a919061553d565b815250888581518110614e2f57614e2f615c2d565b6020908102919091010152614e4560018561553d565b9350614e51818361553d565b614e5b908461553d565b92505050614da3565b50845250919392505050565b73ffffffffffffffffffffffffffffffffffffffff8116811461205757600080fd5b67ffffffffffffffff8116811461205757600080fd5b801515811461205757600080fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b60405160c0810167ffffffffffffffff81118282101715614f0857614f08614eb6565b60405290565b604051601f82017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe016810167ffffffffffffffff81118282101715614f5557614f55614eb6565b604052919050565b600082601f830112614f6e57600080fd5b813567ffffffffffffffff811115614f8857614f88614eb6565b614fb960207fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0601f84011601614f0e565b818152846020838601011115614fce57600080fd5b816020850160208301376000918101602001919091529392505050565b60008060008060008060c0878903121561500457600080fd5b863561500f81614e70565b95506020870135945060408701359350606087013561502d81614e92565b9250608087013561503d81614ea8565b915060a087013567ffffffffffffffff81111561505957600080fd5b61506589828a01614f5d565b9150509295509295509295565b600060c0828403121561508457600080fd5b60405160c0810167ffffffffffffffff82821081831117156150a8576150a8614eb6565b8160405282935084358352602085013591506150c382614e70565b816020840152604085013591506150d982614e70565b816040840152606085013560608401526080850135608084015260a085013591508082111561510757600080fd5b5061511485828601614f5d565b60a0830152505092915050565b6000806040838503121561513457600080fd5b823567ffffffffffffffff81111561514b57600080fd5b61515785828601615072565b925050602083013561516881614e70565b809150509250929050565b60006020828403121561518557600080fd5b8135612d9d81614e70565b600080600080600085870360e08112156151a957600080fd5b863567ffffffffffffffff808211156151c157600080fd5b6151cd8a838b01615072565b97506020890135965060807fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc08401121561520657600080fd5b60408901955060c089013592508083111561522057600080fd5b828901925089601f84011261523457600080fd5b823591508082111561524557600080fd5b508860208260051b840101111561525b57600080fd5b959894975092955050506020019190565b60006020828403121561527e57600080fd5b5035919050565b60005b838110156152a0578181015183820152602001615288565b838111156129db5750506000910152565b600081518084526152c9816020860160208601615285565b601f017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0169290920160200192915050565b602081526000612d9d60208301846152b1565b6000806040838503121561532157600080fd5b82359150602083013561516881614e70565b60ff8116811461205757600080fd5b6000806000806080858703121561535857600080fd5b843561536381614e70565b9350602085013561537381615333565b93969395505050506040820135916060013590565b63ffffffff8116811461205757600080fd5b6000602082840312156153ac57600080fd5b8135612d9d81615388565b6000602082840312156153c957600080fd5b813567ffffffffffffffff8111156153e057600080fd5b6153ec84828501615072565b949350505050565b6000806000806080858703121561540a57600080fd5b843561541581614e70565b9350602085013561542581614e70565b9250604085013561543581614e70565b9150606085013561544581615388565b939692955090935050565b60006020828403121561546257600080fd5b8135612d9d81614e92565b6000806040838503121561548057600080fd5b50508035926020909101359150565b600080600080600060a086880312156154a757600080fd5b85356154b281614e70565b94506020860135935060408601356154c981614e92565b925060608601356154d981614ea8565b9150608086013567ffffffffffffffff8111156154f557600080fd5b61550188828901614f5d565b9150509295509295909350565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b600082198211156155505761555061550e565b500190565b60006020828403121561556757600080fd5b5051919050565b6000828210156155805761558061550e565b500390565b60006020828403121561559757600080fd5b8151612d9d81614e70565b6000806000606084860312156155b757600080fd5b83516155c281615388565b60208501519093506155d381614e92565b60408501519092506155e481614e70565b809150509250925092565b60006080828403121561560157600080fd5b6040516080810181811067ffffffffffffffff8211171561562457615624614eb6565b8060405250823581526020830135602082015260408301356040820152606083013560608201528091505092915050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602160045260246000fd5b60006020828403121561569657600080fd5b815160038110612d9d57600080fd5b600067ffffffffffffffff808411156156c0576156c0614eb6565b8360051b60206156d1818301614f0e565b8681529185019181810190368411156156e957600080fd5b865b8481101561571d578035868111156157035760008081fd5b61570f36828b01614f5d565b8452509183019183016156eb565b50979650505050505050565b60006020828403121561573b57600080fd5b8151612d9d81614ea8565b60006020828403121561575857600080fd5b8151612d9d81614e92565b60006020828403121561577557600080fd5b8151612d9d81615388565b8581528460208201527fffffffffffffffff0000000000000000000000000000000000000000000000008460c01b16604082015282151560f81b6048820152600082516157d4816049850160208701615285565b919091016049019695505050505050565b600067ffffffffffffffff8083168185168183048111821515161561580c5761580c61550e565b02949350505050565b600067ffffffffffffffff8083168185168083038211156158385761583861550e565b01949350505050565b6000806040838503121561585457600080fd5b825161585f81614e70565b602084015190925061516881615333565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601260045260246000fd5b6000826158ae576158ae615870565b7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff83147f8000000000000000000000000000000000000000000000000000000000000000831416156159025761590261550e565b500590565b6000808312837f8000000000000000000000000000000000000000000000000000000000000000018312811516156159415761594161550e565b837f7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0183138116156159755761597561550e565b50500390565b60007f7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff6000841360008413858304851182821616156159bc576159bc61550e565b7f800000000000000000000000000000000000000000000000000000000000000060008712868205881281841616156159f7576159f761550e565b60008712925087820587128484161615615a1357615a1361550e565b87850587128184161615615a2957615a2961550e565b505050929093029392505050565b6000808212827f7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff03841381151615615a7157615a7161550e565b827f8000000000000000000000000000000000000000000000000000000000000000038412811615615aa557615aa561550e565b50500190565b6000817fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0483118215151615615ae357615ae361550e565b500290565b600082615af757615af7615870565b500490565b868152600073ffffffffffffffffffffffffffffffffffffffff808816602084015280871660408401525084606083015283608083015260c060a0830152615b4760c08301846152b1565b98975050505050505050565b600060c08284031215615b6557600080fd5b615b6d614ee5565b8251615b7881615388565b81526020830151615b8881615333565b60208201526040830151615b9b81615333565b60408201526060830151615bae81615388565b60608201526080830151615bc181615388565b608082015260a08301516fffffffffffffffffffffffffffffffff81168114615be957600080fd5b60a08201529392505050565b60007fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff8203615c2657615c2661550e565b5060010190565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b600060ff831680615c6f57615c6f615870565b8060ff84160691505092915050565b600060ff821660ff841680821015615c9857615c9861550e565b90039392505050565b60008251615cb3818460208701615285565b919091019291505056fea164736f6c634300080f000a"; bytes internal constant disputeGameFactoryCode = - hex"6080604052600436106100e85760003560e01c80636593dc6e1161008a57806396cd97201161005957806396cd972014610313578063bb8aa1fc14610333578063c4d66de814610394578063f2fde38b146103b457600080fd5b80636593dc6e14610293578063715018a6146102c057806382ecf2f6146102d55780638da5cb5b146102e857600080fd5b8063254bd683116100c6578063254bd6831461019c5780634d1975b4146101c957806354fd4d50146101e85780635f0150cb1461023e57600080fd5b806314f6b1a3146100ed5780631b685b9e1461010f5780631e3342401461017c575b600080fd5b3480156100f957600080fd5b5061010d6101083660046110c6565b6103d4565b005b34801561011b57600080fd5b5061015261012a3660046110fd565b60656020526000908152604090205473ffffffffffffffffffffffffffffffffffffffff1681565b60405173ffffffffffffffffffffffffffffffffffffffff90911681526020015b60405180910390f35b34801561018857600080fd5b5061010d610197366004611118565b61045e565b3480156101a857600080fd5b506101bc6101b7366004611142565b6104aa565b60405161017391906111ef565b3480156101d557600080fd5b506068545b604051908152602001610173565b3480156101f457600080fd5b506102316040518060400160405280600581526020017f312e302e3000000000000000000000000000000000000000000000000000000081525081565b60405161017391906112ac565b34801561024a57600080fd5b5061025e6102593660046112bf565b6106ee565b6040805173ffffffffffffffffffffffffffffffffffffffff909316835267ffffffffffffffff909116602083015201610173565b34801561029f57600080fd5b506101da6102ae3660046110fd565b60666020526000908152604090205481565b3480156102cc57600080fd5b5061010d610741565b6101526102e33660046112bf565b610755565b3480156102f457600080fd5b5060335473ffffffffffffffffffffffffffffffffffffffff16610152565b34801561031f57600080fd5b506101da61032e3660046112bf565b6109ef565b34801561033f57600080fd5b5061035361034e366004611346565b610a28565b6040805163ffffffff909416845267ffffffffffffffff909216602084015273ffffffffffffffffffffffffffffffffffffffff1690820152606001610173565b3480156103a057600080fd5b5061010d6103af36600461135f565b610a91565b3480156103c057600080fd5b5061010d6103cf36600461135f565b610c2d565b6103dc610d00565b63ffffffff821660008181526065602052604080822080547fffffffffffffffffffffffff00000000000000000000000000000000000000001673ffffffffffffffffffffffffffffffffffffffff8616908117909155905190917fff513d80e2c7fa487608f70a618dfbc0cf415699dc69588c747e8c71566c88de91a35050565b610466610d00565b63ffffffff8216600081815260666020526040808220849055518392917f74d6665c4b26d5596a5aa13d3014e0c06af4d322075a797f87b03cd4c5bc91ca91a35050565b606854606090831015806104bc575081155b6106e7575060408051600583901b8101602001909152825b8381116106e5576000606882815481106104f0576104f061137c565b600091825260209091200154905060e081901c60a082901c67ffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff831663ffffffff891683036106b6576001865101865260008173ffffffffffffffffffffffffffffffffffffffff1663609d33346040518163ffffffff1660e01b8152600401600060405180830381865afa15801561058a573d6000803e3d6000fd5b505050506040513d6000823e601f3d9081017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe01682016040526105d091908101906113da565b905060008273ffffffffffffffffffffffffffffffffffffffff1663bcef3b556040518163ffffffff1660e01b8152600401602060405180830381865afa15801561061f573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061064391906114a5565b90506040518060a001604052808881526020018781526020018567ffffffffffffffff168152602001828152602001838152508860018a5161068591906114be565b815181106106955761069561137c565b6020026020010181905250888851106106b3575050505050506106e5565b50505b50507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff90920191506104d49050565b505b9392505050565b60008060006106ff878787876109ef565b60009081526067602052604090205473ffffffffffffffffffffffffffffffffffffffff81169860a09190911c67ffffffffffffffff16975095505050505050565b610749610d00565b6107536000610d81565b565b63ffffffff841660009081526065602052604081205473ffffffffffffffffffffffffffffffffffffffff16806107c5576040517f031c6de400000000000000000000000000000000000000000000000000000000815263ffffffff871660048201526024015b60405180910390fd5b63ffffffff86166000908152606660205260409020543414610813576040517f8620aa1900000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b60006108206001436114be565b40905061088a338783888860405160200161083f9594939291906114fc565b604080517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe081840301815291905273ffffffffffffffffffffffffffffffffffffffff841690610df8565b92508273ffffffffffffffffffffffffffffffffffffffff16638129fc1c346040518263ffffffff1660e01b81526004016000604051808303818588803b1580156108d457600080fd5b505af11580156108e8573d6000803e3d6000fd5b505050505060006108fb888888886109ef565b60008181526067602052604090205490915015610947576040517f014f6fe5000000000000000000000000000000000000000000000000000000008152600481018290526024016107bc565b60004260a01b60e08a901b178517600083815260676020526040808220839055606880546001810182559083527fa2153420d844928b4421650203c77babc8b33d7f2e7b450e2966db0c220977530183905551919250899163ffffffff8c169173ffffffffffffffffffffffffffffffffffffffff8916917f5b565efe82411da98814f356d0e7bcb8f0219b8d970307c5afb4a6903a8b2e359190a450505050949350505050565b600084848484604051602001610a089493929190611549565b604051602081830303815290604052805190602001209050949350505050565b600080600080600080610a8160688881548110610a4757610a4761137c565b906000526020600020015460e081901c9160a082901c67ffffffffffffffff169173ffffffffffffffffffffffffffffffffffffffff1690565b9199909850909650945050505050565b600054610100900460ff1615808015610ab15750600054600160ff909116105b80610acb5750303b158015610acb575060005460ff166001145b610b57576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602e60248201527f496e697469616c697a61626c653a20636f6e747261637420697320616c72656160448201527f647920696e697469616c697a656400000000000000000000000000000000000060648201526084016107bc565b600080547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff001660011790558015610bb557600080547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00ff166101001790555b610bbd610e06565b610bc682610d81565b8015610c2957600080547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00ff169055604051600181527f7f26b83ff96e1f2b6a682f133852f6798a09c465da95921460cefb38474024989060200160405180910390a15b5050565b610c35610d00565b73ffffffffffffffffffffffffffffffffffffffff8116610cd8576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602660248201527f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160448201527f646472657373000000000000000000000000000000000000000000000000000060648201526084016107bc565b610ce181610d81565b50565b73ffffffffffffffffffffffffffffffffffffffff163b151590565b60335473ffffffffffffffffffffffffffffffffffffffff163314610753576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e657260448201526064016107bc565b6033805473ffffffffffffffffffffffffffffffffffffffff8381167fffffffffffffffffffffffff0000000000000000000000000000000000000000831681179093556040519116919082907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e090600090a35050565b60006106e760008484610ea5565b600054610100900460ff16610e9d576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602b60248201527f496e697469616c697a61626c653a20636f6e7472616374206973206e6f74206960448201527f6e697469616c697a696e6700000000000000000000000000000000000000000060648201526084016107bc565b610753610feb565b600060608203516040830351602084035184518060208701018051600283016c5af43d3d93803e606057fd5bf3895289600d8a035278593da1005b363d3d373d3d3d3d610000806062363936013d738160481b1760218a03527f9e4ac34f21c619cefc926c8bd93b54bf5a39c7ab2127a895af1cc0691d7e3dff603a8a035272fd6100003d81600a3d39f336602c57343d527f6062820160781b1761ff9e82106059018a03528060f01b8352606c8101604c8a038cf097505086610f715763301164256000526004601cfd5b905285527fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe08501527fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc08401527fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffa09092019190915292915050565b600054610100900460ff16611082576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602b60248201527f496e697469616c697a61626c653a20636f6e7472616374206973206e6f74206960448201527f6e697469616c697a696e6700000000000000000000000000000000000000000060648201526084016107bc565b61075333610d81565b803563ffffffff8116811461109f57600080fd5b919050565b73ffffffffffffffffffffffffffffffffffffffff81168114610ce157600080fd5b600080604083850312156110d957600080fd5b6110e28361108b565b915060208301356110f2816110a4565b809150509250929050565b60006020828403121561110f57600080fd5b6106e78261108b565b6000806040838503121561112b57600080fd5b6111348361108b565b946020939093013593505050565b60008060006060848603121561115757600080fd5b6111608461108b565b95602085013595506040909401359392505050565b60005b83811015611190578181015183820152602001611178565b8381111561119f576000848401525b50505050565b600081518084526111bd816020860160208601611175565b601f017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0169290920160200192915050565b60006020808301818452808551808352604092508286019150828160051b87010184880160005b8381101561129e578883037fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc001855281518051845287810151888501528681015167ffffffffffffffff16878501526060808201519085015260809081015160a09185018290529061128a818601836111a5565b968901969450505090860190600101611216565b509098975050505050505050565b6020815260006106e760208301846111a5565b600080600080606085870312156112d557600080fd5b6112de8561108b565b935060208501359250604085013567ffffffffffffffff8082111561130257600080fd5b818701915087601f83011261131657600080fd5b81358181111561132557600080fd5b88602082850101111561133757600080fd5b95989497505060200194505050565b60006020828403121561135857600080fd5b5035919050565b60006020828403121561137157600080fd5b81356106e7816110a4565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b6000602082840312156113ec57600080fd5b815167ffffffffffffffff8082111561140457600080fd5b818401915084601f83011261141857600080fd5b81518181111561142a5761142a6113ab565b604051601f82017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0908116603f01168101908382118183101715611470576114706113ab565b8160405282815287602084870101111561148957600080fd5b61149a836020830160208801611175565b979650505050505050565b6000602082840312156114b757600080fd5b5051919050565b6000828210156114f7577f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b500390565b7fffffffffffffffffffffffffffffffffffffffff0000000000000000000000008660601b1681528460148201528360348201528183605483013760009101605401908152949350505050565b63ffffffff8516815283602082015260606040820152816060820152818360808301376000818301608090810191909152601f9092017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0160101939250505056fea164736f6c634300080f000a"; + hex"6080604052600436106100e85760003560e01c80636593dc6e1161008a57806396cd97201161005957806396cd972014610313578063bb8aa1fc14610333578063c4d66de814610394578063f2fde38b146103b457600080fd5b80636593dc6e14610293578063715018a6146102c057806382ecf2f6146102d55780638da5cb5b146102e857600080fd5b8063254bd683116100c6578063254bd6831461019c5780634d1975b4146101c957806354fd4d50146101e85780635f0150cb1461023e57600080fd5b806314f6b1a3146100ed5780631b685b9e1461010f5780631e3342401461017c575b600080fd5b3480156100f957600080fd5b5061010d6101083660046110c6565b6103d4565b005b34801561011b57600080fd5b5061015261012a3660046110fd565b60656020526000908152604090205473ffffffffffffffffffffffffffffffffffffffff1681565b60405173ffffffffffffffffffffffffffffffffffffffff90911681526020015b60405180910390f35b34801561018857600080fd5b5061010d610197366004611118565b61045e565b3480156101a857600080fd5b506101bc6101b7366004611142565b6104aa565b60405161017391906111ef565b3480156101d557600080fd5b506068545b604051908152602001610173565b3480156101f457600080fd5b506102316040518060400160405280600c81526020017f312e302e312d626574612e31000000000000000000000000000000000000000081525081565b60405161017391906112ac565b34801561024a57600080fd5b5061025e6102593660046112bf565b6106ee565b6040805173ffffffffffffffffffffffffffffffffffffffff909316835267ffffffffffffffff909116602083015201610173565b34801561029f57600080fd5b506101da6102ae3660046110fd565b60666020526000908152604090205481565b3480156102cc57600080fd5b5061010d610741565b6101526102e33660046112bf565b610755565b3480156102f457600080fd5b5060335473ffffffffffffffffffffffffffffffffffffffff16610152565b34801561031f57600080fd5b506101da61032e3660046112bf565b6109ef565b34801561033f57600080fd5b5061035361034e366004611346565b610a28565b6040805163ffffffff909416845267ffffffffffffffff909216602084015273ffffffffffffffffffffffffffffffffffffffff1690820152606001610173565b3480156103a057600080fd5b5061010d6103af36600461135f565b610a91565b3480156103c057600080fd5b5061010d6103cf36600461135f565b610c2d565b6103dc610d00565b63ffffffff821660008181526065602052604080822080547fffffffffffffffffffffffff00000000000000000000000000000000000000001673ffffffffffffffffffffffffffffffffffffffff8616908117909155905190917fff513d80e2c7fa487608f70a618dfbc0cf415699dc69588c747e8c71566c88de91a35050565b610466610d00565b63ffffffff8216600081815260666020526040808220849055518392917f74d6665c4b26d5596a5aa13d3014e0c06af4d322075a797f87b03cd4c5bc91ca91a35050565b606854606090831015806104bc575081155b6106e7575060408051600583901b8101602001909152825b8381116106e5576000606882815481106104f0576104f061137c565b600091825260209091200154905060e081901c60a082901c67ffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff831663ffffffff891683036106b6576001865101865260008173ffffffffffffffffffffffffffffffffffffffff1663609d33346040518163ffffffff1660e01b8152600401600060405180830381865afa15801561058a573d6000803e3d6000fd5b505050506040513d6000823e601f3d9081017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe01682016040526105d091908101906113da565b905060008273ffffffffffffffffffffffffffffffffffffffff1663bcef3b556040518163ffffffff1660e01b8152600401602060405180830381865afa15801561061f573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061064391906114a5565b90506040518060a001604052808881526020018781526020018567ffffffffffffffff168152602001828152602001838152508860018a5161068591906114be565b815181106106955761069561137c565b6020026020010181905250888851106106b3575050505050506106e5565b50505b50507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff90920191506104d49050565b505b9392505050565b60008060006106ff878787876109ef565b60009081526067602052604090205473ffffffffffffffffffffffffffffffffffffffff81169860a09190911c67ffffffffffffffff16975095505050505050565b610749610d00565b6107536000610d81565b565b63ffffffff841660009081526065602052604081205473ffffffffffffffffffffffffffffffffffffffff16806107c5576040517f031c6de400000000000000000000000000000000000000000000000000000000815263ffffffff871660048201526024015b60405180910390fd5b63ffffffff86166000908152606660205260409020543414610813576040517f8620aa1900000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b60006108206001436114be565b40905061088a338783888860405160200161083f9594939291906114fc565b604080517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe081840301815291905273ffffffffffffffffffffffffffffffffffffffff841690610df8565b92508273ffffffffffffffffffffffffffffffffffffffff16638129fc1c346040518263ffffffff1660e01b81526004016000604051808303818588803b1580156108d457600080fd5b505af11580156108e8573d6000803e3d6000fd5b505050505060006108fb888888886109ef565b60008181526067602052604090205490915015610947576040517f014f6fe5000000000000000000000000000000000000000000000000000000008152600481018290526024016107bc565b60004260a01b60e08a901b178517600083815260676020526040808220839055606880546001810182559083527fa2153420d844928b4421650203c77babc8b33d7f2e7b450e2966db0c220977530183905551919250899163ffffffff8c169173ffffffffffffffffffffffffffffffffffffffff8916917f5b565efe82411da98814f356d0e7bcb8f0219b8d970307c5afb4a6903a8b2e359190a450505050949350505050565b600084848484604051602001610a089493929190611549565b604051602081830303815290604052805190602001209050949350505050565b600080600080600080610a8160688881548110610a4757610a4761137c565b906000526020600020015460e081901c9160a082901c67ffffffffffffffff169173ffffffffffffffffffffffffffffffffffffffff1690565b9199909850909650945050505050565b600054610100900460ff1615808015610ab15750600054600160ff909116105b80610acb5750303b158015610acb575060005460ff166001145b610b57576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602e60248201527f496e697469616c697a61626c653a20636f6e747261637420697320616c72656160448201527f647920696e697469616c697a656400000000000000000000000000000000000060648201526084016107bc565b600080547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff001660011790558015610bb557600080547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00ff166101001790555b610bbd610e06565b610bc682610d81565b8015610c2957600080547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00ff169055604051600181527f7f26b83ff96e1f2b6a682f133852f6798a09c465da95921460cefb38474024989060200160405180910390a15b5050565b610c35610d00565b73ffffffffffffffffffffffffffffffffffffffff8116610cd8576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602660248201527f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160448201527f646472657373000000000000000000000000000000000000000000000000000060648201526084016107bc565b610ce181610d81565b50565b73ffffffffffffffffffffffffffffffffffffffff163b151590565b60335473ffffffffffffffffffffffffffffffffffffffff163314610753576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e657260448201526064016107bc565b6033805473ffffffffffffffffffffffffffffffffffffffff8381167fffffffffffffffffffffffff0000000000000000000000000000000000000000831681179093556040519116919082907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e090600090a35050565b60006106e760008484610ea5565b600054610100900460ff16610e9d576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602b60248201527f496e697469616c697a61626c653a20636f6e7472616374206973206e6f74206960448201527f6e697469616c697a696e6700000000000000000000000000000000000000000060648201526084016107bc565b610753610feb565b600060608203516040830351602084035184518060208701018051600283016c5af43d3d93803e606057fd5bf3895289600d8a035278593da1005b363d3d373d3d3d3d610000806062363936013d738160481b1760218a03527f9e4ac34f21c619cefc926c8bd93b54bf5a39c7ab2127a895af1cc0691d7e3dff603a8a035272fd6100003d81600a3d39f336602c57343d527f6062820160781b1761ff9e82106059018a03528060f01b8352606c8101604c8a038cf097505086610f715763301164256000526004601cfd5b905285527fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe08501527fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc08401527fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffa09092019190915292915050565b600054610100900460ff16611082576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602b60248201527f496e697469616c697a61626c653a20636f6e7472616374206973206e6f74206960448201527f6e697469616c697a696e6700000000000000000000000000000000000000000060648201526084016107bc565b61075333610d81565b803563ffffffff8116811461109f57600080fd5b919050565b73ffffffffffffffffffffffffffffffffffffffff81168114610ce157600080fd5b600080604083850312156110d957600080fd5b6110e28361108b565b915060208301356110f2816110a4565b809150509250929050565b60006020828403121561110f57600080fd5b6106e78261108b565b6000806040838503121561112b57600080fd5b6111348361108b565b946020939093013593505050565b60008060006060848603121561115757600080fd5b6111608461108b565b95602085013595506040909401359392505050565b60005b83811015611190578181015183820152602001611178565b8381111561119f576000848401525b50505050565b600081518084526111bd816020860160208601611175565b601f017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0169290920160200192915050565b60006020808301818452808551808352604092508286019150828160051b87010184880160005b8381101561129e578883037fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc001855281518051845287810151888501528681015167ffffffffffffffff16878501526060808201519085015260809081015160a09185018290529061128a818601836111a5565b968901969450505090860190600101611216565b509098975050505050505050565b6020815260006106e760208301846111a5565b600080600080606085870312156112d557600080fd5b6112de8561108b565b935060208501359250604085013567ffffffffffffffff8082111561130257600080fd5b818701915087601f83011261131657600080fd5b81358181111561132557600080fd5b88602082850101111561133757600080fd5b95989497505060200194505050565b60006020828403121561135857600080fd5b5035919050565b60006020828403121561137157600080fd5b81356106e7816110a4565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b6000602082840312156113ec57600080fd5b815167ffffffffffffffff8082111561140457600080fd5b818401915084601f83011261141857600080fd5b81518181111561142a5761142a6113ab565b604051601f82017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0908116603f01168101908382118183101715611470576114706113ab565b8160405282815287602084870101111561148957600080fd5b61149a836020830160208801611175565b979650505050505050565b6000602082840312156114b757600080fd5b5051919050565b6000828210156114f7577f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b500390565b7fffffffffffffffffffffffffffffffffffffffff0000000000000000000000008660601b1681528460148201528360348201528183605483013760009101605401908152949350505050565b63ffffffff8516815283602082015260606040820152816060820152818360808301376000818301608090810191909152601f9092017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0160101939250505056fea164736f6c634300080f000a"; bytes internal constant delayedWETHCode = - hex"6080604052600436106101845760003560e01c8063715018a6116100d6578063a9059cbb1161007f578063dd62ed3e11610059578063dd62ed3e1461051c578063f2fde38b14610554578063f3fef3a31461057457610193565b8063a9059cbb146104a8578063cd47bde1146104c8578063d0e30db01461019357610193565b80638da5cb5b116100b05780638da5cb5b1461041757806395d89b4114610442578063977a5ec51461048857610193565b8063715018a61461039057806379502c55146103a55780637eee288d146103f757610193565b80632e1a7d4d1161013857806354fd4d501161011257806354fd4d50146102e75780636a42b8f81461033057806370a082311461036357610193565b80632e1a7d4d14610280578063313ce567146102a0578063485cc955146102c757610193565b80630ca35682116101695780630ca356821461022357806318160ddd1461024357806323b872dd1461026057610193565b806306fdde031461019b578063095ea7b3146101f357610193565b3661019357610191610594565b005b610191610594565b3480156101a757600080fd5b5060408051808201909152600d81527f577261707065642045746865720000000000000000000000000000000000000060208201525b6040516101ea9190611378565b60405180910390f35b3480156101ff57600080fd5b5061021361020e36600461140d565b6105ef565b60405190151581526020016101ea565b34801561022f57600080fd5b5061019161023e366004611439565b610668565b34801561024f57600080fd5b50475b6040519081526020016101ea565b34801561026c57600080fd5b5061021361027b366004611452565b610734565b34801561028c57600080fd5b5061019161029b366004611439565b61094b565b3480156102ac57600080fd5b506102b5601281565b60405160ff90911681526020016101ea565b3480156102d357600080fd5b506101916102e2366004611493565b610958565b3480156102f357600080fd5b506101dd6040518060400160405280600581526020017f312e302e3000000000000000000000000000000000000000000000000000000081525081565b34801561033c57600080fd5b507f0000000000000000000000000000000000000000000000000000000000093a80610252565b34801561036f57600080fd5b5061025261037e3660046114cc565b60656020526000908152604090205481565b34801561039c57600080fd5b50610191610b34565b3480156103b157600080fd5b506068546103d29073ffffffffffffffffffffffffffffffffffffffff1681565b60405173ffffffffffffffffffffffffffffffffffffffff90911681526020016101ea565b34801561040357600080fd5b5061019161041236600461140d565b610b48565b34801561042357600080fd5b5060335473ffffffffffffffffffffffffffffffffffffffff166103d2565b34801561044e57600080fd5b5060408051808201909152600481527f574554480000000000000000000000000000000000000000000000000000000060208201526101dd565b34801561049457600080fd5b506101916104a336600461140d565b610b9c565b3480156104b457600080fd5b506102136104c336600461140d565b610c89565b3480156104d457600080fd5b506105076104e3366004611493565b60676020908152600092835260408084209091529082529020805460019091015482565b604080519283526020830191909152016101ea565b34801561052857600080fd5b50610252610537366004611493565b606660209081526000928352604080842090915290825290205481565b34801561056057600080fd5b5061019161056f3660046114cc565b610c9d565b34801561058057600080fd5b5061019161058f36600461140d565b610d51565b33600090815260656020526040812080543492906105b3908490611518565b909155505060405134815233907fe1fffcc4923d04b559f4d29a8bfc6cda04eb5b0d3c460751c2402c5c5cc9109c9060200160405180910390a2565b33600081815260666020908152604080832073ffffffffffffffffffffffffffffffffffffffff8716808552925280832085905551919290917f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b925906106579086815260200190565b60405180910390a350600192915050565b60335473ffffffffffffffffffffffffffffffffffffffff1633146106ee576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601660248201527f44656c61796564574554483a206e6f74206f776e65720000000000000000000060448201526064015b60405180910390fd5b60004782106106fd57476106ff565b815b604051909150339082156108fc029083906000818181858888f1935050505015801561072f573d6000803e3d6000fd5b505050565b73ffffffffffffffffffffffffffffffffffffffff831660009081526065602052604081205482111561076657600080fd5b73ffffffffffffffffffffffffffffffffffffffff841633148015906107dc575073ffffffffffffffffffffffffffffffffffffffff841660009081526066602090815260408083203384529091529020547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff14155b156108645773ffffffffffffffffffffffffffffffffffffffff8416600090815260666020908152604080832033845290915290205482111561081e57600080fd5b73ffffffffffffffffffffffffffffffffffffffff841660009081526066602090815260408083203384529091528120805484929061085e908490611530565b90915550505b73ffffffffffffffffffffffffffffffffffffffff841660009081526065602052604081208054849290610899908490611530565b909155505073ffffffffffffffffffffffffffffffffffffffff8316600090815260656020526040812080548492906108d3908490611518565b925050819055508273ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef8460405161093991815260200190565b60405180910390a35060019392505050565b6109553382610d51565b50565b600054610100900460ff16158080156109785750600054600160ff909116105b806109925750303b158015610992575060005460ff166001145b610a1e576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602e60248201527f496e697469616c697a61626c653a20636f6e747261637420697320616c72656160448201527f647920696e697469616c697a656400000000000000000000000000000000000060648201526084016106e5565b600080547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff001660011790558015610a7c57600080547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00ff166101001790555b610a8461109b565b610a8d8361113a565b606880547fffffffffffffffffffffffff00000000000000000000000000000000000000001673ffffffffffffffffffffffffffffffffffffffff8416179055801561072f57600080547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00ff169055604051600181527f7f26b83ff96e1f2b6a682f133852f6798a09c465da95921460cefb38474024989060200160405180910390a1505050565b610b3c6111b1565b610b46600061113a565b565b33600090815260676020908152604080832073ffffffffffffffffffffffffffffffffffffffff861684529091528120426001820155805490918391839190610b92908490611518565b9091555050505050565b60335473ffffffffffffffffffffffffffffffffffffffff163314610c1d576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601660248201527f44656c61796564574554483a206e6f74206f776e65720000000000000000000060448201526064016106e5565b73ffffffffffffffffffffffffffffffffffffffff821660008181526066602090815260408083203380855290835292819020859055518481529192917f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b925910160405180910390a35050565b6000610c96338484610734565b9392505050565b610ca56111b1565b73ffffffffffffffffffffffffffffffffffffffff8116610d48576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602660248201527f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160448201527f646472657373000000000000000000000000000000000000000000000000000060648201526084016106e5565b6109558161113a565b606860009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16635c975abb6040518163ffffffff1660e01b8152600401602060405180830381865afa158015610dbe573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610de29190611547565b15610e49576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601f60248201527f44656c61796564574554483a20636f6e7472616374206973207061757365640060448201526064016106e5565b33600090815260676020908152604080832073ffffffffffffffffffffffffffffffffffffffff8616845290915290208054821115610f0a576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602d60248201527f44656c61796564574554483a20696e73756666696369656e7420756e6c6f636b60448201527f6564207769746864726177616c0000000000000000000000000000000000000060648201526084016106e5565b6000816001015411610f9d576040517f08c379a0000000000000000000000000000000000000000000000000000000008152602060048201526024808201527f44656c61796564574554483a207769746864726177616c206e6f7420756e6c6f60448201527f636b65640000000000000000000000000000000000000000000000000000000060648201526084016106e5565b427f0000000000000000000000000000000000000000000000000000000000093a808260010154610fce9190611518565b111561105c576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602560248201527f44656c61796564574554483a207769746864726177616c2064656c6179206e6f60448201527f74206d657400000000000000000000000000000000000000000000000000000060648201526084016106e5565b818160000160008282546110709190611530565b9091555061072f905082611232565b73ffffffffffffffffffffffffffffffffffffffff163b151590565b600054610100900460ff16611132576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602b60248201527f496e697469616c697a61626c653a20636f6e7472616374206973206e6f74206960448201527f6e697469616c697a696e6700000000000000000000000000000000000000000060648201526084016106e5565b610b466112d8565b6033805473ffffffffffffffffffffffffffffffffffffffff8381167fffffffffffffffffffffffff0000000000000000000000000000000000000000831681179093556040519116919082907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e090600090a35050565b60335473ffffffffffffffffffffffffffffffffffffffff163314610b46576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e657260448201526064016106e5565b3360009081526065602052604090205481111561124e57600080fd5b336000908152606560205260408120805483929061126d908490611530565b9091555050604051339082156108fc029083906000818181858888f1935050505015801561129f573d6000803e3d6000fd5b5060405181815233907f7fcf532c15f0a6db0bd6d0e038bea71d30d808c7d98cb3bf7268a95bf5081b659060200160405180910390a250565b600054610100900460ff1661136f576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602b60248201527f496e697469616c697a61626c653a20636f6e7472616374206973206e6f74206960448201527f6e697469616c697a696e6700000000000000000000000000000000000000000060648201526084016106e5565b610b463361113a565b600060208083528351808285015260005b818110156113a557858101830151858201604001528201611389565b818111156113b7576000604083870101525b50601f017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe016929092016040019392505050565b73ffffffffffffffffffffffffffffffffffffffff8116811461095557600080fd5b6000806040838503121561142057600080fd5b823561142b816113eb565b946020939093013593505050565b60006020828403121561144b57600080fd5b5035919050565b60008060006060848603121561146757600080fd5b8335611472816113eb565b92506020840135611482816113eb565b929592945050506040919091013590565b600080604083850312156114a657600080fd5b82356114b1816113eb565b915060208301356114c1816113eb565b809150509250929050565b6000602082840312156114de57600080fd5b8135610c96816113eb565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b6000821982111561152b5761152b6114e9565b500190565b600082821015611542576115426114e9565b500390565b60006020828403121561155957600080fd5b81518015158114610c9657600080fdfea164736f6c634300080f000a"; + hex"6080604052600436106101845760003560e01c8063715018a6116100d6578063a9059cbb1161007f578063dd62ed3e11610059578063dd62ed3e1461051c578063f2fde38b14610554578063f3fef3a31461057457610193565b8063a9059cbb146104a8578063cd47bde1146104c8578063d0e30db01461019357610193565b80638da5cb5b116100b05780638da5cb5b1461041757806395d89b4114610442578063977a5ec51461048857610193565b8063715018a61461039057806379502c55146103a55780637eee288d146103f757610193565b80632e1a7d4d1161013857806354fd4d501161011257806354fd4d50146102e75780636a42b8f81461033057806370a082311461036357610193565b80632e1a7d4d14610280578063313ce567146102a0578063485cc955146102c757610193565b80630ca35682116101695780630ca356821461022357806318160ddd1461024357806323b872dd1461026057610193565b806306fdde031461019b578063095ea7b3146101f357610193565b3661019357610191610594565b005b610191610594565b3480156101a757600080fd5b5060408051808201909152600d81527f577261707065642045746865720000000000000000000000000000000000000060208201525b6040516101ea91906113fd565b60405180910390f35b3480156101ff57600080fd5b5061021361020e366004611492565b6105ef565b60405190151581526020016101ea565b34801561022f57600080fd5b5061019161023e3660046114be565b610668565b34801561024f57600080fd5b50475b6040519081526020016101ea565b34801561026c57600080fd5b5061021361027b3660046114d7565b6107b9565b34801561028c57600080fd5b5061019161029b3660046114be565b6109d0565b3480156102ac57600080fd5b506102b5601281565b60405160ff90911681526020016101ea565b3480156102d357600080fd5b506101916102e2366004611518565b6109dd565b3480156102f357600080fd5b506101dd6040518060400160405280600c81526020017f312e312e312d626574612e32000000000000000000000000000000000000000081525081565b34801561033c57600080fd5b507f0000000000000000000000000000000000000000000000000000000000093a80610252565b34801561036f57600080fd5b5061025261037e366004611551565b60656020526000908152604090205481565b34801561039c57600080fd5b50610191610bb9565b3480156103b157600080fd5b506068546103d29073ffffffffffffffffffffffffffffffffffffffff1681565b60405173ffffffffffffffffffffffffffffffffffffffff90911681526020016101ea565b34801561040357600080fd5b50610191610412366004611492565b610bcd565b34801561042357600080fd5b5060335473ffffffffffffffffffffffffffffffffffffffff166103d2565b34801561044e57600080fd5b5060408051808201909152600481527f574554480000000000000000000000000000000000000000000000000000000060208201526101dd565b34801561049457600080fd5b506101916104a3366004611492565b610c21565b3480156104b457600080fd5b506102136104c3366004611492565b610d0e565b3480156104d457600080fd5b506105076104e3366004611518565b60676020908152600092835260408084209091529082529020805460019091015482565b604080519283526020830191909152016101ea565b34801561052857600080fd5b50610252610537366004611518565b606660209081526000928352604080842090915290825290205481565b34801561056057600080fd5b5061019161056f366004611551565b610d22565b34801561058057600080fd5b5061019161058f366004611492565b610dd6565b33600090815260656020526040812080543492906105b390849061159d565b909155505060405134815233907fe1fffcc4923d04b559f4d29a8bfc6cda04eb5b0d3c460751c2402c5c5cc9109c9060200160405180910390a2565b33600081815260666020908152604080832073ffffffffffffffffffffffffffffffffffffffff8716808552925280832085905551919290917f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b925906106579086815260200190565b60405180910390a350600192915050565b60335473ffffffffffffffffffffffffffffffffffffffff1633146106ee576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601660248201527f44656c61796564574554483a206e6f74206f776e65720000000000000000000060448201526064015b60405180910390fd5b60004782106106fd57476106ff565b815b604051909150600090339083908381818185875af1925050503d8060008114610744576040519150601f19603f3d011682016040523d82523d6000602084013e610749565b606091505b50509050806107b4576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601b60248201527f44656c61796564574554483a207265636f766572206661696c6564000000000060448201526064016106e5565b505050565b73ffffffffffffffffffffffffffffffffffffffff83166000908152606560205260408120548211156107eb57600080fd5b73ffffffffffffffffffffffffffffffffffffffff84163314801590610861575073ffffffffffffffffffffffffffffffffffffffff841660009081526066602090815260408083203384529091529020547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff14155b156108e95773ffffffffffffffffffffffffffffffffffffffff841660009081526066602090815260408083203384529091529020548211156108a357600080fd5b73ffffffffffffffffffffffffffffffffffffffff84166000908152606660209081526040808320338452909152812080548492906108e39084906115b5565b90915550505b73ffffffffffffffffffffffffffffffffffffffff84166000908152606560205260408120805484929061091e9084906115b5565b909155505073ffffffffffffffffffffffffffffffffffffffff83166000908152606560205260408120805484929061095890849061159d565b925050819055508273ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef846040516109be91815260200190565b60405180910390a35060019392505050565b6109da3382610dd6565b50565b600054610100900460ff16158080156109fd5750600054600160ff909116105b80610a175750303b158015610a17575060005460ff166001145b610aa3576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602e60248201527f496e697469616c697a61626c653a20636f6e747261637420697320616c72656160448201527f647920696e697469616c697a656400000000000000000000000000000000000060648201526084016106e5565b600080547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff001660011790558015610b0157600080547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00ff166101001790555b610b09611120565b610b12836111bf565b606880547fffffffffffffffffffffffff00000000000000000000000000000000000000001673ffffffffffffffffffffffffffffffffffffffff841617905580156107b457600080547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00ff169055604051600181527f7f26b83ff96e1f2b6a682f133852f6798a09c465da95921460cefb38474024989060200160405180910390a1505050565b610bc1611236565b610bcb60006111bf565b565b33600090815260676020908152604080832073ffffffffffffffffffffffffffffffffffffffff861684529091528120426001820155805490918391839190610c1790849061159d565b9091555050505050565b60335473ffffffffffffffffffffffffffffffffffffffff163314610ca2576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601660248201527f44656c61796564574554483a206e6f74206f776e65720000000000000000000060448201526064016106e5565b73ffffffffffffffffffffffffffffffffffffffff821660008181526066602090815260408083203380855290835292819020859055518481529192917f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b925910160405180910390a35050565b6000610d1b3384846107b9565b9392505050565b610d2a611236565b73ffffffffffffffffffffffffffffffffffffffff8116610dcd576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602660248201527f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160448201527f646472657373000000000000000000000000000000000000000000000000000060648201526084016106e5565b6109da816111bf565b606860009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16635c975abb6040518163ffffffff1660e01b8152600401602060405180830381865afa158015610e43573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610e6791906115cc565b15610ece576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601f60248201527f44656c61796564574554483a20636f6e7472616374206973207061757365640060448201526064016106e5565b33600090815260676020908152604080832073ffffffffffffffffffffffffffffffffffffffff8616845290915290208054821115610f8f576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602d60248201527f44656c61796564574554483a20696e73756666696369656e7420756e6c6f636b60448201527f6564207769746864726177616c0000000000000000000000000000000000000060648201526084016106e5565b6000816001015411611022576040517f08c379a0000000000000000000000000000000000000000000000000000000008152602060048201526024808201527f44656c61796564574554483a207769746864726177616c206e6f7420756e6c6f60448201527f636b65640000000000000000000000000000000000000000000000000000000060648201526084016106e5565b427f0000000000000000000000000000000000000000000000000000000000093a808260010154611053919061159d565b11156110e1576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602560248201527f44656c61796564574554483a207769746864726177616c2064656c6179206e6f60448201527f74206d657400000000000000000000000000000000000000000000000000000060648201526084016106e5565b818160000160008282546110f591906115b5565b909155506107b49050826112b7565b73ffffffffffffffffffffffffffffffffffffffff163b151590565b600054610100900460ff166111b7576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602b60248201527f496e697469616c697a61626c653a20636f6e7472616374206973206e6f74206960448201527f6e697469616c697a696e6700000000000000000000000000000000000000000060648201526084016106e5565b610bcb61135d565b6033805473ffffffffffffffffffffffffffffffffffffffff8381167fffffffffffffffffffffffff0000000000000000000000000000000000000000831681179093556040519116919082907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e090600090a35050565b60335473ffffffffffffffffffffffffffffffffffffffff163314610bcb576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e657260448201526064016106e5565b336000908152606560205260409020548111156112d357600080fd5b33600090815260656020526040812080548392906112f29084906115b5565b9091555050604051339082156108fc029083906000818181858888f19350505050158015611324573d6000803e3d6000fd5b5060405181815233907f7fcf532c15f0a6db0bd6d0e038bea71d30d808c7d98cb3bf7268a95bf5081b659060200160405180910390a250565b600054610100900460ff166113f4576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602b60248201527f496e697469616c697a61626c653a20636f6e7472616374206973206e6f74206960448201527f6e697469616c697a696e6700000000000000000000000000000000000000000060648201526084016106e5565b610bcb336111bf565b600060208083528351808285015260005b8181101561142a5785810183015185820160400152820161140e565b8181111561143c576000604083870101525b50601f017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe016929092016040019392505050565b73ffffffffffffffffffffffffffffffffffffffff811681146109da57600080fd5b600080604083850312156114a557600080fd5b82356114b081611470565b946020939093013593505050565b6000602082840312156114d057600080fd5b5035919050565b6000806000606084860312156114ec57600080fd5b83356114f781611470565b9250602084013561150781611470565b929592945050506040919091013590565b6000806040838503121561152b57600080fd5b823561153681611470565b9150602083013561154681611470565b809150509250929050565b60006020828403121561156357600080fd5b8135610d1b81611470565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b600082198211156115b0576115b061156e565b500190565b6000828210156115c7576115c761156e565b500390565b6000602082840312156115de57600080fd5b81518015158114610d1b57600080fdfea164736f6c634300080f000a"; bytes internal constant preimageOracleCode = - hex"6080604052600436106101cd5760003560e01c80638dc4be11116100f7578063dd24f9bf11610095578063ec5efcbc11610064578063ec5efcbc1461065f578063f3f480d91461067f578063faf37bc7146106b2578063fef2b4ed146106c557600080fd5b8063dd24f9bf1461059f578063ddcd58de146105d2578063e03110e11461060a578063e15926111461063f57600080fd5b8063b2e67ba8116100d1578063b2e67ba814610512578063b4801e611461054a578063d18534b51461056a578063da35c6641461058a57600080fd5b80638dc4be11146104835780639d53a648146104a35780639d7e8769146104f257600080fd5b806354fd4d501161016f5780637917de1d1161013e5780637917de1d146103bf5780637ac54767146103df5780638542cf50146103ff578063882856ef1461044a57600080fd5b806354fd4d50146102dd57806361238bde146103335780636551927b1461036b5780637051472e146103a357600080fd5b80632055b36b116101ab5780632055b36b146102735780633909af5c146102885780634d52b4c9146102a857806352f0f3ad146102bd57600080fd5b8063013cf08b146101d25780630359a5631461022357806304697c7814610251575b600080fd5b3480156101de57600080fd5b506101f26101ed366004612d2f565b6106f2565b6040805173ffffffffffffffffffffffffffffffffffffffff90931683526020830191909152015b60405180910390f35b34801561022f57600080fd5b5061024361023e366004612d71565b610737565b60405190815260200161021a565b34801561025d57600080fd5b5061027161026c366004612de4565b61086f565b005b34801561027f57600080fd5b50610243601081565b34801561029457600080fd5b506102716102a3366004613008565b6109a5565b3480156102b457600080fd5b50610243610bfc565b3480156102c957600080fd5b506102436102d83660046130f4565b610c17565b3480156102e957600080fd5b506103266040518060400160405280600581526020017f312e302e3000000000000000000000000000000000000000000000000000000081525081565b60405161021a919061315b565b34801561033f57600080fd5b5061024361034e3660046131ac565b600160209081526000928352604080842090915290825290205481565b34801561037757600080fd5b50610243610386366004612d71565b601560209081526000928352604080842090915290825290205481565b3480156103af57600080fd5b506102436703782dace9d9000081565b3480156103cb57600080fd5b506102716103da3660046131ce565b610cec565b3480156103eb57600080fd5b506102436103fa366004612d2f565b6111ef565b34801561040b57600080fd5b5061043a61041a3660046131ac565b600260209081526000928352604080842090915290825290205460ff1681565b604051901515815260200161021a565b34801561045657600080fd5b5061046a61046536600461326a565b611206565b60405167ffffffffffffffff909116815260200161021a565b34801561048f57600080fd5b5061027161049e36600461329d565b611260565b3480156104af57600080fd5b506102436104be366004612d71565b73ffffffffffffffffffffffffffffffffffffffff9091166000908152601860209081526040808320938352929052205490565b3480156104fe57600080fd5b5061027161050d3660046132e9565b61135b565b34801561051e57600080fd5b5061024361052d366004612d71565b601760209081526000928352604080842090915290825290205481565b34801561055657600080fd5b5061024361056536600461326a565b611512565b34801561057657600080fd5b50610271610585366004613008565b611544565b34801561059657600080fd5b50601354610243565b3480156105ab57600080fd5b507f0000000000000000000000000000000000000000000000000000000000002710610243565b3480156105de57600080fd5b506102436105ed366004612d71565b601660209081526000928352604080842090915290825290205481565b34801561061657600080fd5b5061062a6106253660046131ac565b611906565b6040805192835260208301919091520161021a565b34801561064b57600080fd5b5061027161065a36600461329d565b6119f7565b34801561066b57600080fd5b5061027161067a366004613375565b611aff565b34801561068b57600080fd5b507f0000000000000000000000000000000000000000000000000000000000000078610243565b6102716106c036600461340e565b611c85565b3480156106d157600080fd5b506102436106e0366004612d2f565b60006020819052908152604090205481565b6013818154811061070257600080fd5b60009182526020909120600290910201805460019091015473ffffffffffffffffffffffffffffffffffffffff909116915082565b73ffffffffffffffffffffffffffffffffffffffff82166000908152601560209081526040808320848452909152812054819061077a9060601c63ffffffff1690565b63ffffffff16905060005b6010811015610867578160011660010361080d5773ffffffffffffffffffffffffffffffffffffffff85166000908152601460209081526040808320878452909152902081601081106107da576107da61344a565b0154604080516020810192909252810184905260600160405160208183030381529060405280519060200120925061084e565b82600382601081106108215761082161344a565b01546040805160208101939093528201526060016040516020818303038152906040528051906020012092505b60019190911c908061085f816134a8565b915050610785565b505092915050565b600080600080608060146030823785878260140137601480870182207effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff167f06000000000000000000000000000000000000000000000000000000000000001794506000908190889084018b5afa94503d60010191506008820189106108fc5763fe2549876000526004601cfd5b60c082901b81526008018481533d6000600183013e88017ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff8015160008481526002602090815260408083208c8452825280832080547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0016600190811790915587845282528083209b83529a81528a82209290925593845283905296909120959095555050505050565b60006109b18a8a610737565b90506109d486868360208b01356109cf6109ca8d6134e0565b611ef0565b611f30565b80156109f257506109f283838360208801356109cf6109ca8a6134e0565b610a28576040517f09bde33900000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b866040013588604051602001610a3e91906135af565b6040516020818303038152906040528051906020012014610a8b576040517f1968a90200000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b836020013587602001356001610aa191906135ed565b14610ad8576040517f9a3b119900000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b610b2088610ae68680613605565b8080601f016020809104026020016040519081016040528093929190818152602001838380828437600092019190915250611f9192505050565b610b29886120ec565b836040013588604051602001610b3f91906135af565b6040516020818303038152906040528051906020012003610b8c576040517f9843145b00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b73ffffffffffffffffffffffffffffffffffffffff8a1660009081526015602090815260408083208c8452909152902080547fffffffffffffffffffffffffffffffffffffffffffffffff0000000000000000166001179055610bf08a8a33612894565b50505050505050505050565b6001610c0a6010600261378c565b610c149190613798565b81565b6000610c23868661294d565b9050610c308360086135ed565b821180610c3d5750602083115b15610c74576040517ffe25498700000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6000602081815260c085901b82526008959095528251828252600286526040808320858452875280832080547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff001660019081179091558484528752808320948352938652838220558181529384905292205592915050565b60608115610d0557610cfe86866129fa565b9050610d3f565b85858080601f0160208091040260200160405190810160405280939291908181526020018383808284376000920191909152509293505050505b3360009081526014602090815260408083208b845290915280822081516102008101928390529160109082845b815481526020019060010190808311610d6c57505050505090506000601560003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008b81526020019081526020016000205490506000610ded8260601c63ffffffff1690565b63ffffffff169050333214610e2e576040517fba092d1600000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b610e3e8260801c63ffffffff1690565b63ffffffff16600003610e7d576040517f87138d5c00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b610e878260c01c90565b67ffffffffffffffff1615610ec8576040517f475a253500000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b898114610f01576040517f60f95d5a00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b610f0e89898d8886612a73565b83516020850160888204881415608883061715610f33576307b1daf16000526004601cfd5b60405160c8810160405260005b83811015610fe3578083018051835260208101516020840152604081015160408401526060810151606084015260808101516080840152508460888301526088810460051b8b013560a883015260c882206001860195508560005b610200811015610fd8576001821615610fb85782818b0152610fd8565b8981015160009081526020938452604090209260019290921c9101610f9b565b505050608801610f40565b50505050600160106002610ff7919061378c565b6110019190613798565b81111561103a576040517f6229572300000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6110af61104d8360401c63ffffffff1690565b61105d9063ffffffff168a6135ed565b60401b7fffffffffffffffffffffffffffffffffffffffff00000000ffffffffffffffff606084901b167fffffffffffffffffffffffffffffffff0000000000000000ffffffffffffffff8516171790565b9150841561113c5777ffffffffffffffffffffffffffffffffffffffffffffffff82164260c01b1791506110e98260801c63ffffffff1690565b63ffffffff166110ff8360401c63ffffffff1690565b63ffffffff161461113c576040517f7b1dafd100000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b3360009081526014602090815260408083208e8452909152902061116290846010612ca5565b503360008181526018602090815260408083208f8452825280832080546001810182559084528284206004820401805460039092166008026101000a67ffffffffffffffff818102199093164390931602919091179055838352601582528083208f8452909152812084905560609190911b81523690601437366014016000a05050505050505050505050565b600381601081106111ff57600080fd5b0154905081565b6018602052826000526040600020602052816000526040600020818154811061122e57600080fd5b906000526020600020906004918282040191900660080292509250509054906101000a900467ffffffffffffffff1681565b60443560008060088301861061127e5763fe2549876000526004601cfd5b60c083901b60805260888386823786600882030151915060206000858360025afa9050806112ab57600080fd5b50600080517effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff167f0400000000000000000000000000000000000000000000000000000000000000178082526002602090815260408084208a8552825280842080547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff001660019081179091558385528252808420998452988152888320939093558152908190529490942055505050565b600080603087600037602060006030600060025afa806113835763f91129696000526004601cfd5b6000517effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff167f010000000000000000000000000000000000000000000000000000000000000017608081815260a08c905260c08b905260308a60e037603088609083013760008060c083600a5afa925082611405576309bde3396000526004601cfd5b6028861061141b5763fe2549876000526004601cfd5b6000602882015278200000000000000000000000000000000000000000000000008152600881018b905285810151935060308a8237603081019b909b52505060509098207effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff167f0500000000000000000000000000000000000000000000000000000000000000176000818152600260209081526040808320868452825280832080547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0016600190811790915584845282528083209583529481528482209a909a559081528089529190912096909655505050505050565b6014602052826000526040600020602052816000526040600020816010811061153a57600080fd5b0154925083915050565b73ffffffffffffffffffffffffffffffffffffffff891660009081526015602090815260408083208b845290915290205467ffffffffffffffff8116156115b7576040517fc334f06900000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b7f00000000000000000000000000000000000000000000000000000000000000786115e28260c01c90565b6115f69067ffffffffffffffff1642613798565b1161162d576040517f55d4cbf900000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b60006116398b8b610737565b905061165287878360208c01356109cf6109ca8e6134e0565b8015611670575061167084848360208901356109cf6109ca8b6134e0565b6116a6576040517f09bde33900000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b8760400135896040516020016116bc91906135af565b6040516020818303038152906040528051906020012014611709576040517f1968a90200000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b84602001358860200135600161171f91906135ed565b141580611751575060016117398360601c63ffffffff1690565b61174391906137af565b63ffffffff16856020013514155b15611788576040517f9a3b119900000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b61179689610ae68780613605565b61179f896120ec565b60006117aa8a612bc6565b7effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff167f020000000000000000000000000000000000000000000000000000000000000017905060006118018460a01c63ffffffff1690565b67ffffffffffffffff169050600160026000848152602001908152602001600020600083815260200190815260200160002060006101000a81548160ff021916908315150217905550601760008e73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008d815260200190815260200160002054600160008481526020019081526020016000206000838152602001908152602001600020819055506118d38460801c63ffffffff1690565b600083815260208190526040902063ffffffff9190911690556118f78d8d81612894565b50505050505050505050505050565b6000828152600260209081526040808320848452909152812054819060ff1661198f576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601460248201527f7072652d696d616765206d757374206578697374000000000000000000000000604482015260640160405180910390fd5b50600083815260208181526040909120546119ab8160086135ed565b6119b68560206135ed565b106119d457836119c78260086135ed565b6119d19190613798565b91505b506000938452600160209081526040808620948652939052919092205492909150565b604435600080600883018610611a155763fe2549876000526004601cfd5b60c083901b6080526088838682378087017ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff80151908490207effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff167f02000000000000000000000000000000000000000000000000000000000000001760008181526002602090815260408083208b8452825280832080547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0016600190811790915584845282528083209a83529981528982209390935590815290819052959095209190915550505050565b6000611b0b8686610737565b9050611b2483838360208801356109cf6109ca8a6134e0565b611b5a576040517f09bde33900000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b602084013515611b96576040517f9a3b119900000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b611b9e612ce3565b611bac81610ae68780613605565b611bb5816120ec565b846040013581604051602001611bcb91906135af565b6040516020818303038152906040528051906020012003611c18576040517f9843145b00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b73ffffffffffffffffffffffffffffffffffffffff87166000908152601560209081526040808320898452909152902080547fffffffffffffffffffffffffffffffffffffffffffffffff0000000000000000166001179055611c7c878733612894565b50505050505050565b6703782dace9d90000341015611cc7576040517fe92c469f00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b333214611d00576040517fba092d1600000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b611d0b8160086137d4565b63ffffffff168263ffffffff1610611d4f576040517ffe25498700000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b7f00000000000000000000000000000000000000000000000000000000000027108163ffffffff161015611daf576040517f7b1dafd100000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b336000818152601560209081526040808320878452825280832080547fffffffffffffffff0000000000000000ffffffffffffffffffffffffffffffff1660a09790971b7fffffffffffffffffffffffff00000000ffffffffffffffffffffffffffffffff169690961760809590951b949094179094558251808401845282815280850186815260138054600181018255908452915160029092027f66de8ffda797e3de9c05e8fc57b3bf0ec28a930d40b0d285d93c06501cf6a0908101805473ffffffffffffffffffffffffffffffffffffffff9094167fffffffffffffffffffffffff000000000000000000000000000000000000000090941693909317909255517f66de8ffda797e3de9c05e8fc57b3bf0ec28a930d40b0d285d93c06501cf6a0919091015590815260168352818120938152929091529020349055565b6000816000015182602001518360400151604051602001611f13939291906137fc565b604051602081830303815290604052805190602001209050919050565b60008160005b6010811015611f84578060051b880135600186831c1660018114611f695760008481526020839052604090209350611f7a565b600082815260208590526040902093505b5050600101611f36565b5090931495945050505050565b6088815114611f9f57600080fd5b6020810160208301612020565b8260031b8201518060001a8160011a60081b178160021a60101b8260031a60181b17178160041a60201b8260051a60281b178260061a60301b8360071a60381b171717905061201a81612005868560059190911b015190565b1867ffffffffffffffff16600586901b840152565b50505050565b61202c60008383611fac565b61203860018383611fac565b61204460028383611fac565b61205060038383611fac565b61205c60048383611fac565b61206860058383611fac565b61207460068383611fac565b61208060078383611fac565b61208c60088383611fac565b61209860098383611fac565b6120a4600a8383611fac565b6120b0600b8383611fac565b6120bc600c8383611fac565b6120c8600d8383611fac565b6120d4600e8383611fac565b6120e0600f8383611fac565b61201a60108383611fac565b6040805178010000000000008082800000000000808a8000000080008000602082015279808b00000000800000018000000080008081800000000000800991810191909152788a00000000000000880000000080008009000000008000000a60608201527b8000808b800000000000008b8000000000008089800000000000800360808201527f80000000000080028000000000000080000000000000800a800000008000000a60a08201527f800000008000808180000000000080800000000080000001800000008000800860c082015260009060e00160405160208183030381529060405290506020820160208201612774565b6102808101516101e082015161014083015160a0840151845118189118186102a082015161020083015161016084015160c0850151602086015118189118186102c083015161022084015161018085015160e0860151604087015118189118186102e08401516102408501516101a0860151610100870151606088015118189118186103008501516102608601516101c0870151610120880151608089015118189118188084603f1c61229f8660011b67ffffffffffffffff1690565b18188584603f1c6122ba8660011b67ffffffffffffffff1690565b18188584603f1c6122d58660011b67ffffffffffffffff1690565b181895508483603f1c6122f28560011b67ffffffffffffffff1690565b181894508387603f1c61230f8960011b67ffffffffffffffff1690565b60208b01518b51861867ffffffffffffffff168c5291189190911897508118600181901b603f9190911c18935060c08801518118601481901c602c9190911b1867ffffffffffffffff1660208901526101208801518718602c81901c60149190911b1867ffffffffffffffff1660c08901526102c08801518618600381901c603d9190911b1867ffffffffffffffff166101208901526101c08801518718601981901c60279190911b1867ffffffffffffffff166102c08901526102808801518218602e81901c60129190911b1867ffffffffffffffff166101c089015260408801518618600281901c603e9190911b1867ffffffffffffffff166102808901526101808801518618601581901c602b9190911b1867ffffffffffffffff1660408901526101a08801518518602781901c60199190911b1867ffffffffffffffff166101808901526102608801518718603881901c60089190911b1867ffffffffffffffff166101a08901526102e08801518518600881901c60389190911b1867ffffffffffffffff166102608901526101e08801518218601781901c60299190911b1867ffffffffffffffff166102e089015260808801518718602581901c601b9190911b1867ffffffffffffffff166101e08901526103008801518718603281901c600e9190911b1867ffffffffffffffff1660808901526102a08801518118603e81901c60029190911b1867ffffffffffffffff166103008901526101008801518518600981901c60379190911b1867ffffffffffffffff166102a08901526102008801518118601381901c602d9190911b1867ffffffffffffffff1661010089015260a08801518218601c81901c60249190911b1867ffffffffffffffff1661020089015260608801518518602481901c601c9190911b1867ffffffffffffffff1660a08901526102408801518518602b81901c60159190911b1867ffffffffffffffff1660608901526102208801518618603181901c600f9190911b1867ffffffffffffffff166102408901526101608801518118603681901c600a9190911b1867ffffffffffffffff166102208901525060e08701518518603a81901c60069190911b1867ffffffffffffffff166101608801526101408701518118603d81901c60039190911b1867ffffffffffffffff1660e0880152505067ffffffffffffffff81166101408601525b5050505050565b600582811b8201805160018501831b8401805160028701851b8601805160038901871b8801805160048b0190981b8901805167ffffffffffffffff861985168918811690995283198a16861889169096528819861683188816909352841986168818871690528419831684189095169052919391929190611c7c565b61270e600082612687565b612719600582612687565b612724600a82612687565b61272f600f82612687565b61273a601482612687565b50565b612746816121e2565b61274f81612703565b600383901b820151815160c09190911c9061201a90821867ffffffffffffffff168352565b6127806000828461273d565b61278c6001828461273d565b6127986002828461273d565b6127a46003828461273d565b6127b06004828461273d565b6127bc6005828461273d565b6127c86006828461273d565b6127d46007828461273d565b6127e06008828461273d565b6127ec6009828461273d565b6127f8600a828461273d565b612804600b828461273d565b612810600c828461273d565b61281c600d828461273d565b612828600e828461273d565b612834600f828461273d565b6128406010828461273d565b61284c6011828461273d565b6128586012828461273d565b6128646013828461273d565b6128706014828461273d565b61287c6015828461273d565b6128886016828461273d565b61201a6017828461273d565b73ffffffffffffffffffffffffffffffffffffffff83811660009081526016602090815260408083208684529091528082208054908390559051909284169083908381818185875af1925050503d806000811461290d576040519150601f19603f3d011682016040523d82523d6000602084013e612912565b606091505b5050905080612680576040517f83e6cc6b00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b7f01000000000000000000000000000000000000000000000000000000000000007effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff8316176129f3818360408051600093845233602052918152606090922091527effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff167f01000000000000000000000000000000000000000000000000000000000000001790565b9392505050565b6060604051905081602082018181018286833760888306808015612a435760888290038501848101848103803687375060806001820353506001845160001a1784538652612a5a565b608836843760018353608060878401536088850186525b5050505050601f19603f82510116810160405292915050565b6000612a858260a01c63ffffffff1690565b67ffffffffffffffff1690506000612aa38360801c63ffffffff1690565b63ffffffff1690506000612abd8460401c63ffffffff1690565b63ffffffff169050600883108015612ad3575080155b15612b075760c082901b6000908152883560085283513382526017602090815260408084208a855290915290912055612bbc565b60088310158015612b25575080612b1f600885613798565b93508310155b8015612b395750612b3687826135ed565b83105b15612bbc576000612b4a8285613798565b905087612b588260206135ed565b10158015612b64575085155b15612b9b576040517ffe25498700000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b3360009081526017602090815260408083208a845290915290209089013590555b5050505050505050565b6000612c49565b66ff00ff00ff00ff8160081c1667ff00ff00ff00ff00612bf78360081b67ffffffffffffffff1690565b1617905065ffff0000ffff8160101c1667ffff0000ffff0000612c248360101b67ffffffffffffffff1690565b1617905060008160201c612c428360201b67ffffffffffffffff1690565b1792915050565b60808201516020830190612c6190612bcd565b612bcd565b6040820151612c6f90612bcd565b60401b17612c87612c5c60018460059190911b015190565b825160809190911b90612c9990612bcd565b60c01b17179392505050565b8260108101928215612cd3579160200282015b82811115612cd3578251825591602001919060010190612cb8565b50612cdf929150612cfb565b5090565b6040518060200160405280612cf6612d10565b905290565b5b80821115612cdf5760008155600101612cfc565b6040518061032001604052806019906020820280368337509192915050565b600060208284031215612d4157600080fd5b5035919050565b803573ffffffffffffffffffffffffffffffffffffffff81168114612d6c57600080fd5b919050565b60008060408385031215612d8457600080fd5b612d8d83612d48565b946020939093013593505050565b60008083601f840112612dad57600080fd5b50813567ffffffffffffffff811115612dc557600080fd5b602083019150836020828501011115612ddd57600080fd5b9250929050565b60008060008060608587031215612dfa57600080fd5b84359350612e0a60208601612d48565b9250604085013567ffffffffffffffff811115612e2657600080fd5b612e3287828801612d9b565b95989497509550505050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b604051610320810167ffffffffffffffff81118282101715612e9157612e91612e3e565b60405290565b6040516060810167ffffffffffffffff81118282101715612e9157612e91612e3e565b604051601f82017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe016810167ffffffffffffffff81118282101715612f0157612f01612e3e565b604052919050565b6000610320808385031215612f1d57600080fd5b604051602080820167ffffffffffffffff8382108183111715612f4257612f42612e3e565b8160405283955087601f880112612f5857600080fd5b612f60612e6d565b9487019491508188861115612f7457600080fd5b875b86811015612f9c5780358381168114612f8f5760008081fd5b8452928401928401612f76565b50909352509295945050505050565b600060608284031215612fbd57600080fd5b50919050565b60008083601f840112612fd557600080fd5b50813567ffffffffffffffff811115612fed57600080fd5b6020830191508360208260051b8501011115612ddd57600080fd5b60008060008060008060008060006103e08a8c03121561302757600080fd5b6130308a612d48565b985060208a013597506130468b60408c01612f09565b96506103608a013567ffffffffffffffff8082111561306457600080fd5b6130708d838e01612fab565b97506103808c013591508082111561308757600080fd5b6130938d838e01612fc3565b90975095506103a08c01359150808211156130ad57600080fd5b6130b98d838e01612fab565b94506103c08c01359150808211156130d057600080fd5b506130dd8c828d01612fc3565b915080935050809150509295985092959850929598565b600080600080600060a0868803121561310c57600080fd5b505083359560208501359550604085013594606081013594506080013592509050565b60005b8381101561314a578181015183820152602001613132565b8381111561201a5750506000910152565b602081526000825180602084015261317a81604085016020870161312f565b601f017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0169190910160400192915050565b600080604083850312156131bf57600080fd5b50508035926020909101359150565b600080600080600080600060a0888a0312156131e957600080fd5b8735965060208801359550604088013567ffffffffffffffff8082111561320f57600080fd5b61321b8b838c01612d9b565b909750955060608a013591508082111561323457600080fd5b506132418a828b01612fc3565b9094509250506080880135801515811461325a57600080fd5b8091505092959891949750929550565b60008060006060848603121561327f57600080fd5b61328884612d48565b95602085013595506040909401359392505050565b6000806000604084860312156132b257600080fd5b83359250602084013567ffffffffffffffff8111156132d057600080fd5b6132dc86828701612d9b565b9497909650939450505050565b600080600080600080600060a0888a03121561330457600080fd5b8735965060208801359550604088013567ffffffffffffffff8082111561332a57600080fd5b6133368b838c01612d9b565b909750955060608a013591508082111561334f57600080fd5b5061335c8a828b01612d9b565b989b979a50959894979596608090950135949350505050565b60008060008060006080868803121561338d57600080fd5b61339686612d48565b945060208601359350604086013567ffffffffffffffff808211156133ba57600080fd5b6133c689838a01612fab565b945060608801359150808211156133dc57600080fd5b506133e988828901612fc3565b969995985093965092949392505050565b803563ffffffff81168114612d6c57600080fd5b60008060006060848603121561342357600080fd5b83359250613433602085016133fa565b9150613441604085016133fa565b90509250925092565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b60007fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff82036134d9576134d9613479565b5060010190565b6000606082360312156134f257600080fd5b6134fa612e97565b823567ffffffffffffffff8082111561351257600080fd5b9084019036601f83011261352557600080fd5b813560208282111561353957613539612e3e565b613569817fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0601f85011601612eba565b9250818352368183860101111561357f57600080fd5b81818501828501376000918301810191909152908352848101359083015250604092830135928101929092525090565b81516103208201908260005b60198110156135e457825167ffffffffffffffff168252602092830192909101906001016135bb565b50505092915050565b6000821982111561360057613600613479565b500190565b60008083357fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe184360301811261363a57600080fd5b83018035915067ffffffffffffffff82111561365557600080fd5b602001915036819003821315612ddd57600080fd5b600181815b808511156136c357817fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff048211156136a9576136a9613479565b808516156136b657918102915b93841c939080029061366f565b509250929050565b6000826136da57506001613786565b816136e757506000613786565b81600181146136fd576002811461370757613723565b6001915050613786565b60ff84111561371857613718613479565b50506001821b613786565b5060208310610133831016604e8410600b8410161715613746575081810a613786565b613750838361366a565b807fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0482111561378257613782613479565b0290505b92915050565b60006129f383836136cb565b6000828210156137aa576137aa613479565b500390565b600063ffffffff838116908316818110156137cc576137cc613479565b039392505050565b600063ffffffff8083168185168083038211156137f3576137f3613479565b01949350505050565b6000845161380e81846020890161312f565b9190910192835250602082015260400191905056fea164736f6c634300080f000a"; + hex"6080604052600436106101d85760003560e01c80639d53a64811610102578063ddcd58de11610095578063ec5efcbc11610064578063ec5efcbc14610681578063f3f480d9146106a1578063faf37bc7146106d4578063fef2b4ed146106e757600080fd5b8063ddcd58de146105d4578063e03110e11461060c578063e159261114610641578063ea7139501461066157600080fd5b8063b5e7154c116100d1578063b5e7154c14610555578063d18534b51461056c578063da35c6641461058c578063dd24f9bf146105a157600080fd5b80639d53a6481461048e5780639d7e8769146104dd578063b2e67ba8146104fd578063b4801e611461053557600080fd5b806361238bde1161017a5780637ac54767116101495780637ac54767146103ca5780638542cf50146103ea578063882856ef146104355780638dc4be111461046e57600080fd5b806361238bde1461031e5780636551927b146103565780637051472e1461038e5780637917de1d146103aa57600080fd5b80633909af5c116101b65780633909af5c146102715780634d52b4c91461029357806352f0f3ad146102a857806354fd4d50146102c857600080fd5b8063013cf08b146101dd5780630359a5631461022e5780632055b36b1461025c575b600080fd5b3480156101e957600080fd5b506101fd6101f8366004612e29565b610714565b6040805173ffffffffffffffffffffffffffffffffffffffff90931683526020830191909152015b60405180910390f35b34801561023a57600080fd5b5061024e610249366004612e6b565b610759565b604051908152602001610225565b34801561026857600080fd5b5061024e601081565b34801561027d57600080fd5b5061029161028c366004613073565b610891565b005b34801561029f57600080fd5b5061024e610ae8565b3480156102b457600080fd5b5061024e6102c336600461315f565b610b03565b3480156102d457600080fd5b506103116040518060400160405280600c81526020017f312e312e332d626574612e32000000000000000000000000000000000000000081525081565b60405161022591906131c6565b34801561032a57600080fd5b5061024e610339366004613217565b600160209081526000928352604080842090915290825290205481565b34801561036257600080fd5b5061024e610371366004612e6b565b601560209081526000928352604080842090915290825290205481565b34801561039a57600080fd5b5061024e6703782dace9d9000081565b3480156103b657600080fd5b506102916103c536600461327b565b610bd9565b3480156103d657600080fd5b5061024e6103e5366004612e29565b6110dc565b3480156103f657600080fd5b50610425610405366004613217565b600260209081526000928352604080842090915290825290205460ff1681565b6040519015158152602001610225565b34801561044157600080fd5b50610455610450366004613317565b6110f3565b60405167ffffffffffffffff9091168152602001610225565b34801561047a57600080fd5b5061029161048936600461334a565b61114d565b34801561049a57600080fd5b5061024e6104a9366004612e6b565b73ffffffffffffffffffffffffffffffffffffffff9091166000908152601860209081526040808320938352929052205490565b3480156104e957600080fd5b506102916104f8366004613396565b611248565b34801561050957600080fd5b5061024e610518366004612e6b565b601760209081526000928352604080842090915290825290205481565b34801561054157600080fd5b5061024e610550366004613317565b6113ff565b34801561056157600080fd5b5061024e620186a081565b34801561057857600080fd5b50610291610587366004613073565b611431565b34801561059857600080fd5b5060135461024e565b3480156105ad57600080fd5b507f000000000000000000000000000000000000000000000000000000000000271061024e565b3480156105e057600080fd5b5061024e6105ef366004612e6b565b601660209081526000928352604080842090915290825290205481565b34801561061857600080fd5b5061062c610627366004613217565b611840565b60408051928352602083019190915201610225565b34801561064d57600080fd5b5061029161065c36600461334a565b611931565b34801561066d57600080fd5b5061029161067c366004613422565b611a39565b34801561068d57600080fd5b5061029161069c366004613491565b611b98565b3480156106ad57600080fd5b507f000000000000000000000000000000000000000000000000000000000000007861024e565b6102916106e2366004613519565b611d1e565b3480156106f357600080fd5b5061024e610702366004612e29565b60006020819052908152604090205481565b6013818154811061072457600080fd5b60009182526020909120600290910201805460019091015473ffffffffffffffffffffffffffffffffffffffff909116915082565b73ffffffffffffffffffffffffffffffffffffffff82166000908152601560209081526040808320848452909152812054819061079c9060601c63ffffffff1690565b63ffffffff16905060005b6010811015610889578160011660010361082f5773ffffffffffffffffffffffffffffffffffffffff85166000908152601460209081526040808320878452909152902081601081106107fc576107fc613555565b01546040805160208101929092528101849052606001604051602081830303815290604052805190602001209250610870565b826003826010811061084357610843613555565b01546040805160208101939093528201526060016040516020818303038152906040528051906020012092505b60019190911c9080610881816135b3565b9150506107a7565b505092915050565b600061089d8a8a610759565b90506108c086868360208b01356108bb6108b68d6135eb565b611fea565b61202a565b80156108de57506108de83838360208801356108bb6108b68a6135eb565b610914576040517f09bde33900000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b86604001358860405160200161092a91906136ba565b6040516020818303038152906040528051906020012014610977576040517f1968a90200000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b83602001358760200135600161098d91906136f8565b146109c4576040517f9a3b119900000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b610a0c886109d28680613710565b8080601f01602080910402602001604051908101604052809392919081815260200183838082843760009201919091525061208b92505050565b610a15886121e6565b836040013588604051602001610a2b91906136ba565b6040516020818303038152906040528051906020012003610a78576040517f9843145b00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b73ffffffffffffffffffffffffffffffffffffffff8a1660009081526015602090815260408083208c8452909152902080547fffffffffffffffffffffffffffffffffffffffffffffffff0000000000000000166001179055610adc8a8a3361298e565b50505050505050505050565b6001610af660106002613897565b610b0091906138a3565b81565b6000610b0f8686612a47565b9050610b1c8360086136f8565b82101580610b2a5750602083115b15610b61576040517ffe25498700000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6000602081815260c085901b82526008959095528251828252600286526040808320858452875280832080547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff001660019081179091558484528752808320948352938652838220558181529384905292205592915050565b60608115610bf257610beb8686612af4565b9050610c2c565b85858080601f0160208091040260200160405190810160405280939291908181526020018383808284376000920191909152509293505050505b3360009081526014602090815260408083208b845290915280822081516102008101928390529160109082845b815481526020019060010190808311610c5957505050505090506000601560003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008b81526020019081526020016000205490506000610cda8260601c63ffffffff1690565b63ffffffff169050333214610d1b576040517fba092d1600000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b610d2b8260801c63ffffffff1690565b63ffffffff16600003610d6a576040517f87138d5c00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b610d748260c01c90565b67ffffffffffffffff1615610db5576040517f475a253500000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b898114610dee576040517f60f95d5a00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b610dfb89898d8886612b6d565b83516020850160888204881415608883061715610e20576307b1daf16000526004601cfd5b60405160c8810160405260005b83811015610ed0578083018051835260208101516020840152604081015160408401526060810151606084015260808101516080840152508460888301526088810460051b8b013560a883015260c882206001860195508560005b610200811015610ec5576001821615610ea55782818b0152610ec5565b8981015160009081526020938452604090209260019290921c9101610e88565b505050608801610e2d565b50505050600160106002610ee49190613897565b610eee91906138a3565b811115610f27576040517f6229572300000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b610f9c610f3a8360401c63ffffffff1690565b610f4a9063ffffffff168a6136f8565b60401b7fffffffffffffffffffffffffffffffffffffffff00000000ffffffffffffffff606084901b167fffffffffffffffffffffffffffffffff0000000000000000ffffffffffffffff8516171790565b915084156110295777ffffffffffffffffffffffffffffffffffffffffffffffff82164260c01b179150610fd68260801c63ffffffff1690565b63ffffffff16610fec8360401c63ffffffff1690565b63ffffffff1614611029576040517f7b1dafd100000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b3360009081526014602090815260408083208e8452909152902061104f90846010612d9f565b503360008181526018602090815260408083208f8452825280832080546001810182559084528284206004820401805460039092166008026101000a67ffffffffffffffff818102199093164390931602919091179055838352601582528083208f8452909152812084905560609190911b81523690601437366014016000a05050505050505050505050565b600381601081106110ec57600080fd5b0154905081565b6018602052826000526040600020602052816000526040600020818154811061111b57600080fd5b906000526020600020906004918282040191900660080292509250509054906101000a900467ffffffffffffffff1681565b60443560008060088301861061116b5763fe2549876000526004601cfd5b60c083901b60805260888386823786600882030151915060206000858360025afa90508061119857600080fd5b50600080517effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff167f0400000000000000000000000000000000000000000000000000000000000000178082526002602090815260408084208a8552825280842080547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff001660019081179091558385528252808420998452988152888320939093558152908190529490942055505050565b600080603087600037602060006030600060025afa806112705763f91129696000526004601cfd5b6000517effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff167f010000000000000000000000000000000000000000000000000000000000000017608081815260a08c905260c08b905260308a60e037603088609083013760008060c083600a5afa9250826112f2576309bde3396000526004601cfd5b602886106113085763fe2549876000526004601cfd5b6000602882015278200000000000000000000000000000000000000000000000008152600881018b905285810151935060308a8237603081019b909b52505060509098207effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff167f0500000000000000000000000000000000000000000000000000000000000000176000818152600260209081526040808320868452825280832080547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0016600190811790915584845282528083209583529481528482209a909a559081528089529190912096909655505050505050565b6014602052826000526040600020602052816000526040600020816010811061142757600080fd5b0154925083915050565b73ffffffffffffffffffffffffffffffffffffffff891660009081526015602090815260408083208b845290915290205467ffffffffffffffff8116156114a4576040517fc334f06900000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6114ae8160c01c90565b67ffffffffffffffff166000036114f1576040517f55d4cbf900000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b7f000000000000000000000000000000000000000000000000000000000000007861151c8260c01c90565b6115309067ffffffffffffffff16426138a3565b11611567576040517f55d4cbf900000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b60006115738b8b610759565b905061158c87878360208c01356108bb6108b68e6135eb565b80156115aa57506115aa84848360208901356108bb6108b68b6135eb565b6115e0576040517f09bde33900000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b8760400135896040516020016115f691906136ba565b6040516020818303038152906040528051906020012014611643576040517f1968a90200000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b84602001358860200135600161165991906136f8565b14158061168b575060016116738360601c63ffffffff1690565b61167d91906138ba565b63ffffffff16856020013514155b156116c2576040517f9a3b119900000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6116d0896109d28780613710565b6116d9896121e6565b60006116e48a612cc0565b7effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff167f0200000000000000000000000000000000000000000000000000000000000000179050600061173b8460a01c63ffffffff1690565b67ffffffffffffffff169050600160026000848152602001908152602001600020600083815260200190815260200160002060006101000a81548160ff021916908315150217905550601760008e73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008d8152602001908152602001600020546001600084815260200190815260200160002060008381526020019081526020016000208190555061180d8460801c63ffffffff1690565b600083815260208190526040902063ffffffff9190911690556118318d8d8161298e565b50505050505050505050505050565b6000828152600260209081526040808320848452909152812054819060ff166118c9576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601460248201527f7072652d696d616765206d757374206578697374000000000000000000000000604482015260640160405180910390fd5b50600083815260208181526040909120546118e58160086136f8565b6118f08560206136f8565b1061190e57836119018260086136f8565b61190b91906138a3565b91505b506000938452600160209081526040808620948652939052919092205492909150565b60443560008060088301861061194f5763fe2549876000526004601cfd5b60c083901b6080526088838682378087017ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff80151908490207effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff167f02000000000000000000000000000000000000000000000000000000000000001760008181526002602090815260408083208b8452825280832080547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0016600190811790915584845282528083209a83529981528982209390935590815290819052959095209190915550505050565b60008060008060808860601b81528760c01b6014820152858782601c0137601c860181207effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff167f0600000000000000000000000000000000000000000000000000000000000000179350604088026260216001603f5a021015611ac35763dd629f866000526004601cfd5b6000808783601c018c5afa94503d6001019150600882018a10611aee5763fe2549876000526004601cfd5b60c082901b81526008018481533d6000600183013e89017ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff8015160008481526002602090815260408083208d8452825280832080547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0016600190811790915587845282528083209c83529b81528b8220929092559384528390529790912096909655505050505050565b6000611ba48686610759565b9050611bbd83838360208801356108bb6108b68a6135eb565b611bf3576040517f09bde33900000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b602084013515611c2f576040517f9a3b119900000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b611c37612ddd565b611c45816109d28780613710565b611c4e816121e6565b846040013581604051602001611c6491906136ba565b6040516020818303038152906040528051906020012003611cb1576040517f9843145b00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b73ffffffffffffffffffffffffffffffffffffffff87166000908152601560209081526040808320898452909152902080547fffffffffffffffffffffffffffffffffffffffffffffffff0000000000000000166001179055611d1587873361298e565b50505050505050565b6703782dace9d90000341015611d60576040517fe92c469f00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b333214611d99576040517fba092d1600000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b611da48160086138df565b63ffffffff168263ffffffff1610611de8576040517ffe25498700000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b7f00000000000000000000000000000000000000000000000000000000000027108163ffffffff161015611e48576040517f7b1dafd100000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b336000908152601560209081526040808320868452909152902054611e738160801c63ffffffff1690565b63ffffffff1615611eb0576040517f0dc149f000000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b608082901b7fffffffffffffffffffffffff00000000ffffffffffffffffffffffffffffffff60a085901b167fffffffffffffffff0000000000000000ffffffffffffffffffffffffffffffff83161717336000818152601560209081526040808320898452825280832094909455835180850185528381528082018981526013805460018101825590855291517f66de8ffda797e3de9c05e8fc57b3bf0ec28a930d40b0d285d93c06501cf6a090600290930292830180547fffffffffffffffffffffffff00000000000000000000000000000000000000001673ffffffffffffffffffffffffffffffffffffffff909216919091179055517f66de8ffda797e3de9c05e8fc57b3bf0ec28a930d40b0d285d93c06501cf6a0919091015591815260168252828120968152959052909320349055505050565b600081600001518260200151836040015160405160200161200d93929190613907565b604051602081830303815290604052805190602001209050919050565b60008160005b601081101561207e578060051b880135600186831c16600181146120635760008481526020839052604090209350612074565b600082815260208590526040902093505b5050600101612030565b5090931495945050505050565b608881511461209957600080fd5b602081016020830161211a565b8260031b8201518060001a8160011a60081b178160021a60101b8260031a60181b17178160041a60201b8260051a60281b178260061a60301b8360071a60381b1717179050612114816120ff868560059190911b015190565b1867ffffffffffffffff16600586901b840152565b50505050565b612126600083836120a6565b612132600183836120a6565b61213e600283836120a6565b61214a600383836120a6565b612156600483836120a6565b612162600583836120a6565b61216e600683836120a6565b61217a600783836120a6565b612186600883836120a6565b612192600983836120a6565b61219e600a83836120a6565b6121aa600b83836120a6565b6121b6600c83836120a6565b6121c2600d83836120a6565b6121ce600e83836120a6565b6121da600f83836120a6565b612114601083836120a6565b6040805178010000000000008082800000000000808a8000000080008000602082015279808b00000000800000018000000080008081800000000000800991810191909152788a00000000000000880000000080008009000000008000000a60608201527b8000808b800000000000008b8000000000008089800000000000800360808201527f80000000000080028000000000000080000000000000800a800000008000000a60a08201527f800000008000808180000000000080800000000080000001800000008000800860c082015260009060e0016040516020818303038152906040529050602082016020820161286e565b6102808101516101e082015161014083015160a0840151845118189118186102a082015161020083015161016084015160c0850151602086015118189118186102c083015161022084015161018085015160e0860151604087015118189118186102e08401516102408501516101a0860151610100870151606088015118189118186103008501516102608601516101c0870151610120880151608089015118189118188084603f1c6123998660011b67ffffffffffffffff1690565b18188584603f1c6123b48660011b67ffffffffffffffff1690565b18188584603f1c6123cf8660011b67ffffffffffffffff1690565b181895508483603f1c6123ec8560011b67ffffffffffffffff1690565b181894508387603f1c6124098960011b67ffffffffffffffff1690565b60208b01518b51861867ffffffffffffffff168c5291189190911897508118600181901b603f9190911c18935060c08801518118601481901c602c9190911b1867ffffffffffffffff1660208901526101208801518718602c81901c60149190911b1867ffffffffffffffff1660c08901526102c08801518618600381901c603d9190911b1867ffffffffffffffff166101208901526101c08801518718601981901c60279190911b1867ffffffffffffffff166102c08901526102808801518218602e81901c60129190911b1867ffffffffffffffff166101c089015260408801518618600281901c603e9190911b1867ffffffffffffffff166102808901526101808801518618601581901c602b9190911b1867ffffffffffffffff1660408901526101a08801518518602781901c60199190911b1867ffffffffffffffff166101808901526102608801518718603881901c60089190911b1867ffffffffffffffff166101a08901526102e08801518518600881901c60389190911b1867ffffffffffffffff166102608901526101e08801518218601781901c60299190911b1867ffffffffffffffff166102e089015260808801518718602581901c601b9190911b1867ffffffffffffffff166101e08901526103008801518718603281901c600e9190911b1867ffffffffffffffff1660808901526102a08801518118603e81901c60029190911b1867ffffffffffffffff166103008901526101008801518518600981901c60379190911b1867ffffffffffffffff166102a08901526102008801518118601381901c602d9190911b1867ffffffffffffffff1661010089015260a08801518218601c81901c60249190911b1867ffffffffffffffff1661020089015260608801518518602481901c601c9190911b1867ffffffffffffffff1660a08901526102408801518518602b81901c60159190911b1867ffffffffffffffff1660608901526102208801518618603181901c600f9190911b1867ffffffffffffffff166102408901526101608801518118603681901c600a9190911b1867ffffffffffffffff166102208901525060e08701518518603a81901c60069190911b1867ffffffffffffffff166101608801526101408701518118603d81901c60039190911b1867ffffffffffffffff1660e0880152505067ffffffffffffffff81166101408601525b5050505050565b600582811b8201805160018501831b8401805160028701851b8601805160038901871b8801805160048b0190981b8901805167ffffffffffffffff861985168918811690995283198a16861889169096528819861683188816909352841986168818871690528419831684189095169052919391929190611d15565b612808600082612781565b612813600582612781565b61281e600a82612781565b612829600f82612781565b612834601482612781565b50565b612840816122dc565b612849816127fd565b600383901b820151815160c09190911c9061211490821867ffffffffffffffff168352565b61287a60008284612837565b61288660018284612837565b61289260028284612837565b61289e60038284612837565b6128aa60048284612837565b6128b660058284612837565b6128c260068284612837565b6128ce60078284612837565b6128da60088284612837565b6128e660098284612837565b6128f2600a8284612837565b6128fe600b8284612837565b61290a600c8284612837565b612916600d8284612837565b612922600e8284612837565b61292e600f8284612837565b61293a60108284612837565b61294660118284612837565b61295260128284612837565b61295e60138284612837565b61296a60148284612837565b61297660158284612837565b61298260168284612837565b61211460178284612837565b73ffffffffffffffffffffffffffffffffffffffff83811660009081526016602090815260408083208684529091528082208054908390559051909284169083908381818185875af1925050503d8060008114612a07576040519150601f19603f3d011682016040523d82523d6000602084013e612a0c565b606091505b505090508061277a576040517f83e6cc6b00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b7f01000000000000000000000000000000000000000000000000000000000000007effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff831617612aed818360408051600093845233602052918152606090922091527effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff167f01000000000000000000000000000000000000000000000000000000000000001790565b9392505050565b6060604051905081602082018181018286833760888306808015612b3d5760888290038501848101848103803687375060806001820353506001845160001a1784538652612b54565b608836843760018353608060878401536088850186525b5050505050601f19603f82510116810160405292915050565b6000612b7f8260a01c63ffffffff1690565b67ffffffffffffffff1690506000612b9d8360801c63ffffffff1690565b63ffffffff1690506000612bb78460401c63ffffffff1690565b63ffffffff169050600883108015612bcd575080155b15612c015760c082901b6000908152883560085283513382526017602090815260408084208a855290915290912055612cb6565b60088310158015612c1f575080612c196008856138a3565b93508310155b8015612c335750612c3087826136f8565b83105b15612cb6576000612c4482856138a3565b905087612c528260206136f8565b10158015612c5e575085155b15612c95576040517ffe25498700000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b3360009081526017602090815260408083208a845290915290209089013590555b5050505050505050565b6000612d43565b66ff00ff00ff00ff8160081c1667ff00ff00ff00ff00612cf18360081b67ffffffffffffffff1690565b1617905065ffff0000ffff8160101c1667ffff0000ffff0000612d1e8360101b67ffffffffffffffff1690565b1617905060008160201c612d3c8360201b67ffffffffffffffff1690565b1792915050565b60808201516020830190612d5b90612cc7565b612cc7565b6040820151612d6990612cc7565b60401b17612d81612d5660018460059190911b015190565b825160809190911b90612d9390612cc7565b60c01b17179392505050565b8260108101928215612dcd579160200282015b82811115612dcd578251825591602001919060010190612db2565b50612dd9929150612df5565b5090565b6040518060200160405280612df0612e0a565b905290565b5b80821115612dd95760008155600101612df6565b6040518061032001604052806019906020820280368337509192915050565b600060208284031215612e3b57600080fd5b5035919050565b803573ffffffffffffffffffffffffffffffffffffffff81168114612e6657600080fd5b919050565b60008060408385031215612e7e57600080fd5b612e8783612e42565b946020939093013593505050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b604051610320810167ffffffffffffffff81118282101715612ee857612ee8612e95565b60405290565b6040516060810167ffffffffffffffff81118282101715612ee857612ee8612e95565b604051601f82017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe016810167ffffffffffffffff81118282101715612f5857612f58612e95565b604052919050565b803567ffffffffffffffff81168114612e6657600080fd5b6000610320808385031215612f8c57600080fd5b604051602080820182811067ffffffffffffffff82111715612fb057612fb0612e95565b806040525081935085601f860112612fc757600080fd5b612fcf612ec4565b928501928087851115612fe157600080fd5b865b8581101561300157612ff481612f60565b8352918301918301612fe3565b509092525091949350505050565b60006060828403121561302157600080fd5b50919050565b60008083601f84011261303957600080fd5b50813567ffffffffffffffff81111561305157600080fd5b6020830191508360208260051b850101111561306c57600080fd5b9250929050565b60008060008060008060008060006103e08a8c03121561309257600080fd5b61309b8a612e42565b985060208a013597506130b18b60408c01612f78565b96506103608a013567ffffffffffffffff808211156130cf57600080fd5b6130db8d838e0161300f565b97506103808c01359150808211156130f257600080fd5b6130fe8d838e01613027565b90975095506103a08c013591508082111561311857600080fd5b6131248d838e0161300f565b94506103c08c013591508082111561313b57600080fd5b506131488c828d01613027565b915080935050809150509295985092959850929598565b600080600080600060a0868803121561317757600080fd5b505083359560208501359550604085013594606081013594506080013592509050565b60005b838110156131b557818101518382015260200161319d565b838111156121145750506000910152565b60208152600082518060208401526131e581604085016020870161319a565b601f017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0169190910160400192915050565b6000806040838503121561322a57600080fd5b50508035926020909101359150565b60008083601f84011261324b57600080fd5b50813567ffffffffffffffff81111561326357600080fd5b60208301915083602082850101111561306c57600080fd5b600080600080600080600060a0888a03121561329657600080fd5b8735965060208801359550604088013567ffffffffffffffff808211156132bc57600080fd5b6132c88b838c01613239565b909750955060608a01359150808211156132e157600080fd5b506132ee8a828b01613027565b9094509250506080880135801515811461330757600080fd5b8091505092959891949750929550565b60008060006060848603121561332c57600080fd5b61333584612e42565b95602085013595506040909401359392505050565b60008060006040848603121561335f57600080fd5b83359250602084013567ffffffffffffffff81111561337d57600080fd5b61338986828701613239565b9497909650939450505050565b600080600080600080600060a0888a0312156133b157600080fd5b8735965060208801359550604088013567ffffffffffffffff808211156133d757600080fd5b6133e38b838c01613239565b909750955060608a01359150808211156133fc57600080fd5b506134098a828b01613239565b989b979a50959894979596608090950135949350505050565b60008060008060006080868803121561343a57600080fd5b8535945061344a60208701612e42565b935061345860408701612f60565b9250606086013567ffffffffffffffff81111561347457600080fd5b61348088828901613239565b969995985093965092949392505050565b6000806000806000608086880312156134a957600080fd5b6134b286612e42565b945060208601359350604086013567ffffffffffffffff808211156134d657600080fd5b6134e289838a0161300f565b945060608801359150808211156134f857600080fd5b5061348088828901613027565b803563ffffffff81168114612e6657600080fd5b60008060006060848603121561352e57600080fd5b8335925061353e60208501613505565b915061354c60408501613505565b90509250925092565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b60007fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff82036135e4576135e4613584565b5060010190565b6000606082360312156135fd57600080fd5b613605612eee565b823567ffffffffffffffff8082111561361d57600080fd5b9084019036601f83011261363057600080fd5b813560208282111561364457613644612e95565b613674817fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0601f85011601612f11565b9250818352368183860101111561368a57600080fd5b81818501828501376000918301810191909152908352848101359083015250604092830135928101929092525090565b81516103208201908260005b60198110156136ef57825167ffffffffffffffff168252602092830192909101906001016136c6565b50505092915050565b6000821982111561370b5761370b613584565b500190565b60008083357fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe184360301811261374557600080fd5b83018035915067ffffffffffffffff82111561376057600080fd5b60200191503681900382131561306c57600080fd5b600181815b808511156137ce57817fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff048211156137b4576137b4613584565b808516156137c157918102915b93841c939080029061377a565b509250929050565b6000826137e557506001613891565b816137f257506000613891565b816001811461380857600281146138125761382e565b6001915050613891565b60ff84111561382357613823613584565b50506001821b613891565b5060208310610133831016604e8410600b8410161715613851575081810a613891565b61385b8383613775565b807fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0482111561388d5761388d613584565b0290505b92915050565b6000612aed83836137d6565b6000828210156138b5576138b5613584565b500390565b600063ffffffff838116908316818110156138d7576138d7613584565b039392505050565b600063ffffffff8083168185168083038211156138fe576138fe613584565b01949350505050565b6000845161391981846020890161319a565b9190910192835250602082015260400191905056fea164736f6c634300080f000a"; bytes internal constant mipsCode = - hex"608060405234801561001057600080fd5b506004361061004c5760003560e01c8063155633fe1461005157806354fd4d50146100765780637dc0d1d0146100bf578063e14ced3214610103575b600080fd5b61005c634000000081565b60405163ffffffff90911681526020015b60405180910390f35b6100b26040518060400160405280600581526020017f312e302e3100000000000000000000000000000000000000000000000000000081525081565b60405161006d9190611e16565b60405173ffffffffffffffffffffffffffffffffffffffff7f0000000000000000000000003bd7e801e51d48c5d94ea68e8b801dffc275de7516815260200161006d565b610116610111366004611ed2565b610124565b60405190815260200161006d565b600061012e611d8c565b6080811461013b57600080fd5b6040516106001461014b57600080fd5b6084871461015857600080fd5b6101a4851461016657600080fd5b8635608052602087013560a052604087013560e090811c60c09081526044890135821c82526048890135821c61010052604c890135821c610120526050890135821c61014052605489013590911c61016052605888013560f890811c610180526059890135901c6101a052605a880135901c6101c0526102006101e0819052606288019060005b602081101561021157823560e01c82526004909201916020909101906001016101ed565b5050508061012001511561022f5761022761066f565b915050610666565b6101408101805160010167ffffffffffffffff1690526060810151600090610257908261078b565b9050603f601a82901c16600281148061027657508063ffffffff166003145b156102cb5760006002836303ffffff1663ffffffff16901b846080015163f0000000161790506102c08263ffffffff166002146102b457601f6102b7565b60005b60ff1682610847565b945050505050610666565b6101608301516000908190601f601086901c81169190601587901c16602081106102f7576102f7611f46565b602002015192508063ffffffff8516158061031857508463ffffffff16601c145b1561034f578661016001518263ffffffff166020811061033a5761033a611f46565b6020020151925050601f600b86901c1661040b565b60208563ffffffff1610156103b1578463ffffffff16600c148061037957508463ffffffff16600d145b8061038a57508463ffffffff16600e145b1561039b578561ffff16925061040b565b6103aa8661ffff166010610938565b925061040b565b60288563ffffffff161015806103cd57508463ffffffff166022145b806103de57508463ffffffff166026145b1561040b578661016001518263ffffffff166020811061040057610400611f46565b602002015192508190505b60048563ffffffff1610158015610428575060088563ffffffff16105b8061043957508463ffffffff166001145b156104585761044a858784876109ab565b975050505050505050610666565b63ffffffff60006020878316106104bd576104788861ffff166010610938565b9095019463fffffffc861661048e81600161078b565b915060288863ffffffff16101580156104ae57508763ffffffff16603014155b156104bb57809250600093505b505b60006104cb89888885610bbb565b63ffffffff9081169150603f8a169089161580156104f0575060088163ffffffff1610155b80156105025750601c8163ffffffff16105b156105df578063ffffffff166008148061052257508063ffffffff166009145b15610559576105478163ffffffff1660081461053e5785610541565b60005b89610847565b9b505050505050505050505050610666565b8063ffffffff16600a0361057957610547858963ffffffff8a161561134b565b8063ffffffff16600b0361059a57610547858963ffffffff8a16151561134b565b8063ffffffff16600c036105b1576105478d611431565b60108163ffffffff16101580156105ce5750601c8163ffffffff16105b156105df5761054781898988611968565b8863ffffffff1660381480156105fa575063ffffffff861615155b1561062f5760018b61016001518763ffffffff166020811061061e5761061e611f46565b63ffffffff90921660209290920201525b8363ffffffff1663ffffffff1461064c5761064c84600184611c3f565b6106588583600161134b565b9b5050505050505050505050505b95945050505050565b60408051608051815260a051602082015260dc519181019190915260fc51604482015261011c51604882015261013c51604c82015261015c51605082015261017c5160548201526101805161019f5160588301526101a0516101bf5160598401526101d851605a840152600092610200929091606283019190855b602081101561070e57601c86015184526020909501946004909301926001016106ea565b506000835283830384a060009450806001811461072e5760039550610756565b828015610746576001811461074f5760029650610754565b60009650610754565b600196505b505b50505081900390207effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1660f89190911b17919050565b60008061079783611ce3565b905060038416156107a757600080fd5b6020810190358460051c8160005b601b81101561080d5760208501943583821c60011680156107dd57600181146107f257610803565b60008481526020839052604090209350610803565b600082815260208590526040902093505b50506001016107b5565b50608051915081811461082857630badf00d60005260206000fd5b5050601f94909416601c0360031b9390931c63ffffffff169392505050565b6000610851611d8c565b60809050806060015160040163ffffffff16816080015163ffffffff16146108da576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601260248201527f6a756d7020696e2064656c617920736c6f74000000000000000000000000000060448201526064015b60405180910390fd5b60608101805160808301805163ffffffff90811690935285831690529085161561093057806008018261016001518663ffffffff166020811061091f5761091f611f46565b63ffffffff90921660209290920201525b61066661066f565b600063ffffffff8381167fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff80850183169190911c821615159160016020869003821681901b830191861691821b92911b0182610995576000610997565b815b90861663ffffffff16179250505092915050565b60006109b5611d8c565b608090506000816060015160040163ffffffff16826080015163ffffffff1614610a3b576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601460248201527f6272616e636820696e2064656c617920736c6f7400000000000000000000000060448201526064016108d1565b8663ffffffff1660041480610a5657508663ffffffff166005145b15610ad25760008261016001518663ffffffff1660208110610a7a57610a7a611f46565b602002015190508063ffffffff168563ffffffff16148015610aa257508763ffffffff166004145b80610aca57508063ffffffff168563ffffffff1614158015610aca57508763ffffffff166005145b915050610b4f565b8663ffffffff16600603610aef5760008460030b13159050610b4f565b8663ffffffff16600703610b0b5760008460030b139050610b4f565b8663ffffffff16600103610b4f57601f601087901c166000819003610b345760008560030b1291505b8063ffffffff16600103610b4d5760008560030b121591505b505b606082018051608084015163ffffffff169091528115610b95576002610b7a8861ffff166010610938565b63ffffffff90811690911b8201600401166080840152610ba7565b60808301805160040163ffffffff1690525b610baf61066f565b98975050505050505050565b6000603f601a86901c16801580610bea575060088163ffffffff1610158015610bea5750600f8163ffffffff16105b1561104057603f86168160088114610c315760098114610c3a57600a8114610c4357600b8114610c4c57600c8114610c5557600d8114610c5e57600e8114610c6757610c6c565b60209150610c6c565b60219150610c6c565b602a9150610c6c565b602b9150610c6c565b60249150610c6c565b60259150610c6c565b602691505b508063ffffffff16600003610c935750505063ffffffff8216601f600686901c161b611343565b8063ffffffff16600203610cb95750505063ffffffff8216601f600686901c161c611343565b8063ffffffff16600303610cef57601f600688901c16610ce563ffffffff8716821c6020839003610938565b9350505050611343565b8063ffffffff16600403610d115750505063ffffffff8216601f84161b611343565b8063ffffffff16600603610d335750505063ffffffff8216601f84161c611343565b8063ffffffff16600703610d6657610d5d8663ffffffff168663ffffffff16901c87602003610938565b92505050611343565b8063ffffffff16600803610d7e578592505050611343565b8063ffffffff16600903610d96578592505050611343565b8063ffffffff16600a03610dae578592505050611343565b8063ffffffff16600b03610dc6578592505050611343565b8063ffffffff16600c03610dde578592505050611343565b8063ffffffff16600f03610df6578592505050611343565b8063ffffffff16601003610e0e578592505050611343565b8063ffffffff16601103610e26578592505050611343565b8063ffffffff16601203610e3e578592505050611343565b8063ffffffff16601303610e56578592505050611343565b8063ffffffff16601803610e6e578592505050611343565b8063ffffffff16601903610e86578592505050611343565b8063ffffffff16601a03610e9e578592505050611343565b8063ffffffff16601b03610eb6578592505050611343565b8063ffffffff16602003610ecf57505050828201611343565b8063ffffffff16602103610ee857505050828201611343565b8063ffffffff16602203610f0157505050818303611343565b8063ffffffff16602303610f1a57505050818303611343565b8063ffffffff16602403610f3357505050828216611343565b8063ffffffff16602503610f4c57505050828217611343565b8063ffffffff16602603610f6557505050828218611343565b8063ffffffff16602703610f7f5750505082821719611343565b8063ffffffff16602a03610fb0578460030b8660030b12610fa1576000610fa4565b60015b60ff1692505050611343565b8063ffffffff16602b03610fd8578463ffffffff168663ffffffff1610610fa1576000610fa4565b6040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601360248201527f696e76616c696420696e737472756374696f6e0000000000000000000000000060448201526064016108d1565b50610fd8565b8063ffffffff16601c036110c457603f8616600281900361106657505050828202611343565b8063ffffffff166020148061108157508063ffffffff166021145b1561103a578063ffffffff16602003611098579419945b60005b63800000008716156110ba576401fffffffe600197881b16960161109b565b9250611343915050565b8063ffffffff16600f036110e657505065ffffffff0000601083901b16611343565b8063ffffffff166020036111225761111a8560031660080260180363ffffffff168463ffffffff16901c60ff166008610938565b915050611343565b8063ffffffff166021036111575761111a8560021660080260100363ffffffff168463ffffffff16901c61ffff166010610938565b8063ffffffff1660220361118657505063ffffffff60086003851602811681811b198416918316901b17611343565b8063ffffffff1660230361119d5782915050611343565b8063ffffffff166024036111cf578460031660080260180363ffffffff168363ffffffff16901c60ff16915050611343565b8063ffffffff16602503611202578460021660080260100363ffffffff168363ffffffff16901c61ffff16915050611343565b8063ffffffff1660260361123457505063ffffffff60086003851602601803811681811c198416918316901c17611343565b8063ffffffff1660280361126a57505060ff63ffffffff60086003861602601803811682811b9091188316918416901b17611343565b8063ffffffff166029036112a157505061ffff63ffffffff60086002861602601003811682811b9091188316918416901b17611343565b8063ffffffff16602a036112d057505063ffffffff60086003851602811681811c198316918416901c17611343565b8063ffffffff16602b036112e75783915050611343565b8063ffffffff16602e0361131957505063ffffffff60086003851602601803811681811b198316918416901b17611343565b8063ffffffff166030036113305782915050611343565b8063ffffffff16603803610fd857839150505b949350505050565b6000611355611d8c565b506080602063ffffffff8616106113c8576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152600e60248201527f76616c696420726567697374657200000000000000000000000000000000000060448201526064016108d1565b63ffffffff8516158015906113da5750825b1561140e57838161016001518663ffffffff16602081106113fd576113fd611f46565b63ffffffff90921660209290920201525b60808101805163ffffffff8082166060850152600490910116905261066661066f565b600061143b611d8c565b506101e051604081015160808083015160a084015160c09094015191936000928392919063ffffffff8616610ffa036114b55781610fff81161561148457610fff811661100003015b8363ffffffff166000036114ab5760e08801805163ffffffff8382011690915295506114af565b8395505b50611927565b8563ffffffff16610fcd036114d05763400000009450611927565b8563ffffffff16611018036114e85760019450611927565b8563ffffffff166110960361151e57600161012088015260ff831661010088015261151161066f565b9998505050505050505050565b8563ffffffff16610fa30361178a5763ffffffff831615611927577ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffb63ffffffff8416016117445760006115798363fffffffc16600161078b565b60208901519091508060001a6001036115e857604080516000838152336020528d83526060902091527effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff167f01000000000000000000000000000000000000000000000000000000000000001790505b6040808a015190517fe03110e10000000000000000000000000000000000000000000000000000000081526004810183905263ffffffff9091166024820152600090819073ffffffffffffffffffffffffffffffffffffffff7f0000000000000000000000003bd7e801e51d48c5d94ea68e8b801dffc275de75169063e03110e1906044016040805180830381865afa158015611689573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906116ad9190611f75565b915091506003861680600403828110156116c5578092505b50818610156116d2578591505b8260088302610100031c9250826008828460040303021b9250600180600883600403021b036001806008858560040303021b039150811981169050838119871617955050506117298663fffffffc16600186611c3f565b60408b018051820163ffffffff169052975061178592505050565b7ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffd63ffffffff84160161177957809450611927565b63ffffffff9450600993505b611927565b8563ffffffff16610fa40361187b5763ffffffff8316600114806117b4575063ffffffff83166002145b806117c5575063ffffffff83166004145b156117d257809450611927565b7ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffa63ffffffff8416016117795760006118128363fffffffc16600161078b565b6020890151909150600384166004038381101561182d578093505b83900360089081029290921c7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff600193850293841b0116911b17602088015260006040880152935083611927565b8563ffffffff16610fd703611927578163ffffffff1660030361191b5763ffffffff831615806118b1575063ffffffff83166005145b806118c2575063ffffffff83166003145b156118d05760009450611927565b63ffffffff8316600114806118eb575063ffffffff83166002145b806118fc575063ffffffff83166006145b8061190d575063ffffffff83166004145b156117795760019450611927565b63ffffffff9450601693505b6101608701805163ffffffff808816604090920191909152905185821660e09091015260808801805180831660608b0152600401909116905261151161066f565b6000611972611d8c565b506080600063ffffffff8716601003611990575060c0810151611bd6565b8663ffffffff166011036119af5763ffffffff861660c0830152611bd6565b8663ffffffff166012036119c8575060a0810151611bd6565b8663ffffffff166013036119e75763ffffffff861660a0830152611bd6565b8663ffffffff16601803611a1b5763ffffffff600387810b9087900b02602081901c821660c08501521660a0830152611bd6565b8663ffffffff16601903611a4c5763ffffffff86811681871602602081901c821660c08501521660a0830152611bd6565b8663ffffffff16601a03611b0f578460030b600003611ac7576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601660248201527f4d4950533a206469766973696f6e206279207a65726f0000000000000000000060448201526064016108d1565b8460030b8660030b81611adc57611adc611f99565b0763ffffffff1660c0830152600385810b9087900b81611afe57611afe611f99565b0563ffffffff1660a0830152611bd6565b8663ffffffff16601b03611bd6578463ffffffff16600003611b8d576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601660248201527f4d4950533a206469766973696f6e206279207a65726f0000000000000000000060448201526064016108d1565b8463ffffffff168663ffffffff1681611ba857611ba8611f99565b0663ffffffff90811660c084015285811690871681611bc957611bc9611f99565b0463ffffffff1660a08301525b63ffffffff841615611c1157808261016001518563ffffffff1660208110611c0057611c00611f46565b63ffffffff90921660209290920201525b60808201805163ffffffff80821660608601526004909101169052611c3461066f565b979650505050505050565b6000611c4a83611ce3565b90506003841615611c5a57600080fd5b6020810190601f8516601c0360031b83811b913563ffffffff90911b1916178460051c60005b601b811015611cd85760208401933582821c6001168015611ca85760018114611cbd57611cce565b60008581526020839052604090209450611cce565b600082815260208690526040902094505b5050600101611c80565b505060805250505050565b60ff8116610380026101a4810190369061052401811015611d86576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602360248201527f636865636b207468617420746865726520697320656e6f7567682063616c6c6460448201527f617461000000000000000000000000000000000000000000000000000000000060648201526084016108d1565b50919050565b6040805161018081018252600080825260208201819052918101829052606081018290526080810182905260a0810182905260c0810182905260e08101829052610100810182905261012081018290526101408101919091526101608101611df2611df7565b905290565b6040518061040001604052806020906020820280368337509192915050565b600060208083528351808285015260005b81811015611e4357858101830151858201604001528201611e27565b81811115611e55576000604083870101525b50601f017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe016929092016040019392505050565b60008083601f840112611e9b57600080fd5b50813567ffffffffffffffff811115611eb357600080fd5b602083019150836020828501011115611ecb57600080fd5b9250929050565b600080600080600060608688031215611eea57600080fd5b853567ffffffffffffffff80821115611f0257600080fd5b611f0e89838a01611e89565b90975095506020880135915080821115611f2757600080fd5b50611f3488828901611e89565b96999598509660400135949350505050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b60008060408385031215611f8857600080fd5b505080516020909101519092909150565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601260045260246000fdfea164736f6c634300080f000a"; + hex"608060405234801561001057600080fd5b50600436106100415760003560e01c806354fd4d50146100465780637dc0d1d014610098578063e14ced32146100dc575b600080fd5b6100826040518060400160405280600c81526020017f312e312e312d626574612e33000000000000000000000000000000000000000081525081565b60405161008f9190612237565b60405180910390f35b60405173ffffffffffffffffffffffffffffffffffffffff7f0000000000000000000000007a9eab4ce99d157aee7a02e95b366e972a2d5b0b16815260200161008f565b6100ef6100ea3660046122ec565b6100fd565b60405190815260200161008f565b60006101076121ad565b6080811461011457600080fd5b6040516106001461012457600080fd5b6084871461013157600080fd5b6101a4851461013f57600080fd5b8635608052602087013560a052604087013560e090811c60c09081526044890135821c82526048890135821c61010052604c890135821c610120526050890135821c61014052605489013590911c61016052605888013560f890811c610180526059890135901c6101a0819052605a89013590911c6101c05260628801906101e09060018111156101f5576040517f0136cc76000000000000000000000000000000000000000000000000000000008152600481fd5b506020810181511461020657600080fd5b60200160005b602081101561023057823560e01c825260049092019160209091019060010161020c565b5050508061012001511561024e576102466103a6565b91505061039d565b6101408101805160010167ffffffffffffffff16905260006101a49050600080600061028385606001518660000151866104f7565b9250925092508163ffffffff1660001480156102a557508063ffffffff16600c145b156102bf576102b387610521565b9550505050505061039d565b6000610339866040805160808101825260008082526020820181905291810182905260608101919091526040518060800160405280836060015163ffffffff168152602001836080015163ffffffff1681526020018360a0015163ffffffff1681526020018360c0015163ffffffff168152509050919050565b6101608701518751919250610356918391906105248888886108f9565b8652805163ffffffff9081166060808901919091526020830151821660808901526040830151821660a08901528201511660c08701526103946103a6565b96505050505050505b95945050505050565b60408051608051815260a051602082015260dc519181019190915260fc51604482015261011c51604882015261013c51604c82015261015c51605082015261017c5160548201526101805161019f5160588301526101a0516101bf5160598401526101d851605a8401526000926102009290916062830191906001811115610453576040517f0136cc76000000000000000000000000000000000000000000000000000000008152600481fd5b60005b602081101561047a57601c8601518452602090950194600490930192600101610456565b506000835283830384a060009450806001811461049a57600395506104c2565b8280156104b257600181146104bb57600296506104c0565b600096506104c0565b600196505b505b50505081900390207effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1660f89190911b17919050565b6000806000610507858786610cdf565b925050603f601a83901c8116915082165b93509350939050565b600061052b6121ad565b608090506000806000806105628561016001516040810151608082015160a083015160c084015160e0909401519294919390929091565b509350935093509350600080610ffa63ffffffff168663ffffffff16036105a75761059285858960e00151610d31565b63ffffffff1660e08a01529092509050610808565b7ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff03363ffffffff8716016105e05763400000009150610808565b7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffefe863ffffffff8716016106165760019150610808565b7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffef6a63ffffffff87160161066a57600161012088015260ff851661010088015261065d6103a6565b9998505050505050505050565b7ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff05d63ffffffff8716016107665760006040518061012001604052808763ffffffff1681526020018663ffffffff1681526020018563ffffffff16815260200189602001518152602001896040015163ffffffff1681526020018b81526020017f0000000000000000000000007a9eab4ce99d157aee7a02e95b366e972a2d5b0b73ffffffffffffffffffffffffffffffffffffffff1681526020016107386101a4600160ff16610380020190565b81528951602090910152905061074d81610dc5565b8b5263ffffffff1660408b015290935091506108089050565b7ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff05c63ffffffff8716016107cb57602087015160408801516107b1918791879187916105248d5161103d565b63ffffffff1660408b015260208a01529092509050610808565b7ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff02963ffffffff871601610808576108028585611133565b90925090505b6000610882886040805160808101825260008082526020820181905291810182905260608101919091526040518060800160405280836060015163ffffffff168152602001836080015163ffffffff1681526020018360a0015163ffffffff1681526020018360c0015163ffffffff168152509050919050565b61016089015163ffffffff85811660408084019190915285821660e0909301929092526020830180518083168086526004909101831682526060808e01919091529051821660808d015291830151811660a08c0152908201511660c08a015290506108eb6103a6565b9a9950505050505050505050565b84600263ffffffff8416148061091557508263ffffffff166003145b156109675760006002856303ffffff1663ffffffff16901b896020015163f00000001617905061096189898663ffffffff1660021461095557601f610958565b60005b60ff16846111e8565b50610cd4565b600080601f601087901c8116908a90601589901c166020811061098c5761098c612360565b602002015192508063ffffffff871615806109ad57508663ffffffff16601c145b156109df578a8263ffffffff16602081106109ca576109ca612360565b6020020151925050601f600b88901c16610a96565b60208763ffffffff161015610a41578663ffffffff16600c1480610a0957508663ffffffff16600d145b80610a1a57508663ffffffff16600e145b15610a2b578761ffff169250610a96565b610a3a8861ffff1660106112c0565b9250610a96565b60288763ffffffff16101580610a5d57508663ffffffff166022145b80610a6e57508663ffffffff166026145b15610a96578a8263ffffffff1660208110610a8b57610a8b612360565b602002015192508190505b60048763ffffffff1610158015610ab3575060088763ffffffff16105b80610ac457508663ffffffff166001145b15610ae057610ad78c8c898b8689611333565b50505050610cd4565b63ffffffff6000602089831610610b4557610b008a61ffff1660106112c0565b9095019463fffffffc8616610b168d828e610cdf565b915060288a63ffffffff1610158015610b3657508963ffffffff16603014155b15610b4357809250600093505b505b6000610b558b8b8b8a8a87611521565b63ffffffff1690508963ffffffff166000148015610b7a575060088963ffffffff1610155b8015610b8c5750601c8963ffffffff16105b15610c54578863ffffffff1660081480610bac57508863ffffffff166009145b15610bdf57610bd38f8f8b63ffffffff16600814610bca5786610bcd565b60005b8a6111e8565b50505050505050610cd4565b8863ffffffff16600a03610c0157610bd38f8f868a63ffffffff8b1615611c3e565b8863ffffffff16600b03610c2457610bd38f8f868a63ffffffff8b161515611c3e565b60108963ffffffff1610158015610c415750601c8963ffffffff16105b15610c5457610bd38f8f8b8a8a89611d0e565b8963ffffffff166038148015610c6f575063ffffffff851615155b15610c9f5760018e8663ffffffff1660208110610c8e57610c8e612360565b63ffffffff90921660209290920201525b8263ffffffff1663ffffffff14610cbe57610cbb838d83611fc7565b97505b610ccc8f8f86846001611c3e565b505050505050505b979650505050505050565b600080610ced858585612069565b909250905080610d29576040517f8e77b2b700000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b509392505050565b6000808284610fff811615610d4b57610fff811661100003015b8663ffffffff16600003610db75784935090810190636000000063ffffffff83161180610d8357508463ffffffff168263ffffffff16105b80610d9957508563ffffffff168163ffffffff16105b15610db2575063ffffffff925060169150839050610518565b610dbb565b8693505b5093509350939050565b6101008101516080820151825160009283929163ffffffff161561103657845163ffffffff167ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffb01610ff0576000610e31866101000151876020015163fffffffc168860e00151610cdf565b606087015190915060001a600103610eb357610ead86606001518760a0015160408051600093845233602052918152606090922091527effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff167f01000000000000000000000000000000000000000000000000000000000000001790565b60608701525b6000808760c0015173ffffffffffffffffffffffffffffffffffffffff1663e03110e189606001518a608001516040518363ffffffff1660e01b8152600401610f0c92919091825263ffffffff16602082015260400190565b6040805180830381865afa158015610f28573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610f4c919061238f565b60208a015160408b01519294509092509060038216600481900384811015610f72578094505b5083821015610f7f578193505b8460088502610100031c9450846008828660040303021b9450600180600883600403021b036001806008878560040303021b03915081198116905085811988161796505050610fdd8a6020015163fffffffc168b60e0015187611fc7565b9298505050938601939250611036915050565b845163ffffffff167ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffd0161102a5784604001519350611036565b63ffffffff9350600992505b9193509193565b600080858563ffffffff8b166001148061105d575063ffffffff8b166002145b8061106e575063ffffffff8b166004145b1561107b57889350611125565b7ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffa63ffffffff8c16016111195760006110bb868c63fffffffc1689610cdf565b90508860038c166004038b8110156110d157809b505b8b965086900360089081029290921c7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff600193880293841b0116911b17915060009050611125565b63ffffffff9350600992505b975097509750979350505050565b60008063ffffffff83166003036111d65763ffffffff8416158061115d575063ffffffff84166005145b8061116e575063ffffffff84166003145b1561117c57600091506111e1565b63ffffffff841660011480611197575063ffffffff84166002145b806111a8575063ffffffff84166006145b806111b9575063ffffffff84166004145b156111c757600191506111e1565b5063ffffffff905060096111e1565b5063ffffffff905060165b9250929050565b836000015160040163ffffffff16846020015163ffffffff161461126d576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601260248201527f6a756d7020696e2064656c617920736c6f74000000000000000000000000000060448201526064015b60405180910390fd5b835160208501805163ffffffff90811687528381169091528316156112b95780600801848463ffffffff16602081106112a8576112a8612360565b63ffffffff90921660209290920201525b5050505050565b600063ffffffff8381167fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff80850183169190911c821615159160016020869003821681901b830191861691821b92911b018261131d57600061131f565b815b90861663ffffffff16179250505092915050565b6000866000015160040163ffffffff16876020015163ffffffff16146113b5576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601460248201527f6272616e636820696e2064656c617920736c6f740000000000000000000000006044820152606401611264565b8463ffffffff16600414806113d057508463ffffffff166005145b15611447576000868463ffffffff16602081106113ef576113ef612360565b602002015190508063ffffffff168363ffffffff1614801561141757508563ffffffff166004145b8061143f57508063ffffffff168363ffffffff161415801561143f57508563ffffffff166005145b9150506114c4565b8463ffffffff166006036114645760008260030b131590506114c4565b8463ffffffff166007036114805760008260030b1390506114c4565b8463ffffffff166001036114c457601f601085901c1660008190036114a95760008360030b1291505b8063ffffffff166001036114c25760008360030b121591505b505b8651602088015163ffffffff16885281156115055760026114ea8661ffff1660106112c0565b63ffffffff90811690911b8201600401166020890152611517565b60208801805160040163ffffffff1690525b5050505050505050565b600063ffffffff8616158061154e575060088663ffffffff161015801561154e5750600f8663ffffffff16105b1561194e578560088114611591576009811461159a57600a81146115a357600b81146115ac57600c81146115b557600d81146115be57600e81146115c7576115cc565b602095506115cc565b602195506115cc565b602a95506115cc565b602b95506115cc565b602495506115cc565b602595506115cc565b602695505b508463ffffffff166000036115f1575063ffffffff8216601f600688901c161b611c34565b8463ffffffff16600203611615575063ffffffff8216601f600688901c161c611c34565b8463ffffffff1660030361164957601f600688901c1661164163ffffffff8516821c60208390036112c0565b915050611c34565b8463ffffffff16600403611669575063ffffffff8216601f84161b611c34565b8463ffffffff16600603611689575063ffffffff8216601f84161c611c34565b8463ffffffff166007036116b157601f841661164163ffffffff8516821c60208390036112c0565b8463ffffffff166008036116c6575082611c34565b8463ffffffff166009036116db575082611c34565b8463ffffffff16600a036116f0575082611c34565b8463ffffffff16600b03611705575082611c34565b8463ffffffff16600c0361171a575082611c34565b8463ffffffff16600f0361172f575082611c34565b8463ffffffff16601003611744575082611c34565b8463ffffffff16601103611759575082611c34565b8463ffffffff1660120361176e575082611c34565b8463ffffffff16601303611783575082611c34565b8463ffffffff16601803611798575082611c34565b8463ffffffff166019036117ad575082611c34565b8463ffffffff16601a036117c2575082611c34565b8463ffffffff16601b036117d7575082611c34565b8463ffffffff166020036117ee5750828201611c34565b8463ffffffff166021036118055750828201611c34565b8463ffffffff1660220361181c5750818303611c34565b8463ffffffff166023036118335750818303611c34565b8463ffffffff1660240361184a5750828216611c34565b8463ffffffff166025036118615750828217611c34565b8463ffffffff166026036118785750828218611c34565b8463ffffffff16602703611890575082821719611c34565b8463ffffffff16602a036118bf578260030b8460030b126118b25760006118b5565b60015b60ff169050611c34565b8463ffffffff16602b036118e7578263ffffffff168463ffffffff16106118b25760006118b5565b6040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601360248201527f696e76616c696420696e737472756374696f6e000000000000000000000000006044820152606401611264565b6118e7565b8563ffffffff16601c036119ce578463ffffffff166002036119735750828202611c34565b8463ffffffff166020148061198e57508463ffffffff166021145b15611949578463ffffffff166020036119a5579219925b60005b63800000008516156119c7576401fffffffe600195861b1694016119a8565b9050611c34565b8563ffffffff16600f036119ef575065ffffffff0000601083901b16611c34565b8563ffffffff16602003611a23576119c78460031660080260180363ffffffff168363ffffffff16901c60ff1660086112c0565b8563ffffffff16602103611a58576119c78460021660080260100363ffffffff168363ffffffff16901c61ffff1660106112c0565b8563ffffffff16602203611a86575063ffffffff60086003851602811681811b198416918316901b17611c34565b8563ffffffff16602303611a9b575080611c34565b8563ffffffff16602403611acc578360031660080260180363ffffffff168263ffffffff16901c60ff169050611c34565b8563ffffffff16602503611afe578360021660080260100363ffffffff168263ffffffff16901c61ffff169050611c34565b8563ffffffff16602603611b2f575063ffffffff60086003851602601803811681811c198416918316901c17611c34565b8563ffffffff16602803611b64575060ff63ffffffff60086003861602601803811682811b9091188316918416901b17611c34565b8563ffffffff16602903611b9a575061ffff63ffffffff60086002861602601003811682811b9091188316918416901b17611c34565b8563ffffffff16602a03611bc8575063ffffffff60086003851602811681811c198316918416901c17611c34565b8563ffffffff16602b03611bdd575081611c34565b8563ffffffff16602e03611c0e575063ffffffff60086003851602601803811681811b198316918416901b17611c34565b8563ffffffff16603003611c23575080611c34565b8563ffffffff166038036118e75750815b9695505050505050565b60208363ffffffff1610611cae576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152600e60248201527f76616c69642072656769737465720000000000000000000000000000000000006044820152606401611264565b63ffffffff831615801590611cc05750805b15611cef5781848463ffffffff1660208110611cde57611cde612360565b63ffffffff90921660209290920201525b5050505060208101805163ffffffff8082169093526004019091169052565b60008463ffffffff16601003611d2957506060860151611f6f565b8463ffffffff16601103611d485763ffffffff84166060880152611f6f565b8463ffffffff16601203611d6157506040860151611f6f565b8463ffffffff16601303611d805763ffffffff84166040880152611f6f565b8463ffffffff16601803611db45763ffffffff600385810b9085900b02602081901c821660608a0152166040880152611f6f565b8463ffffffff16601903611de55763ffffffff84811681851602602081901c821660608a0152166040880152611f6f565b8463ffffffff16601a03611ea8578260030b600003611e60576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601660248201527f4d4950533a206469766973696f6e206279207a65726f000000000000000000006044820152606401611264565b8260030b8460030b81611e7557611e756123b3565b0763ffffffff166060880152600383810b9085900b81611e9757611e976123b3565b0563ffffffff166040880152611f6f565b8463ffffffff16601b03611f6f578263ffffffff16600003611f26576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601660248201527f4d4950533a206469766973696f6e206279207a65726f000000000000000000006044820152606401611264565b8263ffffffff168463ffffffff1681611f4157611f416123b3565b0663ffffffff908116606089015283811690851681611f6257611f626123b3565b0463ffffffff1660408801525b63ffffffff821615611fa55780868363ffffffff1660208110611f9457611f94612360565b63ffffffff90921660209290920201525b50505060208401805163ffffffff808216909652600401909416909352505050565b6000611fd283612114565b6003841615611fe057600080fd5b6020830192601f8516601c0360031b83811b913563ffffffff90911b1916178460051c60005b601b81101561205e5760208601953582821c600116801561202e576001811461204357612054565b60008581526020839052604090209450612054565b600082815260208690526040902094505b5050600101612006565b509095945050505050565b60008061207583612114565b600384161561208357600080fd5b6020830192358460051c8160005b601b8110156120e95760208701963583821c60011680156120b957600181146120ce576120df565b600084815260208390526040902093506120df565b600082815260208590526040902093505b5050600101612091565b508714925050811561210b57601f8516601c0360031b81901c63ffffffff1692505b50935093915050565b3661038082018110156121a9576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602360248201527f636865636b207468617420746865726520697320656e6f7567682063616c6c6460448201527f61746100000000000000000000000000000000000000000000000000000000006064820152608401611264565b5050565b6040805161018081018252600080825260208201819052918101829052606081018290526080810182905260a0810182905260c0810182905260e08101829052610100810182905261012081018290526101408101919091526101608101612213612218565b905290565b6040518061040001604052806020906020820280368337509192915050565b600060208083528351808285015260005b8181101561226457858101830151858201604001528201612248565b81811115612276576000604083870101525b50601f017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe016929092016040019392505050565b60008083601f8401126122bc57600080fd5b50813567ffffffffffffffff8111156122d457600080fd5b6020830191508360208285010111156111e157600080fd5b60008060008060006060868803121561230457600080fd5b853567ffffffffffffffff8082111561231c57600080fd5b61232889838a016122aa565b9097509550602088013591508082111561234157600080fd5b5061234e888289016122aa565b96999598509660400135949350505050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b600080604083850312156123a257600080fd5b505080516020909101519092909150565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601260045260246000fdfea164736f6c634300080f000a"; bytes internal constant anchorStateRegistryCode = - hex"608060405234801561001057600080fd5b50600436106100675760003560e01c8063838c2d1e11610050578063838c2d1e146100fa578063c303f0df14610104578063f2b4e6171461011757600080fd5b806354fd4d501461006c5780637258a807146100be575b600080fd5b6100a86040518060400160405280600581526020017f312e302e3000000000000000000000000000000000000000000000000000000081525081565b6040516100b5919061085c565b60405180910390f35b6100e56100cc36600461088b565b6001602081905260009182526040909120805491015482565b604080519283526020830191909152016100b5565b61010261015b565b005b61010261011236600461094f565b6105d4565b60405173ffffffffffffffffffffffffffffffffffffffff7f0000000000000000000000008b71b41d4dbeb2b6821d44692d3facaaf77480bb1681526020016100b5565b600033905060008060008373ffffffffffffffffffffffffffffffffffffffff1663fa24f7436040518163ffffffff1660e01b8152600401600060405180830381865afa1580156101b0573d6000803e3d6000fd5b505050506040513d6000823e601f3d9081017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe01682016040526101f69190810190610a68565b92509250925060007f0000000000000000000000008b71b41d4dbeb2b6821d44692d3facaaf77480bb73ffffffffffffffffffffffffffffffffffffffff16635f0150cb8585856040518463ffffffff1660e01b815260040161025b93929190610b39565b6040805180830381865afa158015610277573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061029b9190610b67565b5090508473ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff1614610384576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152604360248201527f416e63686f72537461746552656769737472793a206661756c7420646973707560448201527f74652067616d65206e6f7420726567697374657265642077697468206661637460648201527f6f72790000000000000000000000000000000000000000000000000000000000608482015260a4015b60405180910390fd5b600160008563ffffffff1663ffffffff168152602001908152602001600020600101548573ffffffffffffffffffffffffffffffffffffffff16638b85902b6040518163ffffffff1660e01b8152600401602060405180830381865afa1580156103f2573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906104169190610bc7565b11610422575050505050565b60028573ffffffffffffffffffffffffffffffffffffffff1663200d2ed26040518163ffffffff1660e01b8152600401602060405180830381865afa15801561046f573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906104939190610c0f565b60028111156104a4576104a4610be0565b146104b0575050505050565b60405180604001604052806105308773ffffffffffffffffffffffffffffffffffffffff1663bcef3b556040518163ffffffff1660e01b8152600401602060405180830381865afa158015610509573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061052d9190610bc7565b90565b81526020018673ffffffffffffffffffffffffffffffffffffffff16638b85902b6040518163ffffffff1660e01b8152600401602060405180830381865afa158015610580573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906105a49190610bc7565b905263ffffffff909416600090815260016020818152604090922086518155959091015194019390935550505050565b600054610100900460ff16158080156105f45750600054600160ff909116105b8061060e5750303b15801561060e575060005460ff166001145b61069a576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602e60248201527f496e697469616c697a61626c653a20636f6e747261637420697320616c72656160448201527f647920696e697469616c697a6564000000000000000000000000000000000000606482015260840161037b565b600080547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0016600117905580156106f857600080547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00ff166101001790555b60005b825181101561075e57600083828151811061071857610718610c30565b60209081029190910181015180820151905163ffffffff16600090815260018084526040909120825181559190920151910155508061075681610c5f565b9150506106fb565b5080156107c257600080547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00ff169055604051600181527f7f26b83ff96e1f2b6a682f133852f6798a09c465da95921460cefb38474024989060200160405180910390a15b5050565b73ffffffffffffffffffffffffffffffffffffffff163b151590565b60005b838110156107fd5781810151838201526020016107e5565b8381111561080c576000848401525b50505050565b6000815180845261082a8160208601602086016107e2565b601f017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0169290920160200192915050565b60208152600061086f6020830184610812565b9392505050565b63ffffffff8116811461088857600080fd5b50565b60006020828403121561089d57600080fd5b813561086f81610876565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b6040805190810167ffffffffffffffff811182821017156108fa576108fa6108a8565b60405290565b604051601f82017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe016810167ffffffffffffffff81118282101715610947576109476108a8565b604052919050565b6000602080838503121561096257600080fd5b823567ffffffffffffffff8082111561097a57600080fd5b818501915085601f83011261098e57600080fd5b8135818111156109a0576109a06108a8565b6109ae848260051b01610900565b818152848101925060609182028401850191888311156109cd57600080fd5b938501935b82851015610a5c57848903818112156109eb5760008081fd5b6109f36108d7565b86356109fe81610876565b815260407fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe08301811315610a325760008081fd5b610a3a6108d7565b888a0135815290880135898201528189015285525093840193928501926109d2565b50979650505050505050565b600080600060608486031215610a7d57600080fd5b8351610a8881610876565b60208501516040860151919450925067ffffffffffffffff80821115610aad57600080fd5b818601915086601f830112610ac157600080fd5b815181811115610ad357610ad36108a8565b610b0460207fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0601f84011601610900565b9150808252876020828501011115610b1b57600080fd5b610b2c8160208401602086016107e2565b5080925050509250925092565b63ffffffff84168152826020820152606060408201526000610b5e6060830184610812565b95945050505050565b60008060408385031215610b7a57600080fd5b825173ffffffffffffffffffffffffffffffffffffffff81168114610b9e57600080fd5b602084015190925067ffffffffffffffff81168114610bbc57600080fd5b809150509250929050565b600060208284031215610bd957600080fd5b5051919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602160045260246000fd5b600060208284031215610c2157600080fd5b81516003811061086f57600080fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b60007fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff8203610cb7577f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b506001019056fea164736f6c634300080f000a"; - bytes internal constant acc27Code = - hex"6080604052600436106102f25760003560e01c806370872aa51161018f578063c6f0308c116100e1578063ec5e63081161008a578063fa24f74311610064578063fa24f74314610b18578063fa315aa914610b3c578063fe2bbeb214610b6f57600080fd5b8063ec5e630814610a95578063eff0f59214610ac8578063f8f43ff614610af857600080fd5b8063d6ae3cd5116100bb578063d6ae3cd514610a0f578063d8cc1a3c14610a42578063dabd396d14610a6257600080fd5b8063c6f0308c14610937578063cf09e0d0146109c1578063d5d44d80146109e257600080fd5b80638d450a9511610143578063bcef3b551161011d578063bcef3b55146108b7578063bd8da956146108f7578063c395e1ca1461091757600080fd5b80638d450a9514610777578063a445ece6146107aa578063bbdc02db1461087657600080fd5b80638129fc1c116101745780638129fc1c1461071a5780638980e0cc146107225780638b85902b1461073757600080fd5b806370872aa5146106f25780637b0f0adc1461070757600080fd5b80633fc8cef3116102485780635c0cba33116101fc5780636361506d116101d65780636361506d1461066c5780636b6716c0146106ac5780636f034409146106df57600080fd5b80635c0cba3314610604578063609d33341461063757806360e274641461064c57600080fd5b806354fd4d501161022d57806354fd4d501461055e57806357da950e146105b45780635a5fa2d9146105e457600080fd5b80633fc8cef314610518578063472777c61461054b57600080fd5b80632810e1d6116102aa57806337b1b2291161028457806337b1b229146104655780633a768463146104a55780633e3ac912146104d857600080fd5b80632810e1d6146103de5780632ad69aeb146103f357806330dbe5701461041357600080fd5b806319effeb4116102db57806319effeb414610339578063200d2ed21461038457806325fc2ace146103bf57600080fd5b806301935130146102f757806303c2924d14610319575b600080fd5b34801561030357600080fd5b5061031761031236600461532d565b610b9f565b005b34801561032557600080fd5b50610317610334366004615388565b610ec0565b34801561034557600080fd5b506000546103669068010000000000000000900467ffffffffffffffff1681565b60405167ffffffffffffffff90911681526020015b60405180910390f35b34801561039057600080fd5b506000546103b290700100000000000000000000000000000000900460ff1681565b60405161037b91906153d9565b3480156103cb57600080fd5b506008545b60405190815260200161037b565b3480156103ea57600080fd5b506103b2611566565b3480156103ff57600080fd5b506103d061040e366004615388565b61180b565b34801561041f57600080fd5b506001546104409073ffffffffffffffffffffffffffffffffffffffff1681565b60405173ffffffffffffffffffffffffffffffffffffffff909116815260200161037b565b34801561047157600080fd5b50367ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe81013560f01c90033560601c610440565b3480156104b157600080fd5b507f000000000000000000000000f698388bfcdbd3f9f2f13ebc3e01471b3cc7ce83610440565b3480156104e457600080fd5b50600054610508907201000000000000000000000000000000000000900460ff1681565b604051901515815260200161037b565b34801561052457600080fd5b507f0000000000000000000000000c8b5822b6e02cda722174f19a1439a7495a3fa6610440565b61031761055936600461541a565b611841565b34801561056a57600080fd5b506105a76040518060400160405280600581526020017f312e322e3000000000000000000000000000000000000000000000000000000081525081565b60405161037b91906154b1565b3480156105c057600080fd5b506008546009546105cf919082565b6040805192835260208301919091520161037b565b3480156105f057600080fd5b506103d06105ff3660046154c4565b611853565b34801561061057600080fd5b507f0000000000000000000000001c23a6d89f95ef3148bcda8e242cab145bf9c0e4610440565b34801561064357600080fd5b506105a761188d565b34801561065857600080fd5b50610317610667366004615502565b61189b565b34801561067857600080fd5b50367ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe81013560f01c9003603401356103d0565b3480156106b857600080fd5b507f0000000000000000000000000000000000000000000000000000000000000000610366565b6103176106ed366004615534565b611a42565b3480156106fe57600080fd5b506009546103d0565b61031761071536600461541a565b6123e3565b6103176123f0565b34801561072e57600080fd5b506002546103d0565b34801561074357600080fd5b50367ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe81013560f01c9003605401356103d0565b34801561078357600080fd5b507f00000000000000000000000000000000000000000000000000000000000000006103d0565b3480156107b657600080fd5b506108226107c53660046154c4565b6007602052600090815260409020805460019091015460ff821691610100810463ffffffff1691650100000000009091046fffffffffffffffffffffffffffffffff169073ffffffffffffffffffffffffffffffffffffffff1684565b60408051941515855263ffffffff90931660208501526fffffffffffffffffffffffffffffffff9091169183019190915273ffffffffffffffffffffffffffffffffffffffff16606082015260800161037b565b34801561088257600080fd5b5060405163ffffffff7f000000000000000000000000000000000000000000000000000000000000000016815260200161037b565b3480156108c357600080fd5b50367ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe81013560f01c9003601401356103d0565b34801561090357600080fd5b506103666109123660046154c4565b612949565b34801561092357600080fd5b506103d0610932366004615573565b612b28565b34801561094357600080fd5b506109576109523660046154c4565b612d0b565b6040805163ffffffff909816885273ffffffffffffffffffffffffffffffffffffffff968716602089015295909416948601949094526fffffffffffffffffffffffffffffffff9182166060860152608085015291821660a08401521660c082015260e00161037b565b3480156109cd57600080fd5b506000546103669067ffffffffffffffff1681565b3480156109ee57600080fd5b506103d06109fd366004615502565b60036020526000908152604090205481565b348015610a1b57600080fd5b507f00000000000000000000000000000000000000000000000000000000000003856103d0565b348015610a4e57600080fd5b50610317610a5d3660046155a5565b612da2565b348015610a6e57600080fd5b507f00000000000000000000000000000000000000000000000000000000000004b0610366565b348015610aa157600080fd5b507f00000000000000000000000000000000000000000000000000000000000000046103d0565b348015610ad457600080fd5b50610508610ae33660046154c4565b60046020526000908152604090205460ff1681565b348015610b0457600080fd5b50610317610b1336600461541a565b6133d1565b348015610b2457600080fd5b50610b2d613823565b60405161037b9392919061562f565b348015610b4857600080fd5b507f00000000000000000000000000000000000000000000000000000000000000086103d0565b348015610b7b57600080fd5b50610508610b8a3660046154c4565b60066020526000908152604090205460ff1681565b60008054700100000000000000000000000000000000900460ff166002811115610bcb57610bcb6153aa565b14610c02576040517f67fe195000000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6000547201000000000000000000000000000000000000900460ff1615610c55576040517f0ea2e75200000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b610c8c367ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe81013560f01c90036014013590565b90565b610ca3610c9e36869003860186615683565b613883565b14610cda576040517f9cc00b5b00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b82606001358282604051610cef929190615710565b604051809103902014610d2e576040517fd81d583b00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6000610d77610d7284848080601f0160208091040260200160405190810160405280939291908181526020018383808284376000920191909152506138df92505050565b61394c565b90506000610d9e82600881518110610d9157610d91615720565b6020026020010151613b02565b9050602081511115610ddc576040517fd81d583b00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b602081810151825190910360031b1c367ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe81013560f01c9003605401358103610e51576040517fb8ed883000000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b5050600180547fffffffffffffffffffffffff000000000000000000000000000000000000000016331790555050600080547fffffffffffffffffffffffffff00ffffffffffffffffffffffffffffffffffff1672010000000000000000000000000000000000001790555050565b60008054700100000000000000000000000000000000900460ff166002811115610eec57610eec6153aa565b14610f23576040517f67fe195000000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b600060028381548110610f3857610f38615720565b906000526020600020906005020190506000610f5384612949565b905067ffffffffffffffff7f00000000000000000000000000000000000000000000000000000000000004b081169082161015610fbc576040517ff2440b5300000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b60008481526006602052604090205460ff1615611005576040517ff1a9458100000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b600084815260056020526040902080548015801561102257508515155b156110bd578354640100000000900473ffffffffffffffffffffffffffffffffffffffff16600081156110555781611071565b600186015473ffffffffffffffffffffffffffffffffffffffff165b905061107d8187613bb6565b50505060009485525050600660205250506040902080547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00166001179055565b6000868152600760209081526040918290208251608081018452815460ff81161515808352610100820463ffffffff16948301949094526501000000000090046fffffffffffffffffffffffffffffffff16938101939093526001015473ffffffffffffffffffffffffffffffffffffffff166060830152611160576fffffffffffffffffffffffffffffffff6040820152600181526000869003611160578195505b600086826020015163ffffffff16611178919061577e565b90506000838211611189578161118b565b835b602084015190915063ffffffff165b818110156112d75760008682815481106111b6576111b6615720565b6000918252602080832090910154808352600690915260409091205490915060ff1661120e576040517f9a07664600000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b60006002828154811061122357611223615720565b600091825260209091206005909102018054909150640100000000900473ffffffffffffffffffffffffffffffffffffffff161580156112805750600481015460408701516fffffffffffffffffffffffffffffffff9182169116115b156112c257600181015473ffffffffffffffffffffffffffffffffffffffff16606087015260048101546fffffffffffffffffffffffffffffffff1660408701525b505080806112cf90615796565b91505061119a565b5063ffffffff818116602085810191825260008c81526007909152604090819020865181549351928801517fffffffffffffffffffffffffffffffffffffffffffffffffffffff00000000009094169015157fffffffffffffffffffffffffffffffffffffffffffffffffffffff00000000ff161761010092909416918202939093177fffffffffffffffffffffff00000000000000000000000000000000ffffffffff16650100000000006fffffffffffffffffffffffffffffffff909316929092029190911782556060850151600190920180547fffffffffffffffffffffffff00000000000000000000000000000000000000001673ffffffffffffffffffffffffffffffffffffffff9093169290921790915584900361155b57606083015160008a815260066020526040902080547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff001660011790558915801561145757506000547201000000000000000000000000000000000000900460ff165b156114cc5760015473ffffffffffffffffffffffffffffffffffffffff1661147f818a613bb6565b885473ffffffffffffffffffffffffffffffffffffffff909116640100000000027fffffffffffffffff0000000000000000000000000000000000000000ffffffff909116178855611559565b61151373ffffffffffffffffffffffffffffffffffffffff8216156114f1578161150d565b600189015473ffffffffffffffffffffffffffffffffffffffff165b89613bb6565b87547fffffffffffffffff0000000000000000000000000000000000000000ffffffff1664010000000073ffffffffffffffffffffffffffffffffffffffff8316021788555b505b505050505050505050565b600080600054700100000000000000000000000000000000900460ff166002811115611594576115946153aa565b146115cb576040517f67fe195000000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6000805260066020527f54cdd369e4e8a8515e52ca72ec816c2101831ad1f18bf44102ed171459c9b4f85460ff1661162f576040517f9a07664600000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff16600260008154811061165b5761165b615720565b6000918252602090912060059091020154640100000000900473ffffffffffffffffffffffffffffffffffffffff1614611696576001611699565b60025b6000805467ffffffffffffffff421668010000000000000000027fffffffffffffffffffffffffffffffff0000000000000000ffffffffffffffff82168117835592935083927fffffffffffffffffffffffffffffff00ffffffffffffffffffffffffffffffff167fffffffffffffffffffffffffffffff000000000000000000ffffffffffffffff9091161770010000000000000000000000000000000083600281111561174a5761174a6153aa565b02179055600281111561175f5761175f6153aa565b6040517f5e186f09b9c93491f14e277eea7faa5de6a2d4bda75a79af7a3684fbfb42da6090600090a27f0000000000000000000000001c23a6d89f95ef3148bcda8e242cab145bf9c0e473ffffffffffffffffffffffffffffffffffffffff1663838c2d1e6040518163ffffffff1660e01b8152600401600060405180830381600087803b1580156117f057600080fd5b505af1158015611804573d6000803e3d6000fd5b5050505090565b6005602052816000526040600020818154811061182757600080fd5b90600052602060002001600091509150505481565b905090565b61184e8383836001611a42565b505050565b6000818152600760209081526040808320600590925282208054825461188490610100900463ffffffff16826157ce565b95945050505050565b606061183c60546020613cb7565b73ffffffffffffffffffffffffffffffffffffffff8116600090815260036020526040812080549082905590819003611900576040517f17bfe5f700000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6040517ff3fef3a300000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff8381166004830152602482018390527f0000000000000000000000000c8b5822b6e02cda722174f19a1439a7495a3fa6169063f3fef3a390604401600060405180830381600087803b15801561199057600080fd5b505af11580156119a4573d6000803e3d6000fd5b5050505060008273ffffffffffffffffffffffffffffffffffffffff168260405160006040518083038185875af1925050503d8060008114611a02576040519150601f19603f3d011682016040523d82523d6000602084013e611a07565b606091505b505090508061184e576040517f83e6cc6b00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b60008054700100000000000000000000000000000000900460ff166002811115611a6e57611a6e6153aa565b14611aa5576040517f67fe195000000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b600060028481548110611aba57611aba615720565b60009182526020918290206040805160e0810182526005909302909101805463ffffffff8116845273ffffffffffffffffffffffffffffffffffffffff64010000000090910481169484019490945260018101549093169082015260028201546fffffffffffffffffffffffffffffffff908116606083015260038301546080830181905260049093015480821660a084015270010000000000000000000000000000000090041660c082015291508514611ba1576040517f3014033200000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b60a0810151600083156fffffffffffffffffffffffffffffffff83161760011b90506000611c61826fffffffffffffffffffffffffffffffff167e09010a0d15021d0b0e10121619031e080c141c0f111807131b17061a05041f7f07c4acdd0000000000000000000000000000000000000000000000000000000067ffffffffffffffff831160061b83811c63ffffffff1060051b1792831c600181901c17600281901c17600481901c17600881901c17601081901c170260fb1c1a1790565b60ff169050861580611c9c5750611c997f0000000000000000000000000000000000000000000000000000000000000004600261577e565b81145b8015611ca6575084155b15611cdd576040517fa42637bc00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6000547201000000000000000000000000000000000000900460ff168015611d03575086155b15611d3a576040517f0ea2e75200000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b7f0000000000000000000000000000000000000000000000000000000000000008811115611d94576040517f56f57b2b00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b611dbf7f0000000000000000000000000000000000000000000000000000000000000004600161577e565b8103611dd157611dd186888588613d09565b34611ddb83612b28565b14611e12576040517f8620aa1900000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6000611e1d88612949565b905067ffffffffffffffff7f00000000000000000000000000000000000000000000000000000000000004b0811690821603611e85576040517f3381d11400000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b67ffffffffffffffff7f00000000000000000000000000000000000000000000000000000000000000001667ffffffffffffffff7f00000000000000000000000000000000000000000000000000000000000004b016611ee591906157e5565b67ffffffffffffffff16611f008267ffffffffffffffff1690565b67ffffffffffffffff161115611fe2576000611f3d60017f00000000000000000000000000000000000000000000000000000000000000046157ce565b8314611f735767ffffffffffffffff7f000000000000000000000000000000000000000000000000000000000000000016611fa8565b611fa87f000000000000000000000000000000000000000000000000000000000000000067ffffffffffffffff16600261580e565b9050611fde817f00000000000000000000000000000000000000000000000000000000000004b067ffffffffffffffff166157e5565b9150505b6000604082901b42176000898152608086901b6fffffffffffffffffffffffffffffffff8c1617602052604081209192509060008181526004602052604090205490915060ff1615612060576040517f80497e3b00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b60016004600083815260200190815260200160002060006101000a81548160ff02191690831515021790555060026040518060e001604052808c63ffffffff168152602001600073ffffffffffffffffffffffffffffffffffffffff1681526020013373ffffffffffffffffffffffffffffffffffffffff168152602001346fffffffffffffffffffffffffffffffff1681526020018b8152602001876fffffffffffffffffffffffffffffffff168152602001846fffffffffffffffffffffffffffffffff16815250908060018154018082558091505060019003906000526020600020906005020160009091909190915060008201518160000160006101000a81548163ffffffff021916908363ffffffff16021790555060208201518160000160046101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555060408201518160010160006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555060608201518160020160006101000a8154816fffffffffffffffffffffffffffffffff02191690836fffffffffffffffffffffffffffffffff1602179055506080820151816003015560a08201518160040160006101000a8154816fffffffffffffffffffffffffffffffff02191690836fffffffffffffffffffffffffffffffff16021790555060c08201518160040160106101000a8154816fffffffffffffffffffffffffffffffff02191690836fffffffffffffffffffffffffffffffff1602179055505050600560008b815260200190815260200160002060016002805490506122f691906157ce565b81546001810183556000928352602083200155604080517fd0e30db0000000000000000000000000000000000000000000000000000000008152905173ffffffffffffffffffffffffffffffffffffffff7f0000000000000000000000000c8b5822b6e02cda722174f19a1439a7495a3fa6169263d0e30db09234926004808301939282900301818588803b15801561238e57600080fd5b505af11580156123a2573d6000803e3d6000fd5b50506040513393508c92508d91507f9b3245740ec3b155098a55be84957a4da13eaf7f14a8bc6f53126c0b9350f2be90600090a45050505050505050505050565b61184e8383836000611a42565b60005471010000000000000000000000000000000000900460ff1615612442576040517f0dc149f000000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6040517f7258a80700000000000000000000000000000000000000000000000000000000815263ffffffff7f0000000000000000000000000000000000000000000000000000000000000000166004820152600090819073ffffffffffffffffffffffffffffffffffffffff7f0000000000000000000000001c23a6d89f95ef3148bcda8e242cab145bf9c0e41690637258a807906024016040805180830381865afa1580156124f6573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061251a919061583e565b909250905081612556576040517f6a6bc3b200000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b604080518082019091528281526020018190526008829055600981905536607a1461258957639824bdab6000526004601cfd5b80367ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe81013560f01c90036054013511612623576040517ff40239db000000000000000000000000000000000000000000000000000000008152367ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe81013560f01c90036014013560048201526024015b60405180910390fd5b6040805160e08101825263ffffffff8082526000602083018181527ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe369081013560f01c90038035606090811c868801908152346fffffffffffffffffffffffffffffffff81811693890193845260149094013560808901908152600160a08a0181815242871660c08c019081526002805493840181558a529a5160059092027f405787fa12a823e0f2b7631cc41b3ba8828b3321ca811111fa75cd3aa3bb5ace81018054995173ffffffffffffffffffffffffffffffffffffffff908116640100000000027fffffffffffffffff000000000000000000000000000000000000000000000000909b1694909c16939093179890981790915592517f405787fa12a823e0f2b7631cc41b3ba8828b3321ca811111fa75cd3aa3bb5acf87018054918a167fffffffffffffffffffffffff000000000000000000000000000000000000000090921691909117905592517f405787fa12a823e0f2b7631cc41b3ba8828b3321ca811111fa75cd3aa3bb5ad0860180549186167fffffffffffffffffffffffffffffffff0000000000000000000000000000000090921691909117905591517f405787fa12a823e0f2b7631cc41b3ba8828b3321ca811111fa75cd3aa3bb5ad185015551955182167001000000000000000000000000000000000295909116949094177f405787fa12a823e0f2b7631cc41b3ba8828b3321ca811111fa75cd3aa3bb5ad29091015580547fffffffffffffffffffffffffffff00ffffffffffffffffffffffffffffffffff167101000000000000000000000000000000000017815583517fd0e30db000000000000000000000000000000000000000000000000000000000815293517f0000000000000000000000000c8b5822b6e02cda722174f19a1439a7495a3fa69092169363d0e30db093926004828101939282900301818588803b1580156128f857600080fd5b505af115801561290c573d6000803e3d6000fd5b5050600080547fffffffffffffffffffffffffffffffffffffffffffffffff0000000000000000164267ffffffffffffffff161790555050505050565b600080600054700100000000000000000000000000000000900460ff166002811115612977576129776153aa565b146129ae576040517f67fe195000000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6000600283815481106129c3576129c3615720565b600091825260208220600590910201805490925063ffffffff90811614612a3257815460028054909163ffffffff16908110612a0157612a01615720565b906000526020600020906005020160040160109054906101000a90046fffffffffffffffffffffffffffffffff1690505b6004820154600090612a6a90700100000000000000000000000000000000900467ffffffffffffffff165b67ffffffffffffffff1690565b612a7e9067ffffffffffffffff16426157ce565b612a9d612a5d846fffffffffffffffffffffffffffffffff1660401c90565b67ffffffffffffffff16612ab1919061577e565b905067ffffffffffffffff7f00000000000000000000000000000000000000000000000000000000000004b01667ffffffffffffffff168167ffffffffffffffff1611612afe5780611884565b7f00000000000000000000000000000000000000000000000000000000000004b095945050505050565b600080612bc7836fffffffffffffffffffffffffffffffff167e09010a0d15021d0b0e10121619031e080c141c0f111807131b17061a05041f7f07c4acdd0000000000000000000000000000000000000000000000000000000067ffffffffffffffff831160061b83811c63ffffffff1060051b1792831c600181901c17600281901c17600481901c17600881901c17601081901c170260fb1c1a1790565b60ff1690507f0000000000000000000000000000000000000000000000000000000000000008811115612c26576040517f56f57b2b00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b642e90edd00062061a806311e1a3006000612c418383615891565b9050670de0b6b3a76400006000612c78827f00000000000000000000000000000000000000000000000000000000000000086158a5565b90506000612c96612c91670de0b6b3a7640000866158a5565b613eba565b90506000612ca48484614115565b90506000612cb28383614164565b90506000612cbf82614192565b90506000612cde82612cd9670de0b6b3a76400008f6158a5565b61437a565b90506000612cec8b83614164565b9050612cf8818d6158a5565b9f9e505050505050505050505050505050565b60028181548110612d1b57600080fd5b60009182526020909120600590910201805460018201546002830154600384015460049094015463ffffffff8416955064010000000090930473ffffffffffffffffffffffffffffffffffffffff908116949216926fffffffffffffffffffffffffffffffff91821692918082169170010000000000000000000000000000000090041687565b60008054700100000000000000000000000000000000900460ff166002811115612dce57612dce6153aa565b14612e05576040517f67fe195000000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b600060028781548110612e1a57612e1a615720565b6000918252602082206005919091020160048101549092506fffffffffffffffffffffffffffffffff16908715821760011b9050612e797f0000000000000000000000000000000000000000000000000000000000000008600161577e565b612f15826fffffffffffffffffffffffffffffffff167e09010a0d15021d0b0e10121619031e080c141c0f111807131b17061a05041f7f07c4acdd0000000000000000000000000000000000000000000000000000000067ffffffffffffffff831160061b83811c63ffffffff1060051b1792831c600181901c17600281901c17600481901c17600881901c17601081901c170260fb1c1a1790565b60ff1614612f4f576040517f5f53dd9800000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b600080891561304657612fa27f00000000000000000000000000000000000000000000000000000000000000047f00000000000000000000000000000000000000000000000000000000000000086157ce565b6001901b612fc1846fffffffffffffffffffffffffffffffff166143b4565b6fffffffffffffffffffffffffffffffff16612fdd91906158e2565b1561301a5761301161300260016fffffffffffffffffffffffffffffffff87166158f6565b865463ffffffff166000614453565b6003015461303c565b7f00000000000000000000000000000000000000000000000000000000000000005b9150849050613070565b6003850154915061306d6130026fffffffffffffffffffffffffffffffff8616600161591f565b90505b600882901b60088a8a604051613087929190615710565b6040518091039020901b146130c8576040517f696550ff00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b60006130d38c614537565b905060006130e2836003015490565b6040517fe14ced320000000000000000000000000000000000000000000000000000000081527f000000000000000000000000f698388bfcdbd3f9f2f13ebc3e01471b3cc7ce8373ffffffffffffffffffffffffffffffffffffffff169063e14ced329061315c908f908f908f908f908a9060040161599c565b6020604051808303816000875af115801561317b573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061319f91906159d6565b60048501549114915060009060029061324a906fffffffffffffffffffffffffffffffff167e09010a0d15021d0b0e10121619031e080c141c0f111807131b17061a05041f7f07c4acdd0000000000000000000000000000000000000000000000000000000067ffffffffffffffff831160061b83811c63ffffffff1060051b1792831c600181901c17600281901c17600481901c17600881901c17601081901c170260fb1c1a1790565b6132e6896fffffffffffffffffffffffffffffffff167e09010a0d15021d0b0e10121619031e080c141c0f111807131b17061a05041f7f07c4acdd0000000000000000000000000000000000000000000000000000000067ffffffffffffffff831160061b83811c63ffffffff1060051b1792831c600181901c17600281901c17600481901c17600881901c17601081901c170260fb1c1a1790565b6132f091906159ef565b6132fa9190615a12565b60ff16159050811515810361333b576040517ffb4e40dd00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b8754640100000000900473ffffffffffffffffffffffffffffffffffffffff1615613392576040517f9071e6af00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b505085547fffffffffffffffff0000000000000000000000000000000000000000ffffffff163364010000000002179095555050505050505050505050565b60008054700100000000000000000000000000000000900460ff1660028111156133fd576133fd6153aa565b14613434576040517f67fe195000000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b60008060008061344386614566565b935093509350935060006134598585858561496f565b905060007f000000000000000000000000f698388bfcdbd3f9f2f13ebc3e01471b3cc7ce8373ffffffffffffffffffffffffffffffffffffffff16637dc0d1d06040518163ffffffff1660e01b8152600401602060405180830381865afa1580156134c8573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906134ec9190615a34565b9050600189036135e45773ffffffffffffffffffffffffffffffffffffffff81166352f0f3ad8a84613548367ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe81013560f01c90036034013590565b6040517fffffffff0000000000000000000000000000000000000000000000000000000060e086901b16815260048101939093526024830191909152604482015260206064820152608481018a905260a4015b6020604051808303816000875af11580156135ba573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906135de91906159d6565b5061155b565b600289036136105773ffffffffffffffffffffffffffffffffffffffff81166352f0f3ad8a8489613548565b6003890361363c5773ffffffffffffffffffffffffffffffffffffffff81166352f0f3ad8a8487613548565b600489036137585760006136826fffffffffffffffffffffffffffffffff85167f0000000000000000000000000000000000000000000000000000000000000004614a29565b60095461368f919061577e565b61369a90600161577e565b905073ffffffffffffffffffffffffffffffffffffffff82166352f0f3ad8b8560405160e084901b7fffffffff000000000000000000000000000000000000000000000000000000001681526004810192909252602482015260c084901b604482015260086064820152608481018b905260a4016020604051808303816000875af115801561372d573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061375191906159d6565b505061155b565b600589036137f1576040517f52f0f3ad000000000000000000000000000000000000000000000000000000008152600481018a9052602481018390527f000000000000000000000000000000000000000000000000000000000000038560c01b6044820152600860648201526084810188905273ffffffffffffffffffffffffffffffffffffffff8216906352f0f3ad9060a40161359b565b6040517fff137e6500000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b7f0000000000000000000000000000000000000000000000000000000000000000367ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe81013560f01c900360140135606061387c61188d565b9050909192565b600081600001518260200151836040015184606001516040516020016138c2949392919093845260208401929092526040830152606082015260800190565b604051602081830303815290604052805190602001209050919050565b6040805180820190915260008082526020820152815160000361392e576040517f5ab458fb00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b50604080518082019091528151815260209182019181019190915290565b6060600080600061395c85614ad7565b919450925090506001816001811115613977576139776153aa565b146139ae576040517f4b9c6abe00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b84516139ba838561577e565b146139f1576040517f5c5537b800000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b604080516020808252610420820190925290816020015b6040805180820190915260008082526020820152815260200190600190039081613a085790505093506000835b8651811015613af657600080613a7b6040518060400160405280858c60000151613a5f91906157ce565b8152602001858c60200151613a74919061577e565b9052614ad7565b509150915060405180604001604052808383613a97919061577e565b8152602001848b60200151613aac919061577e565b815250888581518110613ac157613ac1615720565b6020908102919091010152613ad760018561577e565b9350613ae3818361577e565b613aed908461577e565b92505050613a35565b50845250919392505050565b60606000806000613b1285614ad7565b919450925090506000816001811115613b2d57613b2d6153aa565b14613b64576040517f1ff9b2e400000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b613b6e828461577e565b855114613ba7576040517f5c5537b800000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b61188485602001518484614f75565b600281015473ffffffffffffffffffffffffffffffffffffffff8316600090815260036020526040812080546fffffffffffffffffffffffffffffffff90931692839290613c0590849061577e565b90915550506040517f7eee288d00000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff8481166004830152602482018390527f0000000000000000000000000c8b5822b6e02cda722174f19a1439a7495a3fa61690637eee288d90604401600060405180830381600087803b158015613c9a57600080fd5b505af1158015613cae573d6000803e3d6000fd5b50505050505050565b604051818152367ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe81013560f01c90038284820160208401378260208301016000815260208101604052505092915050565b6000613d286fffffffffffffffffffffffffffffffff8416600161591f565b90506000613d3882866001614453565b9050600086901a8380613e245750613d7160027f00000000000000000000000000000000000000000000000000000000000000046158e2565b6004830154600290613e15906fffffffffffffffffffffffffffffffff167e09010a0d15021d0b0e10121619031e080c141c0f111807131b17061a05041f7f07c4acdd0000000000000000000000000000000000000000000000000000000067ffffffffffffffff831160061b83811c63ffffffff1060051b1792831c600181901c17600281901c17600481901c17600881901c17601081901c170260fb1c1a1790565b613e1f9190615a12565b60ff16145b15613e7c5760ff811660011480613e3e575060ff81166002145b613e77576040517ff40239db0000000000000000000000000000000000000000000000000000000081526004810188905260240161261a565b613cae565b60ff811615613cae576040517ff40239db0000000000000000000000000000000000000000000000000000000081526004810188905260240161261a565b6fffffffffffffffffffffffffffffffff811160071b81811c67ffffffffffffffff1060061b1781811c63ffffffff1060051b1781811c61ffff1060041b1781811c60ff1060031b1760008213613f1957631615e6386000526004601cfd5b7ff8f9f9faf9fdfafbf9fdfcfdfafbfcfef9fafdfafcfcfbfefafafcfbffffffff6f8421084210842108cc6318c6db6d54be83831c1c601f161a1890811b609f90811c6c465772b2bbbb5f824b15207a3081018102606090811d6d0388eaa27412d5aca026815d636e018202811d6d0df99ac502031bf953eff472fdcc018202811d6d13cdffb29d51d99322bdff5f2211018202811d6d0a0f742023def783a307a986912e018202811d6d01920d8043ca89b5239253284e42018202811d6c0b7a86d7375468fac667a0a527016c29508e458543d8aa4df2abee7883018302821d6d0139601a2efabe717e604cbb4894018302821d6d02247f7a7b6594320649aa03aba1018302821d7fffffffffffffffffffffffffffffffffffffff73c0c716a594e00d54e3c4cbc9018302821d7ffffffffffffffffffffffffffffffffffffffdc7b88c420e53a9890533129f6f01830290911d7fffffffffffffffffffffffffffffffffffffff465fda27eb4d63ded474e5f832019091027ffffffffffffffff5f6af8f7b3396644f18e157960000000000000000000000000105711340daa0d5f769dba1915cef59f0815a5506029190037d0267a36c0c95b3975ab3ee5b203a7614a3f75373f047d803ae7b6687f2b302017d57115e47018c7177eebf7cd370a3356a1b7863008a5ae8028c72b88642840160ae1d90565b60007812725dd1d243aba0e75fe645cc4873f9e65afe688c928e1f218311670de0b6b3a76400000215820261415257637c5f487d6000526004601cfd5b50670de0b6b3a7640000919091020490565b6000816000190483118202156141825763bac65e5b6000526004601cfd5b50670de0b6b3a764000091020490565b60007ffffffffffffffffffffffffffffffffffffffffffffffffdc0d0570925a462d782136141c057919050565b680755bf798b4a1bf1e582126141de5763a37bfec96000526004601cfd5b6503782dace9d9604e83901b059150600060606bb17217f7d1cf79abc9e3b39884821b056b80000000000000000000000001901d6bb17217f7d1cf79abc9e3b39881029093037fffffffffffffffffffffffffffffffffffffffdbf3ccf1604d263450f02a550481018102606090811d6d0277594991cfc85f6e2461837cd9018202811d7fffffffffffffffffffffffffffffffffffffe5adedaa1cb095af9e4da10e363c018202811d6db1bbb201f443cf962f1a1d3db4a5018202811d7ffffffffffffffffffffffffffffffffffffd38dc772608b0ae56cce01296c0eb018202811d6e05180bb14799ab47a8a8cb2a527d57016d02d16720577bd19bf614176fe9ea6c10fe68e7fd37d0007b713f765084018402831d9081019084017ffffffffffffffffffffffffffffffffffffffe2c69812cf03b0763fd454a8f7e010290911d6e0587f503bb6ea29d25fcb7401964500190910279d835ebba824c98fb31b83b2ca45c000000000000000000000000010574029d9dc38563c32e5c2f6dc192ee70ef65f9978af30260c3939093039290921c92915050565b60006143ab670de0b6b3a76400008361439286613eba565b61439c9190615a51565b6143a69190615b0d565b614192565b90505b92915050565b600080614441837e09010a0d15021d0b0e10121619031e080c141c0f111807131b17061a05041f7f07c4acdd0000000000000000000000000000000000000000000000000000000067ffffffffffffffff831160061b83811c63ffffffff1060051b1792831c600181901c17600281901c17600481901c17600881901c17601081901c170260fb1c1a1790565b600160ff919091161b90920392915050565b6000808261449c576144976fffffffffffffffffffffffffffffffff86167f000000000000000000000000000000000000000000000000000000000000000461500a565b6144b7565b6144b7856fffffffffffffffffffffffffffffffff16615196565b9050600284815481106144cc576144cc615720565b906000526020600020906005020191505b60048201546fffffffffffffffffffffffffffffffff82811691161461452f57815460028054909163ffffffff1690811061451a5761451a615720565b906000526020600020906005020191506144dd565b509392505050565b600080600080600061454886614566565b935093509350935061455c8484848461496f565b9695505050505050565b600080600080600085905060006002828154811061458657614586615720565b600091825260209091206004600590920201908101549091507f00000000000000000000000000000000000000000000000000000000000000049061465d906fffffffffffffffffffffffffffffffff167e09010a0d15021d0b0e10121619031e080c141c0f111807131b17061a05041f7f07c4acdd0000000000000000000000000000000000000000000000000000000067ffffffffffffffff831160061b83811c63ffffffff1060051b1792831c600181901c17600281901c17600481901c17600881901c17601081901c170260fb1c1a1790565b60ff1611614697576040517fb34b5c2200000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6000815b60048301547f00000000000000000000000000000000000000000000000000000000000000049061475e906fffffffffffffffffffffffffffffffff167e09010a0d15021d0b0e10121619031e080c141c0f111807131b17061a05041f7f07c4acdd0000000000000000000000000000000000000000000000000000000067ffffffffffffffff831160061b83811c63ffffffff1060051b1792831c600181901c17600281901c17600481901c17600881901c17601081901c170260fb1c1a1790565b60ff1692508211156147d357825463ffffffff1661479d7f0000000000000000000000000000000000000000000000000000000000000004600161577e565b83036147a7578391505b600281815481106147ba576147ba615720565b906000526020600020906005020193508094505061469b565b600481810154908401546fffffffffffffffffffffffffffffffff91821691166000816fffffffffffffffffffffffffffffffff1661483c614827856fffffffffffffffffffffffffffffffff1660011c90565b6fffffffffffffffffffffffffffffffff1690565b6fffffffffffffffffffffffffffffffff16149050801561490b576000614874836fffffffffffffffffffffffffffffffff166143b4565b6fffffffffffffffffffffffffffffffff1611156148df5760006148b66148ae60016fffffffffffffffffffffffffffffffff86166158f6565b896001614453565b6003810154600490910154909c506fffffffffffffffffffffffffffffffff169a506148e59050565b6008549a505b600386015460048701549099506fffffffffffffffffffffffffffffffff169750614961565b600061492d6148ae6fffffffffffffffffffffffffffffffff8516600161591f565b6003808901546004808b015492840154930154909e506fffffffffffffffffffffffffffffffff9182169d50919b50169850505b505050505050509193509193565b60006fffffffffffffffffffffffffffffffff8416156149dc5760408051602081018790526fffffffffffffffffffffffffffffffff8087169282019290925260608101859052908316608082015260a00160405160208183030381529060405280519060200120611884565b8282604051602001614a0a9291909182526fffffffffffffffffffffffffffffffff16602082015260400190565b6040516020818303038152906040528051906020012095945050505050565b600080614ab6847e09010a0d15021d0b0e10121619031e080c141c0f111807131b17061a05041f7f07c4acdd0000000000000000000000000000000000000000000000000000000067ffffffffffffffff831160061b83811c63ffffffff1060051b1792831c600181901c17600281901c17600481901c17600881901c17601081901c170260fb1c1a1790565b60ff1690508083036001841b600180831b0386831b17039250505092915050565b60008060008360000151600003614b1a576040517f5ab458fb00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6020840151805160001a607f8111614b3f576000600160009450945094505050614f6e565b60b78111614c55576000614b546080836157ce565b905080876000015111614b93576040517f66c9448500000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6001838101517fff00000000000000000000000000000000000000000000000000000000000000169082148015614c0b57507f80000000000000000000000000000000000000000000000000000000000000007fff000000000000000000000000000000000000000000000000000000000000008216105b15614c42576040517fbabb01dd00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b5060019550935060009250614f6e915050565b60bf8111614db3576000614c6a60b7836157ce565b905080876000015111614ca9576040517f66c9448500000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b60018301517fff00000000000000000000000000000000000000000000000000000000000000166000819003614d0b576040517fbabb01dd00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b600184015160088302610100031c60378111614d53576040517fbabb01dd00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b614d5d818461577e565b895111614d96576040517f66c9448500000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b614da183600161577e565b9750955060009450614f6e9350505050565b60f78111614e18576000614dc860c0836157ce565b905080876000015111614e07576040517f66c9448500000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b600195509350849250614f6e915050565b6000614e2560f7836157ce565b905080876000015111614e64576040517f66c9448500000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b60018301517fff00000000000000000000000000000000000000000000000000000000000000166000819003614ec6576040517fbabb01dd00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b600184015160088302610100031c60378111614f0e576040517fbabb01dd00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b614f18818461577e565b895111614f51576040517f66c9448500000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b614f5c83600161577e565b9750955060019450614f6e9350505050565b9193909250565b60608167ffffffffffffffff811115614f9057614f90615654565b6040519080825280601f01601f191660200182016040528015614fba576020820181803683370190505b5090508115615003576000614fcf848661577e565b90506020820160005b84811015614ff0578281015182820152602001614fd8565b84811115614fff576000858301525b5050505b9392505050565b6000816150a9846fffffffffffffffffffffffffffffffff167e09010a0d15021d0b0e10121619031e080c141c0f111807131b17061a05041f7f07c4acdd0000000000000000000000000000000000000000000000000000000067ffffffffffffffff831160061b83811c63ffffffff1060051b1792831c600181901c17600281901c17600481901c17600881901c17601081901c170260fb1c1a1790565b60ff16116150bf5763b34b5c226000526004601cfd5b6150c883615196565b905081615167826fffffffffffffffffffffffffffffffff167e09010a0d15021d0b0e10121619031e080c141c0f111807131b17061a05041f7f07c4acdd0000000000000000000000000000000000000000000000000000000067ffffffffffffffff831160061b83811c63ffffffff1060051b1792831c600181901c17600281901c17600481901c17600881901c17601081901c170260fb1c1a1790565b60ff16116143ae576143ab61517d83600161577e565b6fffffffffffffffffffffffffffffffff83169061523b565b6000811960018301168161522a827e09010a0d15021d0b0e10121619031e080c141c0f111807131b17061a05041f7f07c4acdd0000000000000000000000000000000000000000000000000000000067ffffffffffffffff831160061b83811c63ffffffff1060051b1792831c600181901c17600281901c17600481901c17600881901c17601081901c170260fb1c1a1790565b60ff169390931c8015179392505050565b6000806152c8847e09010a0d15021d0b0e10121619031e080c141c0f111807131b17061a05041f7f07c4acdd0000000000000000000000000000000000000000000000000000000067ffffffffffffffff831160061b83811c63ffffffff1060051b1792831c600181901c17600281901c17600481901c17600881901c17601081901c170260fb1c1a1790565b60ff169050808303600180821b0385821b179250505092915050565b60008083601f8401126152f657600080fd5b50813567ffffffffffffffff81111561530e57600080fd5b60208301915083602082850101111561532657600080fd5b9250929050565b600080600083850360a081121561534357600080fd5b608081121561535157600080fd5b50839250608084013567ffffffffffffffff81111561536f57600080fd5b61537b868287016152e4565b9497909650939450505050565b6000806040838503121561539b57600080fd5b50508035926020909101359150565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602160045260246000fd5b6020810160038310615414577f4e487b7100000000000000000000000000000000000000000000000000000000600052602160045260246000fd5b91905290565b60008060006060848603121561542f57600080fd5b505081359360208301359350604090920135919050565b6000815180845260005b8181101561546c57602081850181015186830182015201615450565b8181111561547e576000602083870101525b50601f017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0169290920160200192915050565b6020815260006143ab6020830184615446565b6000602082840312156154d657600080fd5b5035919050565b73ffffffffffffffffffffffffffffffffffffffff811681146154ff57600080fd5b50565b60006020828403121561551457600080fd5b8135615003816154dd565b8035801515811461552f57600080fd5b919050565b6000806000806080858703121561554a57600080fd5b8435935060208501359250604085013591506155686060860161551f565b905092959194509250565b60006020828403121561558557600080fd5b81356fffffffffffffffffffffffffffffffff8116811461500357600080fd5b600080600080600080608087890312156155be57600080fd5b863595506155ce6020880161551f565b9450604087013567ffffffffffffffff808211156155eb57600080fd5b6155f78a838b016152e4565b9096509450606089013591508082111561561057600080fd5b5061561d89828a016152e4565b979a9699509497509295939492505050565b63ffffffff841681528260208201526060604082015260006118846060830184615446565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b60006080828403121561569557600080fd5b6040516080810181811067ffffffffffffffff821117156156df577f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b8060405250823581526020830135602082015260408301356040820152606083013560608201528091505092915050565b8183823760009101908152919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b600082198211156157915761579161574f565b500190565b60007fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff82036157c7576157c761574f565b5060010190565b6000828210156157e0576157e061574f565b500390565b600067ffffffffffffffff838116908316818110156158065761580661574f565b039392505050565b600067ffffffffffffffff808316818516818304811182151516156158355761583561574f565b02949350505050565b6000806040838503121561585157600080fd5b505080516020909101519092909150565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601260045260246000fd5b6000826158a0576158a0615862565b500490565b6000817fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff04831182151516156158dd576158dd61574f565b500290565b6000826158f1576158f1615862565b500690565b60006fffffffffffffffffffffffffffffffff838116908316818110156158065761580661574f565b60006fffffffffffffffffffffffffffffffff80831681851680830382111561594a5761594a61574f565b01949350505050565b8183528181602085013750600060208284010152600060207fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0601f840116840101905092915050565b6060815260006159b0606083018789615953565b82810360208401526159c3818688615953565b9150508260408301529695505050505050565b6000602082840312156159e857600080fd5b5051919050565b600060ff821660ff841680821015615a0957615a0961574f565b90039392505050565b600060ff831680615a2557615a25615862565b8060ff84160691505092915050565b600060208284031215615a4657600080fd5b8151615003816154dd565b60007f7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff600084136000841385830485118282161615615a9257615a9261574f565b7f80000000000000000000000000000000000000000000000000000000000000006000871286820588128184161615615acd57615acd61574f565b60008712925087820587128484161615615ae957615ae961574f565b87850587128184161615615aff57615aff61574f565b505050929093029392505050565b600082615b1c57615b1c615862565b7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff83147f800000000000000000000000000000000000000000000000000000000000000083141615615b7057615b7061574f565b50059056fea164736f6c634300080f000a"; - bytes internal constant acc28Code = - hex"6080604052600436106103085760003560e01c806370872aa51161019a578063c6f0308c116100e1578063ec5e63081161008a578063fa24f74311610064578063fa24f74314610b94578063fa315aa914610bb8578063fe2bbeb214610beb57600080fd5b8063ec5e630814610b11578063eff0f59214610b44578063f8f43ff614610b7457600080fd5b8063d6ae3cd5116100bb578063d6ae3cd514610a8b578063d8cc1a3c14610abe578063dabd396d14610ade57600080fd5b8063c6f0308c146109b3578063cf09e0d014610a3d578063d5d44d8014610a5e57600080fd5b8063a445ece611610143578063bcef3b551161011d578063bcef3b5514610933578063bd8da95614610973578063c395e1ca1461099357600080fd5b8063a445ece6146107f3578063a8e4fb90146108bf578063bbdc02db146108f257600080fd5b80638980e0cc116101745780638980e0cc1461076b5780638b85902b146107805780638d450a95146107c057600080fd5b806370872aa51461073b5780637b0f0adc146107505780638129fc1c1461076357600080fd5b80633fc8cef31161025e5780635c0cba33116102075780636361506d116101e15780636361506d146106b55780636b6716c0146106f55780636f0344091461072857600080fd5b80635c0cba331461064d578063609d33341461068057806360e274641461069557600080fd5b806354fd4d501161023857806354fd4d50146105a757806357da950e146105fd5780635a5fa2d91461062d57600080fd5b80633fc8cef31461052e578063472777c614610561578063534db0e21461057457600080fd5b80632810e1d6116102c057806337b1b2291161029a57806337b1b2291461047b5780633a768463146104bb5780633e3ac912146104ee57600080fd5b80632810e1d6146103f45780632ad69aeb1461040957806330dbe5701461042957600080fd5b806319effeb4116102f157806319effeb41461034f578063200d2ed21461039a57806325fc2ace146103d557600080fd5b8063019351301461030d57806303c2924d1461032f575b600080fd5b34801561031957600080fd5b5061032d6103283660046155a8565b610c1b565b005b34801561033b57600080fd5b5061032d61034a366004615603565b610f3c565b34801561035b57600080fd5b5060005461037c9068010000000000000000900467ffffffffffffffff1681565b60405167ffffffffffffffff90911681526020015b60405180910390f35b3480156103a657600080fd5b506000546103c890700100000000000000000000000000000000900460ff1681565b6040516103919190615654565b3480156103e157600080fd5b506008545b604051908152602001610391565b34801561040057600080fd5b506103c86115e2565b34801561041557600080fd5b506103e6610424366004615603565b611887565b34801561043557600080fd5b506001546104569073ffffffffffffffffffffffffffffffffffffffff1681565b60405173ffffffffffffffffffffffffffffffffffffffff9091168152602001610391565b34801561048757600080fd5b50367ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe81013560f01c90033560601c610456565b3480156104c757600080fd5b507f000000000000000000000000f698388bfcdbd3f9f2f13ebc3e01471b3cc7ce83610456565b3480156104fa57600080fd5b5060005461051e907201000000000000000000000000000000000000900460ff1681565b6040519015158152602001610391565b34801561053a57600080fd5b507f0000000000000000000000000c8b5822b6e02cda722174f19a1439a7495a3fa6610456565b61032d61056f366004615695565b6118bd565b34801561058057600080fd5b507f0000000000000000000000006925b8704ff96dee942623d6fb5e946ef5884b63610456565b3480156105b357600080fd5b506105f06040518060400160405280600581526020017f312e322e3000000000000000000000000000000000000000000000000000000081525081565b604051610391919061572c565b34801561060957600080fd5b50600854600954610618919082565b60408051928352602083019190915201610391565b34801561063957600080fd5b506103e661064836600461573f565b6118cf565b34801561065957600080fd5b507f0000000000000000000000001c23a6d89f95ef3148bcda8e242cab145bf9c0e4610456565b34801561068c57600080fd5b506105f0611909565b3480156106a157600080fd5b5061032d6106b036600461577d565b611917565b3480156106c157600080fd5b50367ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe81013560f01c9003603401356103e6565b34801561070157600080fd5b507f000000000000000000000000000000000000000000000000000000000000000061037c565b61032d6107363660046157af565b611abe565b34801561074757600080fd5b506009546103e6565b61032d61075e366004615695565b611b7f565b61032d611b8c565b34801561077757600080fd5b506002546103e6565b34801561078c57600080fd5b50367ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe81013560f01c9003605401356103e6565b3480156107cc57600080fd5b507f00000000000000000000000000000000000000000000000000000000000000006103e6565b3480156107ff57600080fd5b5061086b61080e36600461573f565b6007602052600090815260409020805460019091015460ff821691610100810463ffffffff1691650100000000009091046fffffffffffffffffffffffffffffffff169073ffffffffffffffffffffffffffffffffffffffff1684565b60408051941515855263ffffffff90931660208501526fffffffffffffffffffffffffffffffff9091169183019190915273ffffffffffffffffffffffffffffffffffffffff166060820152608001610391565b3480156108cb57600080fd5b507f00000000000000000000000070997970c51812dc3a010c7d01b50e0d17dc79c8610456565b3480156108fe57600080fd5b5060405163ffffffff7f0000000000000000000000000000000000000000000000000000000000000001168152602001610391565b34801561093f57600080fd5b50367ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe81013560f01c9003601401356103e6565b34801561097f57600080fd5b5061037c61098e36600461573f565b611c05565b34801561099f57600080fd5b506103e66109ae3660046157ee565b611de4565b3480156109bf57600080fd5b506109d36109ce36600461573f565b611fc7565b6040805163ffffffff909816885273ffffffffffffffffffffffffffffffffffffffff968716602089015295909416948601949094526fffffffffffffffffffffffffffffffff9182166060860152608085015291821660a08401521660c082015260e001610391565b348015610a4957600080fd5b5060005461037c9067ffffffffffffffff1681565b348015610a6a57600080fd5b506103e6610a7936600461577d565b60036020526000908152604090205481565b348015610a9757600080fd5b507f00000000000000000000000000000000000000000000000000000000000003856103e6565b348015610aca57600080fd5b5061032d610ad9366004615820565b61205e565b348015610aea57600080fd5b507f00000000000000000000000000000000000000000000000000000000000004b061037c565b348015610b1d57600080fd5b507f00000000000000000000000000000000000000000000000000000000000000046103e6565b348015610b5057600080fd5b5061051e610b5f36600461573f565b60046020526000908152604090205460ff1681565b348015610b8057600080fd5b5061032d610b8f366004615695565b612123565b348015610ba057600080fd5b50610ba9612575565b604051610391939291906158aa565b348015610bc457600080fd5b507f00000000000000000000000000000000000000000000000000000000000000086103e6565b348015610bf757600080fd5b5061051e610c0636600461573f565b60066020526000908152604090205460ff1681565b60008054700100000000000000000000000000000000900460ff166002811115610c4757610c47615625565b14610c7e576040517f67fe195000000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6000547201000000000000000000000000000000000000900460ff1615610cd1576040517f0ea2e75200000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b610d08367ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe81013560f01c90036014013590565b90565b610d1f610d1a368690038601866158fe565b6125d5565b14610d56576040517f9cc00b5b00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b82606001358282604051610d6b92919061598b565b604051809103902014610daa576040517fd81d583b00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6000610df3610dee84848080601f01602080910402602001604051908101604052809392919081815260200183838082843760009201919091525061263192505050565b61269e565b90506000610e1a82600881518110610e0d57610e0d61599b565b6020026020010151612854565b9050602081511115610e58576040517fd81d583b00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b602081810151825190910360031b1c367ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe81013560f01c9003605401358103610ecd576040517fb8ed883000000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b5050600180547fffffffffffffffffffffffff000000000000000000000000000000000000000016331790555050600080547fffffffffffffffffffffffffff00ffffffffffffffffffffffffffffffffffff1672010000000000000000000000000000000000001790555050565b60008054700100000000000000000000000000000000900460ff166002811115610f6857610f68615625565b14610f9f576040517f67fe195000000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b600060028381548110610fb457610fb461599b565b906000526020600020906005020190506000610fcf84611c05565b905067ffffffffffffffff7f00000000000000000000000000000000000000000000000000000000000004b081169082161015611038576040517ff2440b5300000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b60008481526006602052604090205460ff1615611081576040517ff1a9458100000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b600084815260056020526040902080548015801561109e57508515155b15611139578354640100000000900473ffffffffffffffffffffffffffffffffffffffff16600081156110d157816110ed565b600186015473ffffffffffffffffffffffffffffffffffffffff165b90506110f98187612908565b50505060009485525050600660205250506040902080547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00166001179055565b6000868152600760209081526040918290208251608081018452815460ff81161515808352610100820463ffffffff16948301949094526501000000000090046fffffffffffffffffffffffffffffffff16938101939093526001015473ffffffffffffffffffffffffffffffffffffffff1660608301526111dc576fffffffffffffffffffffffffffffffff60408201526001815260008690036111dc578195505b600086826020015163ffffffff166111f491906159f9565b905060008382116112055781611207565b835b602084015190915063ffffffff165b818110156113535760008682815481106112325761123261599b565b6000918252602080832090910154808352600690915260409091205490915060ff1661128a576040517f9a07664600000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b60006002828154811061129f5761129f61599b565b600091825260209091206005909102018054909150640100000000900473ffffffffffffffffffffffffffffffffffffffff161580156112fc5750600481015460408701516fffffffffffffffffffffffffffffffff9182169116115b1561133e57600181015473ffffffffffffffffffffffffffffffffffffffff16606087015260048101546fffffffffffffffffffffffffffffffff1660408701525b5050808061134b90615a11565b915050611216565b5063ffffffff818116602085810191825260008c81526007909152604090819020865181549351928801517fffffffffffffffffffffffffffffffffffffffffffffffffffffff00000000009094169015157fffffffffffffffffffffffffffffffffffffffffffffffffffffff00000000ff161761010092909416918202939093177fffffffffffffffffffffff00000000000000000000000000000000ffffffffff16650100000000006fffffffffffffffffffffffffffffffff909316929092029190911782556060850151600190920180547fffffffffffffffffffffffff00000000000000000000000000000000000000001673ffffffffffffffffffffffffffffffffffffffff909316929092179091558490036115d757606083015160008a815260066020526040902080547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00166001179055891580156114d357506000547201000000000000000000000000000000000000900460ff165b156115485760015473ffffffffffffffffffffffffffffffffffffffff166114fb818a612908565b885473ffffffffffffffffffffffffffffffffffffffff909116640100000000027fffffffffffffffff0000000000000000000000000000000000000000ffffffff9091161788556115d5565b61158f73ffffffffffffffffffffffffffffffffffffffff82161561156d5781611589565b600189015473ffffffffffffffffffffffffffffffffffffffff165b89612908565b87547fffffffffffffffff0000000000000000000000000000000000000000ffffffff1664010000000073ffffffffffffffffffffffffffffffffffffffff8316021788555b505b505050505050505050565b600080600054700100000000000000000000000000000000900460ff16600281111561161057611610615625565b14611647576040517f67fe195000000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6000805260066020527f54cdd369e4e8a8515e52ca72ec816c2101831ad1f18bf44102ed171459c9b4f85460ff166116ab576040517f9a07664600000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff1660026000815481106116d7576116d761599b565b6000918252602090912060059091020154640100000000900473ffffffffffffffffffffffffffffffffffffffff1614611712576001611715565b60025b6000805467ffffffffffffffff421668010000000000000000027fffffffffffffffffffffffffffffffff0000000000000000ffffffffffffffff82168117835592935083927fffffffffffffffffffffffffffffff00ffffffffffffffffffffffffffffffff167fffffffffffffffffffffffffffffff000000000000000000ffffffffffffffff909116177001000000000000000000000000000000008360028111156117c6576117c6615625565b0217905560028111156117db576117db615625565b6040517f5e186f09b9c93491f14e277eea7faa5de6a2d4bda75a79af7a3684fbfb42da6090600090a27f0000000000000000000000001c23a6d89f95ef3148bcda8e242cab145bf9c0e473ffffffffffffffffffffffffffffffffffffffff1663838c2d1e6040518163ffffffff1660e01b8152600401600060405180830381600087803b15801561186c57600080fd5b505af1158015611880573d6000803e3d6000fd5b5050505090565b600560205281600052604060002081815481106118a357600080fd5b90600052602060002001600091509150505481565b905090565b6118ca8383836001611abe565b505050565b6000818152600760209081526040808320600590925282208054825461190090610100900463ffffffff1682615a49565b95945050505050565b60606118b860546020612a09565b73ffffffffffffffffffffffffffffffffffffffff811660009081526003602052604081208054908290559081900361197c576040517f17bfe5f700000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6040517ff3fef3a300000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff8381166004830152602482018390527f0000000000000000000000000c8b5822b6e02cda722174f19a1439a7495a3fa6169063f3fef3a390604401600060405180830381600087803b158015611a0c57600080fd5b505af1158015611a20573d6000803e3d6000fd5b5050505060008273ffffffffffffffffffffffffffffffffffffffff168260405160006040518083038185875af1925050503d8060008114611a7e576040519150601f19603f3d011682016040523d82523d6000602084013e611a83565b606091505b50509050806118ca576040517f83e6cc6b00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b3373ffffffffffffffffffffffffffffffffffffffff7f00000000000000000000000070997970c51812dc3a010c7d01b50e0d17dc79c8161480611b3757503373ffffffffffffffffffffffffffffffffffffffff7f0000000000000000000000006925b8704ff96dee942623d6fb5e946ef5884b6316145b611b6d576040517fd386ef3e00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b611b7984848484612a5b565b50505050565b6118ca8383836000611abe565b3273ffffffffffffffffffffffffffffffffffffffff7f00000000000000000000000070997970c51812dc3a010c7d01b50e0d17dc79c81614611bfb576040517fd386ef3e00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b611c036133fc565b565b600080600054700100000000000000000000000000000000900460ff166002811115611c3357611c33615625565b14611c6a576040517f67fe195000000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b600060028381548110611c7f57611c7f61599b565b600091825260208220600590910201805490925063ffffffff90811614611cee57815460028054909163ffffffff16908110611cbd57611cbd61599b565b906000526020600020906005020160040160109054906101000a90046fffffffffffffffffffffffffffffffff1690505b6004820154600090611d2690700100000000000000000000000000000000900467ffffffffffffffff165b67ffffffffffffffff1690565b611d3a9067ffffffffffffffff1642615a49565b611d59611d19846fffffffffffffffffffffffffffffffff1660401c90565b67ffffffffffffffff16611d6d91906159f9565b905067ffffffffffffffff7f00000000000000000000000000000000000000000000000000000000000004b01667ffffffffffffffff168167ffffffffffffffff1611611dba5780611900565b7f00000000000000000000000000000000000000000000000000000000000004b095945050505050565b600080611e83836fffffffffffffffffffffffffffffffff167e09010a0d15021d0b0e10121619031e080c141c0f111807131b17061a05041f7f07c4acdd0000000000000000000000000000000000000000000000000000000067ffffffffffffffff831160061b83811c63ffffffff1060051b1792831c600181901c17600281901c17600481901c17600881901c17601081901c170260fb1c1a1790565b60ff1690507f0000000000000000000000000000000000000000000000000000000000000008811115611ee2576040517f56f57b2b00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b642e90edd00062061a806311e1a3006000611efd8383615a8f565b9050670de0b6b3a76400006000611f34827f0000000000000000000000000000000000000000000000000000000000000008615aa3565b90506000611f52611f4d670de0b6b3a764000086615aa3565b613955565b90506000611f608484613bb0565b90506000611f6e8383613bff565b90506000611f7b82613c2d565b90506000611f9a82611f95670de0b6b3a76400008f615aa3565b613e15565b90506000611fa88b83613bff565b9050611fb4818d615aa3565b9f9e505050505050505050505050505050565b60028181548110611fd757600080fd5b60009182526020909120600590910201805460018201546002830154600384015460049094015463ffffffff8416955064010000000090930473ffffffffffffffffffffffffffffffffffffffff908116949216926fffffffffffffffffffffffffffffffff91821692918082169170010000000000000000000000000000000090041687565b3373ffffffffffffffffffffffffffffffffffffffff7f00000000000000000000000070997970c51812dc3a010c7d01b50e0d17dc79c81614806120d757503373ffffffffffffffffffffffffffffffffffffffff7f0000000000000000000000006925b8704ff96dee942623d6fb5e946ef5884b6316145b61210d576040517fd386ef3e00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b61211b868686868686613e4f565b505050505050565b60008054700100000000000000000000000000000000900460ff16600281111561214f5761214f615625565b14612186576040517f67fe195000000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6000806000806121958661447e565b935093509350935060006121ab85858585614887565b905060007f000000000000000000000000f698388bfcdbd3f9f2f13ebc3e01471b3cc7ce8373ffffffffffffffffffffffffffffffffffffffff16637dc0d1d06040518163ffffffff1660e01b8152600401602060405180830381865afa15801561221a573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061223e9190615ae0565b9050600189036123365773ffffffffffffffffffffffffffffffffffffffff81166352f0f3ad8a8461229a367ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe81013560f01c90036034013590565b6040517fffffffff0000000000000000000000000000000000000000000000000000000060e086901b16815260048101939093526024830191909152604482015260206064820152608481018a905260a4015b6020604051808303816000875af115801561230c573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906123309190615afd565b506115d7565b600289036123625773ffffffffffffffffffffffffffffffffffffffff81166352f0f3ad8a848961229a565b6003890361238e5773ffffffffffffffffffffffffffffffffffffffff81166352f0f3ad8a848761229a565b600489036124aa5760006123d46fffffffffffffffffffffffffffffffff85167f0000000000000000000000000000000000000000000000000000000000000004614941565b6009546123e191906159f9565b6123ec9060016159f9565b905073ffffffffffffffffffffffffffffffffffffffff82166352f0f3ad8b8560405160e084901b7fffffffff000000000000000000000000000000000000000000000000000000001681526004810192909252602482015260c084901b604482015260086064820152608481018b905260a4016020604051808303816000875af115801561247f573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906124a39190615afd565b50506115d7565b60058903612543576040517f52f0f3ad000000000000000000000000000000000000000000000000000000008152600481018a9052602481018390527f000000000000000000000000000000000000000000000000000000000000038560c01b6044820152600860648201526084810188905273ffffffffffffffffffffffffffffffffffffffff8216906352f0f3ad9060a4016122ed565b6040517fff137e6500000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b7f0000000000000000000000000000000000000000000000000000000000000001367ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe81013560f01c90036014013560606125ce611909565b9050909192565b60008160000151826020015183604001518460600151604051602001612614949392919093845260208401929092526040830152606082015260800190565b604051602081830303815290604052805190602001209050919050565b60408051808201909152600080825260208201528151600003612680576040517f5ab458fb00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b50604080518082019091528151815260209182019181019190915290565b606060008060006126ae856149ef565b9194509250905060018160018111156126c9576126c9615625565b14612700576040517f4b9c6abe00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b845161270c83856159f9565b14612743576040517f5c5537b800000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b604080516020808252610420820190925290816020015b604080518082019091526000808252602082015281526020019060019003908161275a5790505093506000835b8651811015612848576000806127cd6040518060400160405280858c600001516127b19190615a49565b8152602001858c602001516127c691906159f9565b90526149ef565b5091509150604051806040016040528083836127e991906159f9565b8152602001848b602001516127fe91906159f9565b8152508885815181106128135761281361599b565b60209081029190910101526128296001856159f9565b935061283581836159f9565b61283f90846159f9565b92505050612787565b50845250919392505050565b60606000806000612864856149ef565b91945092509050600081600181111561287f5761287f615625565b146128b6576040517f1ff9b2e400000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6128c082846159f9565b8551146128f9576040517f5c5537b800000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b61190085602001518484614e8d565b600281015473ffffffffffffffffffffffffffffffffffffffff8316600090815260036020526040812080546fffffffffffffffffffffffffffffffff909316928392906129579084906159f9565b90915550506040517f7eee288d00000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff8481166004830152602482018390527f0000000000000000000000000c8b5822b6e02cda722174f19a1439a7495a3fa61690637eee288d90604401600060405180830381600087803b1580156129ec57600080fd5b505af1158015612a00573d6000803e3d6000fd5b50505050505050565b604051818152367ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe81013560f01c90038284820160208401378260208301016000815260208101604052505092915050565b60008054700100000000000000000000000000000000900460ff166002811115612a8757612a87615625565b14612abe576040517f67fe195000000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b600060028481548110612ad357612ad361599b565b60009182526020918290206040805160e0810182526005909302909101805463ffffffff8116845273ffffffffffffffffffffffffffffffffffffffff64010000000090910481169484019490945260018101549093169082015260028201546fffffffffffffffffffffffffffffffff908116606083015260038301546080830181905260049093015480821660a084015270010000000000000000000000000000000090041660c082015291508514612bba576040517f3014033200000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b60a0810151600083156fffffffffffffffffffffffffffffffff83161760011b90506000612c7a826fffffffffffffffffffffffffffffffff167e09010a0d15021d0b0e10121619031e080c141c0f111807131b17061a05041f7f07c4acdd0000000000000000000000000000000000000000000000000000000067ffffffffffffffff831160061b83811c63ffffffff1060051b1792831c600181901c17600281901c17600481901c17600881901c17601081901c170260fb1c1a1790565b60ff169050861580612cb55750612cb27f000000000000000000000000000000000000000000000000000000000000000460026159f9565b81145b8015612cbf575084155b15612cf6576040517fa42637bc00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6000547201000000000000000000000000000000000000900460ff168015612d1c575086155b15612d53576040517f0ea2e75200000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b7f0000000000000000000000000000000000000000000000000000000000000008811115612dad576040517f56f57b2b00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b612dd87f000000000000000000000000000000000000000000000000000000000000000460016159f9565b8103612dea57612dea86888588614f22565b34612df483611de4565b14612e2b576040517f8620aa1900000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6000612e3688611c05565b905067ffffffffffffffff7f00000000000000000000000000000000000000000000000000000000000004b0811690821603612e9e576040517f3381d11400000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b67ffffffffffffffff7f00000000000000000000000000000000000000000000000000000000000000001667ffffffffffffffff7f00000000000000000000000000000000000000000000000000000000000004b016612efe9190615b16565b67ffffffffffffffff16612f198267ffffffffffffffff1690565b67ffffffffffffffff161115612ffb576000612f5660017f0000000000000000000000000000000000000000000000000000000000000004615a49565b8314612f8c5767ffffffffffffffff7f000000000000000000000000000000000000000000000000000000000000000016612fc1565b612fc17f000000000000000000000000000000000000000000000000000000000000000067ffffffffffffffff166002615b3f565b9050612ff7817f00000000000000000000000000000000000000000000000000000000000004b067ffffffffffffffff16615b16565b9150505b6000604082901b42176000898152608086901b6fffffffffffffffffffffffffffffffff8c1617602052604081209192509060008181526004602052604090205490915060ff1615613079576040517f80497e3b00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b60016004600083815260200190815260200160002060006101000a81548160ff02191690831515021790555060026040518060e001604052808c63ffffffff168152602001600073ffffffffffffffffffffffffffffffffffffffff1681526020013373ffffffffffffffffffffffffffffffffffffffff168152602001346fffffffffffffffffffffffffffffffff1681526020018b8152602001876fffffffffffffffffffffffffffffffff168152602001846fffffffffffffffffffffffffffffffff16815250908060018154018082558091505060019003906000526020600020906005020160009091909190915060008201518160000160006101000a81548163ffffffff021916908363ffffffff16021790555060208201518160000160046101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555060408201518160010160006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555060608201518160020160006101000a8154816fffffffffffffffffffffffffffffffff02191690836fffffffffffffffffffffffffffffffff1602179055506080820151816003015560a08201518160040160006101000a8154816fffffffffffffffffffffffffffffffff02191690836fffffffffffffffffffffffffffffffff16021790555060c08201518160040160106101000a8154816fffffffffffffffffffffffffffffffff02191690836fffffffffffffffffffffffffffffffff1602179055505050600560008b8152602001908152602001600020600160028054905061330f9190615a49565b81546001810183556000928352602083200155604080517fd0e30db0000000000000000000000000000000000000000000000000000000008152905173ffffffffffffffffffffffffffffffffffffffff7f0000000000000000000000000c8b5822b6e02cda722174f19a1439a7495a3fa6169263d0e30db09234926004808301939282900301818588803b1580156133a757600080fd5b505af11580156133bb573d6000803e3d6000fd5b50506040513393508c92508d91507f9b3245740ec3b155098a55be84957a4da13eaf7f14a8bc6f53126c0b9350f2be90600090a45050505050505050505050565b60005471010000000000000000000000000000000000900460ff161561344e576040517f0dc149f000000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6040517f7258a80700000000000000000000000000000000000000000000000000000000815263ffffffff7f0000000000000000000000000000000000000000000000000000000000000001166004820152600090819073ffffffffffffffffffffffffffffffffffffffff7f0000000000000000000000001c23a6d89f95ef3148bcda8e242cab145bf9c0e41690637258a807906024016040805180830381865afa158015613502573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906135269190615b6f565b909250905081613562576040517f6a6bc3b200000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b604080518082019091528281526020018190526008829055600981905536607a1461359557639824bdab6000526004601cfd5b80367ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe81013560f01c9003605401351161362f576040517ff40239db000000000000000000000000000000000000000000000000000000008152367ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe81013560f01c90036014013560048201526024015b60405180910390fd5b6040805160e08101825263ffffffff8082526000602083018181527ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe369081013560f01c90038035606090811c868801908152346fffffffffffffffffffffffffffffffff81811693890193845260149094013560808901908152600160a08a0181815242871660c08c019081526002805493840181558a529a5160059092027f405787fa12a823e0f2b7631cc41b3ba8828b3321ca811111fa75cd3aa3bb5ace81018054995173ffffffffffffffffffffffffffffffffffffffff908116640100000000027fffffffffffffffff000000000000000000000000000000000000000000000000909b1694909c16939093179890981790915592517f405787fa12a823e0f2b7631cc41b3ba8828b3321ca811111fa75cd3aa3bb5acf87018054918a167fffffffffffffffffffffffff000000000000000000000000000000000000000090921691909117905592517f405787fa12a823e0f2b7631cc41b3ba8828b3321ca811111fa75cd3aa3bb5ad0860180549186167fffffffffffffffffffffffffffffffff0000000000000000000000000000000090921691909117905591517f405787fa12a823e0f2b7631cc41b3ba8828b3321ca811111fa75cd3aa3bb5ad185015551955182167001000000000000000000000000000000000295909116949094177f405787fa12a823e0f2b7631cc41b3ba8828b3321ca811111fa75cd3aa3bb5ad29091015580547fffffffffffffffffffffffffffff00ffffffffffffffffffffffffffffffffff167101000000000000000000000000000000000017815583517fd0e30db000000000000000000000000000000000000000000000000000000000815293517f0000000000000000000000000c8b5822b6e02cda722174f19a1439a7495a3fa69092169363d0e30db093926004828101939282900301818588803b15801561390457600080fd5b505af1158015613918573d6000803e3d6000fd5b5050600080547fffffffffffffffffffffffffffffffffffffffffffffffff0000000000000000164267ffffffffffffffff161790555050505050565b6fffffffffffffffffffffffffffffffff811160071b81811c67ffffffffffffffff1060061b1781811c63ffffffff1060051b1781811c61ffff1060041b1781811c60ff1060031b17600082136139b457631615e6386000526004601cfd5b7ff8f9f9faf9fdfafbf9fdfcfdfafbfcfef9fafdfafcfcfbfefafafcfbffffffff6f8421084210842108cc6318c6db6d54be83831c1c601f161a1890811b609f90811c6c465772b2bbbb5f824b15207a3081018102606090811d6d0388eaa27412d5aca026815d636e018202811d6d0df99ac502031bf953eff472fdcc018202811d6d13cdffb29d51d99322bdff5f2211018202811d6d0a0f742023def783a307a986912e018202811d6d01920d8043ca89b5239253284e42018202811d6c0b7a86d7375468fac667a0a527016c29508e458543d8aa4df2abee7883018302821d6d0139601a2efabe717e604cbb4894018302821d6d02247f7a7b6594320649aa03aba1018302821d7fffffffffffffffffffffffffffffffffffffff73c0c716a594e00d54e3c4cbc9018302821d7ffffffffffffffffffffffffffffffffffffffdc7b88c420e53a9890533129f6f01830290911d7fffffffffffffffffffffffffffffffffffffff465fda27eb4d63ded474e5f832019091027ffffffffffffffff5f6af8f7b3396644f18e157960000000000000000000000000105711340daa0d5f769dba1915cef59f0815a5506029190037d0267a36c0c95b3975ab3ee5b203a7614a3f75373f047d803ae7b6687f2b302017d57115e47018c7177eebf7cd370a3356a1b7863008a5ae8028c72b88642840160ae1d90565b60007812725dd1d243aba0e75fe645cc4873f9e65afe688c928e1f218311670de0b6b3a764000002158202613bed57637c5f487d6000526004601cfd5b50670de0b6b3a7640000919091020490565b600081600019048311820215613c1d5763bac65e5b6000526004601cfd5b50670de0b6b3a764000091020490565b60007ffffffffffffffffffffffffffffffffffffffffffffffffdc0d0570925a462d78213613c5b57919050565b680755bf798b4a1bf1e58212613c795763a37bfec96000526004601cfd5b6503782dace9d9604e83901b059150600060606bb17217f7d1cf79abc9e3b39884821b056b80000000000000000000000001901d6bb17217f7d1cf79abc9e3b39881029093037fffffffffffffffffffffffffffffffffffffffdbf3ccf1604d263450f02a550481018102606090811d6d0277594991cfc85f6e2461837cd9018202811d7fffffffffffffffffffffffffffffffffffffe5adedaa1cb095af9e4da10e363c018202811d6db1bbb201f443cf962f1a1d3db4a5018202811d7ffffffffffffffffffffffffffffffffffffd38dc772608b0ae56cce01296c0eb018202811d6e05180bb14799ab47a8a8cb2a527d57016d02d16720577bd19bf614176fe9ea6c10fe68e7fd37d0007b713f765084018402831d9081019084017ffffffffffffffffffffffffffffffffffffffe2c69812cf03b0763fd454a8f7e010290911d6e0587f503bb6ea29d25fcb7401964500190910279d835ebba824c98fb31b83b2ca45c000000000000000000000000010574029d9dc38563c32e5c2f6dc192ee70ef65f9978af30260c3939093039290921c92915050565b6000613e46670de0b6b3a764000083613e2d86613955565b613e379190615b93565b613e419190615c4f565b613c2d565b90505b92915050565b60008054700100000000000000000000000000000000900460ff166002811115613e7b57613e7b615625565b14613eb2576040517f67fe195000000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b600060028781548110613ec757613ec761599b565b6000918252602082206005919091020160048101549092506fffffffffffffffffffffffffffffffff16908715821760011b9050613f267f000000000000000000000000000000000000000000000000000000000000000860016159f9565b613fc2826fffffffffffffffffffffffffffffffff167e09010a0d15021d0b0e10121619031e080c141c0f111807131b17061a05041f7f07c4acdd0000000000000000000000000000000000000000000000000000000067ffffffffffffffff831160061b83811c63ffffffff1060051b1792831c600181901c17600281901c17600481901c17600881901c17601081901c170260fb1c1a1790565b60ff1614613ffc576040517f5f53dd9800000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b60008089156140f35761404f7f00000000000000000000000000000000000000000000000000000000000000047f0000000000000000000000000000000000000000000000000000000000000008615a49565b6001901b61406e846fffffffffffffffffffffffffffffffff166150d3565b6fffffffffffffffffffffffffffffffff1661408a9190615cb7565b156140c7576140be6140af60016fffffffffffffffffffffffffffffffff8716615ccb565b865463ffffffff166000615172565b600301546140e9565b7f00000000000000000000000000000000000000000000000000000000000000005b915084905061411d565b6003850154915061411a6140af6fffffffffffffffffffffffffffffffff86166001615cf4565b90505b600882901b60088a8a60405161413492919061598b565b6040518091039020901b14614175576040517f696550ff00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b60006141808c615256565b9050600061418f836003015490565b6040517fe14ced320000000000000000000000000000000000000000000000000000000081527f000000000000000000000000f698388bfcdbd3f9f2f13ebc3e01471b3cc7ce8373ffffffffffffffffffffffffffffffffffffffff169063e14ced3290614209908f908f908f908f908a90600401615d71565b6020604051808303816000875af1158015614228573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061424c9190615afd565b6004850154911491506000906002906142f7906fffffffffffffffffffffffffffffffff167e09010a0d15021d0b0e10121619031e080c141c0f111807131b17061a05041f7f07c4acdd0000000000000000000000000000000000000000000000000000000067ffffffffffffffff831160061b83811c63ffffffff1060051b1792831c600181901c17600281901c17600481901c17600881901c17601081901c170260fb1c1a1790565b614393896fffffffffffffffffffffffffffffffff167e09010a0d15021d0b0e10121619031e080c141c0f111807131b17061a05041f7f07c4acdd0000000000000000000000000000000000000000000000000000000067ffffffffffffffff831160061b83811c63ffffffff1060051b1792831c600181901c17600281901c17600481901c17600881901c17601081901c170260fb1c1a1790565b61439d9190615dab565b6143a79190615dce565b60ff1615905081151581036143e8576040517ffb4e40dd00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b8754640100000000900473ffffffffffffffffffffffffffffffffffffffff161561443f576040517f9071e6af00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b505085547fffffffffffffffff0000000000000000000000000000000000000000ffffffff163364010000000002179095555050505050505050505050565b600080600080600085905060006002828154811061449e5761449e61599b565b600091825260209091206004600590920201908101549091507f000000000000000000000000000000000000000000000000000000000000000490614575906fffffffffffffffffffffffffffffffff167e09010a0d15021d0b0e10121619031e080c141c0f111807131b17061a05041f7f07c4acdd0000000000000000000000000000000000000000000000000000000067ffffffffffffffff831160061b83811c63ffffffff1060051b1792831c600181901c17600281901c17600481901c17600881901c17601081901c170260fb1c1a1790565b60ff16116145af576040517fb34b5c2200000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6000815b60048301547f000000000000000000000000000000000000000000000000000000000000000490614676906fffffffffffffffffffffffffffffffff167e09010a0d15021d0b0e10121619031e080c141c0f111807131b17061a05041f7f07c4acdd0000000000000000000000000000000000000000000000000000000067ffffffffffffffff831160061b83811c63ffffffff1060051b1792831c600181901c17600281901c17600481901c17600881901c17601081901c170260fb1c1a1790565b60ff1692508211156146eb57825463ffffffff166146b57f000000000000000000000000000000000000000000000000000000000000000460016159f9565b83036146bf578391505b600281815481106146d2576146d261599b565b90600052602060002090600502019350809450506145b3565b600481810154908401546fffffffffffffffffffffffffffffffff91821691166000816fffffffffffffffffffffffffffffffff1661475461473f856fffffffffffffffffffffffffffffffff1660011c90565b6fffffffffffffffffffffffffffffffff1690565b6fffffffffffffffffffffffffffffffff16149050801561482357600061478c836fffffffffffffffffffffffffffffffff166150d3565b6fffffffffffffffffffffffffffffffff1611156147f75760006147ce6147c660016fffffffffffffffffffffffffffffffff8616615ccb565b896001615172565b6003810154600490910154909c506fffffffffffffffffffffffffffffffff169a506147fd9050565b6008549a505b600386015460048701549099506fffffffffffffffffffffffffffffffff169750614879565b60006148456147c66fffffffffffffffffffffffffffffffff85166001615cf4565b6003808901546004808b015492840154930154909e506fffffffffffffffffffffffffffffffff9182169d50919b50169850505b505050505050509193509193565b60006fffffffffffffffffffffffffffffffff8416156148f45760408051602081018790526fffffffffffffffffffffffffffffffff8087169282019290925260608101859052908316608082015260a00160405160208183030381529060405280519060200120611900565b82826040516020016149229291909182526fffffffffffffffffffffffffffffffff16602082015260400190565b6040516020818303038152906040528051906020012095945050505050565b6000806149ce847e09010a0d15021d0b0e10121619031e080c141c0f111807131b17061a05041f7f07c4acdd0000000000000000000000000000000000000000000000000000000067ffffffffffffffff831160061b83811c63ffffffff1060051b1792831c600181901c17600281901c17600481901c17600881901c17601081901c170260fb1c1a1790565b60ff1690508083036001841b600180831b0386831b17039250505092915050565b60008060008360000151600003614a32576040517f5ab458fb00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6020840151805160001a607f8111614a57576000600160009450945094505050614e86565b60b78111614b6d576000614a6c608083615a49565b905080876000015111614aab576040517f66c9448500000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6001838101517fff00000000000000000000000000000000000000000000000000000000000000169082148015614b2357507f80000000000000000000000000000000000000000000000000000000000000007fff000000000000000000000000000000000000000000000000000000000000008216105b15614b5a576040517fbabb01dd00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b5060019550935060009250614e86915050565b60bf8111614ccb576000614b8260b783615a49565b905080876000015111614bc1576040517f66c9448500000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b60018301517fff00000000000000000000000000000000000000000000000000000000000000166000819003614c23576040517fbabb01dd00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b600184015160088302610100031c60378111614c6b576040517fbabb01dd00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b614c7581846159f9565b895111614cae576040517f66c9448500000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b614cb98360016159f9565b9750955060009450614e869350505050565b60f78111614d30576000614ce060c083615a49565b905080876000015111614d1f576040517f66c9448500000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b600195509350849250614e86915050565b6000614d3d60f783615a49565b905080876000015111614d7c576040517f66c9448500000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b60018301517fff00000000000000000000000000000000000000000000000000000000000000166000819003614dde576040517fbabb01dd00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b600184015160088302610100031c60378111614e26576040517fbabb01dd00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b614e3081846159f9565b895111614e69576040517f66c9448500000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b614e748360016159f9565b9750955060019450614e869350505050565b9193909250565b60608167ffffffffffffffff811115614ea857614ea86158cf565b6040519080825280601f01601f191660200182016040528015614ed2576020820181803683370190505b5090508115614f1b576000614ee784866159f9565b90506020820160005b84811015614f08578281015182820152602001614ef0565b84811115614f17576000858301525b5050505b9392505050565b6000614f416fffffffffffffffffffffffffffffffff84166001615cf4565b90506000614f5182866001615172565b9050600086901a838061503d5750614f8a60027f0000000000000000000000000000000000000000000000000000000000000004615cb7565b600483015460029061502e906fffffffffffffffffffffffffffffffff167e09010a0d15021d0b0e10121619031e080c141c0f111807131b17061a05041f7f07c4acdd0000000000000000000000000000000000000000000000000000000067ffffffffffffffff831160061b83811c63ffffffff1060051b1792831c600181901c17600281901c17600481901c17600881901c17601081901c170260fb1c1a1790565b6150389190615dce565b60ff16145b156150955760ff811660011480615057575060ff81166002145b615090576040517ff40239db00000000000000000000000000000000000000000000000000000000815260048101889052602401613626565b612a00565b60ff811615612a00576040517ff40239db00000000000000000000000000000000000000000000000000000000815260048101889052602401613626565b600080615160837e09010a0d15021d0b0e10121619031e080c141c0f111807131b17061a05041f7f07c4acdd0000000000000000000000000000000000000000000000000000000067ffffffffffffffff831160061b83811c63ffffffff1060051b1792831c600181901c17600281901c17600481901c17600881901c17601081901c170260fb1c1a1790565b600160ff919091161b90920392915050565b600080826151bb576151b66fffffffffffffffffffffffffffffffff86167f0000000000000000000000000000000000000000000000000000000000000004615285565b6151d6565b6151d6856fffffffffffffffffffffffffffffffff16615411565b9050600284815481106151eb576151eb61599b565b906000526020600020906005020191505b60048201546fffffffffffffffffffffffffffffffff82811691161461524e57815460028054909163ffffffff169081106152395761523961599b565b906000526020600020906005020191506151fc565b509392505050565b60008060008060006152678661447e565b935093509350935061527b84848484614887565b9695505050505050565b600081615324846fffffffffffffffffffffffffffffffff167e09010a0d15021d0b0e10121619031e080c141c0f111807131b17061a05041f7f07c4acdd0000000000000000000000000000000000000000000000000000000067ffffffffffffffff831160061b83811c63ffffffff1060051b1792831c600181901c17600281901c17600481901c17600881901c17601081901c170260fb1c1a1790565b60ff161161533a5763b34b5c226000526004601cfd5b61534383615411565b9050816153e2826fffffffffffffffffffffffffffffffff167e09010a0d15021d0b0e10121619031e080c141c0f111807131b17061a05041f7f07c4acdd0000000000000000000000000000000000000000000000000000000067ffffffffffffffff831160061b83811c63ffffffff1060051b1792831c600181901c17600281901c17600481901c17600881901c17601081901c170260fb1c1a1790565b60ff1611613e4957613e466153f88360016159f9565b6fffffffffffffffffffffffffffffffff8316906154b6565b600081196001830116816154a5827e09010a0d15021d0b0e10121619031e080c141c0f111807131b17061a05041f7f07c4acdd0000000000000000000000000000000000000000000000000000000067ffffffffffffffff831160061b83811c63ffffffff1060051b1792831c600181901c17600281901c17600481901c17600881901c17601081901c170260fb1c1a1790565b60ff169390931c8015179392505050565b600080615543847e09010a0d15021d0b0e10121619031e080c141c0f111807131b17061a05041f7f07c4acdd0000000000000000000000000000000000000000000000000000000067ffffffffffffffff831160061b83811c63ffffffff1060051b1792831c600181901c17600281901c17600481901c17600881901c17601081901c170260fb1c1a1790565b60ff169050808303600180821b0385821b179250505092915050565b60008083601f84011261557157600080fd5b50813567ffffffffffffffff81111561558957600080fd5b6020830191508360208285010111156155a157600080fd5b9250929050565b600080600083850360a08112156155be57600080fd5b60808112156155cc57600080fd5b50839250608084013567ffffffffffffffff8111156155ea57600080fd5b6155f68682870161555f565b9497909650939450505050565b6000806040838503121561561657600080fd5b50508035926020909101359150565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602160045260246000fd5b602081016003831061568f577f4e487b7100000000000000000000000000000000000000000000000000000000600052602160045260246000fd5b91905290565b6000806000606084860312156156aa57600080fd5b505081359360208301359350604090920135919050565b6000815180845260005b818110156156e7576020818501810151868301820152016156cb565b818111156156f9576000602083870101525b50601f017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0169290920160200192915050565b602081526000613e4660208301846156c1565b60006020828403121561575157600080fd5b5035919050565b73ffffffffffffffffffffffffffffffffffffffff8116811461577a57600080fd5b50565b60006020828403121561578f57600080fd5b8135614f1b81615758565b803580151581146157aa57600080fd5b919050565b600080600080608085870312156157c557600080fd5b8435935060208501359250604085013591506157e36060860161579a565b905092959194509250565b60006020828403121561580057600080fd5b81356fffffffffffffffffffffffffffffffff81168114614f1b57600080fd5b6000806000806000806080878903121561583957600080fd5b863595506158496020880161579a565b9450604087013567ffffffffffffffff8082111561586657600080fd5b6158728a838b0161555f565b9096509450606089013591508082111561588b57600080fd5b5061589889828a0161555f565b979a9699509497509295939492505050565b63ffffffff8416815282602082015260606040820152600061190060608301846156c1565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b60006080828403121561591057600080fd5b6040516080810181811067ffffffffffffffff8211171561595a577f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b8060405250823581526020830135602082015260408301356040820152606083013560608201528091505092915050565b8183823760009101908152919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b60008219821115615a0c57615a0c6159ca565b500190565b60007fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff8203615a4257615a426159ca565b5060010190565b600082821015615a5b57615a5b6159ca565b500390565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601260045260246000fd5b600082615a9e57615a9e615a60565b500490565b6000817fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0483118215151615615adb57615adb6159ca565b500290565b600060208284031215615af257600080fd5b8151614f1b81615758565b600060208284031215615b0f57600080fd5b5051919050565b600067ffffffffffffffff83811690831681811015615b3757615b376159ca565b039392505050565b600067ffffffffffffffff80831681851681830481118215151615615b6657615b666159ca565b02949350505050565b60008060408385031215615b8257600080fd5b505080516020909101519092909150565b60007f7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff600084136000841385830485118282161615615bd457615bd46159ca565b7f80000000000000000000000000000000000000000000000000000000000000006000871286820588128184161615615c0f57615c0f6159ca565b60008712925087820587128484161615615c2b57615c2b6159ca565b87850587128184161615615c4157615c416159ca565b505050929093029392505050565b600082615c5e57615c5e615a60565b7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff83147f800000000000000000000000000000000000000000000000000000000000000083141615615cb257615cb26159ca565b500590565b600082615cc657615cc6615a60565b500690565b60006fffffffffffffffffffffffffffffffff83811690831681811015615b3757615b376159ca565b60006fffffffffffffffffffffffffffffffff808316818516808303821115615d1f57615d1f6159ca565b01949350505050565b8183528181602085013750600060208284010152600060207fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0601f840116840101905092915050565b606081526000615d85606083018789615d28565b8281036020840152615d98818688615d28565b9150508260408301529695505050505050565b600060ff821660ff841680821015615dc557615dc56159ca565b90039392505050565b600060ff831680615de157615de1615a60565b8060ff8416069150509291505056fea164736f6c634300080f000a"; + hex"608060405234801561001057600080fd5b506004361061007d5760003560e01c80635e05fbd01161005b5780635e05fbd01461012a5780637258a8071461013d578063838c2d1e14610179578063f2b4e6171461018157600080fd5b806317cf21a91461008257806335e80ab31461009757806354fd4d50146100e1575b600080fd5b610095610090366004610b4c565b6101a7565b005b6002546100b79073ffffffffffffffffffffffffffffffffffffffff1681565b60405173ffffffffffffffffffffffffffffffffffffffff90911681526020015b60405180910390f35b61011d6040518060400160405280600c81526020017f322e302e312d626574612e32000000000000000000000000000000000000000081525081565b6040516100d89190610bea565b610095610138366004610cc6565b61061c565b61016461014b366004610df0565b6001602081905260009182526040909120805491015482565b604080519283526020830191909152016100d8565b610095610853565b7f0000000000000000000000005207cfa0166e8de0fcdfd78b4d17b68587be306d6100b7565b600260009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1663452a93206040518163ffffffff1660e01b8152600401602060405180830381865afa158015610214573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906102389190610e0d565b73ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff161461029c576040517f82b4290000000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b60008060008373ffffffffffffffffffffffffffffffffffffffff1663fa24f7436040518163ffffffff1660e01b8152600401600060405180830381865afa1580156102ec573d6000803e3d6000fd5b505050506040513d6000823e601f3d9081017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe01682016040526103329190810190610e2a565b92509250925060007f0000000000000000000000005207cfa0166e8de0fcdfd78b4d17b68587be306d73ffffffffffffffffffffffffffffffffffffffff16635f0150cb8585856040518463ffffffff1660e01b815260040161039793929190610efb565b6040805180830381865afa1580156103b3573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906103d79190610f29565b5090508473ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff161461043f576040517f6b0f689100000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b60028573ffffffffffffffffffffffffffffffffffffffff1663200d2ed26040518163ffffffff1660e01b8152600401602060405180830381865afa15801561048c573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906104b09190610f9f565b60028111156104c1576104c1610f70565b146104f8576040517f8f8af25f00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b60405180604001604052806105788773ffffffffffffffffffffffffffffffffffffffff1663bcef3b556040518163ffffffff1660e01b8152600401602060405180830381865afa158015610551573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906105759190610fc0565b90565b81526020018673ffffffffffffffffffffffffffffffffffffffff16638b85902b6040518163ffffffff1660e01b8152600401602060405180830381865afa1580156105c8573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906105ec9190610fc0565b905263ffffffff909416600090815260016020818152604090922086518155959091015194019390935550505050565b600054610100900460ff161580801561063c5750600054600160ff909116105b806106565750303b158015610656575060005460ff166001145b6106e6576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602e60248201527f496e697469616c697a61626c653a20636f6e747261637420697320616c72656160448201527f647920696e697469616c697a6564000000000000000000000000000000000000606482015260840160405180910390fd5b600080547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00166001179055801561074457600080547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00ff166101001790555b60005b83518110156107aa57600084828151811061076457610764610fd9565b60209081029190910181015180820151905163ffffffff1660009081526001808452604090912082518155919092015191015550806107a281611008565b915050610747565b50600280547fffffffffffffffffffffffff00000000000000000000000000000000000000001673ffffffffffffffffffffffffffffffffffffffff8416179055801561084e57600080547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00ff169055604051600181527f7f26b83ff96e1f2b6a682f133852f6798a09c465da95921460cefb38474024989060200160405180910390a15b505050565b600033905060008060008373ffffffffffffffffffffffffffffffffffffffff1663fa24f7436040518163ffffffff1660e01b8152600401600060405180830381865afa1580156108a8573d6000803e3d6000fd5b505050506040513d6000823e601f3d9081017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe01682016040526108ee9190810190610e2a565b92509250925060007f0000000000000000000000005207cfa0166e8de0fcdfd78b4d17b68587be306d73ffffffffffffffffffffffffffffffffffffffff16635f0150cb8585856040518463ffffffff1660e01b815260040161095393929190610efb565b6040805180830381865afa15801561096f573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906109939190610f29565b5090508473ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff16146109fb576040517f6b0f689100000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b600160008563ffffffff1663ffffffff168152602001908152602001600020600101548573ffffffffffffffffffffffffffffffffffffffff16638b85902b6040518163ffffffff1660e01b8152600401602060405180830381865afa158015610a69573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610a8d9190610fc0565b11610a99575050505050565b60028573ffffffffffffffffffffffffffffffffffffffff1663200d2ed26040518163ffffffff1660e01b8152600401602060405180830381865afa158015610ae6573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610b0a9190610f9f565b6002811115610b1b57610b1b610f70565b146104f8575050505050565b73ffffffffffffffffffffffffffffffffffffffff81168114610b4957600080fd5b50565b600060208284031215610b5e57600080fd5b8135610b6981610b27565b9392505050565b60005b83811015610b8b578181015183820152602001610b73565b83811115610b9a576000848401525b50505050565b60008151808452610bb8816020860160208601610b70565b601f017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0169290920160200192915050565b602081526000610b696020830184610ba0565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b6040805190810167ffffffffffffffff81118282101715610c4f57610c4f610bfd565b60405290565b604051601f82017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe016810167ffffffffffffffff81118282101715610c9c57610c9c610bfd565b604052919050565b63ffffffff81168114610b4957600080fd5b8035610cc181610b27565b919050565b6000806040808486031215610cda57600080fd5b833567ffffffffffffffff80821115610cf257600080fd5b818601915086601f830112610d0657600080fd5b8135602082821115610d1a57610d1a610bfd565b610d28818360051b01610c55565b8281528181019350606092830285018201928a841115610d4757600080fd5b948201945b83861015610dd457858b0381811215610d655760008081fd5b610d6d610c2c565b8735610d7881610ca4565b81527fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe08201891315610daa5760008081fd5b610db2610c2c565b8886013581528989013586820152818601528652509485019493820193610d4c565b509650610de2888201610cb6565b955050505050509250929050565b600060208284031215610e0257600080fd5b8135610b6981610ca4565b600060208284031215610e1f57600080fd5b8151610b6981610b27565b600080600060608486031215610e3f57600080fd5b8351610e4a81610ca4565b60208501516040860151919450925067ffffffffffffffff80821115610e6f57600080fd5b818601915086601f830112610e8357600080fd5b815181811115610e9557610e95610bfd565b610ec660207fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0601f84011601610c55565b9150808252876020828501011115610edd57600080fd5b610eee816020840160208601610b70565b5080925050509250925092565b63ffffffff84168152826020820152606060408201526000610f206060830184610ba0565b95945050505050565b60008060408385031215610f3c57600080fd5b8251610f4781610b27565b602084015190925067ffffffffffffffff81168114610f6557600080fd5b809150509250929050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602160045260246000fd5b600060208284031215610fb157600080fd5b815160038110610b6957600080fd5b600060208284031215610fd257600080fd5b5051919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b60007fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff8203611060577f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b506001019056fea164736f6c634300080f000a"; + bytes internal constant acc33Code = + hex"6080604052600436106102f25760003560e01c806370872aa51161018f578063c6f0308c116100e1578063ec5e63081161008a578063fa24f74311610064578063fa24f74314610b18578063fa315aa914610b3c578063fe2bbeb214610b6f57600080fd5b8063ec5e630814610a95578063eff0f59214610ac8578063f8f43ff614610af857600080fd5b8063d6ae3cd5116100bb578063d6ae3cd514610a0f578063d8cc1a3c14610a42578063dabd396d14610a6257600080fd5b8063c6f0308c14610937578063cf09e0d0146109c1578063d5d44d80146109e257600080fd5b80638d450a9511610143578063bcef3b551161011d578063bcef3b55146108b7578063bd8da956146108f7578063c395e1ca1461091757600080fd5b80638d450a9514610777578063a445ece6146107aa578063bbdc02db1461087657600080fd5b80638129fc1c116101745780638129fc1c1461071a5780638980e0cc146107225780638b85902b1461073757600080fd5b806370872aa5146106f25780637b0f0adc1461070757600080fd5b80633fc8cef3116102485780635c0cba33116101fc5780636361506d116101d65780636361506d1461066c5780636b6716c0146106ac5780636f034409146106df57600080fd5b80635c0cba3314610604578063609d33341461063757806360e274641461064c57600080fd5b806354fd4d501161022d57806354fd4d501461055e57806357da950e146105b45780635a5fa2d9146105e457600080fd5b80633fc8cef314610518578063472777c61461054b57600080fd5b80632810e1d6116102aa57806337b1b2291161028457806337b1b229146104655780633a768463146104a55780633e3ac912146104d857600080fd5b80632810e1d6146103de5780632ad69aeb146103f357806330dbe5701461041357600080fd5b806319effeb4116102db57806319effeb414610339578063200d2ed21461038457806325fc2ace146103bf57600080fd5b806301935130146102f757806303c2924d14610319575b600080fd5b34801561030357600080fd5b506103176103123660046154e2565b610b9f565b005b34801561032557600080fd5b5061031761033436600461553d565b610ec0565b34801561034557600080fd5b506000546103669068010000000000000000900467ffffffffffffffff1681565b60405167ffffffffffffffff90911681526020015b60405180910390f35b34801561039057600080fd5b506000546103b290700100000000000000000000000000000000900460ff1681565b60405161037b919061558e565b3480156103cb57600080fd5b506008545b60405190815260200161037b565b3480156103ea57600080fd5b506103b2611566565b3480156103ff57600080fd5b506103d061040e36600461553d565b61180b565b34801561041f57600080fd5b506001546104409073ffffffffffffffffffffffffffffffffffffffff1681565b60405173ffffffffffffffffffffffffffffffffffffffff909116815260200161037b565b34801561047157600080fd5b50367ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe81013560f01c90033560601c610440565b3480156104b157600080fd5b507f000000000000000000000000180cbe2ebb9f37d3a3c542ddc2546fd160555a73610440565b3480156104e457600080fd5b50600054610508907201000000000000000000000000000000000000900460ff1681565b604051901515815260200161037b565b34801561052457600080fd5b507f000000000000000000000000ef179756ea6525afade217ca5ab0b1b5cfe0fd92610440565b6103176105593660046155cf565b611841565b34801561056a57600080fd5b506105a76040518060400160405280600c81526020017f312e332e312d626574612e32000000000000000000000000000000000000000081525081565b60405161037b9190615666565b3480156105c057600080fd5b506008546009546105cf919082565b6040805192835260208301919091520161037b565b3480156105f057600080fd5b506103d06105ff366004615679565b611853565b34801561061057600080fd5b507f000000000000000000000000970670459734a83899773a0fd45941b5afc1200e610440565b34801561064357600080fd5b506105a761188d565b34801561065857600080fd5b506103176106673660046156b7565b61189b565b34801561067857600080fd5b50367ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe81013560f01c9003603401356103d0565b3480156106b857600080fd5b507f0000000000000000000000000000000000000000000000000000000000000000610366565b6103176106ed3660046156e9565b611a42565b3480156106fe57600080fd5b506009546103d0565b6103176107153660046155cf565b61251b565b610317612528565b34801561072e57600080fd5b506002546103d0565b34801561074357600080fd5b50367ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe81013560f01c9003605401356103d0565b34801561078357600080fd5b507f00000000000000000000000000000000000000000000000000000000000000006103d0565b3480156107b657600080fd5b506108226107c5366004615679565b6007602052600090815260409020805460019091015460ff821691610100810463ffffffff1691650100000000009091046fffffffffffffffffffffffffffffffff169073ffffffffffffffffffffffffffffffffffffffff1684565b60408051941515855263ffffffff90931660208501526fffffffffffffffffffffffffffffffff9091169183019190915273ffffffffffffffffffffffffffffffffffffffff16606082015260800161037b565b34801561088257600080fd5b5060405163ffffffff7f000000000000000000000000000000000000000000000000000000000000000016815260200161037b565b3480156108c357600080fd5b50367ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe81013560f01c9003601401356103d0565b34801561090357600080fd5b50610366610912366004615679565b612a81565b34801561092357600080fd5b506103d0610932366004615728565b612c60565b34801561094357600080fd5b50610957610952366004615679565b612e43565b6040805163ffffffff909816885273ffffffffffffffffffffffffffffffffffffffff968716602089015295909416948601949094526fffffffffffffffffffffffffffffffff9182166060860152608085015291821660a08401521660c082015260e00161037b565b3480156109cd57600080fd5b506000546103669067ffffffffffffffff1681565b3480156109ee57600080fd5b506103d06109fd3660046156b7565b60036020526000908152604090205481565b348015610a1b57600080fd5b507f00000000000000000000000000000000000000000000000000000000000003856103d0565b348015610a4e57600080fd5b50610317610a5d36600461575a565b612eda565b348015610a6e57600080fd5b507f00000000000000000000000000000000000000000000000000000000000004b0610366565b348015610aa157600080fd5b507f00000000000000000000000000000000000000000000000000000000000000046103d0565b348015610ad457600080fd5b50610508610ae3366004615679565b60046020526000908152604090205460ff1681565b348015610b0457600080fd5b50610317610b133660046155cf565b613509565b348015610b2457600080fd5b50610b2d6139c6565b60405161037b939291906157e4565b348015610b4857600080fd5b507f00000000000000000000000000000000000000000000000000000000000000086103d0565b348015610b7b57600080fd5b50610508610b8a366004615679565b60066020526000908152604090205460ff1681565b60008054700100000000000000000000000000000000900460ff166002811115610bcb57610bcb61555f565b14610c02576040517f67fe195000000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6000547201000000000000000000000000000000000000900460ff1615610c55576040517f0ea2e75200000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b610c8c367ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe81013560f01c90036014013590565b90565b610ca3610c9e36869003860186615838565b613a41565b14610cda576040517f9cc00b5b00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b82606001358282604051610cef9291906158c5565b604051809103902014610d2e576040517fd81d583b00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6000610d77610d7284848080601f016020809104026020016040519081016040528093929190818152602001838380828437600092019190915250613a9d92505050565b613b0a565b90506000610d9e82600881518110610d9157610d916158d5565b6020026020010151613cc0565b9050602081511115610ddc576040517fd81d583b00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b602081810151825190910360031b1c367ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe81013560f01c9003605401358103610e51576040517fb8ed883000000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b5050600180547fffffffffffffffffffffffff000000000000000000000000000000000000000016331790555050600080547fffffffffffffffffffffffffff00ffffffffffffffffffffffffffffffffffff1672010000000000000000000000000000000000001790555050565b60008054700100000000000000000000000000000000900460ff166002811115610eec57610eec61555f565b14610f23576040517f67fe195000000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b600060028381548110610f3857610f386158d5565b906000526020600020906005020190506000610f5384612a81565b905067ffffffffffffffff7f00000000000000000000000000000000000000000000000000000000000004b081169082161015610fbc576040517ff2440b5300000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b60008481526006602052604090205460ff1615611005576040517ff1a9458100000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b600084815260056020526040902080548015801561102257508515155b156110bd578354640100000000900473ffffffffffffffffffffffffffffffffffffffff16600081156110555781611071565b600186015473ffffffffffffffffffffffffffffffffffffffff165b905061107d8187613d74565b50505060009485525050600660205250506040902080547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00166001179055565b6000868152600760209081526040918290208251608081018452815460ff81161515808352610100820463ffffffff16948301949094526501000000000090046fffffffffffffffffffffffffffffffff16938101939093526001015473ffffffffffffffffffffffffffffffffffffffff166060830152611160576fffffffffffffffffffffffffffffffff6040820152600181526000869003611160578195505b600086826020015163ffffffff166111789190615933565b90506000838211611189578161118b565b835b602084015190915063ffffffff165b818110156112d75760008682815481106111b6576111b66158d5565b6000918252602080832090910154808352600690915260409091205490915060ff1661120e576040517f9a07664600000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b600060028281548110611223576112236158d5565b600091825260209091206005909102018054909150640100000000900473ffffffffffffffffffffffffffffffffffffffff161580156112805750600481015460408701516fffffffffffffffffffffffffffffffff9182169116115b156112c257600181015473ffffffffffffffffffffffffffffffffffffffff16606087015260048101546fffffffffffffffffffffffffffffffff1660408701525b505080806112cf9061594b565b91505061119a565b5063ffffffff818116602085810191825260008c81526007909152604090819020865181549351928801517fffffffffffffffffffffffffffffffffffffffffffffffffffffff00000000009094169015157fffffffffffffffffffffffffffffffffffffffffffffffffffffff00000000ff161761010092909416918202939093177fffffffffffffffffffffff00000000000000000000000000000000ffffffffff16650100000000006fffffffffffffffffffffffffffffffff909316929092029190911782556060850151600190920180547fffffffffffffffffffffffff00000000000000000000000000000000000000001673ffffffffffffffffffffffffffffffffffffffff9093169290921790915584900361155b57606083015160008a815260066020526040902080547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff001660011790558915801561145757506000547201000000000000000000000000000000000000900460ff165b156114cc5760015473ffffffffffffffffffffffffffffffffffffffff1661147f818a613d74565b885473ffffffffffffffffffffffffffffffffffffffff909116640100000000027fffffffffffffffff0000000000000000000000000000000000000000ffffffff909116178855611559565b61151373ffffffffffffffffffffffffffffffffffffffff8216156114f1578161150d565b600189015473ffffffffffffffffffffffffffffffffffffffff165b89613d74565b87547fffffffffffffffff0000000000000000000000000000000000000000ffffffff1664010000000073ffffffffffffffffffffffffffffffffffffffff8316021788555b505b505050505050505050565b600080600054700100000000000000000000000000000000900460ff1660028111156115945761159461555f565b146115cb576040517f67fe195000000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6000805260066020527f54cdd369e4e8a8515e52ca72ec816c2101831ad1f18bf44102ed171459c9b4f85460ff1661162f576040517f9a07664600000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff16600260008154811061165b5761165b6158d5565b6000918252602090912060059091020154640100000000900473ffffffffffffffffffffffffffffffffffffffff1614611696576001611699565b60025b6000805467ffffffffffffffff421668010000000000000000027fffffffffffffffffffffffffffffffff0000000000000000ffffffffffffffff82168117835592935083927fffffffffffffffffffffffffffffff00ffffffffffffffffffffffffffffffff167fffffffffffffffffffffffffffffff000000000000000000ffffffffffffffff9091161770010000000000000000000000000000000083600281111561174a5761174a61555f565b02179055600281111561175f5761175f61555f565b6040517f5e186f09b9c93491f14e277eea7faa5de6a2d4bda75a79af7a3684fbfb42da6090600090a27f000000000000000000000000970670459734a83899773a0fd45941b5afc1200e73ffffffffffffffffffffffffffffffffffffffff1663838c2d1e6040518163ffffffff1660e01b8152600401600060405180830381600087803b1580156117f057600080fd5b505af1158015611804573d6000803e3d6000fd5b5050505090565b6005602052816000526040600020818154811061182757600080fd5b90600052602060002001600091509150505481565b905090565b61184e8383836001611a42565b505050565b6000818152600760209081526040808320600590925282208054825461188490610100900463ffffffff1682615983565b95945050505050565b606061183c60546020613e75565b73ffffffffffffffffffffffffffffffffffffffff8116600090815260036020526040812080549082905590819003611900576040517f17bfe5f700000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6040517ff3fef3a300000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff8381166004830152602482018390527f000000000000000000000000ef179756ea6525afade217ca5ab0b1b5cfe0fd92169063f3fef3a390604401600060405180830381600087803b15801561199057600080fd5b505af11580156119a4573d6000803e3d6000fd5b5050505060008273ffffffffffffffffffffffffffffffffffffffff168260405160006040518083038185875af1925050503d8060008114611a02576040519150601f19603f3d011682016040523d82523d6000602084013e611a07565b606091505b505090508061184e576040517f83e6cc6b00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b60008054700100000000000000000000000000000000900460ff166002811115611a6e57611a6e61555f565b14611aa5576040517f67fe195000000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b600060028481548110611aba57611aba6158d5565b60009182526020918290206040805160e0810182526005909302909101805463ffffffff8116845273ffffffffffffffffffffffffffffffffffffffff64010000000090910481169484019490945260018101549093169082015260028201546fffffffffffffffffffffffffffffffff908116606083015260038301546080830181905260049093015480821660a084015270010000000000000000000000000000000090041660c082015291508514611ba1576040517f3014033200000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b60a0810151600083156fffffffffffffffffffffffffffffffff83161760011b90506000611c61826fffffffffffffffffffffffffffffffff167e09010a0d15021d0b0e10121619031e080c141c0f111807131b17061a05041f7f07c4acdd0000000000000000000000000000000000000000000000000000000067ffffffffffffffff831160061b83811c63ffffffff1060051b1792831c600181901c17600281901c17600481901c17600881901c17601081901c170260fb1c1a1790565b60ff169050861580611c9c5750611c997f00000000000000000000000000000000000000000000000000000000000000046002615933565b81145b8015611ca6575084155b15611cdd576040517fa42637bc00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6000547201000000000000000000000000000000000000900460ff168015611d03575086155b15611d3a576040517f0ea2e75200000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b7f0000000000000000000000000000000000000000000000000000000000000008811115611d94576040517f56f57b2b00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b611dbf7f00000000000000000000000000000000000000000000000000000000000000046001615933565b8103611dd157611dd186888588613ec7565b34611ddb83612c60565b14611e12576040517f8620aa1900000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6000611e1d88612a81565b905067ffffffffffffffff7f00000000000000000000000000000000000000000000000000000000000004b0811690821603611e85576040517f3381d11400000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6000611eb260017f0000000000000000000000000000000000000000000000000000000000000008615983565b8303611ff0577f000000000000000000000000180cbe2ebb9f37d3a3c542ddc2546fd160555a7373ffffffffffffffffffffffffffffffffffffffff16637dc0d1d06040518163ffffffff1660e01b8152600401602060405180830381865afa158015611f23573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611f47919061599a565b73ffffffffffffffffffffffffffffffffffffffff1663f3f480d96040518163ffffffff1660e01b8152600401602060405180830381865afa158015611f91573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611fb591906159b7565b611fe9907f000000000000000000000000000000000000000000000000000000000000000067ffffffffffffffff166159d0565b9050612083565b61201b60017f0000000000000000000000000000000000000000000000000000000000000004615983565b830361205657611fe97f000000000000000000000000000000000000000000000000000000000000000067ffffffffffffffff1660026159fc565b507f000000000000000000000000000000000000000000000000000000000000000067ffffffffffffffff165b6120b7817f00000000000000000000000000000000000000000000000000000000000004b067ffffffffffffffff16615a2c565b67ffffffffffffffff166120d28367ffffffffffffffff1690565b67ffffffffffffffff16111561211957612116817f00000000000000000000000000000000000000000000000000000000000004b067ffffffffffffffff16615a2c565b91505b6000604083901b421760008a8152608087901b6fffffffffffffffffffffffffffffffff8d1617602052604081209192509060008181526004602052604090205490915060ff1615612197576040517f80497e3b00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b60016004600083815260200190815260200160002060006101000a81548160ff02191690831515021790555060026040518060e001604052808d63ffffffff168152602001600073ffffffffffffffffffffffffffffffffffffffff1681526020013373ffffffffffffffffffffffffffffffffffffffff168152602001346fffffffffffffffffffffffffffffffff1681526020018c8152602001886fffffffffffffffffffffffffffffffff168152602001846fffffffffffffffffffffffffffffffff16815250908060018154018082558091505060019003906000526020600020906005020160009091909190915060008201518160000160006101000a81548163ffffffff021916908363ffffffff16021790555060208201518160000160046101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555060408201518160010160006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555060608201518160020160006101000a8154816fffffffffffffffffffffffffffffffff02191690836fffffffffffffffffffffffffffffffff1602179055506080820151816003015560a08201518160040160006101000a8154816fffffffffffffffffffffffffffffffff02191690836fffffffffffffffffffffffffffffffff16021790555060c08201518160040160106101000a8154816fffffffffffffffffffffffffffffffff02191690836fffffffffffffffffffffffffffffffff1602179055505050600560008c8152602001908152602001600020600160028054905061242d9190615983565b81546001810183556000928352602083200155604080517fd0e30db0000000000000000000000000000000000000000000000000000000008152905173ffffffffffffffffffffffffffffffffffffffff7f000000000000000000000000ef179756ea6525afade217ca5ab0b1b5cfe0fd92169263d0e30db09234926004808301939282900301818588803b1580156124c557600080fd5b505af11580156124d9573d6000803e3d6000fd5b50506040513393508d92508e91507f9b3245740ec3b155098a55be84957a4da13eaf7f14a8bc6f53126c0b9350f2be90600090a4505050505050505050505050565b61184e8383836000611a42565b60005471010000000000000000000000000000000000900460ff161561257a576040517f0dc149f000000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6040517f7258a80700000000000000000000000000000000000000000000000000000000815263ffffffff7f0000000000000000000000000000000000000000000000000000000000000000166004820152600090819073ffffffffffffffffffffffffffffffffffffffff7f000000000000000000000000970670459734a83899773a0fd45941b5afc1200e1690637258a807906024016040805180830381865afa15801561262e573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906126529190615a55565b90925090508161268e576040517f6a6bc3b200000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b604080518082019091528281526020018190526008829055600981905536607a146126c157639824bdab6000526004601cfd5b80367ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe81013560f01c9003605401351161275b576040517ff40239db000000000000000000000000000000000000000000000000000000008152367ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe81013560f01c90036014013560048201526024015b60405180910390fd5b6040805160e08101825263ffffffff8082526000602083018181527ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe369081013560f01c90038035606090811c868801908152346fffffffffffffffffffffffffffffffff81811693890193845260149094013560808901908152600160a08a0181815242871660c08c019081526002805493840181558a529a5160059092027f405787fa12a823e0f2b7631cc41b3ba8828b3321ca811111fa75cd3aa3bb5ace81018054995173ffffffffffffffffffffffffffffffffffffffff908116640100000000027fffffffffffffffff000000000000000000000000000000000000000000000000909b1694909c16939093179890981790915592517f405787fa12a823e0f2b7631cc41b3ba8828b3321ca811111fa75cd3aa3bb5acf87018054918a167fffffffffffffffffffffffff000000000000000000000000000000000000000090921691909117905592517f405787fa12a823e0f2b7631cc41b3ba8828b3321ca811111fa75cd3aa3bb5ad0860180549186167fffffffffffffffffffffffffffffffff0000000000000000000000000000000090921691909117905591517f405787fa12a823e0f2b7631cc41b3ba8828b3321ca811111fa75cd3aa3bb5ad185015551955182167001000000000000000000000000000000000295909116949094177f405787fa12a823e0f2b7631cc41b3ba8828b3321ca811111fa75cd3aa3bb5ad29091015580547fffffffffffffffffffffffffffff00ffffffffffffffffffffffffffffffffff167101000000000000000000000000000000000017815583517fd0e30db000000000000000000000000000000000000000000000000000000000815293517f000000000000000000000000ef179756ea6525afade217ca5ab0b1b5cfe0fd929092169363d0e30db093926004828101939282900301818588803b158015612a3057600080fd5b505af1158015612a44573d6000803e3d6000fd5b5050600080547fffffffffffffffffffffffffffffffffffffffffffffffff0000000000000000164267ffffffffffffffff161790555050505050565b600080600054700100000000000000000000000000000000900460ff166002811115612aaf57612aaf61555f565b14612ae6576040517f67fe195000000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b600060028381548110612afb57612afb6158d5565b600091825260208220600590910201805490925063ffffffff90811614612b6a57815460028054909163ffffffff16908110612b3957612b396158d5565b906000526020600020906005020160040160109054906101000a90046fffffffffffffffffffffffffffffffff1690505b6004820154600090612ba290700100000000000000000000000000000000900467ffffffffffffffff165b67ffffffffffffffff1690565b612bb69067ffffffffffffffff1642615983565b612bd5612b95846fffffffffffffffffffffffffffffffff1660401c90565b67ffffffffffffffff16612be99190615933565b905067ffffffffffffffff7f00000000000000000000000000000000000000000000000000000000000004b01667ffffffffffffffff168167ffffffffffffffff1611612c365780611884565b7f00000000000000000000000000000000000000000000000000000000000004b095945050505050565b600080612cff836fffffffffffffffffffffffffffffffff167e09010a0d15021d0b0e10121619031e080c141c0f111807131b17061a05041f7f07c4acdd0000000000000000000000000000000000000000000000000000000067ffffffffffffffff831160061b83811c63ffffffff1060051b1792831c600181901c17600281901c17600481901c17600881901c17601081901c170260fb1c1a1790565b60ff1690507f0000000000000000000000000000000000000000000000000000000000000008811115612d5e576040517f56f57b2b00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b642e90edd00062061a806311e1a3006000612d798383615aa8565b9050670de0b6b3a76400006000612db0827f0000000000000000000000000000000000000000000000000000000000000008615abc565b90506000612dce612dc9670de0b6b3a764000086615abc565b614078565b90506000612ddc84846142d3565b90506000612dea8383614322565b90506000612df782614350565b90506000612e1682612e11670de0b6b3a76400008f615abc565b614538565b90506000612e248b83614322565b9050612e30818d615abc565b9f9e505050505050505050505050505050565b60028181548110612e5357600080fd5b60009182526020909120600590910201805460018201546002830154600384015460049094015463ffffffff8416955064010000000090930473ffffffffffffffffffffffffffffffffffffffff908116949216926fffffffffffffffffffffffffffffffff91821692918082169170010000000000000000000000000000000090041687565b60008054700100000000000000000000000000000000900460ff166002811115612f0657612f0661555f565b14612f3d576040517f67fe195000000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b600060028781548110612f5257612f526158d5565b6000918252602082206005919091020160048101549092506fffffffffffffffffffffffffffffffff16908715821760011b9050612fb17f00000000000000000000000000000000000000000000000000000000000000086001615933565b61304d826fffffffffffffffffffffffffffffffff167e09010a0d15021d0b0e10121619031e080c141c0f111807131b17061a05041f7f07c4acdd0000000000000000000000000000000000000000000000000000000067ffffffffffffffff831160061b83811c63ffffffff1060051b1792831c600181901c17600281901c17600481901c17600881901c17601081901c170260fb1c1a1790565b60ff1614613087576040517f5f53dd9800000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b600080891561317e576130da7f00000000000000000000000000000000000000000000000000000000000000047f0000000000000000000000000000000000000000000000000000000000000008615983565b6001901b6130f9846fffffffffffffffffffffffffffffffff16614569565b6fffffffffffffffffffffffffffffffff166131159190615af9565b156131525761314961313a60016fffffffffffffffffffffffffffffffff8716615b0d565b865463ffffffff166000614608565b60030154613174565b7f00000000000000000000000000000000000000000000000000000000000000005b91508490506131a8565b600385015491506131a561313a6fffffffffffffffffffffffffffffffff86166001615b36565b90505b600882901b60088a8a6040516131bf9291906158c5565b6040518091039020901b14613200576040517f696550ff00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b600061320b8c6146ec565b9050600061321a836003015490565b6040517fe14ced320000000000000000000000000000000000000000000000000000000081527f000000000000000000000000180cbe2ebb9f37d3a3c542ddc2546fd160555a7373ffffffffffffffffffffffffffffffffffffffff169063e14ced3290613294908f908f908f908f908a90600401615baa565b6020604051808303816000875af11580156132b3573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906132d791906159b7565b600485015491149150600090600290613382906fffffffffffffffffffffffffffffffff167e09010a0d15021d0b0e10121619031e080c141c0f111807131b17061a05041f7f07c4acdd0000000000000000000000000000000000000000000000000000000067ffffffffffffffff831160061b83811c63ffffffff1060051b1792831c600181901c17600281901c17600481901c17600881901c17601081901c170260fb1c1a1790565b61341e896fffffffffffffffffffffffffffffffff167e09010a0d15021d0b0e10121619031e080c141c0f111807131b17061a05041f7f07c4acdd0000000000000000000000000000000000000000000000000000000067ffffffffffffffff831160061b83811c63ffffffff1060051b1792831c600181901c17600281901c17600481901c17600881901c17601081901c170260fb1c1a1790565b6134289190615be4565b6134329190615c07565b60ff161590508115158103613473576040517ffb4e40dd00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b8754640100000000900473ffffffffffffffffffffffffffffffffffffffff16156134ca576040517f9071e6af00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b505085547fffffffffffffffff0000000000000000000000000000000000000000ffffffff163364010000000002179095555050505050505050505050565b60008054700100000000000000000000000000000000900460ff1660028111156135355761353561555f565b1461356c576040517f67fe195000000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b60008060008061357b8661471b565b9350935093509350600061359185858585614b24565b905060007f000000000000000000000000180cbe2ebb9f37d3a3c542ddc2546fd160555a7373ffffffffffffffffffffffffffffffffffffffff16637dc0d1d06040518163ffffffff1660e01b8152600401602060405180830381865afa158015613600573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190613624919061599a565b90506001890361371c5773ffffffffffffffffffffffffffffffffffffffff81166352f0f3ad8a84613680367ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe81013560f01c90036034013590565b6040517fffffffff0000000000000000000000000000000000000000000000000000000060e086901b16815260048101939093526024830191909152604482015260206064820152608481018a905260a4015b6020604051808303816000875af11580156136f2573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061371691906159b7565b5061155b565b600289036137485773ffffffffffffffffffffffffffffffffffffffff81166352f0f3ad8a8489613680565b600389036137745773ffffffffffffffffffffffffffffffffffffffff81166352f0f3ad8a8487613680565b600489036138fb5760006137ba6fffffffffffffffffffffffffffffffff85167f0000000000000000000000000000000000000000000000000000000000000004614bde565b6009546137c79190615933565b6137d2906001615933565b9050367ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe81013560f01c900360540135811061383b57367ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe81013560f01c90036054013561383d565b805b905073ffffffffffffffffffffffffffffffffffffffff82166352f0f3ad8b8560405160e084901b7fffffffff000000000000000000000000000000000000000000000000000000001681526004810192909252602482015260c084901b604482015260086064820152608481018b905260a4016020604051808303816000875af11580156138d0573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906138f491906159b7565b505061155b565b60058903613994576040517f52f0f3ad000000000000000000000000000000000000000000000000000000008152600481018a9052602481018390527f000000000000000000000000000000000000000000000000000000000000038560c01b6044820152600860648201526084810188905273ffffffffffffffffffffffffffffffffffffffff8216906352f0f3ad9060a4016136d3565b6040517fff137e6500000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b7f0000000000000000000000000000000000000000000000000000000000000000367ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe81013560f01c9003601401356060613a1f61188d565b9050909192565b600081831015613a365781613a38565b825b90505b92915050565b60008160000151826020015183604001518460600151604051602001613a80949392919093845260208401929092526040830152606082015260800190565b604051602081830303815290604052805190602001209050919050565b60408051808201909152600080825260208201528151600003613aec576040517f5ab458fb00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b50604080518082019091528151815260209182019181019190915290565b60606000806000613b1a85614c8c565b919450925090506001816001811115613b3557613b3561555f565b14613b6c576040517f4b9c6abe00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b8451613b788385615933565b14613baf576040517f5c5537b800000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b604080516020808252610420820190925290816020015b6040805180820190915260008082526020820152815260200190600190039081613bc65790505093506000835b8651811015613cb457600080613c396040518060400160405280858c60000151613c1d9190615983565b8152602001858c60200151613c329190615933565b9052614c8c565b509150915060405180604001604052808383613c559190615933565b8152602001848b60200151613c6a9190615933565b815250888581518110613c7f57613c7f6158d5565b6020908102919091010152613c95600185615933565b9350613ca18183615933565b613cab9084615933565b92505050613bf3565b50845250919392505050565b60606000806000613cd085614c8c565b919450925090506000816001811115613ceb57613ceb61555f565b14613d22576040517f1ff9b2e400000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b613d2c8284615933565b855114613d65576040517f5c5537b800000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6118848560200151848461512a565b600281015473ffffffffffffffffffffffffffffffffffffffff8316600090815260036020526040812080546fffffffffffffffffffffffffffffffff90931692839290613dc3908490615933565b90915550506040517f7eee288d00000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff8481166004830152602482018390527f000000000000000000000000ef179756ea6525afade217ca5ab0b1b5cfe0fd921690637eee288d90604401600060405180830381600087803b158015613e5857600080fd5b505af1158015613e6c573d6000803e3d6000fd5b50505050505050565b604051818152367ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe81013560f01c90038284820160208401378260208301016000815260208101604052505092915050565b6000613ee66fffffffffffffffffffffffffffffffff84166001615b36565b90506000613ef682866001614608565b9050600086901a8380613fe25750613f2f60027f0000000000000000000000000000000000000000000000000000000000000004615af9565b6004830154600290613fd3906fffffffffffffffffffffffffffffffff167e09010a0d15021d0b0e10121619031e080c141c0f111807131b17061a05041f7f07c4acdd0000000000000000000000000000000000000000000000000000000067ffffffffffffffff831160061b83811c63ffffffff1060051b1792831c600181901c17600281901c17600481901c17600881901c17601081901c170260fb1c1a1790565b613fdd9190615c07565b60ff16145b1561403a5760ff811660011480613ffc575060ff81166002145b614035576040517ff40239db00000000000000000000000000000000000000000000000000000000815260048101889052602401612752565b613e6c565b60ff811615613e6c576040517ff40239db00000000000000000000000000000000000000000000000000000000815260048101889052602401612752565b6fffffffffffffffffffffffffffffffff811160071b81811c67ffffffffffffffff1060061b1781811c63ffffffff1060051b1781811c61ffff1060041b1781811c60ff1060031b17600082136140d757631615e6386000526004601cfd5b7ff8f9f9faf9fdfafbf9fdfcfdfafbfcfef9fafdfafcfcfbfefafafcfbffffffff6f8421084210842108cc6318c6db6d54be83831c1c601f161a1890811b609f90811c6c465772b2bbbb5f824b15207a3081018102606090811d6d0388eaa27412d5aca026815d636e018202811d6d0df99ac502031bf953eff472fdcc018202811d6d13cdffb29d51d99322bdff5f2211018202811d6d0a0f742023def783a307a986912e018202811d6d01920d8043ca89b5239253284e42018202811d6c0b7a86d7375468fac667a0a527016c29508e458543d8aa4df2abee7883018302821d6d0139601a2efabe717e604cbb4894018302821d6d02247f7a7b6594320649aa03aba1018302821d7fffffffffffffffffffffffffffffffffffffff73c0c716a594e00d54e3c4cbc9018302821d7ffffffffffffffffffffffffffffffffffffffdc7b88c420e53a9890533129f6f01830290911d7fffffffffffffffffffffffffffffffffffffff465fda27eb4d63ded474e5f832019091027ffffffffffffffff5f6af8f7b3396644f18e157960000000000000000000000000105711340daa0d5f769dba1915cef59f0815a5506029190037d0267a36c0c95b3975ab3ee5b203a7614a3f75373f047d803ae7b6687f2b302017d57115e47018c7177eebf7cd370a3356a1b7863008a5ae8028c72b88642840160ae1d90565b60007812725dd1d243aba0e75fe645cc4873f9e65afe688c928e1f218311670de0b6b3a76400000215820261431057637c5f487d6000526004601cfd5b50670de0b6b3a7640000919091020490565b6000816000190483118202156143405763bac65e5b6000526004601cfd5b50670de0b6b3a764000091020490565b60007ffffffffffffffffffffffffffffffffffffffffffffffffdc0d0570925a462d7821361437e57919050565b680755bf798b4a1bf1e5821261439c5763a37bfec96000526004601cfd5b6503782dace9d9604e83901b059150600060606bb17217f7d1cf79abc9e3b39884821b056b80000000000000000000000001901d6bb17217f7d1cf79abc9e3b39881029093037fffffffffffffffffffffffffffffffffffffffdbf3ccf1604d263450f02a550481018102606090811d6d0277594991cfc85f6e2461837cd9018202811d7fffffffffffffffffffffffffffffffffffffe5adedaa1cb095af9e4da10e363c018202811d6db1bbb201f443cf962f1a1d3db4a5018202811d7ffffffffffffffffffffffffffffffffffffd38dc772608b0ae56cce01296c0eb018202811d6e05180bb14799ab47a8a8cb2a527d57016d02d16720577bd19bf614176fe9ea6c10fe68e7fd37d0007b713f765084018402831d9081019084017ffffffffffffffffffffffffffffffffffffffe2c69812cf03b0763fd454a8f7e010290911d6e0587f503bb6ea29d25fcb7401964500190910279d835ebba824c98fb31b83b2ca45c000000000000000000000000010574029d9dc38563c32e5c2f6dc192ee70ef65f9978af30260c3939093039290921c92915050565b6000613a38670de0b6b3a76400008361455086614078565b61455a9190615c29565b6145649190615ce5565b614350565b6000806145f6837e09010a0d15021d0b0e10121619031e080c141c0f111807131b17061a05041f7f07c4acdd0000000000000000000000000000000000000000000000000000000067ffffffffffffffff831160061b83811c63ffffffff1060051b1792831c600181901c17600281901c17600481901c17600881901c17601081901c170260fb1c1a1790565b600160ff919091161b90920392915050565b600080826146515761464c6fffffffffffffffffffffffffffffffff86167f00000000000000000000000000000000000000000000000000000000000000046151bf565b61466c565b61466c856fffffffffffffffffffffffffffffffff1661534b565b905060028481548110614681576146816158d5565b906000526020600020906005020191505b60048201546fffffffffffffffffffffffffffffffff8281169116146146e457815460028054909163ffffffff169081106146cf576146cf6158d5565b90600052602060002090600502019150614692565b509392505050565b60008060008060006146fd8661471b565b935093509350935061471184848484614b24565b9695505050505050565b600080600080600085905060006002828154811061473b5761473b6158d5565b600091825260209091206004600590920201908101549091507f000000000000000000000000000000000000000000000000000000000000000490614812906fffffffffffffffffffffffffffffffff167e09010a0d15021d0b0e10121619031e080c141c0f111807131b17061a05041f7f07c4acdd0000000000000000000000000000000000000000000000000000000067ffffffffffffffff831160061b83811c63ffffffff1060051b1792831c600181901c17600281901c17600481901c17600881901c17601081901c170260fb1c1a1790565b60ff161161484c576040517fb34b5c2200000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6000815b60048301547f000000000000000000000000000000000000000000000000000000000000000490614913906fffffffffffffffffffffffffffffffff167e09010a0d15021d0b0e10121619031e080c141c0f111807131b17061a05041f7f07c4acdd0000000000000000000000000000000000000000000000000000000067ffffffffffffffff831160061b83811c63ffffffff1060051b1792831c600181901c17600281901c17600481901c17600881901c17601081901c170260fb1c1a1790565b60ff16925082111561498857825463ffffffff166149527f00000000000000000000000000000000000000000000000000000000000000046001615933565b830361495c578391505b6002818154811061496f5761496f6158d5565b9060005260206000209060050201935080945050614850565b600481810154908401546fffffffffffffffffffffffffffffffff91821691166000816fffffffffffffffffffffffffffffffff166149f16149dc856fffffffffffffffffffffffffffffffff1660011c90565b6fffffffffffffffffffffffffffffffff1690565b6fffffffffffffffffffffffffffffffff161490508015614ac0576000614a29836fffffffffffffffffffffffffffffffff16614569565b6fffffffffffffffffffffffffffffffff161115614a94576000614a6b614a6360016fffffffffffffffffffffffffffffffff8616615b0d565b896001614608565b6003810154600490910154909c506fffffffffffffffffffffffffffffffff169a50614a9a9050565b6008549a505b600386015460048701549099506fffffffffffffffffffffffffffffffff169750614b16565b6000614ae2614a636fffffffffffffffffffffffffffffffff85166001615b36565b6003808901546004808b015492840154930154909e506fffffffffffffffffffffffffffffffff9182169d50919b50169850505b505050505050509193509193565b60006fffffffffffffffffffffffffffffffff841615614b915760408051602081018790526fffffffffffffffffffffffffffffffff8087169282019290925260608101859052908316608082015260a00160405160208183030381529060405280519060200120611884565b8282604051602001614bbf9291909182526fffffffffffffffffffffffffffffffff16602082015260400190565b6040516020818303038152906040528051906020012095945050505050565b600080614c6b847e09010a0d15021d0b0e10121619031e080c141c0f111807131b17061a05041f7f07c4acdd0000000000000000000000000000000000000000000000000000000067ffffffffffffffff831160061b83811c63ffffffff1060051b1792831c600181901c17600281901c17600481901c17600881901c17601081901c170260fb1c1a1790565b60ff1690508083036001841b600180831b0386831b17039250505092915050565b60008060008360000151600003614ccf576040517f5ab458fb00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6020840151805160001a607f8111614cf4576000600160009450945094505050615123565b60b78111614e0a576000614d09608083615983565b905080876000015111614d48576040517f66c9448500000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6001838101517fff00000000000000000000000000000000000000000000000000000000000000169082148015614dc057507f80000000000000000000000000000000000000000000000000000000000000007fff000000000000000000000000000000000000000000000000000000000000008216105b15614df7576040517fbabb01dd00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b5060019550935060009250615123915050565b60bf8111614f68576000614e1f60b783615983565b905080876000015111614e5e576040517f66c9448500000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b60018301517fff00000000000000000000000000000000000000000000000000000000000000166000819003614ec0576040517fbabb01dd00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b600184015160088302610100031c60378111614f08576040517fbabb01dd00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b614f128184615933565b895111614f4b576040517f66c9448500000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b614f56836001615933565b97509550600094506151239350505050565b60f78111614fcd576000614f7d60c083615983565b905080876000015111614fbc576040517f66c9448500000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b600195509350849250615123915050565b6000614fda60f783615983565b905080876000015111615019576040517f66c9448500000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b60018301517fff0000000000000000000000000000000000000000000000000000000000000016600081900361507b576040517fbabb01dd00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b600184015160088302610100031c603781116150c3576040517fbabb01dd00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6150cd8184615933565b895111615106576040517f66c9448500000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b615111836001615933565b97509550600194506151239350505050565b9193909250565b60608167ffffffffffffffff81111561514557615145615809565b6040519080825280601f01601f19166020018201604052801561516f576020820181803683370190505b50905081156151b85760006151848486615933565b90506020820160005b848110156151a557828101518282015260200161518d565b848111156151b4576000858301525b5050505b9392505050565b60008161525e846fffffffffffffffffffffffffffffffff167e09010a0d15021d0b0e10121619031e080c141c0f111807131b17061a05041f7f07c4acdd0000000000000000000000000000000000000000000000000000000067ffffffffffffffff831160061b83811c63ffffffff1060051b1792831c600181901c17600281901c17600481901c17600881901c17601081901c170260fb1c1a1790565b60ff16116152745763b34b5c226000526004601cfd5b61527d8361534b565b90508161531c826fffffffffffffffffffffffffffffffff167e09010a0d15021d0b0e10121619031e080c141c0f111807131b17061a05041f7f07c4acdd0000000000000000000000000000000000000000000000000000000067ffffffffffffffff831160061b83811c63ffffffff1060051b1792831c600181901c17600281901c17600481901c17600881901c17601081901c170260fb1c1a1790565b60ff1611613a3b57613a38615332836001615933565b6fffffffffffffffffffffffffffffffff8316906153f0565b600081196001830116816153df827e09010a0d15021d0b0e10121619031e080c141c0f111807131b17061a05041f7f07c4acdd0000000000000000000000000000000000000000000000000000000067ffffffffffffffff831160061b83811c63ffffffff1060051b1792831c600181901c17600281901c17600481901c17600881901c17601081901c170260fb1c1a1790565b60ff169390931c8015179392505050565b60008061547d847e09010a0d15021d0b0e10121619031e080c141c0f111807131b17061a05041f7f07c4acdd0000000000000000000000000000000000000000000000000000000067ffffffffffffffff831160061b83811c63ffffffff1060051b1792831c600181901c17600281901c17600481901c17600881901c17601081901c170260fb1c1a1790565b60ff169050808303600180821b0385821b179250505092915050565b60008083601f8401126154ab57600080fd5b50813567ffffffffffffffff8111156154c357600080fd5b6020830191508360208285010111156154db57600080fd5b9250929050565b600080600083850360a08112156154f857600080fd5b608081121561550657600080fd5b50839250608084013567ffffffffffffffff81111561552457600080fd5b61553086828701615499565b9497909650939450505050565b6000806040838503121561555057600080fd5b50508035926020909101359150565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602160045260246000fd5b60208101600383106155c9577f4e487b7100000000000000000000000000000000000000000000000000000000600052602160045260246000fd5b91905290565b6000806000606084860312156155e457600080fd5b505081359360208301359350604090920135919050565b6000815180845260005b8181101561562157602081850181015186830182015201615605565b81811115615633576000602083870101525b50601f017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0169290920160200192915050565b602081526000613a3860208301846155fb565b60006020828403121561568b57600080fd5b5035919050565b73ffffffffffffffffffffffffffffffffffffffff811681146156b457600080fd5b50565b6000602082840312156156c957600080fd5b81356151b881615692565b803580151581146156e457600080fd5b919050565b600080600080608085870312156156ff57600080fd5b84359350602085013592506040850135915061571d606086016156d4565b905092959194509250565b60006020828403121561573a57600080fd5b81356fffffffffffffffffffffffffffffffff811681146151b857600080fd5b6000806000806000806080878903121561577357600080fd5b86359550615783602088016156d4565b9450604087013567ffffffffffffffff808211156157a057600080fd5b6157ac8a838b01615499565b909650945060608901359150808211156157c557600080fd5b506157d289828a01615499565b979a9699509497509295939492505050565b63ffffffff8416815282602082015260606040820152600061188460608301846155fb565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b60006080828403121561584a57600080fd5b6040516080810181811067ffffffffffffffff82111715615894577f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b8060405250823581526020830135602082015260408301356040820152606083013560608201528091505092915050565b8183823760009101908152919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b6000821982111561594657615946615904565b500190565b60007fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff820361597c5761597c615904565b5060010190565b60008282101561599557615995615904565b500390565b6000602082840312156159ac57600080fd5b81516151b881615692565b6000602082840312156159c957600080fd5b5051919050565b600067ffffffffffffffff8083168185168083038211156159f3576159f3615904565b01949350505050565b600067ffffffffffffffff80831681851681830481118215151615615a2357615a23615904565b02949350505050565b600067ffffffffffffffff83811690831681811015615a4d57615a4d615904565b039392505050565b60008060408385031215615a6857600080fd5b505080516020909101519092909150565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601260045260246000fd5b600082615ab757615ab7615a79565b500490565b6000817fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0483118215151615615af457615af4615904565b500290565b600082615b0857615b08615a79565b500690565b60006fffffffffffffffffffffffffffffffff83811690831681811015615a4d57615a4d615904565b60006fffffffffffffffffffffffffffffffff8083168185168083038211156159f3576159f3615904565b8183528181602085013750600060208284010152600060207fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0601f840116840101905092915050565b606081526000615bbe606083018789615b61565b8281036020840152615bd1818688615b61565b9150508260408301529695505050505050565b600060ff821660ff841680821015615bfe57615bfe615904565b90039392505050565b600060ff831680615c1a57615c1a615a79565b8060ff84160691505092915050565b60007f7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff600084136000841385830485118282161615615c6a57615c6a615904565b7f80000000000000000000000000000000000000000000000000000000000000006000871286820588128184161615615ca557615ca5615904565b60008712925087820587128484161615615cc157615cc1615904565b87850587128184161615615cd757615cd7615904565b505050929093029392505050565b600082615cf457615cf4615a79565b7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff83147f800000000000000000000000000000000000000000000000000000000000000083141615615d4857615d48615904565b50059056fea164736f6c634300080f000a"; + bytes internal constant acc34Code = + hex"6080604052600436106103085760003560e01c806370872aa51161019a578063c6f0308c116100e1578063ec5e63081161008a578063fa24f74311610064578063fa24f74314610b94578063fa315aa914610bb8578063fe2bbeb214610beb57600080fd5b8063ec5e630814610b11578063eff0f59214610b44578063f8f43ff614610b7457600080fd5b8063d6ae3cd5116100bb578063d6ae3cd514610a8b578063d8cc1a3c14610abe578063dabd396d14610ade57600080fd5b8063c6f0308c146109b3578063cf09e0d014610a3d578063d5d44d8014610a5e57600080fd5b8063a445ece611610143578063bcef3b551161011d578063bcef3b5514610933578063bd8da95614610973578063c395e1ca1461099357600080fd5b8063a445ece6146107f3578063a8e4fb90146108bf578063bbdc02db146108f257600080fd5b80638980e0cc116101745780638980e0cc1461076b5780638b85902b146107805780638d450a95146107c057600080fd5b806370872aa51461073b5780637b0f0adc146107505780638129fc1c1461076357600080fd5b80633fc8cef31161025e5780635c0cba33116102075780636361506d116101e15780636361506d146106b55780636b6716c0146106f55780636f0344091461072857600080fd5b80635c0cba331461064d578063609d33341461068057806360e274641461069557600080fd5b806354fd4d501161023857806354fd4d50146105a757806357da950e146105fd5780635a5fa2d91461062d57600080fd5b80633fc8cef31461052e578063472777c614610561578063534db0e21461057457600080fd5b80632810e1d6116102c057806337b1b2291161029a57806337b1b2291461047b5780633a768463146104bb5780633e3ac912146104ee57600080fd5b80632810e1d6146103f45780632ad69aeb1461040957806330dbe5701461042957600080fd5b806319effeb4116102f157806319effeb41461034f578063200d2ed21461039a57806325fc2ace146103d557600080fd5b8063019351301461030d57806303c2924d1461032f575b600080fd5b34801561031957600080fd5b5061032d61032836600461575d565b610c1b565b005b34801561033b57600080fd5b5061032d61034a3660046157b8565b610f3c565b34801561035b57600080fd5b5060005461037c9068010000000000000000900467ffffffffffffffff1681565b60405167ffffffffffffffff90911681526020015b60405180910390f35b3480156103a657600080fd5b506000546103c890700100000000000000000000000000000000900460ff1681565b6040516103919190615809565b3480156103e157600080fd5b506008545b604051908152602001610391565b34801561040057600080fd5b506103c86115e2565b34801561041557600080fd5b506103e66104243660046157b8565b611887565b34801561043557600080fd5b506001546104569073ffffffffffffffffffffffffffffffffffffffff1681565b60405173ffffffffffffffffffffffffffffffffffffffff9091168152602001610391565b34801561048757600080fd5b50367ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe81013560f01c90033560601c610456565b3480156104c757600080fd5b507f000000000000000000000000180cbe2ebb9f37d3a3c542ddc2546fd160555a73610456565b3480156104fa57600080fd5b5060005461051e907201000000000000000000000000000000000000900460ff1681565b6040519015158152602001610391565b34801561053a57600080fd5b507f000000000000000000000000d6eaf4c146261653ee059077b78ed088add54309610456565b61032d61056f36600461584a565b6118bd565b34801561058057600080fd5b507f0000000000000000000000006925b8704ff96dee942623d6fb5e946ef5884b63610456565b3480156105b357600080fd5b506105f06040518060400160405280600c81526020017f312e332e312d626574612e32000000000000000000000000000000000000000081525081565b60405161039191906158e1565b34801561060957600080fd5b50600854600954610618919082565b60408051928352602083019190915201610391565b34801561063957600080fd5b506103e66106483660046158f4565b6118cf565b34801561065957600080fd5b507f000000000000000000000000970670459734a83899773a0fd45941b5afc1200e610456565b34801561068c57600080fd5b506105f0611909565b3480156106a157600080fd5b5061032d6106b0366004615932565b611917565b3480156106c157600080fd5b50367ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe81013560f01c9003603401356103e6565b34801561070157600080fd5b507f000000000000000000000000000000000000000000000000000000000000000061037c565b61032d610736366004615964565b611abe565b34801561074757600080fd5b506009546103e6565b61032d61075e36600461584a565b611b7f565b61032d611b8c565b34801561077757600080fd5b506002546103e6565b34801561078c57600080fd5b50367ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe81013560f01c9003605401356103e6565b3480156107cc57600080fd5b507f00000000000000000000000000000000000000000000000000000000000000006103e6565b3480156107ff57600080fd5b5061086b61080e3660046158f4565b6007602052600090815260409020805460019091015460ff821691610100810463ffffffff1691650100000000009091046fffffffffffffffffffffffffffffffff169073ffffffffffffffffffffffffffffffffffffffff1684565b60408051941515855263ffffffff90931660208501526fffffffffffffffffffffffffffffffff9091169183019190915273ffffffffffffffffffffffffffffffffffffffff166060820152608001610391565b3480156108cb57600080fd5b507f00000000000000000000000070997970c51812dc3a010c7d01b50e0d17dc79c8610456565b3480156108fe57600080fd5b5060405163ffffffff7f0000000000000000000000000000000000000000000000000000000000000001168152602001610391565b34801561093f57600080fd5b50367ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe81013560f01c9003601401356103e6565b34801561097f57600080fd5b5061037c61098e3660046158f4565b611c05565b34801561099f57600080fd5b506103e66109ae3660046159a3565b611de4565b3480156109bf57600080fd5b506109d36109ce3660046158f4565b611fc7565b6040805163ffffffff909816885273ffffffffffffffffffffffffffffffffffffffff968716602089015295909416948601949094526fffffffffffffffffffffffffffffffff9182166060860152608085015291821660a08401521660c082015260e001610391565b348015610a4957600080fd5b5060005461037c9067ffffffffffffffff1681565b348015610a6a57600080fd5b506103e6610a79366004615932565b60036020526000908152604090205481565b348015610a9757600080fd5b507f00000000000000000000000000000000000000000000000000000000000003856103e6565b348015610aca57600080fd5b5061032d610ad93660046159d5565b61205e565b348015610aea57600080fd5b507f00000000000000000000000000000000000000000000000000000000000004b061037c565b348015610b1d57600080fd5b507f00000000000000000000000000000000000000000000000000000000000000046103e6565b348015610b5057600080fd5b5061051e610b5f3660046158f4565b60046020526000908152604090205460ff1681565b348015610b8057600080fd5b5061032d610b8f36600461584a565b612123565b348015610ba057600080fd5b50610ba96125e0565b60405161039193929190615a5f565b348015610bc457600080fd5b507f00000000000000000000000000000000000000000000000000000000000000086103e6565b348015610bf757600080fd5b5061051e610c063660046158f4565b60066020526000908152604090205460ff1681565b60008054700100000000000000000000000000000000900460ff166002811115610c4757610c476157da565b14610c7e576040517f67fe195000000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6000547201000000000000000000000000000000000000900460ff1615610cd1576040517f0ea2e75200000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b610d08367ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe81013560f01c90036014013590565b90565b610d1f610d1a36869003860186615ab3565b61265b565b14610d56576040517f9cc00b5b00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b82606001358282604051610d6b929190615b40565b604051809103902014610daa576040517fd81d583b00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6000610df3610dee84848080601f0160208091040260200160405190810160405280939291908181526020018383808284376000920191909152506126b792505050565b612724565b90506000610e1a82600881518110610e0d57610e0d615b50565b60200260200101516128da565b9050602081511115610e58576040517fd81d583b00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b602081810151825190910360031b1c367ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe81013560f01c9003605401358103610ecd576040517fb8ed883000000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b5050600180547fffffffffffffffffffffffff000000000000000000000000000000000000000016331790555050600080547fffffffffffffffffffffffffff00ffffffffffffffffffffffffffffffffffff1672010000000000000000000000000000000000001790555050565b60008054700100000000000000000000000000000000900460ff166002811115610f6857610f686157da565b14610f9f576040517f67fe195000000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b600060028381548110610fb457610fb4615b50565b906000526020600020906005020190506000610fcf84611c05565b905067ffffffffffffffff7f00000000000000000000000000000000000000000000000000000000000004b081169082161015611038576040517ff2440b5300000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b60008481526006602052604090205460ff1615611081576040517ff1a9458100000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b600084815260056020526040902080548015801561109e57508515155b15611139578354640100000000900473ffffffffffffffffffffffffffffffffffffffff16600081156110d157816110ed565b600186015473ffffffffffffffffffffffffffffffffffffffff165b90506110f9818761298e565b50505060009485525050600660205250506040902080547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00166001179055565b6000868152600760209081526040918290208251608081018452815460ff81161515808352610100820463ffffffff16948301949094526501000000000090046fffffffffffffffffffffffffffffffff16938101939093526001015473ffffffffffffffffffffffffffffffffffffffff1660608301526111dc576fffffffffffffffffffffffffffffffff60408201526001815260008690036111dc578195505b600086826020015163ffffffff166111f49190615bae565b905060008382116112055781611207565b835b602084015190915063ffffffff165b8181101561135357600086828154811061123257611232615b50565b6000918252602080832090910154808352600690915260409091205490915060ff1661128a576040517f9a07664600000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b60006002828154811061129f5761129f615b50565b600091825260209091206005909102018054909150640100000000900473ffffffffffffffffffffffffffffffffffffffff161580156112fc5750600481015460408701516fffffffffffffffffffffffffffffffff9182169116115b1561133e57600181015473ffffffffffffffffffffffffffffffffffffffff16606087015260048101546fffffffffffffffffffffffffffffffff1660408701525b5050808061134b90615bc6565b915050611216565b5063ffffffff818116602085810191825260008c81526007909152604090819020865181549351928801517fffffffffffffffffffffffffffffffffffffffffffffffffffffff00000000009094169015157fffffffffffffffffffffffffffffffffffffffffffffffffffffff00000000ff161761010092909416918202939093177fffffffffffffffffffffff00000000000000000000000000000000ffffffffff16650100000000006fffffffffffffffffffffffffffffffff909316929092029190911782556060850151600190920180547fffffffffffffffffffffffff00000000000000000000000000000000000000001673ffffffffffffffffffffffffffffffffffffffff909316929092179091558490036115d757606083015160008a815260066020526040902080547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00166001179055891580156114d357506000547201000000000000000000000000000000000000900460ff165b156115485760015473ffffffffffffffffffffffffffffffffffffffff166114fb818a61298e565b885473ffffffffffffffffffffffffffffffffffffffff909116640100000000027fffffffffffffffff0000000000000000000000000000000000000000ffffffff9091161788556115d5565b61158f73ffffffffffffffffffffffffffffffffffffffff82161561156d5781611589565b600189015473ffffffffffffffffffffffffffffffffffffffff165b8961298e565b87547fffffffffffffffff0000000000000000000000000000000000000000ffffffff1664010000000073ffffffffffffffffffffffffffffffffffffffff8316021788555b505b505050505050505050565b600080600054700100000000000000000000000000000000900460ff166002811115611610576116106157da565b14611647576040517f67fe195000000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6000805260066020527f54cdd369e4e8a8515e52ca72ec816c2101831ad1f18bf44102ed171459c9b4f85460ff166116ab576040517f9a07664600000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff1660026000815481106116d7576116d7615b50565b6000918252602090912060059091020154640100000000900473ffffffffffffffffffffffffffffffffffffffff1614611712576001611715565b60025b6000805467ffffffffffffffff421668010000000000000000027fffffffffffffffffffffffffffffffff0000000000000000ffffffffffffffff82168117835592935083927fffffffffffffffffffffffffffffff00ffffffffffffffffffffffffffffffff167fffffffffffffffffffffffffffffff000000000000000000ffffffffffffffff909116177001000000000000000000000000000000008360028111156117c6576117c66157da565b0217905560028111156117db576117db6157da565b6040517f5e186f09b9c93491f14e277eea7faa5de6a2d4bda75a79af7a3684fbfb42da6090600090a27f000000000000000000000000970670459734a83899773a0fd45941b5afc1200e73ffffffffffffffffffffffffffffffffffffffff1663838c2d1e6040518163ffffffff1660e01b8152600401600060405180830381600087803b15801561186c57600080fd5b505af1158015611880573d6000803e3d6000fd5b5050505090565b600560205281600052604060002081815481106118a357600080fd5b90600052602060002001600091509150505481565b905090565b6118ca8383836001611abe565b505050565b6000818152600760209081526040808320600590925282208054825461190090610100900463ffffffff1682615bfe565b95945050505050565b60606118b860546020612a8f565b73ffffffffffffffffffffffffffffffffffffffff811660009081526003602052604081208054908290559081900361197c576040517f17bfe5f700000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6040517ff3fef3a300000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff8381166004830152602482018390527f000000000000000000000000d6eaf4c146261653ee059077b78ed088add54309169063f3fef3a390604401600060405180830381600087803b158015611a0c57600080fd5b505af1158015611a20573d6000803e3d6000fd5b5050505060008273ffffffffffffffffffffffffffffffffffffffff168260405160006040518083038185875af1925050503d8060008114611a7e576040519150601f19603f3d011682016040523d82523d6000602084013e611a83565b606091505b50509050806118ca576040517f83e6cc6b00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b3373ffffffffffffffffffffffffffffffffffffffff7f00000000000000000000000070997970c51812dc3a010c7d01b50e0d17dc79c8161480611b3757503373ffffffffffffffffffffffffffffffffffffffff7f0000000000000000000000006925b8704ff96dee942623d6fb5e946ef5884b6316145b611b6d576040517fd386ef3e00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b611b7984848484612ae1565b50505050565b6118ca8383836000611abe565b3273ffffffffffffffffffffffffffffffffffffffff7f00000000000000000000000070997970c51812dc3a010c7d01b50e0d17dc79c81614611bfb576040517fd386ef3e00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b611c036135ba565b565b600080600054700100000000000000000000000000000000900460ff166002811115611c3357611c336157da565b14611c6a576040517f67fe195000000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b600060028381548110611c7f57611c7f615b50565b600091825260208220600590910201805490925063ffffffff90811614611cee57815460028054909163ffffffff16908110611cbd57611cbd615b50565b906000526020600020906005020160040160109054906101000a90046fffffffffffffffffffffffffffffffff1690505b6004820154600090611d2690700100000000000000000000000000000000900467ffffffffffffffff165b67ffffffffffffffff1690565b611d3a9067ffffffffffffffff1642615bfe565b611d59611d19846fffffffffffffffffffffffffffffffff1660401c90565b67ffffffffffffffff16611d6d9190615bae565b905067ffffffffffffffff7f00000000000000000000000000000000000000000000000000000000000004b01667ffffffffffffffff168167ffffffffffffffff1611611dba5780611900565b7f00000000000000000000000000000000000000000000000000000000000004b095945050505050565b600080611e83836fffffffffffffffffffffffffffffffff167e09010a0d15021d0b0e10121619031e080c141c0f111807131b17061a05041f7f07c4acdd0000000000000000000000000000000000000000000000000000000067ffffffffffffffff831160061b83811c63ffffffff1060051b1792831c600181901c17600281901c17600481901c17600881901c17601081901c170260fb1c1a1790565b60ff1690507f0000000000000000000000000000000000000000000000000000000000000008811115611ee2576040517f56f57b2b00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b642e90edd00062061a806311e1a3006000611efd8383615c44565b9050670de0b6b3a76400006000611f34827f0000000000000000000000000000000000000000000000000000000000000008615c58565b90506000611f52611f4d670de0b6b3a764000086615c58565b613b13565b90506000611f608484613d6e565b90506000611f6e8383613dbd565b90506000611f7b82613deb565b90506000611f9a82611f95670de0b6b3a76400008f615c58565b613fd3565b90506000611fa88b83613dbd565b9050611fb4818d615c58565b9f9e505050505050505050505050505050565b60028181548110611fd757600080fd5b60009182526020909120600590910201805460018201546002830154600384015460049094015463ffffffff8416955064010000000090930473ffffffffffffffffffffffffffffffffffffffff908116949216926fffffffffffffffffffffffffffffffff91821692918082169170010000000000000000000000000000000090041687565b3373ffffffffffffffffffffffffffffffffffffffff7f00000000000000000000000070997970c51812dc3a010c7d01b50e0d17dc79c81614806120d757503373ffffffffffffffffffffffffffffffffffffffff7f0000000000000000000000006925b8704ff96dee942623d6fb5e946ef5884b6316145b61210d576040517fd386ef3e00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b61211b868686868686614004565b505050505050565b60008054700100000000000000000000000000000000900460ff16600281111561214f5761214f6157da565b14612186576040517f67fe195000000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b60008060008061219586614633565b935093509350935060006121ab85858585614a3c565b905060007f000000000000000000000000180cbe2ebb9f37d3a3c542ddc2546fd160555a7373ffffffffffffffffffffffffffffffffffffffff16637dc0d1d06040518163ffffffff1660e01b8152600401602060405180830381865afa15801561221a573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061223e9190615c95565b9050600189036123365773ffffffffffffffffffffffffffffffffffffffff81166352f0f3ad8a8461229a367ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe81013560f01c90036034013590565b6040517fffffffff0000000000000000000000000000000000000000000000000000000060e086901b16815260048101939093526024830191909152604482015260206064820152608481018a905260a4015b6020604051808303816000875af115801561230c573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906123309190615cb2565b506115d7565b600289036123625773ffffffffffffffffffffffffffffffffffffffff81166352f0f3ad8a848961229a565b6003890361238e5773ffffffffffffffffffffffffffffffffffffffff81166352f0f3ad8a848761229a565b600489036125155760006123d46fffffffffffffffffffffffffffffffff85167f0000000000000000000000000000000000000000000000000000000000000004614af6565b6009546123e19190615bae565b6123ec906001615bae565b9050367ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe81013560f01c900360540135811061245557367ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe81013560f01c900360540135612457565b805b905073ffffffffffffffffffffffffffffffffffffffff82166352f0f3ad8b8560405160e084901b7fffffffff000000000000000000000000000000000000000000000000000000001681526004810192909252602482015260c084901b604482015260086064820152608481018b905260a4016020604051808303816000875af11580156124ea573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061250e9190615cb2565b50506115d7565b600589036125ae576040517f52f0f3ad000000000000000000000000000000000000000000000000000000008152600481018a9052602481018390527f000000000000000000000000000000000000000000000000000000000000038560c01b6044820152600860648201526084810188905273ffffffffffffffffffffffffffffffffffffffff8216906352f0f3ad9060a4016122ed565b6040517fff137e6500000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b7f0000000000000000000000000000000000000000000000000000000000000001367ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe81013560f01c9003601401356060612639611909565b9050909192565b6000818310156126505781612652565b825b90505b92915050565b6000816000015182602001518360400151846060015160405160200161269a949392919093845260208401929092526040830152606082015260800190565b604051602081830303815290604052805190602001209050919050565b60408051808201909152600080825260208201528151600003612706576040517f5ab458fb00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b50604080518082019091528151815260209182019181019190915290565b6060600080600061273485614ba4565b91945092509050600181600181111561274f5761274f6157da565b14612786576040517f4b9c6abe00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b84516127928385615bae565b146127c9576040517f5c5537b800000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b604080516020808252610420820190925290816020015b60408051808201909152600080825260208201528152602001906001900390816127e05790505093506000835b86518110156128ce576000806128536040518060400160405280858c600001516128379190615bfe565b8152602001858c6020015161284c9190615bae565b9052614ba4565b50915091506040518060400160405280838361286f9190615bae565b8152602001848b602001516128849190615bae565b81525088858151811061289957612899615b50565b60209081029190910101526128af600185615bae565b93506128bb8183615bae565b6128c59084615bae565b9250505061280d565b50845250919392505050565b606060008060006128ea85614ba4565b919450925090506000816001811115612905576129056157da565b1461293c576040517f1ff9b2e400000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6129468284615bae565b85511461297f576040517f5c5537b800000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b61190085602001518484615042565b600281015473ffffffffffffffffffffffffffffffffffffffff8316600090815260036020526040812080546fffffffffffffffffffffffffffffffff909316928392906129dd908490615bae565b90915550506040517f7eee288d00000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff8481166004830152602482018390527f000000000000000000000000d6eaf4c146261653ee059077b78ed088add543091690637eee288d90604401600060405180830381600087803b158015612a7257600080fd5b505af1158015612a86573d6000803e3d6000fd5b50505050505050565b604051818152367ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe81013560f01c90038284820160208401378260208301016000815260208101604052505092915050565b60008054700100000000000000000000000000000000900460ff166002811115612b0d57612b0d6157da565b14612b44576040517f67fe195000000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b600060028481548110612b5957612b59615b50565b60009182526020918290206040805160e0810182526005909302909101805463ffffffff8116845273ffffffffffffffffffffffffffffffffffffffff64010000000090910481169484019490945260018101549093169082015260028201546fffffffffffffffffffffffffffffffff908116606083015260038301546080830181905260049093015480821660a084015270010000000000000000000000000000000090041660c082015291508514612c40576040517f3014033200000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b60a0810151600083156fffffffffffffffffffffffffffffffff83161760011b90506000612d00826fffffffffffffffffffffffffffffffff167e09010a0d15021d0b0e10121619031e080c141c0f111807131b17061a05041f7f07c4acdd0000000000000000000000000000000000000000000000000000000067ffffffffffffffff831160061b83811c63ffffffff1060051b1792831c600181901c17600281901c17600481901c17600881901c17601081901c170260fb1c1a1790565b60ff169050861580612d3b5750612d387f00000000000000000000000000000000000000000000000000000000000000046002615bae565b81145b8015612d45575084155b15612d7c576040517fa42637bc00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6000547201000000000000000000000000000000000000900460ff168015612da2575086155b15612dd9576040517f0ea2e75200000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b7f0000000000000000000000000000000000000000000000000000000000000008811115612e33576040517f56f57b2b00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b612e5e7f00000000000000000000000000000000000000000000000000000000000000046001615bae565b8103612e7057612e70868885886150d7565b34612e7a83611de4565b14612eb1576040517f8620aa1900000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6000612ebc88611c05565b905067ffffffffffffffff7f00000000000000000000000000000000000000000000000000000000000004b0811690821603612f24576040517f3381d11400000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6000612f5160017f0000000000000000000000000000000000000000000000000000000000000008615bfe565b830361308f577f000000000000000000000000180cbe2ebb9f37d3a3c542ddc2546fd160555a7373ffffffffffffffffffffffffffffffffffffffff16637dc0d1d06040518163ffffffff1660e01b8152600401602060405180830381865afa158015612fc2573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190612fe69190615c95565b73ffffffffffffffffffffffffffffffffffffffff1663f3f480d96040518163ffffffff1660e01b8152600401602060405180830381865afa158015613030573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906130549190615cb2565b613088907f000000000000000000000000000000000000000000000000000000000000000067ffffffffffffffff16615ccb565b9050613122565b6130ba60017f0000000000000000000000000000000000000000000000000000000000000004615bfe565b83036130f5576130887f000000000000000000000000000000000000000000000000000000000000000067ffffffffffffffff166002615cf7565b507f000000000000000000000000000000000000000000000000000000000000000067ffffffffffffffff165b613156817f00000000000000000000000000000000000000000000000000000000000004b067ffffffffffffffff16615d27565b67ffffffffffffffff166131718367ffffffffffffffff1690565b67ffffffffffffffff1611156131b8576131b5817f00000000000000000000000000000000000000000000000000000000000004b067ffffffffffffffff16615d27565b91505b6000604083901b421760008a8152608087901b6fffffffffffffffffffffffffffffffff8d1617602052604081209192509060008181526004602052604090205490915060ff1615613236576040517f80497e3b00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b60016004600083815260200190815260200160002060006101000a81548160ff02191690831515021790555060026040518060e001604052808d63ffffffff168152602001600073ffffffffffffffffffffffffffffffffffffffff1681526020013373ffffffffffffffffffffffffffffffffffffffff168152602001346fffffffffffffffffffffffffffffffff1681526020018c8152602001886fffffffffffffffffffffffffffffffff168152602001846fffffffffffffffffffffffffffffffff16815250908060018154018082558091505060019003906000526020600020906005020160009091909190915060008201518160000160006101000a81548163ffffffff021916908363ffffffff16021790555060208201518160000160046101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555060408201518160010160006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555060608201518160020160006101000a8154816fffffffffffffffffffffffffffffffff02191690836fffffffffffffffffffffffffffffffff1602179055506080820151816003015560a08201518160040160006101000a8154816fffffffffffffffffffffffffffffffff02191690836fffffffffffffffffffffffffffffffff16021790555060c08201518160040160106101000a8154816fffffffffffffffffffffffffffffffff02191690836fffffffffffffffffffffffffffffffff1602179055505050600560008c815260200190815260200160002060016002805490506134cc9190615bfe565b81546001810183556000928352602083200155604080517fd0e30db0000000000000000000000000000000000000000000000000000000008152905173ffffffffffffffffffffffffffffffffffffffff7f000000000000000000000000d6eaf4c146261653ee059077b78ed088add54309169263d0e30db09234926004808301939282900301818588803b15801561356457600080fd5b505af1158015613578573d6000803e3d6000fd5b50506040513393508d92508e91507f9b3245740ec3b155098a55be84957a4da13eaf7f14a8bc6f53126c0b9350f2be90600090a4505050505050505050505050565b60005471010000000000000000000000000000000000900460ff161561360c576040517f0dc149f000000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6040517f7258a80700000000000000000000000000000000000000000000000000000000815263ffffffff7f0000000000000000000000000000000000000000000000000000000000000001166004820152600090819073ffffffffffffffffffffffffffffffffffffffff7f000000000000000000000000970670459734a83899773a0fd45941b5afc1200e1690637258a807906024016040805180830381865afa1580156136c0573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906136e49190615d50565b909250905081613720576040517f6a6bc3b200000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b604080518082019091528281526020018190526008829055600981905536607a1461375357639824bdab6000526004601cfd5b80367ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe81013560f01c900360540135116137ed576040517ff40239db000000000000000000000000000000000000000000000000000000008152367ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe81013560f01c90036014013560048201526024015b60405180910390fd5b6040805160e08101825263ffffffff8082526000602083018181527ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe369081013560f01c90038035606090811c868801908152346fffffffffffffffffffffffffffffffff81811693890193845260149094013560808901908152600160a08a0181815242871660c08c019081526002805493840181558a529a5160059092027f405787fa12a823e0f2b7631cc41b3ba8828b3321ca811111fa75cd3aa3bb5ace81018054995173ffffffffffffffffffffffffffffffffffffffff908116640100000000027fffffffffffffffff000000000000000000000000000000000000000000000000909b1694909c16939093179890981790915592517f405787fa12a823e0f2b7631cc41b3ba8828b3321ca811111fa75cd3aa3bb5acf87018054918a167fffffffffffffffffffffffff000000000000000000000000000000000000000090921691909117905592517f405787fa12a823e0f2b7631cc41b3ba8828b3321ca811111fa75cd3aa3bb5ad0860180549186167fffffffffffffffffffffffffffffffff0000000000000000000000000000000090921691909117905591517f405787fa12a823e0f2b7631cc41b3ba8828b3321ca811111fa75cd3aa3bb5ad185015551955182167001000000000000000000000000000000000295909116949094177f405787fa12a823e0f2b7631cc41b3ba8828b3321ca811111fa75cd3aa3bb5ad29091015580547fffffffffffffffffffffffffffff00ffffffffffffffffffffffffffffffffff167101000000000000000000000000000000000017815583517fd0e30db000000000000000000000000000000000000000000000000000000000815293517f000000000000000000000000d6eaf4c146261653ee059077b78ed088add543099092169363d0e30db093926004828101939282900301818588803b158015613ac257600080fd5b505af1158015613ad6573d6000803e3d6000fd5b5050600080547fffffffffffffffffffffffffffffffffffffffffffffffff0000000000000000164267ffffffffffffffff161790555050505050565b6fffffffffffffffffffffffffffffffff811160071b81811c67ffffffffffffffff1060061b1781811c63ffffffff1060051b1781811c61ffff1060041b1781811c60ff1060031b1760008213613b7257631615e6386000526004601cfd5b7ff8f9f9faf9fdfafbf9fdfcfdfafbfcfef9fafdfafcfcfbfefafafcfbffffffff6f8421084210842108cc6318c6db6d54be83831c1c601f161a1890811b609f90811c6c465772b2bbbb5f824b15207a3081018102606090811d6d0388eaa27412d5aca026815d636e018202811d6d0df99ac502031bf953eff472fdcc018202811d6d13cdffb29d51d99322bdff5f2211018202811d6d0a0f742023def783a307a986912e018202811d6d01920d8043ca89b5239253284e42018202811d6c0b7a86d7375468fac667a0a527016c29508e458543d8aa4df2abee7883018302821d6d0139601a2efabe717e604cbb4894018302821d6d02247f7a7b6594320649aa03aba1018302821d7fffffffffffffffffffffffffffffffffffffff73c0c716a594e00d54e3c4cbc9018302821d7ffffffffffffffffffffffffffffffffffffffdc7b88c420e53a9890533129f6f01830290911d7fffffffffffffffffffffffffffffffffffffff465fda27eb4d63ded474e5f832019091027ffffffffffffffff5f6af8f7b3396644f18e157960000000000000000000000000105711340daa0d5f769dba1915cef59f0815a5506029190037d0267a36c0c95b3975ab3ee5b203a7614a3f75373f047d803ae7b6687f2b302017d57115e47018c7177eebf7cd370a3356a1b7863008a5ae8028c72b88642840160ae1d90565b60007812725dd1d243aba0e75fe645cc4873f9e65afe688c928e1f218311670de0b6b3a764000002158202613dab57637c5f487d6000526004601cfd5b50670de0b6b3a7640000919091020490565b600081600019048311820215613ddb5763bac65e5b6000526004601cfd5b50670de0b6b3a764000091020490565b60007ffffffffffffffffffffffffffffffffffffffffffffffffdc0d0570925a462d78213613e1957919050565b680755bf798b4a1bf1e58212613e375763a37bfec96000526004601cfd5b6503782dace9d9604e83901b059150600060606bb17217f7d1cf79abc9e3b39884821b056b80000000000000000000000001901d6bb17217f7d1cf79abc9e3b39881029093037fffffffffffffffffffffffffffffffffffffffdbf3ccf1604d263450f02a550481018102606090811d6d0277594991cfc85f6e2461837cd9018202811d7fffffffffffffffffffffffffffffffffffffe5adedaa1cb095af9e4da10e363c018202811d6db1bbb201f443cf962f1a1d3db4a5018202811d7ffffffffffffffffffffffffffffffffffffd38dc772608b0ae56cce01296c0eb018202811d6e05180bb14799ab47a8a8cb2a527d57016d02d16720577bd19bf614176fe9ea6c10fe68e7fd37d0007b713f765084018402831d9081019084017ffffffffffffffffffffffffffffffffffffffe2c69812cf03b0763fd454a8f7e010290911d6e0587f503bb6ea29d25fcb7401964500190910279d835ebba824c98fb31b83b2ca45c000000000000000000000000010574029d9dc38563c32e5c2f6dc192ee70ef65f9978af30260c3939093039290921c92915050565b6000612652670de0b6b3a764000083613feb86613b13565b613ff59190615d74565b613fff9190615e30565b613deb565b60008054700100000000000000000000000000000000900460ff166002811115614030576140306157da565b14614067576040517f67fe195000000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b60006002878154811061407c5761407c615b50565b6000918252602082206005919091020160048101549092506fffffffffffffffffffffffffffffffff16908715821760011b90506140db7f00000000000000000000000000000000000000000000000000000000000000086001615bae565b614177826fffffffffffffffffffffffffffffffff167e09010a0d15021d0b0e10121619031e080c141c0f111807131b17061a05041f7f07c4acdd0000000000000000000000000000000000000000000000000000000067ffffffffffffffff831160061b83811c63ffffffff1060051b1792831c600181901c17600281901c17600481901c17600881901c17601081901c170260fb1c1a1790565b60ff16146141b1576040517f5f53dd9800000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b60008089156142a8576142047f00000000000000000000000000000000000000000000000000000000000000047f0000000000000000000000000000000000000000000000000000000000000008615bfe565b6001901b614223846fffffffffffffffffffffffffffffffff16615288565b6fffffffffffffffffffffffffffffffff1661423f9190615e98565b1561427c5761427361426460016fffffffffffffffffffffffffffffffff8716615eac565b865463ffffffff166000615327565b6003015461429e565b7f00000000000000000000000000000000000000000000000000000000000000005b91508490506142d2565b600385015491506142cf6142646fffffffffffffffffffffffffffffffff86166001615ed5565b90505b600882901b60088a8a6040516142e9929190615b40565b6040518091039020901b1461432a576040517f696550ff00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b60006143358c61540b565b90506000614344836003015490565b6040517fe14ced320000000000000000000000000000000000000000000000000000000081527f000000000000000000000000180cbe2ebb9f37d3a3c542ddc2546fd160555a7373ffffffffffffffffffffffffffffffffffffffff169063e14ced32906143be908f908f908f908f908a90600401615f49565b6020604051808303816000875af11580156143dd573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906144019190615cb2565b6004850154911491506000906002906144ac906fffffffffffffffffffffffffffffffff167e09010a0d15021d0b0e10121619031e080c141c0f111807131b17061a05041f7f07c4acdd0000000000000000000000000000000000000000000000000000000067ffffffffffffffff831160061b83811c63ffffffff1060051b1792831c600181901c17600281901c17600481901c17600881901c17601081901c170260fb1c1a1790565b614548896fffffffffffffffffffffffffffffffff167e09010a0d15021d0b0e10121619031e080c141c0f111807131b17061a05041f7f07c4acdd0000000000000000000000000000000000000000000000000000000067ffffffffffffffff831160061b83811c63ffffffff1060051b1792831c600181901c17600281901c17600481901c17600881901c17601081901c170260fb1c1a1790565b6145529190615f83565b61455c9190615fa6565b60ff16159050811515810361459d576040517ffb4e40dd00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b8754640100000000900473ffffffffffffffffffffffffffffffffffffffff16156145f4576040517f9071e6af00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b505085547fffffffffffffffff0000000000000000000000000000000000000000ffffffff163364010000000002179095555050505050505050505050565b600080600080600085905060006002828154811061465357614653615b50565b600091825260209091206004600590920201908101549091507f00000000000000000000000000000000000000000000000000000000000000049061472a906fffffffffffffffffffffffffffffffff167e09010a0d15021d0b0e10121619031e080c141c0f111807131b17061a05041f7f07c4acdd0000000000000000000000000000000000000000000000000000000067ffffffffffffffff831160061b83811c63ffffffff1060051b1792831c600181901c17600281901c17600481901c17600881901c17601081901c170260fb1c1a1790565b60ff1611614764576040517fb34b5c2200000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6000815b60048301547f00000000000000000000000000000000000000000000000000000000000000049061482b906fffffffffffffffffffffffffffffffff167e09010a0d15021d0b0e10121619031e080c141c0f111807131b17061a05041f7f07c4acdd0000000000000000000000000000000000000000000000000000000067ffffffffffffffff831160061b83811c63ffffffff1060051b1792831c600181901c17600281901c17600481901c17600881901c17601081901c170260fb1c1a1790565b60ff1692508211156148a057825463ffffffff1661486a7f00000000000000000000000000000000000000000000000000000000000000046001615bae565b8303614874578391505b6002818154811061488757614887615b50565b9060005260206000209060050201935080945050614768565b600481810154908401546fffffffffffffffffffffffffffffffff91821691166000816fffffffffffffffffffffffffffffffff166149096148f4856fffffffffffffffffffffffffffffffff1660011c90565b6fffffffffffffffffffffffffffffffff1690565b6fffffffffffffffffffffffffffffffff1614905080156149d8576000614941836fffffffffffffffffffffffffffffffff16615288565b6fffffffffffffffffffffffffffffffff1611156149ac57600061498361497b60016fffffffffffffffffffffffffffffffff8616615eac565b896001615327565b6003810154600490910154909c506fffffffffffffffffffffffffffffffff169a506149b29050565b6008549a505b600386015460048701549099506fffffffffffffffffffffffffffffffff169750614a2e565b60006149fa61497b6fffffffffffffffffffffffffffffffff85166001615ed5565b6003808901546004808b015492840154930154909e506fffffffffffffffffffffffffffffffff9182169d50919b50169850505b505050505050509193509193565b60006fffffffffffffffffffffffffffffffff841615614aa95760408051602081018790526fffffffffffffffffffffffffffffffff8087169282019290925260608101859052908316608082015260a00160405160208183030381529060405280519060200120611900565b8282604051602001614ad79291909182526fffffffffffffffffffffffffffffffff16602082015260400190565b6040516020818303038152906040528051906020012095945050505050565b600080614b83847e09010a0d15021d0b0e10121619031e080c141c0f111807131b17061a05041f7f07c4acdd0000000000000000000000000000000000000000000000000000000067ffffffffffffffff831160061b83811c63ffffffff1060051b1792831c600181901c17600281901c17600481901c17600881901c17601081901c170260fb1c1a1790565b60ff1690508083036001841b600180831b0386831b17039250505092915050565b60008060008360000151600003614be7576040517f5ab458fb00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6020840151805160001a607f8111614c0c57600060016000945094509450505061503b565b60b78111614d22576000614c21608083615bfe565b905080876000015111614c60576040517f66c9448500000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6001838101517fff00000000000000000000000000000000000000000000000000000000000000169082148015614cd857507f80000000000000000000000000000000000000000000000000000000000000007fff000000000000000000000000000000000000000000000000000000000000008216105b15614d0f576040517fbabb01dd00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b506001955093506000925061503b915050565b60bf8111614e80576000614d3760b783615bfe565b905080876000015111614d76576040517f66c9448500000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b60018301517fff00000000000000000000000000000000000000000000000000000000000000166000819003614dd8576040517fbabb01dd00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b600184015160088302610100031c60378111614e20576040517fbabb01dd00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b614e2a8184615bae565b895111614e63576040517f66c9448500000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b614e6e836001615bae565b975095506000945061503b9350505050565b60f78111614ee5576000614e9560c083615bfe565b905080876000015111614ed4576040517f66c9448500000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b60019550935084925061503b915050565b6000614ef260f783615bfe565b905080876000015111614f31576040517f66c9448500000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b60018301517fff00000000000000000000000000000000000000000000000000000000000000166000819003614f93576040517fbabb01dd00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b600184015160088302610100031c60378111614fdb576040517fbabb01dd00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b614fe58184615bae565b89511161501e576040517f66c9448500000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b615029836001615bae565b975095506001945061503b9350505050565b9193909250565b60608167ffffffffffffffff81111561505d5761505d615a84565b6040519080825280601f01601f191660200182016040528015615087576020820181803683370190505b50905081156150d057600061509c8486615bae565b90506020820160005b848110156150bd5782810151828201526020016150a5565b848111156150cc576000858301525b5050505b9392505050565b60006150f66fffffffffffffffffffffffffffffffff84166001615ed5565b9050600061510682866001615327565b9050600086901a83806151f2575061513f60027f0000000000000000000000000000000000000000000000000000000000000004615e98565b60048301546002906151e3906fffffffffffffffffffffffffffffffff167e09010a0d15021d0b0e10121619031e080c141c0f111807131b17061a05041f7f07c4acdd0000000000000000000000000000000000000000000000000000000067ffffffffffffffff831160061b83811c63ffffffff1060051b1792831c600181901c17600281901c17600481901c17600881901c17601081901c170260fb1c1a1790565b6151ed9190615fa6565b60ff16145b1561524a5760ff81166001148061520c575060ff81166002145b615245576040517ff40239db000000000000000000000000000000000000000000000000000000008152600481018890526024016137e4565b612a86565b60ff811615612a86576040517ff40239db000000000000000000000000000000000000000000000000000000008152600481018890526024016137e4565b600080615315837e09010a0d15021d0b0e10121619031e080c141c0f111807131b17061a05041f7f07c4acdd0000000000000000000000000000000000000000000000000000000067ffffffffffffffff831160061b83811c63ffffffff1060051b1792831c600181901c17600281901c17600481901c17600881901c17601081901c170260fb1c1a1790565b600160ff919091161b90920392915050565b600080826153705761536b6fffffffffffffffffffffffffffffffff86167f000000000000000000000000000000000000000000000000000000000000000461543a565b61538b565b61538b856fffffffffffffffffffffffffffffffff166155c6565b9050600284815481106153a0576153a0615b50565b906000526020600020906005020191505b60048201546fffffffffffffffffffffffffffffffff82811691161461540357815460028054909163ffffffff169081106153ee576153ee615b50565b906000526020600020906005020191506153b1565b509392505050565b600080600080600061541c86614633565b935093509350935061543084848484614a3c565b9695505050505050565b6000816154d9846fffffffffffffffffffffffffffffffff167e09010a0d15021d0b0e10121619031e080c141c0f111807131b17061a05041f7f07c4acdd0000000000000000000000000000000000000000000000000000000067ffffffffffffffff831160061b83811c63ffffffff1060051b1792831c600181901c17600281901c17600481901c17600881901c17601081901c170260fb1c1a1790565b60ff16116154ef5763b34b5c226000526004601cfd5b6154f8836155c6565b905081615597826fffffffffffffffffffffffffffffffff167e09010a0d15021d0b0e10121619031e080c141c0f111807131b17061a05041f7f07c4acdd0000000000000000000000000000000000000000000000000000000067ffffffffffffffff831160061b83811c63ffffffff1060051b1792831c600181901c17600281901c17600481901c17600881901c17601081901c170260fb1c1a1790565b60ff1611612655576126526155ad836001615bae565b6fffffffffffffffffffffffffffffffff83169061566b565b6000811960018301168161565a827e09010a0d15021d0b0e10121619031e080c141c0f111807131b17061a05041f7f07c4acdd0000000000000000000000000000000000000000000000000000000067ffffffffffffffff831160061b83811c63ffffffff1060051b1792831c600181901c17600281901c17600481901c17600881901c17601081901c170260fb1c1a1790565b60ff169390931c8015179392505050565b6000806156f8847e09010a0d15021d0b0e10121619031e080c141c0f111807131b17061a05041f7f07c4acdd0000000000000000000000000000000000000000000000000000000067ffffffffffffffff831160061b83811c63ffffffff1060051b1792831c600181901c17600281901c17600481901c17600881901c17601081901c170260fb1c1a1790565b60ff169050808303600180821b0385821b179250505092915050565b60008083601f84011261572657600080fd5b50813567ffffffffffffffff81111561573e57600080fd5b60208301915083602082850101111561575657600080fd5b9250929050565b600080600083850360a081121561577357600080fd5b608081121561578157600080fd5b50839250608084013567ffffffffffffffff81111561579f57600080fd5b6157ab86828701615714565b9497909650939450505050565b600080604083850312156157cb57600080fd5b50508035926020909101359150565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602160045260246000fd5b6020810160038310615844577f4e487b7100000000000000000000000000000000000000000000000000000000600052602160045260246000fd5b91905290565b60008060006060848603121561585f57600080fd5b505081359360208301359350604090920135919050565b6000815180845260005b8181101561589c57602081850181015186830182015201615880565b818111156158ae576000602083870101525b50601f017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0169290920160200192915050565b6020815260006126526020830184615876565b60006020828403121561590657600080fd5b5035919050565b73ffffffffffffffffffffffffffffffffffffffff8116811461592f57600080fd5b50565b60006020828403121561594457600080fd5b81356150d08161590d565b8035801515811461595f57600080fd5b919050565b6000806000806080858703121561597a57600080fd5b8435935060208501359250604085013591506159986060860161594f565b905092959194509250565b6000602082840312156159b557600080fd5b81356fffffffffffffffffffffffffffffffff811681146150d057600080fd5b600080600080600080608087890312156159ee57600080fd5b863595506159fe6020880161594f565b9450604087013567ffffffffffffffff80821115615a1b57600080fd5b615a278a838b01615714565b90965094506060890135915080821115615a4057600080fd5b50615a4d89828a01615714565b979a9699509497509295939492505050565b63ffffffff841681528260208201526060604082015260006119006060830184615876565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b600060808284031215615ac557600080fd5b6040516080810181811067ffffffffffffffff82111715615b0f577f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b8060405250823581526020830135602082015260408301356040820152606083013560608201528091505092915050565b8183823760009101908152919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b60008219821115615bc157615bc1615b7f565b500190565b60007fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff8203615bf757615bf7615b7f565b5060010190565b600082821015615c1057615c10615b7f565b500390565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601260045260246000fd5b600082615c5357615c53615c15565b500490565b6000817fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0483118215151615615c9057615c90615b7f565b500290565b600060208284031215615ca757600080fd5b81516150d08161590d565b600060208284031215615cc457600080fd5b5051919050565b600067ffffffffffffffff808316818516808303821115615cee57615cee615b7f565b01949350505050565b600067ffffffffffffffff80831681851681830481118215151615615d1e57615d1e615b7f565b02949350505050565b600067ffffffffffffffff83811690831681811015615d4857615d48615b7f565b039392505050565b60008060408385031215615d6357600080fd5b505080516020909101519092909150565b60007f7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff600084136000841385830485118282161615615db557615db5615b7f565b7f80000000000000000000000000000000000000000000000000000000000000006000871286820588128184161615615df057615df0615b7f565b60008712925087820587128484161615615e0c57615e0c615b7f565b87850587128184161615615e2257615e22615b7f565b505050929093029392505050565b600082615e3f57615e3f615c15565b7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff83147f800000000000000000000000000000000000000000000000000000000000000083141615615e9357615e93615b7f565b500590565b600082615ea757615ea7615c15565b500690565b60006fffffffffffffffffffffffffffffffff83811690831681811015615d4857615d48615b7f565b60006fffffffffffffffffffffffffffffffff808316818516808303821115615cee57615cee615b7f565b8183528181602085013750600060208284010152600060207fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0601f840116840101905092915050565b606081526000615f5d606083018789615f00565b8281036020840152615f70818688615f00565b9150508260408301529695505050505050565b600060ff821660ff841680821015615f9d57615f9d615b7f565b90039392505050565b600060ff831680615fb957615fb9615c15565b8060ff8416069150509291505056fea164736f6c634300080f000a"; } diff --git a/packages/contracts-bedrock/test/kontrol/scripts/common.sh b/packages/contracts-bedrock/test/kontrol/scripts/common.sh index 444e6dd71762..0d2fe17ef459 100644 --- a/packages/contracts-bedrock/test/kontrol/scripts/common.sh +++ b/packages/contracts-bedrock/test/kontrol/scripts/common.sh @@ -35,6 +35,7 @@ usage_make_summary() { # Set Run Directory <root>/packages/contracts-bedrock WORKSPACE_DIR=$( cd "$SCRIPT_HOME/../../.." >/dev/null 2>&1 && pwd ) +pushd "$WORKSPACE_DIR" > /dev/null || exit # Variables export KONTROL_FP_DEPLOYMENT="${KONTROL_FP_DEPLOYMENT:-false}" @@ -111,7 +112,6 @@ parse_first_arg() { export LOCAL=true export SCRIPT_TESTS=$SCRIPT_OPTION export CUSTOM_TESTS=$CUSTOM_OPTION - pushd "$WORKSPACE_DIR" > /dev/null || exit elif [ "$1" == "script" ]; then notif "Running in docker container (DEFAULT)" export LOCAL=false @@ -130,7 +130,6 @@ check_kontrol_version() { if [ "$(kontrol version | awk -F': ' '{print$2}')" == "$KONTROLRC" ]; then notif "Kontrol version matches $KONTROLRC" export LOCAL=true - pushd "$WORKSPACE_DIR" > /dev/null || exit else notif "Kontrol version does NOT match $KONTROLRC" notif "Please run 'kup install kontrol --version v$KONTROLRC'" @@ -182,11 +181,16 @@ copy_to_docker() { } clean_docker(){ - notif "Stopping Docker Container" - docker stop "$CONTAINER_NAME" + if [ "$LOCAL" = false ]; then + notif "Cleaning Docker Container" + docker stop "$CONTAINER_NAME" > /dev/null 2>&1 || true + docker rm "$CONTAINER_NAME" > /dev/null 2>&1 || true + sleep 2 # Give time for system to clean up container + else + notif "Not Running in Container. Done." + fi } - docker_exec () { docker exec --user user --workdir /home/user/workspace $CONTAINER_NAME "${@}" } @@ -200,4 +204,5 @@ run () { notif "Running in docker" docker_exec "${@}" fi + return $? # Return the exit code of the command } diff --git a/packages/contracts-bedrock/test/kontrol/scripts/json/clean_json.py b/packages/contracts-bedrock/test/kontrol/scripts/json/clean_json.py index 70f97fad40cd..58746feb3d04 100644 --- a/packages/contracts-bedrock/test/kontrol/scripts/json/clean_json.py +++ b/packages/contracts-bedrock/test/kontrol/scripts/json/clean_json.py @@ -1,7 +1,7 @@ """ Description: Unescapes the JSON produced by the stateDiff modifier - defined in contracts-bedrock/scripts/Deploy.s.sol + defined in contracts-bedrock/scripts/deploy/Deploy.s.sol This script is used in ../make-summary-deployment.sh Usage: @@ -13,7 +13,6 @@ """ import sys -import json def clean_json(input_file): with open(input_file, 'r') as file: 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 40c7fa5778bd..ea7abbf4cc3c 100755 --- a/packages/contracts-bedrock/test/kontrol/scripts/make-summary-deployment.sh +++ b/packages/contracts-bedrock/test/kontrol/scripts/make-summary-deployment.sh @@ -21,12 +21,6 @@ fi cleanup() { trap - # Restore the original script from the backup - if [ -f "$DEPLOY_SCRIPT.bak" ]; then - cp "$DEPLOY_SCRIPT.bak" "$DEPLOY_SCRIPT" - rm "$DEPLOY_SCRIPT.bak" - fi - if [ -f "snapshots/state-diff/Deploy.json" ]; then rm "snapshots/state-diff/Deploy.json" fi @@ -53,18 +47,8 @@ if [ ! -f "snapshots/state-diff/Deploy.json" ]; then touch snapshots/state-diff/Deploy.json; fi -DEPLOY_SCRIPT="./scripts/Deploy.s.sol" conditionally_start_docker -# Create a backup -cp $DEPLOY_SCRIPT $DEPLOY_SCRIPT.bak - -# Replace mustGetAddress by getAddress in Deploy.s.sol -# This is needed because the Kontrol deployment is only a partial -# version of the full Optimism deployment. Since not all the components -# 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 - CONTRACT_NAMES=deployments/kontrol.json SCRIPT_SIG="runKontrolDeployment()" if [ "$KONTROL_FP_DEPLOYMENT" = true ]; then diff --git a/packages/contracts-bedrock/test/kontrol/scripts/run-kontrol.sh b/packages/contracts-bedrock/test/kontrol/scripts/run-kontrol.sh index 2254bdd17f1c..bbaaafdb561f 100755 --- a/packages/contracts-bedrock/test/kontrol/scripts/run-kontrol.sh +++ b/packages/contracts-bedrock/test/kontrol/scripts/run-kontrol.sh @@ -20,6 +20,7 @@ kontrol_build() { --require $lemmas \ --module-import $module \ $rekompile + return $? } kontrol_prove() { @@ -34,61 +35,67 @@ kontrol_prove() { $bug_report \ $break_on_calls \ $break_every_step \ - $auto_abstract \ $tests \ - $use_booster \ --init-node-from $state_diff \ + --kore-rpc-command 'kore-rpc-booster --equation-max-recursion 100' \ --xml-test-report + return $? } -dump_log_results(){ - trap clean_docker ERR - RESULTS_FILE="results-$(date +'%Y-%m-%d-%H-%M-%S').tar.gz" - LOG_PATH="test/kontrol/logs" - RESULTS_LOG="$LOG_PATH/$RESULTS_FILE" +get_log_results(){ + RESULTS_FILE="results-$(date +'%Y-%m-%d-%H-%M-%S').tar.gz" + LOG_PATH="test/kontrol/logs" + RESULTS_LOG="$LOG_PATH/$RESULTS_FILE" - if [ ! -d $LOG_PATH ]; then - mkdir $LOG_PATH - fi - - notif "Generating Results Log: $LOG_PATH" + if [ ! -d $LOG_PATH ]; then + mkdir $LOG_PATH + fi - run tar -czvf results.tar.gz kout-proofs/ > /dev/null 2>&1 - if [ "$LOCAL" = true ]; then - mv results.tar.gz "$RESULTS_LOG" - else - docker cp "$CONTAINER_NAME:/home/user/workspace/results.tar.gz" "$RESULTS_LOG" - fi - if [ -f "$RESULTS_LOG" ]; then - cp "$RESULTS_LOG" "$LOG_PATH/kontrol-results_latest.tar.gz" + notif "Generating Results Log: $RESULTS_LOG" + + run tar -czf results.tar.gz kout-proofs/ > /dev/null 2>&1 + if [ "$LOCAL" = true ]; then + mv results.tar.gz "$RESULTS_LOG" + else + docker cp "$CONTAINER_NAME:/home/user/workspace/results.tar.gz" "$RESULTS_LOG" + # Check if kontrol_prove_report.xml exists in the container and copy it out if it does + if docker exec "$CONTAINER_NAME" test -f /home/user/workspace/kontrol_prove_report.xml; then + docker cp "$CONTAINER_NAME:/home/user/workspace/kontrol_prove_report.xml" "$LOG_PATH/kontrol_prove_report.xml" + notif "Copied kontrol_prove_report.xml to $LOG_PATH" else - notif "Results Log: $RESULTS_LOG not found, skipping.." + notif "kontrol_prove_report.xml not found in container" fi - # Report where the file was generated and placed - notif "Results Log: $(dirname "$RESULTS_LOG") generated" + tar -xzf "$RESULTS_LOG" > /dev/null 2>&1 + fi + if [ -f "$RESULTS_LOG" ]; then + cp "$RESULTS_LOG" "$LOG_PATH/kontrol-results_latest.tar.gz" + else + notif "Results Log: $RESULTS_LOG not found, skipping.." + fi + # Report where the file was generated and placed + notif "Results Log: $(dirname "$RESULTS_LOG") generated" - if [ "$LOCAL" = false ]; then - notif "Results Log: $RESULTS_LOG generated" - RUN_LOG="run-kontrol-$(date +'%Y-%m-%d-%H-%M-%S').log" - docker logs "$CONTAINER_NAME" > "$LOG_PATH/$RUN_LOG" - fi + if [ "$LOCAL" = false ]; then + notif "Results Log: $RESULTS_LOG generated" + RUN_LOG="run-kontrol-$(date +'%Y-%m-%d-%H-%M-%S').log" + docker logs "$CONTAINER_NAME" > "$LOG_PATH/$RUN_LOG" + # Expand the tar folder to kout-proofs for Summary Results and caching + tar -xzf "$RESULTS_LOG" -C "$WORKSPACE_DIR" > /dev/null 2>&1 + fi } # Define the function to run on failure on_failure() { - dump_log_results + get_log_results if [ "$LOCAL" = false ]; then clean_docker fi - notif "Cleanup complete." + notif "Failure Cleanup Complete." exit 1 } -# Set up the trap to run the function on failure -trap on_failure ERR INT - ######################### # kontrol build options # ######################### @@ -108,10 +115,9 @@ regen= ################################# # Tests to symbolically execute # ################################# - # Temporarily unexecuted tests -# "OptimismPortalKontrol.prove_proveWithdrawalTransaction_paused0" \ -- This one is executed below. -# "OptimismPortalKontrol.prove_proveWithdrawalTransaction_paused1" \ +# "OptimismPortalKontrol.prove_proveWithdrawalTransaction_paused0" \ +# "OptimismPortalKontrol.prove_proveWithdrawalTransaction_paused1(" \ # "OptimismPortalKontrol.prove_proveWithdrawalTransaction_paused2" \ # "OptimismPortalKontrol.prove_proveWithdrawalTransaction_paused3" \ # "OptimismPortalKontrol.prove_proveWithdrawalTransaction_paused4" \ @@ -121,27 +127,26 @@ 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_finalizeWithdrawalTransaction_paused" \ - "L1StandardBridgeKontrol.prove_finalizeBridgeERC20_paused" \ - "L1StandardBridgeKontrol.prove_finalizeBridgeETH_paused" \ - "L1ERC721BridgeKontrol.prove_finalizeBridgeERC721_paused" \ - "L1CrossDomainMessengerKontrol.prove_relayMessage_paused" + test_list=( + "OptimismPortal2Kontrol.prove_proveWithdrawalTransaction_paused0" \ + "OptimismPortal2Kontrol.prove_proveWithdrawalTransaction_paused1(" \ + "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" \ + "OptimismPortal2Kontrol.prove_finalizeWithdrawalTransaction_paused" \ + "L1StandardBridgeKontrol.prove_finalizeBridgeERC20_paused" \ + "L1StandardBridgeKontrol.prove_finalizeBridgeETH_paused" \ + "L1ERC721BridgeKontrol.prove_finalizeBridgeERC721_paused" \ + "L1CrossDomainMessengerKontrol.prove_relayMessage_paused" ) elif [ "$CUSTOM_TESTS" != 0 ]; then test_list=( "${@:${CUSTOM_TESTS}}" ) @@ -157,9 +162,9 @@ done max_depth=10000 max_iterations=10000 smt_timeout=100000 -max_workers=7 # Set to 7 since the CI machine has 8 CPUs -# workers is the minimum between max_workers and the length of test_list -# unless no test arguments are provided, in which case we default to max_workers +max_workers=16 # Set to 16 since there are 16 proofs to run +# workers is the minimum between max_workers and the length of test_list unless +# no test arguments are provided, in which case we default to max_workers if [ "$CUSTOM_TESTS" == 0 ] && [ "$SCRIPT_TESTS" == false ]; then workers=${max_workers} else @@ -167,31 +172,46 @@ else fi reinit=--reinit reinit= -break_on_calls=--no-break-on-calls -# break_on_calls= +break_on_calls=--break-on-calls +break_on_calls= break_every_step=--break-every-step break_every_step= -auto_abstract=--auto-abstract-gas -auto_abstract= bug_report=--bug-report bug_report= -use_booster=--use-booster -# use_booster= -state_diff="./snapshots/state-diff/Kontrol-Deploy.json" +state_diff="./snapshots/state-diff/Kontrol-31337.json" ############# # RUN TESTS # ############# +# Set up the trap to run the function on failure +trap on_failure ERR INT TERM +trap clean_docker EXIT conditionally_start_docker +results=() +# Run kontrol_build and store the result kontrol_build +results[0]=$? + +# Run kontrol_prove and store the result kontrol_prove +results[1]=$? -dump_log_results +get_log_results -if [ "$LOCAL" == false ]; then - notif "Stopping docker container" - clean_docker +# Now you can use ${results[0]} and ${results[1]} +# to check the results of kontrol_build and kontrol_prove, respectively +if [ ${results[0]} -ne 0 ] && [ ${results[1]} -ne 0 ]; then + echo "Kontrol Build and Prove Failed" + exit 1 +elif [ ${results[0]} -ne 0 ]; then + echo "Kontrol Build Failed" + exit 1 +elif [ ${results[1]} -ne 0 ]; then + echo "Kontrol Prove Failed" + exit 2 +else + echo "Kontrol Passed" fi notif "DONE" diff --git a/packages/contracts-bedrock/test/legacy/L1BlockNumber.t.sol b/packages/contracts-bedrock/test/legacy/L1BlockNumber.t.sol index 3fad97699232..633a324e4043 100644 --- a/packages/contracts-bedrock/test/legacy/L1BlockNumber.t.sol +++ b/packages/contracts-bedrock/test/legacy/L1BlockNumber.t.sol @@ -1,15 +1,15 @@ // SPDX-License-Identifier: MIT pragma solidity 0.8.15; -// Testing utilities +// Testing import { Test } from "forge-std/Test.sol"; -// Target contract dependencies +// Contracts +import { L1BlockNumber } from "src/legacy/L1BlockNumber.sol"; import { L1Block } from "src/L2/L1Block.sol"; -import { Predeploys } from "src/libraries/Predeploys.sol"; -// Target contract -import { L1BlockNumber } from "src/legacy/L1BlockNumber.sol"; +// Libraries +import { Predeploys } from "src/libraries/Predeploys.sol"; contract L1BlockNumberTest is Test { L1Block lb; diff --git a/packages/contracts-bedrock/test/libraries/Blueprint.t.sol b/packages/contracts-bedrock/test/libraries/Blueprint.t.sol new file mode 100644 index 000000000000..94a30ab99fb0 --- /dev/null +++ b/packages/contracts-bedrock/test/libraries/Blueprint.t.sol @@ -0,0 +1,244 @@ +// SPDX-License-Identifier: MIT +pragma solidity 0.8.15; + +import { Test } from "forge-std/Test.sol"; +import { Blueprint } from "src/libraries/Blueprint.sol"; + +// Used to test that constructor args are appended properly when deploying from a blueprint. +contract ConstructorArgMock { + uint256 public x; + bytes public y; + + constructor(uint256 _x, bytes memory _y) { + x = _x; + y = _y; + } +} + +// Foundry cheatcodes operate on the next call, and since all library methods are internal we would +// just JUMP to them if called directly in the test. Therefore we wrap the library in a contract. +contract BlueprintHarness { + function blueprintDeployerBytecode(bytes memory _initcode) public pure returns (bytes memory) { + return Blueprint.blueprintDeployerBytecode(_initcode); + } + + function parseBlueprintPreamble(bytes memory _bytecode) public pure returns (Blueprint.Preamble memory) { + return Blueprint.parseBlueprintPreamble(_bytecode); + } + + function deployFrom(address _blueprint, bytes32 _salt) public returns (address) { + return Blueprint.deployFrom(_blueprint, _salt); + } + + function deployFrom(address _blueprint, bytes32 _salt, bytes memory _args) public returns (address) { + return Blueprint.deployFrom(_blueprint, _salt, _args); + } + + function bytesToUint(bytes memory _bytes) public pure returns (uint256) { + return Blueprint.bytesToUint(_bytes); + } +} + +contract Blueprint_Test is Test { + BlueprintHarness blueprint; + + function setUp() public { + blueprint = new BlueprintHarness(); + } + + function deployWithCreate2(bytes memory _initcode, bytes32 _salt) public returns (address addr_) { + assembly ("memory-safe") { + addr_ := create2(0, add(_initcode, 0x20), mload(_initcode), _salt) + } + require(addr_ != address(0), "deployWithCreate2: deployment failed"); + } + + // --- We start with the test cases from ERC-5202 --- + + // An example (and trivial!) blueprint contract with no data section, whose initcode is just the STOP instruction. + function test_ERC5202_trivialBlueprint_succeeds() public view { + bytes memory bytecode = hex"FE710000"; + Blueprint.Preamble memory preamble = blueprint.parseBlueprintPreamble(bytecode); + + assertEq(preamble.ercVersion, 0, "100"); + assertEq(preamble.preambleData, hex"", "200"); + assertEq(preamble.initcode, hex"00", "300"); + } + + // An example blueprint contract whose initcode is the trivial STOP instruction and whose data + // section contains the byte 0xFF repeated seven times. + function test_ERC5202_blueprintWithDataSection_succeeds() public view { + // Here, 0xFE71 is the magic header, 0x01 means version 0 + 1 length bit, 0x07 encodes the + // length in bytes of the data section. These are followed by the data section, and then the + // initcode. For illustration, this code with delimiters would be: + // 0xFE71|01|07|FFFFFFFFFFFFFF|00 + bytes memory bytecode = hex"FE710107FFFFFFFFFFFFFF00"; + Blueprint.Preamble memory preamble = blueprint.parseBlueprintPreamble(bytecode); + + assertEq(preamble.ercVersion, 0, "100"); + assertEq(preamble.preambleData, hex"FFFFFFFFFFFFFF", "200"); + assertEq(preamble.initcode, hex"00", "300"); + } + + // An example blueprint whose initcode is the trivial STOP instruction and whose data section + // contains the byte 0xFF repeated 256 times. + function test_ERC5202_blueprintWithLargeDataSection_succeeds() public view { + // Delimited, this would be 0xFE71|02|0100|FF...FF|00 + bytes memory bytecode = + hex"FE71020100FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00"; + Blueprint.Preamble memory preamble = blueprint.parseBlueprintPreamble(bytecode); + + assertEq(preamble.ercVersion, 0, "100"); + assertEq(preamble.preambleData.length, 256, "200"); + for (uint256 i = 0; i < 256; i++) { + assertEq(preamble.preambleData[i], bytes1(0xFF), string.concat("300-", vm.toString(i))); + } + assertEq(preamble.initcode, hex"00", "400"); + } + + // --- Now we add a generic roundtrip test --- + + // Test that a roundtrip from initcode to blueprint to initcode succeeds, i.e. the invariant + // here is that `parseBlueprintPreamble(blueprintDeployerBytecode(x)) = x`. + function testFuzz_roundtrip_succeeds(bytes memory _initcode) public { + vm.assume(_initcode.length > 0); + + // Convert the initcode to match the ERC-5202 blueprint format. + bytes memory blueprintInitcode = blueprint.blueprintDeployerBytecode(_initcode); + + // Deploy the blueprint. + address blueprintAddress = deployWithCreate2(blueprintInitcode, bytes32(0)); + + // Read the blueprint code from the deployed code. + bytes memory blueprintCode = address(blueprintAddress).code; + + // Parse the blueprint preamble and ensure it matches the expected values. + Blueprint.Preamble memory preamble = blueprint.parseBlueprintPreamble(blueprintCode); + assertEq(preamble.ercVersion, 0, "100"); + assertEq(preamble.preambleData, hex"", "200"); + assertEq(preamble.initcode, _initcode, "300"); + } + + // --- Lastly, function-specific unit tests --- + + function test_blueprintDeployerBytecode_emptyInitcode_reverts() public { + bytes memory initcode = ""; + vm.expectRevert(Blueprint.EmptyInitcode.selector); + blueprint.blueprintDeployerBytecode(initcode); + } + + function test_parseBlueprintPreamble_notABlueprint_reverts() public { + // Length too short. + bytes memory invalidBytecode = hex"01"; + vm.expectRevert(Blueprint.NotABlueprint.selector); + blueprint.parseBlueprintPreamble(invalidBytecode); + + // First byte is not 0xFE. + invalidBytecode = hex"0071"; + vm.expectRevert(Blueprint.NotABlueprint.selector); + blueprint.parseBlueprintPreamble(invalidBytecode); + + // Second byte is not 0x71. + invalidBytecode = hex"FE00"; + vm.expectRevert(Blueprint.NotABlueprint.selector); + blueprint.parseBlueprintPreamble(invalidBytecode); + } + + function test_parseBlueprintPreamble_reservedBitsSet_reverts() public { + bytes memory invalidBytecode = hex"FE7103"; + vm.expectRevert(Blueprint.ReservedBitsSet.selector); + blueprint.parseBlueprintPreamble(invalidBytecode); + } + + function test_parseBlueprintPreamble_emptyInitcode_reverts() public { + bytes memory invalidBytecode = hex"FE7100"; + vm.expectRevert(Blueprint.EmptyInitcode.selector); + blueprint.parseBlueprintPreamble(invalidBytecode); + } + + function testFuzz_deployFrom_succeeds(bytes memory _initcode, bytes32 _salt) public { + vm.assume(_initcode.length > 0); + vm.assume(_initcode[0] != 0xef); // https://eips.ethereum.org/EIPS/eip-3541 + + // This deployBytecode prefix is the same bytecode used in `blueprintDeployerBytecode`, and + // it ensures that whatever initcode the fuzzer generates is actually deployable. + bytes memory deployBytecode = bytes.concat(hex"61", bytes2(uint16(_initcode.length)), hex"3d81600a3d39f3"); + bytes memory initcode = bytes.concat(deployBytecode, _initcode); + bytes memory blueprintInitcode = blueprint.blueprintDeployerBytecode(initcode); + + // Deploy the blueprint. + address blueprintAddress = deployWithCreate2(blueprintInitcode, _salt); + + // Deploy from the blueprint. + address deployedContract = Blueprint.deployFrom(blueprintAddress, _salt); + + // Verify the deployment worked. + assertTrue(deployedContract != address(0), "100"); + assertTrue(deployedContract.code.length > 0, "200"); + assertEq(keccak256(deployedContract.code), keccak256(_initcode), "300"); + } + + // Here we deploy a simple mock contract to test that constructor args are appended properly. + function testFuzz_deployFrom_withConstructorArgs_succeeds(uint256 _x, bytes memory _y, bytes32 _salt) public { + bytes memory blueprintInitcode = blueprint.blueprintDeployerBytecode(type(ConstructorArgMock).creationCode); + + // Deploy the blueprint. + address blueprintAddress = deployWithCreate2(blueprintInitcode, _salt); + + // Deploy from the blueprint. + bytes memory args = abi.encode(_x, _y); + address deployedContract = blueprint.deployFrom(blueprintAddress, _salt, args); + + // Verify the deployment worked. + assertTrue(deployedContract != address(0), "100"); + assertTrue(deployedContract.code.length > 0, "200"); + assertEq(keccak256(deployedContract.code), keccak256(type(ConstructorArgMock).runtimeCode), "300"); + assertEq(ConstructorArgMock(deployedContract).x(), _x, "400"); + assertEq(ConstructorArgMock(deployedContract).y(), _y, "500"); + } + + function test_deployFrom_unsupportedERCVersion_reverts() public { + bytes32 salt = bytes32(0); + address blueprintAddress = makeAddr("blueprint"); + + bytes memory invalidBlueprintCode = hex"FE710400"; // ercVersion = uint8(0x04 & 0xfc) >> 2 = 1 + vm.etch(blueprintAddress, invalidBlueprintCode); + vm.expectRevert(abi.encodeWithSelector(Blueprint.UnsupportedERCVersion.selector, 1)); + blueprint.deployFrom(blueprintAddress, salt); + + invalidBlueprintCode = hex"FE71B000"; // ercVersion = uint8(0xB0 & 0xfc) >> 2 = 44 + vm.etch(blueprintAddress, invalidBlueprintCode); + vm.expectRevert(abi.encodeWithSelector(Blueprint.UnsupportedERCVersion.selector, 44)); + blueprint.deployFrom(blueprintAddress, salt); + } + + function test_deployFrom_unexpectedPreambleData_reverts() public { + bytes32 salt = bytes32(0); + address blueprintAddress = makeAddr("blueprint"); + + // Create invalid blueprint code with non-empty preamble data + bytes memory invalidBlueprintCode = hex"FE7101030102030001020304"; + vm.etch(blueprintAddress, invalidBlueprintCode); + + // Expect revert with UnexpectedPreambleData error + vm.expectRevert(abi.encodeWithSelector(Blueprint.UnexpectedPreambleData.selector, hex"010203")); + blueprint.deployFrom(blueprintAddress, salt); + } + + function test_bytesToUint_succeeds() public view { + // These test cases (and the logic for bytesToUint) are taken from forge-std. + assertEq(3, blueprint.bytesToUint(hex"03")); + assertEq(2, blueprint.bytesToUint(hex"02")); + assertEq(255, blueprint.bytesToUint(hex"ff")); + assertEq(29625, blueprint.bytesToUint(hex"73b9")); + + // Additional test cases. + assertEq(0, blueprint.bytesToUint(hex"")); + assertEq(0, blueprint.bytesToUint(hex"00")); + assertEq(3, blueprint.bytesToUint(hex"0003")); + assertEq(3145731, blueprint.bytesToUint(hex"300003")); + assertEq(14545064521499334880, blueprint.bytesToUint(hex"c9da731e871ad8e0")); + assertEq(14545064521499334880, blueprint.bytesToUint(hex"00c9da731e871ad8e0")); + assertEq(type(uint256).max, blueprint.bytesToUint(bytes.concat(bytes32(type(uint256).max)))); + } +} diff --git a/packages/contracts-bedrock/test/libraries/Bytes.t.sol b/packages/contracts-bedrock/test/libraries/Bytes.t.sol index 2cfbfd3dff60..e38d369ab55d 100644 --- a/packages/contracts-bedrock/test/libraries/Bytes.t.sol +++ b/packages/contracts-bedrock/test/libraries/Bytes.t.sol @@ -67,19 +67,23 @@ contract Bytes_slice_Test is Test { /// @notice Tests that the `slice` function correctly updates the free memory pointer depending /// on the length of the slice. + /// The calls to `bound` are to reduce the number of times that `assume` is triggered. function testFuzz_slice_memorySafety_succeeds(bytes memory _input, uint256 _start, uint256 _length) public { + vm.assume(_input.length > 0); + // The start should never be more than the length of the input bytes array - 1 - vm.assume(_start < _input.length); + _start = bound(_start, 0, _input.length - 1); + // The length should never be more than the length of the input bytes array - the starting // slice index. - vm.assume(_length <= _input.length - _start); + _length = bound(_length, 0, _input.length - _start); // Grab the free memory pointer before the slice operation uint64 initPtr; assembly { initPtr := mload(0x40) } - uint64 expectedPtr = uint64(initPtr + 0x20 + ((_length + 0x1f) & ~uint256(0x1f))); + uint64 expectedPtr = uint64((initPtr + 0x20 + _length + 0x1f) & ~uint256(0x1f)); // Ensure that all memory outside of the expected range is safe. vm.expectSafeMemory(initPtr, expectedPtr); @@ -107,7 +111,7 @@ contract Bytes_slice_Test is Test { // Note that we use a slightly less efficient, but equivalent method of rounding // up `_length` to the next multiple of 32 than is used in the `slice` function. // This is to diff test the method used in `slice`. - uint64 _expectedPtr = uint64(initPtr + 0x20 + (((_length + 0x1F) >> 5) << 5)); + uint64 _expectedPtr = uint64(((initPtr + 0x20 + _length + 0x1F) >> 5) << 5); assertEq(finalPtr, _expectedPtr); // Sanity check for equivalence of the rounding methods. @@ -144,11 +148,15 @@ contract Bytes_slice_TestFail is Test { /// @notice Tests that, when given a start index `n` that is greater than /// `type(uint256).max - n`, the `slice` function reverts. + /// The calls to `bound` are to reduce the number of times that `assume` is triggered. function testFuzz_slice_rangeOverflows_reverts(bytes memory _input, uint256 _start, uint256 _length) public { // Ensure that `_length` is a realistic length of a slice. This is to make sure // we revert on the correct require statement. + _length = bound(_length, 0, _input.length == 0 ? 0 : _input.length - 1); vm.assume(_length < _input.length); + // Ensure that `_start` will overflow if `_length` is added to it. + _start = bound(_start, type(uint256).max - _length, type(uint256).max); vm.assume(_start > type(uint256).max - _length); vm.expectRevert("slice_overflow"); diff --git a/packages/contracts-bedrock/test/libraries/SafeCall.t.sol b/packages/contracts-bedrock/test/libraries/SafeCall.t.sol index e3a9e05fdbb2..5bd3fb3a4ab7 100644 --- a/packages/contracts-bedrock/test/libraries/SafeCall.t.sol +++ b/packages/contracts-bedrock/test/libraries/SafeCall.t.sol @@ -3,59 +3,65 @@ pragma solidity 0.8.15; // Testing utilities import { Test } from "forge-std/Test.sol"; +import { StdCheatsSafe } from "forge-std/StdCheats.sol"; // Target contract import { SafeCall } from "src/libraries/SafeCall.sol"; contract SafeCall_Test is Test { - /// @dev Tests that the `send` function succeeds. - function testFuzz_send_succeeds(address from, address to, uint256 gas, uint64 value) external { - vm.assume(from.balance == 0); - vm.assume(to.balance == 0); - // no precompiles (mainnet) - assumeNotPrecompile(to); - // don't call the vm - vm.assume(to != address(vm)); - vm.assume(from != address(vm)); - // don't call the console - vm.assume(to != address(0x000000000000000000636F6e736F6c652e6c6f67)); - // don't call the create2 deployer - vm.assume(to != address(0x4e59b44847b379578588920cA78FbF26c0B4956C)); - vm.assume(to != address(this)); + /// @notice Helper function to deduplicate code. Makes all assumptions required for these tests. + function assumeNot(address _addr) internal { + vm.assume(_addr.balance == 0); + vm.assume(_addr != address(this)); + vm.assume(uint256(uint160(_addr)) > uint256(256)); // TODO temp fix until new forge-std release with modern + // precompiles: https://github.com/foundry-rs/forge-std/pull/594 + assumeAddressIsNot(_addr, StdCheatsSafe.AddressType.ForgeAddress, StdCheatsSafe.AddressType.Precompile); + } - assertEq(from.balance, 0, "from balance is 0"); - vm.deal(from, value); - assertEq(from.balance, value, "from balance not dealt"); + /// @notice Internal helper function for `send` tests + function sendTest(address _from, address _to, uint64 _gas, uint256 _value) internal { + assumeNot(_from); + assumeNot(_to); - uint256[2] memory balancesBefore = [from.balance, to.balance]; + assertEq(_from.balance, 0, "from balance is 0"); + vm.deal(_from, _value); + assertEq(_from.balance, _value, "from balance not dealt"); - vm.expectCall(to, value, bytes("")); - vm.prank(from); - bool success = SafeCall.send(to, gas, value); + uint256[2] memory balancesBefore = [_from.balance, _to.balance]; + + vm.expectCall(_to, _value, bytes("")); + vm.prank(_from); + bool success; + if (_gas == 0) { + success = SafeCall.send({ _target: _to, _value: _value }); + } else { + success = SafeCall.send({ _target: _to, _gas: _gas, _value: _value }); + } assertTrue(success, "send not successful"); - if (from == to) { - assertEq(from.balance, balancesBefore[0], "Self-send did not change balance"); + if (_from == _to) { + assertEq(_from.balance, balancesBefore[0], "Self-send did not change balance"); } else { - assertEq(from.balance, balancesBefore[0] - value, "from balance not drained"); - assertEq(to.balance, balancesBefore[1] + value, "to balance received"); + assertEq(_from.balance, balancesBefore[0] - _value, "from balance not drained"); + assertEq(_to.balance, balancesBefore[1] + _value, "to balance received"); } } + /// @dev Tests that the `send` function succeeds. + function testFuzz_send_succeeds(address _from, address _to, uint256 _value) external { + sendTest({ _from: _from, _to: _to, _gas: 0, _value: _value }); + } + + /// @dev Tests that the `send` function with value succeeds. + function testFuzz_sendWithGas_succeeds(address _from, address _to, uint64 _gas, uint256 _value) external { + vm.assume(_gas != 0); + sendTest({ _from: _from, _to: _to, _gas: _gas, _value: _value }); + } + /// @dev Tests that `call` succeeds. function testFuzz_call_succeeds(address from, address to, uint256 gas, uint64 value, bytes memory data) external { - vm.assume(from.balance == 0); - vm.assume(to.balance == 0); - // no precompiles (mainnet) - assumeNotPrecompile(to); - // don't call the vm - vm.assume(to != address(vm)); - vm.assume(from != address(vm)); - // don't call the console - vm.assume(to != address(0x000000000000000000636F6e736F6c652e6c6f67)); - // don't call the create2 deployer - vm.assume(to != address(0x4e59b44847b379578588920cA78FbF26c0B4956C)); - vm.assume(to != address(this)); + assumeNot(from); + assumeNot(to); assertEq(from.balance, 0, "from balance is 0"); vm.deal(from, value); @@ -86,18 +92,8 @@ contract SafeCall_Test is Test { ) external { - vm.assume(from.balance == 0); - vm.assume(to.balance == 0); - // no precompiles (mainnet) - assumeNotPrecompile(to); - // don't call the vm - vm.assume(to != address(vm)); - vm.assume(from != address(vm)); - // don't call the console - vm.assume(to != address(0x000000000000000000636F6e736F6c652e6c6f67)); - // don't call the create2 deployer - vm.assume(to != address(0x4e59b44847b379578588920cA78FbF26c0B4956C)); - vm.assume(to != address(this)); + assumeNot(from); + assumeNot(to); assertEq(from.balance, 0, "from balance is 0"); vm.deal(from, value); 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/periphery/drippie/Drippie.t.sol b/packages/contracts-bedrock/test/periphery/drippie/Drippie.t.sol index 748abdf309d8..66c2a8d69b19 100644 --- a/packages/contracts-bedrock/test/periphery/drippie/Drippie.t.sol +++ b/packages/contracts-bedrock/test/periphery/drippie/Drippie.t.sol @@ -125,6 +125,9 @@ contract Drippie_Test is Test { assertTrue(cfg.interval > 0); } + // Drip count is 0 before creating the drip. + assertEq(drippie.getDripCount(), 0); + vm.prank(drippie.owner()); drippie.create(dripName, cfg); @@ -148,6 +151,12 @@ contract Drippie_Test is Test { assertEq(a.data, b.data); assertEq(a.value, b.value); } + + // Drip count is 1 after creating the drip. + assertEq(drippie.getDripCount(), 1); + + // Name of the first created drip is the same as the name of the drip. + assertEq(drippie.created(0), dripName); } /// @notice Ensures that the same drip cannot be created two times. 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 02cc4c479263..bd4d22de8285 100644 --- a/packages/contracts-bedrock/test/periphery/drippie/dripchecks/CheckBalanceLow.t.sol +++ b/packages/contracts-bedrock/test/periphery/drippie/dripchecks/CheckBalanceLow.t.sol @@ -16,6 +16,11 @@ contract CheckBalanceLowTest is Test { c = new CheckBalanceLow(); } + /// @notice Test that the `name` function returns the correct value. + function test_name_succeeds() external view { + assertEq(c.name(), "CheckBalanceLow"); + } + /// @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 view { 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 c85b510e41a0..95cebc115266 100644 --- a/packages/contracts-bedrock/test/periphery/drippie/dripchecks/CheckGelatoLow.t.sol +++ b/packages/contracts-bedrock/test/periphery/drippie/dripchecks/CheckGelatoLow.t.sol @@ -5,23 +5,26 @@ import { Test } from "forge-std/Test.sol"; import { CheckGelatoLow, IGelatoTreasury } from "src/periphery/drippie/dripchecks/CheckGelatoLow.sol"; /// @title MockGelatoTreasury -/// @notice Mocks the Gelato treasury for testing purposes. Allows arbitrary -/// setting of user balances. +/// @notice Mocks the Gelato treasury for testing purposes. Allows arbitrary setting of balances. contract MockGelatoTreasury is IGelatoTreasury { - mapping(address => mapping(address => uint256)) private tokenBalances; + mapping(address => mapping(address => uint256)) private totalDeposited; + mapping(address => mapping(address => uint256)) private totalWithdrawn; - function setTokenBalance(address _user, address _token, uint256 _balance) external { - tokenBalances[_token][_user] = _balance; + function totalDepositedAmount(address _user, address _token) external view override returns (uint256) { + return totalDeposited[_token][_user]; } - function userTokenBalance(address _user, address _token) external view returns (uint256) { - return tokenBalances[_token][_user]; + function totalWithdrawnAmount(address _user, address _token) external view override returns (uint256) { + return totalWithdrawn[_token][_user]; + } + + function setTotalDepositedAmount(address _user, address _token, uint256 _amount) external { + totalDeposited[_token][_user] = _amount; } } /// @title CheckGelatoLowTest -/// @notice Tests the CheckGelatoLow contract via fuzzing both the success case -/// and the failure case. +/// @notice Tests the CheckGelatoLow contract via fuzzing both the success and failure cases. contract CheckGelatoLowTest is Test { /// @notice An instance of the CheckGelatoLow contract. CheckGelatoLow c; @@ -38,13 +41,20 @@ contract CheckGelatoLowTest is Test { gelato = new MockGelatoTreasury(); } + /// @notice Test that the `name` function returns the correct value. + function test_name_succeeds() external view { + assertEq(c.name(), "CheckGelatoLow"); + } + /// @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 view { CheckGelatoLow.Params memory p = CheckGelatoLow.Params({ treasury: address(gelato), threshold: _threshold, recipient: _recipient }); - vm.assume(gelato.userTokenBalance(_recipient, eth) < _threshold); + vm.assume( + gelato.totalDepositedAmount(_recipient, eth) - gelato.totalWithdrawnAmount(_recipient, eth) < _threshold + ); assertEq(c.check(abi.encode(p)), true); } @@ -56,7 +66,7 @@ contract CheckGelatoLowTest is Test { CheckGelatoLow.Params memory p = CheckGelatoLow.Params({ treasury: address(gelato), threshold: _threshold, recipient: _recipient }); - gelato.setTokenBalance(_recipient, eth, _threshold); + gelato.setTotalDepositedAmount(_recipient, eth, _threshold); assertEq(c.check(abi.encode(p)), false); } diff --git a/packages/contracts-bedrock/test/periphery/drippie/dripchecks/CheckSecrets.t.sol b/packages/contracts-bedrock/test/periphery/drippie/dripchecks/CheckSecrets.t.sol index 5afb843df3a5..745cad2b934f 100644 --- a/packages/contracts-bedrock/test/periphery/drippie/dripchecks/CheckSecrets.t.sol +++ b/packages/contracts-bedrock/test/periphery/drippie/dripchecks/CheckSecrets.t.sol @@ -26,6 +26,11 @@ contract CheckSecretsTest is Test { c = new CheckSecrets(); } + /// @notice Test that the `name` function returns the correct value. + function test_name_succeeds() external view { + assertEq(c.name(), "CheckSecrets"); + } + /// @notice Test that basic secret revealing works. function test_reveal_succeeds() external { // Simple reveal and check assertions. 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 7057df0776dd..3396d8eb9b6c 100644 --- a/packages/contracts-bedrock/test/periphery/drippie/dripchecks/CheckTrue.t.sol +++ b/packages/contracts-bedrock/test/periphery/drippie/dripchecks/CheckTrue.t.sol @@ -15,6 +15,11 @@ contract CheckTrueTest is Test { c = new CheckTrue(); } + /// @notice Test that the `name` function returns the correct value. + function test_name_succeeds() external view { + assertEq(c.name(), "CheckTrue"); + } + /// @notice Fuzz the `check` function and assert that it always returns true. 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 a888a367c4e7..a0ef75f28d55 100644 --- a/packages/contracts-bedrock/test/periphery/faucet/Faucet.t.sol +++ b/packages/contracts-bedrock/test/periphery/faucet/Faucet.t.sol @@ -106,6 +106,8 @@ contract FaucetTest is Faucet_Initializer { 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 9aab06fde007..22b6effc7ed4 100644 --- a/packages/contracts-bedrock/test/periphery/op-nft/Optimist.t.sol +++ b/packages/contracts-bedrock/test/periphery/op-nft/Optimist.t.sol @@ -3,6 +3,7 @@ pragma solidity >=0.6.2 <0.9.0; // Testing utilities import { Test } from "forge-std/Test.sol"; +import { IMulticall3 } from "forge-std/interfaces/IMulticall3.sol"; import { AttestationStation } from "src/periphery/op-nft/AttestationStation.sol"; import { Optimist } from "src/periphery/op-nft/Optimist.sol"; import { OptimistAllowlist } from "src/periphery/op-nft/OptimistAllowlist.sol"; @@ -11,21 +12,6 @@ import { OptimistInviterHelper } from "test/mocks/OptimistInviterHelper.sol"; import { Strings } from "@openzeppelin/contracts/utils/Strings.sol"; import { IERC721 } from "@openzeppelin/contracts/token/ERC721/IERC721.sol"; -interface IMulticall3 { - struct Call3 { - address target; - bool allowFailure; - bytes callData; - } - - struct Result { - bool success; - bytes returnData; - } - - function aggregate3(Call3[] calldata calls) external payable returns (Result[] memory returnData); -} - library Multicall { bytes internal constant code = hex"6080604052600436106100f35760003560e01c80634d2301cc1161008a578063a8b0574e11610059578063a8b0574e1461025a578063bce38bd714610275578063c3077fa914610288578063ee82ac5e1461029b57600080fd5b80634d2301cc146101ec57806372425d9d1461022157806382ad56cb1461023457806386d516e81461024757600080fd5b80633408e470116100c65780633408e47014610191578063399542e9146101a45780633e64a696146101c657806342cbb15c146101d957600080fd5b80630f28c97d146100f8578063174dea711461011a578063252dba421461013a57806327e86d6e1461015b575b600080fd5b34801561010457600080fd5b50425b6040519081526020015b60405180910390f35b61012d610128366004610a85565b6102ba565b6040516101119190610bbe565b61014d610148366004610a85565b6104ef565b604051610111929190610bd8565b34801561016757600080fd5b50437fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0140610107565b34801561019d57600080fd5b5046610107565b6101b76101b2366004610c60565b610690565b60405161011193929190610cba565b3480156101d257600080fd5b5048610107565b3480156101e557600080fd5b5043610107565b3480156101f857600080fd5b50610107610207366004610ce2565b73ffffffffffffffffffffffffffffffffffffffff163190565b34801561022d57600080fd5b5044610107565b61012d610242366004610a85565b6106ab565b34801561025357600080fd5b5045610107565b34801561026657600080fd5b50604051418152602001610111565b61012d610283366004610c60565b61085a565b6101b7610296366004610a85565b610a1a565b3480156102a757600080fd5b506101076102b6366004610d18565b4090565b60606000828067ffffffffffffffff8111156102d8576102d8610d31565b60405190808252806020026020018201604052801561031e57816020015b6040805180820190915260008152606060208201528152602001906001900390816102f65790505b5092503660005b8281101561047757600085828151811061034157610341610d60565b6020026020010151905087878381811061035d5761035d610d60565b905060200281019061036f9190610d8f565b6040810135958601959093506103886020850185610ce2565b73ffffffffffffffffffffffffffffffffffffffff16816103ac6060870187610dcd565b6040516103ba929190610e32565b60006040518083038185875af1925050503d80600081146103f7576040519150601f19603f3d011682016040523d82523d6000602084013e6103fc565b606091505b50602080850191909152901515808452908501351761046d577f08c379a000000000000000000000000000000000000000000000000000000000600052602060045260176024527f4d756c746963616c6c333a2063616c6c206661696c656400000000000000000060445260846000fd5b5050600101610325565b508234146104e6576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601a60248201527f4d756c746963616c6c333a2076616c7565206d69736d6174636800000000000060448201526064015b60405180910390fd5b50505092915050565b436060828067ffffffffffffffff81111561050c5761050c610d31565b60405190808252806020026020018201604052801561053f57816020015b606081526020019060019003908161052a5790505b5091503660005b8281101561068657600087878381811061056257610562610d60565b90506020028101906105749190610e42565b92506105836020840184610ce2565b73ffffffffffffffffffffffffffffffffffffffff166105a66020850185610dcd565b6040516105b4929190610e32565b6000604051808303816000865af19150503d80600081146105f1576040519150601f19603f3d011682016040523d82523d6000602084013e6105f6565b606091505b5086848151811061060957610609610d60565b602090810291909101015290508061067d576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601760248201527f4d756c746963616c6c333a2063616c6c206661696c656400000000000000000060448201526064016104dd565b50600101610546565b5050509250929050565b43804060606106a086868661085a565b905093509350939050565b6060818067ffffffffffffffff8111156106c7576106c7610d31565b60405190808252806020026020018201604052801561070d57816020015b6040805180820190915260008152606060208201528152602001906001900390816106e55790505b5091503660005b828110156104e657600084828151811061073057610730610d60565b6020026020010151905086868381811061074c5761074c610d60565b905060200281019061075e9190610e76565b925061076d6020840184610ce2565b73ffffffffffffffffffffffffffffffffffffffff166107906040850185610dcd565b60405161079e929190610e32565b6000604051808303816000865af19150503d80600081146107db576040519150601f19603f3d011682016040523d82523d6000602084013e6107e0565b606091505b506020808401919091529015158083529084013517610851577f08c379a000000000000000000000000000000000000000000000000000000000600052602060045260176024527f4d756c746963616c6c333a2063616c6c206661696c656400000000000000000060445260646000fd5b50600101610714565b6060818067ffffffffffffffff81111561087657610876610d31565b6040519080825280602002602001820160405280156108bc57816020015b6040805180820190915260008152606060208201528152602001906001900390816108945790505b5091503660005b82811015610a105760008482815181106108df576108df610d60565b602002602001015190508686838181106108fb576108fb610d60565b905060200281019061090d9190610e42565b925061091c6020840184610ce2565b73ffffffffffffffffffffffffffffffffffffffff1661093f6020850185610dcd565b60405161094d929190610e32565b6000604051808303816000865af19150503d806000811461098a576040519150601f19603f3d011682016040523d82523d6000602084013e61098f565b606091505b506020830152151581528715610a07578051610a07576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601760248201527f4d756c746963616c6c333a2063616c6c206661696c656400000000000000000060448201526064016104dd565b506001016108c3565b5050509392505050565b6000806060610a2b60018686610690565b919790965090945092505050565b60008083601f840112610a4b57600080fd5b50813567ffffffffffffffff811115610a6357600080fd5b6020830191508360208260051b8501011115610a7e57600080fd5b9250929050565b60008060208385031215610a9857600080fd5b823567ffffffffffffffff811115610aaf57600080fd5b610abb85828601610a39565b90969095509350505050565b6000815180845260005b81811015610aed57602081850181015186830182015201610ad1565b81811115610aff576000602083870101525b50601f017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0169290920160200192915050565b600082825180855260208086019550808260051b84010181860160005b84811015610bb1578583037fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe001895281518051151584528401516040858501819052610b9d81860183610ac7565b9a86019a9450505090830190600101610b4f565b5090979650505050505050565b602081526000610bd16020830184610b32565b9392505050565b600060408201848352602060408185015281855180845260608601915060608160051b870101935082870160005b82811015610c52577fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffa0888703018452610c40868351610ac7565b95509284019290840190600101610c06565b509398975050505050505050565b600080600060408486031215610c7557600080fd5b83358015158114610c8557600080fd5b9250602084013567ffffffffffffffff811115610ca157600080fd5b610cad86828701610a39565b9497909650939450505050565b838152826020820152606060408201526000610cd96060830184610b32565b95945050505050565b600060208284031215610cf457600080fd5b813573ffffffffffffffffffffffffffffffffffffffff81168114610bd157600080fd5b600060208284031215610d2a57600080fd5b5035919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b600082357fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff81833603018112610dc357600080fd5b9190910192915050565b60008083357fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe1843603018112610e0257600080fd5b83018035915067ffffffffffffffff821115610e1d57600080fd5b602001915036819003821315610a7e57600080fd5b8183823760009101908152919050565b600082357fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc1833603018112610dc357600080fd5b600082357fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffa1833603018112610dc357600080fdfea2646970667358221220bb2b5c71a328032f97c676ae39a1ec2148d3e5d6f73d95e9b17910152d61f16264736f6c634300080c0033"; diff --git a/packages/contracts-bedrock/test/safe-tools/SafeTestTools.sol b/packages/contracts-bedrock/test/safe-tools/SafeTestTools.sol index 1c5a505095a6..34386f5e3923 100644 --- a/packages/contracts-bedrock/test/safe-tools/SafeTestTools.sol +++ b/packages/contracts-bedrock/test/safe-tools/SafeTestTools.sol @@ -54,7 +54,7 @@ struct SafeInstance { library Sort { /// @dev Sorts an array of addresses in place - function sort(address[] memory arr) public pure returns (address[] memory) { + function sort(address[] memory arr) internal pure returns (address[] memory) { LibSort.sort(arr); return arr; } @@ -62,9 +62,9 @@ library Sort { library SafeTestLib { /// @dev The address of foundry's VM contract - address constant VM_ADDR = 0x7109709ECfa91a80626fF3989D68f67F5b1DD12D; + address internal constant VM_ADDR = 0x7109709ECfa91a80626fF3989D68f67F5b1DD12D; /// @dev The address of the first owner in the linked list of owners - address constant SENTINEL_OWNERS = address(0x1); + address internal constant SENTINEL_OWNERS = address(0x1); /// @dev Get the address from a private key function getAddr(uint256 pk) internal pure returns (address) { diff --git a/packages/contracts-bedrock/test/Safe/DeployOwnership.t.sol b/packages/contracts-bedrock/test/safe/DeployOwnership.t.sol similarity index 80% rename from packages/contracts-bedrock/test/Safe/DeployOwnership.t.sol rename to packages/contracts-bedrock/test/safe/DeployOwnership.t.sol index a382b8f2cd7c..8e3a939686cb 100644 --- a/packages/contracts-bedrock/test/Safe/DeployOwnership.t.sol +++ b/packages/contracts-bedrock/test/safe/DeployOwnership.t.sol @@ -8,17 +8,16 @@ import { GuardianConfig, DeputyGuardianModuleConfig, LivenessModuleConfig -} from "scripts/DeployOwnership.s.sol"; +} from "scripts/deploy/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"; +import { LivenessGuard } from "src/safe/LivenessGuard.sol"; +import { LivenessModule } from "src/safe/LivenessModule.sol"; +import { DeputyGuardianModule } from "src/safe/DeputyGuardianModule.sol"; contract DeployOwnershipTest is Test, DeployOwnership { address internal constant SENTINEL_MODULES = address(0x1); @@ -36,17 +35,26 @@ contract DeployOwnershipTest is Test, DeployOwnership { 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 configuration. - function test_exampleFoundationSafe() public { - Safe foundationSafe = Safe(payable(mustGetAddress("FoundationSafe"))); + /// @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(); - _checkSafeConfig(exampleFoundationConfig, foundationSafe); + // 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. @@ -71,7 +79,6 @@ contract DeployOwnershipTest is Test, DeployOwnership { // Module Checks address livenessModule = mustGetAddress("LivenessModule"); - address deputyGuardianModule = mustGetAddress("DeputyGuardianModule"); (address[] memory modules, address nextModule) = ModuleManager(securityCouncilSafe).getModulesPaginated(SENTINEL_MODULES, 2); assertEq(modules.length, 1); @@ -90,7 +97,7 @@ contract DeployOwnershipTest is Test, DeployOwnership { } /// @dev Test the example Guardian Safe configuration. - function test_exampleGuardianSafe() public { + function test_exampleGuardianSafe() public view { Safe guardianSafe = Safe(payable(mustGetAddress("GuardianSafe"))); address[] memory owners = new address[](1); owners[0] = mustGetAddress("SecurityCouncilSafe"); diff --git a/packages/contracts-bedrock/test/Safe/DeputyGuardianModule.t.sol b/packages/contracts-bedrock/test/safe/DeputyGuardianModule.t.sol similarity index 81% rename from packages/contracts-bedrock/test/Safe/DeputyGuardianModule.t.sol rename to packages/contracts-bedrock/test/safe/DeputyGuardianModule.t.sol index 28fa47bb3138..84824a5ff694 100644 --- a/packages/contracts-bedrock/test/Safe/DeputyGuardianModule.t.sol +++ b/packages/contracts-bedrock/test/safe/DeputyGuardianModule.t.sol @@ -1,16 +1,23 @@ // SPDX-License-Identifier: MIT pragma solidity 0.8.15; +// Testing import { CommonTest } from "test/setup/CommonTest.sol"; -import { ForgeArtifacts, Abi } from "scripts/ForgeArtifacts.sol"; +import { ForgeArtifacts, Abi } from "scripts/libraries/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"; +// Contracts +import { DeputyGuardianModule } from "src/safe/DeputyGuardianModule.sol"; +// Libraries import "src/dispute/lib/Types.sol"; +// Interfaces +import { IDisputeGame } from "src/dispute/interfaces/IDisputeGame.sol"; +import { IFaultDisputeGame } from "src/dispute/interfaces/IFaultDisputeGame.sol"; +import { IAnchorStateRegistry } from "src/dispute/interfaces/IAnchorStateRegistry.sol"; + contract DeputyGuardianModule_TestInit is CommonTest, SafeTestTools { using SafeTestLib for SafeInstance; @@ -148,6 +155,43 @@ contract DeputyGuardianModule_Unpause_TestFail is DeputyGuardianModule_Unpause_T } } +contract DeputyGuardianModule_SetAnchorState_TestFail is DeputyGuardianModule_TestInit { + function test_setAnchorState_notDeputyGuardian_reverts() external { + IAnchorStateRegistry asr = IAnchorStateRegistry(makeAddr("asr")); + vm.expectRevert(abi.encodeWithSelector(Unauthorized.selector)); + deputyGuardianModule.setAnchorState(asr, IFaultDisputeGame(address(0))); + } + + function test_setAnchorState_targetReverts_reverts() external { + IAnchorStateRegistry asr = IAnchorStateRegistry(makeAddr("asr")); + vm.mockCallRevert( + address(asr), + abi.encodeWithSelector(asr.setAnchorState.selector), + "AnchorStateRegistry: setAnchorState reverted" + ); + vm.prank(address(deputyGuardian)); + vm.expectRevert( + abi.encodeWithSelector(ExecutionFailed.selector, "AnchorStateRegistry: setAnchorState reverted") + ); + deputyGuardianModule.setAnchorState(asr, IFaultDisputeGame(address(0))); + } +} + +contract DeputyGuardianModule_SetAnchorState_Test is DeputyGuardianModule_TestInit { + function test_setAnchorState_succeeds() external { + IAnchorStateRegistry asr = IAnchorStateRegistry(makeAddr("asr")); + vm.mockCall( + address(asr), + abi.encodeWithSelector(IAnchorStateRegistry.setAnchorState.selector, IFaultDisputeGame(address(0))), + "" + ); + vm.expectEmit(address(safeInstance.safe)); + emit ExecutionFromModuleSuccess(address(deputyGuardianModule)); + vm.prank(address(deputyGuardian)); + deputyGuardianModule.setAnchorState(asr, IFaultDisputeGame(address(0))); + } +} + contract DeputyGuardianModule_BlacklistDisputeGame_Test is DeputyGuardianModule_TestInit { /// @dev Tests that `blacklistDisputeGame` successfully blacklists a dispute game when called by the deputy /// guardian. @@ -239,10 +283,13 @@ contract DeputyGuardianModule_NoPortalCollisions_Test is DeputyGuardianModule_Te /// @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); + string[] memory excludes = new string[](5); + excludes[0] = "src/dispute/lib/*"; + excludes[1] = "src/L1/OptimismPortal2.sol"; + excludes[2] = "src/L1/OptimismPortalInterop.sol"; + excludes[3] = "src/L1/interfaces/IOptimismPortal2.sol"; + excludes[4] = "src/L1/interfaces/IOptimismPortalInterop.sol"; + 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; diff --git a/packages/contracts-bedrock/test/Safe/LivenessGuard.t.sol b/packages/contracts-bedrock/test/safe/LivenessGuard.t.sol similarity index 96% rename from packages/contracts-bedrock/test/Safe/LivenessGuard.t.sol rename to packages/contracts-bedrock/test/safe/LivenessGuard.t.sol index b8d67506da6d..41db45ac974a 100644 --- a/packages/contracts-bedrock/test/Safe/LivenessGuard.t.sol +++ b/packages/contracts-bedrock/test/safe/LivenessGuard.t.sol @@ -10,7 +10,7 @@ import { Enum } from "safe-contracts/common/Enum.sol"; import "test/safe-tools/SafeTestTools.sol"; import { EnumerableSet } from "@openzeppelin/contracts/utils/structs/EnumerableSet.sol"; -import { LivenessGuard } from "src/Safe/LivenessGuard.sol"; +import { LivenessGuard } from "src/safe/LivenessGuard.sol"; /// @dev A wrapper contract exposing the length of the ownersBefore set in the LivenessGuard. contract WrappedGuard is LivenessGuard { @@ -235,7 +235,16 @@ contract LivenessGuard_FuzzOwnerManagement_Test is StdCheats, StdUtils, Liveness ) external { - vm.assume(changes.length < 20); + // Cut down the changes array to a maximum of 20. + // We don't use vm.assume to avoid throwing out too many inputs. + OwnerChange[] memory boundedChanges = new OwnerChange[](bound(changes.length, 0, 20)); + for (uint256 i; i < boundedChanges.length; i++) { + boundedChanges[i] = changes[i]; + } + + // Update the original array. + changes = boundedChanges; + // Initialize the safe with more owners than changes, to ensure we don't try to remove them all initialOwners = bound(initialOwners, changes.length, 2 * changes.length); diff --git a/packages/contracts-bedrock/test/Safe/LivenessModule.t.sol b/packages/contracts-bedrock/test/safe/LivenessModule.t.sol similarity index 99% rename from packages/contracts-bedrock/test/Safe/LivenessModule.t.sol rename to packages/contracts-bedrock/test/safe/LivenessModule.t.sol index f27e8aab4c50..060dfb389ca4 100644 --- a/packages/contracts-bedrock/test/Safe/LivenessModule.t.sol +++ b/packages/contracts-bedrock/test/safe/LivenessModule.t.sol @@ -7,8 +7,8 @@ import { OwnerManager } from "safe-contracts/base/OwnerManager.sol"; import { Enum } from "safe-contracts/common/Enum.sol"; import "test/safe-tools/SafeTestTools.sol"; -import { LivenessModule } from "src/Safe/LivenessModule.sol"; -import { LivenessGuard } from "src/Safe/LivenessGuard.sol"; +import { LivenessModule } from "src/safe/LivenessModule.sol"; +import { LivenessGuard } from "src/safe/LivenessGuard.sol"; contract LivenessModule_TestInit is Test, SafeTestTools { using SafeTestLib for SafeInstance; diff --git a/packages/contracts-bedrock/test/Safe/SafeSigners.t.sol b/packages/contracts-bedrock/test/safe/SafeSigners.t.sol similarity index 98% rename from packages/contracts-bedrock/test/Safe/SafeSigners.t.sol rename to packages/contracts-bedrock/test/safe/SafeSigners.t.sol index 2006a44b9e71..a6caf2a487ff 100644 --- a/packages/contracts-bedrock/test/Safe/SafeSigners.t.sol +++ b/packages/contracts-bedrock/test/safe/SafeSigners.t.sol @@ -3,7 +3,7 @@ pragma solidity 0.8.15; import { Test } from "forge-std/Test.sol"; import { GnosisSafe as Safe } from "safe-contracts/GnosisSafe.sol"; -import { SafeSigners } from "src/Safe/SafeSigners.sol"; +import { SafeSigners } from "src/safe/SafeSigners.sol"; import "test/safe-tools/SafeTestTools.sol"; contract SafeSigners_Test is Test, SafeTestTools { diff --git a/packages/contracts-bedrock/test/setup/CommonTest.sol b/packages/contracts-bedrock/test/setup/CommonTest.sol index 86ed109fd7b3..e731b3a5ba76 100644 --- a/packages/contracts-bedrock/test/setup/CommonTest.sol +++ b/packages/contracts-bedrock/test/setup/CommonTest.sol @@ -6,7 +6,7 @@ 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"; +import "scripts/deploy/DeployConfig.s.sol"; /// @title CommonTest /// @dev An extenstion to `Test` that sets up the optimism smart contracts. @@ -18,7 +18,7 @@ contract CommonTest is Test, Setup, Events { FFIInterface constant ffi = FFIInterface(address(uint160(uint256(keccak256(abi.encode("optimism.ffi")))))); - bool usePlasmaOverride; + bool useAltDAOverride; bool useFaultProofs; address customGasToken; bool useInteropOverride; @@ -32,8 +32,8 @@ contract CommonTest is Test, Setup, Events { Setup.setUp(); // Override the config after the deploy script initialized the config - if (usePlasmaOverride) { - deploy.cfg().setUsePlasma(true); + if (useAltDAOverride) { + deploy.cfg().setUseAltDA(true); } if (useFaultProofs) { deploy.cfg().setUseFaultProofs(true); @@ -119,14 +119,14 @@ contract CommonTest is Test, Setup, Events { useFaultProofs = true; } - function enablePlasma() public { + function enableAltDA() 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 plasma after deployment. Consider overriding `setUp`."); + revert("CommonTest: Cannot enable altda after deployment. Consider overriding `setUp`."); } - usePlasmaOverride = true; + useAltDAOverride = true; } function enableCustomGasToken(address _token) public { @@ -147,6 +147,7 @@ contract CommonTest is Test, Setup, Events { revert("CommonTest: Cannot enable interop after deployment. Consider overriding `setUp`."); } + useFaultProofs = true; useInteropOverride = true; } } diff --git a/packages/contracts-bedrock/test/setup/FFIInterface.sol b/packages/contracts-bedrock/test/setup/FFIInterface.sol index e7cca3c8335d..727402a37c2c 100644 --- a/packages/contracts-bedrock/test/setup/FFIInterface.sol +++ b/packages/contracts-bedrock/test/setup/FFIInterface.sol @@ -4,6 +4,7 @@ pragma solidity 0.8.15; import { Types } from "src/libraries/Types.sol"; import { Vm } from "forge-std/Vm.sol"; import { Strings } from "@openzeppelin/contracts/utils/Strings.sol"; +import { Process } from "scripts/libraries/Process.sol"; /// @title FFIInterface /// @notice This contract is set into state using `etch` and therefore must not have constructor logic. @@ -27,7 +28,7 @@ contract FFIInterface { cmds[7] = vm.toString(_tx.gasLimit); cmds[8] = vm.toString(_tx.data); - bytes memory result = vm.ffi(cmds); + bytes memory result = Process.run(cmds); ( bytes32 stateRoot, bytes32 storageRoot, @@ -61,7 +62,7 @@ contract FFIInterface { cmds[7] = vm.toString(_gasLimit); cmds[8] = vm.toString(_data); - bytes memory result = vm.ffi(cmds); + bytes memory result = Process.run(cmds); return abi.decode(result, (bytes32)); } @@ -87,7 +88,7 @@ contract FFIInterface { cmds[7] = vm.toString(_gasLimit); cmds[8] = vm.toString(_data); - bytes memory result = vm.ffi(cmds); + bytes memory result = Process.run(cmds); return abi.decode(result, (bytes32)); } @@ -109,7 +110,7 @@ contract FFIInterface { cmds[5] = Strings.toHexString(uint256(_messagePasserStorageRoot)); cmds[6] = Strings.toHexString(uint256(_latestBlockhash)); - bytes memory result = vm.ffi(cmds); + bytes memory result = Process.run(cmds); return abi.decode(result, (bytes32)); } @@ -138,7 +139,7 @@ contract FFIInterface { cmds[9] = vm.toString(_gas); cmds[10] = vm.toString(_data); - bytes memory result = vm.ffi(cmds); + bytes memory result = Process.run(cmds); return abi.decode(result, (bytes32)); } @@ -157,7 +158,7 @@ contract FFIInterface { cmds[10] = vm.toString(txn.l1BlockHash); cmds[11] = vm.toString(txn.logIndex); - bytes memory result = vm.ffi(cmds); + bytes memory result = Process.run(cmds); return abi.decode(result, (bytes)); } @@ -183,7 +184,7 @@ contract FFIInterface { cmds[7] = vm.toString(_gasLimit); cmds[8] = vm.toString(_data); - bytes memory result = vm.ffi(cmds); + bytes memory result = Process.run(cmds); return abi.decode(result, (bytes)); } @@ -194,7 +195,7 @@ contract FFIInterface { cmds[2] = "decodeVersionedNonce"; cmds[3] = vm.toString(nonce); - bytes memory result = vm.ffi(cmds); + bytes memory result = Process.run(cmds); return abi.decode(result, (uint256, uint256)); } @@ -207,7 +208,7 @@ contract FFIInterface { cmds[1] = "trie"; cmds[2] = variant; - return abi.decode(vm.ffi(cmds), (bytes32, bytes, bytes, bytes[])); + return abi.decode(Process.run(cmds), (bytes32, bytes, bytes, bytes[])); } function getCannonMemoryProof(uint32 pc, uint32 insn) external returns (bytes32, bytes memory) { @@ -217,7 +218,7 @@ contract FFIInterface { cmds[2] = "cannonMemoryProof"; cmds[3] = vm.toString(pc); cmds[4] = vm.toString(insn); - bytes memory result = vm.ffi(cmds); + bytes memory result = Process.run(cmds); (bytes32 memRoot, bytes memory proof) = abi.decode(result, (bytes32, bytes)); return (memRoot, proof); } @@ -239,7 +240,79 @@ contract FFIInterface { cmds[4] = vm.toString(insn); cmds[5] = vm.toString(memAddr); cmds[6] = vm.toString(memVal); - bytes memory result = vm.ffi(cmds); + bytes memory result = Process.run(cmds); + (bytes32 memRoot, bytes memory proof) = abi.decode(result, (bytes32, bytes)); + return (memRoot, proof); + } + + function getCannonMemoryProof( + uint32 pc, + uint32 insn, + uint32 memAddr, + uint32 memVal, + uint32 memAddr2, + uint32 memVal2 + ) + external + returns (bytes32, bytes memory) + { + string[] memory cmds = new string[](9); + cmds[0] = "scripts/go-ffi/go-ffi"; + cmds[1] = "diff"; + cmds[2] = "cannonMemoryProof"; + cmds[3] = vm.toString(pc); + cmds[4] = vm.toString(insn); + cmds[5] = vm.toString(memAddr); + cmds[6] = vm.toString(memVal); + cmds[7] = vm.toString(memAddr2); + cmds[8] = vm.toString(memVal2); + bytes memory result = Process.run(cmds); + (bytes32 memRoot, bytes memory proof) = abi.decode(result, (bytes32, bytes)); + return (memRoot, proof); + } + + function getCannonMemoryProof2( + uint32 pc, + uint32 insn, + uint32 memAddr, + uint32 memVal, + uint32 memAddrForProof + ) + external + returns (bytes32, bytes memory) + { + string[] memory cmds = new string[](8); + cmds[0] = "scripts/go-ffi/go-ffi"; + cmds[1] = "diff"; + cmds[2] = "cannonMemoryProof2"; + cmds[3] = vm.toString(pc); + cmds[4] = vm.toString(insn); + cmds[5] = vm.toString(memAddr); + cmds[6] = vm.toString(memVal); + cmds[7] = vm.toString(memAddrForProof); + bytes memory result = Process.run(cmds); + (bytes32 memRoot, bytes memory proof) = abi.decode(result, (bytes32, bytes)); + return (memRoot, proof); + } + + function getCannonMemoryProofWrongLeaf( + uint32 pc, + uint32 insn, + uint32 memAddr, + uint32 memVal + ) + external + returns (bytes32, bytes memory) + { + string[] memory cmds = new string[](7); + cmds[0] = "scripts/go-ffi/go-ffi"; + cmds[1] = "diff"; + cmds[2] = "cannonMemoryProofWrongLeaf"; + cmds[3] = vm.toString(pc); + cmds[4] = vm.toString(insn); + cmds[5] = vm.toString(memAddr); + cmds[6] = vm.toString(memVal); + bytes memory result = Process.run(cmds); (bytes32 memRoot, bytes memory proof) = abi.decode(result, (bytes32, bytes)); return (memRoot, proof); } @@ -251,7 +324,7 @@ contract FFIInterface { cmds[2] = "encodeScalarEcotone"; cmds[3] = vm.toString(_basefeeScalar); cmds[4] = vm.toString(_blobbasefeeScalar); - bytes memory result = vm.ffi(cmds); + bytes memory result = Process.run(cmds); return abi.decode(result, (bytes32)); } @@ -261,7 +334,40 @@ contract FFIInterface { cmds[1] = "diff"; cmds[2] = "decodeScalarEcotone"; cmds[3] = vm.toString(_scalar); - bytes memory result = vm.ffi(cmds); + bytes memory result = Process.run(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 = Process.run(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 = Process.run(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 8d319dfd8301..3a09519203ac 100644 --- a/packages/contracts-bedrock/test/setup/Setup.sol +++ b/packages/contracts-bedrock/test/setup/Setup.sol @@ -1,44 +1,54 @@ // SPDX-License-Identifier: MIT pragma solidity 0.8.15; +// Testing import { console2 as console } from "forge-std/console2.sol"; +import { Vm } from "forge-std/Vm.sol"; + +// Scripts +import { DeployConfig } from "scripts/deploy/DeployConfig.s.sol"; +import { Deploy } from "scripts/deploy/Deploy.s.sol"; +import { Fork, LATEST_FORK } from "scripts/libraries/Config.sol"; +import { L2Genesis, L1Dependencies } from "scripts/L2Genesis.s.sol"; +import { OutputMode, Fork, ForkUtils } from "scripts/libraries/Config.sol"; +import { Executables } from "scripts/libraries/Executables.sol"; + +// Libraries 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"; -import { L2ERC721Bridge } from "src/L2/L2ERC721Bridge.sol"; -import { BaseFeeVault } from "src/L2/BaseFeeVault.sol"; -import { SequencerFeeVault } from "src/L2/SequencerFeeVault.sol"; -import { L1FeeVault } from "src/L2/L1FeeVault.sol"; -import { GasPriceOracle } from "src/L2/GasPriceOracle.sol"; -import { L1Block } from "src/L2/L1Block.sol"; -import { LegacyMessagePasser } from "src/legacy/LegacyMessagePasser.sol"; -import { GovernanceToken } from "src/governance/GovernanceToken.sol"; -import { OptimismMintableERC20Factory } from "src/universal/OptimismMintableERC20Factory.sol"; -import { StandardBridge } from "src/universal/StandardBridge.sol"; -import { FeeVault } from "src/universal/FeeVault.sol"; -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"; -import { L1StandardBridge } from "src/L1/L1StandardBridge.sol"; -import { AddressManager } from "src/legacy/AddressManager.sol"; -import { L1ERC721Bridge } from "src/L1/L1ERC721Bridge.sol"; import { AddressAliasHelper } from "src/vendor/AddressAliasHelper.sol"; -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"; + +// Interfaces +import { IOptimismPortal } from "src/L1/interfaces/IOptimismPortal.sol"; +import { IOptimismPortal2 } from "src/L1/interfaces/IOptimismPortal2.sol"; +import { IL1CrossDomainMessenger } from "src/L1/interfaces/IL1CrossDomainMessenger.sol"; +import { IL2OutputOracle } from "src/L1/interfaces/IL2OutputOracle.sol"; +import { ISystemConfig } from "src/L1/interfaces/ISystemConfig.sol"; +import { ISuperchainConfig } from "src/L1/interfaces/ISuperchainConfig.sol"; +import { IDataAvailabilityChallenge } from "src/L1/interfaces/IDataAvailabilityChallenge.sol"; +import { IL1StandardBridge } from "src/L1/interfaces/IL1StandardBridge.sol"; +import { IProtocolVersions } from "src/L1/interfaces/IProtocolVersions.sol"; +import { IL1ERC721Bridge } from "src/L1/interfaces/IL1ERC721Bridge.sol"; +import { IDisputeGameFactory } from "src/dispute/interfaces/IDisputeGameFactory.sol"; +import { IDelayedWETH } from "src/dispute/interfaces/IDelayedWETH.sol"; +import { IAnchorStateRegistry } from "src/dispute/interfaces/IAnchorStateRegistry.sol"; +import { IL2CrossDomainMessenger } from "src/L2/interfaces/IL2CrossDomainMessenger.sol"; +import { IL2StandardBridgeInterop } from "src/L2/interfaces/IL2StandardBridgeInterop.sol"; +import { IL2ToL1MessagePasser } from "src/L2/interfaces/IL2ToL1MessagePasser.sol"; +import { IL2ERC721Bridge } from "src/L2/interfaces/IL2ERC721Bridge.sol"; +import { IOptimismMintableERC20Factory } from "src/universal/interfaces/IOptimismMintableERC20Factory.sol"; +import { IAddressManager } from "src/legacy/interfaces/IAddressManager.sol"; +import { IOptimismERC20Factory } from "src/L2/interfaces/IOptimismERC20Factory.sol"; +import { IBaseFeeVault } from "src/L2/interfaces/IBaseFeeVault.sol"; +import { ISequencerFeeVault } from "src/L2/interfaces/ISequencerFeeVault.sol"; +import { IL1FeeVault } from "src/L2/interfaces/IL1FeeVault.sol"; +import { IGasPriceOracle } from "src/L2/interfaces/IGasPriceOracle.sol"; +import { IL1Block } from "src/L2/interfaces/IL1Block.sol"; +import { ISuperchainWETH } from "src/L2/interfaces/ISuperchainWETH.sol"; +import { IETHLiquidity } from "src/L2/interfaces/IETHLiquidity.sol"; +import { IWETH } from "src/universal/interfaces/IWETH.sol"; +import { IGovernanceToken } from "src/governance/interfaces/IGovernanceToken.sol"; +import { ILegacyMessagePasser } from "src/legacy/interfaces/ILegacyMessagePasser.sol"; /// @title Setup /// @dev This contact is responsible for setting up the contracts in state. It currently @@ -46,7 +56,7 @@ import { WETH } from "src/L2/WETH.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); + using ForkUtils for Fork; /// @notice The address of the foundry Vm contract. Vm private constant vm = Vm(0x7109709ECfa91a80626fF3989D68f67F5b1DD12D); @@ -59,39 +69,47 @@ contract Setup { 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; - DelayedWETH delayedWeth; - L2OutputOracle l2OutputOracle; - SystemConfig systemConfig; - L1StandardBridge l1StandardBridge; - L1CrossDomainMessenger l1CrossDomainMessenger; - AddressManager addressManager; - L1ERC721Bridge l1ERC721Bridge; - OptimismMintableERC20Factory l1OptimismMintableERC20Factory; - ProtocolVersions protocolVersions; - SuperchainConfig superchainConfig; - DataAvailabilityChallenge dataAvailabilityChallenge; - AnchorStateRegistry anchorStateRegistry; - - L2CrossDomainMessenger l2CrossDomainMessenger = - L2CrossDomainMessenger(payable(Predeploys.L2_CROSS_DOMAIN_MESSENGER)); - L2StandardBridge l2StandardBridge = L2StandardBridge(payable(Predeploys.L2_STANDARD_BRIDGE)); - L2ToL1MessagePasser l2ToL1MessagePasser = L2ToL1MessagePasser(payable(Predeploys.L2_TO_L1_MESSAGE_PASSER)); - OptimismMintableERC20Factory l2OptimismMintableERC20Factory = - OptimismMintableERC20Factory(Predeploys.OPTIMISM_MINTABLE_ERC20_FACTORY); - L2ERC721Bridge l2ERC721Bridge = L2ERC721Bridge(Predeploys.L2_ERC721_BRIDGE); - BaseFeeVault baseFeeVault = BaseFeeVault(payable(Predeploys.BASE_FEE_VAULT)); - SequencerFeeVault sequencerFeeVault = SequencerFeeVault(payable(Predeploys.SEQUENCER_FEE_WALLET)); - L1FeeVault l1FeeVault = L1FeeVault(payable(Predeploys.L1_FEE_VAULT)); - GasPriceOracle gasPriceOracle = GasPriceOracle(Predeploys.GAS_PRICE_ORACLE); - 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)); + Fork l2Fork = LATEST_FORK; + + // L1 contracts + IDisputeGameFactory disputeGameFactory; + IAnchorStateRegistry anchorStateRegistry; + IDelayedWETH delayedWeth; + IOptimismPortal optimismPortal; + IOptimismPortal2 optimismPortal2; + IL2OutputOracle l2OutputOracle; + ISystemConfig systemConfig; + IL1StandardBridge l1StandardBridge; + IL1CrossDomainMessenger l1CrossDomainMessenger; + IAddressManager addressManager; + IL1ERC721Bridge l1ERC721Bridge; + IOptimismMintableERC20Factory l1OptimismMintableERC20Factory; + IProtocolVersions protocolVersions; + ISuperchainConfig superchainConfig; + IDataAvailabilityChallenge dataAvailabilityChallenge; + + // L2 contracts + IL2CrossDomainMessenger l2CrossDomainMessenger = + IL2CrossDomainMessenger(payable(Predeploys.L2_CROSS_DOMAIN_MESSENGER)); + IL2StandardBridgeInterop l2StandardBridge = IL2StandardBridgeInterop(payable(Predeploys.L2_STANDARD_BRIDGE)); + IL2ToL1MessagePasser l2ToL1MessagePasser = IL2ToL1MessagePasser(payable(Predeploys.L2_TO_L1_MESSAGE_PASSER)); + IOptimismMintableERC20Factory l2OptimismMintableERC20Factory = + IOptimismMintableERC20Factory(Predeploys.OPTIMISM_MINTABLE_ERC20_FACTORY); + IL2ERC721Bridge l2ERC721Bridge = IL2ERC721Bridge(Predeploys.L2_ERC721_BRIDGE); + IBaseFeeVault baseFeeVault = IBaseFeeVault(payable(Predeploys.BASE_FEE_VAULT)); + ISequencerFeeVault sequencerFeeVault = ISequencerFeeVault(payable(Predeploys.SEQUENCER_FEE_WALLET)); + IL1FeeVault l1FeeVault = IL1FeeVault(payable(Predeploys.L1_FEE_VAULT)); + IGasPriceOracle gasPriceOracle = IGasPriceOracle(Predeploys.GAS_PRICE_ORACLE); + IL1Block l1Block = IL1Block(Predeploys.L1_BLOCK_ATTRIBUTES); + IGovernanceToken governanceToken = IGovernanceToken(Predeploys.GOVERNANCE_TOKEN); + ILegacyMessagePasser legacyMessagePasser = ILegacyMessagePasser(Predeploys.LEGACY_MESSAGE_PASSER); + IWETH weth = IWETH(payable(Predeploys.WETH)); + ISuperchainWETH superchainWeth = ISuperchainWETH(payable(Predeploys.SUPERCHAIN_WETH)); + IETHLiquidity ethLiquidity = IETHLiquidity(Predeploys.ETH_LIQUIDITY); + + // TODO: Replace with OptimismSuperchainERC20Factory when updating pragmas + IOptimismERC20Factory l2OptimismSuperchainERC20Factory = + IOptimismERC20Factory(Predeploys.OPTIMISM_SUPERCHAIN_ERC20_FACTORY); /// @dev Deploys the Deploy contract without including its bytecode in the bytecode /// of this contract by fetching the bytecode dynamically using `vm.getCode()`. @@ -125,21 +143,21 @@ contract Setup { deploy.run(); console.log("Setup: completed L1 deployment, registering addresses now"); - optimismPortal = OptimismPortal(deploy.mustGetAddress("OptimismPortalProxy")); - optimismPortal2 = OptimismPortal2(deploy.mustGetAddress("OptimismPortalProxy")); - disputeGameFactory = DisputeGameFactory(deploy.mustGetAddress("DisputeGameFactoryProxy")); - delayedWeth = DelayedWETH(deploy.mustGetAddress("DelayedWETHProxy")); - l2OutputOracle = L2OutputOracle(deploy.mustGetAddress("L2OutputOracleProxy")); - systemConfig = SystemConfig(deploy.mustGetAddress("SystemConfigProxy")); - l1StandardBridge = L1StandardBridge(deploy.mustGetAddress("L1StandardBridgeProxy")); - l1CrossDomainMessenger = L1CrossDomainMessenger(deploy.mustGetAddress("L1CrossDomainMessengerProxy")); - addressManager = AddressManager(deploy.mustGetAddress("AddressManager")); - l1ERC721Bridge = L1ERC721Bridge(deploy.mustGetAddress("L1ERC721BridgeProxy")); + optimismPortal = IOptimismPortal(deploy.mustGetAddress("OptimismPortalProxy")); + optimismPortal2 = IOptimismPortal2(deploy.mustGetAddress("OptimismPortalProxy")); + disputeGameFactory = IDisputeGameFactory(deploy.mustGetAddress("DisputeGameFactoryProxy")); + delayedWeth = IDelayedWETH(deploy.mustGetAddress("DelayedWETHProxy")); + l2OutputOracle = IL2OutputOracle(deploy.mustGetAddress("L2OutputOracleProxy")); + systemConfig = ISystemConfig(deploy.mustGetAddress("SystemConfigProxy")); + l1StandardBridge = IL1StandardBridge(deploy.mustGetAddress("L1StandardBridgeProxy")); + l1CrossDomainMessenger = IL1CrossDomainMessenger(deploy.mustGetAddress("L1CrossDomainMessengerProxy")); + addressManager = IAddressManager(deploy.mustGetAddress("AddressManager")); + l1ERC721Bridge = IL1ERC721Bridge(deploy.mustGetAddress("L1ERC721BridgeProxy")); l1OptimismMintableERC20Factory = - OptimismMintableERC20Factory(deploy.mustGetAddress("OptimismMintableERC20FactoryProxy")); - protocolVersions = ProtocolVersions(deploy.mustGetAddress("ProtocolVersionsProxy")); - superchainConfig = SuperchainConfig(deploy.mustGetAddress("SuperchainConfigProxy")); - anchorStateRegistry = AnchorStateRegistry(deploy.mustGetAddress("AnchorStateRegistryProxy")); + IOptimismMintableERC20Factory(deploy.mustGetAddress("OptimismMintableERC20FactoryProxy")); + protocolVersions = IProtocolVersions(deploy.mustGetAddress("ProtocolVersionsProxy")); + superchainConfig = ISuperchainConfig(deploy.mustGetAddress("SuperchainConfigProxy")); + anchorStateRegistry = IAnchorStateRegistry(deploy.mustGetAddress("AnchorStateRegistryProxy")); vm.label(address(l2OutputOracle), "L2OutputOracle"); vm.label(deploy.mustGetAddress("L2OutputOracleProxy"), "L2OutputOracleProxy"); @@ -166,9 +184,9 @@ contract Setup { vm.label(deploy.mustGetAddress("SuperchainConfigProxy"), "SuperchainConfigProxy"); vm.label(AddressAliasHelper.applyL1ToL2Alias(address(l1CrossDomainMessenger)), "L1CrossDomainMessenger_aliased"); - if (deploy.cfg().usePlasma()) { + if (deploy.cfg().useAltDA()) { dataAvailabilityChallenge = - DataAvailabilityChallenge(deploy.mustGetAddress("DataAvailabilityChallengeProxy")); + IDataAvailabilityChallenge(deploy.mustGetAddress("DataAvailabilityChallengeProxy")); vm.label(address(dataAvailabilityChallenge), "DataAvailabilityChallengeProxy"); vm.label(deploy.mustGetAddress("DataAvailabilityChallenge"), "DataAvailabilityChallenge"); } @@ -177,9 +195,10 @@ contract Setup { /// @dev Sets up the L2 contracts. Depends on `L1()` being called first. function L2() public { - console.log("Setup: creating L2 genesis, with output mode %d", uint256(l2OutputMode)); + console.log("Setup: creating L2 genesis with fork %s", l2Fork.toString()); l2Genesis.runWithOptions( - l2OutputMode, + OutputMode.NONE, + l2Fork, L1Dependencies({ l1CrossDomainMessengerProxy: payable(address(l1CrossDomainMessenger)), l1StandardBridgeProxy: payable(address(l1StandardBridge)), @@ -208,6 +227,10 @@ contract Setup { labelPredeploy(Predeploys.EAS); labelPredeploy(Predeploys.SCHEMA_REGISTRY); labelPredeploy(Predeploys.WETH); + labelPredeploy(Predeploys.SUPERCHAIN_WETH); + labelPredeploy(Predeploys.ETH_LIQUIDITY); + labelPredeploy(Predeploys.OPTIMISM_SUPERCHAIN_ERC20_FACTORY); + labelPredeploy(Predeploys.OPTIMISM_SUPERCHAIN_ERC20_BEACON); // L2 Preinstalls labelPreinstall(Preinstalls.MultiCall3); @@ -219,9 +242,12 @@ contract Setup { labelPreinstall(Preinstalls.DeterministicDeploymentProxy); labelPreinstall(Preinstalls.MultiSend_v130); labelPreinstall(Preinstalls.Permit2); - labelPreinstall(Preinstalls.SenderCreator); - labelPreinstall(Preinstalls.EntryPoint); + labelPreinstall(Preinstalls.SenderCreator_v060); + labelPreinstall(Preinstalls.EntryPoint_v060); + labelPreinstall(Preinstalls.SenderCreator_v070); + labelPreinstall(Preinstalls.EntryPoint_v070); labelPreinstall(Preinstalls.BeaconBlockRoots); + labelPreinstall(Preinstalls.CreateX); console.log("Setup: completed L2 genesis"); } diff --git a/packages/contracts-bedrock/test/universal/CrossDomainMessenger.t.sol b/packages/contracts-bedrock/test/universal/CrossDomainMessenger.t.sol index f2a9a8d43d85..1fab9c6db1ce 100644 --- a/packages/contracts-bedrock/test/universal/CrossDomainMessenger.t.sol +++ b/packages/contracts-bedrock/test/universal/CrossDomainMessenger.t.sol @@ -11,7 +11,7 @@ import { Predeploys } from "src/libraries/Predeploys.sol"; import { Hashing } from "src/libraries/Hashing.sol"; import { Encoding } from "src/libraries/Encoding.sol"; -import { L1CrossDomainMessenger } from "src/L1/L1CrossDomainMessenger.sol"; +import { IL1CrossDomainMessenger } from "src/L1/interfaces/IL1CrossDomainMessenger.sol"; // CrossDomainMessenger_Test is for testing functionality which is common to both the L1 and L2 // CrossDomainMessenger contracts. For simplicity, we use the L1 Messenger as the test contract. @@ -45,11 +45,11 @@ contract CrossDomainMessenger_BaseGas_Test is Bridge_Initializer { contract ExternalRelay is Test { address internal op; address internal fuzzedSender; - L1CrossDomainMessenger internal l1CrossDomainMessenger; + IL1CrossDomainMessenger internal l1CrossDomainMessenger; event FailedRelayedMessage(bytes32 indexed msgHash); - constructor(L1CrossDomainMessenger _l1Messenger, address _op) { + constructor(IL1CrossDomainMessenger _l1Messenger, address _op) { l1CrossDomainMessenger = _l1Messenger; op = _op; } diff --git a/packages/contracts-bedrock/test/universal/FeeVault.t.sol b/packages/contracts-bedrock/test/universal/FeeVault.t.sol index 2196644dc2be..b9630d73b3f6 100644 --- a/packages/contracts-bedrock/test/universal/FeeVault.t.sol +++ b/packages/contracts-bedrock/test/universal/FeeVault.t.sol @@ -12,14 +12,20 @@ contract FeeVault_Test is Bridge_Initializer { /// @dev Tests that the constructor sets the correct values. function test_constructor_l1FeeVault_succeeds() external view { assertEq(l1FeeVault.RECIPIENT(), deploy.cfg().l1FeeVaultRecipient()); + assertEq(l1FeeVault.recipient(), deploy.cfg().l1FeeVaultRecipient()); assertEq(l1FeeVault.MIN_WITHDRAWAL_AMOUNT(), deploy.cfg().l1FeeVaultMinimumWithdrawalAmount()); + assertEq(l1FeeVault.minWithdrawalAmount(), deploy.cfg().l1FeeVaultMinimumWithdrawalAmount()); assertEq(uint8(l1FeeVault.WITHDRAWAL_NETWORK()), uint8(FeeVault.WithdrawalNetwork.L1)); + assertEq(uint8(l1FeeVault.withdrawalNetwork()), uint8(FeeVault.WithdrawalNetwork.L1)); } /// @dev Tests that the constructor sets the correct values. function test_constructor_baseFeeVault_succeeds() external view { assertEq(baseFeeVault.RECIPIENT(), deploy.cfg().baseFeeVaultRecipient()); + assertEq(baseFeeVault.recipient(), deploy.cfg().baseFeeVaultRecipient()); assertEq(baseFeeVault.MIN_WITHDRAWAL_AMOUNT(), deploy.cfg().baseFeeVaultMinimumWithdrawalAmount()); + assertEq(baseFeeVault.minWithdrawalAmount(), deploy.cfg().baseFeeVaultMinimumWithdrawalAmount()); assertEq(uint8(baseFeeVault.WITHDRAWAL_NETWORK()), uint8(FeeVault.WithdrawalNetwork.L1)); + assertEq(uint8(baseFeeVault.withdrawalNetwork()), 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 985b7bad8eb9..1e84ce2958cf 100644 --- a/packages/contracts-bedrock/test/universal/OptimismMintableERC20.t.sol +++ b/packages/contracts-bedrock/test/universal/OptimismMintableERC20.t.sol @@ -2,7 +2,7 @@ pragma solidity 0.8.15; import { Bridge_Initializer } from "test/setup/Bridge_Initializer.sol"; -import { ILegacyMintableERC20, IOptimismMintableERC20 } from "src/universal/IOptimismMintableERC20.sol"; +import { ILegacyMintableERC20, IOptimismMintableERC20 } from "src/universal/interfaces/IOptimismMintableERC20.sol"; import { IERC165 } from "@openzeppelin/contracts/utils/introspection/IERC165.sol"; contract OptimismMintableERC20_Test is Bridge_Initializer { @@ -46,6 +46,20 @@ contract OptimismMintableERC20_Test is Bridge_Initializer { assertEq(L2Token.balanceOf(alice), 100); } + function test_allowance_permit2_max() external view { + assertEq(L2Token.allowance(alice, L2Token.PERMIT2()), type(uint256).max); + } + + function test_permit2_transferFrom() external { + vm.prank(address(l2StandardBridge)); + L2Token.mint(alice, 100); + + assertEq(L2Token.balanceOf(bob), 0); + vm.prank(L2Token.PERMIT2()); + L2Token.transferFrom(alice, bob, 100); + assertEq(L2Token.balanceOf(bob), 100); + } + function test_mint_notBridge_reverts() external { // NOT the bridge vm.expectRevert("OptimismMintableERC20: only bridge can mint and burn"); diff --git a/packages/contracts-bedrock/test/universal/OptimismMintableERC20Factory.t.sol b/packages/contracts-bedrock/test/universal/OptimismMintableERC20Factory.t.sol index d1919a5ff555..07aa2c61958d 100644 --- a/packages/contracts-bedrock/test/universal/OptimismMintableERC20Factory.t.sol +++ b/packages/contracts-bedrock/test/universal/OptimismMintableERC20Factory.t.sol @@ -1,35 +1,37 @@ // SPDX-License-Identifier: MIT pragma solidity 0.8.15; -// Testing utilities +// Testing import { Bridge_Initializer } from "test/setup/Bridge_Initializer.sol"; import { NextImpl } from "test/mocks/NextImpl.sol"; import { EIP1967Helper } from "test/mocks/EIP1967Helper.sol"; -// Target contract dependencies +// Contracts import { OptimismMintableERC20 } from "src/universal/OptimismMintableERC20.sol"; +import { OptimismMintableERC20Factory } from "src/universal/OptimismMintableERC20Factory.sol"; import { Proxy } from "src/universal/Proxy.sol"; -// Target contract -import { OptimismMintableERC20Factory } from "src/universal/OptimismMintableERC20Factory.sol"; +// Interfaces +import { IOptimismMintableERC20Factory } from "src/universal/interfaces/IOptimismMintableERC20Factory.sol"; contract OptimismMintableTokenFactory_Test is Bridge_Initializer { event StandardL2TokenCreated(address indexed remoteToken, address indexed localToken); event OptimismMintableERC20Created(address indexed localToken, address indexed remoteToken, address deployer); - /// @dev Tests that the constructor is initialized correctly. + /// @notice Tests that the constructor is initialized correctly. function test_constructor_succeeds() external { - OptimismMintableERC20Factory impl = new OptimismMintableERC20Factory(); + IOptimismMintableERC20Factory impl = IOptimismMintableERC20Factory(address(new OptimismMintableERC20Factory())); assertEq(address(impl.BRIDGE()), address(0)); assertEq(address(impl.bridge()), address(0)); } - /// @dev Tests that the proxy is initialized correctly. + /// @notice Tests that the proxy is initialized correctly. function test_initialize_succeeds() external view { assertEq(address(l1OptimismMintableERC20Factory.BRIDGE()), address(l1StandardBridge)); assertEq(address(l1OptimismMintableERC20Factory.bridge()), address(l1StandardBridge)); } + /// @notice Tests that the upgrade is successful. function test_upgrading_succeeds() external { Proxy proxy = Proxy(deploy.mustGetAddress("OptimismMintableERC20FactoryProxy")); // Check an unused slot before upgrading. @@ -49,60 +51,156 @@ contract OptimismMintableTokenFactory_Test is Bridge_Initializer { assertEq(slot21Expected, slot21After); } - function test_createStandardL2Token_succeeds() external { - address remote = address(4); + /// @notice Test that calling `createStandardL2Token` with valid parameters succeeds. + function test_createStandardL2Token_succeeds( + address _caller, + address _remoteToken, + string memory _name, + string memory _symbol + ) + external + { + // Assume + vm.assume(_remoteToken != address(0)); + // Arrange // Defaults to 18 decimals - address local = calculateTokenAddress(remote, "Beep", "BOOP", 18); + address local = _calculateTokenAddress(_remoteToken, _name, _symbol, 18); + + vm.expectEmit(address(l2OptimismMintableERC20Factory)); + emit StandardL2TokenCreated(_remoteToken, local); - vm.expectEmit(true, true, true, true); - emit StandardL2TokenCreated(remote, local); + vm.expectEmit(address(l2OptimismMintableERC20Factory)); + emit OptimismMintableERC20Created(local, _remoteToken, _caller); - vm.expectEmit(true, true, true, true); - emit OptimismMintableERC20Created(local, remote, alice); + // Act + vm.prank(_caller); + address addr = l2OptimismMintableERC20Factory.createStandardL2Token(_remoteToken, _name, _symbol); - vm.prank(alice); - address addr = l2OptimismMintableERC20Factory.createStandardL2Token(remote, "Beep", "BOOP"); + // Assert assertTrue(addr == local); assertTrue(OptimismMintableERC20(local).decimals() == 18); + assertEq(l2OptimismMintableERC20Factory.deployments(local), _remoteToken); } - function test_createStandardL2TokenWithDecimals_succeeds() external { - address remote = address(4); - address local = calculateTokenAddress(remote, "Beep", "BOOP", 6); + /// @notice Test that calling `createOptimismMintableERC20WithDecimals` with valid parameters succeeds. + function test_createStandardL2TokenWithDecimals_succeeds( + address _caller, + address _remoteToken, + string memory _name, + string memory _symbol, + uint8 _decimals + ) + external + { + // Assume + vm.assume(_remoteToken != address(0)); - vm.expectEmit(true, true, true, true); - emit StandardL2TokenCreated(remote, local); + // Arrange + address local = _calculateTokenAddress(_remoteToken, _name, _symbol, _decimals); - vm.expectEmit(true, true, true, true); - emit OptimismMintableERC20Created(local, remote, alice); + vm.expectEmit(address(l2OptimismMintableERC20Factory)); + emit StandardL2TokenCreated(_remoteToken, local); - vm.prank(alice); - address addr = l2OptimismMintableERC20Factory.createOptimismMintableERC20WithDecimals(remote, "Beep", "BOOP", 6); + vm.expectEmit(address(l2OptimismMintableERC20Factory)); + emit OptimismMintableERC20Created(local, _remoteToken, _caller); + + // Act + vm.prank(_caller); + address addr = l2OptimismMintableERC20Factory.createOptimismMintableERC20WithDecimals( + _remoteToken, _name, _symbol, _decimals + ); + + // Assert assertTrue(addr == local); + assertTrue(OptimismMintableERC20(local).decimals() == _decimals); + assertEq(l2OptimismMintableERC20Factory.deployments(local), _remoteToken); + } + + /// @notice Test that calling `createStandardL2Token` with the same parameters twice reverts. + function test_createStandardL2Token_sameTwice_reverts( + address _caller, + address _remoteToken, + string memory _name, + string memory _symbol + ) + external + { + // Assume + vm.assume(_remoteToken != address(0)); - assertTrue(OptimismMintableERC20(local).decimals() == 6); + vm.prank(_caller); + l2OptimismMintableERC20Factory.createStandardL2Token(_remoteToken, _name, _symbol); + + // Arrange + vm.expectRevert(bytes("")); + + // Act + vm.prank(_caller); + l2OptimismMintableERC20Factory.createStandardL2Token(_remoteToken, _name, _symbol); } - function test_createStandardL2Token_sameTwice_reverts() external { - address remote = address(4); + /// @notice Test that calling `createStandardL2TokenWithDecimals` with the same parameters twice reverts. + function test_createStandardL2TokenWithDecimals_sameTwice_reverts( + address _caller, + address _remoteToken, + string memory _name, + string memory _symbol, + uint8 _decimals + ) + external + { + // Assume + vm.assume(_remoteToken != address(0)); - vm.prank(alice); - l2OptimismMintableERC20Factory.createStandardL2Token(remote, "Beep", "BOOP"); + vm.prank(_caller); + l2OptimismMintableERC20Factory.createOptimismMintableERC20WithDecimals(_remoteToken, _name, _symbol, _decimals); + // Arrange vm.expectRevert(bytes("")); - vm.prank(alice); - l2OptimismMintableERC20Factory.createStandardL2Token(remote, "Beep", "BOOP"); + // Act + vm.prank(_caller); + l2OptimismMintableERC20Factory.createOptimismMintableERC20WithDecimals(_remoteToken, _name, _symbol, _decimals); + } + + /// @notice Test that calling `createStandardL2Token` with a zero remote token address reverts. + function test_createStandardL2Token_remoteIsZero_reverts( + address _caller, + string memory _name, + string memory _symbol + ) + external + { + // Arrange + address remote = address(0); + vm.expectRevert("OptimismMintableERC20Factory: must provide remote token address"); + + // Act + vm.prank(_caller); + l2OptimismMintableERC20Factory.createStandardL2Token(remote, _name, _symbol); } - function test_createStandardL2Token_remoteIsZero_reverts() external { + /// @notice Test that calling `createStandardL2TokenWithDecimals` with a zero remote token address reverts. + function test_createStandardL2TokenWithDecimals_remoteIsZero_reverts( + address _caller, + string memory _name, + string memory _symbol, + uint8 _decimals + ) + external + { + // Arrange address remote = address(0); vm.expectRevert("OptimismMintableERC20Factory: must provide remote token address"); - l2OptimismMintableERC20Factory.createStandardL2Token(remote, "Beep", "BOOP"); + + // Act + vm.prank(_caller); + l2OptimismMintableERC20Factory.createOptimismMintableERC20WithDecimals(remote, _name, _symbol, _decimals); } - function calculateTokenAddress( + /// @notice Precalculates the address of the token contract. + function _calculateTokenAddress( address _remote, string memory _name, string memory _symbol, diff --git a/packages/contracts-bedrock/test/vendor/Initializable.t.sol b/packages/contracts-bedrock/test/vendor/Initializable.t.sol index 7bfdfb3adac2..d5c1a9e5e4c3 100644 --- a/packages/contracts-bedrock/test/vendor/Initializable.t.sol +++ b/packages/contracts-bedrock/test/vendor/Initializable.t.sol @@ -1,18 +1,27 @@ // SPDX-License-Identifier: MIT pragma solidity 0.8.15; +// Testing import { Bridge_Initializer } from "test/setup/Bridge_Initializer.sol"; -import { Executables } from "scripts/Executables.sol"; -import { CrossDomainMessenger } from "src/universal/CrossDomainMessenger.sol"; -import { L2OutputOracle } from "src/L1/L2OutputOracle.sol"; -import { SystemConfig } from "src/L1/SystemConfig.sol"; -import { SuperchainConfig } from "src/L1/SuperchainConfig.sol"; -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"; + +// Scripts +import { Executables } from "scripts/libraries/Executables.sol"; +import { ForgeArtifacts, StorageSlot } from "scripts/libraries/ForgeArtifacts.sol"; +import { Process } from "scripts/libraries/Process.sol"; + +// Libraries +import { LibString } from "@solady/utils/LibString.sol"; +import { Constants } from "src/libraries/Constants.sol"; +import { GameTypes } from "src/dispute/lib/Types.sol"; import "src/dispute/lib/Types.sol"; -import "scripts/Deployer.sol"; +import "scripts/deploy/Deployer.sol"; + +// Interfaces +import { ISystemConfig } from "src/L1/interfaces/ISystemConfig.sol"; +import { IResourceMetering } from "src/L1/interfaces/IResourceMetering.sol"; +import { ISuperchainConfig } from "src/L1/interfaces/ISuperchainConfig.sol"; +import { ProtocolVersion } from "src/L1/interfaces/IProtocolVersions.sol"; +import { IAnchorStateRegistry } from "src/dispute/interfaces/IAnchorStateRegistry.sol"; /// @title Initializer_Test /// @dev Ensures that the `initialize()` function on contracts cannot be called more than @@ -23,17 +32,21 @@ contract Initializer_Test is Bridge_Initializer { /// @notice Contains the address of an `Initializable` contract and the calldata /// used to initialize it. struct InitializeableContract { + string name; address target; bytes initCalldata; - uint8 initializedSlotVal; } - /// @notice Contains the addresses of the contracts to test as well as the calldata - /// used to initialize them. + /// @notice Array of contracts to test. InitializeableContract[] contracts; + /// @notice Mapping of nickname to actual contract name. + /// @dev Nicknames are only used when one proxy contract has multiple potential implementations + /// as can happen when a new implementation is being developed. + mapping(string => string) nicknames; + function setUp() public override { - super.enablePlasma(); + super.enableAltDA(); // Run the `Bridge_Initializer`'s `setUp()` function. super.setUp(); @@ -43,98 +56,107 @@ contract Initializer_Test is Bridge_Initializer { // SuperchainConfigImpl contracts.push( InitializeableContract({ + name: "SuperchainConfig", target: deploy.mustGetAddress("SuperchainConfig"), - initCalldata: abi.encodeCall(superchainConfig.initialize, (address(0), false)), - initializedSlotVal: deploy.loadInitializedSlot("SuperchainConfig") + initCalldata: abi.encodeCall(superchainConfig.initialize, (address(0), false)) }) ); // SuperchainConfigProxy contracts.push( InitializeableContract({ + name: "SuperchainConfigProxy", target: address(superchainConfig), - initCalldata: abi.encodeCall(superchainConfig.initialize, (address(0), false)), - initializedSlotVal: deploy.loadInitializedSlot("SuperchainConfigProxy") + initCalldata: abi.encodeCall(superchainConfig.initialize, (address(0), false)) }) ); // L1CrossDomainMessengerImpl contracts.push( InitializeableContract({ + name: "L1CrossDomainMessenger", target: deploy.mustGetAddress("L1CrossDomainMessenger"), initCalldata: abi.encodeCall( l1CrossDomainMessenger.initialize, (superchainConfig, optimismPortal, systemConfig) - ), - initializedSlotVal: deploy.loadInitializedSlot("L1CrossDomainMessenger") + ) }) ); // L1CrossDomainMessengerProxy contracts.push( InitializeableContract({ + name: "L1CrossDomainMessengerProxy", target: address(l1CrossDomainMessenger), initCalldata: abi.encodeCall( l1CrossDomainMessenger.initialize, (superchainConfig, optimismPortal, systemConfig) - ), - initializedSlotVal: deploy.loadInitializedSlot("L1CrossDomainMessengerProxy") + ) }) ); // DisputeGameFactoryImpl contracts.push( InitializeableContract({ + name: "DisputeGameFactory", target: deploy.mustGetAddress("DisputeGameFactory"), - initCalldata: abi.encodeCall(disputeGameFactory.initialize, (address(0))), - initializedSlotVal: deploy.loadInitializedSlot("DisputeGameFactory") + initCalldata: abi.encodeCall(disputeGameFactory.initialize, (address(0))) }) ); // DisputeGameFactoryProxy contracts.push( InitializeableContract({ + name: "DisputeGameFactoryProxy", target: address(disputeGameFactory), - initCalldata: abi.encodeCall(disputeGameFactory.initialize, (address(0))), - initializedSlotVal: deploy.loadInitializedSlot("DisputeGameFactoryProxy") + initCalldata: abi.encodeCall(disputeGameFactory.initialize, (address(0))) }) ); // DelayedWETHImpl contracts.push( InitializeableContract({ + name: "DelayedWETH", target: deploy.mustGetAddress("DelayedWETH"), - initCalldata: abi.encodeCall(delayedWeth.initialize, (address(0), SuperchainConfig(address(0)))), - initializedSlotVal: deploy.loadInitializedSlot("DelayedWETH") + initCalldata: abi.encodeCall(delayedWeth.initialize, (address(0), ISuperchainConfig(address(0)))) }) ); // DelayedWETHProxy contracts.push( InitializeableContract({ + name: "DelayedWETHProxy", target: address(delayedWeth), - initCalldata: abi.encodeCall(delayedWeth.initialize, (address(0), SuperchainConfig(address(0)))), - initializedSlotVal: deploy.loadInitializedSlot("DelayedWETHProxy") + initCalldata: abi.encodeCall(delayedWeth.initialize, (address(0), ISuperchainConfig(address(0)))) }) ); // L2OutputOracleImpl contracts.push( InitializeableContract({ + name: "L2OutputOracle", target: deploy.mustGetAddress("L2OutputOracle"), - initCalldata: abi.encodeCall(l2OutputOracle.initialize, (0, 0, 0, 0, address(0), address(0), 0)), - initializedSlotVal: deploy.loadInitializedSlot("L2OutputOracle") + initCalldata: abi.encodeCall(l2OutputOracle.initialize, (0, 0, 0, 0, address(0), address(0), 0)) }) ); // L2OutputOracleProxy contracts.push( InitializeableContract({ + name: "L2OutputOracleProxy", target: address(l2OutputOracle), - initCalldata: abi.encodeCall(l2OutputOracle.initialize, (0, 0, 0, 0, address(0), address(0), 0)), - initializedSlotVal: deploy.loadInitializedSlot("L2OutputOracleProxy") + initCalldata: abi.encodeCall(l2OutputOracle.initialize, (0, 0, 0, 0, address(0), address(0), 0)) }) ); // OptimismPortalImpl contracts.push( InitializeableContract({ + name: "OptimismPortal", target: deploy.mustGetAddress("OptimismPortal"), - initCalldata: abi.encodeCall(optimismPortal.initialize, (l2OutputOracle, systemConfig, superchainConfig)), - initializedSlotVal: deploy.loadInitializedSlot("OptimismPortal") + initCalldata: abi.encodeCall(optimismPortal.initialize, (l2OutputOracle, systemConfig, superchainConfig)) + }) + ); + // OptimismPortalProxy + contracts.push( + InitializeableContract({ + name: "OptimismPortalProxy", + target: address(optimismPortal), + initCalldata: abi.encodeCall(optimismPortal.initialize, (l2OutputOracle, systemConfig, superchainConfig)) }) ); // OptimismPortal2Impl contracts.push( InitializeableContract({ + name: "OptimismPortal2", target: deploy.mustGetAddress("OptimismPortal2"), initCalldata: abi.encodeCall( optimismPortal2.initialize, @@ -144,21 +166,13 @@ contract Initializer_Test is Bridge_Initializer { superchainConfig, GameType.wrap(uint32(deploy.cfg().respectedGameType())) ) - ), - initializedSlotVal: deploy.loadInitializedSlot("OptimismPortal2") - }) - ); - // OptimismPortalProxy - contracts.push( - InitializeableContract({ - target: address(optimismPortal), - initCalldata: abi.encodeCall(optimismPortal.initialize, (l2OutputOracle, systemConfig, superchainConfig)), - initializedSlotVal: deploy.loadInitializedSlot("OptimismPortalProxy") + ) }) ); // SystemConfigImpl contracts.push( InitializeableContract({ + name: "SystemConfig", target: deploy.mustGetAddress("SystemConfig"), initCalldata: abi.encodeCall( systemConfig.initialize, @@ -169,7 +183,7 @@ contract Initializer_Test is Bridge_Initializer { bytes32(0), 1, address(0), - ResourceMetering.ResourceConfig({ + IResourceMetering.ResourceConfig({ maxResourceLimit: 1, elasticityMultiplier: 1, baseFeeMaxChangeDenominator: 2, @@ -178,7 +192,7 @@ contract Initializer_Test is Bridge_Initializer { maximumBaseFee: 0 }), address(0), - SystemConfig.Addresses({ + ISystemConfig.Addresses({ l1CrossDomainMessenger: address(0), l1ERC721Bridge: address(0), l1StandardBridge: address(0), @@ -188,13 +202,13 @@ contract Initializer_Test is Bridge_Initializer { gasPayingToken: Constants.ETHER }) ) - ), - initializedSlotVal: deploy.loadInitializedSlot("SystemConfig") + ) }) ); // SystemConfigProxy contracts.push( InitializeableContract({ + name: "SystemConfigProxy", target: address(systemConfig), initCalldata: abi.encodeCall( systemConfig.initialize, @@ -205,7 +219,7 @@ contract Initializer_Test is Bridge_Initializer { bytes32(0), 1, address(0), - ResourceMetering.ResourceConfig({ + IResourceMetering.ResourceConfig({ maxResourceLimit: 1, elasticityMultiplier: 1, baseFeeMaxChangeDenominator: 2, @@ -214,7 +228,7 @@ contract Initializer_Test is Bridge_Initializer { maximumBaseFee: 0 }), address(0), - SystemConfig.Addresses({ + ISystemConfig.Addresses({ l1CrossDomainMessenger: address(0), l1ERC721Bridge: address(0), l1StandardBridge: address(0), @@ -224,233 +238,286 @@ contract Initializer_Test is Bridge_Initializer { gasPayingToken: Constants.ETHER }) ) - ), - initializedSlotVal: deploy.loadInitializedSlot("SystemConfigProxy") + ) }) ); // ProtocolVersionsImpl contracts.push( InitializeableContract({ + name: "ProtocolVersions", target: deploy.mustGetAddress("ProtocolVersions"), initCalldata: abi.encodeCall( protocolVersions.initialize, (address(0), ProtocolVersion.wrap(1), ProtocolVersion.wrap(2)) - ), - initializedSlotVal: deploy.loadInitializedSlot("ProtocolVersions") + ) }) ); // ProtocolVersionsProxy contracts.push( InitializeableContract({ + name: "ProtocolVersionsProxy", target: address(protocolVersions), initCalldata: abi.encodeCall( protocolVersions.initialize, (address(0), ProtocolVersion.wrap(1), ProtocolVersion.wrap(2)) - ), - initializedSlotVal: deploy.loadInitializedSlot("ProtocolVersionsProxy") + ) }) ); // L2CrossDomainMessenger contracts.push( InitializeableContract({ + name: "L2CrossDomainMessenger", target: address(l2CrossDomainMessenger), - initCalldata: abi.encodeCall(l2CrossDomainMessenger.initialize, (l1CrossDomainMessenger)), - initializedSlotVal: deploy.loadInitializedSlot("L2CrossDomainMessenger") + initCalldata: abi.encodeCall(l2CrossDomainMessenger.initialize, (l1CrossDomainMessenger)) }) ); // L1StandardBridgeImpl contracts.push( InitializeableContract({ + name: "L1StandardBridge", target: deploy.mustGetAddress("L1StandardBridge"), initCalldata: abi.encodeCall( l1StandardBridge.initialize, (l1CrossDomainMessenger, superchainConfig, systemConfig) - ), - initializedSlotVal: deploy.loadInitializedSlot("L1StandardBridge") + ) }) ); // L1StandardBridgeProxy contracts.push( InitializeableContract({ + name: "L1StandardBridgeProxy", target: address(l1StandardBridge), initCalldata: abi.encodeCall( l1StandardBridge.initialize, (l1CrossDomainMessenger, superchainConfig, systemConfig) - ), - initializedSlotVal: deploy.loadInitializedSlot("L1StandardBridgeProxy") + ) }) ); // L2StandardBridge contracts.push( InitializeableContract({ + name: "L2StandardBridge", target: address(l2StandardBridge), - initCalldata: abi.encodeCall(l2StandardBridge.initialize, (l1StandardBridge)), - initializedSlotVal: deploy.loadInitializedSlot("L2StandardBridge") + initCalldata: abi.encodeCall(l2StandardBridge.initialize, (l1StandardBridge)) + }) + ); + // L2StandardBridgeInterop + contracts.push( + InitializeableContract({ + name: "L2StandardBridgeInterop", + target: address(l2StandardBridge), + initCalldata: abi.encodeCall(l2StandardBridge.initialize, (l1StandardBridge)) }) ); // L1ERC721BridgeImpl contracts.push( InitializeableContract({ + name: "L1ERC721Bridge", target: deploy.mustGetAddress("L1ERC721Bridge"), - initCalldata: abi.encodeCall(l1ERC721Bridge.initialize, (l1CrossDomainMessenger, superchainConfig)), - initializedSlotVal: deploy.loadInitializedSlot("L1ERC721Bridge") + initCalldata: abi.encodeCall(l1ERC721Bridge.initialize, (l1CrossDomainMessenger, superchainConfig)) }) ); // L1ERC721BridgeProxy contracts.push( InitializeableContract({ + name: "L1ERC721BridgeProxy", target: address(l1ERC721Bridge), - initCalldata: abi.encodeCall(l1ERC721Bridge.initialize, (l1CrossDomainMessenger, superchainConfig)), - initializedSlotVal: deploy.loadInitializedSlot("L1ERC721BridgeProxy") + initCalldata: abi.encodeCall(l1ERC721Bridge.initialize, (l1CrossDomainMessenger, superchainConfig)) }) ); // L2ERC721Bridge contracts.push( InitializeableContract({ + name: "L2ERC721Bridge", target: address(l2ERC721Bridge), - initCalldata: abi.encodeCall(l2ERC721Bridge.initialize, (payable(address(l1ERC721Bridge)))), - initializedSlotVal: deploy.loadInitializedSlot("L2ERC721Bridge") + initCalldata: abi.encodeCall(l2ERC721Bridge.initialize, (payable(address(l1ERC721Bridge)))) }) ); // OptimismMintableERC20FactoryImpl contracts.push( InitializeableContract({ + name: "OptimismMintableERC20Factory", target: deploy.mustGetAddress("OptimismMintableERC20Factory"), - initCalldata: abi.encodeCall(l1OptimismMintableERC20Factory.initialize, (address(l1StandardBridge))), - initializedSlotVal: deploy.loadInitializedSlot("OptimismMintableERC20Factory") + initCalldata: abi.encodeCall(l1OptimismMintableERC20Factory.initialize, (address(l1StandardBridge))) }) ); // OptimismMintableERC20FactoryProxy contracts.push( InitializeableContract({ + name: "OptimismMintableERC20FactoryProxy", target: address(l1OptimismMintableERC20Factory), - initCalldata: abi.encodeCall(l1OptimismMintableERC20Factory.initialize, (address(l1StandardBridge))), - initializedSlotVal: deploy.loadInitializedSlot("OptimismMintableERC20FactoryProxy") + initCalldata: abi.encodeCall(l1OptimismMintableERC20Factory.initialize, (address(l1StandardBridge))) }) ); // DataAvailabilityChallengeImpl contracts.push( InitializeableContract({ + name: "DataAvailabilityChallenge", target: deploy.mustGetAddress("DataAvailabilityChallenge"), - initCalldata: abi.encodeCall(dataAvailabilityChallenge.initialize, (address(0), 0, 0, 0, 0)), - initializedSlotVal: deploy.loadInitializedSlot("DataAvailabilityChallenge") + initCalldata: abi.encodeCall(dataAvailabilityChallenge.initialize, (address(0), 0, 0, 0, 0)) }) ); // DataAvailabilityChallengeProxy contracts.push( InitializeableContract({ + name: "DataAvailabilityChallengeProxy", target: address(dataAvailabilityChallenge), - initCalldata: abi.encodeCall(dataAvailabilityChallenge.initialize, (address(0), 0, 0, 0, 0)), - initializedSlotVal: deploy.loadInitializedSlot("DataAvailabilityChallengeProxy") + initCalldata: abi.encodeCall(dataAvailabilityChallenge.initialize, (address(0), 0, 0, 0, 0)) + }) + ); + // AnchorStateRegistry + contracts.push( + InitializeableContract({ + name: "AnchorStateRegistry", + target: address(anchorStateRegistry), + initCalldata: abi.encodeCall( + anchorStateRegistry.initialize, + (new IAnchorStateRegistry.StartingAnchorRoot[](1), ISuperchainConfig(address(0))) + ) + }) + ); + // AnchorStateRegistryProxy + contracts.push( + InitializeableContract({ + name: "AnchorStateRegistryProxy", + target: address(anchorStateRegistry), + initCalldata: abi.encodeCall( + anchorStateRegistry.initialize, + (new IAnchorStateRegistry.StartingAnchorRoot[](1), ISuperchainConfig(address(0))) + ) }) ); + + // Nicknamed contracts. + nicknames["OptimismPortal2Proxy"] = "OptimismPortalProxy"; } /// @notice Tests that: - /// 1. All `Initializable` contracts in `src/L1` and `src/L2` are accounted for in the `contracts` array. - /// 2. The `_initialized` flag of each contract is properly set to `1`, signifying that the - /// contracts are initialized. - /// 3. The `initialize()` function of each contract cannot be called more than once. + /// 1. All `Initializable` contracts in `src/` (except periphery) are accounted for in `contracts`. + /// 2. The `_initialized` flag of each contract is properly set. + /// 3. The `initialize()` function of each contract cannot be called again. function test_cannotReinitialize_succeeds() public { - // 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); - - // Attempt to re-initialize all contracts within the `contracts` array. - for (uint256 i; i < contracts.length; i++) { - InitializeableContract memory _contract = contracts[i]; - uint256 size; - address target = _contract.target; - assembly { - size := extcodesize(target) - } - // Assert that the contract is already initialized. - assertEq(_contract.initializedSlotVal, 1); + // Collect exclusions. + string[] memory excludes = new string[](8); + // TODO: Neither of these contracts are labeled properly in the deployment script. Both are + // currently being labeled as their non-interop versions. Remove these exclusions once + // the deployment script is fixed. + excludes[0] = "src/L1/SystemConfigInterop.sol"; + excludes[1] = "src/L1/OptimismPortalInterop.sol"; + // Contract is currently not being deployed as part of the standard deployment script. + excludes[2] = "src/L2/OptimismSuperchainERC20.sol"; + // Periphery contracts don't get deployed as part of the standard deployment script. + excludes[3] = "src/periphery/*"; + // TODO: Deployment script is currently "broken" in the sense that it doesn't properly + // label the FaultDisputeGame and PermissionedDisputeGame contracts and instead + // simply deploys them anonymously. Means that functions like "getInitializedSlot" + // don't work properly. Remove these exclusions once the deployment script is fixed. + excludes[4] = "src/dispute/FaultDisputeGame.sol"; + excludes[5] = "src/dispute/PermissionedDisputeGame.sol"; + // TODO: Eventually remove this exclusion. Same reason as above dispute contracts. + excludes[6] = "src/L1/OPStackManager.sol"; + excludes[7] = "src/L1/OPStackManagerInterop.sol"; - // Then, attempt to re-initialize the contract. This should fail. - (bool success, bytes memory returnData) = _contract.target.call(_contract.initCalldata); - assertFalse(success); - assertEq(_extractErrorString(returnData), "Initializable: contract is already initialized"); - } - } + // Get all contract names in the src directory, minus the excluded contracts. + string[] memory contractNames = ForgeArtifacts.getContractNames("src/*", excludes); - /// @dev Returns the number of contracts that are `Initializable` in `src/L1` and `src/L2`. - /// For L1 contracts, implementations are considered in addition to proxies - function _getNumInitializable() internal returns (uint256 numContracts_) { - string[] memory command = new string[](3); - command[0] = Executables.bash; - command[1] = "-c"; - // Start by getting L1 contracts - command[2] = string.concat( - Executables.find, - " src/L1 -type f -exec basename {} \\;", - " | ", - Executables.sed, - " 's/\\.[^.]*$//'", - " | ", - Executables.jq, - " -R -s 'split(\"\n\")[:-1]'" - ); - string[] memory l1ContractNames = abi.decode(vm.parseJson(string(vm.ffi(command))), (string[])); + // Iterate over all contracts to assert that they are accounted for in the `contracts + // array. All contracts that have an `initialize()` function must be accounted for in the + // `contracts` array or an error will be thrown. If the contract is proxied, both the + // implementation and the proxy must be accounted for in the `contracts` array. + for (uint256 i; i < contractNames.length; i++) { + string memory contractName = contractNames[i]; + string memory contractKind = ForgeArtifacts.getContractKind(contractName); - for (uint256 i; i < l1ContractNames.length; i++) { - string memory contractName = l1ContractNames[i]; - string memory contractAbi = ForgeArtifacts.getAbi(contractName); + // Filter out non-contracts. + if (!LibString.eq(contractKind, "contract")) { + continue; + } - // Query the contract's ABI for an `initialize()` function. + // Construct the query for the initialize function in the contract's ABI. + string[] memory command = new string[](3); + command[0] = Executables.bash; + command[1] = "-c"; command[2] = string.concat( Executables.echo, " '", - contractAbi, + ForgeArtifacts.getAbi(contractName), "'", " | ", Executables.jq, " '.[] | select(.name == \"initialize\" and .type == \"function\")'" ); - bytes memory res = vm.ffi(command); - // If the contract has an `initialize()` function, the resulting query will be non-empty. - // In this case, increment the number of `Initializable` contracts. - if (res.length > 0) { - // Count Proxy + Impl - numContracts_ += 2; + // If the contract does not have an `initialize()` function, skip it. + if (Process.run(command).length == 0) { + continue; + } + + // Check if this contract is in the contracts array. + assertTrue( + _hasMatchingContract(contractName), string.concat("Missing ", contractName, " from contracts array") + ); + + // If the contract is proxied, check that the proxy is in the contracts array. + // Skip predeployed contracts for now since we don't yet keep track of the + // implementations inside of the deploy script. + // TODO: We should add support for this in the future so that we can properly check that + // the implementations for predeployed contracts are initialized too. + if (ForgeArtifacts.isProxiedContract(contractName) && !ForgeArtifacts.isPredeployedContract(contractName)) { + assertTrue( + _hasMatchingContract(string.concat(contractName, "Proxy")), + string.concat("Missing ", contractName, "Proxy from contracts array") + ); } } - // Then get L2 contracts - command[2] = string.concat( - Executables.find, - " src/L2 -type f -exec basename {} \\;", - " | ", - Executables.sed, - " 's/\\.[^.]*$//'", - " | ", - Executables.jq, - " -R -s 'split(\"\n\")[:-1]'" - ); - string[] memory l2ContractNames = abi.decode(vm.parseJson(string(vm.ffi(command))), (string[])); + // Attempt to re-initialize all contracts within the `contracts` array. + for (uint256 i; i < contracts.length; i++) { + InitializeableContract memory _contract = contracts[i]; + string memory name = _getRealContractName(_contract.name); - for (uint256 i; i < l2ContractNames.length; i++) { - string memory contractName = l2ContractNames[i]; - string memory contractAbi = ForgeArtifacts.getAbi(contractName); + // Grab the value of the "initialized" storage slot. Must handle special case for the + // FaultDisputeGame and PermissionedDisputeGame contracts since these have a different + // name for the "initialized" storage slot and are currently not properly labeled in + // the deployment script. + // TODO: Update deployment script to properly label the dispute game contracts. + uint8 initializedSlotVal; + if (LibString.eq(name, "FaultDisputeGame") || LibString.eq(name, "PermissionedDisputeGame")) { + StorageSlot memory slot = ForgeArtifacts.getInitializedSlot(name); + bytes32 slotVal = vm.load(_contract.target, bytes32(vm.parseUint(slot.slot))); + initializedSlotVal = uint8((uint256(slotVal) >> (slot.offset * 8)) & 0xFF); + } else { + initializedSlotVal = deploy.loadInitializedSlot(name); + } - // Query the contract's ABI for an `initialize()` function. - command[2] = string.concat( - Executables.echo, - " '", - contractAbi, - "'", - " | ", - Executables.jq, - " '.[] | select(.name == \"initialize\" and .type == \"function\")'" + // Assert that the contract is already initialized. + assertTrue( + // Either 1 for initialized or type(uint8).max for initializer disabled. + initializedSlotVal == 1 || initializedSlotVal == type(uint8).max, + "Initializable: contract is not initialized" ); - bytes memory res = vm.ffi(command); - // If the contract has an `initialize()` function, the resulting query will be non-empty. - // In this case, increment the number of `Initializable` contracts. - if (res.length > 0) { - numContracts_++; + // Then, attempt to re-initialize the contract. This should fail. + (bool success, bytes memory returnData) = _contract.target.call(_contract.initCalldata); + assertFalse(success); + assertEq(_extractErrorString(returnData), "Initializable: contract is already initialized"); + } + } + + /// @dev Returns true if the contract with the given name is in the `contracts` array. + /// @param _name The name of the contract to check. + /// @return matching_ True if the contract is in the `contracts` array, false otherwise. + function _hasMatchingContract(string memory _name) internal view returns (bool matching_) { + for (uint256 i; i < contracts.length; i++) { + if (LibString.eq(contracts[i].name, _getRealContractName(_name))) { + matching_ = true; } } } + /// @dev Returns the real name of the contract, including any nicknames. + /// @param _name The name of the contract. + /// @return real_ The real name of the contract. + function _getRealContractName(string memory _name) internal view returns (string memory real_) { + real_ = bytes(nicknames[_name]).length > 0 ? nicknames[_name] : _name; + } + /// @dev Extracts the revert string from returndata encoded in the form of `Error(string)`. function _extractErrorString(bytes memory _returnData) internal pure returns (string memory error_) { // The first 4 bytes of the return data should be the selector for `Error(string)`. If not, revert. diff --git a/packages/contracts-bedrock/test/vendor/InitializableOZv5.t.sol b/packages/contracts-bedrock/test/vendor/InitializableOZv5.t.sol new file mode 100644 index 000000000000..0820f987414a --- /dev/null +++ b/packages/contracts-bedrock/test/vendor/InitializableOZv5.t.sol @@ -0,0 +1,66 @@ +// SPDX-License-Identifier: MIT +pragma solidity 0.8.25; + +import { Test } from "forge-std/Test.sol"; +import { OptimismSuperchainERC20 } from "src/L2/OptimismSuperchainERC20.sol"; +import { Initializable } from "@openzeppelin/contracts-v5/proxy/utils/Initializable.sol"; + +/// @title InitializerOZv5_Test +/// @dev Ensures that the `initialize()` function on contracts cannot be called more than +/// once. Tests the contracts inheriting from `Initializable` from OpenZeppelin Contracts v5. +contract InitializerOZv5_Test is Test { + /// @notice The storage slot of the `initialized` flag in the `Initializable` contract from OZ v5. + /// keccak256(abi.encode(uint256(keccak256("openzeppelin.storage.Initializable")) - 1)) & ~bytes32(uint256(0xff)) + bytes32 private constant INITIALIZABLE_STORAGE = 0xf0c57e16840df040f15088dc2f81fe391c3923bec73e23a9662efc9c229c6a00; + + /// @notice Contains the address of an `Initializable` contract and the calldata + /// used to initialize it. + struct InitializeableContract { + address target; + bytes initCalldata; + } + + /// @notice Contains the addresses of the contracts to test as well as the calldata + /// used to initialize them. + InitializeableContract[] contracts; + + function setUp() public { + // Initialize the `contracts` array with the addresses of the contracts to test and the + // calldata used to initialize them + + // OptimismSuperchainERC20 + contracts.push( + InitializeableContract({ + target: address(new OptimismSuperchainERC20()), + initCalldata: abi.encodeCall(OptimismSuperchainERC20.initialize, (address(0), "", "", 18)) + }) + ); + } + + /// @notice Tests that: + /// 1. The `initialized` flag of each contract is properly set to `type(uint64).max`, + /// signifying that the contracts are initialized. + /// 2. The `initialize()` function of each contract cannot be called more than once. + /// 3. Returns the correct error when attempting to re-initialize a contract. + function test_cannotReinitialize_succeeds() public { + // Attempt to re-initialize all contracts within the `contracts` array. + for (uint256 i; i < contracts.length; i++) { + InitializeableContract memory _contract = contracts[i]; + uint256 size; + address target = _contract.target; + assembly { + size := extcodesize(target) + } + + // Assert that the contract is already initialized. + bytes32 slotVal = vm.load(_contract.target, INITIALIZABLE_STORAGE); + uint64 initialized = uint64(uint256(slotVal)); + assertEq(initialized, type(uint64).max); + + // Then, attempt to re-initialize the contract. This should fail. + (bool success, bytes memory returnData) = _contract.target.call(_contract.initCalldata); + assertFalse(success); + assertEq(bytes4(returnData), Initializable.InvalidInitialization.selector); + } + } +} diff --git a/packages/contracts-bedrock/tsconfig.build.json b/packages/contracts-bedrock/tsconfig.build.json deleted file mode 100644 index e5df8a66de31..000000000000 --- a/packages/contracts-bedrock/tsconfig.build.json +++ /dev/null @@ -1,8 +0,0 @@ -{ - "extends": "../../tsconfig.json", - "compilerOptions": { - "rootDir": "./src", - "outDir": "./dist" - }, - "include": ["src/**/*"] -} diff --git a/packages/contracts-bedrock/tsconfig.json b/packages/contracts-bedrock/tsconfig.json deleted file mode 100644 index 5091614ef561..000000000000 --- a/packages/contracts-bedrock/tsconfig.json +++ /dev/null @@ -1,11 +0,0 @@ -{ - "extends": "../../tsconfig.json", - "compilerOptions": { - "outDir": "./dist" - }, - "include": [ - "deploy-config/**/*", - "deploy-config/**/*.json", - "scripts/**/*" - ] -} diff --git a/packages/sdk/.depcheckrc b/packages/sdk/.depcheckrc deleted file mode 100644 index db91cc9f03a9..000000000000 --- a/packages/sdk/.depcheckrc +++ /dev/null @@ -1,18 +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", - "ts-node", - "typedoc", - "typescript", - "ethereum-waffle", - "nyc" -] diff --git a/packages/sdk/.eslintrc.js b/packages/sdk/.eslintrc.js deleted file mode 100644 index c7b0cb5de718..000000000000 --- a/packages/sdk/.eslintrc.js +++ /dev/null @@ -1,46 +0,0 @@ -module.exports = { - extends: '../../.eslintrc.js', - overrides: [ - { - files: ['src/**/*.ts'], - rules: { - 'no-restricted-imports': [ - 'error', - 'assert', - 'buffer', - 'child_process', - 'cluster', - 'crypto', - 'dgram', - 'dns', - 'domain', - 'events', - 'freelist', - 'fs', - 'http', - 'https', - 'module', - 'net', - 'os', - 'path', - 'punycode', - 'querystring', - 'readline', - 'repl', - 'smalloc', - 'stream', - 'string_decoder', - 'sys', - 'timers', - 'tls', - 'tracing', - 'tty', - 'url', - 'util', - 'vm', - 'zlib', - ], - }, - }, - ], -} diff --git a/packages/sdk/.gitignore b/packages/sdk/.gitignore deleted file mode 100644 index 6a204b05865f..000000000000 --- a/packages/sdk/.gitignore +++ /dev/null @@ -1,3 +0,0 @@ -node_modules/ -build/ -docs/ diff --git a/packages/sdk/.lintstagedrc.yml b/packages/sdk/.lintstagedrc.yml deleted file mode 100644 index a3035a2299b2..000000000000 --- a/packages/sdk/.lintstagedrc.yml +++ /dev/null @@ -1,2 +0,0 @@ -"*.{ts,js}": - - eslint diff --git a/packages/sdk/.prettierrc.js b/packages/sdk/.prettierrc.js deleted file mode 100644 index 6b3fa8e2ce23..000000000000 --- a/packages/sdk/.prettierrc.js +++ /dev/null @@ -1,3 +0,0 @@ -module.exports = { - ...require('../../.prettierrc.js'), -}; \ No newline at end of file diff --git a/packages/sdk/CHANGELOG.md b/packages/sdk/CHANGELOG.md deleted file mode 100644 index 872be3d6bc62..000000000000 --- a/packages/sdk/CHANGELOG.md +++ /dev/null @@ -1,799 +0,0 @@ -# @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 - -- [#9805](https://github.com/ethereum-optimism/optimism/pull/9805) [`3ccd12fe5c8c4c5a6acbf370d474ffa8db816562`](https://github.com/ethereum-optimism/optimism/commit/3ccd12fe5c8c4c5a6acbf370d474ffa8db816562) Thanks [@alecananian](https://github.com/alecananian)! - Fixed an issue where Vercel builds were failing due to the `preinstall` command. - -## 3.2.1 - -### Patch Changes - -- [#9663](https://github.com/ethereum-optimism/optimism/pull/9663) [`a1329f21f33ecafe409990964d3af7bf05a8a756`](https://github.com/ethereum-optimism/optimism/commit/a1329f21f33ecafe409990964d3af7bf05a8a756) Thanks [@smartcontracts](https://github.com/smartcontracts)! - Fixes a bug in the SDK that would sometimes cause proof submission reverts. - -## 3.2.0 - -### Minor Changes - -- [#9325](https://github.com/ethereum-optimism/optimism/pull/9325) [`44a2d9cec5f3b309b723b3e4dd8d29b5b70f1cc8`](https://github.com/ethereum-optimism/optimism/commit/44a2d9cec5f3b309b723b3e4dd8d29b5b70f1cc8) Thanks [@smartcontracts](https://github.com/smartcontracts)! - Updates the SDK to support FPAC in a backwards compatible way. - -### Patch Changes - -- [#9367](https://github.com/ethereum-optimism/optimism/pull/9367) [`d99d425a4f73fba19ffcf180deb0ef48ff3b9a6a`](https://github.com/ethereum-optimism/optimism/commit/d99d425a4f73fba19ffcf180deb0ef48ff3b9a6a) Thanks [@smartcontracts](https://github.com/smartcontracts)! - Fixes a bug in the SDK for finalizing fpac withdrawals. - -- [#9244](https://github.com/ethereum-optimism/optimism/pull/9244) [`73a748575e7c3d67c293814a12bf41eee216163c`](https://github.com/ethereum-optimism/optimism/commit/73a748575e7c3d67c293814a12bf41eee216163c) Thanks [@roninjin10](https://github.com/roninjin10)! - Added maintence mode warning to sdk - -- Updated dependencies [[`79effc52e8b82d15b5eda43acf540ac6c5f8d5d7`](https://github.com/ethereum-optimism/optimism/commit/79effc52e8b82d15b5eda43acf540ac6c5f8d5d7)]: - - @eth-optimism/contracts-bedrock@0.17.1 - -## 3.1.8 - -### Patch Changes - -- [#8902](https://github.com/ethereum-optimism/optimism/pull/8902) [`18becd7e4`](https://github.com/ethereum-optimism/optimism/commit/18becd7e457577c105f6bc03597e069334cb7433) Thanks [@smartcontracts](https://github.com/smartcontracts)! - Fixes a bug in the SDK that would fail if unsupported fields were provided. - -## 3.1.7 - -### Patch Changes - -- [#8836](https://github.com/ethereum-optimism/optimism/pull/8836) [`6ec80fd19`](https://github.com/ethereum-optimism/optimism/commit/6ec80fd19d9155b17a0873672fb095d323f6e8fb) Thanks [@smartcontracts](https://github.com/smartcontracts)! - Fixes a bug in l1 gas cost estimation. - -## 3.1.6 - -### Patch Changes - -- [#8212](https://github.com/ethereum-optimism/optimism/pull/8212) [`dd0e46986`](https://github.com/ethereum-optimism/optimism/commit/dd0e46986f19dcceb304fc48f2bd410685ecd179) Thanks [@smartcontracts](https://github.com/smartcontracts)! - Simplifies getMessageStatus to use an O(1) lookup instead of an event query - -## 3.1.5 - -### Patch Changes - -- [#8155](https://github.com/ethereum-optimism/optimism/pull/8155) [`2534eabb5`](https://github.com/ethereum-optimism/optimism/commit/2534eabb50afe76f176407f83cc1f1c606e6de69) Thanks [@smartcontracts](https://github.com/smartcontracts)! - Fixed bug with tokenBridge checks throwing - -## 3.1.4 - -### 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/contracts-bedrock@0.16.2 - - @eth-optimism/core-utils@0.13.1 - -## 3.1.3 - -### Patch Changes - -- [#7244](https://github.com/ethereum-optimism/optimism/pull/7244) [`679207751`](https://github.com/ethereum-optimism/optimism/commit/6792077510fd76553c179d8b8d068262cda18db6) Thanks [@nitaliano](https://github.com/nitaliano)! - Adds Sepolia & OP Sepolia support to SDK - -- Updated dependencies [[`210b2c81d`](https://github.com/ethereum-optimism/optimism/commit/210b2c81dd383bad93480aa876b283d9a0c991c2), [`2440f5e7a`](https://github.com/ethereum-optimism/optimism/commit/2440f5e7ab6577f2d2e9c8b0c78c014290dde8e7)]: - - @eth-optimism/core-utils@0.13.0 - - @eth-optimism/contracts-bedrock@0.16.1 - -## 3.1.2 - -### Patch Changes - -- [#6886](https://github.com/ethereum-optimism/optimism/pull/6886) [`9c3a03855`](https://github.com/ethereum-optimism/optimism/commit/9c3a03855dc982f0b4e1d664e83271883536632b) Thanks [@roninjin10](https://github.com/roninjin10)! - Updated npm dependencies to latest - -## 3.1.1 - -### Patch Changes - -- Updated dependencies [[`dfa309e34`](https://github.com/ethereum-optimism/optimism/commit/dfa309e3430ebc8790b932554dde120aafc4161e)]: - - @eth-optimism/core-utils@0.12.3 - -## 3.1.0 - -### Minor Changes - -- [#6053](https://github.com/ethereum-optimism/optimism/pull/6053) [`ff577455f`](https://github.com/ethereum-optimism/optimism/commit/ff577455f196b5f5b8a889339b845561ca6c538a) Thanks [@roninjin10](https://github.com/roninjin10)! - Add support for claiming multicall3 withdrawals - -- [#6042](https://github.com/ethereum-optimism/optimism/pull/6042) [`89ca741a6`](https://github.com/ethereum-optimism/optimism/commit/89ca741a63c5e07f9d691bb6f7a89f7718fc49ca) Thanks [@roninjin10](https://github.com/roninjin10)! - Fixes issue with legacy withdrawal message status detection - -- [#6332](https://github.com/ethereum-optimism/optimism/pull/6332) [`639163253`](https://github.com/ethereum-optimism/optimism/commit/639163253a5e2128f1c21c446b68d358d38cbd30) Thanks [@wilsoncusack](https://github.com/wilsoncusack)! - Added to and from block filters to several methods in CrossChainMessenger - -### Patch Changes - -- [#6254](https://github.com/ethereum-optimism/optimism/pull/6254) [`a666c4f20`](https://github.com/ethereum-optimism/optimism/commit/a666c4f2082253abbb68c0678e5a0a1ed0c00f4b) Thanks [@roninjin10](https://github.com/roninjin10)! - Fixed missing indexes for multicall support - -- [#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. - -- [#6182](https://github.com/ethereum-optimism/optimism/pull/6182) [`3f13fd0bb`](https://github.com/ethereum-optimism/optimism/commit/3f13fd0bbea051a4550f1df6def1a53a616aa6f6) Thanks [@tremarkley](https://github.com/tremarkley)! - Update the addresses of the bridges on optimism and optimism goerli for the ECO bridge adapter - -- Updated dependencies [[`c11039060`](https://github.com/ethereum-optimism/optimism/commit/c11039060bc037a88916c2cba602687b6d69ad1a), [`72d184854`](https://github.com/ethereum-optimism/optimism/commit/72d184854ebad8b2025641f126ed76573b1f0ac3), [`77da6edc6`](https://github.com/ethereum-optimism/optimism/commit/77da6edc643e0b5e39f7b6bb41c3c7ead418a876)]: - - @eth-optimism/contracts-bedrock@0.16.0 - - @eth-optimism/core-utils@0.12.2 - -## 3.0.0 - -### Major Changes - -- 119754c2f: Make optimism/sdk default to bedrock mode - -### Patch Changes - -- Updated dependencies [8d7dcc70c] -- Updated dependencies [d6388be4a] -- Updated dependencies [af292562f] - - @eth-optimism/core-utils@0.12.1 - - @eth-optimism/contracts-bedrock@0.15.0 - -## 2.1.0 - -### Minor Changes - -- 5063a69fb: Update sdk contract addresses for bedrock - -### Patch Changes - -- a1b7ff9e3: add eco bridge adapter -- 8133872ed: Fix firefox bug with getTokenPair -- afc2ab8c9: Update the migrated withdrawal gas limit for non goerli networks -- aa854bdd8: Add warning if bedrock is not turned on -- Updated dependencies [f1e867177] -- Updated dependencies [197884eae] -- Updated dependencies [6eb05430d] -- Updated dependencies [5063a69fb] - - @eth-optimism/contracts-bedrock@0.14.0 - - @eth-optimism/contracts@0.6.0 - -## 2.0.2 - -### Patch Changes - -- be3315689: Have SDK automatically create Standard and ETH bridges when L1StandardBridge is provided. -- Updated dependencies [b16067a9f] -- Updated dependencies [9a02079eb] -- Updated dependencies [98fbe9d22] - - @eth-optimism/contracts-bedrock@0.13.2 - -## 2.0.1 - -### Patch Changes - -- 66cafc00a: Update migrated withdrawal gaslimit calculation -- Updated dependencies [22c3885f5] -- Updated dependencies [f52c07529] - - @eth-optimism/contracts-bedrock@0.13.1 - -## 2.0.0 - -### Major Changes - -- cb19e2f9c: Moves `FINALIZATION_PERIOD_SECONDS` from the `OptimismPortal` to the `L2OutputOracle` & ensures the `CHALLENGER` key cannot delete finalized outputs. - -### Patch Changes - -- Updated dependencies [cb19e2f9c] - - @eth-optimism/contracts-bedrock@0.13.0 - -## 1.10.4 - -### Patch Changes - -- Updated dependencies [80f2271f5] - - @eth-optimism/contracts-bedrock@0.12.1 - -## 1.10.3 - -### Patch Changes - -- Updated dependencies [7c0a2cc37] -- Updated dependencies [2865dd9b4] -- Updated dependencies [efc98d261] -- Updated dependencies [388f2c25a] - - @eth-optimism/contracts-bedrock@0.12.0 - -## 1.10.2 - -### Patch Changes - -- 5372c9f5b: Remove assert node builtin from sdk -- Updated dependencies [3c22333b8] - - @eth-optimism/contracts-bedrock@0.11.4 - -## 1.10.1 - -### Patch Changes - -- Updated dependencies [4964be480] - - @eth-optimism/contracts-bedrock@0.11.3 - -## 1.10.0 - -### Minor Changes - -- 3f4b3c328: Add in goerli bedrock addresses - -## 1.9.1 - -### Patch Changes - -- Updated dependencies [8784bc0bc] - - @eth-optimism/contracts-bedrock@0.11.2 - -## 1.9.0 - -### Minor Changes - -- d1f9098f9: Removes support for Kovan - -### Patch Changes - -- ba8b94a60: Don't pass 0 gasLimit for migrated withdrawals -- Updated dependencies [fe80a9488] -- Updated dependencies [827fc7b04] -- Updated dependencies [a2166dcad] -- Updated dependencies [ff09ec22d] -- Updated dependencies [85dfa9fe2] -- Updated dependencies [d1f9098f9] -- Updated dependencies [0f8fc58ad] -- Updated dependencies [89f70c591] -- Updated dependencies [03940c3cb] - - @eth-optimism/contracts-bedrock@0.11.1 - - @eth-optimism/contracts@0.5.40 - -## 1.8.0 - -### Minor Changes - -- c975c9620: Add suppory for finalizing legacy withdrawals after the Bedrock migration - -### Patch Changes - -- 767585b07: Removes an unused variable from the SDK -- 136ea1785: Refactors the L2OutputOracle to key the l2Outputs mapping by index instead of by L2 block number. -- Updated dependencies [43f33f39f] -- Updated dependencies [237a351f1] -- Updated dependencies [1d3c749a2] -- Updated dependencies [c975c9620] -- Updated dependencies [1594678e0] -- Updated dependencies [1d3c749a2] -- Updated dependencies [136ea1785] -- Updated dependencies [4d13f0afe] -- Updated dependencies [7300a7ca7] - - @eth-optimism/contracts-bedrock@0.11.0 - - @eth-optimism/contracts@0.5.39 - - @eth-optimism/core-utils@0.12.0 - -## 1.7.0 - -### Minor Changes - -- 1bfe79f20: Adds an implementation of the Two Step Withdrawals V2 proposal - -### Patch Changes - -- Updated dependencies [c025a1153] -- Updated dependencies [f8697a607] -- Updated dependencies [59adcaa09] -- Updated dependencies [c71500a7e] -- Updated dependencies [f49b71d50] -- Updated dependencies [1bfe79f20] -- Updated dependencies [ccaf5bc83] - - @eth-optimism/contracts-bedrock@0.10.0 - -## 1.6.11 - -### Patch Changes - -- Updated dependencies [52079cc12] -- Updated dependencies [13bfafb21] -- Updated dependencies [eeae96941] -- Updated dependencies [427831d86] - - @eth-optimism/contracts-bedrock@0.9.1 - -## 1.6.10 - -### Patch Changes - -- Updated dependencies [1e76cdb86] -- Updated dependencies [c02831144] -- Updated dependencies [d58b0a397] -- Updated dependencies [ff860ecf3] -- Updated dependencies [cc5adbc61] -- Updated dependencies [31c91ea74] -- Updated dependencies [87702c741] - - @eth-optimism/core-utils@0.11.0 - - @eth-optimism/contracts-bedrock@0.9.0 - - @eth-optimism/contracts@0.5.38 - -## 1.6.9 - -### Patch Changes - -- Updated dependencies [db84317b] -- Updated dependencies [9b90c732] - - @eth-optimism/contracts-bedrock@0.8.3 - -## 1.6.8 - -### Patch Changes - -- Updated dependencies [7d7d9ba8] - - @eth-optimism/contracts-bedrock@0.8.2 - -## 1.6.7 - -### Patch Changes - -- b40913b1: Adds contract addresses for the Bedrock Alpha testnet -- a5e715c3: Rename the event emitted in the L2ToL1MessagePasser -- Updated dependencies [35a7bb5e] -- Updated dependencies [a5e715c3] -- Updated dependencies [d18b8aa3] - - @eth-optimism/contracts-bedrock@0.8.1 - -## 1.6.6 - -### Patch Changes - -- Updated dependencies [6ed68fa3] -- Updated dependencies [628affc7] -- Updated dependencies [3d4e8529] -- Updated dependencies [caf5dd3e] -- Updated dependencies [740e1bcc] -- Updated dependencies [a6cbfee2] -- Updated dependencies [394a26ec] - - @eth-optimism/contracts-bedrock@0.8.0 - - @eth-optimism/contracts@0.5.37 - -## 1.6.5 - -### Patch Changes - -- e2faaa8b: Update for new BedrockMessagePasser contract -- Updated dependencies [cb5fed67] -- Updated dependencies [c427f0c0] -- Updated dependencies [e2faaa8b] -- Updated dependencies [d28ad592] -- Updated dependencies [76c8ee2d] - - @eth-optimism/contracts-bedrock@0.7.0 - -## 1.6.4 - -### Patch Changes - -- 7215f4ce: Bump ethers to 5.7.0 globally -- 206f6033: Fix outdated references to 'withdrawal contract' -- d7679ca4: Add source maps -- Updated dependencies [88dde7c8] -- Updated dependencies [7215f4ce] -- Updated dependencies [249a8ed6] -- Updated dependencies [7d7c4fdf] -- Updated dependencies [e164e22e] -- Updated dependencies [0bc1be45] -- Updated dependencies [af3e56b1] -- Updated dependencies [206f6033] -- Updated dependencies [88dde7c8] -- Updated dependencies [8790156c] -- Updated dependencies [515685f4] - - @eth-optimism/contracts-bedrock@0.6.3 - - @eth-optimism/contracts@0.5.36 - - @eth-optimism/core-utils@0.10.1 - -## 1.6.3 - -### Patch Changes - -- Updated dependencies [651a2883] - - @eth-optimism/contracts-bedrock@0.6.2 - -## 1.6.2 - -### Patch Changes - -- cfa81f88: Add DAI bridge support to Goerli -- Updated dependencies [85232179] -- Updated dependencies [593f1cfb] -- Updated dependencies [334a3eb0] -- Updated dependencies [f78eb056] - - @eth-optimism/contracts-bedrock@0.6.1 - - @eth-optimism/contracts@0.5.35 - -## 1.6.1 - -### Patch Changes - -- b27d0fa7: Add wsteth support for DAI bridge to sdk -- Updated dependencies [7fdc490c] -- Updated dependencies [3d228a0e] -- Updated dependencies [dbfea116] -- Updated dependencies [63ef1949] -- Updated dependencies [299157e7] - - @eth-optimism/contracts-bedrock@0.6.0 - - @eth-optimism/core-utils@0.10.0 - - @eth-optimism/contracts@0.5.34 - -## 1.6.0 - -### Minor Changes - -- 3af9c7a9: Removes the ICrossChainMessenger interface to speed up SDK development. - -### Patch Changes - -- 3df66a9a: Fix eth withdrawal bug -- 8323407f: Fixes a bug in the SDK for certain bridge withdrawals. -- aa2949ef: Add eth withdrawal support -- a1a73e64: Updates the SDK to pull contract addresses from the deployments of the contracts package. Updates the Contracts package to export a function that makes it possible to pull deployed addresses. -- f53c30b9: Minor refactor to variables within the SDK package. -- Updated dependencies [a095d544] -- Updated dependencies [cdf2163e] -- Updated dependencies [791f30bc] -- Updated dependencies [193befed] -- Updated dependencies [0c2719f8] -- Updated dependencies [02420db0] -- Updated dependencies [94a8f287] -- Updated dependencies [7d03c5c0] -- Updated dependencies [fec22bfe] -- Updated dependencies [9272253e] -- Updated dependencies [a1a73e64] -- Updated dependencies [c025f418] -- Updated dependencies [329d21b6] -- Updated dependencies [35eafed0] -- Updated dependencies [3cde9205] - - @eth-optimism/contracts-bedrock@0.5.4 - - @eth-optimism/contracts@0.5.33 - -## 1.5.0 - -### Minor Changes - -- dcd715a6: Update wsteth bridge address - -## 1.4.0 - -### Minor Changes - -- f05ab6b6: Add wstETH to sdk -- 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. - -### Patch Changes - -- Updated dependencies [056cb982] -- Updated dependencies [a32e68ac] -- Updated dependencies [c648d55c] -- Updated dependencies [d544f804] -- Updated dependencies [ccbfe545] -- Updated dependencies [c97ad241] -- Updated dependencies [0df744f6] -- Updated dependencies [45541553] -- Updated dependencies [3dd296e8] -- Updated dependencies [fe94b864] -- Updated dependencies [28649d64] -- Updated dependencies [898c7ac5] -- Updated dependencies [51a1595b] -- Updated dependencies [8ae39154] -- Updated dependencies [af96563a] -- Updated dependencies [dac4a9f0] - - @eth-optimism/contracts-bedrock@0.5.3 - - @eth-optimism/core-utils@0.9.3 - - @eth-optimism/contracts@0.5.32 - -## 1.3.1 - -### Patch Changes - -- 680714c1: Updates the CCM to throw a better error for missing or invalid chain IDs -- 29830750: Update the Goerli SCC's address -- Updated dependencies [0bf3b9b4] -- Updated dependencies [8d26459b] -- Updated dependencies [4477fe9f] -- Updated dependencies [1de4f48e] - - @eth-optimism/core-utils@0.9.2 - - @eth-optimism/contracts@0.5.31 - -## 1.3.0 - -### Minor Changes - -- 032f7214: Update Goerli SDK addresses for new Goerli testnet - -## 1.2.1 - -### Patch Changes - -- Updated dependencies [6e3449ba] -- Updated dependencies [f9fee446] - - @eth-optimism/contracts@0.5.30 - - @eth-optimism/core-utils@0.9.1 - -## 1.2.0 - -### Minor Changes - -- 977493bc: Have SDK use L2 chain ID as the source of truth. - -### Patch Changes - -- Updated dependencies [700dcbb0] - - @eth-optimism/core-utils@0.9.0 - - @eth-optimism/contracts@0.5.29 - -## 1.1.9 - -### Patch Changes - -- 29ff7462: Revert es target back to 2017 -- Updated dependencies [27234f68] -- Updated dependencies [29ff7462] - - @eth-optimism/contracts@0.5.28 - - @eth-optimism/core-utils@0.8.7 - -## 1.1.8 - -### Patch Changes - -- Updated dependencies [7c5ac36f] -- Updated dependencies [3d4d988c] - - @eth-optimism/contracts@0.5.27 - -## 1.1.7 - -### Patch Changes - -- Updated dependencies [17962ca9] - - @eth-optimism/core-utils@0.8.6 - - @eth-optimism/contracts@0.5.26 - -## 1.1.6 - -### Patch Changes - -- d18ae135: Updates all ethers versions in response to BN.js bug -- Updated dependencies [d18ae135] - - @eth-optimism/contracts@0.5.25 - - @eth-optimism/core-utils@0.8.5 - -## 1.1.5 - -### Patch Changes - -- 86901552: Fixes a bug in the SDK which would cause the SDK to throw if no tx nonce is provided - -## 1.1.4 - -### Patch Changes - -- Updated dependencies [b7a04acf] - - @eth-optimism/contracts@0.5.24 - -## 1.1.3 - -### Patch Changes - -- Updated dependencies [412688d5] - - @eth-optimism/contracts@0.5.23 - -## 1.1.2 - -### Patch Changes - -- Updated dependencies [51adb389] -- Updated dependencies [5cb3a5f7] -- Updated dependencies [6b9fc055] - - @eth-optimism/contracts@0.5.22 - - @eth-optimism/core-utils@0.8.4 - -## 1.1.1 - -### Patch Changes - -- 1338135c: Fixes a bug where the wrong Overrides type was being used for gas estimation functions - -## 1.1.0 - -### Minor Changes - -- a9f8e577: New isL2Provider helper function. Internal cleanups. - -### Patch Changes - -- Updated dependencies [5818decb] - - @eth-optimism/contracts@0.5.21 - -## 1.0.4 - -### Patch Changes - -- b57014d1: Update to typescript@4.6.2 -- Updated dependencies [d040a8d9] -- Updated dependencies [b57014d1] - - @eth-optimism/contracts@0.5.20 - - @eth-optimism/core-utils@0.8.3 - -## 1.0.3 - -### Patch Changes - -- c1957126: Update Dockerfile to use Alpine -- d9a51154: Bump to hardhat@2.9.1 -- Updated dependencies [c1957126] -- Updated dependencies [d9a51154] - - @eth-optimism/contracts@0.5.19 - - @eth-optimism/core-utils@0.8.2 - -## 1.0.2 - -### Patch Changes - -- d49feca1: Comment out non-functional getMessagesByAddress function -- Updated dependencies [88601cb7] - - @eth-optimism/contracts@0.5.18 - -## 1.0.1 - -### Patch Changes - -- 7ae1c67f: Update package json to include correct repo link -- 47e5d118: Tighten type restriction on ProviderLike -- Updated dependencies [175ae0bf] - - @eth-optimism/contracts@0.5.17 - -## 1.0.0 - -### Major Changes - -- 84f63c49: Update README and bump SDK to 1.0.0 - -### Patch Changes - -- 42227d69: Fix typo in constructor docstring - -## 0.2.5 - -### Patch Changes - -- b66e3131: Add a function for waiting for a particular message status -- Updated dependencies [962f36e4] -- Updated dependencies [f2179e37] -- Updated dependencies [b6a4fa4b] -- Updated dependencies [b7c0a5ca] -- Updated dependencies [5a6f539c] -- Updated dependencies [27d8942e] - - @eth-optimism/contracts@0.5.16 - - @eth-optimism/core-utils@0.8.1 - -## 0.2.4 - -### Patch Changes - -- 44420939: 1. Fix a bug in `L2Provider.getL1GasPrice()` 2. Make it easier to get correct estimates from `L2Provider.estimateL1Gas()` and `L2.estimateL2GasCost`. - -## 0.2.3 - -### Patch Changes - -- f37c283c: Have SDK properly handle case when no batches are submitted yet -- 3f4d3c13: Have SDK wait for transactions in getMessagesByTransaction -- 0c54e60e: Add approval functions to the SDK -- Updated dependencies [0b4453f7] -- Updated dependencies [78298782] - - @eth-optimism/core-utils@0.8.0 - - @eth-optimism/contracts@0.5.15 - -## 0.2.2 - -### Patch Changes - -- fd6ea3ee: Adds support for depositing or withdrawing to a target address -- 5ffb5fcf: Removes the getTokenBridgeMessagesByAddress function -- dd4b2055: This update implements the asL2Provider function -- f08c06a8: Updates the SDK to include default bridges for the local Optimism network (31337) -- da53dc64: Have SDK sort deposits/withdrawals descending by block number -- Updated dependencies [b4165299] -- Updated dependencies [3c2acd91] - - @eth-optimism/core-utils@0.7.7 - - @eth-optimism/contracts@0.5.14 - -## 0.2.1 - -### Patch Changes - -- Updated dependencies [438bc78a] - - @eth-optimism/contracts@0.5.13 - -## 0.2.0 - -### Minor Changes - -- dd9683bb: Correctly export SDK contents - -## 0.1.0 - -### Minor Changes - -- cb65f3d8: Beta release of the Optimism SDK - -### Patch Changes - -- ba14c59d: Updates various ethers dependencies to their latest versions -- 64e746b6: Have SDK include ethers as a peer dependency -- Updated dependencies [ba14c59d] - - @eth-optimism/contracts@0.5.12 - - @eth-optimism/core-utils@0.7.6 - -## 0.0.7 - -### Patch Changes - -- Updated dependencies [e631c39c] - - @eth-optimism/contracts@0.5.11 - -## 0.0.6 - -### Patch Changes - -- Updated dependencies [ad94b9d1] - - @eth-optimism/core-utils@0.7.5 - - @eth-optimism/contracts@0.5.10 - -## 0.0.5 - -### Patch Changes - -- Updated dependencies [ba96a455] -- Updated dependencies [c3e85fef] - - @eth-optimism/core-utils@0.7.4 - - @eth-optimism/contracts@0.5.9 - -## 0.0.4 - -### Patch Changes - -- Updated dependencies [b3efb8b7] -- Updated dependencies [279603e5] -- Updated dependencies [b6040bb3] - - @eth-optimism/contracts@0.5.8 - -## 0.0.3 - -### Patch Changes - -- Updated dependencies [b6f89fad] - - @eth-optimism/contracts@0.5.7 - -## 0.0.2 - -### Patch Changes - -- Updated dependencies [bbd42e03] -- Updated dependencies [453f0774] - - @eth-optimism/contracts@0.5.6 diff --git a/packages/sdk/LICENSE b/packages/sdk/LICENSE deleted file mode 100644 index 6a7da5218bb2..000000000000 --- a/packages/sdk/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/sdk/README.md b/packages/sdk/README.md deleted file mode 100644 index 3c1ac04157c1..000000000000 --- a/packages/sdk/README.md +++ /dev/null @@ -1,60 +0,0 @@ - -# @eth-optimism/sdk - -[![codecov](https://codecov.io/gh/ethereum-optimism/optimism/branch/master/graph/badge.svg?token=0VTG7PG7YR&flag=sdk-tests)](https://codecov.io/gh/ethereum-optimism/optimism) - -The `@eth-optimism/sdk` package provides a set of tools for interacting with Optimism. - -## Warning!!! - -`@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 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 -- Better performance -- Updated to use the latest op stack contracts. At times it will save you gas compared to using viem. - -If viem does not have what you need please let us know by opening an issue in the viem repo or here. Letting us know helps us advocate to upstream more functionality to viem. Viem is missing the following functionality: - -- ERC20 support - -If viem doesn't have what you need, the extensions for viem, [op-viem extensions](https://github.com/base-org/op-viem), likely have it too. - -## Installation - -``` -npm install @eth-optimism/sdk -``` - -## Docs - -You can find auto-generated API documentation over at [sdk.optimism.io](https://sdk.optimism.io). - -## Contributing - -Most of the core functionality is in the [CrossChainMessenger](./src/cross-chain-messenger.ts) file. - -## Using the SDK - -### CrossChainMessenger - -The [`CrossChainMessenger`](https://github.com/ethereum-optimism/optimism/blob/develop/packages/sdk/src/cross-chain-messenger.ts) class simplifies the process of moving assets and data between Ethereum and Optimism. -You can use this class to, for example, initiate a withdrawal of ERC20 tokens from Optimism back to Ethereum, accurately track when the withdrawal is ready to be finalized on Ethereum, and execute the finalization transaction after the challenge period has elapsed. -The `CrossChainMessenger` can handle deposits and withdrawals of ETH and any ERC20-compatible token. -Detailed API descriptions can be found at [sdk.optimism.io](https://sdk.optimism.io/classes/crosschainmessenger). -The `CrossChainMessenger` automatically connects to all relevant contracts so complex configuration is not necessary. - -### L2Provider and related utilities - -The Optimism SDK includes [various utilities](https://github.com/ethereum-optimism/optimism/blob/develop/packages/sdk/src/l2-provider.ts) for handling Optimism's [transaction fee model](https://community.optimism.io/docs/developers/build/transaction-fees/). -For instance, [`estimateTotalGasCost`](https://sdk.optimism.io/modules.html#estimateTotalGasCost) will estimate the total cost (in wei) to send at transaction on Optimism including both the L2 execution cost and the L1 data cost. -You can also use the [`asL2Provider`](https://sdk.optimism.io/modules.html#asL2Provider) function to wrap an ethers Provider object into an `L2Provider` which will have all of these helper functions attached. - -### Other utilities - -The SDK contains other useful helper functions and constants. -For a complete list, refer to the auto-generated [SDK documentation](https://sdk.optimism.io/) diff --git a/packages/sdk/example.env b/packages/sdk/example.env deleted file mode 100644 index b8855b67b433..000000000000 --- a/packages/sdk/example.env +++ /dev/null @@ -1,4 +0,0 @@ -// public rpcs are heavily throttled/rate limited so replace these with rpcs with apikeys. These are meant to be testnet rpcs -// in future these will get renamed to VITE_E2E_RPC_URL_GOERLI etc. -VITE_E2E_RPC_URL_L1=https://ethereum-goerli.publicnode.com -VITE_E2E_RPC_URL_L2=https://goerli.optimism.io \ No newline at end of file diff --git a/packages/sdk/hardhat.config.ts b/packages/sdk/hardhat.config.ts deleted file mode 100644 index 717317b8a933..000000000000 --- a/packages/sdk/hardhat.config.ts +++ /dev/null @@ -1,80 +0,0 @@ -import { HardhatUserConfig } from 'hardhat/types' -import { ethers } from 'ethers' - -import '@nomiclabs/hardhat-ethers' -import '@nomiclabs/hardhat-waffle' -import 'hardhat-deploy' - -import './tasks' - -const config: HardhatUserConfig = { - solidity: { - version: '0.8.9', - }, - paths: { - sources: './test/contracts', - }, - networks: { - mainnet: { - url: process.env.L1_RPC || 'https://mainnet-l1-rehearsal.optimism.io', - accounts: [ - 'ac0974bec39a17e36ba4a6b4d238ff944bacb478cbed5efcae784d7bf4f2ff80', - ], - }, - devnetL1: { - url: 'http://localhost:8545', - accounts: [ - // warning: keys 0 - 12 (incl) are used by the system - 'ac0974bec39a17e36ba4a6b4d238ff944bacb478cbed5efcae784d7bf4f2ff80', // 0 - '59c6995e998f97a5a0044966f0945389dc9e86dae88c7a8412f4603b6b78690d', // 1 - '5de4111afa1a4b94908f83103eb1f1706367c2e68ca870fc3fb9a804cdab365a', // 2 - '7c852118294e51e653712a81e05800f419141751be58f605c371e15141b007a6', // 3 - '47e179ec197488593b187f80a00eb0da91f1b9d0b13f8733639f19c30a34926a', // 4 - '8b3a350cf5c34c9194ca85829a2df0ec3153be0318b5e2d3348e872092edffba', // 5 - '92db14e403b83dfe3df233f83dfa3a0d7096f21ca9b0d6d6b8d88b2b4ec1564e', // 6 - '4bbbf85ce3377467afe5d46f804f221813b2bb87f24d81f60f1fcdbf7cbf4356', // 7 - 'dbda1821b80551c9d65939329250298aa3472ba22feea921c0cf5d620ea67b97', // 8 - '2a871d0798f97d79848a013d4936a73bf4cc922c825d33c1cf7073dff6d409c6', // 9 - 'f214f2b2cd398c806f84e317254e0f0b801d0643303237d97a22a48e01628897', // 10 - '701b615bbdfb9de65240bc28bd21bbc0d996645a3dd57e7b12bc2bdf6f192c82', // 11 - 'a267530f49f8280200edf313ee7af6b827f2a8bce2897751d06a843f644967b1', // 12 - '47c99abed3324a2707c28affff1267e45918ec8c3f20b8aa892e8b065d2942dd', // 13 - 'c526ee95bf44d8fc405a158bb884d9d1238d99f0612e9f33d006bb0789009aaa', // 14 - '8166f546bab6da521a8369cab06c5d2b9e46670292d85c875ee9ec20e84ffb61', // 15 - 'ea6c44ac03bff858b476bba40716402b03e41b8e97e276d1baec7c37d42484a0', // 16 - '689af8efa8c651a91ad287602527f3af2fe9f6501a7ac4b061667b5a93e037fd', // 17 - 'de9be858da4a475276426320d5e9262ecfc3ba460bfac56360bfa6c4c28b4ee0', // 18 - 'df57089febbacf7ba0bc227dafbffa9fc08a93fdc68e1e42411a14efcf23656e', // 19 - ], - }, - hivenet: { - url: process.env.L1_RPC || '', - accounts: [process.env.PRIVATE_KEY_DEPLOYER || ethers.constants.HashZero], - }, - goerli: { - url: process.env.L1_RPC || '', - accounts: [process.env.PRIVATE_KEY_DEPLOYER || ethers.constants.HashZero], - }, - }, - external: { - contracts: [ - { - artifacts: '../contracts-bedrock/artifacts', - }, - ], - deployments: { - mainnet: [ - '../contracts/deployments/mainnet', - '../contracts-bedrock/deployments/mainnet', - ], - hivenet: ['../contracts-bedrock/deployments/hivenet'], - devnetL1: ['../contracts-bedrock/deployments/devnetL1'], - goerli: [ - '../contracts-bedrock/deployments/goerli', - '../contracts/deployments/goerli', - ], - }, - }, -} - -export default config diff --git a/packages/sdk/package.json b/packages/sdk/package.json deleted file mode 100644 index 3560cff4bbbd..000000000000 --- a/packages/sdk/package.json +++ /dev/null @@ -1,74 +0,0 @@ -{ - "name": "@eth-optimism/sdk", - "version": "3.3.1", - "description": "[Optimism] Tools for working with Optimism", - "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": "pnpm lint:fix && pnpm lint:check", - "lint:check": "eslint . --max-warnings=0", - "lint:fix": "pnpm lint:check --fix", - "pre-commit": "lint-staged", - "test": "hardhat test", - "test:next": "vitest", - "test:next:run": "vitest run", - "test:coverage": "nyc hardhat test && nyc merge .nyc_output coverage.json", - "autogen:docs": "typedoc --out docs src/index.ts" - }, - "keywords": [ - "optimism", - "ethereum", - "sdk" - ], - "homepage": "https://github.com/ethereum-optimism/optimism/tree/develop/packages/sdk#readme", - "license": "MIT", - "author": "Optimism PBC", - "repository": { - "type": "git", - "url": "https://github.com/ethereum-optimism/optimism.git" - }, - "devDependencies": { - "@ethersproject/abstract-provider": "^5.7.0", - "@ethersproject/abstract-signer": "^5.7.0", - "@ethersproject/transactions": "^5.7.0", - "@nomiclabs/hardhat-ethers": "^2.2.3", - "@nomiclabs/hardhat-waffle": "^2.0.1", - "@types/chai": "^4.3.11", - "@types/chai-as-promised": "^7.1.8", - "@types/mocha": "^10.0.6", - "@types/node": "^20.11.17", - "@types/semver": "^7.5.7", - "chai-as-promised": "^7.1.1", - "ethereum-waffle": "^4.0.10", - "ethers": "^5.7.2", - "hardhat": "^2.20.1", - "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.4.5", - "viem": "^2.8.13", - "vitest": "^1.2.2", - "zod": "^3.22.4" - }, - "dependencies": { - "@eth-optimism/contracts": "0.6.0", - "@eth-optimism/core-utils": "^0.13.2", - "lodash": "^4.17.21", - "merkletreejs": "^0.3.11", - "rlp": "^2.2.7", - "semver": "^7.6.0" - }, - "peerDependencies": { - "ethers": "^5" - } -} diff --git a/packages/sdk/setupVitest.ts b/packages/sdk/setupVitest.ts deleted file mode 100644 index 0a879e628c88..000000000000 --- a/packages/sdk/setupVitest.ts +++ /dev/null @@ -1,4 +0,0 @@ -import fetch from 'isomorphic-fetch' - -// viem needs this -global.fetch = fetch diff --git a/packages/sdk/src/adapters/dai-bridge.ts b/packages/sdk/src/adapters/dai-bridge.ts deleted file mode 100644 index 3ef75b04aaad..000000000000 --- a/packages/sdk/src/adapters/dai-bridge.ts +++ /dev/null @@ -1,63 +0,0 @@ -/* eslint-disable @typescript-eslint/no-unused-vars */ -import { Contract } from 'ethers' -import { hexStringEquals } from '@eth-optimism/core-utils' - -import { AddressLike } from '../interfaces' -import { toAddress } from '../utils' -import { StandardBridgeAdapter } from './standard-bridge' - -/** - * Bridge adapter for DAI. - */ -export class DAIBridgeAdapter extends StandardBridgeAdapter { - public async supportsTokenPair( - l1Token: AddressLike, - l2Token: AddressLike - ): Promise<boolean> { - // Just need access to this ABI for this one function. - const l1Bridge = new Contract( - this.l1Bridge.address, - [ - { - inputs: [], - name: 'l1Token' as const, - outputs: [ - { - internalType: 'address' as const, - name: '' as const, - type: 'address' as const, - }, - ], - stateMutability: 'view' as const, - type: 'function' as const, - }, - { - inputs: [], - name: 'l2Token' as const, - outputs: [ - { - internalType: 'address' as const, - name: '' as const, - type: 'address' as const, - }, - ], - stateMutability: 'view' as const, - type: 'function' as const, - }, - ], - this.messenger.l1Provider - ) - - const allowedL1Token = await l1Bridge.l1Token() - if (!hexStringEquals(allowedL1Token, toAddress(l1Token))) { - return false - } - - const allowedL2Token = await l1Bridge.l2Token() - if (!hexStringEquals(allowedL2Token, toAddress(l2Token))) { - return false - } - - return true - } -} diff --git a/packages/sdk/src/adapters/eco-bridge.ts b/packages/sdk/src/adapters/eco-bridge.ts deleted file mode 100644 index 8fa8668c433a..000000000000 --- a/packages/sdk/src/adapters/eco-bridge.ts +++ /dev/null @@ -1,73 +0,0 @@ -/* eslint-disable @typescript-eslint/no-unused-vars */ -import { Contract } from 'ethers' -import { hexStringEquals } from '@eth-optimism/core-utils' - -import { AddressLike } from '../interfaces' -import { toAddress } from '../utils' -import { StandardBridgeAdapter } from './standard-bridge' - -/** - * Bridge adapter for ECO. - * ECO bridge requires a separate adapter as exposes different functions than our standard bridge - */ -export class ECOBridgeAdapter extends StandardBridgeAdapter { - public async supportsTokenPair( - l1Token: AddressLike, - l2Token: AddressLike - ): Promise<boolean> { - const l1Bridge = new Contract( - this.l1Bridge.address, - [ - { - inputs: [], - name: 'l1Eco', - outputs: [ - { - internalType: 'address', - name: '', - type: 'address', - }, - ], - stateMutability: 'view', - type: 'function', - }, - ], - this.messenger.l1Provider - ) - - const l2Bridge = new Contract( - this.l2Bridge.address, - [ - { - inputs: [], - name: 'l2Eco', - outputs: [ - { - internalType: 'contract L2ECO', - name: '', - type: 'address', - }, - ], - stateMutability: 'view', - type: 'function', - }, - ], - this.messenger.l2Provider - ) - - const [remoteL1Token, remoteL2Token] = await Promise.all([ - l1Bridge.l1Eco(), - l2Bridge.l2Eco(), - ]) - - if (!hexStringEquals(remoteL1Token, toAddress(l1Token))) { - return false - } - - if (!hexStringEquals(remoteL2Token, toAddress(l2Token))) { - return false - } - - return true - } -} diff --git a/packages/sdk/src/adapters/eth-bridge.ts b/packages/sdk/src/adapters/eth-bridge.ts deleted file mode 100644 index b45bffdaec28..000000000000 --- a/packages/sdk/src/adapters/eth-bridge.ts +++ /dev/null @@ -1,201 +0,0 @@ -/* eslint-disable @typescript-eslint/no-unused-vars */ -import { ethers, Overrides, BigNumber } from 'ethers' -import { TransactionRequest, BlockTag } from '@ethersproject/abstract-provider' -import { predeploys } from '@eth-optimism/contracts' -import { hexStringEquals } from '@eth-optimism/core-utils' - -import { - NumberLike, - AddressLike, - TokenBridgeMessage, - MessageDirection, -} from '../interfaces' -import { toAddress, omit } from '../utils' -import { StandardBridgeAdapter } from './standard-bridge' - -/** - * Bridge adapter for the ETH bridge. - */ -export class ETHBridgeAdapter extends StandardBridgeAdapter { - public async approval( - l1Token: AddressLike, - l2Token: AddressLike, - signer: ethers.Signer - ): Promise<BigNumber> { - throw new Error(`approval not necessary for ETH bridge`) - } - - public async getDepositsByAddress( - address: AddressLike, - opts?: { - fromBlock?: BlockTag - toBlock?: BlockTag - } - ): Promise<TokenBridgeMessage[]> { - const events = await this.l1Bridge.queryFilter( - this.l1Bridge.filters.ETHDepositInitiated(address), - opts?.fromBlock, - opts?.toBlock - ) - - return events - .map((event) => { - return { - direction: MessageDirection.L1_TO_L2, - from: event.args.from, - to: event.args.to, - l1Token: ethers.constants.AddressZero, - l2Token: predeploys.OVM_ETH, - amount: event.args.amount, - data: event.args.extraData, - logIndex: event.logIndex, - blockNumber: event.blockNumber, - transactionHash: event.transactionHash, - } - }) - .sort((a, b) => { - // Sort descending by block number - return b.blockNumber - a.blockNumber - }) - } - - public async getWithdrawalsByAddress( - address: AddressLike, - opts?: { - fromBlock?: BlockTag - toBlock?: BlockTag - } - ): Promise<TokenBridgeMessage[]> { - const events = await this.l2Bridge.queryFilter( - this.l2Bridge.filters.WithdrawalInitiated(undefined, undefined, address), - opts?.fromBlock, - opts?.toBlock - ) - - return events - .filter((event) => { - // Only find ETH withdrawals. - return ( - hexStringEquals(event.args.l1Token, ethers.constants.AddressZero) && - hexStringEquals(event.args.l2Token, predeploys.OVM_ETH) - ) - }) - .map((event) => { - return { - direction: MessageDirection.L2_TO_L1, - from: event.args.from, - to: event.args.to, - l1Token: event.args.l1Token, - l2Token: event.args.l2Token, - amount: event.args.amount, - data: event.args.extraData, - logIndex: event.logIndex, - blockNumber: event.blockNumber, - transactionHash: event.transactionHash, - } - }) - .sort((a, b) => { - // Sort descending by block number - return b.blockNumber - a.blockNumber - }) - } - - public async supportsTokenPair( - l1Token: AddressLike, - l2Token: AddressLike - ): Promise<boolean> { - // Only support ETH deposits and withdrawals. - return ( - hexStringEquals(toAddress(l1Token), ethers.constants.AddressZero) && - hexStringEquals(toAddress(l2Token), predeploys.OVM_ETH) - ) - } - - populateTransaction = { - approve: async ( - l1Token: AddressLike, - l2Token: AddressLike, - amount: NumberLike, - opts?: { - overrides?: Overrides - } - ): Promise<never> => { - throw new Error(`approvals not necessary for ETH bridge`) - }, - - deposit: async ( - l1Token: AddressLike, - l2Token: AddressLike, - amount: NumberLike, - opts?: { - recipient?: AddressLike - l2GasLimit?: NumberLike - overrides?: Overrides - } - ): Promise<TransactionRequest> => { - if (!(await this.supportsTokenPair(l1Token, l2Token))) { - throw new Error(`token pair not supported by bridge`) - } - - if (opts?.recipient === undefined) { - return this.l1Bridge.populateTransaction.depositETH( - opts?.l2GasLimit || 200_000, // Default to 200k gas limit. - '0x', // No data. - { - ...omit(opts?.overrides || {}, 'value'), - value: amount, - } - ) - } else { - return this.l1Bridge.populateTransaction.depositETHTo( - toAddress(opts.recipient), - opts?.l2GasLimit || 200_000, // Default to 200k gas limit. - '0x', // No data. - { - ...omit(opts?.overrides || {}, 'value'), - value: amount, - } - ) - } - }, - - withdraw: async ( - l1Token: AddressLike, - l2Token: AddressLike, - amount: NumberLike, - opts?: { - recipient?: AddressLike - overrides?: Overrides - } - ): Promise<TransactionRequest> => { - if (!(await this.supportsTokenPair(l1Token, l2Token))) { - throw new Error(`token pair not supported by bridge`) - } - - if (opts?.recipient === undefined) { - return this.l2Bridge.populateTransaction.withdraw( - toAddress(l2Token), - amount, - 0, // L1 gas not required. - '0x', // No data. - { - ...omit(opts?.overrides || {}, 'value'), - value: this.messenger.bedrock ? amount : 0, - } - ) - } else { - return this.l2Bridge.populateTransaction.withdrawTo( - toAddress(l2Token), - toAddress(opts.recipient), - amount, - 0, // L1 gas not required. - '0x', // No data. - { - ...omit(opts?.overrides || {}, 'value'), - value: this.messenger.bedrock ? amount : 0, - } - ) - } - }, - } -} diff --git a/packages/sdk/src/adapters/index.ts b/packages/sdk/src/adapters/index.ts deleted file mode 100644 index 21b6f580b198..000000000000 --- a/packages/sdk/src/adapters/index.ts +++ /dev/null @@ -1,4 +0,0 @@ -export * from './standard-bridge' -export * from './eth-bridge' -export * from './dai-bridge' -export * from './eco-bridge' diff --git a/packages/sdk/src/adapters/standard-bridge.ts b/packages/sdk/src/adapters/standard-bridge.ts deleted file mode 100644 index 9e5315cf421a..000000000000 --- a/packages/sdk/src/adapters/standard-bridge.ts +++ /dev/null @@ -1,390 +0,0 @@ -/* eslint-disable @typescript-eslint/no-unused-vars */ -import { - ethers, - Contract, - Overrides, - Signer, - BigNumber, - CallOverrides, -} from 'ethers' -import { - TransactionRequest, - TransactionResponse, - BlockTag, -} from '@ethersproject/abstract-provider' -import { predeploys } from '@eth-optimism/contracts' -import { hexStringEquals } from '@eth-optimism/core-utils' - -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, - NumberLike, - AddressLike, - TokenBridgeMessage, - MessageDirection, -} from '../interfaces' -import { toAddress } from '../utils' - -/** - * Bridge adapter for any token bridge that uses the standard token bridge interface. - */ -export class StandardBridgeAdapter implements IBridgeAdapter { - public messenger: CrossChainMessenger - public l1Bridge: Contract - public l2Bridge: Contract - - /** - * Creates a StandardBridgeAdapter instance. - * - * @param opts Options for the adapter. - * @param opts.messenger Provider used to make queries related to cross-chain interactions. - * @param opts.l1Bridge L1 bridge contract. - * @param opts.l2Bridge L2 bridge contract. - */ - constructor(opts: { - messenger: CrossChainMessenger - l1Bridge: AddressLike - l2Bridge: AddressLike - }) { - this.messenger = opts.messenger - this.l1Bridge = new Contract( - toAddress(opts.l1Bridge), - l1StandardBridgeArtifact.abi, - this.messenger.l1Provider - ) - this.l2Bridge = new Contract( - toAddress(opts.l2Bridge), - l2StandardBridgeArtifact.abi, - this.messenger.l2Provider - ) - } - - public async getDepositsByAddress( - address: AddressLike, - opts?: { - fromBlock?: BlockTag - toBlock?: BlockTag - } - ): Promise<TokenBridgeMessage[]> { - const events = await this.l1Bridge.queryFilter( - this.l1Bridge.filters.ERC20DepositInitiated( - undefined, - undefined, - address - ), - opts?.fromBlock, - opts?.toBlock - ) - - return events - .filter((event) => { - // Specifically filter out ETH. ETH deposits and withdrawals are handled by the ETH bridge - // adapter. Bridges that are not the ETH bridge should not be able to handle or even - // present ETH deposits or withdrawals. - return ( - !hexStringEquals(event.args.l1Token, ethers.constants.AddressZero) && - !hexStringEquals(event.args.l2Token, predeploys.OVM_ETH) - ) - }) - .map((event) => { - return { - direction: MessageDirection.L1_TO_L2, - from: event.args.from, - to: event.args.to, - l1Token: event.args.l1Token, - l2Token: event.args.l2Token, - amount: event.args.amount, - data: event.args.extraData, - logIndex: event.logIndex, - blockNumber: event.blockNumber, - transactionHash: event.transactionHash, - } - }) - .sort((a, b) => { - // Sort descending by block number - return b.blockNumber - a.blockNumber - }) - } - - public async getWithdrawalsByAddress( - address: AddressLike, - opts?: { - fromBlock?: BlockTag - toBlock?: BlockTag - } - ): Promise<TokenBridgeMessage[]> { - const events = await this.l2Bridge.queryFilter( - this.l2Bridge.filters.WithdrawalInitiated(undefined, undefined, address), - opts?.fromBlock, - opts?.toBlock - ) - - return events - .filter((event) => { - // Specifically filter out ETH. ETH deposits and withdrawals are handled by the ETH bridge - // adapter. Bridges that are not the ETH bridge should not be able to handle or even - // present ETH deposits or withdrawals. - return ( - !hexStringEquals(event.args.l1Token, ethers.constants.AddressZero) && - !hexStringEquals(event.args.l2Token, predeploys.OVM_ETH) - ) - }) - .map((event) => { - return { - direction: MessageDirection.L2_TO_L1, - from: event.args.from, - to: event.args.to, - l1Token: event.args.l1Token, - l2Token: event.args.l2Token, - amount: event.args.amount, - data: event.args.extraData, - logIndex: event.logIndex, - blockNumber: event.blockNumber, - transactionHash: event.transactionHash, - } - }) - .sort((a, b) => { - // Sort descending by block number - return b.blockNumber - a.blockNumber - }) - } - - public async supportsTokenPair( - l1Token: AddressLike, - l2Token: AddressLike - ): Promise<boolean> { - const contract = new Contract( - toAddress(l2Token), - optimismMintableERC20.abi, - this.messenger.l2Provider - ) - // Don't support ETH deposits or withdrawals via this bridge. - if ( - hexStringEquals(toAddress(l1Token), ethers.constants.AddressZero) || - hexStringEquals(toAddress(l2Token), predeploys.OVM_ETH) - ) { - return false - } - - // Make sure the L1 token matches. - const remoteL1Token = await contract.l1Token() - - if (!hexStringEquals(remoteL1Token, toAddress(l1Token))) { - return false - } - - // Make sure the L2 bridge matches. - const remoteL2Bridge = await contract.l2Bridge() - if (!hexStringEquals(remoteL2Bridge, this.l2Bridge.address)) { - return false - } - - return true - } - - public async approval( - l1Token: AddressLike, - l2Token: AddressLike, - signer: ethers.Signer - ): Promise<BigNumber> { - if (!(await this.supportsTokenPair(l1Token, l2Token))) { - throw new Error(`token pair not supported by bridge`) - } - - const token = new Contract( - toAddress(l1Token), - optimismMintableERC20.abi, - this.messenger.l1Provider - ) - - return token.allowance(await signer.getAddress(), this.l1Bridge.address) - } - - public async approve( - l1Token: AddressLike, - l2Token: AddressLike, - amount: NumberLike, - signer: Signer, - opts?: { - overrides?: Overrides - } - ): Promise<TransactionResponse> { - return signer.sendTransaction( - await this.populateTransaction.approve(l1Token, l2Token, amount, opts) - ) - } - - public async deposit( - l1Token: AddressLike, - l2Token: AddressLike, - amount: NumberLike, - signer: Signer, - opts?: { - recipient?: AddressLike - l2GasLimit?: NumberLike - overrides?: Overrides - } - ): Promise<TransactionResponse> { - return signer.sendTransaction( - await this.populateTransaction.deposit(l1Token, l2Token, amount, opts) - ) - } - - public async withdraw( - l1Token: AddressLike, - l2Token: AddressLike, - amount: NumberLike, - signer: Signer, - opts?: { - recipient?: AddressLike - overrides?: Overrides - } - ): Promise<TransactionResponse> { - return signer.sendTransaction( - await this.populateTransaction.withdraw(l1Token, l2Token, amount, opts) - ) - } - - populateTransaction = { - approve: async ( - l1Token: AddressLike, - l2Token: AddressLike, - amount: NumberLike, - opts?: { - overrides?: Overrides - } - ): Promise<TransactionRequest> => { - if (!(await this.supportsTokenPair(l1Token, l2Token))) { - throw new Error(`token pair not supported by bridge`) - } - - const token = new Contract( - toAddress(l1Token), - optimismMintableERC20.abi, - this.messenger.l1Provider - ) - - return token.populateTransaction.approve( - this.l1Bridge.address, - amount, - opts?.overrides || {} - ) - }, - - deposit: async ( - l1Token: AddressLike, - l2Token: AddressLike, - amount: NumberLike, - opts?: { - recipient?: AddressLike - l2GasLimit?: NumberLike - overrides?: Overrides - } - ): Promise<TransactionRequest> => { - if (!(await this.supportsTokenPair(l1Token, l2Token))) { - throw new Error(`token pair not supported by bridge`) - } - - if (opts?.recipient === undefined) { - return this.l1Bridge.populateTransaction.depositERC20( - toAddress(l1Token), - toAddress(l2Token), - amount, - opts?.l2GasLimit || 200_000, // Default to 200k gas limit. - '0x', // No data. - opts?.overrides || {} - ) - } else { - return this.l1Bridge.populateTransaction.depositERC20To( - toAddress(l1Token), - toAddress(l2Token), - toAddress(opts.recipient), - amount, - opts?.l2GasLimit || 200_000, // Default to 200k gas limit. - '0x', // No data. - opts?.overrides || {} - ) - } - }, - - withdraw: async ( - l1Token: AddressLike, - l2Token: AddressLike, - amount: NumberLike, - opts?: { - recipient?: AddressLike - overrides?: Overrides - } - ): Promise<TransactionRequest> => { - if (!(await this.supportsTokenPair(l1Token, l2Token))) { - throw new Error(`token pair not supported by bridge`) - } - - if (opts?.recipient === undefined) { - return this.l2Bridge.populateTransaction.withdraw( - toAddress(l2Token), - amount, - 0, // L1 gas not required. - '0x', // No data. - opts?.overrides || {} - ) - } else { - return this.l2Bridge.populateTransaction.withdrawTo( - toAddress(l2Token), - toAddress(opts.recipient), - amount, - 0, // L1 gas not required. - '0x', // No data. - opts?.overrides || {} - ) - } - }, - } - - estimateGas = { - approve: async ( - l1Token: AddressLike, - l2Token: AddressLike, - amount: NumberLike, - opts?: { - overrides?: CallOverrides - } - ): Promise<BigNumber> => { - return this.messenger.l1Provider.estimateGas( - await this.populateTransaction.approve(l1Token, l2Token, amount, opts) - ) - }, - - deposit: async ( - l1Token: AddressLike, - l2Token: AddressLike, - amount: NumberLike, - opts?: { - recipient?: AddressLike - l2GasLimit?: NumberLike - overrides?: CallOverrides - } - ): Promise<BigNumber> => { - return this.messenger.l1Provider.estimateGas( - await this.populateTransaction.deposit(l1Token, l2Token, amount, opts) - ) - }, - - withdraw: async ( - l1Token: AddressLike, - l2Token: AddressLike, - amount: NumberLike, - opts?: { - recipient?: AddressLike - overrides?: CallOverrides - } - ): Promise<BigNumber> => { - return this.messenger.l2Provider.estimateGas( - await this.populateTransaction.withdraw(l1Token, l2Token, amount, opts) - ) - }, - } -} diff --git a/packages/sdk/src/cross-chain-messenger.ts b/packages/sdk/src/cross-chain-messenger.ts deleted file mode 100644 index 65df54dcf460..000000000000 --- a/packages/sdk/src/cross-chain-messenger.ts +++ /dev/null @@ -1,2801 +0,0 @@ -/* eslint-disable @typescript-eslint/no-unused-vars */ -import { - Provider, - BlockTag, - TransactionReceipt, - TransactionResponse, - TransactionRequest, -} from '@ethersproject/abstract-provider' -import { Signer } from '@ethersproject/abstract-signer' -import { - ethers, - BigNumber, - Overrides, - CallOverrides, - PayableOverrides, -} from 'ethers' -import { - sleep, - remove0x, - toHexString, - toRpcHexString, - encodeCrossDomainMessageV0, - encodeCrossDomainMessageV1, - BedrockOutputData, - BedrockCrossChainMessageProof, - decodeVersionedNonce, - encodeVersionedNonce, - getChainId, - hashCrossDomainMessagev0, - hashCrossDomainMessagev1, -} from '@eth-optimism/core-utils' -import { getContractInterface, predeploys } from '@eth-optimism/contracts' -import * as rlp from 'rlp' -import semver from 'semver' - -import { - OEContracts, - OEContractsLike, - MessageLike, - MessageRequestLike, - TransactionLike, - AddressLike, - NumberLike, - SignerOrProviderLike, - CrossChainMessage, - CrossChainMessageRequest, - CrossChainMessageProof, - MessageDirection, - MessageStatus, - TokenBridgeMessage, - MessageReceipt, - MessageReceiptStatus, - BridgeAdapterData, - BridgeAdapters, - StateRoot, - StateRootBatch, - IBridgeAdapter, - ProvenWithdrawal, - LowLevelMessage, - FPACProvenWithdrawal, -} from './interfaces' -import { - toSignerOrProvider, - toNumber, - toTransactionHash, - DeepPartial, - getAllOEContracts, - getBridgeAdapters, - makeMerkleTreeProof, - makeStateTrieProof, - hashLowLevelMessage, - migratedWithdrawalGasLimit, - DEPOSIT_CONFIRMATION_BLOCKS, - CHAIN_BLOCK_TIMES, - hashMessageHash, - getContractInterfaceBedrock, - toJsonRpcProvider, -} from './utils' - -export class CrossChainMessenger { - /** - * Provider connected to the L1 chain. - */ - public l1SignerOrProvider: Signer | Provider - - /** - * Provider connected to the L2 chain. - */ - public l2SignerOrProvider: Signer | Provider - - /** - * Chain ID for the L1 network. - */ - public l1ChainId: number - - /** - * Chain ID for the L2 network. - */ - public l2ChainId: number - - /** - * Contract objects attached to their respective providers and addresses. - */ - public contracts: OEContracts - - /** - * List of custom bridges for the given network. - */ - public bridges: BridgeAdapters - - /** - * Number of blocks before a deposit is considered confirmed. - */ - public depositConfirmationBlocks: number - - /** - * Estimated average L1 block time in seconds. - */ - public l1BlockTimeSeconds: number - - /** - * Whether or not Bedrock compatibility is enabled. - */ - 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. - * - * @param opts Options for the provider. - * @param opts.l1SignerOrProvider Signer or Provider for the L1 chain, or a JSON-RPC url. - * @param opts.l2SignerOrProvider Signer or Provider for the L2 chain, or a JSON-RPC url. - * @param opts.l1ChainId Chain ID for the L1 chain. - * @param opts.l2ChainId Chain ID for the L2 chain. - * @param opts.depositConfirmationBlocks Optional number of blocks before a deposit is confirmed. - * @param opts.l1BlockTimeSeconds Optional estimated block time in seconds for the L1 chain. - * @param opts.contracts Optional contract address overrides. - * @param opts.bridges Optional bridge address list. - * @param opts.bedrock Whether or not to enable Bedrock compatibility. - */ - constructor(opts: { - l1SignerOrProvider: SignerOrProviderLike - l2SignerOrProvider: SignerOrProviderLike - l1ChainId: NumberLike - l2ChainId: NumberLike - depositConfirmationBlocks?: NumberLike - l1BlockTimeSeconds?: NumberLike - contracts?: DeepPartial<OEContractsLike> - bridges?: BridgeAdapterData - bedrock?: boolean - }) { - this.bedrock = opts.bedrock ?? true - - this.l1SignerOrProvider = toSignerOrProvider(opts.l1SignerOrProvider) - this.l2SignerOrProvider = toSignerOrProvider(opts.l2SignerOrProvider) - - try { - this.l1ChainId = toNumber(opts.l1ChainId) - } catch (err) { - throw new Error(`L1 chain ID is missing or invalid: ${opts.l1ChainId}`) - } - - try { - this.l2ChainId = toNumber(opts.l2ChainId) - } catch (err) { - throw new Error(`L2 chain ID is missing or invalid: ${opts.l2ChainId}`) - } - - this.depositConfirmationBlocks = - opts?.depositConfirmationBlocks !== undefined - ? toNumber(opts.depositConfirmationBlocks) - : DEPOSIT_CONFIRMATION_BLOCKS[this.l2ChainId] || 0 - - this.l1BlockTimeSeconds = - opts?.l1BlockTimeSeconds !== undefined - ? toNumber(opts.l1BlockTimeSeconds) - : CHAIN_BLOCK_TIMES[this.l1ChainId] || 1 - - this.contracts = getAllOEContracts(this.l2ChainId, { - l1SignerOrProvider: this.l1SignerOrProvider, - l2SignerOrProvider: this.l2SignerOrProvider, - overrides: opts.contracts, - }) - - this.bridges = getBridgeAdapters(this.l2ChainId, this, { - overrides: opts.bridges, - contracts: opts.contracts, - }) - } - - /** - * Provider connected to the L1 chain. - */ - get l1Provider(): Provider { - if (Provider.isProvider(this.l1SignerOrProvider)) { - return this.l1SignerOrProvider - } else { - return this.l1SignerOrProvider.provider - } - } - - /** - * Provider connected to the L2 chain. - */ - get l2Provider(): Provider { - if (Provider.isProvider(this.l2SignerOrProvider)) { - return this.l2SignerOrProvider - } else { - return this.l2SignerOrProvider.provider - } - } - - /** - * Signer connected to the L1 chain. - */ - get l1Signer(): Signer { - if (Provider.isProvider(this.l1SignerOrProvider)) { - throw new Error(`messenger has no L1 signer`) - } else { - return this.l1SignerOrProvider - } - } - - /** - * Signer connected to the L2 chain. - */ - get l2Signer(): Signer { - if (Provider.isProvider(this.l2SignerOrProvider)) { - throw new Error(`messenger has no L2 signer`) - } else { - return this.l2SignerOrProvider - } - } - - /** - * Uses portal version to determine if the messenger is using fpac contracts. Better not to cache - * this value as it will change during the fpac upgrade and we want clients to automatically - * begin using the new logic without throwing any errors. - * - * @returns Whether or not the messenger is using fpac contracts. - */ - public async fpac(): Promise<boolean> { - if ( - this.contracts.l1.OptimismPortal.address === ethers.constants.AddressZero - ) { - // Only really relevant for certain SDK tests where the portal is not deployed. We should - // probably just update the tests so the portal gets deployed but feels like it's out of - // scope for the FPAC changes. - return false - } else { - return semver.gte( - await this.contracts.l1.OptimismPortal.version(), - '3.0.0' - ) - } - } - - /** - * Retrieves all cross chain messages sent within a given transaction. - * - * @param transaction Transaction hash or receipt to find messages from. - * @param opts Options object. - * @param opts.direction Direction to search for messages in. If not provided, will attempt to - * automatically search both directions under the assumption that a transaction hash will only - * exist on one chain. If the hash exists on both chains, will throw an error. - * @returns All cross chain messages sent within the transaction. - */ - public async getMessagesByTransaction( - transaction: TransactionLike, - opts: { - direction?: MessageDirection - } = {} - ): Promise<CrossChainMessage[]> { - // Wait for the transaction receipt if the input is waitable. - await (transaction as TransactionResponse).wait?.() - - // Convert the input to a transaction hash. - const txHash = toTransactionHash(transaction) - - let receipt: TransactionReceipt - if (opts.direction !== undefined) { - // Get the receipt for the requested direction. - if (opts.direction === MessageDirection.L1_TO_L2) { - receipt = await this.l1Provider.getTransactionReceipt(txHash) - } else { - receipt = await this.l2Provider.getTransactionReceipt(txHash) - } - } else { - // Try both directions, starting with L1 => L2. - receipt = await this.l1Provider.getTransactionReceipt(txHash) - if (receipt) { - opts.direction = MessageDirection.L1_TO_L2 - } else { - receipt = await this.l2Provider.getTransactionReceipt(txHash) - opts.direction = MessageDirection.L2_TO_L1 - } - } - - if (!receipt) { - throw new Error(`unable to find transaction receipt for ${txHash}`) - } - - // By this point opts.direction will always be defined. - const messenger = - opts.direction === MessageDirection.L1_TO_L2 - ? this.contracts.l1.L1CrossDomainMessenger - : this.contracts.l2.L2CrossDomainMessenger - - return receipt.logs - .filter((log) => { - // Only look at logs emitted by the messenger address - return log.address === messenger.address - }) - .filter((log) => { - // Only look at SentMessage logs specifically - const parsed = messenger.interface.parseLog(log) - return parsed.name === 'SentMessage' - }) - .map((log) => { - // Try to pull out the value field, but only if the very next log is a SentMessageExtension1 - // event which was introduced in the Bedrock upgrade. - let value = ethers.BigNumber.from(0) - const next = receipt.logs.find((l) => { - return ( - l.logIndex === log.logIndex + 1 && l.address === messenger.address - ) - }) - if (next) { - const nextParsed = messenger.interface.parseLog(next) - if (nextParsed.name === 'SentMessageExtension1') { - value = nextParsed.args.value - } - } - - // Convert each SentMessage log into a message object - const parsed = messenger.interface.parseLog(log) - return { - direction: opts.direction, - target: parsed.args.target, - sender: parsed.args.sender, - message: parsed.args.message, - messageNonce: parsed.args.messageNonce, - value, - minGasLimit: parsed.args.gasLimit, - logIndex: log.logIndex, - blockNumber: log.blockNumber, - transactionHash: log.transactionHash, - } - }) - } - - /** - * Transforms a legacy message into its corresponding Bedrock representation. - * - * @param message Legacy message to transform. - * @param messageIndex The index of the message, if multiple exist from multicall - * @returns Bedrock representation of the message. - */ - public async toBedrockCrossChainMessage( - message: MessageLike, - messageIndex = 0 - ): Promise<CrossChainMessage> { - const resolved = await this.toCrossChainMessage(message, messageIndex) - - // Bedrock messages are already in the correct format. - const { version } = decodeVersionedNonce(resolved.messageNonce) - if (version.eq(1)) { - return resolved - } - - let value = BigNumber.from(0) - if ( - resolved.direction === MessageDirection.L2_TO_L1 && - resolved.sender === this.contracts.l2.L2StandardBridge.address && - resolved.target === this.contracts.l1.L1StandardBridge.address - ) { - try { - ;[, , value] = - this.contracts.l1.L1StandardBridge.interface.decodeFunctionData( - 'finalizeETHWithdrawal', - resolved.message - ) - } catch (err) { - // No problem, not a message with value. - } - } - - return { - ...resolved, - value, - minGasLimit: BigNumber.from(0), - messageNonce: encodeVersionedNonce( - BigNumber.from(0), - resolved.messageNonce - ), - } - } - - /** - * Transforms a CrossChainMessenger message into its low-level representation inside the - * L2ToL1MessagePasser contract on L2. - * - * @param message Message to transform. - * @param messageIndex The index of the message, if multiple exist from multicall - * @return Transformed message. - */ - public async toLowLevelMessage( - message: MessageLike, - messageIndex = 0 - ): Promise<LowLevelMessage> { - const resolved = await this.toCrossChainMessage(message, messageIndex) - if (resolved.direction === MessageDirection.L1_TO_L2) { - throw new Error(`can only convert L2 to L1 messages to low level`) - } - - // We may have to update the message if it's a legacy message. - const { version } = decodeVersionedNonce(resolved.messageNonce) - let updated: CrossChainMessage - if (version.eq(0)) { - updated = await this.toBedrockCrossChainMessage(resolved, messageIndex) - } else { - updated = resolved - } - - // Encode the updated message, we need this for legacy messages. - const encoded = encodeCrossDomainMessageV1( - updated.messageNonce, - updated.sender, - updated.target, - updated.value, - updated.minGasLimit, - updated.message - ) - - // EVERYTHING following here is basically repeating the logic from getMessagesByTransaction - // consider cleaning this up - // We need to figure out the final withdrawal data that was used to compute the withdrawal hash - // inside the L2ToL1Message passer contract. Exact mechanism here depends on whether or not - // this is a legacy message or a new Bedrock message. - let gasLimit: BigNumber - let messageNonce: BigNumber - if (version.eq(0)) { - const chainID = await getChainId(this.l2Provider) - gasLimit = migratedWithdrawalGasLimit(encoded, chainID) - messageNonce = resolved.messageNonce - } else { - const receipt = await this.l2Provider.getTransactionReceipt( - ( - await this.toCrossChainMessage(message) - ).transactionHash - ) - - const withdrawals: ethers.utils.Result[] = [] - for (const log of receipt.logs) { - if (log.address === this.contracts.l2.BedrockMessagePasser.address) { - const decoded = - this.contracts.l2.L2ToL1MessagePasser.interface.parseLog(log) - if (decoded.name === 'MessagePassed') { - withdrawals.push(decoded.args) - } - } - } - - // Should not happen. - if (withdrawals.length === 0) { - throw new Error(`no withdrawals found in receipt`) - } - - const withdrawal = withdrawals[messageIndex] - if (!withdrawal) { - throw new Error( - `withdrawal index ${messageIndex} out of bounds there are ${withdrawals.length} withdrawals` - ) - } - messageNonce = withdrawal.nonce - gasLimit = withdrawal.gasLimit - } - - return { - messageNonce, - sender: this.contracts.l2.L2CrossDomainMessenger.address, - target: this.contracts.l1.L1CrossDomainMessenger.address, - value: updated.value, - minGasLimit: gasLimit, - message: encoded, - } - } - - // public async getMessagesByAddress( - // address: AddressLike, - // opts?: { - // direction?: MessageDirection - // fromBlock?: NumberLike - // toBlock?: NumberLike - // } - // ): Promise<CrossChainMessage[]> { - // throw new Error(` - // The function getMessagesByAddress is currently not enabled because the sender parameter of - // the SentMessage event is not indexed within the CrossChainMessenger contracts. - // getMessagesByAddress will be enabled by plugging in an Optimism Indexer (coming soon). - // See the following issue on GitHub for additional context: - // https://github.com/ethereum-optimism/optimism/issues/2129 - // `) - // } - - /** - * Finds the appropriate bridge adapter for a given L1<>L2 token pair. Will throw if no bridges - * support the token pair or if more than one bridge supports the token pair. - * - * @param l1Token L1 token address. - * @param l2Token L2 token address. - * @returns The appropriate bridge adapter for the given token pair. - */ - public async getBridgeForTokenPair( - l1Token: AddressLike, - l2Token: AddressLike - ): Promise<IBridgeAdapter> { - const bridges: IBridgeAdapter[] = [] - for (const bridge of Object.values(this.bridges)) { - try { - if (await bridge.supportsTokenPair(l1Token, l2Token)) { - bridges.push(bridge) - } - } catch (err) { - if ( - !err?.message?.toString().includes('CALL_EXCEPTION') && - !err?.stack?.toString().includes('execution reverted') - ) { - console.error('Unexpected error when checking bridge', err) - } - } - } - - if (bridges.length === 0) { - throw new Error(`no supported bridge for token pair`) - } - - if (bridges.length > 1) { - throw new Error(`found more than one bridge for token pair`) - } - - return bridges[0] - } - - /** - * Gets all deposits for a given address. - * - * @param address Address to search for messages from. - * @param opts Options object. - * @param opts.fromBlock Block to start searching for messages from. If not provided, will start - * from the first block (block #0). - * @param opts.toBlock Block to stop searching for messages at. If not provided, will stop at the - * latest known block ("latest"). - * @returns All deposit token bridge messages sent by the given address. - */ - public async getDepositsByAddress( - address: AddressLike, - opts: { - fromBlock?: BlockTag - toBlock?: BlockTag - } = {} - ): Promise<TokenBridgeMessage[]> { - return ( - await Promise.all( - Object.values(this.bridges).map(async (bridge) => { - return bridge.getDepositsByAddress(address, opts) - }) - ) - ) - .reduce((acc, val) => { - return acc.concat(val) - }, []) - .sort((a, b) => { - // Sort descending by block number - return b.blockNumber - a.blockNumber - }) - } - - /** - * Gets all withdrawals for a given address. - * - * @param address Address to search for messages from. - * @param opts Options object. - * @param opts.fromBlock Block to start searching for messages from. If not provided, will start - * from the first block (block #0). - * @param opts.toBlock Block to stop searching for messages at. If not provided, will stop at the - * latest known block ("latest"). - * @returns All withdrawal token bridge messages sent by the given address. - */ - public async getWithdrawalsByAddress( - address: AddressLike, - opts: { - fromBlock?: BlockTag - toBlock?: BlockTag - } = {} - ): Promise<TokenBridgeMessage[]> { - return ( - await Promise.all( - Object.values(this.bridges).map(async (bridge) => { - return bridge.getWithdrawalsByAddress(address, opts) - }) - ) - ) - .reduce((acc, val) => { - return acc.concat(val) - }, []) - .sort((a, b) => { - // Sort descending by block number - return b.blockNumber - a.blockNumber - }) - } - - /** - * Resolves a MessageLike into a CrossChainMessage object. - * Unlike other coercion functions, this function is stateful and requires making additional - * requests. For now I'm going to keep this function here, but we could consider putting a - * similar function inside of utils/coercion.ts if people want to use this without having to - * create an entire CrossChainProvider object. - * - * @param message MessageLike to resolve into a CrossChainMessage. - * @param messageIndex The index of the message, if multiple exist from multicall - * @returns Message coerced into a CrossChainMessage. - */ - public async toCrossChainMessage( - message: MessageLike, - messageIndex = 0 - ): Promise<CrossChainMessage> { - if (!message) { - throw new Error('message is undefined') - } - // TODO: Convert these checks into proper type checks. - if ((message as CrossChainMessage).message) { - return message as CrossChainMessage - } else if ( - (message as TokenBridgeMessage).l1Token && - (message as TokenBridgeMessage).l2Token && - (message as TokenBridgeMessage).transactionHash - ) { - const messages = await this.getMessagesByTransaction( - (message as TokenBridgeMessage).transactionHash - ) - - // The `messages` object corresponds to a list of SentMessage events that were triggered by - // the same transaction. We want to find the specific SentMessage event that corresponds to - // the TokenBridgeMessage (either a ETHDepositInitiated, ERC20DepositInitiated, or - // WithdrawalInitiated event). We expect the behavior of bridge contracts to be that these - // TokenBridgeMessage events are triggered and then a SentMessage event is triggered. Our - // goal here is therefore to find the first SentMessage event that comes after the input - // event. - const found = messages - .sort((a, b) => { - // Sort all messages in ascending order by log index. - return a.logIndex - b.logIndex - }) - .find((m) => { - return m.logIndex > (message as TokenBridgeMessage).logIndex - }) - - if (!found) { - throw new Error(`could not find SentMessage event for message`) - } - - return found - } else { - // TODO: Explicit TransactionLike check and throw if not TransactionLike - const messages = await this.getMessagesByTransaction( - message as TransactionLike - ) - - const out = messages[messageIndex] - if (!out) { - throw new Error( - `withdrawal index ${messageIndex} out of bounds. There are ${messages.length} withdrawals` - ) - } - return out - } - } - - /** - * Retrieves the status of a particular message as an enum. - * - * @param message Cross chain message to check the status of. - * @param messageIndex The index of the message, if multiple exist from multicall - * @param fromBlockOrBlockHash The start block to use for the query filter on the RECEIVING chain - * @param toBlockOrBlockHash The end block to use for the query filter on the RECEIVING chain - * @returns Status of the message. - */ - public async getMessageStatus( - 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<MessageStatus> { - const resolved = await this.toCrossChainMessage(message, messageIndex) - // legacy withdrawals relayed prebedrock are v1 - const messageHashV0 = hashCrossDomainMessagev0( - resolved.target, - resolved.sender, - resolved.message, - resolved.messageNonce - ) - // bedrock withdrawals are v1 - // legacy withdrawals relayed postbedrock are v1 - // there is no good way to differentiate between the two types of legacy - // so what we will check for both - const messageHashV1 = hashCrossDomainMessagev1( - resolved.messageNonce, - resolved.sender, - resolved.target, - resolved.value, - resolved.minGasLimit, - resolved.message - ) - - // Here we want the messenger that will receive the message, not the one that sent it. - const messenger = - resolved.direction === MessageDirection.L1_TO_L2 - ? this.contracts.l2.L2CrossDomainMessenger - : this.contracts.l1.L1CrossDomainMessenger - - const success = - (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 (failure) { - return MessageStatus.FAILED_L1_TO_L2_MESSAGE - } else { - return MessageStatus.UNCONFIRMED_L1_TO_L2_MESSAGE - } - } else { - if (failure) { - return MessageStatus.READY_FOR_RELAY - } else { - let timestamp: number - if (this.bedrock) { - const output = await this.getMessageBedrockOutput( - resolved, - messageIndex - ) - if (output === null) { - return MessageStatus.STATE_ROOT_NOT_PUBLISHED - } - - // Convert the message to the low level message that was proven. - const withdrawal = await this.toLowLevelMessage( - resolved, - messageIndex - ) - - // Attempt to fetch the proven withdrawal. - const provenWithdrawal = await this.getProvenWithdrawal( - hashLowLevelMessage(withdrawal) - ) - - // 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 - } - - // Set the timestamp to the provenWithdrawal's timestamp - timestamp = provenWithdrawal.timestamp.toNumber() - } else { - const stateRoot = await this.getMessageStateRoot( - resolved, - messageIndex - ) - if (stateRoot === null) { - return MessageStatus.STATE_ROOT_NOT_PUBLISHED - } - - const bn = stateRoot.batch.blockNumber - const block = await this.l1Provider.getBlock(bn) - timestamp = block.timestamp - } - - if (await this.fpac()) { - // Convert the message to the low level message that was proven. - const withdrawal = await this.toLowLevelMessage( - resolved, - 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), - provenWithdrawal.proofSubmitter - ) - - return MessageStatus.READY_FOR_RELAY - } catch (err) { - return MessageStatus.IN_CHALLENGE_PERIOD - } - } else { - const challengePeriod = await this.getChallengePeriodSeconds() - const latestBlock = await this.l1Provider.getBlock('latest') - - if (timestamp + challengePeriod > latestBlock.timestamp) { - return MessageStatus.IN_CHALLENGE_PERIOD - } else { - return MessageStatus.READY_FOR_RELAY - } - } - } - } - } - - /** - * Finds the receipt of the transaction that executed a particular cross chain message. - * - * @param message Message to find the receipt of. - * @param messageIndex The index of the message, if multiple exist from multicall - * @param fromBlockOrBlockHash The start block to use for the query filter on the RECEIVING chain - * @param toBlockOrBlockHash The end block to use for the query filter on the RECEIVING chain - * @returns CrossChainMessage receipt including receipt of the transaction that relayed the - * given message. - */ - public async getMessageReceipt( - message: MessageLike, - messageIndex = 0, - fromBlockOrBlockHash?: BlockTag, - toBlockOrHash?: BlockTag - ): Promise<MessageReceipt> { - const resolved = await this.toCrossChainMessage(message, messageIndex) - // legacy withdrawals relayed prebedrock are v1 - const messageHashV0 = hashCrossDomainMessagev0( - resolved.target, - resolved.sender, - resolved.message, - resolved.messageNonce - ) - // bedrock withdrawals are v1 - // legacy withdrawals relayed postbedrock are v1 - // there is no good way to differentiate between the two types of legacy - // so what we will check for both - const messageHashV1 = hashCrossDomainMessagev1( - resolved.messageNonce, - resolved.sender, - resolved.target, - resolved.value, - resolved.minGasLimit, - resolved.message - ) - - // Here we want the messenger that will receive the message, not the one that sent it. - const messenger = - resolved.direction === MessageDirection.L1_TO_L2 - ? this.contracts.l2.L2CrossDomainMessenger - : this.contracts.l1.L1CrossDomainMessenger - - // this is safe because we can guarantee only one of these filters max will return something - const relayedMessageEvents = [ - ...(await messenger.queryFilter( - messenger.filters.RelayedMessage(messageHashV0), - fromBlockOrBlockHash, - toBlockOrHash - )), - ...(await messenger.queryFilter( - messenger.filters.RelayedMessage(messageHashV1), - fromBlockOrBlockHash, - toBlockOrHash - )), - ] - - // Great, we found the message. Convert it into a transaction receipt. - if (relayedMessageEvents.length === 1) { - return { - receiptStatus: MessageReceiptStatus.RELAYED_SUCCEEDED, - transactionReceipt: - await relayedMessageEvents[0].getTransactionReceipt(), - } - } else if (relayedMessageEvents.length > 1) { - // Should never happen! - throw new Error(`multiple successful relays for message`) - } - - // We didn't find a transaction that relayed the message. We now attempt to find - // FailedRelayedMessage events instead. - const failedRelayedMessageEvents = [ - ...(await messenger.queryFilter( - messenger.filters.FailedRelayedMessage(messageHashV0), - fromBlockOrBlockHash, - toBlockOrHash - )), - ...(await messenger.queryFilter( - messenger.filters.FailedRelayedMessage(messageHashV1), - fromBlockOrBlockHash, - toBlockOrHash - )), - ] - - // A transaction can fail to be relayed multiple times. We'll always return the last - // transaction that attempted to relay the message. - // TODO: Is this the best way to handle this? - if (failedRelayedMessageEvents.length > 0) { - return { - receiptStatus: MessageReceiptStatus.RELAYED_FAILED, - transactionReceipt: await failedRelayedMessageEvents[ - failedRelayedMessageEvents.length - 1 - ].getTransactionReceipt(), - } - } - - // TODO: If the user doesn't provide enough gas then there's a chance that FailedRelayedMessage - // will never be triggered. We should probably fix this at the contract level by requiring a - // minimum amount of input gas and designing the contracts such that the gas will always be - // enough to trigger the event. However, for now we need a temporary way to find L1 => L2 - // transactions that fail but don't alert us because they didn't provide enough gas. - // TODO: Talk with the systems and protocol team about coordinating a hard fork that fixes this - // on both L1 and L2. - - // Just return null if we didn't find a receipt. Slightly nicer than throwing an error. - return null - } - - /** - * Waits for a message to be executed and returns the receipt of the transaction that executed - * the given message. - * - * @param message Message to wait for. - * @param opts Options to pass to the waiting function. - * @param opts.confirmations Number of transaction confirmations to wait for before returning. - * @param opts.pollIntervalMs Number of milliseconds to wait between polling for the receipt. - * @param opts.timeoutMs Milliseconds to wait before timing out. - * @param opts.fromBlockOrBlockHash The start block to use for the query filter on the RECEIVING chain - * @param opts.toBlockOrBlockHash The end block to use for the query filter on the RECEIVING chain - * @param messageIndex The index of the message, if multiple exist from multicall - * @returns CrossChainMessage receipt including receipt of the transaction that relayed the - * given message. - */ - public async waitForMessageReceipt( - message: MessageLike, - opts: { - fromBlockOrBlockHash?: BlockTag - toBlockOrHash?: BlockTag - confirmations?: number - pollIntervalMs?: number - timeoutMs?: number - } = {}, - - /** - * The index of the withdrawal if multiple are made with multicall - */ - messageIndex = 0 - ): Promise<MessageReceipt> { - // Resolving once up-front is slightly more efficient. - const resolved = await this.toCrossChainMessage(message, messageIndex) - - let totalTimeMs = 0 - while (totalTimeMs < (opts.timeoutMs || Infinity)) { - const tick = Date.now() - const receipt = await this.getMessageReceipt( - resolved, - messageIndex, - opts.fromBlockOrBlockHash, - opts.toBlockOrHash - ) - if (receipt !== null) { - return receipt - } else { - await sleep(opts.pollIntervalMs || 4000) - totalTimeMs += Date.now() - tick - } - } - - throw new Error(`timed out waiting for message receipt`) - } - - /** - * Waits until the status of a given message changes to the expected status. Note that if the - * status of the given message changes to a status that implies the expected status, this will - * still return. If the status of the message changes to a status that exclues the expected - * status, this will throw an error. - * - * @param message Message to wait for. - * @param status Expected status of the message. - * @param opts Options to pass to the waiting function. - * @param opts.pollIntervalMs Number of milliseconds to wait when polling. - * @param opts.timeoutMs Milliseconds to wait before timing out. - * @param opts.fromBlockOrBlockHash The start block to use for the query filter on the RECEIVING chain - * @param opts.toBlockOrBlockHash The end block to use for the query filter on the RECEIVING chain - * @param messageIndex The index of the message, if multiple exist from multicall - */ - public async waitForMessageStatus( - message: MessageLike, - status: MessageStatus, - opts: { - fromBlockOrBlockHash?: BlockTag - toBlockOrBlockHash?: BlockTag - pollIntervalMs?: number - timeoutMs?: number - } = {}, - messageIndex = 0 - ): Promise<void> { - // Resolving once up-front is slightly more efficient. - const resolved = await this.toCrossChainMessage(message, messageIndex) - - let totalTimeMs = 0 - while (totalTimeMs < (opts.timeoutMs || Infinity)) { - const tick = Date.now() - const currentStatus = await this.getMessageStatus( - resolved, - messageIndex, - opts.fromBlockOrBlockHash, - opts.toBlockOrBlockHash - ) - - // Handle special cases for L1 to L2 messages. - if (resolved.direction === MessageDirection.L1_TO_L2) { - // If we're at the expected status, we're done. - if (currentStatus === status) { - return - } - - if ( - status === MessageStatus.UNCONFIRMED_L1_TO_L2_MESSAGE && - currentStatus > status - ) { - // Anything other than UNCONFIRMED_L1_TO_L2_MESSAGE implies that the message was at one - // point "unconfirmed", so we can stop waiting. - return - } - - if ( - status === MessageStatus.FAILED_L1_TO_L2_MESSAGE && - currentStatus === MessageStatus.RELAYED - ) { - throw new Error( - `incompatible message status, expected FAILED_L1_TO_L2_MESSAGE got RELAYED` - ) - } - - if ( - status === MessageStatus.RELAYED && - currentStatus === MessageStatus.FAILED_L1_TO_L2_MESSAGE - ) { - throw new Error( - `incompatible message status, expected RELAYED got FAILED_L1_TO_L2_MESSAGE` - ) - } - } - - // Handle special cases for L2 to L1 messages. - if (resolved.direction === MessageDirection.L2_TO_L1) { - if (currentStatus >= status) { - // For L2 to L1 messages, anything after the expected status implies the previous status, - // so we can safely return if the current status enum is larger than the expected one. - return - } - } - - await sleep(opts.pollIntervalMs || 4000) - totalTimeMs += Date.now() - tick - } - - throw new Error(`timed out waiting for message status change`) - } - - /** - * Estimates the amount of gas required to fully execute a given message on L2. Only applies to - * L1 => L2 messages. You would supply this gas limit when sending the message to L2. - * - * @param message Message get a gas estimate for. - * @param opts Options object. - * @param opts.bufferPercent Percentage of gas to add to the estimate. Defaults to 20. - * @param opts.from Address to use as the sender. - * @returns Estimates L2 gas limit. - */ - public async estimateL2MessageGasLimit( - message: MessageRequestLike, - opts?: { - bufferPercent?: number - from?: string - }, - messageIndex = 0 - ): Promise<BigNumber> { - let resolved: CrossChainMessage | CrossChainMessageRequest - let from: string - if ((message as CrossChainMessage).messageNonce === undefined) { - resolved = message as CrossChainMessageRequest - from = opts?.from - } else { - resolved = await this.toCrossChainMessage( - message as MessageLike, - messageIndex - ) - from = opts?.from || (resolved as CrossChainMessage).sender - } - - // L2 message gas estimation is only used for L1 => L2 messages. - if (resolved.direction === MessageDirection.L2_TO_L1) { - throw new Error(`cannot estimate gas limit for L2 => L1 message`) - } - - const estimate = await this.l2Provider.estimateGas({ - from, - to: resolved.target, - data: resolved.message, - }) - - // Return the estimate plus a buffer of 20% just in case. - const bufferPercent = opts?.bufferPercent || 20 - return estimate.mul(100 + bufferPercent).div(100) - } - - /** - * Returns the estimated amount of time before the message can be executed. When this is a - * message being sent to L1, this will return the estimated time until the message will complete - * its challenge period. When this is a message being sent to L2, this will return the estimated - * amount of time until the message will be picked up and executed on L2. - * - * @param message Message to estimate the time remaining for. - * @param messageIndex The index of the message, if multiple exist from multicall - * @param opts.fromBlockOrBlockHash The start block to use for the query filter on the RECEIVING chain - * @param opts.toBlockOrBlockHash The end block to use for the query filter on the RECEIVING chain - * @returns Estimated amount of time remaining (in seconds) before the message can be executed. - */ - public async estimateMessageWaitTimeSeconds( - message: MessageLike, - // consider making this an options object next breaking release - messageIndex = 0, - fromBlockOrBlockHash?: BlockTag, - toBlockOrBlockHash?: BlockTag - ): Promise<number> { - const resolved = await this.toCrossChainMessage(message, messageIndex) - const status = await this.getMessageStatus( - resolved, - messageIndex, - fromBlockOrBlockHash, - toBlockOrBlockHash - ) - if (resolved.direction === MessageDirection.L1_TO_L2) { - if ( - status === MessageStatus.RELAYED || - status === MessageStatus.FAILED_L1_TO_L2_MESSAGE - ) { - // Transactions that are relayed or failed are considered completed, so the wait time is 0. - return 0 - } else { - // Otherwise we need to estimate the number of blocks left until the transaction will be - // considered confirmed by the Layer 2 system. Then we multiply this by the estimated - // average L1 block time. - const receipt = await this.l1Provider.getTransactionReceipt( - resolved.transactionHash - ) - const blocksLeft = Math.max( - this.depositConfirmationBlocks - receipt.confirmations, - 0 - ) - return blocksLeft * this.l1BlockTimeSeconds - } - } else { - if ( - status === MessageStatus.RELAYED || - status === MessageStatus.READY_FOR_RELAY - ) { - // Transactions that are relayed or ready for relay are considered complete. - return 0 - } else if (status === MessageStatus.STATE_ROOT_NOT_PUBLISHED) { - // If the state root hasn't been published yet, just assume it'll be published relatively - // quickly and return the challenge period for now. In the future we could use more - // advanced techniques to figure out average time between transaction execution and - // state root publication. - return this.getChallengePeriodSeconds() - } else if (status === MessageStatus.IN_CHALLENGE_PERIOD) { - // If the message is still within the challenge period, then we need to estimate exactly - // the amount of time left until the challenge period expires. The challenge period starts - // when the state root is published. - const stateRoot = await this.getMessageStateRoot(resolved, messageIndex) - const challengePeriod = await this.getChallengePeriodSeconds() - const targetBlock = await this.l1Provider.getBlock( - stateRoot.batch.blockNumber - ) - const latestBlock = await this.l1Provider.getBlock('latest') - return Math.max( - challengePeriod - (latestBlock.timestamp - targetBlock.timestamp), - 0 - ) - } else { - // Should not happen - throw new Error(`unexpected message status`) - } - } - } - - /** - * Queries the current challenge period in seconds from the StateCommitmentChain. - * - * @returns Current challenge period in seconds. - */ - public async getChallengePeriodSeconds(): Promise<number> { - if (!this.bedrock) { - return ( - await this.contracts.l1.StateCommitmentChain.FRAUD_PROOF_WINDOW() - ).toNumber() - } - - const oracleVersion = await this.contracts.l1.L2OutputOracle.version() - const challengePeriod = - oracleVersion === '1.0.0' - ? // The ABI in the SDK does not contain FINALIZATION_PERIOD_SECONDS - // in OptimismPortal, so making an explicit call instead. - BigNumber.from( - await this.contracts.l1.OptimismPortal.provider.call({ - to: this.contracts.l1.OptimismPortal.address, - data: '0xf4daa291', // FINALIZATION_PERIOD_SECONDS - }) - ) - : await this.contracts.l1.L2OutputOracle.FINALIZATION_PERIOD_SECONDS() - return challengePeriod.toNumber() - } - - /** - * Queries the OptimismPortal contract's `provenWithdrawals` mapping - * for a ProvenWithdrawal that matches the passed withdrawalHash - * - * @bedrock - * Note: This function is bedrock-specific. - * - * @returns A ProvenWithdrawal object - */ - public async getProvenWithdrawal( - withdrawalHash: string - ): Promise<ProvenWithdrawal | null> { - if (!this.bedrock) { - throw new Error('message proving only applies after the bedrock upgrade') - } - - // 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<boolean> { - // 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 - } - } - - /** - * Returns the Bedrock output root that corresponds to the given message. - * - * @param message Message to get the Bedrock output root for. - * @param messageIndex The index of the message, if multiple exist from multicall - * @returns Bedrock output root. - */ - public async getMessageBedrockOutput( - message: MessageLike, - messageIndex = 0 - ): Promise<BedrockOutputData | null> { - const resolved = await this.toCrossChainMessage(message, messageIndex) - - // Outputs are only a thing for L2 to L1 messages. - if (resolved.direction === MessageDirection.L1_TO_L2) { - throw new Error(`cannot get a state root for an L1 to L2 message`) - } - - let proposal: any - let l2OutputIndex: BigNumber - if (await this.fpac()) { - // Get the respected game type from the portal. - const gameType = - await this.contracts.l1.OptimismPortal2.respectedGameType() - - // Get the total game count from the DisputeGameFactory since that will give us the end of - // the array that we're searching over. We'll then use that to find the latest games. - const gameCount = await this.contracts.l1.DisputeGameFactory.gameCount() - - // Find the latest 100 games (or as many as we can up to 100). - const latestGames = - await this.contracts.l1.DisputeGameFactory.findLatestGames( - gameType, - Math.max(0, gameCount.sub(1).toNumber()), - Math.min(100, gameCount.toNumber()) - ) - - // Find all games that are for proposals about blocks newer than the message block. - const matches: any[] = [] - for (const game of latestGames) { - try { - const [blockNumber] = ethers.utils.defaultAbiCoder.decode( - ['uint256'], - game.extraData - ) - if (blockNumber.gte(resolved.blockNumber)) { - matches.push({ - ...game, - l2BlockNumber: blockNumber, - }) - } - } catch (err) { - // If we can't decode the extra data then we just skip this game. - continue - } - } - - // 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) { - return null - } - - // Put the result into the same format as the old logic for now to reduce added code. - l2OutputIndex = match.index - proposal = { - outputRoot: match.rootClaim, - timestamp: match.timestamp, - l2BlockNumber: match.l2BlockNumber, - } - } else { - // Try to find the output index that corresponds to the block number attached to the message. - // We'll explicitly handle "cannot get output" errors as a null return value, but anything else - // needs to get thrown. Might need to revisit this in the future to be a little more robust - // when connected to RPCs that don't return nice error messages. - try { - l2OutputIndex = - await this.contracts.l1.L2OutputOracle.getL2OutputIndexAfter( - resolved.blockNumber - ) - } catch (err) { - if (err.message.includes('L2OutputOracle: cannot get output')) { - return null - } else { - throw err - } - } - - // Now pull the proposal out given the output index. Should always work as long as the above - // codepath completed successfully. - proposal = await this.contracts.l1.L2OutputOracle.getL2Output( - l2OutputIndex - ) - } - - // Format everything and return it nicely. - return { - outputRoot: proposal.outputRoot, - l1Timestamp: proposal.timestamp.toNumber(), - l2BlockNumber: proposal.l2BlockNumber.toNumber(), - l2OutputIndex: l2OutputIndex.toNumber(), - } - } - - /** - * Returns the state root that corresponds to a given message. This is the state root for the - * block in which the transaction was included, as published to the StateCommitmentChain. If the - * state root for the given message has not been published yet, this function returns null. - * - * @param message Message to find a state root for. - * @param messageIndex The index of the message, if multiple exist from multicall - * @returns State root for the block in which the message was created. - */ - public async getMessageStateRoot( - message: MessageLike, - messageIndex = 0 - ): Promise<StateRoot | null> { - const resolved = await this.toCrossChainMessage(message, messageIndex) - - // State roots are only a thing for L2 to L1 messages. - if (resolved.direction === MessageDirection.L1_TO_L2) { - throw new Error(`cannot get a state root for an L1 to L2 message`) - } - - // We need the block number of the transaction that triggered the message so we can look up the - // state root batch that corresponds to that block number. - const messageTxReceipt = await this.l2Provider.getTransactionReceipt( - resolved.transactionHash - ) - - // Every block has exactly one transaction in it. Since there's a genesis block, the - // transaction index will always be one less than the block number. - const messageTxIndex = messageTxReceipt.blockNumber - 1 - - // Pull down the state root batch, we'll try to pick out the specific state root that - // corresponds to our message. - const stateRootBatch = await this.getStateRootBatchByTransactionIndex( - messageTxIndex - ) - - // No state root batch, no state root. - if (stateRootBatch === null) { - return null - } - - // We have a state root batch, now we need to find the specific state root for our transaction. - // First we need to figure out the index of the state root within the batch we found. This is - // going to be the original transaction index offset by the total number of previous state - // roots. - const indexInBatch = - messageTxIndex - stateRootBatch.header.prevTotalElements.toNumber() - - // Just a sanity check. - if (stateRootBatch.stateRoots.length <= indexInBatch) { - // Should never happen! - throw new Error(`state root does not exist in batch`) - } - - return { - stateRoot: stateRootBatch.stateRoots[indexInBatch], - stateRootIndexInBatch: indexInBatch, - batch: stateRootBatch, - } - } - - /** - * Returns the StateBatchAppended event that was emitted when the batch with a given index was - * created. Returns null if no such event exists (the batch has not been submitted). - * - * @param batchIndex Index of the batch to find an event for. - * @returns StateBatchAppended event for the batch, or null if no such batch exists. - */ - public async getStateBatchAppendedEventByBatchIndex( - batchIndex: number - ): Promise<ethers.Event | null> { - const events = await this.contracts.l1.StateCommitmentChain.queryFilter( - this.contracts.l1.StateCommitmentChain.filters.StateBatchAppended( - batchIndex - ) - ) - - if (events.length === 0) { - return null - } else if (events.length > 1) { - // Should never happen! - throw new Error(`found more than one StateBatchAppended event`) - } else { - return events[0] - } - } - - /** - * Returns the StateBatchAppended event for the batch that includes the transaction with the - * given index. Returns null if no such event exists. - * - * @param transactionIndex Index of the L2 transaction to find an event for. - * @returns StateBatchAppended event for the batch that includes the given transaction by index. - */ - public async getStateBatchAppendedEventByTransactionIndex( - transactionIndex: number - ): Promise<ethers.Event | null> { - const isEventHi = (event: ethers.Event, index: number) => { - const prevTotalElements = event.args._prevTotalElements.toNumber() - return index < prevTotalElements - } - - const isEventLo = (event: ethers.Event, index: number) => { - const prevTotalElements = event.args._prevTotalElements.toNumber() - const batchSize = event.args._batchSize.toNumber() - return index >= prevTotalElements + batchSize - } - - const totalBatches: ethers.BigNumber = - await this.contracts.l1.StateCommitmentChain.getTotalBatches() - if (totalBatches.eq(0)) { - return null - } - - let lowerBound = 0 - let upperBound = totalBatches.toNumber() - 1 - let batchEvent: ethers.Event | null = - await this.getStateBatchAppendedEventByBatchIndex(upperBound) - - // Only happens when no batches have been submitted yet. - if (batchEvent === null) { - return null - } - - if (isEventLo(batchEvent, transactionIndex)) { - // Upper bound is too low, means this transaction doesn't have a corresponding state batch yet. - return null - } else if (!isEventHi(batchEvent, transactionIndex)) { - // Upper bound is not too low and also not too high. This means the upper bound event is the - // one we're looking for! Return it. - return batchEvent - } - - // Binary search to find the right event. The above checks will guarantee that the event does - // exist and that we'll find it during this search. - while (lowerBound < upperBound) { - const middleOfBounds = Math.floor((lowerBound + upperBound) / 2) - batchEvent = await this.getStateBatchAppendedEventByBatchIndex( - middleOfBounds - ) - - if (isEventHi(batchEvent, transactionIndex)) { - upperBound = middleOfBounds - } else if (isEventLo(batchEvent, transactionIndex)) { - lowerBound = middleOfBounds - } else { - break - } - } - - return batchEvent - } - - /** - * Returns information about the state root batch that included the state root for the given - * transaction by index. Returns null if no such state root has been published yet. - * - * @param transactionIndex Index of the L2 transaction to find a state root batch for. - * @returns State root batch for the given transaction index, or null if none exists yet. - */ - public async getStateRootBatchByTransactionIndex( - transactionIndex: number - ): Promise<StateRootBatch | null> { - const stateBatchAppendedEvent = - await this.getStateBatchAppendedEventByTransactionIndex(transactionIndex) - if (stateBatchAppendedEvent === null) { - return null - } - - const stateBatchTransaction = await stateBatchAppendedEvent.getTransaction() - const [stateRoots] = - this.contracts.l1.StateCommitmentChain.interface.decodeFunctionData( - 'appendStateBatch', - stateBatchTransaction.data - ) - - return { - blockNumber: stateBatchAppendedEvent.blockNumber, - stateRoots, - header: { - batchIndex: stateBatchAppendedEvent.args._batchIndex, - batchRoot: stateBatchAppendedEvent.args._batchRoot, - batchSize: stateBatchAppendedEvent.args._batchSize, - prevTotalElements: stateBatchAppendedEvent.args._prevTotalElements, - extraData: stateBatchAppendedEvent.args._extraData, - }, - } - } - - /** - * Generates the proof required to finalize an L2 to L1 message. - * - * @param message Message to generate a proof for. - * @param messageIndex The index of the message, if multiple exist from multicall - * @returns Proof that can be used to finalize the message. - */ - public async getMessageProof( - message: MessageLike, - messageIndex = 0 - ): Promise<CrossChainMessageProof> { - const resolved = await this.toCrossChainMessage(message, messageIndex) - if (resolved.direction === MessageDirection.L1_TO_L2) { - throw new Error(`can only generate proofs for L2 to L1 messages`) - } - - const stateRoot = await this.getMessageStateRoot(resolved, messageIndex) - if (stateRoot === null) { - throw new Error(`state root for message not yet published`) - } - - // We need to calculate the specific storage slot that demonstrates that this message was - // actually included in the L2 chain. The following calculation is based on the fact that - // messages are stored in the following mapping on L2: - // https://github.com/ethereum-optimism/optimism/blob/c84d3450225306abbb39b4e7d6d82424341df2be/packages/contracts/contracts/L2/predeploys/OVM_L2ToL1MessagePasser.sol#L23 - // You can read more about how Solidity storage slots are computed for mappings here: - // https://docs.soliditylang.org/en/v0.8.4/internals/layout_in_storage.html#mappings-and-dynamic-arrays - const messageSlot = ethers.utils.keccak256( - ethers.utils.keccak256( - encodeCrossDomainMessageV0( - resolved.target, - resolved.sender, - resolved.message, - resolved.messageNonce - ) + remove0x(this.contracts.l2.L2CrossDomainMessenger.address) - ) + '00'.repeat(32) - ) - - const stateTrieProof = await makeStateTrieProof( - toJsonRpcProvider(this.l2Provider), - resolved.blockNumber, - this.contracts.l2.OVM_L2ToL1MessagePasser.address, - messageSlot - ) - - return { - stateRoot: stateRoot.stateRoot, - stateRootBatchHeader: stateRoot.batch.header, - stateRootProof: { - index: stateRoot.stateRootIndexInBatch, - siblings: makeMerkleTreeProof( - stateRoot.batch.stateRoots, - stateRoot.stateRootIndexInBatch - ), - }, - stateTrieWitness: toHexString(rlp.encode(stateTrieProof.accountProof)), - storageTrieWitness: toHexString(rlp.encode(stateTrieProof.storageProof)), - } - } - - /** - * Generates the bedrock proof required to finalize an L2 to L1 message. - * - * @param message Message to generate a proof for. - * @param messageIndex The index of the message, if multiple exist from multicall - * @returns Proof that can be used to finalize the message. - */ - public async getBedrockMessageProof( - message: MessageLike, - messageIndex = 0 - ): Promise<BedrockCrossChainMessageProof> { - const resolved = await this.toCrossChainMessage(message, messageIndex) - if (resolved.direction === MessageDirection.L1_TO_L2) { - throw new Error(`can only generate proofs for L2 to L1 messages`) - } - - const output = await this.getMessageBedrockOutput(resolved, messageIndex) - if (output === null) { - throw new Error(`state root for message not yet published`) - } - - const withdrawal = await this.toLowLevelMessage(resolved, messageIndex) - const hash = hashLowLevelMessage(withdrawal) - const messageSlot = hashMessageHash(hash) - - const provider = toJsonRpcProvider(this.l2Provider) - - const stateTrieProof = await makeStateTrieProof( - provider, - output.l2BlockNumber, - this.contracts.l2.BedrockMessagePasser.address, - messageSlot - ) - - const block = await provider.send('eth_getBlockByNumber', [ - toRpcHexString(output.l2BlockNumber), - false, - ]) - - return { - outputRootProof: { - version: ethers.constants.HashZero, - stateRoot: block.stateRoot, - messagePasserStorageRoot: stateTrieProof.storageRoot, - latestBlockhash: block.hash, - }, - withdrawalProof: stateTrieProof.storageProof, - l2OutputIndex: output.l2OutputIndex, - } - } - - /** - * Sends a given cross chain message. Where the message is sent depends on the direction attached - * to the message itself. - * - * @param message Cross chain message to send. - * @param opts Additional options. - * @param opts.signer Optional signer to use to send the transaction. - * @param opts.l2GasLimit Optional gas limit to use for the transaction on L2. - * @param opts.overrides Optional transaction overrides. - * @returns Transaction response for the message sending transaction. - */ - public async sendMessage( - message: CrossChainMessageRequest, - opts?: { - signer?: Signer - l2GasLimit?: NumberLike - overrides?: Overrides - } - ): Promise<TransactionResponse> { - const tx = await this.populateTransaction.sendMessage(message, opts) - if (message.direction === MessageDirection.L1_TO_L2) { - return (opts?.signer || this.l1Signer).sendTransaction(tx) - } else { - return (opts?.signer || this.l2Signer).sendTransaction(tx) - } - } - - /** - * Resends a given cross chain message with a different gas limit. Only applies to L1 to L2 - * messages. If provided an L2 to L1 message, this function will throw an error. - * - * @param message Cross chain message to resend. - * @param messageGasLimit New gas limit to use for the message. - * @param opts Additional options. - * @param opts.signer Optional signer to use to send the transaction. - * @param opts.overrides Optional transaction overrides. - * @returns Transaction response for the message resending transaction. - */ - public async resendMessage( - message: MessageLike, - messageGasLimit: NumberLike, - opts?: { - signer?: Signer - overrides?: Overrides - } - ): Promise<TransactionResponse> { - return (opts?.signer || this.l1Signer).sendTransaction( - await this.populateTransaction.resendMessage( - message, - messageGasLimit, - opts - ) - ) - } - - /** - * Proves a cross chain message that was sent from L2 to L1. Only applicable for L2 to L1 - * messages. - * - * @param message Message to finalize. - * @param opts Additional options. - * @param opts.signer Optional signer to use to send the transaction. - * @param opts.overrides Optional transaction overrides. - * @returns Transaction response for the finalization transaction. - */ - public async proveMessage( - message: MessageLike, - opts?: { - signer?: Signer - overrides?: Overrides - }, - /** - * The index of the withdrawal if multiple are made with multicall - */ - messageIndex: number = 0 - ): Promise<TransactionResponse> { - const tx = await this.populateTransaction.proveMessage( - message, - opts, - messageIndex - ) - return (opts?.signer || this.l1Signer).sendTransaction(tx) - } - - /** - * Finalizes a cross chain message that was sent from L2 to L1. Only applicable for L2 to L1 - * messages. Will throw an error if the message has not completed its challenge period yet. - * - * @param message Message to finalize. - * @param opts Additional options. - * @param opts.signer Optional signer to use to send the transaction. - * @param opts.overrides Optional transaction overrides. - * @param messageIndex The index of the message, if multiple exist from multicall - * @returns Transaction response for the finalization transaction. - */ - public async finalizeMessage( - message: MessageLike, - opts?: { - signer?: Signer - overrides?: PayableOverrides - }, - messageIndex = 0 - ): Promise<TransactionResponse> { - return (opts?.signer || this.l1Signer).sendTransaction( - await this.populateTransaction.finalizeMessage( - message, - opts, - messageIndex - ) - ) - } - - /** - * Deposits some ETH into the L2 chain. - * - * @param amount Amount of ETH to deposit (in wei). - * @param opts Additional options. - * @param opts.signer Optional signer to use to send the transaction. - * @param opts.recipient Optional address to receive the funds on L2. Defaults to sender. - * @param opts.l2GasLimit Optional gas limit to use for the transaction on L2. - * @param opts.overrides Optional transaction overrides. - * @returns Transaction response for the deposit transaction. - */ - public async depositETH( - amount: NumberLike, - opts?: { - recipient?: AddressLike - signer?: Signer - l2GasLimit?: NumberLike - overrides?: Overrides - } - ): Promise<TransactionResponse> { - return (opts?.signer || this.l1Signer).sendTransaction( - await this.populateTransaction.depositETH(amount, opts) - ) - } - - /** - * Withdraws some ETH back to the L1 chain. - * - * @param amount Amount of ETH to withdraw. - * @param opts Additional options. - * @param opts.signer Optional signer to use to send the transaction. - * @param opts.recipient Optional address to receive the funds on L1. Defaults to sender. - * @param opts.overrides Optional transaction overrides. - * @returns Transaction response for the withdraw transaction. - */ - public async withdrawETH( - amount: NumberLike, - opts?: { - recipient?: AddressLike - signer?: Signer - overrides?: Overrides - } - ): Promise<TransactionResponse> { - return (opts?.signer || this.l2Signer).sendTransaction( - await this.populateTransaction.withdrawETH(amount, opts) - ) - } - - /** - * Queries the account's approval amount for a given L1 token. - * - * @param l1Token The L1 token address. - * @param l2Token The L2 token address. - * @param opts Additional options. - * @param opts.signer Optional signer to get the approval for. - * @returns Amount of tokens approved for deposits from the account. - */ - public async approval( - l1Token: AddressLike, - l2Token: AddressLike, - opts?: { - signer?: Signer - } - ): Promise<BigNumber> { - const bridge = await this.getBridgeForTokenPair(l1Token, l2Token) - return bridge.approval(l1Token, l2Token, opts?.signer || this.l1Signer) - } - - /** - * Approves a deposit into the L2 chain. - * - * @param l1Token The L1 token address. - * @param l2Token The L2 token address. - * @param amount Amount of the token to approve. - * @param opts Additional options. - * @param opts.signer Optional signer to use to send the transaction. - * @param opts.overrides Optional transaction overrides. - * @returns Transaction response for the approval transaction. - */ - public async approveERC20( - l1Token: AddressLike, - l2Token: AddressLike, - amount: NumberLike, - opts?: { - signer?: Signer - overrides?: Overrides - } - ): Promise<TransactionResponse> { - return (opts?.signer || this.l1Signer).sendTransaction( - await this.populateTransaction.approveERC20( - l1Token, - l2Token, - amount, - opts - ) - ) - } - - /** - * Deposits some ERC20 tokens into the L2 chain. - * - * @param l1Token Address of the L1 token. - * @param l2Token Address of the L2 token. - * @param amount Amount to deposit. - * @param opts Additional options. - * @param opts.signer Optional signer to use to send the transaction. - * @param opts.recipient Optional address to receive the funds on L2. Defaults to sender. - * @param opts.l2GasLimit Optional gas limit to use for the transaction on L2. - * @param opts.overrides Optional transaction overrides. - * @returns Transaction response for the deposit transaction. - */ - public async depositERC20( - l1Token: AddressLike, - l2Token: AddressLike, - amount: NumberLike, - opts?: { - recipient?: AddressLike - signer?: Signer - l2GasLimit?: NumberLike - overrides?: CallOverrides - } - ): Promise<TransactionResponse> { - return (opts?.signer || this.l1Signer).sendTransaction( - await this.populateTransaction.depositERC20( - l1Token, - l2Token, - amount, - opts - ) - ) - } - - /** - * Withdraws some ERC20 tokens back to the L1 chain. - * - * @param l1Token Address of the L1 token. - * @param l2Token Address of the L2 token. - * @param amount Amount to withdraw. - * @param opts Additional options. - * @param opts.signer Optional signer to use to send the transaction. - * @param opts.recipient Optional address to receive the funds on L1. Defaults to sender. - * @param opts.overrides Optional transaction overrides. - * @returns Transaction response for the withdraw transaction. - */ - public async withdrawERC20( - l1Token: AddressLike, - l2Token: AddressLike, - amount: NumberLike, - opts?: { - recipient?: AddressLike - signer?: Signer - overrides?: Overrides - } - ): Promise<TransactionResponse> { - return (opts?.signer || this.l2Signer).sendTransaction( - await this.populateTransaction.withdrawERC20( - l1Token, - l2Token, - amount, - opts - ) - ) - } - - /** - * Object that holds the functions that generate transactions to be signed by the user. - * Follows the pattern used by ethers.js. - */ - populateTransaction = { - /** - * Generates a transaction that sends a given cross chain message. This transaction can be signed - * and executed by a signer. - * - * @param message Cross chain message to send. - * @param opts Additional options. - * @param opts.l2GasLimit Optional gas limit to use for the transaction on L2. - * @param opts.overrides Optional transaction overrides. - * @returns Transaction that can be signed and executed to send the message. - */ - sendMessage: async ( - message: CrossChainMessageRequest, - opts?: { - l2GasLimit?: NumberLike - overrides?: Overrides - } - ): Promise<TransactionRequest> => { - if (message.direction === MessageDirection.L1_TO_L2) { - return this.contracts.l1.L1CrossDomainMessenger.populateTransaction.sendMessage( - message.target, - message.message, - opts?.l2GasLimit || (await this.estimateL2MessageGasLimit(message)), - opts?.overrides || {} - ) - } else { - return this.contracts.l2.L2CrossDomainMessenger.populateTransaction.sendMessage( - message.target, - message.message, - 0, // Gas limit goes unused when sending from L2 to L1 - opts?.overrides || {} - ) - } - }, - - /** - * Generates a transaction that resends a given cross chain message. Only applies to L1 to L2 - * messages. This transaction can be signed and executed by a signer. - * - * @param message Cross chain message to resend. - * @param messageGasLimit New gas limit to use for the message. - * @param opts Additional options. - * @param opts.overrides Optional transaction overrides. - * @returns Transaction that can be signed and executed to resend the message. - */ - resendMessage: async ( - message: MessageLike, - messageGasLimit: NumberLike, - opts?: { - overrides?: Overrides - }, - /** - * The index of the withdrawal if multiple are made with multicall - */ - messageIndex = 0 - ): Promise<TransactionRequest> => { - const resolved = await this.toCrossChainMessage(message, messageIndex) - if (resolved.direction === MessageDirection.L2_TO_L1) { - throw new Error(`cannot resend L2 to L1 message`) - } - - if (this.bedrock) { - return this.populateTransaction.finalizeMessage( - resolved, - { - ...(opts || {}), - overrides: { - ...opts?.overrides, - gasLimit: messageGasLimit, - }, - }, - messageIndex - ) - } else { - const legacyL1XDM = new ethers.Contract( - this.contracts.l1.L1CrossDomainMessenger.address, - getContractInterface('L1CrossDomainMessenger'), - this.l1SignerOrProvider - ) - return legacyL1XDM.populateTransaction.replayMessage( - resolved.target, - resolved.sender, - resolved.message, - resolved.messageNonce, - resolved.minGasLimit, - messageGasLimit, - opts?.overrides || {} - ) - } - }, - - /** - * Generates a message proving transaction that can be signed and executed. Only - * applicable for L2 to L1 messages. - * - * @param message Message to generate the proving transaction for. - * @param opts Additional options. - * @param opts.overrides Optional transaction overrides. - * @param messageIndex The index of the message, if multiple exist from multicall - * @returns Transaction that can be signed and executed to prove the message. - */ - proveMessage: async ( - message: MessageLike, - opts?: { - overrides?: PayableOverrides - }, - messageIndex = 0 - ): Promise<TransactionRequest> => { - const resolved = await this.toCrossChainMessage(message, messageIndex) - if (resolved.direction === MessageDirection.L1_TO_L2) { - throw new Error('cannot finalize L1 to L2 message') - } - - if (!this.bedrock) { - throw new Error( - 'message proving only applies after the bedrock upgrade' - ) - } - - const withdrawal = await this.toLowLevelMessage(resolved, messageIndex) - const proof = await this.getBedrockMessageProof(resolved, messageIndex) - - const args = [ - [ - withdrawal.messageNonce, - withdrawal.sender, - withdrawal.target, - withdrawal.value, - withdrawal.minGasLimit, - withdrawal.message, - ], - proof.l2OutputIndex, - [ - proof.outputRootProof.version, - proof.outputRootProof.stateRoot, - proof.outputRootProof.messagePasserStorageRoot, - proof.outputRootProof.latestBlockhash, - ], - proof.withdrawalProof, - opts?.overrides || {}, - ] as const - - return this.contracts.l1.OptimismPortal.populateTransaction.proveWithdrawalTransaction( - ...args - ) - }, - - /** - * Generates a message finalization transaction that can be signed and executed. Only - * applicable for L2 to L1 messages. Will throw an error if the message has not completed - * its challenge period yet. - * - * @param message Message to generate the finalization transaction for. - * @param opts Additional options. - * @param opts.overrides Optional transaction overrides. - * @param messageIndex The index of the message, if multiple exist from multicall - * @returns Transaction that can be signed and executed to finalize the message. - */ - finalizeMessage: async ( - message: MessageLike, - opts?: { - overrides?: PayableOverrides - }, - messageIndex = 0 - ): Promise<TransactionRequest> => { - const resolved = await this.toCrossChainMessage(message, messageIndex) - if (resolved.direction === MessageDirection.L1_TO_L2) { - throw new Error(`cannot finalize L1 to L2 message`) - } - - if (this.bedrock) { - // 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.value.messageNonce, - withdrawal.value.sender, - withdrawal.value.target, - withdrawal.value.value, - withdrawal.value.minGasLimit, - withdrawal.value.message, - ], - opts?.overrides || {} - ) - } else { - // L1CrossDomainMessenger relayMessage is the only method that isn't fully backwards - // compatible, so we need to use the legacy interface. When we fully upgrade to Bedrock we - // should be able to remove this code. - const proof = await this.getMessageProof(resolved, messageIndex) - const legacyL1XDM = new ethers.Contract( - this.contracts.l1.L1CrossDomainMessenger.address, - getContractInterface('L1CrossDomainMessenger'), - this.l1SignerOrProvider - ) - return legacyL1XDM.populateTransaction.relayMessage( - resolved.target, - resolved.sender, - resolved.message, - resolved.messageNonce, - proof, - opts?.overrides || {} - ) - } - }, - - /** - * Generates a transaction for depositing some ETH into the L2 chain. - * - * @param amount Amount of ETH to deposit. - * @param opts Additional options. - * @param opts.recipient Optional address to receive the funds on L2. Defaults to sender. - * @param opts.l2GasLimit Optional gas limit to use for the transaction on L2. - * @param opts.overrides Optional transaction overrides. - * @returns Transaction that can be signed and executed to deposit the ETH. - */ - depositETH: async ( - amount: NumberLike, - opts?: { - recipient?: AddressLike - l2GasLimit?: NumberLike - overrides?: PayableOverrides - }, - isEstimatingGas: boolean = false - ): Promise<TransactionRequest> => { - const getOpts = async () => { - if (isEstimatingGas) { - return opts - } - const gasEstimation = await this.estimateGas.depositETH(amount, opts) - return { - ...opts, - overrides: { - ...opts?.overrides, - gasLimit: gasEstimation.add(gasEstimation.div(2)), - }, - } - } - return this.bridges.ETH.populateTransaction.deposit( - ethers.constants.AddressZero, - predeploys.OVM_ETH, - amount, - await getOpts() - ) - }, - - /** - * Generates a transaction for withdrawing some ETH back to the L1 chain. - * - * @param amount Amount of ETH to withdraw. - * @param opts Additional options. - * @param opts.recipient Optional address to receive the funds on L1. Defaults to sender. - * @param opts.overrides Optional transaction overrides. - * @returns Transaction that can be signed and executed to withdraw the ETH. - */ - withdrawETH: async ( - amount: NumberLike, - opts?: { - recipient?: AddressLike - overrides?: Overrides - } - ): Promise<TransactionRequest> => { - return this.bridges.ETH.populateTransaction.withdraw( - ethers.constants.AddressZero, - predeploys.OVM_ETH, - amount, - opts - ) - }, - - /** - * Generates a transaction for approving some tokens to deposit into the L2 chain. - * - * @param l1Token The L1 token address. - * @param l2Token The L2 token address. - * @param amount Amount of the token to approve. - * @param opts Additional options. - * @param opts.overrides Optional transaction overrides. - * @returns Transaction response for the approval transaction. - */ - approveERC20: async ( - l1Token: AddressLike, - l2Token: AddressLike, - amount: NumberLike, - opts?: { - overrides?: Overrides - } - ): Promise<TransactionRequest> => { - const bridge = await this.getBridgeForTokenPair(l1Token, l2Token) - return bridge.populateTransaction.approve(l1Token, l2Token, amount, opts) - }, - - /** - * Generates a transaction for depositing some ERC20 tokens into the L2 chain. - * - * @param l1Token Address of the L1 token. - * @param l2Token Address of the L2 token. - * @param amount Amount to deposit. - * @param opts Additional options. - * @param opts.recipient Optional address to receive the funds on L2. Defaults to sender. - * @param opts.l2GasLimit Optional gas limit to use for the transaction on L2. - * @param opts.overrides Optional transaction overrides. - * @returns Transaction that can be signed and executed to deposit the tokens. - */ - depositERC20: async ( - l1Token: AddressLike, - l2Token: AddressLike, - amount: NumberLike, - opts?: { - recipient?: AddressLike - l2GasLimit?: NumberLike - overrides?: CallOverrides - }, - isEstimatingGas: boolean = false - ): Promise<TransactionRequest> => { - const bridge = await this.getBridgeForTokenPair(l1Token, l2Token) - // we need extra buffer for gas limit - const getOpts = async () => { - if (isEstimatingGas) { - return opts - } - // if we don't include the users address the estimation will fail from lack of allowance - if (!ethers.Signer.isSigner(this.l1SignerOrProvider)) { - throw new Error('unable to deposit without an l1 signer') - } - const from = (this.l1SignerOrProvider as Signer).getAddress() - const gasEstimation = await this.estimateGas.depositERC20( - l1Token, - l2Token, - amount, - { - ...opts, - overrides: { - ...opts?.overrides, - from: opts?.overrides?.from ?? from, - }, - } - ) - return { - ...opts, - overrides: { - ...opts?.overrides, - gasLimit: gasEstimation.add(gasEstimation.div(2)), - from: opts?.overrides?.from ?? from, - }, - } - } - return bridge.populateTransaction.deposit( - l1Token, - l2Token, - amount, - await getOpts() - ) - }, - - /** - * Generates a transaction for withdrawing some ERC20 tokens back to the L1 chain. - * - * @param l1Token Address of the L1 token. - * @param l2Token Address of the L2 token. - * @param amount Amount to withdraw. - * @param opts Additional options. - * @param opts.recipient Optional address to receive the funds on L1. Defaults to sender. - * @param opts.overrides Optional transaction overrides. - * @returns Transaction that can be signed and executed to withdraw the tokens. - */ - withdrawERC20: async ( - l1Token: AddressLike, - l2Token: AddressLike, - amount: NumberLike, - opts?: { - recipient?: AddressLike - overrides?: Overrides - } - ): Promise<TransactionRequest> => { - const bridge = await this.getBridgeForTokenPair(l1Token, l2Token) - return bridge.populateTransaction.withdraw(l1Token, l2Token, amount, opts) - }, - } - - /** - * Object that holds the functions that estimates the gas required for a given transaction. - * Follows the pattern used by ethers.js. - */ - estimateGas = { - /** - * Estimates gas required to send a cross chain message. - * - * @param message Cross chain message to send. - * @param opts Additional options. - * @param opts.l2GasLimit Optional gas limit to use for the transaction on L2. - * @param opts.overrides Optional transaction overrides. - * @returns Gas estimate for the transaction. - */ - sendMessage: async ( - message: CrossChainMessageRequest, - opts?: { - l2GasLimit?: NumberLike - overrides?: CallOverrides - } - ): Promise<BigNumber> => { - const tx = await this.populateTransaction.sendMessage(message, opts) - if (message.direction === MessageDirection.L1_TO_L2) { - return this.l1Provider.estimateGas(tx) - } else { - return this.l2Provider.estimateGas(tx) - } - }, - - /** - * Estimates gas required to resend a cross chain message. Only applies to L1 to L2 messages. - * - * @param message Cross chain message to resend. - * @param messageGasLimit New gas limit to use for the message. - * @param opts Additional options. - * @param opts.overrides Optional transaction overrides. - * @returns Gas estimate for the transaction. - */ - resendMessage: async ( - message: MessageLike, - messageGasLimit: NumberLike, - opts?: { - overrides?: CallOverrides - } - ): Promise<BigNumber> => { - return this.l1Provider.estimateGas( - await this.populateTransaction.resendMessage( - message, - messageGasLimit, - opts - ) - ) - }, - - /** - * Estimates gas required to prove a cross chain message. Only applies to L2 to L1 messages. - * - * @param message Message to generate the proving transaction for. - * @param opts Additional options. - * @param opts.overrides Optional transaction overrides. - * @param messageIndex The index of the message, if multiple exist from multicall - * @returns Gas estimate for the transaction. - */ - proveMessage: async ( - message: MessageLike, - opts?: { - overrides?: CallOverrides - }, - messageIndex = 0 - ): Promise<BigNumber> => { - return this.l1Provider.estimateGas( - await this.populateTransaction.proveMessage(message, opts, messageIndex) - ) - }, - - /** - * Estimates gas required to finalize a cross chain message. Only applies to L2 to L1 messages. - * - * @param message Message to generate the finalization transaction for. - * @param opts Additional options. - * @param opts.overrides Optional transaction overrides. - * @param messageIndex The index of the message, if multiple exist from multicall - * @returns Gas estimate for the transaction. - */ - finalizeMessage: async ( - message: MessageLike, - opts?: { - overrides?: CallOverrides - }, - messageIndex = 0 - ): Promise<BigNumber> => { - return this.l1Provider.estimateGas( - await this.populateTransaction.finalizeMessage( - message, - opts, - messageIndex - ) - ) - }, - - /** - * Estimates gas required to deposit some ETH into the L2 chain. - * - * @param amount Amount of ETH to deposit. - * @param opts Additional options. - * @param opts.recipient Optional address to receive the funds on L2. Defaults to sender. - * @param opts.l2GasLimit Optional gas limit to use for the transaction on L2. - * @param opts.overrides Optional transaction overrides. - * @returns Gas estimate for the transaction. - */ - depositETH: async ( - amount: NumberLike, - opts?: { - recipient?: AddressLike - l2GasLimit?: NumberLike - overrides?: CallOverrides - } - ): Promise<BigNumber> => { - return this.l1Provider.estimateGas( - await this.populateTransaction.depositETH(amount, opts, true) - ) - }, - - /** - * Estimates gas required to withdraw some ETH back to the L1 chain. - * - * @param amount Amount of ETH to withdraw. - * @param opts Additional options. - * @param opts.recipient Optional address to receive the funds on L1. Defaults to sender. - * @param opts.overrides Optional transaction overrides. - * @returns Gas estimate for the transaction. - */ - withdrawETH: async ( - amount: NumberLike, - opts?: { - recipient?: AddressLike - overrides?: CallOverrides - } - ): Promise<BigNumber> => { - return this.l2Provider.estimateGas( - await this.populateTransaction.withdrawETH(amount, opts) - ) - }, - - /** - * Estimates gas required to approve some tokens to deposit into the L2 chain. - * - * @param l1Token The L1 token address. - * @param l2Token The L2 token address. - * @param amount Amount of the token to approve. - * @param opts Additional options. - * @param opts.overrides Optional transaction overrides. - * @returns Transaction response for the approval transaction. - */ - approveERC20: async ( - l1Token: AddressLike, - l2Token: AddressLike, - amount: NumberLike, - opts?: { - overrides?: CallOverrides - } - ): Promise<BigNumber> => { - return this.l1Provider.estimateGas( - await this.populateTransaction.approveERC20( - l1Token, - l2Token, - amount, - opts - ) - ) - }, - - /** - * Estimates gas required to deposit some ERC20 tokens into the L2 chain. - * - * @param l1Token Address of the L1 token. - * @param l2Token Address of the L2 token. - * @param amount Amount to deposit. - * @param opts Additional options. - * @param opts.recipient Optional address to receive the funds on L2. Defaults to sender. - * @param opts.l2GasLimit Optional gas limit to use for the transaction on L2. - * @param opts.overrides Optional transaction overrides. - * @returns Gas estimate for the transaction. - */ - depositERC20: async ( - l1Token: AddressLike, - l2Token: AddressLike, - amount: NumberLike, - opts?: { - recipient?: AddressLike - l2GasLimit?: NumberLike - overrides?: CallOverrides - } - ): Promise<BigNumber> => { - return this.l1Provider.estimateGas( - await this.populateTransaction.depositERC20( - l1Token, - l2Token, - amount, - opts, - true - ) - ) - }, - - /** - * Estimates gas required to withdraw some ERC20 tokens back to the L1 chain. - * - * @param l1Token Address of the L1 token. - * @param l2Token Address of the L2 token. - * @param amount Amount to withdraw. - * @param opts Additional options. - * @param opts.recipient Optional address to receive the funds on L1. Defaults to sender. - * @param opts.overrides Optional transaction overrides. - * @returns Gas estimate for the transaction. - */ - withdrawERC20: async ( - l1Token: AddressLike, - l2Token: AddressLike, - amount: NumberLike, - opts?: { - recipient?: AddressLike - overrides?: CallOverrides - } - ): Promise<BigNumber> => { - return this.l2Provider.estimateGas( - await this.populateTransaction.withdrawERC20( - l1Token, - l2Token, - amount, - opts - ) - ) - }, - } -} diff --git a/packages/sdk/src/forge-artifacts/DisputeGameFactory.json b/packages/sdk/src/forge-artifacts/DisputeGameFactory.json deleted file mode 100644 index e2db82b17cc3..000000000000 --- a/packages/sdk/src/forge-artifacts/DisputeGameFactory.json +++ /dev/null @@ -1 +0,0 @@ -{"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 deleted file mode 100644 index 0f6ea9b686d0..000000000000 --- a/packages/sdk/src/forge-artifacts/FaultDisputeGame.json +++ /dev/null @@ -1 +0,0 @@ -{"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 deleted file mode 100644 index 2a5743a1323e..000000000000 --- a/packages/sdk/src/forge-artifacts/GasPriceOracle.json +++ /dev/null @@ -1 +0,0 @@ -{"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 deleted file mode 100644 index c62500ca1155..000000000000 --- a/packages/sdk/src/forge-artifacts/L1Block.json +++ /dev/null @@ -1 +0,0 @@ -{"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 deleted file mode 100644 index 9dba5479d699..000000000000 --- a/packages/sdk/src/forge-artifacts/L1CrossDomainMessenger.json +++ /dev/null @@ -1 +0,0 @@ -{"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 deleted file mode 100644 index e986941bf60b..000000000000 --- a/packages/sdk/src/forge-artifacts/L1ERC721Bridge.json +++ /dev/null @@ -1 +0,0 @@ -{"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 deleted file mode 100644 index 41a38e7d7097..000000000000 --- a/packages/sdk/src/forge-artifacts/L1StandardBridge.json +++ /dev/null @@ -1 +0,0 @@ -{"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 deleted file mode 100644 index 9877d7506eb5..000000000000 --- a/packages/sdk/src/forge-artifacts/L2CrossDomainMessenger.json +++ /dev/null @@ -1 +0,0 @@ -{"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 deleted file mode 100644 index 4ec47e1d9f16..000000000000 --- a/packages/sdk/src/forge-artifacts/L2ERC721Bridge.json +++ /dev/null @@ -1 +0,0 @@ -{"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 deleted file mode 100644 index 31c2aeb5292c..000000000000 --- a/packages/sdk/src/forge-artifacts/L2OutputOracle.json +++ /dev/null @@ -1 +0,0 @@ -{"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 deleted file mode 100644 index 3e707fe88b52..000000000000 --- a/packages/sdk/src/forge-artifacts/L2StandardBridge.json +++ /dev/null @@ -1 +0,0 @@ -{"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 deleted file mode 100644 index f7ed43e765c9..000000000000 --- a/packages/sdk/src/forge-artifacts/L2ToL1MessagePasser.json +++ /dev/null @@ -1 +0,0 @@ -{"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 deleted file mode 100644 index 682ff763ac78..000000000000 --- a/packages/sdk/src/forge-artifacts/OptimismMintableERC20.json +++ /dev/null @@ -1 +0,0 @@ -{"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 deleted file mode 100644 index c43204aaaace..000000000000 --- a/packages/sdk/src/forge-artifacts/OptimismMintableERC20Factory.json +++ /dev/null @@ -1 +0,0 @@ -{"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 deleted file mode 100644 index 4d3e3388ce41..000000000000 --- a/packages/sdk/src/forge-artifacts/OptimismPortal.json +++ /dev/null @@ -1 +0,0 @@ -{"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 deleted file mode 100644 index 962c442e0c67..000000000000 --- a/packages/sdk/src/forge-artifacts/OptimismPortal2.json +++ /dev/null @@ -1 +0,0 @@ -{"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 deleted file mode 100644 index 2edb1663c68a..000000000000 --- a/packages/sdk/src/forge-artifacts/ProxyAdmin.json +++ /dev/null @@ -1 +0,0 @@ -{"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 deleted file mode 100644 index d89e081d4a7f..000000000000 --- a/packages/sdk/src/forge-artifacts/WETH9.json +++ /dev/null @@ -1 +0,0 @@ -{"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/index.ts b/packages/sdk/src/index.ts deleted file mode 100644 index aeceec8a2264..000000000000 --- a/packages/sdk/src/index.ts +++ /dev/null @@ -1,5 +0,0 @@ -export * from './interfaces' -export * from './utils' -export * from './cross-chain-messenger' -export * from './adapters' -export * from './l2-provider' diff --git a/packages/sdk/src/interfaces/bridge-adapter.ts b/packages/sdk/src/interfaces/bridge-adapter.ts deleted file mode 100644 index 957119889285..000000000000 --- a/packages/sdk/src/interfaces/bridge-adapter.ts +++ /dev/null @@ -1,308 +0,0 @@ -import { - Contract, - Overrides, - Signer, - BigNumber, - CallOverrides, - PayableOverrides, -} from 'ethers' -import { - TransactionRequest, - TransactionResponse, - BlockTag, -} from '@ethersproject/abstract-provider' - -import { NumberLike, AddressLike, TokenBridgeMessage } from './types' -import { CrossChainMessenger } from '../cross-chain-messenger' - -/** - * Represents an adapter for an L1<>L2 token bridge. Each custom bridge currently needs its own - * adapter because the bridge interface is not standardized. This may change in the future. - */ -export interface IBridgeAdapter { - /** - * Provider used to make queries related to cross-chain interactions. - */ - messenger: CrossChainMessenger - - /** - * L1 bridge contract. - */ - l1Bridge: Contract - - /** - * L2 bridge contract. - */ - l2Bridge: Contract - - /** - * Gets all deposits for a given address. - * - * @param address Address to search for messages from. - * @param opts Options object. - * @param opts.fromBlock Block to start searching for messages from. If not provided, will start - * from the first block (block #0). - * @param opts.toBlock Block to stop searching for messages at. If not provided, will stop at the - * latest known block ("latest"). - * @returns All deposit token bridge messages sent by the given address. - */ - getDepositsByAddress( - address: AddressLike, - opts?: { - fromBlock?: BlockTag - toBlock?: BlockTag - } - ): Promise<TokenBridgeMessage[]> - - /** - * Gets all withdrawals for a given address. - * - * @param address Address to search for messages from. - * @param opts Options object. - * @param opts.fromBlock Block to start searching for messages from. If not provided, will start - * from the first block (block #0). - * @param opts.toBlock Block to stop searching for messages at. If not provided, will stop at the - * latest known block ("latest"). - * @returns All withdrawal token bridge messages sent by the given address. - */ - getWithdrawalsByAddress( - address: AddressLike, - opts?: { - fromBlock?: BlockTag - toBlock?: BlockTag - } - ): Promise<TokenBridgeMessage[]> - - /** - * Checks whether the given token pair is supported by the bridge. - * - * @param l1Token The L1 token address. - * @param l2Token The L2 token address. - * @returns Whether the given token pair is supported by the bridge. - */ - supportsTokenPair( - l1Token: AddressLike, - l2Token: AddressLike - ): Promise<boolean> - - /** - * Queries the account's approval amount for a given L1 token. - * - * @param l1Token The L1 token address. - * @param l2Token The L2 token address. - * @param signer Signer to query the approval for. - * @returns Amount of tokens approved for deposits from the account. - */ - approval( - l1Token: AddressLike, - l2Token: AddressLike, - signer: Signer - ): Promise<BigNumber> - - /** - * Approves a deposit into the L2 chain. - * - * @param l1Token The L1 token address. - * @param l2Token The L2 token address. - * @param amount Amount of the token to approve. - * @param signer Signer used to sign and send the transaction. - * @param opts Additional options. - * @param opts.overrides Optional transaction overrides. - * @returns Transaction response for the approval transaction. - */ - approve( - l1Token: AddressLike, - l2Token: AddressLike, - amount: NumberLike, - signer: Signer, - opts?: { - overrides?: Overrides - } - ): Promise<TransactionResponse> - - /** - * Deposits some tokens into the L2 chain. - * - * @param l1Token The L1 token address. - * @param l2Token The L2 token address. - * @param amount Amount of the token to deposit. - * @param signer Signer used to sign and send the transaction. - * @param opts Additional options. - * @param opts.recipient Optional address to receive the funds on L2. Defaults to sender. - * @param opts.l2GasLimit Optional gas limit to use for the transaction on L2. - * @param opts.overrides Optional transaction overrides. - * @returns Transaction response for the deposit transaction. - */ - deposit( - l1Token: AddressLike, - l2Token: AddressLike, - amount: NumberLike, - signer: Signer, - opts?: { - recipient?: AddressLike - l2GasLimit?: NumberLike - overrides?: Overrides - } - ): Promise<TransactionResponse> - - /** - * Withdraws some tokens back to the L1 chain. - * - * @param l1Token The L1 token address. - * @param l2Token The L2 token address. - * @param amount Amount of the token to withdraw. - * @param signer Signer used to sign and send the transaction. - * @param opts Additional options. - * @param opts.recipient Optional address to receive the funds on L1. Defaults to sender. - * @param opts.overrides Optional transaction overrides. - * @returns Transaction response for the withdraw transaction. - */ - withdraw( - l1Token: AddressLike, - l2Token: AddressLike, - amount: NumberLike, - signer: Signer, - opts?: { - recipient?: AddressLike - overrides?: Overrides - } - ): Promise<TransactionResponse> - - /** - * Object that holds the functions that generate transactions to be signed by the user. - * Follows the pattern used by ethers.js. - */ - populateTransaction: { - /** - * Generates a transaction for approving some tokens to deposit into the L2 chain. - * - * @param l1Token The L1 token address. - * @param l2Token The L2 token address. - * @param amount Amount of the token to approve. - * @param opts Additional options. - * @param opts.overrides Optional transaction overrides. - * @returns Transaction that can be signed and executed to deposit the tokens. - */ - approve( - l1Token: AddressLike, - l2Token: AddressLike, - amount: NumberLike, - opts?: { - overrides?: Overrides - } - ): Promise<TransactionRequest> - - /** - * Generates a transaction for depositing some tokens into the L2 chain. - * - * @param l1Token The L1 token address. - * @param l2Token The L2 token address. - * @param amount Amount of the token to deposit. - * @param opts Additional options. - * @param opts.recipient Optional address to receive the funds on L2. Defaults to sender. - * @param opts.l2GasLimit Optional gas limit to use for the transaction on L2. - * @param opts.overrides Optional transaction overrides. - * @returns Transaction that can be signed and executed to deposit the tokens. - */ - deposit( - l1Token: AddressLike, - l2Token: AddressLike, - amount: NumberLike, - opts?: { - recipient?: AddressLike - l2GasLimit?: NumberLike - overrides?: PayableOverrides - } - ): Promise<TransactionRequest> - - /** - * Generates a transaction for withdrawing some tokens back to the L1 chain. - * - * @param l1Token The L1 token address. - * @param l2Token The L2 token address. - * @param amount Amount of the token to withdraw. - * @param opts Additional options. - * @param opts.recipient Optional address to receive the funds on L1. Defaults to sender. - * @param opts.overrides Optional transaction overrides. - * @returns Transaction that can be signed and executed to withdraw the tokens. - */ - withdraw( - l1Token: AddressLike, - l2Token: AddressLike, - amount: NumberLike, - opts?: { - recipient?: AddressLike - overrides?: Overrides - } - ): Promise<TransactionRequest> - } - - /** - * Object that holds the functions that estimates the gas required for a given transaction. - * Follows the pattern used by ethers.js. - */ - estimateGas: { - /** - * Estimates gas required to approve some tokens to deposit into the L2 chain. - * - * @param l1Token The L1 token address. - * @param l2Token The L2 token address. - * @param amount Amount of the token to approve. - * @param opts Additional options. - * @param opts.overrides Optional transaction overrides. - * @returns Gas estimate for the transaction. - */ - approve( - l1Token: AddressLike, - l2Token: AddressLike, - amount: NumberLike, - opts?: { - overrides?: CallOverrides - } - ): Promise<BigNumber> - - /** - * Estimates gas required to deposit some tokens into the L2 chain. - * - * @param l1Token The L1 token address. - * @param l2Token The L2 token address. - * @param amount Amount of the token to deposit. - * @param opts Additional options. - * @param opts.recipient Optional address to receive the funds on L2. Defaults to sender. - * @param opts.l2GasLimit Optional gas limit to use for the transaction on L2. - * @param opts.overrides Optional transaction overrides. - * @returns Gas estimate for the transaction. - */ - deposit( - l1Token: AddressLike, - l2Token: AddressLike, - amount: NumberLike, - opts?: { - recipient?: AddressLike - l2GasLimit?: NumberLike - overrides?: CallOverrides - } - ): Promise<BigNumber> - - /** - * Estimates gas required to withdraw some tokens back to the L1 chain. - * - * @param l1Token The L1 token address. - * @param l2Token The L2 token address. - * @param amount Amount of the token to withdraw. - * @param opts Additional options. - * @param opts.recipient Optional address to receive the funds on L1. Defaults to sender. - * @param opts.overrides Optional transaction overrides. - * @returns Gas estimate for the transaction. - */ - withdraw( - l1Token: AddressLike, - l2Token: AddressLike, - amount: NumberLike, - opts?: { - recipient?: AddressLike - overrides?: CallOverrides - } - ): Promise<BigNumber> - } -} diff --git a/packages/sdk/src/interfaces/index.ts b/packages/sdk/src/interfaces/index.ts deleted file mode 100644 index 7f1672e2693a..000000000000 --- a/packages/sdk/src/interfaces/index.ts +++ /dev/null @@ -1,3 +0,0 @@ -export * from './bridge-adapter' -export * from './l2-provider' -export * from './types' diff --git a/packages/sdk/src/interfaces/l2-provider.ts b/packages/sdk/src/interfaces/l2-provider.ts deleted file mode 100644 index bd988705ec69..000000000000 --- a/packages/sdk/src/interfaces/l2-provider.ts +++ /dev/null @@ -1,92 +0,0 @@ -import { - Provider, - TransactionRequest, - TransactionResponse, - Block, - BlockWithTransactions, -} from '@ethersproject/abstract-provider' -import { BigNumber } from 'ethers' - -/** - * JSON transaction representation when returned by L2Geth nodes. This is simply an extension to - * the standard transaction response type. You do NOT need to use this type unless you care about - * having typed access to L2-specific fields. - */ -export interface L2Transaction extends TransactionResponse { - l1BlockNumber: number - l1TxOrigin: string - queueOrigin: string - rawTransaction: string -} - -/** - * JSON block representation when returned by L2Geth nodes. Just a normal block but with - * an added stateRoot field. - */ -export interface L2Block extends Block { - stateRoot: string -} - -/** - * JSON block representation when returned by L2Geth nodes. Just a normal block but with - * L2Transaction objects instead of the standard transaction response object. - */ -export interface L2BlockWithTransactions extends BlockWithTransactions { - stateRoot: string - transactions: [L2Transaction] -} - -/** - * Represents an extended version of an normal ethers Provider that returns additional L2 info and - * has special functions for L2-specific interactions. - */ -export type L2Provider<TProvider extends Provider> = TProvider & { - /** - * Gets the current L1 (data) gas price. - * - * @returns Current L1 data gas price in wei. - */ - getL1GasPrice(): Promise<BigNumber> - - /** - * Estimates the L1 (data) gas required for a transaction. - * - * @param tx Transaction to estimate L1 gas for. - * @returns Estimated L1 gas. - */ - estimateL1Gas(tx: TransactionRequest): Promise<BigNumber> - - /** - * Estimates the L1 (data) gas cost for a transaction in wei by multiplying the estimated L1 gas - * cost by the current L1 gas price. - * - * @param tx Transaction to estimate L1 gas cost for. - * @returns Estimated L1 gas cost. - */ - estimateL1GasCost(tx: TransactionRequest): Promise<BigNumber> - - /** - * Estimates the L2 (execution) gas cost for a transaction in wei by multiplying the estimated L1 - * gas cost by the current L2 gas price. This is a simple multiplication of the result of - * getGasPrice and estimateGas for the given transaction request. - * - * @param tx Transaction to estimate L2 gas cost for. - * @returns Estimated L2 gas cost. - */ - estimateL2GasCost(tx: TransactionRequest): Promise<BigNumber> - - /** - * Estimates the total gas cost for a transaction in wei by adding the estimated the L1 gas cost - * and the estimated L2 gas cost. - * - * @param tx Transaction to estimate total gas cost for. - * @returns Estimated total gas cost. - */ - estimateTotalGasCost(tx: TransactionRequest): Promise<BigNumber> - - /** - * Internal property to determine if a provider is a L2Provider - * You are likely looking for the isL2Provider function - */ - _isL2Provider: true -} diff --git a/packages/sdk/src/interfaces/types.ts b/packages/sdk/src/interfaces/types.ts deleted file mode 100644 index 6b78b9e9234b..000000000000 --- a/packages/sdk/src/interfaces/types.ts +++ /dev/null @@ -1,374 +0,0 @@ -import { - Provider, - TransactionReceipt, - TransactionResponse, -} from '@ethersproject/abstract-provider' -import { Signer } from '@ethersproject/abstract-signer' -import { Contract, BigNumber } from 'ethers' - -import { CrossChainMessenger } from '../cross-chain-messenger' -import { IBridgeAdapter } from './bridge-adapter' - -/** - * L1 network chain IDs - */ -export enum L1ChainID { - MAINNET = 1, - GOERLI = 5, - SEPOLIA = 11155111, - HARDHAT_LOCAL = 31337, - BEDROCK_LOCAL_DEVNET = 900, -} - -/** - * L2 network chain IDs - */ -export enum L2ChainID { - OPTIMISM = 10, - OPTIMISM_GOERLI = 420, - OPTIMISM_SEPOLIA = 11155420, - OPTIMISM_HARDHAT_LOCAL = 31337, - OPTIMISM_HARDHAT_DEVNET = 17, - OPTIMISM_BEDROCK_ALPHA_TESTNET = 28528, - BASE_GOERLI = 84531, - BASE_SEPOLIA = 84532, - BASE_MAINNET = 8453, - ZORA_GOERLI = 999, - ZORA_MAINNET = 7777777, - MODE_SEPOLIA = 919, - MODE_MAINNET = 34443, -} - -/** - * L1 contract references. - */ -export interface OEL1Contracts { - AddressManager: Contract - L1CrossDomainMessenger: Contract - L1StandardBridge: Contract - StateCommitmentChain: Contract - CanonicalTransactionChain: Contract - BondManager: Contract - // Bedrock - OptimismPortal: Contract - L2OutputOracle: Contract - // FPAC - OptimismPortal2?: Contract - DisputeGameFactory?: Contract - FaultDisputeGame?: Contract -} - -/** - * L2 contract references. - */ -export interface OEL2Contracts { - L2CrossDomainMessenger: Contract - L2StandardBridge: Contract - L2ToL1MessagePasser: Contract - OVM_L1BlockNumber: Contract - OVM_L2ToL1MessagePasser: Contract - OVM_DeployerWhitelist: Contract - OVM_ETH: Contract - OVM_GasPriceOracle: Contract - OVM_SequencerFeeVault: Contract - WETH: Contract - BedrockMessagePasser: Contract -} - -/** - * Represents Optimism contracts, assumed to be connected to their appropriate - * providers and addresses. - */ -export interface OEContracts { - l1: OEL1Contracts - l2: OEL2Contracts -} - -/** - * Convenience type for something that looks like the L1 OE contract interface but could be - * addresses instead of actual contract objects. - */ -export type OEL1ContractsLike = { - [K in keyof OEL1Contracts]: AddressLike -} - -/** - * Convenience type for something that looks like the L2 OE contract interface but could be - * addresses instead of actual contract objects. - */ -export type OEL2ContractsLike = { - [K in keyof OEL2Contracts]: AddressLike -} - -/** - * Convenience type for something that looks like the OE contract interface but could be - * addresses instead of actual contract objects. - */ -export interface OEContractsLike { - l1: OEL1ContractsLike - l2: OEL2ContractsLike -} - -/** - * Something that looks like the list of custom bridges. - */ -export interface BridgeAdapterData { - [name: string]: { - Adapter: new (opts: { - messenger: CrossChainMessenger - l1Bridge: AddressLike - l2Bridge: AddressLike - }) => IBridgeAdapter - l1Bridge: AddressLike - l2Bridge: AddressLike - } -} - -/** - * Something that looks like the list of custom bridges. - */ -export interface BridgeAdapters { - [name: string]: IBridgeAdapter -} - -/** - * Enum describing the status of a message. - */ -export enum MessageStatus { - /** - * Message is an L1 to L2 message and has not been processed by the L2. - */ - UNCONFIRMED_L1_TO_L2_MESSAGE, - - /** - * Message is an L1 to L2 message and the transaction to execute the message failed. - * When this status is returned, you will need to resend the L1 to L2 message, probably with a - * higher gas limit. - */ - FAILED_L1_TO_L2_MESSAGE, - - /** - * Message is an L2 to L1 message and no state root has been published yet. - */ - STATE_ROOT_NOT_PUBLISHED, - - /** - * Message is ready to be proved on L1 to initiate the challenge period. - */ - READY_TO_PROVE, - - /** - * Message is a proved L2 to L1 message and is undergoing the challenge period. - */ - IN_CHALLENGE_PERIOD, - - /** - * Message is ready to be relayed. - */ - READY_FOR_RELAY, - - /** - * Message has been relayed. - */ - RELAYED, -} - -/** - * Enum describing the direction of a message. - */ -export enum MessageDirection { - L1_TO_L2, - L2_TO_L1, -} - -/** - * Partial message that needs to be signed and executed by a specific signer. - */ -export interface CrossChainMessageRequest { - direction: MessageDirection - target: string - message: string -} - -/** - * Core components of a cross chain message. - */ -export interface CoreCrossChainMessage { - sender: string - target: string - message: string - messageNonce: BigNumber - value: BigNumber - minGasLimit: BigNumber -} - -/** - * Describes a message that is sent between L1 and L2. Direction determines where the message was - * sent from and where it's being sent to. - */ -export interface CrossChainMessage extends CoreCrossChainMessage { - direction: MessageDirection - logIndex: number - blockNumber: number - transactionHash: string -} - -/** - * Describes messages sent inside the L2ToL1MessagePasser on L2. Happens to be the same structure - * as the CoreCrossChainMessage so we'll reuse the type for now. - */ -export type LowLevelMessage = CoreCrossChainMessage - -/** - * Describes a token withdrawal or deposit, along with the underlying raw cross chain message - * behind the deposit or withdrawal. - */ -export interface TokenBridgeMessage { - direction: MessageDirection - from: string - to: string - l1Token: string - l2Token: string - amount: BigNumber - data: string - logIndex: number - blockNumber: number - transactionHash: string -} - -/** - * Represents a withdrawal entry within the logs of a L2 to L1 - * CrossChainMessage - */ -export interface WithdrawalEntry { - MessagePassed: any -} - -/** - * Enum describing the status of a CrossDomainMessage message receipt. - */ -export enum MessageReceiptStatus { - RELAYED_FAILED, - RELAYED_SUCCEEDED, -} - -/** - * CrossDomainMessage receipt. - */ -export interface MessageReceipt { - receiptStatus: MessageReceiptStatus - transactionReceipt: TransactionReceipt -} - -/** - * ProvenWithdrawal in OptimismPortal. - */ -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. - */ -export interface StateRootBatchHeader { - batchIndex: BigNumber - batchRoot: string - batchSize: BigNumber - prevTotalElements: BigNumber - extraData: string -} - -/** - * Information about a state root, including header, block number, and root iself. - */ -export interface StateRoot { - stateRoot: string - stateRootIndexInBatch: number - batch: StateRootBatch -} - -/** - * Information about a batch of state roots. - */ -export interface StateRootBatch { - blockNumber: number - header: StateRootBatchHeader - stateRoots: string[] -} - -/** - * Proof data required to finalize an L2 to L1 message. - */ -export interface CrossChainMessageProof { - stateRoot: string - stateRootBatchHeader: StateRootBatchHeader - stateRootProof: { - index: number - siblings: string[] - } - stateTrieWitness: string - storageTrieWitness: string -} - -/** - * Stuff that can be coerced into a transaction. - */ -export type TransactionLike = string | TransactionReceipt | TransactionResponse - -/** - * Stuff that can be coerced into a CrossChainMessage. - */ -export type MessageLike = - | CrossChainMessage - | TransactionLike - | TokenBridgeMessage - -/** - * Stuff that can be coerced into a CrossChainMessageRequest. - */ -export type MessageRequestLike = - | CrossChainMessageRequest - | CrossChainMessage - | TransactionLike - | TokenBridgeMessage - -/** - * Stuff that can be coerced into a provider. - */ -export type ProviderLike = string | Provider - -/** - * Stuff that can be coerced into a signer. - */ -export type SignerLike = string | Signer - -/** - * Stuff that can be coerced into a signer or provider. - */ -export type SignerOrProviderLike = SignerLike | ProviderLike - -/** - * Stuff that can be coerced into an address. - */ -export type AddressLike = string | Contract - -/** - * Stuff that can be coerced into a number. - */ -export type NumberLike = string | number | BigNumber diff --git a/packages/sdk/src/l2-provider.ts b/packages/sdk/src/l2-provider.ts deleted file mode 100644 index 6c410d2b2f47..000000000000 --- a/packages/sdk/src/l2-provider.ts +++ /dev/null @@ -1,277 +0,0 @@ -import { Provider, TransactionRequest } from '@ethersproject/abstract-provider' -import { serialize } from '@ethersproject/transactions' -import { Contract, BigNumber } from 'ethers' -import { predeploys, getContractInterface } from '@eth-optimism/contracts' -import cloneDeep from 'lodash/cloneDeep' - -import { assert } from './utils/assert' -import { L2Provider, ProviderLike, NumberLike } from './interfaces' -import { toProvider, toNumber, toBigNumber } from './utils' - -type ProviderTypeIsWrong = any - -/** - * Gets a reasonable nonce for the transaction. - * - * @param provider Provider to get the nonce from. - * @param tx Requested transaction. - * @returns A reasonable nonce for the transaction. - */ -const getNonceForTx = async ( - provider: ProviderLike, - tx: TransactionRequest -): Promise<number> => { - if (tx.nonce !== undefined) { - return toNumber(tx.nonce as NumberLike) - } else if (tx.from !== undefined) { - return toProvider(provider).getTransactionCount(tx.from) - } else { - // Large nonce with lots of non-zero bytes - return 0xffffffff - } -} - -/** - * Returns a Contract object for the GasPriceOracle. - * - * @param provider Provider to attach the contract to. - * @returns Contract object for the GasPriceOracle. - */ -const connectGasPriceOracle = (provider: ProviderLike): Contract => { - return new Contract( - predeploys.OVM_GasPriceOracle, - getContractInterface('OVM_GasPriceOracle'), - toProvider(provider) - ) -} - -/** - * Gets the current L1 gas price as seen on L2. - * - * @param l2Provider L2 provider to query the L1 gas price from. - * @returns Current L1 gas price as seen on L2. - */ -export const getL1GasPrice = async ( - l2Provider: ProviderLike -): Promise<BigNumber> => { - const gpo = connectGasPriceOracle(l2Provider) - return gpo.l1BaseFee() -} - -/** - * Estimates the amount of L1 gas required for a given L2 transaction. - * - * @param l2Provider L2 provider to query the gas usage from. - * @param tx Transaction to estimate L1 gas for. - * @returns Estimated L1 gas. - */ -export const estimateL1Gas = async ( - l2Provider: ProviderLike, - tx: TransactionRequest -): Promise<BigNumber> => { - const gpo = connectGasPriceOracle(l2Provider) - return gpo.getL1GasUsed( - serialize({ - to: tx.to, - gasLimit: tx.gasLimit, - gasPrice: tx.gasPrice, - maxFeePerGas: tx.maxFeePerGas, - maxPriorityFeePerGas: tx.maxPriorityFeePerGas, - data: tx.data, - value: tx.value, - chainId: tx.chainId, - type: tx.type, - accessList: tx.accessList, - nonce: tx.nonce - ? BigNumber.from(tx.nonce).toNumber() - : await getNonceForTx(l2Provider, tx), - }) - ) -} - -/** - * Estimates the amount of L1 gas cost for a given L2 transaction in wei. - * - * @param l2Provider L2 provider to query the gas usage from. - * @param tx Transaction to estimate L1 gas cost for. - * @returns Estimated L1 gas cost. - */ -export const estimateL1GasCost = async ( - l2Provider: ProviderLike, - tx: TransactionRequest -): Promise<BigNumber> => { - const gpo = connectGasPriceOracle(l2Provider) - return gpo.getL1Fee( - serialize({ - to: tx.to, - gasLimit: tx.gasLimit, - gasPrice: tx.gasPrice, - maxFeePerGas: tx.maxFeePerGas, - maxPriorityFeePerGas: tx.maxPriorityFeePerGas, - data: tx.data, - value: tx.value, - chainId: tx.chainId, - type: tx.type, - accessList: tx.accessList, - nonce: tx.nonce - ? BigNumber.from(tx.nonce).toNumber() - : await getNonceForTx(l2Provider, tx), - }) - ) -} - -/** - * Estimates the L2 gas cost for a given L2 transaction in wei. - * - * @param l2Provider L2 provider to query the gas usage from. - * @param tx Transaction to estimate L2 gas cost for. - * @returns Estimated L2 gas cost. - */ -export const estimateL2GasCost = async ( - l2Provider: ProviderLike, - tx: TransactionRequest -): Promise<BigNumber> => { - const parsed = toProvider(l2Provider) - const l2GasPrice = await parsed.getGasPrice() - const l2GasCost = await parsed.estimateGas(tx) - return l2GasPrice.mul(l2GasCost) -} - -/** - * Estimates the total gas cost for a given L2 transaction in wei. - * - * @param l2Provider L2 provider to query the gas usage from. - * @param tx Transaction to estimate total gas cost for. - * @returns Estimated total gas cost. - */ -export const estimateTotalGasCost = async ( - l2Provider: ProviderLike, - tx: TransactionRequest -): Promise<BigNumber> => { - const l1GasCost = await estimateL1GasCost(l2Provider, tx) - const l2GasCost = await estimateL2GasCost(l2Provider, tx) - return l1GasCost.add(l2GasCost) -} - -/** - * Determines if a given Provider is an L2Provider. Will coerce type - * if true - * - * @param provider The provider to check - * @returns Boolean - * @example - * if (isL2Provider(provider)) { - * // typescript now knows it is of type L2Provider - * const gasPrice = await provider.estimateL2GasPrice(tx) - * } - */ -export const isL2Provider = <TProvider extends Provider>( - provider: TProvider -): provider is L2Provider<TProvider> => { - return Boolean((provider as L2Provider<TProvider>)._isL2Provider) -} - -/** - * Returns an provider wrapped as an Optimism L2 provider. Adds a few extra helper functions to - * simplify the process of estimating the gas usage for a transaction on Optimism. Returns a COPY - * of the original provider. - * - * @param provider Provider to wrap into an L2 provider. - * @returns Provider wrapped as an L2 provider. - */ -export const asL2Provider = <TProvider extends Provider>( - provider: TProvider -): L2Provider<TProvider> => { - // Skip if we've already wrapped this provider. - if (isL2Provider(provider)) { - return provider - } - - // Make a copy of the provider since we'll be modifying some internals and don't want to mess - // with the original object. - const l2Provider = cloneDeep(provider) as L2Provider<TProvider> - - // Not exactly sure when the provider wouldn't have a formatter function, but throw an error if - // it doesn't have one. The Provider type doesn't define it but every provider I've dealt with - // seems to have it. - // TODO this may be fixed if library has gotten updated since - const formatter = (l2Provider as ProviderTypeIsWrong).formatter - assert(formatter, `provider.formatter must be defined`) - - // Modify the block formatter to return the state root. Not strictly related to Optimism, just a - // generally useful thing that really should've been on the Ethers block object to begin with. - // TODO: Maybe we should make a PR to add this to the Ethers library? - const ogBlockFormatter = formatter.block.bind(formatter) - formatter.block = (block: any) => { - const parsed = ogBlockFormatter(block) - parsed.stateRoot = block.stateRoot - return parsed - } - - // Modify the block formatter to include all the L2 fields for transactions. - const ogBlockWithTxFormatter = formatter.blockWithTransactions.bind(formatter) - formatter.blockWithTransactions = (block: any) => { - const parsed = ogBlockWithTxFormatter(block) - parsed.stateRoot = block.stateRoot - parsed.transactions = parsed.transactions.map((tx: any, idx: number) => { - const ogTx = block.transactions[idx] - tx.l1BlockNumber = ogTx.l1BlockNumber - ? toNumber(ogTx.l1BlockNumber) - : ogTx.l1BlockNumber - tx.l1Timestamp = ogTx.l1Timestamp - ? toNumber(ogTx.l1Timestamp) - : ogTx.l1Timestamp - tx.l1TxOrigin = ogTx.l1TxOrigin - tx.queueOrigin = ogTx.queueOrigin - tx.rawTransaction = ogTx.rawTransaction - return tx - }) - return parsed - } - - // Modify the transaction formatter to include all the L2 fields for transactions. - const ogTxResponseFormatter = formatter.transactionResponse.bind(formatter) - formatter.transactionResponse = (tx: any) => { - const parsed = ogTxResponseFormatter(tx) - parsed.txType = tx.txType - parsed.queueOrigin = tx.queueOrigin - parsed.rawTransaction = tx.rawTransaction - parsed.l1TxOrigin = tx.l1TxOrigin - parsed.l1BlockNumber = tx.l1BlockNumber - ? parseInt(tx.l1BlockNumber, 16) - : tx.l1BlockNumbers - return parsed - } - - // Modify the receipt formatter to include all the L2 fields. - const ogReceiptFormatter = formatter.receipt.bind(formatter) - formatter.receipt = (receipt: any) => { - const parsed = ogReceiptFormatter(receipt) - parsed.l1GasPrice = toBigNumber(receipt.l1GasPrice) - parsed.l1GasUsed = toBigNumber(receipt.l1GasUsed) - parsed.l1Fee = toBigNumber(receipt.l1Fee) - parsed.l1FeeScalar = parseFloat(receipt.l1FeeScalar) - return parsed - } - - // Connect extra functions. - l2Provider.getL1GasPrice = async () => { - return getL1GasPrice(l2Provider) - } - l2Provider.estimateL1Gas = async (tx: TransactionRequest) => { - return estimateL1Gas(l2Provider, tx) - } - l2Provider.estimateL1GasCost = async (tx: TransactionRequest) => { - return estimateL1GasCost(l2Provider, tx) - } - l2Provider.estimateL2GasCost = async (tx: TransactionRequest) => { - return estimateL2GasCost(l2Provider, tx) - } - l2Provider.estimateTotalGasCost = async (tx: TransactionRequest) => { - return estimateTotalGasCost(l2Provider, tx) - } - - l2Provider._isL2Provider = true - - return l2Provider -} diff --git a/packages/sdk/src/utils/assert.ts b/packages/sdk/src/utils/assert.ts deleted file mode 100644 index 3022990e5151..000000000000 --- a/packages/sdk/src/utils/assert.ts +++ /dev/null @@ -1,5 +0,0 @@ -export const assert = (condition: boolean, message: string): void => { - if (!condition) { - throw new Error(message) - } -} diff --git a/packages/sdk/src/utils/chain-constants.ts b/packages/sdk/src/utils/chain-constants.ts deleted file mode 100644 index 15a7c1a98855..000000000000 --- a/packages/sdk/src/utils/chain-constants.ts +++ /dev/null @@ -1,385 +0,0 @@ -import { predeploys } from '@eth-optimism/core-utils' -import { ethers } from 'ethers' - -// The addresses below should be for the proxy if it is a proxied contract. - -const portalAddresses = { - mainnet: '0xbEb5Fc579115071764c7423A4f12eDde41f106Ed', - goerli: '0x5b47E1A08Ea6d985D6649300584e6722Ec4B1383', - sepolia: '0x16Fc5058F25648194471939df75CF27A2fdC48BC', -} - -const l2OutputOracleAddresses = { - mainnet: '0xdfe97868233d1aa22e815a266982f2cf17685a27', - goerli: '0xE6Dfba0953616Bacab0c9A8ecb3a9BBa77FC15c0', - sepolia: '0x90E9c4f8a994a250F6aEfd61CAFb4F2e895D458F', -} - -const addressManagerAddresses = { - mainnet: '0xdE1FCfB0851916CA5101820A69b13a4E276bd81F', - goerli: '0xa6f73589243a6A7a9023b1Fa0651b1d89c177111', - sepolia: '0x9bFE9c5609311DF1c011c47642253B78a4f33F4B', -} - -const l1StandardBridgeAddresses = { - mainnet: '0x99C9fc46f92E8a1c0deC1b1747d010903E884bE1', - goerli: '0x636Af16bf2f682dD3109e60102b8E1A089FedAa8', - sepolia: '0xFBb0621E0B23b5478B630BD55a5f21f67730B0F1', -} - -const l1CrossDomainMessengerAddresses = { - mainnet: '0x25ace71c97B33Cc4729CF772ae268934F7ab5fA1', - goerli: '0x5086d1eEF304eb5284A0f6720f79403b4e9bE294', - sepolia: '0x58Cc85b8D04EA49cC6DBd3CbFFd00B4B8D6cb3ef', -} - -const disputeGameFactoryAddresses = { - mainnet: ethers.constants.AddressZero, - goerli: ethers.constants.AddressZero, - sepolia: '0x05F9613aDB30026FFd634f38e5C4dFd30a197Fa1', -} - -// legacy -const stateCommitmentChainAddresses = { - mainnet: '0xBe5dAb4A2e9cd0F27300dB4aB94BeE3A233AEB19', - goerli: '0x9c945aC97Baf48cB784AbBB61399beB71aF7A378', - sepolia: ethers.constants.AddressZero, -} - -// legacy -const canonicalTransactionChainAddresses = { - mainnet: '0x5E4e65926BA27467555EB562121fac00D24E9dD2', - goerli: '0x607F755149cFEB3a14E1Dc3A4E2450Cde7dfb04D', - sepolia: ethers.constants.AddressZero, -} - -import { - L1ChainID, - L2ChainID, - OEContractsLike, - OEL1ContractsLike, - OEL2ContractsLike, - BridgeAdapterData, -} from '../interfaces' -import { - StandardBridgeAdapter, - DAIBridgeAdapter, - ECOBridgeAdapter, -} from '../adapters' - -export const DEPOSIT_CONFIRMATION_BLOCKS: { - [ChainID in L2ChainID]: number -} = { - [L2ChainID.OPTIMISM]: 50 as const, - [L2ChainID.OPTIMISM_GOERLI]: 12 as const, - [L2ChainID.OPTIMISM_SEPOLIA]: 12 as const, - [L2ChainID.OPTIMISM_HARDHAT_LOCAL]: 2 as const, - [L2ChainID.OPTIMISM_HARDHAT_DEVNET]: 2 as const, - [L2ChainID.OPTIMISM_BEDROCK_ALPHA_TESTNET]: 12 as const, - [L2ChainID.BASE_GOERLI]: 25 as const, - [L2ChainID.BASE_SEPOLIA]: 25 as const, - [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: { - [ChainID in L1ChainID]: number -} = { - [L1ChainID.MAINNET]: 13 as const, - [L1ChainID.GOERLI]: 15 as const, - [L1ChainID.SEPOLIA]: 15 as const, - [L1ChainID.HARDHAT_LOCAL]: 1 as const, - [L1ChainID.BEDROCK_LOCAL_DEVNET]: 15 as const, -} - -/** - * Full list of default L2 contract addresses. - */ -export const DEFAULT_L2_CONTRACT_ADDRESSES: OEL2ContractsLike = { - L2CrossDomainMessenger: predeploys.L2CrossDomainMessenger, - L2ToL1MessagePasser: predeploys.L2ToL1MessagePasser, - L2StandardBridge: predeploys.L2StandardBridge, - OVM_L1BlockNumber: predeploys.L1BlockNumber, - OVM_L2ToL1MessagePasser: predeploys.L2ToL1MessagePasser, - OVM_DeployerWhitelist: predeploys.DeployerWhitelist, - OVM_ETH: predeploys.LegacyERC20ETH, - OVM_GasPriceOracle: predeploys.GasPriceOracle, - OVM_SequencerFeeVault: predeploys.SequencerFeeVault, - WETH: predeploys.WETH9, - BedrockMessagePasser: predeploys.L2ToL1MessagePasser, -} - -/** - * Loads the L1 contracts for a given network by the network name. - * - * @param network The name of the network to load the contracts for. - * @returns The L1 contracts for the given network. - */ -const getL1ContractsByNetworkName = (network: string): OEL1ContractsLike => { - return { - AddressManager: addressManagerAddresses[network], - L1CrossDomainMessenger: l1CrossDomainMessengerAddresses[network], - L1StandardBridge: l1StandardBridgeAddresses[network], - StateCommitmentChain: stateCommitmentChainAddresses[network], - CanonicalTransactionChain: canonicalTransactionChainAddresses[network], - BondManager: ethers.constants.AddressZero, - OptimismPortal: portalAddresses[network], - L2OutputOracle: l2OutputOracleAddresses[network], - OptimismPortal2: portalAddresses[network], - DisputeGameFactory: disputeGameFactoryAddresses[network], - } -} - -/** - * List of contracts that are ignorable when checking for contracts on a given network. - */ -export const IGNORABLE_CONTRACTS = ['OptimismPortal2', 'DisputeGameFactory'] - -/** - * Mapping of L1 chain IDs to the appropriate contract addresses for the OE deployments to the - * given network. Simplifies the process of getting the correct contract addresses for a given - * contract name. - */ -export const CONTRACT_ADDRESSES: { - [ChainID in L2ChainID]: OEContractsLike -} = { - [L2ChainID.OPTIMISM]: { - l1: getL1ContractsByNetworkName('mainnet'), - l2: DEFAULT_L2_CONTRACT_ADDRESSES, - }, - [L2ChainID.OPTIMISM_GOERLI]: { - l1: getL1ContractsByNetworkName('goerli'), - l2: DEFAULT_L2_CONTRACT_ADDRESSES, - }, - [L2ChainID.OPTIMISM_SEPOLIA]: { - l1: getL1ContractsByNetworkName('sepolia'), - l2: DEFAULT_L2_CONTRACT_ADDRESSES, - }, - [L2ChainID.OPTIMISM_HARDHAT_LOCAL]: { - l1: { - AddressManager: '0x5FbDB2315678afecb367f032d93F642f64180aa3' as const, - L1CrossDomainMessenger: - '0x8A791620dd6260079BF849Dc5567aDC3F2FdC318' as const, - L1StandardBridge: '0x610178dA211FEF7D417bC0e6FeD39F05609AD788' as const, - StateCommitmentChain: - '0xDc64a140Aa3E981100a9becA4E685f962f0cF6C9' as const, - CanonicalTransactionChain: - '0xCf7Ed3AccA5a467e9e704C703E8D87F634fB0Fc9' as const, - BondManager: '0x5FC8d32690cc91D4c39d9d3abcBD16989F875707' as const, - // FIXME - OptimismPortal: '0x0000000000000000000000000000000000000000' as const, - L2OutputOracle: '0x0000000000000000000000000000000000000000' as const, - OptimismPortal2: '0x0000000000000000000000000000000000000000' as const, - DisputeGameFactory: '0x0000000000000000000000000000000000000000' as const, - }, - l2: DEFAULT_L2_CONTRACT_ADDRESSES, - }, - [L2ChainID.OPTIMISM_HARDHAT_DEVNET]: { - l1: { - AddressManager: '0x5FbDB2315678afecb367f032d93F642f64180aa3' as const, - L1CrossDomainMessenger: - '0x8A791620dd6260079BF849Dc5567aDC3F2FdC318' as const, - L1StandardBridge: '0x610178dA211FEF7D417bC0e6FeD39F05609AD788' as const, - StateCommitmentChain: - '0xDc64a140Aa3E981100a9becA4E685f962f0cF6C9' as const, - CanonicalTransactionChain: - '0xCf7Ed3AccA5a467e9e704C703E8D87F634fB0Fc9' as const, - BondManager: '0x5FC8d32690cc91D4c39d9d3abcBD16989F875707' as const, - OptimismPortal: '0x0000000000000000000000000000000000000000' as const, - L2OutputOracle: '0x0000000000000000000000000000000000000000' as const, - OptimismPortal2: '0x0000000000000000000000000000000000000000' as const, - DisputeGameFactory: '0x0000000000000000000000000000000000000000' as const, - }, - l2: DEFAULT_L2_CONTRACT_ADDRESSES, - }, - [L2ChainID.OPTIMISM_BEDROCK_ALPHA_TESTNET]: { - l1: { - AddressManager: '0xb4e08DcE1F323608229265c9d4125E22a4B9dbAF' as const, - L1CrossDomainMessenger: - '0x838a6DC4E37CA45D4Ef05bb776bf05eEf50798De' as const, - L1StandardBridge: '0xFf94B6C486350aD92561Ba09bad3a59df764Da92' as const, - StateCommitmentChain: - '0x0000000000000000000000000000000000000000' as const, - CanonicalTransactionChain: - '0x0000000000000000000000000000000000000000' as const, - BondManager: '0x0000000000000000000000000000000000000000' as const, - OptimismPortal: '0xA581Ca3353DB73115C4625FFC7aDF5dB379434A8' as const, - L2OutputOracle: '0x3A234299a14De50027eA65dCdf1c0DaC729e04A6' as const, - OptimismPortal2: '0x0000000000000000000000000000000000000000' as const, - DisputeGameFactory: '0x0000000000000000000000000000000000000000' as const, - }, - l2: DEFAULT_L2_CONTRACT_ADDRESSES, - }, - [L2ChainID.BASE_GOERLI]: { - l1: { - AddressManager: '0x4Cf6b56b14c6CFcB72A75611080514F94624c54e' as const, - L1CrossDomainMessenger: - '0x8e5693140eA606bcEB98761d9beB1BC87383706D' as const, - L1StandardBridge: '0xfA6D8Ee5BE770F84FC001D098C4bD604Fe01284a' as const, - StateCommitmentChain: - '0x0000000000000000000000000000000000000000' as const, - CanonicalTransactionChain: - '0x0000000000000000000000000000000000000000' as const, - BondManager: '0x0000000000000000000000000000000000000000' as const, - OptimismPortal: '0xe93c8cD0D409341205A592f8c4Ac1A5fe5585cfA' as const, - L2OutputOracle: '0x2A35891ff30313CcFa6CE88dcf3858bb075A2298' as const, - OptimismPortal2: '0x0000000000000000000000000000000000000000' as const, - DisputeGameFactory: '0x0000000000000000000000000000000000000000' as const, - }, - l2: DEFAULT_L2_CONTRACT_ADDRESSES, - }, - [L2ChainID.BASE_SEPOLIA]: { - l1: { - AddressManager: '0x709c2B8ef4A9feFc629A8a2C1AF424Dc5BD6ad1B' as const, - L1CrossDomainMessenger: - '0xC34855F4De64F1840e5686e64278da901e261f20' as const, - L1StandardBridge: '0xfd0Bf71F60660E2f608ed56e1659C450eB113120' as const, - StateCommitmentChain: - '0x0000000000000000000000000000000000000000' as const, - CanonicalTransactionChain: - '0x0000000000000000000000000000000000000000' as const, - BondManager: '0x0000000000000000000000000000000000000000' as const, - OptimismPortal: '0x49f53e41452C74589E85cA1677426Ba426459e85' as const, - L2OutputOracle: '0x84457ca9D0163FbC4bbfe4Dfbb20ba46e48DF254' as const, - OptimismPortal2: '0x0000000000000000000000000000000000000000' as const, - DisputeGameFactory: '0x0000000000000000000000000000000000000000' as const, - }, - l2: DEFAULT_L2_CONTRACT_ADDRESSES, - }, - [L2ChainID.BASE_MAINNET]: { - l1: { - AddressManager: '0x8EfB6B5c4767B09Dc9AA6Af4eAA89F749522BaE2' as const, - L1CrossDomainMessenger: - '0x866E82a600A1414e583f7F13623F1aC5d58b0Afa' as const, - L1StandardBridge: '0x3154Cf16ccdb4C6d922629664174b904d80F2C35' as const, - StateCommitmentChain: - '0x0000000000000000000000000000000000000000' as const, - CanonicalTransactionChain: - '0x0000000000000000000000000000000000000000' as const, - BondManager: '0x0000000000000000000000000000000000000000' as const, - OptimismPortal: '0x49048044D57e1C92A77f79988d21Fa8fAF74E97e' as const, - L2OutputOracle: '0x56315b90c40730925ec5485cf004d835058518A0' as const, - OptimismPortal2: '0x0000000000000000000000000000000000000000' as const, - DisputeGameFactory: '0x0000000000000000000000000000000000000000' as const, - }, - l2: DEFAULT_L2_CONTRACT_ADDRESSES, - }, - // Zora Goerli - [L2ChainID.ZORA_GOERLI]: { - l1: { - AddressManager: '0x54f4676203dEDA6C08E0D40557A119c602bFA246' as const, - L1CrossDomainMessenger: - '0xD87342e16352D33170557A7dA1e5fB966a60FafC' as const, - L1StandardBridge: '0x7CC09AC2452D6555d5e0C213Ab9E2d44eFbFc956' as const, - StateCommitmentChain: - '0x0000000000000000000000000000000000000000' as const, - CanonicalTransactionChain: - '0x0000000000000000000000000000000000000000' as const, - BondManager: '0x0000000000000000000000000000000000000000' as const, - OptimismPortal: '0xDb9F51790365e7dc196e7D072728df39Be958ACe' as const, - L2OutputOracle: '0xdD292C9eEd00f6A32Ff5245d0BCd7f2a15f24e00' as const, - OptimismPortal2: '0x0000000000000000000000000000000000000000' as const, - DisputeGameFactory: '0x0000000000000000000000000000000000000000' as const, - }, - l2: DEFAULT_L2_CONTRACT_ADDRESSES, - }, - [L2ChainID.ZORA_MAINNET]: { - l1: { - AddressManager: '0xEF8115F2733fb2033a7c756402Fc1deaa56550Ef' as const, - L1CrossDomainMessenger: - '0xdC40a14d9abd6F410226f1E6de71aE03441ca506' as const, - L1StandardBridge: '0x3e2Ea9B92B7E48A52296fD261dc26fd995284631' as const, - StateCommitmentChain: - '0x0000000000000000000000000000000000000000' as const, - CanonicalTransactionChain: - '0x0000000000000000000000000000000000000000' as const, - BondManager: '0x0000000000000000000000000000000000000000' as const, - OptimismPortal: '0x1a0ad011913A150f69f6A19DF447A0CfD9551054' as const, - L2OutputOracle: '0x9E6204F750cD866b299594e2aC9eA824E2e5f95c' as const, - OptimismPortal2: '0x0000000000000000000000000000000000000000' as const, - DisputeGameFactory: '0x0000000000000000000000000000000000000000' as const, - }, - 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, - }, -} - -/** - * Mapping of L1 chain IDs to the list of custom bridge addresses for each chain. - */ -export const BRIDGE_ADAPTER_DATA: { - [ChainID in L2ChainID]?: BridgeAdapterData -} = { - [L2ChainID.OPTIMISM]: { - wstETH: { - Adapter: DAIBridgeAdapter, - l1Bridge: '0x76943C0D61395d8F2edF9060e1533529cAe05dE6' as const, - l2Bridge: '0x8E01013243a96601a86eb3153F0d9Fa4fbFb6957' as const, - }, - BitBTC: { - Adapter: StandardBridgeAdapter, - l1Bridge: '0xaBA2c5F108F7E820C049D5Af70B16ac266c8f128' as const, - l2Bridge: '0x158F513096923fF2d3aab2BcF4478536de6725e2' as const, - }, - DAI: { - Adapter: DAIBridgeAdapter, - l1Bridge: '0x10E6593CDda8c58a1d0f14C5164B376352a55f2F' as const, - l2Bridge: '0x467194771dAe2967Aef3ECbEDD3Bf9a310C76C65' as const, - }, - ECO: { - Adapter: ECOBridgeAdapter, - l1Bridge: '0xAa029BbdC947F5205fBa0F3C11b592420B58f824' as const, - l2Bridge: '0xAa029BbdC947F5205fBa0F3C11b592420B58f824' as const, - }, - }, - [L2ChainID.OPTIMISM_GOERLI]: { - DAI: { - Adapter: DAIBridgeAdapter, - l1Bridge: '0x05a388Db09C2D44ec0b00Ee188cD42365c42Df23' as const, - l2Bridge: '0x467194771dAe2967Aef3ECbEDD3Bf9a310C76C65' as const, - }, - ECO: { - Adapter: ECOBridgeAdapter, - l1Bridge: '0x9A4464D6bFE006715382D39D183AAf66c952a3e0' as const, - l2Bridge: '0x6aA809bAeA2e4C057b3994127cB165119c6fc3B2' as const, - }, - }, -} diff --git a/packages/sdk/src/utils/coercion.ts b/packages/sdk/src/utils/coercion.ts deleted file mode 100644 index b57f8ba04418..000000000000 --- a/packages/sdk/src/utils/coercion.ts +++ /dev/null @@ -1,132 +0,0 @@ -import { - Provider, - TransactionReceipt, - TransactionResponse, -} from '@ethersproject/abstract-provider' -import { Signer } from '@ethersproject/abstract-signer' -import { ethers, BigNumber } from 'ethers' - -import { assert } from './assert' -import { - SignerOrProviderLike, - ProviderLike, - TransactionLike, - NumberLike, - AddressLike, -} from '../interfaces' - -/** - * Converts a SignerOrProviderLike into a Signer or a Provider. Assumes that if the input is a - * string then it is a JSON-RPC url. - * - * @param signerOrProvider SignerOrProviderLike to turn into a Signer or Provider. - * @returns Input as a Signer or Provider. - */ -export const toSignerOrProvider = ( - signerOrProvider: SignerOrProviderLike -): Signer | Provider => { - if (typeof signerOrProvider === 'string') { - return new ethers.providers.JsonRpcProvider(signerOrProvider) - } else if (Provider.isProvider(signerOrProvider)) { - return signerOrProvider - } else if (Signer.isSigner(signerOrProvider)) { - return signerOrProvider - } else { - throw new Error('Invalid provider') - } -} - -/** - * Converts a ProviderLike into a Provider. Assumes that if the input is a string then it is a - * JSON-RPC url. - * - * @param provider ProviderLike to turn into a Provider. - * @returns Input as a Provider. - */ -export const toProvider = (provider: ProviderLike): Provider => { - if (typeof provider === 'string') { - return new ethers.providers.JsonRpcProvider(provider) - } else if (Provider.isProvider(provider)) { - return provider - } else { - throw new Error('Invalid 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. - * - * @param transaction TransactionLike to convert into a transaction hash. - * @returns Transaction hash corresponding to the TransactionLike input. - */ -export const toTransactionHash = (transaction: TransactionLike): string => { - if (typeof transaction === 'string') { - assert( - ethers.utils.isHexString(transaction, 32), - 'Invalid transaction hash' - ) - return transaction - } else if ((transaction as TransactionReceipt).transactionHash) { - return (transaction as TransactionReceipt).transactionHash - } else if ((transaction as TransactionResponse).hash) { - return (transaction as TransactionResponse).hash - } else { - throw new Error('Invalid transaction') - } -} - -/** - * Converts a number-like into an ethers BigNumber. - * - * @param num Number-like to convert into a BigNumber. - * @returns Number-like as a BigNumber. - */ -export const toBigNumber = (num: NumberLike): BigNumber => { - return ethers.BigNumber.from(num) -} - -/** - * Converts a number-like into a number. - * - * @param num Number-like to convert into a number. - * @returns Number-like as a number. - */ -export const toNumber = (num: NumberLike): number => { - return toBigNumber(num).toNumber() -} - -/** - * Converts an address-like into a 0x-prefixed address string. - * - * @param addr Address-like to convert into an address. - * @returns Address-like as an address. - */ -export const toAddress = (addr: AddressLike): string => { - if (typeof addr === 'string') { - assert(ethers.utils.isAddress(addr), 'Invalid address') - return ethers.utils.getAddress(addr) - } else { - assert(ethers.utils.isAddress(addr.address), 'Invalid address') - return ethers.utils.getAddress(addr.address) - } -} diff --git a/packages/sdk/src/utils/contracts.ts b/packages/sdk/src/utils/contracts.ts deleted file mode 100644 index c9a4184b0367..000000000000 --- a/packages/sdk/src/utils/contracts.ts +++ /dev/null @@ -1,291 +0,0 @@ -import { getContractInterface, predeploys } from '@eth-optimism/contracts' -import { ethers, Contract } from 'ethers' - -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' -import { StandardBridgeAdapter, ETHBridgeAdapter } from '../adapters' -import { - CONTRACT_ADDRESSES, - DEFAULT_L2_CONTRACT_ADDRESSES, - BRIDGE_ADAPTER_DATA, - IGNORABLE_CONTRACTS, -} from './chain-constants' -import { - OEContracts, - OEL1Contracts, - OEL2Contracts, - OEContractsLike, - AddressLike, - BridgeAdapters, - BridgeAdapterData, -} from '../interfaces' - -/** - * We've changed some contract names in this SDK to be a bit nicer. Here we remap these nicer names - * back to the original contract names so we can look them up. - */ -const NAME_REMAPPING = { - AddressManager: 'Lib_AddressManager' as const, - OVM_L1BlockNumber: 'iOVM_L1BlockNumber' as const, - WETH: 'WETH9' as const, - BedrockMessagePasser: 'L2ToL1MessagePasser' as const, -} - -export const getContractInterfaceBedrock = ( - name: string -): ethers.utils.Interface => { - let artifact: any = '' - switch (name) { - case 'Lib_AddressManager': - case 'AddressManager': - artifact = '' - break - case 'L1CrossDomainMessenger': - artifact = l1CrossDomainMessenger - break - case 'L1ERC721Bridge': - artifact = l1ERC721Bridge - break - case 'L2OutputOracle': - artifact = l2OutputOracle - break - case 'OptimismMintableERC20Factory': - artifact = optimismMintableERC20Factory - break - case 'ProxyAdmin': - artifact = proxyAdmin - break - case 'L1StandardBridge': - artifact = l1StandardBridge - break - case 'L2StandardBridge': - artifact = l2StandardBridge - break - case 'OptimismPortal': - artifact = optimismPortal - break - case 'L2CrossDomainMessenger': - artifact = l2CrossDomainMessenger - break - case 'OptimismMintableERC20': - artifact = optimismMintableERC20 - break - case 'L2ERC721Bridge': - artifact = l2ERC721Bridge - break - case 'L1Block': - artifact = l1Block - break - case 'L2ToL1MessagePasser': - artifact = l2ToL1MessagePasser - break - case 'GasPriceOracle': - artifact = gasPriceOracle - break - case 'DisputeGameFactory': - artifact = disputeGameFactory - break - case 'OptimismPortal2': - artifact = optimismPortal2 - break - case 'FaultDisputeGame': - artifact = faultDisputeGame - break - } - return new ethers.utils.Interface(artifact.abi) -} - -/** - * Returns an ethers.Contract object for the given name, connected to the appropriate address for - * the given L2 chain ID. Users can also provide a custom address to connect the contract to - * instead. If the chain ID is not known then the user MUST provide a custom address or this - * function will throw an error. - * - * @param contractName Name of the contract to connect to. - * @param l2ChainId Chain ID for the L2 network. - * @param opts Additional options for connecting to the contract. - * @param opts.address Custom address to connect to the contract. - * @param opts.signerOrProvider Signer or provider to connect to the contract. - * @returns An ethers.Contract object connected to the appropriate address and interface. - */ -export const getOEContract = ( - contractName: keyof OEL1Contracts | keyof OEL2Contracts, - l2ChainId: number, - opts: { - address?: AddressLike - signerOrProvider?: ethers.Signer | ethers.providers.Provider - } = {} -): Contract => { - // Generally we want to throw an error if a contract address is not provided but there are some - // exceptions, particularly for contracts that are part of an upgrade that has not yet been - // deployed. It's OK to not provide an address for these contracts with the caveat that this may - // cause a runtime error if the contract does actually need to be used. - const addresses = CONTRACT_ADDRESSES[l2ChainId] - if (addresses === undefined && opts.address === undefined) { - if (IGNORABLE_CONTRACTS.includes(contractName)) { - return undefined - } else { - throw new Error( - `cannot get contract ${contractName} for unknown L2 chain ID ${l2ChainId}, you must provide an address` - ) - } - } - - // Bedrock interfaces are backwards compatible. We can prefer Bedrock interfaces over legacy - // interfaces if they exist. - const name = NAME_REMAPPING[contractName] || contractName - let iface: ethers.utils.Interface - try { - iface = getContractInterfaceBedrock(name) - } catch (err) { - iface = getContractInterface(name) - } - - return new Contract( - toAddress( - opts.address || addresses.l1[contractName] || addresses.l2[contractName] - ), - iface, - opts.signerOrProvider - ) -} - -/** - * Automatically connects to all contract addresses, both L1 and L2, for the given L2 chain ID. The - * user can provide custom contract address overrides for L1 or L2 contracts. If the given chain ID - * is not known then the user MUST provide custom contract addresses for ALL L1 contracts or this - * function will throw an error. - * - * @param l2ChainId Chain ID for the L2 network. - * @param opts Additional options for connecting to the contracts. - * @param opts.l1SignerOrProvider: Signer or provider to connect to the L1 contracts. - * @param opts.l2SignerOrProvider: Signer or provider to connect to the L2 contracts. - * @param opts.overrides Custom contract address overrides for L1 or L2 contracts. - * @returns An object containing ethers.Contract objects connected to the appropriate addresses on - * both L1 and L2. - */ -export const getAllOEContracts = ( - l2ChainId: number, - opts: { - l1SignerOrProvider?: ethers.Signer | ethers.providers.Provider - l2SignerOrProvider?: ethers.Signer | ethers.providers.Provider - overrides?: DeepPartial<OEContractsLike> - } = {} -): OEContracts => { - const addresses = CONTRACT_ADDRESSES[l2ChainId] || { - l1: { - AddressManager: undefined, - L1CrossDomainMessenger: undefined, - L1StandardBridge: undefined, - StateCommitmentChain: undefined, - CanonicalTransactionChain: undefined, - BondManager: undefined, - OptimismPortal: undefined, - L2OutputOracle: undefined, - DisputeGameFactory: undefined, - OptimismPortal2: undefined, - }, - l2: DEFAULT_L2_CONTRACT_ADDRESSES, - } - - // Attach all L1 contracts. - const l1Contracts = {} as OEL1Contracts - for (const [contractName, contractAddress] of Object.entries(addresses.l1)) { - l1Contracts[contractName] = getOEContract( - contractName as keyof OEL1Contracts, - l2ChainId, - { - address: opts.overrides?.l1?.[contractName] || contractAddress, - signerOrProvider: opts.l1SignerOrProvider, - } - ) - } - - // Attach all L2 contracts. - const l2Contracts = {} as OEL2Contracts - for (const [contractName, contractAddress] of Object.entries(addresses.l2)) { - l2Contracts[contractName] = getOEContract( - contractName as keyof OEL2Contracts, - l2ChainId, - { - address: opts.overrides?.l2?.[contractName] || contractAddress, - signerOrProvider: opts.l2SignerOrProvider, - } - ) - } - - return { - l1: l1Contracts, - l2: l2Contracts, - } -} - -/** - * Gets a series of bridge adapters for the given L2 chain ID. - * - * @param l2ChainId Chain ID for the L2 network. - * @param messenger Cross chain messenger to connect to the bridge adapters - * @param opts Additional options for connecting to the custom bridges. - * @param opts.overrides Custom bridge adapters. - * @returns An object containing all bridge adapters - */ -export const getBridgeAdapters = ( - l2ChainId: number, - messenger: CrossChainMessenger, - opts?: { - overrides?: BridgeAdapterData - contracts?: DeepPartial<OEContractsLike> - } -): BridgeAdapters => { - const adapterData: BridgeAdapterData = { - ...(CONTRACT_ADDRESSES[l2ChainId] || opts?.contracts?.l1?.L1StandardBridge - ? { - Standard: { - Adapter: StandardBridgeAdapter, - l1Bridge: - opts?.contracts?.l1?.L1StandardBridge || - CONTRACT_ADDRESSES[l2ChainId].l1.L1StandardBridge, - l2Bridge: predeploys.L2StandardBridge, - }, - ETH: { - Adapter: ETHBridgeAdapter, - l1Bridge: - opts?.contracts?.l1?.L1StandardBridge || - CONTRACT_ADDRESSES[l2ChainId].l1.L1StandardBridge, - l2Bridge: predeploys.L2StandardBridge, - }, - } - : {}), - ...(BRIDGE_ADAPTER_DATA[l2ChainId] || {}), - ...(opts?.overrides || {}), - } - - const adapters: BridgeAdapters = {} - for (const [bridgeName, bridgeData] of Object.entries(adapterData)) { - adapters[bridgeName] = new bridgeData.Adapter({ - messenger, - l1Bridge: bridgeData.l1Bridge, - l2Bridge: bridgeData.l2Bridge, - }) - } - - return adapters -} diff --git a/packages/sdk/src/utils/index.ts b/packages/sdk/src/utils/index.ts deleted file mode 100644 index 0e166b9f6c82..000000000000 --- a/packages/sdk/src/utils/index.ts +++ /dev/null @@ -1,7 +0,0 @@ -export * from './coercion' -export * from './contracts' -export * from './type-utils' -export * from './misc-utils' -export * from './merkle-utils' -export * from './chain-constants' -export * from './message-utils' diff --git a/packages/sdk/src/utils/merkle-utils.ts b/packages/sdk/src/utils/merkle-utils.ts deleted file mode 100644 index 2080ca6306c9..000000000000 --- a/packages/sdk/src/utils/merkle-utils.ts +++ /dev/null @@ -1,121 +0,0 @@ -/* Imports: External */ -import { ethers, BigNumber } from 'ethers' -import { - fromHexString, - toHexString, - toRpcHexString, -} from '@eth-optimism/core-utils' -import { MerkleTree } from 'merkletreejs' -import * as rlp from 'rlp' - -/** - * Generates a Merkle proof (using the particular scheme we use within Lib_MerkleTree). - * - * @param leaves Leaves of the merkle tree. - * @param index Index to generate a proof for. - * @returns Merkle proof sibling leaves, as hex strings. - */ -export const makeMerkleTreeProof = ( - leaves: string[], - index: number -): string[] => { - // Our specific Merkle tree implementation requires that the number of leaves is a power of 2. - // If the number of given leaves is less than a power of 2, we need to round up to the next - // available power of 2. We fill the remaining space with the hash of bytes32(0). - const correctedTreeSize = Math.pow(2, Math.ceil(Math.log2(leaves.length))) - const parsedLeaves = [] - for (let i = 0; i < correctedTreeSize; i++) { - if (i < leaves.length) { - parsedLeaves.push(leaves[i]) - } else { - parsedLeaves.push(ethers.utils.keccak256('0x' + '00'.repeat(32))) - } - } - - // merkletreejs prefers things to be Buffers. - const bufLeaves = parsedLeaves.map(fromHexString) - const tree = new MerkleTree(bufLeaves, (el: Buffer | string): Buffer => { - return fromHexString(ethers.utils.keccak256(el)) - }) - - const proof = tree.getProof(bufLeaves[index], index).map((element: any) => { - return toHexString(element.data) - }) - - return proof -} - -/** - * Fix for the case where the final proof element is less than 32 bytes and the element exists - * inside of a branch node. Current implementation of the onchain MPT contract can't handle this - * natively so we instead append an extra proof element to handle it instead. - * - * @param key Key that the proof is for. - * @param proof Proof to potentially modify. - * @returns Modified proof. - */ -export const maybeAddProofNode = (key: string, proof: string[]) => { - const modifiedProof = [...proof] - const finalProofEl = modifiedProof[modifiedProof.length - 1] - const finalProofElDecoded = rlp.decode(finalProofEl) as any - if (finalProofElDecoded.length === 17) { - for (const item of finalProofElDecoded) { - // Find any nodes located inside of the branch node. - if (Array.isArray(item)) { - // Check if the key inside the node matches the key we're looking for. We remove the first - // two characters (0x) and then we remove one more character (the first nibble) since this - // is the identifier for the type of node we're looking at. In this case we don't actually - // care what type of node it is because a branch node would only ever be the final proof - // element if (1) it includes the leaf node we're looking for or (2) it stores the value - // within itself. If (1) then this logic will work, if (2) then this won't find anything - // and we won't append any proof elements, which is exactly what we would want. - const suffix = toHexString(item[0]).slice(3) - if (key.endsWith(suffix)) { - modifiedProof.push(toHexString(rlp.encode(item))) - } - } - } - } - - // Return the modified proof. - return modifiedProof -} - -/** - * Generates a Merkle-Patricia trie proof for a given account and storage slot. - * - * @param provider RPC provider attached to an EVM-compatible chain. - * @param blockNumber Block number to generate the proof at. - * @param address Address to generate the proof for. - * @param slot Storage slot to generate the proof for. - * @returns Account proof and storage proof. - */ -export const makeStateTrieProof = async ( - provider: ethers.providers.JsonRpcProvider, - blockNumber: number, - address: string, - slot: string -): Promise<{ - accountProof: string[] - storageProof: string[] - storageValue: BigNumber - storageRoot: string -}> => { - const proof = await provider.send('eth_getProof', [ - address, - [slot], - toRpcHexString(blockNumber), - ]) - - proof.storageProof[0].proof = maybeAddProofNode( - ethers.utils.keccak256(slot), - proof.storageProof[0].proof - ) - - return { - accountProof: proof.accountProof, - storageProof: proof.storageProof[0].proof, - storageValue: BigNumber.from(proof.storageProof[0].value), - storageRoot: proof.storageHash, - } -} diff --git a/packages/sdk/src/utils/message-utils.ts b/packages/sdk/src/utils/message-utils.ts deleted file mode 100644 index 6cf16f32637e..000000000000 --- a/packages/sdk/src/utils/message-utils.ts +++ /dev/null @@ -1,92 +0,0 @@ -import { hashWithdrawal } from '@eth-optimism/core-utils' -import { BigNumber, utils, ethers } from 'ethers' - -import { LowLevelMessage } from '../interfaces' - -const { hexDataLength } = utils - -// Constants used by `CrossDomainMessenger.baseGas` -const RELAY_CONSTANT_OVERHEAD = BigNumber.from(200_000) -const RELAY_PER_BYTE_DATA_COST = BigNumber.from(16) -const MIN_GAS_DYNAMIC_OVERHEAD_NUMERATOR = BigNumber.from(64) -const MIN_GAS_DYNAMIC_OVERHEAD_DENOMINATOR = BigNumber.from(63) -const RELAY_CALL_OVERHEAD = BigNumber.from(40_000) -const RELAY_RESERVED_GAS = BigNumber.from(40_000) -const RELAY_GAS_CHECK_BUFFER = BigNumber.from(5_000) - -/** - * Utility for hashing a LowLevelMessage object. - * - * @param message LowLevelMessage object to hash. - * @returns Hash of the given LowLevelMessage. - */ -export const hashLowLevelMessage = (message: LowLevelMessage): string => { - return hashWithdrawal( - message.messageNonce, - message.sender, - message.target, - message.value, - message.minGasLimit, - message.message - ) -} - -/** - * Utility for hashing a message hash. This computes the storage slot - * where the message hash will be stored in state. HashZero is used - * because the first mapping in the contract is used. - * - * @param messageHash Message hash to hash. - * @returns Hash of the given message hash. - */ -export const hashMessageHash = (messageHash: string): string => { - const data = ethers.utils.defaultAbiCoder.encode( - ['bytes32', 'uint256'], - [messageHash, ethers.constants.HashZero] - ) - return ethers.utils.keccak256(data) -} - -/** - * Compute the min gas limit for a migrated withdrawal. - */ -export const migratedWithdrawalGasLimit = ( - data: string, - chainID: number -): BigNumber => { - // Compute the gas limit and cap at 25 million - const dataCost = BigNumber.from(hexDataLength(data)).mul( - RELAY_PER_BYTE_DATA_COST - ) - let overhead: BigNumber - if (chainID === 420) { - overhead = BigNumber.from(200_000) - } else { - // Dynamic overhead (EIP-150) - // We use a constant 1 million gas limit due to the overhead of simulating all migrated withdrawal - // transactions during the migration. This is a conservative estimate, and if a withdrawal - // uses more than the minimum gas limit, it will fail and need to be replayed with a higher - // gas limit. - const dynamicOverhead = MIN_GAS_DYNAMIC_OVERHEAD_NUMERATOR.mul( - 1_000_000 - ).div(MIN_GAS_DYNAMIC_OVERHEAD_DENOMINATOR) - - // Constant overhead - overhead = RELAY_CONSTANT_OVERHEAD.add(dynamicOverhead) - .add(RELAY_CALL_OVERHEAD) - // Gas reserved for the worst-case cost of 3/5 of the `CALL` opcode's dynamic gas - // factors. (Conservative) - // Relay reserved gas (to ensure execution of `relayMessage` completes after the - // subcontext finishes executing) (Conservative) - .add(RELAY_RESERVED_GAS) - // Gas reserved for the execution between the `hasMinGas` check and the `CALL` - // opcode. (Conservative) - .add(RELAY_GAS_CHECK_BUFFER) - } - - let minGasLimit = dataCost.add(overhead) - if (minGasLimit.gt(25_000_000)) { - minGasLimit = BigNumber.from(25_000_000) - } - return minGasLimit -} diff --git a/packages/sdk/src/utils/misc-utils.ts b/packages/sdk/src/utils/misc-utils.ts deleted file mode 100644 index 3c2d9478290b..000000000000 --- a/packages/sdk/src/utils/misc-utils.ts +++ /dev/null @@ -1,20 +0,0 @@ -// TODO: A lot of this stuff could probably live in core-utils instead. -// Review this file eventually for stuff that could go into core-utils. - -/** - * Returns a copy of the given object ({ ...obj }) with the given keys omitted. - * - * @param obj Object to return with the keys omitted. - * @param keys Keys to omit from the returned object. - * @returns A copy of the given object with the given keys omitted. - */ -export const omit = <T extends object, K extends string | number | symbol>( - obj: T, - ...keys: K[] -): Omit<T, K> => { - const copy = { ...obj } - for (const key of keys) { - delete copy[key as string] - } - return copy -} diff --git a/packages/sdk/src/utils/type-utils.ts b/packages/sdk/src/utils/type-utils.ts deleted file mode 100644 index 086d5f7c112a..000000000000 --- a/packages/sdk/src/utils/type-utils.ts +++ /dev/null @@ -1,6 +0,0 @@ -/** - * Utility type for deep partials. - */ -export type DeepPartial<T> = { - [P in keyof T]?: DeepPartial<T[P]> -} diff --git a/packages/sdk/tasks/deposit-erc20.ts b/packages/sdk/tasks/deposit-erc20.ts deleted file mode 100644 index e98f2b2398a5..000000000000 --- a/packages/sdk/tasks/deposit-erc20.ts +++ /dev/null @@ -1,414 +0,0 @@ -import { promises as fs } from 'fs' - -import { task, types } from 'hardhat/config' -import { HardhatRuntimeEnvironment } from 'hardhat/types' -import { SignerWithAddress } from '@nomiclabs/hardhat-ethers/signers' -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 '../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, - CONTRACT_ADDRESSES, - OEContractsLike, - DEFAULT_L2_CONTRACT_ADDRESSES, -} from '../src' - -const deployWETH9 = async ( - hre: HardhatRuntimeEnvironment, - signer: SignerWithAddress, - wrap: boolean -): Promise<Contract> => { - const Factory__WETH9 = new hre.ethers.ContractFactory( - Artifact__WETH9.abi, - Artifact__WETH9.bytecode.object, - signer - ) - - console.log('Sending deployment transaction') - const WETH9 = await Factory__WETH9.deploy() - const receipt = await WETH9.deployTransaction.wait() - console.log(`WETH9 deployed: ${receipt.transactionHash}`) - - if (wrap) { - const deposit = await signer.sendTransaction({ - value: utils.parseEther('1'), - to: WETH9.address, - }) - await deposit.wait() - } - - return WETH9 -} - -const createOptimismMintableERC20 = async ( - hre: HardhatRuntimeEnvironment, - L1ERC20: Contract, - l2Signer: Wallet -): Promise<Contract> => { - const OptimismMintableERC20TokenFactory = new Contract( - predeploys.OptimismMintableERC20Factory, - Artifact__OptimismMintableERC20TokenFactory.abi, - l2Signer - ) - - const name = await L1ERC20.name() - const symbol = await L1ERC20.symbol() - - const tx = - await OptimismMintableERC20TokenFactory.createOptimismMintableERC20( - L1ERC20.address, - `L2 ${name}`, - `L2-${symbol}` - ) - - const receipt = await tx.wait() - const event = receipt.events.find( - (e: Event) => e.event === 'OptimismMintableERC20Created' - ) - - if (!event) { - throw new Error('Unable to find OptimismMintableERC20Created event') - } - - const l2WethAddress = event.args.localToken - console.log(`Deployed to ${l2WethAddress}`) - - return new Contract( - l2WethAddress, - Artifact__OptimismMintableERC20Token.abi, - l2Signer - ) -} - -// TODO(tynes): this task could be modularized in the future -// so that it can deposit an arbitrary token. Right now it -// deploys a WETH9 contract, mints some WETH9 and then -// deposits that into L2 through the StandardBridge. -task('deposit-erc20', 'Deposits WETH9 onto L2.') - .addParam( - 'l2ProviderUrl', - 'L2 provider URL.', - 'http://localhost:9545', - types.string - ) - .addParam( - 'opNodeProviderUrl', - 'op-node provider URL', - 'http://localhost:7545', - types.string - ) - .addOptionalParam( - 'l1ContractsJsonPath', - 'Path to a JSON with L1 contract addresses in it', - '', - types.string - ) - .addOptionalParam('signerIndex', 'Index of signer to use', 0, types.int) - .setAction(async (args, hre) => { - const signers = await hre.ethers.getSigners() - if (signers.length === 0) { - throw new Error('No configured signers') - } - if (args.signerIndex < 0 || signers.length <= args.signerIndex) { - throw new Error('Invalid signer index') - } - const signer = signers[args.signerIndex] - const address = await signer.getAddress() - console.log(`Using signer ${address}`) - - // Ensure that the signer has a balance before trying to - // do anything - const balance = await signer.getBalance() - if (balance.eq(0)) { - throw new Error('Signer has no balance') - } - - const l2Provider = new providers.StaticJsonRpcProvider(args.l2ProviderUrl) - - const l2Signer = new hre.ethers.Wallet( - hre.network.config.accounts[args.signerIndex], - l2Provider - ) - - const l2ChainId = await l2Signer.getChainId() - let contractAddrs = CONTRACT_ADDRESSES[l2ChainId] - if (args.l1ContractsJsonPath) { - const data = await fs.readFile(args.l1ContractsJsonPath) - const json = JSON.parse(data.toString()) - contractAddrs = { - l1: { - AddressManager: json.AddressManager, - L1CrossDomainMessenger: json.L1CrossDomainMessengerProxy, - L1StandardBridge: json.L1StandardBridgeProxy, - StateCommitmentChain: ethers.constants.AddressZero, - CanonicalTransactionChain: ethers.constants.AddressZero, - BondManager: ethers.constants.AddressZero, - OptimismPortal: json.OptimismPortalProxy, - L2OutputOracle: json.L2OutputOracleProxy, - OptimismPortal2: json.OptimismPortalProxy, - DisputeGameFactory: json.DisputeGameFactoryProxy, - }, - l2: DEFAULT_L2_CONTRACT_ADDRESSES, - } as OEContractsLike - } - - console.log(`OptimismPortal: ${contractAddrs.l1.OptimismPortal}`) - const OptimismPortal = new hre.ethers.Contract( - contractAddrs.l1.OptimismPortal, - Artifact__OptimismPortal.abi, - signer - ) - - console.log( - `L1CrossDomainMessenger: ${contractAddrs.l1.L1CrossDomainMessenger}` - ) - const L1CrossDomainMessenger = new hre.ethers.Contract( - contractAddrs.l1.L1CrossDomainMessenger, - Artifact__L1CrossDomainMessenger.abi, - signer - ) - - console.log(`L1StandardBridge: ${contractAddrs.l1.L1StandardBridge}`) - const L1StandardBridge = new hre.ethers.Contract( - contractAddrs.l1.L1StandardBridge, - Artifact__L1StandardBridge.abi, - signer - ) - - const L2OutputOracle = new hre.ethers.Contract( - contractAddrs.l1.L2OutputOracle, - Artifact__L2OutputOracle.abi, - signer - ) - - const L2ToL1MessagePasser = new hre.ethers.Contract( - predeploys.L2ToL1MessagePasser, - Artifact__L2ToL1MessagePasser.abi - ) - - const L2CrossDomainMessenger = new hre.ethers.Contract( - predeploys.L2CrossDomainMessenger, - Artifact__L2CrossDomainMessenger.abi - ) - - const L2StandardBridge = new hre.ethers.Contract( - predeploys.L2StandardBridge, - Artifact__L2StandardBridge.abi - ) - - const messenger = new CrossChainMessenger({ - l1SignerOrProvider: signer, - l2SignerOrProvider: l2Signer, - l1ChainId: await signer.getChainId(), - l2ChainId, - bedrock: true, - contracts: contractAddrs, - }) - - const params = await OptimismPortal.params() - console.log('Intial OptimismPortal.params:') - console.log(params) - - console.log('Deploying WETH9 to L1') - const WETH9 = await deployWETH9(hre, signer, true) - console.log(`Deployed to ${WETH9.address}`) - - console.log('Creating L2 WETH9') - const OptimismMintableERC20 = await createOptimismMintableERC20( - hre, - WETH9, - l2Signer - ) - - console.log(`Approving WETH9 for deposit`) - const approvalTx = await messenger.approveERC20( - WETH9.address, - OptimismMintableERC20.address, - hre.ethers.constants.MaxUint256 - ) - await approvalTx.wait() - console.log('WETH9 approved') - - console.log('Depositing WETH9 to L2') - const depositTx = await messenger.depositERC20( - WETH9.address, - OptimismMintableERC20.address, - utils.parseEther('1') - ) - await depositTx.wait() - console.log(`ERC20 deposited - ${depositTx.hash}`) - - console.log('Checking to make sure deposit was successful') - // Deposit might get reorged, wait and also log for reorgs. - let prevBlockHash: string = '' - for (let i = 0; i < 12; i++) { - const messageReceipt = await signer.provider!.getTransactionReceipt( - depositTx.hash - ) - if (messageReceipt.status !== 1) { - console.log(`Deposit failed, retrying...`) - } - - // Wait for stability, we want some amount of time after any reorg - if (prevBlockHash !== '' && messageReceipt.blockHash !== prevBlockHash) { - console.log( - `Block hash changed from ${prevBlockHash} to ${messageReceipt.blockHash}` - ) - i = 0 - } else if (prevBlockHash !== '') { - console.log(`No reorg detected: ${i}`) - } - - prevBlockHash = messageReceipt.blockHash - await sleep(1000) - } - console.log(`Deposit confirmed`) - - const l2Balance = await OptimismMintableERC20.balanceOf(address) - if (l2Balance.lt(utils.parseEther('1'))) { - throw new Error( - `bad deposit. recipient balance on L2: ${utils.formatEther(l2Balance)}` - ) - } - console.log(`Deposit success`) - - console.log('Starting withdrawal') - const preBalance = await WETH9.balanceOf(signer.address) - const withdraw = await messenger.withdrawERC20( - WETH9.address, - OptimismMintableERC20.address, - utils.parseEther('1') - ) - const withdrawalReceipt = await withdraw.wait() - for (const log of withdrawalReceipt.logs) { - switch (log.address) { - case L2ToL1MessagePasser.address: { - const parsed = L2ToL1MessagePasser.interface.parseLog(log) - console.log(`Log ${parsed.name} from ${log.address}`) - console.log(parsed.args) - console.log() - break - } - case L2StandardBridge.address: { - const parsed = L2StandardBridge.interface.parseLog(log) - console.log(`Log ${parsed.name} from ${log.address}`) - console.log(parsed.args) - console.log() - break - } - case L2CrossDomainMessenger.address: { - const parsed = L2CrossDomainMessenger.interface.parseLog(log) - console.log(`Log ${parsed.name} from ${log.address}`) - console.log(parsed.args) - console.log() - break - } - default: { - console.log(`Unknown log from ${log.address} - ${log.topics[0]}`) - } - } - } - - setInterval(async () => { - const currentStatus = await messenger.getMessageStatus(withdraw) - console.log(`Message status: ${MessageStatus[currentStatus]}`) - const latest = await L2OutputOracle.latestBlockNumber() - console.log( - `Latest L2OutputOracle commitment number: ${latest.toString()}` - ) - const tip = await signer.provider!.getBlockNumber() - console.log(`L1 chain tip: ${tip.toString()}`) - }, 3000) - - const now = Math.floor(Date.now() / 1000) - - console.log('Waiting for message to be able to be proved') - await messenger.waitForMessageStatus(withdraw, MessageStatus.READY_TO_PROVE) - - console.log('Proving withdrawal...') - const prove = await messenger.proveMessage(withdraw) - const proveReceipt = await prove.wait() - console.log(proveReceipt) - if (proveReceipt.status !== 1) { - throw new Error('Prove withdrawal transaction reverted') - } - - console.log('Waiting for message to be able to be relayed') - await messenger.waitForMessageStatus( - withdraw, - MessageStatus.READY_FOR_RELAY - ) - - console.log('Finalizing withdrawal...') - // TODO: Update SDK to properly estimate gas - const finalize = await messenger.finalizeMessage(withdraw, { - overrides: { gasLimit: 500_000 }, - }) - const finalizeReceipt = await finalize.wait() - console.log('finalizeReceipt:', finalizeReceipt) - console.log(`Took ${Math.floor(Date.now() / 1000) - now} seconds`) - - for (const log of finalizeReceipt.logs) { - switch (log.address) { - case OptimismPortal.address: { - const parsed = OptimismPortal.interface.parseLog(log) - console.log(`Log ${parsed.name} from OptimismPortal (${log.address})`) - console.log(parsed.args) - console.log() - break - } - case L1CrossDomainMessenger.address: { - const parsed = L1CrossDomainMessenger.interface.parseLog(log) - console.log( - `Log ${parsed.name} from L1CrossDomainMessenger (${log.address})` - ) - console.log(parsed.args) - console.log() - break - } - case L1StandardBridge.address: { - const parsed = L1StandardBridge.interface.parseLog(log) - console.log( - `Log ${parsed.name} from L1StandardBridge (${log.address})` - ) - console.log(parsed.args) - console.log() - break - } - case WETH9.address: { - const parsed = WETH9.interface.parseLog(log) - console.log(`Log ${parsed.name} from WETH9 (${log.address})`) - console.log(parsed.args) - console.log() - break - } - default: - console.log( - `Unknown log emitted from ${log.address} - ${log.topics[0]}` - ) - } - } - - const postBalance = await WETH9.balanceOf(signer.address) - - const expectedBalance = preBalance.add(utils.parseEther('1')) - if (!expectedBalance.eq(postBalance)) { - throw new Error( - `Balance mismatch, expected: ${expectedBalance}, actual: ${postBalance}` - ) - } - console.log('Withdrawal success') - }) diff --git a/packages/sdk/tasks/deposit-eth.ts b/packages/sdk/tasks/deposit-eth.ts deleted file mode 100644 index 8e145a246a02..000000000000 --- a/packages/sdk/tasks/deposit-eth.ts +++ /dev/null @@ -1,439 +0,0 @@ -import { promises as fs } from 'fs' - -import { task, types } from 'hardhat/config' -import '@nomiclabs/hardhat-ethers' -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 '../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, - CONTRACT_ADDRESSES, - OEContractsLike, - DEFAULT_L2_CONTRACT_ADDRESSES, -} from '../src' - -const { formatEther } = utils - -task('deposit-eth', 'Deposits ether to L2.') - .addParam( - 'l2ProviderUrl', - 'L2 provider URL.', - 'http://localhost:9545', - types.string - ) - .addOptionalParam('to', 'Recipient of the ether', '', types.string) - .addOptionalParam( - 'amount', - 'Amount of ether to send (in ETH)', - '', - types.string - ) - .addOptionalParam( - 'withdraw', - 'Follow up with a withdrawal', - true, - types.boolean - ) - .addOptionalParam( - 'l1ContractsJsonPath', - 'Path to a JSON with L1 contract addresses in it', - '', - types.string - ) - .addOptionalParam('signerIndex', 'Index of signer to use', 0, types.int) - .addOptionalParam('withdrawAmount', 'Amount to withdraw', '', types.string) - .setAction(async (args, hre) => { - const signers = await hre.ethers.getSigners() - if (signers.length === 0) { - throw new Error('No configured signers') - } - if (args.signerIndex < 0 || signers.length <= args.signerIndex) { - throw new Error('Invalid signer index') - } - const signer = signers[args.signerIndex] - const address = await signer.getAddress() - console.log(`Using signer ${address}`) - - // Ensure that the signer has a balance before trying to - // do anything - const balance = await signer.getBalance() - if (balance.eq(0)) { - throw new Error('Signer has no balance') - } - console.log(`Signer balance: ${formatEther(balance.toString())}`) - - const l2Provider = new providers.StaticJsonRpcProvider(args.l2ProviderUrl) - - // send to self if not specified - const to = args.to ? args.to : address - const amount = args.amount - ? utils.parseEther(args.amount) - : utils.parseEther('1') - const withdrawAmount = args.withdrawAmount - ? utils.parseEther(args.withdrawAmount) - : amount.div(2) - - const l2Signer = new hre.ethers.Wallet( - hre.network.config.accounts[args.signerIndex], - l2Provider - ) - - const l2ChainId = await l2Signer.getChainId() - let contractAddrs = CONTRACT_ADDRESSES[l2ChainId] - if (args.l1ContractsJsonPath) { - const data = await fs.readFile(args.l1ContractsJsonPath) - const json = JSON.parse(data.toString()) - contractAddrs = { - l1: { - AddressManager: json.AddressManager, - L1CrossDomainMessenger: json.L1CrossDomainMessengerProxy, - L1StandardBridge: json.L1StandardBridgeProxy, - StateCommitmentChain: ethers.constants.AddressZero, - CanonicalTransactionChain: ethers.constants.AddressZero, - BondManager: ethers.constants.AddressZero, - OptimismPortal: json.OptimismPortalProxy, - L2OutputOracle: json.L2OutputOracleProxy, - OptimismPortal2: json.OptimismPortalProxy, - DisputeGameFactory: json.DisputeGameFactoryProxy, - }, - l2: DEFAULT_L2_CONTRACT_ADDRESSES, - } as OEContractsLike - } else if (!contractAddrs) { - // If the contract addresses have not been hardcoded, - // attempt to read them from deployment artifacts - let Deployment__AddressManager: Deployment - try { - Deployment__AddressManager = await hre.deployments.get('AddressManager') - } catch (e) { - Deployment__AddressManager = await hre.deployments.get( - 'Lib_AddressManager' - ) - } - let Deployment__L1CrossDomainMessenger: Deployment - try { - Deployment__L1CrossDomainMessenger = await hre.deployments.get( - 'L1CrossDomainMessengerProxy' - ) - } catch (e) { - Deployment__L1CrossDomainMessenger = await hre.deployments.get( - 'Proxy__OVM_L1CrossDomainMessenger' - ) - } - let Deployment__L1StandardBridge: Deployment - try { - Deployment__L1StandardBridge = await hre.deployments.get( - 'L1StandardBridgeProxy' - ) - } catch (e) { - Deployment__L1StandardBridge = await hre.deployments.get( - 'Proxy__OVM_L1StandardBridge' - ) - } - - const Deployment__OptimismPortal = await hre.deployments.get( - 'OptimismPortalProxy' - ) - const Deployment__L2OutputOracle = await hre.deployments.get( - 'L2OutputOracleProxy' - ) - contractAddrs = { - l1: { - AddressManager: Deployment__AddressManager.address, - L1CrossDomainMessenger: Deployment__L1CrossDomainMessenger.address, - L1StandardBridge: Deployment__L1StandardBridge.address, - StateCommitmentChain: ethers.constants.AddressZero, - CanonicalTransactionChain: ethers.constants.AddressZero, - BondManager: ethers.constants.AddressZero, - OptimismPortal: Deployment__OptimismPortal.address, - L2OutputOracle: Deployment__L2OutputOracle.address, - }, - l2: DEFAULT_L2_CONTRACT_ADDRESSES, - } - } - - console.log(`OptimismPortal: ${contractAddrs.l1.OptimismPortal}`) - const OptimismPortal = new hre.ethers.Contract( - contractAddrs.l1.OptimismPortal, - Artifact__OptimismPortal.abi, - signer - ) - - console.log( - `L1CrossDomainMessenger: ${contractAddrs.l1.L1CrossDomainMessenger}` - ) - const L1CrossDomainMessenger = new hre.ethers.Contract( - contractAddrs.l1.L1CrossDomainMessenger, - Artifact__L1CrossDomainMessenger.abi, - signer - ) - - console.log(`L1StandardBridge: ${contractAddrs.l1.L1StandardBridge}`) - const L1StandardBridge = new hre.ethers.Contract( - contractAddrs.l1.L1StandardBridge, - Artifact__L1StandardBridge.abi, - signer - ) - - console.log(`L2OutputOracle: ${contractAddrs.l1.L2OutputOracle}`) - const L2OutputOracle = new hre.ethers.Contract( - contractAddrs.l1.L2OutputOracle, - Artifact__L2OutputOracle.abi, - signer - ) - - const L2ToL1MessagePasser = new hre.ethers.Contract( - predeploys.L2ToL1MessagePasser, - Artifact__L2ToL1MessagePasser.abi - ) - - const L2CrossDomainMessenger = new hre.ethers.Contract( - predeploys.L2CrossDomainMessenger, - Artifact__L2CrossDomainMessenger.abi - ) - - const L2StandardBridge = new hre.ethers.Contract( - predeploys.L2StandardBridge, - Artifact__L2StandardBridge.abi - ) - - const messenger = new CrossChainMessenger({ - l1SignerOrProvider: signer, - l2SignerOrProvider: l2Signer, - l1ChainId: await signer.getChainId(), - l2ChainId, - bedrock: true, - contracts: contractAddrs, - }) - - const opBalanceBefore = await signer!.provider!.getBalance( - OptimismPortal.address - ) - - const l1BridgeBalanceBefore = await signer!.provider!.getBalance( - L1StandardBridge.address - ) - - // Deposit ETH - console.log('Depositing ETH through StandardBridge') - console.log(`Sending ${formatEther(amount)} ether`) - const ethDeposit = await messenger.depositETH(amount, { recipient: to }) - console.log(`Transaction hash: ${ethDeposit.hash}`) - const depositMessageReceipt = await messenger.waitForMessageReceipt( - ethDeposit - ) - if (depositMessageReceipt.receiptStatus !== 1) { - throw new Error('deposit failed') - } - console.log( - `Deposit complete - included in block ${depositMessageReceipt.transactionReceipt.blockNumber}` - ) - - const opBalanceAfter = await signer!.provider!.getBalance( - OptimismPortal.address - ) - - const l1BridgeBalanceAfter = await signer!.provider!.getBalance( - L1StandardBridge.address - ) - - console.log( - `L1StandardBridge balance before: ${formatEther(l1BridgeBalanceBefore)}` - ) - - console.log( - `L1StandardBridge balance after: ${formatEther(l1BridgeBalanceAfter)}` - ) - - console.log( - `OptimismPortal balance before: ${formatEther(opBalanceBefore)}` - ) - console.log(`OptimismPortal balance after: ${formatEther(opBalanceAfter)}`) - - if (!opBalanceBefore.add(amount).eq(opBalanceAfter)) { - throw new Error(`OptimismPortal balance mismatch`) - } - - const l2Balance = await l2Provider.getBalance(to) - console.log( - `L2 balance of deposit recipient: ${utils.formatEther( - l2Balance.toString() - )}` - ) - - if (!args.withdraw) { - return - } - - console.log('Withdrawing ETH') - const ethWithdraw = await messenger.withdrawETH(withdrawAmount) - console.log(`Transaction hash: ${ethWithdraw.hash}`) - const ethWithdrawReceipt = await ethWithdraw.wait() - console.log( - `ETH withdrawn on L2 - included in block ${ethWithdrawReceipt.blockNumber}` - ) - - { - // check the logs - for (const log of ethWithdrawReceipt.logs) { - switch (log.address) { - case L2ToL1MessagePasser.address: { - const parsed = L2ToL1MessagePasser.interface.parseLog(log) - console.log(parsed.name) - console.log(parsed.args) - console.log() - break - } - case L2StandardBridge.address: { - const parsed = L2StandardBridge.interface.parseLog(log) - console.log(parsed.name) - console.log(parsed.args) - console.log() - break - } - case L2CrossDomainMessenger.address: { - const parsed = L2CrossDomainMessenger.interface.parseLog(log) - console.log(parsed.name) - console.log(parsed.args) - console.log() - break - } - default: { - console.log(`Unknown log from ${log.address} - ${log.topics[0]}`) - } - } - } - } - - console.log('Waiting to be able to prove withdrawal') - - const proveInterval = setInterval(async () => { - const currentStatus = await messenger.getMessageStatus(ethWithdrawReceipt) - console.log(`Message status: ${MessageStatus[currentStatus]}`) - const latest = await L2OutputOracle.latestBlockNumber() - console.log( - `Latest L2OutputOracle commitment number: ${latest.toString()}` - ) - const tip = await signer.provider!.getBlockNumber() - console.log(`L1 chain tip: ${tip.toString()}`) - }, 3000) - - try { - await messenger.waitForMessageStatus( - ethWithdrawReceipt, - MessageStatus.READY_TO_PROVE - ) - } finally { - clearInterval(proveInterval) - } - - console.log('Proving eth withdrawal...') - const ethProve = await messenger.proveMessage(ethWithdrawReceipt) - console.log(`Transaction hash: ${ethProve.hash}`) - const ethProveReceipt = await ethProve.wait() - if (ethProveReceipt.status !== 1) { - throw new Error('Prove withdrawal transaction reverted') - } - console.log('Successfully proved withdrawal') - - console.log('Waiting to be able to finalize withdrawal') - - const finalizeInterval = setInterval(async () => { - const currentStatus = await messenger.getMessageStatus(ethWithdrawReceipt) - console.log(`Message status: ${MessageStatus[currentStatus]}`) - }, 3000) - - try { - await messenger.waitForMessageStatus( - ethWithdrawReceipt, - MessageStatus.READY_FOR_RELAY - ) - } finally { - clearInterval(finalizeInterval) - } - - console.log('Finalizing eth withdrawal...') - const ethFinalize = await messenger.finalizeMessage(ethWithdrawReceipt) - console.log(`Transaction hash: ${ethFinalize.hash}`) - const ethFinalizeReceipt = await ethFinalize.wait() - if (ethFinalizeReceipt.status !== 1) { - throw new Error('Finalize withdrawal reverted') - } - - console.log( - `ETH withdrawal complete - included in block ${ethFinalizeReceipt.blockNumber}` - ) - { - // Check that the logs are correct - for (const log of ethFinalizeReceipt.logs) { - switch (log.address) { - case L1StandardBridge.address: { - const parsed = L1StandardBridge.interface.parseLog(log) - console.log(parsed.name) - console.log(parsed.args) - console.log() - if ( - parsed.name !== 'ETHBridgeFinalized' && - parsed.name !== 'ETHWithdrawalFinalized' - ) { - throw new Error('Wrong event name from L1StandardBridge') - } - if (!parsed.args.amount.eq(withdrawAmount)) { - throw new Error('Wrong amount in event') - } - if (parsed.args.from !== address) { - throw new Error('Wrong to in event') - } - if (parsed.args.to !== address) { - throw new Error('Wrong from in event') - } - break - } - case L1CrossDomainMessenger.address: { - const parsed = L1CrossDomainMessenger.interface.parseLog(log) - console.log(parsed.name) - console.log(parsed.args) - console.log() - if (parsed.name !== 'RelayedMessage') { - throw new Error('Wrong event from L1CrossDomainMessenger') - } - break - } - case OptimismPortal.address: { - const parsed = OptimismPortal.interface.parseLog(log) - console.log(parsed.name) - console.log(parsed.args) - console.log() - // TODO: remove this if check - if (parsed.name === 'WithdrawalFinalized') { - if (parsed.args.success !== true) { - throw new Error('Unsuccessful withdrawal call') - } - } - break - } - default: { - console.log(`Unknown log from ${log.address} - ${log.topics[0]}`) - } - } - } - } - - const opBalanceFinally = await signer!.provider!.getBalance( - OptimismPortal.address - ) - - if (!opBalanceFinally.add(withdrawAmount).eq(opBalanceAfter)) { - throw new Error('OptimismPortal balance mismatch') - } - console.log('Withdraw success') - }) diff --git a/packages/sdk/tasks/finalize-withdrawal.ts b/packages/sdk/tasks/finalize-withdrawal.ts deleted file mode 100644 index 7c44a610b320..000000000000 --- a/packages/sdk/tasks/finalize-withdrawal.ts +++ /dev/null @@ -1,130 +0,0 @@ -import { task, types } from 'hardhat/config' -import { HardhatRuntimeEnvironment } from 'hardhat/types' -import { Wallet, providers } from 'ethers' -import { predeploys } from '@eth-optimism/core-utils' -import 'hardhat-deploy' -import '@nomiclabs/hardhat-ethers' - -import { - CrossChainMessenger, - StandardBridgeAdapter, - MessageStatus, -} from '../src' - -task('finalize-withdrawal', 'Finalize a withdrawal') - .addParam( - 'transactionHash', - 'L2 Transaction hash to finalize', - '', - types.string - ) - .addParam('l2Url', 'L2 HTTP URL', 'http://localhost:9545', types.string) - .setAction(async (args, hre: HardhatRuntimeEnvironment) => { - const txHash = args.transactionHash - if (txHash === '') { - console.log('No tx hash') - } - - const signers = await hre.ethers.getSigners() - if (signers.length === 0) { - throw new Error('No configured signers') - } - const signer = signers[0] - const address = await signer.getAddress() - console.log(`Using signer: ${address}`) - - const l2Provider = new providers.StaticJsonRpcProvider(args.l2Url) - const l2Signer = new Wallet(hre.network.config.accounts[0], l2Provider) - - let Deployment__L1StandardBridgeProxy = await hre.deployments.getOrNull( - 'L1StandardBridgeProxy' - ) - if (Deployment__L1StandardBridgeProxy === undefined) { - Deployment__L1StandardBridgeProxy = await hre.deployments.getOrNull( - 'Proxy__OVM_L1StandardBridge' - ) - } - - let Deployment__L1CrossDomainMessengerProxy = - await hre.deployments.getOrNull('L1CrossDomainMessengerProxy') - if (Deployment__L1CrossDomainMessengerProxy === undefined) { - Deployment__L1CrossDomainMessengerProxy = await hre.deployments.getOrNull( - 'Proxy__OVM_L1CrossDomainMessenger' - ) - } - - const Deployment__L2OutputOracleProxy = await hre.deployments.getOrNull( - 'L2OutputOracleProxy' - ) - const Deployment__OptimismPortalProxy = await hre.deployments.getOrNull( - 'OptimismPortalProxy' - ) - - if (Deployment__L1StandardBridgeProxy?.address === undefined) { - throw new Error('No L1StandardBridgeProxy deployment') - } - - if (Deployment__L1CrossDomainMessengerProxy?.address === undefined) { - throw new Error('No L1CrossDomainMessengerProxy deployment') - } - - if (Deployment__L2OutputOracleProxy?.address === undefined) { - throw new Error('No L2OutputOracleProxy deployment') - } - - if (Deployment__OptimismPortalProxy?.address === undefined) { - throw new Error('No OptimismPortalProxy deployment') - } - - const messenger = new CrossChainMessenger({ - l1SignerOrProvider: signer, - l2SignerOrProvider: l2Signer, - l1ChainId: await signer.getChainId(), - l2ChainId: await l2Signer.getChainId(), - bridges: { - Standard: { - Adapter: StandardBridgeAdapter, - l1Bridge: Deployment__L1StandardBridgeProxy?.address, - l2Bridge: predeploys.L2StandardBridge, - }, - }, - contracts: { - l1: { - L1StandardBridge: Deployment__L1StandardBridgeProxy?.address, - L1CrossDomainMessenger: - Deployment__L1CrossDomainMessengerProxy?.address, - L2OutputOracle: Deployment__L2OutputOracleProxy?.address, - OptimismPortal: Deployment__OptimismPortalProxy?.address, - }, - }, - }) - - console.log(`Fetching message status for ${txHash}`) - const status = await messenger.getMessageStatus(txHash) - console.log(`Status: ${MessageStatus[status]}`) - - if (status === MessageStatus.READY_TO_PROVE) { - const proveTx = await messenger.proveMessage(txHash) - const proveReceipt = await proveTx.wait() - console.log('Prove receipt', proveReceipt) - - const finalizeInterval = setInterval(async () => { - const currentStatus = await messenger.getMessageStatus(txHash) - console.log(`Message status: ${MessageStatus[currentStatus]}`) - }, 3000) - - try { - await messenger.waitForMessageStatus( - txHash, - MessageStatus.READY_FOR_RELAY - ) - } finally { - clearInterval(finalizeInterval) - } - - const tx = await messenger.finalizeMessage(txHash) - const receipt = await tx.wait() - console.log(receipt) - console.log('Finalized withdrawal') - } - }) diff --git a/packages/sdk/tasks/index.ts b/packages/sdk/tasks/index.ts deleted file mode 100644 index 270e886b314c..000000000000 --- a/packages/sdk/tasks/index.ts +++ /dev/null @@ -1,3 +0,0 @@ -import './deposit-eth' -import './deposit-erc20' -import './finalize-withdrawal' diff --git a/packages/sdk/test-next/README.md b/packages/sdk/test-next/README.md deleted file mode 100644 index a46dbfa069a9..000000000000 --- a/packages/sdk/test-next/README.md +++ /dev/null @@ -1,5 +0,0 @@ -# test-next - -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 deleted file mode 100644 index cebb5bc86bcf..000000000000 --- a/packages/sdk/test-next/bridgeEcoToken.spec.ts +++ /dev/null @@ -1,125 +0,0 @@ -import ethers from 'ethers' -import { describe, expect, it } from 'vitest' -import { Address, PublicClient, parseEther } from 'viem' - -import { - l1TestClient, - l2TestClient, - l1PublicClient, - l2PublicClient, -} from './testUtils/viemClients' -import { BRIDGE_ADAPTER_DATA, CrossChainMessenger, L2ChainID } from '../src' -import { l1Provider, l2Provider } from './testUtils/ethersProviders' - -const ECO_WHALE: Address = '0x982E148216E3Aa6B38f9D901eF578B5c06DD7502' - -// we should instead use tokenlist as source of truth -const ECO_L1_TOKEN_ADDRESS: Address = - '0x3E87d4d9E69163E7590f9b39a70853cf25e5ABE3' -const ECO_L2_TOKEN_ADDRESS: Address = - '0xD2f598c826429EEe7c071C02735549aCd88F2c09' - -const getERC20TokenBalance = async ( - publicClient: PublicClient, - tokenAddress: Address, - ownerAddress: Address -) => { - const result = await publicClient.readContract({ - address: tokenAddress, - abi: [ - { - inputs: [{ name: 'owner', type: 'address' }], - name: 'balanceOf', - outputs: [{ name: '', type: 'uint256' }], - stateMutability: 'view', - type: 'function', - }, - ], - functionName: 'balanceOf', - args: [ownerAddress], - }) - - return result as bigint -} - -const getL1ERC20TokenBalance = async (ownerAddress: Address) => { - return getERC20TokenBalance( - l1PublicClient, - ECO_L1_TOKEN_ADDRESS, - ownerAddress - ) -} - -const getL2ERC20TokenBalance = async (ownerAddress: Address) => { - return getERC20TokenBalance( - l2PublicClient, - ECO_L2_TOKEN_ADDRESS, - ownerAddress - ) -} - -describe.skip('ECO token', () => { - it('sdk should be able to deposit to l1 bridge contract correctly', async () => { - await l1TestClient.impersonateAccount({ address: ECO_WHALE }) - - const l1EcoWhaleSigner = await l1Provider.getSigner(ECO_WHALE) - const preBridgeL1EcoWhaleBalance = await getL1ERC20TokenBalance(ECO_WHALE) - - const crossChainMessenger = new CrossChainMessenger({ - l1SignerOrProvider: l1EcoWhaleSigner, - l2SignerOrProvider: l2Provider, - l1ChainId: 5, - l2ChainId: 420, - bedrock: true, - bridges: BRIDGE_ADAPTER_DATA[L2ChainID.OPTIMISM_GOERLI], - }) - - await crossChainMessenger.approveERC20( - ECO_L1_TOKEN_ADDRESS, - ECO_L2_TOKEN_ADDRESS, - ethers.utils.parseEther('0.1') - ) - - const txResponse = await crossChainMessenger.depositERC20( - ECO_L1_TOKEN_ADDRESS, - ECO_L2_TOKEN_ADDRESS, - ethers.utils.parseEther('0.1') - ) - - await txResponse.wait() - - const l1EcoWhaleBalance = await getL1ERC20TokenBalance(ECO_WHALE) - expect(l1EcoWhaleBalance).toEqual( - preBridgeL1EcoWhaleBalance - parseEther('0.1') - ) - }, 20_000) - - it('sdk should be able to withdraw into the l2 bridge contract correctly', async () => { - await l2TestClient.impersonateAccount({ address: ECO_WHALE }) - const l2EcoWhaleSigner = await l2Provider.getSigner(ECO_WHALE) - - const preBridgeL2EcoWhaleBalance = await getL2ERC20TokenBalance(ECO_WHALE) - - const crossChainMessenger = new CrossChainMessenger({ - l1SignerOrProvider: l1Provider, - l2SignerOrProvider: l2EcoWhaleSigner, - l1ChainId: 5, - l2ChainId: 420, - bedrock: true, - bridges: BRIDGE_ADAPTER_DATA[L2ChainID.OPTIMISM_GOERLI], - }) - - const txResponse = await crossChainMessenger.withdrawERC20( - ECO_L1_TOKEN_ADDRESS, - ECO_L2_TOKEN_ADDRESS, - ethers.utils.parseEther('0.1') - ) - - await txResponse.wait() - - const l2EcoWhaleBalance = await getL2ERC20TokenBalance(ECO_WHALE) - expect(l2EcoWhaleBalance).toEqual( - preBridgeL2EcoWhaleBalance - parseEther('0.1') - ) - }, 20_000) -}) diff --git a/packages/sdk/test-next/failedMessages.spec.ts b/packages/sdk/test-next/failedMessages.spec.ts deleted file mode 100644 index ac2ea9554a68..000000000000 --- a/packages/sdk/test-next/failedMessages.spec.ts +++ /dev/null @@ -1,95 +0,0 @@ -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 deleted file mode 100644 index c66eecc9e353..000000000000 --- a/packages/sdk/test-next/messageStatus.spec.ts +++ /dev/null @@ -1,50 +0,0 @@ -import { describe, expect, it } from 'vitest' - -import { CrossChainMessenger, MessageStatus } from '../src' -import { l1Provider, l2Provider } from './testUtils/ethersProviders' - -const crossChainMessenger = new CrossChainMessenger({ - l1SignerOrProvider: l1Provider, - l2SignerOrProvider: l2Provider, - l1ChainId: 5, - l2ChainId: 420, - bedrock: true, -}) - -describe.skip('getMessageStatus', () => { - it(`should be able to correctly find a finalized withdrawal`, async () => { - /** - * Tx hash of a withdrawal - * - * @see https://goerli-optimism.etherscan.io/tx/0x8fb235a61079f3fa87da66e78c9da075281bc4ba5f1af4b95197dd9480e03bb5 - */ - const txWithdrawalHash = - '0x8fb235a61079f3fa87da66e78c9da075281bc4ba5f1af4b95197dd9480e03bb5' - - const txReceipt = await l2Provider.getTransactionReceipt(txWithdrawalHash) - - expect(txReceipt).toBeDefined() - - expect( - await crossChainMessenger.getMessageStatus( - txWithdrawalHash, - 0, - 9370789 - 1000, - 9370789 - ) - ).toBe(MessageStatus.RELAYED) - }, 20_000) - - it(`should return READY_FOR_RELAY if not in block range`, async () => { - const txWithdrawalHash = - '0x8fb235a61079f3fa87da66e78c9da075281bc4ba5f1af4b95197dd9480e03bb5' - - const txReceipt = await l2Provider.getTransactionReceipt(txWithdrawalHash) - - expect(txReceipt).toBeDefined() - - expect( - await crossChainMessenger.getMessageStatus(txWithdrawalHash, 0, 0, 0) - ).toBe(MessageStatus.READY_FOR_RELAY) - }, 20_000) -}) diff --git a/packages/sdk/test-next/proveMessage.spec.ts b/packages/sdk/test-next/proveMessage.spec.ts deleted file mode 100644 index b3a7da4cfda4..000000000000 --- a/packages/sdk/test-next/proveMessage.spec.ts +++ /dev/null @@ -1,88 +0,0 @@ -import ethers from 'ethers' -import { describe, expect, it } from 'vitest' -import { z } from 'zod' - -import { CrossChainMessenger } from '../src' -import { l1Provider, l2Provider } from './testUtils/ethersProviders' - -/** - * This test repros the bug where legacy withdrawals are not provable - */ -/******* -Cast results from runnning cast tx and cast receipt on the l2 tx hash - -cast tx 0xd66fda632b51a8b25a9d260d70da8be57b9930c4616370861526335c3e8eef81 --rpc-url https://goerli.optimism.io - -blockHash 0x67956cee3de38d49206d34b77f560c4c371d77b36584047ade8bf7b67bf210c0 -blockNumber 2337599 -from 0x1d86C2F5cc7fBEc35FEDbd3293b5004A841EA3F0 -gas 118190 -gasPrice 1 -hash 0xd66fda632b51a8b25a9d260d70da8be57b9930c4616370861526335c3e8eef81 -input 0x32b7006d000000000000000000000000deaddeaddeaddeaddeaddeaddeaddeaddead000000000000000000000000000000000000000000000000000000005af3107a4000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000 -nonce 10 -r 0x7e58c5dbb37f57303d936562d89a75a20be2a45f54c5d44dc73119453adf2e08 -s 0x1bc952bd048dd38668a0c3b4bac202945c5a150465b551dd2a768e54a746e2c4 -to 0x4200000000000000000000000000000000000010 -transactionIndex 0 -v 875 -value 0 -index 2337598 -l1BlockNumber 7850866 -l1Timestamp 1666982083 -queueOrigin sequencer -rawTransaction 0xf901070a018301cdae94420000000000000000000000000000000000001080b8a432b7006d000000000000000000000000deaddeaddeaddeaddeaddeaddeaddeaddead000000000000000000000000000000000000000000000000000000005af3107a400000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000080000000000000000000000000000000000000000000000000000000000000000082036ba07e58c5dbb37f57303d936562d89a75a20be2a45f54c5d44dc73119453adf2e08a01bc952bd048dd38668a0c3b4bac202945c5a150465b551dd2a768e54a746e2c4 - -cast tx 0xd66fda632b51a8b25a9d260d70da8be57b9930c4616370861526335c3e8eef81 --rpc-url https://goerli.optimism.io - -blockHash 0x67956cee3de38d49206d34b77f560c4c371d77b36584047ade8bf7b67bf210c0 -blockNumber 2337599 -contractAddress -cumulativeGasUsed 115390 -effectiveGasPrice -gasUsed 115390 -logs [{"address":"0xdeaddeaddeaddeaddeaddeaddeaddeaddead0000","topics":["0xddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef","0x0000000000000000000000001d86c2f5cc7fbec35fedbd3293b5004a841ea3f0","0x0000000000000000000000000000000000000000000000000000000000000000"],"data":"0x00000000000000000000000000000000000000000000000000005af3107a4000","blockHash":"0x67956cee3de38d49206d34b77f560c4c371d77b36584047ade8bf7b67bf210c0","blockNumber":"0x23ab3f","transactionHash":"0xd66fda632b51a8b25a9d260d70da8be57b9930c4616370861526335c3e8eef81","transactionIndex":"0x0","logIndex":"0x0","removed":false},{"address":"0xdeaddeaddeaddeaddeaddeaddeaddeaddead0000","topics":["0xcc16f5dbb4873280815c1ee09dbd06736cffcc184412cf7a71a0fdb75d397ca5","0x0000000000000000000000001d86c2f5cc7fbec35fedbd3293b5004a841ea3f0"],"data":"0x00000000000000000000000000000000000000000000000000005af3107a4000","blockHash":"0x67956cee3de38d49206d34b77f560c4c371d77b36584047ade8bf7b67bf210c0","blockNumber":"0x23ab3f","transactionHash":"0xd66fda632b51a8b25a9d260d70da8be57b9930c4616370861526335c3e8eef81","transactionIndex":"0x0","logIndex":"0x1","removed":false},{"address":"0x4200000000000000000000000000000000000007","topics":["0xcb0f7ffd78f9aee47a248fae8db181db6eee833039123e026dcbff529522e52a","0x000000000000000000000000636af16bf2f682dd3109e60102b8e1a089fedaa8"],"data":"0x00000000000000000000000042000000000000000000000000000000000000100000000000000000000000000000000000000000000000000000000000000080000000000000000000000000000000000000000000000000000000000001a048000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000a41532ec340000000000000000000000001d86c2f5cc7fbec35fedbd3293b5004a841ea3f00000000000000000000000001d86c2f5cc7fbec35fedbd3293b5004a841ea3f000000000000000000000000000000000000000000000000000005af3107a40000000000000000000000000000000000000000000000000000000000000000080000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000","blockHash":"0x67956cee3de38d49206d34b77f560c4c371d77b36584047ade8bf7b67bf210c0","blockNumber":"0x23ab3f","transactionHash":"0xd66fda632b51a8b25a9d260d70da8be57b9930c4616370861526335c3e8eef81","transactionIndex":"0x0","logIndex":"0x2","removed":false},{"address":"0x4200000000000000000000000000000000000010","topics":["0x73d170910aba9e6d50b102db522b1dbcd796216f5128b445aa2135272886497e","0x0000000000000000000000000000000000000000000000000000000000000000","0x000000000000000000000000deaddeaddeaddeaddeaddeaddeaddeaddead0000","0x0000000000000000000000001d86c2f5cc7fbec35fedbd3293b5004a841ea3f0"],"data":"0x0000000000000000000000001d86c2f5cc7fbec35fedbd3293b5004a841ea3f000000000000000000000000000000000000000000000000000005af3107a400000000000000000000000000000000000000000000000000000000000000000600000000000000000000000000000000000000000000000000000000000000000","blockHash":"0x67956cee3de38d49206d34b77f560c4c371d77b36584047ade8bf7b67bf210c0","blockNumber":"0x23ab3f","transactionHash":"0xd66fda632b51a8b25a9d260d70da8be57b9930c4616370861526335c3e8eef81","transactionIndex":"0x0","logIndex":"0x3","removed":false}] -logsBloom 0x00000000000000000010000000000000000000000000001000100000001000000000000000000080000000000000008000000800000000000000000000000240000000002000400040000008000000000000000000000000000000000000000100000000020000000000000000000800080000000040000000000010000000000000000000000000000000000000000000800000000000000020000000200000000000000000000001000000000000000000200000000000000000000000000000000002000000200000000400000000000002100000000000000000000020001000000000000000000000000000000000000000000000000000010000008000 -root -status 1 -transactionHash 0xd66fda632b51a8b25a9d260d70da8be57b9930c4616370861526335c3e8eef81 -transactionIndex 0 -type - */ - -const E2E_PRIVATE_KEY = z - .string() - .describe('Private key') - .parse(import.meta.env.VITE_E2E_PRIVATE_KEY) - -const l1Wallet = new ethers.Wallet(E2E_PRIVATE_KEY, l1Provider) -const crossChainMessenger = new CrossChainMessenger({ - l1SignerOrProvider: l1Wallet, - l2SignerOrProvider: l2Provider, - l1ChainId: 5, - l2ChainId: 420, - bedrock: true, -}) - -describe.skip('prove message', () => { - it(`should prove a legacy tx - `, async () => { - /** - * Tx hash of legacy withdrawal - * - * @see https://goerli-optimism.etherscan.io/tx/0xd66fda632b51a8b25a9d260d70da8be57b9930c4616370861526335c3e8eef81 - */ - const txWithdrawalHash = - '0xd66fda632b51a8b25a9d260d70da8be57b9930c4616370861526335c3e8eef81' - - const txReceipt = await l2Provider.getTransactionReceipt(txWithdrawalHash) - - expect(txReceipt).toBeDefined() - - const tx = await crossChainMessenger.proveMessage(txWithdrawalHash) - const receipt = await tx.wait() - - // A 1 means the transaction was successful - expect(receipt.status).toBe(1) - }, 20_000) -}) diff --git a/packages/sdk/test-next/testUtils/ethersProviders.ts b/packages/sdk/test-next/testUtils/ethersProviders.ts deleted file mode 100644 index 7098afe0015c..000000000000 --- a/packages/sdk/test-next/testUtils/ethersProviders.ts +++ /dev/null @@ -1,58 +0,0 @@ -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() - .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' } -/** - * @deprecated - */ -export const l1Provider = new ethers.providers.JsonRpcProvider({ - url: E2E_RPC_URL_L1, - headers: jsonRpcHeaders, -}) -/** - * @deprecated - */ -export const l2Provider = new ethers.providers.JsonRpcProvider({ - url: E2E_RPC_URL_L2, - headers: jsonRpcHeaders, -}) - -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 deleted file mode 100644 index a33f4c6721d0..000000000000 --- a/packages/sdk/test-next/testUtils/viemClients.ts +++ /dev/null @@ -1,111 +0,0 @@ -import { - createTestClient, - createPublicClient, - createWalletClient, - http, -} from 'viem' -import { goerli, optimismGoerli, optimismSepolia, sepolia } from 'viem/chains' - -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' - -/** - * @deprecated - */ -export const l1TestClient = createTestClient({ - mode: 'anvil', - chain: L1_CHAIN, - transport: http(L1_RPC_URL), -}) - -/** - * @deprecated - */ -export const l2TestClient = createTestClient({ - mode: 'anvil', - chain: L2_CHAIN, - transport: http(L2_RPC_URL), -}) - -/** - * @deprecated - */ -export const l1PublicClient = createPublicClient({ - chain: L1_CHAIN, - transport: http(L1_RPC_URL), -}) - -/** - * @deprecated - */ -export const l2PublicClient = createPublicClient({ - chain: L2_CHAIN, - transport: http(L2_RPC_URL), -}) - -/** - * @deprecated - */ -export const l1WalletClient = createWalletClient({ - chain: L1_CHAIN, - transport: http(L1_RPC_URL), -}) - -/** - * @deprecated - */ -export const l2WalletClient = createWalletClient({ - chain: L2_CHAIN, - transport: http(L2_RPC_URL), -}) - -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/test/contracts/AbsolutelyNothing.sol b/packages/sdk/test/contracts/AbsolutelyNothing.sol deleted file mode 100644 index 0c0447951d7e..000000000000 --- a/packages/sdk/test/contracts/AbsolutelyNothing.sol +++ /dev/null @@ -1,7 +0,0 @@ -pragma solidity ^0.8.9; - -contract AbsolutelyNothing { - function doAbsolutelyNothing() public { - return; - } -} diff --git a/packages/sdk/test/contracts/ICrossDomainMessenger.sol b/packages/sdk/test/contracts/ICrossDomainMessenger.sol deleted file mode 100644 index ead9da44cf3f..000000000000 --- a/packages/sdk/test/contracts/ICrossDomainMessenger.sol +++ /dev/null @@ -1,45 +0,0 @@ -pragma solidity ^0.8.9; - -// Right now this is copy/pasted from the contracts package. We need to do this because we don't -// currently copy the contracts into the root of the contracts package in the correct way until -// we bundle the contracts package for publication. As a result, we can't properly use the -// package the way we want to from inside the monorepo (yet). Needs to be fixed as part of a -// separate pull request. - -interface ICrossDomainMessenger { - /********** - * Events * - **********/ - - event SentMessage( - address indexed target, - address sender, - bytes message, - uint256 messageNonce, - uint256 gasLimit - ); - event RelayedMessage(bytes32 indexed msgHash); - event FailedRelayedMessage(bytes32 indexed msgHash); - - /************* - * Variables * - *************/ - - function xDomainMessageSender() external view returns (address); - - /******************** - * Public Functions * - ********************/ - - /** - * Sends a cross domain message to the target messenger. - * @param _target Target contract address. - * @param _message Message to send to the target. - * @param _gasLimit Gas limit for the provided message. - */ - function sendMessage( - address _target, - bytes calldata _message, - uint32 _gasLimit - ) external; -} diff --git a/packages/sdk/test/contracts/MessageEncodingHelper.sol b/packages/sdk/test/contracts/MessageEncodingHelper.sol deleted file mode 100644 index b411b3013490..000000000000 --- a/packages/sdk/test/contracts/MessageEncodingHelper.sol +++ /dev/null @@ -1,42 +0,0 @@ -pragma solidity ^0.8.9; - -contract MessageEncodingHelper { - // This function is copy/pasted from the Lib_CrossDomainUtils library. We have to do this - // because the Lib_CrossDomainUtils library does not provide a function for hashing. Instead, - // I'm duplicating the functionality of the library here and exposing an additional method that - // does the required hashing. This is fragile and will break if we ever update the way that our - // contracts hash the encoded data, but at least it works for now. - // TODO: Next time we're planning to upgrade the contracts, make sure that the library also - // contains a function for hashing. - function encodeXDomainCalldata( - address _target, - address _sender, - bytes memory _message, - uint256 _messageNonce - ) public pure returns (bytes memory) { - return - abi.encodeWithSignature( - "relayMessage(address,address,bytes,uint256)", - _target, - _sender, - _message, - _messageNonce - ); - } - - function hashXDomainCalldata( - address _target, - address _sender, - bytes memory _message, - uint256 _messageNonce - ) public pure returns (bytes32) { - return keccak256( - encodeXDomainCalldata( - _target, - _sender, - _message, - _messageNonce - ) - ); - } -} diff --git a/packages/sdk/test/contracts/MockBridge.sol b/packages/sdk/test/contracts/MockBridge.sol deleted file mode 100644 index 7f3b5155cfb1..000000000000 --- a/packages/sdk/test/contracts/MockBridge.sol +++ /dev/null @@ -1,156 +0,0 @@ -pragma solidity ^0.8.9; - -import { MockMessenger } from "./MockMessenger.sol"; - -contract MockBridge { - event ETHDepositInitiated( - address indexed _from, - address indexed _to, - uint256 _amount, - bytes _data - ); - - event ERC20DepositInitiated( - address indexed _l1Token, - address indexed _l2Token, - address indexed _from, - address _to, - uint256 _amount, - bytes _data - ); - - event ERC20WithdrawalFinalized( - address indexed _l1Token, - address indexed _l2Token, - address indexed _from, - address _to, - uint256 _amount, - bytes _data - ); - - event WithdrawalInitiated( - address indexed _l1Token, - address indexed _l2Token, - address indexed _from, - address _to, - uint256 _amount, - bytes _data - ); - - event DepositFinalized( - address indexed _l1Token, - address indexed _l2Token, - address indexed _from, - address _to, - uint256 _amount, - bytes _data - ); - - event DepositFailed( - address indexed _l1Token, - address indexed _l2Token, - address indexed _from, - address _to, - uint256 _amount, - bytes _data - ); - - struct TokenEventStruct { - address l1Token; - address l2Token; - address from; - address to; - uint256 amount; - bytes data; - } - - MockMessenger public messenger; - - constructor(MockMessenger _messenger) { - messenger = _messenger; - } - - function emitERC20DepositInitiated( - TokenEventStruct memory _params - ) public { - emit ERC20DepositInitiated(_params.l1Token, _params.l2Token, _params.from, _params.to, _params.amount, _params.data); - messenger.triggerSentMessageEvent( - MockMessenger.SentMessageEventParams( - address(0), - address(0), - hex"1234", - 1234, - 12345678, - 0 - ) - ); - } - - function emitERC20WithdrawalFinalized( - TokenEventStruct memory _params - ) public { - emit ERC20WithdrawalFinalized(_params.l1Token, _params.l2Token, _params.from, _params.to, _params.amount, _params.data); - } - - function emitWithdrawalInitiated( - TokenEventStruct memory _params - ) public { - emit WithdrawalInitiated(_params.l1Token, _params.l2Token, _params.from, _params.to, _params.amount, _params.data); - messenger.triggerSentMessageEvent( - MockMessenger.SentMessageEventParams( - address(0), - address(0), - hex"1234", - 1234, - 12345678, - 0 - ) - ); - } - - function emitDepositFinalized( - TokenEventStruct memory _params - ) public { - emit DepositFinalized(_params.l1Token, _params.l2Token, _params.from, _params.to, _params.amount, _params.data); - } - - function emitDepositFailed( - TokenEventStruct memory _params - ) public { - emit DepositFailed(_params.l1Token, _params.l2Token, _params.from, _params.to, _params.amount, _params.data); - } - - function depositETH( - uint32 _l2GasLimit, - bytes memory _data - ) - public - payable - { - emit ETHDepositInitiated( - msg.sender, - msg.sender, - msg.value, - _data - ); - } - - function withdraw( - address _l2Token, - uint256 _amount, - uint32 _l1Gas, - bytes calldata _data - ) - public - payable - { - emit WithdrawalInitiated( - address(0), - _l2Token, - msg.sender, - msg.sender, - _amount, - _data - ); - } -} diff --git a/packages/sdk/test/contracts/MockMessenger.sol b/packages/sdk/test/contracts/MockMessenger.sol deleted file mode 100644 index 1f7b3d8cf737..000000000000 --- a/packages/sdk/test/contracts/MockMessenger.sol +++ /dev/null @@ -1,98 +0,0 @@ -pragma solidity ^0.8.9; - -import { ICrossDomainMessenger } from "./ICrossDomainMessenger.sol"; - -contract MockMessenger is ICrossDomainMessenger { - function xDomainMessageSender() public view returns (address) { - return address(0); - } - - uint256 public nonce; - mapping (bytes32 => bool) public successfulMessages; - mapping (bytes32 => bool) public failedMessages; - - // Empty function to satisfy the interface. - function sendMessage( - address _target, - bytes calldata _message, - uint32 _gasLimit - ) public { - emit SentMessage( - _target, - msg.sender, - _message, - nonce, - _gasLimit - ); - nonce++; - } - - function replayMessage( - address _target, - address _sender, - bytes calldata _message, - uint256 _queueIndex, - uint32 _oldGasLimit, - uint32 _newGasLimit - ) public { - emit SentMessage( - _target, - _sender, - _message, - nonce, - _newGasLimit - ); - nonce++; - } - - struct SentMessageEventParams { - address target; - address sender; - bytes message; - uint256 messageNonce; - uint256 minGasLimit; - uint256 value; - } - - function doNothing() public { - return; - } - - function triggerSentMessageEvent( - SentMessageEventParams memory _params - ) public { - emit SentMessage( - _params.target, - _params.sender, - _params.message, - _params.messageNonce, - _params.minGasLimit - ); - } - - function triggerSentMessageEvents( - SentMessageEventParams[] memory _params - ) public { - for (uint256 i = 0; i < _params.length; i++) { - triggerSentMessageEvent(_params[i]); - } - } - - function triggerRelayedMessageEvents( - bytes32[] memory _params - ) public { - for (uint256 i = 0; i < _params.length; i++) { - emit RelayedMessage(_params[i]); - successfulMessages[_params[i]] = true; - } - } - - function triggerFailedRelayedMessageEvents( - bytes32[] memory _params - ) public { - for (uint256 i = 0; i < _params.length; i++) { - emit FailedRelayedMessage(_params[i]); - failedMessages[_params[i]] = true; - } - } -} diff --git a/packages/sdk/test/contracts/MockSCC.sol b/packages/sdk/test/contracts/MockSCC.sol deleted file mode 100644 index 56f37de38cc8..000000000000 --- a/packages/sdk/test/contracts/MockSCC.sol +++ /dev/null @@ -1,48 +0,0 @@ -pragma solidity ^0.8.9; - -contract MockSCC { - event StateBatchAppended( - uint256 indexed _batchIndex, - bytes32 _batchRoot, - uint256 _batchSize, - uint256 _prevTotalElements, - bytes _extraData - ); - - struct StateBatchAppendedArgs { - uint256 batchIndex; - bytes32 batchRoot; - uint256 batchSize; - uint256 prevTotalElements; - bytes extraData; - } - - // Window in seconds, will resolve to 100 blocks. - uint256 public FRAUD_PROOF_WINDOW = 1500; - uint256 public batches = 0; - StateBatchAppendedArgs public sbaParams; - - function getTotalBatches() public view returns (uint256) { - return batches; - } - - function setSBAParams( - StateBatchAppendedArgs memory _args - ) public { - sbaParams = _args; - } - - function appendStateBatch( - bytes32[] memory _roots, - uint256 _shouldStartAtIndex - ) public { - batches++; - emit StateBatchAppended( - sbaParams.batchIndex, - sbaParams.batchRoot, - sbaParams.batchSize, - sbaParams.prevTotalElements, - sbaParams.extraData - ); - } -} diff --git a/packages/sdk/test/cross-chain-messenger.spec.ts b/packages/sdk/test/cross-chain-messenger.spec.ts deleted file mode 100644 index 13a59348207d..000000000000 --- a/packages/sdk/test/cross-chain-messenger.spec.ts +++ /dev/null @@ -1,1664 +0,0 @@ -import { Provider } from '@ethersproject/abstract-provider' -import { expectApprox, hashCrossDomainMessage } from '@eth-optimism/core-utils' -import { predeploys } from '@eth-optimism/contracts' -import { Contract } from 'ethers' -import { ethers } from 'hardhat' - -import { expect } from './setup' -import { - MessageDirection, - CONTRACT_ADDRESSES, - omit, - MessageStatus, - CrossChainMessage, - CrossChainMessenger, - StandardBridgeAdapter, - ETHBridgeAdapter, - L1ChainID, - L2ChainID, - IGNORABLE_CONTRACTS, -} from '../src' -import { DUMMY_MESSAGE, DUMMY_EXTENDED_MESSAGE } from './helpers' - -describe('CrossChainMessenger', () => { - let l1Signer: any - let l2Signer: any - before(async () => { - ;[l1Signer, l2Signer] = await ethers.getSigners() - }) - - describe('construction', () => { - describe('when given an ethers provider for the L1 provider', () => { - it('should use the provider as the L1 provider', () => { - const messenger = new CrossChainMessenger({ - bedrock: false, - l1SignerOrProvider: ethers.provider, - l2SignerOrProvider: ethers.provider, - l1ChainId: L1ChainID.MAINNET, - l2ChainId: L2ChainID.OPTIMISM, - }) - - expect(messenger.l1Provider).to.equal(ethers.provider) - }) - }) - - describe('when given an ethers provider for the L2 provider', () => { - it('should use the provider as the L2 provider', () => { - const messenger = new CrossChainMessenger({ - bedrock: false, - l1SignerOrProvider: ethers.provider, - l2SignerOrProvider: ethers.provider, - l1ChainId: L1ChainID.MAINNET, - l2ChainId: L2ChainID.OPTIMISM, - }) - - expect(messenger.l2Provider).to.equal(ethers.provider) - }) - }) - - describe('when given a string as the L1 provider', () => { - it('should create a JSON-RPC provider for the L1 provider', () => { - const messenger = new CrossChainMessenger({ - bedrock: false, - l1SignerOrProvider: 'https://localhost:8545', - l2SignerOrProvider: ethers.provider, - l1ChainId: L1ChainID.MAINNET, - l2ChainId: L2ChainID.OPTIMISM, - }) - - expect(Provider.isProvider(messenger.l1Provider)).to.be.true - }) - }) - - describe('when given a string as the L2 provider', () => { - it('should create a JSON-RPC provider for the L2 provider', () => { - const messenger = new CrossChainMessenger({ - bedrock: false, - l1SignerOrProvider: ethers.provider, - l2SignerOrProvider: 'https://localhost:8545', - l1ChainId: L1ChainID.MAINNET, - l2ChainId: L2ChainID.OPTIMISM, - }) - - expect(Provider.isProvider(messenger.l2Provider)).to.be.true - }) - }) - - describe('when given a bad L1 chain ID', () => { - it('should throw an error', () => { - expect(() => { - new CrossChainMessenger({ - bedrock: false, - l1SignerOrProvider: ethers.provider, - l2SignerOrProvider: ethers.provider, - l1ChainId: undefined as any, - l2ChainId: L2ChainID.OPTIMISM, - }) - }).to.throw('L1 chain ID is missing or invalid') - }) - }) - - describe('when given a bad L2 chain ID', () => { - it('should throw an error', () => { - expect(() => { - new CrossChainMessenger({ - bedrock: false, - l1SignerOrProvider: ethers.provider, - l2SignerOrProvider: ethers.provider, - l1ChainId: L1ChainID.MAINNET, - l2ChainId: undefined as any, - }) - }).to.throw('L2 chain ID is missing or invalid') - }) - }) - - describe('when no custom contract addresses are provided', () => { - describe('when given a known chain ID', () => { - it('should use the contract addresses for the known chain ID', () => { - const messenger = new CrossChainMessenger({ - bedrock: false, - l1SignerOrProvider: ethers.provider, - l2SignerOrProvider: 'https://localhost:8545', - l1ChainId: L1ChainID.MAINNET, - l2ChainId: L2ChainID.OPTIMISM, - }) - - const addresses = CONTRACT_ADDRESSES[messenger.l2ChainId] - for (const [contractName, contractAddress] of Object.entries( - addresses.l1 - )) { - const contract = messenger.contracts.l1[contractName] - expect(contract.address).to.equal(contractAddress) - } - for (const [contractName, contractAddress] of Object.entries( - addresses.l2 - )) { - const contract = messenger.contracts.l2[contractName] - expect(contract.address).to.equal(contractAddress) - } - }) - }) - - describe('when given an unknown L2 chain ID', () => { - it('should throw an error', () => { - expect(() => { - new CrossChainMessenger({ - bedrock: false, - l1SignerOrProvider: ethers.provider, - l2SignerOrProvider: 'https://localhost:8545', - l1ChainId: L1ChainID.MAINNET, - l2ChainId: 1234, - }) - }).to.throw() - }) - }) - }) - - describe('when custom contract addresses are provided', () => { - describe('when given a known chain ID', () => { - it('should use known addresses except where custom addresses are given', () => { - const overrides = { - l1: { - L1CrossDomainMessenger: '0x' + '11'.repeat(20), - }, - l2: { - L2CrossDomainMessenger: '0x' + '22'.repeat(20), - }, - } - const messenger = new CrossChainMessenger({ - bedrock: false, - l1SignerOrProvider: ethers.provider, - l2SignerOrProvider: 'https://localhost:8545', - l1ChainId: L1ChainID.MAINNET, - l2ChainId: L2ChainID.OPTIMISM, - contracts: overrides, - }) - - const addresses = CONTRACT_ADDRESSES[messenger.l2ChainId] - for (const [contractName, contractAddress] of Object.entries( - addresses.l1 - )) { - if (overrides.l1[contractName]) { - const contract = messenger.contracts.l1[contractName] - expect(contract.address).to.equal(overrides.l1[contractName]) - } else { - const contract = messenger.contracts.l1[contractName] - expect(contract.address).to.equal(contractAddress) - } - } - for (const [contractName, contractAddress] of Object.entries( - addresses.l2 - )) { - if (overrides.l2[contractName]) { - const contract = messenger.contracts.l2[contractName] - expect(contract.address).to.equal(overrides.l2[contractName]) - } else { - const contract = messenger.contracts.l2[contractName] - expect(contract.address).to.equal(contractAddress) - } - } - }) - }) - - describe('when given an unknown L2 chain ID', () => { - describe('when all L1 addresses are provided', () => { - it('should use custom addresses where provided', () => { - const overrides = { - l1: { - AddressManager: '0x' + '11'.repeat(20), - L1CrossDomainMessenger: '0x' + '12'.repeat(20), - L1StandardBridge: '0x' + '13'.repeat(20), - StateCommitmentChain: '0x' + '14'.repeat(20), - CanonicalTransactionChain: '0x' + '15'.repeat(20), - BondManager: '0x' + '16'.repeat(20), - OptimismPortal: '0x' + '17'.repeat(20), - L2OutputOracle: '0x' + '18'.repeat(20), - }, - l2: { - L2CrossDomainMessenger: '0x' + '22'.repeat(20), - }, - } - - const messenger = new CrossChainMessenger({ - bedrock: false, - l1SignerOrProvider: ethers.provider, - l2SignerOrProvider: 'https://localhost:8545', - l1ChainId: L1ChainID.MAINNET, - l2ChainId: 1234, - contracts: overrides, - }) - - const addresses = CONTRACT_ADDRESSES[L2ChainID.OPTIMISM] - for (const [contractName, contractAddress] of Object.entries( - addresses.l1 - )) { - if (overrides.l1[contractName]) { - const contract = messenger.contracts.l1[contractName] - expect(contract.address).to.equal(overrides.l1[contractName]) - } else if (!IGNORABLE_CONTRACTS.includes(contractName)) { - const contract = messenger.contracts.l1[contractName] - expect(contract.address).to.equal(contractAddress) - } - } - for (const [contractName, contractAddress] of Object.entries( - addresses.l2 - )) { - if (overrides.l2[contractName]) { - const contract = messenger.contracts.l2[contractName] - expect(contract.address).to.equal(overrides.l2[contractName]) - } else { - const contract = messenger.contracts.l2[contractName] - expect(contract.address).to.equal(contractAddress) - } - } - }) - }) - - describe('when not all L1 addresses are provided', () => { - it('should throw an error', () => { - expect(() => { - new CrossChainMessenger({ - bedrock: false, - l1SignerOrProvider: ethers.provider, - l2SignerOrProvider: 'https://localhost:8545', - l1ChainId: L1ChainID.MAINNET, - l2ChainId: 1234, - contracts: { - l1: { - // Missing some required L1 addresses - AddressManager: '0x' + '11'.repeat(20), - L1CrossDomainMessenger: '0x' + '12'.repeat(20), - L1StandardBridge: '0x' + '13'.repeat(20), - }, - l2: { - L2CrossDomainMessenger: '0x' + '22'.repeat(20), - }, - }, - }) - }).to.throw() - }) - }) - }) - }) - }) - - describe('getMessagesByTransaction', () => { - let l1Messenger: Contract - let l2Messenger: Contract - let messenger: CrossChainMessenger - beforeEach(async () => { - l1Messenger = (await ( - await ethers.getContractFactory('MockMessenger') - ).deploy()) as any - l2Messenger = (await ( - await ethers.getContractFactory('MockMessenger') - ).deploy()) as any - - messenger = new CrossChainMessenger({ - bedrock: false, - l1SignerOrProvider: ethers.provider, - l2SignerOrProvider: ethers.provider, - l1ChainId: L1ChainID.HARDHAT_LOCAL, - l2ChainId: L2ChainID.OPTIMISM_HARDHAT_LOCAL, - contracts: { - l1: { - L1CrossDomainMessenger: l1Messenger.address, - }, - l2: { - L2CrossDomainMessenger: l2Messenger.address, - }, - }, - }) - }) - - describe('when a direction is specified', () => { - describe('when the transaction exists', () => { - describe('when the transaction has messages', () => { - for (const n of [1, 2, 4, 8]) { - it(`should find ${n} messages when the transaction emits ${n} messages`, async () => { - const messages = [...Array(n)].map(() => { - return DUMMY_MESSAGE - }) - - const tx = await l1Messenger.triggerSentMessageEvents(messages) - const found = await messenger.getMessagesByTransaction(tx, { - direction: MessageDirection.L1_TO_L2, - }) - expect(found).to.deep.equal( - messages.map((message, i) => { - return { - direction: MessageDirection.L1_TO_L2, - sender: message.sender, - target: message.target, - message: message.message, - messageNonce: ethers.BigNumber.from(message.messageNonce), - minGasLimit: ethers.BigNumber.from(message.minGasLimit), - value: ethers.BigNumber.from(message.value), - logIndex: i, - blockNumber: tx.blockNumber, - transactionHash: tx.hash, - } - }) - ) - }) - } - }) - - describe('when the transaction has no messages', () => { - it('should find nothing', async () => { - const tx = await l1Messenger.doNothing() - const found = await messenger.getMessagesByTransaction(tx, { - direction: MessageDirection.L1_TO_L2, - }) - expect(found).to.deep.equal([]) - }) - }) - }) - - describe('when the transaction does not exist in the specified direction', () => { - it('should throw an error', async () => { - await expect( - messenger.getMessagesByTransaction('0x' + '11'.repeat(32), { - direction: MessageDirection.L1_TO_L2, - }) - ).to.be.rejectedWith('unable to find transaction receipt') - }) - }) - }) - - describe('when a direction is not specified', () => { - describe('when the transaction exists only on L1', () => { - describe('when the transaction has messages', () => { - for (const n of [1, 2, 4, 8]) { - it(`should find ${n} messages when the transaction emits ${n} messages`, async () => { - const messages = [...Array(n)].map(() => { - return DUMMY_MESSAGE - }) - - const tx = await l1Messenger.triggerSentMessageEvents(messages) - const found = await messenger.getMessagesByTransaction(tx) - expect(found).to.deep.equal( - messages.map((message, i) => { - return { - direction: MessageDirection.L1_TO_L2, - sender: message.sender, - target: message.target, - message: message.message, - messageNonce: ethers.BigNumber.from(message.messageNonce), - minGasLimit: ethers.BigNumber.from(message.minGasLimit), - value: ethers.BigNumber.from(message.value), - logIndex: i, - blockNumber: tx.blockNumber, - transactionHash: tx.hash, - } - }) - ) - }) - } - }) - - describe('when the transaction has no messages', () => { - it('should find nothing', async () => { - const tx = await l1Messenger.doNothing() - const found = await messenger.getMessagesByTransaction(tx) - expect(found).to.deep.equal([]) - }) - }) - }) - - describe('when the transaction exists only on L2', () => { - describe('when the transaction has messages', () => { - for (const n of [1, 2, 4, 8]) { - it(`should find ${n} messages when the transaction emits ${n} messages`, () => { - // TODO: Need support for simulating more than one network. - }) - } - }) - - describe('when the transaction has no messages', () => { - it('should find nothing', () => { - // TODO: Need support for simulating more than one network. - }) - }) - }) - - describe('when the transaction does not exist', () => { - it('should throw an error', async () => { - await expect( - messenger.getMessagesByTransaction('0x' + '11'.repeat(32)) - ).to.be.rejectedWith('unable to find transaction receipt') - }) - }) - - describe('when the transaction exists on both L1 and L2', () => { - it('should throw an error', async () => { - // TODO: Need support for simulating more than one network. - }) - }) - }) - }) - - // Skipped until getMessagesByAddress can be implemented - describe.skip('getMessagesByAddress', () => { - describe('when the address has sent messages', () => { - describe('when no direction is specified', () => { - it('should find all messages sent by the address') - }) - - describe('when a direction is specified', () => { - it('should find all messages only in the given direction') - }) - - describe('when a block range is specified', () => { - it('should find all messages within the block range') - }) - - describe('when both a direction and a block range are specified', () => { - it( - 'should find all messages only in the given direction and within the block range' - ) - }) - }) - - describe('when the address has not sent messages', () => { - it('should find nothing') - }) - }) - - describe('toCrossChainMessage', () => { - let l1Bridge: Contract - let l2Bridge: Contract - let l1Messenger: Contract - let l2Messenger: Contract - let messenger: CrossChainMessenger - beforeEach(async () => { - l1Messenger = (await ( - await ethers.getContractFactory('MockMessenger') - ).deploy()) as any - l2Messenger = (await ( - await ethers.getContractFactory('MockMessenger') - ).deploy()) as any - l1Bridge = (await ( - await ethers.getContractFactory('MockBridge') - ).deploy(l1Messenger.address)) as any - l2Bridge = (await ( - await ethers.getContractFactory('MockBridge') - ).deploy(l2Messenger.address)) as any - - messenger = new CrossChainMessenger({ - bedrock: false, - l1SignerOrProvider: ethers.provider, - l2SignerOrProvider: ethers.provider, - l1ChainId: L1ChainID.HARDHAT_LOCAL, - l2ChainId: L2ChainID.OPTIMISM_HARDHAT_LOCAL, - contracts: { - l1: { - L1CrossDomainMessenger: l1Messenger.address, - L1StandardBridge: l1Bridge.address, - }, - l2: { - L2CrossDomainMessenger: l2Messenger.address, - L2StandardBridge: l2Bridge.address, - }, - }, - bridges: { - Standard: { - Adapter: StandardBridgeAdapter, - l1Bridge: l1Bridge.address, - l2Bridge: l2Bridge.address, - }, - }, - }) - }) - - describe('when the input is a CrossChainMessage', () => { - it('should return the input', async () => { - const message = { - ...DUMMY_EXTENDED_MESSAGE, - direction: MessageDirection.L1_TO_L2, - } - - expect(await messenger.toCrossChainMessage(message)).to.deep.equal( - message - ) - }) - }) - - describe('when the input is a TokenBridgeMessage', () => { - // TODO: There are some edge cases here with custom bridges that conform to the interface but - // not to the behavioral spec. Possibly worth testing those. For now this is probably - // sufficient. - it('should return the sent message event that came after the deposit or withdrawal', async () => { - const from = '0x' + '99'.repeat(20) - const deposit = { - l1Token: '0x' + '11'.repeat(20), - l2Token: '0x' + '22'.repeat(20), - from, - to: '0x' + '44'.repeat(20), - amount: ethers.BigNumber.from(1234), - data: '0x1234', - } - - const tx = await l1Bridge.emitERC20DepositInitiated(deposit) - - const foundCrossChainMessages = - await messenger.getMessagesByTransaction(tx) - const foundTokenBridgeMessages = await messenger.getDepositsByAddress( - from - ) - const resolved = await messenger.toCrossChainMessage( - foundTokenBridgeMessages[0] - ) - - expect(resolved).to.deep.equal(foundCrossChainMessages[0]) - }) - }) - - describe('when the input is a TransactionLike', () => { - describe('when the transaction sent exactly one message', () => { - it('should return the CrossChainMessage sent in the transaction', async () => { - const tx = await l1Messenger.triggerSentMessageEvents([DUMMY_MESSAGE]) - const foundCrossChainMessages = - await messenger.getMessagesByTransaction(tx) - const resolved = await messenger.toCrossChainMessage(tx) - expect(resolved).to.deep.equal(foundCrossChainMessages[0]) - }) - }) - - describe('when the transaction sent more than one message', () => { - it('should be able to get second message by passing in an idex', async () => { - const messages = [...Array(2)].map(() => { - return DUMMY_MESSAGE - }) - - const tx = await l1Messenger.triggerSentMessageEvents(messages) - const foundCrossChainMessages = - await messenger.getMessagesByTransaction(tx) - expect(await messenger.toCrossChainMessage(tx, 1)).to.deep.eq( - foundCrossChainMessages[1] - ) - }) - }) - - describe('when the transaction sent no messages', () => { - it('should throw an out of bounds error', async () => { - const tx = await l1Messenger.triggerSentMessageEvents([]) - await expect(messenger.toCrossChainMessage(tx)).to.be.rejectedWith( - `withdrawal index 0 out of bounds. There are 0 withdrawals` - ) - }) - }) - }) - }) - - describe('getMessageStatus', () => { - let scc: Contract - let l1Messenger: Contract - let l2Messenger: Contract - let messenger: CrossChainMessenger - beforeEach(async () => { - // TODO: Get rid of the nested awaits here. Could be a good first issue for someone. - scc = (await (await ethers.getContractFactory('MockSCC')).deploy()) as any - l1Messenger = (await ( - await ethers.getContractFactory('MockMessenger') - ).deploy()) as any - l2Messenger = (await ( - await ethers.getContractFactory('MockMessenger') - ).deploy()) as any - - messenger = new CrossChainMessenger({ - bedrock: false, - l1SignerOrProvider: ethers.provider, - l2SignerOrProvider: ethers.provider, - l1ChainId: L1ChainID.HARDHAT_LOCAL, - l2ChainId: L2ChainID.OPTIMISM_HARDHAT_LOCAL, - contracts: { - l1: { - L1CrossDomainMessenger: l1Messenger.address, - StateCommitmentChain: scc.address, - }, - l2: { - L2CrossDomainMessenger: l2Messenger.address, - }, - }, - }) - }) - - const sendAndGetDummyMessage = async (direction: MessageDirection) => { - const mockMessenger = - direction === MessageDirection.L1_TO_L2 ? l1Messenger : l2Messenger - const tx = await mockMessenger.triggerSentMessageEvents([DUMMY_MESSAGE]) - return ( - await messenger.getMessagesByTransaction(tx, { - direction, - }) - )[0] - } - - const submitStateRootBatchForMessage = async ( - message: CrossChainMessage - ) => { - await scc.setSBAParams({ - batchIndex: 0, - batchRoot: ethers.constants.HashZero, - batchSize: 1, - prevTotalElements: message.blockNumber, - extraData: '0x', - }) - await scc.appendStateBatch([ethers.constants.HashZero], 0) - } - - describe('when the message is an L1 => L2 message', () => { - describe('when the message has not been executed on L2 yet', () => { - it('should return a status of UNCONFIRMED_L1_TO_L2_MESSAGE', async () => { - const message = await sendAndGetDummyMessage( - MessageDirection.L1_TO_L2 - ) - - expect(await messenger.getMessageStatus(message)).to.equal( - MessageStatus.UNCONFIRMED_L1_TO_L2_MESSAGE - ) - }) - }) - - describe('when the message has been executed on L2', () => { - it('should return a status of RELAYED', async () => { - const message = await sendAndGetDummyMessage( - MessageDirection.L1_TO_L2 - ) - - await l2Messenger.triggerRelayedMessageEvents([ - hashCrossDomainMessage( - message.messageNonce, - message.sender, - message.target, - message.value, - message.minGasLimit, - message.message - ), - ]) - - expect(await messenger.getMessageStatus(message)).to.equal( - MessageStatus.RELAYED - ) - }) - }) - - describe('when the message has been executed but failed', () => { - it('should return a status of FAILED_L1_TO_L2_MESSAGE', async () => { - const message = await sendAndGetDummyMessage( - MessageDirection.L1_TO_L2 - ) - - await l2Messenger.triggerFailedRelayedMessageEvents([ - hashCrossDomainMessage( - message.messageNonce, - message.sender, - message.target, - message.value, - message.minGasLimit, - message.message - ), - ]) - - expect(await messenger.getMessageStatus(message)).to.equal( - MessageStatus.FAILED_L1_TO_L2_MESSAGE - ) - }) - }) - }) - - describe('when the message is an L2 => L1 message', () => { - describe('when the message state root has not been published', () => { - it('should return a status of STATE_ROOT_NOT_PUBLISHED', async () => { - const message = await sendAndGetDummyMessage( - MessageDirection.L2_TO_L1 - ) - - expect(await messenger.getMessageStatus(message)).to.equal( - MessageStatus.STATE_ROOT_NOT_PUBLISHED - ) - }) - }) - - describe('when the message state root is still in the challenge period', () => { - it('should return a status of IN_CHALLENGE_PERIOD', async () => { - const message = await sendAndGetDummyMessage( - MessageDirection.L2_TO_L1 - ) - - await submitStateRootBatchForMessage(message) - - expect(await messenger.getMessageStatus(message)).to.equal( - MessageStatus.IN_CHALLENGE_PERIOD - ) - }) - }) - - describe('when the message is no longer in the challenge period', () => { - describe('when the message has been relayed successfully', () => { - it('should return a status of RELAYED', async () => { - const message = await sendAndGetDummyMessage( - MessageDirection.L2_TO_L1 - ) - - await submitStateRootBatchForMessage(message) - - const challengePeriod = await messenger.getChallengePeriodSeconds() - ethers.provider.send('evm_increaseTime', [challengePeriod + 1]) - ethers.provider.send('evm_mine', []) - - await l1Messenger.triggerRelayedMessageEvents([ - hashCrossDomainMessage( - message.messageNonce, - message.sender, - message.target, - message.value, - message.minGasLimit, - message.message - ), - ]) - - expect(await messenger.getMessageStatus(message)).to.equal( - MessageStatus.RELAYED - ) - }) - }) - - describe('when the message has been relayed but the relay failed', () => { - it('should return a status of READY_FOR_RELAY', async () => { - const message = await sendAndGetDummyMessage( - MessageDirection.L2_TO_L1 - ) - - await submitStateRootBatchForMessage(message) - - const challengePeriod = await messenger.getChallengePeriodSeconds() - ethers.provider.send('evm_increaseTime', [challengePeriod + 1]) - ethers.provider.send('evm_mine', []) - - await l1Messenger.triggerFailedRelayedMessageEvents([ - hashCrossDomainMessage( - message.messageNonce, - message.sender, - message.target, - message.value, - message.minGasLimit, - message.message - ), - ]) - - expect(await messenger.getMessageStatus(message)).to.equal( - MessageStatus.READY_FOR_RELAY - ) - }) - }) - - describe('when the message has not been relayed', () => { - it('should return a status of READY_FOR_RELAY', async () => { - const message = await sendAndGetDummyMessage( - MessageDirection.L2_TO_L1 - ) - - await submitStateRootBatchForMessage(message) - - const challengePeriod = await messenger.getChallengePeriodSeconds() - ethers.provider.send('evm_increaseTime', [challengePeriod + 1]) - ethers.provider.send('evm_mine', []) - - expect(await messenger.getMessageStatus(message)).to.equal( - MessageStatus.READY_FOR_RELAY - ) - }) - }) - }) - }) - - describe('when the message does not exist', () => { - // TODO: Figure out if this is the correct behavior. Mark suggests perhaps returning null. - it('should throw an error') - }) - }) - - describe('getMessageReceipt', () => { - let l1Bridge: Contract - let l2Bridge: Contract - let l1Messenger: Contract - let l2Messenger: Contract - let messenger: CrossChainMessenger - beforeEach(async () => { - l1Messenger = (await ( - await ethers.getContractFactory('MockMessenger') - ).deploy()) as any - l2Messenger = (await ( - await ethers.getContractFactory('MockMessenger') - ).deploy()) as any - l1Bridge = (await ( - await ethers.getContractFactory('MockBridge') - ).deploy(l1Messenger.address)) as any - l2Bridge = (await ( - await ethers.getContractFactory('MockBridge') - ).deploy(l2Messenger.address)) as any - - messenger = new CrossChainMessenger({ - bedrock: false, - l1SignerOrProvider: ethers.provider, - l2SignerOrProvider: ethers.provider, - l1ChainId: L1ChainID.HARDHAT_LOCAL, - l2ChainId: L2ChainID.OPTIMISM_HARDHAT_LOCAL, - contracts: { - l1: { - L1CrossDomainMessenger: l1Messenger.address, - L1StandardBridge: l1Bridge.address, - }, - l2: { - L2CrossDomainMessenger: l2Messenger.address, - L2StandardBridge: l2Bridge.address, - }, - }, - }) - }) - - describe('when the message has been relayed', () => { - describe('when the relay was successful', () => { - it('should return the receipt of the transaction that relayed the message', async () => { - const message = { - ...DUMMY_EXTENDED_MESSAGE, - direction: MessageDirection.L1_TO_L2, - } - - const tx = await l2Messenger.triggerRelayedMessageEvents([ - hashCrossDomainMessage( - message.messageNonce, - message.sender, - message.target, - message.value, - message.minGasLimit, - message.message - ), - ]) - - const messageReceipt = await messenger.getMessageReceipt(message) - expect(messageReceipt.receiptStatus).to.equal(1) - expect( - omit(messageReceipt.transactionReceipt, 'confirmations') - ).to.deep.equal( - omit( - await ethers.provider.getTransactionReceipt(tx.hash), - 'confirmations' - ) - ) - }) - }) - - describe('when the relay failed', () => { - it('should return the receipt of the transaction that attempted to relay the message', async () => { - const message = { - ...DUMMY_EXTENDED_MESSAGE, - direction: MessageDirection.L1_TO_L2, - } - - const tx = await l2Messenger.triggerFailedRelayedMessageEvents([ - hashCrossDomainMessage( - message.messageNonce, - message.sender, - message.target, - message.value, - message.minGasLimit, - message.message - ), - ]) - - const messageReceipt = await messenger.getMessageReceipt(message) - expect(messageReceipt.receiptStatus).to.equal(0) - expect( - omit(messageReceipt.transactionReceipt, 'confirmations') - ).to.deep.equal( - omit( - await ethers.provider.getTransactionReceipt(tx.hash), - 'confirmations' - ) - ) - }) - }) - - describe('when the relay failed more than once', () => { - it('should return the receipt of the last transaction that attempted to relay the message', async () => { - const message = { - ...DUMMY_EXTENDED_MESSAGE, - direction: MessageDirection.L1_TO_L2, - } - - await l2Messenger.triggerFailedRelayedMessageEvents([ - hashCrossDomainMessage( - message.messageNonce, - message.sender, - message.target, - message.value, - message.minGasLimit, - message.message - ), - ]) - - const tx = await l2Messenger.triggerFailedRelayedMessageEvents([ - hashCrossDomainMessage( - message.messageNonce, - message.sender, - message.target, - message.value, - message.minGasLimit, - message.message - ), - ]) - - const messageReceipt = await messenger.getMessageReceipt(message) - expect(messageReceipt.receiptStatus).to.equal(0) - expect( - omit(messageReceipt.transactionReceipt, 'confirmations') - ).to.deep.equal( - omit( - await ethers.provider.getTransactionReceipt(tx.hash), - 'confirmations' - ) - ) - }) - }) - }) - - describe('when the message has not been relayed', () => { - it('should return null', async () => { - const message = { - ...DUMMY_EXTENDED_MESSAGE, - direction: MessageDirection.L1_TO_L2, - } - - await l2Messenger.doNothing() - - const messageReceipt = await messenger.getMessageReceipt(message) - expect(messageReceipt).to.equal(null) - }) - }) - - // TODO: Go over all of these tests and remove the empty functions so we can accurately keep - // track of - }) - - describe('waitForMessageReceipt', () => { - let l2Messenger: Contract - let messenger: CrossChainMessenger - beforeEach(async () => { - l2Messenger = (await ( - await ethers.getContractFactory('MockMessenger') - ).deploy()) as any - - messenger = new CrossChainMessenger({ - bedrock: false, - l1SignerOrProvider: ethers.provider, - l2SignerOrProvider: ethers.provider, - l1ChainId: L1ChainID.HARDHAT_LOCAL, - l2ChainId: L2ChainID.OPTIMISM_HARDHAT_LOCAL, - contracts: { - l2: { - L2CrossDomainMessenger: l2Messenger.address, - }, - }, - }) - }) - - describe('when the message receipt already exists', () => { - it('should immediately return the receipt', async () => { - const message = { - ...DUMMY_EXTENDED_MESSAGE, - direction: MessageDirection.L1_TO_L2, - } - - const tx = await l2Messenger.triggerRelayedMessageEvents([ - hashCrossDomainMessage( - message.messageNonce, - message.sender, - message.target, - message.value, - message.minGasLimit, - message.message - ), - ]) - - const messageReceipt = await messenger.waitForMessageReceipt(message) - expect(messageReceipt.receiptStatus).to.equal(1) - expect( - omit(messageReceipt.transactionReceipt, 'confirmations') - ).to.deep.equal( - omit( - await ethers.provider.getTransactionReceipt(tx.hash), - 'confirmations' - ) - ) - }) - }) - - describe('when the message receipt does not exist already', () => { - describe('when no extra options are provided', () => { - it('should wait for the receipt to be published', async () => { - const message = { - ...DUMMY_EXTENDED_MESSAGE, - direction: MessageDirection.L1_TO_L2, - } - - setTimeout(async () => { - await l2Messenger.triggerRelayedMessageEvents([ - hashCrossDomainMessage( - message.messageNonce, - message.sender, - message.target, - message.value, - message.minGasLimit, - message.message - ), - ]) - }, 5000) - - const tick = Date.now() - const messageReceipt = await messenger.waitForMessageReceipt(message) - const tock = Date.now() - expect(messageReceipt.receiptStatus).to.equal(1) - expect(tock - tick).to.be.greaterThan(5000) - }) - - it('should wait forever for the receipt if the receipt is never published', () => { - // Not sure how to easily test this without introducing some sort of cancellation token - // I don't want the promise to loop forever and make the tests never finish. - }) - }) - - describe('when a timeout is provided', () => { - it('should throw an error if the timeout is reached', async () => { - const message = { - ...DUMMY_EXTENDED_MESSAGE, - direction: MessageDirection.L1_TO_L2, - } - - await expect( - messenger.waitForMessageReceipt(message, { - timeoutMs: 10000, - }) - ).to.be.rejectedWith('timed out waiting for message receipt') - }) - }) - }) - }) - - describe('estimateL2MessageGasLimit', () => { - let messenger: CrossChainMessenger - beforeEach(async () => { - messenger = new CrossChainMessenger({ - bedrock: false, - l1SignerOrProvider: ethers.provider, - l2SignerOrProvider: ethers.provider, - l1ChainId: L1ChainID.HARDHAT_LOCAL, - l2ChainId: L2ChainID.OPTIMISM_HARDHAT_LOCAL, - }) - }) - - describe('when the message is an L1 to L2 message', () => { - it('should return an accurate gas estimate plus a ~20% buffer', async () => { - const message = { - direction: MessageDirection.L1_TO_L2, - target: '0x' + '11'.repeat(20), - sender: '0x' + '22'.repeat(20), - message: '0x' + '33'.repeat(64), - messageNonce: 1234, - logIndex: 0, - blockNumber: 1234, - transactionHash: '0x' + '44'.repeat(32), - } - - const estimate = await ethers.provider.estimateGas({ - to: message.target, - from: message.sender, - data: message.message, - }) - - // Approximately 20% greater than the estimate, +/- 1%. - expectApprox( - await messenger.estimateL2MessageGasLimit(message), - estimate.mul(120).div(100), - { - percentUpperDeviation: 1, - percentLowerDeviation: 1, - } - ) - }) - - it('should return an accurate gas estimate when a custom buffer is provided', async () => { - const message = { - direction: MessageDirection.L1_TO_L2, - target: '0x' + '11'.repeat(20), - sender: '0x' + '22'.repeat(20), - message: '0x' + '33'.repeat(64), - messageNonce: 1234, - logIndex: 0, - blockNumber: 1234, - transactionHash: '0x' + '44'.repeat(32), - } - - const estimate = await ethers.provider.estimateGas({ - to: message.target, - from: message.sender, - data: message.message, - }) - - // Approximately 30% greater than the estimate, +/- 1%. - expectApprox( - await messenger.estimateL2MessageGasLimit(message, { - bufferPercent: 30, - }), - estimate.mul(130).div(100), - { - percentUpperDeviation: 1, - percentLowerDeviation: 1, - } - ) - }) - }) - - describe('when the message is an L2 to L1 message', () => { - it('should throw an error', async () => { - const message = { - direction: MessageDirection.L2_TO_L1, - target: '0x' + '11'.repeat(20), - sender: '0x' + '22'.repeat(20), - message: '0x' + '33'.repeat(64), - messageNonce: 1234, - logIndex: 0, - blockNumber: 1234, - transactionHash: '0x' + '44'.repeat(32), - } - - await expect(messenger.estimateL2MessageGasLimit(message)).to.be - .rejected - }) - }) - }) - - describe('estimateMessageWaitTimeSeconds', () => { - let scc: Contract - let l1Messenger: Contract - let l2Messenger: Contract - let messenger: CrossChainMessenger - beforeEach(async () => { - // TODO: Get rid of the nested awaits here. Could be a good first issue for someone. - scc = (await (await ethers.getContractFactory('MockSCC')).deploy()) as any - l1Messenger = (await ( - await ethers.getContractFactory('MockMessenger') - ).deploy()) as any - l2Messenger = (await ( - await ethers.getContractFactory('MockMessenger') - ).deploy()) as any - - messenger = new CrossChainMessenger({ - bedrock: false, - l1SignerOrProvider: ethers.provider, - l2SignerOrProvider: ethers.provider, - l1ChainId: L1ChainID.HARDHAT_LOCAL, - l2ChainId: L2ChainID.OPTIMISM_HARDHAT_LOCAL, - contracts: { - l1: { - L1CrossDomainMessenger: l1Messenger.address, - StateCommitmentChain: scc.address, - }, - l2: { - L2CrossDomainMessenger: l2Messenger.address, - }, - }, - }) - }) - - const sendAndGetDummyMessage = async (direction: MessageDirection) => { - const mockMessenger = - direction === MessageDirection.L1_TO_L2 ? l1Messenger : l2Messenger - const tx = await mockMessenger.triggerSentMessageEvents([DUMMY_MESSAGE]) - return ( - await messenger.getMessagesByTransaction(tx, { - direction, - }) - )[0] - } - - const submitStateRootBatchForMessage = async ( - message: CrossChainMessage - ) => { - await scc.setSBAParams({ - batchIndex: 0, - batchRoot: ethers.constants.HashZero, - batchSize: 1, - prevTotalElements: message.blockNumber, - extraData: '0x', - }) - await scc.appendStateBatch([ethers.constants.HashZero], 0) - } - - describe('when the message is an L1 => L2 message', () => { - describe('when the message has not been executed on L2 yet', () => { - it('should return the estimated seconds until the message will be confirmed on L2', async () => { - const message = await sendAndGetDummyMessage( - MessageDirection.L1_TO_L2 - ) - - await l1Messenger.triggerSentMessageEvents([message]) - - expect( - await messenger.estimateMessageWaitTimeSeconds(message) - ).to.equal(1) - }) - }) - - describe('when the message has been executed on L2', () => { - it('should return 0', async () => { - const message = await sendAndGetDummyMessage( - MessageDirection.L1_TO_L2 - ) - - await l1Messenger.triggerSentMessageEvents([message]) - await l2Messenger.triggerRelayedMessageEvents([ - hashCrossDomainMessage( - message.messageNonce, - message.sender, - message.target, - message.value, - message.minGasLimit, - message.message - ), - ]) - - expect( - await messenger.estimateMessageWaitTimeSeconds(message) - ).to.equal(0) - }) - }) - }) - - describe('when the message is an L2 => L1 message', () => { - describe('when the state root has not been published', () => { - it('should return the estimated seconds until the state root will be published and pass the challenge period', async () => { - const message = await sendAndGetDummyMessage( - MessageDirection.L2_TO_L1 - ) - - expect( - await messenger.estimateMessageWaitTimeSeconds(message) - ).to.equal(await messenger.getChallengePeriodSeconds()) - }) - }) - - describe('when the state root is within the challenge period', () => { - it('should return the estimated seconds until the state root passes the challenge period', async () => { - const message = await sendAndGetDummyMessage( - MessageDirection.L2_TO_L1 - ) - - await submitStateRootBatchForMessage(message) - - const challengePeriod = await messenger.getChallengePeriodSeconds() - ethers.provider.send('evm_increaseTime', [challengePeriod / 2]) - ethers.provider.send('evm_mine', []) - - expectApprox( - await messenger.estimateMessageWaitTimeSeconds(message), - challengePeriod / 2, - { - percentUpperDeviation: 5, - percentLowerDeviation: 5, - } - ) - }) - }) - - describe('when the state root passes the challenge period', () => { - it('should return 0', async () => { - const message = await sendAndGetDummyMessage( - MessageDirection.L2_TO_L1 - ) - - await submitStateRootBatchForMessage(message) - - const challengePeriod = await messenger.getChallengePeriodSeconds() - ethers.provider.send('evm_increaseTime', [challengePeriod + 1]) - ethers.provider.send('evm_mine', []) - - expect( - await messenger.estimateMessageWaitTimeSeconds(message) - ).to.equal(0) - }) - }) - - describe('when the message has been executed', () => { - it('should return 0', async () => { - const message = await sendAndGetDummyMessage( - MessageDirection.L2_TO_L1 - ) - - await l2Messenger.triggerSentMessageEvents([message]) - await l1Messenger.triggerRelayedMessageEvents([ - hashCrossDomainMessage( - message.messageNonce, - message.sender, - message.target, - message.value, - message.minGasLimit, - message.message - ), - ]) - - expect( - await messenger.estimateMessageWaitTimeSeconds(message) - ).to.equal(0) - }) - }) - }) - }) - - describe('sendMessage', () => { - let l1Messenger: Contract - let l2Messenger: Contract - let messenger: CrossChainMessenger - beforeEach(async () => { - l1Messenger = (await ( - await ethers.getContractFactory('MockMessenger') - ).deploy()) as any - l2Messenger = (await ( - await ethers.getContractFactory('MockMessenger') - ).deploy()) as any - - messenger = new CrossChainMessenger({ - bedrock: false, - l1SignerOrProvider: l1Signer, - l2SignerOrProvider: l2Signer, - l1ChainId: L1ChainID.HARDHAT_LOCAL, - l2ChainId: L2ChainID.OPTIMISM_HARDHAT_LOCAL, - contracts: { - l1: { - L1CrossDomainMessenger: l1Messenger.address, - }, - l2: { - L2CrossDomainMessenger: l2Messenger.address, - }, - }, - }) - }) - - describe('when the message is an L1 to L2 message', () => { - describe('when no l2GasLimit is provided', () => { - it('should send a message with an estimated l2GasLimit', async () => { - const message = { - direction: MessageDirection.L1_TO_L2, - target: '0x' + '11'.repeat(20), - message: '0x' + '22'.repeat(32), - } - - const estimate = await messenger.estimateL2MessageGasLimit(message) - await expect(messenger.sendMessage(message)) - .to.emit(l1Messenger, 'SentMessage') - .withArgs( - message.target, - await l1Signer.getAddress(), - message.message, - 0, - estimate - ) - }) - }) - - describe('when an l2GasLimit is provided', () => { - it('should send a message with the provided l2GasLimit', async () => { - const message = { - direction: MessageDirection.L1_TO_L2, - target: '0x' + '11'.repeat(20), - message: '0x' + '22'.repeat(32), - } - - await expect( - messenger.sendMessage(message, { - l2GasLimit: 1234, - }) - ) - .to.emit(l1Messenger, 'SentMessage') - .withArgs( - message.target, - await l1Signer.getAddress(), - message.message, - 0, - 1234 - ) - }) - }) - }) - - describe('when the message is an L2 to L1 message', () => { - it('should send a message', async () => { - const message = { - direction: MessageDirection.L2_TO_L1, - target: '0x' + '11'.repeat(20), - message: '0x' + '22'.repeat(32), - } - - await expect(messenger.sendMessage(message)) - .to.emit(l2Messenger, 'SentMessage') - .withArgs( - message.target, - await l2Signer.getAddress(), - message.message, - 0, - 0 - ) - }) - }) - }) - - describe('resendMessage', () => { - let l1Messenger: Contract - let l2Messenger: Contract - let messenger: CrossChainMessenger - beforeEach(async () => { - l1Messenger = (await ( - await ethers.getContractFactory('MockMessenger') - ).deploy()) as any - l2Messenger = (await ( - await ethers.getContractFactory('MockMessenger') - ).deploy()) as any - - messenger = new CrossChainMessenger({ - bedrock: false, - l1SignerOrProvider: l1Signer, - l2SignerOrProvider: l2Signer, - l1ChainId: L1ChainID.HARDHAT_LOCAL, - l2ChainId: L2ChainID.OPTIMISM_HARDHAT_LOCAL, - contracts: { - l1: { - L1CrossDomainMessenger: l1Messenger.address, - }, - l2: { - L2CrossDomainMessenger: l2Messenger.address, - }, - }, - }) - }) - - describe('when resending an L1 to L2 message', () => { - it('should resend the message with the new gas limit', async () => { - const message = { - direction: MessageDirection.L1_TO_L2, - target: '0x' + '11'.repeat(20), - message: '0x' + '22'.repeat(32), - } - - const sent = await messenger.sendMessage(message, { - l2GasLimit: 1234, - }) - - await expect(messenger.resendMessage(sent, 10000)) - .to.emit(l1Messenger, 'SentMessage') - .withArgs( - message.target, - await l1Signer.getAddress(), - message.message, - 1, // nonce is now 1 - 10000 - ) - }) - }) - - describe('when resending an L2 to L1 message', () => { - it('should throw an error', async () => { - const message = { - direction: MessageDirection.L2_TO_L1, - target: '0x' + '11'.repeat(20), - message: '0x' + '22'.repeat(32), - } - - const sent = await messenger.sendMessage(message, { - l2GasLimit: 1234, - }) - - await expect(messenger.resendMessage(sent, 10000)).to.be.rejected - }) - }) - }) - - describe('finalizeMessage', () => { - describe('when the message being finalized exists', () => { - describe('when the message is ready to be finalized', () => { - it('should finalize the message') - }) - - describe('when the message is not ready to be finalized', () => { - it('should throw an error') - }) - - describe('when the message has already been finalized', () => { - it('should throw an error') - }) - }) - - describe('when the message being finalized does not exist', () => { - it('should throw an error') - }) - }) - - describe('depositETH', () => { - let l1Messenger: Contract - let l2Messenger: Contract - let l1Bridge: Contract - let l2Bridge: Contract - let messenger: CrossChainMessenger - beforeEach(async () => { - l1Messenger = (await ( - await ethers.getContractFactory('MockMessenger') - ).deploy()) as any - l1Bridge = (await ( - await ethers.getContractFactory('MockBridge') - ).deploy(l1Messenger.address)) as any - l2Messenger = (await ( - await ethers.getContractFactory('MockMessenger') - ).deploy()) as any - l2Bridge = (await ( - await ethers.getContractFactory('MockBridge') - ).deploy(l2Messenger.address)) as any - - messenger = new CrossChainMessenger({ - bedrock: false, - l1SignerOrProvider: l1Signer, - l2SignerOrProvider: l2Signer, - l1ChainId: L1ChainID.HARDHAT_LOCAL, - l2ChainId: L2ChainID.OPTIMISM_HARDHAT_LOCAL, - contracts: { - l1: { - L1CrossDomainMessenger: l1Messenger.address, - L1StandardBridge: l1Bridge.address, - }, - l2: { - L2CrossDomainMessenger: l2Messenger.address, - L2StandardBridge: l2Bridge.address, - }, - }, - bridges: { - ETH: { - Adapter: ETHBridgeAdapter, - l1Bridge: l1Bridge.address, - l2Bridge: l2Bridge.address, - }, - }, - }) - }) - - it('should trigger the deposit ETH function with the given amount', async () => { - await expect(messenger.depositETH(100000)) - .to.emit(l1Bridge, 'ETHDepositInitiated') - .withArgs( - await l1Signer.getAddress(), - await l1Signer.getAddress(), - 100000, - '0x' - ) - }) - }) - - describe('withdrawETH', () => { - let l1Messenger: Contract - let l2Messenger: Contract - let l1Bridge: Contract - let l2Bridge: Contract - let messenger: CrossChainMessenger - beforeEach(async () => { - l1Messenger = (await ( - await ethers.getContractFactory('MockMessenger') - ).deploy()) as any - l1Bridge = (await ( - await ethers.getContractFactory('MockBridge') - ).deploy(l1Messenger.address)) as any - l2Messenger = (await ( - await ethers.getContractFactory('MockMessenger') - ).deploy()) as any - l2Bridge = (await ( - await ethers.getContractFactory('MockBridge') - ).deploy(l2Messenger.address)) as any - - messenger = new CrossChainMessenger({ - bedrock: false, - l1SignerOrProvider: l1Signer, - l2SignerOrProvider: l2Signer, - l1ChainId: L1ChainID.HARDHAT_LOCAL, - l2ChainId: L2ChainID.OPTIMISM_HARDHAT_LOCAL, - contracts: { - l1: { - L1CrossDomainMessenger: l1Messenger.address, - L1StandardBridge: l1Bridge.address, - }, - l2: { - L2CrossDomainMessenger: l2Messenger.address, - L2StandardBridge: l2Bridge.address, - }, - }, - bridges: { - ETH: { - Adapter: ETHBridgeAdapter, - l1Bridge: l1Bridge.address, - l2Bridge: l2Bridge.address, - }, - }, - }) - }) - - it('should trigger the withdraw ETH function with the given amount', async () => { - await expect(messenger.withdrawETH(100000)) - .to.emit(l2Bridge, 'WithdrawalInitiated') - .withArgs( - ethers.constants.AddressZero, - predeploys.OVM_ETH, - await l2Signer.getAddress(), - await l2Signer.getAddress(), - 100000, - '0x' - ) - }) - }) -}) diff --git a/packages/sdk/test/helpers/constants.ts b/packages/sdk/test/helpers/constants.ts deleted file mode 100644 index 8a13a005c808..000000000000 --- a/packages/sdk/test/helpers/constants.ts +++ /dev/null @@ -1,17 +0,0 @@ -import { ethers } from 'ethers' - -export const DUMMY_MESSAGE = { - target: '0x' + '11'.repeat(20), - sender: '0x' + '22'.repeat(20), - message: '0x' + '33'.repeat(64), - messageNonce: ethers.BigNumber.from(1234), - value: ethers.BigNumber.from(0), - minGasLimit: ethers.BigNumber.from(5678), -} - -export const DUMMY_EXTENDED_MESSAGE = { - ...DUMMY_MESSAGE, - logIndex: 0, - blockNumber: 1234, - transactionHash: '0x' + '44'.repeat(32), -} diff --git a/packages/sdk/test/helpers/index.ts b/packages/sdk/test/helpers/index.ts deleted file mode 100644 index f87cf0102a14..000000000000 --- a/packages/sdk/test/helpers/index.ts +++ /dev/null @@ -1 +0,0 @@ -export * from './constants' diff --git a/packages/sdk/test/l2-provider.spec.ts b/packages/sdk/test/l2-provider.spec.ts deleted file mode 100644 index 51709d25a185..000000000000 --- a/packages/sdk/test/l2-provider.spec.ts +++ /dev/null @@ -1,24 +0,0 @@ -/* eslint-disable @typescript-eslint/no-empty-function */ -import './setup' - -describe('L2Provider', () => { - describe('getL1GasPrice', () => { - it('should query the GasPriceOracle contract', () => {}) - }) - - describe('estimateL1Gas', () => { - it('should query the GasPriceOracle contract', () => {}) - }) - - describe('estimateL1GasCost', () => { - it('should multiply the estimated L1 gas cost by the L1 gas price', () => {}) - }) - - describe('estimateL2GasCost', () => { - it('should multiply the estimated L2 gas cost by the L1 gas price', () => {}) - }) - - describe('estimateTotalGasCost', () => { - it('should be the sum of the L1 and L2 gas cost estimates', () => {}) - }) -}) diff --git a/packages/sdk/test/setup.ts b/packages/sdk/test/setup.ts deleted file mode 100644 index a0cc88ed1237..000000000000 --- a/packages/sdk/test/setup.ts +++ /dev/null @@ -1,10 +0,0 @@ -/* External Imports */ -import chai = require('chai') -import Mocha from 'mocha' -import chaiAsPromised from 'chai-as-promised' - -chai.use(chaiAsPromised) -const should = chai.should() -const expect = chai.expect - -export { should, expect, Mocha } diff --git a/packages/sdk/test/utils/coercion.spec.ts b/packages/sdk/test/utils/coercion.spec.ts deleted file mode 100644 index 6f5111b07014..000000000000 --- a/packages/sdk/test/utils/coercion.spec.ts +++ /dev/null @@ -1,79 +0,0 @@ -import { Provider } from '@ethersproject/abstract-provider' -import { Contract } from 'ethers' -import { ethers } from 'hardhat' - -import { expect } from '../setup' -import { toSignerOrProvider, toTransactionHash } from '../../src' - -describe('type coercion utils', () => { - describe('toSignerOrProvider', () => { - it('should convert a string to a JsonRpcProvider', () => { - const provider = toSignerOrProvider('http://localhost:8545') - expect(Provider.isProvider(provider)).to.be.true - }) - - it('should not do anything with a provider', () => { - const provider = toSignerOrProvider(ethers.provider) - expect(provider).to.deep.equal(ethers.provider) - }) - }) - - describe('toTransactionHash', () => { - describe('string inputs', () => { - it('should return the input if the input is a valid transaction hash', () => { - const input = '0x' + '11'.repeat(32) - expect(toTransactionHash(input)).to.equal(input) - }) - - it('should throw an error if the input is a hex string but not a transaction hash', () => { - const input = '0x' + '11'.repeat(31) - expect(() => toTransactionHash(input)).to.throw( - 'Invalid transaction hash' - ) - }) - - it('should throw an error if the input is not a hex string', () => { - const input = 'hi mom look at me go' - expect(() => toTransactionHash(input)).to.throw( - 'Invalid transaction hash' - ) - }) - }) - - describe('transaction inputs', () => { - let AbsolutelyNothing: Contract - before(async () => { - AbsolutelyNothing = (await ( - await ethers.getContractFactory('AbsolutelyNothing') - ).deploy()) as any - }) - - it('should return the transaction hash if the input is a transaction response', async () => { - const tx = await AbsolutelyNothing.doAbsolutelyNothing() - expect(toTransactionHash(tx)).to.equal(tx.hash) - }) - - it('should return the transaction hash if the input is a transaction receipt', async () => { - const tx = await AbsolutelyNothing.doAbsolutelyNothing() - const receipt = await tx.wait() - expect(toTransactionHash(receipt)).to.equal(receipt.transactionHash) - }) - }) - - describe('other types', () => { - it('should throw if given a number as an input', () => { - expect(() => toTransactionHash(1234 as any)).to.throw( - 'Invalid transaction' - ) - }) - - it('should throw if given a function as an input', () => { - expect(() => - toTransactionHash((() => { - return 1234 - }) as any) - ).to.throw('Invalid transaction') - }) - }) - }) -}) diff --git a/packages/sdk/test/utils/contracts.spec.ts b/packages/sdk/test/utils/contracts.spec.ts deleted file mode 100644 index be98fc6a6bb0..000000000000 --- a/packages/sdk/test/utils/contracts.spec.ts +++ /dev/null @@ -1,372 +0,0 @@ -/* eslint-disable @typescript-eslint/no-empty-function */ -import { Signer } from 'ethers' -import { ethers } from 'hardhat' - -import { expect } from '../setup' -import { - getOEContract, - getAllOEContracts, - CONTRACT_ADDRESSES, - DEFAULT_L2_CONTRACT_ADDRESSES, - L2ChainID, -} from '../../src' - -describe('contract connection utils', () => { - let signers: Signer[] - before(async () => { - signers = (await ethers.getSigners()) as any - }) - - describe('getOEContract', () => { - describe('when given a known chain ID', () => { - describe('when not given an address override', () => { - it('should use the address for the given contract name and chain ID', () => { - const addresses = CONTRACT_ADDRESSES[L2ChainID.OPTIMISM] - for (const [contractName, contractAddress] of [ - ...Object.entries(addresses.l1), - ...Object.entries(addresses.l2), - ]) { - const contract = getOEContract( - contractName as any, - L2ChainID.OPTIMISM - ) - expect(contract.address).to.equal(contractAddress) - } - }) - }) - - describe('when given an address override', () => { - it('should use the custom address', () => { - const addresses = CONTRACT_ADDRESSES[L2ChainID.OPTIMISM] - for (const contractName of [ - ...Object.keys(addresses.l1), - ...Object.keys(addresses.l2), - ]) { - const address = '0x' + '11'.repeat(20) - const contract = getOEContract(contractName as any, 1, { - address, - }) - expect(contract.address).to.equal(address) - } - }) - }) - }) - - describe('when given an unknown chain ID', () => { - describe('when not given an address override', () => { - it('should throw an error', () => { - expect(() => getOEContract('L1CrossDomainMessenger', 3)).to.throw() - }) - }) - - describe('when given an address override', () => { - it('should use the custom address', () => { - const address = '0x' + '11'.repeat(20) - const contract = getOEContract('L1CrossDomainMessenger', 3, { - address, - }) - expect(contract.address).to.equal(address) - }) - }) - }) - - describe('when connected to a valid address', () => { - it('should have the correct interface for the contract name', () => { - const contract = getOEContract( - 'L1CrossDomainMessenger', - L2ChainID.OPTIMISM - ) - expect(contract.sendMessage).to.not.be.undefined - }) - - describe('when not given a signer or provider', () => { - it('should not have a signer or provider', () => { - const contract = getOEContract( - 'L1CrossDomainMessenger', - L2ChainID.OPTIMISM - ) - expect(contract.signer).to.be.null - expect(contract.provider).to.be.null - }) - }) - - describe('when given a signer', () => { - it('should attach the given signer', () => { - const contract = getOEContract( - 'L1CrossDomainMessenger', - L2ChainID.OPTIMISM, - { - signerOrProvider: signers[0], - } - ) - expect(contract.signer).to.deep.equal(signers[0]) - }) - }) - - describe('when given a provider', () => { - it('should attach the given provider', () => { - const contract = getOEContract( - 'L1CrossDomainMessenger', - L2ChainID.OPTIMISM, - { - signerOrProvider: ethers.provider as any, - } - ) - expect(contract.signer).to.be.null - expect(contract.provider).to.deep.equal(ethers.provider) - }) - }) - }) - }) - - describe('getAllOEContracts', () => { - describe('when given a known chain ID', () => { - describe('when not given any address overrides', () => { - it('should return all contracts connected to the default addresses', () => { - const contracts = getAllOEContracts(L2ChainID.OPTIMISM) - const addresses = CONTRACT_ADDRESSES[L2ChainID.OPTIMISM] - for (const [contractName, contractAddress] of Object.entries( - addresses.l1 - )) { - const contract = contracts.l1[contractName] - expect(contract.address).to.equal(contractAddress) - } - for (const [contractName, contractAddress] of Object.entries( - addresses.l2 - )) { - const contract = contracts.l2[contractName] - expect(contract.address).to.equal(contractAddress) - } - }) - }) - - describe('when given address overrides', () => { - it('should return contracts connected to the overridden addresses where given', () => { - const overrides = { - l1: { - L1CrossDomainMessenger: '0x' + '11'.repeat(20), - }, - l2: { - L2CrossDomainMessenger: '0x' + '22'.repeat(20), - }, - } - const contracts = getAllOEContracts(L2ChainID.OPTIMISM, { overrides }) - const addresses = CONTRACT_ADDRESSES[L2ChainID.OPTIMISM] - for (const [contractName, contractAddress] of Object.entries( - addresses.l1 - )) { - const contract = contracts.l1[contractName] - if (overrides.l1[contractName]) { - expect(contract.address).to.equal(overrides.l1[contractName]) - } else { - expect(contract.address).to.equal(contractAddress) - } - } - for (const [contractName, contractAddress] of Object.entries( - addresses.l2 - )) { - const contract = contracts.l2[contractName] - if (overrides.l2[contractName]) { - expect(contract.address).to.equal(overrides.l2[contractName]) - } else { - expect(contract.address).to.equal(contractAddress) - } - } - }) - }) - }) - - describe('when given an unknown chain ID', () => { - describe('when given address overrides for all L1 contracts', () => { - describe('when given address overrides for L2 contracts', () => { - it('should return contracts connected to the overridden addresses where given', () => { - const l1Overrides = {} - for (const contractName of Object.keys( - CONTRACT_ADDRESSES[L2ChainID.OPTIMISM].l1 - )) { - l1Overrides[contractName] = '0x' + '11'.repeat(20) - } - - const contracts = getAllOEContracts(3, { - overrides: { - l1: l1Overrides as any, - l2: { - L2CrossDomainMessenger: '0x' + '22'.repeat(20), - }, - }, - }) - - for (const [contractName, contract] of Object.entries( - contracts.l1 - )) { - expect(contract.address).to.equal(l1Overrides[contractName]) - } - - expect(contracts.l2.L2CrossDomainMessenger.address).to.equal( - '0x' + '22'.repeat(20) - ) - }) - }) - - describe('when not given address overrides for L2 contracts', () => { - it('should return contracts connected to the default L2 addresses and custom L1 addresses', () => { - const l1Overrides = {} - for (const contractName of Object.keys( - CONTRACT_ADDRESSES[L2ChainID.OPTIMISM].l1 - )) { - l1Overrides[contractName] = '0x' + '11'.repeat(20) - } - - const contracts = getAllOEContracts(3, { - overrides: { - l1: l1Overrides as any, - }, - }) - - for (const [contractName, contract] of Object.entries( - contracts.l1 - )) { - expect(contract.address).to.equal(l1Overrides[contractName]) - } - - for (const [contractName, contract] of Object.entries( - contracts.l2 - )) { - expect(contract.address).to.equal( - DEFAULT_L2_CONTRACT_ADDRESSES[contractName] - ) - } - }) - }) - }) - - describe('when given address overrides for some L1 contracts', () => { - it('should throw an error', () => { - expect(() => - getAllOEContracts(3, { - overrides: { - l1: { - L1CrossDomainMessenger: '0x' + '11'.repeat(20), - }, - }, - }) - ).to.throw() - }) - }) - - describe('when given address overrides for no L1 contracts', () => { - it('should throw an error', () => { - expect(() => getAllOEContracts(3)).to.throw() - }) - }) - }) - - describe('when not given a signer or provider', () => { - it('should not attach a signer or provider to any contracts', () => { - const contracts = getAllOEContracts(L2ChainID.OPTIMISM) - for (const contract of Object.values(contracts.l1)) { - expect(contract.signer).to.be.null - expect(contract.provider).to.be.null - } - for (const contract of Object.values(contracts.l2)) { - expect(contract.signer).to.be.null - expect(contract.provider).to.be.null - } - }) - }) - - describe('when given an L1 signer', () => { - it('should attach the signer to the L1 contracts only', () => { - const contracts = getAllOEContracts(L2ChainID.OPTIMISM, { - l1SignerOrProvider: signers[0], - }) - for (const contract of Object.values(contracts.l1)) { - expect(contract.signer).to.deep.equal(signers[0]) - } - for (const contract of Object.values(contracts.l2)) { - expect(contract.signer).to.be.null - expect(contract.provider).to.be.null - } - }) - }) - - describe('when given an L2 signer', () => { - it('should attach the signer to the L2 contracts only', () => { - const contracts = getAllOEContracts(L2ChainID.OPTIMISM, { - l2SignerOrProvider: signers[0], - }) - for (const contract of Object.values(contracts.l1)) { - expect(contract.signer).to.be.null - expect(contract.provider).to.be.null - } - for (const contract of Object.values(contracts.l2)) { - expect(contract.signer).to.deep.equal(signers[0]) - } - }) - }) - - describe('when given an L1 signer and an L2 signer', () => { - it('should attach the signer to both sets of contracts', () => { - const contracts = getAllOEContracts(L2ChainID.OPTIMISM, { - l1SignerOrProvider: signers[0], - l2SignerOrProvider: signers[1], - }) - for (const contract of Object.values(contracts.l1)) { - expect(contract.signer).to.deep.equal(signers[0]) - } - for (const contract of Object.values(contracts.l2)) { - expect(contract.signer).to.deep.equal(signers[1]) - } - }) - }) - - describe('when given an L1 provider', () => { - it('should attach the provider to the L1 contracts only', () => { - const contracts = getAllOEContracts(L2ChainID.OPTIMISM, { - l1SignerOrProvider: ethers.provider as any, - }) - for (const contract of Object.values(contracts.l1)) { - expect(contract.signer).to.be.null - expect(contract.provider).to.deep.equal(ethers.provider) - } - for (const contract of Object.values(contracts.l2)) { - expect(contract.signer).to.be.null - expect(contract.provider).to.be.null - } - }) - }) - - describe('when given an L2 provider', () => { - it('should attach the provider to the L2 contracts only', () => { - const contracts = getAllOEContracts(L2ChainID.OPTIMISM, { - l2SignerOrProvider: ethers.provider as any, - }) - for (const contract of Object.values(contracts.l1)) { - expect(contract.signer).to.be.null - expect(contract.provider).to.be.null - } - for (const contract of Object.values(contracts.l2)) { - expect(contract.signer).to.be.null - expect(contract.provider).to.deep.equal(ethers.provider) - } - }) - }) - - describe('when given an L1 provider and an L2 provider', () => { - it('should attach the provider to both sets of contracts', () => { - const contracts = getAllOEContracts(L2ChainID.OPTIMISM, { - l1SignerOrProvider: ethers.provider as any, - l2SignerOrProvider: ethers.provider as any, - }) - for (const contract of Object.values(contracts.l1)) { - expect(contract.signer).to.be.null - expect(contract.provider).to.deep.equal(ethers.provider) - } - for (const contract of Object.values(contracts.l2)) { - expect(contract.signer).to.be.null - expect(contract.provider).to.deep.equal(ethers.provider) - } - }) - }) - }) -}) diff --git a/packages/sdk/test/utils/merkle-utils.spec.ts b/packages/sdk/test/utils/merkle-utils.spec.ts deleted file mode 100644 index 5c9fbcbf009a..000000000000 --- a/packages/sdk/test/utils/merkle-utils.spec.ts +++ /dev/null @@ -1,60 +0,0 @@ -import { ethers } from 'ethers' - -import { expect } from '../setup' -import { maybeAddProofNode } from '../../src/utils/merkle-utils' - -describe('Merkle Utils', () => { - describe('maybeAddProofNode', () => { - // Test taken from opBNB testnet withdrawal. - it('should add a proof node when final node is inside of a branch', () => { - const key = ethers.utils.keccak256( - '0x5cd60ecef836e75dd12539abe8ad5f4ba0dc4fcaae2c45024c69bd9e20746eba' - ) - const proof = [ - '0xf90211a0feb6c6afca5ea568e0b7183d7292c112e9d28a1c846d889636d5c8822463aa77a0df719a24d8049d04a47e0e07ba493110fed0665d897c0ffdb05a7ce474782026a01bec363c069dc337ce16b4ca5cffa11d20e305fd7dcf6d87547b151c31aabf0ca00583d5a451bfa01f5e51d992e129ee17e65adda9495bda77898187484625aa9ea0bd9fef27cd52c2721e519bcd40c63a818095374e505a3bbd88db29c6c4521982a009a31937313c5b2bc06da6fec4075110f19526a9dbde3629ebe36aa8cd8e0851a0555f89002a34f6570bab438e69c5d8b855f2664e31f5dd59b807d0956577cc81a07e6f59ec99405b7afa436bf62abd098a85b43861fd3a9da3214a5d46b2d12543a03e7e883b0406cb781e5bf2a71cafc02ebbcdb0684ac03439633faf339d1259e2a0fa154fcf0bedd25aacac74e9864e4b96742c3d06f58c170cd320ade69db16c88a07e34154a031da5e50a3886efcb15c6681deeb20832726f083f80b03678b56d33a0d24408a39fb57838fdfe85c68f7eac74daab709ec3c22dfd0a579c1dbd64861aa093c1837ab2907fc51de7e918b81b997d60a6c8a18e3538720ee0d0f369530c26a0fca1af24293865f21d18d5eb823e0ecc007306823864f11d59c1c5c370fb22c2a0de8c894b5067d637df401aa6b963a3fc52b774abbedf6688e25bbf9a29672b7ca021c85d42de67601599e605d9ed1257451d1ce403d2478496d0a99d60db643d5280', - '0xf90211a02288f14667ef872b449e0f0f5526c2ad3634dcdb7376616d18fd87f6af9293bfa027223b95acda1508dbc42caac8edfb422759eedd13628e4dff0c5bf79d275182a0352a96940c817156a6e33c6f6cb2010ac216296f6e912c335982ba75ffb11898a0c3b7339a174d0a5fd842d3bb946a2ba6d9c1088215d9c3f56449af4dabb59e1ca03b331c72db0a3e0b51167ecb4d0ee76126181e3a54718e7cdefbf89ae0ae0d7ea03f162cadc26daa12d91e9ba459c9e61008ef57314e9cb810f074a878f2b81910a00dc670d0489ec214e2a636274d1e8b2df9db343218503ae2bf7ed868d8ab553fa0bffdd8cf5fe58452a64254f44e28ecd886964898fbab68711749423478d9c94ea0ca722fcaddd052f5a8ddce25c0c4161cd9e5552a0697ceccba540b0520cfcb61a0ffc0036ebf8ed2d9603de8c22d36cdc3fb451dd92a23adefe5593a4d8a12299da0bff43610f0c3d44e73e741d58f34f4d8e25aa3f67e0796241210bf321c2f1117a0341dcdbf2722bd7eacc3af46b6a9d80bb775dace93808a6737a1e135b9b225f3a07b3c3ec4c199c11374ba2dd28227e8c1efdbd8cb065768eff27e3918647eaccfa0e5a903a66eedfe8ea6d28a0f93cc91fc5f00f612a54aeeff100dafe84182a815a0203b138ec5130556a58d06184fdc399cb726954d28fe9fc68131f23d211382f5a057e92c1aec0a5b4e723cbbb3928d1008c9a9b4a26206656fccf70c14136a77de80', - '0xf90211a0437a65e2661356d938aa5321927d85003770566f25f121ec0dba4ad4acae9a8ca04acf516468076bf35f8c10e6aa904612fe08fcfba5c7b76bd87a5fe38e212c4da08db4fa1d774e1653468078c4c6a26cc6236025d6ab88dd1c02dae7c8bc7b19f7a03fb292d186e2d63e163788b3af313403cd12bc4b839037be4ad15a6fbbee217aa0dc569eab6a0b0a1d1dd7d12a24512bff7d4a6f5dc55a5a2dea31ed1a5415d383a0e4eaab256b73b4abc3402f44b6fa90a0854b733cdd5b884915ae8c07f5c78002a075ccef6818cc6c2870a70a0b41e3904ba2355937e028b02cb54a7ab321492357a0b059014d41d68c6c28b7de8f06b57c015210167d64c8589f9d7801dd4f025a60a07bf03f4912eaba2dd295222c1e01c1ddd7baedad61cf90d4e5987fc7ae1c6beaa0309d5aff3d1194cf259389cbb365e43548291aa9125d0550ab4908d1cc958844a0ff3fa5bba3bd95b08506336101c1c71cb920dd3ee68d8120654dac8f4b05d390a03a7b3de7b7476d9bf665396b718a28f8d746828bbf51a396e43669a4c90ca770a0913bc7b7ef04689a19cebf2c785f4eea68ccf9c97be94bb5bdd1346d4b145147a0cc21ab258bc2d961534438ddbbf185de30f8387acbc40f89857d88a23f90047ea0cf8b6876bd0cfd19ddd39fcfe88470d76757f64ba8496cfc382c92ed65706586a051de24dd2a27ffce89bb1dfcd6aa33469a91b50c4332ff9ef45d3cc917613a5c80', - '0xf90211a00aaeb3f8caea8f7167815fcdf1470777f7e100c781bc9ed79afefac295bb0d03a04b9f1d4ade00185fc62732b28abfb243afff140ebfa034daa4f139e0015a2195a0f9608d7d4346638e5ad4219ef6ea0769aa9fdb4bc6207831cf0f64854b072c2da0b953f4ee5f8ae17d9da8e3c1efaf9a822d0301dab05cae4b776fbd666fce8158a0bd8460bbbcfa3e02af0909445883176e3b65c85a63c6f91c2994fa2979228726a024f9c1c9952c2b6edec11955b50eaccd1ef44099db309f807f85aa4c4130b31ea056ad08d1e812df59fb54d2b847b1e7fa0872aaa1f3ac8f4e314d6893baece56aa02ca9f7cf8514dcca9401081f94b824f03b4d74dc690dfeed6779ddee4a9ad72ba050dffdadd79fbb8d857ad658864cd9cb19e69c73f8ba9c241fc2b451e2124320a00377a910bb501d1b22b7b03a3fa60aa47facf33515c10b0742fb76bd5a3d7a6ca0abcffd053ac378f2aa4d90e95c64dd7cc450fe6f961f9f55722cc49ef7b47f7ba042a8b3431675d5909bad710d519dd2c5d3287f3af8641122cce53b137087ce6ba0b77542431b232d0aabbbdf27e1c1adab761e144d396d0658ec1a84a712906a73a099ca74decdad4e079c0d1f35c8da403acbe65bf284253dab1be788f1808687eba06d866839d5ce08a75b3c8a2383b7eec6120ab32c7dfbe9b036831fc3101c8250a0fd315d671bf51da89b2db014d0f199be522fbf8e19d0276d0a14a1c66c1df8ac80', - '0xf901f1a0d6228395f59dea0ead05458d95d54c315c7feddf6416bb41aed62dc165446a6ca051e1ecb5424d948d386c0d291bb674fac4c47349f67e40a77850f54254b612b5a0e3b1d858fc2bb8001052eb3a36c9e2bea2966c795848aff0e5fb3cd779cfb565a0046a3c69a3639aa8bc1b3cf2c052d54424a88d2ea90a6388595b160ef5ef161780a0b2b1a778cbd8a3257ff7114116d892491a3ab148be723e22262b842680a9b29ea026da2284e756fcade15d922c0b8f6282a008e1c842e5030a307b3ea2e9a55726a026c0862e8e9e06ddef9ce37044fe2228a3ba9863faaf0cf1ad0863d41f7d7f13a0bcfbf48375296ad05ade4710ffe7e2b419fe246623369f7a6a4fa6f720bb185fa0d982dbbef7671cf7add6efd8612d47477b77f40d62e11983fe4478e959c0a86da0b3bf440462efb53c7056f5ff3ea134a072363a95a15a6945b83e416e6adee245a00396e89cb82998271f55ef0e892d456a7bbf624c23bf751f1ea2da6a7690be42a06f2588a03a07740fe4d300795096252abeb6b984e41b4f7027df84c1c520ea84a0ce163ce486c3de11ca2f6656f5dcf82e62496cb0d5472e042dede34d0e1aedd8a0fec8a8bfbf3e3418c4730c3c7c047cd73695c4c429f6ec6babc7165b9b27e635a002711d0ce2951376bac13daf1d3bcf359a90f68bc804b6b2b2e9efe09a8157af80', - '0xf89180808080808080a0326fe6fc4a847e4db1144153b15d0d3811f0317239f2885cc2a383825ccb1d8480a04455f6e0d1f8a2022ea33d5e6a537e384483dfccd19d07d21047e9b264b56e3c808080a06174ffa3ff6accab10abb5d61000db050324c608b10c0344a3eec6fa0107a079a0d494a04c23ba556fc3bdbe234562fe6825d55f3aaaa81e43415b8070a733d0bd8080', - '0xe482000fa03cb626e2849a157c57ca2e62c3dd139cf803efe281f5b6331b3ba92280dd8c42', - '0xf84d8080808080de9c332c35a4d03ec6ab9b3ffd06c69652ce8e02ff95537f98b7a0feb29c01808080de9c36620d27102d4799d259fe08f690c0a21b80d0a1a903db682417a23f0180808080808080', - ] - const modifiedProof = maybeAddProofNode(key, proof) - expect(modifiedProof).to.deep.equal([ - ...proof, - '0xde9c36620d27102d4799d259fe08f690c0a21b80d0a1a903db682417a23f01', - ]) - }) - - // Test taken from opBNB testnet withdrawal. - it('should not add a proof node when final node is a leaf node', () => { - const key = ethers.utils.keccak256( - '0x55b08006167f308d31af5ea9f302384725df906124e39e0eb2c6d040498e0fae' - ) - const proof = [ - '0xf90211a08c7918779c1c4435737b269573de96df28e1ec8c5847d7317906971b4c5fa73fa018679d112e60f815616a167692ea7d821691f34bed06df12c7b121a4c7b8384ba06b0a09649c9e7df1bde1c7448243c954dfecae8301b7f6bbe7d8f0b781733194a0258988e63a01754eafaffa3837ccc321c4f99d50869d04c09e7ab587988ecfa6a0a5b325ae646fd16ad7daac9d6da2ea244d456fa1a219f828cb9a5785f01bbf4ea0532b1427977ae09ee5344667910500207fd500912f9e1c6f5e7aa6b8b333a717a04a32b16d0d56f217216a9dae9eea953883ff3bcf1a9578d60d6bb28bbf4b6655a009e8cabb94c504eeb5cf15a151ed4b99be678bf969ee30be5d8aaf1312210079a0938dedf6ad32b04a9a2da09f29e481c51d7cf440d62651ed570355e12a4858d8a0b6bae212efc7179842abc76e9d6b2850b05336720b81dac467e942f7f6cd6b9ba0be45a8205c8c75ebe83c10cc9e87a597820d7e3ca691f9d1549e12a6f050a296a0c65bd95874adb4054ae8b346f2d2ccc88e76555c662b230d62072db36933508ca0e21442e3384b11c414e4a6bc2d56e71dbbbc672c38ac00bd63386ad55c590955a0d3d178f5be5f808d97ce22d48adce909ecf326cc5d9a0e7b64af616ca2d3e12ca09475833e7206cd83f7301f995617825f6d7050c782e17495ce5eb0556c2b68c4a09638ed778938e150e4c68cbcaf9bd47f97e1a6a6d6d2bbf9bc516450166a1ed980', - '0xf90211a0a3f8f3795f08496d4cd1b0c054c337d10d28fa2e9725162da7714c20d3b30c88a05856b0aa4c58cd715545c05ddb8bd93835dcd0ecbc7c2b139266af1c1850a671a000b3e2386218f9308469c731f6d53d5fb27512082390826956c8a234854a88aca0e525d6f4fa38fec4694f5cdb589156dc3a4d829861e1228b502c0130a4834ceaa0a414e804e76eb8863d1804ae04189237119b0415bf57c8a6a4ab176ad9f78eeca022aa4baf04a82bb83148c6ff6261dec1165f5d2f9bdf0ce73dfb2c9719fb8597a06fe7a289928f7fbd860aafb95945dcc2699bf7bf2010d6aa83b9f49308e968c9a008d5e746de17a948d6e7fc864286215d008e7f2d592cf7269df4dab0a3486215a0c39c7aa088d057db66179d7354b3f0d48f6d3ed2e62f8a840d9117b7b66a64bda0dd4ccdc76f721cf04cdf14d1d8a1821501d89c3d44ed5ed92b5a820431b36990a06c89982d73cc213516be264bb2fb6c969131f542afbc460ff781b839290e42f8a09954b3cbc392cdefb5664bc8483e1400def7846c631728d814b1a163ba871c44a0215b32a1491899a86be9c986dd695612a3964235b20e73158e501e6005cec689a0c1a8d7e66e95c7b661018c01dce2732f0f88614caa69e0e0848f5a750c8a9bbaa01aab317da329eee7bcdb91ee23d9a776f2a662bc672cc89f9d8f1c40cf94a4d5a013b5fc28d7d795f1203db98a7f49493ec4dbc6e7f19415131fd724274d53b93b80', - '0xf90211a099cf6b57cf52d79d997c6c7cacc880d9eecba4d91b711e94567d153a4e7a0586a05dd28dc2c3001cd399773fec132570d32a88cf439c15d8ed1750692892019bbda0419a8369667afcc1bd0eb25aa2ee01aa9914389f1c4c5b8cfdb76c7387b1efeda0c31b4168d817e9e6c1f8d9241cb61d3e40417396438799cae60b21036c569585a02cb6faef5768eb7381530c01c30a69ee9d6b74b63ad7875df8dce0d3f9e33beea0722b13f67dcc8e022e2f2f6cf42b697330425f910499f9f69455e9b9dc7a5696a0c2da3ee274178cd500418aa82c86116f8a19c03f50680589689cd76c526885baa0de4fcbd8ef4edef419cac8f12a67f76c27a7d53a47d0408251c89b191599e2a6a01bec2c60b7ab411ffe01ef36723a82b1e36df58759e4356b90f0b939cf9f7feca0823b67e452e64a3986da2836b6398bfe6dd6257b1313b649bd38b8109b442e86a0fe8fd7cf12be37c649531fa445116c53258d76664ba95b84f6adac356015f469a04d68070a9bd5b183068eafc1edfec122dba0ded10725ebc468cb0b7b7fba15d6a051b612dfba41f35f8c827ee18387bf6e3316cb8494fd30d88a091b5405bc5d8ca01c622f8ce84c20a5d1055a984e405638509e2e8683d1fa89725b4855500f353aa01e795b4bd4df111c9528d22c7964d89f96cdb5f7217fda91132b10b30782965fa0d91eacec2f75501bb1e9c7c3dd7d2cdf12d206627f096da1408573f2775646ce80', - '0xf90211a03b7d6150ad44f8399b7fa60d27034db408b0fe2f42770312dbc12220205ba6b2a0c34225fedb6a5a5351429e52c6dc637abed3bde536318fbb9e592630dbaa9ff8a0a3a4cbf9ee86518067c263c9ea3c59683306519f5ad518f8c7ccb298e8b405dda0bb9847a6a1e58287f2f5e0dd2fc9a7e78118639f1d9768d970114fd72cf4bb94a00bd41abbd004fc6aabb2ad6ca5ad6c8adc9188263b41e3c5c1c640bc6cdad909a01ddb2f8f80a1856248f813e3f066f12a0699c83c7a620a3a156f8d7320887901a0716be43af95da7bb5b22ffd86b67790da8f6470bdb771a1c72c3d8b918101f77a08e844b3e7b41dbf69f7cb59df673d21dd0d0679b387d136e77e91e01c2aa83cda01086f25f4f678183dc4a5398a0c608f28578619d5ef25890457f266dfd0b2b45a05c463dd5c575e7440ceea9322b3a50fc1111f45f15d8a2bb822efe430cb321e9a0deb669961500f680770e94ee2253cd5fbb20d30a0d2cb10a35efd0c1a7827ebaa090fb4c646e0a7d00b427d27372532e003f6e430fef4a896b26da3d334b5e35bea0e00315beb0ceadcbfe33727cfdb08d98c86dca534ceb50e799f2bf914e18da66a0b32fcca5247e924812fedc00a2f6c72ef36dfb28896a315bbbad8f7dac09623ca07e5d50949d89b497620383abcc9fe952911f4821b50184261c3dda6e46a0b815a039921c389fef00713e4ad8897bc5c68781fee90d0873a42cfd814b8709152c4380', - '0xf901f1a01dd4ceeb1ab5bc49adb270f4c031783adcc6d4b8b2c874778310b84188fe9b64a0747c08e80562666c517c00dfb2648e71273377b1412b56ad5e45f633f952229aa0991ce5972ae42c944f7d7fafb8cf01913a0658efd48ea4beff7dfc4c45c0f21aa0fe8c9b0e45134639ea41c880910a73d49d3c5fb8e3cf003eda7ceb48891b9d12a0d5748723a79117e595d805b90c5da4f28a88ca06ab8a3b540509fc5f74487be2a04724502db500742f7bf9f64bd6d0c9cecb150dcacd8f41b235baa3228120c3dc80a05ba19409d69154ee9397c0451ce8fe478a4a17097c49df7f25aa349243522455a01f16b5317ef849b7d520e74f02e3a1b5d3aa5454a009c398f6917ef72d12fd3aa0354fbfecc5fe46c76395042141308381ef0f59e0ffae159d1758b287dcd92c2ea065df8dd7ad7fe8accdc96ae5bf97802b1425dec3cef9c148f49c736dc8151faaa0eb440cd657329946458789ab7ba02df5dcd77a28095009305001fe5124424079a05fa06e6354a138012417afd550c71a9a08164bceccf652f150d1ea6a31f89d20a06cc7b02dce36338aa84041a725bb47b87bc93090b676776b53c0a7c654d93361a02c4ec483c0b8b4d148c133e2ea471b3432d310ed7c43d2b983203bd08adbb3eda025964bfbdd4d19d5d5f094ac4ca8bb2476047f3c5328cb1c84a24ee5bea5fdcb80', - '0xf851808080a045d583df49281f7f8c545ab91f4d35ba48873cc4da6deb2c0703135959fc8ec080808080a0ca2836f17b4c1af21e2531f7036a069ba8ef535650495820731ca669590dfddb8080808080808080', - '0xe09e202ec4eafbdfe1b7f218e5f087854c923c7f41b85d3ada15c32bef29588a01', - ] - const modifiedProof = maybeAddProofNode(key, proof) - expect(modifiedProof).to.deep.equal(proof) - }) - - // Test taken from MerkleTrie solidity test suite. - it('should not add a proof node when the value itself is inside a branch node', () => { - const key = '0x6b657933' - const proof = [ - '0xe68416b65793a0f3f387240403976788281c0a6ee5b3fc08360d276039d635bb824ea7e6fed779', - '0xf87180a034d14ccc7685aa2beb64f78b11ee2a335eae82047ef97c79b7dda7f0732b9f4ca05fb052b64e23d177131d9f32e9c5b942209eb7229e9a07c99a5d93245f53af18a09a137197a43a880648d5887cce656a5e6bbbe5e44ecb4f264395ccaddbe1acca80808080808080808080808080', - '0xf839808080808080c9823363856176616c338080808080808080809f31323334353637383930313233343536373839303132333435363738393031', - ] - const modifiedProof = maybeAddProofNode(key, proof) - expect(modifiedProof).to.deep.equal(proof) - }) - }) -}) diff --git a/packages/sdk/test/utils/message-utils.spec.ts b/packages/sdk/test/utils/message-utils.spec.ts deleted file mode 100644 index 0f57a796bc32..000000000000 --- a/packages/sdk/test/utils/message-utils.spec.ts +++ /dev/null @@ -1,78 +0,0 @@ -import { BigNumber } from 'ethers' - -import { expect } from '../setup' -import { - migratedWithdrawalGasLimit, - hashLowLevelMessage, - hashMessageHash, -} from '../../src/utils/message-utils' - -const goerliChainID = 420 - -describe('Message Utils', () => { - describe('migratedWithdrawalGasLimit', () => { - it('should have a max of 25 million', () => { - const data = '0x' + 'ff'.repeat(15_000_000) - const result = migratedWithdrawalGasLimit(data, goerliChainID) - expect(result).to.eq(BigNumber.from(25_000_000)) - }) - - it('should work for mixes of zeros and ones', () => { - const tests = [ - { input: '0x', result: BigNumber.from(200_000) }, - { input: '0xff', result: BigNumber.from(200_000 + 16) }, - { input: '0xff00', result: BigNumber.from(200_000 + 16 + 16) }, - { input: '0x00', result: BigNumber.from(200_000 + 16) }, - { input: '0x000000', result: BigNumber.from(200_000 + 16 + 16 + 16) }, - ] - - for (const test of tests) { - const result = migratedWithdrawalGasLimit(test.input, goerliChainID) - expect(result).to.eq(test.result) - } - }) - }) - - /** - * Test that storage slot computation is correct. The test vectors are - * from actual migrated withdrawals on goerli. - */ - describe('Withdrawal Hashing', () => { - it('should work', () => { - const tests = [ - { - input: { - messageNonce: BigNumber.from(100000), - sender: '0x4200000000000000000000000000000000000007', - target: '0x5086d1eEF304eb5284A0f6720f79403b4e9bE294', - value: BigNumber.from(0), - minGasLimit: BigNumber.from(207744), - message: - '0xd764ad0b00000000000000000000000000000000000000000000000000000000000186a00000000000000000000000004200000000000000000000000000000000000010000000000000000000000000636af16bf2f682dd3109e60102b8e1a089fedaa80000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000c000000000000000000000000000000000000000000000000000000000000000e4a9f9e67500000000000000000000000007865c6e87b9f70255377e024ace6630c1eaa37f0000000000000000000000003b8e53b3ab8e01fb57d0c9e893bc4d655aa67d84000000000000000000000000b91882244f7f82540f2941a759724523c7b9a166000000000000000000000000b91882244f7f82540f2941a759724523c7b9a166000000000000000000000000000000000000000000000000000000000000271000000000000000000000000000000000000000000000000000000000000000c0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000', - }, - result: - '0x7c83d39edf60c0ab61bc7cfd2e5f741efdf02fd6e2da0f12318f0d1858d3773b', - }, - { - input: { - messageNonce: BigNumber.from(100001), - sender: '0x4200000000000000000000000000000000000007', - target: '0x5086d1eEF304eb5284A0f6720f79403b4e9bE294', - value: BigNumber.from(0), - minGasLimit: BigNumber.from(207744), - message: - '0xd764ad0b00000000000000000000000000000000000000000000000000000000000186a10000000000000000000000004200000000000000000000000000000000000010000000000000000000000000636af16bf2f682dd3109e60102b8e1a089fedaa80000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000c000000000000000000000000000000000000000000000000000000000000000e4a9f9e67500000000000000000000000007865c6e87b9f70255377e024ace6630c1eaa37f0000000000000000000000004e62882864fb8ce54affcaf8d899a286762b011b000000000000000000000000b91882244f7f82540f2941a759724523c7b9a166000000000000000000000000b91882244f7f82540f2941a759724523c7b9a166000000000000000000000000000000000000000000000000000000000000271000000000000000000000000000000000000000000000000000000000000000c0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000', - }, - result: - '0x17c90d87508a23d806962f4c5f366ef505e8d80e5cc2a5c87242560c21d7c588', - }, - ] - - for (const test of tests) { - const hash = hashLowLevelMessage(test.input) - const messageSlot = hashMessageHash(hash) - expect(messageSlot).to.eq(test.result) - } - }) - }) -}) diff --git a/packages/sdk/tsconfig.json b/packages/sdk/tsconfig.json deleted file mode 100644 index c59f2e54c42b..000000000000 --- a/packages/sdk/tsconfig.json +++ /dev/null @@ -1,12 +0,0 @@ -{ - "extends": "../../tsconfig.json", - "compilerOptions": { - "lib": ["ES2021"], - "rootDir": "./src", - "outDir": "./dist" - }, - "include": [ - "src/**/*", - "src/forge-artifacts/*.json" - ] -} diff --git a/packages/sdk/vitest.config.ts b/packages/sdk/vitest.config.ts deleted file mode 100644 index 45da2e6aa84a..000000000000 --- a/packages/sdk/vitest.config.ts +++ /dev/null @@ -1,9 +0,0 @@ -import { defineConfig } from 'vitest/config' - -// https://vitest.dev/config/ - for docs -export default defineConfig({ - test: { - setupFiles: './setupVitest.ts', - include: ['test-next/*.{test,spec}.{js,mjs,cjs,ts,mts,cts,jsx,tsx}'], - }, -}) diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml deleted file mode 100644 index 84cdbeaf6b63..000000000000 --- a/pnpm-lock.yaml +++ /dev/null @@ -1,13508 +0,0 @@ -lockfileVersion: '9.0' - -settings: - autoInstallPeers: true - excludeLinksFromLockfile: false - -pnpmfileChecksum: vipskp6rjsbh4jjdio2kmcz6ye - -importers: - - .: - dependencies: - '@changesets/cli': - specifier: ^2.27.1 - version: 2.27.1 - devDependencies: - '@babel/eslint-parser': - specifier: ^7.23.10 - version: 7.23.10(@babel/core@7.22.10)(eslint@8.56.0) - '@changesets/changelog-github': - specifier: ^0.4.8 - version: 0.4.8 - '@types/chai': - specifier: ^4.3.11 - version: 4.3.11 - '@types/chai-as-promised': - specifier: ^7.1.8 - version: 7.1.8 - '@types/mocha': - specifier: ^10.0.6 - version: 10.0.6 - '@types/node': - specifier: ^20.11.17 - 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.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.4.5) - chai: - specifier: ^4.3.10 - version: 4.3.10 - depcheck: - specifier: ^1.4.7 - version: 1.4.7 - doctoc: - specifier: ^2.2.0 - version: 2.2.1 - eslint: - specifier: ^8.56.0 - version: 8.56.0 - eslint-config-prettier: - specifier: ^9.1.0 - 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(@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)(typescript@5.4.5))(eslint@8.56.0) - eslint-plugin-jsdoc: - specifier: ^48.0.6 - version: 48.0.6(eslint@8.56.0) - eslint-plugin-node: - specifier: ^11.1.0 - version: 11.1.0(eslint@8.56.0) - eslint-plugin-prefer-arrow: - specifier: ^1.2.3 - 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))(eslint@8.56.0)(prettier@2.8.8) - eslint-plugin-promise: - specifier: ^5.1.0 - version: 5.2.0(eslint@8.56.0) - eslint-plugin-react: - specifier: ^7.24.0 - version: 7.33.2(eslint@8.56.0) - eslint-plugin-unicorn: - specifier: ^50.0.1 - version: 50.0.1(eslint@8.56.0) - husky: - specifier: ^9.0.10 - version: 9.0.10 - lint-staged: - specifier: 15.2.0 - version: 15.2.0 - mocha: - specifier: ^10.2.0 - version: 10.2.0 - nx: - specifier: 18.2.2 - version: 18.2.2(@swc/core@1.4.13) - nx-cloud: - specifier: latest - version: 18.0.0 - nyc: - specifier: ^15.1.0 - version: 15.1.0 - prettier: - specifier: ^2.8.0 - version: 2.8.8 - rimraf: - specifier: ^5.0.5 - version: 5.0.5 - ts-mocha: - specifier: ^10.0.0 - version: 10.0.0(mocha@10.2.0) - typescript: - specifier: ^5.4.5 - version: 5.4.5 - wait-on: - specifier: ^7.2.0 - version: 7.2.0 - - endpoint-monitor: {} - - indexer/api-ts: - devDependencies: - tsup: - specifier: ^8.0.1 - 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(bufferutil@4.0.8)(utf-8-validate@5.0.7))(terser@5.26.0) - - packages/chain-mon: - dependencies: - '@eth-optimism/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 - '@eth-optimism/contracts-periphery': - specifier: 1.0.8 - version: 1.0.8 - '@eth-optimism/core-utils': - specifier: ^0.13.2 - version: 0.13.2(bufferutil@4.0.8)(utf-8-validate@5.0.7) - '@eth-optimism/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 - chai-as-promised: - specifier: ^7.1.1 - version: 7.1.1(chai@4.3.10) - dateformat: - specifier: ^4.5.1 - version: 4.5.1 - dotenv: - specifier: ^16.4.5 - version: 16.4.5 - ethers: - specifier: ^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(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(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(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(@swc/core@1.4.13)(@types/node@20.11.17)(typescript@5.4.5) - tsx: - specifier: ^4.7.0 - version: 4.7.0 - - 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.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.4.5) - tsx: - specifier: ^4.7.0 - version: 4.7.0 - typescript: - specifier: ^5.4.5 - version: 5.4.5 - - packages/sdk: - dependencies: - '@eth-optimism/contracts': - specifier: 0.6.0 - 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: ^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 - merkletreejs: - specifier: ^0.3.11 - version: 0.3.11 - rlp: - specifier: ^2.2.7 - version: 2.2.7 - semver: - specifier: ^7.6.0 - version: 7.6.0 - devDependencies: - '@ethersproject/abstract-provider': - specifier: ^5.7.0 - version: 5.7.0 - '@ethersproject/abstract-signer': - specifier: ^5.7.0 - version: 5.7.0 - '@ethersproject/transactions': - specifier: ^5.7.0 - version: 5.7.0 - '@nomiclabs/hardhat-ethers': - specifier: ^2.2.3 - 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(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 - '@types/chai-as-promised': - specifier: ^7.1.8 - version: 7.1.8 - '@types/mocha': - specifier: ^10.0.6 - version: 10.0.6 - '@types/node': - specifier: ^20.11.17 - version: 20.11.17 - '@types/semver': - specifier: ^7.5.7 - version: 7.5.7 - chai-as-promised: - specifier: ^7.1.1 - 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(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(bufferutil@4.0.8)(utf-8-validate@5.0.7) - hardhat: - specifier: ^2.20.1 - 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.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 - mocha: - specifier: ^10.2.0 - version: 10.2.0 - nyc: - specifier: ^15.1.0 - version: 15.1.0 - ts-node: - specifier: ^10.9.2 - 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.4.5) - typescript: - specifier: ^5.4.5 - version: 5.4.5 - viem: - 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(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': - resolution: {integrity: sha512-1Yjs2SvM8TflER/OD3cOjhWWOZb58A2t7wpE2S9XfBYTiIl+XFhQG2bjy4Pu1I+EAlCNUzRDYDdFwFYUKvXcIA==} - engines: {node: '>=0.10.0'} - - '@adraffy/ens-normalize@1.10.0': - resolution: {integrity: sha512-nA9XHtlAkYfJxY7bce8DcN7eKxWWCWkU+1GR9d+U6MbNpfwQp8TI7vqOsBsMcHoT4mBu2kypKoSKnghEzOOq5Q==} - - '@ampproject/remapping@2.2.1': - resolution: {integrity: sha512-lFMjJTrFL3j7L9yBxwYfCq2k6qqwHyzuUl/XBnif78PWTJYyL/dfowQHWE3sp6U6ZzqWiiIZnpTMO96zhkjwtg==} - engines: {node: '>=6.0.0'} - - '@babel/code-frame@7.22.13': - resolution: {integrity: sha512-XktuhWlJ5g+3TJXc5upd9Ks1HutSArik6jf2eAjYFyIOf4ej3RN+184cZbzDvbPnuTJIUhPKKJE3cIsYTiAT3w==} - engines: {node: '>=6.9.0'} - - '@babel/compat-data@7.23.5': - resolution: {integrity: sha512-uU27kfDRlhfKl+w1U6vp16IuvSLtjAxdArVXPa9BvLkrr7CYIsxH5adpHObeAGY/41+syctUWOZ140a2Rvkgjw==} - engines: {node: '>=6.9.0'} - - '@babel/core@7.22.10': - resolution: {integrity: sha512-fTmqbbUBAwCcre6zPzNngvsI0aNrPZe77AeqvDxWM9Nm+04RrJ3CAmGHA9f7lJQY6ZMhRztNemy4uslDxTX4Qw==} - engines: {node: '>=6.9.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 - - '@babel/generator@7.23.3': - resolution: {integrity: sha512-keeZWAV4LU3tW0qRi19HRpabC/ilM0HRBBzf9/k8FFiG4KVpiv0FIy4hHfLfFQZNhziCTPTmd59zoyv6DNISzg==} - engines: {node: '>=6.9.0'} - - '@babel/helper-compilation-targets@7.23.6': - resolution: {integrity: sha512-9JB548GZoQVmzrFgp8o7KxdgkTGm6xs9DW0o/Pim72UDjzr5ObUQ6ZzYPqA+g9OTS2bBQoctLJrky0RDCAWRgQ==} - engines: {node: '>=6.9.0'} - - '@babel/helper-environment-visitor@7.22.20': - resolution: {integrity: sha512-zfedSIzFhat/gFhWfHtgWvlec0nqB9YEIVrpuwjruLlXfUSnA8cJB0miHKwqDnQ7d32aKo2xt88/xZptwxbfhA==} - engines: {node: '>=6.9.0'} - - '@babel/helper-function-name@7.23.0': - resolution: {integrity: sha512-OErEqsrxjZTJciZ4Oo+eoZqeW9UIiOcuYKRJA4ZAgV9myA+pOXhhmpfNCKjEH/auVfEYVFJ6y1Tc4r0eIApqiw==} - engines: {node: '>=6.9.0'} - - '@babel/helper-hoist-variables@7.22.5': - resolution: {integrity: sha512-wGjk9QZVzvknA6yKIUURb8zY3grXCcOZt+/7Wcy8O2uctxhplmUPkOdlgoNhmdVee2c92JXbf1xpMtVNbfoxRw==} - engines: {node: '>=6.9.0'} - - '@babel/helper-module-imports@7.22.15': - resolution: {integrity: sha512-0pYVBnDKZO2fnSPCrgM/6WMc7eS20Fbok+0r88fp+YtWVLZrp4CkafFGIp+W0VKw4a22sgebPT99y+FDNMdP4w==} - engines: {node: '>=6.9.0'} - - '@babel/helper-module-transforms@7.23.3': - resolution: {integrity: sha512-7bBs4ED9OmswdfDzpz4MpWgSrV7FXlc3zIagvLFjS5H+Mk7Snr21vQ6QwrsoCGMfNC4e4LQPdoULEt4ykz0SRQ==} - engines: {node: '>=6.9.0'} - peerDependencies: - '@babel/core': ^7.0.0 - - '@babel/helper-simple-access@7.22.5': - resolution: {integrity: sha512-n0H99E/K+Bika3++WNL17POvo4rKWZ7lZEp1Q+fStVbUi8nxPQEBOlTmCOxW/0JsS56SKKQ+ojAe2pHKJHN35w==} - engines: {node: '>=6.9.0'} - - '@babel/helper-split-export-declaration@7.22.6': - resolution: {integrity: sha512-AsUnxuLhRYsisFiaJwvp1QF+I3KjD5FOxut14q/GzovUe6orHLesW2C7d754kRm53h5gqrz6sFl6sxc4BVtE/g==} - engines: {node: '>=6.9.0'} - - '@babel/helper-string-parser@7.23.4': - resolution: {integrity: sha512-803gmbQdqwdf4olxrX4AJyFBV/RTr3rSmOj0rKwesmzlfhYNDEs+/iOcznzpNWlJlIlTJC2QfPFcHB6DlzdVLQ==} - engines: {node: '>=6.9.0'} - - '@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': - resolution: {integrity: sha512-85ttAOMLsr53VgXkTbkx8oA6YTfT4q7/HzXSLEYmjcSTJPMPQtvq1BD79Byep5xMUYbGRzEpDsjUf3dyp54IKw==} - engines: {node: '>=6.9.0'} - - '@babel/helpers@7.22.10': - resolution: {integrity: sha512-a41J4NW8HyZa1I1vAndrraTlPZ/eZoga2ZgS7fEr0tZJGVU4xqdE80CEm0CcNjha5EZ8fTBYLKHF0kqDUuAwQw==} - engines: {node: '>=6.9.0'} - - '@babel/highlight@7.22.20': - resolution: {integrity: sha512-dkdMCN3py0+ksCgYmGG8jKeGA/8Tk+gJwSYYlFGxG5lmhfKNoAy004YpLxpS1W2J8m/EK2Ew+yOs9pVRwO89mg==} - engines: {node: '>=6.9.0'} - - '@babel/parser@7.23.0': - resolution: {integrity: sha512-vvPKKdMemU85V9WE/l5wZEmImpCtLqbnTvqDS2U1fJ96KrxoW7KrXhNsNCblQlg8Ck4b85yxdTyelsMUgFUXiw==} - engines: {node: '>=6.0.0'} - hasBin: true - - '@babel/parser@7.23.6': - resolution: {integrity: sha512-Z2uID7YJ7oNvAI20O9X0bblw7Qqs8Q2hFy0R9tAfnfLkp5MW0UH9eUvnDSnFwKZ0AvgS1ucqR4KzvVHgnke1VQ==} - engines: {node: '>=6.0.0'} - hasBin: true - - '@babel/runtime@7.23.7': - resolution: {integrity: sha512-w06OXVOFso7LcbzMiDGt+3X7Rh7Ho8MmgPoWU3rarH+8upf+wSU/grlGbWzQyr3DkdN6ZeuMFjpdwW0Q+HxobA==} - engines: {node: '>=6.9.0'} - - '@babel/template@7.22.15': - resolution: {integrity: sha512-QPErUVm4uyJa60rkI73qneDacvdvzxshT3kksGqlGWYdOTIUOwJ7RDUL8sGqslY1uXWSL6xMFKEXDS3ox2uF0w==} - engines: {node: '>=6.9.0'} - - '@babel/traverse@7.23.3': - resolution: {integrity: sha512-+K0yF1/9yR0oHdE0StHuEj3uTPzwwbrLGfNOndVJVV2TqA5+j3oljJUb4nmB954FLGjNem976+B+eDuLIjesiQ==} - engines: {node: '>=6.9.0'} - - '@babel/types@7.23.6': - resolution: {integrity: sha512-+uarb83brBzPKN38NX1MkB6vb6+mwvR6amUulqAE7ccQw1pEl+bCia9TbdG1lsnFP7lZySvUn37CHyXQdfTwzg==} - engines: {node: '>=6.9.0'} - - '@changesets/apply-release-plan@7.0.0': - resolution: {integrity: sha512-vfi69JR416qC9hWmFGSxj7N6wA5J222XNBmezSVATPWDVPIF7gkd4d8CpbEbXmRWbVrkoli3oerGS6dcL/BGsQ==} - - '@changesets/assemble-release-plan@6.0.0': - resolution: {integrity: sha512-4QG7NuisAjisbW4hkLCmGW2lRYdPrKzro+fCtZaILX+3zdUELSvYjpL4GTv0E4aM9Mef3PuIQp89VmHJ4y2bfw==} - - '@changesets/changelog-git@0.2.0': - resolution: {integrity: sha512-bHOx97iFI4OClIT35Lok3sJAwM31VbUM++gnMBV16fdbtBhgYu4dxsphBF/0AZZsyAHMrnM0yFcj5gZM1py6uQ==} - - '@changesets/changelog-github@0.4.8': - resolution: {integrity: sha512-jR1DHibkMAb5v/8ym77E4AMNWZKB5NPzw5a5Wtqm1JepAuIF+hrKp2u04NKM14oBZhHglkCfrla9uq8ORnK/dw==} - - '@changesets/cli@2.27.1': - resolution: {integrity: sha512-iJ91xlvRnnrJnELTp4eJJEOPjgpF3NOh4qeQehM6Ugiz9gJPRZ2t+TsXun6E3AMN4hScZKjqVXl0TX+C7AB3ZQ==} - hasBin: true - - '@changesets/config@3.0.0': - resolution: {integrity: sha512-o/rwLNnAo/+j9Yvw9mkBQOZySDYyOr/q+wptRLcAVGlU6djOeP9v1nlalbL9MFsobuBVQbZCTp+dIzdq+CLQUA==} - - '@changesets/errors@0.2.0': - resolution: {integrity: sha512-6BLOQUscTpZeGljvyQXlWOItQyU71kCdGz7Pi8H8zdw6BI0g3m43iL4xKUVPWtG+qrrL9DTjpdn8eYuCQSRpow==} - - '@changesets/get-dependents-graph@2.0.0': - resolution: {integrity: sha512-cafUXponivK4vBgZ3yLu944mTvam06XEn2IZGjjKc0antpenkYANXiiE6GExV/yKdsCnE8dXVZ25yGqLYZmScA==} - - '@changesets/get-github-info@0.5.2': - resolution: {integrity: sha512-JppheLu7S114aEs157fOZDjFqUDpm7eHdq5E8SSR0gUBTEK0cNSHsrSR5a66xs0z3RWuo46QvA3vawp8BxDHvg==} - - '@changesets/get-release-plan@4.0.0': - resolution: {integrity: sha512-9L9xCUeD/Tb6L/oKmpm8nyzsOzhdNBBbt/ZNcjynbHC07WW4E1eX8NMGC5g5SbM5z/V+MOrYsJ4lRW41GCbg3w==} - - '@changesets/get-version-range-type@0.4.0': - resolution: {integrity: sha512-hwawtob9DryoGTpixy1D3ZXbGgJu1Rhr+ySH2PvTLHvkZuQ7sRT4oQwMh0hbqZH1weAooedEjRsbrWcGLCeyVQ==} - - '@changesets/git@3.0.0': - resolution: {integrity: sha512-vvhnZDHe2eiBNRFHEgMiGd2CT+164dfYyrJDhwwxTVD/OW0FUD6G7+4DIx1dNwkwjHyzisxGAU96q0sVNBns0w==} - - '@changesets/logger@0.1.0': - resolution: {integrity: sha512-pBrJm4CQm9VqFVwWnSqKEfsS2ESnwqwH+xR7jETxIErZcfd1u2zBSqrHbRHR7xjhSgep9x2PSKFKY//FAshA3g==} - - '@changesets/parse@0.4.0': - resolution: {integrity: sha512-TS/9KG2CdGXS27S+QxbZXgr8uPsP4yNJYb4BC2/NeFUj80Rni3TeD2qwWmabymxmrLo7JEsytXH1FbpKTbvivw==} - - '@changesets/pre@2.0.0': - resolution: {integrity: sha512-HLTNYX/A4jZxc+Sq8D1AMBsv+1qD6rmmJtjsCJa/9MSRybdxh0mjbTvE6JYZQ/ZiQ0mMlDOlGPXTm9KLTU3jyw==} - - '@changesets/read@0.6.0': - resolution: {integrity: sha512-ZypqX8+/im1Fm98K4YcZtmLKgjs1kDQ5zHpc2U1qdtNBmZZfo/IBiG162RoP0CUF05tvp2y4IspH11PLnPxuuw==} - - '@changesets/types@4.1.0': - resolution: {integrity: sha512-LDQvVDv5Kb50ny2s25Fhm3d9QSZimsoUGBsUioj6MC3qbMUCuC8GPIvk/M6IvXx3lYhAs0lwWUQLb+VIEUCECw==} - - '@changesets/types@5.2.1': - resolution: {integrity: sha512-myLfHbVOqaq9UtUKqR/nZA/OY7xFjQMdfgfqeZIBK4d0hA6pgxArvdv8M+6NUzzBsjWLOtvApv8YHr4qM+Kpfg==} - - '@changesets/types@6.0.0': - resolution: {integrity: sha512-b1UkfNulgKoWfqyHtzKS5fOZYSJO+77adgL7DLRDr+/7jhChN+QcHnbjiQVOz/U+Ts3PGNySq7diAItzDgugfQ==} - - '@changesets/write@0.3.0': - resolution: {integrity: sha512-slGLb21fxZVUYbyea+94uFiD6ntQW0M2hIKNznFizDhZPDgn2c/fv1UzzlW43RVzh1BEDuIqW6hzlJ1OflNmcw==} - - '@cspotcode/source-map-support@0.8.1': - resolution: {integrity: sha512-IchNf6dN4tHoMFIn/7OE8LWZ19Y6q/67Bmf6vnGREv8RSbBVb9LPJxEcnwrcwX6ixSvaiGoomAUvu4YSxXrVgw==} - engines: {node: '>=12'} - - '@ensdomains/ens@0.4.5': - resolution: {integrity: sha512-JSvpj1iNMFjK6K+uVl4unqMoa9rf5jopb8cya5UGBWz23Nw8hSNT7efgUx4BTlAPAgpNlEioUfeTyQ6J9ZvTVw==} - deprecated: Please use @ensdomains/ens-contracts - - '@ensdomains/resolver@0.2.4': - resolution: {integrity: sha512-bvaTH34PMCbv6anRa9I/0zjLJgY4EuznbEMgbV77JBCQ9KNC46rzi0avuxpOfu+xDjPEtSFGqVEOr5GlUSGudA==} - deprecated: Please use @ensdomains/ens-contracts - - '@es-joy/jsdoccomment@0.42.0': - resolution: {integrity: sha512-R1w57YlVA6+YE01wch3GPYn6bCsrOV3YW/5oGGE2tmX6JcL9Nr+b5IikrjMPF+v9CV3ay+obImEdsDhovhJrzw==} - engines: {node: '>=16'} - - '@esbuild/aix-ppc64@0.19.10': - resolution: {integrity: sha512-Q+mk96KJ+FZ30h9fsJl+67IjNJm3x2eX+GBWGmocAKgzp27cowCOOqSdscX80s0SpdFXZnIv/+1xD1EctFx96Q==} - engines: {node: '>=12'} - cpu: [ppc64] - os: [aix] - - '@esbuild/android-arm64@0.19.10': - resolution: {integrity: sha512-1X4CClKhDgC3by7k8aOWZeBXQX8dHT5QAMCAQDArCLaYfkppoARvh0fit3X2Qs+MXDngKcHv6XXyQCpY0hkK1Q==} - engines: {node: '>=12'} - cpu: [arm64] - os: [android] - - '@esbuild/android-arm64@0.19.7': - resolution: {integrity: sha512-YEDcw5IT7hW3sFKZBkCAQaOCJQLONVcD4bOyTXMZz5fr66pTHnAet46XAtbXAkJRfIn2YVhdC6R9g4xa27jQ1w==} - engines: {node: '>=12'} - cpu: [arm64] - os: [android] - - '@esbuild/android-arm@0.19.10': - resolution: {integrity: sha512-7W0bK7qfkw1fc2viBfrtAEkDKHatYfHzr/jKAHNr9BvkYDXPcC6bodtm8AyLJNNuqClLNaeTLuwURt4PRT9d7w==} - engines: {node: '>=12'} - cpu: [arm] - os: [android] - - '@esbuild/android-arm@0.19.7': - resolution: {integrity: sha512-YGSPnndkcLo4PmVl2tKatEn+0mlVMr3yEpOOT0BeMria87PhvoJb5dg5f5Ft9fbCVgtAz4pWMzZVgSEGpDAlww==} - engines: {node: '>=12'} - cpu: [arm] - os: [android] - - '@esbuild/android-x64@0.19.10': - resolution: {integrity: sha512-O/nO/g+/7NlitUxETkUv/IvADKuZXyH4BHf/g/7laqKC4i/7whLpB0gvpPc2zpF0q9Q6FXS3TS75QHac9MvVWw==} - engines: {node: '>=12'} - cpu: [x64] - os: [android] - - '@esbuild/android-x64@0.19.7': - resolution: {integrity: sha512-jhINx8DEjz68cChFvM72YzrqfwJuFbfvSxZAk4bebpngGfNNRm+zRl4rtT9oAX6N9b6gBcFaJHFew5Blf6CvUw==} - engines: {node: '>=12'} - cpu: [x64] - os: [android] - - '@esbuild/darwin-arm64@0.19.10': - resolution: {integrity: sha512-YSRRs2zOpwypck+6GL3wGXx2gNP7DXzetmo5pHXLrY/VIMsS59yKfjPizQ4lLt5vEI80M41gjm2BxrGZ5U+VMA==} - engines: {node: '>=12'} - cpu: [arm64] - os: [darwin] - - '@esbuild/darwin-arm64@0.19.7': - resolution: {integrity: sha512-dr81gbmWN//3ZnBIm6YNCl4p3pjnabg1/ZVOgz2fJoUO1a3mq9WQ/1iuEluMs7mCL+Zwv7AY5e3g1hjXqQZ9Iw==} - engines: {node: '>=12'} - cpu: [arm64] - os: [darwin] - - '@esbuild/darwin-x64@0.19.10': - resolution: {integrity: sha512-alfGtT+IEICKtNE54hbvPg13xGBe4GkVxyGWtzr+yHO7HIiRJppPDhOKq3zstTcVf8msXb/t4eavW3jCDpMSmA==} - engines: {node: '>=12'} - cpu: [x64] - os: [darwin] - - '@esbuild/darwin-x64@0.19.7': - resolution: {integrity: sha512-Lc0q5HouGlzQEwLkgEKnWcSazqr9l9OdV2HhVasWJzLKeOt0PLhHaUHuzb8s/UIya38DJDoUm74GToZ6Wc7NGQ==} - engines: {node: '>=12'} - cpu: [x64] - os: [darwin] - - '@esbuild/freebsd-arm64@0.19.10': - resolution: {integrity: sha512-dMtk1wc7FSH8CCkE854GyGuNKCewlh+7heYP/sclpOG6Cectzk14qdUIY5CrKDbkA/OczXq9WesqnPl09mj5dg==} - engines: {node: '>=12'} - cpu: [arm64] - os: [freebsd] - - '@esbuild/freebsd-arm64@0.19.7': - resolution: {integrity: sha512-+y2YsUr0CxDFF7GWiegWjGtTUF6gac2zFasfFkRJPkMAuMy9O7+2EH550VlqVdpEEchWMynkdhC9ZjtnMiHImQ==} - engines: {node: '>=12'} - cpu: [arm64] - os: [freebsd] - - '@esbuild/freebsd-x64@0.19.10': - resolution: {integrity: sha512-G5UPPspryHu1T3uX8WiOEUa6q6OlQh6gNl4CO4Iw5PS+Kg5bVggVFehzXBJY6X6RSOMS8iXDv2330VzaObm4Ag==} - engines: {node: '>=12'} - cpu: [x64] - os: [freebsd] - - '@esbuild/freebsd-x64@0.19.7': - resolution: {integrity: sha512-CdXOxIbIzPJmJhrpmJTLx+o35NoiKBIgOvmvT+jeSadYiWJn0vFKsl+0bSG/5lwjNHoIDEyMYc/GAPR9jxusTA==} - engines: {node: '>=12'} - cpu: [x64] - os: [freebsd] - - '@esbuild/linux-arm64@0.19.10': - resolution: {integrity: sha512-QxaouHWZ+2KWEj7cGJmvTIHVALfhpGxo3WLmlYfJ+dA5fJB6lDEIg+oe/0//FuyVHuS3l79/wyBxbHr0NgtxJQ==} - engines: {node: '>=12'} - cpu: [arm64] - os: [linux] - - '@esbuild/linux-arm64@0.19.7': - resolution: {integrity: sha512-inHqdOVCkUhHNvuQPT1oCB7cWz9qQ/Cz46xmVe0b7UXcuIJU3166aqSunsqkgSGMtUCWOZw3+KMwI6otINuC9g==} - engines: {node: '>=12'} - cpu: [arm64] - os: [linux] - - '@esbuild/linux-arm@0.19.10': - resolution: {integrity: sha512-j6gUW5aAaPgD416Hk9FHxn27On28H4eVI9rJ4az7oCGTFW48+LcgNDBN+9f8rKZz7EEowo889CPKyeaD0iw9Kg==} - engines: {node: '>=12'} - cpu: [arm] - os: [linux] - - '@esbuild/linux-arm@0.19.7': - resolution: {integrity: sha512-Y+SCmWxsJOdQtjcBxoacn/pGW9HDZpwsoof0ttL+2vGcHokFlfqV666JpfLCSP2xLxFpF1lj7T3Ox3sr95YXww==} - engines: {node: '>=12'} - cpu: [arm] - os: [linux] - - '@esbuild/linux-ia32@0.19.10': - resolution: {integrity: sha512-4ub1YwXxYjj9h1UIZs2hYbnTZBtenPw5NfXCRgEkGb0b6OJ2gpkMvDqRDYIDRjRdWSe/TBiZltm3Y3Q8SN1xNg==} - engines: {node: '>=12'} - cpu: [ia32] - os: [linux] - - '@esbuild/linux-ia32@0.19.7': - resolution: {integrity: sha512-2BbiL7nLS5ZO96bxTQkdO0euGZIUQEUXMTrqLxKUmk/Y5pmrWU84f+CMJpM8+EHaBPfFSPnomEaQiG/+Gmh61g==} - engines: {node: '>=12'} - cpu: [ia32] - os: [linux] - - '@esbuild/linux-loong64@0.19.10': - resolution: {integrity: sha512-lo3I9k+mbEKoxtoIbM0yC/MZ1i2wM0cIeOejlVdZ3D86LAcFXFRdeuZmh91QJvUTW51bOK5W2BznGNIl4+mDaA==} - engines: {node: '>=12'} - cpu: [loong64] - os: [linux] - - '@esbuild/linux-loong64@0.19.7': - resolution: {integrity: sha512-BVFQla72KXv3yyTFCQXF7MORvpTo4uTA8FVFgmwVrqbB/4DsBFWilUm1i2Oq6zN36DOZKSVUTb16jbjedhfSHw==} - engines: {node: '>=12'} - cpu: [loong64] - os: [linux] - - '@esbuild/linux-mips64el@0.19.10': - resolution: {integrity: sha512-J4gH3zhHNbdZN0Bcr1QUGVNkHTdpijgx5VMxeetSk6ntdt+vR1DqGmHxQYHRmNb77tP6GVvD+K0NyO4xjd7y4A==} - engines: {node: '>=12'} - cpu: [mips64el] - os: [linux] - - '@esbuild/linux-mips64el@0.19.7': - resolution: {integrity: sha512-DzAYckIaK+pS31Q/rGpvUKu7M+5/t+jI+cdleDgUwbU7KdG2eC3SUbZHlo6Q4P1CfVKZ1lUERRFP8+q0ob9i2w==} - engines: {node: '>=12'} - cpu: [mips64el] - os: [linux] - - '@esbuild/linux-ppc64@0.19.10': - resolution: {integrity: sha512-tgT/7u+QhV6ge8wFMzaklOY7KqiyitgT1AUHMApau32ZlvTB/+efeCtMk4eXS+uEymYK249JsoiklZN64xt6oQ==} - engines: {node: '>=12'} - cpu: [ppc64] - os: [linux] - - '@esbuild/linux-ppc64@0.19.7': - resolution: {integrity: sha512-JQ1p0SmUteNdUaaiRtyS59GkkfTW0Edo+e0O2sihnY4FoZLz5glpWUQEKMSzMhA430ctkylkS7+vn8ziuhUugQ==} - engines: {node: '>=12'} - cpu: [ppc64] - os: [linux] - - '@esbuild/linux-riscv64@0.19.10': - resolution: {integrity: sha512-0f/spw0PfBMZBNqtKe5FLzBDGo0SKZKvMl5PHYQr3+eiSscfJ96XEknCe+JoOayybWUFQbcJTrk946i3j9uYZA==} - engines: {node: '>=12'} - cpu: [riscv64] - os: [linux] - - '@esbuild/linux-riscv64@0.19.7': - resolution: {integrity: sha512-xGwVJ7eGhkprY/nB7L7MXysHduqjpzUl40+XoYDGC4UPLbnG+gsyS1wQPJ9lFPcxYAaDXbdRXd1ACs9AE9lxuw==} - engines: {node: '>=12'} - cpu: [riscv64] - os: [linux] - - '@esbuild/linux-s390x@0.19.10': - resolution: {integrity: sha512-pZFe0OeskMHzHa9U38g+z8Yx5FNCLFtUnJtQMpwhS+r4S566aK2ci3t4NCP4tjt6d5j5uo4h7tExZMjeKoehAA==} - engines: {node: '>=12'} - cpu: [s390x] - os: [linux] - - '@esbuild/linux-s390x@0.19.7': - resolution: {integrity: sha512-U8Rhki5PVU0L0nvk+E8FjkV8r4Lh4hVEb9duR6Zl21eIEYEwXz8RScj4LZWA2i3V70V4UHVgiqMpszXvG0Yqhg==} - engines: {node: '>=12'} - cpu: [s390x] - os: [linux] - - '@esbuild/linux-x64@0.19.10': - resolution: {integrity: sha512-SpYNEqg/6pZYoc+1zLCjVOYvxfZVZj6w0KROZ3Fje/QrM3nfvT2llI+wmKSrWuX6wmZeTapbarvuNNK/qepSgA==} - engines: {node: '>=12'} - cpu: [x64] - os: [linux] - - '@esbuild/linux-x64@0.19.7': - resolution: {integrity: sha512-ZYZopyLhm4mcoZXjFt25itRlocKlcazDVkB4AhioiL9hOWhDldU9n38g62fhOI4Pth6vp+Mrd5rFKxD0/S+7aQ==} - engines: {node: '>=12'} - cpu: [x64] - os: [linux] - - '@esbuild/netbsd-x64@0.19.10': - resolution: {integrity: sha512-ACbZ0vXy9zksNArWlk2c38NdKg25+L9pr/mVaj9SUq6lHZu/35nx2xnQVRGLrC1KKQqJKRIB0q8GspiHI3J80Q==} - engines: {node: '>=12'} - cpu: [x64] - os: [netbsd] - - '@esbuild/netbsd-x64@0.19.7': - resolution: {integrity: sha512-/yfjlsYmT1O3cum3J6cmGG16Fd5tqKMcg5D+sBYLaOQExheAJhqr8xOAEIuLo8JYkevmjM5zFD9rVs3VBcsjtQ==} - engines: {node: '>=12'} - cpu: [x64] - os: [netbsd] - - '@esbuild/openbsd-x64@0.19.10': - resolution: {integrity: sha512-PxcgvjdSjtgPMiPQrM3pwSaG4kGphP+bLSb+cihuP0LYdZv1epbAIecHVl5sD3npkfYBZ0ZnOjR878I7MdJDFg==} - engines: {node: '>=12'} - cpu: [x64] - os: [openbsd] - - '@esbuild/openbsd-x64@0.19.7': - resolution: {integrity: sha512-MYDFyV0EW1cTP46IgUJ38OnEY5TaXxjoDmwiTXPjezahQgZd+j3T55Ht8/Q9YXBM0+T9HJygrSRGV5QNF/YVDQ==} - engines: {node: '>=12'} - cpu: [x64] - os: [openbsd] - - '@esbuild/sunos-x64@0.19.10': - resolution: {integrity: sha512-ZkIOtrRL8SEJjr+VHjmW0znkPs+oJXhlJbNwfI37rvgeMtk3sxOQevXPXjmAPZPigVTncvFqLMd+uV0IBSEzqA==} - engines: {node: '>=12'} - cpu: [x64] - os: [sunos] - - '@esbuild/sunos-x64@0.19.7': - resolution: {integrity: sha512-JcPvgzf2NN/y6X3UUSqP6jSS06V0DZAV/8q0PjsZyGSXsIGcG110XsdmuWiHM+pno7/mJF6fjH5/vhUz/vA9fw==} - engines: {node: '>=12'} - cpu: [x64] - os: [sunos] - - '@esbuild/win32-arm64@0.19.10': - resolution: {integrity: sha512-+Sa4oTDbpBfGpl3Hn3XiUe4f8TU2JF7aX8cOfqFYMMjXp6ma6NJDztl5FDG8Ezx0OjwGikIHw+iA54YLDNNVfw==} - engines: {node: '>=12'} - cpu: [arm64] - os: [win32] - - '@esbuild/win32-arm64@0.19.7': - resolution: {integrity: sha512-ZA0KSYti5w5toax5FpmfcAgu3ZNJxYSRm0AW/Dao5up0YV1hDVof1NvwLomjEN+3/GMtaWDI+CIyJOMTRSTdMw==} - engines: {node: '>=12'} - cpu: [arm64] - os: [win32] - - '@esbuild/win32-ia32@0.19.10': - resolution: {integrity: sha512-EOGVLK1oWMBXgfttJdPHDTiivYSjX6jDNaATeNOaCOFEVcfMjtbx7WVQwPSE1eIfCp/CaSF2nSrDtzc4I9f8TQ==} - engines: {node: '>=12'} - cpu: [ia32] - os: [win32] - - '@esbuild/win32-ia32@0.19.7': - resolution: {integrity: sha512-CTOnijBKc5Jpk6/W9hQMMvJnsSYRYgveN6O75DTACCY18RA2nqka8dTZR+x/JqXCRiKk84+5+bRKXUSbbwsS0A==} - engines: {node: '>=12'} - cpu: [ia32] - os: [win32] - - '@esbuild/win32-x64@0.19.10': - resolution: {integrity: sha512-whqLG6Sc70AbU73fFYvuYzaE4MNMBIlR1Y/IrUeOXFrWHxBEjjbZaQ3IXIQS8wJdAzue2GwYZCjOrgrU1oUHoA==} - engines: {node: '>=12'} - cpu: [x64] - os: [win32] - - '@esbuild/win32-x64@0.19.7': - resolution: {integrity: sha512-gRaP2sk6hc98N734luX4VpF318l3w+ofrtTu9j5L8EQXF+FzQKV6alCOHMVoJJHvVK/mGbwBXfOL1HETQu9IGQ==} - engines: {node: '>=12'} - cpu: [x64] - os: [win32] - - '@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: - eslint: ^6.0.0 || ^7.0.0 || >=8.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} - - '@eslint/eslintrc@2.1.4': - resolution: {integrity: sha512-269Z39MS6wVJtsoUl10L60WdkhJVdPG24Q4eZTH3nnF6lpvSShEK3wQjDX9JRWAUPvPh7COouPpU9IrqaZFvtQ==} - engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} - - '@eslint/js@8.56.0': - resolution: {integrity: sha512-gMsVel9D7f2HLkBma9VbtzZRehRogVRfbr++f06nL2vnCGCNlzOD+/MUov/F4p8myyAHspEhVobgjpX64q5m6A==} - engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} - - '@eth-optimism/common-ts@0.8.9': - resolution: {integrity: sha512-Ftsl8yzS/Zr7XOWau4PK6Z75LNykHINfTvAe2WFT1Wu5nsFCKt16RJNRKtk44CcXHDHS4ixMs/jDxyWzZC1OQw==} - - '@eth-optimism/contracts-periphery@1.0.8': - resolution: {integrity: sha512-n8a9rmlMxl1lWSiC1zHUlr5Qk6qy85nhsmSgpU12El1WY75MOIPknSTQKj+yJhEmrTtI0PViWlKfgviY09pwUg==} - - '@eth-optimism/contracts@0.6.0': - resolution: {integrity: sha512-vQ04wfG9kMf1Fwy3FEMqH2QZbgS0gldKhcBeBUPfO8zu68L61VI97UDXmsMQXzTsEAxK8HnokW3/gosl4/NW3w==} - peerDependencies: - ethers: ^5 - - '@eth-optimism/core-utils@0.12.0': - resolution: {integrity: sha512-qW+7LZYCz7i8dRa7SRlUKIo1VBU8lvN0HeXCxJR+z+xtMzMQpPds20XJNCMclszxYQHkXY00fOT6GvFw9ZL6nw==} - - '@eth-optimism/core-utils@0.13.2': - resolution: {integrity: sha512-u7TOKm1RxH1V5zw7dHmfy91bOuEAZU68LT/9vJPkuWEjaTl+BgvPDRDTurjzclHzN0GbWdcpOqPZg4ftjkJGaw==} - - '@eth-optimism/sdk@3.3.1': - resolution: {integrity: sha512-zf8qL+KwYWUUwvdcjF1HpBxgKSt5wsKr8oa6jwqUhdPkQHUtVK5SRKtqXqYplnAgKtxDQYwlK512GU16odEl1w==} - peerDependencies: - ethers: ^5 - - '@ethereum-waffle/chai@4.0.10': - resolution: {integrity: sha512-X5RepE7Dn8KQLFO7HHAAe+KeGaX/by14hn90wePGBhzL54tq4Y8JscZFu+/LCwCl6TnkAAy5ebiMoqJ37sFtWw==} - engines: {node: '>=10.0'} - peerDependencies: - ethers: '*' - - '@ethereum-waffle/compiler@4.0.3': - resolution: {integrity: sha512-5x5U52tSvEVJS6dpCeXXKvRKyf8GICDwiTwUvGD3/WD+DpvgvaoHOL82XqpTSUHgV3bBq6ma5/8gKUJUIAnJCw==} - engines: {node: '>=10.0'} - peerDependencies: - ethers: '*' - solc: '*' - typechain: ^8.0.0 - - '@ethereum-waffle/ens@4.0.3': - resolution: {integrity: sha512-PVLcdnTbaTfCrfSOrvtlA9Fih73EeDvFS28JQnT5M5P4JMplqmchhcZB1yg/fCtx4cvgHlZXa0+rOCAk2Jk0Jw==} - engines: {node: '>=10.0'} - peerDependencies: - '@ensdomains/ens': ^0.4.4 - '@ensdomains/resolver': ^0.2.4 - ethers: '*' - - '@ethereum-waffle/mock-contract@4.0.4': - resolution: {integrity: sha512-LwEj5SIuEe9/gnrXgtqIkWbk2g15imM/qcJcxpLyAkOj981tQxXmtV4XmQMZsdedEsZ/D/rbUAOtZbgwqgUwQA==} - engines: {node: '>=10.0'} - peerDependencies: - ethers: '*' - - '@ethereum-waffle/provider@4.0.5': - resolution: {integrity: sha512-40uzfyzcrPh+Gbdzv89JJTMBlZwzya1YLDyim8mVbEqYLP5VRYWoGp0JMyaizgV3hMoUFRqJKVmIUw4v7r3hYw==} - engines: {node: '>=10.0'} - peerDependencies: - ethers: '*' - - '@ethereumjs/block@3.6.2': - resolution: {integrity: sha512-mOqYWwMlAZpYUEOEqt7EfMFuVL2eyLqWWIzcf4odn6QgXY8jBI2NhVuJncrMCKeMZrsJAe7/auaRRB6YcdH+Qw==} - - '@ethereumjs/blockchain@5.5.2': - resolution: {integrity: sha512-Jz26iJmmsQtngerW6r5BDFaew/f2mObLrRZo3rskLOx1lmtMZ8+TX/vJexmivrnWgmAsTdNWhlKUYY4thPhPig==} - - '@ethereumjs/common@2.6.0': - resolution: {integrity: sha512-Cq2qS0FTu6O2VU1sgg+WyU9Ps0M6j/BEMHN+hRaECXCV/r0aI78u4N6p52QW/BDVhwWZpCdrvG8X7NJdzlpNUA==} - - '@ethereumjs/common@2.6.4': - resolution: {integrity: sha512-RDJh/R/EAr+B7ZRg5LfJ0BIpf/1LydFgYdvZEuTraojCbVypO2sQ+QnpP5u2wJf9DASyooKqu8O4FJEWUV6NXw==} - - '@ethereumjs/ethash@1.1.0': - resolution: {integrity: sha512-/U7UOKW6BzpA+Vt+kISAoeDie1vAvY4Zy2KF5JJb+So7+1yKmJeJEHOGSnQIj330e9Zyl3L5Nae6VZyh2TJnAA==} - - '@ethereumjs/rlp@4.0.1': - resolution: {integrity: sha512-tqsQiBQDQdmPWE1xkkBq4rlSW5QZpLOUJ5RJh2/9fug+q9tnUhuZoVLk7s0scUIKTOzEtR72DFBXI4WiZcMpvw==} - engines: {node: '>=14'} - hasBin: true - - '@ethereumjs/tx@3.4.0': - resolution: {integrity: sha512-WWUwg1PdjHKZZxPPo274ZuPsJCWV3SqATrEKQP1n2DrVYVP1aZIYpo/mFaA0BDoE0tIQmBeimRCEA0Lgil+yYw==} - - '@ethereumjs/tx@3.5.1': - resolution: {integrity: sha512-xzDrTiu4sqZXUcaBxJ4n4W5FrppwxLxZB4ZDGVLtxSQR4lVuOnFR6RcUHdg1mpUhAPVrmnzLJpxaeXnPxIyhWA==} - - '@ethereumjs/util@8.1.0': - resolution: {integrity: sha512-zQ0IqbdX8FZ9aw11vP+dZkKDkS+kgIvQPHnSAXzP9pLu+Rfu3D3XEeLbicvoXJTYnhZiPmsZUxgdzXwNKxRPbA==} - engines: {node: '>=14'} - - '@ethereumjs/vm@5.6.0': - resolution: {integrity: sha512-J2m/OgjjiGdWF2P9bj/4LnZQ1zRoZhY8mRNVw/N3tXliGI8ai1sI1mlDPkLpeUUM4vq54gH6n0ZlSpz8U/qlYQ==} - - '@ethersproject/abi@5.7.0': - resolution: {integrity: sha512-351ktp42TiRcYB3H1OP8yajPeAQstMW/yCFokj/AthP9bLHzQFPlOrxOcwYEDkUAICmOHljvN4K39OMTMUa9RA==} - - '@ethersproject/abstract-provider@5.7.0': - resolution: {integrity: sha512-R41c9UkchKCpAqStMYUpdunjo3pkEvZC3FAwZn5S5MGbXoMQOHIdHItezTETxAO5bevtMApSyEhn9+CHcDsWBw==} - - '@ethersproject/abstract-signer@5.7.0': - resolution: {integrity: sha512-a16V8bq1/Cz+TGCkE2OPMTOUDLS3grCpdjoJCYNnVBbdYEMSgKrU0+B90s8b6H+ByYTBZN7a3g76jdIJi7UfKQ==} - - '@ethersproject/address@5.7.0': - resolution: {integrity: sha512-9wYhYt7aghVGo758POM5nqcOMaE168Q6aRLJZwUmiqSrAungkG74gSSeKEIR7ukixesdRZGPgVqme6vmxs1fkA==} - - '@ethersproject/base64@5.7.0': - resolution: {integrity: sha512-Dr8tcHt2mEbsZr/mwTPIQAf3Ai0Bks/7gTw9dSqk1mQvhW3XvRlmDJr/4n+wg1JmCl16NZue17CDh8xb/vZ0sQ==} - - '@ethersproject/basex@5.7.0': - resolution: {integrity: sha512-ywlh43GwZLv2Voc2gQVTKBoVQ1mti3d8HK5aMxsfu/nRDnMmNqaSJ3r3n85HBByT8OpoY96SXM1FogC533T4zw==} - - '@ethersproject/bignumber@5.7.0': - resolution: {integrity: sha512-n1CAdIHRWjSucQO3MC1zPSVgV/6dy/fjL9pMrPP9peL+QxEg9wOsVqwD4+818B6LUEtaXzVHQiuivzRoxPxUGw==} - - '@ethersproject/bytes@5.7.0': - resolution: {integrity: sha512-nsbxwgFXWh9NyYWo+U8atvmMsSdKJprTcICAkvbBffT75qDocbuggBU0SJiVK2MuTrp0q+xvLkTnGMPK1+uA9A==} - - '@ethersproject/constants@5.7.0': - resolution: {integrity: sha512-DHI+y5dBNvkpYUMiRQyxRBYBefZkJfo70VUkUAsRjcPs47muV9evftfZ0PJVCXYbAiCgght0DtcF9srFQmIgWA==} - - '@ethersproject/contracts@5.7.0': - resolution: {integrity: sha512-5GJbzEU3X+d33CdfPhcyS+z8MzsTrBGk/sc+G+59+tPa9yFkl6HQ9D6L0QMgNTA9q8dT0XKxxkyp883XsQvbbg==} - - '@ethersproject/hash@5.7.0': - resolution: {integrity: sha512-qX5WrQfnah1EFnO5zJv1v46a8HW0+E5xuBBDTwMFZLuVTx0tbU2kkx15NqdjxecrLGatQN9FGQKpb1FKdHCt+g==} - - '@ethersproject/hdnode@5.7.0': - resolution: {integrity: sha512-OmyYo9EENBPPf4ERhR7oj6uAtUAhYGqOnIS+jE5pTXvdKBS99ikzq1E7Iv0ZQZ5V36Lqx1qZLeak0Ra16qpeOg==} - - '@ethersproject/json-wallets@5.7.0': - resolution: {integrity: sha512-8oee5Xgu6+RKgJTkvEMl2wDgSPSAQ9MB/3JYjFV9jlKvcYHUXZC+cQp0njgmxdHkYWn8s6/IqIZYm0YWCjO/0g==} - - '@ethersproject/keccak256@5.7.0': - resolution: {integrity: sha512-2UcPboeL/iW+pSg6vZ6ydF8tCnv3Iu/8tUmLLzWWGzxWKFFqOBQFLo6uLUv6BDrLgCDfN28RJ/wtByx+jZ4KBg==} - - '@ethersproject/logger@5.7.0': - resolution: {integrity: sha512-0odtFdXu/XHtjQXJYA3u9G0G8btm0ND5Cu8M7i5vhEcE8/HmF4Lbdqanwyv4uQTr2tx6b7fQRmgLrsnpQlmnig==} - - '@ethersproject/networks@5.7.1': - resolution: {integrity: sha512-n/MufjFYv3yFcUyfhnXotyDlNdFb7onmkSy8aQERi2PjNcnWQ66xXxa3XlS8nCcA8aJKJjIIMNJTC7tu80GwpQ==} - - '@ethersproject/pbkdf2@5.7.0': - resolution: {integrity: sha512-oR/dBRZR6GTyaofd86DehG72hY6NpAjhabkhxgr3X2FpJtJuodEl2auADWBZfhDHgVCbu3/H/Ocq2uC6dpNjjw==} - - '@ethersproject/properties@5.7.0': - resolution: {integrity: sha512-J87jy8suntrAkIZtecpxEPxY//szqr1mlBaYlQ0r4RCaiD2hjheqF9s1LVE8vVuJCXisjIP+JgtK/Do54ej4Sw==} - - '@ethersproject/providers@5.7.2': - resolution: {integrity: sha512-g34EWZ1WWAVgr4aptGlVBF8mhl3VWjv+8hoAnzStu8Ah22VHBsuGzP17eb6xDVRzw895G4W7vvx60lFFur/1Rg==} - - '@ethersproject/random@5.7.0': - resolution: {integrity: sha512-19WjScqRA8IIeWclFme75VMXSBvi4e6InrUNuaR4s5pTF2qNhcGdCUwdxUVGtDDqC00sDLCO93jPQoDUH4HVmQ==} - - '@ethersproject/rlp@5.7.0': - resolution: {integrity: sha512-rBxzX2vK8mVF7b0Tol44t5Tb8gomOHkj5guL+HhzQ1yBh/ydjGnpw6at+X6Iw0Kp3OzzzkcKp8N9r0W4kYSs9w==} - - '@ethersproject/sha2@5.7.0': - resolution: {integrity: sha512-gKlH42riwb3KYp0reLsFTokByAKoJdgFCwI+CCiX/k+Jm2mbNs6oOaCjYQSlI1+XBVejwH2KrmCbMAT/GnRDQw==} - - '@ethersproject/signing-key@5.7.0': - resolution: {integrity: sha512-MZdy2nL3wO0u7gkB4nA/pEf8lu1TlFswPNmy8AiYkfKTdO6eXBJyUdmHO/ehm/htHw9K/qF8ujnTyUAD+Ry54Q==} - - '@ethersproject/solidity@5.7.0': - resolution: {integrity: sha512-HmabMd2Dt/raavyaGukF4XxizWKhKQ24DoLtdNbBmNKUOPqwjsKQSdV9GQtj9CBEea9DlzETlVER1gYeXXBGaA==} - - '@ethersproject/strings@5.7.0': - resolution: {integrity: sha512-/9nu+lj0YswRNSH0NXYqrh8775XNyEdUQAuf3f+SmOrnVewcJ5SBNAjF7lpgehKi4abvNNXyf+HX86czCdJ8Mg==} - - '@ethersproject/transactions@5.7.0': - resolution: {integrity: sha512-kmcNicCp1lp8qanMTC3RIikGgoJ80ztTyvtsFvCYpSCfkjhD0jZ2LOrnbcuxuToLIUYYf+4XwD1rP+B/erDIhQ==} - - '@ethersproject/units@5.7.0': - resolution: {integrity: sha512-pD3xLMy3SJu9kG5xDGI7+xhTEmGXlEqXU4OfNapmfnxLVY4EMSSRp7j1k7eezutBPH7RBN/7QPnwR7hzNlEFeg==} - - '@ethersproject/wallet@5.7.0': - resolution: {integrity: sha512-MhmXlJXEJFBFVKrDLB4ZdDzxcBxQ3rLyCkhNqVu3CDYvR97E+8r01UgrI+TI99Le+aYm/in/0vp86guJuM7FCA==} - - '@ethersproject/web@5.7.1': - resolution: {integrity: sha512-Gueu8lSvyjBWL4cYsWsjh6MtMwM0+H4HvqFPZfB6dV8ctbP9zFAO73VG1cMWae0FLPCtz0peKPpZY8/ugJJX2w==} - - '@ethersproject/wordlists@5.7.0': - resolution: {integrity: sha512-S2TFNJNfHWVHNE6cNDjbVlZ6MgE17MIxMbMg2zv3wn+3XSJGosL1m9ZVv3GXCf/2ymSsQ+hRI5IzoMJTG6aoVA==} - - '@ganache/ethereum-address@0.1.4': - resolution: {integrity: sha512-sTkU0M9z2nZUzDeHRzzGlW724xhMLXo2LeX1hixbnjHWY1Zg1hkqORywVfl+g5uOO8ht8T0v+34IxNxAhmWlbw==} - - '@ganache/ethereum-options@0.1.4': - resolution: {integrity: sha512-i4l46taoK2yC41FPkcoDlEVoqHS52wcbHPqJtYETRWqpOaoj9hAg/EJIHLb1t6Nhva2CdTO84bG+qlzlTxjAHw==} - - '@ganache/ethereum-utils@0.1.4': - resolution: {integrity: sha512-FKXF3zcdDrIoCqovJmHLKZLrJ43234Em2sde/3urUT/10gSgnwlpFmrv2LUMAmSbX3lgZhW/aSs8krGhDevDAg==} - - '@ganache/options@0.1.4': - resolution: {integrity: sha512-zAe/craqNuPz512XQY33MOAG6Si1Xp0hCvfzkBfj2qkuPcbJCq6W/eQ5MB6SbXHrICsHrZOaelyqjuhSEmjXRw==} - - '@ganache/rlp@0.1.4': - resolution: {integrity: sha512-Do3D1H6JmhikB+6rHviGqkrNywou/liVeFiKIpOBLynIpvZhRCgn3SEDxyy/JovcaozTo/BynHumfs5R085MFQ==} - - '@ganache/utils@0.1.4': - resolution: {integrity: sha512-oatUueU3XuXbUbUlkyxeLLH3LzFZ4y5aSkNbx6tjSIhVTPeh+AuBKYt4eQ73FFcTB3nj/gZoslgAh5CN7O369w==} - - '@hapi/hoek@9.3.0': - resolution: {integrity: sha512-/c6rf4UJlmHlC9b5BaNvzAcFv7HZ2QHaV0D4/HNlBdvFnvQq8RI4kYdhyPCl7Xj+oWvTWQ8ujhqS53LIgAe6KQ==} - - '@hapi/topo@5.1.0': - resolution: {integrity: sha512-foQZKJig7Ob0BMAYBfcJk8d77QtOe7Wo4ox7ff1lQYoNNAb6jwcY1ncdoy2e9wQZzvNy7ODZCYJkK8kzmcAnAg==} - - '@humanwhocodes/config-array@0.11.13': - resolution: {integrity: sha512-JSBDMiDKSzQVngfRjOdFXgFfklaXI4K9nLF49Auh21lmBWRLIK3+xTErTWD4KU54pb6coM6ESE7Awz/FNU3zgQ==} - engines: {node: '>=10.10.0'} - - '@humanwhocodes/module-importer@1.0.1': - resolution: {integrity: sha512-bxveV4V8v5Yb4ncFTT3rPSgZBOpCkjfK0y4oVVVJwIuDVBRMDXrPyXRL988i5ap9m9bnyEEjWfm5WkBmtffLfA==} - engines: {node: '>=12.22'} - - '@humanwhocodes/object-schema@2.0.1': - resolution: {integrity: sha512-dvuCeX5fC9dXgJn9t+X5atfmgQAzUOWqS1254Gh0m6i8wKd10ebXkfNKiRK+1GWi/yTvvLDHpoxLr0xxxeslWw==} - - '@isaacs/cliui@8.0.2': - resolution: {integrity: sha512-O8jcjabXaleOG9DQ0+ARXWZBTfnP4WNAqzuiJK7ll44AmxGKv/J2M4TPjxjY3znBCfvBXFzucm1twdyFybFqEA==} - engines: {node: '>=12'} - - '@istanbuljs/load-nyc-config@1.1.0': - resolution: {integrity: sha512-VjeHSlIzpv/NyD3N0YuHfXOPDIixcA1q2ZV98wsMqcYlPmv2n3Yb2lYP9XMElnaFVXg5A7YLTeLu6V84uQDjmQ==} - engines: {node: '>=8'} - - '@istanbuljs/schema@0.1.3': - resolution: {integrity: sha512-ZXRY4jNvVgSVQ8DL3LTcakaAtXwTVUxE81hslsyD2AtoXW/wVob10HkOJ1X/pAlcI7D+2YoZKg5do8G/w6RYgA==} - engines: {node: '>=8'} - - '@jest/schemas@29.6.3': - resolution: {integrity: sha512-mo5j5X+jIZmJQveBKeS/clAueipV7KgiX1vMgCxam1RNYiqE1w62n0/tJJnHtjW8ZHcQco5gY85jA3mi0L+nSA==} - engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} - - '@jridgewell/gen-mapping@0.3.3': - resolution: {integrity: sha512-HLhSWOLRi875zjjMG/r+Nv0oCW8umGb0BgEhyX3dDX3egwZtB8PqLnjz3yedt8R5StBrzcg4aBpnh8UA9D1BoQ==} - engines: {node: '>=6.0.0'} - - '@jridgewell/resolve-uri@3.1.1': - resolution: {integrity: sha512-dSYZh7HhCDtCKm4QakX0xFpsRDqjjtZf/kjI/v3T3Nwt5r8/qz/M19F9ySyOqU94SXBmeG9ttTul+YnR4LOxFA==} - engines: {node: '>=6.0.0'} - - '@jridgewell/set-array@1.1.2': - resolution: {integrity: sha512-xnkseuNADM0gt2bs+BvhO0p78Mk762YnZdsuzFV018NoG1Sj1SCQvpSqa7XUaTam5vAGasABV9qXASMKnFMwMw==} - engines: {node: '>=6.0.0'} - - '@jridgewell/source-map@0.3.5': - resolution: {integrity: sha512-UTYAUj/wviwdsMfzoSJspJxbkH5o1snzwX0//0ENX1u/55kkZZkcTZP6u9bwKGkv+dkk9at4m1Cpt0uY80kcpQ==} - - '@jridgewell/sourcemap-codec@1.4.15': - resolution: {integrity: sha512-eF2rxCRulEKXHTRiDrDy6erMYWqNw4LPdQ8UQA4huuxaQsVeRPFl2oM8oDGxMFhJUWZf9McpLtJasDDZb/Bpeg==} - - '@jridgewell/trace-mapping@0.3.19': - resolution: {integrity: sha512-kf37QtfW+Hwx/buWGMPcR60iF9ziHa6r/CZJIHbmcm4+0qrXiVdxegAH0F6yddEVQ7zdkjcGCgCzUu+BcbhQxw==} - - '@jridgewell/trace-mapping@0.3.9': - resolution: {integrity: sha512-3Belt6tdc8bPgAtbcmdtNJlirVoTmEb5e2gC94PnkwEW9jI6CAHUeoG85tjWP5WquqfavoMtMwiG4P926ZKKuQ==} - - '@manypkg/find-root@1.1.0': - resolution: {integrity: sha512-mki5uBvhHzO8kYYix/WRy2WX8S3B5wdVSc9D6KcU5lQNglP2yt58/VfLuAK49glRXChosY8ap2oJ1qgma3GUVA==} - - '@manypkg/get-packages@1.1.3': - resolution: {integrity: sha512-fo+QhuU3qE/2TQMQmbVMqaQ6EWbMhi4ABWP+O4AM1NqPBuy0OrApV5LO6BrrgnhtAHS2NH6RrVk9OL181tTi8A==} - - '@metamask/eth-sig-util@4.0.0': - resolution: {integrity: sha512-LczOjjxY4A7XYloxzyxJIHONELmUxVZncpOLoClpEcTiebiVdM46KRPYXGuULro9oNNR2xdVx3yoKiQjdfWmoA==} - engines: {node: '>=12.0.0'} - - '@nicolo-ribaudo/eslint-scope-5-internals@5.1.1-v1': - resolution: {integrity: sha512-54/JRvkLIzzDWshCWfuhadfrfZVPiElY8Fcgmg1HroEly/EDSszzhBAsarCux+D/kOslTRquNzuyGSmUSTTHGg==} - - '@noble/curves@1.1.0': - resolution: {integrity: sha512-091oBExgENk/kGj3AZmtBDMpxQPDtxQABR2B9lb1JbVTs6ytdzZNwvhxQ4MWasRNEzlbEH8jCWFCwhF/Obj5AA==} - - '@noble/curves@1.2.0': - resolution: {integrity: sha512-oYclrNgRaM9SsBUBVbb8M6DTV7ZHRTKugureoYEncY5c65HOmRzvSiTE3y5CYaPYJA/GVkrhXEoF0M3Ya9PMnw==} - - '@noble/hashes@1.2.0': - resolution: {integrity: sha512-FZfhjEDbT5GRswV3C6uvLPHMiVD6lQBmpoX5+eSiPaMTXte/IKqI5dykDxzZB/WBeK/CDuQRBWarPdi3FNY2zQ==} - - '@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==} - - '@nodelib/fs.scandir@2.1.5': - resolution: {integrity: sha512-vq24Bq3ym5HEQm2NKCr3yXDwjc7vTsEThRDnkp2DK9p1uqLR+DHurm/NOTo0KG7HYHU7eppKZj3MyqYuMBf62g==} - engines: {node: '>= 8'} - - '@nodelib/fs.stat@2.0.5': - resolution: {integrity: sha512-RkhPPp2zrqDAQA/2jNhnztcPAlv64XdhIp7a7454A5ovI7Bukxgt7MX7udwAu3zg1DcpPU0rz3VV1SeaqvY4+A==} - engines: {node: '>= 8'} - - '@nodelib/fs.walk@1.2.8': - resolution: {integrity: sha512-oGB+UxlgWcgQkgwo8GcEGwemoTFt3FIO9ababBmaGwXIoBKZ+GTy0pP185beGg7Llih/NSHSV2XAs1lnznocSg==} - engines: {node: '>= 8'} - - '@nomicfoundation/ethereumjs-block@5.0.4': - resolution: {integrity: sha512-AcyacJ9eX/uPEvqsPiB+WO1ymE+kyH48qGGiGV+YTojdtas8itUTW5dehDSOXEEItWGbbzEJ4PRqnQZlWaPvDw==} - engines: {node: '>=18'} - - '@nomicfoundation/ethereumjs-blockchain@7.0.4': - resolution: {integrity: sha512-jYsd/kwzbmpnxx86tXsYV8wZ5xGvFL+7/P0c6OlzpClHsbFzeF41KrYA9scON8Rg6bZu3ZTv6JOAgj3t7USUfg==} - engines: {node: '>=18'} - - '@nomicfoundation/ethereumjs-common@4.0.4': - resolution: {integrity: sha512-9Rgb658lcWsjiicr5GzNCjI1llow/7r0k50dLL95OJ+6iZJcVbi15r3Y0xh2cIO+zgX0WIHcbzIu6FeQf9KPrg==} - - '@nomicfoundation/ethereumjs-ethash@3.0.4': - resolution: {integrity: sha512-xvIrwIMl9sSaiYKRem68+O7vYdj7Q2XWv5P7JXiIkn83918QzWHvqbswTRsH7+r6X1UEvdsURRnZbvZszEjAaQ==} - engines: {node: '>=18'} - - '@nomicfoundation/ethereumjs-evm@2.0.4': - resolution: {integrity: sha512-lTyZZi1KpeMHzaO6cSVisR2tjiTTedjo7PcmhI/+GNFo9BmyY6QYzGeSti0sFttmjbEMioHgXxl5yrLNRg6+1w==} - engines: {node: '>=18'} - - '@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: [darwin] - - '@nomicfoundation/solidity-analyzer-freebsd-x64@0.1.1': - resolution: {integrity: sha512-GHF1VKRdHW3G8CndkwdaeLkVBi5A9u2jwtlS7SLhBc8b5U/GcoL39Q+1CSO3hYqePNP+eV5YI7Zgm0ea6kMHoA==} - engines: {node: '>= 10'} - cpu: [x64] - os: [freebsd] - - '@nomicfoundation/solidity-analyzer-linux-arm64-gnu@0.1.1': - resolution: {integrity: sha512-g4Cv2fO37ZsUENQ2vwPnZc2zRenHyAxHcyBjKcjaSmmkKrFr64yvzeNO8S3GBFCo90rfochLs99wFVGT/0owpg==} - engines: {node: '>= 10'} - cpu: [arm64] - os: [linux] - - '@nomicfoundation/solidity-analyzer-linux-arm64-musl@0.1.1': - resolution: {integrity: sha512-WJ3CE5Oek25OGE3WwzK7oaopY8xMw9Lhb0mlYuJl/maZVo+WtP36XoQTb7bW/i8aAdHW5Z+BqrHMux23pvxG3w==} - engines: {node: '>= 10'} - cpu: [arm64] - os: [linux] - - '@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] - - '@nomicfoundation/solidity-analyzer-win32-ia32-msvc@0.1.1': - resolution: {integrity: sha512-JnFkYuyCSA70j6Si6cS1A9Gh1aHTEb8kOTBApp/c7NRTFGNMH8eaInKlyuuiIbvYFhlXW4LicqyYuWNNq9hkpQ==} - engines: {node: '>= 10'} - cpu: [ia32] - os: [win32] - - '@nomicfoundation/solidity-analyzer-win32-x64-msvc@0.1.1': - resolution: {integrity: sha512-HrVJr6+WjIXGnw3Q9u6KQcbZCtk0caVWhCdFADySvRyUxJ8PnzlaP+MhwNE8oyT8OZ6ejHBRrrgjSqDCFXGirw==} - engines: {node: '>= 10'} - cpu: [x64] - os: [win32] - - '@nomicfoundation/solidity-analyzer@0.1.1': - resolution: {integrity: sha512-1LMtXj1puAxyFusBgUIy5pZk3073cNXYnXUpuNKFghHbIit/xZgbk0AokpUADbNm3gyD6bFWl3LRFh3dhVdREg==} - engines: {node: '>= 12'} - - '@nomiclabs/hardhat-ethers@2.2.3': - resolution: {integrity: sha512-YhzPdzb612X591FOe68q+qXVXGG2ANZRvDo0RRUtimev85rCrAlv/TLMEZw5c+kq9AbzocLTVX/h2jVIFPL9Xg==} - peerDependencies: - ethers: ^5.0.0 - hardhat: ^2.0.0 - - '@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 - - '@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==} - - unist-util-visit-parents@3.1.1: - resolution: {integrity: sha512-1KROIZWo6bcMrZEwiH2UrXDyalAa0uqzWCxCJj6lPOvTve2WkfgCytoDTPaMnodXh1WrXOq0haVYHj99ynJlsg==} - - 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'} - - universalify@2.0.0: - resolution: {integrity: sha512-hAZsKq7Yy11Zu1DE0OzWjw7nnLZmJZYTDZZyEFHZdUhV8FkH5MCfoU1XMaxXovpyW5nq5scPqq0ZDP9Zyl04oQ==} - engines: {node: '>= 10.0.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: - browserslist: '>= 4.21.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: - typescript: '>=5.0.4' - peerDependenciesMeta: - typescript: - optional: true - - 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: - '@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: - resolution: {integrity: sha512-sgnEEFTZYMui/sTlH1/XEnVNHMujOahPLGMxn1+5sIT45Xjng1Ec1K78jRP15dSmVgg5WBin9yO81j3o9OxofA==} - 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 - - vitest@1.2.2: - 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 - - vscode-oniguruma@1.7.0: - resolution: {integrity: sha512-L9WMGRfrjOhgHSdOYgCt/yRMsXzLDJSL7BPrOZt73gU0iWO4mpqzqQzOz5srxqTvMBaR0XZTSrVWo4j55Rc6cA==} - - vscode-textmate@8.0.0: - resolution: {integrity: sha512-AFbieoL7a5LMqcnOF04ji+rpXadgOXnZsxQr//r83kLPr7biP7am3g9zbaZIaBGwBRWeSvoMD4mgPdX3e4NWBg==} - - w3c-xmlserializer@5.0.0: - resolution: {integrity: sha512-o8qghlI8NZHU1lLPrpi2+Uq7abh4GGPpYANlalzWxyWteJOCsr/P+oPBA49TOLu5FTZO4d3F9MnWJfiMo4BkmA==} - engines: {node: '>=18'} - - 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'} - - webidl-conversions@3.0.1: - resolution: {integrity: sha512-2JAn3z8AR6rjK8Sm8orRC0h/bcl/DqL7tRPdGZ4I1CjdF+EaMLmYxBHyXuKL849eucPFhvBoxMsflfOb8kxaeQ==} - - webidl-conversions@4.0.2: - resolution: {integrity: sha512-YQ+BmxuTgd6UXZW3+ICGfyqRyHXVlD5GtQr5+qjiNW7bF0cqrzX500HVXPBOvgXb5YnzDd+h0zqyv61KUD7+Sg==} - - webidl-conversions@7.0.0: - resolution: {integrity: sha512-VwddBukDzu71offAQR975unBIGqfKZpM+8ZX6ySk8nYhVoo5CYaZyzt3YBvYtRtO+aoGlqxPg/B87NGVZ/fu6g==} - engines: {node: '>=12'} - - whatwg-encoding@3.1.1: - resolution: {integrity: sha512-6qN4hJdMwfYBtE3YBTTHhoeuUrDBPZmbQaxWAqSALV/MeEnR5z1xd8UKud2RAkFoPkmB+hli1TZSnyi84xz1vQ==} - engines: {node: '>=18'} - - whatwg-fetch@3.6.17: - resolution: {integrity: sha512-c4ghIvG6th0eudYwKZY5keb81wtFz9/WeAHAoy8+r18kcWlitUIrmGFQ2rWEl4UCKUilD3zCLHOIPheHx5ypRQ==} - - whatwg-mimetype@4.0.0: - resolution: {integrity: sha512-QaKxh0eNIi2mE9p2vEdzfagOKHCcj1pJ56EEHGQOVxp8r9/iszLUUV7v89x9O1p/T+NlTM5W7jW6+cz4Fq1YVg==} - engines: {node: '>=18'} - - whatwg-url@14.0.0: - resolution: {integrity: sha512-1lfMEm2IEr7RIV+f4lUNPOqfFL+pO+Xw3fJSqmjX9AbXcXcYOkCe1P6+9VBZB6n94af16NfZf+sSk0JCBZC9aw==} - engines: {node: '>=18'} - - whatwg-url@5.0.0: - resolution: {integrity: sha512-saE57nupxk6v3HY35+jzBwYa0rKSy0XR8JSxZPwgLr7ys0IBzhGviA1/TUGJLmSVqs8pb9AnvICXEuOHLprYTw==} - - whatwg-url@7.1.0: - resolution: {integrity: sha512-WUu7Rg1DroM7oQvGWfOiAK21n74Gg+T4elXEQYkOhtyLeWiJFoOGLXPKI/9gzIie9CtwVLm8wtw6YJdKyxSjeg==} - - which-boxed-primitive@1.0.2: - resolution: {integrity: sha512-bwZdv0AKLpplFY2KZRX6TvyuN7ojjr7lwkg6ml0roIy9YeuSr7JS372qlNW18UQYzgYK9ziGcerWqZOmEn9VNg==} - - which-builtin-type@1.1.3: - resolution: {integrity: sha512-YmjsSMDBYsM1CaFiayOVT06+KJeXf0o5M/CAd4o1lTadFAtacTUM49zoYxr/oroopFDfhvN6iEcBxUyc3gvKmw==} - engines: {node: '>= 0.4'} - - which-collection@1.0.1: - resolution: {integrity: sha512-W8xeTUwaln8i3K/cY1nGXzdnVZlidBcagyNFtBdD5kxnb4TvGKR7FfSIS3mYpwWS1QUCutfKz8IY8RjftB0+1A==} - - which-module@1.0.0: - resolution: {integrity: sha512-F6+WgncZi/mJDrammbTuHe1q0R5hOXv/mBaiNA2TCNT/LTHusX0V+CJnj9XT8ki5ln2UZyyddDgHfCzyrOH7MQ==} - - which-module@2.0.0: - resolution: {integrity: sha512-B+enWhmw6cjfVC7kS8Pj9pCrKSc5txArRyaYGe088shv/FGWH+0Rjx/xPgtsWfsUtS27FkP697E4DDhgrgoc0Q==} - - which-pm@2.0.0: - resolution: {integrity: sha512-Lhs9Pmyph0p5n5Z3mVnN0yWcbQYUAD7rbQUiMsQxOJ3T57k7RFe35SUwWMf7dsbDZks1uOmw4AecB/JMDj3v/w==} - engines: {node: '>=8.15'} - - which-typed-array@1.1.11: - resolution: {integrity: sha512-qe9UWWpkeG5yzZ0tNYxDmd7vo58HDBc39mZ0xWWpolAGADdFOzkfamWLDxkOWcvHQKVmdTyQdLD4NOfjLWTKew==} - engines: {node: '>= 0.4'} - - which@1.3.1: - resolution: {integrity: sha512-HxJdYWq1MTIQbJ3nw0cqssHoTNU267KlrDuGZ1WYlxDStUtKUhOaJmh112/TZmHxxUfuJqPXSOm7tDyas0OSIQ==} - hasBin: true - - which@2.0.2: - resolution: {integrity: sha512-BLI3Tl1TW3Pvl70l3yq3Y64i+awpwXqsGBYWkkqMtnbXgrMD+yj7rhW0kuEDxzJaYXGjEW5ogapKNMEKNMjibA==} - engines: {node: '>= 8'} - hasBin: true - - why-is-node-running@2.2.2: - resolution: {integrity: sha512-6tSwToZxTOcotxHeA+qGCq1mVzKR3CwcJGmVcY+QE8SHy6TnpFnh8PAvPNHYr7EcuVeG0QSMxtYCuO1ta/G/oA==} - engines: {node: '>=8'} - hasBin: true - - widest-line@3.1.0: - resolution: {integrity: sha512-NsmoXalsWVDMGupxZ5R08ka9flZjjiLvHVAWYOKtiKM8ujtZWr9cRffak+uSE48+Ob8ObalXpwyeUiyDD6QFgg==} - engines: {node: '>=8'} - - window-size@0.2.0: - resolution: {integrity: sha512-UD7d8HFA2+PZsbKyaOCEy8gMh1oDtHgJh1LfgjQ4zVXmYjAT/kvz3PueITKuqDiIXQe7yzpPnxX3lNc+AhQMyw==} - engines: {node: '>= 0.10.0'} - hasBin: true - - wordwrapjs@4.0.1: - resolution: {integrity: sha512-kKlNACbvHrkpIw6oPeYDSmdCTu2hdMHoyXLTcUKala++lx5Y+wjJ/e474Jqv5abnVmwxw08DiTuHmw69lJGksA==} - engines: {node: '>=8.0.0'} - - workerpool@6.2.1: - resolution: {integrity: sha512-ILEIE97kDZvF9Wb9f6h5aXK4swSlKGUcOEGiIYb2OOu/IrDU9iwj0fD//SsA6E5ibwJxpEvhullJY4Sl4GcpAw==} - - wrap-ansi@2.1.0: - resolution: {integrity: sha512-vAaEaDM946gbNpH5pLVNR+vX2ht6n0Bt3GXwVB1AuAqZosOvHNF3P7wDnh8KLkSqgUh0uh77le7Owgoz+Z9XBw==} - engines: {node: '>=0.10.0'} - - wrap-ansi@6.2.0: - resolution: {integrity: sha512-r6lPcBGxZXlIcymEu7InxDMhdW0KDxpLgoFLcguasxCaJ/SOIZwINatK9KY/tf+ZrlywOKU0UDj3ATXUBfxJXA==} - engines: {node: '>=8'} - - wrap-ansi@7.0.0: - resolution: {integrity: sha512-YVGIj2kamLSTxw6NsZjoBxfSwsn0ycdesmc4p+Q21c5zPuZ1pl+NfxVdxPtdHvmNVOQ6XSYG4AUtyt/Fi7D16Q==} - engines: {node: '>=10'} - - wrap-ansi@8.1.0: - resolution: {integrity: sha512-si7QWI6zUMq56bESFvagtmzMdGOtoxfR+Sez11Mobfc7tm+VkUckk9bW2UeffTGVUbOksxmSw0AA2gs8g71NCQ==} - engines: {node: '>=12'} - - wrap-ansi@9.0.0: - resolution: {integrity: sha512-G8ura3S+3Z2G+mkgNRq8dqaFZAuxfsxpBB8OCTGRTCtp+l/v9nbFNmCUP1BZMts3G1142MsZfn6eeUKrr4PD1Q==} - engines: {node: '>=18'} - - wrappy@1.0.2: - resolution: {integrity: sha512-l4Sp/DRseor9wL6EvV2+TuQn63dMkPjZ/sp9XkghTEbV9KlPS1xUsZ3u7/IQO4wxtcFB4bgpQPRcR3QCvezPcQ==} - - 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 - - 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 - - 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@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 - - xml-name-validator@5.0.0: - resolution: {integrity: sha512-EvGK8EJ3DhaHfbRlETOWAS5pO9MZITeauHKJyb8wyajUfQUenkIg2MvLDTZ4T/TgIcm3HU0TFBgWWboAZ30UHg==} - engines: {node: '>=18'} - - xmlchars@2.2.0: - resolution: {integrity: sha512-JZnDKK8B0RCDw84FNdDAIpZK+JuJw+s7Lz8nksI7SIuU3UXJJslUthsi+uWBUYOwPFwW7W7PRLRfUKpxjtjFCw==} - - xtend@4.0.2: - resolution: {integrity: sha512-LKYU1iAXJXUgAXn9URjiu+MWhyUXHsvfp7mcuYm9dSUKK0/CjtrUwFAxD82/mCWbtLsGjFIad0wIsod4zrTAEQ==} - engines: {node: '>=0.4'} - - y18n@3.2.2: - resolution: {integrity: sha512-uGZHXkHnhF0XeeAPgnKfPv1bgKAYyVvmNL1xlKsPYZPaIHxGti2hHqvOCQv71XMsLxu1QjergkqogUnms5D3YQ==} - - y18n@4.0.3: - resolution: {integrity: sha512-JKhqTOwSrqNA1NY5lSztJ1GrBiUodLMmIZuLiDaMRJ+itFd+ABVE8XBjOvIWL+rSqNDC74LCSFmlb/U4UZ4hJQ==} - - y18n@5.0.8: - resolution: {integrity: sha512-0pfFzegeDWJHJIAmTLRP2DwHjdF5s7jo9tuztdQxAhINCdvS+3nGINqPd00AphqJR/0LhANUS6/+7SCb98YOfA==} - engines: {node: '>=10'} - - yallist@2.1.2: - resolution: {integrity: sha512-ncTzHV7NvsQZkYe1DW7cbDLm0YpzHmZF5r/iyP3ZnQtMiJ+pjzisCiMNI+Sj+xQF5pXhSHxSB3uDbsBTzY/c2A==} - - yallist@3.1.1: - resolution: {integrity: sha512-a4UGQaWPH59mOXUYnAG2ewncQS4i4F43Tv3JoAM+s2VDAmS9NsK8GpDMLrCHPksFT7h3K6TOoUNn2pb7RoXx4g==} - - yallist@4.0.0: - resolution: {integrity: sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A==} - - yaml@1.10.2: - resolution: {integrity: sha512-r3vXyErRCYJ7wg28yvBY5VSoAF8ZvlcW9/BwUzEtUsjvX/DKs24dIkuwjtuprwJJHsbyUbLApepYTR1BN4uHrg==} - engines: {node: '>= 6'} - - yaml@2.3.4: - resolution: {integrity: sha512-8aAvwVUSHpfEqTQ4w/KMlf3HcRdt50E5ODIQJBw1fQ5RL34xabzxtUlzTXVqc4rkZsPbvrXKWnABCD7kWSmocA==} - engines: {node: '>= 14'} - - yargs-parser@18.1.3: - resolution: {integrity: sha512-o50j0JeToy/4K6OZcaQmW6lyXXKhq7csREXcDwk2omFPJEwUNOVtJKvmDr9EI1fAJZUyZcRF7kxGBWmRXudrCQ==} - engines: {node: '>=6'} - - yargs-parser@2.4.1: - resolution: {integrity: sha512-9pIKIJhnI5tonzG6OnCFlz/yln8xHYcGl+pn3xR0Vzff0vzN1PbNRaelgfgRUwZ3s4i3jvxT9WhmUGL4whnasA==} - - yargs-parser@20.2.4: - resolution: {integrity: sha512-WOkpgNhPTlE73h4VFAFsOnomJVaovO8VqLDzy5saChRBFQFBoMYirowyW+Q9HB4HFF4Z7VZTiG3iSzJJA29yRA==} - engines: {node: '>=10'} - - yargs-parser@20.2.9: - resolution: {integrity: sha512-y11nGElTIV+CT3Zv9t7VKl+Q3hTQoT9a1Qzezhhl6Rp21gJ/IVTW7Z3y9EWXhuUBC2Shnf+DX0antecpAwSP8w==} - engines: {node: '>=10'} - - yargs-parser@21.1.1: - resolution: {integrity: sha512-tVpsJW7DdjecAiFpbIB1e3qxIQsE6NoPc5/eTdrbbIC4h0LVsWhnoa3g+m2HclBIujHzsxZ4VJVA+GUuc2/LBw==} - engines: {node: '>=12'} - - yargs-unparser@2.0.0: - resolution: {integrity: sha512-7pRTIA9Qc1caZ0bZ6RYRGbHJthJWuakf+WmHK0rVeLkNrrGhfoabBNdue6kdINI6r4if7ocq9aD/n7xwKOdzOA==} - engines: {node: '>=10'} - - yargs@15.4.1: - resolution: {integrity: sha512-aePbxDmcYW++PaqBsJ+HYUFwCdv4LVvdnhBy78E57PIor8/OVvhMrADFFEDh8DHDFRv/O9i3lPhsENjO7QX0+A==} - engines: {node: '>=8'} - - yargs@16.2.0: - resolution: {integrity: sha512-D1mvvtDG0L5ft/jGWkLpG1+m0eQxOfaBvTNELraWj22wSVUMWxZUvYgJYcKh6jGGIkJFhH4IZPQhR4TKpc8mBw==} - engines: {node: '>=10'} - - yargs@17.7.2: - resolution: {integrity: sha512-7dSzzRQ++CKnNI/krKnYRV7JKKPUXMEh61soaHKg9mrWEhzFWhFnxPxGl+69cD1Ou63C13NUPCnmIcrvqCuM6w==} - engines: {node: '>=12'} - - yargs@4.8.1: - resolution: {integrity: sha512-LqodLrnIDM3IFT+Hf/5sxBnEGECrfdC1uIbgZeJmESCSo4HoCAaKEus8MylXHAkdacGc0ye+Qa+dpkuom8uVYA==} - - yn@2.0.0: - resolution: {integrity: sha512-uTv8J/wiWTgUTg+9vLTi//leUl5vDQS6uii/emeTb2ssY7vl6QWf2fFbIIGjnhjvbdKlU0ed7QPgY1htTC86jQ==} - engines: {node: '>=4'} - - yn@3.1.1: - resolution: {integrity: sha512-Ux4ygGWsu2c7isFWe8Yu1YluJmqVhxqK2cLXNQA5AcC3QfbGNpM7fu0Y8b/z16pXLnFxZYvWhd3fhBY9DLmC6Q==} - engines: {node: '>=6'} - - yocto-queue@0.1.0: - resolution: {integrity: sha512-rVksvsnNCdJ/ohGc6xgPwyN8eheCxsiLM8mxuE/t/mOVqJewPuO1miLpTHQiRgTKCLexL4MeAFVagts7HmNZ2Q==} - engines: {node: '>=10'} - - yocto-queue@1.0.0: - resolution: {integrity: sha512-9bnSc/HEW2uRy67wc+T8UwauLuPJVn28jb+GtJY16iiKWyvmYJRXVT4UamsAEGQfPohgr2q4Tq0sQbQlxTfi1g==} - engines: {node: '>=12.20'} - - 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 - - zod@3.22.4: - resolution: {integrity: sha512-iC+8Io04lddc+mVqQ9AZ7OQ2MrUKGN+oIQyq1vemgt46jwCwLfhq7/pwnBnNXXXZb8VTVLKwp9EDkx+ryxIWmg==} - - zwitch@1.0.5: - resolution: {integrity: sha512-V50KMwwzqJV0NpZIZFwfOD5/lyny3WlSzRiXgA0G7VUnRlqttta1L6UQIHzd6EuBY/cHGfwTIck7w1yH6Q5zUw==} - -snapshots: - - '@aashutoshrathi/word-wrap@1.2.6': {} - - '@adraffy/ens-normalize@1.10.0': {} - - '@ampproject/remapping@2.2.1': - dependencies: - '@jridgewell/gen-mapping': 0.3.3 - '@jridgewell/trace-mapping': 0.3.19 - - '@babel/code-frame@7.22.13': - dependencies: - '@babel/highlight': 7.22.20 - chalk: 2.4.2 - - '@babel/compat-data@7.23.5': {} - - '@babel/core@7.22.10': - 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 - - '@babel/eslint-parser@7.23.10(@babel/core@7.22.10)(eslint@8.56.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 - - '@babel/generator@7.23.3': - dependencies: - '@babel/types': 7.23.6 - '@jridgewell/gen-mapping': 0.3.3 - '@jridgewell/trace-mapping': 0.3.19 - jsesc: 2.5.2 - - '@babel/helper-compilation-targets@7.23.6': - 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 - - '@babel/helper-environment-visitor@7.22.20': {} - - '@babel/helper-function-name@7.23.0': - dependencies: - '@babel/template': 7.22.15 - '@babel/types': 7.23.6 - - '@babel/helper-hoist-variables@7.22.5': - dependencies: - '@babel/types': 7.23.6 - - '@babel/helper-module-imports@7.22.15': - dependencies: - '@babel/types': 7.23.6 - - '@babel/helper-module-transforms@7.23.3(@babel/core@7.22.10)': - 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 - - '@babel/helper-simple-access@7.22.5': - dependencies: - '@babel/types': 7.23.6 - - '@babel/helper-split-export-declaration@7.22.6': - dependencies: - '@babel/types': 7.23.6 - - '@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: - '@babel/template': 7.22.15 - '@babel/traverse': 7.23.3 - '@babel/types': 7.23.6 - transitivePeerDependencies: - - supports-color - - '@babel/highlight@7.22.20': - dependencies: - '@babel/helper-validator-identifier': 7.22.20 - chalk: 2.4.2 - js-tokens: 4.0.0 - - '@babel/parser@7.23.0': - dependencies: - '@babel/types': 7.23.6 - - '@babel/parser@7.23.6': - dependencies: - '@babel/types': 7.23.6 - - '@babel/runtime@7.23.7': - dependencies: - regenerator-runtime: 0.14.1 - - '@babel/template@7.22.15': - dependencies: - '@babel/code-frame': 7.22.13 - '@babel/parser': 7.23.6 - '@babel/types': 7.23.6 - - '@babel/traverse@7.23.3': - 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 - - '@babel/types@7.23.6': - dependencies: - '@babel/helper-string-parser': 7.23.4 - '@babel/helper-validator-identifier': 7.22.20 - to-fast-properties: 2.0.0 - - '@changesets/apply-release-plan@7.0.0': - 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 - - '@changesets/assemble-release-plan@6.0.0': - 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 - - '@changesets/changelog-git@0.2.0': - dependencies: - '@changesets/types': 6.0.0 - - '@changesets/changelog-github@0.4.8': - dependencies: - '@changesets/get-github-info': 0.5.2 - '@changesets/types': 5.2.1 - dotenv: 8.6.0 - transitivePeerDependencies: - - encoding - - '@changesets/cli@2.27.1': - 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 - - '@changesets/config@3.0.0': - 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 - - '@changesets/errors@0.2.0': - dependencies: - extendable-error: 0.1.7 - - '@changesets/get-dependents-graph@2.0.0': - 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 - - '@changesets/get-github-info@0.5.2': - dependencies: - dataloader: 1.4.0 - node-fetch: 2.6.12 - transitivePeerDependencies: - - encoding - - '@changesets/get-release-plan@4.0.0': - 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 - - '@changesets/get-version-range-type@0.4.0': {} - - '@changesets/git@3.0.0': - 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 - - '@changesets/logger@0.1.0': - dependencies: - chalk: 2.4.2 - - '@changesets/parse@0.4.0': - dependencies: - '@changesets/types': 6.0.0 - js-yaml: 3.14.1 - - '@changesets/pre@2.0.0': - 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 - - '@changesets/read@0.6.0': - 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 - - '@changesets/types@4.1.0': {} - - '@changesets/types@5.2.1': {} - - '@changesets/types@6.0.0': {} - - '@changesets/write@0.3.0': - 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 - - '@cspotcode/source-map-support@0.8.1': - dependencies: - '@jridgewell/trace-mapping': 0.3.9 - - '@ensdomains/ens@0.4.5': - dependencies: - bluebird: 3.7.2 - eth-ens-namehash: 2.0.8 - solc: 0.4.26 - testrpc: 0.0.1 - web3-utils: 1.10.1 - - '@ensdomains/resolver@0.2.4': {} - - '@es-joy/jsdoccomment@0.42.0': - dependencies: - comment-parser: 1.4.1 - esquery: 1.5.0 - jsdoc-type-pratt-parser: 4.0.0 - - '@esbuild/aix-ppc64@0.19.10': - optional: true - - '@esbuild/android-arm64@0.19.10': - optional: true - - '@esbuild/android-arm64@0.19.7': - optional: true - - '@esbuild/android-arm@0.19.10': - optional: true - - '@esbuild/android-arm@0.19.7': - optional: true - - '@esbuild/android-x64@0.19.10': - optional: true - - '@esbuild/android-x64@0.19.7': - optional: true - - '@esbuild/darwin-arm64@0.19.10': - optional: true - - '@esbuild/darwin-arm64@0.19.7': - optional: true - - '@esbuild/darwin-x64@0.19.10': - optional: true - - '@esbuild/darwin-x64@0.19.7': - optional: true - - '@esbuild/freebsd-arm64@0.19.10': - optional: 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 - - '@esbuild/linux-arm@0.19.7': - optional: true - - '@esbuild/linux-ia32@0.19.10': - optional: true - - '@esbuild/linux-ia32@0.19.7': - optional: true - - '@esbuild/linux-loong64@0.19.10': - optional: true - - '@esbuild/linux-loong64@0.19.7': - optional: true - - '@esbuild/linux-mips64el@0.19.10': - optional: true - - '@esbuild/linux-mips64el@0.19.7': - optional: true - - '@esbuild/linux-ppc64@0.19.10': - optional: true - - '@esbuild/linux-ppc64@0.19.7': - optional: true - - '@esbuild/linux-riscv64@0.19.10': - optional: true - - '@esbuild/linux-riscv64@0.19.7': - optional: true - - '@esbuild/linux-s390x@0.19.10': - optional: true - - '@esbuild/linux-s390x@0.19.7': - optional: true - - '@esbuild/linux-x64@0.19.10': - optional: true - - '@esbuild/linux-x64@0.19.7': - optional: true - - '@esbuild/netbsd-x64@0.19.10': - optional: true - - '@esbuild/netbsd-x64@0.19.7': - optional: true - - '@esbuild/openbsd-x64@0.19.10': - optional: true - - '@esbuild/openbsd-x64@0.19.7': - optional: true - - '@esbuild/sunos-x64@0.19.10': - optional: true - - '@esbuild/sunos-x64@0.19.7': - optional: true - - '@esbuild/win32-arm64@0.19.10': - optional: true - - '@esbuild/win32-arm64@0.19.7': - optional: true - - '@esbuild/win32-ia32@0.19.10': - optional: true - - '@esbuild/win32-ia32@0.19.7': - optional: true - - '@esbuild/win32-x64@0.19.10': - optional: true - - '@esbuild/win32-x64@0.19.7': - optional: true - - '@eslint-community/eslint-utils@4.4.0(eslint@8.56.0)': - dependencies: - eslint: 8.56.0 - eslint-visitor-keys: 3.4.3 - - '@eslint-community/regexpp@4.6.2': {} - - '@eslint/eslintrc@2.1.4': - 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 - - '@eslint/js@8.56.0': {} - - '@eth-optimism/common-ts@0.8.9(bufferutil@4.0.8)(utf-8-validate@5.0.7)': - dependencies: - '@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 - - supports-color - - utf-8-validate - - '@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: - '@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: - - bufferutil - - utf-8-validate - - '@eth-optimism/core-utils@0.12.0(bufferutil@4.0.8)(utf-8-validate@5.0.7)': - 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(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: - - bufferutil - - utf-8-validate - - '@eth-optimism/core-utils@0.13.2(bufferutil@4.0.8)(utf-8-validate@5.0.7)': - 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(bufferutil@4.0.8)(utf-8-validate@5.0.7) - node-fetch: 2.6.12 - transitivePeerDependencies: - - bufferutil - - encoding - - utf-8-validate - - '@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: - '@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 - - utf-8-validate - - '@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: - '@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: - - '@ensdomains/ens' - - '@ensdomains/resolver' - - supports-color - - '@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: - '@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 - solc: 0.8.15 - typechain: 8.3.1(typescript@5.4.5) - transitivePeerDependencies: - - '@ethersproject/abi' - - '@ethersproject/providers' - - encoding - - supports-color - - typescript - - '@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: - '@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/mock-contract@4.0.4(ethers@5.7.2(bufferutil@4.0.8)(utf-8-validate@5.0.7))': - dependencies: - 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: - - '@ensdomains/ens' - - '@ensdomains/resolver' - - supports-color - - '@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 - - '@ethereumjs/common@2.6.4': - dependencies: - crc-32: 1.2.2 - ethereumjs-util: 7.1.5 - - '@ethereumjs/ethash@1.1.0': - 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 - - '@ethereumjs/rlp@4.0.1': {} - - '@ethereumjs/tx@3.4.0': - dependencies: - '@ethereumjs/common': 2.6.4 - ethereumjs-util: 7.1.5 - - '@ethereumjs/tx@3.5.1': - dependencies: - '@ethereumjs/common': 2.6.4 - ethereumjs-util: 7.1.5 - - '@ethereumjs/util@8.1.0': - dependencies: - '@ethereumjs/rlp': 4.0.1 - ethereum-cryptography: 2.1.2 - micro-ftch: 0.3.1 - - '@ethereumjs/vm@5.6.0': - 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 - - '@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 - - '@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 - - '@ethersproject/abstract-signer@5.7.0': - 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 - - '@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 - - '@ethersproject/base64@5.7.0': - dependencies: - '@ethersproject/bytes': 5.7.0 - - '@ethersproject/basex@5.7.0': - dependencies: - '@ethersproject/bytes': 5.7.0 - '@ethersproject/properties': 5.7.0 - - '@ethersproject/bignumber@5.7.0': - dependencies: - '@ethersproject/bytes': 5.7.0 - '@ethersproject/logger': 5.7.0 - bn.js: 5.2.1 - - '@ethersproject/bytes@5.7.0': - dependencies: - '@ethersproject/logger': 5.7.0 - - '@ethersproject/constants@5.7.0': - dependencies: - '@ethersproject/bignumber': 5.7.0 - - '@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 - - '@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 - - '@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 - - '@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 - - '@ethersproject/keccak256@5.7.0': - dependencies: - '@ethersproject/bytes': 5.7.0 - js-sha3: 0.8.0 - - '@ethersproject/logger@5.7.0': {} - - '@ethersproject/networks@5.7.1': - dependencies: - '@ethersproject/logger': 5.7.0 - - '@ethersproject/pbkdf2@5.7.0': - dependencies: - '@ethersproject/bytes': 5.7.0 - '@ethersproject/sha2': 5.7.0 - - '@ethersproject/properties@5.7.0': - dependencies: - '@ethersproject/logger': 5.7.0 - - '@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 - - '@ethersproject/sha2@5.7.0': - dependencies: - '@ethersproject/bytes': 5.7.0 - '@ethersproject/logger': 5.7.0 - hash.js: 1.1.7 - - '@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 - - '@ethersproject/solidity@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/sha2': 5.7.0 - '@ethersproject/strings': 5.7.0 - - '@ethersproject/strings@5.7.0': - dependencies: - '@ethersproject/bytes': 5.7.0 - '@ethersproject/constants': 5.7.0 - '@ethersproject/logger': 5.7.0 - - '@ethersproject/transactions@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/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 - - '@ethersproject/units@5.7.0': - dependencies: - '@ethersproject/bignumber': 5.7.0 - '@ethersproject/constants': 5.7.0 - '@ethersproject/logger': 5.7.0 - - '@ethersproject/wallet@5.7.0': - 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 - - '@ethersproject/web@5.7.1': - 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 - - '@ethersproject/wordlists@5.7.0': - 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 - - '@ganache/ethereum-address@0.1.4': - dependencies: - '@ganache/utils': 0.1.4 - - '@ganache/ethereum-options@0.1.4': - 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 - - '@ganache/ethereum-utils@0.1.4': - 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 - - '@ganache/options@0.1.4': - dependencies: - '@ganache/utils': 0.1.4 - bip39: 3.0.4 - seedrandom: 3.0.5 - - '@ganache/rlp@0.1.4': - dependencies: - '@ganache/utils': 0.1.4 - rlp: 2.2.6 - - '@ganache/utils@0.1.4': - dependencies: - emittery: 0.10.0 - keccak: 3.0.1 - seedrandom: 3.0.5 - optionalDependencies: - '@trufflesuite/bigint-buffer': 1.1.9 - - '@hapi/hoek@9.3.0': {} - - '@hapi/topo@5.1.0': - dependencies: - '@hapi/hoek': 9.3.0 - - '@humanwhocodes/config-array@0.11.13': - dependencies: - '@humanwhocodes/object-schema': 2.0.1 - debug: 4.3.4(supports-color@8.1.1) - minimatch: 3.1.2 - transitivePeerDependencies: - - supports-color - - '@humanwhocodes/module-importer@1.0.1': {} - - '@humanwhocodes/object-schema@2.0.1': {} - - '@isaacs/cliui@8.0.2': - 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 - - '@istanbuljs/load-nyc-config@1.1.0': - 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 - - '@istanbuljs/schema@0.1.3': {} - - '@jest/schemas@29.6.3': - dependencies: - '@sinclair/typebox': 0.27.8 - - '@jridgewell/gen-mapping@0.3.3': - dependencies: - '@jridgewell/set-array': 1.1.2 - '@jridgewell/sourcemap-codec': 1.4.15 - '@jridgewell/trace-mapping': 0.3.19 - - '@jridgewell/resolve-uri@3.1.1': {} - - '@jridgewell/set-array@1.1.2': {} - - '@jridgewell/source-map@0.3.5': - dependencies: - '@jridgewell/gen-mapping': 0.3.3 - '@jridgewell/trace-mapping': 0.3.19 - optional: true - - '@jridgewell/sourcemap-codec@1.4.15': {} - - '@jridgewell/trace-mapping@0.3.19': - dependencies: - '@jridgewell/resolve-uri': 3.1.1 - '@jridgewell/sourcemap-codec': 1.4.15 - - '@jridgewell/trace-mapping@0.3.9': - dependencies: - '@jridgewell/resolve-uri': 3.1.1 - '@jridgewell/sourcemap-codec': 1.4.15 - - '@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 - - '@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 - - '@metamask/eth-sig-util@4.0.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 - - '@nicolo-ribaudo/eslint-scope-5-internals@5.1.1-v1': - dependencies: - 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 - - '@noble/hashes@1.2.0': {} - - '@noble/hashes@1.3.1': {} - - '@noble/hashes@1.3.2': {} - - '@noble/secp256k1@1.7.1': {} - - '@nodelib/fs.scandir@2.1.5': - dependencies: - '@nodelib/fs.stat': 2.0.5 - run-parallel: 1.2.0 - - '@nodelib/fs.stat@2.0.5': {} - - '@nodelib/fs.walk@1.2.8': - dependencies: - '@nodelib/fs.scandir': 2.1.5 - fastq: 1.15.0 - - '@nomicfoundation/ethereumjs-block@5.0.4': - 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 - - '@nomicfoundation/ethereumjs-blockchain@7.0.4': - 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 - - '@nomicfoundation/ethereumjs-common@4.0.4': - dependencies: - '@nomicfoundation/ethereumjs-util': 9.0.4 - transitivePeerDependencies: - - c-kzg - - '@nomicfoundation/ethereumjs-ethash@3.0.4': - 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 - - '@nomicfoundation/ethereumjs-evm@2.0.4(@nomicfoundation/ethereumjs-verkle@0.0.2)': - 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 - - '@nomicfoundation/ethereumjs-rlp@5.0.4': {} - - '@nomicfoundation/ethereumjs-statemanager@2.0.4(@nomicfoundation/ethereumjs-verkle@0.0.2)': - 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 - 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 - - '@nomicfoundation/ethereumjs-trie@6.0.4': - 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 - - '@nomicfoundation/ethereumjs-tx@5.0.4': - dependencies: - '@nomicfoundation/ethereumjs-common': 4.0.4 - '@nomicfoundation/ethereumjs-rlp': 5.0.4 - '@nomicfoundation/ethereumjs-util': 9.0.4 - ethereum-cryptography: 0.1.3 - - '@nomicfoundation/ethereumjs-util@9.0.4': - dependencies: - '@nomicfoundation/ethereumjs-rlp': 5.0.4 - ethereum-cryptography: 0.1.3 - - '@nomicfoundation/ethereumjs-verkle@0.0.2': - 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 - - '@nomicfoundation/ethereumjs-vm@7.0.4(@nomicfoundation/ethereumjs-verkle@0.0.2)': - 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 - - '@nomicfoundation/solidity-analyzer-darwin-arm64@0.1.1': - optional: true - - '@nomicfoundation/solidity-analyzer-darwin-x64@0.1.1': - optional: true - - '@nomicfoundation/solidity-analyzer-freebsd-x64@0.1.1': - optional: true - - '@nomicfoundation/solidity-analyzer-linux-arm64-gnu@0.1.1': - optional: true - - '@nomicfoundation/solidity-analyzer-linux-arm64-musl@0.1.1': - optional: true - - '@nomicfoundation/solidity-analyzer-linux-x64-gnu@0.1.1': - optional: true - - '@nomicfoundation/solidity-analyzer-linux-x64-musl@0.1.1': - optional: true - - '@nomicfoundation/solidity-analyzer-win32-arm64-msvc@0.1.1': - optional: true - - '@nomicfoundation/solidity-analyzer-win32-ia32-msvc@0.1.1': - optional: true - - '@nomicfoundation/solidity-analyzer-win32-x64-msvc@0.1.1': - optional: true - - '@nomicfoundation/solidity-analyzer@0.1.1': - 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 - - '@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: - 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@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: - '@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) - - '@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: - '@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) - - '@nrwl/nx-cloud@18.0.0': - dependencies: - nx-cloud: 18.0.0 - transitivePeerDependencies: - - debug - - '@nrwl/tao@18.2.2(@swc/core@1.4.13)': - dependencies: - nx: 18.2.2(@swc/core@1.4.13) - tslib: 2.6.2 - transitivePeerDependencies: - - '@swc-node/register' - - '@swc/core' - - debug - - '@nx/nx-darwin-arm64@18.2.2': - optional: true - - '@nx/nx-darwin-x64@18.2.2': - optional: true - - '@nx/nx-freebsd-x64@18.2.2': - optional: true - - '@nx/nx-linux-arm-gnueabihf@18.2.2': - optional: true - - '@nx/nx-linux-arm64-gnu@18.2.2': - optional: true - - '@nx/nx-linux-arm64-musl@18.2.2': - optional: true - - '@nx/nx-linux-x64-gnu@18.2.2': - optional: true - - '@nx/nx-linux-x64-musl@18.2.2': - optional: true - - '@nx/nx-win32-arm64-msvc@18.2.2': - optional: true - - '@nx/nx-win32-x64-msvc@18.2.2': - optional: true - - '@pkgjs/parseargs@0.11.0': - optional: true - - '@resolver-engine/core@0.3.3': - dependencies: - debug: 3.2.7 - is-url: 1.2.4 - request: 2.88.2 - transitivePeerDependencies: - - supports-color - - '@resolver-engine/fs@0.3.3': - dependencies: - '@resolver-engine/core': 0.3.3 - debug: 3.2.7 - transitivePeerDependencies: - - supports-color - - '@resolver-engine/imports-fs@0.3.3': - dependencies: - '@resolver-engine/fs': 0.3.3 - '@resolver-engine/imports': 0.3.3 - debug: 3.2.7 - transitivePeerDependencies: - - supports-color - - '@resolver-engine/imports@0.3.3': - 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 - - '@rollup/rollup-android-arm-eabi@4.5.1': - optional: true - - '@rollup/rollup-android-arm64@4.5.1': - optional: true - - '@rollup/rollup-darwin-arm64@4.5.1': - optional: true - - '@rollup/rollup-darwin-x64@4.5.1': - optional: true - - '@rollup/rollup-linux-arm-gnueabihf@4.5.1': - optional: true - - '@rollup/rollup-linux-arm64-gnu@4.5.1': - optional: true - - '@rollup/rollup-linux-arm64-musl@4.5.1': - optional: true - - '@rollup/rollup-linux-x64-gnu@4.5.1': - optional: true - - '@rollup/rollup-linux-x64-musl@4.5.1': - optional: true - - '@rollup/rollup-win32-arm64-msvc@4.5.1': - optional: true - - '@rollup/rollup-win32-ia32-msvc@4.5.1': - optional: true - - '@rollup/rollup-win32-x64-msvc@4.5.1': - optional: true - - '@scure/base@1.1.3': {} - - '@scure/bip32@1.1.5': - dependencies: - '@noble/hashes': 1.2.0 - '@noble/secp256k1': 1.7.1 - '@scure/base': 1.1.3 - - '@scure/bip32@1.3.1': - dependencies: - '@noble/curves': 1.1.0 - '@noble/hashes': 1.3.2 - '@scure/base': 1.1.3 - - '@scure/bip32@1.3.2': - dependencies: - '@noble/curves': 1.2.0 - '@noble/hashes': 1.3.2 - '@scure/base': 1.1.3 - - '@scure/bip39@1.1.1': - dependencies: - '@noble/hashes': 1.2.0 - '@scure/base': 1.1.3 - - '@scure/bip39@1.2.1': - dependencies: - '@noble/hashes': 1.3.2 - '@scure/base': 1.1.3 - - '@sentry-internal/tracing@7.99.0': - dependencies: - '@sentry/core': 7.99.0 - '@sentry/types': 7.99.0 - '@sentry/utils': 7.99.0 - - '@sentry/core@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 - - '@sentry/core@7.99.0': - dependencies: - '@sentry/types': 7.99.0 - '@sentry/utils': 7.99.0 - - '@sentry/hub@5.30.0': - dependencies: - '@sentry/types': 5.30.0 - '@sentry/utils': 5.30.0 - tslib: 1.14.1 - - '@sentry/minimal@5.30.0': - dependencies: - '@sentry/hub': 5.30.0 - '@sentry/types': 5.30.0 - tslib: 1.14.1 - - '@sentry/node@5.30.0': - 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 - transitivePeerDependencies: - - supports-color - - '@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 - - '@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 - - '@sentry/types@5.30.0': {} - - '@sentry/types@7.99.0': {} - - '@sentry/utils@5.30.0': - dependencies: - '@sentry/types': 5.30.0 - tslib: 1.14.1 - - '@sentry/utils@7.99.0': - dependencies: - '@sentry/types': 7.99.0 - - '@sideway/address@4.1.4': - dependencies: - '@hapi/hoek': 9.3.0 - - '@sideway/formula@3.0.1': {} - - '@sideway/pinpoint@2.0.0': {} - - '@sinclair/typebox@0.27.8': {} - - '@sinonjs/commons@1.8.3': - dependencies: - type-detect: 4.0.8 - - '@sinonjs/fake-timers@7.1.2': - dependencies: - '@sinonjs/commons': 1.8.3 - - '@swc/core-darwin-arm64@1.4.13': - optional: true - - '@swc/core-darwin-x64@1.4.13': - optional: true - - '@swc/core-linux-arm-gnueabihf@1.4.13': - optional: true - - '@swc/core-linux-arm64-gnu@1.4.13': - optional: true - - '@swc/core-linux-arm64-musl@1.4.13': - optional: true - - '@swc/core-linux-x64-gnu@1.4.13': - optional: true - - '@swc/core-linux-x64-musl@1.4.13': - optional: true - - '@swc/core-win32-arm64-msvc@1.4.13': - optional: true - - '@swc/core-win32-ia32-msvc@1.4.13': - optional: true - - '@swc/core-win32-x64-msvc@1.4.13': - optional: true - - '@swc/core@1.4.13': - dependencies: - '@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 - - '@swc/counter@0.1.3': - optional: true - - '@swc/types@0.1.5': - optional: true - - '@textlint/ast-node-types@12.2.1': {} - - '@textlint/markdown-to-ast@12.2.1': - 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 - transitivePeerDependencies: - - supports-color - - '@trufflesuite/bigint-buffer@1.1.9': - dependencies: - node-gyp-build: 4.3.0 - 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: - '@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 - - '@types/abstract-leveldown@5.0.2': {} - - '@types/bn.js@4.11.6': - dependencies: - '@types/node': 20.11.17 - - '@types/bn.js@5.1.0': - dependencies: - '@types/node': 20.11.17 - - '@types/body-parser@1.19.1': - dependencies: - '@types/connect': 3.4.35 - '@types/node': 20.11.17 - - '@types/chai-as-promised@7.1.8': - dependencies: - '@types/chai': 4.3.11 - - '@types/chai@4.3.11': {} - - '@types/connect@3.4.35': - dependencies: - '@types/node': 20.11.17 - - '@types/dateformat@5.0.0': {} - - '@types/debug@4.1.12': - dependencies: - '@types/ms': 0.7.31 - - '@types/estree@1.0.5': {} - - '@types/express-serve-static-core@4.17.35': - dependencies: - '@types/node': 20.11.17 - '@types/qs': 6.9.7 - '@types/range-parser': 1.2.4 - '@types/send': 0.17.1 - - '@types/express@4.17.21': - 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 - - '@types/json-schema@7.0.12': {} - - '@types/json5@0.0.29': {} - - '@types/level-errors@3.0.0': {} - - '@types/levelup@4.3.3': - dependencies: - '@types/abstract-leveldown': 5.0.2 - '@types/level-errors': 3.0.0 - '@types/node': 20.11.17 - - '@types/lru-cache@5.1.1': {} - - '@types/mdast@3.0.10': - dependencies: - '@types/unist': 2.0.6 - - '@types/mime@1.3.2': {} - - '@types/minimatch@3.0.5': {} - - '@types/minimist@1.2.2': {} - - '@types/mkdirp@0.5.2': - dependencies: - '@types/node': 20.11.17 - - '@types/mocha@10.0.6': {} - - '@types/ms@0.7.31': {} - - '@types/node-fetch@2.6.4': - dependencies: - '@types/node': 20.11.17 - form-data: 3.0.1 - - '@types/node@11.11.6': {} - - '@types/node@12.20.55': {} - - '@types/node@20.11.17': - dependencies: - undici-types: 5.26.5 - - '@types/normalize-package-data@2.4.1': {} - - '@types/parse-json@4.0.0': {} - - '@types/pbkdf2@3.1.0': - dependencies: - '@types/node': 20.11.17 - - '@types/prettier@2.3.2': {} - - '@types/qs@6.9.7': {} - - '@types/range-parser@1.2.4': {} - - '@types/readable-stream@2.3.15': - dependencies: - '@types/node': 20.11.17 - safe-buffer: 5.1.2 - - '@types/secp256k1@4.0.6': - dependencies: - '@types/node': 20.11.17 - - '@types/semver@7.5.7': {} - - '@types/send@0.17.1': - dependencies: - '@types/mime': 1.3.2 - '@types/node': 20.11.17 - - '@types/serve-static@1.13.10': - dependencies: - '@types/mime': 1.3.2 - '@types/node': 20.11.17 - - '@types/sinon-chai@3.2.5': - dependencies: - '@types/chai': 4.3.11 - '@types/sinon': 10.0.2 - - '@types/sinon@10.0.2': - dependencies: - '@sinonjs/fake-timers': 7.1.2 - - '@types/underscore@1.11.3': {} - - '@types/unist@2.0.6': {} - - '@types/web3@1.0.19': - dependencies: - '@types/bn.js': 5.1.0 - '@types/underscore': 1.11.3 - - '@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: - '@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 - - '@typescript-eslint/parser@6.21.0(eslint@8.56.0)(typescript@5.4.5)': - dependencies: - '@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: - - supports-color - - '@typescript-eslint/scope-manager@6.21.0': - dependencies: - '@typescript-eslint/types': 6.21.0 - '@typescript-eslint/visitor-keys': 6.21.0 - - '@typescript-eslint/type-utils@6.21.0(eslint@8.56.0)(typescript@5.4.5)': - dependencies: - '@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 - - '@typescript-eslint/types@6.21.0': {} - - '@typescript-eslint/typescript-estree@6.21.0(typescript@5.4.5)': - 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.4.5) - optionalDependencies: - typescript: 5.4.5 - transitivePeerDependencies: - - supports-color - - '@typescript-eslint/utils@6.21.0(eslint@8.56.0)(typescript@5.4.5)': - 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.4.5) - eslint: 8.56.0 - semver: 7.6.0 - transitivePeerDependencies: - - supports-color - - typescript - - '@typescript-eslint/visitor-keys@6.21.0': - dependencies: - '@typescript-eslint/types': 6.21.0 - eslint-visitor-keys: 3.4.3 - - '@ungap/structured-clone@1.2.0': {} - - '@vitest/expect@1.2.2': - dependencies: - '@vitest/spy': 1.2.2 - '@vitest/utils': 1.2.2 - chai: 4.3.10 - - '@vitest/runner@1.2.2': - dependencies: - '@vitest/utils': 1.2.2 - p-limit: 5.0.0 - pathe: 1.1.1 - - '@vitest/snapshot@1.2.2': - dependencies: - magic-string: 0.30.5 - pathe: 1.1.1 - pretty-format: 29.7.0 - - '@vitest/spy@1.2.2': - dependencies: - tinyspy: 2.2.0 - - '@vitest/utils@1.2.2': - dependencies: - diff-sequences: 29.6.3 - estree-walker: 3.0.3 - loupe: 2.3.7 - pretty-format: 29.7.0 - - '@vue/compiler-core@3.3.4': - dependencies: - '@babel/parser': 7.23.6 - '@vue/shared': 3.3.4 - estree-walker: 2.0.2 - source-map-js: 1.0.2 - - '@vue/compiler-dom@3.3.4': - dependencies: - '@vue/compiler-core': 3.3.4 - '@vue/shared': 3.3.4 - - '@vue/compiler-sfc@3.3.4': - 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 - - '@vue/compiler-ssr@3.3.4': - dependencies: - '@vue/compiler-dom': 3.3.4 - '@vue/shared': 3.3.4 - - '@vue/reactivity-transform@3.3.4': - 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 - - '@vue/shared@3.3.4': {} - - '@yarnpkg/lockfile@1.1.0': {} - - '@yarnpkg/parsers@3.0.0-rc.46': - dependencies: - js-yaml: 3.14.1 - tslib: 2.6.2 - - '@zkochan/js-yaml@0.0.6': - dependencies: - argparse: 2.0.1 - - 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: - dependencies: - event-target-shim: 5.0.1 - - 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 - - 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 - - accepts@1.3.8: - dependencies: - mime-types: 2.1.35 - negotiator: 0.6.3 - - acorn-jsx@5.3.2(acorn@8.10.0): - dependencies: - acorn: 8.10.0 - - acorn-walk@8.3.0: {} - - acorn-walk@8.3.2: {} - - acorn@8.10.0: {} - - adm-zip@0.4.16: {} - - aes-js@3.0.0: {} - - agent-base@6.0.2: - dependencies: - debug: 4.3.4(supports-color@8.1.1) - transitivePeerDependencies: - - supports-color - - agent-base@7.1.0: - dependencies: - debug: 4.3.4(supports-color@8.1.1) - transitivePeerDependencies: - - supports-color - optional: true - - aggregate-error@3.1.0: - dependencies: - clean-stack: 2.2.0 - indent-string: 4.0.0 - - 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 - - anchor-markdown-header@0.6.0: - dependencies: - emoji-regex: 10.1.0 - - ansi-align@3.0.1: - dependencies: - string-width: 4.2.3 - - ansi-colors@4.1.1: {} - - ansi-colors@4.1.3: {} - - ansi-escapes@4.3.2: - dependencies: - type-fest: 0.21.3 - - ansi-escapes@6.2.0: - dependencies: - type-fest: 3.13.1 - - ansi-regex@2.1.1: {} - - ansi-regex@5.0.1: {} - - ansi-regex@6.0.1: {} - - ansi-sequence-parser@1.1.1: {} - - ansi-styles@3.2.1: - dependencies: - color-convert: 1.9.3 - - ansi-styles@4.3.0: - dependencies: - color-convert: 2.0.1 - - ansi-styles@5.2.0: {} - - ansi-styles@6.2.1: {} - - any-promise@1.3.0: {} - - anymatch@3.1.3: - dependencies: - normalize-path: 3.0.0 - picomatch: 2.3.1 - - append-transform@2.0.0: - dependencies: - default-require-extensions: 3.0.0 - - archy@1.0.0: {} - - are-docs-informative@0.0.2: {} - - arg@4.1.3: {} - - argparse@1.0.10: - dependencies: - sprintf-js: 1.0.3 - - argparse@2.0.1: {} - - array-back@3.1.0: {} - - array-back@4.0.2: {} - - array-buffer-byte-length@1.0.0: - dependencies: - call-bind: 1.0.2 - is-array-buffer: 3.0.2 - - array-differ@3.0.0: {} - - array-flatten@1.1.1: {} - - 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 - - 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 - - array-union@2.1.0: {} - - 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 - - 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: - 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.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.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 - - arraybuffer.prototype.slice@1.0.1: - dependencies: - array-buffer-byte-length: 1.0.0 - call-bind: 1.0.2 - define-properties: 1.2.0 - get-intrinsic: 1.2.1 - is-array-buffer: 3.0.2 - is-shared-array-buffer: 1.0.2 - - arrify@1.0.1: {} - - arrify@2.0.1: {} - - asn1@0.2.4: - dependencies: - safer-buffer: 2.1.2 - - assert-plus@1.0.0: {} - - assertion-error@1.1.0: {} - - async-eventemitter@0.2.4: - dependencies: - async: 2.6.4 - - async@2.6.4: - dependencies: - lodash: 4.17.21 - - asynciterator.prototype@1.0.0: - dependencies: - has-symbols: 1.0.3 - - asynckit@0.4.0: {} - - atomic-sleep@1.0.0: {} - - available-typed-arrays@1.0.5: {} - - aws-sign2@0.7.0: {} - - aws4@1.11.0: {} - - axios@0.21.4(debug@4.3.4): - dependencies: - follow-redirects: 1.15.5(debug@4.3.4) - transitivePeerDependencies: - - debug - - 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 - - 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 - - bail@1.0.5: {} - - balanced-match@1.0.2: {} - - base-x@3.0.8: - dependencies: - safe-buffer: 5.2.1 - - base64-js@1.5.1: {} - - basic-auth@2.0.1: - dependencies: - safe-buffer: 5.1.2 - - bcfg@0.2.1: - dependencies: - bsert: 0.0.10 - - bcrypt-pbkdf@1.0.2: - dependencies: - tweetnacl: 0.14.5 - - bech32@1.1.4: {} - - better-path-resolve@1.0.0: - dependencies: - is-windows: 1.0.2 - - bigint-crypto-utils@3.3.0: {} - - bignumber.js@9.0.1: {} - - binary-extensions@2.2.0: {} - - bintrees@1.0.1: {} - - bip39@3.0.4: - dependencies: - '@types/node': 11.11.6 - create-hash: 1.2.0 - pbkdf2: 3.1.2 - randombytes: 2.1.0 - - bl@4.1.0: - dependencies: - buffer: 5.7.1 - inherits: 2.0.4 - readable-stream: 3.6.2 - - blakejs@1.1.1: {} - - bluebird@3.7.2: {} - - bn.js@4.11.6: {} - - bn.js@4.12.0: {} - - bn.js@5.2.1: {} - - body-parser@1.20.2: - 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.2 - type-is: 1.6.18 - unpipe: 1.0.0 - transitivePeerDependencies: - - supports-color - - boxen@5.1.2: - dependencies: - ansi-align: 3.0.1 - camelcase: 6.3.0 - chalk: 4.1.2 - cli-boxes: 2.2.1 - string-width: 4.2.3 - type-fest: 0.20.2 - widest-line: 3.1.0 - wrap-ansi: 7.0.0 - - brace-expansion@1.1.11: - dependencies: - balanced-match: 1.0.2 - concat-map: 0.0.1 - - brace-expansion@2.0.1: - dependencies: - balanced-match: 1.0.2 - - braces@3.0.2: - dependencies: - fill-range: 7.0.1 - - breakword@1.0.5: - dependencies: - wcwidth: 1.0.1 - - brorand@1.1.0: {} - - browser-stdout@1.3.1: {} - - browserify-aes@1.2.0: - dependencies: - buffer-xor: 1.0.3 - cipher-base: 1.0.4 - create-hash: 1.2.0 - evp_bytestokey: 1.0.3 - inherits: 2.0.4 - safe-buffer: 5.2.1 - - 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) - - bs58@4.0.1: - dependencies: - base-x: 3.0.8 - - bs58check@2.1.2: - dependencies: - bs58: 4.0.1 - create-hash: 1.2.0 - safe-buffer: 5.2.1 - - bsert@0.0.10: {} - - buffer-from@1.1.2: {} - - buffer-reverse@1.0.1: {} - - buffer-xor@1.0.3: {} - - buffer-xor@2.0.2: - dependencies: - safe-buffer: 5.2.1 - - buffer@5.7.1: - dependencies: - base64-js: 1.5.1 - ieee754: 1.2.1 - - buffer@6.0.3: - dependencies: - base64-js: 1.5.1 - ieee754: 1.2.1 - - bufferutil@4.0.5: - dependencies: - node-gyp-build: 4.6.0 - optional: true - - bufferutil@4.0.8: - dependencies: - node-gyp-build: 4.6.0 - optional: true - - bufio@1.2.0: {} - - builtin-modules@3.3.0: {} - - bundle-require@4.0.1(esbuild@0.19.7): - dependencies: - esbuild: 0.19.7 - load-tsconfig: 0.2.5 - - busboy@1.6.0: - dependencies: - streamsearch: 1.1.0 - - bytes@3.1.2: {} - - cac@6.7.14: {} - - 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 - - call-bind@1.0.2: - dependencies: - function-bind: 1.1.2 - get-intrinsic: 1.2.1 - - callsite@1.0.0: {} - - callsites@3.1.0: {} - - camelcase-keys@6.2.2: - dependencies: - camelcase: 5.3.1 - map-obj: 4.3.0 - quick-lru: 4.0.1 - - camelcase@3.0.0: {} - - camelcase@5.3.1: {} - - camelcase@6.3.0: {} - - caniuse-lite@1.0.30001574: {} - - caseless@0.12.0: {} - - ccount@1.1.0: {} - - chai-as-promised@7.1.1(chai@4.3.10): - dependencies: - chai: 4.3.10 - check-error: 1.0.2 - - chai@4.3.10: - dependencies: - assertion-error: 1.1.0 - check-error: 1.0.3 - deep-eql: 4.1.3 - get-func-name: 2.0.2 - loupe: 2.3.7 - pathval: 1.1.1 - type-detect: 4.0.8 - - chalk@2.4.2: - dependencies: - ansi-styles: 3.2.1 - escape-string-regexp: 1.0.5 - supports-color: 5.5.0 - - chalk@4.1.2: - dependencies: - ansi-styles: 4.3.0 - supports-color: 7.2.0 - - chalk@5.3.0: {} - - character-entities-legacy@1.1.4: {} - - character-entities@1.2.4: {} - - character-reference-invalid@1.1.4: {} - - chardet@0.7.0: {} - - check-error@1.0.2: {} - - check-error@1.0.3: - dependencies: - get-func-name: 2.0.2 - - chokidar@3.5.3: - dependencies: - anymatch: 3.1.3 - braces: 3.0.2 - glob-parent: 5.1.2 - is-binary-path: 2.1.0 - is-glob: 4.0.3 - normalize-path: 3.0.0 - readdirp: 3.6.0 - optionalDependencies: - fsevents: 2.3.3 - - chownr@2.0.0: {} - - ci-info@2.0.0: {} - - ci-info@3.8.0: {} - - ci-info@4.0.0: {} - - cipher-base@1.0.4: - dependencies: - inherits: 2.0.4 - safe-buffer: 5.2.1 - - clean-regexp@1.0.0: - dependencies: - escape-string-regexp: 1.0.5 - - clean-stack@2.2.0: {} - - cli-boxes@2.2.1: {} - - cli-cursor@3.1.0: - dependencies: - restore-cursor: 3.1.0 - - cli-cursor@4.0.0: - dependencies: - restore-cursor: 4.0.0 - - cli-spinners@2.6.1: {} - - cli-spinners@2.9.0: {} - - cli-truncate@4.0.0: - dependencies: - slice-ansi: 5.0.0 - string-width: 7.0.0 - - cliui@3.2.0: - dependencies: - string-width: 1.0.2 - strip-ansi: 3.0.1 - wrap-ansi: 2.1.0 - - cliui@6.0.0: - dependencies: - string-width: 4.2.3 - strip-ansi: 6.0.1 - wrap-ansi: 6.2.0 - - cliui@7.0.4: - dependencies: - string-width: 4.2.3 - strip-ansi: 6.0.1 - wrap-ansi: 7.0.0 - - cliui@8.0.1: - dependencies: - string-width: 4.2.3 - strip-ansi: 6.0.1 - wrap-ansi: 7.0.0 - - clone@1.0.4: {} - - code-point-at@1.1.0: {} - - color-convert@1.9.3: - dependencies: - color-name: 1.1.3 - - color-convert@2.0.1: - dependencies: - color-name: 1.1.4 - - color-name@1.1.3: {} - - color-name@1.1.4: {} - - colorette@2.0.20: {} - - combined-stream@1.0.8: - dependencies: - delayed-stream: 1.0.0 - - command-exists@1.2.9: {} - - 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 - - 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 - - commander@11.1.0: {} - - commander@2.20.3: {} - - commander@3.0.2: {} - - commander@4.1.1: {} - - commander@8.3.0: {} - - comment-parser@1.4.1: {} - - commondir@1.0.1: {} - - concat-map@0.0.1: {} - - content-disposition@0.5.4: - dependencies: - safe-buffer: 5.2.1 - - content-type@1.0.5: {} - - convert-source-map@1.8.0: - dependencies: - safe-buffer: 5.1.2 - - convert-source-map@1.9.0: {} - - cookie-signature@1.0.6: {} - - cookie@0.4.1: {} - - cookie@0.6.0: {} - - core-js-compat@3.35.0: - dependencies: - browserslist: 4.22.2 - - core-js-pure@3.16.2: {} - - core-util-is@1.0.2: {} - - 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 - - crc-32@1.2.2: {} - - 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 - - create-hmac@1.1.7: - dependencies: - cipher-base: 1.0.4 - create-hash: 1.2.0 - inherits: 2.0.4 - ripemd160: 2.0.2 - safe-buffer: 5.2.1 - sha.js: 2.4.11 - - create-require@1.1.1: {} - - cross-spawn@5.1.0: - dependencies: - lru-cache: 4.1.5 - shebang-command: 1.2.0 - which: 1.3.1 - - cross-spawn@7.0.3: - dependencies: - path-key: 3.1.1 - shebang-command: 2.0.0 - which: 2.0.2 - - crypto-js@4.2.0: {} - - cssstyle@4.0.1: - dependencies: - rrweb-cssom: 0.6.0 - optional: true - - csv-generate@3.4.3: {} - - csv-parse@4.16.3: {} - - csv-stringify@5.6.5: {} - - 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 - - dashdash@1.14.1: - dependencies: - assert-plus: 1.0.0 - - data-urls@5.0.0: - dependencies: - whatwg-mimetype: 4.0.0 - whatwg-url: 14.0.0 - optional: true - - dataloader@1.4.0: {} - - dateformat@4.5.1: {} - - debug@2.6.9: - dependencies: - ms: 2.0.0 - - debug@3.2.7: - dependencies: - ms: 2.1.3 - - debug@4.3.4(supports-color@8.1.1): - dependencies: - ms: 2.1.2 - optionalDependencies: - supports-color: 8.1.1 - - decamelize-keys@1.1.0: - dependencies: - decamelize: 1.2.0 - map-obj: 1.0.1 - - decamelize@1.2.0: {} - - decamelize@4.0.0: {} - - decimal.js@10.4.3: - optional: true - - deep-eql@4.1.3: - dependencies: - type-detect: 4.0.8 - - deep-extend@0.6.0: {} - - deep-is@0.1.4: {} - - default-require-extensions@3.0.0: - dependencies: - strip-bom: 4.0.0 - - defaults@1.0.4: - dependencies: - clone: 1.0.4 - - deferred-leveldown@5.3.0: - dependencies: - abstract-leveldown: 6.2.3 - inherits: 2.0.4 - - define-lazy-prop@2.0.0: {} - - define-properties@1.2.0: - dependencies: - has-property-descriptors: 1.0.0 - object-keys: 1.1.1 - - delayed-stream@1.0.0: {} - - depcheck@1.4.7: - dependencies: - '@babel/parser': 7.23.0 - '@babel/traverse': 7.23.3 - '@vue/compiler-sfc': 3.3.4 - callsite: 1.0.0 - camelcase: 6.3.0 - cosmiconfig: 7.1.0 - debug: 4.3.4(supports-color@8.1.1) - deps-regex: 0.2.0 - findup-sync: 5.0.0 - ignore: 5.2.4 - is-core-module: 2.13.0 - js-yaml: 3.14.1 - json5: 2.2.3 - lodash: 4.17.21 - minimatch: 7.4.6 - multimatch: 5.0.0 - please-upgrade-node: 3.2.0 - readdirp: 3.6.0 - require-package-name: 2.0.1 - resolve: 1.22.4 - resolve-from: 5.0.0 - semver: 7.6.0 - yargs: 16.2.0 - transitivePeerDependencies: - - supports-color - - depd@2.0.0: {} - - deps-regex@0.2.0: {} - - destroy@1.2.0: {} - - detect-file@1.0.0: {} - - detect-indent@6.1.0: {} - - diff-sequences@29.6.3: {} - - diff@3.5.0: {} - - diff@4.0.2: {} - - diff@5.0.0: {} - - dir-glob@3.0.1: - dependencies: - path-type: 4.0.0 - - doctoc@2.2.1: - dependencies: - '@textlint/markdown-to-ast': 12.2.1 - anchor-markdown-header: 0.6.0 - htmlparser2: 7.2.0 - minimist: 1.2.8 - underscore: 1.13.4 - update-section: 0.3.3 - transitivePeerDependencies: - - supports-color - - doctrine@2.1.0: - dependencies: - esutils: 2.0.3 - - doctrine@3.0.0: - dependencies: - esutils: 2.0.3 - - dom-serializer@1.4.1: - dependencies: - domelementtype: 2.3.0 - domhandler: 4.3.1 - entities: 2.2.0 - - domelementtype@2.3.0: {} - - domhandler@4.3.1: - dependencies: - domelementtype: 2.3.0 - - domutils@2.8.0: - dependencies: - dom-serializer: 1.4.1 - domelementtype: 2.3.0 - domhandler: 4.3.1 - - dotenv-expand@10.0.0: {} - - dotenv@10.0.0: {} - - dotenv@16.3.2: {} - - dotenv@16.4.5: {} - - dotenv@8.6.0: {} - - duplexer@0.1.2: {} - - 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: {} - - ecc-jsbn@0.1.2: - dependencies: - jsbn: 0.1.1 - safer-buffer: 2.1.2 - - ee-first@1.1.1: {} - - electron-to-chromium@1.4.621: {} - - elliptic@6.5.4: - dependencies: - bn.js: 4.12.0 - brorand: 1.1.0 - hash.js: 1.1.7 - hmac-drbg: 1.0.1 - inherits: 2.0.4 - minimalistic-assert: 1.0.1 - minimalistic-crypto-utils: 1.0.1 - - emittery@0.10.0: {} - - emoji-regex@10.1.0: {} - - emoji-regex@10.3.0: {} - - emoji-regex@8.0.0: {} - - emoji-regex@9.2.2: {} - - encode-utf8@1.0.3: {} - - encodeurl@1.0.2: {} - - 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 - - end-of-stream@1.4.4: - dependencies: - once: 1.4.0 - - enquirer@2.3.6: - dependencies: - ansi-colors: 4.1.3 - - entities@2.2.0: {} - - entities@3.0.1: {} - - entities@4.5.0: - optional: true - - env-paths@2.2.1: {} - - envalid@8.0.0: - dependencies: - tslib: 2.6.2 - - errno@0.1.8: - dependencies: - prr: 1.0.1 - - error-ex@1.3.2: - dependencies: - is-arrayish: 0.2.1 - - es-abstract@1.22.1: - dependencies: - array-buffer-byte-length: 1.0.0 - arraybuffer.prototype.slice: 1.0.1 - available-typed-arrays: 1.0.5 - call-bind: 1.0.2 - es-set-tostringtag: 2.0.1 - es-to-primitive: 1.2.1 - function.prototype.name: 1.1.5 - get-intrinsic: 1.2.1 - get-symbol-description: 1.0.0 - globalthis: 1.0.3 - gopd: 1.0.1 - has: 1.0.3 - has-property-descriptors: 1.0.0 - has-proto: 1.0.1 - has-symbols: 1.0.3 - internal-slot: 1.0.5 - is-array-buffer: 3.0.2 - is-callable: 1.2.7 - is-negative-zero: 2.0.2 - is-regex: 1.1.4 - is-shared-array-buffer: 1.0.2 - is-string: 1.0.7 - is-typed-array: 1.1.12 - is-weakref: 1.0.2 - object-inspect: 1.12.3 - object-keys: 1.1.1 - object.assign: 4.1.4 - regexp.prototype.flags: 1.5.0 - safe-array-concat: 1.0.0 - safe-regex-test: 1.0.0 - string.prototype.trim: 1.2.7 - string.prototype.trimend: 1.0.6 - string.prototype.trimstart: 1.0.6 - typed-array-buffer: 1.0.0 - typed-array-byte-length: 1.0.0 - typed-array-byte-offset: 1.0.0 - typed-array-length: 1.0.4 - unbox-primitive: 1.0.2 - which-typed-array: 1.1.11 - - es-iterator-helpers@1.0.13: - dependencies: - asynciterator.prototype: 1.0.0 - call-bind: 1.0.2 - define-properties: 1.2.0 - es-abstract: 1.22.1 - es-set-tostringtag: 2.0.1 - function-bind: 1.1.2 - get-intrinsic: 1.2.1 - globalthis: 1.0.3 - has-property-descriptors: 1.0.0 - has-proto: 1.0.1 - has-symbols: 1.0.3 - internal-slot: 1.0.5 - iterator.prototype: 1.1.0 - safe-array-concat: 1.0.0 - - 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: - dependencies: - has: 1.0.3 - - 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: {} - - esbuild@0.19.10: - optionalDependencies: - '@esbuild/aix-ppc64': 0.19.10 - '@esbuild/android-arm': 0.19.10 - '@esbuild/android-arm64': 0.19.10 - '@esbuild/android-x64': 0.19.10 - '@esbuild/darwin-arm64': 0.19.10 - '@esbuild/darwin-x64': 0.19.10 - '@esbuild/freebsd-arm64': 0.19.10 - '@esbuild/freebsd-x64': 0.19.10 - '@esbuild/linux-arm': 0.19.10 - '@esbuild/linux-arm64': 0.19.10 - '@esbuild/linux-ia32': 0.19.10 - '@esbuild/linux-loong64': 0.19.10 - '@esbuild/linux-mips64el': 0.19.10 - '@esbuild/linux-ppc64': 0.19.10 - '@esbuild/linux-riscv64': 0.19.10 - '@esbuild/linux-s390x': 0.19.10 - '@esbuild/linux-x64': 0.19.10 - '@esbuild/netbsd-x64': 0.19.10 - '@esbuild/openbsd-x64': 0.19.10 - '@esbuild/sunos-x64': 0.19.10 - '@esbuild/win32-arm64': 0.19.10 - '@esbuild/win32-ia32': 0.19.10 - '@esbuild/win32-x64': 0.19.10 - - esbuild@0.19.7: - optionalDependencies: - '@esbuild/android-arm': 0.19.7 - '@esbuild/android-arm64': 0.19.7 - '@esbuild/android-x64': 0.19.7 - '@esbuild/darwin-arm64': 0.19.7 - '@esbuild/darwin-x64': 0.19.7 - '@esbuild/freebsd-arm64': 0.19.7 - '@esbuild/freebsd-x64': 0.19.7 - '@esbuild/linux-arm': 0.19.7 - '@esbuild/linux-arm64': 0.19.7 - '@esbuild/linux-ia32': 0.19.7 - '@esbuild/linux-loong64': 0.19.7 - '@esbuild/linux-mips64el': 0.19.7 - '@esbuild/linux-ppc64': 0.19.7 - '@esbuild/linux-riscv64': 0.19.7 - '@esbuild/linux-s390x': 0.19.7 - '@esbuild/linux-x64': 0.19.7 - '@esbuild/netbsd-x64': 0.19.7 - '@esbuild/openbsd-x64': 0.19.7 - '@esbuild/sunos-x64': 0.19.7 - '@esbuild/win32-arm64': 0.19.7 - '@esbuild/win32-ia32': 0.19.7 - '@esbuild/win32-x64': 0.19.7 - - escalade@3.1.1: {} - - escape-html@1.0.3: {} - - escape-string-regexp@1.0.5: {} - - escape-string-regexp@4.0.0: {} - - eslint-config-prettier@9.1.0(eslint@8.56.0): - dependencies: - eslint: 8.56.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)(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-import-resolver-node@0.3.9: - dependencies: - debug: 3.2.7 - is-core-module: 2.13.1 - resolve: 1.22.4 - transitivePeerDependencies: - - supports-color - - 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: - 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 - - eslint-plugin-es@3.0.1(eslint@8.56.0): - dependencies: - eslint: 8.56.0 - eslint-utils: 2.1.0 - regexpp: 3.2.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): - dependencies: - array-includes: 3.1.7 - array.prototype.findlastindex: 1.2.3 - array.prototype.flat: 1.3.2 - array.prototype.flatmap: 1.3.2 - debug: 3.2.7 - 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@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 - minimatch: 3.1.2 - object.fromentries: 2.0.7 - object.groupby: 1.0.1 - 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 - - eslint-plugin-jsdoc@48.0.6(eslint@8.56.0): - dependencies: - '@es-joy/jsdoccomment': 0.42.0 - are-docs-informative: 0.0.2 - comment-parser: 1.4.1 - debug: 4.3.4(supports-color@8.1.1) - escape-string-regexp: 4.0.0 - eslint: 8.56.0 - esquery: 1.5.0 - is-builtin-module: 3.2.1 - semver: 7.6.0 - spdx-expression-parse: 4.0.0 - transitivePeerDependencies: - - supports-color - - 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) - eslint-utils: 2.1.0 - ignore: 5.2.4 - minimatch: 3.1.2 - resolve: 1.22.2 - semver: 6.3.1 - - eslint-plugin-prefer-arrow@1.2.3(eslint@8.56.0): - dependencies: - eslint: 8.56.0 - - 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 - prettier: 2.8.8 - prettier-linter-helpers: 1.0.0 - optionalDependencies: - eslint-config-prettier: 9.1.0(eslint@8.56.0) - - eslint-plugin-promise@5.2.0(eslint@8.56.0): - dependencies: - eslint: 8.56.0 - - eslint-plugin-react@7.33.2(eslint@8.56.0): - dependencies: - array-includes: 3.1.6 - array.prototype.flatmap: 1.3.1 - array.prototype.tosorted: 1.1.1 - doctrine: 2.1.0 - es-iterator-helpers: 1.0.13 - eslint: 8.56.0 - estraverse: 5.3.0 - jsx-ast-utils: 3.2.0 - minimatch: 3.1.2 - object.entries: 1.1.6 - object.fromentries: 2.0.6 - object.hasown: 1.1.2 - object.values: 1.1.6 - prop-types: 15.8.1 - resolve: 2.0.0-next.4 - semver: 6.3.1 - string.prototype.matchall: 4.0.8 - - 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) - '@eslint/eslintrc': 2.1.4 - ci-info: 4.0.0 - clean-regexp: 1.0.0 - core-js-compat: 3.35.0 - eslint: 8.56.0 - esquery: 1.5.0 - indent-string: 4.0.0 - is-builtin-module: 3.2.1 - jsesc: 3.0.2 - pluralize: 8.0.0 - read-pkg-up: 7.0.1 - regexp-tree: 0.1.27 - regjsparser: 0.10.0 - semver: 7.6.0 - strip-indent: 3.0.0 - transitivePeerDependencies: - - supports-color - - eslint-scope@5.1.1: - dependencies: - esrecurse: 4.3.0 - estraverse: 4.3.0 - - eslint-scope@7.2.2: - dependencies: - esrecurse: 4.3.0 - estraverse: 5.3.0 - - eslint-utils@2.1.0: - dependencies: - eslint-visitor-keys: 1.3.0 - - eslint-visitor-keys@1.3.0: {} - - eslint-visitor-keys@2.1.0: {} - - eslint-visitor-keys@3.4.3: {} - - eslint@8.56.0: - dependencies: - '@eslint-community/eslint-utils': 4.4.0(eslint@8.56.0) - '@eslint-community/regexpp': 4.6.2 - '@eslint/eslintrc': 2.1.4 - '@eslint/js': 8.56.0 - '@humanwhocodes/config-array': 0.11.13 - '@humanwhocodes/module-importer': 1.0.1 - '@nodelib/fs.walk': 1.2.8 - '@ungap/structured-clone': 1.2.0 - ajv: 6.12.6 - chalk: 4.1.2 - cross-spawn: 7.0.3 - debug: 4.3.4(supports-color@8.1.1) - doctrine: 3.0.0 - escape-string-regexp: 4.0.0 - eslint-scope: 7.2.2 - eslint-visitor-keys: 3.4.3 - espree: 9.6.1 - esquery: 1.5.0 - esutils: 2.0.3 - fast-deep-equal: 3.1.3 - file-entry-cache: 6.0.1 - find-up: 5.0.0 - glob-parent: 6.0.2 - globals: 13.21.0 - graphemer: 1.4.0 - ignore: 5.2.4 - imurmurhash: 0.1.4 - is-glob: 4.0.3 - is-path-inside: 3.0.3 - js-yaml: 4.1.0 - json-stable-stringify-without-jsonify: 1.0.1 - levn: 0.4.1 - lodash.merge: 4.6.2 - minimatch: 3.1.2 - natural-compare: 1.4.0 - optionator: 0.9.3 - strip-ansi: 6.0.1 - text-table: 0.2.0 - transitivePeerDependencies: - - supports-color - - espree@9.6.1: - dependencies: - acorn: 8.10.0 - acorn-jsx: 5.3.2(acorn@8.10.0) - eslint-visitor-keys: 3.4.3 - - esprima@4.0.1: {} - - esquery@1.5.0: - dependencies: - estraverse: 5.3.0 - - esrecurse@4.3.0: - dependencies: - estraverse: 5.3.0 - - estraverse@4.3.0: {} - - estraverse@5.3.0: {} - - estree-walker@2.0.2: {} - - estree-walker@3.0.3: - dependencies: - '@types/estree': 1.0.5 - - esutils@2.0.3: {} - - etag@1.8.1: {} - - eth-ens-namehash@2.0.8: - dependencies: - idna-uts46-hx: 2.3.1 - js-sha3: 0.5.7 - - ethereum-bloom-filters@1.0.10: - dependencies: - js-sha3: 0.8.0 - - ethereum-cryptography@0.1.3: - dependencies: - '@types/pbkdf2': 3.1.0 - '@types/secp256k1': 4.0.6 - blakejs: 1.1.1 - browserify-aes: 1.2.0 - bs58check: 2.1.2 - create-hash: 1.2.0 - create-hmac: 1.1.7 - hash.js: 1.1.7 - keccak: 3.0.3 - pbkdf2: 3.1.2 - randombytes: 2.1.0 - safe-buffer: 5.2.1 - scrypt-js: 3.0.1 - secp256k1: 4.0.3 - setimmediate: 1.0.5 - - 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 - - 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(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(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.4.5) - transitivePeerDependencies: - - '@ensdomains/ens' - - '@ensdomains/resolver' - - '@ethersproject/abi' - - '@ethersproject/providers' - - debug - - encoding - - supports-color - - typescript - - ethereumjs-abi@0.6.8: - dependencies: - bn.js: 4.12.0 - ethereumjs-util: 6.2.1 - - ethereumjs-util@6.2.1: - dependencies: - '@types/bn.js': 4.11.6 - bn.js: 4.12.0 - create-hash: 1.2.0 - elliptic: 6.5.4 - ethereum-cryptography: 0.1.3 - ethjs-util: 0.1.6 - rlp: 2.2.7 - - 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 - - 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 - - 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 - '@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/contracts': 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/networks': 5.7.1 - '@ethersproject/pbkdf2': 5.7.0 - '@ethersproject/properties': 5.7.0 - '@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 - '@ethersproject/signing-key': 5.7.0 - '@ethersproject/solidity': 5.7.0 - '@ethersproject/strings': 5.7.0 - '@ethersproject/transactions': 5.7.0 - '@ethersproject/units': 5.7.0 - '@ethersproject/wallet': 5.7.0 - '@ethersproject/web': 5.7.1 - '@ethersproject/wordlists': 5.7.0 - transitivePeerDependencies: - - bufferutil - - utf-8-validate - - ethjs-unit@0.1.6: - dependencies: - bn.js: 4.11.6 - number-to-bn: 1.7.0 - - ethjs-util@0.1.6: - dependencies: - is-hex-prefixed: 1.0.0 - strip-hex-prefix: 1.0.0 - - event-target-shim@5.0.1: {} - - eventemitter3@5.0.1: {} - - events@3.3.0: {} - - evp_bytestokey@1.0.3: - dependencies: - md5.js: 1.3.5 - safe-buffer: 5.2.1 - - execa@5.1.1: - dependencies: - cross-spawn: 7.0.3 - get-stream: 6.0.1 - human-signals: 2.1.0 - is-stream: 2.0.1 - merge-stream: 2.0.0 - npm-run-path: 4.0.1 - onetime: 5.1.2 - signal-exit: 3.0.7 - strip-final-newline: 2.0.0 - - execa@8.0.1: - dependencies: - cross-spawn: 7.0.3 - get-stream: 8.0.1 - human-signals: 5.0.0 - is-stream: 3.0.0 - merge-stream: 2.0.0 - npm-run-path: 5.1.0 - onetime: 6.0.0 - signal-exit: 4.1.0 - strip-final-newline: 3.0.0 - - expand-tilde@2.0.2: - dependencies: - homedir-polyfill: 1.0.3 - - express-prom-bundle@7.0.0(prom-client@14.2.0): - dependencies: - '@types/express': 4.17.21 - express: 4.19.2 - on-finished: 2.4.1 - prom-client: 14.2.0 - url-value-parser: 2.0.3 - transitivePeerDependencies: - - supports-color - - express@4.19.2: - dependencies: - accepts: 1.3.8 - array-flatten: 1.1.1 - body-parser: 1.20.2 - content-disposition: 0.5.4 - content-type: 1.0.5 - cookie: 0.6.0 - cookie-signature: 1.0.6 - debug: 2.6.9 - depd: 2.0.0 - encodeurl: 1.0.2 - escape-html: 1.0.3 - etag: 1.8.1 - finalhandler: 1.2.0 - fresh: 0.5.2 - http-errors: 2.0.0 - merge-descriptors: 1.0.1 - methods: 1.1.2 - on-finished: 2.4.1 - parseurl: 1.3.3 - path-to-regexp: 0.1.7 - proxy-addr: 2.0.7 - qs: 6.11.0 - range-parser: 1.2.1 - safe-buffer: 5.2.1 - send: 0.18.0 - serve-static: 1.15.0 - setprototypeof: 1.2.0 - statuses: 2.0.1 - type-is: 1.6.18 - utils-merge: 1.0.1 - vary: 1.1.2 - transitivePeerDependencies: - - supports-color - - extend@3.0.2: {} - - extendable-error@0.1.7: {} - - external-editor@3.1.0: - dependencies: - chardet: 0.7.0 - iconv-lite: 0.4.24 - tmp: 0.0.33 - - extsprintf@1.3.0: {} - - extsprintf@1.4.0: {} - - fast-deep-equal@3.1.3: {} - - fast-diff@1.2.0: {} - - fast-glob@3.3.1: - dependencies: - '@nodelib/fs.stat': 2.0.5 - '@nodelib/fs.walk': 1.2.8 - glob-parent: 5.1.2 - merge2: 1.4.1 - micromatch: 4.0.5 - - fast-json-stable-stringify@2.1.0: {} - - fast-levenshtein@2.0.6: {} - - fast-redact@3.2.0: {} - - fastq@1.15.0: - dependencies: - reusify: 1.0.4 - - fault@1.0.4: - dependencies: - format: 0.2.2 - - figures@3.2.0: - dependencies: - escape-string-regexp: 1.0.5 - - file-entry-cache@6.0.1: - dependencies: - flat-cache: 3.0.4 - - fill-range@7.0.1: - dependencies: - to-regex-range: 5.0.1 - - finalhandler@1.2.0: - dependencies: - debug: 2.6.9 - encodeurl: 1.0.2 - escape-html: 1.0.3 - on-finished: 2.4.1 - parseurl: 1.3.3 - statuses: 2.0.1 - unpipe: 1.0.0 - transitivePeerDependencies: - - supports-color - - find-cache-dir@3.3.2: - dependencies: - commondir: 1.0.1 - make-dir: 3.1.0 - pkg-dir: 4.2.0 - - find-replace@3.0.0: - dependencies: - array-back: 3.1.0 - - find-up@1.1.2: - dependencies: - path-exists: 2.1.0 - pinkie-promise: 2.0.1 - - find-up@2.1.0: - dependencies: - locate-path: 2.0.0 - - find-up@4.1.0: - dependencies: - locate-path: 5.0.0 - path-exists: 4.0.0 - - find-up@5.0.0: - dependencies: - locate-path: 6.0.0 - path-exists: 4.0.0 - - find-yarn-workspace-root2@1.2.16: - dependencies: - micromatch: 4.0.5 - pkg-dir: 4.2.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 - - flat-cache@3.0.4: - dependencies: - flatted: 3.2.2 - rimraf: 3.0.2 - - flat@5.0.2: {} - - flatted@3.2.2: {} - - fmix@0.1.0: - dependencies: - imul: 1.0.1 - - follow-redirects@1.15.5(debug@4.3.4): - optionalDependencies: - debug: 4.3.4(supports-color@8.1.1) - - for-each@0.3.3: - dependencies: - is-callable: 1.2.7 - - foreground-child@2.0.0: - dependencies: - cross-spawn: 7.0.3 - signal-exit: 3.0.7 - - foreground-child@3.1.1: - dependencies: - cross-spawn: 7.0.3 - signal-exit: 4.1.0 - - forever-agent@0.6.1: {} - - form-data@2.3.3: - dependencies: - asynckit: 0.4.0 - combined-stream: 1.0.8 - mime-types: 2.1.35 - - form-data@3.0.1: - dependencies: - asynckit: 0.4.0 - combined-stream: 1.0.8 - mime-types: 2.1.35 - - form-data@4.0.0: - dependencies: - asynckit: 0.4.0 - combined-stream: 1.0.8 - mime-types: 2.1.35 - - format@0.2.2: {} - - forwarded@0.2.0: {} - - fp-ts@1.19.3: {} - - fp-ts@1.19.5: {} - - fresh@0.5.2: {} - - fromentries@1.3.2: {} - - fs-constants@1.0.0: {} - - 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 - - fs-extra@10.1.0: - dependencies: - graceful-fs: 4.2.11 - jsonfile: 6.1.0 - universalify: 2.0.0 - - fs-extra@11.1.1: - dependencies: - graceful-fs: 4.2.11 - jsonfile: 6.1.0 - universalify: 2.0.0 - - fs-extra@7.0.1: - dependencies: - graceful-fs: 4.2.11 - jsonfile: 4.0.0 - universalify: 0.1.2 - - fs-extra@8.1.0: - dependencies: - graceful-fs: 4.2.11 - jsonfile: 4.0.0 - universalify: 0.1.2 - - fs-minipass@2.1.0: - dependencies: - minipass: 3.3.6 - - fs.realpath@1.0.0: {} - - fsevents@2.3.3: - optional: true - - function-bind@1.1.2: {} - - 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: {} - - functions-have-names@1.2.3: {} - - ganache@7.4.3: - optionalDependencies: - bufferutil: 4.0.5 - utf-8-validate: 5.0.7 - - gensync@1.0.0-beta.2: {} - - get-caller-file@1.0.3: {} - - get-caller-file@2.0.5: {} - - get-east-asian-width@1.2.0: {} - - get-func-name@2.0.2: {} - - 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: {} - - get-stream@6.0.1: {} - - get-stream@8.0.1: {} - - get-symbol-description@1.0.0: - dependencies: - call-bind: 1.0.2 - get-intrinsic: 1.2.1 - - get-tsconfig@4.7.2: - dependencies: - resolve-pkg-maps: 1.0.0 - - getpass@0.1.7: - dependencies: - assert-plus: 1.0.0 - - glob-parent@5.1.2: - dependencies: - is-glob: 4.0.3 - - glob-parent@6.0.2: - dependencies: - is-glob: 4.0.3 - - 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 - - glob@7.1.6: - dependencies: - fs.realpath: 1.0.0 - inflight: 1.0.6 - inherits: 2.0.4 - minimatch: 3.1.2 - once: 1.4.0 - path-is-absolute: 1.0.1 - - glob@7.1.7: - dependencies: - fs.realpath: 1.0.0 - inflight: 1.0.6 - inherits: 2.0.4 - minimatch: 3.1.2 - once: 1.4.0 - path-is-absolute: 1.0.1 - - glob@7.2.0: - dependencies: - fs.realpath: 1.0.0 - inflight: 1.0.6 - inherits: 2.0.4 - minimatch: 3.1.2 - once: 1.4.0 - path-is-absolute: 1.0.1 - - glob@7.2.3: - dependencies: - fs.realpath: 1.0.0 - inflight: 1.0.6 - inherits: 2.0.4 - minimatch: 3.1.2 - once: 1.4.0 - path-is-absolute: 1.0.1 - - global-modules@1.0.0: - dependencies: - global-prefix: 1.0.2 - is-windows: 1.0.2 - resolve-dir: 1.0.1 - - 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 - - globals@11.12.0: {} - - globals@13.21.0: - dependencies: - type-fest: 0.20.2 - - globalthis@1.0.3: - dependencies: - define-properties: 1.2.0 - - globby@11.1.0: - dependencies: - array-union: 2.1.0 - dir-glob: 3.0.1 - fast-glob: 3.3.1 - ignore: 5.2.4 - merge2: 1.4.1 - slash: 3.0.0 - - gopd@1.0.1: - dependencies: - get-intrinsic: 1.2.1 - - graceful-fs@4.2.11: {} - - grapheme-splitter@1.0.4: {} - - graphemer@1.4.0: {} - - har-schema@2.0.0: {} - - har-validator@5.1.5: - dependencies: - ajv: 6.12.6 - har-schema: 2.0.0 - - hard-rejection@2.1.0: {} - - 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 - '@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/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 - '@types/qs': 6.9.7 - axios: 0.21.4(debug@4.3.4) - chalk: 4.1.2 - chokidar: 3.5.3 - debug: 4.3.4(supports-color@8.1.1) - enquirer: 2.3.6 - 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-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 - '@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 - '@nomicfoundation/ethereumjs-verkle': 0.0.2 - '@nomicfoundation/ethereumjs-vm': 7.0.4(@nomicfoundation/ethereumjs-verkle@0.0.2) - '@nomicfoundation/solidity-analyzer': 0.1.1 - '@sentry/node': 5.30.0 - '@types/bn.js': 5.1.0 - '@types/lru-cache': 5.1.1 - adm-zip: 0.4.16 - aggregate-error: 3.1.0 - ansi-escapes: 4.3.2 - boxen: 5.1.2 - chalk: 2.4.2 - chokidar: 3.5.3 - ci-info: 2.0.0 - debug: 4.3.4(supports-color@8.1.1) - enquirer: 2.3.6 - env-paths: 2.2.1 - ethereum-cryptography: 1.2.0 - ethereumjs-abi: 0.6.8 - find-up: 2.1.0 - fp-ts: 1.19.3 - fs-extra: 7.0.1 - glob: 7.2.0 - immutable: 4.1.0 - io-ts: 1.10.4 - keccak: 3.0.3 - lodash: 4.17.21 - mnemonist: 0.38.3 - mocha: 10.2.0 - p-map: 4.0.0 - raw-body: 2.5.2 - resolve: 1.17.0 - semver: 6.3.1 - solc: 0.7.3(debug@4.3.4) - source-map-support: 0.5.21 - stacktrace-parser: 0.1.10 - tsort: 0.0.1 - undici: 5.24.0 - uuid: 8.3.2 - 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 - - has-bigints@1.0.2: {} - - has-flag@3.0.0: {} - - has-flag@4.0.0: {} - - has-property-descriptors@1.0.0: - dependencies: - get-intrinsic: 1.2.1 - - has-proto@1.0.1: {} - - has-symbols@1.0.3: {} - - has-tostringtag@1.0.0: - dependencies: - has-symbols: 1.0.3 - - has@1.0.3: - dependencies: - function-bind: 1.1.2 - - hash-base@3.1.0: - dependencies: - inherits: 2.0.4 - readable-stream: 3.6.2 - safe-buffer: 5.2.1 - - hash.js@1.1.7: - dependencies: - inherits: 2.0.4 - minimalistic-assert: 1.0.1 - - hasha@5.2.2: - dependencies: - is-stream: 2.0.1 - type-fest: 0.8.1 - - hasown@2.0.0: - dependencies: - function-bind: 1.1.2 - - he@1.2.0: {} - - hmac-drbg@1.0.1: - dependencies: - hash.js: 1.1.7 - minimalistic-assert: 1.0.1 - minimalistic-crypto-utils: 1.0.1 - - homedir-polyfill@1.0.3: - dependencies: - parse-passwd: 1.0.0 - - hosted-git-info@2.8.9: {} - - html-encoding-sniffer@4.0.0: - dependencies: - whatwg-encoding: 3.1.1 - optional: true - - html-escaper@2.0.2: {} - - htmlparser2@7.2.0: - dependencies: - domelementtype: 2.3.0 - domhandler: 4.3.1 - domutils: 2.8.0 - entities: 3.0.1 - - http-errors@2.0.0: - dependencies: - depd: 2.0.0 - inherits: 2.0.4 - setprototypeof: 1.2.0 - statuses: 2.0.1 - toidentifier: 1.0.1 - - http-proxy-agent@7.0.0: - dependencies: - agent-base: 7.1.0 - debug: 4.3.4(supports-color@8.1.1) - transitivePeerDependencies: - - supports-color - optional: true - - http-signature@1.2.0: - dependencies: - assert-plus: 1.0.0 - jsprim: 1.4.1 - sshpk: 1.16.1 - - https-proxy-agent@5.0.1: - dependencies: - agent-base: 6.0.2 - debug: 4.3.4(supports-color@8.1.1) - transitivePeerDependencies: - - supports-color - - https-proxy-agent@7.0.2: - dependencies: - agent-base: 7.1.0 - debug: 4.3.4(supports-color@8.1.1) - transitivePeerDependencies: - - supports-color - optional: true - - human-id@1.0.2: {} - - human-signals@2.1.0: {} - - human-signals@5.0.0: {} - - husky@9.0.10: {} - - iconv-lite@0.4.24: - dependencies: - safer-buffer: 2.1.2 - - iconv-lite@0.6.3: - dependencies: - safer-buffer: 2.1.2 - optional: true - - idna-uts46-hx@2.3.1: - dependencies: - punycode: 2.1.0 - - ieee754@1.2.1: {} - - ignore@5.2.4: {} - - immediate@3.2.3: {} - - immediate@3.3.0: {} - - immutable@4.1.0: {} - - import-fresh@3.3.0: - dependencies: - parent-module: 1.0.1 - resolve-from: 4.0.0 - - imul@1.0.1: {} - - imurmurhash@0.1.4: {} - - indent-string@4.0.0: {} - - inflight@1.0.6: - dependencies: - once: 1.4.0 - wrappy: 1.0.2 - - inherits@2.0.4: {} - - ini@1.3.8: {} - - internal-slot@1.0.5: - dependencies: - get-intrinsic: 1.2.1 - has: 1.0.3 - side-channel: 1.0.4 - - invert-kv@1.0.0: {} - - io-ts@1.10.4: - dependencies: - fp-ts: 1.19.5 - - ipaddr.js@1.9.1: {} - - is-alphabetical@1.0.4: {} - - is-alphanumerical@1.0.4: - dependencies: - is-alphabetical: 1.0.4 - is-decimal: 1.0.4 - - 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: {} - - is-async-function@2.0.0: - dependencies: - has-tostringtag: 1.0.0 - - is-bigint@1.0.4: - dependencies: - has-bigints: 1.0.2 - - is-binary-path@2.1.0: - dependencies: - binary-extensions: 2.2.0 - - is-boolean-object@1.1.2: - dependencies: - call-bind: 1.0.2 - has-tostringtag: 1.0.0 - - is-buffer@2.0.5: {} - - is-builtin-module@3.2.1: - dependencies: - builtin-modules: 3.3.0 - - is-callable@1.2.7: {} - - is-core-module@2.13.0: - dependencies: - has: 1.0.3 - - is-core-module@2.13.1: - dependencies: - hasown: 2.0.0 - - is-date-object@1.0.5: - dependencies: - has-tostringtag: 1.0.0 - - is-decimal@1.0.4: {} - - is-docker@2.2.1: {} - - is-extglob@2.1.1: {} - - is-finalizationregistry@1.0.2: - dependencies: - call-bind: 1.0.2 - - is-fullwidth-code-point@1.0.0: - dependencies: - number-is-nan: 1.0.1 - - is-fullwidth-code-point@3.0.0: {} - - is-fullwidth-code-point@4.0.0: {} - - is-fullwidth-code-point@5.0.0: - dependencies: - get-east-asian-width: 1.2.0 - - is-generator-function@1.0.10: - dependencies: - has-tostringtag: 1.0.0 - - is-glob@4.0.3: - dependencies: - is-extglob: 2.1.1 - - is-hex-prefixed@1.0.0: {} - - is-hexadecimal@1.0.4: {} - - is-interactive@1.0.0: {} - - is-map@2.0.2: {} - - is-negative-zero@2.0.2: {} - - is-number-object@1.0.7: - dependencies: - has-tostringtag: 1.0.0 - - is-number@7.0.0: {} - - is-path-inside@3.0.3: {} - - is-plain-obj@1.1.0: {} - - is-plain-obj@2.1.0: {} - - is-potential-custom-element-name@1.0.1: - optional: true - - is-regex@1.1.4: - dependencies: - call-bind: 1.0.2 - has-tostringtag: 1.0.0 - - is-set@2.0.2: {} - - is-shared-array-buffer@1.0.2: - dependencies: - call-bind: 1.0.2 - - is-stream@2.0.1: {} - - is-stream@3.0.0: {} - - is-string@1.0.7: - dependencies: - has-tostringtag: 1.0.0 - - is-subdir@1.2.0: - dependencies: - better-path-resolve: 1.0.0 - - is-symbol@1.0.4: - dependencies: - has-symbols: 1.0.3 - - is-typed-array@1.1.12: - dependencies: - which-typed-array: 1.1.11 - - is-typedarray@1.0.0: {} - - is-unicode-supported@0.1.0: {} - - is-url@1.2.4: {} - - is-utf8@0.2.1: {} - - is-weakmap@2.0.1: {} - - is-weakref@1.0.2: - dependencies: - call-bind: 1.0.2 - - is-weakset@2.0.2: - dependencies: - call-bind: 1.0.2 - get-intrinsic: 1.2.1 - - is-windows@1.0.2: {} - - is-wsl@2.2.0: - dependencies: - is-docker: 2.2.1 - - isarray@2.0.5: {} - - isexe@2.0.0: {} - - isomorphic-fetch@3.0.0: - dependencies: - node-fetch: 2.6.12 - whatwg-fetch: 3.6.17 - transitivePeerDependencies: - - encoding - - isows@1.0.3(ws@8.13.0(bufferutil@4.0.8)(utf-8-validate@5.0.7)): - dependencies: - ws: 8.13.0(bufferutil@4.0.8)(utf-8-validate@5.0.7) - - isstream@0.1.2: {} - - istanbul-lib-coverage@3.0.0: {} - - istanbul-lib-coverage@3.2.2: {} - - istanbul-lib-hook@3.0.0: - dependencies: - append-transform: 2.0.0 - - istanbul-lib-instrument@4.0.3: - dependencies: - '@babel/core': 7.22.10 - '@istanbuljs/schema': 0.1.3 - istanbul-lib-coverage: 3.2.2 - semver: 6.3.1 - transitivePeerDependencies: - - supports-color - - istanbul-lib-processinfo@2.0.2: - dependencies: - archy: 1.0.0 - cross-spawn: 7.0.3 - istanbul-lib-coverage: 3.2.2 - make-dir: 3.1.0 - p-map: 3.0.0 - rimraf: 3.0.2 - uuid: 3.4.0 - - istanbul-lib-report@3.0.0: - dependencies: - istanbul-lib-coverage: 3.2.2 - make-dir: 3.1.0 - supports-color: 7.2.0 - - istanbul-lib-report@3.0.1: - dependencies: - istanbul-lib-coverage: 3.2.2 - make-dir: 4.0.0 - supports-color: 7.2.0 - - 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 - - istanbul-reports@3.0.2: - dependencies: - html-escaper: 2.0.2 - istanbul-lib-report: 3.0.1 - - 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 - - jackspeak@2.3.6: - dependencies: - '@isaacs/cliui': 8.0.2 - optionalDependencies: - '@pkgjs/parseargs': 0.11.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 - - jest-get-type@29.6.3: {} - - 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 - - joycon@3.1.1: {} - - js-sdsl@4.4.2: {} - - js-sha3@0.5.7: {} - - js-sha3@0.8.0: {} - - js-tokens@4.0.0: {} - - js-yaml@3.14.1: - dependencies: - argparse: 1.0.10 - esprima: 4.0.1 - - js-yaml@4.1.0: - dependencies: - argparse: 2.0.1 - - jsbn@0.1.1: {} - - jsdoc-type-pratt-parser@4.0.0: {} - - jsdom@24.0.0(bufferutil@4.0.8)(utf-8-validate@5.0.7): - dependencies: - cssstyle: 4.0.1 - data-urls: 5.0.0 - decimal.js: 10.4.3 - form-data: 4.0.0 - html-encoding-sniffer: 4.0.0 - http-proxy-agent: 7.0.0 - https-proxy-agent: 7.0.2 - is-potential-custom-element-name: 1.0.1 - nwsapi: 2.2.7 - parse5: 7.1.2 - rrweb-cssom: 0.6.0 - saxes: 6.0.0 - symbol-tree: 3.2.4 - tough-cookie: 4.1.3 - w3c-xmlserializer: 5.0.0 - webidl-conversions: 7.0.0 - whatwg-encoding: 3.1.1 - whatwg-mimetype: 4.0.0 - whatwg-url: 14.0.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 - optional: true - - jsesc@0.5.0: {} - - jsesc@2.5.2: {} - - jsesc@3.0.2: {} - - json-bigint@1.0.0: - dependencies: - bignumber.js: 9.0.1 - - json-parse-even-better-errors@2.3.1: {} - - json-schema-traverse@0.4.1: {} - - json-schema@0.2.3: {} - - json-stable-stringify-without-jsonify@1.0.1: {} - - json-stringify-safe@5.0.1: {} - - json5@1.0.2: - dependencies: - minimist: 1.2.8 - - json5@2.2.3: {} - - jsonc-parser@3.2.0: {} - - jsonfile@2.4.0: - optionalDependencies: - graceful-fs: 4.2.11 - - jsonfile@4.0.0: - optionalDependencies: - graceful-fs: 4.2.11 - - jsonfile@6.1.0: - dependencies: - universalify: 2.0.0 - optionalDependencies: - graceful-fs: 4.2.11 - - jsprim@1.4.1: - dependencies: - assert-plus: 1.0.0 - extsprintf: 1.3.0 - json-schema: 0.2.3 - verror: 1.10.0 - - jsx-ast-utils@3.2.0: - dependencies: - array-includes: 3.1.7 - object.assign: 4.1.4 - - keccak@3.0.1: - dependencies: - node-addon-api: 2.0.2 - node-gyp-build: 4.6.0 - - keccak@3.0.3: - dependencies: - node-addon-api: 2.0.2 - node-gyp-build: 4.6.0 - readable-stream: 3.6.2 - - kind-of@6.0.3: {} - - klaw@1.3.1: - optionalDependencies: - graceful-fs: 4.2.11 - - kleur@4.1.5: {} - - lcid@1.0.0: - dependencies: - invert-kv: 1.0.0 - - level-codec@9.0.2: - dependencies: - buffer: 5.7.1 - - level-concat-iterator@2.0.1: {} - - level-errors@2.0.1: - dependencies: - errno: 0.1.8 - - level-iterator-stream@4.0.2: - dependencies: - inherits: 2.0.4 - readable-stream: 3.6.2 - xtend: 4.0.2 - - level-mem@5.0.1: - dependencies: - level-packager: 5.1.1 - memdown: 5.1.0 - - level-packager@5.1.1: - dependencies: - encoding-down: 6.3.0 - levelup: 4.4.0 - - level-supports@1.0.1: - dependencies: - xtend: 4.0.2 - - level-ws@2.0.0: - dependencies: - inherits: 2.0.4 - readable-stream: 3.6.2 - xtend: 4.0.2 - - 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 - - levn@0.4.1: - dependencies: - prelude-ls: 1.2.1 - type-check: 0.4.0 - - lilconfig@2.1.0: {} - - lilconfig@3.0.0: {} - - lines-and-columns@1.2.4: {} - - lines-and-columns@2.0.3: {} - - lint-staged@15.2.0: - dependencies: - chalk: 5.3.0 - commander: 11.1.0 - debug: 4.3.4(supports-color@8.1.1) - execa: 8.0.1 - lilconfig: 3.0.0 - listr2: 8.0.0 - micromatch: 4.0.5 - pidtree: 0.6.0 - string-argv: 0.3.2 - yaml: 2.3.4 - transitivePeerDependencies: - - supports-color - - listr2@8.0.0: - dependencies: - cli-truncate: 4.0.0 - colorette: 2.0.20 - eventemitter3: 5.0.1 - log-update: 6.0.0 - rfdc: 1.3.0 - wrap-ansi: 9.0.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 - - 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 - - local-pkg@0.5.0: - dependencies: - mlly: 1.4.2 - pkg-types: 1.0.3 - - locate-path@2.0.0: - dependencies: - p-locate: 2.0.0 - path-exists: 3.0.0 - - locate-path@5.0.0: - dependencies: - p-locate: 4.1.0 - - locate-path@6.0.0: - dependencies: - p-locate: 5.0.0 - - lodash.assign@4.2.0: {} - - lodash.camelcase@4.3.0: {} - - lodash.flattendeep@4.4.0: {} - - lodash.merge@4.6.2: {} - - lodash.sortby@4.7.0: {} - - lodash.startcase@4.4.0: {} - - lodash@4.17.21: {} - - log-symbols@4.1.0: - dependencies: - chalk: 4.1.2 - is-unicode-supported: 0.1.0 - - 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 - - longest-streak@2.0.4: {} - - loose-envify@1.4.0: - dependencies: - js-tokens: 4.0.0 - - loupe@2.3.7: - dependencies: - get-func-name: 2.0.2 - - lru-cache@10.1.0: {} - - lru-cache@4.1.5: - dependencies: - pseudomap: 1.0.2 - yallist: 2.1.2 - - lru-cache@5.1.1: - dependencies: - yallist: 3.1.1 - - lru-cache@6.0.0: - dependencies: - yallist: 4.0.0 - - lru_map@0.3.3: {} - - ltgt@2.2.1: {} - - lunr@2.3.9: {} - - magic-string@0.30.5: - dependencies: - '@jridgewell/sourcemap-codec': 1.4.15 - - make-dir@3.1.0: - dependencies: - semver: 6.3.1 - - make-dir@4.0.0: - dependencies: - semver: 7.6.0 - - make-error@1.3.6: {} - - map-obj@1.0.1: {} - - map-obj@4.3.0: {} - - markdown-table@2.0.0: - dependencies: - repeat-string: 1.6.1 - - marked@4.3.0: {} - - match-all@1.2.6: {} - - mcl-wasm@0.7.8: - dependencies: - typescript: 4.9.5 - - md5.js@1.3.5: - dependencies: - hash-base: 3.1.0 - inherits: 2.0.4 - safe-buffer: 5.2.1 - - 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 - - mdast-util-footnote@0.1.7: - dependencies: - mdast-util-to-markdown: 0.6.5 - micromark: 2.11.4 - transitivePeerDependencies: - - supports-color - - mdast-util-from-markdown@0.8.5: - dependencies: - '@types/mdast': 3.0.10 - mdast-util-to-string: 2.0.0 - micromark: 2.11.4 - parse-entities: 2.0.0 - unist-util-stringify-position: 2.0.3 - transitivePeerDependencies: - - supports-color - - mdast-util-frontmatter@0.2.0: - dependencies: - micromark-extension-frontmatter: 0.2.2 - - 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 - - mdast-util-gfm-strikethrough@0.2.3: - dependencies: - mdast-util-to-markdown: 0.6.5 - - mdast-util-gfm-table@0.1.6: - dependencies: - markdown-table: 2.0.0 - mdast-util-to-markdown: 0.6.5 - - mdast-util-gfm-task-list-item@0.1.6: - dependencies: - mdast-util-to-markdown: 0.6.5 - - mdast-util-gfm@0.1.2: - dependencies: - mdast-util-gfm-autolink-literal: 0.1.3 - mdast-util-gfm-strikethrough: 0.2.3 - mdast-util-gfm-table: 0.1.6 - mdast-util-gfm-task-list-item: 0.1.6 - mdast-util-to-markdown: 0.6.5 - transitivePeerDependencies: - - supports-color - - mdast-util-to-markdown@0.6.5: - dependencies: - '@types/unist': 2.0.6 - longest-streak: 2.0.4 - mdast-util-to-string: 2.0.0 - parse-entities: 2.0.0 - repeat-string: 1.6.1 - zwitch: 1.0.5 - - mdast-util-to-string@2.0.0: {} - - media-typer@0.3.0: {} - - memdown@5.1.0: - dependencies: - abstract-leveldown: 6.2.3 - functional-red-black-tree: 1.0.1 - immediate: 3.2.3 - inherits: 2.0.4 - ltgt: 2.2.1 - safe-buffer: 5.2.1 - - memorystream@0.3.1: {} - - meow@6.1.1: - dependencies: - '@types/minimist': 1.2.2 - camelcase-keys: 6.2.2 - decamelize-keys: 1.1.0 - hard-rejection: 2.1.0 - minimist-options: 4.1.0 - normalize-package-data: 2.5.0 - read-pkg-up: 7.0.1 - redent: 3.0.0 - trim-newlines: 3.0.1 - type-fest: 0.13.1 - yargs-parser: 18.1.3 - - merge-descriptors@1.0.1: {} - - merge-stream@2.0.0: {} - - merge2@1.4.1: {} - - merkle-patricia-tree@4.2.4: - dependencies: - '@types/levelup': 4.3.3 - ethereumjs-util: 7.1.5 - level-mem: 5.0.1 - level-ws: 2.0.0 - readable-stream: 3.6.2 - semaphore-async-await: 1.5.1 - - 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 - - methods@1.1.2: {} - - micro-ftch@0.3.1: {} - - micromark-extension-footnote@0.3.2: - dependencies: - micromark: 2.11.4 - transitivePeerDependencies: - - supports-color - - micromark-extension-frontmatter@0.2.2: - dependencies: - fault: 1.0.4 - - micromark-extension-gfm-autolink-literal@0.5.7: - dependencies: - micromark: 2.11.4 - transitivePeerDependencies: - - supports-color - - micromark-extension-gfm-strikethrough@0.6.5: - dependencies: - micromark: 2.11.4 - transitivePeerDependencies: - - supports-color - - micromark-extension-gfm-table@0.4.3: - dependencies: - micromark: 2.11.4 - transitivePeerDependencies: - - supports-color - - micromark-extension-gfm-tagfilter@0.3.0: {} - - micromark-extension-gfm-task-list-item@0.3.3: - dependencies: - micromark: 2.11.4 - transitivePeerDependencies: - - supports-color - - micromark-extension-gfm@0.3.3: - dependencies: - micromark: 2.11.4 - micromark-extension-gfm-autolink-literal: 0.5.7 - micromark-extension-gfm-strikethrough: 0.6.5 - micromark-extension-gfm-table: 0.4.3 - micromark-extension-gfm-tagfilter: 0.3.0 - micromark-extension-gfm-task-list-item: 0.3.3 - transitivePeerDependencies: - - supports-color - - micromark@2.11.4: - dependencies: - debug: 4.3.4(supports-color@8.1.1) - parse-entities: 2.0.0 - transitivePeerDependencies: - - supports-color - - micromatch@4.0.5: - dependencies: - braces: 3.0.2 - picomatch: 2.3.1 - - miller-rabin@4.0.1: - dependencies: - bn.js: 4.12.0 - brorand: 1.1.0 - - mime-db@1.52.0: {} - - mime-types@2.1.35: - dependencies: - mime-db: 1.52.0 - - mime@1.6.0: {} - - mimic-fn@2.1.0: {} - - mimic-fn@4.0.0: {} - - min-indent@1.0.1: {} - - minimalistic-assert@1.0.1: {} - - minimalistic-crypto-utils@1.0.1: {} - - minimatch@3.1.2: - dependencies: - brace-expansion: 1.1.11 - - minimatch@5.0.1: - dependencies: - brace-expansion: 2.0.1 - - minimatch@7.4.6: - dependencies: - brace-expansion: 2.0.1 - - minimatch@9.0.3: - dependencies: - brace-expansion: 2.0.1 - - minimist-options@4.1.0: - dependencies: - arrify: 1.0.1 - is-plain-obj: 1.1.0 - kind-of: 6.0.3 - - minimist@1.2.8: {} - - minipass@3.3.6: - dependencies: - yallist: 4.0.0 - - minipass@7.0.3: {} - - minizlib@2.1.2: - dependencies: - minipass: 3.3.6 - yallist: 4.0.0 - - mixme@0.5.4: {} - - mkdirp@0.5.6: - dependencies: - minimist: 1.2.8 - - mkdirp@1.0.4: {} - - mlly@1.4.2: - dependencies: - acorn: 8.10.0 - pathe: 1.1.1 - pkg-types: 1.0.3 - ufo: 1.3.2 - - mnemonist@0.38.3: - dependencies: - obliterator: 1.6.1 - - mocha@10.2.0: - dependencies: - ansi-colors: 4.1.1 - browser-stdout: 1.3.1 - chokidar: 3.5.3 - debug: 4.3.4(supports-color@8.1.1) - diff: 5.0.0 - escape-string-regexp: 4.0.0 - find-up: 5.0.0 - glob: 7.2.0 - he: 1.2.0 - js-yaml: 4.1.0 - log-symbols: 4.1.0 - minimatch: 5.0.1 - ms: 2.1.3 - nanoid: 3.3.3 - serialize-javascript: 6.0.0 - strip-json-comments: 3.1.1 - supports-color: 8.1.1 - workerpool: 6.2.1 - yargs: 16.2.0 - yargs-parser: 20.2.4 - yargs-unparser: 2.0.0 - - morgan@1.10.0: - dependencies: - basic-auth: 2.0.1 - debug: 2.6.9 - depd: 2.0.0 - on-finished: 2.3.0 - on-headers: 1.0.2 - transitivePeerDependencies: - - supports-color - - ms@2.0.0: {} - - ms@2.1.2: {} - - ms@2.1.3: {} - - 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 - - murmur-128@0.2.1: - dependencies: - encode-utf8: 1.0.3 - fmix: 0.1.0 - imul: 1.0.1 - - mz@2.7.0: - dependencies: - any-promise: 1.3.0 - object-assign: 4.1.1 - thenify-all: 1.6.0 - - nanoid@3.3.3: {} - - nanoid@3.3.7: {} - - natural-compare@1.4.0: {} - - negotiator@0.6.3: {} - - node-addon-api@2.0.2: {} - - node-fetch@2.6.12: - dependencies: - whatwg-url: 5.0.0 - - node-gyp-build@4.3.0: - optional: true - - node-gyp-build@4.6.0: {} - - node-machine-id@1.1.12: {} - - node-preload@0.2.1: - dependencies: - process-on-spawn: 1.0.0 - - node-releases@2.0.14: {} - - 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: {} - - npm-run-path@4.0.1: - dependencies: - path-key: 3.1.1 - - npm-run-path@5.1.0: - dependencies: - path-key: 4.0.0 - - number-is-nan@1.0.1: {} - - number-to-bn@1.7.0: - dependencies: - bn.js: 4.11.6 - strip-hex-prefix: 1.0.0 - - nwsapi@2.2.7: - optional: true - - nx-cloud@18.0.0: - dependencies: - '@nrwl/nx-cloud': 18.0.0 - axios: 1.1.3 - chalk: 4.1.2 - dotenv: 10.0.0 - fs-extra: 11.1.1 - node-machine-id: 1.1.12 - open: 8.4.2 - strip-json-comments: 3.1.1 - tar: 6.1.11 - yargs-parser: 21.1.1 - transitivePeerDependencies: - - debug - - nx@18.2.2(@swc/core@1.4.13): - dependencies: - '@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 - axios: 1.6.7 - chalk: 4.1.2 - cli-cursor: 3.1.0 - cli-spinners: 2.6.1 - cliui: 8.0.1 - dotenv: 16.3.2 - dotenv-expand: 10.0.0 - enquirer: 2.3.6 - figures: 3.2.0 - flat: 5.0.2 - fs-extra: 11.1.1 - ignore: 5.2.4 - jest-diff: 29.7.0 - js-yaml: 4.1.0 - jsonc-parser: 3.2.0 - lines-and-columns: 2.0.3 - minimatch: 9.0.3 - node-machine-id: 1.1.12 - npm-run-path: 4.0.1 - open: 8.4.2 - ora: 5.3.0 - semver: 7.6.0 - string-width: 4.2.3 - strong-log-transformer: 2.1.0 - tar-stream: 2.2.0 - tmp: 0.2.1 - tsconfig-paths: 4.2.0 - tslib: 2.6.2 - yargs: 17.7.2 - yargs-parser: 21.1.1 - optionalDependencies: - '@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 - - nyc@15.1.0: - dependencies: - '@istanbuljs/load-nyc-config': 1.1.0 - '@istanbuljs/schema': 0.1.3 - caching-transform: 4.0.0 - convert-source-map: 1.8.0 - decamelize: 1.2.0 - find-cache-dir: 3.3.2 - find-up: 4.1.0 - foreground-child: 2.0.0 - get-package-type: 0.1.0 - glob: 7.2.3 - istanbul-lib-coverage: 3.0.0 - istanbul-lib-hook: 3.0.0 - istanbul-lib-instrument: 4.0.3 - istanbul-lib-processinfo: 2.0.2 - istanbul-lib-report: 3.0.0 - istanbul-lib-source-maps: 4.0.0 - istanbul-reports: 3.0.2 - make-dir: 3.1.0 - node-preload: 0.2.1 - p-map: 3.0.0 - process-on-spawn: 1.0.0 - resolve-from: 5.0.0 - rimraf: 3.0.2 - signal-exit: 3.0.7 - spawn-wrap: 2.0.0 - test-exclude: 6.0.0 - yargs: 15.4.1 - transitivePeerDependencies: - - supports-color - - oauth-sign@0.9.0: {} - - object-assign@4.1.1: {} - - object-inspect@1.12.3: {} - - object-keys@1.1.1: {} - - 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: - dependencies: - call-bind: 1.0.2 - define-properties: 1.2.0 - es-abstract: 1.22.1 - - object.fromentries@2.0.6: - dependencies: - call-bind: 1.0.2 - define-properties: 1.2.0 - es-abstract: 1.22.1 - - object.fromentries@2.0.7: - dependencies: - call-bind: 1.0.2 - define-properties: 1.2.0 - es-abstract: 1.22.1 - - 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 - - object.hasown@1.1.2: - dependencies: - define-properties: 1.2.0 - es-abstract: 1.22.1 - - object.values@1.1.6: - dependencies: - call-bind: 1.0.2 - define-properties: 1.2.0 - es-abstract: 1.22.1 - - object.values@1.1.7: - dependencies: - call-bind: 1.0.2 - define-properties: 1.2.0 - es-abstract: 1.22.1 - - obliterator@1.6.1: {} - - on-exit-leak-free@0.2.0: {} - - on-exit-leak-free@2.1.0: {} - - on-finished@2.3.0: - dependencies: - ee-first: 1.1.1 - - on-finished@2.4.1: - dependencies: - ee-first: 1.1.1 - - on-headers@1.0.2: {} - - once@1.4.0: - dependencies: - wrappy: 1.0.2 - - onetime@5.1.2: - dependencies: - mimic-fn: 2.1.0 - - onetime@6.0.0: - dependencies: - mimic-fn: 4.0.0 - - open@8.4.2: - dependencies: - define-lazy-prop: 2.0.0 - is-docker: 2.2.1 - is-wsl: 2.2.0 - - optionator@0.9.3: - dependencies: - '@aashutoshrathi/word-wrap': 1.2.6 - deep-is: 0.1.4 - fast-levenshtein: 2.0.6 - levn: 0.4.1 - prelude-ls: 1.2.1 - type-check: 0.4.0 - - 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 - log-symbols: 4.1.0 - strip-ansi: 6.0.1 - wcwidth: 1.0.1 - - os-locale@1.4.0: - dependencies: - lcid: 1.0.0 - - os-tmpdir@1.0.2: {} - - outdent@0.5.0: {} - - p-filter@2.1.0: - dependencies: - p-map: 2.1.0 - - p-limit@1.3.0: - dependencies: - p-try: 1.0.0 - - p-limit@2.3.0: - dependencies: - p-try: 2.2.0 - - p-limit@3.1.0: - dependencies: - yocto-queue: 0.1.0 - - p-limit@5.0.0: - dependencies: - yocto-queue: 1.0.0 - - p-locate@2.0.0: - dependencies: - p-limit: 1.3.0 - - p-locate@4.1.0: - dependencies: - p-limit: 2.3.0 - - p-locate@5.0.0: - dependencies: - p-limit: 3.1.0 - - p-map@2.1.0: {} - - p-map@3.0.0: - dependencies: - aggregate-error: 3.1.0 - - p-map@4.0.0: - dependencies: - aggregate-error: 3.1.0 - - p-try@1.0.0: {} - - p-try@2.2.0: {} - - 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 - - parent-module@1.0.1: - dependencies: - callsites: 3.1.0 - - parse-entities@2.0.0: - dependencies: - character-entities: 1.2.4 - character-entities-legacy: 1.1.4 - character-reference-invalid: 1.1.4 - is-alphanumerical: 1.0.4 - is-decimal: 1.0.4 - is-hexadecimal: 1.0.4 - - parse-json@2.2.0: - dependencies: - error-ex: 1.3.2 - - 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: {} - - parse5@7.1.2: - dependencies: - entities: 4.5.0 - optional: true - - parseurl@1.3.3: {} - - path-browserify@1.0.1: {} - - path-exists@2.1.0: - dependencies: - pinkie-promise: 2.0.1 - - path-exists@3.0.0: {} - - path-exists@4.0.0: {} - - path-is-absolute@1.0.1: {} - - path-key@3.1.1: {} - - path-key@4.0.0: {} - - path-parse@1.0.7: {} - - path-scurry@1.10.1: - dependencies: - lru-cache: 10.1.0 - minipass: 7.0.3 - - path-to-regexp@0.1.7: {} - - path-type@1.1.0: - dependencies: - graceful-fs: 4.2.11 - pify: 2.3.0 - pinkie-promise: 2.0.1 - - path-type@4.0.0: {} - - pathe@1.1.1: {} - - pathval@1.1.1: {} - - 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 - - performance-now@2.1.0: {} - - picocolors@1.0.0: {} - - picomatch@2.3.1: {} - - pidtree@0.6.0: {} - - pify@2.3.0: {} - - pify@4.0.1: {} - - pinkie-promise@2.0.1: - dependencies: - pinkie: 2.0.4 - - pinkie@2.0.4: {} - - pino-abstract-transport@0.5.0: - dependencies: - duplexify: 4.1.2 - split2: 4.2.0 - - pino-abstract-transport@1.1.0: - dependencies: - readable-stream: 4.4.2 - split2: 4.2.0 - - pino-multi-stream@6.0.0: - dependencies: - pino: 7.11.0 - - 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 - - pino-std-serializers@4.0.0: {} - - pino-std-serializers@6.2.2: {} - - pino@7.11.0: - dependencies: - atomic-sleep: 1.0.0 - fast-redact: 3.2.0 - on-exit-leak-free: 0.2.0 - pino-abstract-transport: 0.5.0 - pino-std-serializers: 4.0.0 - process-warning: 1.0.0 - quick-format-unescaped: 4.0.4 - real-require: 0.1.0 - safe-stable-stringify: 2.4.3 - sonic-boom: 2.8.0 - thread-stream: 0.15.2 - - pino@8.19.0: - dependencies: - atomic-sleep: 1.0.0 - fast-redact: 3.2.0 - on-exit-leak-free: 2.1.0 - pino-abstract-transport: 1.1.0 - pino-std-serializers: 6.2.2 - process-warning: 3.0.0 - quick-format-unescaped: 4.0.4 - real-require: 0.2.0 - safe-stable-stringify: 2.4.3 - sonic-boom: 3.7.0 - thread-stream: 2.4.0 - - pirates@4.0.6: {} - - pkg-dir@4.2.0: - dependencies: - find-up: 4.1.0 - - pkg-types@1.0.3: - dependencies: - jsonc-parser: 3.2.0 - mlly: 1.4.2 - pathe: 1.1.1 - - please-upgrade-node@3.2.0: - dependencies: - semver-compare: 1.0.0 - - pluralize@8.0.0: {} - - 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 - 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: - dependencies: - nanoid: 3.3.7 - picocolors: 1.0.0 - source-map-js: 1.0.2 - - 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 - - prelude-ls@1.2.1: {} - - prettier-linter-helpers@1.0.0: - dependencies: - fast-diff: 1.2.0 - - prettier@2.8.8: {} - - pretty-format@29.7.0: - dependencies: - '@jest/schemas': 29.6.3 - ansi-styles: 5.2.0 - react-is: 18.2.0 - - process-on-spawn@1.0.0: - dependencies: - fromentries: 1.3.2 - - process-warning@1.0.0: {} - - process-warning@3.0.0: {} - - process@0.11.10: {} - - prom-client@14.2.0: - dependencies: - tdigest: 0.1.1 - - prop-types@15.8.1: - dependencies: - loose-envify: 1.4.0 - object-assign: 4.1.1 - react-is: 16.13.1 - - proxy-addr@2.0.7: - dependencies: - forwarded: 0.2.0 - ipaddr.js: 1.9.1 - - proxy-from-env@1.1.0: {} - - prr@1.0.1: {} - - pseudomap@1.0.2: {} - - psl@1.9.0: {} - - pump@3.0.0: - dependencies: - end-of-stream: 1.4.4 - once: 1.4.0 - - pumpify@2.0.1: - dependencies: - duplexify: 4.1.2 - inherits: 2.0.4 - pump: 3.0.0 - - punycode@1.4.1: {} - - punycode@2.1.0: {} - - punycode@2.3.1: {} - - qs@6.11.0: - dependencies: - side-channel: 1.0.4 - - qs@6.11.2: - dependencies: - side-channel: 1.0.4 - - qs@6.5.3: {} - - querystringify@2.2.0: - optional: true - - queue-microtask@1.2.3: {} - - quick-format-unescaped@4.0.4: {} - - quick-lru@4.0.1: {} - - randombytes@2.1.0: - dependencies: - safe-buffer: 5.2.1 - - range-parser@1.2.1: {} - - raw-body@2.5.2: - dependencies: - bytes: 3.1.2 - http-errors: 2.0.0 - iconv-lite: 0.4.24 - unpipe: 1.0.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 - - 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: - dependencies: - load-json-file: 1.1.0 - normalize-package-data: 2.5.0 - path-type: 1.1.0 - - 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: - dependencies: - graceful-fs: 4.2.11 - js-yaml: 3.14.1 - pify: 4.0.1 - strip-bom: 3.0.0 - - 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: - dependencies: - abort-controller: 3.0.0 - buffer: 6.0.3 - events: 3.3.0 - process: 0.11.10 - string_decoder: 1.3.0 - - readdirp@3.6.0: - dependencies: - picomatch: 2.3.1 - - real-require@0.1.0: {} - - real-require@0.2.0: {} - - redent@3.0.0: - dependencies: - indent-string: 4.0.0 - strip-indent: 3.0.0 - - reduce-flatten@2.0.0: {} - - reflect.getprototypeof@1.0.3: - dependencies: - call-bind: 1.0.2 - define-properties: 1.2.0 - es-abstract: 1.22.1 - get-intrinsic: 1.2.1 - globalthis: 1.0.3 - which-builtin-type: 1.1.3 - - regenerator-runtime@0.14.1: {} - - regexp-tree@0.1.27: {} - - 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: {} - - regjsparser@0.10.0: - dependencies: - jsesc: 0.5.0 - - release-zalgo@1.0.0: - dependencies: - es6-error: 4.1.1 - - remark-footnotes@3.0.0: - dependencies: - mdast-util-footnote: 0.1.7 - micromark-extension-footnote: 0.3.2 - transitivePeerDependencies: - - supports-color - - remark-frontmatter@3.0.0: - dependencies: - mdast-util-frontmatter: 0.2.0 - micromark-extension-frontmatter: 0.2.2 - - remark-gfm@1.0.0: - dependencies: - mdast-util-gfm: 0.1.2 - micromark-extension-gfm: 0.3.3 - transitivePeerDependencies: - - supports-color - - remark-parse@9.0.0: - dependencies: - mdast-util-from-markdown: 0.8.5 - transitivePeerDependencies: - - supports-color - - repeat-string@1.6.1: {} - - request@2.88.2: - dependencies: - aws-sign2: 0.7.0 - aws4: 1.11.0 - caseless: 0.12.0 - combined-stream: 1.0.8 - extend: 3.0.2 - forever-agent: 0.6.1 - form-data: 2.3.3 - har-validator: 5.1.5 - http-signature: 1.2.0 - is-typedarray: 1.0.0 - isstream: 0.1.2 - json-stringify-safe: 5.0.1 - mime-types: 2.1.35 - oauth-sign: 0.9.0 - performance-now: 2.1.0 - qs: 6.5.3 - safe-buffer: 5.2.1 - tough-cookie: 2.5.0 - tunnel-agent: 0.6.0 - uuid: 3.4.0 - - require-directory@2.1.1: {} - - require-from-string@1.2.1: {} - - require-from-string@2.0.2: {} - - require-main-filename@1.0.1: {} - - require-main-filename@2.0.0: {} - - require-package-name@2.0.1: {} - - requires-port@1.0.0: - optional: true - - resolve-dir@1.0.1: - dependencies: - expand-tilde: 2.0.2 - global-modules: 1.0.0 - - resolve-from@4.0.0: {} - - resolve-from@5.0.0: {} - - resolve-pkg-maps@1.0.0: {} - - resolve@1.17.0: - dependencies: - path-parse: 1.0.7 - - resolve@1.22.2: - dependencies: - is-core-module: 2.13.1 - path-parse: 1.0.7 - supports-preserve-symlinks-flag: 1.0.0 - - 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: - dependencies: - is-core-module: 2.13.1 - path-parse: 1.0.7 - supports-preserve-symlinks-flag: 1.0.0 - - restore-cursor@3.1.0: - dependencies: - onetime: 5.1.2 - signal-exit: 3.0.7 - - restore-cursor@4.0.0: - dependencies: - onetime: 5.1.2 - signal-exit: 3.0.7 - - reusify@1.0.4: {} - - rfdc@1.3.0: {} - - rimraf@2.7.1: - dependencies: - glob: 7.2.3 - - rimraf@3.0.2: - dependencies: - glob: 7.2.3 - - rimraf@5.0.5: - dependencies: - glob: 10.3.10 - - ripemd160@2.0.2: - dependencies: - hash-base: 3.1.0 - inherits: 2.0.4 - - rlp@2.2.6: - dependencies: - bn.js: 4.12.0 - - rlp@2.2.7: - dependencies: - bn.js: 5.2.1 - - rollup@4.5.1: - optionalDependencies: - '@rollup/rollup-android-arm-eabi': 4.5.1 - '@rollup/rollup-android-arm64': 4.5.1 - '@rollup/rollup-darwin-arm64': 4.5.1 - '@rollup/rollup-darwin-x64': 4.5.1 - '@rollup/rollup-linux-arm-gnueabihf': 4.5.1 - '@rollup/rollup-linux-arm64-gnu': 4.5.1 - '@rollup/rollup-linux-arm64-musl': 4.5.1 - '@rollup/rollup-linux-x64-gnu': 4.5.1 - '@rollup/rollup-linux-x64-musl': 4.5.1 - '@rollup/rollup-win32-arm64-msvc': 4.5.1 - '@rollup/rollup-win32-ia32-msvc': 4.5.1 - '@rollup/rollup-win32-x64-msvc': 4.5.1 - fsevents: 2.3.3 - - rrweb-cssom@0.6.0: - optional: true - - run-parallel@1.2.0: - dependencies: - queue-microtask: 1.2.3 - - rust-verkle-wasm@0.0.1: {} - - rustbn-wasm@0.2.0: - dependencies: - '@scure/base': 1.1.3 - - rustbn.js@0.2.0: {} - - 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: {} - - safe-buffer@5.2.1: {} - - 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: {} - - safer-buffer@2.1.2: {} - - saxes@6.0.0: - dependencies: - xmlchars: 2.2.0 - optional: true - - scrypt-js@3.0.1: {} - - secp256k1@4.0.3: - dependencies: - elliptic: 6.5.4 - node-addon-api: 2.0.2 - node-gyp-build: 4.6.0 - - seedrandom@3.0.5: {} - - semaphore-async-await@1.5.1: {} - - semver-compare@1.0.0: {} - - semver@5.7.2: {} - - semver@6.3.1: {} - - semver@7.6.0: - dependencies: - lru-cache: 6.0.0 - - send@0.18.0: - dependencies: - debug: 2.6.9 - depd: 2.0.0 - destroy: 1.2.0 - encodeurl: 1.0.2 - escape-html: 1.0.3 - etag: 1.8.1 - fresh: 0.5.2 - http-errors: 2.0.0 - mime: 1.6.0 - ms: 2.1.3 - on-finished: 2.4.1 - range-parser: 1.2.1 - statuses: 2.0.1 - transitivePeerDependencies: - - supports-color - - serialize-javascript@6.0.0: - dependencies: - randombytes: 2.1.0 - - serve-static@1.15.0: - dependencies: - encodeurl: 1.0.2 - escape-html: 1.0.3 - parseurl: 1.3.3 - send: 0.18.0 - transitivePeerDependencies: - - supports-color - - set-blocking@2.0.0: {} - - setimmediate@1.0.5: {} - - setprototypeof@1.2.0: {} - - sha.js@2.4.11: - dependencies: - inherits: 2.0.4 - safe-buffer: 5.2.1 - - shebang-command@1.2.0: - dependencies: - shebang-regex: 1.0.0 - - shebang-command@2.0.0: - dependencies: - shebang-regex: 3.0.0 - - shebang-regex@1.0.0: {} - - shebang-regex@3.0.0: {} - - 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 - - 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: {} - - signal-exit@3.0.7: {} - - signal-exit@4.1.0: {} - - slash@3.0.0: {} - - slice-ansi@5.0.0: - dependencies: - ansi-styles: 6.2.1 - is-fullwidth-code-point: 4.0.0 - - slice-ansi@7.1.0: - dependencies: - ansi-styles: 6.2.1 - is-fullwidth-code-point: 5.0.0 - - smartwrap@2.0.2: - dependencies: - array.prototype.flat: 1.3.2 - breakword: 1.0.5 - grapheme-splitter: 1.0.4 - strip-ansi: 6.0.1 - wcwidth: 1.0.1 - yargs: 15.4.1 - - 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 - - solc@0.7.3(debug@4.3.4): - dependencies: - command-exists: 1.2.9 - commander: 3.0.2 - follow-redirects: 1.15.5(debug@4.3.4) - fs-extra: 0.30.0 - js-sha3: 0.8.0 - memorystream: 0.3.1 - require-from-string: 2.0.2 - semver: 5.7.2 - tmp: 0.0.33 - transitivePeerDependencies: - - debug - - solc@0.8.15: - dependencies: - command-exists: 1.2.9 - commander: 8.3.0 - follow-redirects: 1.15.5(debug@4.3.4) - js-sha3: 0.8.0 - memorystream: 0.3.1 - semver: 5.7.2 - tmp: 0.0.33 - transitivePeerDependencies: - - debug - - sonic-boom@2.8.0: - dependencies: - atomic-sleep: 1.0.0 - - sonic-boom@3.7.0: - dependencies: - atomic-sleep: 1.0.0 - - source-map-js@1.0.2: {} - - source-map-support@0.5.21: - dependencies: - buffer-from: 1.1.2 - source-map: 0.6.1 - - source-map@0.6.1: {} - - source-map@0.8.0-beta.0: - dependencies: - whatwg-url: 7.1.0 - - spawn-wrap@2.0.0: - dependencies: - foreground-child: 2.0.0 - is-windows: 1.0.2 - make-dir: 3.1.0 - rimraf: 3.0.2 - signal-exit: 3.0.7 - which: 2.0.2 - - spawndamnit@2.0.0: - dependencies: - cross-spawn: 5.1.0 - signal-exit: 3.0.7 - - spdx-correct@3.1.1: - dependencies: - spdx-expression-parse: 3.0.1 - spdx-license-ids: 3.0.10 - - spdx-exceptions@2.3.0: {} - - spdx-expression-parse@3.0.1: - dependencies: - spdx-exceptions: 2.3.0 - spdx-license-ids: 3.0.10 - - spdx-expression-parse@4.0.0: - dependencies: - spdx-exceptions: 2.3.0 - spdx-license-ids: 3.0.10 - - spdx-license-ids@3.0.10: {} - - split2@3.2.2: - dependencies: - readable-stream: 3.6.2 - - split2@4.2.0: {} - - sprintf-js@1.0.3: {} - - sshpk@1.16.1: - dependencies: - asn1: 0.2.4 - assert-plus: 1.0.0 - bcrypt-pbkdf: 1.0.2 - dashdash: 1.14.1 - ecc-jsbn: 0.1.2 - getpass: 0.1.7 - jsbn: 0.1.1 - safer-buffer: 2.1.2 - tweetnacl: 0.14.5 - - stackback@0.0.2: {} - - stacktrace-parser@0.1.10: - dependencies: - type-fest: 0.7.1 - - statuses@2.0.1: {} - - std-env@3.6.0: {} - - stream-shift@1.0.1: {} - - stream-transform@2.1.3: - dependencies: - mixme: 0.5.4 - - streamsearch@1.1.0: {} - - string-argv@0.3.2: {} - - string-format@2.0.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 - - 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: - dependencies: - eastasianwidth: 0.2.0 - emoji-regex: 9.2.2 - strip-ansi: 7.1.0 - - string-width@7.0.0: - dependencies: - emoji-regex: 10.3.0 - get-east-asian-width: 1.2.0 - strip-ansi: 7.1.0 - - string.prototype.matchall@4.0.8: - dependencies: - call-bind: 1.0.2 - define-properties: 1.2.0 - es-abstract: 1.22.1 - get-intrinsic: 1.2.1 - has-symbols: 1.0.3 - internal-slot: 1.0.5 - regexp.prototype.flags: 1.5.0 - side-channel: 1.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: - dependencies: - call-bind: 1.0.2 - define-properties: 1.2.0 - es-abstract: 1.22.1 - - 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.3.0: - dependencies: - safe-buffer: 5.2.1 - - strip-ansi@3.0.1: - dependencies: - ansi-regex: 2.1.1 - - strip-ansi@6.0.1: - dependencies: - ansi-regex: 5.0.1 - - strip-ansi@7.1.0: - dependencies: - ansi-regex: 6.0.1 - - strip-bom@2.0.0: - dependencies: - is-utf8: 0.2.1 - - strip-bom@3.0.0: {} - - strip-bom@4.0.0: {} - - strip-final-newline@2.0.0: {} - - strip-final-newline@3.0.0: {} - - strip-hex-prefix@1.0.0: - dependencies: - is-hex-prefixed: 1.0.0 - - strip-indent@3.0.0: - dependencies: - min-indent: 1.0.1 - - strip-json-comments@3.1.1: {} - - strip-literal@1.3.0: - dependencies: - acorn: 8.10.0 - - strong-log-transformer@2.1.0: - dependencies: - duplexer: 0.1.2 - minimist: 1.2.8 - through: 2.3.8 - - 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 - - supports-color@5.5.0: - dependencies: - has-flag: 3.0.0 - - supports-color@7.2.0: - dependencies: - has-flag: 4.0.0 - - supports-color@8.1.1: - dependencies: - has-flag: 4.0.0 - - supports-preserve-symlinks-flag@1.0.0: {} - - symbol-tree@3.2.4: - optional: true - - table-layout@1.0.2: - dependencies: - array-back: 4.0.2 - deep-extend: 0.6.0 - typical: 5.2.0 - wordwrapjs: 4.0.1 - - 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 - - tar@6.1.11: - dependencies: - chownr: 2.0.0 - fs-minipass: 2.1.0 - minipass: 3.3.6 - minizlib: 2.1.2 - mkdirp: 1.0.4 - yallist: 4.0.0 - - tdigest@0.1.1: - dependencies: - bintrees: 1.0.1 - - term-size@2.2.1: {} - - 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 - optional: true - - test-exclude@6.0.0: - dependencies: - '@istanbuljs/schema': 0.1.3 - glob: 7.2.3 - minimatch: 3.1.2 - - testrpc@0.0.1: {} - - text-table@0.2.0: {} - - thenify-all@1.6.0: - dependencies: - thenify: 3.3.1 - - thenify@3.3.1: - dependencies: - any-promise: 1.3.0 - - thread-stream@0.15.2: - dependencies: - real-require: 0.1.0 - - thread-stream@2.4.0: - dependencies: - real-require: 0.2.0 - - through2@3.0.2: - dependencies: - inherits: 2.0.4 - readable-stream: 3.6.2 - - through@2.3.8: {} - - tinybench@2.5.1: {} - - tinypool@0.8.2: {} - - tinyspy@2.2.0: {} - - tmp@0.0.33: - dependencies: - os-tmpdir: 1.0.2 - - tmp@0.2.1: - dependencies: - rimraf: 3.0.2 - - to-fast-properties@2.0.0: {} - - to-regex-range@5.0.1: - dependencies: - is-number: 7.0.0 - - toidentifier@1.0.1: {} - - tough-cookie@2.5.0: - dependencies: - psl: 1.9.0 - punycode: 2.3.1 - - tough-cookie@4.1.3: - dependencies: - psl: 1.9.0 - punycode: 2.3.1 - universalify: 0.2.0 - url-parse: 1.5.10 - optional: true - - tr46@0.0.3: {} - - tr46@1.0.1: - dependencies: - punycode: 2.3.1 - - tr46@5.0.0: - dependencies: - punycode: 2.3.1 - optional: true - - traverse@0.6.6: {} - - tree-kill@1.2.2: {} - - treeify@1.1.0: {} - - trim-newlines@3.0.1: {} - - trough@1.0.5: {} - - ts-api-utils@1.0.1(typescript@5.4.5): - dependencies: - typescript: 5.4.5 - - 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 - - ts-essentials@7.0.3(typescript@5.4.5): - dependencies: - typescript: 5.4.5 - - ts-interface-checker@0.1.13: {} - - 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 - - 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 - '@tsconfig/node12': 1.0.11 - '@tsconfig/node14': 1.0.3 - '@tsconfig/node16': 1.0.4 - '@types/node': 20.11.17 - acorn: 8.10.0 - acorn-walk: 8.3.0 - arg: 4.1.3 - create-require: 1.1.1 - diff: 4.0.2 - make-error: 1.3.6 - typescript: 5.4.5 - v8-compile-cache-lib: 3.0.1 - yn: 3.1.1 - optionalDependencies: - '@swc/core': 1.4.13 - - ts-node@7.0.1: - dependencies: - arrify: 1.0.1 - buffer-from: 1.1.2 - diff: 3.5.0 - make-error: 1.3.6 - minimist: 1.2.8 - mkdirp: 0.5.6 - source-map-support: 0.5.21 - yn: 2.0.0 - - tsconfig-paths@3.15.0: - dependencies: - '@types/json5': 0.0.29 - json5: 1.0.2 - minimist: 1.2.8 - strip-bom: 3.0.0 - - tsconfig-paths@4.2.0: - dependencies: - json5: 2.2.3 - minimist: 1.2.8 - strip-bom: 3.0.0 - - tslib@1.14.1: {} - - tslib@2.6.2: {} - - tsort@0.0.1: {} - - 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: - bundle-require: 4.0.1(esbuild@0.19.7) - cac: 6.7.14 - chokidar: 3.5.3 - debug: 4.3.4(supports-color@8.1.1) - esbuild: 0.19.7 - execa: 5.1.1 - globby: 11.1.0 - joycon: 3.1.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 - optionalDependencies: - '@swc/core': 1.4.13 - postcss: 8.4.35 - typescript: 5.4.5 - transitivePeerDependencies: - - supports-color - - ts-node - - tsx@4.7.0: - dependencies: - esbuild: 0.19.10 - get-tsconfig: 4.7.2 - optionalDependencies: - fsevents: 2.3.3 - - tty-table@4.1.6: - dependencies: - chalk: 4.1.2 - csv: 5.5.3 - kleur: 4.1.5 - smartwrap: 2.0.2 - strip-ansi: 6.0.1 - wcwidth: 1.0.1 - yargs: 17.7.2 - - tunnel-agent@0.6.0: - dependencies: - safe-buffer: 5.2.1 - - tweetnacl-util@0.15.1: {} - - tweetnacl@0.14.5: {} - - tweetnacl@1.0.3: {} - - type-check@0.4.0: - dependencies: - prelude-ls: 1.2.1 - - type-detect@4.0.8: {} - - type-fest@0.13.1: {} - - type-fest@0.20.2: {} - - type-fest@0.21.3: {} - - type-fest@0.6.0: {} - - type-fest@0.7.1: {} - - type-fest@0.8.1: {} - - type-fest@3.13.1: {} - - type-is@1.6.18: - dependencies: - media-typer: 0.3.0 - mime-types: 2.1.35 - - typechain@8.3.1(typescript@5.4.5): - dependencies: - '@types/prettier': 2.3.2 - debug: 4.3.4(supports-color@8.1.1) - fs-extra: 7.0.1 - glob: 7.1.7 - js-sha3: 0.8.0 - lodash: 4.17.21 - mkdirp: 1.0.4 - prettier: 2.8.8 - ts-command-line-args: 2.5.1 - ts-essentials: 7.0.3(typescript@5.4.5) - typescript: 5.4.5 - transitivePeerDependencies: - - supports-color - - 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: - 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: - dependencies: - available-typed-arrays: 1.0.5 - call-bind: 1.0.2 - for-each: 0.3.3 - has-proto: 1.0.1 - is-typed-array: 1.1.12 - - 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: - dependencies: - is-typedarray: 1.0.0 - - 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.4.5 - - typescript@4.9.5: {} - - typescript@5.4.5: {} - - typical@4.0.0: {} - - typical@5.2.0: {} - - ufo@1.3.2: {} - - 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 - - underscore@1.13.4: {} - - undici-types@5.26.5: {} - - undici@5.24.0: - dependencies: - busboy: 1.6.0 - - unified@9.2.2: - dependencies: - '@types/unist': 2.0.6 - bail: 1.0.5 - extend: 3.0.2 - is-buffer: 2.0.5 - is-plain-obj: 2.1.0 - trough: 1.0.5 - vfile: 4.2.1 - - unist-util-is@4.1.0: {} - - unist-util-stringify-position@2.0.3: - dependencies: - '@types/unist': 2.0.6 - - unist-util-visit-parents@3.1.1: - dependencies: - '@types/unist': 2.0.6 - unist-util-is: 4.1.0 - - universalify@0.1.2: {} - - universalify@0.2.0: - optional: true - - universalify@2.0.0: {} - - unpipe@1.0.0: {} - - update-browserslist-db@1.0.13(browserslist@4.22.2): - dependencies: - browserslist: 4.22.2 - escalade: 3.1.1 - picocolors: 1.0.0 - - update-section@0.3.3: {} - - uri-js@4.4.1: - dependencies: - punycode: 2.3.1 - - url-parse@1.5.10: - dependencies: - querystringify: 2.2.0 - requires-port: 1.0.0 - optional: true - - url-value-parser@2.0.3: {} - - url@0.11.1: - dependencies: - punycode: 1.4.1 - qs: 6.11.2 - - utf-8-validate@5.0.7: - dependencies: - node-gyp-build: 4.6.0 - optional: true - - utf8@3.0.0: {} - - util-deprecate@1.0.2: {} - - utils-merge@1.0.1: {} - - uuid@3.4.0: {} - - uuid@8.3.2: {} - - v8-compile-cache-lib@3.0.1: {} - - validate-npm-package-license@3.0.4: - dependencies: - spdx-correct: 3.1.1 - spdx-expression-parse: 3.0.1 - - vary@1.1.2: {} - - verror@1.10.0: - dependencies: - assert-plus: 1.0.0 - core-util-is: 1.0.2 - extsprintf: 1.4.0 - - vfile-message@2.0.4: - dependencies: - '@types/unist': 2.0.6 - unist-util-stringify-position: 2.0.3 - - 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 - - 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.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)(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.7(@types/node@20.11.17)(terser@5.26.0) - transitivePeerDependencies: - - '@types/node' - - less - - lightningcss - - sass - - stylus - - sugarss - - supports-color - - terser - - vite@5.1.5(@types/node@20.11.17)(terser@5.26.0): - dependencies: - esbuild: 0.19.10 - postcss: 8.4.35 - rollup: 4.5.1 - optionalDependencies: - '@types/node': 20.11.17 - fsevents: 2.3.3 - terser: 5.26.0 - - vite@5.1.7(@types/node@20.11.17)(terser@5.26.0): - dependencies: - esbuild: 0.19.10 - postcss: 8.4.35 - rollup: 4.5.1 - optionalDependencies: - '@types/node': 20.11.17 - fsevents: 2.3.3 - terser: 5.26.0 - - 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: - '@vitest/expect': 1.2.2 - '@vitest/runner': 1.2.2 - '@vitest/snapshot': 1.2.2 - '@vitest/spy': 1.2.2 - '@vitest/utils': 1.2.2 - acorn-walk: 8.3.2 - cac: 6.7.14 - chai: 4.3.10 - debug: 4.3.4(supports-color@8.1.1) - execa: 8.0.1 - 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.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: - - less - - lightningcss - - sass - - stylus - - sugarss - - supports-color - - terser - - vscode-oniguruma@1.7.0: {} - - vscode-textmate@8.0.0: {} - - w3c-xmlserializer@5.0.0: - dependencies: - xml-name-validator: 5.0.0 - optional: true - - wait-on@7.2.0: - dependencies: - axios: 1.6.7 - joi: 17.11.0 - lodash: 4.17.21 - minimist: 1.2.8 - rxjs: 7.8.1 - transitivePeerDependencies: - - debug - - wcwidth@1.0.1: - dependencies: - defaults: 1.0.4 - - web3-utils@1.10.1: - dependencies: - '@ethereumjs/util': 8.1.0 - bn.js: 5.2.1 - ethereum-bloom-filters: 1.0.10 - ethereum-cryptography: 2.1.2 - ethjs-unit: 0.1.6 - number-to-bn: 1.7.0 - randombytes: 2.1.0 - utf8: 3.0.0 - - webidl-conversions@3.0.1: {} - - webidl-conversions@4.0.2: {} - - webidl-conversions@7.0.0: - optional: true - - whatwg-encoding@3.1.1: - dependencies: - iconv-lite: 0.6.3 - optional: true - - whatwg-fetch@3.6.17: {} - - whatwg-mimetype@4.0.0: - optional: true - - whatwg-url@14.0.0: - dependencies: - tr46: 5.0.0 - webidl-conversions: 7.0.0 - optional: true - - whatwg-url@5.0.0: - dependencies: - tr46: 0.0.3 - webidl-conversions: 3.0.1 - - whatwg-url@7.1.0: - dependencies: - lodash.sortby: 4.7.0 - tr46: 1.0.1 - webidl-conversions: 4.0.2 - - which-boxed-primitive@1.0.2: - dependencies: - is-bigint: 1.0.4 - is-boolean-object: 1.1.2 - is-number-object: 1.0.7 - is-string: 1.0.7 - is-symbol: 1.0.4 - - which-builtin-type@1.1.3: - dependencies: - function.prototype.name: 1.1.5 - has-tostringtag: 1.0.0 - is-async-function: 2.0.0 - is-date-object: 1.0.5 - is-finalizationregistry: 1.0.2 - is-generator-function: 1.0.10 - is-regex: 1.1.4 - is-weakref: 1.0.2 - isarray: 2.0.5 - which-boxed-primitive: 1.0.2 - which-collection: 1.0.1 - which-typed-array: 1.1.11 - - 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: {} - - which-module@2.0.0: {} - - which-pm@2.0.0: - dependencies: - load-yaml-file: 0.2.0 - path-exists: 4.0.0 - - which-typed-array@1.1.11: - dependencies: - available-typed-arrays: 1.0.5 - call-bind: 1.0.2 - for-each: 0.3.3 - gopd: 1.0.1 - has-tostringtag: 1.0.0 - - which@1.3.1: - dependencies: - isexe: 2.0.0 - - which@2.0.2: - dependencies: - isexe: 2.0.0 - - why-is-node-running@2.2.2: - dependencies: - siginfo: 2.0.0 - stackback: 0.0.2 - - widest-line@3.1.0: - dependencies: - string-width: 4.2.3 - - window-size@0.2.0: {} - - wordwrapjs@4.0.1: - dependencies: - reduce-flatten: 2.0.0 - typical: 5.2.0 - - workerpool@6.2.1: {} - - wrap-ansi@2.1.0: - dependencies: - string-width: 1.0.2 - strip-ansi: 3.0.1 - - 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: - dependencies: - ansi-styles: 4.3.0 - string-width: 4.2.3 - strip-ansi: 6.0.1 - - wrap-ansi@8.1.0: - dependencies: - ansi-styles: 6.2.1 - string-width: 5.1.2 - strip-ansi: 7.1.0 - - wrap-ansi@9.0.0: - dependencies: - ansi-styles: 6.2.1 - string-width: 7.0.0 - strip-ansi: 7.1.0 - - wrappy@1.0.2: {} - - 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 - - ws@7.4.6(bufferutil@4.0.8)(utf-8-validate@5.0.7): - optionalDependencies: - bufferutil: 4.0.8 - utf-8-validate: 5.0.7 - - 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.13.0(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(bufferutil@4.0.8)(utf-8-validate@5.0.7): - optionalDependencies: - bufferutil: 4.0.8 - utf-8-validate: 5.0.7 - optional: true - - xml-name-validator@5.0.0: - optional: true - - xmlchars@2.2.0: - optional: true - - xtend@4.0.2: {} - - y18n@3.2.2: {} - - y18n@4.0.3: {} - - y18n@5.0.8: {} - - yallist@2.1.2: {} - - yallist@3.1.1: {} - - yallist@4.0.0: {} - - yaml@1.10.2: {} - - yaml@2.3.4: {} - - yargs-parser@18.1.3: - dependencies: - camelcase: 5.3.1 - decamelize: 1.2.0 - - yargs-parser@2.4.1: - dependencies: - camelcase: 3.0.0 - lodash.assign: 4.2.0 - - yargs-parser@20.2.4: {} - - yargs-parser@20.2.9: {} - - yargs-parser@21.1.1: {} - - yargs-unparser@2.0.0: - dependencies: - camelcase: 6.3.0 - decamelize: 4.0.0 - flat: 5.0.2 - is-plain-obj: 2.1.0 - - yargs@15.4.1: - dependencies: - cliui: 6.0.0 - decamelize: 1.2.0 - find-up: 4.1.0 - get-caller-file: 2.0.5 - require-directory: 2.1.1 - require-main-filename: 2.0.0 - set-blocking: 2.0.0 - string-width: 4.2.3 - which-module: 2.0.0 - y18n: 4.0.3 - yargs-parser: 18.1.3 - - yargs@16.2.0: - dependencies: - cliui: 7.0.4 - escalade: 3.1.1 - get-caller-file: 2.0.5 - require-directory: 2.1.1 - string-width: 4.2.3 - y18n: 5.0.8 - yargs-parser: 20.2.9 - - yargs@17.7.2: - dependencies: - cliui: 8.0.1 - escalade: 3.1.1 - get-caller-file: 2.0.5 - require-directory: 2.1.1 - string-width: 4.2.3 - y18n: 5.0.8 - yargs-parser: 21.1.1 - - yargs@4.8.1: - dependencies: - cliui: 3.2.0 - decamelize: 1.2.0 - get-caller-file: 1.0.3 - lodash.assign: 4.2.0 - os-locale: 1.4.0 - read-pkg-up: 1.0.1 - require-directory: 2.1.1 - require-main-filename: 1.0.1 - set-blocking: 2.0.0 - string-width: 1.0.2 - which-module: 1.0.0 - window-size: 0.2.0 - y18n: 3.2.2 - yargs-parser: 2.4.1 - - yn@2.0.0: {} - - yn@3.1.1: {} - - yocto-queue@0.1.0: {} - - yocto-queue@1.0.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(bufferutil@4.0.8)(utf-8-validate@5.0.7) - - zod@3.22.4: {} - - zwitch@1.0.5: {} diff --git a/pnpm-workspace.yaml b/pnpm-workspace.yaml deleted file mode 100644 index d357a4260cd9..000000000000 --- a/pnpm-workspace.yaml +++ /dev/null @@ -1,4 +0,0 @@ -packages: - - 'packages/*' - - 'endpoint-monitor' - - 'indexer/api-ts' diff --git a/proxyd/.gitignore b/proxyd/.gitignore deleted file mode 100644 index 65e6a826f682..000000000000 --- a/proxyd/.gitignore +++ /dev/null @@ -1,3 +0,0 @@ -bin - -config.toml diff --git a/proxyd/CHANGELOG.md b/proxyd/CHANGELOG.md deleted file mode 100644 index dd78bfe3c803..000000000000 --- a/proxyd/CHANGELOG.md +++ /dev/null @@ -1,252 +0,0 @@ -# @eth-optimism/proxyd - -## 3.14.1 - -### Patch Changes - -- 5602deec7: chore(deps): bump github.com/prometheus/client_golang from 1.11.0 to 1.11.1 in /proxyd -- 6b3cf2070: Remove useless logging - -## 3.14.0 - -### Minor Changes - -- 9cc39bcfa: Add support for global method override rate limit -- 30db32862: Include nonce in sender rate limit - -### Patch Changes - -- b9bb1a98a: proxyd: Add req_id to log - -## 3.13.0 - -### Minor Changes - -- 6de891d3b: Add sender-based rate limiter - -## 3.12.0 - -### Minor Changes - -- e9f2c701: Allow disabling backend rate limiter -- ca45a85e: Support pattern matching in exempt origins/user agents -- f4faa44c: adds server.log_level config - -## 3.11.0 - -### Minor Changes - -- b3c5eeec: Fixed JSON-RPC 2.0 specification compliance by adding the optional data field on an RPCError -- 01ae6625: Adds new Redis rate limiter - -## 3.10.2 - -### Patch Changes - -- 6bb35fd8: Add customizable whitelist error -- 7121648c: Batch metrics and max batch size - -## 3.10.1 - -### Patch Changes - -- b82a8f48: Add logging for origin and remote IP' -- 1bf9559c: Carry over custom limit message in batches - -## 3.10.0 - -### Minor Changes - -- 157ccc84: Support per-method rate limiting - -## 3.9.1 - -### Patch Changes - -- dc4f6a06: Add logging/metrics - -## 3.9.0 - -### Minor Changes - -- b6f4bfcf: Add frontend rate limiting - -### Patch Changes - -- 406a4fce: Unwrap single RPC batches -- 915f3b28: Parameterize full RPC request logging - -## 3.8.9 - -### Patch Changes - -- 063c55cf: Use canned response for eth_accounts - -## 3.8.8 - -### Patch Changes - -- 58dc7adc: Improve robustness against unexpected JSON-RPC from upstream -- 552cd641: Fix concurrent write panic in WS - -## 3.8.7 - -### Patch Changes - -- 6f458607: Bump go-ethereum to 1.10.17 - -## 3.8.6 - -### Patch Changes - -- d79d40c4: proxyd: Proxy requests using batch JSON-RPC - -## 3.8.5 - -### Patch Changes - -- 2a062b11: proxyd: Log ssanitized RPC requests -- d9f058ce: proxyd: Reduced RPC request logging -- a4bfd9e7: proxyd: Limit the number of concurrent RPCs to backends - -## 3.8.4 - -### Patch Changes - -- 08329ba2: proxyd: Record redis cache operation latency -- ae112021: proxyd: Request-scoped context for fast batch RPC short-circuiting - -## 3.8.3 - -### Patch Changes - -- 160f4c3d: Update docker image to use golang 1.18.0 - -## 3.8.2 - -### Patch Changes - -- ae18cea1: Don't hit Redis when the out of service interval is zero - -## 3.8.1 - -### Patch Changes - -- acf7dbd5: Update to go-ethereum v1.10.16 - -## 3.8.0 - -### Minor Changes - -- 527448bb: Handle nil responses better - -## 3.7.0 - -### Minor Changes - -- 3c2926b1: Add debug cache status header to proxyd responses - -## 3.6.0 - -### Minor Changes - -- 096c5f20: proxyd: Allow cached RPCs to be evicted by redis -- 71d64834: Add caching for block-dependent RPCs -- fd2e1523: proxyd: Cache block-dependent RPCs -- 1760613c: Add integration tests and batching - -## 3.5.0 - -### Minor Changes - -- 025a3c0d: Add request/response payload size metrics to proxyd -- daf8db0b: cache immutable RPC responses in proxyd -- 8aa89bf3: Add X-Forwarded-For header when proxying RPCs on proxyd - -## 3.4.1 - -### Patch Changes - -- 415164e1: Force proxyd build - -## 3.4.0 - -### Minor Changes - -- 4b56ed84: Various proxyd fixes - -## 3.3.0 - -### Minor Changes - -- 7b7ffd2e: Allows string RPC ids on proxyd - -## 3.2.0 - -### Minor Changes - -- 73484138: Adds ability to specify env vars in config - -## 3.1.2 - -### Patch Changes - -- 1b79aa62: Release proxyd - -## 3.1.1 - -### Patch Changes - -- b8802054: Trigger release of proxyd -- 34fcb277: Bump proxyd to test release build workflow - -## 3.1.0 - -### Minor Changes - -- da6138fd: Updated metrics, support local rate limiter - -### Patch Changes - -- 6c7f483b: Add support for additional SSL certificates in Docker container - -## 3.0.0 - -### Major Changes - -- abe231bf: Make endpoints match Geth, better logging - -## 2.0.0 - -### Major Changes - -- 6c50098b: Update metrics, support WS -- f827dbda: Brings back the ability to selectively route RPC methods to backend groups - -### Minor Changes - -- 8cc824e5: Updates proxyd to include additional error metrics. -- 9ba4c5e0: Update metrics, support authenticated endpoints -- 78d0f3f0: Put special errors in a dedicated metric, pass along the content-type header - -### Patch Changes - -- 6e6a55b1: Canary release - -## 1.0.2 - -### Patch Changes - -- b9d2fbee: Trigger releases - -## 1.0.1 - -### Patch Changes - -- 893623c9: Trigger patch releases for dockerhub - -## 1.0.0 - -### Major Changes - -- 28aabc41: Initial release of RPC proxy daemon diff --git a/proxyd/Dockerfile b/proxyd/Dockerfile deleted file mode 100644 index b066e0ecafe7..000000000000 --- a/proxyd/Dockerfile +++ /dev/null @@ -1,32 +0,0 @@ -FROM golang:1.21.3-alpine3.18 as builder - -ARG GITCOMMIT=docker -ARG GITDATE=docker -ARG GITVERSION=docker - -RUN apk add make jq git gcc musl-dev linux-headers - -COPY ./proxyd /app - -WORKDIR /app - -RUN make proxyd - -FROM alpine:3.18 - -RUN apk add bind-tools jq curl bash git redis - -COPY ./proxyd/entrypoint.sh /bin/entrypoint.sh - -RUN apk update && \ - apk add ca-certificates && \ - chmod +x /bin/entrypoint.sh - -EXPOSE 8080 - -VOLUME /etc/proxyd - -COPY --from=builder /app/bin/proxyd /bin/proxyd - -ENTRYPOINT ["/bin/entrypoint.sh"] -CMD ["/bin/proxyd", "/etc/proxyd/proxyd.toml"] diff --git a/proxyd/Dockerfile.ignore b/proxyd/Dockerfile.ignore deleted file mode 100644 index eac1d0bc0b26..000000000000 --- a/proxyd/Dockerfile.ignore +++ /dev/null @@ -1,3 +0,0 @@ -# ignore everything but proxyd, proxyd defines all its dependencies in the go.mod -* -!/proxyd diff --git a/proxyd/Makefile b/proxyd/Makefile deleted file mode 100644 index 049a23a3c011..000000000000 --- a/proxyd/Makefile +++ /dev/null @@ -1,21 +0,0 @@ -LDFLAGSSTRING +=-X main.GitCommit=$(GITCOMMIT) -LDFLAGSSTRING +=-X main.GitDate=$(GITDATE) -LDFLAGSSTRING +=-X main.GitVersion=$(GITVERSION) -LDFLAGS := -ldflags "$(LDFLAGSSTRING)" - -proxyd: - go build -v $(LDFLAGS) -o ./bin/proxyd ./cmd/proxyd -.PHONY: proxyd - -fmt: - go mod tidy - gofmt -w . -.PHONY: fmt - -test: - go test -v ./... -.PHONY: test - -lint: - go vet ./... -.PHONY: test diff --git a/proxyd/README.md b/proxyd/README.md index 4a3a84bafc49..f44b815ab2dc 100644 --- a/proxyd/README.md +++ b/proxyd/README.md @@ -1,146 +1,2 @@ -# rpc-proxy - -This tool implements `proxyd`, an RPC request router and proxy. It does the following things: - -1. Whitelists RPC methods. -2. Routes RPC methods to groups of backend services. -3. Automatically retries failed backend requests. -4. Track backend consensus (`latest`, `safe`, `finalized` blocks), peer count and sync state. -5. Re-write requests and responses to enforce consensus. -6. Load balance requests across backend services. -7. Cache immutable responses from backends. -8. Provides metrics to measure request latency, error rates, and the like. - - -## Usage - -Run `make proxyd` to build the binary. No additional dependencies are necessary. - -To configure `proxyd` for use, you'll need to create a configuration file to define your proxy backends and routing rules. Check out [example.config.toml](./example.config.toml) for how to do this alongside a full list of all options with commentary. - -Once you have a config file, start the daemon via `proxyd <path-to-config>.toml`. - - -## Consensus awareness - -Starting on v4.0.0, `proxyd` is aware of the consensus state of its backends. This helps minimize chain reorgs experienced by clients. - -To enable this behavior, you must set `consensus_aware` value to `true` in the backend group. - -When consensus awareness is enabled, `proxyd` will poll the backends for their states and resolve a consensus group based on: -* the common ancestor `latest` block, i.e. if a backend is experiencing a fork, the fork won't be visible to the clients -* the lowest `safe` block -* the lowest `finalized` block -* peer count -* sync state - -The backend group then acts as a round-robin load balancer distributing traffic equally across healthy backends in the consensus group, increasing the availability of the proxy. - -A backend is considered healthy if it meets the following criteria: -* not banned -* avg 1-min moving window error rate ≤ configurable threshold -* avg 1-min moving window latency ≤ configurable threshold -* peer count ≥ configurable threshold -* `latest` block lag ≤ configurable threshold -* last state update ≤ configurable threshold -* not currently syncing - -When a backend is experiencing inconsistent consensus, high error rates or high latency, -the backend will be banned for a configurable amount of time (default 5 minutes) -and won't receive any traffic during this period. - - -## Tag rewrite - -When consensus awareness is enabled, `proxyd` will enforce the consensus state transparently for all the clients. - -For example, if a client requests the `eth_getBlockByNumber` method with the `latest` tag, -`proxyd` will rewrite the request to use the resolved latest block from the consensus group -and forward it to the backend. - -The following request methods are rewritten: -* `eth_getLogs` -* `eth_newFilter` -* `eth_getBalance` -* `eth_getCode` -* `eth_getTransactionCount` -* `eth_call` -* `eth_getStorageAt` -* `eth_getBlockTransactionCountByNumber` -* `eth_getUncleCountByBlockNumber` -* `eth_getBlockByNumber` -* `eth_getTransactionByBlockNumberAndIndex` -* `eth_getUncleByBlockNumberAndIndex` -* `debug_getRawReceipts` - -And `eth_blockNumber` response is overridden with current block consensus. - - -## Cacheable methods - -Cache use Redis and can be enabled for the following immutable methods: - -* `eth_chainId` -* `net_version` -* `eth_getBlockTransactionCountByHash` -* `eth_getUncleCountByBlockHash` -* `eth_getBlockByHash` -* `eth_getTransactionByBlockHashAndIndex` -* `eth_getUncleByBlockHashAndIndex` -* `debug_getRawReceipts` (block hash only) - -## Meta method `consensus_getReceipts` - -To support backends with different specifications in the same backend group, -proxyd exposes a convenient method to fetch receipts abstracting away -what specific backend will serve the request. - -Each backend specifies their preferred method to fetch receipts with `consensus_receipts_target` config, -which will be translated from `consensus_getReceipts`. - -This method takes a `blockNumberOrHash` (i.e. `tag|qty|hash`) -and returns the receipts for all transactions in the block. - -Request example -```json -{ - "jsonrpc":"2.0", - "id": 1, - "params": ["0xc6ef2fc5426d6ad6fd9e2a26abeab0aa2411b7ab17f30a99d3cb96aed1d1055b"] -} -``` - -It currently supports translation to the following targets: -* `debug_getRawReceipts(blockOrHash)` (default) -* `alchemy_getTransactionReceipts(blockOrHash)` -* `parity_getBlockReceipts(blockOrHash)` -* `eth_getBlockReceipts(blockOrHash)` - -The selected target is returned in the response, in a wrapped result. - -Response example -```json -{ - "jsonrpc": "2.0", - "id": 1, - "result": { - "method": "debug_getRawReceipts", - "result": { - // the actual raw result from backend - } - } -} -``` - -See [op-node receipt fetcher](https://github.com/ethereum-optimism/optimism/blob/186e46a47647a51a658e699e9ff047d39444c2de/op-node/sources/receipts.go#L186-L253). - - -## Metrics - -See `metrics.go` for a list of all available metrics. - -The metrics port is configurable via the `metrics.port` and `metrics.host` keys in the config. - -## Adding Backend SSL Certificates in Docker - -The Docker image runs on Alpine Linux. If you get SSL errors when connecting to a backend within Docker, you may need to add additional certificates to Alpine's certificate store. To do this, bind mount the certificate bundle into a file in `/usr/local/share/ca-certificates`. The `entrypoint.sh` script will then update the store with whatever is in the `ca-certificates` directory prior to starting `proxyd`. +# ⚠️ Important +This project has been moved to [ethereum-optimism/infra](https://github.com/ethereum-optimism/infra) diff --git a/proxyd/backend.go b/proxyd/backend.go deleted file mode 100644 index 81ec23c25ff6..000000000000 --- a/proxyd/backend.go +++ /dev/null @@ -1,1249 +0,0 @@ -package proxyd - -import ( - "bytes" - "context" - "crypto/tls" - "encoding/json" - "errors" - "fmt" - "io" - "math" - "math/rand" - "net/http" - "sort" - "strconv" - "strings" - "sync" - "time" - - sw "github.com/ethereum-optimism/optimism/proxyd/pkg/avg-sliding-window" - "github.com/ethereum/go-ethereum/common" - "github.com/ethereum/go-ethereum/log" - "github.com/ethereum/go-ethereum/rpc" - "github.com/gorilla/websocket" - "github.com/prometheus/client_golang/prometheus" - "github.com/xaionaro-go/weightedshuffle" - "golang.org/x/sync/semaphore" -) - -const ( - JSONRPCVersion = "2.0" - JSONRPCErrorInternal = -32000 - notFoundRpcError = -32601 -) - -var ( - ErrParseErr = &RPCErr{ - Code: -32700, - Message: "parse error", - HTTPErrorCode: 400, - } - ErrInternal = &RPCErr{ - Code: JSONRPCErrorInternal, - Message: "internal error", - HTTPErrorCode: 500, - } - ErrMethodNotWhitelisted = &RPCErr{ - Code: notFoundRpcError, - Message: "rpc method is not whitelisted", - HTTPErrorCode: 403, - } - ErrBackendOffline = &RPCErr{ - Code: JSONRPCErrorInternal - 10, - Message: "backend offline", - HTTPErrorCode: 503, - } - ErrNoBackends = &RPCErr{ - Code: JSONRPCErrorInternal - 11, - Message: "no backends available for method", - HTTPErrorCode: 503, - } - ErrBackendOverCapacity = &RPCErr{ - Code: JSONRPCErrorInternal - 12, - Message: "backend is over capacity", - HTTPErrorCode: 429, - } - ErrBackendBadResponse = &RPCErr{ - Code: JSONRPCErrorInternal - 13, - Message: "backend returned an invalid response", - HTTPErrorCode: 500, - } - ErrTooManyBatchRequests = &RPCErr{ - Code: JSONRPCErrorInternal - 14, - Message: "too many RPC calls in batch request", - } - ErrGatewayTimeout = &RPCErr{ - Code: JSONRPCErrorInternal - 15, - Message: "gateway timeout", - HTTPErrorCode: 504, - } - ErrOverRateLimit = &RPCErr{ - Code: JSONRPCErrorInternal - 16, - Message: "over rate limit", - HTTPErrorCode: 429, - } - ErrOverSenderRateLimit = &RPCErr{ - Code: JSONRPCErrorInternal - 17, - Message: "sender is over rate limit", - HTTPErrorCode: 429, - } - ErrNotHealthy = &RPCErr{ - Code: JSONRPCErrorInternal - 18, - Message: "backend is currently not healthy to serve traffic", - HTTPErrorCode: 503, - } - ErrBlockOutOfRange = &RPCErr{ - Code: JSONRPCErrorInternal - 19, - Message: "block is out of range", - HTTPErrorCode: 400, - } - - ErrRequestBodyTooLarge = &RPCErr{ - Code: JSONRPCErrorInternal - 21, - Message: "request body too large", - HTTPErrorCode: 413, - } - - ErrBackendResponseTooLarge = &RPCErr{ - Code: JSONRPCErrorInternal - 20, - Message: "backend response too large", - HTTPErrorCode: 500, - } - - ErrBackendUnexpectedJSONRPC = errors.New("backend returned an unexpected JSON-RPC response") - - ErrConsensusGetReceiptsCantBeBatched = errors.New("consensus_getReceipts cannot be batched") - ErrConsensusGetReceiptsInvalidTarget = errors.New("unsupported consensus_receipts_target") -) - -func ErrInvalidRequest(msg string) *RPCErr { - return &RPCErr{ - Code: -32600, - Message: msg, - HTTPErrorCode: 400, - } -} - -func ErrInvalidParams(msg string) *RPCErr { - return &RPCErr{ - Code: -32602, - Message: msg, - HTTPErrorCode: 400, - } -} - -type Backend struct { - Name string - rpcURL string - receiptsTarget string - wsURL string - authUsername string - authPassword string - headers map[string]string - client *LimitedHTTPClient - dialer *websocket.Dialer - maxRetries int - maxResponseSize int64 - maxRPS int - maxWSConns int - outOfServiceInterval time.Duration - stripTrailingXFF bool - proxydIP string - - skipPeerCountCheck bool - forcedCandidate bool - - maxDegradedLatencyThreshold time.Duration - maxLatencyThreshold time.Duration - maxErrorRateThreshold float64 - - latencySlidingWindow *sw.AvgSlidingWindow - networkRequestsSlidingWindow *sw.AvgSlidingWindow - networkErrorsSlidingWindow *sw.AvgSlidingWindow - - weight int -} - -type BackendOpt func(b *Backend) - -func WithBasicAuth(username, password string) BackendOpt { - return func(b *Backend) { - b.authUsername = username - b.authPassword = password - } -} - -func WithHeaders(headers map[string]string) BackendOpt { - return func(b *Backend) { - b.headers = headers - } -} - -func WithTimeout(timeout time.Duration) BackendOpt { - return func(b *Backend) { - b.client.Timeout = timeout - } -} - -func WithMaxRetries(retries int) BackendOpt { - return func(b *Backend) { - b.maxRetries = retries - } -} - -func WithMaxResponseSize(size int64) BackendOpt { - return func(b *Backend) { - b.maxResponseSize = size - } -} - -func WithOutOfServiceDuration(interval time.Duration) BackendOpt { - return func(b *Backend) { - b.outOfServiceInterval = interval - } -} - -func WithMaxRPS(maxRPS int) BackendOpt { - return func(b *Backend) { - b.maxRPS = maxRPS - } -} - -func WithMaxWSConns(maxConns int) BackendOpt { - return func(b *Backend) { - b.maxWSConns = maxConns - } -} - -func WithTLSConfig(tlsConfig *tls.Config) BackendOpt { - return func(b *Backend) { - if b.client.Transport == nil { - b.client.Transport = &http.Transport{} - } - b.client.Transport.(*http.Transport).TLSClientConfig = tlsConfig - } -} - -func WithStrippedTrailingXFF() BackendOpt { - return func(b *Backend) { - b.stripTrailingXFF = true - } -} - -func WithProxydIP(ip string) BackendOpt { - return func(b *Backend) { - b.proxydIP = ip - } -} - -func WithConsensusSkipPeerCountCheck(skipPeerCountCheck bool) BackendOpt { - return func(b *Backend) { - b.skipPeerCountCheck = skipPeerCountCheck - } -} - -func WithConsensusForcedCandidate(forcedCandidate bool) BackendOpt { - return func(b *Backend) { - b.forcedCandidate = forcedCandidate - } -} - -func WithWeight(weight int) BackendOpt { - return func(b *Backend) { - b.weight = weight - } -} - -func WithMaxDegradedLatencyThreshold(maxDegradedLatencyThreshold time.Duration) BackendOpt { - return func(b *Backend) { - b.maxDegradedLatencyThreshold = maxDegradedLatencyThreshold - } -} - -func WithMaxLatencyThreshold(maxLatencyThreshold time.Duration) BackendOpt { - return func(b *Backend) { - b.maxLatencyThreshold = maxLatencyThreshold - } -} - -func WithMaxErrorRateThreshold(maxErrorRateThreshold float64) BackendOpt { - return func(b *Backend) { - b.maxErrorRateThreshold = maxErrorRateThreshold - } -} - -func WithConsensusReceiptTarget(receiptsTarget string) BackendOpt { - return func(b *Backend) { - b.receiptsTarget = receiptsTarget - } -} - -type indexedReqRes struct { - index int - req *RPCReq - res *RPCRes -} - -const proxydHealthzMethod = "proxyd_healthz" - -const ConsensusGetReceiptsMethod = "consensus_getReceipts" - -const ReceiptsTargetDebugGetRawReceipts = "debug_getRawReceipts" -const ReceiptsTargetAlchemyGetTransactionReceipts = "alchemy_getTransactionReceipts" -const ReceiptsTargetParityGetTransactionReceipts = "parity_getBlockReceipts" -const ReceiptsTargetEthGetTransactionReceipts = "eth_getBlockReceipts" - -type ConsensusGetReceiptsResult struct { - Method string `json:"method"` - Result interface{} `json:"result"` -} - -// BlockHashOrNumberParameter is a non-conventional wrapper used by alchemy_getTransactionReceipts -type BlockHashOrNumberParameter struct { - BlockHash *common.Hash `json:"blockHash"` - BlockNumber *rpc.BlockNumber `json:"blockNumber"` -} - -func NewBackend( - name string, - rpcURL string, - wsURL string, - rpcSemaphore *semaphore.Weighted, - opts ...BackendOpt, -) *Backend { - backend := &Backend{ - Name: name, - rpcURL: rpcURL, - wsURL: wsURL, - maxResponseSize: math.MaxInt64, - client: &LimitedHTTPClient{ - Client: http.Client{Timeout: 5 * time.Second}, - sem: rpcSemaphore, - backendName: name, - }, - dialer: &websocket.Dialer{}, - - maxLatencyThreshold: 10 * time.Second, - maxDegradedLatencyThreshold: 5 * time.Second, - maxErrorRateThreshold: 0.5, - - latencySlidingWindow: sw.NewSlidingWindow(), - networkRequestsSlidingWindow: sw.NewSlidingWindow(), - networkErrorsSlidingWindow: sw.NewSlidingWindow(), - } - - backend.Override(opts...) - - if !backend.stripTrailingXFF && backend.proxydIP == "" { - log.Warn("proxied requests' XFF header will not contain the proxyd ip address") - } - - return backend -} - -func (b *Backend) Override(opts ...BackendOpt) { - for _, opt := range opts { - opt(b) - } -} - -func (b *Backend) Forward(ctx context.Context, reqs []*RPCReq, isBatch bool) ([]*RPCRes, error) { - var lastError error - // <= to account for the first attempt not technically being - // a retry - for i := 0; i <= b.maxRetries; i++ { - RecordBatchRPCForward(ctx, b.Name, reqs, RPCRequestSourceHTTP) - metricLabelMethod := reqs[0].Method - if isBatch { - metricLabelMethod = "<batch>" - } - timer := prometheus.NewTimer( - rpcBackendRequestDurationSumm.WithLabelValues( - b.Name, - metricLabelMethod, - strconv.FormatBool(isBatch), - ), - ) - - res, err := b.doForward(ctx, reqs, isBatch) - switch err { - case nil: // do nothing - case ErrBackendResponseTooLarge: - log.Warn( - "backend response too large", - "name", b.Name, - "req_id", GetReqID(ctx), - "max", b.maxResponseSize, - ) - RecordBatchRPCError(ctx, b.Name, reqs, err) - case ErrConsensusGetReceiptsCantBeBatched: - log.Warn( - "Received unsupported batch request for consensus_getReceipts", - "name", b.Name, - "req_id", GetReqID(ctx), - "err", err, - ) - case ErrConsensusGetReceiptsInvalidTarget: - log.Error( - "Unsupported consensus_receipts_target for consensus_getReceipts", - "name", b.Name, - "req_id", GetReqID(ctx), - "err", err, - ) - // ErrBackendUnexpectedJSONRPC occurs because infura responds with a single JSON-RPC object - // to a batch request whenever any Request Object in the batch would induce a partial error. - // We don't label the backend offline in this case. But the error is still returned to - // callers so failover can occur if needed. - case ErrBackendUnexpectedJSONRPC: - log.Debug( - "Received unexpected JSON-RPC response", - "name", b.Name, - "req_id", GetReqID(ctx), - "err", err, - ) - default: - lastError = err - log.Warn( - "backend request failed, trying again", - "name", b.Name, - "req_id", GetReqID(ctx), - "err", err, - ) - timer.ObserveDuration() - RecordBatchRPCError(ctx, b.Name, reqs, err) - sleepContext(ctx, calcBackoff(i)) - continue - } - timer.ObserveDuration() - - MaybeRecordErrorsInRPCRes(ctx, b.Name, reqs, res) - return res, err - } - - return nil, wrapErr(lastError, "permanent error forwarding request") -} - -func (b *Backend) ProxyWS(clientConn *websocket.Conn, methodWhitelist *StringSet) (*WSProxier, error) { - backendConn, _, err := b.dialer.Dial(b.wsURL, nil) // nolint:bodyclose - if err != nil { - return nil, wrapErr(err, "error dialing backend") - } - - activeBackendWsConnsGauge.WithLabelValues(b.Name).Inc() - return NewWSProxier(b, clientConn, backendConn, methodWhitelist), nil -} - -// ForwardRPC makes a call directly to a backend and populate the response into `res` -func (b *Backend) ForwardRPC(ctx context.Context, res *RPCRes, id string, method string, params ...any) error { - jsonParams, err := json.Marshal(params) - if err != nil { - return err - } - - rpcReq := RPCReq{ - JSONRPC: JSONRPCVersion, - Method: method, - Params: jsonParams, - ID: []byte(id), - } - - slicedRes, err := b.doForward(ctx, []*RPCReq{&rpcReq}, false) - if err != nil { - return err - } - - if len(slicedRes) != 1 { - return fmt.Errorf("unexpected response len for non-batched request (len != 1)") - } - if slicedRes[0].IsError() { - return fmt.Errorf(slicedRes[0].Error.Error()) - } - - *res = *(slicedRes[0]) - return nil -} - -func (b *Backend) doForward(ctx context.Context, rpcReqs []*RPCReq, isBatch bool) ([]*RPCRes, error) { - // we are concerned about network error rates, so we record 1 request independently of how many are in the batch - b.networkRequestsSlidingWindow.Incr() - - translatedReqs := make(map[string]*RPCReq, len(rpcReqs)) - // translate consensus_getReceipts to receipts target - // right now we only support non-batched - if isBatch { - for _, rpcReq := range rpcReqs { - if rpcReq.Method == ConsensusGetReceiptsMethod { - return nil, ErrConsensusGetReceiptsCantBeBatched - } - } - } else { - for _, rpcReq := range rpcReqs { - if rpcReq.Method == ConsensusGetReceiptsMethod { - translatedReqs[string(rpcReq.ID)] = rpcReq - rpcReq.Method = b.receiptsTarget - var reqParams []rpc.BlockNumberOrHash - err := json.Unmarshal(rpcReq.Params, &reqParams) - if err != nil { - return nil, ErrInvalidRequest("invalid request") - } - - var translatedParams []byte - switch rpcReq.Method { - case ReceiptsTargetDebugGetRawReceipts, - ReceiptsTargetEthGetTransactionReceipts, - ReceiptsTargetParityGetTransactionReceipts: - // conventional methods use an array of strings having either block number or block hash - // i.e. ["0xc6ef2fc5426d6ad6fd9e2a26abeab0aa2411b7ab17f30a99d3cb96aed1d1055b"] - params := make([]string, 1) - if reqParams[0].BlockNumber != nil { - params[0] = reqParams[0].BlockNumber.String() - } else { - params[0] = reqParams[0].BlockHash.Hex() - } - translatedParams = mustMarshalJSON(params) - case ReceiptsTargetAlchemyGetTransactionReceipts: - // alchemy uses an array of object with either block number or block hash - // i.e. [{ blockHash: "0xc6ef2fc5426d6ad6fd9e2a26abeab0aa2411b7ab17f30a99d3cb96aed1d1055b" }] - params := make([]BlockHashOrNumberParameter, 1) - if reqParams[0].BlockNumber != nil { - params[0].BlockNumber = reqParams[0].BlockNumber - } else { - params[0].BlockHash = reqParams[0].BlockHash - } - translatedParams = mustMarshalJSON(params) - default: - return nil, ErrConsensusGetReceiptsInvalidTarget - } - - rpcReq.Params = translatedParams - } - } - } - - isSingleElementBatch := len(rpcReqs) == 1 - - // Single element batches are unwrapped before being sent - // since Alchemy handles single requests better than batches. - var body []byte - if isSingleElementBatch { - body = mustMarshalJSON(rpcReqs[0]) - } else { - body = mustMarshalJSON(rpcReqs) - } - - httpReq, err := http.NewRequestWithContext(ctx, "POST", b.rpcURL, bytes.NewReader(body)) - if err != nil { - b.networkErrorsSlidingWindow.Incr() - RecordBackendNetworkErrorRateSlidingWindow(b, b.ErrorRate()) - return nil, wrapErr(err, "error creating backend request") - } - - if b.authPassword != "" { - httpReq.SetBasicAuth(b.authUsername, b.authPassword) - } - - xForwardedFor := GetXForwardedFor(ctx) - if b.stripTrailingXFF { - xForwardedFor = stripXFF(xForwardedFor) - } else if b.proxydIP != "" { - xForwardedFor = fmt.Sprintf("%s, %s", xForwardedFor, b.proxydIP) - } - - httpReq.Header.Set("content-type", "application/json") - httpReq.Header.Set("X-Forwarded-For", xForwardedFor) - - for name, value := range b.headers { - httpReq.Header.Set(name, value) - } - - start := time.Now() - httpRes, err := b.client.DoLimited(httpReq) - if err != nil { - b.networkErrorsSlidingWindow.Incr() - RecordBackendNetworkErrorRateSlidingWindow(b, b.ErrorRate()) - return nil, wrapErr(err, "error in backend request") - } - - metricLabelMethod := rpcReqs[0].Method - if isBatch { - metricLabelMethod = "<batch>" - } - rpcBackendHTTPResponseCodesTotal.WithLabelValues( - GetAuthCtx(ctx), - b.Name, - metricLabelMethod, - strconv.Itoa(httpRes.StatusCode), - strconv.FormatBool(isBatch), - ).Inc() - - // Alchemy returns a 400 on bad JSONs, so handle that case - if httpRes.StatusCode != 200 && httpRes.StatusCode != 400 { - b.networkErrorsSlidingWindow.Incr() - RecordBackendNetworkErrorRateSlidingWindow(b, b.ErrorRate()) - return nil, fmt.Errorf("response code %d", httpRes.StatusCode) - } - - defer httpRes.Body.Close() - resB, err := io.ReadAll(LimitReader(httpRes.Body, b.maxResponseSize)) - if errors.Is(err, ErrLimitReaderOverLimit) { - return nil, ErrBackendResponseTooLarge - } - if err != nil { - b.networkErrorsSlidingWindow.Incr() - RecordBackendNetworkErrorRateSlidingWindow(b, b.ErrorRate()) - return nil, wrapErr(err, "error reading response body") - } - - var rpcRes []*RPCRes - if isSingleElementBatch { - var singleRes RPCRes - if err := json.Unmarshal(resB, &singleRes); err != nil { - return nil, ErrBackendBadResponse - } - rpcRes = []*RPCRes{ - &singleRes, - } - } else { - if err := json.Unmarshal(resB, &rpcRes); err != nil { - // Infura may return a single JSON-RPC response if, for example, the batch contains a request for an unsupported method - if responseIsNotBatched(resB) { - b.networkErrorsSlidingWindow.Incr() - RecordBackendNetworkErrorRateSlidingWindow(b, b.ErrorRate()) - return nil, ErrBackendUnexpectedJSONRPC - } - b.networkErrorsSlidingWindow.Incr() - RecordBackendNetworkErrorRateSlidingWindow(b, b.ErrorRate()) - return nil, ErrBackendBadResponse - } - } - - if len(rpcReqs) != len(rpcRes) { - b.networkErrorsSlidingWindow.Incr() - RecordBackendNetworkErrorRateSlidingWindow(b, b.ErrorRate()) - return nil, ErrBackendUnexpectedJSONRPC - } - - // capture the HTTP status code in the response. this will only - // ever be 400 given the status check on line 318 above. - if httpRes.StatusCode != 200 { - for _, res := range rpcRes { - res.Error.HTTPErrorCode = httpRes.StatusCode - } - } - duration := time.Since(start) - b.latencySlidingWindow.Add(float64(duration)) - RecordBackendNetworkLatencyAverageSlidingWindow(b, time.Duration(b.latencySlidingWindow.Avg())) - RecordBackendNetworkErrorRateSlidingWindow(b, b.ErrorRate()) - - // enrich the response with the actual request method - for _, res := range rpcRes { - translatedReq, exist := translatedReqs[string(res.ID)] - if exist { - res.Result = ConsensusGetReceiptsResult{ - Method: translatedReq.Method, - Result: res.Result, - } - } - } - - sortBatchRPCResponse(rpcReqs, rpcRes) - - return rpcRes, nil -} - -// IsHealthy checks if the backend is able to serve traffic, based on dynamic parameters -func (b *Backend) IsHealthy() bool { - errorRate := b.ErrorRate() - avgLatency := time.Duration(b.latencySlidingWindow.Avg()) - if errorRate >= b.maxErrorRateThreshold { - return false - } - if avgLatency >= b.maxLatencyThreshold { - return false - } - return true -} - -// ErrorRate returns the instant error rate of the backend -func (b *Backend) ErrorRate() (errorRate float64) { - // we only really start counting the error rate after a minimum of 10 requests - // this is to avoid false positives when the backend is just starting up - if b.networkRequestsSlidingWindow.Sum() >= 10 { - errorRate = b.networkErrorsSlidingWindow.Sum() / b.networkRequestsSlidingWindow.Sum() - } - return errorRate -} - -// IsDegraded checks if the backend is serving traffic in a degraded state (i.e. used as a last resource) -func (b *Backend) IsDegraded() bool { - avgLatency := time.Duration(b.latencySlidingWindow.Avg()) - return avgLatency >= b.maxDegradedLatencyThreshold -} - -func responseIsNotBatched(b []byte) bool { - var r RPCRes - return json.Unmarshal(b, &r) == nil -} - -// sortBatchRPCResponse sorts the RPCRes slice according to the position of its corresponding ID in the RPCReq slice -func sortBatchRPCResponse(req []*RPCReq, res []*RPCRes) { - pos := make(map[string]int, len(req)) - for i, r := range req { - key := string(r.ID) - if _, ok := pos[key]; ok { - panic("bug! detected requests with duplicate IDs") - } - pos[key] = i - } - - sort.Slice(res, func(i, j int) bool { - l := res[i].ID - r := res[j].ID - return pos[string(l)] < pos[string(r)] - }) -} - -type BackendGroup struct { - Name string - Backends []*Backend - WeightedRouting bool - Consensus *ConsensusPoller -} - -func (bg *BackendGroup) Forward(ctx context.Context, rpcReqs []*RPCReq, isBatch bool) ([]*RPCRes, string, error) { - if len(rpcReqs) == 0 { - return nil, "", nil - } - - backends := bg.orderedBackendsForRequest() - - overriddenResponses := make([]*indexedReqRes, 0) - rewrittenReqs := make([]*RPCReq, 0, len(rpcReqs)) - - if bg.Consensus != nil { - // When `consensus_aware` is set to `true`, the backend group acts as a load balancer - // serving traffic from any backend that agrees in the consensus group - - // We also rewrite block tags to enforce compliance with consensus - rctx := RewriteContext{ - latest: bg.Consensus.GetLatestBlockNumber(), - safe: bg.Consensus.GetSafeBlockNumber(), - finalized: bg.Consensus.GetFinalizedBlockNumber(), - maxBlockRange: bg.Consensus.maxBlockRange, - } - - for i, req := range rpcReqs { - res := RPCRes{JSONRPC: JSONRPCVersion, ID: req.ID} - result, err := RewriteTags(rctx, req, &res) - switch result { - case RewriteOverrideError: - overriddenResponses = append(overriddenResponses, &indexedReqRes{ - index: i, - req: req, - res: &res, - }) - if errors.Is(err, ErrRewriteBlockOutOfRange) { - res.Error = ErrBlockOutOfRange - } else if errors.Is(err, ErrRewriteRangeTooLarge) { - res.Error = ErrInvalidParams( - fmt.Sprintf("block range greater than %d max", rctx.maxBlockRange), - ) - } else { - res.Error = ErrParseErr - } - case RewriteOverrideResponse: - overriddenResponses = append(overriddenResponses, &indexedReqRes{ - index: i, - req: req, - res: &res, - }) - case RewriteOverrideRequest, RewriteNone: - rewrittenReqs = append(rewrittenReqs, req) - } - } - rpcReqs = rewrittenReqs - } - - rpcRequestsTotal.Inc() - - for _, back := range backends { - res := make([]*RPCRes, 0) - var err error - - servedBy := fmt.Sprintf("%s/%s", bg.Name, back.Name) - - if len(rpcReqs) > 0 { - res, err = back.Forward(ctx, rpcReqs, isBatch) - if errors.Is(err, ErrConsensusGetReceiptsCantBeBatched) || - errors.Is(err, ErrConsensusGetReceiptsInvalidTarget) || - errors.Is(err, ErrMethodNotWhitelisted) { - return nil, "", err - } - if errors.Is(err, ErrBackendResponseTooLarge) { - return nil, servedBy, err - } - if errors.Is(err, ErrBackendOffline) { - log.Warn( - "skipping offline backend", - "name", back.Name, - "auth", GetAuthCtx(ctx), - "req_id", GetReqID(ctx), - ) - continue - } - if errors.Is(err, ErrBackendOverCapacity) { - log.Warn( - "skipping over-capacity backend", - "name", back.Name, - "auth", GetAuthCtx(ctx), - "req_id", GetReqID(ctx), - ) - continue - } - if err != nil { - log.Error( - "error forwarding request to backend", - "name", back.Name, - "req_id", GetReqID(ctx), - "auth", GetAuthCtx(ctx), - "err", err, - ) - continue - } - } - - // re-apply overridden responses - for _, ov := range overriddenResponses { - if len(res) > 0 { - // insert ov.res at position ov.index - res = append(res[:ov.index], append([]*RPCRes{ov.res}, res[ov.index:]...)...) - } else { - res = append(res, ov.res) - } - } - - return res, servedBy, nil - } - - RecordUnserviceableRequest(ctx, RPCRequestSourceHTTP) - return nil, "", ErrNoBackends -} - -func (bg *BackendGroup) ProxyWS(ctx context.Context, clientConn *websocket.Conn, methodWhitelist *StringSet) (*WSProxier, error) { - for _, back := range bg.Backends { - proxier, err := back.ProxyWS(clientConn, methodWhitelist) - if errors.Is(err, ErrBackendOffline) { - log.Warn( - "skipping offline backend", - "name", back.Name, - "req_id", GetReqID(ctx), - "auth", GetAuthCtx(ctx), - ) - continue - } - if errors.Is(err, ErrBackendOverCapacity) { - log.Warn( - "skipping over-capacity backend", - "name", back.Name, - "req_id", GetReqID(ctx), - "auth", GetAuthCtx(ctx), - ) - continue - } - if err != nil { - log.Warn( - "error dialing ws backend", - "name", back.Name, - "req_id", GetReqID(ctx), - "auth", GetAuthCtx(ctx), - "err", err, - ) - continue - } - return proxier, nil - } - - return nil, ErrNoBackends -} - -func weightedShuffle(backends []*Backend) { - weight := func(i int) float64 { - return float64(backends[i].weight) - } - - weightedshuffle.ShuffleInplace(backends, weight, nil) -} - -func (bg *BackendGroup) orderedBackendsForRequest() []*Backend { - if bg.Consensus != nil { - return bg.loadBalancedConsensusGroup() - } else if bg.WeightedRouting { - result := make([]*Backend, len(bg.Backends)) - copy(result, bg.Backends) - weightedShuffle(result) - return result - } else { - return bg.Backends - } -} - -func (bg *BackendGroup) loadBalancedConsensusGroup() []*Backend { - cg := bg.Consensus.GetConsensusGroup() - - backendsHealthy := make([]*Backend, 0, len(cg)) - backendsDegraded := make([]*Backend, 0, len(cg)) - // separate into healthy, degraded and unhealthy backends - for _, be := range cg { - // unhealthy are filtered out and not attempted - if !be.IsHealthy() { - continue - } - if be.IsDegraded() { - backendsDegraded = append(backendsDegraded, be) - continue - } - backendsHealthy = append(backendsHealthy, be) - } - - // shuffle both slices - r := rand.New(rand.NewSource(time.Now().UnixNano())) - r.Shuffle(len(backendsHealthy), func(i, j int) { - backendsHealthy[i], backendsHealthy[j] = backendsHealthy[j], backendsHealthy[i] - }) - r.Shuffle(len(backendsDegraded), func(i, j int) { - backendsDegraded[i], backendsDegraded[j] = backendsDegraded[j], backendsDegraded[i] - }) - - if bg.WeightedRouting { - weightedShuffle(backendsHealthy) - } - - // healthy are put into a priority position - // degraded backends are used as fallback - backendsHealthy = append(backendsHealthy, backendsDegraded...) - - return backendsHealthy -} - -func (bg *BackendGroup) Shutdown() { - if bg.Consensus != nil { - bg.Consensus.Shutdown() - } -} - -func calcBackoff(i int) time.Duration { - jitter := float64(rand.Int63n(250)) - ms := math.Min(math.Pow(2, float64(i))*1000+jitter, 3000) - return time.Duration(ms) * time.Millisecond -} - -type WSProxier struct { - backend *Backend - clientConn *websocket.Conn - clientConnMu sync.Mutex - backendConn *websocket.Conn - backendConnMu sync.Mutex - methodWhitelist *StringSet - readTimeout time.Duration - writeTimeout time.Duration -} - -func NewWSProxier(backend *Backend, clientConn, backendConn *websocket.Conn, methodWhitelist *StringSet) *WSProxier { - return &WSProxier{ - backend: backend, - clientConn: clientConn, - backendConn: backendConn, - methodWhitelist: methodWhitelist, - readTimeout: defaultWSReadTimeout, - writeTimeout: defaultWSWriteTimeout, - } -} - -func (w *WSProxier) Proxy(ctx context.Context) error { - errC := make(chan error, 2) - go w.clientPump(ctx, errC) - go w.backendPump(ctx, errC) - err := <-errC - w.close() - return err -} - -func (w *WSProxier) clientPump(ctx context.Context, errC chan error) { - for { - // Block until we get a message. - msgType, msg, err := w.clientConn.ReadMessage() - if err != nil { - if err := w.writeBackendConn(websocket.CloseMessage, formatWSError(err)); err != nil { - log.Error("error writing backendConn message", "err", err) - errC <- err - return - } - } - - RecordWSMessage(ctx, w.backend.Name, SourceClient) - - // Route control messages to the backend. These don't - // count towards the total RPC requests count. - if msgType != websocket.TextMessage && msgType != websocket.BinaryMessage { - err := w.writeBackendConn(msgType, msg) - if err != nil { - errC <- err - return - } - continue - } - - rpcRequestsTotal.Inc() - - // Don't bother sending invalid requests to the backend, - // just handle them here. - req, err := w.prepareClientMsg(msg) - if err != nil { - var id json.RawMessage - method := MethodUnknown - if req != nil { - id = req.ID - method = req.Method - } - log.Info( - "error preparing client message", - "auth", GetAuthCtx(ctx), - "req_id", GetReqID(ctx), - "err", err, - ) - msg = mustMarshalJSON(NewRPCErrorRes(id, err)) - RecordRPCError(ctx, BackendProxyd, method, err) - - // Send error response to client - err = w.writeClientConn(msgType, msg) - if err != nil { - errC <- err - return - } - continue - } - - // Send eth_accounts requests directly to the client - if req.Method == "eth_accounts" { - msg = mustMarshalJSON(NewRPCRes(req.ID, emptyArrayResponse)) - RecordRPCForward(ctx, BackendProxyd, "eth_accounts", RPCRequestSourceWS) - err = w.writeClientConn(msgType, msg) - if err != nil { - errC <- err - return - } - continue - } - - RecordRPCForward(ctx, w.backend.Name, req.Method, RPCRequestSourceWS) - log.Info( - "forwarded WS message to backend", - "method", req.Method, - "auth", GetAuthCtx(ctx), - "req_id", GetReqID(ctx), - ) - - err = w.writeBackendConn(msgType, msg) - if err != nil { - errC <- err - return - } - } -} - -func (w *WSProxier) backendPump(ctx context.Context, errC chan error) { - for { - // Block until we get a message. - msgType, msg, err := w.backendConn.ReadMessage() - if err != nil { - if err := w.writeClientConn(websocket.CloseMessage, formatWSError(err)); err != nil { - log.Error("error writing clientConn message", "err", err) - errC <- err - return - } - } - - RecordWSMessage(ctx, w.backend.Name, SourceBackend) - - // Route control messages directly to the client. - if msgType != websocket.TextMessage && msgType != websocket.BinaryMessage { - err := w.writeClientConn(msgType, msg) - if err != nil { - errC <- err - return - } - continue - } - - res, err := w.parseBackendMsg(msg) - if err != nil { - var id json.RawMessage - if res != nil { - id = res.ID - } - msg = mustMarshalJSON(NewRPCErrorRes(id, err)) - log.Info("backend responded with error", "err", err) - } else { - if res.IsError() { - log.Info( - "backend responded with RPC error", - "code", res.Error.Code, - "msg", res.Error.Message, - "source", "ws", - "auth", GetAuthCtx(ctx), - "req_id", GetReqID(ctx), - ) - RecordRPCError(ctx, w.backend.Name, MethodUnknown, res.Error) - } else { - log.Info( - "forwarded WS message to client", - "auth", GetAuthCtx(ctx), - "req_id", GetReqID(ctx), - ) - } - } - - err = w.writeClientConn(msgType, msg) - if err != nil { - errC <- err - return - } - } -} - -func (w *WSProxier) close() { - w.clientConn.Close() - w.backendConn.Close() - activeBackendWsConnsGauge.WithLabelValues(w.backend.Name).Dec() -} - -func (w *WSProxier) prepareClientMsg(msg []byte) (*RPCReq, error) { - req, err := ParseRPCReq(msg) - if err != nil { - return nil, err - } - - if !w.methodWhitelist.Has(req.Method) { - return req, ErrMethodNotWhitelisted - } - - return req, nil -} - -func (w *WSProxier) parseBackendMsg(msg []byte) (*RPCRes, error) { - res, err := ParseRPCRes(bytes.NewReader(msg)) - if err != nil { - log.Warn("error parsing RPC response", "source", "ws", "err", err) - return res, ErrBackendBadResponse - } - return res, nil -} - -func (w *WSProxier) writeClientConn(msgType int, msg []byte) error { - w.clientConnMu.Lock() - defer w.clientConnMu.Unlock() - if err := w.clientConn.SetWriteDeadline(time.Now().Add(w.writeTimeout)); err != nil { - log.Error("ws client write timeout", "err", err) - return err - } - err := w.clientConn.WriteMessage(msgType, msg) - return err -} - -func (w *WSProxier) writeBackendConn(msgType int, msg []byte) error { - w.backendConnMu.Lock() - defer w.backendConnMu.Unlock() - if err := w.backendConn.SetWriteDeadline(time.Now().Add(w.writeTimeout)); err != nil { - log.Error("ws backend write timeout", "err", err) - return err - } - err := w.backendConn.WriteMessage(msgType, msg) - return err -} - -func mustMarshalJSON(in interface{}) []byte { - out, err := json.Marshal(in) - if err != nil { - panic(err) - } - return out -} - -func formatWSError(err error) []byte { - m := websocket.FormatCloseMessage(websocket.CloseNormalClosure, fmt.Sprintf("%v", err)) - if e, ok := err.(*websocket.CloseError); ok { - if e.Code != websocket.CloseNoStatusReceived { - m = websocket.FormatCloseMessage(e.Code, e.Text) - } - } - return m -} - -func sleepContext(ctx context.Context, duration time.Duration) { - select { - case <-ctx.Done(): - case <-time.After(duration): - } -} - -type LimitedHTTPClient struct { - http.Client - sem *semaphore.Weighted - backendName string -} - -func (c *LimitedHTTPClient) DoLimited(req *http.Request) (*http.Response, error) { - if err := c.sem.Acquire(req.Context(), 1); err != nil { - tooManyRequestErrorsTotal.WithLabelValues(c.backendName).Inc() - return nil, wrapErr(err, "too many requests") - } - defer c.sem.Release(1) - return c.Do(req) -} - -func RecordBatchRPCError(ctx context.Context, backendName string, reqs []*RPCReq, err error) { - for _, req := range reqs { - RecordRPCError(ctx, backendName, req.Method, err) - } -} - -func MaybeRecordErrorsInRPCRes(ctx context.Context, backendName string, reqs []*RPCReq, resBatch []*RPCRes) { - log.Info("forwarded RPC request", - "backend", backendName, - "auth", GetAuthCtx(ctx), - "req_id", GetReqID(ctx), - "batch_size", len(reqs), - ) - - var lastError *RPCErr - for i, res := range resBatch { - if res.IsError() { - lastError = res.Error - RecordRPCError(ctx, backendName, reqs[i].Method, res.Error) - } - } - - if lastError != nil { - log.Info( - "backend responded with RPC error", - "backend", backendName, - "last_error_code", lastError.Code, - "last_error_msg", lastError.Message, - "req_id", GetReqID(ctx), - "source", "rpc", - "auth", GetAuthCtx(ctx), - ) - } -} - -func RecordBatchRPCForward(ctx context.Context, backendName string, reqs []*RPCReq, source string) { - for _, req := range reqs { - RecordRPCForward(ctx, backendName, req.Method, source) - } -} - -func stripXFF(xff string) string { - ipList := strings.Split(xff, ",") - return strings.TrimSpace(ipList[0]) -} diff --git a/proxyd/backend_test.go b/proxyd/backend_test.go deleted file mode 100644 index 7be23bfed7bc..000000000000 --- a/proxyd/backend_test.go +++ /dev/null @@ -1,21 +0,0 @@ -package proxyd - -import ( - "github.com/stretchr/testify/assert" - "testing" -) - -func TestStripXFF(t *testing.T) { - tests := []struct { - in, out string - }{ - {"1.2.3, 4.5.6, 7.8.9", "1.2.3"}, - {"1.2.3,4.5.6", "1.2.3"}, - {" 1.2.3 , 4.5.6 ", "1.2.3"}, - } - - for _, test := range tests { - actual := stripXFF(test.in) - assert.Equal(t, test.out, actual) - } -} diff --git a/proxyd/cache.go b/proxyd/cache.go deleted file mode 100644 index 5add4f23627e..000000000000 --- a/proxyd/cache.go +++ /dev/null @@ -1,192 +0,0 @@ -package proxyd - -import ( - "context" - "encoding/json" - "strings" - "time" - - "github.com/ethereum/go-ethereum/rpc" - "github.com/redis/go-redis/v9" - - "github.com/golang/snappy" - lru "github.com/hashicorp/golang-lru" -) - -type Cache interface { - Get(ctx context.Context, key string) (string, error) - Put(ctx context.Context, key string, value string) error -} - -const ( - // assuming an average RPCRes size of 3 KB - memoryCacheLimit = 4096 -) - -type cache struct { - lru *lru.Cache -} - -func newMemoryCache() *cache { - rep, _ := lru.New(memoryCacheLimit) - return &cache{rep} -} - -func (c *cache) Get(ctx context.Context, key string) (string, error) { - if val, ok := c.lru.Get(key); ok { - return val.(string), nil - } - return "", nil -} - -func (c *cache) Put(ctx context.Context, key string, value string) error { - c.lru.Add(key, value) - return nil -} - -type redisCache struct { - rdb *redis.Client - prefix string - ttl time.Duration -} - -func newRedisCache(rdb *redis.Client, prefix string, ttl time.Duration) *redisCache { - return &redisCache{rdb, prefix, ttl} -} - -func (c *redisCache) namespaced(key string) string { - if c.prefix == "" { - return key - } - return strings.Join([]string{c.prefix, key}, ":") -} - -func (c *redisCache) Get(ctx context.Context, key string) (string, error) { - start := time.Now() - val, err := c.rdb.Get(ctx, c.namespaced(key)).Result() - redisCacheDurationSumm.WithLabelValues("GET").Observe(float64(time.Since(start).Milliseconds())) - - if err == redis.Nil { - return "", nil - } else if err != nil { - RecordRedisError("CacheGet") - return "", err - } - return val, nil -} - -func (c *redisCache) Put(ctx context.Context, key string, value string) error { - start := time.Now() - err := c.rdb.SetEx(ctx, c.namespaced(key), value, c.ttl).Err() - redisCacheDurationSumm.WithLabelValues("SETEX").Observe(float64(time.Since(start).Milliseconds())) - - if err != nil { - RecordRedisError("CacheSet") - } - return err -} - -type cacheWithCompression struct { - cache Cache -} - -func newCacheWithCompression(cache Cache) *cacheWithCompression { - return &cacheWithCompression{cache} -} - -func (c *cacheWithCompression) Get(ctx context.Context, key string) (string, error) { - encodedVal, err := c.cache.Get(ctx, key) - if err != nil { - return "", err - } - if encodedVal == "" { - return "", nil - } - val, err := snappy.Decode(nil, []byte(encodedVal)) - if err != nil { - return "", err - } - return string(val), nil -} - -func (c *cacheWithCompression) Put(ctx context.Context, key string, value string) error { - encodedVal := snappy.Encode(nil, []byte(value)) - return c.cache.Put(ctx, key, string(encodedVal)) -} - -type RPCCache interface { - GetRPC(ctx context.Context, req *RPCReq) (*RPCRes, error) - PutRPC(ctx context.Context, req *RPCReq, res *RPCRes) error -} - -type rpcCache struct { - cache Cache - handlers map[string]RPCMethodHandler -} - -func newRPCCache(cache Cache) RPCCache { - staticHandler := &StaticMethodHandler{cache: cache} - debugGetRawReceiptsHandler := &StaticMethodHandler{cache: cache, - filterGet: func(req *RPCReq) bool { - // cache only if the request is for a block hash - - var p []rpc.BlockNumberOrHash - err := json.Unmarshal(req.Params, &p) - if err != nil { - return false - } - if len(p) != 1 { - return false - } - return p[0].BlockHash != nil - }, - filterPut: func(req *RPCReq, res *RPCRes) bool { - // don't cache if response contains 0 receipts - rawReceipts, ok := res.Result.([]interface{}) - if !ok { - return false - } - return len(rawReceipts) > 0 - }, - } - handlers := map[string]RPCMethodHandler{ - "eth_chainId": staticHandler, - "net_version": staticHandler, - "eth_getBlockTransactionCountByHash": staticHandler, - "eth_getUncleCountByBlockHash": staticHandler, - "eth_getBlockByHash": staticHandler, - "eth_getTransactionByBlockHashAndIndex": staticHandler, - "eth_getUncleByBlockHashAndIndex": staticHandler, - "debug_getRawReceipts": debugGetRawReceiptsHandler, - } - return &rpcCache{ - cache: cache, - handlers: handlers, - } -} - -func (c *rpcCache) GetRPC(ctx context.Context, req *RPCReq) (*RPCRes, error) { - handler := c.handlers[req.Method] - if handler == nil { - return nil, nil - } - res, err := handler.GetRPCMethod(ctx, req) - if err != nil { - RecordCacheError(req.Method) - return nil, err - } - if res == nil { - RecordCacheMiss(req.Method) - } else { - RecordCacheHit(req.Method) - } - return res, nil -} - -func (c *rpcCache) PutRPC(ctx context.Context, req *RPCReq, res *RPCRes) error { - handler := c.handlers[req.Method] - if handler == nil { - return nil - } - return handler.PutRPCMethod(ctx, req, res) -} diff --git a/proxyd/cache_test.go b/proxyd/cache_test.go deleted file mode 100644 index 1a5d543227ae..000000000000 --- a/proxyd/cache_test.go +++ /dev/null @@ -1,213 +0,0 @@ -package proxyd - -import ( - "context" - "strconv" - "testing" - - "github.com/stretchr/testify/require" -) - -func TestRPCCacheImmutableRPCs(t *testing.T) { - ctx := context.Background() - - cache := newRPCCache(newMemoryCache()) - ID := []byte(strconv.Itoa(1)) - - rpcs := []struct { - req *RPCReq - res *RPCRes - name string - }{ - { - req: &RPCReq{ - JSONRPC: "2.0", - Method: "eth_chainId", - ID: ID, - }, - res: &RPCRes{ - JSONRPC: "2.0", - Result: "0xff", - ID: ID, - }, - name: "eth_chainId", - }, - { - req: &RPCReq{ - JSONRPC: "2.0", - Method: "net_version", - ID: ID, - }, - res: &RPCRes{ - JSONRPC: "2.0", - Result: "9999", - ID: ID, - }, - name: "net_version", - }, - { - req: &RPCReq{ - JSONRPC: "2.0", - Method: "eth_getBlockTransactionCountByHash", - Params: mustMarshalJSON([]string{"0xb903239f8543d04b5dc1ba6579132b143087c68db1b2168786408fcbce568238"}), - ID: ID, - }, - res: &RPCRes{ - JSONRPC: "2.0", - Result: `{"eth_getBlockTransactionCountByHash":"!"}`, - ID: ID, - }, - name: "eth_getBlockTransactionCountByHash", - }, - { - req: &RPCReq{ - JSONRPC: "2.0", - Method: "eth_getUncleCountByBlockHash", - Params: mustMarshalJSON([]string{"0xb903239f8543d04b5dc1ba6579132b143087c68db1b2168786408fcbce568238"}), - ID: ID, - }, - res: &RPCRes{ - JSONRPC: "2.0", - Result: `{"eth_getUncleCountByBlockHash":"!"}`, - ID: ID, - }, - name: "eth_getUncleCountByBlockHash", - }, - { - req: &RPCReq{ - JSONRPC: "2.0", - Method: "eth_getBlockByHash", - Params: mustMarshalJSON([]string{"0xc6ef2fc5426d6ad6fd9e2a26abeab0aa2411b7ab17f30a99d3cb96aed1d1055b", "false"}), - ID: ID, - }, - res: &RPCRes{ - JSONRPC: "2.0", - Result: `{"eth_getBlockByHash":"!"}`, - ID: ID, - }, - name: "eth_getBlockByHash", - }, - { - req: &RPCReq{ - JSONRPC: "2.0", - Method: "eth_getUncleByBlockHashAndIndex", - Params: mustMarshalJSON([]string{"0xb903239f8543d04b5dc1ba6579132b143087c68db1b2168786408fcbce568238", "0x90"}), - ID: ID, - }, - res: &RPCRes{ - JSONRPC: "2.0", - Result: `{"eth_getUncleByBlockHashAndIndex":"!"}`, - ID: ID, - }, - name: "eth_getUncleByBlockHashAndIndex", - }, - { - req: &RPCReq{ - JSONRPC: "2.0", - Method: "debug_getRawReceipts", - Params: mustMarshalJSON([]string{"0xc6ef2fc5426d6ad6fd9e2a26abeab0aa2411b7ab17f30a99d3cb96aed1d1055b"}), - ID: ID, - }, - res: &RPCRes{ - JSONRPC: "2.0", - Result: []interface{}{"a"}, - ID: ID, - }, - name: "debug_getRawReceipts", - }, - } - - for _, rpc := range rpcs { - t.Run(rpc.name, func(t *testing.T) { - err := cache.PutRPC(ctx, rpc.req, rpc.res) - require.NoError(t, err) - - cachedRes, err := cache.GetRPC(ctx, rpc.req) - require.NoError(t, err) - require.Equal(t, rpc.res, cachedRes) - }) - } -} - -func TestRPCCacheUnsupportedMethod(t *testing.T) { - ctx := context.Background() - - cache := newRPCCache(newMemoryCache()) - ID := []byte(strconv.Itoa(1)) - - rpcs := []struct { - req *RPCReq - name string - }{ - { - name: "eth_syncing", - req: &RPCReq{ - JSONRPC: "2.0", - Method: "eth_syncing", - ID: ID, - }, - }, - { - name: "eth_blockNumber", - req: &RPCReq{ - JSONRPC: "2.0", - Method: "eth_blockNumber", - ID: ID, - }, - }, - { - name: "eth_getBlockByNumber", - req: &RPCReq{ - JSONRPC: "2.0", - Method: "eth_getBlockByNumber", - ID: ID, - }, - }, - { - name: "eth_getBlockRange", - req: &RPCReq{ - JSONRPC: "2.0", - Method: "eth_getBlockRange", - ID: ID, - }, - }, - { - name: "eth_gasPrice", - req: &RPCReq{ - JSONRPC: "2.0", - Method: "eth_gasPrice", - ID: ID, - }, - }, - { - name: "eth_call", - req: &RPCReq{ - JSONRPC: "2.0", - Method: "eth_call", - ID: ID, - }, - }, - { - req: &RPCReq{ - JSONRPC: "2.0", - Method: "debug_getRawReceipts", - Params: mustMarshalJSON([]string{"0x100"}), - ID: ID, - }, - name: "debug_getRawReceipts", - }, - } - - for _, rpc := range rpcs { - t.Run(rpc.name, func(t *testing.T) { - fakeval := mustMarshalJSON([]string{rpc.name}) - err := cache.PutRPC(ctx, rpc.req, &RPCRes{Result: fakeval}) - require.NoError(t, err) - - cachedRes, err := cache.GetRPC(ctx, rpc.req) - require.NoError(t, err) - require.Nil(t, cachedRes) - }) - } - -} diff --git a/proxyd/cmd/proxyd/main.go b/proxyd/cmd/proxyd/main.go deleted file mode 100644 index 3daa80b38710..000000000000 --- a/proxyd/cmd/proxyd/main.go +++ /dev/null @@ -1,121 +0,0 @@ -package main - -import ( - "fmt" - "net" - "net/http" - "net/http/pprof" - "os" - "os/signal" - "strconv" - "strings" - "syscall" - - "github.com/BurntSushi/toml" - "golang.org/x/exp/slog" - - "github.com/ethereum/go-ethereum/log" - - "github.com/ethereum-optimism/optimism/proxyd" -) - -var ( - GitVersion = "" - GitCommit = "" - GitDate = "" -) - -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. - proxyd.SetLogLevel(slog.LevelInfo) - - log.Info("starting proxyd", "version", GitVersion, "commit", GitCommit, "date", GitDate) - - if len(os.Args) < 2 { - log.Crit("must specify a config file on the command line") - } - - config := new(proxyd.Config) - if _, err := toml.DecodeFile(os.Args[1], config); err != nil { - log.Crit("error reading config file", "err", err) - } - - // update log level from config - logLevel, err := LevelFromString(config.Server.LogLevel) - if err != nil { - logLevel = log.LevelInfo - if config.Server.LogLevel != "" { - log.Warn("invalid server.log_level set: " + config.Server.LogLevel) - } - } - proxyd.SetLogLevel(logLevel) - - if config.Server.EnablePprof { - log.Info("starting pprof", "addr", "0.0.0.0", "port", "6060") - pprofSrv := StartPProf("0.0.0.0", 6060) - log.Info("started pprof server", "addr", pprofSrv.Addr) - defer func() { - if err := pprofSrv.Close(); err != nil { - log.Error("failed to stop pprof server", "err", err) - } - }() - } - - _, shutdown, err := proxyd.Start(config) - if err != nil { - log.Crit("error starting proxyd", "err", err) - } - - sig := make(chan os.Signal, 1) - signal.Notify(sig, syscall.SIGINT, syscall.SIGTERM) - recvSig := <-sig - log.Info("caught signal, shutting down", "signal", recvSig) - shutdown() -} - -// LevelFromString returns the appropriate Level from a string name. -// Useful for parsing command line args and configuration files. -// It also converts strings to lowercase. -// Note: copied from op-service/log to avoid monorepo dependency -func LevelFromString(lvlString string) (slog.Level, error) { - lvlString = strings.ToLower(lvlString) // ignore case - switch lvlString { - case "trace", "trce": - return log.LevelTrace, nil - case "debug", "dbug": - return log.LevelDebug, nil - case "info": - return log.LevelInfo, nil - case "warn": - return log.LevelWarn, nil - case "error", "eror": - return log.LevelError, nil - case "crit": - return log.LevelCrit, nil - default: - return log.LevelDebug, fmt.Errorf("unknown level: %v", lvlString) - } -} - -func StartPProf(hostname string, port int) *http.Server { - mux := http.NewServeMux() - - // have to do below to support multiple servers, since the - // pprof import only uses DefaultServeMux - mux.Handle("/debug/pprof/", http.HandlerFunc(pprof.Index)) - mux.Handle("/debug/pprof/cmdline", http.HandlerFunc(pprof.Cmdline)) - mux.Handle("/debug/pprof/profile", http.HandlerFunc(pprof.Profile)) - mux.Handle("/debug/pprof/symbol", http.HandlerFunc(pprof.Symbol)) - mux.Handle("/debug/pprof/trace", http.HandlerFunc(pprof.Trace)) - - addr := net.JoinHostPort(hostname, strconv.Itoa(port)) - srv := &http.Server{ - Handler: mux, - Addr: addr, - } - - go srv.ListenAndServe() - - return srv -} diff --git a/proxyd/config.go b/proxyd/config.go deleted file mode 100644 index 4eed3302162e..000000000000 --- a/proxyd/config.go +++ /dev/null @@ -1,182 +0,0 @@ -package proxyd - -import ( - "fmt" - "math/big" - "os" - "strings" - "time" -) - -type ServerConfig struct { - RPCHost string `toml:"rpc_host"` - RPCPort int `toml:"rpc_port"` - WSHost string `toml:"ws_host"` - WSPort int `toml:"ws_port"` - MaxBodySizeBytes int64 `toml:"max_body_size_bytes"` - MaxConcurrentRPCs int64 `toml:"max_concurrent_rpcs"` - LogLevel string `toml:"log_level"` - - // TimeoutSeconds specifies the maximum time spent serving an HTTP request. Note that isn't used for websocket connections - TimeoutSeconds int `toml:"timeout_seconds"` - - MaxUpstreamBatchSize int `toml:"max_upstream_batch_size"` - - EnableRequestLog bool `toml:"enable_request_log"` - 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 { - Enabled bool `toml:"enabled"` - TTL TOMLDuration `toml:"ttl"` -} - -type RedisConfig struct { - URL string `toml:"url"` - Namespace string `toml:"namespace"` -} - -type MetricsConfig struct { - Enabled bool `toml:"enabled"` - Host string `toml:"host"` - Port int `toml:"port"` -} - -type RateLimitConfig struct { - UseRedis bool `toml:"use_redis"` - BaseRate int `toml:"base_rate"` - BaseInterval TOMLDuration `toml:"base_interval"` - ExemptOrigins []string `toml:"exempt_origins"` - ExemptUserAgents []string `toml:"exempt_user_agents"` - ErrorMessage string `toml:"error_message"` - MethodOverrides map[string]*RateLimitMethodOverride `toml:"method_overrides"` - IPHeaderOverride string `toml:"ip_header_override"` -} - -type RateLimitMethodOverride struct { - Limit int `toml:"limit"` - Interval TOMLDuration `toml:"interval"` - Global bool `toml:"global"` -} - -type TOMLDuration time.Duration - -func (t *TOMLDuration) UnmarshalText(b []byte) error { - d, err := time.ParseDuration(string(b)) - if err != nil { - return err - } - - *t = TOMLDuration(d) - return nil -} - -type BackendOptions struct { - ResponseTimeoutSeconds int `toml:"response_timeout_seconds"` - MaxResponseSizeBytes int64 `toml:"max_response_size_bytes"` - MaxRetries int `toml:"max_retries"` - OutOfServiceSeconds int `toml:"out_of_service_seconds"` - MaxDegradedLatencyThreshold TOMLDuration `toml:"max_degraded_latency_threshold"` - MaxLatencyThreshold TOMLDuration `toml:"max_latency_threshold"` - MaxErrorRateThreshold float64 `toml:"max_error_rate_threshold"` -} - -type BackendConfig struct { - Username string `toml:"username"` - Password string `toml:"password"` - RPCURL string `toml:"rpc_url"` - WSURL string `toml:"ws_url"` - WSPort int `toml:"ws_port"` - MaxRPS int `toml:"max_rps"` - MaxWSConns int `toml:"max_ws_conns"` - CAFile string `toml:"ca_file"` - ClientCertFile string `toml:"client_cert_file"` - ClientKeyFile string `toml:"client_key_file"` - StripTrailingXFF bool `toml:"strip_trailing_xff"` - Headers map[string]string `toml:"headers"` - - Weight int `toml:"weight"` - - ConsensusSkipPeerCountCheck bool `toml:"consensus_skip_peer_count"` - ConsensusForcedCandidate bool `toml:"consensus_forced_candidate"` - ConsensusReceiptsTarget string `toml:"consensus_receipts_target"` -} - -type BackendsConfig map[string]*BackendConfig - -type BackendGroupConfig struct { - Backends []string `toml:"backends"` - - WeightedRouting bool `toml:"weighted_routing"` - - 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"` - ConsensusMaxBlockLag uint64 `toml:"consensus_max_block_lag"` - ConsensusMaxBlockRange uint64 `toml:"consensus_max_block_range"` - ConsensusMinPeerCount int `toml:"consensus_min_peer_count"` - - 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 - -type MethodMappingsConfig map[string]string - -type BatchConfig struct { - MaxSize int `toml:"max_size"` - ErrorMessage string `toml:"error_message"` -} - -// SenderRateLimitConfig configures the sender-based rate limiter -// for eth_sendRawTransaction requests. -// To enable pre-eip155 transactions, add '0' to allowed_chain_ids. -type SenderRateLimitConfig struct { - Enabled bool - Interval TOMLDuration - Limit int - AllowedChainIds []*big.Int `toml:"allowed_chain_ids"` -} - -type Config struct { - WSBackendGroup string `toml:"ws_backend_group"` - Server ServerConfig `toml:"server"` - Cache CacheConfig `toml:"cache"` - Redis RedisConfig `toml:"redis"` - Metrics MetricsConfig `toml:"metrics"` - RateLimit RateLimitConfig `toml:"rate_limit"` - BackendOptions BackendOptions `toml:"backend"` - Backends BackendsConfig `toml:"backends"` - BatchConfig BatchConfig `toml:"batch"` - Authentication map[string]string `toml:"authentication"` - BackendGroups BackendGroupsConfig `toml:"backend_groups"` - RPCMethodMappings map[string]string `toml:"rpc_method_mappings"` - WSMethodWhitelist []string `toml:"ws_method_whitelist"` - WhitelistErrorMessage string `toml:"whitelist_error_message"` - SenderRateLimit SenderRateLimitConfig `toml:"sender_rate_limit"` -} - -func ReadFromEnvOrConfig(value string) (string, error) { - if strings.HasPrefix(value, "$") { - envValue := os.Getenv(strings.TrimPrefix(value, "$")) - if envValue == "" { - return "", fmt.Errorf("config env var %s not found", value) - } - return envValue, nil - } - - if strings.HasPrefix(value, "\\") { - return strings.TrimPrefix(value, "\\"), nil - } - - return value, nil -} diff --git a/proxyd/consensus_poller.go b/proxyd/consensus_poller.go deleted file mode 100644 index 79f27b5b586e..000000000000 --- a/proxyd/consensus_poller.go +++ /dev/null @@ -1,691 +0,0 @@ -package proxyd - -import ( - "context" - "fmt" - "strconv" - "strings" - "sync" - "time" - - "github.com/ethereum/go-ethereum/common/hexutil" - - "github.com/ethereum/go-ethereum/log" -) - -const ( - DefaultPollerInterval = 1 * time.Second -) - -type OnConsensusBroken func() - -// ConsensusPoller checks the consensus state for each member of a BackendGroup -// resolves the highest common block for multiple nodes, and reconciles the consensus -// in case of block hash divergence to minimize re-orgs -type ConsensusPoller struct { - ctx context.Context - cancelFunc context.CancelFunc - listeners []OnConsensusBroken - - backendGroup *BackendGroup - backendState map[*Backend]*backendState - consensusGroupMux sync.Mutex - consensusGroup []*Backend - - tracker ConsensusTracker - asyncHandler ConsensusAsyncHandler - - minPeerCount uint64 - banPeriod time.Duration - maxUpdateThreshold time.Duration - maxBlockLag uint64 - maxBlockRange uint64 - interval time.Duration -} - -type backendState struct { - backendStateMux sync.Mutex - - latestBlockNumber hexutil.Uint64 - latestBlockHash string - safeBlockNumber hexutil.Uint64 - finalizedBlockNumber hexutil.Uint64 - - peerCount uint64 - inSync bool - - lastUpdate time.Time - - bannedUntil time.Time -} - -func (bs *backendState) IsBanned() bool { - return time.Now().Before(bs.bannedUntil) -} - -// GetConsensusGroup returns the backend members that are agreeing in a consensus -func (cp *ConsensusPoller) GetConsensusGroup() []*Backend { - defer cp.consensusGroupMux.Unlock() - cp.consensusGroupMux.Lock() - - g := make([]*Backend, len(cp.consensusGroup)) - copy(g, cp.consensusGroup) - - return g -} - -// GetLatestBlockNumber returns the `latest` agreed block number in a consensus -func (ct *ConsensusPoller) GetLatestBlockNumber() hexutil.Uint64 { - return ct.tracker.GetLatestBlockNumber() -} - -// GetSafeBlockNumber returns the `safe` agreed block number in a consensus -func (ct *ConsensusPoller) GetSafeBlockNumber() hexutil.Uint64 { - return ct.tracker.GetSafeBlockNumber() -} - -// GetFinalizedBlockNumber returns the `finalized` agreed block number in a consensus -func (ct *ConsensusPoller) GetFinalizedBlockNumber() hexutil.Uint64 { - return ct.tracker.GetFinalizedBlockNumber() -} - -func (cp *ConsensusPoller) Shutdown() { - cp.asyncHandler.Shutdown() -} - -// ConsensusAsyncHandler controls the asynchronous polling mechanism, interval and shutdown -type ConsensusAsyncHandler interface { - Init() - Shutdown() -} - -// NoopAsyncHandler allows fine control updating the consensus -type NoopAsyncHandler struct{} - -func NewNoopAsyncHandler() ConsensusAsyncHandler { - log.Warn("using NewNoopAsyncHandler") - return &NoopAsyncHandler{} -} -func (ah *NoopAsyncHandler) Init() {} -func (ah *NoopAsyncHandler) Shutdown() {} - -// PollerAsyncHandler asynchronously updates each individual backend and the group consensus -type PollerAsyncHandler struct { - ctx context.Context - cp *ConsensusPoller -} - -func NewPollerAsyncHandler(ctx context.Context, cp *ConsensusPoller) ConsensusAsyncHandler { - return &PollerAsyncHandler{ - ctx: ctx, - cp: cp, - } -} -func (ah *PollerAsyncHandler) Init() { - // create the individual backend pollers - for _, be := range ah.cp.backendGroup.Backends { - go func(be *Backend) { - for { - timer := time.NewTimer(ah.cp.interval) - ah.cp.UpdateBackend(ah.ctx, be) - - select { - case <-timer.C: - case <-ah.ctx.Done(): - timer.Stop() - return - } - } - }(be) - } - - // create the group consensus poller - go func() { - for { - timer := time.NewTimer(ah.cp.interval) - ah.cp.UpdateBackendGroupConsensus(ah.ctx) - - select { - case <-timer.C: - case <-ah.ctx.Done(): - timer.Stop() - return - } - } - }() -} -func (ah *PollerAsyncHandler) Shutdown() { - ah.cp.cancelFunc() -} - -type ConsensusOpt func(cp *ConsensusPoller) - -func WithTracker(tracker ConsensusTracker) ConsensusOpt { - return func(cp *ConsensusPoller) { - cp.tracker = tracker - } -} - -func WithAsyncHandler(asyncHandler ConsensusAsyncHandler) ConsensusOpt { - return func(cp *ConsensusPoller) { - cp.asyncHandler = asyncHandler - } -} - -func WithListener(listener OnConsensusBroken) ConsensusOpt { - return func(cp *ConsensusPoller) { - cp.AddListener(listener) - } -} - -func (cp *ConsensusPoller) AddListener(listener OnConsensusBroken) { - cp.listeners = append(cp.listeners, listener) -} - -func (cp *ConsensusPoller) ClearListeners() { - cp.listeners = []OnConsensusBroken{} -} - -func WithBanPeriod(banPeriod time.Duration) ConsensusOpt { - return func(cp *ConsensusPoller) { - cp.banPeriod = banPeriod - } -} - -func WithMaxUpdateThreshold(maxUpdateThreshold time.Duration) ConsensusOpt { - return func(cp *ConsensusPoller) { - cp.maxUpdateThreshold = maxUpdateThreshold - } -} - -func WithMaxBlockLag(maxBlockLag uint64) ConsensusOpt { - return func(cp *ConsensusPoller) { - cp.maxBlockLag = maxBlockLag - } -} - -func WithMaxBlockRange(maxBlockRange uint64) ConsensusOpt { - return func(cp *ConsensusPoller) { - cp.maxBlockRange = maxBlockRange - } -} - -func WithMinPeerCount(minPeerCount uint64) ConsensusOpt { - return func(cp *ConsensusPoller) { - cp.minPeerCount = minPeerCount - } -} - -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()) - - state := make(map[*Backend]*backendState, len(bg.Backends)) - - cp := &ConsensusPoller{ - ctx: ctx, - cancelFunc: cancelFunc, - backendGroup: bg, - backendState: state, - - banPeriod: 5 * time.Minute, - maxUpdateThreshold: 30 * time.Second, - maxBlockLag: 8, // 8*12 seconds = 96 seconds ~ 1.6 minutes - minPeerCount: 3, - interval: DefaultPollerInterval, - } - - for _, opt := range opts { - opt(cp) - } - - if cp.tracker == nil { - cp.tracker = NewInMemoryConsensusTracker() - } - - if cp.asyncHandler == nil { - cp.asyncHandler = NewPollerAsyncHandler(ctx, cp) - } - - cp.Reset() - cp.asyncHandler.Init() - - return cp -} - -// UpdateBackend refreshes the consensus state of a single backend -func (cp *ConsensusPoller) UpdateBackend(ctx context.Context, be *Backend) { - bs := cp.getBackendState(be) - RecordConsensusBackendBanned(be, bs.IsBanned()) - - if bs.IsBanned() { - log.Debug("skipping backend - banned", "backend", be.Name) - return - } - - // if backend is not healthy state we'll only resume checking it after ban - if !be.IsHealthy() && !be.forcedCandidate { - log.Warn("backend banned - not healthy", "backend", be.Name) - cp.Ban(be) - return - } - - inSync, err := cp.isInSync(ctx, be) - RecordConsensusBackendInSync(be, err == nil && inSync) - if err != nil { - log.Warn("error updating backend sync state", "name", be.Name, "err", err) - } - - var peerCount uint64 - if !be.skipPeerCountCheck { - peerCount, err = cp.getPeerCount(ctx, be) - if err != nil { - log.Warn("error updating backend peer count", "name", be.Name, "err", err) - } - RecordConsensusBackendPeerCount(be, peerCount) - } - - latestBlockNumber, latestBlockHash, err := cp.fetchBlock(ctx, be, "latest") - if err != nil { - log.Warn("error updating backend - latest block", "name", be.Name, "err", err) - } - - safeBlockNumber, _, err := cp.fetchBlock(ctx, be, "safe") - if err != nil { - log.Warn("error updating backend - safe block", "name", be.Name, "err", err) - } - - finalizedBlockNumber, _, err := cp.fetchBlock(ctx, be, "finalized") - if err != nil { - log.Warn("error updating backend - finalized block", "name", be.Name, "err", err) - } - - RecordConsensusBackendUpdateDelay(be, bs.lastUpdate) - - changed := cp.setBackendState(be, peerCount, inSync, - latestBlockNumber, latestBlockHash, - safeBlockNumber, finalizedBlockNumber) - - RecordBackendLatestBlock(be, latestBlockNumber) - RecordBackendSafeBlock(be, safeBlockNumber) - RecordBackendFinalizedBlock(be, finalizedBlockNumber) - - if changed { - log.Debug("backend state updated", - "name", be.Name, - "peerCount", peerCount, - "inSync", inSync, - "latestBlockNumber", latestBlockNumber, - "latestBlockHash", latestBlockHash, - "safeBlockNumber", safeBlockNumber, - "finalizedBlockNumber", finalizedBlockNumber, - "lastUpdate", bs.lastUpdate) - } - - // sanity check for latest, safe and finalized block tags - expectedBlockTags := cp.checkExpectedBlockTags( - latestBlockNumber, - bs.safeBlockNumber, safeBlockNumber, - bs.finalizedBlockNumber, finalizedBlockNumber) - - RecordBackendUnexpectedBlockTags(be, !expectedBlockTags) - - if !expectedBlockTags && !be.forcedCandidate { - log.Warn("backend banned - unexpected block tags", - "backend", be.Name, - "oldFinalized", bs.finalizedBlockNumber, - "finalizedBlockNumber", finalizedBlockNumber, - "oldSafe", bs.safeBlockNumber, - "safeBlockNumber", safeBlockNumber, - "latestBlockNumber", latestBlockNumber, - ) - cp.Ban(be) - } -} - -// checkExpectedBlockTags for unexpected conditions on block tags -// - finalized block number should never decrease -// - safe block number should never decrease -// - finalized block should be <= safe block <= latest block -func (cp *ConsensusPoller) checkExpectedBlockTags( - currentLatest hexutil.Uint64, - oldSafe hexutil.Uint64, currentSafe hexutil.Uint64, - oldFinalized hexutil.Uint64, currentFinalized hexutil.Uint64) bool { - return currentFinalized >= oldFinalized && - currentSafe >= oldSafe && - currentFinalized <= currentSafe && - currentSafe <= currentLatest -} - -// UpdateBackendGroupConsensus resolves the current group consensus based on the state of the backends -func (cp *ConsensusPoller) UpdateBackendGroupConsensus(ctx context.Context) { - // get the latest block number from the tracker - currentConsensusBlockNumber := cp.GetLatestBlockNumber() - - // get the candidates for the consensus group - candidates := cp.getConsensusCandidates() - - // update the lowest latest block number and hash - // the lowest safe block number - // the lowest finalized block number - var lowestLatestBlock hexutil.Uint64 - var lowestLatestBlockHash string - var lowestFinalizedBlock hexutil.Uint64 - var lowestSafeBlock hexutil.Uint64 - for _, bs := range candidates { - if lowestLatestBlock == 0 || bs.latestBlockNumber < lowestLatestBlock { - lowestLatestBlock = bs.latestBlockNumber - lowestLatestBlockHash = bs.latestBlockHash - } - if lowestFinalizedBlock == 0 || bs.finalizedBlockNumber < lowestFinalizedBlock { - lowestFinalizedBlock = bs.finalizedBlockNumber - } - if lowestSafeBlock == 0 || bs.safeBlockNumber < lowestSafeBlock { - lowestSafeBlock = bs.safeBlockNumber - } - } - - // find the proposed block among the candidates - // the proposed block needs have the same hash in the entire consensus group - proposedBlock := lowestLatestBlock - proposedBlockHash := lowestLatestBlockHash - hasConsensus := false - broken := false - - if lowestLatestBlock > currentConsensusBlockNumber { - log.Debug("validating consensus on block", "lowestLatestBlock", lowestLatestBlock) - } - - // if there is a block to propose, check if it is the same in all backends - if proposedBlock > 0 { - for !hasConsensus { - allAgreed := true - for be := range candidates { - actualBlockNumber, actualBlockHash, err := cp.fetchBlock(ctx, be, proposedBlock.String()) - if err != nil { - log.Warn("error updating backend", "name", be.Name, "err", err) - continue - } - if proposedBlockHash == "" { - proposedBlockHash = actualBlockHash - } - blocksDontMatch := (actualBlockNumber != proposedBlock) || (actualBlockHash != proposedBlockHash) - if blocksDontMatch { - if currentConsensusBlockNumber >= actualBlockNumber { - log.Warn("backend broke consensus", - "name", be.Name, - "actualBlockNumber", actualBlockNumber, - "actualBlockHash", actualBlockHash, - "proposedBlock", proposedBlock, - "proposedBlockHash", proposedBlockHash) - broken = true - } - allAgreed = false - break - } - } - if allAgreed { - hasConsensus = true - } else { - // walk one block behind and try again - proposedBlock -= 1 - proposedBlockHash = "" - log.Debug("no consensus, now trying", "block:", proposedBlock) - } - } - } - - if broken { - // propagate event to other interested parts, such as cache invalidator - for _, l := range cp.listeners { - l() - } - log.Info("consensus broken", - "currentConsensusBlockNumber", currentConsensusBlockNumber, - "proposedBlock", proposedBlock, - "proposedBlockHash", proposedBlockHash) - } - - // update tracker - cp.tracker.SetLatestBlockNumber(proposedBlock) - cp.tracker.SetSafeBlockNumber(lowestSafeBlock) - cp.tracker.SetFinalizedBlockNumber(lowestFinalizedBlock) - - // update consensus group - group := make([]*Backend, 0, len(candidates)) - consensusBackendsNames := make([]string, 0, len(candidates)) - filteredBackendsNames := make([]string, 0, len(cp.backendGroup.Backends)) - for _, be := range cp.backendGroup.Backends { - _, exist := candidates[be] - if exist { - group = append(group, be) - consensusBackendsNames = append(consensusBackendsNames, be.Name) - } else { - filteredBackendsNames = append(filteredBackendsNames, be.Name) - } - } - - cp.consensusGroupMux.Lock() - cp.consensusGroup = group - cp.consensusGroupMux.Unlock() - - RecordGroupConsensusLatestBlock(cp.backendGroup, proposedBlock) - RecordGroupConsensusSafeBlock(cp.backendGroup, lowestSafeBlock) - RecordGroupConsensusFinalizedBlock(cp.backendGroup, lowestFinalizedBlock) - - RecordGroupConsensusCount(cp.backendGroup, len(group)) - RecordGroupConsensusFilteredCount(cp.backendGroup, len(filteredBackendsNames)) - RecordGroupTotalCount(cp.backendGroup, len(cp.backendGroup.Backends)) - - log.Debug("group state", - "proposedBlock", proposedBlock, - "consensusBackends", strings.Join(consensusBackendsNames, ", "), - "filteredBackends", strings.Join(filteredBackendsNames, ", ")) -} - -// IsBanned checks if a specific backend is banned -func (cp *ConsensusPoller) IsBanned(be *Backend) bool { - bs := cp.backendState[be] - defer bs.backendStateMux.Unlock() - bs.backendStateMux.Lock() - return bs.IsBanned() -} - -// Ban bans a specific backend -func (cp *ConsensusPoller) Ban(be *Backend) { - if be.forcedCandidate { - return - } - - bs := cp.backendState[be] - defer bs.backendStateMux.Unlock() - bs.backendStateMux.Lock() - bs.bannedUntil = time.Now().Add(cp.banPeriod) - - // when we ban a node, we give it the chance to start from any block when it is back - bs.latestBlockNumber = 0 - bs.safeBlockNumber = 0 - bs.finalizedBlockNumber = 0 -} - -// Unban removes any bans from the backends -func (cp *ConsensusPoller) Unban(be *Backend) { - bs := cp.backendState[be] - defer bs.backendStateMux.Unlock() - bs.backendStateMux.Lock() - bs.bannedUntil = time.Now().Add(-10 * time.Hour) -} - -// Reset reset all backend states -func (cp *ConsensusPoller) Reset() { - for _, be := range cp.backendGroup.Backends { - cp.backendState[be] = &backendState{} - } -} - -// fetchBlock is a convenient wrapper to make a request to get a block directly from the backend -func (cp *ConsensusPoller) fetchBlock(ctx context.Context, be *Backend, block string) (blockNumber hexutil.Uint64, blockHash string, err error) { - var rpcRes RPCRes - err = be.ForwardRPC(ctx, &rpcRes, "67", "eth_getBlockByNumber", block, false) - if err != nil { - return 0, "", err - } - - jsonMap, ok := rpcRes.Result.(map[string]interface{}) - if !ok { - return 0, "", fmt.Errorf("unexpected response to eth_getBlockByNumber on backend %s", be.Name) - } - blockNumber = hexutil.Uint64(hexutil.MustDecodeUint64(jsonMap["number"].(string))) - blockHash = jsonMap["hash"].(string) - - return -} - -// getPeerCount is a convenient wrapper to retrieve the current peer count from the backend -func (cp *ConsensusPoller) getPeerCount(ctx context.Context, be *Backend) (count uint64, err error) { - var rpcRes RPCRes - err = be.ForwardRPC(ctx, &rpcRes, "67", "net_peerCount") - if err != nil { - return 0, err - } - - jsonMap, ok := rpcRes.Result.(string) - if !ok { - return 0, fmt.Errorf("unexpected response to net_peerCount on backend %s", be.Name) - } - - count = hexutil.MustDecodeUint64(jsonMap) - - return count, nil -} - -// isInSync is a convenient wrapper to check if the backend is in sync from the network -func (cp *ConsensusPoller) isInSync(ctx context.Context, be *Backend) (result bool, err error) { - var rpcRes RPCRes - err = be.ForwardRPC(ctx, &rpcRes, "67", "eth_syncing") - if err != nil { - return false, err - } - - var res bool - switch typed := rpcRes.Result.(type) { - case bool: - syncing := typed - res = !syncing - case string: - syncing, err := strconv.ParseBool(typed) - if err != nil { - return false, err - } - res = !syncing - default: - // result is a json when not in sync - res = false - } - - return res, nil -} - -// getBackendState creates a copy of backend state so that the caller can use it without locking -func (cp *ConsensusPoller) getBackendState(be *Backend) *backendState { - bs := cp.backendState[be] - defer bs.backendStateMux.Unlock() - bs.backendStateMux.Lock() - - return &backendState{ - latestBlockNumber: bs.latestBlockNumber, - latestBlockHash: bs.latestBlockHash, - safeBlockNumber: bs.safeBlockNumber, - finalizedBlockNumber: bs.finalizedBlockNumber, - peerCount: bs.peerCount, - inSync: bs.inSync, - lastUpdate: bs.lastUpdate, - bannedUntil: bs.bannedUntil, - } -} - -func (cp *ConsensusPoller) setBackendState(be *Backend, peerCount uint64, inSync bool, - latestBlockNumber hexutil.Uint64, latestBlockHash string, - safeBlockNumber hexutil.Uint64, - finalizedBlockNumber hexutil.Uint64) bool { - bs := cp.backendState[be] - bs.backendStateMux.Lock() - changed := bs.latestBlockHash != latestBlockHash - bs.peerCount = peerCount - bs.inSync = inSync - bs.latestBlockNumber = latestBlockNumber - bs.latestBlockHash = latestBlockHash - bs.finalizedBlockNumber = finalizedBlockNumber - bs.safeBlockNumber = safeBlockNumber - bs.lastUpdate = time.Now() - bs.backendStateMux.Unlock() - return changed -} - -// getConsensusCandidates find out what backends are the candidates to be in the consensus group -// and create a copy of current their state -// -// a candidate is a serving node within the following conditions: -// - not banned -// - healthy (network latency and error rate) -// - with minimum peer count -// - in sync -// - updated recently -// - not lagging latest block -func (cp *ConsensusPoller) getConsensusCandidates() map[*Backend]*backendState { - candidates := make(map[*Backend]*backendState, len(cp.backendGroup.Backends)) - - for _, be := range cp.backendGroup.Backends { - bs := cp.getBackendState(be) - if be.forcedCandidate { - candidates[be] = bs - continue - } - if bs.IsBanned() { - continue - } - if !be.IsHealthy() { - continue - } - if !be.skipPeerCountCheck && bs.peerCount < cp.minPeerCount { - continue - } - if !bs.inSync { - continue - } - if bs.lastUpdate.Add(cp.maxUpdateThreshold).Before(time.Now()) { - continue - } - - candidates[be] = bs - } - - // find the highest block, in order to use it defining the highest non-lagging ancestor block - var highestLatestBlock hexutil.Uint64 - for _, bs := range candidates { - if bs.latestBlockNumber > highestLatestBlock { - highestLatestBlock = bs.latestBlockNumber - } - } - - // find the highest common ancestor block - lagging := make([]*Backend, 0, len(candidates)) - for be, bs := range candidates { - // check if backend is lagging behind the highest block - if uint64(highestLatestBlock-bs.latestBlockNumber) > cp.maxBlockLag { - lagging = append(lagging, be) - } - } - - // remove lagging backends from the candidates - for _, be := range lagging { - delete(candidates, be) - } - - return candidates -} diff --git a/proxyd/consensus_tracker.go b/proxyd/consensus_tracker.go deleted file mode 100644 index 77e0fdba9912..000000000000 --- a/proxyd/consensus_tracker.go +++ /dev/null @@ -1,356 +0,0 @@ -package proxyd - -import ( - "context" - "encoding/json" - "fmt" - "os" - "sync" - "time" - - "github.com/ethereum/go-ethereum/common/hexutil" - "github.com/ethereum/go-ethereum/log" - "github.com/go-redsync/redsync/v4" - "github.com/go-redsync/redsync/v4/redis/goredis/v9" - "github.com/redis/go-redis/v9" -) - -// ConsensusTracker abstracts how we store and retrieve the current consensus -// allowing it to be stored locally in-memory or in a shared Redis cluster -type ConsensusTracker interface { - GetLatestBlockNumber() hexutil.Uint64 - SetLatestBlockNumber(blockNumber hexutil.Uint64) - GetSafeBlockNumber() hexutil.Uint64 - SetSafeBlockNumber(blockNumber hexutil.Uint64) - GetFinalizedBlockNumber() hexutil.Uint64 - SetFinalizedBlockNumber(blockNumber hexutil.Uint64) -} - -// DTO to hold the current consensus state -type ConsensusTrackerState struct { - Latest hexutil.Uint64 `json:"latest"` - Safe hexutil.Uint64 `json:"safe"` - Finalized hexutil.Uint64 `json:"finalized"` -} - -func (ct *InMemoryConsensusTracker) update(o *ConsensusTrackerState) { - ct.mutex.Lock() - defer ct.mutex.Unlock() - - ct.state.Latest = o.Latest - ct.state.Safe = o.Safe - ct.state.Finalized = o.Finalized -} - -// InMemoryConsensusTracker store and retrieve in memory, async-safe -type InMemoryConsensusTracker struct { - mutex sync.Mutex - state *ConsensusTrackerState -} - -func NewInMemoryConsensusTracker() ConsensusTracker { - return &InMemoryConsensusTracker{ - mutex: sync.Mutex{}, - state: &ConsensusTrackerState{}, - } -} - -func (ct *InMemoryConsensusTracker) Valid() bool { - return ct.GetLatestBlockNumber() > 0 && - ct.GetSafeBlockNumber() > 0 && - ct.GetFinalizedBlockNumber() > 0 -} - -func (ct *InMemoryConsensusTracker) Behind(other *InMemoryConsensusTracker) bool { - return ct.GetLatestBlockNumber() < other.GetLatestBlockNumber() || - ct.GetSafeBlockNumber() < other.GetSafeBlockNumber() || - ct.GetFinalizedBlockNumber() < other.GetFinalizedBlockNumber() -} - -func (ct *InMemoryConsensusTracker) GetLatestBlockNumber() hexutil.Uint64 { - defer ct.mutex.Unlock() - ct.mutex.Lock() - - return ct.state.Latest -} - -func (ct *InMemoryConsensusTracker) SetLatestBlockNumber(blockNumber hexutil.Uint64) { - defer ct.mutex.Unlock() - ct.mutex.Lock() - - ct.state.Latest = blockNumber -} - -func (ct *InMemoryConsensusTracker) GetSafeBlockNumber() hexutil.Uint64 { - defer ct.mutex.Unlock() - ct.mutex.Lock() - - return ct.state.Safe -} - -func (ct *InMemoryConsensusTracker) SetSafeBlockNumber(blockNumber hexutil.Uint64) { - defer ct.mutex.Unlock() - ct.mutex.Lock() - - ct.state.Safe = blockNumber -} - -func (ct *InMemoryConsensusTracker) GetFinalizedBlockNumber() hexutil.Uint64 { - defer ct.mutex.Unlock() - ct.mutex.Lock() - - return ct.state.Finalized -} - -func (ct *InMemoryConsensusTracker) SetFinalizedBlockNumber(blockNumber hexutil.Uint64) { - defer ct.mutex.Unlock() - ct.mutex.Lock() - - ct.state.Finalized = blockNumber -} - -// RedisConsensusTracker store and retrieve in a shared Redis cluster, with leader election -type RedisConsensusTracker struct { - ctx context.Context - client *redis.Client - namespace string - backendGroup *BackendGroup - - redlock *redsync.Mutex - lockPeriod time.Duration - heartbeatInterval time.Duration - - leader bool - leaderName string - - // holds the state collected by local pollers - local *InMemoryConsensusTracker - - // holds a copy of the remote shared state - // when leader, updates the remote with the local state - remote *InMemoryConsensusTracker -} - -type RedisConsensusTrackerOpt func(cp *RedisConsensusTracker) - -func WithLockPeriod(lockPeriod time.Duration) RedisConsensusTrackerOpt { - return func(ct *RedisConsensusTracker) { - ct.lockPeriod = lockPeriod - } -} - -func WithHeartbeatInterval(heartbeatInterval time.Duration) RedisConsensusTrackerOpt { - return func(ct *RedisConsensusTracker) { - ct.heartbeatInterval = heartbeatInterval - } -} -func NewRedisConsensusTracker(ctx context.Context, - redisClient *redis.Client, - bg *BackendGroup, - namespace string, - opts ...RedisConsensusTrackerOpt) ConsensusTracker { - - tracker := &RedisConsensusTracker{ - ctx: ctx, - client: redisClient, - backendGroup: bg, - namespace: namespace, - - lockPeriod: 30 * time.Second, - heartbeatInterval: 2 * time.Second, - local: NewInMemoryConsensusTracker().(*InMemoryConsensusTracker), - remote: NewInMemoryConsensusTracker().(*InMemoryConsensusTracker), - } - - for _, opt := range opts { - opt(tracker) - } - - return tracker -} - -func (ct *RedisConsensusTracker) Init() { - go func() { - for { - timer := time.NewTimer(ct.heartbeatInterval) - ct.stateHeartbeat() - - select { - case <-timer.C: - continue - case <-ct.ctx.Done(): - timer.Stop() - return - } - } - }() -} - -func (ct *RedisConsensusTracker) stateHeartbeat() { - pool := goredis.NewPool(ct.client) - rs := redsync.New(pool) - key := ct.key("mutex") - - val, err := ct.client.Get(ct.ctx, key).Result() - if err != nil && err != redis.Nil { - log.Error("failed to read the lock", "err", err) - RecordGroupConsensusError(ct.backendGroup, "read_lock", err) - if ct.leader { - ok, err := ct.redlock.Unlock() - if err != nil || !ok { - log.Error("failed to release the lock after error", "err", err) - RecordGroupConsensusError(ct.backendGroup, "leader_release_lock", err) - return - } - ct.leader = false - } - return - } - if val != "" { - if ct.leader { - log.Debug("extending lock") - ok, err := ct.redlock.Extend() - if err != nil || !ok { - log.Error("failed to extend lock", "err", err, "mutex", ct.redlock.Name(), "val", ct.redlock.Value()) - RecordGroupConsensusError(ct.backendGroup, "leader_extend_lock", err) - ok, err := ct.redlock.Unlock() - if err != nil || !ok { - log.Error("failed to release the lock after error", "err", err) - RecordGroupConsensusError(ct.backendGroup, "leader_release_lock", err) - return - } - ct.leader = false - return - } - ct.postPayload(val) - } else { - // retrieve current leader - leaderName, err := ct.client.Get(ct.ctx, ct.key(fmt.Sprintf("leader:%s", val))).Result() - if err != nil && err != redis.Nil { - log.Error("failed to read the remote leader", "err", err) - RecordGroupConsensusError(ct.backendGroup, "read_leader", err) - return - } - ct.leaderName = leaderName - log.Debug("following", "val", val, "leader", leaderName) - // retrieve payload - val, err := ct.client.Get(ct.ctx, ct.key(fmt.Sprintf("state:%s", val))).Result() - if err != nil && err != redis.Nil { - log.Error("failed to read the remote state", "err", err) - RecordGroupConsensusError(ct.backendGroup, "read_state", err) - return - } - if val == "" { - log.Error("remote state is missing (recent leader election maybe?)") - RecordGroupConsensusError(ct.backendGroup, "read_state_missing", err) - return - } - state := &ConsensusTrackerState{} - err = json.Unmarshal([]byte(val), state) - if err != nil { - log.Error("failed to unmarshal the remote state", "err", err) - RecordGroupConsensusError(ct.backendGroup, "read_unmarshal_state", err) - return - } - - ct.remote.update(state) - log.Debug("updated state from remote", "state", val, "leader", leaderName) - - RecordGroupConsensusHALatestBlock(ct.backendGroup, leaderName, ct.remote.state.Latest) - RecordGroupConsensusHASafeBlock(ct.backendGroup, leaderName, ct.remote.state.Safe) - RecordGroupConsensusHAFinalizedBlock(ct.backendGroup, leaderName, ct.remote.state.Finalized) - } - } else { - if !ct.local.Valid() { - log.Warn("local state is not valid or behind remote, skipping") - return - } - if ct.remote.Valid() && ct.local.Behind(ct.remote) { - log.Warn("local state is behind remote, skipping") - return - } - - log.Info("lock not found, creating a new one") - - mutex := rs.NewMutex(key, - redsync.WithExpiry(ct.lockPeriod), - redsync.WithFailFast(true), - redsync.WithTries(1)) - - // nosemgrep: missing-unlock-before-return - // this lock is hold indefinitely, and it is extended until the leader dies - if err := mutex.Lock(); err != nil { - log.Debug("failed to obtain lock", "err", err) - ct.leader = false - return - } - - log.Info("lock acquired", "mutex", mutex.Name(), "val", mutex.Value()) - ct.redlock = mutex - ct.leader = true - ct.postPayload(mutex.Value()) - } -} - -func (ct *RedisConsensusTracker) key(tag string) string { - return fmt.Sprintf("consensus:%s:%s", ct.namespace, tag) -} - -func (ct *RedisConsensusTracker) GetLatestBlockNumber() hexutil.Uint64 { - return ct.remote.GetLatestBlockNumber() -} - -func (ct *RedisConsensusTracker) SetLatestBlockNumber(blockNumber hexutil.Uint64) { - ct.local.SetLatestBlockNumber(blockNumber) -} - -func (ct *RedisConsensusTracker) GetSafeBlockNumber() hexutil.Uint64 { - return ct.remote.GetSafeBlockNumber() -} - -func (ct *RedisConsensusTracker) SetSafeBlockNumber(blockNumber hexutil.Uint64) { - ct.local.SetSafeBlockNumber(blockNumber) -} - -func (ct *RedisConsensusTracker) GetFinalizedBlockNumber() hexutil.Uint64 { - return ct.remote.GetFinalizedBlockNumber() -} - -func (ct *RedisConsensusTracker) SetFinalizedBlockNumber(blockNumber hexutil.Uint64) { - ct.local.SetFinalizedBlockNumber(blockNumber) -} - -func (ct *RedisConsensusTracker) postPayload(mutexVal string) { - jsonState, err := json.Marshal(ct.local.state) - if err != nil { - log.Error("failed to marshal local", "err", err) - RecordGroupConsensusError(ct.backendGroup, "leader_marshal_local_state", err) - ct.leader = false - return - } - err = ct.client.Set(ct.ctx, ct.key(fmt.Sprintf("state:%s", mutexVal)), jsonState, ct.lockPeriod).Err() - if err != nil { - log.Error("failed to post the state", "err", err) - RecordGroupConsensusError(ct.backendGroup, "leader_post_state", err) - ct.leader = false - return - } - - leader, _ := os.LookupEnv("HOSTNAME") - err = ct.client.Set(ct.ctx, ct.key(fmt.Sprintf("leader:%s", mutexVal)), leader, ct.lockPeriod).Err() - if err != nil { - log.Error("failed to post the leader", "err", err) - RecordGroupConsensusError(ct.backendGroup, "leader_post_leader", err) - ct.leader = false - return - } - - log.Debug("posted state", "state", string(jsonState), "leader", leader) - - ct.leaderName = leader - ct.remote.update(ct.local.state) - - RecordGroupConsensusHALatestBlock(ct.backendGroup, leader, ct.remote.state.Latest) - RecordGroupConsensusHASafeBlock(ct.backendGroup, leader, ct.remote.state.Safe) - RecordGroupConsensusHAFinalizedBlock(ct.backendGroup, leader, ct.remote.state.Finalized) -} diff --git a/proxyd/entrypoint.sh b/proxyd/entrypoint.sh deleted file mode 100644 index ef83fa8e47d4..000000000000 --- a/proxyd/entrypoint.sh +++ /dev/null @@ -1,6 +0,0 @@ -#!/bin/sh - -echo "Updating CA certificates." -update-ca-certificates -echo "Running CMD." -exec "$@" \ No newline at end of file diff --git a/proxyd/errors.go b/proxyd/errors.go deleted file mode 100644 index 51f8df6ddebb..000000000000 --- a/proxyd/errors.go +++ /dev/null @@ -1,7 +0,0 @@ -package proxyd - -import "fmt" - -func wrapErr(err error, msg string) error { - return fmt.Errorf("%s %w", msg, err) -} diff --git a/proxyd/example.config.toml b/proxyd/example.config.toml deleted file mode 100644 index b54b342f5189..000000000000 --- a/proxyd/example.config.toml +++ /dev/null @@ -1,123 +0,0 @@ -# List of WS methods to whitelist. -ws_method_whitelist = [ - "eth_subscribe", - "eth_call", - "eth_chainId" -] -# Enable WS on this backend group. There can only be one WS-enabled backend group. -ws_backend_group = "main" - -[server] -# Host for the proxyd RPC server to listen on. -rpc_host = "0.0.0.0" -# Port for the above. -rpc_port = 8080 -# Host for the proxyd WS server to listen on. -ws_host = "0.0.0.0" -# Port for the above -# Set the ws_port to 0 to disable WS -ws_port = 8085 -# Maximum client body size, in bytes, that the server will accept. -max_body_size_bytes = 10485760 -max_concurrent_rpcs = 1000 -# Server log level -log_level = "info" - -[redis] -# URL to a Redis instance. -url = "redis://localhost:6379" - -[metrics] -# Whether or not to enable Prometheus metrics. -enabled = true -# Host for the Prometheus metrics endpoint to listen on. -host = "0.0.0.0" -# Port for the above. -port = 9761 - -[backend] -# How long proxyd should wait for a backend response before timing out. -response_timeout_seconds = 5 -# Maximum response size, in bytes, that proxyd will accept from a backend. -max_response_size_bytes = 5242880 -# Maximum number of times proxyd will try a backend before giving up. -max_retries = 3 -# Number of seconds to wait before trying an unhealthy backend again. -out_of_service_seconds = 600 -# Maximum latency accepted to serve requests, default 10s -max_latency_threshold = "30s" -# Maximum latency accepted to serve requests before degraded, default 5s -max_degraded_latency_threshold = "10s" -# Maximum error rate accepted to serve requests, default 0.5 (i.e. 50%) -max_error_rate_threshold = 0.3 - -[backends] -# A map of backends by name. -[backends.infura] -# The URL to contact the backend at. Will be read from the environment -# if an environment variable prefixed with $ is provided. -rpc_url = "" -# The WS URL to contact the backend at. Will be read from the environment -# if an environment variable prefixed with $ is provided. -ws_url = "" -username = "" -# An HTTP Basic password to authenticate with the backend. Will be read from -# the environment if an environment variable prefixed with $ is provided. -password = "" -max_rps = 3 -max_ws_conns = 1 -# Path to a custom root CA. -ca_file = "" -# Path to a custom client cert file. -client_cert_file = "" -# Path to a custom client key file. -client_key_file = "" -# Allows backends to skip peer count checking, default false -# consensus_skip_peer_count = true -# Specified the target method to get receipts, default "debug_getRawReceipts" -# See https://github.com/ethereum-optimism/optimism/blob/186e46a47647a51a658e699e9ff047d39444c2de/op-node/sources/receipts.go#L186-L253 -consensus_receipts_target = "eth_getBlockReceipts" - -[backends.alchemy] -rpc_url = "" -ws_url = "" -username = "" -password = "" -max_rps = 3 -max_ws_conns = 1 -consensus_receipts_target = "alchemy_getTransactionReceipts" - -[backend_groups] -[backend_groups.main] -backends = ["infura"] -# Enable consensus awareness for backend group, making it act as a load balancer, default false -# consensus_aware = true -# Period in which the backend wont serve requests if banned, default 5m -# consensus_ban_period = "1m" -# Maximum delay for update the backend, default 30s -# consensus_max_update_threshold = "20s" -# Maximum block lag, default 8 -# consensus_max_block_lag = 16 -# Maximum block range (for eth_getLogs method), no default -# consensus_max_block_range = 20000 -# Minimum peer count, default 3 -# consensus_min_peer_count = 4 - -[backend_groups.alchemy] -backends = ["alchemy"] - -# If the authentication group below is in the config, -# proxyd will only accept authenticated requests. -[authentication] -# Mapping of auth key to alias. The alias is used to provide a human- -# readable name for the auth key in monitoring. The auth key will be -# read from the environment if an environment variable prefixed with $ -# is provided. Note that you will need to quote the environment variable -# in order for it to be value TOML, e.g. "$FOO_AUTH_KEY" = "foo_alias". -secret = "test" - -# Mapping of methods to backend groups. -[rpc_method_mappings] -eth_call = "main" -eth_chainId = "main" -eth_blockNumber = "alchemy" diff --git a/proxyd/frontend_rate_limiter.go b/proxyd/frontend_rate_limiter.go deleted file mode 100644 index d0590f0561da..000000000000 --- a/proxyd/frontend_rate_limiter.go +++ /dev/null @@ -1,139 +0,0 @@ -package proxyd - -import ( - "context" - "fmt" - "sync" - "time" - - "github.com/redis/go-redis/v9" -) - -type FrontendRateLimiter interface { - // Take consumes a key, and a maximum number of requests - // per time interval. It returns a boolean denoting if - // the limit could be taken, or an error if a failure - // occurred in the backing rate limit implementation. - // - // No error will be returned if the limit could not be taken - // as a result of the requestor being over the limit. - Take(ctx context.Context, key string) (bool, error) -} - -// limitedKeys is a wrapper around a map that stores a truncated -// timestamp and a mutex. The map is used to keep track of rate -// limit keys, and their used limits. -type limitedKeys struct { - truncTS int64 - keys map[string]int - mtx sync.Mutex -} - -func newLimitedKeys(t int64) *limitedKeys { - return &limitedKeys{ - truncTS: t, - keys: make(map[string]int), - } -} - -func (l *limitedKeys) Take(key string, max int) bool { - l.mtx.Lock() - defer l.mtx.Unlock() - val, ok := l.keys[key] - if !ok { - l.keys[key] = 0 - val = 0 - } - l.keys[key] = val + 1 - return val < max -} - -// MemoryFrontendRateLimiter is a rate limiter that stores -// all rate limiting information in local memory. It works -// by storing a limitedKeys struct that references the -// truncated timestamp at which the struct was created. If -// the current truncated timestamp doesn't match what's -// referenced, the limit is reset. Otherwise, values in -// a map are incremented to represent the limit. -type MemoryFrontendRateLimiter struct { - currGeneration *limitedKeys - dur time.Duration - max int - mtx sync.Mutex -} - -func NewMemoryFrontendRateLimit(dur time.Duration, max int) FrontendRateLimiter { - return &MemoryFrontendRateLimiter{ - dur: dur, - max: max, - } -} - -func (m *MemoryFrontendRateLimiter) Take(ctx context.Context, key string) (bool, error) { - m.mtx.Lock() - // Create truncated timestamp - truncTS := truncateNow(m.dur) - - // If there is no current rate limit map or the rate limit map reference - // a different timestamp, reset limits. - if m.currGeneration == nil || m.currGeneration.truncTS != truncTS { - m.currGeneration = newLimitedKeys(truncTS) - } - - // Pull out the limiter so we can unlock before incrementing the limit. - limiter := m.currGeneration - - m.mtx.Unlock() - - return limiter.Take(key, m.max), nil -} - -// RedisFrontendRateLimiter is a rate limiter that stores data in Redis. -// It uses the basic rate limiter pattern described on the Redis best -// practices website: https://redis.com/redis-best-practices/basic-rate-limiting/. -type RedisFrontendRateLimiter struct { - r *redis.Client - dur time.Duration - max int - prefix string -} - -func NewRedisFrontendRateLimiter(r *redis.Client, dur time.Duration, max int, prefix string) FrontendRateLimiter { - return &RedisFrontendRateLimiter{ - r: r, - dur: dur, - max: max, - prefix: prefix, - } -} - -func (r *RedisFrontendRateLimiter) Take(ctx context.Context, key string) (bool, error) { - var incr *redis.IntCmd - truncTS := truncateNow(r.dur) - fullKey := fmt.Sprintf("rate_limit:%s:%s:%d", r.prefix, key, truncTS) - _, err := r.r.Pipelined(ctx, func(pipe redis.Pipeliner) error { - incr = pipe.Incr(ctx, fullKey) - pipe.PExpire(ctx, fullKey, r.dur-time.Millisecond) - return nil - }) - if err != nil { - frontendRateLimitTakeErrors.Inc() - return false, err - } - - return incr.Val()-1 < int64(r.max), nil -} - -type noopFrontendRateLimiter struct{} - -var NoopFrontendRateLimiter = &noopFrontendRateLimiter{} - -func (n *noopFrontendRateLimiter) Take(ctx context.Context, key string) (bool, error) { - return true, nil -} - -// truncateNow truncates the current timestamp -// to the specified duration. -func truncateNow(dur time.Duration) int64 { - return time.Now().Truncate(dur).Unix() -} diff --git a/proxyd/frontend_rate_limiter_test.go b/proxyd/frontend_rate_limiter_test.go deleted file mode 100644 index fb5f808bb5ec..000000000000 --- a/proxyd/frontend_rate_limiter_test.go +++ /dev/null @@ -1,53 +0,0 @@ -package proxyd - -import ( - "context" - "fmt" - "testing" - "time" - - "github.com/alicebob/miniredis" - "github.com/redis/go-redis/v9" - "github.com/stretchr/testify/require" -) - -func TestFrontendRateLimiter(t *testing.T) { - redisServer, err := miniredis.Run() - require.NoError(t, err) - defer redisServer.Close() - - redisClient := redis.NewClient(&redis.Options{ - Addr: fmt.Sprintf("127.0.0.1:%s", redisServer.Port()), - }) - - max := 2 - lims := []struct { - name string - frl FrontendRateLimiter - }{ - {"memory", NewMemoryFrontendRateLimit(2*time.Second, max)}, - {"redis", NewRedisFrontendRateLimiter(redisClient, 2*time.Second, max, "")}, - } - - for _, cfg := range lims { - frl := cfg.frl - ctx := context.Background() - t.Run(cfg.name, func(t *testing.T) { - for i := 0; i < 4; i++ { - ok, err := frl.Take(ctx, "foo") - require.NoError(t, err) - require.Equal(t, i < max, ok) - ok, err = frl.Take(ctx, "bar") - require.NoError(t, err) - require.Equal(t, i < max, ok) - } - time.Sleep(2 * time.Second) - for i := 0; i < 4; i++ { - ok, _ := frl.Take(ctx, "foo") - require.Equal(t, i < max, ok) - ok, _ = frl.Take(ctx, "bar") - require.Equal(t, i < max, ok) - } - }) - } -} diff --git a/proxyd/go.mod b/proxyd/go.mod deleted file mode 100644 index 088bf9bc9ed3..000000000000 --- a/proxyd/go.mod +++ /dev/null @@ -1,86 +0,0 @@ -module github.com/ethereum-optimism/optimism/proxyd - -go 1.21 - -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.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 - github.com/gorilla/websocket v1.5.0 - github.com/hashicorp/golang-lru v1.0.2 - github.com/pkg/errors v0.9.1 - github.com/prometheus/client_golang v1.17.0 - github.com/redis/go-redis/v9 v9.2.1 - github.com/rs/cors v1.10.1 - github.com/stretchr/testify v1.8.4 - github.com/syndtr/goleveldb v1.0.1-0.20210819022825-2ae1ddf74ef7 - github.com/xaionaro-go/weightedshuffle v0.0.0-20211213010739-6a74fbc7d24a - golang.org/x/exp v0.0.0-20231110203233-9a3e6036ecaa - golang.org/x/sync v0.5.0 - gopkg.in/yaml.v3 v3.0.1 -) - -require ( - github.com/DataDog/zstd v1.5.5 // indirect - github.com/Microsoft/go-winio v0.6.1 // indirect - github.com/VictoriaMetrics/fastcache v1.12.1 // indirect - github.com/alicebob/gopher-json v0.0.0-20230218143504-906a9b012302 // indirect - github.com/beorn7/perks v1.0.1 // indirect - github.com/bits-and-blooms/bitset v1.10.0 // indirect - github.com/btcsuite/btcd/btcec/v2 v2.3.2 // indirect - github.com/cespare/xxhash/v2 v2.2.0 // indirect - github.com/cockroachdb/errors v1.11.1 // indirect - github.com/cockroachdb/logtags v0.0.0-20230118201751-21c54148d20b // indirect - github.com/cockroachdb/pebble v0.0.0-20231020221949-babd592d2360 // indirect - github.com/cockroachdb/redact v1.1.5 // indirect - github.com/cockroachdb/tokenbucket v0.0.0-20230807174530-cc333fc44b06 // indirect - github.com/consensys/bavard v0.1.13 // indirect - github.com/consensys/gnark-crypto v0.12.1 // indirect - 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/davecgh/go-spew v1.1.1 // indirect - github.com/deckarep/golang-set/v2 v2.3.1 // indirect - github.com/decred/dcrd/dcrec/secp256k1/v4 v4.2.0 // indirect - github.com/dgryski/go-rendezvous v0.0.0-20200823014737-9f7001d12a5f // indirect - github.com/ethereum/c-kzg-4844 v0.4.0 // indirect - github.com/gballet/go-verkle v0.1.1-0.20231031103413-a67434b50f46 // indirect - github.com/getsentry/sentry-go v0.25.0 // 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/gomodule/redigo v1.8.9 // indirect - github.com/hashicorp/errwrap v1.1.0 // indirect - github.com/hashicorp/go-multierror v1.1.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.1 // indirect - github.com/kr/pretty v0.3.1 // indirect - github.com/kr/text v0.2.0 // indirect - github.com/mattn/go-runewidth v0.0.15 // indirect - github.com/matttproud/golang_protobuf_extensions/v2 v2.0.0 // indirect - github.com/mmcloughlin/addchain v0.4.0 // indirect - github.com/olekukonko/tablewriter v0.0.5 // indirect - github.com/pmezard/go-difflib v1.0.0 // indirect - github.com/prometheus/client_model v0.5.0 // indirect - github.com/prometheus/common v0.45.0 // indirect - github.com/prometheus/procfs v0.12.0 // indirect - github.com/rivo/uniseg v0.4.4 // indirect - github.com/rogpeppe/go-internal v1.11.0 // indirect - github.com/shirou/gopsutil v3.21.11+incompatible // indirect - github.com/supranational/blst v0.3.11 // indirect - github.com/tklauser/go-sysconf v0.3.12 // indirect - github.com/tklauser/numcpus v0.6.1 // indirect - github.com/yuin/gopher-lua v1.1.0 // indirect - 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.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 - rsc.io/tmplfunc v0.0.3 // indirect -) diff --git a/proxyd/go.sum b/proxyd/go.sum deleted file mode 100644 index 11a684f0e398..000000000000 --- a/proxyd/go.sum +++ /dev/null @@ -1,290 +0,0 @@ -github.com/BurntSushi/toml v1.3.2 h1:o7IhLm0Msx3BaB+n3Ag7L8EVlByGnpq14C4YWiu/gL8= -github.com/BurntSushi/toml v1.3.2/go.mod h1:CxXYINrC8qIiEnFrOxCa7Jy5BFHlXnUU2pbicEuybxQ= -github.com/DataDog/zstd v1.5.5 h1:oWf5W7GtOLgp6bciQYDmhHHjdhYkALu6S/5Ni9ZgSvQ= -github.com/DataDog/zstd v1.5.5/go.mod h1:g4AWEaM3yOg3HYfnJ3YIawPnVdXJh9QME85blwSAmyw= -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/VictoriaMetrics/fastcache v1.12.1 h1:i0mICQuojGDL3KblA7wUNlY5lOK6a4bwt3uRKnkZU40= -github.com/VictoriaMetrics/fastcache v1.12.1/go.mod h1:tX04vaqcNoQeGLD+ra5pU5sWkuxnzWhEzLwhP9w653o= -github.com/alicebob/gopher-json v0.0.0-20230218143504-906a9b012302 h1:uvdUDbHQHO85qeSydJtItA4T55Pw6BtAejd0APRJOCE= -github.com/alicebob/gopher-json v0.0.0-20230218143504-906a9b012302/go.mod h1:SGnFV6hVsYE877CKEZ6tDNTjaSXYUk6QqoIK6PrAtcc= -github.com/alicebob/miniredis v2.5.0+incompatible h1:yBHoLpsyjupjz3NL3MhKMVkR41j82Yjf3KFv7ApYzUI= -github.com/alicebob/miniredis v2.5.0+incompatible/go.mod h1:8HZjEj4yU0dwhYHky+DxYx+6BMjkBbe5ONFIF1MXffk= -github.com/allegro/bigcache v1.2.1-0.20190218064605-e24eb225f156 h1:eMwmnE/GDgah4HI848JfFxHt+iPb26b4zyfspmqY0/8= -github.com/allegro/bigcache v1.2.1-0.20190218064605-e24eb225f156/go.mod h1:Cb/ax3seSYIx7SuZdm2G2xzfwmv3TPSk2ucNfQESPXM= -github.com/beorn7/perks v1.0.1 h1:VlbKKnNfV8bJzeqoa4cOKqO6bYr3WgKZxO8Z16+hsOM= -github.com/beorn7/perks v1.0.1/go.mod h1:G2ZrVWU2WbWT9wwq4/hrbKbnv/1ERSJQ0ibhJ6rlkpw= -github.com/bits-and-blooms/bitset v1.10.0 h1:ePXTeiPEazB5+opbv5fr8umg2R/1NlzgDsyepwsSr88= -github.com/bits-and-blooms/bitset v1.10.0/go.mod h1:7hO7Gc7Pp1vODcmWvKMRA9BNmbv6a/7QIWpPxHddWR8= -github.com/bsm/ginkgo/v2 v2.12.0 h1:Ny8MWAHyOepLGlLKYmXG4IEkioBysk6GpaRTLC8zwWs= -github.com/bsm/ginkgo/v2 v2.12.0/go.mod h1:SwYbGRRDovPVboqFv0tPTcG1sN61LM1Z4ARdbAV9g4c= -github.com/bsm/gomega v1.27.10 h1:yeMWxP2pV2fG3FgAODIY8EiRE3dy0aeFYt4l7wh6yKA= -github.com/bsm/gomega v1.27.10/go.mod h1:JyEr/xRbxbtgWNi8tIEVPUYZ5Dzef52k01W3YH0H+O0= -github.com/btcsuite/btcd/btcec/v2 v2.3.2 h1:5n0X6hX0Zk+6omWcihdYvdAlGf2DfasC0GMf7DClJ3U= -github.com/btcsuite/btcd/btcec/v2 v2.3.2/go.mod h1:zYzJ8etWJQIv1Ogk7OzpWjowwOdXY1W/17j2MW85J04= -github.com/btcsuite/btcd/chaincfg/chainhash v1.0.1 h1:q0rUy8C/TYNBQS1+CGKw68tLOFYSNEs0TFnxxnS9+4U= -github.com/btcsuite/btcd/chaincfg/chainhash v1.0.1/go.mod h1:7SFka0XMvUgj3hfZtydOrQY2mwhPclbT2snogU7SQQc= -github.com/cespare/xxhash/v2 v2.2.0 h1:DC2CZ1Ep5Y4k3ZQ899DldepgrayRUGE6BBZ/cd9Cj44= -github.com/cespare/xxhash/v2 v2.2.0/go.mod h1:VGX0DQ3Q6kWi7AoAeZDth3/j3BFtOZR5XLFGgcrjCOs= -github.com/cockroachdb/datadriven v1.0.3-0.20230413201302-be42291fc80f h1:otljaYPt5hWxV3MUfO5dFPFiOXg9CyG5/kCfayTqsJ4= -github.com/cockroachdb/datadriven v1.0.3-0.20230413201302-be42291fc80f/go.mod h1:a9RdTaap04u637JoCzcUoIcDmvwSUtcUFtT/C3kJlTU= -github.com/cockroachdb/errors v1.11.1 h1:xSEW75zKaKCWzR3OfxXUxgrk/NtT4G1MiOv5lWZazG8= -github.com/cockroachdb/errors v1.11.1/go.mod h1:8MUxA3Gi6b25tYlFEBGLf+D8aISL+M4MIpiWMSNRfxw= -github.com/cockroachdb/logtags v0.0.0-20230118201751-21c54148d20b h1:r6VH0faHjZeQy818SGhaone5OnYfxFR/+AzdY3sf5aE= -github.com/cockroachdb/logtags v0.0.0-20230118201751-21c54148d20b/go.mod h1:Vz9DsVWQQhf3vs21MhPMZpMGSht7O/2vFW2xusFUVOs= -github.com/cockroachdb/pebble v0.0.0-20231020221949-babd592d2360 h1:x1dzGu9e1FYmkG8mL9emtdWD1EzH/17SijnoLvKvPiM= -github.com/cockroachdb/pebble v0.0.0-20231020221949-babd592d2360/go.mod h1:sEHm5NOXxyiAoKWhoFxT8xMgd/f3RA6qUqQ1BXKrh2E= -github.com/cockroachdb/redact v1.1.5 h1:u1PMllDkdFfPWaNGMyLD1+so+aq3uUItthCFqzwPJ30= -github.com/cockroachdb/redact v1.1.5/go.mod h1:BVNblN9mBWFyMyqK1k3AAiSxhvhfK2oOZZ2lK+dpvRg= -github.com/cockroachdb/tokenbucket v0.0.0-20230807174530-cc333fc44b06 h1:zuQyyAKVxetITBuuhv3BI9cMrmStnpT18zmgmTxunpo= -github.com/cockroachdb/tokenbucket v0.0.0-20230807174530-cc333fc44b06/go.mod h1:7nc4anLGjupUW/PeY5qiNYsdNXj7zopG+eqsS7To5IQ= -github.com/consensys/bavard v0.1.13 h1:oLhMLOFGTLdlda/kma4VOJazblc7IM5y5QPd2A/YjhQ= -github.com/consensys/bavard v0.1.13/go.mod h1:9ItSMtA/dXMAiL7BG6bqW2m3NdSEObYWoH223nGHukI= -github.com/consensys/gnark-crypto v0.12.1 h1:lHH39WuuFgVHONRl3J0LRBtuYdQTumFSDtJF7HpyG8M= -github.com/consensys/gnark-crypto v0.12.1/go.mod h1:v2Gy7L/4ZRosZ7Ivs+9SfUDr0f5UlG+EM5t7MPHiLuY= -github.com/crate-crypto/go-ipa v0.0.0-20231025140028-3c0104f4b233 h1:d28BXYi+wUpz1KBmiF9bWrjEMacUEREV6MBi2ODnrfQ= -github.com/crate-crypto/go-ipa v0.0.0-20231025140028-3c0104f4b233/go.mod h1:geZJZH3SzKCqnz5VT0q/DyIG/tvu/dZk+VIfXicupJs= -github.com/crate-crypto/go-kzg-4844 v0.7.0 h1:C0vgZRk4q4EZ/JgPfzuSoxdCq3C3mOZMBShovmncxvA= -github.com/crate-crypto/go-kzg-4844 v0.7.0/go.mod h1:1kMhvPgI0Ky3yIa+9lFySEBUBXkYxeOi8ZF1sYioxhc= -github.com/creack/pty v1.1.9/go.mod h1:oKZEueFk5CKHvIhNR5MUki03XCEU+Q6VDXinZuGJ33E= -github.com/davecgh/go-spew v1.1.0/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38= -github.com/davecgh/go-spew v1.1.1 h1:vj9j/u1bqnvCEfJOwUhtlOARqs3+rkHYY13jYWTU97c= -github.com/davecgh/go-spew v1.1.1/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38= -github.com/deckarep/golang-set/v2 v2.3.1 h1:vjmkvJt/IV27WXPyYQpAh4bRyWJc5Y435D17XQ9QU5A= -github.com/deckarep/golang-set/v2 v2.3.1/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/dgryski/go-rendezvous v0.0.0-20200823014737-9f7001d12a5f h1:lO4WD4F/rVNCu3HqELle0jiPLLBs70cWOduZpkS1E78= -github.com/dgryski/go-rendezvous v0.0.0-20200823014737-9f7001d12a5f/go.mod h1:cuUVRXasLTGF7a8hSLbxyZXjz+1KgoB3wDUb6vlszIc= -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.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= -github.com/fsnotify/fsnotify v1.6.0/go.mod h1:sl3t1tCWJFWoRz9R8WJCbQihKKwmorjAbSClcnxKAGw= -github.com/gballet/go-verkle v0.1.1-0.20231031103413-a67434b50f46 h1:BAIP2GihuqhwdILrV+7GJel5lyPV3u1+PgzrWLc0TkE= -github.com/gballet/go-verkle v0.1.1-0.20231031103413-a67434b50f46/go.mod h1:QNpY22eby74jVhqH4WhDLDwxc/vqsern6pW+u2kbkpc= -github.com/getsentry/sentry-go v0.25.0 h1:q6Eo+hS+yoJlTO3uu/azhQadsD8V+jQn2D8VvX1eOyI= -github.com/getsentry/sentry-go v0.25.0/go.mod h1:lc76E2QywIyW8WuBnwl8Lc4bkmQH4+w1gwTf25trprY= -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/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-redis/redis v6.15.9+incompatible h1:K0pv1D7EQUjfyoMql+r/jZqCLizCGKFlFgcHWWmHQjg= -github.com/go-redis/redis v6.15.9+incompatible/go.mod h1:NAIEuMOZ/fxfXJIrKDQDz8wamY7mA7PouImQ2Jvg6kA= -github.com/go-redis/redis/v7 v7.4.0 h1:7obg6wUoj05T0EpY0o8B59S9w5yeMWql7sw2kwNW1x4= -github.com/go-redis/redis/v7 v7.4.0/go.mod h1:JDNMw23GTyLNC4GZu9njt15ctBQVn7xjRfnwdHj/Dcg= -github.com/go-redis/redis/v8 v8.11.4 h1:kHoYkfZP6+pe04aFTnhDH6GDROa5yJdHJVNxV3F46Tg= -github.com/go-redis/redis/v8 v8.11.4/go.mod h1:2Z2wHZXdQpCDXEGzqMockDpNyYvi2l4Pxt6RJr792+w= -github.com/go-redsync/redsync/v4 v4.10.0 h1:hTeAak4C73mNBQSTq6KCKDFaiIlfC+z5yTTl8fCJuBs= -github.com/go-redsync/redsync/v4 v4.10.0/go.mod h1:ZfayzutkgeBmEmBlUR3j+rF6kN44UUGtEdfzhBFZTPc= -github.com/gofrs/flock v0.8.1 h1:+gYjHKf32LDeiEEFhQaotPbLuUXjY5ZqxKgXy7n59aw= -github.com/gofrs/flock v0.8.1/go.mod h1:F1TvTiK9OcQqauNUHlbJvyl9Qa1QvF/gOUDKA14jxHU= -github.com/gogo/protobuf v1.3.2 h1:Ov1cvc58UF3b5XjBnZv7+opcTcQFZebYjWzi34vdm4Q= -github.com/gogo/protobuf v1.3.2/go.mod h1:P1XiOD3dCwIKUDQYPy72D8LYyHL2YPYrpS2s69NZV8Q= -github.com/golang/protobuf v1.2.0/go.mod h1:6lQm79b+lXiMfvg/cZm0SGofjICqVBUtrP5yJMmIC1U= -github.com/golang/protobuf v1.4.0-rc.1/go.mod h1:ceaxUfeHdC40wWswd/P6IGgMaK3YpKi5j83Wpe3EHw8= -github.com/golang/protobuf v1.4.0-rc.1.0.20200221234624-67d41d38c208/go.mod h1:xKAWHe0F5eneWXFV3EuXVDTCmh+JuBKY0li0aMyXATA= -github.com/golang/protobuf v1.4.0-rc.2/go.mod h1:LlEzMj4AhA7rCAGe4KMBDvJI+AwstrUpVNzEA03Pprs= -github.com/golang/protobuf v1.4.0-rc.4.0.20200313231945-b860323f09d0/go.mod h1:WU3c8KckQ9AFe+yFwt9sWVRKCVIyN9cPHBJSNnbL67w= -github.com/golang/protobuf v1.4.0/go.mod h1:jodUvKwWbYaEsadDk5Fwe5c77LiNKVO9IDvqG2KuDX0= -github.com/golang/protobuf v1.4.2/go.mod h1:oDoupMAO8OvCJWAcko0GGGIgR6R6ocIYbsSw735rRwI= -github.com/golang/snappy v0.0.4/go.mod h1:/XxbfmMg8lxefKM7IXC3fBNl/7bRcc72aCRzEWrmP2Q= -github.com/golang/snappy v0.0.5-0.20220116011046-fa5810519dcb h1:PBC98N2aIaM3XXiurYmW7fx4GZkL8feAMVq7nEjURHk= -github.com/golang/snappy v0.0.5-0.20220116011046-fa5810519dcb/go.mod h1:/XxbfmMg8lxefKM7IXC3fBNl/7bRcc72aCRzEWrmP2Q= -github.com/gomodule/redigo v1.8.9 h1:Sl3u+2BI/kk+VEatbj0scLdrFhjPmbxOc1myhDP41ws= -github.com/gomodule/redigo v1.8.9/go.mod h1:7ArFNvsTjH8GMMzB4uy1snslv2BwmginuMs06a1uzZE= -github.com/google/go-cmp v0.3.0/go.mod h1:8QqcDgzrUqlUb/G2PQTWiueGozuR1884gddMywk6iLU= -github.com/google/go-cmp v0.3.1/go.mod h1:8QqcDgzrUqlUb/G2PQTWiueGozuR1884gddMywk6iLU= -github.com/google/go-cmp v0.4.0/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/gNBxE= -github.com/google/go-cmp v0.5.9 h1:O2Tfq5qg4qc4AmwVlvv0oLiVAGB7enBSJ2x2DqQFi38= -github.com/google/go-cmp v0.5.9/go.mod h1:17dUlkBOakJ0+DkrSSNjCkIjxS6bF9zb3elmeNGIjoY= -github.com/google/subcommands v1.2.0/go.mod h1:ZjhPrFU+Olkh9WazFPsl27BQ4UPiG37m3yTrtFlrHVk= -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/hashicorp/errwrap v1.0.0/go.mod h1:YH+1FKiLXxHSkmPseP+kNlulaMuP3n2brvKWEqk/Jc4= -github.com/hashicorp/errwrap v1.1.0 h1:OxrOeh75EUXMY8TBjag2fzXGZ40LB6IKw45YeGUDY2I= -github.com/hashicorp/errwrap v1.1.0/go.mod h1:YH+1FKiLXxHSkmPseP+kNlulaMuP3n2brvKWEqk/Jc4= -github.com/hashicorp/go-multierror v1.1.1 h1:H5DkEtf6CXdFp0N0Em5UCwQpXMWke8IA0+lD48awMYo= -github.com/hashicorp/go-multierror v1.1.1/go.mod h1:iw975J/qwKPdAO1clOe2L8331t/9/fmwbPZ6JB6eMoM= -github.com/hashicorp/golang-lru v1.0.2 h1:dV3g9Z/unq5DpblPpw+Oqcv4dU/1omnb4Ok8iPY6p1c= -github.com/hashicorp/golang-lru v1.0.2/go.mod h1:iADmTwqILo4mZ8BN3D2Q6+9jd8WM5uGBxy+E8yxSoD4= -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= -github.com/holiman/uint256 v1.2.4/go.mod h1:EOMSn4q6Nyt9P6efbI3bueV4e1b3dGlUCXeiRV4ng7E= -github.com/hpcloud/tail v1.0.0/go.mod h1:ab1qPbhIpdTxEkNHXyeSf5vhxWSCs/tWer42PpOxQnU= -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.1 h1:NE3C767s2ak2bweCZo3+rdP4U/HoyVXLv/X9f2gPS5g= -github.com/klauspost/compress v1.17.1/go.mod h1:ntbaceVETuRiXiv4DpjP66DpAtAGkEQskQzEyD//IeE= -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= -github.com/kr/text v0.2.0/go.mod h1:eLer722TekiGuMkidMxC/pM04lWEeraHUUmBw8l2grE= -github.com/kylelemons/godebug v1.1.0 h1:RPNrshWIDI6G2gRW9EHilWtl7Z6Sb1BR0xunSBf0SNc= -github.com/kylelemons/godebug v1.1.0/go.mod h1:9/0rRGxNHcop5bhtWyNeEfOS8JIWk580+fNqagV/RAw= -github.com/leanovate/gopter v0.2.9 h1:fQjYxZaynp97ozCzfOyOuAGOU4aU/z37zf/tOujFk7c= -github.com/leanovate/gopter v0.2.9/go.mod h1:U2L/78B+KVFIx2VmW6onHJQzXtFb+p5y3y2Sh+Jxxv8= -github.com/mattn/go-runewidth v0.0.9/go.mod h1:H031xJmbD/WCDINGzjvQ9THkh0rPKHF+m2gUSrubnMI= -github.com/mattn/go-runewidth v0.0.15 h1:UNAjwbU9l54TA3KzvqLGxwWjHmMgBUVhBiTjelZgg3U= -github.com/mattn/go-runewidth v0.0.15/go.mod h1:Jdepj2loyihRzMpdS35Xk/zdY8IAYHsh153qUoGf23w= -github.com/matttproud/golang_protobuf_extensions/v2 v2.0.0 h1:jWpvCLoY8Z/e3VKvlsiIGKtc+UG6U5vzxaoagmhXfyg= -github.com/matttproud/golang_protobuf_extensions/v2 v2.0.0/go.mod h1:QUyp042oQthUoa9bqDv0ER0wrtXnBruoNd7aNjkbP+k= -github.com/mmcloughlin/addchain v0.4.0 h1:SobOdjm2xLj1KkXN5/n0xTIWyZA2+s99UCY1iPfkHRY= -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 h1:DQuhQpB1tVlglWS2hLQ5OV6B5r8aGxSrPc5Qo6uTN78= -github.com/nxadm/tail v1.4.4/go.mod h1:kenIhsEOeOJmVchQTgglprH7qJGnHDVpk1VPCcaMI8A= -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= -github.com/onsi/ginkgo v1.12.1/go.mod h1:zj2OWP4+oCPe1qIXoGWkgMRwljMUYCdkwsT2108oapk= -github.com/onsi/ginkgo v1.14.0 h1:2mOpI4JVVPBN+WQRa0WKH2eXR+Ey+uK4n7Zj0aYpIQA= -github.com/onsi/ginkgo v1.14.0/go.mod h1:iSB4RoI2tjJc9BBv4NKIKWKya62Rps+oPG/Lv9klQyY= -github.com/onsi/gomega v1.7.1/go.mod h1:XdKZgCCFLUoM/7CFJVPcG8C1xQ1AJ0vpAezJrB7JYyY= -github.com/onsi/gomega v1.10.1 h1:o0+MgICZLuZ7xjH7Vx6zS/zcu93/BEp1VwkIW1mEXCE= -github.com/onsi/gomega v1.10.1/go.mod h1:iN09h71vgCQne3DLsj+A5owkum+a2tYe+TOCB1ybHNo= -github.com/pingcap/errors v0.11.4 h1:lFuQV/oaUMGcD2tqt+01ROSmJs75VG1ToEOkZIZ4nE4= -github.com/pingcap/errors v0.11.4/go.mod h1:Oi8TUi2kEtXXLMJk9l1cGmz20kV3TaQ0usTwv5KuLY8= -github.com/pkg/diff v0.0.0-20210226163009-20ebb0f2a09e/go.mod h1:pJLUxLENpZxwdsKMEsNbx1VGcRFpLqf3715MtcvvzbA= -github.com/pkg/errors v0.9.1 h1:FEBLx1zS214owpjy7qsBeixbURkuhQAwrK5UwLGTwt4= -github.com/pkg/errors v0.9.1/go.mod h1:bwawxfHBFNV+L2hUp1rHADufV3IMtnDRdf1r5NINEl0= -github.com/pmezard/go-difflib v1.0.0 h1:4DBwDE0NGyQoBHbLQYPwSUPoCMWR5BEzIk/f1lZbAQM= -github.com/pmezard/go-difflib v1.0.0/go.mod h1:iKH77koFhYxTK1pcRnkKkqfTogsbg7gZNVY4sRDYZ/4= -github.com/prometheus/client_golang v1.17.0 h1:rl2sfwZMtSthVU752MqfjQozy7blglC+1SOtjMAMh+Q= -github.com/prometheus/client_golang v1.17.0/go.mod h1:VeL+gMmOAxkS2IqfCq0ZmHSL+LjWfWDUmp1mBz9JgUY= -github.com/prometheus/client_model v0.5.0 h1:VQw1hfvPvk3Uv6Qf29VrPF32JB6rtbgI6cYPYQjL0Qw= -github.com/prometheus/client_model v0.5.0/go.mod h1:dTiFglRmd66nLR9Pv9f0mZi7B7fk5Pm3gvsjB5tr+kI= -github.com/prometheus/common v0.45.0 h1:2BGz0eBc2hdMDLnO/8n0jeB3oPrt2D08CekT0lneoxM= -github.com/prometheus/common v0.45.0/go.mod h1:YJmSTw9BoKxJplESWWxlbyttQR4uaEcGyv9MZjVOJsY= -github.com/prometheus/procfs v0.12.0 h1:jluTpSng7V9hY0O2R9DzzJHYb2xULk9VTR1V1R/k6Bo= -github.com/prometheus/procfs v0.12.0/go.mod h1:pcuDEFsWDnvcgNzo4EEweacyhjeA9Zk3cnaOZAZEfOo= -github.com/redis/go-redis/v9 v9.2.1 h1:WlYJg71ODF0dVspZZCpYmoF1+U1Jjk9Rwd7pq6QmlCg= -github.com/redis/go-redis/v9 v9.2.1/go.mod h1:hdY0cQFCN4fnSYT6TkisLufl/4W5UIXyv0b/CLO2V2M= -github.com/redis/rueidis v1.0.19 h1:s65oWtotzlIFN8eMPhyYwxlwLR1lUdhza2KtWprKYSo= -github.com/redis/rueidis v1.0.19/go.mod h1:8B+r5wdnjwK3lTFml5VtxjzGOQAC+5UmujoD12pDrEo= -github.com/rivo/uniseg v0.2.0/go.mod h1:J6wj4VEh+S6ZtnVlnTBMWIodfgj8LQOQFoIToxlJtxc= -github.com/rivo/uniseg v0.4.4 h1:8TfxU8dW6PdqD27gjM8MVNuicgxIjxpm4K7x4jp8sis= -github.com/rivo/uniseg v0.4.4/go.mod h1:FN3SvrM+Zdj16jyLfmOkMNblXMcoc8DfTHruCPUcx88= -github.com/rogpeppe/go-internal v1.9.0/go.mod h1:WtVeX8xhTBvf0smdhujwtBcq4Qrzq/fJaraNFVN+nFs= -github.com/rogpeppe/go-internal v1.11.0 h1:cWPaGQEPrBb5/AsnsZesgZZ9yb1OQ+GOISoDNXVBh4M= -github.com/rogpeppe/go-internal v1.11.0/go.mod h1:ddIwULY96R17DhadqLgMfk9H9tvdUzkipdSkR5nkCZA= -github.com/rs/cors v1.10.1 h1:L0uuZVXIKlI1SShY2nhFfo44TYvDPQ1w4oFkUJNfhyo= -github.com/rs/cors v1.10.1/go.mod h1:XyqrcTp5zjWr1wsJ8PIRZssZ8b/WMcMf71DJnit4EMU= -github.com/shirou/gopsutil v3.21.11+incompatible h1:+1+c1VGhc88SSonWP6foOcLhvnKlUeu/erjjvaPEYiI= -github.com/shirou/gopsutil v3.21.11+incompatible/go.mod h1:5b4v6he4MtMOwMlS0TUMTu2PcXUg8+E1lC7eC3UO/RA= -github.com/stretchr/objx v0.1.0/go.mod h1:HFkY916IF+rwdDfMAkV7OtwuqBVzrE8GR6GFx+wExME= -github.com/stretchr/testify v1.3.0/go.mod h1:M5WIy9Dh21IEIfnGCwXGc5bZfKNJtfHm1UVUgZn+9EI= -github.com/stretchr/testify v1.7.0/go.mod h1:6Fq8oRcR53rry900zMqJjRRixrwX3KX962/h/Wwjteg= -github.com/stretchr/testify v1.8.4 h1:CcVxjf3Q8PM0mHUKJCdn+eZZtm5yQwehR5yeSVQQcUk= -github.com/stretchr/testify v1.8.4/go.mod h1:sz/lmYIOXD/1dqDmKjjqLyZ2RngseejIcXlSw2iwfAo= -github.com/stvp/tempredis v0.0.0-20181119212430-b82af8480203 h1:QVqDTf3h2WHt08YuiTGPZLls0Wq99X9bWd0Q5ZSBesM= -github.com/stvp/tempredis v0.0.0-20181119212430-b82af8480203/go.mod h1:oqN97ltKNihBbwlX8dLpwxCl3+HnXKV/R0e+sRLd9C8= -github.com/supranational/blst v0.3.11 h1:LyU6FolezeWAhvQk0k6O/d49jqgO52MSDDfYgbeoEm4= -github.com/supranational/blst v0.3.11/go.mod h1:jZJtfjgudtNl4en1tzwPIV3KjUnQUvG3/j+w+fVonLw= -github.com/syndtr/goleveldb v1.0.1-0.20210819022825-2ae1ddf74ef7 h1:epCh84lMvA70Z7CTTCmYQn2CKbY8j86K7/FAIr141uY= -github.com/syndtr/goleveldb v1.0.1-0.20210819022825-2ae1ddf74ef7/go.mod h1:q4W45IWZaF22tdD+VEXcAWRA037jwmWEB5VWYORlTpc= -github.com/tklauser/go-sysconf v0.3.12 h1:0QaGUFOdQaIVdPgfITYzaTegZvdCjmYO52cSFAEVmqU= -github.com/tklauser/go-sysconf v0.3.12/go.mod h1:Ho14jnntGE1fpdOqQEEaiKRpvIavV0hSfmBq8nJbHYI= -github.com/tklauser/numcpus v0.6.1 h1:ng9scYS7az0Bk4OZLvrNXNSAO2Pxr1XXRAPyjhIx+Fk= -github.com/tklauser/numcpus v0.6.1/go.mod h1:1XfjsgE2zo8GVw7POkMbHENHzVg3GzmoZ9fESEdAacY= -github.com/xaionaro-go/weightedshuffle v0.0.0-20211213010739-6a74fbc7d24a h1:WS5nQycV+82Ndezq0UcMcGVG416PZgcJPqI/bLM824A= -github.com/xaionaro-go/weightedshuffle v0.0.0-20211213010739-6a74fbc7d24a/go.mod h1:0KAUfC65le2kMu4fnBxm7Xj3PkQ3MBpJbF5oMmqufBc= -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/gopher-lua v1.1.0 h1:BojcDhfyDWgU2f2TOzYK/g5p2gxMrku8oupLDqlnSqE= -github.com/yuin/gopher-lua v1.1.0/go.mod h1:GBR0iDaNXjAgGg9zfCvksxSRnQx76gclCIb7kdAd1Pw= -github.com/yusufpapurcu/wmi v1.2.3 h1:E1ctvB7uKFMOJw3fdOW32DwGE9I7t++CRUEMKvFoFiw= -github.com/yusufpapurcu/wmi v1.2.3/go.mod h1:SBZ9tNy3G9/m5Oi98Zks0QjeHVDvuK0qfxQmPyzfmi0= -golang.org/x/crypto v0.0.0-20190308221718-c2843e01d9a2/go.mod h1:djNgcEr1/C05ACkg1iLfiJU5Ep61QUkGW8qpdssI0+w= -golang.org/x/crypto v0.0.0-20191011191535-87dc89f01550/go.mod h1:yigFU9vqHzYiE8UmvKecakEJjdnWj3jj499lnFckfCI= -golang.org/x/crypto v0.0.0-20200622213623-75b288015ac9/go.mod h1:LzIPMQfyMNhhGPhUkYOs5KpL4U8rLKemX1yGLhDgUto= -golang.org/x/crypto v0.17.0 h1:r8bRNjWL3GshPW3gkd+RpvzWrZAwPS49OmTGZ/uhM4k= -golang.org/x/crypto v0.17.0/go.mod h1:gCAAfMLgwOJRpTjQ2zCCt2OcSfYMTeZVSRtQlPC7Nq4= -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/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.14.0 h1:dGoOF9QVLYng8IHTm7BAyWqCqSheQ5pYWGhzW00YJr0= -golang.org/x/mod v0.14.0/go.mod h1:hTbmBsO62+eylJbnUtE2MGJUyE7QWk4xUqPFrRgJ+7c= -golang.org/x/net v0.0.0-20180906233101-161cd47e91fd/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4= -golang.org/x/net v0.0.0-20190404232315-eb5bcb51f2a3/go.mod h1:t9HGtf8HONx5eT2rtn7q6eTqICYqUVnKs3thJo3Qplg= -golang.org/x/net v0.0.0-20190620200207-3b0461eec859/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s= -golang.org/x/net v0.0.0-20200226121028-0de0cce0169b/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s= -golang.org/x/net v0.0.0-20200520004742-59133d7f0dd7/go.mod h1:qpuaurCH72eLCgpAm/N6yyVIVM9cpaDIP3A8BGJEC5A= -golang.org/x/net v0.0.0-20200813134508-3edf25e44fcc/go.mod h1:/O7V0waA8r7cgGh81Ro3o1hOxt32SMVPicZroKQ2sZA= -golang.org/x/net v0.0.0-20201021035429-f5854403a974/go.mod h1:sp8m0HH+o8qH0wwXwYZr8TS3Oi6o0r6Gce1SSxlDquU= -golang.org/x/net v0.18.0 h1:mIYleuAkSbHh0tCv7RvjL3F6ZVbLjq4+R7zbOn3Kokg= -golang.org/x/net v0.18.0/go.mod h1:/czyP5RqHAH4odGYxBJ1qz0+CE5WZ+2j1YgoEo8F2jQ= -golang.org/x/sync v0.0.0-20180314180146-1d60e4601c6f/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= -golang.org/x/sync v0.0.0-20190423024810-112230192c58/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= -golang.org/x/sync v0.0.0-20190911185100-cd5d95a43a6e/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= -golang.org/x/sync v0.0.0-20201020160332-67f06af15bc9/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= -golang.org/x/sync v0.5.0 h1:60k92dhOjHxJkrqnwsfl8KuaHbn/5dl0lUPUklKo3qE= -golang.org/x/sync v0.5.0/go.mod h1:Czt+wKu1gCyEFDUtn0jG5QVvpJ6rzVqr5aXyt9drQfk= -golang.org/x/sys v0.0.0-20180909124046-d0be0721c37e/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= -golang.org/x/sys v0.0.0-20190215142949-d0b11bdaac8a/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= -golang.org/x/sys v0.0.0-20190412213103-97732733099d/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20190904154756-749cb33beabd/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20190916202348-b4ddaad3f8a3/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20191005200804-aed5e4c7ecf9/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20191120155948-bd437916bb0e/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20200323222414-85ca7c5b95cd/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20200519105757-fe76b779f299/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20200814200057-3d37ad5750ed/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20200930185726-fdedc70b468f/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -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.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= -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/tools v0.0.0-20180917221912-90fa682c2a6e/go.mod h1:n7NCudcB/nEzxVGmLbDWY5pfWTLqBcC2KZ6jyYvM4mQ= -golang.org/x/tools v0.0.0-20191119224855-298f0cb1881e/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo= -golang.org/x/tools v0.0.0-20200619180055-7c47624df98f/go.mod h1:EkVYQZoAsY45+roYkvgYkIh4xh/qjgUK9TdY2XT94GE= -golang.org/x/tools v0.0.0-20210106214847-113979e3529a/go.mod h1:emZCQorbCU4vsT4fOWvOPXz4eW1wZW4PmDk9uLelYpA= -golang.org/x/tools v0.15.0 h1:zdAyfUGbYmuVokhzVmghFl2ZJh5QhcfebBgmVPFYA+8= -golang.org/x/tools v0.15.0/go.mod h1:hpksKq4dtpQWS1uQ61JkdqWM3LscIS6Slf+VVkm+wQk= -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= -golang.org/x/xerrors v0.0.0-20200804184101-5ec99f83aff1 h1:go1bK/D/BFZV2I8cIQd1NKEZ+0owSTG1fDTci4IqFcE= -golang.org/x/xerrors v0.0.0-20200804184101-5ec99f83aff1/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0= -google.golang.org/protobuf v0.0.0-20200109180630-ec00e32a8dfd/go.mod h1:DFci5gLYBciE7Vtevhsrf46CRTquxDuWsQurQQe4oz8= -google.golang.org/protobuf v0.0.0-20200221191635-4d8936d0db64/go.mod h1:kwYJMbMJ01Woi6D6+Kah6886xMZcty6N08ah7+eCXa0= -google.golang.org/protobuf v0.0.0-20200228230310-ab0ca4ff8a60/go.mod h1:cfTl7dwQJ+fmap5saPgwCLgHXTUD7jkjRqWcaiX5VyM= -google.golang.org/protobuf v1.20.1-0.20200309200217-e05f789c0967/go.mod h1:A+miEFZTKqfCUM6K7xSMQL9OKL/b6hQv+e19PK+JZNE= -google.golang.org/protobuf v1.21.0/go.mod h1:47Nbq4nVaFHyn7ilMalzfO3qCViNmqZ2kzikPIcrTAo= -google.golang.org/protobuf v1.23.0/go.mod h1:EGpADcykh3NcUnDUJcl1+ZksZNG86OlYog2l/sGQquU= -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= -gopkg.in/fsnotify.v1 v1.4.7/go.mod h1:Tz8NjZHkW78fSQdbUxIjBTcgA1z1m8ZHf0WmKUhAMys= -gopkg.in/tomb.v1 v1.0.0-20141024135613-dd632973f1e7 h1:uRGJdciOHaEIrze2W8Q3AKkepLTh2hOroT7a+7czfdQ= -gopkg.in/tomb.v1 v1.0.0-20141024135613-dd632973f1e7/go.mod h1:dt/ZhP58zS4L8KSrWDmTeBkI65Dw0HsyUHuEVlX15mw= -gopkg.in/yaml.v2 v2.2.4/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI= -gopkg.in/yaml.v2 v2.3.0/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI= -gopkg.in/yaml.v2 v2.4.0 h1:D8xgwECY7CYvx+Y2n4sBz93Jn9JRvxdiyyo8CTfuKaY= -gopkg.in/yaml.v2 v2.4.0/go.mod h1:RDklbk79AGWmwhnvt/jBztapEOGDOx6ZbXqjP6csGnQ= -gopkg.in/yaml.v3 v3.0.0-20200313102051-9f266ea9e77c/go.mod h1:K4uyk7z7BCEPqu6E+C64Yfv1cQ7kz7rIZviUmN+EgEM= -gopkg.in/yaml.v3 v3.0.1 h1:fxVm/GzAzEWqLHuvctI91KS9hhNmmWOoWu0XTYJS7CA= -gopkg.in/yaml.v3 v3.0.1/go.mod h1:K4uyk7z7BCEPqu6E+C64Yfv1cQ7kz7rIZviUmN+EgEM= -rsc.io/tmplfunc v0.0.3 h1:53XFQh69AfOa8Tw0Jm7t+GV7KZhOi6jzsCzTtKbMvzU= -rsc.io/tmplfunc v0.0.3/go.mod h1:AG3sTPzElb1Io3Yg4voV9AGZJuleGAwaVRxL9M49PhA= diff --git a/proxyd/integration_tests/batch_timeout_test.go b/proxyd/integration_tests/batch_timeout_test.go deleted file mode 100644 index 4906c1d07e66..000000000000 --- a/proxyd/integration_tests/batch_timeout_test.go +++ /dev/null @@ -1,42 +0,0 @@ -package integration_tests - -import ( - "net/http" - "os" - "testing" - "time" - - "github.com/ethereum-optimism/optimism/proxyd" - "github.com/stretchr/testify/require" -) - -const ( - batchTimeoutResponse = `{"error":{"code":-32015,"message":"gateway timeout"},"id":null,"jsonrpc":"2.0"}` -) - -func TestBatchTimeout(t *testing.T) { - slowBackend := NewMockBackend(nil) - defer slowBackend.Close() - - require.NoError(t, os.Setenv("SLOW_BACKEND_RPC_URL", slowBackend.URL())) - - config := ReadConfig("batch_timeout") - client := NewProxydClient("http://127.0.0.1:8545") - _, shutdown, err := proxyd.Start(config) - require.NoError(t, err) - defer shutdown() - - slowBackend.SetHandler(http.HandlerFunc(func(w http.ResponseWriter, r *http.Request) { - // check the config. The sleep duration should be at least double the server.timeout_seconds config to prevent flakes - time.Sleep(time.Second * 2) - BatchedResponseHandler(200, goodResponse)(w, r) - })) - res, statusCode, err := client.SendBatchRPC( - NewRPCReq("1", "eth_chainId", nil), - NewRPCReq("1", "eth_chainId", nil), - ) - require.NoError(t, err) - require.Equal(t, 504, statusCode) - RequireEqualJSON(t, []byte(batchTimeoutResponse), res) - require.Equal(t, 1, len(slowBackend.Requests())) -} diff --git a/proxyd/integration_tests/batching_test.go b/proxyd/integration_tests/batching_test.go deleted file mode 100644 index c1f8b386d09a..000000000000 --- a/proxyd/integration_tests/batching_test.go +++ /dev/null @@ -1,188 +0,0 @@ -package integration_tests - -import ( - "net/http" - "os" - "testing" - - "github.com/ethereum-optimism/optimism/proxyd" - "github.com/stretchr/testify/require" -) - -func TestBatching(t *testing.T) { - config := ReadConfig("batching") - - chainIDResponse1 := `{"jsonrpc": "2.0", "result": "hello1", "id": 1}` - chainIDResponse2 := `{"jsonrpc": "2.0", "result": "hello2", "id": 2}` - chainIDResponse3 := `{"jsonrpc": "2.0", "result": "hello3", "id": 3}` - netVersionResponse1 := `{"jsonrpc": "2.0", "result": "1.0", "id": 1}` - callResponse1 := `{"jsonrpc": "2.0", "result": "ekans1", "id": 1}` - - ethAccountsResponse2 := `{"jsonrpc": "2.0", "result": [], "id": 2}` - - backendResTooLargeResponse1 := `{"error":{"code":-32020,"message":"backend response too large"},"id":1,"jsonrpc":"2.0"}` - backendResTooLargeResponse2 := `{"error":{"code":-32020,"message":"backend response too large"},"id":2,"jsonrpc":"2.0"}` - - type mockResult struct { - method string - id string - result interface{} - } - - chainIDMock1 := mockResult{"eth_chainId", "1", "hello1"} - chainIDMock2 := mockResult{"eth_chainId", "2", "hello2"} - chainIDMock3 := mockResult{"eth_chainId", "3", "hello3"} - netVersionMock1 := mockResult{"net_version", "1", "1.0"} - callMock1 := mockResult{"eth_call", "1", "ekans1"} - - tests := []struct { - name string - handler http.Handler - mocks []mockResult - reqs []*proxyd.RPCReq - expectedRes string - maxUpstreamBatchSize int - numExpectedForwards int - maxResponseSizeBytes int64 - }{ - { - name: "backend returns batches out of order", - mocks: []mockResult{chainIDMock1, chainIDMock2, chainIDMock3}, - reqs: []*proxyd.RPCReq{ - NewRPCReq("1", "eth_chainId", nil), - NewRPCReq("2", "eth_chainId", nil), - NewRPCReq("3", "eth_chainId", nil), - }, - expectedRes: asArray(chainIDResponse1, chainIDResponse2, chainIDResponse3), - maxUpstreamBatchSize: 2, - numExpectedForwards: 2, - }, - { - // infura behavior - name: "backend returns single RPC response object as error", - handler: SingleResponseHandler(500, `{"jsonrpc":"2.0","error":{"code":-32001,"message":"internal server error"},"id":1}`), - reqs: []*proxyd.RPCReq{ - NewRPCReq("1", "eth_chainId", nil), - NewRPCReq("2", "eth_chainId", nil), - }, - expectedRes: asArray( - `{"error":{"code":-32011,"message":"no backends available for method"},"id":1,"jsonrpc":"2.0"}`, - `{"error":{"code":-32011,"message":"no backends available for method"},"id":2,"jsonrpc":"2.0"}`, - ), - maxUpstreamBatchSize: 10, - numExpectedForwards: 1, - }, - { - name: "backend returns single RPC response object for minibatches", - handler: SingleResponseHandler(500, `{"jsonrpc":"2.0","error":{"code":-32001,"message":"internal server error"},"id":1}`), - reqs: []*proxyd.RPCReq{ - NewRPCReq("1", "eth_chainId", nil), - NewRPCReq("2", "eth_chainId", nil), - }, - expectedRes: asArray( - `{"error":{"code":-32011,"message":"no backends available for method"},"id":1,"jsonrpc":"2.0"}`, - `{"error":{"code":-32011,"message":"no backends available for method"},"id":2,"jsonrpc":"2.0"}`, - ), - maxUpstreamBatchSize: 1, - numExpectedForwards: 2, - }, - { - name: "duplicate request ids are on distinct batches", - mocks: []mockResult{ - netVersionMock1, - chainIDMock2, - chainIDMock1, - callMock1, - }, - reqs: []*proxyd.RPCReq{ - NewRPCReq("1", "net_version", nil), - NewRPCReq("2", "eth_chainId", nil), - NewRPCReq("1", "eth_chainId", nil), - NewRPCReq("1", "eth_call", nil), - }, - expectedRes: asArray(netVersionResponse1, chainIDResponse2, chainIDResponse1, callResponse1), - maxUpstreamBatchSize: 2, - numExpectedForwards: 3, - }, - { - name: "over max size", - mocks: []mockResult{}, - reqs: []*proxyd.RPCReq{ - NewRPCReq("1", "net_version", nil), - NewRPCReq("2", "eth_chainId", nil), - NewRPCReq("3", "eth_chainId", nil), - NewRPCReq("4", "eth_call", nil), - NewRPCReq("5", "eth_call", nil), - NewRPCReq("6", "eth_call", nil), - }, - expectedRes: "{\"error\":{\"code\":-32014,\"message\":\"over batch size custom message\"},\"id\":null,\"jsonrpc\":\"2.0\"}", - maxUpstreamBatchSize: 2, - numExpectedForwards: 0, - }, - { - name: "eth_accounts does not get forwarded", - mocks: []mockResult{ - callMock1, - }, - reqs: []*proxyd.RPCReq{ - NewRPCReq("1", "eth_call", nil), - NewRPCReq("2", "eth_accounts", nil), - }, - expectedRes: asArray(callResponse1, ethAccountsResponse2), - maxUpstreamBatchSize: 2, - numExpectedForwards: 1, - }, - { - name: "large upstream response gets dropped", - mocks: []mockResult{chainIDMock1, chainIDMock2}, - reqs: []*proxyd.RPCReq{ - NewRPCReq("1", "eth_chainId", nil), - NewRPCReq("2", "eth_chainId", nil), - }, - expectedRes: asArray(backendResTooLargeResponse1, backendResTooLargeResponse2), - maxUpstreamBatchSize: 2, - numExpectedForwards: 1, - maxResponseSizeBytes: 1, - }, - } - - for _, tt := range tests { - t.Run(tt.name, func(t *testing.T) { - config.Server.MaxUpstreamBatchSize = tt.maxUpstreamBatchSize - config.BackendOptions.MaxResponseSizeBytes = tt.maxResponseSizeBytes - - handler := tt.handler - if handler == nil { - router := NewBatchRPCResponseRouter() - for _, mock := range tt.mocks { - router.SetRoute(mock.method, mock.id, mock.result) - } - handler = router - } - - goodBackend := NewMockBackend(handler) - defer goodBackend.Close() - require.NoError(t, os.Setenv("GOOD_BACKEND_RPC_URL", goodBackend.URL())) - - client := NewProxydClient("http://127.0.0.1:8545") - _, shutdown, err := proxyd.Start(config) - require.NoError(t, err) - defer shutdown() - - res, statusCode, err := client.SendBatchRPC(tt.reqs...) - require.NoError(t, err) - require.Equal(t, http.StatusOK, statusCode) - RequireEqualJSON(t, []byte(tt.expectedRes), res) - - if tt.numExpectedForwards != 0 { - require.Equal(t, tt.numExpectedForwards, len(goodBackend.Requests())) - } - - if handler, ok := handler.(*BatchRPCResponseRouter); ok { - for i, mock := range tt.mocks { - require.Equal(t, 1, handler.GetNumCalls(mock.method, mock.id), i) - } - } - }) - } -} diff --git a/proxyd/integration_tests/caching_test.go b/proxyd/integration_tests/caching_test.go deleted file mode 100644 index e74b85b4a7bf..000000000000 --- a/proxyd/integration_tests/caching_test.go +++ /dev/null @@ -1,275 +0,0 @@ -package integration_tests - -import ( - "bytes" - "fmt" - "os" - "testing" - "time" - - "github.com/alicebob/miniredis" - "github.com/ethereum-optimism/optimism/proxyd" - "github.com/stretchr/testify/require" -) - -func TestCaching(t *testing.T) { - redis, err := miniredis.Run() - require.NoError(t, err) - defer redis.Close() - - hdlr := NewBatchRPCResponseRouter() - /* cacheable */ - hdlr.SetRoute("eth_chainId", "999", "0x420") - hdlr.SetRoute("net_version", "999", "0x1234") - hdlr.SetRoute("eth_getBlockTransactionCountByHash", "999", "eth_getBlockTransactionCountByHash") - hdlr.SetRoute("eth_getBlockByHash", "999", "eth_getBlockByHash") - hdlr.SetRoute("eth_getTransactionByHash", "999", "eth_getTransactionByHash") - hdlr.SetRoute("eth_getTransactionByBlockHashAndIndex", "999", "eth_getTransactionByBlockHashAndIndex") - hdlr.SetRoute("eth_getUncleByBlockHashAndIndex", "999", "eth_getUncleByBlockHashAndIndex") - hdlr.SetRoute("eth_getTransactionReceipt", "999", "eth_getTransactionReceipt") - hdlr.SetRoute("debug_getRawReceipts", "999", "debug_getRawReceipts") - /* not cacheable */ - hdlr.SetRoute("eth_getBlockByNumber", "999", "eth_getBlockByNumber") - hdlr.SetRoute("eth_blockNumber", "999", "eth_blockNumber") - hdlr.SetRoute("eth_call", "999", "eth_call") - - backend := NewMockBackend(hdlr) - defer backend.Close() - - require.NoError(t, os.Setenv("GOOD_BACKEND_RPC_URL", backend.URL())) - require.NoError(t, os.Setenv("REDIS_URL", fmt.Sprintf("redis://127.0.0.1:%s", redis.Port()))) - config := ReadConfig("caching") - client := NewProxydClient("http://127.0.0.1:8545") - _, shutdown, err := proxyd.Start(config) - require.NoError(t, err) - defer shutdown() - - // allow time for the block number fetcher to fire - time.Sleep(1500 * time.Millisecond) - - tests := []struct { - method string - params []interface{} - response string - backendCalls int - }{ - /* cacheable */ - { - "eth_chainId", - nil, - "{\"jsonrpc\": \"2.0\", \"result\": \"0x420\", \"id\": 999}", - 1, - }, - { - "net_version", - nil, - "{\"jsonrpc\": \"2.0\", \"result\": \"0x1234\", \"id\": 999}", - 1, - }, - { - "eth_getBlockTransactionCountByHash", - []interface{}{"0xb903239f8543d04b5dc1ba6579132b143087c68db1b2168786408fcbce568238"}, - "{\"jsonrpc\": \"2.0\", \"result\": \"eth_getBlockTransactionCountByHash\", \"id\": 999}", - 1, - }, - { - "eth_getBlockByHash", - []interface{}{"0xc6ef2fc5426d6ad6fd9e2a26abeab0aa2411b7ab17f30a99d3cb96aed1d1055b", "false"}, - "{\"jsonrpc\": \"2.0\", \"result\": \"eth_getBlockByHash\", \"id\": 999}", - 1, - }, - { - "eth_getTransactionByBlockHashAndIndex", - []interface{}{"0xe670ec64341771606e55d6b4ca35a1a6b75ee3d5145a99d05921026d1527331", "0x55"}, - "{\"jsonrpc\": \"2.0\", \"result\": \"eth_getTransactionByBlockHashAndIndex\", \"id\": 999}", - 1, - }, - { - "eth_getUncleByBlockHashAndIndex", - []interface{}{"0xb903239f8543d04b5dc1ba6579132b143087c68db1b2168786408fcbce568238", "0x90"}, - "{\"jsonrpc\": \"2.0\", \"result\": \"eth_getUncleByBlockHashAndIndex\", \"id\": 999}", - 1, - }, - /* not cacheable */ - { - "eth_getBlockByNumber", - []interface{}{ - "0x1", - true, - }, - "{\"jsonrpc\": \"2.0\", \"result\": \"eth_getBlockByNumber\", \"id\": 999}", - 2, - }, - { - "eth_getTransactionReceipt", - []interface{}{"0x85d995eba9763907fdf35cd2034144dd9d53ce32cbec21349d4b12823c6860c5"}, - "{\"jsonrpc\": \"2.0\", \"result\": \"eth_getTransactionReceipt\", \"id\": 999}", - 2, - }, - { - "eth_getTransactionByHash", - []interface{}{"0x88df016429689c079f3b2f6ad39fa052532c56795b733da78a91ebe6a713944b"}, - "{\"jsonrpc\": \"2.0\", \"result\": \"eth_getTransactionByHash\", \"id\": 999}", - 2, - }, - { - "eth_call", - []interface{}{ - struct { - To string `json:"to"` - }{ - "0x1234", - }, - "0x60", - }, - "{\"jsonrpc\": \"2.0\", \"result\": \"eth_call\", \"id\": 999}", - 2, - }, - { - "eth_blockNumber", - nil, - "{\"jsonrpc\": \"2.0\", \"result\": \"eth_blockNumber\", \"id\": 999}", - 2, - }, - { - "eth_call", - []interface{}{ - struct { - To string `json:"to"` - }{ - "0x1234", - }, - "latest", - }, - "{\"jsonrpc\": \"2.0\", \"result\": \"eth_call\", \"id\": 999}", - 2, - }, - { - "eth_call", - []interface{}{ - struct { - To string `json:"to"` - }{ - "0x1234", - }, - "pending", - }, - "{\"jsonrpc\": \"2.0\", \"result\": \"eth_call\", \"id\": 999}", - 2, - }, - } - for _, tt := range tests { - t.Run(tt.method, func(t *testing.T) { - resRaw, _, err := client.SendRPC(tt.method, tt.params) - require.NoError(t, err) - resCache, _, err := client.SendRPC(tt.method, tt.params) - require.NoError(t, err) - RequireEqualJSON(t, []byte(tt.response), resCache) - RequireEqualJSON(t, resRaw, resCache) - require.Equal(t, tt.backendCalls, countRequests(backend, tt.method)) - backend.Reset() - }) - } - - t.Run("nil responses should not be cached", func(t *testing.T) { - hdlr.SetRoute("eth_getBlockByHash", "999", nil) - resRaw, _, err := client.SendRPC("eth_getBlockByHash", []interface{}{"0x123"}) - require.NoError(t, err) - resCache, _, err := client.SendRPC("eth_getBlockByHash", []interface{}{"0x123"}) - require.NoError(t, err) - RequireEqualJSON(t, []byte("{\"id\":999,\"jsonrpc\":\"2.0\",\"result\":null}"), resRaw) - RequireEqualJSON(t, resRaw, resCache) - require.Equal(t, 2, countRequests(backend, "eth_getBlockByHash")) - }) - - t.Run("debug_getRawReceipts with 0 receipts should not be cached", func(t *testing.T) { - backend.Reset() - hdlr.SetRoute("debug_getRawReceipts", "999", []string{}) - resRaw, _, err := client.SendRPC("debug_getRawReceipts", []interface{}{"0x88420081ab9c6d50dc57af36b541c6b8a7b3e9c0d837b0414512c4c5883560ff"}) - require.NoError(t, err) - resCache, _, err := client.SendRPC("debug_getRawReceipts", []interface{}{"0x88420081ab9c6d50dc57af36b541c6b8a7b3e9c0d837b0414512c4c5883560ff"}) - require.NoError(t, err) - RequireEqualJSON(t, []byte("{\"id\":999,\"jsonrpc\":\"2.0\",\"result\":[]}"), resRaw) - RequireEqualJSON(t, resRaw, resCache) - require.Equal(t, 2, countRequests(backend, "debug_getRawReceipts")) - }) - - t.Run("debug_getRawReceipts with more than 0 receipts should be cached", func(t *testing.T) { - backend.Reset() - hdlr.SetRoute("debug_getRawReceipts", "999", []string{"a"}) - resRaw, _, err := client.SendRPC("debug_getRawReceipts", []interface{}{"0x88420081ab9c6d50dc57af36b541c6b8a7b3e9c0d837b0414512c4c5883560bb"}) - require.NoError(t, err) - resCache, _, err := client.SendRPC("debug_getRawReceipts", []interface{}{"0x88420081ab9c6d50dc57af36b541c6b8a7b3e9c0d837b0414512c4c5883560bb"}) - require.NoError(t, err) - RequireEqualJSON(t, []byte("{\"id\":999,\"jsonrpc\":\"2.0\",\"result\":[\"a\"]}"), resRaw) - RequireEqualJSON(t, resRaw, resCache) - require.Equal(t, 1, countRequests(backend, "debug_getRawReceipts")) - }) -} - -func TestBatchCaching(t *testing.T) { - redis, err := miniredis.Run() - require.NoError(t, err) - defer redis.Close() - - hdlr := NewBatchRPCResponseRouter() - hdlr.SetRoute("eth_chainId", "1", "0x420") - hdlr.SetRoute("net_version", "1", "0x1234") - hdlr.SetRoute("eth_call", "1", "dummy_call") - hdlr.SetRoute("eth_getBlockByHash", "1", "eth_getBlockByHash") - - backend := NewMockBackend(hdlr) - defer backend.Close() - - require.NoError(t, os.Setenv("GOOD_BACKEND_RPC_URL", backend.URL())) - require.NoError(t, os.Setenv("REDIS_URL", fmt.Sprintf("redis://127.0.0.1:%s", redis.Port()))) - - config := ReadConfig("caching") - client := NewProxydClient("http://127.0.0.1:8545") - _, shutdown, err := proxyd.Start(config) - require.NoError(t, err) - defer shutdown() - - // allow time for the block number fetcher to fire - time.Sleep(1500 * time.Millisecond) - - goodChainIdResponse := "{\"jsonrpc\": \"2.0\", \"result\": \"0x420\", \"id\": 1}" - goodNetVersionResponse := "{\"jsonrpc\": \"2.0\", \"result\": \"0x1234\", \"id\": 1}" - goodEthCallResponse := "{\"jsonrpc\": \"2.0\", \"result\": \"dummy_call\", \"id\": 1}" - goodEthGetBlockByHash := "{\"jsonrpc\": \"2.0\", \"result\": \"eth_getBlockByHash\", \"id\": 1}" - - res, _, err := client.SendBatchRPC( - NewRPCReq("1", "eth_chainId", nil), - NewRPCReq("1", "net_version", nil), - NewRPCReq("1", "eth_getBlockByHash", []interface{}{"0xc6ef2fc5426d6ad6fd9e2a26abeab0aa2411b7ab17f30a99d3cb96aed1d1055b", "false"}), - ) - require.NoError(t, err) - RequireEqualJSON(t, []byte(asArray(goodChainIdResponse, goodNetVersionResponse, goodEthGetBlockByHash)), res) - require.Equal(t, 1, countRequests(backend, "eth_chainId")) - require.Equal(t, 1, countRequests(backend, "net_version")) - require.Equal(t, 1, countRequests(backend, "eth_getBlockByHash")) - - backend.Reset() - res, _, err = client.SendBatchRPC( - NewRPCReq("1", "eth_chainId", nil), - NewRPCReq("1", "eth_call", []interface{}{`{"to":"0x1234"}`, "pending"}), - NewRPCReq("1", "net_version", nil), - NewRPCReq("1", "eth_getBlockByHash", []interface{}{"0xc6ef2fc5426d6ad6fd9e2a26abeab0aa2411b7ab17f30a99d3cb96aed1d1055b", "false"}), - ) - require.NoError(t, err) - RequireEqualJSON(t, []byte(asArray(goodChainIdResponse, goodEthCallResponse, goodNetVersionResponse, goodEthGetBlockByHash)), res) - require.Equal(t, 0, countRequests(backend, "eth_chainId")) - require.Equal(t, 0, countRequests(backend, "net_version")) - require.Equal(t, 0, countRequests(backend, "eth_getBlockByHash")) - require.Equal(t, 1, countRequests(backend, "eth_call")) -} - -func countRequests(backend *MockBackend, name string) int { - var count int - for _, req := range backend.Requests() { - if bytes.Contains(req.Body, []byte(name)) { - count++ - } - } - return count -} diff --git a/proxyd/integration_tests/consensus_test.go b/proxyd/integration_tests/consensus_test.go deleted file mode 100644 index 1b37ef7527c7..000000000000 --- a/proxyd/integration_tests/consensus_test.go +++ /dev/null @@ -1,1002 +0,0 @@ -package integration_tests - -import ( - "context" - "encoding/json" - "fmt" - "net/http" - "os" - "path" - "testing" - "time" - - "github.com/ethereum/go-ethereum/common/hexutil" - - "github.com/ethereum-optimism/optimism/proxyd" - ms "github.com/ethereum-optimism/optimism/proxyd/tools/mockserver/handler" - "github.com/stretchr/testify/require" -) - -type nodeContext struct { - backend *proxyd.Backend // this is the actual backend impl in proxyd - mockBackend *MockBackend // this is the fake backend that we can use to mock responses - handler *ms.MockedHandler // this is where we control the state of mocked responses -} - -func setup(t *testing.T) (map[string]nodeContext, *proxyd.BackendGroup, *ProxydHTTPClient, func()) { - // setup mock servers - node1 := NewMockBackend(nil) - node2 := NewMockBackend(nil) - - dir, err := os.Getwd() - require.NoError(t, err) - - responses := path.Join(dir, "testdata/consensus_responses.yml") - - h1 := ms.MockedHandler{ - Overrides: []*ms.MethodTemplate{}, - Autoload: true, - AutoloadFile: responses, - } - h2 := ms.MockedHandler{ - Overrides: []*ms.MethodTemplate{}, - Autoload: true, - AutoloadFile: responses, - } - - require.NoError(t, os.Setenv("NODE1_URL", node1.URL())) - require.NoError(t, os.Setenv("NODE2_URL", node2.URL())) - - node1.SetHandler(http.HandlerFunc(h1.Handler)) - node2.SetHandler(http.HandlerFunc(h2.Handler)) - - // setup proxyd - config := ReadConfig("consensus") - svr, shutdown, err := proxyd.Start(config) - require.NoError(t, err) - - // expose the proxyd client - client := NewProxydClient("http://127.0.0.1:8545") - - // expose the backend group - bg := svr.BackendGroups["node"] - require.NotNil(t, bg) - require.NotNil(t, bg.Consensus) - require.Equal(t, 2, len(bg.Backends)) // should match config - - // convenient mapping to access the nodes by name - nodes := map[string]nodeContext{ - "node1": { - mockBackend: node1, - backend: bg.Backends[0], - handler: &h1, - }, - "node2": { - mockBackend: node2, - backend: bg.Backends[1], - handler: &h2, - }, - } - - return nodes, bg, client, shutdown -} - -func TestConsensus(t *testing.T) { - nodes, bg, client, shutdown := setup(t) - defer nodes["node1"].mockBackend.Close() - defer nodes["node2"].mockBackend.Close() - defer shutdown() - - ctx := context.Background() - - // poll for updated consensus - update := func() { - for _, be := range bg.Backends { - bg.Consensus.UpdateBackend(ctx, be) - } - bg.Consensus.UpdateBackendGroupConsensus(ctx) - } - - // convenient methods to manipulate state and mock responses - reset := func() { - for _, node := range nodes { - node.handler.ResetOverrides() - node.mockBackend.Reset() - } - bg.Consensus.ClearListeners() - bg.Consensus.Reset() - } - - override := func(node string, method string, block string, response string) { - nodes[node].handler.AddOverride(&ms.MethodTemplate{ - Method: method, - Block: block, - Response: response, - }) - } - - overrideBlock := func(node string, blockRequest string, blockResponse string) { - override(node, - "eth_getBlockByNumber", - blockRequest, - buildResponse(map[string]string{ - "number": blockResponse, - "hash": "hash_" + blockResponse, - })) - } - - overrideBlockHash := func(node string, blockRequest string, number string, hash string) { - override(node, - "eth_getBlockByNumber", - blockRequest, - buildResponse(map[string]string{ - "number": number, - "hash": hash, - })) - } - - overridePeerCount := func(node string, count int) { - override(node, "net_peerCount", "", buildResponse(hexutil.Uint64(count).String())) - } - - overrideNotInSync := func(node string) { - override(node, "eth_syncing", "", buildResponse(map[string]string{ - "startingblock": "0x0", - "currentblock": "0x0", - "highestblock": "0x100", - })) - } - - // force ban node2 and make sure node1 is the only one in consensus - useOnlyNode1 := func() { - overridePeerCount("node2", 0) - update() - - consensusGroup := bg.Consensus.GetConsensusGroup() - require.Equal(t, 1, len(consensusGroup)) - require.Contains(t, consensusGroup, nodes["node1"].backend) - nodes["node1"].mockBackend.Reset() - } - - t.Run("initial consensus", func(t *testing.T) { - reset() - - // unknown consensus at init - require.Equal(t, "0x0", bg.Consensus.GetLatestBlockNumber().String()) - - // first poll - update() - - // as a default we use: - // - latest at 0x101 [257] - // - safe at 0xe1 [225] - // - finalized at 0xc1 [193] - - // consensus at block 0x101 - require.Equal(t, "0x101", bg.Consensus.GetLatestBlockNumber().String()) - require.Equal(t, "0xe1", bg.Consensus.GetSafeBlockNumber().String()) - require.Equal(t, "0xc1", bg.Consensus.GetFinalizedBlockNumber().String()) - }) - - t.Run("prevent using a backend with low peer count", func(t *testing.T) { - reset() - overridePeerCount("node1", 0) - update() - - consensusGroup := bg.Consensus.GetConsensusGroup() - require.NotContains(t, consensusGroup, nodes["node1"].backend) - require.False(t, bg.Consensus.IsBanned(nodes["node1"].backend)) - require.Equal(t, 1, len(consensusGroup)) - }) - - t.Run("prevent using a backend lagging behind", func(t *testing.T) { - reset() - // node2 is 8+1 blocks ahead of node1 (0x101 + 8+1 = 0x10a) - overrideBlock("node2", "latest", "0x10a") - update() - - // since we ignored node1, the consensus should be at 0x10a - require.Equal(t, "0x10a", bg.Consensus.GetLatestBlockNumber().String()) - require.Equal(t, "0xe1", bg.Consensus.GetSafeBlockNumber().String()) - require.Equal(t, "0xc1", bg.Consensus.GetFinalizedBlockNumber().String()) - - consensusGroup := bg.Consensus.GetConsensusGroup() - require.NotContains(t, consensusGroup, nodes["node1"].backend) - require.False(t, bg.Consensus.IsBanned(nodes["node1"].backend)) - require.Equal(t, 1, len(consensusGroup)) - }) - - t.Run("prevent using a backend lagging behind - one before limit", func(t *testing.T) { - reset() - // node2 is 8 blocks ahead of node1 (0x101 + 8 = 0x109) - overrideBlock("node2", "latest", "0x109") - update() - - // both nodes are in consensus with the lowest block - require.Equal(t, "0x101", bg.Consensus.GetLatestBlockNumber().String()) - require.Equal(t, "0xe1", bg.Consensus.GetSafeBlockNumber().String()) - require.Equal(t, "0xc1", bg.Consensus.GetFinalizedBlockNumber().String()) - require.Equal(t, 2, len(bg.Consensus.GetConsensusGroup())) - }) - - t.Run("prevent using a backend not in sync", func(t *testing.T) { - reset() - // make node1 not in sync - overrideNotInSync("node1") - update() - - consensusGroup := bg.Consensus.GetConsensusGroup() - require.NotContains(t, consensusGroup, nodes["node1"].backend) - require.False(t, bg.Consensus.IsBanned(nodes["node1"].backend)) - require.Equal(t, 1, len(consensusGroup)) - }) - - t.Run("advance consensus", func(t *testing.T) { - reset() - - // as a default we use: - // - latest at 0x101 [257] - // - safe at 0xe1 [225] - // - finalized at 0xc1 [193] - - update() - - // all nodes start at block 0x101 - require.Equal(t, "0x101", bg.Consensus.GetLatestBlockNumber().String()) - - // advance latest on node2 to 0x102 - overrideBlock("node2", "latest", "0x102") - - update() - - // consensus should stick to 0x101, since node1 is still lagging there - bg.Consensus.UpdateBackendGroupConsensus(ctx) - require.Equal(t, "0x101", bg.Consensus.GetLatestBlockNumber().String()) - - // advance latest on node1 to 0x102 - overrideBlock("node1", "latest", "0x102") - - update() - - // all nodes now at 0x102 - require.Equal(t, "0x102", bg.Consensus.GetLatestBlockNumber().String()) - }) - - t.Run("should use lowest safe and finalized", func(t *testing.T) { - reset() - overrideBlock("node2", "finalized", "0xc2") - overrideBlock("node2", "safe", "0xe2") - update() - - require.Equal(t, "0xe1", bg.Consensus.GetSafeBlockNumber().String()) - require.Equal(t, "0xc1", bg.Consensus.GetFinalizedBlockNumber().String()) - }) - - t.Run("advance safe and finalized", func(t *testing.T) { - reset() - overrideBlock("node1", "finalized", "0xc2") - overrideBlock("node1", "safe", "0xe2") - overrideBlock("node2", "finalized", "0xc2") - overrideBlock("node2", "safe", "0xe2") - update() - - require.Equal(t, "0xe2", bg.Consensus.GetSafeBlockNumber().String()) - require.Equal(t, "0xc2", bg.Consensus.GetFinalizedBlockNumber().String()) - }) - - t.Run("ban backend if error rate is too high", func(t *testing.T) { - reset() - useOnlyNode1() - - // replace node1 handler with one that always returns 500 - oldHandler := nodes["node1"].mockBackend.handler - defer func() { nodes["node1"].mockBackend.handler = oldHandler }() - - nodes["node1"].mockBackend.SetHandler(http.HandlerFunc(func(w http.ResponseWriter, r *http.Request) { - w.WriteHeader(503) - })) - - numberReqs := 10 - for numberReqs > 0 { - _, statusCode, err := client.SendRPC("eth_getBlockByNumber", []interface{}{"0x101", false}) - require.NoError(t, err) - require.Equal(t, 503, statusCode) - numberReqs-- - } - - update() - - consensusGroup := bg.Consensus.GetConsensusGroup() - require.NotContains(t, consensusGroup, nodes["node1"].backend) - require.True(t, bg.Consensus.IsBanned(nodes["node1"].backend)) - require.Equal(t, 0, len(consensusGroup)) - }) - - t.Run("ban backend if tags are messed - safe < finalized", func(t *testing.T) { - reset() - overrideBlock("node1", "finalized", "0xb1") - overrideBlock("node1", "safe", "0xa1") - update() - - require.Equal(t, "0xe1", bg.Consensus.GetSafeBlockNumber().String()) - require.Equal(t, "0xc1", bg.Consensus.GetFinalizedBlockNumber().String()) - - consensusGroup := bg.Consensus.GetConsensusGroup() - require.NotContains(t, consensusGroup, nodes["node1"].backend) - require.True(t, bg.Consensus.IsBanned(nodes["node1"].backend)) - require.Equal(t, 1, len(consensusGroup)) - }) - - t.Run("ban backend if tags are messed - latest < safe", func(t *testing.T) { - reset() - overrideBlock("node1", "safe", "0xb1") - overrideBlock("node1", "latest", "0xa1") - update() - - require.Equal(t, "0x101", bg.Consensus.GetLatestBlockNumber().String()) - require.Equal(t, "0xc1", bg.Consensus.GetFinalizedBlockNumber().String()) - require.Equal(t, "0xe1", bg.Consensus.GetSafeBlockNumber().String()) - - consensusGroup := bg.Consensus.GetConsensusGroup() - require.NotContains(t, consensusGroup, nodes["node1"].backend) - require.True(t, bg.Consensus.IsBanned(nodes["node1"].backend)) - require.Equal(t, 1, len(consensusGroup)) - }) - - t.Run("ban backend if tags are messed - safe dropped", func(t *testing.T) { - reset() - update() - overrideBlock("node1", "safe", "0xb1") - update() - - require.Equal(t, "0x101", bg.Consensus.GetLatestBlockNumber().String()) - require.Equal(t, "0xe1", bg.Consensus.GetSafeBlockNumber().String()) - require.Equal(t, "0xc1", bg.Consensus.GetFinalizedBlockNumber().String()) - - consensusGroup := bg.Consensus.GetConsensusGroup() - require.NotContains(t, consensusGroup, nodes["node1"].backend) - require.True(t, bg.Consensus.IsBanned(nodes["node1"].backend)) - require.Equal(t, 1, len(consensusGroup)) - }) - - t.Run("ban backend if tags are messed - finalized dropped", func(t *testing.T) { - reset() - update() - overrideBlock("node1", "finalized", "0xa1") - update() - - require.Equal(t, "0x101", bg.Consensus.GetLatestBlockNumber().String()) - require.Equal(t, "0xe1", bg.Consensus.GetSafeBlockNumber().String()) - require.Equal(t, "0xc1", bg.Consensus.GetFinalizedBlockNumber().String()) - - consensusGroup := bg.Consensus.GetConsensusGroup() - require.NotContains(t, consensusGroup, nodes["node1"].backend) - require.True(t, bg.Consensus.IsBanned(nodes["node1"].backend)) - require.Equal(t, 1, len(consensusGroup)) - }) - - t.Run("recover after safe and finalized dropped", func(t *testing.T) { - reset() - useOnlyNode1() - overrideBlock("node1", "latest", "0xd1") - overrideBlock("node1", "safe", "0xb1") - overrideBlock("node1", "finalized", "0x91") - update() - - consensusGroup := bg.Consensus.GetConsensusGroup() - require.NotContains(t, consensusGroup, nodes["node1"].backend) - require.True(t, bg.Consensus.IsBanned(nodes["node1"].backend)) - require.Equal(t, 0, len(consensusGroup)) - - // unban and see if it recovers - bg.Consensus.Unban(nodes["node1"].backend) - update() - - consensusGroup = bg.Consensus.GetConsensusGroup() - require.Contains(t, consensusGroup, nodes["node1"].backend) - require.False(t, bg.Consensus.IsBanned(nodes["node1"].backend)) - require.Equal(t, 1, len(consensusGroup)) - - require.Equal(t, "0xd1", bg.Consensus.GetLatestBlockNumber().String()) - require.Equal(t, "0xb1", bg.Consensus.GetSafeBlockNumber().String()) - require.Equal(t, "0x91", bg.Consensus.GetFinalizedBlockNumber().String()) - }) - - t.Run("latest dropped below safe, then recovered", func(t *testing.T) { - reset() - useOnlyNode1() - overrideBlock("node1", "latest", "0xd1") - update() - - consensusGroup := bg.Consensus.GetConsensusGroup() - require.NotContains(t, consensusGroup, nodes["node1"].backend) - require.True(t, bg.Consensus.IsBanned(nodes["node1"].backend)) - require.Equal(t, 0, len(consensusGroup)) - - // unban and see if it recovers - bg.Consensus.Unban(nodes["node1"].backend) - overrideBlock("node1", "safe", "0xb1") - overrideBlock("node1", "finalized", "0x91") - update() - - consensusGroup = bg.Consensus.GetConsensusGroup() - require.Contains(t, consensusGroup, nodes["node1"].backend) - require.False(t, bg.Consensus.IsBanned(nodes["node1"].backend)) - require.Equal(t, 1, len(consensusGroup)) - - require.Equal(t, "0xd1", bg.Consensus.GetLatestBlockNumber().String()) - require.Equal(t, "0xb1", bg.Consensus.GetSafeBlockNumber().String()) - require.Equal(t, "0x91", bg.Consensus.GetFinalizedBlockNumber().String()) - }) - - t.Run("latest dropped below safe, and stayed inconsistent", func(t *testing.T) { - reset() - useOnlyNode1() - overrideBlock("node1", "latest", "0xd1") - update() - - consensusGroup := bg.Consensus.GetConsensusGroup() - require.NotContains(t, consensusGroup, nodes["node1"].backend) - require.True(t, bg.Consensus.IsBanned(nodes["node1"].backend)) - require.Equal(t, 0, len(consensusGroup)) - - // unban and see if it recovers - it should not since the blocks stays the same - bg.Consensus.Unban(nodes["node1"].backend) - update() - - // should be banned again - consensusGroup = bg.Consensus.GetConsensusGroup() - require.NotContains(t, consensusGroup, nodes["node1"].backend) - require.True(t, bg.Consensus.IsBanned(nodes["node1"].backend)) - require.Equal(t, 0, len(consensusGroup)) - }) - - t.Run("broken consensus", func(t *testing.T) { - reset() - listenerCalled := false - bg.Consensus.AddListener(func() { - listenerCalled = true - }) - update() - - // all nodes start at block 0x101 - require.Equal(t, "0x101", bg.Consensus.GetLatestBlockNumber().String()) - - // advance latest on both nodes to 0x102 - overrideBlock("node1", "latest", "0x102") - overrideBlock("node2", "latest", "0x102") - - update() - - // at 0x102 - require.Equal(t, "0x102", bg.Consensus.GetLatestBlockNumber().String()) - - // make node2 diverge on hash - overrideBlockHash("node2", "0x102", "0x102", "wrong_hash") - - update() - - // should resolve to 0x101, since 0x102 is out of consensus at the moment - require.Equal(t, "0x101", bg.Consensus.GetLatestBlockNumber().String()) - - // everybody serving traffic - consensusGroup := bg.Consensus.GetConsensusGroup() - require.Equal(t, 2, len(consensusGroup)) - require.False(t, bg.Consensus.IsBanned(nodes["node1"].backend)) - require.False(t, bg.Consensus.IsBanned(nodes["node2"].backend)) - - // onConsensusBroken listener was called - require.True(t, listenerCalled) - }) - - t.Run("broken consensus with depth 2", func(t *testing.T) { - reset() - listenerCalled := false - bg.Consensus.AddListener(func() { - listenerCalled = true - }) - update() - - // all nodes start at block 0x101 - require.Equal(t, "0x101", bg.Consensus.GetLatestBlockNumber().String()) - - // advance latest on both nodes to 0x102 - overrideBlock("node1", "latest", "0x102") - overrideBlock("node2", "latest", "0x102") - - update() - - // at 0x102 - require.Equal(t, "0x102", bg.Consensus.GetLatestBlockNumber().String()) - - // advance latest on both nodes to 0x3 - overrideBlock("node1", "latest", "0x103") - overrideBlock("node2", "latest", "0x103") - - update() - - // at 0x103 - require.Equal(t, "0x103", bg.Consensus.GetLatestBlockNumber().String()) - - // make node2 diverge on hash for blocks 0x102 and 0x103 - overrideBlockHash("node2", "0x102", "0x102", "wrong_hash_0x102") - overrideBlockHash("node2", "0x103", "0x103", "wrong_hash_0x103") - - update() - - // should resolve to 0x101 - require.Equal(t, "0x101", bg.Consensus.GetLatestBlockNumber().String()) - - // everybody serving traffic - consensusGroup := bg.Consensus.GetConsensusGroup() - require.Equal(t, 2, len(consensusGroup)) - require.False(t, bg.Consensus.IsBanned(nodes["node1"].backend)) - require.False(t, bg.Consensus.IsBanned(nodes["node2"].backend)) - - // onConsensusBroken listener was called - require.True(t, listenerCalled) - }) - - t.Run("fork in advanced block", func(t *testing.T) { - reset() - listenerCalled := false - bg.Consensus.AddListener(func() { - listenerCalled = true - }) - update() - - // all nodes start at block 0x101 - require.Equal(t, "0x101", bg.Consensus.GetLatestBlockNumber().String()) - - // make nodes 1 and 2 advance in forks, i.e. they have same block number with different hashes - overrideBlockHash("node1", "0x102", "0x102", "node1_0x102") - overrideBlockHash("node2", "0x102", "0x102", "node2_0x102") - overrideBlockHash("node1", "0x103", "0x103", "node1_0x103") - overrideBlockHash("node2", "0x103", "0x103", "node2_0x103") - overrideBlockHash("node1", "latest", "0x103", "node1_0x103") - overrideBlockHash("node2", "latest", "0x103", "node2_0x103") - - update() - - // should resolve to 0x101, the highest common ancestor - require.Equal(t, "0x101", bg.Consensus.GetLatestBlockNumber().String()) - - // everybody serving traffic - consensusGroup := bg.Consensus.GetConsensusGroup() - require.Equal(t, 2, len(consensusGroup)) - require.False(t, bg.Consensus.IsBanned(nodes["node1"].backend)) - require.False(t, bg.Consensus.IsBanned(nodes["node2"].backend)) - - // onConsensusBroken listener should not be called - require.False(t, listenerCalled) - }) - - t.Run("load balancing should hit both backends", func(t *testing.T) { - reset() - update() - - require.Equal(t, 2, len(bg.Consensus.GetConsensusGroup())) - - // reset request counts - nodes["node1"].mockBackend.Reset() - nodes["node2"].mockBackend.Reset() - - require.Equal(t, 0, len(nodes["node1"].mockBackend.Requests())) - require.Equal(t, 0, len(nodes["node2"].mockBackend.Requests())) - - // there is a random component to this test, - // since our round-robin implementation shuffles the ordering - // to achieve uniform distribution - - // so we just make 100 requests per backend and expect the number of requests to be somewhat balanced - // i.e. each backend should be hit minimally by at least 50% of the requests - consensusGroup := bg.Consensus.GetConsensusGroup() - - numberReqs := len(consensusGroup) * 100 - for numberReqs > 0 { - _, statusCode, err := client.SendRPC("eth_getBlockByNumber", []interface{}{"0x101", false}) - require.NoError(t, err) - require.Equal(t, 200, statusCode) - numberReqs-- - } - - msg := fmt.Sprintf("n1 %d, n2 %d", - len(nodes["node1"].mockBackend.Requests()), len(nodes["node2"].mockBackend.Requests())) - require.GreaterOrEqual(t, len(nodes["node1"].mockBackend.Requests()), 50, msg) - require.GreaterOrEqual(t, len(nodes["node2"].mockBackend.Requests()), 50, msg) - }) - - t.Run("load balancing should not hit if node is not healthy", func(t *testing.T) { - reset() - useOnlyNode1() - - // reset request counts - nodes["node1"].mockBackend.Reset() - nodes["node2"].mockBackend.Reset() - - require.Equal(t, 0, len(nodes["node1"].mockBackend.Requests())) - require.Equal(t, 0, len(nodes["node1"].mockBackend.Requests())) - - numberReqs := 10 - for numberReqs > 0 { - _, statusCode, err := client.SendRPC("eth_getBlockByNumber", []interface{}{"0x101", false}) - require.NoError(t, err) - require.Equal(t, 200, statusCode) - numberReqs-- - } - - msg := fmt.Sprintf("n1 %d, n2 %d", - len(nodes["node1"].mockBackend.Requests()), len(nodes["node2"].mockBackend.Requests())) - require.Equal(t, len(nodes["node1"].mockBackend.Requests()), 10, msg) - require.Equal(t, len(nodes["node2"].mockBackend.Requests()), 0, msg) - }) - - t.Run("load balancing should not hit if node is degraded", func(t *testing.T) { - reset() - useOnlyNode1() - - // replace node1 handler with one that adds a 500ms delay - oldHandler := nodes["node1"].mockBackend.handler - defer func() { nodes["node1"].mockBackend.handler = oldHandler }() - - nodes["node1"].mockBackend.SetHandler(http.HandlerFunc(func(w http.ResponseWriter, r *http.Request) { - time.Sleep(500 * time.Millisecond) - oldHandler.ServeHTTP(w, r) - })) - - update() - - // send 10 requests to make node1 degraded - numberReqs := 10 - for numberReqs > 0 { - _, statusCode, err := client.SendRPC("eth_getBlockByNumber", []interface{}{"0x101", false}) - require.NoError(t, err) - require.Equal(t, 200, statusCode) - numberReqs-- - } - - // bring back node2 - nodes["node2"].handler.ResetOverrides() - update() - - // reset request counts - nodes["node1"].mockBackend.Reset() - nodes["node2"].mockBackend.Reset() - - require.Equal(t, 0, len(nodes["node1"].mockBackend.Requests())) - require.Equal(t, 0, len(nodes["node2"].mockBackend.Requests())) - - numberReqs = 10 - for numberReqs > 0 { - _, statusCode, err := client.SendRPC("eth_getBlockByNumber", []interface{}{"0x101", false}) - require.NoError(t, err) - require.Equal(t, 200, statusCode) - numberReqs-- - } - - msg := fmt.Sprintf("n1 %d, n2 %d", - len(nodes["node1"].mockBackend.Requests()), len(nodes["node2"].mockBackend.Requests())) - require.Equal(t, 0, len(nodes["node1"].mockBackend.Requests()), msg) - require.Equal(t, 10, len(nodes["node2"].mockBackend.Requests()), msg) - }) - - t.Run("rewrite response of eth_blockNumber", func(t *testing.T) { - reset() - update() - - totalRequests := len(nodes["node1"].mockBackend.Requests()) + len(nodes["node2"].mockBackend.Requests()) - require.Equal(t, 2, len(bg.Consensus.GetConsensusGroup())) - - resRaw, statusCode, err := client.SendRPC("eth_blockNumber", nil) - require.NoError(t, err) - require.Equal(t, 200, statusCode) - - var jsonMap map[string]interface{} - err = json.Unmarshal(resRaw, &jsonMap) - require.NoError(t, err) - require.Equal(t, "0x101", jsonMap["result"]) - - // no extra request hit the backends - require.Equal(t, totalRequests, - len(nodes["node1"].mockBackend.Requests())+len(nodes["node2"].mockBackend.Requests())) - }) - - t.Run("rewrite request of eth_getBlockByNumber for latest", func(t *testing.T) { - reset() - useOnlyNode1() - - _, statusCode, err := client.SendRPC("eth_getBlockByNumber", []interface{}{"latest"}) - require.NoError(t, err) - require.Equal(t, 200, statusCode) - - var jsonMap map[string]interface{} - err = json.Unmarshal(nodes["node1"].mockBackend.Requests()[0].Body, &jsonMap) - require.NoError(t, err) - require.Equal(t, "0x101", jsonMap["params"].([]interface{})[0]) - }) - - t.Run("rewrite request of eth_getBlockByNumber for finalized", func(t *testing.T) { - reset() - useOnlyNode1() - - _, statusCode, err := client.SendRPC("eth_getBlockByNumber", []interface{}{"finalized"}) - require.NoError(t, err) - require.Equal(t, 200, statusCode) - - var jsonMap map[string]interface{} - err = json.Unmarshal(nodes["node1"].mockBackend.Requests()[0].Body, &jsonMap) - require.NoError(t, err) - require.Equal(t, "0xc1", jsonMap["params"].([]interface{})[0]) - }) - - t.Run("rewrite request of eth_getBlockByNumber for safe", func(t *testing.T) { - reset() - useOnlyNode1() - - _, statusCode, err := client.SendRPC("eth_getBlockByNumber", []interface{}{"safe"}) - require.NoError(t, err) - require.Equal(t, 200, statusCode) - - var jsonMap map[string]interface{} - err = json.Unmarshal(nodes["node1"].mockBackend.Requests()[0].Body, &jsonMap) - require.NoError(t, err) - require.Equal(t, "0xe1", jsonMap["params"].([]interface{})[0]) - }) - - t.Run("rewrite request of eth_getBlockByNumber - out of range", func(t *testing.T) { - reset() - useOnlyNode1() - - resRaw, statusCode, err := client.SendRPC("eth_getBlockByNumber", []interface{}{"0x300"}) - require.NoError(t, err) - require.Equal(t, 400, statusCode) - - var jsonMap map[string]interface{} - err = json.Unmarshal(resRaw, &jsonMap) - require.NoError(t, err) - require.Equal(t, -32019, int(jsonMap["error"].(map[string]interface{})["code"].(float64))) - require.Equal(t, "block is out of range", jsonMap["error"].(map[string]interface{})["message"]) - }) - - t.Run("batched rewrite", func(t *testing.T) { - reset() - useOnlyNode1() - - resRaw, statusCode, err := client.SendBatchRPC( - NewRPCReq("1", "eth_getBlockByNumber", []interface{}{"latest"}), - NewRPCReq("2", "eth_getBlockByNumber", []interface{}{"0x102"}), - NewRPCReq("3", "eth_getBlockByNumber", []interface{}{"0xe1"})) - require.NoError(t, err) - require.Equal(t, 200, statusCode) - - var jsonMap []map[string]interface{} - err = json.Unmarshal(resRaw, &jsonMap) - require.NoError(t, err) - require.Equal(t, 3, len(jsonMap)) - - // rewrite latest to 0x101 - require.Equal(t, "0x101", jsonMap[0]["result"].(map[string]interface{})["number"]) - - // out of bounds for block 0x102 - require.Equal(t, -32019, int(jsonMap[1]["error"].(map[string]interface{})["code"].(float64))) - require.Equal(t, "block is out of range", jsonMap[1]["error"].(map[string]interface{})["message"]) - - // dont rewrite for 0xe1 - require.Equal(t, "0xe1", jsonMap[2]["result"].(map[string]interface{})["number"]) - }) - - t.Run("translate consensus_getReceipts to debug_getRawReceipts", func(t *testing.T) { - reset() - useOnlyNode1() - update() - - // reset request counts - nodes["node1"].mockBackend.Reset() - - resRaw, statusCode, err := client.SendRPC("consensus_getReceipts", - []interface{}{"0xc6ef2fc5426d6ad6fd9e2a26abeab0aa2411b7ab17f30a99d3cb96aed1d1055b"}) - require.NoError(t, err) - require.Equal(t, 200, statusCode) - - var jsonMap map[string]interface{} - err = json.Unmarshal(nodes["node1"].mockBackend.Requests()[0].Body, &jsonMap) - require.NoError(t, err) - require.Equal(t, "debug_getRawReceipts", jsonMap["method"]) - require.Equal(t, "0xc6ef2fc5426d6ad6fd9e2a26abeab0aa2411b7ab17f30a99d3cb96aed1d1055b", jsonMap["params"].([]interface{})[0]) - - var resJsonMap map[string]interface{} - err = json.Unmarshal(resRaw, &resJsonMap) - require.NoError(t, err) - - require.Equal(t, "debug_getRawReceipts", resJsonMap["result"].(map[string]interface{})["method"].(string)) - require.Equal(t, "debug_getRawReceipts", resJsonMap["result"].(map[string]interface{})["result"].(map[string]interface{})["_"]) - }) - - t.Run("translate consensus_getReceipts to debug_getRawReceipts with latest block tag", func(t *testing.T) { - reset() - useOnlyNode1() - update() - - // reset request counts - nodes["node1"].mockBackend.Reset() - - resRaw, statusCode, err := client.SendRPC("consensus_getReceipts", - []interface{}{"latest"}) - - require.NoError(t, err) - require.Equal(t, 200, statusCode) - - var jsonMap map[string]interface{} - err = json.Unmarshal(nodes["node1"].mockBackend.Requests()[0].Body, &jsonMap) - require.NoError(t, err) - require.Equal(t, "debug_getRawReceipts", jsonMap["method"]) - require.Equal(t, "0x101", jsonMap["params"].([]interface{})[0]) - - var resJsonMap map[string]interface{} - err = json.Unmarshal(resRaw, &resJsonMap) - require.NoError(t, err) - - require.Equal(t, "debug_getRawReceipts", resJsonMap["result"].(map[string]interface{})["method"].(string)) - require.Equal(t, "debug_getRawReceipts", resJsonMap["result"].(map[string]interface{})["result"].(map[string]interface{})["_"]) - }) - - t.Run("translate consensus_getReceipts to debug_getRawReceipts with block number", func(t *testing.T) { - reset() - useOnlyNode1() - update() - - // reset request counts - nodes["node1"].mockBackend.Reset() - - resRaw, statusCode, err := client.SendRPC("consensus_getReceipts", - []interface{}{"0x55"}) - - require.NoError(t, err) - require.Equal(t, 200, statusCode) - - var jsonMap map[string]interface{} - err = json.Unmarshal(nodes["node1"].mockBackend.Requests()[0].Body, &jsonMap) - require.NoError(t, err) - require.Equal(t, "debug_getRawReceipts", jsonMap["method"]) - require.Equal(t, "0x55", jsonMap["params"].([]interface{})[0]) - - var resJsonMap map[string]interface{} - err = json.Unmarshal(resRaw, &resJsonMap) - require.NoError(t, err) - - require.Equal(t, "debug_getRawReceipts", resJsonMap["result"].(map[string]interface{})["method"].(string)) - require.Equal(t, "debug_getRawReceipts", resJsonMap["result"].(map[string]interface{})["result"].(map[string]interface{})["_"]) - }) - - t.Run("translate consensus_getReceipts to alchemy_getTransactionReceipts with block hash", func(t *testing.T) { - reset() - useOnlyNode1() - update() - - // reset request counts - nodes["node1"].mockBackend.Reset() - - nodes["node1"].backend.Override(proxyd.WithConsensusReceiptTarget("alchemy_getTransactionReceipts")) - defer nodes["node1"].backend.Override(proxyd.WithConsensusReceiptTarget("debug_getRawReceipts")) - - resRaw, statusCode, err := client.SendRPC("consensus_getReceipts", - []interface{}{"0xc6ef2fc5426d6ad6fd9e2a26abeab0aa2411b7ab17f30a99d3cb96aed1d1055b"}) - - require.NoError(t, err) - require.Equal(t, 200, statusCode) - - var reqJsonMap map[string]interface{} - err = json.Unmarshal(nodes["node1"].mockBackend.Requests()[0].Body, &reqJsonMap) - - require.NoError(t, err) - require.Equal(t, "alchemy_getTransactionReceipts", reqJsonMap["method"]) - require.Equal(t, "0xc6ef2fc5426d6ad6fd9e2a26abeab0aa2411b7ab17f30a99d3cb96aed1d1055b", reqJsonMap["params"].([]interface{})[0].(map[string]interface{})["blockHash"]) - - var resJsonMap map[string]interface{} - err = json.Unmarshal(resRaw, &resJsonMap) - require.NoError(t, err) - - require.Equal(t, "alchemy_getTransactionReceipts", resJsonMap["result"].(map[string]interface{})["method"].(string)) - require.Equal(t, "alchemy_getTransactionReceipts", resJsonMap["result"].(map[string]interface{})["result"].(map[string]interface{})["_"]) - }) - - t.Run("translate consensus_getReceipts to alchemy_getTransactionReceipts with block number", func(t *testing.T) { - reset() - useOnlyNode1() - update() - - // reset request counts - nodes["node1"].mockBackend.Reset() - - nodes["node1"].backend.Override(proxyd.WithConsensusReceiptTarget("alchemy_getTransactionReceipts")) - defer nodes["node1"].backend.Override(proxyd.WithConsensusReceiptTarget("debug_getRawReceipts")) - - resRaw, statusCode, err := client.SendRPC("consensus_getReceipts", - []interface{}{"0x55"}) - - require.NoError(t, err) - require.Equal(t, 200, statusCode) - - var reqJsonMap map[string]interface{} - err = json.Unmarshal(nodes["node1"].mockBackend.Requests()[0].Body, &reqJsonMap) - - require.NoError(t, err) - require.Equal(t, "alchemy_getTransactionReceipts", reqJsonMap["method"]) - require.Equal(t, "0x55", reqJsonMap["params"].([]interface{})[0].(map[string]interface{})["blockNumber"]) - - var resJsonMap map[string]interface{} - err = json.Unmarshal(resRaw, &resJsonMap) - require.NoError(t, err) - - require.Equal(t, "alchemy_getTransactionReceipts", resJsonMap["result"].(map[string]interface{})["method"].(string)) - require.Equal(t, "alchemy_getTransactionReceipts", resJsonMap["result"].(map[string]interface{})["result"].(map[string]interface{})["_"]) - }) - - t.Run("translate consensus_getReceipts to alchemy_getTransactionReceipts with latest block tag", func(t *testing.T) { - reset() - useOnlyNode1() - update() - - // reset request counts - nodes["node1"].mockBackend.Reset() - - nodes["node1"].backend.Override(proxyd.WithConsensusReceiptTarget("alchemy_getTransactionReceipts")) - defer nodes["node1"].backend.Override(proxyd.WithConsensusReceiptTarget("debug_getRawReceipts")) - - resRaw, statusCode, err := client.SendRPC("consensus_getReceipts", - []interface{}{"latest"}) - - require.NoError(t, err) - require.Equal(t, 200, statusCode) - - var reqJsonMap map[string]interface{} - err = json.Unmarshal(nodes["node1"].mockBackend.Requests()[0].Body, &reqJsonMap) - - require.NoError(t, err) - require.Equal(t, "alchemy_getTransactionReceipts", reqJsonMap["method"]) - require.Equal(t, "0x101", reqJsonMap["params"].([]interface{})[0].(map[string]interface{})["blockNumber"]) - - var resJsonMap map[string]interface{} - err = json.Unmarshal(resRaw, &resJsonMap) - require.NoError(t, err) - - require.Equal(t, "alchemy_getTransactionReceipts", resJsonMap["result"].(map[string]interface{})["method"].(string)) - require.Equal(t, "alchemy_getTransactionReceipts", resJsonMap["result"].(map[string]interface{})["result"].(map[string]interface{})["_"]) - }) - - t.Run("translate consensus_getReceipts to unsupported consensus_receipts_target", func(t *testing.T) { - reset() - useOnlyNode1() - - nodes["node1"].backend.Override(proxyd.WithConsensusReceiptTarget("unsupported_consensus_receipts_target")) - defer nodes["node1"].backend.Override(proxyd.WithConsensusReceiptTarget("debug_getRawReceipts")) - - _, statusCode, err := client.SendRPC("consensus_getReceipts", - []interface{}{"latest"}) - - require.NoError(t, err) - require.Equal(t, 400, statusCode) - }) - - t.Run("consensus_getReceipts should not be used in a batch", func(t *testing.T) { - reset() - useOnlyNode1() - - _, statusCode, err := client.SendBatchRPC( - NewRPCReq("1", "eth_getBlockByNumber", []interface{}{"latest"}), - NewRPCReq("2", "consensus_getReceipts", []interface{}{"0x55"}), - NewRPCReq("3", "eth_getBlockByNumber", []interface{}{"0xe1"})) - require.NoError(t, err) - require.Equal(t, 400, statusCode) - }) -} - -func buildResponse(result interface{}) string { - res, err := json.Marshal(proxyd.RPCRes{ - Result: result, - }) - if err != nil { - panic(err) - } - return string(res) -} diff --git a/proxyd/integration_tests/failover_test.go b/proxyd/integration_tests/failover_test.go deleted file mode 100644 index 501542a1effb..000000000000 --- a/proxyd/integration_tests/failover_test.go +++ /dev/null @@ -1,288 +0,0 @@ -package integration_tests - -import ( - "fmt" - "net/http" - "os" - "sync/atomic" - "testing" - "time" - - "github.com/alicebob/miniredis" - "github.com/ethereum-optimism/optimism/proxyd" - "github.com/stretchr/testify/require" -) - -const ( - goodResponse = `{"jsonrpc": "2.0", "result": "hello", "id": 999}` - noBackendsResponse = `{"error":{"code":-32011,"message":"no backends available for method"},"id":999,"jsonrpc":"2.0"}` - unexpectedResponse = `{"error":{"code":-32011,"message":"some error"},"id":999,"jsonrpc":"2.0"}` -) - -func TestFailover(t *testing.T) { - goodBackend := NewMockBackend(BatchedResponseHandler(200, goodResponse)) - defer goodBackend.Close() - badBackend := NewMockBackend(nil) - defer badBackend.Close() - - require.NoError(t, os.Setenv("GOOD_BACKEND_RPC_URL", goodBackend.URL())) - require.NoError(t, os.Setenv("BAD_BACKEND_RPC_URL", badBackend.URL())) - - config := ReadConfig("failover") - client := NewProxydClient("http://127.0.0.1:8545") - _, shutdown, err := proxyd.Start(config) - require.NoError(t, err) - defer shutdown() - - tests := []struct { - name string - handler http.Handler - }{ - { - "backend responds 200 with non-JSON response", - http.HandlerFunc(func(w http.ResponseWriter, r *http.Request) { - w.WriteHeader(200) - _, _ = w.Write([]byte("this data is not JSON!")) - }), - }, - { - "backend responds with no body", - http.HandlerFunc(func(w http.ResponseWriter, r *http.Request) { - w.WriteHeader(200) - }), - }, - } - codes := []int{ - 300, - 301, - 302, - 401, - 403, - 429, - 500, - 503, - } - for _, code := range codes { - tests = append(tests, struct { - name string - handler http.Handler - }{ - fmt.Sprintf("backend %d", code), - http.HandlerFunc(func(w http.ResponseWriter, r *http.Request) { - w.WriteHeader(code) - }), - }) - } - for _, tt := range tests { - t.Run(tt.name, func(t *testing.T) { - badBackend.SetHandler(tt.handler) - res, statusCode, err := client.SendRPC("eth_chainId", nil) - require.NoError(t, err) - require.Equal(t, 200, statusCode) - RequireEqualJSON(t, []byte(goodResponse), res) - require.Equal(t, 1, len(badBackend.Requests())) - require.Equal(t, 1, len(goodBackend.Requests())) - badBackend.Reset() - goodBackend.Reset() - }) - } - - t.Run("backend times out and falls back to another", func(t *testing.T) { - badBackend.SetHandler(http.HandlerFunc(func(w http.ResponseWriter, r *http.Request) { - time.Sleep(2 * time.Second) - _, _ = w.Write([]byte("[{}]")) - })) - res, statusCode, err := client.SendRPC("eth_chainId", nil) - require.NoError(t, err) - require.Equal(t, 200, statusCode) - RequireEqualJSON(t, []byte(goodResponse), res) - require.Equal(t, 1, len(badBackend.Requests())) - require.Equal(t, 1, len(goodBackend.Requests())) - goodBackend.Reset() - badBackend.Reset() - }) - - t.Run("works with a batch request", func(t *testing.T) { - goodBackend.SetHandler(BatchedResponseHandler(200, goodResponse, goodResponse)) - badBackend.SetHandler(http.HandlerFunc(func(w http.ResponseWriter, r *http.Request) { - w.WriteHeader(500) - })) - res, statusCode, err := client.SendBatchRPC( - NewRPCReq("1", "eth_chainId", nil), - NewRPCReq("2", "eth_chainId", nil), - ) - require.NoError(t, err) - require.Equal(t, 200, statusCode) - RequireEqualJSON(t, []byte(asArray(goodResponse, goodResponse)), res) - require.Equal(t, 1, len(badBackend.Requests())) - require.Equal(t, 1, len(goodBackend.Requests())) - goodBackend.Reset() - badBackend.Reset() - }) -} - -func TestRetries(t *testing.T) { - backend := NewMockBackend(BatchedResponseHandler(200, goodResponse)) - defer backend.Close() - - require.NoError(t, os.Setenv("GOOD_BACKEND_RPC_URL", backend.URL())) - config := ReadConfig("retries") - client := NewProxydClient("http://127.0.0.1:8545") - _, shutdown, err := proxyd.Start(config) - require.NoError(t, err) - defer shutdown() - - attempts := int32(0) - backend.SetHandler(http.HandlerFunc(func(w http.ResponseWriter, r *http.Request) { - incremented := atomic.AddInt32(&attempts, 1) - if incremented != 2 { - w.WriteHeader(500) - return - } - BatchedResponseHandler(200, goodResponse)(w, r) - })) - - // test case where request eventually succeeds - res, statusCode, err := client.SendRPC("eth_chainId", nil) - require.NoError(t, err) - require.Equal(t, 200, statusCode) - RequireEqualJSON(t, []byte(goodResponse), res) - require.Equal(t, 2, len(backend.Requests())) - - // test case where it does not - backend.Reset() - attempts = -10 - res, statusCode, err = client.SendRPC("eth_chainId", nil) - require.NoError(t, err) - require.Equal(t, 503, statusCode) - RequireEqualJSON(t, []byte(noBackendsResponse), res) - require.Equal(t, 4, len(backend.Requests())) -} - -func TestOutOfServiceInterval(t *testing.T) { - okHandler := BatchedResponseHandler(200, goodResponse) - goodBackend := NewMockBackend(okHandler) - defer goodBackend.Close() - badBackend := NewMockBackend(nil) - defer badBackend.Close() - - require.NoError(t, os.Setenv("GOOD_BACKEND_RPC_URL", goodBackend.URL())) - require.NoError(t, os.Setenv("BAD_BACKEND_RPC_URL", badBackend.URL())) - - config := ReadConfig("out_of_service_interval") - client := NewProxydClient("http://127.0.0.1:8545") - _, shutdown, err := proxyd.Start(config) - require.NoError(t, err) - defer shutdown() - - badBackend.SetHandler(http.HandlerFunc(func(w http.ResponseWriter, r *http.Request) { - w.WriteHeader(503) - })) - - res, statusCode, err := client.SendRPC("eth_chainId", nil) - require.NoError(t, err) - require.Equal(t, 200, statusCode) - RequireEqualJSON(t, []byte(goodResponse), res) - require.Equal(t, 2, len(badBackend.Requests())) - require.Equal(t, 1, len(goodBackend.Requests())) - - res, statusCode, err = client.SendRPC("eth_chainId", nil) - require.NoError(t, err) - require.Equal(t, 200, statusCode) - RequireEqualJSON(t, []byte(goodResponse), res) - require.Equal(t, 4, len(badBackend.Requests())) - require.Equal(t, 2, len(goodBackend.Requests())) - - _, statusCode, err = client.SendBatchRPC( - NewRPCReq("1", "eth_chainId", nil), - NewRPCReq("1", "eth_chainId", nil), - ) - require.NoError(t, err) - require.Equal(t, 200, statusCode) - require.Equal(t, 8, len(badBackend.Requests())) - require.Equal(t, 4, len(goodBackend.Requests())) - - time.Sleep(time.Second) - badBackend.SetHandler(okHandler) - - res, statusCode, err = client.SendRPC("eth_chainId", nil) - require.NoError(t, err) - require.Equal(t, 200, statusCode) - RequireEqualJSON(t, []byte(goodResponse), res) - require.Equal(t, 9, len(badBackend.Requests())) - require.Equal(t, 4, len(goodBackend.Requests())) -} - -func TestBatchWithPartialFailover(t *testing.T) { - config := ReadConfig("failover") - config.Server.MaxUpstreamBatchSize = 2 - - goodBackend := NewMockBackend(BatchedResponseHandler(200, goodResponse, goodResponse)) - defer goodBackend.Close() - badBackend := NewMockBackend(SingleResponseHandler(200, "this data is not JSON!")) - defer badBackend.Close() - - require.NoError(t, os.Setenv("GOOD_BACKEND_RPC_URL", goodBackend.URL())) - require.NoError(t, os.Setenv("BAD_BACKEND_RPC_URL", badBackend.URL())) - - client := NewProxydClient("http://127.0.0.1:8545") - _, shutdown, err := proxyd.Start(config) - require.NoError(t, err) - defer shutdown() - - res, statusCode, err := client.SendBatchRPC( - NewRPCReq("1", "eth_chainId", nil), - NewRPCReq("2", "eth_chainId", nil), - NewRPCReq("3", "eth_chainId", nil), - NewRPCReq("4", "eth_chainId", nil), - ) - require.NoError(t, err) - require.Equal(t, 200, statusCode) - RequireEqualJSON(t, []byte(asArray(goodResponse, goodResponse, goodResponse, goodResponse)), res) - require.Equal(t, 2, len(badBackend.Requests())) - require.Equal(t, 2, len(goodBackend.Requests())) -} - -func TestInfuraFailoverOnUnexpectedResponse(t *testing.T) { - InitLogger() - // Scenario: - // 1. Send batch to BAD_BACKEND (Infura) - // 2. Infura fails completely due to a partially errorneous batch request (one of N+1 request object is invalid) - // 3. Assert that the request batch is re-routed to the failover provider - // 4. Assert that BAD_BACKEND is NOT labeled offline - // 5. Assert that BAD_BACKEND is NOT retried - - redis, err := miniredis.Run() - require.NoError(t, err) - defer redis.Close() - - config := ReadConfig("failover") - config.Server.MaxUpstreamBatchSize = 2 - config.BackendOptions.MaxRetries = 2 - // Setup redis to detect offline backends - config.Redis.URL = fmt.Sprintf("redis://127.0.0.1:%s", redis.Port()) - require.NoError(t, err) - - goodBackend := NewMockBackend(BatchedResponseHandler(200, goodResponse, goodResponse)) - defer goodBackend.Close() - badBackend := NewMockBackend(SingleResponseHandler(200, unexpectedResponse)) - defer badBackend.Close() - - require.NoError(t, os.Setenv("GOOD_BACKEND_RPC_URL", goodBackend.URL())) - require.NoError(t, os.Setenv("BAD_BACKEND_RPC_URL", badBackend.URL())) - - client := NewProxydClient("http://127.0.0.1:8545") - _, shutdown, err := proxyd.Start(config) - require.NoError(t, err) - defer shutdown() - - res, statusCode, err := client.SendBatchRPC( - NewRPCReq("1", "eth_chainId", nil), - NewRPCReq("2", "eth_chainId", nil), - ) - require.NoError(t, err) - require.Equal(t, 200, statusCode) - RequireEqualJSON(t, []byte(asArray(goodResponse, goodResponse)), res) - require.Equal(t, 1, len(badBackend.Requests())) - require.Equal(t, 1, len(goodBackend.Requests())) -} diff --git a/proxyd/integration_tests/max_rpc_conns_test.go b/proxyd/integration_tests/max_rpc_conns_test.go deleted file mode 100644 index 5e2336443bfa..000000000000 --- a/proxyd/integration_tests/max_rpc_conns_test.go +++ /dev/null @@ -1,79 +0,0 @@ -package integration_tests - -import ( - "net/http" - "net/http/httptest" - "os" - "sync" - "testing" - "time" - - "github.com/ethereum-optimism/optimism/proxyd" - "github.com/stretchr/testify/require" -) - -func TestMaxConcurrentRPCs(t *testing.T) { - var ( - mu sync.Mutex - concurrentRPCs int - maxConcurrentRPCs int - ) - handler := func(w http.ResponseWriter, r *http.Request) { - mu.Lock() - concurrentRPCs++ - if maxConcurrentRPCs < concurrentRPCs { - maxConcurrentRPCs = concurrentRPCs - } - mu.Unlock() - - time.Sleep(time.Second * 2) - BatchedResponseHandler(200, goodResponse)(w, r) - - mu.Lock() - concurrentRPCs-- - mu.Unlock() - } - // We don't use the MockBackend because it serializes requests to the handler - slowBackend := httptest.NewServer(http.HandlerFunc(handler)) - defer slowBackend.Close() - - require.NoError(t, os.Setenv("GOOD_BACKEND_RPC_URL", slowBackend.URL)) - - config := ReadConfig("max_rpc_conns") - client := NewProxydClient("http://127.0.0.1:8545") - _, shutdown, err := proxyd.Start(config) - require.NoError(t, err) - defer shutdown() - - type resWithCodeErr struct { - res []byte - code int - err error - } - resCh := make(chan *resWithCodeErr) - for i := 0; i < 3; i++ { - go func() { - res, code, err := client.SendRPC("eth_chainId", nil) - resCh <- &resWithCodeErr{ - res: res, - code: code, - err: err, - } - }() - } - res1 := <-resCh - res2 := <-resCh - res3 := <-resCh - - require.NoError(t, res1.err) - require.NoError(t, res2.err) - require.NoError(t, res3.err) - require.Equal(t, 200, res1.code) - require.Equal(t, 200, res2.code) - require.Equal(t, 200, res3.code) - RequireEqualJSON(t, []byte(goodResponse), res1.res) - RequireEqualJSON(t, []byte(goodResponse), res2.res) - RequireEqualJSON(t, []byte(goodResponse), res3.res) - - require.EqualValues(t, 2, maxConcurrentRPCs) -} diff --git a/proxyd/integration_tests/mock_backend_test.go b/proxyd/integration_tests/mock_backend_test.go deleted file mode 100644 index bf45d03f1cbb..000000000000 --- a/proxyd/integration_tests/mock_backend_test.go +++ /dev/null @@ -1,327 +0,0 @@ -package integration_tests - -import ( - "bytes" - "context" - "encoding/json" - "io" - "net/http" - "net/http/httptest" - "strings" - "sync" - - "github.com/ethereum-optimism/optimism/proxyd" - "github.com/gorilla/websocket" -) - -type RecordedRequest struct { - Method string - Headers http.Header - Body []byte -} - -type MockBackend struct { - handler http.Handler - server *httptest.Server - mtx sync.RWMutex - requests []*RecordedRequest -} - -func SingleResponseHandler(code int, response string) http.HandlerFunc { - return func(w http.ResponseWriter, r *http.Request) { - w.WriteHeader(code) - _, _ = w.Write([]byte(response)) - } -} - -func BatchedResponseHandler(code int, responses ...string) http.HandlerFunc { - return func(w http.ResponseWriter, r *http.Request) { - if len(responses) == 1 { - SingleResponseHandler(code, responses[0])(w, r) - return - } - - var body string - body += "[" - for i, response := range responses { - body += response - if i+1 < len(responses) { - body += "," - } - } - body += "]" - SingleResponseHandler(code, body)(w, r) - } -} - -type responseMapping struct { - result interface{} - calls int -} -type BatchRPCResponseRouter struct { - m map[string]map[string]*responseMapping - fallback map[string]interface{} - mtx sync.Mutex -} - -func NewBatchRPCResponseRouter() *BatchRPCResponseRouter { - return &BatchRPCResponseRouter{ - m: make(map[string]map[string]*responseMapping), - fallback: make(map[string]interface{}), - } -} - -func (h *BatchRPCResponseRouter) SetRoute(method string, id string, result interface{}) { - h.mtx.Lock() - defer h.mtx.Unlock() - - switch result.(type) { - case string: - case []string: - case nil: - break - default: - panic("invalid result type") - } - - m := h.m[method] - if m == nil { - m = make(map[string]*responseMapping) - } - m[id] = &responseMapping{result: result} - h.m[method] = m -} - -func (h *BatchRPCResponseRouter) SetFallbackRoute(method string, result interface{}) { - h.mtx.Lock() - defer h.mtx.Unlock() - - switch result.(type) { - case string: - case nil: - break - default: - panic("invalid result type") - } - - h.fallback[method] = result -} - -func (h *BatchRPCResponseRouter) GetNumCalls(method string, id string) int { - h.mtx.Lock() - defer h.mtx.Unlock() - - if m := h.m[method]; m != nil { - if rm := m[id]; rm != nil { - return rm.calls - } - } - return 0 -} - -func (h *BatchRPCResponseRouter) ServeHTTP(w http.ResponseWriter, r *http.Request) { - h.mtx.Lock() - defer h.mtx.Unlock() - - body, err := io.ReadAll(r.Body) - if err != nil { - panic(err) - } - - if proxyd.IsBatch(body) { - batch, err := proxyd.ParseBatchRPCReq(body) - if err != nil { - panic(err) - } - out := make([]*proxyd.RPCRes, len(batch)) - for i := range batch { - req, err := proxyd.ParseRPCReq(batch[i]) - if err != nil { - panic(err) - } - - var result interface{} - var resultHasValue bool - - if mappings, exists := h.m[req.Method]; exists { - if rm := mappings[string(req.ID)]; rm != nil { - result = rm.result - resultHasValue = true - rm.calls++ - } - } - if !resultHasValue { - result, resultHasValue = h.fallback[req.Method] - } - if !resultHasValue { - w.WriteHeader(400) - return - } - - out[i] = &proxyd.RPCRes{ - JSONRPC: proxyd.JSONRPCVersion, - Result: result, - ID: req.ID, - } - } - if err := json.NewEncoder(w).Encode(out); err != nil { - panic(err) - } - return - } - - req, err := proxyd.ParseRPCReq(body) - if err != nil { - panic(err) - } - - var result interface{} - var resultHasValue bool - - if mappings, exists := h.m[req.Method]; exists { - if rm := mappings[string(req.ID)]; rm != nil { - result = rm.result - resultHasValue = true - rm.calls++ - } - } - if !resultHasValue { - result, resultHasValue = h.fallback[req.Method] - } - if !resultHasValue { - w.WriteHeader(400) - return - } - - out := &proxyd.RPCRes{ - JSONRPC: proxyd.JSONRPCVersion, - Result: result, - ID: req.ID, - } - enc := json.NewEncoder(w) - if err := enc.Encode(out); err != nil { - panic(err) - } -} - -func NewMockBackend(handler http.Handler) *MockBackend { - mb := &MockBackend{ - handler: handler, - } - mb.server = httptest.NewServer(http.HandlerFunc(mb.wrappedHandler)) - return mb -} - -func (m *MockBackend) URL() string { - return m.server.URL -} - -func (m *MockBackend) Close() { - m.server.Close() -} - -func (m *MockBackend) SetHandler(handler http.Handler) { - m.mtx.Lock() - m.handler = handler - m.mtx.Unlock() -} - -func (m *MockBackend) Reset() { - m.mtx.Lock() - m.requests = nil - m.mtx.Unlock() -} - -func (m *MockBackend) Requests() []*RecordedRequest { - m.mtx.RLock() - defer m.mtx.RUnlock() - out := make([]*RecordedRequest, len(m.requests)) - copy(out, m.requests) - return out -} - -func (m *MockBackend) wrappedHandler(w http.ResponseWriter, r *http.Request) { - m.mtx.Lock() - body, err := io.ReadAll(r.Body) - if err != nil { - panic(err) - } - clone := r.Clone(context.Background()) - clone.Body = io.NopCloser(bytes.NewReader(body)) - m.requests = append(m.requests, &RecordedRequest{ - Method: r.Method, - Headers: r.Header.Clone(), - Body: body, - }) - m.handler.ServeHTTP(w, clone) - m.mtx.Unlock() -} - -type MockWSBackend struct { - connCB MockWSBackendOnConnect - msgCB MockWSBackendOnMessage - closeCB MockWSBackendOnClose - server *httptest.Server - upgrader websocket.Upgrader - conns []*websocket.Conn - connsMu sync.Mutex -} - -type MockWSBackendOnConnect func(conn *websocket.Conn) -type MockWSBackendOnMessage func(conn *websocket.Conn, msgType int, data []byte) -type MockWSBackendOnClose func(conn *websocket.Conn, err error) - -func NewMockWSBackend( - connCB MockWSBackendOnConnect, - msgCB MockWSBackendOnMessage, - closeCB MockWSBackendOnClose, -) *MockWSBackend { - mb := &MockWSBackend{ - connCB: connCB, - msgCB: msgCB, - closeCB: closeCB, - } - mb.server = httptest.NewServer(mb) - return mb -} - -func (m *MockWSBackend) ServeHTTP(w http.ResponseWriter, r *http.Request) { - conn, err := m.upgrader.Upgrade(w, r, nil) - if err != nil { - panic(err) - } - if m.connCB != nil { - m.connCB(conn) - } - go func() { - for { - mType, msg, err := conn.ReadMessage() - if err != nil { - if m.closeCB != nil { - m.closeCB(conn, err) - } - return - } - if m.msgCB != nil { - m.msgCB(conn, mType, msg) - } - } - }() - m.connsMu.Lock() - m.conns = append(m.conns, conn) - m.connsMu.Unlock() -} - -func (m *MockWSBackend) URL() string { - return strings.Replace(m.server.URL, "http://", "ws://", 1) -} - -func (m *MockWSBackend) Close() { - m.server.Close() - - m.connsMu.Lock() - for _, conn := range m.conns { - conn.Close() - } - m.connsMu.Unlock() -} diff --git a/proxyd/integration_tests/rate_limit_test.go b/proxyd/integration_tests/rate_limit_test.go deleted file mode 100644 index 4e17f625c118..000000000000 --- a/proxyd/integration_tests/rate_limit_test.go +++ /dev/null @@ -1,170 +0,0 @@ -package integration_tests - -import ( - "encoding/json" - "net/http" - "os" - "testing" - "time" - - "github.com/ethereum-optimism/optimism/proxyd" - "github.com/stretchr/testify/require" -) - -type resWithCode struct { - code int - res []byte -} - -const frontendOverLimitResponse = `{"error":{"code":-32016,"message":"over rate limit with special message"},"id":null,"jsonrpc":"2.0"}` -const frontendOverLimitResponseWithID = `{"error":{"code":-32016,"message":"over rate limit with special message"},"id":999,"jsonrpc":"2.0"}` - -var ethChainID = "eth_chainId" - -func TestFrontendMaxRPSLimit(t *testing.T) { - goodBackend := NewMockBackend(BatchedResponseHandler(200, goodResponse)) - defer goodBackend.Close() - - require.NoError(t, os.Setenv("GOOD_BACKEND_RPC_URL", goodBackend.URL())) - - config := ReadConfig("frontend_rate_limit") - _, shutdown, err := proxyd.Start(config) - require.NoError(t, err) - defer shutdown() - - t.Run("non-exempt over limit", func(t *testing.T) { - client := NewProxydClient("http://127.0.0.1:8545") - limitedRes, codes := spamReqs(t, client, ethChainID, 429, 3) - require.Equal(t, 1, codes[429]) - require.Equal(t, 2, codes[200]) - RequireEqualJSON(t, []byte(frontendOverLimitResponse), limitedRes) - }) - - t.Run("exempt user agent over limit", func(t *testing.T) { - h := make(http.Header) - h.Set("User-Agent", "exempt_agent") - client := NewProxydClientWithHeaders("http://127.0.0.1:8545", h) - _, codes := spamReqs(t, client, ethChainID, 429, 3) - require.Equal(t, 3, codes[200]) - }) - - t.Run("exempt origin over limit", func(t *testing.T) { - h := make(http.Header) - h.Set("Origin", "exempt_origin") - client := NewProxydClientWithHeaders("http://127.0.0.1:8545", h) - _, codes := spamReqs(t, client, ethChainID, 429, 3) - require.Equal(t, 3, codes[200]) - }) - - t.Run("multiple xff", func(t *testing.T) { - h1 := make(http.Header) - h1.Set("X-Forwarded-For", "0.0.0.0") - h2 := make(http.Header) - h2.Set("X-Forwarded-For", "1.1.1.1") - client1 := NewProxydClientWithHeaders("http://127.0.0.1:8545", h1) - client2 := NewProxydClientWithHeaders("http://127.0.0.1:8545", h2) - _, codes := spamReqs(t, client1, ethChainID, 429, 3) - require.Equal(t, 1, codes[429]) - require.Equal(t, 2, codes[200]) - _, code, err := client2.SendRPC(ethChainID, nil) - require.Equal(t, 200, code) - require.NoError(t, err) - time.Sleep(time.Second) - _, code, err = client2.SendRPC(ethChainID, nil) - require.Equal(t, 200, code) - require.NoError(t, err) - }) - - time.Sleep(time.Second) - - t.Run("RPC override", func(t *testing.T) { - client := NewProxydClient("http://127.0.0.1:8545") - limitedRes, codes := spamReqs(t, client, "eth_foobar", 429, 2) - // use 2 and 1 here since the limit for eth_foobar is 1 - require.Equal(t, 1, codes[429]) - require.Equal(t, 1, codes[200]) - RequireEqualJSON(t, []byte(frontendOverLimitResponseWithID), limitedRes) - }) - - time.Sleep(time.Second) - - t.Run("RPC override in batch", func(t *testing.T) { - client := NewProxydClient("http://127.0.0.1:8545") - req := NewRPCReq("123", "eth_foobar", nil) - out, code, err := client.SendBatchRPC(req, req, req) - require.NoError(t, err) - var res []proxyd.RPCRes - require.NoError(t, json.Unmarshal(out, &res)) - - expCode := proxyd.ErrOverRateLimit.Code - require.Equal(t, 200, code) - require.Equal(t, 3, len(res)) - require.Nil(t, res[0].Error) - require.Equal(t, expCode, res[1].Error.Code) - require.Equal(t, expCode, res[2].Error.Code) - }) - - time.Sleep(time.Second) - - t.Run("RPC override in batch exempt", func(t *testing.T) { - h := make(http.Header) - h.Set("User-Agent", "exempt_agent") - client := NewProxydClientWithHeaders("http://127.0.0.1:8545", h) - req := NewRPCReq("123", "eth_foobar", nil) - out, code, err := client.SendBatchRPC(req, req, req) - require.NoError(t, err) - var res []proxyd.RPCRes - require.NoError(t, json.Unmarshal(out, &res)) - - require.Equal(t, 200, code) - require.Equal(t, 3, len(res)) - require.Nil(t, res[0].Error) - require.Nil(t, res[1].Error) - require.Nil(t, res[2].Error) - }) - - time.Sleep(time.Second) - - t.Run("global RPC override", func(t *testing.T) { - h := make(http.Header) - h.Set("User-Agent", "exempt_agent") - client := NewProxydClientWithHeaders("http://127.0.0.1:8545", h) - limitedRes, codes := spamReqs(t, client, "eth_baz", 429, 2) - // use 1 and 1 here since the limit for eth_baz is 1 - require.Equal(t, 1, codes[429]) - require.Equal(t, 1, codes[200]) - RequireEqualJSON(t, []byte(frontendOverLimitResponseWithID), limitedRes) - }) -} - -func spamReqs(t *testing.T, client *ProxydHTTPClient, method string, limCode int, n int) ([]byte, map[int]int) { - resCh := make(chan *resWithCode) - for i := 0; i < n; i++ { - go func() { - res, code, err := client.SendRPC(method, nil) - require.NoError(t, err) - resCh <- &resWithCode{ - code: code, - res: res, - } - }() - } - - codes := make(map[int]int) - var limitedRes []byte - for i := 0; i < n; i++ { - res := <-resCh - code := res.code - if codes[code] == 0 { - codes[code] = 1 - } else { - codes[code] += 1 - } - - if code == limCode { - limitedRes = res.res - } - } - - return limitedRes, codes -} diff --git a/proxyd/integration_tests/sender_rate_limit_test.go b/proxyd/integration_tests/sender_rate_limit_test.go deleted file mode 100644 index 20c5f0a7cde4..000000000000 --- a/proxyd/integration_tests/sender_rate_limit_test.go +++ /dev/null @@ -1,126 +0,0 @@ -package integration_tests - -import ( - "bufio" - "fmt" - "math" - "os" - "strings" - "testing" - "time" - - "github.com/ethereum-optimism/optimism/proxyd" - "github.com/stretchr/testify/require" -) - -const txHex1 = "0x02f8b28201a406849502f931849502f931830147f9948f3ddd0fbf3e78ca1d6c" + - "d17379ed88e261249b5280b84447e7ef2400000000000000000000000089c8b1" + - "b2774201bac50f627403eac1b732459cf7000000000000000000000000000000" + - "0000000000000000056bc75e2d63100000c080a0473c95566026c312c9664cd6" + - "1145d2f3e759d49209fe96011ac012884ec5b017a0763b58f6fa6096e6ba28ee" + - "08bfac58f58fb3b8bcef5af98578bdeaddf40bde42" - -const txHex2 = "0x02f8758201a48217fd84773594008504a817c80082520894be53e587975603" + - "a13d0923d0aa6d37c5233dd750865af3107a400080c080a04aefbd5819c35729" + - "138fe26b6ae1783ebf08d249b356c2f920345db97877f3f7a008d5ae92560a3c" + - "65f723439887205713af7ce7d7f6b24fba198f2afa03435867" - -const dummyRes = `{"id": 123, "jsonrpc": "2.0", "result": "dummy"}` - -const limRes = `{"error":{"code":-32017,"message":"sender is over rate limit"},"id":1,"jsonrpc":"2.0"}` - -func TestSenderRateLimitValidation(t *testing.T) { - goodBackend := NewMockBackend(SingleResponseHandler(200, dummyRes)) - defer goodBackend.Close() - - require.NoError(t, os.Setenv("GOOD_BACKEND_RPC_URL", goodBackend.URL())) - - config := ReadConfig("sender_rate_limit") - - // Don't perform rate limiting in this test since we're only testing - // validation. - config.SenderRateLimit.Limit = math.MaxInt - client := NewProxydClient("http://127.0.0.1:8545") - _, shutdown, err := proxyd.Start(config) - require.NoError(t, err) - defer shutdown() - - f, err := os.Open("testdata/testdata.txt") - require.NoError(t, err) - defer f.Close() - - scanner := bufio.NewScanner(f) - scanner.Scan() // skip header - for scanner.Scan() { - record := strings.Split(scanner.Text(), "|") - name, body, expResponseBody := record[0], record[1], record[2] - require.NoError(t, err) - t.Run(name, func(t *testing.T) { - res, _, err := client.SendRequest([]byte(body)) - require.NoError(t, err) - RequireEqualJSON(t, []byte(expResponseBody), res) - }) - } -} - -func TestSenderRateLimitLimiting(t *testing.T) { - goodBackend := NewMockBackend(SingleResponseHandler(200, dummyRes)) - defer goodBackend.Close() - - require.NoError(t, os.Setenv("GOOD_BACKEND_RPC_URL", goodBackend.URL())) - - config := ReadConfig("sender_rate_limit") - client := NewProxydClient("http://127.0.0.1:8545") - _, shutdown, err := proxyd.Start(config) - require.NoError(t, err) - defer shutdown() - - // Two separate requests from the same sender - // should be rate limited. - res1, code1, err := client.SendRequest(makeSendRawTransaction(txHex1)) - require.NoError(t, err) - RequireEqualJSON(t, []byte(dummyRes), res1) - require.Equal(t, 200, code1) - res2, code2, err := client.SendRequest(makeSendRawTransaction(txHex1)) - require.NoError(t, err) - RequireEqualJSON(t, []byte(limRes), res2) - require.Equal(t, 429, code2) - - // Clear the limiter. - time.Sleep(1100 * time.Millisecond) - - // Two separate requests from different senders - // should not be rate limited. - res1, code1, err = client.SendRequest(makeSendRawTransaction(txHex1)) - require.NoError(t, err) - res2, code2, err = client.SendRequest(makeSendRawTransaction(txHex2)) - require.NoError(t, err) - RequireEqualJSON(t, []byte(dummyRes), res1) - require.Equal(t, 200, code1) - RequireEqualJSON(t, []byte(dummyRes), res2) - require.Equal(t, 200, code2) - - // Clear the limiter. - time.Sleep(1100 * time.Millisecond) - - // A batch request should rate limit within the batch itself. - batch := []byte(fmt.Sprintf( - `[%s, %s, %s]`, - makeSendRawTransaction(txHex1), - makeSendRawTransaction(txHex1), - makeSendRawTransaction(txHex2), - )) - res, code, err := client.SendRequest(batch) - require.NoError(t, err) - require.Equal(t, 200, code) - RequireEqualJSON(t, []byte(fmt.Sprintf( - `[%s, %s, %s]`, - dummyRes, - limRes, - dummyRes, - )), res) -} - -func makeSendRawTransaction(dataHex string) []byte { - return []byte(`{"jsonrpc":"2.0","method":"eth_sendRawTransaction","params":["` + dataHex + `"],"id":1}`) -} diff --git a/proxyd/integration_tests/smoke_test.go b/proxyd/integration_tests/smoke_test.go deleted file mode 100644 index 5fed7571bcec..000000000000 --- a/proxyd/integration_tests/smoke_test.go +++ /dev/null @@ -1,51 +0,0 @@ -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/batch_timeout.toml b/proxyd/integration_tests/testdata/batch_timeout.toml deleted file mode 100644 index 4238aafeea2f..000000000000 --- a/proxyd/integration_tests/testdata/batch_timeout.toml +++ /dev/null @@ -1,20 +0,0 @@ -[server] -rpc_port = 8545 -timeout_seconds = 1 -max_upstream_batch_size = 1 - -[backend] -response_timeout_seconds = 1 -max_retries = 3 - -[backends] -[backends.slow] -rpc_url = "$SLOW_BACKEND_RPC_URL" -ws_url = "$SLOW_BACKEND_RPC_URL" - -[backend_groups] -[backend_groups.main] -backends = ["slow"] - -[rpc_method_mappings] -eth_chainId = "main" diff --git a/proxyd/integration_tests/testdata/batching.toml b/proxyd/integration_tests/testdata/batching.toml deleted file mode 100644 index 476283597537..000000000000 --- a/proxyd/integration_tests/testdata/batching.toml +++ /dev/null @@ -1,23 +0,0 @@ -[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" -net_version = "main" -eth_call = "main" - -[batch] -error_message = "over batch size custom message" -max_size = 5 \ No newline at end of file diff --git a/proxyd/integration_tests/testdata/caching.toml b/proxyd/integration_tests/testdata/caching.toml deleted file mode 100644 index 41bc65b9a785..000000000000 --- a/proxyd/integration_tests/testdata/caching.toml +++ /dev/null @@ -1,36 +0,0 @@ -[server] -rpc_port = 8545 - -[backend] -response_timeout_seconds = 1 - -[redis] -url = "$REDIS_URL" -namespace = "proxyd" - -[cache] -enabled = true - -[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" -net_version = "main" -eth_getBlockByNumber = "main" -eth_blockNumber = "main" -eth_call = "main" -eth_getBlockTransactionCountByHash = "main" -eth_getUncleCountByBlockHash = "main" -eth_getBlockByHash = "main" -eth_getTransactionByHash = "main" -eth_getTransactionByBlockHashAndIndex = "main" -eth_getUncleByBlockHashAndIndex = "main" -eth_getTransactionReceipt = "main" -debug_getRawReceipts = "main" diff --git a/proxyd/integration_tests/testdata/consensus.toml b/proxyd/integration_tests/testdata/consensus.toml deleted file mode 100644 index bb130368ea9c..000000000000 --- a/proxyd/integration_tests/testdata/consensus.toml +++ /dev/null @@ -1,30 +0,0 @@ -[server] -rpc_port = 8545 - -[backend] -response_timeout_seconds = 1 -max_degraded_latency_threshold = "30ms" - -[backends] -[backends.node1] -rpc_url = "$NODE1_URL" - -[backends.node2] -rpc_url = "$NODE2_URL" - -[backend_groups] -[backend_groups.node] -backends = ["node1", "node2"] -consensus_aware = true -consensus_handler = "noop" # allow more control over the consensus poller for tests -consensus_ban_period = "1m" -consensus_max_update_threshold = "2m" -consensus_max_block_lag = 8 -consensus_min_peer_count = 4 - -[rpc_method_mappings] -eth_call = "node" -eth_chainId = "node" -eth_blockNumber = "node" -eth_getBlockByNumber = "node" -consensus_getReceipts = "node" diff --git a/proxyd/integration_tests/testdata/consensus_responses.yml b/proxyd/integration_tests/testdata/consensus_responses.yml deleted file mode 100644 index 642c3340f04b..000000000000 --- a/proxyd/integration_tests/testdata/consensus_responses.yml +++ /dev/null @@ -1,234 +0,0 @@ -- method: eth_chainId - response: > - { - "jsonrpc": "2.0", - "id": 67, - "result": "hello", - } -- method: net_peerCount - response: > - { - "jsonrpc": "2.0", - "id": 67, - "result": "0x10" - } -- method: eth_syncing - response: > - { - "jsonrpc": "2.0", - "id": 67, - "result": false - } -- method: eth_getBlockByNumber - block: latest - response: > - { - "jsonrpc": "2.0", - "id": 67, - "result": { - "hash": "hash_0x101", - "number": "0x101" - } - } -- method: eth_getBlockByNumber - block: 0x101 - response: > - { - "jsonrpc": "2.0", - "id": 67, - "result": { - "hash": "hash_0x101", - "number": "0x101" - } - } -- method: eth_getBlockByNumber - block: 0x102 - response: > - { - "jsonrpc": "2.0", - "id": 67, - "result": { - "hash": "hash_0x102", - "number": "0x102" - } - } -- method: eth_getBlockByNumber - block: 0x103 - response: > - { - "jsonrpc": "2.0", - "id": 67, - "result": { - "hash": "hash_0x103", - "number": "0x103" - } - } -- method: eth_getBlockByNumber - block: 0x10a - response: > - { - "jsonrpc": "2.0", - "id": 67, - "result": { - "hash": "hash_0x10a", - "number": "0x10a" - } - } -- method: eth_getBlockByNumber - block: 0x132 - response: > - { - "jsonrpc": "2.0", - "id": 67, - "result": { - "hash": "hash_0x132", - "number": "0x132" - } - } -- method: eth_getBlockByNumber - block: 0x133 - response: > - { - "jsonrpc": "2.0", - "id": 67, - "result": { - "hash": "hash_0x133", - "number": "0x133" - } - } -- method: eth_getBlockByNumber - block: 0x134 - response: > - { - "jsonrpc": "2.0", - "id": 67, - "result": { - "hash": "hash_0x134", - "number": "0x134" - } - } -- method: eth_getBlockByNumber - block: 0x200 - response: > - { - "jsonrpc": "2.0", - "id": 67, - "result": { - "hash": "hash_0x200", - "number": "0x200" - } - } -- method: eth_getBlockByNumber - block: 0x91 - response: > - { - "jsonrpc": "2.0", - "id": 67, - "result": { - "hash": "hash_0x91", - "number": "0x91" - } - } -- method: eth_getBlockByNumber - block: safe - response: > - { - "jsonrpc": "2.0", - "id": 67, - "result": { - "hash": "hash_0xe1", - "number": "0xe1" - } - } -- method: eth_getBlockByNumber - block: 0xe1 - response: > - { - "jsonrpc": "2.0", - "id": 67, - "result": { - "hash": "hash_0xe1", - "number": "0xe1" - } - } -- method: eth_getBlockByNumber - block: finalized - response: > - { - "jsonrpc": "2.0", - "id": 67, - "result": { - "hash": "hash_0xc1", - "number": "0xc1" - } - } -- method: eth_getBlockByNumber - block: 0xc1 - response: > - { - "jsonrpc": "2.0", - "id": 67, - "result": { - "hash": "hash_0xc1", - "number": "0xc1" - } - } -- method: eth_getBlockByNumber - block: 0xd1 - response: > - { - "jsonrpc": "2.0", - "id": 67, - "result": { - "hash": "hash_0xd1", - "number": "0xd1" - } - } -- method: debug_getRawReceipts - block: 0x55 - response: > - { - "jsonrpc": "2.0", - "id": 67, - "result": { - "_": "debug_getRawReceipts" - } - } -- method: debug_getRawReceipts - block: 0xc6ef2fc5426d6ad6fd9e2a26abeab0aa2411b7ab17f30a99d3cb96aed1d1055b - response: > - { - "jsonrpc": "2.0", - "id": 67, - "result": { - "_": "debug_getRawReceipts" - } - } -- method: debug_getRawReceipts - block: 0x101 - response: > - { - "jsonrpc": "2.0", - "id": 67, - "result": { - "_": "debug_getRawReceipts" - } - } -- method: eth_getTransactionReceipt - response: > - { - "jsonrpc": "2.0", - "id": 67, - "result": { - "_": "eth_getTransactionReceipt" - } - } -- method: alchemy_getTransactionReceipts - response: > - { - "jsonrpc": "2.0", - "id": 67, - "result": { - "_": "alchemy_getTransactionReceipts" - } - } diff --git a/proxyd/integration_tests/testdata/failover.toml b/proxyd/integration_tests/testdata/failover.toml deleted file mode 100644 index 80ff99045f34..000000000000 --- a/proxyd/integration_tests/testdata/failover.toml +++ /dev/null @@ -1,20 +0,0 @@ -[server] -rpc_port = 8545 - -[backend] -response_timeout_seconds = 1 - -[backends] -[backends.good] -rpc_url = "$GOOD_BACKEND_RPC_URL" -ws_url = "$GOOD_BACKEND_RPC_URL" -[backends.bad] -rpc_url = "$BAD_BACKEND_RPC_URL" -ws_url = "$BAD_BACKEND_RPC_URL" - -[backend_groups] -[backend_groups.main] -backends = ["bad", "good"] - -[rpc_method_mappings] -eth_chainId = "main" \ No newline at end of file diff --git a/proxyd/integration_tests/testdata/frontend_rate_limit.toml b/proxyd/integration_tests/testdata/frontend_rate_limit.toml deleted file mode 100644 index 8aa9d19f8f68..000000000000 --- a/proxyd/integration_tests/testdata/frontend_rate_limit.toml +++ /dev/null @@ -1,35 +0,0 @@ -[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" -eth_foobar = "main" -eth_baz = "main" - -[rate_limit] -base_rate = 2 -base_interval = "1s" -exempt_origins = ["exempt_origin"] -exempt_user_agents = ["exempt_agent"] -error_message = "over rate limit with special message" - -[rate_limit.method_overrides.eth_foobar] -limit = 1 -interval = "1s" - -[rate_limit.method_overrides.eth_baz] -limit = 1 -interval = "1s" -global = true \ No newline at end of file diff --git a/proxyd/integration_tests/testdata/max_rpc_conns.toml b/proxyd/integration_tests/testdata/max_rpc_conns.toml deleted file mode 100644 index 68d7c19c72ef..000000000000 --- a/proxyd/integration_tests/testdata/max_rpc_conns.toml +++ /dev/null @@ -1,19 +0,0 @@ -[server] -rpc_port = 8545 -max_concurrent_rpcs = 2 - -[backend] -# this should cover blocked requests due to max_concurrent_rpcs -response_timeout_seconds = 12 - -[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/out_of_service_interval.toml b/proxyd/integration_tests/testdata/out_of_service_interval.toml deleted file mode 100644 index 157fa06c18ab..000000000000 --- a/proxyd/integration_tests/testdata/out_of_service_interval.toml +++ /dev/null @@ -1,22 +0,0 @@ -[server] -rpc_port = 8545 - -[backend] -response_timeout_seconds = 1 -max_retries = 1 -out_of_service_seconds = 1 - -[backends] -[backends.good] -rpc_url = "$GOOD_BACKEND_RPC_URL" -ws_url = "$GOOD_BACKEND_RPC_URL" -[backends.bad] -rpc_url = "$BAD_BACKEND_RPC_URL" -ws_url = "$BAD_BACKEND_RPC_URL" - -[backend_groups] -[backend_groups.main] -backends = ["bad", "good"] - -[rpc_method_mappings] -eth_chainId = "main" diff --git a/proxyd/integration_tests/testdata/retries.toml b/proxyd/integration_tests/testdata/retries.toml deleted file mode 100644 index dc9466dddcf1..000000000000 --- a/proxyd/integration_tests/testdata/retries.toml +++ /dev/null @@ -1,18 +0,0 @@ -[server] -rpc_port = 8545 - -[backend] -response_timeout_seconds = 1 -max_retries = 3 - -[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" \ No newline at end of file diff --git a/proxyd/integration_tests/testdata/sender_rate_limit.toml b/proxyd/integration_tests/testdata/sender_rate_limit.toml deleted file mode 100644 index c99959d84a91..000000000000 --- a/proxyd/integration_tests/testdata/sender_rate_limit.toml +++ /dev/null @@ -1,24 +0,0 @@ -[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" -eth_sendRawTransaction = "main" - -[sender_rate_limit] -allowed_chain_ids = [0, 420] # adding 0 allows pre-EIP-155 transactions -enabled = true -interval = "1s" -limit = 1 diff --git a/proxyd/integration_tests/testdata/size_limits.toml b/proxyd/integration_tests/testdata/size_limits.toml deleted file mode 100644 index bd4afab534b9..000000000000 --- a/proxyd/integration_tests/testdata/size_limits.toml +++ /dev/null @@ -1,21 +0,0 @@ -whitelist_error_message = "rpc method is not whitelisted custom message" - -[server] -rpc_port = 8545 -max_request_body_size_bytes = 150 - -[backend] -response_timeout_seconds = 1 -max_response_size_bytes = 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" \ No newline at end of file diff --git a/proxyd/integration_tests/testdata/smoke.toml b/proxyd/integration_tests/testdata/smoke.toml deleted file mode 100644 index a2187a25055d..000000000000 --- a/proxyd/integration_tests/testdata/smoke.toml +++ /dev/null @@ -1,18 +0,0 @@ -[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 deleted file mode 100644 index 4bdd635a38fc..000000000000 --- a/proxyd/integration_tests/testdata/testdata.txt +++ /dev/null @@ -1,14 +0,0 @@ -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":-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} -valid transaction data - simple send|{"jsonrpc":"2.0","method":"eth_sendRawTransaction","params":["0x02f8748201a415843b9aca31843b9aca3182520894f80267194936da1e98db10bce06f3147d580a62e880de0b6b3a764000080c001a0b50ee053102360ff5fedf0933b912b7e140c90fe57fa07a0cebe70dbd72339dda072974cb7bfe5c3dc54dde110e2b049408ccab8a879949c3b4d42a3a7555a618b"],"id":1}|{"id": 123, "jsonrpc": "2.0", "result": "dummy"} -valid transaction data - contract call|{"jsonrpc":"2.0","method":"eth_sendRawTransaction","params":["0x02f8b28201a406849502f931849502f931830147f9948f3ddd0fbf3e78ca1d6cd17379ed88e261249b5280b84447e7ef2400000000000000000000000089c8b1b2774201bac50f627403eac1b732459cf70000000000000000000000000000000000000000000000056bc75e2d63100000c080a0473c95566026c312c9664cd61145d2f3e759d49209fe96011ac012884ec5b017a0763b58f6fa6096e6ba28ee08bfac58f58fb3b8bcef5af98578bdeaddf40bde42"],"id":1}|{"id": 123, "jsonrpc": "2.0", "result": "dummy"} -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":-32601,"message":"rpc method is not whitelisted"},"id":123}] diff --git a/proxyd/integration_tests/testdata/whitelist.toml b/proxyd/integration_tests/testdata/whitelist.toml deleted file mode 100644 index 4a65248d7162..000000000000 --- a/proxyd/integration_tests/testdata/whitelist.toml +++ /dev/null @@ -1,19 +0,0 @@ -whitelist_error_message = "rpc method is not whitelisted custom message" - -[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" \ No newline at end of file diff --git a/proxyd/integration_tests/testdata/ws.toml b/proxyd/integration_tests/testdata/ws.toml deleted file mode 100644 index 4642e6bc0fc9..000000000000 --- a/proxyd/integration_tests/testdata/ws.toml +++ /dev/null @@ -1,28 +0,0 @@ -whitelist_error_message = "rpc method is not whitelisted" - -ws_backend_group = "main" - -ws_method_whitelist = [ - "eth_subscribe", - "eth_accounts" -] - -[server] -rpc_port = 8545 -ws_port = 8546 - -[backend] -response_timeout_seconds = 1 - -[backends] -[backends.good] -rpc_url = "$GOOD_BACKEND_RPC_URL" -ws_url = "$GOOD_BACKEND_RPC_URL" -max_ws_conns = 1 - -[backend_groups] -[backend_groups.main] -backends = ["good"] - -[rpc_method_mappings] -eth_chainId = "main" diff --git a/proxyd/integration_tests/util_test.go b/proxyd/integration_tests/util_test.go deleted file mode 100644 index 36edce13ef78..000000000000 --- a/proxyd/integration_tests/util_test.go +++ /dev/null @@ -1,191 +0,0 @@ -package integration_tests - -import ( - "bytes" - "encoding/json" - "fmt" - "io" - "net/http" - "os" - "testing" - "time" - - "github.com/BurntSushi/toml" - "github.com/gorilla/websocket" - "github.com/stretchr/testify/require" - "golang.org/x/exp/slog" - - "github.com/ethereum/go-ethereum/log" - - "github.com/ethereum-optimism/optimism/proxyd" -) - -type ProxydHTTPClient struct { - url string - headers http.Header -} - -func NewProxydClient(url string) *ProxydHTTPClient { - return NewProxydClientWithHeaders(url, make(http.Header)) -} - -func NewProxydClientWithHeaders(url string, headers http.Header) *ProxydHTTPClient { - clonedHeaders := headers.Clone() - clonedHeaders.Set("Content-Type", "application/json") - return &ProxydHTTPClient{ - url: url, - headers: clonedHeaders, - } -} - -func (p *ProxydHTTPClient) SendRPC(method string, params []interface{}) ([]byte, int, error) { - rpcReq := NewRPCReq("999", method, params) - body, err := json.Marshal(rpcReq) - if err != nil { - panic(err) - } - return p.SendRequest(body) -} - -func (p *ProxydHTTPClient) SendBatchRPC(reqs ...*proxyd.RPCReq) ([]byte, int, error) { - body, err := json.Marshal(reqs) - if err != nil { - panic(err) - } - return p.SendRequest(body) -} - -func (p *ProxydHTTPClient) SendRequest(body []byte) ([]byte, int, error) { - req, err := http.NewRequest("POST", p.url, bytes.NewReader(body)) - if err != nil { - panic(err) - } - req.Header = p.headers - - res, err := http.DefaultClient.Do(req) - if err != nil { - return nil, -1, err - } - defer res.Body.Close() - code := res.StatusCode - resBody, err := io.ReadAll(res.Body) - if err != nil { - panic(err) - } - return resBody, code, nil -} - -func RequireEqualJSON(t *testing.T, expected []byte, actual []byte) { - expJSON := canonicalizeJSON(t, expected) - actJSON := canonicalizeJSON(t, actual) - require.Equal(t, string(expJSON), string(actJSON)) -} - -func canonicalizeJSON(t *testing.T, in []byte) []byte { - var any interface{} - if in[0] == '[' { - any = make([]interface{}, 0) - } else { - any = make(map[string]interface{}) - } - - err := json.Unmarshal(in, &any) - require.NoError(t, err) - out, err := json.Marshal(any) - require.NoError(t, err) - return out -} - -func ReadConfig(name string) *proxyd.Config { - config := new(proxyd.Config) - _, err := toml.DecodeFile(fmt.Sprintf("testdata/%s.toml", name), config) - if err != nil { - panic(err) - } - return config -} - -func NewRPCReq(id string, method string, params []interface{}) *proxyd.RPCReq { - jsonParams, err := json.Marshal(params) - if err != nil { - panic(err) - } - - return &proxyd.RPCReq{ - JSONRPC: proxyd.JSONRPCVersion, - Method: method, - Params: jsonParams, - ID: []byte(id), - } -} - -type ProxydWSClient struct { - conn *websocket.Conn - msgCB ProxydWSClientOnMessage - closeCB ProxydWSClientOnClose -} - -type WSMessage struct { - Type int - Body []byte -} - -type ( - ProxydWSClientOnMessage func(msgType int, data []byte) - ProxydWSClientOnClose func(err error) -) - -func NewProxydWSClient( - url string, - msgCB ProxydWSClientOnMessage, - closeCB ProxydWSClientOnClose, -) (*ProxydWSClient, error) { - conn, _, err := websocket.DefaultDialer.Dial(url, nil) // nolint:bodyclose - if err != nil { - return nil, err - } - - c := &ProxydWSClient{ - conn: conn, - msgCB: msgCB, - closeCB: closeCB, - } - go c.readPump() - return c, nil -} - -func (h *ProxydWSClient) readPump() { - for { - mType, msg, err := h.conn.ReadMessage() - if err != nil { - if h.closeCB != nil { - h.closeCB(err) - } - return - } - if h.msgCB != nil { - h.msgCB(mType, msg) - } - } -} - -func (h *ProxydWSClient) HardClose() { - h.conn.Close() -} - -func (h *ProxydWSClient) SoftClose() error { - return h.WriteMessage(websocket.CloseMessage, nil) -} - -func (h *ProxydWSClient) WriteMessage(msgType int, msg []byte) error { - return h.conn.WriteMessage(msgType, msg) -} - -func (h *ProxydWSClient) WriteControlMessage(msgType int, msg []byte) error { - return h.conn.WriteControl(msgType, msg, time.Now().Add(time.Minute)) -} - -func InitLogger() { - log.SetDefault(log.NewLogger(slog.NewJSONHandler( - os.Stdout, &slog.HandlerOptions{Level: slog.LevelDebug}))) -} diff --git a/proxyd/integration_tests/validation_test.go b/proxyd/integration_tests/validation_test.go deleted file mode 100644 index 95cfc295b7aa..000000000000 --- a/proxyd/integration_tests/validation_test.go +++ /dev/null @@ -1,258 +0,0 @@ -package integration_tests - -import ( - "fmt" - "os" - "strings" - "testing" - - "github.com/ethereum-optimism/optimism/proxyd" - "github.com/stretchr/testify/require" -) - -const ( - 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"}` - invalidMethodResponse = `{"error":{"code":-32600,"message":"no method specified"},"id":null,"jsonrpc":"2.0"}` - invalidBatchLenResponse = `{"error":{"code":-32600,"message":"must specify at least one batch call"},"id":null,"jsonrpc":"2.0"}` -) - -func TestSingleRPCValidation(t *testing.T) { - goodBackend := NewMockBackend(BatchedResponseHandler(200, goodResponse)) - defer goodBackend.Close() - - require.NoError(t, os.Setenv("GOOD_BACKEND_RPC_URL", goodBackend.URL())) - - config := ReadConfig("whitelist") - client := NewProxydClient("http://127.0.0.1:8545") - _, shutdown, err := proxyd.Start(config) - require.NoError(t, err) - defer shutdown() - - tests := []struct { - name string - body string - res string - code int - }{ - { - "body not JSON", - "this ain't an RPC call", - parseErrResponse, - 400, - }, - { - "body not RPC", - "{\"not\": \"rpc\"}", - invalidJSONRPCVersionResponse, - 400, - }, - { - "body missing RPC ID", - "{\"jsonrpc\": \"2.0\", \"method\": \"subtract\", \"params\": [42, 23]}", - invalidIDResponse, - 400, - }, - { - "body has array ID", - "{\"jsonrpc\": \"2.0\", \"method\": \"subtract\", \"params\": [42, 23], \"id\": []}", - invalidIDResponse, - 400, - }, - { - "body has object ID", - "{\"jsonrpc\": \"2.0\", \"method\": \"subtract\", \"params\": [42, 23], \"id\": {}}", - invalidIDResponse, - 400, - }, - { - "bad method", - "{\"jsonrpc\": \"2.0\", \"method\": 7, \"params\": [42, 23], \"id\": 1}", - parseErrResponse, - 400, - }, - { - "bad JSON-RPC", - "{\"jsonrpc\": \"1.0\", \"method\": \"subtract\", \"params\": [42, 23], \"id\": 1}", - invalidJSONRPCVersionResponse, - 400, - }, - { - "omitted method", - "{\"jsonrpc\": \"2.0\", \"params\": [42, 23], \"id\": 1}", - invalidMethodResponse, - 400, - }, - { - "not whitelisted method", - "{\"jsonrpc\": \"2.0\", \"method\": \"subtract\", \"params\": [42, 23], \"id\": 999}", - notWhitelistedResponse, - 403, - }, - } - for _, tt := range tests { - t.Run(tt.name, func(t *testing.T) { - res, code, err := client.SendRequest([]byte(tt.body)) - require.NoError(t, err) - RequireEqualJSON(t, []byte(tt.res), res) - require.Equal(t, tt.code, code) - require.Equal(t, 0, len(goodBackend.Requests())) - }) - } -} - -func TestBatchRPCValidation(t *testing.T) { - goodBackend := NewMockBackend(BatchedResponseHandler(200, goodResponse)) - defer goodBackend.Close() - - require.NoError(t, os.Setenv("GOOD_BACKEND_RPC_URL", goodBackend.URL())) - - config := ReadConfig("whitelist") - client := NewProxydClient("http://127.0.0.1:8545") - _, shutdown, err := proxyd.Start(config) - require.NoError(t, err) - defer shutdown() - - tests := []struct { - name string - body string - res string - code int - reqCount int - }{ - { - "empty batch", - "[]", - invalidBatchLenResponse, - 400, - 0, - }, - { - "bad json", - "[{,]", - parseErrResponse, - 400, - 0, - }, - { - "not object in batch", - "[123]", - asArray(parseErrResponse), - 200, - 0, - }, - { - "body not RPC", - "[{\"not\": \"rpc\"}]", - asArray(invalidJSONRPCVersionResponse), - 200, - 0, - }, - { - "body missing RPC ID", - "[{\"jsonrpc\": \"2.0\", \"method\": \"subtract\", \"params\": [42, 23]}]", - asArray(invalidIDResponse), - 200, - 0, - }, - { - "body has array ID", - "[{\"jsonrpc\": \"2.0\", \"method\": \"subtract\", \"params\": [42, 23], \"id\": []}]", - asArray(invalidIDResponse), - 200, - 0, - }, - { - "body has object ID", - "[{\"jsonrpc\": \"2.0\", \"method\": \"subtract\", \"params\": [42, 23], \"id\": {}}]", - asArray(invalidIDResponse), - 200, - 0, - }, - // this happens because we can't deserialize the method into a non - // string value, and it blows up the parsing for the whole request. - { - "bad method", - "[{\"error\":{\"code\":-32600,\"message\":\"invalid request\"},\"id\":null,\"jsonrpc\":\"2.0\"}]", - asArray(invalidMethodResponse), - 200, - 0, - }, - { - "bad JSON-RPC", - "[{\"jsonrpc\": \"1.0\", \"method\": \"subtract\", \"params\": [42, 23], \"id\": 1}]", - asArray(invalidJSONRPCVersionResponse), - 200, - 0, - }, - { - "omitted method", - "[{\"jsonrpc\": \"2.0\", \"params\": [42, 23], \"id\": 1}]", - asArray(invalidMethodResponse), - 200, - 0, - }, - { - "not whitelisted method", - "[{\"jsonrpc\": \"2.0\", \"method\": \"subtract\", \"params\": [42, 23], \"id\": 999}]", - asArray(notWhitelistedResponse), - 200, - 0, - }, - { - "mixed", - asArray( - "{\"jsonrpc\": \"2.0\", \"method\": \"subtract\", \"params\": [42, 23], \"id\": 999}", - "{\"jsonrpc\": \"2.0\", \"method\": \"eth_chainId\", \"params\": [], \"id\": 123}", - "123", - ), - asArray( - notWhitelistedResponse, - goodResponse, - parseErrResponse, - ), - 200, - 1, - }, - } - for _, tt := range tests { - t.Run(tt.name, func(t *testing.T) { - res, code, err := client.SendRequest([]byte(tt.body)) - require.NoError(t, err) - RequireEqualJSON(t, []byte(tt.res), res) - require.Equal(t, tt.code, code) - require.Equal(t, tt.reqCount, len(goodBackend.Requests())) - }) - } -} - -func TestSizeLimits(t *testing.T) { - goodBackend := NewMockBackend(BatchedResponseHandler(200, goodResponse)) - defer goodBackend.Close() - - require.NoError(t, os.Setenv("GOOD_BACKEND_RPC_URL", goodBackend.URL())) - - config := ReadConfig("size_limits") - client := NewProxydClient("http://127.0.0.1:8545") - _, shutdown, err := proxyd.Start(config) - require.NoError(t, err) - defer shutdown() - - payload := strings.Repeat("barf", 1024*1024) - out, code, err := client.SendRequest([]byte(fmt.Sprintf(`{"jsonrpc": "2.0", "method": "eth_chainId", "params": [%s], "id": 1}`, payload))) - require.NoError(t, err) - require.Equal(t, `{"jsonrpc":"2.0","error":{"code":-32021,"message":"request body too large"},"id":null}`, strings.TrimSpace(string(out))) - require.Equal(t, 413, code) - - // The default response is already over the size limit in size_limits.toml. - out, code, err = client.SendRequest([]byte(`{"jsonrpc": "2.0", "method": "eth_chainId", "params": [], "id": 1}`)) - require.NoError(t, err) - require.Equal(t, `{"jsonrpc":"2.0","error":{"code":-32020,"message":"backend response too large"},"id":1}`, strings.TrimSpace(string(out))) - require.Equal(t, 500, code) -} - -func asArray(in ...string) string { - return "[" + strings.Join(in, ",") + "]" -} diff --git a/proxyd/integration_tests/ws_test.go b/proxyd/integration_tests/ws_test.go deleted file mode 100644 index d52cfab5cdd7..000000000000 --- a/proxyd/integration_tests/ws_test.go +++ /dev/null @@ -1,241 +0,0 @@ -package integration_tests - -import ( - "os" - "strings" - "sync/atomic" - "testing" - "time" - - "github.com/ethereum-optimism/optimism/proxyd" - "github.com/gorilla/websocket" - "github.com/stretchr/testify/require" -) - -type backendHandler struct { - msgCB atomic.Value - closeCB atomic.Value -} - -func (b *backendHandler) MsgCB(conn *websocket.Conn, msgType int, data []byte) { - cb := b.msgCB.Load() - if cb == nil { - return - } - cb.(MockWSBackendOnMessage)(conn, msgType, data) -} - -func (b *backendHandler) SetMsgCB(cb MockWSBackendOnMessage) { - b.msgCB.Store(cb) -} - -func (b *backendHandler) CloseCB(conn *websocket.Conn, err error) { - cb := b.closeCB.Load() - if cb == nil { - return - } - cb.(MockWSBackendOnClose)(conn, err) -} - -func (b *backendHandler) SetCloseCB(cb MockWSBackendOnClose) { - b.closeCB.Store(cb) -} - -type clientHandler struct { - msgCB atomic.Value -} - -func (c *clientHandler) MsgCB(msgType int, data []byte) { - cb := c.msgCB.Load().(ProxydWSClientOnMessage) - if cb == nil { - return - } - cb(msgType, data) -} - -func (c *clientHandler) SetMsgCB(cb ProxydWSClientOnMessage) { - c.msgCB.Store(cb) -} - -func TestWS(t *testing.T) { - backendHdlr := new(backendHandler) - clientHdlr := new(clientHandler) - - backend := NewMockWSBackend(nil, func(conn *websocket.Conn, msgType int, data []byte) { - backendHdlr.MsgCB(conn, msgType, data) - }, func(conn *websocket.Conn, err error) { - backendHdlr.CloseCB(conn, err) - }) - defer backend.Close() - - require.NoError(t, os.Setenv("GOOD_BACKEND_RPC_URL", backend.URL())) - - config := ReadConfig("ws") - _, shutdown, err := proxyd.Start(config) - require.NoError(t, err) - client, err := NewProxydWSClient("ws://127.0.0.1:8546", func(msgType int, data []byte) { - clientHdlr.MsgCB(msgType, data) - }, nil) - defer client.HardClose() - require.NoError(t, err) - defer shutdown() - - tests := []struct { - name string - backendRes string - expRes string - clientReq string - }{ - { - "ok response", - "{\"jsonrpc\":\"2.0\",\"id\":1,\"result\":\"0xcd0c3e8af590364c09d0fa6a1210faf5\"}", - "{\"jsonrpc\":\"2.0\",\"id\":1,\"result\":\"0xcd0c3e8af590364c09d0fa6a1210faf5\"}", - "{\"id\": 1, \"method\": \"eth_subscribe\", \"params\": [\"newHeads\"]}", - }, - { - "garbage backend response", - "gibblegabble", - "{\"jsonrpc\":\"2.0\",\"error\":{\"code\":-32013,\"message\":\"backend returned an invalid response\"},\"id\":null}", - "{\"id\": 1, \"method\": \"eth_subscribe\", \"params\": [\"newHeads\"]}", - }, - { - "blacklisted RPC", - "}", - "{\"jsonrpc\":\"2.0\",\"error\":{\"code\":-32601,\"message\":\"rpc method is not whitelisted\"},\"id\":1}", - "{\"id\": 1, \"method\": \"eth_whatever\", \"params\": []}", - }, - { - "garbage client request", - "{}", - "{\"jsonrpc\":\"2.0\",\"error\":{\"code\":-32700,\"message\":\"parse error\"},\"id\":null}", - "barf", - }, - { - "invalid client request", - "{}", - "{\"jsonrpc\":\"2.0\",\"error\":{\"code\":-32700,\"message\":\"parse error\"},\"id\":null}", - "{\"jsonrpc\": \"2.0\", \"method\": true}", - }, - { - "eth_accounts", - "{}", - "{\"jsonrpc\":\"2.0\",\"result\":[],\"id\":1}", - "{\"jsonrpc\": \"2.0\", \"method\": \"eth_accounts\", \"id\": 1}", - }, - } - for _, tt := range tests { - t.Run(tt.name, func(t *testing.T) { - timeout := time.NewTicker(10 * time.Second) - doneCh := make(chan struct{}, 1) - backendHdlr.SetMsgCB(func(conn *websocket.Conn, msgType int, data []byte) { - require.NoError(t, conn.WriteMessage(websocket.TextMessage, []byte(tt.backendRes))) - }) - clientHdlr.SetMsgCB(func(msgType int, data []byte) { - require.Equal(t, tt.expRes, string(data)) - doneCh <- struct{}{} - }) - require.NoError(t, client.WriteMessage( - websocket.TextMessage, - []byte(tt.clientReq), - )) - select { - case <-timeout.C: - t.Fatalf("timed out") - case <-doneCh: - return - } - }) - } -} - -func TestWSClientClosure(t *testing.T) { - backendHdlr := new(backendHandler) - clientHdlr := new(clientHandler) - - backend := NewMockWSBackend(nil, func(conn *websocket.Conn, msgType int, data []byte) { - backendHdlr.MsgCB(conn, msgType, data) - }, func(conn *websocket.Conn, err error) { - backendHdlr.CloseCB(conn, err) - }) - defer backend.Close() - - require.NoError(t, os.Setenv("GOOD_BACKEND_RPC_URL", backend.URL())) - - config := ReadConfig("ws") - _, shutdown, err := proxyd.Start(config) - require.NoError(t, err) - defer shutdown() - - for _, closeType := range []string{"soft", "hard"} { - t.Run(closeType, func(t *testing.T) { - client, err := NewProxydWSClient("ws://127.0.0.1:8546", func(msgType int, data []byte) { - clientHdlr.MsgCB(msgType, data) - }, nil) - require.NoError(t, err) - - timeout := time.NewTicker(30 * time.Second) - doneCh := make(chan struct{}, 1) - backendHdlr.SetCloseCB(func(conn *websocket.Conn, err error) { - doneCh <- struct{}{} - }) - - if closeType == "soft" { - require.NoError(t, client.SoftClose()) - } else { - client.HardClose() - } - - select { - case <-timeout.C: - t.Fatalf("timed out") - case <-doneCh: - return - } - }) - } -} - -func TestWSClientExceedReadLimit(t *testing.T) { - backendHdlr := new(backendHandler) - clientHdlr := new(clientHandler) - - backend := NewMockWSBackend(nil, func(conn *websocket.Conn, msgType int, data []byte) { - backendHdlr.MsgCB(conn, msgType, data) - }, func(conn *websocket.Conn, err error) { - backendHdlr.CloseCB(conn, err) - }) - defer backend.Close() - - require.NoError(t, os.Setenv("GOOD_BACKEND_RPC_URL", backend.URL())) - - config := ReadConfig("ws") - _, shutdown, err := proxyd.Start(config) - require.NoError(t, err) - defer shutdown() - - client, err := NewProxydWSClient("ws://127.0.0.1:8546", func(msgType int, data []byte) { - clientHdlr.MsgCB(msgType, data) - }, nil) - require.NoError(t, err) - - closed := false - originalHandler := client.conn.CloseHandler() - client.conn.SetCloseHandler(func(code int, text string) error { - closed = true - return originalHandler(code, text) - }) - - backendHdlr.SetMsgCB(func(conn *websocket.Conn, msgType int, data []byte) { - t.Fatalf("backend should not get the large message") - }) - - payload := strings.Repeat("barf", 1024*1024) - clientReq := "{\"id\": 1, \"method\": \"eth_subscribe\", \"params\": [\"" + payload + "\"]}" - err = client.WriteMessage( - websocket.TextMessage, - []byte(clientReq), - ) - require.Error(t, err) - require.True(t, closed) - -} diff --git a/proxyd/methods.go b/proxyd/methods.go deleted file mode 100644 index 08ea773288ab..000000000000 --- a/proxyd/methods.go +++ /dev/null @@ -1,92 +0,0 @@ -package proxyd - -import ( - "context" - "crypto/sha256" - "encoding/json" - "fmt" - "strings" - "sync" - - "github.com/ethereum/go-ethereum/log" -) - -type RPCMethodHandler interface { - GetRPCMethod(context.Context, *RPCReq) (*RPCRes, error) - PutRPCMethod(context.Context, *RPCReq, *RPCRes) error -} - -type StaticMethodHandler struct { - cache Cache - m sync.RWMutex - filterGet func(*RPCReq) bool - filterPut func(*RPCReq, *RPCRes) bool -} - -func (e *StaticMethodHandler) key(req *RPCReq) string { - // signature is the hashed json.RawMessage param contents - h := sha256.New() - h.Write(req.Params) - signature := fmt.Sprintf("%x", h.Sum(nil)) - return strings.Join([]string{"cache", req.Method, signature}, ":") -} - -func (e *StaticMethodHandler) GetRPCMethod(ctx context.Context, req *RPCReq) (*RPCRes, error) { - if e.cache == nil { - return nil, nil - } - if e.filterGet != nil && !e.filterGet(req) { - return nil, nil - } - - e.m.RLock() - defer e.m.RUnlock() - - key := e.key(req) - val, err := e.cache.Get(ctx, key) - if err != nil { - log.Error("error reading from cache", "key", key, "method", req.Method, "err", err) - return nil, err - } - if val == "" { - return nil, nil - } - - var result interface{} - if err := json.Unmarshal([]byte(val), &result); err != nil { - log.Error("error unmarshalling value from cache", "key", key, "method", req.Method, "err", err) - return nil, err - } - return &RPCRes{ - JSONRPC: req.JSONRPC, - Result: result, - ID: req.ID, - }, nil -} - -func (e *StaticMethodHandler) PutRPCMethod(ctx context.Context, req *RPCReq, res *RPCRes) error { - if e.cache == nil { - return nil - } - // if there is a filter on get, we don't want to cache it because its irretrievable - if e.filterGet != nil && !e.filterGet(req) { - return nil - } - // response filter - if e.filterPut != nil && !e.filterPut(req, res) { - return nil - } - - e.m.Lock() - defer e.m.Unlock() - - key := e.key(req) - value := mustMarshalJSON(res.Result) - - err := e.cache.Put(ctx, key, string(value)) - if err != nil { - log.Error("error putting into cache", "key", key, "method", req.Method, "err", err) - return err - } - return nil -} diff --git a/proxyd/metrics.go b/proxyd/metrics.go deleted file mode 100644 index 90a79ab7cc6d..000000000000 --- a/proxyd/metrics.go +++ /dev/null @@ -1,575 +0,0 @@ -package proxyd - -import ( - "context" - "fmt" - "regexp" - "strconv" - "strings" - "time" - - "github.com/ethereum/go-ethereum/common/hexutil" - - "github.com/prometheus/client_golang/prometheus" - "github.com/prometheus/client_golang/prometheus/promauto" -) - -const ( - MetricsNamespace = "proxyd" - - RPCRequestSourceHTTP = "http" - RPCRequestSourceWS = "ws" - - BackendProxyd = "proxyd" - SourceClient = "client" - SourceBackend = "backend" - MethodUnknown = "unknown" -) - -var PayloadSizeBuckets = []float64{10, 50, 100, 500, 1000, 5000, 10000, 100000, 1000000} -var MillisecondDurationBuckets = []float64{1, 10, 50, 100, 500, 1000, 5000, 10000, 100000} - -var ( - rpcRequestsTotal = promauto.NewCounter(prometheus.CounterOpts{ - Namespace: MetricsNamespace, - Name: "rpc_requests_total", - Help: "Count of total client RPC requests.", - }) - - rpcForwardsTotal = promauto.NewCounterVec(prometheus.CounterOpts{ - Namespace: MetricsNamespace, - Name: "rpc_forwards_total", - Help: "Count of total RPC requests forwarded to each backend.", - }, []string{ - "auth", - "backend_name", - "method_name", - "source", - }) - - rpcBackendHTTPResponseCodesTotal = promauto.NewCounterVec(prometheus.CounterOpts{ - Namespace: MetricsNamespace, - Name: "rpc_backend_http_response_codes_total", - Help: "Count of total backend responses by HTTP status code.", - }, []string{ - "auth", - "backend_name", - "method_name", - "status_code", - "batched", - }) - - rpcErrorsTotal = promauto.NewCounterVec(prometheus.CounterOpts{ - Namespace: MetricsNamespace, - Name: "rpc_errors_total", - Help: "Count of total RPC errors.", - }, []string{ - "auth", - "backend_name", - "method_name", - "error_code", - }) - - rpcSpecialErrorsTotal = promauto.NewCounterVec(prometheus.CounterOpts{ - Namespace: MetricsNamespace, - Name: "rpc_special_errors_total", - Help: "Count of total special RPC errors.", - }, []string{ - "auth", - "backend_name", - "method_name", - "error_type", - }) - - rpcBackendRequestDurationSumm = promauto.NewSummaryVec(prometheus.SummaryOpts{ - Namespace: MetricsNamespace, - Name: "rpc_backend_request_duration_seconds", - Help: "Summary of backend response times broken down by backend and method name.", - Objectives: map[float64]float64{0.5: 0.05, 0.9: 0.01, 0.95: 0.005, 0.99: 0.001}, - }, []string{ - "backend_name", - "method_name", - "batched", - }) - - activeClientWsConnsGauge = promauto.NewGaugeVec(prometheus.GaugeOpts{ - Namespace: MetricsNamespace, - Name: "active_client_ws_conns", - Help: "Gauge of active client WS connections.", - }, []string{ - "auth", - }) - - activeBackendWsConnsGauge = promauto.NewGaugeVec(prometheus.GaugeOpts{ - Namespace: MetricsNamespace, - Name: "active_backend_ws_conns", - Help: "Gauge of active backend WS connections.", - }, []string{ - "backend_name", - }) - - unserviceableRequestsTotal = promauto.NewCounterVec(prometheus.CounterOpts{ - Namespace: MetricsNamespace, - Name: "unserviceable_requests_total", - Help: "Count of total requests that were rejected due to no backends being available.", - }, []string{ - "auth", - "request_source", - }) - - httpResponseCodesTotal = promauto.NewCounterVec(prometheus.CounterOpts{ - Namespace: MetricsNamespace, - Name: "http_response_codes_total", - Help: "Count of total HTTP response codes.", - }, []string{ - "status_code", - }) - - httpRequestDurationSumm = promauto.NewSummary(prometheus.SummaryOpts{ - Namespace: MetricsNamespace, - Name: "http_request_duration_seconds", - Help: "Summary of HTTP request durations, in seconds.", - Objectives: map[float64]float64{0.5: 0.05, 0.9: 0.01, 0.95: 0.005, 0.99: 0.001}, - }) - - wsMessagesTotal = promauto.NewCounterVec(prometheus.CounterOpts{ - Namespace: MetricsNamespace, - Name: "ws_messages_total", - Help: "Count of total websocket messages including protocol control.", - }, []string{ - "auth", - "backend_name", - "source", - }) - - redisErrorsTotal = promauto.NewCounterVec(prometheus.CounterOpts{ - Namespace: MetricsNamespace, - Name: "redis_errors_total", - Help: "Count of total Redis errors.", - }, []string{ - "source", - }) - - requestPayloadSizesGauge = promauto.NewHistogramVec(prometheus.HistogramOpts{ - Namespace: MetricsNamespace, - Name: "request_payload_sizes", - Help: "Histogram of client request payload sizes.", - Buckets: PayloadSizeBuckets, - }, []string{ - "auth", - }) - - responsePayloadSizesGauge = promauto.NewHistogramVec(prometheus.HistogramOpts{ - Namespace: MetricsNamespace, - Name: "response_payload_sizes", - Help: "Histogram of client response payload sizes.", - Buckets: PayloadSizeBuckets, - }, []string{ - "auth", - }) - - cacheHitsTotal = promauto.NewCounterVec(prometheus.CounterOpts{ - Namespace: MetricsNamespace, - Name: "cache_hits_total", - Help: "Number of cache hits.", - }, []string{ - "method", - }) - - cacheMissesTotal = promauto.NewCounterVec(prometheus.CounterOpts{ - Namespace: MetricsNamespace, - Name: "cache_misses_total", - Help: "Number of cache misses.", - }, []string{ - "method", - }) - - cacheErrorsTotal = promauto.NewCounterVec(prometheus.CounterOpts{ - Namespace: MetricsNamespace, - Name: "cache_errors_total", - Help: "Number of cache errors.", - }, []string{ - "method", - }) - - batchRPCShortCircuitsTotal = promauto.NewCounter(prometheus.CounterOpts{ - Namespace: MetricsNamespace, - Name: "batch_rpc_short_circuits_total", - Help: "Count of total batch RPC short-circuits.", - }) - - rpcSpecialErrors = []string{ - "nonce too low", - "gas price too high", - "gas price too low", - "invalid parameters", - } - - redisCacheDurationSumm = promauto.NewHistogramVec(prometheus.HistogramOpts{ - Namespace: MetricsNamespace, - Name: "redis_cache_duration_milliseconds", - Help: "Histogram of Redis command durations, in milliseconds.", - Buckets: MillisecondDurationBuckets, - }, []string{"command"}) - - tooManyRequestErrorsTotal = promauto.NewCounterVec(prometheus.CounterOpts{ - Namespace: MetricsNamespace, - Name: "too_many_request_errors_total", - Help: "Count of request timeouts due to too many concurrent RPCs.", - }, []string{ - "backend_name", - }) - - batchSizeHistogram = promauto.NewHistogram(prometheus.HistogramOpts{ - Namespace: MetricsNamespace, - Name: "batch_size_summary", - Help: "Summary of batch sizes", - Buckets: []float64{ - 1, - 5, - 10, - 25, - 50, - 100, - }, - }) - - frontendRateLimitTakeErrors = promauto.NewCounter(prometheus.CounterOpts{ - Namespace: MetricsNamespace, - Name: "rate_limit_take_errors", - Help: "Count of errors taking frontend rate limits", - }) - - consensusLatestBlock = promauto.NewGaugeVec(prometheus.GaugeOpts{ - Namespace: MetricsNamespace, - Name: "group_consensus_latest_block", - Help: "Consensus latest block", - }, []string{ - "backend_group_name", - }) - - consensusSafeBlock = promauto.NewGaugeVec(prometheus.GaugeOpts{ - Namespace: MetricsNamespace, - Name: "group_consensus_safe_block", - Help: "Consensus safe block", - }, []string{ - "backend_group_name", - }) - - consensusFinalizedBlock = promauto.NewGaugeVec(prometheus.GaugeOpts{ - Namespace: MetricsNamespace, - Name: "group_consensus_finalized_block", - Help: "Consensus finalized block", - }, []string{ - "backend_group_name", - }) - - consensusHAError = promauto.NewCounterVec(prometheus.CounterOpts{ - Namespace: MetricsNamespace, - Name: "group_consensus_ha_error", - Help: "Consensus HA error count", - }, []string{ - "error", - }) - - consensusHALatestBlock = promauto.NewGaugeVec(prometheus.GaugeOpts{ - Namespace: MetricsNamespace, - Name: "group_consensus_ha_latest_block", - Help: "Consensus HA latest block", - }, []string{ - "backend_group_name", - "leader", - }) - - consensusHASafeBlock = promauto.NewGaugeVec(prometheus.GaugeOpts{ - Namespace: MetricsNamespace, - Name: "group_consensus_ha_safe_block", - Help: "Consensus HA safe block", - }, []string{ - "backend_group_name", - "leader", - }) - - consensusHAFinalizedBlock = promauto.NewGaugeVec(prometheus.GaugeOpts{ - Namespace: MetricsNamespace, - Name: "group_consensus_ha_finalized_block", - Help: "Consensus HA finalized block", - }, []string{ - "backend_group_name", - "leader", - }) - - backendLatestBlockBackend = promauto.NewGaugeVec(prometheus.GaugeOpts{ - Namespace: MetricsNamespace, - Name: "backend_latest_block", - Help: "Current latest block observed per backend", - }, []string{ - "backend_name", - }) - - backendSafeBlockBackend = promauto.NewGaugeVec(prometheus.GaugeOpts{ - Namespace: MetricsNamespace, - Name: "backend_safe_block", - Help: "Current safe block observed per backend", - }, []string{ - "backend_name", - }) - - backendFinalizedBlockBackend = promauto.NewGaugeVec(prometheus.GaugeOpts{ - Namespace: MetricsNamespace, - Name: "backend_finalized_block", - Help: "Current finalized block observed per backend", - }, []string{ - "backend_name", - }) - - backendUnexpectedBlockTagsBackend = promauto.NewGaugeVec(prometheus.GaugeOpts{ - Namespace: MetricsNamespace, - Name: "backend_unexpected_block_tags", - Help: "Bool gauge for unexpected block tags", - }, []string{ - "backend_name", - }) - - consensusGroupCount = promauto.NewGaugeVec(prometheus.GaugeOpts{ - Namespace: MetricsNamespace, - Name: "group_consensus_count", - Help: "Consensus group serving traffic count", - }, []string{ - "backend_group_name", - }) - - consensusGroupFilteredCount = promauto.NewGaugeVec(prometheus.GaugeOpts{ - Namespace: MetricsNamespace, - Name: "group_consensus_filtered_count", - Help: "Consensus group filtered out from serving traffic count", - }, []string{ - "backend_group_name", - }) - - consensusGroupTotalCount = promauto.NewGaugeVec(prometheus.GaugeOpts{ - Namespace: MetricsNamespace, - Name: "group_consensus_total_count", - Help: "Total count of candidates to be part of consensus group", - }, []string{ - "backend_group_name", - }) - - consensusBannedBackends = promauto.NewGaugeVec(prometheus.GaugeOpts{ - Namespace: MetricsNamespace, - Name: "consensus_backend_banned", - Help: "Bool gauge for banned backends", - }, []string{ - "backend_name", - }) - - consensusPeerCountBackend = promauto.NewGaugeVec(prometheus.GaugeOpts{ - Namespace: MetricsNamespace, - Name: "consensus_backend_peer_count", - Help: "Peer count", - }, []string{ - "backend_name", - }) - - consensusInSyncBackend = promauto.NewGaugeVec(prometheus.GaugeOpts{ - Namespace: MetricsNamespace, - Name: "consensus_backend_in_sync", - Help: "Bool gauge for backends in sync", - }, []string{ - "backend_name", - }) - - consensusUpdateDelayBackend = promauto.NewGaugeVec(prometheus.GaugeOpts{ - Namespace: MetricsNamespace, - Name: "consensus_backend_update_delay", - Help: "Delay (ms) for backend update", - }, []string{ - "backend_name", - }) - - avgLatencyBackend = promauto.NewGaugeVec(prometheus.GaugeOpts{ - Namespace: MetricsNamespace, - Name: "backend_avg_latency", - Help: "Average latency per backend", - }, []string{ - "backend_name", - }) - - degradedBackends = promauto.NewGaugeVec(prometheus.GaugeOpts{ - Namespace: MetricsNamespace, - Name: "backend_degraded", - Help: "Bool gauge for degraded backends", - }, []string{ - "backend_name", - }) - - networkErrorRateBackend = promauto.NewGaugeVec(prometheus.GaugeOpts{ - Namespace: MetricsNamespace, - Name: "backend_error_rate", - Help: "Request error rate per backend", - }, []string{ - "backend_name", - }) -) - -func RecordRedisError(source string) { - redisErrorsTotal.WithLabelValues(source).Inc() -} - -func RecordRPCError(ctx context.Context, backendName, method string, err error) { - rpcErr, ok := err.(*RPCErr) - var code int - if ok { - MaybeRecordSpecialRPCError(ctx, backendName, method, rpcErr) - code = rpcErr.Code - } else { - code = -1 - } - - rpcErrorsTotal.WithLabelValues(GetAuthCtx(ctx), backendName, method, strconv.Itoa(code)).Inc() -} - -func RecordWSMessage(ctx context.Context, backendName, source string) { - wsMessagesTotal.WithLabelValues(GetAuthCtx(ctx), backendName, source).Inc() -} - -func RecordUnserviceableRequest(ctx context.Context, source string) { - unserviceableRequestsTotal.WithLabelValues(GetAuthCtx(ctx), source).Inc() -} - -func RecordRPCForward(ctx context.Context, backendName, method, source string) { - rpcForwardsTotal.WithLabelValues(GetAuthCtx(ctx), backendName, method, source).Inc() -} - -func MaybeRecordSpecialRPCError(ctx context.Context, backendName, method string, rpcErr *RPCErr) { - errMsg := strings.ToLower(rpcErr.Message) - for _, errStr := range rpcSpecialErrors { - if strings.Contains(errMsg, errStr) { - rpcSpecialErrorsTotal.WithLabelValues(GetAuthCtx(ctx), backendName, method, errStr).Inc() - return - } - } -} - -func RecordRequestPayloadSize(ctx context.Context, payloadSize int) { - requestPayloadSizesGauge.WithLabelValues(GetAuthCtx(ctx)).Observe(float64(payloadSize)) -} - -func RecordResponsePayloadSize(ctx context.Context, payloadSize int) { - responsePayloadSizesGauge.WithLabelValues(GetAuthCtx(ctx)).Observe(float64(payloadSize)) -} - -func RecordCacheHit(method string) { - cacheHitsTotal.WithLabelValues(method).Inc() -} - -func RecordCacheMiss(method string) { - cacheMissesTotal.WithLabelValues(method).Inc() -} - -func RecordCacheError(method string) { - cacheErrorsTotal.WithLabelValues(method).Inc() -} - -func RecordBatchSize(size int) { - batchSizeHistogram.Observe(float64(size)) -} - -var nonAlphanumericRegex = regexp.MustCompile(`[^a-zA-Z ]+`) - -func RecordGroupConsensusError(group *BackendGroup, label string, err error) { - errClean := nonAlphanumericRegex.ReplaceAllString(err.Error(), "") - errClean = strings.ReplaceAll(errClean, " ", "_") - errClean = strings.ReplaceAll(errClean, "__", "_") - label = fmt.Sprintf("%s.%s", label, errClean) - consensusHAError.WithLabelValues(label).Inc() -} - -func RecordGroupConsensusHALatestBlock(group *BackendGroup, leader string, blockNumber hexutil.Uint64) { - consensusHALatestBlock.WithLabelValues(group.Name, leader).Set(float64(blockNumber)) -} - -func RecordGroupConsensusHASafeBlock(group *BackendGroup, leader string, blockNumber hexutil.Uint64) { - consensusHASafeBlock.WithLabelValues(group.Name, leader).Set(float64(blockNumber)) -} - -func RecordGroupConsensusHAFinalizedBlock(group *BackendGroup, leader string, blockNumber hexutil.Uint64) { - consensusHAFinalizedBlock.WithLabelValues(group.Name, leader).Set(float64(blockNumber)) -} - -func RecordGroupConsensusLatestBlock(group *BackendGroup, blockNumber hexutil.Uint64) { - consensusLatestBlock.WithLabelValues(group.Name).Set(float64(blockNumber)) -} - -func RecordGroupConsensusSafeBlock(group *BackendGroup, blockNumber hexutil.Uint64) { - consensusSafeBlock.WithLabelValues(group.Name).Set(float64(blockNumber)) -} - -func RecordGroupConsensusFinalizedBlock(group *BackendGroup, blockNumber hexutil.Uint64) { - consensusFinalizedBlock.WithLabelValues(group.Name).Set(float64(blockNumber)) -} - -func RecordGroupConsensusCount(group *BackendGroup, count int) { - consensusGroupCount.WithLabelValues(group.Name).Set(float64(count)) -} - -func RecordGroupConsensusFilteredCount(group *BackendGroup, count int) { - consensusGroupFilteredCount.WithLabelValues(group.Name).Set(float64(count)) -} - -func RecordGroupTotalCount(group *BackendGroup, count int) { - consensusGroupTotalCount.WithLabelValues(group.Name).Set(float64(count)) -} - -func RecordBackendLatestBlock(b *Backend, blockNumber hexutil.Uint64) { - backendLatestBlockBackend.WithLabelValues(b.Name).Set(float64(blockNumber)) -} - -func RecordBackendSafeBlock(b *Backend, blockNumber hexutil.Uint64) { - backendSafeBlockBackend.WithLabelValues(b.Name).Set(float64(blockNumber)) -} - -func RecordBackendFinalizedBlock(b *Backend, blockNumber hexutil.Uint64) { - backendFinalizedBlockBackend.WithLabelValues(b.Name).Set(float64(blockNumber)) -} - -func RecordBackendUnexpectedBlockTags(b *Backend, unexpected bool) { - backendUnexpectedBlockTagsBackend.WithLabelValues(b.Name).Set(boolToFloat64(unexpected)) -} - -func RecordConsensusBackendBanned(b *Backend, banned bool) { - consensusBannedBackends.WithLabelValues(b.Name).Set(boolToFloat64(banned)) -} - -func RecordConsensusBackendPeerCount(b *Backend, peerCount uint64) { - consensusPeerCountBackend.WithLabelValues(b.Name).Set(float64(peerCount)) -} - -func RecordConsensusBackendInSync(b *Backend, inSync bool) { - consensusInSyncBackend.WithLabelValues(b.Name).Set(boolToFloat64(inSync)) -} - -func RecordConsensusBackendUpdateDelay(b *Backend, lastUpdate time.Time) { - // avoid recording the delay for the first update - if lastUpdate.IsZero() { - return - } - delay := time.Since(lastUpdate) - consensusUpdateDelayBackend.WithLabelValues(b.Name).Set(float64(delay.Milliseconds())) -} - -func RecordBackendNetworkLatencyAverageSlidingWindow(b *Backend, avgLatency time.Duration) { - avgLatencyBackend.WithLabelValues(b.Name).Set(float64(avgLatency.Milliseconds())) - degradedBackends.WithLabelValues(b.Name).Set(boolToFloat64(b.IsDegraded())) -} - -func RecordBackendNetworkErrorRateSlidingWindow(b *Backend, rate float64) { - networkErrorRateBackend.WithLabelValues(b.Name).Set(rate) -} - -func boolToFloat64(b bool) float64 { - if b { - return 1 - } - return 0 -} diff --git a/proxyd/pkg/avg-sliding-window/sliding.go b/proxyd/pkg/avg-sliding-window/sliding.go deleted file mode 100644 index 70c40be2d6da..000000000000 --- a/proxyd/pkg/avg-sliding-window/sliding.go +++ /dev/null @@ -1,188 +0,0 @@ -package avg_sliding_window - -import ( - "sync" - "time" - - lm "github.com/emirpasic/gods/maps/linkedhashmap" -) - -type Clock interface { - Now() time.Time -} - -// DefaultClock provides a clock that gets current time from the system time -type DefaultClock struct{} - -func NewDefaultClock() *DefaultClock { - return &DefaultClock{} -} -func (c DefaultClock) Now() time.Time { - return time.Now() -} - -// AdjustableClock provides a static clock to easily override the system time -type AdjustableClock struct { - now time.Time -} - -func NewAdjustableClock(now time.Time) *AdjustableClock { - return &AdjustableClock{now: now} -} -func (c *AdjustableClock) Now() time.Time { - return c.now -} -func (c *AdjustableClock) Set(now time.Time) { - c.now = now -} - -type bucket struct { - sum float64 - qty uint -} - -// AvgSlidingWindow calculates moving averages efficiently. -// Data points are rounded to nearest bucket of size `bucketSize`, -// and evicted when they are too old based on `windowLength` -type AvgSlidingWindow struct { - mux sync.Mutex - bucketSize time.Duration - windowLength time.Duration - clock Clock - buckets *lm.Map - qty uint - sum float64 -} - -type SlidingWindowOpts func(sw *AvgSlidingWindow) - -func NewSlidingWindow(opts ...SlidingWindowOpts) *AvgSlidingWindow { - sw := &AvgSlidingWindow{ - buckets: lm.New(), - } - for _, opt := range opts { - opt(sw) - } - if sw.bucketSize == 0 { - sw.bucketSize = time.Second - } - if sw.windowLength == 0 { - sw.windowLength = 5 * time.Minute - } - if sw.clock == nil { - sw.clock = NewDefaultClock() - } - return sw -} - -func WithWindowLength(windowLength time.Duration) SlidingWindowOpts { - return func(sw *AvgSlidingWindow) { - sw.windowLength = windowLength - } -} - -func WithBucketSize(bucketSize time.Duration) SlidingWindowOpts { - return func(sw *AvgSlidingWindow) { - sw.bucketSize = bucketSize - } -} - -func WithClock(clock Clock) SlidingWindowOpts { - return func(sw *AvgSlidingWindow) { - sw.clock = clock - } -} - -func (sw *AvgSlidingWindow) inWindow(t time.Time) bool { - now := sw.clock.Now().Round(sw.bucketSize) - windowStart := now.Add(-sw.windowLength) - return windowStart.Before(t) && !t.After(now) -} - -// Add inserts a new data point into the window, with value `val` and the current time -func (sw *AvgSlidingWindow) Add(val float64) { - t := sw.clock.Now() - sw.AddWithTime(t, val) -} - -// Incr is an alias to insert a data point with value float64(1) and the current time -func (sw *AvgSlidingWindow) Incr() { - sw.Add(1) -} - -// AddWithTime inserts a new data point into the window, with value `val` and time `t` -func (sw *AvgSlidingWindow) AddWithTime(t time.Time, val float64) { - sw.advance() - - defer sw.mux.Unlock() - sw.mux.Lock() - - key := t.Round(sw.bucketSize) - if !sw.inWindow(key) { - return - } - - var b *bucket - current, found := sw.buckets.Get(key) - if !found { - b = &bucket{} - } else { - b = current.(*bucket) - } - - // update bucket - bsum := b.sum - b.qty += 1 - b.sum = bsum + val - - // update window - wsum := sw.sum - sw.qty += 1 - sw.sum = wsum - bsum + b.sum - sw.buckets.Put(key, b) -} - -// advance evicts old data points -func (sw *AvgSlidingWindow) advance() { - defer sw.mux.Unlock() - sw.mux.Lock() - now := sw.clock.Now().Round(sw.bucketSize) - windowStart := now.Add(-sw.windowLength) - keys := sw.buckets.Keys() - for _, k := range keys { - if k.(time.Time).After(windowStart) { - break - } - val, _ := sw.buckets.Get(k) - b := val.(*bucket) - sw.buckets.Remove(k) - if sw.buckets.Size() > 0 { - sw.qty -= b.qty - sw.sum = sw.sum - b.sum - } else { - sw.qty = 0 - sw.sum = 0.0 - } - } -} - -// Avg retrieves the current average for the sliding window -func (sw *AvgSlidingWindow) Avg() float64 { - sw.advance() - if sw.qty == 0 { - return 0 - } - return sw.sum / float64(sw.qty) -} - -// Sum retrieves the current sum for the sliding window -func (sw *AvgSlidingWindow) Sum() float64 { - sw.advance() - return sw.sum -} - -// Count retrieves the data point count for the sliding window -func (sw *AvgSlidingWindow) Count() uint { - sw.advance() - return sw.qty -} diff --git a/proxyd/pkg/avg-sliding-window/sliding_test.go b/proxyd/pkg/avg-sliding-window/sliding_test.go deleted file mode 100644 index 37074dba8061..000000000000 --- a/proxyd/pkg/avg-sliding-window/sliding_test.go +++ /dev/null @@ -1,277 +0,0 @@ -package avg_sliding_window - -import ( - "testing" - "time" - - "github.com/stretchr/testify/require" -) - -func TestSlidingWindow_AddWithTime_Single(t *testing.T) { - now := ts("2023-04-21 15:04:05") - clock := NewAdjustableClock(now) - - sw := NewSlidingWindow( - WithWindowLength(10*time.Second), - WithBucketSize(time.Second), - WithClock(clock)) - sw.AddWithTime(ts("2023-04-21 15:04:05"), 5) - require.Equal(t, 5.0, sw.Avg()) - require.Equal(t, 5.0, sw.Sum()) - require.Equal(t, 1, int(sw.Count())) - require.Equal(t, 1, sw.buckets.Size()) - require.Equal(t, 1, int(sw.buckets.Values()[0].(*bucket).qty)) - require.Equal(t, 5.0, sw.buckets.Values()[0].(*bucket).sum) -} - -func TestSlidingWindow_AddWithTime_TwoValues_SameBucket(t *testing.T) { - now := ts("2023-04-21 15:04:05") - clock := NewAdjustableClock(now) - - sw := NewSlidingWindow( - WithWindowLength(10*time.Second), - WithBucketSize(time.Second), - WithClock(clock)) - sw.AddWithTime(ts("2023-04-21 15:04:05"), 5) - sw.AddWithTime(ts("2023-04-21 15:04:05"), 5) - require.Equal(t, 5.0, sw.Avg()) - require.Equal(t, 10.0, sw.Sum()) - require.Equal(t, 2, int(sw.Count())) - require.Equal(t, 1, sw.buckets.Size()) - require.Equal(t, 2, int(sw.buckets.Values()[0].(*bucket).qty)) - require.Equal(t, 10.0, sw.buckets.Values()[0].(*bucket).sum) -} - -func TestSlidingWindow_AddWithTime_ThreeValues_SameBucket(t *testing.T) { - now := ts("2023-04-21 15:04:05") - clock := NewAdjustableClock(now) - - sw := NewSlidingWindow( - WithWindowLength(10*time.Second), - WithBucketSize(time.Second), - WithClock(clock)) - sw.AddWithTime(ts("2023-04-21 15:04:05"), 4) - sw.AddWithTime(ts("2023-04-21 15:04:05"), 5) - sw.AddWithTime(ts("2023-04-21 15:04:05"), 6) - require.Equal(t, 5.0, sw.Avg()) - require.Equal(t, 15.0, sw.Sum()) - require.Equal(t, 3, int(sw.Count())) - require.Equal(t, 1, sw.buckets.Size()) - require.Equal(t, 15.0, sw.buckets.Values()[0].(*bucket).sum) - require.Equal(t, 3, int(sw.buckets.Values()[0].(*bucket).qty)) -} - -func TestSlidingWindow_AddWithTime_ThreeValues_ThreeBuckets(t *testing.T) { - now := ts("2023-04-21 15:04:05") - clock := NewAdjustableClock(now) - - sw := NewSlidingWindow( - WithWindowLength(10*time.Second), - WithBucketSize(time.Second), - WithClock(clock)) - sw.AddWithTime(ts("2023-04-21 15:04:01"), 4) - sw.AddWithTime(ts("2023-04-21 15:04:02"), 5) - sw.AddWithTime(ts("2023-04-21 15:04:05"), 6) - require.Equal(t, 5.0, sw.Avg()) - require.Equal(t, 15.0, sw.Sum()) - require.Equal(t, 3, int(sw.Count())) - require.Equal(t, 3, sw.buckets.Size()) - require.Equal(t, 1, int(sw.buckets.Values()[0].(*bucket).qty)) - require.Equal(t, 4.0, sw.buckets.Values()[0].(*bucket).sum) - require.Equal(t, 1, int(sw.buckets.Values()[1].(*bucket).qty)) - require.Equal(t, 5.0, sw.buckets.Values()[1].(*bucket).sum) - require.Equal(t, 1, int(sw.buckets.Values()[2].(*bucket).qty)) - require.Equal(t, 6.0, sw.buckets.Values()[2].(*bucket).sum) -} - -func TestSlidingWindow_AddWithTime_OutWindow(t *testing.T) { - now := ts("2023-04-21 15:04:05") - clock := NewAdjustableClock(now) - - sw := NewSlidingWindow( - WithWindowLength(10*time.Second), - WithBucketSize(time.Second), - WithClock(clock)) - sw.AddWithTime(ts("2023-04-21 15:03:55"), 1000) - sw.AddWithTime(ts("2023-04-21 15:04:01"), 4) - sw.AddWithTime(ts("2023-04-21 15:04:02"), 5) - sw.AddWithTime(ts("2023-04-21 15:04:05"), 6) - require.Equal(t, 5.0, sw.Avg()) - require.Equal(t, 15.0, sw.Sum()) - require.Equal(t, 3, int(sw.Count())) - require.Equal(t, 3, sw.buckets.Size()) - require.Equal(t, 1, int(sw.buckets.Values()[0].(*bucket).qty)) - require.Equal(t, 4.0, sw.buckets.Values()[0].(*bucket).sum) - require.Equal(t, 1, int(sw.buckets.Values()[1].(*bucket).qty)) - require.Equal(t, 5.0, sw.buckets.Values()[1].(*bucket).sum) - require.Equal(t, 1, int(sw.buckets.Values()[2].(*bucket).qty)) - require.Equal(t, 6.0, sw.buckets.Values()[2].(*bucket).sum) -} - -func TestSlidingWindow_AdvanceClock(t *testing.T) { - now := ts("2023-04-21 15:04:05") - clock := NewAdjustableClock(now) - - sw := NewSlidingWindow( - WithWindowLength(10*time.Second), - WithBucketSize(time.Second), - WithClock(clock)) - sw.AddWithTime(ts("2023-04-21 15:04:01"), 4) - sw.AddWithTime(ts("2023-04-21 15:04:02"), 5) - sw.AddWithTime(ts("2023-04-21 15:04:05"), 6) - require.Equal(t, 5.0, sw.Avg()) - require.Equal(t, 15.0, sw.Sum()) - require.Equal(t, 3, int(sw.Count())) - require.Equal(t, 3, sw.buckets.Size()) - - require.Equal(t, 1, int(sw.buckets.Values()[0].(*bucket).qty)) - require.Equal(t, 4.0, sw.buckets.Values()[0].(*bucket).sum) - require.Equal(t, 1, int(sw.buckets.Values()[1].(*bucket).qty)) - require.Equal(t, 5.0, sw.buckets.Values()[1].(*bucket).sum) - require.Equal(t, 1, int(sw.buckets.Values()[2].(*bucket).qty)) - require.Equal(t, 6.0, sw.buckets.Values()[2].(*bucket).sum) - - // up until 15:04:05 we had 3 buckets - // let's advance the clock to 15:04:11 and the first data point should be evicted - clock.Set(ts("2023-04-21 15:04:11")) - require.Equal(t, 5.5, sw.Avg()) - require.Equal(t, 11.0, sw.Sum()) - require.Equal(t, 2, int(sw.Count())) - require.Equal(t, 2, sw.buckets.Size()) - require.Equal(t, 1, int(sw.buckets.Values()[0].(*bucket).qty)) - require.Equal(t, 5.0, sw.buckets.Values()[0].(*bucket).sum) - require.Equal(t, 1, int(sw.buckets.Values()[1].(*bucket).qty)) - require.Equal(t, 6.0, sw.buckets.Values()[1].(*bucket).sum) - - // let's advance the clock to 15:04:12 and another data point should be evicted - clock.Set(ts("2023-04-21 15:04:12")) - require.Equal(t, 6.0, sw.Avg()) - require.Equal(t, 6.0, sw.Sum()) - require.Equal(t, 1, int(sw.Count())) - require.Equal(t, 1, sw.buckets.Size()) - require.Equal(t, 1, int(sw.buckets.Values()[0].(*bucket).qty)) - require.Equal(t, 6.0, sw.buckets.Values()[0].(*bucket).sum) - - // let's advance the clock to 15:04:25 and all data point should be evicted - clock.Set(ts("2023-04-21 15:04:25")) - require.Equal(t, 0.0, sw.Avg()) - require.Equal(t, 0.0, sw.Sum()) - require.Equal(t, 0, int(sw.Count())) - require.Equal(t, 0, sw.buckets.Size()) -} - -func TestSlidingWindow_MultipleValPerBucket(t *testing.T) { - now := ts("2023-04-21 15:04:05") - clock := NewAdjustableClock(now) - - sw := NewSlidingWindow( - WithWindowLength(10*time.Second), - WithBucketSize(time.Second), - WithClock(clock)) - sw.AddWithTime(ts("2023-04-21 15:04:01"), 4) - sw.AddWithTime(ts("2023-04-21 15:04:01"), 12) - sw.AddWithTime(ts("2023-04-21 15:04:02"), 5) - sw.AddWithTime(ts("2023-04-21 15:04:02"), 15) - sw.AddWithTime(ts("2023-04-21 15:04:05"), 6) - sw.AddWithTime(ts("2023-04-21 15:04:05"), 3) - sw.AddWithTime(ts("2023-04-21 15:04:05"), 1) - sw.AddWithTime(ts("2023-04-21 15:04:05"), 3) - require.Equal(t, 6.125, sw.Avg()) - require.Equal(t, 49.0, sw.Sum()) - require.Equal(t, 8, int(sw.Count())) - require.Equal(t, 3, sw.buckets.Size()) - require.Equal(t, 2, int(sw.buckets.Values()[0].(*bucket).qty)) - require.Equal(t, 16.0, sw.buckets.Values()[0].(*bucket).sum) - require.Equal(t, 2, int(sw.buckets.Values()[1].(*bucket).qty)) - require.Equal(t, 20.0, sw.buckets.Values()[1].(*bucket).sum) - require.Equal(t, 4, int(sw.buckets.Values()[2].(*bucket).qty)) - require.Equal(t, 13.0, sw.buckets.Values()[2].(*bucket).sum) - - // up until 15:04:05 we had 3 buckets - // let's advance the clock to 15:04:11 and the first data point should be evicted - clock.Set(ts("2023-04-21 15:04:11")) - require.Equal(t, 5.5, sw.Avg()) - require.Equal(t, 33.0, sw.Sum()) - require.Equal(t, 6, int(sw.Count())) - require.Equal(t, 2, sw.buckets.Size()) - require.Equal(t, 2, int(sw.buckets.Values()[0].(*bucket).qty)) - require.Equal(t, 20.0, sw.buckets.Values()[0].(*bucket).sum) - require.Equal(t, 4, int(sw.buckets.Values()[1].(*bucket).qty)) - require.Equal(t, 13.0, sw.buckets.Values()[1].(*bucket).sum) - - // let's advance the clock to 15:04:12 and another data point should be evicted - clock.Set(ts("2023-04-21 15:04:12")) - require.Equal(t, 3.25, sw.Avg()) - require.Equal(t, 13.0, sw.Sum()) - require.Equal(t, 4, int(sw.Count())) - require.Equal(t, 1, sw.buckets.Size()) - require.Equal(t, 4, int(sw.buckets.Values()[0].(*bucket).qty)) - require.Equal(t, 13.0, sw.buckets.Values()[0].(*bucket).sum) - - // let's advance the clock to 15:04:25 and all data point should be evicted - clock.Set(ts("2023-04-21 15:04:25")) - require.Equal(t, 0.0, sw.Avg()) - require.Equal(t, 0, sw.buckets.Size()) -} - -func TestSlidingWindow_CustomBucket(t *testing.T) { - now := ts("2023-04-21 15:04:05") - clock := NewAdjustableClock(now) - - sw := NewSlidingWindow( - WithWindowLength(30*time.Second), - WithBucketSize(10*time.Second), - WithClock(clock)) - sw.AddWithTime(ts("2023-04-21 15:03:49"), 5) // key: 03:50, sum: 5.0 - sw.AddWithTime(ts("2023-04-21 15:04:02"), 15) // key: 04:00 - sw.AddWithTime(ts("2023-04-21 15:04:03"), 5) // key: 04:00 - sw.AddWithTime(ts("2023-04-21 15:04:04"), 1) // key: 04:00, sum: 21.0 - sw.AddWithTime(ts("2023-04-21 15:04:05"), 3) // key: 04:10, sum: 3.0 - require.Equal(t, 5.8, sw.Avg()) - require.Equal(t, 29.0, sw.Sum()) - require.Equal(t, 5, int(sw.Count())) - require.Equal(t, 3, sw.buckets.Size()) - require.Equal(t, 5.0, sw.buckets.Values()[0].(*bucket).sum) - require.Equal(t, 1, int(sw.buckets.Values()[0].(*bucket).qty)) - require.Equal(t, 21.0, sw.buckets.Values()[1].(*bucket).sum) - require.Equal(t, 3, int(sw.buckets.Values()[1].(*bucket).qty)) - require.Equal(t, 3.0, sw.buckets.Values()[2].(*bucket).sum) - require.Equal(t, 1, int(sw.buckets.Values()[2].(*bucket).qty)) - - // up until 15:04:05 we had 3 buckets - // let's advance the clock to 15:04:21 and the first data point should be evicted - clock.Set(ts("2023-04-21 15:04:21")) - require.Equal(t, 6.0, sw.Avg()) - require.Equal(t, 24.0, sw.Sum()) - require.Equal(t, 4, int(sw.Count())) - require.Equal(t, 2, sw.buckets.Size()) - require.Equal(t, 21.0, sw.buckets.Values()[0].(*bucket).sum) - require.Equal(t, 3, int(sw.buckets.Values()[0].(*bucket).qty)) - require.Equal(t, 3.0, sw.buckets.Values()[1].(*bucket).sum) - require.Equal(t, 1, int(sw.buckets.Values()[1].(*bucket).qty)) - - // let's advance the clock to 15:04:32 and another data point should be evicted - clock.Set(ts("2023-04-21 15:04:32")) - require.Equal(t, 3.0, sw.Avg()) - require.Equal(t, 3.0, sw.Sum()) - require.Equal(t, 1, sw.buckets.Size()) - require.Equal(t, 1, int(sw.Count())) - require.Equal(t, 3.0, sw.buckets.Values()[0].(*bucket).sum) - require.Equal(t, 1, int(sw.buckets.Values()[0].(*bucket).qty)) - - // let's advance the clock to 15:04:46 and all data point should be evicted - clock.Set(ts("2023-04-21 15:04:46")) - require.Equal(t, 0.0, sw.Avg()) - require.Equal(t, 0.0, sw.Sum()) - require.Equal(t, 0, int(sw.Count())) - require.Equal(t, 0, sw.buckets.Size()) -} - -// 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 { - t, err := time.Parse(time.DateTime, s) - if err != nil { - panic(err) - } - return t -} diff --git a/proxyd/proxyd.go b/proxyd/proxyd.go deleted file mode 100644 index 73a311777293..000000000000 --- a/proxyd/proxyd.go +++ /dev/null @@ -1,433 +0,0 @@ -package proxyd - -import ( - "context" - "crypto/tls" - "errors" - "fmt" - "net/http" - "os" - "time" - - "github.com/ethereum/go-ethereum/common/math" - "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") - } - if len(config.BackendGroups) == 0 { - return nil, nil, errors.New("must define at least one backend group") - } - if len(config.RPCMethodMappings) == 0 { - return nil, nil, errors.New("must define at least one RPC method mapping") - } - - for authKey := range config.Authentication { - if authKey == "none" { - return nil, nil, errors.New("cannot use none as an auth key") - } - } - - var redisClient *redis.Client - if config.Redis.URL != "" { - rURL, err := ReadFromEnvOrConfig(config.Redis.URL) - if err != nil { - return nil, nil, err - } - redisClient, err = NewRedisClient(rURL) - if err != nil { - return nil, nil, err - } - } - - if redisClient == nil && config.RateLimit.UseRedis { - return nil, nil, errors.New("must specify a Redis URL if UseRedis is true in rate limit config") - } - - // While modifying shared globals is a bad practice, the alternative - // is to clone these errors on every invocation. This is inefficient. - // We'd also have to make sure that errors.Is and errors.As continue - // to function properly on the cloned errors. - if config.RateLimit.ErrorMessage != "" { - ErrOverRateLimit.Message = config.RateLimit.ErrorMessage - } - if config.WhitelistErrorMessage != "" { - ErrMethodNotWhitelisted.Message = config.WhitelistErrorMessage - } - if config.BatchConfig.ErrorMessage != "" { - ErrTooManyBatchRequests.Message = config.BatchConfig.ErrorMessage - } - - if config.SenderRateLimit.Enabled { - if config.SenderRateLimit.Limit <= 0 { - return nil, nil, errors.New("limit in sender_rate_limit must be > 0") - } - if time.Duration(config.SenderRateLimit.Interval) < time.Second { - return nil, nil, errors.New("interval in sender_rate_limit must be >= 1s") - } - } - - maxConcurrentRPCs := config.Server.MaxConcurrentRPCs - if maxConcurrentRPCs == 0 { - maxConcurrentRPCs = math.MaxInt64 - } - rpcRequestSemaphore := semaphore.NewWeighted(maxConcurrentRPCs) - - backendNames := make([]string, 0) - backendsByName := make(map[string]*Backend) - for name, cfg := range config.Backends { - opts := make([]BackendOpt, 0) - - rpcURL, err := ReadFromEnvOrConfig(cfg.RPCURL) - if err != nil { - return nil, nil, err - } - wsURL, err := ReadFromEnvOrConfig(cfg.WSURL) - if err != nil { - return nil, nil, err - } - if rpcURL == "" { - return nil, nil, fmt.Errorf("must define an RPC URL for backend %s", name) - } - - if config.BackendOptions.ResponseTimeoutSeconds != 0 { - timeout := secondsToDuration(config.BackendOptions.ResponseTimeoutSeconds) - opts = append(opts, WithTimeout(timeout)) - } - if config.BackendOptions.MaxRetries != 0 { - opts = append(opts, WithMaxRetries(config.BackendOptions.MaxRetries)) - } - if config.BackendOptions.MaxResponseSizeBytes != 0 { - opts = append(opts, WithMaxResponseSize(config.BackendOptions.MaxResponseSizeBytes)) - } - if config.BackendOptions.OutOfServiceSeconds != 0 { - opts = append(opts, WithOutOfServiceDuration(secondsToDuration(config.BackendOptions.OutOfServiceSeconds))) - } - if config.BackendOptions.MaxDegradedLatencyThreshold > 0 { - opts = append(opts, WithMaxDegradedLatencyThreshold(time.Duration(config.BackendOptions.MaxDegradedLatencyThreshold))) - } - if config.BackendOptions.MaxLatencyThreshold > 0 { - opts = append(opts, WithMaxLatencyThreshold(time.Duration(config.BackendOptions.MaxLatencyThreshold))) - } - if config.BackendOptions.MaxErrorRateThreshold > 0 { - opts = append(opts, WithMaxErrorRateThreshold(config.BackendOptions.MaxErrorRateThreshold)) - } - if cfg.MaxRPS != 0 { - opts = append(opts, WithMaxRPS(cfg.MaxRPS)) - } - if cfg.MaxWSConns != 0 { - opts = append(opts, WithMaxWSConns(cfg.MaxWSConns)) - } - if cfg.Password != "" { - passwordVal, err := ReadFromEnvOrConfig(cfg.Password) - if err != nil { - return nil, nil, err - } - opts = append(opts, WithBasicAuth(cfg.Username, passwordVal)) - } - - headers := map[string]string{} - for headerName, headerValue := range cfg.Headers { - headerValue, err := ReadFromEnvOrConfig(headerValue) - if err != nil { - return nil, nil, err - } - - headers[headerName] = headerValue - } - opts = append(opts, WithHeaders(headers)) - - tlsConfig, err := configureBackendTLS(cfg) - if err != nil { - return nil, nil, err - } - if tlsConfig != nil { - log.Info("using custom TLS config for backend", "name", name) - opts = append(opts, WithTLSConfig(tlsConfig)) - } - if cfg.StripTrailingXFF { - opts = append(opts, WithStrippedTrailingXFF()) - } - opts = append(opts, WithProxydIP(os.Getenv("PROXYD_IP"))) - opts = append(opts, WithConsensusSkipPeerCountCheck(cfg.ConsensusSkipPeerCountCheck)) - opts = append(opts, WithConsensusForcedCandidate(cfg.ConsensusForcedCandidate)) - opts = append(opts, WithWeight(cfg.Weight)) - - receiptsTarget, err := ReadFromEnvOrConfig(cfg.ConsensusReceiptsTarget) - if err != nil { - return nil, nil, err - } - receiptsTarget, err = validateReceiptsTarget(receiptsTarget) - if err != nil { - return nil, nil, err - } - opts = append(opts, WithConsensusReceiptTarget(receiptsTarget)) - - back := NewBackend(name, rpcURL, wsURL, rpcRequestSemaphore, opts...) - backendNames = append(backendNames, name) - backendsByName[name] = back - log.Info("configured backend", - "name", name, - "backend_names", backendNames, - "rpc_url", rpcURL, - "ws_url", wsURL) - } - - backendGroups := make(map[string]*BackendGroup) - for bgName, bg := range config.BackendGroups { - backends := make([]*Backend, 0) - for _, bName := range bg.Backends { - if backendsByName[bName] == nil { - return nil, nil, fmt.Errorf("backend %s is not defined", bName) - } - backends = append(backends, backendsByName[bName]) - } - - backendGroups[bgName] = &BackendGroup{ - Name: bgName, - Backends: backends, - WeightedRouting: bg.WeightedRouting, - } - } - - var wsBackendGroup *BackendGroup - if config.WSBackendGroup != "" { - wsBackendGroup = backendGroups[config.WSBackendGroup] - if wsBackendGroup == nil { - return nil, nil, fmt.Errorf("ws backend group %s does not exist", config.WSBackendGroup) - } - } - - if wsBackendGroup == nil && config.Server.WSPort != 0 { - return nil, nil, fmt.Errorf("a ws port was defined, but no ws group was defined") - } - - for _, bg := range config.RPCMethodMappings { - if backendGroups[bg] == nil { - return nil, nil, fmt.Errorf("undefined backend group %s", bg) - } - } - - var resolvedAuth map[string]string - - if config.Authentication != nil { - resolvedAuth = make(map[string]string) - for secret, alias := range config.Authentication { - resolvedSecret, err := ReadFromEnvOrConfig(secret) - if err != nil { - return nil, nil, err - } - resolvedAuth[resolvedSecret] = alias - } - } - - var ( - cache Cache - rpcCache RPCCache - ) - if config.Cache.Enabled { - if redisClient == nil { - log.Warn("redis is not configured, using in-memory cache") - cache = newMemoryCache() - } else { - ttl := defaultCacheTtl - if config.Cache.TTL != 0 { - ttl = time.Duration(config.Cache.TTL) - } - cache = newRedisCache(redisClient, config.Redis.Namespace, ttl) - } - rpcCache = newRPCCache(newCacheWithCompression(cache)) - } - - srv, err := NewServer( - backendGroups, - wsBackendGroup, - NewStringSetFromStrings(config.WSMethodWhitelist), - config.RPCMethodMappings, - config.Server.MaxBodySizeBytes, - resolvedAuth, - secondsToDuration(config.Server.TimeoutSeconds), - config.Server.MaxUpstreamBatchSize, - config.Server.EnableXServedByHeader, - rpcCache, - config.RateLimit, - config.SenderRateLimit, - config.Server.EnableRequestLog, - config.Server.MaxRequestBodyLogLen, - config.BatchConfig.MaxSize, - redisClient, - ) - if err != nil { - 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) - go func() { - if err := http.ListenAndServe(addr, promhttp.Handler()); err != nil { - log.Error("error starting metrics server", "err", err) - } - }() - } - - // To allow integration tests to cleanly come up, wait - // 10ms to give the below goroutines enough time to - // encounter an error creating their servers - errTimer := time.NewTimer(10 * time.Millisecond) - - if config.Server.RPCPort != 0 { - go func() { - if err := srv.RPCListenAndServe(config.Server.RPCHost, config.Server.RPCPort); err != nil { - if errors.Is(err, http.ErrServerClosed) { - log.Info("RPC server shut down") - return - } - log.Crit("error starting RPC server", "err", err) - } - }() - } - - if config.Server.WSPort != 0 { - go func() { - if err := srv.WSListenAndServe(config.Server.WSHost, config.Server.WSPort); err != nil { - if errors.Is(err, http.ErrServerClosed) { - log.Info("WS server shut down") - return - } - log.Crit("error starting WS server", "err", err) - } - }() - } else { - log.Info("WS server not enabled (ws_port is set to 0)") - } - - for bgName, bg := range backendGroups { - bgcfg := config.BackendGroups[bgName] - if bgcfg.ConsensusAware { - log.Info("creating poller for consensus aware backend_group", "name", bgName) - - copts := make([]ConsensusOpt, 0) - - if bgcfg.ConsensusAsyncHandler == "noop" { - copts = append(copts, WithAsyncHandler(NewNoopAsyncHandler())) - } - if bgcfg.ConsensusBanPeriod > 0 { - copts = append(copts, WithBanPeriod(time.Duration(bgcfg.ConsensusBanPeriod))) - } - if bgcfg.ConsensusMaxUpdateThreshold > 0 { - copts = append(copts, WithMaxUpdateThreshold(time.Duration(bgcfg.ConsensusMaxUpdateThreshold))) - } - if bgcfg.ConsensusMaxBlockLag > 0 { - copts = append(copts, WithMaxBlockLag(bgcfg.ConsensusMaxBlockLag)) - } - if bgcfg.ConsensusMinPeerCount > 0 { - copts = append(copts, WithMinPeerCount(uint64(bgcfg.ConsensusMinPeerCount))) - } - 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 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, WithHeartbeatInterval(time.Duration(bgcfg.ConsensusHAHeartbeatInterval))) - } - consensusHARedisClient, err := NewRedisClient(bgcfg.ConsensusHARedis.URL) - if err != nil { - return nil, nil, err - } - ns := fmt.Sprintf("%s:%s", bgcfg.ConsensusHARedis.Namespace, bg.Name) - tracker = NewRedisConsensusTracker(context.Background(), consensusHARedisClient, bg, ns, topts...) - copts = append(copts, WithTracker(tracker)) - } - - cp := NewConsensusPoller(bg, copts...) - bg.Consensus = cp - - if bgcfg.ConsensusHA { - tracker.(*RedisConsensusTracker).Init() - } - } - } - - <-errTimer.C - log.Info("started proxyd") - - shutdownFunc := func() { - log.Info("shutting down proxyd") - srv.Shutdown() - log.Info("goodbye") - } - - return srv, shutdownFunc, nil -} - -func validateReceiptsTarget(val string) (string, error) { - if val == "" { - val = ReceiptsTargetDebugGetRawReceipts - } - switch val { - case ReceiptsTargetDebugGetRawReceipts, - ReceiptsTargetAlchemyGetTransactionReceipts, - ReceiptsTargetEthGetTransactionReceipts, - ReceiptsTargetParityGetTransactionReceipts: - return val, nil - default: - return "", fmt.Errorf("invalid receipts target: %s", val) - } -} - -func secondsToDuration(seconds int) time.Duration { - return time.Duration(seconds) * time.Second -} - -func configureBackendTLS(cfg *BackendConfig) (*tls.Config, error) { - if cfg.CAFile == "" { - return nil, nil - } - - tlsConfig, err := CreateTLSClient(cfg.CAFile) - if err != nil { - return nil, err - } - - if cfg.ClientCertFile != "" && cfg.ClientKeyFile != "" { - cert, err := ParseKeyPair(cfg.ClientCertFile, cfg.ClientKeyFile) - if err != nil { - return nil, err - } - tlsConfig.Certificates = []tls.Certificate{cert} - } - - return tlsConfig, nil -} diff --git a/proxyd/reader.go b/proxyd/reader.go deleted file mode 100644 index b16301f1f087..000000000000 --- a/proxyd/reader.go +++ /dev/null @@ -1,32 +0,0 @@ -package proxyd - -import ( - "errors" - "io" -) - -var ErrLimitReaderOverLimit = errors.New("over read limit") - -func LimitReader(r io.Reader, n int64) io.Reader { return &LimitedReader{r, n} } - -// A LimitedReader reads from R but limits the amount of -// data returned to just N bytes. Each call to Read -// updates N to reflect the new amount remaining. -// Unlike the standard library version, Read returns -// ErrLimitReaderOverLimit when N <= 0. -type LimitedReader struct { - R io.Reader // underlying reader - N int64 // max bytes remaining -} - -func (l *LimitedReader) Read(p []byte) (int, error) { - if l.N <= 0 { - return 0, ErrLimitReaderOverLimit - } - if int64(len(p)) > l.N { - p = p[0:l.N] - } - n, err := l.R.Read(p) - l.N -= int64(n) - return n, err -} diff --git a/proxyd/reader_test.go b/proxyd/reader_test.go deleted file mode 100644 index 2ee23456edfc..000000000000 --- a/proxyd/reader_test.go +++ /dev/null @@ -1,43 +0,0 @@ -package proxyd - -import ( - "github.com/stretchr/testify/require" - "io" - "strings" - "testing" -) - -func TestLimitReader(t *testing.T) { - data := "hellohellohellohello" - r := LimitReader(strings.NewReader(data), 3) - buf := make([]byte, 3) - - // Buffer reads OK - n, err := r.Read(buf) - require.NoError(t, err) - require.Equal(t, 3, n) - - // Buffer is over limit - n, err = r.Read(buf) - require.Equal(t, ErrLimitReaderOverLimit, err) - require.Equal(t, 0, n) - - // Buffer on initial read is over size - buf = make([]byte, 16) - r = LimitReader(strings.NewReader(data), 3) - n, err = r.Read(buf) - require.NoError(t, err) - require.Equal(t, 3, n) - - // test with read all where the limit is less than the data - r = LimitReader(strings.NewReader(data), 3) - out, err := io.ReadAll(r) - require.Equal(t, ErrLimitReaderOverLimit, err) - require.Equal(t, "hel", string(out)) - - // test with read all where the limit is more than the data - r = LimitReader(strings.NewReader(data), 21) - out, err = io.ReadAll(r) - require.NoError(t, err) - require.Equal(t, data, string(out)) -} diff --git a/proxyd/redis.go b/proxyd/redis.go deleted file mode 100644 index bd15f527f9b7..000000000000 --- a/proxyd/redis.go +++ /dev/null @@ -1,22 +0,0 @@ -package proxyd - -import ( - "context" - "time" - - "github.com/redis/go-redis/v9" -) - -func NewRedisClient(url string) (*redis.Client, error) { - opts, err := redis.ParseURL(url) - if err != nil { - return nil, err - } - client := redis.NewClient(opts) - ctx, cancel := context.WithTimeout(context.Background(), 5*time.Second) - defer cancel() - if err := client.Ping(ctx).Err(); err != nil { - return nil, wrapErr(err, "error connecting to redis") - } - return client, nil -} diff --git a/proxyd/rewriter.go b/proxyd/rewriter.go deleted file mode 100644 index 605787eff312..000000000000 --- a/proxyd/rewriter.go +++ /dev/null @@ -1,310 +0,0 @@ -package proxyd - -import ( - "encoding/json" - "errors" - - "github.com/ethereum/go-ethereum/common/hexutil" - "github.com/ethereum/go-ethereum/rpc" -) - -type RewriteContext struct { - latest hexutil.Uint64 - safe hexutil.Uint64 - finalized hexutil.Uint64 - maxBlockRange uint64 -} - -type RewriteResult uint8 - -const ( - // RewriteNone means request should be forwarded as-is - RewriteNone RewriteResult = iota - - // RewriteOverrideError means there was an error attempting to rewrite - RewriteOverrideError - - // RewriteOverrideRequest means the modified request should be forwarded to the backend - RewriteOverrideRequest - - // RewriteOverrideResponse means to skip calling the backend and serve the overridden response - RewriteOverrideResponse -) - -var ( - ErrRewriteBlockOutOfRange = errors.New("block is out of range") - ErrRewriteRangeTooLarge = errors.New("block range is too large") -) - -// RewriteTags modifies the request and the response based on block tags -func RewriteTags(rctx RewriteContext, req *RPCReq, res *RPCRes) (RewriteResult, error) { - rw, err := RewriteResponse(rctx, req, res) - if rw == RewriteOverrideResponse { - return rw, err - } - return RewriteRequest(rctx, req, res) -} - -// RewriteResponse modifies the response object to comply with the rewrite context -// after the method has been called at the backend -// RewriteResult informs the decision of the rewrite -func RewriteResponse(rctx RewriteContext, req *RPCReq, res *RPCRes) (RewriteResult, error) { - switch req.Method { - case "eth_blockNumber": - res.Result = rctx.latest - return RewriteOverrideResponse, nil - } - return RewriteNone, nil -} - -// RewriteRequest modifies the request object to comply with the rewrite context -// before the method has been called at the backend -// it returns false if nothing was changed -func RewriteRequest(rctx RewriteContext, req *RPCReq, res *RPCRes) (RewriteResult, error) { - switch req.Method { - case "eth_getLogs", - "eth_newFilter": - return rewriteRange(rctx, req, res, 0) - case "debug_getRawReceipts", "consensus_getReceipts": - return rewriteParam(rctx, req, res, 0, true, false) - case "eth_getBalance", - "eth_getCode", - "eth_getTransactionCount", - "eth_call": - return rewriteParam(rctx, req, res, 1, false, true) - case "eth_getStorageAt", - "eth_getProof": - return rewriteParam(rctx, req, res, 2, false, true) - case "eth_getBlockTransactionCountByNumber", - "eth_getUncleCountByBlockNumber", - "eth_getBlockByNumber", - "eth_getTransactionByBlockNumberAndIndex", - "eth_getUncleByBlockNumberAndIndex": - return rewriteParam(rctx, req, res, 0, false, false) - } - return RewriteNone, nil -} - -func rewriteParam(rctx RewriteContext, req *RPCReq, res *RPCRes, pos int, required bool, blockNrOrHash bool) (RewriteResult, error) { - var p []interface{} - err := json.Unmarshal(req.Params, &p) - if err != nil { - return RewriteOverrideError, err - } - - // we assume latest if the param is missing, - // and we don't rewrite if there is not enough params - if len(p) == pos && !required { - p = append(p, "latest") - } else if len(p) <= pos { - return RewriteNone, nil - } - - // support for https://eips.ethereum.org/EIPS/eip-1898 - var val interface{} - var rw bool - if blockNrOrHash { - bnh, err := remarshalBlockNumberOrHash(p[pos]) - if err != nil { - // fallback to string - s, ok := p[pos].(string) - if ok { - val, rw, err = rewriteTag(rctx, s) - if err != nil { - return RewriteOverrideError, err - } - } else { - return RewriteOverrideError, errors.New("expected BlockNumberOrHash or string") - } - } else { - val, rw, err = rewriteTagBlockNumberOrHash(rctx, bnh) - if err != nil { - return RewriteOverrideError, err - } - } - } else { - s, ok := p[pos].(string) - if !ok { - return RewriteOverrideError, errors.New("expected string") - } - - val, rw, err = rewriteTag(rctx, s) - if err != nil { - return RewriteOverrideError, err - } - } - - if rw { - p[pos] = val - paramRaw, err := json.Marshal(p) - if err != nil { - return RewriteOverrideError, err - } - req.Params = paramRaw - return RewriteOverrideRequest, nil - } - return RewriteNone, nil -} - -func rewriteRange(rctx RewriteContext, req *RPCReq, res *RPCRes, pos int) (RewriteResult, error) { - var p []map[string]interface{} - err := json.Unmarshal(req.Params, &p) - if err != nil { - return RewriteOverrideError, err - } - - // if either fromBlock or toBlock is defined, default the other to "latest" if unset - _, hasFrom := p[pos]["fromBlock"] - _, hasTo := p[pos]["toBlock"] - if hasFrom && !hasTo { - p[pos]["toBlock"] = "latest" - } else if hasTo && !hasFrom { - p[pos]["fromBlock"] = "latest" - } - - modifiedFrom, err := rewriteTagMap(rctx, p[pos], "fromBlock") - if err != nil { - return RewriteOverrideError, err - } - - modifiedTo, err := rewriteTagMap(rctx, p[pos], "toBlock") - if err != nil { - return RewriteOverrideError, err - } - - if rctx.maxBlockRange > 0 && (hasFrom || hasTo) { - from, err := blockNumber(p[pos], "fromBlock", uint64(rctx.latest)) - if err != nil { - return RewriteOverrideError, err - } - to, err := blockNumber(p[pos], "toBlock", uint64(rctx.latest)) - if err != nil { - return RewriteOverrideError, err - } - if to-from > rctx.maxBlockRange { - return RewriteOverrideError, ErrRewriteRangeTooLarge - } - } - - // if any of the fields the request have been changed, re-marshal the params - if modifiedFrom || modifiedTo { - paramsRaw, err := json.Marshal(p) - req.Params = paramsRaw - if err != nil { - return RewriteOverrideError, err - } - return RewriteOverrideRequest, nil - } - - return RewriteNone, nil -} - -func blockNumber(m map[string]interface{}, key string, latest uint64) (uint64, error) { - current, ok := m[key].(string) - if !ok { - return 0, errors.New("expected string") - } - // the latest/safe/finalized tags are already replaced by rewriteTag - if current == "earliest" { - return 0, nil - } - if current == "pending" { - return latest + 1, nil - } - return hexutil.DecodeUint64(current) -} - -func rewriteTagMap(rctx RewriteContext, m map[string]interface{}, key string) (bool, error) { - if m[key] == nil || m[key] == "" { - return false, nil - } - - current, ok := m[key].(string) - if !ok { - return false, errors.New("expected string") - } - - val, rw, err := rewriteTag(rctx, current) - if err != nil { - return false, err - } - if rw { - m[key] = val - return true, nil - } - - return false, nil -} - -func remarshalBlockNumberOrHash(current interface{}) (*rpc.BlockNumberOrHash, error) { - jv, err := json.Marshal(current) - if err != nil { - return nil, err - } - - var bnh rpc.BlockNumberOrHash - err = bnh.UnmarshalJSON(jv) - if err != nil { - return nil, err - } - - return &bnh, nil -} - -func rewriteTag(rctx RewriteContext, current string) (string, bool, error) { - bnh, err := remarshalBlockNumberOrHash(current) - if err != nil { - return "", false, err - } - - // this is a hash, not a block - if bnh.BlockNumber == nil { - return current, false, nil - } - - switch *bnh.BlockNumber { - case rpc.PendingBlockNumber, - rpc.EarliestBlockNumber: - return current, false, nil - case rpc.FinalizedBlockNumber: - return rctx.finalized.String(), true, nil - case rpc.SafeBlockNumber: - return rctx.safe.String(), true, nil - case rpc.LatestBlockNumber: - return rctx.latest.String(), true, nil - default: - if bnh.BlockNumber.Int64() > int64(rctx.latest) { - return "", false, ErrRewriteBlockOutOfRange - } - } - - return current, false, nil -} - -func rewriteTagBlockNumberOrHash(rctx RewriteContext, current *rpc.BlockNumberOrHash) (*rpc.BlockNumberOrHash, bool, error) { - // this is a hash, not a block number - if current.BlockNumber == nil { - return current, false, nil - } - - switch *current.BlockNumber { - case rpc.PendingBlockNumber, - rpc.EarliestBlockNumber: - return current, false, nil - case rpc.FinalizedBlockNumber: - bn := rpc.BlockNumberOrHashWithNumber(rpc.BlockNumber(rctx.finalized)) - return &bn, true, nil - case rpc.SafeBlockNumber: - bn := rpc.BlockNumberOrHashWithNumber(rpc.BlockNumber(rctx.safe)) - return &bn, true, nil - case rpc.LatestBlockNumber: - bn := rpc.BlockNumberOrHashWithNumber(rpc.BlockNumber(rctx.latest)) - return &bn, true, nil - default: - if current.BlockNumber.Int64() > int64(rctx.latest) { - return nil, false, ErrRewriteBlockOutOfRange - } - } - - return current, false, nil -} diff --git a/proxyd/rewriter_test.go b/proxyd/rewriter_test.go deleted file mode 100644 index 1f0d80ba25c9..000000000000 --- a/proxyd/rewriter_test.go +++ /dev/null @@ -1,717 +0,0 @@ -package proxyd - -import ( - "encoding/json" - "strings" - "testing" - - "github.com/ethereum/go-ethereum/common" - "github.com/ethereum/go-ethereum/common/hexutil" - "github.com/ethereum/go-ethereum/rpc" - "github.com/stretchr/testify/require" -) - -type args struct { - rctx RewriteContext - req *RPCReq - res *RPCRes -} - -type rewriteTest struct { - name string - args args - expected RewriteResult - expectedErr error - check func(*testing.T, args) -} - -func TestRewriteRequest(t *testing.T) { - tests := []rewriteTest{ - /* range scoped */ - { - name: "eth_getLogs fromBlock latest", - args: args{ - rctx: RewriteContext{latest: hexutil.Uint64(100)}, - req: &RPCReq{Method: "eth_getLogs", Params: mustMarshalJSON([]map[string]interface{}{{"fromBlock": "latest"}})}, - res: nil, - }, - expected: RewriteOverrideRequest, - check: func(t *testing.T, args args) { - var p []map[string]interface{} - err := json.Unmarshal(args.req.Params, &p) - require.Nil(t, err) - require.Equal(t, hexutil.Uint64(100).String(), p[0]["fromBlock"]) - }, - }, - { - name: "eth_getLogs fromBlock within range", - args: args{ - rctx: RewriteContext{latest: hexutil.Uint64(100)}, - req: &RPCReq{Method: "eth_getLogs", Params: mustMarshalJSON([]map[string]interface{}{{"fromBlock": hexutil.Uint64(55).String()}})}, - res: nil, - }, - expected: RewriteOverrideRequest, - check: func(t *testing.T, args args) { - var p []map[string]interface{} - err := json.Unmarshal(args.req.Params, &p) - require.Nil(t, err) - require.Equal(t, hexutil.Uint64(55).String(), p[0]["fromBlock"]) - }, - }, - { - name: "eth_getLogs fromBlock out of range", - args: args{ - rctx: RewriteContext{latest: hexutil.Uint64(100)}, - req: &RPCReq{Method: "eth_getLogs", Params: mustMarshalJSON([]map[string]interface{}{{"fromBlock": hexutil.Uint64(111).String()}})}, - res: nil, - }, - expected: RewriteOverrideError, - expectedErr: ErrRewriteBlockOutOfRange, - }, - { - name: "eth_getLogs toBlock latest", - args: args{ - rctx: RewriteContext{latest: hexutil.Uint64(100)}, - req: &RPCReq{Method: "eth_getLogs", Params: mustMarshalJSON([]map[string]interface{}{{"toBlock": "latest"}})}, - res: nil, - }, - expected: RewriteOverrideRequest, - check: func(t *testing.T, args args) { - var p []map[string]interface{} - err := json.Unmarshal(args.req.Params, &p) - require.Nil(t, err) - require.Equal(t, hexutil.Uint64(100).String(), p[0]["toBlock"]) - }, - }, - { - name: "eth_getLogs toBlock within range", - args: args{ - rctx: RewriteContext{latest: hexutil.Uint64(100)}, - req: &RPCReq{Method: "eth_getLogs", Params: mustMarshalJSON([]map[string]interface{}{{"toBlock": hexutil.Uint64(55).String()}})}, - res: nil, - }, - expected: RewriteOverrideRequest, - check: func(t *testing.T, args args) { - var p []map[string]interface{} - err := json.Unmarshal(args.req.Params, &p) - require.Nil(t, err) - require.Equal(t, hexutil.Uint64(55).String(), p[0]["toBlock"]) - }, - }, - { - name: "eth_getLogs toBlock out of range", - args: args{ - rctx: RewriteContext{latest: hexutil.Uint64(100)}, - req: &RPCReq{Method: "eth_getLogs", Params: mustMarshalJSON([]map[string]interface{}{{"toBlock": hexutil.Uint64(111).String()}})}, - res: nil, - }, - expected: RewriteOverrideError, - expectedErr: ErrRewriteBlockOutOfRange, - }, - { - name: "eth_getLogs fromBlock, toBlock latest", - args: args{ - rctx: RewriteContext{latest: hexutil.Uint64(100)}, - req: &RPCReq{Method: "eth_getLogs", Params: mustMarshalJSON([]map[string]interface{}{{"fromBlock": "latest", "toBlock": "latest"}})}, - res: nil, - }, - expected: RewriteOverrideRequest, - check: func(t *testing.T, args args) { - var p []map[string]interface{} - err := json.Unmarshal(args.req.Params, &p) - require.Nil(t, err) - require.Equal(t, hexutil.Uint64(100).String(), p[0]["fromBlock"]) - require.Equal(t, hexutil.Uint64(100).String(), p[0]["toBlock"]) - }, - }, - { - name: "eth_getLogs fromBlock, toBlock within range", - args: args{ - rctx: RewriteContext{latest: hexutil.Uint64(100)}, - req: &RPCReq{Method: "eth_getLogs", Params: mustMarshalJSON([]map[string]interface{}{{"fromBlock": hexutil.Uint64(55).String(), "toBlock": hexutil.Uint64(77).String()}})}, - res: nil, - }, - expected: RewriteNone, - check: func(t *testing.T, args args) { - var p []map[string]interface{} - err := json.Unmarshal(args.req.Params, &p) - require.Nil(t, err) - require.Equal(t, hexutil.Uint64(55).String(), p[0]["fromBlock"]) - require.Equal(t, hexutil.Uint64(77).String(), p[0]["toBlock"]) - }, - }, - { - name: "eth_getLogs fromBlock, toBlock out of range", - args: args{ - rctx: RewriteContext{latest: hexutil.Uint64(100)}, - req: &RPCReq{Method: "eth_getLogs", Params: mustMarshalJSON([]map[string]interface{}{{"fromBlock": hexutil.Uint64(111).String(), "toBlock": hexutil.Uint64(222).String()}})}, - res: nil, - }, - expected: RewriteOverrideError, - expectedErr: ErrRewriteBlockOutOfRange, - }, - { - name: "eth_getLogs fromBlock -> toBlock above max range", - args: args{ - rctx: RewriteContext{latest: hexutil.Uint64(100), maxBlockRange: 30}, - req: &RPCReq{Method: "eth_getLogs", Params: mustMarshalJSON([]map[string]interface{}{{"fromBlock": hexutil.Uint64(20).String(), "toBlock": hexutil.Uint64(80).String()}})}, - res: nil, - }, - expected: RewriteOverrideError, - expectedErr: ErrRewriteRangeTooLarge, - }, - { - name: "eth_getLogs earliest -> latest above max range", - args: args{ - rctx: RewriteContext{latest: hexutil.Uint64(100), maxBlockRange: 30}, - req: &RPCReq{Method: "eth_getLogs", Params: mustMarshalJSON([]map[string]interface{}{{"fromBlock": "earliest", "toBlock": "latest"}})}, - res: nil, - }, - expected: RewriteOverrideError, - expectedErr: ErrRewriteRangeTooLarge, - }, - { - name: "eth_getLogs earliest -> pending above max range", - args: args{ - rctx: RewriteContext{latest: hexutil.Uint64(100), maxBlockRange: 30}, - req: &RPCReq{Method: "eth_getLogs", Params: mustMarshalJSON([]map[string]interface{}{{"fromBlock": "earliest", "toBlock": "pending"}})}, - res: nil, - }, - expected: RewriteOverrideError, - expectedErr: ErrRewriteRangeTooLarge, - }, - { - name: "eth_getLogs earliest -> default above max range", - args: args{ - rctx: RewriteContext{latest: hexutil.Uint64(100), maxBlockRange: 30}, - req: &RPCReq{Method: "eth_getLogs", Params: mustMarshalJSON([]map[string]interface{}{{"fromBlock": "earliest"}})}, - res: nil, - }, - expected: RewriteOverrideError, - expectedErr: ErrRewriteRangeTooLarge, - }, - { - name: "eth_getLogs default -> latest within range", - args: args{ - rctx: RewriteContext{latest: hexutil.Uint64(100), maxBlockRange: 30}, - req: &RPCReq{Method: "eth_getLogs", Params: mustMarshalJSON([]map[string]interface{}{{"toBlock": "latest"}})}, - res: nil, - }, - expected: RewriteOverrideRequest, - check: func(t *testing.T, args args) { - var p []map[string]interface{} - err := json.Unmarshal(args.req.Params, &p) - require.Nil(t, err) - require.Equal(t, hexutil.Uint64(100).String(), p[0]["fromBlock"]) - require.Equal(t, hexutil.Uint64(100).String(), p[0]["toBlock"]) - }, - }, - /* required parameter at pos 0 */ - { - name: "debug_getRawReceipts latest", - args: args{ - rctx: RewriteContext{latest: hexutil.Uint64(100)}, - req: &RPCReq{Method: "debug_getRawReceipts", Params: mustMarshalJSON([]string{"latest"})}, - res: nil, - }, - expected: RewriteOverrideRequest, - check: func(t *testing.T, args args) { - var p []string - err := json.Unmarshal(args.req.Params, &p) - require.Nil(t, err) - require.Equal(t, 1, len(p)) - require.Equal(t, hexutil.Uint64(100).String(), p[0]) - }, - }, - { - name: "debug_getRawReceipts within range", - args: args{ - rctx: RewriteContext{latest: hexutil.Uint64(100)}, - req: &RPCReq{Method: "debug_getRawReceipts", Params: mustMarshalJSON([]string{hexutil.Uint64(55).String()})}, - res: nil, - }, - expected: RewriteNone, - check: func(t *testing.T, args args) { - var p []string - err := json.Unmarshal(args.req.Params, &p) - require.Nil(t, err) - require.Equal(t, 1, len(p)) - require.Equal(t, hexutil.Uint64(55).String(), p[0]) - }, - }, - { - name: "debug_getRawReceipts out of range", - args: args{ - rctx: RewriteContext{latest: hexutil.Uint64(100)}, - req: &RPCReq{Method: "debug_getRawReceipts", Params: mustMarshalJSON([]string{hexutil.Uint64(111).String()})}, - res: nil, - }, - expected: RewriteOverrideError, - expectedErr: ErrRewriteBlockOutOfRange, - }, - { - name: "debug_getRawReceipts missing parameter", - args: args{ - rctx: RewriteContext{latest: hexutil.Uint64(100)}, - req: &RPCReq{Method: "debug_getRawReceipts", Params: mustMarshalJSON([]string{})}, - res: nil, - }, - expected: RewriteNone, - }, - { - name: "debug_getRawReceipts with block hash", - args: args{ - rctx: RewriteContext{latest: hexutil.Uint64(100)}, - req: &RPCReq{Method: "debug_getRawReceipts", Params: mustMarshalJSON([]string{"0xc6ef2fc5426d6ad6fd9e2a26abeab0aa2411b7ab17f30a99d3cb96aed1d1055b"})}, - res: nil, - }, - expected: RewriteNone, - check: func(t *testing.T, args args) { - var p []string - err := json.Unmarshal(args.req.Params, &p) - require.Nil(t, err) - require.Equal(t, 1, len(p)) - require.Equal(t, "0xc6ef2fc5426d6ad6fd9e2a26abeab0aa2411b7ab17f30a99d3cb96aed1d1055b", p[0]) - }, - }, - /* default block parameter */ - { - name: "eth_getCode omit block, should add", - args: args{ - rctx: RewriteContext{latest: hexutil.Uint64(100)}, - req: &RPCReq{Method: "eth_getCode", Params: mustMarshalJSON([]string{"0x123"})}, - res: nil, - }, - expected: RewriteOverrideRequest, - check: func(t *testing.T, args args) { - var p []interface{} - err := json.Unmarshal(args.req.Params, &p) - require.Nil(t, err) - require.Equal(t, 2, len(p)) - require.Equal(t, "0x123", p[0]) - bnh, err := remarshalBlockNumberOrHash(p[1]) - require.Nil(t, err) - require.Equal(t, rpc.BlockNumberOrHashWithNumber(100), *bnh) - }, - }, - { - name: "eth_getCode not enough params, should do nothing", - args: args{ - rctx: RewriteContext{latest: hexutil.Uint64(100)}, - req: &RPCReq{Method: "eth_getCode", Params: mustMarshalJSON([]string{})}, - res: nil, - }, - expected: RewriteNone, - check: func(t *testing.T, args args) { - var p []string - err := json.Unmarshal(args.req.Params, &p) - require.Nil(t, err) - require.Equal(t, 0, len(p)) - }, - }, - { - name: "eth_getCode latest", - args: args{ - rctx: RewriteContext{latest: hexutil.Uint64(100)}, - req: &RPCReq{Method: "eth_getCode", Params: mustMarshalJSON([]string{"0x123", "latest"})}, - res: nil, - }, - expected: RewriteOverrideRequest, - check: func(t *testing.T, args args) { - var p []interface{} - err := json.Unmarshal(args.req.Params, &p) - require.Nil(t, err) - require.Equal(t, 2, len(p)) - require.Equal(t, "0x123", p[0]) - bnh, err := remarshalBlockNumberOrHash(p[1]) - require.Nil(t, err) - require.Equal(t, rpc.BlockNumberOrHashWithNumber(100), *bnh) - }, - }, - { - name: "eth_getCode within range", - args: args{ - rctx: RewriteContext{latest: hexutil.Uint64(100)}, - req: &RPCReq{Method: "eth_getCode", Params: mustMarshalJSON([]string{"0x123", hexutil.Uint64(55).String()})}, - res: nil, - }, - expected: RewriteNone, - check: func(t *testing.T, args args) { - var p []string - err := json.Unmarshal(args.req.Params, &p) - require.Nil(t, err) - require.Equal(t, 2, len(p)) - require.Equal(t, "0x123", p[0]) - require.Equal(t, hexutil.Uint64(55).String(), p[1]) - }, - }, - { - name: "eth_getCode out of range", - args: args{ - rctx: RewriteContext{latest: hexutil.Uint64(100)}, - req: &RPCReq{Method: "eth_getCode", Params: mustMarshalJSON([]string{"0x123", hexutil.Uint64(111).String()})}, - res: nil, - }, - expected: RewriteOverrideError, - expectedErr: ErrRewriteBlockOutOfRange, - }, - /* default block parameter, at position 2 */ - { - name: "eth_getStorageAt omit block, should add", - args: args{ - rctx: RewriteContext{latest: hexutil.Uint64(100)}, - req: &RPCReq{Method: "eth_getStorageAt", Params: mustMarshalJSON([]string{"0x123", "5"})}, - res: nil, - }, - expected: RewriteOverrideRequest, - check: func(t *testing.T, args args) { - var p []interface{} - err := json.Unmarshal(args.req.Params, &p) - require.Nil(t, err) - require.Equal(t, 3, len(p)) - require.Equal(t, "0x123", p[0]) - require.Equal(t, "5", p[1]) - bnh, err := remarshalBlockNumberOrHash(p[2]) - require.Nil(t, err) - require.Equal(t, rpc.BlockNumberOrHashWithNumber(100), *bnh) - }, - }, - { - name: "eth_getStorageAt latest", - args: args{ - rctx: RewriteContext{latest: hexutil.Uint64(100)}, - req: &RPCReq{Method: "eth_getStorageAt", Params: mustMarshalJSON([]string{"0x123", "5", "latest"})}, - res: nil, - }, - expected: RewriteOverrideRequest, - check: func(t *testing.T, args args) { - var p []interface{} - err := json.Unmarshal(args.req.Params, &p) - require.Nil(t, err) - require.Equal(t, 3, len(p)) - require.Equal(t, "0x123", p[0]) - require.Equal(t, "5", p[1]) - bnh, err := remarshalBlockNumberOrHash(p[2]) - require.Nil(t, err) - require.Equal(t, rpc.BlockNumberOrHashWithNumber(100), *bnh) - }, - }, - { - name: "eth_getStorageAt within range", - args: args{ - rctx: RewriteContext{latest: hexutil.Uint64(100)}, - req: &RPCReq{Method: "eth_getStorageAt", Params: mustMarshalJSON([]string{"0x123", "5", hexutil.Uint64(55).String()})}, - res: nil, - }, - expected: RewriteNone, - check: func(t *testing.T, args args) { - var p []string - err := json.Unmarshal(args.req.Params, &p) - require.Nil(t, err) - require.Equal(t, 3, len(p)) - require.Equal(t, "0x123", p[0]) - require.Equal(t, "5", p[1]) - require.Equal(t, hexutil.Uint64(55).String(), p[2]) - }, - }, - { - name: "eth_getStorageAt out of range", - args: args{ - rctx: RewriteContext{latest: hexutil.Uint64(100)}, - req: &RPCReq{Method: "eth_getStorageAt", Params: mustMarshalJSON([]string{"0x123", "5", hexutil.Uint64(111).String()})}, - res: nil, - }, - expected: RewriteOverrideError, - expectedErr: ErrRewriteBlockOutOfRange, - }, - /* default block parameter, at position 0 */ - { - name: "eth_getBlockByNumber omit block, should add", - args: args{ - rctx: RewriteContext{latest: hexutil.Uint64(100)}, - req: &RPCReq{Method: "eth_getBlockByNumber", Params: mustMarshalJSON([]string{})}, - res: nil, - }, - expected: RewriteOverrideRequest, - check: func(t *testing.T, args args) { - var p []string - err := json.Unmarshal(args.req.Params, &p) - require.Nil(t, err) - require.Equal(t, 1, len(p)) - require.Equal(t, hexutil.Uint64(100).String(), p[0]) - }, - }, - { - name: "eth_getBlockByNumber latest", - args: args{ - rctx: RewriteContext{latest: hexutil.Uint64(100)}, - req: &RPCReq{Method: "eth_getBlockByNumber", Params: mustMarshalJSON([]string{"latest"})}, - res: nil, - }, - expected: RewriteOverrideRequest, - check: func(t *testing.T, args args) { - var p []string - err := json.Unmarshal(args.req.Params, &p) - require.Nil(t, err) - require.Equal(t, 1, len(p)) - require.Equal(t, hexutil.Uint64(100).String(), p[0]) - }, - }, - { - name: "eth_getBlockByNumber finalized", - args: args{ - rctx: RewriteContext{latest: hexutil.Uint64(100), finalized: hexutil.Uint64(55)}, - req: &RPCReq{Method: "eth_getBlockByNumber", Params: mustMarshalJSON([]string{"finalized"})}, - res: nil, - }, - expected: RewriteOverrideRequest, - check: func(t *testing.T, args args) { - var p []string - err := json.Unmarshal(args.req.Params, &p) - require.Nil(t, err) - require.Equal(t, 1, len(p)) - require.Equal(t, hexutil.Uint64(55).String(), p[0]) - }, - }, - { - name: "eth_getBlockByNumber safe", - args: args{ - rctx: RewriteContext{latest: hexutil.Uint64(100), safe: hexutil.Uint64(50)}, - req: &RPCReq{Method: "eth_getBlockByNumber", Params: mustMarshalJSON([]string{"safe"})}, - res: nil, - }, - expected: RewriteOverrideRequest, - check: func(t *testing.T, args args) { - var p []string - err := json.Unmarshal(args.req.Params, &p) - require.Nil(t, err) - require.Equal(t, 1, len(p)) - require.Equal(t, hexutil.Uint64(50).String(), p[0]) - }, - }, - { - name: "eth_getBlockByNumber within range", - args: args{ - rctx: RewriteContext{latest: hexutil.Uint64(100)}, - req: &RPCReq{Method: "eth_getBlockByNumber", Params: mustMarshalJSON([]string{hexutil.Uint64(55).String()})}, - res: nil, - }, - expected: RewriteNone, - check: func(t *testing.T, args args) { - var p []string - err := json.Unmarshal(args.req.Params, &p) - require.Nil(t, err) - require.Equal(t, 1, len(p)) - require.Equal(t, hexutil.Uint64(55).String(), p[0]) - }, - }, - { - name: "eth_getBlockByNumber out of range", - args: args{ - rctx: RewriteContext{latest: hexutil.Uint64(100)}, - req: &RPCReq{Method: "eth_getBlockByNumber", Params: mustMarshalJSON([]string{hexutil.Uint64(111).String()})}, - res: nil, - }, - expected: RewriteOverrideError, - expectedErr: ErrRewriteBlockOutOfRange, - }, - { - name: "eth_getStorageAt using rpc.BlockNumberOrHash", - args: args{ - rctx: RewriteContext{latest: hexutil.Uint64(100)}, - req: &RPCReq{Method: "eth_getStorageAt", Params: mustMarshalJSON([]string{ - "0xae851f927ee40de99aabb7461c00f9622ab91d60", - "0x65a7ed542fb37fe237fdfbdd70b31598523fe5b32879e307bae27a0bd9581c08", - "0x1c4840bcb3de3ac403c0075b46c2c47d4396c5b624b6e1b2874ec04e8879b483"})}, - res: nil, - }, - expected: RewriteNone, - }, - // eip1898 - { - name: "eth_getStorageAt using rpc.BlockNumberOrHash at genesis (blockNumber)", - args: args{ - rctx: RewriteContext{latest: hexutil.Uint64(100)}, - req: &RPCReq{Method: "eth_getStorageAt", Params: mustMarshalJSON([]interface{}{ - "0xae851f927ee40de99aabb7461c00f9622ab91d60", - "10", - map[string]interface{}{ - "blockNumber": "0x0", - }})}, - res: nil, - }, - expected: RewriteNone, - }, - { - name: "eth_getStorageAt using rpc.BlockNumberOrHash at genesis (hash)", - args: args{ - rctx: RewriteContext{latest: hexutil.Uint64(100)}, - req: &RPCReq{Method: "eth_getStorageAt", Params: mustMarshalJSON([]interface{}{ - "0xae851f927ee40de99aabb7461c00f9622ab91d60", - "10", - map[string]interface{}{ - "blockHash": "0xd4e56740f876aef8c010b86a40d5f56745a118d0906a34e69aec8c0db1cb8fa3", - "requireCanonical": true, - }})}, - res: nil, - }, - expected: RewriteNone, - check: func(t *testing.T, args args) { - var p []interface{} - err := json.Unmarshal(args.req.Params, &p) - require.Nil(t, err) - require.Equal(t, 3, len(p)) - require.Equal(t, "0xae851f927ee40de99aabb7461c00f9622ab91d60", p[0]) - require.Equal(t, "10", p[1]) - bnh, err := remarshalBlockNumberOrHash(p[2]) - require.Nil(t, err) - require.Equal(t, rpc.BlockNumberOrHashWithHash(common.HexToHash("0xd4e56740f876aef8c010b86a40d5f56745a118d0906a34e69aec8c0db1cb8fa3"), true), *bnh) - require.True(t, bnh.RequireCanonical) - }, - }, - { - name: "eth_getStorageAt using rpc.BlockNumberOrHash at latest (blockNumber)", - args: args{ - rctx: RewriteContext{latest: hexutil.Uint64(100)}, - req: &RPCReq{Method: "eth_getStorageAt", Params: mustMarshalJSON([]interface{}{ - "0xae851f927ee40de99aabb7461c00f9622ab91d60", - "10", - map[string]interface{}{ - "blockNumber": "latest", - }})}, - res: nil, - }, - expected: RewriteOverrideRequest, - check: func(t *testing.T, args args) { - var p []interface{} - err := json.Unmarshal(args.req.Params, &p) - require.Nil(t, err) - require.Equal(t, 3, len(p)) - require.Equal(t, "0xae851f927ee40de99aabb7461c00f9622ab91d60", p[0]) - require.Equal(t, "10", p[1]) - bnh, err := remarshalBlockNumberOrHash(p[2]) - require.Nil(t, err) - require.Equal(t, rpc.BlockNumberOrHashWithNumber(100), *bnh) - }, - }, - { - name: "eth_getStorageAt using rpc.BlockNumberOrHash out of range", - args: args{ - rctx: RewriteContext{latest: hexutil.Uint64(100)}, - req: &RPCReq{Method: "eth_getStorageAt", Params: mustMarshalJSON([]interface{}{ - "0xae851f927ee40de99aabb7461c00f9622ab91d60", - "10", - map[string]interface{}{ - "blockNumber": "0x111", - }})}, - res: nil, - }, - expected: RewriteOverrideError, - expectedErr: ErrRewriteBlockOutOfRange, - }, - } - - // generalize tests for other methods with same interface and behavior - tests = generalize(tests, "eth_getLogs", "eth_newFilter") - tests = generalize(tests, "eth_getCode", "eth_getBalance") - tests = generalize(tests, "eth_getCode", "eth_getTransactionCount") - tests = generalize(tests, "eth_getCode", "eth_call") - tests = generalize(tests, "eth_getBlockByNumber", "eth_getBlockTransactionCountByNumber") - tests = generalize(tests, "eth_getBlockByNumber", "eth_getUncleCountByBlockNumber") - tests = generalize(tests, "eth_getBlockByNumber", "eth_getTransactionByBlockNumberAndIndex") - tests = generalize(tests, "eth_getBlockByNumber", "eth_getUncleByBlockNumberAndIndex") - tests = generalize(tests, "eth_getStorageSlotAt", "eth_getProof") - - for _, tt := range tests { - t.Run(tt.name, func(t *testing.T) { - result, err := RewriteRequest(tt.args.rctx, tt.args.req, tt.args.res) - if result != RewriteOverrideError { - require.Nil(t, err) - require.Equal(t, tt.expected, result) - } else { - require.Equal(t, tt.expectedErr, err) - } - if tt.check != nil { - tt.check(t, tt.args) - } - }) - } -} - -func generalize(tests []rewriteTest, baseMethod string, generalizedMethod string) []rewriteTest { - newCases := make([]rewriteTest, 0) - for _, t := range tests { - if t.args.req.Method == baseMethod { - newName := strings.Replace(t.name, baseMethod, generalizedMethod, -1) - var req *RPCReq - var res *RPCRes - - if t.args.req != nil { - req = &RPCReq{ - JSONRPC: t.args.req.JSONRPC, - Method: generalizedMethod, - Params: t.args.req.Params, - ID: t.args.req.ID, - } - } - - if t.args.res != nil { - res = &RPCRes{ - JSONRPC: t.args.res.JSONRPC, - Result: t.args.res.Result, - Error: t.args.res.Error, - ID: t.args.res.ID, - } - } - newCases = append(newCases, rewriteTest{ - name: newName, - args: args{ - rctx: t.args.rctx, - req: req, - res: res, - }, - expected: t.expected, - expectedErr: t.expectedErr, - check: t.check, - }) - } - } - return append(tests, newCases...) -} - -func TestRewriteResponse(t *testing.T) { - type args struct { - rctx RewriteContext - req *RPCReq - res *RPCRes - } - tests := []struct { - name string - args args - expected RewriteResult - check func(*testing.T, args) - }{ - { - name: "eth_blockNumber latest", - args: args{ - rctx: RewriteContext{latest: hexutil.Uint64(100)}, - req: &RPCReq{Method: "eth_blockNumber"}, - res: &RPCRes{Result: hexutil.Uint64(200)}, - }, - expected: RewriteOverrideResponse, - check: func(t *testing.T, args args) { - require.Equal(t, args.res.Result, hexutil.Uint64(100)) - }, - }, - } - for _, tt := range tests { - t.Run(tt.name, func(t *testing.T) { - result, err := RewriteResponse(tt.args.rctx, tt.args.req, tt.args.res) - require.Nil(t, err) - require.Equal(t, tt.expected, result) - if tt.check != nil { - tt.check(t, tt.args) - } - }) - } -} diff --git a/proxyd/rpc.go b/proxyd/rpc.go deleted file mode 100644 index 902e26699b49..000000000000 --- a/proxyd/rpc.go +++ /dev/null @@ -1,170 +0,0 @@ -package proxyd - -import ( - "encoding/json" - "io" - "strings" -) - -type RPCReq struct { - JSONRPC string `json:"jsonrpc"` - Method string `json:"method"` - Params json.RawMessage `json:"params"` - ID json.RawMessage `json:"id"` -} - -type RPCRes struct { - JSONRPC string - Result interface{} - Error *RPCErr - ID json.RawMessage -} - -type rpcResJSON struct { - JSONRPC string `json:"jsonrpc"` - Result interface{} `json:"result,omitempty"` - Error *RPCErr `json:"error,omitempty"` - ID json.RawMessage `json:"id"` -} - -type nullResultRPCRes struct { - JSONRPC string `json:"jsonrpc"` - Result interface{} `json:"result"` - ID json.RawMessage `json:"id"` -} - -func (r *RPCRes) IsError() bool { - return r.Error != nil -} - -func (r *RPCRes) MarshalJSON() ([]byte, error) { - if r.Result == nil && r.Error == nil { - return json.Marshal(&nullResultRPCRes{ - JSONRPC: r.JSONRPC, - Result: nil, - ID: r.ID, - }) - } - - return json.Marshal(&rpcResJSON{ - JSONRPC: r.JSONRPC, - Result: r.Result, - Error: r.Error, - ID: r.ID, - }) -} - -type RPCErr struct { - Code int `json:"code"` - Message string `json:"message"` - Data string `json:"data,omitempty"` - HTTPErrorCode int `json:"-"` -} - -func (r *RPCErr) Error() string { - return r.Message -} - -func (r *RPCErr) Clone() *RPCErr { - return &RPCErr{ - Code: r.Code, - Message: r.Message, - HTTPErrorCode: r.HTTPErrorCode, - } -} - -func IsValidID(id json.RawMessage) bool { - // handle the case where the ID is a string - if strings.HasPrefix(string(id), "\"") && strings.HasSuffix(string(id), "\"") { - return len(id) > 2 - } - - // technically allows a boolean/null ID, but so does Geth - // https://github.com/ethereum/go-ethereum/blob/master/rpc/json.go#L72 - return len(id) > 0 && id[0] != '{' && id[0] != '[' -} - -func ParseRPCReq(body []byte) (*RPCReq, error) { - req := new(RPCReq) - if err := json.Unmarshal(body, req); err != nil { - return nil, ErrParseErr - } - - return req, nil -} - -func ParseBatchRPCReq(body []byte) ([]json.RawMessage, error) { - batch := make([]json.RawMessage, 0) - if err := json.Unmarshal(body, &batch); err != nil { - return nil, err - } - - return batch, nil -} - -func ParseRPCRes(r io.Reader) (*RPCRes, error) { - body, err := io.ReadAll(r) - if err != nil { - return nil, wrapErr(err, "error reading RPC response") - } - - res := new(RPCRes) - if err := json.Unmarshal(body, res); err != nil { - return nil, wrapErr(err, "error unmarshalling RPC response") - } - - return res, nil -} - -func ValidateRPCReq(req *RPCReq) error { - if req.JSONRPC != JSONRPCVersion { - return ErrInvalidRequest("invalid JSON-RPC version") - } - - if req.Method == "" { - return ErrInvalidRequest("no method specified") - } - - if !IsValidID(req.ID) { - return ErrInvalidRequest("invalid ID") - } - - return nil -} - -func NewRPCErrorRes(id json.RawMessage, err error) *RPCRes { - var rpcErr *RPCErr - if rr, ok := err.(*RPCErr); ok { - rpcErr = rr - } else { - rpcErr = &RPCErr{ - Code: JSONRPCErrorInternal, - Message: err.Error(), - } - } - - return &RPCRes{ - JSONRPC: JSONRPCVersion, - Error: rpcErr, - ID: id, - } -} - -func NewRPCRes(id json.RawMessage, result interface{}) *RPCRes { - return &RPCRes{ - JSONRPC: JSONRPCVersion, - Result: result, - ID: id, - } -} - -func IsBatch(raw []byte) bool { - for _, c := range raw { - // skip insignificant whitespace (http://www.ietf.org/rfc/rfc4627.txt) - if c == 0x20 || c == 0x09 || c == 0x0a || c == 0x0d { - continue - } - return c == '[' - } - return false -} diff --git a/proxyd/rpc_test.go b/proxyd/rpc_test.go deleted file mode 100644 index e30fe9361a6b..000000000000 --- a/proxyd/rpc_test.go +++ /dev/null @@ -1,89 +0,0 @@ -package proxyd - -import ( - "encoding/json" - "testing" - - "github.com/stretchr/testify/require" -) - -func TestRPCResJSON(t *testing.T) { - tests := []struct { - name string - in *RPCRes - out string - }{ - { - "string result", - &RPCRes{ - JSONRPC: JSONRPCVersion, - Result: "foobar", - ID: []byte("123"), - }, - `{"jsonrpc":"2.0","result":"foobar","id":123}`, - }, - { - "object result", - &RPCRes{ - JSONRPC: JSONRPCVersion, - Result: struct { - Str string `json:"str"` - }{ - "test", - }, - ID: []byte("123"), - }, - `{"jsonrpc":"2.0","result":{"str":"test"},"id":123}`, - }, - { - "nil result", - &RPCRes{ - JSONRPC: JSONRPCVersion, - Result: nil, - ID: []byte("123"), - }, - `{"jsonrpc":"2.0","result":null,"id":123}`, - }, - { - "error result without data", - &RPCRes{ - JSONRPC: JSONRPCVersion, - Error: &RPCErr{ - Code: 1234, - Message: "test err", - }, - ID: []byte("123"), - }, - `{"jsonrpc":"2.0","error":{"code":1234,"message":"test err"},"id":123}`, - }, - { - "error result with data", - &RPCRes{ - JSONRPC: JSONRPCVersion, - Error: &RPCErr{ - Code: 1234, - Message: "test err", - Data: "revert", - }, - ID: []byte("123"), - }, - `{"jsonrpc":"2.0","error":{"code":1234,"message":"test err","data":"revert"},"id":123}`, - }, - { - "string ID", - &RPCRes{ - JSONRPC: JSONRPCVersion, - Result: "foobar", - ID: []byte("\"123\""), - }, - `{"jsonrpc":"2.0","result":"foobar","id":"123"}`, - }, - } - for _, tt := range tests { - t.Run(tt.name, func(t *testing.T) { - out, err := json.Marshal(tt.in) - require.NoError(t, err) - require.Equal(t, tt.out, string(out)) - }) - } -} diff --git a/proxyd/server.go b/proxyd/server.go deleted file mode 100644 index 527c2e6c1ff8..000000000000 --- a/proxyd/server.go +++ /dev/null @@ -1,877 +0,0 @@ -package proxyd - -import ( - "context" - "crypto/rand" - "encoding/hex" - "encoding/json" - "errors" - "fmt" - "io" - "math" - "math/big" - "net/http" - "regexp" - "strconv" - "strings" - "sync" - "time" - - "github.com/ethereum/go-ethereum/common/hexutil" - "github.com/ethereum/go-ethereum/core" - "github.com/ethereum/go-ethereum/core/txpool" - "github.com/ethereum/go-ethereum/core/types" - "github.com/ethereum/go-ethereum/log" - "github.com/gorilla/mux" - "github.com/gorilla/websocket" - "github.com/prometheus/client_golang/prometheus" - "github.com/redis/go-redis/v9" - "github.com/rs/cors" - "github.com/syndtr/goleveldb/leveldb/opt" -) - -const ( - ContextKeyAuth = "authorization" - ContextKeyReqID = "req_id" - ContextKeyXForwardedFor = "x_forwarded_for" - DefaultMaxBatchRPCCallsLimit = 100 - MaxBatchRPCCallsHardLimit = 1000 - cacheStatusHdr = "X-Proxyd-Cache-Status" - defaultRPCTimeout = 10 * time.Second - defaultBodySizeLimit = 256 * opt.KiB - defaultWSHandshakeTimeout = 10 * time.Second - defaultWSReadTimeout = 2 * time.Minute - defaultWSWriteTimeout = 10 * time.Second - defaultCacheTtl = 1 * time.Hour - maxRequestBodyLogLen = 2000 - defaultMaxUpstreamBatchSize = 10 - defaultRateLimitHeader = "X-Forwarded-For" -) - -var emptyArrayResponse = json.RawMessage("[]") - -type Server struct { - BackendGroups map[string]*BackendGroup - wsBackendGroup *BackendGroup - wsMethodWhitelist *StringSet - rpcMethodMappings map[string]string - maxBodySize int64 - enableRequestLog bool - maxRequestBodyLogLen int - authenticatedPaths map[string]string - timeout time.Duration - maxUpstreamBatchSize int - maxBatchSize int - enableServedByHeader bool - upgrader *websocket.Upgrader - mainLim FrontendRateLimiter - overrideLims map[string]FrontendRateLimiter - senderLim FrontendRateLimiter - allowedChainIds []*big.Int - limExemptOrigins []*regexp.Regexp - limExemptUserAgents []*regexp.Regexp - globallyLimitedMethods map[string]bool - rpcServer *http.Server - wsServer *http.Server - cache RPCCache - srvMu sync.Mutex - rateLimitHeader string -} - -type limiterFunc func(method string) bool - -func NewServer( - backendGroups map[string]*BackendGroup, - wsBackendGroup *BackendGroup, - wsMethodWhitelist *StringSet, - rpcMethodMappings map[string]string, - maxBodySize int64, - authenticatedPaths map[string]string, - timeout time.Duration, - maxUpstreamBatchSize int, - enableServedByHeader bool, - cache RPCCache, - rateLimitConfig RateLimitConfig, - senderRateLimitConfig SenderRateLimitConfig, - enableRequestLog bool, - maxRequestBodyLogLen int, - maxBatchSize int, - redisClient *redis.Client, -) (*Server, error) { - if cache == nil { - cache = &NoopRPCCache{} - } - - if maxBodySize == 0 { - maxBodySize = defaultBodySizeLimit - } - - if timeout == 0 { - timeout = defaultRPCTimeout - } - - if maxUpstreamBatchSize == 0 { - maxUpstreamBatchSize = defaultMaxUpstreamBatchSize - } - - if maxBatchSize == 0 { - maxBatchSize = DefaultMaxBatchRPCCallsLimit - } - - if maxBatchSize > MaxBatchRPCCallsHardLimit { - maxBatchSize = MaxBatchRPCCallsHardLimit - } - - limiterFactory := func(dur time.Duration, max int, prefix string) FrontendRateLimiter { - if rateLimitConfig.UseRedis { - return NewRedisFrontendRateLimiter(redisClient, dur, max, prefix) - } - - return NewMemoryFrontendRateLimit(dur, max) - } - - var mainLim FrontendRateLimiter - limExemptOrigins := make([]*regexp.Regexp, 0) - limExemptUserAgents := make([]*regexp.Regexp, 0) - if rateLimitConfig.BaseRate > 0 { - mainLim = limiterFactory(time.Duration(rateLimitConfig.BaseInterval), rateLimitConfig.BaseRate, "main") - for _, origin := range rateLimitConfig.ExemptOrigins { - pattern, err := regexp.Compile(origin) - if err != nil { - return nil, err - } - limExemptOrigins = append(limExemptOrigins, pattern) - } - for _, agent := range rateLimitConfig.ExemptUserAgents { - pattern, err := regexp.Compile(agent) - if err != nil { - return nil, err - } - limExemptUserAgents = append(limExemptUserAgents, pattern) - } - } else { - mainLim = NoopFrontendRateLimiter - } - - overrideLims := make(map[string]FrontendRateLimiter) - globalMethodLims := make(map[string]bool) - for method, override := range rateLimitConfig.MethodOverrides { - overrideLims[method] = limiterFactory(time.Duration(override.Interval), override.Limit, method) - - if override.Global { - globalMethodLims[method] = true - } - } - var senderLim FrontendRateLimiter - if senderRateLimitConfig.Enabled { - senderLim = limiterFactory(time.Duration(senderRateLimitConfig.Interval), senderRateLimitConfig.Limit, "senders") - } - - rateLimitHeader := defaultRateLimitHeader - if rateLimitConfig.IPHeaderOverride != "" { - rateLimitHeader = rateLimitConfig.IPHeaderOverride - } - - return &Server{ - BackendGroups: backendGroups, - wsBackendGroup: wsBackendGroup, - wsMethodWhitelist: wsMethodWhitelist, - rpcMethodMappings: rpcMethodMappings, - maxBodySize: maxBodySize, - authenticatedPaths: authenticatedPaths, - timeout: timeout, - maxUpstreamBatchSize: maxUpstreamBatchSize, - enableServedByHeader: enableServedByHeader, - cache: cache, - enableRequestLog: enableRequestLog, - maxRequestBodyLogLen: maxRequestBodyLogLen, - maxBatchSize: maxBatchSize, - upgrader: &websocket.Upgrader{ - HandshakeTimeout: defaultWSHandshakeTimeout, - }, - mainLim: mainLim, - overrideLims: overrideLims, - globallyLimitedMethods: globalMethodLims, - senderLim: senderLim, - allowedChainIds: senderRateLimitConfig.AllowedChainIds, - limExemptOrigins: limExemptOrigins, - limExemptUserAgents: limExemptUserAgents, - rateLimitHeader: rateLimitHeader, - }, nil -} - -func (s *Server) RPCListenAndServe(host string, port int) error { - s.srvMu.Lock() - hdlr := mux.NewRouter() - hdlr.HandleFunc("/healthz", s.HandleHealthz).Methods("GET") - hdlr.HandleFunc("/", s.HandleRPC).Methods("POST") - hdlr.HandleFunc("/{authorization}", s.HandleRPC).Methods("POST") - c := cors.New(cors.Options{ - AllowedOrigins: []string{"*"}, - }) - addr := fmt.Sprintf("%s:%d", host, port) - s.rpcServer = &http.Server{ - Handler: instrumentedHdlr(c.Handler(hdlr)), - Addr: addr, - } - log.Info("starting HTTP server", "addr", addr) - s.srvMu.Unlock() - return s.rpcServer.ListenAndServe() -} - -func (s *Server) WSListenAndServe(host string, port int) error { - s.srvMu.Lock() - hdlr := mux.NewRouter() - hdlr.HandleFunc("/", s.HandleWS) - hdlr.HandleFunc("/{authorization}", s.HandleWS) - c := cors.New(cors.Options{ - AllowedOrigins: []string{"*"}, - }) - addr := fmt.Sprintf("%s:%d", host, port) - s.wsServer = &http.Server{ - Handler: instrumentedHdlr(c.Handler(hdlr)), - Addr: addr, - } - log.Info("starting WS server", "addr", addr) - s.srvMu.Unlock() - return s.wsServer.ListenAndServe() -} - -func (s *Server) Shutdown() { - s.srvMu.Lock() - defer s.srvMu.Unlock() - if s.rpcServer != nil { - _ = s.rpcServer.Shutdown(context.Background()) - } - if s.wsServer != nil { - _ = s.wsServer.Shutdown(context.Background()) - } - for _, bg := range s.BackendGroups { - bg.Shutdown() - } -} - -func (s *Server) HandleHealthz(w http.ResponseWriter, r *http.Request) { - _, _ = w.Write([]byte("OK")) -} - -func (s *Server) HandleRPC(w http.ResponseWriter, r *http.Request) { - ctx := s.populateContext(w, r) - if ctx == nil { - return - } - var cancel context.CancelFunc - ctx, cancel = context.WithTimeout(ctx, s.timeout) - defer cancel() - - origin := r.Header.Get("Origin") - userAgent := r.Header.Get("User-Agent") - // Use XFF in context since it will automatically be replaced by the remote IP - xff := stripXFF(GetXForwardedFor(ctx)) - isUnlimitedOrigin := s.isUnlimitedOrigin(origin) - isUnlimitedUserAgent := s.isUnlimitedUserAgent(userAgent) - - if xff == "" { - writeRPCError(ctx, w, nil, ErrInvalidRequest("request does not include a remote IP")) - return - } - - isLimited := func(method string) bool { - isGloballyLimitedMethod := s.isGlobalLimit(method) - if !isGloballyLimitedMethod && (isUnlimitedOrigin || isUnlimitedUserAgent) { - return false - } - - var lim FrontendRateLimiter - if method == "" { - lim = s.mainLim - } else { - lim = s.overrideLims[method] - } - - if lim == nil { - return false - } - - ok, err := lim.Take(ctx, xff) - if err != nil { - log.Warn("error taking rate limit", "err", err) - return true - } - return !ok - } - - if isLimited("") { - RecordRPCError(ctx, BackendProxyd, "unknown", ErrOverRateLimit) - log.Warn( - "rate limited request", - "req_id", GetReqID(ctx), - "auth", GetAuthCtx(ctx), - "user_agent", userAgent, - "origin", origin, - "remote_ip", xff, - ) - writeRPCError(ctx, w, nil, ErrOverRateLimit) - return - } - - log.Info( - "received RPC request", - "req_id", GetReqID(ctx), - "auth", GetAuthCtx(ctx), - "user_agent", userAgent, - "origin", origin, - "remote_ip", xff, - ) - - body, err := io.ReadAll(LimitReader(r.Body, s.maxBodySize)) - if errors.Is(err, ErrLimitReaderOverLimit) { - log.Error("request body too large", "req_id", GetReqID(ctx)) - RecordRPCError(ctx, BackendProxyd, MethodUnknown, ErrRequestBodyTooLarge) - writeRPCError(ctx, w, nil, ErrRequestBodyTooLarge) - return - } - if err != nil { - log.Error("error reading request body", "err", err) - writeRPCError(ctx, w, nil, ErrInternal) - return - } - RecordRequestPayloadSize(ctx, len(body)) - - if s.enableRequestLog { - log.Info("Raw RPC request", - "body", truncate(string(body), s.maxRequestBodyLogLen), - "req_id", GetReqID(ctx), - "auth", GetAuthCtx(ctx), - ) - } - - if IsBatch(body) { - reqs, err := ParseBatchRPCReq(body) - if err != nil { - log.Error("error parsing batch RPC request", "err", err) - RecordRPCError(ctx, BackendProxyd, MethodUnknown, err) - writeRPCError(ctx, w, nil, ErrParseErr) - return - } - - RecordBatchSize(len(reqs)) - - if len(reqs) > s.maxBatchSize { - RecordRPCError(ctx, BackendProxyd, MethodUnknown, ErrTooManyBatchRequests) - writeRPCError(ctx, w, nil, ErrTooManyBatchRequests) - return - } - - if len(reqs) == 0 { - writeRPCError(ctx, w, nil, ErrInvalidRequest("must specify at least one batch call")) - return - } - - batchRes, batchContainsCached, servedBy, err := s.handleBatchRPC(ctx, reqs, isLimited, true) - if err == context.DeadlineExceeded { - writeRPCError(ctx, w, nil, ErrGatewayTimeout) - return - } - if errors.Is(err, ErrConsensusGetReceiptsCantBeBatched) || - errors.Is(err, ErrConsensusGetReceiptsInvalidTarget) { - writeRPCError(ctx, w, nil, ErrInvalidRequest(err.Error())) - return - } - if err != nil { - writeRPCError(ctx, w, nil, ErrInternal) - return - } - if s.enableServedByHeader { - w.Header().Set("x-served-by", servedBy) - } - setCacheHeader(w, batchContainsCached) - writeBatchRPCRes(ctx, w, batchRes) - return - } - - rawBody := json.RawMessage(body) - backendRes, cached, servedBy, err := s.handleBatchRPC(ctx, []json.RawMessage{rawBody}, isLimited, false) - if err != nil { - if errors.Is(err, ErrConsensusGetReceiptsCantBeBatched) || - errors.Is(err, ErrConsensusGetReceiptsInvalidTarget) { - writeRPCError(ctx, w, nil, ErrInvalidRequest(err.Error())) - return - } - writeRPCError(ctx, w, nil, ErrInternal) - return - } - if s.enableServedByHeader { - w.Header().Set("x-served-by", servedBy) - } - setCacheHeader(w, cached) - writeRPCRes(ctx, w, backendRes[0]) -} - -func (s *Server) handleBatchRPC(ctx context.Context, reqs []json.RawMessage, isLimited limiterFunc, isBatch bool) ([]*RPCRes, bool, string, error) { - // A request set is transformed into groups of batches. - // Each batch group maps to a forwarded JSON-RPC batch request (subject to maxUpstreamBatchSize constraints) - // A groupID is used to decouple Requests that have duplicate ID so they're not part of the same batch that's - // forwarded to the backend. This is done to ensure that the order of JSON-RPC Responses match the Request order - // as the backend MAY return Responses out of order. - // NOTE: Duplicate request ids induces 1-sized JSON-RPC batches - type batchGroup struct { - groupID int - backendGroup string - } - - responses := make([]*RPCRes, len(reqs)) - batches := make(map[batchGroup][]batchElem) - ids := make(map[string]int, len(reqs)) - - for i := range reqs { - parsedReq, err := ParseRPCReq(reqs[i]) - if err != nil { - log.Info("error parsing RPC call", "source", "rpc", "err", err) - responses[i] = NewRPCErrorRes(nil, err) - continue - } - - // Simple health check - if len(reqs) == 1 && parsedReq.Method == proxydHealthzMethod { - res := &RPCRes{ - ID: parsedReq.ID, - JSONRPC: JSONRPCVersion, - Result: "OK", - } - return []*RPCRes{res}, false, "", nil - } - - if err := ValidateRPCReq(parsedReq); err != nil { - RecordRPCError(ctx, BackendProxyd, MethodUnknown, err) - responses[i] = NewRPCErrorRes(nil, err) - continue - } - - if parsedReq.Method == "eth_accounts" { - RecordRPCForward(ctx, BackendProxyd, "eth_accounts", RPCRequestSourceHTTP) - responses[i] = NewRPCRes(parsedReq.ID, emptyArrayResponse) - continue - } - - group := s.rpcMethodMappings[parsedReq.Method] - if group == "" { - // use unknown below to prevent DOS vector that fills up memory - // with arbitrary method names. - log.Info( - "blocked request for non-whitelisted method", - "source", "rpc", - "req_id", GetReqID(ctx), - "method", parsedReq.Method, - ) - RecordRPCError(ctx, BackendProxyd, MethodUnknown, ErrMethodNotWhitelisted) - responses[i] = NewRPCErrorRes(parsedReq.ID, ErrMethodNotWhitelisted) - continue - } - - // Take rate limit for specific methods. - // NOTE: eventually, this should apply to all batch requests. However, - // since we don't have data right now on the size of each batch, we - // only apply this to the methods that have an additional rate limit. - if _, ok := s.overrideLims[parsedReq.Method]; ok && isLimited(parsedReq.Method) { - log.Info( - "rate limited specific RPC", - "source", "rpc", - "req_id", GetReqID(ctx), - "method", parsedReq.Method, - ) - RecordRPCError(ctx, BackendProxyd, parsedReq.Method, ErrOverRateLimit) - responses[i] = NewRPCErrorRes(parsedReq.ID, ErrOverRateLimit) - continue - } - - // Apply a sender-based rate limit if it is enabled. Note that sender-based rate - // limits apply regardless of origin or user-agent. As such, they don't use the - // isLimited method. - if parsedReq.Method == "eth_sendRawTransaction" && s.senderLim != nil { - if err := s.rateLimitSender(ctx, parsedReq); err != nil { - RecordRPCError(ctx, BackendProxyd, parsedReq.Method, err) - responses[i] = NewRPCErrorRes(parsedReq.ID, err) - continue - } - } - - id := string(parsedReq.ID) - // If this is a duplicate Request ID, move the Request to a new batchGroup - ids[id]++ - batchGroupID := ids[id] - batchGroup := batchGroup{groupID: batchGroupID, backendGroup: group} - batches[batchGroup] = append(batches[batchGroup], batchElem{parsedReq, i}) - } - - servedBy := make(map[string]bool, 0) - var cached bool - for group, batch := range batches { - var cacheMisses []batchElem - - for _, req := range batch { - backendRes, _ := s.cache.GetRPC(ctx, req.Req) - if backendRes != nil { - responses[req.Index] = backendRes - cached = true - } else { - cacheMisses = append(cacheMisses, req) - } - } - - // Create minibatches - each minibatch must be no larger than the maxUpstreamBatchSize - numBatches := int(math.Ceil(float64(len(cacheMisses)) / float64(s.maxUpstreamBatchSize))) - for i := 0; i < numBatches; i++ { - if ctx.Err() == context.DeadlineExceeded { - log.Info("short-circuiting batch RPC", - "req_id", GetReqID(ctx), - "auth", GetAuthCtx(ctx), - "batch_index", i, - ) - batchRPCShortCircuitsTotal.Inc() - return nil, false, "", context.DeadlineExceeded - } - - start := i * s.maxUpstreamBatchSize - end := int(math.Min(float64(start+s.maxUpstreamBatchSize), float64(len(cacheMisses)))) - elems := cacheMisses[start:end] - res, sb, err := s.BackendGroups[group.backendGroup].Forward(ctx, createBatchRequest(elems), isBatch) - servedBy[sb] = true - if err != nil { - if errors.Is(err, ErrConsensusGetReceiptsCantBeBatched) || - errors.Is(err, ErrConsensusGetReceiptsInvalidTarget) { - return nil, false, "", err - } - log.Error( - "error forwarding RPC batch", - "batch_size", len(elems), - "backend_group", group, - "req_id", GetReqID(ctx), - "err", err, - ) - res = nil - for _, elem := range elems { - res = append(res, NewRPCErrorRes(elem.Req.ID, err)) - } - } - - for i := range elems { - responses[elems[i].Index] = res[i] - - // TODO(inphi): batch put these - if res[i].Error == nil && res[i].Result != nil { - if err := s.cache.PutRPC(ctx, elems[i].Req, res[i]); err != nil { - log.Warn( - "cache put error", - "req_id", GetReqID(ctx), - "err", err, - ) - } - } - } - } - } - - servedByString := "" - for sb, _ := range servedBy { - if servedByString != "" { - servedByString += ", " - } - servedByString += sb - } - - return responses, cached, servedByString, nil -} - -func (s *Server) HandleWS(w http.ResponseWriter, r *http.Request) { - ctx := s.populateContext(w, r) - if ctx == nil { - return - } - - log.Info("received WS connection", "req_id", GetReqID(ctx)) - - clientConn, err := s.upgrader.Upgrade(w, r, nil) - if err != nil { - log.Error("error upgrading client conn", "auth", GetAuthCtx(ctx), "req_id", GetReqID(ctx), "err", err) - return - } - clientConn.SetReadLimit(s.maxBodySize) - - proxier, err := s.wsBackendGroup.ProxyWS(ctx, clientConn, s.wsMethodWhitelist) - if err != nil { - if errors.Is(err, ErrNoBackends) { - RecordUnserviceableRequest(ctx, RPCRequestSourceWS) - } - log.Error("error dialing ws backend", "auth", GetAuthCtx(ctx), "req_id", GetReqID(ctx), "err", err) - clientConn.Close() - return - } - - activeClientWsConnsGauge.WithLabelValues(GetAuthCtx(ctx)).Inc() - go func() { - // Below call blocks so run it in a goroutine. - if err := proxier.Proxy(ctx); err != nil { - log.Error("error proxying websocket", "auth", GetAuthCtx(ctx), "req_id", GetReqID(ctx), "err", err) - } - activeClientWsConnsGauge.WithLabelValues(GetAuthCtx(ctx)).Dec() - }() - - log.Info("accepted WS connection", "auth", GetAuthCtx(ctx), "req_id", GetReqID(ctx)) -} - -func (s *Server) populateContext(w http.ResponseWriter, r *http.Request) context.Context { - vars := mux.Vars(r) - authorization := vars["authorization"] - xff := r.Header.Get(s.rateLimitHeader) - if xff == "" { - ipPort := strings.Split(r.RemoteAddr, ":") - if len(ipPort) == 2 { - xff = ipPort[0] - } - } - ctx := context.WithValue(r.Context(), ContextKeyXForwardedFor, xff) // nolint:staticcheck - - if len(s.authenticatedPaths) > 0 { - if authorization == "" || s.authenticatedPaths[authorization] == "" { - log.Info("blocked unauthorized request", "authorization", authorization) - httpResponseCodesTotal.WithLabelValues("401").Inc() - w.WriteHeader(401) - return nil - } - - ctx = context.WithValue(ctx, ContextKeyAuth, s.authenticatedPaths[authorization]) // nolint:staticcheck - } - - return context.WithValue( - ctx, - ContextKeyReqID, // nolint:staticcheck - randStr(10), - ) -} - -func randStr(l int) string { - b := make([]byte, l) - if _, err := rand.Read(b); err != nil { - panic(err) - } - return hex.EncodeToString(b) -} - -func (s *Server) isUnlimitedOrigin(origin string) bool { - for _, pat := range s.limExemptOrigins { - if pat.MatchString(origin) { - return true - } - } - - return false -} - -func (s *Server) isUnlimitedUserAgent(origin string) bool { - for _, pat := range s.limExemptUserAgents { - if pat.MatchString(origin) { - return true - } - } - return false -} - -func (s *Server) isGlobalLimit(method string) bool { - return s.globallyLimitedMethods[method] -} - -func (s *Server) rateLimitSender(ctx context.Context, req *RPCReq) error { - var params []string - if err := json.Unmarshal(req.Params, ¶ms); err != nil { - log.Debug("error unmarshalling raw transaction params", "err", err, "req_Id", GetReqID(ctx)) - return ErrParseErr - } - - if len(params) != 1 { - log.Debug("raw transaction request has invalid number of params", "req_id", GetReqID(ctx)) - // The error below is identical to the one Geth responds with. - return ErrInvalidParams("missing value for required argument 0") - } - - var data hexutil.Bytes - if err := data.UnmarshalText([]byte(params[0])); err != nil { - log.Debug("error decoding raw tx data", "err", err, "req_id", GetReqID(ctx)) - // Geth returns the raw error from UnmarshalText. - return ErrInvalidParams(err.Error()) - } - - // Inflates a types.Transaction object from the transaction's raw bytes. - tx := new(types.Transaction) - if err := tx.UnmarshalBinary(data); err != nil { - log.Debug("could not unmarshal transaction", "err", err, "req_id", GetReqID(ctx)) - return ErrInvalidParams(err.Error()) - } - - // Check if the transaction is for the expected chain, - // otherwise reject before rate limiting to avoid replay attacks. - if !s.isAllowedChainId(tx.ChainId()) { - log.Debug("chain id is not allowed", "req_id", GetReqID(ctx)) - return txpool.ErrInvalidSender - } - - // Convert the transaction into a Message object so that we can get the - // sender. This method performs an ecrecover, which can be expensive. - msg, err := core.TransactionToMessage(tx, types.LatestSignerForChainID(tx.ChainId()), nil) - if err != nil { - log.Debug("could not get message from transaction", "err", err, "req_id", GetReqID(ctx)) - return ErrInvalidParams(err.Error()) - } - ok, err := s.senderLim.Take(ctx, fmt.Sprintf("%s:%d", msg.From.Hex(), tx.Nonce())) - if err != nil { - log.Error("error taking from sender limiter", "err", err, "req_id", GetReqID(ctx)) - return ErrInternal - } - if !ok { - log.Debug("sender rate limit exceeded", "sender", msg.From.Hex(), "req_id", GetReqID(ctx)) - return ErrOverSenderRateLimit - } - - return nil -} - -func (s *Server) isAllowedChainId(chainId *big.Int) bool { - if s.allowedChainIds == nil || len(s.allowedChainIds) == 0 { - return true - } - for _, id := range s.allowedChainIds { - if chainId.Cmp(id) == 0 { - return true - } - } - return false -} - -func setCacheHeader(w http.ResponseWriter, cached bool) { - if cached { - w.Header().Set(cacheStatusHdr, "HIT") - } else { - w.Header().Set(cacheStatusHdr, "MISS") - } -} - -func writeRPCError(ctx context.Context, w http.ResponseWriter, id json.RawMessage, err error) { - var res *RPCRes - if r, ok := err.(*RPCErr); ok { - res = NewRPCErrorRes(id, r) - } else { - res = NewRPCErrorRes(id, ErrInternal) - } - writeRPCRes(ctx, w, res) -} - -func writeRPCRes(ctx context.Context, w http.ResponseWriter, res *RPCRes) { - statusCode := 200 - if res.IsError() && res.Error.HTTPErrorCode != 0 { - statusCode = res.Error.HTTPErrorCode - } - - w.Header().Set("content-type", "application/json") - w.WriteHeader(statusCode) - ww := &recordLenWriter{Writer: w} - enc := json.NewEncoder(ww) - if err := enc.Encode(res); err != nil { - log.Error("error writing rpc response", "err", err) - RecordRPCError(ctx, BackendProxyd, MethodUnknown, err) - return - } - httpResponseCodesTotal.WithLabelValues(strconv.Itoa(statusCode)).Inc() - RecordResponsePayloadSize(ctx, ww.Len) -} - -func writeBatchRPCRes(ctx context.Context, w http.ResponseWriter, res []*RPCRes) { - w.Header().Set("content-type", "application/json") - w.WriteHeader(200) - ww := &recordLenWriter{Writer: w} - enc := json.NewEncoder(ww) - if err := enc.Encode(res); err != nil { - log.Error("error writing batch rpc response", "err", err) - RecordRPCError(ctx, BackendProxyd, MethodUnknown, err) - return - } - RecordResponsePayloadSize(ctx, ww.Len) -} - -func instrumentedHdlr(h http.Handler) http.HandlerFunc { - return func(w http.ResponseWriter, r *http.Request) { - respTimer := prometheus.NewTimer(httpRequestDurationSumm) - h.ServeHTTP(w, r) - respTimer.ObserveDuration() - } -} - -func GetAuthCtx(ctx context.Context) string { - authUser, ok := ctx.Value(ContextKeyAuth).(string) - if !ok { - return "none" - } - - return authUser -} - -func GetReqID(ctx context.Context) string { - reqId, ok := ctx.Value(ContextKeyReqID).(string) - if !ok { - return "" - } - return reqId -} - -func GetXForwardedFor(ctx context.Context) string { - xff, ok := ctx.Value(ContextKeyXForwardedFor).(string) - if !ok { - return "" - } - return xff -} - -type recordLenWriter struct { - io.Writer - Len int -} - -func (w *recordLenWriter) Write(p []byte) (n int, err error) { - n, err = w.Writer.Write(p) - w.Len += n - return -} - -type NoopRPCCache struct{} - -func (n *NoopRPCCache) GetRPC(context.Context, *RPCReq) (*RPCRes, error) { - return nil, nil -} - -func (n *NoopRPCCache) PutRPC(context.Context, *RPCReq, *RPCRes) error { - return nil -} - -func truncate(str string, maxLen int) string { - if maxLen == 0 { - maxLen = maxRequestBodyLogLen - } - - if len(str) > maxLen { - return str[:maxLen] + "..." - } else { - return str - } -} - -type batchElem struct { - Req *RPCReq - Index int -} - -func createBatchRequest(elems []batchElem) []*RPCReq { - batch := make([]*RPCReq, len(elems)) - for i := range elems { - batch[i] = elems[i].Req - } - return batch -} diff --git a/proxyd/string_set.go b/proxyd/string_set.go deleted file mode 100644 index 458234919611..000000000000 --- a/proxyd/string_set.go +++ /dev/null @@ -1,56 +0,0 @@ -package proxyd - -import "sync" - -type StringSet struct { - underlying map[string]bool - mtx sync.RWMutex -} - -func NewStringSet() *StringSet { - return &StringSet{ - underlying: make(map[string]bool), - } -} - -func NewStringSetFromStrings(in []string) *StringSet { - underlying := make(map[string]bool) - for _, str := range in { - underlying[str] = true - } - return &StringSet{ - underlying: underlying, - } -} - -func (s *StringSet) Has(test string) bool { - s.mtx.RLock() - defer s.mtx.RUnlock() - return s.underlying[test] -} - -func (s *StringSet) Add(str string) { - s.mtx.Lock() - defer s.mtx.Unlock() - s.underlying[str] = true -} - -func (s *StringSet) Entries() []string { - s.mtx.RLock() - defer s.mtx.RUnlock() - out := make([]string, len(s.underlying)) - var i int - for entry := range s.underlying { - out[i] = entry - i++ - } - return out -} - -func (s *StringSet) Extend(in []string) *StringSet { - out := NewStringSetFromStrings(in) - for k := range s.underlying { - out.Add(k) - } - return out -} diff --git a/proxyd/tls.go b/proxyd/tls.go deleted file mode 100644 index ed2bdaff44b4..000000000000 --- a/proxyd/tls.go +++ /dev/null @@ -1,33 +0,0 @@ -package proxyd - -import ( - "crypto/tls" - "crypto/x509" - "errors" - "os" -) - -func CreateTLSClient(ca string) (*tls.Config, error) { - pem, err := os.ReadFile(ca) - if err != nil { - return nil, wrapErr(err, "error reading CA") - } - - roots := x509.NewCertPool() - ok := roots.AppendCertsFromPEM(pem) - if !ok { - return nil, errors.New("error parsing TLS client cert") - } - - return &tls.Config{ - RootCAs: roots, - }, nil -} - -func ParseKeyPair(crt, key string) (tls.Certificate, error) { - cert, err := tls.LoadX509KeyPair(crt, key) - if err != nil { - return tls.Certificate{}, wrapErr(err, "error loading x509 key pair") - } - return cert, nil -} diff --git a/proxyd/tools/mockserver/handler/handler.go b/proxyd/tools/mockserver/handler/handler.go deleted file mode 100644 index 0f9bfcad63cb..000000000000 --- a/proxyd/tools/mockserver/handler/handler.go +++ /dev/null @@ -1,135 +0,0 @@ -package handler - -import ( - "encoding/json" - "fmt" - "io" - "net/http" - "os" - "strings" - - "github.com/ethereum-optimism/optimism/proxyd" - - "github.com/gorilla/mux" - "github.com/pkg/errors" - "gopkg.in/yaml.v3" -) - -type MethodTemplate struct { - Method string `yaml:"method"` - Block string `yaml:"block"` - Response string `yaml:"response"` -} - -type MockedHandler struct { - Overrides []*MethodTemplate - Autoload bool - AutoloadFile string -} - -func (mh *MockedHandler) Serve(port int) error { - r := mux.NewRouter() - r.HandleFunc("/", mh.Handler) - http.Handle("/", r) - fmt.Printf("starting server up on :%d serving MockedResponsesFile %s\n", port, mh.AutoloadFile) - err := http.ListenAndServe(fmt.Sprintf(":%d", port), nil) - - if errors.Is(err, http.ErrServerClosed) { - fmt.Printf("server closed\n") - } else if err != nil { - fmt.Printf("error starting server: %s\n", err) - return err - } - return nil -} - -func (mh *MockedHandler) Handler(w http.ResponseWriter, req *http.Request) { - body, err := io.ReadAll(req.Body) - if err != nil { - fmt.Printf("error reading request: %v\n", err) - } - - var template []*MethodTemplate - if mh.Autoload { - template = append(template, mh.LoadFromFile(mh.AutoloadFile)...) - } - if mh.Overrides != nil { - template = append(template, mh.Overrides...) - } - - batched := proxyd.IsBatch(body) - var requests []map[string]interface{} - if batched { - err = json.Unmarshal(body, &requests) - if err != nil { - fmt.Printf("error reading request: %v\n", err) - } - } else { - var j map[string]interface{} - err = json.Unmarshal(body, &j) - if err != nil { - fmt.Printf("error reading request: %v\n", err) - } - requests = append(requests, j) - } - - var responses []string - for _, r := range requests { - method := r["method"] - block := "" - if method == "eth_getBlockByNumber" || method == "debug_getRawReceipts" { - block = (r["params"].([]interface{})[0]).(string) - } - - var selectedResponse string - for _, r := range template { - if r.Method == method && r.Block == block { - selectedResponse = r.Response - } - } - if selectedResponse != "" { - var rpcRes proxyd.RPCRes - err = json.Unmarshal([]byte(selectedResponse), &rpcRes) - if err != nil { - panic(err) - } - idJson, _ := json.Marshal(r["id"]) - rpcRes.ID = idJson - res, _ := json.Marshal(rpcRes) - responses = append(responses, string(res)) - } - } - - resBody := "" - if batched { - resBody = "[" + strings.Join(responses, ",") + "]" - } else if len(responses) > 0 { - resBody = responses[0] - } - - _, err = fmt.Fprint(w, resBody) - if err != nil { - fmt.Printf("error writing response: %v\n", err) - } -} - -func (mh *MockedHandler) LoadFromFile(file string) []*MethodTemplate { - contents, err := os.ReadFile(file) - if err != nil { - fmt.Printf("error reading MockedResponsesFile: %v\n", err) - } - var template []*MethodTemplate - err = yaml.Unmarshal(contents, &template) - if err != nil { - fmt.Printf("error reading MockedResponsesFile: %v\n", err) - } - return template -} - -func (mh *MockedHandler) AddOverride(template *MethodTemplate) { - mh.Overrides = append(mh.Overrides, template) -} - -func (mh *MockedHandler) ResetOverrides() { - mh.Overrides = make([]*MethodTemplate, 0) -} diff --git a/proxyd/tools/mockserver/main.go b/proxyd/tools/mockserver/main.go deleted file mode 100644 index a58fc06325ef..000000000000 --- a/proxyd/tools/mockserver/main.go +++ /dev/null @@ -1,30 +0,0 @@ -package main - -import ( - "fmt" - "os" - "path" - "strconv" - - "github.com/ethereum-optimism/optimism/proxyd/tools/mockserver/handler" -) - -func main() { - if len(os.Args) < 3 { - fmt.Printf("simply mock a response based on an external text MockedResponsesFile\n") - fmt.Printf("usage: mockserver <port> <MockedResponsesFile.yml>\n") - os.Exit(1) - } - port, _ := strconv.ParseInt(os.Args[1], 10, 32) - dir, _ := os.Getwd() - - h := handler.MockedHandler{ - Autoload: true, - AutoloadFile: path.Join(dir, os.Args[2]), - } - - err := h.Serve(int(port)) - if err != nil { - fmt.Printf("error starting mockserver: %v\n", err) - } -} diff --git a/proxyd/tools/mockserver/node1.yml b/proxyd/tools/mockserver/node1.yml deleted file mode 100644 index 313c65349f72..000000000000 --- a/proxyd/tools/mockserver/node1.yml +++ /dev/null @@ -1,52 +0,0 @@ -- method: eth_getBlockByNumber - block: latest - response: > - { - "jsonrpc": "2.0", - "id": 67, - "result": { - "hash": "hash2", - "number": "0x2" - } - } -- method: eth_getBlockByNumber - block: 0x1 - response: > - { - "jsonrpc": "2.0", - "id": 67, - "result": { - "hash": "hash1", - "number": "0x1" - } - } -- method: eth_getBlockByNumber - block: 0x2 - response: > - { - "jsonrpc": "2.0", - "id": 67, - "result": { - "hash": "hash2", - "number": "0x2" - } - } -- method: eth_getBlockByNumber - block: 0x3 - response: > - { - "jsonrpc": "2.0", - "id": 67, - "result": { - "hash": "hash34", - "number": "0x3" - } - } -- method: debug_getRawReceipts - block: 0x88420081ab9c6d50dc57af36b541c6b8a7b3e9c0d837b0414512c4c5883560ff - response: > - {"jsonrpc":"2.0","id":1,"result":[]} -- method: debug_getRawReceipts - block: 0x88420081ab9c6d50dc57af36b541c6b8a7b3e9c0d837b0414512c4c5883560bb - response: > - {"jsonrpc":"2.0","id":1,"result":["0x02f902c10183037ec5b9010000000000000000000000000200000000000000000000000000000000000010000000000000000000000000000000000000000000000000000000000000000000000400000000000000000008000000000000000000000000000000000000020000020000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000002800000000000000000000000000000000000000000000000200000000000000000000000000000000f901b6f8d994297a60578fd0e13076bf06cfeb2bbcd74f2680d2e1a0e5c486bee358a5fff5e4d70dc5fdaaf14806df125ffde843a8c40db608264812b8a00000000000000000000000000000000000000000000000000000000000000060000000000000000000000000000000000000000000000000000282bde1ac0c0000000000000000000000000000000000000000000000000000000000000000010000000000000000000000000000000000000000000000000000000000000016573937382e393939393939393939393939395334393600000000000000000000f8d994297a60578fd0e13076bf06cfeb2bbcd74f2680d2e1a01309ab74031e37b46ee8ce9ff667a17a5c69a500a05d167e4c89ad8b0bc40bf9b8a0000000000000000000000000cd28ab95ae80b31255b2258a116cd2c1a371e0f3000000000000000000000000000000000000000000000000000000000000006000000000000000000000000000000000000000000000000000000000652d2a700000000000000000000000000000000000000000000000000000000000000016573937382e393939393939393939393939395334393600000000000000000000","0x02f9039f01830645cdb9010000000020000000000000001000000000000000008004000000000000004000000000000000000002000000000000000000000000000000000000000000000000000000a00000000000000000000000200000000000000000000000000000000000000000000000400000000000000000000000000000000000000008000000000000000000004000400800000020000000000000000000000002000000000000000000000000000000200000000000040000000000000000000000001000000100100200000002000000000100000000010000020000000000000000000000000010000000000000000000000000000000000000000000000000000008040000f90294f8dc944638ac6b5727a8b9586d3eba5b44be4b74ed41fcf863a02ac69ee804d9a7a0984249f508dfab7cb2534b465b6ce1580f99a38ba9c5e631a0000000000000000000000000f08f78880122a9ee99f4f68dcab02177aeb08160a0000000000000000000000000f08f78880122a9ee99f4f68dcab02177aeb08160b8600000000000000000000000000000000000000000000000000032cdc63449c00000000000000000000000000000000000000000000000000000000000000000400000000000000000000000000000000000000000000000000000000000000000f8dc944638ac6b5727a8b9586d3eba5b44be4b74ed41fcf863a031b2166ff604fc5672ea5df08a78081d2bc6d746cadce880747f3643d819e83da0000000000000000000000000f08f78880122a9ee99f4f68dcab02177aeb08160a0000000000000000000000000f08f78880122a9ee99f4f68dcab02177aeb08160b8600000000000000000000000000000000000000000000000000032cdc63449c00000000000000000000000000000000000000000000000000000000000000000400000000000000000000000000000000000000000000000000000000000000000f85a947ad11bb9216bc9dc4cbd488d7618cbfd433d1e75f842a04641df4a962071e12719d8c8c8e5ac7fc4d97b927346a3d7a335b1f7517e133ca0e4bac2a8774c733b2c6da6ddf718b53614f36417dfaac90b23d2747d82d2251580f87a947fd7eea37c53abf356cc80e71144d62cd8af27d3f842a0db5c7652857aa163daadd670e116628fb42e869d8ac4251ef8971d9e5727df1ba04bd009c947444055f7e29f16c227e544387b9de8b571888d37f50becee99d76ea00000000000000000000000000000000000000000000000000000000000000001","0x02f90327018307aa96b9010000000000000000000000000028000000000000000000000000000000400000000000000000000000000000000000000000000000020000000000000000000000000000100000000000000000000000000000000000000000000000000000004000001000000000000000000000000000000000004000000000000000000000000000000000008000000000000000000000000000000000000000000000008000000000021000000000000000000000002040000000000000000000000000000000000000000000000000000000000000008000000000000000001000000000000000000000000000010000000000000000000000000000000000000000004000f9021cf9013c94af4159a80b6cc41ed517db1c453d1ef5c2e4db72f863a05e3c1311ea442664e8b1611bfabef659120ea7a0a2cfc0667700bebc69cbffe1a000000000000000000000000000000000000000000000000000000000000b574ea0eef6d16b5a91e0c5aa2df75fbb865f2be353c5052294a97ee3522d6b1ed674bfb8c00000000000000000000000006bebc4925716945d46f0ec336d5c2564f419682c000000000000000000000000000000000000000000000000000000000000000c000000000000000000000000b47d4ece2bd3d6457b9abcde547e332832a6881b5e8697f86a16fd1e3006843062eda71ce901c9f888b5abb4736b9ca9bb36748e000000000000000000000000000000000000000000000000000000000000000b00000000000000000000000000000000000000000000000000000000652d2a70f8db946bebc4925716945d46f0ec336d5c2564f419682cf842a0ff64905f73a67fb594e0f940a8075a860db489ad991e032f48c81123eb52d60ba000000000000000000000000000000000000000000000000000000000000b574eb88000000000000000000000000000000000000000000000000000000000000000200000000000000000000000000000000000000000000000000000000000000034a36c4ece2bd3d6457b9abcde547e332832a6770a0000000000000000000000000000000000000000000000000095094d8053e000000000000000000000000000","0x02f901a70183083234b9010000000000000000040000000000000000000000020000100000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000008000000000000004000000000000000000000000000000000000000000000000000000000000000000000000000000010000000000000000000000000000000040000000000040000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000002000000000000000000000000000000000000000000000000000000000800000000400000001000000000000000000000000000000000000000000000f89df89b94326c977e6efc84e512bb9c30f76e30c160ed06fbf863a0ddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3efa00000000000000000000000004281ecf07378ee595c564a59048801330f3084eea0000000000000000000000000cd5d6cadfd3b4c77415859a5d6999f2eea1da5d4a0000000000000000000000000000000000000000000000001158e460913d00000","0x02f9040a0183094189b9010000000000000000000000100000000000000000000000000000000000000000000002000000000010000000000000000000000000000000000000000000000000000000000000000000000000000000000020000000000000000000000000000000000000000000000000000000000000000000000000000004000000000000000000008000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000100000000008008000000000000000000000000000f902fff902fc94be72771b59f99adc9c07a43295fcada66cb865b9f842a035ee444266c4bfac0b9704ee4fc68807fe38d1e96b299a097442f8169f48d57da00000000000000000000000000000000000000000000000000000000000000027b902a000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000028000000000000000000000000000000000000000000000000000000000652d2a700000000000000000000000000000000000000000000000000000000000000027000000000000000000000000bc365d43d4761fd03738ebefa5ff3d7ccf8256a70000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000018000000000000000000000000000000000000000000000000000000000000001c000000000000000000000000000000000000000000000000000038d7ea4c6800000000000000000000000000000000000000000000000000000000000652e78100000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000183635326432363837663661356263626235613934643639370000000000000000000000000000000000000000000000000000000000000000000000000000001836353235626563643837396139613163653935363364643800000000000000000000000000000000000000000000000000000000000000000000000000000000","0x02f9039f01830c0891b9010000000020000000000000001000000000000000008004000000000000004000000000000000000002000000000000000000000000000000000000000000000000000000000000000000000004000000200000000000000000000000000000000000000000000000400000000040000800000000000000000000000008000000000000000040004000400800000020200000000000000000000002000000000000000200000000000000200000000000040000800000000000000000000000000100000000000002000000000100000000000000000000000000000200000000000010000000000000000000000000000000000000000000000000000108000000f90294f8dc944638ac6b5727a8b9586d3eba5b44be4b74ed41fcf863a02ac69ee804d9a7a0984249f508dfab7cb2534b465b6ce1580f99a38ba9c5e631a0000000000000000000000000ffb08a46d802102de79b998be6fe0975e44cb212a0000000000000000000000000ffb08a46d802102de79b998be6fe0975e44cb212b8600000000000000000000000000000000000000000000000000032cdc63449c00000000000000000000000000000000000000000000000000000000000000000400000000000000000000000000000000000000000000000000000000000000000f8dc944638ac6b5727a8b9586d3eba5b44be4b74ed41fcf863a031b2166ff604fc5672ea5df08a78081d2bc6d746cadce880747f3643d819e83da0000000000000000000000000ffb08a46d802102de79b998be6fe0975e44cb212a0000000000000000000000000ffb08a46d802102de79b998be6fe0975e44cb212b8600000000000000000000000000000000000000000000000000032cdc63449c00000000000000000000000000000000000000000000000000000000000000000400000000000000000000000000000000000000000000000000000000000000000f85a947ad11bb9216bc9dc4cbd488d7618cbfd433d1e75f842a04641df4a962071e12719d8c8c8e5ac7fc4d97b927346a3d7a335b1f7517e133ca0c48bab3c23e29b52ad3d5b5a41b22448c12d59d5f986b479fdcc485cae9e794a80f87a947fd7eea37c53abf356cc80e71144d62cd8af27d3f842a0db5c7652857aa163daadd670e116628fb42e869d8ac4251ef8971d9e5727df1ba0d6910807a825d1b186bc97aaa5ae83f44bc11533f05f3bd567dd916e5de20de1a00000000000000000000000000000000000000000000000000000000000000001","0x02f9024a01837e0c08b9010000000000800000000000000100000000000000000000000000000000000000000000000000004000000000000200000000000000000000000000000000001000000000000000000000000000000000000000000040000000000040000000000800000000000000000000000000000000000000000000000000000000000000000000000000400020000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000020000000000000000000000000000000000000000000000000000000000000000000000004000000000000000000000000000000000000000000000000000000000000000f9013ff9013c94c25708eaf0329888c4db0fa5746647ecca92f257f863a09efce6407f8b9dc575789c1e4cc190f025c452249eb8f7913c49958c9a5535dea000000000000000000000000000000000000000000000000000000000652d2a70a0000000000000000000000000a02d09d454861a0ccd2e8518886cdcec37ecdd2cb8c00000000000000000000000000000000000000000000000000000000000000b220000000000000000000000000000000000000000000000000000000000000b220000000000000000000000000000000000000000000000000000000000000b22000000000000000000000000000000000000000000000000000000000000008000000000000000000000000000000000000000000000000000000000000000066372656174650000000000000000000000000000000000000000000000000000","0x02f9039f018380d310b9010000000020000000000000001000000000000000008404000000000000004000000000000000000002000000000000000000000000000000000040000000000000000000000000000000000000000000200000000000000200000000000000000000000000000000400000000000000000000000000000000000000008000000000000000000004000400800000020000000001000000000000002400000000000000000000000000020200010000000040000000000000000000000000000000100000000400002000000000100000000000000000000000000000000000000000010000000000000000000000000000000000040000000000000000008000000f90294f8dc944638ac6b5727a8b9586d3eba5b44be4b74ed41fcf863a02ac69ee804d9a7a0984249f508dfab7cb2534b465b6ce1580f99a38ba9c5e631a0000000000000000000000000cbee1403a6adee830dfd02d763341687d81482eba0000000000000000000000000cbee1403a6adee830dfd02d763341687d81482ebb8600000000000000000000000000000000000000000000000000032cdc63449c00000000000000000000000000000000000000000000000000000000000000000400000000000000000000000000000000000000000000000000000000000000000f8dc944638ac6b5727a8b9586d3eba5b44be4b74ed41fcf863a031b2166ff604fc5672ea5df08a78081d2bc6d746cadce880747f3643d819e83da0000000000000000000000000cbee1403a6adee830dfd02d763341687d81482eba0000000000000000000000000cbee1403a6adee830dfd02d763341687d81482ebb8600000000000000000000000000000000000000000000000000032cdc63449c00000000000000000000000000000000000000000000000000000000000000000400000000000000000000000000000000000000000000000000000000000000000f85a947ad11bb9216bc9dc4cbd488d7618cbfd433d1e75f842a04641df4a962071e12719d8c8c8e5ac7fc4d97b927346a3d7a335b1f7517e133ca0f9cacd1bc3956dffcb1a7d556066528a92396aa2e7da07a02904b3bfd886661180f87a947fd7eea37c53abf356cc80e71144d62cd8af27d3f842a0db5c7652857aa163daadd670e116628fb42e869d8ac4251ef8971d9e5727df1ba00c4d6405faf20e9cb06cdcc5159705b5a4d42ee7ea60a15f20784e82a0b31786a00000000000000000000000000000000000000000000000000000000000000001","0x02f9010901838210d3b9010000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000c0","0x02f90c3f018388b358b9010000000000000000000000000000000000000040000000000200000000000004100000000002000000000000000000000000001000000000680000010000000009004020200000000008080008000800000000000000002000000000000000000040040000220000800000002080000800000000000000020000002090000000000000008400000000000000000000000000000000280000000200000000000040000000004000020000000000000000000000000000000000000000000000000000021002000008000000000000000000000000000800000000200100000820001005000000000000000000080000000000000000000000000040000000000000f90b34f89b948bd0e58032e5343c888eba4e72332176fffa7371f863a0ddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3efa00000000000000000000000004ac853547fa1fe3f4690e452b904578f7d46a531a00000000000000000000000000000000000000000000000000000000000000000a0000000000000000000000000000000000000000000000000016345785d8a0000f85894c9b7edc65488bdbb428526b03935090aef40ff03e1a0df21c415b78ed2552cc9971249e32a053abce6087a0ae0fbf3f78db5174a3493a0000000000000000000000000000000000000000000000000000098b591d3ac0ef8d9946f3a314c1279148e53f51af154817c3ef2c827b1e1a0b0c632f55f1e1b3b2c3d82f41ee4716bb4c00f0f5d84cdafc141581bb8757a4fb8a0000000000000000000000000000000000000000000000000000000000000004000000000000000000000000000000000000000000000000000000000000000010000000000000000000000000000000000000000000000000000000000000022000100000000000000000000000000000000000000000000000000000000000493e0000000000000000000000000000000000000000000000000000000000000f8d99436ebea3941907c438ca8ca2b1065deef21ccdaede1a04e41ee13e03cd5e0446487b524fdc48af6acf26c074dacdbdfb6b574b42c8146b8a0000000000000000000000000000000000000000000000000000000000000277a0000000000000000000000000000000000000000000000000000000000000001000000000000000000000000000000000000000000000000000000000000000300000000000000000000000011f66d6864fcce84d5000e1e981dd586766339490000000000000000000000000000000000000000000000000000213ae829dcc5f9019a946f3a314c1279148e53f51af154817c3ef2c827b1e1a0e9bded5f24a4168e4f3bf44e00298c993b22376aad8c58c7dda9718a54cbea82b90160000000000000000000000000000000000000000000000000000000000000002000000000000000000000000000000000000000000000000000000000000001140000000000000d54278911f66d6864fcce84d5000e1e981dd58676633949277ab92de63eb7d8a652bf80385906812f92d49c5139000000000000000000000000000000000000000000000000000000000000000700000000000000000000000000000000000000000000000000000000000000a07355534400000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000016345785d8a0000000000000000000000000000000000000000000000000000000000000000277a00000000000000000000000000000000000000000000000000000000000000144ac853547fa1fe3f4690e452b904578f7d46a531000000000000000000000000000000000000000000000000f9013d9411f66d6864fcce84d5000e1e981dd58676633949f884a0aae74fdfb502b568e3ca6f5aa448a255c90a2f24c4a6104d65ae45f097b37388a00000000000000000000000004ac853547fa1fe3f4690e452b904578f7d46a531a00000000000000000000000000000000000000000000000000000000000000007a0000000000000000000000000000000000000000000000000000000000000277ab8a000000000000000000000000000000000000000000000000000000000000000400000000000000000000000000000000000000000000000000000000000000d540000000000000000000000000000000000000000000000000000000000000028b92de63eb7d8a652bf80385906812f92d49c513911f66d6864fcce84d5000e1e981dd58676633949000000000000000000000000000000000000000000000000f85894c9b7edc65488bdbb428526b03935090aef40ff03e1a0df21c415b78ed2552cc9971249e32a053abce6087a0ae0fbf3f78db5174a3493a00000000000000000000000000000000000000000000000000000381ece38c000f8d9946f3a314c1279148e53f51af154817c3ef2c827b1e1a0b0c632f55f1e1b3b2c3d82f41ee4716bb4c00f0f5d84cdafc141581bb8757a4fb8a0000000000000000000000000000000000000000000000000000000000000004000000000000000000000000000000000000000000000000000000000000000010000000000000000000000000000000000000000000000000000000000000022000100000000000000000000000000000000000000000000000000000000000493e0000000000000000000000000000000000000000000000000000000000000f8d99436ebea3941907c438ca8ca2b1065deef21ccdaede1a04e41ee13e03cd5e0446487b524fdc48af6acf26c074dacdbdfb6b574b42c8146b8a0000000000000000000000000000000000000000000000000000000000000279f0000000000000000000000000000000000000000000000000000000000000001000000000000000000000000000000000000000000000000000000000000000300000000000000000000000011f66d6864fcce84d5000e1e981dd586766339490000000000000000000000000000000000000000000000000000d027724dc000f9019a946f3a314c1279148e53f51af154817c3ef2c827b1e1a0e9bded5f24a4168e4f3bf44e00298c993b22376aad8c58c7dda9718a54cbea82b9016000000000000000000000000000000000000000000000000000000000000000200000000000000000000000000000000000000000000000000000000000000114000000000000ac19278911f66d6864fcce84d5000e1e981dd58676633949279f4c11ccee50b70daa47c41849e45316d975b26102000000000000000000000000000000000000000000000000000000000000000700000000000000000000000000000000000000000000000000000000000000a07355534400000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000016345785d8a0000000000000000000000000000000000000000000000000000000000000000277a00000000000000000000000000000000000000000000000000000000000000144ac853547fa1fe3f4690e452b904578f7d46a531000000000000000000000000000000000000000000000000f9013d9411f66d6864fcce84d5000e1e981dd58676633949f884a0aae74fdfb502b568e3ca6f5aa448a255c90a2f24c4a6104d65ae45f097b37388a00000000000000000000000004ac853547fa1fe3f4690e452b904578f7d46a531a00000000000000000000000000000000000000000000000000000000000000007a0000000000000000000000000000000000000000000000000000000000000279fb8a00000000000000000000000000000000000000000000000000000000000000040000000000000000000000000000000000000000000000000000000000000ac1900000000000000000000000000000000000000000000000000000000000000284c11ccee50b70daa47c41849e45316d975b2610211f66d6864fcce84d5000e1e981dd58676633949000000000000000000000000000000000000000000000000f8bb94593be683204ff3501e6e4851956a2da310e393b6f842a0c1e18b2a3583b6bc0879a3f3f657c41adfb512076938208ec0b389d6d19874cba00000000000000000000000004ac853547fa1fe3f4690e452b904578f7d46a531b8607355534400000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000016345785d8a0000000000000000000000000000000000000000000000000000000000000000277a","0x02f901a7018389386bb9010000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000008000000000000000000010000000000000000000000000000020000000000000000000800000000000000000000000010000000000000004000000000000000000000000000000000000000000000000000000000000000000000100400000000000000000000000000000400000000000000000000000002000000000000000000000000000000000000000000000000000020000000000000000001000000000000000000000000000000000000000000000000f89df89b946199f797b524166122f1c6e6a78ff321389bb686f863a0ddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3efa00000000000000000000000000000000000000000000000000000000000000000a0000000000000000000000000e43f4840dad185beef6daa8e7328b521e6a1a2a0a000000000000000000000000000000000000000000000d3c21bcecceda1000000","0x02f908fa01838cb5bdb90100000000004000000000040000000000000000000000005000000022000004000000000000000000000000000000000000000000000000000000000200002000000000000000080000000000080000000000000400004000000000004000000000000000000002010000000000000000000000000008000000000000100000000000000000000000000000000000001000000000000800000000000000200000000a0000000000000000000000100000000000000000080000000000000000000000000002000000000000000000000000200240000000800000000000000000000010000000040000000000000000000000000000000800000000000000000000f907eff9025d9400000000000000adc04c56bf30ac9d3c0aaf14dcf863a09d9af8e38d66c62e2c12f0225249fd9d721c54b83f48d9352c97c6cacdcb6f31a0000000000000000000000000f8de191520e37592aa84c62f650b067805cf1845a0000000000000000000000000ea2b4e7f02b859305093f9f4778a19d66ca176d5b901e0392f9c488837a9a75f4b5a139bed7757ebec5091b7e0b6f1ce70cbbbc75050e50000000000000000000000006f030b74371167d3b71cf3214e749b0d1814c0490000000000000000000000000000000000000000000000000000000000000080000000000000000000000000000000000000000000000000000000000000012000000000000000000000000000000000000000000000000000000000000000010000000000000000000000000000000000000000000000000000000000000001000000000000000000000000d3664b5e72b46eaba722ab6f43c22dbf4018195400000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000011e1a300000000000000000000000000000000000000000000000000000000000000000100000000000000000000000000000000000000000000000000000000000000010000000000000000000000002715ccea428f8c7694f7e78b2c89cb454c5f7294000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000002c68af0bb140000000000000000000000000000f8de191520e37592aa84c62f650b067805cf1845f9025d9400000000000000adc04c56bf30ac9d3c0aaf14dcf863a09d9af8e38d66c62e2c12f0225249fd9d721c54b83f48d9352c97c6cacdcb6f31a00000000000000000000000006f030b74371167d3b71cf3214e749b0d1814c049a0000000000000000000000000ea2b4e7f02b859305093f9f4778a19d66ca176d5b901e0ea28a862f3530833f82dc3d97407cf3a23fb593335f2b11f9ade8d62576f14fe0000000000000000000000006f030b74371167d3b71cf3214e749b0d1814c04900000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000120000000000000000000000000000000000000000000000000000000000000000100000000000000000000000000000000000000000000000000000000000000010000000000000000000000002715ccea428f8c7694f7e78b2c89cb454c5f7294000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000002c68af0bb14000000000000000000000000000000000000000000000000000000000000000000010000000000000000000000000000000000000000000000000000000000000001000000000000000000000000d3664b5e72b46eaba722ab6f43c22dbf4018195400000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000011e1a3000000000000000000000000006f030b74371167d3b71cf3214e749b0d1814c049f8b99400000000000000adc04c56bf30ac9d3c0aaf14dce1a04b9f2d36e1b4c93de62cc077b00b1a91d84b6c31b4a14e012718dcca230689e7b88000000000000000000000000000000000000000000000000000000000000000200000000000000000000000000000000000000000000000000000000000000002392f9c488837a9a75f4b5a139bed7757ebec5091b7e0b6f1ce70cbbbc75050e5ea28a862f3530833f82dc3d97407cf3a23fb593335f2b11f9ade8d62576f14fef89b94d3664b5e72b46eaba722ab6f43c22dbf40181954f863a08c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b925a0000000000000000000000000f8de191520e37592aa84c62f650b067805cf1845a000000000000000000000000000000000000000adc04c56bf30ac9d3c0aaf14dca00000000000000000000000000000000000000000000000000000000017d78400f89b94d3664b5e72b46eaba722ab6f43c22dbf40181954f863a0ddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3efa0000000000000000000000000f8de191520e37592aa84c62f650b067805cf1845a00000000000000000000000006f030b74371167d3b71cf3214e749b0d1814c049a00000000000000000000000000000000000000000000000000000000011e1a300f89b942715ccea428f8c7694f7e78b2c89cb454c5f7294f863a08c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b925a00000000000000000000000006f030b74371167d3b71cf3214e749b0d1814c049a000000000000000000000000000000000000000adc04c56bf30ac9d3c0aaf14dca0000000000000000000000000000000000000000000000035a66e2580ecd70000f89b942715ccea428f8c7694f7e78b2c89cb454c5f7294f863a0ddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3efa00000000000000000000000006f030b74371167d3b71cf3214e749b0d1814c049a0000000000000000000000000f8de191520e37592aa84c62f650b067805cf1845a000000000000000000000000000000000000000000000000002c68af0bb140000","0x02f9036101838ed0a2b9010000000000000000080000000000000000000000000040000000000008000000000000000000010000002000008000000000004000000000000000000000000000000000000000000001000008000000000000000000000000000000000000000000000000000000000000000000000000000000000000002000000010000000000000000048000000000000000000000000000000400000000000000000000000000000010000000000000000008000000000000000000000000000000000000000020002000000000000000000000000008000000000000000000000000000000000800000000000000000000000008000000000000000000000000000000000f90256f89b94eea85fdf0b05d1e0107a61b4b4db1f345854b952f863a0ddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3efa000000000000000000000000030f7fd07ce431d090f8ec59c3b635a4df42a00a1a0000000000000000000000000c1b71d1ad2de3fcbecda73c3273296dd45863c21a00000000000000000000000000000000000000000000000012f9aa3647286b60ff89b94fb7378d0997b0092be6bbf278ca9b8058c24752ff863a0ddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3efa0000000000000000000000000c1b71d1ad2de3fcbecda73c3273296dd45863c21a000000000000000000000000030f7fd07ce431d090f8ec59c3b635a4df42a00a1a0000000000000000000000000000000000000000000000001314fb37062980000f901199430f7fd07ce431d090f8ec59c3b635a4df42a00a1e1a03b841dc9ab51e3104bda4f61b41e4271192d22cd19da5ee6e292dc8e2744f713b8e00000000000000000000000009563fdb01bfbf3d6c548c2c64e446cb5900aca88000000000000000000000000c1b71d1ad2de3fcbecda73c3273296dd45863c2100000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000001314fb370629800000000000000000000000000000000000000000000000000012f9aa3647286b60fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc8","0x02f905c40183904383b9010000000000000000000008000000000040000000000000000000000000000000000000000000000000000000000000000000000000000000000140000000000000000000000000000000000000000000000000000010000000000000000000000000100000020002000000020000000800000000000000000000000200000000000000010000000000000200000000000000000000000000000000000000000000000000000000000000000000000000000800000000000006000000000000800000100000000000000000000000000000000000000000000001000000000020000000000000000000800000000800000000000000000000004000000000000000f904b9f901ba94db249fda431b6385ad5e028f3aa31f3f51ebaef2e1a0cdb9fb741d82c65a081bb855b5e42174193549c537fd57a199609593827cff71b90180000000000000000000000000762f1119123806fc0aa4c58f61a9da096910200b0000000000000000000000000000000000000000000000000000000000004443000000000000000000000000000000000000000000000000000000000000000200000000000000000000000000000000000000000000000000000000000000a000000000000000000000000000000000000000000000000000000000000000e0000000000000000000000000000000000000000000000000000000000000000c7a6b4554482e676f65726c690000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000006d0c7a6b4554482e676f65726c693f616c656f316d397673377a68787632783232673963667a7a74616e6c72356d357a63617334726a616d7768796a6e74336636746737656772717266703676720080c6a47e8d030000000000000000000000000000000000000000000000000000000000000000000000000000000000000000f9019a94762f1119123806fc0aa4c58f61a9da096910200be1a08636abd6d0e464fe725a13346c7ac779b73561c705506044a2e6b2cdb1295ea5b901600000000000000000000000000000000000000000000000000000000000000000000000000000000000000000532e91ca086964251519359271b99bd08427314f000000000000000000000000000000000000000000000000000000000000000200000000000000000000000000000000000000000000000000000000000000c0000000000000000000000000000000000000000000000000000000000000010000000000000000000000000000000000000000000000000000038d7ea4c68000000000000000000000000000000000000000000000000000000000000000000c7a6b4554482e676f65726c690000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000003f616c656f316d397673377a68787632783232673963667a7a74616e6c72356d357a63617334726a616d7768796a6e743366367467376567727172667036767200f9015c94532e91ca086964251519359271b99bd08427314ff863a0fed162bc92844d868aeee15dc79af2ef4aac1ef57805f4eec865983f4d35efd9a00000000000000000000000000000000000000000000000000000000000000000a0000000000000000000000000660aba6ca934d1537a95cc4454469a1026ed6252b8e00000000000000000000000000000000000000000000000000000000000000002000000000000000000000000000000000000000000000000000000000000008000000000000000000000000000000000000000000000000000038d7ea4c68000000000000000000000000000000000000000000000000000002386f26fc10000000000000000000000000000000000000000000000000000000000000000003f616c656f316d397673377a68787632783232673963667a7a74616e6c72356d357a63617334726a616d7768796a6e743366367467376567727172667036767200","0x02f901a7018390a504b9010000000000000000000000000000000000000000000000000080000000000000000000000000000000000000000100000004000000000000000000000000200000000000000000000000000000000200000000000000000000000000000000000000000000000000000000000000000000000000000000000000000002000000000000000000000020000000000000000000000000000000000000000000000000020000000000000000000000000040000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000010000000000400000000000001000000000000000000000000000000000000f89df89b94fad6367e97217cc51b4cd838cc086831f81d38c2f863a08c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b925a000000000000000000000000028cd70b79775193ea6f75f0808870b0b9eb1ad01a00000000000000000000000001c5d511f65c99ff3ea07dcca7ed91146ed5351e2a00000000000000000000000000000000000000000000000000000000000000000","0x02f909ad018396c005b901000000400000040000000000000000000000000000000000000000000000000000000000000000000000000000000010000040000000000200000000004020000000000000a0080000080000080000000000000000020000000000800000000000000000000000000000000000000000000000000400000000000000188000000000000000000000001000000000000000010010000020000000000000000000000a0001000000001001000040000000400000000000001000000000000000000000000002000000000000000002000000010000800000000000000000000000000490100000000000000000000001000004000000000010000000000000000000f908a2f89b94a375a26dbb09f5c57fb54264f393ad6952d1d2def863a0ddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3efa00000000000000000000000002e5357a050c29c8e9781516ac176c276f3c9c5faa0000000000000000000000000633f534ddc7ccced21f70e3e6956e669daa49d41a000000000000000000000000000000000000000000000000000000000003d0900f89b94a375a26dbb09f5c57fb54264f393ad6952d1d2def863a08c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b925a00000000000000000000000002e5357a050c29c8e9781516ac176c276f3c9c5faa0000000000000000000000000633f534ddc7ccced21f70e3e6956e669daa49d41a00000000000000000000000000000000000000000000000000000f4312ed20263f89b94633f534ddc7ccced21f70e3e6956e669daa49d41f863a05548c837ab068cf56a2c2479df0882a4922fd203edb7517321831d95078c5f62a0000000000000000000000000a375a26dbb09f5c57fb54264f393ad6952d1d2dea00000000000000000000000002e5357a050c29c8e9781516ac176c276f3c9c5faa000000000000000000000000000000000000000000000000000000000003d0900f89b94a375a26dbb09f5c57fb54264f393ad6952d1d2def863a0ddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3efa0000000000000000000000000633f534ddc7ccced21f70e3e6956e669daa49d41a000000000000000000000000064046eaf582638f26ba3ff17ea51705f1367cbc3a000000000000000000000000000000000000000000000000000000000003d0900f8dd94633f534ddc7ccced21f70e3e6956e669daa49d41f884a0023916d46c0d18491146f8b0bc7d927a62a0559c8ca79920bda7dc7db1fc72f3a0000000000000000000000000a375a26dbb09f5c57fb54264f393ad6952d1d2dea00000000000000000000000002e5357a050c29c8e9781516ac176c276f3c9c5faa000000000000000000000000064046eaf582638f26ba3ff17ea51705f1367cbc3b84000000000000000000000000000000000000000000000000000000000ffffffff00000000000000000000000000000000000000000000000000000000003d0900f8fc9464046eaf582638f26ba3ff17ea51705f1367cbc3f863a051dfc81761c6e241cfba4adcd6a3af365b7b8305f76dc043f1b1b8bc22f73fdea000000000000000000000000000000000000000000000000000000000ffffffffa00000000000000000000000002e5357a050c29c8e9781516ac176c276f3c9c5fab88000000000000000000000000000000000000000000000000000000000000120f200000000000000000000000000000000000000000000000000000000000000040000000000000000000000000000000000000000000000003782dace9d900000ffffffffffffffffffffffffffffffffffffffffffffffffffd46bd89546914bf89b94a375a26dbb09f5c57fb54264f393ad6952d1d2def863a0ddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3efa00000000000000000000000002e5357a050c29c8e9781516ac176c276f3c9c5faa0000000000000000000000000633f534ddc7ccced21f70e3e6956e669daa49d41a000000000000000000000000000000000000000000000000000000000003d0900f89b94a375a26dbb09f5c57fb54264f393ad6952d1d2def863a08c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b925a00000000000000000000000002e5357a050c29c8e9781516ac176c276f3c9c5faa0000000000000000000000000633f534ddc7ccced21f70e3e6956e669daa49d41a00000000000000000000000000000000000000000000000000000f4312e94f963f89b94633f534ddc7ccced21f70e3e6956e669daa49d41f863a05548c837ab068cf56a2c2479df0882a4922fd203edb7517321831d95078c5f62a0000000000000000000000000a375a26dbb09f5c57fb54264f393ad6952d1d2dea00000000000000000000000002e5357a050c29c8e9781516ac176c276f3c9c5faa000000000000000000000000000000000000000000000000000000000003d0900f89b94a375a26dbb09f5c57fb54264f393ad6952d1d2def863a0ddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3efa0000000000000000000000000633f534ddc7ccced21f70e3e6956e669daa49d41a000000000000000000000000064046eaf582638f26ba3ff17ea51705f1367cbc3a000000000000000000000000000000000000000000000000000000000003d0900f8dd94633f534ddc7ccced21f70e3e6956e669daa49d41f884a0023916d46c0d18491146f8b0bc7d927a62a0559c8ca79920bda7dc7db1fc72f3a0000000000000000000000000a375a26dbb09f5c57fb54264f393ad6952d1d2dea00000000000000000000000002e5357a050c29c8e9781516ac176c276f3c9c5faa000000000000000000000000064046eaf582638f26ba3ff17ea51705f1367cbc3b84000000000000000000000000000000000000000000000000000000000658e7c8000000000000000000000000000000000000000000000000000000000003d0900f8fc9464046eaf582638f26ba3ff17ea51705f1367cbc3f863a051dfc81761c6e241cfba4adcd6a3af365b7b8305f76dc043f1b1b8bc22f73fdea000000000000000000000000000000000000000000000000000000000658e7c80a00000000000000000000000002e5357a050c29c8e9781516ac176c276f3c9c5fab8800000000000000000000000000000000000000000000000000000000000011e9a00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000003782dace9d900000000000000000000000000000000000000000000000000000002e45f9fa00bf77","0x02f9055c01839a4ac9b90100000000000004000000000000000000000000000000000000000000000000000000000004000000000000000000001000004000000000020000000000402000000000000080080000000000080000000000000000020000000000800000000000000000000000000000000000000000000000000400000000000000100000000000000000000000001000040000000000010010000000000000000000000000400a0800000000001001000040000000400000000000001000000000000004000000008002000000000000000000000100004000000000000000000000010000000090100000000000000000000001000004000000000010000000000000000000f90451f89b94a375a26dbb09f5c57fb54264f393ad6952d1d2def863a0ddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3efa000000000000000000000000046fcab71245e2ff12ecc0ba8d3490aec95617b54a0000000000000000000000000633f534ddc7ccced21f70e3e6956e669daa49d41a000000000000000000000000000000000000000000000000000000000003d0900f89b94a375a26dbb09f5c57fb54264f393ad6952d1d2def863a08c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b925a000000000000000000000000046fcab71245e2ff12ecc0ba8d3490aec95617b54a0000000000000000000000000633f534ddc7ccced21f70e3e6956e669daa49d41a0000000000000000000000000000000000000000000000000000000003e7f2450f89b94633f534ddc7ccced21f70e3e6956e669daa49d41f863a05548c837ab068cf56a2c2479df0882a4922fd203edb7517321831d95078c5f62a0000000000000000000000000a375a26dbb09f5c57fb54264f393ad6952d1d2dea000000000000000000000000046fcab71245e2ff12ecc0ba8d3490aec95617b54a000000000000000000000000000000000000000000000000000000000003d0900f89b94a375a26dbb09f5c57fb54264f393ad6952d1d2def863a0ddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3efa0000000000000000000000000633f534ddc7ccced21f70e3e6956e669daa49d41a0000000000000000000000000f1675ffed677b2e7ee0c87574ebd279049d9ebf9a000000000000000000000000000000000000000000000000000000000003d0900f8dd94633f534ddc7ccced21f70e3e6956e669daa49d41f884a0023916d46c0d18491146f8b0bc7d927a62a0559c8ca79920bda7dc7db1fc72f3a0000000000000000000000000a375a26dbb09f5c57fb54264f393ad6952d1d2dea000000000000000000000000046fcab71245e2ff12ecc0ba8d3490aec95617b54a0000000000000000000000000f1675ffed677b2e7ee0c87574ebd279049d9ebf9b84000000000000000000000000000000000000000000000000000000000ffffffff00000000000000000000000000000000000000000000000000000000003d0900f8fc94f1675ffed677b2e7ee0c87574ebd279049d9ebf9f863a051dfc81761c6e241cfba4adcd6a3af365b7b8305f76dc043f1b1b8bc22f73fdea000000000000000000000000000000000000000000000000000000000ffffffffa000000000000000000000000046fcab71245e2ff12ecc0ba8d3490aec95617b54b880ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffa18700000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000003782dace9d900000fffffffffffffffffffffffffffffffffffffffffffffff3d3b3ce837117c4f3","0x02f9032701839baf92b9010000000000000000000000000000000000000000000000000000000000400000000000000000000000000200000000000000000000020000001200000000000000000000100000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000004000000000000000000000000000000000008000000000000000000000000000000000000000000000000000000000021000000000000000000000002440000000000000000000000000000000001000000000000000000000000000008000000000000000001000000000000000000000000000000000000008000000000000000000000000000000004000f9021cf9013c94af4159a80b6cc41ed517db1c453d1ef5c2e4db72f863a05e3c1311ea442664e8b1611bfabef659120ea7a0a2cfc0667700bebc69cbffe1a000000000000000000000000000000000000000000000000000000000000b574fa0c16ec891aba6a3f7b381a53cdd85e9d84741f080b35012c1f376edcac6e95f10b8c00000000000000000000000006bebc4925716945d46f0ec336d5c2564f419682c000000000000000000000000000000000000000000000000000000000000000c000000000000000000000000f5ce611c7321438f8a30aab16852d68da4f5ab5a4de176e8c0279273cbe8a9919b029628c5cc2def297494bb2b1d1a470ae6ce18000000000000000000000000000000000000000000000000000000000000000b00000000000000000000000000000000000000000000000000000000652d2a70f8db946bebc4925716945d46f0ec336d5c2564f419682cf842a0ff64905f73a67fb594e0f940a8075a860db489ad991e032f48c81123eb52d60ba000000000000000000000000000000000000000000000000000000000000b574fb88000000000000000000000000000000000000000000000000000000000000000200000000000000000000000000000000000000000000000000000000000000034e4bd611c7321438f8a30aab16852d68da4f59a490000000000000000000000000000000000000000000000000429d069189e0000000000000000000000000000","0x02f901ff01839ceb65b9010000000000010002000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000040000000800000000000000040000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000800000000000000020000000000000000000000000000000000000000000000008000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000f8f5f85894d5c325d183c592c94998000c5e0eed9e6655c020e1a09866f8ddfe70bb512b2f2b28b49d4017c43f7ba775f1a20c61c13eea8cdac111a0c9afd20a1f61bb629588d82d72e13914812259d13161284b98747c955d62317ef89994d5c325d183c592c94998000c5e0eed9e6655c020e1a0d342ddf7a308dec111745b00315c14b7efb2bdae570a6856e088ed0c65a3576cb8600336df0b24cf3302afadbc4c828662c60c2cdae602e59beaab7011bf3fd5a223000000000000000000000000000000000000000000000000000000000004d0e5020abc24e9cfc67a97e463deef1ab573cb11d9cd618bedee85c2df85fac6faa2","0x02f901ff01839e2744b9010000000000010002000000000000000000000000000000000000000000000000000000002000000000000000001000000000000000000000000000800000000000000040000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000008000000000000000000000000000000000000000000000000000000000000000000000000000000000000000080000000000000000000000800000000000000000000000000000000000000000000000000000000000000f8f5f85894de29d060d45901fb19ed6c6e959eb22d8626708ee1a09866f8ddfe70bb512b2f2b28b49d4017c43f7ba775f1a20c61c13eea8cdac111a035ceccc734a10ae9c593304774276b4b6324223b019c38c6662ab923022b2c8af89994de29d060d45901fb19ed6c6e959eb22d8626708ee1a0d342ddf7a308dec111745b00315c14b7efb2bdae570a6856e088ed0c65a3576cb860022db625db05534a27ea14675f8d22d7c603e0981ceff2b02504791b75c4f56100000000000000000000000000000000000000000000000000000000000d7c61019e776def80129482e5f6282056f7318bedf7bc30a4ae7cdf8814d8d0b28a99","0x02f901ff01839f6317b9010000000000010002000000000000000000000000000000000000000000000000000000002000000000000000001000000000000000000000000000800000000000000040000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000008000000000000000000000000000000000000000000000000000000000000000000000000000000000000000080000000000000000000000800000000000000000000000000000000000000000000000000000000000000f8f5f85894de29d060d45901fb19ed6c6e959eb22d8626708ee1a09866f8ddfe70bb512b2f2b28b49d4017c43f7ba775f1a20c61c13eea8cdac111a01331bfa0165c171aefba1e6eebd55d52bc2389726c1d0594f4a9e2f7812b42e4f89994de29d060d45901fb19ed6c6e959eb22d8626708ee1a0d342ddf7a308dec111745b00315c14b7efb2bdae570a6856e088ed0c65a3576cb86002e2bf007e02d68956b61be94c5661c8c8d1fb7ae552a0b2e7f3869d20d7aa0700000000000000000000000000000000000000000000000000000000000d7c620467725c6a4525d13c195701bf88f4f3c65329438cf8a437c928067d9a80556e","0x02f9033f0183a10e1fb9010000000000010002000000000000000000000000000000000000000000000000000000002000000000000000001000000000000000000000000000800000000040000040000000000000000200000000000000000000002000000000040000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000400000000000000000000000000000000000000000000008000000000000000000000000000000000000000000000000000000000020000000000004000000000000000080000000200400000000000800000000000000000000000000000000000000000000000000000000000000f90234f85894de29d060d45901fb19ed6c6e959eb22d8626708ee1a09866f8ddfe70bb512b2f2b28b49d4017c43f7ba775f1a20c61c13eea8cdac111a074c803dcb95e04990c3e71db65899a9e0282003a967632e13eb6ce45d598fb45f9013c94de29d060d45901fb19ed6c6e959eb22d8626708ef863a04264ac208b5fde633ccdd42e0f12c3d6d443a4f3779bbf886925b94665b63a22a0073314940630fd6dcda0d772d4c972c4e0a9946bef9dabf4ef84eda8ef542b82a0000000000000000000000000c3511006c04ef1d78af4c8e0e74ec18a6e64ff9eb8c00000000000000000000000000000000000000000000000000000000000000020000000000000000000000000000000000000000000000000000000000000000400000000000000000000000000000000000000000000000000000000000000000000000000000000000000001f36e2be14d65c7a832d1a863ecfa06c6730634700000000000000000000000000000000000000000000000000470de4df8200000000000000000000000000000000000000000000000000000000000000000000f89994de29d060d45901fb19ed6c6e959eb22d8626708ee1a0d342ddf7a308dec111745b00315c14b7efb2bdae570a6856e088ed0c65a3576cb8600427eee54195a8dc4d35b17e5cbc8e18b6e8eebdaf2017f6e12dac62232ca9e000000000000000000000000000000000000000000000000000000000000d7c6300b1121da2e28ad38fb1736373bb7fe4787b73c881995bbd391b17aa113a2cc8","0x02f901ff0183a249e6b9010000000000010002000000000000000000000000000000000000000000000000000000002000000000000000001000000000000000000000000000800000000000000040000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000008000000000000000000000000000000000000000000000000000000000000000000000000000000000000000080000000000000000000000800000000000000000000000000000000000000000000000000000000000000f8f5f85894de29d060d45901fb19ed6c6e959eb22d8626708ee1a09866f8ddfe70bb512b2f2b28b49d4017c43f7ba775f1a20c61c13eea8cdac111a0d4d6f16309b51be964a0482c4cd816fadeaa8759216dd9bbc20773ba36c75ccaf89994de29d060d45901fb19ed6c6e959eb22d8626708ee1a0d342ddf7a308dec111745b00315c14b7efb2bdae570a6856e088ed0c65a3576cb8600001d0bd72454b02cd7386951338297e0da0f5a8c1076a24c1425928dce0838300000000000000000000000000000000000000000000000000000000000d7c64028c033938806df04fcc792f72f91ca04c3c20963eec03addb44fecf6fa795de","0x02f901090183a29beeb9010000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000c0","0x02f9041e0183a8526db9010000000200000000400000000000000000000000000020000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000040000000000000000000000000000010000020000000000000000000000000000004000000080000000004000000002000000000000000000000000000000000000000000000000000000000000000000000000000000008000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000800200010000000000000000000000000000000000000000000000000000000040000000000000000f90313f8b994caf156a3dd652e2b493fe9e53f3d526d3cbbd4a8e1a0e2db1e7820b0cca1226a7e7d5cc2a3df28542b04da0f0aa7949f2a74519ef5a0b880000000000000000000000000307c2d86e3638a5afce36115dcbc856260748d310000000000000000000000000000000000000000000000000000b588ff18e000000000000000000000000000307c2d86e3638a5afce36115dcbc856260748d310000000000000000000000000000000000000000000000000000000000000000f87994caf156a3dd652e2b493fe9e53f3d526d3cbbd4a8e1a0305bf06329ff886b42ab3ed2979092b17d3a7fc67e7de42ee393a24c8e39fee7b840000000000000000000000000307c2d86e3638a5afce36115dcbc856260748d31000000000000000000000000307c2d86e3638a5afce36115dcbc856260748d31f901da9475d8ec64bf68b364b1f45249774e78df2f401399e1a0c6cb9661759518374091eb98266dd634614ae793b31549daff33e83d6dee0165b901a0000000000000000000000000caf156a3dd652e2b493fe9e53f3d526d3cbbd4a8000000000000000000000000000000000000000000000000000000000000004000000000000000000000000000000000000000000000000000000000000001200000000000000000000000004a1c82542ebdb854ece6ce5355b5c48eb299ecd8000000000000000000000000000000000000000000000000000aa87bee53800000000000000000000000000000000000000000000000000000000000000003840000000000000000000000000000000000000000000000000000b588ff18e000000000000000000000000000307c2d86e3638a5afce36115dcbc856260748d31000000000000000000000000000000000000000000000000000000000001518000000000000000000000000000000000000000000000000000000000000151800000000000000000000000000000000000000000000000000000000000001388000000000000000000000000000000000000000000000000000000000000001e347468207465737420636f6c6c656374697665206f6e203136204f6374200000","0x02f908450183ab3259b9010000000000004048000010000004005000000000080000000000000000000000080002000000000000008200000004008450000000000000000000100000200200000001000000000040000008200000000000000000000000000000102000000100000000000000000000000480000000000000000000000000000010000000000200000000024000000000000000000010000000000000000001004200400000020000000000000000000000001400000000000000000000040000000200000000000002000000080000000000020000000000000000040000000000000000001010000000000000000000000000000000000000000000000000800000000000f9073af89b944031bc992179a7742bb99ec99da67f852c11927af863a08c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b925a0000000000000000000000000aed889cc423f93ae00d140fce00a4aa6b05aa783a0000000000000000000000000d029d527e1d700c549f4e04662035b8a8624ce4fa00000000000000000000000000000000000000000000000000000000000000000f89b944031bc992179a7742bb99ec99da67f852c11927af863a0ddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3efa0000000000000000000000000aed889cc423f93ae00d140fce00a4aa6b05aa783a0000000000000000000000000d029d527e1d700c549f4e04662035b8a8624ce4fa000000000000000000000000000000000000000000000000000000000000003e8f902de94d9005878cb1a830355dbf4d814a835c54022038ef884a04b388aecf9fa6cc92253704e5975a6129a4f735bdbd99567df4ed0094ee4ceb5a00000000000000000000000000ded20eaea674409ccfeca298385f361ad359a43a00000000000000000000000004200000000000000000000000000000000000007a0000000000000000000000000000000000000000000000000000000000000170db9024000000000000000000000000000000000000000000000000000000000001e8480000000000000000000000000000000000000000000000000000000000000006000000000000000000000000000000000000000000000000000000000652d2a7000000000000000000000000000000000000000000000000000000000000001a4cbd4ece90000000000000000000000004200000000000000000000000000000000000010000000000000000000000000d029d527e1d700c549f4e04662035b8a8624ce4f0000000000000000000000000000000000000000000000000000000000000080000000000000000000000000000000000000000000000000000000000000170d00000000000000000000000000000000000000000000000000000000000000e4662a633a0000000000000000000000003c3a81e81dc49a522a592e7622a7e711c06bf354000000000000000000000000deaddeaddeaddeaddeaddeaddeaddeaddead0000000000000000000000000000aed889cc423f93ae00d140fce00a4aa6b05aa783000000000000000000000000aed889cc423f93ae00d140fce00a4aa6b05aa78300000000000000000000000000000000000000000000000000000000000003e800000000000000000000000000000000000000000000000000000000000000c000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000f901fc94fcdc20eaea674409ccfeca298385f361ad358932f842a0cb0f7ffd78f9aee47a248fae8db181db6eee833039123e026dcbff529522e52aa00000000000000000000000004200000000000000000000000000000000000010b901a0000000000000000000000000d029d527e1d700c549f4e04662035b8a8624ce4f0000000000000000000000000000000000000000000000000000000000000080000000000000000000000000000000000000000000000000000000000000170d00000000000000000000000000000000000000000000000000000000001e848000000000000000000000000000000000000000000000000000000000000000e4662a633a0000000000000000000000003c3a81e81dc49a522a592e7622a7e711c06bf354000000000000000000000000deaddeaddeaddeaddeaddeaddeaddeaddead0000000000000000000000000000aed889cc423f93ae00d140fce00a4aa6b05aa783000000000000000000000000aed889cc423f93ae00d140fce00a4aa6b05aa78300000000000000000000000000000000000000000000000000000000000003e800000000000000000000000000000000000000000000000000000000000000c0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000f9011d94d029d527e1d700c549f4e04662035b8a8624ce4ff884a0718594027abd4eaed59f95162563e0cc6d0e8d5b86b1c7be8b1b0ac3343d0396a00000000000000000000000004031bc992179a7742bb99ec99da67f852c11927aa0000000000000000000000000deaddeaddeaddeaddeaddeaddeaddeaddead0000a0000000000000000000000000aed889cc423f93ae00d140fce00a4aa6b05aa783b880000000000000000000000000aed889cc423f93ae00d140fce00a4aa6b05aa78300000000000000000000000000000000000000000000000000000000000003e800000000000000000000000000000000000000000000000000000000000000600000000000000000000000000000000000000000000000000000000000000000","0xf901090183ab8461b9010000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000c0","0xf901090183abd669b9010000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000c0","0xf903640183ae0bfcb9010000000000100000400000000000000000000000000000084000000000000000000000000000000000000000000000020000000000000000000000000000000000000040008800000000100008000000000000000000000000000000000000000000000000020000000000000000000800000000000000000000000010000000000002000000000000000000000000000000000000000002000000000000000000000000000000000000001000000000000000020080000000000000040000000080040002000000000000000000000000000000000000000000010000000020000000000000200000000000000000000000000000001002000000000000000000f90259f9011c94980205d352f198748b626f6f7c38a8a5663ec981f863a02bd2d8a84b748439fd50d79a49502b4eb5faa25b864da6a9ab5c150704be9a4da0000000000000000000000000000000000000000000000000000000000000006ea00000000000000000000000009f40916d0dfb2f8f5fb63d8f76826d09041f2eaeb8a000000000000000000000000000000000000000000000000000000000000000600000000000000000000000000000000000000000000000000000000000000d68efdc6e047f712f4bff82fc800f5309ca0c4e8e7ba32b255b212fef748ed80af200000000000000000000000000000000000000000000000000000000000000148a555e4fc287650f5e8ca1778a35dd44e893d6aa000000000000000000000000f89b949f40916d0dfb2f8f5fb63d8f76826d09041f2eaef863a0ddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3efa00000000000000000000000000000000000000000000000000000000000000000a0000000000000000000000000363413eb82ff4ebda8e70f8e0f9615b684d2f9eda00000000000000000000000000000000000000000000000000de0b6b3a7640000f89b949f40916d0dfb2f8f5fb63d8f76826d09041f2eaef863a0bf551ec93859b170f9b2141bd9298bf3f64322c6f7beb2543a0cb669834118bfa0000000000000000000000000000000000000000000000000000000000000006ea0000000000000000000000000363413eb82ff4ebda8e70f8e0f9615b684d2f9eda00000000000000000000000000000000000000000000000000de0b6b3a7640000","0xf903640183b08524b9010000000000002000000000000000000000000000000040000000000000000000000000000000000020000000000000000000000000000000000000000000000000000040000800000000000008000000000001000000000000000000000000000000000000020000000000000000000800000000000020000000000010000000000002004000000000000000000000000000000000000002000000000000000000000000000000000000000000000000000000020080000100400000040000000080100002000000000000000000000000000000000000000000010000000020000000000000200000000000000000000000000000001002000000000000000000f90259f9011c94980205d352f198748b626f6f7c38a8a5663ec981f863a02bd2d8a84b748439fd50d79a49502b4eb5faa25b864da6a9ab5c150704be9a4da0000000000000000000000000000000000000000000000000000000000000006ea00000000000000000000000004f7a67464b5976d7547c860109e4432d50afb38eb8a0000000000000000000000000000000000000000000000000000000000000006000000000000000000000000000000000000000000000000000000000001a400c8fb05948cf6527abe1b570154f613139797c9cf1ace53bd3c8f4a8f756a703f60000000000000000000000000000000000000000000000000000000000000014dd69db25f6d620a7bad3023c5d32761d353d3de9000000000000000000000000f89b944f7a67464b5976d7547c860109e4432d50afb38ef863a0ddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3efa00000000000000000000000004f7a67464b5976d7547c860109e4432d50afb38ea00000000000000000000000000000000000000000000000000000000000000000a00000000000000000000000000000000000000000000000005805420c76fdc3d1f89b944f7a67464b5976d7547c860109e4432d50afb38ef863a0bf551ec93859b170f9b2141bd9298bf3f64322c6f7beb2543a0cb669834118bfa0000000000000000000000000000000000000000000000000000000000000006ea000000000000000000000000095ac38e1c9af5a6d868c1b376e7c0ba9b9251ca5a00000000000000000000000000000000000000000000000005805420c76fdc3d1","0xf903640183b2fe40b9010000000000002000000000000000000000000000000040000000000000000000000000000000000000000000010000000000000000000000000000000000000000000040000800000000000008000000000001000000000100000000000000000000000000020000000000000000000800000000000020000000000010000000000002000000000000000000000000000000000000000002000000000000000000000000000000000000000000000000000000020080000100000000040000000080100002000000000000000000000000000000000000000000010000000020000000000000200000008000000000000000000000001002000000000000000000f90259f9011c94980205d352f198748b626f6f7c38a8a5663ec981f863a02bd2d8a84b748439fd50d79a49502b4eb5faa25b864da6a9ab5c150704be9a4da0000000000000000000000000000000000000000000000000000000000000006ea00000000000000000000000004f7a67464b5976d7547c860109e4432d50afb38eb8a0000000000000000000000000000000000000000000000000000000000000006000000000000000000000000000000000000000000000000000000000001a400d1b36efb5ef48c1953b391dadade996e546aebdeea81b118ac2eefda2a548bac50000000000000000000000000000000000000000000000000000000000000014dd69db25f6d620a7bad3023c5d32761d353d3de9000000000000000000000000f89b944f7a67464b5976d7547c860109e4432d50afb38ef863a0ddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3efa00000000000000000000000004f7a67464b5976d7547c860109e4432d50afb38ea00000000000000000000000000000000000000000000000000000000000000000a00000000000000000000000000000000000000000000000005735cbdc26b5d43af89b944f7a67464b5976d7547c860109e4432d50afb38ef863a0bf551ec93859b170f9b2141bd9298bf3f64322c6f7beb2543a0cb669834118bfa0000000000000000000000000000000000000000000000000000000000000006ea0000000000000000000000000f7db1e439db7a79a8f91cbde7c0069a97b89c813a00000000000000000000000000000000000000000000000005735cbdc26b5d43a","0xf902c40183b4a7bab9010000000040000000080000000000000000000000000000000001000002000000000000000000000000000000000000000000000000000000000000000000002000000040000000000000000000000000000000000000020000000000000000000000000000000000000040000000000000000000000008000000000000000000000000000010000000000000000000000000000000000002000000000000000000000000000000000000000000200000000000000000000000000000040000000080000020000000000000000000000000000000000000000000010000000000000000000000200000000000000000000000000000000000000000000000000000f901b9f8dc94980205d352f198748b626f6f7c38a8a5663ec981f863a074bbc026808dcba59692d6a8bb20596849ca718e10e2432c6cdf48af865bc5d9a0000000000000000000000000000000000000000000000000000000000000006ea0000000000000000000000000a6bf2be6c60175601bf88217c75dd4b14abb5fbbb860312401a801d73bde5cacb7e2eeba637d09c23f9a18dff6504cbdc8f7d7b2e348312401a801d73bde5cacb7e2eeba637d09c23f9a18dff6504cbdc8f7d7b2e3480000000000000000000000000000000000000000000000000000000000000014f8d994a6bf2be6c60175601bf88217c75dd4b14abb5fbbe1a0293e3a2153dc5c8d3667cbd6ede71a71674b2381e5dc4b40c91ad0e813447c0fb8a0000000000000000000000000980205d352f198748b626f6f7c38a8a5663ec981cf507db63af850463ebaaeffe5f783680e6aa364627d07c6488f5ba313ebbcca000000000000000000000000000000000000000000000000000000000000000100000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000","0xf903640183b6bf22b9010000000000002000000000000000000000000000000040000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000800000000000008000000000001000000000000000000000000000000000000020000000000000000000800000000000020000000000010000000008002002000000000000000000000000000000000000002000000000000000000000000000000000040000000000000000000020180000100000000040000000000140002000000000000000000000000000000000000000000000000000020000000000000200000000000000000000000000000001002000000000400000000f90259f9011c94980205d352f198748b626f6f7c38a8a5663ec981f863a02bd2d8a84b748439fd50d79a49502b4eb5faa25b864da6a9ab5c150704be9a4da0000000000000000000000000000000000000000000000000000000000000006fa00000000000000000000000004f7a67464b5976d7547c860109e4432d50afb38eb8a000000000000000000000000000000000000000000000000000000000000000600000000000000000000000000000000000000000000000000000000000073bd808065379db49bfa5292e83432fd6ede06ae24792f0d266ac89be03f7925229ce0000000000000000000000000000000000000000000000000000000000000014dd69db25f6d620a7bad3023c5d32761d353d3de9000000000000000000000000f89b944f7a67464b5976d7547c860109e4432d50afb38ef863a0ddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3efa00000000000000000000000004f7a67464b5976d7547c860109e4432d50afb38ea00000000000000000000000000000000000000000000000000000000000000000a00000000000000000000000000000000000000000000000000a7da3311d85502df89b944f7a67464b5976d7547c860109e4432d50afb38ef863a0bf551ec93859b170f9b2141bd9298bf3f64322c6f7beb2543a0cb669834118bfa0000000000000000000000000000000000000000000000000000000000000006fa0000000000000000000000000c677f78297d40138b68be496ae34d861dc9edbeba00000000000000000000000000000000000000000000000000a7da3311d85502d","0xf902c40183b86890b9010000000040000000080000000000000000000000000000000001000002000000000000000000000000000000000000000000000000000000000000000000002000000000000000000000000000000000000000000000020000000000000000000000000000000000000040000000000000000000000008000000000000000000000000000010000000000000000000000000000000000002000000000000000000000000000000000040000000200000000000000100000000000000040000000000040020000000000000000000000000000000000000000000000000000000000000000000200000000000000000000000000000000000000000000000000000f901b9f8dc94980205d352f198748b626f6f7c38a8a5663ec981f863a074bbc026808dcba59692d6a8bb20596849ca718e10e2432c6cdf48af865bc5d9a0000000000000000000000000000000000000000000000000000000000000006fa0000000000000000000000000a6bf2be6c60175601bf88217c75dd4b14abb5fbbb86031f7494a39416159f52b17758dda7bdafa4215dcf706dfc06cd6f8933b817d2031f7494a39416159f52b17758dda7bdafa4215dcf706dfc06cd6f8933b817d200000000000000000000000000000000000000000000000000000000000000014f8d994a6bf2be6c60175601bf88217c75dd4b14abb5fbbe1a0293e3a2153dc5c8d3667cbd6ede71a71674b2381e5dc4b40c91ad0e813447c0fb8a0000000000000000000000000980205d352f198748b626f6f7c38a8a5663ec981ea46511277ad0d9d47ff09d07eb1e1298bcefa6a6da798de1e0af884002aceb1000000000000000000000000000000000000000000000000000000000000000100000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000","0x02f902460183e60720b9010000000004000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000008002000000000000000000000000000000000000000000000020000000000000000000800000000000000000000000010000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000001000000000000080004002000000000000000000000000000000000000000100000000000020000000000000001000000000000000000000000000000000020000000000000000f9013bf89b9488045945952b374abf696602941b51149bad8ab4f863a0ddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3efa00000000000000000000000000000000000000000000000000000000000000000a0000000000000000000000000e8c83b0cb059fe98f4e0bb2b7be404565e5aaa75a00000000000000000000000000000000000000000033b2e3c9fd0803ce8000000f89c9488045945952b374abf696602941b51149bad8ab4f884a02f8788117e7eff1d82e926ec794901d17c78024a50270940304540a733656f0da00000000000000000000000000000000000000000000000000000000000000000a0000000000000000000000000e8c83b0cb059fe98f4e0bb2b7be404565e5aaa75a0000000000000000000000000e8c83b0cb059fe98f4e0bb2b7be404565e5aaa7580","0xf901090183e65928b9010000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000c0","0x02f901e50183e6f1e1b9010000000000000000000000000000000000000000000000000000000000000000000000000000000000001080000000000000000000000000000000000010000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000020000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000040000040000000000000000000000000000000000000000000000000000000000000000000000000000000000000000f8dbf8d99416324d80bfc68b1fec6c288f0dac640a044d2678e1a0a7fc99ed7617309ee23f63ae90196a1e490d362e6f6a547a59bc809ee2291782b8a00000000000000000000000000000000000000000000000000000000000000060000000000000000000000000000000000000000000000000000000000180ab5200000000000000000000000000000000000000000000000000000000652d2a5500000000000000000000000000000000000000000000000000000000000000074144412f55534400000000000000000000000000000000000000000000000000","0x02f901e50183e78ab2b9010000000000000000000000000400000000000000000000000000000000000000000000000000000000001000000000000000000000000000000000000010000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000008000000000000000000000000000000000000000000000000000000000000000000000800040000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000f8dbf8d994e7a43467520e4d12d1f9e94b99d6f041786aadcee1a0a7fc99ed7617309ee23f63ae90196a1e490d362e6f6a547a59bc809ee2291782b8a0000000000000000000000000000000000000000000000000000000000000006000000000000000000000000000000000000000000000000000000024cba3965500000000000000000000000000000000000000000000000000000000652d2a550000000000000000000000000000000000000000000000000000000000000008574554482f555344000000000000000000000000000000000000000000000000","0x02f901e50183e82377b9010000000000000000000000000000000000000000000000000000000000000000000000080000000000001000000020000000000000000000000000000010000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000004000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000040000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000f8dbf8d994b52a8b962ff3d8a6a0937896ff3da3879eac64e3e1a0a7fc99ed7617309ee23f63ae90196a1e490d362e6f6a547a59bc809ee2291782b8a000000000000000000000000000000000000000000000000000000000000000600000000000000000000000000000000000000000000000000000000005f6321e00000000000000000000000000000000000000000000000000000000652d2a560000000000000000000000000000000000000000000000000000000000000008555344542f555344000000000000000000000000000000000000000000000000","0xf901090183e8ef8fb9010000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000c0","0x02f901e50183e9883cb9010000000002000000000000000000000000000000000000000000000000000000000000000000000000001000000000000000000000000000000000000010000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000080000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000040000000000000000000000000000000000000000000000000000000000000000000000000000000001000000000000f8dbf8d994117a5ab00f93469bea455f0864ef9ad8d9630cc9e1a0a7fc99ed7617309ee23f63ae90196a1e490d362e6f6a547a59bc809ee2291782b8a0000000000000000000000000000000000000000000000000000000000000006000000000000000000000000000000000000000000000000000000000007e060100000000000000000000000000000000000000000000000000000000652d2a5800000000000000000000000000000000000000000000000000000000000000074752542f55534400000000000000000000000000000000000000000000000000","0x02f901e50183ea2101b9010000000000000000000000000000000000000000000000000000004000000000000000000000000000001000000000000000000000000000000000000010000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000800000000000000000000000800000000000000000000000000000000000000000000040000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000f8dbf8d994bbbf9614de2b788a66d970b552a79fae6419abdce1a0a7fc99ed7617309ee23f63ae90196a1e490d362e6f6a547a59bc809ee2291782b8a000000000000000000000000000000000000000000000000000000000000000600000000000000000000000000000000000000000000000000000000005eebd8700000000000000000000000000000000000000000000000000000000652d2a580000000000000000000000000000000000000000000000000000000000000008465241582f555344000000000000000000000000000000000000000000000000","0x02f901e50183eab9d2b9010000000000000000000000000000000000000000000000000000000000000000000000000000000000001000000000000000000000000000000000000010000000000000000000000000000000000000000000000000000000001000000000000000000000000000000000000000000000000000000000000000000000000000000000000004000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000040000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000200f8dbf8d99439f46d72bb20c7bcb8a2cdf52630fac1496e859ae1a0a7fc99ed7617309ee23f63ae90196a1e490d362e6f6a547a59bc809ee2291782b8a0000000000000000000000000000000000000000000000000000000000000006000000000000000000000000000000000000000000000000000000024f8bc612d00000000000000000000000000000000000000000000000000000000652d2a5a0000000000000000000000000000000000000000000000000000000000000008574554482f555344000000000000000000000000000000000000000000000000","0x02f901e50183eb528bb9010000000000000000000000000000000000000000000000000000000000000000000000000000000000001000000000000000000000000000020000000010000000000000000000000000000000000000000000000010000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000100000000000000000000000000000000000000000040000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000f8dbf8d9945ae58e9dec27619572a42dad916e413afa89e46de1a0a7fc99ed7617309ee23f63ae90196a1e490d362e6f6a547a59bc809ee2291782b8a000000000000000000000000000000000000000000000000000000000000000600000000000000000000000000000000000000000000000000000000000019d1f00000000000000000000000000000000000000000000000000000000652d2a5c000000000000000000000000000000000000000000000000000000000000000842414e4b2f555344000000000000000000000000000000000000000000000000","0x02f9043a0183ed1237b9010000200000000000000000002080000000000000000000000000010000000000000000000000000000000000000000200000000000000000000000020000000000000000000400000000002008000000300000000000000000000000008000000000000000008000100000000000000000000000000000000000020010000000000000000080000000004000000000000000000001000000080000104000000000000000000000000000000000000000000000000000000000000000000000000000204002000000001000000000000000000000000000001000000000000020000000000000000000000000000000000000000000000001400000000000000000f9032ff87a94b4fbf271143f4fbf7b91a5ded31805e42b2208d6f842a0e1fffcc4923d04b559f4d29a8bfc6cda04eb5b0d3c460751c2402c5c5cc9109ca00000000000000000000000007a250d5630b4cf539739df2c5dacb4c659f2488da0000000000000000000000000000000000000000000000000000000e8d4a51000f89b94b4fbf271143f4fbf7b91a5ded31805e42b2208d6f863a0ddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3efa00000000000000000000000007a250d5630b4cf539739df2c5dacb4c659f2488da000000000000000000000000077f0ea26bae49c9f412a1511730c7c1d3382f697a0000000000000000000000000000000000000000000000000000000e8d4a51000f89b94257c2c98163227062e5a33095a20fc7604ee52b5f863a0ddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3efa000000000000000000000000077f0ea26bae49c9f412a1511730c7c1d3382f697a0000000000000000000000000185d901fe591ce516ed9e192b33da3ef14d53b93a0000000000000000000000000000000000000000000000000042a7d29b88844e5f8799477f0ea26bae49c9f412a1511730c7c1d3382f697e1a01c411e9a96e071241c2f21f7726b17ae89e3cab4c78be50e062b03a9fffbbad1b840000000000000000000000000000000000000000000007b61de650eaa9bccab150000000000000000000000000000000000000000000000001adafd27de2bd68bf8fc9477f0ea26bae49c9f412a1511730c7c1d3382f697f863a0d78ad95fa46c994b6551d0da85fc275fe613ce37657fb8d5e3d130840159d822a00000000000000000000000007a250d5630b4cf539739df2c5dacb4c659f2488da0000000000000000000000000185d901fe591ce516ed9e192b33da3ef14d53b93b8800000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000e8d4a51000000000000000000000000000000000000000000000000000042a7d29b88844e50000000000000000000000000000000000000000000000000000000000000000","0x02f901e50183edaafcb9010000000000000000000000000000000000000000000000000000000000000000000000000000000000001000000000000000000000000000000000000010000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000004000000000000000000000000000000000000800000000000000000000000000000000040000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000f8dbf8d994aac02884a376dc5145389ba37f08b0dde08d3f18e1a0a7fc99ed7617309ee23f63ae90196a1e490d362e6f6a547a59bc809ee2291782b8a00000000000000000000000000000000000000000000000000000000000000060000000000000000000000000000000000000000000000000000000000b37b80500000000000000000000000000000000000000000000000000000000652d2a5e0000000000000000000000000000000000000000000000000000000000000008445944582f555344000000000000000000000000000000000000000000000000","0x02f901e50183ee43c1b9010000000000000000000000000000000000000000000000000000000000000000000000000000000000001000000000000000000000008000000000000010000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000400040000000000000000004000000000000000000000000000000000000000000000000000000000000000000000000000f8dbf8d994402a30f83bbfc2203e1fc5d8a9bb41e1b0ddc639e1a0a7fc99ed7617309ee23f63ae90196a1e490d362e6f6a547a59bc809ee2291782b8a0000000000000000000000000000000000000000000000000000000000000006000000000000000000000000000000000000000000000000000000024df2e4ee100000000000000000000000000000000000000000000000000000000652d2a5f00000000000000000000000000000000000000000000000000000000000000074554482f55534400000000000000000000000000000000000000000000000000","0x02f901e50183eedc86b9010000000000000000000000000000000000000000000000000000000000000000040000000000000000001000000000000000000000000000000000000010000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000004000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000040000000000000000000000000000000200000000000000000000000000000000000000000000000000000000000000f8dbf8d9943ae963e586b6c1d16f371ac0a1260cdaed6a76bde1a0a7fc99ed7617309ee23f63ae90196a1e490d362e6f6a547a59bc809ee2291782b8a0000000000000000000000000000000000000000000000000000000000000006000000000000000000000000000000000000000000000000000000024dcbf623800000000000000000000000000000000000000000000000000000000652d2a5f00000000000000000000000000000000000000000000000000000000000000074554482f55534400000000000000000000000000000000000000000000000000","0x02f901e50183ef753fb9010000000000000000000000000000000000000000000000000000000000000040000000000000000000001000000000000000000000000000000000000010000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000004000000000000000000000000000000000000000000000000000000000000000000000000000000000000000040000000000000000000000000000000000000000000000000000000000000000000000400000000000000000000000f8dbf8d994c8f4aeb27fce1f361cda3aadcda992c7ed7b0e74e1a0a7fc99ed7617309ee23f63ae90196a1e490d362e6f6a547a59bc809ee2291782b8a0000000000000000000000000000000000000000000000000000000000000006000000000000000000000000000000000000000000000000000000000005b67ef00000000000000000000000000000000000000000000000000000000652d2a610000000000000000000000000000000000000000000000000000000000000008444f47452f555344000000000000000000000000000000000000000000000000","0x02f901e50183f00e04b9010000000000000000000000000000000000000000000000000000000004000000000000000000000000001000000000000400000000000000000000000010000000000000000000000000000000000000000000000000000000000000000000000000040000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000040000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000f8dbf8d99460cfba755fac7178e9a8e133699ad2f7dcf6ad9ae1a0a7fc99ed7617309ee23f63ae90196a1e490d362e6f6a547a59bc809ee2291782b8a0000000000000000000000000000000000000000000000000000000000000006000000000000000000000000000000000000000000000000000000000229ca2bd00000000000000000000000000000000000000000000000000000000652d2a620000000000000000000000000000000000000000000000000000000000000008555255532f555344000000000000000000000000000000000000000000000000","0x02f901098083f0647ab9010000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000c0","0x02f901e50183f0fd33b9010000000000000000000000000000000000000000000000000000000000000000000000000000000000001000000000000000000000000000000000000010000000000000000000000000002000000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000200000000000000000000000000000000000000000000000000000000000000000000000000000040000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000f8dbf8d9945e3b4e52af7f15f4e4e12033d71cfc3afbc7d3c0e1a0a7fc99ed7617309ee23f63ae90196a1e490d362e6f6a547a59bc809ee2291782b8a000000000000000000000000000000000000000000000000000000000000000600000000000000000000000000000000000000000000000000000000002c0f30100000000000000000000000000000000000000000000000000000000652d2a6400000000000000000000000000000000000000000000000000000000000000074f4d472f55534400000000000000000000000000000000000000000000000000","0x02f901e50183f195ecb9010000000000000000000000000000000000000000000000000000000000000000000000000000000000001000000000000000000000000000000000000010000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000010000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000040000000000000000000000000000000000000000000000000000000000000000000000000000000000000002000000f8dbf8d994ffd9e1167e2ad8f323464832ad99a03bda99b7b7e1a0a7fc99ed7617309ee23f63ae90196a1e490d362e6f6a547a59bc809ee2291782b8a000000000000000000000000000000000000000000000000000000000000000600000000000000000000000000000000000000000000000000000000000150ea000000000000000000000000000000000000000000000000000000000652d2a64000000000000000000000000000000000000000000000000000000000000000847414c412f555344000000000000000000000000000000000000000000000000","0x02f901098083f22563b9010000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000c0","0x02f901e50183f2be28b9010000000000000000000000000000000000000000000000000000000000000000000000000000000000001000000000000000000000000000000000000010000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000080000000000000000000000000000000000000000000000000000000001000000000000000000000000000000000000000040000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000f8dbf8d9940e324d90e9180df65e63438b2af37458b7b7b500e1a0a7fc99ed7617309ee23f63ae90196a1e490d362e6f6a547a59bc809ee2291782b8a0000000000000000000000000000000000000000000000000000000000000006000000000000000000000000000000000000000000000000000000004f47321cd00000000000000000000000000000000000000000000000000000000652d2a690000000000000000000000000000000000000000000000000000000000000007424e422f55534400000000000000000000000000000000000000000000000000","0x02f901e50183f356f9b9010000000000000000000000000000000000000000000000000000000000000000000000000000200000001000000000000000000000000000000000000010000000000000000000000000000000000000000000000000000000000000000000100000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000040000000000000000000000000000000000000000000000000000000000000000000000000000040000000000000000f8dbf8d9944a7d0e32e82aea46773c348896761addc51dfb11e1a0a7fc99ed7617309ee23f63ae90196a1e490d362e6f6a547a59bc809ee2291782b8a0000000000000000000000000000000000000000000000000000000000000006000000000000000000000000000000000000000000000000000000105dd23061100000000000000000000000000000000000000000000000000000000652d2a6900000000000000000000000000000000000000000000000000000000000000074254432f55534400000000000000000000000000000000000000000000000000","0x02f901e50183f3e4dab9010000000000000000000000000000000000000000000000000000000000000000000000000000000000001080000000000000000000000000000000000010000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000020000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000040000040000000000000000000000000000000000000000000000000000000000000000000000000000000000000000f8dbf8d99416324d80bfc68b1fec6c288f0dac640a044d2678e1a0a7fc99ed7617309ee23f63ae90196a1e490d362e6f6a547a59bc809ee2291782b8a00000000000000000000000000000000000000000000000000000000000000060000000000000000000000000000000000000000000000000000000018227472200000000000000000000000000000000000000000000000000000000652d2a690000000000000000000000000000000000000000000000000000000000000008414156452f555344000000000000000000000000000000000000000000000000","0x02f901e50183f472c7b9010000000000000000000000000400000000000000000000000000000000000000000000000000000000001000000000000000000000000000000000000010000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000008000000000000000000000000000000000000000000000000000000000000000000000800040000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000f8dbf8d994e7a43467520e4d12d1f9e94b99d6f041786aadcee1a0a7fc99ed7617309ee23f63ae90196a1e490d362e6f6a547a59bc809ee2291782b8a0000000000000000000000000000000000000000000000000000000000000006000000000000000000000000000000000000000000000000000000285d0fb605900000000000000000000000000000000000000000000000000000000652d2a6a0000000000000000000000000000000000000000000000000000000000000008574254432f555344000000000000000000000000000000000000000000000000","0x02f901e50183f50b8cb9010000000000000000000000000000000000000000000000000000000000000000000000000000000002001000000000000000000000000000000000000010000000000000000000000000000000000000200000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000040000000000000020000000000000000000000000000000000000000000000000000000000000000000000000000000f8dbf8d99407c4eee621098c526403b30bdcb17b3722719dcee1a0a7fc99ed7617309ee23f63ae90196a1e490d362e6f6a547a59bc809ee2291782b8a0000000000000000000000000000000000000000000000000000000000000006000000000000000000000000000000000000000000000000000000024dfc6ecd300000000000000000000000000000000000000000000000000000000652d2a6a00000000000000000000000000000000000000000000000000000000000000074554482f55534400000000000000000000000000000000000000000000000000","0x02f901e50183f59979b9010000000000000000000000000000000000000000000000000000000000000000000000080000000000001000000020000000000000000000000000000010000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000004000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000040000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000f8dbf8d994b52a8b962ff3d8a6a0937896ff3da3879eac64e3e1a0a7fc99ed7617309ee23f63ae90196a1e490d362e6f6a547a59bc809ee2291782b8a00000000000000000000000000000000000000000000000000000000000000060000000000000000000000000000000000000000000000000000002870fd6b6be00000000000000000000000000000000000000000000000000000000652d2a6a0000000000000000000000000000000000000000000000000000000000000008574254432f555344000000000000000000000000000000000000000000000000","0x02f904240183f78797b9010000000000100000000000000000000000000000000000000000000000000000000000100000000000000000000000000000000000800600000000000000000000000000000000000000000001082000000000001001000000000000000000000000000000020000000000000000000800000000000000000000000000000000000000000000000000000000000000000000000580000000000000000000000200000000001000000000000000000000000000000000000000000000000000000000000000000000000020000000000000004000000000000000000000000020000000000000000000000000000000000000000000000000000000000000020000f90319f901dc949054f0d5f352fafe6ebf0ec14654da0362dc96caf842a0f6a97944f31ea060dfde0566e4167c1a1082551e64b60ecb14d599a9d023d451a00000000000000000000000000000000000000000000000000000000000011eb6b901800000000000000000000000000000000000000000000000d51cfff1e9a1af7c000000000000000000000000006af57e73d328e2a8ec95e01178d1e2a2a387d66a00000000000000000000000000000000000000000000000000000000000000a00000000000000000000000000000000000000000000000000000000000000140000000000000000000000012332e3d78c6cc4a1a0c4dae81535bc000065fa80300000000000000000000000000000000000000000000000000000000000000040000000000000000000000000000000000000000000000d51cfff1e9a1af7c000000000000000000000000000000000000000000000000d51cfff1e9a1af7c000000000000000000000000000000000000000000000000d51cfff1e9a1af7c000000000000000000000000000000000000000000000000d51cfff1e9a1af7c0000000000000000000000000000000000000000000000000000000000000000040001020300000000000000000000000000000000000000000000000000000000f89b949054f0d5f352fafe6ebf0ec14654da0362dc96caf863a00109fc6f55cf40689f02fbaad7af7fe7bbac8a3d2186600afc7d3e10cac60271a00000000000000000000000000000000000000000000000000000000000011eb6a00000000000000000000000000000000000000000000000000000000000000000a000000000000000000000000000000000000000000000000000000000652d2a70f89b949054f0d5f352fafe6ebf0ec14654da0362dc96caf863a00559884fd3a460db3073b7fc896cc77986f16e378210ded43186175bf646fc5fa00000000000000000000000000000000000000000000000d51cfff1e9a1af7c00a00000000000000000000000000000000000000000000000000000000000011eb6a000000000000000000000000000000000000000000000000000000000652d2a70","0x02f901e50183f8156cb9010000000000000000000000000000000000000000000000000000004000000000000000000000000000001000000000000000000000000000000000000010000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000800000000000000000000000800000000000000000000000000000000000000000000040000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000f8dbf8d994bbbf9614de2b788a66d970b552a79fae6419abdce1a0a7fc99ed7617309ee23f63ae90196a1e490d362e6f6a547a59bc809ee2291782b8a000000000000000000000000000000000000000000000000000000000000000600000000000000000000000000000000000000000000000000000000001c062a100000000000000000000000000000000000000000000000000000000652d2a6c000000000000000000000000000000000000000000000000000000000000000853414e442f555344000000000000000000000000000000000000000000000000","0x02f901e50183f8ae31b9010000000000000000000000000000000000000000000000000000000000000000000000000000000000001000000000000000000000000000000000000010000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000002000000000000000000000040000000000000000000000000000000000000000000000000000000000000000000000000000000000000200000000f8dbf8d994e5d686595da780e6fbe88c31b77c1225974c89fbe1a0a7fc99ed7617309ee23f63ae90196a1e490d362e6f6a547a59bc809ee2291782b8a0000000000000000000000000000000000000000000000000000000000000006000000000000000000000000000000000000000000000000000000024df3d91e000000000000000000000000000000000000000000000000000000000652d2a6d00000000000000000000000000000000000000000000000000000000000000074554482f55534400000000000000000000000000000000000000000000000000","0x02f901e50183f93c06b9010000000000000000000000000000000000000000000000000000000000000000000000000000000000001000000000000000000000000000000000000010000000000000000000000000000000000000000000000000000000001000000000000000000000000000000000000000000000000000000000000000000000000000000000000004000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000040000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000200f8dbf8d99439f46d72bb20c7bcb8a2cdf52630fac1496e859ae1a0a7fc99ed7617309ee23f63ae90196a1e490d362e6f6a547a59bc809ee2291782b8a000000000000000000000000000000000000000000000000000000000000000600000000000000000000000000000000000000000000000000000000005f4f04b00000000000000000000000000000000000000000000000000000000652d2a6e0000000000000000000000000000000000000000000000000000000000000008555344432f555344000000000000000000000000000000000000000000000000","0x02f901090183f9a412b9010000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000c0","0x02f901c80183faf748b9010000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000200000000000000000000000000000000000000000000000008000000000000000000000000000000000040000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000200000000000000000000000080000000000000004000000000800000000000000000000000000000000000000000000000200000000000000000400000000010000000000000000000000000000000000000000000000004800200000000000000000004000000010000000000000000000000000000000f8bef8bc94e5ff3b57695079f808a24256734483cd3889fa9ef884a0a7aaf2512769da4e444e3de247be2564225c2e7a8f74cfe528e46e17d24868e2a08a767b2e89133b95f135e6803d3b75eb52b9636707f38d986de63283fd028beba0000000000000000000000000000000000000000000000000000000000000803ca000000000000000000000000000000000000000000000000000000000003c1c98a000000000000000000000000000000000000000000000000000000000652d2a70","0x02f901090183fb5cb4b9010000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000c0","0x02f901090183fbb880b9010000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000c0","0x02f901090183fdf200b9010000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000c0","0x02f901090183fe5538b9010000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000c0","0x02f901090183febd24b9010000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000c0","0xf90246018401009066b9010000000000000002000000000000000000000000000000000000800000000000000000000000000000000000000800000000000000000000000000000000000000000100000000000000000008020000000000040000000000000000000000000000000000000008000000000000000000100000000000000000800010800000000000000000000000000000010000000000040000000000000000000000000000000000000000000000000000000000000000000000000000000010000000000000000002000000000000000000000000000004000000000000000000000000000000000000000000000000000000000000000040000000004000000000000044f9013af89b9470e53130c4638aa80d5a8abf12983f66e0b1d05ff863a0ddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3efa00000000000000000000000003e62eb1d9f503f1db36bcfcabdaa7488718eee09a0000000000000000000000000e8c84a631d71e1bb7083d3a82a3a74870a286b97a0000000000000000000000000000000000000000000000000016345785d8a0000f89b943e62eb1d9f503f1db36bcfcabdaa7488718eee09f863a0cb339b570a7f0b25afa7333371ff11192092a0aeace12b671f4c212f2815c6fea0000000000000000000000000000000000000000000000000000000000000235aa0000000000000000000000000e8c84a631d71e1bb7083d3a82a3a74870a286b97a0191ae0366d4470dec94ac0ad040496453fecc903ffbad13da54e39498f84b0ff","0x02f9010a01840100f0f6b9010000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000c0","0x02f9010a0184010158f2b9010000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000c0","0x02f9010a01840101d1feb9010000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000c0","0x02f9010a0184010239f6b9010000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000c0","0x02f9010a01840102a1f2b9010000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000c0","0x02f90365018401048fdfb9010000000002000000000000000000000000000000000000000000000000000000000000000000002000000000000000000000000000000020000000000000002000000000000000000800000008000000000000040000000000000000002000000000000000000000000000100000000200000000000000200000000010000800000000000000000000000008000000000000000000000000000000000000000004000000000000000000000000800000000000000000000008000000002000000000000002000000000000000000000000000000000000800000000400000000000000000000002000000000000000000000004000000000000000000000000200f90259f89b948f6d296024766b919473f0ef3b1f7addd3f710dff863a0ddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3efa00000000000000000000000003dd070f9ee183bd667700d668b35b8932438118ea0000000000000000000000000f2ce1c36503401e5fcdecb17b53ac20939ac05d6a000000000000000000000000000000000000000000000000000000000000004d6f89b94d87ba7a50b2e7e660f678a895e4b72e7cb4ccd9cf863a0ddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3efa0000000000000000000000000f2ce1c36503401e5fcdecb17b53ac20939ac05d6a00000000000000000000000003dd070f9ee183bd667700d668b35b8932438118ea00000000000000000000000000000000000000000000000000000000000550ab9f9011c943dd070f9ee183bd667700d668b35b8932438118ef863a0c42079f94a6350d7e6235f29174924f928cc2ac818eb64fed8004e115fbcca67a0000000000000000000000000e592427a0aece92de3edee1f18e0157c05861564a0000000000000000000000000f2ce1c36503401e5fcdecb17b53ac20939ac05d6b8a0fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffb2a0000000000000000000000000000000000000000000000000000000000550ab90000000000000000000000000000000000000042fb2bb8fcdc72e6c302336a2800000000000000000000000000000000000000000000000000000000609fce5a000000000000000000000000000000000000000000000000000000000001487c","0x02f9010a01840105994fb9010000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000c0","0x02f9010a01840106126bb9010000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000c0","0xf9018601840106f418b9010000000000000000000000000020000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000020000000000000000001000000000000000000000000000000000000000000000000020000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000080000000000000000000000000000000000000000000000000000000000000000000010f87bf87994b33a774f60c3eeea880c09bd56f18def648f8fbbe1a0b78ebc573f1f889ca9e1e0fb62c843c836f3d3a2e1f43ef62940e9b894f4ea4cb8400000000000000000000000000000000000000000000000000e507b8392b34d0000000000000000000000000000000000000000000000000000000000652d2a70","0x02f9010a018401075be8b9010000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000c0","0x02f901c901840108af12b9010000000000000000000000000000000000000000000000000000000000000000000000000000000000200000000000000000000000000000000000000000000100000000000000040000000000000000000000000000000000000000000000020000000000000000000000000000000000080000000100000000000000000000000000000000000000200000000000000000000000000000000000000004000020000800000000000000000000000000000000000000000000000000000000000000000000000000002000400000000000000000000000000000000000040000000000000000000001000000000000000000000000000000000000000000040000f8bef8bc943f97a3e25166de26eef93ad91e382215b21fecf7f884a0a7aaf2512769da4e444e3de247be2564225c2e7a8f74cfe528e46e17d24868e2a048f9d6c5064b083c5c5f17c6f18f8ac529863c506fc2d65b5ebb26571dfa1ec0a00000000000000000000000000000000000000000000000000000000000007097a0000000000000000000000000000000000000000000000000000000000034c740a000000000000000000000000000000000000000000000000000000000652d2a70","0x02f9010a01840109284ab9010000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000c0","0x02f9010a01840109a406b9010000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000c0","0x02f9010a0184010a1d2eb9010000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000c0","0x02f9010a0184010a8536b9010000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000c0","0x02f9010a0184010aead2b9010000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000c0","0x02f9010a0184010b52b2b9010000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000c0","0x02f9010a0184010bc95ab9010000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000c0","0x02f9010a0184010c428ab9010000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000c0","0xf901a80184010cc606b9010000000000000000000000000000000000000000000000000000000000000000000000040000000000000000000000000000000000000000000000000000000000000000000000000000000008000000000000000000000000000000000080000000000000020000000000000000000800000000000000000000000010000000000000000000000000000000000000000000000000400000000000000000000000000000000000000000000000040001000000000000000000000000000000000000000002000000008000000000000000000000000000000000000000000020000000000000000000000000000000000000000000000000000000000000000000f89df89b94ccb2505976e9d2fd355c73c3f1a004446d1dfedaf863a0ddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3efa0000000000000000000000000c813edb526830d24a2ce5801d9ef5026a3967529a00000000000000000000000000000000000000000000000000000000000000000a0000000000000000000000000000000000000000000000000000000000000000a"]} diff --git a/proxyd/tools/mockserver/node2.yml b/proxyd/tools/mockserver/node2.yml deleted file mode 100644 index b94ee7af25b6..000000000000 --- a/proxyd/tools/mockserver/node2.yml +++ /dev/null @@ -1,44 +0,0 @@ -- method: eth_getBlockByNumber - block: latest - response: > - { - "jsonrpc": "2.0", - "id": 67, - "result": { - "hash": "hash2", - "number": "0x2" - } - } -- method: eth_getBlockByNumber - block: 0x1 - response: > - { - "jsonrpc": "2.0", - "id": 67, - "result": { - "hash": "hash1", - "number": "0x1" - } - } -- method: eth_getBlockByNumber - block: 0x2 - response: > - { - "jsonrpc": "2.0", - "id": 67, - "result": { - "hash": "hash2", - "number": "0x2" - } - } -- method: eth_getBlockByNumber - block: 0x3 - response: > - { - "jsonrpc": "2.0", - "id": 67, - "result": { - "hash": "hash3", - "number": "0x3" - } - } \ No newline at end of file diff --git a/tsconfig.json b/tsconfig.json deleted file mode 100644 index f389a4990f71..000000000000 --- a/tsconfig.json +++ /dev/null @@ -1,23 +0,0 @@ -{ - "compilerOptions": { - "module": "commonjs", - "target": "es2017", - "sourceMap": true, - "esModuleInterop": true, - "composite": true, - "resolveJsonModule": true, - "declaration": true, - "noImplicitAny": false, - "removeComments": true, - "noLib": false, - "emitDecoratorMetadata": true, - "experimentalDecorators": true, - "typeRoots": [ - "node_modules/@types" - ] - }, - "exclude": [ - "node_modules", - "dist" - ] -} diff --git a/ufm-test-services/.env.example b/ufm-test-services/.env.example deleted file mode 100644 index 037aff6feb4b..000000000000 --- a/ufm-test-services/.env.example +++ /dev/null @@ -1,46 +0,0 @@ -# Used by Test Services to perform certain actions if in CI environment -CI=false - -# This is the password used to login into Grafana dashboard as the admin user -GRAFANA_ADMIN_PWD=op - -# Used by Test Services to query metrics. http://prometheus will use Docker's built-in DNS -METRICS_READ_URL="http://prometheus:9090/api/v1/query" -# The needed credentials to access METRICS_READ_URL. Will be sent as: Authorization: Bearer username:password -METRICS_READ_USERNAME="" -METRICS_READ_PASSWORD="" - -# Used by Test Services to push metrics. http://pushgateway will use Docker's built-in DNS -METRICS_WRITE_URL="http://pushgateway:9091" -# Dictates how the request body is structured when pushing metrics. Should be either "grafana" or "prometheus-pushgateway" -METRICS_WRITE_TOOL="prometheus-pushgateway" -# This is the source the pushed metric will be labeled as originting from. May not need this value -METRICS_WRITE_SOURCE="" -# The needed credentials to access METRICS_READ_URL. Will be sent as: Authorization: Bearer username:password -METRICS_WRITE_USERNAME="" -METRICS_WRITE_PASSWORD="" - -# If true (or anything other than false), Xvfb will be inside the Metamask Test Service container and use it for Playwright tests. -# If false, you will need to specify METAMASK_DISPLAY and METAMASK_DISPLAY_VOLUME so Playwright can connect to a display -METAMASK_PLAYWRIGHT_RUN_HEADLESS=true - -# The display used for running Playwright tests -METAMASK_DISPLAY=host.docker.internal:0 - -# The storage for Playwright to store test result, screenshots, videos, etc. -METAMASK_DISPLAY_VOLUME=/tmp/.X11-unix:/tmp/.X11-unix - -# Mnemonic used to initialize Metamask, make sure there's enough ETH to run tests -METAMASK_SECRET_WORDS_OR_PRIVATEKEY="test test test test test test test test test test test junk" - -# The initial network Metamask will be initialized with, Test Service will override with OP Sepolia -METAMASK_NETWORK="sepolia" - -# The password to unlock Metamask -METAMASK_PASSWORD="T3st_P@ssw0rd!" - -# The URL of the Metamask test dApp that will be spun up automatically for testing against -METAMASK_DAPP_URL="http://localhost:9011" - -# The OP Sepolia RPC provider to be used to read/write data -METAMASK_OP_SEPOLIA_RPC_URL="" diff --git a/ufm-test-services/.secrets.example b/ufm-test-services/.secrets.example deleted file mode 100644 index e286e5d146c5..000000000000 --- a/ufm-test-services/.secrets.example +++ /dev/null @@ -1,46 +0,0 @@ -# Used by Test Services to perform certain actions if in CI environment -CI=false - -# This is the password used to login into Grafana dashboard as the admin user -GRAFANA_ADMIN_PWD=op - -# Used by Test Services to query metrics. http://prometheus will use Docker's built-in DNS -METRICS_READ_URL="http://prometheus:9090/api/v1/query" -# The needed credentials to access METRICS_READ_URL. Will be sent as: Authorization: Bearer username:password -METRICS_READ_USERNAME="" -METRICS_READ_PASSWORD="" - -# Used by Test Services to push metrics. http://pushgateway will use Docker's built-in DNS -METRICS_WRITE_URL="http://pushgateway:9091" -# Dictates how the request body is structured when pushing metrics. Should be either "grafana" or "prometheus-pushgateway" -METRICS_WRITE_TOOL="prometheus-pushgateway" -# This is the source the pushed metric will be labeled as originting from. May not need this value -METRICS_WRITE_SOURCE="" -# The needed credentials to access METRICS_READ_URL. Will be sent as: Authorization: Bearer username:password -METRICS_WRITE_USERNAME="" -METRICS_WRITE_PASSWORD="" - -# If true (or anything other than false), Xvfb will be inside the Metamask Test Service container and use it for Playwright tests. -# If false, you will need to specify METAMASK_DISPLAY and METAMASK_DISPLAY_VOLUME so Playwright can connect to a display -METAMASK_PLAYWRIGHT_RUN_HEADLESS=true - -# The display used for running Playwright tests -METAMASK_DISPLAY=host.docker.internal:0 - -# The storage for Playwright to store test result, screenshots, videos, etc. -METAMASK_DISPLAY_VOLUME=/tmp/.X11-unix:/tmp/.X11-unix - -# Mnemonic used to initialize Metamask, make sure there's enough ETH to run tests -METAMASK_SECRET_WORDS_OR_PRIVATEKEY="test test test test test test test test test test test junk" - -# The initial network Metamask will be initialized with, Test Service will override with OP Goerli -METAMASK_NETWORK="sepolia" - -# The password to unlock Metamask -METAMASK_PASSWORD="T3st_P@ssw0rd!" - -# The URL of the Metamask test dApp that will be spun up automatically for testing against -METAMASK_DAPP_URL="http://localhost:9011" - -# The OP Sepolia RPC provider to be used to read/write data -METAMASK_OP_SEPOLIA_RPC_URL="" diff --git a/ufm-test-services/README.md b/ufm-test-services/README.md deleted file mode 100644 index 6ff6959858c4..000000000000 --- a/ufm-test-services/README.md +++ /dev/null @@ -1,87 +0,0 @@ -# User Facing Monitoring - -This project allows you to create _Test Services_ which are Docker containers configured to run a set of tasks, generate metrics, and push those metrics to a Prometheus Pushgateway that can later be scraped and queried by a Grafana dashboard - -This project has two modes of execution: CI and local - -## CI Execution - -![Diagram of UFM execution flow in CI](./assets//ufm-ci-execution.svg) - -Starting from left to right in the above diagram: - -1. Github Workflow files are created for each time interval Test Services should be ran - - All Test Services that should be ran for a specific time interval (e.g. 1 hour) should be defined in the same Github Workflow file -2. Github will run a workflow at its specified time interval, triggering all of it's defined Test Services to run -3. `docker-compose.yml` builds and runs each Test Service, setting any environment variables that can be sourced from Github secrets -4. Each Test Service will run its defined tasks, generate its metrics, and push them to an already deployed instance of Prometheus Pushgateway -5. An already deployed instance of Prometheus will scrape the Pushgateway for metrics -6. An already deployed Grafana dashboard will query Prometheus for metric data to display - -### Mocking CI Execution Locally - -Thanks to [Act](https://github.com/nektos/act), Github actions can be "ran" locally for testing. Here's how: - -1. [Install Act](https://github.com/nektos/act#installation-through-package-managers) - - For MacOS: `brew install act` -2. [Generate](https://docs.github.com/en/enterprise-server@3.6/authentication/keeping-your-account-and-data-secure/managing-your-personal-access-tokens#creating-a-personal-access-token) a Github access token - - I believe it only needs permission to read from repositories -3. Copy secrets file: `cp .secrets.example .secrets` and fill it out -4. Create `~/.actrc` and copy the following into it: -```bash --P ubuntu-latest=catthehacker/ubuntu:full-18.04 --P ubuntu-latest=catthehacker/ubuntu:full-18.04 --P ubuntu-18.04=catthehacker/ubuntu:full-18.04 -``` -5. Spin up the Pushgateway, Prometheus, and Grafana containers: `docker-compose up pushgateway prometheus grafana` - - Optionally, you could specify a remote Pushgateway and Prometheus instance to push metrics to in `.secrets` - - `PROMETHEUS_SERVER_URL` and `PROMETHEUS_PUSHGATEWAY_URL` -6. Run `act -W .github/workflows/YOUR_WORKFLOW_FILE.yml -s GITHUB_TOKEN=YOUR_TOKEN --secret-file ./ufm-test-services/.secrets --container-architecture linux/amd64` - - `--container-architecture linux/amd64` is necessary if running on MacOS, but may be different for you - - Downloading the Github Actions Docker image takes a while and is pretty big, so you might need to allocate more resources to Docker, or `docker prune`/remove no longer needed images/containers/volumes - -Following these steps will use `act` to mock the Github Actions environment using a Docker container. The Github Actions container will then spin up a nested container to run each Test Service. Each Test Service _should_ be configured to generate and push metrics to the given Pushgateway, so after `act` finishes execution, you should be able to login into Grafana and view the dashboards - -## Local Execution - -### Running With Scheduler - -![Diagram of UFM execution flow locally](./assets//ufm-local-execution.svg) - -Starting from left to right in the above diagram: - -1. Copy env file: `cp .env.example .env` and fill it out - - If you want to run local instances of the Pushgateway, Prometheus, and Grafana, you can run: - ```bash - docker-compose up pushgateway prometheus grafana - ``` - to spin those up. Otherwise, you should override the defaults URLs in the `.env` for: - - `PROMETHEUS_SERVER_URL` and `PROMETHEUS_PUSHGATEWAY_URL` -3. You'll need to setup some sort of scheduler to run your Test Services at specific time intervals - - For Linux/MacOS this can be accomplished using `cron` - - Edit your `cron` job file using `crontab -e` - - Here is some example code to get you started, also found in `crontab.example` file: - ```bash - # Needs to point to docker, otherwise you'll get the error: exec: "docker": executable file not found in $PATH - PATH=/ - - # Runs every 1 hour - 0 * * * * /usr/local/bin/docker-compose -f /path/to/docker-compose.yml --profile 1hour up -d - - # Runs every 1 day - 0 12 * * * /usr/local/bin/docker-compose -f /path/to/docker-compose.yml --profile 1day up -d - - # Runs every 7 days - 0 12 */7 * * /usr/local/bin/docker-compose -f /path/to/docker-compose.yml --profile 7day up -d - ``` - -### Running Manually - -1. Copy env file: `cp .env.example .env` and fill it out -2. Run `docker-compose` for which ever Test Service you'd like to run e.g.: - - `docker-compose run testService1` - - `docker-compose --profile 1hour up` - -## Test Services - -If you're trying to run a specific Test Service, make sure to check out their `README.md`s, as they may have some required prerequisites to setup before they'll run as expected diff --git a/ufm-test-services/assets/ufm-ci-execution.svg b/ufm-test-services/assets/ufm-ci-execution.svg deleted file mode 100644 index 873521f27953..000000000000 --- a/ufm-test-services/assets/ufm-ci-execution.svg +++ /dev/null @@ -1,3 +0,0 @@ -<?xml version="1.0" encoding="UTF-8"?> -<!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.1//EN" "http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd"> -<svg xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" version="1.1" width="1491px" height="221px" viewBox="-0.5 -0.5 1491 221" class="ge-export-svg-dark" style="background-color: rgb(18, 18, 18);"><defs><style type="text/css">svg.ge-export-svg-dark > * { filter: invert(100%) hue-rotate(180deg); } svg.ge-export-svg-dark image { filter: invert(100%) hue-rotate(180deg) }</style></defs><g><path d="M 180 30 L 465 30 L 465 73.63" fill="none" stroke="rgb(0, 0, 0)" stroke-miterlimit="10" pointer-events="stroke"/><path d="M 465 78.88 L 461.5 71.88 L 465 73.63 L 468.5 71.88 Z" fill="rgb(0, 0, 0)" stroke="rgb(0, 0, 0)" stroke-miterlimit="10" pointer-events="all"/><g transform="translate(-0.5 -0.5)"><switch><foreignObject pointer-events="none" width="100%" height="100%" requiredFeatures="http://www.w3.org/TR/SVG11/feature#Extensibility" style="overflow: visible; text-align: left;"><div xmlns="http://www.w3.org/1999/xhtml" style="display: flex; align-items: unsafe center; justify-content: unsafe center; width: 1px; height: 1px; padding-top: 29px; margin-left: 355px;"><div data-drawio-colors="color: rgb(0, 0, 0); background-color: rgb(255, 255, 255); " style="box-sizing: border-box; font-size: 0px; text-align: center;"><div style="display: inline-block; font-size: 11px; font-family: Helvetica; color: rgb(0, 0, 0); line-height: 1.2; pointer-events: all; background-color: rgb(255, 255, 255); white-space: nowrap;">docker-compose run testService1</div></div></div></foreignObject><text x="355" y="32" fill="rgb(0, 0, 0)" font-family="Helvetica" font-size="11px" text-anchor="middle">docker-compose run testService1</text></switch></g><rect x="0" y="0" width="180" height="60" fill="rgb(255, 255, 255)" stroke="rgb(0, 0, 0)" pointer-events="all"/><g transform="translate(-0.5 -0.5)"><switch><foreignObject pointer-events="none" width="100%" height="100%" requiredFeatures="http://www.w3.org/TR/SVG11/feature#Extensibility" style="overflow: visible; text-align: left;"><div xmlns="http://www.w3.org/1999/xhtml" style="display: flex; align-items: unsafe center; justify-content: unsafe center; width: 178px; height: 1px; padding-top: 30px; margin-left: 1px;"><div data-drawio-colors="color: rgb(0, 0, 0); " style="box-sizing: border-box; font-size: 0px; text-align: center;"><div style="display: inline-block; font-size: 12px; font-family: Helvetica; color: rgb(0, 0, 0); line-height: 1.2; pointer-events: all; white-space: normal; overflow-wrap: normal;">Github Workflow<br />ufm-test-service-1-hour.yml</div></div></div></foreignObject><text x="90" y="34" fill="rgb(0, 0, 0)" font-family="Helvetica" font-size="12px" text-anchor="middle">Github Workflow...</text></switch></g><path d="M 540 95 L 590 95 L 590 30 L 633.63 30" fill="none" stroke="rgb(0, 0, 0)" stroke-miterlimit="10" pointer-events="stroke"/><path d="M 638.88 30 L 631.88 33.5 L 633.63 30 L 631.88 26.5 Z" fill="rgb(0, 0, 0)" stroke="rgb(0, 0, 0)" stroke-miterlimit="10" pointer-events="all"/><path d="M 540 110 L 633.63 110" fill="none" stroke="rgb(0, 0, 0)" stroke-miterlimit="10" pointer-events="stroke"/><path d="M 638.88 110 L 631.88 113.5 L 633.63 110 L 631.88 106.5 Z" fill="rgb(0, 0, 0)" stroke="rgb(0, 0, 0)" stroke-miterlimit="10" pointer-events="all"/><path d="M 540 125 L 590 125 L 590 190 L 633.63 190" fill="none" stroke="rgb(0, 0, 0)" stroke-miterlimit="10" pointer-events="stroke"/><path d="M 638.88 190 L 631.88 193.5 L 633.63 190 L 631.88 186.5 Z" fill="rgb(0, 0, 0)" stroke="rgb(0, 0, 0)" stroke-miterlimit="10" pointer-events="all"/><rect x="390" y="80" width="150" height="60" fill="rgb(255, 255, 255)" stroke="rgb(0, 0, 0)" pointer-events="all"/><g transform="translate(-0.5 -0.5)"><switch><foreignObject pointer-events="none" width="100%" height="100%" requiredFeatures="http://www.w3.org/TR/SVG11/feature#Extensibility" style="overflow: visible; text-align: left;"><div xmlns="http://www.w3.org/1999/xhtml" style="display: flex; align-items: unsafe center; justify-content: unsafe center; width: 148px; height: 1px; padding-top: 110px; margin-left: 391px;"><div data-drawio-colors="color: rgb(0, 0, 0); " style="box-sizing: border-box; font-size: 0px; text-align: center;"><div style="display: inline-block; font-size: 12px; font-family: Helvetica; color: rgb(0, 0, 0); line-height: 1.2; pointer-events: all; white-space: normal; overflow-wrap: normal;">docker-compose.yml</div></div></div></foreignObject><text x="465" y="114" fill="rgb(0, 0, 0)" font-family="Helvetica" font-size="12px" text-anchor="middle">docker-compose.yml</text></switch></g><path d="M 180 110 L 383.63 110" fill="none" stroke="rgb(0, 0, 0)" stroke-miterlimit="10" pointer-events="stroke"/><path d="M 388.88 110 L 381.88 113.5 L 383.63 110 L 381.88 106.5 Z" fill="rgb(0, 0, 0)" stroke="rgb(0, 0, 0)" stroke-miterlimit="10" pointer-events="all"/><g transform="translate(-0.5 -0.5)"><switch><foreignObject pointer-events="none" width="100%" height="100%" requiredFeatures="http://www.w3.org/TR/SVG11/feature#Extensibility" style="overflow: visible; text-align: left;"><div xmlns="http://www.w3.org/1999/xhtml" style="display: flex; align-items: unsafe center; justify-content: unsafe center; width: 1px; height: 1px; padding-top: 112px; margin-left: 291px;"><div data-drawio-colors="color: rgb(0, 0, 0); background-color: rgb(255, 255, 255); " style="box-sizing: border-box; font-size: 0px; text-align: center;"><div style="display: inline-block; font-size: 11px; font-family: Helvetica; color: rgb(0, 0, 0); line-height: 1.2; pointer-events: all; background-color: rgb(255, 255, 255); white-space: nowrap;">docker-compose run testService2</div></div></div></foreignObject><text x="291" y="115" fill="rgb(0, 0, 0)" font-family="Helvetica" font-size="11px" text-anchor="middle">docker-compose run testService2</text></switch></g><rect x="0" y="80" width="180" height="60" fill="rgb(255, 255, 255)" stroke="rgb(0, 0, 0)" pointer-events="all"/><g transform="translate(-0.5 -0.5)"><switch><foreignObject pointer-events="none" width="100%" height="100%" requiredFeatures="http://www.w3.org/TR/SVG11/feature#Extensibility" style="overflow: visible; text-align: left;"><div xmlns="http://www.w3.org/1999/xhtml" style="display: flex; align-items: unsafe center; justify-content: unsafe center; width: 178px; height: 1px; padding-top: 110px; margin-left: 1px;"><div data-drawio-colors="color: rgb(0, 0, 0); " style="box-sizing: border-box; font-size: 0px; text-align: center;"><div style="display: inline-block; font-size: 12px; font-family: Helvetica; color: rgb(0, 0, 0); line-height: 1.2; pointer-events: all; white-space: normal; overflow-wrap: normal;">Github Workflow<br />ufm-test-service-1-day.yml</div></div></div></foreignObject><text x="90" y="114" fill="rgb(0, 0, 0)" font-family="Helvetica" font-size="12px" text-anchor="middle">Github Workflow...</text></switch></g><path d="M 180 190 L 465 190 L 465 146.37" fill="none" stroke="rgb(0, 0, 0)" stroke-miterlimit="10" pointer-events="stroke"/><path d="M 465 141.12 L 468.5 148.12 L 465 146.37 L 461.5 148.12 Z" fill="rgb(0, 0, 0)" stroke="rgb(0, 0, 0)" stroke-miterlimit="10" pointer-events="all"/><g transform="translate(-0.5 -0.5)"><switch><foreignObject pointer-events="none" width="100%" height="100%" requiredFeatures="http://www.w3.org/TR/SVG11/feature#Extensibility" style="overflow: visible; text-align: left;"><div xmlns="http://www.w3.org/1999/xhtml" style="display: flex; align-items: unsafe center; justify-content: unsafe center; width: 1px; height: 1px; padding-top: 192px; margin-left: 317px;"><div data-drawio-colors="color: rgb(0, 0, 0); background-color: rgb(255, 255, 255); " style="box-sizing: border-box; font-size: 0px; text-align: center;"><div style="display: inline-block; font-size: 11px; font-family: Helvetica; color: rgb(0, 0, 0); line-height: 1.2; pointer-events: all; background-color: rgb(255, 255, 255); white-space: nowrap;">docker-compose run testService3</div></div></div></foreignObject><text x="317" y="195" fill="rgb(0, 0, 0)" font-family="Helvetica" font-size="11px" text-anchor="middle">docker-compose run testService3</text></switch></g><rect x="0" y="160" width="180" height="60" fill="rgb(255, 255, 255)" stroke="rgb(0, 0, 0)" pointer-events="all"/><g transform="translate(-0.5 -0.5)"><switch><foreignObject pointer-events="none" width="100%" height="100%" requiredFeatures="http://www.w3.org/TR/SVG11/feature#Extensibility" style="overflow: visible; text-align: left;"><div xmlns="http://www.w3.org/1999/xhtml" style="display: flex; align-items: unsafe center; justify-content: unsafe center; width: 178px; height: 1px; padding-top: 190px; margin-left: 1px;"><div data-drawio-colors="color: rgb(0, 0, 0); " style="box-sizing: border-box; font-size: 0px; text-align: center;"><div style="display: inline-block; font-size: 12px; font-family: Helvetica; color: rgb(0, 0, 0); line-height: 1.2; pointer-events: all; white-space: normal; overflow-wrap: normal;">Github Workflow<br />ufm-test-service-7-day.yml</div></div></div></foreignObject><text x="90" y="194" fill="rgb(0, 0, 0)" font-family="Helvetica" font-size="12px" text-anchor="middle">Github Workflow...</text></switch></g><path d="M 770 30 L 1015 30 L 1015 73.63" fill="none" stroke="rgb(0, 0, 0)" stroke-miterlimit="10" pointer-events="stroke"/><path d="M 1015 78.88 L 1011.5 71.88 L 1015 73.63 L 1018.5 71.88 Z" fill="rgb(0, 0, 0)" stroke="rgb(0, 0, 0)" stroke-miterlimit="10" pointer-events="all"/><g transform="translate(-0.5 -0.5)"><switch><foreignObject pointer-events="none" width="100%" height="100%" requiredFeatures="http://www.w3.org/TR/SVG11/feature#Extensibility" style="overflow: visible; text-align: left;"><div xmlns="http://www.w3.org/1999/xhtml" style="display: flex; align-items: unsafe center; justify-content: unsafe center; width: 1px; height: 1px; padding-top: 33px; margin-left: 887px;"><div data-drawio-colors="color: rgb(0, 0, 0); background-color: rgb(255, 255, 255); " style="box-sizing: border-box; font-size: 0px; text-align: center;"><div style="display: inline-block; font-size: 11px; font-family: Helvetica; color: rgb(0, 0, 0); line-height: 1.2; pointer-events: all; background-color: rgb(255, 255, 255); white-space: nowrap;">runs tasks and pushes metrics</div></div></div></foreignObject><text x="887" y="36" fill="rgb(0, 0, 0)" font-family="Helvetica" font-size="11px" text-anchor="middle">runs tasks and pushes metrics</text></switch></g><rect x="640" y="0" width="130" height="60" fill="rgb(255, 255, 255)" stroke="rgb(0, 0, 0)" pointer-events="all"/><g transform="translate(-0.5 -0.5)"><switch><foreignObject pointer-events="none" width="100%" height="100%" requiredFeatures="http://www.w3.org/TR/SVG11/feature#Extensibility" style="overflow: visible; text-align: left;"><div xmlns="http://www.w3.org/1999/xhtml" style="display: flex; align-items: unsafe center; justify-content: unsafe center; width: 128px; height: 1px; padding-top: 30px; margin-left: 641px;"><div data-drawio-colors="color: rgb(0, 0, 0); " style="box-sizing: border-box; font-size: 0px; text-align: center;"><div style="display: inline-block; font-size: 12px; font-family: Helvetica; color: rgb(0, 0, 0); line-height: 1.2; pointer-events: all; white-space: normal; overflow-wrap: normal;">Test Service 1<br />Dockerfile</div></div></div></foreignObject><text x="705" y="34" fill="rgb(0, 0, 0)" font-family="Helvetica" font-size="12px" text-anchor="middle">Test Service 1...</text></switch></g><path d="M 770 110 L 943.63 110" fill="none" stroke="rgb(0, 0, 0)" stroke-miterlimit="10" pointer-events="stroke"/><path d="M 948.88 110 L 941.88 113.5 L 943.63 110 L 941.88 106.5 Z" fill="rgb(0, 0, 0)" stroke="rgb(0, 0, 0)" stroke-miterlimit="10" pointer-events="all"/><g transform="translate(-0.5 -0.5)"><switch><foreignObject pointer-events="none" width="100%" height="100%" requiredFeatures="http://www.w3.org/TR/SVG11/feature#Extensibility" style="overflow: visible; text-align: left;"><div xmlns="http://www.w3.org/1999/xhtml" style="display: flex; align-items: unsafe center; justify-content: unsafe center; width: 1px; height: 1px; padding-top: 112px; margin-left: 861px;"><div data-drawio-colors="color: rgb(0, 0, 0); background-color: rgb(255, 255, 255); " style="box-sizing: border-box; font-size: 0px; text-align: center;"><div style="display: inline-block; font-size: 11px; font-family: Helvetica; color: rgb(0, 0, 0); line-height: 1.2; pointer-events: all; background-color: rgb(255, 255, 255); white-space: nowrap;">runs tasks and pushes metrics</div></div></div></foreignObject><text x="861" y="115" fill="rgb(0, 0, 0)" font-family="Helvetica" font-size="11px" text-anchor="middle">runs tasks and pushes metrics</text></switch></g><rect x="640" y="80" width="130" height="60" fill="rgb(255, 255, 255)" stroke="rgb(0, 0, 0)" pointer-events="all"/><g transform="translate(-0.5 -0.5)"><switch><foreignObject pointer-events="none" width="100%" height="100%" requiredFeatures="http://www.w3.org/TR/SVG11/feature#Extensibility" style="overflow: visible; text-align: left;"><div xmlns="http://www.w3.org/1999/xhtml" style="display: flex; align-items: unsafe center; justify-content: unsafe center; width: 128px; height: 1px; padding-top: 110px; margin-left: 641px;"><div data-drawio-colors="color: rgb(0, 0, 0); " style="box-sizing: border-box; font-size: 0px; text-align: center;"><div style="display: inline-block; font-size: 12px; font-family: Helvetica; color: rgb(0, 0, 0); line-height: 1.2; pointer-events: all; white-space: normal; overflow-wrap: normal;">Test Service 2<br />Dockerfile</div></div></div></foreignObject><text x="705" y="114" fill="rgb(0, 0, 0)" font-family="Helvetica" font-size="12px" text-anchor="middle">Test Service 2...</text></switch></g><path d="M 770 190 L 1015 190 L 1015 146.37" fill="none" stroke="rgb(0, 0, 0)" stroke-miterlimit="10" pointer-events="stroke"/><path d="M 1015 141.12 L 1018.5 148.12 L 1015 146.37 L 1011.5 148.12 Z" fill="rgb(0, 0, 0)" stroke="rgb(0, 0, 0)" stroke-miterlimit="10" pointer-events="all"/><g transform="translate(-0.5 -0.5)"><switch><foreignObject pointer-events="none" width="100%" height="100%" requiredFeatures="http://www.w3.org/TR/SVG11/feature#Extensibility" style="overflow: visible; text-align: left;"><div xmlns="http://www.w3.org/1999/xhtml" style="display: flex; align-items: unsafe center; justify-content: unsafe center; width: 1px; height: 1px; padding-top: 190px; margin-left: 891px;"><div data-drawio-colors="color: rgb(0, 0, 0); background-color: rgb(255, 255, 255); " style="box-sizing: border-box; font-size: 0px; text-align: center;"><div style="display: inline-block; font-size: 11px; font-family: Helvetica; color: rgb(0, 0, 0); line-height: 1.2; pointer-events: all; background-color: rgb(255, 255, 255); white-space: nowrap;">runs tasks and pushes metrics</div></div></div></foreignObject><text x="891" y="193" fill="rgb(0, 0, 0)" font-family="Helvetica" font-size="11px" text-anchor="middle">runs tasks and pushes metrics</text></switch></g><rect x="640" y="160" width="130" height="60" fill="rgb(255, 255, 255)" stroke="rgb(0, 0, 0)" pointer-events="all"/><g transform="translate(-0.5 -0.5)"><switch><foreignObject pointer-events="none" width="100%" height="100%" requiredFeatures="http://www.w3.org/TR/SVG11/feature#Extensibility" style="overflow: visible; text-align: left;"><div xmlns="http://www.w3.org/1999/xhtml" style="display: flex; align-items: unsafe center; justify-content: unsafe center; width: 128px; height: 1px; padding-top: 190px; margin-left: 641px;"><div data-drawio-colors="color: rgb(0, 0, 0); " style="box-sizing: border-box; font-size: 0px; text-align: center;"><div style="display: inline-block; font-size: 12px; font-family: Helvetica; color: rgb(0, 0, 0); line-height: 1.2; pointer-events: all; white-space: normal; overflow-wrap: normal;">Test Service 3<br />Dockerfile</div></div></div></foreignObject><text x="705" y="194" fill="rgb(0, 0, 0)" font-family="Helvetica" font-size="12px" text-anchor="middle">Test Service 3...</text></switch></g><rect x="950" y="80" width="130" height="60" fill="rgb(255, 255, 255)" stroke="rgb(0, 0, 0)" pointer-events="all"/><g transform="translate(-0.5 -0.5)"><switch><foreignObject pointer-events="none" width="100%" height="100%" requiredFeatures="http://www.w3.org/TR/SVG11/feature#Extensibility" style="overflow: visible; text-align: left;"><div xmlns="http://www.w3.org/1999/xhtml" style="display: flex; align-items: unsafe center; justify-content: unsafe center; width: 128px; height: 1px; padding-top: 110px; margin-left: 951px;"><div data-drawio-colors="color: rgb(0, 0, 0); " style="box-sizing: border-box; font-size: 0px; text-align: center;"><div style="display: inline-block; font-size: 12px; font-family: Helvetica; color: rgb(0, 0, 0); line-height: 1.2; pointer-events: all; white-space: normal; overflow-wrap: normal;">Prometheus Pushgateway</div></div></div></foreignObject><text x="1015" y="114" fill="rgb(0, 0, 0)" font-family="Helvetica" font-size="12px" text-anchor="middle">Prometheus Pushgateway</text></switch></g><path d="M 1160 110 L 1086.37 110" fill="none" stroke="rgb(0, 0, 0)" stroke-miterlimit="10" pointer-events="stroke"/><path d="M 1081.12 110 L 1088.12 106.5 L 1086.37 110 L 1088.12 113.5 Z" fill="rgb(0, 0, 0)" stroke="rgb(0, 0, 0)" stroke-miterlimit="10" pointer-events="all"/><g transform="translate(-0.5 -0.5)"><switch><foreignObject pointer-events="none" width="100%" height="100%" requiredFeatures="http://www.w3.org/TR/SVG11/feature#Extensibility" style="overflow: visible; text-align: left;"><div xmlns="http://www.w3.org/1999/xhtml" style="display: flex; align-items: unsafe center; justify-content: unsafe center; width: 1px; height: 1px; padding-top: 110px; margin-left: 1119px;"><div data-drawio-colors="color: rgb(0, 0, 0); background-color: rgb(255, 255, 255); " style="box-sizing: border-box; font-size: 0px; text-align: center;"><div style="display: inline-block; font-size: 11px; font-family: Helvetica; color: rgb(0, 0, 0); line-height: 1.2; pointer-events: all; background-color: rgb(255, 255, 255); white-space: nowrap;">scrapes</div></div></div></foreignObject><text x="1119" y="113" fill="rgb(0, 0, 0)" font-family="Helvetica" font-size="11px" text-anchor="middle">scrapes</text></switch></g><rect x="1160" y="80" width="130" height="60" fill="rgb(255, 255, 255)" stroke="rgb(0, 0, 0)" pointer-events="all"/><g transform="translate(-0.5 -0.5)"><switch><foreignObject pointer-events="none" width="100%" height="100%" requiredFeatures="http://www.w3.org/TR/SVG11/feature#Extensibility" style="overflow: visible; text-align: left;"><div xmlns="http://www.w3.org/1999/xhtml" style="display: flex; align-items: unsafe center; justify-content: unsafe center; width: 128px; height: 1px; padding-top: 110px; margin-left: 1161px;"><div data-drawio-colors="color: rgb(0, 0, 0); " style="box-sizing: border-box; font-size: 0px; text-align: center;"><div style="display: inline-block; font-size: 12px; font-family: Helvetica; color: rgb(0, 0, 0); line-height: 1.2; pointer-events: all; white-space: normal; overflow-wrap: normal;">Prometheus</div></div></div></foreignObject><text x="1225" y="114" fill="rgb(0, 0, 0)" font-family="Helvetica" font-size="12px" text-anchor="middle">Prometheus</text></switch></g><path d="M 1360 110 L 1296.37 110" fill="none" stroke="rgb(0, 0, 0)" stroke-miterlimit="10" pointer-events="stroke"/><path d="M 1291.12 110 L 1298.12 106.5 L 1296.37 110 L 1298.12 113.5 Z" fill="rgb(0, 0, 0)" stroke="rgb(0, 0, 0)" stroke-miterlimit="10" pointer-events="all"/><g transform="translate(-0.5 -0.5)"><switch><foreignObject pointer-events="none" width="100%" height="100%" requiredFeatures="http://www.w3.org/TR/SVG11/feature#Extensibility" style="overflow: visible; text-align: left;"><div xmlns="http://www.w3.org/1999/xhtml" style="display: flex; align-items: unsafe center; justify-content: unsafe center; width: 1px; height: 1px; padding-top: 112px; margin-left: 1325px;"><div data-drawio-colors="color: rgb(0, 0, 0); background-color: rgb(255, 255, 255); " style="box-sizing: border-box; font-size: 0px; text-align: center;"><div style="display: inline-block; font-size: 11px; font-family: Helvetica; color: rgb(0, 0, 0); line-height: 1.2; pointer-events: all; background-color: rgb(255, 255, 255); white-space: nowrap;">Queries</div></div></div></foreignObject><text x="1325" y="115" fill="rgb(0, 0, 0)" font-family="Helvetica" font-size="11px" text-anchor="middle">Queries</text></switch></g><rect x="1360" y="80" width="130" height="60" fill="rgb(255, 255, 255)" stroke="rgb(0, 0, 0)" pointer-events="all"/><g transform="translate(-0.5 -0.5)"><switch><foreignObject pointer-events="none" width="100%" height="100%" requiredFeatures="http://www.w3.org/TR/SVG11/feature#Extensibility" style="overflow: visible; text-align: left;"><div xmlns="http://www.w3.org/1999/xhtml" style="display: flex; align-items: unsafe center; justify-content: unsafe center; width: 128px; height: 1px; padding-top: 110px; margin-left: 1361px;"><div data-drawio-colors="color: rgb(0, 0, 0); " style="box-sizing: border-box; font-size: 0px; text-align: center;"><div style="display: inline-block; font-size: 12px; font-family: Helvetica; color: rgb(0, 0, 0); line-height: 1.2; pointer-events: all; white-space: normal; overflow-wrap: normal;">Grafana</div></div></div></foreignObject><text x="1425" y="114" fill="rgb(0, 0, 0)" font-family="Helvetica" font-size="12px" text-anchor="middle">Grafana</text></switch></g></g><switch><g requiredFeatures="http://www.w3.org/TR/SVG11/feature#Extensibility"/><a transform="translate(0,-5)" xlink:href="https://www.drawio.com/doc/faq/svg-export-text-problems" target="_blank"><text text-anchor="middle" font-size="10px" x="50%" y="100%">Text is not SVG - cannot display</text></a></switch></svg> \ No newline at end of file diff --git a/ufm-test-services/assets/ufm-local-execution.svg b/ufm-test-services/assets/ufm-local-execution.svg deleted file mode 100644 index 35b794da784e..000000000000 --- a/ufm-test-services/assets/ufm-local-execution.svg +++ /dev/null @@ -1,3 +0,0 @@ -<?xml version="1.0" encoding="UTF-8"?> -<!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.1//EN" "http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd"> -<svg xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" version="1.1" width="1421px" height="309px" viewBox="-0.5 -0.5 1421 309" class="ge-export-svg-dark" style="background-color: rgb(18, 18, 18);"><defs><style type="text/css">svg.ge-export-svg-dark > * { filter: invert(100%) hue-rotate(180deg); } svg.ge-export-svg-dark image { filter: invert(100%) hue-rotate(180deg) }</style></defs><g><path d="M 120 122 L 333.63 122" fill="none" stroke="rgb(0, 0, 0)" stroke-miterlimit="10" pointer-events="stroke"/><path d="M 338.88 122 L 331.88 125.5 L 333.63 122 L 331.88 118.5 Z" fill="rgb(0, 0, 0)" stroke="rgb(0, 0, 0)" stroke-miterlimit="10" pointer-events="all"/><g transform="translate(-0.5 -0.5)"><switch><foreignObject pointer-events="none" width="100%" height="100%" requiredFeatures="http://www.w3.org/TR/SVG11/feature#Extensibility" style="overflow: visible; text-align: left;"><div xmlns="http://www.w3.org/1999/xhtml" style="display: flex; align-items: unsafe center; justify-content: unsafe center; width: 1px; height: 1px; padding-top: 122px; margin-left: 225px;"><div data-drawio-colors="color: rgb(0, 0, 0); background-color: rgb(255, 255, 255); " style="box-sizing: border-box; font-size: 0px; text-align: center;"><div style="display: inline-block; font-size: 11px; font-family: Helvetica; color: rgb(0, 0, 0); line-height: 1.2; pointer-events: all; background-color: rgb(255, 255, 255); white-space: nowrap;">docker-compose --profile 1hour up</div></div></div></foreignObject><text x="225" y="125" fill="rgb(0, 0, 0)" font-family="Helvetica" font-size="11px" text-anchor="middle">docker-compose --profile 1hour up</text></switch></g><path d="M 120 137 L 333.63 137" fill="none" stroke="rgb(0, 0, 0)" stroke-miterlimit="10" pointer-events="stroke"/><path d="M 338.88 137 L 331.88 140.5 L 333.63 137 L 331.88 133.5 Z" fill="rgb(0, 0, 0)" stroke="rgb(0, 0, 0)" stroke-miterlimit="10" pointer-events="all"/><g transform="translate(-0.5 -0.5)"><switch><foreignObject pointer-events="none" width="100%" height="100%" requiredFeatures="http://www.w3.org/TR/SVG11/feature#Extensibility" style="overflow: visible; text-align: left;"><div xmlns="http://www.w3.org/1999/xhtml" style="display: flex; align-items: unsafe center; justify-content: unsafe center; width: 1px; height: 1px; padding-top: 139px; margin-left: 227px;"><div data-drawio-colors="color: rgb(0, 0, 0); background-color: rgb(255, 255, 255); " style="box-sizing: border-box; font-size: 0px; text-align: center;"><div style="display: inline-block; font-size: 11px; font-family: Helvetica; color: rgb(0, 0, 0); line-height: 1.2; pointer-events: all; background-color: rgb(255, 255, 255); white-space: nowrap;">docker-compose --profile 1day up</div></div></div></foreignObject><text x="227" y="142" fill="rgb(0, 0, 0)" font-family="Helvetica" font-size="11px" text-anchor="middle">docker-compose --profile 1day up</text></switch></g><path d="M 120 152 L 333.63 152" fill="none" stroke="rgb(0, 0, 0)" stroke-miterlimit="10" pointer-events="stroke"/><path d="M 338.88 152 L 331.88 155.5 L 333.63 152 L 331.88 148.5 Z" fill="rgb(0, 0, 0)" stroke="rgb(0, 0, 0)" stroke-miterlimit="10" pointer-events="all"/><g transform="translate(-0.5 -0.5)"><switch><foreignObject pointer-events="none" width="100%" height="100%" requiredFeatures="http://www.w3.org/TR/SVG11/feature#Extensibility" style="overflow: visible; text-align: left;"><div xmlns="http://www.w3.org/1999/xhtml" style="display: flex; align-items: unsafe center; justify-content: unsafe center; width: 1px; height: 1px; padding-top: 152px; margin-left: 230px;"><div data-drawio-colors="color: rgb(0, 0, 0); background-color: rgb(255, 255, 255); " style="box-sizing: border-box; font-size: 0px; text-align: center;"><div style="display: inline-block; font-size: 11px; font-family: Helvetica; color: rgb(0, 0, 0); line-height: 1.2; pointer-events: all; background-color: rgb(255, 255, 255); white-space: nowrap;">docker-compose --profile 7day up</div></div></div></foreignObject><text x="230" y="155" fill="rgb(0, 0, 0)" font-family="Helvetica" font-size="11px" text-anchor="middle">docker-compose --profile 7day up</text></switch></g><rect x="0" y="107" width="120" height="60" fill="rgb(255, 255, 255)" stroke="rgb(0, 0, 0)" pointer-events="all"/><g transform="translate(-0.5 -0.5)"><switch><foreignObject pointer-events="none" width="100%" height="100%" requiredFeatures="http://www.w3.org/TR/SVG11/feature#Extensibility" style="overflow: visible; text-align: left;"><div xmlns="http://www.w3.org/1999/xhtml" style="display: flex; align-items: unsafe center; justify-content: unsafe center; width: 118px; height: 1px; padding-top: 137px; margin-left: 1px;"><div data-drawio-colors="color: rgb(0, 0, 0); " style="box-sizing: border-box; font-size: 0px; text-align: center;"><div style="display: inline-block; font-size: 12px; font-family: Helvetica; color: rgb(0, 0, 0); line-height: 1.2; pointer-events: all; white-space: normal; overflow-wrap: normal;">Scheduler<br />(i.e. cron)</div></div></div></foreignObject><text x="60" y="141" fill="rgb(0, 0, 0)" font-family="Helvetica" font-size="12px" text-anchor="middle">Scheduler...</text></switch></g><path d="M 500 137 L 563.63 137" fill="none" stroke="rgb(0, 0, 0)" stroke-miterlimit="10" pointer-events="stroke"/><path d="M 568.88 137 L 561.88 140.5 L 563.63 137 L 561.88 133.5 Z" fill="rgb(0, 0, 0)" stroke="rgb(0, 0, 0)" stroke-miterlimit="10" pointer-events="all"/><path d="M 500 122 L 535 122 L 535 57 L 563.63 57" fill="none" stroke="rgb(0, 0, 0)" stroke-miterlimit="10" pointer-events="stroke"/><path d="M 568.88 57 L 561.88 60.5 L 563.63 57 L 561.88 53.5 Z" fill="rgb(0, 0, 0)" stroke="rgb(0, 0, 0)" stroke-miterlimit="10" pointer-events="all"/><path d="M 500 152 L 535 152 L 535 217 L 563.63 217" fill="none" stroke="rgb(0, 0, 0)" stroke-miterlimit="10" pointer-events="stroke"/><path d="M 568.88 217 L 561.88 220.5 L 563.63 217 L 561.88 213.5 Z" fill="rgb(0, 0, 0)" stroke="rgb(0, 0, 0)" stroke-miterlimit="10" pointer-events="all"/><path d="M 420 107 L 420 7 L 977.6 7 L 977.51 100.35" fill="none" stroke="rgb(0, 0, 0)" stroke-miterlimit="10" pointer-events="stroke"/><path d="M 977.5 105.6 L 974.01 98.6 L 977.51 100.35 L 981.01 98.61 Z" fill="rgb(0, 0, 0)" stroke="rgb(0, 0, 0)" stroke-miterlimit="10" pointer-events="all"/><path d="M 420 107 L 420 7 L 1155 7 L 1155 100.35" fill="none" stroke="rgb(0, 0, 0)" stroke-miterlimit="10" pointer-events="stroke"/><path d="M 1155 105.6 L 1151.5 98.6 L 1155 100.35 L 1158.5 98.6 Z" fill="rgb(0, 0, 0)" stroke="rgb(0, 0, 0)" stroke-miterlimit="10" pointer-events="all"/><path d="M 420 107 L 420 7 L 1355 7 L 1355 100.35" fill="none" stroke="rgb(0, 0, 0)" stroke-miterlimit="10" pointer-events="stroke"/><path d="M 1355 105.6 L 1351.5 98.6 L 1355 100.35 L 1358.5 98.6 Z" fill="rgb(0, 0, 0)" stroke="rgb(0, 0, 0)" stroke-miterlimit="10" pointer-events="all"/><g transform="translate(-0.5 -0.5)"><switch><foreignObject pointer-events="none" width="100%" height="100%" requiredFeatures="http://www.w3.org/TR/SVG11/feature#Extensibility" style="overflow: visible; text-align: left;"><div xmlns="http://www.w3.org/1999/xhtml" style="display: flex; align-items: unsafe center; justify-content: unsafe center; width: 1px; height: 1px; padding-top: 9px; margin-left: 771px;"><div data-drawio-colors="color: rgb(0, 0, 0); background-color: rgb(255, 255, 255); " style="box-sizing: border-box; font-size: 0px; text-align: center;"><div style="display: inline-block; font-size: 11px; font-family: Helvetica; color: rgb(0, 0, 0); line-height: 1.2; pointer-events: all; background-color: rgb(255, 255, 255); white-space: nowrap;">docker-compose up pushgateway prometheus grafana</div></div></div></foreignObject><text x="771" y="12" fill="rgb(0, 0, 0)" font-family="Helvetica" font-size="11px" text-anchor="middle">docker-compose up pushgateway prometheus grafana</text></switch></g><rect x="340" y="107" width="160" height="60" fill="rgb(255, 255, 255)" stroke="rgb(0, 0, 0)" pointer-events="all"/><g transform="translate(-0.5 -0.5)"><switch><foreignObject pointer-events="none" width="100%" height="100%" requiredFeatures="http://www.w3.org/TR/SVG11/feature#Extensibility" style="overflow: visible; text-align: left;"><div xmlns="http://www.w3.org/1999/xhtml" style="display: flex; align-items: unsafe center; justify-content: unsafe center; width: 158px; height: 1px; padding-top: 137px; margin-left: 341px;"><div data-drawio-colors="color: rgb(0, 0, 0); " style="box-sizing: border-box; font-size: 0px; text-align: center;"><div style="display: inline-block; font-size: 12px; font-family: Helvetica; color: rgb(0, 0, 0); line-height: 1.2; pointer-events: all; white-space: normal; overflow-wrap: normal;">docker-compose.yml</div></div></div></foreignObject><text x="420" y="141" fill="rgb(0, 0, 0)" font-family="Helvetica" font-size="12px" text-anchor="middle">docker-compose.yml</text></switch></g><rect x="570" y="27" width="130" height="60" fill="rgb(255, 255, 255)" stroke="rgb(0, 0, 0)" pointer-events="all"/><g transform="translate(-0.5 -0.5)"><switch><foreignObject pointer-events="none" width="100%" height="100%" requiredFeatures="http://www.w3.org/TR/SVG11/feature#Extensibility" style="overflow: visible; text-align: left;"><div xmlns="http://www.w3.org/1999/xhtml" style="display: flex; align-items: unsafe center; justify-content: unsafe center; width: 128px; height: 1px; padding-top: 57px; margin-left: 571px;"><div data-drawio-colors="color: rgb(0, 0, 0); " style="box-sizing: border-box; font-size: 0px; text-align: center;"><div style="display: inline-block; font-size: 12px; font-family: Helvetica; color: rgb(0, 0, 0); line-height: 1.2; pointer-events: all; white-space: normal; overflow-wrap: normal;">Test Service 1<br />Dockerfile</div></div></div></foreignObject><text x="635" y="61" fill="rgb(0, 0, 0)" font-family="Helvetica" font-size="12px" text-anchor="middle">Test Service 1...</text></switch></g><rect x="570" y="107" width="130" height="60" fill="rgb(255, 255, 255)" stroke="rgb(0, 0, 0)" pointer-events="all"/><g transform="translate(-0.5 -0.5)"><switch><foreignObject pointer-events="none" width="100%" height="100%" requiredFeatures="http://www.w3.org/TR/SVG11/feature#Extensibility" style="overflow: visible; text-align: left;"><div xmlns="http://www.w3.org/1999/xhtml" style="display: flex; align-items: unsafe center; justify-content: unsafe center; width: 128px; height: 1px; padding-top: 137px; margin-left: 571px;"><div data-drawio-colors="color: rgb(0, 0, 0); " style="box-sizing: border-box; font-size: 0px; text-align: center;"><div style="display: inline-block; font-size: 12px; font-family: Helvetica; color: rgb(0, 0, 0); line-height: 1.2; pointer-events: all; white-space: normal; overflow-wrap: normal;">Test Service 2<br />Dockerfile</div></div></div></foreignObject><text x="635" y="141" fill="rgb(0, 0, 0)" font-family="Helvetica" font-size="12px" text-anchor="middle">Test Service 2...</text></switch></g><rect x="570" y="187" width="130" height="60" fill="rgb(255, 255, 255)" stroke="rgb(0, 0, 0)" pointer-events="all"/><g transform="translate(-0.5 -0.5)"><switch><foreignObject pointer-events="none" width="100%" height="100%" requiredFeatures="http://www.w3.org/TR/SVG11/feature#Extensibility" style="overflow: visible; text-align: left;"><div xmlns="http://www.w3.org/1999/xhtml" style="display: flex; align-items: unsafe center; justify-content: unsafe center; width: 128px; height: 1px; padding-top: 217px; margin-left: 571px;"><div data-drawio-colors="color: rgb(0, 0, 0); " style="box-sizing: border-box; font-size: 0px; text-align: center;"><div style="display: inline-block; font-size: 12px; font-family: Helvetica; color: rgb(0, 0, 0); line-height: 1.2; pointer-events: all; white-space: normal; overflow-wrap: normal;">Test Service 3<br />Dockerfile</div></div></div></foreignObject><text x="635" y="221" fill="rgb(0, 0, 0)" font-family="Helvetica" font-size="12px" text-anchor="middle">Test Service 3...</text></switch></g><path d="M 60 257 L 420 257 L 420 167" fill="none" stroke="rgb(0, 0, 0)" stroke-miterlimit="10" pointer-events="stroke"/><g transform="translate(-0.5 -0.5)"><switch><foreignObject pointer-events="none" width="100%" height="100%" requiredFeatures="http://www.w3.org/TR/SVG11/feature#Extensibility" style="overflow: visible; text-align: left;"><div xmlns="http://www.w3.org/1999/xhtml" style="display: flex; align-items: unsafe center; justify-content: unsafe center; width: 1px; height: 1px; padding-top: 258px; margin-left: 249px;"><div data-drawio-colors="color: rgb(0, 0, 0); background-color: rgb(255, 255, 255); " style="box-sizing: border-box; font-size: 0px; text-align: center;"><div style="display: inline-block; font-size: 11px; font-family: Helvetica; color: rgb(0, 0, 0); line-height: 1.2; pointer-events: all; background-color: rgb(255, 255, 255); white-space: nowrap;">docker-compose up pushgateway prometheus grafana</div></div></div></foreignObject><text x="249" y="261" fill="rgb(0, 0, 0)" font-family="Helvetica" font-size="11px" text-anchor="middle">docker-compose up pushgateway prometheus grafana</text></switch></g><ellipse cx="60" cy="234.5" rx="7.5" ry="7.5" fill="rgb(255, 255, 255)" stroke="rgb(0, 0, 0)" pointer-events="all"/><path d="M 60 242 L 60 267 M 60 247 L 45 247 M 60 247 L 75 247 M 60 267 L 45 287 M 60 267 L 75 287" fill="none" stroke="rgb(0, 0, 0)" stroke-miterlimit="10" pointer-events="all"/><g transform="translate(-0.5 -0.5)"><switch><foreignObject pointer-events="none" width="100%" height="100%" requiredFeatures="http://www.w3.org/TR/SVG11/feature#Extensibility" style="overflow: visible; text-align: left;"><div xmlns="http://www.w3.org/1999/xhtml" style="display: flex; align-items: unsafe flex-start; justify-content: unsafe center; width: 1px; height: 1px; padding-top: 294px; margin-left: 60px;"><div data-drawio-colors="color: rgb(0, 0, 0); " style="box-sizing: border-box; font-size: 0px; text-align: center;"><div style="display: inline-block; font-size: 12px; font-family: Helvetica; color: rgb(0, 0, 0); line-height: 1.2; pointer-events: all; white-space: nowrap;">User</div></div></div></foreignObject><text x="60" y="306" fill="rgb(0, 0, 0)" font-family="Helvetica" font-size="12px" text-anchor="middle">User</text></switch></g><path d="M 700 56.72 L 945 57.2 L 945 100.35" fill="none" stroke="rgb(0, 0, 0)" stroke-miterlimit="10" pointer-events="stroke"/><path d="M 945 105.6 L 941.5 98.6 L 945 100.35 L 948.5 98.6 Z" fill="rgb(0, 0, 0)" stroke="rgb(0, 0, 0)" stroke-miterlimit="10" pointer-events="all"/><g transform="translate(-0.5 -0.5)"><switch><foreignObject pointer-events="none" width="100%" height="100%" requiredFeatures="http://www.w3.org/TR/SVG11/feature#Extensibility" style="overflow: visible; text-align: left;"><div xmlns="http://www.w3.org/1999/xhtml" style="display: flex; align-items: unsafe center; justify-content: unsafe center; width: 1px; height: 1px; padding-top: 60px; margin-left: 817px;"><div data-drawio-colors="color: rgb(0, 0, 0); background-color: rgb(255, 255, 255); " style="box-sizing: border-box; font-size: 0px; text-align: center;"><div style="display: inline-block; font-size: 11px; font-family: Helvetica; color: rgb(0, 0, 0); line-height: 1.2; pointer-events: all; background-color: rgb(255, 255, 255); white-space: nowrap;">runs tasks and pushes metrics</div></div></div></foreignObject><text x="817" y="63" fill="rgb(0, 0, 0)" font-family="Helvetica" font-size="11px" text-anchor="middle">runs tasks and pushes metrics</text></switch></g><path d="M 700 136.72 L 790.6 137.2 L 873.63 136.83" fill="none" stroke="rgb(0, 0, 0)" stroke-miterlimit="10" pointer-events="stroke"/><path d="M 878.88 136.81 L 871.9 140.34 L 873.63 136.83 L 871.87 133.34 Z" fill="rgb(0, 0, 0)" stroke="rgb(0, 0, 0)" stroke-miterlimit="10" pointer-events="all"/><g transform="translate(-0.5 -0.5)"><switch><foreignObject pointer-events="none" width="100%" height="100%" requiredFeatures="http://www.w3.org/TR/SVG11/feature#Extensibility" style="overflow: visible; text-align: left;"><div xmlns="http://www.w3.org/1999/xhtml" style="display: flex; align-items: unsafe center; justify-content: unsafe center; width: 1px; height: 1px; padding-top: 139px; margin-left: 793px;"><div data-drawio-colors="color: rgb(0, 0, 0); background-color: rgb(255, 255, 255); " style="box-sizing: border-box; font-size: 0px; text-align: center;"><div style="display: inline-block; font-size: 11px; font-family: Helvetica; color: rgb(0, 0, 0); line-height: 1.2; pointer-events: all; background-color: rgb(255, 255, 255); white-space: nowrap;">runs tasks and pushes metrics</div></div></div></foreignObject><text x="793" y="142" fill="rgb(0, 0, 0)" font-family="Helvetica" font-size="11px" text-anchor="middle">runs tasks and pushes metrics</text></switch></g><path d="M 700 216.72 L 945 217.2 L 945 173.09" fill="none" stroke="rgb(0, 0, 0)" stroke-miterlimit="10" pointer-events="stroke"/><path d="M 945 167.84 L 948.5 174.84 L 945 173.09 L 941.5 174.84 Z" fill="rgb(0, 0, 0)" stroke="rgb(0, 0, 0)" stroke-miterlimit="10" pointer-events="all"/><g transform="translate(-0.5 -0.5)"><switch><foreignObject pointer-events="none" width="100%" height="100%" requiredFeatures="http://www.w3.org/TR/SVG11/feature#Extensibility" style="overflow: visible; text-align: left;"><div xmlns="http://www.w3.org/1999/xhtml" style="display: flex; align-items: unsafe center; justify-content: unsafe center; width: 1px; height: 1px; padding-top: 217px; margin-left: 821px;"><div data-drawio-colors="color: rgb(0, 0, 0); background-color: rgb(255, 255, 255); " style="box-sizing: border-box; font-size: 0px; text-align: center;"><div style="display: inline-block; font-size: 11px; font-family: Helvetica; color: rgb(0, 0, 0); line-height: 1.2; pointer-events: all; background-color: rgb(255, 255, 255); white-space: nowrap;">runs tasks and pushes metrics</div></div></div></foreignObject><text x="821" y="220" fill="rgb(0, 0, 0)" font-family="Helvetica" font-size="11px" text-anchor="middle">runs tasks and pushes metrics</text></switch></g><rect x="880" y="106.72" width="130" height="60" fill="rgb(255, 255, 255)" stroke="rgb(0, 0, 0)" pointer-events="all"/><g transform="translate(-0.5 -0.5)"><switch><foreignObject pointer-events="none" width="100%" height="100%" requiredFeatures="http://www.w3.org/TR/SVG11/feature#Extensibility" style="overflow: visible; text-align: left;"><div xmlns="http://www.w3.org/1999/xhtml" style="display: flex; align-items: unsafe center; justify-content: unsafe center; width: 128px; height: 1px; padding-top: 137px; margin-left: 881px;"><div data-drawio-colors="color: rgb(0, 0, 0); " style="box-sizing: border-box; font-size: 0px; text-align: center;"><div style="display: inline-block; font-size: 12px; font-family: Helvetica; color: rgb(0, 0, 0); line-height: 1.2; pointer-events: all; white-space: normal; overflow-wrap: normal;">Prometheus Pushgateway</div></div></div></foreignObject><text x="945" y="140" fill="rgb(0, 0, 0)" font-family="Helvetica" font-size="12px" text-anchor="middle">Prometheus Pushgateway</text></switch></g><path d="M 1090 136.72 L 1016.37 136.72" fill="none" stroke="rgb(0, 0, 0)" stroke-miterlimit="10" pointer-events="stroke"/><path d="M 1011.12 136.72 L 1018.12 133.22 L 1016.37 136.72 L 1018.12 140.22 Z" fill="rgb(0, 0, 0)" stroke="rgb(0, 0, 0)" stroke-miterlimit="10" pointer-events="all"/><g transform="translate(-0.5 -0.5)"><switch><foreignObject pointer-events="none" width="100%" height="100%" requiredFeatures="http://www.w3.org/TR/SVG11/feature#Extensibility" style="overflow: visible; text-align: left;"><div xmlns="http://www.w3.org/1999/xhtml" style="display: flex; align-items: unsafe center; justify-content: unsafe center; width: 1px; height: 1px; padding-top: 137px; margin-left: 1049px;"><div data-drawio-colors="color: rgb(0, 0, 0); background-color: rgb(255, 255, 255); " style="box-sizing: border-box; font-size: 0px; text-align: center;"><div style="display: inline-block; font-size: 11px; font-family: Helvetica; color: rgb(0, 0, 0); line-height: 1.2; pointer-events: all; background-color: rgb(255, 255, 255); white-space: nowrap;">scrapes</div></div></div></foreignObject><text x="1049" y="140" fill="rgb(0, 0, 0)" font-family="Helvetica" font-size="11px" text-anchor="middle">scrapes</text></switch></g><rect x="1090" y="106.72" width="130" height="60" fill="rgb(255, 255, 255)" stroke="rgb(0, 0, 0)" pointer-events="all"/><g transform="translate(-0.5 -0.5)"><switch><foreignObject pointer-events="none" width="100%" height="100%" requiredFeatures="http://www.w3.org/TR/SVG11/feature#Extensibility" style="overflow: visible; text-align: left;"><div xmlns="http://www.w3.org/1999/xhtml" style="display: flex; align-items: unsafe center; justify-content: unsafe center; width: 128px; height: 1px; padding-top: 137px; margin-left: 1091px;"><div data-drawio-colors="color: rgb(0, 0, 0); " style="box-sizing: border-box; font-size: 0px; text-align: center;"><div style="display: inline-block; font-size: 12px; font-family: Helvetica; color: rgb(0, 0, 0); line-height: 1.2; pointer-events: all; white-space: normal; overflow-wrap: normal;">Prometheus</div></div></div></foreignObject><text x="1155" y="140" fill="rgb(0, 0, 0)" font-family="Helvetica" font-size="12px" text-anchor="middle">Prometheus</text></switch></g><path d="M 1290 136.72 L 1226.37 136.72" fill="none" stroke="rgb(0, 0, 0)" stroke-miterlimit="10" pointer-events="stroke"/><path d="M 1221.12 136.72 L 1228.12 133.22 L 1226.37 136.72 L 1228.12 140.22 Z" fill="rgb(0, 0, 0)" stroke="rgb(0, 0, 0)" stroke-miterlimit="10" pointer-events="all"/><g transform="translate(-0.5 -0.5)"><switch><foreignObject pointer-events="none" width="100%" height="100%" requiredFeatures="http://www.w3.org/TR/SVG11/feature#Extensibility" style="overflow: visible; text-align: left;"><div xmlns="http://www.w3.org/1999/xhtml" style="display: flex; align-items: unsafe center; justify-content: unsafe center; width: 1px; height: 1px; padding-top: 139px; margin-left: 1255px;"><div data-drawio-colors="color: rgb(0, 0, 0); background-color: rgb(255, 255, 255); " style="box-sizing: border-box; font-size: 0px; text-align: center;"><div style="display: inline-block; font-size: 11px; font-family: Helvetica; color: rgb(0, 0, 0); line-height: 1.2; pointer-events: all; background-color: rgb(255, 255, 255); white-space: nowrap;">Queries</div></div></div></foreignObject><text x="1255" y="142" fill="rgb(0, 0, 0)" font-family="Helvetica" font-size="11px" text-anchor="middle">Queries</text></switch></g><rect x="1290" y="106.72" width="130" height="60" fill="rgb(255, 255, 255)" stroke="rgb(0, 0, 0)" pointer-events="all"/><g transform="translate(-0.5 -0.5)"><switch><foreignObject pointer-events="none" width="100%" height="100%" requiredFeatures="http://www.w3.org/TR/SVG11/feature#Extensibility" style="overflow: visible; text-align: left;"><div xmlns="http://www.w3.org/1999/xhtml" style="display: flex; align-items: unsafe center; justify-content: unsafe center; width: 128px; height: 1px; padding-top: 137px; margin-left: 1291px;"><div data-drawio-colors="color: rgb(0, 0, 0); " style="box-sizing: border-box; font-size: 0px; text-align: center;"><div style="display: inline-block; font-size: 12px; font-family: Helvetica; color: rgb(0, 0, 0); line-height: 1.2; pointer-events: all; white-space: normal; overflow-wrap: normal;">Grafana</div></div></div></foreignObject><text x="1355" y="140" fill="rgb(0, 0, 0)" font-family="Helvetica" font-size="12px" text-anchor="middle">Grafana</text></switch></g></g><switch><g requiredFeatures="http://www.w3.org/TR/SVG11/feature#Extensibility"/><a transform="translate(0,-5)" xlink:href="https://www.drawio.com/doc/faq/svg-export-text-problems" target="_blank"><text text-anchor="middle" font-size="10px" x="50%" y="100%">Text is not SVG - cannot display</text></a></switch></svg> \ No newline at end of file diff --git a/ufm-test-services/crontab.example b/ufm-test-services/crontab.example deleted file mode 100644 index 36d6b972d6b6..000000000000 --- a/ufm-test-services/crontab.example +++ /dev/null @@ -1,11 +0,0 @@ -# Needs to point to docker, otherwise you'll get the error: exec: "docker": executable file not found in $PATH -PATH=/ - -# Runs every 1 hour -0 * * * * /usr/local/bin/docker-compose -f /path/to/docker-compose.local.yml --profile 1hour up -d - -# Runs every 1 day -0 12 * * * /usr/local/bin/docker-compose -f /path/to/docker-compose.local.yml --profile 1day up -d - -# Runs every 7 day -0 12 */7 * * /usr/local/bin/docker-compose -f /path/to/docker-compose.local.yml --profile 7day up -d diff --git a/ufm-test-services/docker-compose.yml b/ufm-test-services/docker-compose.yml deleted file mode 100644 index 3139e30135fa..000000000000 --- a/ufm-test-services/docker-compose.yml +++ /dev/null @@ -1,68 +0,0 @@ -version: "3" - -services: - pushgateway: - image: prom/pushgateway - container_name: pushgateway - ports: - - "9091:9091" - restart: unless-stopped - read_only: true - security_opt: - - "no-new-privileges:true" - - prometheus: - image: prom/prometheus:latest - container_name: prometheus - ports: - - "9090:9090" - volumes: - - ./prometheus.yml:/etc/prometheus/prometheus.yml - command: - - '--config.file=/etc/prometheus/prometheus.yml' - read_only: true - security_opt: - - "no-new-privileges:true" - - grafana: - image: grafana/grafana:latest - container_name: grafana - ports: - - "3000:3000" - environment: - - GF_SECURITY_ADMIN_PASSWORD=${GRAFANA_ADMIN_PWD} - volumes: - - ./grafana/provisioning:/etc/grafana/provisioning - - ./grafana/dashboards:/var/lib/grafana/dashboards - security_opt: - - "no-new-privileges:true" - - metamask: - build: - context: ./metamask - dockerfile: Dockerfile - args: - - METAMASK_PLAYWRIGHT_RUN_HEADLESS=${METAMASK_PLAYWRIGHT_RUN_HEADLESS} - container_name: test-service-metamask - profiles: ["5minute"] - environment: - CI: ${CI} - DISPLAY: ${METAMASK_DISPLAY} - GRAFANA_ADMIN_PWD: ${GRAFANA_ADMIN_PWD} - METRICS_READ_URL: ${METRICS_READ_URL} - METRICS_READ_USERNAME: ${METRICS_READ_USERNAME} - METRICS_READ_PASSWORD: ${METRICS_READ_PASSWORD} - METRICS_WRITE_URL: ${METRICS_WRITE_URL} - METRICS_WRITE_TOOL: ${METRICS_WRITE_TOOL} - METRICS_WRITE_SOURCE: ${METRICS_WRITE_SOURCE} - METRICS_WRITE_USERNAME: ${METRICS_WRITE_USERNAME} - METRICS_WRITE_PASSWORD: ${METRICS_WRITE_PASSWORD} - METAMASK_PLAYWRIGHT_RUN_HEADLESS: ${METAMASK_PLAYWRIGHT_RUN_HEADLESS} - METAMASK_SECRET_WORDS_OR_PRIVATEKEY: ${METAMASK_SECRET_WORDS_OR_PRIVATEKEY} - METAMASK_NETWORK: ${METAMASK_NETWORK} - METAMASK_PASSWORD: ${METAMASK_PASSWORD} - METAMASK_DAPP_URL: ${METAMASK_DAPP_URL} - METAMASK_OP_SEPOLIA_RPC_URL: ${METAMASK_OP_SEPOLIA_RPC_URL} - volumes: - - ${METAMASK_DISPLAY_VOLUME:-/path/in/container/if/no/env/set} - restart: "no" diff --git a/ufm-test-services/grafana/dashboards/metamask.json b/ufm-test-services/grafana/dashboards/metamask.json deleted file mode 100644 index e2b0c37ef792..000000000000 --- a/ufm-test-services/grafana/dashboards/metamask.json +++ /dev/null @@ -1,380 +0,0 @@ -{ - "annotations": { - "list": [ - { - "builtIn": 1, - "datasource": { - "type": "grafana", - "uid": "-- Grafana --" - }, - "enable": true, - "hide": true, - "iconColor": "rgba(0, 211, 255, 1)", - "name": "Annotations & Alerts", - "type": "dashboard" - } - ] - }, - "editable": true, - "fiscalYearStartMonth": 0, - "graphTooltip": 0, - "id": 1, - "links": [], - "liveNow": false, - "panels": [ - { - "datasource": { - "type": "prometheus", - "uid": "PBFA97CFB590B2093" - }, - "fieldConfig": { - "defaults": { - "color": { - "mode": "thresholds" - }, - "custom": { - "axisCenteredZero": true, - "axisColorMode": "series", - "axisGridShow": false, - "axisLabel": "", - "axisPlacement": "auto", - "barAlignment": 0, - "drawStyle": "line", - "fillOpacity": 0, - "gradientMode": "none", - "hideFrom": { - "legend": false, - "tooltip": false, - "viz": false - }, - "insertNulls": false, - "lineInterpolation": "stepAfter", - "lineWidth": 1, - "pointSize": 5, - "scaleDistribution": { - "type": "linear" - }, - "showPoints": "never", - "spanNulls": false, - "stacking": { - "group": "A", - "mode": "none" - }, - "thresholdsStyle": { - "mode": "off" - } - }, - "decimals": 0, - "displayName": "Number of Transactions (positive number = success, negative = failures)", - "mappings": [], - "thresholds": { - "mode": "absolute", - "steps": [ - { - "color": "text", - "value": null - }, - { - "color": "red", - "value": -1 - }, - { - "color": "text", - "value": 0 - }, - { - "color": "green", - "value": 1 - } - ] - } - }, - "overrides": [] - }, - "gridPos": { - "h": 8, - "w": 24, - "x": 0, - "y": 0 - }, - "id": 1, - "options": { - "legend": { - "calcs": [ - "last" - ], - "displayMode": "list", - "placement": "bottom", - "showLegend": true - }, - "timezone": [ - "browser" - ], - "tooltip": { - "mode": "single", - "sort": "none" - } - }, - "targets": [ - { - "datasource": { - "type": "prometheus", - "uid": "PBFA97CFB590B2093" - }, - "disableTextWrap": false, - "editorMode": "builder", - "expr": "metamask_self_send_metric", - "fullMetaSearch": false, - "includeNullMetadata": true, - "instant": false, - "legendFormat": "__auto", - "range": true, - "refId": "A", - "useBackend": false - } - ], - "title": "Self Transferring on OP Goerli (positive number = success, negative = failures)", - "type": "timeseries" - }, - { - "datasource": { - "type": "prometheus", - "uid": "PBFA97CFB590B2093" - }, - "fieldConfig": { - "defaults": { - "color": { - "mode": "fixed" - }, - "custom": { - "axisCenteredZero": false, - "axisColorMode": "text", - "axisGridShow": false, - "axisLabel": "", - "axisPlacement": "auto", - "axisSoftMin": 0, - "barAlignment": 0, - "drawStyle": "line", - "fillOpacity": 0, - "gradientMode": "none", - "hideFrom": { - "legend": false, - "tooltip": false, - "viz": false - }, - "insertNulls": false, - "lineInterpolation": "stepAfter", - "lineWidth": 1, - "pointSize": 5, - "scaleDistribution": { - "type": "linear" - }, - "showPoints": "never", - "spanNulls": false, - "stacking": { - "group": "A", - "mode": "none" - }, - "thresholdsStyle": { - "mode": "off" - } - }, - "decimals": 0, - "mappings": [], - "thresholds": { - "mode": "absolute", - "steps": [ - { - "color": "text", - "value": null - } - ] - } - }, - "overrides": [ - { - "matcher": { - "id": "byName", - "options": "metamask_self_send_fee_estimation_low_metric" - }, - "properties": [ - { - "id": "displayName", - "value": "Low (Slow 🐢)" - }, - { - "id": "color", - "value": { - "fixedColor": "green", - "mode": "fixed" - } - } - ] - }, - { - "matcher": { - "id": "byName", - "options": "metamask_self_send_fee_estimation_medium_metric" - }, - "properties": [ - { - "id": "displayName", - "value": "Medium (Market 🦊)" - }, - { - "id": "color", - "value": { - "fixedColor": "orange", - "mode": "fixed" - } - } - ] - }, - { - "matcher": { - "id": "byName", - "options": "metamask_self_send_fee_estimation_high_metric" - }, - "properties": [ - { - "id": "displayName", - "value": "High (Aggressive 🦍)" - } - ] - }, - { - "matcher": { - "id": "byName", - "options": "metamask_self_send_fee_estimation_actual_metric" - }, - "properties": [ - { - "id": "displayName", - "value": "Actual transaction fee" - }, - { - "id": "color", - "value": { - "fixedColor": "blue", - "mode": "fixed" - } - } - ] - } - ] - }, - "gridPos": { - "h": 11, - "w": 24, - "x": 0, - "y": 8 - }, - "id": 2, - "options": { - "legend": { - "calcs": [ - "last" - ], - "displayMode": "table", - "placement": "bottom", - "showLegend": true - }, - "timezone": [ - "browser" - ], - "tooltip": { - "mode": "single", - "sort": "none" - } - }, - "targets": [ - { - "datasource": { - "type": "prometheus", - "uid": "PBFA97CFB590B2093" - }, - "disableTextWrap": false, - "editorMode": "builder", - "expr": "metamask_self_send_fee_estimation_low_metric", - "fullMetaSearch": false, - "includeNullMetadata": true, - "instant": false, - "legendFormat": "__auto", - "range": true, - "refId": "A", - "useBackend": false - }, - { - "datasource": { - "type": "prometheus", - "uid": "PBFA97CFB590B2093" - }, - "disableTextWrap": false, - "editorMode": "builder", - "expr": "metamask_self_send_fee_estimation_medium_metric", - "fullMetaSearch": false, - "hide": false, - "includeNullMetadata": true, - "instant": false, - "legendFormat": "__auto", - "range": true, - "refId": "B", - "useBackend": false - }, - { - "datasource": { - "type": "prometheus", - "uid": "PBFA97CFB590B2093" - }, - "disableTextWrap": false, - "editorMode": "builder", - "expr": "metamask_self_send_fee_estimation_high_metric", - "fullMetaSearch": false, - "hide": false, - "includeNullMetadata": true, - "instant": false, - "legendFormat": "__auto", - "range": true, - "refId": "C", - "useBackend": false - }, - { - "datasource": { - "type": "prometheus", - "uid": "PBFA97CFB590B2093" - }, - "disableTextWrap": false, - "editorMode": "builder", - "expr": "metamask_self_send_fee_estimation_actual_metric", - "fullMetaSearch": false, - "hide": false, - "includeNullMetadata": true, - "instant": false, - "legendFormat": "__auto", - "range": true, - "refId": "D", - "useBackend": false - } - ], - "title": "Self Transferring on OP Goerli Fee Estimates", - "type": "timeseries" - } - ], - "refresh": "5s", - "schemaVersion": 38, - "style": "dark", - "tags": [], - "templating": { - "list": [] - }, - "time": { - "from": "now-12h", - "to": "now" - }, - "timepicker": {}, - "timezone": "", - "title": "UFM: Metamask", - "uid": "f66f7076-c724-4f81-8ff9-58d6d99f2716", - "version": 1, - "weekStart": "" -} \ No newline at end of file diff --git a/ufm-test-services/grafana/provisioning/dashboards/all.yml b/ufm-test-services/grafana/provisioning/dashboards/all.yml deleted file mode 100644 index 3ce6e7c5bc69..000000000000 --- a/ufm-test-services/grafana/provisioning/dashboards/all.yml +++ /dev/null @@ -1,9 +0,0 @@ -apiVersion: 1 -providers: -- name: 'default' - orgId: 1 - folder: '' - type: file - disableDeletion: false - options: - path: /var/lib/grafana/dashboards diff --git a/ufm-test-services/grafana/provisioning/datasources/datasources.yml b/ufm-test-services/grafana/provisioning/datasources/datasources.yml deleted file mode 100644 index 86fd3465e140..000000000000 --- a/ufm-test-services/grafana/provisioning/datasources/datasources.yml +++ /dev/null @@ -1,8 +0,0 @@ -apiVersion: 1 - -datasources: - - name: Prometheus - type: prometheus - access: proxy - url: http://prometheus:9090 - isDefault: true diff --git a/ufm-test-services/metamask/.gitignore b/ufm-test-services/metamask/.gitignore deleted file mode 100644 index 240b1b0848d4..000000000000 --- a/ufm-test-services/metamask/.gitignore +++ /dev/null @@ -1,5 +0,0 @@ -node_modules/ -/test-results/ -/playwright-report/ -/playwright/.cache/ -.env diff --git a/ufm-test-services/metamask/Dockerfile b/ufm-test-services/metamask/Dockerfile deleted file mode 100644 index 58632416a992..000000000000 --- a/ufm-test-services/metamask/Dockerfile +++ /dev/null @@ -1,27 +0,0 @@ -# Using the Playwright image -FROM mcr.microsoft.com/playwright:v1.37.1-jammy - -# Setting the working directory -WORKDIR /app - -# Update PATH -ENV PATH /app/node_modules/.bin:$PATH - -RUN npm i -g pnpm - -RUN if [ "$METAMASK_PLAYWRIGHT_RUN_HEADLESS" != "false" ]; then \ - apt-get update && \ - apt-get install -y xvfb && \ - rm -rf /var/lib/apt/lists/* ; \ - fi - -# Copy necessary files and directories -COPY package.json pnpm-lock.yaml pnpm-workspace.yaml /app/ -RUN pnpm install --frozen-lockfile --ignore-scripts -COPY tests /app/tests/ -COPY playwright.config.ts /app/ -COPY start.sh /app/ -COPY tsconfig.json /app/ - -# Start the script -CMD /bin/bash /app/start.sh diff --git a/ufm-test-services/metamask/LICENSE b/ufm-test-services/metamask/LICENSE deleted file mode 100644 index b7328e483ff7..000000000000 --- a/ufm-test-services/metamask/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/ufm-test-services/metamask/README.md b/ufm-test-services/metamask/README.md deleted file mode 100644 index f65bab1f3103..000000000000 --- a/ufm-test-services/metamask/README.md +++ /dev/null @@ -1,30 +0,0 @@ -# User Facing Monitoring - Metamask Tests - -## Running Locally - -### Building Docker Image - -```bash -docker build -t ufm-test-service-metamask . -``` - -### Running the Docker Container on MacOS - -The following steps were taken from [here](https://www.oddbird.net/2022/11/30/headed-playwright-in-docker/#macos) - -Apple’s operating system doesn’t include a built-in XServer, but we can use [XQuartz](https://www.xquartz.org/) to provide one: - -1. Install XQuartz: `brew install --cask xquartz`` -2. Open XQuartz, go to `Preferences -> Security`, and check `Allow connections from network clients` -3. Restart your computer (restarting XQuartz might not be enough) -4. Start XQuartz by executing `xhost +localhost` in your terminal -5. Open Docker Desktop and edit settings to give access to `/tmp/.X11-unix` in `Preferences -> Resources -> File sharing` - -Once XQuartz is running with the right permissions, you can populate the environment variable and socket Docker args (these envs are defaulted to the below values in `ufm-test-services/.env.example`): - -```bash -docker run --rm -it \ --e DISPLAY=host.docker.internal:0 \ --v /tmp/.X11-unix:/tmp/.X11-unix \ -ufm-test-service-metamask -``` diff --git a/ufm-test-services/metamask/github_workflow.example.yaml b/ufm-test-services/metamask/github_workflow.example.yaml deleted file mode 100644 index d7ee59370833..000000000000 --- a/ufm-test-services/metamask/github_workflow.example.yaml +++ /dev/null @@ -1,32 +0,0 @@ -name: 'UFM Test Service: 1 hour' - -on: - schedule: - # Run every hour - - cron: '0 * * * *' - -jobs: - ufm_test_service_metamask: - name: 'UFM Test Service: Metamask' - runs-on: ubuntu-latest - steps: - - name: Checkout - uses: actions/checkout@v4 - - - name: Run Docker Compose - run: docker-compose run metamask - env: - CI: ${{ secrets.CI }} - METRICS_READ_URL: ${{ secrets.METRICS_READ_URL }} - METRICS_READ_USERNAME: ${{ secrets.METRICS_READ_USERNAME }} - METRICS_READ_PASSWORD: ${{ secrets.METRICS_READ_PASSWORD }} - METRICS_WRITE_URL: ${{ secrets.METRICS_WRITE_URL }} - METRICS_WRITE_TOOL: ${{ secrets.METRICS_WRITE_TOOL }} - METRICS_WRITE_SOURCE: ${{ secrets.METRICS_WRITE_SOURCE }} - METRICS_WRITE_USERNAME: ${{ secrets.METRICS_WRITE_USERNAME }} - METRICS_WRITE_PASSWORD: ${{ secrets.METRICS_WRITE_PASSWORD }} - METAMASK_SECRET_WORDS_OR_PRIVATEKEY: ${{ secrets.METAMASK_SECRET_WORDS_OR_PRIVATEKEY }} - METAMASK_NETWORK: ${{ secrets.METAMASK_NETWORK || 'sepolia' }} - METAMASK_PASSWORD: ${{ secrets.METAMASK_PASSWORD || 'T3st_P@ssw0rd!' }} - METAMASK_DAPP_URL: ${{ secrets.METAMASK_DAPP_URL || 'http://localhost:9011' }} - METAMASK_OP_SEPOLIA_RPC_URL: ${{ secrets.METAMASK_OP_SEPOLIA_RPC_URL }} diff --git a/ufm-test-services/metamask/package.json b/ufm-test-services/metamask/package.json deleted file mode 100644 index 4e4c6a5a5ecd..000000000000 --- a/ufm-test-services/metamask/package.json +++ /dev/null @@ -1,40 +0,0 @@ -{ - "name": "@eth-optimism/ufm-test-service-metamask", - "version": "0.1.0", - "description": "A User facing monitoring Test Service for MetaMask", - "license": "MIT", - "repository": { - "type": "git", - "url": "https://github.com/ethereum-optimism/optimism.git", - "directory": "ufm-test-services/metamask" - }, - "homepage": "https://optimism.io", - "type": "module", - "scripts": { - "clean": "rm -rf node_modules packages/*/node_modules && echo 'Finished cleaning'", - "lint": "prettier --check .", - "lint:fix": "prettier --write .", - "start:metamask-dapp": "npx serve -l 9011 node_modules/@metamask/test-dapp/dist", - "test": "npx playwright test" - }, - "devDependencies": { - "@metamask/test-dapp": "^8.1.0", - "@playwright/test": "1.40.1", - "@synthetixio/synpress": "3.7.2-beta.9", - "dotenv": "^16.3.1", - "serve": "^14.2.1", - "typescript": "^5.3.3", - "viem": "^1.20.0" - }, - "dependencies": { - "prom-client": "^15.0.0", - "zod": "^3.22.4" - }, - "pnpm": { - "overrides": { - "@cypress/request": "^3.0.1", - "axios": "^1.6.2", - "got": "^11.8.6" - } - } -} diff --git a/ufm-test-services/metamask/playwright.config.ts b/ufm-test-services/metamask/playwright.config.ts deleted file mode 100644 index aa15f9428662..000000000000 --- a/ufm-test-services/metamask/playwright.config.ts +++ /dev/null @@ -1,45 +0,0 @@ -import { defineConfig, devices } from '@playwright/test'; - -/** - * Read environment variables from file. - * https://github.com/motdotla/dotenv - */ -import 'dotenv/config' - -/** - * See https://playwright.dev/docs/test-configuration. - */ -export default defineConfig({ - testDir: './tests', - /* Run tests in files in parallel */ - fullyParallel: true, - /* Fail the build on CI if you accidentally left test.only in the source code. */ - forbidOnly: !!process.env.CI, - /* Opt out of parallel tests on CI. */ - workers: process.env.CI ? 1 : undefined, - /* Reporter to use. See https://playwright.dev/docs/test-reporters */ - reporter: 'html', - /* Shared settings for all the projects below. See https://playwright.dev/docs/api/class-testoptions. */ - use: { - /* Base URL to use in actions like `await page.goto('/')`. */ - // baseURL: 'http://127.0.0.1:3000', - - /* Collect trace when retrying the failed test. See https://playwright.dev/docs/trace-viewer */ - trace: 'on-first-retry', - }, - - /* Configure projects for major browsers */ - projects: [ - { - name: 'chromium', - use: { ...devices['Desktop Chrome'] }, - }, - ], - - /* Run your local dev server before starting the tests */ - webServer: { - command: 'npm run start:metamask-dapp', - url: process.env.METAMASK_DAPP_URL, - reuseExistingServer: false, - }, -}); diff --git a/ufm-test-services/metamask/pnpm-lock.yaml b/ufm-test-services/metamask/pnpm-lock.yaml deleted file mode 100644 index 2a7105f9ca7c..000000000000 --- a/ufm-test-services/metamask/pnpm-lock.yaml +++ /dev/null @@ -1,7548 +0,0 @@ -lockfileVersion: '6.0' - -settings: - autoInstallPeers: true - excludeLinksFromLockfile: false - -overrides: - '@cypress/request': ^3.0.1 - axios: ^1.6.2 - got: ^11.8.6 - -importers: - - .: - dependencies: - prom-client: - specifier: ^15.0.0 - version: 15.0.0 - zod: - specifier: ^3.22.4 - version: 3.22.4 - devDependencies: - '@metamask/test-dapp': - specifier: ^8.1.0 - version: 8.1.0 - '@playwright/test': - specifier: 1.40.1 - version: 1.40.1 - '@synthetixio/synpress': - specifier: 3.7.2-beta.9 - version: 3.7.2-beta.9(@babel/core@7.23.6)(@babel/preset-env@7.23.6)(babel-loader@9.1.3)(react-dom@18.2.0)(react@18.2.0)(typescript@5.3.3)(webpack@5.89.0)(zod@3.22.4) - dotenv: - specifier: ^16.3.1 - version: 16.3.1 - serve: - specifier: ^14.2.1 - version: 14.2.1 - typescript: - specifier: ^5.3.3 - version: 5.3.3 - viem: - specifier: ^1.20.0 - version: 1.20.0(typescript@5.3.3)(zod@3.22.4) - -packages: - - /@adraffy/ens-normalize@1.10.0: - resolution: {integrity: sha512-nA9XHtlAkYfJxY7bce8DcN7eKxWWCWkU+1GR9d+U6MbNpfwQp8TI7vqOsBsMcHoT4mBu2kypKoSKnghEzOOq5Q==} - dev: true - - /@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.20 - dev: true - - /@babel/code-frame@7.23.5: - resolution: {integrity: sha512-CgH3s1a96LipHCmSUmYFPwY7MNx8C3avkq7i4Wl3cfa662ldtUe4VM1TPXX70pfmrlWTb6jLqTYrZyT2ZTJBgA==} - engines: {node: '>=6.9.0'} - dependencies: - '@babel/highlight': 7.23.4 - chalk: 2.4.2 - dev: true - - /@babel/compat-data@7.23.5: - resolution: {integrity: sha512-uU27kfDRlhfKl+w1U6vp16IuvSLtjAxdArVXPa9BvLkrr7CYIsxH5adpHObeAGY/41+syctUWOZ140a2Rvkgjw==} - engines: {node: '>=6.9.0'} - dev: true - - /@babel/core@7.23.6: - resolution: {integrity: sha512-FxpRyGjrMJXh7X3wGLGhNDCRiwpWEF74sKjTLDJSG5Kyvow3QZaG0Adbqzi9ZrVjTWpsX+2cxWXD71NMg93kdw==} - engines: {node: '>=6.9.0'} - dependencies: - '@ampproject/remapping': 2.2.1 - '@babel/code-frame': 7.23.5 - '@babel/generator': 7.23.6 - '@babel/helper-compilation-targets': 7.23.6 - '@babel/helper-module-transforms': 7.23.3(@babel/core@7.23.6) - '@babel/helpers': 7.23.6 - '@babel/parser': 7.23.6 - '@babel/template': 7.22.15 - '@babel/traverse': 7.23.6 - '@babel/types': 7.23.6 - convert-source-map: 2.0.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/generator@7.23.6: - resolution: {integrity: sha512-qrSfCYxYQB5owCmGLbl8XRpX1ytXlpueOb0N0UmQwA073KZxejgQTzAmJezxvpwQD9uGtK2shHdi55QT+MbjIw==} - engines: {node: '>=6.9.0'} - dependencies: - '@babel/types': 7.23.6 - '@jridgewell/gen-mapping': 0.3.3 - '@jridgewell/trace-mapping': 0.3.20 - 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: - 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.6(@babel/core@7.23.6): - resolution: {integrity: sha512-cBXU1vZni/CpGF29iTu4YRbOZt3Wat6zCoMDxRF1MayiEc4URxOj31tT65HUM0CRpMowA3HCJaAOVOUnMf96cw==} - engines: {node: '>=6.9.0'} - peerDependencies: - '@babel/core': ^7.0.0 - dependencies: - '@babel/core': 7.23.6 - '@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.23.6) - '@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.23.6): - resolution: {integrity: sha512-29FkPLFjn4TPEa3RE7GpW+qbE8tlsu3jntNYNfcGsc49LphF1PQIiD+vMZ1z1xVOKt+93khA9tc2JBs3kBjA7w==} - engines: {node: '>=6.9.0'} - peerDependencies: - '@babel/core': ^7.0.0 - dependencies: - '@babel/core': 7.23.6 - '@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.23.6): - 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.23.6 - '@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.8 - transitivePeerDependencies: - - supports-color - dev: true - - /@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: - 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: - 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: - 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.23.6): - resolution: {integrity: sha512-7bBs4ED9OmswdfDzpz4MpWgSrV7FXlc3zIagvLFjS5H+Mk7Snr21vQ6QwrsoCGMfNC4e4LQPdoULEt4ykz0SRQ==} - engines: {node: '>=6.9.0'} - peerDependencies: - '@babel/core': ^7.0.0 - dependencies: - '@babel/core': 7.23.6 - '@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.23.6): - resolution: {integrity: sha512-pBGyV4uBqOns+0UvhsTO8qgl8hO89PmiDYv+/COyp1aeMcmfrfruz+/nCMFiYyFF/Knn0yfrC85ZzNFjembFTw==} - engines: {node: '>=6.9.0'} - peerDependencies: - '@babel/core': ^7.0.0 - dependencies: - '@babel/core': 7.23.6 - '@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.23.6): - resolution: {integrity: sha512-qsW0In3dbwQUbK8kejJ4R7IHVGwHJlV6lpG6UA7a9hSa2YEiAib+N1T2kr6PEeUT+Fl7najmSOS6SmAwCHK6Tw==} - engines: {node: '>=6.9.0'} - peerDependencies: - '@babel/core': ^7.0.0 - dependencies: - '@babel/core': 7.23.6 - '@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: - 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: - 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: - resolution: {integrity: sha512-803gmbQdqwdf4olxrX4AJyFBV/RTr3rSmOj0rKwesmzlfhYNDEs+/iOcznzpNWlJlIlTJC2QfPFcHB6DlzdVLQ==} - engines: {node: '>=6.9.0'} - dev: true - - /@babel/helper-validator-identifier@7.22.20: - resolution: {integrity: sha512-Y4OZ+ytlatR8AI+8KZfKuL5urKp7qey08ha31L8b3BwewJAoJamTzyvxPR/5D+KkdJCGPq/+8TukHBlY10FX9A==} - engines: {node: '>=6.9.0'} - dev: true - - /@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.23.6: - resolution: {integrity: sha512-wCfsbN4nBidDRhpDhvcKlzHWCTlgJYUUdSJfzXb2NuBssDSIjc3xcb+znA7l+zYsFljAcGM0aFkN40cR3lXiGA==} - engines: {node: '>=6.9.0'} - dependencies: - '@babel/template': 7.22.15 - '@babel/traverse': 7.23.6 - '@babel/types': 7.23.6 - transitivePeerDependencies: - - supports-color - dev: true - - /@babel/highlight@7.23.4: - resolution: {integrity: sha512-acGdbYSfp2WheJoJm/EBBBLh/ID8KDc64ISZ9DYtBmC8/Q204PZJLHyzeB5qMzJ5trcOkybd78M4x2KWsUq++A==} - engines: {node: '>=6.9.0'} - dependencies: - '@babel/helper-validator-identifier': 7.22.20 - chalk: 2.4.2 - js-tokens: 4.0.0 - dev: true - - /@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.23.6): - resolution: {integrity: sha512-iRkKcCqb7iGnq9+3G6rZ+Ciz5VywC4XNRHe57lKM+jOeYAoR0lVqdeeDRfh0tQcTfw/+vBhHn926FmQhLtlFLQ==} - engines: {node: '>=6.9.0'} - peerDependencies: - '@babel/core': ^7.0.0 - dependencies: - '@babel/core': 7.23.6 - '@babel/helper-plugin-utils': 7.22.5 - dev: true - - /@babel/plugin-bugfix-v8-spread-parameters-in-optional-chaining@7.23.3(@babel/core@7.23.6): - resolution: {integrity: sha512-WwlxbfMNdVEpQjZmK5mhm7oSwD3dS6eU+Iwsi4Knl9wAletWem7kaRsGOG+8UEbRyqxY4SS5zvtfXwX+jMxUwQ==} - engines: {node: '>=6.9.0'} - peerDependencies: - '@babel/core': ^7.13.0 - dependencies: - '@babel/core': 7.23.6 - '@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.23.6) - dev: true - - /@babel/plugin-bugfix-v8-static-class-fields-redefine-readonly@7.23.3(@babel/core@7.23.6): - resolution: {integrity: sha512-XaJak1qcityzrX0/IU5nKHb34VaibwP3saKqG6a/tppelgllOH13LUann4ZCIBcVOeE6H18K4Vx9QKkVww3z/w==} - engines: {node: '>=6.9.0'} - peerDependencies: - '@babel/core': ^7.0.0 - dependencies: - '@babel/core': 7.23.6 - '@babel/helper-environment-visitor': 7.22.20 - '@babel/helper-plugin-utils': 7.22.5 - dev: true - - /@babel/plugin-proposal-private-property-in-object@7.21.0-placeholder-for-preset-env.2(@babel/core@7.23.6): - resolution: {integrity: sha512-SOSkfJDddaM7mak6cPEpswyTRnuRltl429hMraQEglW+OkovnCzsiszTmsrlY//qLFjCpQDFRvjdm2wA5pPm9w==} - engines: {node: '>=6.9.0'} - peerDependencies: - '@babel/core': ^7.0.0-0 - dependencies: - '@babel/core': 7.23.6 - dev: true - - /@babel/plugin-syntax-async-generators@7.8.4(@babel/core@7.23.6): - resolution: {integrity: sha512-tycmZxkGfZaxhMRbXlPXuVFpdWlXpir2W4AMhSJgRKzk/eDlIXOhb2LHWoLpDF7TEHylV5zNhykX6KAgHJmTNw==} - peerDependencies: - '@babel/core': ^7.0.0-0 - dependencies: - '@babel/core': 7.23.6 - '@babel/helper-plugin-utils': 7.22.5 - dev: true - - /@babel/plugin-syntax-class-properties@7.12.13(@babel/core@7.23.6): - resolution: {integrity: sha512-fm4idjKla0YahUNgFNLCB0qySdsoPiZP3iQE3rky0mBUtMZ23yDJ9SJdg6dXTSDnulOVqiF3Hgr9nbXvXTQZYA==} - peerDependencies: - '@babel/core': ^7.0.0-0 - dependencies: - '@babel/core': 7.23.6 - '@babel/helper-plugin-utils': 7.22.5 - dev: true - - /@babel/plugin-syntax-class-static-block@7.14.5(@babel/core@7.23.6): - resolution: {integrity: sha512-b+YyPmr6ldyNnM6sqYeMWE+bgJcJpO6yS4QD7ymxgH34GBPNDM/THBh8iunyvKIZztiwLH4CJZ0RxTk9emgpjw==} - engines: {node: '>=6.9.0'} - peerDependencies: - '@babel/core': ^7.0.0-0 - dependencies: - '@babel/core': 7.23.6 - '@babel/helper-plugin-utils': 7.22.5 - dev: true - - /@babel/plugin-syntax-dynamic-import@7.8.3(@babel/core@7.23.6): - resolution: {integrity: sha512-5gdGbFon+PszYzqs83S3E5mpi7/y/8M9eC90MRTZfduQOYW76ig6SOSPNe41IG5LoP3FGBn2N0RjVDSQiS94kQ==} - peerDependencies: - '@babel/core': ^7.0.0-0 - dependencies: - '@babel/core': 7.23.6 - '@babel/helper-plugin-utils': 7.22.5 - dev: true - - /@babel/plugin-syntax-export-namespace-from@7.8.3(@babel/core@7.23.6): - resolution: {integrity: sha512-MXf5laXo6c1IbEbegDmzGPwGNTsHZmEy6QGznu5Sh2UCWvueywb2ee+CCE4zQiZstxU9BMoQO9i6zUFSY0Kj0Q==} - peerDependencies: - '@babel/core': ^7.0.0-0 - dependencies: - '@babel/core': 7.23.6 - '@babel/helper-plugin-utils': 7.22.5 - dev: true - - /@babel/plugin-syntax-import-assertions@7.23.3(@babel/core@7.23.6): - resolution: {integrity: sha512-lPgDSU+SJLK3xmFDTV2ZRQAiM7UuUjGidwBywFavObCiZc1BeAAcMtHJKUya92hPHO+at63JJPLygilZard8jw==} - engines: {node: '>=6.9.0'} - peerDependencies: - '@babel/core': ^7.0.0-0 - dependencies: - '@babel/core': 7.23.6 - '@babel/helper-plugin-utils': 7.22.5 - dev: true - - /@babel/plugin-syntax-import-attributes@7.23.3(@babel/core@7.23.6): - resolution: {integrity: sha512-pawnE0P9g10xgoP7yKr6CK63K2FMsTE+FZidZO/1PwRdzmAPVs+HS1mAURUsgaoxammTJvULUdIkEK0gOcU2tA==} - engines: {node: '>=6.9.0'} - peerDependencies: - '@babel/core': ^7.0.0-0 - dependencies: - '@babel/core': 7.23.6 - '@babel/helper-plugin-utils': 7.22.5 - dev: true - - /@babel/plugin-syntax-import-meta@7.10.4(@babel/core@7.23.6): - resolution: {integrity: sha512-Yqfm+XDx0+Prh3VSeEQCPU81yC+JWZ2pDPFSS4ZdpfZhp4MkFMaDC1UqseovEKwSUpnIL7+vK+Clp7bfh0iD7g==} - peerDependencies: - '@babel/core': ^7.0.0-0 - dependencies: - '@babel/core': 7.23.6 - '@babel/helper-plugin-utils': 7.22.5 - dev: true - - /@babel/plugin-syntax-json-strings@7.8.3(@babel/core@7.23.6): - resolution: {integrity: sha512-lY6kdGpWHvjoe2vk4WrAapEuBR69EMxZl+RoGRhrFGNYVK8mOPAW8VfbT/ZgrFbXlDNiiaxQnAtgVCZ6jv30EA==} - peerDependencies: - '@babel/core': ^7.0.0-0 - dependencies: - '@babel/core': 7.23.6 - '@babel/helper-plugin-utils': 7.22.5 - dev: true - - /@babel/plugin-syntax-logical-assignment-operators@7.10.4(@babel/core@7.23.6): - resolution: {integrity: sha512-d8waShlpFDinQ5MtvGU9xDAOzKH47+FFoney2baFIoMr952hKOLp1HR7VszoZvOsV/4+RRszNY7D17ba0te0ig==} - peerDependencies: - '@babel/core': ^7.0.0-0 - dependencies: - '@babel/core': 7.23.6 - '@babel/helper-plugin-utils': 7.22.5 - dev: true - - /@babel/plugin-syntax-nullish-coalescing-operator@7.8.3(@babel/core@7.23.6): - resolution: {integrity: sha512-aSff4zPII1u2QD7y+F8oDsz19ew4IGEJg9SVW+bqwpwtfFleiQDMdzA/R+UlWDzfnHFCxxleFT0PMIrR36XLNQ==} - peerDependencies: - '@babel/core': ^7.0.0-0 - dependencies: - '@babel/core': 7.23.6 - '@babel/helper-plugin-utils': 7.22.5 - dev: true - - /@babel/plugin-syntax-numeric-separator@7.10.4(@babel/core@7.23.6): - resolution: {integrity: sha512-9H6YdfkcK/uOnY/K7/aA2xpzaAgkQn37yzWUMRK7OaPOqOpGS1+n0H5hxT9AUw9EsSjPW8SVyMJwYRtWs3X3ug==} - peerDependencies: - '@babel/core': ^7.0.0-0 - dependencies: - '@babel/core': 7.23.6 - '@babel/helper-plugin-utils': 7.22.5 - dev: true - - /@babel/plugin-syntax-object-rest-spread@7.8.3(@babel/core@7.23.6): - resolution: {integrity: sha512-XoqMijGZb9y3y2XskN+P1wUGiVwWZ5JmoDRwx5+3GmEplNyVM2s2Dg8ILFQm8rWM48orGy5YpI5Bl8U1y7ydlA==} - peerDependencies: - '@babel/core': ^7.0.0-0 - dependencies: - '@babel/core': 7.23.6 - '@babel/helper-plugin-utils': 7.22.5 - dev: true - - /@babel/plugin-syntax-optional-catch-binding@7.8.3(@babel/core@7.23.6): - resolution: {integrity: sha512-6VPD0Pc1lpTqw0aKoeRTMiB+kWhAoT24PA+ksWSBrFtl5SIRVpZlwN3NNPQjehA2E/91FV3RjLWoVTglWcSV3Q==} - peerDependencies: - '@babel/core': ^7.0.0-0 - dependencies: - '@babel/core': 7.23.6 - '@babel/helper-plugin-utils': 7.22.5 - dev: true - - /@babel/plugin-syntax-optional-chaining@7.8.3(@babel/core@7.23.6): - resolution: {integrity: sha512-KoK9ErH1MBlCPxV0VANkXW2/dw4vlbGDrFgz8bmUsBGYkFRcbRwMh6cIJubdPrkxRwuGdtCk0v/wPTKbQgBjkg==} - peerDependencies: - '@babel/core': ^7.0.0-0 - dependencies: - '@babel/core': 7.23.6 - '@babel/helper-plugin-utils': 7.22.5 - dev: true - - /@babel/plugin-syntax-private-property-in-object@7.14.5(@babel/core@7.23.6): - resolution: {integrity: sha512-0wVnp9dxJ72ZUJDV27ZfbSj6iHLoytYZmh3rFcxNnvsJF3ktkzLDZPy/mA17HGsaQT3/DQsWYX1f1QGWkCoVUg==} - engines: {node: '>=6.9.0'} - peerDependencies: - '@babel/core': ^7.0.0-0 - dependencies: - '@babel/core': 7.23.6 - '@babel/helper-plugin-utils': 7.22.5 - dev: true - - /@babel/plugin-syntax-top-level-await@7.14.5(@babel/core@7.23.6): - resolution: {integrity: sha512-hx++upLv5U1rgYfwe1xBQUhRmU41NEvpUvrp8jkrSCdvGSnM5/qdRMtylJ6PG5OFkBaHkbTAKTnd3/YyESRHFw==} - engines: {node: '>=6.9.0'} - peerDependencies: - '@babel/core': ^7.0.0-0 - dependencies: - '@babel/core': 7.23.6 - '@babel/helper-plugin-utils': 7.22.5 - dev: true - - /@babel/plugin-syntax-unicode-sets-regex@7.18.6(@babel/core@7.23.6): - resolution: {integrity: sha512-727YkEAPwSIQTv5im8QHz3upqp92JTWhidIC81Tdx4VJYIte/VndKf1qKrfnnhPLiPghStWfvC/iFaMCQu7Nqg==} - engines: {node: '>=6.9.0'} - peerDependencies: - '@babel/core': ^7.0.0 - dependencies: - '@babel/core': 7.23.6 - '@babel/helper-create-regexp-features-plugin': 7.22.15(@babel/core@7.23.6) - '@babel/helper-plugin-utils': 7.22.5 - dev: true - - /@babel/plugin-transform-arrow-functions@7.23.3(@babel/core@7.23.6): - resolution: {integrity: sha512-NzQcQrzaQPkaEwoTm4Mhyl8jI1huEL/WWIEvudjTCMJ9aBZNpsJbMASx7EQECtQQPS/DcnFpo0FIh3LvEO9cxQ==} - engines: {node: '>=6.9.0'} - peerDependencies: - '@babel/core': ^7.0.0-0 - dependencies: - '@babel/core': 7.23.6 - '@babel/helper-plugin-utils': 7.22.5 - dev: true - - /@babel/plugin-transform-async-generator-functions@7.23.4(@babel/core@7.23.6): - resolution: {integrity: sha512-efdkfPhHYTtn0G6n2ddrESE91fgXxjlqLsnUtPWnJs4a4mZIbUaK7ffqKIIUKXSHwcDvaCVX6GXkaJJFqtX7jw==} - engines: {node: '>=6.9.0'} - peerDependencies: - '@babel/core': ^7.0.0-0 - dependencies: - '@babel/core': 7.23.6 - '@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.23.6) - '@babel/plugin-syntax-async-generators': 7.8.4(@babel/core@7.23.6) - dev: true - - /@babel/plugin-transform-async-to-generator@7.23.3(@babel/core@7.23.6): - 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.23.6 - '@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.23.6) - dev: true - - /@babel/plugin-transform-block-scoped-functions@7.23.3(@babel/core@7.23.6): - resolution: {integrity: sha512-vI+0sIaPIO6CNuM9Kk5VmXcMVRiOpDh7w2zZt9GXzmE/9KD70CUEVhvPR/etAeNK/FAEkhxQtXOzVF3EuRL41A==} - engines: {node: '>=6.9.0'} - peerDependencies: - '@babel/core': ^7.0.0-0 - dependencies: - '@babel/core': 7.23.6 - '@babel/helper-plugin-utils': 7.22.5 - dev: true - - /@babel/plugin-transform-block-scoping@7.23.4(@babel/core@7.23.6): - resolution: {integrity: sha512-0QqbP6B6HOh7/8iNR4CQU2Th/bbRtBp4KS9vcaZd1fZ0wSh5Fyssg0UCIHwxh+ka+pNDREbVLQnHCMHKZfPwfw==} - engines: {node: '>=6.9.0'} - peerDependencies: - '@babel/core': ^7.0.0-0 - dependencies: - '@babel/core': 7.23.6 - '@babel/helper-plugin-utils': 7.22.5 - dev: true - - /@babel/plugin-transform-class-properties@7.23.3(@babel/core@7.23.6): - 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.23.6 - '@babel/helper-create-class-features-plugin': 7.23.6(@babel/core@7.23.6) - '@babel/helper-plugin-utils': 7.22.5 - dev: true - - /@babel/plugin-transform-class-static-block@7.23.4(@babel/core@7.23.6): - resolution: {integrity: sha512-nsWu/1M+ggti1SOALj3hfx5FXzAY06fwPJsUZD4/A5e1bWi46VUIWtD+kOX6/IdhXGsXBWllLFDSnqSCdUNydQ==} - engines: {node: '>=6.9.0'} - peerDependencies: - '@babel/core': ^7.12.0 - dependencies: - '@babel/core': 7.23.6 - '@babel/helper-create-class-features-plugin': 7.23.6(@babel/core@7.23.6) - '@babel/helper-plugin-utils': 7.22.5 - '@babel/plugin-syntax-class-static-block': 7.14.5(@babel/core@7.23.6) - dev: true - - /@babel/plugin-transform-classes@7.23.5(@babel/core@7.23.6): - resolution: {integrity: sha512-jvOTR4nicqYC9yzOHIhXG5emiFEOpappSJAl73SDSEDcybD+Puuze8Tnpb9p9qEyYup24tq891gkaygIFvWDqg==} - engines: {node: '>=6.9.0'} - peerDependencies: - '@babel/core': ^7.0.0-0 - dependencies: - '@babel/core': 7.23.6 - '@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.23.6) - '@babel/helper-split-export-declaration': 7.22.6 - globals: 11.12.0 - dev: true - - /@babel/plugin-transform-computed-properties@7.23.3(@babel/core@7.23.6): - resolution: {integrity: sha512-dTj83UVTLw/+nbiHqQSFdwO9CbTtwq1DsDqm3CUEtDrZNET5rT5E6bIdTlOftDTDLMYxvxHNEYO4B9SLl8SLZw==} - engines: {node: '>=6.9.0'} - peerDependencies: - '@babel/core': ^7.0.0-0 - dependencies: - '@babel/core': 7.23.6 - '@babel/helper-plugin-utils': 7.22.5 - '@babel/template': 7.22.15 - dev: true - - /@babel/plugin-transform-destructuring@7.23.3(@babel/core@7.23.6): - resolution: {integrity: sha512-n225npDqjDIr967cMScVKHXJs7rout1q+tt50inyBCPkyZ8KxeI6d+GIbSBTT/w/9WdlWDOej3V9HE5Lgk57gw==} - engines: {node: '>=6.9.0'} - peerDependencies: - '@babel/core': ^7.0.0-0 - dependencies: - '@babel/core': 7.23.6 - '@babel/helper-plugin-utils': 7.22.5 - dev: true - - /@babel/plugin-transform-dotall-regex@7.23.3(@babel/core@7.23.6): - 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.23.6 - '@babel/helper-create-regexp-features-plugin': 7.22.15(@babel/core@7.23.6) - '@babel/helper-plugin-utils': 7.22.5 - dev: true - - /@babel/plugin-transform-duplicate-keys@7.23.3(@babel/core@7.23.6): - 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.23.6 - '@babel/helper-plugin-utils': 7.22.5 - dev: true - - /@babel/plugin-transform-dynamic-import@7.23.4(@babel/core@7.23.6): - resolution: {integrity: sha512-V6jIbLhdJK86MaLh4Jpghi8ho5fGzt3imHOBu/x0jlBaPYqDoWz4RDXjmMOfnh+JWNaQleEAByZLV0QzBT4YQQ==} - engines: {node: '>=6.9.0'} - peerDependencies: - '@babel/core': ^7.0.0-0 - dependencies: - '@babel/core': 7.23.6 - '@babel/helper-plugin-utils': 7.22.5 - '@babel/plugin-syntax-dynamic-import': 7.8.3(@babel/core@7.23.6) - dev: true - - /@babel/plugin-transform-exponentiation-operator@7.23.3(@babel/core@7.23.6): - resolution: {integrity: sha512-5fhCsl1odX96u7ILKHBj4/Y8vipoqwsJMh4csSA8qFfxrZDEA4Ssku2DyNvMJSmZNOEBT750LfFPbtrnTP90BQ==} - engines: {node: '>=6.9.0'} - peerDependencies: - '@babel/core': ^7.0.0-0 - dependencies: - '@babel/core': 7.23.6 - '@babel/helper-builder-binary-assignment-operator-visitor': 7.22.15 - '@babel/helper-plugin-utils': 7.22.5 - dev: true - - /@babel/plugin-transform-export-namespace-from@7.23.4(@babel/core@7.23.6): - 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.23.6 - '@babel/helper-plugin-utils': 7.22.5 - '@babel/plugin-syntax-export-namespace-from': 7.8.3(@babel/core@7.23.6) - dev: true - - /@babel/plugin-transform-for-of@7.23.6(@babel/core@7.23.6): - resolution: {integrity: sha512-aYH4ytZ0qSuBbpfhuofbg/e96oQ7U2w1Aw/UQmKT+1l39uEhUPoFS3fHevDc1G0OvewyDudfMKY1OulczHzWIw==} - engines: {node: '>=6.9.0'} - peerDependencies: - '@babel/core': ^7.0.0-0 - dependencies: - '@babel/core': 7.23.6 - '@babel/helper-plugin-utils': 7.22.5 - '@babel/helper-skip-transparent-expression-wrappers': 7.22.5 - dev: true - - /@babel/plugin-transform-function-name@7.23.3(@babel/core@7.23.6): - resolution: {integrity: sha512-I1QXp1LxIvt8yLaib49dRW5Okt7Q4oaxao6tFVKS/anCdEOMtYwWVKoiOA1p34GOWIZjUK0E+zCp7+l1pfQyiw==} - engines: {node: '>=6.9.0'} - peerDependencies: - '@babel/core': ^7.0.0-0 - dependencies: - '@babel/core': 7.23.6 - '@babel/helper-compilation-targets': 7.23.6 - '@babel/helper-function-name': 7.23.0 - '@babel/helper-plugin-utils': 7.22.5 - dev: true - - /@babel/plugin-transform-json-strings@7.23.4(@babel/core@7.23.6): - resolution: {integrity: sha512-81nTOqM1dMwZ/aRXQ59zVubN9wHGqk6UtqRK+/q+ciXmRy8fSolhGVvG09HHRGo4l6fr/c4ZhXUQH0uFW7PZbg==} - engines: {node: '>=6.9.0'} - peerDependencies: - '@babel/core': ^7.0.0-0 - dependencies: - '@babel/core': 7.23.6 - '@babel/helper-plugin-utils': 7.22.5 - '@babel/plugin-syntax-json-strings': 7.8.3(@babel/core@7.23.6) - dev: true - - /@babel/plugin-transform-literals@7.23.3(@babel/core@7.23.6): - resolution: {integrity: sha512-wZ0PIXRxnwZvl9AYpqNUxpZ5BiTGrYt7kueGQ+N5FiQ7RCOD4cm8iShd6S6ggfVIWaJf2EMk8eRzAh52RfP4rQ==} - engines: {node: '>=6.9.0'} - peerDependencies: - '@babel/core': ^7.0.0-0 - dependencies: - '@babel/core': 7.23.6 - '@babel/helper-plugin-utils': 7.22.5 - dev: true - - /@babel/plugin-transform-logical-assignment-operators@7.23.4(@babel/core@7.23.6): - resolution: {integrity: sha512-Mc/ALf1rmZTP4JKKEhUwiORU+vcfarFVLfcFiolKUo6sewoxSEgl36ak5t+4WamRsNr6nzjZXQjM35WsU+9vbg==} - engines: {node: '>=6.9.0'} - peerDependencies: - '@babel/core': ^7.0.0-0 - dependencies: - '@babel/core': 7.23.6 - '@babel/helper-plugin-utils': 7.22.5 - '@babel/plugin-syntax-logical-assignment-operators': 7.10.4(@babel/core@7.23.6) - dev: true - - /@babel/plugin-transform-member-expression-literals@7.23.3(@babel/core@7.23.6): - resolution: {integrity: sha512-sC3LdDBDi5x96LA+Ytekz2ZPk8i/Ck+DEuDbRAll5rknJ5XRTSaPKEYwomLcs1AA8wg9b3KjIQRsnApj+q51Ag==} - engines: {node: '>=6.9.0'} - peerDependencies: - '@babel/core': ^7.0.0-0 - dependencies: - '@babel/core': 7.23.6 - '@babel/helper-plugin-utils': 7.22.5 - dev: true - - /@babel/plugin-transform-modules-amd@7.23.3(@babel/core@7.23.6): - resolution: {integrity: sha512-vJYQGxeKM4t8hYCKVBlZX/gtIY2I7mRGFNcm85sgXGMTBcoV3QdVtdpbcWEbzbfUIUZKwvgFT82mRvaQIebZzw==} - engines: {node: '>=6.9.0'} - peerDependencies: - '@babel/core': ^7.0.0-0 - dependencies: - '@babel/core': 7.23.6 - '@babel/helper-module-transforms': 7.23.3(@babel/core@7.23.6) - '@babel/helper-plugin-utils': 7.22.5 - dev: true - - /@babel/plugin-transform-modules-commonjs@7.23.3(@babel/core@7.23.6): - resolution: {integrity: sha512-aVS0F65LKsdNOtcz6FRCpE4OgsP2OFnW46qNxNIX9h3wuzaNcSQsJysuMwqSibC98HPrf2vCgtxKNwS0DAlgcA==} - engines: {node: '>=6.9.0'} - peerDependencies: - '@babel/core': ^7.0.0-0 - dependencies: - '@babel/core': 7.23.6 - '@babel/helper-module-transforms': 7.23.3(@babel/core@7.23.6) - '@babel/helper-plugin-utils': 7.22.5 - '@babel/helper-simple-access': 7.22.5 - dev: true - - /@babel/plugin-transform-modules-systemjs@7.23.3(@babel/core@7.23.6): - resolution: {integrity: sha512-ZxyKGTkF9xT9YJuKQRo19ewf3pXpopuYQd8cDXqNzc3mUNbOME0RKMoZxviQk74hwzfQsEe66dE92MaZbdHKNQ==} - engines: {node: '>=6.9.0'} - peerDependencies: - '@babel/core': ^7.0.0-0 - dependencies: - '@babel/core': 7.23.6 - '@babel/helper-hoist-variables': 7.22.5 - '@babel/helper-module-transforms': 7.23.3(@babel/core@7.23.6) - '@babel/helper-plugin-utils': 7.22.5 - '@babel/helper-validator-identifier': 7.22.20 - dev: true - - /@babel/plugin-transform-modules-umd@7.23.3(@babel/core@7.23.6): - resolution: {integrity: sha512-zHsy9iXX2nIsCBFPud3jKn1IRPWg3Ing1qOZgeKV39m1ZgIdpJqvlWVeiHBZC6ITRG0MfskhYe9cLgntfSFPIg==} - engines: {node: '>=6.9.0'} - peerDependencies: - '@babel/core': ^7.0.0-0 - dependencies: - '@babel/core': 7.23.6 - '@babel/helper-module-transforms': 7.23.3(@babel/core@7.23.6) - '@babel/helper-plugin-utils': 7.22.5 - dev: true - - /@babel/plugin-transform-named-capturing-groups-regex@7.22.5(@babel/core@7.23.6): - resolution: {integrity: sha512-YgLLKmS3aUBhHaxp5hi1WJTgOUb/NCuDHzGT9z9WTt3YG+CPRhJs6nprbStx6DnWM4dh6gt7SU3sZodbZ08adQ==} - engines: {node: '>=6.9.0'} - peerDependencies: - '@babel/core': ^7.0.0 - dependencies: - '@babel/core': 7.23.6 - '@babel/helper-create-regexp-features-plugin': 7.22.15(@babel/core@7.23.6) - '@babel/helper-plugin-utils': 7.22.5 - dev: true - - /@babel/plugin-transform-new-target@7.23.3(@babel/core@7.23.6): - 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.23.6 - '@babel/helper-plugin-utils': 7.22.5 - dev: true - - /@babel/plugin-transform-nullish-coalescing-operator@7.23.4(@babel/core@7.23.6): - resolution: {integrity: sha512-jHE9EVVqHKAQx+VePv5LLGHjmHSJR76vawFPTdlxR/LVJPfOEGxREQwQfjuZEOPTwG92X3LINSh3M40Rv4zpVA==} - engines: {node: '>=6.9.0'} - peerDependencies: - '@babel/core': ^7.0.0-0 - dependencies: - '@babel/core': 7.23.6 - '@babel/helper-plugin-utils': 7.22.5 - '@babel/plugin-syntax-nullish-coalescing-operator': 7.8.3(@babel/core@7.23.6) - dev: true - - /@babel/plugin-transform-numeric-separator@7.23.4(@babel/core@7.23.6): - resolution: {integrity: sha512-mps6auzgwjRrwKEZA05cOwuDc9FAzoyFS4ZsG/8F43bTLf/TgkJg7QXOrPO1JO599iA3qgK9MXdMGOEC8O1h6Q==} - engines: {node: '>=6.9.0'} - peerDependencies: - '@babel/core': ^7.0.0-0 - dependencies: - '@babel/core': 7.23.6 - '@babel/helper-plugin-utils': 7.22.5 - '@babel/plugin-syntax-numeric-separator': 7.10.4(@babel/core@7.23.6) - dev: true - - /@babel/plugin-transform-object-rest-spread@7.23.4(@babel/core@7.23.6): - 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.23.6 - '@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.23.6) - '@babel/plugin-transform-parameters': 7.23.3(@babel/core@7.23.6) - dev: true - - /@babel/plugin-transform-object-super@7.23.3(@babel/core@7.23.6): - 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.23.6 - '@babel/helper-plugin-utils': 7.22.5 - '@babel/helper-replace-supers': 7.22.20(@babel/core@7.23.6) - dev: true - - /@babel/plugin-transform-optional-catch-binding@7.23.4(@babel/core@7.23.6): - resolution: {integrity: sha512-XIq8t0rJPHf6Wvmbn9nFxU6ao4c7WhghTR5WyV8SrJfUFzyxhCm4nhC+iAp3HFhbAKLfYpgzhJ6t4XCtVwqO5A==} - engines: {node: '>=6.9.0'} - peerDependencies: - '@babel/core': ^7.0.0-0 - dependencies: - '@babel/core': 7.23.6 - '@babel/helper-plugin-utils': 7.22.5 - '@babel/plugin-syntax-optional-catch-binding': 7.8.3(@babel/core@7.23.6) - dev: true - - /@babel/plugin-transform-optional-chaining@7.23.4(@babel/core@7.23.6): - resolution: {integrity: sha512-ZU8y5zWOfjM5vZ+asjgAPwDaBjJzgufjES89Rs4Lpq63O300R/kOz30WCLo6BxxX6QVEilwSlpClnG5cZaikTA==} - engines: {node: '>=6.9.0'} - peerDependencies: - '@babel/core': ^7.0.0-0 - dependencies: - '@babel/core': 7.23.6 - '@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.23.6) - dev: true - - /@babel/plugin-transform-parameters@7.23.3(@babel/core@7.23.6): - resolution: {integrity: sha512-09lMt6UsUb3/34BbECKVbVwrT9bO6lILWln237z7sLaWnMsTi7Yc9fhX5DLpkJzAGfaReXI22wP41SZmnAA3Vw==} - engines: {node: '>=6.9.0'} - peerDependencies: - '@babel/core': ^7.0.0-0 - dependencies: - '@babel/core': 7.23.6 - '@babel/helper-plugin-utils': 7.22.5 - dev: true - - /@babel/plugin-transform-private-methods@7.23.3(@babel/core@7.23.6): - 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.23.6 - '@babel/helper-create-class-features-plugin': 7.23.6(@babel/core@7.23.6) - '@babel/helper-plugin-utils': 7.22.5 - dev: true - - /@babel/plugin-transform-private-property-in-object@7.23.4(@babel/core@7.23.6): - resolution: {integrity: sha512-9G3K1YqTq3F4Vt88Djx1UZ79PDyj+yKRnUy7cZGSMe+a7jkwD259uKKuUzQlPkGam7R+8RJwh5z4xO27fA1o2A==} - engines: {node: '>=6.9.0'} - peerDependencies: - '@babel/core': ^7.0.0-0 - dependencies: - '@babel/core': 7.23.6 - '@babel/helper-annotate-as-pure': 7.22.5 - '@babel/helper-create-class-features-plugin': 7.23.6(@babel/core@7.23.6) - '@babel/helper-plugin-utils': 7.22.5 - '@babel/plugin-syntax-private-property-in-object': 7.14.5(@babel/core@7.23.6) - dev: true - - /@babel/plugin-transform-property-literals@7.23.3(@babel/core@7.23.6): - resolution: {integrity: sha512-jR3Jn3y7cZp4oEWPFAlRsSWjxKe4PZILGBSd4nis1TsC5qeSpb+nrtihJuDhNI7QHiVbUaiXa0X2RZY3/TI6Nw==} - engines: {node: '>=6.9.0'} - peerDependencies: - '@babel/core': ^7.0.0-0 - dependencies: - '@babel/core': 7.23.6 - '@babel/helper-plugin-utils': 7.22.5 - dev: true - - /@babel/plugin-transform-regenerator@7.23.3(@babel/core@7.23.6): - resolution: {integrity: sha512-KP+75h0KghBMcVpuKisx3XTu9Ncut8Q8TuvGO4IhY+9D5DFEckQefOuIsB/gQ2tG71lCke4NMrtIPS8pOj18BQ==} - engines: {node: '>=6.9.0'} - peerDependencies: - '@babel/core': ^7.0.0-0 - dependencies: - '@babel/core': 7.23.6 - '@babel/helper-plugin-utils': 7.22.5 - regenerator-transform: 0.15.2 - dev: true - - /@babel/plugin-transform-reserved-words@7.23.3(@babel/core@7.23.6): - resolution: {integrity: sha512-QnNTazY54YqgGxwIexMZva9gqbPa15t/x9VS+0fsEFWplwVpXYZivtgl43Z1vMpc1bdPP2PP8siFeVcnFvA3Cg==} - engines: {node: '>=6.9.0'} - peerDependencies: - '@babel/core': ^7.0.0-0 - dependencies: - '@babel/core': 7.23.6 - '@babel/helper-plugin-utils': 7.22.5 - dev: true - - /@babel/plugin-transform-shorthand-properties@7.23.3(@babel/core@7.23.6): - resolution: {integrity: sha512-ED2fgqZLmexWiN+YNFX26fx4gh5qHDhn1O2gvEhreLW2iI63Sqm4llRLCXALKrCnbN4Jy0VcMQZl/SAzqug/jg==} - engines: {node: '>=6.9.0'} - peerDependencies: - '@babel/core': ^7.0.0-0 - dependencies: - '@babel/core': 7.23.6 - '@babel/helper-plugin-utils': 7.22.5 - dev: true - - /@babel/plugin-transform-spread@7.23.3(@babel/core@7.23.6): - resolution: {integrity: sha512-VvfVYlrlBVu+77xVTOAoxQ6mZbnIq5FM0aGBSFEcIh03qHf+zNqA4DC/3XMUozTg7bZV3e3mZQ0i13VB6v5yUg==} - engines: {node: '>=6.9.0'} - peerDependencies: - '@babel/core': ^7.0.0-0 - dependencies: - '@babel/core': 7.23.6 - '@babel/helper-plugin-utils': 7.22.5 - '@babel/helper-skip-transparent-expression-wrappers': 7.22.5 - dev: true - - /@babel/plugin-transform-sticky-regex@7.23.3(@babel/core@7.23.6): - resolution: {integrity: sha512-HZOyN9g+rtvnOU3Yh7kSxXrKbzgrm5X4GncPY1QOquu7epga5MxKHVpYu2hvQnry/H+JjckSYRb93iNfsioAGg==} - engines: {node: '>=6.9.0'} - peerDependencies: - '@babel/core': ^7.0.0-0 - dependencies: - '@babel/core': 7.23.6 - '@babel/helper-plugin-utils': 7.22.5 - dev: true - - /@babel/plugin-transform-template-literals@7.23.3(@babel/core@7.23.6): - resolution: {integrity: sha512-Flok06AYNp7GV2oJPZZcP9vZdszev6vPBkHLwxwSpaIqx75wn6mUd3UFWsSsA0l8nXAKkyCmL/sR02m8RYGeHg==} - engines: {node: '>=6.9.0'} - peerDependencies: - '@babel/core': ^7.0.0-0 - dependencies: - '@babel/core': 7.23.6 - '@babel/helper-plugin-utils': 7.22.5 - dev: true - - /@babel/plugin-transform-typeof-symbol@7.23.3(@babel/core@7.23.6): - resolution: {integrity: sha512-4t15ViVnaFdrPC74be1gXBSMzXk3B4Us9lP7uLRQHTFpV5Dvt33pn+2MyyNxmN3VTTm3oTrZVMUmuw3oBnQ2oQ==} - engines: {node: '>=6.9.0'} - peerDependencies: - '@babel/core': ^7.0.0-0 - dependencies: - '@babel/core': 7.23.6 - '@babel/helper-plugin-utils': 7.22.5 - dev: true - - /@babel/plugin-transform-unicode-escapes@7.23.3(@babel/core@7.23.6): - resolution: {integrity: sha512-OMCUx/bU6ChE3r4+ZdylEqAjaQgHAgipgW8nsCfu5pGqDcFytVd91AwRvUJSBZDz0exPGgnjoqhgRYLRjFZc9Q==} - engines: {node: '>=6.9.0'} - peerDependencies: - '@babel/core': ^7.0.0-0 - dependencies: - '@babel/core': 7.23.6 - '@babel/helper-plugin-utils': 7.22.5 - dev: true - - /@babel/plugin-transform-unicode-property-regex@7.23.3(@babel/core@7.23.6): - resolution: {integrity: sha512-KcLIm+pDZkWZQAFJ9pdfmh89EwVfmNovFBcXko8szpBeF8z68kWIPeKlmSOkT9BXJxs2C0uk+5LxoxIv62MROA==} - engines: {node: '>=6.9.0'} - peerDependencies: - '@babel/core': ^7.0.0-0 - dependencies: - '@babel/core': 7.23.6 - '@babel/helper-create-regexp-features-plugin': 7.22.15(@babel/core@7.23.6) - '@babel/helper-plugin-utils': 7.22.5 - dev: true - - /@babel/plugin-transform-unicode-regex@7.23.3(@babel/core@7.23.6): - resolution: {integrity: sha512-wMHpNA4x2cIA32b/ci3AfwNgheiva2W0WUKWTK7vBHBhDKfPsc5cFGNWm69WBqpwd86u1qwZ9PWevKqm1A3yAw==} - engines: {node: '>=6.9.0'} - peerDependencies: - '@babel/core': ^7.0.0-0 - dependencies: - '@babel/core': 7.23.6 - '@babel/helper-create-regexp-features-plugin': 7.22.15(@babel/core@7.23.6) - '@babel/helper-plugin-utils': 7.22.5 - dev: true - - /@babel/plugin-transform-unicode-sets-regex@7.23.3(@babel/core@7.23.6): - resolution: {integrity: sha512-W7lliA/v9bNR83Qc3q1ip9CQMZ09CcHDbHfbLRDNuAhn1Mvkr1ZNF7hPmztMQvtTGVLJ9m8IZqWsTkXOml8dbw==} - engines: {node: '>=6.9.0'} - peerDependencies: - '@babel/core': ^7.0.0 - dependencies: - '@babel/core': 7.23.6 - '@babel/helper-create-regexp-features-plugin': 7.22.15(@babel/core@7.23.6) - '@babel/helper-plugin-utils': 7.22.5 - dev: true - - /@babel/preset-env@7.23.6(@babel/core@7.23.6): - resolution: {integrity: sha512-2XPn/BqKkZCpzYhUUNZ1ssXw7DcXfKQEjv/uXZUXgaebCMYmkEsfZ2yY+vv+xtXv50WmL5SGhyB6/xsWxIvvOQ==} - engines: {node: '>=6.9.0'} - peerDependencies: - '@babel/core': ^7.0.0-0 - dependencies: - '@babel/compat-data': 7.23.5 - '@babel/core': 7.23.6 - '@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.23.6) - '@babel/plugin-bugfix-v8-spread-parameters-in-optional-chaining': 7.23.3(@babel/core@7.23.6) - '@babel/plugin-bugfix-v8-static-class-fields-redefine-readonly': 7.23.3(@babel/core@7.23.6) - '@babel/plugin-proposal-private-property-in-object': 7.21.0-placeholder-for-preset-env.2(@babel/core@7.23.6) - '@babel/plugin-syntax-async-generators': 7.8.4(@babel/core@7.23.6) - '@babel/plugin-syntax-class-properties': 7.12.13(@babel/core@7.23.6) - '@babel/plugin-syntax-class-static-block': 7.14.5(@babel/core@7.23.6) - '@babel/plugin-syntax-dynamic-import': 7.8.3(@babel/core@7.23.6) - '@babel/plugin-syntax-export-namespace-from': 7.8.3(@babel/core@7.23.6) - '@babel/plugin-syntax-import-assertions': 7.23.3(@babel/core@7.23.6) - '@babel/plugin-syntax-import-attributes': 7.23.3(@babel/core@7.23.6) - '@babel/plugin-syntax-import-meta': 7.10.4(@babel/core@7.23.6) - '@babel/plugin-syntax-json-strings': 7.8.3(@babel/core@7.23.6) - '@babel/plugin-syntax-logical-assignment-operators': 7.10.4(@babel/core@7.23.6) - '@babel/plugin-syntax-nullish-coalescing-operator': 7.8.3(@babel/core@7.23.6) - '@babel/plugin-syntax-numeric-separator': 7.10.4(@babel/core@7.23.6) - '@babel/plugin-syntax-object-rest-spread': 7.8.3(@babel/core@7.23.6) - '@babel/plugin-syntax-optional-catch-binding': 7.8.3(@babel/core@7.23.6) - '@babel/plugin-syntax-optional-chaining': 7.8.3(@babel/core@7.23.6) - '@babel/plugin-syntax-private-property-in-object': 7.14.5(@babel/core@7.23.6) - '@babel/plugin-syntax-top-level-await': 7.14.5(@babel/core@7.23.6) - '@babel/plugin-syntax-unicode-sets-regex': 7.18.6(@babel/core@7.23.6) - '@babel/plugin-transform-arrow-functions': 7.23.3(@babel/core@7.23.6) - '@babel/plugin-transform-async-generator-functions': 7.23.4(@babel/core@7.23.6) - '@babel/plugin-transform-async-to-generator': 7.23.3(@babel/core@7.23.6) - '@babel/plugin-transform-block-scoped-functions': 7.23.3(@babel/core@7.23.6) - '@babel/plugin-transform-block-scoping': 7.23.4(@babel/core@7.23.6) - '@babel/plugin-transform-class-properties': 7.23.3(@babel/core@7.23.6) - '@babel/plugin-transform-class-static-block': 7.23.4(@babel/core@7.23.6) - '@babel/plugin-transform-classes': 7.23.5(@babel/core@7.23.6) - '@babel/plugin-transform-computed-properties': 7.23.3(@babel/core@7.23.6) - '@babel/plugin-transform-destructuring': 7.23.3(@babel/core@7.23.6) - '@babel/plugin-transform-dotall-regex': 7.23.3(@babel/core@7.23.6) - '@babel/plugin-transform-duplicate-keys': 7.23.3(@babel/core@7.23.6) - '@babel/plugin-transform-dynamic-import': 7.23.4(@babel/core@7.23.6) - '@babel/plugin-transform-exponentiation-operator': 7.23.3(@babel/core@7.23.6) - '@babel/plugin-transform-export-namespace-from': 7.23.4(@babel/core@7.23.6) - '@babel/plugin-transform-for-of': 7.23.6(@babel/core@7.23.6) - '@babel/plugin-transform-function-name': 7.23.3(@babel/core@7.23.6) - '@babel/plugin-transform-json-strings': 7.23.4(@babel/core@7.23.6) - '@babel/plugin-transform-literals': 7.23.3(@babel/core@7.23.6) - '@babel/plugin-transform-logical-assignment-operators': 7.23.4(@babel/core@7.23.6) - '@babel/plugin-transform-member-expression-literals': 7.23.3(@babel/core@7.23.6) - '@babel/plugin-transform-modules-amd': 7.23.3(@babel/core@7.23.6) - '@babel/plugin-transform-modules-commonjs': 7.23.3(@babel/core@7.23.6) - '@babel/plugin-transform-modules-systemjs': 7.23.3(@babel/core@7.23.6) - '@babel/plugin-transform-modules-umd': 7.23.3(@babel/core@7.23.6) - '@babel/plugin-transform-named-capturing-groups-regex': 7.22.5(@babel/core@7.23.6) - '@babel/plugin-transform-new-target': 7.23.3(@babel/core@7.23.6) - '@babel/plugin-transform-nullish-coalescing-operator': 7.23.4(@babel/core@7.23.6) - '@babel/plugin-transform-numeric-separator': 7.23.4(@babel/core@7.23.6) - '@babel/plugin-transform-object-rest-spread': 7.23.4(@babel/core@7.23.6) - '@babel/plugin-transform-object-super': 7.23.3(@babel/core@7.23.6) - '@babel/plugin-transform-optional-catch-binding': 7.23.4(@babel/core@7.23.6) - '@babel/plugin-transform-optional-chaining': 7.23.4(@babel/core@7.23.6) - '@babel/plugin-transform-parameters': 7.23.3(@babel/core@7.23.6) - '@babel/plugin-transform-private-methods': 7.23.3(@babel/core@7.23.6) - '@babel/plugin-transform-private-property-in-object': 7.23.4(@babel/core@7.23.6) - '@babel/plugin-transform-property-literals': 7.23.3(@babel/core@7.23.6) - '@babel/plugin-transform-regenerator': 7.23.3(@babel/core@7.23.6) - '@babel/plugin-transform-reserved-words': 7.23.3(@babel/core@7.23.6) - '@babel/plugin-transform-shorthand-properties': 7.23.3(@babel/core@7.23.6) - '@babel/plugin-transform-spread': 7.23.3(@babel/core@7.23.6) - '@babel/plugin-transform-sticky-regex': 7.23.3(@babel/core@7.23.6) - '@babel/plugin-transform-template-literals': 7.23.3(@babel/core@7.23.6) - '@babel/plugin-transform-typeof-symbol': 7.23.3(@babel/core@7.23.6) - '@babel/plugin-transform-unicode-escapes': 7.23.3(@babel/core@7.23.6) - '@babel/plugin-transform-unicode-property-regex': 7.23.3(@babel/core@7.23.6) - '@babel/plugin-transform-unicode-regex': 7.23.3(@babel/core@7.23.6) - '@babel/plugin-transform-unicode-sets-regex': 7.23.3(@babel/core@7.23.6) - '@babel/preset-modules': 0.1.6-no-external-plugins(@babel/core@7.23.6) - babel-plugin-polyfill-corejs2: 0.4.7(@babel/core@7.23.6) - babel-plugin-polyfill-corejs3: 0.8.7(@babel/core@7.23.6) - babel-plugin-polyfill-regenerator: 0.5.4(@babel/core@7.23.6) - core-js-compat: 3.34.0 - semver: 6.3.1 - transitivePeerDependencies: - - supports-color - dev: true - - /@babel/preset-modules@0.1.6-no-external-plugins(@babel/core@7.23.6): - 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.23.6 - '@babel/helper-plugin-utils': 7.22.5 - '@babel/types': 7.23.6 - esutils: 2.0.3 - dev: true - - /@babel/regjsgen@0.8.0: - resolution: {integrity: sha512-x/rqGMdzj+fWZvCOYForTghzbtqPDZ5gPwaoNGHdgDfF2QA/XZbCBp4Moo5scrkAMPhB7z26XM/AaHuIJdgauA==} - dev: true - - /@babel/runtime-corejs3@7.23.6: - resolution: {integrity: sha512-Djs/ZTAnpyj0nyg7p1J6oiE/tZ9G2stqAFlLGZynrW+F3k2w2jGK2mLOBxzYIOcZYA89+c3d3wXKpYLcpwcU6w==} - engines: {node: '>=6.9.0'} - dependencies: - core-js-pure: 3.34.0 - regenerator-runtime: 0.14.0 - dev: true - - /@babel/runtime@7.23.6: - resolution: {integrity: sha512-zHd0eUrf5GZoOWVCXp6koAKQTfZV07eit6bGPmJgnZdnSAvvZee6zniW2XMF7Cmc4ISOOnPy3QaSiIJGJkVEDQ==} - engines: {node: '>=6.9.0'} - dependencies: - regenerator-runtime: 0.14.0 - dev: true - - /@babel/template@7.22.15: - resolution: {integrity: sha512-QPErUVm4uyJa60rkI73qneDacvdvzxshT3kksGqlGWYdOTIUOwJ7RDUL8sGqslY1uXWSL6xMFKEXDS3ox2uF0w==} - engines: {node: '>=6.9.0'} - dependencies: - '@babel/code-frame': 7.23.5 - '@babel/parser': 7.23.6 - '@babel/types': 7.23.6 - dev: true - - /@babel/traverse@7.23.6: - resolution: {integrity: sha512-czastdK1e8YByZqezMPFiZ8ahwVMh/ESl9vPgvgdB9AmFMGP5jfpFax74AQgl5zj4XHzqeYAg2l8PuUeRS1MgQ==} - engines: {node: '>=6.9.0'} - dependencies: - '@babel/code-frame': 7.23.5 - '@babel/generator': 7.23.6 - '@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 - - /@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 - - /@colors/colors@1.5.0: - resolution: {integrity: sha512-ooWCrlZP11i8GImSjTHYHLkvFDP48nS4+204nGb1RiX/WXYHmJA2III9/e2DWVabCESdW7hBAEzHRqUn9OUVvQ==} - engines: {node: '>=0.1.90'} - requiresBuild: true - dev: true - optional: true - - /@cypress/code-coverage@3.12.14(@babel/core@7.23.6)(@babel/preset-env@7.23.6)(babel-loader@9.1.3)(cypress@12.17.3)(webpack@5.89.0): - resolution: {integrity: sha512-uTlt0cdfohRWkH/HaXHRnyc+uj/Jb2on9V6H6CB6hdQvUfsmvHgTbc+qoqdwVOXI/33ctnreZpLjVkbuH0gYvw==} - peerDependencies: - '@babel/core': ^7.0.1 - '@babel/preset-env': ^7.0.0 - babel-loader: ^8.3 || ^9 - cypress: '*' - webpack: ^4 || ^5 - dependencies: - '@babel/core': 7.23.6 - '@babel/preset-env': 7.23.6(@babel/core@7.23.6) - '@cypress/webpack-preprocessor': 6.0.0(@babel/core@7.23.6)(@babel/preset-env@7.23.6)(babel-loader@9.1.3)(webpack@5.89.0) - babel-loader: 9.1.3(@babel/core@7.23.6)(webpack@5.89.0) - chalk: 4.1.2 - cypress: 12.17.3 - dayjs: 1.11.10 - debug: 4.3.4(supports-color@8.1.1) - execa: 4.1.0 - globby: 11.1.0 - istanbul-lib-coverage: 3.2.2 - js-yaml: 4.1.0 - nyc: 15.1.0 - webpack: 5.89.0 - transitivePeerDependencies: - - supports-color - dev: true - - /@cypress/request@3.0.1: - resolution: {integrity: sha512-TWivJlJi8ZDx2wGOw1dbLuHJKUYX7bWySw377nlnGOW3hP9/MUKIsEdXT/YngWxVdgNCHRBmFlBipE+5/2ZZlQ==} - engines: {node: '>= 6'} - dependencies: - aws-sign2: 0.7.0 - aws4: 1.12.0 - caseless: 0.12.0 - combined-stream: 1.0.8 - extend: 3.0.2 - forever-agent: 0.6.1 - form-data: 2.3.3 - http-signature: 1.3.6 - is-typedarray: 1.0.0 - isstream: 0.1.2 - json-stringify-safe: 5.0.1 - mime-types: 2.1.35 - performance-now: 2.1.0 - qs: 6.10.4 - safe-buffer: 5.2.1 - tough-cookie: 4.1.3 - tunnel-agent: 0.6.0 - uuid: 8.3.2 - dev: true - - /@cypress/webpack-dev-server@3.7.1(debug@4.3.4)(webpack@5.89.0): - resolution: {integrity: sha512-f2S0VWpYhryyaliJiPdESeF+nOi/t2mPargRS8hVToJHQHbfiGPPFcjsz0Wz39jSuBYNhX7D3ylnaU2USSZ1EA==} - dependencies: - find-up: 6.3.0 - fs-extra: 9.1.0 - html-webpack-plugin-4: /html-webpack-plugin@4.5.2(webpack@5.89.0) - html-webpack-plugin-5: /html-webpack-plugin@5.5.4(webpack@5.89.0) - local-pkg: 0.4.1 - semver: 7.5.4 - speed-measure-webpack-plugin: 1.4.2(webpack@5.89.0) - tslib: 2.6.2 - webpack-dev-server: 4.15.1(debug@4.3.4)(webpack@5.89.0) - webpack-merge: 5.10.0 - transitivePeerDependencies: - - bufferutil - - debug - - supports-color - - utf-8-validate - - webpack - - webpack-cli - dev: true - - /@cypress/webpack-preprocessor@6.0.0(@babel/core@7.23.6)(@babel/preset-env@7.23.6)(babel-loader@9.1.3)(webpack@5.89.0): - resolution: {integrity: sha512-1AS1Et5CNPJii0+DdBZBS8e0hlM2BkBNmYRdZO4/16A3KS3em1sjPZtFw7jJF00m6DYAdB9iy6QW/lLZ2bN0gg==} - peerDependencies: - '@babel/core': ^7.0.1 - '@babel/preset-env': ^7.0.0 - babel-loader: ^8.3 || ^9 - webpack: ^4 || ^5 - dependencies: - '@babel/core': 7.23.6 - '@babel/preset-env': 7.23.6(@babel/core@7.23.6) - babel-loader: 9.1.3(@babel/core@7.23.6)(webpack@5.89.0) - bluebird: 3.7.1 - debug: 4.3.4(supports-color@8.1.1) - lodash: 4.17.21 - webpack: 5.89.0 - transitivePeerDependencies: - - supports-color - dev: true - - /@cypress/xvfb@1.2.4(supports-color@8.1.1): - resolution: {integrity: sha512-skbBzPggOVYCbnGgV+0dmBdW/s77ZkAOXIC1knS8NagwDjBrNC1LuXtQJeiN6l+m7lzmHtaoUw/ctJKdqkG57Q==} - dependencies: - debug: 3.2.7(supports-color@8.1.1) - lodash.once: 4.1.1 - transitivePeerDependencies: - - supports-color - dev: true - - /@drptbl/gremlins.js@2.2.1: - resolution: {integrity: sha512-VWsdOZTsu8ABNVplFQUniHSLsCAQIJh+HDTUP6CllxXBe2pgFQKQ6RGxAS/QRTUcPprQCGpB3zH+gqNnvRRTmQ==} - dependencies: - chance: 1.1.11 - core-js: 3.34.0 - dev: true - - /@foundry-rs/easy-foundryup@0.1.3: - resolution: {integrity: sha512-Funb4hrSBeikKCmccFT/d3Ud5o92tlIZHTJeMCVk5b54/+CHZHr4g7MmtvO5xrGhxrOebQ0L+ojIj+VixgW7ug==} - dependencies: - command-exists: 1.2.9 - ts-interface-checker: 0.1.13 - dev: true - - /@hapi/hoek@9.3.0: - resolution: {integrity: sha512-/c6rf4UJlmHlC9b5BaNvzAcFv7HZ2QHaV0D4/HNlBdvFnvQq8RI4kYdhyPCl7Xj+oWvTWQ8ujhqS53LIgAe6KQ==} - dev: true - - /@hapi/topo@5.1.0: - resolution: {integrity: sha512-foQZKJig7Ob0BMAYBfcJk8d77QtOe7Wo4ox7ff1lQYoNNAb6jwcY1ncdoy2e9wQZzvNy7ODZCYJkK8kzmcAnAg==} - dependencies: - '@hapi/hoek': 9.3.0 - 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 - - /@istanbuljs/schema@0.1.3: - resolution: {integrity: sha512-ZXRY4jNvVgSVQ8DL3LTcakaAtXwTVUxE81hslsyD2AtoXW/wVob10HkOJ1X/pAlcI7D+2YoZKg5do8G/w6RYgA==} - engines: {node: '>=8'} - dev: true - - /@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.10.4 - '@types/yargs': 15.0.19 - chalk: 4.1.2 - dev: true - - /@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.20 - dev: true - - /@jridgewell/resolve-uri@3.1.1: - resolution: {integrity: sha512-dSYZh7HhCDtCKm4QakX0xFpsRDqjjtZf/kjI/v3T3Nwt5r8/qz/M19F9ySyOqU94SXBmeG9ttTul+YnR4LOxFA==} - engines: {node: '>=6.0.0'} - dev: true - - /@jridgewell/set-array@1.1.2: - resolution: {integrity: sha512-xnkseuNADM0gt2bs+BvhO0p78Mk762YnZdsuzFV018NoG1Sj1SCQvpSqa7XUaTam5vAGasABV9qXASMKnFMwMw==} - engines: {node: '>=6.0.0'} - dev: true - - /@jridgewell/source-map@0.3.5: - resolution: {integrity: sha512-UTYAUj/wviwdsMfzoSJspJxbkH5o1snzwX0//0ENX1u/55kkZZkcTZP6u9bwKGkv+dkk9at4m1Cpt0uY80kcpQ==} - dependencies: - '@jridgewell/gen-mapping': 0.3.3 - '@jridgewell/trace-mapping': 0.3.20 - dev: true - - /@jridgewell/sourcemap-codec@1.4.15: - resolution: {integrity: sha512-eF2rxCRulEKXHTRiDrDy6erMYWqNw4LPdQ8UQA4huuxaQsVeRPFl2oM8oDGxMFhJUWZf9McpLtJasDDZb/Bpeg==} - dev: true - - /@jridgewell/trace-mapping@0.3.20: - resolution: {integrity: sha512-R8LcPeWZol2zR8mmH3JeKQ6QRCFb7XgUhV9ZlGhHLGyg4wpPiPZNQOOWhFZhxKw8u//yTbNGI42Bx/3paXEQ+Q==} - dependencies: - '@jridgewell/resolve-uri': 3.1.1 - '@jridgewell/sourcemap-codec': 1.4.15 - dev: true - - /@leichtgewicht/ip-codec@2.0.4: - resolution: {integrity: sha512-Hcv+nVC0kZnQ3tD9GVu5xSMR4VVYOteQIr/hwFPVEvPdlXqgGEuRjiheChHgdM+JyqdgNcmzZOX/tnl0JOiI7A==} - dev: true - - /@metamask/test-dapp@8.1.0: - resolution: {integrity: sha512-NM6o8EpIyT7ZhTDPf4rfLoklzpsWZ9DSA3iNJ/XdmrQY+D3dZVhwIpJBhNJqC4MSB+gAC4qqRKimTkWnoVhBHQ==} - engines: {node: '>= 18.0.0'} - dev: true - - /@noble/curves@1.2.0: - resolution: {integrity: sha512-oYclrNgRaM9SsBUBVbb8M6DTV7ZHRTKugureoYEncY5c65HOmRzvSiTE3y5CYaPYJA/GVkrhXEoF0M3Ya9PMnw==} - dependencies: - '@noble/hashes': 1.3.2 - dev: true - - /@noble/hashes@1.3.2: - resolution: {integrity: sha512-MVC8EAQp7MvEcm30KWENFjgR+Mkmf+D189XJTkFIlwohU5hcBbn1ZkKq7KVTi2Hme3PMGF390DaL52beVrIihQ==} - engines: {node: '>= 16'} - dev: true - - /@nodelib/fs.scandir@2.1.5: - resolution: {integrity: sha512-vq24Bq3ym5HEQm2NKCr3yXDwjc7vTsEThRDnkp2DK9p1uqLR+DHurm/NOTo0KG7HYHU7eppKZj3MyqYuMBf62g==} - engines: {node: '>= 8'} - dependencies: - '@nodelib/fs.stat': 2.0.5 - run-parallel: 1.2.0 - dev: true - - /@nodelib/fs.stat@2.0.5: - resolution: {integrity: sha512-RkhPPp2zrqDAQA/2jNhnztcPAlv64XdhIp7a7454A5ovI7Bukxgt7MX7udwAu3zg1DcpPU0rz3VV1SeaqvY4+A==} - engines: {node: '>= 8'} - dev: true - - /@nodelib/fs.walk@1.2.8: - resolution: {integrity: sha512-oGB+UxlgWcgQkgwo8GcEGwemoTFt3FIO9ababBmaGwXIoBKZ+GTy0pP185beGg7Llih/NSHSV2XAs1lnznocSg==} - engines: {node: '>= 8'} - dependencies: - '@nodelib/fs.scandir': 2.1.5 - fastq: 1.15.0 - dev: true - - /@opentelemetry/api@1.7.0: - resolution: {integrity: sha512-AdY5wvN0P2vXBi3b29hxZgSFvdhdxPB9+f0B6s//P9Q8nibRWeA3cHm8UmLpio9ABigkVHJ5NMPk+Mz8VCCyrw==} - engines: {node: '>=8.0.0'} - dev: false - - /@playwright/test@1.40.1: - resolution: {integrity: sha512-EaaawMTOeEItCRvfmkI9v6rBkF1svM8wjl/YPRrg2N2Wmp+4qJYkWtJsbew1szfKKDm6fPLy4YAanBhIlf9dWw==} - engines: {node: '>=16'} - hasBin: true - dependencies: - playwright: 1.40.1 - dev: true - - /@scure/base@1.1.5: - resolution: {integrity: sha512-Brj9FiG2W1MRQSTB212YVPRrcbjkv48FoZi/u4l/zds/ieRrqsh7aUf6CLwkAq61oKXr/ZlTzlY66gLIj3TFTQ==} - dev: true - - /@scure/bip32@1.3.2: - resolution: {integrity: sha512-N1ZhksgwD3OBlwTv3R6KFEcPojl/W4ElJOeCZdi+vuI5QmTFwLq3OFf2zd2ROpKvxFdgZ6hUpb0dx9bVNEwYCA==} - dependencies: - '@noble/curves': 1.2.0 - '@noble/hashes': 1.3.2 - '@scure/base': 1.1.5 - dev: true - - /@scure/bip39@1.2.1: - resolution: {integrity: sha512-Z3/Fsz1yr904dduJD0NpiyRHhRYHdcnyh73FZWiV+/qhWi83wNJ3NWolYqCEN+ZWsUz2TWwajJggcRE9r1zUYg==} - dependencies: - '@noble/hashes': 1.3.2 - '@scure/base': 1.1.5 - dev: true - - /@sideway/address@4.1.4: - resolution: {integrity: sha512-7vwq+rOHVWjyXxVlR76Agnvhy8I9rpzjosTESvmhNeXOXdZZB15Fl+TI9x1SiHZH5Jv2wTGduSxFDIaq0m3DUw==} - dependencies: - '@hapi/hoek': 9.3.0 - dev: true - - /@sideway/formula@3.0.1: - resolution: {integrity: sha512-/poHZJJVjx3L+zVD6g9KgHfYnb443oi7wLu/XKojDviHy6HOEOA6z1Trk5aR1dGcmPenJEgb2sK2I80LeS3MIg==} - dev: true - - /@sideway/pinpoint@2.0.0: - resolution: {integrity: sha512-RNiOoTPkptFtSVzQevY/yWtZwf/RxyVnPy/OcA9HBM3MlGDnBEYL5B41H0MTn0Uec8Hi+2qUtTfG2WWZBmMejQ==} - dev: true - - /@sindresorhus/is@4.6.0: - resolution: {integrity: sha512-t09vSN3MdfsyCHoFcTRCH/iUtG7OJ0CsjzB8cjAmKc/va/kIgeDI/TxsigdncE/4be734m0cvIYwNaV4i2XqAw==} - engines: {node: '>=10'} - dev: true - - /@synthetixio/synpress@3.7.2-beta.9(@babel/core@7.23.6)(@babel/preset-env@7.23.6)(babel-loader@9.1.3)(react-dom@18.2.0)(react@18.2.0)(typescript@5.3.3)(webpack@5.89.0)(zod@3.22.4): - resolution: {integrity: sha512-1fnr3jzQA2op6YnXxx6ERZ4babB+Ib1Xc5URGTcndH891Oa5uVlIaP0zRm5udTJuNdENOTLgkAdjv4WTGurBVA==} - engines: {node: '>=14'} - hasBin: true - dependencies: - '@cypress/code-coverage': 3.12.14(@babel/core@7.23.6)(@babel/preset-env@7.23.6)(babel-loader@9.1.3)(cypress@12.17.3)(webpack@5.89.0) - '@cypress/webpack-dev-server': 3.7.1(debug@4.3.4)(webpack@5.89.0) - '@drptbl/gremlins.js': 2.2.1 - '@foundry-rs/easy-foundryup': 0.1.3 - '@playwright/test': 1.40.1 - '@testing-library/cypress': 9.0.0(cypress@12.17.3) - '@testing-library/react': 14.1.2(react-dom@18.2.0)(react@18.2.0) - '@types/testing-library__cypress': 5.0.13 - '@viem/anvil': 0.0.6(debug@4.3.4) - app-root-path: 3.1.0 - axios: 1.6.2(debug@4.3.4) - babel-plugin-istanbul: 6.1.1 - babel-plugin-react-generate-property: 1.1.2 - babel-plugin-react-remove-properties: 0.3.0 - babel-plugin-transform-react-qa-classes: 1.6.0 - babel-plugin-transform-react-styled-components-qa: 2.1.0 - bytes32: 0.0.3 - commander: 11.1.0 - cypress: 12.17.3 - cypress-wait-until: 2.0.1 - debug: 4.3.4(supports-color@8.1.1) - dotenv: 16.3.1 - dotenv-parse-variables: 2.0.0 - download: 8.0.0 - ethers: 6.9.0 - etherscan-api: 10.3.0(debug@4.3.4) - find-config: 1.0.0 - get-port: 7.0.0 - node-fetch: 2.7.0 - underscore: 1.13.6 - viem: 1.20.0(typescript@5.3.3)(zod@3.22.4) - wait-on: 7.2.0(debug@4.3.4) - transitivePeerDependencies: - - '@babel/core' - - '@babel/preset-env' - - babel-loader - - bufferutil - - encoding - - react - - react-dom - - supports-color - - typescript - - utf-8-validate - - webpack - - webpack-cli - - zod - dev: true - - /@szmarczak/http-timer@4.0.6: - resolution: {integrity: sha512-4BAffykYOgO+5nzBWYwE3W90sBgLJoUPRWWcL8wlyiM8IB8ipJz3UMJ9KXQd1RKQXpKp8Tutn80HZtWsu2u76w==} - engines: {node: '>=10'} - dependencies: - defer-to-connect: 2.0.1 - dev: true - - /@testing-library/cypress@9.0.0(cypress@12.17.3): - resolution: {integrity: sha512-c1XiCGeHGGTWn0LAU12sFUfoX3qfId5gcSE2yHode+vsyHDWraxDPALjVnHd4/Fa3j4KBcc5k++Ccy6A9qnkMA==} - engines: {node: '>=12', npm: '>=6'} - peerDependencies: - cypress: ^12.0.0 - dependencies: - '@babel/runtime': 7.23.6 - '@testing-library/dom': 8.20.1 - cypress: 12.17.3 - dev: true - - /@testing-library/dom@7.31.2: - resolution: {integrity: sha512-3UqjCpey6HiTZT92vODYLPxTBWlM8ZOOjr3LX5F37/VRipW2M1kX6I/Cm4VXzteZqfGfagg8yXywpcOgQBlNsQ==} - engines: {node: '>=10'} - dependencies: - '@babel/code-frame': 7.23.5 - '@babel/runtime': 7.23.6 - '@types/aria-query': 4.2.2 - aria-query: 4.2.2 - chalk: 4.1.2 - dom-accessibility-api: 0.5.16 - lz-string: 1.5.0 - pretty-format: 26.6.2 - dev: true - - /@testing-library/dom@8.20.1: - resolution: {integrity: sha512-/DiOQ5xBxgdYRC8LNk7U+RWat0S3qRLeIw3ZIkMQ9kkVlRmwD/Eg8k8CqIpD6GW7u20JIUOfMKbxtiLutpjQ4g==} - engines: {node: '>=12'} - dependencies: - '@babel/code-frame': 7.23.5 - '@babel/runtime': 7.23.6 - '@types/aria-query': 5.0.4 - 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: true - - /@testing-library/dom@9.3.3: - resolution: {integrity: sha512-fB0R+fa3AUqbLHWyxXa2kGVtf1Fe1ZZFr0Zp6AIbIAzXb2mKbEXl+PCQNUOaq5lbTab5tfctfXRNsWXxa2f7Aw==} - engines: {node: '>=14'} - dependencies: - '@babel/code-frame': 7.23.5 - '@babel/runtime': 7.23.6 - '@types/aria-query': 5.0.4 - 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: true - - /@testing-library/react@14.1.2(react-dom@18.2.0)(react@18.2.0): - resolution: {integrity: sha512-z4p7DVBTPjKM5qDZ0t5ZjzkpSNb+fZy1u6bzO7kk8oeGagpPCAtgh4cx1syrfp7a+QWkM021jGqjJaxJJnXAZg==} - engines: {node: '>=14'} - peerDependencies: - react: ^18.0.0 - react-dom: ^18.0.0 - dependencies: - '@babel/runtime': 7.23.6 - '@testing-library/dom': 9.3.3 - '@types/react-dom': 18.2.17 - react: 18.2.0 - react-dom: 18.2.0(react@18.2.0) - dev: true - - /@types/aria-query@4.2.2: - resolution: {integrity: sha512-HnYpAE1Y6kRyKM/XkEuiRQhTHvkzMBurTHnpFLYLBGPIylZNPs9jJcuOOYWxPLJCSEtmZT0Y8rHDokKN7rRTig==} - dev: true - - /@types/aria-query@5.0.4: - resolution: {integrity: sha512-rfT93uj5s0PRL7EzccGMs3brplhcrghnDoV26NqKhCAS1hVo+WdNsPvE/yb6ilfr5hi2MEk6d5EWJTKdxg8jVw==} - dev: true - - /@types/body-parser@1.19.5: - resolution: {integrity: sha512-fB3Zu92ucau0iQ0JMCFQE7b/dv8Ot07NI3KaZIkIUNXq82k4eBAqUaneXfleGY9JWskeS9y+u0nXMyspcuQrCg==} - dependencies: - '@types/connect': 3.4.38 - '@types/node': 20.10.4 - dev: true - - /@types/bonjour@3.5.13: - resolution: {integrity: sha512-z9fJ5Im06zvUL548KvYNecEVlA7cVDkGUi6kZusb04mpyEFKCIZJvloCcmpmLaIahDpOQGHaHmG6imtPMmPXGQ==} - dependencies: - '@types/node': 20.10.4 - dev: true - - /@types/cacheable-request@6.0.3: - resolution: {integrity: sha512-IQ3EbTzGxIigb1I3qPZc1rWJnH0BmSKv5QYTalEwweFvyBDLSAe24zP0le/hyi7ecGfZVlIVAg4BZqb8WBwKqw==} - dependencies: - '@types/http-cache-semantics': 4.0.4 - '@types/keyv': 3.1.4 - '@types/node': 20.10.4 - '@types/responselike': 1.0.3 - dev: true - - /@types/connect-history-api-fallback@1.5.4: - resolution: {integrity: sha512-n6Cr2xS1h4uAulPRdlw6Jl6s1oG8KrVilPN2yUITEs+K48EzMJJ3W1xy8K5eWuFvjp3R74AOIGSmp2UfBJ8HFw==} - dependencies: - '@types/express-serve-static-core': 4.17.41 - '@types/node': 20.10.4 - dev: true - - /@types/connect@3.4.38: - resolution: {integrity: sha512-K6uROf1LD88uDQqJCktA4yzL1YYAK6NgfsI0v/mTgyPKWsX1CnJ0XPSDhViejru1GcRkLWb8RlzFYJRqGUbaug==} - dependencies: - '@types/node': 20.10.4 - dev: true - - /@types/eslint-scope@3.7.7: - resolution: {integrity: sha512-MzMFlSLBqNF2gcHWO0G1vP/YQyfvrxZ0bF+u7mzUdZ1/xK4A4sru+nraZz5i3iEIk1l1uyicaDVTB4QbbEkAYg==} - dependencies: - '@types/eslint': 8.44.9 - '@types/estree': 1.0.5 - dev: true - - /@types/eslint@8.44.9: - resolution: {integrity: sha512-6yBxcvwnnYoYT1Uk2d+jvIfsuP4mb2EdIxFnrPABj5a/838qe5bGkNLFOiipX4ULQ7XVQvTxOh7jO+BTAiqsEw==} - dependencies: - '@types/estree': 1.0.5 - '@types/json-schema': 7.0.15 - dev: true - - /@types/estree@1.0.5: - resolution: {integrity: sha512-/kYRxGDLWzHOB7q+wtSUQlFrtcdUccpfy+X+9iMBpHK8QLLhx2wIPYuS5DYtR9Wa/YlZAbIovy7qVdB1Aq6Lyw==} - dev: true - - /@types/express-serve-static-core@4.17.41: - resolution: {integrity: sha512-OaJ7XLaelTgrvlZD8/aa0vvvxZdUmlCn6MtWeB7TkiKW70BQLc9XEPpDLPdbo52ZhXUCrznlWdCHWxJWtdyajA==} - dependencies: - '@types/node': 20.10.4 - '@types/qs': 6.9.10 - '@types/range-parser': 1.2.7 - '@types/send': 0.17.4 - dev: true - - /@types/express@4.17.21: - resolution: {integrity: sha512-ejlPM315qwLpaQlQDTjPdsUFSc6ZsP4AN6AlWnogPjQ7CVi7PYF3YVz+CY3jE2pwYf7E/7HlDAN0rV2GxTG0HQ==} - dependencies: - '@types/body-parser': 1.19.5 - '@types/express-serve-static-core': 4.17.41 - '@types/qs': 6.9.10 - '@types/serve-static': 1.15.5 - dev: true - - /@types/html-minifier-terser@5.1.2: - resolution: {integrity: sha512-h4lTMgMJctJybDp8CQrxTUiiYmedihHWkjnF/8Pxseu2S6Nlfcy8kwboQ8yejh456rP2yWoEVm1sS/FVsfM48w==} - dev: true - - /@types/html-minifier-terser@6.1.0: - resolution: {integrity: sha512-oh/6byDPnL1zeNXFrDXFLyZjkr1MsBG667IM792caf1L2UPOOMf65NFzjUH/ltyfwjAGfs1rsX1eftK0jC/KIg==} - dev: true - - /@types/http-cache-semantics@4.0.4: - resolution: {integrity: sha512-1m0bIFVc7eJWyve9S0RnuRgcQqF/Xd5QsUZAZeQFr1Q3/p9JWoQQEqmVy+DPTNpGXwhgIetAoYF8JSc33q29QA==} - dev: true - - /@types/http-errors@2.0.4: - resolution: {integrity: sha512-D0CFMMtydbJAegzOyHjtiKPLlvnm3iTZyZRSZoLq2mRhDdmLfIWOCYPfQJ4cu2erKghU++QvjcUjp/5h7hESpA==} - dev: true - - /@types/http-proxy@1.17.14: - resolution: {integrity: sha512-SSrD0c1OQzlFX7pGu1eXxSEjemej64aaNPRhhVYUGqXh0BtldAAx37MG8btcumvpgKyZp1F5Gn3JkktdxiFv6w==} - dependencies: - '@types/node': 20.10.4 - dev: true - - /@types/istanbul-lib-coverage@2.0.6: - resolution: {integrity: sha512-2QF/t/auWm0lsy8XtKVPG19v3sSOQlJe/YHZgfjb/KBBHOGSV+J2q/S671rcq9uTBrLAXmZpqJiaQbMT+zNU1w==} - dev: 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 - - /@types/istanbul-reports@3.0.4: - resolution: {integrity: sha512-pk2B1NWalF9toCRu6gjBzR69syFjP4Od8WRAX+0mmf9lAjCRicLOWc+ZrxZHx/0XRjotgkF9t6iaMJ+aXcOdZQ==} - dependencies: - '@types/istanbul-lib-report': 3.0.3 - dev: true - - /@types/json-schema@7.0.15: - resolution: {integrity: sha512-5+fP8P8MFNC+AyZCDxrB2pkZFPGzqQWUzpSeuuVLvm8VMcorNYavBqoFcxK8bQz4Qsbn4oUEEem4wDLfcysGHA==} - dev: true - - /@types/keyv@3.1.4: - resolution: {integrity: sha512-BQ5aZNSCpj7D6K2ksrRCTmKRLEpnPvWDiLPfoGyhZ++8YtiK9d/3DBKPJgry359X/P1PfruyYwvnvwFjuEiEIg==} - dependencies: - '@types/node': 20.10.4 - dev: true - - /@types/mime@1.3.5: - resolution: {integrity: sha512-/pyBZWSLD2n0dcHE3hq8s8ZvcETHtEuF+3E7XVt0Ig2nvsVQXdghHVcEkIWjy9A0wKfTn97a/PSDYohKIlnP/w==} - dev: true - - /@types/mime@3.0.4: - resolution: {integrity: sha512-iJt33IQnVRkqeqC7PzBHPTC6fDlRNRW8vjrgqtScAhrmMwe8c4Eo7+fUGTa+XdWrpEgpyKWMYmi2dIwMAYRzPw==} - dev: true - - /@types/node-forge@1.3.10: - resolution: {integrity: sha512-y6PJDYN4xYBxwd22l+OVH35N+1fCYWiuC3aiP2SlXVE6Lo7SS+rSx9r89hLxrP4pn6n1lBGhHJ12pj3F3Mpttw==} - dependencies: - '@types/node': 20.10.4 - dev: true - - /@types/node@16.18.68: - resolution: {integrity: sha512-sG3hPIQwJLoewrN7cr0dwEy+yF5nD4D/4FxtQpFciRD/xwUzgD+G05uxZHv5mhfXo4F9Jkp13jjn0CC2q325sg==} - dev: true - - /@types/node@18.15.13: - resolution: {integrity: sha512-N+0kuo9KgrUQ1Sn/ifDXsvg0TTleP7rIy4zOBGECxAljqvqfqpTfzx0Q1NUedOixRMBfe2Whhb056a42cWs26Q==} - dev: true - - /@types/node@20.10.4: - resolution: {integrity: sha512-D08YG6rr8X90YB56tSIuBaddy/UXAA9RKJoFvrsnogAum/0pmjkgi4+2nx96A330FmioegBWmEYQ+syqCFaveg==} - dependencies: - undici-types: 5.26.5 - dev: true - - /@types/prop-types@15.7.11: - resolution: {integrity: sha512-ga8y9v9uyeiLdpKddhxYQkxNDrfvuPrlFb0N1qnZZByvcElJaXthF1UhvCh9TLWJBEHeNtdnbysW7Y6Uq8CVng==} - dev: true - - /@types/qs@6.9.10: - resolution: {integrity: sha512-3Gnx08Ns1sEoCrWssEgTSJs/rsT2vhGP+Ja9cnnk9k4ALxinORlQneLXFeFKOTJMOeZUFD1s7w+w2AphTpvzZw==} - dev: true - - /@types/range-parser@1.2.7: - resolution: {integrity: sha512-hKormJbkJqzQGhziax5PItDUTMAM9uE2XXQmM37dyd4hVM+5aVl7oVxMVUiVQn2oCQFN/LKCZdvSM0pFRqbSmQ==} - dev: true - - /@types/react-dom@18.2.17: - resolution: {integrity: sha512-rvrT/M7Df5eykWFxn6MYt5Pem/Dbyc1N8Y0S9Mrkw2WFCRiqUgw9P7ul2NpwsXCSM1DVdENzdG9J5SreqfAIWg==} - dependencies: - '@types/react': 18.2.45 - dev: true - - /@types/react@18.2.45: - resolution: {integrity: sha512-TtAxCNrlrBp8GoeEp1npd5g+d/OejJHFxS3OWmrPBMFaVQMSN0OFySozJio5BHxTuTeug00AVXVAjfDSfk+lUg==} - dependencies: - '@types/prop-types': 15.7.11 - '@types/scheduler': 0.16.8 - csstype: 3.1.3 - dev: true - - /@types/responselike@1.0.3: - resolution: {integrity: sha512-H/+L+UkTV33uf49PH5pCAUBVPNj2nDBXTN+qS1dOwyyg24l3CcicicCA7ca+HMvJBZcFgl5r8e+RR6elsb4Lyw==} - dependencies: - '@types/node': 20.10.4 - dev: true - - /@types/retry@0.12.0: - resolution: {integrity: sha512-wWKOClTTiizcZhXnPY4wikVAwmdYHp8q6DmC+EJUzAMsycb7HB32Kh9RN4+0gExjmPmZSAQjgURXIGATPegAvA==} - dev: true - - /@types/scheduler@0.16.8: - resolution: {integrity: sha512-WZLiwShhwLRmeV6zH+GkbOFT6Z6VklCItrDioxUnv+u4Ll+8vKeFySoFyK/0ctcRpOmwAicELfmys1sDc/Rw+A==} - dev: true - - /@types/send@0.17.4: - resolution: {integrity: sha512-x2EM6TJOybec7c52BX0ZspPodMsQUd5L6PRwOunVyVUhXiBSKf3AezDL8Dgvgt5o0UfKNfuA0eMLr2wLT4AiBA==} - dependencies: - '@types/mime': 1.3.5 - '@types/node': 20.10.4 - dev: true - - /@types/serve-index@1.9.4: - resolution: {integrity: sha512-qLpGZ/c2fhSs5gnYsQxtDEq3Oy8SXPClIXkW5ghvAvsNuVSA8k+gCONcUCS/UjLEYvYps+e8uBtfgXgvhwfNug==} - dependencies: - '@types/express': 4.17.21 - dev: true - - /@types/serve-static@1.15.5: - resolution: {integrity: sha512-PDRk21MnK70hja/YF8AHfC7yIsiQHn1rcXx7ijCFBX/k+XQJhQT/gw3xekXKJvx+5SXaMMS8oqQy09Mzvz2TuQ==} - dependencies: - '@types/http-errors': 2.0.4 - '@types/mime': 3.0.4 - '@types/node': 20.10.4 - dev: true - - /@types/sinonjs__fake-timers@8.1.1: - resolution: {integrity: sha512-0kSuKjAS0TrGLJ0M/+8MaFkGsQhZpB6pxOmvS3K8FYI72K//YmdfoW9X2qPsAKh1mkwxGD5zib9s1FIFed6E8g==} - dev: true - - /@types/sizzle@2.3.8: - resolution: {integrity: sha512-0vWLNK2D5MT9dg0iOo8GlKguPAU02QjmZitPEsXRuJXU/OGIOt9vT9Fc26wtYuavLxtO45v9PGleoL9Z0k1LHg==} - dev: true - - /@types/sockjs@0.3.36: - resolution: {integrity: sha512-MK9V6NzAS1+Ud7JV9lJLFqW85VbC9dq3LmwZCuBe4wBDgKC0Kj/jd8Xl+nSviU+Qc3+m7umHHyHg//2KSa0a0Q==} - dependencies: - '@types/node': 20.10.4 - dev: true - - /@types/source-list-map@0.1.6: - resolution: {integrity: sha512-5JcVt1u5HDmlXkwOD2nslZVllBBc7HDuOICfiZah2Z0is8M8g+ddAEawbmd3VjedfDHBzxCaXLs07QEmb7y54g==} - dev: true - - /@types/tapable@1.0.12: - resolution: {integrity: sha512-bTHG8fcxEqv1M9+TD14P8ok8hjxoOCkfKc8XXLaaD05kI7ohpeI956jtDOD3XHKBQrlyPughUtzm1jtVhHpA5Q==} - dev: true - - /@types/testing-library__cypress@5.0.13: - resolution: {integrity: sha512-lkxNGVFBEX825Z/FrHA8FLuKv1q5L6Bccqm08Zds2MUG4gd5al32hCpplzVumke3br+hkhtVmuPTfwQadIkc5w==} - dependencies: - '@testing-library/dom': 7.31.2 - cypress: 12.17.3 - dev: true - - /@types/uglify-js@3.17.4: - resolution: {integrity: sha512-Hm/T0kV3ywpJyMGNbsItdivRhYNCQQf1IIsYsXnoVPES4t+FMLyDe0/K+Ea7ahWtMtSNb22ZdY7MIyoD9rqARg==} - dependencies: - source-map: 0.6.1 - dev: true - - /@types/webpack-sources@3.2.3: - resolution: {integrity: sha512-4nZOdMwSPHZ4pTEZzSp0AsTM4K7Qmu40UKW4tJDiOVs20UzYF9l+qUe4s0ftfN0pin06n+5cWWDJXH+sbhAiDw==} - dependencies: - '@types/node': 20.10.4 - '@types/source-list-map': 0.1.6 - source-map: 0.7.4 - dev: true - - /@types/webpack@4.41.38: - resolution: {integrity: sha512-oOW7E931XJU1mVfCnxCVgv8GLFL768pDO5u2Gzk82i8yTIgX6i7cntyZOkZYb/JtYM8252SN9bQp9tgkVDSsRw==} - dependencies: - '@types/node': 20.10.4 - '@types/tapable': 1.0.12 - '@types/uglify-js': 3.17.4 - '@types/webpack-sources': 3.2.3 - anymatch: 3.1.3 - source-map: 0.6.1 - dev: true - - /@types/ws@8.5.10: - resolution: {integrity: sha512-vmQSUcfalpIq0R9q7uTo2lXs6eGIpt9wtnLdMv9LVpIjCA/+ufZRozlVoVelIYixx1ugCBKDhn89vnsEGOCx9A==} - dependencies: - '@types/node': 20.10.4 - dev: true - - /@types/yargs-parser@21.0.3: - resolution: {integrity: sha512-I4q9QU9MQv4oEOz4tAHJtNz1cwuLxn2F3xcc2iV5WdqLPpUnj30aUuxt1mAxYTG+oe8CZMV/+6rU4S4gRDzqtQ==} - dev: true - - /@types/yargs@15.0.19: - resolution: {integrity: sha512-2XUaGVmyQjgyAZldf0D0c14vvo/yv0MhQBSTJcejMMaitsn3nxCB6TmH4G0ZQf+uxROOa9mpanoSm8h6SG/1ZA==} - dependencies: - '@types/yargs-parser': 21.0.3 - dev: true - - /@types/yauzl@2.10.3: - resolution: {integrity: sha512-oJoftv0LSuaDZE3Le4DbKX+KS9G36NzOeSap90UIK0yMA/NhKJhqlSGtNDORNRaIbQfzjXDrQa0ytJ6mNRGz/Q==} - requiresBuild: true - dependencies: - '@types/node': 20.10.4 - dev: true - optional: true - - /@viem/anvil@0.0.6(debug@4.3.4): - resolution: {integrity: sha512-OjKR/+FVwzuygXYFqP8MBal1SXG8bT2gbZwqqB0XuLw81LNBBvmE/Repm6+5kkBh4IUj0PhYdrqOsnayS14Gtg==} - dependencies: - execa: 7.2.0 - get-port: 6.1.2 - http-proxy: 1.18.1(debug@4.3.4) - ws: 8.15.1 - transitivePeerDependencies: - - bufferutil - - debug - - utf-8-validate - dev: true - - /@webassemblyjs/ast@1.11.6: - resolution: {integrity: sha512-IN1xI7PwOvLPgjcf180gC1bqn3q/QaOCwYUahIOhbYUu8KA/3tw2RT/T0Gidi1l7Hhj5D/INhJxiICObqpMu4Q==} - dependencies: - '@webassemblyjs/helper-numbers': 1.11.6 - '@webassemblyjs/helper-wasm-bytecode': 1.11.6 - dev: true - - /@webassemblyjs/floating-point-hex-parser@1.11.6: - resolution: {integrity: sha512-ejAj9hfRJ2XMsNHk/v6Fu2dGS+i4UaXBXGemOfQ/JfQ6mdQg/WXtwleQRLLS4OvfDhv8rYnVwH27YJLMyYsxhw==} - dev: true - - /@webassemblyjs/helper-api-error@1.11.6: - resolution: {integrity: sha512-o0YkoP4pVu4rN8aTJgAyj9hC2Sv5UlkzCHhxqWj8butaLvnpdc2jOwh4ewE6CX0txSfLn/UYaV/pheS2Txg//Q==} - dev: true - - /@webassemblyjs/helper-buffer@1.11.6: - resolution: {integrity: sha512-z3nFzdcp1mb8nEOFFk8DrYLpHvhKC3grJD2ardfKOzmbmJvEf/tPIqCY+sNcwZIY8ZD7IkB2l7/pqhUhqm7hLA==} - dev: true - - /@webassemblyjs/helper-numbers@1.11.6: - resolution: {integrity: sha512-vUIhZ8LZoIWHBohiEObxVm6hwP034jwmc9kuq5GdHZH0wiLVLIPcMCdpJzG4C11cHoQ25TFIQj9kaVADVX7N3g==} - dependencies: - '@webassemblyjs/floating-point-hex-parser': 1.11.6 - '@webassemblyjs/helper-api-error': 1.11.6 - '@xtuc/long': 4.2.2 - dev: true - - /@webassemblyjs/helper-wasm-bytecode@1.11.6: - resolution: {integrity: sha512-sFFHKwcmBprO9e7Icf0+gddyWYDViL8bpPjJJl0WHxCdETktXdmtWLGVzoHbqUcY4Be1LkNfwTmXOJUFZYSJdA==} - dev: true - - /@webassemblyjs/helper-wasm-section@1.11.6: - resolution: {integrity: sha512-LPpZbSOwTpEC2cgn4hTydySy1Ke+XEu+ETXuoyvuyezHO3Kjdu90KK95Sh9xTbmjrCsUwvWwCOQQNta37VrS9g==} - dependencies: - '@webassemblyjs/ast': 1.11.6 - '@webassemblyjs/helper-buffer': 1.11.6 - '@webassemblyjs/helper-wasm-bytecode': 1.11.6 - '@webassemblyjs/wasm-gen': 1.11.6 - dev: true - - /@webassemblyjs/ieee754@1.11.6: - resolution: {integrity: sha512-LM4p2csPNvbij6U1f19v6WR56QZ8JcHg3QIJTlSwzFcmx6WSORicYj6I63f9yU1kEUtrpG+kjkiIAkevHpDXrg==} - dependencies: - '@xtuc/ieee754': 1.2.0 - dev: true - - /@webassemblyjs/leb128@1.11.6: - resolution: {integrity: sha512-m7a0FhE67DQXgouf1tbN5XQcdWoNgaAuoULHIfGFIEVKA6tu/edls6XnIlkmS6FrXAquJRPni3ZZKjw6FSPjPQ==} - dependencies: - '@xtuc/long': 4.2.2 - dev: true - - /@webassemblyjs/utf8@1.11.6: - resolution: {integrity: sha512-vtXf2wTQ3+up9Zsg8sa2yWiQpzSsMyXj0qViVP6xKGCUT8p8YJ6HqI7l5eCnWx1T/FYdsv07HQs2wTFbbof/RA==} - dev: true - - /@webassemblyjs/wasm-edit@1.11.6: - resolution: {integrity: sha512-Ybn2I6fnfIGuCR+Faaz7YcvtBKxvoLV3Lebn1tM4o/IAJzmi9AWYIPWpyBfU8cC+JxAO57bk4+zdsTjJR+VTOw==} - dependencies: - '@webassemblyjs/ast': 1.11.6 - '@webassemblyjs/helper-buffer': 1.11.6 - '@webassemblyjs/helper-wasm-bytecode': 1.11.6 - '@webassemblyjs/helper-wasm-section': 1.11.6 - '@webassemblyjs/wasm-gen': 1.11.6 - '@webassemblyjs/wasm-opt': 1.11.6 - '@webassemblyjs/wasm-parser': 1.11.6 - '@webassemblyjs/wast-printer': 1.11.6 - dev: true - - /@webassemblyjs/wasm-gen@1.11.6: - resolution: {integrity: sha512-3XOqkZP/y6B4F0PBAXvI1/bky7GryoogUtfwExeP/v7Nzwo1QLcq5oQmpKlftZLbT+ERUOAZVQjuNVak6UXjPA==} - dependencies: - '@webassemblyjs/ast': 1.11.6 - '@webassemblyjs/helper-wasm-bytecode': 1.11.6 - '@webassemblyjs/ieee754': 1.11.6 - '@webassemblyjs/leb128': 1.11.6 - '@webassemblyjs/utf8': 1.11.6 - dev: true - - /@webassemblyjs/wasm-opt@1.11.6: - resolution: {integrity: sha512-cOrKuLRE7PCe6AsOVl7WasYf3wbSo4CeOk6PkrjS7g57MFfVUF9u6ysQBBODX0LdgSvQqRiGz3CXvIDKcPNy4g==} - dependencies: - '@webassemblyjs/ast': 1.11.6 - '@webassemblyjs/helper-buffer': 1.11.6 - '@webassemblyjs/wasm-gen': 1.11.6 - '@webassemblyjs/wasm-parser': 1.11.6 - dev: true - - /@webassemblyjs/wasm-parser@1.11.6: - resolution: {integrity: sha512-6ZwPeGzMJM3Dqp3hCsLgESxBGtT/OeCvCZ4TA1JUPYgmhAx38tTPR9JaKy0S5H3evQpO/h2uWs2j6Yc/fjkpTQ==} - dependencies: - '@webassemblyjs/ast': 1.11.6 - '@webassemblyjs/helper-api-error': 1.11.6 - '@webassemblyjs/helper-wasm-bytecode': 1.11.6 - '@webassemblyjs/ieee754': 1.11.6 - '@webassemblyjs/leb128': 1.11.6 - '@webassemblyjs/utf8': 1.11.6 - dev: true - - /@webassemblyjs/wast-printer@1.11.6: - resolution: {integrity: sha512-JM7AhRcE+yW2GWYaKeHL5vt4xqee5N2WcezptmgyhNS+ScggqcT1OtXykhAb13Sn5Yas0j2uv9tHgrjwvzAP4A==} - dependencies: - '@webassemblyjs/ast': 1.11.6 - '@xtuc/long': 4.2.2 - dev: true - - /@xtuc/ieee754@1.2.0: - resolution: {integrity: sha512-DX8nKgqcGwsc0eJSqYt5lwP4DH5FlHnmuWWBRy7X0NcaGR0ZtuyeESgMwTYVEtxmsNGY+qit4QYT/MIYTOTPeA==} - dev: true - - /@xtuc/long@4.2.2: - resolution: {integrity: sha512-NuHqBY1PB/D8xU6s/thBgOAiAP7HOYDQ32+BFZILJ8ivkUkAHQnWfn6WhL79Owj1qmUnoN/YPhktdIoucipkAQ==} - dev: true - - /@zeit/schemas@2.29.0: - resolution: {integrity: sha512-g5QiLIfbg3pLuYUJPlisNKY+epQJTcMDsOnVNkscrDP1oi7vmJnzOANYJI/1pZcVJ6umUkBv3aFtlg1UvUHGzA==} - 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 - - /accepts@1.3.8: - resolution: {integrity: sha512-PYAthTa2m2VKxuvSD3DPC/Gy+U+sOA1LAuT8mkmRuvw+NACSaeXEQ+NHcVF7rONl6qcaxV3Uuemwawk+7+SJLw==} - engines: {node: '>= 0.6'} - dependencies: - mime-types: 2.1.35 - negotiator: 0.6.3 - dev: true - - /acorn-import-assertions@1.9.0(acorn@8.11.2): - resolution: {integrity: sha512-cmMwop9x+8KFhxvKrKfPYmN6/pKTYYHBqLa0DfvVZcKMJWNyWLnaqND7dx/qn66R7ewM1UX5XMaDVP5wlVTaVA==} - peerDependencies: - acorn: ^8 - dependencies: - acorn: 8.11.2 - dev: true - - /acorn@8.11.2: - resolution: {integrity: sha512-nc0Axzp/0FILLEVsm4fNwLCwMttvhEI263QtVPQcbpfZZ3ts0hLsZGOpE6czNlid7CJ9MlyH8reXkpsf3YUY4w==} - engines: {node: '>=0.4.0'} - hasBin: true - dev: true - - /aes-js@4.0.0-beta.5: - resolution: {integrity: sha512-G965FqalsNyrPqgEGON7nIx1e/OVENSgiEIzyC63haUMuvNnwIgIjMs52hlTCKhkBny7A2ORNlfY9Zu+jmGk1Q==} - dev: true - - /aggregate-error@3.1.0: - resolution: {integrity: sha512-4I7Td01quW/RpocfNayFdFVk1qSuoh0E7JrbRJ16nH01HhKFQ88INq9Sd+nd72zqRySlr9BmDA8xlEJ6vJMrYA==} - engines: {node: '>=8'} - dependencies: - clean-stack: 2.2.0 - indent-string: 4.0.0 - dev: true - - /ajv-formats@2.1.1(ajv@8.12.0): - resolution: {integrity: sha512-Wx0Kx52hxE7C18hkMEggYlEifqWZtYaRgouJor+WMdPnQyEK13vgEWyVNup7SoeeoLMsr4kf5h6dOW11I15MUA==} - peerDependencies: - ajv: ^8.0.0 - peerDependenciesMeta: - ajv: - optional: true - dependencies: - ajv: 8.12.0 - dev: true - - /ajv-keywords@3.5.2(ajv@6.12.6): - resolution: {integrity: sha512-5p6WTN0DdTGVQk6VjcEju19IgaHudalcfabD7yhDGeA6bcQnmL+CpveLJq/3hvfwd1aof6L386Ougkx6RfyMIQ==} - peerDependencies: - ajv: ^6.9.1 - dependencies: - ajv: 6.12.6 - dev: true - - /ajv-keywords@5.1.0(ajv@8.12.0): - resolution: {integrity: sha512-YCS/JNFAUyr5vAuhk1DWm1CBxRHW9LbJ2ozWeemrIqpbsqKjHVxYPyi5GC0rjZIT5JxJ3virVTS8wk4i/Z+krw==} - peerDependencies: - ajv: ^8.8.2 - dependencies: - ajv: 8.12.0 - fast-deep-equal: 3.1.3 - dev: true - - /ajv@6.12.6: - resolution: {integrity: sha512-j3fVLgvTo527anyYyJOGTYJbG+vnnQYvE0m5mmkc1TK+nxAppkCLMIL0aZ4dblVCNoGShhm+kzE4ZUykBoMg4g==} - 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 - - /ajv@8.11.0: - resolution: {integrity: sha512-wGgprdCvMalC0BztXvitD2hC04YffAvtsUn93JbGXYLAtCUO4xd17mCCZQxUOItiBwZvJScWo8NIvQMQ71rdpg==} - dependencies: - fast-deep-equal: 3.1.3 - json-schema-traverse: 1.0.0 - require-from-string: 2.0.2 - uri-js: 4.4.1 - dev: true - - /ajv@8.12.0: - resolution: {integrity: sha512-sRu1kpcO9yLtYxBKvqfTeh9KzZEwO3STyX1HT+4CaDzC6HpTGYhIhPIzj9XuKU7KYDwnaeh5hcOwjy1QuJzBPA==} - dependencies: - fast-deep-equal: 3.1.3 - json-schema-traverse: 1.0.0 - require-from-string: 2.0.2 - uri-js: 4.4.1 - dev: true - - /ansi-align@3.0.1: - resolution: {integrity: sha512-IOfwwBF5iczOjp/WeY4YxyjqAFMQoZufdQWDd19SEExbVLNXqvpzSJ/M7Za4/sCPmQ0+GRquoA7bGcINcxew6w==} - dependencies: - string-width: 4.2.3 - dev: true - - /ansi-colors@4.1.3: - resolution: {integrity: sha512-/6w/C21Pm1A7aZitlI5Ni/2J6FFQN8i1Cvz3kHABAAbw93v/NlvKdVOqz7CCWz/3iv/JplRSEEZ83XION15ovw==} - engines: {node: '>=6'} - dev: true - - /ansi-escapes@4.3.2: - resolution: {integrity: sha512-gKXj5ALrKWQLsYG9jlTRmR/xKluxHV+Z9QEwNIgCfM1/uwPMCuzVVnh5mwTd+OuBZcwSIMbqssNWRm1lE51QaQ==} - engines: {node: '>=8'} - dependencies: - type-fest: 0.21.3 - dev: true - - /ansi-html-community@0.0.8: - resolution: {integrity: sha512-1APHAyr3+PCamwNw3bXCPp4HFLONZt/yIH0sZp0/469KWNTEy+qN5jQ3GVX6DMZ1UXAi34yVwtTeaG/HpBuuzw==} - engines: {'0': node >= 0.8.0} - hasBin: true - 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@5.0.1: - resolution: {integrity: sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ==} - engines: {node: '>=8'} - dev: true - - /ansi-regex@6.0.1: - resolution: {integrity: sha512-n5M855fKb2SsfMIiFFoVrABHJC8QtHwVx+mHWP3QcEqBHYienj5dHSgjbxtC0WEZXYt4wcD6zrQElDPhFuZgfA==} - engines: {node: '>=12'} - dev: true - - /ansi-styles@3.2.1: - resolution: {integrity: sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA==} - engines: {node: '>=4'} - dependencies: - color-convert: 1.9.3 - dev: true - - /ansi-styles@4.3.0: - resolution: {integrity: sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==} - engines: {node: '>=8'} - dependencies: - color-convert: 2.0.1 - dev: true - - /ansi-styles@5.2.0: - resolution: {integrity: sha512-Cxwpt2SfTzTtXcfOlzGEee8O+c+MmUgGrNiBcXnuWxuFJHe6a5Hz7qwhwe5OgaSYI0IJvkLqWX1ASG+cJOkEiA==} - engines: {node: '>=10'} - dev: true - - /ansi-styles@6.2.1: - resolution: {integrity: sha512-bN798gFfQX+viw3R7yrGWRqnrN2oRkEkUjjl4JNn4E8GxxbjtG3FbrEIIY3l8/hrwUwIeCZvi4QuOTP4MErVug==} - engines: {node: '>=12'} - dev: true - - /anymatch@3.1.3: - resolution: {integrity: sha512-KMReFUr0B4t+D+OBkjR3KYqvocp2XaSzO55UcB6mgQMd3KbcE+mWTyvVV7D/zsdEbNnV6acZUutkiHQXvTr1Rw==} - engines: {node: '>= 8'} - dependencies: - normalize-path: 3.0.0 - picomatch: 2.3.1 - dev: true - - /app-root-path@3.1.0: - resolution: {integrity: sha512-biN3PwB2gUtjaYy/isrU3aNWI5w+fAfvHkSvCKeQGxhmYpwKFUxudR3Yya+KqVRHBmEDYh+/lTozYCFbmzX4nA==} - engines: {node: '>= 6.0.0'} - dev: true - - /append-transform@2.0.0: - resolution: {integrity: sha512-7yeyCEurROLQJFv5Xj4lEGTy0borxepjFv1g22oAdqFu//SrAlDl1O1Nxx15SH1RoliUml6p8dwJW9jvZughhg==} - engines: {node: '>=8'} - dependencies: - default-require-extensions: 3.0.1 - dev: true - - /arch@2.2.0: - resolution: {integrity: sha512-Of/R0wqp83cgHozfIYLbBMnej79U/SVGOOyuB3VVFv1NRM/PSFMK12x9KVtiYzJqmnU5WR2qp0Z5rHb7sWGnFQ==} - dev: true - - /archive-type@4.0.0: - resolution: {integrity: sha512-zV4Ky0v1F8dBrdYElwTvQhweQ0P7Kwc1aluqJsYtOBP01jXcWCyW2IEfI1YiqsG+Iy7ZR+o5LF1N+PGECBxHWA==} - engines: {node: '>=4'} - dependencies: - file-type: 4.4.0 - dev: true - - /archy@1.0.0: - resolution: {integrity: sha512-Xg+9RwCg/0p32teKdGMPTPnVXKD0w3DfHnFTficozsAgsvq2XenPJq/MYpzzQ/v8zrOyJn6Ds39VA4JIDwFfqw==} - dev: true - - /arg@5.0.2: - resolution: {integrity: sha512-PYjyFOLKQ9y57JvQ6QLo8dAgNqswh8M1RMJYdQduT6xbWSgK36P/Z/v+p888pM69jMMfS8Xd8F6I1kQ/I9HUGg==} - dev: true - - /argparse@1.0.10: - resolution: {integrity: sha512-o5Roy6tNG4SL/FOkCAN6RzjiakZS25RLYFrcMttJqbdd8BWrnA+fGz57iN5Pb06pvBGvl5gQ0B48dJlslXvoTg==} - dependencies: - sprintf-js: 1.0.3 - dev: true - - /argparse@2.0.1: - resolution: {integrity: sha512-8+9WqebbFzpX9OR+Wa6O29asIogeRMzcGtAINdpMHHyAg10f05aSFVBbcEqGf/PXw1EjAZ+q2/bEBg3DvurK3Q==} - dev: true - - /aria-query@4.2.2: - resolution: {integrity: sha512-o/HelwhuKpTj/frsOsbNLNgnNGVIFsVP/SW2BSF14gVl7kAfMOJ6/8wUAUvG1R1NHKrfG+2sHZTu0yauT1qBrA==} - engines: {node: '>=6.0'} - dependencies: - '@babel/runtime': 7.23.6 - '@babel/runtime-corejs3': 7.23.6 - dev: true - - /aria-query@5.1.3: - resolution: {integrity: sha512-R5iJ5lkuHybztUfuOAznmboyjWq8O6sqNqtK7CLOqdydi54VNbORp49mb14KbWgG1QD3JFO9hJdZ+y4KutfdOQ==} - dependencies: - deep-equal: 2.2.3 - dev: true - - /array-buffer-byte-length@1.0.0: - resolution: {integrity: sha512-LPuwb2P+NrQw3XhxGc36+XSvuBPopovXYTR9Ew++Du9Yb/bx5AzBfrIsBoj0EZUifjQU+sHL21sseZ3jerWO/A==} - dependencies: - call-bind: 1.0.5 - is-array-buffer: 3.0.2 - dev: true - - /array-flatten@1.1.1: - resolution: {integrity: sha512-PCVAQswWemu6UdxsDFFX/+gVeYqKAod3D3UVm91jHwynguOwAvYPhx8nNlM++NqRcK6CxxpUafjmhIdKiHibqg==} - dev: true - - /array-flatten@2.1.2: - resolution: {integrity: sha512-hNfzcOV8W4NdualtqBFPyVO+54DSJuZGY9qT4pRroB6S9e3iiido2ISIC5h9R2sPJ8H3FHCIiEnsv1lPXO3KtQ==} - dev: true - - /array-union@1.0.2: - resolution: {integrity: sha512-Dxr6QJj/RdU/hCaBjOfxW+q6lyuVE6JFWIrAUpuOOhoJJoQ99cUn3igRaHVB5P9WrgFVN0FfArM3x0cueOU8ng==} - engines: {node: '>=0.10.0'} - dependencies: - array-uniq: 1.0.3 - dev: true - - /array-union@2.1.0: - resolution: {integrity: sha512-HGyxoOTYUyCM6stUe6EJgnd4EoewAI7zMdfqO+kGjnlZmBDz/cR5pf8r/cR4Wq60sL/p0IkcjUEEPwS3GFrIyw==} - engines: {node: '>=8'} - dev: true - - /array-uniq@1.0.3: - resolution: {integrity: sha512-MNha4BWQ6JbwhFhj03YK552f7cb3AzoE8SzeljgChvL1dl3IcvggXVz1DilzySZkCja+CXuZbdW7yATchWn8/Q==} - engines: {node: '>=0.10.0'} - dev: true - - /array.prototype.reduce@1.0.6: - resolution: {integrity: sha512-UW+Mz8LG/sPSU8jRDCjVr6J/ZKAGpHfwrZ6kWTG5qCxIEiXdVshqGnu5vEZA8S1y6X4aCSbQZ0/EEsfvEvBiSg==} - engines: {node: '>= 0.4'} - dependencies: - call-bind: 1.0.5 - define-properties: 1.2.1 - es-abstract: 1.22.3 - es-array-method-boxes-properly: 1.0.0 - is-string: 1.0.7 - dev: true - - /arraybuffer.prototype.slice@1.0.2: - resolution: {integrity: sha512-yMBKppFur/fbHu9/6USUe03bZ4knMYiwFBcyiaXB8Go0qNehwX6inYPzK9U0NeQvGxKthcmHcaR8P5MStSRBAw==} - engines: {node: '>= 0.4'} - dependencies: - array-buffer-byte-length: 1.0.0 - call-bind: 1.0.5 - define-properties: 1.2.1 - es-abstract: 1.22.3 - get-intrinsic: 1.2.2 - is-array-buffer: 3.0.2 - is-shared-array-buffer: 1.0.2 - dev: true - - /asn1@0.2.6: - resolution: {integrity: sha512-ix/FxPn0MDjeyJ7i/yoHGFt/EX6LyNbxSEhPPXODPL+KB0VPk86UYfL0lMdy+KCnv+fmvIzySwaK5COwqVbWTQ==} - 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 - - /astral-regex@2.0.0: - resolution: {integrity: sha512-Z7tMw1ytTXt5jqMcOP+OQteU1VuNK9Y02uuJtKQ1Sv69jXQKKg5cibLwGJow8yzZP+eAc18EmLGPal0bp36rvQ==} - engines: {node: '>=8'} - dev: true - - /async@2.6.4: - resolution: {integrity: sha512-mzo5dfJYwAn29PeiJ0zvwTo04zj8HDJj0Mn8TD7sno7q12prdbnasKJHhkm2c1LgrhlJ0teaea8860oxi51mGA==} - dependencies: - lodash: 4.17.21 - dev: true - - /async@3.2.5: - resolution: {integrity: sha512-baNZyqaaLhyLVKm/DlvdW051MSgO6b8eVfIezl9E5PqWxFgzLm/wQntEW4zOytVburDEr0JlALEpdOFwvErLsg==} - dev: true - - /asynckit@0.4.0: - resolution: {integrity: sha512-Oei9OH4tRh0YqU3GxhX79dM/mwVgvbZJaSNaRk+bshkj0S5cfHcgYakreBjrHwatXKbz+IoIdYLxrKim2MjW0Q==} - dev: true - - /at-least-node@1.0.0: - resolution: {integrity: sha512-+q/t7Ekv1EDY2l6Gda6LLiX14rU9TV20Wa3ofeQmwPFZbOMo9DXrLbOjFaaclkXKWidIaopwAObQDqwWtGUjqg==} - engines: {node: '>= 4.0.0'} - dev: true - - /available-typed-arrays@1.0.5: - resolution: {integrity: sha512-DMD0KiN46eipeziST1LPP/STfDU0sufISXmjSgvVsoU2tqxctQeASejWcfNtxYKqETM1UxQ8sp2OrSBWpHY6sw==} - engines: {node: '>= 0.4'} - dev: true - - /aws-sign2@0.7.0: - resolution: {integrity: sha512-08kcGqnYf/YmjoRhfxyu+CLxBjUtHLXLXX/vUfx9l2LYzG3c1m61nrpyFUZI6zeS+Li/wWMMidD9KgrqtGq3mA==} - dev: true - - /aws4@1.12.0: - resolution: {integrity: sha512-NmWvPnx0F1SfrQbYwOi7OeaNGokp9XhzNioJ/CSBs8Qa4vxug81mhJEAVZwxXuBmYB5KDRfMq/F3RR0BIU7sWg==} - dev: true - - /axios@1.6.2(debug@4.3.4): - resolution: {integrity: sha512-7i24Ri4pmDRfJTR7LDBhsOTtcm+9kjX5WiY1X3wIisx6G9So3pfMkEiU7emUBe46oceVImccTEM3k6C5dbVW8A==} - dependencies: - follow-redirects: 1.15.6(debug@4.3.4) - form-data: 4.0.0 - proxy-from-env: 1.1.0 - transitivePeerDependencies: - - debug - dev: true - - /babel-loader@9.1.3(@babel/core@7.23.6)(webpack@5.89.0): - resolution: {integrity: sha512-xG3ST4DglodGf8qSwv0MdeWLhrDsw/32QMdTO5T1ZIp9gQur0HkCyFs7Awskr10JKXFXwpAhiCuYX5oGXnRGbw==} - engines: {node: '>= 14.15.0'} - peerDependencies: - '@babel/core': ^7.12.0 - webpack: '>=5' - dependencies: - '@babel/core': 7.23.6 - find-cache-dir: 4.0.0 - schema-utils: 4.2.0 - webpack: 5.89.0 - dev: true - - /babel-plugin-istanbul@6.1.1: - resolution: {integrity: sha512-Y1IQok9821cC9onCx5otgFfRm7Lm+I+wwxOx738M/WLPZ9Q42m4IG5W0FNX8WLL2gYMZo3JkuXIH2DOpWM+qwA==} - engines: {node: '>=8'} - dependencies: - '@babel/helper-plugin-utils': 7.22.5 - '@istanbuljs/load-nyc-config': 1.1.0 - '@istanbuljs/schema': 0.1.3 - istanbul-lib-instrument: 5.2.1 - test-exclude: 6.0.0 - transitivePeerDependencies: - - supports-color - dev: true - - /babel-plugin-polyfill-corejs2@0.4.7(@babel/core@7.23.6): - 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.23.6 - '@babel/helper-define-polyfill-provider': 0.4.4(@babel/core@7.23.6) - semver: 6.3.1 - transitivePeerDependencies: - - supports-color - dev: true - - /babel-plugin-polyfill-corejs3@0.8.7(@babel/core@7.23.6): - resolution: {integrity: sha512-KyDvZYxAzkC0Aj2dAPyDzi2Ym15e5JKZSK+maI7NAwSqofvuFglbSsxE7wUOvTg9oFVnHMzVzBKcqEb4PJgtOA==} - peerDependencies: - '@babel/core': ^7.4.0 || ^8.0.0-0 <8.0.0 - dependencies: - '@babel/core': 7.23.6 - '@babel/helper-define-polyfill-provider': 0.4.4(@babel/core@7.23.6) - core-js-compat: 3.34.0 - transitivePeerDependencies: - - supports-color - dev: true - - /babel-plugin-polyfill-regenerator@0.5.4(@babel/core@7.23.6): - 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.23.6 - '@babel/helper-define-polyfill-provider': 0.4.4(@babel/core@7.23.6) - transitivePeerDependencies: - - supports-color - dev: true - - /babel-plugin-react-generate-property@1.1.2: - resolution: {integrity: sha512-Wm1OfCfv7juukTZEZHNSYIMxeQEcIhnQQeGlFbML1BesMGZValuCCnEaayg6KyAlT9Y07I5Tz6XmH9YirUfkFQ==} - dev: true - - /babel-plugin-react-remove-properties@0.3.0: - resolution: {integrity: sha512-vbxegtXGyVcUkCvayLzftU95vuvpYFV85pRpeMpohMHeEY46Qe0VNWfkVVcCbaZ12CXHzDFOj0esumATcW83ng==} - dev: true - - /babel-plugin-transform-react-qa-classes@1.6.0: - resolution: {integrity: sha512-r7G9s+j6CiatnTMP+32fbPrfrSSPWJ3LBoESNlCdXWb8oAO2Ubcrgk0TSbpHVMoDpBiyn+zfm2rxdxwdTt3FpQ==} - dependencies: - babel-types: 6.26.0 - lodash.camelcase: 4.3.0 - lodash.isstring: 4.0.1 - lodash.kebabcase: 4.1.1 - lodash.snakecase: 4.1.1 - pascalcase: 1.0.0 - dev: true - - /babel-plugin-transform-react-styled-components-qa@2.1.0: - resolution: {integrity: sha512-Db3YCZPuel9JYM8uZ3UAen3Yio5ZPTVbJuLqekxRdZ7fUF185iIHnp275Gb5qu6wDyUH+/L9erYieaigq5qvow==} - dependencies: - lodash.camelcase: 4.3.0 - lodash.isstring: 4.0.1 - lodash.kebabcase: 4.1.1 - lodash.snakecase: 4.1.1 - lodash.upperfirst: 4.3.1 - dev: true - - /babel-runtime@6.26.0: - resolution: {integrity: sha512-ITKNuq2wKlW1fJg9sSW52eepoYgZBggvOAHC0u/CYu/qxQ9EVzThCgR69BnSXLHjy2f7SY5zaQ4yt7H9ZVxY2g==} - dependencies: - core-js: 2.6.12 - regenerator-runtime: 0.11.1 - dev: true - - /babel-types@6.26.0: - resolution: {integrity: sha512-zhe3V/26rCWsEZK8kZN+HaQj5yQ1CilTObixFzKW1UWjqG7618Twz6YEsCnjfg5gBcJh02DrpCkS9h98ZqDY+g==} - dependencies: - babel-runtime: 6.26.0 - esutils: 2.0.3 - lodash: 4.17.21 - to-fast-properties: 1.0.3 - dev: true - - /balanced-match@1.0.2: - resolution: {integrity: sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw==} - dev: true - - /base64-js@1.5.1: - resolution: {integrity: sha512-AKpaYlHn8t4SVbOHCy+b5+KKgvR4vrsD8vbvrbiQJps7fKDTkjkDry6ji0rUJjC0kzbNePLwzxq8iypo41qeWA==} - dev: true - - /batch@0.6.1: - resolution: {integrity: sha512-x+VAiMRL6UPkx+kudNvxTl6hB2XNNCG2r+7wixVfIYwu/2HKRXimwQyaumLjMveWvT2Hkd/cAJw+QBMfJ/EKVw==} - dev: true - - /bcrypt-pbkdf@1.0.2: - resolution: {integrity: sha512-qeFIXtP4MSoi6NLqO12WfqARWWuCKi2Rn/9hJLEmtB5yTNr9DqFWkJRCf2qShWzPeAMRnOgCrq0sg/KLv5ES9w==} - dependencies: - tweetnacl: 0.14.5 - dev: true - - /big.js@5.2.2: - resolution: {integrity: sha512-vyL2OymJxmarO8gxMr0mhChsO9QGwhynfuu4+MHTAW6czfq9humCB7rKpUjDd9YUiDPU4mzpyupFSvOClAwbmQ==} - dev: true - - /binary-extensions@2.2.0: - resolution: {integrity: sha512-jDctJ/IVQbZoJykoeHbhXpOlNBqGNcwXJKJog42E5HDPUwQTSdjCHdihjj0DlnheQ7blbT6dHOafNAiS8ooQKA==} - engines: {node: '>=8'} - dev: true - - /bintrees@1.0.2: - resolution: {integrity: sha512-VOMgTMwjAaUG580SXn3LacVgjurrbMme7ZZNYGSSV7mmtY6QQRh0Eg3pwIcntQ77DErK1L0NxkbetjcoXzVwKw==} - dev: false - - /bl@1.2.3: - resolution: {integrity: sha512-pvcNpa0UU69UT341rO6AYy4FVAIkUHuZXRIWbq+zHnsVcRzDDjIAhGuuYoi0d//cwIwtt4pkpKycWEfjdV+vww==} - dependencies: - readable-stream: 2.3.8 - safe-buffer: 5.2.1 - dev: true - - /blob-util@2.0.2: - resolution: {integrity: sha512-T7JQa+zsXXEa6/8ZhHcQEW1UFfVM49Ts65uBkFL6fz2QmrElqmbajIDJvuA0tEhRe5eIjpV9ZF+0RfZR9voJFQ==} - dev: true - - /bluebird@3.7.1: - resolution: {integrity: sha512-DdmyoGCleJnkbp3nkbxTLJ18rjDsE4yCggEwKNXkeV123sPNfOCYeDoeuOY+F2FrSjO1YXcTU+dsy96KMy+gcg==} - dev: true - - /bluebird@3.7.2: - resolution: {integrity: sha512-XpNj6GDQzdfW+r2Wnn7xiSAd7TM3jzkxGXBGTtWKuSXv1xUV+azxAm8jdWZN06QTQk+2N2XB9jRDkvbmQmcRtg==} - dev: true - - /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: true - - /bonjour-service@1.1.1: - resolution: {integrity: sha512-Z/5lQRMOG9k7W+FkeGTNjh7htqn/2LMnfOvBZ8pynNZCM9MwkQkI3zeI4oz09uWdcgmgHugVvBqxGg4VQJ5PCg==} - dependencies: - array-flatten: 2.1.2 - dns-equal: 1.0.0 - fast-deep-equal: 3.1.3 - multicast-dns: 7.2.5 - dev: true - - /boolbase@1.0.0: - resolution: {integrity: sha512-JZOSA7Mo9sNGB8+UjSgzdLtokWAky1zbztM3WRLCbZ70/3cTANmQmOdR7y2g+J0e2WXywy1yS468tY+IruqEww==} - dev: true - - /boxen@7.0.0: - resolution: {integrity: sha512-j//dBVuyacJbvW+tvZ9HuH03fZ46QcaKvvhZickZqtB271DxJ7SNRSNxrV/dZX0085m7hISRZWbzWlJvx/rHSg==} - engines: {node: '>=14.16'} - dependencies: - ansi-align: 3.0.1 - camelcase: 7.0.1 - chalk: 5.0.1 - cli-boxes: 3.0.0 - string-width: 5.1.2 - type-fest: 2.19.0 - widest-line: 4.0.1 - wrap-ansi: 8.1.0 - dev: true - - /brace-expansion@1.1.11: - resolution: {integrity: sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA==} - dependencies: - balanced-match: 1.0.2 - concat-map: 0.0.1 - dev: true - - /braces@3.0.2: - resolution: {integrity: sha512-b8um+L1RzM3WDSzvhm6gIz1yfTbBt6YTlcEKAvsmqCZZFw46z626lVj9j1yEPW33H5H+lBQpZMP1k8l+78Ha0A==} - engines: {node: '>=8'} - dependencies: - fill-range: 7.0.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 - dependencies: - caniuse-lite: 1.0.30001570 - electron-to-chromium: 1.4.613 - node-releases: 2.0.14 - update-browserslist-db: 1.0.13(browserslist@4.22.2) - dev: true - - /buffer-alloc-unsafe@1.1.0: - resolution: {integrity: sha512-TEM2iMIEQdJ2yjPJoSIsldnleVaAk1oW3DBVUykyOLsEsFmEc9kn+SFFPz+gl54KQNxlDnAwCXosOS9Okx2xAg==} - dev: true - - /buffer-alloc@1.2.0: - resolution: {integrity: sha512-CFsHQgjtW1UChdXgbyJGtnm+O/uLQeZdtbDo8mfUgYXCHSM1wgrVxXm6bSyrUuErEb+4sYVGCzASBRot7zyrow==} - dependencies: - buffer-alloc-unsafe: 1.1.0 - buffer-fill: 1.0.0 - dev: true - - /buffer-crc32@0.2.13: - resolution: {integrity: sha512-VO9Ht/+p3SN7SKWqcrgEzjGbRSJYTx+Q1pTQC0wrWqHx0vpJraQ6GtHx8tvcg1rlK1byhU5gccxgOgj7B0TDkQ==} - dev: true - - /buffer-fill@1.0.0: - resolution: {integrity: sha512-T7zexNBwiiaCOGDg9xNX9PBmjrubblRkENuptryuI64URkXDFum9il/JGL8Lm8wYfAXpredVXXZz7eMHilimiQ==} - dev: true - - /buffer-from@1.1.2: - resolution: {integrity: sha512-E+XQCRwSbaaiChtv6k6Dwgc+bx+Bs6vuKJHHl5kox/BaKbhiXzqQOwK4cO22yElGp2OCmjwVhT3HmxgyPGnJfQ==} - dev: true - - /buffer@5.7.1: - resolution: {integrity: sha512-EHcyIPBQ4BSGlvjB16k5KgAJ27CIsHY/2JBmCRReo48y9rQ3MaUzWX3KVlBa4U7MyX02HdVj0K7C3WaB3ju7FQ==} - dependencies: - base64-js: 1.5.1 - ieee754: 1.2.1 - dev: true - - /bytes32@0.0.3: - resolution: {integrity: sha512-uQM5zGcelcBEk0R7vkIRVN7GnrDd2S5EeWrxv7dSFLPVoI5FwYiSYOOLaFwnsav0oSr3hZQ6mFq6QNi8Vt6n8w==} - hasBin: true - 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'} - dev: true - - /cacheable-lookup@5.0.4: - resolution: {integrity: sha512-2/kNscPhpcxrOigMZzbiWF7dz8ilhb/nIHU3EyZiXWXpeq/au8qJ8VhdftMkty3n7Gj6HIGalQG8oiBNB3AJgA==} - engines: {node: '>=10.6.0'} - dev: true - - /cacheable-request@7.0.4: - resolution: {integrity: sha512-v+p6ongsrp0yTGbJXjgxPow2+DL93DASP4kXCDKb8/bwRtt9OEF3whggkkDkGNzgcWy2XaF4a8nZglC7uElscg==} - engines: {node: '>=8'} - dependencies: - clone-response: 1.0.2 - get-stream: 5.2.0 - http-cache-semantics: 4.1.1 - keyv: 4.5.4 - lowercase-keys: 2.0.0 - normalize-url: 6.1.0 - responselike: 2.0.1 - dev: true - - /cachedir@2.4.0: - resolution: {integrity: sha512-9EtFOZR8g22CL7BWjJ9BUx1+A/djkofnyW3aOXZORNW2kxoUpx2h+uN2cOqwPmFhnpVmxg+KW2OjOSgChTEvsQ==} - engines: {node: '>=6'} - dev: true - - /caching-transform@4.0.0: - resolution: {integrity: sha512-kpqOvwXnjjN44D89K5ccQC+RUrsy7jB/XLlRrx0D7/2HNcTPqzsb6XgYoErwko6QsV184CA2YgS1fxDiiDZMWA==} - engines: {node: '>=8'} - 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.5: - resolution: {integrity: sha512-C3nQxfFZxFRVoJoGKKI8y3MOEo129NQ+FgQ08iye+Mk4zNZZGdjfs06bVTr+DBSlA66Q2VEcMki/cUCP4SercQ==} - dependencies: - function-bind: 1.1.2 - get-intrinsic: 1.2.2 - set-function-length: 1.1.1 - dev: true - - /camel-case@4.1.2: - resolution: {integrity: sha512-gxGWBrTT1JuMx6R+o5PTXMmUnhnVzLQ9SNutD4YqKtI6ap897t3tKECYla6gCWEkplXnlNybEkZg9GEGxKFCgw==} - dependencies: - pascal-case: 3.1.2 - tslib: 2.6.2 - dev: true - - /camelcase@5.3.1: - resolution: {integrity: sha512-L28STB170nwWS63UjtlEOE3dldQApaJXZkOI1uMFfzf3rRuPegHaHesyee+YxQ+W6SvRDQV6UrdOdRiR153wJg==} - engines: {node: '>=6'} - dev: true - - /camelcase@7.0.1: - resolution: {integrity: sha512-xlx1yCK2Oc1APsPXDL2LdlNP6+uu8OCDdhOBSVT279M/S+y75O30C2VuD8T2ogdePBBl7PfPF4504tnLgX3zfw==} - engines: {node: '>=14.16'} - dev: true - - /caniuse-lite@1.0.30001570: - resolution: {integrity: sha512-+3e0ASu4sw1SWaoCtvPeyXp+5PsjigkSt8OXZbF9StH5pQWbxEjLAZE3n8Aup5udop1uRiKA7a4utUk/uoSpUw==} - dev: true - - /caseless@0.12.0: - resolution: {integrity: sha512-4tYFyifaFfGacoiObjJegolkwSU4xQNGbVgUiNYVUxbQ2x2lUsFvY4hVgVzGiIe6WLOPqycWXA40l+PWsxthUw==} - dev: true - - /chalk-template@0.4.0: - resolution: {integrity: sha512-/ghrgmhfY8RaSdeo43hNXxpoHAtxdbskUHjPpfqUWGttFgycUhYPGx3YZBCnUCvOa7Doivn1IZec3DEGFoMgLg==} - engines: {node: '>=12'} - dependencies: - chalk: 4.1.2 - dev: true - - /chalk@2.4.2: - resolution: {integrity: sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ==} - engines: {node: '>=4'} - dependencies: - ansi-styles: 3.2.1 - escape-string-regexp: 1.0.5 - supports-color: 5.5.0 - dev: true - - /chalk@4.1.2: - resolution: {integrity: sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==} - engines: {node: '>=10'} - dependencies: - ansi-styles: 4.3.0 - supports-color: 7.2.0 - dev: true - - /chalk@5.0.1: - resolution: {integrity: sha512-Fo07WOYGqMfCWHOzSXOt2CxDbC6skS/jO9ynEcmpANMoPrD+W1r1K6Vx7iNm+AQmETU1Xr2t+n8nzkV9t6xh3w==} - engines: {node: ^12.17.0 || ^14.13 || >=16.0.0} - dev: true - - /chance@1.1.11: - resolution: {integrity: sha512-kqTg3WWywappJPqtgrdvbA380VoXO2eu9VCV895JgbyHsaErXdyHK9LOZ911OvAk6L0obK7kDk9CGs8+oBawVA==} - dev: true - - /check-more-types@2.24.0: - resolution: {integrity: sha512-Pj779qHxV2tuapviy1bSZNEL1maXr13bPYpsvSDB68HlYcYuhlDrmGd63i0JHMCLKzc7rUSNIrpdJlhVlNwrxA==} - engines: {node: '>= 0.8.0'} - dev: true - - /chokidar@3.5.3: - resolution: {integrity: sha512-Dr3sfKRP6oTcjf2JmUmFJfeVMvXBdegxB0iVQ5eb2V10uFJUCAS8OByZdVAyVb8xXNz3GjjTgj9kLWsZTqE6kw==} - engines: {node: '>= 8.10.0'} - dependencies: - anymatch: 3.1.3 - braces: 3.0.2 - glob-parent: 5.1.2 - is-binary-path: 2.1.0 - is-glob: 4.0.3 - normalize-path: 3.0.0 - readdirp: 3.6.0 - optionalDependencies: - fsevents: 2.3.3 - dev: true - - /chrome-trace-event@1.0.3: - resolution: {integrity: sha512-p3KULyQg4S7NIHixdwbGX+nFHkoBiA4YQmyWtjb8XngSKV124nJmRysgAeujbUVb15vh+RvFUfCPqU7rXk+hZg==} - engines: {node: '>=6.0'} - dev: true - - /ci-info@3.9.0: - resolution: {integrity: sha512-NIxF55hv4nSqQswkAeiOi1r83xy8JldOFDTWiug55KBu9Jnblncd2U6ViHmYgHf01TPZS77NJBhBMKdWj9HQMQ==} - engines: {node: '>=8'} - dev: true - - /clean-css@4.2.4: - resolution: {integrity: sha512-EJUDT7nDVFDvaQgAo2G/PJvxmp1o/c6iXLbswsBbUFXi1Nr+AjA2cKmfbKDMjMvzEe75g3P6JkaDDAKk96A85A==} - engines: {node: '>= 4.0'} - dependencies: - source-map: 0.6.1 - dev: true - - /clean-css@5.3.3: - resolution: {integrity: sha512-D5J+kHaVb/wKSFcyyV75uCn8fiY4sV38XJoe4CUyGQ+mOU/fMVYUdH1hJC+CJQ5uY3EnW27SbJYS4X8BiLrAFg==} - engines: {node: '>= 10.0'} - dependencies: - source-map: 0.6.1 - dev: true - - /clean-stack@2.2.0: - resolution: {integrity: sha512-4diC9HaTE+KRAMWhDhrGOECgWZxoevMc5TlkObMqNSsVU62PYzXZ/SMTjzyGAFF1YusgxGcSWTEXBhp0CPwQ1A==} - engines: {node: '>=6'} - dev: true - - /cli-boxes@3.0.0: - resolution: {integrity: sha512-/lzGpEWL/8PfI0BmBOPRwp0c/wFNX1RdUML3jK/RcSBA9T8mZDdQpqYBKtCFTOfQbwPqWEOpjqW+Fnayc0969g==} - engines: {node: '>=10'} - dev: true - - /cli-cursor@3.1.0: - resolution: {integrity: sha512-I/zHAwsKf9FqGoXM4WWRACob9+SNukZTd94DWF57E4toouRulbCxcUh6RKUEOQlYTHJnzkPMySvPNaaSLNfLZw==} - engines: {node: '>=8'} - dependencies: - restore-cursor: 3.1.0 - dev: true - - /cli-table3@0.6.3: - resolution: {integrity: sha512-w5Jac5SykAeZJKntOxJCrm63Eg5/4dhMWIcuTbo9rpE+brgaSZo0RuNJZeOyMgsUdhDeojvgyQLmjI+K50ZGyg==} - engines: {node: 10.* || >= 12.*} - dependencies: - string-width: 4.2.3 - optionalDependencies: - '@colors/colors': 1.5.0 - dev: true - - /cli-truncate@2.1.0: - resolution: {integrity: sha512-n8fOixwDD6b/ObinzTrp1ZKFzbgvKZvuz/TvejnLn1aQfC6r52XEx85FmuC+3HI+JM7coBRXUvNqEU2PHVrHpg==} - engines: {node: '>=8'} - dependencies: - slice-ansi: 3.0.0 - string-width: 4.2.3 - 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@6.0.0: - resolution: {integrity: sha512-t6wbgtoCXvAzst7QgXxJYqPt0usEfbgQdftEPbLL/cvv6HPE5VgvqCuAIDR0NgU52ds6rFwqrgakNLrHEjCbrQ==} - dependencies: - string-width: 4.2.3 - strip-ansi: 6.0.1 - wrap-ansi: 6.2.0 - dev: true - - /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-response@1.0.2: - resolution: {integrity: sha512-yjLXh88P599UOyPTFX0POsd7WxnbsVsGohcwzHOLspIhhpalPw1BcqED8NblyZLKcGrL8dTgMlcaZxV2jAD41Q==} - dependencies: - mimic-response: 1.0.1 - dev: true - - /color-convert@1.9.3: - resolution: {integrity: sha512-QfAUtd+vFdAtFQcC8CCyYt1fYWxSqAiK2cSD6zDB8N3cpsEBAvRxp9zOGg6G/SHHJYAT88/az/IuDGALsNVbGg==} - dependencies: - color-name: 1.1.3 - dev: true - - /color-convert@2.0.1: - resolution: {integrity: sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==} - engines: {node: '>=7.0.0'} - dependencies: - color-name: 1.1.4 - dev: true - - /color-name@1.1.3: - resolution: {integrity: sha512-72fSenhMw2HZMTVHeCA9KCmpEIbzWiQsjN+BHcBbS9vr1mtt+vJjPdksIBNUmKAW8TFUDPJK5SUU3QhE9NEXDw==} - dev: true - - /color-name@1.1.4: - resolution: {integrity: sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==} - dev: true - - /colorette@2.0.20: - resolution: {integrity: sha512-IfEDxwoWIjkeXL1eXcDiow4UbKjhLdq6/EuSVR9GMN7KVH3r9gQ83e73hsz1Nd1T3ijd5xv1wcWRYO+D6kCI2w==} - dev: true - - /combined-stream@1.0.8: - resolution: {integrity: sha512-FQN4MRfuJeHf7cBbBMJFXhKSDq+2kAArBlmRBvcvFE5BB1HZKXtSFASDhdlz9zOYwxh8lDdnvmMOe/+5cdoEdg==} - engines: {node: '>= 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 - - /commander@11.1.0: - resolution: {integrity: sha512-yPVavfyCcRhmorC7rWlkHn15b4wDVgVmBA7kV4QVBsF7kv/9TKJAbAXVTxvTnwP8HHKjRCJDClKbciiYS7p0DQ==} - engines: {node: '>=16'} - dev: true - - /commander@2.20.3: - resolution: {integrity: sha512-GpVkmM8vF2vQUkj2LvZmD35JxeJOLCwJ9cUkugyk2nuhbv3+mJvpLYYt+0+USMxE+oj+ey/lJEnhZw75x/OMcQ==} - dev: true - - /commander@4.1.1: - resolution: {integrity: sha512-NOKm8xhkzAjzFx8B2v5OAHT+u5pRQc2UCa2Vq9jYL/31o2wi9mxBA7LIFs3sV5VSC49z6pEhfbMULvShKj26WA==} - engines: {node: '>= 6'} - dev: true - - /commander@6.2.1: - resolution: {integrity: sha512-U7VdrJFnJgo4xjrHpTzu0yrHPGImdsmD95ZlgYSEajAn2JKzDhDTPG9kBTefmObL2w/ngeZnilk+OV9CG3d7UA==} - engines: {node: '>= 6'} - dev: true - - /commander@8.3.0: - resolution: {integrity: sha512-OkTL9umf+He2DZkUq8f8J9of7yL6RJKI24dVITBmNfZBmri9zYZQrKkuXiKhyfPSu8tUhnVBB1iKXevvnlR4Ww==} - engines: {node: '>= 12'} - dev: true - - /common-path-prefix@3.0.0: - resolution: {integrity: sha512-QE33hToZseCH3jS0qN96O/bSh3kaw/h+Tq7ngyY9eWDUnTlTNUyqfqvCXioLe5Na5jFsL78ra/wuBU4iuEgd4w==} - dev: true - - /common-tags@1.8.2: - resolution: {integrity: sha512-gk/Z852D2Wtb//0I+kRFNKKE9dIIVirjoqPoA1wJU+XePVXZfGeBpk45+A1rKO4Q43prqWBNY/MiIeRLbPWUaA==} - engines: {node: '>=4.0.0'} - dev: true - - /commondir@1.0.1: - resolution: {integrity: sha512-W9pAhw0ja1Edb5GVdIF1mjZw/ASI0AlShXM83UUGe2DVr5TdAPEA1OA8m/g8zWp9x6On7gqufY+FatDbC3MDQg==} - dev: true - - /compressible@2.0.18: - resolution: {integrity: sha512-AF3r7P5dWxL8MxyITRMlORQNaOA2IkAFaTr4k7BUumjPtRpGDTZpl0Pb1XCO6JeDCBdp126Cgs9sMxqSjgYyRg==} - engines: {node: '>= 0.6'} - dependencies: - mime-db: 1.52.0 - dev: true - - /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 - - /concat-map@0.0.1: - resolution: {integrity: sha512-/Srv4dswyQNBfohGpz9o6Yb3Gz3SrUDqBH5rTuhGR7ahtlbYKnVxw2bCFMRljaA7EXHaXZ8wsHdodFvbkhKmqg==} - dev: true - - /connect-history-api-fallback@2.0.0: - resolution: {integrity: sha512-U73+6lQFmfiNPrYbXqr6kZ1i1wiRqXnp2nhMsINseWXO8lDau0LGEffJ8kQi4EjLZympVgRdvqjAgiZ1tgzDDA==} - engines: {node: '>=0.8'} - dev: true - - /content-disposition@0.5.2: - resolution: {integrity: sha512-kRGRZw3bLlFISDBgwTSA1TMBFN6J6GWDeubmDE3AF+3+yXL8hTWv8r5rkLbqYXY4RjPk/EzHnClI3zQf1cFmHA==} - engines: {node: '>= 0.6'} - dev: true - - /content-disposition@0.5.4: - resolution: {integrity: sha512-FveZTNuGw04cxlAiWbzi6zTAL/lhehaWbTtgluJh4/E95DqMwTmha3KZN1aAWA8cFIhHzMZUvLevkw5Rqk+tSQ==} - engines: {node: '>= 0.6'} - dependencies: - safe-buffer: 5.2.1 - dev: true - - /content-type@1.0.5: - resolution: {integrity: sha512-nTjqfcBFEipKdXCv4YDQWCfmcLZKm81ldF0pAopTvyrFGVbcR6P/VAAd5G7N+0tTr8QqiU0tFadD6FK4NtJwOA==} - engines: {node: '>= 0.6'} - dev: true - - /convert-source-map@1.9.0: - resolution: {integrity: sha512-ASFBup0Mz1uyiIjANan1jzLQami9z1PoYSZCiiYW2FczPbenXc45FZdBZLzOT+r6+iciuEModtmCti+hjaAk0A==} - dev: true - - /convert-source-map@2.0.0: - resolution: {integrity: sha512-Kvp459HrV2FEJ1CAsi1Ku+MY3kasH19TFykTz2xWmMeq6bk2NU3XXvfJ+Q61m0xktWwt+1HSYf3JZsTms3aRJg==} - dev: true - - /cookie-signature@1.0.6: - resolution: {integrity: sha512-QADzlaHc8icV8I7vbaJXJwod9HWYp8uCqf1xa4OfNu1T7JVxQIrUgOWtHdNDtPiywmFbiS12VjotIXLrKM3orQ==} - dev: true - - /cookie@0.5.0: - resolution: {integrity: sha512-YZ3GUyn/o8gfKJlnlX7g7xq4gyO6OSuhGPKaaGssGB2qgDUS0gPgtTvoyZLTt9Ab6dC4hfc9dV5arkvc/OCmrw==} - engines: {node: '>= 0.6'} - dev: true - - /core-js-compat@3.34.0: - resolution: {integrity: sha512-4ZIyeNbW/Cn1wkMMDy+mvrRUxrwFNjKwbhCfQpDd+eLgYipDqp8oGFGtLmhh18EDPKA0g3VUBYOxQGGwvWLVpA==} - dependencies: - browserslist: 4.22.2 - dev: true - - /core-js-pure@3.34.0: - resolution: {integrity: sha512-pmhivkYXkymswFfbXsANmBAewXx86UBfmagP+w0wkK06kLsLlTK5oQmsURPivzMkIBQiYq2cjamcZExIwlFQIg==} - requiresBuild: true - dev: true - - /core-js@2.6.12: - resolution: {integrity: sha512-Kb2wC0fvsWfQrgk8HU5lW6U/Lcs8+9aaYcy4ZFc6DDlo4nZ7n70dEgE5rtR0oG6ufKDUnrwfWL1mXR5ljDatrQ==} - deprecated: core-js@<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. - requiresBuild: true - dev: true - - /core-js@3.34.0: - resolution: {integrity: sha512-aDdvlDder8QmY91H88GzNi9EtQi2TjvQhpCX6B1v/dAZHU1AuLgHvRh54RiOerpEhEW46Tkf+vgAViB/CWC0ag==} - requiresBuild: true - dev: true - - /core-util-is@1.0.2: - resolution: {integrity: sha512-3lqz5YjWTYnW6dlDa5TLaTCcShfar1e40rmcJVwCBJC6mWlFuj0eCHIElmG1g5kyuJ/GD+8Wn4FFCcz4gJPfaQ==} - dev: true - - /core-util-is@1.0.3: - resolution: {integrity: sha512-ZQBvi1DcpJ4GDqanjucZ2Hj3wEO5pZDS89BWbkcrvdxksJorwUDDZamX9ldFkp9aw2lmBDLgkObEA4DWNJ9FYQ==} - dev: true - - /cross-spawn@7.0.3: - resolution: {integrity: sha512-iRDPJKUPVEND7dHPO8rkbOnPpyDygcDFtWjpeWNCgy8WP2rXcxXL8TskReQl6OrB2G7+UJrags1q15Fudc7G6w==} - engines: {node: '>= 8'} - dependencies: - path-key: 3.1.1 - shebang-command: 2.0.0 - which: 2.0.2 - dev: true - - /css-select@4.3.0: - resolution: {integrity: sha512-wPpOYtnsVontu2mODhA19JrqWxNsfdatRKd64kmpRbQgh1KtItko5sTnEpPdpSaJszTOhEMlF/RPz28qj4HqhQ==} - dependencies: - boolbase: 1.0.0 - css-what: 6.1.0 - domhandler: 4.3.1 - domutils: 2.8.0 - nth-check: 2.1.1 - dev: true - - /css-what@6.1.0: - resolution: {integrity: sha512-HTUrgRJ7r4dsZKU6GjmpfRK1O76h97Z8MfS1G0FozR+oF2kG6Vfe8JE6zwrkbxigziPHinCJ+gCPjA9EaBDtRw==} - engines: {node: '>= 6'} - dev: true - - /csstype@3.1.3: - resolution: {integrity: sha512-M1uQkMl8rQK/szD0LNhtqxIPLpimGm8sOBwU7lLnCpSbTyY3yeU1Vc7l4KT5zT4s/yOxHH5O7tIuuLOCnLADRw==} - dev: true - - /cypress-wait-until@2.0.1: - resolution: {integrity: sha512-+IyVnYNiaX1+C+V/LazrJWAi/CqiwfNoRSrFviECQEyolW1gDRy765PZosL2alSSGK8V10Y7BGfOQyZUDgmnjQ==} - dev: true - - /cypress@12.17.3: - resolution: {integrity: sha512-/R4+xdIDjUSLYkiQfwJd630S81KIgicmQOLXotFxVXkl+eTeVO+3bHXxdi5KBh/OgC33HWN33kHX+0tQR/ZWpg==} - engines: {node: ^14.0.0 || ^16.0.0 || >=18.0.0} - hasBin: true - requiresBuild: true - dependencies: - '@cypress/request': 3.0.1 - '@cypress/xvfb': 1.2.4(supports-color@8.1.1) - '@types/node': 16.18.68 - '@types/sinonjs__fake-timers': 8.1.1 - '@types/sizzle': 2.3.8 - arch: 2.2.0 - blob-util: 2.0.2 - bluebird: 3.7.2 - buffer: 5.7.1 - cachedir: 2.4.0 - chalk: 4.1.2 - check-more-types: 2.24.0 - cli-cursor: 3.1.0 - cli-table3: 0.6.3 - commander: 6.2.1 - common-tags: 1.8.2 - dayjs: 1.11.10 - debug: 4.3.4(supports-color@8.1.1) - enquirer: 2.4.1 - eventemitter2: 6.4.7 - execa: 4.1.0 - executable: 4.1.1 - extract-zip: 2.0.1(supports-color@8.1.1) - figures: 3.2.0 - fs-extra: 9.1.0 - getos: 3.2.1 - is-ci: 3.0.1 - is-installed-globally: 0.4.0 - lazy-ass: 1.6.0 - listr2: 3.14.0(enquirer@2.4.1) - lodash: 4.17.21 - log-symbols: 4.1.0 - minimist: 1.2.8 - ospath: 1.2.2 - pretty-bytes: 5.6.0 - proxy-from-env: 1.0.0 - request-progress: 3.0.0 - semver: 7.5.4 - supports-color: 8.1.1 - tmp: 0.2.1 - untildify: 4.0.0 - yauzl: 2.10.0 - dev: true - - /dashdash@1.14.1: - resolution: {integrity: sha512-jRFi8UDGo6j+odZiEpjazZaWqEal3w/basFjQHQEwVtZJGDpxbH1MeYluwCS8Xq5wmLJooDlMgvVarmWfGM44g==} - engines: {node: '>=0.10'} - dependencies: - assert-plus: 1.0.0 - dev: true - - /dayjs@1.11.10: - resolution: {integrity: sha512-vjAczensTgRcqDERK0SR2XMwsF/tSvnvlv6VcF2GIhg6Sx4yOIt/irsr1RDJsKiIyBzJDpCoXiWWq28MqH2cnQ==} - dev: true - - /debug@2.6.9: - resolution: {integrity: sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==} - peerDependencies: - supports-color: '*' - peerDependenciesMeta: - supports-color: - optional: true - dependencies: - ms: 2.0.0 - dev: true - - /debug@3.2.7(supports-color@8.1.1): - resolution: {integrity: sha512-CFjzYYAi4ThfiQvizrFQevTTXHtnCqWfe7x1AhgEscTz6ZbLbfoLRLPugTQyBth6f8ZERVUSyWHFD/7Wu4t1XQ==} - peerDependencies: - supports-color: '*' - peerDependenciesMeta: - supports-color: - optional: true - dependencies: - ms: 2.1.3 - supports-color: 8.1.1 - 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 - dependencies: - ms: 2.1.2 - supports-color: 8.1.1 - dev: true - - /decamelize@1.2.0: - resolution: {integrity: sha512-z2S+W9X73hAUUki+N+9Za2lBlun89zigOyGrsax+KUQ6wKW4ZoWpEYBkGhQjwAjjDCkWxhY0VKEhk8wzY7F5cA==} - engines: {node: '>=0.10.0'} - dev: true - - /decompress-response@6.0.0: - resolution: {integrity: sha512-aW35yZM6Bb/4oJlZncMH2LCoZtJXTRxES17vE3hoRiowU2kWHaJKFkSBDnDR+cm9J+9QhXmREyIfv0pji9ejCQ==} - engines: {node: '>=10'} - dependencies: - mimic-response: 3.1.0 - dev: true - - /decompress-tar@4.1.1: - resolution: {integrity: sha512-JdJMaCrGpB5fESVyxwpCx4Jdj2AagLmv3y58Qy4GE6HMVjWz1FeVQk1Ct4Kye7PftcdOo/7U7UKzYBJgqnGeUQ==} - engines: {node: '>=4'} - dependencies: - file-type: 5.2.0 - is-stream: 1.1.0 - tar-stream: 1.6.2 - dev: true - - /decompress-tarbz2@4.1.1: - resolution: {integrity: sha512-s88xLzf1r81ICXLAVQVzaN6ZmX4A6U4z2nMbOwobxkLoIIfjVMBg7TeguTUXkKeXni795B6y5rnvDw7rxhAq9A==} - engines: {node: '>=4'} - dependencies: - decompress-tar: 4.1.1 - file-type: 6.2.0 - is-stream: 1.1.0 - seek-bzip: 1.0.6 - unbzip2-stream: 1.4.3 - dev: true - - /decompress-targz@4.1.1: - resolution: {integrity: sha512-4z81Znfr6chWnRDNfFNqLwPvm4db3WuZkqV+UgXQzSngG3CEKdBkw5jrv3axjjL96glyiiKjsxJG3X6WBZwX3w==} - engines: {node: '>=4'} - dependencies: - decompress-tar: 4.1.1 - file-type: 5.2.0 - is-stream: 1.1.0 - dev: true - - /decompress-unzip@4.0.1: - resolution: {integrity: sha512-1fqeluvxgnn86MOh66u8FjbtJpAFv5wgCT9Iw8rcBqQcCo5tO8eiJw7NNTrvt9n4CRBVq7CstiS922oPgyGLrw==} - engines: {node: '>=4'} - dependencies: - file-type: 3.9.0 - get-stream: 2.3.1 - pify: 2.3.0 - yauzl: 2.10.0 - dev: true - - /decompress@4.2.1: - resolution: {integrity: sha512-e48kc2IjU+2Zw8cTb6VZcJQ3lgVbS4uuB1TfCHbiZIP/haNXm+SVyhu+87jts5/3ROpd82GSVCoNs/z8l4ZOaQ==} - engines: {node: '>=4'} - dependencies: - decompress-tar: 4.1.1 - decompress-tarbz2: 4.1.1 - decompress-targz: 4.1.1 - decompress-unzip: 4.0.1 - graceful-fs: 4.2.11 - make-dir: 1.3.0 - pify: 2.3.0 - strip-dirs: 2.1.0 - dev: true - - /deep-equal@2.2.3: - resolution: {integrity: sha512-ZIwpnevOurS8bpT4192sqAowWM76JDKSHYzMLty3BZGSswgq6pBaH3DhCSW5xVAZICZyKdOBPjwww5wfgT/6PA==} - engines: {node: '>= 0.4'} - dependencies: - array-buffer-byte-length: 1.0.0 - call-bind: 1.0.5 - es-get-iterator: 1.1.3 - get-intrinsic: 1.2.2 - 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.5 - regexp.prototype.flags: 1.5.1 - side-channel: 1.0.4 - which-boxed-primitive: 1.0.2 - which-collection: 1.0.1 - which-typed-array: 1.1.13 - dev: true - - /deep-extend@0.6.0: - resolution: {integrity: sha512-LOHxIOaPYdHlJRtCQfDIVZtfw/ufM8+rVj649RIHzcm/vGwQRXFt6OPqIFWsm2XEMrNIEtWR64sY1LEKD2vAOA==} - engines: {node: '>=4.0.0'} - dev: true - - /default-gateway@6.0.3: - resolution: {integrity: sha512-fwSOJsbbNzZ/CUFpqFBqYfYNLj1NbMPm8MMCIzHjC83iSJRBEGmDUxU+WP661BaBQImeC2yHwXtz+P/O9o+XEg==} - engines: {node: '>= 10'} - dependencies: - execa: 5.1.1 - dev: true - - /default-require-extensions@3.0.1: - resolution: {integrity: sha512-eXTJmRbm2TIt9MgWTsOH1wEuhew6XGZcMeGKCtLedIg/NCsg1iBePXkceTdK4Fii7pzmN9tGsZhKzZ4h7O/fxw==} - engines: {node: '>=8'} - dependencies: - strip-bom: 4.0.0 - dev: true - - /defer-to-connect@2.0.1: - resolution: {integrity: sha512-4tvttepXG1VaYGrRibk5EwJd1t4udunSOVMdLSAL6mId1ix438oPwPZMALY41FCijukO1L0twNcGsdzS7dHgDg==} - engines: {node: '>=10'} - dev: true - - /define-data-property@1.1.1: - resolution: {integrity: sha512-E7uGkTzkk1d0ByLeSc6ZsFS79Axg+m1P/VsgYsxHgiuc3tFSj+MjMIwe90FC4lOAZzNBdY7kkO2P2wKdsQ1vgQ==} - engines: {node: '>= 0.4'} - dependencies: - get-intrinsic: 1.2.2 - gopd: 1.0.1 - has-property-descriptors: 1.0.1 - dev: true - - /define-lazy-prop@2.0.0: - resolution: {integrity: sha512-Ds09qNh8yw3khSjiJjiUInaGX9xlqZDY7JVryGxdxV7NPeuqQfplOpQ66yJFZut3jLa5zOwkXw1g9EI2uKh4Og==} - engines: {node: '>=8'} - dev: true - - /define-properties@1.2.1: - resolution: {integrity: sha512-8QmQKqEASLd5nx0U1B1okLElbUuuttJ/AnYmRXbbbGDWh6uS208EjD4Xqq/I9wK7u0v6O08XhTWnt5XtEbR6Dg==} - engines: {node: '>= 0.4'} - dependencies: - define-data-property: 1.1.1 - has-property-descriptors: 1.0.1 - object-keys: 1.1.1 - dev: true - - /delayed-stream@1.0.0: - resolution: {integrity: sha512-ZySD7Nf91aLB0RxL4KGrKHBXl7Eds1DAmEdcoVawXnLD7SDhpNgtuII2aAkg7a7QS41jxPSZ17p4VdGnMHk3MQ==} - engines: {node: '>=0.4.0'} - dev: true - - /depd@1.1.2: - resolution: {integrity: sha512-7emPTl6Dpo6JRXOXjLRxck+FlLRX5847cLKEn00PLAgc3g2hTZZgr+e4c2v6QpSmLeFP3n5yUo7ft6avBK/5jQ==} - engines: {node: '>= 0.6'} - dev: true - - /depd@2.0.0: - resolution: {integrity: sha512-g7nH6P6dyDioJogAAGprGpCtVImJhpPk/roCzdb3fIh61/s/nPsfR6onyMwkCAR/OlC3yBC0lESvUoQEAssIrw==} - engines: {node: '>= 0.8'} - dev: true - - /destroy@1.2.0: - resolution: {integrity: sha512-2sJGJTaXIIaR1w4iJSNoN0hnMY7Gpc/n8D4qSCJw8QqFWXf7cuAgnEHxBpweaVcPevC2l3KpjYCx3NypQQgaJg==} - engines: {node: '>= 0.8', npm: 1.2.8000 || >= 1.4.16} - dev: true - - /detect-node@2.1.0: - resolution: {integrity: sha512-T0NIuQpnTvFDATNuHN5roPwSBG83rFsuO+MXXH9/3N1eFbn4wcPjttvjMLEPWJ0RGUYgQE7cGgS3tNxbqCGM7g==} - dev: true - - /dir-glob@3.0.1: - resolution: {integrity: sha512-WkrWp9GR4KXfKGYzOLmTuGVi1UWFfws377n9cc55/tb6DuqyF6pcQ5AbiHEshaDpY9v6oaSr2XCDidGmMwdzIA==} - engines: {node: '>=8'} - dependencies: - path-type: 4.0.0 - dev: true - - /dns-equal@1.0.0: - resolution: {integrity: sha512-z+paD6YUQsk+AbGCEM4PrOXSss5gd66QfcVBFTKR/HpFL9jCqikS94HYwKww6fQyO7IxrIIyUu+g0Ka9tUS2Cg==} - dev: true - - /dns-packet@5.6.1: - resolution: {integrity: sha512-l4gcSouhcgIKRvyy99RNVOgxXiicE+2jZoNmaNmZ6JXiGajBOJAesk1OBlJuM5k2c+eudGdLxDqXuPCKIj6kpw==} - engines: {node: '>=6'} - dependencies: - '@leichtgewicht/ip-codec': 2.0.4 - dev: true - - /dom-accessibility-api@0.5.16: - resolution: {integrity: sha512-X7BJ2yElsnOJ30pZF4uIIDfBEVgF4XEBxL9Bxhy6dnrm5hkzqmsWHGTiHqRiITNhMyFLyAiWndIJP7Z1NTteDg==} - dev: true - - /dom-converter@0.2.0: - resolution: {integrity: sha512-gd3ypIPfOMr9h5jIKq8E3sHOTCjeirnl0WK5ZdS1AW0Odt0b1PaWaHdJ4Qk4klv+YB9aJBS7mESXjFoDQPu6DA==} - dependencies: - utila: 0.4.0 - dev: true - - /dom-serializer@1.4.1: - resolution: {integrity: sha512-VHwB3KfrcOOkelEG2ZOfxqLZdfkil8PtJi4P8N2MMXucZq2yLp75ClViUlOVwyoHEDjYU433Aq+5zWP61+RGag==} - 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 - - /domhandler@4.3.1: - resolution: {integrity: sha512-GrwoxYN+uWlzO8uhUXRl0P+kHE4GtVPfYzVLcUxPL7KNdHKj66vvlhiweIHqYYXWlw+T8iLMp42Lm67ghw4WMQ==} - engines: {node: '>= 4'} - dependencies: - domelementtype: 2.3.0 - dev: true - - /domutils@2.8.0: - resolution: {integrity: sha512-w96Cjofp72M5IIhpjgobBimYEfoPjx1Vx0BSX9P30WBdZW2WIKU0T1Bd0kz2eNZ9ikjKgHbEyKx8BB6H1L3h3A==} - 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 - dev: true - - /dotenv-parse-variables@2.0.0: - resolution: {integrity: sha512-/Tezlx6xpDqR6zKg1V4vLCeQtHWiELhWoBz5A/E0+A1lXN9iIkNbbfc4THSymS0LQUo8F1PMiIwVG8ai/HrnSA==} - engines: {node: '>= 8.3.0'} - dependencies: - debug: 4.3.4(supports-color@8.1.1) - is-string-and-not-blank: 0.0.2 - transitivePeerDependencies: - - supports-color - dev: true - - /dotenv@16.3.1: - resolution: {integrity: sha512-IPzF4w4/Rd94bA9imS68tZBaYyBWSCE47V1RGuMrB94iyTOIEwRmVL2x/4An+6mETpLrKJ5hQkB8W4kFAadeIQ==} - engines: {node: '>=12'} - dev: true - - /download@8.0.0: - resolution: {integrity: sha512-ASRY5QhDk7FK+XrQtQyvhpDKanLluEEQtWl/J7Lxuf/b+i8RYh997QeXvL85xitrmRKVlx9c7eTrcRdq2GS4eA==} - engines: {node: '>=10'} - dependencies: - archive-type: 4.0.0 - content-disposition: 0.5.4 - decompress: 4.2.1 - ext-name: 5.0.0 - file-type: 11.1.0 - filenamify: 3.0.0 - get-stream: 4.1.0 - got: 11.8.6 - make-dir: 2.1.0 - p-event: 2.3.1 - pify: 4.0.1 - dev: true - - /eastasianwidth@0.2.0: - resolution: {integrity: sha512-I88TYZWc9XiYHRQ4/3c5rjjfgkjhLyW2luGIheGERbNQ6OY7yTybanSpDXZa8y7VUP9YmDcYa+eyq4ca7iLqWA==} - dev: true - - /ecc-jsbn@0.1.2: - resolution: {integrity: sha512-eh9O+hwRHNbG4BLTjEl3nw044CkGm5X6LoaCf7LPp7UU8Qrt47JYNi6nPX8xjW97TKGKm1ouctg0QSpZe9qrnw==} - dependencies: - jsbn: 0.1.1 - safer-buffer: 2.1.2 - dev: true - - /ee-first@1.1.1: - resolution: {integrity: sha512-WMwm9LhRUo+WUaRN+vRuETqG89IgZphVSNkdFgeb6sS/E4OrDIN7t48CAewSHXc6C8lefD8KKfr5vY61brQlow==} - dev: true - - /electron-to-chromium@1.4.613: - resolution: {integrity: sha512-r4x5+FowKG6q+/Wj0W9nidx7QO31BJwmR2uEo+Qh3YLGQ8SbBAFuDFpTxzly/I2gsbrFwBuIjrMp423L3O5U3w==} - dev: true - - /email-addresses@3.1.0: - resolution: {integrity: sha512-k0/r7GrWVL32kZlGwfPNgB2Y/mMXVTq/decgLczm/j34whdaspNrZO8CnXPf1laaHxI6ptUlsnAxN+UAPw+fzg==} - dev: true - - /emoji-regex@8.0.0: - resolution: {integrity: sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A==} - dev: true - - /emoji-regex@9.2.2: - resolution: {integrity: sha512-L18DaJsXSUk2+42pv8mLs5jJT2hqFkFE4j21wOmgbUqsZ2hL72NsUU785g9RXgo3s0ZNgVl42TiHp3ZtOv/Vyg==} - dev: true - - /emojis-list@3.0.0: - resolution: {integrity: sha512-/kyM18EfinwXZbno9FyUGeFh87KC8HRQBQGildHZbEuRyWFOmv1U10o9BBp8XVZDVNNuQKyIGIu5ZYAAXJ0V2Q==} - engines: {node: '>= 4'} - dev: true - - /encodeurl@1.0.2: - resolution: {integrity: sha512-TPJXq8JqFaVYm2CWmPvnP2Iyo4ZSM7/QKcSmuMLDObfpH5fi7RUGmd/rTDf+rut/saiDiQEeVTNgAmJEdAOx0w==} - engines: {node: '>= 0.8'} - dev: true - - /end-of-stream@1.4.4: - resolution: {integrity: sha512-+uw1inIHVPQoaVuHzRyXd21icM+cnt4CzD5rW+NC1wjOUSTOs+Te7FOv7AhN7vS9x/oIyhLP5PR1H+phQAHu5Q==} - dependencies: - once: 1.4.0 - dev: true - - /enhanced-resolve@5.15.0: - resolution: {integrity: sha512-LXYT42KJ7lpIKECr2mAXIaMldcNCh/7E0KBKOu4KSfkHmP+mZmSs+8V5gBAqisWBy0OO4W5Oyys0GO1Y8KtdKg==} - engines: {node: '>=10.13.0'} - dependencies: - graceful-fs: 4.2.11 - tapable: 2.2.1 - dev: true - - /enquirer@2.4.1: - resolution: {integrity: sha512-rRqJg/6gd538VHvR3PSrdRBb/1Vy2YfzHqzvbhGIQpDRKIa4FgV/54b5Q1xYSxOOwKvjXweS26E0Q+nAMwp2pQ==} - engines: {node: '>=8.6'} - dependencies: - ansi-colors: 4.1.3 - strip-ansi: 6.0.1 - dev: true - - /entities@2.2.0: - resolution: {integrity: sha512-p92if5Nz619I0w+akJrLZH0MX0Pb5DX39XOwQTtXSdQQOaYH03S1uIQp4mhOZtAXrxq4ViO67YTiLBo2638o9A==} - dev: true - - /es-abstract@1.22.3: - resolution: {integrity: sha512-eiiY8HQeYfYH2Con2berK+To6GrK2RxbPawDkGq4UiCQQfZHb6wX9qQqkbpPqaxQFcl8d9QzZqo0tGE0VcrdwA==} - engines: {node: '>= 0.4'} - dependencies: - array-buffer-byte-length: 1.0.0 - arraybuffer.prototype.slice: 1.0.2 - available-typed-arrays: 1.0.5 - call-bind: 1.0.5 - es-set-tostringtag: 2.0.2 - es-to-primitive: 1.2.1 - function.prototype.name: 1.1.6 - get-intrinsic: 1.2.2 - get-symbol-description: 1.0.0 - globalthis: 1.0.3 - gopd: 1.0.1 - has-property-descriptors: 1.0.1 - has-proto: 1.0.1 - has-symbols: 1.0.3 - hasown: 2.0.0 - internal-slot: 1.0.6 - is-array-buffer: 3.0.2 - is-callable: 1.2.7 - is-negative-zero: 2.0.2 - is-regex: 1.1.4 - is-shared-array-buffer: 1.0.2 - is-string: 1.0.7 - is-typed-array: 1.1.12 - is-weakref: 1.0.2 - object-inspect: 1.13.1 - object-keys: 1.1.1 - object.assign: 4.1.5 - regexp.prototype.flags: 1.5.1 - safe-array-concat: 1.0.1 - safe-regex-test: 1.0.0 - string.prototype.trim: 1.2.8 - string.prototype.trimend: 1.0.7 - string.prototype.trimstart: 1.0.7 - typed-array-buffer: 1.0.0 - typed-array-byte-length: 1.0.0 - typed-array-byte-offset: 1.0.0 - typed-array-length: 1.0.4 - unbox-primitive: 1.0.2 - which-typed-array: 1.1.13 - dev: true - - /es-array-method-boxes-properly@1.0.0: - resolution: {integrity: sha512-wd6JXUmyHmt8T5a2xreUwKcGPq6f1f+WwIJkijUqiGcJz1qqnZgP6XIK+QyIWU5lT7imeNxUll48bziG+TSYcA==} - dev: true - - /es-get-iterator@1.1.3: - resolution: {integrity: sha512-sPZmqHBe6JIiTfN5q2pEi//TwxmAFHwj/XEuYjTuse78i8KxaqMTTzxPoFKuzRpDpTJ+0NAbpfenkmH2rePtuw==} - dependencies: - call-bind: 1.0.5 - get-intrinsic: 1.2.2 - 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: true - - /es-module-lexer@1.4.1: - resolution: {integrity: sha512-cXLGjP0c4T3flZJKQSuziYoq7MlT+rnvfZjfp7h+I7K9BNX54kP9nyWvdbwjQ4u1iWbOL4u96fgeZLToQlZC7w==} - dev: true - - /es-set-tostringtag@2.0.2: - resolution: {integrity: sha512-BuDyupZt65P9D2D2vA/zqcI3G5xRsklm5N3xCwuiy+/vKy8i0ifdsQP1sLgO4tZDSCaQUSnmC48khknGMV3D2Q==} - engines: {node: '>= 0.4'} - dependencies: - get-intrinsic: 1.2.2 - has-tostringtag: 1.0.0 - hasown: 2.0.0 - dev: true - - /es-to-primitive@1.2.1: - resolution: {integrity: sha512-QCOllgZJtaUo9miYBcLChTUaHNjJF3PYs1VidD7AwiEj1kYxKeQTctLAezAOH5ZKRH0g2IgPn6KwB4IT8iRpvA==} - engines: {node: '>= 0.4'} - dependencies: - is-callable: 1.2.7 - is-date-object: 1.0.5 - is-symbol: 1.0.4 - dev: true - - /es6-error@4.1.1: - resolution: {integrity: sha512-Um/+FxMr9CISWh0bi5Zv0iOD+4cFh5qLeks1qhAopKVAJw3drgKbKySikp7wGhDL0HPeaja0P5ULZrxLkniUVg==} - dev: true - - /escalade@3.1.1: - resolution: {integrity: sha512-k0er2gUkLf8O0zKJiAhmkTnJlTvINGv7ygDNPbeIsX/TJjGJZHuh9B2UxbsaEkmlEo9MfhrSzmhIlhRlI2GXnw==} - engines: {node: '>=6'} - dev: true - - /escape-html@1.0.3: - resolution: {integrity: sha512-NiSupZ4OeuGwr68lGIeym/ksIZMJodUGOSCZ/FSnTxcrekbvqrgdUxlJOMpijaKZVjAJrWrGs/6Jy8OMuyj9ow==} - dev: true - - /escape-string-regexp@1.0.5: - resolution: {integrity: sha512-vbRorB5FUQWvla16U8R/qgaFIya2qGzwDrNmCZuYKrbdSUMG6I1ZCGQRefkRVhuOkIGVne7BQ35DSfo1qvJqFg==} - engines: {node: '>=0.8.0'} - dev: true - - /eslint-scope@5.1.1: - resolution: {integrity: sha512-2NxwbF/hZ0KpepYN0cNbo+FN6XoK7GaHlQhgx/hIZl6Va0bF45RQOOwhLIy8lQDbuCiadSLCBnH2CFYquit5bw==} - engines: {node: '>=8.0.0'} - dependencies: - esrecurse: 4.3.0 - estraverse: 4.3.0 - dev: true - - /esprima@4.0.1: - resolution: {integrity: sha512-eGuFFw7Upda+g4p+QHvnW0RyTX/SVeJBDM/gCtMARO0cLuT2HcEKnTPvhjV6aGeqrCB/sbNop0Kszm0jsaWU4A==} - engines: {node: '>=4'} - hasBin: true - dev: true - - /esrecurse@4.3.0: - resolution: {integrity: sha512-KmfKL3b6G+RXvP8N1vr3Tq1kL/oCFgn2NYXEtqP8/L3pKapUA4G8cFVaoF3SU323CD4XypR/ffioHmkti6/Tag==} - engines: {node: '>=4.0'} - dependencies: - estraverse: 5.3.0 - dev: true - - /estraverse@4.3.0: - resolution: {integrity: sha512-39nnKffWz8xN1BU/2c79n9nB9HDzo0niYUqx6xyqUnyoAnQyyWpOTdZEeiCch8BBu515t4wp9ZmgVfVhn9EBpw==} - engines: {node: '>=4.0'} - dev: true - - /estraverse@5.3.0: - resolution: {integrity: sha512-MMdARuVEQziNTeJD8DgMqmhwR11BRQ/cBP+pLtYdSTnf3MIO8fFeiINEbX36ZdNlfU/7A9f3gUw49B3oQsvwBA==} - engines: {node: '>=4.0'} - 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'} - dev: true - - /ethers@6.9.0: - resolution: {integrity: sha512-pmfNyQzc2mseLe91FnT2vmNaTt8dDzhxZ/xItAV7uGsF4dI4ek2ufMu3rAkgQETL/TIs0GS5A+U05g9QyWnv3Q==} - engines: {node: '>=14.0.0'} - dependencies: - '@adraffy/ens-normalize': 1.10.0 - '@noble/curves': 1.2.0 - '@noble/hashes': 1.3.2 - '@types/node': 18.15.13 - aes-js: 4.0.0-beta.5 - tslib: 2.4.0 - ws: 8.5.0 - transitivePeerDependencies: - - bufferutil - - utf-8-validate - dev: true - - /etherscan-api@10.3.0(debug@4.3.4): - resolution: {integrity: sha512-XH+E7J2c6Wq750stvFuIIMdiLv5v65nTRftQojXuQXNfEsQaZOOgeY11WHdrGh6yh90ekDJQldgf033tIS1rCw==} - dependencies: - axios: 1.6.2(debug@4.3.4) - gh-pages: 4.0.0 - querystring: 0.2.1 - transitivePeerDependencies: - - debug - dev: true - - /eventemitter2@6.4.7: - resolution: {integrity: sha512-tYUSVOGeQPKt/eC1ABfhHy5Xd96N3oIijJvN3O9+TsC28T5V9yX9oEfEK5faP0EFSNVOG97qtAS68GBrQB2hDg==} - dev: true - - /eventemitter3@4.0.7: - resolution: {integrity: sha512-8guHBZCwKnFhYdHr2ysuRWErTwhoN2X8XELRlrRwpmfeY2jjuUN4taQMsULKUVo1K4DvZl+0pgfyoysHxvmvEw==} - dev: true - - /events@3.3.0: - resolution: {integrity: sha512-mQw+2fkQbALzQ7V0MY0IqdnXNOeTtP4r0lN9z7AAawCXgqea7bDii20AYrIBrFd/Hx0M2Ocz6S111CaFkUcb0Q==} - engines: {node: '>=0.8.x'} - dev: true - - /execa@4.1.0: - resolution: {integrity: sha512-j5W0//W7f8UxAn8hXVnwG8tLwdiUy4FJLcSupCg6maBYZDpyBvTApK7KyuI4bKj8KOh1r2YH+6ucuYtJv1bTZA==} - engines: {node: '>=10'} - dependencies: - cross-spawn: 7.0.3 - get-stream: 5.2.0 - human-signals: 1.1.1 - is-stream: 2.0.1 - merge-stream: 2.0.0 - npm-run-path: 4.0.1 - onetime: 5.1.2 - signal-exit: 3.0.7 - strip-final-newline: 2.0.0 - dev: true - - /execa@5.1.1: - resolution: {integrity: sha512-8uSpZZocAZRBAPIEINJj3Lo9HyGitllczc27Eh5YYojjMFMn8yHMDMaUHE2Jqfq05D/wucwI4JGURyXt1vchyg==} - engines: {node: '>=10'} - dependencies: - cross-spawn: 7.0.3 - get-stream: 6.0.1 - human-signals: 2.1.0 - is-stream: 2.0.1 - merge-stream: 2.0.0 - npm-run-path: 4.0.1 - onetime: 5.1.2 - signal-exit: 3.0.7 - strip-final-newline: 2.0.0 - dev: true - - /execa@7.2.0: - resolution: {integrity: sha512-UduyVP7TLB5IcAQl+OzLyLcS/l32W/GLg+AhHJ+ow40FOk2U3SAllPwR44v4vmdFwIWqpdwxxpQbF1n5ta9seA==} - engines: {node: ^14.18.0 || ^16.14.0 || >=18.0.0} - dependencies: - cross-spawn: 7.0.3 - get-stream: 6.0.1 - human-signals: 4.3.1 - is-stream: 3.0.0 - merge-stream: 2.0.0 - npm-run-path: 5.1.0 - onetime: 6.0.0 - signal-exit: 3.0.7 - strip-final-newline: 3.0.0 - dev: true - - /executable@4.1.1: - resolution: {integrity: sha512-8iA79xD3uAch729dUG8xaaBBFGaEa0wdD2VkYLFHwlqosEj/jT66AzcreRDSgV7ehnNLBW2WR5jIXwGKjVdTLg==} - engines: {node: '>=4'} - dependencies: - pify: 2.3.0 - dev: true - - /express@4.18.2: - resolution: {integrity: sha512-5/PsL6iGPdfQ/lKM1UuielYgv3BUoJfz1aUwU9vHZ+J7gyvwdQXFEBIEIaxeGf0GIcreATNyBExtalisDbuMqQ==} - engines: {node: '>= 0.10.0'} - dependencies: - accepts: 1.3.8 - array-flatten: 1.1.1 - body-parser: 1.20.1 - content-disposition: 0.5.4 - content-type: 1.0.5 - cookie: 0.5.0 - cookie-signature: 1.0.6 - debug: 2.6.9 - depd: 2.0.0 - encodeurl: 1.0.2 - escape-html: 1.0.3 - etag: 1.8.1 - finalhandler: 1.2.0 - fresh: 0.5.2 - http-errors: 2.0.0 - merge-descriptors: 1.0.1 - methods: 1.1.2 - on-finished: 2.4.1 - parseurl: 1.3.3 - path-to-regexp: 0.1.7 - proxy-addr: 2.0.7 - qs: 6.11.0 - range-parser: 1.2.1 - safe-buffer: 5.2.1 - send: 0.18.0 - serve-static: 1.15.0 - setprototypeof: 1.2.0 - statuses: 2.0.1 - type-is: 1.6.18 - utils-merge: 1.0.1 - vary: 1.1.2 - transitivePeerDependencies: - - supports-color - dev: true - - /ext-list@2.2.2: - resolution: {integrity: sha512-u+SQgsubraE6zItfVA0tBuCBhfU9ogSRnsvygI7wht9TS510oLkBRXBsqopeUG/GBOIQyKZO9wjTqIu/sf5zFA==} - engines: {node: '>=0.10.0'} - dependencies: - mime-db: 1.52.0 - dev: true - - /ext-name@5.0.0: - resolution: {integrity: sha512-yblEwXAbGv1VQDmow7s38W77hzAgJAO50ztBLMcUyUBfxv1HC+LGwtiEN+Co6LtlqT/5uwVOxsD4TNIilWhwdQ==} - engines: {node: '>=4'} - dependencies: - ext-list: 2.2.2 - sort-keys-length: 1.0.1 - dev: true - - /extend@3.0.2: - resolution: {integrity: sha512-fjquC59cD7CyW6urNXK0FBufkZcoiGG80wTuPujX590cB5Ttln20E2UB4S/WARVqhXffZl2LNgS+gQdPIIim/g==} - dev: true - - /extract-zip@2.0.1(supports-color@8.1.1): - resolution: {integrity: sha512-GDhU9ntwuKyGXdZBUgTIe+vXnWj0fppUEtMDL0+idd5Sta8TGpHssn/eusA9mrPr9qNDym6SxAYZjNvCn/9RBg==} - engines: {node: '>= 10.17.0'} - hasBin: true - dependencies: - debug: 4.3.4(supports-color@8.1.1) - get-stream: 5.2.0 - yauzl: 2.10.0 - optionalDependencies: - '@types/yauzl': 2.10.3 - transitivePeerDependencies: - - supports-color - dev: true - - /extsprintf@1.3.0: - resolution: {integrity: sha512-11Ndz7Nv+mvAC1j0ktTa7fAb0vLyGGX+rMHNBYQviQDGU0Hw7lhctJANqbPhu9nV9/izT/IntTgZ7Im/9LJs9g==} - engines: {'0': node >=0.6.0} - dev: true - - /fast-deep-equal@3.1.3: - resolution: {integrity: sha512-f3qQ9oQy9j2AhBe/H9VC91wLmKBCCU/gDOnKNAYG5hswO7BLKj09Hc5HYNz9cGI++xlpDCIgDaitVs03ATR84Q==} - dev: true - - /fast-glob@3.3.2: - resolution: {integrity: sha512-oX2ruAFQwf/Orj8m737Y5adxDQO0LAB7/S5MnxCdTNDd4p6BsyIVsv9JQsATbTSq8KHRpLwIHbVlUNatxd+1Ow==} - engines: {node: '>=8.6.0'} - dependencies: - '@nodelib/fs.stat': 2.0.5 - '@nodelib/fs.walk': 1.2.8 - glob-parent: 5.1.2 - merge2: 1.4.1 - micromatch: 4.0.5 - dev: true - - /fast-json-stable-stringify@2.1.0: - resolution: {integrity: sha512-lhd/wF+Lk98HZoTCtlVraHtfh5XYijIjalXck7saUtuanSDyLMxnHhSXEDJqHxD7msR8D0uCmqlkwjCV8xvwHw==} - dev: true - - /fast-url-parser@1.1.3: - resolution: {integrity: sha512-5jOCVXADYNuRkKFzNJ0dCCewsZiYo0dz8QNYljkOpFC6r2U4OBmKtvm/Tsuh4w1YYdDqDb31a8TVhBJ2OJKdqQ==} - dependencies: - punycode: 1.4.1 - dev: true - - /fastq@1.15.0: - resolution: {integrity: sha512-wBrocU2LCXXa+lWBt8RoIRD89Fi8OdABODa/kEnyeyjS5aZO5/GNvI5sEINADqP/h8M29UHTHUb53sUu5Ihqdw==} - dependencies: - reusify: 1.0.4 - dev: true - - /faye-websocket@0.11.4: - resolution: {integrity: sha512-CzbClwlXAuiRQAlUyfqPgvPoNKTckTPGfwZV4ZdAhVcP2lh9KUxJg2b5GkE7XbjKQ3YJnQ9z6D9ntLAlB+tP8g==} - engines: {node: '>=0.8.0'} - dependencies: - websocket-driver: 0.7.4 - dev: true - - /fd-slicer@1.1.0: - resolution: {integrity: sha512-cE1qsB/VwyQozZ+q1dGxR8LBYNZeofhEdUNGSMbQD3Gw2lAzX9Zb3uIU6Ebc/Fmyjo9AWWfnn0AUCHqtevs/8g==} - dependencies: - pend: 1.2.0 - dev: true - - /figures@3.2.0: - resolution: {integrity: sha512-yaduQFRKLXYOGgEn6AZau90j3ggSOyiqXU0F9JZfeXYhNa+Jk4X+s45A2zg5jns87GAFa34BBm2kXw4XpNcbdg==} - engines: {node: '>=8'} - dependencies: - escape-string-regexp: 1.0.5 - dev: true - - /file-type@11.1.0: - resolution: {integrity: sha512-rM0UO7Qm9K7TWTtA6AShI/t7H5BPjDeGVDaNyg9BjHAj3PysKy7+8C8D137R88jnR3rFJZQB/tFgydl5sN5m7g==} - engines: {node: '>=6'} - dev: true - - /file-type@3.9.0: - resolution: {integrity: sha512-RLoqTXE8/vPmMuTI88DAzhMYC99I8BWv7zYP4A1puo5HIjEJ5EX48ighy4ZyKMG9EDXxBgW6e++cn7d1xuFghA==} - engines: {node: '>=0.10.0'} - dev: true - - /file-type@4.4.0: - resolution: {integrity: sha512-f2UbFQEk7LXgWpi5ntcO86OeA/cC80fuDDDaX/fZ2ZGel+AF7leRQqBBW1eJNiiQkrZlAoM6P+VYP5P6bOlDEQ==} - engines: {node: '>=4'} - dev: true - - /file-type@5.2.0: - resolution: {integrity: sha512-Iq1nJ6D2+yIO4c8HHg4fyVb8mAJieo1Oloy1mLLaB2PvezNedhBVm+QU7g0qM42aiMbRXTxKKwGD17rjKNJYVQ==} - engines: {node: '>=4'} - dev: true - - /file-type@6.2.0: - resolution: {integrity: sha512-YPcTBDV+2Tm0VqjybVd32MHdlEGAtuxS3VAYsumFokDSMG+ROT5wawGlnHDoz7bfMcMDt9hxuXvXwoKUx2fkOg==} - engines: {node: '>=4'} - dev: true - - /filename-reserved-regex@2.0.0: - resolution: {integrity: sha512-lc1bnsSr4L4Bdif8Xb/qrtokGbq5zlsms/CYH8PP+WtCkGNF65DPiQY8vG3SakEdRn8Dlnm+gW/qWKKjS5sZzQ==} - engines: {node: '>=4'} - dev: true - - /filenamify@3.0.0: - resolution: {integrity: sha512-5EFZ//MsvJgXjBAFJ+Bh2YaCTRF/VP1YOmGrgt+KJ4SFRLjI87EIdwLLuT6wQX0I4F9W41xutobzczjsOKlI/g==} - engines: {node: '>=6'} - dependencies: - filename-reserved-regex: 2.0.0 - strip-outer: 1.0.1 - trim-repeated: 1.0.0 - dev: true - - /filenamify@4.3.0: - resolution: {integrity: sha512-hcFKyUG57yWGAzu1CMt/dPzYZuv+jAJUT85bL8mrXvNe6hWj6yEHEc4EdcgiA6Z3oi1/9wXJdZPXF2dZNgwgOg==} - engines: {node: '>=8'} - dependencies: - filename-reserved-regex: 2.0.0 - strip-outer: 1.0.1 - trim-repeated: 1.0.0 - dev: true - - /fill-range@7.0.1: - resolution: {integrity: sha512-qOo9F+dMUmC2Lcb4BbVvnKJxTPjCm+RRpe4gDuGrzkL7mEVl/djYSu2OdQ2Pa302N4oqkSg9ir6jaLWJ2USVpQ==} - engines: {node: '>=8'} - dependencies: - to-regex-range: 5.0.1 - dev: true - - /finalhandler@1.2.0: - resolution: {integrity: sha512-5uXcUVftlQMFnWC9qu/svkWv3GTd2PfUhK/3PLkYNAe7FbqJMt3515HaxE6eRL74GdsriiwujiawdaB1BpEISg==} - engines: {node: '>= 0.8'} - dependencies: - debug: 2.6.9 - encodeurl: 1.0.2 - escape-html: 1.0.3 - on-finished: 2.4.1 - parseurl: 1.3.3 - statuses: 2.0.1 - unpipe: 1.0.0 - transitivePeerDependencies: - - supports-color - dev: true - - /find-cache-dir@3.3.2: - resolution: {integrity: sha512-wXZV5emFEjrridIgED11OoUKLxiYjAcqot/NJdAkOhlJ+vGzwhOAfcG5OX1jP+S0PcjEn8bdMJv+g2jwQ3Onig==} - engines: {node: '>=8'} - dependencies: - commondir: 1.0.1 - make-dir: 3.1.0 - pkg-dir: 4.2.0 - dev: true - - /find-cache-dir@4.0.0: - resolution: {integrity: sha512-9ZonPT4ZAK4a+1pUPVPZJapbi7O5qbbJPdYw/NOQWZZbVLdDTYM3A4R9z/DpAM08IDaFGsvPgiGZ82WEwUDWjg==} - engines: {node: '>=14.16'} - dependencies: - common-path-prefix: 3.0.0 - pkg-dir: 7.0.0 - dev: true - - /find-config@1.0.0: - resolution: {integrity: sha512-Z+suHH+7LSE40WfUeZPIxSxypCWvrzdVc60xAjUShZeT5eMWM0/FQUduq3HjluyfAHWvC/aOBkT1pTZktyF/jg==} - engines: {node: '>= 0.12'} - dependencies: - user-home: 2.0.0 - dev: true - - /find-up@4.1.0: - resolution: {integrity: sha512-PpOwAdQ/YlXQ2vj8a3h8IipDuYRi3wceVQQGYWxNINccq40Anw7BlsEXCMbt1Zt+OLA6Fq9suIpIWD0OsnISlw==} - engines: {node: '>=8'} - dependencies: - locate-path: 5.0.0 - path-exists: 4.0.0 - dev: true - - /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 - - /flat@5.0.2: - resolution: {integrity: sha512-b6suED+5/3rTpUBdG1gupIl8MPFCAMA0QXwmljLhvCUKcUvdE4gWky9zpuGCcXHOsz4J9wPGNWq6OKpmIzz3hQ==} - hasBin: true - dev: true - - /follow-redirects@1.15.6(debug@4.3.4): - resolution: {integrity: sha512-wWN62YITEaOpSK584EZXJafH1AGpO8RVgElfkuXbTOrPX4fIfOyEpW/CsiNd8JdYrAoOvafRTOEnvsO++qCqFA==} - engines: {node: '>=4.0'} - peerDependencies: - debug: '*' - peerDependenciesMeta: - debug: - optional: true - dependencies: - debug: 4.3.4(supports-color@8.1.1) - dev: true - - /for-each@0.3.3: - resolution: {integrity: sha512-jqYfLp7mo9vIyQf8ykW2v7A+2N4QjeCeI5+Dz9XraiO1ign81wjiH7Fb9vSOWvQfNtmSa4H2RoQTrrXivdUZmw==} - dependencies: - is-callable: 1.2.7 - dev: true - - /foreground-child@2.0.0: - resolution: {integrity: sha512-dCIq9FpEcyQyXKCkyzmlPTFNgrCzPudOe+mhvJU5zAtlBnGVy2yKxtfsxK2tQBThwq225jcvBjpw1Gr40uzZCA==} - engines: {node: '>=8.0.0'} - dependencies: - cross-spawn: 7.0.3 - signal-exit: 3.0.7 - dev: true - - /forever-agent@0.6.1: - resolution: {integrity: sha512-j0KLYPhm6zeac4lz3oJ3o65qvgQCcPubiyotZrXqEaG4hNagNYO8qdlUrX5vwqv9ohqeT/Z3j6+yW067yWWdUw==} - dev: true - - /form-data@2.3.3: - resolution: {integrity: sha512-1lLKB2Mu3aGP1Q/2eCOx0fNbRMe7XdwktwOruhfqqd0rIJWwN4Dh+E3hrPSlDCXnSR7UtZ1N38rVXm+6+MEhJQ==} - engines: {node: '>= 0.12'} - 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'} - dependencies: - asynckit: 0.4.0 - combined-stream: 1.0.8 - mime-types: 2.1.35 - dev: true - - /forwarded@0.2.0: - resolution: {integrity: sha512-buRG0fpBtRHSTCOASe6hD258tEubFoRLb4ZNA6NxMVHNw2gOcwHo9wyablzMzOA5z9xA9L1KNjk/Nt6MT9aYow==} - engines: {node: '>= 0.6'} - dev: true - - /fresh@0.5.2: - resolution: {integrity: sha512-zJ2mQYM18rEFOudeV4GShTGIQ7RbzA7ozbU9I/XBpm7kqgMywgmylMwXHxZJmkVoYkna9d2pVXVXPdYTP9ej8Q==} - engines: {node: '>= 0.6'} - dev: true - - /fromentries@1.3.2: - resolution: {integrity: sha512-cHEpEQHUg0f8XdtZCc2ZAhrHzKzT0MrFUTcvx+hfxYu7rGMDc5SKoXFh+n4YigxsHXRzc6OrCshdR1bWH6HHyg==} - dev: true - - /fs-constants@1.0.0: - resolution: {integrity: sha512-y6OAwoSIf7FyjMIv94u+b5rdheZEjzR63GTyZJm5qh4Bi+2YgwLCcI/fPFZkL5PSixOt6ZNKm+w+Hfp/Bciwow==} - dev: true - - /fs-extra@8.1.0: - resolution: {integrity: sha512-yhlQgA6mnOJUKOsRUFsgJdQCvkKhcz8tlZG5HBQfReYZy46OwLcY+Zia0mtdHsOo9y/hP+CxMN0TU9QxoOtG4g==} - engines: {node: '>=6 <7 || >=8'} - dependencies: - graceful-fs: 4.2.11 - jsonfile: 4.0.0 - universalify: 0.1.2 - dev: true - - /fs-extra@9.1.0: - resolution: {integrity: sha512-hcg3ZmepS30/7BSFqRvoo3DOMQu7IjqxO5nCDt+zM9XWjb33Wg7ziNT+Qvqbuc3+gWpzO02JubVyk2G4Zvo1OQ==} - engines: {node: '>=10'} - dependencies: - at-least-node: 1.0.0 - graceful-fs: 4.2.11 - jsonfile: 6.1.0 - universalify: 2.0.1 - dev: true - - /fs-monkey@1.0.5: - resolution: {integrity: sha512-8uMbBjrhzW76TYgEV27Y5E//W2f/lTFmx78P2w19FZSxarhI/798APGQyuGCwmkNxgwGRhrLfvWyLBvNtuOmew==} - dev: true - - /fs.realpath@1.0.0: - resolution: {integrity: sha512-OO0pH2lK6a0hZnAdau5ItzHPI6pUlvI7jMVnxUQRtw4owF2wk8lOSabtGDCTP4Ggrg2MbGnWO9X8K1t4+fGMDw==} - dev: true - - /fsevents@2.3.2: - resolution: {integrity: sha512-xiqMQR4xAeHTuB9uWm+fFRcIOgKBMiOBP+eXiyT7jsgVCq1bkVygt00oASowB7EdtpOHaaPgKt812P9ab+DDKA==} - engines: {node: ^8.16.0 || ^10.6.0 || >=11.0.0} - os: [darwin] - requiresBuild: true - dev: true - optional: true - - /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 - optional: true - - /function-bind@1.1.2: - resolution: {integrity: sha512-7XHNxH7qX9xG5mIwxkhumTox/MIRNcOgDrxWsMt2pAr23WHp6MrRlN7FBSFpCpr+oVO0F744iUgR82nJMfG2SA==} - dev: true - - /function.prototype.name@1.1.6: - resolution: {integrity: sha512-Z5kx79swU5P27WEayXM1tBi5Ze/lbIyiNgU3qyXUOf9b2rgXYyF9Dy9Cx+IQv/Lc8WCG6L82zwUPpSS9hGehIg==} - engines: {node: '>= 0.4'} - dependencies: - call-bind: 1.0.5 - define-properties: 1.2.1 - es-abstract: 1.22.3 - functions-have-names: 1.2.3 - dev: true - - /functions-have-names@1.2.3: - resolution: {integrity: sha512-xckBUXyTIqT97tq2x2AMb+g163b5JFysYk0x4qxNFwbfQkmNZoiRHb6sPzI9/QV33WeuvVYBUIiD4NzNIyqaRQ==} - dev: true - - /gensync@1.0.0-beta.2: - resolution: {integrity: sha512-3hN7NaskYvMDLQY55gnW3NQ+mesEAepTqlg+VEbj7zzqEMBVNhzcGYYeqFo/TlYz6eQiFcp1HcsCZO+nGgS8zg==} - engines: {node: '>=6.9.0'} - dev: true - - /get-caller-file@2.0.5: - resolution: {integrity: sha512-DyFP3BM/3YHTQOCUL/w0OZHR0lpKeGrxotcHWcqNEdnltqFwXVfhEBQ94eIo34AfQpo0rGki4cyIiftY06h2Fg==} - engines: {node: 6.* || 8.* || >= 10.*} - dev: true - - /get-intrinsic@1.2.2: - resolution: {integrity: sha512-0gSo4ml/0j98Y3lngkFEot/zhiCeWsbYIlZ+uZOVgzLyLaUw7wxUL+nCTP0XJvJg1AXulJRI3UJi8GsbDuxdGA==} - dependencies: - function-bind: 1.1.2 - has-proto: 1.0.1 - has-symbols: 1.0.3 - hasown: 2.0.0 - dev: true - - /get-package-type@0.1.0: - resolution: {integrity: sha512-pjzuKtY64GYfWizNAJ0fr9VqttZkNiK2iS430LtIHzjBEr6bX8Am2zm4sW4Ro5wjWW5cAlRL1qAMTcXbjNAO2Q==} - engines: {node: '>=8.0.0'} - dev: true - - /get-port@6.1.2: - resolution: {integrity: sha512-BrGGraKm2uPqurfGVj/z97/zv8dPleC6x9JBNRTrDNtCkkRF4rPwrQXFgL7+I+q8QSdU4ntLQX2D7KIxSy8nGw==} - engines: {node: ^12.20.0 || ^14.13.1 || >=16.0.0} - dev: true - - /get-port@7.0.0: - resolution: {integrity: sha512-mDHFgApoQd+azgMdwylJrv2DX47ywGq1i5VFJE7fZ0dttNq3iQMfsU4IvEgBHojA3KqEudyu7Vq+oN8kNaNkWw==} - engines: {node: '>=16'} - dev: true - - /get-stream@2.3.1: - resolution: {integrity: sha512-AUGhbbemXxrZJRD5cDvKtQxLuYaIbNtDTK8YqupCI393Q2KSTreEsLUN3ZxAWFGiKTzL6nKuzfcIvieflUX9qA==} - engines: {node: '>=0.10.0'} - dependencies: - object-assign: 4.1.1 - pinkie-promise: 2.0.1 - dev: true - - /get-stream@4.1.0: - resolution: {integrity: sha512-GMat4EJ5161kIy2HevLlr4luNjBgvmj413KaQA7jt4V8B4RDsfpHk7WQ9GVqfYyyx8OS/L66Kox+rJRNklLK7w==} - engines: {node: '>=6'} - dependencies: - pump: 3.0.0 - dev: true - - /get-stream@5.2.0: - resolution: {integrity: sha512-nBF+F1rAZVCu/p7rjzgA+Yb4lfYXrpl7a6VmJrU8wF9I1CKvP/QwPNZHnOlwbTkY6dvtFIzFMSyQXbLoTQPRpA==} - engines: {node: '>=8'} - dependencies: - pump: 3.0.0 - dev: true - - /get-stream@6.0.1: - resolution: {integrity: sha512-ts6Wi+2j3jQjqi70w5AlN8DFnkSwC+MqmxEzdEALB2qXZYV3X/b1CTfgPLGJNMeAWxdPfU8FO1ms3NUfaHCPYg==} - engines: {node: '>=10'} - dev: true - - /get-symbol-description@1.0.0: - resolution: {integrity: sha512-2EmdH1YvIQiZpltCNgkuiUnyukzxM/R6NDJX31Ke3BG1Nq5b0S2PhX59UKi9vZpPDQVdqn+1IcaAwnzTT5vCjw==} - engines: {node: '>= 0.4'} - dependencies: - call-bind: 1.0.5 - get-intrinsic: 1.2.2 - dev: true - - /getos@3.2.1: - resolution: {integrity: sha512-U56CfOK17OKgTVqozZjUKNdkfEv6jk5WISBJ8SHoagjE6L69zOwl3Z+O8myjY9MEW3i2HPWQBt/LTbCgcC973Q==} - dependencies: - async: 3.2.5 - dev: true - - /getpass@0.1.7: - resolution: {integrity: sha512-0fzj9JxOLfJ+XGLhR8ze3unN0KZCgZwiSSDz168VERjK8Wl8kVSdcu2kspd4s4wtAa1y/qrVRiAA0WclVsu0ng==} - dependencies: - assert-plus: 1.0.0 - dev: true - - /gh-pages@4.0.0: - resolution: {integrity: sha512-p8S0T3aGJc68MtwOcZusul5qPSNZCalap3NWbhRUZYu1YOdp+EjZ+4kPmRM8h3NNRdqw00yuevRjlkuSzCn7iQ==} - engines: {node: '>=10'} - hasBin: true - dependencies: - async: 2.6.4 - commander: 2.20.3 - email-addresses: 3.1.0 - filenamify: 4.3.0 - find-cache-dir: 3.3.2 - fs-extra: 8.1.0 - globby: 6.1.0 - dev: true - - /glob-parent@5.1.2: - resolution: {integrity: sha512-AOIgSQCepiJYwP3ARnGx+5VnTu2HBYdzbGP45eLw1vr3zB3vZLeyed1sC9hnbcOc9/SrMyM5RPQrkGz4aS9Zow==} - engines: {node: '>= 6'} - dependencies: - is-glob: 4.0.3 - dev: true - - /glob-to-regexp@0.4.1: - resolution: {integrity: sha512-lkX1HJXwyMcprw/5YUZc2s7DrpAiHB21/V+E1rHUrVNokkvB6bqMzT0VfV6/86ZNabt1k14YOIaT7nDvOX3Iiw==} - dev: true - - /glob@7.2.3: - resolution: {integrity: sha512-nFR0zLpU2YCaRxwoCJvL6UvCH2JFyFVIvwTLsIf21AuHlMskA1hhTdk+LlYJtOlYt9v6dvszD2BGRqBL+iQK9Q==} - dependencies: - fs.realpath: 1.0.0 - inflight: 1.0.6 - inherits: 2.0.4 - minimatch: 3.1.2 - once: 1.4.0 - path-is-absolute: 1.0.1 - dev: true - - /global-dirs@3.0.1: - resolution: {integrity: sha512-NBcGGFbBA9s1VzD41QXDG+3++t9Mn5t1FpLdhESY6oKY4gYTFpX4wO3sqGUa0Srjtbfj3szX0RnemmrVRUdULA==} - engines: {node: '>=10'} - dependencies: - ini: 2.0.0 - dev: true - - /globals@11.12.0: - resolution: {integrity: sha512-WOBp/EEGUiIsJSp7wcv/y6MO+lV9UoncWqxuFfm8eBwzWNgyfBd6Gz+IeKQ9jCmyhoH99g15M3T+QaVHFjizVA==} - engines: {node: '>=4'} - dev: true - - /globalthis@1.0.3: - resolution: {integrity: sha512-sFdI5LyBiNTHjRd7cGPWapiHWMOXKyuBNX/cWJ3NfzrZQVa8GI/8cofCl74AOVqq9W5kNmguTIzJ/1s2gyI9wA==} - engines: {node: '>= 0.4'} - dependencies: - define-properties: 1.2.1 - dev: true - - /globby@11.1.0: - resolution: {integrity: sha512-jhIXaOzy1sb8IyocaruWSn1TjmnBVs8Ayhcy83rmxNJ8q2uWKCAj3CnJY+KpGSXCueAPc0i05kVvVKtP1t9S3g==} - engines: {node: '>=10'} - dependencies: - array-union: 2.1.0 - dir-glob: 3.0.1 - fast-glob: 3.3.2 - ignore: 5.3.0 - merge2: 1.4.1 - slash: 3.0.0 - dev: true - - /globby@6.1.0: - resolution: {integrity: sha512-KVbFv2TQtbzCoxAnfD6JcHZTYCzyliEaaeM/gH8qQdkKr5s0OP9scEgvdcngyk7AVdY6YVW/TJHd+lQ/Df3Daw==} - engines: {node: '>=0.10.0'} - dependencies: - array-union: 1.0.2 - glob: 7.2.3 - object-assign: 4.1.1 - pify: 2.3.0 - pinkie-promise: 2.0.1 - dev: true - - /gopd@1.0.1: - resolution: {integrity: sha512-d65bNlIadxvpb/A2abVdlqKqV563juRnZ1Wtk6s1sIR8uNsXR70xqIzVqxVf1eTqDunwT2MkczEeaezCKTZhwA==} - dependencies: - get-intrinsic: 1.2.2 - dev: true - - /got@11.8.6: - resolution: {integrity: sha512-6tfZ91bOr7bOXnK7PRDCGBLa1H4U080YHNaAQ2KsMGlLEzRbk44nsZF2E1IeRc3vtJHPVbKCYgdFbaGO2ljd8g==} - engines: {node: '>=10.19.0'} - dependencies: - '@sindresorhus/is': 4.6.0 - '@szmarczak/http-timer': 4.0.6 - '@types/cacheable-request': 6.0.3 - '@types/responselike': 1.0.3 - cacheable-lookup: 5.0.4 - cacheable-request: 7.0.4 - decompress-response: 6.0.0 - http2-wrapper: 1.0.3 - lowercase-keys: 2.0.0 - p-cancelable: 2.1.1 - responselike: 2.0.1 - dev: true - - /graceful-fs@4.2.11: - resolution: {integrity: sha512-RbJ5/jmFcNNCcDV5o9eTnBLJ/HszWV0P73bc+Ff4nS/rJj+YaS6IGyiOL0VoBYX+l1Wrl3k63h/KrH+nhJ0XvQ==} - dev: true - - /handle-thing@2.0.1: - resolution: {integrity: sha512-9Qn4yBxelxoh2Ow62nP+Ka/kMnOXRi8BXnRaUwezLNhqelnN49xKz4F/dPP8OYLxLxq6JDtZb2i9XznUQbNPTg==} - dev: true - - /has-bigints@1.0.2: - resolution: {integrity: sha512-tSvCKtBr9lkF0Ex0aQiP9N+OpV4zi2r/Nee5VkRDbaqv35RLYMzbwQfFSZZH0kR+Rd6302UJZ2p/bJCEoR3VoQ==} - dev: true - - /has-flag@3.0.0: - resolution: {integrity: sha512-sKJf1+ceQBr4SMkvQnBDNDtf4TXpVhVGateu0t918bl30FnbE2m4vNLX+VWe/dpjlb+HugGYzW7uQXH98HPEYw==} - engines: {node: '>=4'} - dev: true - - /has-flag@4.0.0: - resolution: {integrity: sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==} - engines: {node: '>=8'} - dev: true - - /has-property-descriptors@1.0.1: - resolution: {integrity: sha512-VsX8eaIewvas0xnvinAe9bw4WfIeODpGYikiWYLH+dma0Jw6KHYqWiWfhQlgOVK8D6PvjubK5Uc4P0iIhIcNVg==} - dependencies: - get-intrinsic: 1.2.2 - dev: true - - /has-proto@1.0.1: - resolution: {integrity: sha512-7qE+iP+O+bgF9clE5+UoBFzE65mlBiVj3tKCrlNQ0Ogwm0BjpT/gK4SlLYDMybDh5I3TCTKnPPa0oMG7JDYrhg==} - engines: {node: '>= 0.4'} - dev: true - - /has-symbols@1.0.3: - resolution: {integrity: sha512-l3LCuF6MgDNwTDKkdYGEihYjt5pRPbEg46rtlmnSPlUbgmB8LOIrKJbYYFBSbnPaJexMKtiPO8hmeRjRz2Td+A==} - engines: {node: '>= 0.4'} - dev: true - - /has-tostringtag@1.0.0: - resolution: {integrity: sha512-kFjcSNhnlGV1kyoGk7OXKSawH5JOb/LzUc5w9B02hOTO0dfFRjbHQKvg1d6cf3HbeUmtU9VbbV3qzZ2Teh97WQ==} - engines: {node: '>= 0.4'} - dependencies: - has-symbols: 1.0.3 - dev: true - - /hasha@5.2.2: - resolution: {integrity: sha512-Hrp5vIK/xr5SkeN2onO32H0MgNZ0f17HRNH39WfL0SYUNOTZ5Lz1TJ8Pajo/87dYGEFlLMm7mIc/k/s6Bvz9HQ==} - engines: {node: '>=8'} - 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'} - dependencies: - function-bind: 1.1.2 - dev: true - - /he@1.2.0: - resolution: {integrity: sha512-F/1DnUGPopORZi0ni+CvrCgHQ5FyEAHRLSApuYWMmrbSwoN2Mn/7k+Gl38gJnR7yyDZk6WLXwiGod1JOWNDKGw==} - hasBin: true - dev: true - - /hpack.js@2.1.6: - resolution: {integrity: sha512-zJxVehUdMGIKsRaNt7apO2Gqp0BdqW5yaiGHXXmbpvxgBYVZnAql+BJb4RO5ad2MgpbZKn5G6nMnegrH1FcNYQ==} - dependencies: - inherits: 2.0.4 - obuf: 1.1.2 - readable-stream: 2.3.8 - wbuf: 1.7.3 - dev: true - - /html-entities@2.4.0: - resolution: {integrity: sha512-igBTJcNNNhvZFRtm8uA6xMY6xYleeDwn3PeBCkDz7tHttv4F2hsDI2aPgNERWzvRcNYHNT3ymRaQzllmXj4YsQ==} - dev: true - - /html-escaper@2.0.2: - resolution: {integrity: sha512-H2iMtd0I4Mt5eYiapRdIDjp+XzelXQ0tFE4JS7YFwFevXXMmOp9myNrUvCg0D6ws8iqkRPBfKHgbwig1SmlLfg==} - dev: true - - /html-minifier-terser@5.1.1: - resolution: {integrity: sha512-ZPr5MNObqnV/T9akshPKbVgyOqLmy+Bxo7juKCfTfnjNniTAMdy4hz21YQqoofMBJD2kdREaqPPdThoR78Tgxg==} - engines: {node: '>=6'} - hasBin: true - dependencies: - camel-case: 4.1.2 - clean-css: 4.2.4 - commander: 4.1.1 - he: 1.2.0 - param-case: 3.0.4 - relateurl: 0.2.7 - terser: 4.8.1 - dev: true - - /html-minifier-terser@6.1.0: - resolution: {integrity: sha512-YXxSlJBZTP7RS3tWnQw74ooKa6L9b9i9QYXY21eUEvhZ3u9XLfv6OnFsQq6RxkhHygsaUMvYsZRV5rU/OVNZxw==} - engines: {node: '>=12'} - hasBin: true - dependencies: - camel-case: 4.1.2 - clean-css: 5.3.3 - commander: 8.3.0 - he: 1.2.0 - param-case: 3.0.4 - relateurl: 0.2.7 - terser: 5.26.0 - dev: true - - /html-webpack-plugin@4.5.2(webpack@5.89.0): - resolution: {integrity: sha512-q5oYdzjKUIPQVjOosjgvCHQOv9Ett9CYYHlgvJeXG0qQvdSojnBq4vAdQBwn1+yGveAwHCoe/rMR86ozX3+c2A==} - engines: {node: '>=6.9'} - peerDependencies: - webpack: ^4.0.0 || ^5.0.0 - dependencies: - '@types/html-minifier-terser': 5.1.2 - '@types/tapable': 1.0.12 - '@types/webpack': 4.41.38 - html-minifier-terser: 5.1.1 - loader-utils: 1.4.2 - lodash: 4.17.21 - pretty-error: 2.1.2 - tapable: 1.1.3 - util.promisify: 1.0.0 - webpack: 5.89.0 - dev: true - - /html-webpack-plugin@5.5.4(webpack@5.89.0): - resolution: {integrity: sha512-3wNSaVVxdxcu0jd4FpQFoICdqgxs4zIQQvj+2yQKFfBOnLETQ6X5CDWdeasuGlSsooFlMkEioWDTqBv1wvw5Iw==} - engines: {node: '>=10.13.0'} - peerDependencies: - webpack: ^5.20.0 - dependencies: - '@types/html-minifier-terser': 6.1.0 - html-minifier-terser: 6.1.0 - lodash: 4.17.21 - pretty-error: 4.0.0 - tapable: 2.2.1 - webpack: 5.89.0 - dev: true - - /htmlparser2@6.1.0: - resolution: {integrity: sha512-gyyPk6rgonLFEDGoeRgQNaEUvdJ4ktTmmUh/h2t7s+M8oPpIPxgNACWa+6ESR57kXstwqPiCut0V8NRpcwgU7A==} - dependencies: - domelementtype: 2.3.0 - domhandler: 4.3.1 - domutils: 2.8.0 - entities: 2.2.0 - dev: true - - /http-cache-semantics@4.1.1: - resolution: {integrity: sha512-er295DKPVsV82j5kw1Gjt+ADA/XYHsajl82cGNQG2eyoPkvgUhX+nDIyelzhIWbbsXP39EHcI6l5tYs2FYqYXQ==} - dev: true - - /http-deceiver@1.2.7: - resolution: {integrity: sha512-LmpOGxTfbpgtGVxJrj5k7asXHCgNZp5nLfp+hWc8QQRqtb7fUy6kRY3BO1h9ddF6yIPYUARgxGOwB42DnxIaNw==} - dev: true - - /http-errors@1.6.3: - resolution: {integrity: sha512-lks+lVC8dgGyh97jxvxeYTWQFvh4uw4yC12gVl63Cg30sjPX4wuGcdkICVXDAESr6OJGjqGA8Iz5mkeN6zlD7A==} - engines: {node: '>= 0.6'} - dependencies: - depd: 1.1.2 - inherits: 2.0.3 - setprototypeof: 1.1.0 - statuses: 1.5.0 - dev: true - - /http-errors@2.0.0: - resolution: {integrity: sha512-FtwrG/euBzaEjYeRqOgly7G0qviiXoJWnvEH2Z1plBdXgbyjv34pHTSb9zoeHMyDy33+DWy5Wt9Wo+TURtOYSQ==} - engines: {node: '>= 0.8'} - dependencies: - depd: 2.0.0 - inherits: 2.0.4 - setprototypeof: 1.2.0 - statuses: 2.0.1 - toidentifier: 1.0.1 - dev: true - - /http-parser-js@0.5.8: - resolution: {integrity: sha512-SGeBX54F94Wgu5RH3X5jsDtf4eHyRogWX1XGT3b4HuW3tQPM4AaBzoUji/4AAJNXCEOWZ5O0DgZmJw1947gD5Q==} - dev: true - - /http-proxy-middleware@2.0.6(@types/express@4.17.21)(debug@4.3.4): - resolution: {integrity: sha512-ya/UeJ6HVBYxrgYotAZo1KvPWlgB48kUJLDePFeneHsVujFaW5WNj2NgWCAE//B1Dl02BIfYlpNgBy8Kf8Rjmw==} - engines: {node: '>=12.0.0'} - peerDependencies: - '@types/express': ^4.17.13 - peerDependenciesMeta: - '@types/express': - optional: true - dependencies: - '@types/express': 4.17.21 - '@types/http-proxy': 1.17.14 - http-proxy: 1.18.1(debug@4.3.4) - is-glob: 4.0.3 - is-plain-obj: 3.0.0 - micromatch: 4.0.5 - transitivePeerDependencies: - - debug - dev: true - - /http-proxy@1.18.1(debug@4.3.4): - resolution: {integrity: sha512-7mz/721AbnJwIVbnaSv1Cz3Am0ZLT/UBwkC92VlxhXv/k/BBQfM2fXElQNC27BVGr0uwUpplYPQM9LnaBMR5NQ==} - engines: {node: '>=8.0.0'} - dependencies: - eventemitter3: 4.0.7 - follow-redirects: 1.15.6(debug@4.3.4) - requires-port: 1.0.0 - transitivePeerDependencies: - - debug - dev: true - - /http-signature@1.3.6: - resolution: {integrity: sha512-3adrsD6zqo4GsTqtO7FyrejHNv+NgiIfAfv68+jVlFmSr9OGy7zrxONceFRLKvnnZA5jbxQBX1u9PpB6Wi32Gw==} - engines: {node: '>=0.10'} - dependencies: - assert-plus: 1.0.0 - jsprim: 2.0.2 - sshpk: 1.18.0 - dev: true - - /http2-wrapper@1.0.3: - resolution: {integrity: sha512-V+23sDMr12Wnz7iTcDeJr3O6AIxlnvT/bmaAAAP/Xda35C90p9599p0F1eHR/N1KILWSoWVAiOMFjBBXaXSMxg==} - engines: {node: '>=10.19.0'} - dependencies: - quick-lru: 5.1.1 - resolve-alpn: 1.2.1 - dev: true - - /human-signals@1.1.1: - resolution: {integrity: sha512-SEQu7vl8KjNL2eoGBLF3+wAjpsNfA9XMlXAYj/3EdaNfAlxKthD1xjEQfGOUhllCGGJVNY34bRr6lPINhNjyZw==} - engines: {node: '>=8.12.0'} - dev: true - - /human-signals@2.1.0: - resolution: {integrity: sha512-B4FFZ6q/T2jhhksgkbEW3HBvWIfDW85snkQgawt07S7J5QXTk6BkNV+0yAeZrM5QpMAdYlocGoljn0sJ/WQkFw==} - engines: {node: '>=10.17.0'} - dev: true - - /human-signals@4.3.1: - resolution: {integrity: sha512-nZXjEF2nbo7lIw3mgYjItAfgQXog3OjJogSbKa2CQIIvSGWcKgeJnQlNXip6NglNzYH45nSRiEVimMvYL8DDqQ==} - engines: {node: '>=14.18.0'} - dev: true - - /iconv-lite@0.4.24: - resolution: {integrity: sha512-v3MXnZAcvnywkTUEZomIActle7RXXeedOR31wwl7VlyoXO4Qi9arvSenNQWne1TcRwhCL1HwLI21bEqdpj8/rA==} - engines: {node: '>=0.10.0'} - dependencies: - safer-buffer: 2.1.2 - dev: true - - /ieee754@1.2.1: - resolution: {integrity: sha512-dcyqhDvX1C46lXZcVqCpK+FtMRQVdIMN6/Df5js2zouUsqG7I6sFxitIC+7KYK29KdXOLHdu9zL4sFnoVQnqaA==} - dev: true - - /ignore@5.3.0: - resolution: {integrity: sha512-g7dmpshy+gD7mh88OC9NwSGTKoc3kyLAZQRU1mt53Aw/vnvfXnbC+F/7F7QoYVKbV+KNvJx8wArewKy1vXMtlg==} - engines: {node: '>= 4'} - dev: true - - /imurmurhash@0.1.4: - resolution: {integrity: sha512-JmXMZ6wuvDmLiHEml9ykzqO6lwFbof0GG4IkcGaENdCRDDmMVnny7s5HsIgHCbaq0w2MyPhDqkhTUgS2LU2PHA==} - engines: {node: '>=0.8.19'} - dev: true - - /indent-string@4.0.0: - resolution: {integrity: sha512-EdDDZu4A2OyIK7Lr/2zG+w5jmbuk1DVBnEwREQvBzspBJkCEbRa8GxU1lghYcaGJCnRWibjDXlq779X1/y5xwg==} - engines: {node: '>=8'} - dev: true - - /inflight@1.0.6: - resolution: {integrity: sha512-k92I/b08q4wvFscXCLvqfsHCrjrF7yiXsQuIVvVE7N82W3+aqpzuUdBbfhWcy/FZR3/4IgflMgKLOsvPDrGCJA==} - dependencies: - once: 1.4.0 - wrappy: 1.0.2 - dev: true - - /inherits@2.0.3: - resolution: {integrity: sha512-x00IRNXNy63jwGkJmzPigoySHbaqpNuzKbBOmzK+g2OdZpQ9w+sxCN+VSB3ja7IAge2OP2qpfxTjeNcyjmW1uw==} - dev: true - - /inherits@2.0.4: - resolution: {integrity: sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ==} - dev: true - - /ini@1.3.8: - resolution: {integrity: sha512-JV/yugV2uzW5iMRSiZAyDtQd+nxtUnjeLt0acNdw98kKLrvuRVyB80tsREOE7yvGVgalhZ6RNXCmEHkUKBKxew==} - dev: true - - /ini@2.0.0: - resolution: {integrity: sha512-7PnF4oN3CvZF23ADhA5wRaYEQpJ8qygSkbtTXWBeXWXmEVRXK+1ITciHWwHhsjv1TmW0MgacIv6hEi5pX5NQdA==} - engines: {node: '>=10'} - dev: true - - /internal-slot@1.0.6: - resolution: {integrity: sha512-Xj6dv+PsbtwyPpEflsejS+oIZxmMlV44zAhG479uYu89MsjcYOhCFnNyKrkJrihbsiasQyY0afoCl/9BLR65bg==} - engines: {node: '>= 0.4'} - dependencies: - get-intrinsic: 1.2.2 - hasown: 2.0.0 - side-channel: 1.0.4 - dev: true - - /ipaddr.js@1.9.1: - resolution: {integrity: sha512-0KI/607xoxSToH7GjN1FfSbLoU0+btTicjsQSWQlh/hZykN8KpmMf7uYwPW3R+akZ6R/w18ZlXSHBYXiYUPO3g==} - engines: {node: '>= 0.10'} - dev: true - - /ipaddr.js@2.1.0: - resolution: {integrity: sha512-LlbxQ7xKzfBusov6UMi4MFpEg0m+mAm9xyNGEduwXMEDuf4WfzB/RZwMVYEd7IKGvh4IUkEXYxtAVu9T3OelJQ==} - engines: {node: '>= 10'} - dev: true - - /is-arguments@1.1.1: - resolution: {integrity: sha512-8Q7EARjzEnKpt/PCD7e1cgUS0a6X8u5tdSiMqXhojOdoV9TsMsiO+9VLC5vAmO8N7/GmXn7yjR8qnA6bVAEzfA==} - engines: {node: '>= 0.4'} - dependencies: - call-bind: 1.0.5 - has-tostringtag: 1.0.0 - dev: true - - /is-array-buffer@3.0.2: - resolution: {integrity: sha512-y+FyyR/w8vfIRq4eQcM1EYgSTnmHXPqaF+IgzgraytCFq5Xh8lllDVmAZolPJiZttZLeFSINPYMaEJ7/vWUa1w==} - dependencies: - call-bind: 1.0.5 - get-intrinsic: 1.2.2 - is-typed-array: 1.1.12 - dev: true - - /is-bigint@1.0.4: - resolution: {integrity: sha512-zB9CruMamjym81i2JZ3UMn54PKGsQzsJeo6xvN3HJJ4CAsQNB6iRutp2To77OfCNuoxspsIhzaPoO1zyCEhFOg==} - dependencies: - has-bigints: 1.0.2 - dev: true - - /is-binary-path@2.1.0: - resolution: {integrity: sha512-ZMERYes6pDydyuGidse7OsHxtbI7WVeUEozgR/g7rd0xUimYNlvZRE/K2MgZTjWy725IfelLeVcEM97mmtRGXw==} - engines: {node: '>=8'} - dependencies: - binary-extensions: 2.2.0 - dev: true - - /is-boolean-object@1.1.2: - resolution: {integrity: sha512-gDYaKHJmnj4aWxyj6YHyXVpdQawtVLHU5cb+eztPGczf6cjuTdwve5ZIEfgXqH4e57An1D1AKf8CZ3kYrQRqYA==} - engines: {node: '>= 0.4'} - dependencies: - call-bind: 1.0.5 - has-tostringtag: 1.0.0 - dev: true - - /is-callable@1.2.7: - resolution: {integrity: sha512-1BC0BVFhS/p0qtw6enp8e+8OD0UrK0oFLztSjNzhcKA3WDuJxxAPXzPuPtKkjEY9UUoEWlX/8fgKeu2S8i9JTA==} - engines: {node: '>= 0.4'} - dev: true - - /is-ci@3.0.1: - resolution: {integrity: sha512-ZYvCgrefwqoQ6yTyYUbQu64HsITZ3NfKX1lzaEYdkTDcfKzzCI/wthRRYKkdjHKFVgNiXKAKm65Zo1pk2as/QQ==} - hasBin: true - dependencies: - ci-info: 3.9.0 - dev: true - - /is-core-module@2.13.1: - resolution: {integrity: sha512-hHrIjvZsftOsvKSn2TRYl63zvxsgE0K+0mYMoH6gD4omR5IWB2KynivBQczo3+wF1cCkjzvptnI9Q0sPU66ilw==} - dependencies: - hasown: 2.0.0 - dev: true - - /is-date-object@1.0.5: - resolution: {integrity: sha512-9YQaSxsAiSwcvS33MBk3wTCVnWK+HhF8VZR2jRxehM16QcVOdHqPn4VPHmRK4lSr38n9JriurInLcP90xsYNfQ==} - engines: {node: '>= 0.4'} - dependencies: - has-tostringtag: 1.0.0 - dev: true - - /is-docker@2.2.1: - resolution: {integrity: sha512-F+i2BKsFrH66iaUFc0woD8sLy8getkwTwtOBjvs56Cx4CgJDeKQeqfz8wAYiSb8JOprWhHH5p77PbmYCvvUuXQ==} - engines: {node: '>=8'} - hasBin: true - dev: true - - /is-extglob@2.1.1: - resolution: {integrity: sha512-SbKbANkN603Vi4jEZv49LeVJMn4yGwsbzZworEoyEiutsN3nJYdbO36zfhGJ6QEDpOZIFkDtnq5JRxmvl3jsoQ==} - engines: {node: '>=0.10.0'} - dev: true - - /is-fullwidth-code-point@3.0.0: - resolution: {integrity: sha512-zymm5+u+sCsSWyD9qNaejV3DFvhCKclKdizYaJUuHA83RLjb7nSuGnddCHGv0hk+KY7BMAlsWeK4Ueg6EV6XQg==} - engines: {node: '>=8'} - dev: true - - /is-glob@4.0.3: - resolution: {integrity: sha512-xelSayHH36ZgE7ZWhli7pW34hNbNl8Ojv5KVmkJD4hBdD3th8Tfk9vYasLM+mXWOZhFkgZfxhLSnrwRr4elSSg==} - engines: {node: '>=0.10.0'} - dependencies: - is-extglob: 2.1.1 - dev: true - - /is-installed-globally@0.4.0: - resolution: {integrity: sha512-iwGqO3J21aaSkC7jWnHP/difazwS7SFeIqxv6wEtLU8Y5KlzFTjyqcSIT0d8s4+dDhKytsk9PJZ2BkS5eZwQRQ==} - engines: {node: '>=10'} - dependencies: - global-dirs: 3.0.1 - is-path-inside: 3.0.3 - dev: true - - /is-map@2.0.2: - resolution: {integrity: sha512-cOZFQQozTha1f4MxLFzlgKYPTyj26picdZTx82hbc/Xf4K/tZOOXSCkMvU4pKioRXGDLJRn0GM7Upe7kR721yg==} - dev: true - - /is-natural-number@4.0.1: - resolution: {integrity: sha512-Y4LTamMe0DDQIIAlaer9eKebAlDSV6huy+TWhJVPlzZh2o4tRP5SQWFlLn5N0To4mDD22/qdOq+veo1cSISLgQ==} - dev: true - - /is-negative-zero@2.0.2: - resolution: {integrity: sha512-dqJvarLawXsFbNDeJW7zAz8ItJ9cd28YufuuFzh0G8pNHjJMnY08Dv7sYX2uF5UpQOwieAeOExEYAWWfu7ZZUA==} - engines: {node: '>= 0.4'} - dev: true - - /is-number-object@1.0.7: - resolution: {integrity: sha512-k1U0IRzLMo7ZlYIfzRu23Oh6MiIFasgpb9X76eqfFZAqwH44UI4KTBvBYIZ1dSL9ZzChTB9ShHfLkR4pdW5krQ==} - engines: {node: '>= 0.4'} - dependencies: - has-tostringtag: 1.0.0 - dev: true - - /is-number@7.0.0: - resolution: {integrity: sha512-41Cifkg6e8TylSpdtTpeLVMqvSBEVzTttHvERD741+pnZ8ANv0004MRL43QKPDlK9cGvNp6NZWZUBlbGXYxxng==} - engines: {node: '>=0.12.0'} - dev: true - - /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: true - - /is-plain-obj@3.0.0: - resolution: {integrity: sha512-gwsOE28k+23GP1B6vFl1oVh/WOzmawBrKwo5Ev6wMKzPkaXaCDIQKzLnvsA42DRlbVTWorkgTKIviAKCWkfUwA==} - engines: {node: '>=10'} - dev: true - - /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-port-reachable@4.0.0: - resolution: {integrity: sha512-9UoipoxYmSk6Xy7QFgRv2HDyaysmgSG75TFQs6S+3pDM7ZhKTF/bskZV+0UlABHzKjNVhPjYCLfeZUEg1wXxig==} - engines: {node: ^12.20.0 || ^14.13.1 || >=16.0.0} - dev: true - - /is-regex@1.1.4: - resolution: {integrity: sha512-kvRdxDsxZjhzUX07ZnLydzS1TU/TJlTUHHY4YLL87e37oUA49DfkLqgy+VjFocowy29cKvcSiu+kIv728jTTVg==} - engines: {node: '>= 0.4'} - dependencies: - call-bind: 1.0.5 - has-tostringtag: 1.0.0 - dev: true - - /is-set@2.0.2: - resolution: {integrity: sha512-+2cnTEZeY5z/iXGbLhPrOAaK/Mau5k5eXq9j14CpRTftq0pAJu2MwVRSZhyZWBzx3o6X795Lz6Bpb6R0GKf37g==} - dev: true - - /is-shared-array-buffer@1.0.2: - resolution: {integrity: sha512-sqN2UDu1/0y6uvXyStCOzyhAjCSlHceFoMKJW8W9EU9cvic/QdsZ0kEU93HEy3IUEFZIiH/3w+AH/UQbPHNdhA==} - dependencies: - call-bind: 1.0.5 - dev: true - - /is-stream@1.1.0: - resolution: {integrity: sha512-uQPm8kcs47jx38atAcWTVxyltQYoPT68y9aWYdV6yWXSyW8mzSat0TL6CiWdZeCdF3KrAvpVtnHbTv4RN+rqdQ==} - engines: {node: '>=0.10.0'} - dev: true - - /is-stream@2.0.1: - resolution: {integrity: sha512-hFoiJiTl63nn+kstHGBtewWSKnQLpyb155KHheA1l39uvtO9nWIop1p3udqPcUd/xbF1VLMO4n7OI6p7RbngDg==} - engines: {node: '>=8'} - dev: true - - /is-stream@3.0.0: - resolution: {integrity: sha512-LnQR4bZ9IADDRSkvpqMGvt/tEJWclzklNgSw48V5EAaAeDd6qGvN8ei6k5p0tvxSR171VmGyHuTiAOfxAbr8kA==} - engines: {node: ^12.20.0 || ^14.13.1 || >=16.0.0} - dev: true - - /is-string-and-not-blank@0.0.2: - resolution: {integrity: sha512-FyPGAbNVyZpTeDCTXnzuwbu9/WpNXbCfbHXLpCRpN4GANhS00eEIP5Ef+k5HYSNIzIhdN9zRDoBj6unscECvtQ==} - engines: {node: '>=6.4.0'} - dependencies: - is-string-blank: 1.0.1 - dev: true - - /is-string-blank@1.0.1: - resolution: {integrity: sha512-9H+ZBCVs3L9OYqv8nuUAzpcT9OTgMD1yAWrG7ihlnibdkbtB850heAmYWxHuXc4CHy4lKeK69tN+ny1K7gBIrw==} - dev: true - - /is-string@1.0.7: - resolution: {integrity: sha512-tE2UXzivje6ofPW7l23cjDOMa09gb7xlAqG6jG5ej6uPV32TlWP3NKPigtaGeHNu9fohccRYvIiZMfOOnOYUtg==} - engines: {node: '>= 0.4'} - dependencies: - has-tostringtag: 1.0.0 - dev: true - - /is-symbol@1.0.4: - resolution: {integrity: sha512-C/CPBqKWnvdcxqIARxyOh4v1UUEOCHpgDa0WYgpKDFMszcrPcffg5uhwSgPCLD2WWxmq6isisz87tzT01tuGhg==} - engines: {node: '>= 0.4'} - dependencies: - has-symbols: 1.0.3 - dev: true - - /is-typed-array@1.1.12: - resolution: {integrity: sha512-Z14TF2JNG8Lss5/HMqt0//T9JeHXttXy5pH/DBU4vi98ozO2btxzq9MwYDZYnKwU8nRsz/+GVFVRDq3DkVuSPg==} - engines: {node: '>= 0.4'} - dependencies: - which-typed-array: 1.1.13 - dev: true - - /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-weakmap@2.0.1: - resolution: {integrity: sha512-NSBR4kH5oVj1Uwvv970ruUkCV7O1mzgVFO4/rev2cLRda9Tm9HrL70ZPut4rOHgY0FNrUu9BCbXA2sdQ+x0chA==} - dev: true - - /is-weakref@1.0.2: - resolution: {integrity: sha512-qctsuLZmIQ0+vSSMfoVvyFe2+GSEvnmZ2ezTup1SBse9+twCCeial6EEi3Nc2KFcf6+qz2FBPnjXsk8xhKSaPQ==} - dependencies: - call-bind: 1.0.5 - dev: true - - /is-weakset@2.0.2: - resolution: {integrity: sha512-t2yVvttHkQktwnNNmBQ98AhENLdPUTDTE21uPqAQ0ARwQfGeQKRVS0NNurH7bTf7RrvcVn1OOge45CnBeHCSmg==} - dependencies: - call-bind: 1.0.5 - get-intrinsic: 1.2.2 - dev: true - - /is-windows@1.0.2: - resolution: {integrity: sha512-eXK1UInq2bPmjyX6e3VHIzMLobc4J94i4AWn+Hpq3OU5KkrRC96OAcR3PRJ/pGu6m8TRnBHP9dkXQVsT/COVIA==} - engines: {node: '>=0.10.0'} - dev: true - - /is-wsl@2.2.0: - resolution: {integrity: sha512-fKzAra0rGJUUBwGBgNkHZuToZcn+TtXHpeCgmkMJMMYx1sQDYaCSyjJBSCa2nH1DGm7s3n1oBnohoVTBaN7Lww==} - engines: {node: '>=8'} - 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==} - dev: true - - /isexe@2.0.0: - resolution: {integrity: sha512-RHxMLp9lnKHGHRng9QFhRCMbYAcVpn69smSGcq3f36xjgVVWThj4qqLbTLlq7Ssj8B+fIQ1EuCEGI2lKsyQeIw==} - dev: true - - /isobject@3.0.1: - resolution: {integrity: sha512-WhB9zCku7EGTj/HQQRz5aUQEUeoQZH2bWcltRErOpymJ4boYE6wL9Tbr23krRPSZ+C5zqNSrSw+Cc7sZZ4b7vg==} - engines: {node: '>=0.10.0'} - dev: true - - /isows@1.0.3(ws@8.13.0): - resolution: {integrity: sha512-2cKei4vlmg2cxEjm3wVSqn8pcoRF/LX/wpifuuNquFO4SQmPwarClT+SUCA2lt+l581tTeZIPIZuIDo2jWN1fg==} - peerDependencies: - ws: '*' - dependencies: - ws: 8.13.0 - dev: true - - /isstream@0.1.2: - resolution: {integrity: sha512-Yljz7ffyPbrLpLngrMtZ7NduUgVvi6wG9RJ9IUcyCd59YQ911PBJphODUcbOVbqYfxe1wuYf/LJ8PauMRwsM/g==} - dev: true - - /istanbul-lib-coverage@3.2.2: - resolution: {integrity: sha512-O8dpsF+r0WV/8MNRKfnmrtCWhuKjxrq2w+jpzBL5UZKTi2LeVWnWOmWRxFlesJONmc+wLAGvKQZEOanko0LFTg==} - engines: {node: '>=8'} - dev: true - - /istanbul-lib-hook@3.0.0: - resolution: {integrity: sha512-Pt/uge1Q9s+5VAZ+pCo16TYMWPBIl+oaNIjgLQxcX0itS6ueeaA+pEfThZpH8WxhFgCiEb8sAJY6MdUKgiIWaQ==} - engines: {node: '>=8'} - dependencies: - append-transform: 2.0.0 - dev: true - - /istanbul-lib-instrument@4.0.3: - resolution: {integrity: sha512-BXgQl9kf4WTCPCCpmFGoJkz/+uhvm7h7PFKUYxh7qarQd3ER33vHG//qaE8eN25l07YqZPpHXU9I09l/RD5aGQ==} - engines: {node: '>=8'} - dependencies: - '@babel/core': 7.23.6 - '@istanbuljs/schema': 0.1.3 - istanbul-lib-coverage: 3.2.2 - semver: 6.3.1 - transitivePeerDependencies: - - supports-color - dev: true - - /istanbul-lib-instrument@5.2.1: - resolution: {integrity: sha512-pzqtp31nLv/XFOzXGuvhCb8qhjmTVo5vjVk19XE4CRlSWz0KoeJ3bw9XsA7nOp9YBf4qHjwBxkDzKcME/J29Yg==} - engines: {node: '>=8'} - dependencies: - '@babel/core': 7.23.6 - '@babel/parser': 7.23.6 - '@istanbuljs/schema': 0.1.3 - istanbul-lib-coverage: 3.2.2 - semver: 6.3.1 - transitivePeerDependencies: - - supports-color - dev: true - - /istanbul-lib-processinfo@2.0.3: - resolution: {integrity: sha512-NkwHbo3E00oybX6NGJi6ar0B29vxyvNwoC7eJ4G4Yq28UfY758Hgn/heV8VRFhevPED4LXfFz0DQ8z/0kw9zMg==} - engines: {node: '>=8'} - dependencies: - archy: 1.0.0 - cross-spawn: 7.0.3 - istanbul-lib-coverage: 3.2.2 - p-map: 3.0.0 - rimraf: 3.0.2 - uuid: 8.3.2 - dev: true - - /istanbul-lib-report@3.0.1: - resolution: {integrity: sha512-GCfE1mtsHGOELCU8e/Z7YWzpmybrx/+dSTfLrvY8qRmaY6zXTKWn6WQIjaAFw069icm6GVMNkgu0NzI4iPZUNw==} - engines: {node: '>=10'} - 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.1: - resolution: {integrity: sha512-n3s8EwkdFIJCG3BPKBYvskgXGoy88ARzvegkitk60NxRdwltLOTaH7CUiMRXvwYorl0Q712iEjcWB+fK/MrWVw==} - engines: {node: '>=10'} - 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.1.6: - resolution: {integrity: sha512-TLgnMkKg3iTDsQ9PbPTdpfAK2DzjF9mqUG7RMgcQl8oFjad8ob4laGxv5XV5U9MAfx8D6tSJiUyuAwzLicaxlg==} - engines: {node: '>=8'} - dependencies: - html-escaper: 2.0.2 - istanbul-lib-report: 3.0.1 - dev: true - - /jest-worker@27.5.1: - resolution: {integrity: sha512-7vuh85V5cdDofPyxn58nrPjBktZo0u9x1g8WtjQol+jZDaE+fhN+cIvTj11GndBnMnyfrUOG1sZQxCdjKh+DKg==} - engines: {node: '>= 10.13.0'} - dependencies: - '@types/node': 20.10.4 - merge-stream: 2.0.0 - supports-color: 8.1.1 - dev: true - - /joi@17.11.0: - resolution: {integrity: sha512-NgB+lZLNoqISVy1rZocE9PZI36bL/77ie924Ri43yEvi9GUUMPeyVIr8KdFTMUlby1p0PBYMk9spIxEUQYqrJQ==} - 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 - - /js-tokens@4.0.0: - resolution: {integrity: sha512-RdJUflcE3cUzKiMqQgsCu06FPu9UdIJO0beYbPhHN4k6apgJtifcoCtT9bcxOpYBtpD2kCM6Sbzg4CausW/PKQ==} - dev: true - - /js-yaml@3.14.1: - resolution: {integrity: sha512-okMH7OXXJ7YrN9Ok3/SXrnu4iX9yOk+25nqX4imS2npuvTYDmo/QEZoqwZkYaIDk3jVvBOTOIEgEhaLOynBS9g==} - hasBin: true - dependencies: - argparse: 1.0.10 - esprima: 4.0.1 - dev: true - - /js-yaml@4.1.0: - resolution: {integrity: sha512-wpxZs9NoxZaJESJGIZTyDEaYpl0FKSA+FB9aJiyemKhMwkxQg63h4T1KJgUGHpTqPDNRcmmYLugrRjJlBtWvRA==} - hasBin: true - dependencies: - argparse: 2.0.1 - dev: true - - /jsbn@0.1.1: - resolution: {integrity: sha512-UVU9dibq2JcFWxQPA6KCqj5O42VOmAY3zQUfEKxU0KpTGXwNoCjkX1e13eHNvw/xPynt6pU0rZ1htjWTNTSXsg==} - dev: true - - /jsesc@0.5.0: - resolution: {integrity: sha512-uZz5UnB7u4T9LvwmFqXii7pZSouaRPorGs5who1Ip7VO0wxanFvBL7GkM6dTHlgX+jhBApRetaWpnDabOeTcnA==} - hasBin: true - dev: true - - /jsesc@2.5.2: - resolution: {integrity: sha512-OYu7XEzjkCQ3C5Ps3QIZsQfNpqoJyZZA99wd9aWd05NCtC5pWOkShK2mkL6HXQR6/Cy2lbNdPlZBpuQHXE63gA==} - engines: {node: '>=4'} - hasBin: true - dev: true - - /json-buffer@3.0.1: - resolution: {integrity: sha512-4bV5BfR2mqfQTJm+V5tPPdf+ZpuhiIvTuAB5g8kcrXOZpTT/QwwVRWBywX1ozr6lEuPdbHxwaJlm9G6mI2sfSQ==} - dev: true - - /json-parse-even-better-errors@2.3.1: - resolution: {integrity: sha512-xyFwyhro/JEof6Ghe2iz2NcXoj2sloNsWr/XsERDK/oiPCfaNhl5ONfp+jQdAZRQQ0IJWNzH9zIZF7li91kh2w==} - dev: true - - /json-schema-traverse@0.4.1: - resolution: {integrity: sha512-xbbCH5dCYU5T8LcEhhuh7HJ88HXuW3qsI3Y0zOZFKfZEHcpWiHU/Jxzk629Brsab/mMiHQti9wMP+845RPe3Vg==} - dev: true - - /json-schema-traverse@1.0.0: - resolution: {integrity: sha512-NM8/P9n3XjXhIZn1lLhkFaACTOURQXjWhV4BA/RnOv8xvgqtqpAX9IO4mRQxSx1Rlo4tqzeqb0sOlruaOy3dug==} - dev: true - - /json-schema@0.4.0: - resolution: {integrity: sha512-es94M3nTIfsEPisRafak+HDLfHXnKBhV3vU5eqPcS3flIWqcxJWgXHXiey3YrpaNsanY5ei1VoYEbOzijuq9BA==} - dev: true - - /json-stringify-safe@5.0.1: - resolution: {integrity: sha512-ZClg6AaYvamvYEE82d3Iyd3vSSIjQ+odgjaTzRuO3s7toCdFKczob2i0zCh7JE8kWn17yvAWhUVxvqGwUalsRA==} - dev: true - - /json5@1.0.2: - resolution: {integrity: sha512-g1MWMLBiz8FKi1e4w0UyVL3w+iJceWAFBAaBnnGKOpNa5f8TLktkbre1+s6oICydWAm+HRUGTmI+//xv2hvXYA==} - hasBin: true - 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 - - /jsonfile@4.0.0: - resolution: {integrity: sha512-m6F1R3z8jjlf2imQHS2Qez5sjKWQzbuuhuJ/FKYFRZvPE3PuHcSMVZzfsLhGVOkfd20obL5SWEBew5ShlquNxg==} - optionalDependencies: - graceful-fs: 4.2.11 - dev: true - - /jsonfile@6.1.0: - resolution: {integrity: sha512-5dgndWOriYSm5cnYaJNhalLNDKOqFwyDB/rr1E9ZsGciGvKPs8R2xYGCacuf3z6K1YKDz182fd+fY3cn3pMqXQ==} - dependencies: - universalify: 2.0.1 - optionalDependencies: - graceful-fs: 4.2.11 - dev: true - - /jsprim@2.0.2: - resolution: {integrity: sha512-gqXddjPqQ6G40VdnI6T6yObEC+pDNvyP95wdQhkWkg7crHH3km5qP1FsOXEkzEQwnz6gz5qGTn1c2Y52wP3OyQ==} - engines: {'0': node >=0.6.0} - dependencies: - assert-plus: 1.0.0 - extsprintf: 1.3.0 - json-schema: 0.4.0 - verror: 1.10.0 - dev: true - - /keyv@4.5.4: - resolution: {integrity: sha512-oxVHkHR/EJf2CNXnWxRLW6mg7JyCCUcG0DtEGmL2ctUo1PNTin1PUil+r/+4r5MpVgC/fn1kjsx7mjSujKqIpw==} - dependencies: - json-buffer: 3.0.1 - dev: true - - /kind-of@6.0.3: - resolution: {integrity: sha512-dcS1ul+9tmeD95T+x28/ehLgd9mENa3LsvDTtzm3vyBEO7RPptvAD+t44WVXaUjTBRcrpFeFlC8WCruUR456hw==} - engines: {node: '>=0.10.0'} - dev: true - - /launch-editor@2.6.1: - resolution: {integrity: sha512-eB/uXmFVpY4zezmGp5XtU21kwo7GBbKB+EQ+UZeWtGb9yAM5xt/Evk+lYH3eRNAtId+ej4u7TYPFZ07w4s7rRw==} - dependencies: - picocolors: 1.0.0 - shell-quote: 1.8.1 - dev: true - - /lazy-ass@1.6.0: - resolution: {integrity: sha512-cc8oEVoctTvsFZ/Oje/kGnHbpWHYBe8IAJe4C0QNc3t8uM/0Y8+erSz/7Y1ALuXTEZTMvxXwO6YbX1ey3ujiZw==} - engines: {node: '> 0.8'} - dev: true - - /listr2@3.14.0(enquirer@2.4.1): - resolution: {integrity: sha512-TyWI8G99GX9GjE54cJ+RrNMcIFBfwMPxc3XTFiAYGN4s10hWROGtOg7+O6u6LE3mNkyld7RSLE6nrKBvTfcs3g==} - engines: {node: '>=10.0.0'} - peerDependencies: - enquirer: '>= 2.3.0 < 3' - peerDependenciesMeta: - enquirer: - optional: true - dependencies: - cli-truncate: 2.1.0 - colorette: 2.0.20 - enquirer: 2.4.1 - log-update: 4.0.0 - p-map: 4.0.0 - rfdc: 1.3.0 - rxjs: 7.8.1 - through: 2.3.8 - wrap-ansi: 7.0.0 - dev: true - - /loader-runner@4.3.0: - resolution: {integrity: sha512-3R/1M+yS3j5ou80Me59j7F9IMs4PXs3VqRrm0TU3AbKPxlmpoY1TNscJV/oGJXo8qCatFGTfDbY6W6ipGOYXfg==} - engines: {node: '>=6.11.5'} - dev: true - - /loader-utils@1.4.2: - resolution: {integrity: sha512-I5d00Pd/jwMD2QCduo657+YM/6L3KZu++pmX9VFncxaxvHcru9jx1lBaFft+r4Mt2jK0Yhp41XlRAihzPxHNCg==} - engines: {node: '>=4.0.0'} - dependencies: - big.js: 5.2.2 - emojis-list: 3.0.0 - json5: 1.0.2 - dev: true - - /local-pkg@0.4.1: - resolution: {integrity: sha512-lL87ytIGP2FU5PWwNDo0w3WhIo2gopIAxPg9RxDYF7m4rr5ahuZxP22xnJHIvaLTe4Z9P6uKKY2UHiwyB4pcrw==} - engines: {node: '>=14'} - dev: true - - /locate-path@5.0.0: - resolution: {integrity: sha512-t7hw9pI+WvuwNJXwk5zVHpyhIqzg2qTlklJOf0mVxGSbe3Fp2VieZcduNYjaLDoy6p9uGpQEGWG87WpMKlNq8g==} - engines: {node: '>=8'} - dependencies: - p-locate: 4.1.0 - dev: true - - /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.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.flattendeep@4.4.0: - resolution: {integrity: sha512-uHaJFihxmJcEX3kT4I23ABqKKalJ/zDrDg0lsFtc1h+3uw49SIJ5beyhx5ExVRti3AvKoOJngIj7xz3oylPdWQ==} - dev: true - - /lodash.isstring@4.0.1: - resolution: {integrity: sha512-0wJxfxH1wgO3GrbuP+dTTk7op+6L41QCXbGINEmD+ny/G/eCqGzxyCsh7159S+mgDDcoarnBw6PC1PS5+wUGgw==} - dev: true - - /lodash.kebabcase@4.1.1: - resolution: {integrity: sha512-N8XRTIMMqqDgSy4VLKPnJ/+hpGZN+PHQiJnSenYqPaVV/NCqEogTnAdZLQiGKhxX+JCs8waWq2t1XHWKOmlY8g==} - dev: true - - /lodash.once@4.1.1: - resolution: {integrity: sha512-Sb487aTOCr9drQVL8pIxOzVhafOjZN9UU54hiN8PU3uAiSV7lx1yYNpbNmex2PK6dSJoNTSJUUswT651yww3Mg==} - dev: true - - /lodash.snakecase@4.1.1: - resolution: {integrity: sha512-QZ1d4xoBHYUeuouhEq3lk3Uq7ldgyFXGBhg04+oRLnIz8o9T65Eh+8YdroUwn846zchkA9yDsDl5CVVaV2nqYw==} - dev: true - - /lodash.upperfirst@4.3.1: - resolution: {integrity: sha512-sReKOYJIJf74dhJONhU4e0/shzi1trVbSWDOhKYE5XV2O+H7Sb2Dihwuc7xWxVl+DgFPyTqIN3zMfT9cq5iWDg==} - dev: true - - /lodash@4.17.21: - resolution: {integrity: sha512-v2kDEe57lecTulaDIuNTPy3Ry4gLGJ6Z1O3vE1krgXZNrsQ+LFTGHVxVjcXPs17LhbZVGedAJv8XZ1tvj5FvSg==} - dev: true - - /log-symbols@4.1.0: - resolution: {integrity: sha512-8XPvpAA8uyhfteu8pIvQxpJZ7SYYdpUivZpGy6sFsBuKRY/7rQGavedeB8aK+Zkyq6upMFVL/9AW6vOYzfRyLg==} - engines: {node: '>=10'} - dependencies: - chalk: 4.1.2 - is-unicode-supported: 0.1.0 - dev: true - - /log-update@4.0.0: - resolution: {integrity: sha512-9fkkDevMefjg0mmzWFBW8YkFP91OrizzkW3diF7CpG+S2EYdy4+TVfGwz1zeF8x7hCx1ovSPTOE9Ngib74qqUg==} - engines: {node: '>=10'} - dependencies: - ansi-escapes: 4.3.2 - cli-cursor: 3.1.0 - slice-ansi: 4.0.0 - wrap-ansi: 6.2.0 - dev: true - - /loose-envify@1.4.0: - resolution: {integrity: sha512-lyuxPGr/Wfhrlem2CL/UcnUc1zcqKAImBDzukY7Y5F/yQiNdko6+fRLevlw1HgMySw7f611UIY408EtxRSoK3Q==} - hasBin: true - dependencies: - js-tokens: 4.0.0 - dev: true - - /lower-case@2.0.2: - resolution: {integrity: sha512-7fm3l3NAF9WfN6W3JOmf5drwpVqX78JtoGJ3A6W0a6ZnldM41w2fV5D490psKFTpMds8TJse/eHLFFsNHHjHgg==} - dependencies: - tslib: 2.6.2 - dev: true - - /lowercase-keys@2.0.0: - resolution: {integrity: sha512-tqNXrS78oMOE73NMxK4EMLQsQowWf8jKooH9g7xPavRT706R6bkQJ6DY2Te7QukaZsulxa30wQ7bk0pm4XiHmA==} - engines: {node: '>=8'} - dev: true - - /lru-cache@5.1.1: - resolution: {integrity: sha512-KpNARQA3Iwv+jTA0utUVVbrh+Jlrr1Fv0e56GGzAFOXN7dk/FviaDW8LHmK52DlcH4WP2n6gI8vN1aesBFgo9w==} - dependencies: - yallist: 3.1.1 - dev: true - - /lru-cache@6.0.0: - resolution: {integrity: sha512-Jo6dJ04CmSjuznwJSS3pUeWmd/H0ffTlkXXgwZi+eq1UCmqQwCh+eLsYOYCwY991i2Fah4h1BEMCx4qThGbsiA==} - engines: {node: '>=10'} - dependencies: - yallist: 4.0.0 - dev: true - - /lz-string@1.5.0: - resolution: {integrity: sha512-h5bgJWpxJNswbU7qCrV0tIKQCaS3blPDrqKWx+QxzuzL1zGUzij9XCWLrSLsJPu5t+eWA/ycetzYAO5IOMcWAQ==} - hasBin: true - dev: true - - /make-dir@1.3.0: - resolution: {integrity: sha512-2w31R7SJtieJJnQtGc7RVL2StM2vGYVfqUOvUDxH6bC6aJTxPxTF0GnIgCyu7tjockiUWAYQRbxa7vKn34s5sQ==} - engines: {node: '>=4'} - dependencies: - pify: 3.0.0 - 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'} - dependencies: - semver: 6.3.1 - dev: true - - /make-dir@4.0.0: - resolution: {integrity: sha512-hXdUTZYIVOt1Ex//jAQi+wTZZpUpwBj/0QsOzqegb3rGMMeJiSEu5xLHnYfBrRV4RH2+OCSOO95Is/7x1WJ4bw==} - engines: {node: '>=10'} - dependencies: - semver: 7.5.4 - dev: true - - /media-typer@0.3.0: - resolution: {integrity: sha512-dq+qelQ9akHpcOl/gUVRTxVIOkAJ1wR3QAvb4RsVjS8oVoFjDGTc679wJYmUmknUF5HwMLOgb5O+a3KxfWapPQ==} - engines: {node: '>= 0.6'} - dev: true - - /memfs@3.5.3: - resolution: {integrity: sha512-UERzLsxzllchadvbPs5aolHh65ISpKpM+ccLbOJ8/vvpBKmAWf+la7dXFy7Mr0ySHbdHrFv5kGFCUHHe6GFEmw==} - engines: {node: '>= 4.0.0'} - dependencies: - fs-monkey: 1.0.5 - dev: true - - /merge-descriptors@1.0.1: - resolution: {integrity: sha512-cCi6g3/Zr1iqQi6ySbseM1Xvooa98N0w31jzUYrXPX2xqObmFGHJ0tQ5u74H3mVh7wLouTseZyYIq39g8cNp1w==} - dev: true - - /merge-stream@2.0.0: - resolution: {integrity: sha512-abv/qOcuPfk3URPfDzmZU1LKmuw8kT+0nIHvKrKgFrwifol/doWcdA4ZqsWQ8ENrFKkd67Mfpo/LovbIUsbt3w==} - dev: true - - /merge2@1.4.1: - resolution: {integrity: sha512-8q7VEgMJW4J8tcfVPy8g09NcQwZdbwFEqhe/WZkoIzjn/3TGDwtOCYtXGxA3O8tPzpczCCDgv+P2P5y00ZJOOg==} - engines: {node: '>= 8'} - dev: true - - /methods@1.1.2: - resolution: {integrity: sha512-iclAHeNqNm68zFtnZ0e+1L2yUIdvzNoauKU4WBA3VvH/vPFieF7qfRlwUZU+DA9P9bPXIS90ulxoUoCH23sV2w==} - engines: {node: '>= 0.6'} - dev: true - - /micromatch@4.0.5: - resolution: {integrity: sha512-DMy+ERcEW2q8Z2Po+WNXuw3c5YaUSFjAO5GsJqfEl7UjvtIuFKO6ZrKvcItdy98dwFI2N1tg3zNIdKaQT+aNdA==} - engines: {node: '>=8.6'} - dependencies: - braces: 3.0.2 - picomatch: 2.3.1 - dev: true - - /mime-db@1.33.0: - resolution: {integrity: sha512-BHJ/EKruNIqJf/QahvxwQZXKygOQ256myeN/Ew+THcAa5q+PjyTTMMeNQC4DZw5AwfvelsUrA6B67NKMqXDbzQ==} - engines: {node: '>= 0.6'} - dev: true - - /mime-db@1.52.0: - resolution: {integrity: sha512-sPU4uV7dYlvtWJxwwxHD0PuihVNiE7TyAbQ5SWxDCB9mUYvOgroQOwYQQOKPJ8CIbE+1ETVlOoK1UC2nU3gYvg==} - engines: {node: '>= 0.6'} - dev: true - - /mime-types@2.1.18: - resolution: {integrity: sha512-lc/aahn+t4/SWV/qcmumYjymLsWfN3ELhpmVuUFjgsORruuZPVSwAQryq+HHGvO/SI2KVX26bx+En+zhM8g8hQ==} - engines: {node: '>= 0.6'} - dependencies: - mime-db: 1.33.0 - dev: true - - /mime-types@2.1.35: - resolution: {integrity: sha512-ZDY+bPm5zTTF+YpCrAU9nK0UgICYPT0QtT1NZWFv4s++TNkcgVaT0g6+4R2uI4MjQjzysHB1zxuWL50hzaeXiw==} - engines: {node: '>= 0.6'} - dependencies: - mime-db: 1.52.0 - dev: true - - /mime@1.6.0: - resolution: {integrity: sha512-x0Vn8spI+wuJ1O6S7gnbaQg8Pxh4NNHb7KSINmEWKiPE4RKOplvijn+NkmYmmRgP68mc70j2EbeTFRsrswaQeg==} - engines: {node: '>=4'} - hasBin: true - dev: true - - /mimic-fn@2.1.0: - resolution: {integrity: sha512-OqbOk5oEQeAZ8WXWydlu9HJjz9WVdEIvamMCcXmuqUYjTknH/sqsWvhQ3vgwKFRR1HpjvNBKQ37nbJgYzGqGcg==} - engines: {node: '>=6'} - dev: true - - /mimic-fn@4.0.0: - resolution: {integrity: sha512-vqiC06CuhBTUdZH+RYl8sFrL096vA45Ok5ISO6sE/Mr1jRbGH4Csnhi8f3wKVl7x8mO4Au7Ir9D3Oyv1VYMFJw==} - engines: {node: '>=12'} - dev: true - - /mimic-response@1.0.1: - resolution: {integrity: sha512-j5EctnkH7amfV/q5Hgmoal1g2QHFJRraOtmx0JpIqkxhBhI/lJSl1nMpQ45hVarwNETOoWEimndZ4QK0RHxuxQ==} - engines: {node: '>=4'} - dev: true - - /mimic-response@3.1.0: - resolution: {integrity: sha512-z0yWI+4FDrrweS8Zmt4Ej5HdJmky15+L2e6Wgn3+iK5fWzb6T3fhNFq2+MeTRb064c6Wr4N/wv0DzQTjNzHNGQ==} - engines: {node: '>=10'} - dev: true - - /minimalistic-assert@1.0.1: - resolution: {integrity: sha512-UtJcAD4yEaGtjPezWuO9wC4nwUnVH/8/Im3yEHQP4b67cXlD/Qr9hdITCU1xDbSEXg2XKNaP8jsReV7vQd00/A==} - dev: true - - /minimatch@3.1.2: - resolution: {integrity: sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw==} - dependencies: - brace-expansion: 1.1.11 - dev: true - - /minimist@1.2.8: - resolution: {integrity: sha512-2yyAR8qBkN3YuheJanUpWC5U3bb5osDywNB8RzDVlDwDHbocAJveqqj1u8+SVD7jkWT4yvsHCpWqqWqAxb0zCA==} - dev: true - - /ms@2.0.0: - resolution: {integrity: sha512-Tpp60P6IUJDTuOq/5Z8cdskzJujfwqfOTkrwIwj7IRISpnkJnT6SyJ4PCPnGMoFjC9ddhal5KVIYtAt97ix05A==} - dev: true - - /ms@2.1.2: - resolution: {integrity: sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==} - dev: true - - /ms@2.1.3: - resolution: {integrity: sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA==} - dev: true - - /multicast-dns@7.2.5: - resolution: {integrity: sha512-2eznPJP8z2BFLX50tf0LuODrpINqP1RVIm/CObbTcBRITQgmC/TjcREF1NeTBzIcR5XO/ukWo+YHOjBbFwIupg==} - hasBin: true - dependencies: - dns-packet: 5.6.1 - thunky: 1.1.0 - dev: true - - /negotiator@0.6.3: - resolution: {integrity: sha512-+EUsqGPLsM+j/zdChZjsnX51g4XrHFOIXwfnCVPGlQk/k5giakcKsuxCObBRu6DSm9opw/O6slWbJdghQM4bBg==} - engines: {node: '>= 0.6'} - dev: true - - /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 - dev: true - - /node-fetch@2.7.0: - resolution: {integrity: sha512-c4FRfUm/dbcWZ7U+1Wq0AwCyFL+3nt2bEw05wfxSz+DWpWsitgmSgYmy2dQdWyKC1694ELPqMs/YzUSNozLt8A==} - engines: {node: 4.x || >=6.0.0} - peerDependencies: - encoding: ^0.1.0 - peerDependenciesMeta: - encoding: - optional: true - dependencies: - whatwg-url: 5.0.0 - dev: true - - /node-forge@1.3.1: - resolution: {integrity: sha512-dPEtOeMvF9VMcYV/1Wb8CPoVAXtp6MKMlcbAt4ddqmGqUJ6fQZFXkNZNkNlfevtNkGtaSoXf/vNNNSvgrdXwtA==} - engines: {node: '>= 6.13.0'} - dev: true - - /node-preload@0.2.1: - resolution: {integrity: sha512-RM5oyBy45cLEoHqCeh+MNuFAxO0vTFBLskvQbOKnEE7YTTSN4tbN8QWDIPQ6L+WvKsB/qLEGpYe2ZZ9d4W9OIQ==} - engines: {node: '>=8'} - dependencies: - process-on-spawn: 1.0.0 - dev: true - - /node-releases@2.0.14: - resolution: {integrity: sha512-y10wOWt8yZpqXmOgRo77WaHEmhYQYGNA6y421PKsKYWEK8aW+cqAphborZDhqfyKrbZEN92CN1X2KbafY2s7Yw==} - dev: true - - /normalize-path@3.0.0: - resolution: {integrity: sha512-6eZs5Ls3WtCisHWp9S2GUy8dqkpGi4BVSz3GaqiE6ezub0512ESztXUwUB6C6IKbQkY2Pnb/mD4WYojCRwcwLA==} - engines: {node: '>=0.10.0'} - dev: true - - /normalize-url@6.1.0: - resolution: {integrity: sha512-DlL+XwOy3NxAQ8xuC0okPgK46iuVNAK01YN7RueYBqqFeGsBjV9XmCAzAdgt+667bCl5kPh9EqKKDwnaPG1I7A==} - engines: {node: '>=10'} - dev: true - - /npm-run-path@4.0.1: - resolution: {integrity: sha512-S48WzZW777zhNIrn7gxOlISNAqi9ZC/uQFnRdbeIHhZhCA6UqpkOT8T1G7BvfdgP4Er8gF4sUbaS0i7QvIfCWw==} - engines: {node: '>=8'} - 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} - dependencies: - path-key: 4.0.0 - dev: true - - /nth-check@2.1.1: - resolution: {integrity: sha512-lqjrjmaOoAnWfMmBPL+XNnynZh2+swxiX3WUE0s4yEHI6m+AwrK2UZOimIRl3X/4QctVqS8AiZjFqyOGrMXb/w==} - dependencies: - boolbase: 1.0.0 - dev: true - - /nyc@15.1.0: - resolution: {integrity: sha512-jMW04n9SxKdKi1ZMGhvUTHBN0EICCRkHemEoE5jm6mTYcqcdas0ATzgUgejlQUHMvpnOZqGB5Xxsv9KxJW1j8A==} - engines: {node: '>=8.9'} - hasBin: true - dependencies: - '@istanbuljs/load-nyc-config': 1.1.0 - '@istanbuljs/schema': 0.1.3 - caching-transform: 4.0.0 - convert-source-map: 1.9.0 - decamelize: 1.2.0 - find-cache-dir: 3.3.2 - find-up: 4.1.0 - foreground-child: 2.0.0 - get-package-type: 0.1.0 - glob: 7.2.3 - istanbul-lib-coverage: 3.2.2 - istanbul-lib-hook: 3.0.0 - istanbul-lib-instrument: 4.0.3 - istanbul-lib-processinfo: 2.0.3 - istanbul-lib-report: 3.0.1 - istanbul-lib-source-maps: 4.0.1 - istanbul-reports: 3.1.6 - make-dir: 3.1.0 - node-preload: 0.2.1 - p-map: 3.0.0 - process-on-spawn: 1.0.0 - resolve-from: 5.0.0 - rimraf: 3.0.2 - signal-exit: 3.0.7 - spawn-wrap: 2.0.0 - test-exclude: 6.0.0 - yargs: 15.4.1 - transitivePeerDependencies: - - supports-color - dev: true - - /object-assign@4.1.1: - resolution: {integrity: sha512-rJgTQnkUnH1sFw8yT6VSU3zD3sWmu6sZhIseY8VX+GRu3P6F7Fu+JNDoXfklElbLJSnc3FUQHVe4cU5hj+BcUg==} - engines: {node: '>=0.10.0'} - dev: true - - /object-inspect@1.13.1: - resolution: {integrity: sha512-5qoj1RUiKOMsCCNLV1CBiPYE10sziTsnmNxkAI/rZhiD63CF7IqdFGC/XzjWjpSgLf0LxXX3bDFIh0E18f6UhQ==} - dev: true - - /object-is@1.1.5: - resolution: {integrity: sha512-3cyDsyHgtmi7I7DfSSI2LDp6SK2lwvtbg0p0R1e0RvTqF5ceGx+K2dfSjm1bKDMVCFEDAQvy+o8c6a7VujOddw==} - engines: {node: '>= 0.4'} - dependencies: - call-bind: 1.0.5 - define-properties: 1.2.1 - dev: true - - /object-keys@1.1.1: - resolution: {integrity: sha512-NuAESUOUMrlIXOfHKzD6bpPu3tYt3xvjNdRIQ+FeT0lNb4K8WR70CaDxhuNguS2XG+GjkyMwOzsN5ZktImfhLA==} - engines: {node: '>= 0.4'} - dev: true - - /object.assign@4.1.5: - resolution: {integrity: sha512-byy+U7gp+FVwmyzKPYhW2h5l3crpmGsxl7X2s8y43IgxvG4g3QZ6CffDtsNQy1WsmZpQbO+ybo0AlW7TY6DcBQ==} - engines: {node: '>= 0.4'} - dependencies: - call-bind: 1.0.5 - define-properties: 1.2.1 - has-symbols: 1.0.3 - object-keys: 1.1.1 - dev: true - - /object.getownpropertydescriptors@2.1.7: - resolution: {integrity: sha512-PrJz0C2xJ58FNn11XV2lr4Jt5Gzl94qpy9Lu0JlfEj14z88sqbSBJCBEzdlNUCzY2gburhbrwOZ5BHCmuNUy0g==} - engines: {node: '>= 0.8'} - dependencies: - array.prototype.reduce: 1.0.6 - call-bind: 1.0.5 - define-properties: 1.2.1 - es-abstract: 1.22.3 - safe-array-concat: 1.0.1 - dev: true - - /obuf@1.1.2: - resolution: {integrity: sha512-PX1wu0AmAdPqOL1mWhqmlOd8kOIZQwGZw6rh7uby9fTc5lhaOWFLX3I6R1hrF9k3zUY40e6igsLGkDXK92LJNg==} - dev: true - - /on-finished@2.4.1: - resolution: {integrity: sha512-oVlzkg3ENAhCk2zdv7IJwd/QUD4z2RxRwpkcGY8psCVcCYZNq4wYnVWALHM+brtuJjePWiYF/ClmuDr8Ch5+kg==} - engines: {node: '>= 0.8'} - dependencies: - ee-first: 1.1.1 - dev: true - - /on-headers@1.0.2: - resolution: {integrity: sha512-pZAE+FJLoyITytdqK0U5s+FIpjN0JP3OzFi/u8Rx+EV5/W+JTWGXG8xFzevE7AjBfDqHv/8vL8qQsIhHnqRkrA==} - engines: {node: '>= 0.8'} - dev: true - - /once@1.4.0: - resolution: {integrity: sha512-lNaJgI+2Q5URQBkccEKHTQOPaXdUxnZZElQTZY0MFUAuaEqe1E+Nyvgdz/aIyNi6Z9MzO5dv1H8n58/GELp3+w==} - dependencies: - wrappy: 1.0.2 - dev: true - - /onetime@5.1.2: - resolution: {integrity: sha512-kbpaSSGJTWdAY5KPVeMOKXSrPtr8C8C7wodJbcsd51jRnmD+GZu8Y0VoU6Dm5Z4vWr0Ig/1NKuWRKf7j5aaYSg==} - engines: {node: '>=6'} - dependencies: - mimic-fn: 2.1.0 - dev: true - - /onetime@6.0.0: - resolution: {integrity: sha512-1FlR+gjXK7X+AsAHso35MnyN5KqGwJRi/31ft6x0M194ht7S+rWAvd7PHss9xSKMzE0asv1pyIHaJYq+BbacAQ==} - engines: {node: '>=12'} - dependencies: - mimic-fn: 4.0.0 - dev: true - - /open@8.4.2: - resolution: {integrity: sha512-7x81NCL719oNbsq/3mh+hVrAWmFuEYUqrq/Iw3kUzH8ReypT9QQ0BLoJS7/G9k6N81XjW4qHWtjWwe/9eLy1EQ==} - engines: {node: '>=12'} - dependencies: - define-lazy-prop: 2.0.0 - is-docker: 2.2.1 - is-wsl: 2.2.0 - dev: true - - /os-homedir@1.0.2: - resolution: {integrity: sha512-B5JU3cabzk8c67mRRd3ECmROafjYMXbuzlwtqdM8IbS8ktlTix8aFGb2bAGKrSRIlnfKwovGUUr72JUPyOb6kQ==} - engines: {node: '>=0.10.0'} - dev: true - - /ospath@1.2.2: - resolution: {integrity: sha512-o6E5qJV5zkAbIDNhGSIlyOhScKXgQrSRMilfph0clDfM0nEnBOlKlH4sWDmG95BW/CvwNz0vmm7dJVtU2KlMiA==} - dev: true - - /p-cancelable@2.1.1: - resolution: {integrity: sha512-BZOr3nRQHOntUjTrH8+Lh54smKHoHyur8We1V8DSMVrl5A2malOOwuJRnKRDjSnkoeBh4at6BwEnb5I7Jl31wg==} - engines: {node: '>=8'} - dev: true - - /p-event@2.3.1: - resolution: {integrity: sha512-NQCqOFhbpVTMX4qMe8PF8lbGtzZ+LCiN7pcNrb/413Na7+TRoe1xkKUzuWa/YEJdGQ0FvKtj35EEbDoVPO2kbA==} - engines: {node: '>=6'} - dependencies: - p-timeout: 2.0.1 - dev: true - - /p-finally@1.0.0: - resolution: {integrity: sha512-LICb2p9CB7FS+0eR1oqWnHhp0FljGLZCWBE9aix0Uye9W8LTQPwMTYVGWQWIw9RdQiDg4+epXQODwIYJtSJaow==} - engines: {node: '>=4'} - dev: true - - /p-limit@2.3.0: - resolution: {integrity: sha512-//88mFWSJx8lxCzwdAABTJL2MyWB12+eIY7MDL2SqLmAkeKU9qxRvWuSyTjm3FUmpBEMuFfckAIqEaVGUDxb6w==} - engines: {node: '>=6'} - dependencies: - p-try: 2.2.0 - dev: true - - /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-locate@4.1.0: - resolution: {integrity: sha512-R79ZZ/0wAxKGu3oYMlz8jy/kbhsNrS7SKZ7PxEHBgJ5+F2mtFW2fK2cOtBh1cHYkQsbzFV7I+EoRKe6Yt0oK7A==} - engines: {node: '>=8'} - dependencies: - p-limit: 2.3.0 - dev: true - - /p-locate@6.0.0: - resolution: {integrity: sha512-wPrq66Llhl7/4AGC6I+cqxT07LhXvWL08LNXz1fENOw0Ap4sRZZ/gZpTTJ5jpurzzzfS2W/Ge9BY3LgLjCShcw==} - engines: {node: ^12.20.0 || ^14.13.1 || >=16.0.0} - dependencies: - p-limit: 4.0.0 - dev: true - - /p-map@3.0.0: - resolution: {integrity: sha512-d3qXVTF/s+W+CdJ5A29wywV2n8CQQYahlgz2bFiA+4eVNJbHJodPZ+/gXwPGh0bOqA+j8S+6+ckmvLGPk1QpxQ==} - engines: {node: '>=8'} - dependencies: - aggregate-error: 3.1.0 - dev: true - - /p-map@4.0.0: - resolution: {integrity: sha512-/bjOqmgETBYB5BoEeGVea8dmvHb2m9GLy1E9W43yeyfP6QQCZGFNa+XRceJEuDB6zqr+gKpIAmlLebMpykw/MQ==} - engines: {node: '>=10'} - dependencies: - aggregate-error: 3.1.0 - dev: true - - /p-retry@4.6.2: - resolution: {integrity: sha512-312Id396EbJdvRONlngUx0NydfrIQ5lsYu0znKVUzVvArzEIt08V1qhtyESbGVd1FGX7UKtiFp5uwKZdM8wIuQ==} - engines: {node: '>=8'} - dependencies: - '@types/retry': 0.12.0 - retry: 0.13.1 - dev: true - - /p-timeout@2.0.1: - resolution: {integrity: sha512-88em58dDVB/KzPEx1X0N3LwFfYZPyDc4B6eF38M1rk9VTZMbxXXgjugz8mmwpS9Ox4BDZ+t6t3QP5+/gazweIA==} - engines: {node: '>=4'} - dependencies: - p-finally: 1.0.0 - dev: true - - /p-try@2.2.0: - resolution: {integrity: sha512-R4nPAVTAU0B9D35/Gk3uJf/7XYbQcyohSKdvAxIRSNghFl4e71hVoGnBNQz9cWaXxO2I10KTC+3jMdvvoKw6dQ==} - engines: {node: '>=6'} - dev: true - - /package-hash@4.0.0: - resolution: {integrity: sha512-whdkPIooSu/bASggZ96BWVvZTRMOFxnyUG5PnTSGKoJE2gd5mbVNmR2Nj20QFzxYYgAXpoqC+AiXzl+UMRh7zQ==} - engines: {node: '>=8'} - 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 - dev: true - - /parseurl@1.3.3: - resolution: {integrity: sha512-CiyeOxFT/JZyN5m0z9PfXw4SCBJ6Sygz1Dpl0wqjlhDEGGBP1GnsUVEL0p63hoG1fcj3fHynXi9NYO4nWOL+qQ==} - engines: {node: '>= 0.8'} - dev: true - - /pascal-case@3.1.2: - resolution: {integrity: sha512-uWlGT3YSnK9x3BQJaOdcZwrnV6hPpd8jFH1/ucpiLRPh/2zCVJKS19E4GvYHvaCcACn3foXZ0cLB9Wrx1KGe5g==} - dependencies: - no-case: 3.0.4 - tslib: 2.6.2 - dev: true - - /pascalcase@1.0.0: - resolution: {integrity: sha512-BSExi0rRnCHReJys6NocaK+cfTXNinAegfWBvr0JD3hiaEG7Nuc7r0CIdOJunXrs8gU/sbHQ9dxVAtiVQisjmg==} - engines: {node: '>=8'} - dev: true - - /path-exists@4.0.0: - resolution: {integrity: sha512-ak9Qy5Q7jYb2Wwcey5Fpvg2KoAc/ZIhLSLOSBmRmygPsGwkVVt0fZa0qrtMz+m6tJTAHfZQ8FnmB4MG4LWy7/w==} - engines: {node: '>=8'} - dev: true - - /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-is-absolute@1.0.1: - resolution: {integrity: sha512-AVbw3UJ2e9bq64vSaS9Am0fje1Pa8pbGqTTsmXfaIiMpnr5DlDhfJOuLj9Sf95ZPVDAUerDfEk88MPmPe7UCQg==} - engines: {node: '>=0.10.0'} - dev: true - - /path-is-inside@1.0.2: - resolution: {integrity: sha512-DUWJr3+ULp4zXmol/SZkFf3JGsS9/SIv+Y3Rt93/UjPpDpklB5f1er4O3POIbUuUJ3FXgqte2Q7SrU6zAqwk8w==} - dev: true - - /path-key@3.1.1: - resolution: {integrity: sha512-ojmeN0qd+y0jszEtoY48r0Peq5dwMEkIlCOu6Q5f41lfkswXuKtYrhgoTpLnyIcHm24Uhqx+5Tqm2InSwLhE6Q==} - engines: {node: '>=8'} - dev: true - - /path-key@4.0.0: - resolution: {integrity: sha512-haREypq7xkM7ErfgIyA0z+Bj4AGKlMSdlQE2jvJo6huWD1EdkKYV+G/T4nq0YEF2vgTT8kqMFKo1uHn950r4SQ==} - engines: {node: '>=12'} - dev: true - - /path-parse@1.0.7: - resolution: {integrity: sha512-LDJzPVEEEPR+y48z93A0Ed0yXb8pAByGWo/k5YYdYgpY2/2EsOsksJrq7lOHxryrVOn1ejG6oAp8ahvOIQD8sw==} - dev: true - - /path-to-regexp@0.1.7: - resolution: {integrity: sha512-5DFkuoqlv1uYQKxy8omFBeJPQcdoE07Kv2sferDCrAq1ohOU+MSDswDIbnx3YAM60qIOnYa53wBhXW0EbMonrQ==} - dev: true - - /path-to-regexp@2.2.1: - resolution: {integrity: sha512-gu9bD6Ta5bwGrrU8muHzVOBFFREpp2iRkVfhBJahwJ6p6Xw20SjT0MxLnwkjOibQmGSYhiUnf2FLe7k+jcFmGQ==} - dev: true - - /path-type@4.0.0: - resolution: {integrity: sha512-gDKb8aZMDeD/tZWs9P6+q0J9Mwkdl6xMV8TjnGP3qJVJ06bdMgkbBlLU8IdfOsIsFz2BW1rNVT3XuNEl8zPAvw==} - engines: {node: '>=8'} - dev: true - - /pend@1.2.0: - resolution: {integrity: sha512-F3asv42UuXchdzt+xXqfW1OGlVBe+mxa2mqI0pg5yAHZPvFmY3Y6drSf/GQ1A86WgWEN9Kzh/WrgKa6iGcHXLg==} - 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'} - dev: true - - /pify@2.3.0: - resolution: {integrity: sha512-udgsAY+fTnvv7kI7aaxbqwWNb0AHiB0qBO89PZKPkoTmGOgdbrHDKD+0B2X4uTfJ/FT1R09r9gTsjUjNJotuog==} - engines: {node: '>=0.10.0'} - dev: true - - /pify@3.0.0: - resolution: {integrity: sha512-C3FsVNH1udSEX48gGX1xfvwTWfsYWj5U+8/uK15BGzIGrKoUpghX8hWZwa/OFnakBiiVNmBvemTJR5mcy7iPcg==} - engines: {node: '>=4'} - dev: true - - /pify@4.0.1: - resolution: {integrity: sha512-uB80kBFb/tfd68bVleG9T5GGsGPjJrLAUpR5PZIrhBnIaRTQRjqdJSsIKkOP6OAIFbj7GOrcudc5pNjZ+geV2g==} - engines: {node: '>=6'} - dev: true - - /pinkie-promise@2.0.1: - resolution: {integrity: sha512-0Gni6D4UcLTbv9c57DfxDGdr41XfgUjqWZu492f0cIGr16zDU06BWP/RAEvOuo7CQ0CNjHaLlM59YJJFm3NWlw==} - engines: {node: '>=0.10.0'} - 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 - - /pkg-dir@4.2.0: - resolution: {integrity: sha512-HRDzbaKjC+AOWVXxAU/x54COGeIv9eb+6CkDSQoNTt4XyWoIJvuPsXizxu/Fr23EiekbtZwmh1IcIG/l/a10GQ==} - engines: {node: '>=8'} - dependencies: - find-up: 4.1.0 - dev: true - - /pkg-dir@7.0.0: - resolution: {integrity: sha512-Ie9z/WINcxxLp27BKOCHGde4ITq9UklYKDzVo1nhk5sqGEXU3FpkwP5GM2voTGJkGd9B3Otl+Q4uwSOeSUtOBA==} - engines: {node: '>=14.16'} - dependencies: - find-up: 6.3.0 - dev: true - - /playwright-core@1.40.1: - resolution: {integrity: sha512-+hkOycxPiV534c4HhpfX6yrlawqVUzITRKwHAmYfmsVreltEl6fAZJ3DPfLMOODw0H3s1Itd6MDCWmP1fl/QvQ==} - engines: {node: '>=16'} - hasBin: true - dev: true - - /playwright@1.40.1: - resolution: {integrity: sha512-2eHI7IioIpQ0bS1Ovg/HszsN/XKNwEG1kbzSDDmADpclKc7CyqkHw7Mg2JCz/bbCxg25QUPcjksoMW7JcIFQmw==} - engines: {node: '>=16'} - hasBin: true - dependencies: - playwright-core: 1.40.1 - optionalDependencies: - fsevents: 2.3.2 - dev: true - - /pretty-bytes@5.6.0: - resolution: {integrity: sha512-FFw039TmrBqFK8ma/7OL3sDz/VytdtJr044/QUJtH0wK9lb9jLq9tJyIxUwtQJHwar2BqtiA4iCWSwo9JLkzFg==} - engines: {node: '>=6'} - dev: true - - /pretty-error@2.1.2: - resolution: {integrity: sha512-EY5oDzmsX5wvuynAByrmY0P0hcp+QpnAKbJng2A2MPjVKXCxrDSUkzghVJ4ZGPIv+JC4gX8fPUWscC0RtjsWGw==} - dependencies: - lodash: 4.17.21 - renderkid: 2.0.7 - dev: true - - /pretty-error@4.0.0: - resolution: {integrity: sha512-AoJ5YMAcXKYxKhuJGdcvse+Voc6v1RgnsR3nWcYU7q4t6z0Q6T86sv5Zq8VIRbOWWFpvdGE83LtdSMNd+6Y0xw==} - dependencies: - lodash: 4.17.21 - renderkid: 3.0.0 - 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: 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 - - /prom-client@15.0.0: - resolution: {integrity: sha512-UocpgIrKyA2TKLVZDSfm8rGkL13C19YrQBAiG3xo3aDFWcHedxRxI3z+cIcucoxpSO0h5lff5iv/SXoxyeopeA==} - engines: {node: ^16 || ^18 || >=20} - dependencies: - '@opentelemetry/api': 1.7.0 - tdigest: 0.1.2 - dev: false - - /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: true - - /proxy-from-env@1.0.0: - resolution: {integrity: sha512-F2JHgJQ1iqwnHDcQjVBsq3n/uoaFL+iPW/eAeL7kVxy/2RrWaN4WroKjjvbsoRtv0ftelNyC01bjRhn/bhcf4A==} - dev: true - - /proxy-from-env@1.1.0: - resolution: {integrity: sha512-D+zkORCbA9f1tdWRK0RaCR3GPv50cMxcrz4X8k5LTSUD1Dkw47mKJEZQNunItRTkWwgtaUSo1RVFRIG9ZXiFYg==} - dev: true - - /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 - dev: true - - /punycode@1.4.1: - resolution: {integrity: sha512-jmYNElW7yvO7TV33CjSmvSiE2yco3bV2czu/OzDKdMNVZQWfxCblURLhf+47syQRBntjfLdd/H0egrzIG+oaFQ==} - dev: true - - /punycode@2.3.1: - resolution: {integrity: sha512-vYt7UD1U9Wg6138shLtLOvdAu+8DsC/ilFtEVHcH+wydcSpNE20AfSOduf6MkRFahL5FY7X1oU7nKVZFtfq8Fg==} - engines: {node: '>=6'} - dev: true - - /qs@6.10.4: - resolution: {integrity: sha512-OQiU+C+Ds5qiH91qh/mg0w+8nwQuLjM4F4M/PbmhDOoYehPh+Fb0bDjtR1sOvy7YKxvj28Y/M0PhP5uVX0kB+g==} - engines: {node: '>=0.6'} - dependencies: - side-channel: 1.0.4 - dev: true - - /qs@6.11.0: - resolution: {integrity: sha512-MvjoMCJwEarSbUYk5O+nmoSzSutSsTwF85zcHPQ9OrlFoZOYIjaqBAJIqIXjptyD5vThxGq52Xu/MaJzRkIk4Q==} - engines: {node: '>=0.6'} - dependencies: - side-channel: 1.0.4 - dev: true - - /querystring@0.2.1: - resolution: {integrity: sha512-wkvS7mL/JMugcup3/rMitHmd9ecIGd2lhFhK9N3UUQ450h66d1r3Y9nvXzQAW1Lq+wyx61k/1pfKS5KuKiyEbg==} - engines: {node: '>=0.4.x'} - deprecated: The querystring API is considered Legacy. new code should use the URLSearchParams API instead. - dev: true - - /querystringify@2.2.0: - resolution: {integrity: sha512-FIqgj2EUvTa7R50u0rGsyTftzjYmv/a3hO345bZNrqabNqjtgiDMgmo4mkUjd+nzU5oF3dClKqFIPUKybUyqoQ==} - dev: true - - /queue-microtask@1.2.3: - resolution: {integrity: sha512-NuaNSa6flKT5JaSYQzJok04JzTL1CA6aGhv5rfLW3PgqA+M2ChpZQnAC8h8i4ZFkBS8X5RqkDBHA7r4hej3K9A==} - dev: true - - /quick-lru@5.1.1: - resolution: {integrity: sha512-WuyALRjWPDGtt/wzJiadO5AXY+8hZ80hVpe6MyivgraREW751X3SbhRvG3eLKOYN+8VEvqLcf3wdnt44Z4S4SA==} - engines: {node: '>=10'} - dev: true - - /randombytes@2.1.0: - resolution: {integrity: sha512-vYl3iOX+4CKUWuxGi9Ukhie6fsqXqS9FE2Zaic4tNFD2N2QQaXOMFbuKK4QmDHC0JO6B1Zp41J0LpT0oR68amQ==} - dependencies: - safe-buffer: 5.2.1 - dev: true - - /range-parser@1.2.0: - resolution: {integrity: sha512-kA5WQoNVo4t9lNx2kQNFCxKeBl5IbbSNBl1M/tLkw9WCn+hxNBAW5Qh8gdhs63CJnhjJ2zQWFoqPJP2sK1AV5A==} - engines: {node: '>= 0.6'} - dev: true - - /range-parser@1.2.1: - resolution: {integrity: sha512-Hrgsx+orqoygnmhFbKaHE6c296J+HTAQXoxEF6gNupROmmGJRoyzfG3ccAveqCBrwr/2yxQ5BVd/GTl5agOwSg==} - engines: {node: '>= 0.6'} - dev: true - - /raw-body@2.5.1: - resolution: {integrity: sha512-qqJBtEyVgS0ZmPGdCFPWJ3FreoqvG4MVQln/kCgF7Olq95IbOp0/BWyMwbdtn4VTvkM8Y7khCQ2Xgk/tcrCXig==} - engines: {node: '>= 0.8'} - dependencies: - bytes: 3.1.2 - http-errors: 2.0.0 - iconv-lite: 0.4.24 - unpipe: 1.0.0 - dev: true - - /rc@1.2.8: - resolution: {integrity: sha512-y3bGgqKj3QBdxLbLkomlohkvsA8gdAiUQlSBJnBhfn+BPxg4bc62d8TcBW15wavDfgexCgccckhcZvywyQYPOw==} - hasBin: true - dependencies: - deep-extend: 0.6.0 - ini: 1.3.8 - minimist: 1.2.8 - strip-json-comments: 2.0.1 - dev: true - - /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 - dev: true - - /react-is@17.0.2: - resolution: {integrity: sha512-w2GsyukL62IJnlaff/nRegPQR94C/XXamvMWmSHRJ4y7Ts/4ocGRmTHvOs8PSE6pB3dWOrD/nueuU5sduBsQ4w==} - dev: true - - /react@18.2.0: - resolution: {integrity: sha512-/3IjMdb2L9QbBdWiW5e3P2/npwMBaU9mHCSCUzNln0ZCYbcfTsGbTJrU/kGemdH2IWmB2ioZ+zkxtmq6g09fGQ==} - engines: {node: '>=0.10.0'} - dependencies: - loose-envify: 1.4.0 - dev: true - - /readable-stream@2.3.8: - resolution: {integrity: sha512-8p0AUk4XODgIewSi0l8Epjs+EVnWiK7NoDIEGU0HhE7+ZyY8D1IMY7odu5lRrFXGg71L15KG8QrPmum45RTtdA==} - dependencies: - core-util-is: 1.0.3 - 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'} - dependencies: - inherits: 2.0.4 - string_decoder: 1.3.0 - util-deprecate: 1.0.2 - dev: true - - /readdirp@3.6.0: - resolution: {integrity: sha512-hOS089on8RduqdbhvQ5Z37A0ESjsqz6qnRcffsMU3495FuTdqSm+7bhJ29JvIOsBDEEnan5DPu9t3To9VRlMzA==} - engines: {node: '>=8.10.0'} - dependencies: - picomatch: 2.3.1 - 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.11.1: - resolution: {integrity: sha512-MguG95oij0fC3QV3URf4V2SDYGJhJnJGqvIIgdECeODCT98wSWDAJ94SSuVpYQUoTcGUIL6L4yNB7j1DFFHSBg==} - dev: true - - /regenerator-runtime@0.14.0: - resolution: {integrity: sha512-srw17NI0TUWHuGa5CFGGmhfNIeja30WMBfbslPNhf6JrqQlLN5gcrvig1oqPxiVaXb0oW0XRKtH6Nngs5lKCIA==} - dev: true - - /regenerator-transform@0.15.2: - resolution: {integrity: sha512-hfMp2BoF0qOk3uc5V20ALGDS2ddjQaLrdl7xrGXvAIow7qeWRM2VA2HuCHkUKk9slq3VwEwLNK3DFBqDfPGYtg==} - dependencies: - '@babel/runtime': 7.23.6 - dev: true - - /regexp.prototype.flags@1.5.1: - resolution: {integrity: sha512-sy6TXMN+hnP/wMy+ISxg3krXx7BAtWVO4UouuCN/ziM9UEne0euamVNafDfvC83bRNr95y0V5iijeDQFUNpvrg==} - engines: {node: '>= 0.4'} - dependencies: - call-bind: 1.0.5 - define-properties: 1.2.1 - set-function-name: 2.0.1 - 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 - - /registry-auth-token@3.3.2: - resolution: {integrity: sha512-JL39c60XlzCVgNrO+qq68FoNb56w/m7JYvGR2jT5iR1xBrUA3Mfx5Twk5rqTThPmQKMWydGmq8oFtDlxfrmxnQ==} - dependencies: - rc: 1.2.8 - safe-buffer: 5.2.1 - dev: true - - /registry-url@3.1.0: - resolution: {integrity: sha512-ZbgR5aZEdf4UKZVBPYIgaglBmSF2Hi94s2PcIHhRGFjKYu+chjJdYfHn4rt3hB6eCKLJ8giVIIfgMa1ehDfZKA==} - engines: {node: '>=0.10.0'} - dependencies: - rc: 1.2.8 - dev: true - - /regjsparser@0.9.1: - resolution: {integrity: sha512-dQUtn90WanSNl+7mQKcXAgZxvUe7Z0SqXlgzv0za4LwiUhyzBC58yQO3liFoUgu8GiJVInAhJjkj1N0EtQ5nkQ==} - hasBin: true - dependencies: - jsesc: 0.5.0 - dev: true - - /relateurl@0.2.7: - resolution: {integrity: sha512-G08Dxvm4iDN3MLM0EsP62EDV9IuhXPR6blNz6Utcp7zyV3tr4HVNINt6MpaRWbxoOHT3Q7YN2P+jaHX8vUbgog==} - engines: {node: '>= 0.10'} - dev: true - - /release-zalgo@1.0.0: - resolution: {integrity: sha512-gUAyHVHPPC5wdqX/LG4LWtRYtgjxyX78oanFNTMMyFEfOqdC54s3eE82imuWKbOeqYht2CrNf64Qb8vgmmtZGA==} - engines: {node: '>=4'} - dependencies: - es6-error: 4.1.1 - dev: true - - /renderkid@2.0.7: - resolution: {integrity: sha512-oCcFyxaMrKsKcTY59qnCAtmDVSLfPbrv6A3tVbPdFMMrv5jaK10V6m40cKsoPNhAqN6rmHW9sswW4o3ruSrwUQ==} - dependencies: - css-select: 4.3.0 - dom-converter: 0.2.0 - htmlparser2: 6.1.0 - lodash: 4.17.21 - strip-ansi: 3.0.1 - dev: true - - /renderkid@3.0.0: - resolution: {integrity: sha512-q/7VIQA8lmM1hF+jn+sFSPWGlMkSAeNYcPLmDQx2zzuiDfaLrOmumR8iaUKlenFgh0XRPIUeSPlH3A+AW3Z5pg==} - dependencies: - css-select: 4.3.0 - dom-converter: 0.2.0 - htmlparser2: 6.1.0 - lodash: 4.17.21 - strip-ansi: 6.0.1 - dev: true - - /request-progress@3.0.0: - resolution: {integrity: sha512-MnWzEHHaxHO2iWiQuHrUPBi/1WeBf5PkxQqNyNvLl9VAYSdXkP8tQ3pBSeCPD+yw0v0Aq1zosWLz0BdeXpWwZg==} - dependencies: - throttleit: 1.0.1 - dev: true - - /require-directory@2.1.1: - resolution: {integrity: sha512-fGxEI7+wsG9xrvdjsrlmL22OMTTiHRwAMroiEeMgq8gzoLC/PQr7RsRDSTLUg/bZAZtF+TVIkHc6/4RIKrui+Q==} - engines: {node: '>=0.10.0'} - dev: true - - /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-main-filename@2.0.0: - resolution: {integrity: sha512-NKN5kMDylKuldxYLSUfrbo5Tuzh4hd+2E8NPPX02mZtn1VuREQToYe/ZdlJy+J3uCpfaiGF05e7B8W0iXbQHmg==} - dev: true - - /requires-port@1.0.0: - resolution: {integrity: sha512-KigOCHcocU3XODJxsu8i/j8T9tzT4adHiecwORRQ0ZZFcp7ahwXuRU1m+yuO90C5ZUyGeGfocHDI14M3L3yDAQ==} - dev: true - - /resolve-alpn@1.2.1: - resolution: {integrity: sha512-0a1F4l73/ZFZOakJnQ3FvkJ2+gSTQWz/r2KE5OdDY0TxPm5h4GkqkWWfM47T7HsbnOtcJVEF4epCVy6u7Q3K+g==} - dev: true - - /resolve-from@5.0.0: - resolution: {integrity: sha512-qYg9KP24dD5qka9J47d0aVky0N+b4fTU89LN9iDnjB5waksiC49rvMB0PrUJQGoTmH50XPiqOvAjDfaijGxYZw==} - engines: {node: '>=8'} - dev: true - - /resolve@1.22.8: - resolution: {integrity: sha512-oKWePCxqpd6FlLvGV1VU0x7bkPmmCNolxzjMf4NczoDnQcIWrAF+cPtZn5i6n+RfD2d9i0tzpKnG6Yk168yIyw==} - hasBin: true - dependencies: - is-core-module: 2.13.1 - path-parse: 1.0.7 - supports-preserve-symlinks-flag: 1.0.0 - dev: true - - /responselike@2.0.1: - resolution: {integrity: sha512-4gl03wn3hj1HP3yzgdI7d3lCkF95F21Pz4BPGvKHinyQzALR5CapwC8yIi0Rh58DEMQ/SguC03wFj2k0M/mHhw==} - dependencies: - lowercase-keys: 2.0.0 - dev: true - - /restore-cursor@3.1.0: - resolution: {integrity: sha512-l+sSefzHpj5qimhFSE5a8nufZYAM3sBSVMAPtYkmC+4EH2anSGaEMXSD0izRQbu9nfyQ9y5JrVmp7E8oZrUjvA==} - engines: {node: '>=8'} - dependencies: - onetime: 5.1.2 - signal-exit: 3.0.7 - dev: true - - /retry@0.13.1: - resolution: {integrity: sha512-XQBQ3I8W1Cge0Seh+6gjj03LbmRFWuoszgK9ooCpwYIrhhoO80pfq4cUkU5DkknwfOfFteRwlZ56PYOGYyFWdg==} - engines: {node: '>= 4'} - dev: true - - /reusify@1.0.4: - resolution: {integrity: sha512-U9nH88a3fc/ekCF1l0/UP1IosiuIjyTh7hBvXVMHYgVcfGvt897Xguj2UOLDeI5BG2m7/uwyaLVT6fbtCwTyzw==} - engines: {iojs: '>=1.0.0', node: '>=0.10.0'} - dev: true - - /rfdc@1.3.0: - resolution: {integrity: sha512-V2hovdzFbOi77/WajaSMXk2OLm+xNIeQdMMuB7icj7bk6zi2F8GGAxigcnDFpJHbNyNcgyJDiP+8nOrY5cZGrA==} - dev: true - - /rimraf@3.0.2: - resolution: {integrity: sha512-JZkJMZkAGFFPP2YqXZXPbMlMBgsxzE8ILs4lMIX/2o0L9UBw9O/Y3o6wFw/i9YLapcUJWwqbi3kdxIPdC62TIA==} - hasBin: true - dependencies: - glob: 7.2.3 - dev: true - - /run-parallel@1.2.0: - resolution: {integrity: sha512-5l4VyZR86LZ/lDxZTR6jqL8AFE2S0IFLMP26AbjsLVADxHdhB/c0GUsH+y39UfCi3dzz8OlQuPmnaJOMoDHQBA==} - dependencies: - queue-microtask: 1.2.3 - dev: true - - /rxjs@7.8.1: - resolution: {integrity: sha512-AA3TVj+0A2iuIoQkWEK/tqFjBq2j+6PO6Y0zJcvzLAFhEFIO3HL0vls9hWLncZbAAbK0mar7oZ4V079I/qPMxg==} - dependencies: - tslib: 2.6.2 - dev: true - - /safe-array-concat@1.0.1: - resolution: {integrity: sha512-6XbUAseYE2KtOuGueyeobCySj9L4+66Tn6KQMOPQJrAJEowYKW/YR/MGJZl7FdydUdaFu4LYyDZjxf4/Nmo23Q==} - engines: {node: '>=0.4'} - dependencies: - call-bind: 1.0.5 - get-intrinsic: 1.2.2 - has-symbols: 1.0.3 - isarray: 2.0.5 - dev: true - - /safe-buffer@5.1.2: - resolution: {integrity: sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g==} - dev: true - - /safe-buffer@5.2.1: - resolution: {integrity: sha512-rp3So07KcdmmKbGvgaNxQSJr7bGVSVk5S9Eq1F+ppbRo70+YeaDxkw5Dd8NPN+GD6bjnYm2VuPuCXmpuYvmCXQ==} - dev: true - - /safe-regex-test@1.0.0: - resolution: {integrity: sha512-JBUUzyOgEwXQY1NuPtvcj/qcBDbDmEvWufhlnXZIm75DEHp+afM1r1ujJpJsV/gSM4t59tpDyPi1sd6ZaPFfsA==} - dependencies: - call-bind: 1.0.5 - get-intrinsic: 1.2.2 - is-regex: 1.1.4 - dev: true - - /safer-buffer@2.1.2: - resolution: {integrity: sha512-YZo3K82SD7Riyi0E1EQPojLz7kpepnSQI9IyPbHHg1XXXevb5dJI7tpyN2ADxGcQbHG7vcyRHk0cbwqcQriUtg==} - dev: true - - /scheduler@0.23.0: - resolution: {integrity: sha512-CtuThmgHNg7zIZWAXi3AsyIzA3n4xx7aNyjwC2VJldO2LMVDhFK+63xGqq6CsJH4rTAt6/M+N4GhZiDYPx9eUw==} - dependencies: - loose-envify: 1.4.0 - dev: true - - /schema-utils@3.3.0: - resolution: {integrity: sha512-pN/yOAvcC+5rQ5nERGuwrjLlYvLTbCibnZ1I7B1LaiAz9BRBlE9GMgE/eqV30P7aJQUf7Ddimy/RsbYO/GrVGg==} - engines: {node: '>= 10.13.0'} - dependencies: - '@types/json-schema': 7.0.15 - ajv: 6.12.6 - ajv-keywords: 3.5.2(ajv@6.12.6) - dev: true - - /schema-utils@4.2.0: - resolution: {integrity: sha512-L0jRsrPpjdckP3oPug3/VxNKt2trR8TcabrM6FOAAlvC/9Phcmm+cuAgTlxBqdBR1WJx7Naj9WHw+aOmheSVbw==} - engines: {node: '>= 12.13.0'} - dependencies: - '@types/json-schema': 7.0.15 - ajv: 8.12.0 - ajv-formats: 2.1.1(ajv@8.12.0) - ajv-keywords: 5.1.0(ajv@8.12.0) - dev: true - - /seek-bzip@1.0.6: - resolution: {integrity: sha512-e1QtP3YL5tWww8uKaOCQ18UxIT2laNBXHjV/S2WYCiK4udiv8lkG89KRIoCjUagnAmCBurjF4zEVX2ByBbnCjQ==} - hasBin: true - dependencies: - commander: 2.20.3 - dev: true - - /select-hose@2.0.0: - resolution: {integrity: sha512-mEugaLK+YfkijB4fx0e6kImuJdCIt2LxCRcbEYPqRGCs4F2ogyfZU5IAZRdjCP8JPq2AtdNoC/Dux63d9Kiryg==} - dev: true - - /selfsigned@2.4.1: - resolution: {integrity: sha512-th5B4L2U+eGLq1TVh7zNRGBapioSORUeymIydxgFpwww9d2qyKvtuPU2jJuHvYAwwqi2Y596QBL3eEqcPEYL8Q==} - engines: {node: '>=10'} - dependencies: - '@types/node-forge': 1.3.10 - node-forge: 1.3.1 - dev: true - - /semver@5.7.2: - resolution: {integrity: sha512-cBznnQ9KjJqU67B52RMC65CMarK2600WFnbkcaiwWq3xy/5haFJlshgnpjovMVJ+Hff49d8GEn0b87C5pDQ10g==} - hasBin: true - dev: true - - /semver@6.3.1: - resolution: {integrity: sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA==} - hasBin: true - dev: true - - /semver@7.5.4: - resolution: {integrity: sha512-1bCSESV6Pv+i21Hvpxp3Dx+pSD8lIPt8uVjRrxAUt/nbswYc+tK6Y2btiULjd4+fnq15PX+nqQDC7Oft7WkwcA==} - engines: {node: '>=10'} - hasBin: true - dependencies: - lru-cache: 6.0.0 - dev: true - - /send@0.18.0: - resolution: {integrity: sha512-qqWzuOjSFOuqPjFe4NOsMLafToQQwBSOEpS+FwEt3A2V3vKubTquT3vmLTQpFgMXp8AlFWFuP1qKaJZOtPpVXg==} - engines: {node: '>= 0.8.0'} - dependencies: - debug: 2.6.9 - depd: 2.0.0 - destroy: 1.2.0 - encodeurl: 1.0.2 - escape-html: 1.0.3 - etag: 1.8.1 - fresh: 0.5.2 - http-errors: 2.0.0 - mime: 1.6.0 - ms: 2.1.3 - on-finished: 2.4.1 - range-parser: 1.2.1 - statuses: 2.0.1 - transitivePeerDependencies: - - supports-color - dev: true - - /serialize-javascript@6.0.1: - resolution: {integrity: sha512-owoXEFjWRllis8/M1Q+Cw5k8ZH40e3zhp/ovX+Xr/vi1qj6QesbyXXViFbpNvWvPNAD62SutwEXavefrLJWj7w==} - dependencies: - randombytes: 2.1.0 - dev: true - - /serve-handler@6.1.5: - resolution: {integrity: sha512-ijPFle6Hwe8zfmBxJdE+5fta53fdIY0lHISJvuikXB3VYFafRjMRpOffSPvCYsbKyBA7pvy9oYr/BT1O3EArlg==} - dependencies: - bytes: 3.0.0 - content-disposition: 0.5.2 - fast-url-parser: 1.1.3 - mime-types: 2.1.18 - minimatch: 3.1.2 - path-is-inside: 1.0.2 - path-to-regexp: 2.2.1 - range-parser: 1.2.0 - dev: true - - /serve-index@1.9.1: - resolution: {integrity: sha512-pXHfKNP4qujrtteMrSBb0rc8HJ9Ms/GrXwcUtUtD5s4ewDJI8bT3Cz2zTVRMKtri49pLx2e0Ya8ziP5Ya2pZZw==} - engines: {node: '>= 0.8.0'} - dependencies: - accepts: 1.3.8 - batch: 0.6.1 - debug: 2.6.9 - escape-html: 1.0.3 - http-errors: 1.6.3 - mime-types: 2.1.35 - parseurl: 1.3.3 - transitivePeerDependencies: - - supports-color - dev: true - - /serve-static@1.15.0: - resolution: {integrity: sha512-XGuRDNjXUijsUL0vl6nSD7cwURuzEgglbOaFuZM9g3kwDXOWVTck0jLzjPzGD+TazWbboZYu52/9/XPdUgne9g==} - engines: {node: '>= 0.8.0'} - dependencies: - encodeurl: 1.0.2 - escape-html: 1.0.3 - parseurl: 1.3.3 - send: 0.18.0 - transitivePeerDependencies: - - supports-color - dev: true - - /serve@14.2.1: - resolution: {integrity: sha512-48er5fzHh7GCShLnNyPBRPEjs2I6QBozeGr02gaacROiyS/8ARADlj595j39iZXAqBbJHH/ivJJyPRWY9sQWZA==} - engines: {node: '>= 14'} - hasBin: true - dependencies: - '@zeit/schemas': 2.29.0 - ajv: 8.11.0 - arg: 5.0.2 - boxen: 7.0.0 - chalk: 5.0.1 - chalk-template: 0.4.0 - clipboardy: 3.0.0 - compression: 1.7.4 - is-port-reachable: 4.0.0 - serve-handler: 6.1.5 - update-check: 1.5.4 - transitivePeerDependencies: - - supports-color - dev: true - - /set-blocking@2.0.0: - resolution: {integrity: sha512-KiKBS8AnWGEyLzofFfmvKwpdPzqiy16LvQfK3yv/fVH7Bj13/wl3JSR1J+rfgRE9q7xUJK4qvgS8raSOeLUehw==} - dev: true - - /set-function-length@1.1.1: - resolution: {integrity: sha512-VoaqjbBJKiWtg4yRcKBQ7g7wnGnLV3M8oLvVWwOk2PdYY6PEFegR1vezXR0tw6fZGF9csVakIRjrJiy2veSBFQ==} - engines: {node: '>= 0.4'} - dependencies: - define-data-property: 1.1.1 - get-intrinsic: 1.2.2 - gopd: 1.0.1 - has-property-descriptors: 1.0.1 - dev: true - - /set-function-name@2.0.1: - resolution: {integrity: sha512-tMNCiqYVkXIZgc2Hnoy2IvC/f8ezc5koaRFkCjrpWzGpCd3qbZXPzVy9MAZzK1ch/X0jvSkojys3oqJN0qCmdA==} - engines: {node: '>= 0.4'} - dependencies: - define-data-property: 1.1.1 - functions-have-names: 1.2.3 - has-property-descriptors: 1.0.1 - dev: true - - /setprototypeof@1.1.0: - resolution: {integrity: sha512-BvE/TwpZX4FXExxOxZyRGQQv651MSwmWKZGqvmPcRIjDqWub67kTKuIMx43cZZrS/cBBzwBcNDWoFxt2XEFIpQ==} - dev: true - - /setprototypeof@1.2.0: - resolution: {integrity: sha512-E5LDX7Wrp85Kil5bhZv46j8jOeboKq5JMmYM3gVGdGH8xFpPWXUMsNrlODCrkoxMEeNi/XZIwuRvY4XNwYMJpw==} - 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@2.0.0: - resolution: {integrity: sha512-kHxr2zZpYtdmrN1qDjrrX/Z1rR1kG8Dx+gkpK1G4eXmvXswmcE1hTWBWYUzlraYw1/yZp6YuDY77YtvbN0dmDA==} - engines: {node: '>=8'} - dependencies: - shebang-regex: 3.0.0 - dev: true - - /shebang-regex@3.0.0: - resolution: {integrity: sha512-7++dFhtcx3353uBaq8DDR4NuxBetBzC7ZQOhmTQInHEd6bSrXdiEyzCvG07Z44UYdLShWUyXt5M/yhz8ekcb1A==} - engines: {node: '>=8'} - dev: true - - /shell-quote@1.8.1: - resolution: {integrity: sha512-6j1W9l1iAs/4xYBI1SYOVZyFcCis9b4KCLQ8fgAGG07QvzaRLVVRQvAy85yNmmZSjYjg4MWh4gNvlPujU/5LpA==} - dev: true - - /side-channel@1.0.4: - resolution: {integrity: sha512-q5XPytqFEIKHkGdiMIrY10mvLRvnQh42/+GoBlFW3b2LXLE2xxJpZFdm94we0BaoV3RwJyGqg5wS7epxTv0Zvw==} - dependencies: - call-bind: 1.0.5 - get-intrinsic: 1.2.2 - object-inspect: 1.13.1 - dev: true - - /signal-exit@3.0.7: - resolution: {integrity: sha512-wnD2ZE+l+SPC/uoS0vXeE9L1+0wuaMqKlfz9AMUo38JsyLSBWSFcHR1Rri62LZc12vLr1gb3jl7iwQhgwpAbGQ==} - dev: true - - /slash@3.0.0: - resolution: {integrity: sha512-g9Q1haeby36OSStwb4ntCGGGaKsaVSjQ68fBxoQcutl5fS1vuY18H3wSt3jFyFtrkx+Kz0V1G85A4MyAdDMi2Q==} - engines: {node: '>=8'} - dev: true - - /slice-ansi@3.0.0: - resolution: {integrity: sha512-pSyv7bSTC7ig9Dcgbw9AuRNUb5k5V6oDudjZoMBSr13qpLBG7tB+zgCkARjq7xIUgdz5P1Qe8u+rSGdouOOIyQ==} - engines: {node: '>=8'} - dependencies: - ansi-styles: 4.3.0 - astral-regex: 2.0.0 - is-fullwidth-code-point: 3.0.0 - dev: true - - /slice-ansi@4.0.0: - resolution: {integrity: sha512-qMCMfhY040cVHT43K9BFygqYbUPFZKHOg7K73mtTWJRb8pyP3fzf4Ixd5SzdEJQ6MRUg/WBnOLxghZtKKurENQ==} - engines: {node: '>=10'} - dependencies: - ansi-styles: 4.3.0 - astral-regex: 2.0.0 - is-fullwidth-code-point: 3.0.0 - dev: true - - /sockjs@0.3.24: - resolution: {integrity: sha512-GJgLTZ7vYb/JtPSSZ10hsOYIvEYsjbNU+zPdIHcUaWVNUEPivzxku31865sSSud0Da0W4lEeOPlmw93zLQchuQ==} - dependencies: - faye-websocket: 0.11.4 - uuid: 8.3.2 - websocket-driver: 0.7.4 - dev: true - - /sort-keys-length@1.0.1: - resolution: {integrity: sha512-GRbEOUqCxemTAk/b32F2xa8wDTs+Z1QHOkbhJDQTvv/6G3ZkbJ+frYWsTcc7cBB3Fu4wy4XlLCuNtJuMn7Gsvw==} - engines: {node: '>=0.10.0'} - dependencies: - sort-keys: 1.1.2 - dev: true - - /sort-keys@1.1.2: - resolution: {integrity: sha512-vzn8aSqKgytVik0iwdBEi+zevbTYZogewTUM6dtpmGwEcdzbub/TX4bCzRhebDCRC3QzXgJsLRKB2V/Oof7HXg==} - engines: {node: '>=0.10.0'} - dependencies: - is-plain-obj: 1.1.0 - dev: true - - /source-map-support@0.5.21: - resolution: {integrity: sha512-uBHU3L3czsIyYXKX88fdrGovxdSCoTGDRZ6SYXtSRxLZUzHg5P/66Ht6uoUlHu9EZod+inXhKo3qQgwXUT/y1w==} - dependencies: - buffer-from: 1.1.2 - source-map: 0.6.1 - 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 - - /spawn-wrap@2.0.0: - resolution: {integrity: sha512-EeajNjfN9zMnULLwhZZQU3GWBoFNkbngTUPfaawT4RkMiviTxcX0qfhVbGey39mfctfDHkWtuecgQ8NJcyQWHg==} - engines: {node: '>=8'} - dependencies: - foreground-child: 2.0.0 - is-windows: 1.0.2 - make-dir: 3.1.0 - rimraf: 3.0.2 - signal-exit: 3.0.7 - which: 2.0.2 - dev: true - - /spdy-transport@3.0.0: - resolution: {integrity: sha512-hsLVFE5SjA6TCisWeJXFKniGGOpBgMLmerfO2aCyCU5s7nJ/rpAepqmFifv/GCbSbueEeAJJnmSQ2rKC/g8Fcw==} - dependencies: - debug: 4.3.4(supports-color@8.1.1) - detect-node: 2.1.0 - hpack.js: 2.1.6 - obuf: 1.1.2 - readable-stream: 3.6.2 - wbuf: 1.7.3 - transitivePeerDependencies: - - supports-color - dev: true - - /spdy@4.0.2: - resolution: {integrity: sha512-r46gZQZQV+Kl9oItvl1JZZqJKGr+oEkB08A6BzkiR7593/7IbtuncXHd2YoYeTsG4157ZssMu9KYvUHLcjcDoA==} - engines: {node: '>=6.0.0'} - dependencies: - debug: 4.3.4(supports-color@8.1.1) - handle-thing: 2.0.1 - http-deceiver: 1.2.7 - select-hose: 2.0.0 - spdy-transport: 3.0.0 - transitivePeerDependencies: - - supports-color - dev: true - - /speed-measure-webpack-plugin@1.4.2(webpack@5.89.0): - resolution: {integrity: sha512-AtVzD0bnIy2/B0fWqJpJgmhcrfWFhBlduzSo0uwplr/QvB33ZNZj2NEth3NONgdnZJqicK0W0mSxnLSbsVCDbw==} - engines: {node: '>=6.0.0'} - peerDependencies: - webpack: ^1 || ^2 || ^3 || ^4 || ^5 - dependencies: - chalk: 4.1.2 - webpack: 5.89.0 - dev: true - - /sprintf-js@1.0.3: - resolution: {integrity: sha512-D9cPgkvLlV3t3IzL0D0YLvGA9Ahk4PcvVwUbN0dSGr1aP0Nrt4AEnTUbuGvquEC0mA64Gqt1fzirlRs5ibXx8g==} - dev: true - - /sshpk@1.18.0: - resolution: {integrity: sha512-2p2KJZTSqQ/I3+HX42EpYOa2l3f8Erv8MWKsy2I9uf4wA7yFIkXRffYdsx86y6z4vHtV8u7g+pPlr8/4ouAxsQ==} - engines: {node: '>=0.10.0'} - hasBin: true - dependencies: - asn1: 0.2.6 - assert-plus: 1.0.0 - bcrypt-pbkdf: 1.0.2 - dashdash: 1.14.1 - ecc-jsbn: 0.1.2 - getpass: 0.1.7 - jsbn: 0.1.1 - safer-buffer: 2.1.2 - tweetnacl: 0.14.5 - 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'} - dev: true - - /stop-iteration-iterator@1.0.0: - resolution: {integrity: sha512-iCGQj+0l0HOdZ2AEeBADlsRC+vsnDsZsbdSiH1yNSjcfKM7fdpCMfqAL/dwF5BLiw/XhRft/Wax6zQbhq2BcjQ==} - engines: {node: '>= 0.4'} - dependencies: - internal-slot: 1.0.6 - dev: true - - /string-width@4.2.3: - resolution: {integrity: sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g==} - engines: {node: '>=8'} - dependencies: - emoji-regex: 8.0.0 - is-fullwidth-code-point: 3.0.0 - strip-ansi: 6.0.1 - dev: true - - /string-width@5.1.2: - resolution: {integrity: sha512-HnLOCR3vjcY8beoNLtcjZ5/nxn2afmME6lhrDrebokqMap+XbeW8n9TXpPDOqdGK5qcI3oT0GKTW6wC7EMiVqA==} - engines: {node: '>=12'} - dependencies: - eastasianwidth: 0.2.0 - emoji-regex: 9.2.2 - strip-ansi: 7.1.0 - dev: true - - /string.prototype.trim@1.2.8: - resolution: {integrity: sha512-lfjY4HcixfQXOfaqCvcBuOIapyaroTXhbkfJN3gcB1OtyupngWK4sEET9Knd0cXd28kTUqu/kHoV4HKSJdnjiQ==} - engines: {node: '>= 0.4'} - dependencies: - call-bind: 1.0.5 - define-properties: 1.2.1 - es-abstract: 1.22.3 - dev: true - - /string.prototype.trimend@1.0.7: - resolution: {integrity: sha512-Ni79DqeB72ZFq1uH/L6zJ+DKZTkOtPIHovb3YZHQViE+HDouuU4mBrLOLDn5Dde3RF8qw5qVETEjhu9locMLvA==} - dependencies: - call-bind: 1.0.5 - define-properties: 1.2.1 - es-abstract: 1.22.3 - dev: true - - /string.prototype.trimstart@1.0.7: - resolution: {integrity: sha512-NGhtDFu3jCEm7B4Fy0DpLewdJQOZcQ0rGbwQ/+stjnrp2i+rlKeCvos9hOIeCmqwratM47OBxY7uFZzjxHXmrg==} - dependencies: - call-bind: 1.0.5 - define-properties: 1.2.1 - es-abstract: 1.22.3 - 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==} - dependencies: - safe-buffer: 5.2.1 - dev: true - - /strip-ansi@3.0.1: - resolution: {integrity: sha512-VhumSSbBqDTP8p2ZLKj40UjBCV4+v8bUSEpUb4KjRgWk9pbqGF4REFj6KEagidb2f/M6AzC0EmFyDNGaw9OCzg==} - engines: {node: '>=0.10.0'} - dependencies: - ansi-regex: 2.1.1 - dev: true - - /strip-ansi@6.0.1: - resolution: {integrity: sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==} - engines: {node: '>=8'} - dependencies: - ansi-regex: 5.0.1 - dev: true - - /strip-ansi@7.1.0: - resolution: {integrity: sha512-iq6eVVI64nQQTRYq2KtEg2d2uU7LElhTJwsH4YzIHZshxlgZms/wIc4VoDQTlG/IvVIrBKG06CrZnp0qv7hkcQ==} - engines: {node: '>=12'} - dependencies: - ansi-regex: 6.0.1 - dev: true - - /strip-bom@4.0.0: - resolution: {integrity: sha512-3xurFv5tEgii33Zi8Jtp55wEIILR9eh34FAW00PZf+JnSsTmV/ioewSgQl97JHvgjoRGwPShsWm+IdrxB35d0w==} - engines: {node: '>=8'} - dev: true - - /strip-dirs@2.1.0: - resolution: {integrity: sha512-JOCxOeKLm2CAS73y/U4ZeZPTkE+gNVCzKt7Eox84Iej1LT/2pTWYpZKJuxwQpvX1LiZb1xokNR7RLfuBAa7T3g==} - dependencies: - is-natural-number: 4.0.1 - dev: true - - /strip-final-newline@2.0.0: - resolution: {integrity: sha512-BrpvfNAE3dcvq7ll3xVumzjKjZQ5tI1sEUIKr3Uoks0XUl45St3FlatVqef9prk4jRDzhW6WZg+3bk93y6pLjA==} - engines: {node: '>=6'} - dev: true - - /strip-final-newline@3.0.0: - resolution: {integrity: sha512-dOESqjYr96iWYylGObzd39EuNTa5VJxyvVAEm5Jnh7KGo75V43Hk1odPQkNDyXNmUR6k+gEiDVXnjB8HJ3crXw==} - engines: {node: '>=12'} - dev: true - - /strip-json-comments@2.0.1: - resolution: {integrity: sha512-4gB8na07fecVVkOI6Rs4e7T6NOTki5EmL7TUduTs6bu3EdnSycntVJ4re8kgZA+wx9IueI2Y11bfbgwtzuE0KQ==} - engines: {node: '>=0.10.0'} - dev: true - - /strip-outer@1.0.1: - resolution: {integrity: sha512-k55yxKHwaXnpYGsOzg4Vl8+tDrWylxDEpknGjhTiZB8dFRU5rTo9CAzeycivxV3s+zlTKwrs6WxMxR95n26kwg==} - engines: {node: '>=0.10.0'} - dependencies: - escape-string-regexp: 1.0.5 - dev: true - - /supports-color@5.5.0: - resolution: {integrity: sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow==} - engines: {node: '>=4'} - dependencies: - has-flag: 3.0.0 - dev: true - - /supports-color@7.2.0: - resolution: {integrity: sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==} - engines: {node: '>=8'} - dependencies: - has-flag: 4.0.0 - dev: true - - /supports-color@8.1.1: - resolution: {integrity: sha512-MpUEN2OodtUzxvKQl72cUF7RQ5EiHsGvSsVG0ia9c5RbWGL2CI4C7EpPS8UTBIplnlzZiNuV56w+FuNxy3ty2Q==} - engines: {node: '>=10'} - dependencies: - has-flag: 4.0.0 - dev: true - - /supports-preserve-symlinks-flag@1.0.0: - resolution: {integrity: sha512-ot0WnXS9fgdkgIcePe6RHNk1WA8+muPa6cSjeR3V8K27q9BB1rTE3R1p7Hv0z1ZyAc8s6Vvv8DIyWf681MAt0w==} - engines: {node: '>= 0.4'} - dev: true - - /tapable@1.1.3: - resolution: {integrity: sha512-4WK/bYZmj8xLr+HUCODHGF1ZFzsYffasLUgEiMBY4fgtltdO6B4WJtlSbPaDTLpYTcGVwM2qLnFTICEcNxs3kA==} - engines: {node: '>=6'} - dev: true - - /tapable@2.2.1: - resolution: {integrity: sha512-GNzQvQTOIP6RyTfE2Qxb8ZVlNmw0n88vp1szwWRimP02mnTsx3Wtn5qRdqY9w2XduFNUgvOwhNnQsjwCp+kqaQ==} - engines: {node: '>=6'} - dev: true - - /tar-stream@1.6.2: - resolution: {integrity: sha512-rzS0heiNf8Xn7/mpdSVVSMAWAoy9bfb1WOTYC78Z0UQKeKa/CWS8FOq0lKGNa8DWKAn9gxjCvMLYc5PGXYlK2A==} - engines: {node: '>= 0.8.0'} - dependencies: - bl: 1.2.3 - buffer-alloc: 1.2.0 - end-of-stream: 1.4.4 - fs-constants: 1.0.0 - readable-stream: 2.3.8 - to-buffer: 1.1.1 - xtend: 4.0.2 - dev: true - - /tdigest@0.1.2: - resolution: {integrity: sha512-+G0LLgjjo9BZX2MfdvPfH+MKLCrxlXSYec5DaPYP1fe6Iyhf0/fSmJ0bFiZ1F8BT6cGXl2LpltQptzjXKWEkKA==} - dependencies: - bintrees: 1.0.2 - dev: false - - /terser-webpack-plugin@5.3.9(webpack@5.89.0): - resolution: {integrity: sha512-ZuXsqE07EcggTWQjXUj+Aot/OMcD0bMKGgF63f7UxYcu5/AJF53aIpK1YoP5xR9l6s/Hy2b+t1AM0bLNPRuhwA==} - engines: {node: '>= 10.13.0'} - peerDependencies: - '@swc/core': '*' - esbuild: '*' - uglify-js: '*' - webpack: ^5.1.0 - peerDependenciesMeta: - '@swc/core': - optional: true - esbuild: - optional: true - uglify-js: - optional: true - dependencies: - '@jridgewell/trace-mapping': 0.3.20 - jest-worker: 27.5.1 - schema-utils: 3.3.0 - serialize-javascript: 6.0.1 - terser: 5.26.0 - webpack: 5.89.0 - dev: true - - /terser@4.8.1: - resolution: {integrity: sha512-4GnLC0x667eJG0ewJTa6z/yXrbLGv80D9Ru6HIpCQmO+Q4PfEtBFi0ObSckqwL6VyQv/7ENJieXHo2ANmdQwgw==} - engines: {node: '>=6.0.0'} - hasBin: true - dependencies: - acorn: 8.11.2 - commander: 2.20.3 - source-map: 0.6.1 - source-map-support: 0.5.21 - dev: true - - /terser@5.26.0: - resolution: {integrity: sha512-dytTGoE2oHgbNV9nTzgBEPaqAWvcJNl66VZ0BkJqlvp71IjO8CxdBx/ykCNb47cLnCmCvRZ6ZR0tLkqvZCdVBQ==} - engines: {node: '>=10'} - hasBin: true - dependencies: - '@jridgewell/source-map': 0.3.5 - acorn: 8.11.2 - commander: 2.20.3 - source-map-support: 0.5.21 - dev: true - - /test-exclude@6.0.0: - resolution: {integrity: sha512-cAGWPIyOHU6zlmg88jwm7VRyXnMN7iV68OGAbYDk/Mh/xC/pzVPlQtY6ngoIH/5/tciuhGfvESU8GrHrcxD56w==} - engines: {node: '>=8'} - dependencies: - '@istanbuljs/schema': 0.1.3 - glob: 7.2.3 - minimatch: 3.1.2 - dev: true - - /throttleit@1.0.1: - resolution: {integrity: sha512-vDZpf9Chs9mAdfY046mcPt8fg5QSZr37hEH4TXYBnDF+izxgrbRGUAAaBvIk/fJm9aOFCGFd1EsNg5AZCbnQCQ==} - dev: true - - /through@2.3.8: - resolution: {integrity: sha512-w89qg7PI8wAdvX60bMDP+bFoD5Dvhm9oLheFp5O4a2QF0cSBGsBX4qZmadPMvVqlLJBBci+WqGGOAPvcDeNSVg==} - dev: true - - /thunky@1.1.0: - resolution: {integrity: sha512-eHY7nBftgThBqOyHGVN+l8gF0BucP09fMo0oO/Lb0w1OF80dJv+lDVpXG60WMQvkcxAkNybKsrEIE3ZtKGmPrA==} - dev: true - - /tmp@0.2.1: - resolution: {integrity: sha512-76SUhtfqR2Ijn+xllcI5P1oyannHNHByD80W1q447gU3mp9G9PSpGdWmjUOHRDPiHYacIk66W7ubDTuPF3BEtQ==} - engines: {node: '>=8.17.0'} - dependencies: - rimraf: 3.0.2 - dev: true - - /to-buffer@1.1.1: - resolution: {integrity: sha512-lx9B5iv7msuFYE3dytT+KE5tap+rNYw+K4jVkb9R/asAb+pbBSM17jtunHplhBe6RRJdZx3Pn2Jph24O32mOVg==} - dev: true - - /to-fast-properties@1.0.3: - resolution: {integrity: sha512-lxrWP8ejsq+7E3nNjwYmUBMAgjMTZoTI+sdBOpvNyijeDLa29LUn9QaoXAHv4+Z578hbmHHJKZknzxVtvo77og==} - engines: {node: '>=0.10.0'} - dev: true - - /to-fast-properties@2.0.0: - resolution: {integrity: sha512-/OaKK0xYrs3DmxRYqL/yDc+FxFUVYhDlXMhRmv3z915w2HF1tnN1omB354j8VUGO/hbRzyD6Y3sA7v7GS/ceog==} - engines: {node: '>=4'} - dev: true - - /to-regex-range@5.0.1: - resolution: {integrity: sha512-65P7iz6X5yEr1cwcgvQxbbIw7Uk3gOy5dIdtZ4rDveLqhrdJP+Li/Hx6tyK0NEb+2GCyneCMJiGqrADCSNk8sQ==} - engines: {node: '>=8.0'} - dependencies: - is-number: 7.0.0 - dev: true - - /toidentifier@1.0.1: - resolution: {integrity: sha512-o5sSPKEkg/DIQNmH43V0/uerLrpzVedkUh8tGNvaeXpfpuwjKenlSox/2O/BTlZUtEe+JG7s5YhEz608PlAHRA==} - engines: {node: '>=0.6'} - dev: true - - /tough-cookie@4.1.3: - resolution: {integrity: sha512-aX/y5pVRkfRnfmuX+OdbSdXvPe6ieKX/G2s7e98f4poJHnqH3281gDPm/metm6E/WRamfx7WC4HUqkWHfQHprw==} - engines: {node: '>=6'} - dependencies: - psl: 1.9.0 - punycode: 2.3.1 - universalify: 0.2.0 - url-parse: 1.5.10 - dev: true - - /tr46@0.0.3: - resolution: {integrity: sha512-N3WMsuqV66lT30CrXNbEjx4GEwlow3v6rr4mCcv6prnfwhS01rkgyFdjPNBYd9br7LpXV1+Emh01fHnq2Gdgrw==} - dev: true - - /trim-repeated@1.0.0: - resolution: {integrity: sha512-pkonvlKk8/ZuR0D5tLW8ljt5I8kmxp2XKymhepUeOdCEfKpZaktSArkLHZt76OB1ZvO9bssUsDty4SWhLvZpLg==} - engines: {node: '>=0.10.0'} - dependencies: - escape-string-regexp: 1.0.5 - dev: true - - /ts-interface-checker@0.1.13: - resolution: {integrity: sha512-Y/arvbn+rrz3JCKl9C4kVNfTfSm2/mEp5FSz5EsZSANGPSlQrpRI5M4PKF+mJnE52jOO90PnPSc3Ur3bTQw0gA==} - dev: true - - /tslib@2.4.0: - resolution: {integrity: sha512-d6xOpEDfsi2CZVlPQzGeux8XMwLT9hssAsaPYExaQMuYskwb+x1x7J371tWlbBdWHroy99KnVB6qIkUbs5X3UQ==} - dev: true - - /tslib@2.6.2: - resolution: {integrity: sha512-AEYxH93jGFPn/a2iVAwW87VuUIkR1FVUKB77NwMF7nBTDkDrrT/Hpt/IrCJ0QXhW27jTBDcf5ZY7w6RiqTMw2Q==} - dev: true - - /tunnel-agent@0.6.0: - resolution: {integrity: sha512-McnNiV1l8RYeY8tBgEpuodCC1mLUdbSN+CYBL7kJsJNInOP8UjDDEwdk6Mw60vdLLrr5NHKZhMAOSrR2NZuQ+w==} - dependencies: - safe-buffer: 5.2.1 - dev: true - - /tweetnacl@0.14.5: - resolution: {integrity: sha512-KXXFFdAbFXY4geFIwoyNK+f5Z1b7swfXABfL7HXCmoIWMKU3dmS26672A4EeQtDzLKy7SXmfBu51JolvEKwtGA==} - dev: true - - /type-fest@0.21.3: - resolution: {integrity: sha512-t0rzBq87m3fVcduHDUFhKmyyX+9eo6WQjZvf51Ea/M0Q7+T374Jp1aUiyUl0GKxp8M/OETVHSDvmkyPgvX+X2w==} - engines: {node: '>=10'} - dev: true - - /type-fest@0.8.1: - resolution: {integrity: sha512-4dbzIzqvjtgiM5rw1k5rEHtBANKmdudhGyBEajN01fEyhaAIhsoKNy6y7+IN93IfpFtwY9iqi7kD+xwKhQsNJA==} - engines: {node: '>=8'} - dev: true - - /type-fest@2.19.0: - resolution: {integrity: sha512-RAH822pAdBgcNMAfWnCBU3CFZcfZ/i1eZjwFU/dsLKumyuuP3niueg2UAukXYF0E2AAoc82ZSSf9J0WQBinzHA==} - engines: {node: '>=12.20'} - dev: true - - /type-is@1.6.18: - resolution: {integrity: sha512-TkRKr9sUTxEH8MdfuCSP7VizJyzRNMjj2J2do2Jr3Kym598JVdEksuzPQCnlFPW4ky9Q+iA+ma9BGm06XQBy8g==} - engines: {node: '>= 0.6'} - dependencies: - media-typer: 0.3.0 - mime-types: 2.1.35 - dev: true - - /typed-array-buffer@1.0.0: - resolution: {integrity: sha512-Y8KTSIglk9OZEr8zywiIHG/kmQ7KWyjseXs1CbSo8vC42w7hg2HgYTxSWwP0+is7bWDc1H+Fo026CpHFwm8tkw==} - engines: {node: '>= 0.4'} - dependencies: - call-bind: 1.0.5 - get-intrinsic: 1.2.2 - is-typed-array: 1.1.12 - dev: true - - /typed-array-byte-length@1.0.0: - resolution: {integrity: sha512-Or/+kvLxNpeQ9DtSydonMxCx+9ZXOswtwJn17SNLvhptaXYDJvkFFP5zbfU/uLmvnBJlI4yrnXRxpdWH/M5tNA==} - engines: {node: '>= 0.4'} - dependencies: - call-bind: 1.0.5 - for-each: 0.3.3 - has-proto: 1.0.1 - is-typed-array: 1.1.12 - dev: true - - /typed-array-byte-offset@1.0.0: - resolution: {integrity: sha512-RD97prjEt9EL8YgAgpOkf3O4IF9lhJFr9g0htQkm0rchFp/Vx7LW5Q8fSXXub7BXAODyUQohRMyOc3faCPd0hg==} - engines: {node: '>= 0.4'} - dependencies: - available-typed-arrays: 1.0.5 - call-bind: 1.0.5 - for-each: 0.3.3 - has-proto: 1.0.1 - is-typed-array: 1.1.12 - dev: true - - /typed-array-length@1.0.4: - resolution: {integrity: sha512-KjZypGq+I/H7HI5HlOoGHkWUUGq+Q0TPhQurLbyrVrvnKTBgzLhIJ7j6J/XTQOi0d1RjyZ0wdas8bKs2p0x3Ng==} - dependencies: - call-bind: 1.0.5 - for-each: 0.3.3 - is-typed-array: 1.1.12 - dev: true - - /typedarray-to-buffer@3.1.5: - resolution: {integrity: sha512-zdu8XMNEDepKKR+XYOXAVPtWui0ly0NtohUscw+UmaHiAWT8hrV1rr//H6V+0DvJ3OQ19S979M0laLfX8rm82Q==} - dependencies: - is-typedarray: 1.0.0 - dev: true - - /typescript@5.3.3: - resolution: {integrity: sha512-pXWcraxM0uxAS+tN0AG/BF2TyqmHO014Z070UsJ+pFvYuRSq8KH8DmWpnbXe0pEPDHXZV3FcAbJkijJ5oNEnWw==} - engines: {node: '>=14.17'} - hasBin: true - dev: true - - /unbox-primitive@1.0.2: - resolution: {integrity: sha512-61pPlCD9h51VoreyJ0BReideM3MDKMKnh6+V9L08331ipq6Q8OFXZYiqP6n/tbHx4s5I9uRhcye6BrbkizkBDw==} - dependencies: - call-bind: 1.0.5 - has-bigints: 1.0.2 - has-symbols: 1.0.3 - which-boxed-primitive: 1.0.2 - dev: true - - /unbzip2-stream@1.4.3: - resolution: {integrity: sha512-mlExGW4w71ebDJviH16lQLtZS32VKqsSfk80GCfUlwT/4/hNRFsoscrF/c++9xinkMzECL1uL9DDwXqFWkruPg==} - dependencies: - buffer: 5.7.1 - through: 2.3.8 - dev: true - - /underscore@1.13.6: - resolution: {integrity: sha512-+A5Sja4HP1M08MaXya7p5LvjuM7K6q/2EaC0+iovj/wOcMsTzMvDFbasi/oSapiwOlt252IqsKqPjCl7huKS0A==} - dev: true - - /undici-types@5.26.5: - resolution: {integrity: sha512-JlCMO+ehdEIKqlFxk6IfVoAUVmgz7cU7zD/h9XZ0qzeosSHmUJVOzSQvvYSYWXkFXC+IfLKSIffhv0sVZup6pA==} - requiresBuild: true - 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 - - /universalify@0.1.2: - resolution: {integrity: sha512-rBJeI5CXAlmy1pV+617WB9J63U6XcazHHF2f2dbJix4XzpUF0RS3Zbj0FGIOCAva5P/d/GBOYaACQ1w+0azUkg==} - engines: {node: '>= 4.0.0'} - dev: true - - /universalify@0.2.0: - resolution: {integrity: sha512-CJ1QgKmNg3CwvAv/kOFmtnEN05f0D/cn9QntgNOQlQF9dgvVTHj3t+8JPdjqawCHk7V/KA+fbUqzZ9XWhcqPUg==} - engines: {node: '>= 4.0.0'} - dev: true - - /universalify@2.0.1: - resolution: {integrity: sha512-gptHNQghINnc/vTGIk0SOFGFNXw7JVrlRUtConJRlvaw6DuX0wO5Jeko9sWrMBhh+PsYAZ7oXAiOnf/UKogyiw==} - engines: {node: '>= 10.0.0'} - dev: true - - /unpipe@1.0.0: - resolution: {integrity: sha512-pjy2bYhSsufwWlKwPc+l3cN7+wuJlK6uz0YdJEOlQDbl6jo/YlPi4mb8agUkVC8BF7V8NuzeyPNqRksA3hztKQ==} - engines: {node: '>= 0.8'} - dev: true - - /untildify@4.0.0: - resolution: {integrity: sha512-KK8xQ1mkzZeg9inewmFVDNkg3l5LUhoq9kN6iWYB/CC9YMG8HA+c1Q8HwDe6dEX7kErrEVNVBO3fWsVq5iDgtw==} - engines: {node: '>=8'} - dev: true - - /update-browserslist-db@1.0.13(browserslist@4.22.2): - resolution: {integrity: sha512-xebP81SNcPuNpPP3uzeW1NYXxI3rxyJzF3pD6sH4jE7o/IX+WtSpwnVU+qIsDPyk0d3hmFQ7mjqc6AtV604hbg==} - hasBin: true - peerDependencies: - browserslist: '>= 4.21.0' - dependencies: - browserslist: 4.22.2 - escalade: 3.1.1 - picocolors: 1.0.0 - dev: true - - /update-check@1.5.4: - resolution: {integrity: sha512-5YHsflzHP4t1G+8WGPlvKbJEbAJGCgw+Em+dGR1KmBUbr1J36SJBqlHLjR7oob7sco5hWHGQVcr9B2poIVDDTQ==} - dependencies: - registry-auth-token: 3.3.2 - registry-url: 3.1.0 - dev: true - - /uri-js@4.4.1: - resolution: {integrity: sha512-7rKUyy33Q1yc98pQ1DAmLtwX109F7TIfWlW1Ydo8Wl1ii1SeHieeh0HHfPeL2fMXK6z0s8ecKs9frCuLJvndBg==} - dependencies: - punycode: 2.3.1 - dev: true - - /url-parse@1.5.10: - resolution: {integrity: sha512-WypcfiRhfeUP9vvF0j6rw0J3hrWrw6iZv3+22h6iRMJ/8z1Tj6XfLP4DsUix5MhMPnXpiHDoKyoZ/bdCkwBCiQ==} - dependencies: - querystringify: 2.2.0 - requires-port: 1.0.0 - dev: true - - /user-home@2.0.0: - resolution: {integrity: sha512-KMWqdlOcjCYdtIJpicDSFBQ8nFwS2i9sslAd6f4+CBGcU4gist2REnr2fxj2YocvJFxSF3ZOHLYLVZnUxv4BZQ==} - engines: {node: '>=0.10.0'} - dependencies: - os-homedir: 1.0.2 - dev: true - - /util-deprecate@1.0.2: - resolution: {integrity: sha512-EPD5q1uXyFxJpCrLnCc1nHnq3gOa6DZBocAIiI2TaSCA7VCJ1UJDMagCzIkXNsUYfD1daK//LTEQ8xiIbrHtcw==} - dev: true - - /util.promisify@1.0.0: - resolution: {integrity: sha512-i+6qA2MPhvoKLuxnJNpXAGhg7HphQOSUq2LKMZD0m15EiskXUkMvKdF4Uui0WYeCUGea+o2cw/ZuwehtfsrNkA==} - dependencies: - define-properties: 1.2.1 - object.getownpropertydescriptors: 2.1.7 - dev: true - - /utila@0.4.0: - resolution: {integrity: sha512-Z0DbgELS9/L/75wZbro8xAnT50pBVFQZ+hUEueGDU5FN51YSCYM+jdxsfCiHjwNP/4LCDD0i/graKpeBnOXKRA==} - dev: true - - /utils-merge@1.0.1: - resolution: {integrity: sha512-pMZTvIkT1d+TFGvDOqodOclx0QWkkgi6Tdoa8gC8ffGAAqz9pzPTZWAybbsHHoED/ztMtkv/VoYTYyShUn81hA==} - engines: {node: '>= 0.4.0'} - dev: true - - /uuid@8.3.2: - resolution: {integrity: sha512-+NYs2QeMWy+GWFOEm9xnn6HCDp0l7QBD7ml8zLUmJ+93Q5NF0NocErnwkTkXVFNiX3/fpC6afS8Dhb/gz7R7eg==} - hasBin: true - dev: true - - /vary@1.1.2: - resolution: {integrity: sha512-BNGbWLfd0eUPabhkXUVm0j8uuvREyTh5ovRa/dyow/BqAbZJyC+5fU+IzQOzmAKzYqYRAISoRhdQr3eIZ/PXqg==} - engines: {node: '>= 0.8'} - dev: true - - /verror@1.10.0: - resolution: {integrity: sha512-ZZKSmDAEFOijERBLkmYfJ+vmk3w+7hOLYDNkRCuRuMJGEmqYNCNLyBBFwWKVMhfwaEF3WOd0Zlw86U/WC/+nYw==} - engines: {'0': node >=0.6.0} - dependencies: - assert-plus: 1.0.0 - core-util-is: 1.0.2 - extsprintf: 1.3.0 - dev: true - - /viem@1.20.0(typescript@5.3.3)(zod@3.22.4): - resolution: {integrity: sha512-yPjV9pJr10xi28C/9LEvs5zdZNEMiru3Kz7nufghVYABJAfeSkoZQXb6b23n7MscS7c55JO5nmUI3xKkd9g6Yg==} - 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 - - /wait-on@7.2.0(debug@4.3.4): - resolution: {integrity: sha512-wCQcHkRazgjG5XoAq9jbTMLpNIjoSlZslrJ2+N9MxDsGEv1HnFoVjOCexL0ESva7Y9cu350j+DWADdk54s4AFQ==} - engines: {node: '>=12.0.0'} - hasBin: true - dependencies: - axios: 1.6.2(debug@4.3.4) - joi: 17.11.0 - lodash: 4.17.21 - minimist: 1.2.8 - rxjs: 7.8.1 - transitivePeerDependencies: - - debug - dev: true - - /watchpack@2.4.0: - resolution: {integrity: sha512-Lcvm7MGST/4fup+ifyKi2hjyIAwcdI4HRgtvTpIUxBRhB+RFtUh8XtDOxUfctVCnhVi+QQj49i91OyvzkJl6cg==} - engines: {node: '>=10.13.0'} - dependencies: - glob-to-regexp: 0.4.1 - graceful-fs: 4.2.11 - dev: true - - /wbuf@1.7.3: - resolution: {integrity: sha512-O84QOnr0icsbFGLS0O3bI5FswxzRr8/gHwWkDlQFskhSPryQXvrTMxjxGP4+iWYoauLoBvfDpkrOauZ+0iZpDA==} - dependencies: - minimalistic-assert: 1.0.1 - dev: true - - /webidl-conversions@3.0.1: - resolution: {integrity: sha512-2JAn3z8AR6rjK8Sm8orRC0h/bcl/DqL7tRPdGZ4I1CjdF+EaMLmYxBHyXuKL849eucPFhvBoxMsflfOb8kxaeQ==} - dev: true - - /webpack-dev-middleware@5.3.3(webpack@5.89.0): - resolution: {integrity: sha512-hj5CYrY0bZLB+eTO+x/j67Pkrquiy7kWepMHmUMoPsmcUaeEnQJqFzHJOyxgWlq746/wUuA64p9ta34Kyb01pA==} - engines: {node: '>= 12.13.0'} - peerDependencies: - webpack: ^4.0.0 || ^5.0.0 - dependencies: - colorette: 2.0.20 - memfs: 3.5.3 - mime-types: 2.1.35 - range-parser: 1.2.1 - schema-utils: 4.2.0 - webpack: 5.89.0 - dev: true - - /webpack-dev-server@4.15.1(debug@4.3.4)(webpack@5.89.0): - resolution: {integrity: sha512-5hbAst3h3C3L8w6W4P96L5vaV0PxSmJhxZvWKYIdgxOQm8pNZ5dEOmmSLBVpP85ReeyRt6AS1QJNyo/oFFPeVA==} - engines: {node: '>= 12.13.0'} - hasBin: true - peerDependencies: - webpack: ^4.37.0 || ^5.0.0 - webpack-cli: '*' - peerDependenciesMeta: - webpack: - optional: true - webpack-cli: - optional: true - dependencies: - '@types/bonjour': 3.5.13 - '@types/connect-history-api-fallback': 1.5.4 - '@types/express': 4.17.21 - '@types/serve-index': 1.9.4 - '@types/serve-static': 1.15.5 - '@types/sockjs': 0.3.36 - '@types/ws': 8.5.10 - ansi-html-community: 0.0.8 - bonjour-service: 1.1.1 - chokidar: 3.5.3 - colorette: 2.0.20 - compression: 1.7.4 - connect-history-api-fallback: 2.0.0 - default-gateway: 6.0.3 - express: 4.18.2 - graceful-fs: 4.2.11 - html-entities: 2.4.0 - http-proxy-middleware: 2.0.6(@types/express@4.17.21)(debug@4.3.4) - ipaddr.js: 2.1.0 - launch-editor: 2.6.1 - open: 8.4.2 - p-retry: 4.6.2 - rimraf: 3.0.2 - schema-utils: 4.2.0 - selfsigned: 2.4.1 - serve-index: 1.9.1 - sockjs: 0.3.24 - spdy: 4.0.2 - webpack: 5.89.0 - webpack-dev-middleware: 5.3.3(webpack@5.89.0) - ws: 8.15.1 - transitivePeerDependencies: - - bufferutil - - debug - - supports-color - - utf-8-validate - dev: true - - /webpack-merge@5.10.0: - resolution: {integrity: sha512-+4zXKdx7UnO+1jaN4l2lHVD+mFvnlZQP/6ljaJVb4SZiwIKeUnrT5l0gkT8z+n4hKpC+jpOv6O9R+gLtag7pSA==} - engines: {node: '>=10.0.0'} - dependencies: - clone-deep: 4.0.1 - flat: 5.0.2 - wildcard: 2.0.1 - dev: true - - /webpack-sources@3.2.3: - resolution: {integrity: sha512-/DyMEOrDgLKKIG0fmvtz+4dUX/3Ghozwgm6iPp8KRhvn+eQf9+Q7GWxVNMk3+uCPWfdXYC4ExGBckIXdFEfH1w==} - engines: {node: '>=10.13.0'} - dev: true - - /webpack@5.89.0: - resolution: {integrity: sha512-qyfIC10pOr70V+jkmud8tMfajraGCZMBWJtrmuBymQKCrLTRejBI8STDp1MCyZu/QTdZSeacCQYpYNQVOzX5kw==} - engines: {node: '>=10.13.0'} - hasBin: true - peerDependencies: - webpack-cli: '*' - peerDependenciesMeta: - webpack-cli: - optional: true - dependencies: - '@types/eslint-scope': 3.7.7 - '@types/estree': 1.0.5 - '@webassemblyjs/ast': 1.11.6 - '@webassemblyjs/wasm-edit': 1.11.6 - '@webassemblyjs/wasm-parser': 1.11.6 - acorn: 8.11.2 - acorn-import-assertions: 1.9.0(acorn@8.11.2) - browserslist: 4.22.2 - chrome-trace-event: 1.0.3 - enhanced-resolve: 5.15.0 - es-module-lexer: 1.4.1 - eslint-scope: 5.1.1 - events: 3.3.0 - glob-to-regexp: 0.4.1 - graceful-fs: 4.2.11 - json-parse-even-better-errors: 2.3.1 - loader-runner: 4.3.0 - mime-types: 2.1.35 - neo-async: 2.6.2 - schema-utils: 3.3.0 - tapable: 2.2.1 - terser-webpack-plugin: 5.3.9(webpack@5.89.0) - watchpack: 2.4.0 - webpack-sources: 3.2.3 - transitivePeerDependencies: - - '@swc/core' - - esbuild - - uglify-js - dev: true - - /websocket-driver@0.7.4: - resolution: {integrity: sha512-b17KeDIQVjvb0ssuSDF2cYXSg2iztliJ4B9WdsuB6J952qCPKmnVq4DyW5motImXHDC1cBT/1UezrJVsKw5zjg==} - engines: {node: '>=0.8.0'} - dependencies: - http-parser-js: 0.5.8 - safe-buffer: 5.2.1 - websocket-extensions: 0.1.4 - dev: true - - /websocket-extensions@0.1.4: - resolution: {integrity: sha512-OqedPIGOfsDlo31UNwYbCFMSaO9m9G/0faIHj5/dZFDMFqPTcx6UwqyOy3COEaEOg/9VsGIpdqn62W5KhoKSpg==} - engines: {node: '>=0.8.0'} - dev: true - - /whatwg-url@5.0.0: - resolution: {integrity: sha512-saE57nupxk6v3HY35+jzBwYa0rKSy0XR8JSxZPwgLr7ys0IBzhGviA1/TUGJLmSVqs8pb9AnvICXEuOHLprYTw==} - dependencies: - tr46: 0.0.3 - webidl-conversions: 3.0.1 - dev: true - - /which-boxed-primitive@1.0.2: - resolution: {integrity: sha512-bwZdv0AKLpplFY2KZRX6TvyuN7ojjr7lwkg6ml0roIy9YeuSr7JS372qlNW18UQYzgYK9ziGcerWqZOmEn9VNg==} - dependencies: - is-bigint: 1.0.4 - is-boolean-object: 1.1.2 - is-number-object: 1.0.7 - is-string: 1.0.7 - is-symbol: 1.0.4 - dev: true - - /which-collection@1.0.1: - resolution: {integrity: sha512-W8xeTUwaln8i3K/cY1nGXzdnVZlidBcagyNFtBdD5kxnb4TvGKR7FfSIS3mYpwWS1QUCutfKz8IY8RjftB0+1A==} - dependencies: - is-map: 2.0.2 - is-set: 2.0.2 - is-weakmap: 2.0.1 - is-weakset: 2.0.2 - dev: true - - /which-module@2.0.1: - resolution: {integrity: sha512-iBdZ57RDvnOR9AGBhML2vFZf7h8vmBjhoaZqODJBFWHVtKkDmKuHai3cx5PgVMrX5YDNp27AofYbAwctSS+vhQ==} - dev: true - - /which-typed-array@1.1.13: - resolution: {integrity: sha512-P5Nra0qjSncduVPEAr7xhoF5guty49ArDTwzJ/yNuPIbZppyRxFQsRCWrocxIY+CnMVG+qfbU2FmDKyvSGClow==} - engines: {node: '>= 0.4'} - dependencies: - available-typed-arrays: 1.0.5 - call-bind: 1.0.5 - for-each: 0.3.3 - gopd: 1.0.1 - has-tostringtag: 1.0.0 - dev: true - - /which@2.0.2: - resolution: {integrity: sha512-BLI3Tl1TW3Pvl70l3yq3Y64i+awpwXqsGBYWkkqMtnbXgrMD+yj7rhW0kuEDxzJaYXGjEW5ogapKNMEKNMjibA==} - engines: {node: '>= 8'} - hasBin: true - dependencies: - isexe: 2.0.0 - dev: true - - /widest-line@4.0.1: - resolution: {integrity: sha512-o0cyEG0e8GPzT4iGHphIOh0cJOV8fivsXxddQasHPHfoZf1ZexrfeA21w2NaEN1RHE+fXlfISmOE8R9N3u3Qig==} - engines: {node: '>=12'} - dependencies: - string-width: 5.1.2 - dev: true - - /wildcard@2.0.1: - resolution: {integrity: sha512-CC1bOL87PIWSBhDcTrdeLo6eGT7mCFtrg0uIJtqJUFyK+eJnzl8A1niH56uu7KMa5XFrtiV+AQuHO3n7DsHnLQ==} - dev: true - - /wrap-ansi@6.2.0: - resolution: {integrity: sha512-r6lPcBGxZXlIcymEu7InxDMhdW0KDxpLgoFLcguasxCaJ/SOIZwINatK9KY/tf+ZrlywOKU0UDj3ATXUBfxJXA==} - engines: {node: '>=8'} - dependencies: - ansi-styles: 4.3.0 - string-width: 4.2.3 - strip-ansi: 6.0.1 - dev: true - - /wrap-ansi@7.0.0: - resolution: {integrity: sha512-YVGIj2kamLSTxw6NsZjoBxfSwsn0ycdesmc4p+Q21c5zPuZ1pl+NfxVdxPtdHvmNVOQ6XSYG4AUtyt/Fi7D16Q==} - engines: {node: '>=10'} - dependencies: - ansi-styles: 4.3.0 - string-width: 4.2.3 - strip-ansi: 6.0.1 - dev: true - - /wrap-ansi@8.1.0: - resolution: {integrity: sha512-si7QWI6zUMq56bESFvagtmzMdGOtoxfR+Sez11Mobfc7tm+VkUckk9bW2UeffTGVUbOksxmSw0AA2gs8g71NCQ==} - engines: {node: '>=12'} - dependencies: - ansi-styles: 6.2.1 - string-width: 5.1.2 - strip-ansi: 7.1.0 - dev: true - - /wrappy@1.0.2: - resolution: {integrity: sha512-l4Sp/DRseor9wL6EvV2+TuQn63dMkPjZ/sp9XkghTEbV9KlPS1xUsZ3u7/IQO4wxtcFB4bgpQPRcR3QCvezPcQ==} - dev: true - - /write-file-atomic@3.0.3: - resolution: {integrity: sha512-AvHcyZ5JnSfq3ioSyjrBkH9yW4m7Ayk8/9My/DD9onKeu/94fwrMocemO2QAJFAlnnDN+ZDS+ZjAR5ua1/PV/Q==} - dependencies: - imurmurhash: 0.1.4 - is-typedarray: 1.0.0 - signal-exit: 3.0.7 - typedarray-to-buffer: 3.1.5 - dev: true - - /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 - dev: true - - /ws@8.15.1: - resolution: {integrity: sha512-W5OZiCjXEmk0yZ66ZN82beM5Sz7l7coYxpRkzS+p9PP+ToQry8szKh+61eNktr7EA9DOwvFGhfC605jDHbP6QQ==} - 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 - dev: true - - /ws@8.5.0: - resolution: {integrity: sha512-BWX0SWVgLPzYwF8lTzEy1egjhS4S4OEAHfsO8o65WOVsrnSRGaSiUaa9e0ggGlkMTtBlmOpEXiie9RUcBO86qg==} - 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 - dev: true - - /xtend@4.0.2: - resolution: {integrity: sha512-LKYU1iAXJXUgAXn9URjiu+MWhyUXHsvfp7mcuYm9dSUKK0/CjtrUwFAxD82/mCWbtLsGjFIad0wIsod4zrTAEQ==} - engines: {node: '>=0.4'} - dev: true - - /y18n@4.0.3: - resolution: {integrity: sha512-JKhqTOwSrqNA1NY5lSztJ1GrBiUodLMmIZuLiDaMRJ+itFd+ABVE8XBjOvIWL+rSqNDC74LCSFmlb/U4UZ4hJQ==} - dev: true - - /yallist@3.1.1: - resolution: {integrity: sha512-a4UGQaWPH59mOXUYnAG2ewncQS4i4F43Tv3JoAM+s2VDAmS9NsK8GpDMLrCHPksFT7h3K6TOoUNn2pb7RoXx4g==} - dev: true - - /yallist@4.0.0: - resolution: {integrity: sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A==} - dev: true - - /yargs-parser@18.1.3: - resolution: {integrity: sha512-o50j0JeToy/4K6OZcaQmW6lyXXKhq7csREXcDwk2omFPJEwUNOVtJKvmDr9EI1fAJZUyZcRF7kxGBWmRXudrCQ==} - engines: {node: '>=6'} - dependencies: - camelcase: 5.3.1 - decamelize: 1.2.0 - dev: true - - /yargs@15.4.1: - resolution: {integrity: sha512-aePbxDmcYW++PaqBsJ+HYUFwCdv4LVvdnhBy78E57PIor8/OVvhMrADFFEDh8DHDFRv/O9i3lPhsENjO7QX0+A==} - engines: {node: '>=8'} - dependencies: - cliui: 6.0.0 - decamelize: 1.2.0 - find-up: 4.1.0 - get-caller-file: 2.0.5 - require-directory: 2.1.1 - require-main-filename: 2.0.0 - set-blocking: 2.0.0 - string-width: 4.2.3 - which-module: 2.0.1 - y18n: 4.0.3 - yargs-parser: 18.1.3 - dev: true - - /yauzl@2.10.0: - resolution: {integrity: sha512-p4a9I6X6nu6IhoGmBqAcbJy1mlC4j27vEPZX9F4L4/vZT3Lyq1VkFHw/V/PUcB9Buo+DG3iHkT0x3Qya58zc3g==} - dependencies: - buffer-crc32: 0.2.13 - fd-slicer: 1.1.0 - dev: true - - /yocto-queue@1.0.0: - resolution: {integrity: sha512-9bnSc/HEW2uRy67wc+T8UwauLuPJVn28jb+GtJY16iiKWyvmYJRXVT4UamsAEGQfPohgr2q4Tq0sQbQlxTfi1g==} - engines: {node: '>=12.20'} - dev: true - - /zod@3.22.4: - resolution: {integrity: sha512-iC+8Io04lddc+mVqQ9AZ7OQ2MrUKGN+oIQyq1vemgt46jwCwLfhq7/pwnBnNXXXZb8VTVLKwp9EDkx+ryxIWmg==} diff --git a/ufm-test-services/metamask/pnpm-workspace.yaml b/ufm-test-services/metamask/pnpm-workspace.yaml deleted file mode 100644 index 7d32016dd639..000000000000 --- a/ufm-test-services/metamask/pnpm-workspace.yaml +++ /dev/null @@ -1,2 +0,0 @@ -packages: - - ./ diff --git a/ufm-test-services/metamask/start.sh b/ufm-test-services/metamask/start.sh deleted file mode 100755 index 3a9786d8800d..000000000000 --- a/ufm-test-services/metamask/start.sh +++ /dev/null @@ -1,18 +0,0 @@ -#!/bin/bash - -if [ "$METAMASK_PLAYWRIGHT_RUN_HEADLESS" != "false" ]; then - # Start Xvfb in the background on display :99 - Xvfb :99 & - - # Set the DISPLAY environment variable - export DISPLAY=:99 -fi - -npm test - -# If something goes wrong, Playwright generates this file, but only if there is an error. -# npx playwright show-trace will log the Playwright error -if [ -f "test-results/metamask-Setup-wallet-and-dApp-chromium-retry1/trace.zip" ]; then - npx playwright show-trace "test-results/metamask-Setup-wallet-and-dApp-chromium-retry1/trace.zip" -fi - diff --git a/ufm-test-services/metamask/tests/metamask.spec.ts b/ufm-test-services/metamask/tests/metamask.spec.ts deleted file mode 100644 index 0852ddb858fe..000000000000 --- a/ufm-test-services/metamask/tests/metamask.spec.ts +++ /dev/null @@ -1,221 +0,0 @@ -import 'dotenv/config' -import { z } from 'zod' -import metamask from '@synthetixio/synpress/commands/metamask.js' -import synpressPlaywright from '@synthetixio/synpress/commands/playwright.js' -import { confirmPageElements } from '@synthetixio/synpress/pages/metamask/notification-page.js' -import { expect, test, type Page } from '@playwright/test' -import { mnemonicToAccount, privateKeyToAccount } from 'viem/accounts' -import { formatGwei, parseGwei } from 'viem' - -import { testWithSynpress } from './testWithSynpressUtil' -import { - incrementSelfSendTxGauge, - setFeeEstimationGauge, -} from './prometheusUtils' - -const env = z - .object({ - METAMASK_SECRET_WORDS_OR_PRIVATEKEY: z.string(), - METAMASK_OP_SEPOLIA_RPC_URL: z.string().url(), - METAMASK_DAPP_URL: z.string().url(), - }) - .parse(process.env) - -const expectedSender = env.METAMASK_SECRET_WORDS_OR_PRIVATEKEY?.startsWith('0x') - ? privateKeyToAccount( - env.METAMASK_SECRET_WORDS_OR_PRIVATEKEY as `0x${string}` - ).address.toLowerCase() - : mnemonicToAccount( - env.METAMASK_SECRET_WORDS_OR_PRIVATEKEY as string - ).address.toLowerCase() -const expectedRecipient = expectedSender - -const expectedCurrencySymbol = 'OPS' - -let sharedPage: Page -let wasSuccessful: boolean -let handledFailure: boolean - -test.describe.configure({ mode: 'serial' }) - -test.beforeAll(() => { - wasSuccessful = false - handledFailure = false -}) - -test.afterAll(async () => { - // This is handling failure scenarios such as Playwright timeouts - // where are not able to catch and respond to an error. - if (!wasSuccessful && !handledFailure) { - await incrementSelfSendTxGauge(false) - } - - await sharedPage.close() -}) - -testWithSynpress('Setup wallet and dApp', async ({ page }) => { - console.log('Setting up wallet and dApp...') - sharedPage = page - await sharedPage.goto('http://localhost:9011') -}) - -testWithSynpress('Add OP Sepolia network', async () => { - console.log('Adding OP Sepolia network...') - const expectedChainId = '0xaa37dc' - - await metamask.addNetwork({ - name: 'op-sepolia', - rpcUrls: { - default: { - http: [env.METAMASK_OP_SEPOLIA_RPC_URL], - }, - }, - id: '11155420', - nativeCurrency: { - symbol: expectedCurrencySymbol, - }, - blockExplorers: { - default: { - url: 'https://optimism-sepolia.blockscout.com', - }, - }, - }) - - try { - await expect(sharedPage.locator('#chainId')).toHaveText(expectedChainId) - } catch (error) { - await incrementSelfSendTxGauge(false) - handledFailure = true - throw error - } -}) - -test(`Connect wallet with ${expectedSender}`, async () => { - console.log(`Connecting wallet with ${expectedSender}...`) - await sharedPage.click('#connectButton') - await metamask.acceptAccess() - - try { - await expect(sharedPage.locator('#accounts')).toHaveText(expectedSender) - } catch (error) { - await incrementSelfSendTxGauge(false) - handledFailure = true - throw error - } -}) - -test('Send an EIP-1559 transaction and verify success', async () => { - console.log('Sending an EIP-1559 transaction and verify success...') - const expectedTransferAmount = '0x1' - const expectedTxType = '0x2' - - await sharedPage.locator('#toInput').fill(expectedRecipient) - await sharedPage.locator('#amountInput').fill(expectedTransferAmount) - await sharedPage.locator('#typeInput').selectOption(expectedTxType) - - await sharedPage.click('#submitForm') - - const txHashPromise = new Promise((resolve) => { - // Metamask test dApp only console.logs the transaction hash, - // so we must setup a listener before we confirm the tx to capture it - sharedPage.on('console', async (msg) => { - resolve(msg.text()) // Resolve the Promise when txHash is set - }) - }) - - const notificationPage = - await synpressPlaywright.switchToMetamaskNotification() - - console.log('Gathering transaction fee estimations...') - const lowFeeEstimate = await getFeeEstimateInGwei( - confirmPageElements.gasOptionLowButton, - 'Low', - notificationPage - ) - - const highFeeEstimate = await getFeeEstimateInGwei( - confirmPageElements.gasOptionHighButton, - 'Aggressive', - notificationPage - ) - - // Medium needs to be last because that's the gas option we want to submit the tx with - const mediumFeeEstimate = await getFeeEstimateInGwei( - confirmPageElements.gasOptionMediumButton, - 'Market', - notificationPage - ) - - console.log('Sent transaction, waiting for confirmation...') - await metamask.confirmTransactionAndWaitForMining() - const txHash = await txHashPromise - - const transactionReceiptPromise = new Promise<Record<string, string>>( - (resolve) => { - sharedPage.on('load', async () => { - const responseText = await sharedPage.locator('body > main').innerText() - const transactionReceipt = JSON.parse( - responseText.replace('Response: ', '') - ) - resolve(transactionReceipt) - }) - } - ) - - // Metamask test dApp allows us access to the Metamask RPC provider via loading this URL. - // The RPC response will be populated onto the page that's loaded. - // More info here: https://github.com/MetaMask/test-dapp/tree/main#usage - console.log('Retrieving transaction receipt...') - await sharedPage.goto( - `${env.METAMASK_DAPP_URL}/request.html?method=eth_getTransactionReceipt¶ms=["${txHash}"]` - ) - - const transactionReceipt = await transactionReceiptPromise - - try { - expect(transactionReceipt.status).toBe('0x1') - wasSuccessful = true - await incrementSelfSendTxGauge(true) - } catch (error) { - await incrementSelfSendTxGauge(false) - handledFailure = true - throw error - } - - await setFeeEstimationGauge('low', lowFeeEstimate) - await setFeeEstimationGauge('medium', mediumFeeEstimate) - await setFeeEstimationGauge('high', highFeeEstimate) - await setFeeEstimationGauge('actual', getActualTransactionFee(transactionReceipt)) -}) - -const getFeeEstimateInGwei = async ( - gasOptionButton: string, - waitForText: 'Low' | 'Market' | 'Aggressive', - notificationPage: Page -) => { - await synpressPlaywright.waitAndClick( - confirmPageElements.editGasFeeButton, - notificationPage - ) - await synpressPlaywright.waitAndClick(gasOptionButton, notificationPage) - await synpressPlaywright.waitForText( - `${confirmPageElements.editGasFeeButton} .edit-gas-fee-button__label`, - waitForText, - notificationPage - ) - const regexParseEtherValue = /(\d+\.\d+)\s?OPS/ - const feeValue = ( - await synpressPlaywright.waitAndGetValue( - confirmPageElements.totalLabel, - notificationPage - ) - ).match(regexParseEtherValue)[1] - return parseInt(parseGwei(feeValue).toString()) -} - -const getActualTransactionFee = (transactionReceipt: Record<string, string>) => { - const effectiveGasPrice = BigInt(transactionReceipt.effectiveGasPrice) - const l2GasUsed = BigInt(transactionReceipt.gasUsed) - const l1Fee = BigInt(transactionReceipt.l1Fee) - return parseInt(formatGwei(effectiveGasPrice * l2GasUsed + l1Fee, 'wei')) -} diff --git a/ufm-test-services/metamask/tests/prometheusUtils.ts b/ufm-test-services/metamask/tests/prometheusUtils.ts deleted file mode 100644 index d413a90c8325..000000000000 --- a/ufm-test-services/metamask/tests/prometheusUtils.ts +++ /dev/null @@ -1,257 +0,0 @@ -import 'dotenv/config' -import { z } from 'zod' -import { Gauge, Pushgateway, Registry } from 'prom-client' - -const env = z - .object({ - METRICS_READ_URL: z.string().url(), - METRICS_READ_USERNAME: z.string().optional(), - METRICS_READ_PASSWORD: z.string().optional(), - METRICS_WRITE_URL: z.string().url(), - METRICS_WRITE_TOOL: z.enum(['grafana', 'prometheus-pushgateway']), - METRICS_WRITE_SOURCE: z.string().optional(), - METRICS_WRITE_USERNAME: z.string().optional(), - METRICS_WRITE_PASSWORD: z.string().optional(), - }) - .refine( - (data) => { - if ( - (data.METRICS_READ_USERNAME && !data.METRICS_READ_PASSWORD) || - (data.METRICS_READ_PASSWORD && !data.METRICS_READ_USERNAME) - ) { - return false - } - - if ( - (data.METRICS_WRITE_USERNAME && !data.METRICS_WRITE_PASSWORD) || - (data.METRICS_WRITE_PASSWORD && !data.METRICS_WRITE_USERNAME) - ) { - return false - } - - return true - }, - { - message: - 'Both username and password must be provided together for read or write metrics', - } - ) - .refine( - (data) => { - if ( - data.METRICS_WRITE_TOOL === 'grafana' && - data.METRICS_WRITE_SOURCE === undefined - ) - return false - - return true - }, - { - message: - 'Writing to Grafana requires a source, please specify one using METRICS_WRITE_SOURCE env', - } - ) - .parse(process.env) - -const selfSendTransactionMetricName = 'metamask_self_send_metric' -const feeEstimateLowMetricName = 'metamask_self_send_fee_estimation_low_metric' -const feeEstimateMediumMetricName = - 'metamask_self_send_fee_estimation_medium_metric' -const feeEstimateHighMetricName = - 'metamask_self_send_fee_estimation_high_metric' -const feeEstimateActualMetricName = - 'metamask_self_send_fee_estimation_actual_metric' - -const selfSendRegistry = new Registry() -const feeEstimateLowRegistry = new Registry() -const feeEstimateMediumRegistry = new Registry() -const feeEstimateHighRegistry = new Registry() -const feeEstimateActualRegistry = new Registry() - -const selfSendGauge = new Gauge({ - name: selfSendTransactionMetricName, - help: 'A gauge signifying the number of transactions sent with Metamask', - registers: [selfSendRegistry], -}) -const feeEstimateLowGauge = new Gauge({ - name: feeEstimateLowMetricName, - help: 'A gauge signifying the latest fee estimation from Metamask for Low transaction speed', - registers: [feeEstimateLowRegistry], -}) -const feeEstimateMediumGauge = new Gauge({ - name: feeEstimateMediumMetricName, - help: 'A gauge signifying the latest fee estimation from Metamask for Medium transaction speed', - registers: [feeEstimateMediumRegistry], -}) -const feeEstimateHighGauge = new Gauge({ - name: feeEstimateHighMetricName, - help: 'A gauge signifying the latest fee estimation from Metamask for High transaction speed', - registers: [feeEstimateHighRegistry], -}) -const feeEstimateActualGauge = new Gauge({ - name: feeEstimateActualMetricName, - help: 'A gauge signifying the latest actual transaction fee', - registers: [feeEstimateActualRegistry], -}) - -const queryMetricsReadUrl = async ( - query: string = selfSendTransactionMetricName -) => { - const metricsReadRequest = `${env.METRICS_READ_URL}?query=${query}` - const response = await fetch(metricsReadRequest, { - headers: - env.METRICS_READ_USERNAME === undefined - ? undefined - : { - Authorization: `Bearer ${env.METRICS_READ_USERNAME}:${env.METRICS_READ_PASSWORD}`, - }, - }) - if (!response.ok) { - console.error(response.status) - console.error(response.statusText) - throw new Error(`Failed to fetch metric from: ${metricsReadRequest}`) - } - return response -} - -export const getSelfSendGaugeValue = async () => { - const response = await queryMetricsReadUrl(selfSendTransactionMetricName) - - // The following is an example of the expect response from prometheusMetricQuery - // for response.json().data.result[0]: - // [ - // { - // metric: { - // __name__: 'metamask_self_send', - // exported_job: 'metamask_self_send_tx_count', - // instance: 'pushgateway:9091', - // job: 'pushgateway' - // }, - // value: [ 1695847795.646, '-1' ] - // } - // ] - try { - const responseJson = z - .object({ - data: z.object({ - result: z.array( - z.object({ - value: z.tuple([ - z.number(), - z.number().or(z.string().transform((value) => parseInt(value))), - ]), - }) - ), - }), - }) - .parse(await response.json()) - - return responseJson.data.result[0].value[1] - } catch (error) { - if ( - error.message === "Cannot read properties of undefined (reading 'value')" - ) { - console.warn( - `No data found for metric ${selfSendTransactionMetricName} in ${env.METRICS_READ_URL}` - ) - return undefined - } - - throw error - } -} - -const pushMetricsGrafana = (metricName: string, valueToSetTo: number) => - pushMetricsWriteUrl( - `${metricName},source=${ - env.METRICS_WRITE_SOURCE - } metric=${valueToSetTo}` - ) - -const pushMetricsPrometheusPushgateway = (registry: Registry) => { - const pushGateway = new Pushgateway(env.METRICS_WRITE_URL, undefined, registry) - return pushGateway.pushAdd({ jobName: 'ufm-metamask-metric-push'}) -} - -const pushMetricsWriteUrl = async (requestBody: string) => { - const response = await fetch(env.METRICS_WRITE_URL, { - method: 'POST', - headers: - env.METRICS_WRITE_USERNAME === undefined - ? undefined - : { - Authorization: `Bearer ${env.METRICS_WRITE_USERNAME}:${env.METRICS_WRITE_PASSWORD}`, - }, - body: requestBody, - }) - if (!response.ok) { - console.error(response.status) - console.error(response.statusText) - throw new Error(`Failed to push metric to: ${env.METRICS_WRITE_URL}`) - } - return response -} - -export const setSelfSendTxGauge = async (valueToSetTo: number) => { - console.log(`Setting ${selfSendTransactionMetricName} to ${valueToSetTo}...`) - selfSendGauge.set(valueToSetTo) - - env.METRICS_WRITE_TOOL === 'grafana' - ? await pushMetricsGrafana(selfSendTransactionMetricName.replace('_metric', ''), valueToSetTo) - : await pushMetricsPrometheusPushgateway(selfSendRegistry) -} - -export const incrementSelfSendTxGauge = async (isSuccess: boolean) => { - const currentMetricValue = (await getSelfSendGaugeValue()) ?? 0 - - let newMetricValue: number - if (isSuccess) { - newMetricValue = currentMetricValue >= 0 ? currentMetricValue + 1 : 1 - } else { - newMetricValue = currentMetricValue < 0 ? currentMetricValue - 1 : -1 - } - - console.log( - `Current value of ${selfSendTransactionMetricName} is ${currentMetricValue}, incrementing to ${newMetricValue}...` - ) - await setSelfSendTxGauge(newMetricValue) -} - -export const setFeeEstimationGauge = async ( - txSpeed: 'low' | 'medium' | 'high' | 'actual', - fee: number -) => { - let metricNameGrafana: string - let prometheusRegistry: Registry - switch (txSpeed) { - case 'low': - feeEstimateLowGauge.set(fee) - metricNameGrafana = feeEstimateLowMetricName - prometheusRegistry = feeEstimateLowRegistry - break - case 'medium': - feeEstimateMediumGauge.set(fee) - metricNameGrafana = feeEstimateMediumMetricName - prometheusRegistry = feeEstimateMediumRegistry - break - case 'high': - feeEstimateHighGauge.set(fee) - metricNameGrafana = feeEstimateHighMetricName - prometheusRegistry = feeEstimateHighRegistry - break - case 'actual': - feeEstimateActualGauge.set(fee) - metricNameGrafana = feeEstimateActualMetricName - prometheusRegistry = feeEstimateActualRegistry - break - default: - throw new Error(`unsupported transaction speed given: ${txSpeed}`) - } - metricNameGrafana = metricNameGrafana.replace('_metric', '') - - console.log(`Setting ${metricNameGrafana} to ${fee}...`) - - env.METRICS_WRITE_TOOL === 'grafana' - ? await pushMetricsGrafana(metricNameGrafana, fee) - : await pushMetricsPrometheusPushgateway(prometheusRegistry) -} diff --git a/ufm-test-services/metamask/tests/testWithSynpressUtil.ts b/ufm-test-services/metamask/tests/testWithSynpressUtil.ts deleted file mode 100644 index 3c58980aace8..000000000000 --- a/ufm-test-services/metamask/tests/testWithSynpressUtil.ts +++ /dev/null @@ -1,54 +0,0 @@ -import 'dotenv/config' -import { - type BrowserContext, - chromium, - expect, - test as base, -} from '@playwright/test' -import metamask from '@synthetixio/synpress/commands/metamask.js' -import helpers from '@synthetixio/synpress/helpers.js' - -const { initialSetup } = metamask -const { prepareMetamask } = helpers - -export const testWithSynpress = base.extend<{ - context: BrowserContext -}>({ - context: async ({}, use) => { - // required for synpress - global.expect = expect - // download metamask - const metamaskPath = await prepareMetamask( - process.env.METAMASK_VERSION || '10.25.0', - ) - // prepare browser args - const browserArgs = [ - `--disable-extensions-except=${metamaskPath}`, - `--load-extension=${metamaskPath}`, - '--remote-debugging-port=9222', - ] - if (process.env.CI) { - browserArgs.push('--disable-gpu') - } - if (process.env.HEADLESS_MODE) { - browserArgs.push('--headless=new') - } - // launch browser - const context = await chromium.launchPersistentContext('', { - headless: false, - args: browserArgs, - }) - // wait for metamask - await context.pages()[0].waitForTimeout(3000) - // setup metamask - await initialSetup(chromium, { - secretWordsOrPrivateKey: process.env.METAMASK_SECRET_WORDS_OR_PRIVATEKEY, - network: process.env.METAMASK_NETWORK, - password: process.env.METAMASK_PASSWORD, - enableAdvancedSettings: true, - }) - await use(context) - }, -}) - -export { expect } diff --git a/ufm-test-services/metamask/tsconfig.json b/ufm-test-services/metamask/tsconfig.json deleted file mode 100644 index c0e9f8672231..000000000000 --- a/ufm-test-services/metamask/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/ufm-test-services/prometheus.yml b/ufm-test-services/prometheus.yml deleted file mode 100644 index daa885eee676..000000000000 --- a/ufm-test-services/prometheus.yml +++ /dev/null @@ -1,7 +0,0 @@ -global: - scrape_interval: 2s - -scrape_configs: - - job_name: 'pushgateway' - static_configs: - - targets: ['pushgateway:9091'] \ No newline at end of file diff --git a/versions.json b/versions.json index bfc73ea636fb..f1ca1a282c0a 100644 --- a/versions.json +++ b/versions.json @@ -1,8 +1,13 @@ { + "go": "1.22.6", "abigen": "v1.10.25", - "foundry": "63fff3510408b552f11efb8196f48cfe6c1da664", - "geth": "v1.13.14", + "foundry": "143abd6a768eeb52a5785240b763d72a56987b4a", + "geth": "v1.14.7", + "geth_release": "1.14.7-aa55f5ea", + "eth2_testnet_genesis": "v0.10.0", "nvm": "v20.9.0", "slither": "0.10.2", - "kontrol": "0.1.247" + "kontrol": "0.1.316", + "just": "1.34.0", + "binary_signer": "1.0.4" }